summaryrefslogtreecommitdiff
path: root/love2dToAPK
diff options
context:
space:
mode:
Diffstat (limited to 'love2dToAPK')
-rw-r--r--love2dToAPK/App.config27
-rw-r--r--love2dToAPK/Controls/minimalButton.Designer.cs31
-rw-r--r--love2dToAPK/Controls/minimalButton.cs70
-rw-r--r--love2dToAPK/Forms/baseForm.Designer.cs123
-rw-r--r--love2dToAPK/Forms/baseForm.cs159
-rw-r--r--love2dToAPK/Forms/baseForm.resx120
-rw-r--r--love2dToAPK/Forms/frmFirstStartup.Designer.cs216
-rw-r--r--love2dToAPK/Forms/frmFirstStartup.cs28
-rw-r--r--love2dToAPK/Forms/frmFirstStartup.resx133
-rw-r--r--love2dToAPK/Forms/frmMain.Designer.cs191
-rw-r--r--love2dToAPK/Forms/frmMain.cs86
-rw-r--r--love2dToAPK/Forms/frmMain.resx120
-rw-r--r--love2dToAPK/Forms/frmOutput.Designer.cs54
-rw-r--r--love2dToAPK/Forms/frmOutput.cs52
-rw-r--r--love2dToAPK/Forms/frmOutput.resx120
-rw-r--r--love2dToAPK/Forms/frmSettings.Designer.cs106
-rw-r--r--love2dToAPK/Forms/frmSettings.cs35
-rw-r--r--love2dToAPK/Forms/frmSettings.resx120
-rw-r--r--love2dToAPK/Program.cs43
-rw-r--r--love2dToAPK/Properties/AssemblyInfo.cs36
-rw-r--r--love2dToAPK/Properties/Resources.Designer.cs73
-rw-r--r--love2dToAPK/Properties/Resources.resx124
-rw-r--r--love2dToAPK/Properties/Settings.Designer.cs74
-rw-r--r--love2dToAPK/Properties/Settings.settings18
-rw-r--r--love2dToAPK/Resources/983924-200.pngbin0 -> 2762 bytes
-rw-r--r--love2dToAPK/Resources/ready.pngbin0 -> 12082 bytes
-rw-r--r--love2dToAPK/Settings.cs28
-rw-r--r--love2dToAPK/adb.cs96
-rw-r--r--love2dToAPK/compiler.cs259
-rw-r--r--love2dToAPK/love2dToAPK.csproj193
-rw-r--r--love2dToAPK/packages.config4
-rw-r--r--love2dToAPK/tools/icon.pngbin0 -> 10129 bytes
-rw-r--r--love2dToAPK/tools/startAnt.bat12
-rw-r--r--love2dToAPK/tools/tools/adb/AdbWinApi.dllbin0 -> 97792 bytes
-rw-r--r--love2dToAPK/tools/tools/adb/AdbWinUsbApi.dllbin0 -> 62976 bytes
-rw-r--r--love2dToAPK/tools/tools/adb/NOTICE.txt6260
-rw-r--r--love2dToAPK/tools/tools/adb/adb.exebin0 -> 1656320 bytes
-rw-r--r--love2dToAPK/tools/tools/adb/api/annotations.zipbin0 -> 140715 bytes
-rw-r--r--love2dToAPK/tools/tools/adb/api/api-versions.xml75120
-rw-r--r--love2dToAPK/tools/tools/adb/dmtracedump.exebin0 -> 145920 bytes
-rw-r--r--love2dToAPK/tools/tools/adb/etc1tool.exebin0 -> 333824 bytes
-rw-r--r--love2dToAPK/tools/tools/adb/fastboot.exebin0 -> 851456 bytes
-rw-r--r--love2dToAPK/tools/tools/adb/hprof-conv.exebin0 -> 43008 bytes
-rw-r--r--love2dToAPK/tools/tools/adb/lib64/libc++.sobin0 -> 1272189 bytes
-rw-r--r--love2dToAPK/tools/tools/adb/libwinpthread-1.dllbin0 -> 210625 bytes
-rw-r--r--love2dToAPK/tools/tools/adb/mke2fs.exebin0 -> 1034240 bytes
-rw-r--r--love2dToAPK/tools/tools/adb/source.properties3
-rw-r--r--love2dToAPK/tools/tools/adb/sqlite3.exebin0 -> 793600 bytes
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/NOTICE205
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/UPSTREAM_REVISION1
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/battor/battor/__init__.py27
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/battor/battor/battor_binary_dependencies.json114
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/battor/battor/battor_error.py8
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/battor/battor/battor_wrapper.py420
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/battor/battor/battor_wrapper_devicetest.py106
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/battor/battor/battor_wrapper_unittest.py365
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/eslint/LICENSE20
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/eslint/README.md5
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/eslint/eslint/__init__.py68
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/eslint/eslint/smoke_test.py36
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/eslint/rules/catapult-camelcase.js154
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/eslint/tests/catapult-camelcase.js324
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/lab/commits.py101
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/lab/hardware.py93
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/lab/keychain_unlock.sh15
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/node_runner/node_runner/__init__.py4
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/node_runner/node_runner/node_binaries.json53
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/node_runner/node_runner/node_util.py60
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/node_runner/node_runner/package.json22
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/README.txt7
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/__init__.py9
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/run_tests163
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/setup.py12
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event.py266
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/__init__.py7
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/decorators.py87
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/decorators_test.py62
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/log.py179
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/log_io_test.py50
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/meta_class.py16
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/multiprocessing_shim.py92
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/parsed_trace_events.py98
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/trace_test.py48
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_unittest.py423
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_time.py234
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_time_unittest.py123
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/PRESUBMIT.py31
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/__init__.py140
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/binary_manager.py61
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/binary_manager_unittest.py214
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/chrome_binaries.json86
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/cloud_storage.py461
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/cloud_storage_global_lock.py5
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/cloud_storage_unittest.py284
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/contextlib_ext.py33
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/contextlib_ext_unittest.py34
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/dependency_util.py49
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/lock.py117
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/lock_unittest.py165
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/py_utils_unittest.py55
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/__init__.py28
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/__init__.py71
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/base_symbol.py36
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/class_definition.py51
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/function_definition.py51
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/import_statement.py322
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/reference.py75
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/module.py39
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/offset_token.py115
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/snippet.py244
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor_util/__init__.py0
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor_util/move.py116
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/shell_util.py40
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/tempfile_ext.py25
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/tempfile_ext_unittest.py39
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/test_data/foo.txt1
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/xvfb.py29
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/PRESUBMIT.py32
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/__init__.py43
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/archive_info.py80
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/base_config.py388
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/base_config_unittest.py1525
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/cloud_storage_info.py110
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/cloud_storage_info_unittest.py233
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/dependency_info.py128
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/dependency_info_unittest.py234
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/dependency_manager_unittest.py527
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/dependency_manager_util.py103
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/dependency_manager_util_unittest.py193
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/exceptions.py52
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/local_path_info.py40
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/manager.py247
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/uploader.py108
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/uploader_unittest.py91
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/pylintrc68
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/PRESUBMIT.py81
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/README.md37
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/__init__.py7
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/__init__.py3
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/apk_helper.py164
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/apk_helper_test.py169
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/app_ui.py243
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/app_ui_test.py191
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/battery_utils.py711
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/battery_utils_test.py694
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/constants/__init__.py3
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/constants/chrome.py57
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/constants/file_system.py5
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/decorators.py176
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/decorators_test.py332
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_blacklist.py80
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_blacklist_test.py38
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_errors.py196
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_errors_test.py72
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_list.py52
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_signal.py41
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_temp_file.py63
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_test_case.py54
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_utils.py2654
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_utils_devicetest.py238
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_utils_test.py2908
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/fastboot_utils.py256
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/fastboot_utils_test.py375
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/flag_changer.py300
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/flag_changer_devicetest.py88
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/flag_changer_test.py135
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/forwarder.py467
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/install_commands.py57
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/logcat_monitor.py255
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/logcat_monitor_test.py230
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/md5sum.py120
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/md5sum_test.py237
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/perf/__init__.py3
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/perf/cache_control.py15
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/perf/perf_control.py210
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/perf/perf_control_devicetest.py38
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/perf/surface_stats_collector.py186
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/perf/thermal_throttle.py135
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/ports.py178
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/__init__.py6
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/aapt.py43
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/adb_compatibility_devicetest.py230
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/adb_wrapper.py923
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/adb_wrapper_devicetest.py122
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/adb_wrapper_test.py59
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/build_tools.py51
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/dexdump.py31
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/fastboot.py98
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/gce_adb_wrapper.py154
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/intent.py129
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/keyevent.py63
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/shared_prefs.py420
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/shared_prefs_test.py171
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/split_select.py63
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/test/data/push_directory/push_directory_contents.txt1
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/test/data/push_file.txt1
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/version_codes.py20
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/settings.py283
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/__init__.py3
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/adb_run_shell_cmd.py61
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/cpufreq.py87
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/device_monitor.py232
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/device_monitor_test.py168
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/device_recovery.py211
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/device_status.py316
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/flash_device.py70
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/keyboard.py129
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/provision_devices.py663
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/screenshot.py59
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/script_common.py29
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/script_common_test.py58
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/video_recorder.py175
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/wait_for_devices.py50
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/valgrind_tools/__init__.py21
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/valgrind_tools/base_tool.py53
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/base_error.py24
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/constants/__init__.py3
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/constants/exit_codes.py9
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/devil_dependencies.json127
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/devil_env.py194
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/devil_env_test.py63
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/__init__.py23
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/battor_device_mapping.py309
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/cmd_helper.py451
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/cmd_helper_test.py264
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/file_utils.py31
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/find_usb_devices.py538
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/find_usb_devices_test.py379
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/geometry.py75
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/geometry_test.py61
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/host_utils.py16
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/lazy/__init__.py5
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/lazy/weak_constant.py29
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/lsusb.py174
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/lsusb_test.py250
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/markdown.py320
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/markdown_test.py121
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/mock_calls.py180
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/mock_calls_test.py173
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/parallelizer.py238
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/parallelizer_test.py162
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/reraiser_thread.py228
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/reraiser_thread_unittest.py117
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/reset_usb.py111
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/run_tests_helper.py44
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/signal_handler.py48
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/test/data/test_serial_map.json1
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/timeout_retry.py175
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/timeout_retry_unittest.py79
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/update_mapping.py47
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/usb_hubs.py184
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/watchdog_timer.py47
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/zip_utils.py33
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/docs/adb_wrapper.md388
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/docs/device_blacklist.md59
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/docs/device_utils.md1041
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/docs/markdown.md139
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/docs/persistent_device_list.md41
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/devil/pylintrc68
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/PRESUBMIT.py36
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/README.md10
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/README.md29
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/Application.mk7
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/file_utils.cc96
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/file_utils.h53
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/logging.h28
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/main.cc198
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/process_info.cc102
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/process_info.h71
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/process_memory_stats.cc132
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/process_memory_stats.h68
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/__init__.py13
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/chrome_startup_tracing_agent.py123
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/chrome_startup_tracing_agent_unittest.py28
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/chrome_tracing_agent.py214
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/chrome_tracing_agent_unittest.py51
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/ddms_tracing_agent.py97
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/ddms_tracing_agent_unittest.py24
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/fake_agent_1.py69
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/fake_agent_2.py68
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/flags.py16
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/main.py160
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/perf_tracing_agent.py253
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/perf_tracing_agent_unittest.py39
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/profiler.py108
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/profiler_unittest.py58
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/run_tests3
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/third_party/COPYING339
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/third_party/README.chromium15
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/third_party/perf_to_tracing.py248
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/ui.py27
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/util.py35
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/pylintrc67
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/AUTHORS12
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/LICENSE27
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/README.md16
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/__init__.py28
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/decorators.py41
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/monitor_unittest.py52
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/output_generator.py189
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/output_generator_unittest.py123
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/prefix.html70
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/run_systrace.py199
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/suffix.html2
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/systrace_runner.py70
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/systrace_trace_viewer.html9630
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_data127
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_data_raw128
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_data_stripped127
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_extracted_tgids1
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_extracted_threads1
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_fixed_tgids127
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_missing_tgids127
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_procfs_dump1156
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/battor_test_data.txt16
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/compressed_atrace_data.txt5
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/decompressed_atrace_data.txt1053
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/profile-chrome_systrace_perf_chrome_data1
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/trace_result.py17
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/__init__.py91
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/agents_unittest.py50
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/android_process_data_agent.py89
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/atrace_agent.py451
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/atrace_agent_unittest.py132
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/atrace_from_file_agent.py81
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/atrace_from_file_agent_unittest.py59
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/battor_trace_agent.py165
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/battor_trace_agent_unittest.py182
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/ftrace_agent.py257
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/ftrace_agent_unittest.py143
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/walt_agent.py120
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/walt_agent_unittest.py51
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_controller.py306
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/update_systrace_trace_viewer.py119
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/util.py211
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/util_unittest.py30
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/LICENSE.txt61
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/README.chromium19
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/linux-product_info.patch19
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/__init__.py79
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/rfc2217.py1323
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/serialcli.py273
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/serialjava.py262
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/serialposix.py703
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/serialutil.py551
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/serialwin32.py461
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/sermsdos.py200
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/__init__.py0
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/list_ports.py103
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/list_ports_linux.py151
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/list_ports_osx.py208
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/list_ports_posix.py101
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/list_ports_windows.py240
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/miniterm.py694
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/urlhandler/__init__.py0
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_hwgrep.py45
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_loop.py265
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_rfc2217.py11
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_socket.py274
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/win32.py320
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/third_party/zipfile/LICENSE255
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/third_party/zipfile/README.chromium16
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/third_party/zipfile/zipfile_2_7_13.py1543
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/tracing/tracing/__init__.py6
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/tracing/tracing/trace_data/__init__.py4
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/tracing/tracing/trace_data/trace_data.py339
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/tracing/tracing/trace_data/trace_data_unittest.py103
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/catapult/tracing/tracing_project.py196
-rw-r--r--love2dToAPK/tools/tools/adb/systrace/systrace.py49
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/NOTICE.txt195
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/aapt.exebin0 -> 852992 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/aidl.exebin0 -> 277504 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/bcc_compat.exebin0 -> 120832 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/dexdump.exebin0 -> 128512 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/dx.bat88
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/lib/dx.jarbin0 -> 901345 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/libbcc.dllbin0 -> 321536 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/libbcinfo.dllbin0 -> 674304 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/CMakeLists.txt108
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/LICENSE.TXT63
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/altivec.h11856
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/ammintrin.h68
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/avx2intrin.h1206
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/avxintrin.h1224
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/bmi2intrin.h94
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/bmiintrin.h115
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/cpuid.h156
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/emmintrin.h1431
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/f16cintrin.h58
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/float.h124
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/fma4intrin.h231
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/fmaintrin.h229
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/immintrin.h114
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/iso646.h43
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/limits.h117
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/lzcntintrin.h55
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/mm3dnow.h162
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/mm_malloc.h75
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/mmintrin.h503
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/module.map156
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/nmmintrin.h35
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/pmmintrin.h117
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/popcntintrin.h45
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/prfchwintrin.h39
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/rdseedintrin.h52
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/rtmintrin.h54
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/smmintrin.h467
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/stdalign.h35
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/stdarg.h50
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/stdbool.h44
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/stddef.h102
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/stdint.h708
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/stdnoreturn.h30
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/tgmath.h1374
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/tmmintrin.h225
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/unwind.h133
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/varargs.h26
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/wmmintrin.h42
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/x86intrin.h75
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/xmmintrin.h1001
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/xopintrin.h804
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_allocation.rsh378
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_atomic.rsh250
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_cl.rsh1120
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_core.rsh189
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_debug.rsh267
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_element.rsh143
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_graphics.rsh421
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_math.rsh251
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_matrix.rsh378
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_mesh.rsh88
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_object.rsh220
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_program.rsh118
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_quaternion.rsh253
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_sampler.rsh77
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_time.rsh111
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_types.rsh628
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/bc/armeabi-v7a/libclcore.bcbin0 -> 174112 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/bc/mips/libclcore.bcbin0 -> 174112 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/intermediates/armeabi-v7a/libc.sobin0 -> 306404 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/intermediates/armeabi-v7a/libcompiler_rt.abin0 -> 284572 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/intermediates/armeabi-v7a/libm.sobin0 -> 103692 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/intermediates/mips/libc.sobin0 -> 545564 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/intermediates/mips/libcompiler_rt.abin0 -> 399274 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/intermediates/mips/libm.sobin0 -> 136844 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/packaged/armeabi-v7a/libRSSupport.sobin0 -> 338204 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/packaged/armeabi-v7a/librsjni.sobin0 -> 22564 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/packaged/mips/libRSSupport.sobin0 -> 536800 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/packaged/mips/librsjni.sobin0 -> 71912 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/renderscript-v8.jarbin0 -> 136431 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/source.properties7
-rw-r--r--love2dToAPK/tools/tools/android-win/build-tools/19.1.0/zipalign.exebin0 -> 166400 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/platform-tools/AdbWinApi.dllbin0 -> 96256 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/platform-tools/AdbWinUsbApi.dllbin0 -> 60928 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/platform-tools/NOTICE.txt15551
-rw-r--r--love2dToAPK/tools/tools/android-win/platform-tools/adb.exebin0 -> 1011200 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/platform-tools/api/api-versions.xml57543
-rw-r--r--love2dToAPK/tools/tools/android-win/platform-tools/dmtracedump.exebin0 -> 73728 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/platform-tools/etc1tool.exebin0 -> 338944 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/platform-tools/fastboot.exebin0 -> 196608 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/platform-tools/hprof-conv.exebin0 -> 43008 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/platform-tools/source.properties7
-rw-r--r--love2dToAPK/tools/tools/android-win/platform-tools/sqlite3.exebin0 -> 700928 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/platform-tools/systrace/AUTHORS12
-rw-r--r--love2dToAPK/tools/tools/android-win/platform-tools/systrace/LICENSE27
-rw-r--r--love2dToAPK/tools/tools/android-win/platform-tools/systrace/NOTICE205
-rw-r--r--love2dToAPK/tools/tools/android-win/platform-tools/systrace/UPSTREAM_REVISION1
-rw-r--r--love2dToAPK/tools/tools/android-win/platform-tools/systrace/prefix.html38
-rw-r--r--love2dToAPK/tools/tools/android-win/platform-tools/systrace/script.js546
-rw-r--r--love2dToAPK/tools/tools/android-win/platform-tools/systrace/style.css1
-rw-r--r--love2dToAPK/tools/tools/android-win/platform-tools/systrace/suffix.html5
-rw-r--r--love2dToAPK/tools/tools/android-win/platform-tools/systrace/systrace-legacy.py251
-rw-r--r--love2dToAPK/tools/tools/android-win/platform-tools/systrace/systrace.py313
-rw-r--r--love2dToAPK/tools/tools/android-win/platforms/android-19/android.jarbin0 -> 21841425 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/platforms/android-19/build.prop54
-rw-r--r--love2dToAPK/tools/tools/android-win/platforms/android-19/framework.aidl57
-rw-r--r--love2dToAPK/tools/tools/android-win/platforms/android-19/sdk.properties5
-rw-r--r--love2dToAPK/tools/tools/android-win/platforms/android-19/source.properties12
-rw-r--r--love2dToAPK/tools/tools/android-win/platforms/android-19/uiautomator.jarbin0 -> 10081 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/NOTICE.txt15749
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/android.bat85
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/ant/NOTICE190
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/ant/build.xml1534
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/ant/uibuild.xml260
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/.classpath8
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/.project34
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/.settings/org.eclipse.jdt.core.prefs12
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/AndroidManifest.xml44
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/Implementation.txt85
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/NOTICE190
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/assets/intro_help.html42
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/proguard-project.txt20
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/project.properties14
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/drawable-hdpi/ic_launcher.pngbin0 -> 9397 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/drawable-ldpi/ic_launcher.pngbin0 -> 2729 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/drawable-mdpi/ic_launcher.pngbin0 -> 5237 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/drawable-xhdpi/ic_launcher.pngbin0 -> 14383 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/layout-land/sensors.xml168
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/layout/main.xml116
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/layout/multitouch.xml32
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/layout/sensor_row.xml42
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/layout/sensors.xml130
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/values-v11/styles_v11.xml26
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/values/strings.xml48
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/values/styles.xml26
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/activities/BaseBindingActivity.java159
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/activities/MainActivity.java208
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/activities/MultiTouchActivity.java388
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/activities/SensorActivity.java338
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/handlers/MultiTouchChannel.java173
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/handlers/SensorChannel.java675
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/lib/Channel.java795
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/lib/Connection.java412
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/lib/ProtocolConstants.java146
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/lib/Socket.java213
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/service/ControllerService.java319
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/utils/ApiHelper.java57
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/utils/ApiHelper_11.java36
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/views/MultiTouchView.java232
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/ddms.bat74
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/draw9patch.bat46
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/hierarchyviewer.bat75
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/jobb.bat51
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/android.el131
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/annotations-12.0.jarbin0 -> 20195 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/annotations.jarbin0 -> 4220 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/ant-tasks.jarbin0 -> 102368 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/archquery.jarbin0 -> 1462 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/asm-5.0.3.jarbin0 -> 53231 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/asm-analysis-5.0.3.jarbin0 -> 20443 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/asm-tree-5.0.3.jarbin0 -> 29036 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/asset-studio.jarbin0 -> 842447 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/build.template92
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/build_gradle.template21
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/builder-model.jarbin0 -> 20359 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/cglib-nodep-3.1.jarbin0 -> 331202 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/chimpchat.jarbin0 -> 52629 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/common.jarbin0 -> 87532 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/commons-codec-1.4.jarbin0 -> 58160 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/commons-compress-1.8.1.jarbin0 -> 365552 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/commons-logging-1.1.1.jarbin0 -> 60686 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/ddmlib.jarbin0 -> 290394 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/ddms.jarbin0 -> 124370 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/ddmuilib.jarbin0 -> 597108 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/devices.xml595
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/draw9patch.jarbin0 -> 70529 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/dvlib.jarbin0 -> 19963 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/easymock-3.3.jarbin0 -> 126613 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/ecj-4.4.2.jarbin0 -> 2310271 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/emma.jarbin0 -> 428218 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/emma_ant.jarbin0 -> 38232 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/emma_device.jarbin0 -> 447350 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/fat32lib.jarbin0 -> 71904 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/find_java.bat68
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/find_java32.exebin0 -> 726124 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/find_java64.exebin0 -> 954370 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/gson-2.2.4.jarbin0 -> 190432 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/guava-17.0.jarbin0 -> 2243036 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/hamcrest-core-1.3.jarbin0 -> 45024 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/hierarchyviewer2.jarbin0 -> 32695 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/hierarchyviewer2lib.jarbin0 -> 407189 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/httpclient-4.1.1.jarbin0 -> 351132 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/httpcore-4.1.jarbin0 -> 181041 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/httpmime-4.1.jarbin0 -> 26813 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/jcommon-1.0.12.jarbin0 -> 309245 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/jfreechart-1.0.9.jarbin0 -> 1291498 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/jfreechart-swt-1.0.9.jarbin0 -> 73010 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/jobb.jarbin0 -> 36332 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/jsilver-1.0.0.jarbin0 -> 545459 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/junit-4.12.jarbin0 -> 314932 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/kxml2-2.3.0.jarbin0 -> 43858 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/layoutlib-api.jarbin0 -> 82562 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/libemugl_test_shared_library.dllbin0 -> 195307 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/lint-api.jarbin0 -> 192626 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/lint-checks.jarbin0 -> 668803 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/lint-tests.jarbin0 -> 20889 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/lint.jarbin0 -> 136089 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/lombok-ast-0.2.3.jarbin0 -> 720633 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/manifest-merger.jarbin0 -> 171833 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/monkeyrunner.jarbin0 -> 101761 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/ninepatch.jarbin0 -> 11485 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/objenesis-2.1.jarbin0 -> 41755 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/org-eclipse-core-commands-3.6.0.jarbin0 -> 107209 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/org-eclipse-equinox-common-3.6.0.jarbin0 -> 101958 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/org-eclipse-jface-3.6.2.jarbin0 -> 1069483 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/osgi-4.0.0.jarbin0 -> 1831843 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/pc-bios/bios.binbin0 -> 131072 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/pc-bios/vgabios-cirrus.binbin0 -> 35840 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/plugin.prop3
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/proguard-project.txt20
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/rule-api.jarbin0 -> 39674 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/screenshot2.jarbin0 -> 5389 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/sdk-common.jarbin0 -> 448287 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/sdklib.jarbin0 -> 734357 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/sdkmanager.jarbin0 -> 30978 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/sdkstats.jarbin0 -> 16833 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/sdkuilib.jarbin0 -> 482727 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/swtmenubar.jarbin0 -> 18580 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/traceview.jarbin0 -> 137241 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/uiautomatorviewer.jarbin0 -> 67649 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lib/uibuild.template92
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/lint.bat58
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/mksdcard.exebin0 -> 230163 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/monitor.bat32
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/monkeyrunner.bat63
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/README41
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/ant/task.properties2
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/android.pro149
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/examples.pro60
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/examples/Applet.java22
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/examples/Application.java20
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/examples/Bean.java56
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/examples/NativeCallBack.java44
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/lib/annotations.jarbin0 -> 6123 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/lib/annotations.pro118
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/Keep.java18
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepApplication.java18
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepClassMemberNames.java18
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepClassMembers.java18
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepGettersSetters.java18
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepImplementations.java18
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepName.java18
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepPublicClassMemberNames.java18
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepPublicClassMembers.java18
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepPublicGettersSetters.java18
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepPublicImplementations.java18
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepPublicProtectedClassMemberNames.java18
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepPublicProtectedClassMembers.java19
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/android-8.xml177
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/applets.xml88
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/applications1.xml15
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/applications2.xml74
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/applications3.xml98
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/library.xml102
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/midlets.xml52
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/proguard.xml78
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/servlets.xml88
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/applets.pro69
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/applications.pro75
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/dictionaries/compact.txt18
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/dictionaries/keywords.txt58
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/dictionaries/shakespeare.txt23
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/dictionaries/windows.txt209
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/library.pro79
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/midlets.pro67
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/proguard.pro57
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/proguardall.pro62
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/proguardgui.pro50
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/retrace.pro43
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/scala.pro132
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/examples/servlets.pro70
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/lib/proguard.jarbin0 -> 716008 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/lib/proguardgui.jarbin0 -> 138390 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/lib/retrace.jarbin0 -> 6894 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/license.html49
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/proguard-android-optimize.txt64
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/proguard-android.txt57
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/proguard/proguard-project.txt20
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/source.properties3
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/support/annotations.jarbin0 -> 1351 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/support/typos-de.txt2219
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/support/typos-en.txt4576
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/support/typos-es.txt733
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/support/typos-hu.txt431
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/support/typos-it.txt665
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/support/typos-nb.txt449
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/support/typos-pt.txt1647
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/support/typos-tr.txt604
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/globals.xml.ftl11
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/recipe.xml.ftl28
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/AndroidManifest.xml.ftl24
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/res/layout/activity_simple.xml.ftl16
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/res/menu/main.xml.ftl9
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/res/values-w820dp/dimens.xml6
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/res/values/dimens.xml.ftl5
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/res/values/strings.xml.ftl9
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/src/app_package/SimpleActivity.java.ftl35
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/template.xml71
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/template_blank_activity.pngbin0 -> 3264 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/globals.xml.ftl11
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/recipe.xml.ftl31
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/AndroidManifest.xml.ftl24
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/res/layout/activity_fragment_container.xml.ftl7
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/res/layout/fragment_simple.xml.ftl16
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/res/menu/main.xml.ftl9
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/res/values-w820dp/dimens.xml6
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/res/values/dimens.xml.ftl5
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/res/values/strings.xml.ftl7
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/src/app_package/SimpleActivity.java.ftl32
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/src/app_package/include_fragment.java.ftl15
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/src/app_package/include_options_menu.java.ftl19
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/template.xml80
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/template_blank_activity_fragment.pngbin0 -> 4983 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/globals.xml.ftl7
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/recipe.xml.ftl17
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/root/AndroidManifest.xml.ftl20
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/root/res/layout/activity_simple.xml12
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/root/res/values/strings.xml.ftl6
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/root/src/app_package/SimpleActivity.java.ftl15
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/template.xml63
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/template_blank_activity.pngbin0 -> 3264 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/globals.xml.ftl9
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/recipe.xml.ftl32
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/AndroidManifest.xml.ftl26
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/res/layout/activity_fullscreen.xml.ftl46
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/res/values-v11/styles.xml15
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/res/values/attrs.xml12
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/res/values/colors.xml5
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/res/values/strings.xml.ftl9
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/res/values/styles.xml22
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/src/app_package/FullscreenActivity.java.ftl198
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/src/app_package/util/SystemUiHider.java.ftl172
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/src/app_package/util/SystemUiHiderBase.java.ftl63
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/src/app_package/util/SystemUiHiderHoneycomb.java.ftl133
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/template.xml68
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/template_fullscreen_activity.pngbin0 -> 16885 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/globals.xml.ftl10
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/recipe.xml.ftl28
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/root/AndroidManifest.xml.ftl37
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/root/res/layout/activity_login.xml.ftl108
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/root/res/values/dimens.xml5
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/root/res/values/strings.xml.ftl17
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/root/src/app_package/LoginActivity.java.ftl449
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/root/src/app_package/PlusBaseActivity.java.ftl282
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/template.xml68
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/template_login_activity.pngbin0 -> 5939 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/globals.xml.ftl14
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/recipe.xml.ftl37
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/AndroidManifest.xml.ftl31
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/layout/activity_content_detail.xml.ftl7
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/layout/activity_content_list.xml.ftl10
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/layout/activity_content_twopane.xml.ftl38
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/layout/fragment_content_detail.xml.ftl9
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/values-large/refs.xml.ftl10
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/values-sw600dp/refs.xml.ftl11
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/values/strings.xml.ftl6
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/src/app_package/ContentDetailActivity.java.ftl78
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/src/app_package/ContentDetailFragment.java.ftl62
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/src/app_package/ContentListActivity.java.ftl106
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/src/app_package/ContentListFragment.java.ftl152
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/src/app_package/dummy/DummyContent.java.ftl55
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/template.xml68
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/template_master_detail.pngbin0 -> 7173 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/globals.xml.ftl12
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/recipe.xml.ftl49
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/AndroidManifest.xml.ftl24
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/build.gradle.ftl7
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-hdpi/drawer_shadow.9.pngbin0 -> 161 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-hdpi/ic_drawer.pngbin0 -> 2829 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-mdpi/drawer_shadow.9.pngbin0 -> 142 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-mdpi/ic_drawer.pngbin0 -> 2820 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-xhdpi/drawer_shadow.9.pngbin0 -> 174 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-xhdpi/ic_drawer.pngbin0 -> 2836 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-xxhdpi/drawer_shadow.9.pngbin0 -> 208 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-xxhdpi/ic_drawer.pngbin0 -> 202 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/layout/activity_drawer.xml.ftl31
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/layout/fragment_navigation_drawer.xml.ftl9
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/layout/fragment_simple.xml.ftl16
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/menu/global.xml.ftl7
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/menu/main.xml.ftl12
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/values-w820dp/dimens.xml6
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/values/dimens.xml.ftl9
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/values/strings.xml.ftl17
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/src/app_package/DrawerActivity.java.ftl84
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/src/app_package/NavigationDrawerFragment.java.ftl282
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/src/app_package/include_fragment.java.ftl43
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/src/app_package/include_options_menu.java.ftl25
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/template.xml87
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/template_blank_activity_drawer.pngbin0 -> 2631 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/globals.xml.ftl9
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/recipe.xml.ftl24
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/AndroidManifest.xml.ftl18
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/res/values/strings.xml.ftl61
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/res/xml/pref_data_sync.xml21
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/res/xml/pref_general.xml33
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/res/xml/pref_headers.xml.ftl17
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/res/xml/pref_notification.xml27
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/src/app_package/SettingsActivity.java.ftl296
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/template.xml56
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/template_settings_activity.pngbin0 -> 6260 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/globals.xml.ftl12
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/recipe.xml.ftl47
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/AndroidManifest.xml.ftl24
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/layout/activity_fragment_container.xml.ftl7
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/layout/activity_pager.xml.ftl6
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/layout/fragment_simple.xml.ftl16
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/menu/main.xml.ftl9
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/values-w820dp/dimens.xml6
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/values/dimens.xml.ftl5
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/values/strings.xml.ftl14
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/src/app_package/DropdownActivity.java.ftl86
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/src/app_package/TabsAndPagerActivity.java.ftl139
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/src/app_package/include_fragment.java.ftl36
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/src/app_package/include_options_menu.java.ftl19
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/template.xml95
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/template_blank_activity_dropdown.pngbin0 -> 3824 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/template_blank_activity_pager.pngbin0 -> 2600 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/template_blank_activity_tabs.pngbin0 -> 3732 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/gradle/utils/dependencies.gradle.ftl7
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/gradle/wrapper/gradle/wrapper/gradle-wrapper.jarbin0 -> 49896 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/gradle/wrapper/gradle/wrapper/gradle-wrapper.properties6
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/gradle/wrapper/gradlew164
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/gradle/wrapper/gradlew.bat90
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AidlFile/recipe.xml.ftl7
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AidlFile/root/src/app_package/interface.aidl.ftl13
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AidlFile/template.xml21
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AidlFolder/recipe.xml.ftl12
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AidlFolder/root/build.gradle.ftl1
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AidlFolder/template.xml30
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AndroidManifest/recipe.xml.ftl14
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AndroidManifest/root/AndroidManifest.xml.ftl8
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AndroidManifest/root/build.gradle.ftl3
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AndroidManifest/template.xml30
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/globals.xml.ftl8
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/recipe.xml.ftl35
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/AndroidManifest.xml.ftl25
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/drawable-nodpi/example_appwidget_preview.pngbin0 -> 3522 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/layout/appwidget.xml21
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/layout/appwidget_configure.xml27
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/values-v14/dimens.xml10
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/values/dimens.xml10
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/values/strings.xml.ftl8
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/xml/appwidget_info.xml.ftl27
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/src/app_package/AppWidget.java.ftl63
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/src/app_package/AppWidgetConfigureActivity.java.ftl101
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/template.xml148
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x1.pngbin0 -> 2960 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x1_h.pngbin0 -> 3750 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x1_v.pngbin0 -> 3787 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x1_vh.pngbin0 -> 4004 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x2.pngbin0 -> 3010 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x2_h.pngbin0 -> 3771 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x2_v.pngbin0 -> 3835 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x2_vh.pngbin0 -> 4065 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x3.pngbin0 -> 3058 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x3_h.pngbin0 -> 3830 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x3_v.pngbin0 -> 3880 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x3_vh.pngbin0 -> 4120 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x4.pngbin0 -> 3114 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x4_h.pngbin0 -> 3880 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x4_v.pngbin0 -> 3944 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x4_vh.pngbin0 -> 4178 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x1.pngbin0 -> 2973 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x1_h.pngbin0 -> 3765 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x1_v.pngbin0 -> 3794 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x1_vh.pngbin0 -> 4020 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x2.pngbin0 -> 3023 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x2_h.pngbin0 -> 3784 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x2_v.pngbin0 -> 3842 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x2_vh.pngbin0 -> 4062 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x3.pngbin0 -> 3047 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x3_h.pngbin0 -> 3849 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x3_v.pngbin0 -> 3890 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x3_vh.pngbin0 -> 4133 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x4.pngbin0 -> 3071 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x4_h.pngbin0 -> 3888 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x4_v.pngbin0 -> 3946 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x4_vh.pngbin0 -> 4168 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x1.pngbin0 -> 2950 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x1_h.pngbin0 -> 3728 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x1_v.pngbin0 -> 3777 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x1_vh.pngbin0 -> 3987 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x2.pngbin0 -> 2995 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x2_h.pngbin0 -> 3747 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x2_v.pngbin0 -> 3811 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x2_vh.pngbin0 -> 4045 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x3.pngbin0 -> 3035 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x3_h.pngbin0 -> 3790 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x3_v.pngbin0 -> 3844 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x3_vh.pngbin0 -> 4080 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x4.pngbin0 -> 3051 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x4_h.pngbin0 -> 3819 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x4_v.pngbin0 -> 3887 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x4_vh.pngbin0 -> 4120 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x1.pngbin0 -> 2925 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x1_h.pngbin0 -> 3710 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x1_v.pngbin0 -> 3747 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x1_vh.pngbin0 -> 3973 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x2.pngbin0 -> 2931 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x2_h.pngbin0 -> 3667 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x2_v.pngbin0 -> 3730 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x2_vh.pngbin0 -> 3960 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x3.pngbin0 -> 2934 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x3_h.pngbin0 -> 3696 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x3_v.pngbin0 -> 3723 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x3_vh.pngbin0 -> 3994 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x4.pngbin0 -> 2938 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x4_h.pngbin0 -> 3639 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x4_v.pngbin0 -> 3717 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x4_vh.pngbin0 -> 3932 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AssetsFolder/recipe.xml.ftl12
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AssetsFolder/root/build.gradle.ftl1
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/AssetsFolder/template.xml30
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/globals.xml.ftl7
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/recipe.xml.ftl19
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/root/res/layout/fragment_blank.xml.ftl13
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/root/res/values/strings.xml6
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/root/src/app_package/BlankFragment.java.ftl130
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/template.xml60
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/template_blank_fragment.pngbin0 -> 5266 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/BroadcastReceiver/globals.xml.ftl6
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/BroadcastReceiver/recipe.xml.ftl8
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/BroadcastReceiver/root/AndroidManifest.xml.ftl10
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/BroadcastReceiver/root/src/app_package/BroadcastReceiver.java.ftl17
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/BroadcastReceiver/template.xml32
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/ContentProvider/globals.xml.ftl6
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/ContentProvider/recipe.xml.ftl8
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/ContentProvider/root/AndroidManifest.xml.ftl11
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/ContentProvider/root/src/app_package/ContentProvider.java.ftl50
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/ContentProvider/template.xml40
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/CustomView/globals.xml.ftl6
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/CustomView/recipe.xml.ftl13
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/CustomView/root/res/layout/sample.xml.ftl22
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/CustomView/root/res/values/attrs.xml.ftl8
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/CustomView/root/src/app_package/CustomView.java.ftl182
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/CustomView/template.xml28
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/globals.xml.ftl11
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/recipe.xml.ftl28
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/AndroidManifest.xml.ftl28
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/res/layout-v17/dream.xml13
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/res/values/strings.xml.ftl7
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/res/xml/dream_prefs.xml9
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/res/xml/xml_dream.xml.ftl3
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/src/app_package/DreamService.java.ftl141
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/src/app_package/SettingsActivity.java.ftl37
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/template.xml47
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/IntentService/globals.xml.ftl6
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/IntentService/recipe.xml.ftl8
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/IntentService/root/AndroidManifest.xml.ftl9
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/IntentService/root/src/app_package/IntentService.java.ftl106
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/IntentService/template.xml29
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/JavaFolder/recipe.xml.ftl12
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/JavaFolder/root/build.gradle.ftl1
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/JavaFolder/template.xml30
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/JniFolder/recipe.xml.ftl12
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/JniFolder/root/build.gradle.ftl1
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/JniFolder/template.xml30
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/LayoutResourceFile/recipe.xml.ftl7
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/LayoutResourceFile/root/res/layout.xml.ftl6
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/LayoutResourceFile/template.xml29
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/globals.xml.ftl11
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/recipe.xml.ftl28
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/res/layout/fragment_grid.xml20
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/res/layout/fragment_list.xml19
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/res/values-large/refs_lrg.xml.ftl12
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/res/values-sw600dp/refs_lrg.xml.ftl12
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/res/values/refs.xml.ftl12
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/res/values/refs_lrg.xml.ftl12
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/src/app_package/ListFragment.java.ftl195
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/src/app_package/dummy/DummyContent.java.ftl55
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/template.xml52
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/templates_list_fragment.pngbin0 -> 7293 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/globals.xml.ftl10
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/recipe.xml.ftl31
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/AndroidManifest.xml.ftl5
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-hdpi/ic_action_stat_reply.pngbin0 -> 1480 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-hdpi/ic_action_stat_share.pngbin0 -> 1606 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-mdpi/ic_action_stat_reply.pngbin0 -> 1314 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-mdpi/ic_action_stat_share.pngbin0 -> 1341 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-nodpi/example_picture_large.pngbin0 -> 5834 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-nodpi/example_picture_small.pngbin0 -> 1885 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-xhdpi/ic_action_stat_reply.pngbin0 -> 1692 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-xhdpi/ic_action_stat_share.pngbin0 -> 1780 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/values/strings.xml.ftl13
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/src/app_package/NotificationHelper.java.ftl206
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template.xml58
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_list.pngbin0 -> 7306 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_list_actions.pngbin0 -> 7850 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_none.pngbin0 -> 4146 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_none_actions.pngbin0 -> 5904 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_picture.pngbin0 -> 6308 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_picture_actions.pngbin0 -> 6749 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_text.pngbin0 -> 6695 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_text_actions.pngbin0 -> 7073 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/globals.xml.ftl5
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/recipe.xml.ftl20
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/root/AndroidManifest.xml.ftl6
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/root/res/layout/fragment_plus_one.xml.ftl15
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/root/src/app_package/PlusOneFragment.java.ftl146
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/template.xml45
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/templates_plusone_fragment.pngbin0 -> 6178 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/ResFolder/recipe.xml.ftl12
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/ResFolder/root/build.gradle.ftl1
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/ResFolder/template.xml30
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/ResourcesFolder/recipe.xml.ftl12
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/ResourcesFolder/root/build.gradle.ftl1
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/ResourcesFolder/template.xml30
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/RsFolder/recipe.xml.ftl12
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/RsFolder/root/build.gradle.ftl1
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/RsFolder/template.xml30
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Service/globals.xml.ftl6
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Service/recipe.xml.ftl8
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Service/root/AndroidManifest.xml.ftl10
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Service/root/src/app_package/Service.java.ftl16
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/Service/template.xml34
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/ValueResourceFile/recipe.xml.ftl7
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/ValueResourceFile/root/res/values.xml.ftl3
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/other/ValueResourceFile/template.xml21
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/globals.xml.ftl12
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/recipe.xml.ftl27
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/AndroidManifest.xml.ftl15
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/build.gradle.ftl35
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/drawable-hdpi/ic_launcher.pngbin0 -> 9397 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/drawable-mdpi/ic_launcher.pngbin0 -> 5237 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/drawable-xhdpi/ic_launcher.pngbin0 -> 14383 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/values-v11/styles_hc.xml.ftl13
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/values-v14/styles_ics.xml.ftl14
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/values/strings.xml.ftl3
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/values/styles.xml.ftl22
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/settings.gradle.ftl1
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/template.xml82
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/template_new_project.pngbin0 -> 12408 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/globals.xml.ftl12
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/recipe.xml.ftl27
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/AndroidManifest.xml.ftl15
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/build.gradle.ftl35
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/drawable-hdpi/ic_launcher.pngbin0 -> 9397 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/drawable-mdpi/ic_launcher.pngbin0 -> 5237 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/drawable-xhdpi/ic_launcher.pngbin0 -> 14383 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/values-v11/styles_hc.xml.ftl13
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/values-v14/styles_ics.xml.ftl14
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/values/strings.xml.ftl3
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/values/styles.xml.ftl22
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/settings.gradle.ftl1
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/template.xml82
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/template_new_project.pngbin0 -> 12408 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/globals.xml.ftl6
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/recipe.xml.ftl5
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/root/build.gradle.ftl1
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/root/settings.gradle.ftl1
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/root/src/library_package/Placeholder.java.ftl4
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/template.xml38
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/template_new_project.pngbin0 -> 12408 bytes
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/traceview.bat65
-rw-r--r--love2dToAPK/tools/tools/android-win/tools/uiautomatorviewer.bat66
-rw-r--r--love2dToAPK/tools/tools/ant/CONTRIBUTORS417
-rw-r--r--love2dToAPK/tools/tools/ant/INSTALL2
-rw-r--r--love2dToAPK/tools/tools/ant/KEYS1497
-rw-r--r--love2dToAPK/tools/tools/ant/LICENSE272
-rw-r--r--love2dToAPK/tools/tools/ant/NOTICE9
-rw-r--r--love2dToAPK/tools/tools/ant/README97
-rw-r--r--love2dToAPK/tools/tools/ant/WHATSNEW6263
-rw-r--r--love2dToAPK/tools/tools/ant/contributors.xml1671
-rw-r--r--love2dToAPK/tools/tools/ant/etc/ant-bootstrap.jarbin0 -> 21191 bytes
-rw-r--r--love2dToAPK/tools/tools/ant/etc/changelog.xsl148
-rw-r--r--love2dToAPK/tools/tools/ant/etc/checkstyle/checkstyle-frames-sortby-check.xsl367
-rw-r--r--love2dToAPK/tools/tools/ant/etc/checkstyle/checkstyle-frames.xsl299
-rw-r--r--love2dToAPK/tools/tools/ant/etc/checkstyle/checkstyle-text.xsl34
-rw-r--r--love2dToAPK/tools/tools/ant/etc/checkstyle/checkstyle-xdoc.xsl130
-rw-r--r--love2dToAPK/tools/tools/ant/etc/coverage-frames.xsl487
-rw-r--r--love2dToAPK/tools/tools/ant/etc/jdepend-frames.xsl485
-rw-r--r--love2dToAPK/tools/tools/ant/etc/jdepend.xsl276
-rw-r--r--love2dToAPK/tools/tools/ant/etc/junit-frames-xalan1.xsl745
-rw-r--r--love2dToAPK/tools/tools/ant/etc/junit-frames.xsl972
-rw-r--r--love2dToAPK/tools/tools/ant/etc/junit-noframes.xsl513
-rw-r--r--love2dToAPK/tools/tools/ant/etc/log.xsl203
-rw-r--r--love2dToAPK/tools/tools/ant/etc/maudit-frames.xsl502
-rw-r--r--love2dToAPK/tools/tools/ant/etc/mmetrics-frames.xsl1023
-rw-r--r--love2dToAPK/tools/tools/ant/etc/tagdiff.xsl179
-rw-r--r--love2dToAPK/tools/tools/ant/fetch.xml335
-rw-r--r--love2dToAPK/tools/tools/ant/get-m2.xml121
-rw-r--r--love2dToAPK/tools/tools/ant/lib/README3
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-antlr.jarbin0 -> 11608 bytes
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-antlr.pom75
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-apache-bcel.jarbin0 -> 15113 bytes
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-apache-bcel.pom71
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-apache-bsf.jarbin0 -> 9787 bytes
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-apache-bsf.pom74
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-apache-log4j.jarbin0 -> 8635 bytes
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-apache-log4j.pom69
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-apache-oro.jarbin0 -> 9748 bytes
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-apache-oro.pom74
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-apache-regexp.jarbin0 -> 9611 bytes
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-apache-regexp.pom70
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-apache-resolver.jarbin0 -> 9680 bytes
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-apache-resolver.pom69
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-apache-xalan2.jarbin0 -> 8142 bytes
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-apache-xalan2.pom94
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-commons-logging.jarbin0 -> 9762 bytes
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-commons-logging.pom70
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-commons-net.jarbin0 -> 91364 bytes
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-commons-net.pom75
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-jai.jarbin0 -> 28264 bytes
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-jai.pom85
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-javamail.jarbin0 -> 13841 bytes
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-javamail.pom78
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-jdepend.jarbin0 -> 13869 bytes
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-jdepend.pom72
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-jmf.jarbin0 -> 12316 bytes
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-jmf.pom65
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-jsch.jarbin0 -> 47689 bytes
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-jsch.pom74
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-junit.jarbin0 -> 118491 bytes
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-junit.pom101
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-junit4.jarbin0 -> 13104 bytes
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-junit4.pom71
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-launcher.jarbin0 -> 18392 bytes
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-launcher.pom57
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-netrexx.jarbin0 -> 16316 bytes
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-netrexx.pom98
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-parent.pom151
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-swing.jarbin0 -> 13316 bytes
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-swing.pom66
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-testutil.jarbin0 -> 26975 bytes
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant-testutil.pom74
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant.jarbin0 -> 2029794 bytes
-rw-r--r--love2dToAPK/tools/tools/ant/lib/ant.pom225
-rw-r--r--love2dToAPK/tools/tools/ant/lib/libraries.properties65
-rw-r--r--love2dToAPK/tools/tools/ant/patch.xml48
-rw-r--r--love2dToAPK/tools/tools/jdk-win/COPYRIGHT69
-rw-r--r--love2dToAPK/tools/tools/jdk-win/LICENSE1
-rw-r--r--love2dToAPK/tools/tools/jdk-win/README.html9
-rw-r--r--love2dToAPK/tools/tools/jdk-win/THIRDPARTYLICENSEREADME-JAVAFX.txt1531
-rw-r--r--love2dToAPK/tools/tools/jdk-win/THIRDPARTYLICENSEREADME.txt3605
-rw-r--r--love2dToAPK/tools/tools/jdk-win/include/classfile_constants.h560
-rw-r--r--love2dToAPK/tools/tools/jdk-win/include/jawt.h299
-rw-r--r--love2dToAPK/tools/tools/jdk-win/include/jdwpTransport.h254
-rw-r--r--love2dToAPK/tools/tools/jdk-win/include/jni.h1960
-rw-r--r--love2dToAPK/tools/tools/jdk-win/include/jvmti.h2534
-rw-r--r--love2dToAPK/tools/tools/jdk-win/include/jvmticmlr.h115
-rw-r--r--love2dToAPK/tools/tools/jdk-win/include/win32/bridge/AccessBridgeCallbacks.h76
-rw-r--r--love2dToAPK/tools/tools/jdk-win/include/win32/bridge/AccessBridgeCalls.c1111
-rw-r--r--love2dToAPK/tools/tools/jdk-win/include/win32/bridge/AccessBridgeCalls.h686
-rw-r--r--love2dToAPK/tools/tools/jdk-win/include/win32/bridge/AccessBridgePackages.h2195
-rw-r--r--love2dToAPK/tools/tools/jdk-win/include/win32/jawt_md.h59
-rw-r--r--love2dToAPK/tools/tools/jdk-win/include/win32/jni_md.h37
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/COPYRIGHT69
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/LICENSE1
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/README.txt1
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/THIRDPARTYLICENSEREADME-JAVAFX.txt1531
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/THIRDPARTYLICENSEREADME.txt3605
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/Welcome.html28
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/accessibility.properties6
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/calendars.properties60
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/charsets.jarbin0 -> 3086224 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/classlist2378
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/cmm/CIEXYZ.pfbin0 -> 51236 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/cmm/GRAY.pfbin0 -> 632 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/cmm/LINEAR_RGB.pfbin0 -> 1044 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/cmm/PYCC.pfbin0 -> 274474 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/cmm/sRGB.pfbin0 -> 3144 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/content-types.properties276
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/currency.databin0 -> 4074 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/deploy.jarbin0 -> 4791488 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/ext/access-bridge.jarbin0 -> 187715 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/ext/cldrdata.jarbin0 -> 3860522 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/ext/dnsns.jarbin0 -> 8286 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/ext/jaccess.jarbin0 -> 44115 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/ext/jfxrt.jarbin0 -> 18131395 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/ext/localedata.jarbin0 -> 2248141 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/ext/meta-index71
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/ext/nashorn.jarbin0 -> 2008813 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/ext/sunec.jarbin0 -> 39773 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/ext/sunjce_provider.jarbin0 -> 278075 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/ext/sunmscapi.jarbin0 -> 32654 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/ext/sunpkcs11.jarbin0 -> 249387 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/ext/zipfs.jarbin0 -> 68837 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/flavormap.properties77
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/fontconfig.bfcbin0 -> 3670 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/fontconfig.properties.src300
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/hijrah-config-umalqura.properties369
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/i386/jvm.cfg34
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/javafx.properties1
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/javaws.jarbin0 -> 920936 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/jce.jarbin0 -> 114708 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/jfr.jarbin0 -> 555272 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/jfr/default.jfc556
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/jfr/profile.jfc556
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/jfxswt.jarbin0 -> 33795 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/jsse.jarbin0 -> 620257 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/jvm.hprof.txt86
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/logging.properties59
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/management-agent.jarbin0 -> 381 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/management/jmxremote.access79
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/management/jmxremote.password.template64
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/management/management.properties318
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/management/snmp.acl.template110
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/meta-index92
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/net.properties74
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/plugin.jarbin0 -> 1922576 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/psfont.properties.ja119
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/psfontj2d.properties323
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/resources.jarbin0 -> 3487757 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/rt.jarbin0 -> 63191979 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/security/US_export_policy.jarbin0 -> 3026 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/security/blacklist95
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/security/blacklisted.certs19
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/security/cacertsbin0 -> 98626 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/security/java.policy49
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/security/java.security528
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/security/javaws.policy5
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/security/local_policy.jarbin0 -> 3527 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/security/trusted.libraries0
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/sound.properties39
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/tzdb.datbin0 -> 102385 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/jre/lib/tzmappings202
-rw-r--r--love2dToAPK/tools/tools/jdk-win/lib/ant-javafx.jarbin0 -> 1646460 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/lib/ct.symbin0 -> 17364173 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/lib/dt.jarbin0 -> 163019 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/lib/ir.idl778
-rw-r--r--love2dToAPK/tools/tools/jdk-win/lib/javafx-mx.jarbin0 -> 36037 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/lib/jawt.libbin0 -> 1688 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/lib/jconsole.jarbin0 -> 407734 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/lib/jvm.libbin0 -> 751824 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/lib/orb.idl47
-rw-r--r--love2dToAPK/tools/tools/jdk-win/lib/packager.jarbin0 -> 4573 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/lib/sa-jdi.jarbin0 -> 2268285 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/lib/tools.jarbin0 -> 18173747 bytes
-rw-r--r--love2dToAPK/tools/tools/jdk-win/release6
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/.classpath9
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/.project53
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/AndroidManifest.xml71
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/README.md140
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/ant.properties17
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/assets/game.lovebin0 -> 1512 bytes
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/build.properties17
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/build.xml93
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/default.properties11
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/gen/R.java.d4
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/gen/love/to/android/BuildConfig.java6
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/gen/love/to/android/R.java16
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/gen/love/to/android1219203756/BuildConfig.java6
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/gen/love/to/android1219203756/R.java16
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/gen/love/to/android1220074642/BuildConfig.java6
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/gen/love/to/android1220074642/R.java16
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi-v7a/libgnustl_shared.sobin0 -> 804492 bytes
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi-v7a/liblove.sobin0 -> 3309304 bytes
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi-v7a/libmpg123.sobin0 -> 120888 bytes
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi-v7a/libopenal.sobin0 -> 251528 bytes
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi/libgnustl_shared.sobin0 -> 808580 bytes
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi/liblove.sobin0 -> 3464936 bytes
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi/libmpg123.sobin0 -> 141348 bytes
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi/libopenal.sobin0 -> 272000 bytes
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/original/AndroidManifest.xml71
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/original/love/to/android/LtaActivity.java4
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/project.properties14
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/res/drawable-xxhdpi/ic_launcher.pngbin0 -> 10129 bytes
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/src/love/to/android/LtaActivity.java4
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/src/org/libsdl/app/SDLActivity.java1676
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/src/org/love2d/android/DownloadActivity.java24
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/src/org/love2d/android/DownloadService.java96
-rw-r--r--love2dToAPK/tools/tools/love-android-sdl2/src/org/love2d/android/GameActivity.java253
-rw-r--r--love2dToAPK/tools/tools/love-old-win/DevIL.dllbin0 -> 1024512 bytes
-rw-r--r--love2dToAPK/tools/tools/love-old-win/OpenAL32.dllbin0 -> 316928 bytes
-rw-r--r--love2dToAPK/tools/tools/love-old-win/SDL2.dllbin0 -> 814592 bytes
-rw-r--r--love2dToAPK/tools/tools/love-old-win/changes.txt831
-rw-r--r--love2dToAPK/tools/tools/love-old-win/game.icobin0 -> 33093 bytes
-rw-r--r--love2dToAPK/tools/tools/love-old-win/license.txt979
-rw-r--r--love2dToAPK/tools/tools/love-old-win/love.dllbin0 -> 2984448 bytes
-rw-r--r--love2dToAPK/tools/tools/love-old-win/love.exebin0 -> 47616 bytes
-rw-r--r--love2dToAPK/tools/tools/love-old-win/love.icobin0 -> 35492 bytes
-rw-r--r--love2dToAPK/tools/tools/love-old-win/lua51.dllbin0 -> 348672 bytes
-rw-r--r--love2dToAPK/tools/tools/love-old-win/mpg123.dllbin0 -> 138752 bytes
-rw-r--r--love2dToAPK/tools/tools/love-old-win/msvcp120.dllbin0 -> 455328 bytes
-rw-r--r--love2dToAPK/tools/tools/love-old-win/msvcr120.dllbin0 -> 970912 bytes
-rw-r--r--love2dToAPK/tools/tools/love-old-win/readme.txt74
-rw-r--r--love2dToAPK/tools/tools/love-win/OpenAL32.dllbin0 -> 390656 bytes
-rw-r--r--love2dToAPK/tools/tools/love-win/SDL2.dllbin0 -> 808448 bytes
-rw-r--r--love2dToAPK/tools/tools/love-win/changes.txt1031
-rw-r--r--love2dToAPK/tools/tools/love-win/game.icobin0 -> 370070 bytes
-rw-r--r--love2dToAPK/tools/tools/love-win/license.txt977
-rw-r--r--love2dToAPK/tools/tools/love-win/love.dllbin0 -> 2379776 bytes
-rw-r--r--love2dToAPK/tools/tools/love-win/love.exebin0 -> 380928 bytes
-rw-r--r--love2dToAPK/tools/tools/love-win/love.icobin0 -> 370070 bytes
-rw-r--r--love2dToAPK/tools/tools/love-win/lua51.dllbin0 -> 349184 bytes
-rw-r--r--love2dToAPK/tools/tools/love-win/mpg123.dllbin0 -> 143360 bytes
-rw-r--r--love2dToAPK/tools/tools/love-win/msvcp120.dllbin0 -> 455328 bytes
-rw-r--r--love2dToAPK/tools/tools/love-win/msvcr120.dllbin0 -> 970912 bytes
-rw-r--r--love2dToAPK/tools/tools/love-win/readme.txt96
-rw-r--r--love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/ABOUT-NLS1111
-rw-r--r--love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/AUTHORS5
-rw-r--r--love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/BUGS133
-rw-r--r--love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/COPYING676
-rw-r--r--love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/ChangeLog3185
-rw-r--r--love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/INSTALL236
-rw-r--r--love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/NEWS502
-rw-r--r--love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/README13
-rw-r--r--love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/README-alpha8
-rw-r--r--love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/README.boot23
-rw-r--r--love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/THANKS54
-rw-r--r--love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/po/ChangeLog53
-rw-r--r--love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex10.c65
-rw-r--r--love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex11.c143
-rw-r--r--love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex12.c81
-rw-r--r--love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex13.c111
-rw-r--r--love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex14.c62
-rw-r--r--love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex15.c53
-rw-r--r--love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex16.c39
-rw-r--r--love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex21.c53
-rw-r--r--love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex27.c65
-rw-r--r--love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex28.c76
-rw-r--r--love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex7.c96
-rw-r--r--love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex8.c88
-rw-r--r--love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex9.c75
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/CHANGELOG.md2364
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/LICENSE237
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/README.md113
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/api/cg/stdlib.lua205
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/api/glsl/std.lua277
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/api/lua/baselib.lua1238
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/api/lua/love2d.lua6566
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/api/lua/luajit2.lua52
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/api/lua/wxwidgets.lua24
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/api/opencl/std.lua278
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/cfg/estrela.lua19
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/cn.lua344
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/de.lua345
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/en.lua7
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/eo.lua346
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/es.lua346
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/fr.lua345
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/it.lua345
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/pt-br.lua347
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/ru.lua345
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/cfg/scheme-picker.lua28
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/cfg/tomorrow.lua311
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/cfg/user-sample.lua170
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/cfg/user.lua56
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/cfg/xcode-keys.lua73
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/interpreters/love2d.lua61
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/interpreters/luabase.lua101
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/interpreters/luadeb.lua2
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/interpreters/luadeb52.lua2
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/interpreters/luadeb53.lua4
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/copas/copas.lua636
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/coxpcall/coxpcall.lua68
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/config.lua112
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/constraints.lua271
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/depends.lua770
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/git.lua306
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/init.lua349
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/logger.lua64
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/manifest.lua248
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/package.lua596
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/sys.lua386
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/utils.lua151
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/git.lua5
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/git/objects.lua121
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/git/pack.lua316
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/git/protocol.lua188
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/git/repo.lua283
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/git/util.lua233
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/ltn12.lua298
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/lua_lexer_loose.lua212
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/lua_parser_loose.lua337
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luadist.lua746
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/ast.lua915
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/compat_env.lua390
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/dump.lua90
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/globals.lua222
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/init.lua1454
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/signatures.lua433
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/typecheck.lua40
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/types.lua130
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler.lua162
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser.lua42
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/annot/generator.lua48
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/annot/grammar.lua112
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/common.lua27
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/expr.lua213
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/ext.lua96
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/lexer.lua44
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/meta.lua138
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/misc.lua147
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/stat.lua283
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/table.lua77
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/grammar/generator.lua832
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/grammar/lexer.lua678
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/pprint.lua295
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/mime.lua90
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/mobdebug/mobdebug.lua1609
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/sha2.lua239
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket.lua165
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket/ftp.lua285
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket/headers.lua104
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket/http.lua354
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket/smtp.lua256
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket/tp.lua126
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket/url.lua307
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/ssl.lua93
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/ssl/https.lua138
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/lualibs/testwell.lua315
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/spec/lua.lua284
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/spec/text.lua9
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/defs.lua332
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/autocomplete.lua652
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/commandbar.lua359
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/commands.lua1054
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/debugger.lua1696
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/editor.lua1619
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/filetree.lua903
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/findreplace.lua1275
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/gui.lua567
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/ids.lua190
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/inspect.lua243
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/iofilters.lua71
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/keymap.lua136
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/markers.lua247
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/markup.lua214
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_edit.lua390
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_file.lua262
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_help.lua118
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_project.lua474
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_search.lua420
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_tools.lua111
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_view.lua113
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/outline.lua679
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/output.lua498
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/package.lua735
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/print.lua195
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/proto.lua68
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/settings.lua593
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/shellbox.lua574
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/singleinstance.lua98
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/style.lua441
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/editor/toolbar.lua55
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/main.lua774
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/util.lua645
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/src/version.lua1
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/tools/cg.lua537
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/tools/clcc.lua67
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/tools/cstringify.lua21
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/tools/dx.lua157
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/tools/ffitoapi.lua313
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/tools/glslc.lua470
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/tools/perforce_edit.lua14
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/tools/perforce_revert.lua14
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio.exebin0 -> 51296 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/app.lua53
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/config.lua38
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/BOOKMARK-TOGGLE.pngbin0 -> 884 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-BREAK.pngbin0 -> 374 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-BREAKPOINT-TOGGLE.pngbin0 -> 702 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-CALLSTACK.pngbin0 -> 500 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-DETACH.pngbin0 -> 583 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-RUN-TO.pngbin0 -> 329 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-START.pngbin0 -> 259 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-STEP-INTO.pngbin0 -> 335 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-STEP-OUT.pngbin0 -> 356 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-STEP-OVER.pngbin0 -> 362 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-STOP.pngbin0 -> 594 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-WATCH.pngbin0 -> 786 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DIR-SETUP-FILE.pngbin0 -> 778 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DIR-SETUP.pngbin0 -> 738 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-KNOWN.pngbin0 -> 623 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-NEW.pngbin0 -> 730 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-NORMAL-START.pngbin0 -> 743 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-NORMAL.pngbin0 -> 652 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-OPEN.pngbin0 -> 602 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-SAVE-ALL.pngbin0 -> 1322 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-SAVE.pngbin0 -> 1346 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-AND-REPLACE.pngbin0 -> 451 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-IN-FILES.pngbin0 -> 671 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-CASE-SENSITIVE.pngbin0 -> 402 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-CONTEXT.pngbin0 -> 306 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-DOWN.pngbin0 -> 340 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-MULTI-RESULTS.pngbin0 -> 445 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-REGEX.pngbin0 -> 387 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-SELECTION.pngbin0 -> 229 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-SETDIR.pngbin0 -> 716 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-SUBDIR.pngbin0 -> 742 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-WORD.pngbin0 -> 398 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-WRAP-AROUND.pngbin0 -> 415 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-REPLACE-NEXT.pngbin0 -> 520 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND.pngbin0 -> 662 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FOLDER-MAPPED.pngbin0 -> 656 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FOLDER.pngbin0 -> 615 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/LICENSE28
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/RUN-NOW.pngbin0 -> 292 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/RUN.pngbin0 -> 271 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-ACALL.pngbin0 -> 371 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-CALL.pngbin0 -> 717 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-GCALL.pngbin0 -> 374 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-LCALL.pngbin0 -> 433 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-LOCAL.pngbin0 -> 698 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-SCALL.pngbin0 -> 428 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-UP.pngbin0 -> 753 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/BOOKMARK-TOGGLE.pngbin0 -> 1087 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-BREAK.pngbin0 -> 473 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-BREAKPOINT-TOGGLE.pngbin0 -> 1457 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-CALLSTACK.pngbin0 -> 566 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-DETACH.pngbin0 -> 755 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-RUN-TO.pngbin0 -> 400 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-START.pngbin0 -> 369 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-STEP-INTO.pngbin0 -> 451 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-STEP-OUT.pngbin0 -> 450 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-STEP-OVER.pngbin0 -> 484 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-STOP.pngbin0 -> 799 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-WATCH.pngbin0 -> 1008 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DIR-SETUP-FILE.pngbin0 -> 1365 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DIR-SETUP.pngbin0 -> 1412 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FILE-NEW.pngbin0 -> 821 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FILE-OPEN.pngbin0 -> 780 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FILE-SAVE-ALL.pngbin0 -> 622 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FILE-SAVE.pngbin0 -> 1165 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FIND-AND-REPLACE.pngbin0 -> 495 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FIND-IN-FILES.pngbin0 -> 1173 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FIND.pngbin0 -> 775 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/LICENSE27
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/RUN-NOW.pngbin0 -> 384 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/RUN.pngbin0 -> 358 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/estrela.pngbin0 -> 6252 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/zbstudio.icobin0 -> 32038 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/zerobrane.pngbin0 -> 10255 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/CHANGELOG.md2364
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/LICENSE237
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/README.md113
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/api/cg/stdlib.lua205
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/api/glsl/std.lua277
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/api/lua/baselib.lua1238
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/api/lua/love2d.lua6566
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/api/lua/luajit2.lua52
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/api/lua/wxwidgets.lua24
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/api/opencl/std.lua278
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/cfg/estrela.lua19
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/cn.lua344
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/de.lua345
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/en.lua7
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/eo.lua346
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/es.lua346
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/fr.lua345
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/it.lua345
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/pt-br.lua347
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/ru.lua345
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/cfg/scheme-picker.lua28
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/cfg/tomorrow.lua311
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/cfg/user-sample.lua170
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/cfg/user.lua56
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/cfg/xcode-keys.lua73
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/interpreters/love2d.lua61
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/interpreters/luabase.lua101
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/interpreters/luadeb.lua2
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/interpreters/luadeb52.lua2
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/interpreters/luadeb53.lua4
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/copas/copas.lua636
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/coxpcall/coxpcall.lua68
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/config.lua112
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/constraints.lua271
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/depends.lua770
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/git.lua306
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/init.lua349
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/logger.lua64
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/manifest.lua248
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/package.lua596
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/sys.lua386
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/utils.lua151
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/git.lua5
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/git/objects.lua121
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/git/pack.lua316
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/git/protocol.lua188
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/git/repo.lua283
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/git/util.lua233
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/ltn12.lua298
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/lua_lexer_loose.lua212
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/lua_parser_loose.lua337
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/luadist.lua746
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/ast.lua915
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/compat_env.lua390
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/dump.lua90
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/globals.lua222
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/init.lua1454
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/signatures.lua433
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/typecheck.lua40
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/types.lua130
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler.lua162
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser.lua42
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/annot/generator.lua48
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/annot/grammar.lua112
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/common.lua27
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/expr.lua213
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/ext.lua96
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/lexer.lua44
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/meta.lua138
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/misc.lua147
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/stat.lua283
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/table.lua77
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/grammar/generator.lua832
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/grammar/lexer.lua678
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/pprint.lua295
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/mime.lua90
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/mobdebug/mobdebug.lua1609
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/sha2.lua239
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/socket.lua165
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/socket/ftp.lua285
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/socket/headers.lua104
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/socket/http.lua354
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/socket/smtp.lua256
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/socket/tp.lua126
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/socket/url.lua307
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/ssl.lua93
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/ssl/https.lua138
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/lualibs/testwell.lua315
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/spec/lua.lua284
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/spec/text.lua9
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/defs.lua332
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/autocomplete.lua652
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/commandbar.lua359
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/commands.lua1054
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/debugger.lua1696
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/editor.lua1619
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/filetree.lua903
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/findreplace.lua1275
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/gui.lua567
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/ids.lua190
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/inspect.lua243
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/iofilters.lua71
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/keymap.lua136
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/markers.lua247
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/markup.lua214
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_edit.lua390
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_file.lua262
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_help.lua118
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_project.lua474
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_search.lua420
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_tools.lua111
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_view.lua113
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/outline.lua679
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/output.lua498
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/package.lua735
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/print.lua195
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/proto.lua68
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/settings.lua593
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/shellbox.lua574
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/singleinstance.lua98
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/style.lua441
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/editor/toolbar.lua55
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/main.lua774
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/util.lua645
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/src/version.lua1
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/tools/cg.lua537
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/tools/clcc.lua67
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/tools/cstringify.lua21
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/tools/dx.lua157
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/tools/ffitoapi.lua313
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/tools/glslc.lua470
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/tools/perforce_edit.lua14
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/tools/perforce_revert.lua14
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio.exebin0 -> 51296 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/app.lua53
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/config.lua38
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/BOOKMARK-TOGGLE.pngbin0 -> 884 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-BREAK.pngbin0 -> 374 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-BREAKPOINT-TOGGLE.pngbin0 -> 702 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-CALLSTACK.pngbin0 -> 500 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-DETACH.pngbin0 -> 583 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-RUN-TO.pngbin0 -> 329 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-START.pngbin0 -> 259 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-STEP-INTO.pngbin0 -> 335 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-STEP-OUT.pngbin0 -> 356 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-STEP-OVER.pngbin0 -> 362 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-STOP.pngbin0 -> 594 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-WATCH.pngbin0 -> 786 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DIR-SETUP-FILE.pngbin0 -> 778 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DIR-SETUP.pngbin0 -> 738 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-KNOWN.pngbin0 -> 623 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-NEW.pngbin0 -> 730 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-NORMAL-START.pngbin0 -> 743 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-NORMAL.pngbin0 -> 652 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-OPEN.pngbin0 -> 602 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-SAVE-ALL.pngbin0 -> 1322 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-SAVE.pngbin0 -> 1346 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-AND-REPLACE.pngbin0 -> 451 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-IN-FILES.pngbin0 -> 671 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-CASE-SENSITIVE.pngbin0 -> 402 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-CONTEXT.pngbin0 -> 306 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-DOWN.pngbin0 -> 340 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-MULTI-RESULTS.pngbin0 -> 445 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-REGEX.pngbin0 -> 387 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-SELECTION.pngbin0 -> 229 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-SETDIR.pngbin0 -> 716 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-SUBDIR.pngbin0 -> 742 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-WORD.pngbin0 -> 398 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-WRAP-AROUND.pngbin0 -> 415 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-REPLACE-NEXT.pngbin0 -> 520 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND.pngbin0 -> 662 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FOLDER-MAPPED.pngbin0 -> 656 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FOLDER.pngbin0 -> 615 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/LICENSE28
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/RUN-NOW.pngbin0 -> 292 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/RUN.pngbin0 -> 271 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-ACALL.pngbin0 -> 371 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-CALL.pngbin0 -> 717 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-GCALL.pngbin0 -> 374 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-LCALL.pngbin0 -> 433 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-LOCAL.pngbin0 -> 698 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-SCALL.pngbin0 -> 428 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-UP.pngbin0 -> 753 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/BOOKMARK-TOGGLE.pngbin0 -> 1087 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-BREAK.pngbin0 -> 473 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-BREAKPOINT-TOGGLE.pngbin0 -> 1457 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-CALLSTACK.pngbin0 -> 566 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-DETACH.pngbin0 -> 755 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-RUN-TO.pngbin0 -> 400 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-START.pngbin0 -> 369 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-STEP-INTO.pngbin0 -> 451 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-STEP-OUT.pngbin0 -> 450 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-STEP-OVER.pngbin0 -> 484 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-STOP.pngbin0 -> 799 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-WATCH.pngbin0 -> 1008 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DIR-SETUP-FILE.pngbin0 -> 1365 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DIR-SETUP.pngbin0 -> 1412 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FILE-NEW.pngbin0 -> 821 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FILE-OPEN.pngbin0 -> 780 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FILE-SAVE-ALL.pngbin0 -> 622 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FILE-SAVE.pngbin0 -> 1165 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FIND-AND-REPLACE.pngbin0 -> 495 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FIND-IN-FILES.pngbin0 -> 1173 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FIND.pngbin0 -> 775 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/LICENSE27
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/RUN-NOW.pngbin0 -> 384 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/RUN.pngbin0 -> 358 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/estrela.pngbin0 -> 6252 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/zbstudio.icobin0 -> 32038 bytes
-rw-r--r--love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/zerobrane.pngbin0 -> 10255 bytes
1714 files changed, 462595 insertions, 0 deletions
diff --git a/love2dToAPK/App.config b/love2dToAPK/App.config
new file mode 100644
index 0000000..48c1baf
--- /dev/null
+++ b/love2dToAPK/App.config
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+ <configSections>
+ <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
+ <section name="love2dToAPK.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
+ </sectionGroup>
+ </configSections>
+ <startup>
+ <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
+ </startup>
+ <userSettings>
+ <love2dToAPK.Properties.Settings>
+ <setting name="projectPath" serializeAs="String">
+ <value />
+ </setting>
+ <setting name="firstStart" serializeAs="String">
+ <value>False</value>
+ </setting>
+ <setting name="alwaysOnTop" serializeAs="String">
+ <value>False</value>
+ </setting>
+ <setting name="closeOnSuccess" serializeAs="String">
+ <value>False</value>
+ </setting>
+ </love2dToAPK.Properties.Settings>
+ </userSettings>
+</configuration> \ No newline at end of file
diff --git a/love2dToAPK/Controls/minimalButton.Designer.cs b/love2dToAPK/Controls/minimalButton.Designer.cs
new file mode 100644
index 0000000..379bb06
--- /dev/null
+++ b/love2dToAPK/Controls/minimalButton.Designer.cs
@@ -0,0 +1,31 @@
+namespace love2dToAPK.Controls {
+ partial class minimalButton {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing) {
+ if (disposing && (components != null)) {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent() {
+ components = new System.ComponentModel.Container();
+ }
+
+ #endregion
+ }
+}
diff --git a/love2dToAPK/Controls/minimalButton.cs b/love2dToAPK/Controls/minimalButton.cs
new file mode 100644
index 0000000..91b6b76
--- /dev/null
+++ b/love2dToAPK/Controls/minimalButton.cs
@@ -0,0 +1,70 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace love2dToAPK.Controls {
+ public partial class minimalButton : System.Windows.Forms.Label {
+
+ public Color BackgroundColor {
+ get { return colorStates[0]; }
+ set { generateColors(value); }
+ }
+ public Color ForegroundColor {
+ get { return this.ForeColor; }
+ set { this.ForeColor = value; }
+ }
+
+ private Color[] colorStates;
+
+ public minimalButton() {
+ InitializeComponent();
+
+ // Bind eventHandlers
+ this.MouseEnter += onMouseEnter;
+ this.MouseLeave += onMouseLeave;
+ this.MouseDown += onMouseDown;
+ this.MouseUp += onMouseUp;
+
+ // Generate colors
+ ForegroundColor = this.ForeColor;
+ BackgroundColor = this.BackColor;
+ }
+
+ protected override void OnPaint(PaintEventArgs pe) {
+ base.OnPaint(pe);
+ }
+
+ private void onMouseEnter(object sender, System.EventArgs e) {
+ this.BackColor = colorStates[1];
+ }
+
+ private void onMouseLeave(object sender, System.EventArgs e) {
+ this.BackColor = colorStates[0];
+ }
+
+ private void onMouseDown(object sender, System.EventArgs e) {
+ this.BackColor = colorStates[2];
+ }
+
+ private void onMouseUp(object sender, System.EventArgs e) {
+ this.BackColor = colorStates[1];
+ }
+
+ private void generateColors(Color buttonColor) {
+ colorStates = new Color[3];
+ colorStates[0] = buttonColor;
+ colorStates[1] = Color.FromArgb(buttonColor.R + 10, buttonColor.G + 10, buttonColor.B + 10);
+ colorStates[2] = Color.FromArgb(buttonColor.R - 10, buttonColor.G - 10, buttonColor.B - 10);
+ //colorStates[1] = buttonColor;
+ //colorStates[2] = buttonColor;
+ this.BackColor = buttonColor;
+ }
+
+ }
+}
diff --git a/love2dToAPK/Forms/baseForm.Designer.cs b/love2dToAPK/Forms/baseForm.Designer.cs
new file mode 100644
index 0000000..9558a45
--- /dev/null
+++ b/love2dToAPK/Forms/baseForm.Designer.cs
@@ -0,0 +1,123 @@
+namespace love2dToAPK.Forms {
+ partial class baseForm {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing) {
+ if (disposing && (components != null)) {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent() {
+ this.pnlTitleBar = new System.Windows.Forms.Panel();
+ this.lblTitle = new System.Windows.Forms.Label();
+ this.pnlFormActions = new System.Windows.Forms.Panel();
+ this.btnMinimize = new love2dToAPK.Controls.minimalButton();
+ this.btnClose = new love2dToAPK.Controls.minimalButton();
+ this.pnlTitleBar.SuspendLayout();
+ this.pnlFormActions.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // pnlTitleBar
+ //
+ this.pnlTitleBar.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(49)))), ((int)(((byte)(110)))));
+ this.pnlTitleBar.Controls.Add(this.pnlFormActions);
+ this.pnlTitleBar.Controls.Add(this.lblTitle);
+ this.pnlTitleBar.Dock = System.Windows.Forms.DockStyle.Top;
+ this.pnlTitleBar.Location = new System.Drawing.Point(0, 0);
+ this.pnlTitleBar.Name = "pnlTitleBar";
+ this.pnlTitleBar.Size = new System.Drawing.Size(284, 37);
+ this.pnlTitleBar.TabIndex = 0;
+ //
+ // lblTitle
+ //
+ this.lblTitle.AutoSize = true;
+ this.lblTitle.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblTitle.ForeColor = System.Drawing.Color.White;
+ this.lblTitle.Location = new System.Drawing.Point(12, 9);
+ this.lblTitle.Name = "lblTitle";
+ this.lblTitle.Size = new System.Drawing.Size(68, 21);
+ this.lblTitle.TabIndex = 1;
+ this.lblTitle.Text = "<TITLE>";
+ //
+ // pnlFormActions
+ //
+ this.pnlFormActions.Controls.Add(this.btnMinimize);
+ this.pnlFormActions.Controls.Add(this.btnClose);
+ this.pnlFormActions.Dock = System.Windows.Forms.DockStyle.Right;
+ this.pnlFormActions.Location = new System.Drawing.Point(211, 0);
+ this.pnlFormActions.Name = "pnlFormActions";
+ this.pnlFormActions.Size = new System.Drawing.Size(73, 37);
+ this.pnlFormActions.TabIndex = 1;
+ //
+ // btnMinimize
+ //
+ this.btnMinimize.AutoSize = true;
+ this.btnMinimize.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(49)))), ((int)(((byte)(110)))));
+ this.btnMinimize.BackgroundColor = System.Drawing.SystemColors.Control;
+ this.btnMinimize.Font = new System.Drawing.Font("Segoe UI", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btnMinimize.ForeColor = System.Drawing.Color.White;
+ this.btnMinimize.ForegroundColor = System.Drawing.Color.White;
+ this.btnMinimize.Location = new System.Drawing.Point(12, 1);
+ this.btnMinimize.Name = "btnMinimize";
+ this.btnMinimize.Padding = new System.Windows.Forms.Padding(1, 5, 2, 5);
+ this.btnMinimize.Size = new System.Drawing.Size(23, 35);
+ this.btnMinimize.TabIndex = 1;
+ this.btnMinimize.Text = "_";
+ //
+ // btnClose
+ //
+ this.btnClose.AutoSize = true;
+ this.btnClose.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(49)))), ((int)(((byte)(110)))));
+ this.btnClose.BackgroundColor = System.Drawing.SystemColors.Control;
+ this.btnClose.Font = new System.Drawing.Font("Segoe UI", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btnClose.ForeColor = System.Drawing.Color.White;
+ this.btnClose.ForegroundColor = System.Drawing.Color.White;
+ this.btnClose.Location = new System.Drawing.Point(42, 1);
+ this.btnClose.Name = "btnClose";
+ this.btnClose.Padding = new System.Windows.Forms.Padding(0, 5, 0, 5);
+ this.btnClose.Size = new System.Drawing.Size(23, 35);
+ this.btnClose.TabIndex = 3;
+ this.btnClose.Text = "X";
+ //
+ // baseForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(284, 116);
+ this.Controls.Add(this.pnlTitleBar);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
+ this.Name = "baseForm";
+ this.Text = "baseForm";
+ this.Load += new System.EventHandler(this.baseForm_Load);
+ this.pnlTitleBar.ResumeLayout(false);
+ this.pnlTitleBar.PerformLayout();
+ this.pnlFormActions.ResumeLayout(false);
+ this.pnlFormActions.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Panel pnlTitleBar;
+ private System.Windows.Forms.Panel pnlFormActions;
+ private System.Windows.Forms.Label lblTitle;
+ private Controls.minimalButton btnMinimize;
+ private Controls.minimalButton btnClose;
+ }
+} \ No newline at end of file
diff --git a/love2dToAPK/Forms/baseForm.cs b/love2dToAPK/Forms/baseForm.cs
new file mode 100644
index 0000000..31b92a2
--- /dev/null
+++ b/love2dToAPK/Forms/baseForm.cs
@@ -0,0 +1,159 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace love2dToAPK.Forms {
+
+ public partial class baseForm : Form {
+
+ #region localVariables
+ Panel overlayPanel;
+ #endregion
+
+ #region properties
+ public string WindowTitle {
+ get { return lblTitle.Text; }
+ set { lblTitle.Text = value; }
+ }
+
+ public bool MinimizeAble {
+ get { return btnMinimize.Enabled; }
+ set {
+ if (value) {
+ btnMinimize.Enabled = true;
+ btnMinimize.Show();
+ }
+ else {
+ btnMinimize.Enabled = false;
+ btnMinimize.Hide();
+ }
+ }
+ }
+ #endregion
+
+ #region formShadow
+ protected override CreateParams CreateParams {
+ get {
+ const int CS_DROPSHADOW = 0x20000;
+ CreateParams cp = base.CreateParams;
+ cp.ClassStyle |= CS_DROPSHADOW;
+ return cp;
+ }
+ }
+ #endregion
+
+ #region formMove
+ /* This region contains the code needed to make the form moveable */
+ public const int WM_NCLBUTTONDOWN = 0xA1;
+ public const int HT_CAPTION = 0x2;
+
+ [System.Runtime.InteropServices.DllImportAttribute("user32.dll")]
+ public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
+ [System.Runtime.InteropServices.DllImportAttribute("user32.dll")]
+ public static extern bool ReleaseCapture();
+
+ private void baseForm_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) {
+ if (e.Button == MouseButtons.Left) {
+ ReleaseCapture();
+ SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
+ }
+ }
+ #endregion
+
+ public baseForm() {
+ InitializeComponent();
+
+ /* Add event handlers */
+ // These ones are for moving the form
+ this.MouseDown += baseForm_MouseDown;
+ pnlTitleBar.MouseDown += baseForm_MouseDown;
+ pnlFormActions.MouseDown += baseForm_MouseDown;
+ lblTitle.MouseDown += baseForm_MouseDown;
+ // These are for the button hover effect on the action buttons
+ btnClose.MouseEnter += btn_mouseEnter;
+ btnClose.MouseLeave += btn_mouseLeave;
+ btnMinimize.MouseEnter += btn_mouseEnter;
+ btnMinimize.MouseLeave += btn_mouseLeave;
+ // These are for the actionButtons
+ btnClose.Click += btnClose_Click;
+ btnMinimize.Click += btnMinimize_Click;
+ // This make the form gray when onactive
+ this.EnabledChanged += baseForm_onEnabledChanged;
+ }
+
+ #region EventHandlers
+ private void btnClose_Click(object sender, EventArgs e) {
+ /* Handles the exit-button click */
+ this.Close();
+ }
+
+ private void btnMinimize_Click(object sender, EventArgs e) {
+ /* Handles the minimize-button click */
+ this.WindowState = FormWindowState.Minimized;
+ }
+
+ private void baseForm_onEnabledChanged(object sender, EventArgs e) {
+ /* Handles the enable/disable event */
+ if (Enabled) {
+ this.Controls.Remove(overlayPanel);
+ overlayPanel.Dispose();
+ overlayPanel = null;
+ }
+ else {
+ overlayPanel = new Panel();
+ overlayPanel.Location = new Point(0, 0);
+ overlayPanel.Size = new Size(this.Width, this.Height);
+ overlayPanel.BackColor = Color.FromArgb(0, 255, 255, 255);
+ this.Controls.Add(overlayPanel);
+ //overlayPanel.BringToFront();
+ this.Invalidate();
+ }
+ }
+ #endregion
+
+ #region ButtonHoverEffect
+ public void btn_mouseEnter(object sender, System.EventArgs e) {
+ /* This method handles mouseOver event on buttons */
+ if (sender is Label) {
+ Label thisLabel = (Label)sender;
+ //thisLabel.BackColor = Program.UiTheme(thisLabel.Name + "_backgroundHover");
+ }
+ else if (sender is PictureBox) {
+ PictureBox thisPicture = (PictureBox)sender;
+ //thisPicture.BackColor = Program.UiTheme(thisPicture.Name + "_backgroundHover");
+ }
+ }
+
+ public void btn_mouseLeave(object sender, System.EventArgs e) {
+ /* This method handles mouseOver event on buttons */
+ if (sender is Label) {
+ Label thisLabel = (Label)sender;
+ //thisLabel.BackColor = Program.UiTheme(thisLabel.Name + "_background");
+ }
+ else if (sender is PictureBox) {
+ PictureBox thisPicture = (PictureBox)sender;
+ //thisPicture.BackColor = Program.UiTheme(thisPicture.Name + "_background");
+ }
+ }
+ #endregion
+
+ private void baseForm_Load(object sender, EventArgs e) {
+ btnClose.BackgroundColor = ColorTranslator.FromHtml("#ea316e");
+ btnMinimize.BackgroundColor = ColorTranslator.FromHtml("#ea316e");
+ }
+
+ public virtual void setColor(Color color) {
+ pnlTitleBar.BackColor = color;
+ pnlFormActions.BackColor = color;
+ btnClose.BackgroundColor = color;
+ btnMinimize.BackgroundColor = color;
+ }
+ }
+
+}
diff --git a/love2dToAPK/Forms/baseForm.resx b/love2dToAPK/Forms/baseForm.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/love2dToAPK/Forms/baseForm.resx
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root> \ No newline at end of file
diff --git a/love2dToAPK/Forms/frmFirstStartup.Designer.cs b/love2dToAPK/Forms/frmFirstStartup.Designer.cs
new file mode 100644
index 0000000..037bfdb
--- /dev/null
+++ b/love2dToAPK/Forms/frmFirstStartup.Designer.cs
@@ -0,0 +1,216 @@
+namespace love2dToAPK.Forms {
+ partial class frmFirstStartup {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing) {
+ if (disposing && (components != null)) {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent() {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmFirstStartup));
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.label1 = new System.Windows.Forms.Label();
+ this.label2 = new System.Windows.Forms.Label();
+ this.label3 = new System.Windows.Forms.Label();
+ this.label5 = new System.Windows.Forms.Label();
+ this.label4 = new System.Windows.Forms.Label();
+ this.label6 = new System.Windows.Forms.Label();
+ this.linkLabel1 = new System.Windows.Forms.LinkLabel();
+ this.label7 = new System.Windows.Forms.Label();
+ this.linkLabel2 = new System.Windows.Forms.LinkLabel();
+ this.label8 = new System.Windows.Forms.Label();
+ this.btnContinue = new love2dToAPK.Controls.minimalButton();
+ this.panel1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // panel1
+ //
+ this.panel1.BackColor = System.Drawing.Color.White;
+ this.panel1.Controls.Add(this.label8);
+ this.panel1.Controls.Add(this.linkLabel2);
+ this.panel1.Controls.Add(this.label7);
+ this.panel1.Controls.Add(this.linkLabel1);
+ this.panel1.Controls.Add(this.label6);
+ this.panel1.Controls.Add(this.label4);
+ this.panel1.Controls.Add(this.label5);
+ this.panel1.Controls.Add(this.label3);
+ this.panel1.Controls.Add(this.label2);
+ this.panel1.Controls.Add(this.label1);
+ this.panel1.Location = new System.Drawing.Point(12, 52);
+ this.panel1.Name = "panel1";
+ this.panel1.Size = new System.Drawing.Size(368, 407);
+ this.panel1.TabIndex = 1;
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Font = new System.Drawing.Font("Segoe UI", 20.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(49)))), ((int)(((byte)(110)))));
+ this.label1.Location = new System.Drawing.Point(12, 10);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(179, 37);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "Love2dToAPK";
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label2.Location = new System.Drawing.Point(16, 53);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(314, 30);
+ this.label2.TabIndex = 1;
+ this.label2.Text = "It seems like this is the first time you have opened the app.\r\nSo here is a brief" +
+ " introduction!";
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Font = new System.Drawing.Font("Segoe UI", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label3.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(49)))), ((int)(((byte)(110)))));
+ this.label3.Location = new System.Drawing.Point(14, 90);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(81, 25);
+ this.label3.TabIndex = 2;
+ this.label3.Text = "Purpose";
+ //
+ // label5
+ //
+ this.label5.AutoSize = true;
+ this.label5.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label5.Location = new System.Drawing.Point(16, 121);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(339, 60);
+ this.label5.TabIndex = 4;
+ this.label5.Text = resources.GetString("label5.Text");
+ //
+ // label4
+ //
+ this.label4.AutoSize = true;
+ this.label4.Font = new System.Drawing.Font("Segoe UI", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label4.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(49)))), ((int)(((byte)(110)))));
+ this.label4.Location = new System.Drawing.Point(14, 190);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(64, 25);
+ this.label4.TabIndex = 5;
+ this.label4.Text = "Usage";
+ //
+ // label6
+ //
+ this.label6.AutoSize = true;
+ this.label6.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label6.Location = new System.Drawing.Point(16, 221);
+ this.label6.Name = "label6";
+ this.label6.Size = new System.Drawing.Size(336, 75);
+ this.label6.TabIndex = 6;
+ this.label6.Text = resources.GetString("label6.Text");
+ //
+ // linkLabel1
+ //
+ this.linkLabel1.AutoSize = true;
+ this.linkLabel1.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.linkLabel1.Location = new System.Drawing.Point(16, 296);
+ this.linkLabel1.Name = "linkLabel1";
+ this.linkLabel1.Size = new System.Drawing.Size(160, 13);
+ this.linkLabel1.TabIndex = 7;
+ this.linkLabel1.TabStop = true;
+ this.linkLabel1.Text = "https://aintnoguidehereguys/";
+ //
+ // label7
+ //
+ this.label7.AutoSize = true;
+ this.label7.Font = new System.Drawing.Font("Segoe UI", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label7.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(49)))), ((int)(((byte)(110)))));
+ this.label7.Location = new System.Drawing.Point(14, 318);
+ this.label7.Name = "label7";
+ this.label7.Size = new System.Drawing.Size(71, 25);
+ this.label7.TabIndex = 8;
+ this.label7.Text = "Credits";
+ //
+ // linkLabel2
+ //
+ this.linkLabel2.AutoSize = true;
+ this.linkLabel2.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.linkLabel2.Location = new System.Drawing.Point(16, 381);
+ this.linkLabel2.Name = "linkLabel2";
+ this.linkLabel2.Size = new System.Drawing.Size(197, 13);
+ this.linkLabel2.TabIndex = 10;
+ this.linkLabel2.TabStop = true;
+ this.linkLabel2.Text = "http://qubodup.itch.io/startgamedev";
+ //
+ // label8
+ //
+ this.label8.AutoSize = true;
+ this.label8.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label8.Location = new System.Drawing.Point(16, 349);
+ this.label8.Name = "label8";
+ this.label8.Size = new System.Drawing.Size(297, 26);
+ this.label8.TabIndex = 11;
+ this.label8.Text = "This app was created by Jakob Stendahl with the help of\r\nthese guys and resources" +
+ ".";
+ //
+ // btnContinue
+ //
+ this.btnContinue.AutoSize = true;
+ this.btnContinue.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(12)))), ((int)(((byte)(209)))), ((int)(((byte)(12)))));
+ this.btnContinue.BackgroundColor = System.Drawing.SystemColors.Control;
+ this.btnContinue.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btnContinue.ForeColor = System.Drawing.Color.White;
+ this.btnContinue.ForegroundColor = System.Drawing.Color.White;
+ this.btnContinue.Location = new System.Drawing.Point(230, 469);
+ this.btnContinue.Name = "btnContinue";
+ this.btnContinue.Padding = new System.Windows.Forms.Padding(5);
+ this.btnContinue.Size = new System.Drawing.Size(150, 31);
+ this.btnContinue.TabIndex = 2;
+ this.btnContinue.Text = "Start Love2dToAPK";
+ this.btnContinue.Click += new System.EventHandler(this.btnContinue_Click);
+ //
+ // frmFirstStartup
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.ClientSize = new System.Drawing.Size(397, 512);
+ this.Controls.Add(this.btnContinue);
+ this.Controls.Add(this.panel1);
+ this.Name = "frmFirstStartup";
+ this.Load += new System.EventHandler(this.frmFirstStartup_Load);
+ this.Controls.SetChildIndex(this.panel1, 0);
+ this.Controls.SetChildIndex(this.btnContinue, 0);
+ this.panel1.ResumeLayout(false);
+ this.panel1.PerformLayout();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Panel panel1;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Label label5;
+ private System.Windows.Forms.Label label6;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.LinkLabel linkLabel1;
+ private System.Windows.Forms.Label label7;
+ private System.Windows.Forms.LinkLabel linkLabel2;
+ private System.Windows.Forms.Label label8;
+ private Controls.minimalButton btnContinue;
+ }
+}
diff --git a/love2dToAPK/Forms/frmFirstStartup.cs b/love2dToAPK/Forms/frmFirstStartup.cs
new file mode 100644
index 0000000..61b026b
--- /dev/null
+++ b/love2dToAPK/Forms/frmFirstStartup.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace love2dToAPK.Forms {
+ public partial class frmFirstStartup : love2dToAPK.Forms.baseForm {
+ public frmFirstStartup() {
+ InitializeComponent();
+
+ WindowTitle = "Love2dToAPK";
+ MinimizeAble = false;
+ }
+
+ private void frmFirstStartup_Load(object sender, EventArgs e) {
+ btnContinue.BackgroundColor = ColorTranslator.FromHtml("#0cd10c");
+ }
+
+ private void btnContinue_Click(object sender, EventArgs e) {
+ Properties.Settings.Default.firstStart = false;
+ Properties.Settings.Default.Save();
+ this.Close();
+ }
+ }
+}
diff --git a/love2dToAPK/Forms/frmFirstStartup.resx b/love2dToAPK/Forms/frmFirstStartup.resx
new file mode 100644
index 0000000..20d06c9
--- /dev/null
+++ b/love2dToAPK/Forms/frmFirstStartup.resx
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <data name="label5.Text" xml:space="preserve">
+ <value>This app wants to make the hassle of developing for Android,
+a little less of a, hassle...
+It automates the process of compiling the project to a APK-file,
+installing it to a device and launching it.</value>
+ </data>
+ <data name="label6.Text" xml:space="preserve">
+ <value>I have tried to make the app as simple and self-explanatory
+as possible. Therfore i am only going to mention the
+compile-hotkey here. With the app running in the background
+you can press CTRL+SHIFT+F5 and the compiling will start.
+A more detailed guide of the app can be found here;</value>
+ </data>
+</root> \ No newline at end of file
diff --git a/love2dToAPK/Forms/frmMain.Designer.cs b/love2dToAPK/Forms/frmMain.Designer.cs
new file mode 100644
index 0000000..02a9dfc
--- /dev/null
+++ b/love2dToAPK/Forms/frmMain.Designer.cs
@@ -0,0 +1,191 @@
+namespace love2dToAPK.Forms {
+ partial class frmMain {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing) {
+ if (disposing && (components != null)) {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent() {
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.btnCompile = new love2dToAPK.Controls.minimalButton();
+ this.lblStatus = new System.Windows.Forms.Label();
+ this.panel2 = new System.Windows.Forms.Panel();
+ this.pbStatusImage = new System.Windows.Forms.PictureBox();
+ this.btnSelectFolder = new love2dToAPK.Controls.minimalButton();
+ this.btnSettings = new love2dToAPK.Controls.minimalButton();
+ this.panel3 = new System.Windows.Forms.Panel();
+ this.btnToolsFolder = new love2dToAPK.Controls.minimalButton();
+ this.panel1.SuspendLayout();
+ this.panel2.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.pbStatusImage)).BeginInit();
+ this.panel3.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // panel1
+ //
+ this.panel1.BackColor = System.Drawing.Color.White;
+ this.panel1.Controls.Add(this.btnCompile);
+ this.panel1.Controls.Add(this.lblStatus);
+ this.panel1.Controls.Add(this.panel2);
+ this.panel1.Location = new System.Drawing.Point(12, 62);
+ this.panel1.Name = "panel1";
+ this.panel1.Size = new System.Drawing.Size(229, 70);
+ this.panel1.TabIndex = 1;
+ //
+ // btnCompile
+ //
+ this.btnCompile.AutoSize = true;
+ this.btnCompile.BackColor = System.Drawing.SystemColors.Control;
+ this.btnCompile.BackgroundColor = System.Drawing.SystemColors.Control;
+ this.btnCompile.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btnCompile.ForeColor = System.Drawing.Color.White;
+ this.btnCompile.ForegroundColor = System.Drawing.Color.White;
+ this.btnCompile.Location = new System.Drawing.Point(114, 45);
+ this.btnCompile.Name = "btnCompile";
+ this.btnCompile.Padding = new System.Windows.Forms.Padding(2);
+ this.btnCompile.Size = new System.Drawing.Size(53, 17);
+ this.btnCompile.TabIndex = 2;
+ this.btnCompile.Text = "Compile";
+ this.btnCompile.Click += new System.EventHandler(this.btnCompile_Click);
+ //
+ // lblStatus
+ //
+ this.lblStatus.AutoSize = true;
+ this.lblStatus.Font = new System.Drawing.Font("Segoe UI", 20.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblStatus.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(49)))), ((int)(((byte)(110)))));
+ this.lblStatus.Location = new System.Drawing.Point(71, 3);
+ this.lblStatus.Name = "lblStatus";
+ this.lblStatus.Size = new System.Drawing.Size(89, 37);
+ this.lblStatus.TabIndex = 1;
+ this.lblStatus.Text = "Ready";
+ //
+ // panel2
+ //
+ this.panel2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(49)))), ((int)(((byte)(110)))));
+ this.panel2.Controls.Add(this.pbStatusImage);
+ this.panel2.Dock = System.Windows.Forms.DockStyle.Left;
+ this.panel2.Location = new System.Drawing.Point(0, 0);
+ this.panel2.Name = "panel2";
+ this.panel2.Size = new System.Drawing.Size(70, 70);
+ this.panel2.TabIndex = 0;
+ //
+ // pbStatusImage
+ //
+ this.pbStatusImage.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.pbStatusImage.Image = global::love2dToAPK.Properties.Resources.ready;
+ this.pbStatusImage.Location = new System.Drawing.Point(0, 0);
+ this.pbStatusImage.Name = "pbStatusImage";
+ this.pbStatusImage.Size = new System.Drawing.Size(70, 70);
+ this.pbStatusImage.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+ this.pbStatusImage.TabIndex = 0;
+ this.pbStatusImage.TabStop = false;
+ //
+ // btnSelectFolder
+ //
+ this.btnSelectFolder.AutoSize = true;
+ this.btnSelectFolder.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(49)))), ((int)(((byte)(110)))));
+ this.btnSelectFolder.BackgroundColor = System.Drawing.SystemColors.Control;
+ this.btnSelectFolder.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btnSelectFolder.ForeColor = System.Drawing.Color.White;
+ this.btnSelectFolder.ForegroundColor = System.Drawing.Color.White;
+ this.btnSelectFolder.Location = new System.Drawing.Point(13, 0);
+ this.btnSelectFolder.Name = "btnSelectFolder";
+ this.btnSelectFolder.Padding = new System.Windows.Forms.Padding(2);
+ this.btnSelectFolder.Size = new System.Drawing.Size(114, 17);
+ this.btnSelectFolder.TabIndex = 3;
+ this.btnSelectFolder.Text = "Select project folder";
+ this.btnSelectFolder.Click += new System.EventHandler(this.btnSelectFolder_Click);
+ //
+ // btnSettings
+ //
+ this.btnSettings.AutoSize = true;
+ this.btnSettings.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(49)))), ((int)(((byte)(110)))));
+ this.btnSettings.BackgroundColor = System.Drawing.SystemColors.Control;
+ this.btnSettings.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btnSettings.ForeColor = System.Drawing.Color.White;
+ this.btnSettings.ForegroundColor = System.Drawing.Color.White;
+ this.btnSettings.Location = new System.Drawing.Point(131, 0);
+ this.btnSettings.Name = "btnSettings";
+ this.btnSettings.Padding = new System.Windows.Forms.Padding(2);
+ this.btnSettings.Size = new System.Drawing.Size(53, 17);
+ this.btnSettings.TabIndex = 4;
+ this.btnSettings.Text = "Settings";
+ this.btnSettings.Click += new System.EventHandler(this.btnSettings_Click);
+ //
+ // panel3
+ //
+ this.panel3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(49)))), ((int)(((byte)(110)))));
+ this.panel3.Controls.Add(this.btnToolsFolder);
+ this.panel3.Controls.Add(this.btnSelectFolder);
+ this.panel3.Controls.Add(this.btnSettings);
+ this.panel3.Location = new System.Drawing.Point(0, 37);
+ this.panel3.Name = "panel3";
+ this.panel3.Size = new System.Drawing.Size(253, 17);
+ this.panel3.TabIndex = 5;
+ //
+ // btnToolsFolder
+ //
+ this.btnToolsFolder.AutoSize = true;
+ this.btnToolsFolder.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(49)))), ((int)(((byte)(110)))));
+ this.btnToolsFolder.BackgroundColor = System.Drawing.SystemColors.Control;
+ this.btnToolsFolder.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btnToolsFolder.ForeColor = System.Drawing.Color.White;
+ this.btnToolsFolder.ForegroundColor = System.Drawing.Color.White;
+ this.btnToolsFolder.Location = new System.Drawing.Point(188, 0);
+ this.btnToolsFolder.Name = "btnToolsFolder";
+ this.btnToolsFolder.Padding = new System.Windows.Forms.Padding(2);
+ this.btnToolsFolder.Size = new System.Drawing.Size(25, 17);
+ this.btnToolsFolder.TabIndex = 5;
+ this.btnToolsFolder.Text = "dir";
+ this.btnToolsFolder.Click += new System.EventHandler(this.btnToolsFolder_Click);
+ //
+ // frmMain
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.ClientSize = new System.Drawing.Size(250, 142);
+ this.Controls.Add(this.panel3);
+ this.Controls.Add(this.panel1);
+ this.Name = "frmMain";
+ this.Load += new System.EventHandler(this.frmMain_Load);
+ this.Controls.SetChildIndex(this.panel1, 0);
+ this.Controls.SetChildIndex(this.panel3, 0);
+ this.panel1.ResumeLayout(false);
+ this.panel1.PerformLayout();
+ this.panel2.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.pbStatusImage)).EndInit();
+ this.panel3.ResumeLayout(false);
+ this.panel3.PerformLayout();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Panel panel1;
+ private System.Windows.Forms.Panel panel2;
+ private System.Windows.Forms.Label lblStatus;
+ private Controls.minimalButton btnCompile;
+ private System.Windows.Forms.PictureBox pbStatusImage;
+ private Controls.minimalButton btnSelectFolder;
+ private Controls.minimalButton btnSettings;
+ private System.Windows.Forms.Panel panel3;
+ private Controls.minimalButton btnToolsFolder;
+ }
+}
diff --git a/love2dToAPK/Forms/frmMain.cs b/love2dToAPK/Forms/frmMain.cs
new file mode 100644
index 0000000..59b1cbb
--- /dev/null
+++ b/love2dToAPK/Forms/frmMain.cs
@@ -0,0 +1,86 @@
+using System;
+using System.Drawing;
+using System.Windows.Forms;
+using Microsoft.WindowsAPICodePack.Dialogs;
+using System.Runtime.InteropServices;
+using System.Diagnostics;
+using System.IO;
+
+namespace love2dToAPK.Forms {
+ public partial class frmMain : love2dToAPK.Forms.baseForm {
+
+ [DllImport("user32.dll")]
+ private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);
+
+ [DllImport("user32.dll")]
+ private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
+
+ const int MOD_CONTROL = 0x0002;
+ const int MOD_SHIFT = 0x0004;
+ const int WM_HOTKEY = 0x0312;
+
+
+ public frmMain() {
+ InitializeComponent();
+
+ WindowTitle = "Love2dToAPK";
+ RegisterHotKey(this.Handle, 1, MOD_CONTROL + MOD_SHIFT, (int)Keys.F5);
+ }
+
+ private void frmMain_Load(object sender, EventArgs e) {
+ btnCompile.BackgroundColor = ColorTranslator.FromHtml("#ea316e");
+ btnSelectFolder.BackgroundColor = ColorTranslator.FromHtml("#ea316e");
+ btnSettings.BackgroundColor = ColorTranslator.FromHtml("#ea316e");
+ btnToolsFolder.BackgroundColor = ColorTranslator.FromHtml("#ea316e");
+
+ this.TopMost = Properties.Settings.Default.alwaysOnTop;
+ }
+
+ protected override void WndProc(ref Message m) {
+ if (m.Msg == WM_HOTKEY && (int)m.WParam == 1)
+ compileRoutine();
+ base.WndProc(ref m);
+ }
+
+ private void btnCompile_Click(object sender, EventArgs e) {
+ compileRoutine();
+ }
+
+ private void compileRoutine() {
+ // Open output console, deactivate self, reactivate self
+ this.lblStatus.Text = "Compiling...";
+ this.Enabled = false;
+ Forms.frmOutput dlg = new Forms.frmOutput();
+ Program.frmOutput = dlg;
+ dlg.projectPath = Properties.Settings.Default.projectPath;
+ DialogResult result = dlg.ShowDialog();
+ Program.frmOutput = null;
+ this.Enabled = true;
+ this.lblStatus.Text = "Ready";
+ }
+
+ private void btnSelectFolder_Click(object sender, EventArgs e) {
+ CommonOpenFileDialog dialog = new CommonOpenFileDialog();
+ //dialog.InitialDirectory = "C:\\Users";
+ dialog.IsFolderPicker = true;
+ if (dialog.ShowDialog() == CommonFileDialogResult.Ok) {
+ Properties.Settings.Default.projectPath = dialog.FileName;
+ Properties.Settings.Default.Save();
+ }
+ }
+
+ private void btnSettings_Click(object sender, EventArgs e) {
+ this.Enabled = false;
+ Forms.frmSettings dlg = new Forms.frmSettings();
+ dlg.ShowDialog();
+ this.Enabled = true;
+ }
+
+ private void btnToolsFolder_Click(object sender, EventArgs e) {
+ if (!Directory.Exists("tools")) {
+ Directory.CreateDirectory("tools");
+ }
+ Process.Start("explorer.exe", AppDomain.CurrentDomain.BaseDirectory + "tools");
+ }
+ }
+}
diff --git a/love2dToAPK/Forms/frmMain.resx b/love2dToAPK/Forms/frmMain.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/love2dToAPK/Forms/frmMain.resx
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root> \ No newline at end of file
diff --git a/love2dToAPK/Forms/frmOutput.Designer.cs b/love2dToAPK/Forms/frmOutput.Designer.cs
new file mode 100644
index 0000000..71aea87
--- /dev/null
+++ b/love2dToAPK/Forms/frmOutput.Designer.cs
@@ -0,0 +1,54 @@
+namespace love2dToAPK.Forms {
+ partial class frmOutput {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing) {
+ if (disposing && (components != null)) {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent() {
+ this.txtOutput = new System.Windows.Forms.TextBox();
+ this.SuspendLayout();
+ //
+ // txtOutput
+ //
+ this.txtOutput.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.txtOutput.Location = new System.Drawing.Point(0, 37);
+ this.txtOutput.Multiline = true;
+ this.txtOutput.Name = "txtOutput";
+ this.txtOutput.Size = new System.Drawing.Size(634, 249);
+ this.txtOutput.TabIndex = 3;
+ //
+ // frmOutput
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.ClientSize = new System.Drawing.Size(634, 286);
+ this.Controls.Add(this.txtOutput);
+ this.Name = "frmOutput";
+ this.Load += new System.EventHandler(this.frmOutput_Load);
+ this.Controls.SetChildIndex(this.txtOutput, 0);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+ private System.Windows.Forms.TextBox txtOutput;
+ }
+}
diff --git a/love2dToAPK/Forms/frmOutput.cs b/love2dToAPK/Forms/frmOutput.cs
new file mode 100644
index 0000000..5d63b71
--- /dev/null
+++ b/love2dToAPK/Forms/frmOutput.cs
@@ -0,0 +1,52 @@
+using System;
+using System.Diagnostics;
+using System.IO;
+using System.IO.Compression;
+using System.Threading;
+using System.Windows.Forms;
+
+namespace love2dToAPK.Forms {
+ public partial class frmOutput : love2dToAPK.Forms.baseForm {
+
+ public string projectPath { get; set; }
+ public string responseCode { get; set; }
+
+ private Thread _compilerThread;
+ private string _toolsPath = AppDomain.CurrentDomain.BaseDirectory;
+
+ public frmOutput() {
+ InitializeComponent();
+
+ WindowTitle = "Output";
+ MinimizeAble = false;
+ txtOutput.ScrollBars = ScrollBars.Vertical;
+ }
+
+ private void frmOutput_Load(object sender, EventArgs e) {
+ _compilerThread = new Thread(compileRoutine);
+ _compilerThread.Start();
+
+ this.TopMost = Properties.Settings.Default.alwaysOnTop;
+ }
+
+ private void compileRoutine() {
+ Compiler compiler = new Compiler(projectPath);
+ compiler.compile();
+
+ if (compiler.BuildSuccessful && Properties.Settings.Default.closeOnSuccess) {
+ this.Invoke((MethodInvoker)delegate {
+ this.Close();
+ });
+ }
+ }
+
+ public void log(string str) {
+ if (InvokeRequired) {
+ this.Invoke(new Action<string>(log), new object[] { str });
+ return;
+ }
+ txtOutput.AppendText(str + "\r\n");
+ }
+
+ }
+}
diff --git a/love2dToAPK/Forms/frmOutput.resx b/love2dToAPK/Forms/frmOutput.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/love2dToAPK/Forms/frmOutput.resx
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root> \ No newline at end of file
diff --git a/love2dToAPK/Forms/frmSettings.Designer.cs b/love2dToAPK/Forms/frmSettings.Designer.cs
new file mode 100644
index 0000000..4cf3cdd
--- /dev/null
+++ b/love2dToAPK/Forms/frmSettings.Designer.cs
@@ -0,0 +1,106 @@
+namespace love2dToAPK.Forms {
+ partial class frmSettings {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing) {
+ if (disposing && (components != null)) {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent() {
+ this.cbAlwaysOnTop = new System.Windows.Forms.CheckBox();
+ this.cbCloseOnSuccess = new System.Windows.Forms.CheckBox();
+ this.panel1 = new System.Windows.Forms.Panel();
+ this.btnSave = new love2dToAPK.Controls.minimalButton();
+ this.panel1.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // cbAlwaysOnTop
+ //
+ this.cbAlwaysOnTop.AutoSize = true;
+ this.cbAlwaysOnTop.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.cbAlwaysOnTop.Location = new System.Drawing.Point(13, 13);
+ this.cbAlwaysOnTop.Name = "cbAlwaysOnTop";
+ this.cbAlwaysOnTop.Size = new System.Drawing.Size(145, 17);
+ this.cbAlwaysOnTop.TabIndex = 1;
+ this.cbAlwaysOnTop.Text = "Window always on top";
+ this.cbAlwaysOnTop.UseVisualStyleBackColor = true;
+ //
+ // cbCloseOnSuccess
+ //
+ this.cbCloseOnSuccess.AutoSize = true;
+ this.cbCloseOnSuccess.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.cbCloseOnSuccess.Location = new System.Drawing.Point(13, 36);
+ this.cbCloseOnSuccess.Name = "cbCloseOnSuccess";
+ this.cbCloseOnSuccess.Size = new System.Drawing.Size(260, 17);
+ this.cbCloseOnSuccess.TabIndex = 2;
+ this.cbCloseOnSuccess.Text = "Close output-window if build was successfull";
+ this.cbCloseOnSuccess.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+ this.cbCloseOnSuccess.UseVisualStyleBackColor = true;
+ //
+ // panel1
+ //
+ this.panel1.BackColor = System.Drawing.Color.White;
+ this.panel1.Controls.Add(this.cbAlwaysOnTop);
+ this.panel1.Controls.Add(this.cbCloseOnSuccess);
+ this.panel1.Location = new System.Drawing.Point(12, 55);
+ this.panel1.Name = "panel1";
+ this.panel1.Size = new System.Drawing.Size(289, 67);
+ this.panel1.TabIndex = 3;
+ //
+ // btnSave
+ //
+ this.btnSave.AutoSize = true;
+ this.btnSave.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(255)))), ((int)(((byte)(128)))));
+ this.btnSave.BackgroundColor = System.Drawing.SystemColors.Control;
+ this.btnSave.Font = new System.Drawing.Font("Segoe UI", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.btnSave.ForeColor = System.Drawing.Color.White;
+ this.btnSave.ForegroundColor = System.Drawing.Color.White;
+ this.btnSave.Location = new System.Drawing.Point(239, 135);
+ this.btnSave.Name = "btnSave";
+ this.btnSave.Padding = new System.Windows.Forms.Padding(5);
+ this.btnSave.Size = new System.Drawing.Size(61, 35);
+ this.btnSave.TabIndex = 4;
+ this.btnSave.Text = "Save";
+ this.btnSave.Click += new System.EventHandler(this.btnSave_Click);
+ //
+ // frmSettings
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.ClientSize = new System.Drawing.Size(317, 183);
+ this.Controls.Add(this.btnSave);
+ this.Controls.Add(this.panel1);
+ this.Name = "frmSettings";
+ this.Load += new System.EventHandler(this.frmSettings_Load);
+ this.Controls.SetChildIndex(this.panel1, 0);
+ this.Controls.SetChildIndex(this.btnSave, 0);
+ this.panel1.ResumeLayout(false);
+ this.panel1.PerformLayout();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.CheckBox cbAlwaysOnTop;
+ private System.Windows.Forms.CheckBox cbCloseOnSuccess;
+ private System.Windows.Forms.Panel panel1;
+ private Controls.minimalButton btnSave;
+ }
+}
diff --git a/love2dToAPK/Forms/frmSettings.cs b/love2dToAPK/Forms/frmSettings.cs
new file mode 100644
index 0000000..3b43381
--- /dev/null
+++ b/love2dToAPK/Forms/frmSettings.cs
@@ -0,0 +1,35 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace love2dToAPK.Forms {
+ public partial class frmSettings : love2dToAPK.Forms.baseForm {
+ public frmSettings() {
+ InitializeComponent();
+
+ WindowTitle = "Settings";
+ MinimizeAble = false;
+
+ this.TopMost = Properties.Settings.Default.alwaysOnTop;
+ }
+
+ private void frmSettings_Load(object sender, EventArgs e) {
+ btnSave.BackgroundColor = ColorTranslator.FromHtml("#0fdb0f");
+
+ cbAlwaysOnTop.Checked = Properties.Settings.Default.alwaysOnTop;
+ cbCloseOnSuccess.Checked = Properties.Settings.Default.closeOnSuccess;
+ }
+
+ private void btnSave_Click(object sender, EventArgs e) {
+ Properties.Settings.Default.alwaysOnTop = cbAlwaysOnTop.Checked;
+ Properties.Settings.Default.closeOnSuccess = cbCloseOnSuccess.Checked;
+ Properties.Settings.Default.Save();
+ MessageBox.Show("Restart the app for changes to take effect.");
+ this.Close();
+ }
+ }
+}
diff --git a/love2dToAPK/Forms/frmSettings.resx b/love2dToAPK/Forms/frmSettings.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/love2dToAPK/Forms/frmSettings.resx
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root> \ No newline at end of file
diff --git a/love2dToAPK/Program.cs b/love2dToAPK/Program.cs
new file mode 100644
index 0000000..7d8473f
--- /dev/null
+++ b/love2dToAPK/Program.cs
@@ -0,0 +1,43 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Media;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace love2dToAPK {
+ static class Program {
+ /// <summary>
+ /// The main entry point for the application.
+ /// </summary>
+ ///
+
+ public static Forms.frmOutput frmOutput;
+
+ public static string Output {
+ get { return _output; }
+ set { _output = value; log(value); }
+ }
+ private static string _output;
+
+
+ [STAThread]
+ static void Main() {
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+
+ if (Properties.Settings.Default.firstStart) {
+ Forms.frmFirstStartup firstStartupDialog = new Forms.frmFirstStartup();
+ firstStartupDialog.ShowDialog();
+ }
+ Application.Run(new Forms.frmMain());
+ }
+
+ private static void log(string str) {
+ if (frmOutput != null) {
+ frmOutput.log(str);
+ }
+ }
+
+ }
+}
diff --git a/love2dToAPK/Properties/AssemblyInfo.cs b/love2dToAPK/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..7cf65c3
--- /dev/null
+++ b/love2dToAPK/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("love2dToAPK")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("love2dToAPK")]
+[assembly: AssemblyCopyright("Copyright © 2017")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("12e47644-106b-499a-98a3-cd9abcb57112")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/love2dToAPK/Properties/Resources.Designer.cs b/love2dToAPK/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..ed2ba54
--- /dev/null
+++ b/love2dToAPK/Properties/Resources.Designer.cs
@@ -0,0 +1,73 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace love2dToAPK.Properties {
+ using System;
+
+
+ /// <summary>
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ /// </summary>
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ /// <summary>
+ /// Returns the cached ResourceManager instance used by this class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("love2dToAPK.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ /// <summary>
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ /// <summary>
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ /// </summary>
+ internal static System.Drawing.Bitmap ready {
+ get {
+ object obj = ResourceManager.GetObject("ready", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+ }
+}
diff --git a/love2dToAPK/Properties/Resources.resx b/love2dToAPK/Properties/Resources.resx
new file mode 100644
index 0000000..009b124
--- /dev/null
+++ b/love2dToAPK/Properties/Resources.resx
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+ <data name="ready" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Resources\ready.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+</root> \ No newline at end of file
diff --git a/love2dToAPK/Properties/Settings.Designer.cs b/love2dToAPK/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..568e49e
--- /dev/null
+++ b/love2dToAPK/Properties/Settings.Designer.cs
@@ -0,0 +1,74 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace love2dToAPK.Properties {
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.3.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default {
+ get {
+ return defaultInstance;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("")]
+ public string projectPath {
+ get {
+ return ((string)(this["projectPath"]));
+ }
+ set {
+ this["projectPath"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool firstStart {
+ get {
+ return ((bool)(this["firstStart"]));
+ }
+ set {
+ this["firstStart"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool alwaysOnTop {
+ get {
+ return ((bool)(this["alwaysOnTop"]));
+ }
+ set {
+ this["alwaysOnTop"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool closeOnSuccess {
+ get {
+ return ((bool)(this["closeOnSuccess"]));
+ }
+ set {
+ this["closeOnSuccess"] = value;
+ }
+ }
+ }
+}
diff --git a/love2dToAPK/Properties/Settings.settings b/love2dToAPK/Properties/Settings.settings
new file mode 100644
index 0000000..498eba1
--- /dev/null
+++ b/love2dToAPK/Properties/Settings.settings
@@ -0,0 +1,18 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="love2dToAPK.Properties" GeneratedClassName="Settings">
+ <Profiles />
+ <Settings>
+ <Setting Name="projectPath" Type="System.String" Scope="User">
+ <Value Profile="(Default)" />
+ </Setting>
+ <Setting Name="firstStart" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">False</Value>
+ </Setting>
+ <Setting Name="alwaysOnTop" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">False</Value>
+ </Setting>
+ <Setting Name="closeOnSuccess" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">False</Value>
+ </Setting>
+ </Settings>
+</SettingsFile> \ No newline at end of file
diff --git a/love2dToAPK/Resources/983924-200.png b/love2dToAPK/Resources/983924-200.png
new file mode 100644
index 0000000..03ee969
--- /dev/null
+++ b/love2dToAPK/Resources/983924-200.png
Binary files differ
diff --git a/love2dToAPK/Resources/ready.png b/love2dToAPK/Resources/ready.png
new file mode 100644
index 0000000..df2e738
--- /dev/null
+++ b/love2dToAPK/Resources/ready.png
Binary files differ
diff --git a/love2dToAPK/Settings.cs b/love2dToAPK/Settings.cs
new file mode 100644
index 0000000..705d47d
--- /dev/null
+++ b/love2dToAPK/Settings.cs
@@ -0,0 +1,28 @@
+namespace love2dToAPK.Properties {
+
+
+ // This class allows you to handle specific events on the settings class:
+ // The SettingChanging event is raised before a setting's value is changed.
+ // The PropertyChanged event is raised after a setting's value is changed.
+ // The SettingsLoaded event is raised after the setting values are loaded.
+ // The SettingsSaving event is raised before the setting values are saved.
+ internal sealed partial class Settings {
+
+ public Settings() {
+ // // To add event handlers for saving and changing settings, uncomment the lines below:
+ //
+ // this.SettingChanging += this.SettingChangingEventHandler;
+ //
+ // this.SettingsSaving += this.SettingsSavingEventHandler;
+ //
+ }
+
+ private void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e) {
+ // Add code to handle the SettingChangingEvent event here.
+ }
+
+ private void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e) {
+ // Add code to handle the SettingsSaving event here.
+ }
+ }
+}
diff --git a/love2dToAPK/adb.cs b/love2dToAPK/adb.cs
new file mode 100644
index 0000000..08aed78
--- /dev/null
+++ b/love2dToAPK/adb.cs
@@ -0,0 +1,96 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace love2dToAPK {
+
+ class adb {
+
+ public adb() {
+ }
+
+ public void install(string apkPath) {
+ var processInfo = new ProcessStartInfo();
+ processInfo.WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory + "tools\\tools\\adb";
+ processInfo.FileName = "cmd.exe";
+ processInfo.Arguments = "/c adb.exe install -r \"" + apkPath + "\""; // This will install a new version of the app
+ processInfo.CreateNoWindow = true;
+ processInfo.UseShellExecute = false;
+ processInfo.RedirectStandardError = true;
+ processInfo.RedirectStandardOutput = true;
+
+ var process = Process.Start(processInfo);
+ process.OutputDataReceived += (object sender, DataReceivedEventArgs e) => log(e.Data);
+ process.BeginOutputReadLine();
+
+ process.ErrorDataReceived += (object sender, DataReceivedEventArgs e) => log("error>> " + e.Data);
+ process.BeginErrorReadLine();
+
+ process.WaitForExit();
+
+ //Console.WriteLine("ExitCode: {0}", process.ExitCode);
+ log("Exitcode: " + process.ExitCode.ToString());
+ process.Close();
+ return;
+ }
+
+ public void uninstall(string bundleIdentifier) {
+ var processInfo = new ProcessStartInfo();
+ processInfo.WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory + "tools\\tools\\adb";
+ processInfo.FileName = "cmd.exe";
+ processInfo.Arguments = "/c adb.exe uninstall \"" + bundleIdentifier + "\"";
+ processInfo.CreateNoWindow = true;
+ processInfo.UseShellExecute = false;
+ processInfo.RedirectStandardError = true;
+ processInfo.RedirectStandardOutput = true;
+
+ var process = Process.Start(processInfo);
+ process.OutputDataReceived += (object sender, DataReceivedEventArgs e) => log(e.Data);
+ process.BeginOutputReadLine();
+
+ process.ErrorDataReceived += (object sender, DataReceivedEventArgs e) => log("error>> " + e.Data);
+ process.BeginErrorReadLine();
+
+ process.WaitForExit();
+
+ //Console.WriteLine("ExitCode: {0}", process.ExitCode);
+ log("Exitcode: " + process.ExitCode.ToString());
+ process.Close();
+ return;
+ }
+
+ public void launchApp(string bundleIdentifier) {
+ var processInfo = new ProcessStartInfo();
+ processInfo.WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory + "tools\\tools\\adb";
+ processInfo.FileName = "cmd.exe";
+ processInfo.Arguments = "/c adb.exe shell monkey -p " + bundleIdentifier + " -c android.intent.category.LAUNCHER 1";
+ processInfo.CreateNoWindow = true;
+ processInfo.UseShellExecute = false;
+ processInfo.RedirectStandardError = true;
+ processInfo.RedirectStandardOutput = true;
+
+ var process = Process.Start(processInfo);
+ process.OutputDataReceived += (object sender, DataReceivedEventArgs e) => log(e.Data);
+ process.BeginOutputReadLine();
+
+ process.ErrorDataReceived += (object sender, DataReceivedEventArgs e) => log("error>> " + e.Data);
+ process.BeginErrorReadLine();
+
+ process.WaitForExit();
+
+ //Console.WriteLine("ExitCode: {0}", process.ExitCode);
+ log("Exitcode: " + process.ExitCode.ToString());
+ process.Close();
+ return;
+ }
+
+ private void log(string str) {
+ Program.frmOutput.log(str);
+ }
+
+ }
+
+}
diff --git a/love2dToAPK/compiler.cs b/love2dToAPK/compiler.cs
new file mode 100644
index 0000000..8b0e34f
--- /dev/null
+++ b/love2dToAPK/compiler.cs
@@ -0,0 +1,259 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.IO.Compression;
+using System.Threading;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Media;
+using System.Drawing;
+using System.Xml;
+using System.Windows.Forms;
+
+namespace love2dToAPK {
+
+ class Compiler {
+
+ public string ProjectPath { get; set; }
+ public string ResponseCode { get; set; }
+
+ private string _toolsPath = AppDomain.CurrentDomain.BaseDirectory;
+ private string _packageIdentifier;
+
+ public bool BuildSuccessful;
+ public Compiler(string projectPath) {
+ ProjectPath = projectPath;
+ _toolsPath += "//tools//";
+ }
+
+ public void compile() {
+ /* the actual routine is in compile-routine, this is because we want a nicer looking try-catch thing */
+ try {
+ compileRoutine();
+
+ log("###############################");
+ log("BUILD SUCCESSFULL!!!");
+ log("###############################");
+ Program.frmOutput.setColor(ColorTranslator.FromHtml("#13c116"));
+ SystemSounds.Hand.Play();
+ BuildSuccessful = true;
+
+ } catch (Exception e) {
+ log("###############################");
+ log("BUILD FAILED!!!");
+ log("###############################");
+ log(e.ToString());
+ Program.frmOutput.setColor(ColorTranslator.FromHtml("#e01616"));
+ SystemSounds.Asterisk.Play();
+ BuildSuccessful = false;
+
+ }
+ }
+
+ private void compileRoutine() {
+ Stopwatch stopWatch = new Stopwatch();
+ stopWatch.Start();
+
+ log("-- Starting compiler --");
+
+ log(">> Checking for required files...");
+ requiredFilesExist();
+
+ log(">> Cleaning up old junk...");
+ cleanupOldJunk();
+
+ log(">> Getting project settings...");
+ extractProjectSettings();
+
+ log(">> Zipping source-dir...");
+ ZipFile.CreateFromDirectory(ProjectPath, "tools\\game.love");
+
+ log(">> Putting all the files in the bowl, mixing, and pouring them to different locations.");
+ lastPreparationBeforeCompiling();
+
+ log(">> Launching Ant-compiler...");
+ runAnt();
+
+ log(">> Move build to build folder...");
+ moveOutputFiles();
+
+ log(">> Cleanup...");
+ cleanUpNewJunk();
+
+ log(">> Installing on phone");
+ moveToPhone();
+
+ stopWatch.Stop();
+ TimeSpan ts = stopWatch.Elapsed;
+ string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
+ log("-- Finished compiling in " + elapsedTime + " --");
+ }
+
+ private void requiredFilesExist() {
+ /* This method checks if all the required tools and files exist */
+
+ // This directory is required because everything that is needed during the compilation is here
+ if (!Directory.Exists("tools")) {
+ throw new Exception("TOOLS NOT FOUND; PANICKING! SUPRISE MAFA**A, THERE IS NO CAKE!");
+ }
+
+ // This directory is required becuase we want to have something to compile
+ if (!Directory.Exists(ProjectPath)) {
+ throw new Exception("Project folder not found! \n path at " + ProjectPath);
+ }
+
+ }
+
+ private void cleanupOldJunk() {
+ /* This method cleans up old files that could be left behind from old compilations */
+
+ // Not really nececarry, just to stop the folder from entering our game.love file
+ if (Directory.Exists(ProjectPath + "\\build\\")) {
+ log("Buildfolder found, deleting before compiling...");
+ Directory.Delete(ProjectPath + "\\build\\", true);
+ }
+
+ // Delete old game.love, to stop us from conflicts when zipping the project
+ if (File.Exists("tools\\game.love")) {
+ log("Deleting old game.love");
+ File.Delete("tools\\game.love");
+ }
+
+ // Delete old game.apk, this is not really a problem, as we are going to copy it elsewehre anyway
+ if (File.Exists("tools\\game.apk")) {
+ log("Deleting old game apk");
+ File.Delete("tools\\game.apk");
+ }
+
+ // Delete old source compilation, again to protect from conflicts
+ if (Directory.Exists("tools\\tools\\love-android-sdl2\\src\\love")) {
+ log("Deleting old source-folder");
+ Directory.Delete("tools\\tools\\love-android-sdl2\\src\\love", true);
+ }
+
+ // This is the old game.love file, again, stop from conflicts.
+ if (File.Exists("tools\\tools\\love-android-sdl2\\assets\\game.love")) {
+ log("Deleting old game apk");
+ File.Delete("tools\\tools\\love-android-sdl2\\assets\\game.love");
+ }
+
+ }
+
+ private void extractProjectSettings() {
+ /* This copies potential custom app settings, and reads things like the app name.
+ * For when we are going to use ADB later */
+
+ // Delete old manifest file, to protect from conflicts
+ if (File.Exists(_toolsPath + "tools\\love-android-sdl2\\AndroidManifest.xml")) {
+ File.Delete(_toolsPath + "tools\\love-android-sdl2\\AndroidManifest.xml");
+ }
+
+ // Copy manifest file from project path if it exists
+ // If not we want the default manifest file.
+ if (File.Exists(ProjectPath + "\\AndroidManifest.xml")) {
+ log("Found manifest file.");
+ File.Copy(ProjectPath + "\\AndroidManifest.xml", _toolsPath + "tools\\love-android-sdl2\\AndroidManifest.xml");
+ } else {
+ log("No maifest file found, using default,");
+ File.Copy(_toolsPath + "tools\\love-android-sdl2\\original\\AndroidManifest.xml", _toolsPath + "tools\\love-android-sdl2\\AndroidManifest.xml");
+ }
+
+ // We should do something about our icon here as well
+
+ // Read package identifier from the androidManifest
+ XmlDocument doc = new XmlDocument();
+ doc.Load(_toolsPath + "tools\\love-android-sdl2\\AndroidManifest.xml");
+ _packageIdentifier = doc.SelectSingleNode("manifest").Attributes["package"].InnerText;
+
+ }
+
+ private void zipGameSource() {
+
+ }
+
+ private void lastPreparationBeforeCompiling() {
+ /* This method will make the sourceDir,
+ * get the new game.love file, fiddle with the icon and generate LtaActivityFile */
+
+ // Create the source-dir
+ Directory.CreateDirectory("tools\\tools\\love-android-sdl2\\src\\love");
+ Directory.CreateDirectory("tools\\tools\\love-android-sdl2\\src\\love\\to");
+ Directory.CreateDirectory("tools\\tools\\love-android-sdl2\\src\\love\\to\\android");
+
+ // Fetch the new game.love file
+ File.Move("tools\\game.love", "tools\\tools\\love-android-sdl2\\assets\\game.love");
+
+ // TODO Move icon to folder, have to make a default as well. Move icon to root in extractProjectSettings
+
+ generateLtaActivityFile();
+
+ }
+
+ private void generateLtaActivityFile() {
+ /* I Have no clue what this file really does,
+ * but to change the package name we have to generate it
+ * instead of just copying it from source */
+
+ string[] lines = {
+ "package " + _packageIdentifier + ";",
+ "import org.love2d.android.GameActivity;",
+ "",
+ "public class LtaActivity extends GameActivity {}"
+ };
+ File.WriteAllLines("tools\\tools\\love-android-sdl2\\src\\love\\to\\android\\LtaActivity.java", lines);
+
+ }
+
+ private void runAnt() {
+ /* This runs a batch file that excecutes the compiler-batch-thingy ANT */
+ var processInfo = new ProcessStartInfo();
+ processInfo.WorkingDirectory = _toolsPath;
+ processInfo.FileName = "cmd.exe";
+ processInfo.Arguments = "/c startAnt.bat";
+ processInfo.CreateNoWindow = true;
+ processInfo.UseShellExecute = false;
+ processInfo.RedirectStandardError = true;
+ processInfo.RedirectStandardOutput = true;
+
+ var process = Process.Start(processInfo);
+ process.OutputDataReceived += (object sender, DataReceivedEventArgs e) => log(e.Data);
+ process.BeginOutputReadLine();
+
+ process.ErrorDataReceived += (object sender, DataReceivedEventArgs e) => log("[error] >> " + e.Data);
+ process.BeginErrorReadLine();
+
+ process.WaitForExit();
+
+ log("Exitcode: " + process.ExitCode.ToString());
+ process.Close();
+ }
+
+ private void moveOutputFiles() {
+ Directory.CreateDirectory(ProjectPath + "\\build\\");
+ File.Copy("tools\\tools\\love-android-sdl2\\bin\\love_android_sdl2-debug.apk", ProjectPath + "\\build\\game.apk");
+ }
+
+ private void cleanUpNewJunk() {
+ File.Delete("tools\\game.love");
+ File.Delete("tools\\game.apk");
+ }
+
+ private void moveToPhone() {
+ adb adb = new adb();
+
+ adb.install(ProjectPath + "\\build\\game.apk"); // This installs the app, if an older version exists, update it.
+
+ log(">> Launching app, please make sure it is unlocked. If it isn't monkey might go crazy!!!");
+ Thread.Sleep(1000);
+ adb.launchApp(_packageIdentifier);
+ }
+
+ private void log(string str) {
+ Program.frmOutput.log(str);
+ }
+
+ }
+
+}
diff --git a/love2dToAPK/love2dToAPK.csproj b/love2dToAPK/love2dToAPK.csproj
new file mode 100644
index 0000000..1923f21
--- /dev/null
+++ b/love2dToAPK/love2dToAPK.csproj
@@ -0,0 +1,193 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProjectGuid>{12E47644-106B-499A-98A3-CD9ABCB57112}</ProjectGuid>
+ <OutputType>WinExe</OutputType>
+ <RootNamespace>love2dToAPK</RootNamespace>
+ <AssemblyName>love2dToAPK</AssemblyName>
+ <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
+ <FileAlignment>512</FileAlignment>
+ <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+ <IsWebBootstrapper>false</IsWebBootstrapper>
+ <PublishUrl>publish\</PublishUrl>
+ <Install>true</Install>
+ <InstallFrom>Disk</InstallFrom>
+ <UpdateEnabled>false</UpdateEnabled>
+ <UpdateMode>Foreground</UpdateMode>
+ <UpdateInterval>7</UpdateInterval>
+ <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+ <UpdatePeriodically>false</UpdatePeriodically>
+ <UpdateRequired>false</UpdateRequired>
+ <MapFileExtensions>true</MapFileExtensions>
+ <ProductName>Love2dToAPK</ProductName>
+ <PublisherName>Jakob Stendahl</PublisherName>
+ <OpenBrowserOnPublish>false</OpenBrowserOnPublish>
+ <ApplicationRevision>8</ApplicationRevision>
+ <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
+ <UseApplicationTrust>false</UseApplicationTrust>
+ <PublishWizardCompleted>true</PublishWizardCompleted>
+ <BootstrapperEnabled>true</BootstrapperEnabled>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <PlatformTarget>AnyCPU</PlatformTarget>
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <PlatformTarget>AnyCPU</PlatformTarget>
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup>
+ <ManifestCertificateThumbprint>33720F9ED6E6BD3C41E87CC21324E9030439C780</ManifestCertificateThumbprint>
+ </PropertyGroup>
+ <PropertyGroup>
+ <ManifestKeyFile>love2dToAPK_TemporaryKey.pfx</ManifestKeyFile>
+ </PropertyGroup>
+ <PropertyGroup>
+ <GenerateManifests>true</GenerateManifests>
+ </PropertyGroup>
+ <PropertyGroup>
+ <SignManifests>true</SignManifests>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="Microsoft.WindowsAPICodePack, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+ <HintPath>..\packages\WindowsAPICodePack.1.1.0\lib\Microsoft.WindowsAPICodePack.dll</HintPath>
+ </Reference>
+ <Reference Include="Microsoft.WindowsAPICodePack.ExtendedLinguisticServices, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+ <HintPath>..\packages\WindowsAPICodePack.1.1.0\lib\Microsoft.WindowsAPICodePack.ExtendedLinguisticServices.dll</HintPath>
+ </Reference>
+ <Reference Include="Microsoft.WindowsAPICodePack.Sensors, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+ <HintPath>..\packages\WindowsAPICodePack.1.1.0\lib\Microsoft.WindowsAPICodePack.Sensors.dll</HintPath>
+ </Reference>
+ <Reference Include="Microsoft.WindowsAPICodePack.Shell, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+ <HintPath>..\packages\WindowsAPICodePack.1.1.0\lib\Microsoft.WindowsAPICodePack.Shell.dll</HintPath>
+ </Reference>
+ <Reference Include="Microsoft.WindowsAPICodePack.ShellExtensions, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+ <HintPath>..\packages\WindowsAPICodePack.1.1.0\lib\Microsoft.WindowsAPICodePack.ShellExtensions.dll</HintPath>
+ </Reference>
+ <Reference Include="System" />
+ <Reference Include="System.Core" />
+ <Reference Include="System.IO.Compression.FileSystem" />
+ <Reference Include="System.Xml.Linq" />
+ <Reference Include="System.Data.DataSetExtensions" />
+ <Reference Include="Microsoft.CSharp" />
+ <Reference Include="System.Data" />
+ <Reference Include="System.Deployment" />
+ <Reference Include="System.Drawing" />
+ <Reference Include="System.Net.Http" />
+ <Reference Include="System.Windows.Forms" />
+ <Reference Include="System.Xml" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="adb.cs" />
+ <Compile Include="compiler.cs" />
+ <Compile Include="Controls\minimalButton.cs">
+ <SubType>Component</SubType>
+ </Compile>
+ <Compile Include="Controls\minimalButton.Designer.cs">
+ <DependentUpon>minimalButton.cs</DependentUpon>
+ </Compile>
+ <Compile Include="Forms\baseForm.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="Forms\baseForm.Designer.cs">
+ <DependentUpon>baseForm.cs</DependentUpon>
+ </Compile>
+ <Compile Include="Forms\frmFirstStartup.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="Forms\frmFirstStartup.Designer.cs">
+ <DependentUpon>frmFirstStartup.cs</DependentUpon>
+ </Compile>
+ <Compile Include="Forms\frmMain.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="Forms\frmMain.Designer.cs">
+ <DependentUpon>frmMain.cs</DependentUpon>
+ </Compile>
+ <Compile Include="Forms\frmOutput.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="Forms\frmOutput.Designer.cs">
+ <DependentUpon>frmOutput.cs</DependentUpon>
+ </Compile>
+ <Compile Include="Forms\frmSettings.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="Forms\frmSettings.Designer.cs">
+ <DependentUpon>frmSettings.cs</DependentUpon>
+ </Compile>
+ <Compile Include="Program.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs" />
+ <Compile Include="Settings.cs" />
+ <EmbeddedResource Include="Forms\baseForm.resx">
+ <DependentUpon>baseForm.cs</DependentUpon>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Forms\frmFirstStartup.resx">
+ <DependentUpon>frmFirstStartup.cs</DependentUpon>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Forms\frmMain.resx">
+ <DependentUpon>frmMain.cs</DependentUpon>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Forms\frmOutput.resx">
+ <DependentUpon>frmOutput.cs</DependentUpon>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Forms\frmSettings.resx">
+ <DependentUpon>frmSettings.cs</DependentUpon>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Properties\Resources.resx">
+ <Generator>ResXFileCodeGenerator</Generator>
+ <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+ <SubType>Designer</SubType>
+ </EmbeddedResource>
+ <Compile Include="Properties\Resources.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DependentUpon>Resources.resx</DependentUpon>
+ <DesignTime>True</DesignTime>
+ </Compile>
+ <None Include="love2dToAPK_TemporaryKey.pfx" />
+ <None Include="packages.config" />
+ <None Include="Properties\Settings.settings">
+ <Generator>SettingsSingleFileGenerator</Generator>
+ <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+ </None>
+ <Compile Include="Properties\Settings.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DependentUpon>Settings.settings</DependentUpon>
+ <DesignTimeSharedInput>True</DesignTimeSharedInput>
+ </Compile>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="App.config" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="Resources\ready.png" />
+ </ItemGroup>
+ <ItemGroup>
+ <BootstrapperPackage Include=".NETFramework,Version=v4.6.1">
+ <Visible>False</Visible>
+ <ProductName>Microsoft .NET Framework 4.6.1 %28x86 and x64%29</ProductName>
+ <Install>true</Install>
+ </BootstrapperPackage>
+ <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
+ <Visible>False</Visible>
+ <ProductName>.NET Framework 3.5 SP1</ProductName>
+ <Install>false</Install>
+ </BootstrapperPackage>
+ </ItemGroup>
+ <ItemGroup />
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project> \ No newline at end of file
diff --git a/love2dToAPK/packages.config b/love2dToAPK/packages.config
new file mode 100644
index 0000000..3b2587d
--- /dev/null
+++ b/love2dToAPK/packages.config
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+ <package id="WindowsAPICodePack" version="1.1.0" targetFramework="net461" />
+</packages> \ No newline at end of file
diff --git a/love2dToAPK/tools/icon.png b/love2dToAPK/tools/icon.png
new file mode 100644
index 0000000..e0567f6
--- /dev/null
+++ b/love2dToAPK/tools/icon.png
Binary files differ
diff --git a/love2dToAPK/tools/startAnt.bat b/love2dToAPK/tools/startAnt.bat
new file mode 100644
index 0000000..2613353
--- /dev/null
+++ b/love2dToAPK/tools/startAnt.bat
@@ -0,0 +1,12 @@
+@echo off
+
+setlocal
+set ANT_HOME=%~dp0\tools\ant
+set JAVA_HOME=%~dp0\tools\jdk-win
+set ANDROID_HOME=%~dp0\tools\android-win
+set PATH=%PATH%;%ANT_HOME%\bin
+
+cd tools\love-android-sdl2
+
+call ant debug
+
diff --git a/love2dToAPK/tools/tools/adb/AdbWinApi.dll b/love2dToAPK/tools/tools/adb/AdbWinApi.dll
new file mode 100644
index 0000000..7abe26c
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/AdbWinApi.dll
Binary files differ
diff --git a/love2dToAPK/tools/tools/adb/AdbWinUsbApi.dll b/love2dToAPK/tools/tools/adb/AdbWinUsbApi.dll
new file mode 100644
index 0000000..e7a6de1
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/AdbWinUsbApi.dll
Binary files differ
diff --git a/love2dToAPK/tools/tools/adb/NOTICE.txt b/love2dToAPK/tools/tools/adb/NOTICE.txt
new file mode 100644
index 0000000..a574afb
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/NOTICE.txt
@@ -0,0 +1,6260 @@
+Notices for files contained in the tools directory:
+============================================================
+Notices for file(s):
+/lib64/libtinyxml2.so
+------------------------------------------------------------
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any
+damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any
+purpose, including commercial applications, and to alter it and
+redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must
+not claim that you wrote the original software. If you use this
+software in a product, an acknowledgment in the product documentation
+would be appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and
+must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source
+distribution.
+
+============================================================
+Notices for file(s):
+/framework/antlr-runtime.jar
+------------------------------------------------------------
+[The "BSD license"]
+Copyright (c) 201 Terence Parr
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. The name of the author may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+============================================================
+Notices for file(s):
+/lib/libcompiler_rt-extras.a
+/lib64/libcompiler_rt-extras.a
+/lib64/libcompiler_rt.so
+------------------------------------------------------------
+==============================================================================
+compiler_rt License
+==============================================================================
+
+The compiler_rt library is dual licensed under both the University of Illinois
+"BSD-Like" license and the MIT license. As a user of this code you may choose
+to use it under either license. As a contributor, you agree to allow your code
+to be used under both.
+
+Full text of the relevant licenses is included below.
+
+==============================================================================
+
+University of Illinois/NCSA
+Open Source License
+
+Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT
+
+All rights reserved.
+
+Developed by:
+
+ LLVM Team
+
+ University of Illinois at Urbana-Champaign
+
+ http://llvm.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal with
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimers.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimers in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the names of the LLVM Team, University of Illinois at
+ Urbana-Champaign, nor the names of its contributors may be used to
+ endorse or promote products derived from this Software without specific
+ prior written permission.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
+SOFTWARE.
+
+==============================================================================
+
+Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+==============================================================================
+Copyrights and Licenses for Third Party Software Distributed with LLVM:
+==============================================================================
+The LLVM software contains code written by third parties. Such software will
+have its own individual LICENSE.TXT file in the directory in which it appears.
+This file will describe the copyrights, license, and restrictions which apply
+to that code.
+
+The disclaimer of warranty in the University of Illinois Open Source License
+applies to all code in the LLVM Distribution, and nothing in any of the
+other licenses gives permission to use the names of the LLVM Team or the
+University of Illinois to endorse or promote products derived from this
+Software.
+
+
+============================================================
+Notices for file(s):
+/lib/liblog.a
+/lib/liblog.so
+/lib64/liblog.a
+/lib64/liblog.so
+------------------------------------------------------------
+
+ Copyright (c) 2005-2014, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+
+============================================================
+Notices for file(s):
+/bin/v8mkpeephole
+/lib/libv8base.a
+/lib64/libv8base.a
+------------------------------------------------------------
+This license applies to all parts of V8 that are not externally
+maintained libraries. The externally maintained libraries used by V8
+are:
+
+ - PCRE test suite, located in
+ test/mjsunit/third_party/regexp-pcre/regexp-pcre.js. This is based on the
+ test suite from PCRE-7.3, which is copyrighted by the University
+ of Cambridge and Google, Inc. The copyright notice and license
+ are embedded in regexp-pcre.js.
+
+ - Layout tests, located in test/mjsunit/third_party/object-keys. These are
+ based on layout tests from webkit.org which are copyrighted by
+ Apple Computer, Inc. and released under a 3-clause BSD license.
+
+ - Strongtalk assembler, the basis of the files assembler-arm-inl.h,
+ assembler-arm.cc, assembler-arm.h, assembler-ia32-inl.h,
+ assembler-ia32.cc, assembler-ia32.h, assembler-x64-inl.h,
+ assembler-x64.cc, assembler-x64.h, assembler-mips-inl.h,
+ assembler-mips.cc, assembler-mips.h, assembler.cc and assembler.h.
+ This code is copyrighted by Sun Microsystems Inc. and released
+ under a 3-clause BSD license.
+
+ - Valgrind client API header, located at third_party/valgrind/valgrind.h
+ This is release under the BSD license.
+
+These libraries have their own licenses; we recommend you read them,
+as their terms may differ from the terms below.
+
+Further license information can be found in LICENSE files located in
+sub-directories.
+
+Copyright 2014, the V8 project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+========================================================================
+
+fdlibm
+
+Copyright (C) 1993-2004 by Sun Microsystems, Inc. All rights reserved.
+
+Developed at SunSoft, a Sun Microsystems, Inc. business.
+Permission to use, copy, modify, and distribute this
+software is freely granted, provided that this notice
+is preserved.
+
+========================================================================
+
+Strongtalk
+
+Copyright (c) 1994-2006 Sun Microsystems Inc.
+All Rights Reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+- Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+
+- Redistribution in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+- Neither the name of Sun Microsystems or the names of contributors may
+be used to endorse or promote products derived from this software without
+specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+The original source code covered by the above license above has been
+modified significantly by Google Inc.
+Copyright 2006-2008 the V8 project authors. All rights reserved.
+
+========================================================================
+
+valgrind
+
+----------------------------------------------------------------
+
+Notice that the following BSD-style license applies to this one
+file (valgrind.h) only. The rest of Valgrind is licensed under the
+terms of the GNU General Public License, version 2, unless
+otherwise indicated. See the COPYING file in the source
+distribution for details.
+
+----------------------------------------------------------------
+
+This file is part of Valgrind, a dynamic binary instrumentation
+framework.
+
+Copyright (C) 2000-2007 Julian Seward. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. The origin of this software must not be misrepresented; you must
+ not claim that you wrote the original software. If you use this
+ software in a product, an acknowledgment in the product
+ documentation would be appreciated but is not required.
+
+3. Altered source versions must be plainly marked as such, and must
+ not be misrepresented as being the original software.
+
+4. The name of the author may not be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+============================================================
+Notices for file(s):
+/framework/org-netbeans-api-visual.jar
+/framework/org-openide-util.jar
+------------------------------------------------------------
+The GNU General Public License (GPL) Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+
+59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away
+your freedom to share and change it. By contrast, the GNU
+General Public License is intended to guarantee your freedom
+to share and change free software--to make sure the software
+is free for all its users. This General Public License
+applies to most of the Free Software Foundation's software
+and to any other program whose authors commit to using it.
+(Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can
+apply it to your programs, too. When we speak of free
+software, we are referring to freedom, not price. Our
+General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and
+charge for this service if you wish), that you receive
+source code or can get it if you want it, that you can
+change the software or use pieces of it in new free
+programs; and that you know you can do these things. To
+protect your rights, we need to make restrictions that
+forbid anyone to deny you these rights or to ask you to
+surrender the rights. These restrictions translate to
+certain responsibilities for you if you distribute copies of
+the software, or if you modify it.
+
+For example, if you distribute copies of such a program,
+whether gratis or for a fee, you must give the recipients
+all the rights that you have. You must make sure that they,
+too, receive or can get the source code. And you must show
+them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the
+software, and (2) offer you this license which gives you
+legal permission to copy, distribute and/or modify the
+software.
+
+Also, for each author's protection and ours, we want to make
+certain that everyone understands that there is no warranty
+for this free software. If the software is modified by
+someone else and passed on, we want its recipients to know
+that what they have is not the original, so that any
+problems introduced by others will not reflect on the
+original authors' reputations.
+
+Finally, any free program is threatened constantly by
+software patents. We wish to avoid the danger that
+redistributors of a free program will individually obtain
+patent licenses, in effect making the program proprietary.
+To prevent this, we have made it clear that any patent must
+be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution
+and modification follow.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND
+MODIFICATION
+
+0. This License applies to any program or other work which
+contains a notice placed by the copyright holder saying it
+may be distributed under the terms of this General Public
+License. The "Program", below, refers to any such program or
+work, and a "work based on the Program" means either the
+Program or any derivative work under copyright law: that is
+to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into
+another language. (Hereinafter, translation is included
+without limitation in the term "modification".) Each
+licensee is addressed as "you".
+
+Activities other than copying, distribution and modification
+are not covered by this License; they are outside its scope.
+The act of running the Program is not restricted, and the
+output from the Program is covered only if its contents
+constitute a work based on the Program (independent of
+having been made by running the Program). Whether that is
+true depends on what the Program does.
+
+1. You may copy and distribute verbatim copies of the
+Program's source code as you receive it, in any medium,
+provided that you conspicuously and appropriately publish on
+each copy an appropriate copyright notice and disclaimer of
+warranty; keep intact all the notices that refer to this
+License and to the absence of any warranty; and give any
+other recipients of the Program a copy of this License along
+with the Program.
+
+You may charge a fee for the physical act of transferring a
+copy, and you may at your option offer warranty protection
+in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any
+portion of it, thus forming a work based on the Program, and
+copy and distribute such modifications or work under the
+terms of Section 1 above, provided that you also meet all of
+these conditions:
+
+a) You must cause the modified files to carry prominent
+notices stating that you changed the files and the date of
+any change.
+
+b) You must cause any work that you distribute or publish,
+that in whole or in part contains or is derived from the
+Program or any part thereof, to be licensed as a whole at no
+charge to all third parties under the terms of this License.
+
+c) If the modified program normally reads commands
+interactively when run, you must cause it, when started
+running for such interactive use in the most ordinary way,
+to print or display an announcement including an appropriate
+copyright notice and a notice that there is no warranty (or
+else, saying that you provide a warranty) and that users may
+redistribute the program under these conditions, and telling
+the user how to view a copy of this License. (Exception: if
+the Program itself is interactive but does not normally
+print such an announcement, your work based on the Program
+is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the
+Program, and can be reasonably considered independent and
+separate works in themselves, then this License, and its
+terms, do not apply to those sections when you distribute
+them as separate works. But when you distribute the same
+sections as part of a whole which is a work based on the
+Program, the distribution of the whole must be on the terms
+of this License, whose permissions for other licensees
+extend to the entire whole, and thus to each and every part
+regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights
+or contest your rights to work written entirely by you;
+rather, the intent is to exercise the right to control the
+distribution of derivative or collective works based on the
+Program. In addition, mere aggregation of another work not
+based on the Program with the Program (or with a work based
+on the Program) on a volume of a storage or distribution
+medium does not bring the other work under the scope of this
+License.
+
+3. You may copy and distribute the Program (or a work based
+on it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you
+also do one of the following:
+
+a) Accompany it with the complete corresponding
+machine-readable source code, which must be distributed
+under the terms of Sections 1 and 2 above on a medium
+customarily used for software interchange; or,
+
+b) Accompany it with a written offer, valid for at least
+three years, to give any third party, for a charge no more
+than your cost of physically performing source distribution,
+a complete machine-readable copy of the corresponding source
+code, to be distributed under the terms of Sections 1 and 2
+above on a medium customarily used for software interchange;
+or,
+
+c) Accompany it with the information you received as to the
+offer to distribute corresponding source code. (This
+alternative is allowed only for noncommercial distribution
+and only if you received the program in object code or
+executable form with such an offer, in accord with
+Subsection b above.)
+
+The source code for a work means the preferred form of the
+work for making modifications to it. For an executable work,
+complete source code means all the source code for all
+modules it contains, plus any associated interface
+definition files, plus the scripts used to control
+compilation and installation of the executable. However, as
+a special exception, the source code distributed need not
+include anything that is normally distributed (in either
+source or binary form) with the major components (compiler,
+kernel, and so on) of the operating system on which the
+executable runs, unless that component itself accompanies
+the executable. If distribution of executable or object code
+is made by offering access to copy from a designated place,
+then offering equivalent access to copy the source code from
+the same place counts as distribution of the source code,
+even though third parties are not compelled to copy the
+source along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the
+Program except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense or distribute
+the Program is void, and will automatically terminate your
+rights under this License. However, parties who have
+received copies, or rights, from you under this License will
+not have their licenses terminated so long as such parties
+remain in full compliance.
+
+5. You are not required to accept this License, since you
+have not signed it. However, nothing else grants you
+permission to modify or distribute the Program or its
+derivative works. These actions are prohibited by law if you
+do not accept this License. Therefore, by modifying or
+distributing the Program (or any work based on the Program),
+you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or
+modifying the Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based
+on the Program), the recipient automatically receives a
+license from the original licensor to copy, distribute or
+modify the Program subject to these terms and conditions.
+You may not impose any further restrictions on the
+recipients' exercise of the rights granted herein. You are
+not responsible for enforcing compliance by third parties to
+this License.
+
+7. If, as a consequence of a court judgment or allegation of
+patent infringement or for any other reason (not limited to
+patent issues), conditions are imposed on you (whether by
+court order, agreement or otherwise) that contradict the
+conditions of this License, they do not excuse you from the
+conditions of this License. If you cannot distribute so as
+to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a
+consequence you may not distribute the Program at all. For
+example, if a patent license would not permit royalty-free
+redistribution of the Program by all those who receive
+copies directly or indirectly through you, then the only way
+you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or
+unenforceable under any particular circumstance, the balance
+of the section is intended to apply and the section as a
+whole is intended to apply in other circumstances. It is not
+the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest
+validity of any such claims; this section has the sole
+purpose of protecting the integrity of the free software
+distribution system, which is implemented by public license
+practices. Many people have made generous contributions to
+the wide range of software distributed through that system
+in reliance on consistent application of that system; it is
+up to the author/donor to decide if he or she is willing to
+distribute software through any other system and a licensee
+cannot impose that choice.
+
+This section is intended to make thoroughly clear what is
+believed to be a consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is
+restricted in certain countries either by patents or by
+copyrighted interfaces, the original copyright holder who
+places the Program under this License may add an explicit
+geographical distribution limitation excluding those
+countries, so that distribution is permitted only in or
+among countries not thus excluded. In such case, this
+License incorporates the limitation as if written in the
+body of this License.
+
+9. The Free Software Foundation may publish revised and/or
+new versions of the General Public License from time to
+time. Such new versions will be similar in spirit to the
+present version, but may differ in detail to address new
+problems or concerns.
+
+Each version is given a distinguishing version number. If
+the Program specifies a version number of this License which
+applies to it and "any later version", you have the option
+of following the terms and conditions either of that version
+or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number
+of this License, you may choose any version ever published
+by the Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program into
+other free programs whose distribution conditions are
+different, write to the author to ask for permission. For
+software which is copyrighted by the Free Software
+Foundation, write to the Free Software Foundation; we
+sometimes make exceptions for this. Our decision will be
+guided by the two goals of preserving the free status of all
+derivatives of our free software and of promoting the
+sharing and reuse of software generally.
+
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS
+NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE
+COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM
+"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR
+IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE
+OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE
+DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED
+TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY
+WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED
+ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL,
+SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF
+THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT
+LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR
+LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE
+PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH
+HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the
+greatest possible use to the public, the best way to achieve
+this is to make it free software which everyone can
+redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is
+safest to attach them to the start of each source file to
+most effectively convey the exclusion of warranty; and each
+file should have at least the "copyright" line and a pointer
+to where the full notice is found.
+
+One line to give the program's name and a brief idea of what
+it does.
+
+Copyright (C) <year> <name of author>
+This program is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later
+version. This program is distributed in the hope that it
+will be useful, but WITHOUT ANY WARRANTY; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A
+PARTICULAR PURPOSE. See the GNU General Public License for
+more details. You should have received a copy of the GNU
+General Public License along with this program; if not,
+write to the Free Software Foundation, Inc., 59 Temple
+Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and
+paper mail. If the program is interactive, make it output a
+short notice like this when it starts in an interactive
+mode:
+
+Gnomovision version 69, Copyright (C) year name of author
+Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
+type `show w'. This is free software, and you are welcome to
+redistribute it under certain conditions; type `show c' for
+details. The hypothetical commands `show w' and `show c'
+should show the appropriate parts of the General Public
+License. Of course, the commands you use may be called
+something other than `show w' and `show c'; they could even
+be mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a
+programmer) or your school, if any, to sign a "copyright
+disclaimer" for the program, if necessary. Here is a sample;
+alter the names:
+
+Yoyodyne, Inc., hereby disclaims all copyright interest in
+the program `Gnomovision' (which makes passes at compilers)
+written by James Hacker.
+
+signature of Ty Coon, 1 April 1989
+Ty Coon, President of Vice
+This General Public License does not permit incorporating
+your program into proprietary programs. If your program is a
+subroutine library, you may consider it more useful to
+permit linking proprietary applications with the library. If
+this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
+"CLASSPATH" EXCEPTION TO THE GPL VERSION 2
+
+Certain source files distributed by Sun Microsystems, Inc.
+are subject to the following clarification and special
+exception to the GPL Version 2, but only where Sun has
+expressly included in the particular source file's header
+the words "Sun designates this particular file as subject
+to the "Classpath" exception as provided by Sun in the
+License file that accompanied this code."
+
+ Linking this library statically or dynamically with other
+modules is making a combined work based on this library.
+Thus, the terms and conditions of the GNU General Public
+License Version 2 cover the whole combination.
+
+ As a special exception, the copyright holders of this
+library give you permission to link this library with
+independent modules to produce an executable, regardless of
+the license terms of these independent modules, and to copy
+and distribute the resulting executable under terms of your
+choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license
+of that module. An independent module is a module which is
+not derived from or based on this library. If you modify
+this library, you may extend this exception to your version
+of the library, but you are not obligated to do so. If you
+do not wish to do so, delete this exception statement from
+your version.
+============================================================
+Notices for file(s):
+/lib/libopenjdkjvm.so
+/lib/libopenjdkjvmd.so
+/lib64/libopenjdkjvm.so
+/lib64/libopenjdkjvmd.so
+------------------------------------------------------------
+Copyright (C) 2014 The Android Open Source Project
+DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+
+This file implements interfaces from the file jvm.h. This implementation
+is licensed under the same terms as the file jvm.h. The
+copyright and license information for the file jvm.h follows.
+
+Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+
+This code is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License version 2 only, as
+published by the Free Software Foundation. Oracle designates this
+particular file as subject to the "Classpath" exception as provided
+by Oracle in the LICENSE file that accompanied this code.
+
+This code is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+version 2 for more details (a copy is included in the LICENSE file that
+accompanied this code).
+
+You should have received a copy of the GNU General Public License version
+2 along with this work; if not, write to the Free Software Foundation,
+Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+or visit www.oracle.com if you need additional information or have any
+questions.
+
+============================================================
+Notices for file(s):
+/bin/mdnsd
+/lib/libmdnssd.a
+/lib64/libmdnssd.a
+------------------------------------------------------------
+The majority of the source code in the mDNSResponder project is licensed
+under the terms of the Apache License, Version 2.0, available from:
+ <http://www.apache.org/licenses/LICENSE-2.0>
+
+To accommodate license compatibility with the widest possible range
+of client code licenses, the shared library code, which is linked
+at runtime into the same address space as the client using it, is
+licensed under the terms of the "Three-Clause BSD License".
+
+The Linux Name Service Switch code, contributed by National ICT
+Australia Ltd (NICTA) is licensed under the terms of the NICTA Public
+Software Licence (which is substantially similar to the "Three-Clause
+BSD License", with some additional language pertaining to Australian law).
+
+============================================================
+Notices for file(s):
+/bin/fsck.f2fs
+/bin/make_f2fs
+/lib/libf2fs_fmt_host.a
+/lib64/libf2fs_fmt_host.a
+/lib64/libf2fs_fmt_host_dyn.so
+------------------------------------------------------------
+The tools for F2FS are covered by GNU Public License version 2.
+Exceptionally, the following files are also covered by the GNU Lesser General
+Public License Version 2.1 as the dual licenses.
+- include/f2fs_fs.h
+- lib/libf2fs.c
+- lib/libf2fs_io.c
+- mkfs/f2fs_format.c
+- mkfs/f2fs_format_main.c
+- mkfs/f2fs_format_utils.c
+- mkfs/f2fs_format_utils.h
+
+================================================================================
+Copyright (c) 2012 Samsung Electronics Co., Ltd.
+ http://www.samsung.com/
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License version 2 as
+published by the Free Software Foundation.
+
+================================================================================
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
+================================================================================
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+============================================================
+Notices for file(s):
+/bin/fc_sort
+------------------------------------------------------------
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
+============================================================
+Notices for file(s):
+/bin/assemble_vintf
+/framework/guavalib.jar
+/framework/jarjar.jar
+/framework/jsilver.jar
+/lib64/libhidl-gen-hash.so
+/lib64/libvintf.so
+------------------------------------------------------------
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
+
+============================================================
+Notices for file(s):
+/lib64/libcap.so
+------------------------------------------------------------
+Unless otherwise *explicitly* stated, the following text describes the
+licensed conditions under which the contents of this libcap release
+may be used and distributed:
+
+-------------------------------------------------------------------------
+Redistribution and use in source and binary forms of libcap, with
+or without modification, are permitted provided that the following
+conditions are met:
+
+1. Redistributions of source code must retain any existing copyright
+ notice, and this entire permission notice in its entirety,
+ including the disclaimer of warranties.
+
+2. Redistributions in binary form must reproduce all prior and current
+ copyright notices, this list of conditions, and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+
+3. The name of any author may not be used to endorse or promote
+ products derived from this software without their specific prior
+ written permission.
+
+ALTERNATIVELY, this product may be distributed under the terms of the
+GNU General Public License (v2.0 - see below), in which case the
+provisions of the GNU GPL are required INSTEAD OF the above
+restrictions. (This clause is necessary due to a potential conflict
+between the GNU GPL and the restrictions contained in a BSD-style
+copyright.)
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
+-------------------------------------------------------------------------
+
+-------------------------
+Full text of gpl-2.0.txt:
+-------------------------
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
+
+============================================================
+Notices for file(s):
+/lib/libunwind.so
+/lib64/libunwind.so
+------------------------------------------------------------
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+============================================================
+Notices for file(s):
+/lib/libopenjdkjvmti.so
+/lib/libopenjdkjvmtid.so
+/lib64/libopenjdkjvmti.so
+/lib64/libopenjdkjvmtid.so
+------------------------------------------------------------
+Copyright (C) 2016 The Android Open Source Project
+DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+
+This file implements interfaces from the file jvmti.h. This implementation
+is licensed under the same terms as the file jvmti.h. The
+copyright and license information for the file jvmti.h follows.
+
+Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+
+This code is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License version 2 only, as
+published by the Free Software Foundation. Oracle designates this
+particular file as subject to the "Classpath" exception as provided
+by Oracle in the LICENSE file that accompanied this code.
+
+This code is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+version 2 for more details (a copy is included in the LICENSE file that
+accompanied this code).
+
+You should have received a copy of the GNU General Public License version
+2 along with this work; if not, write to the Free Software Foundation,
+Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+or visit www.oracle.com if you need additional information or have any
+questions.
+
+============================================================
+Notices for file(s):
+/framework/commons-compress-1.0.jar
+------------------------------------------------------------
+Apache Commons Compress
+Copyright 2002-2009 The Apache Software Foundation
+
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org/).
+
+Original BZip2 classes contributed by Keiron Liddle
+<keiron@aftexsw.com>, Aftex Software to the Apache Ant project
+
+Original Tar classes from contributors of the Apache Ant project
+
+Original Zip classes from contributors of the Apache Ant project
+
+Original CPIO classes contributed by Markus Kuss and the jRPM project
+(jrpm.sourceforge.net)
+
+============================================================
+Notices for file(s):
+/bin/sgdisk
+------------------------------------------------------------
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
+============================================================
+Notices for file(s):
+/bin/sqlite3
+/lib/libsqlite.so
+/lib64/libsqlite.so
+------------------------------------------------------------
+2001 September 15
+
+The author disclaims copyright to this source code. In place of
+a legal notice, here is a blessing:
+
+ May you do good and not evil.
+ May you find forgiveness for yourself and forgive others.
+ May you share freely, never taking more than you give.
+
+
+============================================================
+Notices for file(s):
+/framework/conscrypt.jar
+/lib/libconscrypt_openjdk_jni.so
+/lib/libjavacrypto.so
+/lib64/libconscrypt_openjdk_jni.so
+/lib64/libjavacrypto.so
+------------------------------------------------------------
+Copyright 2016 The Android Open Source Project
+
+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 product contains a modified portion of `Netty`, a configurable network
+stack in Java, which can be obtained at:
+
+ * LICENSE:
+ * licenses/LICENSE.netty.txt (Apache License 2.0)
+ * HOMEPAGE:
+ * http://netty.io/
+
+This product contains a modified portion of `Apache Harmony`, modular Java runtime,
+which can be obtained at:
+
+ * LICENSE:
+ * licenses/LICENSE.harmony.txt (Apache License 2.0)
+ * HOMEPAGE:
+ * https://harmony.apache.org/
+
+============================================================
+Notices for file(s):
+/lib64/libplatformprotos.so
+------------------------------------------------------------
+ =========================================================================
+ == NOTICE file corresponding to the section 4 d of ==
+ == the Apache License, Version 2.0, ==
+ == in this case for the Android-specific code. ==
+ =========================================================================
+
+Android Code
+Copyright 2005-2008 The Android Open Source Project
+
+This product includes software developed as part of
+The Android Open Source Project (http://source.android.com).
+
+ =========================================================================
+ == NOTICE file corresponding to the section 4 d of ==
+ == the Apache License, Version 2.0, ==
+ == in this case for Apache Commons code. ==
+ =========================================================================
+
+Apache Commons
+Copyright 1999-2006 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+ =========================================================================
+ == NOTICE file corresponding to the section 4 d of ==
+ == the Apache License, Version 2.0, ==
+ == in this case for Jakarta Commons Logging. ==
+ =========================================================================
+
+Jakarta Commons Logging (JCL)
+Copyright 2005,2006 The Apache Software Foundation.
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+ =========================================================================
+ == NOTICE file corresponding to the section 4 d of ==
+ == the Apache License, Version 2.0, ==
+ == in this case for the Nuance code. ==
+ =========================================================================
+
+These files are Copyright 2007 Nuance Communications, but released under
+the Apache2 License.
+
+ =========================================================================
+ == NOTICE file corresponding to the section 4 d of ==
+ == the Apache License, Version 2.0, ==
+ == in this case for the Media Codecs code. ==
+ =========================================================================
+
+Media Codecs
+These files are Copyright 1998 - 2009 PacketVideo, but released under
+the Apache2 License.
+
+ =========================================================================
+ == NOTICE file corresponding to the section 4 d of ==
+ == the Apache License, Version 2.0, ==
+ == in this case for the mDnsResponder code. ==
+ =========================================================================
+
+mDnsResponder TXTRecord
+This file is Copyright 2004 Apple Computer, Inc. but released under
+the Apache2 License.
+
+
+ =========================================================================
+ == NOTICE file corresponding to the section 4 d of ==
+ == the Apache License, Version 2.0, ==
+ == in this case for the TagSoup code. ==
+ =========================================================================
+
+This file is part of TagSoup and is Copyright 2002-2008 by John Cowan.
+
+TagSoup is licensed under the Apache License,
+Version 2.0. You may obtain a copy of this license at
+http://www.apache.org/licenses/LICENSE-2.0 . You may also have
+additional legal rights not granted by this license.
+
+TagSoup is distributed in the hope that it will be useful, but
+unless required by applicable law or agreed to in writing, TagSoup
+is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, either express or implied; not even the implied warranty
+of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ =========================================================================
+ == NOTICE file corresponding to the section 4 d of ==
+ == the Apache License, Version 2.0, ==
+ == in this case for Additional Codecs code. ==
+ =========================================================================
+
+Additional Codecs
+These files are Copyright 2003-2010 VisualOn, but released under
+the Apache2 License.
+
+ =========================================================================
+ == NOTICE file corresponding to the section 4 d of ==
+ == the Apache License, Version 2.0, ==
+ == in this case for the Audio Effects code. ==
+ =========================================================================
+
+Audio Effects
+These files are Copyright (C) 2004-2010 NXP Software and
+Copyright (C) 2010 The Android Open Source Project, but released under
+the Apache2 License.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+
+
+UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE
+
+Unicode Data Files include all data files under the directories
+http://www.unicode.org/Public/, http://www.unicode.org/reports/,
+and http://www.unicode.org/cldr/data/ . Unicode Software includes any
+source code published in the Unicode Standard or under the directories
+http://www.unicode.org/Public/, http://www.unicode.org/reports/, and
+http://www.unicode.org/cldr/data/.
+
+NOTICE TO USER: Carefully read the following legal agreement. BY
+DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA
+FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY
+ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE TERMS AND CONDITIONS OF
+THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY,
+DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE.
+
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright © 1991-2008 Unicode, Inc. All rights reserved. Distributed
+under the Terms of Use in http://www.unicode.org/copyright.html.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Unicode data files and any associated documentation (the
+"Data Files") or Unicode software and any associated documentation (the
+"Software") to deal in the Data Files or Software without restriction,
+including without limitation the rights to use, copy, modify, merge,
+publish, distribute, and/or sell copies of the Data Files or Software,
+and to permit persons to whom the Data Files or Software are furnished to
+do so, provided that (a) the above copyright notice(s) and this permission
+notice appear with all copies of the Data Files or Software, (b) both the
+above copyright notice(s) and this permission notice appear in associated
+documentation, and (c) there is clear notice in each modified Data File
+or in the Software as well as in the documentation associated with the
+Data File(s) or Software that the data or software has been modified.
+
+THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
+INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
+OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
+OR PERFORMANCE OF THE DATA FILES OR SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale, use
+or other dealings in these Data Files or Software without prior written
+authorization of the copyright holder.
+
+============================================================
+Notices for file(s):
+/bin/adb
+/lib/libdiagnose_usb.a
+/lib64/libadb.a
+/lib64/libdiagnose_usb.a
+------------------------------------------------------------
+
+ Copyright (c) 2006-2009, The Android Open Source Project
+ Copyright 2006, Brian Swetland <swetland@frotz.net>
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+------------------------------------------------------------
+libwinpthread license:
+------------------------------------------------------------
+Copyright (c) 2011 mingw-w64 project
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+
+/*
+ * Parts of this library are derived by:
+ *
+ * Posix Threads library for Microsoft Windows
+ *
+ * Use at own risk, there is no implied warranty to this code.
+ * It uses undocumented features of Microsoft Windows that can change
+ * at any time in the future.
+ *
+ * (C) 2010 Lockless Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ *
+ * * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * * Neither the name of Lockless Inc. nor the names of its contributors may be
+ * used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AN
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+============================================================
+Notices for file(s):
+/bin/llvm-rs-cc
+------------------------------------------------------------
+=========================
+NOTICE file for slang.git
+=========================
+
+ Copyright (c) 2005-2011, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+
+
+===========================================
+NOTICE file for external/clang (clang.git).
+Note: libclang*.a are statically linked.
+===========================================
+
+==============================================================================
+LLVM Release License
+==============================================================================
+University of Illinois/NCSA
+Open Source License
+
+Copyright (c) 2007-2011 University of Illinois at Urbana-Champaign.
+All rights reserved.
+
+Developed by:
+
+ LLVM Team
+
+ University of Illinois at Urbana-Champaign
+
+ http://llvm.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal with
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimers.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimers in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the names of the LLVM Team, University of Illinois at
+ Urbana-Champaign, nor the names of its contributors may be used to
+ endorse or promote products derived from this Software without specific
+ prior written permission.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
+SOFTWARE.
+
+==============================================================================
+The LLVM software contains code written by third parties. Such software will
+have its own individual LICENSE.TXT file in the directory in which it appears.
+This file will describe the copyrights, license, and restrictions which apply
+to that code.
+
+The disclaimer of warranty in the University of Illinois Open Source License
+applies to all code in the LLVM Distribution, and nothing in any of the
+other licenses gives permission to use the names of the LLVM Team or the
+University of Illinois to endorse or promote products derived from this
+Software.
+
+The following pieces of software have additional or alternate copyrights,
+licenses, and/or restrictions:
+
+Program Directory
+------- ---------
+<none yet>
+
+
+
+=========================================
+NOTICE file for external/llvm (llvm.git).
+Note: libLLVM*.a are statically linked.
+=========================================
+
+==============================================================================
+LLVM Release License
+==============================================================================
+University of Illinois/NCSA
+Open Source License
+
+Copyright (c) 2003-2011 University of Illinois at Urbana-Champaign.
+All rights reserved.
+
+Developed by:
+
+ LLVM Team
+
+ University of Illinois at Urbana-Champaign
+
+ http://llvm.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal with
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimers.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimers in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the names of the LLVM Team, University of Illinois at
+ Urbana-Champaign, nor the names of its contributors may be used to
+ endorse or promote products derived from this Software without specific
+ prior written permission.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
+SOFTWARE.
+
+==============================================================================
+Copyrights and Licenses for Third Party Software Distributed with LLVM:
+==============================================================================
+The LLVM software contains code written by third parties. Such software will
+have its own individual LICENSE.TXT file in the directory in which it appears.
+This file will describe the copyrights, license, and restrictions which apply
+to that code.
+
+The disclaimer of warranty in the University of Illinois Open Source License
+applies to all code in the LLVM Distribution, and nothing in any of the
+other licenses gives permission to use the names of the LLVM Team or the
+University of Illinois to endorse or promote products derived from this
+Software.
+
+The following pieces of software have additional or alternate copyrights,
+licenses, and/or restrictions:
+
+Program Directory
+------- ---------
+Autoconf llvm/autoconf
+ llvm/projects/ModuleMaker/autoconf
+ llvm/projects/sample/autoconf
+CellSPU backend llvm/lib/Target/CellSPU/README.txt
+Google Test llvm/utils/unittest/googletest
+OpenBSD regex llvm/lib/Support/{reg*, COPYRIGHT.regex}
+
+============================================================
+Notices for file(s):
+/bin/aapt
+/bin/aidl
+/bin/dexdump
+/bin/dx
+/framework/dx.jar
+/lib/libaapt.a
+/lib/libandroidfw.a
+/lib/libcutils.a
+/lib/libcutils.so
+/lib/libnativehelper.so
+/lib/libutils.a
+/lib64/libaapt.a
+/lib64/libandroidfw.a
+/lib64/libcutils.a
+/lib64/libcutils.so
+/lib64/libnativehelper.so
+/lib64/libutils.a
+------------------------------------------------------------
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+
+============================================================
+Notices for file(s):
+/lib/libjavacore.so
+/lib/libopenjdk.so
+/lib/libopenjdkd.so
+/lib64/libjavacore.so
+/lib64/libopenjdk.so
+/lib64/libopenjdkd.so
+------------------------------------------------------------
+ =========================================================================
+ == NOTICE file corresponding to the section 4 d of ==
+ == the Apache License, Version 2.0, ==
+ == in this case for the Android-specific code. ==
+ =========================================================================
+
+Android Code
+Copyright 2005-2008 The Android Open Source Project
+
+This product includes software developed as part of
+The Android Open Source Project (http://source.android.com).
+
+ =========================================================================
+ == NOTICE file corresponding to the section 4 d of ==
+ == the Apache License, Version 2.0, ==
+ == in this case for the Apache Harmony distribution. ==
+ =========================================================================
+
+Apache Harmony
+Copyright 2006 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+Portions of Harmony were originally developed by
+Intel Corporation and are licensed to the Apache Software
+Foundation under the "Software Grant and Corporate Contribution
+License Agreement", informally known as the "Intel Harmony CLA".
+
+
+ =========================================================================
+ == NOTICE file for the ICU License. ==
+ =========================================================================
+
+Copyright (c) 1995-2014 International Business Machines Corporation and others
+
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, and/or sell copies of the Software, and to permit persons
+to whom the Software is furnished to do so, provided that the above
+copyright notice(s) and this permission notice appear in all copies of
+the Software and that both the above copyright notice(s) and this
+permission notice appear in supporting documentation.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY
+SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale, use
+or other dealings in this Software without prior written authorization
+of the copyright holder.
+
+All trademarks and registered trademarks mentioned herein are the
+property of their respective owners.
+
+
+ =========================================================================
+ == NOTICE file for the KXML License. ==
+ =========================================================================
+
+Copyright (c) 2002,2003, Stefan Haustein, Oberhausen, Rhld., Germany
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+ =========================================================================
+ == NOTICE file for the W3C License. ==
+ =========================================================================
+
+Copyright (c) 2000 World Wide Web Consortium, (Massachusetts Institute
+of Technology, Institut National de Recherche en Informatique et en
+Automatique, Keio University). All Rights Reserved. This program is
+distributed under the W3C's Software Intellectual Property License.
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+
+ =========================================================================
+ == NOTICE file for the fdlibm License. ==
+ =========================================================================
+
+Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+
+Developed at SunSoft, a Sun Microsystems, Inc. business.
+Permission to use, copy, modify, and distribute this
+software is freely granted, provided that this notice
+is preserved.
+
+============================================================
+Notices for file(s):
+/lib/libexpat-host.so
+/lib/libexpat.a
+/lib64/libexpat-host.so
+/lib64/libexpat.a
+------------------------------------------------------------
+Copyright (c) 1998-2000 Thai Open Source Software Center Ltd and Clark Cooper
+Copyright (c) 2001-2016 Expat maintainers
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+============================================================
+Notices for file(s):
+/framework/doclava.jar
+------------------------------------------------------------
+
+ Copyright (C) 2010 Google Inc.
+
+ 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.
+
+
+======================================================================
+
+jQuery 1.2.6 - New Wave Javascript
+
+Copyright (c) 2008 John Resig (jquery.com)
+Dual licensed under the MIT (MIT-LICENSE.txt)
+and GPL (GPL-LICENSE.txt) licenses.
+
+Copyright (c) 2009 John Resig, http://jquery.com/
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+============================================================
+Notices for file(s):
+/bin/minigzip
+/lib/libz-host.so
+/lib/libz.a
+/lib64/libz-host.so
+/lib64/libz.a
+------------------------------------------------------------
+ (C) 1995-2017 Jean-loup Gailly and Mark Adler
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jean-loup Gailly Mark Adler
+ jloup@gzip.org madler@alumni.caltech.edu
+
+============================================================
+Notices for file(s):
+/bin/aprotoc
+/framework/host-libprotobuf-java-full.jar
+/framework/host-libprotobuf-java-lite.jar
+/lib64/libprotobuf-cpp-full.so
+/lib64/libprotobuf-cpp-lite.so
+/lib64/libprotoc.so
+------------------------------------------------------------
+Copyright 2008, Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Code generated by the Protocol Buffer compiler is owned by the owner
+of the input file used when generating it. This code is not
+standalone and requires a support library to be linked with it. This
+support library is itself covered by the above license.
+
+============================================================
+Notices for file(s):
+/bin/memory_replay
+/nativetest/memory_replay_tests/memory_replay_tests32
+/nativetest64/memory_replay_tests/memory_replay_tests64
+------------------------------------------------------------
+
+ Copyright (c) 2015, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+
+============================================================
+Notices for file(s):
+/bin/blk_alloc_to_base_fs
+/bin/make_ext4fs
+/bin/mkuserimg_mke2fs.sh
+/lib/libext4_utils.a
+/lib/libf2fs_dlutils_host.a
+/lib/libf2fs_ioutils_host.a
+/lib/libf2fs_utils_host.a
+/lib64/libext4_utils.a
+/lib64/libext4_utils.so
+/lib64/libf2fs_dlutils_host.a
+/lib64/libf2fs_ioutils_host.a
+/lib64/libf2fs_utils_host.a
+------------------------------------------------------------
+
+ Copyright (c) 2010, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+
+============================================================
+Notices for file(s):
+/framework/emmalib.jar
+------------------------------------------------------------
+Common Public License - v 1.0
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S
+ACCEPTANCE OF THIS AGREEMENT.
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+ a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
+ b) in the case of each subsequent Contributor:
+
+ i) changes to the Program, and
+
+ ii) additions to the Program;
+
+ where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was
+added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules
+of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
+
+"Program" means the Contributions distributed in accordance with this Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
+
+2. GRANT OF RIGHTS
+
+ a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative
+works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
+
+ b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make,
+use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the
+combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
+
+ c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the
+Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other
+entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole
+responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the
+Program, it is Recipient's responsibility to acquire that license before distributing the Program.
+
+ d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this
+Agreement.
+
+3. REQUIREMENTS
+
+A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
+
+ a) it complies with the terms and conditions of this Agreement; and
+
+ b) its license agreement:
+
+ i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement,
+and implied warranties or conditions of merchantability and fitness for a particular purpose;
+
+ ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost
+profits;
+
+ iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
+
+ iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium
+customarily used for software exchange.
+
+When the Program is made available in source code form:
+
+ a) it must be made available under this Agreement; and
+
+ b) a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained within the Program.
+
+Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the
+Contribution.
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the
+commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other
+Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify
+every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a
+third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a
+commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to
+qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate
+with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor
+then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this
+section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
+WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for
+determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to
+the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this
+Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
+
+If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any
+patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes
+patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a
+reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the
+Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and
+survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following
+manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the
+right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new
+version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under
+which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new
+version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement,
+whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
+
+This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal
+action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
+
+============================================================
+Notices for file(s):
+/lib/libgtest_host.a
+/lib/libgtest_main_host.a
+/lib64/libgtest_host.a
+/lib64/libgtest_main_host.a
+------------------------------------------------------------
+Copyright 2008, Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+============================================================
+Notices for file(s):
+/lib/libc++.so
+/lib/libc++_static.a
+/lib64/libc++.so
+/lib64/libc++_static.a
+------------------------------------------------------------
+==============================================================================
+libc++ License
+==============================================================================
+
+The libc++ library is dual licensed under both the University of Illinois
+"BSD-Like" license and the MIT license. As a user of this code you may choose
+to use it under either license. As a contributor, you agree to allow your code
+to be used under both.
+
+Full text of the relevant licenses is included below.
+
+==============================================================================
+
+University of Illinois/NCSA
+Open Source License
+
+Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT
+
+All rights reserved.
+
+Developed by:
+
+ LLVM Team
+
+ University of Illinois at Urbana-Champaign
+
+ http://llvm.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal with
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimers.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimers in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the names of the LLVM Team, University of Illinois at
+ Urbana-Champaign, nor the names of its contributors may be used to
+ endorse or promote products derived from this Software without specific
+ prior written permission.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
+SOFTWARE.
+
+==============================================================================
+
+Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+============================================================
+Notices for file(s):
+/lib64/libbz.so
+------------------------------------------------------------
+
+--------------------------------------------------------------------------
+
+This program, "bzip2", the associated library "libbzip2", and all
+documentation, are copyright (C) 1996-2010 Julian R Seward. All
+rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. The origin of this software must not be misrepresented; you must
+ not claim that you wrote the original software. If you use this
+ software in a product, an acknowledgment in the product
+ documentation would be appreciated but is not required.
+
+3. Altered source versions must be plainly marked as such, and must
+ not be misrepresented as being the original software.
+
+4. The name of the author may not be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Julian Seward, jseward@bzip.org
+bzip2/libbzip2 version 1.0.6 of 6 September 2010
+
+--------------------------------------------------------------------------
+
+============================================================
+Notices for file(s):
+/lib/libpcre2.a
+/lib64/libpcre2.a
+/lib64/libpcre2.so
+------------------------------------------------------------
+PCRE LICENCE
+------------
+
+PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+Release 8 of PCRE is distributed under the terms of the "BSD" licence, as
+specified below. The documentation for PCRE, supplied in the "doc"
+directory, is distributed under the same terms as the software itself.
+
+The basic library functions are written in C and are freestanding. Also
+included in the distribution is a set of C++ wrapper functions, and a
+just-in-time compiler that can be used to optimize pattern matching. These
+are both optional features that can be omitted when the library is built.
+
+
+THE BASIC LIBRARY FUNCTIONS
+---------------------------
+
+Written by: Philip Hazel
+Email local part: ph10
+Email domain: cam.ac.uk
+
+University of Cambridge Computing Service,
+Cambridge, England.
+
+Copyright (c) 1997-2014 University of Cambridge
+All rights reserved.
+
+
+PCRE JUST-IN-TIME COMPILATION SUPPORT
+-------------------------------------
+
+Written by: Zoltan Herczeg
+Email local part: hzmester
+Emain domain: freemail.hu
+
+Copyright(c) 2010-2014 Zoltan Herczeg
+All rights reserved.
+
+
+STACK-LESS JUST-IN-TIME COMPILER
+--------------------------------
+
+Written by: Zoltan Herczeg
+Email local part: hzmester
+Emain domain: freemail.hu
+
+Copyright(c) 2009-2014 Zoltan Herczeg
+All rights reserved.
+
+
+THE C++ WRAPPER FUNCTIONS
+-------------------------
+
+Contributed by: Google Inc.
+
+Copyright (c) 2007-2012, Google Inc.
+All rights reserved.
+
+
+THE "BSD" LICENCE
+-----------------
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the name of Google
+ Inc. nor the names of their contributors may be used to endorse or
+ promote products derived from this software without specific prior
+ written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+End
+
+============================================================
+Notices for file(s):
+/lib64/libtinyalsa.so
+------------------------------------------------------------
+Copyright 2011, The Android Open Source Project
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of The Android Open Source Project nor the names of
+ its contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY The Android Open Source Project ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL The Android Open Source Project BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
+
+
+============================================================
+Notices for file(s):
+/lib/liblz4.so
+/lib64/liblz4.so
+------------------------------------------------------------
+LZ4 Library
+Copyright (c) 2011-2016, Yann Collet
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice, this
+ list of conditions and the following disclaimer in the documentation and/or
+ other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+============================================================
+Notices for file(s):
+/usr/share/zoneinfo/tzdata
+------------------------------------------------------------
+With a few exceptions, all files in the tz code and data (including
+this one) are in the public domain. The exceptions are date.c,
+newstrftime.3, and strftime.c, which contain material derived from BSD
+and which use the BSD 3-clause license.
+
+============================================================
+Notices for file(s):
+/framework/bouncycastle.jar
+------------------------------------------------------------
+Copyright (c) 2000-2015 The Legion of the Bouncy Castle Inc. (http://www.bouncycastle.org)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+associated documentation files (the "Software"), to deal in the Software without restriction,
+including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial
+portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
+LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+============================================================
+Notices for file(s):
+/lib/libcrypto-host.so
+/lib/libcrypto.a
+/lib/libssl-host.so
+/lib64/libcrypto-host.so
+/lib64/libcrypto.a
+/lib64/libssl-host.so
+------------------------------------------------------------
+
+ LICENSE ISSUES
+ ==============
+
+ The OpenSSL toolkit stays under a dual license, i.e. both the conditions of
+ the OpenSSL License and the original SSLeay license apply to the toolkit.
+ See below for the actual license texts. Actually both licenses are BSD-style
+ Open Source licenses. In case of any license issues related to OpenSSL
+ please contact openssl-core@openssl.org.
+
+ OpenSSL License
+ ---------------
+
+/* ====================================================================
+ * Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ * software must display the following acknowledgment:
+ * "This product includes software developed by the OpenSSL Project
+ * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
+ *
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * openssl-core@openssl.org.
+ *
+ * 5. Products derived from this software may not be called "OpenSSL"
+ * nor may "OpenSSL" appear in their names without prior written
+ * permission of the OpenSSL Project.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ * "This product includes software developed by the OpenSSL Project
+ * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This product includes cryptographic software written by Eric Young
+ * (eay@cryptsoft.com). This product includes software written by Tim
+ * Hudson (tjh@cryptsoft.com).
+ *
+ */
+
+ Original SSLeay License
+ -----------------------
+
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ *
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to. The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code. The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ *
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * "This product includes cryptographic software written by
+ * Eric Young (eay@cryptsoft.com)"
+ * The word 'cryptographic' can be left out if the rouines from the library
+ * being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from
+ * the apps directory (application code) you must include an acknowledgement:
+ * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed. i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+
+
+============================================================
+Notices for file(s):
+/lib/libusb.a
+/lib64/libusb.a
+------------------------------------------------------------
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
+
diff --git a/love2dToAPK/tools/tools/adb/adb.exe b/love2dToAPK/tools/tools/adb/adb.exe
new file mode 100644
index 0000000..322185c
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/adb.exe
Binary files differ
diff --git a/love2dToAPK/tools/tools/adb/api/annotations.zip b/love2dToAPK/tools/tools/adb/api/annotations.zip
new file mode 100644
index 0000000..32bb74c
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/api/annotations.zip
Binary files differ
diff --git a/love2dToAPK/tools/tools/adb/api/api-versions.xml b/love2dToAPK/tools/tools/adb/api/api-versions.xml
new file mode 100644
index 0000000..fc6841e
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/api/api-versions.xml
@@ -0,0 +1,75120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<api version="2">
+ <class name="android/Manifest" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/Manifest$permission" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="ACCESS_CHECKIN_PROPERTIES"/>
+ <field name="ACCESS_COARSE_LOCATION"/>
+ <field name="ACCESS_FINE_LOCATION"/>
+ <field name="ACCESS_LOCATION_EXTRA_COMMANDS"/>
+ <field name="ACCESS_MOCK_LOCATION" removed="23"/>
+ <field name="ACCESS_NETWORK_STATE"/>
+ <field name="ACCESS_NOTIFICATION_POLICY" since="23"/>
+ <field name="ACCESS_SURFACE_FLINGER" removed="23"/>
+ <field name="ACCESS_WIFI_STATE"/>
+ <field name="ACCOUNT_MANAGER" since="5"/>
+ <field name="ADD_SYSTEM_SERVICE" removed="4"/>
+ <field name="ADD_VOICEMAIL" since="14"/>
+ <field name="ANSWER_PHONE_CALLS" since="26"/>
+ <field name="AUTHENTICATE_ACCOUNTS" since="5" removed="23"/>
+ <field name="BATTERY_STATS"/>
+ <field name="BIND_ACCESSIBILITY_SERVICE" since="16"/>
+ <field name="BIND_APPWIDGET" since="3"/>
+ <field name="BIND_AUTOFILL_SERVICE" since="26"/>
+ <field name="BIND_CARRIER_MESSAGING_SERVICE" since="22" deprecated="23"/>
+ <field name="BIND_CARRIER_SERVICES" since="23"/>
+ <field name="BIND_CHOOSER_TARGET_SERVICE" since="23"/>
+ <field name="BIND_CONDITION_PROVIDER_SERVICE" since="24"/>
+ <field name="BIND_DEVICE_ADMIN" since="8"/>
+ <field name="BIND_DREAM_SERVICE" since="21"/>
+ <field name="BIND_INCALL_SERVICE" since="23"/>
+ <field name="BIND_INPUT_METHOD" since="3"/>
+ <field name="BIND_MIDI_DEVICE_SERVICE" since="23"/>
+ <field name="BIND_NFC_SERVICE" since="19"/>
+ <field name="BIND_NOTIFICATION_LISTENER_SERVICE" since="18"/>
+ <field name="BIND_PRINT_SERVICE" since="19"/>
+ <field name="BIND_QUICK_SETTINGS_TILE" since="24"/>
+ <field name="BIND_REMOTEVIEWS" since="11"/>
+ <field name="BIND_SCREENING_SERVICE" since="24"/>
+ <field name="BIND_TELECOM_CONNECTION_SERVICE" since="23"/>
+ <field name="BIND_TEXT_SERVICE" since="14"/>
+ <field name="BIND_TV_INPUT" since="21"/>
+ <field name="BIND_VISUAL_VOICEMAIL_SERVICE" since="26"/>
+ <field name="BIND_VOICE_INTERACTION" since="21"/>
+ <field name="BIND_VPN_SERVICE" since="14"/>
+ <field name="BIND_VR_LISTENER_SERVICE" since="24"/>
+ <field name="BIND_WALLPAPER" since="8"/>
+ <field name="BLUETOOTH"/>
+ <field name="BLUETOOTH_ADMIN"/>
+ <field name="BLUETOOTH_PRIVILEGED" since="19"/>
+ <field name="BODY_SENSORS" since="20"/>
+ <field name="BRICK" removed="23"/>
+ <field name="BROADCAST_PACKAGE_REMOVED"/>
+ <field name="BROADCAST_SMS" since="2"/>
+ <field name="BROADCAST_STICKY"/>
+ <field name="BROADCAST_WAP_PUSH" since="2"/>
+ <field name="CALL_PHONE"/>
+ <field name="CALL_PRIVILEGED"/>
+ <field name="CAMERA"/>
+ <field name="CAPTURE_AUDIO_OUTPUT" since="19"/>
+ <field name="CAPTURE_SECURE_VIDEO_OUTPUT" since="19"/>
+ <field name="CAPTURE_VIDEO_OUTPUT" since="19"/>
+ <field name="CHANGE_COMPONENT_ENABLED_STATE"/>
+ <field name="CHANGE_CONFIGURATION"/>
+ <field name="CHANGE_NETWORK_STATE"/>
+ <field name="CHANGE_WIFI_MULTICAST_STATE" since="4"/>
+ <field name="CHANGE_WIFI_STATE"/>
+ <field name="CLEAR_APP_CACHE"/>
+ <field name="CLEAR_APP_USER_DATA" removed="23"/>
+ <field name="CONTROL_LOCATION_UPDATES"/>
+ <field name="DELETE_CACHE_FILES"/>
+ <field name="DELETE_PACKAGES"/>
+ <field name="DEVICE_POWER" removed="23"/>
+ <field name="DIAGNOSTIC"/>
+ <field name="DISABLE_KEYGUARD"/>
+ <field name="DUMP"/>
+ <field name="EXPAND_STATUS_BAR"/>
+ <field name="FACTORY_TEST"/>
+ <field name="FLASHLIGHT" removed="24"/>
+ <field name="FORCE_BACK" removed="23"/>
+ <field name="FOTA_UPDATE" removed="4"/>
+ <field name="GET_ACCOUNTS"/>
+ <field name="GET_ACCOUNTS_PRIVILEGED" since="23"/>
+ <field name="GET_PACKAGE_SIZE"/>
+ <field name="GET_TASKS" deprecated="21"/>
+ <field name="GET_TOP_ACTIVITY_INFO" since="18" removed="23"/>
+ <field name="GLOBAL_SEARCH" since="4"/>
+ <field name="HARDWARE_TEST" removed="23"/>
+ <field name="INJECT_EVENTS" removed="23"/>
+ <field name="INSTALL_LOCATION_PROVIDER" since="4"/>
+ <field name="INSTALL_PACKAGES"/>
+ <field name="INSTALL_SHORTCUT" since="19"/>
+ <field name="INSTANT_APP_FOREGROUND_SERVICE" since="26"/>
+ <field name="INTERNAL_SYSTEM_WINDOW" removed="23"/>
+ <field name="INTERNET"/>
+ <field name="KILL_BACKGROUND_PROCESSES" since="8"/>
+ <field name="LOCATION_HARDWARE" since="18"/>
+ <field name="MANAGE_ACCOUNTS" since="5" removed="23"/>
+ <field name="MANAGE_APP_TOKENS" removed="23"/>
+ <field name="MANAGE_DOCUMENTS" since="19"/>
+ <field name="MANAGE_OWN_CALLS" since="26"/>
+ <field name="MASTER_CLEAR"/>
+ <field name="MEDIA_CONTENT_CONTROL" since="19"/>
+ <field name="MODIFY_AUDIO_SETTINGS"/>
+ <field name="MODIFY_PHONE_STATE"/>
+ <field name="MOUNT_FORMAT_FILESYSTEMS" since="3"/>
+ <field name="MOUNT_UNMOUNT_FILESYSTEMS"/>
+ <field name="NFC" since="9"/>
+ <field name="PACKAGE_USAGE_STATS" since="23"/>
+ <field name="PERSISTENT_ACTIVITY" deprecated="16"/>
+ <field name="PROCESS_OUTGOING_CALLS"/>
+ <field name="READ_CALENDAR"/>
+ <field name="READ_CALL_LOG" since="16"/>
+ <field name="READ_CONTACTS"/>
+ <field name="READ_EXTERNAL_STORAGE" since="16"/>
+ <field name="READ_FRAME_BUFFER"/>
+ <field name="READ_HISTORY_BOOKMARKS" since="4" removed="23"/>
+ <field name="READ_INPUT_STATE" deprecated="16"/>
+ <field name="READ_LOGS"/>
+ <field name="READ_OWNER_DATA" removed="9"/>
+ <field name="READ_PHONE_NUMBERS" since="26"/>
+ <field name="READ_PHONE_STATE"/>
+ <field name="READ_PROFILE" since="14" removed="23"/>
+ <field name="READ_SMS"/>
+ <field name="READ_SOCIAL_STREAM" since="15" deprecated="21" removed="23"/>
+ <field name="READ_SYNC_SETTINGS"/>
+ <field name="READ_SYNC_STATS"/>
+ <field name="READ_USER_DICTIONARY" since="16" removed="23"/>
+ <field name="READ_VOICEMAIL" since="21"/>
+ <field name="REBOOT"/>
+ <field name="RECEIVE_BOOT_COMPLETED"/>
+ <field name="RECEIVE_MMS"/>
+ <field name="RECEIVE_SMS"/>
+ <field name="RECEIVE_WAP_PUSH"/>
+ <field name="RECORD_AUDIO"/>
+ <field name="REORDER_TASKS"/>
+ <field name="REQUEST_COMPANION_RUN_IN_BACKGROUND" since="26"/>
+ <field name="REQUEST_COMPANION_USE_DATA_IN_BACKGROUND" since="26"/>
+ <field name="REQUEST_DELETE_PACKAGES" since="26"/>
+ <field name="REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" since="23"/>
+ <field name="REQUEST_INSTALL_PACKAGES" since="23"/>
+ <field name="RESTART_PACKAGES" deprecated="16"/>
+ <field name="SEND_EMBMS_INTENTS" since="27"/>
+ <field name="SEND_RESPOND_VIA_MESSAGE" since="18"/>
+ <field name="SEND_SMS"/>
+ <field name="SET_ACTIVITY_WATCHER" removed="23"/>
+ <field name="SET_ALARM" since="9"/>
+ <field name="SET_ALWAYS_FINISH"/>
+ <field name="SET_ANIMATION_SCALE"/>
+ <field name="SET_DEBUG_APP"/>
+ <field name="SET_ORIENTATION" removed="23"/>
+ <field name="SET_POINTER_SPEED" since="13" removed="23"/>
+ <field name="SET_PREFERRED_APPLICATIONS" deprecated="16"/>
+ <field name="SET_PROCESS_FOREGROUND" removed="4"/>
+ <field name="SET_PROCESS_LIMIT"/>
+ <field name="SET_TIME" since="8"/>
+ <field name="SET_TIME_ZONE"/>
+ <field name="SET_WALLPAPER"/>
+ <field name="SET_WALLPAPER_HINTS"/>
+ <field name="SIGNAL_PERSISTENT_PROCESSES"/>
+ <field name="STATUS_BAR"/>
+ <field name="SUBSCRIBED_FEEDS_READ" removed="23"/>
+ <field name="SUBSCRIBED_FEEDS_WRITE" removed="23"/>
+ <field name="SYSTEM_ALERT_WINDOW"/>
+ <field name="TRANSMIT_IR" since="19"/>
+ <field name="UNINSTALL_SHORTCUT" since="19"/>
+ <field name="UPDATE_DEVICE_STATS" since="3"/>
+ <field name="USE_CREDENTIALS" since="5" removed="23"/>
+ <field name="USE_FINGERPRINT" since="23"/>
+ <field name="USE_SIP" since="9"/>
+ <field name="VIBRATE"/>
+ <field name="WAKE_LOCK"/>
+ <field name="WRITE_APN_SETTINGS"/>
+ <field name="WRITE_CALENDAR"/>
+ <field name="WRITE_CALL_LOG" since="16"/>
+ <field name="WRITE_CONTACTS"/>
+ <field name="WRITE_EXTERNAL_STORAGE" since="4"/>
+ <field name="WRITE_GSERVICES"/>
+ <field name="WRITE_HISTORY_BOOKMARKS" since="4" removed="23"/>
+ <field name="WRITE_OWNER_DATA" removed="9"/>
+ <field name="WRITE_PROFILE" since="14" removed="23"/>
+ <field name="WRITE_SECURE_SETTINGS" since="3"/>
+ <field name="WRITE_SETTINGS"/>
+ <field name="WRITE_SMS" removed="23"/>
+ <field name="WRITE_SOCIAL_STREAM" since="15" deprecated="21" removed="23"/>
+ <field name="WRITE_SYNC_SETTINGS"/>
+ <field name="WRITE_USER_DICTIONARY" since="16" removed="23"/>
+ <field name="WRITE_VOICEMAIL" since="21"/>
+ </class>
+ <class name="android/Manifest$permission_group" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="ACCESSIBILITY_FEATURES" since="18" removed="23"/>
+ <field name="ACCOUNTS" removed="23"/>
+ <field name="AFFECTS_BATTERY" since="17" removed="23"/>
+ <field name="APP_INFO" since="17" removed="23"/>
+ <field name="AUDIO_SETTINGS" since="17" removed="23"/>
+ <field name="BLUETOOTH_NETWORK" since="17" removed="23"/>
+ <field name="BOOKMARKS" since="17" removed="23"/>
+ <field name="CALENDAR" since="17"/>
+ <field name="CAMERA" since="17"/>
+ <field name="CONTACTS" since="23"/>
+ <field name="COST_MONEY" removed="23"/>
+ <field name="DEVELOPMENT_TOOLS" removed="23"/>
+ <field name="DEVICE_ALARMS" since="17" removed="23"/>
+ <field name="DISPLAY" since="17" removed="23"/>
+ <field name="HARDWARE_CONTROLS" removed="23"/>
+ <field name="LOCATION"/>
+ <field name="MESSAGES" removed="23"/>
+ <field name="MICROPHONE" since="17"/>
+ <field name="NETWORK" removed="23"/>
+ <field name="PERSONAL_INFO" removed="23"/>
+ <field name="PHONE" since="23"/>
+ <field name="PHONE_CALLS" removed="23"/>
+ <field name="SCREENLOCK" since="17" removed="23"/>
+ <field name="SENSORS" since="23"/>
+ <field name="SMS" since="23"/>
+ <field name="SOCIAL_INFO" since="17" removed="23"/>
+ <field name="STATUS_BAR" since="17" removed="23"/>
+ <field name="STORAGE" since="4"/>
+ <field name="SYNC_SETTINGS" since="17" removed="23"/>
+ <field name="SYSTEM_CLOCK" since="17" removed="23"/>
+ <field name="SYSTEM_TOOLS" removed="23"/>
+ <field name="USER_DICTIONARY" since="17" removed="23"/>
+ <field name="VOICEMAIL" since="17" removed="23"/>
+ <field name="WALLPAPER" since="17" removed="23"/>
+ <field name="WRITE_USER_DICTIONARY" since="17" removed="23"/>
+ </class>
+ <class name="android/R" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/R$anim" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="accelerate_decelerate_interpolator"/>
+ <field name="accelerate_interpolator"/>
+ <field name="anticipate_interpolator" since="4"/>
+ <field name="anticipate_overshoot_interpolator" since="4"/>
+ <field name="bounce_interpolator" since="4"/>
+ <field name="cycle_interpolator" since="8"/>
+ <field name="decelerate_interpolator"/>
+ <field name="fade_in"/>
+ <field name="fade_out"/>
+ <field name="linear_interpolator" since="4"/>
+ <field name="overshoot_interpolator" since="4"/>
+ <field name="slide_in_left"/>
+ <field name="slide_out_right"/>
+ </class>
+ <class name="android/R$animator" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="fade_in"/>
+ <field name="fade_out"/>
+ </class>
+ <class name="android/R$array" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="emailAddressTypes"/>
+ <field name="imProtocols"/>
+ <field name="organizationTypes"/>
+ <field name="phoneTypes"/>
+ <field name="postalAddressTypes"/>
+ </class>
+ <class name="android/R$attr" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="absListViewStyle"/>
+ <field name="accessibilityEventTypes" since="14"/>
+ <field name="accessibilityFeedbackType" since="14"/>
+ <field name="accessibilityFlags" since="14"/>
+ <field name="accessibilityLiveRegion" since="19"/>
+ <field name="accessibilityTraversalAfter" since="22"/>
+ <field name="accessibilityTraversalBefore" since="22"/>
+ <field name="accountPreferences" since="5"/>
+ <field name="accountType" since="5"/>
+ <field name="action"/>
+ <field name="actionBarDivider" since="14"/>
+ <field name="actionBarItemBackground" since="14"/>
+ <field name="actionBarPopupTheme" since="21"/>
+ <field name="actionBarSize" since="11"/>
+ <field name="actionBarSplitStyle" since="14"/>
+ <field name="actionBarStyle" since="11"/>
+ <field name="actionBarTabBarStyle" since="11"/>
+ <field name="actionBarTabStyle" since="11"/>
+ <field name="actionBarTabTextStyle" since="11"/>
+ <field name="actionBarTheme" since="21"/>
+ <field name="actionBarWidgetTheme" since="14"/>
+ <field name="actionButtonStyle" since="11"/>
+ <field name="actionDropDownStyle" since="11"/>
+ <field name="actionLayout" since="11"/>
+ <field name="actionMenuTextAppearance" since="11"/>
+ <field name="actionMenuTextColor" since="11"/>
+ <field name="actionModeBackground" since="11"/>
+ <field name="actionModeCloseButtonStyle" since="11"/>
+ <field name="actionModeCloseDrawable" since="11"/>
+ <field name="actionModeCopyDrawable" since="11"/>
+ <field name="actionModeCutDrawable" since="11"/>
+ <field name="actionModeFindDrawable" since="21"/>
+ <field name="actionModePasteDrawable" since="11"/>
+ <field name="actionModeSelectAllDrawable" since="14"/>
+ <field name="actionModeShareDrawable" since="21"/>
+ <field name="actionModeSplitBackground" since="14"/>
+ <field name="actionModeStyle" since="14"/>
+ <field name="actionModeWebSearchDrawable" since="21"/>
+ <field name="actionOverflowButtonStyle" since="11"/>
+ <field name="actionOverflowMenuStyle" since="21"/>
+ <field name="actionProviderClass" since="14"/>
+ <field name="actionViewClass" since="11"/>
+ <field name="activatedBackgroundIndicator" since="11"/>
+ <field name="activityCloseEnterAnimation"/>
+ <field name="activityCloseExitAnimation"/>
+ <field name="activityOpenEnterAnimation"/>
+ <field name="activityOpenExitAnimation"/>
+ <field name="addPrintersActivity" since="19"/>
+ <field name="addStatesFromChildren"/>
+ <field name="adjustViewBounds"/>
+ <field name="advancedPrintOptionsActivity" since="19"/>
+ <field name="alertDialogIcon" since="11"/>
+ <field name="alertDialogStyle"/>
+ <field name="alertDialogTheme" since="11"/>
+ <field name="alignmentMode" since="14"/>
+ <field name="allContactsName" since="11"/>
+ <field name="allowBackup" since="4"/>
+ <field name="allowClearUserData"/>
+ <field name="allowEmbedded" since="20"/>
+ <field name="allowParallelSyncs" since="11"/>
+ <field name="allowSingleTap" since="3"/>
+ <field name="allowTaskReparenting"/>
+ <field name="allowUndo" since="23"/>
+ <field name="alpha" since="11"/>
+ <field name="alphabeticModifiers" since="26"/>
+ <field name="alphabeticShortcut"/>
+ <field name="alwaysDrawnWithCache"/>
+ <field name="alwaysRetainTaskState"/>
+ <field name="amPmBackgroundColor" since="21" deprecated="23"/>
+ <field name="amPmTextColor" since="21" deprecated="23"/>
+ <field name="ambientShadowAlpha" since="21"/>
+ <field name="angle"/>
+ <field name="animateFirstView" since="11"/>
+ <field name="animateLayoutChanges" since="11"/>
+ <field name="animateOnClick" since="3"/>
+ <field name="animation"/>
+ <field name="animationCache"/>
+ <field name="animationDuration"/>
+ <field name="animationOrder"/>
+ <field name="animationResolution" since="11" deprecated="16"/>
+ <field name="antialias"/>
+ <field name="anyDensity" since="4"/>
+ <field name="apduServiceBanner" since="19"/>
+ <field name="apiKey"/>
+ <field name="appCategory" since="26"/>
+ <field name="author" since="7"/>
+ <field name="authorities"/>
+ <field name="autoAdvanceViewId" since="11"/>
+ <field name="autoCompleteTextViewStyle"/>
+ <field name="autoLink"/>
+ <field name="autoMirrored" since="19"/>
+ <field name="autoRemoveFromRecents" since="21"/>
+ <field name="autoSizeMaxTextSize" since="26"/>
+ <field name="autoSizeMinTextSize" since="26"/>
+ <field name="autoSizePresetSizes" since="26"/>
+ <field name="autoSizeStepGranularity" since="26"/>
+ <field name="autoSizeTextType" since="26"/>
+ <field name="autoStart" since="7"/>
+ <field name="autoText" deprecated="16"/>
+ <field name="autoUrlDetect" since="4"/>
+ <field name="autoVerify" since="23"/>
+ <field name="autofillHints" since="26"/>
+ <field name="autofilledHighlight" since="26"/>
+ <field name="background"/>
+ <field name="backgroundDimAmount"/>
+ <field name="backgroundDimEnabled" since="3"/>
+ <field name="backgroundSplit" since="14"/>
+ <field name="backgroundStacked" since="14"/>
+ <field name="backgroundTint" since="21"/>
+ <field name="backgroundTintMode" since="21"/>
+ <field name="backupAgent" since="4"/>
+ <field name="backupInForeground" since="24"/>
+ <field name="banner" since="21"/>
+ <field name="baseline" since="11"/>
+ <field name="baselineAlignBottom"/>
+ <field name="baselineAligned"/>
+ <field name="baselineAlignedChildIndex"/>
+ <field name="bitmap" since="24"/>
+ <field name="borderlessButtonStyle" since="11"/>
+ <field name="bottom"/>
+ <field name="bottomBright"/>
+ <field name="bottomDark"/>
+ <field name="bottomLeftRadius"/>
+ <field name="bottomMedium"/>
+ <field name="bottomOffset" since="3"/>
+ <field name="bottomRightRadius"/>
+ <field name="breadCrumbShortTitle" since="11"/>
+ <field name="breadCrumbTitle" since="11"/>
+ <field name="breakStrategy" since="23"/>
+ <field name="bufferType"/>
+ <field name="button"/>
+ <field name="buttonBarButtonStyle" since="11"/>
+ <field name="buttonBarNegativeButtonStyle" since="21"/>
+ <field name="buttonBarNeutralButtonStyle" since="21"/>
+ <field name="buttonBarPositiveButtonStyle" since="21"/>
+ <field name="buttonBarStyle" since="11"/>
+ <field name="buttonGravity" since="24"/>
+ <field name="buttonStyle"/>
+ <field name="buttonStyleInset"/>
+ <field name="buttonStyleSmall"/>
+ <field name="buttonStyleToggle"/>
+ <field name="buttonTint" since="21"/>
+ <field name="buttonTintMode" since="21"/>
+ <field name="cacheColorHint"/>
+ <field name="calendarTextColor" since="21"/>
+ <field name="calendarViewShown" since="11"/>
+ <field name="calendarViewStyle" since="11"/>
+ <field name="canControlMagnification" since="24"/>
+ <field name="canPerformGestures" since="24"/>
+ <field name="canRecord" since="24"/>
+ <field name="canRequestEnhancedWebAccessibility" since="18" deprecated="26"/>
+ <field name="canRequestFilterKeyEvents" since="18"/>
+ <field name="canRequestFingerprintGestures" since="26"/>
+ <field name="canRequestTouchExplorationMode" since="18"/>
+ <field name="canRetrieveWindowContent" since="14"/>
+ <field name="candidatesTextStyleSpans" since="3"/>
+ <field name="capitalize" deprecated="16"/>
+ <field name="category" since="19"/>
+ <field name="centerBright"/>
+ <field name="centerColor"/>
+ <field name="centerDark"/>
+ <field name="centerMedium"/>
+ <field name="centerX"/>
+ <field name="centerY"/>
+ <field name="certDigest" since="26"/>
+ <field name="checkBoxPreferenceStyle"/>
+ <field name="checkMark"/>
+ <field name="checkMarkTint" since="21"/>
+ <field name="checkMarkTintMode" since="21"/>
+ <field name="checkable"/>
+ <field name="checkableBehavior"/>
+ <field name="checkboxStyle"/>
+ <field name="checked"/>
+ <field name="checkedButton"/>
+ <field name="checkedTextViewStyle" since="17"/>
+ <field name="childDivider"/>
+ <field name="childIndicator"/>
+ <field name="childIndicatorEnd" since="18"/>
+ <field name="childIndicatorLeft"/>
+ <field name="childIndicatorRight"/>
+ <field name="childIndicatorStart" since="18"/>
+ <field name="choiceMode"/>
+ <field name="clearTaskOnLaunch"/>
+ <field name="clickable"/>
+ <field name="clipChildren"/>
+ <field name="clipOrientation"/>
+ <field name="clipToPadding"/>
+ <field name="closeIcon" since="21"/>
+ <field name="codes" since="3"/>
+ <field name="collapseColumns"/>
+ <field name="collapseContentDescription" since="22"/>
+ <field name="collapseIcon" since="24"/>
+ <field name="color"/>
+ <field name="colorAccent" since="21"/>
+ <field name="colorActivatedHighlight" since="14"/>
+ <field name="colorBackground"/>
+ <field name="colorBackgroundCacheHint" since="5"/>
+ <field name="colorBackgroundFloating" since="23"/>
+ <field name="colorButtonNormal" since="21"/>
+ <field name="colorControlActivated" since="21"/>
+ <field name="colorControlHighlight" since="21"/>
+ <field name="colorControlNormal" since="21"/>
+ <field name="colorEdgeEffect" since="21"/>
+ <field name="colorError" since="26"/>
+ <field name="colorFocusedHighlight" since="14"/>
+ <field name="colorForeground"/>
+ <field name="colorForegroundInverse"/>
+ <field name="colorLongPressedHighlight" since="14"/>
+ <field name="colorMode" since="26"/>
+ <field name="colorMultiSelectHighlight" since="14"/>
+ <field name="colorPressedHighlight" since="14"/>
+ <field name="colorPrimary" since="21"/>
+ <field name="colorPrimaryDark" since="21"/>
+ <field name="colorSecondary" since="25"/>
+ <field name="columnCount" since="14"/>
+ <field name="columnDelay"/>
+ <field name="columnOrderPreserved" since="14"/>
+ <field name="columnWidth"/>
+ <field name="commitIcon" since="21"/>
+ <field name="compatibleWidthLimitDp" since="13"/>
+ <field name="completionHint"/>
+ <field name="completionHintView"/>
+ <field name="completionThreshold"/>
+ <field name="configChanges"/>
+ <field name="configure" since="3"/>
+ <field name="constantSize"/>
+ <field name="content" since="3"/>
+ <field name="contentAgeHint" since="21"/>
+ <field name="contentAuthority" since="5"/>
+ <field name="contentDescription" since="4"/>
+ <field name="contentInsetEnd" since="21"/>
+ <field name="contentInsetEndWithActions" since="24"/>
+ <field name="contentInsetLeft" since="21"/>
+ <field name="contentInsetRight" since="21"/>
+ <field name="contentInsetStart" since="21"/>
+ <field name="contentInsetStartWithNavigation" since="24"/>
+ <field name="contextClickable" since="23"/>
+ <field name="contextDescription" since="25"/>
+ <field name="contextPopupMenuStyle" since="24"/>
+ <field name="contextUri" since="25"/>
+ <field name="controlX1" since="21"/>
+ <field name="controlX2" since="21"/>
+ <field name="controlY1" since="21"/>
+ <field name="controlY2" since="21"/>
+ <field name="countDown" since="24"/>
+ <field name="country" since="21"/>
+ <field name="cropToPadding"/>
+ <field name="cursorVisible"/>
+ <field name="customNavigationLayout" since="11"/>
+ <field name="customTokens" since="11"/>
+ <field name="cycles"/>
+ <field name="dashGap"/>
+ <field name="dashWidth"/>
+ <field name="data"/>
+ <field name="datePickerDialogTheme" since="21"/>
+ <field name="datePickerMode" since="21"/>
+ <field name="datePickerStyle" since="11"/>
+ <field name="dateTextAppearance" since="11"/>
+ <field name="dayOfWeekBackground" since="21" deprecated="23"/>
+ <field name="dayOfWeekTextAppearance" since="21" deprecated="23"/>
+ <field name="debuggable"/>
+ <field name="defaultFocusHighlightEnabled" since="26"/>
+ <field name="defaultHeight" since="24"/>
+ <field name="defaultToDeviceProtectedStorage" since="24"/>
+ <field name="defaultValue"/>
+ <field name="defaultWidth" since="24"/>
+ <field name="delay"/>
+ <field name="dependency"/>
+ <field name="descendantFocusability"/>
+ <field name="description"/>
+ <field name="detachWallpaper" since="5"/>
+ <field name="detailColumn" since="5"/>
+ <field name="detailSocialSummary" since="5"/>
+ <field name="detailsElementBackground" since="11"/>
+ <field name="dial"/>
+ <field name="dialogIcon"/>
+ <field name="dialogLayout"/>
+ <field name="dialogMessage"/>
+ <field name="dialogPreferenceStyle"/>
+ <field name="dialogPreferredPadding" since="22"/>
+ <field name="dialogTheme" since="11"/>
+ <field name="dialogTitle"/>
+ <field name="digits"/>
+ <field name="directBootAware" since="24"/>
+ <field name="direction"/>
+ <field name="directionDescriptions" since="14" deprecated="23"/>
+ <field name="directionPriority"/>
+ <field name="disableDependentsState"/>
+ <field name="disabledAlpha"/>
+ <field name="displayOptions" since="11"/>
+ <field name="dither"/>
+ <field name="divider"/>
+ <field name="dividerHeight"/>
+ <field name="dividerHorizontal" since="11"/>
+ <field name="dividerPadding" since="11"/>
+ <field name="dividerVertical" since="11"/>
+ <field name="documentLaunchMode" since="21"/>
+ <field name="drawSelectorOnTop"/>
+ <field name="drawable"/>
+ <field name="drawableBottom"/>
+ <field name="drawableEnd" since="14"/>
+ <field name="drawableLeft"/>
+ <field name="drawablePadding"/>
+ <field name="drawableRight"/>
+ <field name="drawableStart" since="14"/>
+ <field name="drawableTint" since="23"/>
+ <field name="drawableTintMode" since="23"/>
+ <field name="drawableTop"/>
+ <field name="drawingCacheQuality"/>
+ <field name="dropDownAnchor" since="3"/>
+ <field name="dropDownHeight" since="4"/>
+ <field name="dropDownHintAppearance"/>
+ <field name="dropDownHorizontalOffset" since="5"/>
+ <field name="dropDownItemStyle"/>
+ <field name="dropDownListViewStyle"/>
+ <field name="dropDownSelector"/>
+ <field name="dropDownSpinnerStyle" since="11"/>
+ <field name="dropDownVerticalOffset" since="5"/>
+ <field name="dropDownWidth" since="3"/>
+ <field name="duplicateParentState"/>
+ <field name="duration"/>
+ <field name="editTextBackground" since="11"/>
+ <field name="editTextColor" since="11"/>
+ <field name="editTextPreferenceStyle"/>
+ <field name="editTextStyle"/>
+ <field name="editable" deprecated="16"/>
+ <field name="editorExtras" since="3"/>
+ <field name="elegantTextHeight" since="21"/>
+ <field name="elevation" since="21"/>
+ <field name="ellipsize"/>
+ <field name="ems"/>
+ <field name="enableVrMode" since="24"/>
+ <field name="enabled"/>
+ <field name="end" since="23"/>
+ <field name="endColor"/>
+ <field name="endX" since="24"/>
+ <field name="endY" since="24"/>
+ <field name="endYear" deprecated="16"/>
+ <field name="enterFadeDuration" since="11"/>
+ <field name="entries"/>
+ <field name="entryValues"/>
+ <field name="eventsInterceptionEnabled" since="4"/>
+ <field name="excludeClass" since="21"/>
+ <field name="excludeFromRecents"/>
+ <field name="excludeId" since="21"/>
+ <field name="excludeName" since="21"/>
+ <field name="exitFadeDuration" since="11"/>
+ <field name="expandableListPreferredChildIndicatorLeft"/>
+ <field name="expandableListPreferredChildIndicatorRight"/>
+ <field name="expandableListPreferredChildPaddingLeft"/>
+ <field name="expandableListPreferredItemIndicatorLeft"/>
+ <field name="expandableListPreferredItemIndicatorRight"/>
+ <field name="expandableListPreferredItemPaddingLeft"/>
+ <field name="expandableListViewStyle"/>
+ <field name="expandableListViewWhiteStyle" since="8"/>
+ <field name="exported"/>
+ <field name="externalService" since="24"/>
+ <field name="extraTension" since="4"/>
+ <field name="extractNativeLibs" since="23"/>
+ <field name="factor"/>
+ <field name="fadeDuration" since="4"/>
+ <field name="fadeEnabled" since="4"/>
+ <field name="fadeOffset" since="4"/>
+ <field name="fadeScrollbars" since="5"/>
+ <field name="fadingEdge"/>
+ <field name="fadingEdgeLength"/>
+ <field name="fadingMode" since="19"/>
+ <field name="fastScrollAlwaysVisible" since="11"/>
+ <field name="fastScrollEnabled" since="3"/>
+ <field name="fastScrollOverlayPosition" since="11"/>
+ <field name="fastScrollPreviewBackgroundLeft" since="11"/>
+ <field name="fastScrollPreviewBackgroundRight" since="11"/>
+ <field name="fastScrollStyle" since="21"/>
+ <field name="fastScrollTextColor" since="11"/>
+ <field name="fastScrollThumbDrawable" since="11"/>
+ <field name="fastScrollTrackDrawable" since="11"/>
+ <field name="fillAfter"/>
+ <field name="fillAlpha" since="21"/>
+ <field name="fillBefore"/>
+ <field name="fillColor" since="21"/>
+ <field name="fillEnabled" since="3"/>
+ <field name="fillType" since="24"/>
+ <field name="fillViewport"/>
+ <field name="filter"/>
+ <field name="filterTouchesWhenObscured" since="9"/>
+ <field name="fingerprintAuthDrawable" since="23"/>
+ <field name="finishOnCloseSystemDialogs" since="5"/>
+ <field name="finishOnTaskLaunch"/>
+ <field name="firstDayOfWeek" since="11"/>
+ <field name="fitsSystemWindows"/>
+ <field name="flipInterval"/>
+ <field name="focusable"/>
+ <field name="focusableInTouchMode"/>
+ <field name="focusedByDefault" since="26"/>
+ <field name="focusedMonthDateColor" since="11" deprecated="23"/>
+ <field name="font" since="26"/>
+ <field name="fontFamily" since="16"/>
+ <field name="fontFeatureSettings" since="21"/>
+ <field name="fontProviderAuthority" since="26"/>
+ <field name="fontProviderCerts" since="26"/>
+ <field name="fontProviderPackage" since="26"/>
+ <field name="fontProviderQuery" since="26"/>
+ <field name="fontStyle" since="26"/>
+ <field name="fontWeight" since="26"/>
+ <field name="footerDividersEnabled" since="3"/>
+ <field name="forceHasOverlappingRendering" since="24"/>
+ <field name="foreground"/>
+ <field name="foregroundGravity"/>
+ <field name="foregroundTint" since="21"/>
+ <field name="foregroundTintMode" since="21"/>
+ <field name="format"/>
+ <field name="format12Hour" since="17"/>
+ <field name="format24Hour" since="17"/>
+ <field name="fraction" since="23"/>
+ <field name="fragment" since="11"/>
+ <field name="fragmentAllowEnterTransitionOverlap" since="21"/>
+ <field name="fragmentAllowReturnTransitionOverlap" since="21"/>
+ <field name="fragmentCloseEnterAnimation" since="11"/>
+ <field name="fragmentCloseExitAnimation" since="11"/>
+ <field name="fragmentEnterTransition" since="21"/>
+ <field name="fragmentExitTransition" since="21"/>
+ <field name="fragmentFadeEnterAnimation" since="11"/>
+ <field name="fragmentFadeExitAnimation" since="11"/>
+ <field name="fragmentOpenEnterAnimation" since="11"/>
+ <field name="fragmentOpenExitAnimation" since="11"/>
+ <field name="fragmentReenterTransition" since="21"/>
+ <field name="fragmentReturnTransition" since="21"/>
+ <field name="fragmentSharedElementEnterTransition" since="21"/>
+ <field name="fragmentSharedElementReturnTransition" since="21"/>
+ <field name="freezesText"/>
+ <field name="fromAlpha"/>
+ <field name="fromDegrees"/>
+ <field name="fromId" since="21"/>
+ <field name="fromScene" since="19"/>
+ <field name="fromXDelta"/>
+ <field name="fromXScale"/>
+ <field name="fromYDelta"/>
+ <field name="fromYScale"/>
+ <field name="fullBackupContent" since="23"/>
+ <field name="fullBackupOnly" since="21"/>
+ <field name="fullBright"/>
+ <field name="fullDark"/>
+ <field name="functionalTest"/>
+ <field name="galleryItemBackground"/>
+ <field name="galleryStyle"/>
+ <field name="gestureColor" since="4"/>
+ <field name="gestureStrokeAngleThreshold" since="4"/>
+ <field name="gestureStrokeLengthThreshold" since="4"/>
+ <field name="gestureStrokeSquarenessThreshold" since="4"/>
+ <field name="gestureStrokeType" since="4"/>
+ <field name="gestureStrokeWidth" since="4"/>
+ <field name="glEsVersion" since="4"/>
+ <field name="goIcon" since="21"/>
+ <field name="gradientRadius"/>
+ <field name="grantUriPermissions"/>
+ <field name="gravity"/>
+ <field name="gridViewStyle"/>
+ <field name="groupIndicator"/>
+ <field name="hand_hour"/>
+ <field name="hand_minute"/>
+ <field name="handle" since="3"/>
+ <field name="handleProfiling"/>
+ <field name="hapticFeedbackEnabled" since="3"/>
+ <field name="hardwareAccelerated" since="11"/>
+ <field name="hasCode"/>
+ <field name="headerAmPmTextAppearance" since="21" deprecated="23"/>
+ <field name="headerBackground"/>
+ <field name="headerDayOfMonthTextAppearance" since="21" deprecated="23"/>
+ <field name="headerDividersEnabled" since="3"/>
+ <field name="headerMonthTextAppearance" since="21" deprecated="23"/>
+ <field name="headerTimeTextAppearance" since="21" deprecated="23"/>
+ <field name="headerYearTextAppearance" since="21" deprecated="23"/>
+ <field name="height"/>
+ <field name="hideOnContentScroll" since="21"/>
+ <field name="hint"/>
+ <field name="homeAsUpIndicator" since="11"/>
+ <field name="homeLayout" since="11"/>
+ <field name="horizontalDivider"/>
+ <field name="horizontalGap" since="3"/>
+ <field name="horizontalScrollViewStyle" since="11"/>
+ <field name="horizontalSpacing"/>
+ <field name="host"/>
+ <field name="hotSpotX" since="24"/>
+ <field name="hotSpotY" since="24"/>
+ <field name="hyphenationFrequency" since="23"/>
+ <field name="icon"/>
+ <field name="iconPreview" since="3"/>
+ <field name="iconSpaceReserved" since="26"/>
+ <field name="iconTint" since="26"/>
+ <field name="iconTintMode" since="26"/>
+ <field name="iconifiedByDefault" since="11"/>
+ <field name="id"/>
+ <field name="ignoreGravity"/>
+ <field name="imageButtonStyle"/>
+ <field name="imageWellStyle"/>
+ <field name="imeActionId" since="3"/>
+ <field name="imeActionLabel" since="3"/>
+ <field name="imeExtractEnterAnimation" since="3"/>
+ <field name="imeExtractExitAnimation" since="3"/>
+ <field name="imeFullscreenBackground" since="3"/>
+ <field name="imeOptions" since="3"/>
+ <field name="imeSubtypeExtraValue" since="11"/>
+ <field name="imeSubtypeLocale" since="11"/>
+ <field name="imeSubtypeMode" since="11"/>
+ <field name="immersive" since="11"/>
+ <field name="importantForAccessibility" since="16"/>
+ <field name="importantForAutofill" since="26"/>
+ <field name="inAnimation"/>
+ <field name="includeFontPadding"/>
+ <field name="includeInGlobalSearch" since="4"/>
+ <field name="indeterminate"/>
+ <field name="indeterminateBehavior"/>
+ <field name="indeterminateDrawable"/>
+ <field name="indeterminateDuration"/>
+ <field name="indeterminateOnly"/>
+ <field name="indeterminateProgressStyle" since="11"/>
+ <field name="indeterminateTint" since="21"/>
+ <field name="indeterminateTintMode" since="21"/>
+ <field name="indicatorEnd" since="18"/>
+ <field name="indicatorLeft"/>
+ <field name="indicatorRight"/>
+ <field name="indicatorStart" since="18"/>
+ <field name="inflatedId"/>
+ <field name="initOrder"/>
+ <field name="initialKeyguardLayout" since="17"/>
+ <field name="initialLayout" since="3"/>
+ <field name="innerRadius" since="3"/>
+ <field name="innerRadiusRatio"/>
+ <field name="inputMethod" deprecated="16"/>
+ <field name="inputType" since="3"/>
+ <field name="inset" since="21"/>
+ <field name="insetBottom"/>
+ <field name="insetLeft"/>
+ <field name="insetRight"/>
+ <field name="insetTop"/>
+ <field name="installLocation" since="8"/>
+ <field name="interpolator"/>
+ <field name="isAlwaysSyncable" since="11"/>
+ <field name="isAsciiCapable" since="19"/>
+ <field name="isAuxiliary" since="14"/>
+ <field name="isDefault" since="3"/>
+ <field name="isFeatureSplit" since="26"/>
+ <field name="isGame" since="21"/>
+ <field name="isIndicator"/>
+ <field name="isModifier" since="3"/>
+ <field name="isRepeatable" since="3"/>
+ <field name="isScrollContainer" since="3"/>
+ <field name="isStatic" since="26"/>
+ <field name="isSticky" since="3"/>
+ <field name="isolatedProcess" since="16"/>
+ <field name="isolatedSplits" since="26"/>
+ <field name="itemBackground"/>
+ <field name="itemIconDisabledAlpha"/>
+ <field name="itemPadding" since="11"/>
+ <field name="itemTextAppearance"/>
+ <field name="justificationMode" since="26"/>
+ <field name="keepScreenOn"/>
+ <field name="key"/>
+ <field name="keyBackground" since="3"/>
+ <field name="keyEdgeFlags" since="3"/>
+ <field name="keyHeight" since="3"/>
+ <field name="keyIcon" since="3"/>
+ <field name="keyLabel" since="3"/>
+ <field name="keyOutputText" since="3"/>
+ <field name="keyPreviewHeight" since="3"/>
+ <field name="keyPreviewLayout" since="3"/>
+ <field name="keyPreviewOffset" since="3"/>
+ <field name="keySet" since="19"/>
+ <field name="keyTextColor" since="3"/>
+ <field name="keyTextSize" since="3"/>
+ <field name="keyWidth" since="3"/>
+ <field name="keyboardLayout" since="16"/>
+ <field name="keyboardMode" since="3"/>
+ <field name="keyboardNavigationCluster" since="26"/>
+ <field name="keycode"/>
+ <field name="killAfterRestore" since="5"/>
+ <field name="label"/>
+ <field name="labelFor" since="17"/>
+ <field name="labelTextSize" since="3"/>
+ <field name="languageTag" since="24"/>
+ <field name="largeHeap" since="11"/>
+ <field name="largeScreens" since="4"/>
+ <field name="largestWidthLimitDp" since="13"/>
+ <field name="launchMode"/>
+ <field name="launchTaskBehindSourceAnimation" since="21"/>
+ <field name="launchTaskBehindTargetAnimation" since="21"/>
+ <field name="layerType" since="11"/>
+ <field name="layout"/>
+ <field name="layoutAnimation"/>
+ <field name="layoutDirection" since="17"/>
+ <field name="layoutMode" since="18"/>
+ <field name="layout_above"/>
+ <field name="layout_alignBaseline"/>
+ <field name="layout_alignBottom"/>
+ <field name="layout_alignEnd" since="17"/>
+ <field name="layout_alignLeft"/>
+ <field name="layout_alignParentBottom"/>
+ <field name="layout_alignParentEnd" since="17"/>
+ <field name="layout_alignParentLeft"/>
+ <field name="layout_alignParentRight"/>
+ <field name="layout_alignParentStart" since="17"/>
+ <field name="layout_alignParentTop"/>
+ <field name="layout_alignRight"/>
+ <field name="layout_alignStart" since="17"/>
+ <field name="layout_alignTop"/>
+ <field name="layout_alignWithParentIfMissing"/>
+ <field name="layout_below"/>
+ <field name="layout_centerHorizontal"/>
+ <field name="layout_centerInParent"/>
+ <field name="layout_centerVertical"/>
+ <field name="layout_column"/>
+ <field name="layout_columnSpan" since="14"/>
+ <field name="layout_columnWeight" since="21"/>
+ <field name="layout_gravity"/>
+ <field name="layout_height"/>
+ <field name="layout_margin"/>
+ <field name="layout_marginBottom"/>
+ <field name="layout_marginEnd" since="17"/>
+ <field name="layout_marginHorizontal" since="26"/>
+ <field name="layout_marginLeft"/>
+ <field name="layout_marginRight"/>
+ <field name="layout_marginStart" since="17"/>
+ <field name="layout_marginTop"/>
+ <field name="layout_marginVertical" since="26"/>
+ <field name="layout_row" since="14"/>
+ <field name="layout_rowSpan" since="14"/>
+ <field name="layout_rowWeight" since="21"/>
+ <field name="layout_scale"/>
+ <field name="layout_span"/>
+ <field name="layout_toEndOf" since="17"/>
+ <field name="layout_toLeftOf"/>
+ <field name="layout_toRightOf"/>
+ <field name="layout_toStartOf" since="17"/>
+ <field name="layout_weight"/>
+ <field name="layout_width"/>
+ <field name="layout_x"/>
+ <field name="layout_y"/>
+ <field name="left"/>
+ <field name="letterSpacing" since="21"/>
+ <field name="level" since="24"/>
+ <field name="lineSpacingExtra"/>
+ <field name="lineSpacingMultiplier"/>
+ <field name="lines"/>
+ <field name="linksClickable"/>
+ <field name="listChoiceBackgroundIndicator" since="11"/>
+ <field name="listChoiceIndicatorMultiple"/>
+ <field name="listChoiceIndicatorSingle"/>
+ <field name="listDivider"/>
+ <field name="listDividerAlertDialog" since="11"/>
+ <field name="listMenuViewStyle" since="24"/>
+ <field name="listPopupWindowStyle" since="11"/>
+ <field name="listPreferredItemHeight"/>
+ <field name="listPreferredItemHeightLarge" since="14"/>
+ <field name="listPreferredItemHeightSmall" since="14"/>
+ <field name="listPreferredItemPaddingEnd" since="17"/>
+ <field name="listPreferredItemPaddingLeft" since="14"/>
+ <field name="listPreferredItemPaddingRight" since="14"/>
+ <field name="listPreferredItemPaddingStart" since="17"/>
+ <field name="listSelector"/>
+ <field name="listSeparatorTextViewStyle"/>
+ <field name="listViewStyle"/>
+ <field name="listViewWhiteStyle"/>
+ <field name="lockTaskMode" since="23"/>
+ <field name="logo" since="11"/>
+ <field name="logoDescription" since="23"/>
+ <field name="longClickable"/>
+ <field name="loopViews" since="11"/>
+ <field name="manageSpaceActivity"/>
+ <field name="mapViewStyle"/>
+ <field name="marqueeRepeatLimit" since="2"/>
+ <field name="matchOrder" since="21"/>
+ <field name="max"/>
+ <field name="maxAspectRatio" since="26"/>
+ <field name="maxButtonHeight" since="24"/>
+ <field name="maxDate" since="11"/>
+ <field name="maxEms"/>
+ <field name="maxHeight"/>
+ <field name="maxItemsPerRow"/>
+ <field name="maxLength"/>
+ <field name="maxLevel"/>
+ <field name="maxLines"/>
+ <field name="maxRecents" since="21"/>
+ <field name="maxRows"/>
+ <field name="maxSdkVersion" since="4"/>
+ <field name="maxWidth"/>
+ <field name="maximumAngle" since="21"/>
+ <field name="measureAllChildren"/>
+ <field name="measureWithLargestChild" since="11"/>
+ <field name="mediaRouteButtonStyle" since="16"/>
+ <field name="mediaRouteTypes" since="16"/>
+ <field name="menuCategory"/>
+ <field name="mimeType"/>
+ <field name="min" since="26"/>
+ <field name="minDate" since="11"/>
+ <field name="minEms"/>
+ <field name="minHeight"/>
+ <field name="minLevel"/>
+ <field name="minLines"/>
+ <field name="minResizeHeight" since="14"/>
+ <field name="minResizeWidth" since="14"/>
+ <field name="minSdkVersion"/>
+ <field name="minWidth"/>
+ <field name="minimumHorizontalAngle" since="21"/>
+ <field name="minimumVerticalAngle" since="21"/>
+ <field name="mipMap" since="18"/>
+ <field name="mirrorForRtl" since="18"/>
+ <field name="mode"/>
+ <field name="moreIcon"/>
+ <field name="multiArch" since="21"/>
+ <field name="multiprocess"/>
+ <field name="name"/>
+ <field name="navigationBarColor" since="21"/>
+ <field name="navigationContentDescription" since="21"/>
+ <field name="navigationIcon" since="21"/>
+ <field name="navigationMode" since="11"/>
+ <field name="negativeButtonText"/>
+ <field name="nestedScrollingEnabled" since="21"/>
+ <field name="networkSecurityConfig" since="24"/>
+ <field name="nextClusterForward" since="26"/>
+ <field name="nextFocusDown"/>
+ <field name="nextFocusForward" since="11"/>
+ <field name="nextFocusLeft"/>
+ <field name="nextFocusRight"/>
+ <field name="nextFocusUp"/>
+ <field name="noHistory" since="3"/>
+ <field name="normalScreens" since="4"/>
+ <field name="notificationTimeout" since="14"/>
+ <field name="numColumns"/>
+ <field name="numStars"/>
+ <field name="numberPickerStyle" since="24"/>
+ <field name="numbersBackgroundColor" since="21"/>
+ <field name="numbersInnerTextColor" since="23"/>
+ <field name="numbersSelectorColor" since="21"/>
+ <field name="numbersTextColor" since="21"/>
+ <field name="numeric" deprecated="16"/>
+ <field name="numericModifiers" since="26"/>
+ <field name="numericShortcut"/>
+ <field name="offset" since="24"/>
+ <field name="onClick" since="4"/>
+ <field name="oneshot"/>
+ <field name="opacity" since="11"/>
+ <field name="order"/>
+ <field name="orderInCategory"/>
+ <field name="ordering" since="11"/>
+ <field name="orderingFromXml"/>
+ <field name="orientation"/>
+ <field name="outAnimation"/>
+ <field name="outlineProvider" since="21"/>
+ <field name="overScrollFooter" since="9"/>
+ <field name="overScrollHeader" since="9"/>
+ <field name="overScrollMode" since="9"/>
+ <field name="overlapAnchor" since="21"/>
+ <field name="overridesImplicitlyEnabledSubtype" since="14"/>
+ <field name="packageNames" since="14"/>
+ <field name="padding"/>
+ <field name="paddingBottom"/>
+ <field name="paddingEnd" since="17"/>
+ <field name="paddingHorizontal" since="26"/>
+ <field name="paddingLeft"/>
+ <field name="paddingMode" since="21"/>
+ <field name="paddingRight"/>
+ <field name="paddingStart" since="17"/>
+ <field name="paddingTop"/>
+ <field name="paddingVertical" since="26"/>
+ <field name="panelBackground"/>
+ <field name="panelColorBackground"/>
+ <field name="panelColorForeground"/>
+ <field name="panelFullBackground"/>
+ <field name="panelTextAppearance"/>
+ <field name="parentActivityName" since="16"/>
+ <field name="password" deprecated="16"/>
+ <field name="path"/>
+ <field name="pathData" since="21"/>
+ <field name="pathPattern"/>
+ <field name="pathPrefix"/>
+ <field name="patternPathData" since="21"/>
+ <field name="permission"/>
+ <field name="permissionFlags" since="17"/>
+ <field name="permissionGroup"/>
+ <field name="permissionGroupFlags" since="17"/>
+ <field name="persistableMode" since="21"/>
+ <field name="persistent"/>
+ <field name="persistentDrawingCache"/>
+ <field name="persistentWhenFeatureAvailable" since="26"/>
+ <field name="phoneNumber" deprecated="16"/>
+ <field name="pivotX"/>
+ <field name="pivotY"/>
+ <field name="pointerIcon" since="24"/>
+ <field name="popupAnimationStyle" since="9"/>
+ <field name="popupBackground"/>
+ <field name="popupCharacters" since="3"/>
+ <field name="popupElevation" since="21"/>
+ <field name="popupEnterTransition" since="24"/>
+ <field name="popupExitTransition" since="24"/>
+ <field name="popupKeyboard" since="3"/>
+ <field name="popupLayout" since="3"/>
+ <field name="popupMenuStyle" since="11"/>
+ <field name="popupTheme" since="21"/>
+ <field name="popupWindowStyle"/>
+ <field name="port"/>
+ <field name="positiveButtonText"/>
+ <field name="preferenceCategoryStyle"/>
+ <field name="preferenceFragmentStyle" since="24"/>
+ <field name="preferenceInformationStyle"/>
+ <field name="preferenceLayoutChild"/>
+ <field name="preferenceScreenStyle"/>
+ <field name="preferenceStyle"/>
+ <field name="presentationTheme" since="17"/>
+ <field name="previewImage" since="11"/>
+ <field name="primaryContentAlpha" since="26"/>
+ <field name="priority"/>
+ <field name="privateImeOptions" since="3"/>
+ <field name="process"/>
+ <field name="progress"/>
+ <field name="progressBackgroundTint" since="21"/>
+ <field name="progressBackgroundTintMode" since="21"/>
+ <field name="progressBarPadding" since="11"/>
+ <field name="progressBarStyle"/>
+ <field name="progressBarStyleHorizontal"/>
+ <field name="progressBarStyleInverse" since="4"/>
+ <field name="progressBarStyleLarge"/>
+ <field name="progressBarStyleLargeInverse" since="4"/>
+ <field name="progressBarStyleSmall"/>
+ <field name="progressBarStyleSmallInverse" since="4"/>
+ <field name="progressBarStyleSmallTitle"/>
+ <field name="progressDrawable"/>
+ <field name="progressTint" since="21"/>
+ <field name="progressTintMode" since="21"/>
+ <field name="prompt"/>
+ <field name="propertyName" since="11"/>
+ <field name="propertyXName" since="21"/>
+ <field name="propertyYName" since="21"/>
+ <field name="protectionLevel"/>
+ <field name="publicKey" since="14"/>
+ <field name="queryActionMsg"/>
+ <field name="queryAfterZeroResults" since="4"/>
+ <field name="queryBackground" since="21"/>
+ <field name="queryHint" since="11"/>
+ <field name="quickContactBadgeStyleSmallWindowLarge" since="6"/>
+ <field name="quickContactBadgeStyleSmallWindowMedium" since="6"/>
+ <field name="quickContactBadgeStyleSmallWindowSmall" since="6"/>
+ <field name="quickContactBadgeStyleWindowLarge" since="6"/>
+ <field name="quickContactBadgeStyleWindowMedium" since="6"/>
+ <field name="quickContactBadgeStyleWindowSmall" since="6"/>
+ <field name="radioButtonStyle"/>
+ <field name="radius"/>
+ <field name="rating"/>
+ <field name="ratingBarStyle"/>
+ <field name="ratingBarStyleIndicator"/>
+ <field name="ratingBarStyleSmall"/>
+ <field name="readPermission"/>
+ <field name="recognitionService" since="21"/>
+ <field name="recreateOnConfigChanges" since="26"/>
+ <field name="recycleEnabled" since="26"/>
+ <field name="relinquishTaskIdentity" since="21"/>
+ <field name="reparent" since="21"/>
+ <field name="reparentWithOverlay" since="21"/>
+ <field name="repeatCount"/>
+ <field name="repeatMode"/>
+ <field name="reqFiveWayNav" since="3"/>
+ <field name="reqHardKeyboard" since="3"/>
+ <field name="reqKeyboardType" since="3"/>
+ <field name="reqNavigation" since="3"/>
+ <field name="reqTouchScreen" since="3"/>
+ <field name="requireDeviceUnlock" since="19"/>
+ <field name="required" since="5"/>
+ <field name="requiredAccountType" since="18"/>
+ <field name="requiredFeature" since="26"/>
+ <field name="requiredForAllUsers" since="18"/>
+ <field name="requiredNotFeature" since="26"/>
+ <field name="requiresFadingEdge" since="14"/>
+ <field name="requiresSmallestWidthDp" since="13"/>
+ <field name="resizeClip" since="22"/>
+ <field name="resizeMode" since="12"/>
+ <field name="resizeable" since="4"/>
+ <field name="resizeableActivity" since="24"/>
+ <field name="resource"/>
+ <field name="restoreAnyVersion" since="8"/>
+ <field name="restoreNeedsApplication" since="5" deprecated="16"/>
+ <field name="restrictedAccountType" since="18"/>
+ <field name="restrictionType" since="21"/>
+ <field name="resumeWhilePausing" since="21"/>
+ <field name="reversible" since="21"/>
+ <field name="revisionCode" since="22"/>
+ <field name="right"/>
+ <field name="ringtonePreferenceStyle"/>
+ <field name="ringtoneType"/>
+ <field name="rotation" since="11"/>
+ <field name="rotationAnimation" since="26"/>
+ <field name="rotationX" since="11"/>
+ <field name="rotationY" since="11"/>
+ <field name="roundIcon" since="25"/>
+ <field name="rowCount" since="14"/>
+ <field name="rowDelay"/>
+ <field name="rowEdgeFlags" since="3"/>
+ <field name="rowHeight"/>
+ <field name="rowOrderPreserved" since="14"/>
+ <field name="saveEnabled"/>
+ <field name="scaleGravity"/>
+ <field name="scaleHeight"/>
+ <field name="scaleType"/>
+ <field name="scaleWidth"/>
+ <field name="scaleX" since="11"/>
+ <field name="scaleY" since="11"/>
+ <field name="scheme"/>
+ <field name="screenDensity" since="9"/>
+ <field name="screenOrientation"/>
+ <field name="screenSize" since="9"/>
+ <field name="scrollHorizontally"/>
+ <field name="scrollIndicators" since="23"/>
+ <field name="scrollViewStyle"/>
+ <field name="scrollX"/>
+ <field name="scrollY"/>
+ <field name="scrollbarAlwaysDrawHorizontalTrack"/>
+ <field name="scrollbarAlwaysDrawVerticalTrack"/>
+ <field name="scrollbarDefaultDelayBeforeFade" since="5"/>
+ <field name="scrollbarFadeDuration" since="5"/>
+ <field name="scrollbarSize"/>
+ <field name="scrollbarStyle"/>
+ <field name="scrollbarThumbHorizontal"/>
+ <field name="scrollbarThumbVertical"/>
+ <field name="scrollbarTrackHorizontal"/>
+ <field name="scrollbarTrackVertical"/>
+ <field name="scrollbars"/>
+ <field name="scrollingCache"/>
+ <field name="searchButtonText" deprecated="16"/>
+ <field name="searchHintIcon" since="22"/>
+ <field name="searchIcon" since="21"/>
+ <field name="searchMode"/>
+ <field name="searchSettingsDescription" since="4"/>
+ <field name="searchSuggestAuthority"/>
+ <field name="searchSuggestIntentAction"/>
+ <field name="searchSuggestIntentData"/>
+ <field name="searchSuggestPath"/>
+ <field name="searchSuggestSelection"/>
+ <field name="searchSuggestThreshold" since="4"/>
+ <field name="searchViewStyle" since="21"/>
+ <field name="secondaryContentAlpha" since="26"/>
+ <field name="secondaryProgress"/>
+ <field name="secondaryProgressTint" since="21"/>
+ <field name="secondaryProgressTintMode" since="21"/>
+ <field name="seekBarStyle"/>
+ <field name="segmentedButtonStyle" since="11"/>
+ <field name="selectAllOnFocus"/>
+ <field name="selectable"/>
+ <field name="selectableItemBackground" since="11"/>
+ <field name="selectableItemBackgroundBorderless" since="21"/>
+ <field name="selectedDateVerticalBar" since="11" deprecated="23"/>
+ <field name="selectedWeekBackgroundColor" since="11" deprecated="23"/>
+ <field name="sessionService" since="21"/>
+ <field name="settingsActivity" since="3"/>
+ <field name="setupActivity" since="21"/>
+ <field name="shadowColor"/>
+ <field name="shadowDx"/>
+ <field name="shadowDy"/>
+ <field name="shadowRadius"/>
+ <field name="shape"/>
+ <field name="shareInterpolator"/>
+ <field name="sharedUserId"/>
+ <field name="sharedUserLabel" since="3"/>
+ <field name="shortcutDisabledMessage" since="25"/>
+ <field name="shortcutId" since="25"/>
+ <field name="shortcutLongLabel" since="25"/>
+ <field name="shortcutShortLabel" since="25"/>
+ <field name="shouldDisableView"/>
+ <field name="showAsAction" since="11"/>
+ <field name="showDefault"/>
+ <field name="showDividers" since="11"/>
+ <field name="showForAllUsers" since="23"/>
+ <field name="showMetadataInPreview" since="25"/>
+ <field name="showOnLockScreen" since="17" deprecated="23"/>
+ <field name="showSilent"/>
+ <field name="showText" since="21"/>
+ <field name="showWeekNumber" since="11" deprecated="23"/>
+ <field name="shownWeekCount" since="11" deprecated="23"/>
+ <field name="shrinkColumns"/>
+ <field name="singleLine" deprecated="16"/>
+ <field name="singleLineTitle" since="26"/>
+ <field name="singleUser" since="17"/>
+ <field name="slideEdge" since="21"/>
+ <field name="smallIcon" since="5"/>
+ <field name="smallScreens" since="4"/>
+ <field name="smoothScrollbar" since="3"/>
+ <field name="soundEffectsEnabled"/>
+ <field name="spacing"/>
+ <field name="spinnerDropDownItemStyle"/>
+ <field name="spinnerItemStyle"/>
+ <field name="spinnerMode" since="11"/>
+ <field name="spinnerStyle"/>
+ <field name="spinnersShown" since="11"/>
+ <field name="splitMotionEvents" since="11"/>
+ <field name="splitName" since="26"/>
+ <field name="splitTrack" since="21"/>
+ <field name="spotShadowAlpha" since="21"/>
+ <field name="src"/>
+ <field name="ssp" since="19"/>
+ <field name="sspPattern" since="19"/>
+ <field name="sspPrefix" since="19"/>
+ <field name="stackFromBottom"/>
+ <field name="stackViewStyle" since="21"/>
+ <field name="starStyle"/>
+ <field name="start" since="23"/>
+ <field name="startColor"/>
+ <field name="startDelay" since="19"/>
+ <field name="startOffset"/>
+ <field name="startX" since="24"/>
+ <field name="startY" since="24"/>
+ <field name="startYear" deprecated="16"/>
+ <field name="stateListAnimator" since="21"/>
+ <field name="stateNotNeeded"/>
+ <field name="state_above_anchor"/>
+ <field name="state_accelerated" since="11"/>
+ <field name="state_activated" since="11"/>
+ <field name="state_active"/>
+ <field name="state_checkable"/>
+ <field name="state_checked"/>
+ <field name="state_drag_can_accept" since="14"/>
+ <field name="state_drag_hovered" since="14"/>
+ <field name="state_empty"/>
+ <field name="state_enabled"/>
+ <field name="state_expanded"/>
+ <field name="state_first"/>
+ <field name="state_focused"/>
+ <field name="state_hovered" since="14"/>
+ <field name="state_last"/>
+ <field name="state_long_pressable" since="3"/>
+ <field name="state_middle"/>
+ <field name="state_multiline" since="11"/>
+ <field name="state_pressed"/>
+ <field name="state_selected"/>
+ <field name="state_single"/>
+ <field name="state_window_focused"/>
+ <field name="staticWallpaperPreview" since="11"/>
+ <field name="statusBarColor" since="21"/>
+ <field name="stepSize"/>
+ <field name="stopWithTask" since="14"/>
+ <field name="streamType"/>
+ <field name="stretchColumns"/>
+ <field name="stretchMode"/>
+ <field name="strokeAlpha" since="21"/>
+ <field name="strokeColor" since="21"/>
+ <field name="strokeLineCap" since="21"/>
+ <field name="strokeLineJoin" since="21"/>
+ <field name="strokeMiterLimit" since="21"/>
+ <field name="strokeWidth" since="21"/>
+ <field name="subMenuArrow" since="24"/>
+ <field name="submitBackground" since="21"/>
+ <field name="subtitle" since="11"/>
+ <field name="subtitleTextAppearance" since="21"/>
+ <field name="subtitleTextColor" since="23"/>
+ <field name="subtitleTextStyle" since="11"/>
+ <field name="subtypeExtraValue" since="14"/>
+ <field name="subtypeId" since="17"/>
+ <field name="subtypeLocale" since="14"/>
+ <field name="suggestActionMsg"/>
+ <field name="suggestActionMsgColumn"/>
+ <field name="suggestionRowLayout" since="21"/>
+ <field name="summary"/>
+ <field name="summaryColumn" since="5"/>
+ <field name="summaryOff"/>
+ <field name="summaryOn"/>
+ <field name="supportsAssist" since="23"/>
+ <field name="supportsLaunchVoiceAssistFromKeyguard" since="23"/>
+ <field name="supportsLocalInteraction" since="24"/>
+ <field name="supportsPictureInPicture" since="24"/>
+ <field name="supportsRtl" since="17"/>
+ <field name="supportsSwitchingToNextInputMethod" since="19"/>
+ <field name="supportsUploading" since="5"/>
+ <field name="switchMinWidth" since="14"/>
+ <field name="switchPadding" since="14"/>
+ <field name="switchPreferenceStyle" since="14"/>
+ <field name="switchStyle" since="21"/>
+ <field name="switchTextAppearance" since="14"/>
+ <field name="switchTextOff" since="14"/>
+ <field name="switchTextOn" since="14"/>
+ <field name="syncable"/>
+ <field name="tabStripEnabled" since="8"/>
+ <field name="tabStripLeft" since="8"/>
+ <field name="tabStripRight" since="8"/>
+ <field name="tabWidgetStyle"/>
+ <field name="tag"/>
+ <field name="targetActivity"/>
+ <field name="targetClass"/>
+ <field name="targetDescriptions" since="14" deprecated="23"/>
+ <field name="targetId" since="19"/>
+ <field name="targetName" since="21"/>
+ <field name="targetPackage"/>
+ <field name="targetProcesses" since="26"/>
+ <field name="targetSandboxVersion" since="26"/>
+ <field name="targetSdkVersion" since="4"/>
+ <field name="taskAffinity"/>
+ <field name="taskCloseEnterAnimation"/>
+ <field name="taskCloseExitAnimation"/>
+ <field name="taskOpenEnterAnimation"/>
+ <field name="taskOpenExitAnimation"/>
+ <field name="taskToBackEnterAnimation"/>
+ <field name="taskToBackExitAnimation"/>
+ <field name="taskToFrontEnterAnimation"/>
+ <field name="taskToFrontExitAnimation"/>
+ <field name="tension" since="4"/>
+ <field name="testOnly" since="4"/>
+ <field name="text"/>
+ <field name="textAlignment" since="17"/>
+ <field name="textAllCaps" since="14"/>
+ <field name="textAppearance"/>
+ <field name="textAppearanceButton"/>
+ <field name="textAppearanceInverse"/>
+ <field name="textAppearanceLarge"/>
+ <field name="textAppearanceLargeInverse"/>
+ <field name="textAppearanceLargePopupMenu" since="11"/>
+ <field name="textAppearanceListItem" since="14"/>
+ <field name="textAppearanceListItemSecondary" since="21"/>
+ <field name="textAppearanceListItemSmall" since="14"/>
+ <field name="textAppearanceMedium"/>
+ <field name="textAppearanceMediumInverse"/>
+ <field name="textAppearancePopupMenuHeader" since="24"/>
+ <field name="textAppearanceSearchResultSubtitle" since="5"/>
+ <field name="textAppearanceSearchResultTitle" since="5"/>
+ <field name="textAppearanceSmall"/>
+ <field name="textAppearanceSmallInverse"/>
+ <field name="textAppearanceSmallPopupMenu" since="11"/>
+ <field name="textCheckMark"/>
+ <field name="textCheckMarkInverse"/>
+ <field name="textColor"/>
+ <field name="textColorAlertDialogListItem" since="11"/>
+ <field name="textColorHighlight"/>
+ <field name="textColorHighlightInverse" since="11"/>
+ <field name="textColorHint"/>
+ <field name="textColorHintInverse"/>
+ <field name="textColorLink"/>
+ <field name="textColorLinkInverse" since="11"/>
+ <field name="textColorPrimary"/>
+ <field name="textColorPrimaryDisableOnly"/>
+ <field name="textColorPrimaryInverse"/>
+ <field name="textColorPrimaryInverseDisableOnly" since="4"/>
+ <field name="textColorPrimaryInverseNoDisable"/>
+ <field name="textColorPrimaryNoDisable"/>
+ <field name="textColorSecondary"/>
+ <field name="textColorSecondaryInverse"/>
+ <field name="textColorSecondaryInverseNoDisable"/>
+ <field name="textColorSecondaryNoDisable"/>
+ <field name="textColorTertiary"/>
+ <field name="textColorTertiaryInverse"/>
+ <field name="textCursorDrawable" since="12"/>
+ <field name="textDirection" since="17"/>
+ <field name="textEditNoPasteWindowLayout" since="11"/>
+ <field name="textEditPasteWindowLayout" since="11"/>
+ <field name="textEditSideNoPasteWindowLayout" since="11"/>
+ <field name="textEditSidePasteWindowLayout" since="11"/>
+ <field name="textEditSuggestionItemLayout" since="14"/>
+ <field name="textFilterEnabled"/>
+ <field name="textIsSelectable" since="11"/>
+ <field name="textOff"/>
+ <field name="textOn"/>
+ <field name="textScaleX"/>
+ <field name="textSelectHandle" since="9"/>
+ <field name="textSelectHandleLeft" since="9"/>
+ <field name="textSelectHandleRight" since="9"/>
+ <field name="textSelectHandleWindowStyle" since="9"/>
+ <field name="textSize"/>
+ <field name="textStyle"/>
+ <field name="textSuggestionsWindowStyle" since="14"/>
+ <field name="textViewStyle"/>
+ <field name="theme"/>
+ <field name="thickness" since="3"/>
+ <field name="thicknessRatio"/>
+ <field name="thumb"/>
+ <field name="thumbOffset"/>
+ <field name="thumbPosition" since="23"/>
+ <field name="thumbTextPadding" since="14"/>
+ <field name="thumbTint" since="21"/>
+ <field name="thumbTintMode" since="21"/>
+ <field name="thumbnail" since="5"/>
+ <field name="tickMark" since="24"/>
+ <field name="tickMarkTint" since="24"/>
+ <field name="tickMarkTintMode" since="24"/>
+ <field name="tileMode"/>
+ <field name="tileModeX" since="21"/>
+ <field name="tileModeY" since="21"/>
+ <field name="timePickerDialogTheme" since="21"/>
+ <field name="timePickerMode" since="21"/>
+ <field name="timePickerStyle" since="21"/>
+ <field name="timeZone" since="17"/>
+ <field name="tint"/>
+ <field name="tintMode" since="21"/>
+ <field name="title"/>
+ <field name="titleCondensed"/>
+ <field name="titleMargin" since="24"/>
+ <field name="titleMarginBottom" since="24"/>
+ <field name="titleMarginEnd" since="24"/>
+ <field name="titleMarginStart" since="24"/>
+ <field name="titleMarginTop" since="24"/>
+ <field name="titleTextAppearance" since="21"/>
+ <field name="titleTextColor" since="23"/>
+ <field name="titleTextStyle" since="11"/>
+ <field name="toAlpha"/>
+ <field name="toDegrees"/>
+ <field name="toId" since="21"/>
+ <field name="toScene" since="19"/>
+ <field name="toXDelta"/>
+ <field name="toXScale"/>
+ <field name="toYDelta"/>
+ <field name="toYScale"/>
+ <field name="toolbarStyle" since="21"/>
+ <field name="tooltipText" since="26"/>
+ <field name="top"/>
+ <field name="topBright"/>
+ <field name="topDark"/>
+ <field name="topLeftRadius"/>
+ <field name="topOffset" since="3"/>
+ <field name="topRightRadius"/>
+ <field name="touchscreenBlocksFocus" since="21"/>
+ <field name="track" since="14"/>
+ <field name="trackTint" since="23"/>
+ <field name="trackTintMode" since="23"/>
+ <field name="transcriptMode"/>
+ <field name="transformPivotX" since="11"/>
+ <field name="transformPivotY" since="11"/>
+ <field name="transition" since="19"/>
+ <field name="transitionGroup" since="21"/>
+ <field name="transitionName" since="21"/>
+ <field name="transitionOrdering" since="19"/>
+ <field name="transitionVisibilityMode" since="21"/>
+ <field name="translateX" since="21"/>
+ <field name="translateY" since="21"/>
+ <field name="translationX" since="11"/>
+ <field name="translationY" since="11"/>
+ <field name="translationZ" since="21"/>
+ <field name="trimPathEnd" since="21"/>
+ <field name="trimPathOffset" since="21"/>
+ <field name="trimPathStart" since="21"/>
+ <field name="tunerCount" since="24"/>
+ <field name="type"/>
+ <field name="typeface"/>
+ <field name="uiOptions" since="14"/>
+ <field name="uncertainGestureColor" since="4"/>
+ <field name="unfocusedMonthDateColor" since="11" deprecated="23"/>
+ <field name="unselectedAlpha"/>
+ <field name="updatePeriodMillis" since="3"/>
+ <field name="use32bitAbi" since="24"/>
+ <field name="useDefaultMargins" since="14"/>
+ <field name="useIntrinsicSizeAsMinimum" since="11"/>
+ <field name="useLevel"/>
+ <field name="userVisible" since="5"/>
+ <field name="usesCleartextTraffic" since="23"/>
+ <field name="value"/>
+ <field name="valueFrom" since="11"/>
+ <field name="valueTo" since="11"/>
+ <field name="valueType" since="11"/>
+ <field name="variablePadding"/>
+ <field name="vendor" since="19"/>
+ <field name="version" since="24"/>
+ <field name="versionCode"/>
+ <field name="versionName"/>
+ <field name="verticalCorrection" since="3"/>
+ <field name="verticalDivider"/>
+ <field name="verticalGap" since="3"/>
+ <field name="verticalScrollbarPosition" since="11"/>
+ <field name="verticalSpacing"/>
+ <field name="viewportHeight" since="21"/>
+ <field name="viewportWidth" since="21"/>
+ <field name="visibility"/>
+ <field name="visible"/>
+ <field name="visibleToInstantApps" since="26"/>
+ <field name="vmSafeMode" since="8"/>
+ <field name="voiceIcon" since="21"/>
+ <field name="voiceLanguage" since="3"/>
+ <field name="voiceLanguageModel" since="3"/>
+ <field name="voiceMaxResults" since="3"/>
+ <field name="voicePromptText" since="3"/>
+ <field name="voiceSearchMode" since="3"/>
+ <field name="wallpaperCloseEnterAnimation" since="5"/>
+ <field name="wallpaperCloseExitAnimation" since="5"/>
+ <field name="wallpaperIntraCloseEnterAnimation" since="5"/>
+ <field name="wallpaperIntraCloseExitAnimation" since="5"/>
+ <field name="wallpaperIntraOpenEnterAnimation" since="5"/>
+ <field name="wallpaperIntraOpenExitAnimation" since="5"/>
+ <field name="wallpaperOpenEnterAnimation" since="5"/>
+ <field name="wallpaperOpenExitAnimation" since="5"/>
+ <field name="webTextViewStyle" since="8"/>
+ <field name="webViewStyle"/>
+ <field name="weekDayTextAppearance" since="11"/>
+ <field name="weekNumberColor" since="11" deprecated="23"/>
+ <field name="weekSeparatorLineColor" since="11" deprecated="23"/>
+ <field name="weightSum"/>
+ <field name="widgetCategory" since="17"/>
+ <field name="widgetLayout"/>
+ <field name="width"/>
+ <field name="windowActionBar" since="11"/>
+ <field name="windowActionBarOverlay" since="11"/>
+ <field name="windowActionModeOverlay" since="11"/>
+ <field name="windowActivityTransitions" since="21"/>
+ <field name="windowAllowEnterTransitionOverlap" since="21"/>
+ <field name="windowAllowReturnTransitionOverlap" since="21"/>
+ <field name="windowAnimationStyle"/>
+ <field name="windowBackground"/>
+ <field name="windowBackgroundFallback" since="24"/>
+ <field name="windowClipToOutline" since="21"/>
+ <field name="windowCloseOnTouchOutside" since="11"/>
+ <field name="windowContentOverlay"/>
+ <field name="windowContentTransitionManager" since="21"/>
+ <field name="windowContentTransitions" since="21"/>
+ <field name="windowDisablePreview" since="3"/>
+ <field name="windowDrawsSystemBarBackgrounds" since="21"/>
+ <field name="windowElevation" since="21"/>
+ <field name="windowEnableSplitTouch" since="11"/>
+ <field name="windowEnterAnimation"/>
+ <field name="windowEnterTransition" since="21"/>
+ <field name="windowExitAnimation"/>
+ <field name="windowExitTransition" since="21"/>
+ <field name="windowFrame"/>
+ <field name="windowFullscreen"/>
+ <field name="windowHideAnimation"/>
+ <field name="windowIsFloating"/>
+ <field name="windowIsTranslucent"/>
+ <field name="windowLightStatusBar" since="23"/>
+ <field name="windowMinWidthMajor" since="11"/>
+ <field name="windowMinWidthMinor" since="11"/>
+ <field name="windowNoDisplay" since="3"/>
+ <field name="windowNoTitle"/>
+ <field name="windowOverscan" since="18"/>
+ <field name="windowReenterTransition" since="21"/>
+ <field name="windowReturnTransition" since="21"/>
+ <field name="windowSharedElementEnterTransition" since="21"/>
+ <field name="windowSharedElementExitTransition" since="21"/>
+ <field name="windowSharedElementReenterTransition" since="21"/>
+ <field name="windowSharedElementReturnTransition" since="21"/>
+ <field name="windowSharedElementsUseOverlay" since="21"/>
+ <field name="windowShowAnimation"/>
+ <field name="windowShowWallpaper" since="5"/>
+ <field name="windowSoftInputMode" since="3"/>
+ <field name="windowSplashscreenContent" since="26"/>
+ <field name="windowSwipeToDismiss" since="20"/>
+ <field name="windowTitleBackgroundStyle"/>
+ <field name="windowTitleSize"/>
+ <field name="windowTitleStyle"/>
+ <field name="windowTransitionBackgroundFadeDuration" since="21"/>
+ <field name="windowTranslucentNavigation" since="19"/>
+ <field name="windowTranslucentStatus" since="19"/>
+ <field name="writePermission"/>
+ <field name="x"/>
+ <field name="xlargeScreens" since="9"/>
+ <field name="y"/>
+ <field name="yearListItemTextAppearance" since="21" deprecated="23"/>
+ <field name="yearListSelectorColor" since="21" deprecated="23"/>
+ <field name="yesNoPreferenceStyle"/>
+ <field name="zAdjustment"/>
+ </class>
+ <class name="android/R$bool" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/R$color" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="background_dark"/>
+ <field name="background_light"/>
+ <field name="black"/>
+ <field name="darker_gray"/>
+ <field name="holo_blue_bright" since="14"/>
+ <field name="holo_blue_dark" since="14"/>
+ <field name="holo_blue_light" since="14"/>
+ <field name="holo_green_dark" since="14"/>
+ <field name="holo_green_light" since="14"/>
+ <field name="holo_orange_dark" since="14"/>
+ <field name="holo_orange_light" since="14"/>
+ <field name="holo_purple" since="14"/>
+ <field name="holo_red_dark" since="14"/>
+ <field name="holo_red_light" since="14"/>
+ <field name="primary_text_dark"/>
+ <field name="primary_text_dark_nodisable"/>
+ <field name="primary_text_light"/>
+ <field name="primary_text_light_nodisable"/>
+ <field name="secondary_text_dark"/>
+ <field name="secondary_text_dark_nodisable"/>
+ <field name="secondary_text_light"/>
+ <field name="secondary_text_light_nodisable"/>
+ <field name="tab_indicator_text"/>
+ <field name="tertiary_text_dark"/>
+ <field name="tertiary_text_light"/>
+ <field name="transparent"/>
+ <field name="white"/>
+ <field name="widget_edittext_dark"/>
+ </class>
+ <class name="android/R$dimen" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="app_icon_size"/>
+ <field name="dialog_min_width_major" since="11"/>
+ <field name="dialog_min_width_minor" since="11"/>
+ <field name="notification_large_icon_height" since="11"/>
+ <field name="notification_large_icon_width" since="11"/>
+ <field name="thumbnail_height"/>
+ <field name="thumbnail_width"/>
+ </class>
+ <class name="android/R$drawable" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="alert_dark_frame"/>
+ <field name="alert_light_frame"/>
+ <field name="arrow_down_float"/>
+ <field name="arrow_up_float"/>
+ <field name="bottom_bar"/>
+ <field name="btn_default"/>
+ <field name="btn_default_small"/>
+ <field name="btn_dialog"/>
+ <field name="btn_dropdown"/>
+ <field name="btn_minus"/>
+ <field name="btn_plus"/>
+ <field name="btn_radio"/>
+ <field name="btn_star"/>
+ <field name="btn_star_big_off"/>
+ <field name="btn_star_big_on"/>
+ <field name="button_onoff_indicator_off"/>
+ <field name="button_onoff_indicator_on"/>
+ <field name="checkbox_off_background"/>
+ <field name="checkbox_on_background"/>
+ <field name="dark_header" since="3"/>
+ <field name="dialog_frame"/>
+ <field name="dialog_holo_dark_frame" since="11"/>
+ <field name="dialog_holo_light_frame" since="11"/>
+ <field name="divider_horizontal_bright"/>
+ <field name="divider_horizontal_dark"/>
+ <field name="divider_horizontal_dim_dark"/>
+ <field name="divider_horizontal_textfield"/>
+ <field name="edit_text"/>
+ <field name="editbox_background"/>
+ <field name="editbox_background_normal"/>
+ <field name="editbox_dropdown_dark_frame"/>
+ <field name="editbox_dropdown_light_frame"/>
+ <field name="gallery_thumb"/>
+ <field name="ic_btn_speak_now" since="3"/>
+ <field name="ic_delete"/>
+ <field name="ic_dialog_alert"/>
+ <field name="ic_dialog_dialer"/>
+ <field name="ic_dialog_email"/>
+ <field name="ic_dialog_info"/>
+ <field name="ic_dialog_map"/>
+ <field name="ic_input_add"/>
+ <field name="ic_input_delete"/>
+ <field name="ic_input_get"/>
+ <field name="ic_lock_idle_alarm"/>
+ <field name="ic_lock_idle_charging"/>
+ <field name="ic_lock_idle_lock"/>
+ <field name="ic_lock_idle_low_battery"/>
+ <field name="ic_lock_lock"/>
+ <field name="ic_lock_power_off"/>
+ <field name="ic_lock_silent_mode"/>
+ <field name="ic_lock_silent_mode_off"/>
+ <field name="ic_media_ff"/>
+ <field name="ic_media_next"/>
+ <field name="ic_media_pause"/>
+ <field name="ic_media_play"/>
+ <field name="ic_media_previous"/>
+ <field name="ic_media_rew"/>
+ <field name="ic_menu_add"/>
+ <field name="ic_menu_agenda"/>
+ <field name="ic_menu_always_landscape_portrait"/>
+ <field name="ic_menu_call"/>
+ <field name="ic_menu_camera"/>
+ <field name="ic_menu_close_clear_cancel"/>
+ <field name="ic_menu_compass"/>
+ <field name="ic_menu_crop"/>
+ <field name="ic_menu_day"/>
+ <field name="ic_menu_delete"/>
+ <field name="ic_menu_directions"/>
+ <field name="ic_menu_edit"/>
+ <field name="ic_menu_gallery"/>
+ <field name="ic_menu_help"/>
+ <field name="ic_menu_info_details"/>
+ <field name="ic_menu_manage"/>
+ <field name="ic_menu_mapmode"/>
+ <field name="ic_menu_month"/>
+ <field name="ic_menu_more"/>
+ <field name="ic_menu_my_calendar"/>
+ <field name="ic_menu_mylocation"/>
+ <field name="ic_menu_myplaces"/>
+ <field name="ic_menu_preferences"/>
+ <field name="ic_menu_recent_history"/>
+ <field name="ic_menu_report_image"/>
+ <field name="ic_menu_revert"/>
+ <field name="ic_menu_rotate"/>
+ <field name="ic_menu_save"/>
+ <field name="ic_menu_search"/>
+ <field name="ic_menu_send"/>
+ <field name="ic_menu_set_as"/>
+ <field name="ic_menu_share"/>
+ <field name="ic_menu_slideshow"/>
+ <field name="ic_menu_sort_alphabetically"/>
+ <field name="ic_menu_sort_by_size"/>
+ <field name="ic_menu_today"/>
+ <field name="ic_menu_upload"/>
+ <field name="ic_menu_upload_you_tube"/>
+ <field name="ic_menu_view"/>
+ <field name="ic_menu_week"/>
+ <field name="ic_menu_zoom"/>
+ <field name="ic_notification_clear_all"/>
+ <field name="ic_notification_overlay"/>
+ <field name="ic_partial_secure"/>
+ <field name="ic_popup_disk_full"/>
+ <field name="ic_popup_reminder"/>
+ <field name="ic_popup_sync"/>
+ <field name="ic_search_category_default"/>
+ <field name="ic_secure"/>
+ <field name="list_selector_background"/>
+ <field name="menu_frame"/>
+ <field name="menu_full_frame"/>
+ <field name="menuitem_background"/>
+ <field name="picture_frame"/>
+ <field name="presence_audio_away" since="9"/>
+ <field name="presence_audio_busy" since="9"/>
+ <field name="presence_audio_online" since="9"/>
+ <field name="presence_away"/>
+ <field name="presence_busy"/>
+ <field name="presence_invisible"/>
+ <field name="presence_offline"/>
+ <field name="presence_online"/>
+ <field name="presence_video_away" since="9"/>
+ <field name="presence_video_busy" since="9"/>
+ <field name="presence_video_online" since="9"/>
+ <field name="progress_horizontal"/>
+ <field name="progress_indeterminate_horizontal"/>
+ <field name="radiobutton_off_background"/>
+ <field name="radiobutton_on_background"/>
+ <field name="screen_background_dark"/>
+ <field name="screen_background_dark_transparent" since="5"/>
+ <field name="screen_background_light"/>
+ <field name="screen_background_light_transparent" since="5"/>
+ <field name="spinner_background"/>
+ <field name="spinner_dropdown_background"/>
+ <field name="star_big_off"/>
+ <field name="star_big_on"/>
+ <field name="star_off"/>
+ <field name="star_on"/>
+ <field name="stat_notify_call_mute"/>
+ <field name="stat_notify_chat"/>
+ <field name="stat_notify_error"/>
+ <field name="stat_notify_missed_call"/>
+ <field name="stat_notify_more"/>
+ <field name="stat_notify_sdcard"/>
+ <field name="stat_notify_sdcard_prepare" since="5"/>
+ <field name="stat_notify_sdcard_usb"/>
+ <field name="stat_notify_sync"/>
+ <field name="stat_notify_sync_noanim"/>
+ <field name="stat_notify_voicemail"/>
+ <field name="stat_sys_data_bluetooth"/>
+ <field name="stat_sys_download"/>
+ <field name="stat_sys_download_done"/>
+ <field name="stat_sys_headset"/>
+ <field name="stat_sys_phone_call" deprecated="16"/>
+ <field name="stat_sys_phone_call_forward" deprecated="16"/>
+ <field name="stat_sys_phone_call_on_hold" deprecated="16"/>
+ <field name="stat_sys_speakerphone"/>
+ <field name="stat_sys_upload"/>
+ <field name="stat_sys_upload_done"/>
+ <field name="stat_sys_vp_phone_call" since="4" deprecated="16"/>
+ <field name="stat_sys_vp_phone_call_on_hold" since="4" deprecated="16"/>
+ <field name="stat_sys_warning"/>
+ <field name="status_bar_item_app_background"/>
+ <field name="status_bar_item_background"/>
+ <field name="sym_action_call"/>
+ <field name="sym_action_chat"/>
+ <field name="sym_action_email"/>
+ <field name="sym_call_incoming"/>
+ <field name="sym_call_missed"/>
+ <field name="sym_call_outgoing"/>
+ <field name="sym_contact_card"/>
+ <field name="sym_def_app_icon"/>
+ <field name="title_bar"/>
+ <field name="title_bar_tall" since="3"/>
+ <field name="toast_frame"/>
+ <field name="zoom_plate"/>
+ </class>
+ <class name="android/R$fraction" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/R$id" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="accessibilityActionContextClick" since="23"/>
+ <field name="accessibilityActionMoveWindow" since="26"/>
+ <field name="accessibilityActionScrollDown" since="23"/>
+ <field name="accessibilityActionScrollLeft" since="23"/>
+ <field name="accessibilityActionScrollRight" since="23"/>
+ <field name="accessibilityActionScrollToPosition" since="23"/>
+ <field name="accessibilityActionScrollUp" since="23"/>
+ <field name="accessibilityActionSetProgress" since="24"/>
+ <field name="accessibilityActionShowOnScreen" since="23"/>
+ <field name="addToDictionary" since="3"/>
+ <field name="autofill" since="26"/>
+ <field name="background"/>
+ <field name="button1"/>
+ <field name="button2"/>
+ <field name="button3"/>
+ <field name="candidatesArea" since="3"/>
+ <field name="checkbox"/>
+ <field name="closeButton" since="3"/>
+ <field name="content"/>
+ <field name="copy" since="3"/>
+ <field name="copyUrl" since="3"/>
+ <field name="custom" since="8"/>
+ <field name="cut" since="3"/>
+ <field name="edit"/>
+ <field name="empty"/>
+ <field name="extractArea" since="3"/>
+ <field name="hint"/>
+ <field name="home" since="11"/>
+ <field name="icon"/>
+ <field name="icon1"/>
+ <field name="icon2"/>
+ <field name="icon_frame" since="24"/>
+ <field name="input"/>
+ <field name="inputArea" since="3"/>
+ <field name="inputExtractEditText" since="3"/>
+ <field name="keyboardView" since="3"/>
+ <field name="list"/>
+ <field name="list_container" since="24"/>
+ <field name="mask" since="21"/>
+ <field name="message"/>
+ <field name="navigationBarBackground" since="21"/>
+ <field name="paste" since="3"/>
+ <field name="pasteAsPlainText" since="23"/>
+ <field name="primary"/>
+ <field name="progress"/>
+ <field name="redo" since="23"/>
+ <field name="replaceText" since="23"/>
+ <field name="secondaryProgress"/>
+ <field name="selectAll" since="3"/>
+ <field name="selectTextMode" since="11"/>
+ <field name="selectedIcon"/>
+ <field name="shareText" since="23"/>
+ <field name="startSelectingText" since="3"/>
+ <field name="statusBarBackground" since="21"/>
+ <field name="stopSelectingText" since="3"/>
+ <field name="summary"/>
+ <field name="switchInputMethod" since="3"/>
+ <field name="switch_widget" since="24"/>
+ <field name="tabcontent"/>
+ <field name="tabhost"/>
+ <field name="tabs"/>
+ <field name="text1"/>
+ <field name="text2"/>
+ <field name="textAssist" since="26"/>
+ <field name="title"/>
+ <field name="toggle"/>
+ <field name="undo" since="23"/>
+ <field name="widget_frame"/>
+ </class>
+ <class name="android/R$integer" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="config_longAnimTime"/>
+ <field name="config_mediumAnimTime"/>
+ <field name="config_shortAnimTime"/>
+ <field name="status_bar_notification_info_maxnum" since="14"/>
+ </class>
+ <class name="android/R$interpolator" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="accelerate_cubic"/>
+ <field name="accelerate_decelerate"/>
+ <field name="accelerate_quad"/>
+ <field name="accelerate_quint"/>
+ <field name="anticipate"/>
+ <field name="anticipate_overshoot"/>
+ <field name="bounce"/>
+ <field name="cycle"/>
+ <field name="decelerate_cubic"/>
+ <field name="decelerate_quad"/>
+ <field name="decelerate_quint"/>
+ <field name="fast_out_linear_in" since="21"/>
+ <field name="fast_out_slow_in" since="21"/>
+ <field name="linear"/>
+ <field name="linear_out_slow_in" since="21"/>
+ <field name="overshoot"/>
+ </class>
+ <class name="android/R$layout" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="activity_list_item"/>
+ <field name="browser_link_context_header"/>
+ <field name="expandable_list_content"/>
+ <field name="list_content" since="11"/>
+ <field name="preference_category"/>
+ <field name="select_dialog_item"/>
+ <field name="select_dialog_multichoice"/>
+ <field name="select_dialog_singlechoice"/>
+ <field name="simple_dropdown_item_1line"/>
+ <field name="simple_expandable_list_item_1"/>
+ <field name="simple_expandable_list_item_2"/>
+ <field name="simple_gallery_item"/>
+ <field name="simple_list_item_1"/>
+ <field name="simple_list_item_2"/>
+ <field name="simple_list_item_activated_1" since="11"/>
+ <field name="simple_list_item_activated_2" since="11"/>
+ <field name="simple_list_item_checked"/>
+ <field name="simple_list_item_multiple_choice"/>
+ <field name="simple_list_item_single_choice"/>
+ <field name="simple_selectable_list_item" since="11"/>
+ <field name="simple_spinner_dropdown_item"/>
+ <field name="simple_spinner_item"/>
+ <field name="test_list_item"/>
+ <field name="two_line_list_item"/>
+ </class>
+ <class name="android/R$menu" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/R$mipmap" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="sym_def_app_icon"/>
+ </class>
+ <class name="android/R$plurals" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/R$raw" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/R$string" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="VideoView_error_button"/>
+ <field name="VideoView_error_text_invalid_progressive_playback" since="3"/>
+ <field name="VideoView_error_text_unknown"/>
+ <field name="VideoView_error_title"/>
+ <field name="cancel"/>
+ <field name="copy"/>
+ <field name="copyUrl"/>
+ <field name="cut"/>
+ <field name="defaultMsisdnAlphaTag"/>
+ <field name="defaultVoiceMailAlphaTag"/>
+ <field name="dialog_alert_title" since="3"/>
+ <field name="emptyPhoneNumber"/>
+ <field name="fingerprint_icon_content_description" since="23"/>
+ <field name="httpErrorBadUrl"/>
+ <field name="httpErrorUnsupportedScheme"/>
+ <field name="no"/>
+ <field name="ok"/>
+ <field name="paste"/>
+ <field name="paste_as_plain_text" since="26"/>
+ <field name="search_go"/>
+ <field name="selectAll"/>
+ <field name="selectTextMode" since="11"/>
+ <field name="status_bar_notification_info_overflow" since="14"/>
+ <field name="unknownName"/>
+ <field name="untitled"/>
+ <field name="yes"/>
+ </class>
+ <class name="android/R$style" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="Animation"/>
+ <field name="Animation_Activity"/>
+ <field name="Animation_Dialog"/>
+ <field name="Animation_InputMethod" since="5"/>
+ <field name="Animation_Toast"/>
+ <field name="Animation_Translucent"/>
+ <field name="DeviceDefault_ButtonBar" since="14"/>
+ <field name="DeviceDefault_ButtonBar_AlertDialog" since="14"/>
+ <field name="DeviceDefault_Light_ButtonBar" since="14"/>
+ <field name="DeviceDefault_Light_ButtonBar_AlertDialog" since="14"/>
+ <field name="DeviceDefault_Light_SegmentedButton" since="14"/>
+ <field name="DeviceDefault_SegmentedButton" since="14"/>
+ <field name="Holo_ButtonBar" since="11"/>
+ <field name="Holo_ButtonBar_AlertDialog" since="11"/>
+ <field name="Holo_Light_ButtonBar" since="11"/>
+ <field name="Holo_Light_ButtonBar_AlertDialog" since="11"/>
+ <field name="Holo_Light_SegmentedButton" since="11"/>
+ <field name="Holo_SegmentedButton" since="11"/>
+ <field name="MediaButton"/>
+ <field name="MediaButton_Ffwd"/>
+ <field name="MediaButton_Next"/>
+ <field name="MediaButton_Pause"/>
+ <field name="MediaButton_Play"/>
+ <field name="MediaButton_Previous"/>
+ <field name="MediaButton_Rew"/>
+ <field name="TextAppearance"/>
+ <field name="TextAppearance_DeviceDefault" since="14"/>
+ <field name="TextAppearance_DeviceDefault_DialogWindowTitle" since="14"/>
+ <field name="TextAppearance_DeviceDefault_Inverse" since="14"/>
+ <field name="TextAppearance_DeviceDefault_Large" since="14"/>
+ <field name="TextAppearance_DeviceDefault_Large_Inverse" since="14"/>
+ <field name="TextAppearance_DeviceDefault_Medium" since="14"/>
+ <field name="TextAppearance_DeviceDefault_Medium_Inverse" since="14"/>
+ <field name="TextAppearance_DeviceDefault_SearchResult_Subtitle" since="14"/>
+ <field name="TextAppearance_DeviceDefault_SearchResult_Title" since="14"/>
+ <field name="TextAppearance_DeviceDefault_Small" since="14"/>
+ <field name="TextAppearance_DeviceDefault_Small_Inverse" since="14"/>
+ <field name="TextAppearance_DeviceDefault_Widget" since="14"/>
+ <field name="TextAppearance_DeviceDefault_Widget_ActionBar_Menu" since="14"/>
+ <field name="TextAppearance_DeviceDefault_Widget_ActionBar_Subtitle" since="14"/>
+ <field name="TextAppearance_DeviceDefault_Widget_ActionBar_Subtitle_Inverse" since="14" deprecated="21"/>
+ <field name="TextAppearance_DeviceDefault_Widget_ActionBar_Title" since="14"/>
+ <field name="TextAppearance_DeviceDefault_Widget_ActionBar_Title_Inverse" since="14" deprecated="21"/>
+ <field name="TextAppearance_DeviceDefault_Widget_ActionMode_Subtitle" since="14"/>
+ <field name="TextAppearance_DeviceDefault_Widget_ActionMode_Subtitle_Inverse" since="14" deprecated="21"/>
+ <field name="TextAppearance_DeviceDefault_Widget_ActionMode_Title" since="14"/>
+ <field name="TextAppearance_DeviceDefault_Widget_ActionMode_Title_Inverse" since="14" deprecated="21"/>
+ <field name="TextAppearance_DeviceDefault_Widget_Button" since="14"/>
+ <field name="TextAppearance_DeviceDefault_Widget_DropDownHint" since="14"/>
+ <field name="TextAppearance_DeviceDefault_Widget_DropDownItem" since="14"/>
+ <field name="TextAppearance_DeviceDefault_Widget_EditText" since="14"/>
+ <field name="TextAppearance_DeviceDefault_Widget_IconMenu_Item" since="14"/>
+ <field name="TextAppearance_DeviceDefault_Widget_PopupMenu" since="14"/>
+ <field name="TextAppearance_DeviceDefault_Widget_PopupMenu_Large" since="14"/>
+ <field name="TextAppearance_DeviceDefault_Widget_PopupMenu_Small" since="14"/>
+ <field name="TextAppearance_DeviceDefault_Widget_TabWidget" since="14"/>
+ <field name="TextAppearance_DeviceDefault_Widget_TextView" since="14"/>
+ <field name="TextAppearance_DeviceDefault_Widget_TextView_PopupMenu" since="14"/>
+ <field name="TextAppearance_DeviceDefault_Widget_TextView_SpinnerItem" since="14"/>
+ <field name="TextAppearance_DeviceDefault_WindowTitle" since="14"/>
+ <field name="TextAppearance_DialogWindowTitle"/>
+ <field name="TextAppearance_Holo" since="13"/>
+ <field name="TextAppearance_Holo_DialogWindowTitle" since="13"/>
+ <field name="TextAppearance_Holo_Inverse" since="13"/>
+ <field name="TextAppearance_Holo_Large" since="13"/>
+ <field name="TextAppearance_Holo_Large_Inverse" since="13"/>
+ <field name="TextAppearance_Holo_Medium" since="13"/>
+ <field name="TextAppearance_Holo_Medium_Inverse" since="13"/>
+ <field name="TextAppearance_Holo_SearchResult_Subtitle" since="13"/>
+ <field name="TextAppearance_Holo_SearchResult_Title" since="13"/>
+ <field name="TextAppearance_Holo_Small" since="13"/>
+ <field name="TextAppearance_Holo_Small_Inverse" since="13"/>
+ <field name="TextAppearance_Holo_Widget" since="13"/>
+ <field name="TextAppearance_Holo_Widget_ActionBar_Menu" since="14"/>
+ <field name="TextAppearance_Holo_Widget_ActionBar_Subtitle" since="13"/>
+ <field name="TextAppearance_Holo_Widget_ActionBar_Subtitle_Inverse" since="14"/>
+ <field name="TextAppearance_Holo_Widget_ActionBar_Title" since="13"/>
+ <field name="TextAppearance_Holo_Widget_ActionBar_Title_Inverse" since="14"/>
+ <field name="TextAppearance_Holo_Widget_ActionMode_Subtitle" since="13"/>
+ <field name="TextAppearance_Holo_Widget_ActionMode_Subtitle_Inverse" since="14"/>
+ <field name="TextAppearance_Holo_Widget_ActionMode_Title" since="13"/>
+ <field name="TextAppearance_Holo_Widget_ActionMode_Title_Inverse" since="14"/>
+ <field name="TextAppearance_Holo_Widget_Button" since="13"/>
+ <field name="TextAppearance_Holo_Widget_DropDownHint" since="13"/>
+ <field name="TextAppearance_Holo_Widget_DropDownItem" since="13"/>
+ <field name="TextAppearance_Holo_Widget_EditText" since="13"/>
+ <field name="TextAppearance_Holo_Widget_IconMenu_Item" since="13"/>
+ <field name="TextAppearance_Holo_Widget_PopupMenu" since="13"/>
+ <field name="TextAppearance_Holo_Widget_PopupMenu_Large" since="13"/>
+ <field name="TextAppearance_Holo_Widget_PopupMenu_Small" since="13"/>
+ <field name="TextAppearance_Holo_Widget_TabWidget" since="13"/>
+ <field name="TextAppearance_Holo_Widget_TextView" since="13"/>
+ <field name="TextAppearance_Holo_Widget_TextView_PopupMenu" since="13"/>
+ <field name="TextAppearance_Holo_Widget_TextView_SpinnerItem" since="13"/>
+ <field name="TextAppearance_Holo_WindowTitle" since="13"/>
+ <field name="TextAppearance_Inverse"/>
+ <field name="TextAppearance_Large"/>
+ <field name="TextAppearance_Large_Inverse"/>
+ <field name="TextAppearance_Material" since="21"/>
+ <field name="TextAppearance_Material_Body1" since="21"/>
+ <field name="TextAppearance_Material_Body2" since="21"/>
+ <field name="TextAppearance_Material_Button" since="21"/>
+ <field name="TextAppearance_Material_Caption" since="21"/>
+ <field name="TextAppearance_Material_DialogWindowTitle" since="21"/>
+ <field name="TextAppearance_Material_Display1" since="21"/>
+ <field name="TextAppearance_Material_Display2" since="21"/>
+ <field name="TextAppearance_Material_Display3" since="21"/>
+ <field name="TextAppearance_Material_Display4" since="21"/>
+ <field name="TextAppearance_Material_Headline" since="21"/>
+ <field name="TextAppearance_Material_Inverse" since="21"/>
+ <field name="TextAppearance_Material_Large" since="21"/>
+ <field name="TextAppearance_Material_Large_Inverse" since="21"/>
+ <field name="TextAppearance_Material_Medium" since="21"/>
+ <field name="TextAppearance_Material_Medium_Inverse" since="21"/>
+ <field name="TextAppearance_Material_Menu" since="21"/>
+ <field name="TextAppearance_Material_Notification" since="21"/>
+ <field name="TextAppearance_Material_Notification_Emphasis" since="21"/>
+ <field name="TextAppearance_Material_Notification_Info" since="21"/>
+ <field name="TextAppearance_Material_Notification_Line2" since="21"/>
+ <field name="TextAppearance_Material_Notification_Time" since="21"/>
+ <field name="TextAppearance_Material_Notification_Title" since="21"/>
+ <field name="TextAppearance_Material_SearchResult_Subtitle" since="21"/>
+ <field name="TextAppearance_Material_SearchResult_Title" since="21"/>
+ <field name="TextAppearance_Material_Small" since="21"/>
+ <field name="TextAppearance_Material_Small_Inverse" since="21"/>
+ <field name="TextAppearance_Material_Subhead" since="21"/>
+ <field name="TextAppearance_Material_Title" since="21"/>
+ <field name="TextAppearance_Material_Widget" since="21"/>
+ <field name="TextAppearance_Material_Widget_ActionBar_Menu" since="21"/>
+ <field name="TextAppearance_Material_Widget_ActionBar_Subtitle" since="21"/>
+ <field name="TextAppearance_Material_Widget_ActionBar_Subtitle_Inverse" since="21"/>
+ <field name="TextAppearance_Material_Widget_ActionBar_Title" since="21"/>
+ <field name="TextAppearance_Material_Widget_ActionBar_Title_Inverse" since="21"/>
+ <field name="TextAppearance_Material_Widget_ActionMode_Subtitle" since="21"/>
+ <field name="TextAppearance_Material_Widget_ActionMode_Subtitle_Inverse" since="21"/>
+ <field name="TextAppearance_Material_Widget_ActionMode_Title" since="21"/>
+ <field name="TextAppearance_Material_Widget_ActionMode_Title_Inverse" since="21"/>
+ <field name="TextAppearance_Material_Widget_Button" since="21"/>
+ <field name="TextAppearance_Material_Widget_Button_Borderless_Colored" since="24"/>
+ <field name="TextAppearance_Material_Widget_Button_Colored" since="24"/>
+ <field name="TextAppearance_Material_Widget_Button_Inverse" since="23"/>
+ <field name="TextAppearance_Material_Widget_DropDownHint" since="21"/>
+ <field name="TextAppearance_Material_Widget_DropDownItem" since="21"/>
+ <field name="TextAppearance_Material_Widget_EditText" since="21"/>
+ <field name="TextAppearance_Material_Widget_IconMenu_Item" since="21"/>
+ <field name="TextAppearance_Material_Widget_PopupMenu" since="21"/>
+ <field name="TextAppearance_Material_Widget_PopupMenu_Large" since="21"/>
+ <field name="TextAppearance_Material_Widget_PopupMenu_Small" since="21"/>
+ <field name="TextAppearance_Material_Widget_TabWidget" since="21"/>
+ <field name="TextAppearance_Material_Widget_TextView" since="21"/>
+ <field name="TextAppearance_Material_Widget_TextView_PopupMenu" since="21"/>
+ <field name="TextAppearance_Material_Widget_TextView_SpinnerItem" since="21"/>
+ <field name="TextAppearance_Material_Widget_Toolbar_Subtitle" since="21"/>
+ <field name="TextAppearance_Material_Widget_Toolbar_Title" since="21"/>
+ <field name="TextAppearance_Material_WindowTitle" since="21"/>
+ <field name="TextAppearance_Medium"/>
+ <field name="TextAppearance_Medium_Inverse"/>
+ <field name="TextAppearance_Small"/>
+ <field name="TextAppearance_Small_Inverse"/>
+ <field name="TextAppearance_StatusBar_EventContent" since="9"/>
+ <field name="TextAppearance_StatusBar_EventContent_Title" since="9"/>
+ <field name="TextAppearance_StatusBar_Icon" since="9"/>
+ <field name="TextAppearance_StatusBar_Title" since="9"/>
+ <field name="TextAppearance_SuggestionHighlight" since="14"/>
+ <field name="TextAppearance_Theme"/>
+ <field name="TextAppearance_Theme_Dialog"/>
+ <field name="TextAppearance_Widget"/>
+ <field name="TextAppearance_Widget_Button"/>
+ <field name="TextAppearance_Widget_DropDownHint"/>
+ <field name="TextAppearance_Widget_DropDownItem"/>
+ <field name="TextAppearance_Widget_EditText"/>
+ <field name="TextAppearance_Widget_IconMenu_Item"/>
+ <field name="TextAppearance_Widget_PopupMenu_Large" since="11"/>
+ <field name="TextAppearance_Widget_PopupMenu_Small" since="11"/>
+ <field name="TextAppearance_Widget_TabWidget"/>
+ <field name="TextAppearance_Widget_TextView"/>
+ <field name="TextAppearance_Widget_TextView_PopupMenu"/>
+ <field name="TextAppearance_Widget_TextView_SpinnerItem"/>
+ <field name="TextAppearance_WindowTitle"/>
+ <field name="Theme"/>
+ <field name="ThemeOverlay" since="21"/>
+ <field name="ThemeOverlay_Material" since="21"/>
+ <field name="ThemeOverlay_Material_ActionBar" since="21"/>
+ <field name="ThemeOverlay_Material_Dark" since="21"/>
+ <field name="ThemeOverlay_Material_Dark_ActionBar" since="21"/>
+ <field name="ThemeOverlay_Material_Dialog" since="23"/>
+ <field name="ThemeOverlay_Material_Dialog_Alert" since="23"/>
+ <field name="ThemeOverlay_Material_Light" since="21"/>
+ <field name="Theme_Black"/>
+ <field name="Theme_Black_NoTitleBar"/>
+ <field name="Theme_Black_NoTitleBar_Fullscreen"/>
+ <field name="Theme_DeviceDefault" since="14"/>
+ <field name="Theme_DeviceDefault_Dialog" since="14"/>
+ <field name="Theme_DeviceDefault_DialogWhenLarge" since="14"/>
+ <field name="Theme_DeviceDefault_DialogWhenLarge_NoActionBar" since="14"/>
+ <field name="Theme_DeviceDefault_Dialog_Alert" since="22"/>
+ <field name="Theme_DeviceDefault_Dialog_MinWidth" since="14"/>
+ <field name="Theme_DeviceDefault_Dialog_NoActionBar" since="14"/>
+ <field name="Theme_DeviceDefault_Dialog_NoActionBar_MinWidth" since="14"/>
+ <field name="Theme_DeviceDefault_InputMethod" since="14"/>
+ <field name="Theme_DeviceDefault_Light" since="14"/>
+ <field name="Theme_DeviceDefault_Light_DarkActionBar" since="14"/>
+ <field name="Theme_DeviceDefault_Light_Dialog" since="14"/>
+ <field name="Theme_DeviceDefault_Light_DialogWhenLarge" since="14"/>
+ <field name="Theme_DeviceDefault_Light_DialogWhenLarge_NoActionBar" since="14"/>
+ <field name="Theme_DeviceDefault_Light_Dialog_Alert" since="22"/>
+ <field name="Theme_DeviceDefault_Light_Dialog_MinWidth" since="14"/>
+ <field name="Theme_DeviceDefault_Light_Dialog_NoActionBar" since="14"/>
+ <field name="Theme_DeviceDefault_Light_Dialog_NoActionBar_MinWidth" since="14"/>
+ <field name="Theme_DeviceDefault_Light_NoActionBar" since="14"/>
+ <field name="Theme_DeviceDefault_Light_NoActionBar_Fullscreen" since="14"/>
+ <field name="Theme_DeviceDefault_Light_NoActionBar_Overscan" since="18"/>
+ <field name="Theme_DeviceDefault_Light_NoActionBar_TranslucentDecor" since="19"/>
+ <field name="Theme_DeviceDefault_Light_Panel" since="14"/>
+ <field name="Theme_DeviceDefault_NoActionBar" since="14"/>
+ <field name="Theme_DeviceDefault_NoActionBar_Fullscreen" since="14"/>
+ <field name="Theme_DeviceDefault_NoActionBar_Overscan" since="18"/>
+ <field name="Theme_DeviceDefault_NoActionBar_TranslucentDecor" since="19"/>
+ <field name="Theme_DeviceDefault_Panel" since="14"/>
+ <field name="Theme_DeviceDefault_Settings" since="21"/>
+ <field name="Theme_DeviceDefault_Wallpaper" since="14"/>
+ <field name="Theme_DeviceDefault_Wallpaper_NoTitleBar" since="14"/>
+ <field name="Theme_Dialog"/>
+ <field name="Theme_Holo" since="11"/>
+ <field name="Theme_Holo_Dialog" since="11"/>
+ <field name="Theme_Holo_DialogWhenLarge" since="11"/>
+ <field name="Theme_Holo_DialogWhenLarge_NoActionBar" since="11"/>
+ <field name="Theme_Holo_Dialog_MinWidth" since="11"/>
+ <field name="Theme_Holo_Dialog_NoActionBar" since="11"/>
+ <field name="Theme_Holo_Dialog_NoActionBar_MinWidth" since="11"/>
+ <field name="Theme_Holo_InputMethod" since="11"/>
+ <field name="Theme_Holo_Light" since="11"/>
+ <field name="Theme_Holo_Light_DarkActionBar" since="14"/>
+ <field name="Theme_Holo_Light_Dialog" since="11"/>
+ <field name="Theme_Holo_Light_DialogWhenLarge" since="11"/>
+ <field name="Theme_Holo_Light_DialogWhenLarge_NoActionBar" since="11"/>
+ <field name="Theme_Holo_Light_Dialog_MinWidth" since="11"/>
+ <field name="Theme_Holo_Light_Dialog_NoActionBar" since="11"/>
+ <field name="Theme_Holo_Light_Dialog_NoActionBar_MinWidth" since="11"/>
+ <field name="Theme_Holo_Light_NoActionBar" since="13"/>
+ <field name="Theme_Holo_Light_NoActionBar_Fullscreen" since="13"/>
+ <field name="Theme_Holo_Light_NoActionBar_Overscan" since="18"/>
+ <field name="Theme_Holo_Light_NoActionBar_TranslucentDecor" since="19"/>
+ <field name="Theme_Holo_Light_Panel" since="11"/>
+ <field name="Theme_Holo_NoActionBar" since="11"/>
+ <field name="Theme_Holo_NoActionBar_Fullscreen" since="11"/>
+ <field name="Theme_Holo_NoActionBar_Overscan" since="18"/>
+ <field name="Theme_Holo_NoActionBar_TranslucentDecor" since="19"/>
+ <field name="Theme_Holo_Panel" since="11"/>
+ <field name="Theme_Holo_Wallpaper" since="11"/>
+ <field name="Theme_Holo_Wallpaper_NoTitleBar" since="11"/>
+ <field name="Theme_InputMethod" since="3"/>
+ <field name="Theme_Light"/>
+ <field name="Theme_Light_NoTitleBar"/>
+ <field name="Theme_Light_NoTitleBar_Fullscreen"/>
+ <field name="Theme_Light_Panel" since="3"/>
+ <field name="Theme_Light_WallpaperSettings" since="5"/>
+ <field name="Theme_Material" since="21"/>
+ <field name="Theme_Material_Dialog" since="21"/>
+ <field name="Theme_Material_DialogWhenLarge" since="21"/>
+ <field name="Theme_Material_DialogWhenLarge_NoActionBar" since="21"/>
+ <field name="Theme_Material_Dialog_Alert" since="21"/>
+ <field name="Theme_Material_Dialog_MinWidth" since="21"/>
+ <field name="Theme_Material_Dialog_NoActionBar" since="21"/>
+ <field name="Theme_Material_Dialog_NoActionBar_MinWidth" since="21"/>
+ <field name="Theme_Material_Dialog_Presentation" since="21"/>
+ <field name="Theme_Material_InputMethod" since="21"/>
+ <field name="Theme_Material_Light" since="21"/>
+ <field name="Theme_Material_Light_DarkActionBar" since="21"/>
+ <field name="Theme_Material_Light_Dialog" since="21"/>
+ <field name="Theme_Material_Light_DialogWhenLarge" since="21"/>
+ <field name="Theme_Material_Light_DialogWhenLarge_DarkActionBar" since="24"/>
+ <field name="Theme_Material_Light_DialogWhenLarge_NoActionBar" since="21"/>
+ <field name="Theme_Material_Light_Dialog_Alert" since="21"/>
+ <field name="Theme_Material_Light_Dialog_MinWidth" since="21"/>
+ <field name="Theme_Material_Light_Dialog_NoActionBar" since="21"/>
+ <field name="Theme_Material_Light_Dialog_NoActionBar_MinWidth" since="21"/>
+ <field name="Theme_Material_Light_Dialog_Presentation" since="21"/>
+ <field name="Theme_Material_Light_LightStatusBar" since="23"/>
+ <field name="Theme_Material_Light_NoActionBar" since="21"/>
+ <field name="Theme_Material_Light_NoActionBar_Fullscreen" since="21"/>
+ <field name="Theme_Material_Light_NoActionBar_Overscan" since="21"/>
+ <field name="Theme_Material_Light_NoActionBar_TranslucentDecor" since="21"/>
+ <field name="Theme_Material_Light_Panel" since="21"/>
+ <field name="Theme_Material_Light_Voice" since="21"/>
+ <field name="Theme_Material_NoActionBar" since="21"/>
+ <field name="Theme_Material_NoActionBar_Fullscreen" since="21"/>
+ <field name="Theme_Material_NoActionBar_Overscan" since="21"/>
+ <field name="Theme_Material_NoActionBar_TranslucentDecor" since="21"/>
+ <field name="Theme_Material_Panel" since="21"/>
+ <field name="Theme_Material_Settings" since="21"/>
+ <field name="Theme_Material_Voice" since="21"/>
+ <field name="Theme_Material_Wallpaper" since="21"/>
+ <field name="Theme_Material_Wallpaper_NoTitleBar" since="21"/>
+ <field name="Theme_NoDisplay" since="3"/>
+ <field name="Theme_NoTitleBar"/>
+ <field name="Theme_NoTitleBar_Fullscreen"/>
+ <field name="Theme_NoTitleBar_OverlayActionModes" since="11"/>
+ <field name="Theme_Panel" since="3"/>
+ <field name="Theme_Translucent"/>
+ <field name="Theme_Translucent_NoTitleBar"/>
+ <field name="Theme_Translucent_NoTitleBar_Fullscreen"/>
+ <field name="Theme_Wallpaper" since="5"/>
+ <field name="Theme_WallpaperSettings" since="5"/>
+ <field name="Theme_Wallpaper_NoTitleBar" since="5"/>
+ <field name="Theme_Wallpaper_NoTitleBar_Fullscreen" since="5"/>
+ <field name="Theme_WithActionBar" since="11"/>
+ <field name="Widget"/>
+ <field name="Widget_AbsListView"/>
+ <field name="Widget_ActionBar" since="11"/>
+ <field name="Widget_ActionBar_TabBar" since="13"/>
+ <field name="Widget_ActionBar_TabText" since="13"/>
+ <field name="Widget_ActionBar_TabView" since="13"/>
+ <field name="Widget_ActionButton" since="11"/>
+ <field name="Widget_ActionButton_CloseMode" since="11"/>
+ <field name="Widget_ActionButton_Overflow" since="11"/>
+ <field name="Widget_AutoCompleteTextView"/>
+ <field name="Widget_Button"/>
+ <field name="Widget_Button_Inset"/>
+ <field name="Widget_Button_Small"/>
+ <field name="Widget_Button_Toggle"/>
+ <field name="Widget_CalendarView" since="11"/>
+ <field name="Widget_CompoundButton"/>
+ <field name="Widget_CompoundButton_CheckBox"/>
+ <field name="Widget_CompoundButton_RadioButton"/>
+ <field name="Widget_CompoundButton_Star"/>
+ <field name="Widget_DatePicker" since="11"/>
+ <field name="Widget_DeviceDefault" since="14"/>
+ <field name="Widget_DeviceDefault_ActionBar" since="14"/>
+ <field name="Widget_DeviceDefault_ActionBar_Solid" since="14"/>
+ <field name="Widget_DeviceDefault_ActionBar_TabBar" since="14"/>
+ <field name="Widget_DeviceDefault_ActionBar_TabText" since="14"/>
+ <field name="Widget_DeviceDefault_ActionBar_TabView" since="14"/>
+ <field name="Widget_DeviceDefault_ActionButton" since="14"/>
+ <field name="Widget_DeviceDefault_ActionButton_CloseMode" since="14"/>
+ <field name="Widget_DeviceDefault_ActionButton_Overflow" since="14"/>
+ <field name="Widget_DeviceDefault_ActionButton_TextButton" since="14"/>
+ <field name="Widget_DeviceDefault_ActionMode" since="14"/>
+ <field name="Widget_DeviceDefault_AutoCompleteTextView" since="14"/>
+ <field name="Widget_DeviceDefault_Button" since="14"/>
+ <field name="Widget_DeviceDefault_Button_Borderless" since="14"/>
+ <field name="Widget_DeviceDefault_Button_Borderless_Small" since="14"/>
+ <field name="Widget_DeviceDefault_Button_Inset" since="14"/>
+ <field name="Widget_DeviceDefault_Button_Small" since="14"/>
+ <field name="Widget_DeviceDefault_Button_Toggle" since="14"/>
+ <field name="Widget_DeviceDefault_CalendarView" since="14"/>
+ <field name="Widget_DeviceDefault_CheckedTextView" since="17"/>
+ <field name="Widget_DeviceDefault_CompoundButton_CheckBox" since="14"/>
+ <field name="Widget_DeviceDefault_CompoundButton_RadioButton" since="14"/>
+ <field name="Widget_DeviceDefault_CompoundButton_Star" since="14"/>
+ <field name="Widget_DeviceDefault_DatePicker" since="14"/>
+ <field name="Widget_DeviceDefault_DropDownItem" since="14"/>
+ <field name="Widget_DeviceDefault_DropDownItem_Spinner" since="14"/>
+ <field name="Widget_DeviceDefault_EditText" since="14"/>
+ <field name="Widget_DeviceDefault_ExpandableListView" since="14"/>
+ <field name="Widget_DeviceDefault_FastScroll" since="21"/>
+ <field name="Widget_DeviceDefault_GridView" since="14"/>
+ <field name="Widget_DeviceDefault_HorizontalScrollView" since="14"/>
+ <field name="Widget_DeviceDefault_ImageButton" since="14"/>
+ <field name="Widget_DeviceDefault_Light" since="14"/>
+ <field name="Widget_DeviceDefault_Light_ActionBar" since="14"/>
+ <field name="Widget_DeviceDefault_Light_ActionBar_Solid" since="14"/>
+ <field name="Widget_DeviceDefault_Light_ActionBar_Solid_Inverse" since="14" deprecated="21"/>
+ <field name="Widget_DeviceDefault_Light_ActionBar_TabBar" since="14"/>
+ <field name="Widget_DeviceDefault_Light_ActionBar_TabBar_Inverse" since="14" deprecated="21"/>
+ <field name="Widget_DeviceDefault_Light_ActionBar_TabText" since="14"/>
+ <field name="Widget_DeviceDefault_Light_ActionBar_TabText_Inverse" since="14" deprecated="21"/>
+ <field name="Widget_DeviceDefault_Light_ActionBar_TabView" since="14"/>
+ <field name="Widget_DeviceDefault_Light_ActionBar_TabView_Inverse" since="14" deprecated="21"/>
+ <field name="Widget_DeviceDefault_Light_ActionButton" since="14"/>
+ <field name="Widget_DeviceDefault_Light_ActionButton_CloseMode" since="14"/>
+ <field name="Widget_DeviceDefault_Light_ActionButton_Overflow" since="14"/>
+ <field name="Widget_DeviceDefault_Light_ActionMode" since="14"/>
+ <field name="Widget_DeviceDefault_Light_ActionMode_Inverse" since="14" deprecated="21"/>
+ <field name="Widget_DeviceDefault_Light_AutoCompleteTextView" since="14"/>
+ <field name="Widget_DeviceDefault_Light_Button" since="14"/>
+ <field name="Widget_DeviceDefault_Light_Button_Borderless_Small" since="14"/>
+ <field name="Widget_DeviceDefault_Light_Button_Inset" since="14"/>
+ <field name="Widget_DeviceDefault_Light_Button_Small" since="14"/>
+ <field name="Widget_DeviceDefault_Light_Button_Toggle" since="14"/>
+ <field name="Widget_DeviceDefault_Light_CalendarView" since="14"/>
+ <field name="Widget_DeviceDefault_Light_CheckedTextView" since="17"/>
+ <field name="Widget_DeviceDefault_Light_CompoundButton_CheckBox" since="14"/>
+ <field name="Widget_DeviceDefault_Light_CompoundButton_RadioButton" since="14"/>
+ <field name="Widget_DeviceDefault_Light_CompoundButton_Star" since="14"/>
+ <field name="Widget_DeviceDefault_Light_DropDownItem" since="14"/>
+ <field name="Widget_DeviceDefault_Light_DropDownItem_Spinner" since="14"/>
+ <field name="Widget_DeviceDefault_Light_EditText" since="14"/>
+ <field name="Widget_DeviceDefault_Light_ExpandableListView" since="14"/>
+ <field name="Widget_DeviceDefault_Light_FastScroll" since="21"/>
+ <field name="Widget_DeviceDefault_Light_GridView" since="14"/>
+ <field name="Widget_DeviceDefault_Light_HorizontalScrollView" since="14"/>
+ <field name="Widget_DeviceDefault_Light_ImageButton" since="14"/>
+ <field name="Widget_DeviceDefault_Light_ListPopupWindow" since="14"/>
+ <field name="Widget_DeviceDefault_Light_ListView" since="14"/>
+ <field name="Widget_DeviceDefault_Light_ListView_DropDown" since="14"/>
+ <field name="Widget_DeviceDefault_Light_MediaRouteButton" since="16"/>
+ <field name="Widget_DeviceDefault_Light_PopupMenu" since="14"/>
+ <field name="Widget_DeviceDefault_Light_PopupWindow" since="14"/>
+ <field name="Widget_DeviceDefault_Light_ProgressBar" since="14"/>
+ <field name="Widget_DeviceDefault_Light_ProgressBar_Horizontal" since="14"/>
+ <field name="Widget_DeviceDefault_Light_ProgressBar_Inverse" since="14"/>
+ <field name="Widget_DeviceDefault_Light_ProgressBar_Large" since="14"/>
+ <field name="Widget_DeviceDefault_Light_ProgressBar_Large_Inverse" since="14"/>
+ <field name="Widget_DeviceDefault_Light_ProgressBar_Small" since="14"/>
+ <field name="Widget_DeviceDefault_Light_ProgressBar_Small_Inverse" since="14"/>
+ <field name="Widget_DeviceDefault_Light_ProgressBar_Small_Title" since="14"/>
+ <field name="Widget_DeviceDefault_Light_RatingBar" since="14"/>
+ <field name="Widget_DeviceDefault_Light_RatingBar_Indicator" since="14"/>
+ <field name="Widget_DeviceDefault_Light_RatingBar_Small" since="14"/>
+ <field name="Widget_DeviceDefault_Light_ScrollView" since="14"/>
+ <field name="Widget_DeviceDefault_Light_SeekBar" since="14"/>
+ <field name="Widget_DeviceDefault_Light_Spinner" since="14"/>
+ <field name="Widget_DeviceDefault_Light_StackView" since="21"/>
+ <field name="Widget_DeviceDefault_Light_Tab" since="14"/>
+ <field name="Widget_DeviceDefault_Light_TabWidget" since="14"/>
+ <field name="Widget_DeviceDefault_Light_TextView" since="14"/>
+ <field name="Widget_DeviceDefault_Light_TextView_SpinnerItem" since="14"/>
+ <field name="Widget_DeviceDefault_Light_WebTextView" since="14"/>
+ <field name="Widget_DeviceDefault_Light_WebView" since="14"/>
+ <field name="Widget_DeviceDefault_ListPopupWindow" since="14"/>
+ <field name="Widget_DeviceDefault_ListView" since="14"/>
+ <field name="Widget_DeviceDefault_ListView_DropDown" since="14"/>
+ <field name="Widget_DeviceDefault_MediaRouteButton" since="16"/>
+ <field name="Widget_DeviceDefault_PopupMenu" since="14"/>
+ <field name="Widget_DeviceDefault_PopupWindow" since="14"/>
+ <field name="Widget_DeviceDefault_ProgressBar" since="14"/>
+ <field name="Widget_DeviceDefault_ProgressBar_Horizontal" since="14"/>
+ <field name="Widget_DeviceDefault_ProgressBar_Large" since="14"/>
+ <field name="Widget_DeviceDefault_ProgressBar_Small" since="14"/>
+ <field name="Widget_DeviceDefault_ProgressBar_Small_Title" since="14"/>
+ <field name="Widget_DeviceDefault_RatingBar" since="14"/>
+ <field name="Widget_DeviceDefault_RatingBar_Indicator" since="14"/>
+ <field name="Widget_DeviceDefault_RatingBar_Small" since="14"/>
+ <field name="Widget_DeviceDefault_ScrollView" since="14"/>
+ <field name="Widget_DeviceDefault_SeekBar" since="14"/>
+ <field name="Widget_DeviceDefault_Spinner" since="14"/>
+ <field name="Widget_DeviceDefault_StackView" since="21"/>
+ <field name="Widget_DeviceDefault_Tab" since="14"/>
+ <field name="Widget_DeviceDefault_TabWidget" since="14"/>
+ <field name="Widget_DeviceDefault_TextView" since="14"/>
+ <field name="Widget_DeviceDefault_TextView_SpinnerItem" since="14"/>
+ <field name="Widget_DeviceDefault_WebTextView" since="14"/>
+ <field name="Widget_DeviceDefault_WebView" since="14"/>
+ <field name="Widget_DropDownItem"/>
+ <field name="Widget_DropDownItem_Spinner"/>
+ <field name="Widget_EditText"/>
+ <field name="Widget_ExpandableListView"/>
+ <field name="Widget_FastScroll" since="21"/>
+ <field name="Widget_FragmentBreadCrumbs" since="11"/>
+ <field name="Widget_Gallery"/>
+ <field name="Widget_GridView"/>
+ <field name="Widget_Holo" since="11"/>
+ <field name="Widget_Holo_ActionBar" since="11"/>
+ <field name="Widget_Holo_ActionBar_Solid" since="14"/>
+ <field name="Widget_Holo_ActionBar_TabBar" since="13"/>
+ <field name="Widget_Holo_ActionBar_TabText" since="13"/>
+ <field name="Widget_Holo_ActionBar_TabView" since="13"/>
+ <field name="Widget_Holo_ActionButton" since="11"/>
+ <field name="Widget_Holo_ActionButton_CloseMode" since="11"/>
+ <field name="Widget_Holo_ActionButton_Overflow" since="11"/>
+ <field name="Widget_Holo_ActionButton_TextButton" since="11"/>
+ <field name="Widget_Holo_ActionMode" since="11"/>
+ <field name="Widget_Holo_AutoCompleteTextView" since="11"/>
+ <field name="Widget_Holo_Button" since="11"/>
+ <field name="Widget_Holo_Button_Borderless" since="11"/>
+ <field name="Widget_Holo_Button_Borderless_Small" since="14"/>
+ <field name="Widget_Holo_Button_Inset" since="11"/>
+ <field name="Widget_Holo_Button_Small" since="11"/>
+ <field name="Widget_Holo_Button_Toggle" since="11"/>
+ <field name="Widget_Holo_CalendarView" since="11"/>
+ <field name="Widget_Holo_CheckedTextView" since="17"/>
+ <field name="Widget_Holo_CompoundButton_CheckBox" since="11"/>
+ <field name="Widget_Holo_CompoundButton_RadioButton" since="11"/>
+ <field name="Widget_Holo_CompoundButton_Star" since="11"/>
+ <field name="Widget_Holo_DatePicker" since="11"/>
+ <field name="Widget_Holo_DropDownItem" since="11"/>
+ <field name="Widget_Holo_DropDownItem_Spinner" since="11"/>
+ <field name="Widget_Holo_EditText" since="11"/>
+ <field name="Widget_Holo_ExpandableListView" since="11"/>
+ <field name="Widget_Holo_GridView" since="11"/>
+ <field name="Widget_Holo_HorizontalScrollView" since="11"/>
+ <field name="Widget_Holo_ImageButton" since="11"/>
+ <field name="Widget_Holo_Light" since="11"/>
+ <field name="Widget_Holo_Light_ActionBar" since="11"/>
+ <field name="Widget_Holo_Light_ActionBar_Solid" since="14"/>
+ <field name="Widget_Holo_Light_ActionBar_Solid_Inverse" since="14"/>
+ <field name="Widget_Holo_Light_ActionBar_TabBar" since="13"/>
+ <field name="Widget_Holo_Light_ActionBar_TabBar_Inverse" since="14"/>
+ <field name="Widget_Holo_Light_ActionBar_TabText" since="13"/>
+ <field name="Widget_Holo_Light_ActionBar_TabText_Inverse" since="14"/>
+ <field name="Widget_Holo_Light_ActionBar_TabView" since="13"/>
+ <field name="Widget_Holo_Light_ActionBar_TabView_Inverse" since="14"/>
+ <field name="Widget_Holo_Light_ActionButton" since="11"/>
+ <field name="Widget_Holo_Light_ActionButton_CloseMode" since="11"/>
+ <field name="Widget_Holo_Light_ActionButton_Overflow" since="11"/>
+ <field name="Widget_Holo_Light_ActionMode" since="11"/>
+ <field name="Widget_Holo_Light_ActionMode_Inverse" since="14"/>
+ <field name="Widget_Holo_Light_AutoCompleteTextView" since="11"/>
+ <field name="Widget_Holo_Light_Button" since="11"/>
+ <field name="Widget_Holo_Light_Button_Borderless_Small" since="14"/>
+ <field name="Widget_Holo_Light_Button_Inset" since="11"/>
+ <field name="Widget_Holo_Light_Button_Small" since="11"/>
+ <field name="Widget_Holo_Light_Button_Toggle" since="11"/>
+ <field name="Widget_Holo_Light_CalendarView" since="11"/>
+ <field name="Widget_Holo_Light_CheckedTextView" since="17"/>
+ <field name="Widget_Holo_Light_CompoundButton_CheckBox" since="11"/>
+ <field name="Widget_Holo_Light_CompoundButton_RadioButton" since="11"/>
+ <field name="Widget_Holo_Light_CompoundButton_Star" since="11"/>
+ <field name="Widget_Holo_Light_DropDownItem" since="11"/>
+ <field name="Widget_Holo_Light_DropDownItem_Spinner" since="11"/>
+ <field name="Widget_Holo_Light_EditText" since="11"/>
+ <field name="Widget_Holo_Light_ExpandableListView" since="11"/>
+ <field name="Widget_Holo_Light_GridView" since="11"/>
+ <field name="Widget_Holo_Light_HorizontalScrollView" since="11"/>
+ <field name="Widget_Holo_Light_ImageButton" since="11"/>
+ <field name="Widget_Holo_Light_ListPopupWindow" since="11"/>
+ <field name="Widget_Holo_Light_ListView" since="11"/>
+ <field name="Widget_Holo_Light_ListView_DropDown" since="11"/>
+ <field name="Widget_Holo_Light_MediaRouteButton" since="16"/>
+ <field name="Widget_Holo_Light_PopupMenu" since="11"/>
+ <field name="Widget_Holo_Light_PopupWindow" since="11"/>
+ <field name="Widget_Holo_Light_ProgressBar" since="11"/>
+ <field name="Widget_Holo_Light_ProgressBar_Horizontal" since="11"/>
+ <field name="Widget_Holo_Light_ProgressBar_Inverse" since="11"/>
+ <field name="Widget_Holo_Light_ProgressBar_Large" since="11"/>
+ <field name="Widget_Holo_Light_ProgressBar_Large_Inverse" since="11"/>
+ <field name="Widget_Holo_Light_ProgressBar_Small" since="11"/>
+ <field name="Widget_Holo_Light_ProgressBar_Small_Inverse" since="11"/>
+ <field name="Widget_Holo_Light_ProgressBar_Small_Title" since="11"/>
+ <field name="Widget_Holo_Light_RatingBar" since="11"/>
+ <field name="Widget_Holo_Light_RatingBar_Indicator" since="11"/>
+ <field name="Widget_Holo_Light_RatingBar_Small" since="11"/>
+ <field name="Widget_Holo_Light_ScrollView" since="11"/>
+ <field name="Widget_Holo_Light_SeekBar" since="11"/>
+ <field name="Widget_Holo_Light_Spinner" since="11"/>
+ <field name="Widget_Holo_Light_Tab" since="11"/>
+ <field name="Widget_Holo_Light_TabWidget" since="11"/>
+ <field name="Widget_Holo_Light_TextView" since="11"/>
+ <field name="Widget_Holo_Light_TextView_SpinnerItem" since="11"/>
+ <field name="Widget_Holo_Light_WebTextView" since="11"/>
+ <field name="Widget_Holo_Light_WebView" since="11"/>
+ <field name="Widget_Holo_ListPopupWindow" since="11"/>
+ <field name="Widget_Holo_ListView" since="11"/>
+ <field name="Widget_Holo_ListView_DropDown" since="11"/>
+ <field name="Widget_Holo_MediaRouteButton" since="16"/>
+ <field name="Widget_Holo_PopupMenu" since="11"/>
+ <field name="Widget_Holo_PopupWindow" since="11"/>
+ <field name="Widget_Holo_ProgressBar" since="11"/>
+ <field name="Widget_Holo_ProgressBar_Horizontal" since="11"/>
+ <field name="Widget_Holo_ProgressBar_Large" since="11"/>
+ <field name="Widget_Holo_ProgressBar_Small" since="11"/>
+ <field name="Widget_Holo_ProgressBar_Small_Title" since="11"/>
+ <field name="Widget_Holo_RatingBar" since="11"/>
+ <field name="Widget_Holo_RatingBar_Indicator" since="11"/>
+ <field name="Widget_Holo_RatingBar_Small" since="11"/>
+ <field name="Widget_Holo_ScrollView" since="11"/>
+ <field name="Widget_Holo_SeekBar" since="11"/>
+ <field name="Widget_Holo_Spinner" since="11"/>
+ <field name="Widget_Holo_Tab" since="11"/>
+ <field name="Widget_Holo_TabWidget" since="11"/>
+ <field name="Widget_Holo_TextView" since="11"/>
+ <field name="Widget_Holo_TextView_SpinnerItem" since="11"/>
+ <field name="Widget_Holo_WebTextView" since="11"/>
+ <field name="Widget_Holo_WebView" since="11"/>
+ <field name="Widget_ImageButton"/>
+ <field name="Widget_ImageWell"/>
+ <field name="Widget_KeyboardView" since="3"/>
+ <field name="Widget_ListPopupWindow" since="11"/>
+ <field name="Widget_ListView"/>
+ <field name="Widget_ListView_DropDown"/>
+ <field name="Widget_ListView_Menu"/>
+ <field name="Widget_ListView_White"/>
+ <field name="Widget_Material" since="21"/>
+ <field name="Widget_Material_ActionBar" since="21"/>
+ <field name="Widget_Material_ActionBar_Solid" since="21"/>
+ <field name="Widget_Material_ActionBar_TabBar" since="21"/>
+ <field name="Widget_Material_ActionBar_TabText" since="21"/>
+ <field name="Widget_Material_ActionBar_TabView" since="21"/>
+ <field name="Widget_Material_ActionButton" since="21"/>
+ <field name="Widget_Material_ActionButton_CloseMode" since="21"/>
+ <field name="Widget_Material_ActionButton_Overflow" since="21"/>
+ <field name="Widget_Material_ActionMode" since="21"/>
+ <field name="Widget_Material_AutoCompleteTextView" since="21"/>
+ <field name="Widget_Material_Button" since="21"/>
+ <field name="Widget_Material_ButtonBar" since="21"/>
+ <field name="Widget_Material_ButtonBar_AlertDialog" since="21"/>
+ <field name="Widget_Material_Button_Borderless" since="21"/>
+ <field name="Widget_Material_Button_Borderless_Colored" since="21"/>
+ <field name="Widget_Material_Button_Borderless_Small" since="21"/>
+ <field name="Widget_Material_Button_Colored" since="23"/>
+ <field name="Widget_Material_Button_Inset" since="21"/>
+ <field name="Widget_Material_Button_Small" since="21"/>
+ <field name="Widget_Material_Button_Toggle" since="21"/>
+ <field name="Widget_Material_CalendarView" since="21"/>
+ <field name="Widget_Material_CheckedTextView" since="21"/>
+ <field name="Widget_Material_CompoundButton_CheckBox" since="21"/>
+ <field name="Widget_Material_CompoundButton_RadioButton" since="21"/>
+ <field name="Widget_Material_CompoundButton_Star" since="21"/>
+ <field name="Widget_Material_CompoundButton_Switch" since="24"/>
+ <field name="Widget_Material_DatePicker" since="21"/>
+ <field name="Widget_Material_DropDownItem" since="21"/>
+ <field name="Widget_Material_DropDownItem_Spinner" since="21"/>
+ <field name="Widget_Material_EditText" since="21"/>
+ <field name="Widget_Material_ExpandableListView" since="21"/>
+ <field name="Widget_Material_FastScroll" since="21"/>
+ <field name="Widget_Material_GridView" since="21"/>
+ <field name="Widget_Material_HorizontalScrollView" since="21"/>
+ <field name="Widget_Material_ImageButton" since="21"/>
+ <field name="Widget_Material_Light" since="21"/>
+ <field name="Widget_Material_Light_ActionBar" since="21"/>
+ <field name="Widget_Material_Light_ActionBar_Solid" since="21"/>
+ <field name="Widget_Material_Light_ActionBar_TabBar" since="21"/>
+ <field name="Widget_Material_Light_ActionBar_TabText" since="21"/>
+ <field name="Widget_Material_Light_ActionBar_TabView" since="21"/>
+ <field name="Widget_Material_Light_ActionButton" since="21"/>
+ <field name="Widget_Material_Light_ActionButton_CloseMode" since="21"/>
+ <field name="Widget_Material_Light_ActionButton_Overflow" since="21"/>
+ <field name="Widget_Material_Light_ActionMode" since="21"/>
+ <field name="Widget_Material_Light_AutoCompleteTextView" since="21"/>
+ <field name="Widget_Material_Light_Button" since="21"/>
+ <field name="Widget_Material_Light_ButtonBar" since="21"/>
+ <field name="Widget_Material_Light_ButtonBar_AlertDialog" since="21"/>
+ <field name="Widget_Material_Light_Button_Borderless" since="21"/>
+ <field name="Widget_Material_Light_Button_Borderless_Colored" since="21"/>
+ <field name="Widget_Material_Light_Button_Borderless_Small" since="21"/>
+ <field name="Widget_Material_Light_Button_Inset" since="21"/>
+ <field name="Widget_Material_Light_Button_Small" since="21"/>
+ <field name="Widget_Material_Light_Button_Toggle" since="21"/>
+ <field name="Widget_Material_Light_CalendarView" since="21"/>
+ <field name="Widget_Material_Light_CheckedTextView" since="21"/>
+ <field name="Widget_Material_Light_CompoundButton_CheckBox" since="21"/>
+ <field name="Widget_Material_Light_CompoundButton_RadioButton" since="21"/>
+ <field name="Widget_Material_Light_CompoundButton_Star" since="21"/>
+ <field name="Widget_Material_Light_CompoundButton_Switch" since="24"/>
+ <field name="Widget_Material_Light_DatePicker" since="21"/>
+ <field name="Widget_Material_Light_DropDownItem" since="21"/>
+ <field name="Widget_Material_Light_DropDownItem_Spinner" since="21"/>
+ <field name="Widget_Material_Light_EditText" since="21"/>
+ <field name="Widget_Material_Light_ExpandableListView" since="21"/>
+ <field name="Widget_Material_Light_FastScroll" since="21"/>
+ <field name="Widget_Material_Light_GridView" since="21"/>
+ <field name="Widget_Material_Light_HorizontalScrollView" since="21"/>
+ <field name="Widget_Material_Light_ImageButton" since="21"/>
+ <field name="Widget_Material_Light_ListPopupWindow" since="21"/>
+ <field name="Widget_Material_Light_ListView" since="21"/>
+ <field name="Widget_Material_Light_ListView_DropDown" since="21"/>
+ <field name="Widget_Material_Light_MediaRouteButton" since="21"/>
+ <field name="Widget_Material_Light_NumberPicker" since="24"/>
+ <field name="Widget_Material_Light_PopupMenu" since="21"/>
+ <field name="Widget_Material_Light_PopupMenu_Overflow" since="21"/>
+ <field name="Widget_Material_Light_PopupWindow" since="21"/>
+ <field name="Widget_Material_Light_ProgressBar" since="21"/>
+ <field name="Widget_Material_Light_ProgressBar_Horizontal" since="21"/>
+ <field name="Widget_Material_Light_ProgressBar_Inverse" since="21"/>
+ <field name="Widget_Material_Light_ProgressBar_Large" since="21"/>
+ <field name="Widget_Material_Light_ProgressBar_Large_Inverse" since="21"/>
+ <field name="Widget_Material_Light_ProgressBar_Small" since="21"/>
+ <field name="Widget_Material_Light_ProgressBar_Small_Inverse" since="21"/>
+ <field name="Widget_Material_Light_ProgressBar_Small_Title" since="21"/>
+ <field name="Widget_Material_Light_RatingBar" since="21"/>
+ <field name="Widget_Material_Light_RatingBar_Indicator" since="21"/>
+ <field name="Widget_Material_Light_RatingBar_Small" since="21"/>
+ <field name="Widget_Material_Light_ScrollView" since="21"/>
+ <field name="Widget_Material_Light_SearchView" since="21"/>
+ <field name="Widget_Material_Light_SeekBar" since="21"/>
+ <field name="Widget_Material_Light_SegmentedButton" since="21"/>
+ <field name="Widget_Material_Light_Spinner" since="21"/>
+ <field name="Widget_Material_Light_Spinner_Underlined" since="21"/>
+ <field name="Widget_Material_Light_StackView" since="21"/>
+ <field name="Widget_Material_Light_Tab" since="21"/>
+ <field name="Widget_Material_Light_TabWidget" since="21"/>
+ <field name="Widget_Material_Light_TextView" since="21"/>
+ <field name="Widget_Material_Light_TextView_SpinnerItem" since="21"/>
+ <field name="Widget_Material_Light_TimePicker" since="21"/>
+ <field name="Widget_Material_Light_WebTextView" since="21"/>
+ <field name="Widget_Material_Light_WebView" since="21"/>
+ <field name="Widget_Material_ListPopupWindow" since="21"/>
+ <field name="Widget_Material_ListView" since="21"/>
+ <field name="Widget_Material_ListView_DropDown" since="21"/>
+ <field name="Widget_Material_MediaRouteButton" since="21"/>
+ <field name="Widget_Material_NumberPicker" since="24"/>
+ <field name="Widget_Material_PopupMenu" since="21"/>
+ <field name="Widget_Material_PopupMenu_Overflow" since="21"/>
+ <field name="Widget_Material_PopupWindow" since="21"/>
+ <field name="Widget_Material_ProgressBar" since="21"/>
+ <field name="Widget_Material_ProgressBar_Horizontal" since="21"/>
+ <field name="Widget_Material_ProgressBar_Large" since="21"/>
+ <field name="Widget_Material_ProgressBar_Small" since="21"/>
+ <field name="Widget_Material_ProgressBar_Small_Title" since="21"/>
+ <field name="Widget_Material_RatingBar" since="21"/>
+ <field name="Widget_Material_RatingBar_Indicator" since="21"/>
+ <field name="Widget_Material_RatingBar_Small" since="21"/>
+ <field name="Widget_Material_ScrollView" since="21"/>
+ <field name="Widget_Material_SearchView" since="21"/>
+ <field name="Widget_Material_SeekBar" since="21"/>
+ <field name="Widget_Material_SeekBar_Discrete" since="24"/>
+ <field name="Widget_Material_SegmentedButton" since="21"/>
+ <field name="Widget_Material_Spinner" since="21"/>
+ <field name="Widget_Material_Spinner_Underlined" since="21"/>
+ <field name="Widget_Material_StackView" since="21"/>
+ <field name="Widget_Material_Tab" since="21"/>
+ <field name="Widget_Material_TabWidget" since="21"/>
+ <field name="Widget_Material_TextView" since="21"/>
+ <field name="Widget_Material_TextView_SpinnerItem" since="21"/>
+ <field name="Widget_Material_TimePicker" since="21"/>
+ <field name="Widget_Material_Toolbar" since="21"/>
+ <field name="Widget_Material_Toolbar_Button_Navigation" since="21"/>
+ <field name="Widget_Material_WebTextView" since="21"/>
+ <field name="Widget_Material_WebView" since="21"/>
+ <field name="Widget_PopupMenu" since="11"/>
+ <field name="Widget_PopupWindow"/>
+ <field name="Widget_ProgressBar"/>
+ <field name="Widget_ProgressBar_Horizontal"/>
+ <field name="Widget_ProgressBar_Inverse" since="4"/>
+ <field name="Widget_ProgressBar_Large"/>
+ <field name="Widget_ProgressBar_Large_Inverse" since="4"/>
+ <field name="Widget_ProgressBar_Small"/>
+ <field name="Widget_ProgressBar_Small_Inverse" since="4"/>
+ <field name="Widget_RatingBar"/>
+ <field name="Widget_ScrollView"/>
+ <field name="Widget_SeekBar"/>
+ <field name="Widget_Spinner"/>
+ <field name="Widget_Spinner_DropDown" since="11"/>
+ <field name="Widget_StackView" since="21"/>
+ <field name="Widget_TabWidget"/>
+ <field name="Widget_TextView"/>
+ <field name="Widget_TextView_PopupMenu"/>
+ <field name="Widget_TextView_SpinnerItem"/>
+ <field name="Widget_Toolbar" since="21"/>
+ <field name="Widget_Toolbar_Button_Navigation" since="21"/>
+ <field name="Widget_WebView"/>
+ </class>
+ <class name="android/R$transition" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="explode"/>
+ <field name="fade"/>
+ <field name="move"/>
+ <field name="no_transition"/>
+ <field name="slide_bottom"/>
+ <field name="slide_left"/>
+ <field name="slide_right"/>
+ <field name="slide_top"/>
+ </class>
+ <class name="android/R$xml" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/accessibilityservice/AccessibilityButtonController" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="isAccessibilityButtonAvailable()Z"/>
+ <method name="registerAccessibilityButtonCallback(Landroid/accessibilityservice/AccessibilityButtonController$AccessibilityButtonCallback;)V"/>
+ <method name="registerAccessibilityButtonCallback(Landroid/accessibilityservice/AccessibilityButtonController$AccessibilityButtonCallback;Landroid/os/Handler;)V"/>
+ <method name="unregisterAccessibilityButtonCallback(Landroid/accessibilityservice/AccessibilityButtonController$AccessibilityButtonCallback;)V"/>
+ </class>
+ <class name="android/accessibilityservice/AccessibilityButtonController$AccessibilityButtonCallback" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onAvailabilityChanged(Landroid/accessibilityservice/AccessibilityButtonController;Z)V"/>
+ <method name="onClicked(Landroid/accessibilityservice/AccessibilityButtonController;)V"/>
+ </class>
+ <class name="android/accessibilityservice/AccessibilityService" since="4">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="disableSelf()V" since="24"/>
+ <method name="dispatchGesture(Landroid/accessibilityservice/GestureDescription;Landroid/accessibilityservice/AccessibilityService$GestureResultCallback;Landroid/os/Handler;)Z" since="24"/>
+ <method name="findFocus(I)Landroid/view/accessibility/AccessibilityNodeInfo;" since="21"/>
+ <method name="getAccessibilityButtonController()Landroid/accessibilityservice/AccessibilityButtonController;" since="26"/>
+ <method name="getFingerprintGestureController()Landroid/accessibilityservice/FingerprintGestureController;" since="26"/>
+ <method name="getMagnificationController()Landroid/accessibilityservice/AccessibilityService$MagnificationController;" since="24"/>
+ <method name="getRootInActiveWindow()Landroid/view/accessibility/AccessibilityNodeInfo;" since="16"/>
+ <method name="getServiceInfo()Landroid/accessibilityservice/AccessibilityServiceInfo;" since="16"/>
+ <method name="getSoftKeyboardController()Landroid/accessibilityservice/AccessibilityService$SoftKeyboardController;" since="24"/>
+ <method name="getWindows()Ljava/util/List;" since="21"/>
+ <method name="onAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V"/>
+ <method name="onGesture(I)Z" since="16"/>
+ <method name="onInterrupt()V"/>
+ <method name="onKeyEvent(Landroid/view/KeyEvent;)Z" since="18"/>
+ <method name="onServiceConnected()V"/>
+ <method name="performGlobalAction(I)Z" since="16"/>
+ <method name="setServiceInfo(Landroid/accessibilityservice/AccessibilityServiceInfo;)V"/>
+ <field name="GESTURE_SWIPE_DOWN" since="16"/>
+ <field name="GESTURE_SWIPE_DOWN_AND_LEFT" since="16"/>
+ <field name="GESTURE_SWIPE_DOWN_AND_RIGHT" since="16"/>
+ <field name="GESTURE_SWIPE_DOWN_AND_UP" since="16"/>
+ <field name="GESTURE_SWIPE_LEFT" since="16"/>
+ <field name="GESTURE_SWIPE_LEFT_AND_DOWN" since="16"/>
+ <field name="GESTURE_SWIPE_LEFT_AND_RIGHT" since="16"/>
+ <field name="GESTURE_SWIPE_LEFT_AND_UP" since="16"/>
+ <field name="GESTURE_SWIPE_RIGHT" since="16"/>
+ <field name="GESTURE_SWIPE_RIGHT_AND_DOWN" since="16"/>
+ <field name="GESTURE_SWIPE_RIGHT_AND_LEFT" since="16"/>
+ <field name="GESTURE_SWIPE_RIGHT_AND_UP" since="16"/>
+ <field name="GESTURE_SWIPE_UP" since="16"/>
+ <field name="GESTURE_SWIPE_UP_AND_DOWN" since="16"/>
+ <field name="GESTURE_SWIPE_UP_AND_LEFT" since="16"/>
+ <field name="GESTURE_SWIPE_UP_AND_RIGHT" since="16"/>
+ <field name="GLOBAL_ACTION_BACK" since="16"/>
+ <field name="GLOBAL_ACTION_HOME" since="16"/>
+ <field name="GLOBAL_ACTION_NOTIFICATIONS" since="16"/>
+ <field name="GLOBAL_ACTION_POWER_DIALOG" since="21"/>
+ <field name="GLOBAL_ACTION_QUICK_SETTINGS" since="17"/>
+ <field name="GLOBAL_ACTION_RECENTS" since="16"/>
+ <field name="GLOBAL_ACTION_TOGGLE_SPLIT_SCREEN" since="24"/>
+ <field name="SERVICE_INTERFACE"/>
+ <field name="SERVICE_META_DATA" since="14"/>
+ <field name="SHOW_MODE_AUTO" since="24"/>
+ <field name="SHOW_MODE_HIDDEN" since="24"/>
+ </class>
+ <class name="android/accessibilityservice/AccessibilityService$GestureResultCallback" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onCancelled(Landroid/accessibilityservice/GestureDescription;)V"/>
+ <method name="onCompleted(Landroid/accessibilityservice/GestureDescription;)V"/>
+ </class>
+ <class name="android/accessibilityservice/AccessibilityService$MagnificationController" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addListener(Landroid/accessibilityservice/AccessibilityService$MagnificationController$OnMagnificationChangedListener;)V"/>
+ <method name="addListener(Landroid/accessibilityservice/AccessibilityService$MagnificationController$OnMagnificationChangedListener;Landroid/os/Handler;)V"/>
+ <method name="getCenterX()F"/>
+ <method name="getCenterY()F"/>
+ <method name="getMagnificationRegion()Landroid/graphics/Region;"/>
+ <method name="getScale()F"/>
+ <method name="removeListener(Landroid/accessibilityservice/AccessibilityService$MagnificationController$OnMagnificationChangedListener;)Z"/>
+ <method name="reset(Z)Z"/>
+ <method name="setCenter(FFZ)Z"/>
+ <method name="setScale(FZ)Z"/>
+ </class>
+ <class name="android/accessibilityservice/AccessibilityService$MagnificationController$OnMagnificationChangedListener" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="onMagnificationChanged(Landroid/accessibilityservice/AccessibilityService$MagnificationController;Landroid/graphics/Region;FFF)V"/>
+ </class>
+ <class name="android/accessibilityservice/AccessibilityService$SoftKeyboardController" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addOnShowModeChangedListener(Landroid/accessibilityservice/AccessibilityService$SoftKeyboardController$OnShowModeChangedListener;)V"/>
+ <method name="addOnShowModeChangedListener(Landroid/accessibilityservice/AccessibilityService$SoftKeyboardController$OnShowModeChangedListener;Landroid/os/Handler;)V"/>
+ <method name="getShowMode()I"/>
+ <method name="removeOnShowModeChangedListener(Landroid/accessibilityservice/AccessibilityService$SoftKeyboardController$OnShowModeChangedListener;)Z"/>
+ <method name="setShowMode(I)Z"/>
+ </class>
+ <class name="android/accessibilityservice/AccessibilityService$SoftKeyboardController$OnShowModeChangedListener" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="onShowModeChanged(Landroid/accessibilityservice/AccessibilityService$SoftKeyboardController;I)V"/>
+ </class>
+ <class name="android/accessibilityservice/AccessibilityServiceInfo" since="4">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="capabilityToString(I)Ljava/lang/String;" since="18"/>
+ <method name="feedbackTypeToString(I)Ljava/lang/String;" since="14"/>
+ <method name="flagToString(I)Ljava/lang/String;" since="14"/>
+ <method name="getCanRetrieveWindowContent()Z" since="14" deprecated="18"/>
+ <method name="getCapabilities()I" since="18"/>
+ <method name="getDescription()Ljava/lang/String;" since="14" deprecated="16"/>
+ <method name="getId()Ljava/lang/String;" since="14"/>
+ <method name="getResolveInfo()Landroid/content/pm/ResolveInfo;" since="14"/>
+ <method name="getSettingsActivityName()Ljava/lang/String;" since="14"/>
+ <method name="loadDescription(Landroid/content/pm/PackageManager;)Ljava/lang/String;" since="16"/>
+ <method name="loadSummary(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;" since="26"/>
+ <field name="CAPABILITY_CAN_CONTROL_MAGNIFICATION" since="24"/>
+ <field name="CAPABILITY_CAN_PERFORM_GESTURES" since="24"/>
+ <field name="CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY" since="18" deprecated="26"/>
+ <field name="CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS" since="18"/>
+ <field name="CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES" since="26"/>
+ <field name="CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION" since="18"/>
+ <field name="CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT" since="18"/>
+ <field name="CREATOR"/>
+ <field name="DEFAULT"/>
+ <field name="FEEDBACK_ALL_MASK" since="14"/>
+ <field name="FEEDBACK_AUDIBLE"/>
+ <field name="FEEDBACK_BRAILLE" since="17"/>
+ <field name="FEEDBACK_GENERIC"/>
+ <field name="FEEDBACK_HAPTIC"/>
+ <field name="FEEDBACK_SPOKEN"/>
+ <field name="FEEDBACK_VISUAL"/>
+ <field name="FLAG_ENABLE_ACCESSIBILITY_VOLUME" since="26"/>
+ <field name="FLAG_INCLUDE_NOT_IMPORTANT_VIEWS" since="16"/>
+ <field name="FLAG_REPORT_VIEW_IDS" since="18"/>
+ <field name="FLAG_REQUEST_ACCESSIBILITY_BUTTON" since="26"/>
+ <field name="FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY" since="18" deprecated="26"/>
+ <field name="FLAG_REQUEST_FILTER_KEY_EVENTS" since="18"/>
+ <field name="FLAG_REQUEST_FINGERPRINT_GESTURES" since="26"/>
+ <field name="FLAG_REQUEST_TOUCH_EXPLORATION_MODE" since="16"/>
+ <field name="FLAG_RETRIEVE_INTERACTIVE_WINDOWS" since="21"/>
+ <field name="eventTypes"/>
+ <field name="feedbackType"/>
+ <field name="flags"/>
+ <field name="notificationTimeout"/>
+ <field name="packageNames"/>
+ </class>
+ <class name="android/accessibilityservice/FingerprintGestureController" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="isGestureDetectionAvailable()Z"/>
+ <method name="registerFingerprintGestureCallback(Landroid/accessibilityservice/FingerprintGestureController$FingerprintGestureCallback;Landroid/os/Handler;)V"/>
+ <method name="unregisterFingerprintGestureCallback(Landroid/accessibilityservice/FingerprintGestureController$FingerprintGestureCallback;)V"/>
+ <field name="FINGERPRINT_GESTURE_SWIPE_DOWN"/>
+ <field name="FINGERPRINT_GESTURE_SWIPE_LEFT"/>
+ <field name="FINGERPRINT_GESTURE_SWIPE_RIGHT"/>
+ <field name="FINGERPRINT_GESTURE_SWIPE_UP"/>
+ </class>
+ <class name="android/accessibilityservice/FingerprintGestureController$FingerprintGestureCallback" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onGestureDetected(I)V"/>
+ <method name="onGestureDetectionAvailabilityChanged(Z)V"/>
+ </class>
+ <class name="android/accessibilityservice/GestureDescription" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getMaxGestureDuration()J"/>
+ <method name="getMaxStrokeCount()I"/>
+ <method name="getStroke(I)Landroid/accessibilityservice/GestureDescription$StrokeDescription;"/>
+ <method name="getStrokeCount()I"/>
+ </class>
+ <class name="android/accessibilityservice/GestureDescription$Builder" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addStroke(Landroid/accessibilityservice/GestureDescription$StrokeDescription;)Landroid/accessibilityservice/GestureDescription$Builder;"/>
+ <method name="build()Landroid/accessibilityservice/GestureDescription;"/>
+ </class>
+ <class name="android/accessibilityservice/GestureDescription$StrokeDescription" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/graphics/Path;JJ)V"/>
+ <method name="&lt;init>(Landroid/graphics/Path;JJZ)V" since="26"/>
+ <method name="continueStroke(Landroid/graphics/Path;JJZ)Landroid/accessibilityservice/GestureDescription$StrokeDescription;" since="26"/>
+ <method name="getDuration()J"/>
+ <method name="getPath()Landroid/graphics/Path;"/>
+ <method name="getStartTime()J"/>
+ <method name="willContinue()Z" since="26"/>
+ </class>
+ <class name="android/accounts/AbstractAccountAuthenticator" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="addAccount(Landroid/accounts/AccountAuthenticatorResponse;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;"/>
+ <method name="addAccountFromCredentials(Landroid/accounts/AccountAuthenticatorResponse;Landroid/accounts/Account;Landroid/os/Bundle;)Landroid/os/Bundle;" since="18"/>
+ <method name="confirmCredentials(Landroid/accounts/AccountAuthenticatorResponse;Landroid/accounts/Account;Landroid/os/Bundle;)Landroid/os/Bundle;"/>
+ <method name="editProperties(Landroid/accounts/AccountAuthenticatorResponse;Ljava/lang/String;)Landroid/os/Bundle;"/>
+ <method name="finishSession(Landroid/accounts/AccountAuthenticatorResponse;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;" since="26"/>
+ <method name="getAccountCredentialsForCloning(Landroid/accounts/AccountAuthenticatorResponse;Landroid/accounts/Account;)Landroid/os/Bundle;" since="18"/>
+ <method name="getAccountRemovalAllowed(Landroid/accounts/AccountAuthenticatorResponse;Landroid/accounts/Account;)Landroid/os/Bundle;"/>
+ <method name="getAuthToken(Landroid/accounts/AccountAuthenticatorResponse;Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;"/>
+ <method name="getAuthTokenLabel(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getIBinder()Landroid/os/IBinder;"/>
+ <method name="hasFeatures(Landroid/accounts/AccountAuthenticatorResponse;Landroid/accounts/Account;[Ljava/lang/String;)Landroid/os/Bundle;"/>
+ <method name="isCredentialsUpdateSuggested(Landroid/accounts/AccountAuthenticatorResponse;Landroid/accounts/Account;Ljava/lang/String;)Landroid/os/Bundle;" since="26"/>
+ <method name="startAddAccountSession(Landroid/accounts/AccountAuthenticatorResponse;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;" since="26"/>
+ <method name="startUpdateCredentialsSession(Landroid/accounts/AccountAuthenticatorResponse;Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;" since="26"/>
+ <method name="updateCredentials(Landroid/accounts/AccountAuthenticatorResponse;Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;"/>
+ <field name="KEY_CUSTOM_TOKEN_EXPIRY" since="23"/>
+ </class>
+ <class name="android/accounts/Account" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <field name="CREATOR"/>
+ <field name="name"/>
+ <field name="type"/>
+ </class>
+ <class name="android/accounts/AccountAuthenticatorActivity" since="5">
+ <extends name="android/app/Activity"/>
+ <method name="&lt;init>()V"/>
+ <method name="setAccountAuthenticatorResult(Landroid/os/Bundle;)V"/>
+ </class>
+ <class name="android/accounts/AccountAuthenticatorResponse" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="onError(ILjava/lang/String;)V"/>
+ <method name="onRequestContinued()V"/>
+ <method name="onResult(Landroid/os/Bundle;)V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/accounts/AccountManager" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addAccount(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Landroid/os/Bundle;Landroid/app/Activity;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;"/>
+ <method name="addAccountExplicitly(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)Z"/>
+ <method name="addAccountExplicitly(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;Ljava/util/Map;)Z" since="26"/>
+ <method name="addOnAccountsUpdatedListener(Landroid/accounts/OnAccountsUpdateListener;Landroid/os/Handler;Z)V"/>
+ <method name="addOnAccountsUpdatedListener(Landroid/accounts/OnAccountsUpdateListener;Landroid/os/Handler;Z[Ljava/lang/String;)V" since="26"/>
+ <method name="blockingGetAuthToken(Landroid/accounts/Account;Ljava/lang/String;Z)Ljava/lang/String;"/>
+ <method name="clearPassword(Landroid/accounts/Account;)V"/>
+ <method name="confirmCredentials(Landroid/accounts/Account;Landroid/os/Bundle;Landroid/app/Activity;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;"/>
+ <method name="editProperties(Ljava/lang/String;Landroid/app/Activity;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;"/>
+ <method name="finishSession(Landroid/os/Bundle;Landroid/app/Activity;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;" since="26"/>
+ <method name="get(Landroid/content/Context;)Landroid/accounts/AccountManager;"/>
+ <method name="getAccountVisibility(Landroid/accounts/Account;Ljava/lang/String;)I" since="26"/>
+ <method name="getAccounts()[Landroid/accounts/Account;"/>
+ <method name="getAccountsAndVisibilityForPackage(Ljava/lang/String;Ljava/lang/String;)Ljava/util/Map;" since="26"/>
+ <method name="getAccountsByType(Ljava/lang/String;)[Landroid/accounts/Account;"/>
+ <method name="getAccountsByTypeAndFeatures(Ljava/lang/String;[Ljava/lang/String;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;"/>
+ <method name="getAccountsByTypeForPackage(Ljava/lang/String;Ljava/lang/String;)[Landroid/accounts/Account;" since="18"/>
+ <method name="getAuthToken(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;Landroid/app/Activity;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;"/>
+ <method name="getAuthToken(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;ZLandroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;" since="14"/>
+ <method name="getAuthToken(Landroid/accounts/Account;Ljava/lang/String;ZLandroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;" deprecated="16"/>
+ <method name="getAuthTokenByFeatures(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Landroid/app/Activity;Landroid/os/Bundle;Landroid/os/Bundle;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;"/>
+ <method name="getAuthenticatorTypes()[Landroid/accounts/AuthenticatorDescription;"/>
+ <method name="getPackagesAndVisibilityForAccount(Landroid/accounts/Account;)Ljava/util/Map;" since="26"/>
+ <method name="getPassword(Landroid/accounts/Account;)Ljava/lang/String;"/>
+ <method name="getPreviousName(Landroid/accounts/Account;)Ljava/lang/String;" since="21"/>
+ <method name="getUserData(Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="hasFeatures(Landroid/accounts/Account;[Ljava/lang/String;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;" since="8"/>
+ <method name="invalidateAuthToken(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="isCredentialsUpdateSuggested(Landroid/accounts/Account;Ljava/lang/String;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;" since="26"/>
+ <method name="newChooseAccountIntent(Landroid/accounts/Account;Ljava/util/ArrayList;[Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Landroid/os/Bundle;)Landroid/content/Intent;" since="14" deprecated="23"/>
+ <method name="newChooseAccountIntent(Landroid/accounts/Account;Ljava/util/List;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Landroid/os/Bundle;)Landroid/content/Intent;" since="23"/>
+ <method name="notifyAccountAuthenticated(Landroid/accounts/Account;)Z" since="23"/>
+ <method name="peekAuthToken(Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="removeAccount(Landroid/accounts/Account;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;" deprecated="22"/>
+ <method name="removeAccount(Landroid/accounts/Account;Landroid/app/Activity;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;" since="22"/>
+ <method name="removeAccountExplicitly(Landroid/accounts/Account;)Z" since="22"/>
+ <method name="removeOnAccountsUpdatedListener(Landroid/accounts/OnAccountsUpdateListener;)V"/>
+ <method name="renameAccount(Landroid/accounts/Account;Ljava/lang/String;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;" since="21"/>
+ <method name="setAccountVisibility(Landroid/accounts/Account;Ljava/lang/String;I)Z" since="26"/>
+ <method name="setAuthToken(Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="setPassword(Landroid/accounts/Account;Ljava/lang/String;)V"/>
+ <method name="setUserData(Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="startAddAccountSession(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Landroid/os/Bundle;Landroid/app/Activity;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;" since="26"/>
+ <method name="startUpdateCredentialsSession(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;Landroid/app/Activity;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;" since="26"/>
+ <method name="updateCredentials(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;Landroid/app/Activity;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;"/>
+ <field name="ACTION_ACCOUNT_REMOVED" since="26"/>
+ <field name="ACTION_AUTHENTICATOR_INTENT"/>
+ <field name="AUTHENTICATOR_ATTRIBUTES_NAME"/>
+ <field name="AUTHENTICATOR_META_DATA_NAME"/>
+ <field name="ERROR_CODE_BAD_ARGUMENTS"/>
+ <field name="ERROR_CODE_BAD_AUTHENTICATION" since="18"/>
+ <field name="ERROR_CODE_BAD_REQUEST"/>
+ <field name="ERROR_CODE_CANCELED"/>
+ <field name="ERROR_CODE_INVALID_RESPONSE"/>
+ <field name="ERROR_CODE_NETWORK_ERROR"/>
+ <field name="ERROR_CODE_REMOTE_EXCEPTION"/>
+ <field name="ERROR_CODE_UNSUPPORTED_OPERATION"/>
+ <field name="KEY_ACCOUNTS"/>
+ <field name="KEY_ACCOUNT_AUTHENTICATOR_RESPONSE"/>
+ <field name="KEY_ACCOUNT_MANAGER_RESPONSE"/>
+ <field name="KEY_ACCOUNT_NAME"/>
+ <field name="KEY_ACCOUNT_SESSION_BUNDLE" since="26"/>
+ <field name="KEY_ACCOUNT_STATUS_TOKEN" since="26"/>
+ <field name="KEY_ACCOUNT_TYPE"/>
+ <field name="KEY_ANDROID_PACKAGE_NAME" since="14"/>
+ <field name="KEY_AUTHENTICATOR_TYPES"/>
+ <field name="KEY_AUTHTOKEN"/>
+ <field name="KEY_AUTH_FAILED_MESSAGE"/>
+ <field name="KEY_AUTH_TOKEN_LABEL"/>
+ <field name="KEY_BOOLEAN_RESULT"/>
+ <field name="KEY_CALLER_PID" since="11"/>
+ <field name="KEY_CALLER_UID" since="11"/>
+ <field name="KEY_ERROR_CODE"/>
+ <field name="KEY_ERROR_MESSAGE"/>
+ <field name="KEY_INTENT"/>
+ <field name="KEY_LAST_AUTHENTICATED_TIME" since="23"/>
+ <field name="KEY_PASSWORD"/>
+ <field name="KEY_USERDATA"/>
+ <field name="LOGIN_ACCOUNTS_CHANGED_ACTION" deprecated="26"/>
+ <field name="PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE" since="26"/>
+ <field name="PACKAGE_NAME_KEY_LEGACY_VISIBLE" since="26"/>
+ <field name="VISIBILITY_NOT_VISIBLE" since="26"/>
+ <field name="VISIBILITY_UNDEFINED" since="26"/>
+ <field name="VISIBILITY_USER_MANAGED_NOT_VISIBLE" since="26"/>
+ <field name="VISIBILITY_USER_MANAGED_VISIBLE" since="26"/>
+ <field name="VISIBILITY_VISIBLE" since="26"/>
+ </class>
+ <class name="android/accounts/AccountManagerCallback" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="run(Landroid/accounts/AccountManagerFuture;)V"/>
+ </class>
+ <class name="android/accounts/AccountManagerFuture" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="cancel(Z)Z"/>
+ <method name="getResult()Ljava/lang/Object;"/>
+ <method name="getResult(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;"/>
+ <method name="isCancelled()Z"/>
+ <method name="isDone()Z"/>
+ </class>
+ <class name="android/accounts/AccountsException" since="5">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="android/accounts/AuthenticatorDescription" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;IIII)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;IIIIZ)V" since="11"/>
+ <method name="newKey(Ljava/lang/String;)Landroid/accounts/AuthenticatorDescription;"/>
+ <field name="CREATOR"/>
+ <field name="accountPreferencesId"/>
+ <field name="customTokens" since="11"/>
+ <field name="iconId"/>
+ <field name="labelId"/>
+ <field name="packageName"/>
+ <field name="smallIconId"/>
+ <field name="type"/>
+ </class>
+ <class name="android/accounts/AuthenticatorException" since="5">
+ <extends name="android/accounts/AccountsException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="android/accounts/NetworkErrorException" since="5">
+ <extends name="android/accounts/AccountsException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="android/accounts/OnAccountsUpdateListener" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="onAccountsUpdated([Landroid/accounts/Account;)V"/>
+ </class>
+ <class name="android/accounts/OperationCanceledException" since="5">
+ <extends name="android/accounts/AccountsException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="android/animation/Animator" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="addListener(Landroid/animation/Animator$AnimatorListener;)V"/>
+ <method name="addPauseListener(Landroid/animation/Animator$AnimatorPauseListener;)V" since="19"/>
+ <method name="cancel()V"/>
+ <method name="clone()Landroid/animation/Animator;"/>
+ <method name="end()V"/>
+ <method name="getDuration()J"/>
+ <method name="getInterpolator()Landroid/animation/TimeInterpolator;" since="18"/>
+ <method name="getListeners()Ljava/util/ArrayList;"/>
+ <method name="getStartDelay()J"/>
+ <method name="getTotalDuration()J" since="24"/>
+ <method name="isPaused()Z" since="19"/>
+ <method name="isRunning()Z"/>
+ <method name="isStarted()Z" since="14"/>
+ <method name="pause()V" since="19"/>
+ <method name="removeAllListeners()V"/>
+ <method name="removeListener(Landroid/animation/Animator$AnimatorListener;)V"/>
+ <method name="removePauseListener(Landroid/animation/Animator$AnimatorPauseListener;)V" since="19"/>
+ <method name="resume()V" since="19"/>
+ <method name="setDuration(J)Landroid/animation/Animator;"/>
+ <method name="setInterpolator(Landroid/animation/TimeInterpolator;)V"/>
+ <method name="setStartDelay(J)V"/>
+ <method name="setTarget(Ljava/lang/Object;)V"/>
+ <method name="setupEndValues()V"/>
+ <method name="setupStartValues()V"/>
+ <method name="start()V"/>
+ <field name="DURATION_INFINITE" since="24"/>
+ </class>
+ <class name="android/animation/Animator$AnimatorListener" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="onAnimationCancel(Landroid/animation/Animator;)V"/>
+ <method name="onAnimationEnd(Landroid/animation/Animator;)V"/>
+ <method name="onAnimationEnd(Landroid/animation/Animator;Z)V" since="26"/>
+ <method name="onAnimationRepeat(Landroid/animation/Animator;)V"/>
+ <method name="onAnimationStart(Landroid/animation/Animator;)V"/>
+ <method name="onAnimationStart(Landroid/animation/Animator;Z)V" since="26"/>
+ </class>
+ <class name="android/animation/Animator$AnimatorPauseListener" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="onAnimationPause(Landroid/animation/Animator;)V"/>
+ <method name="onAnimationResume(Landroid/animation/Animator;)V"/>
+ </class>
+ <class name="android/animation/AnimatorInflater" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="loadAnimator(Landroid/content/Context;I)Landroid/animation/Animator;"/>
+ <method name="loadStateListAnimator(Landroid/content/Context;I)Landroid/animation/StateListAnimator;" since="21"/>
+ </class>
+ <class name="android/animation/AnimatorListenerAdapter" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="android/animation/Animator$AnimatorListener"/>
+ <implements name="android/animation/Animator$AnimatorPauseListener" since="19"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/animation/AnimatorSet" since="11">
+ <extends name="android/animation/Animator"/>
+ <method name="&lt;init>()V"/>
+ <method name="clone()Landroid/animation/AnimatorSet;"/>
+ <method name="getChildAnimations()Ljava/util/ArrayList;"/>
+ <method name="getCurrentPlayTime()J" since="26"/>
+ <method name="play(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Builder;"/>
+ <method name="playSequentially(Ljava/util/List;)V"/>
+ <method name="playSequentially([Landroid/animation/Animator;)V"/>
+ <method name="playTogether(Ljava/util/Collection;)V"/>
+ <method name="playTogether([Landroid/animation/Animator;)V"/>
+ <method name="reverse()V" since="26"/>
+ <method name="setCurrentPlayTime(J)V" since="26"/>
+ <method name="setDuration(J)Landroid/animation/AnimatorSet;"/>
+ </class>
+ <class name="android/animation/AnimatorSet$Builder" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/animation/AnimatorSet;)V"/>
+ <method name="after(J)Landroid/animation/AnimatorSet$Builder;"/>
+ <method name="after(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Builder;"/>
+ <method name="before(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Builder;"/>
+ <method name="with(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Builder;"/>
+ </class>
+ <class name="android/animation/ArgbEvaluator" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="android/animation/TypeEvaluator"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/animation/BidirectionalTypeConverter" since="21">
+ <extends name="android/animation/TypeConverter"/>
+ <method name="&lt;init>(Ljava/lang/Class;Ljava/lang/Class;)V"/>
+ <method name="convertBack(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="invert()Landroid/animation/BidirectionalTypeConverter;"/>
+ </class>
+ <class name="android/animation/FloatArrayEvaluator" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/animation/TypeEvaluator"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>([F)V"/>
+ <method name="evaluate(F[F[F)[F"/>
+ </class>
+ <class name="android/animation/FloatEvaluator" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="android/animation/TypeEvaluator"/>
+ <method name="&lt;init>()V"/>
+ <method name="evaluate(FLjava/lang/Number;Ljava/lang/Number;)Ljava/lang/Float;" since="14"/>
+ </class>
+ <class name="android/animation/IntArrayEvaluator" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/animation/TypeEvaluator"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>([I)V"/>
+ <method name="evaluate(F[I[I)[I"/>
+ </class>
+ <class name="android/animation/IntEvaluator" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="android/animation/TypeEvaluator"/>
+ <method name="&lt;init>()V"/>
+ <method name="evaluate(FLjava/lang/Integer;Ljava/lang/Integer;)Ljava/lang/Integer;" since="14"/>
+ </class>
+ <class name="android/animation/Keyframe" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="clone()Landroid/animation/Keyframe;"/>
+ <method name="getFraction()F"/>
+ <method name="getInterpolator()Landroid/animation/TimeInterpolator;"/>
+ <method name="getType()Ljava/lang/Class;"/>
+ <method name="getValue()Ljava/lang/Object;"/>
+ <method name="hasValue()Z"/>
+ <method name="ofFloat(F)Landroid/animation/Keyframe;"/>
+ <method name="ofFloat(FF)Landroid/animation/Keyframe;"/>
+ <method name="ofInt(F)Landroid/animation/Keyframe;"/>
+ <method name="ofInt(FI)Landroid/animation/Keyframe;"/>
+ <method name="ofObject(F)Landroid/animation/Keyframe;"/>
+ <method name="ofObject(FLjava/lang/Object;)Landroid/animation/Keyframe;"/>
+ <method name="setFraction(F)V"/>
+ <method name="setInterpolator(Landroid/animation/TimeInterpolator;)V"/>
+ <method name="setValue(Ljava/lang/Object;)V"/>
+ </class>
+ <class name="android/animation/LayoutTransition" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addChild(Landroid/view/ViewGroup;Landroid/view/View;)V"/>
+ <method name="addTransitionListener(Landroid/animation/LayoutTransition$TransitionListener;)V"/>
+ <method name="disableTransitionType(I)V" since="16"/>
+ <method name="enableTransitionType(I)V" since="16"/>
+ <method name="getAnimator(I)Landroid/animation/Animator;"/>
+ <method name="getDuration(I)J"/>
+ <method name="getInterpolator(I)Landroid/animation/TimeInterpolator;"/>
+ <method name="getStagger(I)J"/>
+ <method name="getStartDelay(I)J"/>
+ <method name="getTransitionListeners()Ljava/util/List;"/>
+ <method name="hideChild(Landroid/view/ViewGroup;Landroid/view/View;)V" deprecated="16"/>
+ <method name="hideChild(Landroid/view/ViewGroup;Landroid/view/View;I)V" since="16"/>
+ <method name="isChangingLayout()Z"/>
+ <method name="isRunning()Z"/>
+ <method name="isTransitionTypeEnabled(I)Z" since="16"/>
+ <method name="removeChild(Landroid/view/ViewGroup;Landroid/view/View;)V"/>
+ <method name="removeTransitionListener(Landroid/animation/LayoutTransition$TransitionListener;)V"/>
+ <method name="setAnimateParentHierarchy(Z)V" since="14"/>
+ <method name="setAnimator(ILandroid/animation/Animator;)V"/>
+ <method name="setDuration(IJ)V"/>
+ <method name="setDuration(J)V"/>
+ <method name="setInterpolator(ILandroid/animation/TimeInterpolator;)V"/>
+ <method name="setStagger(IJ)V"/>
+ <method name="setStartDelay(IJ)V"/>
+ <method name="showChild(Landroid/view/ViewGroup;Landroid/view/View;)V" deprecated="16"/>
+ <method name="showChild(Landroid/view/ViewGroup;Landroid/view/View;I)V" since="16"/>
+ <field name="APPEARING"/>
+ <field name="CHANGE_APPEARING"/>
+ <field name="CHANGE_DISAPPEARING"/>
+ <field name="CHANGING" since="16"/>
+ <field name="DISAPPEARING"/>
+ </class>
+ <class name="android/animation/LayoutTransition$TransitionListener" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="endTransition(Landroid/animation/LayoutTransition;Landroid/view/ViewGroup;Landroid/view/View;I)V"/>
+ <method name="startTransition(Landroid/animation/LayoutTransition;Landroid/view/ViewGroup;Landroid/view/View;I)V"/>
+ </class>
+ <class name="android/animation/ObjectAnimator" since="11">
+ <extends name="android/animation/ValueAnimator"/>
+ <method name="&lt;init>()V"/>
+ <method name="clone()Landroid/animation/ObjectAnimator;"/>
+ <method name="getPropertyName()Ljava/lang/String;"/>
+ <method name="getTarget()Ljava/lang/Object;"/>
+ <method name="ofArgb(Ljava/lang/Object;Landroid/util/Property;[I)Landroid/animation/ObjectAnimator;" since="21"/>
+ <method name="ofArgb(Ljava/lang/Object;Ljava/lang/String;[I)Landroid/animation/ObjectAnimator;" since="21"/>
+ <method name="ofFloat(Ljava/lang/Object;Landroid/util/Property;Landroid/util/Property;Landroid/graphics/Path;)Landroid/animation/ObjectAnimator;" since="21"/>
+ <method name="ofFloat(Ljava/lang/Object;Landroid/util/Property;[F)Landroid/animation/ObjectAnimator;" since="14"/>
+ <method name="ofFloat(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;Landroid/graphics/Path;)Landroid/animation/ObjectAnimator;" since="21"/>
+ <method name="ofFloat(Ljava/lang/Object;Ljava/lang/String;[F)Landroid/animation/ObjectAnimator;"/>
+ <method name="ofInt(Ljava/lang/Object;Landroid/util/Property;Landroid/util/Property;Landroid/graphics/Path;)Landroid/animation/ObjectAnimator;" since="21"/>
+ <method name="ofInt(Ljava/lang/Object;Landroid/util/Property;[I)Landroid/animation/ObjectAnimator;" since="14"/>
+ <method name="ofInt(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;Landroid/graphics/Path;)Landroid/animation/ObjectAnimator;" since="21"/>
+ <method name="ofInt(Ljava/lang/Object;Ljava/lang/String;[I)Landroid/animation/ObjectAnimator;"/>
+ <method name="ofMultiFloat(Ljava/lang/Object;Ljava/lang/String;Landroid/animation/TypeConverter;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/ObjectAnimator;" since="21"/>
+ <method name="ofMultiFloat(Ljava/lang/Object;Ljava/lang/String;Landroid/graphics/Path;)Landroid/animation/ObjectAnimator;" since="21"/>
+ <method name="ofMultiFloat(Ljava/lang/Object;Ljava/lang/String;[[F)Landroid/animation/ObjectAnimator;" since="21"/>
+ <method name="ofMultiInt(Ljava/lang/Object;Ljava/lang/String;Landroid/animation/TypeConverter;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/ObjectAnimator;" since="21"/>
+ <method name="ofMultiInt(Ljava/lang/Object;Ljava/lang/String;Landroid/graphics/Path;)Landroid/animation/ObjectAnimator;" since="21"/>
+ <method name="ofMultiInt(Ljava/lang/Object;Ljava/lang/String;[[I)Landroid/animation/ObjectAnimator;" since="21"/>
+ <method name="ofObject(Ljava/lang/Object;Landroid/util/Property;Landroid/animation/TypeConverter;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/ObjectAnimator;" since="21"/>
+ <method name="ofObject(Ljava/lang/Object;Landroid/util/Property;Landroid/animation/TypeConverter;Landroid/graphics/Path;)Landroid/animation/ObjectAnimator;" since="21"/>
+ <method name="ofObject(Ljava/lang/Object;Landroid/util/Property;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/ObjectAnimator;" since="14"/>
+ <method name="ofObject(Ljava/lang/Object;Ljava/lang/String;Landroid/animation/TypeConverter;Landroid/graphics/Path;)Landroid/animation/ObjectAnimator;" since="21"/>
+ <method name="ofObject(Ljava/lang/Object;Ljava/lang/String;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/ObjectAnimator;"/>
+ <method name="ofPropertyValuesHolder(Ljava/lang/Object;[Landroid/animation/PropertyValuesHolder;)Landroid/animation/ObjectAnimator;"/>
+ <method name="setAutoCancel(Z)V" since="18"/>
+ <method name="setDuration(J)Landroid/animation/ObjectAnimator;"/>
+ <method name="setProperty(Landroid/util/Property;)V" since="14"/>
+ <method name="setPropertyName(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/animation/PointFEvaluator" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/animation/TypeEvaluator"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/graphics/PointF;)V"/>
+ <method name="evaluate(FLandroid/graphics/PointF;Landroid/graphics/PointF;)Landroid/graphics/PointF;"/>
+ </class>
+ <class name="android/animation/PropertyValuesHolder" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="clone()Landroid/animation/PropertyValuesHolder;"/>
+ <method name="getPropertyName()Ljava/lang/String;"/>
+ <method name="ofFloat(Landroid/util/Property;[F)Landroid/animation/PropertyValuesHolder;" since="14"/>
+ <method name="ofFloat(Ljava/lang/String;[F)Landroid/animation/PropertyValuesHolder;"/>
+ <method name="ofInt(Landroid/util/Property;[I)Landroid/animation/PropertyValuesHolder;" since="14"/>
+ <method name="ofInt(Ljava/lang/String;[I)Landroid/animation/PropertyValuesHolder;"/>
+ <method name="ofKeyframe(Landroid/util/Property;[Landroid/animation/Keyframe;)Landroid/animation/PropertyValuesHolder;" since="14"/>
+ <method name="ofKeyframe(Ljava/lang/String;[Landroid/animation/Keyframe;)Landroid/animation/PropertyValuesHolder;"/>
+ <method name="ofMultiFloat(Ljava/lang/String;Landroid/animation/TypeConverter;Landroid/animation/TypeEvaluator;[Landroid/animation/Keyframe;)Landroid/animation/PropertyValuesHolder;" since="21"/>
+ <method name="ofMultiFloat(Ljava/lang/String;Landroid/animation/TypeConverter;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/PropertyValuesHolder;" since="21"/>
+ <method name="ofMultiFloat(Ljava/lang/String;Landroid/graphics/Path;)Landroid/animation/PropertyValuesHolder;" since="21"/>
+ <method name="ofMultiFloat(Ljava/lang/String;[[F)Landroid/animation/PropertyValuesHolder;" since="21"/>
+ <method name="ofMultiInt(Ljava/lang/String;Landroid/animation/TypeConverter;Landroid/animation/TypeEvaluator;[Landroid/animation/Keyframe;)Landroid/animation/PropertyValuesHolder;" since="21"/>
+ <method name="ofMultiInt(Ljava/lang/String;Landroid/animation/TypeConverter;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/PropertyValuesHolder;" since="21"/>
+ <method name="ofMultiInt(Ljava/lang/String;Landroid/graphics/Path;)Landroid/animation/PropertyValuesHolder;" since="21"/>
+ <method name="ofMultiInt(Ljava/lang/String;[[I)Landroid/animation/PropertyValuesHolder;" since="21"/>
+ <method name="ofObject(Landroid/util/Property;Landroid/animation/TypeConverter;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/PropertyValuesHolder;" since="21"/>
+ <method name="ofObject(Landroid/util/Property;Landroid/animation/TypeConverter;Landroid/graphics/Path;)Landroid/animation/PropertyValuesHolder;" since="21"/>
+ <method name="ofObject(Landroid/util/Property;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/PropertyValuesHolder;" since="14"/>
+ <method name="ofObject(Ljava/lang/String;Landroid/animation/TypeConverter;Landroid/graphics/Path;)Landroid/animation/PropertyValuesHolder;" since="21"/>
+ <method name="ofObject(Ljava/lang/String;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/PropertyValuesHolder;"/>
+ <method name="setConverter(Landroid/animation/TypeConverter;)V" since="21"/>
+ <method name="setEvaluator(Landroid/animation/TypeEvaluator;)V"/>
+ <method name="setFloatValues([F)V"/>
+ <method name="setIntValues([I)V"/>
+ <method name="setKeyframes([Landroid/animation/Keyframe;)V"/>
+ <method name="setObjectValues([Ljava/lang/Object;)V"/>
+ <method name="setProperty(Landroid/util/Property;)V" since="14"/>
+ <method name="setPropertyName(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/animation/RectEvaluator" since="18">
+ <extends name="java/lang/Object"/>
+ <implements name="android/animation/TypeEvaluator"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/graphics/Rect;)V" since="21"/>
+ <method name="evaluate(FLandroid/graphics/Rect;Landroid/graphics/Rect;)Landroid/graphics/Rect;"/>
+ </class>
+ <class name="android/animation/StateListAnimator" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable" since="22"/>
+ <method name="&lt;init>()V"/>
+ <method name="addState([ILandroid/animation/Animator;)V"/>
+ <method name="clone()Landroid/animation/StateListAnimator;" since="22"/>
+ <method name="jumpToCurrentState()V"/>
+ </class>
+ <class name="android/animation/TimeAnimator" since="16">
+ <extends name="android/animation/ValueAnimator"/>
+ <method name="&lt;init>()V"/>
+ <method name="setTimeListener(Landroid/animation/TimeAnimator$TimeListener;)V"/>
+ </class>
+ <class name="android/animation/TimeAnimator$TimeListener" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="onTimeUpdate(Landroid/animation/TimeAnimator;JJ)V"/>
+ </class>
+ <class name="android/animation/TimeInterpolator" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="getInterpolation(F)F"/>
+ </class>
+ <class name="android/animation/TypeConverter" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/Class;Ljava/lang/Class;)V"/>
+ <method name="convert(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ </class>
+ <class name="android/animation/TypeEvaluator" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="evaluate(FLjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"/>
+ </class>
+ <class name="android/animation/ValueAnimator" since="11">
+ <extends name="android/animation/Animator"/>
+ <method name="&lt;init>()V"/>
+ <method name="addUpdateListener(Landroid/animation/ValueAnimator$AnimatorUpdateListener;)V"/>
+ <method name="areAnimatorsEnabled()Z" since="26"/>
+ <method name="clone()Landroid/animation/ValueAnimator;"/>
+ <method name="getAnimatedFraction()F" since="12"/>
+ <method name="getAnimatedValue()Ljava/lang/Object;"/>
+ <method name="getAnimatedValue(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="getCurrentPlayTime()J"/>
+ <method name="getFrameDelay()J"/>
+ <method name="getInterpolator()Landroid/animation/TimeInterpolator;"/>
+ <method name="getRepeatCount()I"/>
+ <method name="getRepeatMode()I"/>
+ <method name="getValues()[Landroid/animation/PropertyValuesHolder;"/>
+ <method name="ofArgb([I)Landroid/animation/ValueAnimator;" since="21"/>
+ <method name="ofFloat([F)Landroid/animation/ValueAnimator;"/>
+ <method name="ofInt([I)Landroid/animation/ValueAnimator;"/>
+ <method name="ofObject(Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/ValueAnimator;"/>
+ <method name="ofPropertyValuesHolder([Landroid/animation/PropertyValuesHolder;)Landroid/animation/ValueAnimator;"/>
+ <method name="removeAllUpdateListeners()V"/>
+ <method name="removeUpdateListener(Landroid/animation/ValueAnimator$AnimatorUpdateListener;)V"/>
+ <method name="reverse()V"/>
+ <method name="setCurrentFraction(F)V" since="22"/>
+ <method name="setCurrentPlayTime(J)V"/>
+ <method name="setDuration(J)Landroid/animation/ValueAnimator;"/>
+ <method name="setEvaluator(Landroid/animation/TypeEvaluator;)V"/>
+ <method name="setFloatValues([F)V"/>
+ <method name="setFrameDelay(J)V"/>
+ <method name="setIntValues([I)V"/>
+ <method name="setObjectValues([Ljava/lang/Object;)V"/>
+ <method name="setRepeatCount(I)V"/>
+ <method name="setRepeatMode(I)V"/>
+ <method name="setValues([Landroid/animation/PropertyValuesHolder;)V"/>
+ <field name="INFINITE"/>
+ <field name="RESTART"/>
+ <field name="REVERSE"/>
+ </class>
+ <class name="android/animation/ValueAnimator$AnimatorUpdateListener" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="onAnimationUpdate(Landroid/animation/ValueAnimator;)V"/>
+ </class>
+ <class name="android/annotation/SuppressLint" since="16">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ <method name="value()[Ljava/lang/String;"/>
+ </class>
+ <class name="android/annotation/TargetApi" since="16">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ <method name="value()I"/>
+ </class>
+ <class name="android/app/ActionBar" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addOnMenuVisibilityListener(Landroid/app/ActionBar$OnMenuVisibilityListener;)V"/>
+ <method name="addTab(Landroid/app/ActionBar$Tab;)V" deprecated="21"/>
+ <method name="addTab(Landroid/app/ActionBar$Tab;I)V" deprecated="21"/>
+ <method name="addTab(Landroid/app/ActionBar$Tab;IZ)V" deprecated="21"/>
+ <method name="addTab(Landroid/app/ActionBar$Tab;Z)V" deprecated="21"/>
+ <method name="getCustomView()Landroid/view/View;"/>
+ <method name="getDisplayOptions()I"/>
+ <method name="getElevation()F" since="21"/>
+ <method name="getHeight()I"/>
+ <method name="getHideOffset()I" since="21"/>
+ <method name="getNavigationItemCount()I" deprecated="21"/>
+ <method name="getNavigationMode()I" deprecated="21"/>
+ <method name="getSelectedNavigationIndex()I" deprecated="21"/>
+ <method name="getSelectedTab()Landroid/app/ActionBar$Tab;" deprecated="21"/>
+ <method name="getSubtitle()Ljava/lang/CharSequence;"/>
+ <method name="getTabAt(I)Landroid/app/ActionBar$Tab;" deprecated="21"/>
+ <method name="getTabCount()I" deprecated="21"/>
+ <method name="getThemedContext()Landroid/content/Context;" since="14"/>
+ <method name="getTitle()Ljava/lang/CharSequence;"/>
+ <method name="hide()V"/>
+ <method name="isHideOnContentScrollEnabled()Z" since="21"/>
+ <method name="isShowing()Z"/>
+ <method name="newTab()Landroid/app/ActionBar$Tab;" deprecated="21"/>
+ <method name="removeAllTabs()V" deprecated="21"/>
+ <method name="removeOnMenuVisibilityListener(Landroid/app/ActionBar$OnMenuVisibilityListener;)V"/>
+ <method name="removeTab(Landroid/app/ActionBar$Tab;)V" deprecated="21"/>
+ <method name="removeTabAt(I)V" deprecated="21"/>
+ <method name="selectTab(Landroid/app/ActionBar$Tab;)V" deprecated="21"/>
+ <method name="setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setCustomView(I)V"/>
+ <method name="setCustomView(Landroid/view/View;)V"/>
+ <method name="setCustomView(Landroid/view/View;Landroid/app/ActionBar$LayoutParams;)V"/>
+ <method name="setDisplayHomeAsUpEnabled(Z)V"/>
+ <method name="setDisplayOptions(I)V"/>
+ <method name="setDisplayOptions(II)V"/>
+ <method name="setDisplayShowCustomEnabled(Z)V"/>
+ <method name="setDisplayShowHomeEnabled(Z)V"/>
+ <method name="setDisplayShowTitleEnabled(Z)V"/>
+ <method name="setDisplayUseLogoEnabled(Z)V"/>
+ <method name="setElevation(F)V" since="21"/>
+ <method name="setHideOffset(I)V" since="21"/>
+ <method name="setHideOnContentScrollEnabled(Z)V" since="21"/>
+ <method name="setHomeActionContentDescription(I)V" since="18"/>
+ <method name="setHomeActionContentDescription(Ljava/lang/CharSequence;)V" since="18"/>
+ <method name="setHomeAsUpIndicator(I)V" since="18"/>
+ <method name="setHomeAsUpIndicator(Landroid/graphics/drawable/Drawable;)V" since="18"/>
+ <method name="setHomeButtonEnabled(Z)V" since="14"/>
+ <method name="setIcon(I)V" since="14"/>
+ <method name="setIcon(Landroid/graphics/drawable/Drawable;)V" since="14"/>
+ <method name="setListNavigationCallbacks(Landroid/widget/SpinnerAdapter;Landroid/app/ActionBar$OnNavigationListener;)V" deprecated="21"/>
+ <method name="setLogo(I)V" since="14"/>
+ <method name="setLogo(Landroid/graphics/drawable/Drawable;)V" since="14"/>
+ <method name="setNavigationMode(I)V" deprecated="21"/>
+ <method name="setSelectedNavigationItem(I)V" deprecated="21"/>
+ <method name="setSplitBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V" since="14"/>
+ <method name="setStackedBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V" since="14"/>
+ <method name="setSubtitle(I)V"/>
+ <method name="setSubtitle(Ljava/lang/CharSequence;)V"/>
+ <method name="setTitle(I)V"/>
+ <method name="setTitle(Ljava/lang/CharSequence;)V"/>
+ <method name="show()V"/>
+ <field name="DISPLAY_HOME_AS_UP"/>
+ <field name="DISPLAY_SHOW_CUSTOM"/>
+ <field name="DISPLAY_SHOW_HOME"/>
+ <field name="DISPLAY_SHOW_TITLE"/>
+ <field name="DISPLAY_USE_LOGO"/>
+ <field name="NAVIGATION_MODE_LIST" deprecated="21"/>
+ <field name="NAVIGATION_MODE_STANDARD" deprecated="21"/>
+ <field name="NAVIGATION_MODE_TABS" deprecated="21"/>
+ </class>
+ <class name="android/app/ActionBar$LayoutParams" since="11">
+ <extends name="android/view/ViewGroup$MarginLayoutParams"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="&lt;init>(III)V"/>
+ <method name="&lt;init>(Landroid/app/ActionBar$LayoutParams;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V"/>
+ <field name="gravity"/>
+ </class>
+ <class name="android/app/ActionBar$OnMenuVisibilityListener" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="onMenuVisibilityChanged(Z)V"/>
+ </class>
+ <class name="android/app/ActionBar$OnNavigationListener" since="11" deprecated="21">
+ <extends name="java/lang/Object"/>
+ <method name="onNavigationItemSelected(IJ)Z"/>
+ </class>
+ <class name="android/app/ActionBar$Tab" since="11" deprecated="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getContentDescription()Ljava/lang/CharSequence;" since="14"/>
+ <method name="getCustomView()Landroid/view/View;"/>
+ <method name="getIcon()Landroid/graphics/drawable/Drawable;"/>
+ <method name="getPosition()I"/>
+ <method name="getTag()Ljava/lang/Object;"/>
+ <method name="getText()Ljava/lang/CharSequence;"/>
+ <method name="select()V"/>
+ <method name="setContentDescription(I)Landroid/app/ActionBar$Tab;" since="14"/>
+ <method name="setContentDescription(Ljava/lang/CharSequence;)Landroid/app/ActionBar$Tab;" since="14"/>
+ <method name="setCustomView(I)Landroid/app/ActionBar$Tab;"/>
+ <method name="setCustomView(Landroid/view/View;)Landroid/app/ActionBar$Tab;"/>
+ <method name="setIcon(I)Landroid/app/ActionBar$Tab;"/>
+ <method name="setIcon(Landroid/graphics/drawable/Drawable;)Landroid/app/ActionBar$Tab;"/>
+ <method name="setTabListener(Landroid/app/ActionBar$TabListener;)Landroid/app/ActionBar$Tab;"/>
+ <method name="setTag(Ljava/lang/Object;)Landroid/app/ActionBar$Tab;"/>
+ <method name="setText(I)Landroid/app/ActionBar$Tab;"/>
+ <method name="setText(Ljava/lang/CharSequence;)Landroid/app/ActionBar$Tab;"/>
+ <field name="INVALID_POSITION"/>
+ </class>
+ <class name="android/app/ActionBar$TabListener" since="11" deprecated="21">
+ <extends name="java/lang/Object"/>
+ <method name="onTabReselected(Landroid/app/ActionBar$Tab;Landroid/app/FragmentTransaction;)V"/>
+ <method name="onTabSelected(Landroid/app/ActionBar$Tab;Landroid/app/FragmentTransaction;)V"/>
+ <method name="onTabUnselected(Landroid/app/ActionBar$Tab;Landroid/app/FragmentTransaction;)V"/>
+ </class>
+ <class name="android/app/Activity" since="1">
+ <extends name="android/view/ContextThemeWrapper"/>
+ <implements name="android/content/ComponentCallbacks" removed="14"/>
+ <implements name="android/content/ComponentCallbacks2" since="14"/>
+ <implements name="android/view/KeyEvent$Callback"/>
+ <implements name="android/view/LayoutInflater$Factory" removed="11"/>
+ <implements name="android/view/LayoutInflater$Factory2" since="11"/>
+ <implements name="android/view/View$OnCreateContextMenuListener"/>
+ <implements name="android/view/Window$Callback"/>
+ <method name="&lt;init>()V"/>
+ <method name="addContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V"/>
+ <method name="closeContextMenu()V" since="3"/>
+ <method name="closeOptionsMenu()V"/>
+ <method name="createPendingResult(ILandroid/content/Intent;I)Landroid/app/PendingIntent;"/>
+ <method name="dismissDialog(I)V" deprecated="16"/>
+ <method name="dismissKeyboardShortcutsHelper()V" since="24"/>
+ <method name="dump(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V" since="11"/>
+ <method name="enterPictureInPictureMode()V" since="24" deprecated="26"/>
+ <method name="enterPictureInPictureMode(Landroid/app/PictureInPictureParams;)Z" since="26"/>
+ <method name="findViewById(I)Landroid/view/View;"/>
+ <method name="finish()V"/>
+ <method name="finishActivity(I)V"/>
+ <method name="finishActivityFromChild(Landroid/app/Activity;I)V"/>
+ <method name="finishAffinity()V" since="16"/>
+ <method name="finishAfterTransition()V" since="21"/>
+ <method name="finishAndRemoveTask()V" since="21"/>
+ <method name="finishFromChild(Landroid/app/Activity;)V"/>
+ <method name="getActionBar()Landroid/app/ActionBar;" since="11"/>
+ <method name="getApplication()Landroid/app/Application;"/>
+ <method name="getCallingActivity()Landroid/content/ComponentName;"/>
+ <method name="getCallingPackage()Ljava/lang/String;"/>
+ <method name="getChangingConfigurations()I"/>
+ <method name="getComponentName()Landroid/content/ComponentName;"/>
+ <method name="getContentScene()Landroid/transition/Scene;" since="21"/>
+ <method name="getContentTransitionManager()Landroid/transition/TransitionManager;" since="21"/>
+ <method name="getCurrentFocus()Landroid/view/View;"/>
+ <method name="getFragmentManager()Landroid/app/FragmentManager;" since="11"/>
+ <method name="getInstanceCount()J" removed="11"/>
+ <method name="getIntent()Landroid/content/Intent;"/>
+ <method name="getLastNonConfigurationInstance()Ljava/lang/Object;" deprecated="16"/>
+ <method name="getLayoutInflater()Landroid/view/LayoutInflater;"/>
+ <method name="getLoaderManager()Landroid/app/LoaderManager;" since="11"/>
+ <method name="getLocalClassName()Ljava/lang/String;"/>
+ <method name="getMaxNumPictureInPictureActions()I" since="26"/>
+ <method name="getMediaController()Landroid/media/session/MediaController;" since="21"/>
+ <method name="getMenuInflater()Landroid/view/MenuInflater;"/>
+ <method name="getParent()Landroid/app/Activity;"/>
+ <method name="getParentActivityIntent()Landroid/content/Intent;" since="16"/>
+ <method name="getPreferences(I)Landroid/content/SharedPreferences;"/>
+ <method name="getReferrer()Landroid/net/Uri;" since="22"/>
+ <method name="getRequestedOrientation()I"/>
+ <method name="getSearchEvent()Landroid/view/SearchEvent;" since="23"/>
+ <method name="getTaskId()I"/>
+ <method name="getTitle()Ljava/lang/CharSequence;"/>
+ <method name="getTitleColor()I"/>
+ <method name="getVoiceInteractor()Landroid/app/VoiceInteractor;" since="23"/>
+ <method name="getVolumeControlStream()I"/>
+ <method name="getWindow()Landroid/view/Window;"/>
+ <method name="getWindowManager()Landroid/view/WindowManager;"/>
+ <method name="hasWindowFocus()Z" since="3"/>
+ <method name="invalidateOptionsMenu()V" since="11"/>
+ <method name="isActivityTransitionRunning()Z" since="26"/>
+ <method name="isChangingConfigurations()Z" since="11"/>
+ <method name="isChild()Z"/>
+ <method name="isDestroyed()Z" since="17"/>
+ <method name="isFinishing()Z"/>
+ <method name="isImmersive()Z" since="18"/>
+ <method name="isInMultiWindowMode()Z" since="24"/>
+ <method name="isInPictureInPictureMode()Z" since="24"/>
+ <method name="isLocalVoiceInteractionSupported()Z" since="24"/>
+ <method name="isTaskRoot()Z"/>
+ <method name="isVoiceInteraction()Z" since="23"/>
+ <method name="isVoiceInteractionRoot()Z" since="23"/>
+ <method name="managedQuery(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;" deprecated="16"/>
+ <method name="moveTaskToBack(Z)Z"/>
+ <method name="navigateUpTo(Landroid/content/Intent;)Z" since="16"/>
+ <method name="navigateUpToFromChild(Landroid/app/Activity;Landroid/content/Intent;)Z" since="16"/>
+ <method name="onActivityReenter(ILandroid/content/Intent;)V" since="21"/>
+ <method name="onActivityResult(IILandroid/content/Intent;)V"/>
+ <method name="onAttachFragment(Landroid/app/Fragment;)V" since="11"/>
+ <method name="onBackPressed()V" since="5"/>
+ <method name="onChildTitleChanged(Landroid/app/Activity;Ljava/lang/CharSequence;)V"/>
+ <method name="onContextItemSelected(Landroid/view/MenuItem;)Z"/>
+ <method name="onContextMenuClosed(Landroid/view/Menu;)V"/>
+ <method name="onCreate(Landroid/os/Bundle;)V"/>
+ <method name="onCreate(Landroid/os/Bundle;Landroid/os/PersistableBundle;)V" since="21"/>
+ <method name="onCreateDescription()Ljava/lang/CharSequence;"/>
+ <method name="onCreateDialog(I)Landroid/app/Dialog;" deprecated="16"/>
+ <method name="onCreateDialog(ILandroid/os/Bundle;)Landroid/app/Dialog;" since="8" deprecated="16"/>
+ <method name="onCreateNavigateUpTaskStack(Landroid/app/TaskStackBuilder;)V" since="16"/>
+ <method name="onCreateOptionsMenu(Landroid/view/Menu;)Z"/>
+ <method name="onCreateThumbnail(Landroid/graphics/Bitmap;Landroid/graphics/Canvas;)Z"/>
+ <method name="onDestroy()V"/>
+ <method name="onEnterAnimationComplete()V" since="21"/>
+ <method name="onGenericMotionEvent(Landroid/view/MotionEvent;)Z" since="12"/>
+ <method name="onKeyShortcut(ILandroid/view/KeyEvent;)Z" since="11"/>
+ <method name="onLocalVoiceInteractionStarted()V" since="24"/>
+ <method name="onLocalVoiceInteractionStopped()V" since="24"/>
+ <method name="onMultiWindowModeChanged(Z)V" since="24" deprecated="26"/>
+ <method name="onMultiWindowModeChanged(ZLandroid/content/res/Configuration;)V" since="26"/>
+ <method name="onNavigateUp()Z" since="16"/>
+ <method name="onNavigateUpFromChild(Landroid/app/Activity;)Z" since="16"/>
+ <method name="onNewIntent(Landroid/content/Intent;)V"/>
+ <method name="onOptionsItemSelected(Landroid/view/MenuItem;)Z"/>
+ <method name="onOptionsMenuClosed(Landroid/view/Menu;)V"/>
+ <method name="onPause()V"/>
+ <method name="onPictureInPictureModeChanged(Z)V" since="24" deprecated="26"/>
+ <method name="onPictureInPictureModeChanged(ZLandroid/content/res/Configuration;)V" since="26"/>
+ <method name="onPostCreate(Landroid/os/Bundle;)V"/>
+ <method name="onPostCreate(Landroid/os/Bundle;Landroid/os/PersistableBundle;)V" since="21"/>
+ <method name="onPostResume()V"/>
+ <method name="onPrepareDialog(ILandroid/app/Dialog;)V" deprecated="16"/>
+ <method name="onPrepareDialog(ILandroid/app/Dialog;Landroid/os/Bundle;)V" since="8" deprecated="16"/>
+ <method name="onPrepareNavigateUpTaskStack(Landroid/app/TaskStackBuilder;)V" since="16"/>
+ <method name="onPrepareOptionsMenu(Landroid/view/Menu;)Z"/>
+ <method name="onProvideAssistContent(Landroid/app/assist/AssistContent;)V" since="23"/>
+ <method name="onProvideAssistData(Landroid/os/Bundle;)V" since="18"/>
+ <method name="onProvideReferrer()Landroid/net/Uri;" since="23"/>
+ <method name="onRequestPermissionsResult(I[Ljava/lang/String;[I)V" since="23"/>
+ <method name="onRestart()V"/>
+ <method name="onRestoreInstanceState(Landroid/os/Bundle;)V"/>
+ <method name="onRestoreInstanceState(Landroid/os/Bundle;Landroid/os/PersistableBundle;)V" since="21"/>
+ <method name="onResume()V"/>
+ <method name="onRetainNonConfigurationInstance()Ljava/lang/Object;" deprecated="16"/>
+ <method name="onSaveInstanceState(Landroid/os/Bundle;)V"/>
+ <method name="onSaveInstanceState(Landroid/os/Bundle;Landroid/os/PersistableBundle;)V" since="21"/>
+ <method name="onStart()V"/>
+ <method name="onStateNotSaved()V" since="23"/>
+ <method name="onStop()V"/>
+ <method name="onTitleChanged(Ljava/lang/CharSequence;I)V"/>
+ <method name="onTouchEvent(Landroid/view/MotionEvent;)Z"/>
+ <method name="onTrackballEvent(Landroid/view/MotionEvent;)Z"/>
+ <method name="onUserInteraction()V" since="3"/>
+ <method name="onUserLeaveHint()V" since="3"/>
+ <method name="onVisibleBehindCanceled()V" since="21" deprecated="26"/>
+ <method name="openContextMenu(Landroid/view/View;)V"/>
+ <method name="openOptionsMenu()V"/>
+ <method name="overridePendingTransition(II)V" since="5"/>
+ <method name="postponeEnterTransition()V" since="21"/>
+ <method name="recreate()V" since="11"/>
+ <method name="registerForContextMenu(Landroid/view/View;)V"/>
+ <method name="releaseInstance()Z" since="21"/>
+ <method name="removeDialog(I)V" deprecated="16"/>
+ <method name="reportFullyDrawn()V" since="19"/>
+ <method name="requestDragAndDropPermissions(Landroid/view/DragEvent;)Landroid/view/DragAndDropPermissions;" since="24"/>
+ <method name="requestPermissions([Ljava/lang/String;I)V" since="23"/>
+ <method name="requestShowKeyboardShortcuts()V" since="24"/>
+ <method name="requestVisibleBehind(Z)Z" since="21" deprecated="26"/>
+ <method name="requestWindowFeature(I)Z"/>
+ <method name="runOnUiThread(Ljava/lang/Runnable;)V"/>
+ <method name="setActionBar(Landroid/widget/Toolbar;)V" since="21"/>
+ <method name="setContentTransitionManager(Landroid/transition/TransitionManager;)V" since="21"/>
+ <method name="setContentView(I)V"/>
+ <method name="setContentView(Landroid/view/View;)V"/>
+ <method name="setContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V"/>
+ <method name="setDefaultKeyMode(I)V"/>
+ <method name="setEnterSharedElementCallback(Landroid/app/SharedElementCallback;)V" since="21"/>
+ <method name="setExitSharedElementCallback(Landroid/app/SharedElementCallback;)V" since="21"/>
+ <method name="setFeatureDrawable(ILandroid/graphics/drawable/Drawable;)V"/>
+ <method name="setFeatureDrawableAlpha(II)V"/>
+ <method name="setFeatureDrawableResource(II)V"/>
+ <method name="setFeatureDrawableUri(ILandroid/net/Uri;)V"/>
+ <method name="setFinishOnTouchOutside(Z)V" since="11"/>
+ <method name="setImmersive(Z)V" since="18"/>
+ <method name="setIntent(Landroid/content/Intent;)V"/>
+ <method name="setMediaController(Landroid/media/session/MediaController;)V" since="21"/>
+ <method name="setPersistent(Z)V" removed="11"/>
+ <method name="setPictureInPictureParams(Landroid/app/PictureInPictureParams;)V" since="26"/>
+ <method name="setProgress(I)V" deprecated="24"/>
+ <method name="setProgressBarIndeterminate(Z)V" deprecated="24"/>
+ <method name="setProgressBarIndeterminateVisibility(Z)V" deprecated="24"/>
+ <method name="setProgressBarVisibility(Z)V" deprecated="24"/>
+ <method name="setRequestedOrientation(I)V"/>
+ <method name="setResult(I)V"/>
+ <method name="setResult(ILandroid/content/Intent;)V"/>
+ <method name="setSecondaryProgress(I)V" deprecated="24"/>
+ <method name="setTaskDescription(Landroid/app/ActivityManager$TaskDescription;)V" since="21"/>
+ <method name="setTitle(I)V"/>
+ <method name="setTitle(Ljava/lang/CharSequence;)V"/>
+ <method name="setTitleColor(I)V" deprecated="21"/>
+ <method name="setVisible(Z)V" since="3"/>
+ <method name="setVolumeControlStream(I)V"/>
+ <method name="setVrModeEnabled(ZLandroid/content/ComponentName;)V" since="24"/>
+ <method name="shouldShowRequestPermissionRationale(Ljava/lang/String;)Z" since="23"/>
+ <method name="shouldUpRecreateTask(Landroid/content/Intent;)Z" since="16"/>
+ <method name="showAssist(Landroid/os/Bundle;)Z" since="23"/>
+ <method name="showDialog(I)V" deprecated="16"/>
+ <method name="showDialog(ILandroid/os/Bundle;)Z" since="8" deprecated="16"/>
+ <method name="showLockTaskEscapeMessage()V" since="23"/>
+ <method name="startActionMode(Landroid/view/ActionMode$Callback;)Landroid/view/ActionMode;" since="11"/>
+ <method name="startActionMode(Landroid/view/ActionMode$Callback;I)Landroid/view/ActionMode;" since="23"/>
+ <method name="startActivityForResult(Landroid/content/Intent;I)V"/>
+ <method name="startActivityForResult(Landroid/content/Intent;ILandroid/os/Bundle;)V" since="16"/>
+ <method name="startActivityFromChild(Landroid/app/Activity;Landroid/content/Intent;I)V"/>
+ <method name="startActivityFromChild(Landroid/app/Activity;Landroid/content/Intent;ILandroid/os/Bundle;)V" since="16"/>
+ <method name="startActivityFromFragment(Landroid/app/Fragment;Landroid/content/Intent;I)V" since="11"/>
+ <method name="startActivityFromFragment(Landroid/app/Fragment;Landroid/content/Intent;ILandroid/os/Bundle;)V" since="16"/>
+ <method name="startActivityIfNeeded(Landroid/content/Intent;I)Z"/>
+ <method name="startActivityIfNeeded(Landroid/content/Intent;ILandroid/os/Bundle;)Z" since="16"/>
+ <method name="startIntentSenderForResult(Landroid/content/IntentSender;ILandroid/content/Intent;III)V" since="5"/>
+ <method name="startIntentSenderForResult(Landroid/content/IntentSender;ILandroid/content/Intent;IIILandroid/os/Bundle;)V" since="16"/>
+ <method name="startIntentSenderFromChild(Landroid/app/Activity;Landroid/content/IntentSender;ILandroid/content/Intent;III)V" since="5"/>
+ <method name="startIntentSenderFromChild(Landroid/app/Activity;Landroid/content/IntentSender;ILandroid/content/Intent;IIILandroid/os/Bundle;)V" since="16"/>
+ <method name="startLocalVoiceInteraction(Landroid/os/Bundle;)V" since="24"/>
+ <method name="startLockTask()V" since="21"/>
+ <method name="startManagingCursor(Landroid/database/Cursor;)V" deprecated="16"/>
+ <method name="startNextMatchingActivity(Landroid/content/Intent;)Z"/>
+ <method name="startNextMatchingActivity(Landroid/content/Intent;Landroid/os/Bundle;)Z" since="16"/>
+ <method name="startPostponedEnterTransition()V" since="21"/>
+ <method name="startSearch(Ljava/lang/String;ZLandroid/os/Bundle;Z)V"/>
+ <method name="stopLocalVoiceInteraction()V" since="24"/>
+ <method name="stopLockTask()V" since="21"/>
+ <method name="stopManagingCursor(Landroid/database/Cursor;)V" deprecated="16"/>
+ <method name="takeKeyEvents(Z)V"/>
+ <method name="triggerSearch(Ljava/lang/String;Landroid/os/Bundle;)V" since="5"/>
+ <method name="unregisterForContextMenu(Landroid/view/View;)V"/>
+ <field name="DEFAULT_KEYS_DIALER"/>
+ <field name="DEFAULT_KEYS_DISABLE"/>
+ <field name="DEFAULT_KEYS_SEARCH_GLOBAL"/>
+ <field name="DEFAULT_KEYS_SEARCH_LOCAL"/>
+ <field name="DEFAULT_KEYS_SHORTCUT"/>
+ <field name="FOCUSED_STATE_SET"/>
+ <field name="RESULT_CANCELED"/>
+ <field name="RESULT_FIRST_USER"/>
+ <field name="RESULT_OK"/>
+ </class>
+ <class name="android/app/ActivityGroup" since="1" deprecated="13">
+ <extends name="android/app/Activity"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Z)V"/>
+ <method name="getCurrentActivity()Landroid/app/Activity;"/>
+ <method name="getLocalActivityManager()Landroid/app/LocalActivityManager;"/>
+ </class>
+ <class name="android/app/ActivityManager" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addAppTask(Landroid/app/Activity;Landroid/content/Intent;Landroid/app/ActivityManager$TaskDescription;Landroid/graphics/Bitmap;)I" since="21"/>
+ <method name="clearApplicationUserData()Z" since="19"/>
+ <method name="clearWatchHeapLimit()V" since="23"/>
+ <method name="dumpPackageState(Ljava/io/FileDescriptor;Ljava/lang/String;)V" since="19"/>
+ <method name="getAppTaskThumbnailSize()Landroid/util/Size;" since="21"/>
+ <method name="getAppTasks()Ljava/util/List;" since="21"/>
+ <method name="getDeviceConfigurationInfo()Landroid/content/pm/ConfigurationInfo;" since="3"/>
+ <method name="getLargeMemoryClass()I" since="11"/>
+ <method name="getLauncherLargeIconDensity()I" since="11"/>
+ <method name="getLauncherLargeIconSize()I" since="11"/>
+ <method name="getLockTaskModeState()I" since="23"/>
+ <method name="getMemoryClass()I" since="5"/>
+ <method name="getMemoryInfo(Landroid/app/ActivityManager$MemoryInfo;)V"/>
+ <method name="getMyMemoryState(Landroid/app/ActivityManager$RunningAppProcessInfo;)V" since="16"/>
+ <method name="getProcessMemoryInfo([I)[Landroid/os/Debug$MemoryInfo;" since="5"/>
+ <method name="getProcessesInErrorState()Ljava/util/List;"/>
+ <method name="getRecentTasks(II)Ljava/util/List;" deprecated="21"/>
+ <method name="getRunningAppProcesses()Ljava/util/List;" since="3"/>
+ <method name="getRunningServiceControlPanel(Landroid/content/ComponentName;)Landroid/app/PendingIntent;" since="5"/>
+ <method name="getRunningServices(I)Ljava/util/List;" deprecated="26"/>
+ <method name="getRunningTasks(I)Ljava/util/List;" deprecated="21"/>
+ <method name="isInLockTaskMode()Z" since="21" deprecated="23"/>
+ <method name="isLowRamDevice()Z" since="19"/>
+ <method name="isRunningInTestHarness()Z" since="11"/>
+ <method name="isUserAMonkey()Z" since="8"/>
+ <method name="killBackgroundProcesses(Ljava/lang/String;)V" since="8"/>
+ <method name="moveTaskToFront(II)V" since="11"/>
+ <method name="moveTaskToFront(IILandroid/os/Bundle;)V" since="16"/>
+ <method name="restartPackage(Ljava/lang/String;)V" since="3" deprecated="16"/>
+ <method name="setVrThread(I)V" since="25"/>
+ <method name="setWatchHeapLimit(J)V" since="23"/>
+ <field name="ACTION_REPORT_HEAP_LIMIT" since="23"/>
+ <field name="LOCK_TASK_MODE_LOCKED" since="23"/>
+ <field name="LOCK_TASK_MODE_NONE" since="23"/>
+ <field name="LOCK_TASK_MODE_PINNED" since="23"/>
+ <field name="META_HOME_ALTERNATE" since="19"/>
+ <field name="MOVE_TASK_NO_USER_ACTION" since="12"/>
+ <field name="MOVE_TASK_WITH_HOME" since="11"/>
+ <field name="RECENT_IGNORE_UNAVAILABLE" since="11"/>
+ <field name="RECENT_WITH_EXCLUDED"/>
+ </class>
+ <class name="android/app/ActivityManager$AppTask" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="finishAndRemoveTask()V"/>
+ <method name="getTaskInfo()Landroid/app/ActivityManager$RecentTaskInfo;"/>
+ <method name="moveToFront()V"/>
+ <method name="setExcludeFromRecents(Z)V"/>
+ <method name="startActivity(Landroid/content/Context;Landroid/content/Intent;Landroid/os/Bundle;)V"/>
+ </class>
+ <class name="android/app/ActivityManager$MemoryInfo" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="readFromParcel(Landroid/os/Parcel;)V"/>
+ <field name="CREATOR"/>
+ <field name="availMem"/>
+ <field name="lowMemory"/>
+ <field name="threshold"/>
+ <field name="totalMem" since="16"/>
+ </class>
+ <class name="android/app/ActivityManager$ProcessErrorStateInfo" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="readFromParcel(Landroid/os/Parcel;)V"/>
+ <field name="CRASHED"/>
+ <field name="CREATOR"/>
+ <field name="NOT_RESPONDING"/>
+ <field name="NO_ERROR"/>
+ <field name="condition"/>
+ <field name="crashData"/>
+ <field name="longMsg"/>
+ <field name="pid"/>
+ <field name="processName"/>
+ <field name="shortMsg"/>
+ <field name="stackTrace" since="8"/>
+ <field name="tag"/>
+ <field name="uid"/>
+ </class>
+ <class name="android/app/ActivityManager$RecentTaskInfo" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="readFromParcel(Landroid/os/Parcel;)V"/>
+ <field name="CREATOR"/>
+ <field name="affiliatedTaskId" since="21"/>
+ <field name="baseActivity" since="23"/>
+ <field name="baseIntent"/>
+ <field name="description" since="11"/>
+ <field name="id"/>
+ <field name="numActivities" since="23"/>
+ <field name="origActivity"/>
+ <field name="persistentId" since="12"/>
+ <field name="taskDescription" since="21"/>
+ <field name="topActivity" since="23"/>
+ </class>
+ <class name="android/app/ActivityManager$RunningAppProcessInfo" since="3">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;I[Ljava/lang/String;)V"/>
+ <method name="readFromParcel(Landroid/os/Parcel;)V"/>
+ <field name="CREATOR"/>
+ <field name="IMPORTANCE_BACKGROUND" deprecated="26"/>
+ <field name="IMPORTANCE_CACHED" since="26"/>
+ <field name="IMPORTANCE_EMPTY" deprecated="26"/>
+ <field name="IMPORTANCE_FOREGROUND"/>
+ <field name="IMPORTANCE_FOREGROUND_SERVICE" since="23"/>
+ <field name="IMPORTANCE_GONE" since="21"/>
+ <field name="IMPORTANCE_PERCEPTIBLE" since="9"/>
+ <field name="IMPORTANCE_PERCEPTIBLE_PRE_26" since="26"/>
+ <field name="IMPORTANCE_SERVICE"/>
+ <field name="IMPORTANCE_TOP_SLEEPING" since="23"/>
+ <field name="IMPORTANCE_VISIBLE"/>
+ <field name="REASON_PROVIDER_IN_USE" since="5"/>
+ <field name="REASON_SERVICE_IN_USE" since="5"/>
+ <field name="REASON_UNKNOWN" since="5"/>
+ <field name="importance"/>
+ <field name="importanceReasonCode" since="5"/>
+ <field name="importanceReasonComponent" since="5"/>
+ <field name="importanceReasonPid" since="5"/>
+ <field name="lastTrimLevel" since="16"/>
+ <field name="lru"/>
+ <field name="pid"/>
+ <field name="pkgList"/>
+ <field name="processName"/>
+ <field name="uid" since="5"/>
+ </class>
+ <class name="android/app/ActivityManager$RunningServiceInfo" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="readFromParcel(Landroid/os/Parcel;)V"/>
+ <field name="CREATOR"/>
+ <field name="FLAG_FOREGROUND" since="5"/>
+ <field name="FLAG_PERSISTENT_PROCESS" since="5"/>
+ <field name="FLAG_STARTED" since="5"/>
+ <field name="FLAG_SYSTEM_PROCESS" since="5"/>
+ <field name="activeSince"/>
+ <field name="clientCount"/>
+ <field name="clientLabel" since="5"/>
+ <field name="clientPackage" since="5"/>
+ <field name="crashCount"/>
+ <field name="flags" since="5"/>
+ <field name="foreground"/>
+ <field name="lastActivityTime"/>
+ <field name="pid"/>
+ <field name="process"/>
+ <field name="restarting"/>
+ <field name="service"/>
+ <field name="started"/>
+ <field name="uid" since="5"/>
+ </class>
+ <class name="android/app/ActivityManager$RunningTaskInfo" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="readFromParcel(Landroid/os/Parcel;)V"/>
+ <field name="CREATOR"/>
+ <field name="baseActivity"/>
+ <field name="description"/>
+ <field name="id"/>
+ <field name="numActivities"/>
+ <field name="numRunning"/>
+ <field name="thumbnail"/>
+ <field name="topActivity"/>
+ </class>
+ <class name="android/app/ActivityManager$TaskDescription" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/app/ActivityManager$TaskDescription;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Landroid/graphics/Bitmap;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Landroid/graphics/Bitmap;I)V"/>
+ <method name="getIcon()Landroid/graphics/Bitmap;"/>
+ <method name="getLabel()Ljava/lang/String;"/>
+ <method name="getPrimaryColor()I"/>
+ <method name="readFromParcel(Landroid/os/Parcel;)V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/app/ActivityOptions" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getLaunchBounds()Landroid/graphics/Rect;" since="24"/>
+ <method name="getLaunchDisplayId()I" since="26"/>
+ <method name="makeBasic()Landroid/app/ActivityOptions;" since="23"/>
+ <method name="makeClipRevealAnimation(Landroid/view/View;IIII)Landroid/app/ActivityOptions;" since="23"/>
+ <method name="makeCustomAnimation(Landroid/content/Context;II)Landroid/app/ActivityOptions;"/>
+ <method name="makeScaleUpAnimation(Landroid/view/View;IIII)Landroid/app/ActivityOptions;"/>
+ <method name="makeSceneTransitionAnimation(Landroid/app/Activity;Landroid/view/View;Ljava/lang/String;)Landroid/app/ActivityOptions;" since="21"/>
+ <method name="makeSceneTransitionAnimation(Landroid/app/Activity;[Landroid/util/Pair;)Landroid/app/ActivityOptions;" since="21"/>
+ <method name="makeTaskLaunchBehind()Landroid/app/ActivityOptions;" since="21"/>
+ <method name="makeThumbnailScaleUpAnimation(Landroid/view/View;Landroid/graphics/Bitmap;II)Landroid/app/ActivityOptions;"/>
+ <method name="requestUsageTimeReport(Landroid/app/PendingIntent;)V" since="23"/>
+ <method name="setAppVerificationBundle(Landroid/os/Bundle;)Landroid/app/ActivityOptions;" since="26"/>
+ <method name="setLaunchBounds(Landroid/graphics/Rect;)Landroid/app/ActivityOptions;" since="24"/>
+ <method name="setLaunchDisplayId(I)Landroid/app/ActivityOptions;" since="26"/>
+ <method name="toBundle()Landroid/os/Bundle;"/>
+ <method name="update(Landroid/app/ActivityOptions;)V"/>
+ <field name="EXTRA_USAGE_TIME_REPORT" since="23"/>
+ <field name="EXTRA_USAGE_TIME_REPORT_PACKAGES" since="23"/>
+ </class>
+ <class name="android/app/AlarmManager" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="cancel(Landroid/app/AlarmManager$OnAlarmListener;)V" since="24"/>
+ <method name="cancel(Landroid/app/PendingIntent;)V"/>
+ <method name="getNextAlarmClock()Landroid/app/AlarmManager$AlarmClockInfo;" since="21"/>
+ <method name="set(IJLandroid/app/PendingIntent;)V"/>
+ <method name="set(IJLjava/lang/String;Landroid/app/AlarmManager$OnAlarmListener;Landroid/os/Handler;)V" since="24"/>
+ <method name="setAlarmClock(Landroid/app/AlarmManager$AlarmClockInfo;Landroid/app/PendingIntent;)V" since="21"/>
+ <method name="setAndAllowWhileIdle(IJLandroid/app/PendingIntent;)V" since="23"/>
+ <method name="setExact(IJLandroid/app/PendingIntent;)V" since="19"/>
+ <method name="setExact(IJLjava/lang/String;Landroid/app/AlarmManager$OnAlarmListener;Landroid/os/Handler;)V" since="24"/>
+ <method name="setExactAndAllowWhileIdle(IJLandroid/app/PendingIntent;)V" since="23"/>
+ <method name="setInexactRepeating(IJJLandroid/app/PendingIntent;)V" since="3"/>
+ <method name="setRepeating(IJJLandroid/app/PendingIntent;)V"/>
+ <method name="setTime(J)V" since="8"/>
+ <method name="setTimeZone(Ljava/lang/String;)V"/>
+ <method name="setWindow(IJJLandroid/app/PendingIntent;)V" since="19"/>
+ <method name="setWindow(IJJLjava/lang/String;Landroid/app/AlarmManager$OnAlarmListener;Landroid/os/Handler;)V" since="24"/>
+ <field name="ACTION_NEXT_ALARM_CLOCK_CHANGED" since="21"/>
+ <field name="ELAPSED_REALTIME"/>
+ <field name="ELAPSED_REALTIME_WAKEUP"/>
+ <field name="INTERVAL_DAY" since="3"/>
+ <field name="INTERVAL_FIFTEEN_MINUTES" since="3"/>
+ <field name="INTERVAL_HALF_DAY" since="3"/>
+ <field name="INTERVAL_HALF_HOUR" since="3"/>
+ <field name="INTERVAL_HOUR" since="3"/>
+ <field name="RTC"/>
+ <field name="RTC_WAKEUP"/>
+ </class>
+ <class name="android/app/AlarmManager$AlarmClockInfo" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(JLandroid/app/PendingIntent;)V"/>
+ <method name="getShowIntent()Landroid/app/PendingIntent;"/>
+ <method name="getTriggerTime()J"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/app/AlarmManager$OnAlarmListener" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="onAlarm()V"/>
+ </class>
+ <class name="android/app/AlertDialog" since="1">
+ <extends name="android/app/Dialog"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;ZLandroid/content/DialogInterface$OnCancelListener;)V"/>
+ <method name="getButton(I)Landroid/widget/Button;" since="3"/>
+ <method name="getListView()Landroid/widget/ListView;" since="3"/>
+ <method name="setButton(ILjava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)V" since="3"/>
+ <method name="setButton(ILjava/lang/CharSequence;Landroid/os/Message;)V" since="3"/>
+ <method name="setButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)V" deprecated="16"/>
+ <method name="setButton(Ljava/lang/CharSequence;Landroid/os/Message;)V" deprecated="16"/>
+ <method name="setButton2(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)V" deprecated="16"/>
+ <method name="setButton2(Ljava/lang/CharSequence;Landroid/os/Message;)V" deprecated="16"/>
+ <method name="setButton3(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)V" deprecated="16"/>
+ <method name="setButton3(Ljava/lang/CharSequence;Landroid/os/Message;)V" deprecated="16"/>
+ <method name="setCustomTitle(Landroid/view/View;)V"/>
+ <method name="setIcon(I)V"/>
+ <method name="setIcon(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setIconAttribute(I)V" since="11"/>
+ <method name="setInverseBackgroundForced(Z)V"/>
+ <method name="setMessage(Ljava/lang/CharSequence;)V"/>
+ <method name="setView(Landroid/view/View;)V"/>
+ <method name="setView(Landroid/view/View;IIII)V" since="3"/>
+ <field name="THEME_DEVICE_DEFAULT_DARK" since="14" deprecated="23"/>
+ <field name="THEME_DEVICE_DEFAULT_LIGHT" since="14" deprecated="23"/>
+ <field name="THEME_HOLO_DARK" since="11" deprecated="23"/>
+ <field name="THEME_HOLO_LIGHT" since="11" deprecated="23"/>
+ <field name="THEME_TRADITIONAL" since="11" deprecated="23"/>
+ </class>
+ <class name="android/app/AlertDialog$Builder" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;I)V" since="11"/>
+ <method name="create()Landroid/app/AlertDialog;"/>
+ <method name="getContext()Landroid/content/Context;" since="11"/>
+ <method name="setAdapter(Landroid/widget/ListAdapter;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setCancelable(Z)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setCursor(Landroid/database/Cursor;Landroid/content/DialogInterface$OnClickListener;Ljava/lang/String;)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setCustomTitle(Landroid/view/View;)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setIcon(I)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setIcon(Landroid/graphics/drawable/Drawable;)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setIconAttribute(I)Landroid/app/AlertDialog$Builder;" since="11"/>
+ <method name="setInverseBackgroundForced(Z)Landroid/app/AlertDialog$Builder;" deprecated="23"/>
+ <method name="setItems(ILandroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setItems([Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setMessage(I)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setMessage(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setMultiChoiceItems(I[ZLandroid/content/DialogInterface$OnMultiChoiceClickListener;)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setMultiChoiceItems(Landroid/database/Cursor;Ljava/lang/String;Ljava/lang/String;Landroid/content/DialogInterface$OnMultiChoiceClickListener;)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setMultiChoiceItems([Ljava/lang/CharSequence;[ZLandroid/content/DialogInterface$OnMultiChoiceClickListener;)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setNegativeButton(ILandroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setNegativeButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setNeutralButton(ILandroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setNeutralButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setOnCancelListener(Landroid/content/DialogInterface$OnCancelListener;)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setOnDismissListener(Landroid/content/DialogInterface$OnDismissListener;)Landroid/app/AlertDialog$Builder;" since="17"/>
+ <method name="setOnItemSelectedListener(Landroid/widget/AdapterView$OnItemSelectedListener;)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setOnKeyListener(Landroid/content/DialogInterface$OnKeyListener;)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setPositiveButton(ILandroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setPositiveButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setSingleChoiceItems(IILandroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setSingleChoiceItems(Landroid/database/Cursor;ILjava/lang/String;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setSingleChoiceItems(Landroid/widget/ListAdapter;ILandroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setSingleChoiceItems([Ljava/lang/CharSequence;ILandroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setTitle(I)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setTitle(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;"/>
+ <method name="setView(I)Landroid/app/AlertDialog$Builder;" since="21"/>
+ <method name="setView(Landroid/view/View;)Landroid/app/AlertDialog$Builder;"/>
+ <method name="show()Landroid/app/AlertDialog;"/>
+ </class>
+ <class name="android/app/AliasActivity" since="1">
+ <extends name="android/app/Activity"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/app/AppOpsManager" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="checkOp(Ljava/lang/String;ILjava/lang/String;)I"/>
+ <method name="checkOpNoThrow(Ljava/lang/String;ILjava/lang/String;)I"/>
+ <method name="checkPackage(ILjava/lang/String;)V"/>
+ <method name="finishOp(Ljava/lang/String;ILjava/lang/String;)V"/>
+ <method name="noteOp(Ljava/lang/String;ILjava/lang/String;)I"/>
+ <method name="noteOpNoThrow(Ljava/lang/String;ILjava/lang/String;)I"/>
+ <method name="noteProxyOp(Ljava/lang/String;Ljava/lang/String;)I" since="23"/>
+ <method name="noteProxyOpNoThrow(Ljava/lang/String;Ljava/lang/String;)I" since="23"/>
+ <method name="permissionToOp(Ljava/lang/String;)Ljava/lang/String;" since="23"/>
+ <method name="startOp(Ljava/lang/String;ILjava/lang/String;)I"/>
+ <method name="startOpNoThrow(Ljava/lang/String;ILjava/lang/String;)I"/>
+ <method name="startWatchingMode(Ljava/lang/String;Ljava/lang/String;Landroid/app/AppOpsManager$OnOpChangedListener;)V"/>
+ <method name="stopWatchingMode(Landroid/app/AppOpsManager$OnOpChangedListener;)V"/>
+ <field name="MODE_ALLOWED"/>
+ <field name="MODE_DEFAULT" since="21"/>
+ <field name="MODE_ERRORED"/>
+ <field name="MODE_IGNORED"/>
+ <field name="OPSTR_ADD_VOICEMAIL" since="23"/>
+ <field name="OPSTR_ANSWER_PHONE_CALLS" since="26"/>
+ <field name="OPSTR_BODY_SENSORS" since="23"/>
+ <field name="OPSTR_CALL_PHONE" since="23"/>
+ <field name="OPSTR_CAMERA" since="23"/>
+ <field name="OPSTR_COARSE_LOCATION"/>
+ <field name="OPSTR_FINE_LOCATION"/>
+ <field name="OPSTR_GET_USAGE_STATS" since="21"/>
+ <field name="OPSTR_MOCK_LOCATION" since="23"/>
+ <field name="OPSTR_MONITOR_HIGH_POWER_LOCATION"/>
+ <field name="OPSTR_MONITOR_LOCATION"/>
+ <field name="OPSTR_PICTURE_IN_PICTURE" since="26"/>
+ <field name="OPSTR_PROCESS_OUTGOING_CALLS" since="26"/>
+ <field name="OPSTR_READ_CALENDAR" since="23"/>
+ <field name="OPSTR_READ_CALL_LOG" since="23"/>
+ <field name="OPSTR_READ_CELL_BROADCASTS" since="23"/>
+ <field name="OPSTR_READ_CONTACTS" since="23"/>
+ <field name="OPSTR_READ_EXTERNAL_STORAGE" since="23"/>
+ <field name="OPSTR_READ_PHONE_NUMBERS" since="26"/>
+ <field name="OPSTR_READ_PHONE_STATE" since="23"/>
+ <field name="OPSTR_READ_SMS" since="23"/>
+ <field name="OPSTR_RECEIVE_MMS" since="23"/>
+ <field name="OPSTR_RECEIVE_SMS" since="23"/>
+ <field name="OPSTR_RECEIVE_WAP_PUSH" since="23"/>
+ <field name="OPSTR_RECORD_AUDIO" since="23"/>
+ <field name="OPSTR_SEND_SMS" since="23"/>
+ <field name="OPSTR_SYSTEM_ALERT_WINDOW" since="23"/>
+ <field name="OPSTR_USE_FINGERPRINT" since="23"/>
+ <field name="OPSTR_USE_SIP" since="23"/>
+ <field name="OPSTR_WRITE_CALENDAR" since="23"/>
+ <field name="OPSTR_WRITE_CALL_LOG" since="23"/>
+ <field name="OPSTR_WRITE_CONTACTS" since="23"/>
+ <field name="OPSTR_WRITE_EXTERNAL_STORAGE" since="23"/>
+ <field name="OPSTR_WRITE_SETTINGS" since="23"/>
+ </class>
+ <class name="android/app/AppOpsManager$OnOpChangedListener" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="onOpChanged(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/app/Application" since="1">
+ <extends name="android/content/ContextWrapper"/>
+ <implements name="android/content/ComponentCallbacks" removed="14"/>
+ <implements name="android/content/ComponentCallbacks2" since="14"/>
+ <method name="&lt;init>()V"/>
+ <method name="onCreate()V"/>
+ <method name="onTerminate()V"/>
+ <method name="registerActivityLifecycleCallbacks(Landroid/app/Application$ActivityLifecycleCallbacks;)V" since="14"/>
+ <method name="registerOnProvideAssistDataListener(Landroid/app/Application$OnProvideAssistDataListener;)V" since="18"/>
+ <method name="unregisterActivityLifecycleCallbacks(Landroid/app/Application$ActivityLifecycleCallbacks;)V" since="14"/>
+ <method name="unregisterOnProvideAssistDataListener(Landroid/app/Application$OnProvideAssistDataListener;)V" since="18"/>
+ </class>
+ <class name="android/app/Application$ActivityLifecycleCallbacks" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V"/>
+ <method name="onActivityDestroyed(Landroid/app/Activity;)V"/>
+ <method name="onActivityPaused(Landroid/app/Activity;)V"/>
+ <method name="onActivityResumed(Landroid/app/Activity;)V"/>
+ <method name="onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V"/>
+ <method name="onActivityStarted(Landroid/app/Activity;)V"/>
+ <method name="onActivityStopped(Landroid/app/Activity;)V"/>
+ </class>
+ <class name="android/app/Application$OnProvideAssistDataListener" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="onProvideAssistData(Landroid/app/Activity;Landroid/os/Bundle;)V"/>
+ </class>
+ <class name="android/app/ApplicationErrorReport" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V"/>
+ <method name="getErrorReportReceiver(Landroid/content/Context;Ljava/lang/String;I)Landroid/content/ComponentName;"/>
+ <method name="readFromParcel(Landroid/os/Parcel;)V"/>
+ <field name="CREATOR"/>
+ <field name="TYPE_ANR"/>
+ <field name="TYPE_BATTERY"/>
+ <field name="TYPE_CRASH"/>
+ <field name="TYPE_NONE"/>
+ <field name="TYPE_RUNNING_SERVICE"/>
+ <field name="anrInfo"/>
+ <field name="batteryInfo"/>
+ <field name="crashInfo"/>
+ <field name="installerPackageName"/>
+ <field name="packageName"/>
+ <field name="processName"/>
+ <field name="runningServiceInfo"/>
+ <field name="systemApp"/>
+ <field name="time"/>
+ <field name="type"/>
+ </class>
+ <class name="android/app/ApplicationErrorReport$AnrInfo" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V"/>
+ <method name="writeToParcel(Landroid/os/Parcel;I)V"/>
+ <field name="activity"/>
+ <field name="cause"/>
+ <field name="info"/>
+ </class>
+ <class name="android/app/ApplicationErrorReport$BatteryInfo" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V"/>
+ <method name="writeToParcel(Landroid/os/Parcel;I)V"/>
+ <field name="checkinDetails"/>
+ <field name="durationMicros"/>
+ <field name="usageDetails"/>
+ <field name="usagePercent"/>
+ </class>
+ <class name="android/app/ApplicationErrorReport$CrashInfo" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V"/>
+ <method name="writeToParcel(Landroid/os/Parcel;I)V"/>
+ <field name="exceptionClassName"/>
+ <field name="exceptionMessage"/>
+ <field name="stackTrace"/>
+ <field name="throwClassName"/>
+ <field name="throwFileName"/>
+ <field name="throwLineNumber"/>
+ <field name="throwMethodName"/>
+ </class>
+ <class name="android/app/ApplicationErrorReport$RunningServiceInfo" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V"/>
+ <method name="writeToParcel(Landroid/os/Parcel;I)V"/>
+ <field name="durationMillis"/>
+ <field name="serviceDetails"/>
+ </class>
+ <class name="android/app/AuthenticationRequiredException" since="26">
+ <extends name="java/lang/SecurityException"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;Landroid/app/PendingIntent;)V"/>
+ <method name="getUserAction()Landroid/app/PendingIntent;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/app/AutomaticZenRule" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Landroid/content/ComponentName;Landroid/net/Uri;IZ)V"/>
+ <method name="getConditionId()Landroid/net/Uri;"/>
+ <method name="getCreationTime()J"/>
+ <method name="getInterruptionFilter()I"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getOwner()Landroid/content/ComponentName;"/>
+ <method name="isEnabled()Z"/>
+ <method name="setConditionId(Landroid/net/Uri;)V"/>
+ <method name="setEnabled(Z)V"/>
+ <method name="setInterruptionFilter(I)V"/>
+ <method name="setName(Ljava/lang/String;)V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/app/DatePickerDialog" since="1">
+ <extends name="android/app/AlertDialog"/>
+ <implements name="android/content/DialogInterface$OnClickListener"/>
+ <implements name="android/widget/DatePicker$OnDateChangedListener"/>
+ <method name="&lt;init>(Landroid/content/Context;)V" since="24"/>
+ <method name="&lt;init>(Landroid/content/Context;I)V" since="24"/>
+ <method name="&lt;init>(Landroid/content/Context;ILandroid/app/DatePickerDialog$OnDateSetListener;III)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/app/DatePickerDialog$OnDateSetListener;III)V"/>
+ <method name="getDatePicker()Landroid/widget/DatePicker;" since="11"/>
+ <method name="setOnDateSetListener(Landroid/app/DatePickerDialog$OnDateSetListener;)V" since="24"/>
+ <method name="updateDate(III)V"/>
+ </class>
+ <class name="android/app/DatePickerDialog$OnDateSetListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onDateSet(Landroid/widget/DatePicker;III)V"/>
+ </class>
+ <class name="android/app/Dialog" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/content/DialogInterface"/>
+ <implements name="android/view/KeyEvent$Callback"/>
+ <implements name="android/view/View$OnCreateContextMenuListener"/>
+ <implements name="android/view/Window$Callback"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;ZLandroid/content/DialogInterface$OnCancelListener;)V"/>
+ <method name="addContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V"/>
+ <method name="closeOptionsMenu()V"/>
+ <method name="create()V" since="21"/>
+ <method name="findViewById(I)Landroid/view/View;"/>
+ <method name="getActionBar()Landroid/app/ActionBar;" since="11"/>
+ <method name="getContext()Landroid/content/Context;"/>
+ <method name="getCurrentFocus()Landroid/view/View;"/>
+ <method name="getLayoutInflater()Landroid/view/LayoutInflater;"/>
+ <method name="getOwnerActivity()Landroid/app/Activity;"/>
+ <method name="getSearchEvent()Landroid/view/SearchEvent;" since="23"/>
+ <method name="getVolumeControlStream()I"/>
+ <method name="getWindow()Landroid/view/Window;"/>
+ <method name="hide()V"/>
+ <method name="invalidateOptionsMenu()V" since="11"/>
+ <method name="isShowing()Z"/>
+ <method name="onBackPressed()V" since="5"/>
+ <method name="onContextItemSelected(Landroid/view/MenuItem;)Z"/>
+ <method name="onContextMenuClosed(Landroid/view/Menu;)V"/>
+ <method name="onCreate(Landroid/os/Bundle;)V"/>
+ <method name="onCreateOptionsMenu(Landroid/view/Menu;)Z"/>
+ <method name="onGenericMotionEvent(Landroid/view/MotionEvent;)Z" since="12"/>
+ <method name="onKeyShortcut(ILandroid/view/KeyEvent;)Z" since="11"/>
+ <method name="onOptionsItemSelected(Landroid/view/MenuItem;)Z"/>
+ <method name="onOptionsMenuClosed(Landroid/view/Menu;)V"/>
+ <method name="onPrepareOptionsMenu(Landroid/view/Menu;)Z"/>
+ <method name="onRestoreInstanceState(Landroid/os/Bundle;)V"/>
+ <method name="onSaveInstanceState()Landroid/os/Bundle;"/>
+ <method name="onStart()V"/>
+ <method name="onStop()V"/>
+ <method name="onTouchEvent(Landroid/view/MotionEvent;)Z"/>
+ <method name="onTrackballEvent(Landroid/view/MotionEvent;)Z"/>
+ <method name="openContextMenu(Landroid/view/View;)V"/>
+ <method name="openOptionsMenu()V"/>
+ <method name="registerForContextMenu(Landroid/view/View;)V"/>
+ <method name="requestWindowFeature(I)Z"/>
+ <method name="setCancelMessage(Landroid/os/Message;)V"/>
+ <method name="setCancelable(Z)V"/>
+ <method name="setCanceledOnTouchOutside(Z)V"/>
+ <method name="setContentView(I)V"/>
+ <method name="setContentView(Landroid/view/View;)V"/>
+ <method name="setContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V"/>
+ <method name="setDismissMessage(Landroid/os/Message;)V"/>
+ <method name="setFeatureDrawable(ILandroid/graphics/drawable/Drawable;)V"/>
+ <method name="setFeatureDrawableAlpha(II)V"/>
+ <method name="setFeatureDrawableResource(II)V"/>
+ <method name="setFeatureDrawableUri(ILandroid/net/Uri;)V"/>
+ <method name="setOnCancelListener(Landroid/content/DialogInterface$OnCancelListener;)V"/>
+ <method name="setOnDismissListener(Landroid/content/DialogInterface$OnDismissListener;)V"/>
+ <method name="setOnKeyListener(Landroid/content/DialogInterface$OnKeyListener;)V"/>
+ <method name="setOnShowListener(Landroid/content/DialogInterface$OnShowListener;)V" since="8"/>
+ <method name="setOwnerActivity(Landroid/app/Activity;)V"/>
+ <method name="setTitle(I)V"/>
+ <method name="setTitle(Ljava/lang/CharSequence;)V"/>
+ <method name="setVolumeControlStream(I)V"/>
+ <method name="show()V"/>
+ <method name="takeKeyEvents(Z)V"/>
+ <method name="unregisterForContextMenu(Landroid/view/View;)V"/>
+ </class>
+ <class name="android/app/DialogFragment" since="11">
+ <extends name="android/app/Fragment"/>
+ <implements name="android/content/DialogInterface$OnCancelListener"/>
+ <implements name="android/content/DialogInterface$OnDismissListener"/>
+ <method name="&lt;init>()V"/>
+ <method name="dismiss()V"/>
+ <method name="dismissAllowingStateLoss()V" since="12"/>
+ <method name="getDialog()Landroid/app/Dialog;"/>
+ <method name="getShowsDialog()Z"/>
+ <method name="getTheme()I"/>
+ <method name="isCancelable()Z"/>
+ <method name="onCreateDialog(Landroid/os/Bundle;)Landroid/app/Dialog;"/>
+ <method name="setCancelable(Z)V"/>
+ <method name="setShowsDialog(Z)V"/>
+ <method name="setStyle(II)V"/>
+ <method name="show(Landroid/app/FragmentManager;Ljava/lang/String;)V"/>
+ <method name="show(Landroid/app/FragmentTransaction;Ljava/lang/String;)I"/>
+ <field name="STYLE_NORMAL"/>
+ <field name="STYLE_NO_FRAME"/>
+ <field name="STYLE_NO_INPUT"/>
+ <field name="STYLE_NO_TITLE"/>
+ </class>
+ <class name="android/app/DownloadManager" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addCompletedDownload(Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;JZ)J" since="12"/>
+ <method name="addCompletedDownload(Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;JZLandroid/net/Uri;Landroid/net/Uri;)J" since="24"/>
+ <method name="enqueue(Landroid/app/DownloadManager$Request;)J"/>
+ <method name="getMaxBytesOverMobile(Landroid/content/Context;)Ljava/lang/Long;" since="11"/>
+ <method name="getMimeTypeForDownloadedFile(J)Ljava/lang/String;" since="11"/>
+ <method name="getRecommendedMaxBytesOverMobile(Landroid/content/Context;)Ljava/lang/Long;" since="11"/>
+ <method name="getUriForDownloadedFile(J)Landroid/net/Uri;" since="11"/>
+ <method name="openDownloadedFile(J)Landroid/os/ParcelFileDescriptor;"/>
+ <method name="query(Landroid/app/DownloadManager$Query;)Landroid/database/Cursor;"/>
+ <method name="remove([J)I"/>
+ <field name="ACTION_DOWNLOAD_COMPLETE"/>
+ <field name="ACTION_NOTIFICATION_CLICKED"/>
+ <field name="ACTION_VIEW_DOWNLOADS"/>
+ <field name="COLUMN_BYTES_DOWNLOADED_SO_FAR"/>
+ <field name="COLUMN_DESCRIPTION"/>
+ <field name="COLUMN_ID"/>
+ <field name="COLUMN_LAST_MODIFIED_TIMESTAMP"/>
+ <field name="COLUMN_LOCAL_FILENAME" since="11" deprecated="24"/>
+ <field name="COLUMN_LOCAL_URI"/>
+ <field name="COLUMN_MEDIAPROVIDER_URI"/>
+ <field name="COLUMN_MEDIA_TYPE"/>
+ <field name="COLUMN_REASON"/>
+ <field name="COLUMN_STATUS"/>
+ <field name="COLUMN_TITLE"/>
+ <field name="COLUMN_TOTAL_SIZE_BYTES"/>
+ <field name="COLUMN_URI"/>
+ <field name="ERROR_CANNOT_RESUME"/>
+ <field name="ERROR_DEVICE_NOT_FOUND"/>
+ <field name="ERROR_FILE_ALREADY_EXISTS"/>
+ <field name="ERROR_FILE_ERROR"/>
+ <field name="ERROR_HTTP_DATA_ERROR"/>
+ <field name="ERROR_INSUFFICIENT_SPACE"/>
+ <field name="ERROR_TOO_MANY_REDIRECTS"/>
+ <field name="ERROR_UNHANDLED_HTTP_CODE"/>
+ <field name="ERROR_UNKNOWN"/>
+ <field name="EXTRA_DOWNLOAD_ID"/>
+ <field name="EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS" since="11"/>
+ <field name="INTENT_EXTRAS_SORT_BY_SIZE" since="12"/>
+ <field name="PAUSED_QUEUED_FOR_WIFI"/>
+ <field name="PAUSED_UNKNOWN"/>
+ <field name="PAUSED_WAITING_FOR_NETWORK"/>
+ <field name="PAUSED_WAITING_TO_RETRY"/>
+ <field name="STATUS_FAILED"/>
+ <field name="STATUS_PAUSED"/>
+ <field name="STATUS_PENDING"/>
+ <field name="STATUS_RUNNING"/>
+ <field name="STATUS_SUCCESSFUL"/>
+ </class>
+ <class name="android/app/DownloadManager$Query" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="setFilterById([J)Landroid/app/DownloadManager$Query;"/>
+ <method name="setFilterByStatus(I)Landroid/app/DownloadManager$Query;"/>
+ </class>
+ <class name="android/app/DownloadManager$Request" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/net/Uri;)V"/>
+ <method name="addRequestHeader(Ljava/lang/String;Ljava/lang/String;)Landroid/app/DownloadManager$Request;"/>
+ <method name="allowScanningByMediaScanner()V" since="11"/>
+ <method name="setAllowedNetworkTypes(I)Landroid/app/DownloadManager$Request;"/>
+ <method name="setAllowedOverMetered(Z)Landroid/app/DownloadManager$Request;" since="16"/>
+ <method name="setAllowedOverRoaming(Z)Landroid/app/DownloadManager$Request;"/>
+ <method name="setDescription(Ljava/lang/CharSequence;)Landroid/app/DownloadManager$Request;"/>
+ <method name="setDestinationInExternalFilesDir(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)Landroid/app/DownloadManager$Request;"/>
+ <method name="setDestinationInExternalPublicDir(Ljava/lang/String;Ljava/lang/String;)Landroid/app/DownloadManager$Request;"/>
+ <method name="setDestinationUri(Landroid/net/Uri;)Landroid/app/DownloadManager$Request;"/>
+ <method name="setMimeType(Ljava/lang/String;)Landroid/app/DownloadManager$Request;"/>
+ <method name="setNotificationVisibility(I)Landroid/app/DownloadManager$Request;" since="11"/>
+ <method name="setRequiresCharging(Z)Landroid/app/DownloadManager$Request;" since="24"/>
+ <method name="setRequiresDeviceIdle(Z)Landroid/app/DownloadManager$Request;" since="24"/>
+ <method name="setShowRunningNotification(Z)Landroid/app/DownloadManager$Request;" deprecated="16"/>
+ <method name="setTitle(Ljava/lang/CharSequence;)Landroid/app/DownloadManager$Request;"/>
+ <method name="setVisibleInDownloadsUi(Z)Landroid/app/DownloadManager$Request;"/>
+ <field name="NETWORK_MOBILE"/>
+ <field name="NETWORK_WIFI"/>
+ <field name="VISIBILITY_HIDDEN" since="11"/>
+ <field name="VISIBILITY_VISIBLE" since="11"/>
+ <field name="VISIBILITY_VISIBLE_NOTIFY_COMPLETED" since="11"/>
+ <field name="VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION" since="12"/>
+ </class>
+ <class name="android/app/ExpandableListActivity" since="1">
+ <extends name="android/app/Activity"/>
+ <implements name="android/widget/ExpandableListView$OnChildClickListener"/>
+ <implements name="android/widget/ExpandableListView$OnGroupCollapseListener"/>
+ <implements name="android/widget/ExpandableListView$OnGroupExpandListener"/>
+ <method name="&lt;init>()V"/>
+ <method name="getExpandableListAdapter()Landroid/widget/ExpandableListAdapter;"/>
+ <method name="getExpandableListView()Landroid/widget/ExpandableListView;"/>
+ <method name="getSelectedId()J"/>
+ <method name="getSelectedPosition()J"/>
+ <method name="setListAdapter(Landroid/widget/ExpandableListAdapter;)V"/>
+ <method name="setSelectedChild(IIZ)Z"/>
+ <method name="setSelectedGroup(I)V"/>
+ </class>
+ <class name="android/app/Fragment" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="android/content/ComponentCallbacks" removed="14"/>
+ <implements name="android/content/ComponentCallbacks2" since="14"/>
+ <implements name="android/view/View$OnCreateContextMenuListener"/>
+ <method name="&lt;init>()V"/>
+ <method name="dump(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V"/>
+ <method name="getActivity()Landroid/app/Activity;"/>
+ <method name="getAllowEnterTransitionOverlap()Z" since="21"/>
+ <method name="getAllowReturnTransitionOverlap()Z" since="21"/>
+ <method name="getArguments()Landroid/os/Bundle;"/>
+ <method name="getChildFragmentManager()Landroid/app/FragmentManager;" since="17"/>
+ <method name="getContext()Landroid/content/Context;" since="23"/>
+ <method name="getEnterTransition()Landroid/transition/Transition;" since="21"/>
+ <method name="getExitTransition()Landroid/transition/Transition;" since="21"/>
+ <method name="getFragmentManager()Landroid/app/FragmentManager;"/>
+ <method name="getHost()Ljava/lang/Object;" since="23"/>
+ <method name="getId()I"/>
+ <method name="getLayoutInflater()Landroid/view/LayoutInflater;" since="26"/>
+ <method name="getLoaderManager()Landroid/app/LoaderManager;"/>
+ <method name="getParentFragment()Landroid/app/Fragment;" since="17"/>
+ <method name="getReenterTransition()Landroid/transition/Transition;" since="21"/>
+ <method name="getResources()Landroid/content/res/Resources;"/>
+ <method name="getRetainInstance()Z"/>
+ <method name="getReturnTransition()Landroid/transition/Transition;" since="21"/>
+ <method name="getSharedElementEnterTransition()Landroid/transition/Transition;" since="21"/>
+ <method name="getSharedElementReturnTransition()Landroid/transition/Transition;" since="21"/>
+ <method name="getString(I)Ljava/lang/String;"/>
+ <method name="getString(I[Ljava/lang/Object;)Ljava/lang/String;"/>
+ <method name="getTag()Ljava/lang/String;"/>
+ <method name="getTargetFragment()Landroid/app/Fragment;"/>
+ <method name="getTargetRequestCode()I"/>
+ <method name="getText(I)Ljava/lang/CharSequence;"/>
+ <method name="getUserVisibleHint()Z" since="15"/>
+ <method name="getView()Landroid/view/View;"/>
+ <method name="instantiate(Landroid/content/Context;Ljava/lang/String;)Landroid/app/Fragment;"/>
+ <method name="instantiate(Landroid/content/Context;Ljava/lang/String;Landroid/os/Bundle;)Landroid/app/Fragment;"/>
+ <method name="isAdded()Z"/>
+ <method name="isDetached()Z" since="13"/>
+ <method name="isHidden()Z"/>
+ <method name="isInLayout()Z"/>
+ <method name="isRemoving()Z"/>
+ <method name="isResumed()Z"/>
+ <method name="isStateSaved()Z" since="26"/>
+ <method name="isVisible()Z"/>
+ <method name="onActivityCreated(Landroid/os/Bundle;)V"/>
+ <method name="onActivityResult(IILandroid/content/Intent;)V"/>
+ <method name="onAttach(Landroid/app/Activity;)V" deprecated="23"/>
+ <method name="onAttach(Landroid/content/Context;)V" since="23"/>
+ <method name="onAttachFragment(Landroid/app/Fragment;)V" since="24"/>
+ <method name="onContextItemSelected(Landroid/view/MenuItem;)Z"/>
+ <method name="onCreate(Landroid/os/Bundle;)V"/>
+ <method name="onCreateAnimator(IZI)Landroid/animation/Animator;"/>
+ <method name="onCreateOptionsMenu(Landroid/view/Menu;Landroid/view/MenuInflater;)V"/>
+ <method name="onCreateView(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)Landroid/view/View;"/>
+ <method name="onDestroy()V"/>
+ <method name="onDestroyOptionsMenu()V"/>
+ <method name="onDestroyView()V"/>
+ <method name="onDetach()V"/>
+ <method name="onGetLayoutInflater(Landroid/os/Bundle;)Landroid/view/LayoutInflater;" since="26"/>
+ <method name="onHiddenChanged(Z)V"/>
+ <method name="onInflate(Landroid/app/Activity;Landroid/util/AttributeSet;Landroid/os/Bundle;)V" since="12" deprecated="23"/>
+ <method name="onInflate(Landroid/content/Context;Landroid/util/AttributeSet;Landroid/os/Bundle;)V" since="23"/>
+ <method name="onInflate(Landroid/util/AttributeSet;Landroid/os/Bundle;)V" deprecated="16"/>
+ <method name="onMultiWindowModeChanged(Z)V" since="24" deprecated="26"/>
+ <method name="onMultiWindowModeChanged(ZLandroid/content/res/Configuration;)V" since="26"/>
+ <method name="onOptionsItemSelected(Landroid/view/MenuItem;)Z"/>
+ <method name="onOptionsMenuClosed(Landroid/view/Menu;)V"/>
+ <method name="onPause()V"/>
+ <method name="onPictureInPictureModeChanged(Z)V" since="24" deprecated="26"/>
+ <method name="onPictureInPictureModeChanged(ZLandroid/content/res/Configuration;)V" since="26"/>
+ <method name="onPrepareOptionsMenu(Landroid/view/Menu;)V"/>
+ <method name="onRequestPermissionsResult(I[Ljava/lang/String;[I)V" since="23"/>
+ <method name="onResume()V"/>
+ <method name="onSaveInstanceState(Landroid/os/Bundle;)V"/>
+ <method name="onStart()V"/>
+ <method name="onStop()V"/>
+ <method name="onViewCreated(Landroid/view/View;Landroid/os/Bundle;)V" since="13"/>
+ <method name="onViewStateRestored(Landroid/os/Bundle;)V" since="17"/>
+ <method name="postponeEnterTransition()V" since="26"/>
+ <method name="registerForContextMenu(Landroid/view/View;)V"/>
+ <method name="requestPermissions([Ljava/lang/String;I)V" since="23"/>
+ <method name="setAllowEnterTransitionOverlap(Z)V" since="21"/>
+ <method name="setAllowReturnTransitionOverlap(Z)V" since="21"/>
+ <method name="setArguments(Landroid/os/Bundle;)V"/>
+ <method name="setEnterSharedElementCallback(Landroid/app/SharedElementCallback;)V" since="21"/>
+ <method name="setEnterTransition(Landroid/transition/Transition;)V" since="21"/>
+ <method name="setExitSharedElementCallback(Landroid/app/SharedElementCallback;)V" since="21"/>
+ <method name="setExitTransition(Landroid/transition/Transition;)V" since="21"/>
+ <method name="setHasOptionsMenu(Z)V"/>
+ <method name="setInitialSavedState(Landroid/app/Fragment$SavedState;)V" since="13"/>
+ <method name="setMenuVisibility(Z)V" since="14"/>
+ <method name="setReenterTransition(Landroid/transition/Transition;)V" since="21"/>
+ <method name="setRetainInstance(Z)V"/>
+ <method name="setReturnTransition(Landroid/transition/Transition;)V" since="21"/>
+ <method name="setSharedElementEnterTransition(Landroid/transition/Transition;)V" since="21"/>
+ <method name="setSharedElementReturnTransition(Landroid/transition/Transition;)V" since="21"/>
+ <method name="setTargetFragment(Landroid/app/Fragment;I)V"/>
+ <method name="setUserVisibleHint(Z)V" since="15"/>
+ <method name="shouldShowRequestPermissionRationale(Ljava/lang/String;)Z" since="23"/>
+ <method name="startActivity(Landroid/content/Intent;)V"/>
+ <method name="startActivity(Landroid/content/Intent;Landroid/os/Bundle;)V" since="16"/>
+ <method name="startActivityForResult(Landroid/content/Intent;I)V"/>
+ <method name="startActivityForResult(Landroid/content/Intent;ILandroid/os/Bundle;)V" since="16"/>
+ <method name="startIntentSenderForResult(Landroid/content/IntentSender;ILandroid/content/Intent;IIILandroid/os/Bundle;)V" since="24"/>
+ <method name="startPostponedEnterTransition()V" since="26"/>
+ <method name="unregisterForContextMenu(Landroid/view/View;)V"/>
+ </class>
+ <class name="android/app/Fragment$InstantiationException" since="11">
+ <extends name="android/util/AndroidRuntimeException"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Exception;)V"/>
+ </class>
+ <class name="android/app/Fragment$SavedState" since="13">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/app/FragmentBreadCrumbs" since="11" deprecated="21">
+ <extends name="android/view/ViewGroup"/>
+ <implements name="android/app/FragmentManager$OnBackStackChangedListener"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="setActivity(Landroid/app/Activity;)V"/>
+ <method name="setMaxVisible(I)V"/>
+ <method name="setOnBreadCrumbClickListener(Landroid/app/FragmentBreadCrumbs$OnBreadCrumbClickListener;)V" since="12"/>
+ <method name="setParentTitle(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/view/View$OnClickListener;)V"/>
+ <method name="setTitle(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)V"/>
+ </class>
+ <class name="android/app/FragmentBreadCrumbs$OnBreadCrumbClickListener" since="12">
+ <extends name="java/lang/Object"/>
+ <method name="onBreadCrumbClick(Landroid/app/FragmentManager$BackStackEntry;I)Z"/>
+ </class>
+ <class name="android/app/FragmentContainer" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onFindViewById(I)Landroid/view/View;"/>
+ <method name="onHasView()Z"/>
+ </class>
+ <class name="android/app/FragmentController" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="attachHost(Landroid/app/Fragment;)V"/>
+ <method name="createController(Landroid/app/FragmentHostCallback;)Landroid/app/FragmentController;"/>
+ <method name="dispatchActivityCreated()V"/>
+ <method name="dispatchConfigurationChanged(Landroid/content/res/Configuration;)V"/>
+ <method name="dispatchContextItemSelected(Landroid/view/MenuItem;)Z"/>
+ <method name="dispatchCreate()V"/>
+ <method name="dispatchCreateOptionsMenu(Landroid/view/Menu;Landroid/view/MenuInflater;)Z"/>
+ <method name="dispatchDestroy()V"/>
+ <method name="dispatchDestroyView()V"/>
+ <method name="dispatchLowMemory()V"/>
+ <method name="dispatchMultiWindowModeChanged(Z)V" since="24" deprecated="26"/>
+ <method name="dispatchMultiWindowModeChanged(ZLandroid/content/res/Configuration;)V" since="26"/>
+ <method name="dispatchOptionsItemSelected(Landroid/view/MenuItem;)Z"/>
+ <method name="dispatchOptionsMenuClosed(Landroid/view/Menu;)V"/>
+ <method name="dispatchPause()V"/>
+ <method name="dispatchPictureInPictureModeChanged(Z)V" since="24" deprecated="26"/>
+ <method name="dispatchPictureInPictureModeChanged(ZLandroid/content/res/Configuration;)V" since="26"/>
+ <method name="dispatchPrepareOptionsMenu(Landroid/view/Menu;)Z"/>
+ <method name="dispatchResume()V"/>
+ <method name="dispatchStart()V"/>
+ <method name="dispatchStop()V"/>
+ <method name="dispatchTrimMemory(I)V"/>
+ <method name="doLoaderDestroy()V"/>
+ <method name="doLoaderStart()V"/>
+ <method name="doLoaderStop(Z)V"/>
+ <method name="dumpLoaders(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V"/>
+ <method name="execPendingActions()Z"/>
+ <method name="findFragmentByWho(Ljava/lang/String;)Landroid/app/Fragment;"/>
+ <method name="getFragmentManager()Landroid/app/FragmentManager;"/>
+ <method name="getLoaderManager()Landroid/app/LoaderManager;"/>
+ <method name="noteStateNotSaved()V"/>
+ <method name="onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;"/>
+ <method name="reportLoaderStart()V"/>
+ <method name="restoreAllState(Landroid/os/Parcelable;Landroid/app/FragmentManagerNonConfig;)V" since="24"/>
+ <method name="restoreAllState(Landroid/os/Parcelable;Ljava/util/List;)V" deprecated="24"/>
+ <method name="restoreLoaderNonConfig(Landroid/util/ArrayMap;)V"/>
+ <method name="retainLoaderNonConfig()Landroid/util/ArrayMap;"/>
+ <method name="retainNestedNonConfig()Landroid/app/FragmentManagerNonConfig;" since="24"/>
+ <method name="retainNonConfig()Ljava/util/List;" deprecated="24"/>
+ <method name="saveAllState()Landroid/os/Parcelable;"/>
+ </class>
+ <class name="android/app/FragmentHostCallback" since="23">
+ <extends name="android/app/FragmentContainer"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/os/Handler;I)V"/>
+ <method name="onAttachFragment(Landroid/app/Fragment;)V"/>
+ <method name="onDump(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V"/>
+ <method name="onGetHost()Ljava/lang/Object;"/>
+ <method name="onGetLayoutInflater()Landroid/view/LayoutInflater;"/>
+ <method name="onGetWindowAnimations()I"/>
+ <method name="onHasWindowAnimations()Z"/>
+ <method name="onInvalidateOptionsMenu()V"/>
+ <method name="onRequestPermissionsFromFragment(Landroid/app/Fragment;[Ljava/lang/String;I)V"/>
+ <method name="onShouldSaveFragmentState(Landroid/app/Fragment;)Z"/>
+ <method name="onStartActivityFromFragment(Landroid/app/Fragment;Landroid/content/Intent;ILandroid/os/Bundle;)V"/>
+ <method name="onStartIntentSenderFromFragment(Landroid/app/Fragment;Landroid/content/IntentSender;ILandroid/content/Intent;IIILandroid/os/Bundle;)V" since="24"/>
+ <method name="onUseFragmentManagerInflaterFactory()Z"/>
+ </class>
+ <class name="android/app/FragmentManager" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addOnBackStackChangedListener(Landroid/app/FragmentManager$OnBackStackChangedListener;)V"/>
+ <method name="beginTransaction()Landroid/app/FragmentTransaction;"/>
+ <method name="dump(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V"/>
+ <method name="enableDebugLogging(Z)V"/>
+ <method name="executePendingTransactions()Z"/>
+ <method name="findFragmentById(I)Landroid/app/Fragment;"/>
+ <method name="findFragmentByTag(Ljava/lang/String;)Landroid/app/Fragment;"/>
+ <method name="getBackStackEntryAt(I)Landroid/app/FragmentManager$BackStackEntry;"/>
+ <method name="getBackStackEntryCount()I"/>
+ <method name="getFragment(Landroid/os/Bundle;Ljava/lang/String;)Landroid/app/Fragment;"/>
+ <method name="getFragments()Ljava/util/List;" since="26"/>
+ <method name="getPrimaryNavigationFragment()Landroid/app/Fragment;" since="26"/>
+ <method name="invalidateOptionsMenu()V" since="14"/>
+ <method name="isDestroyed()Z" since="17"/>
+ <method name="isStateSaved()Z" since="26"/>
+ <method name="popBackStack()V"/>
+ <method name="popBackStack(II)V"/>
+ <method name="popBackStack(Ljava/lang/String;I)V"/>
+ <method name="popBackStackImmediate()Z"/>
+ <method name="popBackStackImmediate(II)Z"/>
+ <method name="popBackStackImmediate(Ljava/lang/String;I)Z"/>
+ <method name="putFragment(Landroid/os/Bundle;Ljava/lang/String;Landroid/app/Fragment;)V"/>
+ <method name="registerFragmentLifecycleCallbacks(Landroid/app/FragmentManager$FragmentLifecycleCallbacks;Z)V" since="26"/>
+ <method name="removeOnBackStackChangedListener(Landroid/app/FragmentManager$OnBackStackChangedListener;)V"/>
+ <method name="saveFragmentInstanceState(Landroid/app/Fragment;)Landroid/app/Fragment$SavedState;" since="13"/>
+ <method name="unregisterFragmentLifecycleCallbacks(Landroid/app/FragmentManager$FragmentLifecycleCallbacks;)V" since="26"/>
+ <field name="POP_BACK_STACK_INCLUSIVE"/>
+ </class>
+ <class name="android/app/FragmentManager$BackStackEntry" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="getBreadCrumbShortTitle()Ljava/lang/CharSequence;"/>
+ <method name="getBreadCrumbShortTitleRes()I"/>
+ <method name="getBreadCrumbTitle()Ljava/lang/CharSequence;"/>
+ <method name="getBreadCrumbTitleRes()I"/>
+ <method name="getId()I"/>
+ <method name="getName()Ljava/lang/String;" since="14"/>
+ </class>
+ <class name="android/app/FragmentManager$FragmentLifecycleCallbacks" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onFragmentActivityCreated(Landroid/app/FragmentManager;Landroid/app/Fragment;Landroid/os/Bundle;)V"/>
+ <method name="onFragmentAttached(Landroid/app/FragmentManager;Landroid/app/Fragment;Landroid/content/Context;)V"/>
+ <method name="onFragmentCreated(Landroid/app/FragmentManager;Landroid/app/Fragment;Landroid/os/Bundle;)V"/>
+ <method name="onFragmentDestroyed(Landroid/app/FragmentManager;Landroid/app/Fragment;)V"/>
+ <method name="onFragmentDetached(Landroid/app/FragmentManager;Landroid/app/Fragment;)V"/>
+ <method name="onFragmentPaused(Landroid/app/FragmentManager;Landroid/app/Fragment;)V"/>
+ <method name="onFragmentPreAttached(Landroid/app/FragmentManager;Landroid/app/Fragment;Landroid/content/Context;)V"/>
+ <method name="onFragmentPreCreated(Landroid/app/FragmentManager;Landroid/app/Fragment;Landroid/os/Bundle;)V"/>
+ <method name="onFragmentResumed(Landroid/app/FragmentManager;Landroid/app/Fragment;)V"/>
+ <method name="onFragmentSaveInstanceState(Landroid/app/FragmentManager;Landroid/app/Fragment;Landroid/os/Bundle;)V"/>
+ <method name="onFragmentStarted(Landroid/app/FragmentManager;Landroid/app/Fragment;)V"/>
+ <method name="onFragmentStopped(Landroid/app/FragmentManager;Landroid/app/Fragment;)V"/>
+ <method name="onFragmentViewCreated(Landroid/app/FragmentManager;Landroid/app/Fragment;Landroid/view/View;Landroid/os/Bundle;)V"/>
+ <method name="onFragmentViewDestroyed(Landroid/app/FragmentManager;Landroid/app/Fragment;)V"/>
+ </class>
+ <class name="android/app/FragmentManager$OnBackStackChangedListener" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="onBackStackChanged()V"/>
+ </class>
+ <class name="android/app/FragmentManagerNonConfig" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/app/FragmentTransaction" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="add(ILandroid/app/Fragment;)Landroid/app/FragmentTransaction;"/>
+ <method name="add(ILandroid/app/Fragment;Ljava/lang/String;)Landroid/app/FragmentTransaction;"/>
+ <method name="add(Landroid/app/Fragment;Ljava/lang/String;)Landroid/app/FragmentTransaction;"/>
+ <method name="addSharedElement(Landroid/view/View;Ljava/lang/String;)Landroid/app/FragmentTransaction;" since="21"/>
+ <method name="addToBackStack(Ljava/lang/String;)Landroid/app/FragmentTransaction;"/>
+ <method name="attach(Landroid/app/Fragment;)Landroid/app/FragmentTransaction;" since="13"/>
+ <method name="commit()I"/>
+ <method name="commitAllowingStateLoss()I"/>
+ <method name="commitNow()V" since="24"/>
+ <method name="commitNowAllowingStateLoss()V" since="24"/>
+ <method name="detach(Landroid/app/Fragment;)Landroid/app/FragmentTransaction;" since="13"/>
+ <method name="disallowAddToBackStack()Landroid/app/FragmentTransaction;"/>
+ <method name="hide(Landroid/app/Fragment;)Landroid/app/FragmentTransaction;"/>
+ <method name="isAddToBackStackAllowed()Z"/>
+ <method name="isEmpty()Z"/>
+ <method name="remove(Landroid/app/Fragment;)Landroid/app/FragmentTransaction;"/>
+ <method name="replace(ILandroid/app/Fragment;)Landroid/app/FragmentTransaction;"/>
+ <method name="replace(ILandroid/app/Fragment;Ljava/lang/String;)Landroid/app/FragmentTransaction;"/>
+ <method name="runOnCommit(Ljava/lang/Runnable;)Landroid/app/FragmentTransaction;" since="26"/>
+ <method name="setBreadCrumbShortTitle(I)Landroid/app/FragmentTransaction;"/>
+ <method name="setBreadCrumbShortTitle(Ljava/lang/CharSequence;)Landroid/app/FragmentTransaction;"/>
+ <method name="setBreadCrumbTitle(I)Landroid/app/FragmentTransaction;"/>
+ <method name="setBreadCrumbTitle(Ljava/lang/CharSequence;)Landroid/app/FragmentTransaction;"/>
+ <method name="setCustomAnimations(II)Landroid/app/FragmentTransaction;"/>
+ <method name="setCustomAnimations(IIII)Landroid/app/FragmentTransaction;" since="13"/>
+ <method name="setPrimaryNavigationFragment(Landroid/app/Fragment;)Landroid/app/FragmentTransaction;" since="26"/>
+ <method name="setReorderingAllowed(Z)Landroid/app/FragmentTransaction;" since="26"/>
+ <method name="setTransition(I)Landroid/app/FragmentTransaction;"/>
+ <method name="setTransitionStyle(I)Landroid/app/FragmentTransaction;"/>
+ <method name="show(Landroid/app/Fragment;)Landroid/app/FragmentTransaction;"/>
+ <field name="TRANSIT_ENTER_MASK"/>
+ <field name="TRANSIT_EXIT_MASK"/>
+ <field name="TRANSIT_FRAGMENT_CLOSE"/>
+ <field name="TRANSIT_FRAGMENT_FADE"/>
+ <field name="TRANSIT_FRAGMENT_OPEN"/>
+ <field name="TRANSIT_NONE"/>
+ <field name="TRANSIT_UNSET"/>
+ </class>
+ <class name="android/app/Instrumentation" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="acquireLooperManager(Landroid/os/Looper;)Landroid/os/TestLooperManager;" since="26"/>
+ <method name="addMonitor(Landroid/app/Instrumentation$ActivityMonitor;)V"/>
+ <method name="addMonitor(Landroid/content/IntentFilter;Landroid/app/Instrumentation$ActivityResult;Z)Landroid/app/Instrumentation$ActivityMonitor;"/>
+ <method name="addMonitor(Ljava/lang/String;Landroid/app/Instrumentation$ActivityResult;Z)Landroid/app/Instrumentation$ActivityMonitor;"/>
+ <method name="addResults(Landroid/os/Bundle;)V" since="26"/>
+ <method name="callActivityOnCreate(Landroid/app/Activity;Landroid/os/Bundle;)V"/>
+ <method name="callActivityOnCreate(Landroid/app/Activity;Landroid/os/Bundle;Landroid/os/PersistableBundle;)V" since="21"/>
+ <method name="callActivityOnDestroy(Landroid/app/Activity;)V"/>
+ <method name="callActivityOnNewIntent(Landroid/app/Activity;Landroid/content/Intent;)V"/>
+ <method name="callActivityOnPause(Landroid/app/Activity;)V"/>
+ <method name="callActivityOnPostCreate(Landroid/app/Activity;Landroid/os/Bundle;)V"/>
+ <method name="callActivityOnPostCreate(Landroid/app/Activity;Landroid/os/Bundle;Landroid/os/PersistableBundle;)V" since="21"/>
+ <method name="callActivityOnRestart(Landroid/app/Activity;)V"/>
+ <method name="callActivityOnRestoreInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V"/>
+ <method name="callActivityOnRestoreInstanceState(Landroid/app/Activity;Landroid/os/Bundle;Landroid/os/PersistableBundle;)V" since="21"/>
+ <method name="callActivityOnResume(Landroid/app/Activity;)V"/>
+ <method name="callActivityOnSaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V"/>
+ <method name="callActivityOnSaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;Landroid/os/PersistableBundle;)V" since="21"/>
+ <method name="callActivityOnStart(Landroid/app/Activity;)V"/>
+ <method name="callActivityOnStop(Landroid/app/Activity;)V"/>
+ <method name="callActivityOnUserLeaving(Landroid/app/Activity;)V" since="3"/>
+ <method name="callApplicationOnCreate(Landroid/app/Application;)V"/>
+ <method name="checkMonitorHit(Landroid/app/Instrumentation$ActivityMonitor;I)Z"/>
+ <method name="endPerformanceSnapshot()V"/>
+ <method name="finish(ILandroid/os/Bundle;)V"/>
+ <method name="getAllocCounts()Landroid/os/Bundle;"/>
+ <method name="getBinderCounts()Landroid/os/Bundle;"/>
+ <method name="getComponentName()Landroid/content/ComponentName;"/>
+ <method name="getContext()Landroid/content/Context;"/>
+ <method name="getProcessName()Ljava/lang/String;" since="26"/>
+ <method name="getTargetContext()Landroid/content/Context;"/>
+ <method name="getUiAutomation()Landroid/app/UiAutomation;" since="18"/>
+ <method name="getUiAutomation(I)Landroid/app/UiAutomation;" since="24"/>
+ <method name="invokeContextMenuAction(Landroid/app/Activity;II)Z"/>
+ <method name="invokeMenuActionSync(Landroid/app/Activity;II)Z"/>
+ <method name="isProfiling()Z"/>
+ <method name="newActivity(Ljava/lang/Class;Landroid/content/Context;Landroid/os/IBinder;Landroid/app/Application;Landroid/content/Intent;Landroid/content/pm/ActivityInfo;Ljava/lang/CharSequence;Landroid/app/Activity;Ljava/lang/String;Ljava/lang/Object;)Landroid/app/Activity;"/>
+ <method name="newActivity(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Activity;"/>
+ <method name="newApplication(Ljava/lang/Class;Landroid/content/Context;)Landroid/app/Application;"/>
+ <method name="newApplication(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Context;)Landroid/app/Application;"/>
+ <method name="onCreate(Landroid/os/Bundle;)V"/>
+ <method name="onDestroy()V"/>
+ <method name="onException(Ljava/lang/Object;Ljava/lang/Throwable;)Z"/>
+ <method name="onStart()V"/>
+ <method name="removeMonitor(Landroid/app/Instrumentation$ActivityMonitor;)V"/>
+ <method name="runOnMainSync(Ljava/lang/Runnable;)V"/>
+ <method name="sendCharacterSync(I)V"/>
+ <method name="sendKeyDownUpSync(I)V"/>
+ <method name="sendKeySync(Landroid/view/KeyEvent;)V"/>
+ <method name="sendPointerSync(Landroid/view/MotionEvent;)V"/>
+ <method name="sendStatus(ILandroid/os/Bundle;)V"/>
+ <method name="sendStringSync(Ljava/lang/String;)V"/>
+ <method name="sendTrackballEventSync(Landroid/view/MotionEvent;)V"/>
+ <method name="setAutomaticPerformanceSnapshots()V"/>
+ <method name="setInTouchMode(Z)V"/>
+ <method name="start()V"/>
+ <method name="startActivitySync(Landroid/content/Intent;)Landroid/app/Activity;"/>
+ <method name="startAllocCounting()V" deprecated="23"/>
+ <method name="startPerformanceSnapshot()V"/>
+ <method name="startProfiling()V"/>
+ <method name="stopAllocCounting()V" deprecated="23"/>
+ <method name="stopProfiling()V"/>
+ <method name="waitForIdle(Ljava/lang/Runnable;)V"/>
+ <method name="waitForIdleSync()V"/>
+ <method name="waitForMonitor(Landroid/app/Instrumentation$ActivityMonitor;)Landroid/app/Activity;"/>
+ <method name="waitForMonitorWithTimeout(Landroid/app/Instrumentation$ActivityMonitor;J)Landroid/app/Activity;"/>
+ <field name="REPORT_KEY_IDENTIFIER"/>
+ <field name="REPORT_KEY_STREAMRESULT"/>
+ </class>
+ <class name="android/app/Instrumentation$ActivityMonitor" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V" since="26"/>
+ <method name="&lt;init>(Landroid/content/IntentFilter;Landroid/app/Instrumentation$ActivityResult;Z)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Landroid/app/Instrumentation$ActivityResult;Z)V"/>
+ <method name="getFilter()Landroid/content/IntentFilter;"/>
+ <method name="getHits()I"/>
+ <method name="getLastActivity()Landroid/app/Activity;"/>
+ <method name="getResult()Landroid/app/Instrumentation$ActivityResult;"/>
+ <method name="isBlocking()Z"/>
+ <method name="onStartActivity(Landroid/content/Intent;)Landroid/app/Instrumentation$ActivityResult;" since="26"/>
+ <method name="waitForActivity()Landroid/app/Activity;"/>
+ <method name="waitForActivityWithTimeout(J)Landroid/app/Activity;"/>
+ </class>
+ <class name="android/app/Instrumentation$ActivityResult" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(ILandroid/content/Intent;)V"/>
+ <method name="getResultCode()I"/>
+ <method name="getResultData()Landroid/content/Intent;"/>
+ </class>
+ <class name="android/app/IntentService" since="3">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="onHandleIntent(Landroid/content/Intent;)V"/>
+ <method name="setIntentRedelivery(Z)V" since="5"/>
+ </class>
+ <class name="android/app/KeyguardManager" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="createConfirmDeviceCredentialIntent(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Landroid/content/Intent;" since="21"/>
+ <method name="exitKeyguardSecurely(Landroid/app/KeyguardManager$OnKeyguardExitResult;)V" deprecated="16"/>
+ <method name="inKeyguardRestrictedInputMode()Z"/>
+ <method name="isDeviceLocked()Z" since="22"/>
+ <method name="isDeviceSecure()Z" since="23"/>
+ <method name="isKeyguardLocked()Z" since="16"/>
+ <method name="isKeyguardSecure()Z" since="16"/>
+ <method name="newKeyguardLock(Ljava/lang/String;)Landroid/app/KeyguardManager$KeyguardLock;" deprecated="16"/>
+ <method name="requestDismissKeyguard(Landroid/app/Activity;Landroid/app/KeyguardManager$KeyguardDismissCallback;)V" since="26"/>
+ </class>
+ <class name="android/app/KeyguardManager$KeyguardDismissCallback" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onDismissCancelled()V"/>
+ <method name="onDismissError()V"/>
+ <method name="onDismissSucceeded()V"/>
+ </class>
+ <class name="android/app/KeyguardManager$KeyguardLock" since="1" deprecated="16">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/app/KeyguardManager;)V"/>
+ <method name="disableKeyguard()V"/>
+ <method name="reenableKeyguard()V"/>
+ </class>
+ <class name="android/app/KeyguardManager$OnKeyguardExitResult" since="1" deprecated="26">
+ <extends name="java/lang/Object"/>
+ <method name="onKeyguardExitResult(Z)V"/>
+ </class>
+ <class name="android/app/LauncherActivity" since="1">
+ <extends name="android/app/ListActivity"/>
+ <method name="&lt;init>()V"/>
+ <method name="getTargetIntent()Landroid/content/Intent;"/>
+ <method name="intentForPosition(I)Landroid/content/Intent;" since="3"/>
+ <method name="itemForPosition(I)Landroid/app/LauncherActivity$ListItem;" since="4"/>
+ <method name="makeListItems()Ljava/util/List;" since="3"/>
+ <method name="onQueryPackageManager(Landroid/content/Intent;)Ljava/util/List;" since="5"/>
+ <method name="onSetContentView()V" since="5"/>
+ </class>
+ <class name="android/app/LauncherActivity$IconResizer" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/app/LauncherActivity;)V"/>
+ <method name="createIconThumbnail(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable;"/>
+ </class>
+ <class name="android/app/LauncherActivity$ListItem" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="className"/>
+ <field name="extras"/>
+ <field name="icon"/>
+ <field name="label"/>
+ <field name="packageName"/>
+ <field name="resolveInfo" since="4"/>
+ </class>
+ <class name="android/app/ListActivity" since="1">
+ <extends name="android/app/Activity"/>
+ <method name="&lt;init>()V"/>
+ <method name="getListAdapter()Landroid/widget/ListAdapter;"/>
+ <method name="getListView()Landroid/widget/ListView;"/>
+ <method name="getSelectedItemId()J"/>
+ <method name="getSelectedItemPosition()I"/>
+ <method name="onListItemClick(Landroid/widget/ListView;Landroid/view/View;IJ)V"/>
+ <method name="setListAdapter(Landroid/widget/ListAdapter;)V"/>
+ <method name="setSelection(I)V"/>
+ </class>
+ <class name="android/app/ListFragment" since="11">
+ <extends name="android/app/Fragment"/>
+ <method name="&lt;init>()V"/>
+ <method name="getListAdapter()Landroid/widget/ListAdapter;"/>
+ <method name="getListView()Landroid/widget/ListView;"/>
+ <method name="getSelectedItemId()J"/>
+ <method name="getSelectedItemPosition()I"/>
+ <method name="onListItemClick(Landroid/widget/ListView;Landroid/view/View;IJ)V"/>
+ <method name="setEmptyText(Ljava/lang/CharSequence;)V"/>
+ <method name="setListAdapter(Landroid/widget/ListAdapter;)V"/>
+ <method name="setListShown(Z)V"/>
+ <method name="setListShownNoAnimation(Z)V"/>
+ <method name="setSelection(I)V"/>
+ </class>
+ <class name="android/app/LoaderManager" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="destroyLoader(I)V"/>
+ <method name="dump(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V"/>
+ <method name="enableDebugLogging(Z)V"/>
+ <method name="getLoader(I)Landroid/content/Loader;"/>
+ <method name="initLoader(ILandroid/os/Bundle;Landroid/app/LoaderManager$LoaderCallbacks;)Landroid/content/Loader;"/>
+ <method name="restartLoader(ILandroid/os/Bundle;Landroid/app/LoaderManager$LoaderCallbacks;)Landroid/content/Loader;"/>
+ </class>
+ <class name="android/app/LoaderManager$LoaderCallbacks" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="onCreateLoader(ILandroid/os/Bundle;)Landroid/content/Loader;"/>
+ <method name="onLoadFinished(Landroid/content/Loader;Ljava/lang/Object;)V"/>
+ <method name="onLoaderReset(Landroid/content/Loader;)V"/>
+ </class>
+ <class name="android/app/LocalActivityManager" since="1" deprecated="13">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/app/Activity;Z)V"/>
+ <method name="destroyActivity(Ljava/lang/String;Z)Landroid/view/Window;"/>
+ <method name="dispatchCreate(Landroid/os/Bundle;)V"/>
+ <method name="dispatchDestroy(Z)V"/>
+ <method name="dispatchPause(Z)V"/>
+ <method name="dispatchResume()V"/>
+ <method name="dispatchStop()V"/>
+ <method name="getActivity(Ljava/lang/String;)Landroid/app/Activity;"/>
+ <method name="getCurrentActivity()Landroid/app/Activity;"/>
+ <method name="getCurrentId()Ljava/lang/String;"/>
+ <method name="removeAllActivities()V"/>
+ <method name="saveInstanceState()Landroid/os/Bundle;"/>
+ <method name="startActivity(Ljava/lang/String;Landroid/content/Intent;)Landroid/view/Window;"/>
+ </class>
+ <class name="android/app/MediaRouteActionProvider" since="16">
+ <extends name="android/view/ActionProvider"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="setExtendedSettingsClickListener(Landroid/view/View$OnClickListener;)V"/>
+ <method name="setRouteTypes(I)V"/>
+ </class>
+ <class name="android/app/MediaRouteButton" since="16">
+ <extends name="android/view/View"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getRouteTypes()I"/>
+ <method name="setExtendedSettingsClickListener(Landroid/view/View$OnClickListener;)V"/>
+ <method name="setRouteTypes(I)V"/>
+ <method name="showDialog()V"/>
+ </class>
+ <class name="android/app/NativeActivity" since="9">
+ <extends name="android/app/Activity"/>
+ <implements name="android/view/InputQueue$Callback"/>
+ <implements name="android/view/SurfaceHolder$Callback2"/>
+ <implements name="android/view/ViewTreeObserver$OnGlobalLayoutListener"/>
+ <method name="&lt;init>()V"/>
+ <field name="META_DATA_FUNC_NAME"/>
+ <field name="META_DATA_LIB_NAME"/>
+ </class>
+ <class name="android/app/Notification" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(ILjava/lang/CharSequence;J)V" deprecated="16"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="clone()Landroid/app/Notification;" since="9"/>
+ <method name="getBadgeIconType()I" since="26"/>
+ <method name="getChannelId()Ljava/lang/String;" since="26"/>
+ <method name="getGroup()Ljava/lang/String;" since="20"/>
+ <method name="getGroupAlertBehavior()I" since="26"/>
+ <method name="getLargeIcon()Landroid/graphics/drawable/Icon;" since="23"/>
+ <method name="getSettingsText()Ljava/lang/CharSequence;" since="26"/>
+ <method name="getShortcutId()Ljava/lang/String;" since="26"/>
+ <method name="getSmallIcon()Landroid/graphics/drawable/Icon;" since="23"/>
+ <method name="getSortKey()Ljava/lang/String;" since="20"/>
+ <method name="getTimeoutAfter()J" since="26"/>
+ <method name="setLatestEventInfo(Landroid/content/Context;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/app/PendingIntent;)V" deprecated="16" removed="23"/>
+ <field name="AUDIO_ATTRIBUTES_DEFAULT" since="21"/>
+ <field name="BADGE_ICON_LARGE" since="26"/>
+ <field name="BADGE_ICON_NONE" since="26"/>
+ <field name="BADGE_ICON_SMALL" since="26"/>
+ <field name="CATEGORY_ALARM" since="21"/>
+ <field name="CATEGORY_CALL" since="21"/>
+ <field name="CATEGORY_EMAIL" since="21"/>
+ <field name="CATEGORY_ERROR" since="21"/>
+ <field name="CATEGORY_EVENT" since="21"/>
+ <field name="CATEGORY_MESSAGE" since="21"/>
+ <field name="CATEGORY_PROGRESS" since="21"/>
+ <field name="CATEGORY_PROMO" since="21"/>
+ <field name="CATEGORY_RECOMMENDATION" since="21"/>
+ <field name="CATEGORY_REMINDER" since="23"/>
+ <field name="CATEGORY_SERVICE" since="21"/>
+ <field name="CATEGORY_SOCIAL" since="21"/>
+ <field name="CATEGORY_STATUS" since="21"/>
+ <field name="CATEGORY_SYSTEM" since="21"/>
+ <field name="CATEGORY_TRANSPORT" since="21"/>
+ <field name="COLOR_DEFAULT" since="21"/>
+ <field name="CREATOR"/>
+ <field name="DEFAULT_ALL"/>
+ <field name="DEFAULT_LIGHTS"/>
+ <field name="DEFAULT_SOUND"/>
+ <field name="DEFAULT_VIBRATE"/>
+ <field name="EXTRA_AUDIO_CONTENTS_URI" since="26"/>
+ <field name="EXTRA_BACKGROUND_IMAGE_URI" since="21"/>
+ <field name="EXTRA_BIG_TEXT" since="21"/>
+ <field name="EXTRA_CHANNEL_ID" since="26"/>
+ <field name="EXTRA_CHRONOMETER_COUNT_DOWN" since="24"/>
+ <field name="EXTRA_COLORIZED" since="26"/>
+ <field name="EXTRA_COMPACT_ACTIONS" since="21"/>
+ <field name="EXTRA_CONVERSATION_TITLE" since="24"/>
+ <field name="EXTRA_HISTORIC_MESSAGES" since="26"/>
+ <field name="EXTRA_INFO_TEXT" since="19"/>
+ <field name="EXTRA_LARGE_ICON" since="19" deprecated="26"/>
+ <field name="EXTRA_LARGE_ICON_BIG" since="19"/>
+ <field name="EXTRA_MEDIA_SESSION" since="21"/>
+ <field name="EXTRA_MESSAGES" since="24"/>
+ <field name="EXTRA_NOTIFICATION_ID" since="26"/>
+ <field name="EXTRA_NOTIFICATION_TAG" since="26"/>
+ <field name="EXTRA_PEOPLE" since="19"/>
+ <field name="EXTRA_PICTURE" since="19"/>
+ <field name="EXTRA_PROGRESS" since="19"/>
+ <field name="EXTRA_PROGRESS_INDETERMINATE" since="19"/>
+ <field name="EXTRA_PROGRESS_MAX" since="19"/>
+ <field name="EXTRA_REMOTE_INPUT_HISTORY" since="24"/>
+ <field name="EXTRA_SELF_DISPLAY_NAME" since="24"/>
+ <field name="EXTRA_SHOW_CHRONOMETER" since="19"/>
+ <field name="EXTRA_SHOW_WHEN" since="19"/>
+ <field name="EXTRA_SMALL_ICON" since="19" deprecated="26"/>
+ <field name="EXTRA_SUB_TEXT" since="19"/>
+ <field name="EXTRA_SUMMARY_TEXT" since="19"/>
+ <field name="EXTRA_TEMPLATE" since="21"/>
+ <field name="EXTRA_TEXT" since="19"/>
+ <field name="EXTRA_TEXT_LINES" since="19"/>
+ <field name="EXTRA_TITLE" since="19"/>
+ <field name="EXTRA_TITLE_BIG" since="19"/>
+ <field name="FLAG_AUTO_CANCEL"/>
+ <field name="FLAG_FOREGROUND_SERVICE" since="5"/>
+ <field name="FLAG_GROUP_SUMMARY" since="20"/>
+ <field name="FLAG_HIGH_PRIORITY" since="11" deprecated="16"/>
+ <field name="FLAG_INSISTENT"/>
+ <field name="FLAG_LOCAL_ONLY" since="20"/>
+ <field name="FLAG_NO_CLEAR"/>
+ <field name="FLAG_ONGOING_EVENT"/>
+ <field name="FLAG_ONLY_ALERT_ONCE"/>
+ <field name="FLAG_SHOW_LIGHTS" deprecated="26"/>
+ <field name="GROUP_ALERT_ALL" since="26"/>
+ <field name="GROUP_ALERT_CHILDREN" since="26"/>
+ <field name="GROUP_ALERT_SUMMARY" since="26"/>
+ <field name="INTENT_CATEGORY_NOTIFICATION_PREFERENCES" since="21"/>
+ <field name="PRIORITY_DEFAULT" since="16" deprecated="26"/>
+ <field name="PRIORITY_HIGH" since="16" deprecated="26"/>
+ <field name="PRIORITY_LOW" since="16" deprecated="26"/>
+ <field name="PRIORITY_MAX" since="16" deprecated="26"/>
+ <field name="PRIORITY_MIN" since="16" deprecated="26"/>
+ <field name="STREAM_DEFAULT" deprecated="21"/>
+ <field name="VISIBILITY_PRIVATE" since="21"/>
+ <field name="VISIBILITY_PUBLIC" since="21"/>
+ <field name="VISIBILITY_SECRET" since="21"/>
+ <field name="actions" since="19"/>
+ <field name="audioAttributes" since="21" deprecated="26"/>
+ <field name="audioStreamType" deprecated="21"/>
+ <field name="bigContentView" since="16" deprecated="24"/>
+ <field name="category" since="21"/>
+ <field name="color" since="21"/>
+ <field name="contentIntent"/>
+ <field name="contentView" deprecated="24"/>
+ <field name="defaults" deprecated="26"/>
+ <field name="deleteIntent"/>
+ <field name="extras" since="19"/>
+ <field name="flags"/>
+ <field name="fullScreenIntent" since="9"/>
+ <field name="headsUpContentView" since="21" deprecated="24"/>
+ <field name="icon" deprecated="23"/>
+ <field name="iconLevel"/>
+ <field name="largeIcon" since="11" deprecated="23"/>
+ <field name="ledARGB" deprecated="26"/>
+ <field name="ledOffMS" deprecated="26"/>
+ <field name="ledOnMS" deprecated="26"/>
+ <field name="number" deprecated="24"/>
+ <field name="priority" since="16" deprecated="26"/>
+ <field name="publicVersion" since="21"/>
+ <field name="sound" deprecated="26"/>
+ <field name="tickerText"/>
+ <field name="tickerView" since="11" deprecated="21"/>
+ <field name="vibrate" deprecated="26"/>
+ <field name="visibility" since="21"/>
+ <field name="when"/>
+ </class>
+ <class name="android/app/Notification$Action" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(ILjava/lang/CharSequence;Landroid/app/PendingIntent;)V" deprecated="23"/>
+ <method name="clone()Landroid/app/Notification$Action;"/>
+ <method name="getAllowGeneratedReplies()Z" since="24"/>
+ <method name="getDataOnlyRemoteInputs()[Landroid/app/RemoteInput;" since="26"/>
+ <method name="getExtras()Landroid/os/Bundle;" since="20"/>
+ <method name="getIcon()Landroid/graphics/drawable/Icon;" since="23"/>
+ <method name="getRemoteInputs()[Landroid/app/RemoteInput;" since="20"/>
+ <field name="CREATOR"/>
+ <field name="actionIntent"/>
+ <field name="icon" deprecated="23"/>
+ <field name="title"/>
+ </class>
+ <class name="android/app/Notification$Action$Builder" since="20">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(ILjava/lang/CharSequence;Landroid/app/PendingIntent;)V" deprecated="23"/>
+ <method name="&lt;init>(Landroid/app/Notification$Action;)V"/>
+ <method name="&lt;init>(Landroid/graphics/drawable/Icon;Ljava/lang/CharSequence;Landroid/app/PendingIntent;)V" since="23"/>
+ <method name="addExtras(Landroid/os/Bundle;)Landroid/app/Notification$Action$Builder;"/>
+ <method name="addRemoteInput(Landroid/app/RemoteInput;)Landroid/app/Notification$Action$Builder;"/>
+ <method name="build()Landroid/app/Notification$Action;"/>
+ <method name="extend(Landroid/app/Notification$Action$Extender;)Landroid/app/Notification$Action$Builder;"/>
+ <method name="getExtras()Landroid/os/Bundle;"/>
+ <method name="setAllowGeneratedReplies(Z)Landroid/app/Notification$Action$Builder;" since="24"/>
+ </class>
+ <class name="android/app/Notification$Action$Extender" since="20">
+ <extends name="java/lang/Object"/>
+ <method name="extend(Landroid/app/Notification$Action$Builder;)Landroid/app/Notification$Action$Builder;"/>
+ </class>
+ <class name="android/app/Notification$Action$WearableExtender" since="20">
+ <extends name="java/lang/Object"/>
+ <implements name="android/app/Notification$Action$Extender"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/app/Notification$Action;)V"/>
+ <method name="clone()Landroid/app/Notification$Action$WearableExtender;"/>
+ <method name="getCancelLabel()Ljava/lang/CharSequence;" since="22"/>
+ <method name="getConfirmLabel()Ljava/lang/CharSequence;" since="22"/>
+ <method name="getHintDisplayActionInline()Z" since="25"/>
+ <method name="getHintLaunchesActivity()Z" since="24"/>
+ <method name="getInProgressLabel()Ljava/lang/CharSequence;" since="22"/>
+ <method name="isAvailableOffline()Z"/>
+ <method name="setAvailableOffline(Z)Landroid/app/Notification$Action$WearableExtender;"/>
+ <method name="setCancelLabel(Ljava/lang/CharSequence;)Landroid/app/Notification$Action$WearableExtender;" since="22"/>
+ <method name="setConfirmLabel(Ljava/lang/CharSequence;)Landroid/app/Notification$Action$WearableExtender;" since="22"/>
+ <method name="setHintDisplayActionInline(Z)Landroid/app/Notification$Action$WearableExtender;" since="25"/>
+ <method name="setHintLaunchesActivity(Z)Landroid/app/Notification$Action$WearableExtender;" since="24"/>
+ <method name="setInProgressLabel(Ljava/lang/CharSequence;)Landroid/app/Notification$Action$WearableExtender;" since="22"/>
+ </class>
+ <class name="android/app/Notification$BigPictureStyle" since="16">
+ <extends name="android/app/Notification$Style"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/app/Notification$Builder;)V" deprecated="24"/>
+ <method name="bigLargeIcon(Landroid/graphics/Bitmap;)Landroid/app/Notification$BigPictureStyle;"/>
+ <method name="bigLargeIcon(Landroid/graphics/drawable/Icon;)Landroid/app/Notification$BigPictureStyle;" since="23"/>
+ <method name="bigPicture(Landroid/graphics/Bitmap;)Landroid/app/Notification$BigPictureStyle;"/>
+ <method name="setBigContentTitle(Ljava/lang/CharSequence;)Landroid/app/Notification$BigPictureStyle;"/>
+ <method name="setSummaryText(Ljava/lang/CharSequence;)Landroid/app/Notification$BigPictureStyle;"/>
+ </class>
+ <class name="android/app/Notification$BigTextStyle" since="16">
+ <extends name="android/app/Notification$Style"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/app/Notification$Builder;)V" deprecated="24"/>
+ <method name="bigText(Ljava/lang/CharSequence;)Landroid/app/Notification$BigTextStyle;"/>
+ <method name="setBigContentTitle(Ljava/lang/CharSequence;)Landroid/app/Notification$BigTextStyle;"/>
+ <method name="setSummaryText(Ljava/lang/CharSequence;)Landroid/app/Notification$BigTextStyle;"/>
+ </class>
+ <class name="android/app/Notification$Builder" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;)V" deprecated="26"/>
+ <method name="&lt;init>(Landroid/content/Context;Ljava/lang/String;)V" since="26"/>
+ <method name="addAction(ILjava/lang/CharSequence;Landroid/app/PendingIntent;)Landroid/app/Notification$Builder;" since="16" deprecated="23"/>
+ <method name="addAction(Landroid/app/Notification$Action;)Landroid/app/Notification$Builder;" since="20"/>
+ <method name="addExtras(Landroid/os/Bundle;)Landroid/app/Notification$Builder;" since="20"/>
+ <method name="addPerson(Ljava/lang/String;)Landroid/app/Notification$Builder;" since="21"/>
+ <method name="build()Landroid/app/Notification;" since="16"/>
+ <method name="createBigContentView()Landroid/widget/RemoteViews;" since="24"/>
+ <method name="createContentView()Landroid/widget/RemoteViews;" since="24"/>
+ <method name="createHeadsUpContentView()Landroid/widget/RemoteViews;" since="24"/>
+ <method name="extend(Landroid/app/Notification$Extender;)Landroid/app/Notification$Builder;" since="20"/>
+ <method name="getExtras()Landroid/os/Bundle;" since="20"/>
+ <method name="getNotification()Landroid/app/Notification;" deprecated="16"/>
+ <method name="recoverBuilder(Landroid/content/Context;Landroid/app/Notification;)Landroid/app/Notification$Builder;" since="24"/>
+ <method name="setActions([Landroid/app/Notification$Action;)Landroid/app/Notification$Builder;" since="24"/>
+ <method name="setAutoCancel(Z)Landroid/app/Notification$Builder;"/>
+ <method name="setBadgeIconType(I)Landroid/app/Notification$Builder;" since="26"/>
+ <method name="setCategory(Ljava/lang/String;)Landroid/app/Notification$Builder;" since="21"/>
+ <method name="setChannelId(Ljava/lang/String;)Landroid/app/Notification$Builder;" since="26"/>
+ <method name="setChronometerCountDown(Z)Landroid/app/Notification$Builder;" since="24"/>
+ <method name="setColor(I)Landroid/app/Notification$Builder;" since="21"/>
+ <method name="setColorized(Z)Landroid/app/Notification$Builder;" since="26"/>
+ <method name="setContent(Landroid/widget/RemoteViews;)Landroid/app/Notification$Builder;" deprecated="24"/>
+ <method name="setContentInfo(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;" deprecated="24"/>
+ <method name="setContentIntent(Landroid/app/PendingIntent;)Landroid/app/Notification$Builder;"/>
+ <method name="setContentText(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;"/>
+ <method name="setContentTitle(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;"/>
+ <method name="setCustomBigContentView(Landroid/widget/RemoteViews;)Landroid/app/Notification$Builder;" since="24"/>
+ <method name="setCustomContentView(Landroid/widget/RemoteViews;)Landroid/app/Notification$Builder;" since="24"/>
+ <method name="setCustomHeadsUpContentView(Landroid/widget/RemoteViews;)Landroid/app/Notification$Builder;" since="24"/>
+ <method name="setDefaults(I)Landroid/app/Notification$Builder;" deprecated="26"/>
+ <method name="setDeleteIntent(Landroid/app/PendingIntent;)Landroid/app/Notification$Builder;"/>
+ <method name="setExtras(Landroid/os/Bundle;)Landroid/app/Notification$Builder;" since="19"/>
+ <method name="setFullScreenIntent(Landroid/app/PendingIntent;Z)Landroid/app/Notification$Builder;"/>
+ <method name="setGroup(Ljava/lang/String;)Landroid/app/Notification$Builder;" since="20"/>
+ <method name="setGroupAlertBehavior(I)Landroid/app/Notification$Builder;" since="26"/>
+ <method name="setGroupSummary(Z)Landroid/app/Notification$Builder;" since="20"/>
+ <method name="setLargeIcon(Landroid/graphics/Bitmap;)Landroid/app/Notification$Builder;"/>
+ <method name="setLargeIcon(Landroid/graphics/drawable/Icon;)Landroid/app/Notification$Builder;" since="23"/>
+ <method name="setLights(III)Landroid/app/Notification$Builder;" deprecated="26"/>
+ <method name="setLocalOnly(Z)Landroid/app/Notification$Builder;" since="20"/>
+ <method name="setNumber(I)Landroid/app/Notification$Builder;" deprecated="24"/>
+ <method name="setOngoing(Z)Landroid/app/Notification$Builder;"/>
+ <method name="setOnlyAlertOnce(Z)Landroid/app/Notification$Builder;"/>
+ <method name="setPriority(I)Landroid/app/Notification$Builder;" since="16" deprecated="26"/>
+ <method name="setProgress(IIZ)Landroid/app/Notification$Builder;" since="14"/>
+ <method name="setPublicVersion(Landroid/app/Notification;)Landroid/app/Notification$Builder;" since="21"/>
+ <method name="setRemoteInputHistory([Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;" since="24"/>
+ <method name="setSettingsText(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;" since="26"/>
+ <method name="setShortcutId(Ljava/lang/String;)Landroid/app/Notification$Builder;" since="26"/>
+ <method name="setShowWhen(Z)Landroid/app/Notification$Builder;" since="17"/>
+ <method name="setSmallIcon(I)Landroid/app/Notification$Builder;"/>
+ <method name="setSmallIcon(II)Landroid/app/Notification$Builder;"/>
+ <method name="setSmallIcon(Landroid/graphics/drawable/Icon;)Landroid/app/Notification$Builder;" since="23"/>
+ <method name="setSortKey(Ljava/lang/String;)Landroid/app/Notification$Builder;" since="20"/>
+ <method name="setSound(Landroid/net/Uri;)Landroid/app/Notification$Builder;" deprecated="26"/>
+ <method name="setSound(Landroid/net/Uri;I)Landroid/app/Notification$Builder;" deprecated="21"/>
+ <method name="setSound(Landroid/net/Uri;Landroid/media/AudioAttributes;)Landroid/app/Notification$Builder;" since="21" deprecated="26"/>
+ <method name="setStyle(Landroid/app/Notification$Style;)Landroid/app/Notification$Builder;" since="16"/>
+ <method name="setSubText(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;" since="16"/>
+ <method name="setTicker(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;"/>
+ <method name="setTicker(Ljava/lang/CharSequence;Landroid/widget/RemoteViews;)Landroid/app/Notification$Builder;" deprecated="21"/>
+ <method name="setTimeoutAfter(J)Landroid/app/Notification$Builder;" since="26"/>
+ <method name="setUsesChronometer(Z)Landroid/app/Notification$Builder;" since="16"/>
+ <method name="setVibrate([J)Landroid/app/Notification$Builder;" deprecated="26"/>
+ <method name="setVisibility(I)Landroid/app/Notification$Builder;" since="21"/>
+ <method name="setWhen(J)Landroid/app/Notification$Builder;"/>
+ </class>
+ <class name="android/app/Notification$CarExtender" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/app/Notification$Extender"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/app/Notification;)V"/>
+ <method name="getColor()I"/>
+ <method name="getLargeIcon()Landroid/graphics/Bitmap;"/>
+ <method name="getUnreadConversation()Landroid/app/Notification$CarExtender$UnreadConversation;"/>
+ <method name="setColor(I)Landroid/app/Notification$CarExtender;"/>
+ <method name="setLargeIcon(Landroid/graphics/Bitmap;)Landroid/app/Notification$CarExtender;"/>
+ <method name="setUnreadConversation(Landroid/app/Notification$CarExtender$UnreadConversation;)Landroid/app/Notification$CarExtender;"/>
+ </class>
+ <class name="android/app/Notification$CarExtender$Builder" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="addMessage(Ljava/lang/String;)Landroid/app/Notification$CarExtender$Builder;"/>
+ <method name="build()Landroid/app/Notification$CarExtender$UnreadConversation;"/>
+ <method name="setLatestTimestamp(J)Landroid/app/Notification$CarExtender$Builder;"/>
+ <method name="setReadPendingIntent(Landroid/app/PendingIntent;)Landroid/app/Notification$CarExtender$Builder;"/>
+ <method name="setReplyAction(Landroid/app/PendingIntent;Landroid/app/RemoteInput;)Landroid/app/Notification$CarExtender$Builder;"/>
+ </class>
+ <class name="android/app/Notification$CarExtender$UnreadConversation" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getLatestTimestamp()J"/>
+ <method name="getMessages()[Ljava/lang/String;"/>
+ <method name="getParticipant()Ljava/lang/String;"/>
+ <method name="getParticipants()[Ljava/lang/String;"/>
+ <method name="getReadPendingIntent()Landroid/app/PendingIntent;"/>
+ <method name="getRemoteInput()Landroid/app/RemoteInput;"/>
+ <method name="getReplyPendingIntent()Landroid/app/PendingIntent;"/>
+ </class>
+ <class name="android/app/Notification$DecoratedCustomViewStyle" since="24">
+ <extends name="android/app/Notification$Style"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/app/Notification$DecoratedMediaCustomViewStyle" since="24">
+ <extends name="android/app/Notification$MediaStyle"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/app/Notification$Extender" since="20">
+ <extends name="java/lang/Object"/>
+ <method name="extend(Landroid/app/Notification$Builder;)Landroid/app/Notification$Builder;"/>
+ </class>
+ <class name="android/app/Notification$InboxStyle" since="16">
+ <extends name="android/app/Notification$Style"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/app/Notification$Builder;)V" deprecated="24"/>
+ <method name="addLine(Ljava/lang/CharSequence;)Landroid/app/Notification$InboxStyle;"/>
+ <method name="setBigContentTitle(Ljava/lang/CharSequence;)Landroid/app/Notification$InboxStyle;"/>
+ <method name="setSummaryText(Ljava/lang/CharSequence;)Landroid/app/Notification$InboxStyle;"/>
+ </class>
+ <class name="android/app/Notification$MediaStyle" since="21">
+ <extends name="android/app/Notification$Style"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/app/Notification$Builder;)V" deprecated="24"/>
+ <method name="setMediaSession(Landroid/media/session/MediaSession$Token;)Landroid/app/Notification$MediaStyle;"/>
+ <method name="setShowActionsInCompactView([I)Landroid/app/Notification$MediaStyle;"/>
+ </class>
+ <class name="android/app/Notification$MessagingStyle" since="24">
+ <extends name="android/app/Notification$Style"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;)V"/>
+ <method name="addHistoricMessage(Landroid/app/Notification$MessagingStyle$Message;)Landroid/app/Notification$MessagingStyle;" since="26"/>
+ <method name="addMessage(Landroid/app/Notification$MessagingStyle$Message;)Landroid/app/Notification$MessagingStyle;"/>
+ <method name="addMessage(Ljava/lang/CharSequence;JLjava/lang/CharSequence;)Landroid/app/Notification$MessagingStyle;"/>
+ <method name="getConversationTitle()Ljava/lang/CharSequence;"/>
+ <method name="getHistoricMessages()Ljava/util/List;" since="26"/>
+ <method name="getMessages()Ljava/util/List;"/>
+ <method name="getUserDisplayName()Ljava/lang/CharSequence;"/>
+ <method name="setConversationTitle(Ljava/lang/CharSequence;)Landroid/app/Notification$MessagingStyle;"/>
+ <field name="MAXIMUM_RETAINED_MESSAGES"/>
+ </class>
+ <class name="android/app/Notification$MessagingStyle$Message" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;JLjava/lang/CharSequence;)V"/>
+ <method name="getDataMimeType()Ljava/lang/String;"/>
+ <method name="getDataUri()Landroid/net/Uri;"/>
+ <method name="getExtras()Landroid/os/Bundle;" since="26"/>
+ <method name="getSender()Ljava/lang/CharSequence;"/>
+ <method name="getText()Ljava/lang/CharSequence;"/>
+ <method name="getTimestamp()J"/>
+ <method name="setData(Ljava/lang/String;Landroid/net/Uri;)Landroid/app/Notification$MessagingStyle$Message;"/>
+ </class>
+ <class name="android/app/Notification$Style" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="build()Landroid/app/Notification;"/>
+ <method name="checkBuilder()V"/>
+ <method name="getStandardView(I)Landroid/widget/RemoteViews;"/>
+ <method name="internalSetBigContentTitle(Ljava/lang/CharSequence;)V"/>
+ <method name="internalSetSummaryText(Ljava/lang/CharSequence;)V"/>
+ <method name="setBuilder(Landroid/app/Notification$Builder;)V"/>
+ <field name="mBuilder"/>
+ </class>
+ <class name="android/app/Notification$WearableExtender" since="20">
+ <extends name="java/lang/Object"/>
+ <implements name="android/app/Notification$Extender"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/app/Notification;)V"/>
+ <method name="addAction(Landroid/app/Notification$Action;)Landroid/app/Notification$WearableExtender;"/>
+ <method name="addActions(Ljava/util/List;)Landroid/app/Notification$WearableExtender;"/>
+ <method name="addPage(Landroid/app/Notification;)Landroid/app/Notification$WearableExtender;"/>
+ <method name="addPages(Ljava/util/List;)Landroid/app/Notification$WearableExtender;"/>
+ <method name="clearActions()Landroid/app/Notification$WearableExtender;"/>
+ <method name="clearPages()Landroid/app/Notification$WearableExtender;"/>
+ <method name="clone()Landroid/app/Notification$WearableExtender;"/>
+ <method name="getActions()Ljava/util/List;"/>
+ <method name="getBackground()Landroid/graphics/Bitmap;"/>
+ <method name="getBridgeTag()Ljava/lang/String;" since="26"/>
+ <method name="getContentAction()I"/>
+ <method name="getContentIcon()I"/>
+ <method name="getContentIconGravity()I"/>
+ <method name="getContentIntentAvailableOffline()Z"/>
+ <method name="getCustomContentHeight()I"/>
+ <method name="getCustomSizePreset()I"/>
+ <method name="getDismissalId()Ljava/lang/String;" since="24"/>
+ <method name="getDisplayIntent()Landroid/app/PendingIntent;"/>
+ <method name="getGravity()I"/>
+ <method name="getHintAmbientBigPicture()Z" since="24"/>
+ <method name="getHintAvoidBackgroundClipping()Z" since="22"/>
+ <method name="getHintContentIntentLaunchesActivity()Z" since="24"/>
+ <method name="getHintHideIcon()Z"/>
+ <method name="getHintScreenTimeout()I" since="22"/>
+ <method name="getHintShowBackgroundOnly()Z"/>
+ <method name="getPages()Ljava/util/List;"/>
+ <method name="getStartScrollBottom()Z"/>
+ <method name="setBackground(Landroid/graphics/Bitmap;)Landroid/app/Notification$WearableExtender;"/>
+ <method name="setBridgeTag(Ljava/lang/String;)Landroid/app/Notification$WearableExtender;" since="26"/>
+ <method name="setContentAction(I)Landroid/app/Notification$WearableExtender;"/>
+ <method name="setContentIcon(I)Landroid/app/Notification$WearableExtender;"/>
+ <method name="setContentIconGravity(I)Landroid/app/Notification$WearableExtender;"/>
+ <method name="setContentIntentAvailableOffline(Z)Landroid/app/Notification$WearableExtender;"/>
+ <method name="setCustomContentHeight(I)Landroid/app/Notification$WearableExtender;"/>
+ <method name="setCustomSizePreset(I)Landroid/app/Notification$WearableExtender;"/>
+ <method name="setDismissalId(Ljava/lang/String;)Landroid/app/Notification$WearableExtender;" since="24"/>
+ <method name="setDisplayIntent(Landroid/app/PendingIntent;)Landroid/app/Notification$WearableExtender;"/>
+ <method name="setGravity(I)Landroid/app/Notification$WearableExtender;"/>
+ <method name="setHintAmbientBigPicture(Z)Landroid/app/Notification$WearableExtender;" since="24"/>
+ <method name="setHintAvoidBackgroundClipping(Z)Landroid/app/Notification$WearableExtender;" since="22"/>
+ <method name="setHintContentIntentLaunchesActivity(Z)Landroid/app/Notification$WearableExtender;" since="24"/>
+ <method name="setHintHideIcon(Z)Landroid/app/Notification$WearableExtender;"/>
+ <method name="setHintScreenTimeout(I)Landroid/app/Notification$WearableExtender;" since="22"/>
+ <method name="setHintShowBackgroundOnly(Z)Landroid/app/Notification$WearableExtender;"/>
+ <method name="setStartScrollBottom(Z)Landroid/app/Notification$WearableExtender;"/>
+ <field name="SCREEN_TIMEOUT_LONG" since="22"/>
+ <field name="SCREEN_TIMEOUT_SHORT" since="22"/>
+ <field name="SIZE_DEFAULT"/>
+ <field name="SIZE_FULL_SCREEN"/>
+ <field name="SIZE_LARGE"/>
+ <field name="SIZE_MEDIUM"/>
+ <field name="SIZE_SMALL"/>
+ <field name="SIZE_XSMALL"/>
+ <field name="UNSET_ACTION_INDEX"/>
+ </class>
+ <class name="android/app/NotificationChannel" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/CharSequence;I)V"/>
+ <method name="canBypassDnd()Z"/>
+ <method name="canShowBadge()Z"/>
+ <method name="enableLights(Z)V"/>
+ <method name="enableVibration(Z)V"/>
+ <method name="getAudioAttributes()Landroid/media/AudioAttributes;"/>
+ <method name="getDescription()Ljava/lang/String;"/>
+ <method name="getGroup()Ljava/lang/String;"/>
+ <method name="getId()Ljava/lang/String;"/>
+ <method name="getImportance()I"/>
+ <method name="getLightColor()I"/>
+ <method name="getLockscreenVisibility()I"/>
+ <method name="getName()Ljava/lang/CharSequence;"/>
+ <method name="getSound()Landroid/net/Uri;"/>
+ <method name="getVibrationPattern()[J"/>
+ <method name="setBypassDnd(Z)V"/>
+ <method name="setDescription(Ljava/lang/String;)V"/>
+ <method name="setGroup(Ljava/lang/String;)V"/>
+ <method name="setImportance(I)V"/>
+ <method name="setLightColor(I)V"/>
+ <method name="setLockscreenVisibility(I)V"/>
+ <method name="setName(Ljava/lang/CharSequence;)V"/>
+ <method name="setShowBadge(Z)V"/>
+ <method name="setSound(Landroid/net/Uri;Landroid/media/AudioAttributes;)V"/>
+ <method name="setVibrationPattern([J)V"/>
+ <method name="shouldShowLights()Z"/>
+ <method name="shouldVibrate()Z"/>
+ <field name="CREATOR"/>
+ <field name="DEFAULT_CHANNEL_ID"/>
+ </class>
+ <class name="android/app/NotificationChannelGroup" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/CharSequence;)V"/>
+ <method name="clone()Landroid/app/NotificationChannelGroup;"/>
+ <method name="getChannels()Ljava/util/List;"/>
+ <method name="getId()Ljava/lang/String;"/>
+ <method name="getName()Ljava/lang/CharSequence;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/app/NotificationManager" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addAutomaticZenRule(Landroid/app/AutomaticZenRule;)Ljava/lang/String;" since="24"/>
+ <method name="areNotificationsEnabled()Z" since="24"/>
+ <method name="cancel(I)V"/>
+ <method name="cancel(Ljava/lang/String;I)V" since="5"/>
+ <method name="cancelAll()V"/>
+ <method name="createNotificationChannel(Landroid/app/NotificationChannel;)V" since="26"/>
+ <method name="createNotificationChannelGroup(Landroid/app/NotificationChannelGroup;)V" since="26"/>
+ <method name="createNotificationChannelGroups(Ljava/util/List;)V" since="26"/>
+ <method name="createNotificationChannels(Ljava/util/List;)V" since="26"/>
+ <method name="deleteNotificationChannel(Ljava/lang/String;)V" since="26"/>
+ <method name="deleteNotificationChannelGroup(Ljava/lang/String;)V" since="26"/>
+ <method name="getActiveNotifications()[Landroid/service/notification/StatusBarNotification;" since="23"/>
+ <method name="getAutomaticZenRule(Ljava/lang/String;)Landroid/app/AutomaticZenRule;" since="24"/>
+ <method name="getAutomaticZenRules()Ljava/util/Map;" since="24"/>
+ <method name="getCurrentInterruptionFilter()I" since="23"/>
+ <method name="getImportance()I" since="24"/>
+ <method name="getNotificationChannel(Ljava/lang/String;)Landroid/app/NotificationChannel;" since="26"/>
+ <method name="getNotificationChannelGroups()Ljava/util/List;" since="26"/>
+ <method name="getNotificationChannels()Ljava/util/List;" since="26"/>
+ <method name="getNotificationPolicy()Landroid/app/NotificationManager$Policy;" since="23"/>
+ <method name="isNotificationPolicyAccessGranted()Z" since="23"/>
+ <method name="notify(ILandroid/app/Notification;)V"/>
+ <method name="notify(Ljava/lang/String;ILandroid/app/Notification;)V" since="5"/>
+ <method name="removeAutomaticZenRule(Ljava/lang/String;)Z" since="24"/>
+ <method name="setInterruptionFilter(I)V" since="23"/>
+ <method name="setNotificationPolicy(Landroid/app/NotificationManager$Policy;)V" since="23"/>
+ <method name="updateAutomaticZenRule(Ljava/lang/String;Landroid/app/AutomaticZenRule;)Z" since="24"/>
+ <field name="ACTION_INTERRUPTION_FILTER_CHANGED" since="23"/>
+ <field name="ACTION_NOTIFICATION_POLICY_ACCESS_GRANTED_CHANGED" since="23"/>
+ <field name="ACTION_NOTIFICATION_POLICY_CHANGED" since="23"/>
+ <field name="IMPORTANCE_DEFAULT" since="24"/>
+ <field name="IMPORTANCE_HIGH" since="24"/>
+ <field name="IMPORTANCE_LOW" since="24"/>
+ <field name="IMPORTANCE_MAX" since="24"/>
+ <field name="IMPORTANCE_MIN" since="24"/>
+ <field name="IMPORTANCE_NONE" since="24"/>
+ <field name="IMPORTANCE_UNSPECIFIED" since="24"/>
+ <field name="INTERRUPTION_FILTER_ALARMS" since="23"/>
+ <field name="INTERRUPTION_FILTER_ALL" since="23"/>
+ <field name="INTERRUPTION_FILTER_NONE" since="23"/>
+ <field name="INTERRUPTION_FILTER_PRIORITY" since="23"/>
+ <field name="INTERRUPTION_FILTER_UNKNOWN" since="23"/>
+ </class>
+ <class name="android/app/NotificationManager$Policy" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(III)V"/>
+ <method name="&lt;init>(IIII)V" since="24"/>
+ <method name="priorityCategoriesToString(I)Ljava/lang/String;"/>
+ <method name="prioritySendersToString(I)Ljava/lang/String;"/>
+ <method name="suppressedEffectsToString(I)Ljava/lang/String;" since="24"/>
+ <field name="CREATOR"/>
+ <field name="PRIORITY_CATEGORY_CALLS"/>
+ <field name="PRIORITY_CATEGORY_EVENTS"/>
+ <field name="PRIORITY_CATEGORY_MESSAGES"/>
+ <field name="PRIORITY_CATEGORY_REMINDERS"/>
+ <field name="PRIORITY_CATEGORY_REPEAT_CALLERS"/>
+ <field name="PRIORITY_SENDERS_ANY"/>
+ <field name="PRIORITY_SENDERS_CONTACTS"/>
+ <field name="PRIORITY_SENDERS_STARRED"/>
+ <field name="SUPPRESSED_EFFECT_SCREEN_OFF" since="24"/>
+ <field name="SUPPRESSED_EFFECT_SCREEN_ON" since="24"/>
+ <field name="priorityCallSenders"/>
+ <field name="priorityCategories"/>
+ <field name="priorityMessageSenders"/>
+ <field name="suppressedVisualEffects" since="24"/>
+ </class>
+ <class name="android/app/PendingIntent" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="cancel()V"/>
+ <method name="getActivities(Landroid/content/Context;I[Landroid/content/Intent;I)Landroid/app/PendingIntent;" since="11"/>
+ <method name="getActivities(Landroid/content/Context;I[Landroid/content/Intent;ILandroid/os/Bundle;)Landroid/app/PendingIntent;" since="16"/>
+ <method name="getActivity(Landroid/content/Context;ILandroid/content/Intent;I)Landroid/app/PendingIntent;"/>
+ <method name="getActivity(Landroid/content/Context;ILandroid/content/Intent;ILandroid/os/Bundle;)Landroid/app/PendingIntent;" since="16"/>
+ <method name="getBroadcast(Landroid/content/Context;ILandroid/content/Intent;I)Landroid/app/PendingIntent;"/>
+ <method name="getCreatorPackage()Ljava/lang/String;" since="17"/>
+ <method name="getCreatorUid()I" since="17"/>
+ <method name="getCreatorUserHandle()Landroid/os/UserHandle;" since="17"/>
+ <method name="getForegroundService(Landroid/content/Context;ILandroid/content/Intent;I)Landroid/app/PendingIntent;" since="26"/>
+ <method name="getIntentSender()Landroid/content/IntentSender;" since="4"/>
+ <method name="getService(Landroid/content/Context;ILandroid/content/Intent;I)Landroid/app/PendingIntent;"/>
+ <method name="getTargetPackage()Ljava/lang/String;" deprecated="17"/>
+ <method name="readPendingIntentOrNullFromParcel(Landroid/os/Parcel;)Landroid/app/PendingIntent;"/>
+ <method name="send()V"/>
+ <method name="send(I)V"/>
+ <method name="send(ILandroid/app/PendingIntent$OnFinished;Landroid/os/Handler;)V"/>
+ <method name="send(Landroid/content/Context;ILandroid/content/Intent;)V"/>
+ <method name="send(Landroid/content/Context;ILandroid/content/Intent;Landroid/app/PendingIntent$OnFinished;Landroid/os/Handler;)V"/>
+ <method name="send(Landroid/content/Context;ILandroid/content/Intent;Landroid/app/PendingIntent$OnFinished;Landroid/os/Handler;Ljava/lang/String;)V" since="14"/>
+ <method name="send(Landroid/content/Context;ILandroid/content/Intent;Landroid/app/PendingIntent$OnFinished;Landroid/os/Handler;Ljava/lang/String;Landroid/os/Bundle;)V" since="23"/>
+ <method name="writePendingIntentOrNullToParcel(Landroid/app/PendingIntent;Landroid/os/Parcel;)V"/>
+ <field name="CREATOR"/>
+ <field name="FLAG_CANCEL_CURRENT"/>
+ <field name="FLAG_IMMUTABLE" since="23"/>
+ <field name="FLAG_NO_CREATE"/>
+ <field name="FLAG_ONE_SHOT"/>
+ <field name="FLAG_UPDATE_CURRENT" since="3"/>
+ </class>
+ <class name="android/app/PendingIntent$CanceledException" since="1">
+ <extends name="android/util/AndroidException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/Exception;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/app/PendingIntent$OnFinished" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onSendFinished(Landroid/app/PendingIntent;Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;)V"/>
+ </class>
+ <class name="android/app/PictureInPictureParams" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/app/PictureInPictureParams$Builder" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="build()Landroid/app/PictureInPictureParams;"/>
+ <method name="setActions(Ljava/util/List;)Landroid/app/PictureInPictureParams$Builder;"/>
+ <method name="setAspectRatio(Landroid/util/Rational;)Landroid/app/PictureInPictureParams$Builder;"/>
+ <method name="setSourceRectHint(Landroid/graphics/Rect;)Landroid/app/PictureInPictureParams$Builder;"/>
+ </class>
+ <class name="android/app/Presentation" since="17">
+ <extends name="android/app/Dialog"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/Display;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/Display;I)V"/>
+ <method name="getDisplay()Landroid/view/Display;"/>
+ <method name="getResources()Landroid/content/res/Resources;"/>
+ <method name="onDisplayChanged()V"/>
+ <method name="onDisplayRemoved()V"/>
+ </class>
+ <class name="android/app/ProgressDialog" since="1" deprecated="26">
+ <extends name="android/app/AlertDialog"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;I)V"/>
+ <method name="getMax()I"/>
+ <method name="getProgress()I"/>
+ <method name="getSecondaryProgress()I"/>
+ <method name="incrementProgressBy(I)V"/>
+ <method name="incrementSecondaryProgressBy(I)V"/>
+ <method name="isIndeterminate()Z"/>
+ <method name="setIndeterminate(Z)V"/>
+ <method name="setIndeterminateDrawable(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setMax(I)V"/>
+ <method name="setProgress(I)V"/>
+ <method name="setProgressDrawable(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setProgressNumberFormat(Ljava/lang/String;)V" since="11"/>
+ <method name="setProgressPercentFormat(Ljava/text/NumberFormat;)V" since="11"/>
+ <method name="setProgressStyle(I)V"/>
+ <method name="setSecondaryProgress(I)V"/>
+ <method name="show(Landroid/content/Context;Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Landroid/app/ProgressDialog;"/>
+ <method name="show(Landroid/content/Context;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Z)Landroid/app/ProgressDialog;"/>
+ <method name="show(Landroid/content/Context;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZZ)Landroid/app/ProgressDialog;"/>
+ <method name="show(Landroid/content/Context;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZZLandroid/content/DialogInterface$OnCancelListener;)Landroid/app/ProgressDialog;"/>
+ <field name="STYLE_HORIZONTAL"/>
+ <field name="STYLE_SPINNER"/>
+ </class>
+ <class name="android/app/RemoteAction" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/graphics/drawable/Icon;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/app/PendingIntent;)V"/>
+ <method name="clone()Landroid/app/RemoteAction;"/>
+ <method name="dump(Ljava/lang/String;Ljava/io/PrintWriter;)V"/>
+ <method name="getActionIntent()Landroid/app/PendingIntent;"/>
+ <method name="getContentDescription()Ljava/lang/CharSequence;"/>
+ <method name="getIcon()Landroid/graphics/drawable/Icon;"/>
+ <method name="getTitle()Ljava/lang/CharSequence;"/>
+ <method name="isEnabled()Z"/>
+ <method name="setEnabled(Z)V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/app/RemoteInput" since="20">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="addDataResultToIntent(Landroid/app/RemoteInput;Landroid/content/Intent;Ljava/util/Map;)V" since="26"/>
+ <method name="addResultsToIntent([Landroid/app/RemoteInput;Landroid/content/Intent;Landroid/os/Bundle;)V"/>
+ <method name="getAllowFreeFormInput()Z"/>
+ <method name="getAllowedDataTypes()Ljava/util/Set;" since="26"/>
+ <method name="getChoices()[Ljava/lang/CharSequence;"/>
+ <method name="getDataResultsFromIntent(Landroid/content/Intent;Ljava/lang/String;)Ljava/util/Map;" since="26"/>
+ <method name="getExtras()Landroid/os/Bundle;"/>
+ <method name="getLabel()Ljava/lang/CharSequence;"/>
+ <method name="getResultKey()Ljava/lang/String;"/>
+ <method name="getResultsFromIntent(Landroid/content/Intent;)Landroid/os/Bundle;"/>
+ <method name="isDataOnly()Z" since="26"/>
+ <field name="CREATOR"/>
+ <field name="EXTRA_RESULTS_DATA"/>
+ <field name="RESULTS_CLIP_LABEL"/>
+ </class>
+ <class name="android/app/RemoteInput$Builder" since="20">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="addExtras(Landroid/os/Bundle;)Landroid/app/RemoteInput$Builder;"/>
+ <method name="build()Landroid/app/RemoteInput;"/>
+ <method name="getExtras()Landroid/os/Bundle;"/>
+ <method name="setAllowDataType(Ljava/lang/String;Z)Landroid/app/RemoteInput$Builder;" since="26"/>
+ <method name="setAllowFreeFormInput(Z)Landroid/app/RemoteInput$Builder;"/>
+ <method name="setChoices([Ljava/lang/CharSequence;)Landroid/app/RemoteInput$Builder;"/>
+ <method name="setLabel(Ljava/lang/CharSequence;)Landroid/app/RemoteInput$Builder;"/>
+ </class>
+ <class name="android/app/SearchManager" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/content/DialogInterface$OnCancelListener"/>
+ <implements name="android/content/DialogInterface$OnDismissListener"/>
+ <method name="&lt;init>()V"/>
+ <method name="getGlobalSearchActivity()Landroid/content/ComponentName;" since="16"/>
+ <method name="getSearchableInfo(Landroid/content/ComponentName;)Landroid/app/SearchableInfo;" since="8"/>
+ <method name="getSearchablesInGlobalSearch()Ljava/util/List;" since="8"/>
+ <method name="setOnCancelListener(Landroid/app/SearchManager$OnCancelListener;)V"/>
+ <method name="setOnDismissListener(Landroid/app/SearchManager$OnDismissListener;)V"/>
+ <method name="startSearch(Ljava/lang/String;ZLandroid/content/ComponentName;Landroid/os/Bundle;Z)V"/>
+ <method name="stopSearch()V"/>
+ <method name="triggerSearch(Ljava/lang/String;Landroid/content/ComponentName;Landroid/os/Bundle;)V" since="5"/>
+ <field name="ACTION_KEY"/>
+ <field name="ACTION_MSG"/>
+ <field name="APP_DATA"/>
+ <field name="CURSOR_EXTRA_KEY_IN_PROGRESS" since="8"/>
+ <field name="EXTRA_DATA_KEY" since="4"/>
+ <field name="EXTRA_NEW_SEARCH" since="12"/>
+ <field name="EXTRA_SELECT_QUERY" since="8"/>
+ <field name="EXTRA_WEB_SEARCH_PENDINGINTENT" since="14"/>
+ <field name="FLAG_QUERY_REFINEMENT" since="11"/>
+ <field name="INTENT_ACTION_GLOBAL_SEARCH" since="8"/>
+ <field name="INTENT_ACTION_SEARCHABLES_CHANGED" since="4"/>
+ <field name="INTENT_ACTION_SEARCH_SETTINGS" since="8"/>
+ <field name="INTENT_ACTION_SEARCH_SETTINGS_CHANGED" since="4"/>
+ <field name="INTENT_ACTION_WEB_SEARCH_SETTINGS" since="4"/>
+ <field name="INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED" since="16"/>
+ <field name="MENU_KEY"/>
+ <field name="MENU_KEYCODE"/>
+ <field name="QUERY"/>
+ <field name="SHORTCUT_MIME_TYPE" since="4"/>
+ <field name="SUGGEST_COLUMN_AUDIO_CHANNEL_CONFIG" since="21"/>
+ <field name="SUGGEST_COLUMN_CONTENT_TYPE" since="21"/>
+ <field name="SUGGEST_COLUMN_DURATION" since="21"/>
+ <field name="SUGGEST_COLUMN_FLAGS" since="11"/>
+ <field name="SUGGEST_COLUMN_FORMAT"/>
+ <field name="SUGGEST_COLUMN_ICON_1"/>
+ <field name="SUGGEST_COLUMN_ICON_2"/>
+ <field name="SUGGEST_COLUMN_INTENT_ACTION"/>
+ <field name="SUGGEST_COLUMN_INTENT_DATA"/>
+ <field name="SUGGEST_COLUMN_INTENT_DATA_ID"/>
+ <field name="SUGGEST_COLUMN_INTENT_EXTRA_DATA" since="4"/>
+ <field name="SUGGEST_COLUMN_IS_LIVE" since="21"/>
+ <field name="SUGGEST_COLUMN_LAST_ACCESS_HINT" since="14"/>
+ <field name="SUGGEST_COLUMN_PRODUCTION_YEAR" since="21"/>
+ <field name="SUGGEST_COLUMN_PURCHASE_PRICE" since="21"/>
+ <field name="SUGGEST_COLUMN_QUERY"/>
+ <field name="SUGGEST_COLUMN_RATING_SCORE" since="21"/>
+ <field name="SUGGEST_COLUMN_RATING_STYLE" since="21"/>
+ <field name="SUGGEST_COLUMN_RENTAL_PRICE" since="21"/>
+ <field name="SUGGEST_COLUMN_RESULT_CARD_IMAGE" since="21"/>
+ <field name="SUGGEST_COLUMN_SHORTCUT_ID" since="4"/>
+ <field name="SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING" since="4"/>
+ <field name="SUGGEST_COLUMN_TEXT_1"/>
+ <field name="SUGGEST_COLUMN_TEXT_2"/>
+ <field name="SUGGEST_COLUMN_TEXT_2_URL" since="8"/>
+ <field name="SUGGEST_COLUMN_VIDEO_HEIGHT" since="21"/>
+ <field name="SUGGEST_COLUMN_VIDEO_WIDTH" since="21"/>
+ <field name="SUGGEST_MIME_TYPE"/>
+ <field name="SUGGEST_NEVER_MAKE_SHORTCUT" since="4"/>
+ <field name="SUGGEST_PARAMETER_LIMIT" since="5"/>
+ <field name="SUGGEST_URI_PATH_QUERY"/>
+ <field name="SUGGEST_URI_PATH_SHORTCUT" since="4"/>
+ <field name="USER_QUERY" since="4"/>
+ </class>
+ <class name="android/app/SearchManager$OnCancelListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onCancel()V"/>
+ </class>
+ <class name="android/app/SearchManager$OnDismissListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onDismiss()V"/>
+ </class>
+ <class name="android/app/SearchableInfo" since="8">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="autoUrlDetect()Z"/>
+ <method name="getHintId()I"/>
+ <method name="getImeOptions()I"/>
+ <method name="getInputType()I"/>
+ <method name="getSearchActivity()Landroid/content/ComponentName;"/>
+ <method name="getSettingsDescriptionId()I"/>
+ <method name="getSuggestAuthority()Ljava/lang/String;"/>
+ <method name="getSuggestIntentAction()Ljava/lang/String;"/>
+ <method name="getSuggestIntentData()Ljava/lang/String;"/>
+ <method name="getSuggestPackage()Ljava/lang/String;"/>
+ <method name="getSuggestPath()Ljava/lang/String;"/>
+ <method name="getSuggestSelection()Ljava/lang/String;"/>
+ <method name="getSuggestThreshold()I"/>
+ <method name="getVoiceLanguageId()I"/>
+ <method name="getVoiceLanguageModeId()I"/>
+ <method name="getVoiceMaxResults()I"/>
+ <method name="getVoicePromptTextId()I"/>
+ <method name="getVoiceSearchEnabled()Z"/>
+ <method name="getVoiceSearchLaunchRecognizer()Z"/>
+ <method name="getVoiceSearchLaunchWebSearch()Z"/>
+ <method name="queryAfterZeroResults()Z"/>
+ <method name="shouldIncludeInGlobalSearch()Z"/>
+ <method name="shouldRewriteQueryFromData()Z"/>
+ <method name="shouldRewriteQueryFromText()Z"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/app/Service" since="1">
+ <extends name="android/content/ContextWrapper"/>
+ <implements name="android/content/ComponentCallbacks" removed="14"/>
+ <implements name="android/content/ComponentCallbacks2" since="14"/>
+ <method name="&lt;init>()V"/>
+ <method name="dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V"/>
+ <method name="getApplication()Landroid/app/Application;"/>
+ <method name="onBind(Landroid/content/Intent;)Landroid/os/IBinder;"/>
+ <method name="onCreate()V"/>
+ <method name="onDestroy()V"/>
+ <method name="onRebind(Landroid/content/Intent;)V"/>
+ <method name="onStart(Landroid/content/Intent;I)V" deprecated="16"/>
+ <method name="onStartCommand(Landroid/content/Intent;II)I" since="5"/>
+ <method name="onTaskRemoved(Landroid/content/Intent;)V" since="14"/>
+ <method name="onUnbind(Landroid/content/Intent;)Z"/>
+ <method name="setForeground(Z)V" removed="11"/>
+ <method name="startForeground(ILandroid/app/Notification;)V" since="5"/>
+ <method name="stopForeground(I)V" since="24"/>
+ <method name="stopForeground(Z)V" since="5"/>
+ <method name="stopSelf()V"/>
+ <method name="stopSelf(I)V"/>
+ <method name="stopSelfResult(I)Z"/>
+ <field name="START_CONTINUATION_MASK" since="5"/>
+ <field name="START_FLAG_REDELIVERY" since="5"/>
+ <field name="START_FLAG_RETRY" since="5"/>
+ <field name="START_NOT_STICKY" since="5"/>
+ <field name="START_REDELIVER_INTENT" since="5"/>
+ <field name="START_STICKY" since="5"/>
+ <field name="START_STICKY_COMPATIBILITY" since="5"/>
+ <field name="STOP_FOREGROUND_DETACH" since="24"/>
+ <field name="STOP_FOREGROUND_REMOVE" since="24"/>
+ </class>
+ <class name="android/app/SharedElementCallback" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onCaptureSharedElementSnapshot(Landroid/view/View;Landroid/graphics/Matrix;Landroid/graphics/RectF;)Landroid/os/Parcelable;"/>
+ <method name="onCreateSnapshotView(Landroid/content/Context;Landroid/os/Parcelable;)Landroid/view/View;"/>
+ <method name="onMapSharedElements(Ljava/util/List;Ljava/util/Map;)V"/>
+ <method name="onRejectSharedElements(Ljava/util/List;)V"/>
+ <method name="onSharedElementEnd(Ljava/util/List;Ljava/util/List;Ljava/util/List;)V"/>
+ <method name="onSharedElementStart(Ljava/util/List;Ljava/util/List;Ljava/util/List;)V"/>
+ <method name="onSharedElementsArrived(Ljava/util/List;Ljava/util/List;Landroid/app/SharedElementCallback$OnSharedElementsReadyListener;)V" since="23"/>
+ </class>
+ <class name="android/app/SharedElementCallback$OnSharedElementsReadyListener" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="onSharedElementsReady()V"/>
+ </class>
+ <class name="android/app/TabActivity" since="1" deprecated="13">
+ <extends name="android/app/ActivityGroup"/>
+ <method name="&lt;init>()V"/>
+ <method name="getTabHost()Landroid/widget/TabHost;"/>
+ <method name="getTabWidget()Landroid/widget/TabWidget;"/>
+ <method name="setDefaultTab(I)V"/>
+ <method name="setDefaultTab(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/app/TaskStackBuilder" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addNextIntent(Landroid/content/Intent;)Landroid/app/TaskStackBuilder;"/>
+ <method name="addNextIntentWithParentStack(Landroid/content/Intent;)Landroid/app/TaskStackBuilder;"/>
+ <method name="addParentStack(Landroid/app/Activity;)Landroid/app/TaskStackBuilder;"/>
+ <method name="addParentStack(Landroid/content/ComponentName;)Landroid/app/TaskStackBuilder;"/>
+ <method name="addParentStack(Ljava/lang/Class;)Landroid/app/TaskStackBuilder;"/>
+ <method name="create(Landroid/content/Context;)Landroid/app/TaskStackBuilder;"/>
+ <method name="editIntentAt(I)Landroid/content/Intent;"/>
+ <method name="getIntentCount()I"/>
+ <method name="getIntents()[Landroid/content/Intent;"/>
+ <method name="getPendingIntent(II)Landroid/app/PendingIntent;"/>
+ <method name="getPendingIntent(IILandroid/os/Bundle;)Landroid/app/PendingIntent;"/>
+ <method name="startActivities()V"/>
+ <method name="startActivities(Landroid/os/Bundle;)V"/>
+ </class>
+ <class name="android/app/TimePickerDialog" since="1">
+ <extends name="android/app/AlertDialog"/>
+ <implements name="android/content/DialogInterface$OnClickListener"/>
+ <implements name="android/widget/TimePicker$OnTimeChangedListener"/>
+ <method name="&lt;init>(Landroid/content/Context;ILandroid/app/TimePickerDialog$OnTimeSetListener;IIZ)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/app/TimePickerDialog$OnTimeSetListener;IIZ)V"/>
+ <method name="updateTime(II)V"/>
+ </class>
+ <class name="android/app/TimePickerDialog$OnTimeSetListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onTimeSet(Landroid/widget/TimePicker;II)V"/>
+ </class>
+ <class name="android/app/UiAutomation" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="clearWindowAnimationFrameStats()V" since="21"/>
+ <method name="clearWindowContentFrameStats(I)Z" since="21"/>
+ <method name="executeAndWaitForEvent(Ljava/lang/Runnable;Landroid/app/UiAutomation$AccessibilityEventFilter;J)Landroid/view/accessibility/AccessibilityEvent;"/>
+ <method name="executeShellCommand(Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;" since="21"/>
+ <method name="findFocus(I)Landroid/view/accessibility/AccessibilityNodeInfo;" since="21"/>
+ <method name="getRootInActiveWindow()Landroid/view/accessibility/AccessibilityNodeInfo;"/>
+ <method name="getServiceInfo()Landroid/accessibilityservice/AccessibilityServiceInfo;"/>
+ <method name="getWindowAnimationFrameStats()Landroid/view/WindowAnimationFrameStats;" since="21"/>
+ <method name="getWindowContentFrameStats(I)Landroid/view/WindowContentFrameStats;" since="21"/>
+ <method name="getWindows()Ljava/util/List;" since="21"/>
+ <method name="injectInputEvent(Landroid/view/InputEvent;Z)Z"/>
+ <method name="performGlobalAction(I)Z"/>
+ <method name="setOnAccessibilityEventListener(Landroid/app/UiAutomation$OnAccessibilityEventListener;)V"/>
+ <method name="setRotation(I)Z"/>
+ <method name="setRunAsMonkey(Z)V"/>
+ <method name="setServiceInfo(Landroid/accessibilityservice/AccessibilityServiceInfo;)V"/>
+ <method name="takeScreenshot()Landroid/graphics/Bitmap;"/>
+ <method name="waitForIdle(JJ)V"/>
+ <field name="FLAG_DONT_SUPPRESS_ACCESSIBILITY_SERVICES" since="24"/>
+ <field name="ROTATION_FREEZE_0"/>
+ <field name="ROTATION_FREEZE_180"/>
+ <field name="ROTATION_FREEZE_270"/>
+ <field name="ROTATION_FREEZE_90"/>
+ <field name="ROTATION_FREEZE_CURRENT"/>
+ <field name="ROTATION_UNFREEZE"/>
+ </class>
+ <class name="android/app/UiAutomation$AccessibilityEventFilter" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="accept(Landroid/view/accessibility/AccessibilityEvent;)Z"/>
+ </class>
+ <class name="android/app/UiAutomation$OnAccessibilityEventListener" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="onAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V"/>
+ </class>
+ <class name="android/app/UiModeManager" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="disableCarMode(I)V"/>
+ <method name="enableCarMode(I)V"/>
+ <method name="getCurrentModeType()I"/>
+ <method name="getNightMode()I"/>
+ <method name="setNightMode(I)V"/>
+ <field name="ACTION_ENTER_CAR_MODE"/>
+ <field name="ACTION_ENTER_DESK_MODE"/>
+ <field name="ACTION_EXIT_CAR_MODE"/>
+ <field name="ACTION_EXIT_DESK_MODE"/>
+ <field name="DISABLE_CAR_MODE_GO_HOME"/>
+ <field name="ENABLE_CAR_MODE_ALLOW_SLEEP" since="21"/>
+ <field name="ENABLE_CAR_MODE_GO_CAR_HOME"/>
+ <field name="MODE_NIGHT_AUTO"/>
+ <field name="MODE_NIGHT_NO"/>
+ <field name="MODE_NIGHT_YES"/>
+ </class>
+ <class name="android/app/VoiceInteractor" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getActiveRequest(Ljava/lang/String;)Landroid/app/VoiceInteractor$Request;"/>
+ <method name="getActiveRequests()[Landroid/app/VoiceInteractor$Request;"/>
+ <method name="submitRequest(Landroid/app/VoiceInteractor$Request;)Z"/>
+ <method name="submitRequest(Landroid/app/VoiceInteractor$Request;Ljava/lang/String;)Z"/>
+ <method name="supportsCommands([Ljava/lang/String;)[Z"/>
+ </class>
+ <class name="android/app/VoiceInteractor$AbortVoiceRequest" since="23">
+ <extends name="android/app/VoiceInteractor$Request"/>
+ <method name="&lt;init>(Landroid/app/VoiceInteractor$Prompt;Landroid/os/Bundle;)V"/>
+ <method name="onAbortResult(Landroid/os/Bundle;)V"/>
+ </class>
+ <class name="android/app/VoiceInteractor$CommandRequest" since="23">
+ <extends name="android/app/VoiceInteractor$Request"/>
+ <method name="&lt;init>(Ljava/lang/String;Landroid/os/Bundle;)V"/>
+ <method name="onCommandResult(ZLandroid/os/Bundle;)V"/>
+ </class>
+ <class name="android/app/VoiceInteractor$CompleteVoiceRequest" since="23">
+ <extends name="android/app/VoiceInteractor$Request"/>
+ <method name="&lt;init>(Landroid/app/VoiceInteractor$Prompt;Landroid/os/Bundle;)V"/>
+ <method name="onCompleteResult(Landroid/os/Bundle;)V"/>
+ </class>
+ <class name="android/app/VoiceInteractor$ConfirmationRequest" since="23">
+ <extends name="android/app/VoiceInteractor$Request"/>
+ <method name="&lt;init>(Landroid/app/VoiceInteractor$Prompt;Landroid/os/Bundle;)V"/>
+ <method name="onConfirmationResult(ZLandroid/os/Bundle;)V"/>
+ </class>
+ <class name="android/app/VoiceInteractor$PickOptionRequest" since="23">
+ <extends name="android/app/VoiceInteractor$Request"/>
+ <method name="&lt;init>(Landroid/app/VoiceInteractor$Prompt;[Landroid/app/VoiceInteractor$PickOptionRequest$Option;Landroid/os/Bundle;)V"/>
+ <method name="onPickOptionResult(Z[Landroid/app/VoiceInteractor$PickOptionRequest$Option;Landroid/os/Bundle;)V"/>
+ </class>
+ <class name="android/app/VoiceInteractor$PickOptionRequest$Option" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;I)V"/>
+ <method name="addSynonym(Ljava/lang/CharSequence;)Landroid/app/VoiceInteractor$PickOptionRequest$Option;"/>
+ <method name="countSynonyms()I"/>
+ <method name="getExtras()Landroid/os/Bundle;"/>
+ <method name="getIndex()I"/>
+ <method name="getLabel()Ljava/lang/CharSequence;"/>
+ <method name="getSynonymAt(I)Ljava/lang/CharSequence;"/>
+ <method name="setExtras(Landroid/os/Bundle;)V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/app/VoiceInteractor$Prompt" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;)V"/>
+ <method name="&lt;init>([Ljava/lang/CharSequence;Ljava/lang/CharSequence;)V"/>
+ <method name="countVoicePrompts()I"/>
+ <method name="getVisualPrompt()Ljava/lang/CharSequence;"/>
+ <method name="getVoicePromptAt(I)Ljava/lang/CharSequence;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/app/VoiceInteractor$Request" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="cancel()V"/>
+ <method name="getActivity()Landroid/app/Activity;"/>
+ <method name="getContext()Landroid/content/Context;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="onAttached(Landroid/app/Activity;)V"/>
+ <method name="onCancel()V"/>
+ <method name="onDetached()V"/>
+ </class>
+ <class name="android/app/WallpaperColors" since="27">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/graphics/Color;Landroid/graphics/Color;Landroid/graphics/Color;)V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="fromBitmap(Landroid/graphics/Bitmap;)Landroid/app/WallpaperColors;"/>
+ <method name="fromDrawable(Landroid/graphics/drawable/Drawable;)Landroid/app/WallpaperColors;"/>
+ <method name="getPrimaryColor()Landroid/graphics/Color;"/>
+ <method name="getSecondaryColor()Landroid/graphics/Color;"/>
+ <method name="getTertiaryColor()Landroid/graphics/Color;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/app/WallpaperInfo" since="7">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/content/pm/ResolveInfo;)V"/>
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V"/>
+ <method name="getComponent()Landroid/content/ComponentName;"/>
+ <method name="getPackageName()Ljava/lang/String;"/>
+ <method name="getServiceInfo()Landroid/content/pm/ServiceInfo;"/>
+ <method name="getServiceName()Ljava/lang/String;"/>
+ <method name="getSettingsActivity()Ljava/lang/String;"/>
+ <method name="getShowMetadataInPreview()Z" since="25"/>
+ <method name="loadAuthor(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;"/>
+ <method name="loadContextDescription(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;" since="25"/>
+ <method name="loadContextUri(Landroid/content/pm/PackageManager;)Landroid/net/Uri;" since="25"/>
+ <method name="loadDescription(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;"/>
+ <method name="loadIcon(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;"/>
+ <method name="loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;"/>
+ <method name="loadThumbnail(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/app/WallpaperManager" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addOnColorsChangedListener(Landroid/app/WallpaperManager$OnColorsChangedListener;)V" since="27"/>
+ <method name="addOnColorsChangedListener(Landroid/app/WallpaperManager$OnColorsChangedListener;Landroid/os/Handler;)V" since="27"/>
+ <method name="clear()V"/>
+ <method name="clear(I)V" since="24"/>
+ <method name="clearWallpaperOffsets(Landroid/os/IBinder;)V"/>
+ <method name="forgetLoadedWallpaper()V" since="14"/>
+ <method name="getBuiltInDrawable()Landroid/graphics/drawable/Drawable;" since="19"/>
+ <method name="getBuiltInDrawable(I)Landroid/graphics/drawable/Drawable;" since="24"/>
+ <method name="getBuiltInDrawable(IIZFF)Landroid/graphics/drawable/Drawable;" since="19"/>
+ <method name="getBuiltInDrawable(IIZFFI)Landroid/graphics/drawable/Drawable;" since="24"/>
+ <method name="getCropAndSetWallpaperIntent(Landroid/net/Uri;)Landroid/content/Intent;" since="19"/>
+ <method name="getDesiredMinimumHeight()I"/>
+ <method name="getDesiredMinimumWidth()I"/>
+ <method name="getDrawable()Landroid/graphics/drawable/Drawable;"/>
+ <method name="getFastDrawable()Landroid/graphics/drawable/Drawable;"/>
+ <method name="getInstance(Landroid/content/Context;)Landroid/app/WallpaperManager;"/>
+ <method name="getWallpaperColors(I)Landroid/app/WallpaperColors;" since="27"/>
+ <method name="getWallpaperFile(I)Landroid/os/ParcelFileDescriptor;" since="24"/>
+ <method name="getWallpaperId(I)I" since="24"/>
+ <method name="getWallpaperInfo()Landroid/app/WallpaperInfo;" since="7"/>
+ <method name="hasResourceWallpaper(I)Z" since="17"/>
+ <method name="isSetWallpaperAllowed()Z" since="24"/>
+ <method name="isWallpaperSupported()Z" since="23"/>
+ <method name="peekDrawable()Landroid/graphics/drawable/Drawable;"/>
+ <method name="peekFastDrawable()Landroid/graphics/drawable/Drawable;"/>
+ <method name="removeOnColorsChangedListener(Landroid/app/WallpaperManager$OnColorsChangedListener;)V" since="27"/>
+ <method name="sendWallpaperCommand(Landroid/os/IBinder;Ljava/lang/String;IIILandroid/os/Bundle;)V" since="7"/>
+ <method name="setBitmap(Landroid/graphics/Bitmap;)V"/>
+ <method name="setBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Rect;Z)I" since="24"/>
+ <method name="setBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Rect;ZI)I" since="24"/>
+ <method name="setResource(I)V"/>
+ <method name="setResource(II)I" since="24"/>
+ <method name="setStream(Ljava/io/InputStream;)V"/>
+ <method name="setStream(Ljava/io/InputStream;Landroid/graphics/Rect;Z)I" since="24"/>
+ <method name="setStream(Ljava/io/InputStream;Landroid/graphics/Rect;ZI)I" since="24"/>
+ <method name="setWallpaperOffsetSteps(FF)V" since="7"/>
+ <method name="setWallpaperOffsets(Landroid/os/IBinder;FF)V"/>
+ <method name="suggestDesiredDimensions(II)V"/>
+ <field name="ACTION_CHANGE_LIVE_WALLPAPER" since="16"/>
+ <field name="ACTION_CROP_AND_SET_WALLPAPER" since="19"/>
+ <field name="ACTION_LIVE_WALLPAPER_CHOOSER" since="7"/>
+ <field name="COMMAND_DROP" since="7"/>
+ <field name="COMMAND_SECONDARY_TAP" since="11"/>
+ <field name="COMMAND_TAP" since="7"/>
+ <field name="EXTRA_LIVE_WALLPAPER_COMPONENT" since="16"/>
+ <field name="FLAG_LOCK" since="24"/>
+ <field name="FLAG_SYSTEM" since="24"/>
+ <field name="WALLPAPER_PREVIEW_META_DATA" since="11"/>
+ </class>
+ <class name="android/app/WallpaperManager$OnColorsChangedListener" since="27">
+ <extends name="java/lang/Object"/>
+ <method name="onColorsChanged(Landroid/app/WallpaperColors;I)V"/>
+ </class>
+ <class name="android/app/admin/ConnectEvent" since="26">
+ <extends name="android/app/admin/NetworkEvent"/>
+ <method name="&lt;init>()V"/>
+ <method name="getInetAddress()Ljava/net/InetAddress;"/>
+ <method name="getPort()I"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/app/admin/DeviceAdminInfo" since="8">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/content/pm/ResolveInfo;)V"/>
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V"/>
+ <method name="getActivityInfo()Landroid/content/pm/ActivityInfo;"/>
+ <method name="getComponent()Landroid/content/ComponentName;"/>
+ <method name="getPackageName()Ljava/lang/String;"/>
+ <method name="getReceiverName()Ljava/lang/String;"/>
+ <method name="getTagForPolicy(I)Ljava/lang/String;"/>
+ <method name="isVisible()Z"/>
+ <method name="loadDescription(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;"/>
+ <method name="loadIcon(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;"/>
+ <method name="loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;"/>
+ <method name="usesPolicy(I)Z"/>
+ <field name="CREATOR"/>
+ <field name="USES_ENCRYPTED_STORAGE" since="11"/>
+ <field name="USES_POLICY_DISABLE_CAMERA" since="14"/>
+ <field name="USES_POLICY_DISABLE_KEYGUARD_FEATURES" since="17"/>
+ <field name="USES_POLICY_EXPIRE_PASSWORD" since="11"/>
+ <field name="USES_POLICY_FORCE_LOCK"/>
+ <field name="USES_POLICY_LIMIT_PASSWORD"/>
+ <field name="USES_POLICY_RESET_PASSWORD"/>
+ <field name="USES_POLICY_WATCH_LOGIN"/>
+ <field name="USES_POLICY_WIPE_DATA"/>
+ </class>
+ <class name="android/app/admin/DeviceAdminReceiver" since="8">
+ <extends name="android/content/BroadcastReceiver"/>
+ <method name="&lt;init>()V"/>
+ <method name="getManager(Landroid/content/Context;)Landroid/app/admin/DevicePolicyManager;"/>
+ <method name="getWho(Landroid/content/Context;)Landroid/content/ComponentName;"/>
+ <method name="onBugreportFailed(Landroid/content/Context;Landroid/content/Intent;I)V" since="24"/>
+ <method name="onBugreportShared(Landroid/content/Context;Landroid/content/Intent;Ljava/lang/String;)V" since="24"/>
+ <method name="onBugreportSharingDeclined(Landroid/content/Context;Landroid/content/Intent;)V" since="24"/>
+ <method name="onChoosePrivateKeyAlias(Landroid/content/Context;Landroid/content/Intent;ILandroid/net/Uri;Ljava/lang/String;)Ljava/lang/String;" since="23"/>
+ <method name="onDisableRequested(Landroid/content/Context;Landroid/content/Intent;)Ljava/lang/CharSequence;"/>
+ <method name="onDisabled(Landroid/content/Context;Landroid/content/Intent;)V"/>
+ <method name="onEnabled(Landroid/content/Context;Landroid/content/Intent;)V"/>
+ <method name="onLockTaskModeEntering(Landroid/content/Context;Landroid/content/Intent;Ljava/lang/String;)V" since="21"/>
+ <method name="onLockTaskModeExiting(Landroid/content/Context;Landroid/content/Intent;)V" since="21"/>
+ <method name="onNetworkLogsAvailable(Landroid/content/Context;Landroid/content/Intent;JI)V" since="26"/>
+ <method name="onPasswordChanged(Landroid/content/Context;Landroid/content/Intent;)V" deprecated="26"/>
+ <method name="onPasswordChanged(Landroid/content/Context;Landroid/content/Intent;Landroid/os/UserHandle;)V" since="26"/>
+ <method name="onPasswordExpiring(Landroid/content/Context;Landroid/content/Intent;)V" since="11" deprecated="26"/>
+ <method name="onPasswordExpiring(Landroid/content/Context;Landroid/content/Intent;Landroid/os/UserHandle;)V" since="26"/>
+ <method name="onPasswordFailed(Landroid/content/Context;Landroid/content/Intent;)V" deprecated="26"/>
+ <method name="onPasswordFailed(Landroid/content/Context;Landroid/content/Intent;Landroid/os/UserHandle;)V" since="26"/>
+ <method name="onPasswordSucceeded(Landroid/content/Context;Landroid/content/Intent;)V" deprecated="26"/>
+ <method name="onPasswordSucceeded(Landroid/content/Context;Landroid/content/Intent;Landroid/os/UserHandle;)V" since="26"/>
+ <method name="onProfileProvisioningComplete(Landroid/content/Context;Landroid/content/Intent;)V" since="21"/>
+ <method name="onReadyForUserInitialization(Landroid/content/Context;Landroid/content/Intent;)V" since="23" deprecated="24"/>
+ <method name="onSecurityLogsAvailable(Landroid/content/Context;Landroid/content/Intent;)V" since="24"/>
+ <method name="onSystemUpdatePending(Landroid/content/Context;Landroid/content/Intent;J)V" since="23"/>
+ <method name="onUserAdded(Landroid/content/Context;Landroid/content/Intent;Landroid/os/UserHandle;)V" since="26"/>
+ <method name="onUserRemoved(Landroid/content/Context;Landroid/content/Intent;Landroid/os/UserHandle;)V" since="26"/>
+ <field name="ACTION_DEVICE_ADMIN_DISABLED"/>
+ <field name="ACTION_DEVICE_ADMIN_DISABLE_REQUESTED"/>
+ <field name="ACTION_DEVICE_ADMIN_ENABLED"/>
+ <field name="ACTION_LOCK_TASK_ENTERING" since="21"/>
+ <field name="ACTION_LOCK_TASK_EXITING" since="21"/>
+ <field name="ACTION_PASSWORD_CHANGED"/>
+ <field name="ACTION_PASSWORD_EXPIRING" since="11"/>
+ <field name="ACTION_PASSWORD_FAILED"/>
+ <field name="ACTION_PASSWORD_SUCCEEDED"/>
+ <field name="ACTION_PROFILE_PROVISIONING_COMPLETE" since="21"/>
+ <field name="BUGREPORT_FAILURE_FAILED_COMPLETING" since="24"/>
+ <field name="BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE" since="24"/>
+ <field name="DEVICE_ADMIN_META_DATA"/>
+ <field name="EXTRA_DISABLE_WARNING"/>
+ <field name="EXTRA_LOCK_TASK_PACKAGE" since="21"/>
+ </class>
+ <class name="android/app/admin/DeviceAdminService" since="26">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/app/admin/DevicePolicyManager" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addCrossProfileIntentFilter(Landroid/content/ComponentName;Landroid/content/IntentFilter;I)V" since="21"/>
+ <method name="addCrossProfileWidgetProvider(Landroid/content/ComponentName;Ljava/lang/String;)Z" since="21"/>
+ <method name="addPersistentPreferredActivity(Landroid/content/ComponentName;Landroid/content/IntentFilter;Landroid/content/ComponentName;)V" since="21"/>
+ <method name="addUserRestriction(Landroid/content/ComponentName;Ljava/lang/String;)V" since="21"/>
+ <method name="bindDeviceAdminServiceAsUser(Landroid/content/ComponentName;Landroid/content/Intent;Landroid/content/ServiceConnection;ILandroid/os/UserHandle;)Z" since="26"/>
+ <method name="clearCrossProfileIntentFilters(Landroid/content/ComponentName;)V" since="21"/>
+ <method name="clearDeviceOwnerApp(Ljava/lang/String;)V" since="21" deprecated="26"/>
+ <method name="clearPackagePersistentPreferredActivities(Landroid/content/ComponentName;Ljava/lang/String;)V" since="21"/>
+ <method name="clearProfileOwner(Landroid/content/ComponentName;)V" since="24" deprecated="26"/>
+ <method name="clearResetPasswordToken(Landroid/content/ComponentName;)Z" since="26"/>
+ <method name="clearUserRestriction(Landroid/content/ComponentName;Ljava/lang/String;)V" since="21"/>
+ <method name="createAdminSupportIntent(Ljava/lang/String;)Landroid/content/Intent;" since="26"/>
+ <method name="createAndInitializeUser(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;Landroid/content/ComponentName;Landroid/os/Bundle;)Landroid/os/UserHandle;" since="21" deprecated="23" removed="24"/>
+ <method name="createAndManageUser(Landroid/content/ComponentName;Ljava/lang/String;Landroid/content/ComponentName;Landroid/os/PersistableBundle;I)Landroid/os/UserHandle;" since="24"/>
+ <method name="createUser(Landroid/content/ComponentName;Ljava/lang/String;)Landroid/os/UserHandle;" since="21" deprecated="23" removed="24"/>
+ <method name="enableSystemApp(Landroid/content/ComponentName;Landroid/content/Intent;)I" since="21"/>
+ <method name="enableSystemApp(Landroid/content/ComponentName;Ljava/lang/String;)V" since="21"/>
+ <method name="getAccountTypesWithManagementDisabled()[Ljava/lang/String;" since="21"/>
+ <method name="getActiveAdmins()Ljava/util/List;"/>
+ <method name="getAffiliationIds(Landroid/content/ComponentName;)Ljava/util/Set;" since="26"/>
+ <method name="getAlwaysOnVpnPackage(Landroid/content/ComponentName;)Ljava/lang/String;" since="24"/>
+ <method name="getApplicationRestrictions(Landroid/content/ComponentName;Ljava/lang/String;)Landroid/os/Bundle;" since="21"/>
+ <method name="getApplicationRestrictionsManagingPackage(Landroid/content/ComponentName;)Ljava/lang/String;" since="24" deprecated="26"/>
+ <method name="getAutoTimeRequired()Z" since="21"/>
+ <method name="getBindDeviceAdminTargetUsers(Landroid/content/ComponentName;)Ljava/util/List;" since="26"/>
+ <method name="getBluetoothContactSharingDisabled(Landroid/content/ComponentName;)Z" since="23"/>
+ <method name="getCameraDisabled(Landroid/content/ComponentName;)Z" since="14"/>
+ <method name="getCertInstallerPackage(Landroid/content/ComponentName;)Ljava/lang/String;" since="23" deprecated="26"/>
+ <method name="getCrossProfileCallerIdDisabled(Landroid/content/ComponentName;)Z" since="21"/>
+ <method name="getCrossProfileContactsSearchDisabled(Landroid/content/ComponentName;)Z" since="24"/>
+ <method name="getCrossProfileWidgetProviders(Landroid/content/ComponentName;)Ljava/util/List;" since="21"/>
+ <method name="getCurrentFailedPasswordAttempts()I"/>
+ <method name="getDelegatePackages(Landroid/content/ComponentName;Ljava/lang/String;)Ljava/util/List;" since="26"/>
+ <method name="getDelegatedScopes(Landroid/content/ComponentName;Ljava/lang/String;)Ljava/util/List;" since="26"/>
+ <method name="getDeviceOwnerLockScreenInfo()Ljava/lang/CharSequence;" since="24"/>
+ <method name="getInstalledCaCerts(Landroid/content/ComponentName;)Ljava/util/List;" since="21"/>
+ <method name="getKeyguardDisabledFeatures(Landroid/content/ComponentName;)I" since="17"/>
+ <method name="getLockTaskPackages(Landroid/content/ComponentName;)[Ljava/lang/String;" since="26"/>
+ <method name="getLongSupportMessage(Landroid/content/ComponentName;)Ljava/lang/CharSequence;" since="24"/>
+ <method name="getMaximumFailedPasswordsForWipe(Landroid/content/ComponentName;)I"/>
+ <method name="getMaximumTimeToLock(Landroid/content/ComponentName;)J"/>
+ <method name="getOrganizationColor(Landroid/content/ComponentName;)I" since="24"/>
+ <method name="getOrganizationName(Landroid/content/ComponentName;)Ljava/lang/CharSequence;" since="24"/>
+ <method name="getParentProfileInstance(Landroid/content/ComponentName;)Landroid/app/admin/DevicePolicyManager;" since="24"/>
+ <method name="getPasswordExpiration(Landroid/content/ComponentName;)J" since="11"/>
+ <method name="getPasswordExpirationTimeout(Landroid/content/ComponentName;)J" since="11"/>
+ <method name="getPasswordHistoryLength(Landroid/content/ComponentName;)I" since="11"/>
+ <method name="getPasswordMaximumLength(I)I"/>
+ <method name="getPasswordMinimumLength(Landroid/content/ComponentName;)I"/>
+ <method name="getPasswordMinimumLetters(Landroid/content/ComponentName;)I" since="11"/>
+ <method name="getPasswordMinimumLowerCase(Landroid/content/ComponentName;)I" since="11"/>
+ <method name="getPasswordMinimumNonLetter(Landroid/content/ComponentName;)I" since="11"/>
+ <method name="getPasswordMinimumNumeric(Landroid/content/ComponentName;)I" since="11"/>
+ <method name="getPasswordMinimumSymbols(Landroid/content/ComponentName;)I" since="11"/>
+ <method name="getPasswordMinimumUpperCase(Landroid/content/ComponentName;)I" since="11"/>
+ <method name="getPasswordQuality(Landroid/content/ComponentName;)I"/>
+ <method name="getPendingSystemUpdate(Landroid/content/ComponentName;)Landroid/app/admin/SystemUpdateInfo;" since="26"/>
+ <method name="getPermissionGrantState(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;)I" since="23"/>
+ <method name="getPermissionPolicy(Landroid/content/ComponentName;)I" since="23"/>
+ <method name="getPermittedAccessibilityServices(Landroid/content/ComponentName;)Ljava/util/List;" since="21"/>
+ <method name="getPermittedCrossProfileNotificationListeners(Landroid/content/ComponentName;)Ljava/util/List;" since="26"/>
+ <method name="getPermittedInputMethods(Landroid/content/ComponentName;)Ljava/util/List;" since="21"/>
+ <method name="getRequiredStrongAuthTimeout(Landroid/content/ComponentName;)J" since="26"/>
+ <method name="getScreenCaptureDisabled(Landroid/content/ComponentName;)Z" since="21"/>
+ <method name="getShortSupportMessage(Landroid/content/ComponentName;)Ljava/lang/CharSequence;" since="24"/>
+ <method name="getStorageEncryption(Landroid/content/ComponentName;)Z" since="11"/>
+ <method name="getStorageEncryptionStatus()I" since="11"/>
+ <method name="getSystemUpdatePolicy()Landroid/app/admin/SystemUpdatePolicy;" since="23"/>
+ <method name="getTrustAgentConfiguration(Landroid/content/ComponentName;Landroid/content/ComponentName;)Ljava/util/List;" since="23"/>
+ <method name="getUserRestrictions(Landroid/content/ComponentName;)Landroid/os/Bundle;" since="24"/>
+ <method name="getWifiMacAddress(Landroid/content/ComponentName;)Ljava/lang/String;" since="24"/>
+ <method name="hasCaCertInstalled(Landroid/content/ComponentName;[B)Z" since="21"/>
+ <method name="hasGrantedPolicy(Landroid/content/ComponentName;I)Z" since="11"/>
+ <method name="installCaCert(Landroid/content/ComponentName;[B)Z" since="21"/>
+ <method name="installKeyPair(Landroid/content/ComponentName;Ljava/security/PrivateKey;Ljava/security/cert/Certificate;Ljava/lang/String;)Z" since="21"/>
+ <method name="installKeyPair(Landroid/content/ComponentName;Ljava/security/PrivateKey;[Ljava/security/cert/Certificate;Ljava/lang/String;Z)Z" since="24"/>
+ <method name="isActivePasswordSufficient()Z"/>
+ <method name="isAdminActive(Landroid/content/ComponentName;)Z"/>
+ <method name="isApplicationHidden(Landroid/content/ComponentName;Ljava/lang/String;)Z" since="21"/>
+ <method name="isBackupServiceEnabled(Landroid/content/ComponentName;)Z" since="26"/>
+ <method name="isCallerApplicationRestrictionsManagingPackage()Z" since="24" deprecated="26"/>
+ <method name="isDeviceOwnerApp(Ljava/lang/String;)Z" since="18"/>
+ <method name="isLockTaskPermitted(Ljava/lang/String;)Z" since="21"/>
+ <method name="isManagedProfile(Landroid/content/ComponentName;)Z" since="24"/>
+ <method name="isMasterVolumeMuted(Landroid/content/ComponentName;)Z" since="21"/>
+ <method name="isNetworkLoggingEnabled(Landroid/content/ComponentName;)Z" since="26"/>
+ <method name="isPackageSuspended(Landroid/content/ComponentName;Ljava/lang/String;)Z" since="24"/>
+ <method name="isProfileOwnerApp(Ljava/lang/String;)Z" since="21"/>
+ <method name="isProvisioningAllowed(Ljava/lang/String;)Z" since="24"/>
+ <method name="isResetPasswordTokenActive(Landroid/content/ComponentName;)Z" since="26"/>
+ <method name="isSecurityLoggingEnabled(Landroid/content/ComponentName;)Z" since="24"/>
+ <method name="isUninstallBlocked(Landroid/content/ComponentName;Ljava/lang/String;)Z" since="21"/>
+ <method name="lockNow()V"/>
+ <method name="lockNow(I)V" since="26"/>
+ <method name="reboot(Landroid/content/ComponentName;)V" since="24"/>
+ <method name="removeActiveAdmin(Landroid/content/ComponentName;)V"/>
+ <method name="removeCrossProfileWidgetProvider(Landroid/content/ComponentName;Ljava/lang/String;)Z" since="21"/>
+ <method name="removeKeyPair(Landroid/content/ComponentName;Ljava/lang/String;)Z" since="24"/>
+ <method name="removeUser(Landroid/content/ComponentName;Landroid/os/UserHandle;)Z" since="21"/>
+ <method name="requestBugreport(Landroid/content/ComponentName;)Z" since="24"/>
+ <method name="resetPassword(Ljava/lang/String;I)Z"/>
+ <method name="resetPasswordWithToken(Landroid/content/ComponentName;Ljava/lang/String;[BI)Z" since="26"/>
+ <method name="retrieveNetworkLogs(Landroid/content/ComponentName;J)Ljava/util/List;" since="26"/>
+ <method name="retrievePreRebootSecurityLogs(Landroid/content/ComponentName;)Ljava/util/List;" since="24"/>
+ <method name="retrieveSecurityLogs(Landroid/content/ComponentName;)Ljava/util/List;" since="24"/>
+ <method name="setAccountManagementDisabled(Landroid/content/ComponentName;Ljava/lang/String;Z)V" since="21"/>
+ <method name="setAffiliationIds(Landroid/content/ComponentName;Ljava/util/Set;)V" since="26"/>
+ <method name="setAlwaysOnVpnPackage(Landroid/content/ComponentName;Ljava/lang/String;Z)V" since="24"/>
+ <method name="setApplicationHidden(Landroid/content/ComponentName;Ljava/lang/String;Z)Z" since="21"/>
+ <method name="setApplicationRestrictions(Landroid/content/ComponentName;Ljava/lang/String;Landroid/os/Bundle;)V" since="21"/>
+ <method name="setApplicationRestrictionsManagingPackage(Landroid/content/ComponentName;Ljava/lang/String;)V" since="24" deprecated="26"/>
+ <method name="setAutoTimeRequired(Landroid/content/ComponentName;Z)V" since="21"/>
+ <method name="setBackupServiceEnabled(Landroid/content/ComponentName;Z)V" since="26"/>
+ <method name="setBluetoothContactSharingDisabled(Landroid/content/ComponentName;Z)V" since="23"/>
+ <method name="setCameraDisabled(Landroid/content/ComponentName;Z)V" since="14"/>
+ <method name="setCertInstallerPackage(Landroid/content/ComponentName;Ljava/lang/String;)V" since="23" deprecated="26"/>
+ <method name="setCrossProfileCallerIdDisabled(Landroid/content/ComponentName;Z)V" since="21"/>
+ <method name="setCrossProfileContactsSearchDisabled(Landroid/content/ComponentName;Z)V" since="24"/>
+ <method name="setDelegatedScopes(Landroid/content/ComponentName;Ljava/lang/String;Ljava/util/List;)V" since="26"/>
+ <method name="setDeviceOwnerLockScreenInfo(Landroid/content/ComponentName;Ljava/lang/CharSequence;)V" since="24"/>
+ <method name="setGlobalSetting(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;)V" since="21"/>
+ <method name="setKeyguardDisabled(Landroid/content/ComponentName;Z)Z" since="23"/>
+ <method name="setKeyguardDisabledFeatures(Landroid/content/ComponentName;I)V" since="17"/>
+ <method name="setLockTaskPackages(Landroid/content/ComponentName;[Ljava/lang/String;)V" since="21"/>
+ <method name="setLongSupportMessage(Landroid/content/ComponentName;Ljava/lang/CharSequence;)V" since="24"/>
+ <method name="setMasterVolumeMuted(Landroid/content/ComponentName;Z)V" since="21"/>
+ <method name="setMaximumFailedPasswordsForWipe(Landroid/content/ComponentName;I)V"/>
+ <method name="setMaximumTimeToLock(Landroid/content/ComponentName;J)V"/>
+ <method name="setNetworkLoggingEnabled(Landroid/content/ComponentName;Z)V" since="26"/>
+ <method name="setOrganizationColor(Landroid/content/ComponentName;I)V" since="24"/>
+ <method name="setOrganizationName(Landroid/content/ComponentName;Ljava/lang/CharSequence;)V" since="24"/>
+ <method name="setPackagesSuspended(Landroid/content/ComponentName;[Ljava/lang/String;Z)[Ljava/lang/String;" since="24"/>
+ <method name="setPasswordExpirationTimeout(Landroid/content/ComponentName;J)V" since="11"/>
+ <method name="setPasswordHistoryLength(Landroid/content/ComponentName;I)V" since="11"/>
+ <method name="setPasswordMinimumLength(Landroid/content/ComponentName;I)V"/>
+ <method name="setPasswordMinimumLetters(Landroid/content/ComponentName;I)V" since="11"/>
+ <method name="setPasswordMinimumLowerCase(Landroid/content/ComponentName;I)V" since="11"/>
+ <method name="setPasswordMinimumNonLetter(Landroid/content/ComponentName;I)V" since="11"/>
+ <method name="setPasswordMinimumNumeric(Landroid/content/ComponentName;I)V" since="11"/>
+ <method name="setPasswordMinimumSymbols(Landroid/content/ComponentName;I)V" since="11"/>
+ <method name="setPasswordMinimumUpperCase(Landroid/content/ComponentName;I)V" since="11"/>
+ <method name="setPasswordQuality(Landroid/content/ComponentName;I)V"/>
+ <method name="setPermissionGrantState(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;I)Z" since="23"/>
+ <method name="setPermissionPolicy(Landroid/content/ComponentName;I)V" since="23"/>
+ <method name="setPermittedAccessibilityServices(Landroid/content/ComponentName;Ljava/util/List;)Z" since="21"/>
+ <method name="setPermittedCrossProfileNotificationListeners(Landroid/content/ComponentName;Ljava/util/List;)Z" since="26"/>
+ <method name="setPermittedInputMethods(Landroid/content/ComponentName;Ljava/util/List;)Z" since="21"/>
+ <method name="setProfileEnabled(Landroid/content/ComponentName;)V" since="21"/>
+ <method name="setProfileName(Landroid/content/ComponentName;Ljava/lang/String;)V" since="21"/>
+ <method name="setRecommendedGlobalProxy(Landroid/content/ComponentName;Landroid/net/ProxyInfo;)V" since="21"/>
+ <method name="setRequiredStrongAuthTimeout(Landroid/content/ComponentName;J)V" since="26"/>
+ <method name="setResetPasswordToken(Landroid/content/ComponentName;[B)Z" since="26"/>
+ <method name="setRestrictionsProvider(Landroid/content/ComponentName;Landroid/content/ComponentName;)V" since="21"/>
+ <method name="setScreenCaptureDisabled(Landroid/content/ComponentName;Z)V" since="21"/>
+ <method name="setSecureSetting(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;)V" since="21"/>
+ <method name="setSecurityLoggingEnabled(Landroid/content/ComponentName;Z)V" since="24"/>
+ <method name="setShortSupportMessage(Landroid/content/ComponentName;Ljava/lang/CharSequence;)V" since="24"/>
+ <method name="setStatusBarDisabled(Landroid/content/ComponentName;Z)Z" since="23"/>
+ <method name="setStorageEncryption(Landroid/content/ComponentName;Z)I" since="11"/>
+ <method name="setSystemUpdatePolicy(Landroid/content/ComponentName;Landroid/app/admin/SystemUpdatePolicy;)V" since="23"/>
+ <method name="setTrustAgentConfiguration(Landroid/content/ComponentName;Landroid/content/ComponentName;Landroid/os/PersistableBundle;)V" since="23"/>
+ <method name="setUninstallBlocked(Landroid/content/ComponentName;Ljava/lang/String;Z)V" since="21"/>
+ <method name="setUserIcon(Landroid/content/ComponentName;Landroid/graphics/Bitmap;)V" since="23"/>
+ <method name="switchUser(Landroid/content/ComponentName;Landroid/os/UserHandle;)Z" since="21"/>
+ <method name="uninstallAllUserCaCerts(Landroid/content/ComponentName;)V" since="21"/>
+ <method name="uninstallCaCert(Landroid/content/ComponentName;[B)V" since="21"/>
+ <method name="wipeData(I)V"/>
+ <field name="ACTION_ADD_DEVICE_ADMIN"/>
+ <field name="ACTION_APPLICATION_DELEGATION_SCOPES_CHANGED" since="26"/>
+ <field name="ACTION_DEVICE_ADMIN_SERVICE" since="26"/>
+ <field name="ACTION_DEVICE_OWNER_CHANGED" since="23"/>
+ <field name="ACTION_MANAGED_PROFILE_PROVISIONED" since="23"/>
+ <field name="ACTION_PROVISIONING_SUCCESSFUL" since="26"/>
+ <field name="ACTION_PROVISION_MANAGED_DEVICE" since="23"/>
+ <field name="ACTION_PROVISION_MANAGED_PROFILE" since="21"/>
+ <field name="ACTION_SET_NEW_PARENT_PROFILE_PASSWORD" since="24"/>
+ <field name="ACTION_SET_NEW_PASSWORD"/>
+ <field name="ACTION_START_ENCRYPTION" since="11"/>
+ <field name="ACTION_SYSTEM_UPDATE_POLICY_CHANGED" since="23"/>
+ <field name="DELEGATION_APP_RESTRICTIONS" since="26"/>
+ <field name="DELEGATION_BLOCK_UNINSTALL" since="26"/>
+ <field name="DELEGATION_CERT_INSTALL" since="26"/>
+ <field name="DELEGATION_ENABLE_SYSTEM_APP" since="26"/>
+ <field name="DELEGATION_PACKAGE_ACCESS" since="26"/>
+ <field name="DELEGATION_PERMISSION_GRANT" since="26"/>
+ <field name="ENCRYPTION_STATUS_ACTIVATING" since="11"/>
+ <field name="ENCRYPTION_STATUS_ACTIVE" since="11"/>
+ <field name="ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY" since="23"/>
+ <field name="ENCRYPTION_STATUS_ACTIVE_PER_USER" since="24"/>
+ <field name="ENCRYPTION_STATUS_INACTIVE" since="11"/>
+ <field name="ENCRYPTION_STATUS_UNSUPPORTED" since="11"/>
+ <field name="EXTRA_ADD_EXPLANATION"/>
+ <field name="EXTRA_DELEGATION_SCOPES" since="26"/>
+ <field name="EXTRA_DEVICE_ADMIN"/>
+ <field name="EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE" since="22"/>
+ <field name="EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE" since="21"/>
+ <field name="EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME" since="23"/>
+ <field name="EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE" since="23"/>
+ <field name="EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM" since="21"/>
+ <field name="EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER" since="21"/>
+ <field name="EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION" since="21"/>
+ <field name="EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME" since="21" deprecated="23"/>
+ <field name="EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM" since="23"/>
+ <field name="EXTRA_PROVISIONING_DISCLAIMERS" since="26"/>
+ <field name="EXTRA_PROVISIONING_DISCLAIMER_CONTENT" since="26"/>
+ <field name="EXTRA_PROVISIONING_DISCLAIMER_HEADER" since="26"/>
+ <field name="EXTRA_PROVISIONING_EMAIL_ADDRESS" since="21" deprecated="26"/>
+ <field name="EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION" since="26"/>
+ <field name="EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED" since="22"/>
+ <field name="EXTRA_PROVISIONING_LOCALE" since="21"/>
+ <field name="EXTRA_PROVISIONING_LOCAL_TIME" since="21"/>
+ <field name="EXTRA_PROVISIONING_LOGO_URI" since="24"/>
+ <field name="EXTRA_PROVISIONING_MAIN_COLOR" since="24"/>
+ <field name="EXTRA_PROVISIONING_SKIP_ENCRYPTION" since="23"/>
+ <field name="EXTRA_PROVISIONING_SKIP_USER_CONSENT" since="26"/>
+ <field name="EXTRA_PROVISIONING_TIME_ZONE" since="21"/>
+ <field name="EXTRA_PROVISIONING_WIFI_HIDDEN" since="21"/>
+ <field name="EXTRA_PROVISIONING_WIFI_PAC_URL" since="21"/>
+ <field name="EXTRA_PROVISIONING_WIFI_PASSWORD" since="21"/>
+ <field name="EXTRA_PROVISIONING_WIFI_PROXY_BYPASS" since="21"/>
+ <field name="EXTRA_PROVISIONING_WIFI_PROXY_HOST" since="21"/>
+ <field name="EXTRA_PROVISIONING_WIFI_PROXY_PORT" since="21"/>
+ <field name="EXTRA_PROVISIONING_WIFI_SECURITY_TYPE" since="21"/>
+ <field name="EXTRA_PROVISIONING_WIFI_SSID" since="21"/>
+ <field name="FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY" since="26"/>
+ <field name="FLAG_MANAGED_CAN_ACCESS_PARENT" since="21"/>
+ <field name="FLAG_PARENT_CAN_ACCESS_MANAGED" since="21"/>
+ <field name="KEYGUARD_DISABLE_FEATURES_ALL" since="17"/>
+ <field name="KEYGUARD_DISABLE_FEATURES_NONE" since="17"/>
+ <field name="KEYGUARD_DISABLE_FINGERPRINT" since="21"/>
+ <field name="KEYGUARD_DISABLE_REMOTE_INPUT" since="24"/>
+ <field name="KEYGUARD_DISABLE_SECURE_CAMERA" since="17"/>
+ <field name="KEYGUARD_DISABLE_SECURE_NOTIFICATIONS" since="21"/>
+ <field name="KEYGUARD_DISABLE_TRUST_AGENTS" since="21"/>
+ <field name="KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS" since="21"/>
+ <field name="KEYGUARD_DISABLE_WIDGETS_ALL" since="17"/>
+ <field name="MIME_TYPE_PROVISIONING_NFC" since="21"/>
+ <field name="PASSWORD_QUALITY_ALPHABETIC"/>
+ <field name="PASSWORD_QUALITY_ALPHANUMERIC"/>
+ <field name="PASSWORD_QUALITY_BIOMETRIC_WEAK" since="14"/>
+ <field name="PASSWORD_QUALITY_COMPLEX" since="11"/>
+ <field name="PASSWORD_QUALITY_NUMERIC"/>
+ <field name="PASSWORD_QUALITY_NUMERIC_COMPLEX" since="21"/>
+ <field name="PASSWORD_QUALITY_SOMETHING"/>
+ <field name="PASSWORD_QUALITY_UNSPECIFIED"/>
+ <field name="PERMISSION_GRANT_STATE_DEFAULT" since="23"/>
+ <field name="PERMISSION_GRANT_STATE_DENIED" since="23"/>
+ <field name="PERMISSION_GRANT_STATE_GRANTED" since="23"/>
+ <field name="PERMISSION_POLICY_AUTO_DENY" since="23"/>
+ <field name="PERMISSION_POLICY_AUTO_GRANT" since="23"/>
+ <field name="PERMISSION_POLICY_PROMPT" since="23"/>
+ <field name="POLICY_DISABLE_CAMERA" since="26"/>
+ <field name="POLICY_DISABLE_SCREEN_CAPTURE" since="26"/>
+ <field name="RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT" since="23"/>
+ <field name="RESET_PASSWORD_REQUIRE_ENTRY"/>
+ <field name="SKIP_SETUP_WIZARD" since="24"/>
+ <field name="WIPE_EXTERNAL_STORAGE" since="9"/>
+ <field name="WIPE_RESET_PROTECTION_DATA" since="22"/>
+ </class>
+ <class name="android/app/admin/DnsEvent" since="26">
+ <extends name="android/app/admin/NetworkEvent"/>
+ <method name="&lt;init>()V"/>
+ <method name="getHostname()Ljava/lang/String;"/>
+ <method name="getInetAddresses()Ljava/util/List;"/>
+ <method name="getTotalResolvedAddressCount()I"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/app/admin/NetworkEvent" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getPackageName()Ljava/lang/String;"/>
+ <method name="getTimestamp()J"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/app/admin/SecurityLog" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="TAG_ADB_SHELL_CMD"/>
+ <field name="TAG_ADB_SHELL_INTERACTIVE"/>
+ <field name="TAG_APP_PROCESS_START"/>
+ <field name="TAG_KEYGUARD_DISMISSED"/>
+ <field name="TAG_KEYGUARD_DISMISS_AUTH_ATTEMPT"/>
+ <field name="TAG_KEYGUARD_SECURED"/>
+ <field name="TAG_SYNC_RECV_FILE"/>
+ <field name="TAG_SYNC_SEND_FILE"/>
+ </class>
+ <class name="android/app/admin/SecurityLog$SecurityEvent" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getData()Ljava/lang/Object;"/>
+ <method name="getTag()I"/>
+ <method name="getTimeNanos()J"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/app/admin/SystemUpdateInfo" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getReceivedTime()J"/>
+ <method name="getSecurityPatchState()I"/>
+ <field name="CREATOR"/>
+ <field name="SECURITY_PATCH_STATE_FALSE"/>
+ <field name="SECURITY_PATCH_STATE_TRUE"/>
+ <field name="SECURITY_PATCH_STATE_UNKNOWN"/>
+ </class>
+ <class name="android/app/admin/SystemUpdatePolicy" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="createAutomaticInstallPolicy()Landroid/app/admin/SystemUpdatePolicy;"/>
+ <method name="createPostponeInstallPolicy()Landroid/app/admin/SystemUpdatePolicy;"/>
+ <method name="createWindowedInstallPolicy(II)Landroid/app/admin/SystemUpdatePolicy;"/>
+ <method name="getInstallWindowEnd()I"/>
+ <method name="getInstallWindowStart()I"/>
+ <method name="getPolicyType()I"/>
+ <field name="CREATOR"/>
+ <field name="TYPE_INSTALL_AUTOMATIC"/>
+ <field name="TYPE_INSTALL_WINDOWED"/>
+ <field name="TYPE_POSTPONE"/>
+ </class>
+ <class name="android/app/assist/AssistContent" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getClipData()Landroid/content/ClipData;"/>
+ <method name="getExtras()Landroid/os/Bundle;"/>
+ <method name="getIntent()Landroid/content/Intent;"/>
+ <method name="getStructuredData()Ljava/lang/String;"/>
+ <method name="getWebUri()Landroid/net/Uri;"/>
+ <method name="isAppProvidedIntent()Z"/>
+ <method name="isAppProvidedWebUri()Z" since="24"/>
+ <method name="setClipData(Landroid/content/ClipData;)V"/>
+ <method name="setIntent(Landroid/content/Intent;)V"/>
+ <method name="setStructuredData(Ljava/lang/String;)V"/>
+ <method name="setWebUri(Landroid/net/Uri;)V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/app/assist/AssistStructure" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAcquisitionEndTime()J" since="26"/>
+ <method name="getAcquisitionStartTime()J" since="26"/>
+ <method name="getActivityComponent()Landroid/content/ComponentName;"/>
+ <method name="getWindowNodeAt(I)Landroid/app/assist/AssistStructure$WindowNode;"/>
+ <method name="getWindowNodeCount()I"/>
+ <method name="isHomeActivity()Z" since="26"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/app/assist/AssistStructure$ViewNode" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAlpha()F"/>
+ <method name="getAutofillHints()[Ljava/lang/String;" since="26"/>
+ <method name="getAutofillId()Landroid/view/autofill/AutofillId;" since="26"/>
+ <method name="getAutofillOptions()[Ljava/lang/CharSequence;" since="26"/>
+ <method name="getAutofillType()I" since="26"/>
+ <method name="getAutofillValue()Landroid/view/autofill/AutofillValue;" since="26"/>
+ <method name="getChildAt(I)Landroid/app/assist/AssistStructure$ViewNode;"/>
+ <method name="getChildCount()I"/>
+ <method name="getClassName()Ljava/lang/String;"/>
+ <method name="getContentDescription()Ljava/lang/CharSequence;"/>
+ <method name="getElevation()F"/>
+ <method name="getExtras()Landroid/os/Bundle;"/>
+ <method name="getHeight()I"/>
+ <method name="getHint()Ljava/lang/String;"/>
+ <method name="getHtmlInfo()Landroid/view/ViewStructure$HtmlInfo;" since="26"/>
+ <method name="getId()I"/>
+ <method name="getIdEntry()Ljava/lang/String;"/>
+ <method name="getIdPackage()Ljava/lang/String;"/>
+ <method name="getIdType()Ljava/lang/String;"/>
+ <method name="getInputType()I" since="26"/>
+ <method name="getLeft()I"/>
+ <method name="getLocaleList()Landroid/os/LocaleList;" since="26"/>
+ <method name="getScrollX()I"/>
+ <method name="getScrollY()I"/>
+ <method name="getText()Ljava/lang/CharSequence;"/>
+ <method name="getTextBackgroundColor()I"/>
+ <method name="getTextColor()I"/>
+ <method name="getTextLineBaselines()[I"/>
+ <method name="getTextLineCharOffsets()[I"/>
+ <method name="getTextSelectionEnd()I"/>
+ <method name="getTextSelectionStart()I"/>
+ <method name="getTextSize()F"/>
+ <method name="getTextStyle()I"/>
+ <method name="getTop()I"/>
+ <method name="getTransformation()Landroid/graphics/Matrix;"/>
+ <method name="getVisibility()I"/>
+ <method name="getWebDomain()Ljava/lang/String;" since="26"/>
+ <method name="getWidth()I"/>
+ <method name="isAccessibilityFocused()Z"/>
+ <method name="isActivated()Z"/>
+ <method name="isAssistBlocked()Z"/>
+ <method name="isCheckable()Z"/>
+ <method name="isChecked()Z"/>
+ <method name="isClickable()Z"/>
+ <method name="isContextClickable()Z"/>
+ <method name="isEnabled()Z"/>
+ <method name="isFocusable()Z"/>
+ <method name="isFocused()Z"/>
+ <method name="isLongClickable()Z"/>
+ <method name="isOpaque()Z" since="26"/>
+ <method name="isSelected()Z"/>
+ <field name="TEXT_COLOR_UNDEFINED"/>
+ <field name="TEXT_STYLE_BOLD"/>
+ <field name="TEXT_STYLE_ITALIC"/>
+ <field name="TEXT_STYLE_STRIKE_THRU"/>
+ <field name="TEXT_STYLE_UNDERLINE"/>
+ </class>
+ <class name="android/app/assist/AssistStructure$WindowNode" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDisplayId()I"/>
+ <method name="getHeight()I"/>
+ <method name="getLeft()I"/>
+ <method name="getRootViewNode()Landroid/app/assist/AssistStructure$ViewNode;"/>
+ <method name="getTitle()Ljava/lang/CharSequence;"/>
+ <method name="getTop()I"/>
+ <method name="getWidth()I"/>
+ </class>
+ <class name="android/app/backup/BackupAgent" since="8">
+ <extends name="android/content/ContextWrapper"/>
+ <method name="&lt;init>()V"/>
+ <method name="fullBackupFile(Ljava/io/File;Landroid/app/backup/FullBackupDataOutput;)V" since="14"/>
+ <method name="onBackup(Landroid/os/ParcelFileDescriptor;Landroid/app/backup/BackupDataOutput;Landroid/os/ParcelFileDescriptor;)V"/>
+ <method name="onCreate()V"/>
+ <method name="onDestroy()V"/>
+ <method name="onFullBackup(Landroid/app/backup/FullBackupDataOutput;)V" since="14"/>
+ <method name="onQuotaExceeded(JJ)V" since="24"/>
+ <method name="onRestore(Landroid/app/backup/BackupDataInput;ILandroid/os/ParcelFileDescriptor;)V"/>
+ <method name="onRestoreFile(Landroid/os/ParcelFileDescriptor;JLjava/io/File;IJJ)V" since="14"/>
+ <method name="onRestoreFinished()V" since="21"/>
+ <field name="TYPE_DIRECTORY" since="14"/>
+ <field name="TYPE_FILE" since="14"/>
+ </class>
+ <class name="android/app/backup/BackupAgentHelper" since="8">
+ <extends name="android/app/backup/BackupAgent"/>
+ <method name="&lt;init>()V"/>
+ <method name="addHelper(Ljava/lang/String;Landroid/app/backup/BackupHelper;)V"/>
+ </class>
+ <class name="android/app/backup/BackupDataInput" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDataSize()I"/>
+ <method name="getKey()Ljava/lang/String;"/>
+ <method name="readEntityData([BII)I"/>
+ <method name="readNextHeader()Z"/>
+ <method name="skipEntityData()V"/>
+ </class>
+ <class name="android/app/backup/BackupDataInputStream" since="8">
+ <extends name="java/io/InputStream"/>
+ <method name="&lt;init>()V"/>
+ <method name="getKey()Ljava/lang/String;"/>
+ <method name="size()I"/>
+ </class>
+ <class name="android/app/backup/BackupDataOutput" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getQuota()J" since="26"/>
+ <method name="writeEntityData([BI)I"/>
+ <method name="writeEntityHeader(Ljava/lang/String;I)I"/>
+ </class>
+ <class name="android/app/backup/BackupHelper" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="performBackup(Landroid/os/ParcelFileDescriptor;Landroid/app/backup/BackupDataOutput;Landroid/os/ParcelFileDescriptor;)V"/>
+ <method name="restoreEntity(Landroid/app/backup/BackupDataInputStream;)V"/>
+ <method name="writeNewStateDescription(Landroid/os/ParcelFileDescriptor;)V"/>
+ </class>
+ <class name="android/app/backup/BackupManager" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="dataChanged()V"/>
+ <method name="dataChanged(Ljava/lang/String;)V"/>
+ <method name="requestRestore(Landroid/app/backup/RestoreObserver;)I"/>
+ </class>
+ <class name="android/app/backup/FileBackupHelper" since="8">
+ <extends name="android/app/backup/FileBackupHelperBase"/>
+ <implements name="android/app/backup/BackupHelper"/>
+ <method name="&lt;init>(Landroid/content/Context;[Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/app/backup/FileBackupHelperBase" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="writeNewStateDescription(Landroid/os/ParcelFileDescriptor;)V"/>
+ </class>
+ <class name="android/app/backup/FullBackupDataOutput" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getQuota()J" since="26"/>
+ </class>
+ <class name="android/app/backup/RestoreObserver" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onUpdate(ILjava/lang/String;)V"/>
+ <method name="restoreFinished(I)V"/>
+ <method name="restoreStarting(I)V"/>
+ </class>
+ <class name="android/app/backup/SharedPreferencesBackupHelper" since="8">
+ <extends name="android/app/backup/FileBackupHelperBase"/>
+ <implements name="android/app/backup/BackupHelper"/>
+ <method name="&lt;init>(Landroid/content/Context;[Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/app/job/JobInfo" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getBackoffPolicy()I"/>
+ <method name="getClipData()Landroid/content/ClipData;" since="26"/>
+ <method name="getClipGrantFlags()I" since="26"/>
+ <method name="getExtras()Landroid/os/PersistableBundle;"/>
+ <method name="getFlexMillis()J" since="24"/>
+ <method name="getId()I"/>
+ <method name="getInitialBackoffMillis()J"/>
+ <method name="getIntervalMillis()J"/>
+ <method name="getMaxExecutionDelayMillis()J"/>
+ <method name="getMinFlexMillis()J" since="24"/>
+ <method name="getMinLatencyMillis()J"/>
+ <method name="getMinPeriodMillis()J" since="24"/>
+ <method name="getNetworkType()I"/>
+ <method name="getService()Landroid/content/ComponentName;"/>
+ <method name="getTransientExtras()Landroid/os/Bundle;" since="26"/>
+ <method name="getTriggerContentMaxDelay()J" since="24"/>
+ <method name="getTriggerContentUpdateDelay()J" since="24"/>
+ <method name="getTriggerContentUris()[Landroid/app/job/JobInfo$TriggerContentUri;" since="24"/>
+ <method name="isPeriodic()Z"/>
+ <method name="isPersisted()Z"/>
+ <method name="isRequireBatteryNotLow()Z" since="26"/>
+ <method name="isRequireCharging()Z"/>
+ <method name="isRequireDeviceIdle()Z"/>
+ <method name="isRequireStorageNotLow()Z" since="26"/>
+ <field name="BACKOFF_POLICY_EXPONENTIAL"/>
+ <field name="BACKOFF_POLICY_LINEAR"/>
+ <field name="CREATOR"/>
+ <field name="DEFAULT_INITIAL_BACKOFF_MILLIS"/>
+ <field name="MAX_BACKOFF_DELAY_MILLIS"/>
+ <field name="NETWORK_TYPE_ANY"/>
+ <field name="NETWORK_TYPE_METERED" since="26"/>
+ <field name="NETWORK_TYPE_NONE"/>
+ <field name="NETWORK_TYPE_NOT_ROAMING" since="24"/>
+ <field name="NETWORK_TYPE_UNMETERED"/>
+ </class>
+ <class name="android/app/job/JobInfo$Builder" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(ILandroid/content/ComponentName;)V"/>
+ <method name="addTriggerContentUri(Landroid/app/job/JobInfo$TriggerContentUri;)Landroid/app/job/JobInfo$Builder;" since="24"/>
+ <method name="build()Landroid/app/job/JobInfo;"/>
+ <method name="setBackoffCriteria(JI)Landroid/app/job/JobInfo$Builder;"/>
+ <method name="setClipData(Landroid/content/ClipData;I)Landroid/app/job/JobInfo$Builder;" since="26"/>
+ <method name="setExtras(Landroid/os/PersistableBundle;)Landroid/app/job/JobInfo$Builder;"/>
+ <method name="setMinimumLatency(J)Landroid/app/job/JobInfo$Builder;"/>
+ <method name="setOverrideDeadline(J)Landroid/app/job/JobInfo$Builder;"/>
+ <method name="setPeriodic(J)Landroid/app/job/JobInfo$Builder;"/>
+ <method name="setPeriodic(JJ)Landroid/app/job/JobInfo$Builder;" since="24"/>
+ <method name="setPersisted(Z)Landroid/app/job/JobInfo$Builder;"/>
+ <method name="setRequiredNetworkType(I)Landroid/app/job/JobInfo$Builder;"/>
+ <method name="setRequiresBatteryNotLow(Z)Landroid/app/job/JobInfo$Builder;" since="26"/>
+ <method name="setRequiresCharging(Z)Landroid/app/job/JobInfo$Builder;"/>
+ <method name="setRequiresDeviceIdle(Z)Landroid/app/job/JobInfo$Builder;"/>
+ <method name="setRequiresStorageNotLow(Z)Landroid/app/job/JobInfo$Builder;" since="26"/>
+ <method name="setTransientExtras(Landroid/os/Bundle;)Landroid/app/job/JobInfo$Builder;" since="26"/>
+ <method name="setTriggerContentMaxDelay(J)Landroid/app/job/JobInfo$Builder;" since="24"/>
+ <method name="setTriggerContentUpdateDelay(J)Landroid/app/job/JobInfo$Builder;" since="24"/>
+ </class>
+ <class name="android/app/job/JobInfo$TriggerContentUri" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/net/Uri;I)V"/>
+ <method name="getFlags()I"/>
+ <method name="getUri()Landroid/net/Uri;"/>
+ <field name="CREATOR"/>
+ <field name="FLAG_NOTIFY_FOR_DESCENDANTS"/>
+ </class>
+ <class name="android/app/job/JobParameters" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="completeWork(Landroid/app/job/JobWorkItem;)V" since="26"/>
+ <method name="dequeueWork()Landroid/app/job/JobWorkItem;" since="26"/>
+ <method name="getClipData()Landroid/content/ClipData;" since="26"/>
+ <method name="getClipGrantFlags()I" since="26"/>
+ <method name="getExtras()Landroid/os/PersistableBundle;"/>
+ <method name="getJobId()I"/>
+ <method name="getTransientExtras()Landroid/os/Bundle;" since="26"/>
+ <method name="getTriggeredContentAuthorities()[Ljava/lang/String;" since="24"/>
+ <method name="getTriggeredContentUris()[Landroid/net/Uri;" since="24"/>
+ <method name="isOverrideDeadlineExpired()Z"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/app/job/JobScheduler" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="cancel(I)V"/>
+ <method name="cancelAll()V"/>
+ <method name="enqueue(Landroid/app/job/JobInfo;Landroid/app/job/JobWorkItem;)I" since="26"/>
+ <method name="getAllPendingJobs()Ljava/util/List;"/>
+ <method name="getPendingJob(I)Landroid/app/job/JobInfo;" since="24"/>
+ <method name="schedule(Landroid/app/job/JobInfo;)I"/>
+ <field name="RESULT_FAILURE"/>
+ <field name="RESULT_SUCCESS"/>
+ </class>
+ <class name="android/app/job/JobService" since="21">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="jobFinished(Landroid/app/job/JobParameters;Z)V"/>
+ <method name="onStartJob(Landroid/app/job/JobParameters;)Z"/>
+ <method name="onStopJob(Landroid/app/job/JobParameters;)Z"/>
+ <field name="PERMISSION_BIND"/>
+ </class>
+ <class name="android/app/job/JobServiceEngine" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/app/Service;)V"/>
+ <method name="getBinder()Landroid/os/IBinder;"/>
+ <method name="jobFinished(Landroid/app/job/JobParameters;Z)V"/>
+ <method name="onStartJob(Landroid/app/job/JobParameters;)Z"/>
+ <method name="onStopJob(Landroid/app/job/JobParameters;)Z"/>
+ </class>
+ <class name="android/app/job/JobWorkItem" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/content/Intent;)V"/>
+ <method name="getDeliveryCount()I"/>
+ <method name="getIntent()Landroid/content/Intent;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/app/usage/ConfigurationStats" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/app/usage/ConfigurationStats;)V"/>
+ <method name="getActivationCount()I"/>
+ <method name="getConfiguration()Landroid/content/res/Configuration;"/>
+ <method name="getFirstTimeStamp()J"/>
+ <method name="getLastTimeActive()J"/>
+ <method name="getLastTimeStamp()J"/>
+ <method name="getTotalTimeActive()J"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/app/usage/ExternalStorageStats" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAppBytes()J"/>
+ <method name="getAudioBytes()J"/>
+ <method name="getImageBytes()J"/>
+ <method name="getTotalBytes()J"/>
+ <method name="getVideoBytes()J"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/app/usage/NetworkStats" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getNextBucket(Landroid/app/usage/NetworkStats$Bucket;)Z"/>
+ <method name="hasNextBucket()Z"/>
+ </class>
+ <class name="android/app/usage/NetworkStats$Bucket" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getEndTimeStamp()J"/>
+ <method name="getMetered()I" since="26"/>
+ <method name="getRoaming()I" since="24"/>
+ <method name="getRxBytes()J"/>
+ <method name="getRxPackets()J"/>
+ <method name="getStartTimeStamp()J"/>
+ <method name="getState()I"/>
+ <method name="getTag()I" since="24"/>
+ <method name="getTxBytes()J"/>
+ <method name="getTxPackets()J"/>
+ <method name="getUid()I"/>
+ <field name="METERED_ALL" since="26"/>
+ <field name="METERED_NO" since="26"/>
+ <field name="METERED_YES" since="26"/>
+ <field name="ROAMING_ALL" since="24"/>
+ <field name="ROAMING_NO" since="24"/>
+ <field name="ROAMING_YES" since="24"/>
+ <field name="STATE_ALL"/>
+ <field name="STATE_DEFAULT"/>
+ <field name="STATE_FOREGROUND"/>
+ <field name="TAG_NONE" since="24"/>
+ <field name="UID_ALL"/>
+ <field name="UID_REMOVED"/>
+ <field name="UID_TETHERING"/>
+ </class>
+ <class name="android/app/usage/NetworkStatsManager" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="queryDetails(ILjava/lang/String;JJ)Landroid/app/usage/NetworkStats;"/>
+ <method name="queryDetailsForUid(ILjava/lang/String;JJI)Landroid/app/usage/NetworkStats;"/>
+ <method name="queryDetailsForUidTag(ILjava/lang/String;JJII)Landroid/app/usage/NetworkStats;" since="24"/>
+ <method name="querySummary(ILjava/lang/String;JJ)Landroid/app/usage/NetworkStats;"/>
+ <method name="querySummaryForDevice(ILjava/lang/String;JJ)Landroid/app/usage/NetworkStats$Bucket;"/>
+ <method name="querySummaryForUser(ILjava/lang/String;JJ)Landroid/app/usage/NetworkStats$Bucket;"/>
+ <method name="registerUsageCallback(ILjava/lang/String;JLandroid/app/usage/NetworkStatsManager$UsageCallback;)V" since="24"/>
+ <method name="registerUsageCallback(ILjava/lang/String;JLandroid/app/usage/NetworkStatsManager$UsageCallback;Landroid/os/Handler;)V" since="24"/>
+ <method name="unregisterUsageCallback(Landroid/app/usage/NetworkStatsManager$UsageCallback;)V" since="24"/>
+ </class>
+ <class name="android/app/usage/NetworkStatsManager$UsageCallback" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onThresholdReached(ILjava/lang/String;)V"/>
+ </class>
+ <class name="android/app/usage/StorageStats" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAppBytes()J"/>
+ <method name="getCacheBytes()J"/>
+ <method name="getDataBytes()J"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/app/usage/StorageStatsManager" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getFreeBytes(Ljava/util/UUID;)J"/>
+ <method name="getTotalBytes(Ljava/util/UUID;)J"/>
+ <method name="queryExternalStatsForUser(Ljava/util/UUID;Landroid/os/UserHandle;)Landroid/app/usage/ExternalStorageStats;"/>
+ <method name="queryStatsForPackage(Ljava/util/UUID;Ljava/lang/String;Landroid/os/UserHandle;)Landroid/app/usage/StorageStats;"/>
+ <method name="queryStatsForUid(Ljava/util/UUID;I)Landroid/app/usage/StorageStats;"/>
+ <method name="queryStatsForUser(Ljava/util/UUID;Landroid/os/UserHandle;)Landroid/app/usage/StorageStats;"/>
+ </class>
+ <class name="android/app/usage/UsageEvents" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getNextEvent(Landroid/app/usage/UsageEvents$Event;)Z"/>
+ <method name="hasNextEvent()Z"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/app/usage/UsageEvents$Event" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getClassName()Ljava/lang/String;"/>
+ <method name="getConfiguration()Landroid/content/res/Configuration;"/>
+ <method name="getEventType()I"/>
+ <method name="getPackageName()Ljava/lang/String;"/>
+ <method name="getShortcutId()Ljava/lang/String;" since="25"/>
+ <method name="getTimeStamp()J"/>
+ <field name="CONFIGURATION_CHANGE"/>
+ <field name="MOVE_TO_BACKGROUND"/>
+ <field name="MOVE_TO_FOREGROUND"/>
+ <field name="NONE"/>
+ <field name="SHORTCUT_INVOCATION" since="25"/>
+ <field name="USER_INTERACTION" since="23"/>
+ </class>
+ <class name="android/app/usage/UsageStats" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/app/usage/UsageStats;)V"/>
+ <method name="add(Landroid/app/usage/UsageStats;)V"/>
+ <method name="getFirstTimeStamp()J"/>
+ <method name="getLastTimeStamp()J"/>
+ <method name="getLastTimeUsed()J"/>
+ <method name="getPackageName()Ljava/lang/String;"/>
+ <method name="getTotalTimeInForeground()J"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/app/usage/UsageStatsManager" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="isAppInactive(Ljava/lang/String;)Z" since="23"/>
+ <method name="queryAndAggregateUsageStats(JJ)Ljava/util/Map;"/>
+ <method name="queryConfigurations(IJJ)Ljava/util/List;"/>
+ <method name="queryEvents(JJ)Landroid/app/usage/UsageEvents;"/>
+ <method name="queryUsageStats(IJJ)Ljava/util/List;"/>
+ <field name="INTERVAL_BEST"/>
+ <field name="INTERVAL_DAILY"/>
+ <field name="INTERVAL_MONTHLY"/>
+ <field name="INTERVAL_WEEKLY"/>
+ <field name="INTERVAL_YEARLY"/>
+ </class>
+ <class name="android/appwidget/AppWidgetHost" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;I)V"/>
+ <method name="allocateAppWidgetId()I"/>
+ <method name="clearViews()V" since="11"/>
+ <method name="createView(Landroid/content/Context;ILandroid/appwidget/AppWidgetProviderInfo;)Landroid/appwidget/AppWidgetHostView;"/>
+ <method name="deleteAllHosts()V"/>
+ <method name="deleteAppWidgetId(I)V"/>
+ <method name="deleteHost()V"/>
+ <method name="getAppWidgetIds()[I" since="26"/>
+ <method name="onCreateView(Landroid/content/Context;ILandroid/appwidget/AppWidgetProviderInfo;)Landroid/appwidget/AppWidgetHostView;"/>
+ <method name="onProviderChanged(ILandroid/appwidget/AppWidgetProviderInfo;)V"/>
+ <method name="onProvidersChanged()V" since="17"/>
+ <method name="startAppWidgetConfigureActivityForResult(Landroid/app/Activity;IIILandroid/os/Bundle;)V" since="21"/>
+ <method name="startListening()V"/>
+ <method name="stopListening()V"/>
+ </class>
+ <class name="android/appwidget/AppWidgetHostView" since="3">
+ <extends name="android/widget/FrameLayout"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;II)V"/>
+ <method name="getAppWidgetId()I"/>
+ <method name="getAppWidgetInfo()Landroid/appwidget/AppWidgetProviderInfo;"/>
+ <method name="getDefaultPaddingForWidget(Landroid/content/Context;Landroid/content/ComponentName;Landroid/graphics/Rect;)Landroid/graphics/Rect;" since="15"/>
+ <method name="getDefaultView()Landroid/view/View;"/>
+ <method name="getErrorView()Landroid/view/View;"/>
+ <method name="prepareView(Landroid/view/View;)V"/>
+ <method name="setAppWidget(ILandroid/appwidget/AppWidgetProviderInfo;)V"/>
+ <method name="setExecutor(Ljava/util/concurrent/Executor;)V" since="26"/>
+ <method name="updateAppWidget(Landroid/widget/RemoteViews;)V"/>
+ <method name="updateAppWidgetOptions(Landroid/os/Bundle;)V" since="16"/>
+ <method name="updateAppWidgetSize(Landroid/os/Bundle;IIII)V" since="16"/>
+ </class>
+ <class name="android/appwidget/AppWidgetManager" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="bindAppWidgetId(ILandroid/content/ComponentName;)V" removed="16"/>
+ <method name="bindAppWidgetIdIfAllowed(ILandroid/content/ComponentName;)Z" since="16"/>
+ <method name="bindAppWidgetIdIfAllowed(ILandroid/content/ComponentName;Landroid/os/Bundle;)Z" since="17"/>
+ <method name="bindAppWidgetIdIfAllowed(ILandroid/os/UserHandle;Landroid/content/ComponentName;Landroid/os/Bundle;)Z" since="21"/>
+ <method name="getAppWidgetIds(Landroid/content/ComponentName;)[I"/>
+ <method name="getAppWidgetInfo(I)Landroid/appwidget/AppWidgetProviderInfo;"/>
+ <method name="getAppWidgetOptions(I)Landroid/os/Bundle;" since="16"/>
+ <method name="getInstalledProviders()Ljava/util/List;"/>
+ <method name="getInstalledProvidersForPackage(Ljava/lang/String;Landroid/os/UserHandle;)Ljava/util/List;" since="26"/>
+ <method name="getInstalledProvidersForProfile(Landroid/os/UserHandle;)Ljava/util/List;" since="21"/>
+ <method name="getInstance(Landroid/content/Context;)Landroid/appwidget/AppWidgetManager;"/>
+ <method name="isRequestPinAppWidgetSupported()Z" since="26"/>
+ <method name="notifyAppWidgetViewDataChanged(II)V" since="11"/>
+ <method name="notifyAppWidgetViewDataChanged([II)V" since="11"/>
+ <method name="partiallyUpdateAppWidget(ILandroid/widget/RemoteViews;)V" since="11"/>
+ <method name="partiallyUpdateAppWidget([ILandroid/widget/RemoteViews;)V" since="11"/>
+ <method name="requestPinAppWidget(Landroid/content/ComponentName;Landroid/os/Bundle;Landroid/app/PendingIntent;)Z" since="26"/>
+ <method name="updateAppWidget(ILandroid/widget/RemoteViews;)V"/>
+ <method name="updateAppWidget(Landroid/content/ComponentName;Landroid/widget/RemoteViews;)V"/>
+ <method name="updateAppWidget([ILandroid/widget/RemoteViews;)V"/>
+ <method name="updateAppWidgetOptions(ILandroid/os/Bundle;)V" since="16"/>
+ <field name="ACTION_APPWIDGET_BIND" since="16"/>
+ <field name="ACTION_APPWIDGET_CONFIGURE"/>
+ <field name="ACTION_APPWIDGET_DELETED"/>
+ <field name="ACTION_APPWIDGET_DISABLED"/>
+ <field name="ACTION_APPWIDGET_ENABLED"/>
+ <field name="ACTION_APPWIDGET_HOST_RESTORED" since="21"/>
+ <field name="ACTION_APPWIDGET_OPTIONS_CHANGED" since="16"/>
+ <field name="ACTION_APPWIDGET_PICK"/>
+ <field name="ACTION_APPWIDGET_RESTORED" since="21"/>
+ <field name="ACTION_APPWIDGET_UPDATE"/>
+ <field name="EXTRA_APPWIDGET_ID"/>
+ <field name="EXTRA_APPWIDGET_IDS"/>
+ <field name="EXTRA_APPWIDGET_OLD_IDS" since="21"/>
+ <field name="EXTRA_APPWIDGET_OPTIONS" since="16"/>
+ <field name="EXTRA_APPWIDGET_PREVIEW" since="26"/>
+ <field name="EXTRA_APPWIDGET_PROVIDER" since="16"/>
+ <field name="EXTRA_APPWIDGET_PROVIDER_PROFILE" since="21"/>
+ <field name="EXTRA_CUSTOM_EXTRAS"/>
+ <field name="EXTRA_CUSTOM_INFO"/>
+ <field name="EXTRA_HOST_ID" since="21"/>
+ <field name="INVALID_APPWIDGET_ID"/>
+ <field name="META_DATA_APPWIDGET_PROVIDER"/>
+ <field name="OPTION_APPWIDGET_HOST_CATEGORY" since="17"/>
+ <field name="OPTION_APPWIDGET_MAX_HEIGHT" since="16"/>
+ <field name="OPTION_APPWIDGET_MAX_WIDTH" since="16"/>
+ <field name="OPTION_APPWIDGET_MIN_HEIGHT" since="16"/>
+ <field name="OPTION_APPWIDGET_MIN_WIDTH" since="16"/>
+ </class>
+ <class name="android/appwidget/AppWidgetProvider" since="3">
+ <extends name="android/content/BroadcastReceiver"/>
+ <method name="&lt;init>()V"/>
+ <method name="onAppWidgetOptionsChanged(Landroid/content/Context;Landroid/appwidget/AppWidgetManager;ILandroid/os/Bundle;)V" since="16"/>
+ <method name="onDeleted(Landroid/content/Context;[I)V"/>
+ <method name="onDisabled(Landroid/content/Context;)V"/>
+ <method name="onEnabled(Landroid/content/Context;)V"/>
+ <method name="onRestored(Landroid/content/Context;[I[I)V" since="21"/>
+ <method name="onUpdate(Landroid/content/Context;Landroid/appwidget/AppWidgetManager;[I)V"/>
+ </class>
+ <class name="android/appwidget/AppWidgetProviderInfo" since="3">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="clone()Landroid/appwidget/AppWidgetProviderInfo;" since="17"/>
+ <method name="getProfile()Landroid/os/UserHandle;" since="21"/>
+ <method name="loadIcon(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable;" since="21"/>
+ <method name="loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/String;" since="21"/>
+ <method name="loadPreviewImage(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable;" since="21"/>
+ <field name="CREATOR"/>
+ <field name="RESIZE_BOTH" since="12"/>
+ <field name="RESIZE_HORIZONTAL" since="12"/>
+ <field name="RESIZE_NONE" since="12"/>
+ <field name="RESIZE_VERTICAL" since="12"/>
+ <field name="WIDGET_CATEGORY_HOME_SCREEN" since="17"/>
+ <field name="WIDGET_CATEGORY_KEYGUARD" since="17"/>
+ <field name="WIDGET_CATEGORY_SEARCHBOX" since="21"/>
+ <field name="autoAdvanceViewId" since="11"/>
+ <field name="configure"/>
+ <field name="icon"/>
+ <field name="initialKeyguardLayout" since="17"/>
+ <field name="initialLayout"/>
+ <field name="label" deprecated="21"/>
+ <field name="minHeight"/>
+ <field name="minResizeHeight" since="14"/>
+ <field name="minResizeWidth" since="14"/>
+ <field name="minWidth"/>
+ <field name="previewImage" since="11"/>
+ <field name="provider"/>
+ <field name="resizeMode" since="12"/>
+ <field name="updatePeriodMillis"/>
+ <field name="widgetCategory" since="17"/>
+ </class>
+ <class name="android/bluetooth/BluetoothA2dp" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="android/bluetooth/BluetoothProfile"/>
+ <method name="&lt;init>()V"/>
+ <method name="isA2dpPlaying(Landroid/bluetooth/BluetoothDevice;)Z"/>
+ <field name="ACTION_CONNECTION_STATE_CHANGED"/>
+ <field name="ACTION_PLAYING_STATE_CHANGED"/>
+ <field name="STATE_NOT_PLAYING"/>
+ <field name="STATE_PLAYING"/>
+ </class>
+ <class name="android/bluetooth/BluetoothAdapter" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="cancelDiscovery()Z"/>
+ <method name="checkBluetoothAddress(Ljava/lang/String;)Z"/>
+ <method name="closeProfileProxy(ILandroid/bluetooth/BluetoothProfile;)V" since="11"/>
+ <method name="disable()Z"/>
+ <method name="enable()Z"/>
+ <method name="getAddress()Ljava/lang/String;"/>
+ <method name="getBluetoothLeAdvertiser()Landroid/bluetooth/le/BluetoothLeAdvertiser;" since="21"/>
+ <method name="getBluetoothLeScanner()Landroid/bluetooth/le/BluetoothLeScanner;" since="21"/>
+ <method name="getBondedDevices()Ljava/util/Set;"/>
+ <method name="getDefaultAdapter()Landroid/bluetooth/BluetoothAdapter;"/>
+ <method name="getLeMaximumAdvertisingDataLength()I" since="26"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getProfileConnectionState(I)I" since="14"/>
+ <method name="getProfileProxy(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;I)Z" since="11"/>
+ <method name="getRemoteDevice(Ljava/lang/String;)Landroid/bluetooth/BluetoothDevice;"/>
+ <method name="getRemoteDevice([B)Landroid/bluetooth/BluetoothDevice;" since="16"/>
+ <method name="getScanMode()I"/>
+ <method name="getState()I"/>
+ <method name="isDiscovering()Z"/>
+ <method name="isEnabled()Z"/>
+ <method name="isLe2MPhySupported()Z" since="26"/>
+ <method name="isLeCodedPhySupported()Z" since="26"/>
+ <method name="isLeExtendedAdvertisingSupported()Z" since="26"/>
+ <method name="isLePeriodicAdvertisingSupported()Z" since="26"/>
+ <method name="isMultipleAdvertisementSupported()Z" since="21"/>
+ <method name="isOffloadedFilteringSupported()Z" since="21"/>
+ <method name="isOffloadedScanBatchingSupported()Z" since="21"/>
+ <method name="listenUsingInsecureRfcommWithServiceRecord(Ljava/lang/String;Ljava/util/UUID;)Landroid/bluetooth/BluetoothServerSocket;" since="10"/>
+ <method name="listenUsingRfcommWithServiceRecord(Ljava/lang/String;Ljava/util/UUID;)Landroid/bluetooth/BluetoothServerSocket;"/>
+ <method name="setName(Ljava/lang/String;)Z"/>
+ <method name="startDiscovery()Z"/>
+ <method name="startLeScan(Landroid/bluetooth/BluetoothAdapter$LeScanCallback;)Z" since="18" deprecated="21"/>
+ <method name="startLeScan([Ljava/util/UUID;Landroid/bluetooth/BluetoothAdapter$LeScanCallback;)Z" since="18" deprecated="21"/>
+ <method name="stopLeScan(Landroid/bluetooth/BluetoothAdapter$LeScanCallback;)V" since="18" deprecated="21"/>
+ <field name="ACTION_CONNECTION_STATE_CHANGED" since="11"/>
+ <field name="ACTION_DISCOVERY_FINISHED"/>
+ <field name="ACTION_DISCOVERY_STARTED"/>
+ <field name="ACTION_LOCAL_NAME_CHANGED"/>
+ <field name="ACTION_REQUEST_DISCOVERABLE"/>
+ <field name="ACTION_REQUEST_ENABLE"/>
+ <field name="ACTION_SCAN_MODE_CHANGED"/>
+ <field name="ACTION_STATE_CHANGED"/>
+ <field name="ERROR"/>
+ <field name="EXTRA_CONNECTION_STATE" since="11"/>
+ <field name="EXTRA_DISCOVERABLE_DURATION"/>
+ <field name="EXTRA_LOCAL_NAME"/>
+ <field name="EXTRA_PREVIOUS_CONNECTION_STATE" since="11"/>
+ <field name="EXTRA_PREVIOUS_SCAN_MODE"/>
+ <field name="EXTRA_PREVIOUS_STATE"/>
+ <field name="EXTRA_SCAN_MODE"/>
+ <field name="EXTRA_STATE"/>
+ <field name="SCAN_MODE_CONNECTABLE"/>
+ <field name="SCAN_MODE_CONNECTABLE_DISCOVERABLE"/>
+ <field name="SCAN_MODE_NONE"/>
+ <field name="STATE_CONNECTED" since="11"/>
+ <field name="STATE_CONNECTING" since="11"/>
+ <field name="STATE_DISCONNECTED" since="11"/>
+ <field name="STATE_DISCONNECTING" since="11"/>
+ <field name="STATE_OFF"/>
+ <field name="STATE_ON"/>
+ <field name="STATE_TURNING_OFF"/>
+ <field name="STATE_TURNING_ON"/>
+ </class>
+ <class name="android/bluetooth/BluetoothAdapter$LeScanCallback" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="onLeScan(Landroid/bluetooth/BluetoothDevice;I[B)V"/>
+ </class>
+ <class name="android/bluetooth/BluetoothAssignedNumbers" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="AAMP_OF_AMERICA" since="19"/>
+ <field name="ACCEL_SEMICONDUCTOR"/>
+ <field name="ACE_SENSOR" since="19"/>
+ <field name="ADIDAS" since="19"/>
+ <field name="ADVANCED_PANMOBIL_SYSTEMS" since="19"/>
+ <field name="AIROHA_TECHNOLOGY" since="19"/>
+ <field name="ALCATEL"/>
+ <field name="ALPWISE" since="19"/>
+ <field name="AMICCOM_ELECTRONICS" since="19"/>
+ <field name="APLIX" since="19"/>
+ <field name="APPLE"/>
+ <field name="APT_LICENSING"/>
+ <field name="ARCHOS" since="19"/>
+ <field name="ARP_DEVICES" since="19"/>
+ <field name="ATHEROS_COMMUNICATIONS"/>
+ <field name="ATMEL"/>
+ <field name="AUSTCO_COMMUNICATION_SYSTEMS" since="19"/>
+ <field name="AUTONET_MOBILE" since="19"/>
+ <field name="AVAGO"/>
+ <field name="AVM_BERLIN"/>
+ <field name="A_AND_D_ENGINEERING" since="19"/>
+ <field name="A_AND_R_CAMBRIDGE" since="19"/>
+ <field name="BANDSPEED"/>
+ <field name="BAND_XI_INTERNATIONAL" since="19"/>
+ <field name="BDE_TECHNOLOGY" since="19"/>
+ <field name="BEATS_ELECTRONICS" since="19"/>
+ <field name="BEAUTIFUL_ENTERPRISE" since="19"/>
+ <field name="BEKEY" since="19"/>
+ <field name="BELKIN_INTERNATIONAL"/>
+ <field name="BINAURIC" since="19"/>
+ <field name="BIOSENTRONICS" since="19"/>
+ <field name="BLUEGIGA"/>
+ <field name="BLUERADIOS" since="19"/>
+ <field name="BLUETOOTH_SIG"/>
+ <field name="BLUETREK_TECHNOLOGIES" since="19"/>
+ <field name="BOSE" since="19"/>
+ <field name="BRIARTEK" since="19"/>
+ <field name="BROADCOM"/>
+ <field name="CAEN_RFID" since="19"/>
+ <field name="CAMBRIDGE_SILICON_RADIO"/>
+ <field name="CATC"/>
+ <field name="CINETIX" since="19"/>
+ <field name="CLARINOX_TECHNOLOGIES" since="19"/>
+ <field name="COLORFY" since="19"/>
+ <field name="COMMIL"/>
+ <field name="CONEXANT_SYSTEMS"/>
+ <field name="CONNECTBLUE" since="19"/>
+ <field name="CONTINENTAL_AUTOMOTIVE"/>
+ <field name="CONWISE_TECHNOLOGY"/>
+ <field name="CREATIVE_TECHNOLOGY" since="19"/>
+ <field name="C_TECHNOLOGIES"/>
+ <field name="DANLERS" since="19"/>
+ <field name="DELORME_PUBLISHING_COMPANY" since="19"/>
+ <field name="DEXCOM" since="19"/>
+ <field name="DIALOG_SEMICONDUCTOR" since="19"/>
+ <field name="DIGIANSWER"/>
+ <field name="ECLIPSE"/>
+ <field name="ECOTEST" since="19"/>
+ <field name="ELGATO_SYSTEMS" since="19"/>
+ <field name="EM_MICROELECTRONIC_MARIN"/>
+ <field name="EQUINOX_AG" since="19"/>
+ <field name="ERICSSON_TECHNOLOGY"/>
+ <field name="EVLUMA" since="19"/>
+ <field name="FREE2MOVE"/>
+ <field name="FUNAI_ELECTRIC" since="19"/>
+ <field name="GARMIN_INTERNATIONAL" since="19"/>
+ <field name="GCT_SEMICONDUCTOR"/>
+ <field name="GELO" since="19"/>
+ <field name="GENEQ" since="19"/>
+ <field name="GENERAL_MOTORS" since="19"/>
+ <field name="GENNUM"/>
+ <field name="GEOFORCE" since="19"/>
+ <field name="GIBSON_GUITARS" since="19"/>
+ <field name="GN_NETCOM" since="19"/>
+ <field name="GN_RESOUND" since="19"/>
+ <field name="GOOGLE" since="19"/>
+ <field name="GREEN_THROTTLE_GAMES" since="19"/>
+ <field name="GROUP_SENSE" since="19"/>
+ <field name="HANLYNN_TECHNOLOGIES" since="19"/>
+ <field name="HARMAN_INTERNATIONAL"/>
+ <field name="HEWLETT_PACKARD" since="19"/>
+ <field name="HITACHI"/>
+ <field name="HOSIDEN" since="19"/>
+ <field name="IBM"/>
+ <field name="INFINEON_TECHNOLOGIES"/>
+ <field name="INGENIEUR_SYSTEMGRUPPE_ZAHN" since="19"/>
+ <field name="INTEGRATED_SILICON_SOLUTION"/>
+ <field name="INTEGRATED_SYSTEM_SOLUTION"/>
+ <field name="INTEL"/>
+ <field name="INVENTEL"/>
+ <field name="IPEXTREME"/>
+ <field name="I_TECH_DYNAMIC_GLOBAL_DISTRIBUTION" since="19"/>
+ <field name="JAWBONE" since="19"/>
+ <field name="JIANGSU_TOPPOWER_AUTOMOTIVE_ELECTRONICS" since="19"/>
+ <field name="JOHNSON_CONTROLS" since="19"/>
+ <field name="J_AND_M"/>
+ <field name="KAWANTECH" since="19"/>
+ <field name="KC_TECHNOLOGY"/>
+ <field name="KENSINGTON_COMPUTER_PRODUCTS_GROUP" since="19"/>
+ <field name="LAIRD_TECHNOLOGIES" since="19"/>
+ <field name="LESSWIRE" since="19"/>
+ <field name="LG_ELECTRONICS" since="19"/>
+ <field name="LINAK" since="19"/>
+ <field name="LUCENT"/>
+ <field name="LUDUS_HELSINKI" since="19"/>
+ <field name="MACRONIX"/>
+ <field name="MAGNETI_MARELLI" since="19"/>
+ <field name="MANSELLA"/>
+ <field name="MARVELL"/>
+ <field name="MATSUSHITA_ELECTRIC"/>
+ <field name="MC10" since="19"/>
+ <field name="MEDIATEK"/>
+ <field name="MESO_INTERNATIONAL" since="19"/>
+ <field name="META_WATCH" since="19"/>
+ <field name="MEWTEL_TECHNOLOGY"/>
+ <field name="MICOMMAND" since="19"/>
+ <field name="MICROCHIP_TECHNOLOGY" since="19"/>
+ <field name="MICROSOFT"/>
+ <field name="MINDTREE" since="19"/>
+ <field name="MISFIT_WEARABLES" since="19"/>
+ <field name="MITEL_SEMICONDUCTOR"/>
+ <field name="MITSUBISHI_ELECTRIC"/>
+ <field name="MOBILIAN_CORPORATION"/>
+ <field name="MONSTER" since="19"/>
+ <field name="MOTOROLA"/>
+ <field name="MSTAR_SEMICONDUCTOR" since="19"/>
+ <field name="MUZIK" since="19"/>
+ <field name="NEC"/>
+ <field name="NEC_LIGHTING" since="19"/>
+ <field name="NEWLOGIC"/>
+ <field name="NIKE" since="19"/>
+ <field name="NINE_SOLUTIONS" since="19"/>
+ <field name="NOKIA_MOBILE_PHONES"/>
+ <field name="NORDIC_SEMICONDUCTOR"/>
+ <field name="NORWOOD_SYSTEMS"/>
+ <field name="ODM_TECHNOLOGY" since="19"/>
+ <field name="OMEGAWAVE" since="19"/>
+ <field name="ONSET_COMPUTER" since="19"/>
+ <field name="OPEN_INTERFACE"/>
+ <field name="OTL_DYNAMICS" since="19"/>
+ <field name="PANDA_OCEAN" since="19"/>
+ <field name="PARROT"/>
+ <field name="PARTHUS_TECHNOLOGIES"/>
+ <field name="PASSIF_SEMICONDUCTOR" since="19"/>
+ <field name="PETER_SYSTEMTECHNIK" since="19"/>
+ <field name="PHILIPS_SEMICONDUCTORS"/>
+ <field name="PLANTRONICS"/>
+ <field name="POLAR_ELECTRO" since="19"/>
+ <field name="POLAR_ELECTRO_EUROPE" since="19"/>
+ <field name="PROCTER_AND_GAMBLE" since="19"/>
+ <field name="QUALCOMM"/>
+ <field name="QUALCOMM_CONNECTED_EXPERIENCES" since="19"/>
+ <field name="QUALCOMM_INNOVATION_CENTER" since="19"/>
+ <field name="QUALCOMM_LABS" since="19"/>
+ <field name="QUALCOMM_TECHNOLOGIES" since="19"/>
+ <field name="QUINTIC" since="19"/>
+ <field name="QUUPPA" since="19"/>
+ <field name="RALINK_TECHNOLOGY"/>
+ <field name="RDA_MICROELECTRONICS" since="19"/>
+ <field name="REALTEK_SEMICONDUCTOR"/>
+ <field name="RED_M"/>
+ <field name="RENESAS_TECHNOLOGY"/>
+ <field name="RESEARCH_IN_MOTION"/>
+ <field name="RF_MICRO_DEVICES"/>
+ <field name="RIVIERAWAVES"/>
+ <field name="ROHDE_AND_SCHWARZ"/>
+ <field name="RTX_TELECOM"/>
+ <field name="SAMSUNG_ELECTRONICS" since="19"/>
+ <field name="SARIS_CYCLING_GROUP" since="19"/>
+ <field name="SEERS_TECHNOLOGY" since="19"/>
+ <field name="SEIKO_EPSON"/>
+ <field name="SELFLY" since="19"/>
+ <field name="SEMILINK" since="19"/>
+ <field name="SENNHEISER_COMMUNICATIONS" since="19"/>
+ <field name="SHANGHAI_SUPER_SMART_ELECTRONICS" since="19"/>
+ <field name="SHENZHEN_EXCELSECU_DATA_TECHNOLOGY" since="19"/>
+ <field name="SIGNIA_TECHNOLOGIES"/>
+ <field name="SILICON_WAVE"/>
+ <field name="SIRF_TECHNOLOGY"/>
+ <field name="SOCKET_MOBILE"/>
+ <field name="SONY_ERICSSON"/>
+ <field name="SOUND_ID" since="19"/>
+ <field name="SPORTS_TRACKING_TECHNOLOGIES" since="19"/>
+ <field name="SR_MEDIZINELEKTRONIK" since="19"/>
+ <field name="STACCATO_COMMUNICATIONS"/>
+ <field name="STALMART_TECHNOLOGY" since="19"/>
+ <field name="STARKEY_LABORATORIES" since="19"/>
+ <field name="STOLLMAN_E_PLUS_V" since="19"/>
+ <field name="STONESTREET_ONE"/>
+ <field name="ST_MICROELECTRONICS"/>
+ <field name="SUMMIT_DATA_COMMUNICATIONS" since="19"/>
+ <field name="SUUNTO" since="19"/>
+ <field name="SWIRL_NETWORKS" since="19"/>
+ <field name="SYMBOL_TECHNOLOGIES"/>
+ <field name="SYNOPSYS"/>
+ <field name="SYSTEMS_AND_CHIPS"/>
+ <field name="S_POWER_ELECTRONICS" since="19"/>
+ <field name="TAIXINGBANG_TECHNOLOGY" since="19"/>
+ <field name="TENOVIS"/>
+ <field name="TERAX"/>
+ <field name="TEXAS_INSTRUMENTS"/>
+ <field name="THINKOPTICS" since="19"/>
+ <field name="THREECOM"/>
+ <field name="THREE_DIJOY"/>
+ <field name="THREE_DSP"/>
+ <field name="TIMEKEEPING_SYSTEMS" since="19"/>
+ <field name="TIMEX_GROUP_USA" since="19"/>
+ <field name="TOPCORN_POSITIONING_SYSTEMS" since="19"/>
+ <field name="TOSHIBA"/>
+ <field name="TRANSILICA"/>
+ <field name="TRELAB" since="19"/>
+ <field name="TTPCOM"/>
+ <field name="TXTR" since="19"/>
+ <field name="TZERO_TECHNOLOGIES"/>
+ <field name="UNIVERSAL_ELECTRONICS" since="19"/>
+ <field name="VERTU" since="19"/>
+ <field name="VISTEON" since="19"/>
+ <field name="VIZIO"/>
+ <field name="VOYETRA_TURTLE_BEACH" since="19"/>
+ <field name="WAVEPLUS_TECHNOLOGY"/>
+ <field name="WICENTRIC"/>
+ <field name="WIDCOMM"/>
+ <field name="WUXI_VIMICRO" since="19"/>
+ <field name="ZEEVO"/>
+ <field name="ZER01_TV" since="19"/>
+ <field name="ZOMM" since="19"/>
+ <field name="ZSCAN_SOFTWARE" since="19"/>
+ </class>
+ <class name="android/bluetooth/BluetoothClass" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDeviceClass()I"/>
+ <method name="getMajorDeviceClass()I"/>
+ <method name="hasService(I)Z"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/bluetooth/BluetoothClass$Device" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="AUDIO_VIDEO_CAMCORDER"/>
+ <field name="AUDIO_VIDEO_CAR_AUDIO"/>
+ <field name="AUDIO_VIDEO_HANDSFREE"/>
+ <field name="AUDIO_VIDEO_HEADPHONES"/>
+ <field name="AUDIO_VIDEO_HIFI_AUDIO"/>
+ <field name="AUDIO_VIDEO_LOUDSPEAKER"/>
+ <field name="AUDIO_VIDEO_MICROPHONE"/>
+ <field name="AUDIO_VIDEO_PORTABLE_AUDIO"/>
+ <field name="AUDIO_VIDEO_SET_TOP_BOX"/>
+ <field name="AUDIO_VIDEO_UNCATEGORIZED"/>
+ <field name="AUDIO_VIDEO_VCR"/>
+ <field name="AUDIO_VIDEO_VIDEO_CAMERA"/>
+ <field name="AUDIO_VIDEO_VIDEO_CONFERENCING"/>
+ <field name="AUDIO_VIDEO_VIDEO_DISPLAY_AND_LOUDSPEAKER"/>
+ <field name="AUDIO_VIDEO_VIDEO_GAMING_TOY"/>
+ <field name="AUDIO_VIDEO_VIDEO_MONITOR"/>
+ <field name="AUDIO_VIDEO_WEARABLE_HEADSET"/>
+ <field name="COMPUTER_DESKTOP"/>
+ <field name="COMPUTER_HANDHELD_PC_PDA"/>
+ <field name="COMPUTER_LAPTOP"/>
+ <field name="COMPUTER_PALM_SIZE_PC_PDA"/>
+ <field name="COMPUTER_SERVER"/>
+ <field name="COMPUTER_UNCATEGORIZED"/>
+ <field name="COMPUTER_WEARABLE"/>
+ <field name="HEALTH_BLOOD_PRESSURE"/>
+ <field name="HEALTH_DATA_DISPLAY"/>
+ <field name="HEALTH_GLUCOSE"/>
+ <field name="HEALTH_PULSE_OXIMETER"/>
+ <field name="HEALTH_PULSE_RATE"/>
+ <field name="HEALTH_THERMOMETER"/>
+ <field name="HEALTH_UNCATEGORIZED"/>
+ <field name="HEALTH_WEIGHING"/>
+ <field name="PHONE_CELLULAR"/>
+ <field name="PHONE_CORDLESS"/>
+ <field name="PHONE_ISDN"/>
+ <field name="PHONE_MODEM_OR_GATEWAY"/>
+ <field name="PHONE_SMART"/>
+ <field name="PHONE_UNCATEGORIZED"/>
+ <field name="TOY_CONTROLLER"/>
+ <field name="TOY_DOLL_ACTION_FIGURE"/>
+ <field name="TOY_GAME"/>
+ <field name="TOY_ROBOT"/>
+ <field name="TOY_UNCATEGORIZED"/>
+ <field name="TOY_VEHICLE"/>
+ <field name="WEARABLE_GLASSES"/>
+ <field name="WEARABLE_HELMET"/>
+ <field name="WEARABLE_JACKET"/>
+ <field name="WEARABLE_PAGER"/>
+ <field name="WEARABLE_UNCATEGORIZED"/>
+ <field name="WEARABLE_WRIST_WATCH"/>
+ </class>
+ <class name="android/bluetooth/BluetoothClass$Device$Major" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="AUDIO_VIDEO"/>
+ <field name="COMPUTER"/>
+ <field name="HEALTH"/>
+ <field name="IMAGING"/>
+ <field name="MISC"/>
+ <field name="NETWORKING"/>
+ <field name="PERIPHERAL"/>
+ <field name="PHONE"/>
+ <field name="TOY"/>
+ <field name="UNCATEGORIZED"/>
+ <field name="WEARABLE"/>
+ </class>
+ <class name="android/bluetooth/BluetoothClass$Service" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="AUDIO"/>
+ <field name="CAPTURE"/>
+ <field name="INFORMATION"/>
+ <field name="LIMITED_DISCOVERABILITY"/>
+ <field name="NETWORKING"/>
+ <field name="OBJECT_TRANSFER"/>
+ <field name="POSITIONING"/>
+ <field name="RENDER"/>
+ <field name="TELEPHONY"/>
+ </class>
+ <class name="android/bluetooth/BluetoothDevice" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="connectGatt(Landroid/content/Context;ZLandroid/bluetooth/BluetoothGattCallback;)Landroid/bluetooth/BluetoothGatt;" since="18"/>
+ <method name="connectGatt(Landroid/content/Context;ZLandroid/bluetooth/BluetoothGattCallback;I)Landroid/bluetooth/BluetoothGatt;" since="23"/>
+ <method name="connectGatt(Landroid/content/Context;ZLandroid/bluetooth/BluetoothGattCallback;II)Landroid/bluetooth/BluetoothGatt;" since="26"/>
+ <method name="connectGatt(Landroid/content/Context;ZLandroid/bluetooth/BluetoothGattCallback;IILandroid/os/Handler;)Landroid/bluetooth/BluetoothGatt;" since="26"/>
+ <method name="createBond()Z" since="19"/>
+ <method name="createInsecureRfcommSocketToServiceRecord(Ljava/util/UUID;)Landroid/bluetooth/BluetoothSocket;" since="10"/>
+ <method name="createRfcommSocketToServiceRecord(Ljava/util/UUID;)Landroid/bluetooth/BluetoothSocket;"/>
+ <method name="fetchUuidsWithSdp()Z" since="15"/>
+ <method name="getAddress()Ljava/lang/String;"/>
+ <method name="getBluetoothClass()Landroid/bluetooth/BluetoothClass;"/>
+ <method name="getBondState()I"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getType()I" since="18"/>
+ <method name="getUuids()[Landroid/os/ParcelUuid;" since="15"/>
+ <method name="setPairingConfirmation(Z)Z" since="19"/>
+ <method name="setPin([B)Z" since="19"/>
+ <field name="ACTION_ACL_CONNECTED"/>
+ <field name="ACTION_ACL_DISCONNECTED"/>
+ <field name="ACTION_ACL_DISCONNECT_REQUESTED"/>
+ <field name="ACTION_BOND_STATE_CHANGED"/>
+ <field name="ACTION_CLASS_CHANGED"/>
+ <field name="ACTION_FOUND"/>
+ <field name="ACTION_NAME_CHANGED"/>
+ <field name="ACTION_PAIRING_REQUEST" since="19"/>
+ <field name="ACTION_UUID" since="15"/>
+ <field name="BOND_BONDED"/>
+ <field name="BOND_BONDING"/>
+ <field name="BOND_NONE"/>
+ <field name="CREATOR"/>
+ <field name="DEVICE_TYPE_CLASSIC" since="18"/>
+ <field name="DEVICE_TYPE_DUAL" since="18"/>
+ <field name="DEVICE_TYPE_LE" since="18"/>
+ <field name="DEVICE_TYPE_UNKNOWN" since="18"/>
+ <field name="ERROR"/>
+ <field name="EXTRA_BOND_STATE"/>
+ <field name="EXTRA_CLASS"/>
+ <field name="EXTRA_DEVICE"/>
+ <field name="EXTRA_NAME"/>
+ <field name="EXTRA_PAIRING_KEY" since="19"/>
+ <field name="EXTRA_PAIRING_VARIANT" since="19"/>
+ <field name="EXTRA_PREVIOUS_BOND_STATE"/>
+ <field name="EXTRA_RSSI"/>
+ <field name="EXTRA_UUID" since="15"/>
+ <field name="PAIRING_VARIANT_PASSKEY_CONFIRMATION" since="19"/>
+ <field name="PAIRING_VARIANT_PIN" since="19"/>
+ <field name="PHY_LE_1M" since="26"/>
+ <field name="PHY_LE_1M_MASK" since="26"/>
+ <field name="PHY_LE_2M" since="26"/>
+ <field name="PHY_LE_2M_MASK" since="26"/>
+ <field name="PHY_LE_CODED" since="26"/>
+ <field name="PHY_LE_CODED_MASK" since="26"/>
+ <field name="PHY_OPTION_NO_PREFERRED" since="26"/>
+ <field name="PHY_OPTION_S2" since="26"/>
+ <field name="PHY_OPTION_S8" since="26"/>
+ <field name="TRANSPORT_AUTO" since="23"/>
+ <field name="TRANSPORT_BREDR" since="23"/>
+ <field name="TRANSPORT_LE" since="23"/>
+ </class>
+ <class name="android/bluetooth/BluetoothGatt" since="18">
+ <extends name="java/lang/Object"/>
+ <implements name="android/bluetooth/BluetoothProfile"/>
+ <method name="&lt;init>()V"/>
+ <method name="abortReliableWrite()V" since="19"/>
+ <method name="abortReliableWrite(Landroid/bluetooth/BluetoothDevice;)V" deprecated="19"/>
+ <method name="beginReliableWrite()Z"/>
+ <method name="close()V"/>
+ <method name="connect()Z"/>
+ <method name="disconnect()V"/>
+ <method name="discoverServices()Z"/>
+ <method name="executeReliableWrite()Z"/>
+ <method name="getDevice()Landroid/bluetooth/BluetoothDevice;"/>
+ <method name="getService(Ljava/util/UUID;)Landroid/bluetooth/BluetoothGattService;"/>
+ <method name="getServices()Ljava/util/List;"/>
+ <method name="readCharacteristic(Landroid/bluetooth/BluetoothGattCharacteristic;)Z"/>
+ <method name="readDescriptor(Landroid/bluetooth/BluetoothGattDescriptor;)Z"/>
+ <method name="readPhy()V" since="26"/>
+ <method name="readRemoteRssi()Z"/>
+ <method name="requestConnectionPriority(I)Z" since="21"/>
+ <method name="requestMtu(I)Z" since="21"/>
+ <method name="setCharacteristicNotification(Landroid/bluetooth/BluetoothGattCharacteristic;Z)Z"/>
+ <method name="setPreferredPhy(III)V" since="26"/>
+ <method name="writeCharacteristic(Landroid/bluetooth/BluetoothGattCharacteristic;)Z"/>
+ <method name="writeDescriptor(Landroid/bluetooth/BluetoothGattDescriptor;)Z"/>
+ <field name="CONNECTION_PRIORITY_BALANCED" since="21"/>
+ <field name="CONNECTION_PRIORITY_HIGH" since="21"/>
+ <field name="CONNECTION_PRIORITY_LOW_POWER" since="21"/>
+ <field name="GATT_CONNECTION_CONGESTED" since="21"/>
+ <field name="GATT_FAILURE"/>
+ <field name="GATT_INSUFFICIENT_AUTHENTICATION"/>
+ <field name="GATT_INSUFFICIENT_ENCRYPTION"/>
+ <field name="GATT_INVALID_ATTRIBUTE_LENGTH"/>
+ <field name="GATT_INVALID_OFFSET"/>
+ <field name="GATT_READ_NOT_PERMITTED"/>
+ <field name="GATT_REQUEST_NOT_SUPPORTED"/>
+ <field name="GATT_SUCCESS"/>
+ <field name="GATT_WRITE_NOT_PERMITTED"/>
+ </class>
+ <class name="android/bluetooth/BluetoothGattCallback" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onCharacteristicChanged(Landroid/bluetooth/BluetoothGatt;Landroid/bluetooth/BluetoothGattCharacteristic;)V"/>
+ <method name="onCharacteristicRead(Landroid/bluetooth/BluetoothGatt;Landroid/bluetooth/BluetoothGattCharacteristic;I)V"/>
+ <method name="onCharacteristicWrite(Landroid/bluetooth/BluetoothGatt;Landroid/bluetooth/BluetoothGattCharacteristic;I)V"/>
+ <method name="onConnectionStateChange(Landroid/bluetooth/BluetoothGatt;II)V"/>
+ <method name="onDescriptorRead(Landroid/bluetooth/BluetoothGatt;Landroid/bluetooth/BluetoothGattDescriptor;I)V"/>
+ <method name="onDescriptorWrite(Landroid/bluetooth/BluetoothGatt;Landroid/bluetooth/BluetoothGattDescriptor;I)V"/>
+ <method name="onMtuChanged(Landroid/bluetooth/BluetoothGatt;II)V" since="21"/>
+ <method name="onPhyRead(Landroid/bluetooth/BluetoothGatt;III)V" since="26"/>
+ <method name="onPhyUpdate(Landroid/bluetooth/BluetoothGatt;III)V" since="26"/>
+ <method name="onReadRemoteRssi(Landroid/bluetooth/BluetoothGatt;II)V"/>
+ <method name="onReliableWriteCompleted(Landroid/bluetooth/BluetoothGatt;I)V"/>
+ <method name="onServicesDiscovered(Landroid/bluetooth/BluetoothGatt;I)V"/>
+ </class>
+ <class name="android/bluetooth/BluetoothGattCharacteristic" since="18">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable" since="24"/>
+ <method name="&lt;init>(Ljava/util/UUID;II)V"/>
+ <method name="addDescriptor(Landroid/bluetooth/BluetoothGattDescriptor;)Z"/>
+ <method name="getDescriptor(Ljava/util/UUID;)Landroid/bluetooth/BluetoothGattDescriptor;"/>
+ <method name="getDescriptors()Ljava/util/List;"/>
+ <method name="getFloatValue(II)Ljava/lang/Float;"/>
+ <method name="getInstanceId()I"/>
+ <method name="getIntValue(II)Ljava/lang/Integer;"/>
+ <method name="getPermissions()I"/>
+ <method name="getProperties()I"/>
+ <method name="getService()Landroid/bluetooth/BluetoothGattService;"/>
+ <method name="getStringValue(I)Ljava/lang/String;"/>
+ <method name="getUuid()Ljava/util/UUID;"/>
+ <method name="getValue()[B"/>
+ <method name="getWriteType()I"/>
+ <method name="setValue(III)Z"/>
+ <method name="setValue(IIII)Z"/>
+ <method name="setValue(Ljava/lang/String;)Z"/>
+ <method name="setValue([B)Z"/>
+ <method name="setWriteType(I)V"/>
+ <field name="CREATOR" since="24"/>
+ <field name="FORMAT_FLOAT"/>
+ <field name="FORMAT_SFLOAT"/>
+ <field name="FORMAT_SINT16"/>
+ <field name="FORMAT_SINT32"/>
+ <field name="FORMAT_SINT8"/>
+ <field name="FORMAT_UINT16"/>
+ <field name="FORMAT_UINT32"/>
+ <field name="FORMAT_UINT8"/>
+ <field name="PERMISSION_READ"/>
+ <field name="PERMISSION_READ_ENCRYPTED"/>
+ <field name="PERMISSION_READ_ENCRYPTED_MITM"/>
+ <field name="PERMISSION_WRITE"/>
+ <field name="PERMISSION_WRITE_ENCRYPTED"/>
+ <field name="PERMISSION_WRITE_ENCRYPTED_MITM"/>
+ <field name="PERMISSION_WRITE_SIGNED"/>
+ <field name="PERMISSION_WRITE_SIGNED_MITM"/>
+ <field name="PROPERTY_BROADCAST"/>
+ <field name="PROPERTY_EXTENDED_PROPS"/>
+ <field name="PROPERTY_INDICATE"/>
+ <field name="PROPERTY_NOTIFY"/>
+ <field name="PROPERTY_READ"/>
+ <field name="PROPERTY_SIGNED_WRITE"/>
+ <field name="PROPERTY_WRITE"/>
+ <field name="PROPERTY_WRITE_NO_RESPONSE"/>
+ <field name="WRITE_TYPE_DEFAULT"/>
+ <field name="WRITE_TYPE_NO_RESPONSE"/>
+ <field name="WRITE_TYPE_SIGNED"/>
+ <field name="mDescriptors"/>
+ </class>
+ <class name="android/bluetooth/BluetoothGattDescriptor" since="18">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable" since="24"/>
+ <method name="&lt;init>(Ljava/util/UUID;I)V"/>
+ <method name="getCharacteristic()Landroid/bluetooth/BluetoothGattCharacteristic;"/>
+ <method name="getPermissions()I"/>
+ <method name="getUuid()Ljava/util/UUID;"/>
+ <method name="getValue()[B"/>
+ <method name="setValue([B)Z"/>
+ <field name="CREATOR" since="24"/>
+ <field name="DISABLE_NOTIFICATION_VALUE"/>
+ <field name="ENABLE_INDICATION_VALUE"/>
+ <field name="ENABLE_NOTIFICATION_VALUE"/>
+ <field name="PERMISSION_READ"/>
+ <field name="PERMISSION_READ_ENCRYPTED"/>
+ <field name="PERMISSION_READ_ENCRYPTED_MITM"/>
+ <field name="PERMISSION_WRITE"/>
+ <field name="PERMISSION_WRITE_ENCRYPTED"/>
+ <field name="PERMISSION_WRITE_ENCRYPTED_MITM"/>
+ <field name="PERMISSION_WRITE_SIGNED"/>
+ <field name="PERMISSION_WRITE_SIGNED_MITM"/>
+ </class>
+ <class name="android/bluetooth/BluetoothGattServer" since="18">
+ <extends name="java/lang/Object"/>
+ <implements name="android/bluetooth/BluetoothProfile"/>
+ <method name="&lt;init>()V"/>
+ <method name="addService(Landroid/bluetooth/BluetoothGattService;)Z"/>
+ <method name="cancelConnection(Landroid/bluetooth/BluetoothDevice;)V"/>
+ <method name="clearServices()V"/>
+ <method name="close()V"/>
+ <method name="connect(Landroid/bluetooth/BluetoothDevice;Z)Z"/>
+ <method name="getService(Ljava/util/UUID;)Landroid/bluetooth/BluetoothGattService;"/>
+ <method name="getServices()Ljava/util/List;"/>
+ <method name="notifyCharacteristicChanged(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothGattCharacteristic;Z)Z"/>
+ <method name="readPhy(Landroid/bluetooth/BluetoothDevice;)V" since="26"/>
+ <method name="removeService(Landroid/bluetooth/BluetoothGattService;)Z"/>
+ <method name="sendResponse(Landroid/bluetooth/BluetoothDevice;III[B)Z"/>
+ <method name="setPreferredPhy(Landroid/bluetooth/BluetoothDevice;III)V" since="26"/>
+ </class>
+ <class name="android/bluetooth/BluetoothGattServerCallback" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onCharacteristicReadRequest(Landroid/bluetooth/BluetoothDevice;IILandroid/bluetooth/BluetoothGattCharacteristic;)V"/>
+ <method name="onCharacteristicWriteRequest(Landroid/bluetooth/BluetoothDevice;ILandroid/bluetooth/BluetoothGattCharacteristic;ZZI[B)V"/>
+ <method name="onConnectionStateChange(Landroid/bluetooth/BluetoothDevice;II)V"/>
+ <method name="onDescriptorReadRequest(Landroid/bluetooth/BluetoothDevice;IILandroid/bluetooth/BluetoothGattDescriptor;)V"/>
+ <method name="onDescriptorWriteRequest(Landroid/bluetooth/BluetoothDevice;ILandroid/bluetooth/BluetoothGattDescriptor;ZZI[B)V"/>
+ <method name="onExecuteWrite(Landroid/bluetooth/BluetoothDevice;IZ)V"/>
+ <method name="onMtuChanged(Landroid/bluetooth/BluetoothDevice;I)V" since="22"/>
+ <method name="onNotificationSent(Landroid/bluetooth/BluetoothDevice;I)V" since="21"/>
+ <method name="onPhyRead(Landroid/bluetooth/BluetoothDevice;III)V" since="26"/>
+ <method name="onPhyUpdate(Landroid/bluetooth/BluetoothDevice;III)V" since="26"/>
+ <method name="onServiceAdded(ILandroid/bluetooth/BluetoothGattService;)V"/>
+ </class>
+ <class name="android/bluetooth/BluetoothGattService" since="18">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable" since="24"/>
+ <method name="&lt;init>(Ljava/util/UUID;I)V"/>
+ <method name="addCharacteristic(Landroid/bluetooth/BluetoothGattCharacteristic;)Z"/>
+ <method name="addService(Landroid/bluetooth/BluetoothGattService;)Z"/>
+ <method name="getCharacteristic(Ljava/util/UUID;)Landroid/bluetooth/BluetoothGattCharacteristic;"/>
+ <method name="getCharacteristics()Ljava/util/List;"/>
+ <method name="getIncludedServices()Ljava/util/List;"/>
+ <method name="getInstanceId()I"/>
+ <method name="getType()I"/>
+ <method name="getUuid()Ljava/util/UUID;"/>
+ <field name="CREATOR" since="24"/>
+ <field name="SERVICE_TYPE_PRIMARY"/>
+ <field name="SERVICE_TYPE_SECONDARY"/>
+ <field name="mCharacteristics"/>
+ <field name="mIncludedServices"/>
+ </class>
+ <class name="android/bluetooth/BluetoothHeadset" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="android/bluetooth/BluetoothProfile"/>
+ <method name="&lt;init>()V"/>
+ <method name="isAudioConnected(Landroid/bluetooth/BluetoothDevice;)Z"/>
+ <method name="sendVendorSpecificResultCode(Landroid/bluetooth/BluetoothDevice;Ljava/lang/String;Ljava/lang/String;)Z" since="19"/>
+ <method name="startVoiceRecognition(Landroid/bluetooth/BluetoothDevice;)Z"/>
+ <method name="stopVoiceRecognition(Landroid/bluetooth/BluetoothDevice;)Z"/>
+ <field name="ACTION_AUDIO_STATE_CHANGED"/>
+ <field name="ACTION_CONNECTION_STATE_CHANGED"/>
+ <field name="ACTION_VENDOR_SPECIFIC_HEADSET_EVENT"/>
+ <field name="AT_CMD_TYPE_ACTION"/>
+ <field name="AT_CMD_TYPE_BASIC"/>
+ <field name="AT_CMD_TYPE_READ"/>
+ <field name="AT_CMD_TYPE_SET"/>
+ <field name="AT_CMD_TYPE_TEST"/>
+ <field name="EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_ARGS"/>
+ <field name="EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD"/>
+ <field name="EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD_TYPE"/>
+ <field name="STATE_AUDIO_CONNECTED"/>
+ <field name="STATE_AUDIO_CONNECTING"/>
+ <field name="STATE_AUDIO_DISCONNECTED"/>
+ <field name="VENDOR_RESULT_CODE_COMMAND_ANDROID" since="19"/>
+ <field name="VENDOR_SPECIFIC_HEADSET_EVENT_COMPANY_ID_CATEGORY"/>
+ </class>
+ <class name="android/bluetooth/BluetoothHealth" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/bluetooth/BluetoothProfile"/>
+ <method name="&lt;init>()V"/>
+ <method name="connectChannelToSource(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHealthAppConfiguration;)Z"/>
+ <method name="disconnectChannel(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHealthAppConfiguration;I)Z"/>
+ <method name="getMainChannelFd(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHealthAppConfiguration;)Landroid/os/ParcelFileDescriptor;"/>
+ <method name="registerSinkAppConfiguration(Ljava/lang/String;ILandroid/bluetooth/BluetoothHealthCallback;)Z"/>
+ <method name="unregisterAppConfiguration(Landroid/bluetooth/BluetoothHealthAppConfiguration;)Z"/>
+ <field name="APP_CONFIG_REGISTRATION_FAILURE"/>
+ <field name="APP_CONFIG_REGISTRATION_SUCCESS"/>
+ <field name="APP_CONFIG_UNREGISTRATION_FAILURE"/>
+ <field name="APP_CONFIG_UNREGISTRATION_SUCCESS"/>
+ <field name="CHANNEL_TYPE_RELIABLE"/>
+ <field name="CHANNEL_TYPE_STREAMING"/>
+ <field name="SINK_ROLE"/>
+ <field name="SOURCE_ROLE"/>
+ <field name="STATE_CHANNEL_CONNECTED"/>
+ <field name="STATE_CHANNEL_CONNECTING"/>
+ <field name="STATE_CHANNEL_DISCONNECTED"/>
+ <field name="STATE_CHANNEL_DISCONNECTING"/>
+ </class>
+ <class name="android/bluetooth/BluetoothHealthAppConfiguration" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDataType()I"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getRole()I"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/bluetooth/BluetoothHealthCallback" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onHealthAppConfigurationStatusChange(Landroid/bluetooth/BluetoothHealthAppConfiguration;I)V"/>
+ <method name="onHealthChannelStateChange(Landroid/bluetooth/BluetoothHealthAppConfiguration;Landroid/bluetooth/BluetoothDevice;IILandroid/os/ParcelFileDescriptor;I)V"/>
+ </class>
+ <class name="android/bluetooth/BluetoothManager" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAdapter()Landroid/bluetooth/BluetoothAdapter;"/>
+ <method name="getConnectedDevices(I)Ljava/util/List;"/>
+ <method name="getConnectionState(Landroid/bluetooth/BluetoothDevice;I)I"/>
+ <method name="getDevicesMatchingConnectionStates(I[I)Ljava/util/List;"/>
+ <method name="openGattServer(Landroid/content/Context;Landroid/bluetooth/BluetoothGattServerCallback;)Landroid/bluetooth/BluetoothGattServer;"/>
+ </class>
+ <class name="android/bluetooth/BluetoothProfile" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="getConnectedDevices()Ljava/util/List;"/>
+ <method name="getConnectionState(Landroid/bluetooth/BluetoothDevice;)I"/>
+ <method name="getDevicesMatchingConnectionStates([I)Ljava/util/List;"/>
+ <field name="A2DP"/>
+ <field name="EXTRA_PREVIOUS_STATE"/>
+ <field name="EXTRA_STATE"/>
+ <field name="GATT" since="18"/>
+ <field name="GATT_SERVER" since="18"/>
+ <field name="HEADSET"/>
+ <field name="HEALTH" since="14"/>
+ <field name="SAP" since="23"/>
+ <field name="STATE_CONNECTED"/>
+ <field name="STATE_CONNECTING"/>
+ <field name="STATE_DISCONNECTED"/>
+ <field name="STATE_DISCONNECTING"/>
+ </class>
+ <class name="android/bluetooth/BluetoothProfile$ServiceListener" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="onServiceConnected(ILandroid/bluetooth/BluetoothProfile;)V"/>
+ <method name="onServiceDisconnected(I)V"/>
+ </class>
+ <class name="android/bluetooth/BluetoothServerSocket" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable"/>
+ <method name="&lt;init>()V"/>
+ <method name="accept()Landroid/bluetooth/BluetoothSocket;"/>
+ <method name="accept(I)Landroid/bluetooth/BluetoothSocket;"/>
+ </class>
+ <class name="android/bluetooth/BluetoothSocket" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable"/>
+ <method name="&lt;init>()V"/>
+ <method name="connect()V"/>
+ <method name="getConnectionType()I" since="23"/>
+ <method name="getInputStream()Ljava/io/InputStream;"/>
+ <method name="getMaxReceivePacketSize()I" since="23"/>
+ <method name="getMaxTransmitPacketSize()I" since="23"/>
+ <method name="getOutputStream()Ljava/io/OutputStream;"/>
+ <method name="getRemoteDevice()Landroid/bluetooth/BluetoothDevice;"/>
+ <method name="isConnected()Z" since="14"/>
+ <field name="TYPE_L2CAP" since="23"/>
+ <field name="TYPE_RFCOMM" since="23"/>
+ <field name="TYPE_SCO" since="23"/>
+ </class>
+ <class name="android/bluetooth/le/AdvertiseCallback" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onStartFailure(I)V"/>
+ <method name="onStartSuccess(Landroid/bluetooth/le/AdvertiseSettings;)V"/>
+ <field name="ADVERTISE_FAILED_ALREADY_STARTED"/>
+ <field name="ADVERTISE_FAILED_DATA_TOO_LARGE"/>
+ <field name="ADVERTISE_FAILED_FEATURE_UNSUPPORTED"/>
+ <field name="ADVERTISE_FAILED_INTERNAL_ERROR"/>
+ <field name="ADVERTISE_FAILED_TOO_MANY_ADVERTISERS"/>
+ </class>
+ <class name="android/bluetooth/le/AdvertiseData" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getIncludeDeviceName()Z"/>
+ <method name="getIncludeTxPowerLevel()Z"/>
+ <method name="getManufacturerSpecificData()Landroid/util/SparseArray;"/>
+ <method name="getServiceData()Ljava/util/Map;"/>
+ <method name="getServiceUuids()Ljava/util/List;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/bluetooth/le/AdvertiseData$Builder" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addManufacturerData(I[B)Landroid/bluetooth/le/AdvertiseData$Builder;"/>
+ <method name="addServiceData(Landroid/os/ParcelUuid;[B)Landroid/bluetooth/le/AdvertiseData$Builder;"/>
+ <method name="addServiceUuid(Landroid/os/ParcelUuid;)Landroid/bluetooth/le/AdvertiseData$Builder;"/>
+ <method name="build()Landroid/bluetooth/le/AdvertiseData;"/>
+ <method name="setIncludeDeviceName(Z)Landroid/bluetooth/le/AdvertiseData$Builder;"/>
+ <method name="setIncludeTxPowerLevel(Z)Landroid/bluetooth/le/AdvertiseData$Builder;"/>
+ </class>
+ <class name="android/bluetooth/le/AdvertiseSettings" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getMode()I"/>
+ <method name="getTimeout()I"/>
+ <method name="getTxPowerLevel()I"/>
+ <method name="isConnectable()Z"/>
+ <field name="ADVERTISE_MODE_BALANCED"/>
+ <field name="ADVERTISE_MODE_LOW_LATENCY"/>
+ <field name="ADVERTISE_MODE_LOW_POWER"/>
+ <field name="ADVERTISE_TX_POWER_HIGH"/>
+ <field name="ADVERTISE_TX_POWER_LOW"/>
+ <field name="ADVERTISE_TX_POWER_MEDIUM"/>
+ <field name="ADVERTISE_TX_POWER_ULTRA_LOW"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/bluetooth/le/AdvertiseSettings$Builder" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="build()Landroid/bluetooth/le/AdvertiseSettings;"/>
+ <method name="setAdvertiseMode(I)Landroid/bluetooth/le/AdvertiseSettings$Builder;"/>
+ <method name="setConnectable(Z)Landroid/bluetooth/le/AdvertiseSettings$Builder;"/>
+ <method name="setTimeout(I)Landroid/bluetooth/le/AdvertiseSettings$Builder;"/>
+ <method name="setTxPowerLevel(I)Landroid/bluetooth/le/AdvertiseSettings$Builder;"/>
+ </class>
+ <class name="android/bluetooth/le/AdvertisingSet" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="enableAdvertising(ZII)V"/>
+ <method name="setAdvertisingData(Landroid/bluetooth/le/AdvertiseData;)V"/>
+ <method name="setAdvertisingParameters(Landroid/bluetooth/le/AdvertisingSetParameters;)V"/>
+ <method name="setPeriodicAdvertisingData(Landroid/bluetooth/le/AdvertiseData;)V"/>
+ <method name="setPeriodicAdvertisingEnabled(Z)V"/>
+ <method name="setPeriodicAdvertisingParameters(Landroid/bluetooth/le/PeriodicAdvertisingParameters;)V"/>
+ <method name="setScanResponseData(Landroid/bluetooth/le/AdvertiseData;)V"/>
+ </class>
+ <class name="android/bluetooth/le/AdvertisingSetCallback" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onAdvertisingDataSet(Landroid/bluetooth/le/AdvertisingSet;I)V"/>
+ <method name="onAdvertisingEnabled(Landroid/bluetooth/le/AdvertisingSet;ZI)V"/>
+ <method name="onAdvertisingParametersUpdated(Landroid/bluetooth/le/AdvertisingSet;II)V"/>
+ <method name="onAdvertisingSetStarted(Landroid/bluetooth/le/AdvertisingSet;II)V"/>
+ <method name="onAdvertisingSetStopped(Landroid/bluetooth/le/AdvertisingSet;)V"/>
+ <method name="onPeriodicAdvertisingDataSet(Landroid/bluetooth/le/AdvertisingSet;I)V"/>
+ <method name="onPeriodicAdvertisingEnabled(Landroid/bluetooth/le/AdvertisingSet;ZI)V"/>
+ <method name="onPeriodicAdvertisingParametersUpdated(Landroid/bluetooth/le/AdvertisingSet;I)V"/>
+ <method name="onScanResponseDataSet(Landroid/bluetooth/le/AdvertisingSet;I)V"/>
+ <field name="ADVERTISE_FAILED_ALREADY_STARTED"/>
+ <field name="ADVERTISE_FAILED_DATA_TOO_LARGE"/>
+ <field name="ADVERTISE_FAILED_FEATURE_UNSUPPORTED"/>
+ <field name="ADVERTISE_FAILED_INTERNAL_ERROR"/>
+ <field name="ADVERTISE_FAILED_TOO_MANY_ADVERTISERS"/>
+ <field name="ADVERTISE_SUCCESS"/>
+ </class>
+ <class name="android/bluetooth/le/AdvertisingSetParameters" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getInterval()I"/>
+ <method name="getPrimaryPhy()I"/>
+ <method name="getSecondaryPhy()I"/>
+ <method name="getTxPowerLevel()I"/>
+ <method name="includeTxPower()Z"/>
+ <method name="isAnonymous()Z"/>
+ <method name="isConnectable()Z"/>
+ <method name="isLegacy()Z"/>
+ <method name="isScannable()Z"/>
+ <field name="CREATOR"/>
+ <field name="INTERVAL_HIGH"/>
+ <field name="INTERVAL_LOW"/>
+ <field name="INTERVAL_MAX"/>
+ <field name="INTERVAL_MEDIUM"/>
+ <field name="INTERVAL_MIN"/>
+ <field name="TX_POWER_HIGH"/>
+ <field name="TX_POWER_LOW"/>
+ <field name="TX_POWER_MAX"/>
+ <field name="TX_POWER_MEDIUM"/>
+ <field name="TX_POWER_MIN"/>
+ <field name="TX_POWER_ULTRA_LOW"/>
+ </class>
+ <class name="android/bluetooth/le/AdvertisingSetParameters$Builder" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="build()Landroid/bluetooth/le/AdvertisingSetParameters;"/>
+ <method name="setAnonymous(Z)Landroid/bluetooth/le/AdvertisingSetParameters$Builder;"/>
+ <method name="setConnectable(Z)Landroid/bluetooth/le/AdvertisingSetParameters$Builder;"/>
+ <method name="setIncludeTxPower(Z)Landroid/bluetooth/le/AdvertisingSetParameters$Builder;"/>
+ <method name="setInterval(I)Landroid/bluetooth/le/AdvertisingSetParameters$Builder;"/>
+ <method name="setLegacyMode(Z)Landroid/bluetooth/le/AdvertisingSetParameters$Builder;"/>
+ <method name="setPrimaryPhy(I)Landroid/bluetooth/le/AdvertisingSetParameters$Builder;"/>
+ <method name="setScannable(Z)Landroid/bluetooth/le/AdvertisingSetParameters$Builder;"/>
+ <method name="setSecondaryPhy(I)Landroid/bluetooth/le/AdvertisingSetParameters$Builder;"/>
+ <method name="setTxPowerLevel(I)Landroid/bluetooth/le/AdvertisingSetParameters$Builder;"/>
+ </class>
+ <class name="android/bluetooth/le/BluetoothLeAdvertiser" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="startAdvertising(Landroid/bluetooth/le/AdvertiseSettings;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertiseCallback;)V"/>
+ <method name="startAdvertising(Landroid/bluetooth/le/AdvertiseSettings;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertiseCallback;)V"/>
+ <method name="startAdvertisingSet(Landroid/bluetooth/le/AdvertisingSetParameters;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/PeriodicAdvertisingParameters;Landroid/bluetooth/le/AdvertiseData;IILandroid/bluetooth/le/AdvertisingSetCallback;)V" since="26"/>
+ <method name="startAdvertisingSet(Landroid/bluetooth/le/AdvertisingSetParameters;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/PeriodicAdvertisingParameters;Landroid/bluetooth/le/AdvertiseData;IILandroid/bluetooth/le/AdvertisingSetCallback;Landroid/os/Handler;)V" since="26"/>
+ <method name="startAdvertisingSet(Landroid/bluetooth/le/AdvertisingSetParameters;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/PeriodicAdvertisingParameters;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertisingSetCallback;)V" since="26"/>
+ <method name="startAdvertisingSet(Landroid/bluetooth/le/AdvertisingSetParameters;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/PeriodicAdvertisingParameters;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertisingSetCallback;Landroid/os/Handler;)V" since="26"/>
+ <method name="stopAdvertising(Landroid/bluetooth/le/AdvertiseCallback;)V"/>
+ <method name="stopAdvertisingSet(Landroid/bluetooth/le/AdvertisingSetCallback;)V" since="26"/>
+ </class>
+ <class name="android/bluetooth/le/BluetoothLeScanner" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="flushPendingScanResults(Landroid/bluetooth/le/ScanCallback;)V"/>
+ <method name="startScan(Landroid/bluetooth/le/ScanCallback;)V"/>
+ <method name="startScan(Ljava/util/List;Landroid/bluetooth/le/ScanSettings;Landroid/app/PendingIntent;)I" since="26"/>
+ <method name="startScan(Ljava/util/List;Landroid/bluetooth/le/ScanSettings;Landroid/bluetooth/le/ScanCallback;)V"/>
+ <method name="stopScan(Landroid/app/PendingIntent;)V" since="26"/>
+ <method name="stopScan(Landroid/bluetooth/le/ScanCallback;)V"/>
+ <field name="EXTRA_CALLBACK_TYPE" since="26"/>
+ <field name="EXTRA_ERROR_CODE" since="26"/>
+ <field name="EXTRA_LIST_SCAN_RESULT" since="26"/>
+ </class>
+ <class name="android/bluetooth/le/PeriodicAdvertisingParameters" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getIncludeTxPower()Z"/>
+ <method name="getInterval()I"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/bluetooth/le/PeriodicAdvertisingParameters$Builder" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="build()Landroid/bluetooth/le/PeriodicAdvertisingParameters;"/>
+ <method name="setIncludeTxPower(Z)Landroid/bluetooth/le/PeriodicAdvertisingParameters$Builder;"/>
+ <method name="setInterval(I)Landroid/bluetooth/le/PeriodicAdvertisingParameters$Builder;"/>
+ </class>
+ <class name="android/bluetooth/le/ScanCallback" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onBatchScanResults(Ljava/util/List;)V"/>
+ <method name="onScanFailed(I)V"/>
+ <method name="onScanResult(ILandroid/bluetooth/le/ScanResult;)V"/>
+ <field name="SCAN_FAILED_ALREADY_STARTED"/>
+ <field name="SCAN_FAILED_APPLICATION_REGISTRATION_FAILED"/>
+ <field name="SCAN_FAILED_FEATURE_UNSUPPORTED"/>
+ <field name="SCAN_FAILED_INTERNAL_ERROR"/>
+ </class>
+ <class name="android/bluetooth/le/ScanFilter" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDeviceAddress()Ljava/lang/String;"/>
+ <method name="getDeviceName()Ljava/lang/String;"/>
+ <method name="getManufacturerData()[B"/>
+ <method name="getManufacturerDataMask()[B"/>
+ <method name="getManufacturerId()I"/>
+ <method name="getServiceData()[B"/>
+ <method name="getServiceDataMask()[B"/>
+ <method name="getServiceDataUuid()Landroid/os/ParcelUuid;"/>
+ <method name="getServiceUuid()Landroid/os/ParcelUuid;"/>
+ <method name="getServiceUuidMask()Landroid/os/ParcelUuid;"/>
+ <method name="matches(Landroid/bluetooth/le/ScanResult;)Z"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/bluetooth/le/ScanFilter$Builder" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="build()Landroid/bluetooth/le/ScanFilter;"/>
+ <method name="setDeviceAddress(Ljava/lang/String;)Landroid/bluetooth/le/ScanFilter$Builder;"/>
+ <method name="setDeviceName(Ljava/lang/String;)Landroid/bluetooth/le/ScanFilter$Builder;"/>
+ <method name="setManufacturerData(I[B)Landroid/bluetooth/le/ScanFilter$Builder;"/>
+ <method name="setManufacturerData(I[B[B)Landroid/bluetooth/le/ScanFilter$Builder;"/>
+ <method name="setServiceData(Landroid/os/ParcelUuid;[B)Landroid/bluetooth/le/ScanFilter$Builder;"/>
+ <method name="setServiceData(Landroid/os/ParcelUuid;[B[B)Landroid/bluetooth/le/ScanFilter$Builder;"/>
+ <method name="setServiceUuid(Landroid/os/ParcelUuid;)Landroid/bluetooth/le/ScanFilter$Builder;"/>
+ <method name="setServiceUuid(Landroid/os/ParcelUuid;Landroid/os/ParcelUuid;)Landroid/bluetooth/le/ScanFilter$Builder;"/>
+ </class>
+ <class name="android/bluetooth/le/ScanRecord" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAdvertiseFlags()I"/>
+ <method name="getBytes()[B"/>
+ <method name="getDeviceName()Ljava/lang/String;"/>
+ <method name="getManufacturerSpecificData()Landroid/util/SparseArray;"/>
+ <method name="getManufacturerSpecificData(I)[B"/>
+ <method name="getServiceData()Ljava/util/Map;"/>
+ <method name="getServiceData(Landroid/os/ParcelUuid;)[B"/>
+ <method name="getServiceUuids()Ljava/util/List;"/>
+ <method name="getTxPowerLevel()I"/>
+ </class>
+ <class name="android/bluetooth/le/ScanResult" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/bluetooth/BluetoothDevice;IIIIIIILandroid/bluetooth/le/ScanRecord;J)V" since="26"/>
+ <method name="&lt;init>(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/le/ScanRecord;IJ)V" deprecated="26"/>
+ <method name="getAdvertisingSid()I" since="26"/>
+ <method name="getDataStatus()I" since="26"/>
+ <method name="getDevice()Landroid/bluetooth/BluetoothDevice;"/>
+ <method name="getPeriodicAdvertisingInterval()I" since="26"/>
+ <method name="getPrimaryPhy()I" since="26"/>
+ <method name="getRssi()I"/>
+ <method name="getScanRecord()Landroid/bluetooth/le/ScanRecord;"/>
+ <method name="getSecondaryPhy()I" since="26"/>
+ <method name="getTimestampNanos()J"/>
+ <method name="getTxPower()I" since="26"/>
+ <method name="isConnectable()Z" since="26"/>
+ <method name="isLegacy()Z" since="26"/>
+ <field name="CREATOR"/>
+ <field name="DATA_COMPLETE" since="26"/>
+ <field name="DATA_TRUNCATED" since="26"/>
+ <field name="PERIODIC_INTERVAL_NOT_PRESENT" since="26"/>
+ <field name="PHY_UNUSED" since="26"/>
+ <field name="SID_NOT_PRESENT" since="26"/>
+ <field name="TX_POWER_NOT_PRESENT" since="26"/>
+ </class>
+ <class name="android/bluetooth/le/ScanSettings" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCallbackType()I"/>
+ <method name="getLegacy()Z" since="26"/>
+ <method name="getPhy()I" since="26"/>
+ <method name="getReportDelayMillis()J"/>
+ <method name="getScanMode()I"/>
+ <method name="getScanResultType()I"/>
+ <field name="CALLBACK_TYPE_ALL_MATCHES"/>
+ <field name="CALLBACK_TYPE_FIRST_MATCH" since="23"/>
+ <field name="CALLBACK_TYPE_MATCH_LOST" since="23"/>
+ <field name="CREATOR"/>
+ <field name="MATCH_MODE_AGGRESSIVE" since="23"/>
+ <field name="MATCH_MODE_STICKY" since="23"/>
+ <field name="MATCH_NUM_FEW_ADVERTISEMENT" since="23"/>
+ <field name="MATCH_NUM_MAX_ADVERTISEMENT" since="23"/>
+ <field name="MATCH_NUM_ONE_ADVERTISEMENT" since="23"/>
+ <field name="PHY_LE_ALL_SUPPORTED" since="26"/>
+ <field name="SCAN_MODE_BALANCED"/>
+ <field name="SCAN_MODE_LOW_LATENCY"/>
+ <field name="SCAN_MODE_LOW_POWER"/>
+ <field name="SCAN_MODE_OPPORTUNISTIC" since="23"/>
+ </class>
+ <class name="android/bluetooth/le/ScanSettings$Builder" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="build()Landroid/bluetooth/le/ScanSettings;"/>
+ <method name="setCallbackType(I)Landroid/bluetooth/le/ScanSettings$Builder;" since="23"/>
+ <method name="setLegacy(Z)Landroid/bluetooth/le/ScanSettings$Builder;" since="26"/>
+ <method name="setMatchMode(I)Landroid/bluetooth/le/ScanSettings$Builder;" since="23"/>
+ <method name="setNumOfMatches(I)Landroid/bluetooth/le/ScanSettings$Builder;" since="23"/>
+ <method name="setPhy(I)Landroid/bluetooth/le/ScanSettings$Builder;" since="26"/>
+ <method name="setReportDelay(J)Landroid/bluetooth/le/ScanSettings$Builder;"/>
+ <method name="setScanMode(I)Landroid/bluetooth/le/ScanSettings$Builder;"/>
+ </class>
+ <class name="android/companion/AssociationRequest" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/companion/AssociationRequest$Builder" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addDeviceFilter(Landroid/companion/DeviceFilter;)Landroid/companion/AssociationRequest$Builder;"/>
+ <method name="build()Landroid/companion/AssociationRequest;"/>
+ <method name="setSingleDevice(Z)Landroid/companion/AssociationRequest$Builder;"/>
+ </class>
+ <class name="android/companion/BluetoothDeviceFilter" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/companion/DeviceFilter"/>
+ <method name="&lt;init>()V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/companion/BluetoothDeviceFilter$Builder" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addServiceUuid(Landroid/os/ParcelUuid;Landroid/os/ParcelUuid;)Landroid/companion/BluetoothDeviceFilter$Builder;"/>
+ <method name="build()Landroid/companion/BluetoothDeviceFilter;"/>
+ <method name="setAddress(Ljava/lang/String;)Landroid/companion/BluetoothDeviceFilter$Builder;"/>
+ <method name="setNamePattern(Ljava/util/regex/Pattern;)Landroid/companion/BluetoothDeviceFilter$Builder;"/>
+ </class>
+ <class name="android/companion/BluetoothLeDeviceFilter" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/companion/DeviceFilter"/>
+ <method name="&lt;init>()V"/>
+ <method name="getRenamePrefixLengthLimit()I"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/companion/BluetoothLeDeviceFilter$Builder" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="build()Landroid/companion/BluetoothLeDeviceFilter;"/>
+ <method name="setNamePattern(Ljava/util/regex/Pattern;)Landroid/companion/BluetoothLeDeviceFilter$Builder;"/>
+ <method name="setRawDataFilter([B[B)Landroid/companion/BluetoothLeDeviceFilter$Builder;"/>
+ <method name="setRenameFromBytes(Ljava/lang/String;Ljava/lang/String;IILjava/nio/ByteOrder;)Landroid/companion/BluetoothLeDeviceFilter$Builder;"/>
+ <method name="setRenameFromName(Ljava/lang/String;Ljava/lang/String;II)Landroid/companion/BluetoothLeDeviceFilter$Builder;"/>
+ <method name="setScanFilter(Landroid/bluetooth/le/ScanFilter;)Landroid/companion/BluetoothLeDeviceFilter$Builder;"/>
+ </class>
+ <class name="android/companion/CompanionDeviceManager" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="associate(Landroid/companion/AssociationRequest;Landroid/companion/CompanionDeviceManager$Callback;Landroid/os/Handler;)V"/>
+ <method name="disassociate(Ljava/lang/String;)V"/>
+ <method name="getAssociations()Ljava/util/List;"/>
+ <method name="hasNotificationAccess(Landroid/content/ComponentName;)Z"/>
+ <method name="requestNotificationAccess(Landroid/content/ComponentName;)V"/>
+ <field name="EXTRA_DEVICE"/>
+ </class>
+ <class name="android/companion/CompanionDeviceManager$Callback" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onDeviceFound(Landroid/content/IntentSender;)V"/>
+ <method name="onFailure(Ljava/lang/CharSequence;)V"/>
+ </class>
+ <class name="android/companion/DeviceFilter" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ </class>
+ <class name="android/companion/WifiDeviceFilter" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/companion/DeviceFilter"/>
+ <method name="&lt;init>()V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/companion/WifiDeviceFilter$Builder" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="build()Landroid/companion/WifiDeviceFilter;"/>
+ <method name="setNamePattern(Ljava/util/regex/Pattern;)Landroid/companion/WifiDeviceFilter$Builder;"/>
+ </class>
+ <class name="android/content/AbstractThreadedSyncAdapter" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;Z)V"/>
+ <method name="&lt;init>(Landroid/content/Context;ZZ)V" since="11"/>
+ <method name="getContext()Landroid/content/Context;"/>
+ <method name="getSyncAdapterBinder()Landroid/os/IBinder;"/>
+ <method name="onPerformSync(Landroid/accounts/Account;Landroid/os/Bundle;Ljava/lang/String;Landroid/content/ContentProviderClient;Landroid/content/SyncResult;)V"/>
+ <method name="onSecurityException(Landroid/accounts/Account;Landroid/os/Bundle;Ljava/lang/String;Landroid/content/SyncResult;)V" since="23"/>
+ <method name="onSyncCanceled()V" since="8"/>
+ <method name="onSyncCanceled(Ljava/lang/Thread;)V" since="11"/>
+ <field name="LOG_SYNC_DETAILS" deprecated="16"/>
+ </class>
+ <class name="android/content/ActivityNotFoundException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/content/AsyncQueryHandler" since="1">
+ <extends name="android/os/Handler"/>
+ <method name="&lt;init>(Landroid/content/ContentResolver;)V"/>
+ <method name="cancelOperation(I)V"/>
+ <method name="createHandler(Landroid/os/Looper;)Landroid/os/Handler;"/>
+ <method name="onDeleteComplete(ILjava/lang/Object;I)V"/>
+ <method name="onInsertComplete(ILjava/lang/Object;Landroid/net/Uri;)V"/>
+ <method name="onQueryComplete(ILjava/lang/Object;Landroid/database/Cursor;)V"/>
+ <method name="onUpdateComplete(ILjava/lang/Object;I)V"/>
+ <method name="startDelete(ILjava/lang/Object;Landroid/net/Uri;Ljava/lang/String;[Ljava/lang/String;)V"/>
+ <method name="startInsert(ILjava/lang/Object;Landroid/net/Uri;Landroid/content/ContentValues;)V"/>
+ <method name="startQuery(ILjava/lang/Object;Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="startUpdate(ILjava/lang/Object;Landroid/net/Uri;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/content/AsyncQueryHandler$WorkerArgs" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="cookie"/>
+ <field name="handler"/>
+ <field name="orderBy"/>
+ <field name="projection"/>
+ <field name="result"/>
+ <field name="selection"/>
+ <field name="selectionArgs"/>
+ <field name="uri"/>
+ <field name="values"/>
+ </class>
+ <class name="android/content/AsyncQueryHandler$WorkerHandler" since="1">
+ <extends name="android/os/Handler"/>
+ <method name="&lt;init>(Landroid/content/AsyncQueryHandler;Landroid/os/Looper;)V"/>
+ </class>
+ <class name="android/content/AsyncTaskLoader" since="11">
+ <extends name="android/content/Loader"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="cancelLoad()Z" removed="16"/>
+ <method name="cancelLoadInBackground()V" since="16"/>
+ <method name="isLoadInBackgroundCanceled()Z" since="16"/>
+ <method name="loadInBackground()Ljava/lang/Object;"/>
+ <method name="onCanceled(Ljava/lang/Object;)V"/>
+ <method name="onLoadInBackground()Ljava/lang/Object;"/>
+ <method name="setUpdateThrottle(J)V"/>
+ </class>
+ <class name="android/content/BroadcastReceiver" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="abortBroadcast()V"/>
+ <method name="clearAbortBroadcast()V"/>
+ <method name="getAbortBroadcast()Z"/>
+ <method name="getDebugUnregister()Z"/>
+ <method name="getResultCode()I"/>
+ <method name="getResultData()Ljava/lang/String;"/>
+ <method name="getResultExtras(Z)Landroid/os/Bundle;"/>
+ <method name="goAsync()Landroid/content/BroadcastReceiver$PendingResult;" since="11"/>
+ <method name="isInitialStickyBroadcast()Z" since="5"/>
+ <method name="isOrderedBroadcast()Z" since="5"/>
+ <method name="onReceive(Landroid/content/Context;Landroid/content/Intent;)V"/>
+ <method name="peekService(Landroid/content/Context;Landroid/content/Intent;)Landroid/os/IBinder;" since="3"/>
+ <method name="setDebugUnregister(Z)V"/>
+ <method name="setOrderedHint(Z)V"/>
+ <method name="setResult(ILjava/lang/String;Landroid/os/Bundle;)V"/>
+ <method name="setResultCode(I)V"/>
+ <method name="setResultData(Ljava/lang/String;)V"/>
+ <method name="setResultExtras(Landroid/os/Bundle;)V"/>
+ </class>
+ <class name="android/content/BroadcastReceiver$PendingResult" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="abortBroadcast()V"/>
+ <method name="clearAbortBroadcast()V"/>
+ <method name="finish()V"/>
+ <method name="getAbortBroadcast()Z"/>
+ <method name="getResultCode()I"/>
+ <method name="getResultData()Ljava/lang/String;"/>
+ <method name="getResultExtras(Z)Landroid/os/Bundle;"/>
+ <method name="setResult(ILjava/lang/String;Landroid/os/Bundle;)V"/>
+ <method name="setResultCode(I)V"/>
+ <method name="setResultData(Ljava/lang/String;)V"/>
+ <method name="setResultExtras(Landroid/os/Bundle;)V"/>
+ </class>
+ <class name="android/content/ClipData" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/content/ClipData;)V" since="16"/>
+ <method name="&lt;init>(Landroid/content/ClipDescription;Landroid/content/ClipData$Item;)V"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;[Ljava/lang/String;Landroid/content/ClipData$Item;)V"/>
+ <method name="addItem(Landroid/content/ClipData$Item;)V"/>
+ <method name="addItem(Landroid/content/ContentResolver;Landroid/content/ClipData$Item;)V" since="26"/>
+ <method name="getDescription()Landroid/content/ClipDescription;"/>
+ <method name="getItemAt(I)Landroid/content/ClipData$Item;"/>
+ <method name="getItemCount()I"/>
+ <method name="newHtmlText(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/String;)Landroid/content/ClipData;" since="16"/>
+ <method name="newIntent(Ljava/lang/CharSequence;Landroid/content/Intent;)Landroid/content/ClipData;"/>
+ <method name="newPlainText(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Landroid/content/ClipData;"/>
+ <method name="newRawUri(Ljava/lang/CharSequence;Landroid/net/Uri;)Landroid/content/ClipData;"/>
+ <method name="newUri(Landroid/content/ContentResolver;Ljava/lang/CharSequence;Landroid/net/Uri;)Landroid/content/ClipData;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/content/ClipData$Item" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Intent;)V"/>
+ <method name="&lt;init>(Landroid/net/Uri;)V"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;)V"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;Landroid/content/Intent;Landroid/net/Uri;)V"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;Ljava/lang/String;)V" since="16"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;Ljava/lang/String;Landroid/content/Intent;Landroid/net/Uri;)V" since="16"/>
+ <method name="coerceToHtmlText(Landroid/content/Context;)Ljava/lang/String;" since="16"/>
+ <method name="coerceToStyledText(Landroid/content/Context;)Ljava/lang/CharSequence;" since="16"/>
+ <method name="coerceToText(Landroid/content/Context;)Ljava/lang/CharSequence;"/>
+ <method name="getHtmlText()Ljava/lang/String;" since="16"/>
+ <method name="getIntent()Landroid/content/Intent;"/>
+ <method name="getText()Ljava/lang/CharSequence;"/>
+ <method name="getUri()Landroid/net/Uri;"/>
+ </class>
+ <class name="android/content/ClipDescription" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/content/ClipDescription;)V"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;[Ljava/lang/String;)V"/>
+ <method name="compareMimeTypes(Ljava/lang/String;Ljava/lang/String;)Z"/>
+ <method name="filterMimeTypes(Ljava/lang/String;)[Ljava/lang/String;"/>
+ <method name="getExtras()Landroid/os/PersistableBundle;" since="24"/>
+ <method name="getLabel()Ljava/lang/CharSequence;"/>
+ <method name="getMimeType(I)Ljava/lang/String;"/>
+ <method name="getMimeTypeCount()I"/>
+ <method name="getTimestamp()J" since="26"/>
+ <method name="hasMimeType(Ljava/lang/String;)Z"/>
+ <method name="setExtras(Landroid/os/PersistableBundle;)V" since="24"/>
+ <field name="CREATOR"/>
+ <field name="MIMETYPE_TEXT_HTML" since="16"/>
+ <field name="MIMETYPE_TEXT_INTENT"/>
+ <field name="MIMETYPE_TEXT_PLAIN"/>
+ <field name="MIMETYPE_TEXT_URILIST"/>
+ </class>
+ <class name="android/content/ClipboardManager" since="11">
+ <extends name="android/text/ClipboardManager"/>
+ <method name="&lt;init>()V"/>
+ <method name="addPrimaryClipChangedListener(Landroid/content/ClipboardManager$OnPrimaryClipChangedListener;)V"/>
+ <method name="getPrimaryClip()Landroid/content/ClipData;"/>
+ <method name="getPrimaryClipDescription()Landroid/content/ClipDescription;"/>
+ <method name="hasPrimaryClip()Z"/>
+ <method name="removePrimaryClipChangedListener(Landroid/content/ClipboardManager$OnPrimaryClipChangedListener;)V"/>
+ <method name="setPrimaryClip(Landroid/content/ClipData;)V"/>
+ </class>
+ <class name="android/content/ClipboardManager$OnPrimaryClipChangedListener" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="onPrimaryClipChanged()V"/>
+ </class>
+ <class name="android/content/ComponentCallbacks" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onConfigurationChanged(Landroid/content/res/Configuration;)V"/>
+ <method name="onLowMemory()V"/>
+ </class>
+ <class name="android/content/ComponentCallbacks2" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/content/ComponentCallbacks"/>
+ <method name="onTrimMemory(I)V"/>
+ <field name="TRIM_MEMORY_BACKGROUND"/>
+ <field name="TRIM_MEMORY_COMPLETE"/>
+ <field name="TRIM_MEMORY_MODERATE"/>
+ <field name="TRIM_MEMORY_RUNNING_CRITICAL" since="16"/>
+ <field name="TRIM_MEMORY_RUNNING_LOW" since="16"/>
+ <field name="TRIM_MEMORY_RUNNING_MODERATE" since="16"/>
+ <field name="TRIM_MEMORY_UI_HIDDEN"/>
+ </class>
+ <class name="android/content/ComponentName" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <implements name="java/lang/Cloneable" since="8"/>
+ <implements name="java/lang/Comparable" since="4"/>
+ <method name="&lt;init>(Landroid/content/Context;Ljava/lang/Class;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="clone()Landroid/content/ComponentName;" since="8"/>
+ <method name="compareTo(Landroid/content/ComponentName;)I" since="4"/>
+ <method name="createRelative(Landroid/content/Context;Ljava/lang/String;)Landroid/content/ComponentName;" since="23"/>
+ <method name="createRelative(Ljava/lang/String;Ljava/lang/String;)Landroid/content/ComponentName;" since="23"/>
+ <method name="flattenToShortString()Ljava/lang/String;"/>
+ <method name="flattenToString()Ljava/lang/String;"/>
+ <method name="getClassName()Ljava/lang/String;"/>
+ <method name="getPackageName()Ljava/lang/String;"/>
+ <method name="getShortClassName()Ljava/lang/String;"/>
+ <method name="readFromParcel(Landroid/os/Parcel;)Landroid/content/ComponentName;"/>
+ <method name="toShortString()Ljava/lang/String;"/>
+ <method name="unflattenFromString(Ljava/lang/String;)Landroid/content/ComponentName;"/>
+ <method name="writeToParcel(Landroid/content/ComponentName;Landroid/os/Parcel;)V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/content/ContentProvider" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/content/ComponentCallbacks" removed="14"/>
+ <implements name="android/content/ComponentCallbacks2" since="14"/>
+ <method name="&lt;init>()V"/>
+ <method name="applyBatch(Ljava/util/ArrayList;)[Landroid/content/ContentProviderResult;" since="5"/>
+ <method name="attachInfo(Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V"/>
+ <method name="bulkInsert(Landroid/net/Uri;[Landroid/content/ContentValues;)I"/>
+ <method name="call(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;" since="11"/>
+ <method name="canonicalize(Landroid/net/Uri;)Landroid/net/Uri;" since="19"/>
+ <method name="delete(Landroid/net/Uri;Ljava/lang/String;[Ljava/lang/String;)I"/>
+ <method name="dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V" since="18"/>
+ <method name="getCallingPackage()Ljava/lang/String;" since="19"/>
+ <method name="getContext()Landroid/content/Context;"/>
+ <method name="getPathPermissions()[Landroid/content/pm/PathPermission;" since="4"/>
+ <method name="getReadPermission()Ljava/lang/String;"/>
+ <method name="getStreamTypes(Landroid/net/Uri;Ljava/lang/String;)[Ljava/lang/String;" since="11"/>
+ <method name="getType(Landroid/net/Uri;)Ljava/lang/String;"/>
+ <method name="getWritePermission()Ljava/lang/String;"/>
+ <method name="insert(Landroid/net/Uri;Landroid/content/ContentValues;)Landroid/net/Uri;"/>
+ <method name="isTemporary()Z"/>
+ <method name="onCreate()Z"/>
+ <method name="openAssetFile(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/res/AssetFileDescriptor;" since="3"/>
+ <method name="openAssetFile(Landroid/net/Uri;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;" since="19"/>
+ <method name="openFile(Landroid/net/Uri;Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;"/>
+ <method name="openFile(Landroid/net/Uri;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/os/ParcelFileDescriptor;" since="19"/>
+ <method name="openFileHelper(Landroid/net/Uri;Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;"/>
+ <method name="openPipeHelper(Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;Ljava/lang/Object;Landroid/content/ContentProvider$PipeDataWriter;)Landroid/os/ParcelFileDescriptor;" since="11"/>
+ <method name="openTypedAssetFile(Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;)Landroid/content/res/AssetFileDescriptor;" since="11"/>
+ <method name="openTypedAssetFile(Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;" since="19"/>
+ <method name="query(Landroid/net/Uri;[Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Landroid/database/Cursor;" since="26"/>
+ <method name="query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;"/>
+ <method name="query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;" since="16"/>
+ <method name="refresh(Landroid/net/Uri;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Z" since="26"/>
+ <method name="setPathPermissions([Landroid/content/pm/PathPermission;)V" since="4"/>
+ <method name="setReadPermission(Ljava/lang/String;)V"/>
+ <method name="setWritePermission(Ljava/lang/String;)V"/>
+ <method name="shutdown()V" since="11"/>
+ <method name="uncanonicalize(Landroid/net/Uri;)Landroid/net/Uri;" since="19"/>
+ <method name="update(Landroid/net/Uri;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;)I"/>
+ </class>
+ <class name="android/content/ContentProvider$PipeDataWriter" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="writeDataToPipe(Landroid/os/ParcelFileDescriptor;Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;Ljava/lang/Object;)V"/>
+ </class>
+ <class name="android/content/ContentProviderClient" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable" since="24"/>
+ <method name="&lt;init>()V"/>
+ <method name="applyBatch(Ljava/util/ArrayList;)[Landroid/content/ContentProviderResult;"/>
+ <method name="bulkInsert(Landroid/net/Uri;[Landroid/content/ContentValues;)I"/>
+ <method name="call(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;" since="17"/>
+ <method name="canonicalize(Landroid/net/Uri;)Landroid/net/Uri;" since="19"/>
+ <method name="delete(Landroid/net/Uri;Ljava/lang/String;[Ljava/lang/String;)I"/>
+ <method name="getLocalContentProvider()Landroid/content/ContentProvider;"/>
+ <method name="getStreamTypes(Landroid/net/Uri;Ljava/lang/String;)[Ljava/lang/String;" since="11"/>
+ <method name="getType(Landroid/net/Uri;)Ljava/lang/String;"/>
+ <method name="insert(Landroid/net/Uri;Landroid/content/ContentValues;)Landroid/net/Uri;"/>
+ <method name="openAssetFile(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/res/AssetFileDescriptor;"/>
+ <method name="openAssetFile(Landroid/net/Uri;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;" since="19"/>
+ <method name="openFile(Landroid/net/Uri;Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;"/>
+ <method name="openFile(Landroid/net/Uri;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/os/ParcelFileDescriptor;" since="19"/>
+ <method name="openTypedAssetFileDescriptor(Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;)Landroid/content/res/AssetFileDescriptor;" since="11"/>
+ <method name="openTypedAssetFileDescriptor(Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;" since="19"/>
+ <method name="query(Landroid/net/Uri;[Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Landroid/database/Cursor;" since="26"/>
+ <method name="query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;"/>
+ <method name="query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;" since="16"/>
+ <method name="refresh(Landroid/net/Uri;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Z" since="26"/>
+ <method name="release()Z" deprecated="24"/>
+ <method name="uncanonicalize(Landroid/net/Uri;)Landroid/net/Uri;" since="19"/>
+ <method name="update(Landroid/net/Uri;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;)I"/>
+ </class>
+ <class name="android/content/ContentProviderOperation" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="apply(Landroid/content/ContentProvider;[Landroid/content/ContentProviderResult;I)Landroid/content/ContentProviderResult;"/>
+ <method name="getUri()Landroid/net/Uri;"/>
+ <method name="isAssertQuery()Z" since="23"/>
+ <method name="isDelete()Z" since="23"/>
+ <method name="isInsert()Z" since="23"/>
+ <method name="isReadOperation()Z"/>
+ <method name="isUpdate()Z" since="23"/>
+ <method name="isWriteOperation()Z"/>
+ <method name="isYieldAllowed()Z"/>
+ <method name="newAssertQuery(Landroid/net/Uri;)Landroid/content/ContentProviderOperation$Builder;"/>
+ <method name="newDelete(Landroid/net/Uri;)Landroid/content/ContentProviderOperation$Builder;"/>
+ <method name="newInsert(Landroid/net/Uri;)Landroid/content/ContentProviderOperation$Builder;"/>
+ <method name="newUpdate(Landroid/net/Uri;)Landroid/content/ContentProviderOperation$Builder;"/>
+ <method name="resolveSelectionArgsBackReferences([Landroid/content/ContentProviderResult;I)[Ljava/lang/String;"/>
+ <method name="resolveValueBackReferences([Landroid/content/ContentProviderResult;I)Landroid/content/ContentValues;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/content/ContentProviderOperation$Builder" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="build()Landroid/content/ContentProviderOperation;"/>
+ <method name="withExpectedCount(I)Landroid/content/ContentProviderOperation$Builder;"/>
+ <method name="withSelection(Ljava/lang/String;[Ljava/lang/String;)Landroid/content/ContentProviderOperation$Builder;"/>
+ <method name="withSelectionBackReference(II)Landroid/content/ContentProviderOperation$Builder;"/>
+ <method name="withValue(Ljava/lang/String;Ljava/lang/Object;)Landroid/content/ContentProviderOperation$Builder;"/>
+ <method name="withValueBackReference(Ljava/lang/String;I)Landroid/content/ContentProviderOperation$Builder;"/>
+ <method name="withValueBackReferences(Landroid/content/ContentValues;)Landroid/content/ContentProviderOperation$Builder;"/>
+ <method name="withValues(Landroid/content/ContentValues;)Landroid/content/ContentProviderOperation$Builder;"/>
+ <method name="withYieldAllowed(Z)Landroid/content/ContentProviderOperation$Builder;"/>
+ </class>
+ <class name="android/content/ContentProviderResult" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Landroid/net/Uri;)V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <field name="CREATOR"/>
+ <field name="count"/>
+ <field name="uri"/>
+ </class>
+ <class name="android/content/ContentQueryMap" since="1">
+ <extends name="java/util/Observable"/>
+ <method name="&lt;init>(Landroid/database/Cursor;Ljava/lang/String;ZLandroid/os/Handler;)V"/>
+ <method name="close()V"/>
+ <method name="getRows()Ljava/util/Map;"/>
+ <method name="getValues(Ljava/lang/String;)Landroid/content/ContentValues;"/>
+ <method name="requery()V"/>
+ <method name="setKeepUpdated(Z)V"/>
+ </class>
+ <class name="android/content/ContentResolver" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="acquireContentProviderClient(Landroid/net/Uri;)Landroid/content/ContentProviderClient;" since="5"/>
+ <method name="acquireContentProviderClient(Ljava/lang/String;)Landroid/content/ContentProviderClient;" since="5"/>
+ <method name="acquireUnstableContentProviderClient(Landroid/net/Uri;)Landroid/content/ContentProviderClient;" since="16"/>
+ <method name="acquireUnstableContentProviderClient(Ljava/lang/String;)Landroid/content/ContentProviderClient;" since="16"/>
+ <method name="addPeriodicSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;J)V" since="8"/>
+ <method name="addStatusChangeListener(ILandroid/content/SyncStatusObserver;)Ljava/lang/Object;" since="5"/>
+ <method name="applyBatch(Ljava/lang/String;Ljava/util/ArrayList;)[Landroid/content/ContentProviderResult;" since="5"/>
+ <method name="bulkInsert(Landroid/net/Uri;[Landroid/content/ContentValues;)I"/>
+ <method name="call(Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;" since="11"/>
+ <method name="cancelSync(Landroid/accounts/Account;Ljava/lang/String;)V" since="5"/>
+ <method name="cancelSync(Landroid/content/SyncRequest;)V" since="21"/>
+ <method name="cancelSync(Landroid/net/Uri;)V" deprecated="16"/>
+ <method name="canonicalize(Landroid/net/Uri;)Landroid/net/Uri;" since="19"/>
+ <method name="delete(Landroid/net/Uri;Ljava/lang/String;[Ljava/lang/String;)I"/>
+ <method name="getCurrentSync()Landroid/content/SyncInfo;" since="8" deprecated="16"/>
+ <method name="getCurrentSyncs()Ljava/util/List;" since="11"/>
+ <method name="getIsSyncable(Landroid/accounts/Account;Ljava/lang/String;)I" since="5"/>
+ <method name="getMasterSyncAutomatically()Z" since="5"/>
+ <method name="getOutgoingPersistedUriPermissions()Ljava/util/List;" since="19"/>
+ <method name="getPeriodicSyncs(Landroid/accounts/Account;Ljava/lang/String;)Ljava/util/List;" since="8"/>
+ <method name="getPersistedUriPermissions()Ljava/util/List;" since="19"/>
+ <method name="getStreamTypes(Landroid/net/Uri;Ljava/lang/String;)[Ljava/lang/String;" since="11"/>
+ <method name="getSyncAdapterTypes()[Landroid/content/SyncAdapterType;" since="5"/>
+ <method name="getSyncAutomatically(Landroid/accounts/Account;Ljava/lang/String;)Z" since="5"/>
+ <method name="getType(Landroid/net/Uri;)Ljava/lang/String;"/>
+ <method name="insert(Landroid/net/Uri;Landroid/content/ContentValues;)Landroid/net/Uri;"/>
+ <method name="isSyncActive(Landroid/accounts/Account;Ljava/lang/String;)Z" since="5"/>
+ <method name="isSyncPending(Landroid/accounts/Account;Ljava/lang/String;)Z" since="5"/>
+ <method name="notifyChange(Landroid/net/Uri;Landroid/database/ContentObserver;)V"/>
+ <method name="notifyChange(Landroid/net/Uri;Landroid/database/ContentObserver;I)V" since="24"/>
+ <method name="notifyChange(Landroid/net/Uri;Landroid/database/ContentObserver;Z)V"/>
+ <method name="openAssetFileDescriptor(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/res/AssetFileDescriptor;" since="3"/>
+ <method name="openAssetFileDescriptor(Landroid/net/Uri;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;" since="19"/>
+ <method name="openFileDescriptor(Landroid/net/Uri;Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;"/>
+ <method name="openFileDescriptor(Landroid/net/Uri;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/os/ParcelFileDescriptor;" since="19"/>
+ <method name="openInputStream(Landroid/net/Uri;)Ljava/io/InputStream;"/>
+ <method name="openOutputStream(Landroid/net/Uri;)Ljava/io/OutputStream;"/>
+ <method name="openOutputStream(Landroid/net/Uri;Ljava/lang/String;)Ljava/io/OutputStream;" since="3"/>
+ <method name="openTypedAssetFileDescriptor(Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;)Landroid/content/res/AssetFileDescriptor;" since="11"/>
+ <method name="openTypedAssetFileDescriptor(Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;" since="19"/>
+ <method name="query(Landroid/net/Uri;[Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Landroid/database/Cursor;" since="26"/>
+ <method name="query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;"/>
+ <method name="query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;" since="16"/>
+ <method name="refresh(Landroid/net/Uri;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Z" since="26"/>
+ <method name="registerContentObserver(Landroid/net/Uri;ZLandroid/database/ContentObserver;)V"/>
+ <method name="releasePersistableUriPermission(Landroid/net/Uri;I)V" since="19"/>
+ <method name="removePeriodicSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)V" since="8"/>
+ <method name="removeStatusChangeListener(Ljava/lang/Object;)V" since="5"/>
+ <method name="requestSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)V" since="5"/>
+ <method name="requestSync(Landroid/content/SyncRequest;)V" since="19"/>
+ <method name="setIsSyncable(Landroid/accounts/Account;Ljava/lang/String;I)V" since="5"/>
+ <method name="setMasterSyncAutomatically(Z)V" since="5"/>
+ <method name="setSyncAutomatically(Landroid/accounts/Account;Ljava/lang/String;Z)V" since="5"/>
+ <method name="startSync(Landroid/net/Uri;Landroid/os/Bundle;)V" deprecated="16"/>
+ <method name="takePersistableUriPermission(Landroid/net/Uri;I)V" since="19"/>
+ <method name="uncanonicalize(Landroid/net/Uri;)Landroid/net/Uri;" since="19"/>
+ <method name="unregisterContentObserver(Landroid/database/ContentObserver;)V"/>
+ <method name="update(Landroid/net/Uri;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;)I"/>
+ <method name="validateSyncExtrasBundle(Landroid/os/Bundle;)V"/>
+ <field name="ANY_CURSOR_ITEM_TYPE" since="21"/>
+ <field name="CURSOR_DIR_BASE_TYPE"/>
+ <field name="CURSOR_ITEM_BASE_TYPE"/>
+ <field name="EXTRA_HONORED_ARGS" since="26"/>
+ <field name="EXTRA_REFRESH_SUPPORTED" since="26"/>
+ <field name="EXTRA_SIZE" since="21"/>
+ <field name="EXTRA_TOTAL_COUNT" since="26"/>
+ <field name="NOTIFY_SKIP_NOTIFY_FOR_DESCENDANTS" since="24"/>
+ <field name="NOTIFY_SYNC_TO_NETWORK" since="24"/>
+ <field name="QUERY_ARG_LIMIT" since="26"/>
+ <field name="QUERY_ARG_OFFSET" since="26"/>
+ <field name="QUERY_ARG_SORT_COLLATION" since="26"/>
+ <field name="QUERY_ARG_SORT_COLUMNS" since="26"/>
+ <field name="QUERY_ARG_SORT_DIRECTION" since="26"/>
+ <field name="QUERY_ARG_SQL_SELECTION" since="26"/>
+ <field name="QUERY_ARG_SQL_SELECTION_ARGS" since="26"/>
+ <field name="QUERY_ARG_SQL_SORT_ORDER" since="26"/>
+ <field name="QUERY_SORT_DIRECTION_ASCENDING" since="26"/>
+ <field name="QUERY_SORT_DIRECTION_DESCENDING" since="26"/>
+ <field name="SCHEME_ANDROID_RESOURCE"/>
+ <field name="SCHEME_CONTENT"/>
+ <field name="SCHEME_FILE"/>
+ <field name="SYNC_EXTRAS_ACCOUNT" deprecated="16"/>
+ <field name="SYNC_EXTRAS_DISCARD_LOCAL_DELETIONS"/>
+ <field name="SYNC_EXTRAS_DO_NOT_RETRY" since="8"/>
+ <field name="SYNC_EXTRAS_EXPEDITED"/>
+ <field name="SYNC_EXTRAS_FORCE" deprecated="16"/>
+ <field name="SYNC_EXTRAS_IGNORE_BACKOFF" since="8"/>
+ <field name="SYNC_EXTRAS_IGNORE_SETTINGS" since="8"/>
+ <field name="SYNC_EXTRAS_INITIALIZE" since="5"/>
+ <field name="SYNC_EXTRAS_MANUAL" since="5"/>
+ <field name="SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS"/>
+ <field name="SYNC_EXTRAS_REQUIRE_CHARGING" since="24"/>
+ <field name="SYNC_EXTRAS_UPLOAD"/>
+ <field name="SYNC_OBSERVER_TYPE_ACTIVE" since="8"/>
+ <field name="SYNC_OBSERVER_TYPE_PENDING" since="8"/>
+ <field name="SYNC_OBSERVER_TYPE_SETTINGS" since="8"/>
+ </class>
+ <class name="android/content/ContentUris" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="appendId(Landroid/net/Uri$Builder;J)Landroid/net/Uri$Builder;"/>
+ <method name="parseId(Landroid/net/Uri;)J"/>
+ <method name="withAppendedId(Landroid/net/Uri;J)Landroid/net/Uri;"/>
+ </class>
+ <class name="android/content/ContentValues" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Landroid/content/ContentValues;)V"/>
+ <method name="clear()V"/>
+ <method name="containsKey(Ljava/lang/String;)Z"/>
+ <method name="get(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="getAsBoolean(Ljava/lang/String;)Ljava/lang/Boolean;"/>
+ <method name="getAsByte(Ljava/lang/String;)Ljava/lang/Byte;"/>
+ <method name="getAsByteArray(Ljava/lang/String;)[B"/>
+ <method name="getAsDouble(Ljava/lang/String;)Ljava/lang/Double;"/>
+ <method name="getAsFloat(Ljava/lang/String;)Ljava/lang/Float;"/>
+ <method name="getAsInteger(Ljava/lang/String;)Ljava/lang/Integer;"/>
+ <method name="getAsLong(Ljava/lang/String;)Ljava/lang/Long;"/>
+ <method name="getAsShort(Ljava/lang/String;)Ljava/lang/Short;"/>
+ <method name="getAsString(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="keySet()Ljava/util/Set;" since="11"/>
+ <method name="put(Ljava/lang/String;Ljava/lang/Boolean;)V"/>
+ <method name="put(Ljava/lang/String;Ljava/lang/Byte;)V"/>
+ <method name="put(Ljava/lang/String;Ljava/lang/Double;)V"/>
+ <method name="put(Ljava/lang/String;Ljava/lang/Float;)V"/>
+ <method name="put(Ljava/lang/String;Ljava/lang/Integer;)V"/>
+ <method name="put(Ljava/lang/String;Ljava/lang/Long;)V"/>
+ <method name="put(Ljava/lang/String;Ljava/lang/Short;)V"/>
+ <method name="put(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="put(Ljava/lang/String;[B)V"/>
+ <method name="putAll(Landroid/content/ContentValues;)V"/>
+ <method name="putNull(Ljava/lang/String;)V"/>
+ <method name="remove(Ljava/lang/String;)V"/>
+ <method name="size()I"/>
+ <method name="valueSet()Ljava/util/Set;"/>
+ <field name="CREATOR"/>
+ <field name="TAG"/>
+ </class>
+ <class name="android/content/Context" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="bindService(Landroid/content/Intent;Landroid/content/ServiceConnection;I)Z"/>
+ <method name="checkCallingOrSelfPermission(Ljava/lang/String;)I"/>
+ <method name="checkCallingOrSelfUriPermission(Landroid/net/Uri;I)I"/>
+ <method name="checkCallingPermission(Ljava/lang/String;)I"/>
+ <method name="checkCallingUriPermission(Landroid/net/Uri;I)I"/>
+ <method name="checkPermission(Ljava/lang/String;II)I"/>
+ <method name="checkSelfPermission(Ljava/lang/String;)I" since="23"/>
+ <method name="checkUriPermission(Landroid/net/Uri;III)I"/>
+ <method name="checkUriPermission(Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;III)I"/>
+ <method name="clearWallpaper()V" deprecated="16"/>
+ <method name="createConfigurationContext(Landroid/content/res/Configuration;)Landroid/content/Context;" since="17"/>
+ <method name="createContextForSplit(Ljava/lang/String;)Landroid/content/Context;" since="26"/>
+ <method name="createDeviceProtectedStorageContext()Landroid/content/Context;" since="24"/>
+ <method name="createDisplayContext(Landroid/view/Display;)Landroid/content/Context;" since="17"/>
+ <method name="createPackageContext(Ljava/lang/String;I)Landroid/content/Context;"/>
+ <method name="databaseList()[Ljava/lang/String;"/>
+ <method name="deleteDatabase(Ljava/lang/String;)Z"/>
+ <method name="deleteFile(Ljava/lang/String;)Z"/>
+ <method name="deleteSharedPreferences(Ljava/lang/String;)Z" since="24"/>
+ <method name="enforceCallingOrSelfPermission(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="enforceCallingOrSelfUriPermission(Landroid/net/Uri;ILjava/lang/String;)V"/>
+ <method name="enforceCallingPermission(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="enforceCallingUriPermission(Landroid/net/Uri;ILjava/lang/String;)V"/>
+ <method name="enforcePermission(Ljava/lang/String;IILjava/lang/String;)V"/>
+ <method name="enforceUriPermission(Landroid/net/Uri;IIILjava/lang/String;)V"/>
+ <method name="enforceUriPermission(Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;IIILjava/lang/String;)V"/>
+ <method name="fileList()[Ljava/lang/String;"/>
+ <method name="getApplicationContext()Landroid/content/Context;"/>
+ <method name="getApplicationInfo()Landroid/content/pm/ApplicationInfo;" since="4"/>
+ <method name="getAssets()Landroid/content/res/AssetManager;"/>
+ <method name="getCacheDir()Ljava/io/File;"/>
+ <method name="getClassLoader()Ljava/lang/ClassLoader;"/>
+ <method name="getCodeCacheDir()Ljava/io/File;" since="21"/>
+ <method name="getColor(I)I" since="23"/>
+ <method name="getColorStateList(I)Landroid/content/res/ColorStateList;" since="23"/>
+ <method name="getContentResolver()Landroid/content/ContentResolver;"/>
+ <method name="getDataDir()Ljava/io/File;" since="24"/>
+ <method name="getDatabasePath(Ljava/lang/String;)Ljava/io/File;"/>
+ <method name="getDir(Ljava/lang/String;I)Ljava/io/File;"/>
+ <method name="getDrawable(I)Landroid/graphics/drawable/Drawable;" since="21"/>
+ <method name="getExternalCacheDir()Ljava/io/File;" since="8"/>
+ <method name="getExternalCacheDirs()[Ljava/io/File;" since="19"/>
+ <method name="getExternalFilesDir(Ljava/lang/String;)Ljava/io/File;" since="8"/>
+ <method name="getExternalFilesDirs(Ljava/lang/String;)[Ljava/io/File;" since="19"/>
+ <method name="getExternalMediaDirs()[Ljava/io/File;" since="21"/>
+ <method name="getFileStreamPath(Ljava/lang/String;)Ljava/io/File;"/>
+ <method name="getFilesDir()Ljava/io/File;"/>
+ <method name="getMainLooper()Landroid/os/Looper;"/>
+ <method name="getNoBackupFilesDir()Ljava/io/File;" since="21"/>
+ <method name="getObbDir()Ljava/io/File;" since="11"/>
+ <method name="getObbDirs()[Ljava/io/File;" since="19"/>
+ <method name="getPackageCodePath()Ljava/lang/String;" since="8"/>
+ <method name="getPackageManager()Landroid/content/pm/PackageManager;"/>
+ <method name="getPackageName()Ljava/lang/String;"/>
+ <method name="getPackageResourcePath()Ljava/lang/String;" since="8"/>
+ <method name="getResources()Landroid/content/res/Resources;"/>
+ <method name="getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences;"/>
+ <method name="getString(I)Ljava/lang/String;"/>
+ <method name="getString(I[Ljava/lang/Object;)Ljava/lang/String;"/>
+ <method name="getSystemService(Ljava/lang/Class;)Ljava/lang/Object;" since="23"/>
+ <method name="getSystemService(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="getSystemServiceName(Ljava/lang/Class;)Ljava/lang/String;" since="23"/>
+ <method name="getText(I)Ljava/lang/CharSequence;"/>
+ <method name="getTheme()Landroid/content/res/Resources$Theme;"/>
+ <method name="getWallpaper()Landroid/graphics/drawable/Drawable;" deprecated="16"/>
+ <method name="getWallpaperDesiredMinimumHeight()I" deprecated="16"/>
+ <method name="getWallpaperDesiredMinimumWidth()I" deprecated="16"/>
+ <method name="grantUriPermission(Ljava/lang/String;Landroid/net/Uri;I)V"/>
+ <method name="isDeviceProtectedStorage()Z" since="24"/>
+ <method name="isRestricted()Z" since="4"/>
+ <method name="moveDatabaseFrom(Landroid/content/Context;Ljava/lang/String;)Z" since="24"/>
+ <method name="moveSharedPreferencesFrom(Landroid/content/Context;Ljava/lang/String;)Z" since="24"/>
+ <method name="obtainStyledAttributes(I[I)Landroid/content/res/TypedArray;"/>
+ <method name="obtainStyledAttributes(Landroid/util/AttributeSet;[I)Landroid/content/res/TypedArray;"/>
+ <method name="obtainStyledAttributes(Landroid/util/AttributeSet;[III)Landroid/content/res/TypedArray;"/>
+ <method name="obtainStyledAttributes([I)Landroid/content/res/TypedArray;"/>
+ <method name="openFileInput(Ljava/lang/String;)Ljava/io/FileInputStream;"/>
+ <method name="openFileOutput(Ljava/lang/String;I)Ljava/io/FileOutputStream;"/>
+ <method name="openOrCreateDatabase(Ljava/lang/String;ILandroid/database/sqlite/SQLiteDatabase$CursorFactory;)Landroid/database/sqlite/SQLiteDatabase;"/>
+ <method name="openOrCreateDatabase(Ljava/lang/String;ILandroid/database/sqlite/SQLiteDatabase$CursorFactory;Landroid/database/DatabaseErrorHandler;)Landroid/database/sqlite/SQLiteDatabase;" since="11"/>
+ <method name="peekWallpaper()Landroid/graphics/drawable/Drawable;" deprecated="16"/>
+ <method name="registerComponentCallbacks(Landroid/content/ComponentCallbacks;)V" since="14"/>
+ <method name="registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;)Landroid/content/Intent;"/>
+ <method name="registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;I)Landroid/content/Intent;" since="26"/>
+ <method name="registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;)Landroid/content/Intent;"/>
+ <method name="registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;I)Landroid/content/Intent;" since="26"/>
+ <method name="removeStickyBroadcast(Landroid/content/Intent;)V" deprecated="21"/>
+ <method name="removeStickyBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V" since="17" deprecated="21"/>
+ <method name="revokeUriPermission(Landroid/net/Uri;I)V"/>
+ <method name="revokeUriPermission(Ljava/lang/String;Landroid/net/Uri;I)V" since="26"/>
+ <method name="sendBroadcast(Landroid/content/Intent;)V"/>
+ <method name="sendBroadcast(Landroid/content/Intent;Ljava/lang/String;)V"/>
+ <method name="sendBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V" since="17"/>
+ <method name="sendBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/lang/String;)V" since="17"/>
+ <method name="sendOrderedBroadcast(Landroid/content/Intent;Ljava/lang/String;)V"/>
+ <method name="sendOrderedBroadcast(Landroid/content/Intent;Ljava/lang/String;Landroid/content/BroadcastReceiver;Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;)V"/>
+ <method name="sendOrderedBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/lang/String;Landroid/content/BroadcastReceiver;Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;)V" since="17"/>
+ <method name="sendStickyBroadcast(Landroid/content/Intent;)V" deprecated="21"/>
+ <method name="sendStickyBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V" since="17" deprecated="21"/>
+ <method name="sendStickyOrderedBroadcast(Landroid/content/Intent;Landroid/content/BroadcastReceiver;Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;)V" since="5" deprecated="21"/>
+ <method name="sendStickyOrderedBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Landroid/content/BroadcastReceiver;Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;)V" since="17" deprecated="21"/>
+ <method name="setTheme(I)V"/>
+ <method name="setWallpaper(Landroid/graphics/Bitmap;)V" deprecated="16"/>
+ <method name="setWallpaper(Ljava/io/InputStream;)V" deprecated="16"/>
+ <method name="startActivities([Landroid/content/Intent;)V" since="11"/>
+ <method name="startActivities([Landroid/content/Intent;Landroid/os/Bundle;)V" since="16"/>
+ <method name="startActivity(Landroid/content/Intent;)V"/>
+ <method name="startActivity(Landroid/content/Intent;Landroid/os/Bundle;)V" since="16"/>
+ <method name="startForegroundService(Landroid/content/Intent;)Landroid/content/ComponentName;" since="26"/>
+ <method name="startInstrumentation(Landroid/content/ComponentName;Ljava/lang/String;Landroid/os/Bundle;)Z"/>
+ <method name="startIntentSender(Landroid/content/IntentSender;Landroid/content/Intent;III)V" since="5"/>
+ <method name="startIntentSender(Landroid/content/IntentSender;Landroid/content/Intent;IIILandroid/os/Bundle;)V" since="16"/>
+ <method name="startService(Landroid/content/Intent;)Landroid/content/ComponentName;"/>
+ <method name="stopService(Landroid/content/Intent;)Z"/>
+ <method name="unbindService(Landroid/content/ServiceConnection;)V"/>
+ <method name="unregisterComponentCallbacks(Landroid/content/ComponentCallbacks;)V" since="14"/>
+ <method name="unregisterReceiver(Landroid/content/BroadcastReceiver;)V"/>
+ <field name="ACCESSIBILITY_SERVICE" since="4"/>
+ <field name="ACCOUNT_SERVICE" since="5"/>
+ <field name="ACTIVITY_SERVICE"/>
+ <field name="ALARM_SERVICE"/>
+ <field name="APPWIDGET_SERVICE" since="21"/>
+ <field name="APP_OPS_SERVICE" since="19"/>
+ <field name="AUDIO_SERVICE"/>
+ <field name="BATTERY_SERVICE" since="21"/>
+ <field name="BIND_ABOVE_CLIENT" since="14"/>
+ <field name="BIND_ADJUST_WITH_ACTIVITY" since="14"/>
+ <field name="BIND_ALLOW_OOM_MANAGEMENT" since="14"/>
+ <field name="BIND_AUTO_CREATE"/>
+ <field name="BIND_DEBUG_UNBIND"/>
+ <field name="BIND_EXTERNAL_SERVICE" since="24"/>
+ <field name="BIND_IMPORTANT" since="14"/>
+ <field name="BIND_NOT_FOREGROUND" since="8"/>
+ <field name="BIND_WAIVE_PRIORITY" since="14"/>
+ <field name="BLUETOOTH_SERVICE" since="18"/>
+ <field name="CAMERA_SERVICE" since="21"/>
+ <field name="CAPTIONING_SERVICE" since="19"/>
+ <field name="CARRIER_CONFIG_SERVICE" since="23"/>
+ <field name="CLIPBOARD_SERVICE"/>
+ <field name="COMPANION_DEVICE_SERVICE" since="26"/>
+ <field name="CONNECTIVITY_SERVICE"/>
+ <field name="CONSUMER_IR_SERVICE" since="19"/>
+ <field name="CONTEXT_IGNORE_SECURITY"/>
+ <field name="CONTEXT_INCLUDE_CODE"/>
+ <field name="CONTEXT_RESTRICTED" since="4"/>
+ <field name="DEVICE_POLICY_SERVICE" since="8"/>
+ <field name="DISPLAY_SERVICE" since="17"/>
+ <field name="DOWNLOAD_SERVICE" since="9"/>
+ <field name="DROPBOX_SERVICE" since="8"/>
+ <field name="FINGERPRINT_SERVICE" since="23"/>
+ <field name="HARDWARE_PROPERTIES_SERVICE" since="24"/>
+ <field name="INPUT_METHOD_SERVICE" since="3"/>
+ <field name="INPUT_SERVICE" since="16"/>
+ <field name="IPSEC_SERVICE" since="27"/>
+ <field name="JOB_SCHEDULER_SERVICE" since="21"/>
+ <field name="KEYGUARD_SERVICE"/>
+ <field name="LAUNCHER_APPS_SERVICE" since="21"/>
+ <field name="LAYOUT_INFLATER_SERVICE"/>
+ <field name="LOCATION_SERVICE"/>
+ <field name="MEDIA_PROJECTION_SERVICE" since="21"/>
+ <field name="MEDIA_ROUTER_SERVICE" since="16"/>
+ <field name="MEDIA_SESSION_SERVICE" since="21"/>
+ <field name="MIDI_SERVICE" since="23"/>
+ <field name="MODE_APPEND"/>
+ <field name="MODE_ENABLE_WRITE_AHEAD_LOGGING" since="16"/>
+ <field name="MODE_MULTI_PROCESS" since="11" deprecated="23"/>
+ <field name="MODE_NO_LOCALIZED_COLLATORS" since="24"/>
+ <field name="MODE_PRIVATE"/>
+ <field name="MODE_WORLD_READABLE" deprecated="17"/>
+ <field name="MODE_WORLD_WRITEABLE" deprecated="17"/>
+ <field name="NETWORK_STATS_SERVICE" since="23"/>
+ <field name="NFC_SERVICE" since="10"/>
+ <field name="NOTIFICATION_SERVICE"/>
+ <field name="NSD_SERVICE" since="16"/>
+ <field name="POWER_SERVICE"/>
+ <field name="PRINT_SERVICE" since="19"/>
+ <field name="RECEIVER_VISIBLE_TO_INSTANT_APPS" since="26"/>
+ <field name="RESTRICTIONS_SERVICE" since="21"/>
+ <field name="SEARCH_SERVICE"/>
+ <field name="SENSOR_SERVICE"/>
+ <field name="SHORTCUT_SERVICE" since="25"/>
+ <field name="STORAGE_SERVICE" since="9"/>
+ <field name="STORAGE_STATS_SERVICE" since="26"/>
+ <field name="SYSTEM_HEALTH_SERVICE" since="24"/>
+ <field name="TELECOM_SERVICE" since="21"/>
+ <field name="TELEPHONY_SERVICE"/>
+ <field name="TELEPHONY_SUBSCRIPTION_SERVICE" since="22"/>
+ <field name="TEXT_CLASSIFICATION_SERVICE" since="26"/>
+ <field name="TEXT_SERVICES_MANAGER_SERVICE" since="14"/>
+ <field name="TV_INPUT_SERVICE" since="21"/>
+ <field name="UI_MODE_SERVICE" since="8"/>
+ <field name="USAGE_STATS_SERVICE" since="22"/>
+ <field name="USB_SERVICE" since="12"/>
+ <field name="USER_SERVICE" since="17"/>
+ <field name="VIBRATOR_SERVICE"/>
+ <field name="WALLPAPER_SERVICE"/>
+ <field name="WIFI_AWARE_SERVICE" since="26"/>
+ <field name="WIFI_P2P_SERVICE" since="14"/>
+ <field name="WIFI_SERVICE"/>
+ <field name="WINDOW_SERVICE"/>
+ </class>
+ <class name="android/content/ContextWrapper" since="1">
+ <extends name="android/content/Context"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="attachBaseContext(Landroid/content/Context;)V"/>
+ <method name="getBaseContext()Landroid/content/Context;"/>
+ <method name="getPackageCodePath()Ljava/lang/String;"/>
+ <method name="getPackageResourcePath()Ljava/lang/String;"/>
+ </class>
+ <class name="android/content/CursorLoader" since="11">
+ <extends name="android/content/AsyncTaskLoader"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="deliverResult(Landroid/database/Cursor;)V"/>
+ <method name="getProjection()[Ljava/lang/String;"/>
+ <method name="getSelection()Ljava/lang/String;"/>
+ <method name="getSelectionArgs()[Ljava/lang/String;"/>
+ <method name="getSortOrder()Ljava/lang/String;"/>
+ <method name="getUri()Landroid/net/Uri;"/>
+ <method name="loadInBackground()Landroid/database/Cursor;"/>
+ <method name="onCanceled(Landroid/database/Cursor;)V"/>
+ <method name="setProjection([Ljava/lang/String;)V"/>
+ <method name="setSelection(Ljava/lang/String;)V"/>
+ <method name="setSelectionArgs([Ljava/lang/String;)V"/>
+ <method name="setSortOrder(Ljava/lang/String;)V"/>
+ <method name="setUri(Landroid/net/Uri;)V"/>
+ </class>
+ <class name="android/content/DialogInterface" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="cancel()V"/>
+ <method name="dismiss()V"/>
+ <field name="BUTTON1" deprecated="16"/>
+ <field name="BUTTON2" deprecated="16"/>
+ <field name="BUTTON3" deprecated="16"/>
+ <field name="BUTTON_NEGATIVE" since="3"/>
+ <field name="BUTTON_NEUTRAL" since="3"/>
+ <field name="BUTTON_POSITIVE" since="3"/>
+ </class>
+ <class name="android/content/DialogInterface$OnCancelListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onCancel(Landroid/content/DialogInterface;)V"/>
+ </class>
+ <class name="android/content/DialogInterface$OnClickListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onClick(Landroid/content/DialogInterface;I)V"/>
+ </class>
+ <class name="android/content/DialogInterface$OnDismissListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onDismiss(Landroid/content/DialogInterface;)V"/>
+ </class>
+ <class name="android/content/DialogInterface$OnKeyListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onKey(Landroid/content/DialogInterface;ILandroid/view/KeyEvent;)Z"/>
+ </class>
+ <class name="android/content/DialogInterface$OnMultiChoiceClickListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onClick(Landroid/content/DialogInterface;IZ)V"/>
+ </class>
+ <class name="android/content/DialogInterface$OnShowListener" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="onShow(Landroid/content/DialogInterface;)V"/>
+ </class>
+ <class name="android/content/Entity" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/ContentValues;)V"/>
+ <method name="addSubValue(Landroid/net/Uri;Landroid/content/ContentValues;)V"/>
+ <method name="getEntityValues()Landroid/content/ContentValues;"/>
+ <method name="getSubValues()Ljava/util/ArrayList;"/>
+ </class>
+ <class name="android/content/Entity$NamedContentValues" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/net/Uri;Landroid/content/ContentValues;)V"/>
+ <field name="uri"/>
+ <field name="values"/>
+ </class>
+ <class name="android/content/EntityIterator" since="8">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Iterator"/>
+ <method name="close()V"/>
+ <method name="reset()V"/>
+ </class>
+ <class name="android/content/Intent" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <implements name="java/lang/Cloneable" since="8"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/Context;Ljava/lang/Class;)V"/>
+ <method name="&lt;init>(Landroid/content/Intent;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Landroid/net/Uri;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Landroid/net/Uri;Landroid/content/Context;Ljava/lang/Class;)V"/>
+ <method name="addCategory(Ljava/lang/String;)Landroid/content/Intent;"/>
+ <method name="addFlags(I)Landroid/content/Intent;"/>
+ <method name="cloneFilter()Landroid/content/Intent;"/>
+ <method name="createChooser(Landroid/content/Intent;Ljava/lang/CharSequence;)Landroid/content/Intent;"/>
+ <method name="createChooser(Landroid/content/Intent;Ljava/lang/CharSequence;Landroid/content/IntentSender;)Landroid/content/Intent;" since="22"/>
+ <method name="fillIn(Landroid/content/Intent;I)I"/>
+ <method name="filterEquals(Landroid/content/Intent;)Z"/>
+ <method name="filterHashCode()I"/>
+ <method name="getAction()Ljava/lang/String;"/>
+ <method name="getBooleanArrayExtra(Ljava/lang/String;)[Z"/>
+ <method name="getBooleanExtra(Ljava/lang/String;Z)Z"/>
+ <method name="getBundleExtra(Ljava/lang/String;)Landroid/os/Bundle;"/>
+ <method name="getByteArrayExtra(Ljava/lang/String;)[B"/>
+ <method name="getByteExtra(Ljava/lang/String;B)B"/>
+ <method name="getCategories()Ljava/util/Set;"/>
+ <method name="getCharArrayExtra(Ljava/lang/String;)[C"/>
+ <method name="getCharExtra(Ljava/lang/String;C)C"/>
+ <method name="getCharSequenceArrayExtra(Ljava/lang/String;)[Ljava/lang/CharSequence;" since="8"/>
+ <method name="getCharSequenceArrayListExtra(Ljava/lang/String;)Ljava/util/ArrayList;" since="8"/>
+ <method name="getCharSequenceExtra(Ljava/lang/String;)Ljava/lang/CharSequence;"/>
+ <method name="getClipData()Landroid/content/ClipData;" since="16"/>
+ <method name="getComponent()Landroid/content/ComponentName;"/>
+ <method name="getData()Landroid/net/Uri;"/>
+ <method name="getDataString()Ljava/lang/String;"/>
+ <method name="getDoubleArrayExtra(Ljava/lang/String;)[D"/>
+ <method name="getDoubleExtra(Ljava/lang/String;D)D"/>
+ <method name="getExtras()Landroid/os/Bundle;"/>
+ <method name="getFlags()I"/>
+ <method name="getFloatArrayExtra(Ljava/lang/String;)[F"/>
+ <method name="getFloatExtra(Ljava/lang/String;F)F"/>
+ <method name="getIntArrayExtra(Ljava/lang/String;)[I"/>
+ <method name="getIntExtra(Ljava/lang/String;I)I"/>
+ <method name="getIntegerArrayListExtra(Ljava/lang/String;)Ljava/util/ArrayList;"/>
+ <method name="getIntent(Ljava/lang/String;)Landroid/content/Intent;" deprecated="16"/>
+ <method name="getIntentOld(Ljava/lang/String;)Landroid/content/Intent;"/>
+ <method name="getLongArrayExtra(Ljava/lang/String;)[J"/>
+ <method name="getLongExtra(Ljava/lang/String;J)J"/>
+ <method name="getPackage()Ljava/lang/String;" since="4"/>
+ <method name="getParcelableArrayExtra(Ljava/lang/String;)[Landroid/os/Parcelable;"/>
+ <method name="getParcelableArrayListExtra(Ljava/lang/String;)Ljava/util/ArrayList;"/>
+ <method name="getParcelableExtra(Ljava/lang/String;)Landroid/os/Parcelable;"/>
+ <method name="getScheme()Ljava/lang/String;"/>
+ <method name="getSelector()Landroid/content/Intent;" since="15"/>
+ <method name="getSerializableExtra(Ljava/lang/String;)Ljava/io/Serializable;"/>
+ <method name="getShortArrayExtra(Ljava/lang/String;)[S"/>
+ <method name="getShortExtra(Ljava/lang/String;S)S"/>
+ <method name="getSourceBounds()Landroid/graphics/Rect;" since="7"/>
+ <method name="getStringArrayExtra(Ljava/lang/String;)[Ljava/lang/String;"/>
+ <method name="getStringArrayListExtra(Ljava/lang/String;)Ljava/util/ArrayList;"/>
+ <method name="getStringExtra(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getType()Ljava/lang/String;"/>
+ <method name="hasCategory(Ljava/lang/String;)Z"/>
+ <method name="hasExtra(Ljava/lang/String;)Z"/>
+ <method name="hasFileDescriptors()Z"/>
+ <method name="makeMainActivity(Landroid/content/ComponentName;)Landroid/content/Intent;" since="11"/>
+ <method name="makeMainSelectorActivity(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;" since="15"/>
+ <method name="makeRestartActivityTask(Landroid/content/ComponentName;)Landroid/content/Intent;" since="11"/>
+ <method name="normalizeMimeType(Ljava/lang/String;)Ljava/lang/String;" since="16"/>
+ <method name="parseIntent(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;)Landroid/content/Intent;"/>
+ <method name="parseUri(Ljava/lang/String;I)Landroid/content/Intent;" since="4"/>
+ <method name="putCharSequenceArrayListExtra(Ljava/lang/String;Ljava/util/ArrayList;)Landroid/content/Intent;" since="8"/>
+ <method name="putExtra(Ljava/lang/String;B)Landroid/content/Intent;"/>
+ <method name="putExtra(Ljava/lang/String;C)Landroid/content/Intent;"/>
+ <method name="putExtra(Ljava/lang/String;D)Landroid/content/Intent;"/>
+ <method name="putExtra(Ljava/lang/String;F)Landroid/content/Intent;"/>
+ <method name="putExtra(Ljava/lang/String;I)Landroid/content/Intent;"/>
+ <method name="putExtra(Ljava/lang/String;J)Landroid/content/Intent;"/>
+ <method name="putExtra(Ljava/lang/String;Landroid/os/Bundle;)Landroid/content/Intent;"/>
+ <method name="putExtra(Ljava/lang/String;Landroid/os/Parcelable;)Landroid/content/Intent;"/>
+ <method name="putExtra(Ljava/lang/String;Ljava/io/Serializable;)Landroid/content/Intent;"/>
+ <method name="putExtra(Ljava/lang/String;Ljava/lang/CharSequence;)Landroid/content/Intent;"/>
+ <method name="putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;"/>
+ <method name="putExtra(Ljava/lang/String;S)Landroid/content/Intent;"/>
+ <method name="putExtra(Ljava/lang/String;Z)Landroid/content/Intent;"/>
+ <method name="putExtra(Ljava/lang/String;[B)Landroid/content/Intent;"/>
+ <method name="putExtra(Ljava/lang/String;[C)Landroid/content/Intent;"/>
+ <method name="putExtra(Ljava/lang/String;[D)Landroid/content/Intent;"/>
+ <method name="putExtra(Ljava/lang/String;[F)Landroid/content/Intent;"/>
+ <method name="putExtra(Ljava/lang/String;[I)Landroid/content/Intent;"/>
+ <method name="putExtra(Ljava/lang/String;[J)Landroid/content/Intent;"/>
+ <method name="putExtra(Ljava/lang/String;[Landroid/os/Parcelable;)Landroid/content/Intent;"/>
+ <method name="putExtra(Ljava/lang/String;[Ljava/lang/CharSequence;)Landroid/content/Intent;" since="8"/>
+ <method name="putExtra(Ljava/lang/String;[Ljava/lang/String;)Landroid/content/Intent;"/>
+ <method name="putExtra(Ljava/lang/String;[S)Landroid/content/Intent;"/>
+ <method name="putExtra(Ljava/lang/String;[Z)Landroid/content/Intent;"/>
+ <method name="putExtras(Landroid/content/Intent;)Landroid/content/Intent;"/>
+ <method name="putExtras(Landroid/os/Bundle;)Landroid/content/Intent;"/>
+ <method name="putIntegerArrayListExtra(Ljava/lang/String;Ljava/util/ArrayList;)Landroid/content/Intent;"/>
+ <method name="putParcelableArrayListExtra(Ljava/lang/String;Ljava/util/ArrayList;)Landroid/content/Intent;"/>
+ <method name="putStringArrayListExtra(Ljava/lang/String;Ljava/util/ArrayList;)Landroid/content/Intent;"/>
+ <method name="readFromParcel(Landroid/os/Parcel;)V"/>
+ <method name="removeCategory(Ljava/lang/String;)V"/>
+ <method name="removeExtra(Ljava/lang/String;)V"/>
+ <method name="removeFlags(I)V" since="26"/>
+ <method name="replaceExtras(Landroid/content/Intent;)Landroid/content/Intent;" since="3"/>
+ <method name="replaceExtras(Landroid/os/Bundle;)Landroid/content/Intent;" since="3"/>
+ <method name="resolveActivity(Landroid/content/pm/PackageManager;)Landroid/content/ComponentName;"/>
+ <method name="resolveActivityInfo(Landroid/content/pm/PackageManager;I)Landroid/content/pm/ActivityInfo;"/>
+ <method name="resolveType(Landroid/content/ContentResolver;)Ljava/lang/String;"/>
+ <method name="resolveType(Landroid/content/Context;)Ljava/lang/String;"/>
+ <method name="resolveTypeIfNeeded(Landroid/content/ContentResolver;)Ljava/lang/String;"/>
+ <method name="setAction(Ljava/lang/String;)Landroid/content/Intent;"/>
+ <method name="setClass(Landroid/content/Context;Ljava/lang/Class;)Landroid/content/Intent;"/>
+ <method name="setClassName(Landroid/content/Context;Ljava/lang/String;)Landroid/content/Intent;"/>
+ <method name="setClassName(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;"/>
+ <method name="setClipData(Landroid/content/ClipData;)V" since="16"/>
+ <method name="setComponent(Landroid/content/ComponentName;)Landroid/content/Intent;"/>
+ <method name="setData(Landroid/net/Uri;)Landroid/content/Intent;"/>
+ <method name="setDataAndNormalize(Landroid/net/Uri;)Landroid/content/Intent;" since="16"/>
+ <method name="setDataAndType(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/Intent;"/>
+ <method name="setDataAndTypeAndNormalize(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/Intent;" since="16"/>
+ <method name="setExtrasClassLoader(Ljava/lang/ClassLoader;)V"/>
+ <method name="setFlags(I)Landroid/content/Intent;"/>
+ <method name="setPackage(Ljava/lang/String;)Landroid/content/Intent;" since="4"/>
+ <method name="setSelector(Landroid/content/Intent;)V" since="15"/>
+ <method name="setSourceBounds(Landroid/graphics/Rect;)V" since="7"/>
+ <method name="setType(Ljava/lang/String;)Landroid/content/Intent;"/>
+ <method name="setTypeAndNormalize(Ljava/lang/String;)Landroid/content/Intent;" since="16"/>
+ <method name="toURI()Ljava/lang/String;" deprecated="16"/>
+ <method name="toUri(I)Ljava/lang/String;" since="4"/>
+ <field name="ACTION_AIRPLANE_MODE_CHANGED"/>
+ <field name="ACTION_ALL_APPS"/>
+ <field name="ACTION_ANSWER"/>
+ <field name="ACTION_APPLICATION_PREFERENCES" since="24"/>
+ <field name="ACTION_APPLICATION_RESTRICTIONS_CHANGED" since="21"/>
+ <field name="ACTION_APP_ERROR" since="14"/>
+ <field name="ACTION_ASSIST" since="16"/>
+ <field name="ACTION_ATTACH_DATA"/>
+ <field name="ACTION_BATTERY_CHANGED"/>
+ <field name="ACTION_BATTERY_LOW"/>
+ <field name="ACTION_BATTERY_OKAY" since="4"/>
+ <field name="ACTION_BOOT_COMPLETED"/>
+ <field name="ACTION_BUG_REPORT"/>
+ <field name="ACTION_CALL"/>
+ <field name="ACTION_CALL_BUTTON"/>
+ <field name="ACTION_CAMERA_BUTTON"/>
+ <field name="ACTION_CARRIER_SETUP" since="26"/>
+ <field name="ACTION_CHOOSER"/>
+ <field name="ACTION_CLOSE_SYSTEM_DIALOGS"/>
+ <field name="ACTION_CONFIGURATION_CHANGED"/>
+ <field name="ACTION_CREATE_DOCUMENT" since="19"/>
+ <field name="ACTION_CREATE_SHORTCUT"/>
+ <field name="ACTION_DATE_CHANGED"/>
+ <field name="ACTION_DEFAULT"/>
+ <field name="ACTION_DELETE"/>
+ <field name="ACTION_DEVICE_STORAGE_LOW" deprecated="26"/>
+ <field name="ACTION_DEVICE_STORAGE_OK" deprecated="26"/>
+ <field name="ACTION_DIAL"/>
+ <field name="ACTION_DOCK_EVENT" since="5"/>
+ <field name="ACTION_DREAMING_STARTED" since="17"/>
+ <field name="ACTION_DREAMING_STOPPED" since="17"/>
+ <field name="ACTION_EDIT"/>
+ <field name="ACTION_EXTERNAL_APPLICATIONS_AVAILABLE" since="8"/>
+ <field name="ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE" since="8"/>
+ <field name="ACTION_FACTORY_TEST"/>
+ <field name="ACTION_GET_CONTENT"/>
+ <field name="ACTION_GET_RESTRICTION_ENTRIES" since="18"/>
+ <field name="ACTION_GTALK_SERVICE_CONNECTED"/>
+ <field name="ACTION_GTALK_SERVICE_DISCONNECTED"/>
+ <field name="ACTION_HEADSET_PLUG"/>
+ <field name="ACTION_INPUT_METHOD_CHANGED" since="3"/>
+ <field name="ACTION_INSERT"/>
+ <field name="ACTION_INSERT_OR_EDIT"/>
+ <field name="ACTION_INSTALL_PACKAGE" since="14"/>
+ <field name="ACTION_LOCALE_CHANGED" since="7"/>
+ <field name="ACTION_LOCKED_BOOT_COMPLETED" since="24"/>
+ <field name="ACTION_MAIN"/>
+ <field name="ACTION_MANAGED_PROFILE_ADDED" since="21"/>
+ <field name="ACTION_MANAGED_PROFILE_AVAILABLE" since="24"/>
+ <field name="ACTION_MANAGED_PROFILE_REMOVED" since="21"/>
+ <field name="ACTION_MANAGED_PROFILE_UNAVAILABLE" since="24"/>
+ <field name="ACTION_MANAGED_PROFILE_UNLOCKED" since="24"/>
+ <field name="ACTION_MANAGE_NETWORK_USAGE" since="14"/>
+ <field name="ACTION_MANAGE_PACKAGE_STORAGE"/>
+ <field name="ACTION_MEDIA_BAD_REMOVAL"/>
+ <field name="ACTION_MEDIA_BUTTON"/>
+ <field name="ACTION_MEDIA_CHECKING" since="3"/>
+ <field name="ACTION_MEDIA_EJECT"/>
+ <field name="ACTION_MEDIA_MOUNTED"/>
+ <field name="ACTION_MEDIA_NOFS" since="3"/>
+ <field name="ACTION_MEDIA_REMOVED"/>
+ <field name="ACTION_MEDIA_SCANNER_FINISHED"/>
+ <field name="ACTION_MEDIA_SCANNER_SCAN_FILE"/>
+ <field name="ACTION_MEDIA_SCANNER_STARTED"/>
+ <field name="ACTION_MEDIA_SHARED"/>
+ <field name="ACTION_MEDIA_UNMOUNTABLE"/>
+ <field name="ACTION_MEDIA_UNMOUNTED"/>
+ <field name="ACTION_MY_PACKAGE_REPLACED" since="12"/>
+ <field name="ACTION_NEW_OUTGOING_CALL"/>
+ <field name="ACTION_OPEN_DOCUMENT" since="19"/>
+ <field name="ACTION_OPEN_DOCUMENT_TREE" since="21"/>
+ <field name="ACTION_PACKAGES_SUSPENDED" since="24"/>
+ <field name="ACTION_PACKAGES_UNSUSPENDED" since="24"/>
+ <field name="ACTION_PACKAGE_ADDED"/>
+ <field name="ACTION_PACKAGE_CHANGED"/>
+ <field name="ACTION_PACKAGE_DATA_CLEARED" since="3"/>
+ <field name="ACTION_PACKAGE_FIRST_LAUNCH" since="12"/>
+ <field name="ACTION_PACKAGE_FULLY_REMOVED" since="14"/>
+ <field name="ACTION_PACKAGE_INSTALL" deprecated="16"/>
+ <field name="ACTION_PACKAGE_NEEDS_VERIFICATION" since="14"/>
+ <field name="ACTION_PACKAGE_REMOVED"/>
+ <field name="ACTION_PACKAGE_REPLACED" since="3"/>
+ <field name="ACTION_PACKAGE_RESTARTED"/>
+ <field name="ACTION_PACKAGE_VERIFIED" since="17"/>
+ <field name="ACTION_PASTE" since="11"/>
+ <field name="ACTION_PICK"/>
+ <field name="ACTION_PICK_ACTIVITY"/>
+ <field name="ACTION_POWER_CONNECTED" since="4"/>
+ <field name="ACTION_POWER_DISCONNECTED" since="4"/>
+ <field name="ACTION_POWER_USAGE_SUMMARY" since="4"/>
+ <field name="ACTION_PROCESS_TEXT" since="23"/>
+ <field name="ACTION_PROVIDER_CHANGED"/>
+ <field name="ACTION_QUICK_CLOCK" since="17"/>
+ <field name="ACTION_QUICK_VIEW" since="24"/>
+ <field name="ACTION_REBOOT"/>
+ <field name="ACTION_RUN"/>
+ <field name="ACTION_SCREEN_OFF"/>
+ <field name="ACTION_SCREEN_ON"/>
+ <field name="ACTION_SEARCH"/>
+ <field name="ACTION_SEARCH_LONG_PRESS" since="3"/>
+ <field name="ACTION_SEND"/>
+ <field name="ACTION_SENDTO"/>
+ <field name="ACTION_SEND_MULTIPLE" since="4"/>
+ <field name="ACTION_SET_WALLPAPER"/>
+ <field name="ACTION_SHOW_APP_INFO" since="24"/>
+ <field name="ACTION_SHUTDOWN" since="4"/>
+ <field name="ACTION_SYNC"/>
+ <field name="ACTION_SYSTEM_TUTORIAL" since="3"/>
+ <field name="ACTION_TIMEZONE_CHANGED"/>
+ <field name="ACTION_TIME_CHANGED"/>
+ <field name="ACTION_TIME_TICK"/>
+ <field name="ACTION_UID_REMOVED"/>
+ <field name="ACTION_UMS_CONNECTED" deprecated="16"/>
+ <field name="ACTION_UMS_DISCONNECTED" deprecated="16"/>
+ <field name="ACTION_UNINSTALL_PACKAGE" since="14"/>
+ <field name="ACTION_USER_BACKGROUND" since="17"/>
+ <field name="ACTION_USER_FOREGROUND" since="17"/>
+ <field name="ACTION_USER_INITIALIZE" since="17"/>
+ <field name="ACTION_USER_PRESENT" since="3"/>
+ <field name="ACTION_USER_UNLOCKED" since="24"/>
+ <field name="ACTION_VIEW"/>
+ <field name="ACTION_VOICE_COMMAND"/>
+ <field name="ACTION_WALLPAPER_CHANGED" deprecated="16"/>
+ <field name="ACTION_WEB_SEARCH"/>
+ <field name="CATEGORY_ALTERNATIVE"/>
+ <field name="CATEGORY_APP_BROWSER" since="15"/>
+ <field name="CATEGORY_APP_CALCULATOR" since="15"/>
+ <field name="CATEGORY_APP_CALENDAR" since="15"/>
+ <field name="CATEGORY_APP_CONTACTS" since="15"/>
+ <field name="CATEGORY_APP_EMAIL" since="15"/>
+ <field name="CATEGORY_APP_GALLERY" since="15"/>
+ <field name="CATEGORY_APP_MAPS" since="15"/>
+ <field name="CATEGORY_APP_MARKET" since="11"/>
+ <field name="CATEGORY_APP_MESSAGING" since="15"/>
+ <field name="CATEGORY_APP_MUSIC" since="15"/>
+ <field name="CATEGORY_BROWSABLE"/>
+ <field name="CATEGORY_CAR_DOCK" since="5"/>
+ <field name="CATEGORY_CAR_MODE" since="8"/>
+ <field name="CATEGORY_DEFAULT"/>
+ <field name="CATEGORY_DESK_DOCK" since="5"/>
+ <field name="CATEGORY_DEVELOPMENT_PREFERENCE"/>
+ <field name="CATEGORY_EMBED"/>
+ <field name="CATEGORY_FRAMEWORK_INSTRUMENTATION_TEST"/>
+ <field name="CATEGORY_GADGET" removed="3"/>
+ <field name="CATEGORY_HE_DESK_DOCK" since="11"/>
+ <field name="CATEGORY_HOME"/>
+ <field name="CATEGORY_INFO" since="3"/>
+ <field name="CATEGORY_LAUNCHER"/>
+ <field name="CATEGORY_LEANBACK_LAUNCHER" since="21"/>
+ <field name="CATEGORY_LE_DESK_DOCK" since="11"/>
+ <field name="CATEGORY_MONKEY"/>
+ <field name="CATEGORY_OPENABLE"/>
+ <field name="CATEGORY_PREFERENCE"/>
+ <field name="CATEGORY_SAMPLE_CODE"/>
+ <field name="CATEGORY_SELECTED_ALTERNATIVE"/>
+ <field name="CATEGORY_TAB"/>
+ <field name="CATEGORY_TEST"/>
+ <field name="CATEGORY_TYPED_OPENABLE" since="26"/>
+ <field name="CATEGORY_UNIT_TEST"/>
+ <field name="CATEGORY_VOICE" since="23"/>
+ <field name="CATEGORY_VR_HOME" since="26"/>
+ <field name="CREATOR"/>
+ <field name="EXTRA_ALARM_COUNT"/>
+ <field name="EXTRA_ALLOW_MULTIPLE" since="18"/>
+ <field name="EXTRA_ALLOW_REPLACE" since="14" deprecated="16"/>
+ <field name="EXTRA_ALTERNATE_INTENTS" since="23"/>
+ <field name="EXTRA_ASSIST_CONTEXT" since="18"/>
+ <field name="EXTRA_ASSIST_INPUT_DEVICE_ID" since="23"/>
+ <field name="EXTRA_ASSIST_INPUT_HINT_KEYBOARD" since="21"/>
+ <field name="EXTRA_ASSIST_PACKAGE" since="18"/>
+ <field name="EXTRA_ASSIST_UID" since="23"/>
+ <field name="EXTRA_BCC"/>
+ <field name="EXTRA_BUG_REPORT" since="14"/>
+ <field name="EXTRA_CC"/>
+ <field name="EXTRA_CHANGED_COMPONENT_NAME" since="5" deprecated="16"/>
+ <field name="EXTRA_CHANGED_COMPONENT_NAME_LIST" since="7"/>
+ <field name="EXTRA_CHANGED_PACKAGE_LIST" since="8"/>
+ <field name="EXTRA_CHANGED_UID_LIST" since="8"/>
+ <field name="EXTRA_CHOOSER_REFINEMENT_INTENT_SENDER" since="23"/>
+ <field name="EXTRA_CHOOSER_TARGETS" since="24"/>
+ <field name="EXTRA_CHOSEN_COMPONENT" since="22"/>
+ <field name="EXTRA_CHOSEN_COMPONENT_INTENT_SENDER" since="22"/>
+ <field name="EXTRA_COMPONENT_NAME" since="26"/>
+ <field name="EXTRA_CONTENT_ANNOTATIONS" since="26"/>
+ <field name="EXTRA_DATA_REMOVED" since="3"/>
+ <field name="EXTRA_DOCK_STATE" since="5"/>
+ <field name="EXTRA_DOCK_STATE_CAR" since="5"/>
+ <field name="EXTRA_DOCK_STATE_DESK" since="5"/>
+ <field name="EXTRA_DOCK_STATE_HE_DESK" since="11"/>
+ <field name="EXTRA_DOCK_STATE_LE_DESK" since="11"/>
+ <field name="EXTRA_DOCK_STATE_UNDOCKED" since="5"/>
+ <field name="EXTRA_DONT_KILL_APP"/>
+ <field name="EXTRA_EMAIL"/>
+ <field name="EXTRA_EXCLUDE_COMPONENTS" since="24"/>
+ <field name="EXTRA_FROM_STORAGE" since="26"/>
+ <field name="EXTRA_HTML_TEXT" since="16"/>
+ <field name="EXTRA_INDEX" since="24"/>
+ <field name="EXTRA_INITIAL_INTENTS" since="5"/>
+ <field name="EXTRA_INSTALLER_PACKAGE_NAME" since="14"/>
+ <field name="EXTRA_INTENT"/>
+ <field name="EXTRA_KEY_EVENT"/>
+ <field name="EXTRA_LOCAL_ONLY" since="11"/>
+ <field name="EXTRA_MIME_TYPES" since="19"/>
+ <field name="EXTRA_NOT_UNKNOWN_SOURCE" since="14"/>
+ <field name="EXTRA_ORIGINATING_URI" since="17"/>
+ <field name="EXTRA_PACKAGE_NAME" since="24"/>
+ <field name="EXTRA_PHONE_NUMBER"/>
+ <field name="EXTRA_PROCESS_TEXT" since="23"/>
+ <field name="EXTRA_PROCESS_TEXT_READONLY" since="23"/>
+ <field name="EXTRA_QUICK_VIEW_FEATURES" since="26"/>
+ <field name="EXTRA_QUIET_MODE" since="24"/>
+ <field name="EXTRA_REFERRER" since="17"/>
+ <field name="EXTRA_REFERRER_NAME" since="22"/>
+ <field name="EXTRA_REMOTE_INTENT_TOKEN" since="5"/>
+ <field name="EXTRA_REPLACEMENT_EXTRAS" since="21"/>
+ <field name="EXTRA_REPLACING" since="3"/>
+ <field name="EXTRA_RESTRICTIONS_BUNDLE" since="18"/>
+ <field name="EXTRA_RESTRICTIONS_INTENT" since="18"/>
+ <field name="EXTRA_RESTRICTIONS_LIST" since="18"/>
+ <field name="EXTRA_RESULT_RECEIVER" since="23"/>
+ <field name="EXTRA_RETURN_RESULT" since="14"/>
+ <field name="EXTRA_SHORTCUT_ICON" deprecated="26"/>
+ <field name="EXTRA_SHORTCUT_ICON_RESOURCE" deprecated="26"/>
+ <field name="EXTRA_SHORTCUT_INTENT" deprecated="26"/>
+ <field name="EXTRA_SHORTCUT_NAME" deprecated="26"/>
+ <field name="EXTRA_SHUTDOWN_USERSPACE_ONLY" since="19"/>
+ <field name="EXTRA_STREAM"/>
+ <field name="EXTRA_SUBJECT"/>
+ <field name="EXTRA_TEMPLATE"/>
+ <field name="EXTRA_TEXT"/>
+ <field name="EXTRA_TITLE"/>
+ <field name="EXTRA_UID"/>
+ <field name="EXTRA_USER" since="21"/>
+ <field name="FILL_IN_ACTION"/>
+ <field name="FILL_IN_CATEGORIES"/>
+ <field name="FILL_IN_CLIP_DATA" since="16"/>
+ <field name="FILL_IN_COMPONENT"/>
+ <field name="FILL_IN_DATA"/>
+ <field name="FILL_IN_PACKAGE" since="4"/>
+ <field name="FILL_IN_SELECTOR" since="15"/>
+ <field name="FILL_IN_SOURCE_BOUNDS" since="7"/>
+ <field name="FLAG_ACTIVITY_BROUGHT_TO_FRONT"/>
+ <field name="FLAG_ACTIVITY_CLEAR_TASK" since="11"/>
+ <field name="FLAG_ACTIVITY_CLEAR_TOP"/>
+ <field name="FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET" since="3" deprecated="21"/>
+ <field name="FLAG_ACTIVITY_CLOSE_SYSTEM_DIALOGS" since="16" removed="17"/>
+ <field name="FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS"/>
+ <field name="FLAG_ACTIVITY_FORWARD_RESULT"/>
+ <field name="FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY"/>
+ <field name="FLAG_ACTIVITY_LAUNCH_ADJACENT" since="24"/>
+ <field name="FLAG_ACTIVITY_MULTIPLE_TASK"/>
+ <field name="FLAG_ACTIVITY_NEW_DOCUMENT" since="21"/>
+ <field name="FLAG_ACTIVITY_NEW_TASK"/>
+ <field name="FLAG_ACTIVITY_NO_ANIMATION" since="5"/>
+ <field name="FLAG_ACTIVITY_NO_HISTORY"/>
+ <field name="FLAG_ACTIVITY_NO_USER_ACTION" since="3"/>
+ <field name="FLAG_ACTIVITY_PREVIOUS_IS_TOP"/>
+ <field name="FLAG_ACTIVITY_REORDER_TO_FRONT" since="3"/>
+ <field name="FLAG_ACTIVITY_RESET_TASK_IF_NEEDED"/>
+ <field name="FLAG_ACTIVITY_RETAIN_IN_RECENTS" since="21"/>
+ <field name="FLAG_ACTIVITY_SINGLE_TOP"/>
+ <field name="FLAG_ACTIVITY_TASK_ON_HOME" since="11"/>
+ <field name="FLAG_DEBUG_LOG_RESOLUTION"/>
+ <field name="FLAG_EXCLUDE_STOPPED_PACKAGES" since="12"/>
+ <field name="FLAG_FROM_BACKGROUND"/>
+ <field name="FLAG_GRANT_PERSISTABLE_URI_PERMISSION" since="19"/>
+ <field name="FLAG_GRANT_PREFIX_URI_PERMISSION" since="21"/>
+ <field name="FLAG_GRANT_READ_URI_PERMISSION"/>
+ <field name="FLAG_GRANT_WRITE_URI_PERMISSION"/>
+ <field name="FLAG_INCLUDE_STOPPED_PACKAGES" since="12"/>
+ <field name="FLAG_RECEIVER_FOREGROUND" since="16"/>
+ <field name="FLAG_RECEIVER_NO_ABORT" since="19"/>
+ <field name="FLAG_RECEIVER_REGISTERED_ONLY"/>
+ <field name="FLAG_RECEIVER_REPLACE_PENDING" since="8"/>
+ <field name="FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS" since="26"/>
+ <field name="METADATA_DOCK_HOME" since="5"/>
+ <field name="URI_ALLOW_UNSAFE" since="22"/>
+ <field name="URI_ANDROID_APP_SCHEME" since="22"/>
+ <field name="URI_INTENT_SCHEME" since="4"/>
+ </class>
+ <class name="android/content/Intent$FilterComparison" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Intent;)V"/>
+ <method name="getIntent()Landroid/content/Intent;"/>
+ </class>
+ <class name="android/content/Intent$ShortcutIconResource" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="fromContext(Landroid/content/Context;I)Landroid/content/Intent$ShortcutIconResource;"/>
+ <field name="CREATOR"/>
+ <field name="packageName"/>
+ <field name="resourceName"/>
+ </class>
+ <class name="android/content/IntentFilter" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/IntentFilter;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="actionsIterator()Ljava/util/Iterator;"/>
+ <method name="addAction(Ljava/lang/String;)V"/>
+ <method name="addCategory(Ljava/lang/String;)V"/>
+ <method name="addDataAuthority(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="addDataPath(Ljava/lang/String;I)V"/>
+ <method name="addDataScheme(Ljava/lang/String;)V"/>
+ <method name="addDataSchemeSpecificPart(Ljava/lang/String;I)V" since="19"/>
+ <method name="addDataType(Ljava/lang/String;)V"/>
+ <method name="authoritiesIterator()Ljava/util/Iterator;"/>
+ <method name="categoriesIterator()Ljava/util/Iterator;"/>
+ <method name="countActions()I"/>
+ <method name="countCategories()I"/>
+ <method name="countDataAuthorities()I"/>
+ <method name="countDataPaths()I"/>
+ <method name="countDataSchemeSpecificParts()I" since="19"/>
+ <method name="countDataSchemes()I"/>
+ <method name="countDataTypes()I"/>
+ <method name="create(Ljava/lang/String;Ljava/lang/String;)Landroid/content/IntentFilter;"/>
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V"/>
+ <method name="getAction(I)Ljava/lang/String;"/>
+ <method name="getCategory(I)Ljava/lang/String;"/>
+ <method name="getDataAuthority(I)Landroid/content/IntentFilter$AuthorityEntry;"/>
+ <method name="getDataPath(I)Landroid/os/PatternMatcher;"/>
+ <method name="getDataScheme(I)Ljava/lang/String;"/>
+ <method name="getDataSchemeSpecificPart(I)Landroid/os/PatternMatcher;" since="19"/>
+ <method name="getDataType(I)Ljava/lang/String;"/>
+ <method name="getPriority()I"/>
+ <method name="hasAction(Ljava/lang/String;)Z"/>
+ <method name="hasCategory(Ljava/lang/String;)Z"/>
+ <method name="hasDataAuthority(Landroid/net/Uri;)Z"/>
+ <method name="hasDataPath(Ljava/lang/String;)Z"/>
+ <method name="hasDataScheme(Ljava/lang/String;)Z"/>
+ <method name="hasDataSchemeSpecificPart(Ljava/lang/String;)Z" since="19"/>
+ <method name="hasDataType(Ljava/lang/String;)Z"/>
+ <method name="match(Landroid/content/ContentResolver;Landroid/content/Intent;ZLjava/lang/String;)I"/>
+ <method name="match(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;Ljava/util/Set;Ljava/lang/String;)I"/>
+ <method name="matchAction(Ljava/lang/String;)Z"/>
+ <method name="matchCategories(Ljava/util/Set;)Ljava/lang/String;"/>
+ <method name="matchData(Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;)I"/>
+ <method name="matchDataAuthority(Landroid/net/Uri;)I"/>
+ <method name="pathsIterator()Ljava/util/Iterator;"/>
+ <method name="readFromXml(Lorg/xmlpull/v1/XmlPullParser;)V"/>
+ <method name="schemeSpecificPartsIterator()Ljava/util/Iterator;" since="19"/>
+ <method name="schemesIterator()Ljava/util/Iterator;"/>
+ <method name="setPriority(I)V"/>
+ <method name="typesIterator()Ljava/util/Iterator;"/>
+ <method name="writeToXml(Lorg/xmlpull/v1/XmlSerializer;)V"/>
+ <field name="CREATOR"/>
+ <field name="MATCH_ADJUSTMENT_MASK"/>
+ <field name="MATCH_ADJUSTMENT_NORMAL"/>
+ <field name="MATCH_CATEGORY_EMPTY"/>
+ <field name="MATCH_CATEGORY_HOST"/>
+ <field name="MATCH_CATEGORY_MASK"/>
+ <field name="MATCH_CATEGORY_PATH"/>
+ <field name="MATCH_CATEGORY_PORT"/>
+ <field name="MATCH_CATEGORY_SCHEME"/>
+ <field name="MATCH_CATEGORY_SCHEME_SPECIFIC_PART" since="19"/>
+ <field name="MATCH_CATEGORY_TYPE"/>
+ <field name="NO_MATCH_ACTION"/>
+ <field name="NO_MATCH_CATEGORY"/>
+ <field name="NO_MATCH_DATA"/>
+ <field name="NO_MATCH_TYPE"/>
+ <field name="SYSTEM_HIGH_PRIORITY"/>
+ <field name="SYSTEM_LOW_PRIORITY"/>
+ </class>
+ <class name="android/content/IntentFilter$AuthorityEntry" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="getHost()Ljava/lang/String;"/>
+ <method name="getPort()I"/>
+ <method name="match(Landroid/net/Uri;)I"/>
+ </class>
+ <class name="android/content/IntentFilter$MalformedMimeTypeException" since="1">
+ <extends name="android/util/AndroidException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/content/IntentSender" since="4">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCreatorPackage()Ljava/lang/String;" since="17"/>
+ <method name="getCreatorUid()I" since="17"/>
+ <method name="getCreatorUserHandle()Landroid/os/UserHandle;" since="17"/>
+ <method name="getTargetPackage()Ljava/lang/String;" since="9" deprecated="17"/>
+ <method name="readIntentSenderOrNullFromParcel(Landroid/os/Parcel;)Landroid/content/IntentSender;"/>
+ <method name="sendIntent(Landroid/content/Context;ILandroid/content/Intent;Landroid/content/IntentSender$OnFinished;Landroid/os/Handler;)V"/>
+ <method name="sendIntent(Landroid/content/Context;ILandroid/content/Intent;Landroid/content/IntentSender$OnFinished;Landroid/os/Handler;Ljava/lang/String;)V" since="14"/>
+ <method name="writeIntentSenderOrNullToParcel(Landroid/content/IntentSender;Landroid/os/Parcel;)V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/content/IntentSender$OnFinished" since="4">
+ <extends name="java/lang/Object"/>
+ <method name="onSendFinished(Landroid/content/IntentSender;Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;)V"/>
+ </class>
+ <class name="android/content/IntentSender$SendIntentException" since="4">
+ <extends name="android/util/AndroidException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/Exception;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/content/Loader" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="abandon()V"/>
+ <method name="cancelLoad()Z" since="16"/>
+ <method name="commitContentChanged()V" since="18"/>
+ <method name="dataToString(Ljava/lang/Object;)Ljava/lang/String;"/>
+ <method name="deliverCancellation()V" since="16"/>
+ <method name="deliverResult(Ljava/lang/Object;)V"/>
+ <method name="dump(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V"/>
+ <method name="forceLoad()V"/>
+ <method name="getContext()Landroid/content/Context;"/>
+ <method name="getId()I"/>
+ <method name="isAbandoned()Z"/>
+ <method name="isReset()Z"/>
+ <method name="isStarted()Z"/>
+ <method name="onAbandon()V"/>
+ <method name="onCancelLoad()Z" since="16"/>
+ <method name="onContentChanged()V"/>
+ <method name="onForceLoad()V"/>
+ <method name="onReset()V"/>
+ <method name="onStartLoading()V"/>
+ <method name="onStopLoading()V"/>
+ <method name="registerListener(ILandroid/content/Loader$OnLoadCompleteListener;)V"/>
+ <method name="registerOnLoadCanceledListener(Landroid/content/Loader$OnLoadCanceledListener;)V" since="16"/>
+ <method name="reset()V"/>
+ <method name="rollbackContentChanged()V" since="18"/>
+ <method name="startLoading()V"/>
+ <method name="stopLoading()V"/>
+ <method name="takeContentChanged()Z"/>
+ <method name="unregisterListener(Landroid/content/Loader$OnLoadCompleteListener;)V"/>
+ <method name="unregisterOnLoadCanceledListener(Landroid/content/Loader$OnLoadCanceledListener;)V" since="16"/>
+ </class>
+ <class name="android/content/Loader$ForceLoadContentObserver" since="11">
+ <extends name="android/database/ContentObserver"/>
+ <method name="&lt;init>(Landroid/content/Loader;)V"/>
+ </class>
+ <class name="android/content/Loader$OnLoadCanceledListener" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="onLoadCanceled(Landroid/content/Loader;)V"/>
+ </class>
+ <class name="android/content/Loader$OnLoadCompleteListener" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="onLoadComplete(Landroid/content/Loader;Ljava/lang/Object;)V"/>
+ </class>
+ <class name="android/content/MutableContextWrapper" since="1">
+ <extends name="android/content/ContextWrapper"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="setBaseContext(Landroid/content/Context;)V"/>
+ </class>
+ <class name="android/content/OperationApplicationException" since="5">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ <method name="getNumSuccessfulYieldPoints()I"/>
+ </class>
+ <class name="android/content/PeriodicSync" since="8">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;J)V"/>
+ <field name="CREATOR"/>
+ <field name="account"/>
+ <field name="authority"/>
+ <field name="extras"/>
+ <field name="period"/>
+ </class>
+ <class name="android/content/QuickViewConstants" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="FEATURE_DOWNLOAD"/>
+ <field name="FEATURE_EDIT"/>
+ <field name="FEATURE_PRINT"/>
+ <field name="FEATURE_SEND"/>
+ <field name="FEATURE_VIEW"/>
+ </class>
+ <class name="android/content/ReceiverCallNotAllowedException" since="1">
+ <extends name="android/util/AndroidRuntimeException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/content/RestrictionEntry" since="18">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(ILjava/lang/String;)V" since="21"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V" since="21"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Z)V"/>
+ <method name="&lt;init>(Ljava/lang/String;[Ljava/lang/String;)V"/>
+ <method name="createBundleArrayEntry(Ljava/lang/String;[Landroid/content/RestrictionEntry;)Landroid/content/RestrictionEntry;" since="23"/>
+ <method name="createBundleEntry(Ljava/lang/String;[Landroid/content/RestrictionEntry;)Landroid/content/RestrictionEntry;" since="23"/>
+ <method name="getAllSelectedStrings()[Ljava/lang/String;"/>
+ <method name="getChoiceEntries()[Ljava/lang/String;"/>
+ <method name="getChoiceValues()[Ljava/lang/String;"/>
+ <method name="getDescription()Ljava/lang/String;"/>
+ <method name="getIntValue()I" since="21"/>
+ <method name="getKey()Ljava/lang/String;"/>
+ <method name="getRestrictions()[Landroid/content/RestrictionEntry;" since="23"/>
+ <method name="getSelectedState()Z"/>
+ <method name="getSelectedString()Ljava/lang/String;"/>
+ <method name="getTitle()Ljava/lang/String;"/>
+ <method name="getType()I"/>
+ <method name="setAllSelectedStrings([Ljava/lang/String;)V"/>
+ <method name="setChoiceEntries(Landroid/content/Context;I)V"/>
+ <method name="setChoiceEntries([Ljava/lang/String;)V"/>
+ <method name="setChoiceValues(Landroid/content/Context;I)V"/>
+ <method name="setChoiceValues([Ljava/lang/String;)V"/>
+ <method name="setDescription(Ljava/lang/String;)V"/>
+ <method name="setIntValue(I)V" since="21"/>
+ <method name="setRestrictions([Landroid/content/RestrictionEntry;)V" since="23"/>
+ <method name="setSelectedState(Z)V"/>
+ <method name="setSelectedString(Ljava/lang/String;)V"/>
+ <method name="setTitle(Ljava/lang/String;)V"/>
+ <method name="setType(I)V"/>
+ <field name="CREATOR"/>
+ <field name="TYPE_BOOLEAN"/>
+ <field name="TYPE_BUNDLE" since="23"/>
+ <field name="TYPE_BUNDLE_ARRAY" since="23"/>
+ <field name="TYPE_CHOICE"/>
+ <field name="TYPE_INTEGER" since="21"/>
+ <field name="TYPE_MULTI_SELECT"/>
+ <field name="TYPE_NULL"/>
+ <field name="TYPE_STRING" since="21"/>
+ </class>
+ <class name="android/content/RestrictionsManager" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="convertRestrictionsToBundle(Ljava/util/List;)Landroid/os/Bundle;" since="23"/>
+ <method name="createLocalApprovalIntent()Landroid/content/Intent;"/>
+ <method name="getApplicationRestrictions()Landroid/os/Bundle;"/>
+ <method name="getManifestRestrictions(Ljava/lang/String;)Ljava/util/List;"/>
+ <method name="hasRestrictionsProvider()Z"/>
+ <method name="notifyPermissionResponse(Ljava/lang/String;Landroid/os/PersistableBundle;)V"/>
+ <method name="requestPermission(Ljava/lang/String;Ljava/lang/String;Landroid/os/PersistableBundle;)V"/>
+ <field name="ACTION_PERMISSION_RESPONSE_RECEIVED"/>
+ <field name="ACTION_REQUEST_LOCAL_APPROVAL"/>
+ <field name="ACTION_REQUEST_PERMISSION"/>
+ <field name="EXTRA_PACKAGE_NAME"/>
+ <field name="EXTRA_REQUEST_BUNDLE"/>
+ <field name="EXTRA_REQUEST_ID"/>
+ <field name="EXTRA_REQUEST_TYPE"/>
+ <field name="EXTRA_RESPONSE_BUNDLE"/>
+ <field name="META_DATA_APP_RESTRICTIONS"/>
+ <field name="REQUEST_KEY_APPROVE_LABEL"/>
+ <field name="REQUEST_KEY_DATA"/>
+ <field name="REQUEST_KEY_DENY_LABEL"/>
+ <field name="REQUEST_KEY_ICON"/>
+ <field name="REQUEST_KEY_ID"/>
+ <field name="REQUEST_KEY_MESSAGE"/>
+ <field name="REQUEST_KEY_NEW_REQUEST"/>
+ <field name="REQUEST_KEY_TITLE"/>
+ <field name="REQUEST_TYPE_APPROVAL"/>
+ <field name="RESPONSE_KEY_ERROR_CODE"/>
+ <field name="RESPONSE_KEY_MESSAGE"/>
+ <field name="RESPONSE_KEY_RESPONSE_TIMESTAMP"/>
+ <field name="RESPONSE_KEY_RESULT"/>
+ <field name="RESULT_APPROVED"/>
+ <field name="RESULT_DENIED"/>
+ <field name="RESULT_ERROR"/>
+ <field name="RESULT_ERROR_BAD_REQUEST"/>
+ <field name="RESULT_ERROR_INTERNAL"/>
+ <field name="RESULT_ERROR_NETWORK"/>
+ <field name="RESULT_NO_RESPONSE"/>
+ <field name="RESULT_UNKNOWN_REQUEST"/>
+ </class>
+ <class name="android/content/SearchRecentSuggestionsProvider" since="1">
+ <extends name="android/content/ContentProvider"/>
+ <method name="&lt;init>()V"/>
+ <method name="setupSuggestions(Ljava/lang/String;I)V"/>
+ <field name="DATABASE_MODE_2LINES"/>
+ <field name="DATABASE_MODE_QUERIES"/>
+ </class>
+ <class name="android/content/ServiceConnection" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onBindingDied(Landroid/content/ComponentName;)V" since="26"/>
+ <method name="onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V"/>
+ <method name="onServiceDisconnected(Landroid/content/ComponentName;)V"/>
+ </class>
+ <class name="android/content/SharedPreferences" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="contains(Ljava/lang/String;)Z"/>
+ <method name="edit()Landroid/content/SharedPreferences$Editor;"/>
+ <method name="getAll()Ljava/util/Map;"/>
+ <method name="getBoolean(Ljava/lang/String;Z)Z"/>
+ <method name="getFloat(Ljava/lang/String;F)F"/>
+ <method name="getInt(Ljava/lang/String;I)I"/>
+ <method name="getLong(Ljava/lang/String;J)J"/>
+ <method name="getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getStringSet(Ljava/lang/String;Ljava/util/Set;)Ljava/util/Set;" since="11"/>
+ <method name="registerOnSharedPreferenceChangeListener(Landroid/content/SharedPreferences$OnSharedPreferenceChangeListener;)V"/>
+ <method name="unregisterOnSharedPreferenceChangeListener(Landroid/content/SharedPreferences$OnSharedPreferenceChangeListener;)V"/>
+ </class>
+ <class name="android/content/SharedPreferences$Editor" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="apply()V" since="9"/>
+ <method name="clear()Landroid/content/SharedPreferences$Editor;"/>
+ <method name="commit()Z"/>
+ <method name="putBoolean(Ljava/lang/String;Z)Landroid/content/SharedPreferences$Editor;"/>
+ <method name="putFloat(Ljava/lang/String;F)Landroid/content/SharedPreferences$Editor;"/>
+ <method name="putInt(Ljava/lang/String;I)Landroid/content/SharedPreferences$Editor;"/>
+ <method name="putLong(Ljava/lang/String;J)Landroid/content/SharedPreferences$Editor;"/>
+ <method name="putString(Ljava/lang/String;Ljava/lang/String;)Landroid/content/SharedPreferences$Editor;"/>
+ <method name="putStringSet(Ljava/lang/String;Ljava/util/Set;)Landroid/content/SharedPreferences$Editor;" since="11"/>
+ <method name="remove(Ljava/lang/String;)Landroid/content/SharedPreferences$Editor;"/>
+ </class>
+ <class name="android/content/SharedPreferences$OnSharedPreferenceChangeListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onSharedPreferenceChanged(Landroid/content/SharedPreferences;Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/content/SyncAdapterType" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ZZ)V"/>
+ <method name="allowParallelSyncs()Z" since="11"/>
+ <method name="getSettingsActivity()Ljava/lang/String;" since="14"/>
+ <method name="isAlwaysSyncable()Z" since="11"/>
+ <method name="isUserVisible()Z"/>
+ <method name="newKey(Ljava/lang/String;Ljava/lang/String;)Landroid/content/SyncAdapterType;"/>
+ <method name="supportsUploading()Z"/>
+ <field name="CREATOR"/>
+ <field name="accountType"/>
+ <field name="authority"/>
+ <field name="isKey"/>
+ </class>
+ <class name="android/content/SyncContext" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getSyncContextBinder()Landroid/os/IBinder;"/>
+ <method name="onFinished(Landroid/content/SyncResult;)V"/>
+ </class>
+ <class name="android/content/SyncInfo" since="8">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable" since="11"/>
+ <method name="&lt;init>()V"/>
+ <field name="account"/>
+ <field name="authority"/>
+ <field name="startTime"/>
+ </class>
+ <class name="android/content/SyncRequest" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/content/SyncRequest$Builder" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="build()Landroid/content/SyncRequest;"/>
+ <method name="setDisallowMetered(Z)Landroid/content/SyncRequest$Builder;"/>
+ <method name="setExpedited(Z)Landroid/content/SyncRequest$Builder;"/>
+ <method name="setExtras(Landroid/os/Bundle;)Landroid/content/SyncRequest$Builder;"/>
+ <method name="setIgnoreBackoff(Z)Landroid/content/SyncRequest$Builder;"/>
+ <method name="setIgnoreSettings(Z)Landroid/content/SyncRequest$Builder;"/>
+ <method name="setManual(Z)Landroid/content/SyncRequest$Builder;"/>
+ <method name="setNoRetry(Z)Landroid/content/SyncRequest$Builder;"/>
+ <method name="setRequiresCharging(Z)Landroid/content/SyncRequest$Builder;" since="24"/>
+ <method name="setSyncAdapter(Landroid/accounts/Account;Ljava/lang/String;)Landroid/content/SyncRequest$Builder;"/>
+ <method name="syncOnce()Landroid/content/SyncRequest$Builder;"/>
+ <method name="syncPeriodic(JJ)Landroid/content/SyncRequest$Builder;"/>
+ </class>
+ <class name="android/content/SyncResult" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="clear()V"/>
+ <method name="hasError()Z"/>
+ <method name="hasHardError()Z"/>
+ <method name="hasSoftError()Z"/>
+ <method name="madeSomeProgress()Z"/>
+ <method name="toDebugString()Ljava/lang/String;"/>
+ <field name="ALREADY_IN_PROGRESS"/>
+ <field name="CREATOR"/>
+ <field name="databaseError"/>
+ <field name="delayUntil" since="8"/>
+ <field name="fullSyncRequested"/>
+ <field name="moreRecordsToGet"/>
+ <field name="partialSyncUnavailable"/>
+ <field name="stats"/>
+ <field name="syncAlreadyInProgress"/>
+ <field name="tooManyDeletions"/>
+ <field name="tooManyRetries"/>
+ </class>
+ <class name="android/content/SyncStats" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="clear()V"/>
+ <field name="CREATOR"/>
+ <field name="numAuthExceptions"/>
+ <field name="numConflictDetectedExceptions"/>
+ <field name="numDeletes"/>
+ <field name="numEntries"/>
+ <field name="numInserts"/>
+ <field name="numIoExceptions"/>
+ <field name="numParseExceptions"/>
+ <field name="numSkippedEntries"/>
+ <field name="numUpdates"/>
+ </class>
+ <class name="android/content/SyncStatusObserver" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="onStatusChanged(I)V"/>
+ </class>
+ <class name="android/content/UriMatcher" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="addURI(Ljava/lang/String;Ljava/lang/String;I)V"/>
+ <method name="match(Landroid/net/Uri;)I"/>
+ <field name="NO_MATCH"/>
+ </class>
+ <class name="android/content/UriPermission" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getPersistedTime()J"/>
+ <method name="getUri()Landroid/net/Uri;"/>
+ <method name="isReadPermission()Z"/>
+ <method name="isWritePermission()Z"/>
+ <field name="CREATOR"/>
+ <field name="INVALID_TIME"/>
+ </class>
+ <class name="android/content/pm/ActivityInfo" since="1">
+ <extends name="android/content/pm/ComponentInfo"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/pm/ActivityInfo;)V"/>
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V"/>
+ <method name="getThemeResource()I"/>
+ <field name="COLOR_MODE_DEFAULT" since="26"/>
+ <field name="COLOR_MODE_HDR" since="26"/>
+ <field name="COLOR_MODE_WIDE_COLOR_GAMUT" since="26"/>
+ <field name="CONFIG_COLOR_MODE" since="26"/>
+ <field name="CONFIG_DENSITY" since="17"/>
+ <field name="CONFIG_FONT_SCALE"/>
+ <field name="CONFIG_KEYBOARD"/>
+ <field name="CONFIG_KEYBOARD_HIDDEN"/>
+ <field name="CONFIG_LAYOUT_DIRECTION" since="17"/>
+ <field name="CONFIG_LOCALE"/>
+ <field name="CONFIG_MCC"/>
+ <field name="CONFIG_MNC"/>
+ <field name="CONFIG_NAVIGATION"/>
+ <field name="CONFIG_ORIENTATION"/>
+ <field name="CONFIG_SCREEN_LAYOUT" since="4"/>
+ <field name="CONFIG_SCREEN_SIZE" since="13"/>
+ <field name="CONFIG_SMALLEST_SCREEN_SIZE" since="13"/>
+ <field name="CONFIG_TOUCHSCREEN"/>
+ <field name="CONFIG_UI_MODE" since="8"/>
+ <field name="CREATOR"/>
+ <field name="DOCUMENT_LAUNCH_ALWAYS" since="21"/>
+ <field name="DOCUMENT_LAUNCH_INTO_EXISTING" since="21"/>
+ <field name="DOCUMENT_LAUNCH_NEVER" since="21"/>
+ <field name="DOCUMENT_LAUNCH_NONE" since="21"/>
+ <field name="FLAG_ALLOW_TASK_REPARENTING"/>
+ <field name="FLAG_ALWAYS_RETAIN_TASK_STATE"/>
+ <field name="FLAG_AUTO_REMOVE_FROM_RECENTS" since="21"/>
+ <field name="FLAG_CLEAR_TASK_ON_LAUNCH"/>
+ <field name="FLAG_ENABLE_VR_MODE" since="24"/>
+ <field name="FLAG_EXCLUDE_FROM_RECENTS"/>
+ <field name="FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS" since="5"/>
+ <field name="FLAG_FINISH_ON_TASK_LAUNCH"/>
+ <field name="FLAG_HARDWARE_ACCELERATED" since="11"/>
+ <field name="FLAG_IMMERSIVE" since="18"/>
+ <field name="FLAG_MULTIPROCESS"/>
+ <field name="FLAG_NO_HISTORY" since="3"/>
+ <field name="FLAG_RELINQUISH_TASK_IDENTITY" since="21"/>
+ <field name="FLAG_RESUME_WHILE_PAUSING" since="21"/>
+ <field name="FLAG_SINGLE_USER" since="17"/>
+ <field name="FLAG_STATE_NOT_NEEDED"/>
+ <field name="LAUNCH_MULTIPLE"/>
+ <field name="LAUNCH_SINGLE_INSTANCE"/>
+ <field name="LAUNCH_SINGLE_TASK"/>
+ <field name="LAUNCH_SINGLE_TOP"/>
+ <field name="PERSIST_ACROSS_REBOOTS" since="21"/>
+ <field name="PERSIST_NEVER" since="21"/>
+ <field name="PERSIST_ROOT_ONLY" since="21"/>
+ <field name="SCREEN_ORIENTATION_BEHIND"/>
+ <field name="SCREEN_ORIENTATION_FULL_SENSOR" since="9"/>
+ <field name="SCREEN_ORIENTATION_FULL_USER" since="18"/>
+ <field name="SCREEN_ORIENTATION_LANDSCAPE"/>
+ <field name="SCREEN_ORIENTATION_LOCKED" since="18"/>
+ <field name="SCREEN_ORIENTATION_NOSENSOR"/>
+ <field name="SCREEN_ORIENTATION_PORTRAIT"/>
+ <field name="SCREEN_ORIENTATION_REVERSE_LANDSCAPE" since="9"/>
+ <field name="SCREEN_ORIENTATION_REVERSE_PORTRAIT" since="9"/>
+ <field name="SCREEN_ORIENTATION_SENSOR"/>
+ <field name="SCREEN_ORIENTATION_SENSOR_LANDSCAPE" since="9"/>
+ <field name="SCREEN_ORIENTATION_SENSOR_PORTRAIT" since="9"/>
+ <field name="SCREEN_ORIENTATION_UNSPECIFIED"/>
+ <field name="SCREEN_ORIENTATION_USER"/>
+ <field name="SCREEN_ORIENTATION_USER_LANDSCAPE" since="18"/>
+ <field name="SCREEN_ORIENTATION_USER_PORTRAIT" since="18"/>
+ <field name="UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW" since="14"/>
+ <field name="colorMode" since="26"/>
+ <field name="configChanges"/>
+ <field name="documentLaunchMode" since="21"/>
+ <field name="flags"/>
+ <field name="launchMode"/>
+ <field name="maxRecents" since="21"/>
+ <field name="parentActivityName" since="16"/>
+ <field name="permission"/>
+ <field name="persistableMode" since="21"/>
+ <field name="screenOrientation"/>
+ <field name="softInputMode" since="3"/>
+ <field name="targetActivity"/>
+ <field name="taskAffinity"/>
+ <field name="theme"/>
+ <field name="uiOptions" since="14"/>
+ <field name="windowLayout" since="24"/>
+ </class>
+ <class name="android/content/pm/ActivityInfo$WindowLayout" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(IFIFIII)V"/>
+ <field name="gravity"/>
+ <field name="height"/>
+ <field name="heightFraction"/>
+ <field name="minHeight"/>
+ <field name="minWidth"/>
+ <field name="width"/>
+ <field name="widthFraction"/>
+ </class>
+ <class name="android/content/pm/ApplicationInfo" since="1">
+ <extends name="android/content/pm/PackageItemInfo"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/pm/ApplicationInfo;)V"/>
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V"/>
+ <method name="getCategoryTitle(Landroid/content/Context;I)Ljava/lang/CharSequence;" since="26"/>
+ <method name="loadDescription(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;"/>
+ <field name="CATEGORY_AUDIO" since="26"/>
+ <field name="CATEGORY_GAME" since="26"/>
+ <field name="CATEGORY_IMAGE" since="26"/>
+ <field name="CATEGORY_MAPS" since="26"/>
+ <field name="CATEGORY_NEWS" since="26"/>
+ <field name="CATEGORY_PRODUCTIVITY" since="26"/>
+ <field name="CATEGORY_SOCIAL" since="26"/>
+ <field name="CATEGORY_UNDEFINED" since="26"/>
+ <field name="CATEGORY_VIDEO" since="26"/>
+ <field name="CREATOR"/>
+ <field name="FLAG_ALLOW_BACKUP" since="8"/>
+ <field name="FLAG_ALLOW_CLEAR_USER_DATA"/>
+ <field name="FLAG_ALLOW_TASK_REPARENTING"/>
+ <field name="FLAG_DEBUGGABLE"/>
+ <field name="FLAG_EXTERNAL_STORAGE" since="8"/>
+ <field name="FLAG_EXTRACT_NATIVE_LIBS" since="23"/>
+ <field name="FLAG_FACTORY_TEST"/>
+ <field name="FLAG_FULL_BACKUP_ONLY" since="21"/>
+ <field name="FLAG_HARDWARE_ACCELERATED" since="23"/>
+ <field name="FLAG_HAS_CODE"/>
+ <field name="FLAG_INSTALLED" since="17"/>
+ <field name="FLAG_IS_DATA_ONLY" since="17"/>
+ <field name="FLAG_IS_GAME" since="21" deprecated="26"/>
+ <field name="FLAG_KILL_AFTER_RESTORE" since="8"/>
+ <field name="FLAG_LARGE_HEAP" since="11"/>
+ <field name="FLAG_MULTIARCH" since="21"/>
+ <field name="FLAG_PERSISTENT"/>
+ <field name="FLAG_RESIZEABLE_FOR_SCREENS" since="4"/>
+ <field name="FLAG_RESTORE_ANY_VERSION" since="8"/>
+ <field name="FLAG_STOPPED" since="12"/>
+ <field name="FLAG_SUPPORTS_LARGE_SCREENS" since="4"/>
+ <field name="FLAG_SUPPORTS_NORMAL_SCREENS" since="4"/>
+ <field name="FLAG_SUPPORTS_RTL" since="17"/>
+ <field name="FLAG_SUPPORTS_SCREEN_DENSITIES" since="4"/>
+ <field name="FLAG_SUPPORTS_SMALL_SCREENS" since="4"/>
+ <field name="FLAG_SUPPORTS_XLARGE_SCREENS" since="11"/>
+ <field name="FLAG_SUSPENDED" since="24"/>
+ <field name="FLAG_SYSTEM"/>
+ <field name="FLAG_TEST_ONLY" since="4"/>
+ <field name="FLAG_UPDATED_SYSTEM_APP" since="4"/>
+ <field name="FLAG_USES_CLEARTEXT_TRAFFIC" since="23"/>
+ <field name="FLAG_VM_SAFE_MODE" since="8"/>
+ <field name="backupAgentName" since="8"/>
+ <field name="category" since="26"/>
+ <field name="className"/>
+ <field name="compatibleWidthLimitDp" since="13"/>
+ <field name="dataDir"/>
+ <field name="descriptionRes"/>
+ <field name="deviceProtectedDataDir" since="24"/>
+ <field name="enabled"/>
+ <field name="flags"/>
+ <field name="largestWidthLimitDp" since="13"/>
+ <field name="manageSpaceActivityName"/>
+ <field name="minSdkVersion" since="24"/>
+ <field name="nativeLibraryDir" since="9"/>
+ <field name="permission"/>
+ <field name="processName"/>
+ <field name="publicSourceDir"/>
+ <field name="requiresSmallestWidthDp" since="13"/>
+ <field name="sharedLibraryFiles"/>
+ <field name="sourceDir"/>
+ <field name="splitNames" since="26"/>
+ <field name="splitPublicSourceDirs" since="21"/>
+ <field name="splitSourceDirs" since="21"/>
+ <field name="storageUuid" since="26"/>
+ <field name="targetSdkVersion" since="4"/>
+ <field name="taskAffinity"/>
+ <field name="theme"/>
+ <field name="uiOptions" since="14"/>
+ <field name="uid"/>
+ </class>
+ <class name="android/content/pm/ApplicationInfo$DisplayNameComparator" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Comparator"/>
+ <method name="&lt;init>(Landroid/content/pm/PackageManager;)V"/>
+ <method name="compare(Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;)I"/>
+ </class>
+ <class name="android/content/pm/ChangedPackages" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(ILjava/util/List;)V"/>
+ <method name="getPackageNames()Ljava/util/List;"/>
+ <method name="getSequenceNumber()I"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/content/pm/ComponentInfo" since="1">
+ <extends name="android/content/pm/PackageItemInfo"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/pm/ComponentInfo;)V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="getBannerResource()I" since="20"/>
+ <method name="getIconResource()I"/>
+ <method name="getLogoResource()I" since="19"/>
+ <method name="isEnabled()Z" since="11"/>
+ <field name="applicationInfo"/>
+ <field name="descriptionRes" since="8"/>
+ <field name="directBootAware" since="24"/>
+ <field name="enabled"/>
+ <field name="exported"/>
+ <field name="processName"/>
+ <field name="splitName" since="26"/>
+ </class>
+ <class name="android/content/pm/ConfigurationInfo" since="3">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/pm/ConfigurationInfo;)V"/>
+ <method name="getGlEsVersion()Ljava/lang/String;" since="4"/>
+ <field name="CREATOR"/>
+ <field name="GL_ES_VERSION_UNDEFINED" since="4"/>
+ <field name="INPUT_FEATURE_FIVE_WAY_NAV"/>
+ <field name="INPUT_FEATURE_HARD_KEYBOARD"/>
+ <field name="reqGlEsVersion" since="4"/>
+ <field name="reqInputFeatures"/>
+ <field name="reqKeyboardType"/>
+ <field name="reqNavigation"/>
+ <field name="reqTouchScreen"/>
+ </class>
+ <class name="android/content/pm/FeatureGroupInfo" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/pm/FeatureGroupInfo;)V"/>
+ <field name="CREATOR"/>
+ <field name="features"/>
+ </class>
+ <class name="android/content/pm/FeatureInfo" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/pm/FeatureInfo;)V"/>
+ <method name="getGlEsVersion()Ljava/lang/String;"/>
+ <field name="CREATOR"/>
+ <field name="FLAG_REQUIRED"/>
+ <field name="GL_ES_VERSION_UNDEFINED"/>
+ <field name="flags"/>
+ <field name="name"/>
+ <field name="reqGlEsVersion"/>
+ <field name="version" since="24"/>
+ </class>
+ <class name="android/content/pm/IPackageInstallObserver" since="1" removed="4">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/IInterface"/>
+ <method name="packageInstalled(Ljava/lang/String;I)V"/>
+ </class>
+ <class name="android/content/pm/IPackageInstallObserver$Stub" since="1" removed="4">
+ <extends name="android/os/Binder"/>
+ <implements name="android/content/pm/IPackageInstallObserver"/>
+ <method name="&lt;init>()V"/>
+ <method name="asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageInstallObserver;"/>
+ </class>
+ <class name="android/content/pm/InstrumentationInfo" since="1">
+ <extends name="android/content/pm/PackageItemInfo"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/pm/InstrumentationInfo;)V"/>
+ <field name="CREATOR"/>
+ <field name="dataDir"/>
+ <field name="functionalTest"/>
+ <field name="handleProfiling"/>
+ <field name="publicSourceDir"/>
+ <field name="sourceDir"/>
+ <field name="splitNames" since="26"/>
+ <field name="splitPublicSourceDirs" since="21"/>
+ <field name="splitSourceDirs" since="21"/>
+ <field name="targetPackage"/>
+ <field name="targetProcesses" since="26"/>
+ </class>
+ <class name="android/content/pm/LabeledIntent" since="5">
+ <extends name="android/content/Intent"/>
+ <method name="&lt;init>(Landroid/content/Intent;Ljava/lang/String;II)V"/>
+ <method name="&lt;init>(Landroid/content/Intent;Ljava/lang/String;Ljava/lang/CharSequence;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;II)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/CharSequence;I)V"/>
+ <method name="getIconResource()I"/>
+ <method name="getLabelResource()I"/>
+ <method name="getNonLocalizedLabel()Ljava/lang/CharSequence;"/>
+ <method name="getSourcePackage()Ljava/lang/String;"/>
+ <method name="loadIcon(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;"/>
+ <method name="loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/content/pm/LauncherActivityInfo" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getApplicationInfo()Landroid/content/pm/ApplicationInfo;"/>
+ <method name="getBadgedIcon(I)Landroid/graphics/drawable/Drawable;"/>
+ <method name="getComponentName()Landroid/content/ComponentName;"/>
+ <method name="getFirstInstallTime()J"/>
+ <method name="getIcon(I)Landroid/graphics/drawable/Drawable;"/>
+ <method name="getLabel()Ljava/lang/CharSequence;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getUser()Landroid/os/UserHandle;"/>
+ </class>
+ <class name="android/content/pm/LauncherApps" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getActivityList(Ljava/lang/String;Landroid/os/UserHandle;)Ljava/util/List;"/>
+ <method name="getApplicationInfo(Ljava/lang/String;ILandroid/os/UserHandle;)Landroid/content/pm/ApplicationInfo;" since="26"/>
+ <method name="getPinItemRequest(Landroid/content/Intent;)Landroid/content/pm/LauncherApps$PinItemRequest;" since="26"/>
+ <method name="getProfiles()Ljava/util/List;" since="26"/>
+ <method name="getShortcutBadgedIconDrawable(Landroid/content/pm/ShortcutInfo;I)Landroid/graphics/drawable/Drawable;" since="25"/>
+ <method name="getShortcutConfigActivityIntent(Landroid/content/pm/LauncherActivityInfo;)Landroid/content/IntentSender;" since="26"/>
+ <method name="getShortcutConfigActivityList(Ljava/lang/String;Landroid/os/UserHandle;)Ljava/util/List;" since="26"/>
+ <method name="getShortcutIconDrawable(Landroid/content/pm/ShortcutInfo;I)Landroid/graphics/drawable/Drawable;" since="25"/>
+ <method name="getShortcuts(Landroid/content/pm/LauncherApps$ShortcutQuery;Landroid/os/UserHandle;)Ljava/util/List;" since="25"/>
+ <method name="hasShortcutHostPermission()Z" since="25"/>
+ <method name="isActivityEnabled(Landroid/content/ComponentName;Landroid/os/UserHandle;)Z"/>
+ <method name="isPackageEnabled(Ljava/lang/String;Landroid/os/UserHandle;)Z"/>
+ <method name="pinShortcuts(Ljava/lang/String;Ljava/util/List;Landroid/os/UserHandle;)V" since="25"/>
+ <method name="registerCallback(Landroid/content/pm/LauncherApps$Callback;)V"/>
+ <method name="registerCallback(Landroid/content/pm/LauncherApps$Callback;Landroid/os/Handler;)V"/>
+ <method name="resolveActivity(Landroid/content/Intent;Landroid/os/UserHandle;)Landroid/content/pm/LauncherActivityInfo;"/>
+ <method name="startAppDetailsActivity(Landroid/content/ComponentName;Landroid/os/UserHandle;Landroid/graphics/Rect;Landroid/os/Bundle;)V"/>
+ <method name="startMainActivity(Landroid/content/ComponentName;Landroid/os/UserHandle;Landroid/graphics/Rect;Landroid/os/Bundle;)V"/>
+ <method name="startShortcut(Landroid/content/pm/ShortcutInfo;Landroid/graphics/Rect;Landroid/os/Bundle;)V" since="25"/>
+ <method name="startShortcut(Ljava/lang/String;Ljava/lang/String;Landroid/graphics/Rect;Landroid/os/Bundle;Landroid/os/UserHandle;)V" since="25"/>
+ <method name="unregisterCallback(Landroid/content/pm/LauncherApps$Callback;)V"/>
+ <field name="ACTION_CONFIRM_PIN_APPWIDGET" since="26"/>
+ <field name="ACTION_CONFIRM_PIN_SHORTCUT" since="26"/>
+ <field name="EXTRA_PIN_ITEM_REQUEST" since="26"/>
+ </class>
+ <class name="android/content/pm/LauncherApps$Callback" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onPackageAdded(Ljava/lang/String;Landroid/os/UserHandle;)V"/>
+ <method name="onPackageChanged(Ljava/lang/String;Landroid/os/UserHandle;)V"/>
+ <method name="onPackageRemoved(Ljava/lang/String;Landroid/os/UserHandle;)V"/>
+ <method name="onPackagesAvailable([Ljava/lang/String;Landroid/os/UserHandle;Z)V"/>
+ <method name="onPackagesSuspended([Ljava/lang/String;Landroid/os/UserHandle;)V" since="24"/>
+ <method name="onPackagesUnavailable([Ljava/lang/String;Landroid/os/UserHandle;Z)V"/>
+ <method name="onPackagesUnsuspended([Ljava/lang/String;Landroid/os/UserHandle;)V" since="24"/>
+ <method name="onShortcutsChanged(Ljava/lang/String;Ljava/util/List;Landroid/os/UserHandle;)V" since="25"/>
+ </class>
+ <class name="android/content/pm/LauncherApps$PinItemRequest" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="accept()Z"/>
+ <method name="accept(Landroid/os/Bundle;)Z"/>
+ <method name="getAppWidgetProviderInfo(Landroid/content/Context;)Landroid/appwidget/AppWidgetProviderInfo;"/>
+ <method name="getExtras()Landroid/os/Bundle;"/>
+ <method name="getRequestType()I"/>
+ <method name="getShortcutInfo()Landroid/content/pm/ShortcutInfo;"/>
+ <method name="isValid()Z"/>
+ <field name="CREATOR"/>
+ <field name="REQUEST_TYPE_APPWIDGET"/>
+ <field name="REQUEST_TYPE_SHORTCUT"/>
+ </class>
+ <class name="android/content/pm/LauncherApps$ShortcutQuery" since="25">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="setActivity(Landroid/content/ComponentName;)Landroid/content/pm/LauncherApps$ShortcutQuery;"/>
+ <method name="setChangedSince(J)Landroid/content/pm/LauncherApps$ShortcutQuery;"/>
+ <method name="setPackage(Ljava/lang/String;)Landroid/content/pm/LauncherApps$ShortcutQuery;"/>
+ <method name="setQueryFlags(I)Landroid/content/pm/LauncherApps$ShortcutQuery;"/>
+ <method name="setShortcutIds(Ljava/util/List;)Landroid/content/pm/LauncherApps$ShortcutQuery;"/>
+ <field name="FLAG_GET_KEY_FIELDS_ONLY"/>
+ <field name="FLAG_MATCH_DYNAMIC"/>
+ <field name="FLAG_MATCH_MANIFEST"/>
+ <field name="FLAG_MATCH_PINNED"/>
+ </class>
+ <class name="android/content/pm/PackageInfo" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <field name="CREATOR"/>
+ <field name="INSTALL_LOCATION_AUTO" since="21"/>
+ <field name="INSTALL_LOCATION_INTERNAL_ONLY" since="21"/>
+ <field name="INSTALL_LOCATION_PREFER_EXTERNAL" since="21"/>
+ <field name="REQUESTED_PERMISSION_GRANTED" since="16"/>
+ <field name="REQUESTED_PERMISSION_REQUIRED" since="16" removed="23"/>
+ <field name="activities"/>
+ <field name="applicationInfo"/>
+ <field name="baseRevisionCode" since="22"/>
+ <field name="configPreferences" since="3"/>
+ <field name="featureGroups" since="21"/>
+ <field name="firstInstallTime" since="9"/>
+ <field name="gids"/>
+ <field name="installLocation" since="21"/>
+ <field name="instrumentation"/>
+ <field name="lastUpdateTime" since="9"/>
+ <field name="packageName"/>
+ <field name="permissions"/>
+ <field name="providers"/>
+ <field name="receivers"/>
+ <field name="reqFeatures" since="5"/>
+ <field name="requestedPermissions"/>
+ <field name="requestedPermissionsFlags" since="16"/>
+ <field name="services"/>
+ <field name="sharedUserId" since="3"/>
+ <field name="sharedUserLabel" since="3"/>
+ <field name="signatures"/>
+ <field name="splitNames" since="21"/>
+ <field name="splitRevisionCodes" since="22"/>
+ <field name="versionCode"/>
+ <field name="versionName"/>
+ </class>
+ <class name="android/content/pm/PackageInstaller" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="abandonSession(I)V"/>
+ <method name="createSession(Landroid/content/pm/PackageInstaller$SessionParams;)I"/>
+ <method name="getAllSessions()Ljava/util/List;"/>
+ <method name="getMySessions()Ljava/util/List;"/>
+ <method name="getSessionInfo(I)Landroid/content/pm/PackageInstaller$SessionInfo;"/>
+ <method name="openSession(I)Landroid/content/pm/PackageInstaller$Session;"/>
+ <method name="registerSessionCallback(Landroid/content/pm/PackageInstaller$SessionCallback;)V"/>
+ <method name="registerSessionCallback(Landroid/content/pm/PackageInstaller$SessionCallback;Landroid/os/Handler;)V"/>
+ <method name="uninstall(Landroid/content/pm/VersionedPackage;Landroid/content/IntentSender;)V" since="26"/>
+ <method name="uninstall(Ljava/lang/String;Landroid/content/IntentSender;)V"/>
+ <method name="unregisterSessionCallback(Landroid/content/pm/PackageInstaller$SessionCallback;)V"/>
+ <method name="updateSessionAppIcon(ILandroid/graphics/Bitmap;)V"/>
+ <method name="updateSessionAppLabel(ILjava/lang/CharSequence;)V"/>
+ <field name="ACTION_SESSION_COMMITTED" since="26"/>
+ <field name="ACTION_SESSION_DETAILS"/>
+ <field name="EXTRA_OTHER_PACKAGE_NAME"/>
+ <field name="EXTRA_PACKAGE_NAME"/>
+ <field name="EXTRA_SESSION" since="26"/>
+ <field name="EXTRA_SESSION_ID"/>
+ <field name="EXTRA_STATUS"/>
+ <field name="EXTRA_STATUS_MESSAGE"/>
+ <field name="EXTRA_STORAGE_PATH"/>
+ <field name="STATUS_FAILURE"/>
+ <field name="STATUS_FAILURE_ABORTED"/>
+ <field name="STATUS_FAILURE_BLOCKED"/>
+ <field name="STATUS_FAILURE_CONFLICT"/>
+ <field name="STATUS_FAILURE_INCOMPATIBLE"/>
+ <field name="STATUS_FAILURE_INVALID"/>
+ <field name="STATUS_FAILURE_STORAGE"/>
+ <field name="STATUS_PENDING_USER_ACTION"/>
+ <field name="STATUS_SUCCESS"/>
+ </class>
+ <class name="android/content/pm/PackageInstaller$Session" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable"/>
+ <method name="&lt;init>()V"/>
+ <method name="abandon()V"/>
+ <method name="commit(Landroid/content/IntentSender;)V"/>
+ <method name="fsync(Ljava/io/OutputStream;)V"/>
+ <method name="getNames()[Ljava/lang/String;"/>
+ <method name="openRead(Ljava/lang/String;)Ljava/io/InputStream;"/>
+ <method name="openWrite(Ljava/lang/String;JJ)Ljava/io/OutputStream;"/>
+ <method name="removeSplit(Ljava/lang/String;)V" since="24"/>
+ <method name="setStagingProgress(F)V"/>
+ </class>
+ <class name="android/content/pm/PackageInstaller$SessionCallback" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onActiveChanged(IZ)V"/>
+ <method name="onBadgingChanged(I)V"/>
+ <method name="onCreated(I)V"/>
+ <method name="onFinished(IZ)V"/>
+ <method name="onProgressChanged(IF)V"/>
+ </class>
+ <class name="android/content/pm/PackageInstaller$SessionInfo" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="createDetailsIntent()Landroid/content/Intent;"/>
+ <method name="getAppIcon()Landroid/graphics/Bitmap;"/>
+ <method name="getAppLabel()Ljava/lang/CharSequence;"/>
+ <method name="getAppPackageName()Ljava/lang/String;"/>
+ <method name="getInstallReason()I" since="26"/>
+ <method name="getInstallerPackageName()Ljava/lang/String;"/>
+ <method name="getProgress()F"/>
+ <method name="getSessionId()I"/>
+ <method name="isActive()Z"/>
+ <method name="isSealed()Z" since="26"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/content/pm/PackageInstaller$SessionParams" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="setAppIcon(Landroid/graphics/Bitmap;)V"/>
+ <method name="setAppLabel(Ljava/lang/CharSequence;)V"/>
+ <method name="setAppPackageName(Ljava/lang/String;)V"/>
+ <method name="setInstallLocation(I)V"/>
+ <method name="setInstallReason(I)V" since="26"/>
+ <method name="setOriginatingUid(I)V" since="24"/>
+ <method name="setOriginatingUri(Landroid/net/Uri;)V"/>
+ <method name="setReferrerUri(Landroid/net/Uri;)V"/>
+ <method name="setSize(J)V"/>
+ <field name="CREATOR"/>
+ <field name="MODE_FULL_INSTALL"/>
+ <field name="MODE_INHERIT_EXISTING"/>
+ </class>
+ <class name="android/content/pm/PackageItemInfo" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/pm/PackageItemInfo;)V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="dumpBack(Landroid/util/Printer;Ljava/lang/String;)V"/>
+ <method name="dumpFront(Landroid/util/Printer;Ljava/lang/String;)V"/>
+ <method name="loadBanner(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;" since="20"/>
+ <method name="loadIcon(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;"/>
+ <method name="loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;"/>
+ <method name="loadLogo(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;" since="9"/>
+ <method name="loadUnbadgedIcon(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;" since="22"/>
+ <method name="loadXmlMetaData(Landroid/content/pm/PackageManager;Ljava/lang/String;)Landroid/content/res/XmlResourceParser;"/>
+ <method name="writeToParcel(Landroid/os/Parcel;I)V"/>
+ <field name="banner" since="20"/>
+ <field name="icon"/>
+ <field name="labelRes"/>
+ <field name="logo" since="9"/>
+ <field name="metaData"/>
+ <field name="name"/>
+ <field name="nonLocalizedLabel"/>
+ <field name="packageName"/>
+ </class>
+ <class name="android/content/pm/PackageItemInfo$DisplayNameComparator" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Comparator"/>
+ <method name="&lt;init>(Landroid/content/pm/PackageManager;)V"/>
+ <method name="compare(Landroid/content/pm/PackageItemInfo;Landroid/content/pm/PackageItemInfo;)I"/>
+ </class>
+ <class name="android/content/pm/PackageManager" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addPackageToPreferred(Ljava/lang/String;)V" deprecated="16"/>
+ <method name="addPermission(Landroid/content/pm/PermissionInfo;)Z"/>
+ <method name="addPermissionAsync(Landroid/content/pm/PermissionInfo;)Z" since="8"/>
+ <method name="addPreferredActivity(Landroid/content/IntentFilter;I[Landroid/content/ComponentName;Landroid/content/ComponentName;)V" deprecated="16"/>
+ <method name="canRequestPackageInstalls()Z" since="26"/>
+ <method name="canonicalToCurrentPackageNames([Ljava/lang/String;)[Ljava/lang/String;" since="8"/>
+ <method name="checkPermission(Ljava/lang/String;Ljava/lang/String;)I"/>
+ <method name="checkSignatures(II)I" since="5"/>
+ <method name="checkSignatures(Ljava/lang/String;Ljava/lang/String;)I"/>
+ <method name="clearInstantAppCookie()V" since="26"/>
+ <method name="clearPackagePreferredActivities(Ljava/lang/String;)V"/>
+ <method name="currentToCanonicalPackageNames([Ljava/lang/String;)[Ljava/lang/String;" since="8"/>
+ <method name="extendVerificationTimeout(IIJ)V" since="17"/>
+ <method name="getActivityBanner(Landroid/content/ComponentName;)Landroid/graphics/drawable/Drawable;" since="20"/>
+ <method name="getActivityBanner(Landroid/content/Intent;)Landroid/graphics/drawable/Drawable;" since="20"/>
+ <method name="getActivityIcon(Landroid/content/ComponentName;)Landroid/graphics/drawable/Drawable;"/>
+ <method name="getActivityIcon(Landroid/content/Intent;)Landroid/graphics/drawable/Drawable;"/>
+ <method name="getActivityInfo(Landroid/content/ComponentName;I)Landroid/content/pm/ActivityInfo;"/>
+ <method name="getActivityLogo(Landroid/content/ComponentName;)Landroid/graphics/drawable/Drawable;" since="9"/>
+ <method name="getActivityLogo(Landroid/content/Intent;)Landroid/graphics/drawable/Drawable;" since="9"/>
+ <method name="getAllPermissionGroups(I)Ljava/util/List;"/>
+ <method name="getApplicationBanner(Landroid/content/pm/ApplicationInfo;)Landroid/graphics/drawable/Drawable;" since="20"/>
+ <method name="getApplicationBanner(Ljava/lang/String;)Landroid/graphics/drawable/Drawable;" since="20"/>
+ <method name="getApplicationEnabledSetting(Ljava/lang/String;)I"/>
+ <method name="getApplicationIcon(Landroid/content/pm/ApplicationInfo;)Landroid/graphics/drawable/Drawable;"/>
+ <method name="getApplicationIcon(Ljava/lang/String;)Landroid/graphics/drawable/Drawable;"/>
+ <method name="getApplicationInfo(Ljava/lang/String;I)Landroid/content/pm/ApplicationInfo;"/>
+ <method name="getApplicationLabel(Landroid/content/pm/ApplicationInfo;)Ljava/lang/CharSequence;"/>
+ <method name="getApplicationLogo(Landroid/content/pm/ApplicationInfo;)Landroid/graphics/drawable/Drawable;" since="9"/>
+ <method name="getApplicationLogo(Ljava/lang/String;)Landroid/graphics/drawable/Drawable;" since="9"/>
+ <method name="getChangedPackages(I)Landroid/content/pm/ChangedPackages;" since="26"/>
+ <method name="getComponentEnabledSetting(Landroid/content/ComponentName;)I"/>
+ <method name="getDefaultActivityIcon()Landroid/graphics/drawable/Drawable;"/>
+ <method name="getDrawable(Ljava/lang/String;ILandroid/content/pm/ApplicationInfo;)Landroid/graphics/drawable/Drawable;"/>
+ <method name="getInstalledApplications(I)Ljava/util/List;"/>
+ <method name="getInstalledPackages(I)Ljava/util/List;"/>
+ <method name="getInstallerPackageName(Ljava/lang/String;)Ljava/lang/String;" since="5"/>
+ <method name="getInstantAppCookie()[B" since="26"/>
+ <method name="getInstantAppCookieMaxBytes()I" since="26"/>
+ <method name="getInstrumentationInfo(Landroid/content/ComponentName;I)Landroid/content/pm/InstrumentationInfo;"/>
+ <method name="getLaunchIntentForPackage(Ljava/lang/String;)Landroid/content/Intent;" since="3"/>
+ <method name="getLeanbackLaunchIntentForPackage(Ljava/lang/String;)Landroid/content/Intent;" since="21"/>
+ <method name="getNameForUid(I)Ljava/lang/String;"/>
+ <method name="getPackageArchiveInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;"/>
+ <method name="getPackageGids(Ljava/lang/String;)[I"/>
+ <method name="getPackageGids(Ljava/lang/String;I)[I" since="24"/>
+ <method name="getPackageInfo(Landroid/content/pm/VersionedPackage;I)Landroid/content/pm/PackageInfo;" since="26"/>
+ <method name="getPackageInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;"/>
+ <method name="getPackageInstaller()Landroid/content/pm/PackageInstaller;" since="21"/>
+ <method name="getPackageUid(Ljava/lang/String;I)I" since="24"/>
+ <method name="getPackagesForUid(I)[Ljava/lang/String;"/>
+ <method name="getPackagesHoldingPermissions([Ljava/lang/String;I)Ljava/util/List;" since="18"/>
+ <method name="getPermissionGroupInfo(Ljava/lang/String;I)Landroid/content/pm/PermissionGroupInfo;"/>
+ <method name="getPermissionInfo(Ljava/lang/String;I)Landroid/content/pm/PermissionInfo;"/>
+ <method name="getPreferredActivities(Ljava/util/List;Ljava/util/List;Ljava/lang/String;)I"/>
+ <method name="getPreferredPackages(I)Ljava/util/List;"/>
+ <method name="getProviderInfo(Landroid/content/ComponentName;I)Landroid/content/pm/ProviderInfo;" since="9"/>
+ <method name="getReceiverInfo(Landroid/content/ComponentName;I)Landroid/content/pm/ActivityInfo;"/>
+ <method name="getResourcesForActivity(Landroid/content/ComponentName;)Landroid/content/res/Resources;"/>
+ <method name="getResourcesForApplication(Landroid/content/pm/ApplicationInfo;)Landroid/content/res/Resources;"/>
+ <method name="getResourcesForApplication(Ljava/lang/String;)Landroid/content/res/Resources;"/>
+ <method name="getServiceInfo(Landroid/content/ComponentName;I)Landroid/content/pm/ServiceInfo;"/>
+ <method name="getSharedLibraries(I)Ljava/util/List;" since="26"/>
+ <method name="getSystemAvailableFeatures()[Landroid/content/pm/FeatureInfo;" since="5"/>
+ <method name="getSystemSharedLibraryNames()[Ljava/lang/String;" since="3"/>
+ <method name="getText(Ljava/lang/String;ILandroid/content/pm/ApplicationInfo;)Ljava/lang/CharSequence;"/>
+ <method name="getUserBadgedDrawableForDensity(Landroid/graphics/drawable/Drawable;Landroid/os/UserHandle;Landroid/graphics/Rect;I)Landroid/graphics/drawable/Drawable;" since="21"/>
+ <method name="getUserBadgedIcon(Landroid/graphics/drawable/Drawable;Landroid/os/UserHandle;)Landroid/graphics/drawable/Drawable;" since="21"/>
+ <method name="getUserBadgedLabel(Ljava/lang/CharSequence;Landroid/os/UserHandle;)Ljava/lang/CharSequence;" since="21"/>
+ <method name="getXml(Ljava/lang/String;ILandroid/content/pm/ApplicationInfo;)Landroid/content/res/XmlResourceParser;"/>
+ <method name="hasSystemFeature(Ljava/lang/String;)Z" since="5"/>
+ <method name="hasSystemFeature(Ljava/lang/String;I)Z" since="24"/>
+ <method name="installPackage(Landroid/net/Uri;)V" removed="4"/>
+ <method name="installPackage(Landroid/net/Uri;Landroid/content/pm/IPackageInstallObserver;I)V" removed="4"/>
+ <method name="isInstantApp()Z" since="26"/>
+ <method name="isInstantApp(Ljava/lang/String;)Z" since="26"/>
+ <method name="isPermissionRevokedByPolicy(Ljava/lang/String;Ljava/lang/String;)Z" since="23"/>
+ <method name="isSafeMode()Z" since="3"/>
+ <method name="queryBroadcastReceivers(Landroid/content/Intent;I)Ljava/util/List;"/>
+ <method name="queryContentProviders(Ljava/lang/String;II)Ljava/util/List;"/>
+ <method name="queryInstrumentation(Ljava/lang/String;I)Ljava/util/List;"/>
+ <method name="queryIntentActivities(Landroid/content/Intent;I)Ljava/util/List;"/>
+ <method name="queryIntentActivityOptions(Landroid/content/ComponentName;[Landroid/content/Intent;Landroid/content/Intent;I)Ljava/util/List;"/>
+ <method name="queryIntentContentProviders(Landroid/content/Intent;I)Ljava/util/List;" since="19"/>
+ <method name="queryIntentServices(Landroid/content/Intent;I)Ljava/util/List;"/>
+ <method name="queryPermissionsByGroup(Ljava/lang/String;I)Ljava/util/List;"/>
+ <method name="removePackageFromPreferred(Ljava/lang/String;)V" deprecated="16"/>
+ <method name="removePermission(Ljava/lang/String;)V"/>
+ <method name="resolveActivity(Landroid/content/Intent;I)Landroid/content/pm/ResolveInfo;"/>
+ <method name="resolveContentProvider(Ljava/lang/String;I)Landroid/content/pm/ProviderInfo;"/>
+ <method name="resolveService(Landroid/content/Intent;I)Landroid/content/pm/ResolveInfo;"/>
+ <method name="setApplicationCategoryHint(Ljava/lang/String;I)V" since="26"/>
+ <method name="setApplicationEnabledSetting(Ljava/lang/String;II)V"/>
+ <method name="setComponentEnabledSetting(Landroid/content/ComponentName;II)V"/>
+ <method name="setInstallerPackageName(Ljava/lang/String;Ljava/lang/String;)V" since="11"/>
+ <method name="updateInstantAppCookie([B)V" since="26"/>
+ <method name="verifyPendingInstall(II)V" since="14"/>
+ <field name="COMPONENT_ENABLED_STATE_DEFAULT"/>
+ <field name="COMPONENT_ENABLED_STATE_DISABLED"/>
+ <field name="COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED" since="18"/>
+ <field name="COMPONENT_ENABLED_STATE_DISABLED_USER" since="14"/>
+ <field name="COMPONENT_ENABLED_STATE_ENABLED"/>
+ <field name="DONT_KILL_APP"/>
+ <field name="EXTRA_VERIFICATION_ID" since="14"/>
+ <field name="EXTRA_VERIFICATION_RESULT" since="17"/>
+ <field name="FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS" since="26"/>
+ <field name="FEATURE_APP_WIDGETS" since="18"/>
+ <field name="FEATURE_AUDIO_LOW_LATENCY" since="9"/>
+ <field name="FEATURE_AUDIO_OUTPUT" since="21"/>
+ <field name="FEATURE_AUDIO_PRO" since="23"/>
+ <field name="FEATURE_AUTOFILL" since="26"/>
+ <field name="FEATURE_AUTOMOTIVE" since="23"/>
+ <field name="FEATURE_BACKUP" since="20"/>
+ <field name="FEATURE_BLUETOOTH" since="8"/>
+ <field name="FEATURE_BLUETOOTH_LE" since="18"/>
+ <field name="FEATURE_CAMERA" since="7"/>
+ <field name="FEATURE_CAMERA_ANY" since="17"/>
+ <field name="FEATURE_CAMERA_AUTOFOCUS" since="7"/>
+ <field name="FEATURE_CAMERA_CAPABILITY_MANUAL_POST_PROCESSING" since="21"/>
+ <field name="FEATURE_CAMERA_CAPABILITY_MANUAL_SENSOR" since="21"/>
+ <field name="FEATURE_CAMERA_CAPABILITY_RAW" since="21"/>
+ <field name="FEATURE_CAMERA_EXTERNAL" since="20"/>
+ <field name="FEATURE_CAMERA_FLASH" since="7"/>
+ <field name="FEATURE_CAMERA_FRONT" since="9"/>
+ <field name="FEATURE_CAMERA_LEVEL_FULL" since="21"/>
+ <field name="FEATURE_COMPANION_DEVICE_SETUP" since="26"/>
+ <field name="FEATURE_CONNECTION_SERVICE" since="21"/>
+ <field name="FEATURE_CONSUMER_IR" since="19"/>
+ <field name="FEATURE_DEVICE_ADMIN" since="19"/>
+ <field name="FEATURE_EMBEDDED" since="26"/>
+ <field name="FEATURE_ETHERNET" since="24"/>
+ <field name="FEATURE_FAKETOUCH" since="11"/>
+ <field name="FEATURE_FAKETOUCH_MULTITOUCH_DISTINCT" since="13"/>
+ <field name="FEATURE_FAKETOUCH_MULTITOUCH_JAZZHAND" since="13"/>
+ <field name="FEATURE_FINGERPRINT" since="23"/>
+ <field name="FEATURE_FREEFORM_WINDOW_MANAGEMENT" since="24"/>
+ <field name="FEATURE_GAMEPAD" since="21"/>
+ <field name="FEATURE_HIFI_SENSORS" since="23"/>
+ <field name="FEATURE_HOME_SCREEN" since="18"/>
+ <field name="FEATURE_INPUT_METHODS" since="18"/>
+ <field name="FEATURE_LEANBACK" since="21"/>
+ <field name="FEATURE_LEANBACK_ONLY" since="26"/>
+ <field name="FEATURE_LIVE_TV" since="21"/>
+ <field name="FEATURE_LIVE_WALLPAPER" since="7"/>
+ <field name="FEATURE_LOCATION" since="8"/>
+ <field name="FEATURE_LOCATION_GPS" since="8"/>
+ <field name="FEATURE_LOCATION_NETWORK" since="8"/>
+ <field name="FEATURE_MANAGED_USERS" since="21"/>
+ <field name="FEATURE_MICROPHONE" since="8"/>
+ <field name="FEATURE_MIDI" since="23"/>
+ <field name="FEATURE_NFC" since="9"/>
+ <field name="FEATURE_NFC_HOST_CARD_EMULATION" since="19"/>
+ <field name="FEATURE_NFC_HOST_CARD_EMULATION_NFCF" since="24"/>
+ <field name="FEATURE_OPENGLES_EXTENSION_PACK" since="21"/>
+ <field name="FEATURE_PICTURE_IN_PICTURE" since="24"/>
+ <field name="FEATURE_PRINTING" since="20"/>
+ <field name="FEATURE_SCREEN_LANDSCAPE" since="13"/>
+ <field name="FEATURE_SCREEN_PORTRAIT" since="13"/>
+ <field name="FEATURE_SECURELY_REMOVES_USERS" since="21"/>
+ <field name="FEATURE_SENSOR_ACCELEROMETER" since="8"/>
+ <field name="FEATURE_SENSOR_AMBIENT_TEMPERATURE" since="21"/>
+ <field name="FEATURE_SENSOR_BAROMETER" since="9"/>
+ <field name="FEATURE_SENSOR_COMPASS" since="8"/>
+ <field name="FEATURE_SENSOR_GYROSCOPE" since="9"/>
+ <field name="FEATURE_SENSOR_HEART_RATE" since="20"/>
+ <field name="FEATURE_SENSOR_HEART_RATE_ECG" since="21"/>
+ <field name="FEATURE_SENSOR_LIGHT" since="7"/>
+ <field name="FEATURE_SENSOR_PROXIMITY" since="7"/>
+ <field name="FEATURE_SENSOR_RELATIVE_HUMIDITY" since="21"/>
+ <field name="FEATURE_SENSOR_STEP_COUNTER" since="19"/>
+ <field name="FEATURE_SENSOR_STEP_DETECTOR" since="19"/>
+ <field name="FEATURE_SIP" since="9"/>
+ <field name="FEATURE_SIP_VOIP" since="9"/>
+ <field name="FEATURE_TELEPHONY" since="7"/>
+ <field name="FEATURE_TELEPHONY_CDMA" since="7"/>
+ <field name="FEATURE_TELEPHONY_GSM" since="7"/>
+ <field name="FEATURE_TELEVISION" since="16" deprecated="21"/>
+ <field name="FEATURE_TOUCHSCREEN" since="8"/>
+ <field name="FEATURE_TOUCHSCREEN_MULTITOUCH" since="7"/>
+ <field name="FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT" since="8"/>
+ <field name="FEATURE_TOUCHSCREEN_MULTITOUCH_JAZZHAND" since="9"/>
+ <field name="FEATURE_USB_ACCESSORY" since="12"/>
+ <field name="FEATURE_USB_HOST" since="12"/>
+ <field name="FEATURE_VERIFIED_BOOT" since="21"/>
+ <field name="FEATURE_VR_HEADTRACKING" since="26"/>
+ <field name="FEATURE_VR_MODE" since="24"/>
+ <field name="FEATURE_VR_MODE_HIGH_PERFORMANCE" since="24"/>
+ <field name="FEATURE_VULKAN_HARDWARE_COMPUTE" since="26"/>
+ <field name="FEATURE_VULKAN_HARDWARE_LEVEL" since="24"/>
+ <field name="FEATURE_VULKAN_HARDWARE_VERSION" since="24"/>
+ <field name="FEATURE_WATCH" since="20"/>
+ <field name="FEATURE_WEBVIEW" since="20"/>
+ <field name="FEATURE_WIFI" since="8"/>
+ <field name="FEATURE_WIFI_AWARE" since="26"/>
+ <field name="FEATURE_WIFI_DIRECT" since="14"/>
+ <field name="FORWARD_LOCK_PACKAGE" removed="4"/>
+ <field name="GET_ACTIVITIES"/>
+ <field name="GET_CONFIGURATIONS" since="3"/>
+ <field name="GET_DISABLED_COMPONENTS" deprecated="24"/>
+ <field name="GET_DISABLED_UNTIL_USED_COMPONENTS" since="18" deprecated="24"/>
+ <field name="GET_GIDS"/>
+ <field name="GET_INSTRUMENTATION"/>
+ <field name="GET_INTENT_FILTERS"/>
+ <field name="GET_META_DATA"/>
+ <field name="GET_PERMISSIONS"/>
+ <field name="GET_PROVIDERS"/>
+ <field name="GET_RECEIVERS"/>
+ <field name="GET_RESOLVED_FILTER"/>
+ <field name="GET_SERVICES"/>
+ <field name="GET_SHARED_LIBRARY_FILES"/>
+ <field name="GET_SIGNATURES"/>
+ <field name="GET_UNINSTALLED_PACKAGES" since="3" deprecated="24"/>
+ <field name="GET_URI_PERMISSION_PATTERNS"/>
+ <field name="INSTALL_FAILED_ALREADY_EXISTS" removed="4"/>
+ <field name="INSTALL_FAILED_CONFLICTING_PROVIDER" since="3" removed="4"/>
+ <field name="INSTALL_FAILED_DEXOPT" removed="4"/>
+ <field name="INSTALL_FAILED_DUPLICATE_PACKAGE" removed="4"/>
+ <field name="INSTALL_FAILED_INSUFFICIENT_STORAGE" removed="4"/>
+ <field name="INSTALL_FAILED_INVALID_APK" removed="4"/>
+ <field name="INSTALL_FAILED_INVALID_URI" removed="4"/>
+ <field name="INSTALL_FAILED_MISSING_SHARED_LIBRARY" removed="4"/>
+ <field name="INSTALL_FAILED_NO_SHARED_USER" removed="4"/>
+ <field name="INSTALL_FAILED_OLDER_SDK" removed="4"/>
+ <field name="INSTALL_FAILED_REPLACE_COULDNT_DELETE" removed="4"/>
+ <field name="INSTALL_FAILED_SHARED_USER_INCOMPATIBLE" removed="4"/>
+ <field name="INSTALL_FAILED_UPDATE_INCOMPATIBLE" removed="4"/>
+ <field name="INSTALL_PARSE_FAILED_BAD_MANIFEST" removed="4"/>
+ <field name="INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME" removed="4"/>
+ <field name="INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID" removed="4"/>
+ <field name="INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING" removed="4"/>
+ <field name="INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES" removed="4"/>
+ <field name="INSTALL_PARSE_FAILED_MANIFEST_EMPTY" removed="4"/>
+ <field name="INSTALL_PARSE_FAILED_MANIFEST_MALFORMED" removed="4"/>
+ <field name="INSTALL_PARSE_FAILED_NOT_APK" removed="4"/>
+ <field name="INSTALL_PARSE_FAILED_NO_CERTIFICATES" removed="4"/>
+ <field name="INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION" removed="4"/>
+ <field name="INSTALL_REASON_DEVICE_RESTORE" since="26"/>
+ <field name="INSTALL_REASON_DEVICE_SETUP" since="26"/>
+ <field name="INSTALL_REASON_POLICY" since="26"/>
+ <field name="INSTALL_REASON_UNKNOWN" since="26"/>
+ <field name="INSTALL_REASON_USER" since="26"/>
+ <field name="INSTALL_SUCCEEDED" removed="4"/>
+ <field name="MATCH_ALL" since="23"/>
+ <field name="MATCH_DEFAULT_ONLY"/>
+ <field name="MATCH_DIRECT_BOOT_AWARE" since="24"/>
+ <field name="MATCH_DIRECT_BOOT_UNAWARE" since="24"/>
+ <field name="MATCH_DISABLED_COMPONENTS" since="24"/>
+ <field name="MATCH_DISABLED_UNTIL_USED_COMPONENTS" since="24"/>
+ <field name="MATCH_SYSTEM_ONLY" since="24"/>
+ <field name="MATCH_UNINSTALLED_PACKAGES" since="24"/>
+ <field name="MAXIMUM_VERIFICATION_TIMEOUT" since="17"/>
+ <field name="PERMISSION_DENIED"/>
+ <field name="PERMISSION_GRANTED"/>
+ <field name="PKG_INSTALL_COMPLETE" removed="8"/>
+ <field name="PKG_INSTALL_INCOMPLETE" removed="8"/>
+ <field name="REPLACE_EXISTING_PACKAGE" removed="4"/>
+ <field name="SIGNATURE_FIRST_NOT_SIGNED"/>
+ <field name="SIGNATURE_MATCH"/>
+ <field name="SIGNATURE_NEITHER_SIGNED"/>
+ <field name="SIGNATURE_NO_MATCH"/>
+ <field name="SIGNATURE_SECOND_NOT_SIGNED"/>
+ <field name="SIGNATURE_UNKNOWN_PACKAGE"/>
+ <field name="VERIFICATION_ALLOW" since="14"/>
+ <field name="VERIFICATION_REJECT" since="14"/>
+ <field name="VERSION_CODE_HIGHEST" since="26"/>
+ </class>
+ <class name="android/content/pm/PackageManager$NameNotFoundException" since="1">
+ <extends name="android/util/AndroidException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/content/pm/PackageStats" since="1" deprecated="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/content/pm/PackageStats;)V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <field name="CREATOR"/>
+ <field name="cacheSize"/>
+ <field name="codeSize"/>
+ <field name="dataSize"/>
+ <field name="externalCacheSize" since="11"/>
+ <field name="externalCodeSize" since="14"/>
+ <field name="externalDataSize" since="11"/>
+ <field name="externalMediaSize" since="11"/>
+ <field name="externalObbSize" since="11"/>
+ <field name="packageName"/>
+ </class>
+ <class name="android/content/pm/PathPermission" since="4">
+ <extends name="android/os/PatternMatcher"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V"/>
+ <method name="getReadPermission()Ljava/lang/String;"/>
+ <method name="getWritePermission()Ljava/lang/String;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/content/pm/PermissionGroupInfo" since="1">
+ <extends name="android/content/pm/PackageItemInfo"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/pm/PermissionGroupInfo;)V"/>
+ <method name="loadDescription(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;"/>
+ <field name="CREATOR"/>
+ <field name="FLAG_PERSONAL_INFO" since="17"/>
+ <field name="descriptionRes"/>
+ <field name="flags" since="17"/>
+ <field name="nonLocalizedDescription"/>
+ <field name="priority" since="17"/>
+ </class>
+ <class name="android/content/pm/PermissionInfo" since="1">
+ <extends name="android/content/pm/PackageItemInfo"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/pm/PermissionInfo;)V"/>
+ <method name="loadDescription(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;"/>
+ <field name="CREATOR"/>
+ <field name="FLAG_COSTS_MONEY" since="17"/>
+ <field name="FLAG_INSTALLED" since="23"/>
+ <field name="PROTECTION_DANGEROUS"/>
+ <field name="PROTECTION_FLAG_APPOP" since="21"/>
+ <field name="PROTECTION_FLAG_DEVELOPMENT" since="16"/>
+ <field name="PROTECTION_FLAG_INSTALLER" since="23"/>
+ <field name="PROTECTION_FLAG_PRE23" since="23"/>
+ <field name="PROTECTION_FLAG_PREINSTALLED" since="23"/>
+ <field name="PROTECTION_FLAG_PRIVILEGED" since="23"/>
+ <field name="PROTECTION_FLAG_RUNTIME_ONLY" since="26"/>
+ <field name="PROTECTION_FLAG_SETUP" since="24"/>
+ <field name="PROTECTION_FLAG_SYSTEM" since="16" deprecated="23"/>
+ <field name="PROTECTION_FLAG_VERIFIER" since="23"/>
+ <field name="PROTECTION_MASK_BASE" since="16"/>
+ <field name="PROTECTION_MASK_FLAGS" since="16"/>
+ <field name="PROTECTION_NORMAL"/>
+ <field name="PROTECTION_SIGNATURE"/>
+ <field name="PROTECTION_SIGNATURE_OR_SYSTEM" deprecated="23"/>
+ <field name="descriptionRes"/>
+ <field name="flags" since="17"/>
+ <field name="group"/>
+ <field name="nonLocalizedDescription"/>
+ <field name="protectionLevel"/>
+ </class>
+ <class name="android/content/pm/ProviderInfo" since="1">
+ <extends name="android/content/pm/ComponentInfo"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/pm/ProviderInfo;)V"/>
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V" since="19"/>
+ <field name="CREATOR"/>
+ <field name="FLAG_SINGLE_USER" since="17"/>
+ <field name="authority"/>
+ <field name="flags" since="17"/>
+ <field name="grantUriPermissions"/>
+ <field name="initOrder"/>
+ <field name="isSyncable" deprecated="16"/>
+ <field name="multiprocess"/>
+ <field name="pathPermissions" since="4"/>
+ <field name="readPermission"/>
+ <field name="uriPermissionPatterns"/>
+ <field name="writePermission"/>
+ </class>
+ <class name="android/content/pm/ResolveInfo" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/pm/ResolveInfo;)V" since="17"/>
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V"/>
+ <method name="getIconResource()I"/>
+ <method name="loadIcon(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;"/>
+ <method name="loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;"/>
+ <field name="CREATOR"/>
+ <field name="activityInfo"/>
+ <field name="filter"/>
+ <field name="icon"/>
+ <field name="isDefault"/>
+ <field name="isInstantAppAvailable" since="26"/>
+ <field name="labelRes"/>
+ <field name="match"/>
+ <field name="nonLocalizedLabel"/>
+ <field name="preferredOrder"/>
+ <field name="priority"/>
+ <field name="providerInfo" since="19"/>
+ <field name="resolvePackageName" since="5"/>
+ <field name="serviceInfo"/>
+ <field name="specificIndex"/>
+ </class>
+ <class name="android/content/pm/ResolveInfo$DisplayNameComparator" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Comparator"/>
+ <method name="&lt;init>(Landroid/content/pm/PackageManager;)V"/>
+ <method name="compare(Landroid/content/pm/ResolveInfo;Landroid/content/pm/ResolveInfo;)I"/>
+ </class>
+ <class name="android/content/pm/ServiceInfo" since="1">
+ <extends name="android/content/pm/ComponentInfo"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/pm/ServiceInfo;)V"/>
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V" since="5"/>
+ <field name="CREATOR"/>
+ <field name="FLAG_EXTERNAL_SERVICE" since="24"/>
+ <field name="FLAG_ISOLATED_PROCESS" since="16"/>
+ <field name="FLAG_SINGLE_USER" since="17"/>
+ <field name="FLAG_STOP_WITH_TASK" since="14"/>
+ <field name="flags" since="14"/>
+ <field name="permission"/>
+ </class>
+ <class name="android/content/pm/SharedLibraryInfo" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDeclaringPackage()Landroid/content/pm/VersionedPackage;"/>
+ <method name="getDependentPackages()Ljava/util/List;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getType()I"/>
+ <method name="getVersion()I"/>
+ <field name="CREATOR"/>
+ <field name="TYPE_BUILTIN"/>
+ <field name="TYPE_DYNAMIC"/>
+ <field name="TYPE_STATIC"/>
+ <field name="VERSION_UNDEFINED"/>
+ </class>
+ <class name="android/content/pm/ShortcutInfo" since="25">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getActivity()Landroid/content/ComponentName;"/>
+ <method name="getCategories()Ljava/util/Set;"/>
+ <method name="getDisabledMessage()Ljava/lang/CharSequence;"/>
+ <method name="getExtras()Landroid/os/PersistableBundle;"/>
+ <method name="getId()Ljava/lang/String;"/>
+ <method name="getIntent()Landroid/content/Intent;"/>
+ <method name="getIntents()[Landroid/content/Intent;"/>
+ <method name="getLastChangedTimestamp()J"/>
+ <method name="getLongLabel()Ljava/lang/CharSequence;"/>
+ <method name="getPackage()Ljava/lang/String;"/>
+ <method name="getRank()I"/>
+ <method name="getShortLabel()Ljava/lang/CharSequence;"/>
+ <method name="getUserHandle()Landroid/os/UserHandle;"/>
+ <method name="hasKeyFieldsOnly()Z"/>
+ <method name="isDeclaredInManifest()Z"/>
+ <method name="isDynamic()Z"/>
+ <method name="isEnabled()Z"/>
+ <method name="isImmutable()Z"/>
+ <method name="isPinned()Z"/>
+ <field name="CREATOR"/>
+ <field name="SHORTCUT_CATEGORY_CONVERSATION"/>
+ </class>
+ <class name="android/content/pm/ShortcutInfo$Builder" since="25">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;Ljava/lang/String;)V"/>
+ <method name="build()Landroid/content/pm/ShortcutInfo;"/>
+ <method name="setActivity(Landroid/content/ComponentName;)Landroid/content/pm/ShortcutInfo$Builder;"/>
+ <method name="setCategories(Ljava/util/Set;)Landroid/content/pm/ShortcutInfo$Builder;"/>
+ <method name="setDisabledMessage(Ljava/lang/CharSequence;)Landroid/content/pm/ShortcutInfo$Builder;"/>
+ <method name="setExtras(Landroid/os/PersistableBundle;)Landroid/content/pm/ShortcutInfo$Builder;"/>
+ <method name="setIcon(Landroid/graphics/drawable/Icon;)Landroid/content/pm/ShortcutInfo$Builder;"/>
+ <method name="setIntent(Landroid/content/Intent;)Landroid/content/pm/ShortcutInfo$Builder;"/>
+ <method name="setIntents([Landroid/content/Intent;)Landroid/content/pm/ShortcutInfo$Builder;"/>
+ <method name="setLongLabel(Ljava/lang/CharSequence;)Landroid/content/pm/ShortcutInfo$Builder;"/>
+ <method name="setRank(I)Landroid/content/pm/ShortcutInfo$Builder;"/>
+ <method name="setShortLabel(Ljava/lang/CharSequence;)Landroid/content/pm/ShortcutInfo$Builder;"/>
+ </class>
+ <class name="android/content/pm/ShortcutManager" since="25">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addDynamicShortcuts(Ljava/util/List;)Z"/>
+ <method name="createShortcutResultIntent(Landroid/content/pm/ShortcutInfo;)Landroid/content/Intent;" since="26"/>
+ <method name="disableShortcuts(Ljava/util/List;)V"/>
+ <method name="disableShortcuts(Ljava/util/List;Ljava/lang/CharSequence;)V"/>
+ <method name="enableShortcuts(Ljava/util/List;)V"/>
+ <method name="getDynamicShortcuts()Ljava/util/List;"/>
+ <method name="getIconMaxHeight()I"/>
+ <method name="getIconMaxWidth()I"/>
+ <method name="getManifestShortcuts()Ljava/util/List;"/>
+ <method name="getMaxShortcutCountPerActivity()I"/>
+ <method name="getPinnedShortcuts()Ljava/util/List;"/>
+ <method name="isRateLimitingActive()Z"/>
+ <method name="isRequestPinShortcutSupported()Z" since="26"/>
+ <method name="removeAllDynamicShortcuts()V"/>
+ <method name="removeDynamicShortcuts(Ljava/util/List;)V"/>
+ <method name="reportShortcutUsed(Ljava/lang/String;)V"/>
+ <method name="requestPinShortcut(Landroid/content/pm/ShortcutInfo;Landroid/content/IntentSender;)Z" since="26"/>
+ <method name="setDynamicShortcuts(Ljava/util/List;)Z"/>
+ <method name="updateShortcuts(Ljava/util/List;)Z"/>
+ </class>
+ <class name="android/content/pm/Signature" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>([B)V"/>
+ <method name="toByteArray()[B"/>
+ <method name="toChars()[C"/>
+ <method name="toChars([C[I)[C"/>
+ <method name="toCharsString()Ljava/lang/String;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/content/pm/VersionedPackage" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="getPackageName()Ljava/lang/String;"/>
+ <method name="getVersionCode()I"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/content/res/AssetFileDescriptor" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable" since="3"/>
+ <implements name="java/io/Closeable" since="19"/>
+ <method name="&lt;init>(Landroid/os/ParcelFileDescriptor;JJ)V"/>
+ <method name="&lt;init>(Landroid/os/ParcelFileDescriptor;JJLandroid/os/Bundle;)V" since="19"/>
+ <method name="close()V"/>
+ <method name="createInputStream()Ljava/io/FileInputStream;" since="3"/>
+ <method name="createOutputStream()Ljava/io/FileOutputStream;" since="3"/>
+ <method name="getDeclaredLength()J" since="3"/>
+ <method name="getExtras()Landroid/os/Bundle;" since="19"/>
+ <method name="getFileDescriptor()Ljava/io/FileDescriptor;"/>
+ <method name="getLength()J"/>
+ <method name="getParcelFileDescriptor()Landroid/os/ParcelFileDescriptor;"/>
+ <method name="getStartOffset()J"/>
+ <field name="CREATOR" since="3"/>
+ <field name="UNKNOWN_LENGTH" since="3"/>
+ </class>
+ <class name="android/content/res/AssetFileDescriptor$AutoCloseInputStream" since="3">
+ <extends name="android/os/ParcelFileDescriptor$AutoCloseInputStream"/>
+ <method name="&lt;init>(Landroid/content/res/AssetFileDescriptor;)V"/>
+ </class>
+ <class name="android/content/res/AssetFileDescriptor$AutoCloseOutputStream" since="3">
+ <extends name="android/os/ParcelFileDescriptor$AutoCloseOutputStream"/>
+ <method name="&lt;init>(Landroid/content/res/AssetFileDescriptor;)V"/>
+ </class>
+ <class name="android/content/res/AssetManager" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable" since="21"/>
+ <method name="&lt;init>()V"/>
+ <method name="close()V"/>
+ <method name="getLocales()[Ljava/lang/String;"/>
+ <method name="list(Ljava/lang/String;)[Ljava/lang/String;"/>
+ <method name="open(Ljava/lang/String;)Ljava/io/InputStream;"/>
+ <method name="open(Ljava/lang/String;I)Ljava/io/InputStream;"/>
+ <method name="openFd(Ljava/lang/String;)Landroid/content/res/AssetFileDescriptor;"/>
+ <method name="openNonAssetFd(ILjava/lang/String;)Landroid/content/res/AssetFileDescriptor;"/>
+ <method name="openNonAssetFd(Ljava/lang/String;)Landroid/content/res/AssetFileDescriptor;"/>
+ <method name="openXmlResourceParser(ILjava/lang/String;)Landroid/content/res/XmlResourceParser;"/>
+ <method name="openXmlResourceParser(Ljava/lang/String;)Landroid/content/res/XmlResourceParser;"/>
+ <field name="ACCESS_BUFFER"/>
+ <field name="ACCESS_RANDOM"/>
+ <field name="ACCESS_STREAMING"/>
+ <field name="ACCESS_UNKNOWN"/>
+ </class>
+ <class name="android/content/res/AssetManager$AssetInputStream" since="1">
+ <extends name="java/io/InputStream"/>
+ <method name="&lt;init>(Landroid/content/res/AssetManager;)V"/>
+ <method name="getAssetInt()I" removed="21"/>
+ </class>
+ <class name="android/content/res/ColorStateList" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>([[I[I)V"/>
+ <method name="createFromXml(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;)Landroid/content/res/ColorStateList;" deprecated="23"/>
+ <method name="createFromXml(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/Resources$Theme;)Landroid/content/res/ColorStateList;" since="23"/>
+ <method name="getChangingConfigurations()I" since="23"/>
+ <method name="getColorForState([II)I"/>
+ <method name="getDefaultColor()I"/>
+ <method name="isOpaque()Z" since="21"/>
+ <method name="isStateful()Z"/>
+ <method name="valueOf(I)Landroid/content/res/ColorStateList;"/>
+ <method name="withAlpha(I)Landroid/content/res/ColorStateList;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/content/res/Configuration" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/res/Configuration;)V"/>
+ <method name="compareTo(Landroid/content/res/Configuration;)I"/>
+ <method name="diff(Landroid/content/res/Configuration;)I"/>
+ <method name="equals(Landroid/content/res/Configuration;)Z"/>
+ <method name="getLayoutDirection()I" since="17"/>
+ <method name="getLocales()Landroid/os/LocaleList;" since="24"/>
+ <method name="isLayoutSizeAtLeast(I)Z" since="11"/>
+ <method name="isScreenHdr()Z" since="26"/>
+ <method name="isScreenRound()Z" since="23"/>
+ <method name="isScreenWideColorGamut()Z" since="26"/>
+ <method name="needNewResources(II)Z"/>
+ <method name="readFromParcel(Landroid/os/Parcel;)V" since="8"/>
+ <method name="setLayoutDirection(Ljava/util/Locale;)V" since="17"/>
+ <method name="setLocale(Ljava/util/Locale;)V" since="17"/>
+ <method name="setLocales(Landroid/os/LocaleList;)V" since="24"/>
+ <method name="setTo(Landroid/content/res/Configuration;)V" since="8"/>
+ <method name="setToDefaults()V"/>
+ <method name="updateFrom(Landroid/content/res/Configuration;)I"/>
+ <field name="COLOR_MODE_HDR_MASK" since="26"/>
+ <field name="COLOR_MODE_HDR_NO" since="26"/>
+ <field name="COLOR_MODE_HDR_SHIFT" since="26"/>
+ <field name="COLOR_MODE_HDR_UNDEFINED" since="26"/>
+ <field name="COLOR_MODE_HDR_YES" since="26"/>
+ <field name="COLOR_MODE_UNDEFINED" since="26"/>
+ <field name="COLOR_MODE_WIDE_COLOR_GAMUT_MASK" since="26"/>
+ <field name="COLOR_MODE_WIDE_COLOR_GAMUT_NO" since="26"/>
+ <field name="COLOR_MODE_WIDE_COLOR_GAMUT_UNDEFINED" since="26"/>
+ <field name="COLOR_MODE_WIDE_COLOR_GAMUT_YES" since="26"/>
+ <field name="CREATOR"/>
+ <field name="DENSITY_DPI_UNDEFINED" since="17"/>
+ <field name="HARDKEYBOARDHIDDEN_NO" since="3"/>
+ <field name="HARDKEYBOARDHIDDEN_UNDEFINED" since="3"/>
+ <field name="HARDKEYBOARDHIDDEN_YES" since="3"/>
+ <field name="KEYBOARDHIDDEN_NO"/>
+ <field name="KEYBOARDHIDDEN_UNDEFINED"/>
+ <field name="KEYBOARDHIDDEN_YES"/>
+ <field name="KEYBOARD_12KEY"/>
+ <field name="KEYBOARD_NOKEYS"/>
+ <field name="KEYBOARD_QWERTY"/>
+ <field name="KEYBOARD_UNDEFINED"/>
+ <field name="MNC_ZERO" since="19"/>
+ <field name="NAVIGATIONHIDDEN_NO" since="5"/>
+ <field name="NAVIGATIONHIDDEN_UNDEFINED" since="5"/>
+ <field name="NAVIGATIONHIDDEN_YES" since="5"/>
+ <field name="NAVIGATION_DPAD"/>
+ <field name="NAVIGATION_NONAV"/>
+ <field name="NAVIGATION_TRACKBALL"/>
+ <field name="NAVIGATION_UNDEFINED"/>
+ <field name="NAVIGATION_WHEEL"/>
+ <field name="ORIENTATION_LANDSCAPE"/>
+ <field name="ORIENTATION_PORTRAIT"/>
+ <field name="ORIENTATION_SQUARE" deprecated="16"/>
+ <field name="ORIENTATION_UNDEFINED"/>
+ <field name="SCREENLAYOUT_LAYOUTDIR_LTR" since="17"/>
+ <field name="SCREENLAYOUT_LAYOUTDIR_MASK" since="17"/>
+ <field name="SCREENLAYOUT_LAYOUTDIR_RTL" since="17"/>
+ <field name="SCREENLAYOUT_LAYOUTDIR_SHIFT" since="17"/>
+ <field name="SCREENLAYOUT_LAYOUTDIR_UNDEFINED" since="17"/>
+ <field name="SCREENLAYOUT_LONG_MASK" since="4"/>
+ <field name="SCREENLAYOUT_LONG_NO" since="4"/>
+ <field name="SCREENLAYOUT_LONG_UNDEFINED" since="4"/>
+ <field name="SCREENLAYOUT_LONG_YES" since="4"/>
+ <field name="SCREENLAYOUT_ROUND_MASK" since="23"/>
+ <field name="SCREENLAYOUT_ROUND_NO" since="23"/>
+ <field name="SCREENLAYOUT_ROUND_UNDEFINED" since="23"/>
+ <field name="SCREENLAYOUT_ROUND_YES" since="23"/>
+ <field name="SCREENLAYOUT_SIZE_LARGE" since="4"/>
+ <field name="SCREENLAYOUT_SIZE_MASK" since="4"/>
+ <field name="SCREENLAYOUT_SIZE_NORMAL" since="4"/>
+ <field name="SCREENLAYOUT_SIZE_SMALL" since="4"/>
+ <field name="SCREENLAYOUT_SIZE_UNDEFINED" since="4"/>
+ <field name="SCREENLAYOUT_SIZE_XLARGE" since="9"/>
+ <field name="SCREENLAYOUT_UNDEFINED" since="17"/>
+ <field name="SCREEN_HEIGHT_DP_UNDEFINED" since="13"/>
+ <field name="SCREEN_WIDTH_DP_UNDEFINED" since="13"/>
+ <field name="SMALLEST_SCREEN_WIDTH_DP_UNDEFINED" since="13"/>
+ <field name="TOUCHSCREEN_FINGER"/>
+ <field name="TOUCHSCREEN_NOTOUCH"/>
+ <field name="TOUCHSCREEN_STYLUS" deprecated="16"/>
+ <field name="TOUCHSCREEN_UNDEFINED"/>
+ <field name="UI_MODE_NIGHT_MASK" since="8"/>
+ <field name="UI_MODE_NIGHT_NO" since="8"/>
+ <field name="UI_MODE_NIGHT_UNDEFINED" since="8"/>
+ <field name="UI_MODE_NIGHT_YES" since="8"/>
+ <field name="UI_MODE_TYPE_APPLIANCE" since="16"/>
+ <field name="UI_MODE_TYPE_CAR" since="8"/>
+ <field name="UI_MODE_TYPE_DESK" since="8"/>
+ <field name="UI_MODE_TYPE_MASK" since="8"/>
+ <field name="UI_MODE_TYPE_NORMAL" since="8"/>
+ <field name="UI_MODE_TYPE_TELEVISION" since="13"/>
+ <field name="UI_MODE_TYPE_UNDEFINED" since="8"/>
+ <field name="UI_MODE_TYPE_VR_HEADSET" since="26"/>
+ <field name="UI_MODE_TYPE_WATCH" since="20"/>
+ <field name="colorMode" since="26"/>
+ <field name="densityDpi" since="17"/>
+ <field name="fontScale"/>
+ <field name="hardKeyboardHidden" since="3"/>
+ <field name="keyboard"/>
+ <field name="keyboardHidden"/>
+ <field name="locale" deprecated="24"/>
+ <field name="mcc"/>
+ <field name="mnc"/>
+ <field name="navigation"/>
+ <field name="navigationHidden" since="5"/>
+ <field name="orientation"/>
+ <field name="screenHeightDp" since="13"/>
+ <field name="screenLayout" since="4"/>
+ <field name="screenWidthDp" since="13"/>
+ <field name="smallestScreenWidthDp" since="13"/>
+ <field name="touchscreen"/>
+ <field name="uiMode" since="8"/>
+ </class>
+ <class name="android/content/res/ObbInfo" since="9">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <field name="CREATOR"/>
+ <field name="OBB_OVERLAY"/>
+ <field name="filename"/>
+ <field name="flags"/>
+ <field name="packageName"/>
+ <field name="version"/>
+ </class>
+ <class name="android/content/res/ObbScanner" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getObbInfo(Ljava/lang/String;)Landroid/content/res/ObbInfo;"/>
+ </class>
+ <class name="android/content/res/Resources" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/res/AssetManager;Landroid/util/DisplayMetrics;Landroid/content/res/Configuration;)V" deprecated="25"/>
+ <method name="finishPreloading()V"/>
+ <method name="flushLayoutCache()V"/>
+ <method name="getAnimation(I)Landroid/content/res/XmlResourceParser;"/>
+ <method name="getAssets()Landroid/content/res/AssetManager;"/>
+ <method name="getBoolean(I)Z" since="3"/>
+ <method name="getColor(I)I" deprecated="23"/>
+ <method name="getColor(ILandroid/content/res/Resources$Theme;)I" since="23"/>
+ <method name="getColorStateList(I)Landroid/content/res/ColorStateList;" deprecated="23"/>
+ <method name="getColorStateList(ILandroid/content/res/Resources$Theme;)Landroid/content/res/ColorStateList;" since="23"/>
+ <method name="getConfiguration()Landroid/content/res/Configuration;"/>
+ <method name="getDimension(I)F"/>
+ <method name="getDimensionPixelOffset(I)I"/>
+ <method name="getDimensionPixelSize(I)I"/>
+ <method name="getDisplayMetrics()Landroid/util/DisplayMetrics;"/>
+ <method name="getDrawable(I)Landroid/graphics/drawable/Drawable;" deprecated="22"/>
+ <method name="getDrawable(ILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;" since="21"/>
+ <method name="getDrawableForDensity(II)Landroid/graphics/drawable/Drawable;" since="15" deprecated="22"/>
+ <method name="getDrawableForDensity(IILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;" since="21"/>
+ <method name="getFont(I)Landroid/graphics/Typeface;" since="26"/>
+ <method name="getFraction(III)F" since="3"/>
+ <method name="getIdentifier(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I"/>
+ <method name="getIntArray(I)[I"/>
+ <method name="getInteger(I)I"/>
+ <method name="getLayout(I)Landroid/content/res/XmlResourceParser;"/>
+ <method name="getMovie(I)Landroid/graphics/Movie;"/>
+ <method name="getQuantityString(II)Ljava/lang/String;"/>
+ <method name="getQuantityString(II[Ljava/lang/Object;)Ljava/lang/String;"/>
+ <method name="getQuantityText(II)Ljava/lang/CharSequence;"/>
+ <method name="getResourceEntryName(I)Ljava/lang/String;"/>
+ <method name="getResourceName(I)Ljava/lang/String;"/>
+ <method name="getResourcePackageName(I)Ljava/lang/String;"/>
+ <method name="getResourceTypeName(I)Ljava/lang/String;"/>
+ <method name="getString(I)Ljava/lang/String;"/>
+ <method name="getString(I[Ljava/lang/Object;)Ljava/lang/String;"/>
+ <method name="getStringArray(I)[Ljava/lang/String;"/>
+ <method name="getSystem()Landroid/content/res/Resources;"/>
+ <method name="getText(I)Ljava/lang/CharSequence;"/>
+ <method name="getText(ILjava/lang/CharSequence;)Ljava/lang/CharSequence;"/>
+ <method name="getTextArray(I)[Ljava/lang/CharSequence;"/>
+ <method name="getValue(ILandroid/util/TypedValue;Z)V"/>
+ <method name="getValue(Ljava/lang/String;Landroid/util/TypedValue;Z)V"/>
+ <method name="getValueForDensity(IILandroid/util/TypedValue;Z)V" since="15"/>
+ <method name="getXml(I)Landroid/content/res/XmlResourceParser;"/>
+ <method name="newTheme()Landroid/content/res/Resources$Theme;"/>
+ <method name="obtainAttributes(Landroid/util/AttributeSet;[I)Landroid/content/res/TypedArray;"/>
+ <method name="obtainTypedArray(I)Landroid/content/res/TypedArray;"/>
+ <method name="openRawResource(I)Ljava/io/InputStream;"/>
+ <method name="openRawResource(ILandroid/util/TypedValue;)Ljava/io/InputStream;" since="3"/>
+ <method name="openRawResourceFd(I)Landroid/content/res/AssetFileDescriptor;"/>
+ <method name="parseBundleExtra(Ljava/lang/String;Landroid/util/AttributeSet;Landroid/os/Bundle;)V" since="3"/>
+ <method name="parseBundleExtras(Landroid/content/res/XmlResourceParser;Landroid/os/Bundle;)V" since="3"/>
+ <method name="updateConfiguration(Landroid/content/res/Configuration;Landroid/util/DisplayMetrics;)V" deprecated="25"/>
+ </class>
+ <class name="android/content/res/Resources$NotFoundException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Exception;)V" since="24"/>
+ </class>
+ <class name="android/content/res/Resources$Theme" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/res/Resources;)V"/>
+ <method name="applyStyle(IZ)V"/>
+ <method name="dump(ILjava/lang/String;Ljava/lang/String;)V"/>
+ <method name="getChangingConfigurations()I" since="23"/>
+ <method name="getDrawable(I)Landroid/graphics/drawable/Drawable;" since="21"/>
+ <method name="getResources()Landroid/content/res/Resources;" since="21"/>
+ <method name="obtainStyledAttributes(I[I)Landroid/content/res/TypedArray;"/>
+ <method name="obtainStyledAttributes(Landroid/util/AttributeSet;[III)Landroid/content/res/TypedArray;"/>
+ <method name="obtainStyledAttributes([I)Landroid/content/res/TypedArray;"/>
+ <method name="resolveAttribute(ILandroid/util/TypedValue;Z)Z"/>
+ <method name="setTo(Landroid/content/res/Resources$Theme;)V"/>
+ </class>
+ <class name="android/content/res/TypedArray" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getBoolean(IZ)Z"/>
+ <method name="getChangingConfigurations()I" since="21"/>
+ <method name="getColor(II)I"/>
+ <method name="getColorStateList(I)Landroid/content/res/ColorStateList;"/>
+ <method name="getDimension(IF)F"/>
+ <method name="getDimensionPixelOffset(II)I"/>
+ <method name="getDimensionPixelSize(II)I"/>
+ <method name="getDrawable(I)Landroid/graphics/drawable/Drawable;"/>
+ <method name="getFloat(IF)F"/>
+ <method name="getFont(I)Landroid/graphics/Typeface;" since="26"/>
+ <method name="getFraction(IIIF)F"/>
+ <method name="getIndex(I)I"/>
+ <method name="getIndexCount()I"/>
+ <method name="getInt(II)I"/>
+ <method name="getInteger(II)I"/>
+ <method name="getLayoutDimension(II)I" since="3"/>
+ <method name="getLayoutDimension(ILjava/lang/String;)I"/>
+ <method name="getNonResourceString(I)Ljava/lang/String;"/>
+ <method name="getPositionDescription()Ljava/lang/String;"/>
+ <method name="getResourceId(II)I"/>
+ <method name="getResources()Landroid/content/res/Resources;"/>
+ <method name="getString(I)Ljava/lang/String;"/>
+ <method name="getText(I)Ljava/lang/CharSequence;"/>
+ <method name="getTextArray(I)[Ljava/lang/CharSequence;"/>
+ <method name="getType(I)I" since="21"/>
+ <method name="getValue(ILandroid/util/TypedValue;)Z"/>
+ <method name="hasValue(I)Z"/>
+ <method name="hasValueOrEmpty(I)Z" since="22"/>
+ <method name="length()I"/>
+ <method name="peekValue(I)Landroid/util/TypedValue;"/>
+ <method name="recycle()V"/>
+ </class>
+ <class name="android/content/res/XmlResourceParser" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/util/AttributeSet"/>
+ <implements name="java/lang/AutoCloseable" since="19"/>
+ <implements name="org/xmlpull/v1/XmlPullParser"/>
+ <method name="close()V"/>
+ </class>
+ <class name="android/database/AbstractCursor" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/database/CrossProcessCursor"/>
+ <method name="&lt;init>()V"/>
+ <method name="checkPosition()V"/>
+ <method name="getNotificationUri()Landroid/net/Uri;" since="11"/>
+ <method name="getUpdatedField(I)Ljava/lang/Object;" deprecated="16"/>
+ <method name="isFieldUpdated(I)Z" deprecated="16"/>
+ <method name="onChange(Z)V"/>
+ <field name="mClosed" deprecated="23"/>
+ <field name="mContentResolver" deprecated="23"/>
+ <field name="mCurrentRowID" deprecated="16" removed="23"/>
+ <field name="mPos" deprecated="23"/>
+ <field name="mRowIdColumnIndex" deprecated="16" removed="23"/>
+ <field name="mUpdatedRows" deprecated="16" removed="23"/>
+ </class>
+ <class name="android/database/AbstractCursor$SelfContentObserver" since="1">
+ <extends name="android/database/ContentObserver"/>
+ <method name="&lt;init>(Landroid/database/AbstractCursor;)V"/>
+ </class>
+ <class name="android/database/AbstractWindowedCursor" since="1">
+ <extends name="android/database/AbstractCursor"/>
+ <method name="&lt;init>()V"/>
+ <method name="hasWindow()Z"/>
+ <method name="isBlob(I)Z" deprecated="16"/>
+ <method name="isFloat(I)Z" since="5" deprecated="16"/>
+ <method name="isLong(I)Z" since="5" deprecated="16"/>
+ <method name="isString(I)Z" since="5" deprecated="16"/>
+ <method name="setWindow(Landroid/database/CursorWindow;)V"/>
+ <field name="mWindow"/>
+ </class>
+ <class name="android/database/CharArrayBuffer" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>([C)V"/>
+ <field name="data"/>
+ <field name="sizeCopied"/>
+ </class>
+ <class name="android/database/ContentObservable" since="1">
+ <extends name="android/database/Observable"/>
+ <method name="&lt;init>()V"/>
+ <method name="dispatchChange(Z)V" deprecated="16"/>
+ <method name="dispatchChange(ZLandroid/net/Uri;)V" since="16"/>
+ <method name="notifyChange(Z)V" deprecated="16"/>
+ <method name="registerObserver(Landroid/database/ContentObserver;)V"/>
+ </class>
+ <class name="android/database/ContentObserver" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/os/Handler;)V"/>
+ <method name="deliverSelfNotifications()Z"/>
+ <method name="dispatchChange(Z)V" deprecated="16"/>
+ <method name="dispatchChange(ZLandroid/net/Uri;)V" since="16"/>
+ <method name="onChange(Z)V"/>
+ <method name="onChange(ZLandroid/net/Uri;)V" since="16"/>
+ </class>
+ <class name="android/database/CrossProcessCursor" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/database/Cursor"/>
+ <method name="fillWindow(ILandroid/database/CursorWindow;)V"/>
+ <method name="getWindow()Landroid/database/CursorWindow;"/>
+ <method name="onMove(II)Z"/>
+ </class>
+ <class name="android/database/CrossProcessCursorWrapper" since="15">
+ <extends name="android/database/CursorWrapper"/>
+ <implements name="android/database/CrossProcessCursor"/>
+ <method name="&lt;init>(Landroid/database/Cursor;)V"/>
+ </class>
+ <class name="android/database/Cursor" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable" since="16"/>
+ <method name="close()V"/>
+ <method name="copyStringToBuffer(ILandroid/database/CharArrayBuffer;)V"/>
+ <method name="deactivate()V" deprecated="16"/>
+ <method name="getBlob(I)[B"/>
+ <method name="getColumnCount()I"/>
+ <method name="getColumnIndex(Ljava/lang/String;)I"/>
+ <method name="getColumnIndexOrThrow(Ljava/lang/String;)I"/>
+ <method name="getColumnName(I)Ljava/lang/String;"/>
+ <method name="getColumnNames()[Ljava/lang/String;"/>
+ <method name="getCount()I"/>
+ <method name="getDouble(I)D"/>
+ <method name="getExtras()Landroid/os/Bundle;"/>
+ <method name="getFloat(I)F"/>
+ <method name="getInt(I)I"/>
+ <method name="getLong(I)J"/>
+ <method name="getNotificationUri()Landroid/net/Uri;" since="19"/>
+ <method name="getPosition()I"/>
+ <method name="getShort(I)S"/>
+ <method name="getString(I)Ljava/lang/String;"/>
+ <method name="getType(I)I" since="11"/>
+ <method name="getWantsAllOnMoveCalls()Z"/>
+ <method name="isAfterLast()Z"/>
+ <method name="isBeforeFirst()Z"/>
+ <method name="isClosed()Z"/>
+ <method name="isFirst()Z"/>
+ <method name="isLast()Z"/>
+ <method name="isNull(I)Z"/>
+ <method name="move(I)Z"/>
+ <method name="moveToFirst()Z"/>
+ <method name="moveToLast()Z"/>
+ <method name="moveToNext()Z"/>
+ <method name="moveToPosition(I)Z"/>
+ <method name="moveToPrevious()Z"/>
+ <method name="registerContentObserver(Landroid/database/ContentObserver;)V"/>
+ <method name="registerDataSetObserver(Landroid/database/DataSetObserver;)V"/>
+ <method name="requery()Z" deprecated="16"/>
+ <method name="respond(Landroid/os/Bundle;)Landroid/os/Bundle;"/>
+ <method name="setExtras(Landroid/os/Bundle;)V" since="23"/>
+ <method name="setNotificationUri(Landroid/content/ContentResolver;Landroid/net/Uri;)V"/>
+ <method name="unregisterContentObserver(Landroid/database/ContentObserver;)V"/>
+ <method name="unregisterDataSetObserver(Landroid/database/DataSetObserver;)V"/>
+ <field name="FIELD_TYPE_BLOB" since="11"/>
+ <field name="FIELD_TYPE_FLOAT" since="11"/>
+ <field name="FIELD_TYPE_INTEGER" since="11"/>
+ <field name="FIELD_TYPE_NULL" since="11"/>
+ <field name="FIELD_TYPE_STRING" since="11"/>
+ </class>
+ <class name="android/database/CursorIndexOutOfBoundsException" since="1">
+ <extends name="java/lang/IndexOutOfBoundsException"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/database/CursorJoiner" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Iterable"/>
+ <implements name="java/util/Iterator"/>
+ <method name="&lt;init>(Landroid/database/Cursor;[Ljava/lang/String;Landroid/database/Cursor;[Ljava/lang/String;)V"/>
+ <method name="next()Landroid/database/CursorJoiner$Result;"/>
+ </class>
+ <class name="android/database/CursorJoiner$Result" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/database/CursorJoiner$Result;"/>
+ <method name="values()[Landroid/database/CursorJoiner$Result;"/>
+ <field name="BOTH"/>
+ <field name="LEFT"/>
+ <field name="RIGHT"/>
+ </class>
+ <class name="android/database/CursorWindow" since="1">
+ <extends name="android/database/sqlite/SQLiteClosable"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Ljava/lang/String;)V" since="15"/>
+ <method name="&lt;init>(Z)V" deprecated="16"/>
+ <method name="allocRow()Z"/>
+ <method name="clear()V"/>
+ <method name="close()V" removed="16"/>
+ <method name="copyStringToBuffer(IILandroid/database/CharArrayBuffer;)V"/>
+ <method name="freeLastRow()V"/>
+ <method name="getBlob(II)[B"/>
+ <method name="getDouble(II)D"/>
+ <method name="getFloat(II)F"/>
+ <method name="getInt(II)I"/>
+ <method name="getLong(II)J"/>
+ <method name="getNumRows()I"/>
+ <method name="getShort(II)S"/>
+ <method name="getStartPosition()I"/>
+ <method name="getString(II)Ljava/lang/String;"/>
+ <method name="getType(II)I" since="11"/>
+ <method name="isBlob(II)Z" deprecated="16"/>
+ <method name="isFloat(II)Z" since="5" deprecated="16"/>
+ <method name="isLong(II)Z" since="5" deprecated="16"/>
+ <method name="isNull(II)Z" deprecated="16"/>
+ <method name="isString(II)Z" since="5" deprecated="16"/>
+ <method name="newFromParcel(Landroid/os/Parcel;)Landroid/database/CursorWindow;"/>
+ <method name="putBlob([BII)Z"/>
+ <method name="putDouble(DII)Z"/>
+ <method name="putLong(JII)Z"/>
+ <method name="putNull(II)Z"/>
+ <method name="putString(Ljava/lang/String;II)Z"/>
+ <method name="setNumColumns(I)Z"/>
+ <method name="setStartPosition(I)V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/database/CursorWrapper" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/database/Cursor"/>
+ <method name="&lt;init>(Landroid/database/Cursor;)V"/>
+ <method name="getWrappedCursor()Landroid/database/Cursor;" since="11"/>
+ </class>
+ <class name="android/database/DataSetObservable" since="1">
+ <extends name="android/database/Observable"/>
+ <method name="&lt;init>()V"/>
+ <method name="notifyChanged()V"/>
+ <method name="notifyInvalidated()V"/>
+ </class>
+ <class name="android/database/DataSetObserver" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onChanged()V"/>
+ <method name="onInvalidated()V"/>
+ </class>
+ <class name="android/database/DatabaseErrorHandler" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="onCorruption(Landroid/database/sqlite/SQLiteDatabase;)V"/>
+ </class>
+ <class name="android/database/DatabaseUtils" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="appendEscapedSQLString(Ljava/lang/StringBuilder;Ljava/lang/String;)V"/>
+ <method name="appendSelectionArgs([Ljava/lang/String;[Ljava/lang/String;)[Ljava/lang/String;" since="11"/>
+ <method name="appendValueToSql(Ljava/lang/StringBuilder;Ljava/lang/Object;)V"/>
+ <method name="bindObjectToProgram(Landroid/database/sqlite/SQLiteProgram;ILjava/lang/Object;)V"/>
+ <method name="blobFileDescriptorForQuery(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;" since="11"/>
+ <method name="blobFileDescriptorForQuery(Landroid/database/sqlite/SQLiteStatement;[Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;" since="11"/>
+ <method name="concatenateWhere(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" since="11"/>
+ <method name="createDbFromSqlStatements(Landroid/content/Context;Ljava/lang/String;ILjava/lang/String;)V"/>
+ <method name="cursorDoubleToContentValues(Landroid/database/Cursor;Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;)V"/>
+ <method name="cursorDoubleToContentValuesIfPresent(Landroid/database/Cursor;Landroid/content/ContentValues;Ljava/lang/String;)V" since="8"/>
+ <method name="cursorDoubleToCursorValues(Landroid/database/Cursor;Ljava/lang/String;Landroid/content/ContentValues;)V"/>
+ <method name="cursorFloatToContentValuesIfPresent(Landroid/database/Cursor;Landroid/content/ContentValues;Ljava/lang/String;)V" since="8"/>
+ <method name="cursorIntToContentValues(Landroid/database/Cursor;Ljava/lang/String;Landroid/content/ContentValues;)V"/>
+ <method name="cursorIntToContentValues(Landroid/database/Cursor;Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;)V"/>
+ <method name="cursorIntToContentValuesIfPresent(Landroid/database/Cursor;Landroid/content/ContentValues;Ljava/lang/String;)V" since="8"/>
+ <method name="cursorLongToContentValues(Landroid/database/Cursor;Ljava/lang/String;Landroid/content/ContentValues;)V"/>
+ <method name="cursorLongToContentValues(Landroid/database/Cursor;Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;)V"/>
+ <method name="cursorLongToContentValuesIfPresent(Landroid/database/Cursor;Landroid/content/ContentValues;Ljava/lang/String;)V" since="8"/>
+ <method name="cursorRowToContentValues(Landroid/database/Cursor;Landroid/content/ContentValues;)V"/>
+ <method name="cursorShortToContentValuesIfPresent(Landroid/database/Cursor;Landroid/content/ContentValues;Ljava/lang/String;)V" since="8"/>
+ <method name="cursorStringToContentValues(Landroid/database/Cursor;Ljava/lang/String;Landroid/content/ContentValues;)V"/>
+ <method name="cursorStringToContentValues(Landroid/database/Cursor;Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;)V"/>
+ <method name="cursorStringToContentValuesIfPresent(Landroid/database/Cursor;Landroid/content/ContentValues;Ljava/lang/String;)V" since="8"/>
+ <method name="cursorStringToInsertHelper(Landroid/database/Cursor;Ljava/lang/String;Landroid/database/DatabaseUtils$InsertHelper;I)V"/>
+ <method name="dumpCurrentRow(Landroid/database/Cursor;)V"/>
+ <method name="dumpCurrentRow(Landroid/database/Cursor;Ljava/io/PrintStream;)V"/>
+ <method name="dumpCurrentRow(Landroid/database/Cursor;Ljava/lang/StringBuilder;)V"/>
+ <method name="dumpCurrentRowToString(Landroid/database/Cursor;)Ljava/lang/String;"/>
+ <method name="dumpCursor(Landroid/database/Cursor;)V"/>
+ <method name="dumpCursor(Landroid/database/Cursor;Ljava/io/PrintStream;)V"/>
+ <method name="dumpCursor(Landroid/database/Cursor;Ljava/lang/StringBuilder;)V"/>
+ <method name="dumpCursorToString(Landroid/database/Cursor;)Ljava/lang/String;"/>
+ <method name="getCollationKey(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getHexCollationKey(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getSqlStatementType(Ljava/lang/String;)I" since="11"/>
+ <method name="longForQuery(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/String;)J"/>
+ <method name="longForQuery(Landroid/database/sqlite/SQLiteStatement;[Ljava/lang/String;)J"/>
+ <method name="queryNumEntries(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;)J"/>
+ <method name="queryNumEntries(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;Ljava/lang/String;)J" since="11"/>
+ <method name="queryNumEntries(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)J" since="11"/>
+ <method name="readExceptionFromParcel(Landroid/os/Parcel;)V"/>
+ <method name="readExceptionWithFileNotFoundExceptionFromParcel(Landroid/os/Parcel;)V"/>
+ <method name="readExceptionWithOperationApplicationExceptionFromParcel(Landroid/os/Parcel;)V" since="5"/>
+ <method name="sqlEscapeString(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="stringForQuery(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="stringForQuery(Landroid/database/sqlite/SQLiteStatement;[Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="writeExceptionToParcel(Landroid/os/Parcel;Ljava/lang/Exception;)V"/>
+ <field name="STATEMENT_ABORT" since="11"/>
+ <field name="STATEMENT_ATTACH" since="11"/>
+ <field name="STATEMENT_BEGIN" since="11"/>
+ <field name="STATEMENT_COMMIT" since="11"/>
+ <field name="STATEMENT_DDL" since="11"/>
+ <field name="STATEMENT_OTHER" since="11"/>
+ <field name="STATEMENT_PRAGMA" since="11"/>
+ <field name="STATEMENT_SELECT" since="11"/>
+ <field name="STATEMENT_UNPREPARED" since="11"/>
+ <field name="STATEMENT_UPDATE" since="11"/>
+ </class>
+ <class name="android/database/DatabaseUtils$InsertHelper" since="1" deprecated="17">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;)V"/>
+ <method name="bind(ID)V"/>
+ <method name="bind(IF)V"/>
+ <method name="bind(II)V"/>
+ <method name="bind(IJ)V"/>
+ <method name="bind(ILjava/lang/String;)V"/>
+ <method name="bind(IZ)V"/>
+ <method name="bind(I[B)V"/>
+ <method name="bindNull(I)V"/>
+ <method name="close()V"/>
+ <method name="execute()J"/>
+ <method name="getColumnIndex(Ljava/lang/String;)I"/>
+ <method name="insert(Landroid/content/ContentValues;)J"/>
+ <method name="prepareForInsert()V"/>
+ <method name="prepareForReplace()V"/>
+ <method name="replace(Landroid/content/ContentValues;)J"/>
+ <field name="TABLE_INFO_PRAGMA_DEFAULT_INDEX" removed="17"/>
+ </class>
+ <class name="android/database/DefaultDatabaseErrorHandler" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="android/database/DatabaseErrorHandler"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/database/MatrixCursor" since="1">
+ <extends name="android/database/AbstractCursor"/>
+ <method name="&lt;init>([Ljava/lang/String;)V"/>
+ <method name="&lt;init>([Ljava/lang/String;I)V"/>
+ <method name="addRow(Ljava/lang/Iterable;)V"/>
+ <method name="addRow([Ljava/lang/Object;)V"/>
+ <method name="newRow()Landroid/database/MatrixCursor$RowBuilder;"/>
+ </class>
+ <class name="android/database/MatrixCursor$RowBuilder" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/database/MatrixCursor;)V"/>
+ <method name="add(Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;"/>
+ <method name="add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;" since="19"/>
+ </class>
+ <class name="android/database/MergeCursor" since="1">
+ <extends name="android/database/AbstractCursor"/>
+ <method name="&lt;init>([Landroid/database/Cursor;)V"/>
+ </class>
+ <class name="android/database/Observable" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="registerObserver(Ljava/lang/Object;)V"/>
+ <method name="unregisterAll()V"/>
+ <method name="unregisterObserver(Ljava/lang/Object;)V"/>
+ <field name="mObservers"/>
+ </class>
+ <class name="android/database/SQLException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" since="16"/>
+ </class>
+ <class name="android/database/StaleDataException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteAbortException" since="1">
+ <extends name="android/database/sqlite/SQLiteException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteAccessPermException" since="11">
+ <extends name="android/database/sqlite/SQLiteException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteBindOrColumnIndexOutOfRangeException" since="11">
+ <extends name="android/database/sqlite/SQLiteException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteBlobTooBigException" since="11">
+ <extends name="android/database/sqlite/SQLiteException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteCantOpenDatabaseException" since="11">
+ <extends name="android/database/sqlite/SQLiteException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteClosable" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable" since="16"/>
+ <method name="&lt;init>()V"/>
+ <method name="acquireReference()V"/>
+ <method name="onAllReferencesReleased()V"/>
+ <method name="onAllReferencesReleasedFromContainer()V" deprecated="16"/>
+ <method name="releaseReference()V"/>
+ <method name="releaseReferenceFromContainer()V" deprecated="16"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteConstraintException" since="1">
+ <extends name="android/database/sqlite/SQLiteException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteCursor" since="1">
+ <extends name="android/database/AbstractWindowedCursor"/>
+ <method name="&lt;init>(Landroid/database/sqlite/SQLiteCursorDriver;Ljava/lang/String;Landroid/database/sqlite/SQLiteQuery;)V" since="11"/>
+ <method name="&lt;init>(Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteCursorDriver;Ljava/lang/String;Landroid/database/sqlite/SQLiteQuery;)V" deprecated="16"/>
+ <method name="getDatabase()Landroid/database/sqlite/SQLiteDatabase;"/>
+ <method name="setSelectionArguments([Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteCursorDriver" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="cursorClosed()V"/>
+ <method name="cursorDeactivated()V"/>
+ <method name="cursorRequeried(Landroid/database/Cursor;)V"/>
+ <method name="query(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;[Ljava/lang/String;)Landroid/database/Cursor;"/>
+ <method name="setBindArguments([Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteDatabase" since="1">
+ <extends name="android/database/sqlite/SQLiteClosable"/>
+ <method name="&lt;init>()V"/>
+ <method name="beginTransaction()V"/>
+ <method name="beginTransactionNonExclusive()V" since="11"/>
+ <method name="beginTransactionWithListener(Landroid/database/sqlite/SQLiteTransactionListener;)V" since="5"/>
+ <method name="beginTransactionWithListenerNonExclusive(Landroid/database/sqlite/SQLiteTransactionListener;)V" since="11"/>
+ <method name="close()V" removed="16"/>
+ <method name="compileStatement(Ljava/lang/String;)Landroid/database/sqlite/SQLiteStatement;"/>
+ <method name="create(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;)Landroid/database/sqlite/SQLiteDatabase;"/>
+ <method name="delete(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)I"/>
+ <method name="deleteDatabase(Ljava/io/File;)Z" since="16"/>
+ <method name="disableWriteAheadLogging()V" since="16"/>
+ <method name="enableWriteAheadLogging()Z" since="11"/>
+ <method name="endTransaction()V"/>
+ <method name="execSQL(Ljava/lang/String;)V"/>
+ <method name="execSQL(Ljava/lang/String;[Ljava/lang/Object;)V"/>
+ <method name="findEditTable(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getAttachedDbs()Ljava/util/List;" since="11"/>
+ <method name="getMaximumSize()J"/>
+ <method name="getPageSize()J"/>
+ <method name="getPath()Ljava/lang/String;"/>
+ <method name="getSyncedTables()Ljava/util/Map;" deprecated="16"/>
+ <method name="getVersion()I"/>
+ <method name="inTransaction()Z"/>
+ <method name="insert(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;)J"/>
+ <method name="insertOrThrow(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;)J"/>
+ <method name="insertWithOnConflict(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;I)J" since="8"/>
+ <method name="isDatabaseIntegrityOk()Z" since="11"/>
+ <method name="isDbLockedByCurrentThread()Z"/>
+ <method name="isDbLockedByOtherThreads()Z" deprecated="16"/>
+ <method name="isOpen()Z"/>
+ <method name="isReadOnly()Z"/>
+ <method name="isWriteAheadLoggingEnabled()Z" since="16"/>
+ <method name="markTableSyncable(Ljava/lang/String;Ljava/lang/String;)V" deprecated="16"/>
+ <method name="markTableSyncable(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" deprecated="16"/>
+ <method name="needUpgrade(I)Z"/>
+ <method name="openDatabase(Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;I)Landroid/database/sqlite/SQLiteDatabase;"/>
+ <method name="openDatabase(Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;ILandroid/database/DatabaseErrorHandler;)Landroid/database/sqlite/SQLiteDatabase;" since="11"/>
+ <method name="openOrCreateDatabase(Ljava/io/File;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;)Landroid/database/sqlite/SQLiteDatabase;"/>
+ <method name="openOrCreateDatabase(Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;)Landroid/database/sqlite/SQLiteDatabase;"/>
+ <method name="openOrCreateDatabase(Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;Landroid/database/DatabaseErrorHandler;)Landroid/database/sqlite/SQLiteDatabase;" since="11"/>
+ <method name="query(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;"/>
+ <method name="query(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;"/>
+ <method name="query(ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;"/>
+ <method name="query(ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;" since="16"/>
+ <method name="queryWithFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;"/>
+ <method name="queryWithFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;" since="16"/>
+ <method name="rawQuery(Ljava/lang/String;[Ljava/lang/String;)Landroid/database/Cursor;"/>
+ <method name="rawQuery(Ljava/lang/String;[Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;" since="16"/>
+ <method name="rawQueryWithFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;"/>
+ <method name="rawQueryWithFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;" since="16"/>
+ <method name="releaseMemory()I"/>
+ <method name="replace(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;)J"/>
+ <method name="replaceOrThrow(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;)J"/>
+ <method name="setForeignKeyConstraintsEnabled(Z)V" since="16"/>
+ <method name="setLocale(Ljava/util/Locale;)V"/>
+ <method name="setLockingEnabled(Z)V" deprecated="16"/>
+ <method name="setMaxSqlCacheSize(I)V" since="11"/>
+ <method name="setMaximumSize(J)J"/>
+ <method name="setPageSize(J)V"/>
+ <method name="setTransactionSuccessful()V"/>
+ <method name="setVersion(I)V"/>
+ <method name="update(Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;)I"/>
+ <method name="updateWithOnConflict(Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;I)I" since="8"/>
+ <method name="validateSql(Ljava/lang/String;Landroid/os/CancellationSignal;)V" since="24"/>
+ <method name="yieldIfContended()Z" deprecated="16"/>
+ <method name="yieldIfContendedSafely()Z" since="3"/>
+ <method name="yieldIfContendedSafely(J)Z" since="5"/>
+ <field name="CONFLICT_ABORT" since="8"/>
+ <field name="CONFLICT_FAIL" since="8"/>
+ <field name="CONFLICT_IGNORE" since="8"/>
+ <field name="CONFLICT_NONE" since="8"/>
+ <field name="CONFLICT_REPLACE" since="8"/>
+ <field name="CONFLICT_ROLLBACK" since="8"/>
+ <field name="CREATE_IF_NECESSARY"/>
+ <field name="ENABLE_WRITE_AHEAD_LOGGING" since="16"/>
+ <field name="MAX_SQL_CACHE_SIZE" since="11"/>
+ <field name="NO_LOCALIZED_COLLATORS"/>
+ <field name="OPEN_READONLY"/>
+ <field name="OPEN_READWRITE"/>
+ <field name="SQLITE_MAX_LIKE_PATTERN_LENGTH"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteDatabase$CursorFactory" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="newCursor(Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteCursorDriver;Ljava/lang/String;Landroid/database/sqlite/SQLiteQuery;)Landroid/database/Cursor;"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteDatabaseCorruptException" since="1">
+ <extends name="android/database/sqlite/SQLiteException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteDatabaseLockedException" since="11">
+ <extends name="android/database/sqlite/SQLiteException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteDatatypeMismatchException" since="11">
+ <extends name="android/database/sqlite/SQLiteException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteDiskIOException" since="1">
+ <extends name="android/database/sqlite/SQLiteException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteDoneException" since="1">
+ <extends name="android/database/sqlite/SQLiteException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteException" since="1">
+ <extends name="android/database/SQLException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" since="16"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteFullException" since="1">
+ <extends name="android/database/sqlite/SQLiteException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteMisuseException" since="1">
+ <extends name="android/database/sqlite/SQLiteException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteOpenHelper" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;ILandroid/database/DatabaseErrorHandler;)V" since="11"/>
+ <method name="close()V"/>
+ <method name="getDatabaseName()Ljava/lang/String;" since="14"/>
+ <method name="getReadableDatabase()Landroid/database/sqlite/SQLiteDatabase;"/>
+ <method name="getWritableDatabase()Landroid/database/sqlite/SQLiteDatabase;"/>
+ <method name="onConfigure(Landroid/database/sqlite/SQLiteDatabase;)V" since="16"/>
+ <method name="onCreate(Landroid/database/sqlite/SQLiteDatabase;)V"/>
+ <method name="onDowngrade(Landroid/database/sqlite/SQLiteDatabase;II)V" since="11"/>
+ <method name="onOpen(Landroid/database/sqlite/SQLiteDatabase;)V"/>
+ <method name="onUpgrade(Landroid/database/sqlite/SQLiteDatabase;II)V"/>
+ <method name="setWriteAheadLoggingEnabled(Z)V" since="16"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteOutOfMemoryException" since="11">
+ <extends name="android/database/sqlite/SQLiteException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteProgram" since="1">
+ <extends name="android/database/sqlite/SQLiteClosable"/>
+ <method name="&lt;init>()V"/>
+ <method name="bindAllArgsAsStrings([Ljava/lang/String;)V" since="11"/>
+ <method name="bindBlob(I[B)V"/>
+ <method name="bindDouble(ID)V"/>
+ <method name="bindLong(IJ)V"/>
+ <method name="bindNull(I)V"/>
+ <method name="bindString(ILjava/lang/String;)V"/>
+ <method name="clearBindings()V"/>
+ <method name="close()V" removed="16"/>
+ <method name="compile(Ljava/lang/String;Z)V" removed="16"/>
+ <method name="getUniqueId()I" deprecated="16"/>
+ <method name="native_bind_blob(I[B)V" removed="16"/>
+ <method name="native_bind_double(ID)V" removed="16"/>
+ <method name="native_bind_long(IJ)V" removed="16"/>
+ <method name="native_bind_null(I)V" removed="16"/>
+ <method name="native_bind_string(ILjava/lang/String;)V" removed="16"/>
+ <method name="native_compile(Ljava/lang/String;)V" removed="16"/>
+ <method name="native_finalize()V" removed="16"/>
+ <field name="mDatabase" removed="16"/>
+ <field name="nHandle" removed="16"/>
+ <field name="nStatement" removed="16"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteQuery" since="1">
+ <extends name="android/database/sqlite/SQLiteProgram"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteQueryBuilder" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="appendColumns(Ljava/lang/StringBuilder;[Ljava/lang/String;)V"/>
+ <method name="appendWhere(Ljava/lang/CharSequence;)V"/>
+ <method name="appendWhereEscapeString(Ljava/lang/String;)V"/>
+ <method name="buildQuery([Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" since="11"/>
+ <method name="buildQuery([Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" deprecated="16"/>
+ <method name="buildQueryString(ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="buildUnionQuery([Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="buildUnionSubQuery(Ljava/lang/String;[Ljava/lang/String;Ljava/util/Set;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" since="11"/>
+ <method name="buildUnionSubQuery(Ljava/lang/String;[Ljava/lang/String;Ljava/util/Set;ILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" deprecated="16"/>
+ <method name="getTables()Ljava/lang/String;"/>
+ <method name="query(Landroid/database/sqlite/SQLiteDatabase;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;"/>
+ <method name="query(Landroid/database/sqlite/SQLiteDatabase;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;"/>
+ <method name="query(Landroid/database/sqlite/SQLiteDatabase;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;" since="16"/>
+ <method name="setCursorFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;)V"/>
+ <method name="setDistinct(Z)V"/>
+ <method name="setProjectionMap(Ljava/util/Map;)V"/>
+ <method name="setStrict(Z)V" since="14"/>
+ <method name="setTables(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteReadOnlyDatabaseException" since="11">
+ <extends name="android/database/sqlite/SQLiteException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteStatement" since="1">
+ <extends name="android/database/sqlite/SQLiteProgram"/>
+ <method name="&lt;init>()V"/>
+ <method name="execute()V"/>
+ <method name="executeInsert()J"/>
+ <method name="executeUpdateDelete()I" since="11"/>
+ <method name="simpleQueryForBlobFileDescriptor()Landroid/os/ParcelFileDescriptor;" since="11"/>
+ <method name="simpleQueryForLong()J"/>
+ <method name="simpleQueryForString()Ljava/lang/String;"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteTableLockedException" since="11">
+ <extends name="android/database/sqlite/SQLiteException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/database/sqlite/SQLiteTransactionListener" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="onBegin()V"/>
+ <method name="onCommit()V"/>
+ <method name="onRollback()V"/>
+ </class>
+ <class name="android/drm/DrmConvertedStatus" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(I[BI)V"/>
+ <field name="STATUS_ERROR"/>
+ <field name="STATUS_INPUTDATA_ERROR"/>
+ <field name="STATUS_OK"/>
+ <field name="convertedData"/>
+ <field name="offset"/>
+ <field name="statusCode"/>
+ </class>
+ <class name="android/drm/DrmErrorEvent" since="11">
+ <extends name="android/drm/DrmEvent"/>
+ <method name="&lt;init>(IILjava/lang/String;)V"/>
+ <method name="&lt;init>(IILjava/lang/String;Ljava/util/HashMap;)V" since="12"/>
+ <field name="TYPE_ACQUIRE_DRM_INFO_FAILED" since="12"/>
+ <field name="TYPE_NOT_SUPPORTED"/>
+ <field name="TYPE_NO_INTERNET_CONNECTION"/>
+ <field name="TYPE_OUT_OF_MEMORY"/>
+ <field name="TYPE_PROCESS_DRM_INFO_FAILED"/>
+ <field name="TYPE_REMOVE_ALL_RIGHTS_FAILED"/>
+ <field name="TYPE_RIGHTS_NOT_INSTALLED"/>
+ <field name="TYPE_RIGHTS_RENEWAL_NOT_ALLOWED"/>
+ </class>
+ <class name="android/drm/DrmEvent" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(IILjava/lang/String;)V"/>
+ <method name="&lt;init>(IILjava/lang/String;Ljava/util/HashMap;)V" since="12"/>
+ <method name="getAttribute(Ljava/lang/String;)Ljava/lang/Object;" since="12"/>
+ <method name="getMessage()Ljava/lang/String;"/>
+ <method name="getType()I"/>
+ <method name="getUniqueId()I"/>
+ <field name="DRM_INFO_OBJECT" since="12"/>
+ <field name="DRM_INFO_STATUS_OBJECT"/>
+ <field name="TYPE_ALL_RIGHTS_REMOVED"/>
+ <field name="TYPE_DRM_INFO_PROCESSED"/>
+ </class>
+ <class name="android/drm/DrmInfo" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(ILjava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(I[BLjava/lang/String;)V"/>
+ <method name="get(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="getData()[B"/>
+ <method name="getInfoType()I"/>
+ <method name="getMimeType()Ljava/lang/String;"/>
+ <method name="iterator()Ljava/util/Iterator;"/>
+ <method name="keyIterator()Ljava/util/Iterator;"/>
+ <method name="put(Ljava/lang/String;Ljava/lang/Object;)V"/>
+ </class>
+ <class name="android/drm/DrmInfoEvent" since="11">
+ <extends name="android/drm/DrmEvent"/>
+ <method name="&lt;init>(IILjava/lang/String;)V"/>
+ <method name="&lt;init>(IILjava/lang/String;Ljava/util/HashMap;)V" since="12"/>
+ <field name="TYPE_ACCOUNT_ALREADY_REGISTERED"/>
+ <field name="TYPE_ALREADY_REGISTERED_BY_ANOTHER_ACCOUNT"/>
+ <field name="TYPE_REMOVE_RIGHTS"/>
+ <field name="TYPE_RIGHTS_INSTALLED"/>
+ <field name="TYPE_RIGHTS_REMOVED" since="12"/>
+ <field name="TYPE_WAIT_FOR_RIGHTS"/>
+ </class>
+ <class name="android/drm/DrmInfoRequest" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(ILjava/lang/String;)V"/>
+ <method name="get(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="getInfoType()I"/>
+ <method name="getMimeType()Ljava/lang/String;"/>
+ <method name="iterator()Ljava/util/Iterator;"/>
+ <method name="keyIterator()Ljava/util/Iterator;"/>
+ <method name="put(Ljava/lang/String;Ljava/lang/Object;)V"/>
+ <field name="ACCOUNT_ID"/>
+ <field name="SUBSCRIPTION_ID"/>
+ <field name="TYPE_REGISTRATION_INFO"/>
+ <field name="TYPE_RIGHTS_ACQUISITION_INFO"/>
+ <field name="TYPE_RIGHTS_ACQUISITION_PROGRESS_INFO"/>
+ <field name="TYPE_UNREGISTRATION_INFO"/>
+ </class>
+ <class name="android/drm/DrmInfoStatus" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(IILandroid/drm/ProcessedData;Ljava/lang/String;)V"/>
+ <field name="STATUS_ERROR"/>
+ <field name="STATUS_OK"/>
+ <field name="data"/>
+ <field name="infoType"/>
+ <field name="mimeType"/>
+ <field name="statusCode"/>
+ </class>
+ <class name="android/drm/DrmManagerClient" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable" since="24"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="acquireDrmInfo(Landroid/drm/DrmInfoRequest;)Landroid/drm/DrmInfo;"/>
+ <method name="acquireRights(Landroid/drm/DrmInfoRequest;)I"/>
+ <method name="canHandle(Landroid/net/Uri;Ljava/lang/String;)Z"/>
+ <method name="canHandle(Ljava/lang/String;Ljava/lang/String;)Z"/>
+ <method name="checkRightsStatus(Landroid/net/Uri;)I"/>
+ <method name="checkRightsStatus(Landroid/net/Uri;I)I"/>
+ <method name="checkRightsStatus(Ljava/lang/String;)I"/>
+ <method name="checkRightsStatus(Ljava/lang/String;I)I"/>
+ <method name="closeConvertSession(I)Landroid/drm/DrmConvertedStatus;"/>
+ <method name="convertData(I[B)Landroid/drm/DrmConvertedStatus;"/>
+ <method name="getAvailableDrmEngines()[Ljava/lang/String;"/>
+ <method name="getConstraints(Landroid/net/Uri;I)Landroid/content/ContentValues;"/>
+ <method name="getConstraints(Ljava/lang/String;I)Landroid/content/ContentValues;"/>
+ <method name="getDrmObjectType(Landroid/net/Uri;Ljava/lang/String;)I"/>
+ <method name="getDrmObjectType(Ljava/lang/String;Ljava/lang/String;)I"/>
+ <method name="getMetadata(Landroid/net/Uri;)Landroid/content/ContentValues;"/>
+ <method name="getMetadata(Ljava/lang/String;)Landroid/content/ContentValues;"/>
+ <method name="getOriginalMimeType(Landroid/net/Uri;)Ljava/lang/String;"/>
+ <method name="getOriginalMimeType(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="openConvertSession(Ljava/lang/String;)I"/>
+ <method name="processDrmInfo(Landroid/drm/DrmInfo;)I"/>
+ <method name="release()V" since="16" deprecated="24"/>
+ <method name="removeAllRights()I"/>
+ <method name="removeRights(Landroid/net/Uri;)I"/>
+ <method name="removeRights(Ljava/lang/String;)I"/>
+ <method name="saveRights(Landroid/drm/DrmRights;Ljava/lang/String;Ljava/lang/String;)I"/>
+ <method name="setOnErrorListener(Landroid/drm/DrmManagerClient$OnErrorListener;)V"/>
+ <method name="setOnEventListener(Landroid/drm/DrmManagerClient$OnEventListener;)V"/>
+ <method name="setOnInfoListener(Landroid/drm/DrmManagerClient$OnInfoListener;)V"/>
+ <field name="ERROR_NONE"/>
+ <field name="ERROR_UNKNOWN"/>
+ </class>
+ <class name="android/drm/DrmManagerClient$OnErrorListener" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="onError(Landroid/drm/DrmManagerClient;Landroid/drm/DrmErrorEvent;)V"/>
+ </class>
+ <class name="android/drm/DrmManagerClient$OnEventListener" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="onEvent(Landroid/drm/DrmManagerClient;Landroid/drm/DrmEvent;)V" since="12"/>
+ <method name="onEvent(Landroid/drm/DrmManagerClient;Landroid/drm/DrmEvent;Ljava/util/HashMap;)V" removed="12"/>
+ </class>
+ <class name="android/drm/DrmManagerClient$OnInfoListener" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="onInfo(Landroid/drm/DrmManagerClient;Landroid/drm/DrmInfoEvent;)V"/>
+ </class>
+ <class name="android/drm/DrmRights" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/drm/ProcessedData;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/io/File;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="getAccountId()Ljava/lang/String;"/>
+ <method name="getData()[B"/>
+ <method name="getMimeType()Ljava/lang/String;"/>
+ <method name="getSubscriptionId()Ljava/lang/String;"/>
+ </class>
+ <class name="android/drm/DrmStore" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V" deprecated="16"/>
+ </class>
+ <class name="android/drm/DrmStore$Action" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V" deprecated="16"/>
+ <field name="DEFAULT"/>
+ <field name="DISPLAY"/>
+ <field name="EXECUTE"/>
+ <field name="OUTPUT"/>
+ <field name="PLAY"/>
+ <field name="PREVIEW"/>
+ <field name="RINGTONE"/>
+ <field name="TRANSFER"/>
+ </class>
+ <class name="android/drm/DrmStore$ConstraintsColumns" since="11">
+ <extends name="java/lang/Object"/>
+ <field name="EXTENDED_METADATA"/>
+ <field name="LICENSE_AVAILABLE_TIME"/>
+ <field name="LICENSE_EXPIRY_TIME"/>
+ <field name="LICENSE_START_TIME"/>
+ <field name="MAX_REPEAT_COUNT"/>
+ <field name="REMAINING_REPEAT_COUNT"/>
+ </class>
+ <class name="android/drm/DrmStore$DrmObjectType" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V" deprecated="16"/>
+ <field name="CONTENT"/>
+ <field name="RIGHTS_OBJECT"/>
+ <field name="TRIGGER_OBJECT"/>
+ <field name="UNKNOWN"/>
+ </class>
+ <class name="android/drm/DrmStore$Playback" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V" deprecated="16"/>
+ <field name="PAUSE"/>
+ <field name="RESUME"/>
+ <field name="START"/>
+ <field name="STOP"/>
+ </class>
+ <class name="android/drm/DrmStore$RightsStatus" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V" deprecated="16"/>
+ <field name="RIGHTS_EXPIRED"/>
+ <field name="RIGHTS_INVALID"/>
+ <field name="RIGHTS_NOT_ACQUIRED"/>
+ <field name="RIGHTS_VALID"/>
+ </class>
+ <class name="android/drm/DrmSupportInfo" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addFileSuffix(Ljava/lang/String;)V"/>
+ <method name="addMimeType(Ljava/lang/String;)V"/>
+ <method name="getDescriprition()Ljava/lang/String;" deprecated="16"/>
+ <method name="getDescription()Ljava/lang/String;" since="16"/>
+ <method name="getFileSuffixIterator()Ljava/util/Iterator;"/>
+ <method name="getMimeTypeIterator()Ljava/util/Iterator;"/>
+ <method name="setDescription(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/drm/DrmUtils" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getExtendedMetadataParser([B)Landroid/drm/DrmUtils$ExtendedMetadataParser;"/>
+ </class>
+ <class name="android/drm/DrmUtils$ExtendedMetadataParser" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="get(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="iterator()Ljava/util/Iterator;"/>
+ <method name="keyIterator()Ljava/util/Iterator;"/>
+ </class>
+ <class name="android/drm/ProcessedData" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAccountId()Ljava/lang/String;"/>
+ <method name="getData()[B"/>
+ <method name="getSubscriptionId()Ljava/lang/String;"/>
+ </class>
+ <class name="android/gesture/Gesture" since="4">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="addStroke(Landroid/gesture/GestureStroke;)V"/>
+ <method name="getBoundingBox()Landroid/graphics/RectF;"/>
+ <method name="getID()J"/>
+ <method name="getLength()F"/>
+ <method name="getStrokes()Ljava/util/ArrayList;"/>
+ <method name="getStrokesCount()I"/>
+ <method name="toBitmap(IIII)Landroid/graphics/Bitmap;"/>
+ <method name="toBitmap(IIIII)Landroid/graphics/Bitmap;"/>
+ <method name="toPath()Landroid/graphics/Path;"/>
+ <method name="toPath(IIII)Landroid/graphics/Path;"/>
+ <method name="toPath(Landroid/graphics/Path;)Landroid/graphics/Path;"/>
+ <method name="toPath(Landroid/graphics/Path;IIII)Landroid/graphics/Path;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/gesture/GestureLibraries" since="4">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="fromFile(Ljava/io/File;)Landroid/gesture/GestureLibrary;"/>
+ <method name="fromFile(Ljava/lang/String;)Landroid/gesture/GestureLibrary;"/>
+ <method name="fromPrivateFile(Landroid/content/Context;Ljava/lang/String;)Landroid/gesture/GestureLibrary;"/>
+ <method name="fromRawResource(Landroid/content/Context;I)Landroid/gesture/GestureLibrary;"/>
+ </class>
+ <class name="android/gesture/GestureLibrary" since="4">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addGesture(Ljava/lang/String;Landroid/gesture/Gesture;)V"/>
+ <method name="getGestureEntries()Ljava/util/Set;"/>
+ <method name="getGestures(Ljava/lang/String;)Ljava/util/ArrayList;"/>
+ <method name="getOrientationStyle()I"/>
+ <method name="getSequenceType()I"/>
+ <method name="isReadOnly()Z"/>
+ <method name="load()Z"/>
+ <method name="recognize(Landroid/gesture/Gesture;)Ljava/util/ArrayList;"/>
+ <method name="removeEntry(Ljava/lang/String;)V"/>
+ <method name="removeGesture(Ljava/lang/String;Landroid/gesture/Gesture;)V"/>
+ <method name="save()Z"/>
+ <method name="setOrientationStyle(I)V"/>
+ <method name="setSequenceType(I)V"/>
+ <field name="mStore"/>
+ </class>
+ <class name="android/gesture/GestureOverlayView" since="4">
+ <extends name="android/widget/FrameLayout"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="addOnGestureListener(Landroid/gesture/GestureOverlayView$OnGestureListener;)V"/>
+ <method name="addOnGesturePerformedListener(Landroid/gesture/GestureOverlayView$OnGesturePerformedListener;)V"/>
+ <method name="addOnGesturingListener(Landroid/gesture/GestureOverlayView$OnGesturingListener;)V"/>
+ <method name="cancelClearAnimation()V"/>
+ <method name="cancelGesture()V"/>
+ <method name="clear(Z)V"/>
+ <method name="getCurrentStroke()Ljava/util/ArrayList;"/>
+ <method name="getFadeOffset()J"/>
+ <method name="getGesture()Landroid/gesture/Gesture;"/>
+ <method name="getGestureColor()I"/>
+ <method name="getGesturePath()Landroid/graphics/Path;"/>
+ <method name="getGesturePath(Landroid/graphics/Path;)Landroid/graphics/Path;"/>
+ <method name="getGestureStrokeAngleThreshold()F"/>
+ <method name="getGestureStrokeLengthThreshold()F"/>
+ <method name="getGestureStrokeSquarenessTreshold()F"/>
+ <method name="getGestureStrokeType()I"/>
+ <method name="getGestureStrokeWidth()F"/>
+ <method name="getOrientation()I"/>
+ <method name="getUncertainGestureColor()I"/>
+ <method name="isEventsInterceptionEnabled()Z"/>
+ <method name="isFadeEnabled()Z"/>
+ <method name="isGestureVisible()Z"/>
+ <method name="isGesturing()Z"/>
+ <method name="removeAllOnGestureListeners()V"/>
+ <method name="removeAllOnGesturePerformedListeners()V"/>
+ <method name="removeAllOnGesturingListeners()V"/>
+ <method name="removeOnGestureListener(Landroid/gesture/GestureOverlayView$OnGestureListener;)V"/>
+ <method name="removeOnGesturePerformedListener(Landroid/gesture/GestureOverlayView$OnGesturePerformedListener;)V"/>
+ <method name="removeOnGesturingListener(Landroid/gesture/GestureOverlayView$OnGesturingListener;)V"/>
+ <method name="setEventsInterceptionEnabled(Z)V"/>
+ <method name="setFadeEnabled(Z)V"/>
+ <method name="setFadeOffset(J)V"/>
+ <method name="setGesture(Landroid/gesture/Gesture;)V"/>
+ <method name="setGestureColor(I)V"/>
+ <method name="setGestureStrokeAngleThreshold(F)V"/>
+ <method name="setGestureStrokeLengthThreshold(F)V"/>
+ <method name="setGestureStrokeSquarenessTreshold(F)V"/>
+ <method name="setGestureStrokeType(I)V"/>
+ <method name="setGestureStrokeWidth(F)V"/>
+ <method name="setGestureVisible(Z)V"/>
+ <method name="setOrientation(I)V"/>
+ <method name="setUncertainGestureColor(I)V"/>
+ <field name="GESTURE_STROKE_TYPE_MULTIPLE"/>
+ <field name="GESTURE_STROKE_TYPE_SINGLE"/>
+ <field name="ORIENTATION_HORIZONTAL"/>
+ <field name="ORIENTATION_VERTICAL"/>
+ </class>
+ <class name="android/gesture/GestureOverlayView$OnGestureListener" since="4">
+ <extends name="java/lang/Object"/>
+ <method name="onGesture(Landroid/gesture/GestureOverlayView;Landroid/view/MotionEvent;)V"/>
+ <method name="onGestureCancelled(Landroid/gesture/GestureOverlayView;Landroid/view/MotionEvent;)V"/>
+ <method name="onGestureEnded(Landroid/gesture/GestureOverlayView;Landroid/view/MotionEvent;)V"/>
+ <method name="onGestureStarted(Landroid/gesture/GestureOverlayView;Landroid/view/MotionEvent;)V"/>
+ </class>
+ <class name="android/gesture/GestureOverlayView$OnGesturePerformedListener" since="4">
+ <extends name="java/lang/Object"/>
+ <method name="onGesturePerformed(Landroid/gesture/GestureOverlayView;Landroid/gesture/Gesture;)V"/>
+ </class>
+ <class name="android/gesture/GestureOverlayView$OnGesturingListener" since="4">
+ <extends name="java/lang/Object"/>
+ <method name="onGesturingEnded(Landroid/gesture/GestureOverlayView;)V"/>
+ <method name="onGesturingStarted(Landroid/gesture/GestureOverlayView;)V"/>
+ </class>
+ <class name="android/gesture/GesturePoint" since="4">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(FFJ)V"/>
+ <field name="timestamp"/>
+ <field name="x"/>
+ <field name="y"/>
+ </class>
+ <class name="android/gesture/GestureStore" since="4">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addGesture(Ljava/lang/String;Landroid/gesture/Gesture;)V"/>
+ <method name="getGestureEntries()Ljava/util/Set;"/>
+ <method name="getGestures(Ljava/lang/String;)Ljava/util/ArrayList;"/>
+ <method name="getOrientationStyle()I"/>
+ <method name="getSequenceType()I"/>
+ <method name="hasChanged()Z"/>
+ <method name="load(Ljava/io/InputStream;)V"/>
+ <method name="load(Ljava/io/InputStream;Z)V"/>
+ <method name="recognize(Landroid/gesture/Gesture;)Ljava/util/ArrayList;"/>
+ <method name="removeEntry(Ljava/lang/String;)V"/>
+ <method name="removeGesture(Ljava/lang/String;Landroid/gesture/Gesture;)V"/>
+ <method name="save(Ljava/io/OutputStream;)V"/>
+ <method name="save(Ljava/io/OutputStream;Z)V"/>
+ <method name="setOrientationStyle(I)V"/>
+ <method name="setSequenceType(I)V"/>
+ <field name="ORIENTATION_INVARIANT"/>
+ <field name="ORIENTATION_SENSITIVE"/>
+ <field name="SEQUENCE_INVARIANT"/>
+ <field name="SEQUENCE_SENSITIVE"/>
+ </class>
+ <class name="android/gesture/GestureStroke" since="4">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/util/ArrayList;)V"/>
+ <method name="clearPath()V"/>
+ <method name="computeOrientedBoundingBox()Landroid/gesture/OrientedBoundingBox;"/>
+ <method name="getPath()Landroid/graphics/Path;"/>
+ <method name="toPath(FFI)Landroid/graphics/Path;"/>
+ <field name="boundingBox"/>
+ <field name="length"/>
+ <field name="points"/>
+ </class>
+ <class name="android/gesture/GestureUtils" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="computeOrientedBoundingBox(Ljava/util/ArrayList;)Landroid/gesture/OrientedBoundingBox;"/>
+ <method name="computeOrientedBoundingBox([F)Landroid/gesture/OrientedBoundingBox;"/>
+ <method name="spatialSampling(Landroid/gesture/Gesture;I)[F"/>
+ <method name="spatialSampling(Landroid/gesture/Gesture;IZ)[F"/>
+ <method name="temporalSampling(Landroid/gesture/GestureStroke;I)[F"/>
+ </class>
+ <class name="android/gesture/OrientedBoundingBox" since="4">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="centerX"/>
+ <field name="centerY"/>
+ <field name="height"/>
+ <field name="orientation"/>
+ <field name="squareness"/>
+ <field name="width"/>
+ </class>
+ <class name="android/gesture/Prediction" since="4">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="name"/>
+ <field name="score"/>
+ </class>
+ <class name="android/graphics/AvoidXfermode" since="1" deprecated="16" removed="24">
+ <extends name="android/graphics/Xfermode"/>
+ <method name="&lt;init>(IILandroid/graphics/AvoidXfermode$Mode;)V"/>
+ </class>
+ <class name="android/graphics/AvoidXfermode$Mode" since="1" removed="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/AvoidXfermode$Mode;"/>
+ <method name="values()[Landroid/graphics/AvoidXfermode$Mode;"/>
+ <field name="AVOID"/>
+ <field name="TARGET"/>
+ </class>
+ <class name="android/graphics/Bitmap" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="compress(Landroid/graphics/Bitmap$CompressFormat;ILjava/io/OutputStream;)Z"/>
+ <method name="copy(Landroid/graphics/Bitmap$Config;Z)Landroid/graphics/Bitmap;"/>
+ <method name="copyPixelsFromBuffer(Ljava/nio/Buffer;)V" since="3"/>
+ <method name="copyPixelsToBuffer(Ljava/nio/Buffer;)V"/>
+ <method name="createBitmap(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;"/>
+ <method name="createBitmap(IILandroid/graphics/Bitmap$Config;Z)Landroid/graphics/Bitmap;" since="26"/>
+ <method name="createBitmap(IILandroid/graphics/Bitmap$Config;ZLandroid/graphics/ColorSpace;)Landroid/graphics/Bitmap;" since="26"/>
+ <method name="createBitmap(Landroid/graphics/Bitmap;)Landroid/graphics/Bitmap;"/>
+ <method name="createBitmap(Landroid/graphics/Bitmap;IIII)Landroid/graphics/Bitmap;"/>
+ <method name="createBitmap(Landroid/graphics/Bitmap;IIIILandroid/graphics/Matrix;Z)Landroid/graphics/Bitmap;"/>
+ <method name="createBitmap(Landroid/util/DisplayMetrics;IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;" since="17"/>
+ <method name="createBitmap(Landroid/util/DisplayMetrics;IILandroid/graphics/Bitmap$Config;Z)Landroid/graphics/Bitmap;" since="26"/>
+ <method name="createBitmap(Landroid/util/DisplayMetrics;IILandroid/graphics/Bitmap$Config;ZLandroid/graphics/ColorSpace;)Landroid/graphics/Bitmap;" since="26"/>
+ <method name="createBitmap(Landroid/util/DisplayMetrics;[IIIIILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;" since="17"/>
+ <method name="createBitmap(Landroid/util/DisplayMetrics;[IIILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;" since="17"/>
+ <method name="createBitmap([IIIIILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;"/>
+ <method name="createBitmap([IIILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;"/>
+ <method name="createScaledBitmap(Landroid/graphics/Bitmap;IIZ)Landroid/graphics/Bitmap;"/>
+ <method name="eraseColor(I)V"/>
+ <method name="extractAlpha()Landroid/graphics/Bitmap;"/>
+ <method name="extractAlpha(Landroid/graphics/Paint;[I)Landroid/graphics/Bitmap;"/>
+ <method name="getAllocationByteCount()I" since="19"/>
+ <method name="getByteCount()I" since="12"/>
+ <method name="getColorSpace()Landroid/graphics/ColorSpace;" since="26"/>
+ <method name="getConfig()Landroid/graphics/Bitmap$Config;"/>
+ <method name="getDensity()I" since="4"/>
+ <method name="getGenerationId()I" since="12"/>
+ <method name="getHeight()I"/>
+ <method name="getNinePatchChunk()[B"/>
+ <method name="getPixel(II)I"/>
+ <method name="getPixels([IIIIIII)V"/>
+ <method name="getRowBytes()I"/>
+ <method name="getScaledHeight(I)I" since="4"/>
+ <method name="getScaledHeight(Landroid/graphics/Canvas;)I" since="4"/>
+ <method name="getScaledHeight(Landroid/util/DisplayMetrics;)I" since="4"/>
+ <method name="getScaledWidth(I)I" since="4"/>
+ <method name="getScaledWidth(Landroid/graphics/Canvas;)I" since="4"/>
+ <method name="getScaledWidth(Landroid/util/DisplayMetrics;)I" since="4"/>
+ <method name="getWidth()I"/>
+ <method name="hasAlpha()Z"/>
+ <method name="hasMipMap()Z" since="17"/>
+ <method name="isMutable()Z"/>
+ <method name="isPremultiplied()Z" since="17"/>
+ <method name="isRecycled()Z"/>
+ <method name="prepareToDraw()V" since="4"/>
+ <method name="reconfigure(IILandroid/graphics/Bitmap$Config;)V" since="19"/>
+ <method name="recycle()V"/>
+ <method name="sameAs(Landroid/graphics/Bitmap;)Z" since="12"/>
+ <method name="setConfig(Landroid/graphics/Bitmap$Config;)V" since="19"/>
+ <method name="setDensity(I)V" since="4"/>
+ <method name="setHasAlpha(Z)V" since="12"/>
+ <method name="setHasMipMap(Z)V" since="17"/>
+ <method name="setHeight(I)V" since="19"/>
+ <method name="setPixel(III)V"/>
+ <method name="setPixels([IIIIIII)V"/>
+ <method name="setPremultiplied(Z)V" since="19"/>
+ <method name="setWidth(I)V" since="19"/>
+ <field name="CREATOR"/>
+ <field name="DENSITY_NONE" since="4"/>
+ </class>
+ <class name="android/graphics/Bitmap$CompressFormat" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Bitmap$CompressFormat;"/>
+ <method name="values()[Landroid/graphics/Bitmap$CompressFormat;"/>
+ <field name="JPEG"/>
+ <field name="PNG"/>
+ <field name="WEBP" since="14"/>
+ </class>
+ <class name="android/graphics/Bitmap$Config" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Bitmap$Config;"/>
+ <method name="values()[Landroid/graphics/Bitmap$Config;"/>
+ <field name="ALPHA_8"/>
+ <field name="ARGB_4444"/>
+ <field name="ARGB_8888"/>
+ <field name="HARDWARE" since="26"/>
+ <field name="RGBA_F16" since="26"/>
+ <field name="RGB_565"/>
+ </class>
+ <class name="android/graphics/BitmapFactory" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="decodeByteArray([BII)Landroid/graphics/Bitmap;"/>
+ <method name="decodeByteArray([BIILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;"/>
+ <method name="decodeFile(Ljava/lang/String;)Landroid/graphics/Bitmap;"/>
+ <method name="decodeFile(Ljava/lang/String;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;"/>
+ <method name="decodeFileDescriptor(Ljava/io/FileDescriptor;)Landroid/graphics/Bitmap;"/>
+ <method name="decodeFileDescriptor(Ljava/io/FileDescriptor;Landroid/graphics/Rect;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;"/>
+ <method name="decodeResource(Landroid/content/res/Resources;I)Landroid/graphics/Bitmap;"/>
+ <method name="decodeResource(Landroid/content/res/Resources;ILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;"/>
+ <method name="decodeResourceStream(Landroid/content/res/Resources;Landroid/util/TypedValue;Ljava/io/InputStream;Landroid/graphics/Rect;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;" since="4"/>
+ <method name="decodeStream(Ljava/io/InputStream;)Landroid/graphics/Bitmap;"/>
+ <method name="decodeStream(Ljava/io/InputStream;Landroid/graphics/Rect;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;"/>
+ </class>
+ <class name="android/graphics/BitmapFactory$Options" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="requestCancelDecode()V" deprecated="24"/>
+ <field name="inBitmap" since="11"/>
+ <field name="inDensity" since="4"/>
+ <field name="inDither" deprecated="24"/>
+ <field name="inInputShareable" since="4" deprecated="21"/>
+ <field name="inJustDecodeBounds"/>
+ <field name="inMutable" since="11"/>
+ <field name="inPreferQualityOverSpeed" since="10" deprecated="24"/>
+ <field name="inPreferredColorSpace" since="26"/>
+ <field name="inPreferredConfig"/>
+ <field name="inPremultiplied" since="19"/>
+ <field name="inPurgeable" since="4" deprecated="21"/>
+ <field name="inSampleSize"/>
+ <field name="inScaled" since="4"/>
+ <field name="inScreenDensity" since="4"/>
+ <field name="inTargetDensity" since="4"/>
+ <field name="inTempStorage"/>
+ <field name="mCancel" deprecated="24"/>
+ <field name="outColorSpace" since="26"/>
+ <field name="outConfig" since="26"/>
+ <field name="outHeight"/>
+ <field name="outMimeType"/>
+ <field name="outWidth"/>
+ </class>
+ <class name="android/graphics/BitmapRegionDecoder" since="10">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="decodeRegion(Landroid/graphics/Rect;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;"/>
+ <method name="getHeight()I"/>
+ <method name="getWidth()I"/>
+ <method name="isRecycled()Z"/>
+ <method name="newInstance(Ljava/io/FileDescriptor;Z)Landroid/graphics/BitmapRegionDecoder;"/>
+ <method name="newInstance(Ljava/io/InputStream;Z)Landroid/graphics/BitmapRegionDecoder;"/>
+ <method name="newInstance(Ljava/lang/String;Z)Landroid/graphics/BitmapRegionDecoder;"/>
+ <method name="newInstance([BIIZ)Landroid/graphics/BitmapRegionDecoder;"/>
+ <method name="recycle()V"/>
+ </class>
+ <class name="android/graphics/BitmapShader" since="1">
+ <extends name="android/graphics/Shader"/>
+ <method name="&lt;init>(Landroid/graphics/Bitmap;Landroid/graphics/Shader$TileMode;Landroid/graphics/Shader$TileMode;)V"/>
+ </class>
+ <class name="android/graphics/BlurMaskFilter" since="1">
+ <extends name="android/graphics/MaskFilter"/>
+ <method name="&lt;init>(FLandroid/graphics/BlurMaskFilter$Blur;)V"/>
+ </class>
+ <class name="android/graphics/BlurMaskFilter$Blur" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/BlurMaskFilter$Blur;"/>
+ <method name="values()[Landroid/graphics/BlurMaskFilter$Blur;"/>
+ <field name="INNER"/>
+ <field name="NORMAL"/>
+ <field name="OUTER"/>
+ <field name="SOLID"/>
+ </class>
+ <class name="android/graphics/Camera" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="applyToCanvas(Landroid/graphics/Canvas;)V"/>
+ <method name="dotWithNormal(FFF)F"/>
+ <method name="getLocationX()F" since="16"/>
+ <method name="getLocationY()F" since="16"/>
+ <method name="getLocationZ()F" since="16"/>
+ <method name="getMatrix(Landroid/graphics/Matrix;)V"/>
+ <method name="restore()V"/>
+ <method name="rotate(FFF)V" since="12"/>
+ <method name="rotateX(F)V"/>
+ <method name="rotateY(F)V"/>
+ <method name="rotateZ(F)V"/>
+ <method name="save()V"/>
+ <method name="setLocation(FFF)V" since="12"/>
+ <method name="translate(FFF)V"/>
+ </class>
+ <class name="android/graphics/Canvas" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/graphics/Bitmap;)V"/>
+ <method name="&lt;init>(Ljavax/microedition/khronos/opengles/GL;)V" removed="11"/>
+ <method name="clipOutPath(Landroid/graphics/Path;)Z" since="26"/>
+ <method name="clipOutRect(FFFF)Z" since="26"/>
+ <method name="clipOutRect(IIII)Z" since="26"/>
+ <method name="clipOutRect(Landroid/graphics/Rect;)Z" since="26"/>
+ <method name="clipOutRect(Landroid/graphics/RectF;)Z" since="26"/>
+ <method name="clipPath(Landroid/graphics/Path;)Z"/>
+ <method name="clipPath(Landroid/graphics/Path;Landroid/graphics/Region$Op;)Z" deprecated="26"/>
+ <method name="clipRect(FFFF)Z"/>
+ <method name="clipRect(FFFFLandroid/graphics/Region$Op;)Z" deprecated="26"/>
+ <method name="clipRect(IIII)Z"/>
+ <method name="clipRect(Landroid/graphics/Rect;)Z"/>
+ <method name="clipRect(Landroid/graphics/Rect;Landroid/graphics/Region$Op;)Z" deprecated="26"/>
+ <method name="clipRect(Landroid/graphics/RectF;)Z"/>
+ <method name="clipRect(Landroid/graphics/RectF;Landroid/graphics/Region$Op;)Z" deprecated="26"/>
+ <method name="clipRegion(Landroid/graphics/Region;)Z" deprecated="21" removed="26"/>
+ <method name="clipRegion(Landroid/graphics/Region;Landroid/graphics/Region$Op;)Z" deprecated="21" removed="26"/>
+ <method name="concat(Landroid/graphics/Matrix;)V"/>
+ <method name="drawARGB(IIII)V"/>
+ <method name="drawArc(FFFFFFZLandroid/graphics/Paint;)V" since="21"/>
+ <method name="drawArc(Landroid/graphics/RectF;FFZLandroid/graphics/Paint;)V"/>
+ <method name="drawBitmap(Landroid/graphics/Bitmap;FFLandroid/graphics/Paint;)V"/>
+ <method name="drawBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Matrix;Landroid/graphics/Paint;)V"/>
+ <method name="drawBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Paint;)V"/>
+ <method name="drawBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Rect;Landroid/graphics/RectF;Landroid/graphics/Paint;)V"/>
+ <method name="drawBitmap([IIIFFIIZLandroid/graphics/Paint;)V" since="3" deprecated="21"/>
+ <method name="drawBitmap([IIIIIIIZLandroid/graphics/Paint;)V" deprecated="21"/>
+ <method name="drawBitmapMesh(Landroid/graphics/Bitmap;II[FI[IILandroid/graphics/Paint;)V"/>
+ <method name="drawCircle(FFFLandroid/graphics/Paint;)V"/>
+ <method name="drawColor(I)V"/>
+ <method name="drawColor(ILandroid/graphics/PorterDuff$Mode;)V"/>
+ <method name="drawLine(FFFFLandroid/graphics/Paint;)V"/>
+ <method name="drawLines([FIILandroid/graphics/Paint;)V"/>
+ <method name="drawLines([FLandroid/graphics/Paint;)V"/>
+ <method name="drawOval(FFFFLandroid/graphics/Paint;)V" since="21"/>
+ <method name="drawOval(Landroid/graphics/RectF;Landroid/graphics/Paint;)V"/>
+ <method name="drawPaint(Landroid/graphics/Paint;)V"/>
+ <method name="drawPath(Landroid/graphics/Path;Landroid/graphics/Paint;)V"/>
+ <method name="drawPicture(Landroid/graphics/Picture;)V"/>
+ <method name="drawPicture(Landroid/graphics/Picture;Landroid/graphics/Rect;)V"/>
+ <method name="drawPicture(Landroid/graphics/Picture;Landroid/graphics/RectF;)V"/>
+ <method name="drawPoint(FFLandroid/graphics/Paint;)V"/>
+ <method name="drawPoints([FIILandroid/graphics/Paint;)V"/>
+ <method name="drawPoints([FLandroid/graphics/Paint;)V"/>
+ <method name="drawPosText(Ljava/lang/String;[FLandroid/graphics/Paint;)V" deprecated="16"/>
+ <method name="drawPosText([CII[FLandroid/graphics/Paint;)V" deprecated="16"/>
+ <method name="drawRGB(III)V"/>
+ <method name="drawRect(FFFFLandroid/graphics/Paint;)V"/>
+ <method name="drawRect(Landroid/graphics/Rect;Landroid/graphics/Paint;)V"/>
+ <method name="drawRect(Landroid/graphics/RectF;Landroid/graphics/Paint;)V"/>
+ <method name="drawRoundRect(FFFFFFLandroid/graphics/Paint;)V" since="21"/>
+ <method name="drawRoundRect(Landroid/graphics/RectF;FFLandroid/graphics/Paint;)V"/>
+ <method name="drawText(Ljava/lang/CharSequence;IIFFLandroid/graphics/Paint;)V"/>
+ <method name="drawText(Ljava/lang/String;FFLandroid/graphics/Paint;)V"/>
+ <method name="drawText(Ljava/lang/String;IIFFLandroid/graphics/Paint;)V"/>
+ <method name="drawText([CIIFFLandroid/graphics/Paint;)V"/>
+ <method name="drawTextOnPath(Ljava/lang/String;Landroid/graphics/Path;FFLandroid/graphics/Paint;)V"/>
+ <method name="drawTextOnPath([CIILandroid/graphics/Path;FFLandroid/graphics/Paint;)V"/>
+ <method name="drawTextRun(Ljava/lang/CharSequence;IIIIFFZLandroid/graphics/Paint;)V" since="23"/>
+ <method name="drawTextRun([CIIIIFFZLandroid/graphics/Paint;)V" since="23"/>
+ <method name="drawVertices(Landroid/graphics/Canvas$VertexMode;I[FI[FI[II[SIILandroid/graphics/Paint;)V"/>
+ <method name="freeGlCaches()V" removed="11"/>
+ <method name="getClipBounds()Landroid/graphics/Rect;"/>
+ <method name="getClipBounds(Landroid/graphics/Rect;)Z"/>
+ <method name="getDensity()I" since="4"/>
+ <method name="getDrawFilter()Landroid/graphics/DrawFilter;"/>
+ <method name="getGL()Ljavax/microedition/khronos/opengles/GL;" removed="11"/>
+ <method name="getHeight()I"/>
+ <method name="getMatrix()Landroid/graphics/Matrix;" deprecated="16"/>
+ <method name="getMatrix(Landroid/graphics/Matrix;)V" deprecated="16"/>
+ <method name="getMaximumBitmapHeight()I" since="14"/>
+ <method name="getMaximumBitmapWidth()I" since="14"/>
+ <method name="getSaveCount()I"/>
+ <method name="getWidth()I"/>
+ <method name="isHardwareAccelerated()Z" since="11"/>
+ <method name="isOpaque()Z"/>
+ <method name="quickReject(FFFFLandroid/graphics/Canvas$EdgeType;)Z"/>
+ <method name="quickReject(Landroid/graphics/Path;Landroid/graphics/Canvas$EdgeType;)Z"/>
+ <method name="quickReject(Landroid/graphics/RectF;Landroid/graphics/Canvas$EdgeType;)Z"/>
+ <method name="restore()V"/>
+ <method name="restoreToCount(I)V"/>
+ <method name="rotate(F)V"/>
+ <method name="rotate(FFF)V"/>
+ <method name="save()I"/>
+ <method name="save(I)I" deprecated="26"/>
+ <method name="saveLayer(FFFFLandroid/graphics/Paint;)I" since="21"/>
+ <method name="saveLayer(FFFFLandroid/graphics/Paint;I)I" deprecated="26"/>
+ <method name="saveLayer(Landroid/graphics/RectF;Landroid/graphics/Paint;)I" since="21"/>
+ <method name="saveLayer(Landroid/graphics/RectF;Landroid/graphics/Paint;I)I" deprecated="26"/>
+ <method name="saveLayerAlpha(FFFFI)I" since="21"/>
+ <method name="saveLayerAlpha(FFFFII)I" deprecated="26"/>
+ <method name="saveLayerAlpha(Landroid/graphics/RectF;I)I" since="21"/>
+ <method name="saveLayerAlpha(Landroid/graphics/RectF;II)I" deprecated="26"/>
+ <method name="scale(FF)V"/>
+ <method name="scale(FFFF)V"/>
+ <method name="setBitmap(Landroid/graphics/Bitmap;)V"/>
+ <method name="setDensity(I)V" since="4"/>
+ <method name="setDrawFilter(Landroid/graphics/DrawFilter;)V"/>
+ <method name="setMatrix(Landroid/graphics/Matrix;)V"/>
+ <method name="setViewport(II)V" removed="11"/>
+ <method name="skew(FF)V"/>
+ <method name="translate(FF)V"/>
+ <field name="ALL_SAVE_FLAG"/>
+ <field name="CLIP_SAVE_FLAG" deprecated="26"/>
+ <field name="CLIP_TO_LAYER_SAVE_FLAG" deprecated="26"/>
+ <field name="FULL_COLOR_LAYER_SAVE_FLAG" deprecated="26"/>
+ <field name="HAS_ALPHA_LAYER_SAVE_FLAG" deprecated="26"/>
+ <field name="MATRIX_SAVE_FLAG" deprecated="26"/>
+ </class>
+ <class name="android/graphics/Canvas$EdgeType" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Canvas$EdgeType;"/>
+ <method name="values()[Landroid/graphics/Canvas$EdgeType;"/>
+ <field name="AA"/>
+ <field name="BW"/>
+ </class>
+ <class name="android/graphics/Canvas$VertexMode" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Canvas$VertexMode;"/>
+ <method name="values()[Landroid/graphics/Canvas$VertexMode;"/>
+ <field name="TRIANGLES"/>
+ <field name="TRIANGLE_FAN"/>
+ <field name="TRIANGLE_STRIP"/>
+ </class>
+ <class name="android/graphics/Color" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="HSVToColor(I[F)I"/>
+ <method name="HSVToColor([F)I"/>
+ <method name="RGBToHSV(III[F)V"/>
+ <method name="alpha()F" since="26"/>
+ <method name="alpha(I)I"/>
+ <method name="alpha(J)F" since="26"/>
+ <method name="argb(FFFF)I" since="26"/>
+ <method name="argb(IIII)I"/>
+ <method name="blue()F" since="26"/>
+ <method name="blue(I)I"/>
+ <method name="blue(J)F" since="26"/>
+ <method name="colorSpace(J)Landroid/graphics/ColorSpace;" since="26"/>
+ <method name="colorToHSV(I[F)V"/>
+ <method name="convert(FFFFLandroid/graphics/ColorSpace$Connector;)J" since="26"/>
+ <method name="convert(FFFFLandroid/graphics/ColorSpace;Landroid/graphics/ColorSpace;)J" since="26"/>
+ <method name="convert(ILandroid/graphics/ColorSpace;)J" since="26"/>
+ <method name="convert(JLandroid/graphics/ColorSpace$Connector;)J" since="26"/>
+ <method name="convert(JLandroid/graphics/ColorSpace;)J" since="26"/>
+ <method name="convert(Landroid/graphics/ColorSpace;)Landroid/graphics/Color;" since="26"/>
+ <method name="getColorSpace()Landroid/graphics/ColorSpace;" since="26"/>
+ <method name="getComponent(I)F" since="26"/>
+ <method name="getComponentCount()I" since="26"/>
+ <method name="getComponents()[F" since="26"/>
+ <method name="getComponents([F)[F" since="26"/>
+ <method name="getModel()Landroid/graphics/ColorSpace$Model;" since="26"/>
+ <method name="green()F" since="26"/>
+ <method name="green(I)I"/>
+ <method name="green(J)F" since="26"/>
+ <method name="isInColorSpace(JLandroid/graphics/ColorSpace;)Z" since="26"/>
+ <method name="isSrgb()Z" since="26"/>
+ <method name="isSrgb(J)Z" since="26"/>
+ <method name="isWideGamut()Z" since="26"/>
+ <method name="isWideGamut(J)Z" since="26"/>
+ <method name="luminance()F" since="26"/>
+ <method name="luminance(I)F" since="24"/>
+ <method name="luminance(J)F" since="26"/>
+ <method name="pack()J" since="26"/>
+ <method name="pack(FFF)J" since="26"/>
+ <method name="pack(FFFF)J" since="26"/>
+ <method name="pack(FFFFLandroid/graphics/ColorSpace;)J" since="26"/>
+ <method name="pack(I)J" since="26"/>
+ <method name="parseColor(Ljava/lang/String;)I"/>
+ <method name="red()F" since="26"/>
+ <method name="red(I)I"/>
+ <method name="red(J)F" since="26"/>
+ <method name="rgb(FFF)I" since="26"/>
+ <method name="rgb(III)I"/>
+ <method name="toArgb()I" since="26"/>
+ <method name="toArgb(J)I" since="26"/>
+ <method name="valueOf(FFF)Landroid/graphics/Color;" since="26"/>
+ <method name="valueOf(FFFF)Landroid/graphics/Color;" since="26"/>
+ <method name="valueOf(FFFFLandroid/graphics/ColorSpace;)Landroid/graphics/Color;" since="26"/>
+ <method name="valueOf(I)Landroid/graphics/Color;" since="26"/>
+ <method name="valueOf(J)Landroid/graphics/Color;" since="26"/>
+ <method name="valueOf([FLandroid/graphics/ColorSpace;)Landroid/graphics/Color;" since="26"/>
+ <field name="BLACK"/>
+ <field name="BLUE"/>
+ <field name="CYAN"/>
+ <field name="DKGRAY"/>
+ <field name="GRAY"/>
+ <field name="GREEN"/>
+ <field name="LTGRAY"/>
+ <field name="MAGENTA"/>
+ <field name="RED"/>
+ <field name="TRANSPARENT"/>
+ <field name="WHITE"/>
+ <field name="YELLOW"/>
+ </class>
+ <class name="android/graphics/ColorFilter" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V" deprecated="26"/>
+ </class>
+ <class name="android/graphics/ColorMatrix" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/graphics/ColorMatrix;)V"/>
+ <method name="&lt;init>([F)V"/>
+ <method name="getArray()[F"/>
+ <method name="postConcat(Landroid/graphics/ColorMatrix;)V"/>
+ <method name="preConcat(Landroid/graphics/ColorMatrix;)V"/>
+ <method name="reset()V"/>
+ <method name="set(Landroid/graphics/ColorMatrix;)V"/>
+ <method name="set([F)V"/>
+ <method name="setConcat(Landroid/graphics/ColorMatrix;Landroid/graphics/ColorMatrix;)V"/>
+ <method name="setRGB2YUV()V"/>
+ <method name="setRotate(IF)V"/>
+ <method name="setSaturation(F)V"/>
+ <method name="setScale(FFFF)V"/>
+ <method name="setYUV2RGB()V"/>
+ </class>
+ <class name="android/graphics/ColorMatrixColorFilter" since="1">
+ <extends name="android/graphics/ColorFilter"/>
+ <method name="&lt;init>(Landroid/graphics/ColorMatrix;)V"/>
+ <method name="&lt;init>([F)V"/>
+ <method name="getColorMatrix(Landroid/graphics/ColorMatrix;)V" since="26"/>
+ </class>
+ <class name="android/graphics/ColorSpace" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="adapt(Landroid/graphics/ColorSpace;[F)Landroid/graphics/ColorSpace;"/>
+ <method name="adapt(Landroid/graphics/ColorSpace;[FLandroid/graphics/ColorSpace$Adaptation;)Landroid/graphics/ColorSpace;"/>
+ <method name="connect(Landroid/graphics/ColorSpace;)Landroid/graphics/ColorSpace$Connector;"/>
+ <method name="connect(Landroid/graphics/ColorSpace;Landroid/graphics/ColorSpace$RenderIntent;)Landroid/graphics/ColorSpace$Connector;"/>
+ <method name="connect(Landroid/graphics/ColorSpace;Landroid/graphics/ColorSpace;)Landroid/graphics/ColorSpace$Connector;"/>
+ <method name="connect(Landroid/graphics/ColorSpace;Landroid/graphics/ColorSpace;Landroid/graphics/ColorSpace$RenderIntent;)Landroid/graphics/ColorSpace$Connector;"/>
+ <method name="fromXyz(FFF)[F"/>
+ <method name="fromXyz([F)[F"/>
+ <method name="get(Landroid/graphics/ColorSpace$Named;)Landroid/graphics/ColorSpace;"/>
+ <method name="getComponentCount()I"/>
+ <method name="getId()I"/>
+ <method name="getMaxValue(I)F"/>
+ <method name="getMinValue(I)F"/>
+ <method name="getModel()Landroid/graphics/ColorSpace$Model;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="isSrgb()Z"/>
+ <method name="isWideGamut()Z"/>
+ <method name="match([FLandroid/graphics/ColorSpace$Rgb$TransferParameters;)Landroid/graphics/ColorSpace;"/>
+ <method name="toXyz(FFF)[F"/>
+ <method name="toXyz([F)[F"/>
+ <field name="ILLUMINANT_A"/>
+ <field name="ILLUMINANT_B"/>
+ <field name="ILLUMINANT_C"/>
+ <field name="ILLUMINANT_D50"/>
+ <field name="ILLUMINANT_D55"/>
+ <field name="ILLUMINANT_D60"/>
+ <field name="ILLUMINANT_D65"/>
+ <field name="ILLUMINANT_D75"/>
+ <field name="ILLUMINANT_E"/>
+ <field name="MAX_ID"/>
+ <field name="MIN_ID"/>
+ </class>
+ <class name="android/graphics/ColorSpace$Adaptation" since="26">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/ColorSpace$Adaptation;"/>
+ <method name="values()[Landroid/graphics/ColorSpace$Adaptation;"/>
+ <field name="BRADFORD"/>
+ <field name="CIECAT02"/>
+ <field name="VON_KRIES"/>
+ </class>
+ <class name="android/graphics/ColorSpace$Connector" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDestination()Landroid/graphics/ColorSpace;"/>
+ <method name="getRenderIntent()Landroid/graphics/ColorSpace$RenderIntent;"/>
+ <method name="getSource()Landroid/graphics/ColorSpace;"/>
+ <method name="transform(FFF)[F"/>
+ <method name="transform([F)[F"/>
+ </class>
+ <class name="android/graphics/ColorSpace$Model" since="26">
+ <extends name="java/lang/Enum"/>
+ <method name="getComponentCount()I"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/ColorSpace$Model;"/>
+ <method name="values()[Landroid/graphics/ColorSpace$Model;"/>
+ <field name="CMYK"/>
+ <field name="LAB"/>
+ <field name="RGB"/>
+ <field name="XYZ"/>
+ </class>
+ <class name="android/graphics/ColorSpace$Named" since="26">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/ColorSpace$Named;"/>
+ <method name="values()[Landroid/graphics/ColorSpace$Named;"/>
+ <field name="ACES"/>
+ <field name="ACESCG"/>
+ <field name="ADOBE_RGB"/>
+ <field name="BT2020"/>
+ <field name="BT709"/>
+ <field name="CIE_LAB"/>
+ <field name="CIE_XYZ"/>
+ <field name="DCI_P3"/>
+ <field name="DISPLAY_P3"/>
+ <field name="EXTENDED_SRGB"/>
+ <field name="LINEAR_EXTENDED_SRGB"/>
+ <field name="LINEAR_SRGB"/>
+ <field name="NTSC_1953"/>
+ <field name="PRO_PHOTO_RGB"/>
+ <field name="SMPTE_C"/>
+ <field name="SRGB"/>
+ </class>
+ <class name="android/graphics/ColorSpace$RenderIntent" since="26">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/ColorSpace$RenderIntent;"/>
+ <method name="values()[Landroid/graphics/ColorSpace$RenderIntent;"/>
+ <field name="ABSOLUTE"/>
+ <field name="PERCEPTUAL"/>
+ <field name="RELATIVE"/>
+ <field name="SATURATION"/>
+ </class>
+ <class name="android/graphics/ColorSpace$Rgb" since="26">
+ <extends name="android/graphics/ColorSpace"/>
+ <method name="&lt;init>(Ljava/lang/String;[FD)V"/>
+ <method name="&lt;init>(Ljava/lang/String;[FLandroid/graphics/ColorSpace$Rgb$TransferParameters;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;[FLjava/util/function/DoubleUnaryOperator;Ljava/util/function/DoubleUnaryOperator;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;[F[FD)V"/>
+ <method name="&lt;init>(Ljava/lang/String;[F[FLandroid/graphics/ColorSpace$Rgb$TransferParameters;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;[F[FLjava/util/function/DoubleUnaryOperator;Ljava/util/function/DoubleUnaryOperator;FF)V"/>
+ <method name="fromLinear(FFF)[F"/>
+ <method name="fromLinear([F)[F"/>
+ <method name="getEotf()Ljava/util/function/DoubleUnaryOperator;"/>
+ <method name="getInverseTransform()[F"/>
+ <method name="getInverseTransform([F)[F"/>
+ <method name="getOetf()Ljava/util/function/DoubleUnaryOperator;"/>
+ <method name="getPrimaries()[F"/>
+ <method name="getPrimaries([F)[F"/>
+ <method name="getTransferParameters()Landroid/graphics/ColorSpace$Rgb$TransferParameters;"/>
+ <method name="getTransform()[F"/>
+ <method name="getTransform([F)[F"/>
+ <method name="getWhitePoint()[F"/>
+ <method name="getWhitePoint([F)[F"/>
+ <method name="toLinear(FFF)[F"/>
+ <method name="toLinear([F)[F"/>
+ </class>
+ <class name="android/graphics/ColorSpace$Rgb$TransferParameters" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(DDDDD)V"/>
+ <method name="&lt;init>(DDDDDDD)V"/>
+ <field name="a"/>
+ <field name="b"/>
+ <field name="c"/>
+ <field name="d"/>
+ <field name="e"/>
+ <field name="f"/>
+ <field name="g"/>
+ </class>
+ <class name="android/graphics/ComposePathEffect" since="1">
+ <extends name="android/graphics/PathEffect"/>
+ <method name="&lt;init>(Landroid/graphics/PathEffect;Landroid/graphics/PathEffect;)V"/>
+ </class>
+ <class name="android/graphics/ComposeShader" since="1">
+ <extends name="android/graphics/Shader"/>
+ <method name="&lt;init>(Landroid/graphics/Shader;Landroid/graphics/Shader;Landroid/graphics/PorterDuff$Mode;)V"/>
+ <method name="&lt;init>(Landroid/graphics/Shader;Landroid/graphics/Shader;Landroid/graphics/Xfermode;)V"/>
+ </class>
+ <class name="android/graphics/CornerPathEffect" since="1">
+ <extends name="android/graphics/PathEffect"/>
+ <method name="&lt;init>(F)V"/>
+ </class>
+ <class name="android/graphics/DashPathEffect" since="1">
+ <extends name="android/graphics/PathEffect"/>
+ <method name="&lt;init>([FF)V"/>
+ </class>
+ <class name="android/graphics/DiscretePathEffect" since="1">
+ <extends name="android/graphics/PathEffect"/>
+ <method name="&lt;init>(FF)V"/>
+ </class>
+ <class name="android/graphics/DrawFilter" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/graphics/EmbossMaskFilter" since="1">
+ <extends name="android/graphics/MaskFilter"/>
+ <method name="&lt;init>([FFFF)V"/>
+ </class>
+ <class name="android/graphics/ImageFormat" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getBitsPerPixel(I)I"/>
+ <field name="DEPTH16" since="23"/>
+ <field name="DEPTH_POINT_CLOUD" since="23"/>
+ <field name="FLEX_RGBA_8888" since="23"/>
+ <field name="FLEX_RGB_888" since="23"/>
+ <field name="JPEG"/>
+ <field name="NV16"/>
+ <field name="NV21"/>
+ <field name="PRIVATE" since="23"/>
+ <field name="RAW10" since="21"/>
+ <field name="RAW12" since="23"/>
+ <field name="RAW_PRIVATE" since="24"/>
+ <field name="RAW_SENSOR" since="21"/>
+ <field name="RGB_565"/>
+ <field name="UNKNOWN"/>
+ <field name="YUV_420_888" since="19"/>
+ <field name="YUV_422_888" since="23"/>
+ <field name="YUV_444_888" since="23"/>
+ <field name="YUY2"/>
+ <field name="YV12" since="9"/>
+ </class>
+ <class name="android/graphics/Interpolator" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="getKeyFrameCount()I"/>
+ <method name="getValueCount()I"/>
+ <method name="reset(I)V"/>
+ <method name="reset(II)V"/>
+ <method name="setKeyFrame(II[F)V"/>
+ <method name="setKeyFrame(II[F[F)V"/>
+ <method name="setRepeatMirror(FZ)V"/>
+ <method name="timeToValues(I[F)Landroid/graphics/Interpolator$Result;"/>
+ <method name="timeToValues([F)Landroid/graphics/Interpolator$Result;"/>
+ </class>
+ <class name="android/graphics/Interpolator$Result" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Interpolator$Result;"/>
+ <method name="values()[Landroid/graphics/Interpolator$Result;"/>
+ <field name="FREEZE_END"/>
+ <field name="FREEZE_START"/>
+ <field name="NORMAL"/>
+ </class>
+ <class name="android/graphics/LayerRasterizer" since="1" deprecated="21" removed="26">
+ <extends name="android/graphics/Rasterizer"/>
+ <method name="&lt;init>()V"/>
+ <method name="addLayer(Landroid/graphics/Paint;)V"/>
+ <method name="addLayer(Landroid/graphics/Paint;FF)V"/>
+ </class>
+ <class name="android/graphics/LightingColorFilter" since="1">
+ <extends name="android/graphics/ColorFilter"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="getColorAdd()I" since="26"/>
+ <method name="getColorMultiply()I" since="26"/>
+ </class>
+ <class name="android/graphics/LinearGradient" since="1">
+ <extends name="android/graphics/Shader"/>
+ <method name="&lt;init>(FFFFIILandroid/graphics/Shader$TileMode;)V"/>
+ <method name="&lt;init>(FFFF[I[FLandroid/graphics/Shader$TileMode;)V"/>
+ </class>
+ <class name="android/graphics/MaskFilter" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/graphics/Matrix" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/graphics/Matrix;)V"/>
+ <method name="getValues([F)V"/>
+ <method name="invert(Landroid/graphics/Matrix;)Z"/>
+ <method name="isAffine()Z" since="21"/>
+ <method name="isIdentity()Z"/>
+ <method name="mapPoints([F)V"/>
+ <method name="mapPoints([FI[FII)V"/>
+ <method name="mapPoints([F[F)V"/>
+ <method name="mapRadius(F)F"/>
+ <method name="mapRect(Landroid/graphics/RectF;)Z"/>
+ <method name="mapRect(Landroid/graphics/RectF;Landroid/graphics/RectF;)Z"/>
+ <method name="mapVectors([F)V"/>
+ <method name="mapVectors([FI[FII)V"/>
+ <method name="mapVectors([F[F)V"/>
+ <method name="postConcat(Landroid/graphics/Matrix;)Z"/>
+ <method name="postRotate(F)Z"/>
+ <method name="postRotate(FFF)Z"/>
+ <method name="postScale(FF)Z"/>
+ <method name="postScale(FFFF)Z"/>
+ <method name="postSkew(FF)Z"/>
+ <method name="postSkew(FFFF)Z"/>
+ <method name="postTranslate(FF)Z"/>
+ <method name="preConcat(Landroid/graphics/Matrix;)Z"/>
+ <method name="preRotate(F)Z"/>
+ <method name="preRotate(FFF)Z"/>
+ <method name="preScale(FF)Z"/>
+ <method name="preScale(FFFF)Z"/>
+ <method name="preSkew(FF)Z"/>
+ <method name="preSkew(FFFF)Z"/>
+ <method name="preTranslate(FF)Z"/>
+ <method name="rectStaysRect()Z"/>
+ <method name="reset()V"/>
+ <method name="set(Landroid/graphics/Matrix;)V"/>
+ <method name="setConcat(Landroid/graphics/Matrix;Landroid/graphics/Matrix;)Z"/>
+ <method name="setPolyToPoly([FI[FII)Z"/>
+ <method name="setRectToRect(Landroid/graphics/RectF;Landroid/graphics/RectF;Landroid/graphics/Matrix$ScaleToFit;)Z"/>
+ <method name="setRotate(F)V"/>
+ <method name="setRotate(FFF)V"/>
+ <method name="setScale(FF)V"/>
+ <method name="setScale(FFFF)V"/>
+ <method name="setSinCos(FF)V"/>
+ <method name="setSinCos(FFFF)V"/>
+ <method name="setSkew(FF)V"/>
+ <method name="setSkew(FFFF)V"/>
+ <method name="setTranslate(FF)V"/>
+ <method name="setValues([F)V"/>
+ <method name="toShortString()Ljava/lang/String;"/>
+ <field name="MPERSP_0"/>
+ <field name="MPERSP_1"/>
+ <field name="MPERSP_2"/>
+ <field name="MSCALE_X"/>
+ <field name="MSCALE_Y"/>
+ <field name="MSKEW_X"/>
+ <field name="MSKEW_Y"/>
+ <field name="MTRANS_X"/>
+ <field name="MTRANS_Y"/>
+ </class>
+ <class name="android/graphics/Matrix$ScaleToFit" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Matrix$ScaleToFit;"/>
+ <method name="values()[Landroid/graphics/Matrix$ScaleToFit;"/>
+ <field name="CENTER"/>
+ <field name="END"/>
+ <field name="FILL"/>
+ <field name="START"/>
+ </class>
+ <class name="android/graphics/Movie" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="decodeByteArray([BII)Landroid/graphics/Movie;"/>
+ <method name="decodeFile(Ljava/lang/String;)Landroid/graphics/Movie;"/>
+ <method name="decodeStream(Ljava/io/InputStream;)Landroid/graphics/Movie;"/>
+ <method name="draw(Landroid/graphics/Canvas;FF)V"/>
+ <method name="draw(Landroid/graphics/Canvas;FFLandroid/graphics/Paint;)V"/>
+ <method name="duration()I"/>
+ <method name="height()I"/>
+ <method name="isOpaque()Z"/>
+ <method name="setTime(I)Z"/>
+ <method name="width()I"/>
+ </class>
+ <class name="android/graphics/NinePatch" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/graphics/Bitmap;[B)V" since="19"/>
+ <method name="&lt;init>(Landroid/graphics/Bitmap;[BLjava/lang/String;)V"/>
+ <method name="draw(Landroid/graphics/Canvas;Landroid/graphics/Rect;)V"/>
+ <method name="draw(Landroid/graphics/Canvas;Landroid/graphics/Rect;Landroid/graphics/Paint;)V"/>
+ <method name="draw(Landroid/graphics/Canvas;Landroid/graphics/RectF;)V"/>
+ <method name="getBitmap()Landroid/graphics/Bitmap;" since="19"/>
+ <method name="getDensity()I" since="4"/>
+ <method name="getHeight()I"/>
+ <method name="getName()Ljava/lang/String;" since="19"/>
+ <method name="getPaint()Landroid/graphics/Paint;" since="19"/>
+ <method name="getTransparentRegion(Landroid/graphics/Rect;)Landroid/graphics/Region;"/>
+ <method name="getWidth()I"/>
+ <method name="hasAlpha()Z"/>
+ <method name="isNinePatchChunk([B)Z"/>
+ <method name="setPaint(Landroid/graphics/Paint;)V"/>
+ </class>
+ <class name="android/graphics/Outline" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/graphics/Outline;)V"/>
+ <method name="canClip()Z"/>
+ <method name="getAlpha()F"/>
+ <method name="getRadius()F" since="24"/>
+ <method name="getRect(Landroid/graphics/Rect;)Z" since="24"/>
+ <method name="isEmpty()Z"/>
+ <method name="offset(II)V" since="22"/>
+ <method name="set(Landroid/graphics/Outline;)V"/>
+ <method name="setAlpha(F)V"/>
+ <method name="setConvexPath(Landroid/graphics/Path;)V"/>
+ <method name="setEmpty()V"/>
+ <method name="setOval(IIII)V"/>
+ <method name="setOval(Landroid/graphics/Rect;)V"/>
+ <method name="setRect(IIII)V"/>
+ <method name="setRect(Landroid/graphics/Rect;)V"/>
+ <method name="setRoundRect(IIIIF)V"/>
+ <method name="setRoundRect(Landroid/graphics/Rect;F)V"/>
+ </class>
+ <class name="android/graphics/Paint" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Landroid/graphics/Paint;)V"/>
+ <method name="ascent()F"/>
+ <method name="breakText(Ljava/lang/CharSequence;IIZF[F)I"/>
+ <method name="breakText(Ljava/lang/String;ZF[F)I"/>
+ <method name="breakText([CIIF[F)I"/>
+ <method name="clearShadowLayer()V"/>
+ <method name="descent()F"/>
+ <method name="getAlpha()I"/>
+ <method name="getColor()I"/>
+ <method name="getColorFilter()Landroid/graphics/ColorFilter;"/>
+ <method name="getFillPath(Landroid/graphics/Path;Landroid/graphics/Path;)Z"/>
+ <method name="getFlags()I"/>
+ <method name="getFontFeatureSettings()Ljava/lang/String;" since="21"/>
+ <method name="getFontMetrics()Landroid/graphics/Paint$FontMetrics;"/>
+ <method name="getFontMetrics(Landroid/graphics/Paint$FontMetrics;)F"/>
+ <method name="getFontMetricsInt()Landroid/graphics/Paint$FontMetricsInt;"/>
+ <method name="getFontMetricsInt(Landroid/graphics/Paint$FontMetricsInt;)I"/>
+ <method name="getFontSpacing()F"/>
+ <method name="getFontVariationSettings()Ljava/lang/String;" since="26"/>
+ <method name="getHinting()I" since="14"/>
+ <method name="getLetterSpacing()F" since="21"/>
+ <method name="getMaskFilter()Landroid/graphics/MaskFilter;"/>
+ <method name="getOffsetForAdvance(Ljava/lang/CharSequence;IIIIZF)I" since="23"/>
+ <method name="getOffsetForAdvance([CIIIIZF)I" since="23"/>
+ <method name="getPathEffect()Landroid/graphics/PathEffect;"/>
+ <method name="getRasterizer()Landroid/graphics/Rasterizer;" deprecated="21" removed="26"/>
+ <method name="getRunAdvance(Ljava/lang/CharSequence;IIIIZI)F" since="23"/>
+ <method name="getRunAdvance([CIIIIZI)F" since="23"/>
+ <method name="getShader()Landroid/graphics/Shader;"/>
+ <method name="getStrokeCap()Landroid/graphics/Paint$Cap;"/>
+ <method name="getStrokeJoin()Landroid/graphics/Paint$Join;"/>
+ <method name="getStrokeMiter()F"/>
+ <method name="getStrokeWidth()F"/>
+ <method name="getStyle()Landroid/graphics/Paint$Style;"/>
+ <method name="getTextAlign()Landroid/graphics/Paint$Align;"/>
+ <method name="getTextBounds(Ljava/lang/String;IILandroid/graphics/Rect;)V"/>
+ <method name="getTextBounds([CIILandroid/graphics/Rect;)V"/>
+ <method name="getTextLocale()Ljava/util/Locale;" since="17"/>
+ <method name="getTextLocales()Landroid/os/LocaleList;" since="24"/>
+ <method name="getTextPath(Ljava/lang/String;IIFFLandroid/graphics/Path;)V"/>
+ <method name="getTextPath([CIIFFLandroid/graphics/Path;)V"/>
+ <method name="getTextScaleX()F"/>
+ <method name="getTextSize()F"/>
+ <method name="getTextSkewX()F"/>
+ <method name="getTextWidths(Ljava/lang/CharSequence;II[F)I"/>
+ <method name="getTextWidths(Ljava/lang/String;II[F)I"/>
+ <method name="getTextWidths(Ljava/lang/String;[F)I"/>
+ <method name="getTextWidths([CII[F)I"/>
+ <method name="getTypeface()Landroid/graphics/Typeface;"/>
+ <method name="getXfermode()Landroid/graphics/Xfermode;"/>
+ <method name="hasGlyph(Ljava/lang/String;)Z" since="23"/>
+ <method name="isAntiAlias()Z"/>
+ <method name="isDither()Z"/>
+ <method name="isElegantTextHeight()Z" since="21"/>
+ <method name="isFakeBoldText()Z"/>
+ <method name="isFilterBitmap()Z"/>
+ <method name="isLinearText()Z" deprecated="16"/>
+ <method name="isStrikeThruText()Z"/>
+ <method name="isSubpixelText()Z"/>
+ <method name="isUnderlineText()Z"/>
+ <method name="measureText(Ljava/lang/CharSequence;II)F"/>
+ <method name="measureText(Ljava/lang/String;)F"/>
+ <method name="measureText(Ljava/lang/String;II)F"/>
+ <method name="measureText([CII)F"/>
+ <method name="reset()V"/>
+ <method name="set(Landroid/graphics/Paint;)V"/>
+ <method name="setARGB(IIII)V"/>
+ <method name="setAlpha(I)V"/>
+ <method name="setAntiAlias(Z)V"/>
+ <method name="setColor(I)V"/>
+ <method name="setColorFilter(Landroid/graphics/ColorFilter;)Landroid/graphics/ColorFilter;"/>
+ <method name="setDither(Z)V"/>
+ <method name="setElegantTextHeight(Z)V" since="21"/>
+ <method name="setFakeBoldText(Z)V"/>
+ <method name="setFilterBitmap(Z)V"/>
+ <method name="setFlags(I)V"/>
+ <method name="setFontFeatureSettings(Ljava/lang/String;)V" since="21"/>
+ <method name="setFontVariationSettings(Ljava/lang/String;)Z" since="26"/>
+ <method name="setHinting(I)V" since="14"/>
+ <method name="setLetterSpacing(F)V" since="21"/>
+ <method name="setLinearText(Z)V" deprecated="16"/>
+ <method name="setMaskFilter(Landroid/graphics/MaskFilter;)Landroid/graphics/MaskFilter;"/>
+ <method name="setPathEffect(Landroid/graphics/PathEffect;)Landroid/graphics/PathEffect;"/>
+ <method name="setRasterizer(Landroid/graphics/Rasterizer;)Landroid/graphics/Rasterizer;" deprecated="21" removed="26"/>
+ <method name="setShader(Landroid/graphics/Shader;)Landroid/graphics/Shader;"/>
+ <method name="setShadowLayer(FFFI)V"/>
+ <method name="setStrikeThruText(Z)V"/>
+ <method name="setStrokeCap(Landroid/graphics/Paint$Cap;)V"/>
+ <method name="setStrokeJoin(Landroid/graphics/Paint$Join;)V"/>
+ <method name="setStrokeMiter(F)V"/>
+ <method name="setStrokeWidth(F)V"/>
+ <method name="setStyle(Landroid/graphics/Paint$Style;)V"/>
+ <method name="setSubpixelText(Z)V"/>
+ <method name="setTextAlign(Landroid/graphics/Paint$Align;)V"/>
+ <method name="setTextLocale(Ljava/util/Locale;)V" since="17"/>
+ <method name="setTextLocales(Landroid/os/LocaleList;)V" since="24"/>
+ <method name="setTextScaleX(F)V"/>
+ <method name="setTextSize(F)V"/>
+ <method name="setTextSkewX(F)V"/>
+ <method name="setTypeface(Landroid/graphics/Typeface;)Landroid/graphics/Typeface;"/>
+ <method name="setUnderlineText(Z)V"/>
+ <method name="setXfermode(Landroid/graphics/Xfermode;)Landroid/graphics/Xfermode;"/>
+ <field name="ANTI_ALIAS_FLAG"/>
+ <field name="DEV_KERN_TEXT_FLAG"/>
+ <field name="DITHER_FLAG"/>
+ <field name="EMBEDDED_BITMAP_TEXT_FLAG" since="19"/>
+ <field name="FAKE_BOLD_TEXT_FLAG"/>
+ <field name="FILTER_BITMAP_FLAG"/>
+ <field name="HINTING_OFF" since="14"/>
+ <field name="HINTING_ON" since="14"/>
+ <field name="LINEAR_TEXT_FLAG"/>
+ <field name="STRIKE_THRU_TEXT_FLAG"/>
+ <field name="SUBPIXEL_TEXT_FLAG"/>
+ <field name="UNDERLINE_TEXT_FLAG"/>
+ </class>
+ <class name="android/graphics/Paint$Align" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Paint$Align;"/>
+ <method name="values()[Landroid/graphics/Paint$Align;"/>
+ <field name="CENTER"/>
+ <field name="LEFT"/>
+ <field name="RIGHT"/>
+ </class>
+ <class name="android/graphics/Paint$Cap" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Paint$Cap;"/>
+ <method name="values()[Landroid/graphics/Paint$Cap;"/>
+ <field name="BUTT"/>
+ <field name="ROUND"/>
+ <field name="SQUARE"/>
+ </class>
+ <class name="android/graphics/Paint$FontMetrics" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="ascent"/>
+ <field name="bottom"/>
+ <field name="descent"/>
+ <field name="leading"/>
+ <field name="top"/>
+ </class>
+ <class name="android/graphics/Paint$FontMetricsInt" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="ascent"/>
+ <field name="bottom"/>
+ <field name="descent"/>
+ <field name="leading"/>
+ <field name="top"/>
+ </class>
+ <class name="android/graphics/Paint$Join" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Paint$Join;"/>
+ <method name="values()[Landroid/graphics/Paint$Join;"/>
+ <field name="BEVEL"/>
+ <field name="MITER"/>
+ <field name="ROUND"/>
+ </class>
+ <class name="android/graphics/Paint$Style" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Paint$Style;"/>
+ <method name="values()[Landroid/graphics/Paint$Style;"/>
+ <field name="FILL"/>
+ <field name="FILL_AND_STROKE"/>
+ <field name="STROKE"/>
+ </class>
+ <class name="android/graphics/PaintFlagsDrawFilter" since="1">
+ <extends name="android/graphics/DrawFilter"/>
+ <method name="&lt;init>(II)V"/>
+ </class>
+ <class name="android/graphics/Path" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/graphics/Path;)V"/>
+ <method name="addArc(FFFFFF)V" since="21"/>
+ <method name="addArc(Landroid/graphics/RectF;FF)V"/>
+ <method name="addCircle(FFFLandroid/graphics/Path$Direction;)V"/>
+ <method name="addOval(FFFFLandroid/graphics/Path$Direction;)V" since="21"/>
+ <method name="addOval(Landroid/graphics/RectF;Landroid/graphics/Path$Direction;)V"/>
+ <method name="addPath(Landroid/graphics/Path;)V"/>
+ <method name="addPath(Landroid/graphics/Path;FF)V"/>
+ <method name="addPath(Landroid/graphics/Path;Landroid/graphics/Matrix;)V"/>
+ <method name="addRect(FFFFLandroid/graphics/Path$Direction;)V"/>
+ <method name="addRect(Landroid/graphics/RectF;Landroid/graphics/Path$Direction;)V"/>
+ <method name="addRoundRect(FFFFFFLandroid/graphics/Path$Direction;)V" since="21"/>
+ <method name="addRoundRect(FFFF[FLandroid/graphics/Path$Direction;)V" since="21"/>
+ <method name="addRoundRect(Landroid/graphics/RectF;FFLandroid/graphics/Path$Direction;)V"/>
+ <method name="addRoundRect(Landroid/graphics/RectF;[FLandroid/graphics/Path$Direction;)V"/>
+ <method name="approximate(F)[F" since="26"/>
+ <method name="arcTo(FFFFFFZ)V" since="21"/>
+ <method name="arcTo(Landroid/graphics/RectF;FF)V"/>
+ <method name="arcTo(Landroid/graphics/RectF;FFZ)V"/>
+ <method name="close()V"/>
+ <method name="computeBounds(Landroid/graphics/RectF;Z)V"/>
+ <method name="cubicTo(FFFFFF)V"/>
+ <method name="getFillType()Landroid/graphics/Path$FillType;"/>
+ <method name="incReserve(I)V"/>
+ <method name="isConvex()Z" since="21"/>
+ <method name="isEmpty()Z"/>
+ <method name="isInverseFillType()Z"/>
+ <method name="isRect(Landroid/graphics/RectF;)Z"/>
+ <method name="lineTo(FF)V"/>
+ <method name="moveTo(FF)V"/>
+ <method name="offset(FF)V"/>
+ <method name="offset(FFLandroid/graphics/Path;)V"/>
+ <method name="op(Landroid/graphics/Path;Landroid/graphics/Path$Op;)Z" since="19"/>
+ <method name="op(Landroid/graphics/Path;Landroid/graphics/Path;Landroid/graphics/Path$Op;)Z" since="19"/>
+ <method name="quadTo(FFFF)V"/>
+ <method name="rCubicTo(FFFFFF)V"/>
+ <method name="rLineTo(FF)V"/>
+ <method name="rMoveTo(FF)V"/>
+ <method name="rQuadTo(FFFF)V"/>
+ <method name="reset()V"/>
+ <method name="rewind()V"/>
+ <method name="set(Landroid/graphics/Path;)V"/>
+ <method name="setFillType(Landroid/graphics/Path$FillType;)V"/>
+ <method name="setLastPoint(FF)V"/>
+ <method name="toggleInverseFillType()V"/>
+ <method name="transform(Landroid/graphics/Matrix;)V"/>
+ <method name="transform(Landroid/graphics/Matrix;Landroid/graphics/Path;)V"/>
+ </class>
+ <class name="android/graphics/Path$Direction" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Path$Direction;"/>
+ <method name="values()[Landroid/graphics/Path$Direction;"/>
+ <field name="CCW"/>
+ <field name="CW"/>
+ </class>
+ <class name="android/graphics/Path$FillType" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Path$FillType;"/>
+ <method name="values()[Landroid/graphics/Path$FillType;"/>
+ <field name="EVEN_ODD"/>
+ <field name="INVERSE_EVEN_ODD"/>
+ <field name="INVERSE_WINDING"/>
+ <field name="WINDING"/>
+ </class>
+ <class name="android/graphics/Path$Op" since="19">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Path$Op;"/>
+ <method name="values()[Landroid/graphics/Path$Op;"/>
+ <field name="DIFFERENCE"/>
+ <field name="INTERSECT"/>
+ <field name="REVERSE_DIFFERENCE"/>
+ <field name="UNION"/>
+ <field name="XOR"/>
+ </class>
+ <class name="android/graphics/PathDashPathEffect" since="1">
+ <extends name="android/graphics/PathEffect"/>
+ <method name="&lt;init>(Landroid/graphics/Path;FFLandroid/graphics/PathDashPathEffect$Style;)V"/>
+ </class>
+ <class name="android/graphics/PathDashPathEffect$Style" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/PathDashPathEffect$Style;"/>
+ <method name="values()[Landroid/graphics/PathDashPathEffect$Style;"/>
+ <field name="MORPH"/>
+ <field name="ROTATE"/>
+ <field name="TRANSLATE"/>
+ </class>
+ <class name="android/graphics/PathEffect" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/graphics/PathMeasure" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/graphics/Path;Z)V"/>
+ <method name="getLength()F"/>
+ <method name="getMatrix(FLandroid/graphics/Matrix;I)Z"/>
+ <method name="getPosTan(F[F[F)Z"/>
+ <method name="getSegment(FFLandroid/graphics/Path;Z)Z"/>
+ <method name="isClosed()Z"/>
+ <method name="nextContour()Z"/>
+ <method name="setPath(Landroid/graphics/Path;Z)V"/>
+ <field name="POSITION_MATRIX_FLAG"/>
+ <field name="TANGENT_MATRIX_FLAG"/>
+ </class>
+ <class name="android/graphics/Picture" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/graphics/Picture;)V"/>
+ <method name="beginRecording(II)Landroid/graphics/Canvas;"/>
+ <method name="createFromStream(Ljava/io/InputStream;)Landroid/graphics/Picture;" deprecated="18"/>
+ <method name="draw(Landroid/graphics/Canvas;)V"/>
+ <method name="endRecording()V"/>
+ <method name="getHeight()I"/>
+ <method name="getWidth()I"/>
+ <method name="writeToStream(Ljava/io/OutputStream;)V" deprecated="18"/>
+ </class>
+ <class name="android/graphics/PixelFormat" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="formatHasAlpha(I)Z"/>
+ <method name="getPixelFormatInfo(ILandroid/graphics/PixelFormat;)V"/>
+ <field name="A_8" deprecated="19"/>
+ <field name="JPEG" deprecated="16"/>
+ <field name="LA_88" deprecated="16"/>
+ <field name="L_8" deprecated="19"/>
+ <field name="OPAQUE"/>
+ <field name="RGBA_1010102" since="26"/>
+ <field name="RGBA_4444" deprecated="16"/>
+ <field name="RGBA_5551" deprecated="16"/>
+ <field name="RGBA_8888"/>
+ <field name="RGBA_F16" since="26"/>
+ <field name="RGBX_8888"/>
+ <field name="RGB_332" deprecated="16"/>
+ <field name="RGB_565"/>
+ <field name="RGB_888"/>
+ <field name="TRANSLUCENT"/>
+ <field name="TRANSPARENT"/>
+ <field name="UNKNOWN"/>
+ <field name="YCbCr_420_SP" deprecated="16"/>
+ <field name="YCbCr_422_I" since="5" deprecated="16"/>
+ <field name="YCbCr_422_SP" deprecated="16"/>
+ <field name="bitsPerPixel"/>
+ <field name="bytesPerPixel"/>
+ </class>
+ <class name="android/graphics/PixelXorXfermode" since="1" deprecated="16" removed="24">
+ <extends name="android/graphics/Xfermode"/>
+ <method name="&lt;init>(I)V"/>
+ </class>
+ <class name="android/graphics/Point" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable" since="13"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="&lt;init>(Landroid/graphics/Point;)V"/>
+ <method name="equals(II)Z"/>
+ <method name="negate()V"/>
+ <method name="offset(II)V"/>
+ <method name="readFromParcel(Landroid/os/Parcel;)V" since="13"/>
+ <method name="set(II)V"/>
+ <field name="CREATOR" since="13"/>
+ <field name="x"/>
+ <field name="y"/>
+ </class>
+ <class name="android/graphics/PointF" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable" since="13"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(FF)V"/>
+ <method name="&lt;init>(Landroid/graphics/Point;)V"/>
+ <method name="equals(FF)Z"/>
+ <method name="length()F"/>
+ <method name="length(FF)F"/>
+ <method name="negate()V"/>
+ <method name="offset(FF)V"/>
+ <method name="readFromParcel(Landroid/os/Parcel;)V" since="13"/>
+ <method name="set(FF)V"/>
+ <method name="set(Landroid/graphics/PointF;)V"/>
+ <field name="CREATOR" since="13"/>
+ <field name="x"/>
+ <field name="y"/>
+ </class>
+ <class name="android/graphics/PorterDuff" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/graphics/PorterDuff$Mode" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/PorterDuff$Mode;"/>
+ <method name="values()[Landroid/graphics/PorterDuff$Mode;"/>
+ <field name="ADD" since="11"/>
+ <field name="CLEAR"/>
+ <field name="DARKEN"/>
+ <field name="DST"/>
+ <field name="DST_ATOP"/>
+ <field name="DST_IN"/>
+ <field name="DST_OUT"/>
+ <field name="DST_OVER"/>
+ <field name="LIGHTEN"/>
+ <field name="MULTIPLY"/>
+ <field name="OVERLAY" since="11"/>
+ <field name="SCREEN"/>
+ <field name="SRC"/>
+ <field name="SRC_ATOP"/>
+ <field name="SRC_IN"/>
+ <field name="SRC_OUT"/>
+ <field name="SRC_OVER"/>
+ <field name="XOR"/>
+ </class>
+ <class name="android/graphics/PorterDuffColorFilter" since="1">
+ <extends name="android/graphics/ColorFilter"/>
+ <method name="&lt;init>(ILandroid/graphics/PorterDuff$Mode;)V"/>
+ </class>
+ <class name="android/graphics/PorterDuffXfermode" since="1">
+ <extends name="android/graphics/Xfermode"/>
+ <method name="&lt;init>(Landroid/graphics/PorterDuff$Mode;)V"/>
+ </class>
+ <class name="android/graphics/RadialGradient" since="1">
+ <extends name="android/graphics/Shader"/>
+ <method name="&lt;init>(FFFIILandroid/graphics/Shader$TileMode;)V"/>
+ <method name="&lt;init>(FFF[I[FLandroid/graphics/Shader$TileMode;)V"/>
+ </class>
+ <class name="android/graphics/Rasterizer" since="1" deprecated="21" removed="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/graphics/Rect" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(IIII)V"/>
+ <method name="&lt;init>(Landroid/graphics/Rect;)V"/>
+ <method name="centerX()I"/>
+ <method name="centerY()I"/>
+ <method name="contains(II)Z"/>
+ <method name="contains(IIII)Z"/>
+ <method name="contains(Landroid/graphics/Rect;)Z"/>
+ <method name="exactCenterX()F"/>
+ <method name="exactCenterY()F"/>
+ <method name="flattenToString()Ljava/lang/String;" since="7"/>
+ <method name="height()I"/>
+ <method name="inset(II)V"/>
+ <method name="intersect(IIII)Z"/>
+ <method name="intersect(Landroid/graphics/Rect;)Z"/>
+ <method name="intersects(IIII)Z"/>
+ <method name="intersects(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z"/>
+ <method name="isEmpty()Z"/>
+ <method name="offset(II)V"/>
+ <method name="offsetTo(II)V"/>
+ <method name="readFromParcel(Landroid/os/Parcel;)V"/>
+ <method name="set(IIII)V"/>
+ <method name="set(Landroid/graphics/Rect;)V"/>
+ <method name="setEmpty()V"/>
+ <method name="setIntersect(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z"/>
+ <method name="sort()V"/>
+ <method name="toShortString()Ljava/lang/String;" since="3"/>
+ <method name="unflattenFromString(Ljava/lang/String;)Landroid/graphics/Rect;" since="7"/>
+ <method name="union(II)V"/>
+ <method name="union(IIII)V"/>
+ <method name="union(Landroid/graphics/Rect;)V"/>
+ <method name="width()I"/>
+ <field name="CREATOR"/>
+ <field name="bottom"/>
+ <field name="left"/>
+ <field name="right"/>
+ <field name="top"/>
+ </class>
+ <class name="android/graphics/RectF" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable" since="3"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(FFFF)V"/>
+ <method name="&lt;init>(Landroid/graphics/Rect;)V"/>
+ <method name="&lt;init>(Landroid/graphics/RectF;)V"/>
+ <method name="centerX()F"/>
+ <method name="centerY()F"/>
+ <method name="contains(FF)Z"/>
+ <method name="contains(FFFF)Z"/>
+ <method name="contains(Landroid/graphics/RectF;)Z"/>
+ <method name="height()F"/>
+ <method name="inset(FF)V"/>
+ <method name="intersect(FFFF)Z"/>
+ <method name="intersect(Landroid/graphics/RectF;)Z"/>
+ <method name="intersects(FFFF)Z"/>
+ <method name="intersects(Landroid/graphics/RectF;Landroid/graphics/RectF;)Z"/>
+ <method name="isEmpty()Z"/>
+ <method name="offset(FF)V"/>
+ <method name="offsetTo(FF)V"/>
+ <method name="readFromParcel(Landroid/os/Parcel;)V" since="3"/>
+ <method name="round(Landroid/graphics/Rect;)V"/>
+ <method name="roundOut(Landroid/graphics/Rect;)V"/>
+ <method name="set(FFFF)V"/>
+ <method name="set(Landroid/graphics/Rect;)V"/>
+ <method name="set(Landroid/graphics/RectF;)V"/>
+ <method name="setEmpty()V"/>
+ <method name="setIntersect(Landroid/graphics/RectF;Landroid/graphics/RectF;)Z"/>
+ <method name="sort()V"/>
+ <method name="toShortString()Ljava/lang/String;" since="14"/>
+ <method name="union(FF)V"/>
+ <method name="union(FFFF)V"/>
+ <method name="union(Landroid/graphics/RectF;)V"/>
+ <method name="width()F"/>
+ <field name="CREATOR" since="3"/>
+ <field name="bottom"/>
+ <field name="left"/>
+ <field name="right"/>
+ <field name="top"/>
+ </class>
+ <class name="android/graphics/Region" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(IIII)V"/>
+ <method name="&lt;init>(Landroid/graphics/Rect;)V"/>
+ <method name="&lt;init>(Landroid/graphics/Region;)V"/>
+ <method name="contains(II)Z"/>
+ <method name="getBoundaryPath()Landroid/graphics/Path;"/>
+ <method name="getBoundaryPath(Landroid/graphics/Path;)Z"/>
+ <method name="getBounds()Landroid/graphics/Rect;"/>
+ <method name="getBounds(Landroid/graphics/Rect;)Z"/>
+ <method name="isComplex()Z"/>
+ <method name="isEmpty()Z"/>
+ <method name="isRect()Z"/>
+ <method name="op(IIIILandroid/graphics/Region$Op;)Z"/>
+ <method name="op(Landroid/graphics/Rect;Landroid/graphics/Region$Op;)Z"/>
+ <method name="op(Landroid/graphics/Rect;Landroid/graphics/Region;Landroid/graphics/Region$Op;)Z"/>
+ <method name="op(Landroid/graphics/Region;Landroid/graphics/Region$Op;)Z"/>
+ <method name="op(Landroid/graphics/Region;Landroid/graphics/Region;Landroid/graphics/Region$Op;)Z"/>
+ <method name="quickContains(IIII)Z"/>
+ <method name="quickContains(Landroid/graphics/Rect;)Z"/>
+ <method name="quickReject(IIII)Z"/>
+ <method name="quickReject(Landroid/graphics/Rect;)Z"/>
+ <method name="quickReject(Landroid/graphics/Region;)Z"/>
+ <method name="set(IIII)Z"/>
+ <method name="set(Landroid/graphics/Rect;)Z"/>
+ <method name="set(Landroid/graphics/Region;)Z"/>
+ <method name="setEmpty()V"/>
+ <method name="setPath(Landroid/graphics/Path;Landroid/graphics/Region;)Z"/>
+ <method name="translate(II)V"/>
+ <method name="translate(IILandroid/graphics/Region;)V"/>
+ <method name="union(Landroid/graphics/Rect;)Z"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/graphics/Region$Op" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Region$Op;"/>
+ <method name="values()[Landroid/graphics/Region$Op;"/>
+ <field name="DIFFERENCE"/>
+ <field name="INTERSECT"/>
+ <field name="REPLACE"/>
+ <field name="REVERSE_DIFFERENCE"/>
+ <field name="UNION"/>
+ <field name="XOR"/>
+ </class>
+ <class name="android/graphics/RegionIterator" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/graphics/Region;)V"/>
+ <method name="next(Landroid/graphics/Rect;)Z"/>
+ </class>
+ <class name="android/graphics/Shader" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V" deprecated="26"/>
+ <method name="getLocalMatrix(Landroid/graphics/Matrix;)Z"/>
+ <method name="setLocalMatrix(Landroid/graphics/Matrix;)V"/>
+ </class>
+ <class name="android/graphics/Shader$TileMode" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Shader$TileMode;"/>
+ <method name="values()[Landroid/graphics/Shader$TileMode;"/>
+ <field name="CLAMP"/>
+ <field name="MIRROR"/>
+ <field name="REPEAT"/>
+ </class>
+ <class name="android/graphics/SumPathEffect" since="1">
+ <extends name="android/graphics/PathEffect"/>
+ <method name="&lt;init>(Landroid/graphics/PathEffect;Landroid/graphics/PathEffect;)V"/>
+ </class>
+ <class name="android/graphics/SurfaceTexture" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(IZ)V" since="19"/>
+ <method name="&lt;init>(Z)V" since="26"/>
+ <method name="attachToGLContext(I)V" since="16"/>
+ <method name="detachFromGLContext()V" since="16"/>
+ <method name="getTimestamp()J" since="14"/>
+ <method name="getTransformMatrix([F)V"/>
+ <method name="isReleased()Z" since="26"/>
+ <method name="release()V" since="14"/>
+ <method name="releaseTexImage()V" since="19"/>
+ <method name="setDefaultBufferSize(II)V" since="15"/>
+ <method name="setOnFrameAvailableListener(Landroid/graphics/SurfaceTexture$OnFrameAvailableListener;)V"/>
+ <method name="setOnFrameAvailableListener(Landroid/graphics/SurfaceTexture$OnFrameAvailableListener;Landroid/os/Handler;)V" since="21"/>
+ <method name="updateTexImage()V"/>
+ </class>
+ <class name="android/graphics/SurfaceTexture$OnFrameAvailableListener" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="onFrameAvailable(Landroid/graphics/SurfaceTexture;)V"/>
+ </class>
+ <class name="android/graphics/SurfaceTexture$OutOfResourcesException" since="11" deprecated="19">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/graphics/SweepGradient" since="1">
+ <extends name="android/graphics/Shader"/>
+ <method name="&lt;init>(FFII)V"/>
+ <method name="&lt;init>(FF[I[F)V"/>
+ </class>
+ <class name="android/graphics/Typeface" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="create(Landroid/graphics/Typeface;I)Landroid/graphics/Typeface;"/>
+ <method name="create(Ljava/lang/String;I)Landroid/graphics/Typeface;"/>
+ <method name="createFromAsset(Landroid/content/res/AssetManager;Ljava/lang/String;)Landroid/graphics/Typeface;"/>
+ <method name="createFromFile(Ljava/io/File;)Landroid/graphics/Typeface;" since="4"/>
+ <method name="createFromFile(Ljava/lang/String;)Landroid/graphics/Typeface;" since="4"/>
+ <method name="defaultFromStyle(I)Landroid/graphics/Typeface;"/>
+ <method name="getStyle()I"/>
+ <method name="isBold()Z"/>
+ <method name="isItalic()Z"/>
+ <field name="BOLD"/>
+ <field name="BOLD_ITALIC"/>
+ <field name="DEFAULT"/>
+ <field name="DEFAULT_BOLD"/>
+ <field name="ITALIC"/>
+ <field name="MONOSPACE"/>
+ <field name="NORMAL"/>
+ <field name="SANS_SERIF"/>
+ <field name="SERIF"/>
+ </class>
+ <class name="android/graphics/Typeface$Builder" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/res/AssetManager;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/io/File;)V"/>
+ <method name="&lt;init>(Ljava/io/FileDescriptor;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="build()Landroid/graphics/Typeface;"/>
+ <method name="setFallback(Ljava/lang/String;)Landroid/graphics/Typeface$Builder;"/>
+ <method name="setFontVariationSettings(Ljava/lang/String;)Landroid/graphics/Typeface$Builder;"/>
+ <method name="setFontVariationSettings([Landroid/graphics/fonts/FontVariationAxis;)Landroid/graphics/Typeface$Builder;"/>
+ <method name="setItalic(Z)Landroid/graphics/Typeface$Builder;"/>
+ <method name="setTtcIndex(I)Landroid/graphics/Typeface$Builder;"/>
+ <method name="setWeight(I)Landroid/graphics/Typeface$Builder;"/>
+ </class>
+ <class name="android/graphics/Xfermode" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/graphics/YuvImage" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>([BIII[I)V"/>
+ <method name="compressToJpeg(Landroid/graphics/Rect;ILjava/io/OutputStream;)Z"/>
+ <method name="getHeight()I"/>
+ <method name="getStrides()[I"/>
+ <method name="getWidth()I"/>
+ <method name="getYuvData()[B"/>
+ <method name="getYuvFormat()I"/>
+ </class>
+ <class name="android/graphics/drawable/AdaptiveIconDrawable" since="26">
+ <extends name="android/graphics/drawable/Drawable"/>
+ <implements name="android/graphics/drawable/Drawable$Callback"/>
+ <method name="&lt;init>(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="getBackground()Landroid/graphics/drawable/Drawable;"/>
+ <method name="getExtraInsetFraction()F"/>
+ <method name="getForeground()Landroid/graphics/drawable/Drawable;"/>
+ <method name="getIconMask()Landroid/graphics/Path;"/>
+ <method name="setOpacity(I)V"/>
+ </class>
+ <class name="android/graphics/drawable/Animatable" since="4">
+ <extends name="java/lang/Object"/>
+ <method name="isRunning()Z"/>
+ <method name="start()V"/>
+ <method name="stop()V"/>
+ </class>
+ <class name="android/graphics/drawable/Animatable2" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/graphics/drawable/Animatable"/>
+ <method name="clearAnimationCallbacks()V"/>
+ <method name="registerAnimationCallback(Landroid/graphics/drawable/Animatable2$AnimationCallback;)V"/>
+ <method name="unregisterAnimationCallback(Landroid/graphics/drawable/Animatable2$AnimationCallback;)Z"/>
+ </class>
+ <class name="android/graphics/drawable/Animatable2$AnimationCallback" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onAnimationEnd(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="onAnimationStart(Landroid/graphics/drawable/Drawable;)V"/>
+ </class>
+ <class name="android/graphics/drawable/AnimatedStateListDrawable" since="21">
+ <extends name="android/graphics/drawable/StateListDrawable"/>
+ <method name="&lt;init>()V"/>
+ <method name="addState([ILandroid/graphics/drawable/Drawable;I)V"/>
+ <method name="addTransition(IILandroid/graphics/drawable/Drawable;Z)V"/>
+ </class>
+ <class name="android/graphics/drawable/AnimatedVectorDrawable" since="21">
+ <extends name="android/graphics/drawable/Drawable"/>
+ <implements name="android/graphics/drawable/Animatable" removed="23"/>
+ <implements name="android/graphics/drawable/Animatable2" since="23"/>
+ <method name="&lt;init>()V"/>
+ <method name="reset()V" since="23"/>
+ </class>
+ <class name="android/graphics/drawable/AnimationDrawable" since="1">
+ <extends name="android/graphics/drawable/DrawableContainer"/>
+ <implements name="android/graphics/drawable/Animatable" since="4"/>
+ <implements name="java/lang/Runnable"/>
+ <method name="&lt;init>()V"/>
+ <method name="addFrame(Landroid/graphics/drawable/Drawable;I)V"/>
+ <method name="getDuration(I)I"/>
+ <method name="getFrame(I)Landroid/graphics/drawable/Drawable;"/>
+ <method name="getNumberOfFrames()I"/>
+ <method name="isOneShot()Z"/>
+ <method name="isRunning()Z"/>
+ <method name="setOneShot(Z)V"/>
+ <method name="start()V"/>
+ <method name="stop()V"/>
+ </class>
+ <class name="android/graphics/drawable/BitmapDrawable" since="1">
+ <extends name="android/graphics/drawable/Drawable"/>
+ <method name="&lt;init>()V" deprecated="16"/>
+ <method name="&lt;init>(Landroid/content/res/Resources;)V" since="4" deprecated="18"/>
+ <method name="&lt;init>(Landroid/content/res/Resources;Landroid/graphics/Bitmap;)V" since="4"/>
+ <method name="&lt;init>(Landroid/content/res/Resources;Ljava/io/InputStream;)V" since="5"/>
+ <method name="&lt;init>(Landroid/content/res/Resources;Ljava/lang/String;)V" since="5"/>
+ <method name="&lt;init>(Landroid/graphics/Bitmap;)V" deprecated="16"/>
+ <method name="&lt;init>(Ljava/io/InputStream;)V" deprecated="16"/>
+ <method name="&lt;init>(Ljava/lang/String;)V" deprecated="16"/>
+ <method name="getBitmap()Landroid/graphics/Bitmap;"/>
+ <method name="getGravity()I"/>
+ <method name="getPaint()Landroid/graphics/Paint;"/>
+ <method name="getTileModeX()Landroid/graphics/Shader$TileMode;"/>
+ <method name="getTileModeY()Landroid/graphics/Shader$TileMode;"/>
+ <method name="hasAntiAlias()Z" since="18"/>
+ <method name="hasMipMap()Z" since="18"/>
+ <method name="setAntiAlias(Z)V"/>
+ <method name="setGravity(I)V"/>
+ <method name="setMipMap(Z)V" since="18"/>
+ <method name="setTargetDensity(I)V" since="4"/>
+ <method name="setTargetDensity(Landroid/graphics/Canvas;)V" since="4"/>
+ <method name="setTargetDensity(Landroid/util/DisplayMetrics;)V" since="4"/>
+ <method name="setTileModeX(Landroid/graphics/Shader$TileMode;)V"/>
+ <method name="setTileModeXY(Landroid/graphics/Shader$TileMode;Landroid/graphics/Shader$TileMode;)V"/>
+ <method name="setTileModeY(Landroid/graphics/Shader$TileMode;)V"/>
+ </class>
+ <class name="android/graphics/drawable/ClipDrawable" since="1">
+ <extends name="android/graphics/drawable/Drawable" removed="23"/>
+ <extends name="android/graphics/drawable/DrawableWrapper" since="23"/>
+ <implements name="android/graphics/drawable/Drawable$Callback" removed="23"/>
+ <method name="&lt;init>(Landroid/graphics/drawable/Drawable;II)V"/>
+ <field name="HORIZONTAL"/>
+ <field name="VERTICAL"/>
+ </class>
+ <class name="android/graphics/drawable/ColorDrawable" since="1">
+ <extends name="android/graphics/drawable/Drawable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="getAlpha()I"/>
+ <method name="getColor()I" since="11"/>
+ <method name="setColor(I)V" since="11"/>
+ </class>
+ <class name="android/graphics/drawable/Drawable" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="applyTheme(Landroid/content/res/Resources$Theme;)V" since="21"/>
+ <method name="canApplyTheme()Z" since="21"/>
+ <method name="clearColorFilter()V"/>
+ <method name="copyBounds()Landroid/graphics/Rect;"/>
+ <method name="copyBounds(Landroid/graphics/Rect;)V"/>
+ <method name="createFromPath(Ljava/lang/String;)Landroid/graphics/drawable/Drawable;"/>
+ <method name="createFromResourceStream(Landroid/content/res/Resources;Landroid/util/TypedValue;Ljava/io/InputStream;Ljava/lang/String;)Landroid/graphics/drawable/Drawable;" since="4"/>
+ <method name="createFromResourceStream(Landroid/content/res/Resources;Landroid/util/TypedValue;Ljava/io/InputStream;Ljava/lang/String;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/drawable/Drawable;" since="5"/>
+ <method name="createFromStream(Ljava/io/InputStream;Ljava/lang/String;)Landroid/graphics/drawable/Drawable;"/>
+ <method name="createFromXml(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;)Landroid/graphics/drawable/Drawable;"/>
+ <method name="createFromXml(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;" since="21"/>
+ <method name="createFromXmlInner(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;)Landroid/graphics/drawable/Drawable;"/>
+ <method name="createFromXmlInner(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;" since="21"/>
+ <method name="draw(Landroid/graphics/Canvas;)V"/>
+ <method name="getAlpha()I" since="19"/>
+ <method name="getBounds()Landroid/graphics/Rect;"/>
+ <method name="getCallback()Landroid/graphics/drawable/Drawable$Callback;" since="11"/>
+ <method name="getChangingConfigurations()I"/>
+ <method name="getColorFilter()Landroid/graphics/ColorFilter;" since="21"/>
+ <method name="getConstantState()Landroid/graphics/drawable/Drawable$ConstantState;"/>
+ <method name="getCurrent()Landroid/graphics/drawable/Drawable;"/>
+ <method name="getDirtyBounds()Landroid/graphics/Rect;" since="21"/>
+ <method name="getHotspotBounds(Landroid/graphics/Rect;)V" since="23"/>
+ <method name="getIntrinsicHeight()I"/>
+ <method name="getIntrinsicWidth()I"/>
+ <method name="getLayoutDirection()I" since="23"/>
+ <method name="getLevel()I"/>
+ <method name="getMinimumHeight()I"/>
+ <method name="getMinimumWidth()I"/>
+ <method name="getOpacity()I"/>
+ <method name="getOutline(Landroid/graphics/Outline;)V" since="21"/>
+ <method name="getPadding(Landroid/graphics/Rect;)Z"/>
+ <method name="getState()[I"/>
+ <method name="getTransparentRegion()Landroid/graphics/Region;"/>
+ <method name="inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;)V"/>
+ <method name="inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V" since="21"/>
+ <method name="invalidateSelf()V"/>
+ <method name="isAutoMirrored()Z" since="19"/>
+ <method name="isFilterBitmap()Z" since="23"/>
+ <method name="isStateful()Z"/>
+ <method name="isVisible()Z"/>
+ <method name="jumpToCurrentState()V" since="11"/>
+ <method name="mutate()Landroid/graphics/drawable/Drawable;" since="3"/>
+ <method name="onBoundsChange(Landroid/graphics/Rect;)V"/>
+ <method name="onLayoutDirectionChanged(I)Z" since="23"/>
+ <method name="onLevelChange(I)Z"/>
+ <method name="onStateChange([I)Z"/>
+ <method name="resolveOpacity(II)I"/>
+ <method name="scheduleSelf(Ljava/lang/Runnable;J)V"/>
+ <method name="setAlpha(I)V"/>
+ <method name="setAutoMirrored(Z)V" since="19"/>
+ <method name="setBounds(IIII)V"/>
+ <method name="setBounds(Landroid/graphics/Rect;)V"/>
+ <method name="setCallback(Landroid/graphics/drawable/Drawable$Callback;)V"/>
+ <method name="setChangingConfigurations(I)V"/>
+ <method name="setColorFilter(ILandroid/graphics/PorterDuff$Mode;)V"/>
+ <method name="setColorFilter(Landroid/graphics/ColorFilter;)V"/>
+ <method name="setDither(Z)V" deprecated="23"/>
+ <method name="setFilterBitmap(Z)V"/>
+ <method name="setHotspot(FF)V" since="21"/>
+ <method name="setHotspotBounds(IIII)V" since="21"/>
+ <method name="setLayoutDirection(I)Z" since="23"/>
+ <method name="setLevel(I)Z"/>
+ <method name="setState([I)Z"/>
+ <method name="setTint(I)V" since="21"/>
+ <method name="setTintList(Landroid/content/res/ColorStateList;)V" since="21"/>
+ <method name="setTintMode(Landroid/graphics/PorterDuff$Mode;)V" since="21"/>
+ <method name="setVisible(ZZ)Z"/>
+ <method name="unscheduleSelf(Ljava/lang/Runnable;)V"/>
+ </class>
+ <class name="android/graphics/drawable/Drawable$Callback" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="invalidateDrawable(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="scheduleDrawable(Landroid/graphics/drawable/Drawable;Ljava/lang/Runnable;J)V"/>
+ <method name="unscheduleDrawable(Landroid/graphics/drawable/Drawable;Ljava/lang/Runnable;)V"/>
+ </class>
+ <class name="android/graphics/drawable/Drawable$ConstantState" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="canApplyTheme()Z" since="21"/>
+ <method name="getChangingConfigurations()I"/>
+ <method name="newDrawable()Landroid/graphics/drawable/Drawable;"/>
+ <method name="newDrawable(Landroid/content/res/Resources;)Landroid/graphics/drawable/Drawable;" since="5"/>
+ <method name="newDrawable(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;" since="21"/>
+ </class>
+ <class name="android/graphics/drawable/DrawableContainer" since="1">
+ <extends name="android/graphics/drawable/Drawable"/>
+ <implements name="android/graphics/drawable/Drawable$Callback"/>
+ <method name="&lt;init>()V"/>
+ <method name="selectDrawable(I)Z"/>
+ <method name="setConstantState(Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;)V"/>
+ <method name="setEnterFadeDuration(I)V" since="11"/>
+ <method name="setExitFadeDuration(I)V" since="11"/>
+ </class>
+ <class name="android/graphics/drawable/DrawableContainer$DrawableContainerState" since="1">
+ <extends name="android/graphics/drawable/Drawable$ConstantState"/>
+ <method name="&lt;init>()V"/>
+ <method name="addChild(Landroid/graphics/drawable/Drawable;)I"/>
+ <method name="canConstantState()Z"/>
+ <method name="computeConstantSize()V" since="11"/>
+ <method name="getChild(I)Landroid/graphics/drawable/Drawable;" since="19"/>
+ <method name="getChildCount()I"/>
+ <method name="getChildren()[Landroid/graphics/drawable/Drawable;"/>
+ <method name="getConstantHeight()I"/>
+ <method name="getConstantMinimumHeight()I"/>
+ <method name="getConstantMinimumWidth()I"/>
+ <method name="getConstantPadding()Landroid/graphics/Rect;"/>
+ <method name="getConstantWidth()I"/>
+ <method name="getEnterFadeDuration()I" since="11"/>
+ <method name="getExitFadeDuration()I" since="11"/>
+ <method name="getOpacity()I"/>
+ <method name="growArray(II)V"/>
+ <method name="isConstantSize()Z"/>
+ <method name="isStateful()Z"/>
+ <method name="setConstantSize(Z)V"/>
+ <method name="setEnterFadeDuration(I)V" since="11"/>
+ <method name="setExitFadeDuration(I)V" since="11"/>
+ <method name="setVariablePadding(Z)V"/>
+ </class>
+ <class name="android/graphics/drawable/DrawableWrapper" since="23">
+ <extends name="android/graphics/drawable/Drawable"/>
+ <implements name="android/graphics/drawable/Drawable$Callback"/>
+ <method name="&lt;init>(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="getDrawable()Landroid/graphics/drawable/Drawable;"/>
+ <method name="setDrawable(Landroid/graphics/drawable/Drawable;)V"/>
+ </class>
+ <class name="android/graphics/drawable/GradientDrawable" since="1">
+ <extends name="android/graphics/drawable/Drawable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/graphics/drawable/GradientDrawable$Orientation;[I)V"/>
+ <method name="getColor()Landroid/content/res/ColorStateList;" since="24"/>
+ <method name="getColors()[I" since="24"/>
+ <method name="getCornerRadii()[F" since="24"/>
+ <method name="getCornerRadius()F" since="24"/>
+ <method name="getGradientCenterX()F" since="24"/>
+ <method name="getGradientCenterY()F" since="24"/>
+ <method name="getGradientRadius()F" since="21"/>
+ <method name="getGradientType()I" since="24"/>
+ <method name="getOrientation()Landroid/graphics/drawable/GradientDrawable$Orientation;" since="16"/>
+ <method name="getShape()I" since="24"/>
+ <method name="getUseLevel()Z" since="24"/>
+ <method name="setColor(I)V"/>
+ <method name="setColor(Landroid/content/res/ColorStateList;)V" since="21"/>
+ <method name="setColors([I)V" since="16"/>
+ <method name="setCornerRadii([F)V"/>
+ <method name="setCornerRadius(F)V"/>
+ <method name="setGradientCenter(FF)V"/>
+ <method name="setGradientRadius(F)V"/>
+ <method name="setGradientType(I)V"/>
+ <method name="setOrientation(Landroid/graphics/drawable/GradientDrawable$Orientation;)V" since="16"/>
+ <method name="setShape(I)V"/>
+ <method name="setSize(II)V"/>
+ <method name="setStroke(II)V"/>
+ <method name="setStroke(IIFF)V"/>
+ <method name="setStroke(ILandroid/content/res/ColorStateList;)V" since="21"/>
+ <method name="setStroke(ILandroid/content/res/ColorStateList;FF)V" since="21"/>
+ <method name="setUseLevel(Z)V"/>
+ <field name="LINE"/>
+ <field name="LINEAR_GRADIENT"/>
+ <field name="OVAL"/>
+ <field name="RADIAL_GRADIENT"/>
+ <field name="RECTANGLE"/>
+ <field name="RING"/>
+ <field name="SWEEP_GRADIENT"/>
+ </class>
+ <class name="android/graphics/drawable/GradientDrawable$Orientation" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/drawable/GradientDrawable$Orientation;"/>
+ <method name="values()[Landroid/graphics/drawable/GradientDrawable$Orientation;"/>
+ <field name="BL_TR"/>
+ <field name="BOTTOM_TOP"/>
+ <field name="BR_TL"/>
+ <field name="LEFT_RIGHT"/>
+ <field name="RIGHT_LEFT"/>
+ <field name="TL_BR"/>
+ <field name="TOP_BOTTOM"/>
+ <field name="TR_BL"/>
+ </class>
+ <class name="android/graphics/drawable/Icon" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="createWithAdaptiveBitmap(Landroid/graphics/Bitmap;)Landroid/graphics/drawable/Icon;" since="26"/>
+ <method name="createWithBitmap(Landroid/graphics/Bitmap;)Landroid/graphics/drawable/Icon;"/>
+ <method name="createWithContentUri(Landroid/net/Uri;)Landroid/graphics/drawable/Icon;"/>
+ <method name="createWithContentUri(Ljava/lang/String;)Landroid/graphics/drawable/Icon;"/>
+ <method name="createWithData([BII)Landroid/graphics/drawable/Icon;"/>
+ <method name="createWithFilePath(Ljava/lang/String;)Landroid/graphics/drawable/Icon;"/>
+ <method name="createWithResource(Landroid/content/Context;I)Landroid/graphics/drawable/Icon;"/>
+ <method name="createWithResource(Ljava/lang/String;I)Landroid/graphics/drawable/Icon;"/>
+ <method name="loadDrawable(Landroid/content/Context;)Landroid/graphics/drawable/Drawable;"/>
+ <method name="loadDrawableAsync(Landroid/content/Context;Landroid/graphics/drawable/Icon$OnDrawableLoadedListener;Landroid/os/Handler;)V"/>
+ <method name="loadDrawableAsync(Landroid/content/Context;Landroid/os/Message;)V"/>
+ <method name="setTint(I)Landroid/graphics/drawable/Icon;"/>
+ <method name="setTintList(Landroid/content/res/ColorStateList;)Landroid/graphics/drawable/Icon;"/>
+ <method name="setTintMode(Landroid/graphics/PorterDuff$Mode;)Landroid/graphics/drawable/Icon;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/graphics/drawable/Icon$OnDrawableLoadedListener" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="onDrawableLoaded(Landroid/graphics/drawable/Drawable;)V"/>
+ </class>
+ <class name="android/graphics/drawable/InsetDrawable" since="1">
+ <extends name="android/graphics/drawable/Drawable" removed="23"/>
+ <extends name="android/graphics/drawable/DrawableWrapper" since="23"/>
+ <implements name="android/graphics/drawable/Drawable$Callback" removed="23"/>
+ <method name="&lt;init>(Landroid/graphics/drawable/Drawable;F)V" since="26"/>
+ <method name="&lt;init>(Landroid/graphics/drawable/Drawable;FFFF)V" since="26"/>
+ <method name="&lt;init>(Landroid/graphics/drawable/Drawable;I)V"/>
+ <method name="&lt;init>(Landroid/graphics/drawable/Drawable;IIII)V"/>
+ <method name="getDrawable()Landroid/graphics/drawable/Drawable;" since="19" removed="23"/>
+ </class>
+ <class name="android/graphics/drawable/LayerDrawable" since="1">
+ <extends name="android/graphics/drawable/Drawable"/>
+ <implements name="android/graphics/drawable/Drawable$Callback"/>
+ <method name="&lt;init>([Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="addLayer(Landroid/graphics/drawable/Drawable;)I" since="23"/>
+ <method name="findDrawableByLayerId(I)Landroid/graphics/drawable/Drawable;"/>
+ <method name="findIndexByLayerId(I)I" since="23"/>
+ <method name="getBottomPadding()I" since="23"/>
+ <method name="getDrawable(I)Landroid/graphics/drawable/Drawable;"/>
+ <method name="getEndPadding()I" since="23"/>
+ <method name="getId(I)I"/>
+ <method name="getLayerGravity(I)I" since="23"/>
+ <method name="getLayerHeight(I)I" since="23"/>
+ <method name="getLayerInsetBottom(I)I" since="23"/>
+ <method name="getLayerInsetEnd(I)I" since="23"/>
+ <method name="getLayerInsetLeft(I)I" since="23"/>
+ <method name="getLayerInsetRight(I)I" since="23"/>
+ <method name="getLayerInsetStart(I)I" since="23"/>
+ <method name="getLayerInsetTop(I)I" since="23"/>
+ <method name="getLayerWidth(I)I" since="23"/>
+ <method name="getLeftPadding()I" since="23"/>
+ <method name="getNumberOfLayers()I"/>
+ <method name="getPaddingMode()I" since="21"/>
+ <method name="getRightPadding()I" since="23"/>
+ <method name="getStartPadding()I" since="23"/>
+ <method name="getTopPadding()I" since="23"/>
+ <method name="setDrawable(ILandroid/graphics/drawable/Drawable;)V" since="23"/>
+ <method name="setDrawableByLayerId(ILandroid/graphics/drawable/Drawable;)Z"/>
+ <method name="setId(II)V"/>
+ <method name="setLayerGravity(II)V" since="23"/>
+ <method name="setLayerHeight(II)V" since="23"/>
+ <method name="setLayerInset(IIIII)V"/>
+ <method name="setLayerInsetBottom(II)V" since="23"/>
+ <method name="setLayerInsetEnd(II)V" since="23"/>
+ <method name="setLayerInsetLeft(II)V" since="23"/>
+ <method name="setLayerInsetRelative(IIIII)V" since="23"/>
+ <method name="setLayerInsetRight(II)V" since="23"/>
+ <method name="setLayerInsetStart(II)V" since="23"/>
+ <method name="setLayerInsetTop(II)V" since="23"/>
+ <method name="setLayerSize(III)V" since="23"/>
+ <method name="setLayerWidth(II)V" since="23"/>
+ <method name="setOpacity(I)V" since="11"/>
+ <method name="setPadding(IIII)V" since="23"/>
+ <method name="setPaddingMode(I)V" since="21"/>
+ <method name="setPaddingRelative(IIII)V" since="23"/>
+ <field name="INSET_UNDEFINED" since="24"/>
+ <field name="PADDING_MODE_NEST" since="21"/>
+ <field name="PADDING_MODE_STACK" since="21"/>
+ </class>
+ <class name="android/graphics/drawable/LevelListDrawable" since="1">
+ <extends name="android/graphics/drawable/DrawableContainer"/>
+ <method name="&lt;init>()V"/>
+ <method name="addLevel(IILandroid/graphics/drawable/Drawable;)V"/>
+ </class>
+ <class name="android/graphics/drawable/NinePatchDrawable" since="1">
+ <extends name="android/graphics/drawable/Drawable"/>
+ <method name="&lt;init>(Landroid/content/res/Resources;Landroid/graphics/Bitmap;[BLandroid/graphics/Rect;Ljava/lang/String;)V" since="4"/>
+ <method name="&lt;init>(Landroid/content/res/Resources;Landroid/graphics/NinePatch;)V" since="4"/>
+ <method name="&lt;init>(Landroid/graphics/Bitmap;[BLandroid/graphics/Rect;Ljava/lang/String;)V" deprecated="16"/>
+ <method name="&lt;init>(Landroid/graphics/NinePatch;)V" deprecated="16"/>
+ <method name="getPaint()Landroid/graphics/Paint;"/>
+ <method name="setTargetDensity(I)V" since="4"/>
+ <method name="setTargetDensity(Landroid/graphics/Canvas;)V" since="4"/>
+ <method name="setTargetDensity(Landroid/util/DisplayMetrics;)V" since="4"/>
+ </class>
+ <class name="android/graphics/drawable/PaintDrawable" since="1">
+ <extends name="android/graphics/drawable/ShapeDrawable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="setCornerRadii([F)V"/>
+ <method name="setCornerRadius(F)V"/>
+ </class>
+ <class name="android/graphics/drawable/PictureDrawable" since="1">
+ <extends name="android/graphics/drawable/Drawable"/>
+ <method name="&lt;init>(Landroid/graphics/Picture;)V"/>
+ <method name="getPicture()Landroid/graphics/Picture;"/>
+ <method name="setPicture(Landroid/graphics/Picture;)V"/>
+ </class>
+ <class name="android/graphics/drawable/RippleDrawable" since="21">
+ <extends name="android/graphics/drawable/LayerDrawable"/>
+ <method name="&lt;init>(Landroid/content/res/ColorStateList;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="getRadius()I" since="23"/>
+ <method name="setColor(Landroid/content/res/ColorStateList;)V"/>
+ <method name="setRadius(I)V" since="23"/>
+ <field name="RADIUS_AUTO" since="23"/>
+ </class>
+ <class name="android/graphics/drawable/RotateDrawable" since="1">
+ <extends name="android/graphics/drawable/Drawable" removed="23"/>
+ <extends name="android/graphics/drawable/DrawableWrapper" since="23"/>
+ <implements name="android/graphics/drawable/Drawable$Callback" removed="23"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDrawable()Landroid/graphics/drawable/Drawable;" since="3" removed="23"/>
+ <method name="getFromDegrees()F" since="21"/>
+ <method name="getPivotX()F" since="21"/>
+ <method name="getPivotY()F" since="21"/>
+ <method name="getToDegrees()F" since="21"/>
+ <method name="isPivotXRelative()Z" since="21"/>
+ <method name="isPivotYRelative()Z" since="21"/>
+ <method name="setDrawable(Landroid/graphics/drawable/Drawable;)V" since="21" removed="23"/>
+ <method name="setFromDegrees(F)V" since="21"/>
+ <method name="setPivotX(F)V" since="21"/>
+ <method name="setPivotXRelative(Z)V" since="21"/>
+ <method name="setPivotY(F)V" since="21"/>
+ <method name="setPivotYRelative(Z)V" since="21"/>
+ <method name="setToDegrees(F)V" since="21"/>
+ </class>
+ <class name="android/graphics/drawable/ScaleDrawable" since="1">
+ <extends name="android/graphics/drawable/Drawable" removed="23"/>
+ <extends name="android/graphics/drawable/DrawableWrapper" since="23"/>
+ <implements name="android/graphics/drawable/Drawable$Callback" removed="23"/>
+ <method name="&lt;init>(Landroid/graphics/drawable/Drawable;IFF)V"/>
+ <method name="getDrawable()Landroid/graphics/drawable/Drawable;" since="3" removed="23"/>
+ </class>
+ <class name="android/graphics/drawable/ShapeDrawable" since="1">
+ <extends name="android/graphics/drawable/Drawable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/graphics/drawable/shapes/Shape;)V"/>
+ <method name="getPaint()Landroid/graphics/Paint;"/>
+ <method name="getShaderFactory()Landroid/graphics/drawable/ShapeDrawable$ShaderFactory;"/>
+ <method name="getShape()Landroid/graphics/drawable/shapes/Shape;"/>
+ <method name="inflateTag(Ljava/lang/String;Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;)Z"/>
+ <method name="onDraw(Landroid/graphics/drawable/shapes/Shape;Landroid/graphics/Canvas;Landroid/graphics/Paint;)V"/>
+ <method name="setIntrinsicHeight(I)V"/>
+ <method name="setIntrinsicWidth(I)V"/>
+ <method name="setPadding(IIII)V"/>
+ <method name="setPadding(Landroid/graphics/Rect;)V"/>
+ <method name="setShaderFactory(Landroid/graphics/drawable/ShapeDrawable$ShaderFactory;)V"/>
+ <method name="setShape(Landroid/graphics/drawable/shapes/Shape;)V"/>
+ </class>
+ <class name="android/graphics/drawable/ShapeDrawable$ShaderFactory" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="resize(II)Landroid/graphics/Shader;"/>
+ </class>
+ <class name="android/graphics/drawable/StateListDrawable" since="1">
+ <extends name="android/graphics/drawable/DrawableContainer"/>
+ <method name="&lt;init>()V"/>
+ <method name="addState([ILandroid/graphics/drawable/Drawable;)V"/>
+ </class>
+ <class name="android/graphics/drawable/TransitionDrawable" since="1">
+ <extends name="android/graphics/drawable/LayerDrawable"/>
+ <method name="&lt;init>()V" removed="3"/>
+ <method name="&lt;init>([Landroid/graphics/drawable/Drawable;)V" since="3"/>
+ <method name="isCrossFadeEnabled()Z"/>
+ <method name="resetTransition()V"/>
+ <method name="reverseTransition(I)V"/>
+ <method name="setCrossFadeEnabled(Z)V"/>
+ <method name="startTransition(I)V"/>
+ </class>
+ <class name="android/graphics/drawable/VectorDrawable" since="21">
+ <extends name="android/graphics/drawable/Drawable"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/graphics/drawable/shapes/ArcShape" since="1">
+ <extends name="android/graphics/drawable/shapes/RectShape"/>
+ <method name="&lt;init>(FF)V"/>
+ <method name="clone()Landroid/graphics/drawable/shapes/ArcShape;" since="26"/>
+ <method name="getStartAngle()F" since="26"/>
+ <method name="getSweepAngle()F" since="26"/>
+ </class>
+ <class name="android/graphics/drawable/shapes/OvalShape" since="1">
+ <extends name="android/graphics/drawable/shapes/RectShape"/>
+ <method name="&lt;init>()V"/>
+ <method name="clone()Landroid/graphics/drawable/shapes/OvalShape;" since="26"/>
+ </class>
+ <class name="android/graphics/drawable/shapes/PathShape" since="1">
+ <extends name="android/graphics/drawable/shapes/Shape"/>
+ <method name="&lt;init>(Landroid/graphics/Path;FF)V"/>
+ <method name="clone()Landroid/graphics/drawable/shapes/PathShape;" since="3"/>
+ </class>
+ <class name="android/graphics/drawable/shapes/RectShape" since="1">
+ <extends name="android/graphics/drawable/shapes/Shape"/>
+ <method name="&lt;init>()V"/>
+ <method name="clone()Landroid/graphics/drawable/shapes/RectShape;" since="3"/>
+ <method name="rect()Landroid/graphics/RectF;"/>
+ </class>
+ <class name="android/graphics/drawable/shapes/RoundRectShape" since="1">
+ <extends name="android/graphics/drawable/shapes/RectShape"/>
+ <method name="&lt;init>([FLandroid/graphics/RectF;[F)V"/>
+ <method name="clone()Landroid/graphics/drawable/shapes/RoundRectShape;" since="3"/>
+ </class>
+ <class name="android/graphics/drawable/shapes/Shape" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable" since="3"/>
+ <method name="&lt;init>()V"/>
+ <method name="clone()Landroid/graphics/drawable/shapes/Shape;" since="3"/>
+ <method name="draw(Landroid/graphics/Canvas;Landroid/graphics/Paint;)V"/>
+ <method name="getHeight()F"/>
+ <method name="getOutline(Landroid/graphics/Outline;)V" since="21"/>
+ <method name="getWidth()F"/>
+ <method name="hasAlpha()Z"/>
+ <method name="onResize(FF)V"/>
+ <method name="resize(FF)V"/>
+ </class>
+ <class name="android/graphics/fonts/FontVariationAxis" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;F)V"/>
+ <method name="fromFontVariationSettings(Ljava/lang/String;)[Landroid/graphics/fonts/FontVariationAxis;"/>
+ <method name="getStyleValue()F"/>
+ <method name="getTag()Ljava/lang/String;"/>
+ <method name="toFontVariationSettings([Landroid/graphics/fonts/FontVariationAxis;)Ljava/lang/String;"/>
+ </class>
+ <class name="android/graphics/pdf/PdfDocument" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="close()V"/>
+ <method name="finishPage(Landroid/graphics/pdf/PdfDocument$Page;)V"/>
+ <method name="getPages()Ljava/util/List;"/>
+ <method name="startPage(Landroid/graphics/pdf/PdfDocument$PageInfo;)Landroid/graphics/pdf/PdfDocument$Page;"/>
+ <method name="writeTo(Ljava/io/OutputStream;)V"/>
+ </class>
+ <class name="android/graphics/pdf/PdfDocument$Page" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCanvas()Landroid/graphics/Canvas;"/>
+ <method name="getInfo()Landroid/graphics/pdf/PdfDocument$PageInfo;"/>
+ </class>
+ <class name="android/graphics/pdf/PdfDocument$PageInfo" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getContentRect()Landroid/graphics/Rect;"/>
+ <method name="getPageHeight()I"/>
+ <method name="getPageNumber()I"/>
+ <method name="getPageWidth()I"/>
+ </class>
+ <class name="android/graphics/pdf/PdfDocument$PageInfo$Builder" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(III)V"/>
+ <method name="create()Landroid/graphics/pdf/PdfDocument$PageInfo;"/>
+ <method name="setContentRect(Landroid/graphics/Rect;)Landroid/graphics/pdf/PdfDocument$PageInfo$Builder;"/>
+ </class>
+ <class name="android/graphics/pdf/PdfRenderer" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable"/>
+ <method name="&lt;init>(Landroid/os/ParcelFileDescriptor;)V"/>
+ <method name="getPageCount()I"/>
+ <method name="openPage(I)Landroid/graphics/pdf/PdfRenderer$Page;"/>
+ <method name="shouldScaleForPrinting()Z"/>
+ </class>
+ <class name="android/graphics/pdf/PdfRenderer$Page" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable"/>
+ <method name="&lt;init>(Landroid/graphics/pdf/PdfRenderer;)V"/>
+ <method name="getHeight()I"/>
+ <method name="getIndex()I"/>
+ <method name="getWidth()I"/>
+ <method name="render(Landroid/graphics/Bitmap;Landroid/graphics/Rect;Landroid/graphics/Matrix;I)V"/>
+ <field name="RENDER_MODE_FOR_DISPLAY"/>
+ <field name="RENDER_MODE_FOR_PRINT"/>
+ </class>
+ <class name="android/hardware/Camera" since="1" deprecated="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addCallbackBuffer([B)V" since="8"/>
+ <method name="autoFocus(Landroid/hardware/Camera$AutoFocusCallback;)V"/>
+ <method name="cancelAutoFocus()V" since="5"/>
+ <method name="enableShutterSound(Z)Z" since="17"/>
+ <method name="getCameraInfo(ILandroid/hardware/Camera$CameraInfo;)V" since="9"/>
+ <method name="getNumberOfCameras()I" since="9"/>
+ <method name="getParameters()Landroid/hardware/Camera$Parameters;"/>
+ <method name="lock()V" since="5"/>
+ <method name="open()Landroid/hardware/Camera;"/>
+ <method name="open(I)Landroid/hardware/Camera;" since="9"/>
+ <method name="reconnect()V" since="8"/>
+ <method name="release()V"/>
+ <method name="setAutoFocusMoveCallback(Landroid/hardware/Camera$AutoFocusMoveCallback;)V" since="16"/>
+ <method name="setDisplayOrientation(I)V" since="8"/>
+ <method name="setErrorCallback(Landroid/hardware/Camera$ErrorCallback;)V"/>
+ <method name="setFaceDetectionListener(Landroid/hardware/Camera$FaceDetectionListener;)V" since="14"/>
+ <method name="setOneShotPreviewCallback(Landroid/hardware/Camera$PreviewCallback;)V" since="3"/>
+ <method name="setParameters(Landroid/hardware/Camera$Parameters;)V"/>
+ <method name="setPreviewCallback(Landroid/hardware/Camera$PreviewCallback;)V"/>
+ <method name="setPreviewCallbackWithBuffer(Landroid/hardware/Camera$PreviewCallback;)V" since="8"/>
+ <method name="setPreviewDisplay(Landroid/view/SurfaceHolder;)V"/>
+ <method name="setPreviewTexture(Landroid/graphics/SurfaceTexture;)V" since="11"/>
+ <method name="setZoomChangeListener(Landroid/hardware/Camera$OnZoomChangeListener;)V" since="8"/>
+ <method name="startFaceDetection()V" since="14"/>
+ <method name="startPreview()V"/>
+ <method name="startSmoothZoom(I)V" since="8"/>
+ <method name="stopFaceDetection()V" since="14"/>
+ <method name="stopPreview()V"/>
+ <method name="stopSmoothZoom()V" since="8"/>
+ <method name="takePicture(Landroid/hardware/Camera$ShutterCallback;Landroid/hardware/Camera$PictureCallback;Landroid/hardware/Camera$PictureCallback;)V"/>
+ <method name="takePicture(Landroid/hardware/Camera$ShutterCallback;Landroid/hardware/Camera$PictureCallback;Landroid/hardware/Camera$PictureCallback;Landroid/hardware/Camera$PictureCallback;)V" since="5"/>
+ <method name="unlock()V" since="5"/>
+ <field name="ACTION_NEW_PICTURE" since="14" deprecated="24"/>
+ <field name="ACTION_NEW_VIDEO" since="14" deprecated="24"/>
+ <field name="CAMERA_ERROR_EVICTED" since="23"/>
+ <field name="CAMERA_ERROR_SERVER_DIED"/>
+ <field name="CAMERA_ERROR_UNKNOWN"/>
+ </class>
+ <class name="android/hardware/Camera$Area" since="14" deprecated="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/graphics/Rect;I)V"/>
+ <field name="rect"/>
+ <field name="weight"/>
+ </class>
+ <class name="android/hardware/Camera$AutoFocusCallback" since="1" deprecated="21">
+ <extends name="java/lang/Object"/>
+ <method name="onAutoFocus(ZLandroid/hardware/Camera;)V"/>
+ </class>
+ <class name="android/hardware/Camera$AutoFocusMoveCallback" since="16" deprecated="21">
+ <extends name="java/lang/Object"/>
+ <method name="onAutoFocusMoving(ZLandroid/hardware/Camera;)V"/>
+ </class>
+ <class name="android/hardware/Camera$CameraInfo" since="9" deprecated="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="CAMERA_FACING_BACK"/>
+ <field name="CAMERA_FACING_FRONT"/>
+ <field name="canDisableShutterSound" since="17"/>
+ <field name="facing"/>
+ <field name="orientation"/>
+ </class>
+ <class name="android/hardware/Camera$ErrorCallback" since="1" deprecated="21">
+ <extends name="java/lang/Object"/>
+ <method name="onError(ILandroid/hardware/Camera;)V"/>
+ </class>
+ <class name="android/hardware/Camera$Face" since="14" deprecated="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="id"/>
+ <field name="leftEye"/>
+ <field name="mouth"/>
+ <field name="rect"/>
+ <field name="rightEye"/>
+ <field name="score"/>
+ </class>
+ <class name="android/hardware/Camera$FaceDetectionListener" since="14" deprecated="21">
+ <extends name="java/lang/Object"/>
+ <method name="onFaceDetection([Landroid/hardware/Camera$Face;Landroid/hardware/Camera;)V"/>
+ </class>
+ <class name="android/hardware/Camera$OnZoomChangeListener" since="8" deprecated="21">
+ <extends name="java/lang/Object"/>
+ <method name="onZoomChange(IZLandroid/hardware/Camera;)V"/>
+ </class>
+ <class name="android/hardware/Camera$Parameters" since="1" deprecated="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/hardware/Camera;)V"/>
+ <method name="flatten()Ljava/lang/String;"/>
+ <method name="get(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getAntibanding()Ljava/lang/String;" since="5"/>
+ <method name="getAutoExposureLock()Z" since="14"/>
+ <method name="getAutoWhiteBalanceLock()Z" since="14"/>
+ <method name="getColorEffect()Ljava/lang/String;" since="5"/>
+ <method name="getExposureCompensation()I" since="8"/>
+ <method name="getExposureCompensationStep()F" since="8"/>
+ <method name="getFlashMode()Ljava/lang/String;" since="5"/>
+ <method name="getFocalLength()F" since="8"/>
+ <method name="getFocusAreas()Ljava/util/List;" since="14"/>
+ <method name="getFocusDistances([F)V" since="9"/>
+ <method name="getFocusMode()Ljava/lang/String;" since="5"/>
+ <method name="getHorizontalViewAngle()F" since="8"/>
+ <method name="getInt(Ljava/lang/String;)I"/>
+ <method name="getJpegQuality()I" since="5"/>
+ <method name="getJpegThumbnailQuality()I" since="5"/>
+ <method name="getJpegThumbnailSize()Landroid/hardware/Camera$Size;" since="5"/>
+ <method name="getMaxExposureCompensation()I" since="8"/>
+ <method name="getMaxNumDetectedFaces()I" since="14"/>
+ <method name="getMaxNumFocusAreas()I" since="14"/>
+ <method name="getMaxNumMeteringAreas()I" since="14"/>
+ <method name="getMaxZoom()I" since="8"/>
+ <method name="getMeteringAreas()Ljava/util/List;" since="14"/>
+ <method name="getMinExposureCompensation()I" since="8"/>
+ <method name="getPictureFormat()I"/>
+ <method name="getPictureSize()Landroid/hardware/Camera$Size;"/>
+ <method name="getPreferredPreviewSizeForVideo()Landroid/hardware/Camera$Size;" since="11"/>
+ <method name="getPreviewFormat()I"/>
+ <method name="getPreviewFpsRange([I)V" since="9"/>
+ <method name="getPreviewFrameRate()I" deprecated="16"/>
+ <method name="getPreviewSize()Landroid/hardware/Camera$Size;"/>
+ <method name="getSceneMode()Ljava/lang/String;" since="5"/>
+ <method name="getSupportedAntibanding()Ljava/util/List;" since="5"/>
+ <method name="getSupportedColorEffects()Ljava/util/List;" since="5"/>
+ <method name="getSupportedFlashModes()Ljava/util/List;" since="5"/>
+ <method name="getSupportedFocusModes()Ljava/util/List;" since="5"/>
+ <method name="getSupportedJpegThumbnailSizes()Ljava/util/List;" since="8"/>
+ <method name="getSupportedPictureFormats()Ljava/util/List;" since="5"/>
+ <method name="getSupportedPictureSizes()Ljava/util/List;" since="5"/>
+ <method name="getSupportedPreviewFormats()Ljava/util/List;" since="5"/>
+ <method name="getSupportedPreviewFpsRange()Ljava/util/List;" since="9"/>
+ <method name="getSupportedPreviewFrameRates()Ljava/util/List;" since="5" deprecated="16"/>
+ <method name="getSupportedPreviewSizes()Ljava/util/List;" since="5"/>
+ <method name="getSupportedSceneModes()Ljava/util/List;" since="5"/>
+ <method name="getSupportedVideoSizes()Ljava/util/List;" since="11"/>
+ <method name="getSupportedWhiteBalance()Ljava/util/List;" since="5"/>
+ <method name="getVerticalViewAngle()F" since="8"/>
+ <method name="getVideoStabilization()Z" since="15"/>
+ <method name="getWhiteBalance()Ljava/lang/String;" since="5"/>
+ <method name="getZoom()I" since="8"/>
+ <method name="getZoomRatios()Ljava/util/List;" since="8"/>
+ <method name="isAutoExposureLockSupported()Z" since="14"/>
+ <method name="isAutoWhiteBalanceLockSupported()Z" since="14"/>
+ <method name="isSmoothZoomSupported()Z" since="8"/>
+ <method name="isVideoSnapshotSupported()Z" since="14"/>
+ <method name="isVideoStabilizationSupported()Z" since="15"/>
+ <method name="isZoomSupported()Z" since="8"/>
+ <method name="remove(Ljava/lang/String;)V"/>
+ <method name="removeGpsData()V" since="5"/>
+ <method name="set(Ljava/lang/String;I)V"/>
+ <method name="set(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="setAntibanding(Ljava/lang/String;)V" since="5"/>
+ <method name="setAutoExposureLock(Z)V" since="14"/>
+ <method name="setAutoWhiteBalanceLock(Z)V" since="14"/>
+ <method name="setColorEffect(Ljava/lang/String;)V" since="5"/>
+ <method name="setExposureCompensation(I)V" since="8"/>
+ <method name="setFlashMode(Ljava/lang/String;)V" since="5"/>
+ <method name="setFocusAreas(Ljava/util/List;)V" since="14"/>
+ <method name="setFocusMode(Ljava/lang/String;)V" since="5"/>
+ <method name="setGpsAltitude(D)V" since="5"/>
+ <method name="setGpsLatitude(D)V" since="5"/>
+ <method name="setGpsLongitude(D)V" since="5"/>
+ <method name="setGpsProcessingMethod(Ljava/lang/String;)V" since="8"/>
+ <method name="setGpsTimestamp(J)V" since="5"/>
+ <method name="setJpegQuality(I)V" since="5"/>
+ <method name="setJpegThumbnailQuality(I)V" since="5"/>
+ <method name="setJpegThumbnailSize(II)V" since="5"/>
+ <method name="setMeteringAreas(Ljava/util/List;)V" since="14"/>
+ <method name="setPictureFormat(I)V"/>
+ <method name="setPictureSize(II)V"/>
+ <method name="setPreviewFormat(I)V"/>
+ <method name="setPreviewFpsRange(II)V" since="9"/>
+ <method name="setPreviewFrameRate(I)V" deprecated="16"/>
+ <method name="setPreviewSize(II)V"/>
+ <method name="setRecordingHint(Z)V" since="14"/>
+ <method name="setRotation(I)V" since="5"/>
+ <method name="setSceneMode(Ljava/lang/String;)V" since="5"/>
+ <method name="setVideoStabilization(Z)V" since="15"/>
+ <method name="setWhiteBalance(Ljava/lang/String;)V" since="5"/>
+ <method name="setZoom(I)V" since="8"/>
+ <method name="unflatten(Ljava/lang/String;)V"/>
+ <field name="ANTIBANDING_50HZ" since="5"/>
+ <field name="ANTIBANDING_60HZ" since="5"/>
+ <field name="ANTIBANDING_AUTO" since="5"/>
+ <field name="ANTIBANDING_OFF" since="5"/>
+ <field name="EFFECT_AQUA" since="5"/>
+ <field name="EFFECT_BLACKBOARD" since="5"/>
+ <field name="EFFECT_MONO" since="5"/>
+ <field name="EFFECT_NEGATIVE" since="5"/>
+ <field name="EFFECT_NONE" since="5"/>
+ <field name="EFFECT_POSTERIZE" since="5"/>
+ <field name="EFFECT_SEPIA" since="5"/>
+ <field name="EFFECT_SOLARIZE" since="5"/>
+ <field name="EFFECT_WHITEBOARD" since="5"/>
+ <field name="FLASH_MODE_AUTO" since="5"/>
+ <field name="FLASH_MODE_OFF" since="5"/>
+ <field name="FLASH_MODE_ON" since="5"/>
+ <field name="FLASH_MODE_RED_EYE" since="5"/>
+ <field name="FLASH_MODE_TORCH" since="5"/>
+ <field name="FOCUS_DISTANCE_FAR_INDEX" since="9"/>
+ <field name="FOCUS_DISTANCE_NEAR_INDEX" since="9"/>
+ <field name="FOCUS_DISTANCE_OPTIMAL_INDEX" since="9"/>
+ <field name="FOCUS_MODE_AUTO" since="5"/>
+ <field name="FOCUS_MODE_CONTINUOUS_PICTURE" since="14"/>
+ <field name="FOCUS_MODE_CONTINUOUS_VIDEO" since="9"/>
+ <field name="FOCUS_MODE_EDOF" since="8"/>
+ <field name="FOCUS_MODE_FIXED" since="5"/>
+ <field name="FOCUS_MODE_INFINITY" since="5"/>
+ <field name="FOCUS_MODE_MACRO" since="5"/>
+ <field name="PREVIEW_FPS_MAX_INDEX" since="9"/>
+ <field name="PREVIEW_FPS_MIN_INDEX" since="9"/>
+ <field name="SCENE_MODE_ACTION" since="5"/>
+ <field name="SCENE_MODE_AUTO" since="5"/>
+ <field name="SCENE_MODE_BARCODE" since="8"/>
+ <field name="SCENE_MODE_BEACH" since="5"/>
+ <field name="SCENE_MODE_CANDLELIGHT" since="5"/>
+ <field name="SCENE_MODE_FIREWORKS" since="5"/>
+ <field name="SCENE_MODE_HDR" since="17"/>
+ <field name="SCENE_MODE_LANDSCAPE" since="5"/>
+ <field name="SCENE_MODE_NIGHT" since="5"/>
+ <field name="SCENE_MODE_NIGHT_PORTRAIT" since="5"/>
+ <field name="SCENE_MODE_PARTY" since="5"/>
+ <field name="SCENE_MODE_PORTRAIT" since="5"/>
+ <field name="SCENE_MODE_SNOW" since="5"/>
+ <field name="SCENE_MODE_SPORTS" since="5"/>
+ <field name="SCENE_MODE_STEADYPHOTO" since="5"/>
+ <field name="SCENE_MODE_SUNSET" since="5"/>
+ <field name="SCENE_MODE_THEATRE" since="5"/>
+ <field name="WHITE_BALANCE_AUTO" since="5"/>
+ <field name="WHITE_BALANCE_CLOUDY_DAYLIGHT" since="5"/>
+ <field name="WHITE_BALANCE_DAYLIGHT" since="5"/>
+ <field name="WHITE_BALANCE_FLUORESCENT" since="5"/>
+ <field name="WHITE_BALANCE_INCANDESCENT" since="5"/>
+ <field name="WHITE_BALANCE_SHADE" since="5"/>
+ <field name="WHITE_BALANCE_TWILIGHT" since="5"/>
+ <field name="WHITE_BALANCE_WARM_FLUORESCENT" since="5"/>
+ </class>
+ <class name="android/hardware/Camera$PictureCallback" since="1" deprecated="21">
+ <extends name="java/lang/Object"/>
+ <method name="onPictureTaken([BLandroid/hardware/Camera;)V"/>
+ </class>
+ <class name="android/hardware/Camera$PreviewCallback" since="1" deprecated="21">
+ <extends name="java/lang/Object"/>
+ <method name="onPreviewFrame([BLandroid/hardware/Camera;)V"/>
+ </class>
+ <class name="android/hardware/Camera$ShutterCallback" since="1" deprecated="21">
+ <extends name="java/lang/Object"/>
+ <method name="onShutter()V"/>
+ </class>
+ <class name="android/hardware/Camera$Size" since="1" deprecated="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/hardware/Camera;II)V"/>
+ <field name="height"/>
+ <field name="width"/>
+ </class>
+ <class name="android/hardware/ConsumerIrManager" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCarrierFrequencies()[Landroid/hardware/ConsumerIrManager$CarrierFrequencyRange;"/>
+ <method name="hasIrEmitter()Z"/>
+ <method name="transmit(I[I)V"/>
+ </class>
+ <class name="android/hardware/ConsumerIrManager$CarrierFrequencyRange" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/hardware/ConsumerIrManager;II)V"/>
+ <method name="getMaxFrequency()I"/>
+ <method name="getMinFrequency()I"/>
+ </class>
+ <class name="android/hardware/GeomagneticField" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(FFFJ)V"/>
+ <method name="getDeclination()F"/>
+ <method name="getFieldStrength()F"/>
+ <method name="getHorizontalStrength()F"/>
+ <method name="getInclination()F"/>
+ <method name="getX()F"/>
+ <method name="getY()F"/>
+ <method name="getZ()F"/>
+ </class>
+ <class name="android/hardware/HardwareBuffer" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <implements name="java/lang/AutoCloseable"/>
+ <method name="&lt;init>()V"/>
+ <method name="create(IIIIJ)Landroid/hardware/HardwareBuffer;"/>
+ <method name="getFormat()I"/>
+ <method name="getHeight()I"/>
+ <method name="getLayers()I"/>
+ <method name="getUsage()J"/>
+ <method name="getWidth()I"/>
+ <method name="isClosed()Z"/>
+ <field name="BLOB"/>
+ <field name="CREATOR"/>
+ <field name="RGBA_1010102"/>
+ <field name="RGBA_8888"/>
+ <field name="RGBA_FP16"/>
+ <field name="RGBX_8888"/>
+ <field name="RGB_565"/>
+ <field name="RGB_888"/>
+ <field name="USAGE_CPU_READ_OFTEN"/>
+ <field name="USAGE_CPU_READ_RARELY"/>
+ <field name="USAGE_CPU_WRITE_OFTEN"/>
+ <field name="USAGE_CPU_WRITE_RARELY"/>
+ <field name="USAGE_GPU_COLOR_OUTPUT"/>
+ <field name="USAGE_GPU_DATA_BUFFER"/>
+ <field name="USAGE_GPU_SAMPLED_IMAGE"/>
+ <field name="USAGE_PROTECTED_CONTENT"/>
+ <field name="USAGE_SENSOR_DIRECT_DATA"/>
+ <field name="USAGE_VIDEO_ENCODE"/>
+ </class>
+ <class name="android/hardware/Sensor" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getFifoMaxEventCount()I" since="19"/>
+ <method name="getFifoReservedEventCount()I" since="19"/>
+ <method name="getHighestDirectReportRateLevel()I" since="26"/>
+ <method name="getId()I" since="24"/>
+ <method name="getMaxDelay()I" since="21"/>
+ <method name="getMaximumRange()F"/>
+ <method name="getMinDelay()I" since="9"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getPower()F"/>
+ <method name="getReportingMode()I" since="21"/>
+ <method name="getResolution()F"/>
+ <method name="getStringType()Ljava/lang/String;" since="20"/>
+ <method name="getType()I"/>
+ <method name="getVendor()Ljava/lang/String;"/>
+ <method name="getVersion()I"/>
+ <method name="isAdditionalInfoSupported()Z" since="24"/>
+ <method name="isDirectChannelTypeSupported(I)Z" since="26"/>
+ <method name="isDynamicSensor()Z" since="24"/>
+ <method name="isWakeUpSensor()Z" since="21"/>
+ <field name="REPORTING_MODE_CONTINUOUS" since="21"/>
+ <field name="REPORTING_MODE_ONE_SHOT" since="21"/>
+ <field name="REPORTING_MODE_ON_CHANGE" since="21"/>
+ <field name="REPORTING_MODE_SPECIAL_TRIGGER" since="21"/>
+ <field name="STRING_TYPE_ACCELEROMETER" since="20"/>
+ <field name="STRING_TYPE_ACCELEROMETER_UNCALIBRATED" since="26"/>
+ <field name="STRING_TYPE_AMBIENT_TEMPERATURE" since="20"/>
+ <field name="STRING_TYPE_GAME_ROTATION_VECTOR" since="20"/>
+ <field name="STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR" since="20"/>
+ <field name="STRING_TYPE_GRAVITY" since="20"/>
+ <field name="STRING_TYPE_GYROSCOPE" since="20"/>
+ <field name="STRING_TYPE_GYROSCOPE_UNCALIBRATED" since="20"/>
+ <field name="STRING_TYPE_HEART_BEAT" since="24"/>
+ <field name="STRING_TYPE_HEART_RATE" since="20"/>
+ <field name="STRING_TYPE_LIGHT" since="20"/>
+ <field name="STRING_TYPE_LINEAR_ACCELERATION" since="20"/>
+ <field name="STRING_TYPE_LOW_LATENCY_OFFBODY_DETECT" since="26"/>
+ <field name="STRING_TYPE_MAGNETIC_FIELD" since="20"/>
+ <field name="STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED" since="20"/>
+ <field name="STRING_TYPE_MOTION_DETECT" since="24"/>
+ <field name="STRING_TYPE_ORIENTATION" since="20" deprecated="20"/>
+ <field name="STRING_TYPE_POSE_6DOF" since="24"/>
+ <field name="STRING_TYPE_PRESSURE" since="20"/>
+ <field name="STRING_TYPE_PROXIMITY" since="20"/>
+ <field name="STRING_TYPE_RELATIVE_HUMIDITY" since="20"/>
+ <field name="STRING_TYPE_ROTATION_VECTOR" since="20"/>
+ <field name="STRING_TYPE_SIGNIFICANT_MOTION" since="20"/>
+ <field name="STRING_TYPE_STATIONARY_DETECT" since="24"/>
+ <field name="STRING_TYPE_STEP_COUNTER" since="20"/>
+ <field name="STRING_TYPE_STEP_DETECTOR" since="20"/>
+ <field name="STRING_TYPE_TEMPERATURE" since="20" deprecated="20"/>
+ <field name="TYPE_ACCELEROMETER"/>
+ <field name="TYPE_ACCELEROMETER_UNCALIBRATED" since="26"/>
+ <field name="TYPE_ALL"/>
+ <field name="TYPE_AMBIENT_TEMPERATURE" since="14"/>
+ <field name="TYPE_DEVICE_PRIVATE_BASE" since="24"/>
+ <field name="TYPE_GAME_ROTATION_VECTOR" since="18"/>
+ <field name="TYPE_GEOMAGNETIC_ROTATION_VECTOR" since="19"/>
+ <field name="TYPE_GRAVITY" since="9"/>
+ <field name="TYPE_GYROSCOPE"/>
+ <field name="TYPE_GYROSCOPE_UNCALIBRATED" since="18"/>
+ <field name="TYPE_HEART_BEAT" since="24"/>
+ <field name="TYPE_HEART_RATE" since="20"/>
+ <field name="TYPE_LIGHT"/>
+ <field name="TYPE_LINEAR_ACCELERATION" since="9"/>
+ <field name="TYPE_LOW_LATENCY_OFFBODY_DETECT" since="26"/>
+ <field name="TYPE_MAGNETIC_FIELD"/>
+ <field name="TYPE_MAGNETIC_FIELD_UNCALIBRATED" since="18"/>
+ <field name="TYPE_MOTION_DETECT" since="24"/>
+ <field name="TYPE_ORIENTATION" deprecated="16"/>
+ <field name="TYPE_POSE_6DOF" since="24"/>
+ <field name="TYPE_PRESSURE"/>
+ <field name="TYPE_PROXIMITY"/>
+ <field name="TYPE_RELATIVE_HUMIDITY" since="14"/>
+ <field name="TYPE_ROTATION_VECTOR" since="9"/>
+ <field name="TYPE_SIGNIFICANT_MOTION" since="18"/>
+ <field name="TYPE_STATIONARY_DETECT" since="24"/>
+ <field name="TYPE_STEP_COUNTER" since="19"/>
+ <field name="TYPE_STEP_DETECTOR" since="19"/>
+ <field name="TYPE_TEMPERATURE" deprecated="16"/>
+ </class>
+ <class name="android/hardware/SensorAdditionalInfo" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="TYPE_FRAME_BEGIN"/>
+ <field name="TYPE_FRAME_END"/>
+ <field name="TYPE_INTERNAL_TEMPERATURE"/>
+ <field name="TYPE_SAMPLING"/>
+ <field name="TYPE_SENSOR_PLACEMENT"/>
+ <field name="TYPE_UNTRACKED_DELAY"/>
+ <field name="TYPE_VEC3_CALIBRATION"/>
+ <field name="floatValues"/>
+ <field name="intValues"/>
+ <field name="sensor"/>
+ <field name="serial"/>
+ <field name="type"/>
+ </class>
+ <class name="android/hardware/SensorDirectChannel" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/channels/Channel"/>
+ <method name="&lt;init>()V"/>
+ <method name="configure(Landroid/hardware/Sensor;I)I"/>
+ <field name="RATE_FAST"/>
+ <field name="RATE_NORMAL"/>
+ <field name="RATE_STOP"/>
+ <field name="RATE_VERY_FAST"/>
+ <field name="TYPE_HARDWARE_BUFFER"/>
+ <field name="TYPE_MEMORY_FILE"/>
+ </class>
+ <class name="android/hardware/SensorEvent" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="accuracy"/>
+ <field name="sensor"/>
+ <field name="timestamp"/>
+ <field name="values"/>
+ </class>
+ <class name="android/hardware/SensorEventCallback" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/hardware/SensorEventListener2"/>
+ <method name="&lt;init>()V"/>
+ <method name="onSensorAdditionalInfo(Landroid/hardware/SensorAdditionalInfo;)V"/>
+ </class>
+ <class name="android/hardware/SensorEventListener" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="onAccuracyChanged(Landroid/hardware/Sensor;I)V"/>
+ <method name="onSensorChanged(Landroid/hardware/SensorEvent;)V"/>
+ </class>
+ <class name="android/hardware/SensorEventListener2" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/hardware/SensorEventListener"/>
+ <method name="onFlushCompleted(Landroid/hardware/Sensor;)V"/>
+ </class>
+ <class name="android/hardware/SensorListener" since="1" deprecated="3">
+ <extends name="java/lang/Object"/>
+ <method name="onAccuracyChanged(II)V"/>
+ <method name="onSensorChanged(I[F)V"/>
+ </class>
+ <class name="android/hardware/SensorManager" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="cancelTriggerSensor(Landroid/hardware/TriggerEventListener;Landroid/hardware/Sensor;)Z" since="18"/>
+ <method name="createDirectChannel(Landroid/hardware/HardwareBuffer;)Landroid/hardware/SensorDirectChannel;" since="26"/>
+ <method name="createDirectChannel(Landroid/os/MemoryFile;)Landroid/hardware/SensorDirectChannel;" since="26"/>
+ <method name="flush(Landroid/hardware/SensorEventListener;)Z" since="19"/>
+ <method name="getAltitude(FF)F" since="9"/>
+ <method name="getAngleChange([F[F[F)V" since="9"/>
+ <method name="getDefaultSensor(I)Landroid/hardware/Sensor;" since="3"/>
+ <method name="getDefaultSensor(IZ)Landroid/hardware/Sensor;" since="21"/>
+ <method name="getDynamicSensorList(I)Ljava/util/List;" since="24"/>
+ <method name="getInclination([F)F" since="3"/>
+ <method name="getOrientation([F[F)[F" since="3"/>
+ <method name="getQuaternionFromVector([F[F)V" since="9"/>
+ <method name="getRotationMatrix([F[F[F[F)Z" since="3"/>
+ <method name="getRotationMatrixFromVector([F[F)V" since="9"/>
+ <method name="getSensorList(I)Ljava/util/List;" since="3"/>
+ <method name="getSensors()I" deprecated="16"/>
+ <method name="isDynamicSensorDiscoverySupported()Z" since="24"/>
+ <method name="registerDynamicSensorCallback(Landroid/hardware/SensorManager$DynamicSensorCallback;)V" since="24"/>
+ <method name="registerDynamicSensorCallback(Landroid/hardware/SensorManager$DynamicSensorCallback;Landroid/os/Handler;)V" since="24"/>
+ <method name="registerListener(Landroid/hardware/SensorEventListener;Landroid/hardware/Sensor;I)Z" since="3"/>
+ <method name="registerListener(Landroid/hardware/SensorEventListener;Landroid/hardware/Sensor;II)Z" since="19"/>
+ <method name="registerListener(Landroid/hardware/SensorEventListener;Landroid/hardware/Sensor;IILandroid/os/Handler;)Z" since="19"/>
+ <method name="registerListener(Landroid/hardware/SensorEventListener;Landroid/hardware/Sensor;ILandroid/os/Handler;)Z" since="3"/>
+ <method name="registerListener(Landroid/hardware/SensorListener;I)Z" deprecated="16"/>
+ <method name="registerListener(Landroid/hardware/SensorListener;II)Z" deprecated="16"/>
+ <method name="remapCoordinateSystem([FII[F)Z" since="3"/>
+ <method name="requestTriggerSensor(Landroid/hardware/TriggerEventListener;Landroid/hardware/Sensor;)Z" since="18"/>
+ <method name="unregisterDynamicSensorCallback(Landroid/hardware/SensorManager$DynamicSensorCallback;)V" since="24"/>
+ <method name="unregisterListener(Landroid/hardware/SensorEventListener;)V" since="3"/>
+ <method name="unregisterListener(Landroid/hardware/SensorEventListener;Landroid/hardware/Sensor;)V" since="3"/>
+ <method name="unregisterListener(Landroid/hardware/SensorListener;)V" deprecated="16"/>
+ <method name="unregisterListener(Landroid/hardware/SensorListener;I)V" deprecated="16"/>
+ <field name="AXIS_MINUS_X" since="3"/>
+ <field name="AXIS_MINUS_Y" since="3"/>
+ <field name="AXIS_MINUS_Z" since="3"/>
+ <field name="AXIS_X" since="3"/>
+ <field name="AXIS_Y" since="3"/>
+ <field name="AXIS_Z" since="3"/>
+ <field name="DATA_X" deprecated="16"/>
+ <field name="DATA_Y" deprecated="16"/>
+ <field name="DATA_Z" deprecated="16"/>
+ <field name="GRAVITY_DEATH_STAR_I"/>
+ <field name="GRAVITY_EARTH"/>
+ <field name="GRAVITY_JUPITER"/>
+ <field name="GRAVITY_MARS"/>
+ <field name="GRAVITY_MERCURY"/>
+ <field name="GRAVITY_MOON"/>
+ <field name="GRAVITY_NEPTUNE"/>
+ <field name="GRAVITY_PLUTO"/>
+ <field name="GRAVITY_SATURN"/>
+ <field name="GRAVITY_SUN"/>
+ <field name="GRAVITY_THE_ISLAND"/>
+ <field name="GRAVITY_URANUS"/>
+ <field name="GRAVITY_VENUS"/>
+ <field name="LIGHT_CLOUDY"/>
+ <field name="LIGHT_FULLMOON"/>
+ <field name="LIGHT_NO_MOON"/>
+ <field name="LIGHT_OVERCAST"/>
+ <field name="LIGHT_SHADE"/>
+ <field name="LIGHT_SUNLIGHT"/>
+ <field name="LIGHT_SUNLIGHT_MAX"/>
+ <field name="LIGHT_SUNRISE"/>
+ <field name="MAGNETIC_FIELD_EARTH_MAX"/>
+ <field name="MAGNETIC_FIELD_EARTH_MIN"/>
+ <field name="PRESSURE_STANDARD_ATMOSPHERE" since="9"/>
+ <field name="RAW_DATA_INDEX" deprecated="16"/>
+ <field name="RAW_DATA_X" deprecated="16"/>
+ <field name="RAW_DATA_Y" deprecated="16"/>
+ <field name="RAW_DATA_Z" deprecated="16"/>
+ <field name="SENSOR_ACCELEROMETER" deprecated="16"/>
+ <field name="SENSOR_ALL" deprecated="16"/>
+ <field name="SENSOR_DELAY_FASTEST"/>
+ <field name="SENSOR_DELAY_GAME"/>
+ <field name="SENSOR_DELAY_NORMAL"/>
+ <field name="SENSOR_DELAY_UI"/>
+ <field name="SENSOR_LIGHT" deprecated="16"/>
+ <field name="SENSOR_MAGNETIC_FIELD" deprecated="16"/>
+ <field name="SENSOR_MAX" deprecated="16"/>
+ <field name="SENSOR_MIN" deprecated="16"/>
+ <field name="SENSOR_ORIENTATION" deprecated="16"/>
+ <field name="SENSOR_ORIENTATION_RAW" deprecated="16"/>
+ <field name="SENSOR_PROXIMITY" deprecated="16"/>
+ <field name="SENSOR_STATUS_ACCURACY_HIGH"/>
+ <field name="SENSOR_STATUS_ACCURACY_LOW"/>
+ <field name="SENSOR_STATUS_ACCURACY_MEDIUM"/>
+ <field name="SENSOR_STATUS_NO_CONTACT" since="20"/>
+ <field name="SENSOR_STATUS_UNRELIABLE"/>
+ <field name="SENSOR_TEMPERATURE" deprecated="16"/>
+ <field name="SENSOR_TRICORDER" deprecated="16"/>
+ <field name="STANDARD_GRAVITY"/>
+ </class>
+ <class name="android/hardware/SensorManager$DynamicSensorCallback" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onDynamicSensorConnected(Landroid/hardware/Sensor;)V"/>
+ <method name="onDynamicSensorDisconnected(Landroid/hardware/Sensor;)V"/>
+ </class>
+ <class name="android/hardware/TriggerEvent" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="sensor"/>
+ <field name="timestamp"/>
+ <field name="values"/>
+ </class>
+ <class name="android/hardware/TriggerEventListener" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onTrigger(Landroid/hardware/TriggerEvent;)V"/>
+ </class>
+ <class name="android/hardware/camera2/CameraAccessException" since="21">
+ <extends name="android/util/AndroidException"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(ILjava/lang/String;)V"/>
+ <method name="&lt;init>(ILjava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(ILjava/lang/Throwable;)V"/>
+ <method name="getReason()I"/>
+ <field name="CAMERA_DISABLED"/>
+ <field name="CAMERA_DISCONNECTED"/>
+ <field name="CAMERA_ERROR"/>
+ <field name="CAMERA_IN_USE" since="23"/>
+ <field name="MAX_CAMERAS_IN_USE" since="23"/>
+ </class>
+ <class name="android/hardware/camera2/CameraCaptureSession" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable"/>
+ <method name="&lt;init>()V"/>
+ <method name="abortCaptures()V"/>
+ <method name="capture(Landroid/hardware/camera2/CaptureRequest;Landroid/hardware/camera2/CameraCaptureSession$CaptureCallback;Landroid/os/Handler;)I"/>
+ <method name="captureBurst(Ljava/util/List;Landroid/hardware/camera2/CameraCaptureSession$CaptureCallback;Landroid/os/Handler;)I"/>
+ <method name="finalizeOutputConfigurations(Ljava/util/List;)V" since="26"/>
+ <method name="getDevice()Landroid/hardware/camera2/CameraDevice;"/>
+ <method name="getInputSurface()Landroid/view/Surface;" since="23"/>
+ <method name="isReprocessable()Z" since="23"/>
+ <method name="prepare(Landroid/view/Surface;)V" since="23"/>
+ <method name="setRepeatingBurst(Ljava/util/List;Landroid/hardware/camera2/CameraCaptureSession$CaptureCallback;Landroid/os/Handler;)I"/>
+ <method name="setRepeatingRequest(Landroid/hardware/camera2/CaptureRequest;Landroid/hardware/camera2/CameraCaptureSession$CaptureCallback;Landroid/os/Handler;)I"/>
+ <method name="stopRepeating()V"/>
+ </class>
+ <class name="android/hardware/camera2/CameraCaptureSession$CaptureCallback" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onCaptureBufferLost(Landroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;Landroid/view/Surface;J)V" since="24"/>
+ <method name="onCaptureCompleted(Landroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;Landroid/hardware/camera2/TotalCaptureResult;)V"/>
+ <method name="onCaptureFailed(Landroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;Landroid/hardware/camera2/CaptureFailure;)V"/>
+ <method name="onCaptureProgressed(Landroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;Landroid/hardware/camera2/CaptureResult;)V"/>
+ <method name="onCaptureSequenceAborted(Landroid/hardware/camera2/CameraCaptureSession;I)V"/>
+ <method name="onCaptureSequenceCompleted(Landroid/hardware/camera2/CameraCaptureSession;IJ)V"/>
+ <method name="onCaptureStarted(Landroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;JJ)V"/>
+ </class>
+ <class name="android/hardware/camera2/CameraCaptureSession$StateCallback" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onActive(Landroid/hardware/camera2/CameraCaptureSession;)V"/>
+ <method name="onCaptureQueueEmpty(Landroid/hardware/camera2/CameraCaptureSession;)V" since="26"/>
+ <method name="onClosed(Landroid/hardware/camera2/CameraCaptureSession;)V"/>
+ <method name="onConfigureFailed(Landroid/hardware/camera2/CameraCaptureSession;)V"/>
+ <method name="onConfigured(Landroid/hardware/camera2/CameraCaptureSession;)V"/>
+ <method name="onReady(Landroid/hardware/camera2/CameraCaptureSession;)V"/>
+ <method name="onSurfacePrepared(Landroid/hardware/camera2/CameraCaptureSession;Landroid/view/Surface;)V" since="23"/>
+ </class>
+ <class name="android/hardware/camera2/CameraCharacteristics" since="21">
+ <extends name="android/hardware/camera2/CameraMetadata"/>
+ <method name="&lt;init>()V"/>
+ <method name="get(Landroid/hardware/camera2/CameraCharacteristics$Key;)Ljava/lang/Object;"/>
+ <method name="getAvailableCaptureRequestKeys()Ljava/util/List;"/>
+ <method name="getAvailableCaptureResultKeys()Ljava/util/List;"/>
+ <field name="COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES"/>
+ <field name="CONTROL_AE_AVAILABLE_ANTIBANDING_MODES"/>
+ <field name="CONTROL_AE_AVAILABLE_MODES"/>
+ <field name="CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES"/>
+ <field name="CONTROL_AE_COMPENSATION_RANGE"/>
+ <field name="CONTROL_AE_COMPENSATION_STEP"/>
+ <field name="CONTROL_AE_LOCK_AVAILABLE" since="23"/>
+ <field name="CONTROL_AF_AVAILABLE_MODES"/>
+ <field name="CONTROL_AVAILABLE_EFFECTS"/>
+ <field name="CONTROL_AVAILABLE_MODES" since="23"/>
+ <field name="CONTROL_AVAILABLE_SCENE_MODES"/>
+ <field name="CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES"/>
+ <field name="CONTROL_AWB_AVAILABLE_MODES"/>
+ <field name="CONTROL_AWB_LOCK_AVAILABLE" since="23"/>
+ <field name="CONTROL_MAX_REGIONS_AE"/>
+ <field name="CONTROL_MAX_REGIONS_AF"/>
+ <field name="CONTROL_MAX_REGIONS_AWB"/>
+ <field name="CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE" since="24"/>
+ <field name="DEPTH_DEPTH_IS_EXCLUSIVE" since="23"/>
+ <field name="EDGE_AVAILABLE_EDGE_MODES"/>
+ <field name="FLASH_INFO_AVAILABLE"/>
+ <field name="HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES"/>
+ <field name="INFO_SUPPORTED_HARDWARE_LEVEL"/>
+ <field name="JPEG_AVAILABLE_THUMBNAIL_SIZES"/>
+ <field name="LENS_FACING"/>
+ <field name="LENS_INFO_AVAILABLE_APERTURES"/>
+ <field name="LENS_INFO_AVAILABLE_FILTER_DENSITIES"/>
+ <field name="LENS_INFO_AVAILABLE_FOCAL_LENGTHS"/>
+ <field name="LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION"/>
+ <field name="LENS_INFO_FOCUS_DISTANCE_CALIBRATION"/>
+ <field name="LENS_INFO_HYPERFOCAL_DISTANCE"/>
+ <field name="LENS_INFO_MINIMUM_FOCUS_DISTANCE"/>
+ <field name="LENS_INTRINSIC_CALIBRATION" since="23"/>
+ <field name="LENS_POSE_ROTATION" since="23"/>
+ <field name="LENS_POSE_TRANSLATION" since="23"/>
+ <field name="LENS_RADIAL_DISTORTION" since="23"/>
+ <field name="NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES"/>
+ <field name="REPROCESS_MAX_CAPTURE_STALL" since="23"/>
+ <field name="REQUEST_AVAILABLE_CAPABILITIES"/>
+ <field name="REQUEST_MAX_NUM_INPUT_STREAMS" since="23"/>
+ <field name="REQUEST_MAX_NUM_OUTPUT_PROC"/>
+ <field name="REQUEST_MAX_NUM_OUTPUT_PROC_STALLING"/>
+ <field name="REQUEST_MAX_NUM_OUTPUT_RAW"/>
+ <field name="REQUEST_PARTIAL_RESULT_COUNT"/>
+ <field name="REQUEST_PIPELINE_MAX_DEPTH"/>
+ <field name="SCALER_AVAILABLE_MAX_DIGITAL_ZOOM"/>
+ <field name="SCALER_CROPPING_TYPE"/>
+ <field name="SCALER_STREAM_CONFIGURATION_MAP"/>
+ <field name="SENSOR_AVAILABLE_TEST_PATTERN_MODES"/>
+ <field name="SENSOR_BLACK_LEVEL_PATTERN"/>
+ <field name="SENSOR_CALIBRATION_TRANSFORM1"/>
+ <field name="SENSOR_CALIBRATION_TRANSFORM2"/>
+ <field name="SENSOR_COLOR_TRANSFORM1"/>
+ <field name="SENSOR_COLOR_TRANSFORM2"/>
+ <field name="SENSOR_FORWARD_MATRIX1"/>
+ <field name="SENSOR_FORWARD_MATRIX2"/>
+ <field name="SENSOR_INFO_ACTIVE_ARRAY_SIZE"/>
+ <field name="SENSOR_INFO_COLOR_FILTER_ARRANGEMENT"/>
+ <field name="SENSOR_INFO_EXPOSURE_TIME_RANGE"/>
+ <field name="SENSOR_INFO_LENS_SHADING_APPLIED" since="23"/>
+ <field name="SENSOR_INFO_MAX_FRAME_DURATION"/>
+ <field name="SENSOR_INFO_PHYSICAL_SIZE"/>
+ <field name="SENSOR_INFO_PIXEL_ARRAY_SIZE"/>
+ <field name="SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE" since="23"/>
+ <field name="SENSOR_INFO_SENSITIVITY_RANGE"/>
+ <field name="SENSOR_INFO_TIMESTAMP_SOURCE"/>
+ <field name="SENSOR_INFO_WHITE_LEVEL"/>
+ <field name="SENSOR_MAX_ANALOG_SENSITIVITY"/>
+ <field name="SENSOR_OPTICAL_BLACK_REGIONS" since="24"/>
+ <field name="SENSOR_ORIENTATION"/>
+ <field name="SENSOR_REFERENCE_ILLUMINANT1"/>
+ <field name="SENSOR_REFERENCE_ILLUMINANT2"/>
+ <field name="SHADING_AVAILABLE_MODES" since="23"/>
+ <field name="STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES"/>
+ <field name="STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES"/>
+ <field name="STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES" since="23"/>
+ <field name="STATISTICS_INFO_MAX_FACE_COUNT"/>
+ <field name="SYNC_MAX_LATENCY"/>
+ <field name="TONEMAP_AVAILABLE_TONE_MAP_MODES"/>
+ <field name="TONEMAP_MAX_CURVE_POINTS"/>
+ </class>
+ <class name="android/hardware/camera2/CameraCharacteristics$Key" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getName()Ljava/lang/String;"/>
+ </class>
+ <class name="android/hardware/camera2/CameraConstrainedHighSpeedCaptureSession" since="23">
+ <extends name="android/hardware/camera2/CameraCaptureSession"/>
+ <method name="&lt;init>()V"/>
+ <method name="createHighSpeedRequestList(Landroid/hardware/camera2/CaptureRequest;)Ljava/util/List;"/>
+ </class>
+ <class name="android/hardware/camera2/CameraDevice" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable"/>
+ <method name="&lt;init>()V"/>
+ <method name="createCaptureRequest(I)Landroid/hardware/camera2/CaptureRequest$Builder;"/>
+ <method name="createCaptureSession(Ljava/util/List;Landroid/hardware/camera2/CameraCaptureSession$StateCallback;Landroid/os/Handler;)V"/>
+ <method name="createCaptureSessionByOutputConfigurations(Ljava/util/List;Landroid/hardware/camera2/CameraCaptureSession$StateCallback;Landroid/os/Handler;)V" since="24"/>
+ <method name="createConstrainedHighSpeedCaptureSession(Ljava/util/List;Landroid/hardware/camera2/CameraCaptureSession$StateCallback;Landroid/os/Handler;)V" since="23"/>
+ <method name="createReprocessCaptureRequest(Landroid/hardware/camera2/TotalCaptureResult;)Landroid/hardware/camera2/CaptureRequest$Builder;" since="23"/>
+ <method name="createReprocessableCaptureSession(Landroid/hardware/camera2/params/InputConfiguration;Ljava/util/List;Landroid/hardware/camera2/CameraCaptureSession$StateCallback;Landroid/os/Handler;)V" since="23"/>
+ <method name="createReprocessableCaptureSessionByConfigurations(Landroid/hardware/camera2/params/InputConfiguration;Ljava/util/List;Landroid/hardware/camera2/CameraCaptureSession$StateCallback;Landroid/os/Handler;)V" since="24"/>
+ <method name="getId()Ljava/lang/String;"/>
+ <field name="TEMPLATE_MANUAL"/>
+ <field name="TEMPLATE_PREVIEW"/>
+ <field name="TEMPLATE_RECORD"/>
+ <field name="TEMPLATE_STILL_CAPTURE"/>
+ <field name="TEMPLATE_VIDEO_SNAPSHOT"/>
+ <field name="TEMPLATE_ZERO_SHUTTER_LAG"/>
+ </class>
+ <class name="android/hardware/camera2/CameraDevice$StateCallback" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onClosed(Landroid/hardware/camera2/CameraDevice;)V"/>
+ <method name="onDisconnected(Landroid/hardware/camera2/CameraDevice;)V"/>
+ <method name="onError(Landroid/hardware/camera2/CameraDevice;I)V"/>
+ <method name="onOpened(Landroid/hardware/camera2/CameraDevice;)V"/>
+ <field name="ERROR_CAMERA_DEVICE"/>
+ <field name="ERROR_CAMERA_DISABLED"/>
+ <field name="ERROR_CAMERA_IN_USE"/>
+ <field name="ERROR_CAMERA_SERVICE"/>
+ <field name="ERROR_MAX_CAMERAS_IN_USE"/>
+ </class>
+ <class name="android/hardware/camera2/CameraManager" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCameraCharacteristics(Ljava/lang/String;)Landroid/hardware/camera2/CameraCharacteristics;"/>
+ <method name="getCameraIdList()[Ljava/lang/String;"/>
+ <method name="openCamera(Ljava/lang/String;Landroid/hardware/camera2/CameraDevice$StateCallback;Landroid/os/Handler;)V"/>
+ <method name="registerAvailabilityCallback(Landroid/hardware/camera2/CameraManager$AvailabilityCallback;Landroid/os/Handler;)V"/>
+ <method name="registerTorchCallback(Landroid/hardware/camera2/CameraManager$TorchCallback;Landroid/os/Handler;)V" since="23"/>
+ <method name="setTorchMode(Ljava/lang/String;Z)V" since="23"/>
+ <method name="unregisterAvailabilityCallback(Landroid/hardware/camera2/CameraManager$AvailabilityCallback;)V"/>
+ <method name="unregisterTorchCallback(Landroid/hardware/camera2/CameraManager$TorchCallback;)V" since="23"/>
+ </class>
+ <class name="android/hardware/camera2/CameraManager$AvailabilityCallback" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onCameraAvailable(Ljava/lang/String;)V"/>
+ <method name="onCameraUnavailable(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/hardware/camera2/CameraManager$TorchCallback" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onTorchModeChanged(Ljava/lang/String;Z)V"/>
+ <method name="onTorchModeUnavailable(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/hardware/camera2/CameraMetadata" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getKeys()Ljava/util/List;"/>
+ <field name="COLOR_CORRECTION_ABERRATION_MODE_FAST"/>
+ <field name="COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY"/>
+ <field name="COLOR_CORRECTION_ABERRATION_MODE_OFF"/>
+ <field name="COLOR_CORRECTION_MODE_FAST"/>
+ <field name="COLOR_CORRECTION_MODE_HIGH_QUALITY"/>
+ <field name="COLOR_CORRECTION_MODE_TRANSFORM_MATRIX"/>
+ <field name="CONTROL_AE_ANTIBANDING_MODE_50HZ"/>
+ <field name="CONTROL_AE_ANTIBANDING_MODE_60HZ"/>
+ <field name="CONTROL_AE_ANTIBANDING_MODE_AUTO"/>
+ <field name="CONTROL_AE_ANTIBANDING_MODE_OFF"/>
+ <field name="CONTROL_AE_MODE_OFF"/>
+ <field name="CONTROL_AE_MODE_ON"/>
+ <field name="CONTROL_AE_MODE_ON_ALWAYS_FLASH"/>
+ <field name="CONTROL_AE_MODE_ON_AUTO_FLASH"/>
+ <field name="CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE"/>
+ <field name="CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL" since="23"/>
+ <field name="CONTROL_AE_PRECAPTURE_TRIGGER_IDLE"/>
+ <field name="CONTROL_AE_PRECAPTURE_TRIGGER_START"/>
+ <field name="CONTROL_AE_STATE_CONVERGED"/>
+ <field name="CONTROL_AE_STATE_FLASH_REQUIRED"/>
+ <field name="CONTROL_AE_STATE_INACTIVE"/>
+ <field name="CONTROL_AE_STATE_LOCKED"/>
+ <field name="CONTROL_AE_STATE_PRECAPTURE"/>
+ <field name="CONTROL_AE_STATE_SEARCHING"/>
+ <field name="CONTROL_AF_MODE_AUTO"/>
+ <field name="CONTROL_AF_MODE_CONTINUOUS_PICTURE"/>
+ <field name="CONTROL_AF_MODE_CONTINUOUS_VIDEO"/>
+ <field name="CONTROL_AF_MODE_EDOF"/>
+ <field name="CONTROL_AF_MODE_MACRO"/>
+ <field name="CONTROL_AF_MODE_OFF"/>
+ <field name="CONTROL_AF_STATE_ACTIVE_SCAN"/>
+ <field name="CONTROL_AF_STATE_FOCUSED_LOCKED"/>
+ <field name="CONTROL_AF_STATE_INACTIVE"/>
+ <field name="CONTROL_AF_STATE_NOT_FOCUSED_LOCKED"/>
+ <field name="CONTROL_AF_STATE_PASSIVE_FOCUSED"/>
+ <field name="CONTROL_AF_STATE_PASSIVE_SCAN"/>
+ <field name="CONTROL_AF_STATE_PASSIVE_UNFOCUSED"/>
+ <field name="CONTROL_AF_TRIGGER_CANCEL"/>
+ <field name="CONTROL_AF_TRIGGER_IDLE"/>
+ <field name="CONTROL_AF_TRIGGER_START"/>
+ <field name="CONTROL_AWB_MODE_AUTO"/>
+ <field name="CONTROL_AWB_MODE_CLOUDY_DAYLIGHT"/>
+ <field name="CONTROL_AWB_MODE_DAYLIGHT"/>
+ <field name="CONTROL_AWB_MODE_FLUORESCENT"/>
+ <field name="CONTROL_AWB_MODE_INCANDESCENT"/>
+ <field name="CONTROL_AWB_MODE_OFF"/>
+ <field name="CONTROL_AWB_MODE_SHADE"/>
+ <field name="CONTROL_AWB_MODE_TWILIGHT"/>
+ <field name="CONTROL_AWB_MODE_WARM_FLUORESCENT"/>
+ <field name="CONTROL_AWB_STATE_CONVERGED"/>
+ <field name="CONTROL_AWB_STATE_INACTIVE"/>
+ <field name="CONTROL_AWB_STATE_LOCKED"/>
+ <field name="CONTROL_AWB_STATE_SEARCHING"/>
+ <field name="CONTROL_CAPTURE_INTENT_CUSTOM"/>
+ <field name="CONTROL_CAPTURE_INTENT_MANUAL"/>
+ <field name="CONTROL_CAPTURE_INTENT_PREVIEW"/>
+ <field name="CONTROL_CAPTURE_INTENT_STILL_CAPTURE"/>
+ <field name="CONTROL_CAPTURE_INTENT_VIDEO_RECORD"/>
+ <field name="CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT"/>
+ <field name="CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG"/>
+ <field name="CONTROL_EFFECT_MODE_AQUA"/>
+ <field name="CONTROL_EFFECT_MODE_BLACKBOARD"/>
+ <field name="CONTROL_EFFECT_MODE_MONO"/>
+ <field name="CONTROL_EFFECT_MODE_NEGATIVE"/>
+ <field name="CONTROL_EFFECT_MODE_OFF"/>
+ <field name="CONTROL_EFFECT_MODE_POSTERIZE"/>
+ <field name="CONTROL_EFFECT_MODE_SEPIA"/>
+ <field name="CONTROL_EFFECT_MODE_SOLARIZE"/>
+ <field name="CONTROL_EFFECT_MODE_WHITEBOARD"/>
+ <field name="CONTROL_MODE_AUTO"/>
+ <field name="CONTROL_MODE_OFF"/>
+ <field name="CONTROL_MODE_OFF_KEEP_STATE"/>
+ <field name="CONTROL_MODE_USE_SCENE_MODE"/>
+ <field name="CONTROL_SCENE_MODE_ACTION"/>
+ <field name="CONTROL_SCENE_MODE_BARCODE"/>
+ <field name="CONTROL_SCENE_MODE_BEACH"/>
+ <field name="CONTROL_SCENE_MODE_CANDLELIGHT"/>
+ <field name="CONTROL_SCENE_MODE_DISABLED"/>
+ <field name="CONTROL_SCENE_MODE_FACE_PRIORITY"/>
+ <field name="CONTROL_SCENE_MODE_FIREWORKS"/>
+ <field name="CONTROL_SCENE_MODE_HDR" since="22"/>
+ <field name="CONTROL_SCENE_MODE_HIGH_SPEED_VIDEO" deprecated="23"/>
+ <field name="CONTROL_SCENE_MODE_LANDSCAPE"/>
+ <field name="CONTROL_SCENE_MODE_NIGHT"/>
+ <field name="CONTROL_SCENE_MODE_NIGHT_PORTRAIT"/>
+ <field name="CONTROL_SCENE_MODE_PARTY"/>
+ <field name="CONTROL_SCENE_MODE_PORTRAIT"/>
+ <field name="CONTROL_SCENE_MODE_SNOW"/>
+ <field name="CONTROL_SCENE_MODE_SPORTS"/>
+ <field name="CONTROL_SCENE_MODE_STEADYPHOTO"/>
+ <field name="CONTROL_SCENE_MODE_SUNSET"/>
+ <field name="CONTROL_SCENE_MODE_THEATRE"/>
+ <field name="CONTROL_VIDEO_STABILIZATION_MODE_OFF"/>
+ <field name="CONTROL_VIDEO_STABILIZATION_MODE_ON"/>
+ <field name="EDGE_MODE_FAST"/>
+ <field name="EDGE_MODE_HIGH_QUALITY"/>
+ <field name="EDGE_MODE_OFF"/>
+ <field name="EDGE_MODE_ZERO_SHUTTER_LAG" since="23"/>
+ <field name="FLASH_MODE_OFF"/>
+ <field name="FLASH_MODE_SINGLE"/>
+ <field name="FLASH_MODE_TORCH"/>
+ <field name="FLASH_STATE_CHARGING"/>
+ <field name="FLASH_STATE_FIRED"/>
+ <field name="FLASH_STATE_PARTIAL"/>
+ <field name="FLASH_STATE_READY"/>
+ <field name="FLASH_STATE_UNAVAILABLE"/>
+ <field name="HOT_PIXEL_MODE_FAST"/>
+ <field name="HOT_PIXEL_MODE_HIGH_QUALITY"/>
+ <field name="HOT_PIXEL_MODE_OFF"/>
+ <field name="INFO_SUPPORTED_HARDWARE_LEVEL_3" since="24"/>
+ <field name="INFO_SUPPORTED_HARDWARE_LEVEL_FULL"/>
+ <field name="INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY"/>
+ <field name="INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED"/>
+ <field name="LENS_FACING_BACK"/>
+ <field name="LENS_FACING_EXTERNAL" since="23"/>
+ <field name="LENS_FACING_FRONT"/>
+ <field name="LENS_INFO_FOCUS_DISTANCE_CALIBRATION_APPROXIMATE"/>
+ <field name="LENS_INFO_FOCUS_DISTANCE_CALIBRATION_CALIBRATED"/>
+ <field name="LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED"/>
+ <field name="LENS_OPTICAL_STABILIZATION_MODE_OFF"/>
+ <field name="LENS_OPTICAL_STABILIZATION_MODE_ON"/>
+ <field name="LENS_STATE_MOVING"/>
+ <field name="LENS_STATE_STATIONARY"/>
+ <field name="NOISE_REDUCTION_MODE_FAST"/>
+ <field name="NOISE_REDUCTION_MODE_HIGH_QUALITY"/>
+ <field name="NOISE_REDUCTION_MODE_MINIMAL" since="23"/>
+ <field name="NOISE_REDUCTION_MODE_OFF"/>
+ <field name="NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG" since="23"/>
+ <field name="REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE"/>
+ <field name="REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE" since="22"/>
+ <field name="REQUEST_AVAILABLE_CAPABILITIES_CONSTRAINED_HIGH_SPEED_VIDEO" since="23"/>
+ <field name="REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT" since="23"/>
+ <field name="REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING"/>
+ <field name="REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR"/>
+ <field name="REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING" since="23"/>
+ <field name="REQUEST_AVAILABLE_CAPABILITIES_RAW"/>
+ <field name="REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS" since="22"/>
+ <field name="REQUEST_AVAILABLE_CAPABILITIES_YUV_REPROCESSING" since="23"/>
+ <field name="SCALER_CROPPING_TYPE_CENTER_ONLY"/>
+ <field name="SCALER_CROPPING_TYPE_FREEFORM"/>
+ <field name="SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_BGGR"/>
+ <field name="SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GBRG"/>
+ <field name="SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GRBG"/>
+ <field name="SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGB"/>
+ <field name="SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGGB"/>
+ <field name="SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME"/>
+ <field name="SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN"/>
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_CLOUDY_WEATHER"/>
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_COOL_WHITE_FLUORESCENT"/>
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_D50"/>
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_D55"/>
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_D65"/>
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_D75"/>
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT"/>
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT_FLUORESCENT"/>
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_DAY_WHITE_FLUORESCENT"/>
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_FINE_WEATHER"/>
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_FLASH"/>
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_FLUORESCENT"/>
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_ISO_STUDIO_TUNGSTEN"/>
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_SHADE"/>
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_STANDARD_A"/>
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_STANDARD_B"/>
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_STANDARD_C"/>
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_TUNGSTEN"/>
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_WHITE_FLUORESCENT"/>
+ <field name="SENSOR_TEST_PATTERN_MODE_COLOR_BARS"/>
+ <field name="SENSOR_TEST_PATTERN_MODE_COLOR_BARS_FADE_TO_GRAY"/>
+ <field name="SENSOR_TEST_PATTERN_MODE_CUSTOM1"/>
+ <field name="SENSOR_TEST_PATTERN_MODE_OFF"/>
+ <field name="SENSOR_TEST_PATTERN_MODE_PN9"/>
+ <field name="SENSOR_TEST_PATTERN_MODE_SOLID_COLOR"/>
+ <field name="SHADING_MODE_FAST"/>
+ <field name="SHADING_MODE_HIGH_QUALITY"/>
+ <field name="SHADING_MODE_OFF"/>
+ <field name="STATISTICS_FACE_DETECT_MODE_FULL"/>
+ <field name="STATISTICS_FACE_DETECT_MODE_OFF"/>
+ <field name="STATISTICS_FACE_DETECT_MODE_SIMPLE"/>
+ <field name="STATISTICS_LENS_SHADING_MAP_MODE_OFF"/>
+ <field name="STATISTICS_LENS_SHADING_MAP_MODE_ON"/>
+ <field name="STATISTICS_SCENE_FLICKER_50HZ"/>
+ <field name="STATISTICS_SCENE_FLICKER_60HZ"/>
+ <field name="STATISTICS_SCENE_FLICKER_NONE"/>
+ <field name="SYNC_MAX_LATENCY_PER_FRAME_CONTROL"/>
+ <field name="SYNC_MAX_LATENCY_UNKNOWN"/>
+ <field name="TONEMAP_MODE_CONTRAST_CURVE"/>
+ <field name="TONEMAP_MODE_FAST"/>
+ <field name="TONEMAP_MODE_GAMMA_VALUE" since="23"/>
+ <field name="TONEMAP_MODE_HIGH_QUALITY"/>
+ <field name="TONEMAP_MODE_PRESET_CURVE" since="23"/>
+ <field name="TONEMAP_PRESET_CURVE_REC709" since="23"/>
+ <field name="TONEMAP_PRESET_CURVE_SRGB" since="23"/>
+ </class>
+ <class name="android/hardware/camera2/CaptureFailure" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getFrameNumber()J"/>
+ <method name="getReason()I"/>
+ <method name="getRequest()Landroid/hardware/camera2/CaptureRequest;"/>
+ <method name="getSequenceId()I"/>
+ <method name="wasImageCaptured()Z"/>
+ <field name="REASON_ERROR"/>
+ <field name="REASON_FLUSHED"/>
+ </class>
+ <class name="android/hardware/camera2/CaptureRequest" since="21">
+ <extends name="android/hardware/camera2/CameraMetadata"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="get(Landroid/hardware/camera2/CaptureRequest$Key;)Ljava/lang/Object;"/>
+ <method name="getTag()Ljava/lang/Object;"/>
+ <method name="isReprocess()Z" since="23"/>
+ <field name="BLACK_LEVEL_LOCK"/>
+ <field name="COLOR_CORRECTION_ABERRATION_MODE"/>
+ <field name="COLOR_CORRECTION_GAINS"/>
+ <field name="COLOR_CORRECTION_MODE"/>
+ <field name="COLOR_CORRECTION_TRANSFORM"/>
+ <field name="CONTROL_AE_ANTIBANDING_MODE"/>
+ <field name="CONTROL_AE_EXPOSURE_COMPENSATION"/>
+ <field name="CONTROL_AE_LOCK"/>
+ <field name="CONTROL_AE_MODE"/>
+ <field name="CONTROL_AE_PRECAPTURE_TRIGGER"/>
+ <field name="CONTROL_AE_REGIONS"/>
+ <field name="CONTROL_AE_TARGET_FPS_RANGE"/>
+ <field name="CONTROL_AF_MODE"/>
+ <field name="CONTROL_AF_REGIONS"/>
+ <field name="CONTROL_AF_TRIGGER"/>
+ <field name="CONTROL_AWB_LOCK"/>
+ <field name="CONTROL_AWB_MODE"/>
+ <field name="CONTROL_AWB_REGIONS"/>
+ <field name="CONTROL_CAPTURE_INTENT"/>
+ <field name="CONTROL_EFFECT_MODE"/>
+ <field name="CONTROL_ENABLE_ZSL" since="26"/>
+ <field name="CONTROL_MODE"/>
+ <field name="CONTROL_POST_RAW_SENSITIVITY_BOOST" since="24"/>
+ <field name="CONTROL_SCENE_MODE"/>
+ <field name="CONTROL_VIDEO_STABILIZATION_MODE"/>
+ <field name="CREATOR"/>
+ <field name="EDGE_MODE"/>
+ <field name="FLASH_MODE"/>
+ <field name="HOT_PIXEL_MODE"/>
+ <field name="JPEG_GPS_LOCATION"/>
+ <field name="JPEG_ORIENTATION"/>
+ <field name="JPEG_QUALITY"/>
+ <field name="JPEG_THUMBNAIL_QUALITY"/>
+ <field name="JPEG_THUMBNAIL_SIZE"/>
+ <field name="LENS_APERTURE"/>
+ <field name="LENS_FILTER_DENSITY"/>
+ <field name="LENS_FOCAL_LENGTH"/>
+ <field name="LENS_FOCUS_DISTANCE"/>
+ <field name="LENS_OPTICAL_STABILIZATION_MODE"/>
+ <field name="NOISE_REDUCTION_MODE"/>
+ <field name="REPROCESS_EFFECTIVE_EXPOSURE_FACTOR" since="23"/>
+ <field name="SCALER_CROP_REGION"/>
+ <field name="SENSOR_EXPOSURE_TIME"/>
+ <field name="SENSOR_FRAME_DURATION"/>
+ <field name="SENSOR_SENSITIVITY"/>
+ <field name="SENSOR_TEST_PATTERN_DATA"/>
+ <field name="SENSOR_TEST_PATTERN_MODE"/>
+ <field name="SHADING_MODE"/>
+ <field name="STATISTICS_FACE_DETECT_MODE"/>
+ <field name="STATISTICS_HOT_PIXEL_MAP_MODE"/>
+ <field name="STATISTICS_LENS_SHADING_MAP_MODE"/>
+ <field name="TONEMAP_CURVE"/>
+ <field name="TONEMAP_GAMMA" since="23"/>
+ <field name="TONEMAP_MODE"/>
+ <field name="TONEMAP_PRESET_CURVE" since="23"/>
+ </class>
+ <class name="android/hardware/camera2/CaptureRequest$Builder" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addTarget(Landroid/view/Surface;)V"/>
+ <method name="build()Landroid/hardware/camera2/CaptureRequest;"/>
+ <method name="get(Landroid/hardware/camera2/CaptureRequest$Key;)Ljava/lang/Object;"/>
+ <method name="removeTarget(Landroid/view/Surface;)V"/>
+ <method name="set(Landroid/hardware/camera2/CaptureRequest$Key;Ljava/lang/Object;)V"/>
+ <method name="setTag(Ljava/lang/Object;)V"/>
+ </class>
+ <class name="android/hardware/camera2/CaptureRequest$Key" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getName()Ljava/lang/String;"/>
+ </class>
+ <class name="android/hardware/camera2/CaptureResult" since="21">
+ <extends name="android/hardware/camera2/CameraMetadata"/>
+ <method name="&lt;init>()V"/>
+ <method name="get(Landroid/hardware/camera2/CaptureResult$Key;)Ljava/lang/Object;"/>
+ <method name="getFrameNumber()J"/>
+ <method name="getRequest()Landroid/hardware/camera2/CaptureRequest;"/>
+ <method name="getSequenceId()I"/>
+ <field name="BLACK_LEVEL_LOCK"/>
+ <field name="COLOR_CORRECTION_ABERRATION_MODE"/>
+ <field name="COLOR_CORRECTION_GAINS"/>
+ <field name="COLOR_CORRECTION_MODE"/>
+ <field name="COLOR_CORRECTION_TRANSFORM"/>
+ <field name="CONTROL_AE_ANTIBANDING_MODE"/>
+ <field name="CONTROL_AE_EXPOSURE_COMPENSATION"/>
+ <field name="CONTROL_AE_LOCK"/>
+ <field name="CONTROL_AE_MODE"/>
+ <field name="CONTROL_AE_PRECAPTURE_TRIGGER"/>
+ <field name="CONTROL_AE_REGIONS"/>
+ <field name="CONTROL_AE_STATE"/>
+ <field name="CONTROL_AE_TARGET_FPS_RANGE"/>
+ <field name="CONTROL_AF_MODE"/>
+ <field name="CONTROL_AF_REGIONS"/>
+ <field name="CONTROL_AF_STATE"/>
+ <field name="CONTROL_AF_TRIGGER"/>
+ <field name="CONTROL_AWB_LOCK"/>
+ <field name="CONTROL_AWB_MODE"/>
+ <field name="CONTROL_AWB_REGIONS"/>
+ <field name="CONTROL_AWB_STATE"/>
+ <field name="CONTROL_CAPTURE_INTENT"/>
+ <field name="CONTROL_EFFECT_MODE"/>
+ <field name="CONTROL_ENABLE_ZSL" since="26"/>
+ <field name="CONTROL_MODE"/>
+ <field name="CONTROL_POST_RAW_SENSITIVITY_BOOST" since="24"/>
+ <field name="CONTROL_SCENE_MODE"/>
+ <field name="CONTROL_VIDEO_STABILIZATION_MODE"/>
+ <field name="EDGE_MODE"/>
+ <field name="FLASH_MODE"/>
+ <field name="FLASH_STATE"/>
+ <field name="HOT_PIXEL_MODE"/>
+ <field name="JPEG_GPS_LOCATION"/>
+ <field name="JPEG_ORIENTATION"/>
+ <field name="JPEG_QUALITY"/>
+ <field name="JPEG_THUMBNAIL_QUALITY"/>
+ <field name="JPEG_THUMBNAIL_SIZE"/>
+ <field name="LENS_APERTURE"/>
+ <field name="LENS_FILTER_DENSITY"/>
+ <field name="LENS_FOCAL_LENGTH"/>
+ <field name="LENS_FOCUS_DISTANCE"/>
+ <field name="LENS_FOCUS_RANGE"/>
+ <field name="LENS_INTRINSIC_CALIBRATION" since="23"/>
+ <field name="LENS_OPTICAL_STABILIZATION_MODE"/>
+ <field name="LENS_POSE_ROTATION" since="23"/>
+ <field name="LENS_POSE_TRANSLATION" since="23"/>
+ <field name="LENS_RADIAL_DISTORTION" since="23"/>
+ <field name="LENS_STATE"/>
+ <field name="NOISE_REDUCTION_MODE"/>
+ <field name="REPROCESS_EFFECTIVE_EXPOSURE_FACTOR" since="23"/>
+ <field name="REQUEST_PIPELINE_DEPTH"/>
+ <field name="SCALER_CROP_REGION"/>
+ <field name="SENSOR_DYNAMIC_BLACK_LEVEL" since="24"/>
+ <field name="SENSOR_DYNAMIC_WHITE_LEVEL" since="24"/>
+ <field name="SENSOR_EXPOSURE_TIME"/>
+ <field name="SENSOR_FRAME_DURATION"/>
+ <field name="SENSOR_GREEN_SPLIT"/>
+ <field name="SENSOR_NEUTRAL_COLOR_POINT"/>
+ <field name="SENSOR_NOISE_PROFILE"/>
+ <field name="SENSOR_ROLLING_SHUTTER_SKEW"/>
+ <field name="SENSOR_SENSITIVITY"/>
+ <field name="SENSOR_TEST_PATTERN_DATA"/>
+ <field name="SENSOR_TEST_PATTERN_MODE"/>
+ <field name="SENSOR_TIMESTAMP"/>
+ <field name="SHADING_MODE"/>
+ <field name="STATISTICS_FACES"/>
+ <field name="STATISTICS_FACE_DETECT_MODE"/>
+ <field name="STATISTICS_HOT_PIXEL_MAP"/>
+ <field name="STATISTICS_HOT_PIXEL_MAP_MODE"/>
+ <field name="STATISTICS_LENS_SHADING_CORRECTION_MAP"/>
+ <field name="STATISTICS_LENS_SHADING_MAP_MODE"/>
+ <field name="STATISTICS_SCENE_FLICKER"/>
+ <field name="TONEMAP_CURVE"/>
+ <field name="TONEMAP_GAMMA" since="23"/>
+ <field name="TONEMAP_MODE"/>
+ <field name="TONEMAP_PRESET_CURVE" since="23"/>
+ </class>
+ <class name="android/hardware/camera2/CaptureResult$Key" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getName()Ljava/lang/String;"/>
+ </class>
+ <class name="android/hardware/camera2/DngCreator" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable"/>
+ <method name="&lt;init>(Landroid/hardware/camera2/CameraCharacteristics;Landroid/hardware/camera2/CaptureResult;)V"/>
+ <method name="setDescription(Ljava/lang/String;)Landroid/hardware/camera2/DngCreator;"/>
+ <method name="setLocation(Landroid/location/Location;)Landroid/hardware/camera2/DngCreator;"/>
+ <method name="setOrientation(I)Landroid/hardware/camera2/DngCreator;"/>
+ <method name="setThumbnail(Landroid/graphics/Bitmap;)Landroid/hardware/camera2/DngCreator;"/>
+ <method name="setThumbnail(Landroid/media/Image;)Landroid/hardware/camera2/DngCreator;"/>
+ <method name="writeByteBuffer(Ljava/io/OutputStream;Landroid/util/Size;Ljava/nio/ByteBuffer;J)V"/>
+ <method name="writeImage(Ljava/io/OutputStream;Landroid/media/Image;)V"/>
+ <method name="writeInputStream(Ljava/io/OutputStream;Landroid/util/Size;Ljava/io/InputStream;J)V"/>
+ <field name="MAX_THUMBNAIL_DIMENSION"/>
+ </class>
+ <class name="android/hardware/camera2/TotalCaptureResult" since="21">
+ <extends name="android/hardware/camera2/CaptureResult"/>
+ <method name="&lt;init>()V"/>
+ <method name="getPartialResults()Ljava/util/List;"/>
+ </class>
+ <class name="android/hardware/camera2/params/BlackLevelPattern" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="copyTo([II)V"/>
+ <method name="getOffsetForIndex(II)I"/>
+ <field name="COUNT"/>
+ </class>
+ <class name="android/hardware/camera2/params/ColorSpaceTransform" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>([I)V"/>
+ <method name="&lt;init>([Landroid/util/Rational;)V"/>
+ <method name="copyElements([II)V"/>
+ <method name="copyElements([Landroid/util/Rational;I)V"/>
+ <method name="getElement(II)Landroid/util/Rational;"/>
+ </class>
+ <class name="android/hardware/camera2/params/Face" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getBounds()Landroid/graphics/Rect;"/>
+ <method name="getId()I"/>
+ <method name="getLeftEyePosition()Landroid/graphics/Point;"/>
+ <method name="getMouthPosition()Landroid/graphics/Point;"/>
+ <method name="getRightEyePosition()Landroid/graphics/Point;"/>
+ <method name="getScore()I"/>
+ <field name="ID_UNSUPPORTED"/>
+ <field name="SCORE_MAX"/>
+ <field name="SCORE_MIN"/>
+ </class>
+ <class name="android/hardware/camera2/params/InputConfiguration" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(III)V"/>
+ <method name="getFormat()I"/>
+ <method name="getHeight()I"/>
+ <method name="getWidth()I"/>
+ </class>
+ <class name="android/hardware/camera2/params/LensShadingMap" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="copyGainFactors([FI)V"/>
+ <method name="getColumnCount()I"/>
+ <method name="getGainFactor(III)F"/>
+ <method name="getGainFactorCount()I"/>
+ <method name="getGainFactorVector(II)Landroid/hardware/camera2/params/RggbChannelVector;"/>
+ <method name="getRowCount()I"/>
+ <field name="MINIMUM_GAIN_FACTOR"/>
+ </class>
+ <class name="android/hardware/camera2/params/MeteringRectangle" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(IIIII)V"/>
+ <method name="&lt;init>(Landroid/graphics/Point;Landroid/util/Size;I)V"/>
+ <method name="&lt;init>(Landroid/graphics/Rect;I)V"/>
+ <method name="equals(Landroid/hardware/camera2/params/MeteringRectangle;)Z"/>
+ <method name="getHeight()I"/>
+ <method name="getMeteringWeight()I"/>
+ <method name="getRect()Landroid/graphics/Rect;"/>
+ <method name="getSize()Landroid/util/Size;"/>
+ <method name="getUpperLeftPoint()Landroid/graphics/Point;"/>
+ <method name="getWidth()I"/>
+ <method name="getX()I"/>
+ <method name="getY()I"/>
+ <field name="METERING_WEIGHT_DONT_CARE"/>
+ <field name="METERING_WEIGHT_MAX"/>
+ <field name="METERING_WEIGHT_MIN"/>
+ </class>
+ <class name="android/hardware/camera2/params/OutputConfiguration" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(ILandroid/view/Surface;)V"/>
+ <method name="&lt;init>(Landroid/util/Size;Ljava/lang/Class;)V" since="26"/>
+ <method name="&lt;init>(Landroid/view/Surface;)V"/>
+ <method name="addSurface(Landroid/view/Surface;)V" since="26"/>
+ <method name="enableSurfaceSharing()V" since="26"/>
+ <method name="getSurface()Landroid/view/Surface;"/>
+ <method name="getSurfaceGroupId()I"/>
+ <method name="getSurfaces()Ljava/util/List;" since="26"/>
+ <field name="CREATOR"/>
+ <field name="SURFACE_GROUP_ID_NONE"/>
+ </class>
+ <class name="android/hardware/camera2/params/RggbChannelVector" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(FFFF)V"/>
+ <method name="copyTo([FI)V"/>
+ <method name="getBlue()F"/>
+ <method name="getComponent(I)F"/>
+ <method name="getGreenEven()F"/>
+ <method name="getGreenOdd()F"/>
+ <method name="getRed()F"/>
+ <field name="BLUE"/>
+ <field name="COUNT"/>
+ <field name="GREEN_EVEN"/>
+ <field name="GREEN_ODD"/>
+ <field name="RED"/>
+ </class>
+ <class name="android/hardware/camera2/params/StreamConfigurationMap" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getHighResolutionOutputSizes(I)[Landroid/util/Size;" since="23"/>
+ <method name="getHighSpeedVideoFpsRanges()[Landroid/util/Range;"/>
+ <method name="getHighSpeedVideoFpsRangesFor(Landroid/util/Size;)[Landroid/util/Range;"/>
+ <method name="getHighSpeedVideoSizes()[Landroid/util/Size;"/>
+ <method name="getHighSpeedVideoSizesFor(Landroid/util/Range;)[Landroid/util/Size;"/>
+ <method name="getInputFormats()[I" since="23"/>
+ <method name="getInputSizes(I)[Landroid/util/Size;" since="23"/>
+ <method name="getOutputFormats()[I"/>
+ <method name="getOutputMinFrameDuration(ILandroid/util/Size;)J"/>
+ <method name="getOutputMinFrameDuration(Ljava/lang/Class;Landroid/util/Size;)J"/>
+ <method name="getOutputSizes(I)[Landroid/util/Size;"/>
+ <method name="getOutputSizes(Ljava/lang/Class;)[Landroid/util/Size;"/>
+ <method name="getOutputStallDuration(ILandroid/util/Size;)J"/>
+ <method name="getOutputStallDuration(Ljava/lang/Class;Landroid/util/Size;)J"/>
+ <method name="getValidOutputFormatsForInput(I)[I" since="23"/>
+ <method name="isOutputSupportedFor(I)Z"/>
+ <method name="isOutputSupportedFor(Landroid/view/Surface;)Z"/>
+ <method name="isOutputSupportedFor(Ljava/lang/Class;)Z"/>
+ </class>
+ <class name="android/hardware/camera2/params/TonemapCurve" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>([F[F[F)V"/>
+ <method name="copyColorCurve(I[FI)V"/>
+ <method name="getPoint(II)Landroid/graphics/PointF;"/>
+ <method name="getPointCount(I)I"/>
+ <field name="CHANNEL_BLUE"/>
+ <field name="CHANNEL_GREEN"/>
+ <field name="CHANNEL_RED"/>
+ <field name="LEVEL_BLACK"/>
+ <field name="LEVEL_WHITE"/>
+ <field name="POINT_SIZE"/>
+ </class>
+ <class name="android/hardware/display/DisplayManager" since="17">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="createVirtualDisplay(Ljava/lang/String;IIILandroid/view/Surface;I)Landroid/hardware/display/VirtualDisplay;" since="19"/>
+ <method name="createVirtualDisplay(Ljava/lang/String;IIILandroid/view/Surface;ILandroid/hardware/display/VirtualDisplay$Callback;Landroid/os/Handler;)Landroid/hardware/display/VirtualDisplay;" since="21"/>
+ <method name="getDisplay(I)Landroid/view/Display;"/>
+ <method name="getDisplays()[Landroid/view/Display;"/>
+ <method name="getDisplays(Ljava/lang/String;)[Landroid/view/Display;"/>
+ <method name="registerDisplayListener(Landroid/hardware/display/DisplayManager$DisplayListener;Landroid/os/Handler;)V"/>
+ <method name="unregisterDisplayListener(Landroid/hardware/display/DisplayManager$DisplayListener;)V"/>
+ <field name="DISPLAY_CATEGORY_PRESENTATION"/>
+ <field name="VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR" since="21"/>
+ <field name="VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY" since="20"/>
+ <field name="VIRTUAL_DISPLAY_FLAG_PRESENTATION" since="19"/>
+ <field name="VIRTUAL_DISPLAY_FLAG_PUBLIC" since="19"/>
+ <field name="VIRTUAL_DISPLAY_FLAG_SECURE" since="19"/>
+ </class>
+ <class name="android/hardware/display/DisplayManager$DisplayListener" since="17">
+ <extends name="java/lang/Object"/>
+ <method name="onDisplayAdded(I)V"/>
+ <method name="onDisplayChanged(I)V"/>
+ <method name="onDisplayRemoved(I)V"/>
+ </class>
+ <class name="android/hardware/display/VirtualDisplay" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDisplay()Landroid/view/Display;"/>
+ <method name="getSurface()Landroid/view/Surface;" since="20"/>
+ <method name="release()V"/>
+ <method name="resize(III)V" since="21"/>
+ <method name="setSurface(Landroid/view/Surface;)V" since="20"/>
+ </class>
+ <class name="android/hardware/display/VirtualDisplay$Callback" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onPaused()V"/>
+ <method name="onResumed()V"/>
+ <method name="onStopped()V"/>
+ </class>
+ <class name="android/hardware/fingerprint/FingerprintManager" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="authenticate(Landroid/hardware/fingerprint/FingerprintManager$CryptoObject;Landroid/os/CancellationSignal;ILandroid/hardware/fingerprint/FingerprintManager$AuthenticationCallback;Landroid/os/Handler;)V"/>
+ <method name="hasEnrolledFingerprints()Z"/>
+ <method name="isHardwareDetected()Z"/>
+ <field name="FINGERPRINT_ACQUIRED_GOOD"/>
+ <field name="FINGERPRINT_ACQUIRED_IMAGER_DIRTY"/>
+ <field name="FINGERPRINT_ACQUIRED_INSUFFICIENT"/>
+ <field name="FINGERPRINT_ACQUIRED_PARTIAL"/>
+ <field name="FINGERPRINT_ACQUIRED_TOO_FAST"/>
+ <field name="FINGERPRINT_ACQUIRED_TOO_SLOW"/>
+ <field name="FINGERPRINT_ERROR_CANCELED"/>
+ <field name="FINGERPRINT_ERROR_HW_UNAVAILABLE"/>
+ <field name="FINGERPRINT_ERROR_LOCKOUT"/>
+ <field name="FINGERPRINT_ERROR_NO_SPACE"/>
+ <field name="FINGERPRINT_ERROR_TIMEOUT"/>
+ <field name="FINGERPRINT_ERROR_UNABLE_TO_PROCESS"/>
+ </class>
+ <class name="android/hardware/fingerprint/FingerprintManager$AuthenticationCallback" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onAuthenticationError(ILjava/lang/CharSequence;)V"/>
+ <method name="onAuthenticationFailed()V"/>
+ <method name="onAuthenticationHelp(ILjava/lang/CharSequence;)V"/>
+ <method name="onAuthenticationSucceeded(Landroid/hardware/fingerprint/FingerprintManager$AuthenticationResult;)V"/>
+ </class>
+ <class name="android/hardware/fingerprint/FingerprintManager$AuthenticationResult" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCryptoObject()Landroid/hardware/fingerprint/FingerprintManager$CryptoObject;"/>
+ </class>
+ <class name="android/hardware/fingerprint/FingerprintManager$CryptoObject" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/security/Signature;)V"/>
+ <method name="&lt;init>(Ljavax/crypto/Cipher;)V"/>
+ <method name="&lt;init>(Ljavax/crypto/Mac;)V"/>
+ <method name="getCipher()Ljavax/crypto/Cipher;"/>
+ <method name="getMac()Ljavax/crypto/Mac;"/>
+ <method name="getSignature()Ljava/security/Signature;"/>
+ </class>
+ <class name="android/hardware/input/InputManager" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getInputDevice(I)Landroid/view/InputDevice;"/>
+ <method name="getInputDeviceIds()[I"/>
+ <method name="registerInputDeviceListener(Landroid/hardware/input/InputManager$InputDeviceListener;Landroid/os/Handler;)V"/>
+ <method name="unregisterInputDeviceListener(Landroid/hardware/input/InputManager$InputDeviceListener;)V"/>
+ <field name="ACTION_QUERY_KEYBOARD_LAYOUTS"/>
+ <field name="META_DATA_KEYBOARD_LAYOUTS"/>
+ </class>
+ <class name="android/hardware/input/InputManager$InputDeviceListener" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="onInputDeviceAdded(I)V"/>
+ <method name="onInputDeviceChanged(I)V"/>
+ <method name="onInputDeviceRemoved(I)V"/>
+ </class>
+ <class name="android/hardware/location/GeofenceHardware" since="18" removed="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addGeofence(IILandroid/hardware/location/GeofenceHardwareRequest;Landroid/hardware/location/GeofenceHardwareCallback;)Z"/>
+ <method name="getMonitoringTypes()[I"/>
+ <method name="getStatusOfMonitoringType(I)I"/>
+ <method name="pauseGeofence(II)Z"/>
+ <method name="registerForMonitorStateChangeCallback(ILandroid/hardware/location/GeofenceHardwareMonitorCallback;)Z"/>
+ <method name="removeGeofence(II)Z"/>
+ <method name="resumeGeofence(III)Z"/>
+ <method name="unregisterForMonitorStateChangeCallback(ILandroid/hardware/location/GeofenceHardwareMonitorCallback;)Z"/>
+ <field name="GEOFENCE_ENTERED"/>
+ <field name="GEOFENCE_ERROR_ID_EXISTS"/>
+ <field name="GEOFENCE_ERROR_ID_UNKNOWN"/>
+ <field name="GEOFENCE_ERROR_INVALID_TRANSITION"/>
+ <field name="GEOFENCE_ERROR_TOO_MANY_GEOFENCES"/>
+ <field name="GEOFENCE_EXITED"/>
+ <field name="GEOFENCE_FAILURE"/>
+ <field name="GEOFENCE_SUCCESS"/>
+ <field name="GEOFENCE_UNCERTAIN"/>
+ <field name="MONITORING_TYPE_GPS_HARDWARE"/>
+ <field name="MONITOR_CURRENTLY_AVAILABLE"/>
+ <field name="MONITOR_CURRENTLY_UNAVAILABLE"/>
+ <field name="MONITOR_UNSUPPORTED"/>
+ </class>
+ <class name="android/hardware/location/GeofenceHardwareCallback" since="18" removed="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onGeofenceAdd(II)V"/>
+ <method name="onGeofencePause(II)V"/>
+ <method name="onGeofenceRemove(II)V"/>
+ <method name="onGeofenceResume(II)V"/>
+ <method name="onGeofenceTransition(IILandroid/location/Location;JI)V"/>
+ </class>
+ <class name="android/hardware/location/GeofenceHardwareMonitorCallback" since="18" removed="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onMonitoringSystemChange(IZLandroid/location/Location;)V"/>
+ </class>
+ <class name="android/hardware/location/GeofenceHardwareRequest" since="18" removed="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="createCircularGeofence(DDD)Landroid/hardware/location/GeofenceHardwareRequest;"/>
+ <method name="getLastTransition()I"/>
+ <method name="getLatitude()D"/>
+ <method name="getLongitude()D"/>
+ <method name="getMonitorTransitions()I"/>
+ <method name="getNotificationResponsiveness()I"/>
+ <method name="getRadius()D"/>
+ <method name="getUnknownTimer()I"/>
+ <method name="setLastTransition(I)V"/>
+ <method name="setMonitorTransitions(I)V"/>
+ <method name="setNotificationResponsiveness(I)V"/>
+ <method name="setUnknownTimer(I)V"/>
+ </class>
+ <class name="android/hardware/usb/UsbAccessory" since="12">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDescription()Ljava/lang/String;"/>
+ <method name="getManufacturer()Ljava/lang/String;"/>
+ <method name="getModel()Ljava/lang/String;"/>
+ <method name="getSerial()Ljava/lang/String;"/>
+ <method name="getUri()Ljava/lang/String;"/>
+ <method name="getVersion()Ljava/lang/String;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/hardware/usb/UsbConfiguration" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getId()I"/>
+ <method name="getInterface(I)Landroid/hardware/usb/UsbInterface;"/>
+ <method name="getInterfaceCount()I"/>
+ <method name="getMaxPower()I"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="isRemoteWakeup()Z"/>
+ <method name="isSelfPowered()Z"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/hardware/usb/UsbConstants" since="12">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="USB_CLASS_APP_SPEC"/>
+ <field name="USB_CLASS_AUDIO"/>
+ <field name="USB_CLASS_CDC_DATA"/>
+ <field name="USB_CLASS_COMM"/>
+ <field name="USB_CLASS_CONTENT_SEC"/>
+ <field name="USB_CLASS_CSCID"/>
+ <field name="USB_CLASS_HID"/>
+ <field name="USB_CLASS_HUB"/>
+ <field name="USB_CLASS_MASS_STORAGE"/>
+ <field name="USB_CLASS_MISC"/>
+ <field name="USB_CLASS_PER_INTERFACE"/>
+ <field name="USB_CLASS_PHYSICA"/>
+ <field name="USB_CLASS_PRINTER"/>
+ <field name="USB_CLASS_STILL_IMAGE"/>
+ <field name="USB_CLASS_VENDOR_SPEC"/>
+ <field name="USB_CLASS_VIDEO"/>
+ <field name="USB_CLASS_WIRELESS_CONTROLLER"/>
+ <field name="USB_DIR_IN"/>
+ <field name="USB_DIR_OUT"/>
+ <field name="USB_ENDPOINT_DIR_MASK"/>
+ <field name="USB_ENDPOINT_NUMBER_MASK"/>
+ <field name="USB_ENDPOINT_XFERTYPE_MASK"/>
+ <field name="USB_ENDPOINT_XFER_BULK"/>
+ <field name="USB_ENDPOINT_XFER_CONTROL"/>
+ <field name="USB_ENDPOINT_XFER_INT"/>
+ <field name="USB_ENDPOINT_XFER_ISOC"/>
+ <field name="USB_INTERFACE_SUBCLASS_BOOT"/>
+ <field name="USB_SUBCLASS_VENDOR_SPEC"/>
+ <field name="USB_TYPE_CLASS"/>
+ <field name="USB_TYPE_MASK"/>
+ <field name="USB_TYPE_RESERVED"/>
+ <field name="USB_TYPE_STANDARD"/>
+ <field name="USB_TYPE_VENDOR"/>
+ </class>
+ <class name="android/hardware/usb/UsbDevice" since="12">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getConfiguration(I)Landroid/hardware/usb/UsbConfiguration;" since="21"/>
+ <method name="getConfigurationCount()I" since="21"/>
+ <method name="getDeviceClass()I"/>
+ <method name="getDeviceId()I"/>
+ <method name="getDeviceId(Ljava/lang/String;)I"/>
+ <method name="getDeviceName()Ljava/lang/String;"/>
+ <method name="getDeviceName(I)Ljava/lang/String;"/>
+ <method name="getDeviceProtocol()I"/>
+ <method name="getDeviceSubclass()I"/>
+ <method name="getInterface(I)Landroid/hardware/usb/UsbInterface;"/>
+ <method name="getInterfaceCount()I"/>
+ <method name="getManufacturerName()Ljava/lang/String;" since="21"/>
+ <method name="getProductId()I"/>
+ <method name="getProductName()Ljava/lang/String;" since="21"/>
+ <method name="getSerialNumber()Ljava/lang/String;" since="21"/>
+ <method name="getVendorId()I"/>
+ <method name="getVersion()Ljava/lang/String;" since="23"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/hardware/usb/UsbDeviceConnection" since="12">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="bulkTransfer(Landroid/hardware/usb/UsbEndpoint;[BII)I"/>
+ <method name="bulkTransfer(Landroid/hardware/usb/UsbEndpoint;[BIII)I" since="18"/>
+ <method name="claimInterface(Landroid/hardware/usb/UsbInterface;Z)Z"/>
+ <method name="close()V"/>
+ <method name="controlTransfer(IIII[BII)I"/>
+ <method name="controlTransfer(IIII[BIII)I" since="18"/>
+ <method name="getFileDescriptor()I"/>
+ <method name="getRawDescriptors()[B" since="13"/>
+ <method name="getSerial()Ljava/lang/String;"/>
+ <method name="releaseInterface(Landroid/hardware/usb/UsbInterface;)Z"/>
+ <method name="requestWait()Landroid/hardware/usb/UsbRequest;"/>
+ <method name="requestWait(J)Landroid/hardware/usb/UsbRequest;" since="26"/>
+ <method name="setConfiguration(Landroid/hardware/usb/UsbConfiguration;)Z" since="21"/>
+ <method name="setInterface(Landroid/hardware/usb/UsbInterface;)Z" since="21"/>
+ </class>
+ <class name="android/hardware/usb/UsbEndpoint" since="12">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAddress()I"/>
+ <method name="getAttributes()I"/>
+ <method name="getDirection()I"/>
+ <method name="getEndpointNumber()I"/>
+ <method name="getInterval()I"/>
+ <method name="getMaxPacketSize()I"/>
+ <method name="getType()I"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/hardware/usb/UsbInterface" since="12">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAlternateSetting()I" since="21"/>
+ <method name="getEndpoint(I)Landroid/hardware/usb/UsbEndpoint;"/>
+ <method name="getEndpointCount()I"/>
+ <method name="getId()I"/>
+ <method name="getInterfaceClass()I"/>
+ <method name="getInterfaceProtocol()I"/>
+ <method name="getInterfaceSubclass()I"/>
+ <method name="getName()Ljava/lang/String;" since="21"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/hardware/usb/UsbManager" since="12">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAccessoryList()[Landroid/hardware/usb/UsbAccessory;"/>
+ <method name="getDeviceList()Ljava/util/HashMap;"/>
+ <method name="hasPermission(Landroid/hardware/usb/UsbAccessory;)Z"/>
+ <method name="hasPermission(Landroid/hardware/usb/UsbDevice;)Z"/>
+ <method name="openAccessory(Landroid/hardware/usb/UsbAccessory;)Landroid/os/ParcelFileDescriptor;"/>
+ <method name="openDevice(Landroid/hardware/usb/UsbDevice;)Landroid/hardware/usb/UsbDeviceConnection;"/>
+ <method name="requestPermission(Landroid/hardware/usb/UsbAccessory;Landroid/app/PendingIntent;)V"/>
+ <method name="requestPermission(Landroid/hardware/usb/UsbDevice;Landroid/app/PendingIntent;)V"/>
+ <field name="ACTION_USB_ACCESSORY_ATTACHED"/>
+ <field name="ACTION_USB_ACCESSORY_DETACHED"/>
+ <field name="ACTION_USB_DEVICE_ATTACHED"/>
+ <field name="ACTION_USB_DEVICE_DETACHED"/>
+ <field name="EXTRA_ACCESSORY"/>
+ <field name="EXTRA_DEVICE"/>
+ <field name="EXTRA_PERMISSION_GRANTED"/>
+ </class>
+ <class name="android/hardware/usb/UsbRequest" since="12">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="cancel()Z"/>
+ <method name="close()V"/>
+ <method name="getClientData()Ljava/lang/Object;"/>
+ <method name="getEndpoint()Landroid/hardware/usb/UsbEndpoint;"/>
+ <method name="initialize(Landroid/hardware/usb/UsbDeviceConnection;Landroid/hardware/usb/UsbEndpoint;)Z"/>
+ <method name="queue(Ljava/nio/ByteBuffer;)Z" since="26"/>
+ <method name="queue(Ljava/nio/ByteBuffer;I)Z" deprecated="26"/>
+ <method name="setClientData(Ljava/lang/Object;)V"/>
+ </class>
+ <class name="android/icu/lang/UCharacter" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/icu/lang/UCharacterEnums$ECharacterCategory"/>
+ <implements name="android/icu/lang/UCharacterEnums$ECharacterDirection"/>
+ <method name="&lt;init>()V"/>
+ <method name="charCount(I)I"/>
+ <method name="codePointAt(Ljava/lang/CharSequence;I)I"/>
+ <method name="codePointAt([CI)I"/>
+ <method name="codePointAt([CII)I"/>
+ <method name="codePointBefore(Ljava/lang/CharSequence;I)I"/>
+ <method name="codePointBefore([CI)I"/>
+ <method name="codePointBefore([CII)I"/>
+ <method name="codePointCount(Ljava/lang/CharSequence;II)I"/>
+ <method name="codePointCount([CII)I"/>
+ <method name="digit(I)I"/>
+ <method name="digit(II)I"/>
+ <method name="foldCase(II)I"/>
+ <method name="foldCase(IZ)I"/>
+ <method name="foldCase(Ljava/lang/String;I)Ljava/lang/String;"/>
+ <method name="foldCase(Ljava/lang/String;Z)Ljava/lang/String;"/>
+ <method name="forDigit(II)C"/>
+ <method name="getAge(I)Landroid/icu/util/VersionInfo;"/>
+ <method name="getBidiPairedBracket(I)I"/>
+ <method name="getCharFromExtendedName(Ljava/lang/String;)I"/>
+ <method name="getCharFromName(Ljava/lang/String;)I"/>
+ <method name="getCharFromNameAlias(Ljava/lang/String;)I"/>
+ <method name="getCodePoint(C)I"/>
+ <method name="getCodePoint(CC)I"/>
+ <method name="getCombiningClass(I)I"/>
+ <method name="getDirection(I)I"/>
+ <method name="getDirectionality(I)B"/>
+ <method name="getExtendedName(I)Ljava/lang/String;"/>
+ <method name="getExtendedNameIterator()Landroid/icu/util/ValueIterator;"/>
+ <method name="getHanNumericValue(I)I"/>
+ <method name="getIntPropertyMaxValue(I)I"/>
+ <method name="getIntPropertyMinValue(I)I"/>
+ <method name="getIntPropertyValue(II)I"/>
+ <method name="getMirror(I)I"/>
+ <method name="getName(I)Ljava/lang/String;"/>
+ <method name="getName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getNameAlias(I)Ljava/lang/String;"/>
+ <method name="getNameIterator()Landroid/icu/util/ValueIterator;"/>
+ <method name="getNumericValue(I)I"/>
+ <method name="getPropertyEnum(Ljava/lang/CharSequence;)I"/>
+ <method name="getPropertyName(II)Ljava/lang/String;"/>
+ <method name="getPropertyValueEnum(ILjava/lang/CharSequence;)I"/>
+ <method name="getPropertyValueName(III)Ljava/lang/String;"/>
+ <method name="getType(I)I"/>
+ <method name="getTypeIterator()Landroid/icu/util/RangeValueIterator;"/>
+ <method name="getUnicodeNumericValue(I)D"/>
+ <method name="getUnicodeVersion()Landroid/icu/util/VersionInfo;"/>
+ <method name="hasBinaryProperty(II)Z"/>
+ <method name="isBMP(I)Z"/>
+ <method name="isBaseForm(I)Z"/>
+ <method name="isDefined(I)Z"/>
+ <method name="isDigit(I)Z"/>
+ <method name="isHighSurrogate(C)Z"/>
+ <method name="isISOControl(I)Z"/>
+ <method name="isIdentifierIgnorable(I)Z"/>
+ <method name="isJavaIdentifierPart(I)Z"/>
+ <method name="isJavaIdentifierStart(I)Z"/>
+ <method name="isLegal(I)Z"/>
+ <method name="isLegal(Ljava/lang/String;)Z"/>
+ <method name="isLetter(I)Z"/>
+ <method name="isLetterOrDigit(I)Z"/>
+ <method name="isLowSurrogate(C)Z"/>
+ <method name="isLowerCase(I)Z"/>
+ <method name="isMirrored(I)Z"/>
+ <method name="isPrintable(I)Z"/>
+ <method name="isSpaceChar(I)Z"/>
+ <method name="isSupplementary(I)Z"/>
+ <method name="isSupplementaryCodePoint(I)Z"/>
+ <method name="isSurrogatePair(CC)Z"/>
+ <method name="isTitleCase(I)Z"/>
+ <method name="isUAlphabetic(I)Z"/>
+ <method name="isULowercase(I)Z"/>
+ <method name="isUUppercase(I)Z"/>
+ <method name="isUWhiteSpace(I)Z"/>
+ <method name="isUnicodeIdentifierPart(I)Z"/>
+ <method name="isUnicodeIdentifierStart(I)Z"/>
+ <method name="isUpperCase(I)Z"/>
+ <method name="isValidCodePoint(I)Z"/>
+ <method name="isWhitespace(I)Z"/>
+ <method name="offsetByCodePoints(Ljava/lang/CharSequence;II)I"/>
+ <method name="offsetByCodePoints([CIIII)I"/>
+ <method name="toChars(I)[C"/>
+ <method name="toChars(I[CI)I"/>
+ <method name="toCodePoint(CC)I"/>
+ <method name="toLowerCase(I)I"/>
+ <method name="toLowerCase(Landroid/icu/util/ULocale;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="toLowerCase(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="toLowerCase(Ljava/util/Locale;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="toString(I)Ljava/lang/String;"/>
+ <method name="toTitleCase(I)I"/>
+ <method name="toTitleCase(Landroid/icu/util/ULocale;Ljava/lang/String;Landroid/icu/text/BreakIterator;)Ljava/lang/String;"/>
+ <method name="toTitleCase(Landroid/icu/util/ULocale;Ljava/lang/String;Landroid/icu/text/BreakIterator;I)Ljava/lang/String;"/>
+ <method name="toTitleCase(Ljava/lang/String;Landroid/icu/text/BreakIterator;)Ljava/lang/String;"/>
+ <method name="toTitleCase(Ljava/util/Locale;Ljava/lang/String;Landroid/icu/text/BreakIterator;)Ljava/lang/String;"/>
+ <method name="toTitleCase(Ljava/util/Locale;Ljava/lang/String;Landroid/icu/text/BreakIterator;I)Ljava/lang/String;"/>
+ <method name="toUpperCase(I)I"/>
+ <method name="toUpperCase(Landroid/icu/util/ULocale;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="toUpperCase(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="toUpperCase(Ljava/util/Locale;Ljava/lang/String;)Ljava/lang/String;"/>
+ <field name="FOLD_CASE_DEFAULT"/>
+ <field name="FOLD_CASE_EXCLUDE_SPECIAL_I"/>
+ <field name="MAX_CODE_POINT"/>
+ <field name="MAX_HIGH_SURROGATE"/>
+ <field name="MAX_LOW_SURROGATE"/>
+ <field name="MAX_RADIX"/>
+ <field name="MAX_SURROGATE"/>
+ <field name="MAX_VALUE"/>
+ <field name="MIN_CODE_POINT"/>
+ <field name="MIN_HIGH_SURROGATE"/>
+ <field name="MIN_LOW_SURROGATE"/>
+ <field name="MIN_RADIX"/>
+ <field name="MIN_SUPPLEMENTARY_CODE_POINT"/>
+ <field name="MIN_SURROGATE"/>
+ <field name="MIN_VALUE"/>
+ <field name="NO_NUMERIC_VALUE"/>
+ <field name="REPLACEMENT_CHAR"/>
+ <field name="SUPPLEMENTARY_MIN_VALUE"/>
+ <field name="TITLECASE_NO_BREAK_ADJUSTMENT"/>
+ <field name="TITLECASE_NO_LOWERCASE"/>
+ </class>
+ <class name="android/icu/lang/UCharacter$BidiPairedBracketType" since="24">
+ <extends name="java/lang/Object"/>
+ <field name="CLOSE"/>
+ <field name="NONE"/>
+ <field name="OPEN"/>
+ </class>
+ <class name="android/icu/lang/UCharacter$DecompositionType" since="24">
+ <extends name="java/lang/Object"/>
+ <field name="CANONICAL"/>
+ <field name="CIRCLE"/>
+ <field name="COMPAT"/>
+ <field name="FINAL"/>
+ <field name="FONT"/>
+ <field name="FRACTION"/>
+ <field name="INITIAL"/>
+ <field name="ISOLATED"/>
+ <field name="MEDIAL"/>
+ <field name="NARROW"/>
+ <field name="NOBREAK"/>
+ <field name="NONE"/>
+ <field name="SMALL"/>
+ <field name="SQUARE"/>
+ <field name="SUB"/>
+ <field name="SUPER"/>
+ <field name="VERTICAL"/>
+ <field name="WIDE"/>
+ </class>
+ <class name="android/icu/lang/UCharacter$EastAsianWidth" since="24">
+ <extends name="java/lang/Object"/>
+ <field name="AMBIGUOUS"/>
+ <field name="FULLWIDTH"/>
+ <field name="HALFWIDTH"/>
+ <field name="NARROW"/>
+ <field name="NEUTRAL"/>
+ <field name="WIDE"/>
+ </class>
+ <class name="android/icu/lang/UCharacter$GraphemeClusterBreak" since="24">
+ <extends name="java/lang/Object"/>
+ <field name="CONTROL"/>
+ <field name="CR"/>
+ <field name="EXTEND"/>
+ <field name="E_BASE" since="26"/>
+ <field name="E_BASE_GAZ" since="26"/>
+ <field name="E_MODIFIER" since="26"/>
+ <field name="GLUE_AFTER_ZWJ" since="26"/>
+ <field name="L"/>
+ <field name="LF"/>
+ <field name="LV"/>
+ <field name="LVT"/>
+ <field name="OTHER"/>
+ <field name="PREPEND"/>
+ <field name="REGIONAL_INDICATOR"/>
+ <field name="SPACING_MARK"/>
+ <field name="T"/>
+ <field name="V"/>
+ <field name="ZWJ" since="26"/>
+ </class>
+ <class name="android/icu/lang/UCharacter$HangulSyllableType" since="24">
+ <extends name="java/lang/Object"/>
+ <field name="LEADING_JAMO"/>
+ <field name="LVT_SYLLABLE"/>
+ <field name="LV_SYLLABLE"/>
+ <field name="NOT_APPLICABLE"/>
+ <field name="TRAILING_JAMO"/>
+ <field name="VOWEL_JAMO"/>
+ </class>
+ <class name="android/icu/lang/UCharacter$JoiningGroup" since="24">
+ <extends name="java/lang/Object"/>
+ <field name="AFRICAN_FEH" since="26"/>
+ <field name="AFRICAN_NOON" since="26"/>
+ <field name="AFRICAN_QAF" since="26"/>
+ <field name="AIN"/>
+ <field name="ALAPH"/>
+ <field name="ALEF"/>
+ <field name="BEH"/>
+ <field name="BETH"/>
+ <field name="BURUSHASKI_YEH_BARREE"/>
+ <field name="DAL"/>
+ <field name="DALATH_RISH"/>
+ <field name="E"/>
+ <field name="FARSI_YEH"/>
+ <field name="FE"/>
+ <field name="FEH"/>
+ <field name="FINAL_SEMKATH"/>
+ <field name="GAF"/>
+ <field name="GAMAL"/>
+ <field name="HAH"/>
+ <field name="HAMZA_ON_HEH_GOAL"/>
+ <field name="HE"/>
+ <field name="HEH"/>
+ <field name="HEH_GOAL"/>
+ <field name="HETH"/>
+ <field name="KAF"/>
+ <field name="KAPH"/>
+ <field name="KHAPH"/>
+ <field name="KNOTTED_HEH"/>
+ <field name="LAM"/>
+ <field name="LAMADH"/>
+ <field name="MANICHAEAN_ALEPH"/>
+ <field name="MANICHAEAN_AYIN"/>
+ <field name="MANICHAEAN_BETH"/>
+ <field name="MANICHAEAN_DALETH"/>
+ <field name="MANICHAEAN_DHAMEDH"/>
+ <field name="MANICHAEAN_FIVE"/>
+ <field name="MANICHAEAN_GIMEL"/>
+ <field name="MANICHAEAN_HETH"/>
+ <field name="MANICHAEAN_HUNDRED"/>
+ <field name="MANICHAEAN_KAPH"/>
+ <field name="MANICHAEAN_LAMEDH"/>
+ <field name="MANICHAEAN_MEM"/>
+ <field name="MANICHAEAN_NUN"/>
+ <field name="MANICHAEAN_ONE"/>
+ <field name="MANICHAEAN_PE"/>
+ <field name="MANICHAEAN_QOPH"/>
+ <field name="MANICHAEAN_RESH"/>
+ <field name="MANICHAEAN_SADHE"/>
+ <field name="MANICHAEAN_SAMEKH"/>
+ <field name="MANICHAEAN_TAW"/>
+ <field name="MANICHAEAN_TEN"/>
+ <field name="MANICHAEAN_TETH"/>
+ <field name="MANICHAEAN_THAMEDH"/>
+ <field name="MANICHAEAN_TWENTY"/>
+ <field name="MANICHAEAN_WAW"/>
+ <field name="MANICHAEAN_YODH"/>
+ <field name="MANICHAEAN_ZAYIN"/>
+ <field name="MEEM"/>
+ <field name="MIM"/>
+ <field name="NOON"/>
+ <field name="NO_JOINING_GROUP"/>
+ <field name="NUN"/>
+ <field name="NYA"/>
+ <field name="PE"/>
+ <field name="QAF"/>
+ <field name="QAPH"/>
+ <field name="REH"/>
+ <field name="REVERSED_PE"/>
+ <field name="ROHINGYA_YEH"/>
+ <field name="SAD"/>
+ <field name="SADHE"/>
+ <field name="SEEN"/>
+ <field name="SEMKATH"/>
+ <field name="SHIN"/>
+ <field name="STRAIGHT_WAW"/>
+ <field name="SWASH_KAF"/>
+ <field name="SYRIAC_WAW"/>
+ <field name="TAH"/>
+ <field name="TAW"/>
+ <field name="TEH_MARBUTA"/>
+ <field name="TEH_MARBUTA_GOAL"/>
+ <field name="TETH"/>
+ <field name="WAW"/>
+ <field name="YEH"/>
+ <field name="YEH_BARREE"/>
+ <field name="YEH_WITH_TAIL"/>
+ <field name="YUDH"/>
+ <field name="YUDH_HE"/>
+ <field name="ZAIN"/>
+ <field name="ZHAIN"/>
+ </class>
+ <class name="android/icu/lang/UCharacter$JoiningType" since="24">
+ <extends name="java/lang/Object"/>
+ <field name="DUAL_JOINING"/>
+ <field name="JOIN_CAUSING"/>
+ <field name="LEFT_JOINING"/>
+ <field name="NON_JOINING"/>
+ <field name="RIGHT_JOINING"/>
+ <field name="TRANSPARENT"/>
+ </class>
+ <class name="android/icu/lang/UCharacter$LineBreak" since="24">
+ <extends name="java/lang/Object"/>
+ <field name="ALPHABETIC"/>
+ <field name="AMBIGUOUS"/>
+ <field name="BREAK_AFTER"/>
+ <field name="BREAK_BEFORE"/>
+ <field name="BREAK_BOTH"/>
+ <field name="BREAK_SYMBOLS"/>
+ <field name="CARRIAGE_RETURN"/>
+ <field name="CLOSE_PARENTHESIS"/>
+ <field name="CLOSE_PUNCTUATION"/>
+ <field name="COMBINING_MARK"/>
+ <field name="COMPLEX_CONTEXT"/>
+ <field name="CONDITIONAL_JAPANESE_STARTER"/>
+ <field name="CONTINGENT_BREAK"/>
+ <field name="EXCLAMATION"/>
+ <field name="E_BASE" since="26"/>
+ <field name="E_MODIFIER" since="26"/>
+ <field name="GLUE"/>
+ <field name="H2"/>
+ <field name="H3"/>
+ <field name="HEBREW_LETTER"/>
+ <field name="HYPHEN"/>
+ <field name="IDEOGRAPHIC"/>
+ <field name="INFIX_NUMERIC"/>
+ <field name="INSEPARABLE"/>
+ <field name="INSEPERABLE"/>
+ <field name="JL"/>
+ <field name="JT"/>
+ <field name="JV"/>
+ <field name="LINE_FEED"/>
+ <field name="MANDATORY_BREAK"/>
+ <field name="NEXT_LINE"/>
+ <field name="NONSTARTER"/>
+ <field name="NUMERIC"/>
+ <field name="OPEN_PUNCTUATION"/>
+ <field name="POSTFIX_NUMERIC"/>
+ <field name="PREFIX_NUMERIC"/>
+ <field name="QUOTATION"/>
+ <field name="REGIONAL_INDICATOR"/>
+ <field name="SPACE"/>
+ <field name="SURROGATE"/>
+ <field name="UNKNOWN"/>
+ <field name="WORD_JOINER"/>
+ <field name="ZWJ" since="26"/>
+ <field name="ZWSPACE"/>
+ </class>
+ <class name="android/icu/lang/UCharacter$NumericType" since="24">
+ <extends name="java/lang/Object"/>
+ <field name="DECIMAL"/>
+ <field name="DIGIT"/>
+ <field name="NONE"/>
+ <field name="NUMERIC"/>
+ </class>
+ <class name="android/icu/lang/UCharacter$SentenceBreak" since="24">
+ <extends name="java/lang/Object"/>
+ <field name="ATERM"/>
+ <field name="CLOSE"/>
+ <field name="CR"/>
+ <field name="EXTEND"/>
+ <field name="FORMAT"/>
+ <field name="LF"/>
+ <field name="LOWER"/>
+ <field name="NUMERIC"/>
+ <field name="OLETTER"/>
+ <field name="OTHER"/>
+ <field name="SCONTINUE"/>
+ <field name="SEP"/>
+ <field name="SP"/>
+ <field name="STERM"/>
+ <field name="UPPER"/>
+ </class>
+ <class name="android/icu/lang/UCharacter$UnicodeBlock" since="24">
+ <extends name="java/lang/Character$Subset"/>
+ <method name="&lt;init>()V"/>
+ <method name="forName(Ljava/lang/String;)Landroid/icu/lang/UCharacter$UnicodeBlock;"/>
+ <method name="getID()I"/>
+ <method name="getInstance(I)Landroid/icu/lang/UCharacter$UnicodeBlock;"/>
+ <method name="of(I)Landroid/icu/lang/UCharacter$UnicodeBlock;"/>
+ <field name="ADLAM" since="26"/>
+ <field name="ADLAM_ID" since="26"/>
+ <field name="AEGEAN_NUMBERS"/>
+ <field name="AEGEAN_NUMBERS_ID"/>
+ <field name="AHOM"/>
+ <field name="AHOM_ID"/>
+ <field name="ALCHEMICAL_SYMBOLS"/>
+ <field name="ALCHEMICAL_SYMBOLS_ID"/>
+ <field name="ALPHABETIC_PRESENTATION_FORMS"/>
+ <field name="ALPHABETIC_PRESENTATION_FORMS_ID"/>
+ <field name="ANATOLIAN_HIEROGLYPHS"/>
+ <field name="ANATOLIAN_HIEROGLYPHS_ID"/>
+ <field name="ANCIENT_GREEK_MUSICAL_NOTATION"/>
+ <field name="ANCIENT_GREEK_MUSICAL_NOTATION_ID"/>
+ <field name="ANCIENT_GREEK_NUMBERS"/>
+ <field name="ANCIENT_GREEK_NUMBERS_ID"/>
+ <field name="ANCIENT_SYMBOLS"/>
+ <field name="ANCIENT_SYMBOLS_ID"/>
+ <field name="ARABIC"/>
+ <field name="ARABIC_EXTENDED_A"/>
+ <field name="ARABIC_EXTENDED_A_ID"/>
+ <field name="ARABIC_ID"/>
+ <field name="ARABIC_MATHEMATICAL_ALPHABETIC_SYMBOLS"/>
+ <field name="ARABIC_MATHEMATICAL_ALPHABETIC_SYMBOLS_ID"/>
+ <field name="ARABIC_PRESENTATION_FORMS_A"/>
+ <field name="ARABIC_PRESENTATION_FORMS_A_ID"/>
+ <field name="ARABIC_PRESENTATION_FORMS_B"/>
+ <field name="ARABIC_PRESENTATION_FORMS_B_ID"/>
+ <field name="ARABIC_SUPPLEMENT"/>
+ <field name="ARABIC_SUPPLEMENT_ID"/>
+ <field name="ARMENIAN"/>
+ <field name="ARMENIAN_ID"/>
+ <field name="ARROWS"/>
+ <field name="ARROWS_ID"/>
+ <field name="AVESTAN"/>
+ <field name="AVESTAN_ID"/>
+ <field name="BALINESE"/>
+ <field name="BALINESE_ID"/>
+ <field name="BAMUM"/>
+ <field name="BAMUM_ID"/>
+ <field name="BAMUM_SUPPLEMENT"/>
+ <field name="BAMUM_SUPPLEMENT_ID"/>
+ <field name="BASIC_LATIN"/>
+ <field name="BASIC_LATIN_ID"/>
+ <field name="BASSA_VAH"/>
+ <field name="BASSA_VAH_ID"/>
+ <field name="BATAK"/>
+ <field name="BATAK_ID"/>
+ <field name="BENGALI"/>
+ <field name="BENGALI_ID"/>
+ <field name="BHAIKSUKI" since="26"/>
+ <field name="BHAIKSUKI_ID" since="26"/>
+ <field name="BLOCK_ELEMENTS"/>
+ <field name="BLOCK_ELEMENTS_ID"/>
+ <field name="BOPOMOFO"/>
+ <field name="BOPOMOFO_EXTENDED"/>
+ <field name="BOPOMOFO_EXTENDED_ID"/>
+ <field name="BOPOMOFO_ID"/>
+ <field name="BOX_DRAWING"/>
+ <field name="BOX_DRAWING_ID"/>
+ <field name="BRAHMI"/>
+ <field name="BRAHMI_ID"/>
+ <field name="BRAILLE_PATTERNS"/>
+ <field name="BRAILLE_PATTERNS_ID"/>
+ <field name="BUGINESE"/>
+ <field name="BUGINESE_ID"/>
+ <field name="BUHID"/>
+ <field name="BUHID_ID"/>
+ <field name="BYZANTINE_MUSICAL_SYMBOLS"/>
+ <field name="BYZANTINE_MUSICAL_SYMBOLS_ID"/>
+ <field name="CARIAN"/>
+ <field name="CARIAN_ID"/>
+ <field name="CAUCASIAN_ALBANIAN"/>
+ <field name="CAUCASIAN_ALBANIAN_ID"/>
+ <field name="CHAKMA"/>
+ <field name="CHAKMA_ID"/>
+ <field name="CHAM"/>
+ <field name="CHAM_ID"/>
+ <field name="CHEROKEE"/>
+ <field name="CHEROKEE_ID"/>
+ <field name="CHEROKEE_SUPPLEMENT"/>
+ <field name="CHEROKEE_SUPPLEMENT_ID"/>
+ <field name="CJK_COMPATIBILITY"/>
+ <field name="CJK_COMPATIBILITY_FORMS"/>
+ <field name="CJK_COMPATIBILITY_FORMS_ID"/>
+ <field name="CJK_COMPATIBILITY_ID"/>
+ <field name="CJK_COMPATIBILITY_IDEOGRAPHS"/>
+ <field name="CJK_COMPATIBILITY_IDEOGRAPHS_ID"/>
+ <field name="CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT"/>
+ <field name="CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT_ID"/>
+ <field name="CJK_RADICALS_SUPPLEMENT"/>
+ <field name="CJK_RADICALS_SUPPLEMENT_ID"/>
+ <field name="CJK_STROKES"/>
+ <field name="CJK_STROKES_ID"/>
+ <field name="CJK_SYMBOLS_AND_PUNCTUATION"/>
+ <field name="CJK_SYMBOLS_AND_PUNCTUATION_ID"/>
+ <field name="CJK_UNIFIED_IDEOGRAPHS"/>
+ <field name="CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A"/>
+ <field name="CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A_ID"/>
+ <field name="CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B"/>
+ <field name="CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B_ID"/>
+ <field name="CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C"/>
+ <field name="CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C_ID"/>
+ <field name="CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D"/>
+ <field name="CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D_ID"/>
+ <field name="CJK_UNIFIED_IDEOGRAPHS_EXTENSION_E"/>
+ <field name="CJK_UNIFIED_IDEOGRAPHS_EXTENSION_E_ID"/>
+ <field name="CJK_UNIFIED_IDEOGRAPHS_ID"/>
+ <field name="COMBINING_DIACRITICAL_MARKS"/>
+ <field name="COMBINING_DIACRITICAL_MARKS_EXTENDED"/>
+ <field name="COMBINING_DIACRITICAL_MARKS_EXTENDED_ID"/>
+ <field name="COMBINING_DIACRITICAL_MARKS_ID"/>
+ <field name="COMBINING_DIACRITICAL_MARKS_SUPPLEMENT"/>
+ <field name="COMBINING_DIACRITICAL_MARKS_SUPPLEMENT_ID"/>
+ <field name="COMBINING_HALF_MARKS"/>
+ <field name="COMBINING_HALF_MARKS_ID"/>
+ <field name="COMBINING_MARKS_FOR_SYMBOLS"/>
+ <field name="COMBINING_MARKS_FOR_SYMBOLS_ID"/>
+ <field name="COMMON_INDIC_NUMBER_FORMS"/>
+ <field name="COMMON_INDIC_NUMBER_FORMS_ID"/>
+ <field name="CONTROL_PICTURES"/>
+ <field name="CONTROL_PICTURES_ID"/>
+ <field name="COPTIC"/>
+ <field name="COPTIC_EPACT_NUMBERS"/>
+ <field name="COPTIC_EPACT_NUMBERS_ID"/>
+ <field name="COPTIC_ID"/>
+ <field name="COUNTING_ROD_NUMERALS"/>
+ <field name="COUNTING_ROD_NUMERALS_ID"/>
+ <field name="CUNEIFORM"/>
+ <field name="CUNEIFORM_ID"/>
+ <field name="CUNEIFORM_NUMBERS_AND_PUNCTUATION"/>
+ <field name="CUNEIFORM_NUMBERS_AND_PUNCTUATION_ID"/>
+ <field name="CURRENCY_SYMBOLS"/>
+ <field name="CURRENCY_SYMBOLS_ID"/>
+ <field name="CYPRIOT_SYLLABARY"/>
+ <field name="CYPRIOT_SYLLABARY_ID"/>
+ <field name="CYRILLIC"/>
+ <field name="CYRILLIC_EXTENDED_A"/>
+ <field name="CYRILLIC_EXTENDED_A_ID"/>
+ <field name="CYRILLIC_EXTENDED_B"/>
+ <field name="CYRILLIC_EXTENDED_B_ID"/>
+ <field name="CYRILLIC_EXTENDED_C" since="26"/>
+ <field name="CYRILLIC_EXTENDED_C_ID" since="26"/>
+ <field name="CYRILLIC_ID"/>
+ <field name="CYRILLIC_SUPPLEMENT"/>
+ <field name="CYRILLIC_SUPPLEMENTARY"/>
+ <field name="CYRILLIC_SUPPLEMENTARY_ID"/>
+ <field name="CYRILLIC_SUPPLEMENT_ID"/>
+ <field name="DESERET"/>
+ <field name="DESERET_ID"/>
+ <field name="DEVANAGARI"/>
+ <field name="DEVANAGARI_EXTENDED"/>
+ <field name="DEVANAGARI_EXTENDED_ID"/>
+ <field name="DEVANAGARI_ID"/>
+ <field name="DINGBATS"/>
+ <field name="DINGBATS_ID"/>
+ <field name="DOMINO_TILES"/>
+ <field name="DOMINO_TILES_ID"/>
+ <field name="DUPLOYAN"/>
+ <field name="DUPLOYAN_ID"/>
+ <field name="EARLY_DYNASTIC_CUNEIFORM"/>
+ <field name="EARLY_DYNASTIC_CUNEIFORM_ID"/>
+ <field name="EGYPTIAN_HIEROGLYPHS"/>
+ <field name="EGYPTIAN_HIEROGLYPHS_ID"/>
+ <field name="ELBASAN"/>
+ <field name="ELBASAN_ID"/>
+ <field name="EMOTICONS"/>
+ <field name="EMOTICONS_ID"/>
+ <field name="ENCLOSED_ALPHANUMERICS"/>
+ <field name="ENCLOSED_ALPHANUMERICS_ID"/>
+ <field name="ENCLOSED_ALPHANUMERIC_SUPPLEMENT"/>
+ <field name="ENCLOSED_ALPHANUMERIC_SUPPLEMENT_ID"/>
+ <field name="ENCLOSED_CJK_LETTERS_AND_MONTHS"/>
+ <field name="ENCLOSED_CJK_LETTERS_AND_MONTHS_ID"/>
+ <field name="ENCLOSED_IDEOGRAPHIC_SUPPLEMENT"/>
+ <field name="ENCLOSED_IDEOGRAPHIC_SUPPLEMENT_ID"/>
+ <field name="ETHIOPIC"/>
+ <field name="ETHIOPIC_EXTENDED"/>
+ <field name="ETHIOPIC_EXTENDED_A"/>
+ <field name="ETHIOPIC_EXTENDED_A_ID"/>
+ <field name="ETHIOPIC_EXTENDED_ID"/>
+ <field name="ETHIOPIC_ID"/>
+ <field name="ETHIOPIC_SUPPLEMENT"/>
+ <field name="ETHIOPIC_SUPPLEMENT_ID"/>
+ <field name="GENERAL_PUNCTUATION"/>
+ <field name="GENERAL_PUNCTUATION_ID"/>
+ <field name="GEOMETRIC_SHAPES"/>
+ <field name="GEOMETRIC_SHAPES_EXTENDED"/>
+ <field name="GEOMETRIC_SHAPES_EXTENDED_ID"/>
+ <field name="GEOMETRIC_SHAPES_ID"/>
+ <field name="GEORGIAN"/>
+ <field name="GEORGIAN_ID"/>
+ <field name="GEORGIAN_SUPPLEMENT"/>
+ <field name="GEORGIAN_SUPPLEMENT_ID"/>
+ <field name="GLAGOLITIC"/>
+ <field name="GLAGOLITIC_ID"/>
+ <field name="GLAGOLITIC_SUPPLEMENT" since="26"/>
+ <field name="GLAGOLITIC_SUPPLEMENT_ID" since="26"/>
+ <field name="GOTHIC"/>
+ <field name="GOTHIC_ID"/>
+ <field name="GRANTHA"/>
+ <field name="GRANTHA_ID"/>
+ <field name="GREEK"/>
+ <field name="GREEK_EXTENDED"/>
+ <field name="GREEK_EXTENDED_ID"/>
+ <field name="GREEK_ID"/>
+ <field name="GUJARATI"/>
+ <field name="GUJARATI_ID"/>
+ <field name="GURMUKHI"/>
+ <field name="GURMUKHI_ID"/>
+ <field name="HALFWIDTH_AND_FULLWIDTH_FORMS"/>
+ <field name="HALFWIDTH_AND_FULLWIDTH_FORMS_ID"/>
+ <field name="HANGUL_COMPATIBILITY_JAMO"/>
+ <field name="HANGUL_COMPATIBILITY_JAMO_ID"/>
+ <field name="HANGUL_JAMO"/>
+ <field name="HANGUL_JAMO_EXTENDED_A"/>
+ <field name="HANGUL_JAMO_EXTENDED_A_ID"/>
+ <field name="HANGUL_JAMO_EXTENDED_B"/>
+ <field name="HANGUL_JAMO_EXTENDED_B_ID"/>
+ <field name="HANGUL_JAMO_ID"/>
+ <field name="HANGUL_SYLLABLES"/>
+ <field name="HANGUL_SYLLABLES_ID"/>
+ <field name="HANUNOO"/>
+ <field name="HANUNOO_ID"/>
+ <field name="HATRAN"/>
+ <field name="HATRAN_ID"/>
+ <field name="HEBREW"/>
+ <field name="HEBREW_ID"/>
+ <field name="HIGH_PRIVATE_USE_SURROGATES"/>
+ <field name="HIGH_PRIVATE_USE_SURROGATES_ID"/>
+ <field name="HIGH_SURROGATES"/>
+ <field name="HIGH_SURROGATES_ID"/>
+ <field name="HIRAGANA"/>
+ <field name="HIRAGANA_ID"/>
+ <field name="IDEOGRAPHIC_DESCRIPTION_CHARACTERS"/>
+ <field name="IDEOGRAPHIC_DESCRIPTION_CHARACTERS_ID"/>
+ <field name="IDEOGRAPHIC_SYMBOLS_AND_PUNCTUATION" since="26"/>
+ <field name="IDEOGRAPHIC_SYMBOLS_AND_PUNCTUATION_ID" since="26"/>
+ <field name="IMPERIAL_ARAMAIC"/>
+ <field name="IMPERIAL_ARAMAIC_ID"/>
+ <field name="INSCRIPTIONAL_PAHLAVI"/>
+ <field name="INSCRIPTIONAL_PAHLAVI_ID"/>
+ <field name="INSCRIPTIONAL_PARTHIAN"/>
+ <field name="INSCRIPTIONAL_PARTHIAN_ID"/>
+ <field name="INVALID_CODE"/>
+ <field name="INVALID_CODE_ID"/>
+ <field name="IPA_EXTENSIONS"/>
+ <field name="IPA_EXTENSIONS_ID"/>
+ <field name="JAVANESE"/>
+ <field name="JAVANESE_ID"/>
+ <field name="KAITHI"/>
+ <field name="KAITHI_ID"/>
+ <field name="KANA_SUPPLEMENT"/>
+ <field name="KANA_SUPPLEMENT_ID"/>
+ <field name="KANBUN"/>
+ <field name="KANBUN_ID"/>
+ <field name="KANGXI_RADICALS"/>
+ <field name="KANGXI_RADICALS_ID"/>
+ <field name="KANNADA"/>
+ <field name="KANNADA_ID"/>
+ <field name="KATAKANA"/>
+ <field name="KATAKANA_ID"/>
+ <field name="KATAKANA_PHONETIC_EXTENSIONS"/>
+ <field name="KATAKANA_PHONETIC_EXTENSIONS_ID"/>
+ <field name="KAYAH_LI"/>
+ <field name="KAYAH_LI_ID"/>
+ <field name="KHAROSHTHI"/>
+ <field name="KHAROSHTHI_ID"/>
+ <field name="KHMER"/>
+ <field name="KHMER_ID"/>
+ <field name="KHMER_SYMBOLS"/>
+ <field name="KHMER_SYMBOLS_ID"/>
+ <field name="KHOJKI"/>
+ <field name="KHOJKI_ID"/>
+ <field name="KHUDAWADI"/>
+ <field name="KHUDAWADI_ID"/>
+ <field name="LAO"/>
+ <field name="LAO_ID"/>
+ <field name="LATIN_1_SUPPLEMENT"/>
+ <field name="LATIN_1_SUPPLEMENT_ID"/>
+ <field name="LATIN_EXTENDED_A"/>
+ <field name="LATIN_EXTENDED_ADDITIONAL"/>
+ <field name="LATIN_EXTENDED_ADDITIONAL_ID"/>
+ <field name="LATIN_EXTENDED_A_ID"/>
+ <field name="LATIN_EXTENDED_B"/>
+ <field name="LATIN_EXTENDED_B_ID"/>
+ <field name="LATIN_EXTENDED_C"/>
+ <field name="LATIN_EXTENDED_C_ID"/>
+ <field name="LATIN_EXTENDED_D"/>
+ <field name="LATIN_EXTENDED_D_ID"/>
+ <field name="LATIN_EXTENDED_E"/>
+ <field name="LATIN_EXTENDED_E_ID"/>
+ <field name="LEPCHA"/>
+ <field name="LEPCHA_ID"/>
+ <field name="LETTERLIKE_SYMBOLS"/>
+ <field name="LETTERLIKE_SYMBOLS_ID"/>
+ <field name="LIMBU"/>
+ <field name="LIMBU_ID"/>
+ <field name="LINEAR_A"/>
+ <field name="LINEAR_A_ID"/>
+ <field name="LINEAR_B_IDEOGRAMS"/>
+ <field name="LINEAR_B_IDEOGRAMS_ID"/>
+ <field name="LINEAR_B_SYLLABARY"/>
+ <field name="LINEAR_B_SYLLABARY_ID"/>
+ <field name="LISU"/>
+ <field name="LISU_ID"/>
+ <field name="LOW_SURROGATES"/>
+ <field name="LOW_SURROGATES_ID"/>
+ <field name="LYCIAN"/>
+ <field name="LYCIAN_ID"/>
+ <field name="LYDIAN"/>
+ <field name="LYDIAN_ID"/>
+ <field name="MAHAJANI"/>
+ <field name="MAHAJANI_ID"/>
+ <field name="MAHJONG_TILES"/>
+ <field name="MAHJONG_TILES_ID"/>
+ <field name="MALAYALAM"/>
+ <field name="MALAYALAM_ID"/>
+ <field name="MANDAIC"/>
+ <field name="MANDAIC_ID"/>
+ <field name="MANICHAEAN"/>
+ <field name="MANICHAEAN_ID"/>
+ <field name="MARCHEN" since="26"/>
+ <field name="MARCHEN_ID" since="26"/>
+ <field name="MATHEMATICAL_ALPHANUMERIC_SYMBOLS"/>
+ <field name="MATHEMATICAL_ALPHANUMERIC_SYMBOLS_ID"/>
+ <field name="MATHEMATICAL_OPERATORS"/>
+ <field name="MATHEMATICAL_OPERATORS_ID"/>
+ <field name="MEETEI_MAYEK"/>
+ <field name="MEETEI_MAYEK_EXTENSIONS"/>
+ <field name="MEETEI_MAYEK_EXTENSIONS_ID"/>
+ <field name="MEETEI_MAYEK_ID"/>
+ <field name="MENDE_KIKAKUI"/>
+ <field name="MENDE_KIKAKUI_ID"/>
+ <field name="MEROITIC_CURSIVE"/>
+ <field name="MEROITIC_CURSIVE_ID"/>
+ <field name="MEROITIC_HIEROGLYPHS"/>
+ <field name="MEROITIC_HIEROGLYPHS_ID"/>
+ <field name="MIAO"/>
+ <field name="MIAO_ID"/>
+ <field name="MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A"/>
+ <field name="MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A_ID"/>
+ <field name="MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B"/>
+ <field name="MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B_ID"/>
+ <field name="MISCELLANEOUS_SYMBOLS"/>
+ <field name="MISCELLANEOUS_SYMBOLS_AND_ARROWS"/>
+ <field name="MISCELLANEOUS_SYMBOLS_AND_ARROWS_ID"/>
+ <field name="MISCELLANEOUS_SYMBOLS_AND_PICTOGRAPHS"/>
+ <field name="MISCELLANEOUS_SYMBOLS_AND_PICTOGRAPHS_ID"/>
+ <field name="MISCELLANEOUS_SYMBOLS_ID"/>
+ <field name="MISCELLANEOUS_TECHNICAL"/>
+ <field name="MISCELLANEOUS_TECHNICAL_ID"/>
+ <field name="MODI"/>
+ <field name="MODIFIER_TONE_LETTERS"/>
+ <field name="MODIFIER_TONE_LETTERS_ID"/>
+ <field name="MODI_ID"/>
+ <field name="MONGOLIAN"/>
+ <field name="MONGOLIAN_ID"/>
+ <field name="MONGOLIAN_SUPPLEMENT" since="26"/>
+ <field name="MONGOLIAN_SUPPLEMENT_ID" since="26"/>
+ <field name="MRO"/>
+ <field name="MRO_ID"/>
+ <field name="MULTANI"/>
+ <field name="MULTANI_ID"/>
+ <field name="MUSICAL_SYMBOLS"/>
+ <field name="MUSICAL_SYMBOLS_ID"/>
+ <field name="MYANMAR"/>
+ <field name="MYANMAR_EXTENDED_A"/>
+ <field name="MYANMAR_EXTENDED_A_ID"/>
+ <field name="MYANMAR_EXTENDED_B"/>
+ <field name="MYANMAR_EXTENDED_B_ID"/>
+ <field name="MYANMAR_ID"/>
+ <field name="NABATAEAN"/>
+ <field name="NABATAEAN_ID"/>
+ <field name="NEWA" since="26"/>
+ <field name="NEWA_ID" since="26"/>
+ <field name="NEW_TAI_LUE"/>
+ <field name="NEW_TAI_LUE_ID"/>
+ <field name="NKO"/>
+ <field name="NKO_ID"/>
+ <field name="NO_BLOCK"/>
+ <field name="NUMBER_FORMS"/>
+ <field name="NUMBER_FORMS_ID"/>
+ <field name="OGHAM"/>
+ <field name="OGHAM_ID"/>
+ <field name="OLD_HUNGARIAN"/>
+ <field name="OLD_HUNGARIAN_ID"/>
+ <field name="OLD_ITALIC"/>
+ <field name="OLD_ITALIC_ID"/>
+ <field name="OLD_NORTH_ARABIAN"/>
+ <field name="OLD_NORTH_ARABIAN_ID"/>
+ <field name="OLD_PERMIC"/>
+ <field name="OLD_PERMIC_ID"/>
+ <field name="OLD_PERSIAN"/>
+ <field name="OLD_PERSIAN_ID"/>
+ <field name="OLD_SOUTH_ARABIAN"/>
+ <field name="OLD_SOUTH_ARABIAN_ID"/>
+ <field name="OLD_TURKIC"/>
+ <field name="OLD_TURKIC_ID"/>
+ <field name="OL_CHIKI"/>
+ <field name="OL_CHIKI_ID"/>
+ <field name="OPTICAL_CHARACTER_RECOGNITION"/>
+ <field name="OPTICAL_CHARACTER_RECOGNITION_ID"/>
+ <field name="ORIYA"/>
+ <field name="ORIYA_ID"/>
+ <field name="ORNAMENTAL_DINGBATS"/>
+ <field name="ORNAMENTAL_DINGBATS_ID"/>
+ <field name="OSAGE" since="26"/>
+ <field name="OSAGE_ID" since="26"/>
+ <field name="OSMANYA"/>
+ <field name="OSMANYA_ID"/>
+ <field name="PAHAWH_HMONG"/>
+ <field name="PAHAWH_HMONG_ID"/>
+ <field name="PALMYRENE"/>
+ <field name="PALMYRENE_ID"/>
+ <field name="PAU_CIN_HAU"/>
+ <field name="PAU_CIN_HAU_ID"/>
+ <field name="PHAGS_PA"/>
+ <field name="PHAGS_PA_ID"/>
+ <field name="PHAISTOS_DISC"/>
+ <field name="PHAISTOS_DISC_ID"/>
+ <field name="PHOENICIAN"/>
+ <field name="PHOENICIAN_ID"/>
+ <field name="PHONETIC_EXTENSIONS"/>
+ <field name="PHONETIC_EXTENSIONS_ID"/>
+ <field name="PHONETIC_EXTENSIONS_SUPPLEMENT"/>
+ <field name="PHONETIC_EXTENSIONS_SUPPLEMENT_ID"/>
+ <field name="PLAYING_CARDS"/>
+ <field name="PLAYING_CARDS_ID"/>
+ <field name="PRIVATE_USE"/>
+ <field name="PRIVATE_USE_AREA"/>
+ <field name="PRIVATE_USE_AREA_ID"/>
+ <field name="PRIVATE_USE_ID"/>
+ <field name="PSALTER_PAHLAVI"/>
+ <field name="PSALTER_PAHLAVI_ID"/>
+ <field name="REJANG"/>
+ <field name="REJANG_ID"/>
+ <field name="RUMI_NUMERAL_SYMBOLS"/>
+ <field name="RUMI_NUMERAL_SYMBOLS_ID"/>
+ <field name="RUNIC"/>
+ <field name="RUNIC_ID"/>
+ <field name="SAMARITAN"/>
+ <field name="SAMARITAN_ID"/>
+ <field name="SAURASHTRA"/>
+ <field name="SAURASHTRA_ID"/>
+ <field name="SHARADA"/>
+ <field name="SHARADA_ID"/>
+ <field name="SHAVIAN"/>
+ <field name="SHAVIAN_ID"/>
+ <field name="SHORTHAND_FORMAT_CONTROLS"/>
+ <field name="SHORTHAND_FORMAT_CONTROLS_ID"/>
+ <field name="SIDDHAM"/>
+ <field name="SIDDHAM_ID"/>
+ <field name="SINHALA"/>
+ <field name="SINHALA_ARCHAIC_NUMBERS"/>
+ <field name="SINHALA_ARCHAIC_NUMBERS_ID"/>
+ <field name="SINHALA_ID"/>
+ <field name="SMALL_FORM_VARIANTS"/>
+ <field name="SMALL_FORM_VARIANTS_ID"/>
+ <field name="SORA_SOMPENG"/>
+ <field name="SORA_SOMPENG_ID"/>
+ <field name="SPACING_MODIFIER_LETTERS"/>
+ <field name="SPACING_MODIFIER_LETTERS_ID"/>
+ <field name="SPECIALS"/>
+ <field name="SPECIALS_ID"/>
+ <field name="SUNDANESE"/>
+ <field name="SUNDANESE_ID"/>
+ <field name="SUNDANESE_SUPPLEMENT"/>
+ <field name="SUNDANESE_SUPPLEMENT_ID"/>
+ <field name="SUPERSCRIPTS_AND_SUBSCRIPTS"/>
+ <field name="SUPERSCRIPTS_AND_SUBSCRIPTS_ID"/>
+ <field name="SUPPLEMENTAL_ARROWS_A"/>
+ <field name="SUPPLEMENTAL_ARROWS_A_ID"/>
+ <field name="SUPPLEMENTAL_ARROWS_B"/>
+ <field name="SUPPLEMENTAL_ARROWS_B_ID"/>
+ <field name="SUPPLEMENTAL_ARROWS_C"/>
+ <field name="SUPPLEMENTAL_ARROWS_C_ID"/>
+ <field name="SUPPLEMENTAL_MATHEMATICAL_OPERATORS"/>
+ <field name="SUPPLEMENTAL_MATHEMATICAL_OPERATORS_ID"/>
+ <field name="SUPPLEMENTAL_PUNCTUATION"/>
+ <field name="SUPPLEMENTAL_PUNCTUATION_ID"/>
+ <field name="SUPPLEMENTAL_SYMBOLS_AND_PICTOGRAPHS"/>
+ <field name="SUPPLEMENTAL_SYMBOLS_AND_PICTOGRAPHS_ID"/>
+ <field name="SUPPLEMENTARY_PRIVATE_USE_AREA_A"/>
+ <field name="SUPPLEMENTARY_PRIVATE_USE_AREA_A_ID"/>
+ <field name="SUPPLEMENTARY_PRIVATE_USE_AREA_B"/>
+ <field name="SUPPLEMENTARY_PRIVATE_USE_AREA_B_ID"/>
+ <field name="SUTTON_SIGNWRITING"/>
+ <field name="SUTTON_SIGNWRITING_ID"/>
+ <field name="SYLOTI_NAGRI"/>
+ <field name="SYLOTI_NAGRI_ID"/>
+ <field name="SYRIAC"/>
+ <field name="SYRIAC_ID"/>
+ <field name="TAGALOG"/>
+ <field name="TAGALOG_ID"/>
+ <field name="TAGBANWA"/>
+ <field name="TAGBANWA_ID"/>
+ <field name="TAGS"/>
+ <field name="TAGS_ID"/>
+ <field name="TAI_LE"/>
+ <field name="TAI_LE_ID"/>
+ <field name="TAI_THAM"/>
+ <field name="TAI_THAM_ID"/>
+ <field name="TAI_VIET"/>
+ <field name="TAI_VIET_ID"/>
+ <field name="TAI_XUAN_JING_SYMBOLS"/>
+ <field name="TAI_XUAN_JING_SYMBOLS_ID"/>
+ <field name="TAKRI"/>
+ <field name="TAKRI_ID"/>
+ <field name="TAMIL"/>
+ <field name="TAMIL_ID"/>
+ <field name="TANGUT" since="26"/>
+ <field name="TANGUT_COMPONENTS" since="26"/>
+ <field name="TANGUT_COMPONENTS_ID" since="26"/>
+ <field name="TANGUT_ID" since="26"/>
+ <field name="TELUGU"/>
+ <field name="TELUGU_ID"/>
+ <field name="THAANA"/>
+ <field name="THAANA_ID"/>
+ <field name="THAI"/>
+ <field name="THAI_ID"/>
+ <field name="TIBETAN"/>
+ <field name="TIBETAN_ID"/>
+ <field name="TIFINAGH"/>
+ <field name="TIFINAGH_ID"/>
+ <field name="TIRHUTA"/>
+ <field name="TIRHUTA_ID"/>
+ <field name="TRANSPORT_AND_MAP_SYMBOLS"/>
+ <field name="TRANSPORT_AND_MAP_SYMBOLS_ID"/>
+ <field name="UGARITIC"/>
+ <field name="UGARITIC_ID"/>
+ <field name="UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS"/>
+ <field name="UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_EXTENDED"/>
+ <field name="UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_EXTENDED_ID"/>
+ <field name="UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_ID"/>
+ <field name="VAI"/>
+ <field name="VAI_ID"/>
+ <field name="VARIATION_SELECTORS"/>
+ <field name="VARIATION_SELECTORS_ID"/>
+ <field name="VARIATION_SELECTORS_SUPPLEMENT"/>
+ <field name="VARIATION_SELECTORS_SUPPLEMENT_ID"/>
+ <field name="VEDIC_EXTENSIONS"/>
+ <field name="VEDIC_EXTENSIONS_ID"/>
+ <field name="VERTICAL_FORMS"/>
+ <field name="VERTICAL_FORMS_ID"/>
+ <field name="WARANG_CITI"/>
+ <field name="WARANG_CITI_ID"/>
+ <field name="YIJING_HEXAGRAM_SYMBOLS"/>
+ <field name="YIJING_HEXAGRAM_SYMBOLS_ID"/>
+ <field name="YI_RADICALS"/>
+ <field name="YI_RADICALS_ID"/>
+ <field name="YI_SYLLABLES"/>
+ <field name="YI_SYLLABLES_ID"/>
+ </class>
+ <class name="android/icu/lang/UCharacter$WordBreak" since="24">
+ <extends name="java/lang/Object"/>
+ <field name="ALETTER"/>
+ <field name="CR"/>
+ <field name="DOUBLE_QUOTE"/>
+ <field name="EXTEND"/>
+ <field name="EXTENDNUMLET"/>
+ <field name="E_BASE" since="26"/>
+ <field name="E_BASE_GAZ" since="26"/>
+ <field name="E_MODIFIER" since="26"/>
+ <field name="FORMAT"/>
+ <field name="GLUE_AFTER_ZWJ" since="26"/>
+ <field name="HEBREW_LETTER"/>
+ <field name="KATAKANA"/>
+ <field name="LF"/>
+ <field name="MIDLETTER"/>
+ <field name="MIDNUM"/>
+ <field name="MIDNUMLET"/>
+ <field name="NEWLINE"/>
+ <field name="NUMERIC"/>
+ <field name="OTHER"/>
+ <field name="REGIONAL_INDICATOR"/>
+ <field name="SINGLE_QUOTE"/>
+ <field name="ZWJ" since="26"/>
+ </class>
+ <class name="android/icu/lang/UCharacterCategory" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/icu/lang/UCharacterEnums$ECharacterCategory"/>
+ <method name="&lt;init>()V"/>
+ <method name="toString(I)Ljava/lang/String;"/>
+ </class>
+ <class name="android/icu/lang/UCharacterDirection" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/icu/lang/UCharacterEnums$ECharacterDirection"/>
+ <method name="&lt;init>()V"/>
+ <method name="toString(I)Ljava/lang/String;"/>
+ </class>
+ <class name="android/icu/lang/UCharacterEnums" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/icu/lang/UCharacterEnums$ECharacterCategory" since="24">
+ <extends name="java/lang/Object"/>
+ <field name="COMBINING_SPACING_MARK"/>
+ <field name="CONNECTOR_PUNCTUATION"/>
+ <field name="CONTROL"/>
+ <field name="CURRENCY_SYMBOL"/>
+ <field name="DASH_PUNCTUATION"/>
+ <field name="DECIMAL_DIGIT_NUMBER"/>
+ <field name="ENCLOSING_MARK"/>
+ <field name="END_PUNCTUATION"/>
+ <field name="FINAL_PUNCTUATION"/>
+ <field name="FINAL_QUOTE_PUNCTUATION"/>
+ <field name="FORMAT"/>
+ <field name="GENERAL_OTHER_TYPES"/>
+ <field name="INITIAL_PUNCTUATION"/>
+ <field name="INITIAL_QUOTE_PUNCTUATION"/>
+ <field name="LETTER_NUMBER"/>
+ <field name="LINE_SEPARATOR"/>
+ <field name="LOWERCASE_LETTER"/>
+ <field name="MATH_SYMBOL"/>
+ <field name="MODIFIER_LETTER"/>
+ <field name="MODIFIER_SYMBOL"/>
+ <field name="NON_SPACING_MARK"/>
+ <field name="OTHER_LETTER"/>
+ <field name="OTHER_NUMBER"/>
+ <field name="OTHER_PUNCTUATION"/>
+ <field name="OTHER_SYMBOL"/>
+ <field name="PARAGRAPH_SEPARATOR"/>
+ <field name="PRIVATE_USE"/>
+ <field name="SPACE_SEPARATOR"/>
+ <field name="START_PUNCTUATION"/>
+ <field name="SURROGATE"/>
+ <field name="TITLECASE_LETTER"/>
+ <field name="UNASSIGNED"/>
+ <field name="UPPERCASE_LETTER"/>
+ </class>
+ <class name="android/icu/lang/UCharacterEnums$ECharacterDirection" since="24">
+ <extends name="java/lang/Object"/>
+ <field name="ARABIC_NUMBER"/>
+ <field name="BLOCK_SEPARATOR"/>
+ <field name="BOUNDARY_NEUTRAL"/>
+ <field name="COMMON_NUMBER_SEPARATOR"/>
+ <field name="DIRECTIONALITY_ARABIC_NUMBER"/>
+ <field name="DIRECTIONALITY_BOUNDARY_NEUTRAL"/>
+ <field name="DIRECTIONALITY_COMMON_NUMBER_SEPARATOR"/>
+ <field name="DIRECTIONALITY_EUROPEAN_NUMBER"/>
+ <field name="DIRECTIONALITY_EUROPEAN_NUMBER_SEPARATOR"/>
+ <field name="DIRECTIONALITY_EUROPEAN_NUMBER_TERMINATOR"/>
+ <field name="DIRECTIONALITY_LEFT_TO_RIGHT"/>
+ <field name="DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING"/>
+ <field name="DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE"/>
+ <field name="DIRECTIONALITY_NONSPACING_MARK"/>
+ <field name="DIRECTIONALITY_OTHER_NEUTRALS"/>
+ <field name="DIRECTIONALITY_PARAGRAPH_SEPARATOR"/>
+ <field name="DIRECTIONALITY_POP_DIRECTIONAL_FORMAT"/>
+ <field name="DIRECTIONALITY_RIGHT_TO_LEFT"/>
+ <field name="DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC"/>
+ <field name="DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING"/>
+ <field name="DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE"/>
+ <field name="DIRECTIONALITY_SEGMENT_SEPARATOR"/>
+ <field name="DIRECTIONALITY_UNDEFINED"/>
+ <field name="DIRECTIONALITY_WHITESPACE"/>
+ <field name="DIR_NON_SPACING_MARK"/>
+ <field name="EUROPEAN_NUMBER"/>
+ <field name="EUROPEAN_NUMBER_SEPARATOR"/>
+ <field name="EUROPEAN_NUMBER_TERMINATOR"/>
+ <field name="FIRST_STRONG_ISOLATE"/>
+ <field name="LEFT_TO_RIGHT"/>
+ <field name="LEFT_TO_RIGHT_EMBEDDING"/>
+ <field name="LEFT_TO_RIGHT_ISOLATE"/>
+ <field name="LEFT_TO_RIGHT_OVERRIDE"/>
+ <field name="OTHER_NEUTRAL"/>
+ <field name="POP_DIRECTIONAL_FORMAT"/>
+ <field name="POP_DIRECTIONAL_ISOLATE"/>
+ <field name="RIGHT_TO_LEFT"/>
+ <field name="RIGHT_TO_LEFT_ARABIC"/>
+ <field name="RIGHT_TO_LEFT_EMBEDDING"/>
+ <field name="RIGHT_TO_LEFT_ISOLATE"/>
+ <field name="RIGHT_TO_LEFT_OVERRIDE"/>
+ <field name="SEGMENT_SEPARATOR"/>
+ <field name="WHITE_SPACE_NEUTRAL"/>
+ </class>
+ <class name="android/icu/lang/UProperty" since="24">
+ <extends name="java/lang/Object"/>
+ <field name="AGE"/>
+ <field name="ALPHABETIC"/>
+ <field name="ASCII_HEX_DIGIT"/>
+ <field name="BIDI_CLASS"/>
+ <field name="BIDI_CONTROL"/>
+ <field name="BIDI_MIRRORED"/>
+ <field name="BIDI_MIRRORING_GLYPH"/>
+ <field name="BIDI_PAIRED_BRACKET"/>
+ <field name="BIDI_PAIRED_BRACKET_TYPE"/>
+ <field name="BINARY_START"/>
+ <field name="BLOCK"/>
+ <field name="CANONICAL_COMBINING_CLASS"/>
+ <field name="CASED"/>
+ <field name="CASE_FOLDING"/>
+ <field name="CASE_IGNORABLE"/>
+ <field name="CASE_SENSITIVE"/>
+ <field name="CHANGES_WHEN_CASEFOLDED"/>
+ <field name="CHANGES_WHEN_CASEMAPPED"/>
+ <field name="CHANGES_WHEN_LOWERCASED"/>
+ <field name="CHANGES_WHEN_NFKC_CASEFOLDED"/>
+ <field name="CHANGES_WHEN_TITLECASED"/>
+ <field name="CHANGES_WHEN_UPPERCASED"/>
+ <field name="DASH"/>
+ <field name="DECOMPOSITION_TYPE"/>
+ <field name="DEFAULT_IGNORABLE_CODE_POINT"/>
+ <field name="DEPRECATED"/>
+ <field name="DIACRITIC"/>
+ <field name="DOUBLE_START"/>
+ <field name="EAST_ASIAN_WIDTH"/>
+ <field name="EXTENDER"/>
+ <field name="FULL_COMPOSITION_EXCLUSION"/>
+ <field name="GENERAL_CATEGORY"/>
+ <field name="GENERAL_CATEGORY_MASK"/>
+ <field name="GRAPHEME_BASE"/>
+ <field name="GRAPHEME_CLUSTER_BREAK"/>
+ <field name="GRAPHEME_EXTEND"/>
+ <field name="GRAPHEME_LINK"/>
+ <field name="HANGUL_SYLLABLE_TYPE"/>
+ <field name="HEX_DIGIT"/>
+ <field name="HYPHEN"/>
+ <field name="IDEOGRAPHIC"/>
+ <field name="IDS_BINARY_OPERATOR"/>
+ <field name="IDS_TRINARY_OPERATOR"/>
+ <field name="ID_CONTINUE"/>
+ <field name="ID_START"/>
+ <field name="INT_START"/>
+ <field name="JOINING_GROUP"/>
+ <field name="JOINING_TYPE"/>
+ <field name="JOIN_CONTROL"/>
+ <field name="LEAD_CANONICAL_COMBINING_CLASS"/>
+ <field name="LINE_BREAK"/>
+ <field name="LOGICAL_ORDER_EXCEPTION"/>
+ <field name="LOWERCASE"/>
+ <field name="LOWERCASE_MAPPING"/>
+ <field name="MASK_START"/>
+ <field name="MATH"/>
+ <field name="NAME"/>
+ <field name="NFC_INERT"/>
+ <field name="NFC_QUICK_CHECK"/>
+ <field name="NFD_INERT"/>
+ <field name="NFD_QUICK_CHECK"/>
+ <field name="NFKC_INERT"/>
+ <field name="NFKC_QUICK_CHECK"/>
+ <field name="NFKD_INERT"/>
+ <field name="NFKD_QUICK_CHECK"/>
+ <field name="NONCHARACTER_CODE_POINT"/>
+ <field name="NUMERIC_TYPE"/>
+ <field name="NUMERIC_VALUE"/>
+ <field name="OTHER_PROPERTY_START"/>
+ <field name="PATTERN_SYNTAX"/>
+ <field name="PATTERN_WHITE_SPACE"/>
+ <field name="POSIX_ALNUM"/>
+ <field name="POSIX_BLANK"/>
+ <field name="POSIX_GRAPH"/>
+ <field name="POSIX_PRINT"/>
+ <field name="POSIX_XDIGIT"/>
+ <field name="QUOTATION_MARK"/>
+ <field name="RADICAL"/>
+ <field name="SCRIPT"/>
+ <field name="SCRIPT_EXTENSIONS"/>
+ <field name="SEGMENT_STARTER"/>
+ <field name="SENTENCE_BREAK"/>
+ <field name="SIMPLE_CASE_FOLDING"/>
+ <field name="SIMPLE_LOWERCASE_MAPPING"/>
+ <field name="SIMPLE_TITLECASE_MAPPING"/>
+ <field name="SIMPLE_UPPERCASE_MAPPING"/>
+ <field name="SOFT_DOTTED"/>
+ <field name="STRING_START"/>
+ <field name="S_TERM"/>
+ <field name="TERMINAL_PUNCTUATION"/>
+ <field name="TITLECASE_MAPPING"/>
+ <field name="TRAIL_CANONICAL_COMBINING_CLASS"/>
+ <field name="UNIFIED_IDEOGRAPH"/>
+ <field name="UPPERCASE"/>
+ <field name="UPPERCASE_MAPPING"/>
+ <field name="VARIATION_SELECTOR"/>
+ <field name="WHITE_SPACE"/>
+ <field name="WORD_BREAK"/>
+ <field name="XID_CONTINUE"/>
+ <field name="XID_START"/>
+ </class>
+ <class name="android/icu/lang/UProperty$NameChoice" since="24">
+ <extends name="java/lang/Object"/>
+ <field name="LONG"/>
+ <field name="SHORT"/>
+ </class>
+ <class name="android/icu/lang/UScript" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="breaksBetweenLetters(I)Z"/>
+ <method name="getCode(Landroid/icu/util/ULocale;)[I"/>
+ <method name="getCode(Ljava/lang/String;)[I"/>
+ <method name="getCode(Ljava/util/Locale;)[I"/>
+ <method name="getCodeFromName(Ljava/lang/String;)I"/>
+ <method name="getName(I)Ljava/lang/String;"/>
+ <method name="getSampleString(I)Ljava/lang/String;"/>
+ <method name="getScript(I)I"/>
+ <method name="getScriptExtensions(ILjava/util/BitSet;)I"/>
+ <method name="getShortName(I)Ljava/lang/String;"/>
+ <method name="getUsage(I)Landroid/icu/lang/UScript$ScriptUsage;"/>
+ <method name="hasScript(II)Z"/>
+ <method name="isCased(I)Z"/>
+ <method name="isRightToLeft(I)Z"/>
+ <field name="ADLAM" since="26"/>
+ <field name="AFAKA"/>
+ <field name="AHOM"/>
+ <field name="ANATOLIAN_HIEROGLYPHS"/>
+ <field name="ARABIC"/>
+ <field name="ARMENIAN"/>
+ <field name="AVESTAN"/>
+ <field name="BALINESE"/>
+ <field name="BAMUM"/>
+ <field name="BASSA_VAH"/>
+ <field name="BATAK"/>
+ <field name="BENGALI"/>
+ <field name="BHAIKSUKI" since="26"/>
+ <field name="BLISSYMBOLS"/>
+ <field name="BOOK_PAHLAVI"/>
+ <field name="BOPOMOFO"/>
+ <field name="BRAHMI"/>
+ <field name="BRAILLE"/>
+ <field name="BUGINESE"/>
+ <field name="BUHID"/>
+ <field name="CANADIAN_ABORIGINAL"/>
+ <field name="CARIAN"/>
+ <field name="CAUCASIAN_ALBANIAN"/>
+ <field name="CHAKMA"/>
+ <field name="CHAM"/>
+ <field name="CHEROKEE"/>
+ <field name="CIRTH"/>
+ <field name="COMMON"/>
+ <field name="COPTIC"/>
+ <field name="CUNEIFORM"/>
+ <field name="CYPRIOT"/>
+ <field name="CYRILLIC"/>
+ <field name="DEMOTIC_EGYPTIAN"/>
+ <field name="DESERET"/>
+ <field name="DEVANAGARI"/>
+ <field name="DUPLOYAN"/>
+ <field name="EASTERN_SYRIAC"/>
+ <field name="EGYPTIAN_HIEROGLYPHS"/>
+ <field name="ELBASAN"/>
+ <field name="ESTRANGELO_SYRIAC"/>
+ <field name="ETHIOPIC"/>
+ <field name="GEORGIAN"/>
+ <field name="GLAGOLITIC"/>
+ <field name="GOTHIC"/>
+ <field name="GRANTHA"/>
+ <field name="GREEK"/>
+ <field name="GUJARATI"/>
+ <field name="GURMUKHI"/>
+ <field name="HAN"/>
+ <field name="HANGUL"/>
+ <field name="HANUNOO"/>
+ <field name="HAN_WITH_BOPOMOFO" since="26"/>
+ <field name="HARAPPAN_INDUS"/>
+ <field name="HATRAN"/>
+ <field name="HEBREW"/>
+ <field name="HIERATIC_EGYPTIAN"/>
+ <field name="HIRAGANA"/>
+ <field name="IMPERIAL_ARAMAIC"/>
+ <field name="INHERITED"/>
+ <field name="INSCRIPTIONAL_PAHLAVI"/>
+ <field name="INSCRIPTIONAL_PARTHIAN"/>
+ <field name="INVALID_CODE"/>
+ <field name="JAMO" since="26"/>
+ <field name="JAPANESE"/>
+ <field name="JAVANESE"/>
+ <field name="JURCHEN"/>
+ <field name="KAITHI"/>
+ <field name="KANNADA"/>
+ <field name="KATAKANA"/>
+ <field name="KATAKANA_OR_HIRAGANA"/>
+ <field name="KAYAH_LI"/>
+ <field name="KHAROSHTHI"/>
+ <field name="KHMER"/>
+ <field name="KHOJKI"/>
+ <field name="KHUDAWADI"/>
+ <field name="KHUTSURI"/>
+ <field name="KOREAN"/>
+ <field name="KPELLE"/>
+ <field name="LANNA"/>
+ <field name="LAO"/>
+ <field name="LATIN"/>
+ <field name="LATIN_FRAKTUR"/>
+ <field name="LATIN_GAELIC"/>
+ <field name="LEPCHA"/>
+ <field name="LIMBU"/>
+ <field name="LINEAR_A"/>
+ <field name="LINEAR_B"/>
+ <field name="LISU"/>
+ <field name="LOMA"/>
+ <field name="LYCIAN"/>
+ <field name="LYDIAN"/>
+ <field name="MAHAJANI"/>
+ <field name="MALAYALAM"/>
+ <field name="MANDAEAN"/>
+ <field name="MANDAIC"/>
+ <field name="MANICHAEAN"/>
+ <field name="MARCHEN" since="26"/>
+ <field name="MATHEMATICAL_NOTATION"/>
+ <field name="MAYAN_HIEROGLYPHS"/>
+ <field name="MEITEI_MAYEK"/>
+ <field name="MENDE"/>
+ <field name="MEROITIC"/>
+ <field name="MEROITIC_CURSIVE"/>
+ <field name="MEROITIC_HIEROGLYPHS"/>
+ <field name="MIAO"/>
+ <field name="MODI"/>
+ <field name="MONGOLIAN"/>
+ <field name="MOON"/>
+ <field name="MRO"/>
+ <field name="MULTANI"/>
+ <field name="MYANMAR"/>
+ <field name="NABATAEAN"/>
+ <field name="NAKHI_GEBA"/>
+ <field name="NEWA" since="26"/>
+ <field name="NEW_TAI_LUE"/>
+ <field name="NKO"/>
+ <field name="NUSHU"/>
+ <field name="OGHAM"/>
+ <field name="OLD_CHURCH_SLAVONIC_CYRILLIC"/>
+ <field name="OLD_HUNGARIAN"/>
+ <field name="OLD_ITALIC"/>
+ <field name="OLD_NORTH_ARABIAN"/>
+ <field name="OLD_PERMIC"/>
+ <field name="OLD_PERSIAN"/>
+ <field name="OLD_SOUTH_ARABIAN"/>
+ <field name="OL_CHIKI"/>
+ <field name="ORIYA"/>
+ <field name="ORKHON"/>
+ <field name="OSAGE" since="26"/>
+ <field name="OSMANYA"/>
+ <field name="PAHAWH_HMONG"/>
+ <field name="PALMYRENE"/>
+ <field name="PAU_CIN_HAU"/>
+ <field name="PHAGS_PA"/>
+ <field name="PHOENICIAN"/>
+ <field name="PHONETIC_POLLARD"/>
+ <field name="PSALTER_PAHLAVI"/>
+ <field name="REJANG"/>
+ <field name="RONGORONGO"/>
+ <field name="RUNIC"/>
+ <field name="SAMARITAN"/>
+ <field name="SARATI"/>
+ <field name="SAURASHTRA"/>
+ <field name="SHARADA"/>
+ <field name="SHAVIAN"/>
+ <field name="SIDDHAM"/>
+ <field name="SIGN_WRITING"/>
+ <field name="SIMPLIFIED_HAN"/>
+ <field name="SINDHI"/>
+ <field name="SINHALA"/>
+ <field name="SORA_SOMPENG"/>
+ <field name="SUNDANESE"/>
+ <field name="SYLOTI_NAGRI"/>
+ <field name="SYMBOLS"/>
+ <field name="SYMBOLS_EMOJI" since="26"/>
+ <field name="SYRIAC"/>
+ <field name="TAGALOG"/>
+ <field name="TAGBANWA"/>
+ <field name="TAI_LE"/>
+ <field name="TAI_VIET"/>
+ <field name="TAKRI"/>
+ <field name="TAMIL"/>
+ <field name="TANGUT"/>
+ <field name="TELUGU"/>
+ <field name="TENGWAR"/>
+ <field name="THAANA"/>
+ <field name="THAI"/>
+ <field name="TIBETAN"/>
+ <field name="TIFINAGH"/>
+ <field name="TIRHUTA"/>
+ <field name="TRADITIONAL_HAN"/>
+ <field name="UCAS"/>
+ <field name="UGARITIC"/>
+ <field name="UNKNOWN"/>
+ <field name="UNWRITTEN_LANGUAGES"/>
+ <field name="VAI"/>
+ <field name="VISIBLE_SPEECH"/>
+ <field name="WARANG_CITI"/>
+ <field name="WESTERN_SYRIAC"/>
+ <field name="WOLEAI"/>
+ <field name="YI"/>
+ </class>
+ <class name="android/icu/lang/UScript$ScriptUsage" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/lang/UScript$ScriptUsage;"/>
+ <method name="values()[Landroid/icu/lang/UScript$ScriptUsage;"/>
+ <field name="ASPIRATIONAL"/>
+ <field name="EXCLUDED"/>
+ <field name="LIMITED_USE"/>
+ <field name="NOT_ENCODED"/>
+ <field name="RECOMMENDED"/>
+ <field name="UNKNOWN"/>
+ </class>
+ <class name="android/icu/math/BigDecimal" since="24">
+ <extends name="java/lang/Number"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>(D)V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(J)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/math/BigDecimal;)V"/>
+ <method name="&lt;init>(Ljava/math/BigInteger;)V"/>
+ <method name="&lt;init>(Ljava/math/BigInteger;I)V"/>
+ <method name="&lt;init>([C)V"/>
+ <method name="&lt;init>([CII)V"/>
+ <method name="abs()Landroid/icu/math/BigDecimal;"/>
+ <method name="abs(Landroid/icu/math/MathContext;)Landroid/icu/math/BigDecimal;"/>
+ <method name="add(Landroid/icu/math/BigDecimal;)Landroid/icu/math/BigDecimal;"/>
+ <method name="add(Landroid/icu/math/BigDecimal;Landroid/icu/math/MathContext;)Landroid/icu/math/BigDecimal;"/>
+ <method name="byteValueExact()B"/>
+ <method name="compareTo(Landroid/icu/math/BigDecimal;)I"/>
+ <method name="compareTo(Landroid/icu/math/BigDecimal;Landroid/icu/math/MathContext;)I"/>
+ <method name="divide(Landroid/icu/math/BigDecimal;)Landroid/icu/math/BigDecimal;"/>
+ <method name="divide(Landroid/icu/math/BigDecimal;I)Landroid/icu/math/BigDecimal;"/>
+ <method name="divide(Landroid/icu/math/BigDecimal;II)Landroid/icu/math/BigDecimal;"/>
+ <method name="divide(Landroid/icu/math/BigDecimal;Landroid/icu/math/MathContext;)Landroid/icu/math/BigDecimal;"/>
+ <method name="divideInteger(Landroid/icu/math/BigDecimal;)Landroid/icu/math/BigDecimal;"/>
+ <method name="divideInteger(Landroid/icu/math/BigDecimal;Landroid/icu/math/MathContext;)Landroid/icu/math/BigDecimal;"/>
+ <method name="format(II)Ljava/lang/String;"/>
+ <method name="format(IIIIII)Ljava/lang/String;"/>
+ <method name="intValueExact()I"/>
+ <method name="longValueExact()J"/>
+ <method name="max(Landroid/icu/math/BigDecimal;)Landroid/icu/math/BigDecimal;"/>
+ <method name="max(Landroid/icu/math/BigDecimal;Landroid/icu/math/MathContext;)Landroid/icu/math/BigDecimal;"/>
+ <method name="min(Landroid/icu/math/BigDecimal;)Landroid/icu/math/BigDecimal;"/>
+ <method name="min(Landroid/icu/math/BigDecimal;Landroid/icu/math/MathContext;)Landroid/icu/math/BigDecimal;"/>
+ <method name="movePointLeft(I)Landroid/icu/math/BigDecimal;"/>
+ <method name="movePointRight(I)Landroid/icu/math/BigDecimal;"/>
+ <method name="multiply(Landroid/icu/math/BigDecimal;)Landroid/icu/math/BigDecimal;"/>
+ <method name="multiply(Landroid/icu/math/BigDecimal;Landroid/icu/math/MathContext;)Landroid/icu/math/BigDecimal;"/>
+ <method name="negate()Landroid/icu/math/BigDecimal;"/>
+ <method name="negate(Landroid/icu/math/MathContext;)Landroid/icu/math/BigDecimal;"/>
+ <method name="plus()Landroid/icu/math/BigDecimal;"/>
+ <method name="plus(Landroid/icu/math/MathContext;)Landroid/icu/math/BigDecimal;"/>
+ <method name="pow(Landroid/icu/math/BigDecimal;)Landroid/icu/math/BigDecimal;"/>
+ <method name="pow(Landroid/icu/math/BigDecimal;Landroid/icu/math/MathContext;)Landroid/icu/math/BigDecimal;"/>
+ <method name="remainder(Landroid/icu/math/BigDecimal;)Landroid/icu/math/BigDecimal;"/>
+ <method name="remainder(Landroid/icu/math/BigDecimal;Landroid/icu/math/MathContext;)Landroid/icu/math/BigDecimal;"/>
+ <method name="scale()I"/>
+ <method name="setScale(I)Landroid/icu/math/BigDecimal;"/>
+ <method name="setScale(II)Landroid/icu/math/BigDecimal;"/>
+ <method name="shortValueExact()S"/>
+ <method name="signum()I"/>
+ <method name="subtract(Landroid/icu/math/BigDecimal;)Landroid/icu/math/BigDecimal;"/>
+ <method name="subtract(Landroid/icu/math/BigDecimal;Landroid/icu/math/MathContext;)Landroid/icu/math/BigDecimal;"/>
+ <method name="toBigDecimal()Ljava/math/BigDecimal;"/>
+ <method name="toBigInteger()Ljava/math/BigInteger;"/>
+ <method name="toBigIntegerExact()Ljava/math/BigInteger;"/>
+ <method name="toCharArray()[C"/>
+ <method name="unscaledValue()Ljava/math/BigInteger;"/>
+ <method name="valueOf(D)Landroid/icu/math/BigDecimal;"/>
+ <method name="valueOf(J)Landroid/icu/math/BigDecimal;"/>
+ <method name="valueOf(JI)Landroid/icu/math/BigDecimal;"/>
+ <field name="ONE"/>
+ <field name="ROUND_CEILING"/>
+ <field name="ROUND_DOWN"/>
+ <field name="ROUND_FLOOR"/>
+ <field name="ROUND_HALF_DOWN"/>
+ <field name="ROUND_HALF_EVEN"/>
+ <field name="ROUND_HALF_UP"/>
+ <field name="ROUND_UNNECESSARY"/>
+ <field name="ROUND_UP"/>
+ <field name="TEN"/>
+ <field name="ZERO"/>
+ </class>
+ <class name="android/icu/math/MathContext" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="&lt;init>(IIZ)V"/>
+ <method name="&lt;init>(IIZI)V"/>
+ <method name="getDigits()I"/>
+ <method name="getForm()I"/>
+ <method name="getLostDigits()Z"/>
+ <method name="getRoundingMode()I"/>
+ <field name="DEFAULT"/>
+ <field name="ENGINEERING"/>
+ <field name="PLAIN"/>
+ <field name="ROUND_CEILING"/>
+ <field name="ROUND_DOWN"/>
+ <field name="ROUND_FLOOR"/>
+ <field name="ROUND_HALF_DOWN"/>
+ <field name="ROUND_HALF_EVEN"/>
+ <field name="ROUND_HALF_UP"/>
+ <field name="ROUND_UNNECESSARY"/>
+ <field name="ROUND_UP"/>
+ <field name="SCIENTIFIC"/>
+ </class>
+ <class name="android/icu/text/AlphabeticIndex" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Iterable"/>
+ <method name="&lt;init>(Landroid/icu/text/RuleBasedCollator;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V"/>
+ <method name="addLabels(Landroid/icu/text/UnicodeSet;)Landroid/icu/text/AlphabeticIndex;"/>
+ <method name="addLabels([Landroid/icu/util/ULocale;)Landroid/icu/text/AlphabeticIndex;"/>
+ <method name="addLabels([Ljava/util/Locale;)Landroid/icu/text/AlphabeticIndex;"/>
+ <method name="addRecord(Ljava/lang/CharSequence;Ljava/lang/Object;)Landroid/icu/text/AlphabeticIndex;"/>
+ <method name="buildImmutableIndex()Landroid/icu/text/AlphabeticIndex$ImmutableIndex;"/>
+ <method name="clearRecords()Landroid/icu/text/AlphabeticIndex;"/>
+ <method name="getBucketCount()I"/>
+ <method name="getBucketIndex(Ljava/lang/CharSequence;)I"/>
+ <method name="getBucketLabels()Ljava/util/List;"/>
+ <method name="getCollator()Landroid/icu/text/RuleBasedCollator;"/>
+ <method name="getInflowLabel()Ljava/lang/String;"/>
+ <method name="getMaxLabelCount()I"/>
+ <method name="getOverflowLabel()Ljava/lang/String;"/>
+ <method name="getRecordCount()I"/>
+ <method name="getUnderflowLabel()Ljava/lang/String;"/>
+ <method name="setInflowLabel(Ljava/lang/String;)Landroid/icu/text/AlphabeticIndex;"/>
+ <method name="setMaxLabelCount(I)Landroid/icu/text/AlphabeticIndex;"/>
+ <method name="setOverflowLabel(Ljava/lang/String;)Landroid/icu/text/AlphabeticIndex;"/>
+ <method name="setUnderflowLabel(Ljava/lang/String;)Landroid/icu/text/AlphabeticIndex;"/>
+ </class>
+ <class name="android/icu/text/AlphabeticIndex$Bucket" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Iterable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getLabel()Ljava/lang/String;"/>
+ <method name="getLabelType()Landroid/icu/text/AlphabeticIndex$Bucket$LabelType;"/>
+ <method name="size()I"/>
+ </class>
+ <class name="android/icu/text/AlphabeticIndex$Bucket$LabelType" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/AlphabeticIndex$Bucket$LabelType;"/>
+ <method name="values()[Landroid/icu/text/AlphabeticIndex$Bucket$LabelType;"/>
+ <field name="INFLOW"/>
+ <field name="NORMAL"/>
+ <field name="OVERFLOW"/>
+ <field name="UNDERFLOW"/>
+ </class>
+ <class name="android/icu/text/AlphabeticIndex$ImmutableIndex" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Iterable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getBucket(I)Landroid/icu/text/AlphabeticIndex$Bucket;"/>
+ <method name="getBucketCount()I"/>
+ <method name="getBucketIndex(Ljava/lang/CharSequence;)I"/>
+ </class>
+ <class name="android/icu/text/AlphabeticIndex$Record" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getData()Ljava/lang/Object;"/>
+ <method name="getName()Ljava/lang/CharSequence;"/>
+ </class>
+ <class name="android/icu/text/BreakIterator" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="current()I"/>
+ <method name="first()I"/>
+ <method name="following(I)I"/>
+ <method name="getAvailableLocales()[Ljava/util/Locale;"/>
+ <method name="getCharacterInstance()Landroid/icu/text/BreakIterator;"/>
+ <method name="getCharacterInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/BreakIterator;"/>
+ <method name="getCharacterInstance(Ljava/util/Locale;)Landroid/icu/text/BreakIterator;"/>
+ <method name="getLineInstance()Landroid/icu/text/BreakIterator;"/>
+ <method name="getLineInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/BreakIterator;"/>
+ <method name="getLineInstance(Ljava/util/Locale;)Landroid/icu/text/BreakIterator;"/>
+ <method name="getRuleStatus()I"/>
+ <method name="getRuleStatusVec([I)I"/>
+ <method name="getSentenceInstance()Landroid/icu/text/BreakIterator;"/>
+ <method name="getSentenceInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/BreakIterator;"/>
+ <method name="getSentenceInstance(Ljava/util/Locale;)Landroid/icu/text/BreakIterator;"/>
+ <method name="getText()Ljava/text/CharacterIterator;"/>
+ <method name="getTitleInstance()Landroid/icu/text/BreakIterator;"/>
+ <method name="getTitleInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/BreakIterator;"/>
+ <method name="getTitleInstance(Ljava/util/Locale;)Landroid/icu/text/BreakIterator;"/>
+ <method name="getWordInstance()Landroid/icu/text/BreakIterator;"/>
+ <method name="getWordInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/BreakIterator;"/>
+ <method name="getWordInstance(Ljava/util/Locale;)Landroid/icu/text/BreakIterator;"/>
+ <method name="isBoundary(I)Z"/>
+ <method name="last()I"/>
+ <method name="next()I"/>
+ <method name="next(I)I"/>
+ <method name="preceding(I)I"/>
+ <method name="previous()I"/>
+ <method name="setText(Ljava/lang/String;)V"/>
+ <method name="setText(Ljava/text/CharacterIterator;)V"/>
+ <field name="DONE"/>
+ <field name="KIND_CHARACTER"/>
+ <field name="KIND_LINE"/>
+ <field name="KIND_SENTENCE"/>
+ <field name="KIND_TITLE"/>
+ <field name="KIND_WORD"/>
+ <field name="WORD_IDEO"/>
+ <field name="WORD_IDEO_LIMIT"/>
+ <field name="WORD_KANA"/>
+ <field name="WORD_KANA_LIMIT"/>
+ <field name="WORD_LETTER"/>
+ <field name="WORD_LETTER_LIMIT"/>
+ <field name="WORD_NONE"/>
+ <field name="WORD_NONE_LIMIT"/>
+ <field name="WORD_NUMBER"/>
+ <field name="WORD_NUMBER_LIMIT"/>
+ </class>
+ <class name="android/icu/text/CollationElementIterator" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getMaxExpansion(I)I"/>
+ <method name="getOffset()I"/>
+ <method name="next()I"/>
+ <method name="previous()I"/>
+ <method name="primaryOrder(I)I"/>
+ <method name="reset()V"/>
+ <method name="secondaryOrder(I)I"/>
+ <method name="setOffset(I)V"/>
+ <method name="setText(Landroid/icu/text/UCharacterIterator;)V"/>
+ <method name="setText(Ljava/lang/String;)V"/>
+ <method name="setText(Ljava/text/CharacterIterator;)V"/>
+ <method name="tertiaryOrder(I)I"/>
+ <field name="IGNORABLE"/>
+ <field name="NULLORDER"/>
+ </class>
+ <class name="android/icu/text/CollationKey" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>(Ljava/lang/String;[B)V"/>
+ <method name="compareTo(Landroid/icu/text/CollationKey;)I"/>
+ <method name="equals(Landroid/icu/text/CollationKey;)Z"/>
+ <method name="getBound(II)Landroid/icu/text/CollationKey;"/>
+ <method name="getSourceString()Ljava/lang/String;"/>
+ <method name="merge(Landroid/icu/text/CollationKey;)Landroid/icu/text/CollationKey;"/>
+ <method name="toByteArray()[B"/>
+ </class>
+ <class name="android/icu/text/CollationKey$BoundMode" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="LOWER"/>
+ <field name="UPPER"/>
+ <field name="UPPER_LONG"/>
+ </class>
+ <class name="android/icu/text/Collator" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/icu/util/Freezable"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="java/util/Comparator"/>
+ <method name="&lt;init>()V"/>
+ <method name="cloneAsThawed()Landroid/icu/text/Collator;"/>
+ <method name="compare(Ljava/lang/String;Ljava/lang/String;)I"/>
+ <method name="equals(Ljava/lang/String;Ljava/lang/String;)Z"/>
+ <method name="freeze()Landroid/icu/text/Collator;"/>
+ <method name="getAvailableLocales()[Ljava/util/Locale;"/>
+ <method name="getAvailableULocales()[Landroid/icu/util/ULocale;"/>
+ <method name="getCollationKey(Ljava/lang/String;)Landroid/icu/text/CollationKey;"/>
+ <method name="getDecomposition()I"/>
+ <method name="getDisplayName(Landroid/icu/util/ULocale;)Ljava/lang/String;"/>
+ <method name="getDisplayName(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)Ljava/lang/String;"/>
+ <method name="getDisplayName(Ljava/util/Locale;)Ljava/lang/String;"/>
+ <method name="getDisplayName(Ljava/util/Locale;Ljava/util/Locale;)Ljava/lang/String;"/>
+ <method name="getEquivalentReorderCodes(I)[I"/>
+ <method name="getFunctionalEquivalent(Ljava/lang/String;Landroid/icu/util/ULocale;)Landroid/icu/util/ULocale;"/>
+ <method name="getFunctionalEquivalent(Ljava/lang/String;Landroid/icu/util/ULocale;[Z)Landroid/icu/util/ULocale;"/>
+ <method name="getInstance()Landroid/icu/text/Collator;"/>
+ <method name="getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/Collator;"/>
+ <method name="getInstance(Ljava/util/Locale;)Landroid/icu/text/Collator;"/>
+ <method name="getKeywordValues(Ljava/lang/String;)[Ljava/lang/String;"/>
+ <method name="getKeywordValuesForLocale(Ljava/lang/String;Landroid/icu/util/ULocale;Z)[Ljava/lang/String;"/>
+ <method name="getKeywords()[Ljava/lang/String;"/>
+ <method name="getMaxVariable()I"/>
+ <method name="getReorderCodes()[I"/>
+ <method name="getStrength()I"/>
+ <method name="getTailoredSet()Landroid/icu/text/UnicodeSet;"/>
+ <method name="getUCAVersion()Landroid/icu/util/VersionInfo;"/>
+ <method name="getVariableTop()I"/>
+ <method name="getVersion()Landroid/icu/util/VersionInfo;"/>
+ <method name="setDecomposition(I)V"/>
+ <method name="setMaxVariable(I)Landroid/icu/text/Collator;"/>
+ <method name="setReorderCodes([I)V"/>
+ <method name="setStrength(I)V"/>
+ <field name="CANONICAL_DECOMPOSITION"/>
+ <field name="FULL_DECOMPOSITION"/>
+ <field name="IDENTICAL"/>
+ <field name="NO_DECOMPOSITION"/>
+ <field name="PRIMARY"/>
+ <field name="QUATERNARY"/>
+ <field name="SECONDARY"/>
+ <field name="TERTIARY"/>
+ </class>
+ <class name="android/icu/text/Collator$ReorderCodes" since="24">
+ <extends name="java/lang/Object"/>
+ <field name="CURRENCY"/>
+ <field name="DEFAULT"/>
+ <field name="DIGIT"/>
+ <field name="FIRST"/>
+ <field name="NONE"/>
+ <field name="OTHERS"/>
+ <field name="PUNCTUATION"/>
+ <field name="SPACE"/>
+ <field name="SYMBOL"/>
+ </class>
+ <class name="android/icu/text/CompactDecimalFormat" since="24">
+ <extends name="android/icu/text/DecimalFormat"/>
+ <method name="&lt;init>()V"/>
+ <method name="getInstance(Landroid/icu/util/ULocale;Landroid/icu/text/CompactDecimalFormat$CompactStyle;)Landroid/icu/text/CompactDecimalFormat;"/>
+ <method name="getInstance(Ljava/util/Locale;Landroid/icu/text/CompactDecimalFormat$CompactStyle;)Landroid/icu/text/CompactDecimalFormat;"/>
+ </class>
+ <class name="android/icu/text/CompactDecimalFormat$CompactStyle" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/CompactDecimalFormat$CompactStyle;"/>
+ <method name="values()[Landroid/icu/text/CompactDecimalFormat$CompactStyle;"/>
+ <field name="LONG"/>
+ <field name="SHORT"/>
+ </class>
+ <class name="android/icu/text/CurrencyPluralInfo" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V"/>
+ <method name="getCurrencyPluralPattern(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getInstance()Landroid/icu/text/CurrencyPluralInfo;"/>
+ <method name="getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/CurrencyPluralInfo;"/>
+ <method name="getInstance(Ljava/util/Locale;)Landroid/icu/text/CurrencyPluralInfo;"/>
+ <method name="getLocale()Landroid/icu/util/ULocale;"/>
+ <method name="getPluralRules()Landroid/icu/text/PluralRules;"/>
+ <method name="setCurrencyPluralPattern(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="setLocale(Landroid/icu/util/ULocale;)V"/>
+ <method name="setPluralRules(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/icu/text/DateFormat" since="24">
+ <extends name="android/icu/text/UFormat"/>
+ <method name="&lt;init>()V"/>
+ <method name="format(Landroid/icu/util/Calendar;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;"/>
+ <method name="format(Ljava/util/Date;)Ljava/lang/String;"/>
+ <method name="format(Ljava/util/Date;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;"/>
+ <method name="getAvailableLocales()[Ljava/util/Locale;"/>
+ <method name="getBooleanAttribute(Landroid/icu/text/DateFormat$BooleanAttribute;)Z"/>
+ <method name="getCalendar()Landroid/icu/util/Calendar;"/>
+ <method name="getContext(Landroid/icu/text/DisplayContext$Type;)Landroid/icu/text/DisplayContext;"/>
+ <method name="getDateInstance()Landroid/icu/text/DateFormat;"/>
+ <method name="getDateInstance(I)Landroid/icu/text/DateFormat;"/>
+ <method name="getDateInstance(ILandroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;"/>
+ <method name="getDateInstance(ILjava/util/Locale;)Landroid/icu/text/DateFormat;"/>
+ <method name="getDateInstance(Landroid/icu/util/Calendar;I)Landroid/icu/text/DateFormat;"/>
+ <method name="getDateInstance(Landroid/icu/util/Calendar;ILandroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;"/>
+ <method name="getDateInstance(Landroid/icu/util/Calendar;ILjava/util/Locale;)Landroid/icu/text/DateFormat;"/>
+ <method name="getDateTimeInstance()Landroid/icu/text/DateFormat;"/>
+ <method name="getDateTimeInstance(II)Landroid/icu/text/DateFormat;"/>
+ <method name="getDateTimeInstance(IILandroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;"/>
+ <method name="getDateTimeInstance(IILjava/util/Locale;)Landroid/icu/text/DateFormat;"/>
+ <method name="getDateTimeInstance(Landroid/icu/util/Calendar;II)Landroid/icu/text/DateFormat;"/>
+ <method name="getDateTimeInstance(Landroid/icu/util/Calendar;IILandroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;"/>
+ <method name="getDateTimeInstance(Landroid/icu/util/Calendar;IILjava/util/Locale;)Landroid/icu/text/DateFormat;"/>
+ <method name="getInstance()Landroid/icu/text/DateFormat;"/>
+ <method name="getInstance(Landroid/icu/util/Calendar;)Landroid/icu/text/DateFormat;"/>
+ <method name="getInstance(Landroid/icu/util/Calendar;Ljava/util/Locale;)Landroid/icu/text/DateFormat;"/>
+ <method name="getInstanceForSkeleton(Landroid/icu/util/Calendar;Ljava/lang/String;Landroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;"/>
+ <method name="getInstanceForSkeleton(Landroid/icu/util/Calendar;Ljava/lang/String;Ljava/util/Locale;)Landroid/icu/text/DateFormat;"/>
+ <method name="getInstanceForSkeleton(Ljava/lang/String;)Landroid/icu/text/DateFormat;"/>
+ <method name="getInstanceForSkeleton(Ljava/lang/String;Landroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;"/>
+ <method name="getInstanceForSkeleton(Ljava/lang/String;Ljava/util/Locale;)Landroid/icu/text/DateFormat;"/>
+ <method name="getNumberFormat()Landroid/icu/text/NumberFormat;"/>
+ <method name="getPatternInstance(Landroid/icu/util/Calendar;Ljava/lang/String;Landroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;"/>
+ <method name="getPatternInstance(Landroid/icu/util/Calendar;Ljava/lang/String;Ljava/util/Locale;)Landroid/icu/text/DateFormat;"/>
+ <method name="getPatternInstance(Ljava/lang/String;)Landroid/icu/text/DateFormat;"/>
+ <method name="getPatternInstance(Ljava/lang/String;Landroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;"/>
+ <method name="getPatternInstance(Ljava/lang/String;Ljava/util/Locale;)Landroid/icu/text/DateFormat;"/>
+ <method name="getTimeInstance()Landroid/icu/text/DateFormat;"/>
+ <method name="getTimeInstance(I)Landroid/icu/text/DateFormat;"/>
+ <method name="getTimeInstance(ILandroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;"/>
+ <method name="getTimeInstance(ILjava/util/Locale;)Landroid/icu/text/DateFormat;"/>
+ <method name="getTimeInstance(Landroid/icu/util/Calendar;I)Landroid/icu/text/DateFormat;"/>
+ <method name="getTimeInstance(Landroid/icu/util/Calendar;ILandroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;"/>
+ <method name="getTimeInstance(Landroid/icu/util/Calendar;ILjava/util/Locale;)Landroid/icu/text/DateFormat;"/>
+ <method name="getTimeZone()Landroid/icu/util/TimeZone;"/>
+ <method name="isCalendarLenient()Z"/>
+ <method name="isLenient()Z"/>
+ <method name="parse(Ljava/lang/String;)Ljava/util/Date;"/>
+ <method name="parse(Ljava/lang/String;Landroid/icu/util/Calendar;Ljava/text/ParsePosition;)V"/>
+ <method name="parse(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/util/Date;"/>
+ <method name="setBooleanAttribute(Landroid/icu/text/DateFormat$BooleanAttribute;Z)Landroid/icu/text/DateFormat;"/>
+ <method name="setCalendar(Landroid/icu/util/Calendar;)V"/>
+ <method name="setCalendarLenient(Z)V"/>
+ <method name="setContext(Landroid/icu/text/DisplayContext;)V"/>
+ <method name="setLenient(Z)V"/>
+ <method name="setNumberFormat(Landroid/icu/text/NumberFormat;)V"/>
+ <method name="setTimeZone(Landroid/icu/util/TimeZone;)V"/>
+ <field name="ABBR_GENERIC_TZ"/>
+ <field name="ABBR_MONTH"/>
+ <field name="ABBR_MONTH_DAY"/>
+ <field name="ABBR_MONTH_WEEKDAY_DAY"/>
+ <field name="ABBR_QUARTER"/>
+ <field name="ABBR_SPECIFIC_TZ"/>
+ <field name="ABBR_UTC_TZ"/>
+ <field name="ABBR_WEEKDAY"/>
+ <field name="AM_PM_FIELD"/>
+ <field name="AM_PM_MIDNIGHT_NOON_FIELD" since="27"/>
+ <field name="DATE_FIELD"/>
+ <field name="DAY"/>
+ <field name="DAY_OF_WEEK_FIELD"/>
+ <field name="DAY_OF_WEEK_IN_MONTH_FIELD"/>
+ <field name="DAY_OF_YEAR_FIELD"/>
+ <field name="DEFAULT"/>
+ <field name="DOW_LOCAL_FIELD"/>
+ <field name="ERA_FIELD"/>
+ <field name="EXTENDED_YEAR_FIELD"/>
+ <field name="FLEXIBLE_DAY_PERIOD_FIELD" since="27"/>
+ <field name="FRACTIONAL_SECOND_FIELD"/>
+ <field name="FULL"/>
+ <field name="GENERIC_TZ"/>
+ <field name="HOUR"/>
+ <field name="HOUR0_FIELD"/>
+ <field name="HOUR1_FIELD"/>
+ <field name="HOUR24"/>
+ <field name="HOUR24_MINUTE"/>
+ <field name="HOUR24_MINUTE_SECOND"/>
+ <field name="HOUR_MINUTE"/>
+ <field name="HOUR_MINUTE_SECOND"/>
+ <field name="HOUR_OF_DAY0_FIELD"/>
+ <field name="HOUR_OF_DAY1_FIELD"/>
+ <field name="JULIAN_DAY_FIELD"/>
+ <field name="LOCATION_TZ"/>
+ <field name="LONG"/>
+ <field name="MEDIUM"/>
+ <field name="MILLISECONDS_IN_DAY_FIELD"/>
+ <field name="MILLISECOND_FIELD"/>
+ <field name="MINUTE"/>
+ <field name="MINUTE_FIELD"/>
+ <field name="MINUTE_SECOND"/>
+ <field name="MONTH"/>
+ <field name="MONTH_DAY"/>
+ <field name="MONTH_FIELD"/>
+ <field name="MONTH_WEEKDAY_DAY"/>
+ <field name="NONE"/>
+ <field name="NUM_MONTH"/>
+ <field name="NUM_MONTH_DAY"/>
+ <field name="NUM_MONTH_WEEKDAY_DAY"/>
+ <field name="QUARTER"/>
+ <field name="QUARTER_FIELD"/>
+ <field name="RELATIVE"/>
+ <field name="RELATIVE_DEFAULT"/>
+ <field name="RELATIVE_FULL"/>
+ <field name="RELATIVE_LONG"/>
+ <field name="RELATIVE_MEDIUM"/>
+ <field name="RELATIVE_SHORT"/>
+ <field name="SECOND"/>
+ <field name="SECOND_FIELD"/>
+ <field name="SHORT"/>
+ <field name="SPECIFIC_TZ"/>
+ <field name="STANDALONE_DAY_FIELD"/>
+ <field name="STANDALONE_MONTH_FIELD"/>
+ <field name="STANDALONE_QUARTER_FIELD"/>
+ <field name="TIMEZONE_FIELD"/>
+ <field name="TIMEZONE_GENERIC_FIELD"/>
+ <field name="TIMEZONE_ISO_FIELD"/>
+ <field name="TIMEZONE_ISO_LOCAL_FIELD"/>
+ <field name="TIMEZONE_LOCALIZED_GMT_OFFSET_FIELD"/>
+ <field name="TIMEZONE_RFC_FIELD"/>
+ <field name="TIMEZONE_SPECIAL_FIELD"/>
+ <field name="WEEKDAY"/>
+ <field name="WEEK_OF_MONTH_FIELD"/>
+ <field name="WEEK_OF_YEAR_FIELD"/>
+ <field name="YEAR"/>
+ <field name="YEAR_ABBR_MONTH"/>
+ <field name="YEAR_ABBR_MONTH_DAY"/>
+ <field name="YEAR_ABBR_MONTH_WEEKDAY_DAY"/>
+ <field name="YEAR_ABBR_QUARTER"/>
+ <field name="YEAR_FIELD"/>
+ <field name="YEAR_MONTH"/>
+ <field name="YEAR_MONTH_DAY"/>
+ <field name="YEAR_MONTH_WEEKDAY_DAY"/>
+ <field name="YEAR_NAME_FIELD"/>
+ <field name="YEAR_NUM_MONTH"/>
+ <field name="YEAR_NUM_MONTH_DAY"/>
+ <field name="YEAR_NUM_MONTH_WEEKDAY_DAY"/>
+ <field name="YEAR_QUARTER"/>
+ <field name="YEAR_WOY_FIELD"/>
+ <field name="calendar"/>
+ <field name="numberFormat"/>
+ </class>
+ <class name="android/icu/text/DateFormat$BooleanAttribute" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/DateFormat$BooleanAttribute;"/>
+ <method name="values()[Landroid/icu/text/DateFormat$BooleanAttribute;"/>
+ <field name="PARSE_ALLOW_NUMERIC"/>
+ <field name="PARSE_ALLOW_WHITESPACE"/>
+ <field name="PARSE_MULTIPLE_PATTERNS_FOR_MATCH" since="26"/>
+ <field name="PARSE_PARTIAL_LITERAL_MATCH" since="26"/>
+ </class>
+ <class name="android/icu/text/DateFormat$Field" since="24">
+ <extends name="java/text/Format$Field"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="getCalendarField()I"/>
+ <method name="ofCalendarField(I)Landroid/icu/text/DateFormat$Field;"/>
+ <field name="AM_PM"/>
+ <field name="AM_PM_MIDNIGHT_NOON" since="27"/>
+ <field name="DAY_OF_MONTH"/>
+ <field name="DAY_OF_WEEK"/>
+ <field name="DAY_OF_WEEK_IN_MONTH"/>
+ <field name="DAY_OF_YEAR"/>
+ <field name="DOW_LOCAL"/>
+ <field name="ERA"/>
+ <field name="EXTENDED_YEAR"/>
+ <field name="FLEXIBLE_DAY_PERIOD" since="27"/>
+ <field name="HOUR0"/>
+ <field name="HOUR1"/>
+ <field name="HOUR_OF_DAY0"/>
+ <field name="HOUR_OF_DAY1"/>
+ <field name="JULIAN_DAY"/>
+ <field name="MILLISECOND"/>
+ <field name="MILLISECONDS_IN_DAY"/>
+ <field name="MINUTE"/>
+ <field name="MONTH"/>
+ <field name="QUARTER"/>
+ <field name="SECOND"/>
+ <field name="TIME_ZONE"/>
+ <field name="WEEK_OF_MONTH"/>
+ <field name="WEEK_OF_YEAR"/>
+ <field name="YEAR"/>
+ <field name="YEAR_WOY"/>
+ </class>
+ <class name="android/icu/text/DateFormatSymbols" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/icu/util/Calendar;Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/Calendar;Ljava/util/Locale;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Ljava/lang/Class;Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Ljava/lang/Class;Ljava/util/Locale;)V"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V"/>
+ <method name="&lt;init>(Ljava/util/ResourceBundle;Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Ljava/util/ResourceBundle;Ljava/util/Locale;)V"/>
+ <method name="getAmPmStrings()[Ljava/lang/String;"/>
+ <method name="getAvailableLocales()[Ljava/util/Locale;"/>
+ <method name="getEraNames()[Ljava/lang/String;"/>
+ <method name="getEras()[Ljava/lang/String;"/>
+ <method name="getInstance()Landroid/icu/text/DateFormatSymbols;"/>
+ <method name="getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/DateFormatSymbols;"/>
+ <method name="getInstance(Ljava/util/Locale;)Landroid/icu/text/DateFormatSymbols;"/>
+ <method name="getLocalPatternChars()Ljava/lang/String;"/>
+ <method name="getMonths()[Ljava/lang/String;"/>
+ <method name="getMonths(II)[Ljava/lang/String;"/>
+ <method name="getQuarters(II)[Ljava/lang/String;"/>
+ <method name="getShortMonths()[Ljava/lang/String;"/>
+ <method name="getShortWeekdays()[Ljava/lang/String;"/>
+ <method name="getWeekdays()[Ljava/lang/String;"/>
+ <method name="getWeekdays(II)[Ljava/lang/String;"/>
+ <method name="getYearNames(II)[Ljava/lang/String;"/>
+ <method name="getZodiacNames(II)[Ljava/lang/String;"/>
+ <method name="getZoneStrings()[[Ljava/lang/String;"/>
+ <method name="initializeData(Landroid/icu/util/ULocale;Ljava/lang/String;)V"/>
+ <method name="setAmPmStrings([Ljava/lang/String;)V"/>
+ <method name="setEraNames([Ljava/lang/String;)V"/>
+ <method name="setEras([Ljava/lang/String;)V"/>
+ <method name="setLocalPatternChars(Ljava/lang/String;)V"/>
+ <method name="setMonths([Ljava/lang/String;)V"/>
+ <method name="setMonths([Ljava/lang/String;II)V"/>
+ <method name="setQuarters([Ljava/lang/String;II)V"/>
+ <method name="setShortMonths([Ljava/lang/String;)V"/>
+ <method name="setShortWeekdays([Ljava/lang/String;)V"/>
+ <method name="setWeekdays([Ljava/lang/String;)V"/>
+ <method name="setWeekdays([Ljava/lang/String;II)V"/>
+ <method name="setYearNames([Ljava/lang/String;II)V"/>
+ <method name="setZodiacNames([Ljava/lang/String;II)V"/>
+ <method name="setZoneStrings([[Ljava/lang/String;)V"/>
+ <field name="ABBREVIATED"/>
+ <field name="FORMAT"/>
+ <field name="NARROW"/>
+ <field name="SHORT"/>
+ <field name="STANDALONE"/>
+ <field name="WIDE"/>
+ </class>
+ <class name="android/icu/text/DateIntervalFormat" since="24">
+ <extends name="android/icu/text/UFormat"/>
+ <method name="&lt;init>()V"/>
+ <method name="format(Landroid/icu/util/Calendar;Landroid/icu/util/Calendar;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;"/>
+ <method name="format(Landroid/icu/util/DateInterval;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;"/>
+ <method name="getDateFormat()Landroid/icu/text/DateFormat;"/>
+ <method name="getDateIntervalInfo()Landroid/icu/text/DateIntervalInfo;"/>
+ <method name="getInstance(Ljava/lang/String;)Landroid/icu/text/DateIntervalFormat;"/>
+ <method name="getInstance(Ljava/lang/String;Landroid/icu/text/DateIntervalInfo;)Landroid/icu/text/DateIntervalFormat;"/>
+ <method name="getInstance(Ljava/lang/String;Landroid/icu/util/ULocale;)Landroid/icu/text/DateIntervalFormat;"/>
+ <method name="getInstance(Ljava/lang/String;Landroid/icu/util/ULocale;Landroid/icu/text/DateIntervalInfo;)Landroid/icu/text/DateIntervalFormat;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/util/Locale;)Landroid/icu/text/DateIntervalFormat;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/util/Locale;Landroid/icu/text/DateIntervalInfo;)Landroid/icu/text/DateIntervalFormat;"/>
+ <method name="getTimeZone()Landroid/icu/util/TimeZone;"/>
+ <method name="setDateIntervalInfo(Landroid/icu/text/DateIntervalInfo;)V"/>
+ <method name="setTimeZone(Landroid/icu/util/TimeZone;)V"/>
+ </class>
+ <class name="android/icu/text/DateIntervalInfo" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/icu/util/Freezable"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>(Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V"/>
+ <method name="cloneAsThawed()Landroid/icu/text/DateIntervalInfo;"/>
+ <method name="freeze()Landroid/icu/text/DateIntervalInfo;"/>
+ <method name="getDefaultOrder()Z"/>
+ <method name="getFallbackIntervalPattern()Ljava/lang/String;"/>
+ <method name="getIntervalPattern(Ljava/lang/String;I)Landroid/icu/text/DateIntervalInfo$PatternInfo;"/>
+ <method name="setFallbackIntervalPattern(Ljava/lang/String;)V"/>
+ <method name="setIntervalPattern(Ljava/lang/String;ILjava/lang/String;)V"/>
+ </class>
+ <class name="android/icu/text/DateIntervalInfo$PatternInfo" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Z)V"/>
+ <method name="firstDateInPtnIsLaterDate()Z"/>
+ <method name="getFirstPart()Ljava/lang/String;"/>
+ <method name="getSecondPart()Ljava/lang/String;"/>
+ </class>
+ <class name="android/icu/text/DateTimePatternGenerator" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/icu/util/Freezable"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="addPattern(Ljava/lang/String;ZLandroid/icu/text/DateTimePatternGenerator$PatternInfo;)Landroid/icu/text/DateTimePatternGenerator;"/>
+ <method name="cloneAsThawed()Landroid/icu/text/DateTimePatternGenerator;"/>
+ <method name="freeze()Landroid/icu/text/DateTimePatternGenerator;"/>
+ <method name="getAppendItemFormat(I)Ljava/lang/String;"/>
+ <method name="getAppendItemName(I)Ljava/lang/String;"/>
+ <method name="getBaseSkeleton(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getBaseSkeletons(Ljava/util/Set;)Ljava/util/Set;"/>
+ <method name="getBestPattern(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getBestPattern(Ljava/lang/String;I)Ljava/lang/String;"/>
+ <method name="getDateTimeFormat()Ljava/lang/String;"/>
+ <method name="getDecimal()Ljava/lang/String;"/>
+ <method name="getEmptyInstance()Landroid/icu/text/DateTimePatternGenerator;"/>
+ <method name="getInstance()Landroid/icu/text/DateTimePatternGenerator;"/>
+ <method name="getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/DateTimePatternGenerator;"/>
+ <method name="getInstance(Ljava/util/Locale;)Landroid/icu/text/DateTimePatternGenerator;"/>
+ <method name="getSkeleton(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getSkeletons(Ljava/util/Map;)Ljava/util/Map;"/>
+ <method name="replaceFieldTypes(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="replaceFieldTypes(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;"/>
+ <method name="setAppendItemFormat(ILjava/lang/String;)V"/>
+ <method name="setAppendItemName(ILjava/lang/String;)V"/>
+ <method name="setDateTimeFormat(Ljava/lang/String;)V"/>
+ <method name="setDecimal(Ljava/lang/String;)V"/>
+ <field name="DAY"/>
+ <field name="DAYPERIOD"/>
+ <field name="DAY_OF_WEEK_IN_MONTH"/>
+ <field name="DAY_OF_YEAR"/>
+ <field name="ERA"/>
+ <field name="FRACTIONAL_SECOND"/>
+ <field name="HOUR"/>
+ <field name="MATCH_ALL_FIELDS_LENGTH"/>
+ <field name="MATCH_HOUR_FIELD_LENGTH"/>
+ <field name="MATCH_NO_OPTIONS"/>
+ <field name="MINUTE"/>
+ <field name="MONTH"/>
+ <field name="QUARTER"/>
+ <field name="SECOND"/>
+ <field name="WEEKDAY"/>
+ <field name="WEEK_OF_MONTH"/>
+ <field name="WEEK_OF_YEAR"/>
+ <field name="YEAR"/>
+ <field name="ZONE"/>
+ </class>
+ <class name="android/icu/text/DateTimePatternGenerator$PatternInfo" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="BASE_CONFLICT"/>
+ <field name="CONFLICT"/>
+ <field name="OK"/>
+ <field name="conflictingPattern"/>
+ <field name="status"/>
+ </class>
+ <class name="android/icu/text/DecimalFormat" since="24">
+ <extends name="android/icu/text/NumberFormat"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Landroid/icu/text/DecimalFormatSymbols;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/text/CurrencyPluralInfo;I)V"/>
+ <method name="applyLocalizedPattern(Ljava/lang/String;)V"/>
+ <method name="applyPattern(Ljava/lang/String;)V"/>
+ <method name="areSignificantDigitsUsed()Z"/>
+ <method name="getCurrencyPluralInfo()Landroid/icu/text/CurrencyPluralInfo;"/>
+ <method name="getCurrencyUsage()Landroid/icu/util/Currency$CurrencyUsage;"/>
+ <method name="getDecimalFormatSymbols()Landroid/icu/text/DecimalFormatSymbols;"/>
+ <method name="getFormatWidth()I"/>
+ <method name="getGroupingSize()I"/>
+ <method name="getMathContext()Ljava/math/MathContext;"/>
+ <method name="getMathContextICU()Landroid/icu/math/MathContext;"/>
+ <method name="getMaximumSignificantDigits()I"/>
+ <method name="getMinimumExponentDigits()B"/>
+ <method name="getMinimumSignificantDigits()I"/>
+ <method name="getMultiplier()I"/>
+ <method name="getNegativePrefix()Ljava/lang/String;"/>
+ <method name="getNegativeSuffix()Ljava/lang/String;"/>
+ <method name="getPadCharacter()C"/>
+ <method name="getPadPosition()I"/>
+ <method name="getParseMaxDigits()I" deprecated="27"/>
+ <method name="getPositivePrefix()Ljava/lang/String;"/>
+ <method name="getPositiveSuffix()Ljava/lang/String;"/>
+ <method name="getRoundingIncrement()Ljava/math/BigDecimal;"/>
+ <method name="getSecondaryGroupingSize()I"/>
+ <method name="isDecimalPatternMatchRequired()Z"/>
+ <method name="isDecimalSeparatorAlwaysShown()Z"/>
+ <method name="isExponentSignAlwaysShown()Z"/>
+ <method name="isParseBigDecimal()Z"/>
+ <method name="isScientificNotation()Z"/>
+ <method name="setCurrencyPluralInfo(Landroid/icu/text/CurrencyPluralInfo;)V"/>
+ <method name="setCurrencyUsage(Landroid/icu/util/Currency$CurrencyUsage;)V"/>
+ <method name="setDecimalFormatSymbols(Landroid/icu/text/DecimalFormatSymbols;)V"/>
+ <method name="setDecimalPatternMatchRequired(Z)V"/>
+ <method name="setDecimalSeparatorAlwaysShown(Z)V"/>
+ <method name="setExponentSignAlwaysShown(Z)V"/>
+ <method name="setFormatWidth(I)V"/>
+ <method name="setGroupingSize(I)V"/>
+ <method name="setMathContext(Ljava/math/MathContext;)V"/>
+ <method name="setMathContextICU(Landroid/icu/math/MathContext;)V"/>
+ <method name="setMaximumSignificantDigits(I)V"/>
+ <method name="setMinimumExponentDigits(B)V"/>
+ <method name="setMinimumSignificantDigits(I)V"/>
+ <method name="setMultiplier(I)V"/>
+ <method name="setNegativePrefix(Ljava/lang/String;)V"/>
+ <method name="setNegativeSuffix(Ljava/lang/String;)V"/>
+ <method name="setPadCharacter(C)V"/>
+ <method name="setPadPosition(I)V"/>
+ <method name="setParseBigDecimal(Z)V"/>
+ <method name="setParseMaxDigits(I)V" deprecated="27"/>
+ <method name="setPositivePrefix(Ljava/lang/String;)V"/>
+ <method name="setPositiveSuffix(Ljava/lang/String;)V"/>
+ <method name="setRoundingIncrement(D)V"/>
+ <method name="setRoundingIncrement(Landroid/icu/math/BigDecimal;)V"/>
+ <method name="setRoundingIncrement(Ljava/math/BigDecimal;)V"/>
+ <method name="setScientificNotation(Z)V"/>
+ <method name="setSecondaryGroupingSize(I)V"/>
+ <method name="setSignificantDigitsUsed(Z)V"/>
+ <method name="toLocalizedPattern()Ljava/lang/String;"/>
+ <method name="toPattern()Ljava/lang/String;"/>
+ <field name="PAD_AFTER_PREFIX"/>
+ <field name="PAD_AFTER_SUFFIX"/>
+ <field name="PAD_BEFORE_PREFIX"/>
+ <field name="PAD_BEFORE_SUFFIX"/>
+ </class>
+ <class name="android/icu/text/DecimalFormatSymbols" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V"/>
+ <method name="getAvailableLocales()[Ljava/util/Locale;"/>
+ <method name="getCurrency()Landroid/icu/util/Currency;"/>
+ <method name="getCurrencySymbol()Ljava/lang/String;"/>
+ <method name="getDecimalSeparator()C"/>
+ <method name="getDigit()C"/>
+ <method name="getDigits()[C"/>
+ <method name="getExponentMultiplicationSign()Ljava/lang/String;"/>
+ <method name="getExponentSeparator()Ljava/lang/String;"/>
+ <method name="getGroupingSeparator()C"/>
+ <method name="getInfinity()Ljava/lang/String;"/>
+ <method name="getInstance()Landroid/icu/text/DecimalFormatSymbols;"/>
+ <method name="getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/DecimalFormatSymbols;"/>
+ <method name="getInstance(Ljava/util/Locale;)Landroid/icu/text/DecimalFormatSymbols;"/>
+ <method name="getInternationalCurrencySymbol()Ljava/lang/String;"/>
+ <method name="getLocale()Ljava/util/Locale;"/>
+ <method name="getMinusSign()C"/>
+ <method name="getMonetaryDecimalSeparator()C"/>
+ <method name="getMonetaryGroupingSeparator()C"/>
+ <method name="getNaN()Ljava/lang/String;"/>
+ <method name="getPadEscape()C"/>
+ <method name="getPatternForCurrencySpacing(IZ)Ljava/lang/String;"/>
+ <method name="getPatternSeparator()C"/>
+ <method name="getPerMill()C"/>
+ <method name="getPercent()C"/>
+ <method name="getPlusSign()C"/>
+ <method name="getSignificantDigit()C"/>
+ <method name="getULocale()Landroid/icu/util/ULocale;"/>
+ <method name="getZeroDigit()C"/>
+ <method name="setCurrency(Landroid/icu/util/Currency;)V"/>
+ <method name="setCurrencySymbol(Ljava/lang/String;)V"/>
+ <method name="setDecimalSeparator(C)V"/>
+ <method name="setDigit(C)V"/>
+ <method name="setExponentMultiplicationSign(Ljava/lang/String;)V"/>
+ <method name="setExponentSeparator(Ljava/lang/String;)V"/>
+ <method name="setGroupingSeparator(C)V"/>
+ <method name="setInfinity(Ljava/lang/String;)V"/>
+ <method name="setInternationalCurrencySymbol(Ljava/lang/String;)V"/>
+ <method name="setMinusSign(C)V"/>
+ <method name="setMonetaryDecimalSeparator(C)V"/>
+ <method name="setMonetaryGroupingSeparator(C)V"/>
+ <method name="setNaN(Ljava/lang/String;)V"/>
+ <method name="setPadEscape(C)V"/>
+ <method name="setPatternForCurrencySpacing(IZLjava/lang/String;)V"/>
+ <method name="setPatternSeparator(C)V"/>
+ <method name="setPerMill(C)V"/>
+ <method name="setPercent(C)V"/>
+ <method name="setPlusSign(C)V"/>
+ <method name="setSignificantDigit(C)V"/>
+ <method name="setZeroDigit(C)V"/>
+ <field name="CURRENCY_SPC_CURRENCY_MATCH"/>
+ <field name="CURRENCY_SPC_INSERT"/>
+ <field name="CURRENCY_SPC_SURROUNDING_MATCH"/>
+ </class>
+ <class name="android/icu/text/DisplayContext" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="type()Landroid/icu/text/DisplayContext$Type;"/>
+ <method name="value()I"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/DisplayContext;"/>
+ <method name="values()[Landroid/icu/text/DisplayContext;"/>
+ <field name="CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE"/>
+ <field name="CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE"/>
+ <field name="CAPITALIZATION_FOR_STANDALONE"/>
+ <field name="CAPITALIZATION_FOR_UI_LIST_OR_MENU"/>
+ <field name="CAPITALIZATION_NONE"/>
+ <field name="DIALECT_NAMES"/>
+ <field name="LENGTH_FULL"/>
+ <field name="LENGTH_SHORT"/>
+ <field name="STANDARD_NAMES"/>
+ </class>
+ <class name="android/icu/text/DisplayContext$Type" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/DisplayContext$Type;"/>
+ <method name="values()[Landroid/icu/text/DisplayContext$Type;"/>
+ <field name="CAPITALIZATION"/>
+ <field name="DIALECT_HANDLING"/>
+ <field name="DISPLAY_LENGTH"/>
+ </class>
+ <class name="android/icu/text/IDNA" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getUTS46Instance(I)Landroid/icu/text/IDNA;"/>
+ <method name="labelToASCII(Ljava/lang/CharSequence;Ljava/lang/StringBuilder;Landroid/icu/text/IDNA$Info;)Ljava/lang/StringBuilder;"/>
+ <method name="labelToUnicode(Ljava/lang/CharSequence;Ljava/lang/StringBuilder;Landroid/icu/text/IDNA$Info;)Ljava/lang/StringBuilder;"/>
+ <method name="nameToASCII(Ljava/lang/CharSequence;Ljava/lang/StringBuilder;Landroid/icu/text/IDNA$Info;)Ljava/lang/StringBuilder;"/>
+ <method name="nameToUnicode(Ljava/lang/CharSequence;Ljava/lang/StringBuilder;Landroid/icu/text/IDNA$Info;)Ljava/lang/StringBuilder;"/>
+ <field name="CHECK_BIDI"/>
+ <field name="CHECK_CONTEXTJ"/>
+ <field name="CHECK_CONTEXTO"/>
+ <field name="DEFAULT"/>
+ <field name="NONTRANSITIONAL_TO_ASCII"/>
+ <field name="NONTRANSITIONAL_TO_UNICODE"/>
+ <field name="USE_STD3_RULES"/>
+ </class>
+ <class name="android/icu/text/IDNA$Error" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/IDNA$Error;"/>
+ <method name="values()[Landroid/icu/text/IDNA$Error;"/>
+ <field name="BIDI"/>
+ <field name="CONTEXTJ"/>
+ <field name="CONTEXTO_DIGITS"/>
+ <field name="CONTEXTO_PUNCTUATION"/>
+ <field name="DISALLOWED"/>
+ <field name="DOMAIN_NAME_TOO_LONG"/>
+ <field name="EMPTY_LABEL"/>
+ <field name="HYPHEN_3_4"/>
+ <field name="INVALID_ACE_LABEL"/>
+ <field name="LABEL_HAS_DOT"/>
+ <field name="LABEL_TOO_LONG"/>
+ <field name="LEADING_COMBINING_MARK"/>
+ <field name="LEADING_HYPHEN"/>
+ <field name="PUNYCODE"/>
+ <field name="TRAILING_HYPHEN"/>
+ </class>
+ <class name="android/icu/text/IDNA$Info" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getErrors()Ljava/util/Set;"/>
+ <method name="hasErrors()Z"/>
+ <method name="isTransitionalDifferent()Z"/>
+ </class>
+ <class name="android/icu/text/ListFormatter" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="format(Ljava/util/Collection;)Ljava/lang/String;"/>
+ <method name="format([Ljava/lang/Object;)Ljava/lang/String;"/>
+ <method name="getInstance()Landroid/icu/text/ListFormatter;"/>
+ <method name="getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/ListFormatter;"/>
+ <method name="getInstance(Ljava/util/Locale;)Landroid/icu/text/ListFormatter;"/>
+ <method name="getPatternForNumItems(I)Ljava/lang/String;"/>
+ </class>
+ <class name="android/icu/text/LocaleDisplayNames" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getContext(Landroid/icu/text/DisplayContext$Type;)Landroid/icu/text/DisplayContext;"/>
+ <method name="getDialectHandling()Landroid/icu/text/LocaleDisplayNames$DialectHandling;"/>
+ <method name="getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/LocaleDisplayNames;"/>
+ <method name="getInstance(Landroid/icu/util/ULocale;Landroid/icu/text/LocaleDisplayNames$DialectHandling;)Landroid/icu/text/LocaleDisplayNames;"/>
+ <method name="getInstance(Landroid/icu/util/ULocale;[Landroid/icu/text/DisplayContext;)Landroid/icu/text/LocaleDisplayNames;"/>
+ <method name="getInstance(Ljava/util/Locale;)Landroid/icu/text/LocaleDisplayNames;"/>
+ <method name="getInstance(Ljava/util/Locale;[Landroid/icu/text/DisplayContext;)Landroid/icu/text/LocaleDisplayNames;"/>
+ <method name="getLocale()Landroid/icu/util/ULocale;"/>
+ <method name="getUiList(Ljava/util/Set;ZLjava/util/Comparator;)Ljava/util/List;" since="26"/>
+ <method name="getUiListCompareWholeItems(Ljava/util/Set;Ljava/util/Comparator;)Ljava/util/List;" since="26"/>
+ <method name="keyDisplayName(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="keyValueDisplayName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="languageDisplayName(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="localeDisplayName(Landroid/icu/util/ULocale;)Ljava/lang/String;"/>
+ <method name="localeDisplayName(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="localeDisplayName(Ljava/util/Locale;)Ljava/lang/String;"/>
+ <method name="regionDisplayName(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="scriptDisplayName(I)Ljava/lang/String;"/>
+ <method name="scriptDisplayName(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="variantDisplayName(Ljava/lang/String;)Ljava/lang/String;"/>
+ </class>
+ <class name="android/icu/text/LocaleDisplayNames$DialectHandling" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/LocaleDisplayNames$DialectHandling;"/>
+ <method name="values()[Landroid/icu/text/LocaleDisplayNames$DialectHandling;"/>
+ <field name="DIALECT_NAMES"/>
+ <field name="STANDARD_NAMES"/>
+ </class>
+ <class name="android/icu/text/LocaleDisplayNames$UiListItem" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="getComparator(Ljava/util/Comparator;Z)Ljava/util/Comparator;"/>
+ <field name="minimized"/>
+ <field name="modified"/>
+ <field name="nameInDisplayLocale"/>
+ <field name="nameInSelf"/>
+ </class>
+ <class name="android/icu/text/MeasureFormat" since="24">
+ <extends name="android/icu/text/UFormat"/>
+ <method name="&lt;init>()V"/>
+ <method name="formatMeasurePerUnit(Landroid/icu/util/Measure;Landroid/icu/util/MeasureUnit;Ljava/lang/StringBuilder;Ljava/text/FieldPosition;)Ljava/lang/StringBuilder;" since="26"/>
+ <method name="formatMeasures(Ljava/lang/StringBuilder;Ljava/text/FieldPosition;[Landroid/icu/util/Measure;)Ljava/lang/StringBuilder;"/>
+ <method name="formatMeasures([Landroid/icu/util/Measure;)Ljava/lang/String;"/>
+ <method name="getCurrencyFormat()Landroid/icu/text/MeasureFormat;"/>
+ <method name="getCurrencyFormat(Landroid/icu/util/ULocale;)Landroid/icu/text/MeasureFormat;"/>
+ <method name="getCurrencyFormat(Ljava/util/Locale;)Landroid/icu/text/MeasureFormat;"/>
+ <method name="getInstance(Landroid/icu/util/ULocale;Landroid/icu/text/MeasureFormat$FormatWidth;)Landroid/icu/text/MeasureFormat;"/>
+ <method name="getInstance(Landroid/icu/util/ULocale;Landroid/icu/text/MeasureFormat$FormatWidth;Landroid/icu/text/NumberFormat;)Landroid/icu/text/MeasureFormat;"/>
+ <method name="getInstance(Ljava/util/Locale;Landroid/icu/text/MeasureFormat$FormatWidth;)Landroid/icu/text/MeasureFormat;"/>
+ <method name="getInstance(Ljava/util/Locale;Landroid/icu/text/MeasureFormat$FormatWidth;Landroid/icu/text/NumberFormat;)Landroid/icu/text/MeasureFormat;"/>
+ <method name="getLocale()Landroid/icu/util/ULocale;"/>
+ <method name="getNumberFormat()Landroid/icu/text/NumberFormat;"/>
+ <method name="getWidth()Landroid/icu/text/MeasureFormat$FormatWidth;"/>
+ <method name="parseObject(Ljava/lang/String;Ljava/text/ParsePosition;)Landroid/icu/util/Measure;"/>
+ </class>
+ <class name="android/icu/text/MeasureFormat$FormatWidth" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/MeasureFormat$FormatWidth;"/>
+ <method name="values()[Landroid/icu/text/MeasureFormat$FormatWidth;"/>
+ <field name="NARROW"/>
+ <field name="NUMERIC"/>
+ <field name="SHORT"/>
+ <field name="WIDE"/>
+ </class>
+ <class name="android/icu/text/MessageFormat" since="24">
+ <extends name="android/icu/text/UFormat"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/util/Locale;)V"/>
+ <method name="applyPattern(Ljava/lang/String;)V"/>
+ <method name="applyPattern(Ljava/lang/String;Landroid/icu/text/MessagePattern$ApostropheMode;)V"/>
+ <method name="autoQuoteApostrophe(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="format(Ljava/lang/String;Ljava/util/Map;)Ljava/lang/String;"/>
+ <method name="format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;"/>
+ <method name="format(Ljava/util/Map;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;"/>
+ <method name="format([Ljava/lang/Object;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;"/>
+ <method name="getApostropheMode()Landroid/icu/text/MessagePattern$ApostropheMode;"/>
+ <method name="getArgumentNames()Ljava/util/Set;"/>
+ <method name="getFormatByArgumentName(Ljava/lang/String;)Ljava/text/Format;"/>
+ <method name="getFormats()[Ljava/text/Format;"/>
+ <method name="getFormatsByArgumentIndex()[Ljava/text/Format;"/>
+ <method name="getLocale()Ljava/util/Locale;"/>
+ <method name="getULocale()Landroid/icu/util/ULocale;"/>
+ <method name="parse(Ljava/lang/String;)[Ljava/lang/Object;"/>
+ <method name="parse(Ljava/lang/String;Ljava/text/ParsePosition;)[Ljava/lang/Object;"/>
+ <method name="parseToMap(Ljava/lang/String;)Ljava/util/Map;"/>
+ <method name="parseToMap(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/util/Map;"/>
+ <method name="setFormat(ILjava/text/Format;)V"/>
+ <method name="setFormatByArgumentIndex(ILjava/text/Format;)V"/>
+ <method name="setFormatByArgumentName(Ljava/lang/String;Ljava/text/Format;)V"/>
+ <method name="setFormats([Ljava/text/Format;)V"/>
+ <method name="setFormatsByArgumentIndex([Ljava/text/Format;)V"/>
+ <method name="setFormatsByArgumentName(Ljava/util/Map;)V"/>
+ <method name="setLocale(Landroid/icu/util/ULocale;)V"/>
+ <method name="setLocale(Ljava/util/Locale;)V"/>
+ <method name="toPattern()Ljava/lang/String;"/>
+ <method name="usesNamedArguments()Z"/>
+ </class>
+ <class name="android/icu/text/MessageFormat$Field" since="24">
+ <extends name="java/text/Format$Field"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <field name="ARGUMENT"/>
+ </class>
+ <class name="android/icu/text/MessagePattern" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/icu/util/Freezable"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/icu/text/MessagePattern$ApostropheMode;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="autoQuoteApostropheDeep()Ljava/lang/String;"/>
+ <method name="clear()V"/>
+ <method name="clearPatternAndSetApostropheMode(Landroid/icu/text/MessagePattern$ApostropheMode;)V"/>
+ <method name="cloneAsThawed()Landroid/icu/text/MessagePattern;"/>
+ <method name="countParts()I"/>
+ <method name="freeze()Landroid/icu/text/MessagePattern;"/>
+ <method name="getApostropheMode()Landroid/icu/text/MessagePattern$ApostropheMode;"/>
+ <method name="getLimitPartIndex(I)I"/>
+ <method name="getNumericValue(Landroid/icu/text/MessagePattern$Part;)D"/>
+ <method name="getPart(I)Landroid/icu/text/MessagePattern$Part;"/>
+ <method name="getPartType(I)Landroid/icu/text/MessagePattern$Part$Type;"/>
+ <method name="getPatternIndex(I)I"/>
+ <method name="getPatternString()Ljava/lang/String;"/>
+ <method name="getPluralOffset(I)D"/>
+ <method name="getSubstring(Landroid/icu/text/MessagePattern$Part;)Ljava/lang/String;"/>
+ <method name="hasNamedArguments()Z"/>
+ <method name="hasNumberedArguments()Z"/>
+ <method name="parse(Ljava/lang/String;)Landroid/icu/text/MessagePattern;"/>
+ <method name="parseChoiceStyle(Ljava/lang/String;)Landroid/icu/text/MessagePattern;"/>
+ <method name="parsePluralStyle(Ljava/lang/String;)Landroid/icu/text/MessagePattern;"/>
+ <method name="parseSelectStyle(Ljava/lang/String;)Landroid/icu/text/MessagePattern;"/>
+ <method name="partSubstringMatches(Landroid/icu/text/MessagePattern$Part;Ljava/lang/String;)Z"/>
+ <method name="validateArgumentName(Ljava/lang/String;)I"/>
+ <field name="ARG_NAME_NOT_NUMBER"/>
+ <field name="ARG_NAME_NOT_VALID"/>
+ <field name="NO_NUMERIC_VALUE"/>
+ </class>
+ <class name="android/icu/text/MessagePattern$ApostropheMode" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/MessagePattern$ApostropheMode;"/>
+ <method name="values()[Landroid/icu/text/MessagePattern$ApostropheMode;"/>
+ <field name="DOUBLE_OPTIONAL"/>
+ <field name="DOUBLE_REQUIRED"/>
+ </class>
+ <class name="android/icu/text/MessagePattern$ArgType" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="hasPluralStyle()Z"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/MessagePattern$ArgType;"/>
+ <method name="values()[Landroid/icu/text/MessagePattern$ArgType;"/>
+ <field name="CHOICE"/>
+ <field name="NONE"/>
+ <field name="PLURAL"/>
+ <field name="SELECT"/>
+ <field name="SELECTORDINAL"/>
+ <field name="SIMPLE"/>
+ </class>
+ <class name="android/icu/text/MessagePattern$Part" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getArgType()Landroid/icu/text/MessagePattern$ArgType;"/>
+ <method name="getIndex()I"/>
+ <method name="getLength()I"/>
+ <method name="getLimit()I"/>
+ <method name="getType()Landroid/icu/text/MessagePattern$Part$Type;"/>
+ <method name="getValue()I"/>
+ </class>
+ <class name="android/icu/text/MessagePattern$Part$Type" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="hasNumericValue()Z"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/MessagePattern$Part$Type;"/>
+ <method name="values()[Landroid/icu/text/MessagePattern$Part$Type;"/>
+ <field name="ARG_DOUBLE"/>
+ <field name="ARG_INT"/>
+ <field name="ARG_LIMIT"/>
+ <field name="ARG_NAME"/>
+ <field name="ARG_NUMBER"/>
+ <field name="ARG_SELECTOR"/>
+ <field name="ARG_START"/>
+ <field name="ARG_STYLE"/>
+ <field name="ARG_TYPE"/>
+ <field name="INSERT_CHAR"/>
+ <field name="MSG_LIMIT"/>
+ <field name="MSG_START"/>
+ <field name="REPLACE_NUMBER"/>
+ <field name="SKIP_SYNTAX"/>
+ </class>
+ <class name="android/icu/text/Normalizer" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="compare(III)I"/>
+ <method name="compare(ILjava/lang/String;I)I"/>
+ <method name="compare(Ljava/lang/String;Ljava/lang/String;I)I"/>
+ <method name="compare([CII[CIII)I"/>
+ <method name="compare([C[CI)I"/>
+ <field name="COMPARE_CODE_POINT_ORDER"/>
+ <field name="COMPARE_IGNORE_CASE"/>
+ <field name="FOLD_CASE_DEFAULT"/>
+ <field name="FOLD_CASE_EXCLUDE_SPECIAL_I"/>
+ <field name="INPUT_IS_FCD"/>
+ <field name="MAYBE"/>
+ <field name="NO"/>
+ <field name="YES"/>
+ </class>
+ <class name="android/icu/text/Normalizer$QuickCheckResult" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/icu/text/Normalizer2" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="append(Ljava/lang/StringBuilder;Ljava/lang/CharSequence;)Ljava/lang/StringBuilder;"/>
+ <method name="composePair(II)I"/>
+ <method name="getCombiningClass(I)I"/>
+ <method name="getDecomposition(I)Ljava/lang/String;"/>
+ <method name="getInstance(Ljava/io/InputStream;Ljava/lang/String;Landroid/icu/text/Normalizer2$Mode;)Landroid/icu/text/Normalizer2;"/>
+ <method name="getNFCInstance()Landroid/icu/text/Normalizer2;"/>
+ <method name="getNFDInstance()Landroid/icu/text/Normalizer2;"/>
+ <method name="getNFKCCasefoldInstance()Landroid/icu/text/Normalizer2;"/>
+ <method name="getNFKCInstance()Landroid/icu/text/Normalizer2;"/>
+ <method name="getNFKDInstance()Landroid/icu/text/Normalizer2;"/>
+ <method name="getRawDecomposition(I)Ljava/lang/String;"/>
+ <method name="hasBoundaryAfter(I)Z"/>
+ <method name="hasBoundaryBefore(I)Z"/>
+ <method name="isInert(I)Z"/>
+ <method name="isNormalized(Ljava/lang/CharSequence;)Z"/>
+ <method name="normalize(Ljava/lang/CharSequence;)Ljava/lang/String;"/>
+ <method name="normalize(Ljava/lang/CharSequence;Ljava/lang/Appendable;)Ljava/lang/Appendable;"/>
+ <method name="normalize(Ljava/lang/CharSequence;Ljava/lang/StringBuilder;)Ljava/lang/StringBuilder;"/>
+ <method name="normalizeSecondAndAppend(Ljava/lang/StringBuilder;Ljava/lang/CharSequence;)Ljava/lang/StringBuilder;"/>
+ <method name="quickCheck(Ljava/lang/CharSequence;)Landroid/icu/text/Normalizer$QuickCheckResult;"/>
+ <method name="spanQuickCheckYes(Ljava/lang/CharSequence;)I"/>
+ </class>
+ <class name="android/icu/text/Normalizer2$Mode" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/Normalizer2$Mode;"/>
+ <method name="values()[Landroid/icu/text/Normalizer2$Mode;"/>
+ <field name="COMPOSE"/>
+ <field name="COMPOSE_CONTIGUOUS"/>
+ <field name="DECOMPOSE"/>
+ <field name="FCD"/>
+ </class>
+ <class name="android/icu/text/NumberFormat" since="24">
+ <extends name="android/icu/text/UFormat"/>
+ <method name="&lt;init>()V"/>
+ <method name="format(D)Ljava/lang/String;"/>
+ <method name="format(DLjava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;"/>
+ <method name="format(J)Ljava/lang/String;"/>
+ <method name="format(JLjava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;"/>
+ <method name="format(Landroid/icu/math/BigDecimal;)Ljava/lang/String;"/>
+ <method name="format(Landroid/icu/math/BigDecimal;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;"/>
+ <method name="format(Landroid/icu/util/CurrencyAmount;)Ljava/lang/String;"/>
+ <method name="format(Landroid/icu/util/CurrencyAmount;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;"/>
+ <method name="format(Ljava/math/BigDecimal;)Ljava/lang/String;"/>
+ <method name="format(Ljava/math/BigDecimal;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;"/>
+ <method name="format(Ljava/math/BigInteger;)Ljava/lang/String;"/>
+ <method name="format(Ljava/math/BigInteger;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;"/>
+ <method name="getAvailableLocales()[Ljava/util/Locale;"/>
+ <method name="getContext(Landroid/icu/text/DisplayContext$Type;)Landroid/icu/text/DisplayContext;"/>
+ <method name="getCurrency()Landroid/icu/util/Currency;"/>
+ <method name="getCurrencyInstance()Landroid/icu/text/NumberFormat;"/>
+ <method name="getCurrencyInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/NumberFormat;"/>
+ <method name="getCurrencyInstance(Ljava/util/Locale;)Landroid/icu/text/NumberFormat;"/>
+ <method name="getInstance()Landroid/icu/text/NumberFormat;"/>
+ <method name="getInstance(I)Landroid/icu/text/NumberFormat;"/>
+ <method name="getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/NumberFormat;"/>
+ <method name="getInstance(Landroid/icu/util/ULocale;I)Landroid/icu/text/NumberFormat;"/>
+ <method name="getInstance(Ljava/util/Locale;)Landroid/icu/text/NumberFormat;"/>
+ <method name="getInstance(Ljava/util/Locale;I)Landroid/icu/text/NumberFormat;"/>
+ <method name="getIntegerInstance()Landroid/icu/text/NumberFormat;"/>
+ <method name="getIntegerInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/NumberFormat;"/>
+ <method name="getIntegerInstance(Ljava/util/Locale;)Landroid/icu/text/NumberFormat;"/>
+ <method name="getMaximumFractionDigits()I"/>
+ <method name="getMaximumIntegerDigits()I"/>
+ <method name="getMinimumFractionDigits()I"/>
+ <method name="getMinimumIntegerDigits()I"/>
+ <method name="getNumberInstance()Landroid/icu/text/NumberFormat;"/>
+ <method name="getNumberInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/NumberFormat;"/>
+ <method name="getNumberInstance(Ljava/util/Locale;)Landroid/icu/text/NumberFormat;"/>
+ <method name="getPattern(Landroid/icu/util/ULocale;I)Ljava/lang/String;"/>
+ <method name="getPercentInstance()Landroid/icu/text/NumberFormat;"/>
+ <method name="getPercentInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/NumberFormat;"/>
+ <method name="getPercentInstance(Ljava/util/Locale;)Landroid/icu/text/NumberFormat;"/>
+ <method name="getRoundingMode()I"/>
+ <method name="getScientificInstance()Landroid/icu/text/NumberFormat;"/>
+ <method name="getScientificInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/NumberFormat;"/>
+ <method name="getScientificInstance(Ljava/util/Locale;)Landroid/icu/text/NumberFormat;"/>
+ <method name="isGroupingUsed()Z"/>
+ <method name="isParseIntegerOnly()Z"/>
+ <method name="isParseStrict()Z"/>
+ <method name="parse(Ljava/lang/String;)Ljava/lang/Number;"/>
+ <method name="parse(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/lang/Number;"/>
+ <method name="parseCurrency(Ljava/lang/CharSequence;Ljava/text/ParsePosition;)Landroid/icu/util/CurrencyAmount;"/>
+ <method name="setContext(Landroid/icu/text/DisplayContext;)V"/>
+ <method name="setCurrency(Landroid/icu/util/Currency;)V"/>
+ <method name="setGroupingUsed(Z)V"/>
+ <method name="setMaximumFractionDigits(I)V"/>
+ <method name="setMaximumIntegerDigits(I)V"/>
+ <method name="setMinimumFractionDigits(I)V"/>
+ <method name="setMinimumIntegerDigits(I)V"/>
+ <method name="setParseIntegerOnly(Z)V"/>
+ <method name="setParseStrict(Z)V"/>
+ <method name="setRoundingMode(I)V"/>
+ <field name="ACCOUNTINGCURRENCYSTYLE"/>
+ <field name="CASHCURRENCYSTYLE"/>
+ <field name="CURRENCYSTYLE"/>
+ <field name="FRACTION_FIELD"/>
+ <field name="INTEGERSTYLE"/>
+ <field name="INTEGER_FIELD"/>
+ <field name="ISOCURRENCYSTYLE"/>
+ <field name="NUMBERSTYLE"/>
+ <field name="PERCENTSTYLE"/>
+ <field name="PLURALCURRENCYSTYLE"/>
+ <field name="SCIENTIFICSTYLE"/>
+ <field name="STANDARDCURRENCYSTYLE" since="26"/>
+ </class>
+ <class name="android/icu/text/NumberFormat$Field" since="24">
+ <extends name="java/text/Format$Field"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <field name="CURRENCY"/>
+ <field name="DECIMAL_SEPARATOR"/>
+ <field name="EXPONENT"/>
+ <field name="EXPONENT_SIGN"/>
+ <field name="EXPONENT_SYMBOL"/>
+ <field name="FRACTION"/>
+ <field name="GROUPING_SEPARATOR"/>
+ <field name="INTEGER"/>
+ <field name="PERCENT"/>
+ <field name="PERMILLE"/>
+ <field name="SIGN"/>
+ </class>
+ <class name="android/icu/text/NumberingSystem" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAvailableNames()[Ljava/lang/String;"/>
+ <method name="getDescription()Ljava/lang/String;"/>
+ <method name="getInstance()Landroid/icu/text/NumberingSystem;"/>
+ <method name="getInstance(IZLjava/lang/String;)Landroid/icu/text/NumberingSystem;"/>
+ <method name="getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/NumberingSystem;"/>
+ <method name="getInstance(Ljava/util/Locale;)Landroid/icu/text/NumberingSystem;"/>
+ <method name="getInstanceByName(Ljava/lang/String;)Landroid/icu/text/NumberingSystem;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getRadix()I"/>
+ <method name="isAlgorithmic()Z"/>
+ <method name="isValidDigitString(Ljava/lang/String;)Z"/>
+ </class>
+ <class name="android/icu/text/PluralFormat" since="24">
+ <extends name="android/icu/text/UFormat"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/icu/text/PluralRules;)V"/>
+ <method name="&lt;init>(Landroid/icu/text/PluralRules;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/ULocale;Landroid/icu/text/PluralRules$PluralType;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/ULocale;Landroid/icu/text/PluralRules$PluralType;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/ULocale;Landroid/icu/text/PluralRules;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/ULocale;Landroid/icu/text/PluralRules;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/ULocale;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V"/>
+ <method name="&lt;init>(Ljava/util/Locale;Landroid/icu/text/PluralRules$PluralType;)V"/>
+ <method name="&lt;init>(Ljava/util/Locale;Landroid/icu/text/PluralRules;)V"/>
+ <method name="applyPattern(Ljava/lang/String;)V"/>
+ <method name="equals(Landroid/icu/text/PluralFormat;)Z"/>
+ <method name="format(D)Ljava/lang/String;"/>
+ <method name="parse(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/lang/Number;"/>
+ <method name="setNumberFormat(Landroid/icu/text/NumberFormat;)V"/>
+ <method name="toPattern()Ljava/lang/String;"/>
+ </class>
+ <class name="android/icu/text/PluralRules" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="createRules(Ljava/lang/String;)Landroid/icu/text/PluralRules;"/>
+ <method name="equals(Landroid/icu/text/PluralRules;)Z"/>
+ <method name="forLocale(Landroid/icu/util/ULocale;)Landroid/icu/text/PluralRules;"/>
+ <method name="forLocale(Landroid/icu/util/ULocale;Landroid/icu/text/PluralRules$PluralType;)Landroid/icu/text/PluralRules;"/>
+ <method name="forLocale(Ljava/util/Locale;)Landroid/icu/text/PluralRules;"/>
+ <method name="forLocale(Ljava/util/Locale;Landroid/icu/text/PluralRules$PluralType;)Landroid/icu/text/PluralRules;"/>
+ <method name="getAllKeywordValues(Ljava/lang/String;)Ljava/util/Collection;"/>
+ <method name="getKeywords()Ljava/util/Set;"/>
+ <method name="getSamples(Ljava/lang/String;)Ljava/util/Collection;"/>
+ <method name="getUniqueKeywordValue(Ljava/lang/String;)D"/>
+ <method name="parseDescription(Ljava/lang/String;)Landroid/icu/text/PluralRules;"/>
+ <method name="select(D)Ljava/lang/String;"/>
+ <field name="DEFAULT"/>
+ <field name="KEYWORD_FEW"/>
+ <field name="KEYWORD_MANY"/>
+ <field name="KEYWORD_ONE"/>
+ <field name="KEYWORD_OTHER"/>
+ <field name="KEYWORD_TWO"/>
+ <field name="KEYWORD_ZERO"/>
+ <field name="NO_UNIQUE_VALUE"/>
+ </class>
+ <class name="android/icu/text/PluralRules$PluralType" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/PluralRules$PluralType;"/>
+ <method name="values()[Landroid/icu/text/PluralRules$PluralType;"/>
+ <field name="CARDINAL"/>
+ <field name="ORDINAL"/>
+ </class>
+ <class name="android/icu/text/RelativeDateTimeFormatter" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="combineDateAndTime(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="format(DLandroid/icu/text/RelativeDateTimeFormatter$Direction;Landroid/icu/text/RelativeDateTimeFormatter$RelativeUnit;)Ljava/lang/String;"/>
+ <method name="format(DLandroid/icu/text/RelativeDateTimeFormatter$RelativeDateTimeUnit;)Ljava/lang/String;" since="27"/>
+ <method name="format(Landroid/icu/text/RelativeDateTimeFormatter$Direction;Landroid/icu/text/RelativeDateTimeFormatter$AbsoluteUnit;)Ljava/lang/String;"/>
+ <method name="formatNumeric(DLandroid/icu/text/RelativeDateTimeFormatter$RelativeDateTimeUnit;)Ljava/lang/String;" since="27"/>
+ <method name="getCapitalizationContext()Landroid/icu/text/DisplayContext;"/>
+ <method name="getFormatStyle()Landroid/icu/text/RelativeDateTimeFormatter$Style;"/>
+ <method name="getInstance()Landroid/icu/text/RelativeDateTimeFormatter;"/>
+ <method name="getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/RelativeDateTimeFormatter;"/>
+ <method name="getInstance(Landroid/icu/util/ULocale;Landroid/icu/text/NumberFormat;)Landroid/icu/text/RelativeDateTimeFormatter;"/>
+ <method name="getInstance(Landroid/icu/util/ULocale;Landroid/icu/text/NumberFormat;Landroid/icu/text/RelativeDateTimeFormatter$Style;Landroid/icu/text/DisplayContext;)Landroid/icu/text/RelativeDateTimeFormatter;"/>
+ <method name="getInstance(Ljava/util/Locale;)Landroid/icu/text/RelativeDateTimeFormatter;"/>
+ <method name="getInstance(Ljava/util/Locale;Landroid/icu/text/NumberFormat;)Landroid/icu/text/RelativeDateTimeFormatter;"/>
+ <method name="getNumberFormat()Landroid/icu/text/NumberFormat;"/>
+ </class>
+ <class name="android/icu/text/RelativeDateTimeFormatter$AbsoluteUnit" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/RelativeDateTimeFormatter$AbsoluteUnit;"/>
+ <method name="values()[Landroid/icu/text/RelativeDateTimeFormatter$AbsoluteUnit;"/>
+ <field name="DAY"/>
+ <field name="FRIDAY"/>
+ <field name="MONDAY"/>
+ <field name="MONTH"/>
+ <field name="NOW"/>
+ <field name="SATURDAY"/>
+ <field name="SUNDAY"/>
+ <field name="THURSDAY"/>
+ <field name="TUESDAY"/>
+ <field name="WEDNESDAY"/>
+ <field name="WEEK"/>
+ <field name="YEAR"/>
+ </class>
+ <class name="android/icu/text/RelativeDateTimeFormatter$Direction" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/RelativeDateTimeFormatter$Direction;"/>
+ <method name="values()[Landroid/icu/text/RelativeDateTimeFormatter$Direction;"/>
+ <field name="LAST"/>
+ <field name="LAST_2"/>
+ <field name="NEXT"/>
+ <field name="NEXT_2"/>
+ <field name="PLAIN"/>
+ <field name="THIS"/>
+ </class>
+ <class name="android/icu/text/RelativeDateTimeFormatter$RelativeDateTimeUnit" since="27">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/RelativeDateTimeFormatter$RelativeDateTimeUnit;"/>
+ <method name="values()[Landroid/icu/text/RelativeDateTimeFormatter$RelativeDateTimeUnit;"/>
+ <field name="DAY"/>
+ <field name="FRIDAY"/>
+ <field name="HOUR"/>
+ <field name="MINUTE"/>
+ <field name="MONDAY"/>
+ <field name="MONTH"/>
+ <field name="QUARTER"/>
+ <field name="SATURDAY"/>
+ <field name="SECOND"/>
+ <field name="SUNDAY"/>
+ <field name="THURSDAY"/>
+ <field name="TUESDAY"/>
+ <field name="WEDNESDAY"/>
+ <field name="WEEK"/>
+ <field name="YEAR"/>
+ </class>
+ <class name="android/icu/text/RelativeDateTimeFormatter$RelativeUnit" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/RelativeDateTimeFormatter$RelativeUnit;"/>
+ <method name="values()[Landroid/icu/text/RelativeDateTimeFormatter$RelativeUnit;"/>
+ <field name="DAYS"/>
+ <field name="HOURS"/>
+ <field name="MINUTES"/>
+ <field name="MONTHS"/>
+ <field name="SECONDS"/>
+ <field name="WEEKS"/>
+ <field name="YEARS"/>
+ </class>
+ <class name="android/icu/text/RelativeDateTimeFormatter$Style" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/RelativeDateTimeFormatter$Style;"/>
+ <method name="values()[Landroid/icu/text/RelativeDateTimeFormatter$Style;"/>
+ <field name="LONG"/>
+ <field name="NARROW"/>
+ <field name="SHORT"/>
+ </class>
+ <class name="android/icu/text/Replaceable" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="char32At(I)I"/>
+ <method name="charAt(I)C"/>
+ <method name="copy(III)V"/>
+ <method name="getChars(II[CI)V"/>
+ <method name="hasMetaData()Z"/>
+ <method name="length()I"/>
+ <method name="replace(IILjava/lang/String;)V"/>
+ <method name="replace(II[CII)V"/>
+ </class>
+ <class name="android/icu/text/RuleBasedCollator" since="24">
+ <extends name="android/icu/text/Collator"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="cloneAsThawed()Landroid/icu/text/RuleBasedCollator;"/>
+ <method name="getCollationElementIterator(Landroid/icu/text/UCharacterIterator;)Landroid/icu/text/CollationElementIterator;"/>
+ <method name="getCollationElementIterator(Ljava/lang/String;)Landroid/icu/text/CollationElementIterator;"/>
+ <method name="getCollationElementIterator(Ljava/text/CharacterIterator;)Landroid/icu/text/CollationElementIterator;"/>
+ <method name="getContractionsAndExpansions(Landroid/icu/text/UnicodeSet;Landroid/icu/text/UnicodeSet;Z)V"/>
+ <method name="getNumericCollation()Z"/>
+ <method name="getRules()Ljava/lang/String;"/>
+ <method name="getRules(Z)Ljava/lang/String;"/>
+ <method name="isAlternateHandlingShifted()Z"/>
+ <method name="isCaseLevel()Z"/>
+ <method name="isFrenchCollation()Z"/>
+ <method name="isLowerCaseFirst()Z"/>
+ <method name="isUpperCaseFirst()Z"/>
+ <method name="setAlternateHandlingDefault()V"/>
+ <method name="setAlternateHandlingShifted(Z)V"/>
+ <method name="setCaseFirstDefault()V"/>
+ <method name="setCaseLevel(Z)V"/>
+ <method name="setCaseLevelDefault()V"/>
+ <method name="setDecompositionDefault()V"/>
+ <method name="setFrenchCollation(Z)V"/>
+ <method name="setFrenchCollationDefault()V"/>
+ <method name="setLowerCaseFirst(Z)V"/>
+ <method name="setMaxVariable(I)Landroid/icu/text/RuleBasedCollator;"/>
+ <method name="setNumericCollation(Z)V"/>
+ <method name="setNumericCollationDefault()V"/>
+ <method name="setStrengthDefault()V"/>
+ <method name="setUpperCaseFirst(Z)V"/>
+ </class>
+ <class name="android/icu/text/ScientificNumberFormatter" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="format(Ljava/lang/Object;)Ljava/lang/String;"/>
+ <method name="getMarkupInstance(Landroid/icu/text/DecimalFormat;Ljava/lang/String;Ljava/lang/String;)Landroid/icu/text/ScientificNumberFormatter;"/>
+ <method name="getMarkupInstance(Landroid/icu/util/ULocale;Ljava/lang/String;Ljava/lang/String;)Landroid/icu/text/ScientificNumberFormatter;"/>
+ <method name="getSuperscriptInstance(Landroid/icu/text/DecimalFormat;)Landroid/icu/text/ScientificNumberFormatter;"/>
+ <method name="getSuperscriptInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/ScientificNumberFormatter;"/>
+ </class>
+ <class name="android/icu/text/SearchIterator" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/text/CharacterIterator;Landroid/icu/text/BreakIterator;)V"/>
+ <method name="first()I"/>
+ <method name="following(I)I"/>
+ <method name="getBreakIterator()Landroid/icu/text/BreakIterator;"/>
+ <method name="getElementComparisonType()Landroid/icu/text/SearchIterator$ElementComparisonType;"/>
+ <method name="getIndex()I"/>
+ <method name="getMatchLength()I"/>
+ <method name="getMatchStart()I"/>
+ <method name="getMatchedText()Ljava/lang/String;"/>
+ <method name="getTarget()Ljava/text/CharacterIterator;"/>
+ <method name="handleNext(I)I"/>
+ <method name="handlePrevious(I)I"/>
+ <method name="isOverlapping()Z"/>
+ <method name="last()I"/>
+ <method name="next()I"/>
+ <method name="preceding(I)I"/>
+ <method name="previous()I"/>
+ <method name="reset()V"/>
+ <method name="setBreakIterator(Landroid/icu/text/BreakIterator;)V"/>
+ <method name="setElementComparisonType(Landroid/icu/text/SearchIterator$ElementComparisonType;)V"/>
+ <method name="setIndex(I)V"/>
+ <method name="setMatchLength(I)V"/>
+ <method name="setOverlapping(Z)V"/>
+ <method name="setTarget(Ljava/text/CharacterIterator;)V"/>
+ <field name="DONE"/>
+ <field name="breakIterator"/>
+ <field name="matchLength"/>
+ <field name="targetText"/>
+ </class>
+ <class name="android/icu/text/SearchIterator$ElementComparisonType" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/SearchIterator$ElementComparisonType;"/>
+ <method name="values()[Landroid/icu/text/SearchIterator$ElementComparisonType;"/>
+ <field name="ANY_BASE_WEIGHT_IS_WILDCARD"/>
+ <field name="PATTERN_BASE_WEIGHT_IS_WILDCARD"/>
+ <field name="STANDARD_ELEMENT_COMPARISON"/>
+ </class>
+ <class name="android/icu/text/SelectFormat" since="24">
+ <extends name="java/text/Format"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="applyPattern(Ljava/lang/String;)V"/>
+ <method name="format(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="toPattern()Ljava/lang/String;"/>
+ </class>
+ <class name="android/icu/text/SimpleDateFormat" since="24">
+ <extends name="android/icu/text/DateFormat"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Landroid/icu/text/DateFormatSymbols;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/util/Locale;)V"/>
+ <method name="applyLocalizedPattern(Ljava/lang/String;)V"/>
+ <method name="applyPattern(Ljava/lang/String;)V"/>
+ <method name="get2DigitYearStart()Ljava/util/Date;"/>
+ <method name="getDateFormatSymbols()Landroid/icu/text/DateFormatSymbols;"/>
+ <method name="getNumberFormat(C)Landroid/icu/text/NumberFormat;"/>
+ <method name="getSymbols()Landroid/icu/text/DateFormatSymbols;"/>
+ <method name="getTimeZoneFormat()Landroid/icu/text/TimeZoneFormat;"/>
+ <method name="matchQuarterString(Ljava/lang/String;II[Ljava/lang/String;Landroid/icu/util/Calendar;)I"/>
+ <method name="matchString(Ljava/lang/String;II[Ljava/lang/String;Landroid/icu/util/Calendar;)I"/>
+ <method name="patternCharToDateFormatField(C)Landroid/icu/text/DateFormat$Field;"/>
+ <method name="set2DigitYearStart(Ljava/util/Date;)V"/>
+ <method name="setDateFormatSymbols(Landroid/icu/text/DateFormatSymbols;)V"/>
+ <method name="setNumberFormat(Ljava/lang/String;Landroid/icu/text/NumberFormat;)V"/>
+ <method name="setTimeZoneFormat(Landroid/icu/text/TimeZoneFormat;)V"/>
+ <method name="subFormat(CIILjava/text/FieldPosition;Landroid/icu/text/DateFormatSymbols;Landroid/icu/util/Calendar;)Ljava/lang/String;"/>
+ <method name="subParse(Ljava/lang/String;ICIZZ[ZLandroid/icu/util/Calendar;)I"/>
+ <method name="toLocalizedPattern()Ljava/lang/String;"/>
+ <method name="toPattern()Ljava/lang/String;"/>
+ <method name="zeroPaddingNumber(JII)Ljava/lang/String;"/>
+ </class>
+ <class name="android/icu/text/StringPrepParseException" since="24">
+ <extends name="java/text/ParseException"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;ILjava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;ILjava/lang/String;II)V"/>
+ <method name="getError()I"/>
+ <field name="ACE_PREFIX_ERROR"/>
+ <field name="BUFFER_OVERFLOW_ERROR"/>
+ <field name="CHECK_BIDI_ERROR"/>
+ <field name="DOMAIN_NAME_TOO_LONG_ERROR"/>
+ <field name="ILLEGAL_CHAR_FOUND"/>
+ <field name="INVALID_CHAR_FOUND"/>
+ <field name="LABEL_TOO_LONG_ERROR"/>
+ <field name="PROHIBITED_ERROR"/>
+ <field name="STD3_ASCII_RULES_ERROR"/>
+ <field name="UNASSIGNED_ERROR"/>
+ <field name="VERIFICATION_ERROR"/>
+ <field name="ZERO_LENGTH_LABEL"/>
+ </class>
+ <class name="android/icu/text/StringSearch" since="24">
+ <extends name="android/icu/text/SearchIterator"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/text/CharacterIterator;Landroid/icu/text/RuleBasedCollator;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/text/CharacterIterator;Landroid/icu/text/RuleBasedCollator;Landroid/icu/text/BreakIterator;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/text/CharacterIterator;Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/text/CharacterIterator;Ljava/util/Locale;)V"/>
+ <method name="getCollator()Landroid/icu/text/RuleBasedCollator;"/>
+ <method name="getPattern()Ljava/lang/String;"/>
+ <method name="isCanonical()Z"/>
+ <method name="setCanonical(Z)V"/>
+ <method name="setCollator(Landroid/icu/text/RuleBasedCollator;)V"/>
+ <method name="setPattern(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/icu/text/SymbolTable" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="lookup(Ljava/lang/String;)[C"/>
+ <method name="lookupMatcher(I)Landroid/icu/text/UnicodeMatcher;"/>
+ <method name="parseReference(Ljava/lang/String;Ljava/text/ParsePosition;I)Ljava/lang/String;"/>
+ <field name="SYMBOL_REF"/>
+ </class>
+ <class name="android/icu/text/TimeZoneFormat" since="24">
+ <extends name="android/icu/text/UFormat"/>
+ <implements name="android/icu/util/Freezable"/>
+ <method name="&lt;init>(Landroid/icu/util/ULocale;)V"/>
+ <method name="cloneAsThawed()Landroid/icu/text/TimeZoneFormat;"/>
+ <method name="format(Landroid/icu/text/TimeZoneFormat$Style;Landroid/icu/util/TimeZone;J)Ljava/lang/String;"/>
+ <method name="format(Landroid/icu/text/TimeZoneFormat$Style;Landroid/icu/util/TimeZone;JLandroid/icu/util/Output;)Ljava/lang/String;"/>
+ <method name="formatOffsetISO8601Basic(IZZZ)Ljava/lang/String;"/>
+ <method name="formatOffsetISO8601Extended(IZZZ)Ljava/lang/String;"/>
+ <method name="formatOffsetLocalizedGMT(I)Ljava/lang/String;"/>
+ <method name="formatOffsetShortLocalizedGMT(I)Ljava/lang/String;"/>
+ <method name="freeze()Landroid/icu/text/TimeZoneFormat;"/>
+ <method name="getDefaultParseOptions()Ljava/util/EnumSet;"/>
+ <method name="getGMTOffsetDigits()Ljava/lang/String;"/>
+ <method name="getGMTOffsetPattern(Landroid/icu/text/TimeZoneFormat$GMTOffsetPatternType;)Ljava/lang/String;"/>
+ <method name="getGMTPattern()Ljava/lang/String;"/>
+ <method name="getGMTZeroFormat()Ljava/lang/String;"/>
+ <method name="getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/TimeZoneFormat;"/>
+ <method name="getInstance(Ljava/util/Locale;)Landroid/icu/text/TimeZoneFormat;"/>
+ <method name="getTimeZoneNames()Landroid/icu/text/TimeZoneNames;"/>
+ <method name="parse(Landroid/icu/text/TimeZoneFormat$Style;Ljava/lang/String;Ljava/text/ParsePosition;Landroid/icu/util/Output;)Landroid/icu/util/TimeZone;"/>
+ <method name="parse(Landroid/icu/text/TimeZoneFormat$Style;Ljava/lang/String;Ljava/text/ParsePosition;Ljava/util/EnumSet;Landroid/icu/util/Output;)Landroid/icu/util/TimeZone;"/>
+ <method name="parse(Ljava/lang/String;)Landroid/icu/util/TimeZone;"/>
+ <method name="parse(Ljava/lang/String;Ljava/text/ParsePosition;)Landroid/icu/util/TimeZone;"/>
+ <method name="parseOffsetISO8601(Ljava/lang/String;Ljava/text/ParsePosition;)I"/>
+ <method name="parseOffsetLocalizedGMT(Ljava/lang/String;Ljava/text/ParsePosition;)I"/>
+ <method name="parseOffsetShortLocalizedGMT(Ljava/lang/String;Ljava/text/ParsePosition;)I"/>
+ <method name="setDefaultParseOptions(Ljava/util/EnumSet;)Landroid/icu/text/TimeZoneFormat;"/>
+ <method name="setGMTOffsetDigits(Ljava/lang/String;)Landroid/icu/text/TimeZoneFormat;"/>
+ <method name="setGMTOffsetPattern(Landroid/icu/text/TimeZoneFormat$GMTOffsetPatternType;Ljava/lang/String;)Landroid/icu/text/TimeZoneFormat;"/>
+ <method name="setGMTPattern(Ljava/lang/String;)Landroid/icu/text/TimeZoneFormat;"/>
+ <method name="setGMTZeroFormat(Ljava/lang/String;)Landroid/icu/text/TimeZoneFormat;"/>
+ <method name="setTimeZoneNames(Landroid/icu/text/TimeZoneNames;)Landroid/icu/text/TimeZoneFormat;"/>
+ </class>
+ <class name="android/icu/text/TimeZoneFormat$GMTOffsetPatternType" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/TimeZoneFormat$GMTOffsetPatternType;"/>
+ <method name="values()[Landroid/icu/text/TimeZoneFormat$GMTOffsetPatternType;"/>
+ <field name="NEGATIVE_H"/>
+ <field name="NEGATIVE_HM"/>
+ <field name="NEGATIVE_HMS"/>
+ <field name="POSITIVE_H"/>
+ <field name="POSITIVE_HM"/>
+ <field name="POSITIVE_HMS"/>
+ </class>
+ <class name="android/icu/text/TimeZoneFormat$ParseOption" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/TimeZoneFormat$ParseOption;"/>
+ <method name="values()[Landroid/icu/text/TimeZoneFormat$ParseOption;"/>
+ <field name="ALL_STYLES"/>
+ <field name="TZ_DATABASE_ABBREVIATIONS"/>
+ </class>
+ <class name="android/icu/text/TimeZoneFormat$Style" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/TimeZoneFormat$Style;"/>
+ <method name="values()[Landroid/icu/text/TimeZoneFormat$Style;"/>
+ <field name="EXEMPLAR_LOCATION"/>
+ <field name="GENERIC_LOCATION"/>
+ <field name="GENERIC_LONG"/>
+ <field name="GENERIC_SHORT"/>
+ <field name="ISO_BASIC_FIXED"/>
+ <field name="ISO_BASIC_FULL"/>
+ <field name="ISO_BASIC_LOCAL_FIXED"/>
+ <field name="ISO_BASIC_LOCAL_FULL"/>
+ <field name="ISO_BASIC_LOCAL_SHORT"/>
+ <field name="ISO_BASIC_SHORT"/>
+ <field name="ISO_EXTENDED_FIXED"/>
+ <field name="ISO_EXTENDED_FULL"/>
+ <field name="ISO_EXTENDED_LOCAL_FIXED"/>
+ <field name="ISO_EXTENDED_LOCAL_FULL"/>
+ <field name="LOCALIZED_GMT"/>
+ <field name="LOCALIZED_GMT_SHORT"/>
+ <field name="SPECIFIC_LONG"/>
+ <field name="SPECIFIC_SHORT"/>
+ <field name="ZONE_ID"/>
+ <field name="ZONE_ID_SHORT"/>
+ </class>
+ <class name="android/icu/text/TimeZoneFormat$TimeType" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/TimeZoneFormat$TimeType;"/>
+ <method name="values()[Landroid/icu/text/TimeZoneFormat$TimeType;"/>
+ <field name="DAYLIGHT"/>
+ <field name="STANDARD"/>
+ <field name="UNKNOWN"/>
+ </class>
+ <class name="android/icu/text/TimeZoneNames" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAvailableMetaZoneIDs()Ljava/util/Set;"/>
+ <method name="getAvailableMetaZoneIDs(Ljava/lang/String;)Ljava/util/Set;"/>
+ <method name="getDisplayName(Ljava/lang/String;Landroid/icu/text/TimeZoneNames$NameType;J)Ljava/lang/String;"/>
+ <method name="getExemplarLocationName(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/TimeZoneNames;"/>
+ <method name="getInstance(Ljava/util/Locale;)Landroid/icu/text/TimeZoneNames;"/>
+ <method name="getMetaZoneDisplayName(Ljava/lang/String;Landroid/icu/text/TimeZoneNames$NameType;)Ljava/lang/String;"/>
+ <method name="getMetaZoneID(Ljava/lang/String;J)Ljava/lang/String;"/>
+ <method name="getReferenceZoneID(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getTZDBInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/TimeZoneNames;"/>
+ <method name="getTimeZoneDisplayName(Ljava/lang/String;Landroid/icu/text/TimeZoneNames$NameType;)Ljava/lang/String;"/>
+ </class>
+ <class name="android/icu/text/TimeZoneNames$NameType" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/TimeZoneNames$NameType;"/>
+ <method name="values()[Landroid/icu/text/TimeZoneNames$NameType;"/>
+ <field name="EXEMPLAR_LOCATION"/>
+ <field name="LONG_DAYLIGHT"/>
+ <field name="LONG_GENERIC"/>
+ <field name="LONG_STANDARD"/>
+ <field name="SHORT_DAYLIGHT"/>
+ <field name="SHORT_GENERIC"/>
+ <field name="SHORT_STANDARD"/>
+ </class>
+ <class name="android/icu/text/UCharacterIterator" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="current()I"/>
+ <method name="currentCodePoint()I"/>
+ <method name="getCharacterIterator()Ljava/text/CharacterIterator;"/>
+ <method name="getIndex()I"/>
+ <method name="getInstance(Landroid/icu/text/Replaceable;)Landroid/icu/text/UCharacterIterator;"/>
+ <method name="getInstance(Ljava/lang/String;)Landroid/icu/text/UCharacterIterator;"/>
+ <method name="getInstance(Ljava/lang/StringBuffer;)Landroid/icu/text/UCharacterIterator;"/>
+ <method name="getInstance(Ljava/text/CharacterIterator;)Landroid/icu/text/UCharacterIterator;"/>
+ <method name="getInstance([C)Landroid/icu/text/UCharacterIterator;"/>
+ <method name="getInstance([CII)Landroid/icu/text/UCharacterIterator;"/>
+ <method name="getLength()I"/>
+ <method name="getText()Ljava/lang/String;"/>
+ <method name="getText([C)I"/>
+ <method name="getText([CI)I"/>
+ <method name="moveCodePointIndex(I)I"/>
+ <method name="moveIndex(I)I"/>
+ <method name="next()I"/>
+ <method name="nextCodePoint()I"/>
+ <method name="previous()I"/>
+ <method name="previousCodePoint()I"/>
+ <method name="setIndex(I)V"/>
+ <method name="setToLimit()V"/>
+ <method name="setToStart()V"/>
+ <field name="DONE"/>
+ </class>
+ <class name="android/icu/text/UFormat" since="24">
+ <extends name="java/text/Format"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/icu/text/UnicodeFilter" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/icu/text/UnicodeMatcher"/>
+ <method name="&lt;init>()V"/>
+ <method name="contains(I)Z"/>
+ </class>
+ <class name="android/icu/text/UnicodeMatcher" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="addMatchSetTo(Landroid/icu/text/UnicodeSet;)V"/>
+ <method name="matches(Landroid/icu/text/Replaceable;[IIZ)I"/>
+ <method name="matchesIndexValue(I)Z"/>
+ <method name="toPattern(Z)Ljava/lang/String;"/>
+ <field name="ETHER"/>
+ <field name="U_MATCH"/>
+ <field name="U_MISMATCH"/>
+ <field name="U_PARTIAL_MATCH"/>
+ </class>
+ <class name="android/icu/text/UnicodeSet" since="24">
+ <extends name="android/icu/text/UnicodeFilter"/>
+ <implements name="android/icu/util/Freezable"/>
+ <implements name="java/lang/Comparable"/>
+ <implements name="java/lang/Iterable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="&lt;init>(Landroid/icu/text/UnicodeSet;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/text/ParsePosition;Landroid/icu/text/SymbolTable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/text/ParsePosition;Landroid/icu/text/SymbolTable;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Z)V"/>
+ <method name="&lt;init>([I)V"/>
+ <method name="_generatePattern(Ljava/lang/StringBuffer;Z)Ljava/lang/StringBuffer;"/>
+ <method name="_generatePattern(Ljava/lang/StringBuffer;ZZ)Ljava/lang/StringBuffer;"/>
+ <method name="add(I)Landroid/icu/text/UnicodeSet;"/>
+ <method name="add(II)Landroid/icu/text/UnicodeSet;"/>
+ <method name="add(Ljava/lang/CharSequence;)Landroid/icu/text/UnicodeSet;"/>
+ <method name="add(Ljava/lang/Iterable;)Landroid/icu/text/UnicodeSet;"/>
+ <method name="addAll(II)Landroid/icu/text/UnicodeSet;"/>
+ <method name="addAll(Landroid/icu/text/UnicodeSet;)Landroid/icu/text/UnicodeSet;"/>
+ <method name="addAll(Ljava/lang/CharSequence;)Landroid/icu/text/UnicodeSet;"/>
+ <method name="addAll(Ljava/lang/Iterable;)Landroid/icu/text/UnicodeSet;"/>
+ <method name="addAll([Ljava/lang/CharSequence;)Landroid/icu/text/UnicodeSet;"/>
+ <method name="addAllTo(Ljava/util/Collection;)Ljava/util/Collection;"/>
+ <method name="applyIntPropertyValue(II)Landroid/icu/text/UnicodeSet;"/>
+ <method name="applyPattern(Ljava/lang/String;)Landroid/icu/text/UnicodeSet;"/>
+ <method name="applyPattern(Ljava/lang/String;I)Landroid/icu/text/UnicodeSet;"/>
+ <method name="applyPattern(Ljava/lang/String;Z)Landroid/icu/text/UnicodeSet;"/>
+ <method name="applyPropertyAlias(Ljava/lang/String;Ljava/lang/String;)Landroid/icu/text/UnicodeSet;"/>
+ <method name="applyPropertyAlias(Ljava/lang/String;Ljava/lang/String;Landroid/icu/text/SymbolTable;)Landroid/icu/text/UnicodeSet;"/>
+ <method name="charAt(I)I"/>
+ <method name="clear()Landroid/icu/text/UnicodeSet;"/>
+ <method name="cloneAsThawed()Landroid/icu/text/UnicodeSet;"/>
+ <method name="closeOver(I)Landroid/icu/text/UnicodeSet;"/>
+ <method name="compact()Landroid/icu/text/UnicodeSet;"/>
+ <method name="compareTo(Landroid/icu/text/UnicodeSet;)I"/>
+ <method name="compareTo(Landroid/icu/text/UnicodeSet;Landroid/icu/text/UnicodeSet$ComparisonStyle;)I"/>
+ <method name="compareTo(Ljava/lang/Iterable;)I"/>
+ <method name="complement()Landroid/icu/text/UnicodeSet;"/>
+ <method name="complement(I)Landroid/icu/text/UnicodeSet;"/>
+ <method name="complement(II)Landroid/icu/text/UnicodeSet;"/>
+ <method name="complement(Ljava/lang/CharSequence;)Landroid/icu/text/UnicodeSet;"/>
+ <method name="complementAll(Landroid/icu/text/UnicodeSet;)Landroid/icu/text/UnicodeSet;"/>
+ <method name="complementAll(Ljava/lang/CharSequence;)Landroid/icu/text/UnicodeSet;"/>
+ <method name="contains(II)Z"/>
+ <method name="contains(Ljava/lang/CharSequence;)Z"/>
+ <method name="containsAll(Landroid/icu/text/UnicodeSet;)Z"/>
+ <method name="containsAll(Ljava/lang/Iterable;)Z"/>
+ <method name="containsAll(Ljava/lang/String;)Z"/>
+ <method name="containsNone(II)Z"/>
+ <method name="containsNone(Landroid/icu/text/UnicodeSet;)Z"/>
+ <method name="containsNone(Ljava/lang/CharSequence;)Z"/>
+ <method name="containsNone(Ljava/lang/Iterable;)Z"/>
+ <method name="containsSome(II)Z"/>
+ <method name="containsSome(Landroid/icu/text/UnicodeSet;)Z"/>
+ <method name="containsSome(Ljava/lang/CharSequence;)Z"/>
+ <method name="containsSome(Ljava/lang/Iterable;)Z"/>
+ <method name="freeze()Landroid/icu/text/UnicodeSet;"/>
+ <method name="from(Ljava/lang/CharSequence;)Landroid/icu/text/UnicodeSet;"/>
+ <method name="fromAll(Ljava/lang/CharSequence;)Landroid/icu/text/UnicodeSet;"/>
+ <method name="getRangeCount()I"/>
+ <method name="getRangeEnd(I)I"/>
+ <method name="getRangeStart(I)I"/>
+ <method name="indexOf(I)I"/>
+ <method name="isEmpty()Z"/>
+ <method name="ranges()Ljava/lang/Iterable;"/>
+ <method name="remove(I)Landroid/icu/text/UnicodeSet;"/>
+ <method name="remove(II)Landroid/icu/text/UnicodeSet;"/>
+ <method name="remove(Ljava/lang/CharSequence;)Landroid/icu/text/UnicodeSet;"/>
+ <method name="removeAll(Landroid/icu/text/UnicodeSet;)Landroid/icu/text/UnicodeSet;"/>
+ <method name="removeAll(Ljava/lang/CharSequence;)Landroid/icu/text/UnicodeSet;"/>
+ <method name="removeAll(Ljava/lang/Iterable;)Landroid/icu/text/UnicodeSet;"/>
+ <method name="removeAllStrings()Landroid/icu/text/UnicodeSet;"/>
+ <method name="retain(I)Landroid/icu/text/UnicodeSet;"/>
+ <method name="retain(II)Landroid/icu/text/UnicodeSet;"/>
+ <method name="retain(Ljava/lang/CharSequence;)Landroid/icu/text/UnicodeSet;"/>
+ <method name="retainAll(Landroid/icu/text/UnicodeSet;)Landroid/icu/text/UnicodeSet;"/>
+ <method name="retainAll(Ljava/lang/CharSequence;)Landroid/icu/text/UnicodeSet;"/>
+ <method name="retainAll(Ljava/lang/Iterable;)Landroid/icu/text/UnicodeSet;"/>
+ <method name="set(II)Landroid/icu/text/UnicodeSet;"/>
+ <method name="set(Landroid/icu/text/UnicodeSet;)Landroid/icu/text/UnicodeSet;"/>
+ <method name="size()I"/>
+ <method name="span(Ljava/lang/CharSequence;ILandroid/icu/text/UnicodeSet$SpanCondition;)I"/>
+ <method name="span(Ljava/lang/CharSequence;Landroid/icu/text/UnicodeSet$SpanCondition;)I"/>
+ <method name="spanBack(Ljava/lang/CharSequence;ILandroid/icu/text/UnicodeSet$SpanCondition;)I"/>
+ <method name="spanBack(Ljava/lang/CharSequence;Landroid/icu/text/UnicodeSet$SpanCondition;)I"/>
+ <method name="strings()Ljava/util/Collection;"/>
+ <field name="ADD_CASE_MAPPINGS"/>
+ <field name="ALL_CODE_POINTS"/>
+ <field name="CASE"/>
+ <field name="CASE_INSENSITIVE"/>
+ <field name="EMPTY"/>
+ <field name="IGNORE_SPACE"/>
+ <field name="MAX_VALUE"/>
+ <field name="MIN_VALUE"/>
+ </class>
+ <class name="android/icu/text/UnicodeSet$ComparisonStyle" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/UnicodeSet$ComparisonStyle;"/>
+ <method name="values()[Landroid/icu/text/UnicodeSet$ComparisonStyle;"/>
+ <field name="LEXICOGRAPHIC"/>
+ <field name="LONGER_FIRST"/>
+ <field name="SHORTER_FIRST"/>
+ </class>
+ <class name="android/icu/text/UnicodeSet$EntryRange" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="codepoint"/>
+ <field name="codepointEnd"/>
+ </class>
+ <class name="android/icu/text/UnicodeSet$SpanCondition" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/UnicodeSet$SpanCondition;"/>
+ <method name="values()[Landroid/icu/text/UnicodeSet$SpanCondition;"/>
+ <field name="CONDITION_COUNT"/>
+ <field name="CONTAINED"/>
+ <field name="NOT_CONTAINED"/>
+ <field name="SIMPLE"/>
+ </class>
+ <class name="android/icu/text/UnicodeSetIterator" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/icu/text/UnicodeSet;)V"/>
+ <method name="getString()Ljava/lang/String;"/>
+ <method name="next()Z"/>
+ <method name="nextRange()Z"/>
+ <method name="reset()V"/>
+ <method name="reset(Landroid/icu/text/UnicodeSet;)V"/>
+ <field name="IS_STRING"/>
+ <field name="codepoint"/>
+ <field name="codepointEnd"/>
+ <field name="string"/>
+ </class>
+ <class name="android/icu/text/UnicodeSetSpanner" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/icu/text/UnicodeSet;)V"/>
+ <method name="countIn(Ljava/lang/CharSequence;)I"/>
+ <method name="countIn(Ljava/lang/CharSequence;Landroid/icu/text/UnicodeSetSpanner$CountMethod;)I"/>
+ <method name="countIn(Ljava/lang/CharSequence;Landroid/icu/text/UnicodeSetSpanner$CountMethod;Landroid/icu/text/UnicodeSet$SpanCondition;)I"/>
+ <method name="deleteFrom(Ljava/lang/CharSequence;)Ljava/lang/String;"/>
+ <method name="deleteFrom(Ljava/lang/CharSequence;Landroid/icu/text/UnicodeSet$SpanCondition;)Ljava/lang/String;"/>
+ <method name="getUnicodeSet()Landroid/icu/text/UnicodeSet;"/>
+ <method name="replaceFrom(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String;"/>
+ <method name="replaceFrom(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/icu/text/UnicodeSetSpanner$CountMethod;)Ljava/lang/String;"/>
+ <method name="replaceFrom(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/icu/text/UnicodeSetSpanner$CountMethod;Landroid/icu/text/UnicodeSet$SpanCondition;)Ljava/lang/String;"/>
+ <method name="trim(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;"/>
+ <method name="trim(Ljava/lang/CharSequence;Landroid/icu/text/UnicodeSetSpanner$TrimOption;)Ljava/lang/CharSequence;"/>
+ <method name="trim(Ljava/lang/CharSequence;Landroid/icu/text/UnicodeSetSpanner$TrimOption;Landroid/icu/text/UnicodeSet$SpanCondition;)Ljava/lang/CharSequence;"/>
+ </class>
+ <class name="android/icu/text/UnicodeSetSpanner$CountMethod" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/UnicodeSetSpanner$CountMethod;"/>
+ <method name="values()[Landroid/icu/text/UnicodeSetSpanner$CountMethod;"/>
+ <field name="MIN_ELEMENTS"/>
+ <field name="WHOLE_SPAN"/>
+ </class>
+ <class name="android/icu/text/UnicodeSetSpanner$TrimOption" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/text/UnicodeSetSpanner$TrimOption;"/>
+ <method name="values()[Landroid/icu/text/UnicodeSetSpanner$TrimOption;"/>
+ <field name="BOTH"/>
+ <field name="LEADING"/>
+ <field name="TRAILING"/>
+ </class>
+ <class name="android/icu/util/BuddhistCalendar" since="24">
+ <extends name="android/icu/util/GregorianCalendar"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(III)V"/>
+ <method name="&lt;init>(IIIIII)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;Ljava/util/Locale;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Ljava/util/Date;)V"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V"/>
+ <field name="BE"/>
+ </class>
+ <class name="android/icu/util/CECalendar" since="24">
+ <extends name="android/icu/util/Calendar"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(III)V"/>
+ <method name="&lt;init>(IIIIII)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;Ljava/util/Locale;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Ljava/util/Date;)V"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V"/>
+ </class>
+ <class name="android/icu/util/Calendar" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;Ljava/util/Locale;)V"/>
+ <method name="add(II)V"/>
+ <method name="after(Ljava/lang/Object;)Z"/>
+ <method name="before(Ljava/lang/Object;)Z"/>
+ <method name="clear()V"/>
+ <method name="clear(I)V"/>
+ <method name="compareTo(Landroid/icu/util/Calendar;)I"/>
+ <method name="complete()V"/>
+ <method name="computeFields()V"/>
+ <method name="computeGregorianFields(I)V"/>
+ <method name="computeGregorianMonthStart(II)I"/>
+ <method name="computeJulianDay()I"/>
+ <method name="computeMillisInDay()I" deprecated="26"/>
+ <method name="computeTime()V"/>
+ <method name="computeZoneOffset(JI)I" deprecated="26"/>
+ <method name="fieldDifference(Ljava/util/Date;I)I"/>
+ <method name="fieldName(I)Ljava/lang/String;"/>
+ <method name="floorDivide(II)I"/>
+ <method name="floorDivide(II[I)I"/>
+ <method name="floorDivide(JI[I)I"/>
+ <method name="floorDivide(JJ)J"/>
+ <method name="get(I)I"/>
+ <method name="getActualMaximum(I)I"/>
+ <method name="getActualMinimum(I)I"/>
+ <method name="getAvailableLocales()[Ljava/util/Locale;"/>
+ <method name="getDateTimeFormat(IILandroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;"/>
+ <method name="getDateTimeFormat(IILjava/util/Locale;)Landroid/icu/text/DateFormat;"/>
+ <method name="getDisplayName(Landroid/icu/util/ULocale;)Ljava/lang/String;"/>
+ <method name="getDisplayName(Ljava/util/Locale;)Ljava/lang/String;"/>
+ <method name="getFieldCount()I"/>
+ <method name="getFieldResolutionTable()[[[I"/>
+ <method name="getFirstDayOfWeek()I"/>
+ <method name="getGreatestMinimum(I)I"/>
+ <method name="getGregorianDayOfMonth()I"/>
+ <method name="getGregorianDayOfYear()I"/>
+ <method name="getGregorianMonth()I"/>
+ <method name="getGregorianYear()I"/>
+ <method name="getInstance()Landroid/icu/util/Calendar;"/>
+ <method name="getInstance(Landroid/icu/util/TimeZone;)Landroid/icu/util/Calendar;"/>
+ <method name="getInstance(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)Landroid/icu/util/Calendar;"/>
+ <method name="getInstance(Landroid/icu/util/TimeZone;Ljava/util/Locale;)Landroid/icu/util/Calendar;"/>
+ <method name="getInstance(Landroid/icu/util/ULocale;)Landroid/icu/util/Calendar;"/>
+ <method name="getInstance(Ljava/util/Locale;)Landroid/icu/util/Calendar;"/>
+ <method name="getKeywordValuesForLocale(Ljava/lang/String;Landroid/icu/util/ULocale;Z)[Ljava/lang/String;"/>
+ <method name="getLeastMaximum(I)I"/>
+ <method name="getLimit(II)I"/>
+ <method name="getMaximum(I)I"/>
+ <method name="getMinimalDaysInFirstWeek()I"/>
+ <method name="getMinimum(I)I"/>
+ <method name="getRepeatedWallTimeOption()I"/>
+ <method name="getSkippedWallTimeOption()I"/>
+ <method name="getStamp(I)I"/>
+ <method name="getTime()Ljava/util/Date;"/>
+ <method name="getTimeInMillis()J"/>
+ <method name="getTimeZone()Landroid/icu/util/TimeZone;"/>
+ <method name="getType()Ljava/lang/String;"/>
+ <method name="getWeekData()Landroid/icu/util/Calendar$WeekData;"/>
+ <method name="getWeekDataForRegion(Ljava/lang/String;)Landroid/icu/util/Calendar$WeekData;"/>
+ <method name="gregorianMonthLength(II)I"/>
+ <method name="gregorianPreviousMonthLength(II)I"/>
+ <method name="handleComputeFields(I)V"/>
+ <method name="handleComputeJulianDay(I)I"/>
+ <method name="handleComputeMonthStart(IIZ)I"/>
+ <method name="handleCreateFields()[I"/>
+ <method name="handleGetDateFormat(Ljava/lang/String;Landroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;"/>
+ <method name="handleGetDateFormat(Ljava/lang/String;Ljava/lang/String;Ljava/util/Locale;)Landroid/icu/text/DateFormat;"/>
+ <method name="handleGetDateFormat(Ljava/lang/String;Ljava/util/Locale;)Landroid/icu/text/DateFormat;"/>
+ <method name="handleGetExtendedYear()I"/>
+ <method name="handleGetLimit(II)I"/>
+ <method name="handleGetMonthLength(II)I"/>
+ <method name="handleGetYearLength(I)I"/>
+ <method name="internalGet(I)I"/>
+ <method name="internalGet(II)I"/>
+ <method name="internalGetTimeInMillis()J"/>
+ <method name="internalSet(II)V"/>
+ <method name="isEquivalentTo(Landroid/icu/util/Calendar;)Z"/>
+ <method name="isGregorianLeapYear(I)Z"/>
+ <method name="isLenient()Z"/>
+ <method name="isSet(I)Z"/>
+ <method name="isWeekend()Z"/>
+ <method name="isWeekend(Ljava/util/Date;)Z"/>
+ <method name="julianDayToDayOfWeek(I)I"/>
+ <method name="julianDayToMillis(I)J"/>
+ <method name="millisToJulianDay(J)I"/>
+ <method name="newerField(II)I"/>
+ <method name="newestStamp(III)I"/>
+ <method name="pinField(I)V"/>
+ <method name="prepareGetActual(IZ)V"/>
+ <method name="resolveFields([[[I)I"/>
+ <method name="roll(II)V"/>
+ <method name="roll(IZ)V"/>
+ <method name="set(II)V"/>
+ <method name="set(III)V"/>
+ <method name="set(IIIII)V"/>
+ <method name="set(IIIIII)V"/>
+ <method name="setFirstDayOfWeek(I)V"/>
+ <method name="setLenient(Z)V"/>
+ <method name="setMinimalDaysInFirstWeek(I)V"/>
+ <method name="setRepeatedWallTimeOption(I)V"/>
+ <method name="setSkippedWallTimeOption(I)V"/>
+ <method name="setTime(Ljava/util/Date;)V"/>
+ <method name="setTimeInMillis(J)V"/>
+ <method name="setTimeZone(Landroid/icu/util/TimeZone;)V"/>
+ <method name="setWeekData(Landroid/icu/util/Calendar$WeekData;)Landroid/icu/util/Calendar;"/>
+ <method name="validateField(I)V"/>
+ <method name="validateField(III)V"/>
+ <method name="validateFields()V"/>
+ <method name="weekNumber(II)I"/>
+ <method name="weekNumber(III)I"/>
+ <field name="AM"/>
+ <field name="AM_PM"/>
+ <field name="APRIL"/>
+ <field name="AUGUST"/>
+ <field name="BASE_FIELD_COUNT" deprecated="26"/>
+ <field name="DATE"/>
+ <field name="DAY_OF_MONTH"/>
+ <field name="DAY_OF_WEEK"/>
+ <field name="DAY_OF_WEEK_IN_MONTH"/>
+ <field name="DAY_OF_YEAR"/>
+ <field name="DECEMBER"/>
+ <field name="DOW_LOCAL"/>
+ <field name="DST_OFFSET"/>
+ <field name="EPOCH_JULIAN_DAY"/>
+ <field name="ERA"/>
+ <field name="EXTENDED_YEAR"/>
+ <field name="FEBRUARY"/>
+ <field name="FRIDAY"/>
+ <field name="GREATEST_MINIMUM"/>
+ <field name="HOUR"/>
+ <field name="HOUR_OF_DAY"/>
+ <field name="INTERNALLY_SET"/>
+ <field name="IS_LEAP_MONTH"/>
+ <field name="JANUARY"/>
+ <field name="JAN_1_1_JULIAN_DAY"/>
+ <field name="JULIAN_DAY"/>
+ <field name="JULY"/>
+ <field name="JUNE"/>
+ <field name="LEAST_MAXIMUM"/>
+ <field name="MARCH"/>
+ <field name="MAXIMUM"/>
+ <field name="MAX_DATE"/>
+ <field name="MAX_FIELD_COUNT" deprecated="26"/>
+ <field name="MAX_JULIAN"/>
+ <field name="MAX_MILLIS"/>
+ <field name="MAY"/>
+ <field name="MILLISECOND"/>
+ <field name="MILLISECONDS_IN_DAY"/>
+ <field name="MINIMUM"/>
+ <field name="MINIMUM_USER_STAMP"/>
+ <field name="MINUTE"/>
+ <field name="MIN_DATE"/>
+ <field name="MIN_JULIAN"/>
+ <field name="MIN_MILLIS"/>
+ <field name="MONDAY"/>
+ <field name="MONTH"/>
+ <field name="NOVEMBER"/>
+ <field name="OCTOBER"/>
+ <field name="ONE_DAY"/>
+ <field name="ONE_HOUR"/>
+ <field name="ONE_MINUTE"/>
+ <field name="ONE_SECOND"/>
+ <field name="ONE_WEEK"/>
+ <field name="PM"/>
+ <field name="RESOLVE_REMAP"/>
+ <field name="SATURDAY"/>
+ <field name="SECOND"/>
+ <field name="SEPTEMBER"/>
+ <field name="SUNDAY"/>
+ <field name="THURSDAY"/>
+ <field name="TUESDAY"/>
+ <field name="UNDECIMBER"/>
+ <field name="UNSET"/>
+ <field name="WALLTIME_FIRST"/>
+ <field name="WALLTIME_LAST"/>
+ <field name="WALLTIME_NEXT_VALID"/>
+ <field name="WEDNESDAY"/>
+ <field name="WEEK_OF_MONTH"/>
+ <field name="WEEK_OF_YEAR"/>
+ <field name="YEAR"/>
+ <field name="YEAR_WOY"/>
+ <field name="ZONE_OFFSET"/>
+ </class>
+ <class name="android/icu/util/Calendar$WeekData" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(IIIIII)V"/>
+ <field name="firstDayOfWeek"/>
+ <field name="minimalDaysInFirstWeek"/>
+ <field name="weekendCease"/>
+ <field name="weekendCeaseMillis"/>
+ <field name="weekendOnset"/>
+ <field name="weekendOnsetMillis"/>
+ </class>
+ <class name="android/icu/util/ChineseCalendar" since="24">
+ <extends name="android/icu/util/Calendar"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(IIII)V"/>
+ <method name="&lt;init>(IIIII)V"/>
+ <method name="&lt;init>(IIIIIII)V"/>
+ <method name="&lt;init>(IIIIIIII)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;Ljava/util/Locale;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Ljava/util/Date;)V"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V"/>
+ <method name="handleGetDateFormat(Ljava/lang/String;Ljava/lang/String;Landroid/icu/util/ULocale;)Landroid/icu/text/DateFormat;"/>
+ </class>
+ <class name="android/icu/util/CopticCalendar" since="24">
+ <extends name="android/icu/util/CECalendar"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(III)V"/>
+ <method name="&lt;init>(IIIIII)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;Ljava/util/Locale;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Ljava/util/Date;)V"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V"/>
+ <field name="AMSHIR"/>
+ <field name="BABA"/>
+ <field name="BARAMHAT"/>
+ <field name="BARAMOUDA"/>
+ <field name="BASHANS"/>
+ <field name="EPEP"/>
+ <field name="HATOR"/>
+ <field name="KIAHK"/>
+ <field name="MESRA"/>
+ <field name="NASIE"/>
+ <field name="PAONA"/>
+ <field name="TOBA"/>
+ <field name="TOUT"/>
+ </class>
+ <class name="android/icu/util/Currency" since="24">
+ <extends name="android/icu/util/MeasureUnit"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getAvailableCurrencies()Ljava/util/Set;"/>
+ <method name="getAvailableCurrencyCodes(Landroid/icu/util/ULocale;Ljava/util/Date;)[Ljava/lang/String;"/>
+ <method name="getAvailableCurrencyCodes(Ljava/util/Locale;Ljava/util/Date;)[Ljava/lang/String;"/>
+ <method name="getAvailableLocales()[Ljava/util/Locale;"/>
+ <method name="getAvailableULocales()[Landroid/icu/util/ULocale;"/>
+ <method name="getCurrencyCode()Ljava/lang/String;"/>
+ <method name="getDefaultFractionDigits()I"/>
+ <method name="getDefaultFractionDigits(Landroid/icu/util/Currency$CurrencyUsage;)I"/>
+ <method name="getDisplayName()Ljava/lang/String;"/>
+ <method name="getDisplayName(Ljava/util/Locale;)Ljava/lang/String;"/>
+ <method name="getInstance(Landroid/icu/util/ULocale;)Landroid/icu/util/Currency;"/>
+ <method name="getInstance(Ljava/lang/String;)Landroid/icu/util/Currency;"/>
+ <method name="getInstance(Ljava/util/Locale;)Landroid/icu/util/Currency;"/>
+ <method name="getKeywordValuesForLocale(Ljava/lang/String;Landroid/icu/util/ULocale;Z)[Ljava/lang/String;"/>
+ <method name="getName(Landroid/icu/util/ULocale;ILjava/lang/String;[Z)Ljava/lang/String;"/>
+ <method name="getName(Landroid/icu/util/ULocale;I[Z)Ljava/lang/String;"/>
+ <method name="getName(Ljava/util/Locale;ILjava/lang/String;[Z)Ljava/lang/String;"/>
+ <method name="getName(Ljava/util/Locale;I[Z)Ljava/lang/String;"/>
+ <method name="getNumericCode()I"/>
+ <method name="getRoundingIncrement()D"/>
+ <method name="getRoundingIncrement(Landroid/icu/util/Currency$CurrencyUsage;)D"/>
+ <method name="getSymbol()Ljava/lang/String;"/>
+ <method name="getSymbol(Landroid/icu/util/ULocale;)Ljava/lang/String;"/>
+ <method name="getSymbol(Ljava/util/Locale;)Ljava/lang/String;"/>
+ <method name="isAvailable(Ljava/lang/String;Ljava/util/Date;Ljava/util/Date;)Z"/>
+ <field name="LONG_NAME"/>
+ <field name="PLURAL_LONG_NAME"/>
+ <field name="SYMBOL_NAME"/>
+ </class>
+ <class name="android/icu/util/Currency$CurrencyUsage" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/util/Currency$CurrencyUsage;"/>
+ <method name="values()[Landroid/icu/util/Currency$CurrencyUsage;"/>
+ <field name="CASH"/>
+ <field name="STANDARD"/>
+ </class>
+ <class name="android/icu/util/CurrencyAmount" since="24">
+ <extends name="android/icu/util/Measure"/>
+ <method name="&lt;init>(DLandroid/icu/util/Currency;)V"/>
+ <method name="&lt;init>(Ljava/lang/Number;Landroid/icu/util/Currency;)V"/>
+ <method name="getCurrency()Landroid/icu/util/Currency;"/>
+ </class>
+ <class name="android/icu/util/DateInterval" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(JJ)V"/>
+ <method name="getFromDate()J"/>
+ <method name="getToDate()J"/>
+ </class>
+ <class name="android/icu/util/EthiopicCalendar" since="26">
+ <extends name="android/icu/util/CECalendar"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(III)V"/>
+ <method name="&lt;init>(IIIIII)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;Ljava/util/Locale;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Ljava/util/Date;)V"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V"/>
+ <method name="isAmeteAlemEra()Z"/>
+ <method name="setAmeteAlemEra(Z)V"/>
+ <field name="GENBOT"/>
+ <field name="HAMLE"/>
+ <field name="HEDAR"/>
+ <field name="MEGABIT"/>
+ <field name="MESKEREM"/>
+ <field name="MIAZIA"/>
+ <field name="NEHASSE"/>
+ <field name="PAGUMEN"/>
+ <field name="SENE"/>
+ <field name="TAHSAS"/>
+ <field name="TEKEMT"/>
+ <field name="TER"/>
+ <field name="YEKATIT"/>
+ </class>
+ <class name="android/icu/util/Freezable" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="cloneAsThawed()Ljava/lang/Object;"/>
+ <method name="freeze()Ljava/lang/Object;"/>
+ <method name="isFrozen()Z"/>
+ </class>
+ <class name="android/icu/util/GregorianCalendar" since="24">
+ <extends name="android/icu/util/Calendar"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(III)V"/>
+ <method name="&lt;init>(IIIII)V"/>
+ <method name="&lt;init>(IIIIII)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;Ljava/util/Locale;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V"/>
+ <method name="getGregorianChange()Ljava/util/Date;"/>
+ <method name="isLeapYear(I)Z"/>
+ <method name="setGregorianChange(Ljava/util/Date;)V"/>
+ <field name="AD"/>
+ <field name="BC"/>
+ <field name="invertGregorian"/>
+ <field name="isGregorian"/>
+ </class>
+ <class name="android/icu/util/HebrewCalendar" since="24">
+ <extends name="android/icu/util/Calendar"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(III)V"/>
+ <method name="&lt;init>(IIIIII)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;Ljava/util/Locale;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Ljava/util/Date;)V"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V"/>
+ <field name="ADAR"/>
+ <field name="ADAR_1"/>
+ <field name="AV"/>
+ <field name="ELUL"/>
+ <field name="HESHVAN"/>
+ <field name="IYAR"/>
+ <field name="KISLEV"/>
+ <field name="NISAN"/>
+ <field name="SHEVAT"/>
+ <field name="SIVAN"/>
+ <field name="TAMUZ"/>
+ <field name="TEVET"/>
+ <field name="TISHRI"/>
+ </class>
+ <class name="android/icu/util/ICUUncheckedIOException" since="24">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="android/icu/util/IndianCalendar" since="24">
+ <extends name="android/icu/util/Calendar"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(III)V"/>
+ <method name="&lt;init>(IIIIII)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;Ljava/util/Locale;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Ljava/util/Date;)V"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V"/>
+ <field name="AGRAHAYANA"/>
+ <field name="ASADHA"/>
+ <field name="ASVINA"/>
+ <field name="BHADRA"/>
+ <field name="CHAITRA"/>
+ <field name="IE"/>
+ <field name="JYAISTHA"/>
+ <field name="KARTIKA"/>
+ <field name="MAGHA"/>
+ <field name="PAUSA"/>
+ <field name="PHALGUNA"/>
+ <field name="SRAVANA"/>
+ <field name="VAISAKHA"/>
+ </class>
+ <class name="android/icu/util/IslamicCalendar" since="24">
+ <extends name="android/icu/util/Calendar"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(III)V"/>
+ <method name="&lt;init>(IIIIII)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;Ljava/util/Locale;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Ljava/util/Date;)V"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V"/>
+ <method name="getCalculationType()Landroid/icu/util/IslamicCalendar$CalculationType;"/>
+ <method name="setCalculationType(Landroid/icu/util/IslamicCalendar$CalculationType;)V"/>
+ <field name="DHU_AL_HIJJAH"/>
+ <field name="DHU_AL_QIDAH"/>
+ <field name="JUMADA_1"/>
+ <field name="JUMADA_2"/>
+ <field name="MUHARRAM"/>
+ <field name="RABI_1"/>
+ <field name="RABI_2"/>
+ <field name="RAJAB"/>
+ <field name="RAMADAN"/>
+ <field name="SAFAR"/>
+ <field name="SHABAN"/>
+ <field name="SHAWWAL"/>
+ </class>
+ <class name="android/icu/util/IslamicCalendar$CalculationType" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/util/IslamicCalendar$CalculationType;"/>
+ <method name="values()[Landroid/icu/util/IslamicCalendar$CalculationType;"/>
+ <field name="ISLAMIC"/>
+ <field name="ISLAMIC_CIVIL"/>
+ <field name="ISLAMIC_TBLA"/>
+ <field name="ISLAMIC_UMALQURA"/>
+ </class>
+ <class name="android/icu/util/JapaneseCalendar" since="24">
+ <extends name="android/icu/util/GregorianCalendar"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(III)V"/>
+ <method name="&lt;init>(IIII)V"/>
+ <method name="&lt;init>(IIIIII)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;Ljava/util/Locale;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Ljava/util/Date;)V"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V"/>
+ <field name="CURRENT_ERA"/>
+ <field name="HEISEI"/>
+ <field name="MEIJI"/>
+ <field name="SHOWA"/>
+ <field name="TAISHO"/>
+ </class>
+ <class name="android/icu/util/Measure" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/Number;Landroid/icu/util/MeasureUnit;)V"/>
+ <method name="getNumber()Ljava/lang/Number;"/>
+ <method name="getUnit()Landroid/icu/util/MeasureUnit;"/>
+ </class>
+ <class name="android/icu/util/MeasureUnit" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAvailable()Ljava/util/Set;"/>
+ <method name="getAvailable(Ljava/lang/String;)Ljava/util/Set;"/>
+ <method name="getAvailableTypes()Ljava/util/Set;"/>
+ <method name="getSubtype()Ljava/lang/String;"/>
+ <method name="getType()Ljava/lang/String;"/>
+ <field name="ACRE"/>
+ <field name="ACRE_FOOT"/>
+ <field name="AMPERE"/>
+ <field name="ARC_MINUTE"/>
+ <field name="ARC_SECOND"/>
+ <field name="ASTRONOMICAL_UNIT"/>
+ <field name="BIT"/>
+ <field name="BUSHEL"/>
+ <field name="BYTE"/>
+ <field name="CALORIE"/>
+ <field name="CARAT"/>
+ <field name="CELSIUS"/>
+ <field name="CENTILITER"/>
+ <field name="CENTIMETER"/>
+ <field name="CENTURY" since="26"/>
+ <field name="CUBIC_CENTIMETER"/>
+ <field name="CUBIC_FOOT"/>
+ <field name="CUBIC_INCH"/>
+ <field name="CUBIC_KILOMETER"/>
+ <field name="CUBIC_METER"/>
+ <field name="CUBIC_MILE"/>
+ <field name="CUBIC_YARD"/>
+ <field name="CUP"/>
+ <field name="CUP_METRIC" since="26"/>
+ <field name="DAY"/>
+ <field name="DECILITER"/>
+ <field name="DECIMETER"/>
+ <field name="DEGREE"/>
+ <field name="FAHRENHEIT"/>
+ <field name="FATHOM"/>
+ <field name="FLUID_OUNCE"/>
+ <field name="FOODCALORIE"/>
+ <field name="FOOT"/>
+ <field name="FURLONG"/>
+ <field name="GALLON"/>
+ <field name="GALLON_IMPERIAL" since="27"/>
+ <field name="GENERIC_TEMPERATURE" since="26"/>
+ <field name="GIGABIT"/>
+ <field name="GIGABYTE"/>
+ <field name="GIGAHERTZ"/>
+ <field name="GIGAWATT"/>
+ <field name="GRAM"/>
+ <field name="G_FORCE"/>
+ <field name="HECTARE"/>
+ <field name="HECTOLITER"/>
+ <field name="HECTOPASCAL"/>
+ <field name="HERTZ"/>
+ <field name="HORSEPOWER"/>
+ <field name="HOUR"/>
+ <field name="INCH"/>
+ <field name="INCH_HG"/>
+ <field name="JOULE"/>
+ <field name="KARAT"/>
+ <field name="KELVIN"/>
+ <field name="KILOBIT"/>
+ <field name="KILOBYTE"/>
+ <field name="KILOCALORIE"/>
+ <field name="KILOGRAM"/>
+ <field name="KILOHERTZ"/>
+ <field name="KILOJOULE"/>
+ <field name="KILOMETER"/>
+ <field name="KILOMETER_PER_HOUR"/>
+ <field name="KILOWATT"/>
+ <field name="KILOWATT_HOUR"/>
+ <field name="KNOT" since="26"/>
+ <field name="LIGHT_YEAR"/>
+ <field name="LITER"/>
+ <field name="LITER_PER_100KILOMETERS" since="26"/>
+ <field name="LITER_PER_KILOMETER"/>
+ <field name="LUX"/>
+ <field name="MEGABIT"/>
+ <field name="MEGABYTE"/>
+ <field name="MEGAHERTZ"/>
+ <field name="MEGALITER"/>
+ <field name="MEGAWATT"/>
+ <field name="METER"/>
+ <field name="METER_PER_SECOND"/>
+ <field name="METER_PER_SECOND_SQUARED"/>
+ <field name="METRIC_TON"/>
+ <field name="MICROGRAM"/>
+ <field name="MICROMETER"/>
+ <field name="MICROSECOND"/>
+ <field name="MILE"/>
+ <field name="MILE_PER_GALLON"/>
+ <field name="MILE_PER_GALLON_IMPERIAL" since="27"/>
+ <field name="MILE_PER_HOUR"/>
+ <field name="MILE_SCANDINAVIAN" since="26"/>
+ <field name="MILLIAMPERE"/>
+ <field name="MILLIBAR"/>
+ <field name="MILLIGRAM"/>
+ <field name="MILLIGRAM_PER_DECILITER" since="27"/>
+ <field name="MILLILITER"/>
+ <field name="MILLIMETER"/>
+ <field name="MILLIMETER_OF_MERCURY"/>
+ <field name="MILLISECOND"/>
+ <field name="MILLIWATT"/>
+ <field name="MINUTE"/>
+ <field name="MONTH"/>
+ <field name="NANOMETER"/>
+ <field name="NANOSECOND"/>
+ <field name="NAUTICAL_MILE"/>
+ <field name="OHM"/>
+ <field name="OUNCE"/>
+ <field name="OUNCE_TROY"/>
+ <field name="PARSEC"/>
+ <field name="PICOMETER"/>
+ <field name="PINT"/>
+ <field name="PINT_METRIC" since="26"/>
+ <field name="POUND"/>
+ <field name="POUND_PER_SQUARE_INCH"/>
+ <field name="QUART"/>
+ <field name="RADIAN"/>
+ <field name="REVOLUTION_ANGLE" since="26"/>
+ <field name="SECOND"/>
+ <field name="SQUARE_CENTIMETER"/>
+ <field name="SQUARE_FOOT"/>
+ <field name="SQUARE_INCH"/>
+ <field name="SQUARE_KILOMETER"/>
+ <field name="SQUARE_METER"/>
+ <field name="SQUARE_MILE"/>
+ <field name="SQUARE_YARD"/>
+ <field name="STONE"/>
+ <field name="TABLESPOON"/>
+ <field name="TEASPOON"/>
+ <field name="TERABIT"/>
+ <field name="TERABYTE"/>
+ <field name="TON"/>
+ <field name="VOLT"/>
+ <field name="WATT"/>
+ <field name="WEEK"/>
+ <field name="YARD"/>
+ <field name="YEAR"/>
+ </class>
+ <class name="android/icu/util/Output" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/Object;)V"/>
+ <field name="value"/>
+ </class>
+ <class name="android/icu/util/RangeValueIterator" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="next(Landroid/icu/util/RangeValueIterator$Element;)Z"/>
+ <method name="reset()V"/>
+ </class>
+ <class name="android/icu/util/RangeValueIterator$Element" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="limit"/>
+ <field name="start"/>
+ <field name="value"/>
+ </class>
+ <class name="android/icu/util/TaiwanCalendar" since="24">
+ <extends name="android/icu/util/GregorianCalendar"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(III)V"/>
+ <method name="&lt;init>(IIIIII)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/TimeZone;Ljava/util/Locale;)V"/>
+ <method name="&lt;init>(Landroid/icu/util/ULocale;)V"/>
+ <method name="&lt;init>(Ljava/util/Date;)V"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V"/>
+ <field name="BEFORE_MINGUO"/>
+ <field name="MINGUO"/>
+ </class>
+ <class name="android/icu/util/TimeUnit" since="24">
+ <extends name="android/icu/util/MeasureUnit"/>
+ <method name="&lt;init>()V"/>
+ <method name="values()[Landroid/icu/util/TimeUnit;"/>
+ </class>
+ <class name="android/icu/util/TimeZone" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/icu/util/Freezable"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="cloneAsThawed()Landroid/icu/util/TimeZone;"/>
+ <method name="countEquivalentIDs(Ljava/lang/String;)I"/>
+ <method name="freeze()Landroid/icu/util/TimeZone;"/>
+ <method name="getAvailableIDs()[Ljava/lang/String;"/>
+ <method name="getAvailableIDs(I)[Ljava/lang/String;"/>
+ <method name="getAvailableIDs(Landroid/icu/util/TimeZone$SystemTimeZoneType;Ljava/lang/String;Ljava/lang/Integer;)Ljava/util/Set;"/>
+ <method name="getAvailableIDs(Ljava/lang/String;)[Ljava/lang/String;"/>
+ <method name="getCanonicalID(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getCanonicalID(Ljava/lang/String;[Z)Ljava/lang/String;"/>
+ <method name="getDSTSavings()I"/>
+ <method name="getDefault()Landroid/icu/util/TimeZone;"/>
+ <method name="getDisplayName()Ljava/lang/String;"/>
+ <method name="getDisplayName(Landroid/icu/util/ULocale;)Ljava/lang/String;"/>
+ <method name="getDisplayName(Ljava/util/Locale;)Ljava/lang/String;"/>
+ <method name="getDisplayName(ZI)Ljava/lang/String;"/>
+ <method name="getDisplayName(ZILandroid/icu/util/ULocale;)Ljava/lang/String;"/>
+ <method name="getDisplayName(ZILjava/util/Locale;)Ljava/lang/String;"/>
+ <method name="getEquivalentID(Ljava/lang/String;I)Ljava/lang/String;"/>
+ <method name="getFrozenTimeZone(Ljava/lang/String;)Landroid/icu/util/TimeZone;"/>
+ <method name="getID()Ljava/lang/String;"/>
+ <method name="getIDForWindowsID(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getOffset(IIIIII)I"/>
+ <method name="getOffset(J)I"/>
+ <method name="getOffset(JZ[I)V"/>
+ <method name="getRawOffset()I"/>
+ <method name="getRegion(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getTZDataVersion()Ljava/lang/String;"/>
+ <method name="getTimeZone(Ljava/lang/String;)Landroid/icu/util/TimeZone;"/>
+ <method name="getTimeZone(Ljava/lang/String;I)Landroid/icu/util/TimeZone;"/>
+ <method name="getWindowsID(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="hasSameRules(Landroid/icu/util/TimeZone;)Z"/>
+ <method name="inDaylightTime(Ljava/util/Date;)Z"/>
+ <method name="observesDaylightTime()Z"/>
+ <method name="setID(Ljava/lang/String;)V"/>
+ <method name="setRawOffset(I)V"/>
+ <method name="useDaylightTime()Z"/>
+ <field name="GENERIC_LOCATION"/>
+ <field name="GMT_ZONE"/>
+ <field name="LONG"/>
+ <field name="LONG_GENERIC"/>
+ <field name="LONG_GMT"/>
+ <field name="SHORT"/>
+ <field name="SHORT_COMMONLY_USED"/>
+ <field name="SHORT_GENERIC"/>
+ <field name="SHORT_GMT"/>
+ <field name="TIMEZONE_ICU" since="26"/>
+ <field name="TIMEZONE_JDK" since="26"/>
+ <field name="UNKNOWN_ZONE"/>
+ <field name="UNKNOWN_ZONE_ID"/>
+ </class>
+ <class name="android/icu/util/TimeZone$SystemTimeZoneType" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/util/TimeZone$SystemTimeZoneType;"/>
+ <method name="values()[Landroid/icu/util/TimeZone$SystemTimeZoneType;"/>
+ </class>
+ <class name="android/icu/util/ULocale" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="acceptLanguage(Ljava/lang/String;[Landroid/icu/util/ULocale;[Z)Landroid/icu/util/ULocale;"/>
+ <method name="acceptLanguage(Ljava/lang/String;[Z)Landroid/icu/util/ULocale;"/>
+ <method name="acceptLanguage([Landroid/icu/util/ULocale;[Landroid/icu/util/ULocale;[Z)Landroid/icu/util/ULocale;"/>
+ <method name="acceptLanguage([Landroid/icu/util/ULocale;[Z)Landroid/icu/util/ULocale;"/>
+ <method name="addLikelySubtags(Landroid/icu/util/ULocale;)Landroid/icu/util/ULocale;"/>
+ <method name="canonicalize(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="compareTo(Landroid/icu/util/ULocale;)I"/>
+ <method name="createCanonical(Ljava/lang/String;)Landroid/icu/util/ULocale;"/>
+ <method name="forLanguageTag(Ljava/lang/String;)Landroid/icu/util/ULocale;"/>
+ <method name="forLocale(Ljava/util/Locale;)Landroid/icu/util/ULocale;"/>
+ <method name="getAvailableLocales()[Landroid/icu/util/ULocale;"/>
+ <method name="getBaseName()Ljava/lang/String;"/>
+ <method name="getBaseName(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getCharacterOrientation()Ljava/lang/String;"/>
+ <method name="getCountry()Ljava/lang/String;"/>
+ <method name="getCountry(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getDefault()Landroid/icu/util/ULocale;"/>
+ <method name="getDefault(Landroid/icu/util/ULocale$Category;)Landroid/icu/util/ULocale;"/>
+ <method name="getDisplayCountry()Ljava/lang/String;"/>
+ <method name="getDisplayCountry(Landroid/icu/util/ULocale;)Ljava/lang/String;"/>
+ <method name="getDisplayCountry(Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/lang/String;"/>
+ <method name="getDisplayCountry(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getDisplayKeyword(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getDisplayKeyword(Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/lang/String;"/>
+ <method name="getDisplayKeyword(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getDisplayKeywordValue(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getDisplayKeywordValue(Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/lang/String;"/>
+ <method name="getDisplayKeywordValue(Ljava/lang/String;Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/lang/String;"/>
+ <method name="getDisplayKeywordValue(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getDisplayLanguage()Ljava/lang/String;"/>
+ <method name="getDisplayLanguage(Landroid/icu/util/ULocale;)Ljava/lang/String;"/>
+ <method name="getDisplayLanguage(Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/lang/String;"/>
+ <method name="getDisplayLanguage(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getDisplayLanguageWithDialect()Ljava/lang/String;"/>
+ <method name="getDisplayLanguageWithDialect(Landroid/icu/util/ULocale;)Ljava/lang/String;"/>
+ <method name="getDisplayLanguageWithDialect(Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/lang/String;"/>
+ <method name="getDisplayLanguageWithDialect(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getDisplayName()Ljava/lang/String;"/>
+ <method name="getDisplayName(Landroid/icu/util/ULocale;)Ljava/lang/String;"/>
+ <method name="getDisplayName(Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/lang/String;"/>
+ <method name="getDisplayName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getDisplayNameWithDialect()Ljava/lang/String;"/>
+ <method name="getDisplayNameWithDialect(Landroid/icu/util/ULocale;)Ljava/lang/String;"/>
+ <method name="getDisplayNameWithDialect(Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/lang/String;"/>
+ <method name="getDisplayNameWithDialect(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getDisplayScript()Ljava/lang/String;"/>
+ <method name="getDisplayScript(Landroid/icu/util/ULocale;)Ljava/lang/String;"/>
+ <method name="getDisplayScript(Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/lang/String;"/>
+ <method name="getDisplayScript(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getDisplayVariant()Ljava/lang/String;"/>
+ <method name="getDisplayVariant(Landroid/icu/util/ULocale;)Ljava/lang/String;"/>
+ <method name="getDisplayVariant(Ljava/lang/String;Landroid/icu/util/ULocale;)Ljava/lang/String;"/>
+ <method name="getDisplayVariant(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getExtension(C)Ljava/lang/String;"/>
+ <method name="getExtensionKeys()Ljava/util/Set;"/>
+ <method name="getFallback()Landroid/icu/util/ULocale;"/>
+ <method name="getFallback(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getISO3Country()Ljava/lang/String;"/>
+ <method name="getISO3Country(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getISO3Language()Ljava/lang/String;"/>
+ <method name="getISO3Language(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getISOCountries()[Ljava/lang/String;"/>
+ <method name="getISOLanguages()[Ljava/lang/String;"/>
+ <method name="getKeywordValue(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getKeywordValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getKeywords()Ljava/util/Iterator;"/>
+ <method name="getKeywords(Ljava/lang/String;)Ljava/util/Iterator;"/>
+ <method name="getLanguage()Ljava/lang/String;"/>
+ <method name="getLanguage(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getLineOrientation()Ljava/lang/String;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getName(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getScript()Ljava/lang/String;"/>
+ <method name="getScript(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getUnicodeLocaleAttributes()Ljava/util/Set;"/>
+ <method name="getUnicodeLocaleKeys()Ljava/util/Set;"/>
+ <method name="getUnicodeLocaleType(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getVariant()Ljava/lang/String;"/>
+ <method name="getVariant(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="isRightToLeft()Z"/>
+ <method name="minimizeSubtags(Landroid/icu/util/ULocale;)Landroid/icu/util/ULocale;"/>
+ <method name="setKeywordValue(Ljava/lang/String;Ljava/lang/String;)Landroid/icu/util/ULocale;"/>
+ <method name="setKeywordValue(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="toLanguageTag()Ljava/lang/String;"/>
+ <method name="toLegacyKey(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="toLegacyType(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="toLocale()Ljava/util/Locale;"/>
+ <method name="toUnicodeLocaleKey(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="toUnicodeLocaleType(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <field name="CANADA"/>
+ <field name="CANADA_FRENCH"/>
+ <field name="CHINA"/>
+ <field name="CHINESE"/>
+ <field name="ENGLISH"/>
+ <field name="FRANCE"/>
+ <field name="FRENCH"/>
+ <field name="GERMAN"/>
+ <field name="GERMANY"/>
+ <field name="ITALIAN"/>
+ <field name="ITALY"/>
+ <field name="JAPAN"/>
+ <field name="JAPANESE"/>
+ <field name="KOREA"/>
+ <field name="KOREAN"/>
+ <field name="PRC"/>
+ <field name="PRIVATE_USE_EXTENSION"/>
+ <field name="ROOT"/>
+ <field name="SIMPLIFIED_CHINESE"/>
+ <field name="TAIWAN"/>
+ <field name="TRADITIONAL_CHINESE"/>
+ <field name="UK"/>
+ <field name="UNICODE_LOCALE_EXTENSION"/>
+ <field name="US"/>
+ </class>
+ <class name="android/icu/util/ULocale$Builder" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addUnicodeLocaleAttribute(Ljava/lang/String;)Landroid/icu/util/ULocale$Builder;"/>
+ <method name="build()Landroid/icu/util/ULocale;"/>
+ <method name="clear()Landroid/icu/util/ULocale$Builder;"/>
+ <method name="clearExtensions()Landroid/icu/util/ULocale$Builder;"/>
+ <method name="removeUnicodeLocaleAttribute(Ljava/lang/String;)Landroid/icu/util/ULocale$Builder;"/>
+ <method name="setExtension(CLjava/lang/String;)Landroid/icu/util/ULocale$Builder;"/>
+ <method name="setLanguage(Ljava/lang/String;)Landroid/icu/util/ULocale$Builder;"/>
+ <method name="setLanguageTag(Ljava/lang/String;)Landroid/icu/util/ULocale$Builder;"/>
+ <method name="setLocale(Landroid/icu/util/ULocale;)Landroid/icu/util/ULocale$Builder;"/>
+ <method name="setRegion(Ljava/lang/String;)Landroid/icu/util/ULocale$Builder;"/>
+ <method name="setScript(Ljava/lang/String;)Landroid/icu/util/ULocale$Builder;"/>
+ <method name="setUnicodeLocaleKeyword(Ljava/lang/String;Ljava/lang/String;)Landroid/icu/util/ULocale$Builder;"/>
+ <method name="setVariant(Ljava/lang/String;)Landroid/icu/util/ULocale$Builder;"/>
+ </class>
+ <class name="android/icu/util/ULocale$Category" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/icu/util/ULocale$Category;"/>
+ <method name="values()[Landroid/icu/util/ULocale$Category;"/>
+ <field name="DISPLAY"/>
+ <field name="FORMAT"/>
+ </class>
+ <class name="android/icu/util/UniversalTimeScale" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="bigDecimalFrom(DI)Landroid/icu/math/BigDecimal;"/>
+ <method name="bigDecimalFrom(JI)Landroid/icu/math/BigDecimal;"/>
+ <method name="bigDecimalFrom(Landroid/icu/math/BigDecimal;I)Landroid/icu/math/BigDecimal;"/>
+ <method name="from(JI)J"/>
+ <method name="getTimeScaleValue(II)J"/>
+ <method name="toBigDecimal(JI)Landroid/icu/math/BigDecimal;"/>
+ <method name="toBigDecimal(Landroid/icu/math/BigDecimal;I)Landroid/icu/math/BigDecimal;"/>
+ <method name="toLong(JI)J"/>
+ <field name="DB2_TIME"/>
+ <field name="DOTNET_DATE_TIME"/>
+ <field name="EPOCH_OFFSET_PLUS_1_VALUE"/>
+ <field name="EPOCH_OFFSET_VALUE"/>
+ <field name="EXCEL_TIME"/>
+ <field name="FROM_MAX_VALUE"/>
+ <field name="FROM_MIN_VALUE"/>
+ <field name="ICU4C_TIME"/>
+ <field name="JAVA_TIME"/>
+ <field name="MAC_OLD_TIME"/>
+ <field name="MAC_TIME"/>
+ <field name="MAX_SCALE" deprecated="27"/>
+ <field name="TO_MAX_VALUE"/>
+ <field name="TO_MIN_VALUE"/>
+ <field name="UNITS_VALUE"/>
+ <field name="UNIX_MICROSECONDS_TIME"/>
+ <field name="UNIX_TIME"/>
+ <field name="WINDOWS_FILE_TIME"/>
+ </class>
+ <class name="android/icu/util/ValueIterator" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="next(Landroid/icu/util/ValueIterator$Element;)Z"/>
+ <method name="reset()V"/>
+ <method name="setRange(II)V"/>
+ </class>
+ <class name="android/icu/util/ValueIterator$Element" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="integer"/>
+ <field name="value"/>
+ </class>
+ <class name="android/icu/util/VersionInfo" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>()V"/>
+ <method name="compareTo(Landroid/icu/util/VersionInfo;)I"/>
+ <method name="getInstance(I)Landroid/icu/util/VersionInfo;"/>
+ <method name="getInstance(II)Landroid/icu/util/VersionInfo;"/>
+ <method name="getInstance(III)Landroid/icu/util/VersionInfo;"/>
+ <method name="getInstance(IIII)Landroid/icu/util/VersionInfo;"/>
+ <method name="getInstance(Ljava/lang/String;)Landroid/icu/util/VersionInfo;"/>
+ <method name="getMajor()I"/>
+ <method name="getMicro()I"/>
+ <method name="getMilli()I"/>
+ <method name="getMinor()I"/>
+ <field name="ICU_VERSION"/>
+ <field name="UCOL_BUILDER_VERSION"/>
+ <field name="UCOL_RUNTIME_VERSION"/>
+ <field name="UNICODE_1_0"/>
+ <field name="UNICODE_1_0_1"/>
+ <field name="UNICODE_1_1_0"/>
+ <field name="UNICODE_1_1_5"/>
+ <field name="UNICODE_2_0"/>
+ <field name="UNICODE_2_1_2"/>
+ <field name="UNICODE_2_1_5"/>
+ <field name="UNICODE_2_1_8"/>
+ <field name="UNICODE_2_1_9"/>
+ <field name="UNICODE_3_0"/>
+ <field name="UNICODE_3_0_1"/>
+ <field name="UNICODE_3_1_0"/>
+ <field name="UNICODE_3_1_1"/>
+ <field name="UNICODE_3_2"/>
+ <field name="UNICODE_4_0"/>
+ <field name="UNICODE_4_0_1"/>
+ <field name="UNICODE_4_1"/>
+ <field name="UNICODE_5_0"/>
+ <field name="UNICODE_5_1"/>
+ <field name="UNICODE_5_2"/>
+ <field name="UNICODE_6_0"/>
+ <field name="UNICODE_6_1"/>
+ <field name="UNICODE_6_2"/>
+ <field name="UNICODE_6_3"/>
+ <field name="UNICODE_7_0"/>
+ <field name="UNICODE_8_0"/>
+ <field name="UNICODE_9_0" since="26"/>
+ </class>
+ <class name="android/inputmethodservice/AbstractInputMethodService" since="3">
+ <extends name="android/app/Service"/>
+ <implements name="android/view/KeyEvent$Callback"/>
+ <method name="&lt;init>()V"/>
+ <method name="getKeyDispatcherState()Landroid/view/KeyEvent$DispatcherState;" since="5"/>
+ <method name="onCreateInputMethodInterface()Landroid/inputmethodservice/AbstractInputMethodService$AbstractInputMethodImpl;"/>
+ <method name="onCreateInputMethodSessionInterface()Landroid/inputmethodservice/AbstractInputMethodService$AbstractInputMethodSessionImpl;"/>
+ <method name="onGenericMotionEvent(Landroid/view/MotionEvent;)Z" since="17"/>
+ <method name="onTrackballEvent(Landroid/view/MotionEvent;)Z"/>
+ </class>
+ <class name="android/inputmethodservice/AbstractInputMethodService$AbstractInputMethodImpl" since="3">
+ <extends name="java/lang/Object"/>
+ <implements name="android/view/inputmethod/InputMethod"/>
+ <method name="&lt;init>(Landroid/inputmethodservice/AbstractInputMethodService;)V"/>
+ </class>
+ <class name="android/inputmethodservice/AbstractInputMethodService$AbstractInputMethodSessionImpl" since="3">
+ <extends name="java/lang/Object"/>
+ <implements name="android/view/inputmethod/InputMethodSession"/>
+ <method name="&lt;init>(Landroid/inputmethodservice/AbstractInputMethodService;)V"/>
+ <method name="isEnabled()Z"/>
+ <method name="isRevoked()Z"/>
+ <method name="revokeSelf()V"/>
+ <method name="setEnabled(Z)V"/>
+ </class>
+ <class name="android/inputmethodservice/ExtractEditText" since="3">
+ <extends name="android/widget/EditText"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="finishInternalChanges()V"/>
+ <method name="hasVerticalScrollBar()Z"/>
+ <method name="startInternalChanges()V"/>
+ </class>
+ <class name="android/inputmethodservice/InputMethodService" since="3">
+ <extends name="android/inputmethodservice/AbstractInputMethodService"/>
+ <method name="&lt;init>()V"/>
+ <method name="enableHardwareAcceleration()Z" since="17" deprecated="21"/>
+ <method name="getBackDisposition()I" since="11"/>
+ <method name="getCandidatesHiddenVisibility()I"/>
+ <method name="getCurrentInputBinding()Landroid/view/inputmethod/InputBinding;"/>
+ <method name="getCurrentInputConnection()Landroid/view/inputmethod/InputConnection;"/>
+ <method name="getCurrentInputEditorInfo()Landroid/view/inputmethod/EditorInfo;"/>
+ <method name="getCurrentInputStarted()Z"/>
+ <method name="getInputMethodWindowRecommendedHeight()I" since="21"/>
+ <method name="getLayoutInflater()Landroid/view/LayoutInflater;"/>
+ <method name="getMaxWidth()I"/>
+ <method name="getTextForImeAction(I)Ljava/lang/CharSequence;"/>
+ <method name="getWindow()Landroid/app/Dialog;"/>
+ <method name="hideStatusIcon()V"/>
+ <method name="hideWindow()V"/>
+ <method name="isExtractViewShown()Z"/>
+ <method name="isFullscreenMode()Z"/>
+ <method name="isInputViewShown()Z"/>
+ <method name="isShowInputRequested()Z"/>
+ <method name="onAppPrivateCommand(Ljava/lang/String;Landroid/os/Bundle;)V"/>
+ <method name="onBindInput()V"/>
+ <method name="onComputeInsets(Landroid/inputmethodservice/InputMethodService$Insets;)V"/>
+ <method name="onConfigureWindow(Landroid/view/Window;ZZ)V"/>
+ <method name="onCreateCandidatesView()Landroid/view/View;"/>
+ <method name="onCreateExtractTextView()Landroid/view/View;"/>
+ <method name="onCreateInputView()Landroid/view/View;"/>
+ <method name="onCurrentInputMethodSubtypeChanged(Landroid/view/inputmethod/InputMethodSubtype;)V" since="11"/>
+ <method name="onDisplayCompletions([Landroid/view/inputmethod/CompletionInfo;)V"/>
+ <method name="onEvaluateFullscreenMode()Z"/>
+ <method name="onEvaluateInputViewShown()Z"/>
+ <method name="onExtractTextContextMenuItem(I)Z"/>
+ <method name="onExtractedCursorMovement(II)V"/>
+ <method name="onExtractedSelectionChanged(II)V"/>
+ <method name="onExtractedTextClicked()V"/>
+ <method name="onExtractingInputChanged(Landroid/view/inputmethod/EditorInfo;)V"/>
+ <method name="onFinishCandidatesView(Z)V"/>
+ <method name="onFinishInput()V"/>
+ <method name="onFinishInputView(Z)V"/>
+ <method name="onInitializeInterface()V"/>
+ <method name="onShowInputRequested(IZ)Z"/>
+ <method name="onStartCandidatesView(Landroid/view/inputmethod/EditorInfo;Z)V"/>
+ <method name="onStartInput(Landroid/view/inputmethod/EditorInfo;Z)V"/>
+ <method name="onStartInputView(Landroid/view/inputmethod/EditorInfo;Z)V"/>
+ <method name="onUnbindInput()V"/>
+ <method name="onUpdateCursor(Landroid/graphics/Rect;)V" deprecated="21"/>
+ <method name="onUpdateCursorAnchorInfo(Landroid/view/inputmethod/CursorAnchorInfo;)V" since="21"/>
+ <method name="onUpdateExtractedText(ILandroid/view/inputmethod/ExtractedText;)V"/>
+ <method name="onUpdateExtractingViews(Landroid/view/inputmethod/EditorInfo;)V"/>
+ <method name="onUpdateExtractingVisibility(Landroid/view/inputmethod/EditorInfo;)V"/>
+ <method name="onUpdateSelection(IIIIII)V"/>
+ <method name="onViewClicked(Z)V" since="14"/>
+ <method name="onWindowHidden()V"/>
+ <method name="onWindowShown()V"/>
+ <method name="requestHideSelf(I)V"/>
+ <method name="sendDefaultEditorAction(Z)Z"/>
+ <method name="sendDownUpKeyEvents(I)V"/>
+ <method name="sendKeyChar(C)V"/>
+ <method name="setBackDisposition(I)V" since="11"/>
+ <method name="setCandidatesView(Landroid/view/View;)V"/>
+ <method name="setCandidatesViewShown(Z)V"/>
+ <method name="setExtractView(Landroid/view/View;)V"/>
+ <method name="setExtractViewShown(Z)V"/>
+ <method name="setInputView(Landroid/view/View;)V"/>
+ <method name="showStatusIcon(I)V"/>
+ <method name="showWindow(Z)V"/>
+ <method name="switchInputMethod(Ljava/lang/String;)V"/>
+ <method name="updateFullscreenMode()V"/>
+ <method name="updateInputViewShown()V"/>
+ <field name="BACK_DISPOSITION_DEFAULT" since="11"/>
+ <field name="BACK_DISPOSITION_WILL_DISMISS" since="11"/>
+ <field name="BACK_DISPOSITION_WILL_NOT_DISMISS" since="11"/>
+ </class>
+ <class name="android/inputmethodservice/InputMethodService$InputMethodImpl" since="3">
+ <extends name="android/inputmethodservice/AbstractInputMethodService$AbstractInputMethodImpl"/>
+ <method name="&lt;init>(Landroid/inputmethodservice/InputMethodService;)V"/>
+ </class>
+ <class name="android/inputmethodservice/InputMethodService$InputMethodSessionImpl" since="3">
+ <extends name="android/inputmethodservice/AbstractInputMethodService$AbstractInputMethodSessionImpl"/>
+ <method name="&lt;init>(Landroid/inputmethodservice/InputMethodService;)V"/>
+ </class>
+ <class name="android/inputmethodservice/InputMethodService$Insets" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="TOUCHABLE_INSETS_CONTENT"/>
+ <field name="TOUCHABLE_INSETS_FRAME"/>
+ <field name="TOUCHABLE_INSETS_REGION" since="11"/>
+ <field name="TOUCHABLE_INSETS_VISIBLE"/>
+ <field name="contentTopInsets"/>
+ <field name="touchableInsets"/>
+ <field name="touchableRegion" since="11"/>
+ <field name="visibleTopInsets"/>
+ </class>
+ <class name="android/inputmethodservice/Keyboard" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;II)V"/>
+ <method name="&lt;init>(Landroid/content/Context;IIII)V" since="11"/>
+ <method name="&lt;init>(Landroid/content/Context;ILjava/lang/CharSequence;II)V"/>
+ <method name="createKeyFromXml(Landroid/content/res/Resources;Landroid/inputmethodservice/Keyboard$Row;IILandroid/content/res/XmlResourceParser;)Landroid/inputmethodservice/Keyboard$Key;"/>
+ <method name="createRowFromXml(Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;)Landroid/inputmethodservice/Keyboard$Row;"/>
+ <method name="getHeight()I"/>
+ <method name="getHorizontalGap()I"/>
+ <method name="getKeyHeight()I"/>
+ <method name="getKeyWidth()I"/>
+ <method name="getKeys()Ljava/util/List;"/>
+ <method name="getMinWidth()I"/>
+ <method name="getModifierKeys()Ljava/util/List;"/>
+ <method name="getNearestKeys(II)[I"/>
+ <method name="getShiftKeyIndex()I"/>
+ <method name="getVerticalGap()I"/>
+ <method name="isShifted()Z"/>
+ <method name="setHorizontalGap(I)V"/>
+ <method name="setKeyHeight(I)V"/>
+ <method name="setKeyWidth(I)V"/>
+ <method name="setShifted(Z)Z"/>
+ <method name="setVerticalGap(I)V"/>
+ <field name="EDGE_BOTTOM"/>
+ <field name="EDGE_LEFT"/>
+ <field name="EDGE_RIGHT"/>
+ <field name="EDGE_TOP"/>
+ <field name="KEYCODE_ALT"/>
+ <field name="KEYCODE_CANCEL"/>
+ <field name="KEYCODE_DELETE"/>
+ <field name="KEYCODE_DONE"/>
+ <field name="KEYCODE_MODE_CHANGE"/>
+ <field name="KEYCODE_SHIFT"/>
+ </class>
+ <class name="android/inputmethodservice/Keyboard$Key" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/res/Resources;Landroid/inputmethodservice/Keyboard$Row;IILandroid/content/res/XmlResourceParser;)V"/>
+ <method name="&lt;init>(Landroid/inputmethodservice/Keyboard$Row;)V"/>
+ <method name="getCurrentDrawableState()[I"/>
+ <method name="isInside(II)Z"/>
+ <method name="onPressed()V"/>
+ <method name="onReleased(Z)V"/>
+ <method name="squaredDistanceFrom(II)I"/>
+ <field name="codes"/>
+ <field name="edgeFlags"/>
+ <field name="gap"/>
+ <field name="height"/>
+ <field name="icon"/>
+ <field name="iconPreview"/>
+ <field name="label"/>
+ <field name="modifier"/>
+ <field name="on"/>
+ <field name="popupCharacters"/>
+ <field name="popupResId"/>
+ <field name="pressed"/>
+ <field name="repeatable"/>
+ <field name="sticky"/>
+ <field name="text"/>
+ <field name="width"/>
+ <field name="x"/>
+ <field name="y"/>
+ </class>
+ <class name="android/inputmethodservice/Keyboard$Row" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/res/Resources;Landroid/inputmethodservice/Keyboard;Landroid/content/res/XmlResourceParser;)V"/>
+ <method name="&lt;init>(Landroid/inputmethodservice/Keyboard;)V"/>
+ <field name="defaultHeight"/>
+ <field name="defaultHorizontalGap"/>
+ <field name="defaultWidth"/>
+ <field name="mode"/>
+ <field name="rowEdgeFlags"/>
+ <field name="verticalGap"/>
+ </class>
+ <class name="android/inputmethodservice/KeyboardView" since="3">
+ <extends name="android/view/View"/>
+ <implements name="android/view/View$OnClickListener"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="closing()V"/>
+ <method name="getKeyboard()Landroid/inputmethodservice/Keyboard;"/>
+ <method name="getOnKeyboardActionListener()Landroid/inputmethodservice/KeyboardView$OnKeyboardActionListener;"/>
+ <method name="handleBack()Z"/>
+ <method name="invalidateAllKeys()V" since="4"/>
+ <method name="invalidateKey(I)V" since="4"/>
+ <method name="isPreviewEnabled()Z"/>
+ <method name="isProximityCorrectionEnabled()Z"/>
+ <method name="isShifted()Z"/>
+ <method name="onLongPress(Landroid/inputmethodservice/Keyboard$Key;)Z"/>
+ <method name="setKeyboard(Landroid/inputmethodservice/Keyboard;)V"/>
+ <method name="setOnKeyboardActionListener(Landroid/inputmethodservice/KeyboardView$OnKeyboardActionListener;)V"/>
+ <method name="setPopupOffset(II)V"/>
+ <method name="setPopupParent(Landroid/view/View;)V"/>
+ <method name="setPreviewEnabled(Z)V"/>
+ <method name="setProximityCorrectionEnabled(Z)V"/>
+ <method name="setShifted(Z)Z"/>
+ <method name="setVerticalCorrection(I)V"/>
+ <method name="swipeDown()V"/>
+ <method name="swipeLeft()V"/>
+ <method name="swipeRight()V"/>
+ <method name="swipeUp()V"/>
+ </class>
+ <class name="android/inputmethodservice/KeyboardView$OnKeyboardActionListener" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="onKey(I[I)V"/>
+ <method name="onPress(I)V"/>
+ <method name="onRelease(I)V"/>
+ <method name="onText(Ljava/lang/CharSequence;)V"/>
+ <method name="swipeDown()V"/>
+ <method name="swipeLeft()V"/>
+ <method name="swipeRight()V"/>
+ <method name="swipeUp()V"/>
+ </class>
+ <class name="android/location/Address" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V"/>
+ <method name="clearLatitude()V"/>
+ <method name="clearLongitude()V"/>
+ <method name="getAddressLine(I)Ljava/lang/String;"/>
+ <method name="getAdminArea()Ljava/lang/String;"/>
+ <method name="getCountryCode()Ljava/lang/String;"/>
+ <method name="getCountryName()Ljava/lang/String;"/>
+ <method name="getExtras()Landroid/os/Bundle;"/>
+ <method name="getFeatureName()Ljava/lang/String;"/>
+ <method name="getLatitude()D"/>
+ <method name="getLocale()Ljava/util/Locale;"/>
+ <method name="getLocality()Ljava/lang/String;"/>
+ <method name="getLongitude()D"/>
+ <method name="getMaxAddressLineIndex()I"/>
+ <method name="getPhone()Ljava/lang/String;"/>
+ <method name="getPostalCode()Ljava/lang/String;"/>
+ <method name="getPremises()Ljava/lang/String;" since="4"/>
+ <method name="getSubAdminArea()Ljava/lang/String;"/>
+ <method name="getSubLocality()Ljava/lang/String;" since="4"/>
+ <method name="getSubThoroughfare()Ljava/lang/String;" since="4"/>
+ <method name="getThoroughfare()Ljava/lang/String;"/>
+ <method name="getUrl()Ljava/lang/String;"/>
+ <method name="hasLatitude()Z"/>
+ <method name="hasLongitude()Z"/>
+ <method name="setAddressLine(ILjava/lang/String;)V"/>
+ <method name="setAdminArea(Ljava/lang/String;)V"/>
+ <method name="setCountryCode(Ljava/lang/String;)V"/>
+ <method name="setCountryName(Ljava/lang/String;)V"/>
+ <method name="setExtras(Landroid/os/Bundle;)V"/>
+ <method name="setFeatureName(Ljava/lang/String;)V"/>
+ <method name="setLatitude(D)V"/>
+ <method name="setLocality(Ljava/lang/String;)V"/>
+ <method name="setLongitude(D)V"/>
+ <method name="setPhone(Ljava/lang/String;)V"/>
+ <method name="setPostalCode(Ljava/lang/String;)V"/>
+ <method name="setPremises(Ljava/lang/String;)V" since="4"/>
+ <method name="setSubAdminArea(Ljava/lang/String;)V"/>
+ <method name="setSubLocality(Ljava/lang/String;)V" since="4"/>
+ <method name="setSubThoroughfare(Ljava/lang/String;)V" since="4"/>
+ <method name="setThoroughfare(Ljava/lang/String;)V"/>
+ <method name="setUrl(Ljava/lang/String;)V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/location/Criteria" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/location/Criteria;)V"/>
+ <method name="getAccuracy()I"/>
+ <method name="getBearingAccuracy()I" since="9"/>
+ <method name="getHorizontalAccuracy()I" since="9"/>
+ <method name="getPowerRequirement()I"/>
+ <method name="getSpeedAccuracy()I" since="9"/>
+ <method name="getVerticalAccuracy()I" since="9"/>
+ <method name="isAltitudeRequired()Z"/>
+ <method name="isBearingRequired()Z"/>
+ <method name="isCostAllowed()Z"/>
+ <method name="isSpeedRequired()Z"/>
+ <method name="setAccuracy(I)V"/>
+ <method name="setAltitudeRequired(Z)V"/>
+ <method name="setBearingAccuracy(I)V" since="9"/>
+ <method name="setBearingRequired(Z)V"/>
+ <method name="setCostAllowed(Z)V"/>
+ <method name="setHorizontalAccuracy(I)V" since="9"/>
+ <method name="setPowerRequirement(I)V"/>
+ <method name="setSpeedAccuracy(I)V" since="9"/>
+ <method name="setSpeedRequired(Z)V"/>
+ <method name="setVerticalAccuracy(I)V" since="9"/>
+ <field name="ACCURACY_COARSE"/>
+ <field name="ACCURACY_FINE"/>
+ <field name="ACCURACY_HIGH" since="9"/>
+ <field name="ACCURACY_LOW" since="9"/>
+ <field name="ACCURACY_MEDIUM" since="9"/>
+ <field name="CREATOR"/>
+ <field name="NO_REQUIREMENT"/>
+ <field name="POWER_HIGH"/>
+ <field name="POWER_LOW"/>
+ <field name="POWER_MEDIUM"/>
+ </class>
+ <class name="android/location/Geocoder" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Ljava/util/Locale;)V"/>
+ <method name="getFromLocation(DDI)Ljava/util/List;"/>
+ <method name="getFromLocationName(Ljava/lang/String;I)Ljava/util/List;"/>
+ <method name="getFromLocationName(Ljava/lang/String;IDDDD)Ljava/util/List;"/>
+ <method name="isPresent()Z" since="9"/>
+ </class>
+ <class name="android/location/GnssClock" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getBiasNanos()D"/>
+ <method name="getBiasUncertaintyNanos()D"/>
+ <method name="getDriftNanosPerSecond()D"/>
+ <method name="getDriftUncertaintyNanosPerSecond()D"/>
+ <method name="getFullBiasNanos()J"/>
+ <method name="getHardwareClockDiscontinuityCount()I"/>
+ <method name="getLeapSecond()I"/>
+ <method name="getTimeNanos()J"/>
+ <method name="getTimeUncertaintyNanos()D"/>
+ <method name="hasBiasNanos()Z"/>
+ <method name="hasBiasUncertaintyNanos()Z"/>
+ <method name="hasDriftNanosPerSecond()Z"/>
+ <method name="hasDriftUncertaintyNanosPerSecond()Z"/>
+ <method name="hasFullBiasNanos()Z"/>
+ <method name="hasLeapSecond()Z"/>
+ <method name="hasTimeUncertaintyNanos()Z"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/location/GnssMeasurement" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAccumulatedDeltaRangeMeters()D"/>
+ <method name="getAccumulatedDeltaRangeState()I"/>
+ <method name="getAccumulatedDeltaRangeUncertaintyMeters()D"/>
+ <method name="getAutomaticGainControlLevelDb()D" since="26"/>
+ <method name="getCarrierCycles()J"/>
+ <method name="getCarrierFrequencyHz()F"/>
+ <method name="getCarrierPhase()D"/>
+ <method name="getCarrierPhaseUncertainty()D"/>
+ <method name="getCn0DbHz()D"/>
+ <method name="getConstellationType()I"/>
+ <method name="getMultipathIndicator()I"/>
+ <method name="getPseudorangeRateMetersPerSecond()D"/>
+ <method name="getPseudorangeRateUncertaintyMetersPerSecond()D"/>
+ <method name="getReceivedSvTimeNanos()J"/>
+ <method name="getReceivedSvTimeUncertaintyNanos()J"/>
+ <method name="getSnrInDb()D"/>
+ <method name="getState()I"/>
+ <method name="getSvid()I"/>
+ <method name="getTimeOffsetNanos()D"/>
+ <method name="hasAutomaticGainControlLevelDb()Z" since="26"/>
+ <method name="hasCarrierCycles()Z"/>
+ <method name="hasCarrierFrequencyHz()Z"/>
+ <method name="hasCarrierPhase()Z"/>
+ <method name="hasCarrierPhaseUncertainty()Z"/>
+ <method name="hasSnrInDb()Z"/>
+ <field name="ADR_STATE_CYCLE_SLIP"/>
+ <field name="ADR_STATE_RESET"/>
+ <field name="ADR_STATE_UNKNOWN"/>
+ <field name="ADR_STATE_VALID"/>
+ <field name="CREATOR"/>
+ <field name="MULTIPATH_INDICATOR_DETECTED"/>
+ <field name="MULTIPATH_INDICATOR_NOT_DETECTED"/>
+ <field name="MULTIPATH_INDICATOR_UNKNOWN"/>
+ <field name="STATE_BDS_D2_BIT_SYNC"/>
+ <field name="STATE_BDS_D2_SUBFRAME_SYNC"/>
+ <field name="STATE_BIT_SYNC"/>
+ <field name="STATE_CODE_LOCK"/>
+ <field name="STATE_GAL_E1BC_CODE_LOCK"/>
+ <field name="STATE_GAL_E1B_PAGE_SYNC"/>
+ <field name="STATE_GAL_E1C_2ND_CODE_LOCK"/>
+ <field name="STATE_GLO_STRING_SYNC"/>
+ <field name="STATE_GLO_TOD_DECODED"/>
+ <field name="STATE_GLO_TOD_KNOWN" since="26"/>
+ <field name="STATE_MSEC_AMBIGUOUS"/>
+ <field name="STATE_SBAS_SYNC"/>
+ <field name="STATE_SUBFRAME_SYNC"/>
+ <field name="STATE_SYMBOL_SYNC"/>
+ <field name="STATE_TOW_DECODED"/>
+ <field name="STATE_TOW_KNOWN" since="26"/>
+ <field name="STATE_UNKNOWN"/>
+ </class>
+ <class name="android/location/GnssMeasurementsEvent" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getClock()Landroid/location/GnssClock;"/>
+ <method name="getMeasurements()Ljava/util/Collection;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/location/GnssMeasurementsEvent$Callback" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onGnssMeasurementsReceived(Landroid/location/GnssMeasurementsEvent;)V"/>
+ <method name="onStatusChanged(I)V"/>
+ <field name="STATUS_LOCATION_DISABLED"/>
+ <field name="STATUS_NOT_SUPPORTED"/>
+ <field name="STATUS_READY"/>
+ </class>
+ <class name="android/location/GnssNavigationMessage" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getData()[B"/>
+ <method name="getMessageId()I"/>
+ <method name="getStatus()I"/>
+ <method name="getSubmessageId()I"/>
+ <method name="getSvid()I"/>
+ <method name="getType()I"/>
+ <field name="CREATOR"/>
+ <field name="STATUS_PARITY_PASSED"/>
+ <field name="STATUS_PARITY_REBUILT"/>
+ <field name="STATUS_UNKNOWN"/>
+ <field name="TYPE_BDS_D1"/>
+ <field name="TYPE_BDS_D2"/>
+ <field name="TYPE_GAL_F"/>
+ <field name="TYPE_GAL_I"/>
+ <field name="TYPE_GLO_L1CA"/>
+ <field name="TYPE_GPS_CNAV2"/>
+ <field name="TYPE_GPS_L1CA"/>
+ <field name="TYPE_GPS_L2CNAV"/>
+ <field name="TYPE_GPS_L5CNAV"/>
+ <field name="TYPE_UNKNOWN"/>
+ </class>
+ <class name="android/location/GnssNavigationMessage$Callback" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onGnssNavigationMessageReceived(Landroid/location/GnssNavigationMessage;)V"/>
+ <method name="onStatusChanged(I)V"/>
+ <field name="STATUS_LOCATION_DISABLED"/>
+ <field name="STATUS_NOT_SUPPORTED"/>
+ <field name="STATUS_READY"/>
+ </class>
+ <class name="android/location/GnssStatus" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAzimuthDegrees(I)F"/>
+ <method name="getCarrierFrequencyHz(I)F" since="26"/>
+ <method name="getCn0DbHz(I)F"/>
+ <method name="getConstellationType(I)I"/>
+ <method name="getElevationDegrees(I)F"/>
+ <method name="getSatelliteCount()I"/>
+ <method name="getSvid(I)I"/>
+ <method name="hasAlmanacData(I)Z"/>
+ <method name="hasCarrierFrequencyHz(I)Z" since="26"/>
+ <method name="hasEphemerisData(I)Z"/>
+ <method name="usedInFix(I)Z"/>
+ <field name="CONSTELLATION_BEIDOU"/>
+ <field name="CONSTELLATION_GALILEO"/>
+ <field name="CONSTELLATION_GLONASS"/>
+ <field name="CONSTELLATION_GPS"/>
+ <field name="CONSTELLATION_QZSS"/>
+ <field name="CONSTELLATION_SBAS"/>
+ <field name="CONSTELLATION_UNKNOWN"/>
+ </class>
+ <class name="android/location/GnssStatus$Callback" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onFirstFix(I)V"/>
+ <method name="onSatelliteStatusChanged(Landroid/location/GnssStatus;)V"/>
+ <method name="onStarted()V"/>
+ <method name="onStopped()V"/>
+ </class>
+ <class name="android/location/GpsSatellite" since="3" deprecated="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAzimuth()F"/>
+ <method name="getElevation()F"/>
+ <method name="getPrn()I"/>
+ <method name="getSnr()F"/>
+ <method name="hasAlmanac()Z"/>
+ <method name="hasEphemeris()Z"/>
+ <method name="usedInFix()Z"/>
+ </class>
+ <class name="android/location/GpsStatus" since="3" deprecated="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getMaxSatellites()I"/>
+ <method name="getSatellites()Ljava/lang/Iterable;"/>
+ <method name="getTimeToFirstFix()I"/>
+ <field name="GPS_EVENT_FIRST_FIX"/>
+ <field name="GPS_EVENT_SATELLITE_STATUS"/>
+ <field name="GPS_EVENT_STARTED"/>
+ <field name="GPS_EVENT_STOPPED"/>
+ </class>
+ <class name="android/location/GpsStatus$Listener" since="3" deprecated="24">
+ <extends name="java/lang/Object"/>
+ <method name="onGpsStatusChanged(I)V"/>
+ </class>
+ <class name="android/location/GpsStatus$NmeaListener" since="5" deprecated="24">
+ <extends name="java/lang/Object"/>
+ <method name="onNmeaReceived(JLjava/lang/String;)V"/>
+ </class>
+ <class name="android/location/Location" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/location/Location;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="bearingTo(Landroid/location/Location;)F"/>
+ <method name="convert(DI)Ljava/lang/String;"/>
+ <method name="convert(Ljava/lang/String;)D"/>
+ <method name="distanceBetween(DDDD[F)V"/>
+ <method name="distanceTo(Landroid/location/Location;)F"/>
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V" since="3"/>
+ <method name="getAccuracy()F"/>
+ <method name="getAltitude()D"/>
+ <method name="getBearing()F"/>
+ <method name="getBearingAccuracyDegrees()F" since="26"/>
+ <method name="getElapsedRealtimeNanos()J" since="17"/>
+ <method name="getExtras()Landroid/os/Bundle;"/>
+ <method name="getLatitude()D"/>
+ <method name="getLongitude()D"/>
+ <method name="getProvider()Ljava/lang/String;"/>
+ <method name="getSpeed()F"/>
+ <method name="getSpeedAccuracyMetersPerSecond()F" since="26"/>
+ <method name="getTime()J"/>
+ <method name="getVerticalAccuracyMeters()F" since="26"/>
+ <method name="hasAccuracy()Z"/>
+ <method name="hasAltitude()Z"/>
+ <method name="hasBearing()Z"/>
+ <method name="hasBearingAccuracy()Z" since="26"/>
+ <method name="hasSpeed()Z"/>
+ <method name="hasSpeedAccuracy()Z" since="26"/>
+ <method name="hasVerticalAccuracy()Z" since="26"/>
+ <method name="isFromMockProvider()Z" since="18"/>
+ <method name="removeAccuracy()V" deprecated="26"/>
+ <method name="removeAltitude()V" deprecated="26"/>
+ <method name="removeBearing()V" deprecated="26"/>
+ <method name="removeSpeed()V" deprecated="26"/>
+ <method name="reset()V"/>
+ <method name="set(Landroid/location/Location;)V"/>
+ <method name="setAccuracy(F)V"/>
+ <method name="setAltitude(D)V"/>
+ <method name="setBearing(F)V"/>
+ <method name="setBearingAccuracyDegrees(F)V" since="26"/>
+ <method name="setElapsedRealtimeNanos(J)V" since="17"/>
+ <method name="setExtras(Landroid/os/Bundle;)V"/>
+ <method name="setLatitude(D)V"/>
+ <method name="setLongitude(D)V"/>
+ <method name="setProvider(Ljava/lang/String;)V"/>
+ <method name="setSpeed(F)V"/>
+ <method name="setSpeedAccuracyMetersPerSecond(F)V" since="26"/>
+ <method name="setTime(J)V"/>
+ <method name="setVerticalAccuracyMeters(F)V" since="26"/>
+ <field name="CREATOR"/>
+ <field name="FORMAT_DEGREES"/>
+ <field name="FORMAT_MINUTES"/>
+ <field name="FORMAT_SECONDS"/>
+ </class>
+ <class name="android/location/LocationListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onLocationChanged(Landroid/location/Location;)V"/>
+ <method name="onProviderDisabled(Ljava/lang/String;)V"/>
+ <method name="onProviderEnabled(Ljava/lang/String;)V"/>
+ <method name="onStatusChanged(Ljava/lang/String;ILandroid/os/Bundle;)V"/>
+ </class>
+ <class name="android/location/LocationManager" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addGpsStatusListener(Landroid/location/GpsStatus$Listener;)Z" since="3" deprecated="24"/>
+ <method name="addNmeaListener(Landroid/location/GpsStatus$NmeaListener;)Z" since="5" deprecated="24"/>
+ <method name="addNmeaListener(Landroid/location/OnNmeaMessageListener;)Z" since="24"/>
+ <method name="addNmeaListener(Landroid/location/OnNmeaMessageListener;Landroid/os/Handler;)Z" since="24"/>
+ <method name="addProximityAlert(DDFJLandroid/app/PendingIntent;)V"/>
+ <method name="addTestProvider(Ljava/lang/String;ZZZZZZZII)V" since="3"/>
+ <method name="clearTestProviderEnabled(Ljava/lang/String;)V" since="3"/>
+ <method name="clearTestProviderLocation(Ljava/lang/String;)V" since="3"/>
+ <method name="clearTestProviderStatus(Ljava/lang/String;)V" since="3"/>
+ <method name="getAllProviders()Ljava/util/List;"/>
+ <method name="getBestProvider(Landroid/location/Criteria;Z)Ljava/lang/String;"/>
+ <method name="getGpsStatus(Landroid/location/GpsStatus;)Landroid/location/GpsStatus;" since="3" deprecated="24"/>
+ <method name="getLastKnownLocation(Ljava/lang/String;)Landroid/location/Location;"/>
+ <method name="getProvider(Ljava/lang/String;)Landroid/location/LocationProvider;"/>
+ <method name="getProviders(Landroid/location/Criteria;Z)Ljava/util/List;"/>
+ <method name="getProviders(Z)Ljava/util/List;"/>
+ <method name="isProviderEnabled(Ljava/lang/String;)Z"/>
+ <method name="registerGnssMeasurementsCallback(Landroid/location/GnssMeasurementsEvent$Callback;)Z" since="24"/>
+ <method name="registerGnssMeasurementsCallback(Landroid/location/GnssMeasurementsEvent$Callback;Landroid/os/Handler;)Z" since="24"/>
+ <method name="registerGnssNavigationMessageCallback(Landroid/location/GnssNavigationMessage$Callback;)Z" since="24"/>
+ <method name="registerGnssNavigationMessageCallback(Landroid/location/GnssNavigationMessage$Callback;Landroid/os/Handler;)Z" since="24"/>
+ <method name="registerGnssStatusCallback(Landroid/location/GnssStatus$Callback;)Z" since="24"/>
+ <method name="registerGnssStatusCallback(Landroid/location/GnssStatus$Callback;Landroid/os/Handler;)Z" since="24"/>
+ <method name="removeGpsStatusListener(Landroid/location/GpsStatus$Listener;)V" since="3" deprecated="24"/>
+ <method name="removeNmeaListener(Landroid/location/GpsStatus$NmeaListener;)V" since="5" deprecated="24"/>
+ <method name="removeNmeaListener(Landroid/location/OnNmeaMessageListener;)V" since="24"/>
+ <method name="removeProximityAlert(Landroid/app/PendingIntent;)V"/>
+ <method name="removeTestProvider(Ljava/lang/String;)V" since="3"/>
+ <method name="removeUpdates(Landroid/app/PendingIntent;)V" since="3"/>
+ <method name="removeUpdates(Landroid/location/LocationListener;)V"/>
+ <method name="requestLocationUpdates(JFLandroid/location/Criteria;Landroid/app/PendingIntent;)V" since="9"/>
+ <method name="requestLocationUpdates(JFLandroid/location/Criteria;Landroid/location/LocationListener;Landroid/os/Looper;)V" since="9"/>
+ <method name="requestLocationUpdates(Ljava/lang/String;JFLandroid/app/PendingIntent;)V" since="3"/>
+ <method name="requestLocationUpdates(Ljava/lang/String;JFLandroid/location/LocationListener;)V"/>
+ <method name="requestLocationUpdates(Ljava/lang/String;JFLandroid/location/LocationListener;Landroid/os/Looper;)V"/>
+ <method name="requestSingleUpdate(Landroid/location/Criteria;Landroid/app/PendingIntent;)V" since="9"/>
+ <method name="requestSingleUpdate(Landroid/location/Criteria;Landroid/location/LocationListener;Landroid/os/Looper;)V" since="9"/>
+ <method name="requestSingleUpdate(Ljava/lang/String;Landroid/app/PendingIntent;)V" since="9"/>
+ <method name="requestSingleUpdate(Ljava/lang/String;Landroid/location/LocationListener;Landroid/os/Looper;)V" since="9"/>
+ <method name="sendExtraCommand(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Z" since="3"/>
+ <method name="setTestProviderEnabled(Ljava/lang/String;Z)V" since="3"/>
+ <method name="setTestProviderLocation(Ljava/lang/String;Landroid/location/Location;)V" since="3"/>
+ <method name="setTestProviderStatus(Ljava/lang/String;ILandroid/os/Bundle;J)V" since="3"/>
+ <method name="unregisterGnssMeasurementsCallback(Landroid/location/GnssMeasurementsEvent$Callback;)V" since="24"/>
+ <method name="unregisterGnssNavigationMessageCallback(Landroid/location/GnssNavigationMessage$Callback;)V" since="24"/>
+ <method name="unregisterGnssStatusCallback(Landroid/location/GnssStatus$Callback;)V" since="24"/>
+ <field name="GPS_PROVIDER"/>
+ <field name="KEY_LOCATION_CHANGED" since="3"/>
+ <field name="KEY_PROVIDER_ENABLED" since="3"/>
+ <field name="KEY_PROXIMITY_ENTERING"/>
+ <field name="KEY_STATUS_CHANGED" since="3"/>
+ <field name="MODE_CHANGED_ACTION" since="19"/>
+ <field name="NETWORK_PROVIDER"/>
+ <field name="PASSIVE_PROVIDER" since="8"/>
+ <field name="PROVIDERS_CHANGED_ACTION" since="9"/>
+ </class>
+ <class name="android/location/LocationProvider" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAccuracy()I"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getPowerRequirement()I"/>
+ <method name="hasMonetaryCost()Z"/>
+ <method name="meetsCriteria(Landroid/location/Criteria;)Z"/>
+ <method name="requiresCell()Z"/>
+ <method name="requiresNetwork()Z"/>
+ <method name="requiresSatellite()Z"/>
+ <method name="supportsAltitude()Z"/>
+ <method name="supportsBearing()Z"/>
+ <method name="supportsSpeed()Z"/>
+ <field name="AVAILABLE"/>
+ <field name="OUT_OF_SERVICE"/>
+ <field name="TEMPORARILY_UNAVAILABLE"/>
+ </class>
+ <class name="android/location/OnNmeaMessageListener" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="onNmeaMessage(Ljava/lang/String;J)V"/>
+ </class>
+ <class name="android/location/SettingInjectorService" since="19">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="onGetEnabled()Z"/>
+ <method name="onGetSummary()Ljava/lang/String;" deprecated="21"/>
+ <field name="ACTION_INJECTED_SETTING_CHANGED"/>
+ <field name="ACTION_SERVICE_INTENT"/>
+ <field name="ATTRIBUTES_NAME"/>
+ <field name="META_DATA_NAME"/>
+ </class>
+ <class name="android/media/AsyncPlayer" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="play(Landroid/content/Context;Landroid/net/Uri;ZI)V" deprecated="23"/>
+ <method name="play(Landroid/content/Context;Landroid/net/Uri;ZLandroid/media/AudioAttributes;)V" since="23"/>
+ <method name="stop()V"/>
+ </class>
+ <class name="android/media/AudioAttributes" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getContentType()I"/>
+ <method name="getFlags()I"/>
+ <method name="getUsage()I"/>
+ <method name="getVolumeControlStream()I" since="26"/>
+ <field name="CONTENT_TYPE_MOVIE"/>
+ <field name="CONTENT_TYPE_MUSIC"/>
+ <field name="CONTENT_TYPE_SONIFICATION"/>
+ <field name="CONTENT_TYPE_SPEECH"/>
+ <field name="CONTENT_TYPE_UNKNOWN"/>
+ <field name="CREATOR"/>
+ <field name="FLAG_AUDIBILITY_ENFORCED"/>
+ <field name="FLAG_HW_AV_SYNC"/>
+ <field name="FLAG_LOW_LATENCY" since="24" deprecated="26"/>
+ <field name="USAGE_ALARM"/>
+ <field name="USAGE_ASSISTANCE_ACCESSIBILITY"/>
+ <field name="USAGE_ASSISTANCE_NAVIGATION_GUIDANCE"/>
+ <field name="USAGE_ASSISTANCE_SONIFICATION"/>
+ <field name="USAGE_ASSISTANT" since="26"/>
+ <field name="USAGE_GAME"/>
+ <field name="USAGE_MEDIA"/>
+ <field name="USAGE_NOTIFICATION"/>
+ <field name="USAGE_NOTIFICATION_COMMUNICATION_DELAYED"/>
+ <field name="USAGE_NOTIFICATION_COMMUNICATION_INSTANT"/>
+ <field name="USAGE_NOTIFICATION_COMMUNICATION_REQUEST"/>
+ <field name="USAGE_NOTIFICATION_EVENT"/>
+ <field name="USAGE_NOTIFICATION_RINGTONE"/>
+ <field name="USAGE_UNKNOWN"/>
+ <field name="USAGE_VOICE_COMMUNICATION"/>
+ <field name="USAGE_VOICE_COMMUNICATION_SIGNALLING"/>
+ </class>
+ <class name="android/media/AudioAttributes$Builder" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/media/AudioAttributes;)V"/>
+ <method name="build()Landroid/media/AudioAttributes;"/>
+ <method name="setContentType(I)Landroid/media/AudioAttributes$Builder;"/>
+ <method name="setFlags(I)Landroid/media/AudioAttributes$Builder;"/>
+ <method name="setLegacyStreamType(I)Landroid/media/AudioAttributes$Builder;"/>
+ <method name="setUsage(I)Landroid/media/AudioAttributes$Builder;"/>
+ </class>
+ <class name="android/media/AudioDeviceCallback" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onAudioDevicesAdded([Landroid/media/AudioDeviceInfo;)V"/>
+ <method name="onAudioDevicesRemoved([Landroid/media/AudioDeviceInfo;)V"/>
+ </class>
+ <class name="android/media/AudioDeviceInfo" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getChannelCounts()[I"/>
+ <method name="getChannelIndexMasks()[I"/>
+ <method name="getChannelMasks()[I"/>
+ <method name="getEncodings()[I"/>
+ <method name="getId()I"/>
+ <method name="getProductName()Ljava/lang/CharSequence;"/>
+ <method name="getSampleRates()[I"/>
+ <method name="getType()I"/>
+ <method name="isSink()Z"/>
+ <method name="isSource()Z"/>
+ <field name="TYPE_AUX_LINE"/>
+ <field name="TYPE_BLUETOOTH_A2DP"/>
+ <field name="TYPE_BLUETOOTH_SCO"/>
+ <field name="TYPE_BUILTIN_EARPIECE"/>
+ <field name="TYPE_BUILTIN_MIC"/>
+ <field name="TYPE_BUILTIN_SPEAKER"/>
+ <field name="TYPE_BUS" since="24"/>
+ <field name="TYPE_DOCK"/>
+ <field name="TYPE_FM"/>
+ <field name="TYPE_FM_TUNER"/>
+ <field name="TYPE_HDMI"/>
+ <field name="TYPE_HDMI_ARC"/>
+ <field name="TYPE_IP"/>
+ <field name="TYPE_LINE_ANALOG"/>
+ <field name="TYPE_LINE_DIGITAL"/>
+ <field name="TYPE_TELEPHONY"/>
+ <field name="TYPE_TV_TUNER"/>
+ <field name="TYPE_UNKNOWN"/>
+ <field name="TYPE_USB_ACCESSORY"/>
+ <field name="TYPE_USB_DEVICE"/>
+ <field name="TYPE_USB_HEADSET" since="26"/>
+ <field name="TYPE_WIRED_HEADPHONES"/>
+ <field name="TYPE_WIRED_HEADSET"/>
+ </class>
+ <class name="android/media/AudioFocusRequest" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="acceptsDelayedFocusGain()Z"/>
+ <method name="getAudioAttributes()Landroid/media/AudioAttributes;"/>
+ <method name="getFocusGain()I"/>
+ <method name="willPauseWhenDucked()Z"/>
+ </class>
+ <class name="android/media/AudioFocusRequest$Builder" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Landroid/media/AudioFocusRequest;)V"/>
+ <method name="build()Landroid/media/AudioFocusRequest;"/>
+ <method name="setAcceptsDelayedFocusGain(Z)Landroid/media/AudioFocusRequest$Builder;"/>
+ <method name="setAudioAttributes(Landroid/media/AudioAttributes;)Landroid/media/AudioFocusRequest$Builder;"/>
+ <method name="setFocusGain(I)Landroid/media/AudioFocusRequest$Builder;"/>
+ <method name="setOnAudioFocusChangeListener(Landroid/media/AudioManager$OnAudioFocusChangeListener;)Landroid/media/AudioFocusRequest$Builder;"/>
+ <method name="setOnAudioFocusChangeListener(Landroid/media/AudioManager$OnAudioFocusChangeListener;Landroid/os/Handler;)Landroid/media/AudioFocusRequest$Builder;"/>
+ <method name="setWillPauseWhenDucked(Z)Landroid/media/AudioFocusRequest$Builder;"/>
+ </class>
+ <class name="android/media/AudioFormat" since="3">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable" since="24"/>
+ <method name="&lt;init>()V"/>
+ <method name="getChannelCount()I" since="23"/>
+ <method name="getChannelIndexMask()I" since="23"/>
+ <method name="getChannelMask()I" since="21"/>
+ <method name="getEncoding()I" since="21"/>
+ <method name="getSampleRate()I" since="21"/>
+ <field name="CHANNEL_CONFIGURATION_DEFAULT" deprecated="16"/>
+ <field name="CHANNEL_CONFIGURATION_INVALID" deprecated="16"/>
+ <field name="CHANNEL_CONFIGURATION_MONO" deprecated="16"/>
+ <field name="CHANNEL_CONFIGURATION_STEREO" deprecated="16"/>
+ <field name="CHANNEL_INVALID" since="5"/>
+ <field name="CHANNEL_IN_BACK" since="5"/>
+ <field name="CHANNEL_IN_BACK_PROCESSED" since="5"/>
+ <field name="CHANNEL_IN_DEFAULT" since="5"/>
+ <field name="CHANNEL_IN_FRONT" since="5"/>
+ <field name="CHANNEL_IN_FRONT_PROCESSED" since="5"/>
+ <field name="CHANNEL_IN_LEFT" since="5"/>
+ <field name="CHANNEL_IN_LEFT_PROCESSED" since="5"/>
+ <field name="CHANNEL_IN_MONO" since="5"/>
+ <field name="CHANNEL_IN_PRESSURE" since="5"/>
+ <field name="CHANNEL_IN_RIGHT" since="5"/>
+ <field name="CHANNEL_IN_RIGHT_PROCESSED" since="5"/>
+ <field name="CHANNEL_IN_STEREO" since="5"/>
+ <field name="CHANNEL_IN_VOICE_DNLINK" since="5"/>
+ <field name="CHANNEL_IN_VOICE_UPLINK" since="5"/>
+ <field name="CHANNEL_IN_X_AXIS" since="5"/>
+ <field name="CHANNEL_IN_Y_AXIS" since="5"/>
+ <field name="CHANNEL_IN_Z_AXIS" since="5"/>
+ <field name="CHANNEL_OUT_5POINT1" since="5"/>
+ <field name="CHANNEL_OUT_7POINT1" since="5" deprecated="23"/>
+ <field name="CHANNEL_OUT_7POINT1_SURROUND" since="23"/>
+ <field name="CHANNEL_OUT_BACK_CENTER" since="5"/>
+ <field name="CHANNEL_OUT_BACK_LEFT" since="5"/>
+ <field name="CHANNEL_OUT_BACK_RIGHT" since="5"/>
+ <field name="CHANNEL_OUT_DEFAULT" since="5"/>
+ <field name="CHANNEL_OUT_FRONT_CENTER" since="5"/>
+ <field name="CHANNEL_OUT_FRONT_LEFT" since="5"/>
+ <field name="CHANNEL_OUT_FRONT_LEFT_OF_CENTER" since="5"/>
+ <field name="CHANNEL_OUT_FRONT_RIGHT" since="5"/>
+ <field name="CHANNEL_OUT_FRONT_RIGHT_OF_CENTER" since="5"/>
+ <field name="CHANNEL_OUT_LOW_FREQUENCY" since="5"/>
+ <field name="CHANNEL_OUT_MONO" since="5"/>
+ <field name="CHANNEL_OUT_QUAD" since="5"/>
+ <field name="CHANNEL_OUT_SIDE_LEFT" since="21"/>
+ <field name="CHANNEL_OUT_SIDE_RIGHT" since="21"/>
+ <field name="CHANNEL_OUT_STEREO" since="5"/>
+ <field name="CHANNEL_OUT_SURROUND" since="5"/>
+ <field name="CREATOR" since="24"/>
+ <field name="ENCODING_AC3" since="21"/>
+ <field name="ENCODING_DEFAULT"/>
+ <field name="ENCODING_DOLBY_TRUEHD" since="25"/>
+ <field name="ENCODING_DTS" since="23"/>
+ <field name="ENCODING_DTS_HD" since="23"/>
+ <field name="ENCODING_E_AC3" since="21"/>
+ <field name="ENCODING_IEC61937" since="24"/>
+ <field name="ENCODING_INVALID"/>
+ <field name="ENCODING_PCM_16BIT"/>
+ <field name="ENCODING_PCM_8BIT"/>
+ <field name="ENCODING_PCM_FLOAT" since="21"/>
+ <field name="SAMPLE_RATE_UNSPECIFIED" since="24"/>
+ </class>
+ <class name="android/media/AudioFormat$Builder" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/media/AudioFormat;)V"/>
+ <method name="build()Landroid/media/AudioFormat;"/>
+ <method name="setChannelIndexMask(I)Landroid/media/AudioFormat$Builder;" since="23"/>
+ <method name="setChannelMask(I)Landroid/media/AudioFormat$Builder;"/>
+ <method name="setEncoding(I)Landroid/media/AudioFormat$Builder;"/>
+ <method name="setSampleRate(I)Landroid/media/AudioFormat$Builder;"/>
+ </class>
+ <class name="android/media/AudioManager" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="abandonAudioFocus(Landroid/media/AudioManager$OnAudioFocusChangeListener;)I" since="8" deprecated="26"/>
+ <method name="abandonAudioFocusRequest(Landroid/media/AudioFocusRequest;)I" since="26"/>
+ <method name="adjustStreamVolume(III)V"/>
+ <method name="adjustSuggestedStreamVolume(III)V"/>
+ <method name="adjustVolume(II)V"/>
+ <method name="dispatchMediaKeyEvent(Landroid/view/KeyEvent;)V" since="19"/>
+ <method name="generateAudioSessionId()I" since="21"/>
+ <method name="getActivePlaybackConfigurations()Ljava/util/List;" since="26"/>
+ <method name="getActiveRecordingConfigurations()Ljava/util/List;" since="24"/>
+ <method name="getDevices(I)[Landroid/media/AudioDeviceInfo;" since="23"/>
+ <method name="getMode()I"/>
+ <method name="getParameters(Ljava/lang/String;)Ljava/lang/String;" since="5"/>
+ <method name="getProperty(Ljava/lang/String;)Ljava/lang/String;" since="17"/>
+ <method name="getRingerMode()I"/>
+ <method name="getRouting(I)I" deprecated="16"/>
+ <method name="getStreamMaxVolume(I)I"/>
+ <method name="getStreamVolume(I)I"/>
+ <method name="getVibrateSetting(I)I" deprecated="16"/>
+ <method name="isBluetoothA2dpOn()Z" since="3" deprecated="26"/>
+ <method name="isBluetoothScoAvailableOffCall()Z" since="8"/>
+ <method name="isBluetoothScoOn()Z"/>
+ <method name="isMicrophoneMute()Z"/>
+ <method name="isMusicActive()Z"/>
+ <method name="isSpeakerphoneOn()Z"/>
+ <method name="isStreamMute(I)Z" since="23"/>
+ <method name="isVolumeFixed()Z" since="21"/>
+ <method name="isWiredHeadsetOn()Z" since="5" deprecated="16"/>
+ <method name="loadSoundEffects()V"/>
+ <method name="playSoundEffect(I)V"/>
+ <method name="playSoundEffect(IF)V" since="3"/>
+ <method name="registerAudioDeviceCallback(Landroid/media/AudioDeviceCallback;Landroid/os/Handler;)V" since="23"/>
+ <method name="registerAudioPlaybackCallback(Landroid/media/AudioManager$AudioPlaybackCallback;Landroid/os/Handler;)V" since="26"/>
+ <method name="registerAudioRecordingCallback(Landroid/media/AudioManager$AudioRecordingCallback;Landroid/os/Handler;)V" since="24"/>
+ <method name="registerMediaButtonEventReceiver(Landroid/app/PendingIntent;)V" since="18" deprecated="21"/>
+ <method name="registerMediaButtonEventReceiver(Landroid/content/ComponentName;)V" since="8" deprecated="21"/>
+ <method name="registerRemoteControlClient(Landroid/media/RemoteControlClient;)V" since="14" deprecated="21"/>
+ <method name="registerRemoteController(Landroid/media/RemoteController;)Z" since="19" deprecated="21"/>
+ <method name="requestAudioFocus(Landroid/media/AudioFocusRequest;)I" since="26"/>
+ <method name="requestAudioFocus(Landroid/media/AudioManager$OnAudioFocusChangeListener;II)I" since="8" deprecated="26"/>
+ <method name="setBluetoothA2dpOn(Z)V" since="3" deprecated="16"/>
+ <method name="setBluetoothScoOn(Z)V"/>
+ <method name="setMicrophoneMute(Z)V"/>
+ <method name="setMode(I)V"/>
+ <method name="setParameters(Ljava/lang/String;)V" since="5"/>
+ <method name="setRingerMode(I)V"/>
+ <method name="setRouting(III)V" deprecated="16"/>
+ <method name="setSpeakerphoneOn(Z)V"/>
+ <method name="setStreamMute(IZ)V" deprecated="23"/>
+ <method name="setStreamSolo(IZ)V" deprecated="23"/>
+ <method name="setStreamVolume(III)V"/>
+ <method name="setVibrateSetting(II)V" deprecated="16"/>
+ <method name="setWiredHeadsetOn(Z)V" since="5" deprecated="16"/>
+ <method name="shouldVibrate(I)Z" deprecated="16"/>
+ <method name="startBluetoothSco()V" since="8"/>
+ <method name="stopBluetoothSco()V" since="8"/>
+ <method name="unloadSoundEffects()V"/>
+ <method name="unregisterAudioDeviceCallback(Landroid/media/AudioDeviceCallback;)V" since="23"/>
+ <method name="unregisterAudioPlaybackCallback(Landroid/media/AudioManager$AudioPlaybackCallback;)V" since="26"/>
+ <method name="unregisterAudioRecordingCallback(Landroid/media/AudioManager$AudioRecordingCallback;)V" since="24"/>
+ <method name="unregisterMediaButtonEventReceiver(Landroid/app/PendingIntent;)V" since="18" deprecated="21"/>
+ <method name="unregisterMediaButtonEventReceiver(Landroid/content/ComponentName;)V" since="8" deprecated="21"/>
+ <method name="unregisterRemoteControlClient(Landroid/media/RemoteControlClient;)V" since="14" deprecated="21"/>
+ <method name="unregisterRemoteController(Landroid/media/RemoteController;)V" since="19" deprecated="21"/>
+ <field name="ACTION_AUDIO_BECOMING_NOISY" since="3"/>
+ <field name="ACTION_HDMI_AUDIO_PLUG" since="21"/>
+ <field name="ACTION_HEADSET_PLUG" since="21"/>
+ <field name="ACTION_SCO_AUDIO_STATE_CHANGED" since="8" deprecated="16"/>
+ <field name="ACTION_SCO_AUDIO_STATE_UPDATED" since="14"/>
+ <field name="ADJUST_LOWER"/>
+ <field name="ADJUST_MUTE" since="23"/>
+ <field name="ADJUST_RAISE"/>
+ <field name="ADJUST_SAME"/>
+ <field name="ADJUST_TOGGLE_MUTE" since="23"/>
+ <field name="ADJUST_UNMUTE" since="23"/>
+ <field name="AUDIOFOCUS_GAIN" since="8"/>
+ <field name="AUDIOFOCUS_GAIN_TRANSIENT" since="8"/>
+ <field name="AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE" since="19"/>
+ <field name="AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK" since="8"/>
+ <field name="AUDIOFOCUS_LOSS" since="8"/>
+ <field name="AUDIOFOCUS_LOSS_TRANSIENT" since="8"/>
+ <field name="AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK" since="8"/>
+ <field name="AUDIOFOCUS_NONE" since="26"/>
+ <field name="AUDIOFOCUS_REQUEST_DELAYED" since="26"/>
+ <field name="AUDIOFOCUS_REQUEST_FAILED" since="8"/>
+ <field name="AUDIOFOCUS_REQUEST_GRANTED" since="8"/>
+ <field name="AUDIO_SESSION_ID_GENERATE" since="21"/>
+ <field name="ERROR" since="21"/>
+ <field name="ERROR_DEAD_OBJECT" since="21"/>
+ <field name="EXTRA_AUDIO_PLUG_STATE" since="21"/>
+ <field name="EXTRA_ENCODINGS" since="21"/>
+ <field name="EXTRA_MAX_CHANNEL_COUNT" since="21"/>
+ <field name="EXTRA_RINGER_MODE"/>
+ <field name="EXTRA_SCO_AUDIO_PREVIOUS_STATE" since="14"/>
+ <field name="EXTRA_SCO_AUDIO_STATE" since="8"/>
+ <field name="EXTRA_VIBRATE_SETTING" deprecated="16"/>
+ <field name="EXTRA_VIBRATE_TYPE" deprecated="16"/>
+ <field name="FLAG_ALLOW_RINGER_MODES"/>
+ <field name="FLAG_PLAY_SOUND"/>
+ <field name="FLAG_REMOVE_SOUND_AND_VIBRATE"/>
+ <field name="FLAG_SHOW_UI"/>
+ <field name="FLAG_VIBRATE"/>
+ <field name="FX_FOCUS_NAVIGATION_DOWN"/>
+ <field name="FX_FOCUS_NAVIGATION_LEFT"/>
+ <field name="FX_FOCUS_NAVIGATION_RIGHT"/>
+ <field name="FX_FOCUS_NAVIGATION_UP"/>
+ <field name="FX_KEYPRESS_DELETE" since="3"/>
+ <field name="FX_KEYPRESS_INVALID" since="19"/>
+ <field name="FX_KEYPRESS_RETURN" since="3"/>
+ <field name="FX_KEYPRESS_SPACEBAR" since="3"/>
+ <field name="FX_KEYPRESS_STANDARD" since="3"/>
+ <field name="FX_KEY_CLICK"/>
+ <field name="GET_DEVICES_ALL" since="23"/>
+ <field name="GET_DEVICES_INPUTS" since="23"/>
+ <field name="GET_DEVICES_OUTPUTS" since="23"/>
+ <field name="MODE_CURRENT"/>
+ <field name="MODE_INVALID"/>
+ <field name="MODE_IN_CALL"/>
+ <field name="MODE_IN_COMMUNICATION" since="11"/>
+ <field name="MODE_NORMAL"/>
+ <field name="MODE_RINGTONE"/>
+ <field name="NUM_STREAMS" deprecated="16"/>
+ <field name="PROPERTY_OUTPUT_FRAMES_PER_BUFFER" since="17"/>
+ <field name="PROPERTY_OUTPUT_SAMPLE_RATE" since="17"/>
+ <field name="PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED" since="24"/>
+ <field name="PROPERTY_SUPPORT_MIC_NEAR_ULTRASOUND" since="23"/>
+ <field name="PROPERTY_SUPPORT_SPEAKER_NEAR_ULTRASOUND" since="23"/>
+ <field name="RINGER_MODE_CHANGED_ACTION"/>
+ <field name="RINGER_MODE_NORMAL"/>
+ <field name="RINGER_MODE_SILENT"/>
+ <field name="RINGER_MODE_VIBRATE"/>
+ <field name="ROUTE_ALL" deprecated="16"/>
+ <field name="ROUTE_BLUETOOTH" deprecated="16"/>
+ <field name="ROUTE_BLUETOOTH_A2DP" since="3" deprecated="16"/>
+ <field name="ROUTE_BLUETOOTH_SCO" since="3" deprecated="16"/>
+ <field name="ROUTE_EARPIECE" deprecated="16"/>
+ <field name="ROUTE_HEADSET" deprecated="16"/>
+ <field name="ROUTE_SPEAKER" deprecated="16"/>
+ <field name="SCO_AUDIO_STATE_CONNECTED" since="8"/>
+ <field name="SCO_AUDIO_STATE_CONNECTING" since="14"/>
+ <field name="SCO_AUDIO_STATE_DISCONNECTED" since="8"/>
+ <field name="SCO_AUDIO_STATE_ERROR" since="8"/>
+ <field name="STREAM_ACCESSIBILITY" since="26"/>
+ <field name="STREAM_ALARM"/>
+ <field name="STREAM_DTMF" since="5"/>
+ <field name="STREAM_MUSIC"/>
+ <field name="STREAM_NOTIFICATION" since="3"/>
+ <field name="STREAM_RING"/>
+ <field name="STREAM_SYSTEM"/>
+ <field name="STREAM_VOICE_CALL"/>
+ <field name="USE_DEFAULT_STREAM_TYPE"/>
+ <field name="VIBRATE_SETTING_CHANGED_ACTION" deprecated="16"/>
+ <field name="VIBRATE_SETTING_OFF" deprecated="16"/>
+ <field name="VIBRATE_SETTING_ON" deprecated="16"/>
+ <field name="VIBRATE_SETTING_ONLY_SILENT" deprecated="16"/>
+ <field name="VIBRATE_TYPE_NOTIFICATION" deprecated="16"/>
+ <field name="VIBRATE_TYPE_RINGER" deprecated="16"/>
+ </class>
+ <class name="android/media/AudioManager$AudioPlaybackCallback" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onPlaybackConfigChanged(Ljava/util/List;)V"/>
+ </class>
+ <class name="android/media/AudioManager$AudioRecordingCallback" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onRecordingConfigChanged(Ljava/util/List;)V"/>
+ </class>
+ <class name="android/media/AudioManager$OnAudioFocusChangeListener" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="onAudioFocusChange(I)V"/>
+ </class>
+ <class name="android/media/AudioPlaybackConfiguration" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAudioAttributes()Landroid/media/AudioAttributes;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/media/AudioRecord" since="3">
+ <extends name="java/lang/Object"/>
+ <implements name="android/media/AudioRouting" since="24"/>
+ <method name="&lt;init>(IIIII)V"/>
+ <method name="addOnRoutingChangedListener(Landroid/media/AudioRecord$OnRoutingChangedListener;Landroid/os/Handler;)V" since="23" deprecated="24"/>
+ <method name="getAudioFormat()I"/>
+ <method name="getAudioSessionId()I" since="16"/>
+ <method name="getAudioSource()I"/>
+ <method name="getBufferSizeInFrames()I" since="23"/>
+ <method name="getChannelConfiguration()I"/>
+ <method name="getChannelCount()I"/>
+ <method name="getFormat()Landroid/media/AudioFormat;" since="23"/>
+ <method name="getMinBufferSize(III)I"/>
+ <method name="getNotificationMarkerPosition()I"/>
+ <method name="getPositionNotificationPeriod()I"/>
+ <method name="getPreferredDevice()Landroid/media/AudioDeviceInfo;" since="23"/>
+ <method name="getRecordingState()I"/>
+ <method name="getRoutedDevice()Landroid/media/AudioDeviceInfo;" since="23"/>
+ <method name="getSampleRate()I"/>
+ <method name="getState()I"/>
+ <method name="getTimestamp(Landroid/media/AudioTimestamp;I)I" since="24"/>
+ <method name="read(Ljava/nio/ByteBuffer;I)I"/>
+ <method name="read(Ljava/nio/ByteBuffer;II)I" since="23"/>
+ <method name="read([BII)I"/>
+ <method name="read([BIII)I" since="23"/>
+ <method name="read([FIII)I" since="23"/>
+ <method name="read([SII)I"/>
+ <method name="read([SIII)I" since="23"/>
+ <method name="release()V"/>
+ <method name="removeOnRoutingChangedListener(Landroid/media/AudioRecord$OnRoutingChangedListener;)V" since="23" deprecated="24"/>
+ <method name="setNotificationMarkerPosition(I)I"/>
+ <method name="setPositionNotificationPeriod(I)I"/>
+ <method name="setPreferredDevice(Landroid/media/AudioDeviceInfo;)Z" since="23"/>
+ <method name="setRecordPositionUpdateListener(Landroid/media/AudioRecord$OnRecordPositionUpdateListener;)V"/>
+ <method name="setRecordPositionUpdateListener(Landroid/media/AudioRecord$OnRecordPositionUpdateListener;Landroid/os/Handler;)V"/>
+ <method name="startRecording()V"/>
+ <method name="startRecording(Landroid/media/MediaSyncEvent;)V" since="16"/>
+ <method name="stop()V"/>
+ <field name="ERROR"/>
+ <field name="ERROR_BAD_VALUE"/>
+ <field name="ERROR_DEAD_OBJECT" since="24"/>
+ <field name="ERROR_INVALID_OPERATION"/>
+ <field name="READ_BLOCKING" since="23"/>
+ <field name="READ_NON_BLOCKING" since="23"/>
+ <field name="RECORDSTATE_RECORDING"/>
+ <field name="RECORDSTATE_STOPPED"/>
+ <field name="STATE_INITIALIZED"/>
+ <field name="STATE_UNINITIALIZED"/>
+ <field name="SUCCESS"/>
+ </class>
+ <class name="android/media/AudioRecord$Builder" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="build()Landroid/media/AudioRecord;"/>
+ <method name="setAudioFormat(Landroid/media/AudioFormat;)Landroid/media/AudioRecord$Builder;"/>
+ <method name="setAudioSource(I)Landroid/media/AudioRecord$Builder;"/>
+ <method name="setBufferSizeInBytes(I)Landroid/media/AudioRecord$Builder;"/>
+ </class>
+ <class name="android/media/AudioRecord$OnRecordPositionUpdateListener" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="onMarkerReached(Landroid/media/AudioRecord;)V"/>
+ <method name="onPeriodicNotification(Landroid/media/AudioRecord;)V"/>
+ </class>
+ <class name="android/media/AudioRecord$OnRoutingChangedListener" since="23" deprecated="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/media/AudioRouting$OnRoutingChangedListener" since="24"/>
+ <method name="onRoutingChanged(Landroid/media/AudioRecord;)V"/>
+ </class>
+ <class name="android/media/AudioRecordingConfiguration" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAudioDevice()Landroid/media/AudioDeviceInfo;"/>
+ <method name="getClientAudioSessionId()I"/>
+ <method name="getClientAudioSource()I"/>
+ <method name="getClientFormat()Landroid/media/AudioFormat;"/>
+ <method name="getFormat()Landroid/media/AudioFormat;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/media/AudioRouting" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="addOnRoutingChangedListener(Landroid/media/AudioRouting$OnRoutingChangedListener;Landroid/os/Handler;)V"/>
+ <method name="getPreferredDevice()Landroid/media/AudioDeviceInfo;"/>
+ <method name="getRoutedDevice()Landroid/media/AudioDeviceInfo;"/>
+ <method name="removeOnRoutingChangedListener(Landroid/media/AudioRouting$OnRoutingChangedListener;)V"/>
+ <method name="setPreferredDevice(Landroid/media/AudioDeviceInfo;)Z"/>
+ </class>
+ <class name="android/media/AudioRouting$OnRoutingChangedListener" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="onRoutingChanged(Landroid/media/AudioRouting;)V"/>
+ </class>
+ <class name="android/media/AudioTimestamp" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="TIMEBASE_BOOTTIME" since="24"/>
+ <field name="TIMEBASE_MONOTONIC" since="24"/>
+ <field name="framePosition"/>
+ <field name="nanoTime"/>
+ </class>
+ <class name="android/media/AudioTrack" since="3">
+ <extends name="java/lang/Object"/>
+ <implements name="android/media/AudioRouting" since="24"/>
+ <implements name="android/media/VolumeAutomation" since="26"/>
+ <method name="&lt;init>(IIIIII)V" deprecated="26"/>
+ <method name="&lt;init>(IIIIIII)V" since="9" deprecated="26"/>
+ <method name="&lt;init>(Landroid/media/AudioAttributes;Landroid/media/AudioFormat;III)V" since="21"/>
+ <method name="addOnRoutingChangedListener(Landroid/media/AudioTrack$OnRoutingChangedListener;Landroid/os/Handler;)V" since="23" deprecated="24"/>
+ <method name="attachAuxEffect(I)I" since="9"/>
+ <method name="flush()V"/>
+ <method name="getAudioFormat()I"/>
+ <method name="getAudioSessionId()I" since="9"/>
+ <method name="getBufferCapacityInFrames()I" since="24"/>
+ <method name="getBufferSizeInFrames()I" since="23"/>
+ <method name="getChannelConfiguration()I"/>
+ <method name="getChannelCount()I"/>
+ <method name="getFormat()Landroid/media/AudioFormat;" since="23"/>
+ <method name="getMaxVolume()F"/>
+ <method name="getMinBufferSize(III)I"/>
+ <method name="getMinVolume()F"/>
+ <method name="getNativeFrameCount()I" deprecated="19"/>
+ <method name="getNativeOutputSampleRate(I)I"/>
+ <method name="getNotificationMarkerPosition()I"/>
+ <method name="getPerformanceMode()I" since="26"/>
+ <method name="getPlayState()I"/>
+ <method name="getPlaybackHeadPosition()I"/>
+ <method name="getPlaybackParams()Landroid/media/PlaybackParams;" since="23"/>
+ <method name="getPlaybackRate()I"/>
+ <method name="getPositionNotificationPeriod()I"/>
+ <method name="getPreferredDevice()Landroid/media/AudioDeviceInfo;" since="23"/>
+ <method name="getRoutedDevice()Landroid/media/AudioDeviceInfo;" since="23"/>
+ <method name="getSampleRate()I"/>
+ <method name="getState()I"/>
+ <method name="getStreamType()I"/>
+ <method name="getTimestamp(Landroid/media/AudioTimestamp;)Z" since="19"/>
+ <method name="getUnderrunCount()I" since="24"/>
+ <method name="pause()V"/>
+ <method name="play()V"/>
+ <method name="release()V"/>
+ <method name="reloadStaticData()I"/>
+ <method name="removeOnRoutingChangedListener(Landroid/media/AudioTrack$OnRoutingChangedListener;)V" since="23" deprecated="24"/>
+ <method name="setAuxEffectSendLevel(F)I" since="9"/>
+ <method name="setBufferSizeInFrames(I)I" since="24"/>
+ <method name="setLoopPoints(III)I"/>
+ <method name="setNotificationMarkerPosition(I)I"/>
+ <method name="setPlaybackHeadPosition(I)I"/>
+ <method name="setPlaybackParams(Landroid/media/PlaybackParams;)V" since="23"/>
+ <method name="setPlaybackPositionUpdateListener(Landroid/media/AudioTrack$OnPlaybackPositionUpdateListener;)V"/>
+ <method name="setPlaybackPositionUpdateListener(Landroid/media/AudioTrack$OnPlaybackPositionUpdateListener;Landroid/os/Handler;)V"/>
+ <method name="setPlaybackRate(I)I"/>
+ <method name="setPositionNotificationPeriod(I)I"/>
+ <method name="setPreferredDevice(Landroid/media/AudioDeviceInfo;)Z" since="23"/>
+ <method name="setState(I)V" deprecated="19"/>
+ <method name="setStereoVolume(FF)I" deprecated="21"/>
+ <method name="setVolume(F)I" since="21"/>
+ <method name="stop()V"/>
+ <method name="write(Ljava/nio/ByteBuffer;II)I" since="21"/>
+ <method name="write(Ljava/nio/ByteBuffer;IIJ)I" since="23"/>
+ <method name="write([BII)I"/>
+ <method name="write([BIII)I" since="23"/>
+ <method name="write([FIII)I" since="21"/>
+ <method name="write([SII)I"/>
+ <method name="write([SIII)I" since="23"/>
+ <field name="ERROR"/>
+ <field name="ERROR_BAD_VALUE"/>
+ <field name="ERROR_DEAD_OBJECT" since="24"/>
+ <field name="ERROR_INVALID_OPERATION"/>
+ <field name="MODE_STATIC"/>
+ <field name="MODE_STREAM"/>
+ <field name="PERFORMANCE_MODE_LOW_LATENCY" since="26"/>
+ <field name="PERFORMANCE_MODE_NONE" since="26"/>
+ <field name="PERFORMANCE_MODE_POWER_SAVING" since="26"/>
+ <field name="PLAYSTATE_PAUSED"/>
+ <field name="PLAYSTATE_PLAYING"/>
+ <field name="PLAYSTATE_STOPPED"/>
+ <field name="STATE_INITIALIZED"/>
+ <field name="STATE_NO_STATIC_DATA"/>
+ <field name="STATE_UNINITIALIZED"/>
+ <field name="SUCCESS"/>
+ <field name="WRITE_BLOCKING" since="21"/>
+ <field name="WRITE_NON_BLOCKING" since="21"/>
+ </class>
+ <class name="android/media/AudioTrack$Builder" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="build()Landroid/media/AudioTrack;"/>
+ <method name="setAudioAttributes(Landroid/media/AudioAttributes;)Landroid/media/AudioTrack$Builder;"/>
+ <method name="setAudioFormat(Landroid/media/AudioFormat;)Landroid/media/AudioTrack$Builder;"/>
+ <method name="setBufferSizeInBytes(I)Landroid/media/AudioTrack$Builder;"/>
+ <method name="setPerformanceMode(I)Landroid/media/AudioTrack$Builder;" since="26"/>
+ <method name="setSessionId(I)Landroid/media/AudioTrack$Builder;"/>
+ <method name="setTransferMode(I)Landroid/media/AudioTrack$Builder;"/>
+ </class>
+ <class name="android/media/AudioTrack$OnPlaybackPositionUpdateListener" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="onMarkerReached(Landroid/media/AudioTrack;)V"/>
+ <method name="onPeriodicNotification(Landroid/media/AudioTrack;)V"/>
+ </class>
+ <class name="android/media/AudioTrack$OnRoutingChangedListener" since="23" deprecated="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/media/AudioRouting$OnRoutingChangedListener" since="24"/>
+ <method name="onRoutingChanged(Landroid/media/AudioTrack;)V"/>
+ </class>
+ <class name="android/media/CamcorderProfile" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="get(I)Landroid/media/CamcorderProfile;"/>
+ <method name="get(II)Landroid/media/CamcorderProfile;" since="9"/>
+ <method name="hasProfile(I)Z" since="11"/>
+ <method name="hasProfile(II)Z" since="11"/>
+ <field name="QUALITY_1080P" since="11"/>
+ <field name="QUALITY_2160P" since="21"/>
+ <field name="QUALITY_480P" since="11"/>
+ <field name="QUALITY_720P" since="11"/>
+ <field name="QUALITY_CIF" since="11"/>
+ <field name="QUALITY_HIGH"/>
+ <field name="QUALITY_HIGH_SPEED_1080P" since="21"/>
+ <field name="QUALITY_HIGH_SPEED_2160P" since="21"/>
+ <field name="QUALITY_HIGH_SPEED_480P" since="21"/>
+ <field name="QUALITY_HIGH_SPEED_720P" since="21"/>
+ <field name="QUALITY_HIGH_SPEED_HIGH" since="21"/>
+ <field name="QUALITY_HIGH_SPEED_LOW" since="21"/>
+ <field name="QUALITY_LOW"/>
+ <field name="QUALITY_QCIF" since="11"/>
+ <field name="QUALITY_QVGA" since="15"/>
+ <field name="QUALITY_TIME_LAPSE_1080P" since="11"/>
+ <field name="QUALITY_TIME_LAPSE_2160P" since="21"/>
+ <field name="QUALITY_TIME_LAPSE_480P" since="11"/>
+ <field name="QUALITY_TIME_LAPSE_720P" since="11"/>
+ <field name="QUALITY_TIME_LAPSE_CIF" since="11"/>
+ <field name="QUALITY_TIME_LAPSE_HIGH" since="11"/>
+ <field name="QUALITY_TIME_LAPSE_LOW" since="11"/>
+ <field name="QUALITY_TIME_LAPSE_QCIF" since="11"/>
+ <field name="QUALITY_TIME_LAPSE_QVGA" since="15"/>
+ <field name="audioBitRate"/>
+ <field name="audioChannels"/>
+ <field name="audioCodec"/>
+ <field name="audioSampleRate"/>
+ <field name="duration"/>
+ <field name="fileFormat"/>
+ <field name="quality"/>
+ <field name="videoBitRate"/>
+ <field name="videoCodec"/>
+ <field name="videoFrameHeight"/>
+ <field name="videoFrameRate"/>
+ <field name="videoFrameWidth"/>
+ </class>
+ <class name="android/media/CameraProfile" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getJpegEncodingQualityParameter(I)I"/>
+ <method name="getJpegEncodingQualityParameter(II)I" since="9"/>
+ <field name="QUALITY_HIGH"/>
+ <field name="QUALITY_LOW"/>
+ <field name="QUALITY_MEDIUM"/>
+ </class>
+ <class name="android/media/DeniedByServerException" since="18">
+ <extends name="android/media/MediaDrmException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/media/DrmInitData" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="get(Ljava/util/UUID;)Landroid/media/DrmInitData$SchemeInitData;"/>
+ </class>
+ <class name="android/media/DrmInitData$SchemeInitData" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="data"/>
+ <field name="mimeType"/>
+ </class>
+ <class name="android/media/ExifInterface" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/io/FileDescriptor;)V" since="24"/>
+ <method name="&lt;init>(Ljava/io/InputStream;)V" since="24"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getAltitude(D)D" since="9"/>
+ <method name="getAttribute(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getAttributeDouble(Ljava/lang/String;D)D" since="8"/>
+ <method name="getAttributeInt(Ljava/lang/String;I)I"/>
+ <method name="getLatLong([F)Z"/>
+ <method name="getThumbnail()[B"/>
+ <method name="getThumbnailBitmap()Landroid/graphics/Bitmap;" since="26"/>
+ <method name="getThumbnailBytes()[B" since="26"/>
+ <method name="getThumbnailRange()[J" since="24"/>
+ <method name="hasThumbnail()Z"/>
+ <method name="isThumbnailCompressed()Z" since="26"/>
+ <method name="saveAttributes()V"/>
+ <method name="setAttribute(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <field name="ORIENTATION_FLIP_HORIZONTAL"/>
+ <field name="ORIENTATION_FLIP_VERTICAL"/>
+ <field name="ORIENTATION_NORMAL"/>
+ <field name="ORIENTATION_ROTATE_180"/>
+ <field name="ORIENTATION_ROTATE_270"/>
+ <field name="ORIENTATION_ROTATE_90"/>
+ <field name="ORIENTATION_TRANSPOSE"/>
+ <field name="ORIENTATION_TRANSVERSE"/>
+ <field name="ORIENTATION_UNDEFINED"/>
+ <field name="TAG_APERTURE" since="11" deprecated="24"/>
+ <field name="TAG_APERTURE_VALUE" since="24"/>
+ <field name="TAG_ARTIST" since="24"/>
+ <field name="TAG_BITS_PER_SAMPLE" since="24"/>
+ <field name="TAG_BRIGHTNESS_VALUE" since="24"/>
+ <field name="TAG_CFA_PATTERN" since="24"/>
+ <field name="TAG_COLOR_SPACE" since="24"/>
+ <field name="TAG_COMPONENTS_CONFIGURATION" since="24"/>
+ <field name="TAG_COMPRESSED_BITS_PER_PIXEL" since="24"/>
+ <field name="TAG_COMPRESSION" since="24"/>
+ <field name="TAG_CONTRAST" since="24"/>
+ <field name="TAG_COPYRIGHT" since="24"/>
+ <field name="TAG_CUSTOM_RENDERED" since="24"/>
+ <field name="TAG_DATETIME"/>
+ <field name="TAG_DATETIME_DIGITIZED" since="23"/>
+ <field name="TAG_DATETIME_ORIGINAL" since="24"/>
+ <field name="TAG_DEFAULT_CROP_SIZE" since="26"/>
+ <field name="TAG_DEVICE_SETTING_DESCRIPTION" since="24"/>
+ <field name="TAG_DIGITAL_ZOOM_RATIO" since="24"/>
+ <field name="TAG_DNG_VERSION" since="26"/>
+ <field name="TAG_EXIF_VERSION" since="24"/>
+ <field name="TAG_EXPOSURE_BIAS_VALUE" since="24"/>
+ <field name="TAG_EXPOSURE_INDEX" since="24"/>
+ <field name="TAG_EXPOSURE_MODE" since="24"/>
+ <field name="TAG_EXPOSURE_PROGRAM" since="24"/>
+ <field name="TAG_EXPOSURE_TIME" since="11"/>
+ <field name="TAG_FILE_SOURCE" since="24"/>
+ <field name="TAG_FLASH"/>
+ <field name="TAG_FLASHPIX_VERSION" since="24"/>
+ <field name="TAG_FLASH_ENERGY" since="24"/>
+ <field name="TAG_FOCAL_LENGTH" since="8"/>
+ <field name="TAG_FOCAL_LENGTH_IN_35MM_FILM" since="24"/>
+ <field name="TAG_FOCAL_PLANE_RESOLUTION_UNIT" since="24"/>
+ <field name="TAG_FOCAL_PLANE_X_RESOLUTION" since="24"/>
+ <field name="TAG_FOCAL_PLANE_Y_RESOLUTION" since="24"/>
+ <field name="TAG_F_NUMBER" since="24"/>
+ <field name="TAG_GAIN_CONTROL" since="24"/>
+ <field name="TAG_GPS_ALTITUDE" since="9"/>
+ <field name="TAG_GPS_ALTITUDE_REF" since="9"/>
+ <field name="TAG_GPS_AREA_INFORMATION" since="24"/>
+ <field name="TAG_GPS_DATESTAMP" since="8"/>
+ <field name="TAG_GPS_DEST_BEARING" since="24"/>
+ <field name="TAG_GPS_DEST_BEARING_REF" since="24"/>
+ <field name="TAG_GPS_DEST_DISTANCE" since="24"/>
+ <field name="TAG_GPS_DEST_DISTANCE_REF" since="24"/>
+ <field name="TAG_GPS_DEST_LATITUDE" since="24"/>
+ <field name="TAG_GPS_DEST_LATITUDE_REF" since="24"/>
+ <field name="TAG_GPS_DEST_LONGITUDE" since="24"/>
+ <field name="TAG_GPS_DEST_LONGITUDE_REF" since="24"/>
+ <field name="TAG_GPS_DIFFERENTIAL" since="24"/>
+ <field name="TAG_GPS_DOP" since="24"/>
+ <field name="TAG_GPS_IMG_DIRECTION" since="24"/>
+ <field name="TAG_GPS_IMG_DIRECTION_REF" since="24"/>
+ <field name="TAG_GPS_LATITUDE"/>
+ <field name="TAG_GPS_LATITUDE_REF"/>
+ <field name="TAG_GPS_LONGITUDE"/>
+ <field name="TAG_GPS_LONGITUDE_REF"/>
+ <field name="TAG_GPS_MAP_DATUM" since="24"/>
+ <field name="TAG_GPS_MEASURE_MODE" since="24"/>
+ <field name="TAG_GPS_PROCESSING_METHOD" since="8"/>
+ <field name="TAG_GPS_SATELLITES" since="24"/>
+ <field name="TAG_GPS_SPEED" since="24"/>
+ <field name="TAG_GPS_SPEED_REF" since="24"/>
+ <field name="TAG_GPS_STATUS" since="24"/>
+ <field name="TAG_GPS_TIMESTAMP" since="8"/>
+ <field name="TAG_GPS_TRACK" since="24"/>
+ <field name="TAG_GPS_TRACK_REF" since="24"/>
+ <field name="TAG_GPS_VERSION_ID" since="24"/>
+ <field name="TAG_IMAGE_DESCRIPTION" since="24"/>
+ <field name="TAG_IMAGE_LENGTH"/>
+ <field name="TAG_IMAGE_UNIQUE_ID" since="24"/>
+ <field name="TAG_IMAGE_WIDTH"/>
+ <field name="TAG_INTEROPERABILITY_INDEX" since="24"/>
+ <field name="TAG_ISO" since="11" deprecated="24"/>
+ <field name="TAG_ISO_SPEED_RATINGS" since="24"/>
+ <field name="TAG_JPEG_INTERCHANGE_FORMAT" since="24"/>
+ <field name="TAG_JPEG_INTERCHANGE_FORMAT_LENGTH" since="24"/>
+ <field name="TAG_LIGHT_SOURCE" since="24"/>
+ <field name="TAG_MAKE"/>
+ <field name="TAG_MAKER_NOTE" since="24"/>
+ <field name="TAG_MAX_APERTURE_VALUE" since="24"/>
+ <field name="TAG_METERING_MODE" since="24"/>
+ <field name="TAG_MODEL"/>
+ <field name="TAG_NEW_SUBFILE_TYPE" since="26"/>
+ <field name="TAG_OECF" since="24"/>
+ <field name="TAG_ORF_ASPECT_FRAME" since="26"/>
+ <field name="TAG_ORF_PREVIEW_IMAGE_LENGTH" since="26"/>
+ <field name="TAG_ORF_PREVIEW_IMAGE_START" since="26"/>
+ <field name="TAG_ORF_THUMBNAIL_IMAGE" since="26"/>
+ <field name="TAG_ORIENTATION"/>
+ <field name="TAG_PHOTOMETRIC_INTERPRETATION" since="24"/>
+ <field name="TAG_PIXEL_X_DIMENSION" since="24"/>
+ <field name="TAG_PIXEL_Y_DIMENSION" since="24"/>
+ <field name="TAG_PLANAR_CONFIGURATION" since="24"/>
+ <field name="TAG_PRIMARY_CHROMATICITIES" since="24"/>
+ <field name="TAG_REFERENCE_BLACK_WHITE" since="24"/>
+ <field name="TAG_RELATED_SOUND_FILE" since="24"/>
+ <field name="TAG_RESOLUTION_UNIT" since="24"/>
+ <field name="TAG_ROWS_PER_STRIP" since="24"/>
+ <field name="TAG_RW2_ISO" since="26"/>
+ <field name="TAG_RW2_JPG_FROM_RAW" since="26"/>
+ <field name="TAG_RW2_SENSOR_BOTTOM_BORDER" since="26"/>
+ <field name="TAG_RW2_SENSOR_LEFT_BORDER" since="26"/>
+ <field name="TAG_RW2_SENSOR_RIGHT_BORDER" since="26"/>
+ <field name="TAG_RW2_SENSOR_TOP_BORDER" since="26"/>
+ <field name="TAG_SAMPLES_PER_PIXEL" since="24"/>
+ <field name="TAG_SATURATION" since="24"/>
+ <field name="TAG_SCENE_CAPTURE_TYPE" since="24"/>
+ <field name="TAG_SCENE_TYPE" since="24"/>
+ <field name="TAG_SENSING_METHOD" since="24"/>
+ <field name="TAG_SHARPNESS" since="24"/>
+ <field name="TAG_SHUTTER_SPEED_VALUE" since="24"/>
+ <field name="TAG_SOFTWARE" since="24"/>
+ <field name="TAG_SPATIAL_FREQUENCY_RESPONSE" since="24"/>
+ <field name="TAG_SPECTRAL_SENSITIVITY" since="24"/>
+ <field name="TAG_STRIP_BYTE_COUNTS" since="24"/>
+ <field name="TAG_STRIP_OFFSETS" since="24"/>
+ <field name="TAG_SUBFILE_TYPE" since="26"/>
+ <field name="TAG_SUBJECT_AREA" since="24"/>
+ <field name="TAG_SUBJECT_DISTANCE" since="24"/>
+ <field name="TAG_SUBJECT_DISTANCE_RANGE" since="24"/>
+ <field name="TAG_SUBJECT_LOCATION" since="24"/>
+ <field name="TAG_SUBSEC_TIME" since="23"/>
+ <field name="TAG_SUBSEC_TIME_DIG" since="23" deprecated="24"/>
+ <field name="TAG_SUBSEC_TIME_DIGITIZED" since="24"/>
+ <field name="TAG_SUBSEC_TIME_ORIG" since="23" deprecated="24"/>
+ <field name="TAG_SUBSEC_TIME_ORIGINAL" since="24"/>
+ <field name="TAG_THUMBNAIL_IMAGE_LENGTH" since="24"/>
+ <field name="TAG_THUMBNAIL_IMAGE_WIDTH" since="24"/>
+ <field name="TAG_TRANSFER_FUNCTION" since="24"/>
+ <field name="TAG_USER_COMMENT" since="24"/>
+ <field name="TAG_WHITE_BALANCE"/>
+ <field name="TAG_WHITE_POINT" since="24"/>
+ <field name="TAG_X_RESOLUTION" since="24"/>
+ <field name="TAG_Y_CB_CR_COEFFICIENTS" since="24"/>
+ <field name="TAG_Y_CB_CR_POSITIONING" since="24"/>
+ <field name="TAG_Y_CB_CR_SUB_SAMPLING" since="24"/>
+ <field name="TAG_Y_RESOLUTION" since="24"/>
+ <field name="WHITEBALANCE_AUTO"/>
+ <field name="WHITEBALANCE_MANUAL"/>
+ </class>
+ <class name="android/media/FaceDetector" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(III)V"/>
+ <method name="findFaces(Landroid/graphics/Bitmap;[Landroid/media/FaceDetector$Face;)I"/>
+ </class>
+ <class name="android/media/FaceDetector$Face" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/media/FaceDetector;)V"/>
+ <method name="confidence()F"/>
+ <method name="eyesDistance()F"/>
+ <method name="getMidPoint(Landroid/graphics/PointF;)V"/>
+ <method name="pose(I)F"/>
+ <field name="CONFIDENCE_THRESHOLD"/>
+ <field name="EULER_X"/>
+ <field name="EULER_Y"/>
+ <field name="EULER_Z"/>
+ </class>
+ <class name="android/media/Image" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCropRect()Landroid/graphics/Rect;" since="21"/>
+ <method name="getFormat()I"/>
+ <method name="getHeight()I"/>
+ <method name="getPlanes()[Landroid/media/Image$Plane;"/>
+ <method name="getTimestamp()J"/>
+ <method name="getWidth()I"/>
+ <method name="setCropRect(Landroid/graphics/Rect;)V" since="21"/>
+ <method name="setTimestamp(J)V" since="23"/>
+ </class>
+ <class name="android/media/Image$Plane" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getBuffer()Ljava/nio/ByteBuffer;"/>
+ <method name="getPixelStride()I"/>
+ <method name="getRowStride()I"/>
+ </class>
+ <class name="android/media/ImageReader" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable"/>
+ <method name="&lt;init>()V"/>
+ <method name="acquireLatestImage()Landroid/media/Image;"/>
+ <method name="acquireNextImage()Landroid/media/Image;"/>
+ <method name="getHeight()I"/>
+ <method name="getImageFormat()I"/>
+ <method name="getMaxImages()I"/>
+ <method name="getSurface()Landroid/view/Surface;"/>
+ <method name="getWidth()I"/>
+ <method name="newInstance(IIII)Landroid/media/ImageReader;"/>
+ <method name="setOnImageAvailableListener(Landroid/media/ImageReader$OnImageAvailableListener;Landroid/os/Handler;)V"/>
+ </class>
+ <class name="android/media/ImageReader$OnImageAvailableListener" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="onImageAvailable(Landroid/media/ImageReader;)V"/>
+ </class>
+ <class name="android/media/ImageWriter" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable"/>
+ <method name="&lt;init>()V"/>
+ <method name="dequeueInputImage()Landroid/media/Image;"/>
+ <method name="getFormat()I"/>
+ <method name="getMaxImages()I"/>
+ <method name="newInstance(Landroid/view/Surface;I)Landroid/media/ImageWriter;"/>
+ <method name="queueInputImage(Landroid/media/Image;)V"/>
+ <method name="setOnImageReleasedListener(Landroid/media/ImageWriter$OnImageReleasedListener;Landroid/os/Handler;)V"/>
+ </class>
+ <class name="android/media/ImageWriter$OnImageReleasedListener" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="onImageReleased(Landroid/media/ImageWriter;)V"/>
+ </class>
+ <class name="android/media/JetPlayer" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="clearQueue()Z"/>
+ <method name="closeJetFile()Z"/>
+ <method name="getJetPlayer()Landroid/media/JetPlayer;"/>
+ <method name="getMaxTracks()I"/>
+ <method name="loadJetFile(Landroid/content/res/AssetFileDescriptor;)Z"/>
+ <method name="loadJetFile(Ljava/lang/String;)Z"/>
+ <method name="pause()Z"/>
+ <method name="play()Z"/>
+ <method name="queueJetSegment(IIIIIB)Z"/>
+ <method name="queueJetSegmentMuteArray(IIII[ZB)Z"/>
+ <method name="release()V"/>
+ <method name="setEventListener(Landroid/media/JetPlayer$OnJetEventListener;)V"/>
+ <method name="setEventListener(Landroid/media/JetPlayer$OnJetEventListener;Landroid/os/Handler;)V"/>
+ <method name="setMuteArray([ZZ)Z"/>
+ <method name="setMuteFlag(IZZ)Z"/>
+ <method name="setMuteFlags(IZ)Z"/>
+ <method name="triggerClip(I)Z"/>
+ </class>
+ <class name="android/media/JetPlayer$OnJetEventListener" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="onJetEvent(Landroid/media/JetPlayer;SBBBB)V"/>
+ <method name="onJetNumQueuedSegmentUpdate(Landroid/media/JetPlayer;I)V"/>
+ <method name="onJetPauseUpdate(Landroid/media/JetPlayer;I)V"/>
+ <method name="onJetUserIdUpdate(Landroid/media/JetPlayer;II)V"/>
+ </class>
+ <class name="android/media/MediaActionSound" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="load(I)V"/>
+ <method name="play(I)V"/>
+ <method name="release()V"/>
+ <field name="FOCUS_COMPLETE"/>
+ <field name="SHUTTER_CLICK"/>
+ <field name="START_VIDEO_RECORDING"/>
+ <field name="STOP_VIDEO_RECORDING"/>
+ </class>
+ <class name="android/media/MediaCas" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="enumeratePlugins()[Landroid/media/MediaCas$PluginDescriptor;"/>
+ <method name="isSystemIdSupported(I)Z"/>
+ <method name="openSession()Landroid/media/MediaCas$Session;"/>
+ <method name="processEmm([B)V"/>
+ <method name="processEmm([BII)V"/>
+ <method name="provision(Ljava/lang/String;)V"/>
+ <method name="refreshEntitlements(I[B)V"/>
+ <method name="sendEvent(II[B)V"/>
+ <method name="setEventListener(Landroid/media/MediaCas$EventListener;Landroid/os/Handler;)V"/>
+ <method name="setPrivateData([B)V"/>
+ </class>
+ <class name="android/media/MediaCas$EventListener" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="onEvent(Landroid/media/MediaCas;II[B)V"/>
+ </class>
+ <class name="android/media/MediaCas$PluginDescriptor" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getSystemId()I"/>
+ </class>
+ <class name="android/media/MediaCas$Session" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable"/>
+ <method name="&lt;init>(Landroid/media/MediaCas;)V"/>
+ <method name="processEcm([B)V"/>
+ <method name="processEcm([BII)V"/>
+ <method name="setPrivateData([B)V"/>
+ </class>
+ <class name="android/media/MediaCasException" since="26">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/media/MediaCasException$DeniedByServerException" since="26">
+ <extends name="android/media/MediaCasException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/media/MediaCasException$NotProvisionedException" since="26">
+ <extends name="android/media/MediaCasException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/media/MediaCasException$ResourceBusyException" since="26">
+ <extends name="android/media/MediaCasException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/media/MediaCasException$UnsupportedCasException" since="26">
+ <extends name="android/media/MediaCasException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/media/MediaCasStateException" since="26">
+ <extends name="java/lang/IllegalStateException"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDiagnosticInfo()Ljava/lang/String;"/>
+ </class>
+ <class name="android/media/MediaCodec" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="configure(Landroid/media/MediaFormat;Landroid/view/Surface;ILandroid/media/MediaDescrambler;)V" since="26"/>
+ <method name="configure(Landroid/media/MediaFormat;Landroid/view/Surface;Landroid/media/MediaCrypto;I)V"/>
+ <method name="createByCodecName(Ljava/lang/String;)Landroid/media/MediaCodec;"/>
+ <method name="createDecoderByType(Ljava/lang/String;)Landroid/media/MediaCodec;"/>
+ <method name="createEncoderByType(Ljava/lang/String;)Landroid/media/MediaCodec;"/>
+ <method name="createInputSurface()Landroid/view/Surface;" since="18"/>
+ <method name="createPersistentInputSurface()Landroid/view/Surface;" since="23"/>
+ <method name="dequeueInputBuffer(J)I"/>
+ <method name="dequeueOutputBuffer(Landroid/media/MediaCodec$BufferInfo;J)I"/>
+ <method name="flush()V"/>
+ <method name="getCodecInfo()Landroid/media/MediaCodecInfo;" since="18"/>
+ <method name="getInputBuffer(I)Ljava/nio/ByteBuffer;" since="21"/>
+ <method name="getInputBuffers()[Ljava/nio/ByteBuffer;" deprecated="21"/>
+ <method name="getInputFormat()Landroid/media/MediaFormat;" since="21"/>
+ <method name="getInputImage(I)Landroid/media/Image;" since="21"/>
+ <method name="getMetrics()Landroid/os/PersistableBundle;" since="26"/>
+ <method name="getName()Ljava/lang/String;" since="18"/>
+ <method name="getOutputBuffer(I)Ljava/nio/ByteBuffer;" since="21"/>
+ <method name="getOutputBuffers()[Ljava/nio/ByteBuffer;" deprecated="21"/>
+ <method name="getOutputFormat()Landroid/media/MediaFormat;"/>
+ <method name="getOutputFormat(I)Landroid/media/MediaFormat;" since="21"/>
+ <method name="getOutputImage(I)Landroid/media/Image;" since="21"/>
+ <method name="queueInputBuffer(IIIJI)V"/>
+ <method name="queueSecureInputBuffer(IILandroid/media/MediaCodec$CryptoInfo;JI)V"/>
+ <method name="release()V"/>
+ <method name="releaseOutputBuffer(IJ)V" since="21"/>
+ <method name="releaseOutputBuffer(IZ)V"/>
+ <method name="reset()V" since="21"/>
+ <method name="setCallback(Landroid/media/MediaCodec$Callback;)V" since="21"/>
+ <method name="setCallback(Landroid/media/MediaCodec$Callback;Landroid/os/Handler;)V" since="23"/>
+ <method name="setInputSurface(Landroid/view/Surface;)V" since="23"/>
+ <method name="setOnFrameRenderedListener(Landroid/media/MediaCodec$OnFrameRenderedListener;Landroid/os/Handler;)V" since="23"/>
+ <method name="setOutputSurface(Landroid/view/Surface;)V" since="23"/>
+ <method name="setParameters(Landroid/os/Bundle;)V" since="19"/>
+ <method name="setVideoScalingMode(I)V"/>
+ <method name="signalEndOfInputStream()V" since="18"/>
+ <method name="start()V"/>
+ <method name="stop()V"/>
+ <field name="BUFFER_FLAG_CODEC_CONFIG"/>
+ <field name="BUFFER_FLAG_END_OF_STREAM"/>
+ <field name="BUFFER_FLAG_KEY_FRAME" since="21"/>
+ <field name="BUFFER_FLAG_PARTIAL_FRAME" since="26"/>
+ <field name="BUFFER_FLAG_SYNC_FRAME" deprecated="21"/>
+ <field name="CONFIGURE_FLAG_ENCODE"/>
+ <field name="CRYPTO_MODE_AES_CBC" since="24"/>
+ <field name="CRYPTO_MODE_AES_CTR"/>
+ <field name="CRYPTO_MODE_UNENCRYPTED"/>
+ <field name="INFO_OUTPUT_BUFFERS_CHANGED" deprecated="21"/>
+ <field name="INFO_OUTPUT_FORMAT_CHANGED"/>
+ <field name="INFO_TRY_AGAIN_LATER"/>
+ <field name="PARAMETER_KEY_REQUEST_SYNC_FRAME" since="19"/>
+ <field name="PARAMETER_KEY_SUSPEND" since="19"/>
+ <field name="PARAMETER_KEY_VIDEO_BITRATE" since="19"/>
+ <field name="VIDEO_SCALING_MODE_SCALE_TO_FIT"/>
+ <field name="VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING"/>
+ </class>
+ <class name="android/media/MediaCodec$BufferInfo" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="set(IIJI)V"/>
+ <field name="flags"/>
+ <field name="offset"/>
+ <field name="presentationTimeUs"/>
+ <field name="size"/>
+ </class>
+ <class name="android/media/MediaCodec$Callback" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onError(Landroid/media/MediaCodec;Landroid/media/MediaCodec$CodecException;)V"/>
+ <method name="onInputBufferAvailable(Landroid/media/MediaCodec;I)V"/>
+ <method name="onOutputBufferAvailable(Landroid/media/MediaCodec;ILandroid/media/MediaCodec$BufferInfo;)V"/>
+ <method name="onOutputFormatChanged(Landroid/media/MediaCodec;Landroid/media/MediaFormat;)V"/>
+ </class>
+ <class name="android/media/MediaCodec$CodecException" since="21">
+ <extends name="java/lang/IllegalStateException"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDiagnosticInfo()Ljava/lang/String;"/>
+ <method name="getErrorCode()I" since="23"/>
+ <method name="isRecoverable()Z"/>
+ <method name="isTransient()Z"/>
+ <field name="ERROR_INSUFFICIENT_RESOURCE" since="23"/>
+ <field name="ERROR_RECLAIMED" since="23"/>
+ </class>
+ <class name="android/media/MediaCodec$CryptoException" since="16">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>(ILjava/lang/String;)V"/>
+ <method name="getErrorCode()I"/>
+ <field name="ERROR_INSUFFICIENT_OUTPUT_PROTECTION" since="21"/>
+ <field name="ERROR_KEY_EXPIRED" since="19"/>
+ <field name="ERROR_NO_KEY" since="19"/>
+ <field name="ERROR_RESOURCE_BUSY" since="19"/>
+ <field name="ERROR_SESSION_NOT_OPENED" since="23"/>
+ <field name="ERROR_UNSUPPORTED_OPERATION" since="24"/>
+ </class>
+ <class name="android/media/MediaCodec$CryptoInfo" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="set(I[I[I[B[BI)V"/>
+ <method name="setPattern(Landroid/media/MediaCodec$CryptoInfo$Pattern;)V" since="24"/>
+ <field name="iv"/>
+ <field name="key"/>
+ <field name="mode"/>
+ <field name="numBytesOfClearData"/>
+ <field name="numBytesOfEncryptedData"/>
+ <field name="numSubSamples"/>
+ </class>
+ <class name="android/media/MediaCodec$CryptoInfo$Pattern" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="getEncryptBlocks()I"/>
+ <method name="getSkipBlocks()I"/>
+ <method name="set(II)V"/>
+ </class>
+ <class name="android/media/MediaCodec$MetricsConstants" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="CODEC"/>
+ <field name="ENCODER"/>
+ <field name="HEIGHT"/>
+ <field name="MIME_TYPE"/>
+ <field name="MODE"/>
+ <field name="MODE_AUDIO"/>
+ <field name="MODE_VIDEO"/>
+ <field name="ROTATION"/>
+ <field name="SECURE"/>
+ <field name="WIDTH"/>
+ </class>
+ <class name="android/media/MediaCodec$OnFrameRenderedListener" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="onFrameRendered(Landroid/media/MediaCodec;JJ)V"/>
+ </class>
+ <class name="android/media/MediaCodecInfo" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCapabilitiesForType(Ljava/lang/String;)Landroid/media/MediaCodecInfo$CodecCapabilities;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getSupportedTypes()[Ljava/lang/String;"/>
+ <method name="isEncoder()Z"/>
+ </class>
+ <class name="android/media/MediaCodecInfo$AudioCapabilities" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getBitrateRange()Landroid/util/Range;"/>
+ <method name="getMaxInputChannelCount()I"/>
+ <method name="getSupportedSampleRateRanges()[Landroid/util/Range;"/>
+ <method name="getSupportedSampleRates()[I"/>
+ <method name="isSampleRateSupported(I)Z"/>
+ </class>
+ <class name="android/media/MediaCodecInfo$CodecCapabilities" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="createFromProfileLevel(Ljava/lang/String;II)Landroid/media/MediaCodecInfo$CodecCapabilities;" since="21"/>
+ <method name="getAudioCapabilities()Landroid/media/MediaCodecInfo$AudioCapabilities;" since="21"/>
+ <method name="getDefaultFormat()Landroid/media/MediaFormat;" since="21"/>
+ <method name="getEncoderCapabilities()Landroid/media/MediaCodecInfo$EncoderCapabilities;" since="21"/>
+ <method name="getMaxSupportedInstances()I" since="23"/>
+ <method name="getMimeType()Ljava/lang/String;" since="21"/>
+ <method name="getVideoCapabilities()Landroid/media/MediaCodecInfo$VideoCapabilities;" since="21"/>
+ <method name="isFeatureRequired(Ljava/lang/String;)Z" since="21"/>
+ <method name="isFeatureSupported(Ljava/lang/String;)Z" since="19"/>
+ <method name="isFormatSupported(Landroid/media/MediaFormat;)Z" since="21"/>
+ <field name="COLOR_Format12bitRGB444" deprecated="23"/>
+ <field name="COLOR_Format16bitARGB1555" deprecated="23"/>
+ <field name="COLOR_Format16bitARGB4444" deprecated="23"/>
+ <field name="COLOR_Format16bitBGR565" deprecated="23"/>
+ <field name="COLOR_Format16bitRGB565"/>
+ <field name="COLOR_Format18BitBGR666" deprecated="23"/>
+ <field name="COLOR_Format18bitARGB1665" deprecated="23"/>
+ <field name="COLOR_Format18bitRGB666" deprecated="23"/>
+ <field name="COLOR_Format19bitARGB1666" deprecated="23"/>
+ <field name="COLOR_Format24BitABGR6666" deprecated="23"/>
+ <field name="COLOR_Format24BitARGB6666" deprecated="23"/>
+ <field name="COLOR_Format24bitARGB1887" deprecated="23"/>
+ <field name="COLOR_Format24bitBGR888"/>
+ <field name="COLOR_Format24bitRGB888" deprecated="23"/>
+ <field name="COLOR_Format25bitARGB1888" deprecated="23"/>
+ <field name="COLOR_Format32bitABGR8888" since="23"/>
+ <field name="COLOR_Format32bitARGB8888" deprecated="23"/>
+ <field name="COLOR_Format32bitBGRA8888" deprecated="23"/>
+ <field name="COLOR_Format8bitRGB332" deprecated="23"/>
+ <field name="COLOR_FormatCbYCrY" deprecated="23"/>
+ <field name="COLOR_FormatCrYCbY" deprecated="23"/>
+ <field name="COLOR_FormatL16"/>
+ <field name="COLOR_FormatL2" deprecated="23"/>
+ <field name="COLOR_FormatL24" deprecated="23"/>
+ <field name="COLOR_FormatL32" deprecated="23"/>
+ <field name="COLOR_FormatL4" deprecated="23"/>
+ <field name="COLOR_FormatL8"/>
+ <field name="COLOR_FormatMonochrome" deprecated="23"/>
+ <field name="COLOR_FormatRGBAFlexible" since="23"/>
+ <field name="COLOR_FormatRGBFlexible" since="23"/>
+ <field name="COLOR_FormatRawBayer10bit"/>
+ <field name="COLOR_FormatRawBayer8bit"/>
+ <field name="COLOR_FormatRawBayer8bitcompressed"/>
+ <field name="COLOR_FormatSurface" since="18"/>
+ <field name="COLOR_FormatYCbYCr" deprecated="23"/>
+ <field name="COLOR_FormatYCrYCb" deprecated="23"/>
+ <field name="COLOR_FormatYUV411PackedPlanar" deprecated="23"/>
+ <field name="COLOR_FormatYUV411Planar" deprecated="23"/>
+ <field name="COLOR_FormatYUV420Flexible" since="21"/>
+ <field name="COLOR_FormatYUV420PackedPlanar" deprecated="23"/>
+ <field name="COLOR_FormatYUV420PackedSemiPlanar" deprecated="23"/>
+ <field name="COLOR_FormatYUV420Planar" deprecated="23"/>
+ <field name="COLOR_FormatYUV420SemiPlanar" deprecated="23"/>
+ <field name="COLOR_FormatYUV422Flexible" since="23"/>
+ <field name="COLOR_FormatYUV422PackedPlanar" deprecated="23"/>
+ <field name="COLOR_FormatYUV422PackedSemiPlanar" deprecated="23"/>
+ <field name="COLOR_FormatYUV422Planar" deprecated="23"/>
+ <field name="COLOR_FormatYUV422SemiPlanar" deprecated="23"/>
+ <field name="COLOR_FormatYUV444Flexible" since="23"/>
+ <field name="COLOR_FormatYUV444Interleaved" deprecated="23"/>
+ <field name="COLOR_QCOM_FormatYUV420SemiPlanar" deprecated="23"/>
+ <field name="COLOR_TI_FormatYUV420PackedSemiPlanar" deprecated="23"/>
+ <field name="FEATURE_AdaptivePlayback" since="19"/>
+ <field name="FEATURE_IntraRefresh" since="24"/>
+ <field name="FEATURE_PartialFrame" since="26"/>
+ <field name="FEATURE_SecurePlayback" since="21"/>
+ <field name="FEATURE_TunneledPlayback" since="21"/>
+ <field name="colorFormats"/>
+ <field name="profileLevels"/>
+ </class>
+ <class name="android/media/MediaCodecInfo$CodecProfileLevel" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="AACObjectELD"/>
+ <field name="AACObjectERLC"/>
+ <field name="AACObjectERScalable" since="26"/>
+ <field name="AACObjectHE"/>
+ <field name="AACObjectHE_PS"/>
+ <field name="AACObjectLC"/>
+ <field name="AACObjectLD"/>
+ <field name="AACObjectLTP"/>
+ <field name="AACObjectMain"/>
+ <field name="AACObjectSSR"/>
+ <field name="AACObjectScalable"/>
+ <field name="AVCLevel1"/>
+ <field name="AVCLevel11"/>
+ <field name="AVCLevel12"/>
+ <field name="AVCLevel13"/>
+ <field name="AVCLevel1b"/>
+ <field name="AVCLevel2"/>
+ <field name="AVCLevel21"/>
+ <field name="AVCLevel22"/>
+ <field name="AVCLevel3"/>
+ <field name="AVCLevel31"/>
+ <field name="AVCLevel32"/>
+ <field name="AVCLevel4"/>
+ <field name="AVCLevel41"/>
+ <field name="AVCLevel42"/>
+ <field name="AVCLevel5"/>
+ <field name="AVCLevel51"/>
+ <field name="AVCLevel52" since="21"/>
+ <field name="AVCProfileBaseline"/>
+ <field name="AVCProfileExtended"/>
+ <field name="AVCProfileHigh"/>
+ <field name="AVCProfileHigh10"/>
+ <field name="AVCProfileHigh422"/>
+ <field name="AVCProfileHigh444"/>
+ <field name="AVCProfileMain"/>
+ <field name="DolbyVisionLevelFhd24" since="24"/>
+ <field name="DolbyVisionLevelFhd30" since="24"/>
+ <field name="DolbyVisionLevelFhd60" since="24"/>
+ <field name="DolbyVisionLevelHd24" since="24"/>
+ <field name="DolbyVisionLevelHd30" since="24"/>
+ <field name="DolbyVisionLevelUhd24" since="24"/>
+ <field name="DolbyVisionLevelUhd30" since="24"/>
+ <field name="DolbyVisionLevelUhd48" since="24"/>
+ <field name="DolbyVisionLevelUhd60" since="24"/>
+ <field name="DolbyVisionProfileDvavPen" since="24"/>
+ <field name="DolbyVisionProfileDvavPer" since="24"/>
+ <field name="DolbyVisionProfileDvheDen" since="24"/>
+ <field name="DolbyVisionProfileDvheDer" since="24"/>
+ <field name="DolbyVisionProfileDvheDtb" since="24"/>
+ <field name="DolbyVisionProfileDvheDth" since="24"/>
+ <field name="DolbyVisionProfileDvheDtr" since="24"/>
+ <field name="DolbyVisionProfileDvheStn" since="24"/>
+ <field name="H263Level10"/>
+ <field name="H263Level20"/>
+ <field name="H263Level30"/>
+ <field name="H263Level40"/>
+ <field name="H263Level45"/>
+ <field name="H263Level50"/>
+ <field name="H263Level60"/>
+ <field name="H263Level70"/>
+ <field name="H263ProfileBackwardCompatible"/>
+ <field name="H263ProfileBaseline"/>
+ <field name="H263ProfileH320Coding"/>
+ <field name="H263ProfileHighCompression"/>
+ <field name="H263ProfileHighLatency"/>
+ <field name="H263ProfileISWV2"/>
+ <field name="H263ProfileISWV3"/>
+ <field name="H263ProfileInterlace"/>
+ <field name="H263ProfileInternet"/>
+ <field name="HEVCHighTierLevel1" since="21"/>
+ <field name="HEVCHighTierLevel2" since="21"/>
+ <field name="HEVCHighTierLevel21" since="21"/>
+ <field name="HEVCHighTierLevel3" since="21"/>
+ <field name="HEVCHighTierLevel31" since="21"/>
+ <field name="HEVCHighTierLevel4" since="21"/>
+ <field name="HEVCHighTierLevel41" since="21"/>
+ <field name="HEVCHighTierLevel5" since="21"/>
+ <field name="HEVCHighTierLevel51" since="21"/>
+ <field name="HEVCHighTierLevel52" since="21"/>
+ <field name="HEVCHighTierLevel6" since="21"/>
+ <field name="HEVCHighTierLevel61" since="21"/>
+ <field name="HEVCHighTierLevel62" since="21"/>
+ <field name="HEVCMainTierLevel1" since="21"/>
+ <field name="HEVCMainTierLevel2" since="21"/>
+ <field name="HEVCMainTierLevel21" since="21"/>
+ <field name="HEVCMainTierLevel3" since="21"/>
+ <field name="HEVCMainTierLevel31" since="21"/>
+ <field name="HEVCMainTierLevel4" since="21"/>
+ <field name="HEVCMainTierLevel41" since="21"/>
+ <field name="HEVCMainTierLevel5" since="21"/>
+ <field name="HEVCMainTierLevel51" since="21"/>
+ <field name="HEVCMainTierLevel52" since="21"/>
+ <field name="HEVCMainTierLevel6" since="21"/>
+ <field name="HEVCMainTierLevel61" since="21"/>
+ <field name="HEVCMainTierLevel62" since="21"/>
+ <field name="HEVCProfileMain" since="21"/>
+ <field name="HEVCProfileMain10" since="21"/>
+ <field name="HEVCProfileMain10HDR10" since="24"/>
+ <field name="MPEG2LevelH14" since="23"/>
+ <field name="MPEG2LevelHL" since="23"/>
+ <field name="MPEG2LevelHP" since="24"/>
+ <field name="MPEG2LevelLL" since="23"/>
+ <field name="MPEG2LevelML" since="23"/>
+ <field name="MPEG2Profile422" since="23"/>
+ <field name="MPEG2ProfileHigh" since="23"/>
+ <field name="MPEG2ProfileMain" since="23"/>
+ <field name="MPEG2ProfileSNR" since="23"/>
+ <field name="MPEG2ProfileSimple" since="23"/>
+ <field name="MPEG2ProfileSpatial" since="23"/>
+ <field name="MPEG4Level0"/>
+ <field name="MPEG4Level0b"/>
+ <field name="MPEG4Level1"/>
+ <field name="MPEG4Level2"/>
+ <field name="MPEG4Level3"/>
+ <field name="MPEG4Level3b" since="24"/>
+ <field name="MPEG4Level4"/>
+ <field name="MPEG4Level4a"/>
+ <field name="MPEG4Level5"/>
+ <field name="MPEG4Level6" since="24"/>
+ <field name="MPEG4ProfileAdvancedCoding"/>
+ <field name="MPEG4ProfileAdvancedCore"/>
+ <field name="MPEG4ProfileAdvancedRealTime"/>
+ <field name="MPEG4ProfileAdvancedScalable"/>
+ <field name="MPEG4ProfileAdvancedSimple"/>
+ <field name="MPEG4ProfileBasicAnimated"/>
+ <field name="MPEG4ProfileCore"/>
+ <field name="MPEG4ProfileCoreScalable"/>
+ <field name="MPEG4ProfileHybrid"/>
+ <field name="MPEG4ProfileMain"/>
+ <field name="MPEG4ProfileNbit"/>
+ <field name="MPEG4ProfileScalableTexture"/>
+ <field name="MPEG4ProfileSimple"/>
+ <field name="MPEG4ProfileSimpleFBA"/>
+ <field name="MPEG4ProfileSimpleFace"/>
+ <field name="MPEG4ProfileSimpleScalable"/>
+ <field name="VP8Level_Version0" since="18"/>
+ <field name="VP8Level_Version1" since="18"/>
+ <field name="VP8Level_Version2" since="18"/>
+ <field name="VP8Level_Version3" since="18"/>
+ <field name="VP8ProfileMain" since="18"/>
+ <field name="VP9Level1" since="24"/>
+ <field name="VP9Level11" since="24"/>
+ <field name="VP9Level2" since="24"/>
+ <field name="VP9Level21" since="24"/>
+ <field name="VP9Level3" since="24"/>
+ <field name="VP9Level31" since="24"/>
+ <field name="VP9Level4" since="24"/>
+ <field name="VP9Level41" since="24"/>
+ <field name="VP9Level5" since="24"/>
+ <field name="VP9Level51" since="24"/>
+ <field name="VP9Level52" since="24"/>
+ <field name="VP9Level6" since="24"/>
+ <field name="VP9Level61" since="24"/>
+ <field name="VP9Level62" since="24"/>
+ <field name="VP9Profile0" since="24"/>
+ <field name="VP9Profile1" since="24"/>
+ <field name="VP9Profile2" since="24"/>
+ <field name="VP9Profile2HDR" since="24"/>
+ <field name="VP9Profile3" since="24"/>
+ <field name="VP9Profile3HDR" since="24"/>
+ <field name="level"/>
+ <field name="profile"/>
+ </class>
+ <class name="android/media/MediaCodecInfo$EncoderCapabilities" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getComplexityRange()Landroid/util/Range;"/>
+ <method name="isBitrateModeSupported(I)Z"/>
+ <field name="BITRATE_MODE_CBR"/>
+ <field name="BITRATE_MODE_CQ"/>
+ <field name="BITRATE_MODE_VBR"/>
+ </class>
+ <class name="android/media/MediaCodecInfo$VideoCapabilities" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="areSizeAndRateSupported(IID)Z"/>
+ <method name="getAchievableFrameRatesFor(II)Landroid/util/Range;" since="23"/>
+ <method name="getBitrateRange()Landroid/util/Range;"/>
+ <method name="getHeightAlignment()I"/>
+ <method name="getSupportedFrameRates()Landroid/util/Range;"/>
+ <method name="getSupportedFrameRatesFor(II)Landroid/util/Range;"/>
+ <method name="getSupportedHeights()Landroid/util/Range;"/>
+ <method name="getSupportedHeightsFor(I)Landroid/util/Range;"/>
+ <method name="getSupportedWidths()Landroid/util/Range;"/>
+ <method name="getSupportedWidthsFor(I)Landroid/util/Range;"/>
+ <method name="getWidthAlignment()I"/>
+ <method name="isSizeSupported(II)Z"/>
+ </class>
+ <class name="android/media/MediaCodecList" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V" removed="21"/>
+ <method name="&lt;init>(I)V" since="21"/>
+ <method name="findDecoderForFormat(Landroid/media/MediaFormat;)Ljava/lang/String;" since="21"/>
+ <method name="findEncoderForFormat(Landroid/media/MediaFormat;)Ljava/lang/String;" since="21"/>
+ <method name="getCodecCount()I" deprecated="21"/>
+ <method name="getCodecInfoAt(I)Landroid/media/MediaCodecInfo;" deprecated="21"/>
+ <method name="getCodecInfos()[Landroid/media/MediaCodecInfo;" since="21"/>
+ <field name="ALL_CODECS" since="21"/>
+ <field name="REGULAR_CODECS" since="21"/>
+ </class>
+ <class name="android/media/MediaCrypto" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/util/UUID;[B)V"/>
+ <method name="isCryptoSchemeSupported(Ljava/util/UUID;)Z"/>
+ <method name="release()V"/>
+ <method name="requiresSecureDecoderComponent(Ljava/lang/String;)Z"/>
+ <method name="setMediaDrmSession([B)V" since="23"/>
+ </class>
+ <class name="android/media/MediaCryptoException" since="16">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/media/MediaDataSource" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getSize()J"/>
+ <method name="readAt(J[BII)I"/>
+ </class>
+ <class name="android/media/MediaDescrambler" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="descramble(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;Landroid/media/MediaCodec$CryptoInfo;)I"/>
+ <method name="requiresSecureDecoderComponent(Ljava/lang/String;)Z"/>
+ <method name="setMediaCasSession(Landroid/media/MediaCas$Session;)V"/>
+ </class>
+ <class name="android/media/MediaDescription" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDescription()Ljava/lang/CharSequence;"/>
+ <method name="getExtras()Landroid/os/Bundle;"/>
+ <method name="getIconBitmap()Landroid/graphics/Bitmap;"/>
+ <method name="getIconUri()Landroid/net/Uri;"/>
+ <method name="getMediaId()Ljava/lang/String;"/>
+ <method name="getMediaUri()Landroid/net/Uri;" since="23"/>
+ <method name="getSubtitle()Ljava/lang/CharSequence;"/>
+ <method name="getTitle()Ljava/lang/CharSequence;"/>
+ <field name="BT_FOLDER_TYPE_ALBUMS" since="26"/>
+ <field name="BT_FOLDER_TYPE_ARTISTS" since="26"/>
+ <field name="BT_FOLDER_TYPE_GENRES" since="26"/>
+ <field name="BT_FOLDER_TYPE_MIXED" since="26"/>
+ <field name="BT_FOLDER_TYPE_PLAYLISTS" since="26"/>
+ <field name="BT_FOLDER_TYPE_TITLES" since="26"/>
+ <field name="BT_FOLDER_TYPE_YEARS" since="26"/>
+ <field name="CREATOR"/>
+ <field name="EXTRA_BT_FOLDER_TYPE" since="26"/>
+ </class>
+ <class name="android/media/MediaDescription$Builder" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="build()Landroid/media/MediaDescription;"/>
+ <method name="setDescription(Ljava/lang/CharSequence;)Landroid/media/MediaDescription$Builder;"/>
+ <method name="setExtras(Landroid/os/Bundle;)Landroid/media/MediaDescription$Builder;"/>
+ <method name="setIconBitmap(Landroid/graphics/Bitmap;)Landroid/media/MediaDescription$Builder;"/>
+ <method name="setIconUri(Landroid/net/Uri;)Landroid/media/MediaDescription$Builder;"/>
+ <method name="setMediaId(Ljava/lang/String;)Landroid/media/MediaDescription$Builder;"/>
+ <method name="setMediaUri(Landroid/net/Uri;)Landroid/media/MediaDescription$Builder;" since="23"/>
+ <method name="setSubtitle(Ljava/lang/CharSequence;)Landroid/media/MediaDescription$Builder;"/>
+ <method name="setTitle(Ljava/lang/CharSequence;)Landroid/media/MediaDescription$Builder;"/>
+ </class>
+ <class name="android/media/MediaDrm" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/util/UUID;)V"/>
+ <method name="closeSession([B)V"/>
+ <method name="getCryptoSession([BLjava/lang/String;Ljava/lang/String;)Landroid/media/MediaDrm$CryptoSession;"/>
+ <method name="getKeyRequest([B[BLjava/lang/String;ILjava/util/HashMap;)Landroid/media/MediaDrm$KeyRequest;"/>
+ <method name="getPropertyByteArray(Ljava/lang/String;)[B"/>
+ <method name="getPropertyString(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getProvisionRequest()Landroid/media/MediaDrm$ProvisionRequest;"/>
+ <method name="getSecureStop([B)[B" since="22"/>
+ <method name="getSecureStops()Ljava/util/List;"/>
+ <method name="isCryptoSchemeSupported(Ljava/util/UUID;)Z"/>
+ <method name="isCryptoSchemeSupported(Ljava/util/UUID;Ljava/lang/String;)Z" since="19"/>
+ <method name="openSession()[B"/>
+ <method name="provideKeyResponse([B[B)[B"/>
+ <method name="provideProvisionResponse([B)V"/>
+ <method name="queryKeyStatus([B)Ljava/util/HashMap;"/>
+ <method name="release()V"/>
+ <method name="releaseAllSecureStops()V" since="22"/>
+ <method name="releaseSecureStops([B)V"/>
+ <method name="removeKeys([B)V"/>
+ <method name="restoreKeys([B[B)V"/>
+ <method name="setOnEventListener(Landroid/media/MediaDrm$OnEventListener;)V"/>
+ <method name="setOnExpirationUpdateListener(Landroid/media/MediaDrm$OnExpirationUpdateListener;Landroid/os/Handler;)V" since="23"/>
+ <method name="setOnKeyStatusChangeListener(Landroid/media/MediaDrm$OnKeyStatusChangeListener;Landroid/os/Handler;)V" since="23"/>
+ <method name="setPropertyByteArray(Ljava/lang/String;[B)V"/>
+ <method name="setPropertyString(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <field name="EVENT_KEY_EXPIRED" deprecated="26"/>
+ <field name="EVENT_KEY_REQUIRED"/>
+ <field name="EVENT_PROVISION_REQUIRED" deprecated="23"/>
+ <field name="EVENT_SESSION_RECLAIMED" since="23"/>
+ <field name="EVENT_VENDOR_DEFINED"/>
+ <field name="KEY_TYPE_OFFLINE"/>
+ <field name="KEY_TYPE_RELEASE"/>
+ <field name="KEY_TYPE_STREAMING"/>
+ <field name="PROPERTY_ALGORITHMS"/>
+ <field name="PROPERTY_DESCRIPTION"/>
+ <field name="PROPERTY_DEVICE_UNIQUE_ID"/>
+ <field name="PROPERTY_VENDOR"/>
+ <field name="PROPERTY_VERSION"/>
+ </class>
+ <class name="android/media/MediaDrm$CryptoSession" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/media/MediaDrm;)V"/>
+ <method name="decrypt([B[B[B)[B"/>
+ <method name="encrypt([B[B[B)[B"/>
+ <method name="sign([B[B)[B"/>
+ <method name="verify([B[B[B)Z"/>
+ </class>
+ <class name="android/media/MediaDrm$KeyRequest" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getData()[B"/>
+ <method name="getDefaultUrl()Ljava/lang/String;"/>
+ <method name="getRequestType()I" since="23"/>
+ <field name="REQUEST_TYPE_INITIAL" since="23"/>
+ <field name="REQUEST_TYPE_RELEASE" since="23"/>
+ <field name="REQUEST_TYPE_RENEWAL" since="23"/>
+ </class>
+ <class name="android/media/MediaDrm$KeyStatus" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getKeyId()[B"/>
+ <method name="getStatusCode()I"/>
+ <field name="STATUS_EXPIRED"/>
+ <field name="STATUS_INTERNAL_ERROR"/>
+ <field name="STATUS_OUTPUT_NOT_ALLOWED"/>
+ <field name="STATUS_PENDING"/>
+ <field name="STATUS_USABLE"/>
+ </class>
+ <class name="android/media/MediaDrm$MediaDrmStateException" since="21">
+ <extends name="java/lang/IllegalStateException"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDiagnosticInfo()Ljava/lang/String;"/>
+ </class>
+ <class name="android/media/MediaDrm$OnEventListener" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="onEvent(Landroid/media/MediaDrm;[BII[B)V"/>
+ </class>
+ <class name="android/media/MediaDrm$OnExpirationUpdateListener" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="onExpirationUpdate(Landroid/media/MediaDrm;[BJ)V"/>
+ </class>
+ <class name="android/media/MediaDrm$OnKeyStatusChangeListener" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="onKeyStatusChange(Landroid/media/MediaDrm;[BLjava/util/List;Z)V"/>
+ </class>
+ <class name="android/media/MediaDrm$ProvisionRequest" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getData()[B"/>
+ <method name="getDefaultUrl()Ljava/lang/String;"/>
+ </class>
+ <class name="android/media/MediaDrmException" since="18">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/media/MediaDrmResetException" since="23">
+ <extends name="java/lang/IllegalStateException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/media/MediaExtractor" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="advance()Z"/>
+ <method name="getCachedDuration()J"/>
+ <method name="getCasInfo(I)Landroid/media/MediaExtractor$CasInfo;" since="26"/>
+ <method name="getDrmInitData()Landroid/media/DrmInitData;" since="24"/>
+ <method name="getMetrics()Landroid/os/PersistableBundle;" since="26"/>
+ <method name="getPsshInfo()Ljava/util/Map;" since="18"/>
+ <method name="getSampleCryptoInfo(Landroid/media/MediaCodec$CryptoInfo;)Z"/>
+ <method name="getSampleFlags()I"/>
+ <method name="getSampleTime()J"/>
+ <method name="getSampleTrackIndex()I"/>
+ <method name="getTrackCount()I"/>
+ <method name="getTrackFormat(I)Landroid/media/MediaFormat;"/>
+ <method name="hasCacheReachedEndOfStream()Z"/>
+ <method name="readSampleData(Ljava/nio/ByteBuffer;I)I"/>
+ <method name="release()V"/>
+ <method name="seekTo(JI)V"/>
+ <method name="selectTrack(I)V"/>
+ <method name="setDataSource(Landroid/content/Context;Landroid/net/Uri;Ljava/util/Map;)V"/>
+ <method name="setDataSource(Landroid/content/res/AssetFileDescriptor;)V" since="24"/>
+ <method name="setDataSource(Landroid/media/MediaDataSource;)V" since="23"/>
+ <method name="setDataSource(Ljava/io/FileDescriptor;)V"/>
+ <method name="setDataSource(Ljava/io/FileDescriptor;JJ)V"/>
+ <method name="setDataSource(Ljava/lang/String;)V"/>
+ <method name="setDataSource(Ljava/lang/String;Ljava/util/Map;)V"/>
+ <method name="setMediaCas(Landroid/media/MediaCas;)V" since="26"/>
+ <method name="unselectTrack(I)V"/>
+ <field name="SAMPLE_FLAG_ENCRYPTED"/>
+ <field name="SAMPLE_FLAG_PARTIAL_FRAME" since="26"/>
+ <field name="SAMPLE_FLAG_SYNC"/>
+ <field name="SEEK_TO_CLOSEST_SYNC"/>
+ <field name="SEEK_TO_NEXT_SYNC"/>
+ <field name="SEEK_TO_PREVIOUS_SYNC"/>
+ </class>
+ <class name="android/media/MediaExtractor$CasInfo" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getSession()Landroid/media/MediaCas$Session;"/>
+ <method name="getSystemId()I"/>
+ </class>
+ <class name="android/media/MediaExtractor$MetricsConstants" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="FORMAT"/>
+ <field name="MIME_TYPE"/>
+ <field name="TRACKS"/>
+ </class>
+ <class name="android/media/MediaFormat" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="containsKey(Ljava/lang/String;)Z"/>
+ <method name="createAudioFormat(Ljava/lang/String;II)Landroid/media/MediaFormat;"/>
+ <method name="createSubtitleFormat(Ljava/lang/String;Ljava/lang/String;)Landroid/media/MediaFormat;" since="19"/>
+ <method name="createVideoFormat(Ljava/lang/String;II)Landroid/media/MediaFormat;"/>
+ <method name="getByteBuffer(Ljava/lang/String;)Ljava/nio/ByteBuffer;"/>
+ <method name="getFeatureEnabled(Ljava/lang/String;)Z" since="21"/>
+ <method name="getFloat(Ljava/lang/String;)F"/>
+ <method name="getInteger(Ljava/lang/String;)I"/>
+ <method name="getLong(Ljava/lang/String;)J"/>
+ <method name="getString(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="setByteBuffer(Ljava/lang/String;Ljava/nio/ByteBuffer;)V"/>
+ <method name="setFeatureEnabled(Ljava/lang/String;Z)V" since="21"/>
+ <method name="setFloat(Ljava/lang/String;F)V"/>
+ <method name="setInteger(Ljava/lang/String;I)V"/>
+ <method name="setLong(Ljava/lang/String;J)V"/>
+ <method name="setString(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <field name="COLOR_RANGE_FULL" since="24"/>
+ <field name="COLOR_RANGE_LIMITED" since="24"/>
+ <field name="COLOR_STANDARD_BT2020" since="24"/>
+ <field name="COLOR_STANDARD_BT601_NTSC" since="24"/>
+ <field name="COLOR_STANDARD_BT601_PAL" since="24"/>
+ <field name="COLOR_STANDARD_BT709" since="24"/>
+ <field name="COLOR_TRANSFER_HLG" since="24"/>
+ <field name="COLOR_TRANSFER_LINEAR" since="24"/>
+ <field name="COLOR_TRANSFER_SDR_VIDEO" since="24"/>
+ <field name="COLOR_TRANSFER_ST2084" since="24"/>
+ <field name="KEY_AAC_DRC_ATTENUATION_FACTOR" since="21"/>
+ <field name="KEY_AAC_DRC_BOOST_FACTOR" since="21"/>
+ <field name="KEY_AAC_DRC_HEAVY_COMPRESSION" since="21"/>
+ <field name="KEY_AAC_DRC_TARGET_REFERENCE_LEVEL" since="21"/>
+ <field name="KEY_AAC_ENCODED_TARGET_LEVEL" since="21"/>
+ <field name="KEY_AAC_MAX_OUTPUT_CHANNEL_COUNT" since="21"/>
+ <field name="KEY_AAC_PROFILE"/>
+ <field name="KEY_AAC_SBR_MODE" since="21"/>
+ <field name="KEY_AUDIO_SESSION_ID" since="21"/>
+ <field name="KEY_BITRATE_MODE" since="21"/>
+ <field name="KEY_BIT_RATE"/>
+ <field name="KEY_CAPTURE_RATE" since="21"/>
+ <field name="KEY_CHANNEL_COUNT"/>
+ <field name="KEY_CHANNEL_MASK"/>
+ <field name="KEY_COLOR_FORMAT"/>
+ <field name="KEY_COLOR_RANGE" since="24"/>
+ <field name="KEY_COLOR_STANDARD" since="24"/>
+ <field name="KEY_COLOR_TRANSFER" since="24"/>
+ <field name="KEY_COMPLEXITY" since="21"/>
+ <field name="KEY_DURATION"/>
+ <field name="KEY_FLAC_COMPRESSION_LEVEL"/>
+ <field name="KEY_FRAME_RATE"/>
+ <field name="KEY_HDR_STATIC_INFO" since="24"/>
+ <field name="KEY_HEIGHT"/>
+ <field name="KEY_INTRA_REFRESH_PERIOD" since="24"/>
+ <field name="KEY_IS_ADTS"/>
+ <field name="KEY_IS_AUTOSELECT" since="19"/>
+ <field name="KEY_IS_DEFAULT" since="19"/>
+ <field name="KEY_IS_FORCED_SUBTITLE" since="19"/>
+ <field name="KEY_I_FRAME_INTERVAL"/>
+ <field name="KEY_LANGUAGE" since="19"/>
+ <field name="KEY_LATENCY" since="26"/>
+ <field name="KEY_LEVEL" since="23"/>
+ <field name="KEY_MAX_HEIGHT" since="19"/>
+ <field name="KEY_MAX_INPUT_SIZE"/>
+ <field name="KEY_MAX_WIDTH" since="19"/>
+ <field name="KEY_MIME"/>
+ <field name="KEY_OPERATING_RATE" since="23"/>
+ <field name="KEY_PCM_ENCODING" since="24"/>
+ <field name="KEY_PRIORITY" since="23"/>
+ <field name="KEY_PROFILE" since="21"/>
+ <field name="KEY_PUSH_BLANK_BUFFERS_ON_STOP" since="19"/>
+ <field name="KEY_REPEAT_PREVIOUS_FRAME_AFTER" since="19"/>
+ <field name="KEY_ROTATION" since="23"/>
+ <field name="KEY_SAMPLE_RATE"/>
+ <field name="KEY_SLICE_HEIGHT" since="23"/>
+ <field name="KEY_STRIDE" since="23"/>
+ <field name="KEY_TEMPORAL_LAYERING" since="21"/>
+ <field name="KEY_TRACK_ID" since="24"/>
+ <field name="KEY_WIDTH"/>
+ <field name="MIMETYPE_AUDIO_AAC" since="21"/>
+ <field name="MIMETYPE_AUDIO_AC3" since="21"/>
+ <field name="MIMETYPE_AUDIO_AMR_NB" since="21"/>
+ <field name="MIMETYPE_AUDIO_AMR_WB" since="21"/>
+ <field name="MIMETYPE_AUDIO_EAC3" since="23"/>
+ <field name="MIMETYPE_AUDIO_FLAC" since="21"/>
+ <field name="MIMETYPE_AUDIO_G711_ALAW" since="21"/>
+ <field name="MIMETYPE_AUDIO_G711_MLAW" since="21"/>
+ <field name="MIMETYPE_AUDIO_MPEG" since="21"/>
+ <field name="MIMETYPE_AUDIO_MSGSM" since="21"/>
+ <field name="MIMETYPE_AUDIO_OPUS" since="21"/>
+ <field name="MIMETYPE_AUDIO_QCELP" since="21"/>
+ <field name="MIMETYPE_AUDIO_RAW" since="21"/>
+ <field name="MIMETYPE_AUDIO_SCRAMBLED" since="26"/>
+ <field name="MIMETYPE_AUDIO_VORBIS" since="21"/>
+ <field name="MIMETYPE_TEXT_CEA_608" since="21"/>
+ <field name="MIMETYPE_TEXT_VTT" since="21"/>
+ <field name="MIMETYPE_VIDEO_AVC" since="21"/>
+ <field name="MIMETYPE_VIDEO_DOLBY_VISION" since="24"/>
+ <field name="MIMETYPE_VIDEO_H263" since="21"/>
+ <field name="MIMETYPE_VIDEO_HEVC" since="21"/>
+ <field name="MIMETYPE_VIDEO_MPEG2" since="21"/>
+ <field name="MIMETYPE_VIDEO_MPEG4" since="21"/>
+ <field name="MIMETYPE_VIDEO_RAW" since="21"/>
+ <field name="MIMETYPE_VIDEO_SCRAMBLED" since="26"/>
+ <field name="MIMETYPE_VIDEO_VP8" since="21"/>
+ <field name="MIMETYPE_VIDEO_VP9" since="21"/>
+ </class>
+ <class name="android/media/MediaMetadata" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="containsKey(Ljava/lang/String;)Z"/>
+ <method name="getBitmap(Ljava/lang/String;)Landroid/graphics/Bitmap;"/>
+ <method name="getDescription()Landroid/media/MediaDescription;"/>
+ <method name="getLong(Ljava/lang/String;)J"/>
+ <method name="getRating(Ljava/lang/String;)Landroid/media/Rating;"/>
+ <method name="getString(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getText(Ljava/lang/String;)Ljava/lang/CharSequence;"/>
+ <method name="keySet()Ljava/util/Set;"/>
+ <method name="size()I"/>
+ <field name="CREATOR"/>
+ <field name="METADATA_KEY_ALBUM"/>
+ <field name="METADATA_KEY_ALBUM_ART"/>
+ <field name="METADATA_KEY_ALBUM_ARTIST"/>
+ <field name="METADATA_KEY_ALBUM_ART_URI"/>
+ <field name="METADATA_KEY_ART"/>
+ <field name="METADATA_KEY_ARTIST"/>
+ <field name="METADATA_KEY_ART_URI"/>
+ <field name="METADATA_KEY_AUTHOR"/>
+ <field name="METADATA_KEY_BT_FOLDER_TYPE" since="26"/>
+ <field name="METADATA_KEY_COMPILATION"/>
+ <field name="METADATA_KEY_COMPOSER"/>
+ <field name="METADATA_KEY_DATE"/>
+ <field name="METADATA_KEY_DISC_NUMBER"/>
+ <field name="METADATA_KEY_DISPLAY_DESCRIPTION"/>
+ <field name="METADATA_KEY_DISPLAY_ICON"/>
+ <field name="METADATA_KEY_DISPLAY_ICON_URI"/>
+ <field name="METADATA_KEY_DISPLAY_SUBTITLE"/>
+ <field name="METADATA_KEY_DISPLAY_TITLE"/>
+ <field name="METADATA_KEY_DURATION"/>
+ <field name="METADATA_KEY_GENRE"/>
+ <field name="METADATA_KEY_MEDIA_ID"/>
+ <field name="METADATA_KEY_MEDIA_URI" since="26"/>
+ <field name="METADATA_KEY_NUM_TRACKS"/>
+ <field name="METADATA_KEY_RATING"/>
+ <field name="METADATA_KEY_TITLE"/>
+ <field name="METADATA_KEY_TRACK_NUMBER"/>
+ <field name="METADATA_KEY_USER_RATING"/>
+ <field name="METADATA_KEY_WRITER"/>
+ <field name="METADATA_KEY_YEAR"/>
+ </class>
+ <class name="android/media/MediaMetadata$Builder" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/media/MediaMetadata;)V"/>
+ <method name="build()Landroid/media/MediaMetadata;"/>
+ <method name="putBitmap(Ljava/lang/String;Landroid/graphics/Bitmap;)Landroid/media/MediaMetadata$Builder;"/>
+ <method name="putLong(Ljava/lang/String;J)Landroid/media/MediaMetadata$Builder;"/>
+ <method name="putRating(Ljava/lang/String;Landroid/media/Rating;)Landroid/media/MediaMetadata$Builder;"/>
+ <method name="putString(Ljava/lang/String;Ljava/lang/String;)Landroid/media/MediaMetadata$Builder;"/>
+ <method name="putText(Ljava/lang/String;Ljava/lang/CharSequence;)Landroid/media/MediaMetadata$Builder;"/>
+ </class>
+ <class name="android/media/MediaMetadataEditor" since="19" deprecated="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addEditableKey(I)V"/>
+ <method name="apply()V"/>
+ <method name="clear()V"/>
+ <method name="getBitmap(ILandroid/graphics/Bitmap;)Landroid/graphics/Bitmap;"/>
+ <method name="getEditableKeys()[I"/>
+ <method name="getLong(IJ)J"/>
+ <method name="getObject(ILjava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="getString(ILjava/lang/String;)Ljava/lang/String;"/>
+ <method name="putBitmap(ILandroid/graphics/Bitmap;)Landroid/media/MediaMetadataEditor;"/>
+ <method name="putLong(IJ)Landroid/media/MediaMetadataEditor;"/>
+ <method name="putObject(ILjava/lang/Object;)Landroid/media/MediaMetadataEditor;"/>
+ <method name="putString(ILjava/lang/String;)Landroid/media/MediaMetadataEditor;"/>
+ <method name="removeEditableKeys()V"/>
+ <field name="BITMAP_KEY_ARTWORK"/>
+ <field name="RATING_KEY_BY_OTHERS"/>
+ <field name="RATING_KEY_BY_USER"/>
+ </class>
+ <class name="android/media/MediaMetadataRetriever" since="10">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="extractMetadata(I)Ljava/lang/String;"/>
+ <method name="getEmbeddedPicture()[B"/>
+ <method name="getFrameAtTime()Landroid/graphics/Bitmap;"/>
+ <method name="getFrameAtTime(J)Landroid/graphics/Bitmap;"/>
+ <method name="getFrameAtTime(JI)Landroid/graphics/Bitmap;"/>
+ <method name="release()V"/>
+ <method name="setDataSource(Landroid/content/Context;Landroid/net/Uri;)V"/>
+ <method name="setDataSource(Landroid/media/MediaDataSource;)V" since="23"/>
+ <method name="setDataSource(Ljava/io/FileDescriptor;)V"/>
+ <method name="setDataSource(Ljava/io/FileDescriptor;JJ)V"/>
+ <method name="setDataSource(Ljava/lang/String;)V"/>
+ <method name="setDataSource(Ljava/lang/String;Ljava/util/Map;)V" since="14"/>
+ <field name="METADATA_KEY_ALBUM"/>
+ <field name="METADATA_KEY_ALBUMARTIST"/>
+ <field name="METADATA_KEY_ARTIST"/>
+ <field name="METADATA_KEY_AUTHOR"/>
+ <field name="METADATA_KEY_BITRATE" since="14"/>
+ <field name="METADATA_KEY_CAPTURE_FRAMERATE" since="23"/>
+ <field name="METADATA_KEY_CD_TRACK_NUMBER"/>
+ <field name="METADATA_KEY_COMPILATION"/>
+ <field name="METADATA_KEY_COMPOSER"/>
+ <field name="METADATA_KEY_DATE"/>
+ <field name="METADATA_KEY_DISC_NUMBER"/>
+ <field name="METADATA_KEY_DURATION"/>
+ <field name="METADATA_KEY_GENRE"/>
+ <field name="METADATA_KEY_HAS_AUDIO" since="14"/>
+ <field name="METADATA_KEY_HAS_VIDEO" since="14"/>
+ <field name="METADATA_KEY_LOCATION" since="15"/>
+ <field name="METADATA_KEY_MIMETYPE"/>
+ <field name="METADATA_KEY_NUM_TRACKS"/>
+ <field name="METADATA_KEY_TITLE"/>
+ <field name="METADATA_KEY_VIDEO_HEIGHT" since="14"/>
+ <field name="METADATA_KEY_VIDEO_ROTATION" since="17"/>
+ <field name="METADATA_KEY_VIDEO_WIDTH" since="14"/>
+ <field name="METADATA_KEY_WRITER"/>
+ <field name="METADATA_KEY_YEAR"/>
+ <field name="OPTION_CLOSEST"/>
+ <field name="OPTION_CLOSEST_SYNC"/>
+ <field name="OPTION_NEXT_SYNC"/>
+ <field name="OPTION_PREVIOUS_SYNC"/>
+ </class>
+ <class name="android/media/MediaMuxer" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/io/FileDescriptor;I)V" since="26"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="addTrack(Landroid/media/MediaFormat;)I"/>
+ <method name="release()V"/>
+ <method name="setLocation(FF)V" since="19"/>
+ <method name="setOrientationHint(I)V"/>
+ <method name="start()V"/>
+ <method name="stop()V"/>
+ <method name="writeSampleData(ILjava/nio/ByteBuffer;Landroid/media/MediaCodec$BufferInfo;)V"/>
+ </class>
+ <class name="android/media/MediaMuxer$OutputFormat" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="MUXER_OUTPUT_3GPP" since="26"/>
+ <field name="MUXER_OUTPUT_MPEG_4"/>
+ <field name="MUXER_OUTPUT_WEBM" since="21"/>
+ </class>
+ <class name="android/media/MediaPlayer" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/media/VolumeAutomation" since="26"/>
+ <method name="&lt;init>()V"/>
+ <method name="addTimedTextSource(Landroid/content/Context;Landroid/net/Uri;Ljava/lang/String;)V" since="16"/>
+ <method name="addTimedTextSource(Ljava/io/FileDescriptor;JJLjava/lang/String;)V" since="16"/>
+ <method name="addTimedTextSource(Ljava/io/FileDescriptor;Ljava/lang/String;)V" since="16"/>
+ <method name="addTimedTextSource(Ljava/lang/String;Ljava/lang/String;)V" since="16"/>
+ <method name="attachAuxEffect(I)V" since="9"/>
+ <method name="create(Landroid/content/Context;I)Landroid/media/MediaPlayer;"/>
+ <method name="create(Landroid/content/Context;ILandroid/media/AudioAttributes;I)Landroid/media/MediaPlayer;" since="21"/>
+ <method name="create(Landroid/content/Context;Landroid/net/Uri;)Landroid/media/MediaPlayer;"/>
+ <method name="create(Landroid/content/Context;Landroid/net/Uri;Landroid/view/SurfaceHolder;)Landroid/media/MediaPlayer;"/>
+ <method name="create(Landroid/content/Context;Landroid/net/Uri;Landroid/view/SurfaceHolder;Landroid/media/AudioAttributes;I)Landroid/media/MediaPlayer;" since="21"/>
+ <method name="deselectTrack(I)V" since="16"/>
+ <method name="getAudioSessionId()I" since="9"/>
+ <method name="getCurrentPosition()I"/>
+ <method name="getDrmInfo()Landroid/media/MediaPlayer$DrmInfo;" since="26"/>
+ <method name="getDrmPropertyString(Ljava/lang/String;)Ljava/lang/String;" since="26"/>
+ <method name="getDuration()I"/>
+ <method name="getKeyRequest([B[BLjava/lang/String;ILjava/util/Map;)Landroid/media/MediaDrm$KeyRequest;" since="26"/>
+ <method name="getMetrics()Landroid/os/PersistableBundle;" since="26"/>
+ <method name="getPlaybackParams()Landroid/media/PlaybackParams;" since="23"/>
+ <method name="getSelectedTrack(I)I" since="21"/>
+ <method name="getSyncParams()Landroid/media/SyncParams;" since="23"/>
+ <method name="getTimestamp()Landroid/media/MediaTimestamp;" since="23"/>
+ <method name="getTrackInfo()[Landroid/media/MediaPlayer$TrackInfo;" since="16"/>
+ <method name="getVideoHeight()I"/>
+ <method name="getVideoWidth()I"/>
+ <method name="isLooping()Z" since="3"/>
+ <method name="isPlaying()Z"/>
+ <method name="pause()V"/>
+ <method name="prepare()V"/>
+ <method name="prepareAsync()V"/>
+ <method name="prepareDrm(Ljava/util/UUID;)V" since="26"/>
+ <method name="provideKeyResponse([B[B)[B" since="26"/>
+ <method name="release()V"/>
+ <method name="releaseDrm()V" since="26"/>
+ <method name="reset()V"/>
+ <method name="restoreKeys([B)V" since="26"/>
+ <method name="seekTo(I)V"/>
+ <method name="seekTo(JI)V" since="26"/>
+ <method name="selectTrack(I)V" since="16"/>
+ <method name="setAudioAttributes(Landroid/media/AudioAttributes;)V" since="21"/>
+ <method name="setAudioSessionId(I)V" since="9"/>
+ <method name="setAudioStreamType(I)V" deprecated="26"/>
+ <method name="setAuxEffectSendLevel(F)V" since="9"/>
+ <method name="setDataSource(Landroid/content/Context;Landroid/net/Uri;)V"/>
+ <method name="setDataSource(Landroid/content/Context;Landroid/net/Uri;Ljava/util/Map;)V" since="14"/>
+ <method name="setDataSource(Landroid/content/Context;Landroid/net/Uri;Ljava/util/Map;Ljava/util/List;)V" since="26"/>
+ <method name="setDataSource(Landroid/content/res/AssetFileDescriptor;)V" since="24"/>
+ <method name="setDataSource(Landroid/media/MediaDataSource;)V" since="23"/>
+ <method name="setDataSource(Ljava/io/FileDescriptor;)V"/>
+ <method name="setDataSource(Ljava/io/FileDescriptor;JJ)V"/>
+ <method name="setDataSource(Ljava/lang/String;)V"/>
+ <method name="setDisplay(Landroid/view/SurfaceHolder;)V"/>
+ <method name="setDrmPropertyString(Ljava/lang/String;Ljava/lang/String;)V" since="26"/>
+ <method name="setLooping(Z)V"/>
+ <method name="setNextMediaPlayer(Landroid/media/MediaPlayer;)V" since="16"/>
+ <method name="setOnBufferingUpdateListener(Landroid/media/MediaPlayer$OnBufferingUpdateListener;)V"/>
+ <method name="setOnCompletionListener(Landroid/media/MediaPlayer$OnCompletionListener;)V"/>
+ <method name="setOnDrmConfigHelper(Landroid/media/MediaPlayer$OnDrmConfigHelper;)V" since="26"/>
+ <method name="setOnDrmInfoListener(Landroid/media/MediaPlayer$OnDrmInfoListener;)V" since="26"/>
+ <method name="setOnDrmInfoListener(Landroid/media/MediaPlayer$OnDrmInfoListener;Landroid/os/Handler;)V" since="26"/>
+ <method name="setOnDrmPreparedListener(Landroid/media/MediaPlayer$OnDrmPreparedListener;)V" since="26"/>
+ <method name="setOnDrmPreparedListener(Landroid/media/MediaPlayer$OnDrmPreparedListener;Landroid/os/Handler;)V" since="26"/>
+ <method name="setOnErrorListener(Landroid/media/MediaPlayer$OnErrorListener;)V"/>
+ <method name="setOnInfoListener(Landroid/media/MediaPlayer$OnInfoListener;)V" since="3"/>
+ <method name="setOnPreparedListener(Landroid/media/MediaPlayer$OnPreparedListener;)V"/>
+ <method name="setOnSeekCompleteListener(Landroid/media/MediaPlayer$OnSeekCompleteListener;)V"/>
+ <method name="setOnTimedMetaDataAvailableListener(Landroid/media/MediaPlayer$OnTimedMetaDataAvailableListener;)V" since="23"/>
+ <method name="setOnTimedTextListener(Landroid/media/MediaPlayer$OnTimedTextListener;)V" since="16"/>
+ <method name="setOnVideoSizeChangedListener(Landroid/media/MediaPlayer$OnVideoSizeChangedListener;)V" since="3"/>
+ <method name="setPlaybackParams(Landroid/media/PlaybackParams;)V" since="23"/>
+ <method name="setScreenOnWhilePlaying(Z)V"/>
+ <method name="setSurface(Landroid/view/Surface;)V" since="14"/>
+ <method name="setSyncParams(Landroid/media/SyncParams;)V" since="23"/>
+ <method name="setVideoScalingMode(I)V" since="16"/>
+ <method name="setVolume(FF)V"/>
+ <method name="setWakeMode(Landroid/content/Context;I)V"/>
+ <method name="start()V"/>
+ <method name="stop()V"/>
+ <field name="MEDIA_ERROR_IO" since="17"/>
+ <field name="MEDIA_ERROR_MALFORMED" since="17"/>
+ <field name="MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK" since="3"/>
+ <field name="MEDIA_ERROR_SERVER_DIED"/>
+ <field name="MEDIA_ERROR_TIMED_OUT" since="17"/>
+ <field name="MEDIA_ERROR_UNKNOWN"/>
+ <field name="MEDIA_ERROR_UNSUPPORTED" since="17"/>
+ <field name="MEDIA_INFO_AUDIO_NOT_PLAYING" since="26"/>
+ <field name="MEDIA_INFO_BAD_INTERLEAVING" since="3"/>
+ <field name="MEDIA_INFO_BUFFERING_END" since="9"/>
+ <field name="MEDIA_INFO_BUFFERING_START" since="9"/>
+ <field name="MEDIA_INFO_METADATA_UPDATE" since="5"/>
+ <field name="MEDIA_INFO_NOT_SEEKABLE" since="3"/>
+ <field name="MEDIA_INFO_SUBTITLE_TIMED_OUT" since="19"/>
+ <field name="MEDIA_INFO_UNKNOWN" since="3"/>
+ <field name="MEDIA_INFO_UNSUPPORTED_SUBTITLE" since="19"/>
+ <field name="MEDIA_INFO_VIDEO_NOT_PLAYING" since="26"/>
+ <field name="MEDIA_INFO_VIDEO_RENDERING_START" since="17"/>
+ <field name="MEDIA_INFO_VIDEO_TRACK_LAGGING" since="3"/>
+ <field name="MEDIA_MIMETYPE_TEXT_SUBRIP" since="16"/>
+ <field name="PREPARE_DRM_STATUS_PREPARATION_ERROR" since="26"/>
+ <field name="PREPARE_DRM_STATUS_PROVISIONING_NETWORK_ERROR" since="26"/>
+ <field name="PREPARE_DRM_STATUS_PROVISIONING_SERVER_ERROR" since="26"/>
+ <field name="PREPARE_DRM_STATUS_SUCCESS" since="26"/>
+ <field name="SEEK_CLOSEST" since="26"/>
+ <field name="SEEK_CLOSEST_SYNC" since="26"/>
+ <field name="SEEK_NEXT_SYNC" since="26"/>
+ <field name="SEEK_PREVIOUS_SYNC" since="26"/>
+ <field name="VIDEO_SCALING_MODE_SCALE_TO_FIT" since="16"/>
+ <field name="VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING" since="16"/>
+ </class>
+ <class name="android/media/MediaPlayer$DrmInfo" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getPssh()Ljava/util/Map;"/>
+ <method name="getSupportedSchemes()[Ljava/util/UUID;"/>
+ </class>
+ <class name="android/media/MediaPlayer$MetricsConstants" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="CODEC_AUDIO"/>
+ <field name="CODEC_VIDEO"/>
+ <field name="DURATION"/>
+ <field name="ERRORS"/>
+ <field name="ERROR_CODE"/>
+ <field name="FRAMES"/>
+ <field name="FRAMES_DROPPED"/>
+ <field name="HEIGHT"/>
+ <field name="MIME_TYPE_AUDIO"/>
+ <field name="MIME_TYPE_VIDEO"/>
+ <field name="PLAYING"/>
+ <field name="WIDTH"/>
+ </class>
+ <class name="android/media/MediaPlayer$NoDrmSchemeException" since="26">
+ <extends name="android/media/MediaDrmException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/media/MediaPlayer$OnBufferingUpdateListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onBufferingUpdate(Landroid/media/MediaPlayer;I)V"/>
+ </class>
+ <class name="android/media/MediaPlayer$OnCompletionListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onCompletion(Landroid/media/MediaPlayer;)V"/>
+ </class>
+ <class name="android/media/MediaPlayer$OnDrmConfigHelper" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="onDrmConfig(Landroid/media/MediaPlayer;)V"/>
+ </class>
+ <class name="android/media/MediaPlayer$OnDrmInfoListener" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="onDrmInfo(Landroid/media/MediaPlayer;Landroid/media/MediaPlayer$DrmInfo;)V"/>
+ </class>
+ <class name="android/media/MediaPlayer$OnDrmPreparedListener" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="onDrmPrepared(Landroid/media/MediaPlayer;I)V"/>
+ </class>
+ <class name="android/media/MediaPlayer$OnErrorListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onError(Landroid/media/MediaPlayer;II)Z"/>
+ </class>
+ <class name="android/media/MediaPlayer$OnInfoListener" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="onInfo(Landroid/media/MediaPlayer;II)Z"/>
+ </class>
+ <class name="android/media/MediaPlayer$OnPreparedListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onPrepared(Landroid/media/MediaPlayer;)V"/>
+ </class>
+ <class name="android/media/MediaPlayer$OnSeekCompleteListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onSeekComplete(Landroid/media/MediaPlayer;)V"/>
+ </class>
+ <class name="android/media/MediaPlayer$OnTimedMetaDataAvailableListener" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="onTimedMetaDataAvailable(Landroid/media/MediaPlayer;Landroid/media/TimedMetaData;)V"/>
+ </class>
+ <class name="android/media/MediaPlayer$OnTimedTextListener" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="onTimedText(Landroid/media/MediaPlayer;Landroid/media/TimedText;)V"/>
+ </class>
+ <class name="android/media/MediaPlayer$OnVideoSizeChangedListener" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="onVideoSizeChanged(Landroid/media/MediaPlayer;II)V"/>
+ </class>
+ <class name="android/media/MediaPlayer$ProvisioningNetworkErrorException" since="26">
+ <extends name="android/media/MediaDrmException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/media/MediaPlayer$ProvisioningServerErrorException" since="26">
+ <extends name="android/media/MediaDrmException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/media/MediaPlayer$TrackInfo" since="16">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getFormat()Landroid/media/MediaFormat;" since="19"/>
+ <method name="getLanguage()Ljava/lang/String;"/>
+ <method name="getTrackType()I"/>
+ <field name="MEDIA_TRACK_TYPE_AUDIO"/>
+ <field name="MEDIA_TRACK_TYPE_METADATA" since="23"/>
+ <field name="MEDIA_TRACK_TYPE_SUBTITLE" since="21"/>
+ <field name="MEDIA_TRACK_TYPE_TIMEDTEXT"/>
+ <field name="MEDIA_TRACK_TYPE_UNKNOWN"/>
+ <field name="MEDIA_TRACK_TYPE_VIDEO"/>
+ </class>
+ <class name="android/media/MediaRecorder" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAudioSourceMax()I" since="4"/>
+ <method name="getMaxAmplitude()I"/>
+ <method name="getMetrics()Landroid/os/PersistableBundle;" since="26"/>
+ <method name="getSurface()Landroid/view/Surface;" since="21"/>
+ <method name="pause()V" since="24"/>
+ <method name="prepare()V"/>
+ <method name="release()V"/>
+ <method name="reset()V"/>
+ <method name="resume()V" since="24"/>
+ <method name="setAudioChannels(I)V" since="8"/>
+ <method name="setAudioEncoder(I)V"/>
+ <method name="setAudioEncodingBitRate(I)V" since="8"/>
+ <method name="setAudioSamplingRate(I)V" since="8"/>
+ <method name="setAudioSource(I)V"/>
+ <method name="setAuxiliaryOutputFile(Ljava/io/FileDescriptor;)V" since="11" removed="16"/>
+ <method name="setAuxiliaryOutputFile(Ljava/lang/String;)V" since="11" removed="16"/>
+ <method name="setCamera(Landroid/hardware/Camera;)V" since="3" deprecated="21"/>
+ <method name="setCaptureRate(D)V" since="11"/>
+ <method name="setInputSurface(Landroid/view/Surface;)V" since="23"/>
+ <method name="setLocation(FF)V" since="14"/>
+ <method name="setMaxDuration(I)V" since="3"/>
+ <method name="setMaxFileSize(J)V" since="3"/>
+ <method name="setNextOutputFile(Ljava/io/File;)V" since="26"/>
+ <method name="setNextOutputFile(Ljava/io/FileDescriptor;)V" since="26"/>
+ <method name="setOnErrorListener(Landroid/media/MediaRecorder$OnErrorListener;)V" since="3"/>
+ <method name="setOnInfoListener(Landroid/media/MediaRecorder$OnInfoListener;)V" since="3"/>
+ <method name="setOrientationHint(I)V" since="9"/>
+ <method name="setOutputFile(Ljava/io/File;)V" since="26"/>
+ <method name="setOutputFile(Ljava/io/FileDescriptor;)V" since="3"/>
+ <method name="setOutputFile(Ljava/lang/String;)V"/>
+ <method name="setOutputFormat(I)V"/>
+ <method name="setPreviewDisplay(Landroid/view/Surface;)V"/>
+ <method name="setProfile(Landroid/media/CamcorderProfile;)V" since="8"/>
+ <method name="setVideoEncoder(I)V" since="3"/>
+ <method name="setVideoEncodingBitRate(I)V" since="8"/>
+ <method name="setVideoEncodingProfileLevel(II)V" since="26"/>
+ <method name="setVideoFrameRate(I)V" since="3"/>
+ <method name="setVideoSize(II)V" since="3"/>
+ <method name="setVideoSource(I)V" since="3"/>
+ <method name="start()V"/>
+ <method name="stop()V"/>
+ <field name="MEDIA_ERROR_SERVER_DIED" since="17"/>
+ <field name="MEDIA_RECORDER_ERROR_UNKNOWN" since="3"/>
+ <field name="MEDIA_RECORDER_INFO_MAX_DURATION_REACHED" since="3"/>
+ <field name="MEDIA_RECORDER_INFO_MAX_FILESIZE_APPROACHING" since="26"/>
+ <field name="MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED" since="3"/>
+ <field name="MEDIA_RECORDER_INFO_NEXT_OUTPUT_FILE_STARTED" since="26"/>
+ <field name="MEDIA_RECORDER_INFO_UNKNOWN" since="3"/>
+ </class>
+ <class name="android/media/MediaRecorder$AudioEncoder" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/media/MediaRecorder;)V"/>
+ <field name="AAC" since="10"/>
+ <field name="AAC_ELD" since="16"/>
+ <field name="AMR_NB"/>
+ <field name="AMR_WB" since="10"/>
+ <field name="DEFAULT"/>
+ <field name="HE_AAC" since="16"/>
+ <field name="VORBIS" since="21"/>
+ </class>
+ <class name="android/media/MediaRecorder$AudioSource" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/media/MediaRecorder;)V"/>
+ <field name="CAMCORDER" since="7"/>
+ <field name="DEFAULT"/>
+ <field name="MIC"/>
+ <field name="REMOTE_SUBMIX" since="19"/>
+ <field name="UNPROCESSED" since="24"/>
+ <field name="VOICE_CALL" since="4"/>
+ <field name="VOICE_COMMUNICATION" since="11"/>
+ <field name="VOICE_DOWNLINK" since="4"/>
+ <field name="VOICE_RECOGNITION" since="7"/>
+ <field name="VOICE_UPLINK" since="4"/>
+ </class>
+ <class name="android/media/MediaRecorder$MetricsConstants" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="AUDIO_BITRATE"/>
+ <field name="AUDIO_CHANNELS"/>
+ <field name="AUDIO_SAMPLERATE"/>
+ <field name="AUDIO_TIMESCALE"/>
+ <field name="CAPTURE_FPS"/>
+ <field name="CAPTURE_FPS_ENABLE"/>
+ <field name="FRAMERATE"/>
+ <field name="HEIGHT"/>
+ <field name="MOVIE_TIMESCALE"/>
+ <field name="ROTATION"/>
+ <field name="VIDEO_BITRATE"/>
+ <field name="VIDEO_IFRAME_INTERVAL"/>
+ <field name="VIDEO_LEVEL"/>
+ <field name="VIDEO_PROFILE"/>
+ <field name="VIDEO_TIMESCALE"/>
+ <field name="WIDTH"/>
+ </class>
+ <class name="android/media/MediaRecorder$OnErrorListener" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="onError(Landroid/media/MediaRecorder;II)V"/>
+ </class>
+ <class name="android/media/MediaRecorder$OnInfoListener" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="onInfo(Landroid/media/MediaRecorder;II)V"/>
+ </class>
+ <class name="android/media/MediaRecorder$OutputFormat" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/media/MediaRecorder;)V"/>
+ <field name="AAC_ADTS" since="16"/>
+ <field name="AMR_NB" since="10"/>
+ <field name="AMR_WB" since="10"/>
+ <field name="DEFAULT"/>
+ <field name="MPEG_2_TS" since="26"/>
+ <field name="MPEG_4"/>
+ <field name="RAW_AMR" since="3" deprecated="16"/>
+ <field name="THREE_GPP"/>
+ <field name="WEBM" since="21"/>
+ </class>
+ <class name="android/media/MediaRecorder$VideoEncoder" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/media/MediaRecorder;)V"/>
+ <field name="DEFAULT"/>
+ <field name="H263"/>
+ <field name="H264"/>
+ <field name="HEVC" since="24"/>
+ <field name="MPEG_4_SP"/>
+ <field name="VP8" since="21"/>
+ </class>
+ <class name="android/media/MediaRecorder$VideoSource" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/media/MediaRecorder;)V"/>
+ <field name="CAMERA"/>
+ <field name="DEFAULT"/>
+ <field name="SURFACE" since="21"/>
+ </class>
+ <class name="android/media/MediaRouter" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addCallback(ILandroid/media/MediaRouter$Callback;)V"/>
+ <method name="addCallback(ILandroid/media/MediaRouter$Callback;I)V" since="18"/>
+ <method name="addUserRoute(Landroid/media/MediaRouter$UserRouteInfo;)V"/>
+ <method name="clearUserRoutes()V"/>
+ <method name="createRouteCategory(IZ)Landroid/media/MediaRouter$RouteCategory;"/>
+ <method name="createRouteCategory(Ljava/lang/CharSequence;Z)Landroid/media/MediaRouter$RouteCategory;"/>
+ <method name="createUserRoute(Landroid/media/MediaRouter$RouteCategory;)Landroid/media/MediaRouter$UserRouteInfo;"/>
+ <method name="getCategoryAt(I)Landroid/media/MediaRouter$RouteCategory;"/>
+ <method name="getCategoryCount()I"/>
+ <method name="getDefaultRoute()Landroid/media/MediaRouter$RouteInfo;" since="18"/>
+ <method name="getRouteAt(I)Landroid/media/MediaRouter$RouteInfo;"/>
+ <method name="getRouteCount()I"/>
+ <method name="getSelectedRoute(I)Landroid/media/MediaRouter$RouteInfo;"/>
+ <method name="removeCallback(Landroid/media/MediaRouter$Callback;)V"/>
+ <method name="removeUserRoute(Landroid/media/MediaRouter$UserRouteInfo;)V"/>
+ <method name="selectRoute(ILandroid/media/MediaRouter$RouteInfo;)V"/>
+ <field name="CALLBACK_FLAG_PERFORM_ACTIVE_SCAN" since="18"/>
+ <field name="CALLBACK_FLAG_UNFILTERED_EVENTS" since="18"/>
+ <field name="ROUTE_TYPE_LIVE_AUDIO"/>
+ <field name="ROUTE_TYPE_LIVE_VIDEO" since="17"/>
+ <field name="ROUTE_TYPE_USER"/>
+ </class>
+ <class name="android/media/MediaRouter$Callback" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onRouteAdded(Landroid/media/MediaRouter;Landroid/media/MediaRouter$RouteInfo;)V"/>
+ <method name="onRouteChanged(Landroid/media/MediaRouter;Landroid/media/MediaRouter$RouteInfo;)V"/>
+ <method name="onRouteGrouped(Landroid/media/MediaRouter;Landroid/media/MediaRouter$RouteInfo;Landroid/media/MediaRouter$RouteGroup;I)V"/>
+ <method name="onRoutePresentationDisplayChanged(Landroid/media/MediaRouter;Landroid/media/MediaRouter$RouteInfo;)V" since="17"/>
+ <method name="onRouteRemoved(Landroid/media/MediaRouter;Landroid/media/MediaRouter$RouteInfo;)V"/>
+ <method name="onRouteSelected(Landroid/media/MediaRouter;ILandroid/media/MediaRouter$RouteInfo;)V"/>
+ <method name="onRouteUngrouped(Landroid/media/MediaRouter;Landroid/media/MediaRouter$RouteInfo;Landroid/media/MediaRouter$RouteGroup;)V"/>
+ <method name="onRouteUnselected(Landroid/media/MediaRouter;ILandroid/media/MediaRouter$RouteInfo;)V"/>
+ <method name="onRouteVolumeChanged(Landroid/media/MediaRouter;Landroid/media/MediaRouter$RouteInfo;)V"/>
+ </class>
+ <class name="android/media/MediaRouter$RouteCategory" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getName()Ljava/lang/CharSequence;"/>
+ <method name="getName(Landroid/content/Context;)Ljava/lang/CharSequence;"/>
+ <method name="getRoutes(Ljava/util/List;)Ljava/util/List;"/>
+ <method name="getSupportedTypes()I"/>
+ <method name="isGroupable()Z"/>
+ </class>
+ <class name="android/media/MediaRouter$RouteGroup" since="16">
+ <extends name="android/media/MediaRouter$RouteInfo"/>
+ <method name="&lt;init>()V"/>
+ <method name="addRoute(Landroid/media/MediaRouter$RouteInfo;)V"/>
+ <method name="addRoute(Landroid/media/MediaRouter$RouteInfo;I)V"/>
+ <method name="getRouteAt(I)Landroid/media/MediaRouter$RouteInfo;"/>
+ <method name="getRouteCount()I"/>
+ <method name="removeRoute(I)V"/>
+ <method name="removeRoute(Landroid/media/MediaRouter$RouteInfo;)V"/>
+ <method name="setIconDrawable(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setIconResource(I)V"/>
+ </class>
+ <class name="android/media/MediaRouter$RouteInfo" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCategory()Landroid/media/MediaRouter$RouteCategory;"/>
+ <method name="getDescription()Ljava/lang/CharSequence;" since="18"/>
+ <method name="getDeviceType()I" since="24"/>
+ <method name="getGroup()Landroid/media/MediaRouter$RouteGroup;"/>
+ <method name="getIconDrawable()Landroid/graphics/drawable/Drawable;"/>
+ <method name="getName()Ljava/lang/CharSequence;"/>
+ <method name="getName(Landroid/content/Context;)Ljava/lang/CharSequence;"/>
+ <method name="getPlaybackStream()I"/>
+ <method name="getPlaybackType()I"/>
+ <method name="getPresentationDisplay()Landroid/view/Display;" since="17"/>
+ <method name="getStatus()Ljava/lang/CharSequence;"/>
+ <method name="getSupportedTypes()I"/>
+ <method name="getTag()Ljava/lang/Object;"/>
+ <method name="getVolume()I"/>
+ <method name="getVolumeHandling()I"/>
+ <method name="getVolumeMax()I"/>
+ <method name="isConnecting()Z" since="18"/>
+ <method name="isEnabled()Z" since="17"/>
+ <method name="requestSetVolume(I)V"/>
+ <method name="requestUpdateVolume(I)V"/>
+ <method name="setTag(Ljava/lang/Object;)V"/>
+ <field name="DEVICE_TYPE_BLUETOOTH" since="24"/>
+ <field name="DEVICE_TYPE_SPEAKER" since="24"/>
+ <field name="DEVICE_TYPE_TV" since="24"/>
+ <field name="DEVICE_TYPE_UNKNOWN" since="24"/>
+ <field name="PLAYBACK_TYPE_LOCAL"/>
+ <field name="PLAYBACK_TYPE_REMOTE"/>
+ <field name="PLAYBACK_VOLUME_FIXED"/>
+ <field name="PLAYBACK_VOLUME_VARIABLE"/>
+ </class>
+ <class name="android/media/MediaRouter$SimpleCallback" since="16">
+ <extends name="android/media/MediaRouter$Callback"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/media/MediaRouter$UserRouteInfo" since="16">
+ <extends name="android/media/MediaRouter$RouteInfo"/>
+ <method name="&lt;init>()V"/>
+ <method name="getRemoteControlClient()Landroid/media/RemoteControlClient;"/>
+ <method name="setDescription(Ljava/lang/CharSequence;)V" since="18"/>
+ <method name="setIconDrawable(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setIconResource(I)V"/>
+ <method name="setName(I)V"/>
+ <method name="setName(Ljava/lang/CharSequence;)V"/>
+ <method name="setPlaybackStream(I)V"/>
+ <method name="setPlaybackType(I)V"/>
+ <method name="setRemoteControlClient(Landroid/media/RemoteControlClient;)V"/>
+ <method name="setStatus(Ljava/lang/CharSequence;)V"/>
+ <method name="setVolume(I)V"/>
+ <method name="setVolumeCallback(Landroid/media/MediaRouter$VolumeCallback;)V"/>
+ <method name="setVolumeHandling(I)V"/>
+ <method name="setVolumeMax(I)V"/>
+ </class>
+ <class name="android/media/MediaRouter$VolumeCallback" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onVolumeSetRequest(Landroid/media/MediaRouter$RouteInfo;I)V"/>
+ <method name="onVolumeUpdateRequest(Landroid/media/MediaRouter$RouteInfo;I)V"/>
+ </class>
+ <class name="android/media/MediaScannerConnection" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/content/ServiceConnection"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/media/MediaScannerConnection$MediaScannerConnectionClient;)V"/>
+ <method name="connect()V"/>
+ <method name="disconnect()V"/>
+ <method name="isConnected()Z"/>
+ <method name="scanFile(Landroid/content/Context;[Ljava/lang/String;[Ljava/lang/String;Landroid/media/MediaScannerConnection$OnScanCompletedListener;)V" since="8"/>
+ <method name="scanFile(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/media/MediaScannerConnection$MediaScannerConnectionClient" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/media/MediaScannerConnection$OnScanCompletedListener" since="8"/>
+ <method name="onMediaScannerConnected()V"/>
+ <method name="onScanCompleted(Ljava/lang/String;Landroid/net/Uri;)V"/>
+ </class>
+ <class name="android/media/MediaScannerConnection$OnScanCompletedListener" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="onScanCompleted(Ljava/lang/String;Landroid/net/Uri;)V"/>
+ </class>
+ <class name="android/media/MediaSync" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="createInputSurface()Landroid/view/Surface;"/>
+ <method name="flush()V"/>
+ <method name="getPlaybackParams()Landroid/media/PlaybackParams;"/>
+ <method name="getSyncParams()Landroid/media/SyncParams;"/>
+ <method name="getTimestamp()Landroid/media/MediaTimestamp;"/>
+ <method name="queueAudio(Ljava/nio/ByteBuffer;IJ)V"/>
+ <method name="release()V"/>
+ <method name="setAudioTrack(Landroid/media/AudioTrack;)V"/>
+ <method name="setCallback(Landroid/media/MediaSync$Callback;Landroid/os/Handler;)V"/>
+ <method name="setOnErrorListener(Landroid/media/MediaSync$OnErrorListener;Landroid/os/Handler;)V"/>
+ <method name="setPlaybackParams(Landroid/media/PlaybackParams;)V"/>
+ <method name="setSurface(Landroid/view/Surface;)V"/>
+ <method name="setSyncParams(Landroid/media/SyncParams;)V"/>
+ <field name="MEDIASYNC_ERROR_AUDIOTRACK_FAIL"/>
+ <field name="MEDIASYNC_ERROR_SURFACE_FAIL"/>
+ </class>
+ <class name="android/media/MediaSync$Callback" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onAudioBufferConsumed(Landroid/media/MediaSync;Ljava/nio/ByteBuffer;I)V"/>
+ </class>
+ <class name="android/media/MediaSync$OnErrorListener" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="onError(Landroid/media/MediaSync;II)V"/>
+ </class>
+ <class name="android/media/MediaSyncEvent" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="createEvent(I)Landroid/media/MediaSyncEvent;"/>
+ <method name="getAudioSessionId()I"/>
+ <method name="getType()I"/>
+ <method name="setAudioSessionId(I)Landroid/media/MediaSyncEvent;"/>
+ <field name="SYNC_EVENT_NONE"/>
+ <field name="SYNC_EVENT_PRESENTATION_COMPLETE"/>
+ </class>
+ <class name="android/media/MediaTimestamp" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAnchorMediaTimeUs()J"/>
+ <method name="getAnchorSytemNanoTime()J"/>
+ <method name="getMediaClockRate()F"/>
+ </class>
+ <class name="android/media/NotProvisionedException" since="18">
+ <extends name="android/media/MediaDrmException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/media/PlaybackParams" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="allowDefaults()Landroid/media/PlaybackParams;"/>
+ <method name="getAudioFallbackMode()I"/>
+ <method name="getPitch()F"/>
+ <method name="getSpeed()F"/>
+ <method name="setAudioFallbackMode(I)Landroid/media/PlaybackParams;"/>
+ <method name="setPitch(F)Landroid/media/PlaybackParams;"/>
+ <method name="setSpeed(F)Landroid/media/PlaybackParams;"/>
+ <field name="AUDIO_FALLBACK_MODE_DEFAULT"/>
+ <field name="AUDIO_FALLBACK_MODE_FAIL"/>
+ <field name="AUDIO_FALLBACK_MODE_MUTE"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/media/Rating" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getPercentRating()F"/>
+ <method name="getRatingStyle()I"/>
+ <method name="getStarRating()F"/>
+ <method name="hasHeart()Z"/>
+ <method name="isRated()Z"/>
+ <method name="isThumbUp()Z"/>
+ <method name="newHeartRating(Z)Landroid/media/Rating;"/>
+ <method name="newPercentageRating(F)Landroid/media/Rating;"/>
+ <method name="newStarRating(IF)Landroid/media/Rating;"/>
+ <method name="newThumbRating(Z)Landroid/media/Rating;"/>
+ <method name="newUnratedRating(I)Landroid/media/Rating;"/>
+ <field name="CREATOR"/>
+ <field name="RATING_3_STARS"/>
+ <field name="RATING_4_STARS"/>
+ <field name="RATING_5_STARS"/>
+ <field name="RATING_HEART"/>
+ <field name="RATING_NONE" since="21"/>
+ <field name="RATING_PERCENTAGE"/>
+ <field name="RATING_THUMB_UP_DOWN"/>
+ </class>
+ <class name="android/media/RemoteControlClient" since="14" deprecated="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/app/PendingIntent;)V"/>
+ <method name="&lt;init>(Landroid/app/PendingIntent;Landroid/os/Looper;)V"/>
+ <method name="editMetadata(Z)Landroid/media/RemoteControlClient$MetadataEditor;"/>
+ <method name="getMediaSession()Landroid/media/session/MediaSession;" since="21"/>
+ <method name="setMetadataUpdateListener(Landroid/media/RemoteControlClient$OnMetadataUpdateListener;)V" since="19"/>
+ <method name="setOnGetPlaybackPositionListener(Landroid/media/RemoteControlClient$OnGetPlaybackPositionListener;)V" since="18"/>
+ <method name="setPlaybackPositionUpdateListener(Landroid/media/RemoteControlClient$OnPlaybackPositionUpdateListener;)V" since="18"/>
+ <method name="setPlaybackState(I)V"/>
+ <method name="setPlaybackState(IJF)V" since="18"/>
+ <method name="setTransportControlFlags(I)V"/>
+ <field name="FLAG_KEY_MEDIA_FAST_FORWARD"/>
+ <field name="FLAG_KEY_MEDIA_NEXT"/>
+ <field name="FLAG_KEY_MEDIA_PAUSE"/>
+ <field name="FLAG_KEY_MEDIA_PLAY"/>
+ <field name="FLAG_KEY_MEDIA_PLAY_PAUSE"/>
+ <field name="FLAG_KEY_MEDIA_POSITION_UPDATE" since="18"/>
+ <field name="FLAG_KEY_MEDIA_PREVIOUS"/>
+ <field name="FLAG_KEY_MEDIA_RATING" since="19"/>
+ <field name="FLAG_KEY_MEDIA_REWIND"/>
+ <field name="FLAG_KEY_MEDIA_STOP"/>
+ <field name="PLAYSTATE_BUFFERING"/>
+ <field name="PLAYSTATE_ERROR"/>
+ <field name="PLAYSTATE_FAST_FORWARDING"/>
+ <field name="PLAYSTATE_PAUSED"/>
+ <field name="PLAYSTATE_PLAYING"/>
+ <field name="PLAYSTATE_REWINDING"/>
+ <field name="PLAYSTATE_SKIPPING_BACKWARDS"/>
+ <field name="PLAYSTATE_SKIPPING_FORWARDS"/>
+ <field name="PLAYSTATE_STOPPED"/>
+ </class>
+ <class name="android/media/RemoteControlClient$MetadataEditor" since="14" deprecated="21">
+ <extends name="android/media/MediaMetadataEditor" since="19"/>
+ <extends name="java/lang/Object" removed="19"/>
+ <method name="&lt;init>(Landroid/media/RemoteControlClient;)V"/>
+ <method name="apply()V"/>
+ <method name="clear()V"/>
+ <method name="putBitmap(ILandroid/graphics/Bitmap;)Landroid/media/RemoteControlClient$MetadataEditor;"/>
+ <method name="putLong(IJ)Landroid/media/RemoteControlClient$MetadataEditor;"/>
+ <method name="putObject(ILjava/lang/Object;)Landroid/media/RemoteControlClient$MetadataEditor;" since="22"/>
+ <method name="putString(ILjava/lang/String;)Landroid/media/RemoteControlClient$MetadataEditor;"/>
+ <field name="BITMAP_KEY_ARTWORK"/>
+ </class>
+ <class name="android/media/RemoteControlClient$OnGetPlaybackPositionListener" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="onGetPlaybackPosition()J"/>
+ </class>
+ <class name="android/media/RemoteControlClient$OnMetadataUpdateListener" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="onMetadataUpdate(ILjava/lang/Object;)V"/>
+ </class>
+ <class name="android/media/RemoteControlClient$OnPlaybackPositionUpdateListener" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="onPlaybackPositionUpdate(J)V"/>
+ </class>
+ <class name="android/media/RemoteController" since="19" deprecated="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/media/RemoteController$OnClientUpdateListener;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/media/RemoteController$OnClientUpdateListener;Landroid/os/Looper;)V"/>
+ <method name="clearArtworkConfiguration()Z"/>
+ <method name="editMetadata()Landroid/media/RemoteController$MetadataEditor;"/>
+ <method name="getEstimatedMediaPosition()J"/>
+ <method name="seekTo(J)Z"/>
+ <method name="sendMediaKeyEvent(Landroid/view/KeyEvent;)Z"/>
+ <method name="setArtworkConfiguration(II)Z"/>
+ <method name="setSynchronizationMode(I)Z"/>
+ <field name="POSITION_SYNCHRONIZATION_CHECK"/>
+ <field name="POSITION_SYNCHRONIZATION_NONE"/>
+ </class>
+ <class name="android/media/RemoteController$MetadataEditor" since="19">
+ <extends name="android/media/MediaMetadataEditor"/>
+ <method name="&lt;init>(Landroid/media/RemoteController;)V"/>
+ </class>
+ <class name="android/media/RemoteController$OnClientUpdateListener" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="onClientChange(Z)V"/>
+ <method name="onClientMetadataUpdate(Landroid/media/RemoteController$MetadataEditor;)V"/>
+ <method name="onClientPlaybackStateUpdate(I)V"/>
+ <method name="onClientPlaybackStateUpdate(IJJF)V"/>
+ <method name="onClientTransportControlUpdate(I)V"/>
+ </class>
+ <class name="android/media/ResourceBusyException" since="19">
+ <extends name="android/media/MediaDrmException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/media/Ringtone" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAudioAttributes()Landroid/media/AudioAttributes;" since="21"/>
+ <method name="getStreamType()I" deprecated="21"/>
+ <method name="getTitle(Landroid/content/Context;)Ljava/lang/String;"/>
+ <method name="isPlaying()Z"/>
+ <method name="play()V"/>
+ <method name="setAudioAttributes(Landroid/media/AudioAttributes;)V" since="21"/>
+ <method name="setStreamType(I)V" deprecated="21"/>
+ <method name="stop()V"/>
+ </class>
+ <class name="android/media/RingtoneManager" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/app/Activity;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="getActualDefaultRingtoneUri(Landroid/content/Context;I)Landroid/net/Uri;"/>
+ <method name="getCursor()Landroid/database/Cursor;"/>
+ <method name="getDefaultType(Landroid/net/Uri;)I"/>
+ <method name="getDefaultUri(I)Landroid/net/Uri;"/>
+ <method name="getIncludeDrm()Z" deprecated="19"/>
+ <method name="getRingtone(I)Landroid/media/Ringtone;"/>
+ <method name="getRingtone(Landroid/content/Context;Landroid/net/Uri;)Landroid/media/Ringtone;"/>
+ <method name="getRingtonePosition(Landroid/net/Uri;)I"/>
+ <method name="getRingtoneUri(I)Landroid/net/Uri;"/>
+ <method name="getStopPreviousRingtone()Z"/>
+ <method name="getValidRingtoneUri(Landroid/content/Context;)Landroid/net/Uri;"/>
+ <method name="inferStreamType()I" since="3"/>
+ <method name="isDefault(Landroid/net/Uri;)Z"/>
+ <method name="setActualDefaultRingtoneUri(Landroid/content/Context;ILandroid/net/Uri;)V"/>
+ <method name="setIncludeDrm(Z)V" deprecated="19"/>
+ <method name="setStopPreviousRingtone(Z)V"/>
+ <method name="setType(I)V"/>
+ <method name="stopPreviousRingtone()V"/>
+ <field name="ACTION_RINGTONE_PICKER"/>
+ <field name="EXTRA_RINGTONE_DEFAULT_URI"/>
+ <field name="EXTRA_RINGTONE_EXISTING_URI"/>
+ <field name="EXTRA_RINGTONE_INCLUDE_DRM" deprecated="19"/>
+ <field name="EXTRA_RINGTONE_PICKED_URI"/>
+ <field name="EXTRA_RINGTONE_SHOW_DEFAULT"/>
+ <field name="EXTRA_RINGTONE_SHOW_SILENT"/>
+ <field name="EXTRA_RINGTONE_TITLE"/>
+ <field name="EXTRA_RINGTONE_TYPE"/>
+ <field name="ID_COLUMN_INDEX"/>
+ <field name="TITLE_COLUMN_INDEX"/>
+ <field name="TYPE_ALARM"/>
+ <field name="TYPE_ALL"/>
+ <field name="TYPE_NOTIFICATION"/>
+ <field name="TYPE_RINGTONE"/>
+ <field name="URI_COLUMN_INDEX"/>
+ </class>
+ <class name="android/media/SoundPool" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(III)V" deprecated="21"/>
+ <method name="autoPause()V" since="8"/>
+ <method name="autoResume()V" since="8"/>
+ <method name="load(Landroid/content/Context;II)I"/>
+ <method name="load(Landroid/content/res/AssetFileDescriptor;I)I" since="3"/>
+ <method name="load(Ljava/io/FileDescriptor;JJI)I" since="3"/>
+ <method name="load(Ljava/lang/String;I)I"/>
+ <method name="pause(I)V"/>
+ <method name="play(IFFIIF)I"/>
+ <method name="release()V"/>
+ <method name="resume(I)V"/>
+ <method name="setLoop(II)V"/>
+ <method name="setOnLoadCompleteListener(Landroid/media/SoundPool$OnLoadCompleteListener;)V" since="8"/>
+ <method name="setPriority(II)V"/>
+ <method name="setRate(IF)V"/>
+ <method name="setVolume(IFF)V"/>
+ <method name="stop(I)V"/>
+ <method name="unload(I)Z"/>
+ </class>
+ <class name="android/media/SoundPool$Builder" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="build()Landroid/media/SoundPool;"/>
+ <method name="setAudioAttributes(Landroid/media/AudioAttributes;)Landroid/media/SoundPool$Builder;"/>
+ <method name="setMaxStreams(I)Landroid/media/SoundPool$Builder;"/>
+ </class>
+ <class name="android/media/SoundPool$OnLoadCompleteListener" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="onLoadComplete(Landroid/media/SoundPool;II)V"/>
+ </class>
+ <class name="android/media/SyncParams" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="allowDefaults()Landroid/media/SyncParams;"/>
+ <method name="getAudioAdjustMode()I"/>
+ <method name="getFrameRate()F"/>
+ <method name="getSyncSource()I"/>
+ <method name="getTolerance()F"/>
+ <method name="setAudioAdjustMode(I)Landroid/media/SyncParams;"/>
+ <method name="setFrameRate(F)Landroid/media/SyncParams;"/>
+ <method name="setSyncSource(I)Landroid/media/SyncParams;"/>
+ <method name="setTolerance(F)Landroid/media/SyncParams;"/>
+ <field name="AUDIO_ADJUST_MODE_DEFAULT"/>
+ <field name="AUDIO_ADJUST_MODE_RESAMPLE"/>
+ <field name="AUDIO_ADJUST_MODE_STRETCH"/>
+ <field name="SYNC_SOURCE_AUDIO"/>
+ <field name="SYNC_SOURCE_DEFAULT"/>
+ <field name="SYNC_SOURCE_SYSTEM_CLOCK"/>
+ <field name="SYNC_SOURCE_VSYNC"/>
+ </class>
+ <class name="android/media/ThumbnailUtils" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="createVideoThumbnail(Ljava/lang/String;I)Landroid/graphics/Bitmap;"/>
+ <method name="extractThumbnail(Landroid/graphics/Bitmap;II)Landroid/graphics/Bitmap;"/>
+ <method name="extractThumbnail(Landroid/graphics/Bitmap;III)Landroid/graphics/Bitmap;"/>
+ <field name="OPTIONS_RECYCLE_INPUT"/>
+ </class>
+ <class name="android/media/TimedMetaData" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getMetaData()[B"/>
+ <method name="getTimestamp()J"/>
+ </class>
+ <class name="android/media/TimedText" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getBounds()Landroid/graphics/Rect;"/>
+ <method name="getText()Ljava/lang/String;"/>
+ </class>
+ <class name="android/media/ToneGenerator" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="getAudioSessionId()I" since="16"/>
+ <method name="release()V"/>
+ <method name="startTone(I)Z"/>
+ <method name="startTone(II)Z" since="5"/>
+ <method name="stopTone()V"/>
+ <field name="MAX_VOLUME"/>
+ <field name="MIN_VOLUME"/>
+ <field name="TONE_CDMA_ABBR_ALERT" since="4"/>
+ <field name="TONE_CDMA_ABBR_INTERCEPT" since="4"/>
+ <field name="TONE_CDMA_ABBR_REORDER" since="4"/>
+ <field name="TONE_CDMA_ALERT_AUTOREDIAL_LITE" since="4"/>
+ <field name="TONE_CDMA_ALERT_CALL_GUARD" since="4"/>
+ <field name="TONE_CDMA_ALERT_INCALL_LITE" since="4"/>
+ <field name="TONE_CDMA_ALERT_NETWORK_LITE" since="4"/>
+ <field name="TONE_CDMA_ANSWER" since="4"/>
+ <field name="TONE_CDMA_CALLDROP_LITE" since="4"/>
+ <field name="TONE_CDMA_CALL_SIGNAL_ISDN_INTERGROUP" since="4"/>
+ <field name="TONE_CDMA_CALL_SIGNAL_ISDN_NORMAL" since="4"/>
+ <field name="TONE_CDMA_CALL_SIGNAL_ISDN_PAT3" since="4"/>
+ <field name="TONE_CDMA_CALL_SIGNAL_ISDN_PAT5" since="4"/>
+ <field name="TONE_CDMA_CALL_SIGNAL_ISDN_PAT6" since="4"/>
+ <field name="TONE_CDMA_CALL_SIGNAL_ISDN_PAT7" since="4"/>
+ <field name="TONE_CDMA_CALL_SIGNAL_ISDN_PING_RING" since="4"/>
+ <field name="TONE_CDMA_CALL_SIGNAL_ISDN_SP_PRI" since="4"/>
+ <field name="TONE_CDMA_CONFIRM" since="4"/>
+ <field name="TONE_CDMA_DIAL_TONE_LITE" since="4"/>
+ <field name="TONE_CDMA_EMERGENCY_RINGBACK" since="4"/>
+ <field name="TONE_CDMA_HIGH_L" since="4"/>
+ <field name="TONE_CDMA_HIGH_PBX_L" since="4"/>
+ <field name="TONE_CDMA_HIGH_PBX_SLS" since="4"/>
+ <field name="TONE_CDMA_HIGH_PBX_SS" since="4"/>
+ <field name="TONE_CDMA_HIGH_PBX_SSL" since="4"/>
+ <field name="TONE_CDMA_HIGH_PBX_S_X4" since="4"/>
+ <field name="TONE_CDMA_HIGH_SLS" since="4"/>
+ <field name="TONE_CDMA_HIGH_SS" since="4"/>
+ <field name="TONE_CDMA_HIGH_SSL" since="4"/>
+ <field name="TONE_CDMA_HIGH_SS_2" since="4"/>
+ <field name="TONE_CDMA_HIGH_S_X4" since="4"/>
+ <field name="TONE_CDMA_INTERCEPT" since="4"/>
+ <field name="TONE_CDMA_KEYPAD_VOLUME_KEY_LITE" since="4"/>
+ <field name="TONE_CDMA_LOW_L" since="4"/>
+ <field name="TONE_CDMA_LOW_PBX_L" since="4"/>
+ <field name="TONE_CDMA_LOW_PBX_SLS" since="4"/>
+ <field name="TONE_CDMA_LOW_PBX_SS" since="4"/>
+ <field name="TONE_CDMA_LOW_PBX_SSL" since="4"/>
+ <field name="TONE_CDMA_LOW_PBX_S_X4" since="4"/>
+ <field name="TONE_CDMA_LOW_SLS" since="4"/>
+ <field name="TONE_CDMA_LOW_SS" since="4"/>
+ <field name="TONE_CDMA_LOW_SSL" since="4"/>
+ <field name="TONE_CDMA_LOW_SS_2" since="4"/>
+ <field name="TONE_CDMA_LOW_S_X4" since="4"/>
+ <field name="TONE_CDMA_MED_L" since="4"/>
+ <field name="TONE_CDMA_MED_PBX_L" since="4"/>
+ <field name="TONE_CDMA_MED_PBX_SLS" since="4"/>
+ <field name="TONE_CDMA_MED_PBX_SS" since="4"/>
+ <field name="TONE_CDMA_MED_PBX_SSL" since="4"/>
+ <field name="TONE_CDMA_MED_PBX_S_X4" since="4"/>
+ <field name="TONE_CDMA_MED_SLS" since="4"/>
+ <field name="TONE_CDMA_MED_SS" since="4"/>
+ <field name="TONE_CDMA_MED_SSL" since="4"/>
+ <field name="TONE_CDMA_MED_SS_2" since="4"/>
+ <field name="TONE_CDMA_MED_S_X4" since="4"/>
+ <field name="TONE_CDMA_NETWORK_BUSY" since="4"/>
+ <field name="TONE_CDMA_NETWORK_BUSY_ONE_SHOT" since="4"/>
+ <field name="TONE_CDMA_NETWORK_CALLWAITING" since="4"/>
+ <field name="TONE_CDMA_NETWORK_USA_RINGBACK" since="4"/>
+ <field name="TONE_CDMA_ONE_MIN_BEEP" since="4"/>
+ <field name="TONE_CDMA_PIP" since="4"/>
+ <field name="TONE_CDMA_PRESSHOLDKEY_LITE" since="4"/>
+ <field name="TONE_CDMA_REORDER" since="4"/>
+ <field name="TONE_CDMA_SIGNAL_OFF" since="4"/>
+ <field name="TONE_CDMA_SOFT_ERROR_LITE" since="4"/>
+ <field name="TONE_DTMF_0"/>
+ <field name="TONE_DTMF_1"/>
+ <field name="TONE_DTMF_2"/>
+ <field name="TONE_DTMF_3"/>
+ <field name="TONE_DTMF_4"/>
+ <field name="TONE_DTMF_5"/>
+ <field name="TONE_DTMF_6"/>
+ <field name="TONE_DTMF_7"/>
+ <field name="TONE_DTMF_8"/>
+ <field name="TONE_DTMF_9"/>
+ <field name="TONE_DTMF_A"/>
+ <field name="TONE_DTMF_B"/>
+ <field name="TONE_DTMF_C"/>
+ <field name="TONE_DTMF_D"/>
+ <field name="TONE_DTMF_P"/>
+ <field name="TONE_DTMF_S"/>
+ <field name="TONE_PROP_ACK"/>
+ <field name="TONE_PROP_BEEP"/>
+ <field name="TONE_PROP_BEEP2"/>
+ <field name="TONE_PROP_NACK"/>
+ <field name="TONE_PROP_PROMPT"/>
+ <field name="TONE_SUP_BUSY"/>
+ <field name="TONE_SUP_CALL_WAITING"/>
+ <field name="TONE_SUP_CONFIRM" since="4"/>
+ <field name="TONE_SUP_CONGESTION"/>
+ <field name="TONE_SUP_CONGESTION_ABBREV" since="4"/>
+ <field name="TONE_SUP_DIAL"/>
+ <field name="TONE_SUP_ERROR"/>
+ <field name="TONE_SUP_INTERCEPT" since="4"/>
+ <field name="TONE_SUP_INTERCEPT_ABBREV" since="4"/>
+ <field name="TONE_SUP_PIP" since="4"/>
+ <field name="TONE_SUP_RADIO_ACK"/>
+ <field name="TONE_SUP_RADIO_NOTAVAIL"/>
+ <field name="TONE_SUP_RINGTONE"/>
+ </class>
+ <class name="android/media/UnsupportedSchemeException" since="18">
+ <extends name="android/media/MediaDrmException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/media/VolumeAutomation" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="createVolumeShaper(Landroid/media/VolumeShaper$Configuration;)Landroid/media/VolumeShaper;"/>
+ </class>
+ <class name="android/media/VolumeProvider" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(III)V"/>
+ <method name="getCurrentVolume()I"/>
+ <method name="getMaxVolume()I"/>
+ <method name="getVolumeControl()I"/>
+ <method name="onAdjustVolume(I)V"/>
+ <method name="onSetVolumeTo(I)V"/>
+ <method name="setCurrentVolume(I)V"/>
+ <field name="VOLUME_CONTROL_ABSOLUTE"/>
+ <field name="VOLUME_CONTROL_FIXED"/>
+ <field name="VOLUME_CONTROL_RELATIVE"/>
+ </class>
+ <class name="android/media/VolumeShaper" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable"/>
+ <method name="&lt;init>()V"/>
+ <method name="apply(Landroid/media/VolumeShaper$Operation;)V"/>
+ <method name="getVolume()F"/>
+ <method name="replace(Landroid/media/VolumeShaper$Configuration;Landroid/media/VolumeShaper$Operation;Z)V"/>
+ </class>
+ <class name="android/media/VolumeShaper$Configuration" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDuration()J"/>
+ <method name="getInterpolatorType()I"/>
+ <method name="getMaximumCurvePoints()I"/>
+ <method name="getTimes()[F"/>
+ <method name="getVolumes()[F"/>
+ <field name="CREATOR"/>
+ <field name="CUBIC_RAMP"/>
+ <field name="INTERPOLATOR_TYPE_CUBIC"/>
+ <field name="INTERPOLATOR_TYPE_CUBIC_MONOTONIC"/>
+ <field name="INTERPOLATOR_TYPE_LINEAR"/>
+ <field name="INTERPOLATOR_TYPE_STEP"/>
+ <field name="LINEAR_RAMP"/>
+ <field name="SCURVE_RAMP"/>
+ <field name="SINE_RAMP"/>
+ </class>
+ <class name="android/media/VolumeShaper$Configuration$Builder" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/media/VolumeShaper$Configuration;)V"/>
+ <method name="build()Landroid/media/VolumeShaper$Configuration;"/>
+ <method name="invertVolumes()Landroid/media/VolumeShaper$Configuration$Builder;"/>
+ <method name="reflectTimes()Landroid/media/VolumeShaper$Configuration$Builder;"/>
+ <method name="scaleToEndVolume(F)Landroid/media/VolumeShaper$Configuration$Builder;"/>
+ <method name="scaleToStartVolume(F)Landroid/media/VolumeShaper$Configuration$Builder;"/>
+ <method name="setCurve([F[F)Landroid/media/VolumeShaper$Configuration$Builder;"/>
+ <method name="setDuration(J)Landroid/media/VolumeShaper$Configuration$Builder;"/>
+ <method name="setInterpolatorType(I)Landroid/media/VolumeShaper$Configuration$Builder;"/>
+ </class>
+ <class name="android/media/VolumeShaper$Operation" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <field name="CREATOR"/>
+ <field name="PLAY"/>
+ <field name="REVERSE"/>
+ </class>
+ <class name="android/media/audiofx/AcousticEchoCanceler" since="16">
+ <extends name="android/media/audiofx/AudioEffect"/>
+ <method name="&lt;init>()V"/>
+ <method name="create(I)Landroid/media/audiofx/AcousticEchoCanceler;"/>
+ <method name="isAvailable()Z"/>
+ </class>
+ <class name="android/media/audiofx/AudioEffect" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDescriptor()Landroid/media/audiofx/AudioEffect$Descriptor;"/>
+ <method name="getEnabled()Z"/>
+ <method name="getId()I"/>
+ <method name="hasControl()Z"/>
+ <method name="queryEffects()[Landroid/media/audiofx/AudioEffect$Descriptor;"/>
+ <method name="release()V"/>
+ <method name="setControlStatusListener(Landroid/media/audiofx/AudioEffect$OnControlStatusChangeListener;)V"/>
+ <method name="setEnableStatusListener(Landroid/media/audiofx/AudioEffect$OnEnableStatusChangeListener;)V"/>
+ <method name="setEnabled(Z)I"/>
+ <field name="ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION"/>
+ <field name="ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL"/>
+ <field name="ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION"/>
+ <field name="ALREADY_EXISTS"/>
+ <field name="CONTENT_TYPE_GAME"/>
+ <field name="CONTENT_TYPE_MOVIE"/>
+ <field name="CONTENT_TYPE_MUSIC"/>
+ <field name="CONTENT_TYPE_VOICE"/>
+ <field name="EFFECT_AUXILIARY"/>
+ <field name="EFFECT_INSERT"/>
+ <field name="EFFECT_TYPE_AEC" since="18"/>
+ <field name="EFFECT_TYPE_AGC" since="18"/>
+ <field name="EFFECT_TYPE_BASS_BOOST" since="18"/>
+ <field name="EFFECT_TYPE_ENV_REVERB" since="18"/>
+ <field name="EFFECT_TYPE_EQUALIZER" since="18"/>
+ <field name="EFFECT_TYPE_LOUDNESS_ENHANCER" since="19"/>
+ <field name="EFFECT_TYPE_NS" since="18"/>
+ <field name="EFFECT_TYPE_PRESET_REVERB" since="18"/>
+ <field name="EFFECT_TYPE_VIRTUALIZER" since="18"/>
+ <field name="ERROR"/>
+ <field name="ERROR_BAD_VALUE"/>
+ <field name="ERROR_DEAD_OBJECT"/>
+ <field name="ERROR_INVALID_OPERATION"/>
+ <field name="ERROR_NO_INIT"/>
+ <field name="ERROR_NO_MEMORY"/>
+ <field name="EXTRA_AUDIO_SESSION"/>
+ <field name="EXTRA_CONTENT_TYPE"/>
+ <field name="EXTRA_PACKAGE_NAME"/>
+ <field name="SUCCESS"/>
+ </class>
+ <class name="android/media/audiofx/AudioEffect$Descriptor" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <field name="connectMode"/>
+ <field name="implementor"/>
+ <field name="name"/>
+ <field name="type"/>
+ <field name="uuid"/>
+ </class>
+ <class name="android/media/audiofx/AudioEffect$OnControlStatusChangeListener" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="onControlStatusChange(Landroid/media/audiofx/AudioEffect;Z)V"/>
+ </class>
+ <class name="android/media/audiofx/AudioEffect$OnEnableStatusChangeListener" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="onEnableStatusChange(Landroid/media/audiofx/AudioEffect;Z)V"/>
+ </class>
+ <class name="android/media/audiofx/AutomaticGainControl" since="16">
+ <extends name="android/media/audiofx/AudioEffect"/>
+ <method name="&lt;init>()V"/>
+ <method name="create(I)Landroid/media/audiofx/AutomaticGainControl;"/>
+ <method name="isAvailable()Z"/>
+ </class>
+ <class name="android/media/audiofx/BassBoost" since="9">
+ <extends name="android/media/audiofx/AudioEffect"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="getProperties()Landroid/media/audiofx/BassBoost$Settings;"/>
+ <method name="getRoundedStrength()S"/>
+ <method name="getStrengthSupported()Z"/>
+ <method name="setParameterListener(Landroid/media/audiofx/BassBoost$OnParameterChangeListener;)V"/>
+ <method name="setProperties(Landroid/media/audiofx/BassBoost$Settings;)V"/>
+ <method name="setStrength(S)V"/>
+ <field name="PARAM_STRENGTH"/>
+ <field name="PARAM_STRENGTH_SUPPORTED"/>
+ </class>
+ <class name="android/media/audiofx/BassBoost$OnParameterChangeListener" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="onParameterChange(Landroid/media/audiofx/BassBoost;IIS)V"/>
+ </class>
+ <class name="android/media/audiofx/BassBoost$Settings" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <field name="strength"/>
+ </class>
+ <class name="android/media/audiofx/EnvironmentalReverb" since="9">
+ <extends name="android/media/audiofx/AudioEffect"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="getDecayHFRatio()S"/>
+ <method name="getDecayTime()I"/>
+ <method name="getDensity()S"/>
+ <method name="getDiffusion()S"/>
+ <method name="getProperties()Landroid/media/audiofx/EnvironmentalReverb$Settings;"/>
+ <method name="getReflectionsDelay()I"/>
+ <method name="getReflectionsLevel()S"/>
+ <method name="getReverbDelay()I"/>
+ <method name="getReverbLevel()S"/>
+ <method name="getRoomHFLevel()S"/>
+ <method name="getRoomLevel()S"/>
+ <method name="setDecayHFRatio(S)V"/>
+ <method name="setDecayTime(I)V"/>
+ <method name="setDensity(S)V"/>
+ <method name="setDiffusion(S)V"/>
+ <method name="setParameterListener(Landroid/media/audiofx/EnvironmentalReverb$OnParameterChangeListener;)V"/>
+ <method name="setProperties(Landroid/media/audiofx/EnvironmentalReverb$Settings;)V"/>
+ <method name="setReflectionsDelay(I)V"/>
+ <method name="setReflectionsLevel(S)V"/>
+ <method name="setReverbDelay(I)V"/>
+ <method name="setReverbLevel(S)V"/>
+ <method name="setRoomHFLevel(S)V"/>
+ <method name="setRoomLevel(S)V"/>
+ <field name="PARAM_DECAY_HF_RATIO"/>
+ <field name="PARAM_DECAY_TIME"/>
+ <field name="PARAM_DENSITY"/>
+ <field name="PARAM_DIFFUSION"/>
+ <field name="PARAM_REFLECTIONS_DELAY"/>
+ <field name="PARAM_REFLECTIONS_LEVEL"/>
+ <field name="PARAM_REVERB_DELAY"/>
+ <field name="PARAM_REVERB_LEVEL"/>
+ <field name="PARAM_ROOM_HF_LEVEL"/>
+ <field name="PARAM_ROOM_LEVEL"/>
+ </class>
+ <class name="android/media/audiofx/EnvironmentalReverb$OnParameterChangeListener" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="onParameterChange(Landroid/media/audiofx/EnvironmentalReverb;III)V"/>
+ </class>
+ <class name="android/media/audiofx/EnvironmentalReverb$Settings" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <field name="decayHFRatio"/>
+ <field name="decayTime"/>
+ <field name="density"/>
+ <field name="diffusion"/>
+ <field name="reflectionsDelay"/>
+ <field name="reflectionsLevel"/>
+ <field name="reverbDelay"/>
+ <field name="reverbLevel"/>
+ <field name="roomHFLevel"/>
+ <field name="roomLevel"/>
+ </class>
+ <class name="android/media/audiofx/Equalizer" since="9">
+ <extends name="android/media/audiofx/AudioEffect"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="getBand(I)S"/>
+ <method name="getBandFreqRange(S)[I"/>
+ <method name="getBandLevel(S)S"/>
+ <method name="getBandLevelRange()[S"/>
+ <method name="getCenterFreq(S)I"/>
+ <method name="getCurrentPreset()S"/>
+ <method name="getNumberOfBands()S"/>
+ <method name="getNumberOfPresets()S"/>
+ <method name="getPresetName(S)Ljava/lang/String;"/>
+ <method name="getProperties()Landroid/media/audiofx/Equalizer$Settings;"/>
+ <method name="setBandLevel(SS)V"/>
+ <method name="setParameterListener(Landroid/media/audiofx/Equalizer$OnParameterChangeListener;)V"/>
+ <method name="setProperties(Landroid/media/audiofx/Equalizer$Settings;)V"/>
+ <method name="usePreset(S)V"/>
+ <field name="PARAM_BAND_FREQ_RANGE"/>
+ <field name="PARAM_BAND_LEVEL"/>
+ <field name="PARAM_CENTER_FREQ"/>
+ <field name="PARAM_CURRENT_PRESET"/>
+ <field name="PARAM_GET_BAND"/>
+ <field name="PARAM_GET_NUM_OF_PRESETS"/>
+ <field name="PARAM_GET_PRESET_NAME"/>
+ <field name="PARAM_LEVEL_RANGE"/>
+ <field name="PARAM_NUM_BANDS"/>
+ <field name="PARAM_STRING_SIZE_MAX"/>
+ </class>
+ <class name="android/media/audiofx/Equalizer$OnParameterChangeListener" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="onParameterChange(Landroid/media/audiofx/Equalizer;IIII)V"/>
+ </class>
+ <class name="android/media/audiofx/Equalizer$Settings" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <field name="bandLevels"/>
+ <field name="curPreset"/>
+ <field name="numBands"/>
+ </class>
+ <class name="android/media/audiofx/LoudnessEnhancer" since="19">
+ <extends name="android/media/audiofx/AudioEffect"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="getTargetGain()F"/>
+ <method name="setTargetGain(I)V"/>
+ <field name="PARAM_TARGET_GAIN_MB"/>
+ </class>
+ <class name="android/media/audiofx/NoiseSuppressor" since="16">
+ <extends name="android/media/audiofx/AudioEffect"/>
+ <method name="&lt;init>()V"/>
+ <method name="create(I)Landroid/media/audiofx/NoiseSuppressor;"/>
+ <method name="isAvailable()Z"/>
+ </class>
+ <class name="android/media/audiofx/PresetReverb" since="9">
+ <extends name="android/media/audiofx/AudioEffect"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="getPreset()S"/>
+ <method name="getProperties()Landroid/media/audiofx/PresetReverb$Settings;"/>
+ <method name="setParameterListener(Landroid/media/audiofx/PresetReverb$OnParameterChangeListener;)V"/>
+ <method name="setPreset(S)V"/>
+ <method name="setProperties(Landroid/media/audiofx/PresetReverb$Settings;)V"/>
+ <field name="PARAM_PRESET"/>
+ <field name="PRESET_LARGEHALL"/>
+ <field name="PRESET_LARGEROOM"/>
+ <field name="PRESET_MEDIUMHALL"/>
+ <field name="PRESET_MEDIUMROOM"/>
+ <field name="PRESET_NONE"/>
+ <field name="PRESET_PLATE"/>
+ <field name="PRESET_SMALLROOM"/>
+ </class>
+ <class name="android/media/audiofx/PresetReverb$OnParameterChangeListener" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="onParameterChange(Landroid/media/audiofx/PresetReverb;IIS)V"/>
+ </class>
+ <class name="android/media/audiofx/PresetReverb$Settings" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <field name="preset"/>
+ </class>
+ <class name="android/media/audiofx/Virtualizer" since="9">
+ <extends name="android/media/audiofx/AudioEffect"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="canVirtualize(II)Z" since="21"/>
+ <method name="forceVirtualizationMode(I)Z" since="21"/>
+ <method name="getProperties()Landroid/media/audiofx/Virtualizer$Settings;"/>
+ <method name="getRoundedStrength()S"/>
+ <method name="getSpeakerAngles(II[I)Z" since="21"/>
+ <method name="getStrengthSupported()Z"/>
+ <method name="getVirtualizationMode()I" since="21"/>
+ <method name="setParameterListener(Landroid/media/audiofx/Virtualizer$OnParameterChangeListener;)V"/>
+ <method name="setProperties(Landroid/media/audiofx/Virtualizer$Settings;)V"/>
+ <method name="setStrength(S)V"/>
+ <field name="PARAM_STRENGTH"/>
+ <field name="PARAM_STRENGTH_SUPPORTED"/>
+ <field name="VIRTUALIZATION_MODE_AUTO" since="21"/>
+ <field name="VIRTUALIZATION_MODE_BINAURAL" since="21"/>
+ <field name="VIRTUALIZATION_MODE_OFF" since="21"/>
+ <field name="VIRTUALIZATION_MODE_TRANSAURAL" since="21"/>
+ </class>
+ <class name="android/media/audiofx/Virtualizer$OnParameterChangeListener" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="onParameterChange(Landroid/media/audiofx/Virtualizer;IIS)V"/>
+ </class>
+ <class name="android/media/audiofx/Virtualizer$Settings" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <field name="strength"/>
+ </class>
+ <class name="android/media/audiofx/Visualizer" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="getCaptureSize()I"/>
+ <method name="getCaptureSizeRange()[I"/>
+ <method name="getEnabled()Z"/>
+ <method name="getFft([B)I"/>
+ <method name="getMaxCaptureRate()I"/>
+ <method name="getMeasurementMode()I" since="19"/>
+ <method name="getMeasurementPeakRms(Landroid/media/audiofx/Visualizer$MeasurementPeakRms;)I" since="19"/>
+ <method name="getSamplingRate()I"/>
+ <method name="getScalingMode()I" since="16"/>
+ <method name="getWaveForm([B)I"/>
+ <method name="release()V"/>
+ <method name="setCaptureSize(I)I"/>
+ <method name="setDataCaptureListener(Landroid/media/audiofx/Visualizer$OnDataCaptureListener;IZZ)I"/>
+ <method name="setEnabled(Z)I"/>
+ <method name="setMeasurementMode(I)I" since="19"/>
+ <method name="setScalingMode(I)I" since="16"/>
+ <field name="ALREADY_EXISTS"/>
+ <field name="ERROR"/>
+ <field name="ERROR_BAD_VALUE"/>
+ <field name="ERROR_DEAD_OBJECT"/>
+ <field name="ERROR_INVALID_OPERATION"/>
+ <field name="ERROR_NO_INIT"/>
+ <field name="ERROR_NO_MEMORY"/>
+ <field name="MEASUREMENT_MODE_NONE" since="19"/>
+ <field name="MEASUREMENT_MODE_PEAK_RMS" since="19"/>
+ <field name="SCALING_MODE_AS_PLAYED" since="16"/>
+ <field name="SCALING_MODE_NORMALIZED" since="16"/>
+ <field name="STATE_ENABLED"/>
+ <field name="STATE_INITIALIZED"/>
+ <field name="STATE_UNINITIALIZED"/>
+ <field name="SUCCESS"/>
+ </class>
+ <class name="android/media/audiofx/Visualizer$MeasurementPeakRms" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="mPeak"/>
+ <field name="mRms"/>
+ </class>
+ <class name="android/media/audiofx/Visualizer$OnDataCaptureListener" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="onFftDataCapture(Landroid/media/audiofx/Visualizer;[BI)V"/>
+ <method name="onWaveFormDataCapture(Landroid/media/audiofx/Visualizer;[BI)V"/>
+ </class>
+ <class name="android/media/browse/MediaBrowser" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/content/ComponentName;Landroid/media/browse/MediaBrowser$ConnectionCallback;Landroid/os/Bundle;)V"/>
+ <method name="connect()V"/>
+ <method name="disconnect()V"/>
+ <method name="getExtras()Landroid/os/Bundle;"/>
+ <method name="getItem(Ljava/lang/String;Landroid/media/browse/MediaBrowser$ItemCallback;)V" since="23"/>
+ <method name="getRoot()Ljava/lang/String;"/>
+ <method name="getServiceComponent()Landroid/content/ComponentName;"/>
+ <method name="getSessionToken()Landroid/media/session/MediaSession$Token;"/>
+ <method name="isConnected()Z"/>
+ <method name="subscribe(Ljava/lang/String;Landroid/media/browse/MediaBrowser$SubscriptionCallback;)V"/>
+ <method name="subscribe(Ljava/lang/String;Landroid/os/Bundle;Landroid/media/browse/MediaBrowser$SubscriptionCallback;)V" since="24"/>
+ <method name="unsubscribe(Ljava/lang/String;)V"/>
+ <method name="unsubscribe(Ljava/lang/String;Landroid/media/browse/MediaBrowser$SubscriptionCallback;)V" since="24"/>
+ <field name="EXTRA_PAGE" since="24"/>
+ <field name="EXTRA_PAGE_SIZE" since="24"/>
+ </class>
+ <class name="android/media/browse/MediaBrowser$ConnectionCallback" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onConnected()V"/>
+ <method name="onConnectionFailed()V"/>
+ <method name="onConnectionSuspended()V"/>
+ </class>
+ <class name="android/media/browse/MediaBrowser$ItemCallback" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onError(Ljava/lang/String;)V"/>
+ <method name="onItemLoaded(Landroid/media/browse/MediaBrowser$MediaItem;)V"/>
+ </class>
+ <class name="android/media/browse/MediaBrowser$MediaItem" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/media/MediaDescription;I)V"/>
+ <method name="getDescription()Landroid/media/MediaDescription;"/>
+ <method name="getFlags()I"/>
+ <method name="getMediaId()Ljava/lang/String;"/>
+ <method name="isBrowsable()Z"/>
+ <method name="isPlayable()Z"/>
+ <field name="CREATOR"/>
+ <field name="FLAG_BROWSABLE"/>
+ <field name="FLAG_PLAYABLE"/>
+ </class>
+ <class name="android/media/browse/MediaBrowser$SubscriptionCallback" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onChildrenLoaded(Ljava/lang/String;Ljava/util/List;)V"/>
+ <method name="onChildrenLoaded(Ljava/lang/String;Ljava/util/List;Landroid/os/Bundle;)V" since="24"/>
+ <method name="onError(Ljava/lang/String;)V"/>
+ <method name="onError(Ljava/lang/String;Landroid/os/Bundle;)V" since="24"/>
+ </class>
+ <class name="android/media/effect/Effect" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="apply(IIII)V"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="release()V"/>
+ <method name="setParameter(Ljava/lang/String;Ljava/lang/Object;)V"/>
+ <method name="setUpdateListener(Landroid/media/effect/EffectUpdateListener;)V"/>
+ </class>
+ <class name="android/media/effect/EffectContext" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="createWithCurrentGlContext()Landroid/media/effect/EffectContext;"/>
+ <method name="getFactory()Landroid/media/effect/EffectFactory;"/>
+ <method name="release()V"/>
+ </class>
+ <class name="android/media/effect/EffectFactory" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="createEffect(Ljava/lang/String;)Landroid/media/effect/Effect;"/>
+ <method name="isEffectSupported(Ljava/lang/String;)Z"/>
+ <field name="EFFECT_AUTOFIX"/>
+ <field name="EFFECT_BACKDROPPER"/>
+ <field name="EFFECT_BITMAPOVERLAY"/>
+ <field name="EFFECT_BLACKWHITE"/>
+ <field name="EFFECT_BRIGHTNESS"/>
+ <field name="EFFECT_CONTRAST"/>
+ <field name="EFFECT_CROP"/>
+ <field name="EFFECT_CROSSPROCESS"/>
+ <field name="EFFECT_DOCUMENTARY"/>
+ <field name="EFFECT_DUOTONE"/>
+ <field name="EFFECT_FILLLIGHT"/>
+ <field name="EFFECT_FISHEYE"/>
+ <field name="EFFECT_FLIP"/>
+ <field name="EFFECT_GRAIN"/>
+ <field name="EFFECT_GRAYSCALE"/>
+ <field name="EFFECT_LOMOISH"/>
+ <field name="EFFECT_NEGATIVE"/>
+ <field name="EFFECT_POSTERIZE"/>
+ <field name="EFFECT_REDEYE"/>
+ <field name="EFFECT_ROTATE"/>
+ <field name="EFFECT_SATURATE"/>
+ <field name="EFFECT_SEPIA"/>
+ <field name="EFFECT_SHARPEN"/>
+ <field name="EFFECT_STRAIGHTEN"/>
+ <field name="EFFECT_TEMPERATURE"/>
+ <field name="EFFECT_TINT"/>
+ <field name="EFFECT_VIGNETTE"/>
+ </class>
+ <class name="android/media/effect/EffectUpdateListener" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="onEffectUpdated(Landroid/media/effect/Effect;Ljava/lang/Object;)V"/>
+ </class>
+ <class name="android/media/midi/MidiDevice" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable"/>
+ <method name="&lt;init>()V"/>
+ <method name="connectPorts(Landroid/media/midi/MidiInputPort;I)Landroid/media/midi/MidiDevice$MidiConnection;"/>
+ <method name="getInfo()Landroid/media/midi/MidiDeviceInfo;"/>
+ <method name="openInputPort(I)Landroid/media/midi/MidiInputPort;"/>
+ <method name="openOutputPort(I)Landroid/media/midi/MidiOutputPort;"/>
+ </class>
+ <class name="android/media/midi/MidiDevice$MidiConnection" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable"/>
+ <method name="&lt;init>(Landroid/media/midi/MidiDevice;)V"/>
+ </class>
+ <class name="android/media/midi/MidiDeviceInfo" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getId()I"/>
+ <method name="getInputPortCount()I"/>
+ <method name="getOutputPortCount()I"/>
+ <method name="getPorts()[Landroid/media/midi/MidiDeviceInfo$PortInfo;"/>
+ <method name="getProperties()Landroid/os/Bundle;"/>
+ <method name="getType()I"/>
+ <method name="isPrivate()Z"/>
+ <field name="CREATOR"/>
+ <field name="PROPERTY_BLUETOOTH_DEVICE"/>
+ <field name="PROPERTY_MANUFACTURER"/>
+ <field name="PROPERTY_NAME"/>
+ <field name="PROPERTY_PRODUCT"/>
+ <field name="PROPERTY_SERIAL_NUMBER"/>
+ <field name="PROPERTY_USB_DEVICE"/>
+ <field name="PROPERTY_VERSION"/>
+ <field name="TYPE_BLUETOOTH"/>
+ <field name="TYPE_USB"/>
+ <field name="TYPE_VIRTUAL"/>
+ </class>
+ <class name="android/media/midi/MidiDeviceInfo$PortInfo" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getPortNumber()I"/>
+ <method name="getType()I"/>
+ <field name="TYPE_INPUT"/>
+ <field name="TYPE_OUTPUT"/>
+ </class>
+ <class name="android/media/midi/MidiDeviceService" since="23">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDeviceInfo()Landroid/media/midi/MidiDeviceInfo;"/>
+ <method name="getOutputPortReceivers()[Landroid/media/midi/MidiReceiver;"/>
+ <method name="onClose()V"/>
+ <method name="onDeviceStatusChanged(Landroid/media/midi/MidiDeviceStatus;)V"/>
+ <method name="onGetInputPortReceivers()[Landroid/media/midi/MidiReceiver;"/>
+ <field name="SERVICE_INTERFACE"/>
+ </class>
+ <class name="android/media/midi/MidiDeviceStatus" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDeviceInfo()Landroid/media/midi/MidiDeviceInfo;"/>
+ <method name="getOutputPortOpenCount(I)I"/>
+ <method name="isInputPortOpen(I)Z"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/media/midi/MidiInputPort" since="23">
+ <extends name="android/media/midi/MidiReceiver"/>
+ <implements name="java/io/Closeable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getPortNumber()I"/>
+ </class>
+ <class name="android/media/midi/MidiManager" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDevices()[Landroid/media/midi/MidiDeviceInfo;"/>
+ <method name="openBluetoothDevice(Landroid/bluetooth/BluetoothDevice;Landroid/media/midi/MidiManager$OnDeviceOpenedListener;Landroid/os/Handler;)V"/>
+ <method name="openDevice(Landroid/media/midi/MidiDeviceInfo;Landroid/media/midi/MidiManager$OnDeviceOpenedListener;Landroid/os/Handler;)V"/>
+ <method name="registerDeviceCallback(Landroid/media/midi/MidiManager$DeviceCallback;Landroid/os/Handler;)V"/>
+ <method name="unregisterDeviceCallback(Landroid/media/midi/MidiManager$DeviceCallback;)V"/>
+ </class>
+ <class name="android/media/midi/MidiManager$DeviceCallback" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onDeviceAdded(Landroid/media/midi/MidiDeviceInfo;)V"/>
+ <method name="onDeviceRemoved(Landroid/media/midi/MidiDeviceInfo;)V"/>
+ <method name="onDeviceStatusChanged(Landroid/media/midi/MidiDeviceStatus;)V"/>
+ </class>
+ <class name="android/media/midi/MidiManager$OnDeviceOpenedListener" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="onDeviceOpened(Landroid/media/midi/MidiDevice;)V"/>
+ </class>
+ <class name="android/media/midi/MidiOutputPort" since="23">
+ <extends name="android/media/midi/MidiSender"/>
+ <implements name="java/io/Closeable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getPortNumber()I"/>
+ </class>
+ <class name="android/media/midi/MidiReceiver" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="flush()V"/>
+ <method name="getMaxMessageSize()I"/>
+ <method name="onFlush()V"/>
+ <method name="onSend([BIIJ)V"/>
+ <method name="send([BII)V"/>
+ <method name="send([BIIJ)V"/>
+ </class>
+ <class name="android/media/midi/MidiSender" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="connect(Landroid/media/midi/MidiReceiver;)V"/>
+ <method name="disconnect(Landroid/media/midi/MidiReceiver;)V"/>
+ <method name="onConnect(Landroid/media/midi/MidiReceiver;)V"/>
+ <method name="onDisconnect(Landroid/media/midi/MidiReceiver;)V"/>
+ </class>
+ <class name="android/media/projection/MediaProjection" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="createVirtualDisplay(Ljava/lang/String;IIIILandroid/view/Surface;Landroid/hardware/display/VirtualDisplay$Callback;Landroid/os/Handler;)Landroid/hardware/display/VirtualDisplay;"/>
+ <method name="registerCallback(Landroid/media/projection/MediaProjection$Callback;Landroid/os/Handler;)V"/>
+ <method name="stop()V"/>
+ <method name="unregisterCallback(Landroid/media/projection/MediaProjection$Callback;)V"/>
+ </class>
+ <class name="android/media/projection/MediaProjection$Callback" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onStop()V"/>
+ </class>
+ <class name="android/media/projection/MediaProjectionManager" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="createScreenCaptureIntent()Landroid/content/Intent;"/>
+ <method name="getMediaProjection(ILandroid/content/Intent;)Landroid/media/projection/MediaProjection;"/>
+ </class>
+ <class name="android/media/session/MediaController" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/media/session/MediaSession$Token;)V"/>
+ <method name="adjustVolume(II)V"/>
+ <method name="dispatchMediaButtonEvent(Landroid/view/KeyEvent;)Z"/>
+ <method name="getExtras()Landroid/os/Bundle;"/>
+ <method name="getFlags()J"/>
+ <method name="getMetadata()Landroid/media/MediaMetadata;"/>
+ <method name="getPackageName()Ljava/lang/String;"/>
+ <method name="getPlaybackInfo()Landroid/media/session/MediaController$PlaybackInfo;"/>
+ <method name="getPlaybackState()Landroid/media/session/PlaybackState;"/>
+ <method name="getQueue()Ljava/util/List;"/>
+ <method name="getQueueTitle()Ljava/lang/CharSequence;"/>
+ <method name="getRatingType()I"/>
+ <method name="getSessionActivity()Landroid/app/PendingIntent;"/>
+ <method name="getSessionToken()Landroid/media/session/MediaSession$Token;"/>
+ <method name="getTransportControls()Landroid/media/session/MediaController$TransportControls;"/>
+ <method name="registerCallback(Landroid/media/session/MediaController$Callback;)V"/>
+ <method name="registerCallback(Landroid/media/session/MediaController$Callback;Landroid/os/Handler;)V"/>
+ <method name="sendCommand(Ljava/lang/String;Landroid/os/Bundle;Landroid/os/ResultReceiver;)V"/>
+ <method name="setVolumeTo(II)V"/>
+ <method name="unregisterCallback(Landroid/media/session/MediaController$Callback;)V"/>
+ </class>
+ <class name="android/media/session/MediaController$Callback" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onAudioInfoChanged(Landroid/media/session/MediaController$PlaybackInfo;)V"/>
+ <method name="onExtrasChanged(Landroid/os/Bundle;)V"/>
+ <method name="onMetadataChanged(Landroid/media/MediaMetadata;)V"/>
+ <method name="onPlaybackStateChanged(Landroid/media/session/PlaybackState;)V"/>
+ <method name="onQueueChanged(Ljava/util/List;)V"/>
+ <method name="onQueueTitleChanged(Ljava/lang/CharSequence;)V"/>
+ <method name="onSessionDestroyed()V"/>
+ <method name="onSessionEvent(Ljava/lang/String;Landroid/os/Bundle;)V"/>
+ </class>
+ <class name="android/media/session/MediaController$PlaybackInfo" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAudioAttributes()Landroid/media/AudioAttributes;"/>
+ <method name="getCurrentVolume()I"/>
+ <method name="getMaxVolume()I"/>
+ <method name="getPlaybackType()I"/>
+ <method name="getVolumeControl()I"/>
+ <field name="PLAYBACK_TYPE_LOCAL"/>
+ <field name="PLAYBACK_TYPE_REMOTE"/>
+ </class>
+ <class name="android/media/session/MediaController$TransportControls" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/media/session/MediaController;)V"/>
+ <method name="fastForward()V"/>
+ <method name="pause()V"/>
+ <method name="play()V"/>
+ <method name="playFromMediaId(Ljava/lang/String;Landroid/os/Bundle;)V"/>
+ <method name="playFromSearch(Ljava/lang/String;Landroid/os/Bundle;)V"/>
+ <method name="playFromUri(Landroid/net/Uri;Landroid/os/Bundle;)V" since="23"/>
+ <method name="prepare()V" since="24"/>
+ <method name="prepareFromMediaId(Ljava/lang/String;Landroid/os/Bundle;)V" since="24"/>
+ <method name="prepareFromSearch(Ljava/lang/String;Landroid/os/Bundle;)V" since="24"/>
+ <method name="prepareFromUri(Landroid/net/Uri;Landroid/os/Bundle;)V" since="24"/>
+ <method name="rewind()V"/>
+ <method name="seekTo(J)V"/>
+ <method name="sendCustomAction(Landroid/media/session/PlaybackState$CustomAction;Landroid/os/Bundle;)V"/>
+ <method name="sendCustomAction(Ljava/lang/String;Landroid/os/Bundle;)V"/>
+ <method name="setRating(Landroid/media/Rating;)V"/>
+ <method name="skipToNext()V"/>
+ <method name="skipToPrevious()V"/>
+ <method name="skipToQueueItem(J)V"/>
+ <method name="stop()V"/>
+ </class>
+ <class name="android/media/session/MediaSession" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;Ljava/lang/String;)V"/>
+ <method name="getController()Landroid/media/session/MediaController;"/>
+ <method name="getSessionToken()Landroid/media/session/MediaSession$Token;"/>
+ <method name="isActive()Z"/>
+ <method name="release()V"/>
+ <method name="sendSessionEvent(Ljava/lang/String;Landroid/os/Bundle;)V"/>
+ <method name="setActive(Z)V"/>
+ <method name="setCallback(Landroid/media/session/MediaSession$Callback;)V"/>
+ <method name="setCallback(Landroid/media/session/MediaSession$Callback;Landroid/os/Handler;)V"/>
+ <method name="setExtras(Landroid/os/Bundle;)V"/>
+ <method name="setFlags(I)V"/>
+ <method name="setMediaButtonReceiver(Landroid/app/PendingIntent;)V"/>
+ <method name="setMetadata(Landroid/media/MediaMetadata;)V"/>
+ <method name="setPlaybackState(Landroid/media/session/PlaybackState;)V"/>
+ <method name="setPlaybackToLocal(Landroid/media/AudioAttributes;)V"/>
+ <method name="setPlaybackToRemote(Landroid/media/VolumeProvider;)V"/>
+ <method name="setQueue(Ljava/util/List;)V"/>
+ <method name="setQueueTitle(Ljava/lang/CharSequence;)V"/>
+ <method name="setRatingType(I)V" since="22"/>
+ <method name="setSessionActivity(Landroid/app/PendingIntent;)V"/>
+ <field name="FLAG_HANDLES_MEDIA_BUTTONS" deprecated="26"/>
+ <field name="FLAG_HANDLES_TRANSPORT_CONTROLS" deprecated="26"/>
+ </class>
+ <class name="android/media/session/MediaSession$Callback" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onCommand(Ljava/lang/String;Landroid/os/Bundle;Landroid/os/ResultReceiver;)V"/>
+ <method name="onCustomAction(Ljava/lang/String;Landroid/os/Bundle;)V"/>
+ <method name="onFastForward()V"/>
+ <method name="onMediaButtonEvent(Landroid/content/Intent;)Z"/>
+ <method name="onPause()V"/>
+ <method name="onPlay()V"/>
+ <method name="onPlayFromMediaId(Ljava/lang/String;Landroid/os/Bundle;)V"/>
+ <method name="onPlayFromSearch(Ljava/lang/String;Landroid/os/Bundle;)V"/>
+ <method name="onPlayFromUri(Landroid/net/Uri;Landroid/os/Bundle;)V" since="23"/>
+ <method name="onPrepare()V" since="24"/>
+ <method name="onPrepareFromMediaId(Ljava/lang/String;Landroid/os/Bundle;)V" since="24"/>
+ <method name="onPrepareFromSearch(Ljava/lang/String;Landroid/os/Bundle;)V" since="24"/>
+ <method name="onPrepareFromUri(Landroid/net/Uri;Landroid/os/Bundle;)V" since="24"/>
+ <method name="onRewind()V"/>
+ <method name="onSeekTo(J)V"/>
+ <method name="onSetRating(Landroid/media/Rating;)V"/>
+ <method name="onSkipToNext()V"/>
+ <method name="onSkipToPrevious()V"/>
+ <method name="onSkipToQueueItem(J)V"/>
+ <method name="onStop()V"/>
+ </class>
+ <class name="android/media/session/MediaSession$QueueItem" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/media/MediaDescription;J)V"/>
+ <method name="getDescription()Landroid/media/MediaDescription;"/>
+ <method name="getQueueId()J"/>
+ <field name="CREATOR"/>
+ <field name="UNKNOWN_ID"/>
+ </class>
+ <class name="android/media/session/MediaSession$Token" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/media/session/MediaSessionManager" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addOnActiveSessionsChangedListener(Landroid/media/session/MediaSessionManager$OnActiveSessionsChangedListener;Landroid/content/ComponentName;)V"/>
+ <method name="addOnActiveSessionsChangedListener(Landroid/media/session/MediaSessionManager$OnActiveSessionsChangedListener;Landroid/content/ComponentName;Landroid/os/Handler;)V"/>
+ <method name="getActiveSessions(Landroid/content/ComponentName;)Ljava/util/List;"/>
+ <method name="removeOnActiveSessionsChangedListener(Landroid/media/session/MediaSessionManager$OnActiveSessionsChangedListener;)V"/>
+ </class>
+ <class name="android/media/session/MediaSessionManager$OnActiveSessionsChangedListener" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="onActiveSessionsChanged(Ljava/util/List;)V"/>
+ </class>
+ <class name="android/media/session/PlaybackState" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getActions()J"/>
+ <method name="getActiveQueueItemId()J"/>
+ <method name="getBufferedPosition()J"/>
+ <method name="getCustomActions()Ljava/util/List;"/>
+ <method name="getErrorMessage()Ljava/lang/CharSequence;"/>
+ <method name="getExtras()Landroid/os/Bundle;" since="22"/>
+ <method name="getLastPositionUpdateTime()J"/>
+ <method name="getPlaybackSpeed()F"/>
+ <method name="getPosition()J"/>
+ <method name="getState()I"/>
+ <field name="ACTION_FAST_FORWARD"/>
+ <field name="ACTION_PAUSE"/>
+ <field name="ACTION_PLAY"/>
+ <field name="ACTION_PLAY_FROM_MEDIA_ID"/>
+ <field name="ACTION_PLAY_FROM_SEARCH"/>
+ <field name="ACTION_PLAY_FROM_URI" since="23"/>
+ <field name="ACTION_PLAY_PAUSE"/>
+ <field name="ACTION_PREPARE" since="24"/>
+ <field name="ACTION_PREPARE_FROM_MEDIA_ID" since="24"/>
+ <field name="ACTION_PREPARE_FROM_SEARCH" since="24"/>
+ <field name="ACTION_PREPARE_FROM_URI" since="24"/>
+ <field name="ACTION_REWIND"/>
+ <field name="ACTION_SEEK_TO"/>
+ <field name="ACTION_SET_RATING"/>
+ <field name="ACTION_SKIP_TO_NEXT"/>
+ <field name="ACTION_SKIP_TO_PREVIOUS"/>
+ <field name="ACTION_SKIP_TO_QUEUE_ITEM"/>
+ <field name="ACTION_STOP"/>
+ <field name="CREATOR"/>
+ <field name="PLAYBACK_POSITION_UNKNOWN"/>
+ <field name="STATE_BUFFERING"/>
+ <field name="STATE_CONNECTING"/>
+ <field name="STATE_ERROR"/>
+ <field name="STATE_FAST_FORWARDING"/>
+ <field name="STATE_NONE"/>
+ <field name="STATE_PAUSED"/>
+ <field name="STATE_PLAYING"/>
+ <field name="STATE_REWINDING"/>
+ <field name="STATE_SKIPPING_TO_NEXT"/>
+ <field name="STATE_SKIPPING_TO_PREVIOUS"/>
+ <field name="STATE_SKIPPING_TO_QUEUE_ITEM"/>
+ <field name="STATE_STOPPED"/>
+ </class>
+ <class name="android/media/session/PlaybackState$Builder" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/media/session/PlaybackState;)V"/>
+ <method name="addCustomAction(Landroid/media/session/PlaybackState$CustomAction;)Landroid/media/session/PlaybackState$Builder;"/>
+ <method name="addCustomAction(Ljava/lang/String;Ljava/lang/String;I)Landroid/media/session/PlaybackState$Builder;"/>
+ <method name="build()Landroid/media/session/PlaybackState;"/>
+ <method name="setActions(J)Landroid/media/session/PlaybackState$Builder;"/>
+ <method name="setActiveQueueItemId(J)Landroid/media/session/PlaybackState$Builder;"/>
+ <method name="setBufferedPosition(J)Landroid/media/session/PlaybackState$Builder;"/>
+ <method name="setErrorMessage(Ljava/lang/CharSequence;)Landroid/media/session/PlaybackState$Builder;"/>
+ <method name="setExtras(Landroid/os/Bundle;)Landroid/media/session/PlaybackState$Builder;" since="22"/>
+ <method name="setState(IJF)Landroid/media/session/PlaybackState$Builder;"/>
+ <method name="setState(IJFJ)Landroid/media/session/PlaybackState$Builder;"/>
+ </class>
+ <class name="android/media/session/PlaybackState$CustomAction" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAction()Ljava/lang/String;"/>
+ <method name="getExtras()Landroid/os/Bundle;"/>
+ <method name="getIcon()I"/>
+ <method name="getName()Ljava/lang/CharSequence;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/media/session/PlaybackState$CustomAction$Builder" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/CharSequence;I)V"/>
+ <method name="build()Landroid/media/session/PlaybackState$CustomAction;"/>
+ <method name="setExtras(Landroid/os/Bundle;)Landroid/media/session/PlaybackState$CustomAction$Builder;"/>
+ </class>
+ <class name="android/media/tv/TvContentRating" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="contains(Landroid/media/tv/TvContentRating;)Z" since="24"/>
+ <method name="createRating(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)Landroid/media/tv/TvContentRating;"/>
+ <method name="flattenToString()Ljava/lang/String;"/>
+ <method name="getDomain()Ljava/lang/String;"/>
+ <method name="getMainRating()Ljava/lang/String;"/>
+ <method name="getRatingSystem()Ljava/lang/String;"/>
+ <method name="getSubRatings()Ljava/util/List;"/>
+ <method name="unflattenFromString(Ljava/lang/String;)Landroid/media/tv/TvContentRating;"/>
+ <field name="UNRATED" since="23"/>
+ </class>
+ <class name="android/media/tv/TvContract" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="buildChannelLogoUri(J)Landroid/net/Uri;"/>
+ <method name="buildChannelLogoUri(Landroid/net/Uri;)Landroid/net/Uri;"/>
+ <method name="buildChannelUri(J)Landroid/net/Uri;"/>
+ <method name="buildChannelUriForPassthroughInput(Ljava/lang/String;)Landroid/net/Uri;"/>
+ <method name="buildChannelsUriForInput(Ljava/lang/String;)Landroid/net/Uri;"/>
+ <method name="buildInputId(Landroid/content/ComponentName;)Ljava/lang/String;"/>
+ <method name="buildPreviewProgramUri(J)Landroid/net/Uri;" since="26"/>
+ <method name="buildPreviewProgramsUriForChannel(J)Landroid/net/Uri;" since="26"/>
+ <method name="buildPreviewProgramsUriForChannel(Landroid/net/Uri;)Landroid/net/Uri;" since="26"/>
+ <method name="buildProgramUri(J)Landroid/net/Uri;"/>
+ <method name="buildProgramsUriForChannel(J)Landroid/net/Uri;"/>
+ <method name="buildProgramsUriForChannel(JJJ)Landroid/net/Uri;"/>
+ <method name="buildProgramsUriForChannel(Landroid/net/Uri;)Landroid/net/Uri;"/>
+ <method name="buildProgramsUriForChannel(Landroid/net/Uri;JJ)Landroid/net/Uri;"/>
+ <method name="buildRecordedProgramUri(J)Landroid/net/Uri;" since="24"/>
+ <method name="buildWatchNextProgramUri(J)Landroid/net/Uri;" since="26"/>
+ <method name="isChannelUri(Landroid/net/Uri;)Z" since="24"/>
+ <method name="isChannelUriForPassthroughInput(Landroid/net/Uri;)Z" since="24"/>
+ <method name="isChannelUriForTunerInput(Landroid/net/Uri;)Z" since="24"/>
+ <method name="isProgramUri(Landroid/net/Uri;)Z" since="24"/>
+ <method name="requestChannelBrowsable(Landroid/content/Context;J)V" since="26"/>
+ <field name="ACTION_INITIALIZE_PROGRAMS" since="26"/>
+ <field name="ACTION_PREVIEW_PROGRAM_ADDED_TO_WATCH_NEXT" since="26"/>
+ <field name="ACTION_PREVIEW_PROGRAM_BROWSABLE_DISABLED" since="26"/>
+ <field name="ACTION_REQUEST_CHANNEL_BROWSABLE" since="26"/>
+ <field name="ACTION_WATCH_NEXT_PROGRAM_BROWSABLE_DISABLED" since="26"/>
+ <field name="AUTHORITY"/>
+ <field name="EXTRA_CHANNEL_ID" since="26"/>
+ <field name="EXTRA_PREVIEW_PROGRAM_ID" since="26"/>
+ <field name="EXTRA_WATCH_NEXT_PROGRAM_ID" since="26"/>
+ </class>
+ <class name="android/media/tv/TvContract$BaseTvColumns" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <field name="COLUMN_PACKAGE_NAME"/>
+ </class>
+ <class name="android/media/tv/TvContract$Channels" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/media/tv/TvContract$BaseTvColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="getVideoResolution(Ljava/lang/String;)Ljava/lang/String;"/>
+ <field name="COLUMN_APP_LINK_COLOR" since="23"/>
+ <field name="COLUMN_APP_LINK_ICON_URI" since="23"/>
+ <field name="COLUMN_APP_LINK_INTENT_URI" since="23"/>
+ <field name="COLUMN_APP_LINK_POSTER_ART_URI" since="23"/>
+ <field name="COLUMN_APP_LINK_TEXT" since="23"/>
+ <field name="COLUMN_BROWSABLE" since="26"/>
+ <field name="COLUMN_DESCRIPTION"/>
+ <field name="COLUMN_DISPLAY_NAME"/>
+ <field name="COLUMN_DISPLAY_NUMBER"/>
+ <field name="COLUMN_INPUT_ID"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_DATA"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_FLAG1" since="23"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_FLAG2" since="23"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_FLAG3" since="23"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_FLAG4" since="23"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_ID" since="26"/>
+ <field name="COLUMN_LOCKED" since="26"/>
+ <field name="COLUMN_NETWORK_AFFILIATION"/>
+ <field name="COLUMN_ORIGINAL_NETWORK_ID"/>
+ <field name="COLUMN_SEARCHABLE"/>
+ <field name="COLUMN_SERVICE_ID"/>
+ <field name="COLUMN_SERVICE_TYPE"/>
+ <field name="COLUMN_TRANSIENT" since="26"/>
+ <field name="COLUMN_TRANSPORT_STREAM_ID"/>
+ <field name="COLUMN_TYPE"/>
+ <field name="COLUMN_VERSION_NUMBER"/>
+ <field name="COLUMN_VIDEO_FORMAT"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="CONTENT_URI"/>
+ <field name="SERVICE_TYPE_AUDIO"/>
+ <field name="SERVICE_TYPE_AUDIO_VIDEO"/>
+ <field name="SERVICE_TYPE_OTHER"/>
+ <field name="TYPE_1SEG"/>
+ <field name="TYPE_ATSC_C"/>
+ <field name="TYPE_ATSC_M_H"/>
+ <field name="TYPE_ATSC_T"/>
+ <field name="TYPE_CMMB"/>
+ <field name="TYPE_DTMB"/>
+ <field name="TYPE_DVB_C"/>
+ <field name="TYPE_DVB_C2"/>
+ <field name="TYPE_DVB_H"/>
+ <field name="TYPE_DVB_S"/>
+ <field name="TYPE_DVB_S2"/>
+ <field name="TYPE_DVB_SH"/>
+ <field name="TYPE_DVB_T"/>
+ <field name="TYPE_DVB_T2"/>
+ <field name="TYPE_ISDB_C"/>
+ <field name="TYPE_ISDB_S"/>
+ <field name="TYPE_ISDB_T"/>
+ <field name="TYPE_ISDB_TB"/>
+ <field name="TYPE_NTSC"/>
+ <field name="TYPE_OTHER"/>
+ <field name="TYPE_PAL"/>
+ <field name="TYPE_PREVIEW" since="26"/>
+ <field name="TYPE_SECAM"/>
+ <field name="TYPE_S_DMB"/>
+ <field name="TYPE_T_DMB"/>
+ <field name="VIDEO_FORMAT_1080I"/>
+ <field name="VIDEO_FORMAT_1080P"/>
+ <field name="VIDEO_FORMAT_2160P"/>
+ <field name="VIDEO_FORMAT_240P"/>
+ <field name="VIDEO_FORMAT_360P"/>
+ <field name="VIDEO_FORMAT_4320P"/>
+ <field name="VIDEO_FORMAT_480I"/>
+ <field name="VIDEO_FORMAT_480P"/>
+ <field name="VIDEO_FORMAT_576I"/>
+ <field name="VIDEO_FORMAT_576P"/>
+ <field name="VIDEO_FORMAT_720P"/>
+ <field name="VIDEO_RESOLUTION_ED"/>
+ <field name="VIDEO_RESOLUTION_FHD"/>
+ <field name="VIDEO_RESOLUTION_HD"/>
+ <field name="VIDEO_RESOLUTION_SD"/>
+ <field name="VIDEO_RESOLUTION_UHD"/>
+ </class>
+ <class name="android/media/tv/TvContract$Channels$Logo" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_DIRECTORY"/>
+ </class>
+ <class name="android/media/tv/TvContract$PreviewPrograms" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/media/tv/TvContract$BaseTvColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="ASPECT_RATIO_16_9"/>
+ <field name="ASPECT_RATIO_1_1"/>
+ <field name="ASPECT_RATIO_2_3"/>
+ <field name="ASPECT_RATIO_3_2"/>
+ <field name="ASPECT_RATIO_4_3"/>
+ <field name="AVAILABILITY_AVAILABLE"/>
+ <field name="AVAILABILITY_FREE_WITH_SUBSCRIPTION"/>
+ <field name="AVAILABILITY_PAID_CONTENT"/>
+ <field name="COLUMN_AUDIO_LANGUAGE"/>
+ <field name="COLUMN_AUTHOR"/>
+ <field name="COLUMN_AVAILABILITY"/>
+ <field name="COLUMN_BROWSABLE"/>
+ <field name="COLUMN_CANONICAL_GENRE"/>
+ <field name="COLUMN_CHANNEL_ID"/>
+ <field name="COLUMN_CONTENT_ID"/>
+ <field name="COLUMN_CONTENT_RATING"/>
+ <field name="COLUMN_DURATION_MILLIS"/>
+ <field name="COLUMN_EPISODE_DISPLAY_NUMBER"/>
+ <field name="COLUMN_EPISODE_TITLE"/>
+ <field name="COLUMN_INTENT_URI"/>
+ <field name="COLUMN_INTERACTION_COUNT"/>
+ <field name="COLUMN_INTERACTION_TYPE"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_DATA"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_FLAG1"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_FLAG2"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_FLAG3"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_FLAG4"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_ID"/>
+ <field name="COLUMN_ITEM_COUNT"/>
+ <field name="COLUMN_LAST_PLAYBACK_POSITION_MILLIS"/>
+ <field name="COLUMN_LIVE"/>
+ <field name="COLUMN_LOGO_URI"/>
+ <field name="COLUMN_LONG_DESCRIPTION"/>
+ <field name="COLUMN_OFFER_PRICE"/>
+ <field name="COLUMN_POSTER_ART_ASPECT_RATIO"/>
+ <field name="COLUMN_POSTER_ART_URI"/>
+ <field name="COLUMN_PREVIEW_VIDEO_URI"/>
+ <field name="COLUMN_RELEASE_DATE"/>
+ <field name="COLUMN_REVIEW_RATING"/>
+ <field name="COLUMN_REVIEW_RATING_STYLE"/>
+ <field name="COLUMN_SEARCHABLE"/>
+ <field name="COLUMN_SEASON_DISPLAY_NUMBER"/>
+ <field name="COLUMN_SEASON_TITLE"/>
+ <field name="COLUMN_SHORT_DESCRIPTION"/>
+ <field name="COLUMN_STARTING_PRICE"/>
+ <field name="COLUMN_THUMBNAIL_ASPECT_RATIO"/>
+ <field name="COLUMN_THUMBNAIL_URI"/>
+ <field name="COLUMN_TITLE"/>
+ <field name="COLUMN_TRANSIENT"/>
+ <field name="COLUMN_TYPE"/>
+ <field name="COLUMN_VERSION_NUMBER"/>
+ <field name="COLUMN_VIDEO_HEIGHT"/>
+ <field name="COLUMN_VIDEO_WIDTH"/>
+ <field name="COLUMN_WEIGHT"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="CONTENT_URI"/>
+ <field name="INTERACTION_TYPE_FANS"/>
+ <field name="INTERACTION_TYPE_FOLLOWERS"/>
+ <field name="INTERACTION_TYPE_LIKES"/>
+ <field name="INTERACTION_TYPE_LISTENS"/>
+ <field name="INTERACTION_TYPE_THUMBS"/>
+ <field name="INTERACTION_TYPE_VIEWERS"/>
+ <field name="INTERACTION_TYPE_VIEWS"/>
+ <field name="REVIEW_RATING_STYLE_PERCENTAGE"/>
+ <field name="REVIEW_RATING_STYLE_STARS"/>
+ <field name="REVIEW_RATING_STYLE_THUMBS_UP_DOWN"/>
+ <field name="TYPE_ALBUM"/>
+ <field name="TYPE_ARTIST"/>
+ <field name="TYPE_CHANNEL"/>
+ <field name="TYPE_CLIP"/>
+ <field name="TYPE_EVENT"/>
+ <field name="TYPE_MOVIE"/>
+ <field name="TYPE_PLAYLIST"/>
+ <field name="TYPE_STATION"/>
+ <field name="TYPE_TRACK"/>
+ <field name="TYPE_TV_EPISODE"/>
+ <field name="TYPE_TV_SEASON"/>
+ <field name="TYPE_TV_SERIES"/>
+ </class>
+ <class name="android/media/tv/TvContract$Programs" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/media/tv/TvContract$BaseTvColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="COLUMN_AUDIO_LANGUAGE"/>
+ <field name="COLUMN_BROADCAST_GENRE"/>
+ <field name="COLUMN_CANONICAL_GENRE"/>
+ <field name="COLUMN_CHANNEL_ID"/>
+ <field name="COLUMN_CONTENT_RATING"/>
+ <field name="COLUMN_END_TIME_UTC_MILLIS"/>
+ <field name="COLUMN_EPISODE_DISPLAY_NUMBER" since="24"/>
+ <field name="COLUMN_EPISODE_NUMBER" deprecated="24"/>
+ <field name="COLUMN_EPISODE_TITLE"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_DATA"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_FLAG1" since="23"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_FLAG2" since="23"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_FLAG3" since="23"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_FLAG4" since="23"/>
+ <field name="COLUMN_LONG_DESCRIPTION"/>
+ <field name="COLUMN_POSTER_ART_URI"/>
+ <field name="COLUMN_RECORDING_PROHIBITED" since="24"/>
+ <field name="COLUMN_REVIEW_RATING" since="26"/>
+ <field name="COLUMN_REVIEW_RATING_STYLE" since="26"/>
+ <field name="COLUMN_SEARCHABLE" since="23"/>
+ <field name="COLUMN_SEASON_DISPLAY_NUMBER" since="24"/>
+ <field name="COLUMN_SEASON_NUMBER" deprecated="24"/>
+ <field name="COLUMN_SEASON_TITLE" since="24"/>
+ <field name="COLUMN_SHORT_DESCRIPTION"/>
+ <field name="COLUMN_START_TIME_UTC_MILLIS"/>
+ <field name="COLUMN_THUMBNAIL_URI"/>
+ <field name="COLUMN_TITLE"/>
+ <field name="COLUMN_VERSION_NUMBER"/>
+ <field name="COLUMN_VIDEO_HEIGHT"/>
+ <field name="COLUMN_VIDEO_WIDTH"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="CONTENT_URI"/>
+ <field name="REVIEW_RATING_STYLE_PERCENTAGE" since="26"/>
+ <field name="REVIEW_RATING_STYLE_STARS" since="26"/>
+ <field name="REVIEW_RATING_STYLE_THUMBS_UP_DOWN" since="26"/>
+ </class>
+ <class name="android/media/tv/TvContract$Programs$Genres" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="decode(Ljava/lang/String;)[Ljava/lang/String;"/>
+ <method name="encode([Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="isCanonical(Ljava/lang/String;)Z" since="24"/>
+ <field name="ANIMAL_WILDLIFE"/>
+ <field name="ARTS" since="22"/>
+ <field name="COMEDY"/>
+ <field name="DRAMA"/>
+ <field name="EDUCATION"/>
+ <field name="ENTERTAINMENT" since="22"/>
+ <field name="FAMILY_KIDS"/>
+ <field name="GAMING"/>
+ <field name="LIFE_STYLE" since="22"/>
+ <field name="MOVIES"/>
+ <field name="MUSIC" since="22"/>
+ <field name="NEWS"/>
+ <field name="PREMIER" since="22"/>
+ <field name="SHOPPING"/>
+ <field name="SPORTS"/>
+ <field name="TECH_SCIENCE" since="22"/>
+ <field name="TRAVEL"/>
+ </class>
+ <class name="android/media/tv/TvContract$RecordedPrograms" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/media/tv/TvContract$BaseTvColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="COLUMN_AUDIO_LANGUAGE"/>
+ <field name="COLUMN_BROADCAST_GENRE"/>
+ <field name="COLUMN_CANONICAL_GENRE"/>
+ <field name="COLUMN_CHANNEL_ID"/>
+ <field name="COLUMN_CONTENT_RATING"/>
+ <field name="COLUMN_END_TIME_UTC_MILLIS"/>
+ <field name="COLUMN_EPISODE_DISPLAY_NUMBER"/>
+ <field name="COLUMN_EPISODE_TITLE"/>
+ <field name="COLUMN_INPUT_ID"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_DATA"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_FLAG1"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_FLAG2"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_FLAG3"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_FLAG4"/>
+ <field name="COLUMN_LONG_DESCRIPTION"/>
+ <field name="COLUMN_POSTER_ART_URI"/>
+ <field name="COLUMN_RECORDING_DATA_BYTES"/>
+ <field name="COLUMN_RECORDING_DATA_URI"/>
+ <field name="COLUMN_RECORDING_DURATION_MILLIS"/>
+ <field name="COLUMN_RECORDING_EXPIRE_TIME_UTC_MILLIS"/>
+ <field name="COLUMN_REVIEW_RATING" since="26"/>
+ <field name="COLUMN_REVIEW_RATING_STYLE" since="26"/>
+ <field name="COLUMN_SEARCHABLE"/>
+ <field name="COLUMN_SEASON_DISPLAY_NUMBER"/>
+ <field name="COLUMN_SEASON_TITLE"/>
+ <field name="COLUMN_SHORT_DESCRIPTION"/>
+ <field name="COLUMN_START_TIME_UTC_MILLIS"/>
+ <field name="COLUMN_THUMBNAIL_URI"/>
+ <field name="COLUMN_TITLE"/>
+ <field name="COLUMN_VERSION_NUMBER"/>
+ <field name="COLUMN_VIDEO_HEIGHT"/>
+ <field name="COLUMN_VIDEO_WIDTH"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="CONTENT_URI"/>
+ <field name="REVIEW_RATING_STYLE_PERCENTAGE" since="26"/>
+ <field name="REVIEW_RATING_STYLE_STARS" since="26"/>
+ <field name="REVIEW_RATING_STYLE_THUMBS_UP_DOWN" since="26"/>
+ </class>
+ <class name="android/media/tv/TvContract$WatchNextPrograms" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/media/tv/TvContract$BaseTvColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="ASPECT_RATIO_16_9"/>
+ <field name="ASPECT_RATIO_1_1"/>
+ <field name="ASPECT_RATIO_2_3"/>
+ <field name="ASPECT_RATIO_3_2"/>
+ <field name="ASPECT_RATIO_4_3"/>
+ <field name="AVAILABILITY_AVAILABLE"/>
+ <field name="AVAILABILITY_FREE_WITH_SUBSCRIPTION"/>
+ <field name="AVAILABILITY_PAID_CONTENT"/>
+ <field name="COLUMN_AUDIO_LANGUAGE"/>
+ <field name="COLUMN_AUTHOR"/>
+ <field name="COLUMN_AVAILABILITY"/>
+ <field name="COLUMN_BROWSABLE"/>
+ <field name="COLUMN_CANONICAL_GENRE"/>
+ <field name="COLUMN_CONTENT_ID"/>
+ <field name="COLUMN_CONTENT_RATING"/>
+ <field name="COLUMN_DURATION_MILLIS"/>
+ <field name="COLUMN_EPISODE_DISPLAY_NUMBER"/>
+ <field name="COLUMN_EPISODE_TITLE"/>
+ <field name="COLUMN_INTENT_URI"/>
+ <field name="COLUMN_INTERACTION_COUNT"/>
+ <field name="COLUMN_INTERACTION_TYPE"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_DATA"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_FLAG1"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_FLAG2"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_FLAG3"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_FLAG4"/>
+ <field name="COLUMN_INTERNAL_PROVIDER_ID"/>
+ <field name="COLUMN_ITEM_COUNT"/>
+ <field name="COLUMN_LAST_ENGAGEMENT_TIME_UTC_MILLIS"/>
+ <field name="COLUMN_LAST_PLAYBACK_POSITION_MILLIS"/>
+ <field name="COLUMN_LIVE"/>
+ <field name="COLUMN_LOGO_URI"/>
+ <field name="COLUMN_LONG_DESCRIPTION"/>
+ <field name="COLUMN_OFFER_PRICE"/>
+ <field name="COLUMN_POSTER_ART_ASPECT_RATIO"/>
+ <field name="COLUMN_POSTER_ART_URI"/>
+ <field name="COLUMN_PREVIEW_VIDEO_URI"/>
+ <field name="COLUMN_RELEASE_DATE"/>
+ <field name="COLUMN_REVIEW_RATING"/>
+ <field name="COLUMN_REVIEW_RATING_STYLE"/>
+ <field name="COLUMN_SEARCHABLE"/>
+ <field name="COLUMN_SEASON_DISPLAY_NUMBER"/>
+ <field name="COLUMN_SEASON_TITLE"/>
+ <field name="COLUMN_SHORT_DESCRIPTION"/>
+ <field name="COLUMN_STARTING_PRICE"/>
+ <field name="COLUMN_THUMBNAIL_ASPECT_RATIO"/>
+ <field name="COLUMN_THUMBNAIL_URI"/>
+ <field name="COLUMN_TITLE"/>
+ <field name="COLUMN_TRANSIENT"/>
+ <field name="COLUMN_TYPE"/>
+ <field name="COLUMN_VERSION_NUMBER"/>
+ <field name="COLUMN_VIDEO_HEIGHT"/>
+ <field name="COLUMN_VIDEO_WIDTH"/>
+ <field name="COLUMN_WATCH_NEXT_TYPE"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="CONTENT_URI"/>
+ <field name="INTERACTION_TYPE_FANS"/>
+ <field name="INTERACTION_TYPE_FOLLOWERS"/>
+ <field name="INTERACTION_TYPE_LIKES"/>
+ <field name="INTERACTION_TYPE_LISTENS"/>
+ <field name="INTERACTION_TYPE_THUMBS"/>
+ <field name="INTERACTION_TYPE_VIEWERS"/>
+ <field name="INTERACTION_TYPE_VIEWS"/>
+ <field name="REVIEW_RATING_STYLE_PERCENTAGE"/>
+ <field name="REVIEW_RATING_STYLE_STARS"/>
+ <field name="REVIEW_RATING_STYLE_THUMBS_UP_DOWN"/>
+ <field name="TYPE_ALBUM"/>
+ <field name="TYPE_ARTIST"/>
+ <field name="TYPE_CHANNEL"/>
+ <field name="TYPE_CLIP"/>
+ <field name="TYPE_EVENT"/>
+ <field name="TYPE_MOVIE"/>
+ <field name="TYPE_PLAYLIST"/>
+ <field name="TYPE_STATION"/>
+ <field name="TYPE_TRACK"/>
+ <field name="TYPE_TV_EPISODE"/>
+ <field name="TYPE_TV_SEASON"/>
+ <field name="TYPE_TV_SERIES"/>
+ <field name="WATCH_NEXT_TYPE_CONTINUE"/>
+ <field name="WATCH_NEXT_TYPE_NEW"/>
+ <field name="WATCH_NEXT_TYPE_NEXT"/>
+ <field name="WATCH_NEXT_TYPE_WATCHLIST"/>
+ </class>
+ <class name="android/media/tv/TvInputInfo" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="canRecord()Z" since="24"/>
+ <method name="createSettingsIntent()Landroid/content/Intent;" deprecated="26"/>
+ <method name="createSetupIntent()Landroid/content/Intent;"/>
+ <method name="getExtras()Landroid/os/Bundle;" since="24"/>
+ <method name="getId()Ljava/lang/String;"/>
+ <method name="getParentId()Ljava/lang/String;"/>
+ <method name="getServiceInfo()Landroid/content/pm/ServiceInfo;"/>
+ <method name="getTunerCount()I" since="24"/>
+ <method name="getType()I"/>
+ <method name="isHidden(Landroid/content/Context;)Z" since="24"/>
+ <method name="isPassthroughInput()Z"/>
+ <method name="loadCustomLabel(Landroid/content/Context;)Ljava/lang/CharSequence;" since="24"/>
+ <method name="loadIcon(Landroid/content/Context;)Landroid/graphics/drawable/Drawable;"/>
+ <method name="loadLabel(Landroid/content/Context;)Ljava/lang/CharSequence;"/>
+ <field name="CREATOR"/>
+ <field name="EXTRA_INPUT_ID"/>
+ <field name="TYPE_COMPONENT"/>
+ <field name="TYPE_COMPOSITE"/>
+ <field name="TYPE_DISPLAY_PORT"/>
+ <field name="TYPE_DVI"/>
+ <field name="TYPE_HDMI"/>
+ <field name="TYPE_OTHER"/>
+ <field name="TYPE_SCART"/>
+ <field name="TYPE_SVIDEO"/>
+ <field name="TYPE_TUNER"/>
+ <field name="TYPE_VGA"/>
+ </class>
+ <class name="android/media/tv/TvInputInfo$Builder" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/content/ComponentName;)V"/>
+ <method name="build()Landroid/media/tv/TvInputInfo;"/>
+ <method name="setCanRecord(Z)Landroid/media/tv/TvInputInfo$Builder;"/>
+ <method name="setExtras(Landroid/os/Bundle;)Landroid/media/tv/TvInputInfo$Builder;"/>
+ <method name="setTunerCount(I)Landroid/media/tv/TvInputInfo$Builder;"/>
+ </class>
+ <class name="android/media/tv/TvInputManager" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getInputState(Ljava/lang/String;)I"/>
+ <method name="getTvInputInfo(Ljava/lang/String;)Landroid/media/tv/TvInputInfo;"/>
+ <method name="getTvInputList()Ljava/util/List;"/>
+ <method name="isParentalControlsEnabled()Z"/>
+ <method name="isRatingBlocked(Landroid/media/tv/TvContentRating;)Z"/>
+ <method name="registerCallback(Landroid/media/tv/TvInputManager$TvInputCallback;Landroid/os/Handler;)V"/>
+ <method name="unregisterCallback(Landroid/media/tv/TvInputManager$TvInputCallback;)V"/>
+ <method name="updateTvInputInfo(Landroid/media/tv/TvInputInfo;)V" since="24"/>
+ <field name="ACTION_BLOCKED_RATINGS_CHANGED"/>
+ <field name="ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED"/>
+ <field name="ACTION_QUERY_CONTENT_RATING_SYSTEMS"/>
+ <field name="ACTION_SETUP_INPUTS" since="24"/>
+ <field name="ACTION_VIEW_RECORDING_SCHEDULES" since="26"/>
+ <field name="INPUT_STATE_CONNECTED"/>
+ <field name="INPUT_STATE_CONNECTED_STANDBY"/>
+ <field name="INPUT_STATE_DISCONNECTED"/>
+ <field name="META_DATA_CONTENT_RATING_SYSTEMS"/>
+ <field name="RECORDING_ERROR_INSUFFICIENT_SPACE" since="24"/>
+ <field name="RECORDING_ERROR_RESOURCE_BUSY" since="24"/>
+ <field name="RECORDING_ERROR_UNKNOWN" since="24"/>
+ <field name="TIME_SHIFT_INVALID_TIME" since="23"/>
+ <field name="TIME_SHIFT_STATUS_AVAILABLE" since="23"/>
+ <field name="TIME_SHIFT_STATUS_UNAVAILABLE" since="23"/>
+ <field name="TIME_SHIFT_STATUS_UNKNOWN" since="23"/>
+ <field name="TIME_SHIFT_STATUS_UNSUPPORTED" since="23"/>
+ <field name="VIDEO_UNAVAILABLE_REASON_AUDIO_ONLY" since="23"/>
+ <field name="VIDEO_UNAVAILABLE_REASON_BUFFERING"/>
+ <field name="VIDEO_UNAVAILABLE_REASON_TUNING"/>
+ <field name="VIDEO_UNAVAILABLE_REASON_UNKNOWN"/>
+ <field name="VIDEO_UNAVAILABLE_REASON_WEAK_SIGNAL"/>
+ </class>
+ <class name="android/media/tv/TvInputManager$TvInputCallback" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onInputAdded(Ljava/lang/String;)V"/>
+ <method name="onInputRemoved(Ljava/lang/String;)V"/>
+ <method name="onInputStateChanged(Ljava/lang/String;I)V"/>
+ <method name="onInputUpdated(Ljava/lang/String;)V" since="24"/>
+ <method name="onTvInputInfoUpdated(Landroid/media/tv/TvInputInfo;)V" since="24"/>
+ </class>
+ <class name="android/media/tv/TvInputService" since="21">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="onCreateRecordingSession(Ljava/lang/String;)Landroid/media/tv/TvInputService$RecordingSession;" since="24"/>
+ <method name="onCreateSession(Ljava/lang/String;)Landroid/media/tv/TvInputService$Session;"/>
+ <field name="SERVICE_INTERFACE"/>
+ <field name="SERVICE_META_DATA"/>
+ </class>
+ <class name="android/media/tv/TvInputService$HardwareSession" since="21">
+ <extends name="android/media/tv/TvInputService$Session"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="getHardwareInputId()Ljava/lang/String;"/>
+ <method name="onHardwareVideoAvailable()V"/>
+ <method name="onHardwareVideoUnavailable(I)V"/>
+ </class>
+ <class name="android/media/tv/TvInputService$RecordingSession" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="notifyError(I)V"/>
+ <method name="notifyRecordingStopped(Landroid/net/Uri;)V"/>
+ <method name="notifyTuned(Landroid/net/Uri;)V"/>
+ <method name="onAppPrivateCommand(Ljava/lang/String;Landroid/os/Bundle;)V"/>
+ <method name="onRelease()V"/>
+ <method name="onStartRecording(Landroid/net/Uri;)V"/>
+ <method name="onStopRecording()V"/>
+ <method name="onTune(Landroid/net/Uri;)V"/>
+ <method name="onTune(Landroid/net/Uri;Landroid/os/Bundle;)V"/>
+ </class>
+ <class name="android/media/tv/TvInputService$Session" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/view/KeyEvent$Callback"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="layoutSurface(IIII)V" since="23"/>
+ <method name="notifyChannelRetuned(Landroid/net/Uri;)V"/>
+ <method name="notifyContentAllowed()V"/>
+ <method name="notifyContentBlocked(Landroid/media/tv/TvContentRating;)V"/>
+ <method name="notifyTimeShiftStatusChanged(I)V" since="23"/>
+ <method name="notifyTrackSelected(ILjava/lang/String;)V"/>
+ <method name="notifyTracksChanged(Ljava/util/List;)V"/>
+ <method name="notifyVideoAvailable()V"/>
+ <method name="notifyVideoUnavailable(I)V"/>
+ <method name="onAppPrivateCommand(Ljava/lang/String;Landroid/os/Bundle;)V" since="24"/>
+ <method name="onCreateOverlayView()Landroid/view/View;"/>
+ <method name="onGenericMotionEvent(Landroid/view/MotionEvent;)Z"/>
+ <method name="onOverlayViewSizeChanged(II)V" since="23"/>
+ <method name="onRelease()V"/>
+ <method name="onSelectTrack(ILjava/lang/String;)Z"/>
+ <method name="onSetCaptionEnabled(Z)V"/>
+ <method name="onSetStreamVolume(F)V"/>
+ <method name="onSetSurface(Landroid/view/Surface;)Z"/>
+ <method name="onSurfaceChanged(III)V"/>
+ <method name="onTimeShiftGetCurrentPosition()J" since="23"/>
+ <method name="onTimeShiftGetStartPosition()J" since="23"/>
+ <method name="onTimeShiftPause()V" since="23"/>
+ <method name="onTimeShiftPlay(Landroid/net/Uri;)V" since="24"/>
+ <method name="onTimeShiftResume()V" since="23"/>
+ <method name="onTimeShiftSeekTo(J)V" since="23"/>
+ <method name="onTimeShiftSetPlaybackParams(Landroid/media/PlaybackParams;)V" since="23"/>
+ <method name="onTouchEvent(Landroid/view/MotionEvent;)Z"/>
+ <method name="onTrackballEvent(Landroid/view/MotionEvent;)Z"/>
+ <method name="onTune(Landroid/net/Uri;)Z"/>
+ <method name="onTune(Landroid/net/Uri;Landroid/os/Bundle;)Z" since="24"/>
+ <method name="onUnblockContent(Landroid/media/tv/TvContentRating;)V"/>
+ <method name="setOverlayViewEnabled(Z)V"/>
+ </class>
+ <class name="android/media/tv/TvRecordingClient" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;Ljava/lang/String;Landroid/media/tv/TvRecordingClient$RecordingCallback;Landroid/os/Handler;)V"/>
+ <method name="release()V"/>
+ <method name="sendAppPrivateCommand(Ljava/lang/String;Landroid/os/Bundle;)V"/>
+ <method name="startRecording(Landroid/net/Uri;)V"/>
+ <method name="stopRecording()V"/>
+ <method name="tune(Ljava/lang/String;Landroid/net/Uri;)V"/>
+ <method name="tune(Ljava/lang/String;Landroid/net/Uri;Landroid/os/Bundle;)V"/>
+ </class>
+ <class name="android/media/tv/TvRecordingClient$RecordingCallback" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onConnectionFailed(Ljava/lang/String;)V"/>
+ <method name="onDisconnected(Ljava/lang/String;)V"/>
+ <method name="onError(I)V"/>
+ <method name="onRecordingStopped(Landroid/net/Uri;)V"/>
+ <method name="onTuned(Landroid/net/Uri;)V"/>
+ </class>
+ <class name="android/media/tv/TvTrackInfo" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAudioChannelCount()I"/>
+ <method name="getAudioSampleRate()I"/>
+ <method name="getDescription()Ljava/lang/CharSequence;" since="23"/>
+ <method name="getExtra()Landroid/os/Bundle;"/>
+ <method name="getId()Ljava/lang/String;"/>
+ <method name="getLanguage()Ljava/lang/String;"/>
+ <method name="getType()I"/>
+ <method name="getVideoActiveFormatDescription()B" since="24"/>
+ <method name="getVideoFrameRate()F"/>
+ <method name="getVideoHeight()I"/>
+ <method name="getVideoPixelAspectRatio()F" since="23"/>
+ <method name="getVideoWidth()I"/>
+ <field name="CREATOR"/>
+ <field name="TYPE_AUDIO"/>
+ <field name="TYPE_SUBTITLE"/>
+ <field name="TYPE_VIDEO"/>
+ </class>
+ <class name="android/media/tv/TvTrackInfo$Builder" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(ILjava/lang/String;)V"/>
+ <method name="build()Landroid/media/tv/TvTrackInfo;"/>
+ <method name="setAudioChannelCount(I)Landroid/media/tv/TvTrackInfo$Builder;"/>
+ <method name="setAudioSampleRate(I)Landroid/media/tv/TvTrackInfo$Builder;"/>
+ <method name="setDescription(Ljava/lang/CharSequence;)Landroid/media/tv/TvTrackInfo$Builder;" since="23"/>
+ <method name="setExtra(Landroid/os/Bundle;)Landroid/media/tv/TvTrackInfo$Builder;"/>
+ <method name="setLanguage(Ljava/lang/String;)Landroid/media/tv/TvTrackInfo$Builder;"/>
+ <method name="setVideoActiveFormatDescription(B)Landroid/media/tv/TvTrackInfo$Builder;" since="24"/>
+ <method name="setVideoFrameRate(F)Landroid/media/tv/TvTrackInfo$Builder;"/>
+ <method name="setVideoHeight(I)Landroid/media/tv/TvTrackInfo$Builder;"/>
+ <method name="setVideoPixelAspectRatio(F)Landroid/media/tv/TvTrackInfo$Builder;" since="23"/>
+ <method name="setVideoWidth(I)Landroid/media/tv/TvTrackInfo$Builder;"/>
+ </class>
+ <class name="android/media/tv/TvView" since="21">
+ <extends name="android/view/ViewGroup"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="dispatchUnhandledInputEvent(Landroid/view/InputEvent;)Z"/>
+ <method name="getSelectedTrack(I)Ljava/lang/String;"/>
+ <method name="getTracks(I)Ljava/util/List;"/>
+ <method name="onUnhandledInputEvent(Landroid/view/InputEvent;)Z"/>
+ <method name="reset()V"/>
+ <method name="selectTrack(ILjava/lang/String;)V"/>
+ <method name="sendAppPrivateCommand(Ljava/lang/String;Landroid/os/Bundle;)V" since="24"/>
+ <method name="setCallback(Landroid/media/tv/TvView$TvInputCallback;)V"/>
+ <method name="setCaptionEnabled(Z)V"/>
+ <method name="setOnUnhandledInputEventListener(Landroid/media/tv/TvView$OnUnhandledInputEventListener;)V"/>
+ <method name="setStreamVolume(F)V"/>
+ <method name="setTimeShiftPositionCallback(Landroid/media/tv/TvView$TimeShiftPositionCallback;)V" since="23"/>
+ <method name="setZOrderMediaOverlay(Z)V" since="24"/>
+ <method name="setZOrderOnTop(Z)V" since="24"/>
+ <method name="timeShiftPause()V" since="23"/>
+ <method name="timeShiftPlay(Ljava/lang/String;Landroid/net/Uri;)V" since="24"/>
+ <method name="timeShiftResume()V" since="23"/>
+ <method name="timeShiftSeekTo(J)V" since="23"/>
+ <method name="timeShiftSetPlaybackParams(Landroid/media/PlaybackParams;)V" since="23"/>
+ <method name="tune(Ljava/lang/String;Landroid/net/Uri;)V"/>
+ <method name="tune(Ljava/lang/String;Landroid/net/Uri;Landroid/os/Bundle;)V" since="24"/>
+ </class>
+ <class name="android/media/tv/TvView$OnUnhandledInputEventListener" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="onUnhandledInputEvent(Landroid/view/InputEvent;)Z"/>
+ </class>
+ <class name="android/media/tv/TvView$TimeShiftPositionCallback" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onTimeShiftCurrentPositionChanged(Ljava/lang/String;J)V"/>
+ <method name="onTimeShiftStartPositionChanged(Ljava/lang/String;J)V"/>
+ </class>
+ <class name="android/media/tv/TvView$TvInputCallback" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onChannelRetuned(Ljava/lang/String;Landroid/net/Uri;)V"/>
+ <method name="onConnectionFailed(Ljava/lang/String;)V"/>
+ <method name="onContentAllowed(Ljava/lang/String;)V"/>
+ <method name="onContentBlocked(Ljava/lang/String;Landroid/media/tv/TvContentRating;)V"/>
+ <method name="onDisconnected(Ljava/lang/String;)V"/>
+ <method name="onTimeShiftStatusChanged(Ljava/lang/String;I)V" since="23"/>
+ <method name="onTrackSelected(Ljava/lang/String;ILjava/lang/String;)V"/>
+ <method name="onTracksChanged(Ljava/lang/String;Ljava/util/List;)V"/>
+ <method name="onVideoAvailable(Ljava/lang/String;)V"/>
+ <method name="onVideoSizeChanged(Ljava/lang/String;II)V"/>
+ <method name="onVideoUnavailable(Ljava/lang/String;I)V"/>
+ </class>
+ <class name="android/mtp/MtpConstants" since="12">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="isAbstractObject(I)Z"/>
+ <field name="ASSOCIATION_TYPE_GENERIC_FOLDER"/>
+ <field name="FORMAT_3GP_CONTAINER"/>
+ <field name="FORMAT_AAC"/>
+ <field name="FORMAT_ABSTRACT_AUDIO_ALBUM"/>
+ <field name="FORMAT_ABSTRACT_AUDIO_PLAYLIST"/>
+ <field name="FORMAT_ABSTRACT_AV_PLAYLIST"/>
+ <field name="FORMAT_ABSTRACT_DOCUMENT"/>
+ <field name="FORMAT_ABSTRACT_IMAGE_ALBUM"/>
+ <field name="FORMAT_ABSTRACT_MEDIACAST"/>
+ <field name="FORMAT_ABSTRACT_MULTIMEDIA_ALBUM"/>
+ <field name="FORMAT_ABSTRACT_VIDEO_ALBUM"/>
+ <field name="FORMAT_ABSTRACT_VIDEO_PLAYLIST"/>
+ <field name="FORMAT_AIFF"/>
+ <field name="FORMAT_ASF"/>
+ <field name="FORMAT_ASSOCIATION"/>
+ <field name="FORMAT_ASX_PLAYLIST"/>
+ <field name="FORMAT_AUDIBLE"/>
+ <field name="FORMAT_AVI"/>
+ <field name="FORMAT_BMP"/>
+ <field name="FORMAT_DEFINED" since="24"/>
+ <field name="FORMAT_DNG" since="24"/>
+ <field name="FORMAT_DPOF"/>
+ <field name="FORMAT_EXECUTABLE"/>
+ <field name="FORMAT_EXIF_JPEG"/>
+ <field name="FORMAT_FLAC"/>
+ <field name="FORMAT_GIF"/>
+ <field name="FORMAT_HTML"/>
+ <field name="FORMAT_JFIF"/>
+ <field name="FORMAT_JP2"/>
+ <field name="FORMAT_JPX"/>
+ <field name="FORMAT_M3U_PLAYLIST"/>
+ <field name="FORMAT_MP2"/>
+ <field name="FORMAT_MP3"/>
+ <field name="FORMAT_MP4_CONTAINER"/>
+ <field name="FORMAT_MPEG"/>
+ <field name="FORMAT_MPL_PLAYLIST"/>
+ <field name="FORMAT_MS_EXCEL_SPREADSHEET"/>
+ <field name="FORMAT_MS_POWERPOINT_PRESENTATION"/>
+ <field name="FORMAT_MS_WORD_DOCUMENT"/>
+ <field name="FORMAT_OGG"/>
+ <field name="FORMAT_PICT"/>
+ <field name="FORMAT_PLS_PLAYLIST"/>
+ <field name="FORMAT_PNG"/>
+ <field name="FORMAT_SCRIPT"/>
+ <field name="FORMAT_TEXT"/>
+ <field name="FORMAT_TIFF"/>
+ <field name="FORMAT_TIFF_EP"/>
+ <field name="FORMAT_UNDEFINED"/>
+ <field name="FORMAT_UNDEFINED_AUDIO"/>
+ <field name="FORMAT_UNDEFINED_COLLECTION"/>
+ <field name="FORMAT_UNDEFINED_DOCUMENT"/>
+ <field name="FORMAT_UNDEFINED_FIRMWARE"/>
+ <field name="FORMAT_UNDEFINED_VIDEO"/>
+ <field name="FORMAT_WAV"/>
+ <field name="FORMAT_WINDOWS_IMAGE_FORMAT"/>
+ <field name="FORMAT_WMA"/>
+ <field name="FORMAT_WMV"/>
+ <field name="FORMAT_WPL_PLAYLIST"/>
+ <field name="FORMAT_XML_DOCUMENT"/>
+ <field name="OPERATION_CLOSE_SESSION" since="24"/>
+ <field name="OPERATION_COPY_OBJECT" since="24"/>
+ <field name="OPERATION_DELETE_OBJECT" since="24"/>
+ <field name="OPERATION_FORMAT_STORE" since="24"/>
+ <field name="OPERATION_GET_DEVICE_INFO" since="24"/>
+ <field name="OPERATION_GET_DEVICE_PROP_DESC" since="24"/>
+ <field name="OPERATION_GET_DEVICE_PROP_VALUE" since="24"/>
+ <field name="OPERATION_GET_NUM_OBJECTS" since="24"/>
+ <field name="OPERATION_GET_OBJECT" since="24"/>
+ <field name="OPERATION_GET_OBJECT_HANDLES" since="24"/>
+ <field name="OPERATION_GET_OBJECT_INFO" since="24"/>
+ <field name="OPERATION_GET_OBJECT_PROPS_SUPPORTED" since="24"/>
+ <field name="OPERATION_GET_OBJECT_PROP_DESC" since="24"/>
+ <field name="OPERATION_GET_OBJECT_PROP_VALUE" since="24"/>
+ <field name="OPERATION_GET_OBJECT_REFERENCES" since="24"/>
+ <field name="OPERATION_GET_PARTIAL_OBJECT" since="24"/>
+ <field name="OPERATION_GET_PARTIAL_OBJECT_64" since="24"/>
+ <field name="OPERATION_GET_STORAGE_INFO" since="24"/>
+ <field name="OPERATION_GET_STORAGE_I_DS" since="24"/>
+ <field name="OPERATION_GET_THUMB" since="24"/>
+ <field name="OPERATION_INITIATE_CAPTURE" since="24"/>
+ <field name="OPERATION_INITIATE_OPEN_CAPTURE" since="24"/>
+ <field name="OPERATION_MOVE_OBJECT" since="24"/>
+ <field name="OPERATION_OPEN_SESSION" since="24"/>
+ <field name="OPERATION_POWER_DOWN" since="24"/>
+ <field name="OPERATION_RESET_DEVICE" since="24"/>
+ <field name="OPERATION_RESET_DEVICE_PROP_VALUE" since="24"/>
+ <field name="OPERATION_SELF_TEST" since="24"/>
+ <field name="OPERATION_SEND_OBJECT" since="24"/>
+ <field name="OPERATION_SEND_OBJECT_INFO" since="24"/>
+ <field name="OPERATION_SET_DEVICE_PROP_VALUE" since="24"/>
+ <field name="OPERATION_SET_OBJECT_PROP_VALUE" since="24"/>
+ <field name="OPERATION_SET_OBJECT_PROTECTION" since="24"/>
+ <field name="OPERATION_SET_OBJECT_REFERENCES" since="24"/>
+ <field name="OPERATION_SKIP" since="24"/>
+ <field name="OPERATION_TERMINATE_OPEN_CAPTURE" since="24"/>
+ <field name="PROTECTION_STATUS_NONE"/>
+ <field name="PROTECTION_STATUS_NON_TRANSFERABLE_DATA"/>
+ <field name="PROTECTION_STATUS_READ_ONLY"/>
+ <field name="PROTECTION_STATUS_READ_ONLY_DATA"/>
+ </class>
+ <class name="android/mtp/MtpDevice" since="12">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/hardware/usb/UsbDevice;)V"/>
+ <method name="close()V"/>
+ <method name="deleteObject(I)Z"/>
+ <method name="getDeviceId()I"/>
+ <method name="getDeviceInfo()Landroid/mtp/MtpDeviceInfo;"/>
+ <method name="getDeviceName()Ljava/lang/String;"/>
+ <method name="getObject(II)[B"/>
+ <method name="getObjectHandles(III)[I"/>
+ <method name="getObjectInfo(I)Landroid/mtp/MtpObjectInfo;"/>
+ <method name="getParent(I)J"/>
+ <method name="getPartialObject(IJJ[B)J" since="24"/>
+ <method name="getPartialObject64(IJJ[B)J" since="24"/>
+ <method name="getStorageId(I)J"/>
+ <method name="getStorageIds()[I"/>
+ <method name="getStorageInfo(I)Landroid/mtp/MtpStorageInfo;"/>
+ <method name="getThumbnail(I)[B"/>
+ <method name="importFile(ILandroid/os/ParcelFileDescriptor;)Z" since="24"/>
+ <method name="importFile(ILjava/lang/String;)Z"/>
+ <method name="open(Landroid/hardware/usb/UsbDeviceConnection;)Z"/>
+ <method name="readEvent(Landroid/os/CancellationSignal;)Landroid/mtp/MtpEvent;" since="24"/>
+ <method name="sendObject(IJLandroid/os/ParcelFileDescriptor;)Z" since="24"/>
+ <method name="sendObjectInfo(Landroid/mtp/MtpObjectInfo;)Landroid/mtp/MtpObjectInfo;" since="24"/>
+ </class>
+ <class name="android/mtp/MtpDeviceInfo" since="12">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getEventsSupported()[I" since="24"/>
+ <method name="getManufacturer()Ljava/lang/String;"/>
+ <method name="getModel()Ljava/lang/String;"/>
+ <method name="getOperationsSupported()[I" since="24"/>
+ <method name="getSerialNumber()Ljava/lang/String;"/>
+ <method name="getVersion()Ljava/lang/String;"/>
+ <method name="isEventSupported(I)Z" since="24"/>
+ <method name="isOperationSupported(I)Z" since="24"/>
+ </class>
+ <class name="android/mtp/MtpEvent" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDevicePropCode()I"/>
+ <method name="getEventCode()I"/>
+ <method name="getObjectFormatCode()I"/>
+ <method name="getObjectHandle()I"/>
+ <method name="getObjectPropCode()I"/>
+ <method name="getParameter1()I"/>
+ <method name="getParameter2()I"/>
+ <method name="getParameter3()I"/>
+ <method name="getStorageId()I"/>
+ <method name="getTransactionId()I"/>
+ <field name="EVENT_CANCEL_TRANSACTION"/>
+ <field name="EVENT_CAPTURE_COMPLETE"/>
+ <field name="EVENT_DEVICE_INFO_CHANGED"/>
+ <field name="EVENT_DEVICE_PROP_CHANGED"/>
+ <field name="EVENT_DEVICE_RESET"/>
+ <field name="EVENT_OBJECT_ADDED"/>
+ <field name="EVENT_OBJECT_INFO_CHANGED"/>
+ <field name="EVENT_OBJECT_PROP_CHANGED"/>
+ <field name="EVENT_OBJECT_PROP_DESC_CHANGED"/>
+ <field name="EVENT_OBJECT_REFERENCES_CHANGED"/>
+ <field name="EVENT_OBJECT_REMOVED"/>
+ <field name="EVENT_REQUEST_OBJECT_TRANSFER"/>
+ <field name="EVENT_STORAGE_INFO_CHANGED"/>
+ <field name="EVENT_STORE_ADDED"/>
+ <field name="EVENT_STORE_FULL"/>
+ <field name="EVENT_STORE_REMOVED"/>
+ <field name="EVENT_UNDEFINED"/>
+ <field name="EVENT_UNREPORTED_STATUS"/>
+ </class>
+ <class name="android/mtp/MtpObjectInfo" since="12">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAssociationDesc()I"/>
+ <method name="getAssociationType()I"/>
+ <method name="getCompressedSize()I"/>
+ <method name="getCompressedSizeLong()J" since="24"/>
+ <method name="getDateCreated()J"/>
+ <method name="getDateModified()J"/>
+ <method name="getFormat()I"/>
+ <method name="getImagePixDepth()I"/>
+ <method name="getImagePixDepthLong()J" since="24"/>
+ <method name="getImagePixHeight()I"/>
+ <method name="getImagePixHeightLong()J" since="24"/>
+ <method name="getImagePixWidth()I"/>
+ <method name="getImagePixWidthLong()J" since="24"/>
+ <method name="getKeywords()Ljava/lang/String;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getObjectHandle()I"/>
+ <method name="getParent()I"/>
+ <method name="getProtectionStatus()I"/>
+ <method name="getSequenceNumber()I"/>
+ <method name="getSequenceNumberLong()J" since="24"/>
+ <method name="getStorageId()I"/>
+ <method name="getThumbCompressedSize()I"/>
+ <method name="getThumbCompressedSizeLong()J" since="24"/>
+ <method name="getThumbFormat()I"/>
+ <method name="getThumbPixHeight()I"/>
+ <method name="getThumbPixHeightLong()J" since="24"/>
+ <method name="getThumbPixWidth()I"/>
+ <method name="getThumbPixWidthLong()J" since="24"/>
+ </class>
+ <class name="android/mtp/MtpObjectInfo$Builder" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/mtp/MtpObjectInfo;)V"/>
+ <method name="build()Landroid/mtp/MtpObjectInfo;"/>
+ <method name="setAssociationDesc(I)Landroid/mtp/MtpObjectInfo$Builder;"/>
+ <method name="setAssociationType(I)Landroid/mtp/MtpObjectInfo$Builder;"/>
+ <method name="setCompressedSize(J)Landroid/mtp/MtpObjectInfo$Builder;"/>
+ <method name="setDateCreated(J)Landroid/mtp/MtpObjectInfo$Builder;"/>
+ <method name="setDateModified(J)Landroid/mtp/MtpObjectInfo$Builder;"/>
+ <method name="setFormat(I)Landroid/mtp/MtpObjectInfo$Builder;"/>
+ <method name="setImagePixDepth(J)Landroid/mtp/MtpObjectInfo$Builder;"/>
+ <method name="setImagePixHeight(J)Landroid/mtp/MtpObjectInfo$Builder;"/>
+ <method name="setImagePixWidth(J)Landroid/mtp/MtpObjectInfo$Builder;"/>
+ <method name="setKeywords(Ljava/lang/String;)Landroid/mtp/MtpObjectInfo$Builder;"/>
+ <method name="setName(Ljava/lang/String;)Landroid/mtp/MtpObjectInfo$Builder;"/>
+ <method name="setObjectHandle(I)Landroid/mtp/MtpObjectInfo$Builder;"/>
+ <method name="setParent(I)Landroid/mtp/MtpObjectInfo$Builder;"/>
+ <method name="setProtectionStatus(I)Landroid/mtp/MtpObjectInfo$Builder;"/>
+ <method name="setSequenceNumber(J)Landroid/mtp/MtpObjectInfo$Builder;"/>
+ <method name="setStorageId(I)Landroid/mtp/MtpObjectInfo$Builder;"/>
+ <method name="setThumbCompressedSize(J)Landroid/mtp/MtpObjectInfo$Builder;"/>
+ <method name="setThumbFormat(I)Landroid/mtp/MtpObjectInfo$Builder;"/>
+ <method name="setThumbPixHeight(J)Landroid/mtp/MtpObjectInfo$Builder;"/>
+ <method name="setThumbPixWidth(J)Landroid/mtp/MtpObjectInfo$Builder;"/>
+ </class>
+ <class name="android/mtp/MtpStorageInfo" since="12">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDescription()Ljava/lang/String;"/>
+ <method name="getFreeSpace()J"/>
+ <method name="getMaxCapacity()J"/>
+ <method name="getStorageId()I"/>
+ <method name="getVolumeIdentifier()Ljava/lang/String;"/>
+ </class>
+ <class name="android/net/CaptivePortal" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="ignoreNetwork()V"/>
+ <method name="reportCaptivePortalDismissed()V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/net/ConnectivityManager" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addDefaultNetworkActiveListener(Landroid/net/ConnectivityManager$OnNetworkActiveListener;)V" since="21"/>
+ <method name="bindProcessToNetwork(Landroid/net/Network;)Z" since="23"/>
+ <method name="getActiveNetwork()Landroid/net/Network;" since="23"/>
+ <method name="getActiveNetworkInfo()Landroid/net/NetworkInfo;"/>
+ <method name="getAllNetworkInfo()[Landroid/net/NetworkInfo;" deprecated="23"/>
+ <method name="getAllNetworks()[Landroid/net/Network;" since="21"/>
+ <method name="getBackgroundDataSetting()Z" since="3" deprecated="16"/>
+ <method name="getBoundNetworkForProcess()Landroid/net/Network;" since="23"/>
+ <method name="getDefaultProxy()Landroid/net/ProxyInfo;" since="23"/>
+ <method name="getLinkProperties(Landroid/net/Network;)Landroid/net/LinkProperties;" since="21"/>
+ <method name="getMultipathPreference(Landroid/net/Network;)I" since="26"/>
+ <method name="getNetworkCapabilities(Landroid/net/Network;)Landroid/net/NetworkCapabilities;" since="21"/>
+ <method name="getNetworkInfo(I)Landroid/net/NetworkInfo;" deprecated="23"/>
+ <method name="getNetworkInfo(Landroid/net/Network;)Landroid/net/NetworkInfo;" since="21"/>
+ <method name="getNetworkPreference()I" deprecated="21"/>
+ <method name="getProcessDefaultNetwork()Landroid/net/Network;" since="21" deprecated="23"/>
+ <method name="getRestrictBackgroundStatus()I" since="24"/>
+ <method name="isActiveNetworkMetered()Z" since="16"/>
+ <method name="isDefaultNetworkActive()Z" since="21"/>
+ <method name="isNetworkTypeValid(I)Z" deprecated="23"/>
+ <method name="registerDefaultNetworkCallback(Landroid/net/ConnectivityManager$NetworkCallback;)V" since="24"/>
+ <method name="registerDefaultNetworkCallback(Landroid/net/ConnectivityManager$NetworkCallback;Landroid/os/Handler;)V" since="26"/>
+ <method name="registerNetworkCallback(Landroid/net/NetworkRequest;Landroid/app/PendingIntent;)V" since="23"/>
+ <method name="registerNetworkCallback(Landroid/net/NetworkRequest;Landroid/net/ConnectivityManager$NetworkCallback;)V" since="21"/>
+ <method name="registerNetworkCallback(Landroid/net/NetworkRequest;Landroid/net/ConnectivityManager$NetworkCallback;Landroid/os/Handler;)V" since="26"/>
+ <method name="releaseNetworkRequest(Landroid/app/PendingIntent;)V" since="22"/>
+ <method name="removeDefaultNetworkActiveListener(Landroid/net/ConnectivityManager$OnNetworkActiveListener;)V" since="21"/>
+ <method name="reportBadNetwork(Landroid/net/Network;)V" since="21" deprecated="23"/>
+ <method name="reportNetworkConnectivity(Landroid/net/Network;Z)V" since="23"/>
+ <method name="requestBandwidthUpdate(Landroid/net/Network;)Z" since="23"/>
+ <method name="requestNetwork(Landroid/net/NetworkRequest;Landroid/app/PendingIntent;)V" since="22"/>
+ <method name="requestNetwork(Landroid/net/NetworkRequest;Landroid/net/ConnectivityManager$NetworkCallback;)V" since="21"/>
+ <method name="requestNetwork(Landroid/net/NetworkRequest;Landroid/net/ConnectivityManager$NetworkCallback;I)V" since="26"/>
+ <method name="requestNetwork(Landroid/net/NetworkRequest;Landroid/net/ConnectivityManager$NetworkCallback;Landroid/os/Handler;)V" since="26"/>
+ <method name="requestNetwork(Landroid/net/NetworkRequest;Landroid/net/ConnectivityManager$NetworkCallback;Landroid/os/Handler;I)V" since="26"/>
+ <method name="requestRouteToHost(II)Z" deprecated="21" removed="26"/>
+ <method name="setNetworkPreference(I)V" deprecated="21"/>
+ <method name="setProcessDefaultNetwork(Landroid/net/Network;)Z" since="21" deprecated="23"/>
+ <method name="startUsingNetworkFeature(ILjava/lang/String;)I" deprecated="21" removed="26"/>
+ <method name="stopUsingNetworkFeature(ILjava/lang/String;)I" deprecated="21" removed="26"/>
+ <method name="unregisterNetworkCallback(Landroid/app/PendingIntent;)V" since="23"/>
+ <method name="unregisterNetworkCallback(Landroid/net/ConnectivityManager$NetworkCallback;)V" since="21"/>
+ <field name="ACTION_BACKGROUND_DATA_SETTING_CHANGED" since="3" deprecated="16"/>
+ <field name="ACTION_CAPTIVE_PORTAL_SIGN_IN" since="23"/>
+ <field name="ACTION_RESTRICT_BACKGROUND_CHANGED" since="24"/>
+ <field name="CONNECTIVITY_ACTION"/>
+ <field name="DEFAULT_NETWORK_PREFERENCE" deprecated="18"/>
+ <field name="EXTRA_CAPTIVE_PORTAL" since="23"/>
+ <field name="EXTRA_CAPTIVE_PORTAL_URL" since="24"/>
+ <field name="EXTRA_EXTRA_INFO"/>
+ <field name="EXTRA_IS_FAILOVER"/>
+ <field name="EXTRA_NETWORK" since="22"/>
+ <field name="EXTRA_NETWORK_INFO" deprecated="16"/>
+ <field name="EXTRA_NETWORK_REQUEST" since="22"/>
+ <field name="EXTRA_NETWORK_TYPE" since="17"/>
+ <field name="EXTRA_NO_CONNECTIVITY"/>
+ <field name="EXTRA_OTHER_NETWORK_INFO"/>
+ <field name="EXTRA_REASON"/>
+ <field name="MULTIPATH_PREFERENCE_HANDOVER" since="26"/>
+ <field name="MULTIPATH_PREFERENCE_PERFORMANCE" since="26"/>
+ <field name="MULTIPATH_PREFERENCE_RELIABILITY" since="26"/>
+ <field name="RESTRICT_BACKGROUND_STATUS_DISABLED" since="24"/>
+ <field name="RESTRICT_BACKGROUND_STATUS_ENABLED" since="24"/>
+ <field name="RESTRICT_BACKGROUND_STATUS_WHITELISTED" since="24"/>
+ <field name="TYPE_BLUETOOTH" since="13"/>
+ <field name="TYPE_DUMMY" since="14"/>
+ <field name="TYPE_ETHERNET" since="13"/>
+ <field name="TYPE_MOBILE"/>
+ <field name="TYPE_MOBILE_DUN" since="8"/>
+ <field name="TYPE_MOBILE_HIPRI" since="8" deprecated="23"/>
+ <field name="TYPE_MOBILE_MMS" since="8" deprecated="23"/>
+ <field name="TYPE_MOBILE_SUPL" since="8" deprecated="23"/>
+ <field name="TYPE_VPN" since="21"/>
+ <field name="TYPE_WIFI"/>
+ <field name="TYPE_WIMAX" since="8"/>
+ </class>
+ <class name="android/net/ConnectivityManager$NetworkCallback" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onAvailable(Landroid/net/Network;)V"/>
+ <method name="onCapabilitiesChanged(Landroid/net/Network;Landroid/net/NetworkCapabilities;)V"/>
+ <method name="onLinkPropertiesChanged(Landroid/net/Network;Landroid/net/LinkProperties;)V"/>
+ <method name="onLosing(Landroid/net/Network;I)V"/>
+ <method name="onLost(Landroid/net/Network;)V"/>
+ <method name="onUnavailable()V" since="26"/>
+ </class>
+ <class name="android/net/ConnectivityManager$OnNetworkActiveListener" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="onNetworkActive()V"/>
+ </class>
+ <class name="android/net/Credentials" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(III)V"/>
+ <method name="getGid()I"/>
+ <method name="getPid()I"/>
+ <method name="getUid()I"/>
+ </class>
+ <class name="android/net/DhcpInfo" since="1" deprecated="18">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <field name="dns1"/>
+ <field name="dns2"/>
+ <field name="gateway"/>
+ <field name="ipAddress"/>
+ <field name="leaseDuration"/>
+ <field name="netmask"/>
+ <field name="serverAddress"/>
+ </class>
+ <class name="android/net/IpPrefix" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="contains(Ljava/net/InetAddress;)Z" since="23"/>
+ <method name="getAddress()Ljava/net/InetAddress;"/>
+ <method name="getPrefixLength()I"/>
+ <method name="getRawAddress()[B"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/net/IpSecAlgorithm" since="27">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Ljava/lang/String;[B)V"/>
+ <method name="&lt;init>(Ljava/lang/String;[BI)V"/>
+ <method name="getKey()[B"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getTruncationLengthBits()I"/>
+ <field name="AUTH_CRYPT_AES_GCM"/>
+ <field name="AUTH_HMAC_MD5"/>
+ <field name="AUTH_HMAC_SHA1"/>
+ <field name="AUTH_HMAC_SHA256"/>
+ <field name="AUTH_HMAC_SHA384"/>
+ <field name="AUTH_HMAC_SHA512"/>
+ <field name="CREATOR"/>
+ <field name="CRYPT_AES_CBC"/>
+ </class>
+ <class name="android/net/IpSecManager" since="27">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="applyTransportModeTransform(Ljava/io/FileDescriptor;Landroid/net/IpSecTransform;)V"/>
+ <method name="openUdpEncapsulationSocket()Landroid/net/IpSecManager$UdpEncapsulationSocket;"/>
+ <method name="openUdpEncapsulationSocket(I)Landroid/net/IpSecManager$UdpEncapsulationSocket;"/>
+ <method name="removeTransportModeTransform(Ljava/io/FileDescriptor;Landroid/net/IpSecTransform;)V"/>
+ <method name="reserveSecurityParameterIndex(ILjava/net/InetAddress;)Landroid/net/IpSecManager$SecurityParameterIndex;"/>
+ <method name="reserveSecurityParameterIndex(ILjava/net/InetAddress;I)Landroid/net/IpSecManager$SecurityParameterIndex;"/>
+ <field name="INVALID_SECURITY_PARAMETER_INDEX"/>
+ </class>
+ <class name="android/net/IpSecManager$ResourceUnavailableException" since="27">
+ <extends name="android/util/AndroidException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/net/IpSecManager$SecurityParameterIndex" since="27">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getSpi()I"/>
+ </class>
+ <class name="android/net/IpSecManager$SpiUnavailableException" since="27">
+ <extends name="android/util/AndroidException"/>
+ <method name="&lt;init>()V"/>
+ <method name="getSpi()I"/>
+ </class>
+ <class name="android/net/IpSecManager$UdpEncapsulationSocket" since="27">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getPort()I"/>
+ <method name="getSocket()Ljava/io/FileDescriptor;"/>
+ </class>
+ <class name="android/net/IpSecTransform" since="27">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable"/>
+ <method name="&lt;init>()V"/>
+ <field name="DIRECTION_IN"/>
+ <field name="DIRECTION_OUT"/>
+ </class>
+ <class name="android/net/IpSecTransform$Builder" since="27">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="buildTransportModeTransform(Ljava/net/InetAddress;)Landroid/net/IpSecTransform;"/>
+ <method name="setAuthenticatedEncryption(ILandroid/net/IpSecAlgorithm;)Landroid/net/IpSecTransform$Builder;"/>
+ <method name="setAuthentication(ILandroid/net/IpSecAlgorithm;)Landroid/net/IpSecTransform$Builder;"/>
+ <method name="setEncryption(ILandroid/net/IpSecAlgorithm;)Landroid/net/IpSecTransform$Builder;"/>
+ <method name="setIpv4Encapsulation(Landroid/net/IpSecManager$UdpEncapsulationSocket;I)Landroid/net/IpSecTransform$Builder;"/>
+ <method name="setSpi(ILandroid/net/IpSecManager$SecurityParameterIndex;)Landroid/net/IpSecTransform$Builder;"/>
+ </class>
+ <class name="android/net/LinkAddress" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAddress()Ljava/net/InetAddress;"/>
+ <method name="getFlags()I"/>
+ <method name="getPrefixLength()I"/>
+ <method name="getScope()I"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/net/LinkProperties" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDnsServers()Ljava/util/List;"/>
+ <method name="getDomains()Ljava/lang/String;"/>
+ <method name="getHttpProxy()Landroid/net/ProxyInfo;"/>
+ <method name="getInterfaceName()Ljava/lang/String;"/>
+ <method name="getLinkAddresses()Ljava/util/List;"/>
+ <method name="getRoutes()Ljava/util/List;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/net/LocalServerSocket" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/io/FileDescriptor;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="accept()Landroid/net/LocalSocket;"/>
+ <method name="close()V"/>
+ <method name="getFileDescriptor()Ljava/io/FileDescriptor;"/>
+ <method name="getLocalSocketAddress()Landroid/net/LocalSocketAddress;"/>
+ </class>
+ <class name="android/net/LocalSocket" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable" since="17"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V" since="19"/>
+ <method name="bind(Landroid/net/LocalSocketAddress;)V"/>
+ <method name="close()V"/>
+ <method name="connect(Landroid/net/LocalSocketAddress;)V"/>
+ <method name="connect(Landroid/net/LocalSocketAddress;I)V"/>
+ <method name="getAncillaryFileDescriptors()[Ljava/io/FileDescriptor;"/>
+ <method name="getFileDescriptor()Ljava/io/FileDescriptor;"/>
+ <method name="getInputStream()Ljava/io/InputStream;"/>
+ <method name="getLocalSocketAddress()Landroid/net/LocalSocketAddress;"/>
+ <method name="getOutputStream()Ljava/io/OutputStream;"/>
+ <method name="getPeerCredentials()Landroid/net/Credentials;"/>
+ <method name="getReceiveBufferSize()I"/>
+ <method name="getRemoteSocketAddress()Landroid/net/LocalSocketAddress;"/>
+ <method name="getSendBufferSize()I"/>
+ <method name="getSoTimeout()I"/>
+ <method name="isBound()Z"/>
+ <method name="isClosed()Z"/>
+ <method name="isConnected()Z"/>
+ <method name="isInputShutdown()Z"/>
+ <method name="isOutputShutdown()Z"/>
+ <method name="setFileDescriptorsForSend([Ljava/io/FileDescriptor;)V"/>
+ <method name="setReceiveBufferSize(I)V"/>
+ <method name="setSendBufferSize(I)V"/>
+ <method name="setSoTimeout(I)V"/>
+ <method name="shutdownInput()V"/>
+ <method name="shutdownOutput()V"/>
+ <field name="SOCKET_DGRAM" since="19"/>
+ <field name="SOCKET_SEQPACKET" since="19"/>
+ <field name="SOCKET_STREAM" since="19"/>
+ </class>
+ <class name="android/net/LocalSocketAddress" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Landroid/net/LocalSocketAddress$Namespace;)V"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getNamespace()Landroid/net/LocalSocketAddress$Namespace;"/>
+ </class>
+ <class name="android/net/LocalSocketAddress$Namespace" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/net/LocalSocketAddress$Namespace;"/>
+ <method name="values()[Landroid/net/LocalSocketAddress$Namespace;"/>
+ <field name="ABSTRACT"/>
+ <field name="FILESYSTEM"/>
+ <field name="RESERVED"/>
+ </class>
+ <class name="android/net/MailTo" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getBody()Ljava/lang/String;"/>
+ <method name="getCc()Ljava/lang/String;"/>
+ <method name="getHeaders()Ljava/util/Map;"/>
+ <method name="getSubject()Ljava/lang/String;"/>
+ <method name="getTo()Ljava/lang/String;"/>
+ <method name="isMailTo(Ljava/lang/String;)Z"/>
+ <method name="parse(Ljava/lang/String;)Landroid/net/MailTo;"/>
+ <field name="MAILTO_SCHEME"/>
+ </class>
+ <class name="android/net/Network" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="bindSocket(Ljava/io/FileDescriptor;)V" since="23"/>
+ <method name="bindSocket(Ljava/net/DatagramSocket;)V" since="22"/>
+ <method name="bindSocket(Ljava/net/Socket;)V"/>
+ <method name="getAllByName(Ljava/lang/String;)[Ljava/net/InetAddress;"/>
+ <method name="getByName(Ljava/lang/String;)Ljava/net/InetAddress;"/>
+ <method name="getNetworkHandle()J" since="23"/>
+ <method name="getSocketFactory()Ljavax/net/SocketFactory;"/>
+ <method name="openConnection(Ljava/net/URL;)Ljava/net/URLConnection;"/>
+ <method name="openConnection(Ljava/net/URL;Ljava/net/Proxy;)Ljava/net/URLConnection;" since="23"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/net/NetworkCapabilities" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/net/NetworkCapabilities;)V"/>
+ <method name="getLinkDownstreamBandwidthKbps()I"/>
+ <method name="getLinkUpstreamBandwidthKbps()I"/>
+ <method name="hasCapability(I)Z"/>
+ <method name="hasTransport(I)Z"/>
+ <field name="CREATOR"/>
+ <field name="NET_CAPABILITY_CAPTIVE_PORTAL" since="23"/>
+ <field name="NET_CAPABILITY_CBS"/>
+ <field name="NET_CAPABILITY_DUN"/>
+ <field name="NET_CAPABILITY_EIMS"/>
+ <field name="NET_CAPABILITY_FOTA"/>
+ <field name="NET_CAPABILITY_IA"/>
+ <field name="NET_CAPABILITY_IMS"/>
+ <field name="NET_CAPABILITY_INTERNET"/>
+ <field name="NET_CAPABILITY_MMS"/>
+ <field name="NET_CAPABILITY_NOT_METERED"/>
+ <field name="NET_CAPABILITY_NOT_RESTRICTED"/>
+ <field name="NET_CAPABILITY_NOT_ROAMING" since="27"/>
+ <field name="NET_CAPABILITY_NOT_VPN"/>
+ <field name="NET_CAPABILITY_RCS"/>
+ <field name="NET_CAPABILITY_SUPL"/>
+ <field name="NET_CAPABILITY_TRUSTED"/>
+ <field name="NET_CAPABILITY_VALIDATED" since="23"/>
+ <field name="NET_CAPABILITY_WIFI_P2P"/>
+ <field name="NET_CAPABILITY_XCAP"/>
+ <field name="TRANSPORT_BLUETOOTH"/>
+ <field name="TRANSPORT_CELLULAR"/>
+ <field name="TRANSPORT_ETHERNET"/>
+ <field name="TRANSPORT_LOWPAN" since="27"/>
+ <field name="TRANSPORT_VPN"/>
+ <field name="TRANSPORT_WIFI"/>
+ <field name="TRANSPORT_WIFI_AWARE" since="26"/>
+ </class>
+ <class name="android/net/NetworkInfo" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V" since="3"/>
+ <method name="&lt;init>(I)V" removed="3"/>
+ <method name="getDetailedState()Landroid/net/NetworkInfo$DetailedState;"/>
+ <method name="getExtraInfo()Ljava/lang/String;"/>
+ <method name="getReason()Ljava/lang/String;"/>
+ <method name="getState()Landroid/net/NetworkInfo$State;"/>
+ <method name="getSubtype()I" since="3"/>
+ <method name="getSubtypeName()Ljava/lang/String;" since="3"/>
+ <method name="getType()I"/>
+ <method name="getTypeName()Ljava/lang/String;"/>
+ <method name="isAvailable()Z"/>
+ <method name="isConnected()Z"/>
+ <method name="isConnectedOrConnecting()Z"/>
+ <method name="isFailover()Z"/>
+ <method name="isRoaming()Z" since="3" deprecated="27"/>
+ <field name="CREATOR" since="24"/>
+ </class>
+ <class name="android/net/NetworkInfo$DetailedState" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/net/NetworkInfo$DetailedState;"/>
+ <method name="values()[Landroid/net/NetworkInfo$DetailedState;"/>
+ <field name="AUTHENTICATING"/>
+ <field name="BLOCKED" since="14"/>
+ <field name="CAPTIVE_PORTAL_CHECK" since="17"/>
+ <field name="CONNECTED"/>
+ <field name="CONNECTING"/>
+ <field name="DISCONNECTED"/>
+ <field name="DISCONNECTING"/>
+ <field name="FAILED"/>
+ <field name="IDLE"/>
+ <field name="OBTAINING_IPADDR"/>
+ <field name="SCANNING"/>
+ <field name="SUSPENDED"/>
+ <field name="VERIFYING_POOR_LINK" since="16"/>
+ </class>
+ <class name="android/net/NetworkInfo$State" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/net/NetworkInfo$State;"/>
+ <method name="values()[Landroid/net/NetworkInfo$State;"/>
+ <field name="CONNECTED"/>
+ <field name="CONNECTING"/>
+ <field name="DISCONNECTED"/>
+ <field name="DISCONNECTING"/>
+ <field name="SUSPENDED"/>
+ <field name="UNKNOWN"/>
+ </class>
+ <class name="android/net/NetworkRequest" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/net/NetworkRequest$Builder" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addCapability(I)Landroid/net/NetworkRequest$Builder;"/>
+ <method name="addTransportType(I)Landroid/net/NetworkRequest$Builder;"/>
+ <method name="build()Landroid/net/NetworkRequest;"/>
+ <method name="removeCapability(I)Landroid/net/NetworkRequest$Builder;"/>
+ <method name="removeTransportType(I)Landroid/net/NetworkRequest$Builder;"/>
+ <method name="setNetworkSpecifier(Landroid/net/NetworkSpecifier;)Landroid/net/NetworkRequest$Builder;" since="26"/>
+ <method name="setNetworkSpecifier(Ljava/lang/String;)Landroid/net/NetworkRequest$Builder;"/>
+ </class>
+ <class name="android/net/NetworkSpecifier" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/net/ParseException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <field name="response"/>
+ </class>
+ <class name="android/net/Proxy" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDefaultHost()Ljava/lang/String;" deprecated="16"/>
+ <method name="getDefaultPort()I" deprecated="16"/>
+ <method name="getHost(Landroid/content/Context;)Ljava/lang/String;" deprecated="16"/>
+ <method name="getPort(Landroid/content/Context;)I" deprecated="16"/>
+ <field name="EXTRA_PROXY_INFO" since="21" deprecated="23"/>
+ <field name="PROXY_CHANGE_ACTION"/>
+ </class>
+ <class name="android/net/ProxyInfo" since="21" deprecated="22">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="buildDirectProxy(Ljava/lang/String;I)Landroid/net/ProxyInfo;"/>
+ <method name="buildDirectProxy(Ljava/lang/String;ILjava/util/List;)Landroid/net/ProxyInfo;"/>
+ <method name="buildPacProxy(Landroid/net/Uri;)Landroid/net/ProxyInfo;"/>
+ <method name="getExclusionList()[Ljava/lang/String;"/>
+ <method name="getHost()Ljava/lang/String;"/>
+ <method name="getPacFileUrl()Landroid/net/Uri;"/>
+ <method name="getPort()I"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/net/PskKeyManager" since="21" removed="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="chooseClientKeyIdentity(Ljava/lang/String;Ljava/net/Socket;)Ljava/lang/String;"/>
+ <method name="chooseClientKeyIdentity(Ljava/lang/String;Ljavax/net/ssl/SSLEngine;)Ljava/lang/String;"/>
+ <method name="chooseServerKeyIdentityHint(Ljava/net/Socket;)Ljava/lang/String;"/>
+ <method name="chooseServerKeyIdentityHint(Ljavax/net/ssl/SSLEngine;)Ljava/lang/String;"/>
+ <method name="getKey(Ljava/lang/String;Ljava/lang/String;Ljava/net/Socket;)Ljavax/crypto/SecretKey;"/>
+ <method name="getKey(Ljava/lang/String;Ljava/lang/String;Ljavax/net/ssl/SSLEngine;)Ljavax/crypto/SecretKey;"/>
+ <field name="MAX_IDENTITY_HINT_LENGTH_BYTES"/>
+ <field name="MAX_IDENTITY_LENGTH_BYTES"/>
+ <field name="MAX_KEY_LENGTH_BYTES"/>
+ </class>
+ <class name="android/net/RouteInfo" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDestination()Landroid/net/IpPrefix;"/>
+ <method name="getGateway()Ljava/net/InetAddress;"/>
+ <method name="getInterface()Ljava/lang/String;"/>
+ <method name="isDefaultRoute()Z"/>
+ <method name="matches(Ljava/net/InetAddress;)Z"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/net/SSLCertificateSocketFactory" since="1">
+ <extends name="javax/net/ssl/SSLSocketFactory"/>
+ <method name="&lt;init>(I)V" deprecated="16"/>
+ <method name="getDefault(I)Ljavax/net/SocketFactory;"/>
+ <method name="getDefault(ILandroid/net/SSLSessionCache;)Ljavax/net/ssl/SSLSocketFactory;" since="8"/>
+ <method name="getHttpSocketFactory(ILandroid/net/SSLSessionCache;)Lorg/apache/http/conn/ssl/SSLSocketFactory;" since="8" deprecated="22" removed="23"/>
+ <method name="getInsecure(ILandroid/net/SSLSessionCache;)Ljavax/net/ssl/SSLSocketFactory;" since="8"/>
+ <method name="getNpnSelectedProtocol(Ljava/net/Socket;)[B" since="16"/>
+ <method name="setHostname(Ljava/net/Socket;Ljava/lang/String;)V" since="17"/>
+ <method name="setKeyManagers([Ljavax/net/ssl/KeyManager;)V" since="14"/>
+ <method name="setNpnProtocols([[B)V" since="16"/>
+ <method name="setTrustManagers([Ljavax/net/ssl/TrustManager;)V" since="14"/>
+ <method name="setUseSessionTickets(Ljava/net/Socket;Z)V" since="17"/>
+ </class>
+ <class name="android/net/SSLSessionCache" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Ljava/io/File;)V"/>
+ </class>
+ <class name="android/net/TrafficStats" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="clearThreadStatsTag()V" since="14"/>
+ <method name="getAndSetThreadStatsTag(I)I" since="26"/>
+ <method name="getMobileRxBytes()J"/>
+ <method name="getMobileRxPackets()J"/>
+ <method name="getMobileTxBytes()J"/>
+ <method name="getMobileTxPackets()J"/>
+ <method name="getThreadStatsTag()I" since="14"/>
+ <method name="getTotalRxBytes()J"/>
+ <method name="getTotalRxPackets()J"/>
+ <method name="getTotalTxBytes()J"/>
+ <method name="getTotalTxPackets()J"/>
+ <method name="getUidRxBytes(I)J"/>
+ <method name="getUidRxPackets(I)J" since="12"/>
+ <method name="getUidTcpRxBytes(I)J" since="12" deprecated="18"/>
+ <method name="getUidTcpRxSegments(I)J" since="12" deprecated="18"/>
+ <method name="getUidTcpTxBytes(I)J" since="12" deprecated="18"/>
+ <method name="getUidTcpTxSegments(I)J" since="12" deprecated="18"/>
+ <method name="getUidTxBytes(I)J"/>
+ <method name="getUidTxPackets(I)J" since="12"/>
+ <method name="getUidUdpRxBytes(I)J" since="12" deprecated="18"/>
+ <method name="getUidUdpRxPackets(I)J" since="12" deprecated="18"/>
+ <method name="getUidUdpTxBytes(I)J" since="12" deprecated="18"/>
+ <method name="getUidUdpTxPackets(I)J" since="12" deprecated="18"/>
+ <method name="incrementOperationCount(I)V" since="14"/>
+ <method name="incrementOperationCount(II)V" since="14"/>
+ <method name="setThreadStatsTag(I)V" since="14"/>
+ <method name="tagDatagramSocket(Ljava/net/DatagramSocket;)V" since="24"/>
+ <method name="tagSocket(Ljava/net/Socket;)V" since="14"/>
+ <method name="untagDatagramSocket(Ljava/net/DatagramSocket;)V" since="24"/>
+ <method name="untagSocket(Ljava/net/Socket;)V" since="14"/>
+ <field name="UNSUPPORTED"/>
+ </class>
+ <class name="android/net/Uri" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>()V"/>
+ <method name="buildUpon()Landroid/net/Uri$Builder;"/>
+ <method name="compareTo(Landroid/net/Uri;)I"/>
+ <method name="decode(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="encode(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="encode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="fromFile(Ljava/io/File;)Landroid/net/Uri;"/>
+ <method name="fromParts(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;"/>
+ <method name="getAuthority()Ljava/lang/String;"/>
+ <method name="getBooleanQueryParameter(Ljava/lang/String;Z)Z" since="11"/>
+ <method name="getEncodedAuthority()Ljava/lang/String;"/>
+ <method name="getEncodedFragment()Ljava/lang/String;"/>
+ <method name="getEncodedPath()Ljava/lang/String;"/>
+ <method name="getEncodedQuery()Ljava/lang/String;"/>
+ <method name="getEncodedSchemeSpecificPart()Ljava/lang/String;"/>
+ <method name="getEncodedUserInfo()Ljava/lang/String;"/>
+ <method name="getFragment()Ljava/lang/String;"/>
+ <method name="getHost()Ljava/lang/String;"/>
+ <method name="getLastPathSegment()Ljava/lang/String;"/>
+ <method name="getPath()Ljava/lang/String;"/>
+ <method name="getPathSegments()Ljava/util/List;"/>
+ <method name="getPort()I"/>
+ <method name="getQuery()Ljava/lang/String;"/>
+ <method name="getQueryParameter(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getQueryParameterNames()Ljava/util/Set;" since="11"/>
+ <method name="getQueryParameters(Ljava/lang/String;)Ljava/util/List;"/>
+ <method name="getScheme()Ljava/lang/String;"/>
+ <method name="getSchemeSpecificPart()Ljava/lang/String;"/>
+ <method name="getUserInfo()Ljava/lang/String;"/>
+ <method name="isAbsolute()Z"/>
+ <method name="isHierarchical()Z"/>
+ <method name="isOpaque()Z"/>
+ <method name="isRelative()Z"/>
+ <method name="normalizeScheme()Landroid/net/Uri;" since="16"/>
+ <method name="parse(Ljava/lang/String;)Landroid/net/Uri;"/>
+ <method name="withAppendedPath(Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;"/>
+ <method name="writeToParcel(Landroid/os/Parcel;Landroid/net/Uri;)V"/>
+ <field name="CREATOR"/>
+ <field name="EMPTY"/>
+ </class>
+ <class name="android/net/Uri$Builder" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="appendEncodedPath(Ljava/lang/String;)Landroid/net/Uri$Builder;"/>
+ <method name="appendPath(Ljava/lang/String;)Landroid/net/Uri$Builder;"/>
+ <method name="appendQueryParameter(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri$Builder;"/>
+ <method name="authority(Ljava/lang/String;)Landroid/net/Uri$Builder;"/>
+ <method name="build()Landroid/net/Uri;"/>
+ <method name="clearQuery()Landroid/net/Uri$Builder;" since="11"/>
+ <method name="encodedAuthority(Ljava/lang/String;)Landroid/net/Uri$Builder;"/>
+ <method name="encodedFragment(Ljava/lang/String;)Landroid/net/Uri$Builder;"/>
+ <method name="encodedOpaquePart(Ljava/lang/String;)Landroid/net/Uri$Builder;"/>
+ <method name="encodedPath(Ljava/lang/String;)Landroid/net/Uri$Builder;"/>
+ <method name="encodedQuery(Ljava/lang/String;)Landroid/net/Uri$Builder;"/>
+ <method name="fragment(Ljava/lang/String;)Landroid/net/Uri$Builder;"/>
+ <method name="opaquePart(Ljava/lang/String;)Landroid/net/Uri$Builder;"/>
+ <method name="path(Ljava/lang/String;)Landroid/net/Uri$Builder;"/>
+ <method name="query(Ljava/lang/String;)Landroid/net/Uri$Builder;"/>
+ <method name="scheme(Ljava/lang/String;)Landroid/net/Uri$Builder;"/>
+ </class>
+ <class name="android/net/UrlQuerySanitizer" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="addSanitizedEntry(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="clear()V"/>
+ <method name="decodeHexDigit(C)I"/>
+ <method name="getAllButNulAndAngleBracketsLegal()Landroid/net/UrlQuerySanitizer$ValueSanitizer;"/>
+ <method name="getAllButNulLegal()Landroid/net/UrlQuerySanitizer$ValueSanitizer;"/>
+ <method name="getAllButWhitespaceLegal()Landroid/net/UrlQuerySanitizer$ValueSanitizer;"/>
+ <method name="getAllIllegal()Landroid/net/UrlQuerySanitizer$ValueSanitizer;"/>
+ <method name="getAllowUnregisteredParamaters()Z"/>
+ <method name="getAmpAndSpaceLegal()Landroid/net/UrlQuerySanitizer$ValueSanitizer;"/>
+ <method name="getAmpLegal()Landroid/net/UrlQuerySanitizer$ValueSanitizer;"/>
+ <method name="getEffectiveValueSanitizer(Ljava/lang/String;)Landroid/net/UrlQuerySanitizer$ValueSanitizer;"/>
+ <method name="getParameterList()Ljava/util/List;"/>
+ <method name="getParameterSet()Ljava/util/Set;"/>
+ <method name="getPreferFirstRepeatedParameter()Z"/>
+ <method name="getSpaceLegal()Landroid/net/UrlQuerySanitizer$ValueSanitizer;"/>
+ <method name="getUnregisteredParameterValueSanitizer()Landroid/net/UrlQuerySanitizer$ValueSanitizer;"/>
+ <method name="getUrlAndSpaceLegal()Landroid/net/UrlQuerySanitizer$ValueSanitizer;"/>
+ <method name="getUrlLegal()Landroid/net/UrlQuerySanitizer$ValueSanitizer;"/>
+ <method name="getValue(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getValueSanitizer(Ljava/lang/String;)Landroid/net/UrlQuerySanitizer$ValueSanitizer;"/>
+ <method name="hasParameter(Ljava/lang/String;)Z"/>
+ <method name="isHexDigit(C)Z"/>
+ <method name="parseEntry(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="parseQuery(Ljava/lang/String;)V"/>
+ <method name="parseUrl(Ljava/lang/String;)V"/>
+ <method name="registerParameter(Ljava/lang/String;Landroid/net/UrlQuerySanitizer$ValueSanitizer;)V"/>
+ <method name="registerParameters([Ljava/lang/String;Landroid/net/UrlQuerySanitizer$ValueSanitizer;)V"/>
+ <method name="setAllowUnregisteredParamaters(Z)V"/>
+ <method name="setPreferFirstRepeatedParameter(Z)V"/>
+ <method name="setUnregisteredParameterValueSanitizer(Landroid/net/UrlQuerySanitizer$ValueSanitizer;)V"/>
+ <method name="unescape(Ljava/lang/String;)Ljava/lang/String;"/>
+ </class>
+ <class name="android/net/UrlQuerySanitizer$IllegalCharacterValueSanitizer" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/net/UrlQuerySanitizer$ValueSanitizer"/>
+ <method name="&lt;init>(I)V"/>
+ <field name="ALL_BUT_NUL_AND_ANGLE_BRACKETS_LEGAL"/>
+ <field name="ALL_BUT_NUL_LEGAL"/>
+ <field name="ALL_BUT_WHITESPACE_LEGAL"/>
+ <field name="ALL_ILLEGAL"/>
+ <field name="ALL_OK"/>
+ <field name="ALL_WHITESPACE_OK"/>
+ <field name="AMP_AND_SPACE_LEGAL"/>
+ <field name="AMP_LEGAL"/>
+ <field name="AMP_OK"/>
+ <field name="DQUOTE_OK"/>
+ <field name="GT_OK"/>
+ <field name="LT_OK"/>
+ <field name="NON_7_BIT_ASCII_OK"/>
+ <field name="NUL_OK"/>
+ <field name="OTHER_WHITESPACE_OK"/>
+ <field name="PCT_OK"/>
+ <field name="SCRIPT_URL_OK"/>
+ <field name="SPACE_LEGAL"/>
+ <field name="SPACE_OK"/>
+ <field name="SQUOTE_OK"/>
+ <field name="URL_AND_SPACE_LEGAL"/>
+ <field name="URL_LEGAL"/>
+ </class>
+ <class name="android/net/UrlQuerySanitizer$ParameterValuePair" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/net/UrlQuerySanitizer;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <field name="mParameter"/>
+ <field name="mValue"/>
+ </class>
+ <class name="android/net/UrlQuerySanitizer$ValueSanitizer" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="sanitize(Ljava/lang/String;)Ljava/lang/String;"/>
+ </class>
+ <class name="android/net/VpnService" since="14">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="onRevoke()V"/>
+ <method name="prepare(Landroid/content/Context;)Landroid/content/Intent;"/>
+ <method name="protect(I)Z"/>
+ <method name="protect(Ljava/net/DatagramSocket;)Z"/>
+ <method name="protect(Ljava/net/Socket;)Z"/>
+ <method name="setUnderlyingNetworks([Landroid/net/Network;)Z" since="22"/>
+ <field name="SERVICE_INTERFACE"/>
+ <field name="SERVICE_META_DATA_SUPPORTS_ALWAYS_ON" since="27"/>
+ </class>
+ <class name="android/net/VpnService$Builder" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/net/VpnService;)V"/>
+ <method name="addAddress(Ljava/lang/String;I)Landroid/net/VpnService$Builder;"/>
+ <method name="addAddress(Ljava/net/InetAddress;I)Landroid/net/VpnService$Builder;"/>
+ <method name="addAllowedApplication(Ljava/lang/String;)Landroid/net/VpnService$Builder;" since="21"/>
+ <method name="addDisallowedApplication(Ljava/lang/String;)Landroid/net/VpnService$Builder;" since="21"/>
+ <method name="addDnsServer(Ljava/lang/String;)Landroid/net/VpnService$Builder;"/>
+ <method name="addDnsServer(Ljava/net/InetAddress;)Landroid/net/VpnService$Builder;"/>
+ <method name="addRoute(Ljava/lang/String;I)Landroid/net/VpnService$Builder;"/>
+ <method name="addRoute(Ljava/net/InetAddress;I)Landroid/net/VpnService$Builder;"/>
+ <method name="addSearchDomain(Ljava/lang/String;)Landroid/net/VpnService$Builder;"/>
+ <method name="allowBypass()Landroid/net/VpnService$Builder;" since="21"/>
+ <method name="allowFamily(I)Landroid/net/VpnService$Builder;" since="21"/>
+ <method name="establish()Landroid/os/ParcelFileDescriptor;"/>
+ <method name="setBlocking(Z)Landroid/net/VpnService$Builder;" since="21"/>
+ <method name="setConfigureIntent(Landroid/app/PendingIntent;)Landroid/net/VpnService$Builder;"/>
+ <method name="setMtu(I)Landroid/net/VpnService$Builder;"/>
+ <method name="setSession(Ljava/lang/String;)Landroid/net/VpnService$Builder;"/>
+ <method name="setUnderlyingNetworks([Landroid/net/Network;)Landroid/net/VpnService$Builder;" since="22"/>
+ </class>
+ <class name="android/net/http/AndroidHttpClient" since="8" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/client/HttpClient"/>
+ <method name="&lt;init>()V"/>
+ <method name="close()V"/>
+ <method name="disableCurlLogging()V"/>
+ <method name="enableCurlLogging(Ljava/lang/String;I)V"/>
+ <method name="getCompressedEntity([BLandroid/content/ContentResolver;)Lorg/apache/http/entity/AbstractHttpEntity;"/>
+ <method name="getMinGzipSize(Landroid/content/ContentResolver;)J"/>
+ <method name="getUngzippedContent(Lorg/apache/http/HttpEntity;)Ljava/io/InputStream;"/>
+ <method name="modifyRequestToAcceptGzipResponse(Lorg/apache/http/HttpRequest;)V"/>
+ <method name="newInstance(Ljava/lang/String;)Landroid/net/http/AndroidHttpClient;" deprecated="22"/>
+ <method name="newInstance(Ljava/lang/String;Landroid/content/Context;)Landroid/net/http/AndroidHttpClient;" deprecated="22"/>
+ <method name="parseDate(Ljava/lang/String;)J"/>
+ <field name="DEFAULT_SYNC_MIN_GZIP_BYTES"/>
+ </class>
+ <class name="android/net/http/HttpResponseCache" since="14">
+ <extends name="java/net/ResponseCache"/>
+ <implements name="java/io/Closeable"/>
+ <method name="&lt;init>()V"/>
+ <method name="delete()V"/>
+ <method name="flush()V"/>
+ <method name="getHitCount()I"/>
+ <method name="getInstalled()Landroid/net/http/HttpResponseCache;"/>
+ <method name="getNetworkCount()I"/>
+ <method name="getRequestCount()I"/>
+ <method name="install(Ljava/io/File;J)Landroid/net/http/HttpResponseCache;"/>
+ <method name="maxSize()J"/>
+ <method name="size()J"/>
+ </class>
+ <class name="android/net/http/SslCertificate" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" deprecated="16"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/util/Date;Ljava/util/Date;)V" since="8" deprecated="16"/>
+ <method name="&lt;init>(Ljava/security/cert/X509Certificate;)V"/>
+ <method name="getIssuedBy()Landroid/net/http/SslCertificate$DName;"/>
+ <method name="getIssuedTo()Landroid/net/http/SslCertificate$DName;"/>
+ <method name="getValidNotAfter()Ljava/lang/String;" deprecated="16"/>
+ <method name="getValidNotAfterDate()Ljava/util/Date;" since="8"/>
+ <method name="getValidNotBefore()Ljava/lang/String;" deprecated="16"/>
+ <method name="getValidNotBeforeDate()Ljava/util/Date;" since="8"/>
+ <method name="restoreState(Landroid/os/Bundle;)Landroid/net/http/SslCertificate;"/>
+ <method name="saveState(Landroid/net/http/SslCertificate;)Landroid/os/Bundle;"/>
+ </class>
+ <class name="android/net/http/SslCertificate$DName" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/net/http/SslCertificate;Ljava/lang/String;)V"/>
+ <method name="getCName()Ljava/lang/String;"/>
+ <method name="getDName()Ljava/lang/String;"/>
+ <method name="getOName()Ljava/lang/String;"/>
+ <method name="getUName()Ljava/lang/String;"/>
+ </class>
+ <class name="android/net/http/SslError" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(ILandroid/net/http/SslCertificate;)V" deprecated="16"/>
+ <method name="&lt;init>(ILandroid/net/http/SslCertificate;Ljava/lang/String;)V" since="14"/>
+ <method name="&lt;init>(ILjava/security/cert/X509Certificate;)V" deprecated="16"/>
+ <method name="&lt;init>(ILjava/security/cert/X509Certificate;Ljava/lang/String;)V" since="14"/>
+ <method name="addError(I)Z"/>
+ <method name="getCertificate()Landroid/net/http/SslCertificate;"/>
+ <method name="getPrimaryError()I"/>
+ <method name="getUrl()Ljava/lang/String;" since="14"/>
+ <method name="hasError(I)Z"/>
+ <field name="SSL_DATE_INVALID" since="14"/>
+ <field name="SSL_EXPIRED"/>
+ <field name="SSL_IDMISMATCH"/>
+ <field name="SSL_INVALID" since="14"/>
+ <field name="SSL_MAX_ERROR" deprecated="16"/>
+ <field name="SSL_NOTYETVALID"/>
+ <field name="SSL_UNTRUSTED"/>
+ </class>
+ <class name="android/net/http/X509TrustManagerExtensions" since="17">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljavax/net/ssl/X509TrustManager;)V"/>
+ <method name="checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;"/>
+ <method name="isUserAddedCertificate(Ljava/security/cert/X509Certificate;)Z" since="21"/>
+ </class>
+ <class name="android/net/nsd/NsdManager" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="discoverServices(Ljava/lang/String;ILandroid/net/nsd/NsdManager$DiscoveryListener;)V"/>
+ <method name="registerService(Landroid/net/nsd/NsdServiceInfo;ILandroid/net/nsd/NsdManager$RegistrationListener;)V"/>
+ <method name="resolveService(Landroid/net/nsd/NsdServiceInfo;Landroid/net/nsd/NsdManager$ResolveListener;)V"/>
+ <method name="stopServiceDiscovery(Landroid/net/nsd/NsdManager$DiscoveryListener;)V"/>
+ <method name="unregisterService(Landroid/net/nsd/NsdManager$RegistrationListener;)V"/>
+ <field name="ACTION_NSD_STATE_CHANGED"/>
+ <field name="EXTRA_NSD_STATE"/>
+ <field name="FAILURE_ALREADY_ACTIVE"/>
+ <field name="FAILURE_INTERNAL_ERROR"/>
+ <field name="FAILURE_MAX_LIMIT"/>
+ <field name="NSD_STATE_DISABLED"/>
+ <field name="NSD_STATE_ENABLED"/>
+ <field name="PROTOCOL_DNS_SD"/>
+ </class>
+ <class name="android/net/nsd/NsdManager$DiscoveryListener" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="onDiscoveryStarted(Ljava/lang/String;)V"/>
+ <method name="onDiscoveryStopped(Ljava/lang/String;)V"/>
+ <method name="onServiceFound(Landroid/net/nsd/NsdServiceInfo;)V"/>
+ <method name="onServiceLost(Landroid/net/nsd/NsdServiceInfo;)V"/>
+ <method name="onStartDiscoveryFailed(Ljava/lang/String;I)V"/>
+ <method name="onStopDiscoveryFailed(Ljava/lang/String;I)V"/>
+ </class>
+ <class name="android/net/nsd/NsdManager$RegistrationListener" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="onRegistrationFailed(Landroid/net/nsd/NsdServiceInfo;I)V"/>
+ <method name="onServiceRegistered(Landroid/net/nsd/NsdServiceInfo;)V"/>
+ <method name="onServiceUnregistered(Landroid/net/nsd/NsdServiceInfo;)V"/>
+ <method name="onUnregistrationFailed(Landroid/net/nsd/NsdServiceInfo;I)V"/>
+ </class>
+ <class name="android/net/nsd/NsdManager$ResolveListener" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="onResolveFailed(Landroid/net/nsd/NsdServiceInfo;I)V"/>
+ <method name="onServiceResolved(Landroid/net/nsd/NsdServiceInfo;)V"/>
+ </class>
+ <class name="android/net/nsd/NsdServiceInfo" since="16">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAttributes()Ljava/util/Map;" since="21"/>
+ <method name="getHost()Ljava/net/InetAddress;"/>
+ <method name="getPort()I"/>
+ <method name="getServiceName()Ljava/lang/String;"/>
+ <method name="getServiceType()Ljava/lang/String;"/>
+ <method name="removeAttribute(Ljava/lang/String;)V" since="21"/>
+ <method name="setAttribute(Ljava/lang/String;Ljava/lang/String;)V" since="21"/>
+ <method name="setHost(Ljava/net/InetAddress;)V"/>
+ <method name="setPort(I)V"/>
+ <method name="setServiceName(Ljava/lang/String;)V"/>
+ <method name="setServiceType(Ljava/lang/String;)V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/net/rtp/AudioCodec" since="12">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCodec(ILjava/lang/String;Ljava/lang/String;)Landroid/net/rtp/AudioCodec;"/>
+ <method name="getCodecs()[Landroid/net/rtp/AudioCodec;"/>
+ <field name="AMR"/>
+ <field name="GSM"/>
+ <field name="GSM_EFR"/>
+ <field name="PCMA"/>
+ <field name="PCMU"/>
+ <field name="fmtp"/>
+ <field name="rtpmap"/>
+ <field name="type"/>
+ </class>
+ <class name="android/net/rtp/AudioGroup" since="12">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="clear()V"/>
+ <method name="getMode()I"/>
+ <method name="getStreams()[Landroid/net/rtp/AudioStream;"/>
+ <method name="sendDtmf(I)V"/>
+ <method name="setMode(I)V"/>
+ <field name="MODE_ECHO_SUPPRESSION"/>
+ <field name="MODE_MUTED"/>
+ <field name="MODE_NORMAL"/>
+ <field name="MODE_ON_HOLD"/>
+ </class>
+ <class name="android/net/rtp/AudioStream" since="12">
+ <extends name="android/net/rtp/RtpStream"/>
+ <method name="&lt;init>(Ljava/net/InetAddress;)V"/>
+ <method name="getCodec()Landroid/net/rtp/AudioCodec;"/>
+ <method name="getDtmfType()I"/>
+ <method name="getGroup()Landroid/net/rtp/AudioGroup;"/>
+ <method name="join(Landroid/net/rtp/AudioGroup;)V"/>
+ <method name="setCodec(Landroid/net/rtp/AudioCodec;)V"/>
+ <method name="setDtmfType(I)V"/>
+ </class>
+ <class name="android/net/rtp/RtpStream" since="12">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="associate(Ljava/net/InetAddress;I)V"/>
+ <method name="getLocalAddress()Ljava/net/InetAddress;"/>
+ <method name="getLocalPort()I"/>
+ <method name="getMode()I"/>
+ <method name="getRemoteAddress()Ljava/net/InetAddress;"/>
+ <method name="getRemotePort()I"/>
+ <method name="isBusy()Z"/>
+ <method name="release()V"/>
+ <method name="setMode(I)V"/>
+ <field name="MODE_NORMAL"/>
+ <field name="MODE_RECEIVE_ONLY"/>
+ <field name="MODE_SEND_ONLY"/>
+ </class>
+ <class name="android/net/sip/SipAudioCall" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/net/sip/SipProfile;)V"/>
+ <method name="answerCall(I)V"/>
+ <method name="attachCall(Landroid/net/sip/SipSession;Ljava/lang/String;)V"/>
+ <method name="close()V"/>
+ <method name="continueCall(I)V"/>
+ <method name="endCall()V"/>
+ <method name="getLocalProfile()Landroid/net/sip/SipProfile;"/>
+ <method name="getPeerProfile()Landroid/net/sip/SipProfile;"/>
+ <method name="getState()I"/>
+ <method name="holdCall(I)V"/>
+ <method name="isInCall()Z"/>
+ <method name="isMuted()Z"/>
+ <method name="isOnHold()Z"/>
+ <method name="makeCall(Landroid/net/sip/SipProfile;Landroid/net/sip/SipSession;I)V"/>
+ <method name="sendDtmf(I)V"/>
+ <method name="sendDtmf(ILandroid/os/Message;)V"/>
+ <method name="setListener(Landroid/net/sip/SipAudioCall$Listener;)V"/>
+ <method name="setListener(Landroid/net/sip/SipAudioCall$Listener;Z)V"/>
+ <method name="setSpeakerMode(Z)V"/>
+ <method name="startAudio()V"/>
+ <method name="toggleMute()V"/>
+ </class>
+ <class name="android/net/sip/SipAudioCall$Listener" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onCallBusy(Landroid/net/sip/SipAudioCall;)V"/>
+ <method name="onCallEnded(Landroid/net/sip/SipAudioCall;)V"/>
+ <method name="onCallEstablished(Landroid/net/sip/SipAudioCall;)V"/>
+ <method name="onCallHeld(Landroid/net/sip/SipAudioCall;)V"/>
+ <method name="onCalling(Landroid/net/sip/SipAudioCall;)V"/>
+ <method name="onChanged(Landroid/net/sip/SipAudioCall;)V"/>
+ <method name="onError(Landroid/net/sip/SipAudioCall;ILjava/lang/String;)V"/>
+ <method name="onReadyToCall(Landroid/net/sip/SipAudioCall;)V"/>
+ <method name="onRinging(Landroid/net/sip/SipAudioCall;Landroid/net/sip/SipProfile;)V"/>
+ <method name="onRingingBack(Landroid/net/sip/SipAudioCall;)V"/>
+ </class>
+ <class name="android/net/sip/SipErrorCode" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="toString(I)Ljava/lang/String;"/>
+ <field name="CLIENT_ERROR"/>
+ <field name="CROSS_DOMAIN_AUTHENTICATION"/>
+ <field name="DATA_CONNECTION_LOST"/>
+ <field name="INVALID_CREDENTIALS"/>
+ <field name="INVALID_REMOTE_URI"/>
+ <field name="IN_PROGRESS"/>
+ <field name="NO_ERROR"/>
+ <field name="PEER_NOT_REACHABLE"/>
+ <field name="SERVER_ERROR"/>
+ <field name="SERVER_UNREACHABLE"/>
+ <field name="SOCKET_ERROR"/>
+ <field name="TIME_OUT"/>
+ <field name="TRANSACTION_TERMINTED"/>
+ </class>
+ <class name="android/net/sip/SipException" since="9">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="android/net/sip/SipManager" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="close(Ljava/lang/String;)V"/>
+ <method name="createSipSession(Landroid/net/sip/SipProfile;Landroid/net/sip/SipSession$Listener;)Landroid/net/sip/SipSession;"/>
+ <method name="getCallId(Landroid/content/Intent;)Ljava/lang/String;"/>
+ <method name="getOfferSessionDescription(Landroid/content/Intent;)Ljava/lang/String;"/>
+ <method name="getSessionFor(Landroid/content/Intent;)Landroid/net/sip/SipSession;"/>
+ <method name="isApiSupported(Landroid/content/Context;)Z"/>
+ <method name="isIncomingCallIntent(Landroid/content/Intent;)Z"/>
+ <method name="isOpened(Ljava/lang/String;)Z"/>
+ <method name="isRegistered(Ljava/lang/String;)Z"/>
+ <method name="isSipWifiOnly(Landroid/content/Context;)Z"/>
+ <method name="isVoipSupported(Landroid/content/Context;)Z"/>
+ <method name="makeAudioCall(Landroid/net/sip/SipProfile;Landroid/net/sip/SipProfile;Landroid/net/sip/SipAudioCall$Listener;I)Landroid/net/sip/SipAudioCall;"/>
+ <method name="makeAudioCall(Ljava/lang/String;Ljava/lang/String;Landroid/net/sip/SipAudioCall$Listener;I)Landroid/net/sip/SipAudioCall;"/>
+ <method name="newInstance(Landroid/content/Context;)Landroid/net/sip/SipManager;"/>
+ <method name="open(Landroid/net/sip/SipProfile;)V"/>
+ <method name="open(Landroid/net/sip/SipProfile;Landroid/app/PendingIntent;Landroid/net/sip/SipRegistrationListener;)V"/>
+ <method name="register(Landroid/net/sip/SipProfile;ILandroid/net/sip/SipRegistrationListener;)V"/>
+ <method name="setRegistrationListener(Ljava/lang/String;Landroid/net/sip/SipRegistrationListener;)V"/>
+ <method name="takeAudioCall(Landroid/content/Intent;Landroid/net/sip/SipAudioCall$Listener;)Landroid/net/sip/SipAudioCall;"/>
+ <method name="unregister(Landroid/net/sip/SipProfile;Landroid/net/sip/SipRegistrationListener;)V"/>
+ <field name="EXTRA_CALL_ID"/>
+ <field name="EXTRA_OFFER_SD"/>
+ <field name="INCOMING_CALL_RESULT_CODE"/>
+ </class>
+ <class name="android/net/sip/SipProfile" since="9">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAuthUserName()Ljava/lang/String;" since="12"/>
+ <method name="getAutoRegistration()Z"/>
+ <method name="getDisplayName()Ljava/lang/String;"/>
+ <method name="getPassword()Ljava/lang/String;"/>
+ <method name="getPort()I"/>
+ <method name="getProfileName()Ljava/lang/String;"/>
+ <method name="getProtocol()Ljava/lang/String;"/>
+ <method name="getProxyAddress()Ljava/lang/String;"/>
+ <method name="getSendKeepAlive()Z"/>
+ <method name="getSipDomain()Ljava/lang/String;"/>
+ <method name="getUriString()Ljava/lang/String;"/>
+ <method name="getUserName()Ljava/lang/String;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/net/sip/SipProfile$Builder" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/net/sip/SipProfile;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="build()Landroid/net/sip/SipProfile;"/>
+ <method name="setAuthUserName(Ljava/lang/String;)Landroid/net/sip/SipProfile$Builder;" since="12"/>
+ <method name="setAutoRegistration(Z)Landroid/net/sip/SipProfile$Builder;"/>
+ <method name="setDisplayName(Ljava/lang/String;)Landroid/net/sip/SipProfile$Builder;"/>
+ <method name="setOutboundProxy(Ljava/lang/String;)Landroid/net/sip/SipProfile$Builder;"/>
+ <method name="setPassword(Ljava/lang/String;)Landroid/net/sip/SipProfile$Builder;"/>
+ <method name="setPort(I)Landroid/net/sip/SipProfile$Builder;"/>
+ <method name="setProfileName(Ljava/lang/String;)Landroid/net/sip/SipProfile$Builder;"/>
+ <method name="setProtocol(Ljava/lang/String;)Landroid/net/sip/SipProfile$Builder;"/>
+ <method name="setSendKeepAlive(Z)Landroid/net/sip/SipProfile$Builder;"/>
+ </class>
+ <class name="android/net/sip/SipRegistrationListener" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="onRegistering(Ljava/lang/String;)V"/>
+ <method name="onRegistrationDone(Ljava/lang/String;J)V"/>
+ <method name="onRegistrationFailed(Ljava/lang/String;ILjava/lang/String;)V"/>
+ </class>
+ <class name="android/net/sip/SipSession" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="answerCall(Ljava/lang/String;I)V"/>
+ <method name="changeCall(Ljava/lang/String;I)V"/>
+ <method name="endCall()V"/>
+ <method name="getCallId()Ljava/lang/String;"/>
+ <method name="getLocalIp()Ljava/lang/String;"/>
+ <method name="getLocalProfile()Landroid/net/sip/SipProfile;"/>
+ <method name="getPeerProfile()Landroid/net/sip/SipProfile;"/>
+ <method name="getState()I"/>
+ <method name="isInCall()Z"/>
+ <method name="makeCall(Landroid/net/sip/SipProfile;Ljava/lang/String;I)V"/>
+ <method name="register(I)V"/>
+ <method name="setListener(Landroid/net/sip/SipSession$Listener;)V"/>
+ <method name="unregister()V"/>
+ </class>
+ <class name="android/net/sip/SipSession$Listener" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onCallBusy(Landroid/net/sip/SipSession;)V"/>
+ <method name="onCallChangeFailed(Landroid/net/sip/SipSession;ILjava/lang/String;)V"/>
+ <method name="onCallEnded(Landroid/net/sip/SipSession;)V"/>
+ <method name="onCallEstablished(Landroid/net/sip/SipSession;Ljava/lang/String;)V"/>
+ <method name="onCalling(Landroid/net/sip/SipSession;)V"/>
+ <method name="onError(Landroid/net/sip/SipSession;ILjava/lang/String;)V"/>
+ <method name="onRegistering(Landroid/net/sip/SipSession;)V"/>
+ <method name="onRegistrationDone(Landroid/net/sip/SipSession;I)V"/>
+ <method name="onRegistrationFailed(Landroid/net/sip/SipSession;ILjava/lang/String;)V"/>
+ <method name="onRegistrationTimeout(Landroid/net/sip/SipSession;)V"/>
+ <method name="onRinging(Landroid/net/sip/SipSession;Landroid/net/sip/SipProfile;Ljava/lang/String;)V"/>
+ <method name="onRingingBack(Landroid/net/sip/SipSession;)V"/>
+ </class>
+ <class name="android/net/sip/SipSession$State" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="toString(I)Ljava/lang/String;"/>
+ <field name="DEREGISTERING"/>
+ <field name="INCOMING_CALL"/>
+ <field name="INCOMING_CALL_ANSWERING"/>
+ <field name="IN_CALL"/>
+ <field name="NOT_DEFINED"/>
+ <field name="OUTGOING_CALL"/>
+ <field name="OUTGOING_CALL_CANCELING"/>
+ <field name="OUTGOING_CALL_RING_BACK"/>
+ <field name="PINGING"/>
+ <field name="READY_TO_CALL"/>
+ <field name="REGISTERING"/>
+ </class>
+ <class name="android/net/wifi/ScanResult" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="is80211mcResponder()Z" since="23"/>
+ <method name="isPasspointNetwork()Z" since="23"/>
+ <field name="BSSID"/>
+ <field name="CHANNEL_WIDTH_160MHZ" since="23"/>
+ <field name="CHANNEL_WIDTH_20MHZ" since="23"/>
+ <field name="CHANNEL_WIDTH_40MHZ" since="23"/>
+ <field name="CHANNEL_WIDTH_80MHZ" since="23"/>
+ <field name="CHANNEL_WIDTH_80MHZ_PLUS_MHZ" since="23"/>
+ <field name="SSID"/>
+ <field name="capabilities"/>
+ <field name="centerFreq0" since="23"/>
+ <field name="centerFreq1" since="23"/>
+ <field name="channelWidth" since="23"/>
+ <field name="frequency"/>
+ <field name="level"/>
+ <field name="operatorFriendlyName" since="23"/>
+ <field name="timestamp" since="17"/>
+ <field name="venueName" since="23"/>
+ </class>
+ <class name="android/net/wifi/SupplicantState" since="1">
+ <extends name="java/lang/Enum"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="isValidState(Landroid/net/wifi/SupplicantState;)Z"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/net/wifi/SupplicantState;"/>
+ <method name="values()[Landroid/net/wifi/SupplicantState;"/>
+ <field name="ASSOCIATED"/>
+ <field name="ASSOCIATING"/>
+ <field name="AUTHENTICATING" since="14"/>
+ <field name="COMPLETED"/>
+ <field name="DISCONNECTED"/>
+ <field name="DORMANT"/>
+ <field name="FOUR_WAY_HANDSHAKE"/>
+ <field name="GROUP_HANDSHAKE"/>
+ <field name="INACTIVE"/>
+ <field name="INTERFACE_DISABLED" since="14"/>
+ <field name="INVALID"/>
+ <field name="SCANNING"/>
+ <field name="UNINITIALIZED"/>
+ </class>
+ <class name="android/net/wifi/WifiConfiguration" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getHttpProxy()Landroid/net/ProxyInfo;" since="26"/>
+ <method name="isPasspoint()Z" since="23"/>
+ <method name="setHttpProxy(Landroid/net/ProxyInfo;)V" since="26"/>
+ <field name="BSSID"/>
+ <field name="FQDN" since="21"/>
+ <field name="SSID"/>
+ <field name="allowedAuthAlgorithms"/>
+ <field name="allowedGroupCiphers"/>
+ <field name="allowedKeyManagement"/>
+ <field name="allowedPairwiseCiphers"/>
+ <field name="allowedProtocols"/>
+ <field name="enterpriseConfig" since="18"/>
+ <field name="hiddenSSID"/>
+ <field name="isHomeProviderNetwork" since="26"/>
+ <field name="networkId"/>
+ <field name="preSharedKey"/>
+ <field name="priority" deprecated="26"/>
+ <field name="providerFriendlyName" since="23"/>
+ <field name="roamingConsortiumIds" since="23"/>
+ <field name="status"/>
+ <field name="wepKeys"/>
+ <field name="wepTxKeyIndex"/>
+ </class>
+ <class name="android/net/wifi/WifiConfiguration$AuthAlgorithm" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="LEAP"/>
+ <field name="OPEN"/>
+ <field name="SHARED"/>
+ <field name="strings"/>
+ <field name="varName"/>
+ </class>
+ <class name="android/net/wifi/WifiConfiguration$GroupCipher" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="CCMP"/>
+ <field name="TKIP"/>
+ <field name="WEP104"/>
+ <field name="WEP40"/>
+ <field name="strings"/>
+ <field name="varName"/>
+ </class>
+ <class name="android/net/wifi/WifiConfiguration$KeyMgmt" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="IEEE8021X"/>
+ <field name="NONE"/>
+ <field name="WPA_EAP"/>
+ <field name="WPA_PSK"/>
+ <field name="strings"/>
+ <field name="varName"/>
+ </class>
+ <class name="android/net/wifi/WifiConfiguration$PairwiseCipher" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="CCMP"/>
+ <field name="NONE"/>
+ <field name="TKIP"/>
+ <field name="strings"/>
+ <field name="varName"/>
+ </class>
+ <class name="android/net/wifi/WifiConfiguration$Protocol" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="RSN"/>
+ <field name="WPA"/>
+ <field name="strings"/>
+ <field name="varName"/>
+ </class>
+ <class name="android/net/wifi/WifiConfiguration$Status" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="CURRENT"/>
+ <field name="DISABLED"/>
+ <field name="ENABLED"/>
+ <field name="strings"/>
+ </class>
+ <class name="android/net/wifi/WifiEnterpriseConfig" since="18">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/net/wifi/WifiEnterpriseConfig;)V"/>
+ <method name="getAltSubjectMatch()Ljava/lang/String;" since="23"/>
+ <method name="getAnonymousIdentity()Ljava/lang/String;"/>
+ <method name="getCaCertificate()Ljava/security/cert/X509Certificate;"/>
+ <method name="getCaCertificates()[Ljava/security/cert/X509Certificate;" since="24"/>
+ <method name="getClientCertificate()Ljava/security/cert/X509Certificate;"/>
+ <method name="getClientCertificateChain()[Ljava/security/cert/X509Certificate;" since="26"/>
+ <method name="getDomainSuffixMatch()Ljava/lang/String;" since="23"/>
+ <method name="getEapMethod()I"/>
+ <method name="getIdentity()Ljava/lang/String;"/>
+ <method name="getPassword()Ljava/lang/String;"/>
+ <method name="getPhase2Method()I"/>
+ <method name="getPlmn()Ljava/lang/String;" since="23"/>
+ <method name="getRealm()Ljava/lang/String;" since="23"/>
+ <method name="getSubjectMatch()Ljava/lang/String;" deprecated="23"/>
+ <method name="setAltSubjectMatch(Ljava/lang/String;)V" since="23"/>
+ <method name="setAnonymousIdentity(Ljava/lang/String;)V"/>
+ <method name="setCaCertificate(Ljava/security/cert/X509Certificate;)V"/>
+ <method name="setCaCertificates([Ljava/security/cert/X509Certificate;)V" since="24"/>
+ <method name="setClientKeyEntry(Ljava/security/PrivateKey;Ljava/security/cert/X509Certificate;)V"/>
+ <method name="setClientKeyEntryWithCertificateChain(Ljava/security/PrivateKey;[Ljava/security/cert/X509Certificate;)V" since="26"/>
+ <method name="setDomainSuffixMatch(Ljava/lang/String;)V" since="23"/>
+ <method name="setEapMethod(I)V"/>
+ <method name="setIdentity(Ljava/lang/String;)V"/>
+ <method name="setPassword(Ljava/lang/String;)V"/>
+ <method name="setPhase2Method(I)V"/>
+ <method name="setPlmn(Ljava/lang/String;)V" since="23"/>
+ <method name="setRealm(Ljava/lang/String;)V" since="23"/>
+ <method name="setSubjectMatch(Ljava/lang/String;)V" deprecated="23"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/net/wifi/WifiEnterpriseConfig$Eap" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="AKA" since="21"/>
+ <field name="AKA_PRIME" since="23"/>
+ <field name="NONE"/>
+ <field name="PEAP"/>
+ <field name="PWD"/>
+ <field name="SIM" since="21"/>
+ <field name="TLS"/>
+ <field name="TTLS"/>
+ <field name="UNAUTH_TLS" since="24"/>
+ </class>
+ <class name="android/net/wifi/WifiEnterpriseConfig$Phase2" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="AKA" since="26"/>
+ <field name="AKA_PRIME" since="26"/>
+ <field name="GTC"/>
+ <field name="MSCHAP"/>
+ <field name="MSCHAPV2"/>
+ <field name="NONE"/>
+ <field name="PAP"/>
+ <field name="SIM" since="26"/>
+ </class>
+ <class name="android/net/wifi/WifiInfo" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getBSSID()Ljava/lang/String;"/>
+ <method name="getDetailedStateOf(Landroid/net/wifi/SupplicantState;)Landroid/net/NetworkInfo$DetailedState;"/>
+ <method name="getFrequency()I" since="21"/>
+ <method name="getHiddenSSID()Z"/>
+ <method name="getIpAddress()I"/>
+ <method name="getLinkSpeed()I"/>
+ <method name="getMacAddress()Ljava/lang/String;"/>
+ <method name="getNetworkId()I"/>
+ <method name="getRssi()I"/>
+ <method name="getSSID()Ljava/lang/String;"/>
+ <method name="getSupplicantState()Landroid/net/wifi/SupplicantState;"/>
+ <field name="FREQUENCY_UNITS" since="21"/>
+ <field name="LINK_SPEED_UNITS"/>
+ </class>
+ <class name="android/net/wifi/WifiManager" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addNetwork(Landroid/net/wifi/WifiConfiguration;)I"/>
+ <method name="addOrUpdatePasspointConfiguration(Landroid/net/wifi/hotspot2/PasspointConfiguration;)V" since="26"/>
+ <method name="calculateSignalLevel(II)I"/>
+ <method name="cancelWps(Landroid/net/wifi/WifiManager$WpsCallback;)V" since="21"/>
+ <method name="compareSignalLevel(II)I"/>
+ <method name="createMulticastLock(Ljava/lang/String;)Landroid/net/wifi/WifiManager$MulticastLock;" since="4"/>
+ <method name="createWifiLock(ILjava/lang/String;)Landroid/net/wifi/WifiManager$WifiLock;" since="3"/>
+ <method name="createWifiLock(Ljava/lang/String;)Landroid/net/wifi/WifiManager$WifiLock;"/>
+ <method name="disableNetwork(I)Z"/>
+ <method name="disconnect()Z"/>
+ <method name="enableNetwork(IZ)Z"/>
+ <method name="getConfiguredNetworks()Ljava/util/List;"/>
+ <method name="getConnectionInfo()Landroid/net/wifi/WifiInfo;"/>
+ <method name="getDhcpInfo()Landroid/net/DhcpInfo;" deprecated="18"/>
+ <method name="getPasspointConfigurations()Ljava/util/List;" since="26"/>
+ <method name="getScanResults()Ljava/util/List;"/>
+ <method name="getWifiState()I"/>
+ <method name="is5GHzBandSupported()Z" since="21"/>
+ <method name="isDeviceToApRttSupported()Z" since="21"/>
+ <method name="isEnhancedPowerReportingSupported()Z" since="21"/>
+ <method name="isP2pSupported()Z" since="21"/>
+ <method name="isPreferredNetworkOffloadSupported()Z" since="21"/>
+ <method name="isScanAlwaysAvailable()Z" since="18"/>
+ <method name="isTdlsSupported()Z" since="21"/>
+ <method name="isWifiEnabled()Z"/>
+ <method name="pingSupplicant()Z" deprecated="26"/>
+ <method name="reassociate()Z"/>
+ <method name="reconnect()Z"/>
+ <method name="removeNetwork(I)Z"/>
+ <method name="removePasspointConfiguration(Ljava/lang/String;)V" since="26"/>
+ <method name="saveConfiguration()Z" deprecated="26"/>
+ <method name="setTdlsEnabled(Ljava/net/InetAddress;Z)V" since="19"/>
+ <method name="setTdlsEnabledWithMacAddress(Ljava/lang/String;Z)V" since="19"/>
+ <method name="setWifiEnabled(Z)Z"/>
+ <method name="startLocalOnlyHotspot(Landroid/net/wifi/WifiManager$LocalOnlyHotspotCallback;Landroid/os/Handler;)V" since="26"/>
+ <method name="startScan()Z"/>
+ <method name="startWps(Landroid/net/wifi/WpsInfo;Landroid/net/wifi/WifiManager$WpsCallback;)V" since="21"/>
+ <method name="updateNetwork(Landroid/net/wifi/WifiConfiguration;)I"/>
+ <field name="ACTION_PICK_WIFI_NETWORK"/>
+ <field name="ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE" since="18"/>
+ <field name="ERROR_AUTHENTICATING"/>
+ <field name="EXTRA_BSSID"/>
+ <field name="EXTRA_NETWORK_INFO"/>
+ <field name="EXTRA_NEW_RSSI"/>
+ <field name="EXTRA_NEW_STATE"/>
+ <field name="EXTRA_PREVIOUS_WIFI_STATE"/>
+ <field name="EXTRA_RESULTS_UPDATED" since="23"/>
+ <field name="EXTRA_SUPPLICANT_CONNECTED"/>
+ <field name="EXTRA_SUPPLICANT_ERROR"/>
+ <field name="EXTRA_WIFI_INFO" since="14"/>
+ <field name="EXTRA_WIFI_STATE"/>
+ <field name="NETWORK_IDS_CHANGED_ACTION"/>
+ <field name="NETWORK_STATE_CHANGED_ACTION"/>
+ <field name="RSSI_CHANGED_ACTION"/>
+ <field name="SCAN_RESULTS_AVAILABLE_ACTION"/>
+ <field name="SUPPLICANT_CONNECTION_CHANGE_ACTION"/>
+ <field name="SUPPLICANT_STATE_CHANGED_ACTION"/>
+ <field name="WIFI_MODE_FULL" since="3"/>
+ <field name="WIFI_MODE_FULL_HIGH_PERF" since="12"/>
+ <field name="WIFI_MODE_SCAN_ONLY" since="3"/>
+ <field name="WIFI_STATE_CHANGED_ACTION"/>
+ <field name="WIFI_STATE_DISABLED"/>
+ <field name="WIFI_STATE_DISABLING"/>
+ <field name="WIFI_STATE_ENABLED"/>
+ <field name="WIFI_STATE_ENABLING"/>
+ <field name="WIFI_STATE_UNKNOWN"/>
+ <field name="WPS_AUTH_FAILURE" since="21"/>
+ <field name="WPS_OVERLAP_ERROR" since="21"/>
+ <field name="WPS_TIMED_OUT" since="21"/>
+ <field name="WPS_TKIP_ONLY_PROHIBITED" since="21"/>
+ <field name="WPS_WEP_PROHIBITED" since="21"/>
+ </class>
+ <class name="android/net/wifi/WifiManager$LocalOnlyHotspotCallback" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onFailed(I)V"/>
+ <method name="onStarted(Landroid/net/wifi/WifiManager$LocalOnlyHotspotReservation;)V"/>
+ <method name="onStopped()V"/>
+ <field name="ERROR_GENERIC"/>
+ <field name="ERROR_INCOMPATIBLE_MODE"/>
+ <field name="ERROR_NO_CHANNEL"/>
+ <field name="ERROR_TETHERING_DISALLOWED"/>
+ </class>
+ <class name="android/net/wifi/WifiManager$LocalOnlyHotspotReservation" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable"/>
+ <method name="&lt;init>(Landroid/net/wifi/WifiManager;)V"/>
+ <method name="getWifiConfiguration()Landroid/net/wifi/WifiConfiguration;"/>
+ </class>
+ <class name="android/net/wifi/WifiManager$MulticastLock" since="4">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/net/wifi/WifiManager;)V"/>
+ <method name="acquire()V"/>
+ <method name="isHeld()Z"/>
+ <method name="release()V"/>
+ <method name="setReferenceCounted(Z)V"/>
+ </class>
+ <class name="android/net/wifi/WifiManager$WifiLock" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/net/wifi/WifiManager;)V"/>
+ <method name="acquire()V"/>
+ <method name="isHeld()Z"/>
+ <method name="release()V"/>
+ <method name="setReferenceCounted(Z)V"/>
+ <method name="setWorkSource(Landroid/os/WorkSource;)V" since="9"/>
+ </class>
+ <class name="android/net/wifi/WifiManager$WpsCallback" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onFailed(I)V"/>
+ <method name="onStarted(Ljava/lang/String;)V"/>
+ <method name="onSucceeded()V"/>
+ </class>
+ <class name="android/net/wifi/WpsInfo" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/net/wifi/WpsInfo;)V"/>
+ <field name="BSSID" since="21"/>
+ <field name="CREATOR"/>
+ <field name="DISPLAY"/>
+ <field name="INVALID"/>
+ <field name="KEYPAD"/>
+ <field name="LABEL"/>
+ <field name="PBC"/>
+ <field name="pin"/>
+ <field name="setup"/>
+ </class>
+ <class name="android/net/wifi/aware/AttachCallback" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onAttachFailed()V"/>
+ <method name="onAttached(Landroid/net/wifi/aware/WifiAwareSession;)V"/>
+ </class>
+ <class name="android/net/wifi/aware/Characteristics" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getMaxMatchFilterLength()I"/>
+ <method name="getMaxServiceNameLength()I"/>
+ <method name="getMaxServiceSpecificInfoLength()I"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/net/wifi/aware/DiscoverySession" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable"/>
+ <method name="&lt;init>()V"/>
+ <method name="createNetworkSpecifierOpen(Landroid/net/wifi/aware/PeerHandle;)Landroid/net/NetworkSpecifier;"/>
+ <method name="createNetworkSpecifierPassphrase(Landroid/net/wifi/aware/PeerHandle;Ljava/lang/String;)Landroid/net/NetworkSpecifier;"/>
+ <method name="sendMessage(Landroid/net/wifi/aware/PeerHandle;I[B)V"/>
+ </class>
+ <class name="android/net/wifi/aware/DiscoverySessionCallback" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onMessageReceived(Landroid/net/wifi/aware/PeerHandle;[B)V"/>
+ <method name="onMessageSendFailed(I)V"/>
+ <method name="onMessageSendSucceeded(I)V"/>
+ <method name="onPublishStarted(Landroid/net/wifi/aware/PublishDiscoverySession;)V"/>
+ <method name="onServiceDiscovered(Landroid/net/wifi/aware/PeerHandle;[BLjava/util/List;)V"/>
+ <method name="onSessionConfigFailed()V"/>
+ <method name="onSessionConfigUpdated()V"/>
+ <method name="onSessionTerminated()V"/>
+ <method name="onSubscribeStarted(Landroid/net/wifi/aware/SubscribeDiscoverySession;)V"/>
+ </class>
+ <class name="android/net/wifi/aware/IdentityChangedListener" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onIdentityChanged([B)V"/>
+ </class>
+ <class name="android/net/wifi/aware/PeerHandle" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/net/wifi/aware/PublishConfig" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <field name="CREATOR"/>
+ <field name="PUBLISH_TYPE_SOLICITED"/>
+ <field name="PUBLISH_TYPE_UNSOLICITED"/>
+ </class>
+ <class name="android/net/wifi/aware/PublishConfig$Builder" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="build()Landroid/net/wifi/aware/PublishConfig;"/>
+ <method name="setMatchFilter(Ljava/util/List;)Landroid/net/wifi/aware/PublishConfig$Builder;"/>
+ <method name="setPublishType(I)Landroid/net/wifi/aware/PublishConfig$Builder;"/>
+ <method name="setServiceName(Ljava/lang/String;)Landroid/net/wifi/aware/PublishConfig$Builder;"/>
+ <method name="setServiceSpecificInfo([B)Landroid/net/wifi/aware/PublishConfig$Builder;"/>
+ <method name="setTerminateNotificationEnabled(Z)Landroid/net/wifi/aware/PublishConfig$Builder;"/>
+ <method name="setTtlSec(I)Landroid/net/wifi/aware/PublishConfig$Builder;"/>
+ </class>
+ <class name="android/net/wifi/aware/PublishDiscoverySession" since="26">
+ <extends name="android/net/wifi/aware/DiscoverySession"/>
+ <method name="&lt;init>()V"/>
+ <method name="updatePublish(Landroid/net/wifi/aware/PublishConfig;)V"/>
+ </class>
+ <class name="android/net/wifi/aware/SubscribeConfig" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <field name="CREATOR"/>
+ <field name="SUBSCRIBE_TYPE_ACTIVE"/>
+ <field name="SUBSCRIBE_TYPE_PASSIVE"/>
+ </class>
+ <class name="android/net/wifi/aware/SubscribeConfig$Builder" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="build()Landroid/net/wifi/aware/SubscribeConfig;"/>
+ <method name="setMatchFilter(Ljava/util/List;)Landroid/net/wifi/aware/SubscribeConfig$Builder;"/>
+ <method name="setServiceName(Ljava/lang/String;)Landroid/net/wifi/aware/SubscribeConfig$Builder;"/>
+ <method name="setServiceSpecificInfo([B)Landroid/net/wifi/aware/SubscribeConfig$Builder;"/>
+ <method name="setSubscribeType(I)Landroid/net/wifi/aware/SubscribeConfig$Builder;"/>
+ <method name="setTerminateNotificationEnabled(Z)Landroid/net/wifi/aware/SubscribeConfig$Builder;"/>
+ <method name="setTtlSec(I)Landroid/net/wifi/aware/SubscribeConfig$Builder;"/>
+ </class>
+ <class name="android/net/wifi/aware/SubscribeDiscoverySession" since="26">
+ <extends name="android/net/wifi/aware/DiscoverySession"/>
+ <method name="&lt;init>()V"/>
+ <method name="updateSubscribe(Landroid/net/wifi/aware/SubscribeConfig;)V"/>
+ </class>
+ <class name="android/net/wifi/aware/WifiAwareManager" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="attach(Landroid/net/wifi/aware/AttachCallback;Landroid/net/wifi/aware/IdentityChangedListener;Landroid/os/Handler;)V"/>
+ <method name="attach(Landroid/net/wifi/aware/AttachCallback;Landroid/os/Handler;)V"/>
+ <method name="getCharacteristics()Landroid/net/wifi/aware/Characteristics;"/>
+ <method name="isAvailable()Z"/>
+ <field name="ACTION_WIFI_AWARE_STATE_CHANGED"/>
+ <field name="WIFI_AWARE_DATA_PATH_ROLE_INITIATOR"/>
+ <field name="WIFI_AWARE_DATA_PATH_ROLE_RESPONDER"/>
+ </class>
+ <class name="android/net/wifi/aware/WifiAwareSession" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable"/>
+ <method name="&lt;init>()V"/>
+ <method name="createNetworkSpecifierOpen(I[B)Landroid/net/NetworkSpecifier;"/>
+ <method name="createNetworkSpecifierPassphrase(I[BLjava/lang/String;)Landroid/net/NetworkSpecifier;"/>
+ <method name="publish(Landroid/net/wifi/aware/PublishConfig;Landroid/net/wifi/aware/DiscoverySessionCallback;Landroid/os/Handler;)V"/>
+ <method name="subscribe(Landroid/net/wifi/aware/SubscribeConfig;Landroid/net/wifi/aware/DiscoverySessionCallback;Landroid/os/Handler;)V"/>
+ </class>
+ <class name="android/net/wifi/hotspot2/ConfigParser" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="parsePasspointConfig(Ljava/lang/String;[B)Landroid/net/wifi/hotspot2/PasspointConfiguration;"/>
+ </class>
+ <class name="android/net/wifi/hotspot2/PasspointConfiguration" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/net/wifi/hotspot2/PasspointConfiguration;)V"/>
+ <method name="getCredential()Landroid/net/wifi/hotspot2/pps/Credential;"/>
+ <method name="getHomeSp()Landroid/net/wifi/hotspot2/pps/HomeSp;"/>
+ <method name="setCredential(Landroid/net/wifi/hotspot2/pps/Credential;)V"/>
+ <method name="setHomeSp(Landroid/net/wifi/hotspot2/pps/HomeSp;)V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/net/wifi/hotspot2/omadm/PpsMoParser" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="parseMoText(Ljava/lang/String;)Landroid/net/wifi/hotspot2/PasspointConfiguration;"/>
+ </class>
+ <class name="android/net/wifi/hotspot2/pps/Credential" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/net/wifi/hotspot2/pps/Credential;)V"/>
+ <method name="getCaCertificate()Ljava/security/cert/X509Certificate;"/>
+ <method name="getCertCredential()Landroid/net/wifi/hotspot2/pps/Credential$CertificateCredential;"/>
+ <method name="getClientCertificateChain()[Ljava/security/cert/X509Certificate;"/>
+ <method name="getClientPrivateKey()Ljava/security/PrivateKey;"/>
+ <method name="getRealm()Ljava/lang/String;"/>
+ <method name="getSimCredential()Landroid/net/wifi/hotspot2/pps/Credential$SimCredential;"/>
+ <method name="getUserCredential()Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;"/>
+ <method name="setCaCertificate(Ljava/security/cert/X509Certificate;)V"/>
+ <method name="setCertCredential(Landroid/net/wifi/hotspot2/pps/Credential$CertificateCredential;)V"/>
+ <method name="setClientCertificateChain([Ljava/security/cert/X509Certificate;)V"/>
+ <method name="setClientPrivateKey(Ljava/security/PrivateKey;)V"/>
+ <method name="setRealm(Ljava/lang/String;)V"/>
+ <method name="setSimCredential(Landroid/net/wifi/hotspot2/pps/Credential$SimCredential;)V"/>
+ <method name="setUserCredential(Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;)V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/net/wifi/hotspot2/pps/Credential$CertificateCredential" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/net/wifi/hotspot2/pps/Credential$CertificateCredential;)V"/>
+ <method name="getCertSha256Fingerprint()[B"/>
+ <method name="getCertType()Ljava/lang/String;"/>
+ <method name="setCertSha256Fingerprint([B)V"/>
+ <method name="setCertType(Ljava/lang/String;)V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/net/wifi/hotspot2/pps/Credential$SimCredential" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/net/wifi/hotspot2/pps/Credential$SimCredential;)V"/>
+ <method name="getEapType()I"/>
+ <method name="getImsi()Ljava/lang/String;"/>
+ <method name="setEapType(I)V"/>
+ <method name="setImsi(Ljava/lang/String;)V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/net/wifi/hotspot2/pps/Credential$UserCredential" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/net/wifi/hotspot2/pps/Credential$UserCredential;)V"/>
+ <method name="getEapType()I"/>
+ <method name="getNonEapInnerMethod()Ljava/lang/String;"/>
+ <method name="getPassword()Ljava/lang/String;"/>
+ <method name="getUsername()Ljava/lang/String;"/>
+ <method name="setEapType(I)V"/>
+ <method name="setNonEapInnerMethod(Ljava/lang/String;)V"/>
+ <method name="setPassword(Ljava/lang/String;)V"/>
+ <method name="setUsername(Ljava/lang/String;)V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/net/wifi/hotspot2/pps/HomeSp" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/net/wifi/hotspot2/pps/HomeSp;)V"/>
+ <method name="getFqdn()Ljava/lang/String;"/>
+ <method name="getFriendlyName()Ljava/lang/String;"/>
+ <method name="getRoamingConsortiumOis()[J"/>
+ <method name="setFqdn(Ljava/lang/String;)V"/>
+ <method name="setFriendlyName(Ljava/lang/String;)V"/>
+ <method name="setRoamingConsortiumOis([J)V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pConfig" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/net/wifi/p2p/WifiP2pConfig;)V"/>
+ <field name="CREATOR"/>
+ <field name="deviceAddress"/>
+ <field name="groupOwnerIntent"/>
+ <field name="wps"/>
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pDevice" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/net/wifi/p2p/WifiP2pDevice;)V"/>
+ <method name="isGroupOwner()Z"/>
+ <method name="isServiceDiscoveryCapable()Z"/>
+ <method name="wpsDisplaySupported()Z"/>
+ <method name="wpsKeypadSupported()Z"/>
+ <method name="wpsPbcSupported()Z"/>
+ <field name="AVAILABLE"/>
+ <field name="CONNECTED"/>
+ <field name="CREATOR"/>
+ <field name="FAILED"/>
+ <field name="INVITED"/>
+ <field name="UNAVAILABLE"/>
+ <field name="deviceAddress"/>
+ <field name="deviceName"/>
+ <field name="primaryDeviceType"/>
+ <field name="secondaryDeviceType"/>
+ <field name="status"/>
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pDeviceList" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/net/wifi/p2p/WifiP2pDeviceList;)V"/>
+ <method name="get(Ljava/lang/String;)Landroid/net/wifi/p2p/WifiP2pDevice;" since="18"/>
+ <method name="getDeviceList()Ljava/util/Collection;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pGroup" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/net/wifi/p2p/WifiP2pGroup;)V"/>
+ <method name="getClientList()Ljava/util/Collection;"/>
+ <method name="getInterface()Ljava/lang/String;"/>
+ <method name="getNetworkName()Ljava/lang/String;"/>
+ <method name="getOwner()Landroid/net/wifi/p2p/WifiP2pDevice;"/>
+ <method name="getPassphrase()Ljava/lang/String;"/>
+ <method name="isGroupOwner()Z"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pInfo" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/net/wifi/p2p/WifiP2pInfo;)V"/>
+ <field name="CREATOR"/>
+ <field name="groupFormed"/>
+ <field name="groupOwnerAddress"/>
+ <field name="isGroupOwner"/>
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pManager" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addLocalService(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/nsd/WifiP2pServiceInfo;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V" since="16"/>
+ <method name="addServiceRequest(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V" since="16"/>
+ <method name="cancelConnect(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V"/>
+ <method name="clearLocalServices(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V" since="16"/>
+ <method name="clearServiceRequests(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V" since="16"/>
+ <method name="connect(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pConfig;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V"/>
+ <method name="createGroup(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V"/>
+ <method name="discoverPeers(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V"/>
+ <method name="discoverServices(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V" since="16"/>
+ <method name="initialize(Landroid/content/Context;Landroid/os/Looper;Landroid/net/wifi/p2p/WifiP2pManager$ChannelListener;)Landroid/net/wifi/p2p/WifiP2pManager$Channel;"/>
+ <method name="removeGroup(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V"/>
+ <method name="removeLocalService(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/nsd/WifiP2pServiceInfo;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V" since="16"/>
+ <method name="removeServiceRequest(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V" since="16"/>
+ <method name="requestConnectionInfo(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ConnectionInfoListener;)V"/>
+ <method name="requestGroupInfo(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$GroupInfoListener;)V"/>
+ <method name="requestPeers(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$PeerListListener;)V"/>
+ <method name="setDnsSdResponseListeners(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$DnsSdServiceResponseListener;Landroid/net/wifi/p2p/WifiP2pManager$DnsSdTxtRecordListener;)V" since="16"/>
+ <method name="setServiceResponseListener(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ServiceResponseListener;)V" since="16"/>
+ <method name="setUpnpServiceResponseListener(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$UpnpServiceResponseListener;)V" since="16"/>
+ <method name="stopPeerDiscovery(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V" since="16"/>
+ <field name="BUSY"/>
+ <field name="ERROR"/>
+ <field name="EXTRA_DISCOVERY_STATE" since="16"/>
+ <field name="EXTRA_NETWORK_INFO"/>
+ <field name="EXTRA_P2P_DEVICE_LIST" since="18"/>
+ <field name="EXTRA_WIFI_P2P_DEVICE"/>
+ <field name="EXTRA_WIFI_P2P_GROUP" since="18"/>
+ <field name="EXTRA_WIFI_P2P_INFO"/>
+ <field name="EXTRA_WIFI_STATE"/>
+ <field name="NO_SERVICE_REQUESTS" since="16"/>
+ <field name="P2P_UNSUPPORTED"/>
+ <field name="WIFI_P2P_CONNECTION_CHANGED_ACTION"/>
+ <field name="WIFI_P2P_DISCOVERY_CHANGED_ACTION" since="16"/>
+ <field name="WIFI_P2P_DISCOVERY_STARTED" since="16"/>
+ <field name="WIFI_P2P_DISCOVERY_STOPPED" since="16"/>
+ <field name="WIFI_P2P_PEERS_CHANGED_ACTION"/>
+ <field name="WIFI_P2P_STATE_CHANGED_ACTION"/>
+ <field name="WIFI_P2P_STATE_DISABLED"/>
+ <field name="WIFI_P2P_STATE_ENABLED"/>
+ <field name="WIFI_P2P_THIS_DEVICE_CHANGED_ACTION"/>
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pManager$ActionListener" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="onFailure(I)V"/>
+ <method name="onSuccess()V"/>
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pManager$Channel" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pManager$ChannelListener" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="onChannelDisconnected()V"/>
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pManager$ConnectionInfoListener" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="onConnectionInfoAvailable(Landroid/net/wifi/p2p/WifiP2pInfo;)V"/>
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pManager$DnsSdServiceResponseListener" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="onDnsSdServiceAvailable(Ljava/lang/String;Ljava/lang/String;Landroid/net/wifi/p2p/WifiP2pDevice;)V"/>
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pManager$DnsSdTxtRecordListener" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="onDnsSdTxtRecordAvailable(Ljava/lang/String;Ljava/util/Map;Landroid/net/wifi/p2p/WifiP2pDevice;)V"/>
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pManager$GroupInfoListener" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="onGroupInfoAvailable(Landroid/net/wifi/p2p/WifiP2pGroup;)V"/>
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pManager$PeerListListener" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="onPeersAvailable(Landroid/net/wifi/p2p/WifiP2pDeviceList;)V"/>
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pManager$ServiceResponseListener" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="onServiceAvailable(I[BLandroid/net/wifi/p2p/WifiP2pDevice;)V"/>
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pManager$UpnpServiceResponseListener" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="onUpnpServiceAvailable(Ljava/util/List;Landroid/net/wifi/p2p/WifiP2pDevice;)V"/>
+ </class>
+ <class name="android/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfo" since="16">
+ <extends name="android/net/wifi/p2p/nsd/WifiP2pServiceInfo"/>
+ <method name="&lt;init>()V"/>
+ <method name="newInstance(Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfo;"/>
+ </class>
+ <class name="android/net/wifi/p2p/nsd/WifiP2pDnsSdServiceRequest" since="16">
+ <extends name="android/net/wifi/p2p/nsd/WifiP2pServiceRequest"/>
+ <method name="&lt;init>()V"/>
+ <method name="newInstance()Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceRequest;"/>
+ <method name="newInstance(Ljava/lang/String;)Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceRequest;"/>
+ <method name="newInstance(Ljava/lang/String;Ljava/lang/String;)Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceRequest;"/>
+ </class>
+ <class name="android/net/wifi/p2p/nsd/WifiP2pServiceInfo" since="16">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <field name="SERVICE_TYPE_ALL"/>
+ <field name="SERVICE_TYPE_BONJOUR"/>
+ <field name="SERVICE_TYPE_UPNP"/>
+ <field name="SERVICE_TYPE_VENDOR_SPECIFIC"/>
+ </class>
+ <class name="android/net/wifi/p2p/nsd/WifiP2pServiceRequest" since="16">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="newInstance(I)Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;"/>
+ <method name="newInstance(ILjava/lang/String;)Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;"/>
+ </class>
+ <class name="android/net/wifi/p2p/nsd/WifiP2pUpnpServiceInfo" since="16">
+ <extends name="android/net/wifi/p2p/nsd/WifiP2pServiceInfo"/>
+ <method name="&lt;init>()V"/>
+ <method name="newInstance(Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceInfo;"/>
+ </class>
+ <class name="android/net/wifi/p2p/nsd/WifiP2pUpnpServiceRequest" since="16">
+ <extends name="android/net/wifi/p2p/nsd/WifiP2pServiceRequest"/>
+ <method name="&lt;init>()V"/>
+ <method name="newInstance()Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceRequest;"/>
+ <method name="newInstance(Ljava/lang/String;)Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceRequest;"/>
+ </class>
+ <class name="android/nfc/FormatException" since="9">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" since="16"/>
+ </class>
+ <class name="android/nfc/NdefMessage" since="9">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/nfc/NdefRecord;[Landroid/nfc/NdefRecord;)V" since="16"/>
+ <method name="&lt;init>([B)V"/>
+ <method name="&lt;init>([Landroid/nfc/NdefRecord;)V"/>
+ <method name="getByteArrayLength()I" since="16"/>
+ <method name="getRecords()[Landroid/nfc/NdefRecord;"/>
+ <method name="toByteArray()[B"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/nfc/NdefRecord" since="9">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(S[B[B[B)V"/>
+ <method name="&lt;init>([B)V" deprecated="16"/>
+ <method name="createApplicationRecord(Ljava/lang/String;)Landroid/nfc/NdefRecord;" since="14"/>
+ <method name="createExternal(Ljava/lang/String;Ljava/lang/String;[B)Landroid/nfc/NdefRecord;" since="16"/>
+ <method name="createMime(Ljava/lang/String;[B)Landroid/nfc/NdefRecord;" since="16"/>
+ <method name="createTextRecord(Ljava/lang/String;Ljava/lang/String;)Landroid/nfc/NdefRecord;" since="21"/>
+ <method name="createUri(Landroid/net/Uri;)Landroid/nfc/NdefRecord;" since="14"/>
+ <method name="createUri(Ljava/lang/String;)Landroid/nfc/NdefRecord;" since="14"/>
+ <method name="getId()[B"/>
+ <method name="getPayload()[B"/>
+ <method name="getTnf()S"/>
+ <method name="getType()[B"/>
+ <method name="toByteArray()[B" deprecated="16"/>
+ <method name="toMimeType()Ljava/lang/String;" since="16"/>
+ <method name="toUri()Landroid/net/Uri;" since="16"/>
+ <field name="CREATOR"/>
+ <field name="RTD_ALTERNATIVE_CARRIER"/>
+ <field name="RTD_HANDOVER_CARRIER"/>
+ <field name="RTD_HANDOVER_REQUEST"/>
+ <field name="RTD_HANDOVER_SELECT"/>
+ <field name="RTD_SMART_POSTER"/>
+ <field name="RTD_TEXT"/>
+ <field name="RTD_URI"/>
+ <field name="TNF_ABSOLUTE_URI"/>
+ <field name="TNF_EMPTY"/>
+ <field name="TNF_EXTERNAL_TYPE"/>
+ <field name="TNF_MIME_MEDIA"/>
+ <field name="TNF_UNCHANGED"/>
+ <field name="TNF_UNKNOWN"/>
+ <field name="TNF_WELL_KNOWN"/>
+ </class>
+ <class name="android/nfc/NfcAdapter" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="disableForegroundDispatch(Landroid/app/Activity;)V" since="10"/>
+ <method name="disableForegroundNdefPush(Landroid/app/Activity;)V" since="10" deprecated="16"/>
+ <method name="disableReaderMode(Landroid/app/Activity;)V" since="19"/>
+ <method name="enableForegroundDispatch(Landroid/app/Activity;Landroid/app/PendingIntent;[Landroid/content/IntentFilter;[[Ljava/lang/String;)V" since="10"/>
+ <method name="enableForegroundNdefPush(Landroid/app/Activity;Landroid/nfc/NdefMessage;)V" since="10" deprecated="16"/>
+ <method name="enableReaderMode(Landroid/app/Activity;Landroid/nfc/NfcAdapter$ReaderCallback;ILandroid/os/Bundle;)V" since="19"/>
+ <method name="getDefaultAdapter()Landroid/nfc/NfcAdapter;" removed="16"/>
+ <method name="getDefaultAdapter(Landroid/content/Context;)Landroid/nfc/NfcAdapter;" since="10"/>
+ <method name="ignore(Landroid/nfc/Tag;ILandroid/nfc/NfcAdapter$OnTagRemovedListener;Landroid/os/Handler;)Z" since="24"/>
+ <method name="invokeBeam(Landroid/app/Activity;)Z" since="21"/>
+ <method name="isEnabled()Z"/>
+ <method name="isNdefPushEnabled()Z" since="16"/>
+ <method name="setBeamPushUris([Landroid/net/Uri;Landroid/app/Activity;)V" since="16"/>
+ <method name="setBeamPushUrisCallback(Landroid/nfc/NfcAdapter$CreateBeamUrisCallback;Landroid/app/Activity;)V" since="16"/>
+ <method name="setNdefPushMessage(Landroid/nfc/NdefMessage;Landroid/app/Activity;[Landroid/app/Activity;)V" since="14"/>
+ <method name="setNdefPushMessageCallback(Landroid/nfc/NfcAdapter$CreateNdefMessageCallback;Landroid/app/Activity;[Landroid/app/Activity;)V" since="14"/>
+ <method name="setOnNdefPushCompleteCallback(Landroid/nfc/NfcAdapter$OnNdefPushCompleteCallback;Landroid/app/Activity;[Landroid/app/Activity;)V" since="14"/>
+ <field name="ACTION_ADAPTER_STATE_CHANGED" since="18"/>
+ <field name="ACTION_NDEF_DISCOVERED" since="10"/>
+ <field name="ACTION_TAG_DISCOVERED"/>
+ <field name="ACTION_TECH_DISCOVERED" since="10"/>
+ <field name="EXTRA_ADAPTER_STATE" since="18"/>
+ <field name="EXTRA_ID"/>
+ <field name="EXTRA_NDEF_MESSAGES"/>
+ <field name="EXTRA_READER_PRESENCE_CHECK_DELAY" since="19"/>
+ <field name="EXTRA_TAG" since="10"/>
+ <field name="FLAG_READER_NFC_A" since="19"/>
+ <field name="FLAG_READER_NFC_B" since="19"/>
+ <field name="FLAG_READER_NFC_BARCODE" since="19"/>
+ <field name="FLAG_READER_NFC_F" since="19"/>
+ <field name="FLAG_READER_NFC_V" since="19"/>
+ <field name="FLAG_READER_NO_PLATFORM_SOUNDS" since="19"/>
+ <field name="FLAG_READER_SKIP_NDEF_CHECK" since="19"/>
+ <field name="STATE_OFF" since="18"/>
+ <field name="STATE_ON" since="18"/>
+ <field name="STATE_TURNING_OFF" since="18"/>
+ <field name="STATE_TURNING_ON" since="18"/>
+ </class>
+ <class name="android/nfc/NfcAdapter$CreateBeamUrisCallback" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="createBeamUris(Landroid/nfc/NfcEvent;)[Landroid/net/Uri;"/>
+ </class>
+ <class name="android/nfc/NfcAdapter$CreateNdefMessageCallback" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="createNdefMessage(Landroid/nfc/NfcEvent;)Landroid/nfc/NdefMessage;"/>
+ </class>
+ <class name="android/nfc/NfcAdapter$OnNdefPushCompleteCallback" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="onNdefPushComplete(Landroid/nfc/NfcEvent;)V"/>
+ </class>
+ <class name="android/nfc/NfcAdapter$OnTagRemovedListener" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="onTagRemoved()V"/>
+ </class>
+ <class name="android/nfc/NfcAdapter$ReaderCallback" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="onTagDiscovered(Landroid/nfc/Tag;)V"/>
+ </class>
+ <class name="android/nfc/NfcEvent" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="nfcAdapter"/>
+ <field name="peerLlcpMajorVersion" since="23"/>
+ <field name="peerLlcpMinorVersion" since="23"/>
+ </class>
+ <class name="android/nfc/NfcManager" since="10">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDefaultAdapter()Landroid/nfc/NfcAdapter;"/>
+ </class>
+ <class name="android/nfc/Tag" since="10">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getId()[B"/>
+ <method name="getTechList()[Ljava/lang/String;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/nfc/TagLostException" since="10">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/nfc/cardemulation/CardEmulation" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="categoryAllowsForegroundPreference(Ljava/lang/String;)Z" since="21"/>
+ <method name="getAidsForService(Landroid/content/ComponentName;Ljava/lang/String;)Ljava/util/List;" since="21"/>
+ <method name="getInstance(Landroid/nfc/NfcAdapter;)Landroid/nfc/cardemulation/CardEmulation;"/>
+ <method name="getSelectionModeForCategory(Ljava/lang/String;)I"/>
+ <method name="isDefaultServiceForAid(Landroid/content/ComponentName;Ljava/lang/String;)Z"/>
+ <method name="isDefaultServiceForCategory(Landroid/content/ComponentName;Ljava/lang/String;)Z"/>
+ <method name="registerAidsForService(Landroid/content/ComponentName;Ljava/lang/String;Ljava/util/List;)Z" since="21"/>
+ <method name="removeAidsForService(Landroid/content/ComponentName;Ljava/lang/String;)Z" since="21"/>
+ <method name="setPreferredService(Landroid/app/Activity;Landroid/content/ComponentName;)Z" since="21"/>
+ <method name="supportsAidPrefixRegistration()Z" since="21"/>
+ <method name="unsetPreferredService(Landroid/app/Activity;)Z" since="21"/>
+ <field name="ACTION_CHANGE_DEFAULT"/>
+ <field name="CATEGORY_OTHER"/>
+ <field name="CATEGORY_PAYMENT"/>
+ <field name="EXTRA_CATEGORY"/>
+ <field name="EXTRA_SERVICE_COMPONENT"/>
+ <field name="SELECTION_MODE_ALWAYS_ASK"/>
+ <field name="SELECTION_MODE_ASK_IF_CONFLICT"/>
+ <field name="SELECTION_MODE_PREFER_DEFAULT"/>
+ </class>
+ <class name="android/nfc/cardemulation/HostApduService" since="19">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="notifyUnhandled()V"/>
+ <method name="onDeactivated(I)V"/>
+ <method name="processCommandApdu([BLandroid/os/Bundle;)[B"/>
+ <method name="sendResponseApdu([B)V"/>
+ <field name="DEACTIVATION_DESELECTED"/>
+ <field name="DEACTIVATION_LINK_LOSS"/>
+ <field name="SERVICE_INTERFACE"/>
+ <field name="SERVICE_META_DATA"/>
+ </class>
+ <class name="android/nfc/cardemulation/HostNfcFService" since="24">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="onDeactivated(I)V"/>
+ <method name="processNfcFPacket([BLandroid/os/Bundle;)[B"/>
+ <method name="sendResponsePacket([B)V"/>
+ <field name="DEACTIVATION_LINK_LOSS"/>
+ <field name="SERVICE_INTERFACE"/>
+ <field name="SERVICE_META_DATA"/>
+ </class>
+ <class name="android/nfc/cardemulation/NfcFCardEmulation" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="disableService(Landroid/app/Activity;)Z"/>
+ <method name="enableService(Landroid/app/Activity;Landroid/content/ComponentName;)Z"/>
+ <method name="getInstance(Landroid/nfc/NfcAdapter;)Landroid/nfc/cardemulation/NfcFCardEmulation;"/>
+ <method name="getNfcid2ForService(Landroid/content/ComponentName;)Ljava/lang/String;"/>
+ <method name="getSystemCodeForService(Landroid/content/ComponentName;)Ljava/lang/String;"/>
+ <method name="registerSystemCodeForService(Landroid/content/ComponentName;Ljava/lang/String;)Z"/>
+ <method name="setNfcid2ForService(Landroid/content/ComponentName;Ljava/lang/String;)Z"/>
+ <method name="unregisterSystemCodeForService(Landroid/content/ComponentName;)Z"/>
+ </class>
+ <class name="android/nfc/cardemulation/OffHostApduService" since="19">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <field name="SERVICE_INTERFACE"/>
+ <field name="SERVICE_META_DATA"/>
+ </class>
+ <class name="android/nfc/tech/BasicTagTechnology" since="10">
+ <extends name="java/lang/Object"/>
+ <implements name="android/nfc/tech/TagTechnology"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/nfc/tech/IsoDep" since="10">
+ <extends name="android/nfc/tech/BasicTagTechnology"/>
+ <method name="&lt;init>()V"/>
+ <method name="get(Landroid/nfc/Tag;)Landroid/nfc/tech/IsoDep;"/>
+ <method name="getHiLayerResponse()[B"/>
+ <method name="getHistoricalBytes()[B"/>
+ <method name="getMaxTransceiveLength()I" since="14"/>
+ <method name="getTimeout()I" since="14"/>
+ <method name="isExtendedLengthApduSupported()Z" since="16"/>
+ <method name="setTimeout(I)V"/>
+ <method name="transceive([B)[B"/>
+ </class>
+ <class name="android/nfc/tech/MifareClassic" since="10">
+ <extends name="android/nfc/tech/BasicTagTechnology"/>
+ <method name="&lt;init>()V"/>
+ <method name="authenticateSectorWithKeyA(I[B)Z"/>
+ <method name="authenticateSectorWithKeyB(I[B)Z"/>
+ <method name="blockToSector(I)I"/>
+ <method name="decrement(II)V"/>
+ <method name="get(Landroid/nfc/Tag;)Landroid/nfc/tech/MifareClassic;"/>
+ <method name="getBlockCount()I"/>
+ <method name="getBlockCountInSector(I)I"/>
+ <method name="getMaxTransceiveLength()I" since="14"/>
+ <method name="getSectorCount()I"/>
+ <method name="getSize()I"/>
+ <method name="getTimeout()I" since="14"/>
+ <method name="getType()I"/>
+ <method name="increment(II)V"/>
+ <method name="readBlock(I)[B"/>
+ <method name="restore(I)V"/>
+ <method name="sectorToBlock(I)I"/>
+ <method name="setTimeout(I)V" since="14"/>
+ <method name="transceive([B)[B"/>
+ <method name="transfer(I)V"/>
+ <method name="writeBlock(I[B)V"/>
+ <field name="BLOCK_SIZE"/>
+ <field name="KEY_DEFAULT"/>
+ <field name="KEY_MIFARE_APPLICATION_DIRECTORY"/>
+ <field name="KEY_NFC_FORUM"/>
+ <field name="SIZE_1K"/>
+ <field name="SIZE_2K"/>
+ <field name="SIZE_4K"/>
+ <field name="SIZE_MINI"/>
+ <field name="TYPE_CLASSIC"/>
+ <field name="TYPE_PLUS"/>
+ <field name="TYPE_PRO"/>
+ <field name="TYPE_UNKNOWN"/>
+ </class>
+ <class name="android/nfc/tech/MifareUltralight" since="10">
+ <extends name="android/nfc/tech/BasicTagTechnology"/>
+ <method name="&lt;init>()V"/>
+ <method name="get(Landroid/nfc/Tag;)Landroid/nfc/tech/MifareUltralight;"/>
+ <method name="getMaxTransceiveLength()I" since="14"/>
+ <method name="getTimeout()I" since="14"/>
+ <method name="getType()I"/>
+ <method name="readPages(I)[B"/>
+ <method name="setTimeout(I)V" since="14"/>
+ <method name="transceive([B)[B"/>
+ <method name="writePage(I[B)V"/>
+ <field name="PAGE_SIZE"/>
+ <field name="TYPE_ULTRALIGHT"/>
+ <field name="TYPE_ULTRALIGHT_C"/>
+ <field name="TYPE_UNKNOWN"/>
+ </class>
+ <class name="android/nfc/tech/Ndef" since="10">
+ <extends name="android/nfc/tech/BasicTagTechnology"/>
+ <method name="&lt;init>()V"/>
+ <method name="canMakeReadOnly()Z"/>
+ <method name="get(Landroid/nfc/Tag;)Landroid/nfc/tech/Ndef;"/>
+ <method name="getCachedNdefMessage()Landroid/nfc/NdefMessage;"/>
+ <method name="getMaxSize()I"/>
+ <method name="getNdefMessage()Landroid/nfc/NdefMessage;"/>
+ <method name="getType()Ljava/lang/String;"/>
+ <method name="isWritable()Z"/>
+ <method name="makeReadOnly()Z"/>
+ <method name="writeNdefMessage(Landroid/nfc/NdefMessage;)V"/>
+ <field name="MIFARE_CLASSIC"/>
+ <field name="NFC_FORUM_TYPE_1"/>
+ <field name="NFC_FORUM_TYPE_2"/>
+ <field name="NFC_FORUM_TYPE_3"/>
+ <field name="NFC_FORUM_TYPE_4"/>
+ </class>
+ <class name="android/nfc/tech/NdefFormatable" since="10">
+ <extends name="android/nfc/tech/BasicTagTechnology"/>
+ <method name="&lt;init>()V"/>
+ <method name="format(Landroid/nfc/NdefMessage;)V"/>
+ <method name="formatReadOnly(Landroid/nfc/NdefMessage;)V"/>
+ <method name="get(Landroid/nfc/Tag;)Landroid/nfc/tech/NdefFormatable;"/>
+ </class>
+ <class name="android/nfc/tech/NfcA" since="10">
+ <extends name="android/nfc/tech/BasicTagTechnology"/>
+ <method name="&lt;init>()V"/>
+ <method name="get(Landroid/nfc/Tag;)Landroid/nfc/tech/NfcA;"/>
+ <method name="getAtqa()[B"/>
+ <method name="getMaxTransceiveLength()I" since="14"/>
+ <method name="getSak()S"/>
+ <method name="getTimeout()I" since="14"/>
+ <method name="setTimeout(I)V" since="14"/>
+ <method name="transceive([B)[B"/>
+ </class>
+ <class name="android/nfc/tech/NfcB" since="10">
+ <extends name="android/nfc/tech/BasicTagTechnology"/>
+ <method name="&lt;init>()V"/>
+ <method name="get(Landroid/nfc/Tag;)Landroid/nfc/tech/NfcB;"/>
+ <method name="getApplicationData()[B"/>
+ <method name="getMaxTransceiveLength()I" since="14"/>
+ <method name="getProtocolInfo()[B"/>
+ <method name="transceive([B)[B"/>
+ </class>
+ <class name="android/nfc/tech/NfcBarcode" since="17">
+ <extends name="android/nfc/tech/BasicTagTechnology"/>
+ <method name="&lt;init>()V"/>
+ <method name="get(Landroid/nfc/Tag;)Landroid/nfc/tech/NfcBarcode;"/>
+ <method name="getBarcode()[B"/>
+ <method name="getType()I"/>
+ <field name="TYPE_KOVIO"/>
+ <field name="TYPE_UNKNOWN"/>
+ </class>
+ <class name="android/nfc/tech/NfcF" since="10">
+ <extends name="android/nfc/tech/BasicTagTechnology"/>
+ <method name="&lt;init>()V"/>
+ <method name="get(Landroid/nfc/Tag;)Landroid/nfc/tech/NfcF;"/>
+ <method name="getManufacturer()[B"/>
+ <method name="getMaxTransceiveLength()I" since="14"/>
+ <method name="getSystemCode()[B"/>
+ <method name="getTimeout()I" since="14"/>
+ <method name="setTimeout(I)V" since="14"/>
+ <method name="transceive([B)[B"/>
+ </class>
+ <class name="android/nfc/tech/NfcV" since="10">
+ <extends name="android/nfc/tech/BasicTagTechnology"/>
+ <method name="&lt;init>()V"/>
+ <method name="get(Landroid/nfc/Tag;)Landroid/nfc/tech/NfcV;"/>
+ <method name="getDsfId()B"/>
+ <method name="getMaxTransceiveLength()I" since="14"/>
+ <method name="getResponseFlags()B"/>
+ <method name="transceive([B)[B"/>
+ </class>
+ <class name="android/nfc/tech/TagTechnology" since="10">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable"/>
+ <method name="connect()V"/>
+ <method name="getTag()Landroid/nfc/Tag;"/>
+ <method name="isConnected()Z"/>
+ </class>
+ <class name="android/opengl/EGL14" since="17">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="eglBindAPI(I)Z"/>
+ <method name="eglBindTexImage(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;I)Z"/>
+ <method name="eglChooseConfig(Landroid/opengl/EGLDisplay;[II[Landroid/opengl/EGLConfig;II[II)Z"/>
+ <method name="eglCopyBuffers(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;I)Z"/>
+ <method name="eglCreateContext(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;Landroid/opengl/EGLContext;[II)Landroid/opengl/EGLContext;"/>
+ <method name="eglCreatePbufferFromClientBuffer(Landroid/opengl/EGLDisplay;IILandroid/opengl/EGLConfig;[II)Landroid/opengl/EGLSurface;"/>
+ <method name="eglCreatePbufferSurface(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;[II)Landroid/opengl/EGLSurface;"/>
+ <method name="eglCreatePixmapSurface(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;I[II)Landroid/opengl/EGLSurface;" deprecated="26"/>
+ <method name="eglCreateWindowSurface(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;Ljava/lang/Object;[II)Landroid/opengl/EGLSurface;"/>
+ <method name="eglDestroyContext(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLContext;)Z"/>
+ <method name="eglDestroySurface(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;)Z"/>
+ <method name="eglGetConfigAttrib(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;I[II)Z"/>
+ <method name="eglGetConfigs(Landroid/opengl/EGLDisplay;[Landroid/opengl/EGLConfig;II[II)Z"/>
+ <method name="eglGetCurrentContext()Landroid/opengl/EGLContext;"/>
+ <method name="eglGetCurrentDisplay()Landroid/opengl/EGLDisplay;"/>
+ <method name="eglGetCurrentSurface(I)Landroid/opengl/EGLSurface;"/>
+ <method name="eglGetDisplay(I)Landroid/opengl/EGLDisplay;"/>
+ <method name="eglGetError()I"/>
+ <method name="eglInitialize(Landroid/opengl/EGLDisplay;[II[II)Z"/>
+ <method name="eglMakeCurrent(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;Landroid/opengl/EGLSurface;Landroid/opengl/EGLContext;)Z"/>
+ <method name="eglQueryAPI()I"/>
+ <method name="eglQueryContext(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLContext;I[II)Z"/>
+ <method name="eglQueryString(Landroid/opengl/EGLDisplay;I)Ljava/lang/String;"/>
+ <method name="eglQuerySurface(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;I[II)Z"/>
+ <method name="eglReleaseTexImage(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;I)Z"/>
+ <method name="eglReleaseThread()Z"/>
+ <method name="eglSurfaceAttrib(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;II)Z"/>
+ <method name="eglSwapBuffers(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;)Z"/>
+ <method name="eglSwapInterval(Landroid/opengl/EGLDisplay;I)Z"/>
+ <method name="eglTerminate(Landroid/opengl/EGLDisplay;)Z"/>
+ <method name="eglWaitClient()Z"/>
+ <method name="eglWaitGL()Z"/>
+ <method name="eglWaitNative(I)Z"/>
+ <field name="EGL_ALPHA_MASK_SIZE"/>
+ <field name="EGL_ALPHA_SIZE"/>
+ <field name="EGL_BACK_BUFFER"/>
+ <field name="EGL_BAD_ACCESS"/>
+ <field name="EGL_BAD_ALLOC"/>
+ <field name="EGL_BAD_ATTRIBUTE"/>
+ <field name="EGL_BAD_CONFIG"/>
+ <field name="EGL_BAD_CONTEXT"/>
+ <field name="EGL_BAD_CURRENT_SURFACE"/>
+ <field name="EGL_BAD_DISPLAY"/>
+ <field name="EGL_BAD_MATCH"/>
+ <field name="EGL_BAD_NATIVE_PIXMAP"/>
+ <field name="EGL_BAD_NATIVE_WINDOW"/>
+ <field name="EGL_BAD_PARAMETER"/>
+ <field name="EGL_BAD_SURFACE"/>
+ <field name="EGL_BIND_TO_TEXTURE_RGB"/>
+ <field name="EGL_BIND_TO_TEXTURE_RGBA"/>
+ <field name="EGL_BLUE_SIZE"/>
+ <field name="EGL_BUFFER_DESTROYED"/>
+ <field name="EGL_BUFFER_PRESERVED"/>
+ <field name="EGL_BUFFER_SIZE"/>
+ <field name="EGL_CLIENT_APIS"/>
+ <field name="EGL_COLOR_BUFFER_TYPE"/>
+ <field name="EGL_CONFIG_CAVEAT"/>
+ <field name="EGL_CONFIG_ID"/>
+ <field name="EGL_CONFORMANT"/>
+ <field name="EGL_CONTEXT_CLIENT_TYPE"/>
+ <field name="EGL_CONTEXT_CLIENT_VERSION"/>
+ <field name="EGL_CONTEXT_LOST"/>
+ <field name="EGL_CORE_NATIVE_ENGINE"/>
+ <field name="EGL_DEFAULT_DISPLAY"/>
+ <field name="EGL_DEPTH_SIZE"/>
+ <field name="EGL_DISPLAY_SCALING"/>
+ <field name="EGL_DRAW"/>
+ <field name="EGL_EXTENSIONS"/>
+ <field name="EGL_FALSE"/>
+ <field name="EGL_GREEN_SIZE"/>
+ <field name="EGL_HEIGHT"/>
+ <field name="EGL_HORIZONTAL_RESOLUTION"/>
+ <field name="EGL_LARGEST_PBUFFER"/>
+ <field name="EGL_LEVEL"/>
+ <field name="EGL_LUMINANCE_BUFFER"/>
+ <field name="EGL_LUMINANCE_SIZE"/>
+ <field name="EGL_MATCH_NATIVE_PIXMAP"/>
+ <field name="EGL_MAX_PBUFFER_HEIGHT"/>
+ <field name="EGL_MAX_PBUFFER_PIXELS"/>
+ <field name="EGL_MAX_PBUFFER_WIDTH"/>
+ <field name="EGL_MAX_SWAP_INTERVAL"/>
+ <field name="EGL_MIN_SWAP_INTERVAL"/>
+ <field name="EGL_MIPMAP_LEVEL"/>
+ <field name="EGL_MIPMAP_TEXTURE"/>
+ <field name="EGL_MULTISAMPLE_RESOLVE"/>
+ <field name="EGL_MULTISAMPLE_RESOLVE_BOX"/>
+ <field name="EGL_MULTISAMPLE_RESOLVE_BOX_BIT"/>
+ <field name="EGL_MULTISAMPLE_RESOLVE_DEFAULT"/>
+ <field name="EGL_NATIVE_RENDERABLE"/>
+ <field name="EGL_NATIVE_VISUAL_ID"/>
+ <field name="EGL_NATIVE_VISUAL_TYPE"/>
+ <field name="EGL_NONE"/>
+ <field name="EGL_NON_CONFORMANT_CONFIG"/>
+ <field name="EGL_NOT_INITIALIZED"/>
+ <field name="EGL_NO_CONTEXT"/>
+ <field name="EGL_NO_DISPLAY"/>
+ <field name="EGL_NO_SURFACE"/>
+ <field name="EGL_NO_TEXTURE"/>
+ <field name="EGL_OPENGL_API"/>
+ <field name="EGL_OPENGL_BIT"/>
+ <field name="EGL_OPENGL_ES2_BIT"/>
+ <field name="EGL_OPENGL_ES_API"/>
+ <field name="EGL_OPENGL_ES_BIT"/>
+ <field name="EGL_OPENVG_API"/>
+ <field name="EGL_OPENVG_BIT"/>
+ <field name="EGL_OPENVG_IMAGE"/>
+ <field name="EGL_PBUFFER_BIT"/>
+ <field name="EGL_PIXEL_ASPECT_RATIO"/>
+ <field name="EGL_PIXMAP_BIT"/>
+ <field name="EGL_READ"/>
+ <field name="EGL_RED_SIZE"/>
+ <field name="EGL_RENDERABLE_TYPE"/>
+ <field name="EGL_RENDER_BUFFER"/>
+ <field name="EGL_RGB_BUFFER"/>
+ <field name="EGL_SAMPLES"/>
+ <field name="EGL_SAMPLE_BUFFERS"/>
+ <field name="EGL_SINGLE_BUFFER"/>
+ <field name="EGL_SLOW_CONFIG"/>
+ <field name="EGL_STENCIL_SIZE"/>
+ <field name="EGL_SUCCESS"/>
+ <field name="EGL_SURFACE_TYPE"/>
+ <field name="EGL_SWAP_BEHAVIOR"/>
+ <field name="EGL_SWAP_BEHAVIOR_PRESERVED_BIT"/>
+ <field name="EGL_TEXTURE_2D"/>
+ <field name="EGL_TEXTURE_FORMAT"/>
+ <field name="EGL_TEXTURE_RGB"/>
+ <field name="EGL_TEXTURE_RGBA"/>
+ <field name="EGL_TEXTURE_TARGET"/>
+ <field name="EGL_TRANSPARENT_BLUE_VALUE"/>
+ <field name="EGL_TRANSPARENT_GREEN_VALUE"/>
+ <field name="EGL_TRANSPARENT_RED_VALUE"/>
+ <field name="EGL_TRANSPARENT_RGB"/>
+ <field name="EGL_TRANSPARENT_TYPE"/>
+ <field name="EGL_TRUE"/>
+ <field name="EGL_VENDOR"/>
+ <field name="EGL_VERSION"/>
+ <field name="EGL_VERTICAL_RESOLUTION"/>
+ <field name="EGL_VG_ALPHA_FORMAT"/>
+ <field name="EGL_VG_ALPHA_FORMAT_NONPRE"/>
+ <field name="EGL_VG_ALPHA_FORMAT_PRE"/>
+ <field name="EGL_VG_ALPHA_FORMAT_PRE_BIT"/>
+ <field name="EGL_VG_COLORSPACE"/>
+ <field name="EGL_VG_COLORSPACE_LINEAR"/>
+ <field name="EGL_VG_COLORSPACE_LINEAR_BIT"/>
+ <field name="EGL_VG_COLORSPACE_sRGB"/>
+ <field name="EGL_WIDTH"/>
+ <field name="EGL_WINDOW_BIT"/>
+ </class>
+ <class name="android/opengl/EGLConfig" since="17">
+ <extends name="android/opengl/EGLObjectHandle"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/opengl/EGLContext" since="17">
+ <extends name="android/opengl/EGLObjectHandle"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/opengl/EGLDisplay" since="17">
+ <extends name="android/opengl/EGLObjectHandle"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/opengl/EGLExt" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="eglPresentationTimeANDROID(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;J)Z"/>
+ <field name="EGL_CONTEXT_FLAGS_KHR"/>
+ <field name="EGL_CONTEXT_MAJOR_VERSION_KHR"/>
+ <field name="EGL_CONTEXT_MINOR_VERSION_KHR"/>
+ <field name="EGL_OPENGL_ES3_BIT_KHR"/>
+ <field name="EGL_RECORDABLE_ANDROID" since="26"/>
+ </class>
+ <class name="android/opengl/EGLObjectHandle" since="17">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(I)V" deprecated="21"/>
+ <method name="&lt;init>(J)V" since="21"/>
+ <method name="getHandle()I" deprecated="21"/>
+ <method name="getNativeHandle()J" since="21"/>
+ </class>
+ <class name="android/opengl/EGLSurface" since="17">
+ <extends name="android/opengl/EGLObjectHandle"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/opengl/ETC1" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="decodeBlock(Ljava/nio/Buffer;Ljava/nio/Buffer;)V"/>
+ <method name="decodeImage(Ljava/nio/Buffer;Ljava/nio/Buffer;IIII)V"/>
+ <method name="encodeBlock(Ljava/nio/Buffer;ILjava/nio/Buffer;)V"/>
+ <method name="encodeImage(Ljava/nio/Buffer;IIIILjava/nio/Buffer;)V"/>
+ <method name="formatHeader(Ljava/nio/Buffer;II)V"/>
+ <method name="getEncodedDataSize(II)I"/>
+ <method name="getHeight(Ljava/nio/Buffer;)I"/>
+ <method name="getWidth(Ljava/nio/Buffer;)I"/>
+ <method name="isValid(Ljava/nio/Buffer;)Z"/>
+ <field name="DECODED_BLOCK_SIZE"/>
+ <field name="ENCODED_BLOCK_SIZE"/>
+ <field name="ETC1_RGB8_OES"/>
+ <field name="ETC_PKM_HEADER_SIZE"/>
+ </class>
+ <class name="android/opengl/ETC1Util" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="compressTexture(Ljava/nio/Buffer;IIII)Landroid/opengl/ETC1Util$ETC1Texture;"/>
+ <method name="createTexture(Ljava/io/InputStream;)Landroid/opengl/ETC1Util$ETC1Texture;"/>
+ <method name="isETC1Supported()Z"/>
+ <method name="loadTexture(IIIIILandroid/opengl/ETC1Util$ETC1Texture;)V"/>
+ <method name="loadTexture(IIIIILjava/io/InputStream;)V"/>
+ <method name="writeTexture(Landroid/opengl/ETC1Util$ETC1Texture;Ljava/io/OutputStream;)V"/>
+ </class>
+ <class name="android/opengl/ETC1Util$ETC1Texture" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(IILjava/nio/ByteBuffer;)V"/>
+ <method name="getData()Ljava/nio/ByteBuffer;"/>
+ <method name="getHeight()I"/>
+ <method name="getWidth()I"/>
+ </class>
+ <class name="android/opengl/GLDebugHelper" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="wrap(Ljavax/microedition/khronos/egl/EGL;ILjava/io/Writer;)Ljavax/microedition/khronos/egl/EGL;"/>
+ <method name="wrap(Ljavax/microedition/khronos/opengles/GL;ILjava/io/Writer;)Ljavax/microedition/khronos/opengles/GL;"/>
+ <field name="CONFIG_CHECK_GL_ERROR"/>
+ <field name="CONFIG_CHECK_THREAD"/>
+ <field name="CONFIG_LOG_ARGUMENT_NAMES"/>
+ <field name="ERROR_WRONG_THREAD"/>
+ </class>
+ <class name="android/opengl/GLES10" since="4">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="glActiveTexture(I)V"/>
+ <method name="glAlphaFunc(IF)V"/>
+ <method name="glAlphaFuncx(II)V"/>
+ <method name="glBindTexture(II)V"/>
+ <method name="glBlendFunc(II)V"/>
+ <method name="glClear(I)V"/>
+ <method name="glClearColor(FFFF)V"/>
+ <method name="glClearColorx(IIII)V"/>
+ <method name="glClearDepthf(F)V"/>
+ <method name="glClearDepthx(I)V"/>
+ <method name="glClearStencil(I)V"/>
+ <method name="glClientActiveTexture(I)V"/>
+ <method name="glColor4f(FFFF)V"/>
+ <method name="glColor4x(IIII)V"/>
+ <method name="glColorMask(ZZZZ)V"/>
+ <method name="glColorPointer(IIILjava/nio/Buffer;)V"/>
+ <method name="glCompressedTexImage2D(IIIIIIILjava/nio/Buffer;)V"/>
+ <method name="glCompressedTexSubImage2D(IIIIIIIILjava/nio/Buffer;)V"/>
+ <method name="glCopyTexImage2D(IIIIIIII)V"/>
+ <method name="glCopyTexSubImage2D(IIIIIIII)V"/>
+ <method name="glCullFace(I)V"/>
+ <method name="glDeleteTextures(ILjava/nio/IntBuffer;)V"/>
+ <method name="glDeleteTextures(I[II)V"/>
+ <method name="glDepthFunc(I)V"/>
+ <method name="glDepthMask(Z)V"/>
+ <method name="glDepthRangef(FF)V"/>
+ <method name="glDepthRangex(II)V"/>
+ <method name="glDisable(I)V"/>
+ <method name="glDisableClientState(I)V"/>
+ <method name="glDrawArrays(III)V"/>
+ <method name="glDrawElements(IIILjava/nio/Buffer;)V"/>
+ <method name="glEnable(I)V"/>
+ <method name="glEnableClientState(I)V"/>
+ <method name="glFinish()V"/>
+ <method name="glFlush()V"/>
+ <method name="glFogf(IF)V"/>
+ <method name="glFogfv(ILjava/nio/FloatBuffer;)V"/>
+ <method name="glFogfv(I[FI)V"/>
+ <method name="glFogx(II)V"/>
+ <method name="glFogxv(ILjava/nio/IntBuffer;)V"/>
+ <method name="glFogxv(I[II)V"/>
+ <method name="glFrontFace(I)V"/>
+ <method name="glFrustumf(FFFFFF)V"/>
+ <method name="glFrustumx(IIIIII)V"/>
+ <method name="glGenTextures(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGenTextures(I[II)V"/>
+ <method name="glGetError()I"/>
+ <method name="glGetIntegerv(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGetIntegerv(I[II)V"/>
+ <method name="glGetString(I)Ljava/lang/String;"/>
+ <method name="glHint(II)V"/>
+ <method name="glLightModelf(IF)V"/>
+ <method name="glLightModelfv(ILjava/nio/FloatBuffer;)V"/>
+ <method name="glLightModelfv(I[FI)V"/>
+ <method name="glLightModelx(II)V"/>
+ <method name="glLightModelxv(ILjava/nio/IntBuffer;)V"/>
+ <method name="glLightModelxv(I[II)V"/>
+ <method name="glLightf(IIF)V"/>
+ <method name="glLightfv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glLightfv(II[FI)V"/>
+ <method name="glLightx(III)V"/>
+ <method name="glLightxv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glLightxv(II[II)V"/>
+ <method name="glLineWidth(F)V"/>
+ <method name="glLineWidthx(I)V"/>
+ <method name="glLoadIdentity()V"/>
+ <method name="glLoadMatrixf(Ljava/nio/FloatBuffer;)V"/>
+ <method name="glLoadMatrixf([FI)V"/>
+ <method name="glLoadMatrixx(Ljava/nio/IntBuffer;)V"/>
+ <method name="glLoadMatrixx([II)V"/>
+ <method name="glLogicOp(I)V"/>
+ <method name="glMaterialf(IIF)V"/>
+ <method name="glMaterialfv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glMaterialfv(II[FI)V"/>
+ <method name="glMaterialx(III)V"/>
+ <method name="glMaterialxv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glMaterialxv(II[II)V"/>
+ <method name="glMatrixMode(I)V"/>
+ <method name="glMultMatrixf(Ljava/nio/FloatBuffer;)V"/>
+ <method name="glMultMatrixf([FI)V"/>
+ <method name="glMultMatrixx(Ljava/nio/IntBuffer;)V"/>
+ <method name="glMultMatrixx([II)V"/>
+ <method name="glMultiTexCoord4f(IFFFF)V"/>
+ <method name="glMultiTexCoord4x(IIIII)V"/>
+ <method name="glNormal3f(FFF)V"/>
+ <method name="glNormal3x(III)V"/>
+ <method name="glNormalPointer(IILjava/nio/Buffer;)V"/>
+ <method name="glOrthof(FFFFFF)V"/>
+ <method name="glOrthox(IIIIII)V"/>
+ <method name="glPixelStorei(II)V"/>
+ <method name="glPointSize(F)V"/>
+ <method name="glPointSizex(I)V"/>
+ <method name="glPolygonOffset(FF)V"/>
+ <method name="glPolygonOffsetx(II)V"/>
+ <method name="glPopMatrix()V"/>
+ <method name="glPushMatrix()V"/>
+ <method name="glReadPixels(IIIIIILjava/nio/Buffer;)V"/>
+ <method name="glRotatef(FFFF)V"/>
+ <method name="glRotatex(IIII)V"/>
+ <method name="glSampleCoverage(FZ)V"/>
+ <method name="glSampleCoveragex(IZ)V"/>
+ <method name="glScalef(FFF)V"/>
+ <method name="glScalex(III)V"/>
+ <method name="glScissor(IIII)V"/>
+ <method name="glShadeModel(I)V"/>
+ <method name="glStencilFunc(III)V"/>
+ <method name="glStencilMask(I)V"/>
+ <method name="glStencilOp(III)V"/>
+ <method name="glTexCoordPointer(IIILjava/nio/Buffer;)V"/>
+ <method name="glTexEnvf(IIF)V"/>
+ <method name="glTexEnvfv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glTexEnvfv(II[FI)V"/>
+ <method name="glTexEnvx(III)V"/>
+ <method name="glTexEnvxv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glTexEnvxv(II[II)V"/>
+ <method name="glTexImage2D(IIIIIIIILjava/nio/Buffer;)V"/>
+ <method name="glTexParameterf(IIF)V"/>
+ <method name="glTexParameterx(III)V"/>
+ <method name="glTexSubImage2D(IIIIIIIILjava/nio/Buffer;)V"/>
+ <method name="glTranslatef(FFF)V"/>
+ <method name="glTranslatex(III)V"/>
+ <method name="glVertexPointer(IIILjava/nio/Buffer;)V"/>
+ <method name="glViewport(IIII)V"/>
+ <field name="GL_ADD"/>
+ <field name="GL_ALIASED_LINE_WIDTH_RANGE"/>
+ <field name="GL_ALIASED_POINT_SIZE_RANGE"/>
+ <field name="GL_ALPHA"/>
+ <field name="GL_ALPHA_BITS"/>
+ <field name="GL_ALPHA_TEST"/>
+ <field name="GL_ALWAYS"/>
+ <field name="GL_AMBIENT"/>
+ <field name="GL_AMBIENT_AND_DIFFUSE"/>
+ <field name="GL_AND"/>
+ <field name="GL_AND_INVERTED"/>
+ <field name="GL_AND_REVERSE"/>
+ <field name="GL_BACK"/>
+ <field name="GL_BLEND"/>
+ <field name="GL_BLUE_BITS"/>
+ <field name="GL_BYTE"/>
+ <field name="GL_CCW"/>
+ <field name="GL_CLAMP_TO_EDGE"/>
+ <field name="GL_CLEAR"/>
+ <field name="GL_COLOR_ARRAY"/>
+ <field name="GL_COLOR_BUFFER_BIT"/>
+ <field name="GL_COLOR_LOGIC_OP"/>
+ <field name="GL_COLOR_MATERIAL"/>
+ <field name="GL_COMPRESSED_TEXTURE_FORMATS"/>
+ <field name="GL_CONSTANT_ATTENUATION"/>
+ <field name="GL_COPY"/>
+ <field name="GL_COPY_INVERTED"/>
+ <field name="GL_CULL_FACE"/>
+ <field name="GL_CW"/>
+ <field name="GL_DECAL"/>
+ <field name="GL_DECR"/>
+ <field name="GL_DEPTH_BITS"/>
+ <field name="GL_DEPTH_BUFFER_BIT"/>
+ <field name="GL_DEPTH_TEST"/>
+ <field name="GL_DIFFUSE"/>
+ <field name="GL_DITHER"/>
+ <field name="GL_DONT_CARE"/>
+ <field name="GL_DST_ALPHA"/>
+ <field name="GL_DST_COLOR"/>
+ <field name="GL_EMISSION"/>
+ <field name="GL_EQUAL"/>
+ <field name="GL_EQUIV"/>
+ <field name="GL_EXP"/>
+ <field name="GL_EXP2"/>
+ <field name="GL_EXTENSIONS"/>
+ <field name="GL_FALSE"/>
+ <field name="GL_FASTEST"/>
+ <field name="GL_FIXED"/>
+ <field name="GL_FLAT"/>
+ <field name="GL_FLOAT"/>
+ <field name="GL_FOG"/>
+ <field name="GL_FOG_COLOR"/>
+ <field name="GL_FOG_DENSITY"/>
+ <field name="GL_FOG_END"/>
+ <field name="GL_FOG_HINT"/>
+ <field name="GL_FOG_MODE"/>
+ <field name="GL_FOG_START"/>
+ <field name="GL_FRONT"/>
+ <field name="GL_FRONT_AND_BACK"/>
+ <field name="GL_GEQUAL"/>
+ <field name="GL_GREATER"/>
+ <field name="GL_GREEN_BITS"/>
+ <field name="GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES"/>
+ <field name="GL_IMPLEMENTATION_COLOR_READ_TYPE_OES"/>
+ <field name="GL_INCR"/>
+ <field name="GL_INVALID_ENUM"/>
+ <field name="GL_INVALID_OPERATION"/>
+ <field name="GL_INVALID_VALUE"/>
+ <field name="GL_INVERT"/>
+ <field name="GL_KEEP"/>
+ <field name="GL_LEQUAL"/>
+ <field name="GL_LESS"/>
+ <field name="GL_LIGHT0"/>
+ <field name="GL_LIGHT1"/>
+ <field name="GL_LIGHT2"/>
+ <field name="GL_LIGHT3"/>
+ <field name="GL_LIGHT4"/>
+ <field name="GL_LIGHT5"/>
+ <field name="GL_LIGHT6"/>
+ <field name="GL_LIGHT7"/>
+ <field name="GL_LIGHTING"/>
+ <field name="GL_LIGHT_MODEL_AMBIENT"/>
+ <field name="GL_LIGHT_MODEL_TWO_SIDE"/>
+ <field name="GL_LINEAR"/>
+ <field name="GL_LINEAR_ATTENUATION"/>
+ <field name="GL_LINEAR_MIPMAP_LINEAR"/>
+ <field name="GL_LINEAR_MIPMAP_NEAREST"/>
+ <field name="GL_LINES"/>
+ <field name="GL_LINE_LOOP"/>
+ <field name="GL_LINE_SMOOTH"/>
+ <field name="GL_LINE_SMOOTH_HINT"/>
+ <field name="GL_LINE_STRIP"/>
+ <field name="GL_LUMINANCE"/>
+ <field name="GL_LUMINANCE_ALPHA"/>
+ <field name="GL_MAX_ELEMENTS_INDICES"/>
+ <field name="GL_MAX_ELEMENTS_VERTICES"/>
+ <field name="GL_MAX_LIGHTS"/>
+ <field name="GL_MAX_MODELVIEW_STACK_DEPTH"/>
+ <field name="GL_MAX_PROJECTION_STACK_DEPTH"/>
+ <field name="GL_MAX_TEXTURE_SIZE"/>
+ <field name="GL_MAX_TEXTURE_STACK_DEPTH"/>
+ <field name="GL_MAX_TEXTURE_UNITS"/>
+ <field name="GL_MAX_VIEWPORT_DIMS"/>
+ <field name="GL_MODELVIEW"/>
+ <field name="GL_MODULATE"/>
+ <field name="GL_MULTISAMPLE"/>
+ <field name="GL_NAND"/>
+ <field name="GL_NEAREST"/>
+ <field name="GL_NEAREST_MIPMAP_LINEAR"/>
+ <field name="GL_NEAREST_MIPMAP_NEAREST"/>
+ <field name="GL_NEVER"/>
+ <field name="GL_NICEST"/>
+ <field name="GL_NOOP"/>
+ <field name="GL_NOR"/>
+ <field name="GL_NORMALIZE"/>
+ <field name="GL_NORMAL_ARRAY"/>
+ <field name="GL_NOTEQUAL"/>
+ <field name="GL_NO_ERROR"/>
+ <field name="GL_NUM_COMPRESSED_TEXTURE_FORMATS"/>
+ <field name="GL_ONE"/>
+ <field name="GL_ONE_MINUS_DST_ALPHA"/>
+ <field name="GL_ONE_MINUS_DST_COLOR"/>
+ <field name="GL_ONE_MINUS_SRC_ALPHA"/>
+ <field name="GL_ONE_MINUS_SRC_COLOR"/>
+ <field name="GL_OR"/>
+ <field name="GL_OR_INVERTED"/>
+ <field name="GL_OR_REVERSE"/>
+ <field name="GL_OUT_OF_MEMORY"/>
+ <field name="GL_PACK_ALIGNMENT"/>
+ <field name="GL_PALETTE4_R5_G6_B5_OES"/>
+ <field name="GL_PALETTE4_RGB5_A1_OES"/>
+ <field name="GL_PALETTE4_RGB8_OES"/>
+ <field name="GL_PALETTE4_RGBA4_OES"/>
+ <field name="GL_PALETTE4_RGBA8_OES"/>
+ <field name="GL_PALETTE8_R5_G6_B5_OES"/>
+ <field name="GL_PALETTE8_RGB5_A1_OES"/>
+ <field name="GL_PALETTE8_RGB8_OES"/>
+ <field name="GL_PALETTE8_RGBA4_OES"/>
+ <field name="GL_PALETTE8_RGBA8_OES"/>
+ <field name="GL_PERSPECTIVE_CORRECTION_HINT"/>
+ <field name="GL_POINTS"/>
+ <field name="GL_POINT_FADE_THRESHOLD_SIZE"/>
+ <field name="GL_POINT_SIZE"/>
+ <field name="GL_POINT_SMOOTH"/>
+ <field name="GL_POINT_SMOOTH_HINT"/>
+ <field name="GL_POLYGON_OFFSET_FILL"/>
+ <field name="GL_POLYGON_SMOOTH_HINT"/>
+ <field name="GL_POSITION"/>
+ <field name="GL_PROJECTION"/>
+ <field name="GL_QUADRATIC_ATTENUATION"/>
+ <field name="GL_RED_BITS"/>
+ <field name="GL_RENDERER"/>
+ <field name="GL_REPEAT"/>
+ <field name="GL_REPLACE"/>
+ <field name="GL_RESCALE_NORMAL"/>
+ <field name="GL_RGB"/>
+ <field name="GL_RGBA"/>
+ <field name="GL_SAMPLE_ALPHA_TO_COVERAGE"/>
+ <field name="GL_SAMPLE_ALPHA_TO_ONE"/>
+ <field name="GL_SAMPLE_COVERAGE"/>
+ <field name="GL_SCISSOR_TEST"/>
+ <field name="GL_SET"/>
+ <field name="GL_SHININESS"/>
+ <field name="GL_SHORT"/>
+ <field name="GL_SMOOTH"/>
+ <field name="GL_SMOOTH_LINE_WIDTH_RANGE"/>
+ <field name="GL_SMOOTH_POINT_SIZE_RANGE"/>
+ <field name="GL_SPECULAR"/>
+ <field name="GL_SPOT_CUTOFF"/>
+ <field name="GL_SPOT_DIRECTION"/>
+ <field name="GL_SPOT_EXPONENT"/>
+ <field name="GL_SRC_ALPHA"/>
+ <field name="GL_SRC_ALPHA_SATURATE"/>
+ <field name="GL_SRC_COLOR"/>
+ <field name="GL_STACK_OVERFLOW"/>
+ <field name="GL_STACK_UNDERFLOW"/>
+ <field name="GL_STENCIL_BITS"/>
+ <field name="GL_STENCIL_BUFFER_BIT"/>
+ <field name="GL_STENCIL_TEST"/>
+ <field name="GL_SUBPIXEL_BITS"/>
+ <field name="GL_TEXTURE"/>
+ <field name="GL_TEXTURE0"/>
+ <field name="GL_TEXTURE1"/>
+ <field name="GL_TEXTURE10"/>
+ <field name="GL_TEXTURE11"/>
+ <field name="GL_TEXTURE12"/>
+ <field name="GL_TEXTURE13"/>
+ <field name="GL_TEXTURE14"/>
+ <field name="GL_TEXTURE15"/>
+ <field name="GL_TEXTURE16"/>
+ <field name="GL_TEXTURE17"/>
+ <field name="GL_TEXTURE18"/>
+ <field name="GL_TEXTURE19"/>
+ <field name="GL_TEXTURE2"/>
+ <field name="GL_TEXTURE20"/>
+ <field name="GL_TEXTURE21"/>
+ <field name="GL_TEXTURE22"/>
+ <field name="GL_TEXTURE23"/>
+ <field name="GL_TEXTURE24"/>
+ <field name="GL_TEXTURE25"/>
+ <field name="GL_TEXTURE26"/>
+ <field name="GL_TEXTURE27"/>
+ <field name="GL_TEXTURE28"/>
+ <field name="GL_TEXTURE29"/>
+ <field name="GL_TEXTURE3"/>
+ <field name="GL_TEXTURE30"/>
+ <field name="GL_TEXTURE31"/>
+ <field name="GL_TEXTURE4"/>
+ <field name="GL_TEXTURE5"/>
+ <field name="GL_TEXTURE6"/>
+ <field name="GL_TEXTURE7"/>
+ <field name="GL_TEXTURE8"/>
+ <field name="GL_TEXTURE9"/>
+ <field name="GL_TEXTURE_2D"/>
+ <field name="GL_TEXTURE_COORD_ARRAY"/>
+ <field name="GL_TEXTURE_ENV"/>
+ <field name="GL_TEXTURE_ENV_COLOR"/>
+ <field name="GL_TEXTURE_ENV_MODE"/>
+ <field name="GL_TEXTURE_MAG_FILTER"/>
+ <field name="GL_TEXTURE_MIN_FILTER"/>
+ <field name="GL_TEXTURE_WRAP_S"/>
+ <field name="GL_TEXTURE_WRAP_T"/>
+ <field name="GL_TRIANGLES"/>
+ <field name="GL_TRIANGLE_FAN"/>
+ <field name="GL_TRIANGLE_STRIP"/>
+ <field name="GL_TRUE"/>
+ <field name="GL_UNPACK_ALIGNMENT"/>
+ <field name="GL_UNSIGNED_BYTE"/>
+ <field name="GL_UNSIGNED_SHORT"/>
+ <field name="GL_UNSIGNED_SHORT_4_4_4_4"/>
+ <field name="GL_UNSIGNED_SHORT_5_5_5_1"/>
+ <field name="GL_UNSIGNED_SHORT_5_6_5"/>
+ <field name="GL_VENDOR"/>
+ <field name="GL_VERSION"/>
+ <field name="GL_VERTEX_ARRAY"/>
+ <field name="GL_XOR"/>
+ <field name="GL_ZERO"/>
+ </class>
+ <class name="android/opengl/GLES10Ext" since="4">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="glQueryMatrixxOES(Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;)I"/>
+ <method name="glQueryMatrixxOES([II[II)I"/>
+ </class>
+ <class name="android/opengl/GLES11" since="4">
+ <extends name="android/opengl/GLES10"/>
+ <method name="&lt;init>()V"/>
+ <method name="glBindBuffer(II)V"/>
+ <method name="glBufferData(IILjava/nio/Buffer;I)V"/>
+ <method name="glBufferSubData(IIILjava/nio/Buffer;)V"/>
+ <method name="glClipPlanef(ILjava/nio/FloatBuffer;)V"/>
+ <method name="glClipPlanef(I[FI)V"/>
+ <method name="glClipPlanex(ILjava/nio/IntBuffer;)V"/>
+ <method name="glClipPlanex(I[II)V"/>
+ <method name="glColor4ub(BBBB)V"/>
+ <method name="glColorPointer(IIII)V"/>
+ <method name="glDeleteBuffers(ILjava/nio/IntBuffer;)V"/>
+ <method name="glDeleteBuffers(I[II)V"/>
+ <method name="glDrawElements(IIII)V"/>
+ <method name="glGenBuffers(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGenBuffers(I[II)V"/>
+ <method name="glGetBooleanv(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGetBooleanv(I[ZI)V"/>
+ <method name="glGetBufferParameteriv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetBufferParameteriv(II[II)V"/>
+ <method name="glGetClipPlanef(ILjava/nio/FloatBuffer;)V"/>
+ <method name="glGetClipPlanef(I[FI)V"/>
+ <method name="glGetClipPlanex(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGetClipPlanex(I[II)V"/>
+ <method name="glGetFixedv(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGetFixedv(I[II)V"/>
+ <method name="glGetFloatv(ILjava/nio/FloatBuffer;)V"/>
+ <method name="glGetFloatv(I[FI)V"/>
+ <method name="glGetLightfv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glGetLightfv(II[FI)V"/>
+ <method name="glGetLightxv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetLightxv(II[II)V"/>
+ <method name="glGetMaterialfv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glGetMaterialfv(II[FI)V"/>
+ <method name="glGetMaterialxv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetMaterialxv(II[II)V"/>
+ <method name="glGetTexEnvfv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glGetTexEnvfv(II[FI)V"/>
+ <method name="glGetTexEnviv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetTexEnviv(II[II)V"/>
+ <method name="glGetTexEnvxv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetTexEnvxv(II[II)V"/>
+ <method name="glGetTexParameterfv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glGetTexParameterfv(II[FI)V"/>
+ <method name="glGetTexParameteriv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetTexParameteriv(II[II)V"/>
+ <method name="glGetTexParameterxv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetTexParameterxv(II[II)V"/>
+ <method name="glIsBuffer(I)Z"/>
+ <method name="glIsEnabled(I)Z"/>
+ <method name="glIsTexture(I)Z"/>
+ <method name="glNormalPointer(III)V"/>
+ <method name="glPointParameterf(IF)V"/>
+ <method name="glPointParameterfv(ILjava/nio/FloatBuffer;)V"/>
+ <method name="glPointParameterfv(I[FI)V"/>
+ <method name="glPointParameterx(II)V"/>
+ <method name="glPointParameterxv(ILjava/nio/IntBuffer;)V"/>
+ <method name="glPointParameterxv(I[II)V"/>
+ <method name="glPointSizePointerOES(IILjava/nio/Buffer;)V"/>
+ <method name="glTexCoordPointer(IIII)V"/>
+ <method name="glTexEnvi(III)V"/>
+ <method name="glTexEnviv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glTexEnviv(II[II)V"/>
+ <method name="glTexParameterfv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glTexParameterfv(II[FI)V"/>
+ <method name="glTexParameteri(III)V"/>
+ <method name="glTexParameteriv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glTexParameteriv(II[II)V"/>
+ <method name="glTexParameterxv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glTexParameterxv(II[II)V"/>
+ <method name="glVertexPointer(IIII)V"/>
+ <field name="GL_ACTIVE_TEXTURE"/>
+ <field name="GL_ADD_SIGNED"/>
+ <field name="GL_ALPHA_SCALE"/>
+ <field name="GL_ALPHA_TEST_FUNC"/>
+ <field name="GL_ALPHA_TEST_REF"/>
+ <field name="GL_ARRAY_BUFFER"/>
+ <field name="GL_ARRAY_BUFFER_BINDING"/>
+ <field name="GL_BLEND_DST"/>
+ <field name="GL_BLEND_SRC"/>
+ <field name="GL_BUFFER_ACCESS"/>
+ <field name="GL_BUFFER_SIZE"/>
+ <field name="GL_BUFFER_USAGE"/>
+ <field name="GL_CLIENT_ACTIVE_TEXTURE"/>
+ <field name="GL_CLIP_PLANE0"/>
+ <field name="GL_CLIP_PLANE1"/>
+ <field name="GL_CLIP_PLANE2"/>
+ <field name="GL_CLIP_PLANE3"/>
+ <field name="GL_CLIP_PLANE4"/>
+ <field name="GL_CLIP_PLANE5"/>
+ <field name="GL_COLOR_ARRAY_BUFFER_BINDING"/>
+ <field name="GL_COLOR_ARRAY_POINTER"/>
+ <field name="GL_COLOR_ARRAY_SIZE"/>
+ <field name="GL_COLOR_ARRAY_STRIDE"/>
+ <field name="GL_COLOR_ARRAY_TYPE"/>
+ <field name="GL_COLOR_CLEAR_VALUE"/>
+ <field name="GL_COLOR_WRITEMASK"/>
+ <field name="GL_COMBINE"/>
+ <field name="GL_COMBINE_ALPHA"/>
+ <field name="GL_COMBINE_RGB"/>
+ <field name="GL_CONSTANT"/>
+ <field name="GL_COORD_REPLACE_OES"/>
+ <field name="GL_CULL_FACE_MODE"/>
+ <field name="GL_CURRENT_COLOR"/>
+ <field name="GL_CURRENT_NORMAL"/>
+ <field name="GL_CURRENT_TEXTURE_COORDS"/>
+ <field name="GL_DEPTH_CLEAR_VALUE"/>
+ <field name="GL_DEPTH_FUNC"/>
+ <field name="GL_DEPTH_RANGE"/>
+ <field name="GL_DEPTH_WRITEMASK"/>
+ <field name="GL_DOT3_RGB"/>
+ <field name="GL_DOT3_RGBA"/>
+ <field name="GL_DYNAMIC_DRAW"/>
+ <field name="GL_ELEMENT_ARRAY_BUFFER"/>
+ <field name="GL_ELEMENT_ARRAY_BUFFER_BINDING"/>
+ <field name="GL_FRONT_FACE"/>
+ <field name="GL_GENERATE_MIPMAP"/>
+ <field name="GL_GENERATE_MIPMAP_HINT"/>
+ <field name="GL_INTERPOLATE"/>
+ <field name="GL_LINE_WIDTH"/>
+ <field name="GL_LOGIC_OP_MODE"/>
+ <field name="GL_MATRIX_MODE"/>
+ <field name="GL_MAX_CLIP_PLANES"/>
+ <field name="GL_MODELVIEW_MATRIX"/>
+ <field name="GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES"/>
+ <field name="GL_MODELVIEW_STACK_DEPTH"/>
+ <field name="GL_NORMAL_ARRAY_BUFFER_BINDING"/>
+ <field name="GL_NORMAL_ARRAY_POINTER"/>
+ <field name="GL_NORMAL_ARRAY_STRIDE"/>
+ <field name="GL_NORMAL_ARRAY_TYPE"/>
+ <field name="GL_OPERAND0_ALPHA"/>
+ <field name="GL_OPERAND0_RGB"/>
+ <field name="GL_OPERAND1_ALPHA"/>
+ <field name="GL_OPERAND1_RGB"/>
+ <field name="GL_OPERAND2_ALPHA"/>
+ <field name="GL_OPERAND2_RGB"/>
+ <field name="GL_POINT_DISTANCE_ATTENUATION"/>
+ <field name="GL_POINT_FADE_THRESHOLD_SIZE"/>
+ <field name="GL_POINT_SIZE"/>
+ <field name="GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES"/>
+ <field name="GL_POINT_SIZE_ARRAY_OES"/>
+ <field name="GL_POINT_SIZE_ARRAY_POINTER_OES"/>
+ <field name="GL_POINT_SIZE_ARRAY_STRIDE_OES"/>
+ <field name="GL_POINT_SIZE_ARRAY_TYPE_OES"/>
+ <field name="GL_POINT_SIZE_MAX"/>
+ <field name="GL_POINT_SIZE_MIN"/>
+ <field name="GL_POINT_SPRITE_OES"/>
+ <field name="GL_POLYGON_OFFSET_FACTOR"/>
+ <field name="GL_POLYGON_OFFSET_UNITS"/>
+ <field name="GL_PREVIOUS"/>
+ <field name="GL_PRIMARY_COLOR"/>
+ <field name="GL_PROJECTION_MATRIX"/>
+ <field name="GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES"/>
+ <field name="GL_PROJECTION_STACK_DEPTH"/>
+ <field name="GL_RGB_SCALE"/>
+ <field name="GL_SAMPLES"/>
+ <field name="GL_SAMPLE_BUFFERS"/>
+ <field name="GL_SAMPLE_COVERAGE_INVERT"/>
+ <field name="GL_SAMPLE_COVERAGE_VALUE"/>
+ <field name="GL_SCISSOR_BOX"/>
+ <field name="GL_SHADE_MODEL"/>
+ <field name="GL_SRC0_ALPHA"/>
+ <field name="GL_SRC0_RGB"/>
+ <field name="GL_SRC1_ALPHA"/>
+ <field name="GL_SRC1_RGB"/>
+ <field name="GL_SRC2_ALPHA"/>
+ <field name="GL_SRC2_RGB"/>
+ <field name="GL_STATIC_DRAW"/>
+ <field name="GL_STENCIL_CLEAR_VALUE"/>
+ <field name="GL_STENCIL_FAIL"/>
+ <field name="GL_STENCIL_FUNC"/>
+ <field name="GL_STENCIL_PASS_DEPTH_FAIL"/>
+ <field name="GL_STENCIL_PASS_DEPTH_PASS"/>
+ <field name="GL_STENCIL_REF"/>
+ <field name="GL_STENCIL_VALUE_MASK"/>
+ <field name="GL_STENCIL_WRITEMASK"/>
+ <field name="GL_SUBTRACT"/>
+ <field name="GL_TEXTURE_BINDING_2D"/>
+ <field name="GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING"/>
+ <field name="GL_TEXTURE_COORD_ARRAY_POINTER"/>
+ <field name="GL_TEXTURE_COORD_ARRAY_SIZE"/>
+ <field name="GL_TEXTURE_COORD_ARRAY_STRIDE"/>
+ <field name="GL_TEXTURE_COORD_ARRAY_TYPE"/>
+ <field name="GL_TEXTURE_MATRIX"/>
+ <field name="GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES"/>
+ <field name="GL_TEXTURE_STACK_DEPTH"/>
+ <field name="GL_VERTEX_ARRAY_BUFFER_BINDING"/>
+ <field name="GL_VERTEX_ARRAY_POINTER"/>
+ <field name="GL_VERTEX_ARRAY_SIZE"/>
+ <field name="GL_VERTEX_ARRAY_STRIDE"/>
+ <field name="GL_VERTEX_ARRAY_TYPE"/>
+ <field name="GL_VIEWPORT"/>
+ <field name="GL_WRITE_ONLY"/>
+ </class>
+ <class name="android/opengl/GLES11Ext" since="4">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="glAlphaFuncxOES(II)V"/>
+ <method name="glBindFramebufferOES(II)V"/>
+ <method name="glBindRenderbufferOES(II)V"/>
+ <method name="glBlendEquationOES(I)V"/>
+ <method name="glBlendEquationSeparateOES(II)V"/>
+ <method name="glBlendFuncSeparateOES(IIII)V"/>
+ <method name="glCheckFramebufferStatusOES(I)I"/>
+ <method name="glClearColorxOES(IIII)V"/>
+ <method name="glClearDepthfOES(F)V"/>
+ <method name="glClearDepthxOES(I)V"/>
+ <method name="glClipPlanefOES(ILjava/nio/FloatBuffer;)V"/>
+ <method name="glClipPlanefOES(I[FI)V"/>
+ <method name="glClipPlanexOES(ILjava/nio/IntBuffer;)V"/>
+ <method name="glClipPlanexOES(I[II)V"/>
+ <method name="glColor4xOES(IIII)V"/>
+ <method name="glCurrentPaletteMatrixOES(I)V"/>
+ <method name="glDeleteFramebuffersOES(ILjava/nio/IntBuffer;)V"/>
+ <method name="glDeleteFramebuffersOES(I[II)V"/>
+ <method name="glDeleteRenderbuffersOES(ILjava/nio/IntBuffer;)V"/>
+ <method name="glDeleteRenderbuffersOES(I[II)V"/>
+ <method name="glDepthRangefOES(FF)V"/>
+ <method name="glDepthRangexOES(II)V"/>
+ <method name="glDrawTexfOES(FFFFF)V"/>
+ <method name="glDrawTexfvOES(Ljava/nio/FloatBuffer;)V"/>
+ <method name="glDrawTexfvOES([FI)V"/>
+ <method name="glDrawTexiOES(IIIII)V"/>
+ <method name="glDrawTexivOES(Ljava/nio/IntBuffer;)V"/>
+ <method name="glDrawTexivOES([II)V"/>
+ <method name="glDrawTexsOES(SSSSS)V"/>
+ <method name="glDrawTexsvOES(Ljava/nio/ShortBuffer;)V"/>
+ <method name="glDrawTexsvOES([SI)V"/>
+ <method name="glDrawTexxOES(IIIII)V"/>
+ <method name="glDrawTexxvOES(Ljava/nio/IntBuffer;)V"/>
+ <method name="glDrawTexxvOES([II)V"/>
+ <method name="glEGLImageTargetRenderbufferStorageOES(ILjava/nio/Buffer;)V"/>
+ <method name="glEGLImageTargetTexture2DOES(ILjava/nio/Buffer;)V"/>
+ <method name="glFogxOES(II)V"/>
+ <method name="glFogxvOES(ILjava/nio/IntBuffer;)V"/>
+ <method name="glFogxvOES(I[II)V"/>
+ <method name="glFramebufferRenderbufferOES(IIII)V"/>
+ <method name="glFramebufferTexture2DOES(IIIII)V"/>
+ <method name="glFrustumfOES(FFFFFF)V"/>
+ <method name="glFrustumxOES(IIIIII)V"/>
+ <method name="glGenFramebuffersOES(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGenFramebuffersOES(I[II)V"/>
+ <method name="glGenRenderbuffersOES(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGenRenderbuffersOES(I[II)V"/>
+ <method name="glGenerateMipmapOES(I)V"/>
+ <method name="glGetClipPlanefOES(ILjava/nio/FloatBuffer;)V"/>
+ <method name="glGetClipPlanefOES(I[FI)V"/>
+ <method name="glGetClipPlanexOES(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGetClipPlanexOES(I[II)V"/>
+ <method name="glGetFixedvOES(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGetFixedvOES(I[II)V"/>
+ <method name="glGetFramebufferAttachmentParameterivOES(IIILjava/nio/IntBuffer;)V"/>
+ <method name="glGetFramebufferAttachmentParameterivOES(III[II)V"/>
+ <method name="glGetLightxvOES(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetLightxvOES(II[II)V"/>
+ <method name="glGetMaterialxvOES(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetMaterialxvOES(II[II)V"/>
+ <method name="glGetRenderbufferParameterivOES(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetRenderbufferParameterivOES(II[II)V"/>
+ <method name="glGetTexEnvxvOES(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetTexEnvxvOES(II[II)V"/>
+ <method name="glGetTexGenfvOES(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glGetTexGenfvOES(II[FI)V"/>
+ <method name="glGetTexGenivOES(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetTexGenivOES(II[II)V"/>
+ <method name="glGetTexGenxvOES(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetTexGenxvOES(II[II)V"/>
+ <method name="glGetTexParameterxvOES(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetTexParameterxvOES(II[II)V"/>
+ <method name="glIsFramebufferOES(I)Z"/>
+ <method name="glIsRenderbufferOES(I)Z"/>
+ <method name="glLightModelxOES(II)V"/>
+ <method name="glLightModelxvOES(ILjava/nio/IntBuffer;)V"/>
+ <method name="glLightModelxvOES(I[II)V"/>
+ <method name="glLightxOES(III)V"/>
+ <method name="glLightxvOES(IILjava/nio/IntBuffer;)V"/>
+ <method name="glLightxvOES(II[II)V"/>
+ <method name="glLineWidthxOES(I)V"/>
+ <method name="glLoadMatrixxOES(Ljava/nio/IntBuffer;)V"/>
+ <method name="glLoadMatrixxOES([II)V"/>
+ <method name="glLoadPaletteFromModelViewMatrixOES()V"/>
+ <method name="glMaterialxOES(III)V"/>
+ <method name="glMaterialxvOES(IILjava/nio/IntBuffer;)V"/>
+ <method name="glMaterialxvOES(II[II)V"/>
+ <method name="glMatrixIndexPointerOES(IIILjava/nio/Buffer;)V"/>
+ <method name="glMultMatrixxOES(Ljava/nio/IntBuffer;)V"/>
+ <method name="glMultMatrixxOES([II)V"/>
+ <method name="glMultiTexCoord4xOES(IIIII)V"/>
+ <method name="glNormal3xOES(III)V"/>
+ <method name="glOrthofOES(FFFFFF)V"/>
+ <method name="glOrthoxOES(IIIIII)V"/>
+ <method name="glPointParameterxOES(II)V"/>
+ <method name="glPointParameterxvOES(ILjava/nio/IntBuffer;)V"/>
+ <method name="glPointParameterxvOES(I[II)V"/>
+ <method name="glPointSizexOES(I)V"/>
+ <method name="glPolygonOffsetxOES(II)V"/>
+ <method name="glRenderbufferStorageOES(IIII)V"/>
+ <method name="glRotatexOES(IIII)V"/>
+ <method name="glSampleCoveragexOES(IZ)V"/>
+ <method name="glScalexOES(III)V"/>
+ <method name="glTexEnvxOES(III)V"/>
+ <method name="glTexEnvxvOES(IILjava/nio/IntBuffer;)V"/>
+ <method name="glTexEnvxvOES(II[II)V"/>
+ <method name="glTexGenfOES(IIF)V"/>
+ <method name="glTexGenfvOES(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glTexGenfvOES(II[FI)V"/>
+ <method name="glTexGeniOES(III)V"/>
+ <method name="glTexGenivOES(IILjava/nio/IntBuffer;)V"/>
+ <method name="glTexGenivOES(II[II)V"/>
+ <method name="glTexGenxOES(III)V"/>
+ <method name="glTexGenxvOES(IILjava/nio/IntBuffer;)V"/>
+ <method name="glTexGenxvOES(II[II)V"/>
+ <method name="glTexParameterxOES(III)V"/>
+ <method name="glTexParameterxvOES(IILjava/nio/IntBuffer;)V"/>
+ <method name="glTexParameterxvOES(II[II)V"/>
+ <method name="glTranslatexOES(III)V"/>
+ <method name="glWeightPointerOES(IIILjava/nio/Buffer;)V"/>
+ <field name="GL_3DC_XY_AMD"/>
+ <field name="GL_3DC_X_AMD"/>
+ <field name="GL_ATC_RGBA_EXPLICIT_ALPHA_AMD"/>
+ <field name="GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD"/>
+ <field name="GL_ATC_RGB_AMD"/>
+ <field name="GL_BGRA"/>
+ <field name="GL_BLEND_DST_ALPHA_OES"/>
+ <field name="GL_BLEND_DST_RGB_OES"/>
+ <field name="GL_BLEND_EQUATION_ALPHA_OES"/>
+ <field name="GL_BLEND_EQUATION_OES"/>
+ <field name="GL_BLEND_EQUATION_RGB_OES"/>
+ <field name="GL_BLEND_SRC_ALPHA_OES"/>
+ <field name="GL_BLEND_SRC_RGB_OES"/>
+ <field name="GL_BUFFER_ACCESS_OES"/>
+ <field name="GL_BUFFER_MAPPED_OES"/>
+ <field name="GL_BUFFER_MAP_POINTER_OES"/>
+ <field name="GL_COLOR_ATTACHMENT0_OES"/>
+ <field name="GL_CURRENT_PALETTE_MATRIX_OES"/>
+ <field name="GL_DECR_WRAP_OES"/>
+ <field name="GL_DEPTH24_STENCIL8_OES"/>
+ <field name="GL_DEPTH_ATTACHMENT_OES"/>
+ <field name="GL_DEPTH_COMPONENT16_OES"/>
+ <field name="GL_DEPTH_COMPONENT24_OES"/>
+ <field name="GL_DEPTH_COMPONENT32_OES"/>
+ <field name="GL_DEPTH_STENCIL_OES"/>
+ <field name="GL_ETC1_RGB8_OES"/>
+ <field name="GL_FIXED_OES"/>
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES"/>
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES"/>
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES"/>
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES"/>
+ <field name="GL_FRAMEBUFFER_BINDING_OES"/>
+ <field name="GL_FRAMEBUFFER_COMPLETE_OES"/>
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES"/>
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES"/>
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES"/>
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES"/>
+ <field name="GL_FRAMEBUFFER_OES"/>
+ <field name="GL_FRAMEBUFFER_UNSUPPORTED_OES"/>
+ <field name="GL_FUNC_ADD_OES"/>
+ <field name="GL_FUNC_REVERSE_SUBTRACT_OES"/>
+ <field name="GL_FUNC_SUBTRACT_OES"/>
+ <field name="GL_INCR_WRAP_OES"/>
+ <field name="GL_INVALID_FRAMEBUFFER_OPERATION_OES"/>
+ <field name="GL_MATRIX_INDEX_ARRAY_BUFFER_BINDING_OES"/>
+ <field name="GL_MATRIX_INDEX_ARRAY_OES"/>
+ <field name="GL_MATRIX_INDEX_ARRAY_POINTER_OES"/>
+ <field name="GL_MATRIX_INDEX_ARRAY_SIZE_OES"/>
+ <field name="GL_MATRIX_INDEX_ARRAY_STRIDE_OES"/>
+ <field name="GL_MATRIX_INDEX_ARRAY_TYPE_OES"/>
+ <field name="GL_MATRIX_PALETTE_OES"/>
+ <field name="GL_MAX_CUBE_MAP_TEXTURE_SIZE_OES"/>
+ <field name="GL_MAX_PALETTE_MATRICES_OES"/>
+ <field name="GL_MAX_RENDERBUFFER_SIZE_OES"/>
+ <field name="GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT"/>
+ <field name="GL_MAX_VERTEX_UNITS_OES"/>
+ <field name="GL_MIRRORED_REPEAT_OES"/>
+ <field name="GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES"/>
+ <field name="GL_NONE_OES"/>
+ <field name="GL_NORMAL_MAP_OES"/>
+ <field name="GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES"/>
+ <field name="GL_REFLECTION_MAP_OES"/>
+ <field name="GL_RENDERBUFFER_ALPHA_SIZE_OES"/>
+ <field name="GL_RENDERBUFFER_BINDING_OES"/>
+ <field name="GL_RENDERBUFFER_BLUE_SIZE_OES"/>
+ <field name="GL_RENDERBUFFER_DEPTH_SIZE_OES"/>
+ <field name="GL_RENDERBUFFER_GREEN_SIZE_OES"/>
+ <field name="GL_RENDERBUFFER_HEIGHT_OES"/>
+ <field name="GL_RENDERBUFFER_INTERNAL_FORMAT_OES"/>
+ <field name="GL_RENDERBUFFER_OES"/>
+ <field name="GL_RENDERBUFFER_RED_SIZE_OES"/>
+ <field name="GL_RENDERBUFFER_STENCIL_SIZE_OES"/>
+ <field name="GL_RENDERBUFFER_WIDTH_OES"/>
+ <field name="GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES" since="15"/>
+ <field name="GL_RGB565_OES"/>
+ <field name="GL_RGB5_A1_OES"/>
+ <field name="GL_RGB8_OES"/>
+ <field name="GL_RGBA4_OES"/>
+ <field name="GL_RGBA8_OES"/>
+ <field name="GL_SAMPLER_EXTERNAL_OES" since="15"/>
+ <field name="GL_STENCIL_ATTACHMENT_OES"/>
+ <field name="GL_STENCIL_INDEX1_OES"/>
+ <field name="GL_STENCIL_INDEX4_OES"/>
+ <field name="GL_STENCIL_INDEX8_OES"/>
+ <field name="GL_TEXTURE_BINDING_CUBE_MAP_OES"/>
+ <field name="GL_TEXTURE_BINDING_EXTERNAL_OES" since="15"/>
+ <field name="GL_TEXTURE_CROP_RECT_OES"/>
+ <field name="GL_TEXTURE_CUBE_MAP_NEGATIVE_X_OES"/>
+ <field name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_OES"/>
+ <field name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_OES"/>
+ <field name="GL_TEXTURE_CUBE_MAP_OES"/>
+ <field name="GL_TEXTURE_CUBE_MAP_POSITIVE_X_OES"/>
+ <field name="GL_TEXTURE_CUBE_MAP_POSITIVE_Y_OES"/>
+ <field name="GL_TEXTURE_CUBE_MAP_POSITIVE_Z_OES"/>
+ <field name="GL_TEXTURE_EXTERNAL_OES" since="15"/>
+ <field name="GL_TEXTURE_GEN_MODE_OES"/>
+ <field name="GL_TEXTURE_GEN_STR_OES"/>
+ <field name="GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES"/>
+ <field name="GL_TEXTURE_MAX_ANISOTROPY_EXT"/>
+ <field name="GL_UNSIGNED_INT_24_8_OES"/>
+ <field name="GL_WEIGHT_ARRAY_BUFFER_BINDING_OES"/>
+ <field name="GL_WEIGHT_ARRAY_OES"/>
+ <field name="GL_WEIGHT_ARRAY_POINTER_OES"/>
+ <field name="GL_WEIGHT_ARRAY_SIZE_OES"/>
+ <field name="GL_WEIGHT_ARRAY_STRIDE_OES"/>
+ <field name="GL_WEIGHT_ARRAY_TYPE_OES"/>
+ <field name="GL_WRITE_ONLY_OES"/>
+ </class>
+ <class name="android/opengl/GLES20" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="glActiveTexture(I)V"/>
+ <method name="glAttachShader(II)V"/>
+ <method name="glBindAttribLocation(IILjava/lang/String;)V"/>
+ <method name="glBindBuffer(II)V"/>
+ <method name="glBindFramebuffer(II)V"/>
+ <method name="glBindRenderbuffer(II)V"/>
+ <method name="glBindTexture(II)V"/>
+ <method name="glBlendColor(FFFF)V"/>
+ <method name="glBlendEquation(I)V"/>
+ <method name="glBlendEquationSeparate(II)V"/>
+ <method name="glBlendFunc(II)V"/>
+ <method name="glBlendFuncSeparate(IIII)V"/>
+ <method name="glBufferData(IILjava/nio/Buffer;I)V"/>
+ <method name="glBufferSubData(IIILjava/nio/Buffer;)V"/>
+ <method name="glCheckFramebufferStatus(I)I"/>
+ <method name="glClear(I)V"/>
+ <method name="glClearColor(FFFF)V"/>
+ <method name="glClearDepthf(F)V"/>
+ <method name="glClearStencil(I)V"/>
+ <method name="glColorMask(ZZZZ)V"/>
+ <method name="glCompileShader(I)V"/>
+ <method name="glCompressedTexImage2D(IIIIIIILjava/nio/Buffer;)V"/>
+ <method name="glCompressedTexSubImage2D(IIIIIIIILjava/nio/Buffer;)V"/>
+ <method name="glCopyTexImage2D(IIIIIIII)V"/>
+ <method name="glCopyTexSubImage2D(IIIIIIII)V"/>
+ <method name="glCreateProgram()I"/>
+ <method name="glCreateShader(I)I"/>
+ <method name="glCullFace(I)V"/>
+ <method name="glDeleteBuffers(ILjava/nio/IntBuffer;)V"/>
+ <method name="glDeleteBuffers(I[II)V"/>
+ <method name="glDeleteFramebuffers(ILjava/nio/IntBuffer;)V"/>
+ <method name="glDeleteFramebuffers(I[II)V"/>
+ <method name="glDeleteProgram(I)V"/>
+ <method name="glDeleteRenderbuffers(ILjava/nio/IntBuffer;)V"/>
+ <method name="glDeleteRenderbuffers(I[II)V"/>
+ <method name="glDeleteShader(I)V"/>
+ <method name="glDeleteTextures(ILjava/nio/IntBuffer;)V"/>
+ <method name="glDeleteTextures(I[II)V"/>
+ <method name="glDepthFunc(I)V"/>
+ <method name="glDepthMask(Z)V"/>
+ <method name="glDepthRangef(FF)V"/>
+ <method name="glDetachShader(II)V"/>
+ <method name="glDisable(I)V"/>
+ <method name="glDisableVertexAttribArray(I)V"/>
+ <method name="glDrawArrays(III)V"/>
+ <method name="glDrawElements(IIII)V" since="9"/>
+ <method name="glDrawElements(IIILjava/nio/Buffer;)V"/>
+ <method name="glEnable(I)V"/>
+ <method name="glEnableVertexAttribArray(I)V"/>
+ <method name="glFinish()V"/>
+ <method name="glFlush()V"/>
+ <method name="glFramebufferRenderbuffer(IIII)V"/>
+ <method name="glFramebufferTexture2D(IIIII)V"/>
+ <method name="glFrontFace(I)V"/>
+ <method name="glGenBuffers(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGenBuffers(I[II)V"/>
+ <method name="glGenFramebuffers(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGenFramebuffers(I[II)V"/>
+ <method name="glGenRenderbuffers(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGenRenderbuffers(I[II)V"/>
+ <method name="glGenTextures(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGenTextures(I[II)V"/>
+ <method name="glGenerateMipmap(I)V"/>
+ <method name="glGetActiveAttrib(IIILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;B)V" removed="21"/>
+ <method name="glGetActiveAttrib(III[II[II[II[BI)V"/>
+ <method name="glGetActiveAttrib(IILjava/nio/IntBuffer;Ljava/nio/IntBuffer;)Ljava/lang/String;" since="17"/>
+ <method name="glGetActiveAttrib(II[II[II)Ljava/lang/String;" since="17"/>
+ <method name="glGetActiveUniform(IIILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;B)V" removed="21"/>
+ <method name="glGetActiveUniform(III[II[II[II[BI)V"/>
+ <method name="glGetActiveUniform(IILjava/nio/IntBuffer;Ljava/nio/IntBuffer;)Ljava/lang/String;" since="17"/>
+ <method name="glGetActiveUniform(II[II[II)Ljava/lang/String;" since="17"/>
+ <method name="glGetAttachedShaders(IILjava/nio/IntBuffer;Ljava/nio/IntBuffer;)V"/>
+ <method name="glGetAttachedShaders(II[II[II)V"/>
+ <method name="glGetAttribLocation(ILjava/lang/String;)I"/>
+ <method name="glGetBooleanv(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGetBooleanv(I[ZI)V"/>
+ <method name="glGetBufferParameteriv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetBufferParameteriv(II[II)V"/>
+ <method name="glGetError()I"/>
+ <method name="glGetFloatv(ILjava/nio/FloatBuffer;)V"/>
+ <method name="glGetFloatv(I[FI)V"/>
+ <method name="glGetFramebufferAttachmentParameteriv(IIILjava/nio/IntBuffer;)V"/>
+ <method name="glGetFramebufferAttachmentParameteriv(III[II)V"/>
+ <method name="glGetIntegerv(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGetIntegerv(I[II)V"/>
+ <method name="glGetProgramInfoLog(I)Ljava/lang/String;"/>
+ <method name="glGetProgramiv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetProgramiv(II[II)V"/>
+ <method name="glGetRenderbufferParameteriv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetRenderbufferParameteriv(II[II)V"/>
+ <method name="glGetShaderInfoLog(I)Ljava/lang/String;"/>
+ <method name="glGetShaderPrecisionFormat(IILjava/nio/IntBuffer;Ljava/nio/IntBuffer;)V"/>
+ <method name="glGetShaderPrecisionFormat(II[II[II)V"/>
+ <method name="glGetShaderSource(I)Ljava/lang/String;" since="17"/>
+ <method name="glGetShaderSource(IILjava/nio/IntBuffer;B)V" removed="21"/>
+ <method name="glGetShaderSource(II[II[BI)V"/>
+ <method name="glGetShaderiv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetShaderiv(II[II)V"/>
+ <method name="glGetString(I)Ljava/lang/String;"/>
+ <method name="glGetTexParameterfv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glGetTexParameterfv(II[FI)V"/>
+ <method name="glGetTexParameteriv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetTexParameteriv(II[II)V"/>
+ <method name="glGetUniformLocation(ILjava/lang/String;)I"/>
+ <method name="glGetUniformfv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glGetUniformfv(II[FI)V"/>
+ <method name="glGetUniformiv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetUniformiv(II[II)V"/>
+ <method name="glGetVertexAttribfv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glGetVertexAttribfv(II[FI)V"/>
+ <method name="glGetVertexAttribiv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetVertexAttribiv(II[II)V"/>
+ <method name="glHint(II)V"/>
+ <method name="glIsBuffer(I)Z"/>
+ <method name="glIsEnabled(I)Z"/>
+ <method name="glIsFramebuffer(I)Z"/>
+ <method name="glIsProgram(I)Z"/>
+ <method name="glIsRenderbuffer(I)Z"/>
+ <method name="glIsShader(I)Z"/>
+ <method name="glIsTexture(I)Z"/>
+ <method name="glLineWidth(F)V"/>
+ <method name="glLinkProgram(I)V"/>
+ <method name="glPixelStorei(II)V"/>
+ <method name="glPolygonOffset(FF)V"/>
+ <method name="glReadPixels(IIIIIILjava/nio/Buffer;)V"/>
+ <method name="glReleaseShaderCompiler()V"/>
+ <method name="glRenderbufferStorage(IIII)V"/>
+ <method name="glSampleCoverage(FZ)V"/>
+ <method name="glScissor(IIII)V"/>
+ <method name="glShaderBinary(ILjava/nio/IntBuffer;ILjava/nio/Buffer;I)V"/>
+ <method name="glShaderBinary(I[IIILjava/nio/Buffer;I)V"/>
+ <method name="glShaderSource(ILjava/lang/String;)V"/>
+ <method name="glStencilFunc(III)V"/>
+ <method name="glStencilFuncSeparate(IIII)V"/>
+ <method name="glStencilMask(I)V"/>
+ <method name="glStencilMaskSeparate(II)V"/>
+ <method name="glStencilOp(III)V"/>
+ <method name="glStencilOpSeparate(IIII)V"/>
+ <method name="glTexImage2D(IIIIIIIILjava/nio/Buffer;)V"/>
+ <method name="glTexParameterf(IIF)V"/>
+ <method name="glTexParameterfv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glTexParameterfv(II[FI)V"/>
+ <method name="glTexParameteri(III)V"/>
+ <method name="glTexParameteriv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glTexParameteriv(II[II)V"/>
+ <method name="glTexSubImage2D(IIIIIIIILjava/nio/Buffer;)V"/>
+ <method name="glUniform1f(IF)V"/>
+ <method name="glUniform1fv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glUniform1fv(II[FI)V"/>
+ <method name="glUniform1i(II)V"/>
+ <method name="glUniform1iv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glUniform1iv(II[II)V"/>
+ <method name="glUniform2f(IFF)V"/>
+ <method name="glUniform2fv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glUniform2fv(II[FI)V"/>
+ <method name="glUniform2i(III)V"/>
+ <method name="glUniform2iv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glUniform2iv(II[II)V"/>
+ <method name="glUniform3f(IFFF)V"/>
+ <method name="glUniform3fv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glUniform3fv(II[FI)V"/>
+ <method name="glUniform3i(IIII)V"/>
+ <method name="glUniform3iv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glUniform3iv(II[II)V"/>
+ <method name="glUniform4f(IFFFF)V"/>
+ <method name="glUniform4fv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glUniform4fv(II[FI)V"/>
+ <method name="glUniform4i(IIIII)V"/>
+ <method name="glUniform4iv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glUniform4iv(II[II)V"/>
+ <method name="glUniformMatrix2fv(IIZLjava/nio/FloatBuffer;)V"/>
+ <method name="glUniformMatrix2fv(IIZ[FI)V"/>
+ <method name="glUniformMatrix3fv(IIZLjava/nio/FloatBuffer;)V"/>
+ <method name="glUniformMatrix3fv(IIZ[FI)V"/>
+ <method name="glUniformMatrix4fv(IIZLjava/nio/FloatBuffer;)V"/>
+ <method name="glUniformMatrix4fv(IIZ[FI)V"/>
+ <method name="glUseProgram(I)V"/>
+ <method name="glValidateProgram(I)V"/>
+ <method name="glVertexAttrib1f(IF)V"/>
+ <method name="glVertexAttrib1fv(ILjava/nio/FloatBuffer;)V"/>
+ <method name="glVertexAttrib1fv(I[FI)V"/>
+ <method name="glVertexAttrib2f(IFF)V"/>
+ <method name="glVertexAttrib2fv(ILjava/nio/FloatBuffer;)V"/>
+ <method name="glVertexAttrib2fv(I[FI)V"/>
+ <method name="glVertexAttrib3f(IFFF)V"/>
+ <method name="glVertexAttrib3fv(ILjava/nio/FloatBuffer;)V"/>
+ <method name="glVertexAttrib3fv(I[FI)V"/>
+ <method name="glVertexAttrib4f(IFFFF)V"/>
+ <method name="glVertexAttrib4fv(ILjava/nio/FloatBuffer;)V"/>
+ <method name="glVertexAttrib4fv(I[FI)V"/>
+ <method name="glVertexAttribPointer(IIIZII)V" since="9"/>
+ <method name="glVertexAttribPointer(IIIZILjava/nio/Buffer;)V"/>
+ <method name="glViewport(IIII)V"/>
+ <field name="GL_ACTIVE_ATTRIBUTES"/>
+ <field name="GL_ACTIVE_ATTRIBUTE_MAX_LENGTH"/>
+ <field name="GL_ACTIVE_TEXTURE"/>
+ <field name="GL_ACTIVE_UNIFORMS"/>
+ <field name="GL_ACTIVE_UNIFORM_MAX_LENGTH"/>
+ <field name="GL_ALIASED_LINE_WIDTH_RANGE"/>
+ <field name="GL_ALIASED_POINT_SIZE_RANGE"/>
+ <field name="GL_ALPHA"/>
+ <field name="GL_ALPHA_BITS"/>
+ <field name="GL_ALWAYS"/>
+ <field name="GL_ARRAY_BUFFER"/>
+ <field name="GL_ARRAY_BUFFER_BINDING"/>
+ <field name="GL_ATTACHED_SHADERS"/>
+ <field name="GL_BACK"/>
+ <field name="GL_BLEND"/>
+ <field name="GL_BLEND_COLOR"/>
+ <field name="GL_BLEND_DST_ALPHA"/>
+ <field name="GL_BLEND_DST_RGB"/>
+ <field name="GL_BLEND_EQUATION"/>
+ <field name="GL_BLEND_EQUATION_ALPHA"/>
+ <field name="GL_BLEND_EQUATION_RGB"/>
+ <field name="GL_BLEND_SRC_ALPHA"/>
+ <field name="GL_BLEND_SRC_RGB"/>
+ <field name="GL_BLUE_BITS"/>
+ <field name="GL_BOOL"/>
+ <field name="GL_BOOL_VEC2"/>
+ <field name="GL_BOOL_VEC3"/>
+ <field name="GL_BOOL_VEC4"/>
+ <field name="GL_BUFFER_SIZE"/>
+ <field name="GL_BUFFER_USAGE"/>
+ <field name="GL_BYTE"/>
+ <field name="GL_CCW"/>
+ <field name="GL_CLAMP_TO_EDGE"/>
+ <field name="GL_COLOR_ATTACHMENT0"/>
+ <field name="GL_COLOR_BUFFER_BIT"/>
+ <field name="GL_COLOR_CLEAR_VALUE"/>
+ <field name="GL_COLOR_WRITEMASK"/>
+ <field name="GL_COMPILE_STATUS"/>
+ <field name="GL_COMPRESSED_TEXTURE_FORMATS"/>
+ <field name="GL_CONSTANT_ALPHA"/>
+ <field name="GL_CONSTANT_COLOR"/>
+ <field name="GL_CULL_FACE"/>
+ <field name="GL_CULL_FACE_MODE"/>
+ <field name="GL_CURRENT_PROGRAM"/>
+ <field name="GL_CURRENT_VERTEX_ATTRIB"/>
+ <field name="GL_CW"/>
+ <field name="GL_DECR"/>
+ <field name="GL_DECR_WRAP"/>
+ <field name="GL_DELETE_STATUS"/>
+ <field name="GL_DEPTH_ATTACHMENT"/>
+ <field name="GL_DEPTH_BITS"/>
+ <field name="GL_DEPTH_BUFFER_BIT"/>
+ <field name="GL_DEPTH_CLEAR_VALUE"/>
+ <field name="GL_DEPTH_COMPONENT"/>
+ <field name="GL_DEPTH_COMPONENT16"/>
+ <field name="GL_DEPTH_FUNC"/>
+ <field name="GL_DEPTH_RANGE"/>
+ <field name="GL_DEPTH_TEST"/>
+ <field name="GL_DEPTH_WRITEMASK"/>
+ <field name="GL_DITHER"/>
+ <field name="GL_DONT_CARE"/>
+ <field name="GL_DST_ALPHA"/>
+ <field name="GL_DST_COLOR"/>
+ <field name="GL_DYNAMIC_DRAW"/>
+ <field name="GL_ELEMENT_ARRAY_BUFFER"/>
+ <field name="GL_ELEMENT_ARRAY_BUFFER_BINDING"/>
+ <field name="GL_EQUAL"/>
+ <field name="GL_EXTENSIONS"/>
+ <field name="GL_FALSE"/>
+ <field name="GL_FASTEST"/>
+ <field name="GL_FIXED"/>
+ <field name="GL_FLOAT"/>
+ <field name="GL_FLOAT_MAT2"/>
+ <field name="GL_FLOAT_MAT3"/>
+ <field name="GL_FLOAT_MAT4"/>
+ <field name="GL_FLOAT_VEC2"/>
+ <field name="GL_FLOAT_VEC3"/>
+ <field name="GL_FLOAT_VEC4"/>
+ <field name="GL_FRAGMENT_SHADER"/>
+ <field name="GL_FRAMEBUFFER"/>
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME"/>
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE"/>
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE"/>
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL"/>
+ <field name="GL_FRAMEBUFFER_BINDING"/>
+ <field name="GL_FRAMEBUFFER_COMPLETE"/>
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT"/>
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS"/>
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT"/>
+ <field name="GL_FRAMEBUFFER_UNSUPPORTED"/>
+ <field name="GL_FRONT"/>
+ <field name="GL_FRONT_AND_BACK"/>
+ <field name="GL_FRONT_FACE"/>
+ <field name="GL_FUNC_ADD"/>
+ <field name="GL_FUNC_REVERSE_SUBTRACT"/>
+ <field name="GL_FUNC_SUBTRACT"/>
+ <field name="GL_GENERATE_MIPMAP_HINT"/>
+ <field name="GL_GEQUAL"/>
+ <field name="GL_GREATER"/>
+ <field name="GL_GREEN_BITS"/>
+ <field name="GL_HIGH_FLOAT"/>
+ <field name="GL_HIGH_INT"/>
+ <field name="GL_IMPLEMENTATION_COLOR_READ_FORMAT"/>
+ <field name="GL_IMPLEMENTATION_COLOR_READ_TYPE"/>
+ <field name="GL_INCR"/>
+ <field name="GL_INCR_WRAP"/>
+ <field name="GL_INFO_LOG_LENGTH"/>
+ <field name="GL_INT"/>
+ <field name="GL_INT_VEC2"/>
+ <field name="GL_INT_VEC3"/>
+ <field name="GL_INT_VEC4"/>
+ <field name="GL_INVALID_ENUM"/>
+ <field name="GL_INVALID_FRAMEBUFFER_OPERATION"/>
+ <field name="GL_INVALID_OPERATION"/>
+ <field name="GL_INVALID_VALUE"/>
+ <field name="GL_INVERT"/>
+ <field name="GL_KEEP"/>
+ <field name="GL_LEQUAL"/>
+ <field name="GL_LESS"/>
+ <field name="GL_LINEAR"/>
+ <field name="GL_LINEAR_MIPMAP_LINEAR"/>
+ <field name="GL_LINEAR_MIPMAP_NEAREST"/>
+ <field name="GL_LINES"/>
+ <field name="GL_LINE_LOOP"/>
+ <field name="GL_LINE_STRIP"/>
+ <field name="GL_LINE_WIDTH"/>
+ <field name="GL_LINK_STATUS"/>
+ <field name="GL_LOW_FLOAT"/>
+ <field name="GL_LOW_INT"/>
+ <field name="GL_LUMINANCE"/>
+ <field name="GL_LUMINANCE_ALPHA"/>
+ <field name="GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS"/>
+ <field name="GL_MAX_CUBE_MAP_TEXTURE_SIZE"/>
+ <field name="GL_MAX_FRAGMENT_UNIFORM_VECTORS"/>
+ <field name="GL_MAX_RENDERBUFFER_SIZE"/>
+ <field name="GL_MAX_TEXTURE_IMAGE_UNITS"/>
+ <field name="GL_MAX_TEXTURE_SIZE"/>
+ <field name="GL_MAX_VARYING_VECTORS"/>
+ <field name="GL_MAX_VERTEX_ATTRIBS"/>
+ <field name="GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS"/>
+ <field name="GL_MAX_VERTEX_UNIFORM_VECTORS"/>
+ <field name="GL_MAX_VIEWPORT_DIMS"/>
+ <field name="GL_MEDIUM_FLOAT"/>
+ <field name="GL_MEDIUM_INT"/>
+ <field name="GL_MIRRORED_REPEAT"/>
+ <field name="GL_NEAREST"/>
+ <field name="GL_NEAREST_MIPMAP_LINEAR"/>
+ <field name="GL_NEAREST_MIPMAP_NEAREST"/>
+ <field name="GL_NEVER"/>
+ <field name="GL_NICEST"/>
+ <field name="GL_NONE"/>
+ <field name="GL_NOTEQUAL"/>
+ <field name="GL_NO_ERROR"/>
+ <field name="GL_NUM_COMPRESSED_TEXTURE_FORMATS"/>
+ <field name="GL_NUM_SHADER_BINARY_FORMATS"/>
+ <field name="GL_ONE"/>
+ <field name="GL_ONE_MINUS_CONSTANT_ALPHA"/>
+ <field name="GL_ONE_MINUS_CONSTANT_COLOR"/>
+ <field name="GL_ONE_MINUS_DST_ALPHA"/>
+ <field name="GL_ONE_MINUS_DST_COLOR"/>
+ <field name="GL_ONE_MINUS_SRC_ALPHA"/>
+ <field name="GL_ONE_MINUS_SRC_COLOR"/>
+ <field name="GL_OUT_OF_MEMORY"/>
+ <field name="GL_PACK_ALIGNMENT"/>
+ <field name="GL_POINTS"/>
+ <field name="GL_POLYGON_OFFSET_FACTOR"/>
+ <field name="GL_POLYGON_OFFSET_FILL"/>
+ <field name="GL_POLYGON_OFFSET_UNITS"/>
+ <field name="GL_RED_BITS"/>
+ <field name="GL_RENDERBUFFER"/>
+ <field name="GL_RENDERBUFFER_ALPHA_SIZE"/>
+ <field name="GL_RENDERBUFFER_BINDING"/>
+ <field name="GL_RENDERBUFFER_BLUE_SIZE"/>
+ <field name="GL_RENDERBUFFER_DEPTH_SIZE"/>
+ <field name="GL_RENDERBUFFER_GREEN_SIZE"/>
+ <field name="GL_RENDERBUFFER_HEIGHT"/>
+ <field name="GL_RENDERBUFFER_INTERNAL_FORMAT"/>
+ <field name="GL_RENDERBUFFER_RED_SIZE"/>
+ <field name="GL_RENDERBUFFER_STENCIL_SIZE"/>
+ <field name="GL_RENDERBUFFER_WIDTH"/>
+ <field name="GL_RENDERER"/>
+ <field name="GL_REPEAT"/>
+ <field name="GL_REPLACE"/>
+ <field name="GL_RGB"/>
+ <field name="GL_RGB565"/>
+ <field name="GL_RGB5_A1"/>
+ <field name="GL_RGBA"/>
+ <field name="GL_RGBA4"/>
+ <field name="GL_SAMPLER_2D"/>
+ <field name="GL_SAMPLER_CUBE"/>
+ <field name="GL_SAMPLES"/>
+ <field name="GL_SAMPLE_ALPHA_TO_COVERAGE"/>
+ <field name="GL_SAMPLE_BUFFERS"/>
+ <field name="GL_SAMPLE_COVERAGE"/>
+ <field name="GL_SAMPLE_COVERAGE_INVERT"/>
+ <field name="GL_SAMPLE_COVERAGE_VALUE"/>
+ <field name="GL_SCISSOR_BOX"/>
+ <field name="GL_SCISSOR_TEST"/>
+ <field name="GL_SHADER_BINARY_FORMATS"/>
+ <field name="GL_SHADER_COMPILER"/>
+ <field name="GL_SHADER_SOURCE_LENGTH"/>
+ <field name="GL_SHADER_TYPE"/>
+ <field name="GL_SHADING_LANGUAGE_VERSION"/>
+ <field name="GL_SHORT"/>
+ <field name="GL_SRC_ALPHA"/>
+ <field name="GL_SRC_ALPHA_SATURATE"/>
+ <field name="GL_SRC_COLOR"/>
+ <field name="GL_STATIC_DRAW"/>
+ <field name="GL_STENCIL_ATTACHMENT"/>
+ <field name="GL_STENCIL_BACK_FAIL"/>
+ <field name="GL_STENCIL_BACK_FUNC"/>
+ <field name="GL_STENCIL_BACK_PASS_DEPTH_FAIL"/>
+ <field name="GL_STENCIL_BACK_PASS_DEPTH_PASS"/>
+ <field name="GL_STENCIL_BACK_REF"/>
+ <field name="GL_STENCIL_BACK_VALUE_MASK"/>
+ <field name="GL_STENCIL_BACK_WRITEMASK"/>
+ <field name="GL_STENCIL_BITS"/>
+ <field name="GL_STENCIL_BUFFER_BIT"/>
+ <field name="GL_STENCIL_CLEAR_VALUE"/>
+ <field name="GL_STENCIL_FAIL"/>
+ <field name="GL_STENCIL_FUNC"/>
+ <field name="GL_STENCIL_INDEX" deprecated="18"/>
+ <field name="GL_STENCIL_INDEX8"/>
+ <field name="GL_STENCIL_PASS_DEPTH_FAIL"/>
+ <field name="GL_STENCIL_PASS_DEPTH_PASS"/>
+ <field name="GL_STENCIL_REF"/>
+ <field name="GL_STENCIL_TEST"/>
+ <field name="GL_STENCIL_VALUE_MASK"/>
+ <field name="GL_STENCIL_WRITEMASK"/>
+ <field name="GL_STREAM_DRAW"/>
+ <field name="GL_SUBPIXEL_BITS"/>
+ <field name="GL_TEXTURE"/>
+ <field name="GL_TEXTURE0"/>
+ <field name="GL_TEXTURE1"/>
+ <field name="GL_TEXTURE10"/>
+ <field name="GL_TEXTURE11"/>
+ <field name="GL_TEXTURE12"/>
+ <field name="GL_TEXTURE13"/>
+ <field name="GL_TEXTURE14"/>
+ <field name="GL_TEXTURE15"/>
+ <field name="GL_TEXTURE16"/>
+ <field name="GL_TEXTURE17"/>
+ <field name="GL_TEXTURE18"/>
+ <field name="GL_TEXTURE19"/>
+ <field name="GL_TEXTURE2"/>
+ <field name="GL_TEXTURE20"/>
+ <field name="GL_TEXTURE21"/>
+ <field name="GL_TEXTURE22"/>
+ <field name="GL_TEXTURE23"/>
+ <field name="GL_TEXTURE24"/>
+ <field name="GL_TEXTURE25"/>
+ <field name="GL_TEXTURE26"/>
+ <field name="GL_TEXTURE27"/>
+ <field name="GL_TEXTURE28"/>
+ <field name="GL_TEXTURE29"/>
+ <field name="GL_TEXTURE3"/>
+ <field name="GL_TEXTURE30"/>
+ <field name="GL_TEXTURE31"/>
+ <field name="GL_TEXTURE4"/>
+ <field name="GL_TEXTURE5"/>
+ <field name="GL_TEXTURE6"/>
+ <field name="GL_TEXTURE7"/>
+ <field name="GL_TEXTURE8"/>
+ <field name="GL_TEXTURE9"/>
+ <field name="GL_TEXTURE_2D"/>
+ <field name="GL_TEXTURE_BINDING_2D"/>
+ <field name="GL_TEXTURE_BINDING_CUBE_MAP"/>
+ <field name="GL_TEXTURE_CUBE_MAP"/>
+ <field name="GL_TEXTURE_CUBE_MAP_NEGATIVE_X"/>
+ <field name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Y"/>
+ <field name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Z"/>
+ <field name="GL_TEXTURE_CUBE_MAP_POSITIVE_X"/>
+ <field name="GL_TEXTURE_CUBE_MAP_POSITIVE_Y"/>
+ <field name="GL_TEXTURE_CUBE_MAP_POSITIVE_Z"/>
+ <field name="GL_TEXTURE_MAG_FILTER"/>
+ <field name="GL_TEXTURE_MIN_FILTER"/>
+ <field name="GL_TEXTURE_WRAP_S"/>
+ <field name="GL_TEXTURE_WRAP_T"/>
+ <field name="GL_TRIANGLES"/>
+ <field name="GL_TRIANGLE_FAN"/>
+ <field name="GL_TRIANGLE_STRIP"/>
+ <field name="GL_TRUE"/>
+ <field name="GL_UNPACK_ALIGNMENT"/>
+ <field name="GL_UNSIGNED_BYTE"/>
+ <field name="GL_UNSIGNED_INT"/>
+ <field name="GL_UNSIGNED_SHORT"/>
+ <field name="GL_UNSIGNED_SHORT_4_4_4_4"/>
+ <field name="GL_UNSIGNED_SHORT_5_5_5_1"/>
+ <field name="GL_UNSIGNED_SHORT_5_6_5"/>
+ <field name="GL_VALIDATE_STATUS"/>
+ <field name="GL_VENDOR"/>
+ <field name="GL_VERSION"/>
+ <field name="GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING"/>
+ <field name="GL_VERTEX_ATTRIB_ARRAY_ENABLED"/>
+ <field name="GL_VERTEX_ATTRIB_ARRAY_NORMALIZED"/>
+ <field name="GL_VERTEX_ATTRIB_ARRAY_POINTER"/>
+ <field name="GL_VERTEX_ATTRIB_ARRAY_SIZE"/>
+ <field name="GL_VERTEX_ATTRIB_ARRAY_STRIDE"/>
+ <field name="GL_VERTEX_ATTRIB_ARRAY_TYPE"/>
+ <field name="GL_VERTEX_SHADER"/>
+ <field name="GL_VIEWPORT"/>
+ <field name="GL_ZERO"/>
+ </class>
+ <class name="android/opengl/GLES30" since="18">
+ <extends name="android/opengl/GLES20"/>
+ <method name="&lt;init>()V"/>
+ <method name="glBeginQuery(II)V"/>
+ <method name="glBeginTransformFeedback(I)V"/>
+ <method name="glBindBufferBase(III)V"/>
+ <method name="glBindBufferRange(IIIII)V"/>
+ <method name="glBindSampler(II)V"/>
+ <method name="glBindTransformFeedback(II)V"/>
+ <method name="glBindVertexArray(I)V"/>
+ <method name="glBlitFramebuffer(IIIIIIIIII)V"/>
+ <method name="glClearBufferfi(IIFI)V"/>
+ <method name="glClearBufferfv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glClearBufferfv(II[FI)V"/>
+ <method name="glClearBufferiv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glClearBufferiv(II[II)V"/>
+ <method name="glClearBufferuiv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glClearBufferuiv(II[II)V"/>
+ <method name="glClientWaitSync(JIJ)I"/>
+ <method name="glCompressedTexImage3D(IIIIIIIII)V"/>
+ <method name="glCompressedTexImage3D(IIIIIIIILjava/nio/Buffer;)V"/>
+ <method name="glCompressedTexSubImage3D(IIIIIIIIIII)V"/>
+ <method name="glCompressedTexSubImage3D(IIIIIIIIIILjava/nio/Buffer;)V"/>
+ <method name="glCopyBufferSubData(IIIII)V"/>
+ <method name="glCopyTexSubImage3D(IIIIIIIII)V"/>
+ <method name="glDeleteQueries(ILjava/nio/IntBuffer;)V"/>
+ <method name="glDeleteQueries(I[II)V"/>
+ <method name="glDeleteSamplers(ILjava/nio/IntBuffer;)V"/>
+ <method name="glDeleteSamplers(I[II)V"/>
+ <method name="glDeleteSync(J)V"/>
+ <method name="glDeleteTransformFeedbacks(ILjava/nio/IntBuffer;)V"/>
+ <method name="glDeleteTransformFeedbacks(I[II)V"/>
+ <method name="glDeleteVertexArrays(ILjava/nio/IntBuffer;)V"/>
+ <method name="glDeleteVertexArrays(I[II)V"/>
+ <method name="glDrawArraysInstanced(IIII)V"/>
+ <method name="glDrawBuffers(ILjava/nio/IntBuffer;)V"/>
+ <method name="glDrawBuffers(I[II)V"/>
+ <method name="glDrawElementsInstanced(IIIII)V"/>
+ <method name="glDrawElementsInstanced(IIILjava/nio/Buffer;I)V"/>
+ <method name="glDrawRangeElements(IIIIII)V"/>
+ <method name="glDrawRangeElements(IIIIILjava/nio/Buffer;)V"/>
+ <method name="glEndQuery(I)V"/>
+ <method name="glEndTransformFeedback()V"/>
+ <method name="glFenceSync(II)J"/>
+ <method name="glFlushMappedBufferRange(III)V"/>
+ <method name="glFramebufferTextureLayer(IIIII)V"/>
+ <method name="glGenQueries(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGenQueries(I[II)V"/>
+ <method name="glGenSamplers(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGenSamplers(I[II)V"/>
+ <method name="glGenTransformFeedbacks(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGenTransformFeedbacks(I[II)V"/>
+ <method name="glGenVertexArrays(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGenVertexArrays(I[II)V"/>
+ <method name="glGetActiveUniformBlockName(II)Ljava/lang/String;"/>
+ <method name="glGetActiveUniformBlockName(III[II[BI)V"/>
+ <method name="glGetActiveUniformBlockName(IILjava/nio/Buffer;Ljava/nio/Buffer;)V"/>
+ <method name="glGetActiveUniformBlockiv(IIILjava/nio/IntBuffer;)V"/>
+ <method name="glGetActiveUniformBlockiv(III[II)V"/>
+ <method name="glGetActiveUniformsiv(IILjava/nio/IntBuffer;ILjava/nio/IntBuffer;)V"/>
+ <method name="glGetActiveUniformsiv(II[III[II)V"/>
+ <method name="glGetBufferParameteri64v(IILjava/nio/LongBuffer;)V"/>
+ <method name="glGetBufferParameteri64v(II[JI)V"/>
+ <method name="glGetBufferPointerv(II)Ljava/nio/Buffer;"/>
+ <method name="glGetFragDataLocation(ILjava/lang/String;)I"/>
+ <method name="glGetInteger64i_v(IILjava/nio/LongBuffer;)V"/>
+ <method name="glGetInteger64i_v(II[JI)V"/>
+ <method name="glGetInteger64v(ILjava/nio/LongBuffer;)V"/>
+ <method name="glGetInteger64v(I[JI)V"/>
+ <method name="glGetIntegeri_v(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetIntegeri_v(II[II)V"/>
+ <method name="glGetInternalformativ(IIIILjava/nio/IntBuffer;)V"/>
+ <method name="glGetInternalformativ(IIII[II)V"/>
+ <method name="glGetProgramBinary(IILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/Buffer;)V"/>
+ <method name="glGetProgramBinary(II[II[IILjava/nio/Buffer;)V"/>
+ <method name="glGetQueryObjectuiv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetQueryObjectuiv(II[II)V"/>
+ <method name="glGetQueryiv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetQueryiv(II[II)V"/>
+ <method name="glGetSamplerParameterfv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glGetSamplerParameterfv(II[FI)V"/>
+ <method name="glGetSamplerParameteriv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetSamplerParameteriv(II[II)V"/>
+ <method name="glGetStringi(II)Ljava/lang/String;"/>
+ <method name="glGetSynciv(JIILjava/nio/IntBuffer;Ljava/nio/IntBuffer;)V"/>
+ <method name="glGetSynciv(JII[II[II)V"/>
+ <method name="glGetTransformFeedbackVarying(IIILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;B)V" deprecated="24"/>
+ <method name="glGetTransformFeedbackVarying(IIILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/ByteBuffer;)V" since="24"/>
+ <method name="glGetTransformFeedbackVarying(III[II[II[II[BI)V"/>
+ <method name="glGetTransformFeedbackVarying(IILjava/nio/IntBuffer;Ljava/nio/IntBuffer;)Ljava/lang/String;"/>
+ <method name="glGetTransformFeedbackVarying(II[II[II)Ljava/lang/String;"/>
+ <method name="glGetUniformBlockIndex(ILjava/lang/String;)I"/>
+ <method name="glGetUniformIndices(I[Ljava/lang/String;Ljava/nio/IntBuffer;)V"/>
+ <method name="glGetUniformIndices(I[Ljava/lang/String;[II)V"/>
+ <method name="glGetUniformuiv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetUniformuiv(II[II)V"/>
+ <method name="glGetVertexAttribIiv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetVertexAttribIiv(II[II)V"/>
+ <method name="glGetVertexAttribIuiv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetVertexAttribIuiv(II[II)V"/>
+ <method name="glInvalidateFramebuffer(IILjava/nio/IntBuffer;)V"/>
+ <method name="glInvalidateFramebuffer(II[II)V"/>
+ <method name="glInvalidateSubFramebuffer(IILjava/nio/IntBuffer;IIII)V"/>
+ <method name="glInvalidateSubFramebuffer(II[IIIIII)V"/>
+ <method name="glIsQuery(I)Z"/>
+ <method name="glIsSampler(I)Z"/>
+ <method name="glIsSync(J)Z"/>
+ <method name="glIsTransformFeedback(I)Z"/>
+ <method name="glIsVertexArray(I)Z"/>
+ <method name="glMapBufferRange(IIII)Ljava/nio/Buffer;"/>
+ <method name="glPauseTransformFeedback()V"/>
+ <method name="glProgramBinary(IILjava/nio/Buffer;I)V"/>
+ <method name="glProgramParameteri(III)V"/>
+ <method name="glReadBuffer(I)V"/>
+ <method name="glReadPixels(IIIIIII)V" since="24"/>
+ <method name="glRenderbufferStorageMultisample(IIIII)V"/>
+ <method name="glResumeTransformFeedback()V"/>
+ <method name="glSamplerParameterf(IIF)V"/>
+ <method name="glSamplerParameterfv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glSamplerParameterfv(II[FI)V"/>
+ <method name="glSamplerParameteri(III)V"/>
+ <method name="glSamplerParameteriv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glSamplerParameteriv(II[II)V"/>
+ <method name="glTexImage3D(IIIIIIIIII)V"/>
+ <method name="glTexImage3D(IIIIIIIIILjava/nio/Buffer;)V"/>
+ <method name="glTexStorage2D(IIIII)V"/>
+ <method name="glTexStorage3D(IIIIII)V"/>
+ <method name="glTexSubImage3D(IIIIIIIIIII)V"/>
+ <method name="glTexSubImage3D(IIIIIIIIIILjava/nio/Buffer;)V"/>
+ <method name="glTransformFeedbackVaryings(I[Ljava/lang/String;I)V"/>
+ <method name="glUniform1ui(II)V"/>
+ <method name="glUniform1uiv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glUniform1uiv(II[II)V"/>
+ <method name="glUniform2ui(III)V"/>
+ <method name="glUniform2uiv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glUniform2uiv(II[II)V"/>
+ <method name="glUniform3ui(IIII)V"/>
+ <method name="glUniform3uiv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glUniform3uiv(II[II)V"/>
+ <method name="glUniform4ui(IIIII)V"/>
+ <method name="glUniform4uiv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glUniform4uiv(II[II)V"/>
+ <method name="glUniformBlockBinding(III)V"/>
+ <method name="glUniformMatrix2x3fv(IIZLjava/nio/FloatBuffer;)V"/>
+ <method name="glUniformMatrix2x3fv(IIZ[FI)V"/>
+ <method name="glUniformMatrix2x4fv(IIZLjava/nio/FloatBuffer;)V"/>
+ <method name="glUniformMatrix2x4fv(IIZ[FI)V"/>
+ <method name="glUniformMatrix3x2fv(IIZLjava/nio/FloatBuffer;)V"/>
+ <method name="glUniformMatrix3x2fv(IIZ[FI)V"/>
+ <method name="glUniformMatrix3x4fv(IIZLjava/nio/FloatBuffer;)V"/>
+ <method name="glUniformMatrix3x4fv(IIZ[FI)V"/>
+ <method name="glUniformMatrix4x2fv(IIZLjava/nio/FloatBuffer;)V"/>
+ <method name="glUniformMatrix4x2fv(IIZ[FI)V"/>
+ <method name="glUniformMatrix4x3fv(IIZLjava/nio/FloatBuffer;)V"/>
+ <method name="glUniformMatrix4x3fv(IIZ[FI)V"/>
+ <method name="glUnmapBuffer(I)Z"/>
+ <method name="glVertexAttribDivisor(II)V"/>
+ <method name="glVertexAttribI4i(IIIII)V"/>
+ <method name="glVertexAttribI4iv(ILjava/nio/IntBuffer;)V"/>
+ <method name="glVertexAttribI4iv(I[II)V"/>
+ <method name="glVertexAttribI4ui(IIIII)V"/>
+ <method name="glVertexAttribI4uiv(ILjava/nio/IntBuffer;)V"/>
+ <method name="glVertexAttribI4uiv(I[II)V"/>
+ <method name="glVertexAttribIPointer(IIIII)V"/>
+ <method name="glVertexAttribIPointer(IIIILjava/nio/Buffer;)V"/>
+ <method name="glWaitSync(JIJ)V"/>
+ <field name="GL_ACTIVE_UNIFORM_BLOCKS"/>
+ <field name="GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH"/>
+ <field name="GL_ALREADY_SIGNALED"/>
+ <field name="GL_ANY_SAMPLES_PASSED"/>
+ <field name="GL_ANY_SAMPLES_PASSED_CONSERVATIVE"/>
+ <field name="GL_BLUE"/>
+ <field name="GL_BUFFER_ACCESS_FLAGS"/>
+ <field name="GL_BUFFER_MAPPED"/>
+ <field name="GL_BUFFER_MAP_LENGTH"/>
+ <field name="GL_BUFFER_MAP_OFFSET"/>
+ <field name="GL_BUFFER_MAP_POINTER"/>
+ <field name="GL_COLOR"/>
+ <field name="GL_COLOR_ATTACHMENT1"/>
+ <field name="GL_COLOR_ATTACHMENT10"/>
+ <field name="GL_COLOR_ATTACHMENT11"/>
+ <field name="GL_COLOR_ATTACHMENT12"/>
+ <field name="GL_COLOR_ATTACHMENT13"/>
+ <field name="GL_COLOR_ATTACHMENT14"/>
+ <field name="GL_COLOR_ATTACHMENT15"/>
+ <field name="GL_COLOR_ATTACHMENT2"/>
+ <field name="GL_COLOR_ATTACHMENT3"/>
+ <field name="GL_COLOR_ATTACHMENT4"/>
+ <field name="GL_COLOR_ATTACHMENT5"/>
+ <field name="GL_COLOR_ATTACHMENT6"/>
+ <field name="GL_COLOR_ATTACHMENT7"/>
+ <field name="GL_COLOR_ATTACHMENT8"/>
+ <field name="GL_COLOR_ATTACHMENT9"/>
+ <field name="GL_COMPARE_REF_TO_TEXTURE"/>
+ <field name="GL_COMPRESSED_R11_EAC"/>
+ <field name="GL_COMPRESSED_RG11_EAC"/>
+ <field name="GL_COMPRESSED_RGB8_ETC2"/>
+ <field name="GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2"/>
+ <field name="GL_COMPRESSED_RGBA8_ETC2_EAC"/>
+ <field name="GL_COMPRESSED_SIGNED_R11_EAC"/>
+ <field name="GL_COMPRESSED_SIGNED_RG11_EAC"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC"/>
+ <field name="GL_COMPRESSED_SRGB8_ETC2"/>
+ <field name="GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2"/>
+ <field name="GL_CONDITION_SATISFIED"/>
+ <field name="GL_COPY_READ_BUFFER"/>
+ <field name="GL_COPY_READ_BUFFER_BINDING"/>
+ <field name="GL_COPY_WRITE_BUFFER"/>
+ <field name="GL_COPY_WRITE_BUFFER_BINDING"/>
+ <field name="GL_CURRENT_QUERY"/>
+ <field name="GL_DEPTH"/>
+ <field name="GL_DEPTH24_STENCIL8"/>
+ <field name="GL_DEPTH32F_STENCIL8"/>
+ <field name="GL_DEPTH_COMPONENT24"/>
+ <field name="GL_DEPTH_COMPONENT32F"/>
+ <field name="GL_DEPTH_STENCIL"/>
+ <field name="GL_DEPTH_STENCIL_ATTACHMENT"/>
+ <field name="GL_DRAW_BUFFER0"/>
+ <field name="GL_DRAW_BUFFER1"/>
+ <field name="GL_DRAW_BUFFER10"/>
+ <field name="GL_DRAW_BUFFER11"/>
+ <field name="GL_DRAW_BUFFER12"/>
+ <field name="GL_DRAW_BUFFER13"/>
+ <field name="GL_DRAW_BUFFER14"/>
+ <field name="GL_DRAW_BUFFER15"/>
+ <field name="GL_DRAW_BUFFER2"/>
+ <field name="GL_DRAW_BUFFER3"/>
+ <field name="GL_DRAW_BUFFER4"/>
+ <field name="GL_DRAW_BUFFER5"/>
+ <field name="GL_DRAW_BUFFER6"/>
+ <field name="GL_DRAW_BUFFER7"/>
+ <field name="GL_DRAW_BUFFER8"/>
+ <field name="GL_DRAW_BUFFER9"/>
+ <field name="GL_DRAW_FRAMEBUFFER"/>
+ <field name="GL_DRAW_FRAMEBUFFER_BINDING"/>
+ <field name="GL_DYNAMIC_COPY"/>
+ <field name="GL_DYNAMIC_READ"/>
+ <field name="GL_FLOAT_32_UNSIGNED_INT_24_8_REV"/>
+ <field name="GL_FLOAT_MAT2x3"/>
+ <field name="GL_FLOAT_MAT2x4"/>
+ <field name="GL_FLOAT_MAT3x2"/>
+ <field name="GL_FLOAT_MAT3x4"/>
+ <field name="GL_FLOAT_MAT4x2"/>
+ <field name="GL_FLOAT_MAT4x3"/>
+ <field name="GL_FRAGMENT_SHADER_DERIVATIVE_HINT"/>
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE"/>
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE"/>
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING"/>
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE"/>
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE"/>
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE"/>
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE"/>
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE"/>
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER"/>
+ <field name="GL_FRAMEBUFFER_DEFAULT"/>
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE"/>
+ <field name="GL_FRAMEBUFFER_UNDEFINED"/>
+ <field name="GL_GREEN"/>
+ <field name="GL_HALF_FLOAT"/>
+ <field name="GL_INTERLEAVED_ATTRIBS"/>
+ <field name="GL_INT_2_10_10_10_REV"/>
+ <field name="GL_INT_SAMPLER_2D"/>
+ <field name="GL_INT_SAMPLER_2D_ARRAY"/>
+ <field name="GL_INT_SAMPLER_3D"/>
+ <field name="GL_INT_SAMPLER_CUBE"/>
+ <field name="GL_INVALID_INDEX"/>
+ <field name="GL_MAJOR_VERSION"/>
+ <field name="GL_MAP_FLUSH_EXPLICIT_BIT"/>
+ <field name="GL_MAP_INVALIDATE_BUFFER_BIT"/>
+ <field name="GL_MAP_INVALIDATE_RANGE_BIT"/>
+ <field name="GL_MAP_READ_BIT"/>
+ <field name="GL_MAP_UNSYNCHRONIZED_BIT"/>
+ <field name="GL_MAP_WRITE_BIT"/>
+ <field name="GL_MAX"/>
+ <field name="GL_MAX_3D_TEXTURE_SIZE"/>
+ <field name="GL_MAX_ARRAY_TEXTURE_LAYERS"/>
+ <field name="GL_MAX_COLOR_ATTACHMENTS"/>
+ <field name="GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS"/>
+ <field name="GL_MAX_COMBINED_UNIFORM_BLOCKS"/>
+ <field name="GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS"/>
+ <field name="GL_MAX_DRAW_BUFFERS"/>
+ <field name="GL_MAX_ELEMENTS_INDICES"/>
+ <field name="GL_MAX_ELEMENTS_VERTICES"/>
+ <field name="GL_MAX_ELEMENT_INDEX"/>
+ <field name="GL_MAX_FRAGMENT_INPUT_COMPONENTS"/>
+ <field name="GL_MAX_FRAGMENT_UNIFORM_BLOCKS"/>
+ <field name="GL_MAX_FRAGMENT_UNIFORM_COMPONENTS"/>
+ <field name="GL_MAX_PROGRAM_TEXEL_OFFSET"/>
+ <field name="GL_MAX_SAMPLES"/>
+ <field name="GL_MAX_SERVER_WAIT_TIMEOUT"/>
+ <field name="GL_MAX_TEXTURE_LOD_BIAS"/>
+ <field name="GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS"/>
+ <field name="GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS"/>
+ <field name="GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS"/>
+ <field name="GL_MAX_UNIFORM_BLOCK_SIZE"/>
+ <field name="GL_MAX_UNIFORM_BUFFER_BINDINGS"/>
+ <field name="GL_MAX_VARYING_COMPONENTS"/>
+ <field name="GL_MAX_VERTEX_OUTPUT_COMPONENTS"/>
+ <field name="GL_MAX_VERTEX_UNIFORM_BLOCKS"/>
+ <field name="GL_MAX_VERTEX_UNIFORM_COMPONENTS"/>
+ <field name="GL_MIN"/>
+ <field name="GL_MINOR_VERSION"/>
+ <field name="GL_MIN_PROGRAM_TEXEL_OFFSET"/>
+ <field name="GL_NUM_EXTENSIONS"/>
+ <field name="GL_NUM_PROGRAM_BINARY_FORMATS"/>
+ <field name="GL_NUM_SAMPLE_COUNTS"/>
+ <field name="GL_OBJECT_TYPE"/>
+ <field name="GL_PACK_ROW_LENGTH"/>
+ <field name="GL_PACK_SKIP_PIXELS"/>
+ <field name="GL_PACK_SKIP_ROWS"/>
+ <field name="GL_PIXEL_PACK_BUFFER"/>
+ <field name="GL_PIXEL_PACK_BUFFER_BINDING"/>
+ <field name="GL_PIXEL_UNPACK_BUFFER"/>
+ <field name="GL_PIXEL_UNPACK_BUFFER_BINDING"/>
+ <field name="GL_PRIMITIVE_RESTART_FIXED_INDEX"/>
+ <field name="GL_PROGRAM_BINARY_FORMATS"/>
+ <field name="GL_PROGRAM_BINARY_LENGTH"/>
+ <field name="GL_PROGRAM_BINARY_RETRIEVABLE_HINT"/>
+ <field name="GL_QUERY_RESULT"/>
+ <field name="GL_QUERY_RESULT_AVAILABLE"/>
+ <field name="GL_R11F_G11F_B10F"/>
+ <field name="GL_R16F"/>
+ <field name="GL_R16I"/>
+ <field name="GL_R16UI"/>
+ <field name="GL_R32F"/>
+ <field name="GL_R32I"/>
+ <field name="GL_R32UI"/>
+ <field name="GL_R8"/>
+ <field name="GL_R8I"/>
+ <field name="GL_R8UI"/>
+ <field name="GL_R8_SNORM"/>
+ <field name="GL_RASTERIZER_DISCARD"/>
+ <field name="GL_READ_BUFFER"/>
+ <field name="GL_READ_FRAMEBUFFER"/>
+ <field name="GL_READ_FRAMEBUFFER_BINDING"/>
+ <field name="GL_RED"/>
+ <field name="GL_RED_INTEGER"/>
+ <field name="GL_RENDERBUFFER_SAMPLES"/>
+ <field name="GL_RG"/>
+ <field name="GL_RG16F"/>
+ <field name="GL_RG16I"/>
+ <field name="GL_RG16UI"/>
+ <field name="GL_RG32F"/>
+ <field name="GL_RG32I"/>
+ <field name="GL_RG32UI"/>
+ <field name="GL_RG8"/>
+ <field name="GL_RG8I"/>
+ <field name="GL_RG8UI"/>
+ <field name="GL_RG8_SNORM"/>
+ <field name="GL_RGB10_A2"/>
+ <field name="GL_RGB10_A2UI"/>
+ <field name="GL_RGB16F"/>
+ <field name="GL_RGB16I"/>
+ <field name="GL_RGB16UI"/>
+ <field name="GL_RGB32F"/>
+ <field name="GL_RGB32I"/>
+ <field name="GL_RGB32UI"/>
+ <field name="GL_RGB8"/>
+ <field name="GL_RGB8I"/>
+ <field name="GL_RGB8UI"/>
+ <field name="GL_RGB8_SNORM"/>
+ <field name="GL_RGB9_E5"/>
+ <field name="GL_RGBA16F"/>
+ <field name="GL_RGBA16I"/>
+ <field name="GL_RGBA16UI"/>
+ <field name="GL_RGBA32F"/>
+ <field name="GL_RGBA32I"/>
+ <field name="GL_RGBA32UI"/>
+ <field name="GL_RGBA8"/>
+ <field name="GL_RGBA8I"/>
+ <field name="GL_RGBA8UI"/>
+ <field name="GL_RGBA8_SNORM"/>
+ <field name="GL_RGBA_INTEGER"/>
+ <field name="GL_RGB_INTEGER"/>
+ <field name="GL_RG_INTEGER"/>
+ <field name="GL_SAMPLER_2D_ARRAY"/>
+ <field name="GL_SAMPLER_2D_ARRAY_SHADOW"/>
+ <field name="GL_SAMPLER_2D_SHADOW"/>
+ <field name="GL_SAMPLER_3D"/>
+ <field name="GL_SAMPLER_BINDING"/>
+ <field name="GL_SAMPLER_CUBE_SHADOW"/>
+ <field name="GL_SEPARATE_ATTRIBS"/>
+ <field name="GL_SIGNALED"/>
+ <field name="GL_SIGNED_NORMALIZED"/>
+ <field name="GL_SRGB"/>
+ <field name="GL_SRGB8"/>
+ <field name="GL_SRGB8_ALPHA8"/>
+ <field name="GL_STATIC_COPY"/>
+ <field name="GL_STATIC_READ"/>
+ <field name="GL_STENCIL"/>
+ <field name="GL_STREAM_COPY"/>
+ <field name="GL_STREAM_READ"/>
+ <field name="GL_SYNC_CONDITION"/>
+ <field name="GL_SYNC_FENCE"/>
+ <field name="GL_SYNC_FLAGS"/>
+ <field name="GL_SYNC_FLUSH_COMMANDS_BIT"/>
+ <field name="GL_SYNC_GPU_COMMANDS_COMPLETE"/>
+ <field name="GL_SYNC_STATUS"/>
+ <field name="GL_TEXTURE_2D_ARRAY"/>
+ <field name="GL_TEXTURE_3D"/>
+ <field name="GL_TEXTURE_BASE_LEVEL"/>
+ <field name="GL_TEXTURE_BINDING_2D_ARRAY"/>
+ <field name="GL_TEXTURE_BINDING_3D"/>
+ <field name="GL_TEXTURE_COMPARE_FUNC"/>
+ <field name="GL_TEXTURE_COMPARE_MODE"/>
+ <field name="GL_TEXTURE_IMMUTABLE_FORMAT"/>
+ <field name="GL_TEXTURE_IMMUTABLE_LEVELS"/>
+ <field name="GL_TEXTURE_MAX_LEVEL"/>
+ <field name="GL_TEXTURE_MAX_LOD"/>
+ <field name="GL_TEXTURE_MIN_LOD"/>
+ <field name="GL_TEXTURE_SWIZZLE_A"/>
+ <field name="GL_TEXTURE_SWIZZLE_B"/>
+ <field name="GL_TEXTURE_SWIZZLE_G"/>
+ <field name="GL_TEXTURE_SWIZZLE_R"/>
+ <field name="GL_TEXTURE_WRAP_R"/>
+ <field name="GL_TIMEOUT_EXPIRED"/>
+ <field name="GL_TIMEOUT_IGNORED"/>
+ <field name="GL_TRANSFORM_FEEDBACK"/>
+ <field name="GL_TRANSFORM_FEEDBACK_ACTIVE"/>
+ <field name="GL_TRANSFORM_FEEDBACK_BINDING"/>
+ <field name="GL_TRANSFORM_FEEDBACK_BUFFER"/>
+ <field name="GL_TRANSFORM_FEEDBACK_BUFFER_BINDING"/>
+ <field name="GL_TRANSFORM_FEEDBACK_BUFFER_MODE"/>
+ <field name="GL_TRANSFORM_FEEDBACK_BUFFER_SIZE"/>
+ <field name="GL_TRANSFORM_FEEDBACK_BUFFER_START"/>
+ <field name="GL_TRANSFORM_FEEDBACK_PAUSED"/>
+ <field name="GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN"/>
+ <field name="GL_TRANSFORM_FEEDBACK_VARYINGS"/>
+ <field name="GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH"/>
+ <field name="GL_UNIFORM_ARRAY_STRIDE"/>
+ <field name="GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS"/>
+ <field name="GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES"/>
+ <field name="GL_UNIFORM_BLOCK_BINDING"/>
+ <field name="GL_UNIFORM_BLOCK_DATA_SIZE"/>
+ <field name="GL_UNIFORM_BLOCK_INDEX"/>
+ <field name="GL_UNIFORM_BLOCK_NAME_LENGTH"/>
+ <field name="GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER"/>
+ <field name="GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER"/>
+ <field name="GL_UNIFORM_BUFFER"/>
+ <field name="GL_UNIFORM_BUFFER_BINDING"/>
+ <field name="GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT"/>
+ <field name="GL_UNIFORM_BUFFER_SIZE"/>
+ <field name="GL_UNIFORM_BUFFER_START"/>
+ <field name="GL_UNIFORM_IS_ROW_MAJOR"/>
+ <field name="GL_UNIFORM_MATRIX_STRIDE"/>
+ <field name="GL_UNIFORM_NAME_LENGTH"/>
+ <field name="GL_UNIFORM_OFFSET"/>
+ <field name="GL_UNIFORM_SIZE"/>
+ <field name="GL_UNIFORM_TYPE"/>
+ <field name="GL_UNPACK_IMAGE_HEIGHT"/>
+ <field name="GL_UNPACK_ROW_LENGTH"/>
+ <field name="GL_UNPACK_SKIP_IMAGES"/>
+ <field name="GL_UNPACK_SKIP_PIXELS"/>
+ <field name="GL_UNPACK_SKIP_ROWS"/>
+ <field name="GL_UNSIGNALED"/>
+ <field name="GL_UNSIGNED_INT_10F_11F_11F_REV"/>
+ <field name="GL_UNSIGNED_INT_24_8"/>
+ <field name="GL_UNSIGNED_INT_2_10_10_10_REV"/>
+ <field name="GL_UNSIGNED_INT_5_9_9_9_REV"/>
+ <field name="GL_UNSIGNED_INT_SAMPLER_2D"/>
+ <field name="GL_UNSIGNED_INT_SAMPLER_2D_ARRAY"/>
+ <field name="GL_UNSIGNED_INT_SAMPLER_3D"/>
+ <field name="GL_UNSIGNED_INT_SAMPLER_CUBE"/>
+ <field name="GL_UNSIGNED_INT_VEC2"/>
+ <field name="GL_UNSIGNED_INT_VEC3"/>
+ <field name="GL_UNSIGNED_INT_VEC4"/>
+ <field name="GL_UNSIGNED_NORMALIZED"/>
+ <field name="GL_VERTEX_ARRAY_BINDING"/>
+ <field name="GL_VERTEX_ATTRIB_ARRAY_DIVISOR"/>
+ <field name="GL_VERTEX_ATTRIB_ARRAY_INTEGER"/>
+ <field name="GL_WAIT_FAILED"/>
+ </class>
+ <class name="android/opengl/GLES31" since="21">
+ <extends name="android/opengl/GLES30"/>
+ <method name="&lt;init>()V"/>
+ <method name="glActiveShaderProgram(II)V"/>
+ <method name="glBindImageTexture(IIIZIII)V"/>
+ <method name="glBindProgramPipeline(I)V"/>
+ <method name="glBindVertexBuffer(IIJI)V"/>
+ <method name="glCreateShaderProgramv(I[Ljava/lang/String;)I"/>
+ <method name="glDeleteProgramPipelines(ILjava/nio/IntBuffer;)V"/>
+ <method name="glDeleteProgramPipelines(I[II)V"/>
+ <method name="glDispatchCompute(III)V"/>
+ <method name="glDispatchComputeIndirect(J)V"/>
+ <method name="glDrawArraysIndirect(IJ)V"/>
+ <method name="glDrawElementsIndirect(IIJ)V"/>
+ <method name="glFramebufferParameteri(III)V"/>
+ <method name="glGenProgramPipelines(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGenProgramPipelines(I[II)V"/>
+ <method name="glGetBooleani_v(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetBooleani_v(II[ZI)V"/>
+ <method name="glGetFramebufferParameteriv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetFramebufferParameteriv(II[II)V"/>
+ <method name="glGetMultisamplefv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glGetMultisamplefv(II[FI)V"/>
+ <method name="glGetProgramInterfaceiv(IIILjava/nio/IntBuffer;)V"/>
+ <method name="glGetProgramInterfaceiv(III[II)V"/>
+ <method name="glGetProgramPipelineInfoLog(I)Ljava/lang/String;"/>
+ <method name="glGetProgramPipelineiv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetProgramPipelineiv(II[II)V"/>
+ <method name="glGetProgramResourceIndex(IILjava/lang/String;)I"/>
+ <method name="glGetProgramResourceLocation(IILjava/lang/String;)I"/>
+ <method name="glGetProgramResourceName(III)Ljava/lang/String;"/>
+ <method name="glGetProgramResourceiv(IIIILjava/nio/IntBuffer;ILjava/nio/IntBuffer;Ljava/nio/IntBuffer;)V"/>
+ <method name="glGetProgramResourceiv(IIII[III[II[II)V"/>
+ <method name="glGetTexLevelParameterfv(IIILjava/nio/FloatBuffer;)V"/>
+ <method name="glGetTexLevelParameterfv(III[FI)V"/>
+ <method name="glGetTexLevelParameteriv(IIILjava/nio/IntBuffer;)V"/>
+ <method name="glGetTexLevelParameteriv(III[II)V"/>
+ <method name="glIsProgramPipeline(I)Z"/>
+ <method name="glMemoryBarrier(I)V"/>
+ <method name="glMemoryBarrierByRegion(I)V"/>
+ <method name="glProgramUniform1f(IIF)V"/>
+ <method name="glProgramUniform1fv(IIILjava/nio/FloatBuffer;)V"/>
+ <method name="glProgramUniform1fv(III[FI)V"/>
+ <method name="glProgramUniform1i(III)V"/>
+ <method name="glProgramUniform1iv(IIILjava/nio/IntBuffer;)V"/>
+ <method name="glProgramUniform1iv(III[II)V"/>
+ <method name="glProgramUniform1ui(III)V"/>
+ <method name="glProgramUniform1uiv(IIILjava/nio/IntBuffer;)V"/>
+ <method name="glProgramUniform1uiv(III[II)V"/>
+ <method name="glProgramUniform2f(IIFF)V"/>
+ <method name="glProgramUniform2fv(IIILjava/nio/FloatBuffer;)V"/>
+ <method name="glProgramUniform2fv(III[FI)V"/>
+ <method name="glProgramUniform2i(IIII)V"/>
+ <method name="glProgramUniform2iv(IIILjava/nio/IntBuffer;)V"/>
+ <method name="glProgramUniform2iv(III[II)V"/>
+ <method name="glProgramUniform2ui(IIII)V"/>
+ <method name="glProgramUniform2uiv(IIILjava/nio/IntBuffer;)V"/>
+ <method name="glProgramUniform2uiv(III[II)V"/>
+ <method name="glProgramUniform3f(IIFFF)V"/>
+ <method name="glProgramUniform3fv(IIILjava/nio/FloatBuffer;)V"/>
+ <method name="glProgramUniform3fv(III[FI)V"/>
+ <method name="glProgramUniform3i(IIIII)V"/>
+ <method name="glProgramUniform3iv(IIILjava/nio/IntBuffer;)V"/>
+ <method name="glProgramUniform3iv(III[II)V"/>
+ <method name="glProgramUniform3ui(IIIII)V"/>
+ <method name="glProgramUniform3uiv(IIILjava/nio/IntBuffer;)V"/>
+ <method name="glProgramUniform3uiv(III[II)V"/>
+ <method name="glProgramUniform4f(IIFFFF)V"/>
+ <method name="glProgramUniform4fv(IIILjava/nio/FloatBuffer;)V"/>
+ <method name="glProgramUniform4fv(III[FI)V"/>
+ <method name="glProgramUniform4i(IIIIII)V"/>
+ <method name="glProgramUniform4iv(IIILjava/nio/IntBuffer;)V"/>
+ <method name="glProgramUniform4iv(III[II)V"/>
+ <method name="glProgramUniform4ui(IIIIII)V"/>
+ <method name="glProgramUniform4uiv(IIILjava/nio/IntBuffer;)V"/>
+ <method name="glProgramUniform4uiv(III[II)V"/>
+ <method name="glProgramUniformMatrix2fv(IIIZLjava/nio/FloatBuffer;)V"/>
+ <method name="glProgramUniformMatrix2fv(IIIZ[FI)V"/>
+ <method name="glProgramUniformMatrix2x3fv(IIIZLjava/nio/FloatBuffer;)V"/>
+ <method name="glProgramUniformMatrix2x3fv(IIIZ[FI)V"/>
+ <method name="glProgramUniformMatrix2x4fv(IIIZLjava/nio/FloatBuffer;)V"/>
+ <method name="glProgramUniformMatrix2x4fv(IIIZ[FI)V"/>
+ <method name="glProgramUniformMatrix3fv(IIIZLjava/nio/FloatBuffer;)V"/>
+ <method name="glProgramUniformMatrix3fv(IIIZ[FI)V"/>
+ <method name="glProgramUniformMatrix3x2fv(IIIZLjava/nio/FloatBuffer;)V"/>
+ <method name="glProgramUniformMatrix3x2fv(IIIZ[FI)V"/>
+ <method name="glProgramUniformMatrix3x4fv(IIIZLjava/nio/FloatBuffer;)V"/>
+ <method name="glProgramUniformMatrix3x4fv(IIIZ[FI)V"/>
+ <method name="glProgramUniformMatrix4fv(IIIZLjava/nio/FloatBuffer;)V"/>
+ <method name="glProgramUniformMatrix4fv(IIIZ[FI)V"/>
+ <method name="glProgramUniformMatrix4x2fv(IIIZLjava/nio/FloatBuffer;)V"/>
+ <method name="glProgramUniformMatrix4x2fv(IIIZ[FI)V"/>
+ <method name="glProgramUniformMatrix4x3fv(IIIZLjava/nio/FloatBuffer;)V"/>
+ <method name="glProgramUniformMatrix4x3fv(IIIZ[FI)V"/>
+ <method name="glSampleMaski(II)V"/>
+ <method name="glTexStorage2DMultisample(IIIIIZ)V"/>
+ <method name="glUseProgramStages(III)V"/>
+ <method name="glValidateProgramPipeline(I)V"/>
+ <method name="glVertexAttribBinding(II)V"/>
+ <method name="glVertexAttribFormat(IIIZI)V"/>
+ <method name="glVertexAttribIFormat(IIII)V"/>
+ <method name="glVertexBindingDivisor(II)V"/>
+ <field name="GL_ACTIVE_ATOMIC_COUNTER_BUFFERS"/>
+ <field name="GL_ACTIVE_PROGRAM"/>
+ <field name="GL_ACTIVE_RESOURCES"/>
+ <field name="GL_ACTIVE_VARIABLES"/>
+ <field name="GL_ALL_BARRIER_BITS" since="24"/>
+ <field name="GL_ALL_SHADER_BITS"/>
+ <field name="GL_ARRAY_SIZE"/>
+ <field name="GL_ARRAY_STRIDE"/>
+ <field name="GL_ATOMIC_COUNTER_BARRIER_BIT"/>
+ <field name="GL_ATOMIC_COUNTER_BUFFER"/>
+ <field name="GL_ATOMIC_COUNTER_BUFFER_BINDING"/>
+ <field name="GL_ATOMIC_COUNTER_BUFFER_INDEX"/>
+ <field name="GL_ATOMIC_COUNTER_BUFFER_SIZE"/>
+ <field name="GL_ATOMIC_COUNTER_BUFFER_START"/>
+ <field name="GL_BLOCK_INDEX"/>
+ <field name="GL_BUFFER_BINDING"/>
+ <field name="GL_BUFFER_DATA_SIZE"/>
+ <field name="GL_BUFFER_UPDATE_BARRIER_BIT"/>
+ <field name="GL_BUFFER_VARIABLE"/>
+ <field name="GL_COMMAND_BARRIER_BIT"/>
+ <field name="GL_COMPUTE_SHADER"/>
+ <field name="GL_COMPUTE_SHADER_BIT"/>
+ <field name="GL_COMPUTE_WORK_GROUP_SIZE"/>
+ <field name="GL_DEPTH_STENCIL_TEXTURE_MODE"/>
+ <field name="GL_DISPATCH_INDIRECT_BUFFER"/>
+ <field name="GL_DISPATCH_INDIRECT_BUFFER_BINDING"/>
+ <field name="GL_DRAW_INDIRECT_BUFFER"/>
+ <field name="GL_DRAW_INDIRECT_BUFFER_BINDING"/>
+ <field name="GL_ELEMENT_ARRAY_BARRIER_BIT" since="24"/>
+ <field name="GL_FRAGMENT_SHADER_BIT"/>
+ <field name="GL_FRAMEBUFFER_BARRIER_BIT"/>
+ <field name="GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS"/>
+ <field name="GL_FRAMEBUFFER_DEFAULT_HEIGHT"/>
+ <field name="GL_FRAMEBUFFER_DEFAULT_SAMPLES"/>
+ <field name="GL_FRAMEBUFFER_DEFAULT_WIDTH"/>
+ <field name="GL_IMAGE_2D"/>
+ <field name="GL_IMAGE_2D_ARRAY"/>
+ <field name="GL_IMAGE_3D"/>
+ <field name="GL_IMAGE_BINDING_ACCESS"/>
+ <field name="GL_IMAGE_BINDING_FORMAT"/>
+ <field name="GL_IMAGE_BINDING_LAYER"/>
+ <field name="GL_IMAGE_BINDING_LAYERED"/>
+ <field name="GL_IMAGE_BINDING_LEVEL"/>
+ <field name="GL_IMAGE_BINDING_NAME"/>
+ <field name="GL_IMAGE_CUBE"/>
+ <field name="GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS"/>
+ <field name="GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE"/>
+ <field name="GL_IMAGE_FORMAT_COMPATIBILITY_TYPE"/>
+ <field name="GL_INT_IMAGE_2D"/>
+ <field name="GL_INT_IMAGE_2D_ARRAY"/>
+ <field name="GL_INT_IMAGE_3D"/>
+ <field name="GL_INT_IMAGE_CUBE"/>
+ <field name="GL_INT_SAMPLER_2D_MULTISAMPLE"/>
+ <field name="GL_IS_ROW_MAJOR"/>
+ <field name="GL_LOCATION"/>
+ <field name="GL_MATRIX_STRIDE"/>
+ <field name="GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS"/>
+ <field name="GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE"/>
+ <field name="GL_MAX_COLOR_TEXTURE_SAMPLES"/>
+ <field name="GL_MAX_COMBINED_ATOMIC_COUNTERS"/>
+ <field name="GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS"/>
+ <field name="GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS"/>
+ <field name="GL_MAX_COMBINED_IMAGE_UNIFORMS"/>
+ <field name="GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES"/>
+ <field name="GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS"/>
+ <field name="GL_MAX_COMPUTE_ATOMIC_COUNTERS"/>
+ <field name="GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS"/>
+ <field name="GL_MAX_COMPUTE_IMAGE_UNIFORMS"/>
+ <field name="GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS"/>
+ <field name="GL_MAX_COMPUTE_SHARED_MEMORY_SIZE"/>
+ <field name="GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS"/>
+ <field name="GL_MAX_COMPUTE_UNIFORM_BLOCKS"/>
+ <field name="GL_MAX_COMPUTE_UNIFORM_COMPONENTS"/>
+ <field name="GL_MAX_COMPUTE_WORK_GROUP_COUNT"/>
+ <field name="GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS"/>
+ <field name="GL_MAX_COMPUTE_WORK_GROUP_SIZE"/>
+ <field name="GL_MAX_DEPTH_TEXTURE_SAMPLES"/>
+ <field name="GL_MAX_FRAGMENT_ATOMIC_COUNTERS"/>
+ <field name="GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS"/>
+ <field name="GL_MAX_FRAGMENT_IMAGE_UNIFORMS"/>
+ <field name="GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS"/>
+ <field name="GL_MAX_FRAMEBUFFER_HEIGHT"/>
+ <field name="GL_MAX_FRAMEBUFFER_SAMPLES"/>
+ <field name="GL_MAX_FRAMEBUFFER_WIDTH"/>
+ <field name="GL_MAX_IMAGE_UNITS"/>
+ <field name="GL_MAX_INTEGER_SAMPLES"/>
+ <field name="GL_MAX_NAME_LENGTH"/>
+ <field name="GL_MAX_NUM_ACTIVE_VARIABLES"/>
+ <field name="GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET"/>
+ <field name="GL_MAX_SAMPLE_MASK_WORDS"/>
+ <field name="GL_MAX_SHADER_STORAGE_BLOCK_SIZE"/>
+ <field name="GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS"/>
+ <field name="GL_MAX_UNIFORM_LOCATIONS"/>
+ <field name="GL_MAX_VERTEX_ATOMIC_COUNTERS"/>
+ <field name="GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS"/>
+ <field name="GL_MAX_VERTEX_ATTRIB_BINDINGS"/>
+ <field name="GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET"/>
+ <field name="GL_MAX_VERTEX_ATTRIB_STRIDE"/>
+ <field name="GL_MAX_VERTEX_IMAGE_UNIFORMS"/>
+ <field name="GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS"/>
+ <field name="GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET"/>
+ <field name="GL_NAME_LENGTH"/>
+ <field name="GL_NUM_ACTIVE_VARIABLES"/>
+ <field name="GL_OFFSET"/>
+ <field name="GL_PIXEL_BUFFER_BARRIER_BIT"/>
+ <field name="GL_PROGRAM_INPUT"/>
+ <field name="GL_PROGRAM_OUTPUT"/>
+ <field name="GL_PROGRAM_PIPELINE_BINDING"/>
+ <field name="GL_PROGRAM_SEPARABLE"/>
+ <field name="GL_READ_ONLY"/>
+ <field name="GL_READ_WRITE"/>
+ <field name="GL_REFERENCED_BY_COMPUTE_SHADER"/>
+ <field name="GL_REFERENCED_BY_FRAGMENT_SHADER"/>
+ <field name="GL_REFERENCED_BY_VERTEX_SHADER"/>
+ <field name="GL_SAMPLER_2D_MULTISAMPLE"/>
+ <field name="GL_SAMPLE_MASK"/>
+ <field name="GL_SAMPLE_MASK_VALUE"/>
+ <field name="GL_SAMPLE_POSITION"/>
+ <field name="GL_SHADER_IMAGE_ACCESS_BARRIER_BIT" since="24"/>
+ <field name="GL_SHADER_STORAGE_BARRIER_BIT"/>
+ <field name="GL_SHADER_STORAGE_BLOCK"/>
+ <field name="GL_SHADER_STORAGE_BUFFER"/>
+ <field name="GL_SHADER_STORAGE_BUFFER_BINDING"/>
+ <field name="GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT"/>
+ <field name="GL_SHADER_STORAGE_BUFFER_SIZE"/>
+ <field name="GL_SHADER_STORAGE_BUFFER_START"/>
+ <field name="GL_STENCIL_INDEX"/>
+ <field name="GL_TEXTURE_2D_MULTISAMPLE"/>
+ <field name="GL_TEXTURE_ALPHA_SIZE"/>
+ <field name="GL_TEXTURE_ALPHA_TYPE"/>
+ <field name="GL_TEXTURE_BINDING_2D_MULTISAMPLE"/>
+ <field name="GL_TEXTURE_BLUE_SIZE"/>
+ <field name="GL_TEXTURE_BLUE_TYPE"/>
+ <field name="GL_TEXTURE_COMPRESSED"/>
+ <field name="GL_TEXTURE_DEPTH"/>
+ <field name="GL_TEXTURE_DEPTH_SIZE"/>
+ <field name="GL_TEXTURE_DEPTH_TYPE"/>
+ <field name="GL_TEXTURE_FETCH_BARRIER_BIT"/>
+ <field name="GL_TEXTURE_FIXED_SAMPLE_LOCATIONS"/>
+ <field name="GL_TEXTURE_GREEN_SIZE"/>
+ <field name="GL_TEXTURE_GREEN_TYPE"/>
+ <field name="GL_TEXTURE_HEIGHT"/>
+ <field name="GL_TEXTURE_INTERNAL_FORMAT"/>
+ <field name="GL_TEXTURE_RED_SIZE"/>
+ <field name="GL_TEXTURE_RED_TYPE"/>
+ <field name="GL_TEXTURE_SAMPLES"/>
+ <field name="GL_TEXTURE_SHARED_SIZE"/>
+ <field name="GL_TEXTURE_STENCIL_SIZE"/>
+ <field name="GL_TEXTURE_UPDATE_BARRIER_BIT"/>
+ <field name="GL_TEXTURE_WIDTH"/>
+ <field name="GL_TOP_LEVEL_ARRAY_SIZE"/>
+ <field name="GL_TOP_LEVEL_ARRAY_STRIDE"/>
+ <field name="GL_TRANSFORM_FEEDBACK_BARRIER_BIT"/>
+ <field name="GL_TRANSFORM_FEEDBACK_VARYING"/>
+ <field name="GL_TYPE"/>
+ <field name="GL_UNIFORM"/>
+ <field name="GL_UNIFORM_BARRIER_BIT"/>
+ <field name="GL_UNIFORM_BLOCK"/>
+ <field name="GL_UNSIGNED_INT_ATOMIC_COUNTER"/>
+ <field name="GL_UNSIGNED_INT_IMAGE_2D"/>
+ <field name="GL_UNSIGNED_INT_IMAGE_2D_ARRAY"/>
+ <field name="GL_UNSIGNED_INT_IMAGE_3D"/>
+ <field name="GL_UNSIGNED_INT_IMAGE_CUBE"/>
+ <field name="GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE"/>
+ <field name="GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT" since="24"/>
+ <field name="GL_VERTEX_ATTRIB_BINDING"/>
+ <field name="GL_VERTEX_ATTRIB_RELATIVE_OFFSET"/>
+ <field name="GL_VERTEX_BINDING_BUFFER"/>
+ <field name="GL_VERTEX_BINDING_DIVISOR"/>
+ <field name="GL_VERTEX_BINDING_OFFSET"/>
+ <field name="GL_VERTEX_BINDING_STRIDE"/>
+ <field name="GL_VERTEX_SHADER_BIT"/>
+ <field name="GL_WRITE_ONLY"/>
+ </class>
+ <class name="android/opengl/GLES31Ext" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="glBlendBarrierKHR()V"/>
+ <method name="glBlendEquationSeparateiEXT(III)V"/>
+ <method name="glBlendEquationiEXT(II)V"/>
+ <method name="glBlendFuncSeparateiEXT(IIIII)V"/>
+ <method name="glBlendFunciEXT(III)V"/>
+ <method name="glColorMaskiEXT(IZZZZ)V"/>
+ <method name="glCopyImageSubDataEXT(IIIIIIIIIIIIIII)V"/>
+ <method name="glDebugMessageCallbackKHR(Landroid/opengl/GLES31Ext$DebugProcKHR;)V"/>
+ <method name="glDebugMessageControlKHR(IIIILjava/nio/IntBuffer;Z)V"/>
+ <method name="glDebugMessageControlKHR(IIII[IIZ)V"/>
+ <method name="glDebugMessageInsertKHR(IIIILjava/lang/String;)V"/>
+ <method name="glDisableiEXT(II)V"/>
+ <method name="glEnableiEXT(II)V"/>
+ <method name="glFramebufferTextureEXT(IIII)V"/>
+ <method name="glGetDebugMessageCallbackKHR()Landroid/opengl/GLES31Ext$DebugProcKHR;"/>
+ <method name="glGetDebugMessageLogKHR(II[II[II[II[II[II[BI)I"/>
+ <method name="glGetDebugMessageLogKHR(ILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;)[Ljava/lang/String;"/>
+ <method name="glGetDebugMessageLogKHR(ILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/ByteBuffer;)I"/>
+ <method name="glGetDebugMessageLogKHR(I[II[II[II[II)[Ljava/lang/String;"/>
+ <method name="glGetObjectLabelKHR(II)Ljava/lang/String;"/>
+ <method name="glGetObjectPtrLabelKHR(J)Ljava/lang/String;"/>
+ <method name="glGetSamplerParameterIivEXT(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetSamplerParameterIivEXT(II[II)V"/>
+ <method name="glGetSamplerParameterIuivEXT(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetSamplerParameterIuivEXT(II[II)V"/>
+ <method name="glGetTexParameterIivEXT(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetTexParameterIivEXT(II[II)V"/>
+ <method name="glGetTexParameterIuivEXT(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetTexParameterIuivEXT(II[II)V"/>
+ <method name="glIsEnablediEXT(II)Z"/>
+ <method name="glMinSampleShadingOES(F)V"/>
+ <method name="glObjectLabelKHR(IIILjava/lang/String;)V"/>
+ <method name="glObjectPtrLabelKHR(JLjava/lang/String;)V"/>
+ <method name="glPatchParameteriEXT(II)V"/>
+ <method name="glPopDebugGroupKHR()V"/>
+ <method name="glPrimitiveBoundingBoxEXT(FFFFFFFF)V"/>
+ <method name="glPushDebugGroupKHR(IIILjava/lang/String;)V"/>
+ <method name="glSamplerParameterIivEXT(IILjava/nio/IntBuffer;)V"/>
+ <method name="glSamplerParameterIivEXT(II[II)V"/>
+ <method name="glSamplerParameterIuivEXT(IILjava/nio/IntBuffer;)V"/>
+ <method name="glSamplerParameterIuivEXT(II[II)V"/>
+ <method name="glTexBufferEXT(III)V"/>
+ <method name="glTexBufferRangeEXT(IIIII)V"/>
+ <method name="glTexParameterIivEXT(IILjava/nio/IntBuffer;)V"/>
+ <method name="glTexParameterIivEXT(II[II)V"/>
+ <method name="glTexParameterIuivEXT(IILjava/nio/IntBuffer;)V"/>
+ <method name="glTexParameterIuivEXT(II[II)V"/>
+ <method name="glTexStorage3DMultisampleOES(IIIIIIZ)V"/>
+ <field name="GL_BLEND_ADVANCED_COHERENT_KHR"/>
+ <field name="GL_BUFFER_KHR"/>
+ <field name="GL_CLAMP_TO_BORDER_EXT"/>
+ <field name="GL_COLORBURN_KHR"/>
+ <field name="GL_COLORDODGE_KHR"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_10x10_KHR"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_10x5_KHR"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_10x6_KHR"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_10x8_KHR"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_12x10_KHR"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_12x12_KHR"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_4x4_KHR"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_5x4_KHR"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_5x5_KHR"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_6x5_KHR"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_6x6_KHR"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_8x5_KHR"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_8x6_KHR"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_8x8_KHR"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR"/>
+ <field name="GL_CONTEXT_FLAG_DEBUG_BIT_KHR"/>
+ <field name="GL_DARKEN_KHR"/>
+ <field name="GL_DEBUG_CALLBACK_FUNCTION_KHR"/>
+ <field name="GL_DEBUG_CALLBACK_USER_PARAM_KHR"/>
+ <field name="GL_DEBUG_GROUP_STACK_DEPTH_KHR"/>
+ <field name="GL_DEBUG_LOGGED_MESSAGES_KHR"/>
+ <field name="GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_KHR"/>
+ <field name="GL_DEBUG_OUTPUT_KHR"/>
+ <field name="GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR"/>
+ <field name="GL_DEBUG_SEVERITY_HIGH_KHR"/>
+ <field name="GL_DEBUG_SEVERITY_LOW_KHR"/>
+ <field name="GL_DEBUG_SEVERITY_MEDIUM_KHR"/>
+ <field name="GL_DEBUG_SEVERITY_NOTIFICATION_KHR"/>
+ <field name="GL_DEBUG_SOURCE_API_KHR"/>
+ <field name="GL_DEBUG_SOURCE_APPLICATION_KHR"/>
+ <field name="GL_DEBUG_SOURCE_OTHER_KHR"/>
+ <field name="GL_DEBUG_SOURCE_SHADER_COMPILER_KHR"/>
+ <field name="GL_DEBUG_SOURCE_THIRD_PARTY_KHR"/>
+ <field name="GL_DEBUG_SOURCE_WINDOW_SYSTEM_KHR"/>
+ <field name="GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR"/>
+ <field name="GL_DEBUG_TYPE_ERROR_KHR"/>
+ <field name="GL_DEBUG_TYPE_MARKER_KHR"/>
+ <field name="GL_DEBUG_TYPE_OTHER_KHR"/>
+ <field name="GL_DEBUG_TYPE_PERFORMANCE_KHR"/>
+ <field name="GL_DEBUG_TYPE_POP_GROUP_KHR"/>
+ <field name="GL_DEBUG_TYPE_PORTABILITY_KHR"/>
+ <field name="GL_DEBUG_TYPE_PUSH_GROUP_KHR"/>
+ <field name="GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR"/>
+ <field name="GL_DECODE_EXT"/>
+ <field name="GL_DIFFERENCE_KHR"/>
+ <field name="GL_EXCLUSION_KHR"/>
+ <field name="GL_FIRST_VERTEX_CONVENTION_EXT"/>
+ <field name="GL_FRACTIONAL_EVEN_EXT"/>
+ <field name="GL_FRACTIONAL_ODD_EXT"/>
+ <field name="GL_FRAGMENT_INTERPOLATION_OFFSET_BITS_OES"/>
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT"/>
+ <field name="GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT"/>
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT"/>
+ <field name="GL_GEOMETRY_LINKED_INPUT_TYPE_EXT"/>
+ <field name="GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT"/>
+ <field name="GL_GEOMETRY_LINKED_VERTICES_OUT_EXT"/>
+ <field name="GL_GEOMETRY_SHADER_BIT_EXT"/>
+ <field name="GL_GEOMETRY_SHADER_EXT"/>
+ <field name="GL_GEOMETRY_SHADER_INVOCATIONS_EXT"/>
+ <field name="GL_HARDLIGHT_KHR"/>
+ <field name="GL_HSL_COLOR_KHR"/>
+ <field name="GL_HSL_HUE_KHR"/>
+ <field name="GL_HSL_LUMINOSITY_KHR"/>
+ <field name="GL_HSL_SATURATION_KHR"/>
+ <field name="GL_IMAGE_BUFFER_EXT"/>
+ <field name="GL_IMAGE_CUBE_MAP_ARRAY_EXT"/>
+ <field name="GL_INT_IMAGE_BUFFER_EXT"/>
+ <field name="GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT"/>
+ <field name="GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES"/>
+ <field name="GL_INT_SAMPLER_BUFFER_EXT"/>
+ <field name="GL_INT_SAMPLER_CUBE_MAP_ARRAY_EXT"/>
+ <field name="GL_ISOLINES_EXT"/>
+ <field name="GL_IS_PER_PATCH_EXT"/>
+ <field name="GL_LAST_VERTEX_CONVENTION_EXT"/>
+ <field name="GL_LAYER_PROVOKING_VERTEX_EXT"/>
+ <field name="GL_LIGHTEN_KHR"/>
+ <field name="GL_LINES_ADJACENCY_EXT"/>
+ <field name="GL_LINE_STRIP_ADJACENCY_EXT"/>
+ <field name="GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT"/>
+ <field name="GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_EXT"/>
+ <field name="GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT"/>
+ <field name="GL_MAX_DEBUG_GROUP_STACK_DEPTH_KHR"/>
+ <field name="GL_MAX_DEBUG_LOGGED_MESSAGES_KHR"/>
+ <field name="GL_MAX_DEBUG_MESSAGE_LENGTH_KHR"/>
+ <field name="GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_OES"/>
+ <field name="GL_MAX_FRAMEBUFFER_LAYERS_EXT"/>
+ <field name="GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT"/>
+ <field name="GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT"/>
+ <field name="GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT"/>
+ <field name="GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT"/>
+ <field name="GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT"/>
+ <field name="GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT"/>
+ <field name="GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT"/>
+ <field name="GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT"/>
+ <field name="GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT"/>
+ <field name="GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT"/>
+ <field name="GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT"/>
+ <field name="GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT"/>
+ <field name="GL_MAX_LABEL_LENGTH_KHR"/>
+ <field name="GL_MAX_PATCH_VERTICES_EXT"/>
+ <field name="GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_EXT"/>
+ <field name="GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_EXT"/>
+ <field name="GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_EXT"/>
+ <field name="GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_EXT"/>
+ <field name="GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_EXT"/>
+ <field name="GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_EXT"/>
+ <field name="GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_EXT"/>
+ <field name="GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_EXT"/>
+ <field name="GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_EXT"/>
+ <field name="GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_EXT"/>
+ <field name="GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_EXT"/>
+ <field name="GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_EXT"/>
+ <field name="GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_EXT"/>
+ <field name="GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_EXT"/>
+ <field name="GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_EXT"/>
+ <field name="GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_EXT"/>
+ <field name="GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_EXT"/>
+ <field name="GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_EXT"/>
+ <field name="GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT"/>
+ <field name="GL_MAX_TESS_GEN_LEVEL_EXT"/>
+ <field name="GL_MAX_TESS_PATCH_COMPONENTS_EXT"/>
+ <field name="GL_MAX_TEXTURE_BUFFER_SIZE_EXT"/>
+ <field name="GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_OES"/>
+ <field name="GL_MIN_SAMPLE_SHADING_VALUE_OES"/>
+ <field name="GL_MULTIPLY_KHR"/>
+ <field name="GL_OVERLAY_KHR"/>
+ <field name="GL_PATCHES_EXT"/>
+ <field name="GL_PATCH_VERTICES_EXT"/>
+ <field name="GL_PRIMITIVES_GENERATED_EXT"/>
+ <field name="GL_PRIMITIVE_BOUNDING_BOX_EXT"/>
+ <field name="GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED"/>
+ <field name="GL_PROGRAM_KHR"/>
+ <field name="GL_QUADS_EXT"/>
+ <field name="GL_QUERY_KHR"/>
+ <field name="GL_REFERENCED_BY_GEOMETRY_SHADER_EXT"/>
+ <field name="GL_REFERENCED_BY_TESS_CONTROL_SHADER_EXT"/>
+ <field name="GL_REFERENCED_BY_TESS_EVALUATION_SHADER_EXT"/>
+ <field name="GL_SAMPLER_2D_MULTISAMPLE_ARRAY_OES"/>
+ <field name="GL_SAMPLER_BUFFER_EXT"/>
+ <field name="GL_SAMPLER_CUBE_MAP_ARRAY_EXT"/>
+ <field name="GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_EXT"/>
+ <field name="GL_SAMPLER_KHR"/>
+ <field name="GL_SAMPLE_SHADING_OES"/>
+ <field name="GL_SCREEN_KHR"/>
+ <field name="GL_SHADER_KHR"/>
+ <field name="GL_SKIP_DECODE_EXT"/>
+ <field name="GL_SOFTLIGHT_KHR"/>
+ <field name="GL_STACK_OVERFLOW_KHR"/>
+ <field name="GL_STACK_UNDERFLOW_KHR"/>
+ <field name="GL_STENCIL_INDEX8_OES"/>
+ <field name="GL_STENCIL_INDEX_OES"/>
+ <field name="GL_TESS_CONTROL_OUTPUT_VERTICES_EXT"/>
+ <field name="GL_TESS_CONTROL_SHADER_BIT_EXT"/>
+ <field name="GL_TESS_CONTROL_SHADER_EXT"/>
+ <field name="GL_TESS_EVALUATION_SHADER_BIT_EXT"/>
+ <field name="GL_TESS_EVALUATION_SHADER_EXT"/>
+ <field name="GL_TESS_GEN_MODE_EXT"/>
+ <field name="GL_TESS_GEN_POINT_MODE_EXT"/>
+ <field name="GL_TESS_GEN_SPACING_EXT"/>
+ <field name="GL_TESS_GEN_VERTEX_ORDER_EXT"/>
+ <field name="GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES"/>
+ <field name="GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY_OES"/>
+ <field name="GL_TEXTURE_BINDING_BUFFER_EXT"/>
+ <field name="GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_EXT"/>
+ <field name="GL_TEXTURE_BORDER_COLOR_EXT"/>
+ <field name="GL_TEXTURE_BUFFER_BINDING_EXT"/>
+ <field name="GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT"/>
+ <field name="GL_TEXTURE_BUFFER_EXT"/>
+ <field name="GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_EXT"/>
+ <field name="GL_TEXTURE_BUFFER_OFFSET_EXT"/>
+ <field name="GL_TEXTURE_BUFFER_SIZE_EXT"/>
+ <field name="GL_TEXTURE_CUBE_MAP_ARRAY_EXT"/>
+ <field name="GL_TEXTURE_SRGB_DECODE_EXT"/>
+ <field name="GL_TRIANGLES_ADJACENCY_EXT"/>
+ <field name="GL_TRIANGLE_STRIP_ADJACENCY_EXT"/>
+ <field name="GL_UNDEFINED_VERTEX_EXT"/>
+ <field name="GL_UNSIGNED_INT_IMAGE_BUFFER_EXT"/>
+ <field name="GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT"/>
+ <field name="GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES"/>
+ <field name="GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT"/>
+ <field name="GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_EXT"/>
+ <field name="GL_VERTEX_ARRAY_KHR"/>
+ </class>
+ <class name="android/opengl/GLES31Ext$DebugProcKHR" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="onMessage(IIIILjava/lang/String;)V"/>
+ </class>
+ <class name="android/opengl/GLES32" since="24">
+ <extends name="android/opengl/GLES31"/>
+ <method name="&lt;init>()V"/>
+ <method name="glBlendBarrier()V"/>
+ <method name="glBlendEquationSeparatei(III)V"/>
+ <method name="glBlendEquationi(II)V"/>
+ <method name="glBlendFuncSeparatei(IIIII)V"/>
+ <method name="glBlendFunci(III)V"/>
+ <method name="glColorMaski(IZZZZ)V"/>
+ <method name="glCopyImageSubData(IIIIIIIIIIIIIII)V"/>
+ <method name="glDebugMessageCallback(Landroid/opengl/GLES32$DebugProc;)V"/>
+ <method name="glDebugMessageControl(IIIILjava/nio/IntBuffer;Z)V"/>
+ <method name="glDebugMessageControl(IIII[IIZ)V"/>
+ <method name="glDebugMessageInsert(IIIIILjava/lang/String;)V"/>
+ <method name="glDisablei(II)V"/>
+ <method name="glDrawElementsBaseVertex(IIILjava/nio/Buffer;I)V"/>
+ <method name="glDrawElementsInstancedBaseVertex(IIIIII)V"/>
+ <method name="glDrawElementsInstancedBaseVertex(IIILjava/nio/Buffer;II)V"/>
+ <method name="glDrawRangeElementsBaseVertex(IIIIILjava/nio/Buffer;I)V"/>
+ <method name="glEnablei(II)V"/>
+ <method name="glFramebufferTexture(IIII)V"/>
+ <method name="glGetDebugMessageLog(II[II[II[II[II[II[BI)I"/>
+ <method name="glGetDebugMessageLog(ILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;)[Ljava/lang/String;"/>
+ <method name="glGetDebugMessageLog(ILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/ByteBuffer;)I"/>
+ <method name="glGetDebugMessageLog(I[II[II[II[II)[Ljava/lang/String;"/>
+ <method name="glGetGraphicsResetStatus()I"/>
+ <method name="glGetObjectLabel(II)Ljava/lang/String;"/>
+ <method name="glGetObjectPtrLabel(J)Ljava/lang/String;"/>
+ <method name="glGetPointerv(I)J"/>
+ <method name="glGetSamplerParameterIiv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetSamplerParameterIiv(II[II)V"/>
+ <method name="glGetSamplerParameterIuiv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetSamplerParameterIuiv(II[II)V"/>
+ <method name="glGetTexParameterIiv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetTexParameterIiv(II[II)V"/>
+ <method name="glGetTexParameterIuiv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetTexParameterIuiv(II[II)V"/>
+ <method name="glGetnUniformfv(IIILjava/nio/FloatBuffer;)V"/>
+ <method name="glGetnUniformfv(III[FI)V"/>
+ <method name="glGetnUniformiv(IIILjava/nio/IntBuffer;)V"/>
+ <method name="glGetnUniformiv(III[II)V"/>
+ <method name="glGetnUniformuiv(IIILjava/nio/IntBuffer;)V"/>
+ <method name="glGetnUniformuiv(III[II)V"/>
+ <method name="glIsEnabledi(II)Z"/>
+ <method name="glMinSampleShading(F)V"/>
+ <method name="glObjectLabel(IIILjava/lang/String;)V"/>
+ <method name="glObjectPtrLabel(JLjava/lang/String;)V"/>
+ <method name="glPatchParameteri(II)V"/>
+ <method name="glPopDebugGroup()V"/>
+ <method name="glPrimitiveBoundingBox(FFFFFFFF)V"/>
+ <method name="glPushDebugGroup(IIILjava/lang/String;)V"/>
+ <method name="glReadnPixels(IIIIIIILjava/nio/Buffer;)V"/>
+ <method name="glSamplerParameterIiv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glSamplerParameterIiv(II[II)V"/>
+ <method name="glSamplerParameterIuiv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glSamplerParameterIuiv(II[II)V"/>
+ <method name="glTexBuffer(III)V"/>
+ <method name="glTexBufferRange(IIIII)V"/>
+ <method name="glTexParameterIiv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glTexParameterIiv(II[II)V"/>
+ <method name="glTexParameterIuiv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glTexParameterIuiv(II[II)V"/>
+ <method name="glTexStorage3DMultisample(IIIIIIZ)V"/>
+ <field name="GL_BUFFER"/>
+ <field name="GL_CLAMP_TO_BORDER"/>
+ <field name="GL_COLORBURN"/>
+ <field name="GL_COLORDODGE"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_10x10"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_10x5"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_10x6"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_10x8"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_12x10"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_12x12"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_4x4"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_5x4"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_5x5"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_6x5"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_6x6"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_8x5"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_8x6"/>
+ <field name="GL_COMPRESSED_RGBA_ASTC_8x8"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6"/>
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8"/>
+ <field name="GL_CONTEXT_FLAGS"/>
+ <field name="GL_CONTEXT_FLAG_DEBUG_BIT"/>
+ <field name="GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT"/>
+ <field name="GL_CONTEXT_LOST"/>
+ <field name="GL_DARKEN"/>
+ <field name="GL_DEBUG_CALLBACK_FUNCTION"/>
+ <field name="GL_DEBUG_CALLBACK_USER_PARAM"/>
+ <field name="GL_DEBUG_GROUP_STACK_DEPTH"/>
+ <field name="GL_DEBUG_LOGGED_MESSAGES"/>
+ <field name="GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH"/>
+ <field name="GL_DEBUG_OUTPUT"/>
+ <field name="GL_DEBUG_OUTPUT_SYNCHRONOUS"/>
+ <field name="GL_DEBUG_SEVERITY_HIGH"/>
+ <field name="GL_DEBUG_SEVERITY_LOW"/>
+ <field name="GL_DEBUG_SEVERITY_MEDIUM"/>
+ <field name="GL_DEBUG_SEVERITY_NOTIFICATION"/>
+ <field name="GL_DEBUG_SOURCE_API"/>
+ <field name="GL_DEBUG_SOURCE_APPLICATION"/>
+ <field name="GL_DEBUG_SOURCE_OTHER"/>
+ <field name="GL_DEBUG_SOURCE_SHADER_COMPILER"/>
+ <field name="GL_DEBUG_SOURCE_THIRD_PARTY"/>
+ <field name="GL_DEBUG_SOURCE_WINDOW_SYSTEM"/>
+ <field name="GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR"/>
+ <field name="GL_DEBUG_TYPE_ERROR"/>
+ <field name="GL_DEBUG_TYPE_MARKER"/>
+ <field name="GL_DEBUG_TYPE_OTHER"/>
+ <field name="GL_DEBUG_TYPE_PERFORMANCE"/>
+ <field name="GL_DEBUG_TYPE_POP_GROUP"/>
+ <field name="GL_DEBUG_TYPE_PORTABILITY"/>
+ <field name="GL_DEBUG_TYPE_PUSH_GROUP"/>
+ <field name="GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR"/>
+ <field name="GL_DIFFERENCE"/>
+ <field name="GL_EXCLUSION"/>
+ <field name="GL_FIRST_VERTEX_CONVENTION"/>
+ <field name="GL_FRACTIONAL_EVEN"/>
+ <field name="GL_FRACTIONAL_ODD"/>
+ <field name="GL_FRAGMENT_INTERPOLATION_OFFSET_BITS"/>
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_LAYERED"/>
+ <field name="GL_FRAMEBUFFER_DEFAULT_LAYERS"/>
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS"/>
+ <field name="GL_GEOMETRY_INPUT_TYPE"/>
+ <field name="GL_GEOMETRY_OUTPUT_TYPE"/>
+ <field name="GL_GEOMETRY_SHADER"/>
+ <field name="GL_GEOMETRY_SHADER_BIT"/>
+ <field name="GL_GEOMETRY_SHADER_INVOCATIONS"/>
+ <field name="GL_GEOMETRY_VERTICES_OUT"/>
+ <field name="GL_GUILTY_CONTEXT_RESET"/>
+ <field name="GL_HARDLIGHT"/>
+ <field name="GL_HSL_COLOR"/>
+ <field name="GL_HSL_HUE"/>
+ <field name="GL_HSL_LUMINOSITY"/>
+ <field name="GL_HSL_SATURATION"/>
+ <field name="GL_IMAGE_BUFFER"/>
+ <field name="GL_IMAGE_CUBE_MAP_ARRAY"/>
+ <field name="GL_INNOCENT_CONTEXT_RESET"/>
+ <field name="GL_INT_IMAGE_BUFFER"/>
+ <field name="GL_INT_IMAGE_CUBE_MAP_ARRAY"/>
+ <field name="GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY"/>
+ <field name="GL_INT_SAMPLER_BUFFER"/>
+ <field name="GL_INT_SAMPLER_CUBE_MAP_ARRAY"/>
+ <field name="GL_ISOLINES"/>
+ <field name="GL_IS_PER_PATCH"/>
+ <field name="GL_LAST_VERTEX_CONVENTION"/>
+ <field name="GL_LAYER_PROVOKING_VERTEX"/>
+ <field name="GL_LIGHTEN"/>
+ <field name="GL_LINES_ADJACENCY"/>
+ <field name="GL_LINE_STRIP_ADJACENCY"/>
+ <field name="GL_LOSE_CONTEXT_ON_RESET"/>
+ <field name="GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS"/>
+ <field name="GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS"/>
+ <field name="GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS"/>
+ <field name="GL_MAX_DEBUG_GROUP_STACK_DEPTH"/>
+ <field name="GL_MAX_DEBUG_LOGGED_MESSAGES"/>
+ <field name="GL_MAX_DEBUG_MESSAGE_LENGTH"/>
+ <field name="GL_MAX_FRAGMENT_INTERPOLATION_OFFSET"/>
+ <field name="GL_MAX_FRAMEBUFFER_LAYERS"/>
+ <field name="GL_MAX_GEOMETRY_ATOMIC_COUNTERS"/>
+ <field name="GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS"/>
+ <field name="GL_MAX_GEOMETRY_IMAGE_UNIFORMS"/>
+ <field name="GL_MAX_GEOMETRY_INPUT_COMPONENTS"/>
+ <field name="GL_MAX_GEOMETRY_OUTPUT_COMPONENTS"/>
+ <field name="GL_MAX_GEOMETRY_OUTPUT_VERTICES"/>
+ <field name="GL_MAX_GEOMETRY_SHADER_INVOCATIONS"/>
+ <field name="GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS"/>
+ <field name="GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS"/>
+ <field name="GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS"/>
+ <field name="GL_MAX_GEOMETRY_UNIFORM_BLOCKS"/>
+ <field name="GL_MAX_GEOMETRY_UNIFORM_COMPONENTS"/>
+ <field name="GL_MAX_LABEL_LENGTH"/>
+ <field name="GL_MAX_PATCH_VERTICES"/>
+ <field name="GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS"/>
+ <field name="GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS"/>
+ <field name="GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS"/>
+ <field name="GL_MAX_TESS_CONTROL_INPUT_COMPONENTS"/>
+ <field name="GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS"/>
+ <field name="GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS"/>
+ <field name="GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS"/>
+ <field name="GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS"/>
+ <field name="GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS"/>
+ <field name="GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS"/>
+ <field name="GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS"/>
+ <field name="GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS"/>
+ <field name="GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS"/>
+ <field name="GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS"/>
+ <field name="GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS"/>
+ <field name="GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS"/>
+ <field name="GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS"/>
+ <field name="GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS"/>
+ <field name="GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS"/>
+ <field name="GL_MAX_TESS_GEN_LEVEL"/>
+ <field name="GL_MAX_TESS_PATCH_COMPONENTS"/>
+ <field name="GL_MAX_TEXTURE_BUFFER_SIZE"/>
+ <field name="GL_MIN_FRAGMENT_INTERPOLATION_OFFSET"/>
+ <field name="GL_MIN_SAMPLE_SHADING_VALUE"/>
+ <field name="GL_MULTIPLY"/>
+ <field name="GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY"/>
+ <field name="GL_MULTISAMPLE_LINE_WIDTH_RANGE"/>
+ <field name="GL_NO_RESET_NOTIFICATION"/>
+ <field name="GL_OVERLAY"/>
+ <field name="GL_PATCHES"/>
+ <field name="GL_PATCH_VERTICES"/>
+ <field name="GL_PRIMITIVES_GENERATED"/>
+ <field name="GL_PRIMITIVE_BOUNDING_BOX"/>
+ <field name="GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED"/>
+ <field name="GL_PROGRAM"/>
+ <field name="GL_PROGRAM_PIPELINE"/>
+ <field name="GL_QUADS"/>
+ <field name="GL_QUERY"/>
+ <field name="GL_REFERENCED_BY_GEOMETRY_SHADER"/>
+ <field name="GL_REFERENCED_BY_TESS_CONTROL_SHADER"/>
+ <field name="GL_REFERENCED_BY_TESS_EVALUATION_SHADER"/>
+ <field name="GL_RESET_NOTIFICATION_STRATEGY"/>
+ <field name="GL_SAMPLER"/>
+ <field name="GL_SAMPLER_2D_MULTISAMPLE_ARRAY"/>
+ <field name="GL_SAMPLER_BUFFER"/>
+ <field name="GL_SAMPLER_CUBE_MAP_ARRAY"/>
+ <field name="GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW"/>
+ <field name="GL_SAMPLE_SHADING"/>
+ <field name="GL_SCREEN"/>
+ <field name="GL_SHADER"/>
+ <field name="GL_SOFTLIGHT"/>
+ <field name="GL_STACK_OVERFLOW"/>
+ <field name="GL_STACK_UNDERFLOW"/>
+ <field name="GL_TESS_CONTROL_OUTPUT_VERTICES"/>
+ <field name="GL_TESS_CONTROL_SHADER"/>
+ <field name="GL_TESS_CONTROL_SHADER_BIT"/>
+ <field name="GL_TESS_EVALUATION_SHADER"/>
+ <field name="GL_TESS_EVALUATION_SHADER_BIT"/>
+ <field name="GL_TESS_GEN_MODE"/>
+ <field name="GL_TESS_GEN_POINT_MODE"/>
+ <field name="GL_TESS_GEN_SPACING"/>
+ <field name="GL_TESS_GEN_VERTEX_ORDER"/>
+ <field name="GL_TEXTURE_2D_MULTISAMPLE_ARRAY"/>
+ <field name="GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY"/>
+ <field name="GL_TEXTURE_BINDING_BUFFER"/>
+ <field name="GL_TEXTURE_BINDING_CUBE_MAP_ARRAY"/>
+ <field name="GL_TEXTURE_BORDER_COLOR"/>
+ <field name="GL_TEXTURE_BUFFER"/>
+ <field name="GL_TEXTURE_BUFFER_BINDING"/>
+ <field name="GL_TEXTURE_BUFFER_DATA_STORE_BINDING"/>
+ <field name="GL_TEXTURE_BUFFER_OFFSET"/>
+ <field name="GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT"/>
+ <field name="GL_TEXTURE_BUFFER_SIZE"/>
+ <field name="GL_TEXTURE_CUBE_MAP_ARRAY"/>
+ <field name="GL_TRIANGLES_ADJACENCY"/>
+ <field name="GL_TRIANGLE_STRIP_ADJACENCY"/>
+ <field name="GL_UNDEFINED_VERTEX"/>
+ <field name="GL_UNKNOWN_CONTEXT_RESET"/>
+ <field name="GL_UNSIGNED_INT_IMAGE_BUFFER"/>
+ <field name="GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY"/>
+ <field name="GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY"/>
+ <field name="GL_UNSIGNED_INT_SAMPLER_BUFFER"/>
+ <field name="GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY"/>
+ <field name="GL_VERTEX_ARRAY"/>
+ </class>
+ <class name="android/opengl/GLES32$DebugProc" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="onMessage(IIIILjava/lang/String;)V"/>
+ </class>
+ <class name="android/opengl/GLException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(ILjava/lang/String;)V"/>
+ </class>
+ <class name="android/opengl/GLSurfaceView" since="3">
+ <extends name="android/view/SurfaceView"/>
+ <implements name="android/view/SurfaceHolder$Callback" removed="24"/>
+ <implements name="android/view/SurfaceHolder$Callback2" since="24"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="getDebugFlags()I"/>
+ <method name="getPreserveEGLContextOnPause()Z" since="11"/>
+ <method name="getRenderMode()I"/>
+ <method name="onPause()V"/>
+ <method name="onResume()V"/>
+ <method name="queueEvent(Ljava/lang/Runnable;)V"/>
+ <method name="requestRender()V"/>
+ <method name="setDebugFlags(I)V"/>
+ <method name="setEGLConfigChooser(IIIIII)V"/>
+ <method name="setEGLConfigChooser(Landroid/opengl/GLSurfaceView$EGLConfigChooser;)V"/>
+ <method name="setEGLConfigChooser(Z)V"/>
+ <method name="setEGLContextClientVersion(I)V" since="8"/>
+ <method name="setEGLContextFactory(Landroid/opengl/GLSurfaceView$EGLContextFactory;)V" since="5"/>
+ <method name="setEGLWindowSurfaceFactory(Landroid/opengl/GLSurfaceView$EGLWindowSurfaceFactory;)V" since="5"/>
+ <method name="setGLWrapper(Landroid/opengl/GLSurfaceView$GLWrapper;)V"/>
+ <method name="setPreserveEGLContextOnPause(Z)V" since="11"/>
+ <method name="setRenderMode(I)V"/>
+ <method name="setRenderer(Landroid/opengl/GLSurfaceView$Renderer;)V"/>
+ <field name="DEBUG_CHECK_GL_ERROR"/>
+ <field name="DEBUG_LOG_GL_CALLS"/>
+ <field name="RENDERMODE_CONTINUOUSLY"/>
+ <field name="RENDERMODE_WHEN_DIRTY"/>
+ </class>
+ <class name="android/opengl/GLSurfaceView$EGLConfigChooser" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="chooseConfig(Ljavax/microedition/khronos/egl/EGL10;Ljavax/microedition/khronos/egl/EGLDisplay;)Ljavax/microedition/khronos/egl/EGLConfig;"/>
+ </class>
+ <class name="android/opengl/GLSurfaceView$EGLContextFactory" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="createContext(Ljavax/microedition/khronos/egl/EGL10;Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLConfig;)Ljavax/microedition/khronos/egl/EGLContext;"/>
+ <method name="destroyContext(Ljavax/microedition/khronos/egl/EGL10;Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLContext;)V"/>
+ </class>
+ <class name="android/opengl/GLSurfaceView$EGLWindowSurfaceFactory" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="createWindowSurface(Ljavax/microedition/khronos/egl/EGL10;Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLConfig;Ljava/lang/Object;)Ljavax/microedition/khronos/egl/EGLSurface;"/>
+ <method name="destroySurface(Ljavax/microedition/khronos/egl/EGL10;Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLSurface;)V"/>
+ </class>
+ <class name="android/opengl/GLSurfaceView$GLWrapper" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="wrap(Ljavax/microedition/khronos/opengles/GL;)Ljavax/microedition/khronos/opengles/GL;"/>
+ </class>
+ <class name="android/opengl/GLSurfaceView$Renderer" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="onDrawFrame(Ljavax/microedition/khronos/opengles/GL10;)V"/>
+ <method name="onSurfaceChanged(Ljavax/microedition/khronos/opengles/GL10;II)V"/>
+ <method name="onSurfaceCreated(Ljavax/microedition/khronos/opengles/GL10;Ljavax/microedition/khronos/egl/EGLConfig;)V"/>
+ </class>
+ <class name="android/opengl/GLU" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="gluErrorString(I)Ljava/lang/String;"/>
+ <method name="gluLookAt(Ljavax/microedition/khronos/opengles/GL10;FFFFFFFFF)V"/>
+ <method name="gluOrtho2D(Ljavax/microedition/khronos/opengles/GL10;FFFF)V"/>
+ <method name="gluPerspective(Ljavax/microedition/khronos/opengles/GL10;FFFF)V"/>
+ <method name="gluProject(FFF[FI[FI[II[FI)I"/>
+ <method name="gluUnProject(FFF[FI[FI[II[FI)I"/>
+ </class>
+ <class name="android/opengl/GLUtils" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getEGLErrorString(I)Ljava/lang/String;" since="14"/>
+ <method name="getInternalFormat(Landroid/graphics/Bitmap;)I"/>
+ <method name="getType(Landroid/graphics/Bitmap;)I"/>
+ <method name="texImage2D(IIILandroid/graphics/Bitmap;I)V"/>
+ <method name="texImage2D(IIILandroid/graphics/Bitmap;II)V"/>
+ <method name="texImage2D(IILandroid/graphics/Bitmap;I)V"/>
+ <method name="texSubImage2D(IIIILandroid/graphics/Bitmap;)V"/>
+ <method name="texSubImage2D(IIIILandroid/graphics/Bitmap;II)V"/>
+ </class>
+ <class name="android/opengl/Matrix" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V" deprecated="19"/>
+ <method name="frustumM([FIFFFFFF)V"/>
+ <method name="invertM([FI[FI)Z"/>
+ <method name="length(FFF)F"/>
+ <method name="multiplyMM([FI[FI[FI)V"/>
+ <method name="multiplyMV([FI[FI[FI)V"/>
+ <method name="orthoM([FIFFFFFF)V"/>
+ <method name="perspectiveM([FIFFFF)V" since="14"/>
+ <method name="rotateM([FIFFFF)V"/>
+ <method name="rotateM([FI[FIFFFF)V"/>
+ <method name="scaleM([FIFFF)V"/>
+ <method name="scaleM([FI[FIFFF)V"/>
+ <method name="setIdentityM([FI)V"/>
+ <method name="setLookAtM([FIFFFFFFFFF)V" since="8"/>
+ <method name="setRotateEulerM([FIFFF)V"/>
+ <method name="setRotateM([FIFFFF)V"/>
+ <method name="translateM([FIFFF)V"/>
+ <method name="translateM([FI[FIFFF)V"/>
+ <method name="transposeM([FI[FI)V"/>
+ </class>
+ <class name="android/opengl/Visibility" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="computeBoundingSphere([FII[FI)V"/>
+ <method name="frustumCullSpheres([FI[FII[III)I"/>
+ <method name="visibilityTest([FI[FI[CII)I"/>
+ </class>
+ <class name="android/os/AsyncTask" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="cancel(Z)Z"/>
+ <method name="doInBackground([Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="execute(Ljava/lang/Runnable;)V" since="11"/>
+ <method name="execute([Ljava/lang/Object;)Landroid/os/AsyncTask;"/>
+ <method name="executeOnExecutor(Ljava/util/concurrent/Executor;[Ljava/lang/Object;)Landroid/os/AsyncTask;" since="11"/>
+ <method name="get()Ljava/lang/Object;"/>
+ <method name="get(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;"/>
+ <method name="getStatus()Landroid/os/AsyncTask$Status;"/>
+ <method name="isCancelled()Z"/>
+ <method name="onCancelled()V"/>
+ <method name="onCancelled(Ljava/lang/Object;)V" since="11"/>
+ <method name="onPostExecute(Ljava/lang/Object;)V"/>
+ <method name="onPreExecute()V"/>
+ <method name="onProgressUpdate([Ljava/lang/Object;)V"/>
+ <method name="publishProgress([Ljava/lang/Object;)V"/>
+ <field name="SERIAL_EXECUTOR" since="11"/>
+ <field name="THREAD_POOL_EXECUTOR" since="11"/>
+ </class>
+ <class name="android/os/AsyncTask$Status" since="3">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/os/AsyncTask$Status;"/>
+ <method name="values()[Landroid/os/AsyncTask$Status;"/>
+ <field name="FINISHED"/>
+ <field name="PENDING"/>
+ <field name="RUNNING"/>
+ </class>
+ <class name="android/os/BadParcelableException" since="1">
+ <extends name="android/util/AndroidRuntimeException"/>
+ <method name="&lt;init>(Ljava/lang/Exception;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/os/BaseBundle" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="clear()V"/>
+ <method name="containsKey(Ljava/lang/String;)Z"/>
+ <method name="get(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="getBoolean(Ljava/lang/String;)Z" since="22"/>
+ <method name="getBoolean(Ljava/lang/String;Z)Z" since="22"/>
+ <method name="getBooleanArray(Ljava/lang/String;)[Z" since="22"/>
+ <method name="getDouble(Ljava/lang/String;)D"/>
+ <method name="getDouble(Ljava/lang/String;D)D"/>
+ <method name="getDoubleArray(Ljava/lang/String;)[D"/>
+ <method name="getInt(Ljava/lang/String;)I"/>
+ <method name="getInt(Ljava/lang/String;I)I"/>
+ <method name="getIntArray(Ljava/lang/String;)[I"/>
+ <method name="getLong(Ljava/lang/String;)J"/>
+ <method name="getLong(Ljava/lang/String;J)J"/>
+ <method name="getLongArray(Ljava/lang/String;)[J"/>
+ <method name="getString(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getStringArray(Ljava/lang/String;)[Ljava/lang/String;"/>
+ <method name="isEmpty()Z"/>
+ <method name="keySet()Ljava/util/Set;"/>
+ <method name="putAll(Landroid/os/PersistableBundle;)V"/>
+ <method name="putBoolean(Ljava/lang/String;Z)V" since="22"/>
+ <method name="putBooleanArray(Ljava/lang/String;[Z)V" since="22"/>
+ <method name="putDouble(Ljava/lang/String;D)V"/>
+ <method name="putDoubleArray(Ljava/lang/String;[D)V"/>
+ <method name="putInt(Ljava/lang/String;I)V"/>
+ <method name="putIntArray(Ljava/lang/String;[I)V"/>
+ <method name="putLong(Ljava/lang/String;J)V"/>
+ <method name="putLongArray(Ljava/lang/String;[J)V"/>
+ <method name="putString(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="putStringArray(Ljava/lang/String;[Ljava/lang/String;)V"/>
+ <method name="remove(Ljava/lang/String;)V"/>
+ <method name="size()I"/>
+ </class>
+ <class name="android/os/BatteryManager" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getIntProperty(I)I" since="21"/>
+ <method name="getLongProperty(I)J" since="21"/>
+ <method name="isCharging()Z" since="23"/>
+ <field name="ACTION_CHARGING" since="23"/>
+ <field name="ACTION_DISCHARGING" since="23"/>
+ <field name="BATTERY_HEALTH_COLD" since="11"/>
+ <field name="BATTERY_HEALTH_DEAD"/>
+ <field name="BATTERY_HEALTH_GOOD"/>
+ <field name="BATTERY_HEALTH_OVERHEAT"/>
+ <field name="BATTERY_HEALTH_OVER_VOLTAGE"/>
+ <field name="BATTERY_HEALTH_UNKNOWN"/>
+ <field name="BATTERY_HEALTH_UNSPECIFIED_FAILURE"/>
+ <field name="BATTERY_PLUGGED_AC"/>
+ <field name="BATTERY_PLUGGED_USB"/>
+ <field name="BATTERY_PLUGGED_WIRELESS" since="17"/>
+ <field name="BATTERY_PROPERTY_CAPACITY" since="21"/>
+ <field name="BATTERY_PROPERTY_CHARGE_COUNTER" since="21"/>
+ <field name="BATTERY_PROPERTY_CURRENT_AVERAGE" since="21"/>
+ <field name="BATTERY_PROPERTY_CURRENT_NOW" since="21"/>
+ <field name="BATTERY_PROPERTY_ENERGY_COUNTER" since="21"/>
+ <field name="BATTERY_PROPERTY_STATUS" since="26"/>
+ <field name="BATTERY_STATUS_CHARGING"/>
+ <field name="BATTERY_STATUS_DISCHARGING"/>
+ <field name="BATTERY_STATUS_FULL"/>
+ <field name="BATTERY_STATUS_NOT_CHARGING"/>
+ <field name="BATTERY_STATUS_UNKNOWN"/>
+ <field name="EXTRA_HEALTH" since="5"/>
+ <field name="EXTRA_ICON_SMALL" since="5"/>
+ <field name="EXTRA_LEVEL" since="5"/>
+ <field name="EXTRA_PLUGGED" since="5"/>
+ <field name="EXTRA_PRESENT" since="5"/>
+ <field name="EXTRA_SCALE" since="5"/>
+ <field name="EXTRA_STATUS" since="5"/>
+ <field name="EXTRA_TECHNOLOGY" since="5"/>
+ <field name="EXTRA_TEMPERATURE" since="5"/>
+ <field name="EXTRA_VOLTAGE" since="5"/>
+ </class>
+ <class name="android/os/Binder" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/IBinder"/>
+ <method name="&lt;init>()V"/>
+ <method name="attachInterface(Landroid/os/IInterface;Ljava/lang/String;)V"/>
+ <method name="clearCallingIdentity()J"/>
+ <method name="dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V"/>
+ <method name="flushPendingCommands()V"/>
+ <method name="getCallingPid()I"/>
+ <method name="getCallingUid()I"/>
+ <method name="getCallingUserHandle()Landroid/os/UserHandle;" since="17"/>
+ <method name="joinThreadPool()V"/>
+ <method name="onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z"/>
+ <method name="restoreCallingIdentity(J)V"/>
+ </class>
+ <class name="android/os/Build" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getRadioVersion()Ljava/lang/String;" since="14"/>
+ <method name="getSerial()Ljava/lang/String;" since="26"/>
+ <field name="BOARD"/>
+ <field name="BOOTLOADER" since="8"/>
+ <field name="BRAND"/>
+ <field name="CPU_ABI" since="4" deprecated="21"/>
+ <field name="CPU_ABI2" since="8" deprecated="21"/>
+ <field name="DEVICE"/>
+ <field name="DISPLAY" since="3"/>
+ <field name="FINGERPRINT"/>
+ <field name="HARDWARE" since="8"/>
+ <field name="HOST"/>
+ <field name="ID"/>
+ <field name="MANUFACTURER" since="4"/>
+ <field name="MODEL"/>
+ <field name="PRODUCT"/>
+ <field name="RADIO" since="8" deprecated="16"/>
+ <field name="SERIAL" since="9" deprecated="26"/>
+ <field name="SUPPORTED_32_BIT_ABIS" since="21"/>
+ <field name="SUPPORTED_64_BIT_ABIS" since="21"/>
+ <field name="SUPPORTED_ABIS" since="21"/>
+ <field name="TAGS"/>
+ <field name="TIME"/>
+ <field name="TYPE"/>
+ <field name="UNKNOWN" since="8"/>
+ <field name="USER"/>
+ </class>
+ <class name="android/os/Build$VERSION" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="BASE_OS" since="23"/>
+ <field name="CODENAME" since="4"/>
+ <field name="INCREMENTAL"/>
+ <field name="PREVIEW_SDK_INT" since="23"/>
+ <field name="RELEASE"/>
+ <field name="SDK" deprecated="16"/>
+ <field name="SDK_INT" since="4"/>
+ <field name="SECURITY_PATCH" since="23"/>
+ </class>
+ <class name="android/os/Build$VERSION_CODES" since="4">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="BASE"/>
+ <field name="BASE_1_1"/>
+ <field name="CUPCAKE"/>
+ <field name="CUR_DEVELOPMENT"/>
+ <field name="DONUT"/>
+ <field name="ECLAIR" since="5"/>
+ <field name="ECLAIR_0_1" since="6"/>
+ <field name="ECLAIR_MR1" since="7"/>
+ <field name="FROYO" since="8"/>
+ <field name="GINGERBREAD" since="9"/>
+ <field name="GINGERBREAD_MR1" since="10"/>
+ <field name="HONEYCOMB" since="11"/>
+ <field name="HONEYCOMB_MR1" since="12"/>
+ <field name="HONEYCOMB_MR2" since="13"/>
+ <field name="ICE_CREAM_SANDWICH" since="14"/>
+ <field name="ICE_CREAM_SANDWICH_MR1" since="15"/>
+ <field name="JELLY_BEAN" since="16"/>
+ <field name="JELLY_BEAN_MR1" since="17"/>
+ <field name="JELLY_BEAN_MR2" since="18"/>
+ <field name="KITKAT" since="19"/>
+ <field name="KITKAT_WATCH" since="20"/>
+ <field name="L" since="21" removed="22"/>
+ <field name="LOLLIPOP" since="21"/>
+ <field name="LOLLIPOP_MR1" since="22"/>
+ <field name="M" since="23"/>
+ <field name="N" since="24"/>
+ <field name="N_MR1" since="25"/>
+ <field name="O" since="26"/>
+ </class>
+ <class name="android/os/Bundle" since="1">
+ <extends name="android/os/BaseBundle" since="21"/>
+ <extends name="java/lang/Object" removed="21"/>
+ <implements name="android/os/Parcelable"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Landroid/os/Bundle;)V"/>
+ <method name="&lt;init>(Landroid/os/PersistableBundle;)V" since="21"/>
+ <method name="&lt;init>(Ljava/lang/ClassLoader;)V"/>
+ <method name="clear()V"/>
+ <method name="containsKey(Ljava/lang/String;)Z" removed="21"/>
+ <method name="deepCopy()Landroid/os/Bundle;" since="26"/>
+ <method name="get(Ljava/lang/String;)Ljava/lang/Object;" removed="21"/>
+ <method name="getBinder(Ljava/lang/String;)Landroid/os/IBinder;" since="18"/>
+ <method name="getBoolean(Ljava/lang/String;)Z" removed="22"/>
+ <method name="getBoolean(Ljava/lang/String;Z)Z" removed="22"/>
+ <method name="getBooleanArray(Ljava/lang/String;)[Z" removed="22"/>
+ <method name="getBundle(Ljava/lang/String;)Landroid/os/Bundle;"/>
+ <method name="getByte(Ljava/lang/String;)B"/>
+ <method name="getByte(Ljava/lang/String;B)Ljava/lang/Byte;"/>
+ <method name="getByteArray(Ljava/lang/String;)[B"/>
+ <method name="getChar(Ljava/lang/String;)C"/>
+ <method name="getChar(Ljava/lang/String;C)C"/>
+ <method name="getCharArray(Ljava/lang/String;)[C"/>
+ <method name="getCharSequence(Ljava/lang/String;)Ljava/lang/CharSequence;"/>
+ <method name="getCharSequence(Ljava/lang/String;Ljava/lang/CharSequence;)Ljava/lang/CharSequence;" since="12"/>
+ <method name="getCharSequenceArray(Ljava/lang/String;)[Ljava/lang/CharSequence;" since="8"/>
+ <method name="getCharSequenceArrayList(Ljava/lang/String;)Ljava/util/ArrayList;" since="8"/>
+ <method name="getClassLoader()Ljava/lang/ClassLoader;" since="11"/>
+ <method name="getDouble(Ljava/lang/String;)D" removed="21"/>
+ <method name="getDouble(Ljava/lang/String;D)D" removed="21"/>
+ <method name="getDoubleArray(Ljava/lang/String;)[D" removed="21"/>
+ <method name="getFloat(Ljava/lang/String;)F"/>
+ <method name="getFloat(Ljava/lang/String;F)F"/>
+ <method name="getFloatArray(Ljava/lang/String;)[F"/>
+ <method name="getInt(Ljava/lang/String;)I" removed="21"/>
+ <method name="getInt(Ljava/lang/String;I)I" removed="21"/>
+ <method name="getIntArray(Ljava/lang/String;)[I" removed="21"/>
+ <method name="getIntegerArrayList(Ljava/lang/String;)Ljava/util/ArrayList;"/>
+ <method name="getLong(Ljava/lang/String;)J" removed="21"/>
+ <method name="getLong(Ljava/lang/String;J)J" removed="21"/>
+ <method name="getLongArray(Ljava/lang/String;)[J" removed="21"/>
+ <method name="getParcelable(Ljava/lang/String;)Landroid/os/Parcelable;"/>
+ <method name="getParcelableArray(Ljava/lang/String;)[Landroid/os/Parcelable;"/>
+ <method name="getParcelableArrayList(Ljava/lang/String;)Ljava/util/ArrayList;"/>
+ <method name="getSerializable(Ljava/lang/String;)Ljava/io/Serializable;"/>
+ <method name="getShort(Ljava/lang/String;)S"/>
+ <method name="getShort(Ljava/lang/String;S)S"/>
+ <method name="getShortArray(Ljava/lang/String;)[S"/>
+ <method name="getSize(Ljava/lang/String;)Landroid/util/Size;" since="21"/>
+ <method name="getSizeF(Ljava/lang/String;)Landroid/util/SizeF;" since="21"/>
+ <method name="getSparseParcelableArray(Ljava/lang/String;)Landroid/util/SparseArray;"/>
+ <method name="getString(Ljava/lang/String;)Ljava/lang/String;" removed="21"/>
+ <method name="getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" since="12" removed="21"/>
+ <method name="getStringArray(Ljava/lang/String;)[Ljava/lang/String;" removed="21"/>
+ <method name="getStringArrayList(Ljava/lang/String;)Ljava/util/ArrayList;"/>
+ <method name="hasFileDescriptors()Z"/>
+ <method name="isEmpty()Z" removed="21"/>
+ <method name="keySet()Ljava/util/Set;" removed="21"/>
+ <method name="putAll(Landroid/os/Bundle;)V"/>
+ <method name="putBinder(Ljava/lang/String;Landroid/os/IBinder;)V" since="18"/>
+ <method name="putBoolean(Ljava/lang/String;Z)V" removed="22"/>
+ <method name="putBooleanArray(Ljava/lang/String;[Z)V" removed="22"/>
+ <method name="putBundle(Ljava/lang/String;Landroid/os/Bundle;)V"/>
+ <method name="putByte(Ljava/lang/String;B)V"/>
+ <method name="putByteArray(Ljava/lang/String;[B)V"/>
+ <method name="putChar(Ljava/lang/String;C)V"/>
+ <method name="putCharArray(Ljava/lang/String;[C)V"/>
+ <method name="putCharSequence(Ljava/lang/String;Ljava/lang/CharSequence;)V"/>
+ <method name="putCharSequenceArray(Ljava/lang/String;[Ljava/lang/CharSequence;)V" since="8"/>
+ <method name="putCharSequenceArrayList(Ljava/lang/String;Ljava/util/ArrayList;)V" since="8"/>
+ <method name="putDouble(Ljava/lang/String;D)V" removed="21"/>
+ <method name="putDoubleArray(Ljava/lang/String;[D)V" removed="21"/>
+ <method name="putFloat(Ljava/lang/String;F)V"/>
+ <method name="putFloatArray(Ljava/lang/String;[F)V"/>
+ <method name="putInt(Ljava/lang/String;I)V" removed="21"/>
+ <method name="putIntArray(Ljava/lang/String;[I)V" removed="21"/>
+ <method name="putIntegerArrayList(Ljava/lang/String;Ljava/util/ArrayList;)V"/>
+ <method name="putLong(Ljava/lang/String;J)V" removed="21"/>
+ <method name="putLongArray(Ljava/lang/String;[J)V" removed="21"/>
+ <method name="putParcelable(Ljava/lang/String;Landroid/os/Parcelable;)V"/>
+ <method name="putParcelableArray(Ljava/lang/String;[Landroid/os/Parcelable;)V"/>
+ <method name="putParcelableArrayList(Ljava/lang/String;Ljava/util/ArrayList;)V"/>
+ <method name="putSerializable(Ljava/lang/String;Ljava/io/Serializable;)V"/>
+ <method name="putShort(Ljava/lang/String;S)V"/>
+ <method name="putShortArray(Ljava/lang/String;[S)V"/>
+ <method name="putSize(Ljava/lang/String;Landroid/util/Size;)V" since="21"/>
+ <method name="putSizeF(Ljava/lang/String;Landroid/util/SizeF;)V" since="21"/>
+ <method name="putSparseParcelableArray(Ljava/lang/String;Landroid/util/SparseArray;)V"/>
+ <method name="putString(Ljava/lang/String;Ljava/lang/String;)V" removed="21"/>
+ <method name="putStringArray(Ljava/lang/String;[Ljava/lang/String;)V" removed="21"/>
+ <method name="putStringArrayList(Ljava/lang/String;Ljava/util/ArrayList;)V"/>
+ <method name="readFromParcel(Landroid/os/Parcel;)V"/>
+ <method name="remove(Ljava/lang/String;)V"/>
+ <method name="setClassLoader(Ljava/lang/ClassLoader;)V"/>
+ <method name="size()I" removed="21"/>
+ <field name="CREATOR"/>
+ <field name="EMPTY"/>
+ </class>
+ <class name="android/os/CancellationSignal" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="cancel()V"/>
+ <method name="isCanceled()Z"/>
+ <method name="setOnCancelListener(Landroid/os/CancellationSignal$OnCancelListener;)V"/>
+ <method name="throwIfCanceled()V"/>
+ </class>
+ <class name="android/os/CancellationSignal$OnCancelListener" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="onCancel()V"/>
+ </class>
+ <class name="android/os/ConditionVariable" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Z)V"/>
+ <method name="block()V"/>
+ <method name="block(J)Z"/>
+ <method name="close()V"/>
+ <method name="open()V"/>
+ </class>
+ <class name="android/os/CountDownTimer" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(JJ)V"/>
+ <method name="cancel()V"/>
+ <method name="onFinish()V"/>
+ <method name="onTick(J)V"/>
+ <method name="start()Landroid/os/CountDownTimer;"/>
+ </class>
+ <class name="android/os/CpuUsageInfo" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getActive()J"/>
+ <method name="getTotal()J"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/os/DeadObjectException" since="1">
+ <extends name="android/os/RemoteException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V" since="23"/>
+ </class>
+ <class name="android/os/DeadSystemException" since="24">
+ <extends name="android/os/DeadObjectException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/os/Debug" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="attachJvmtiAgent(Ljava/lang/String;Ljava/lang/String;)V" since="27"/>
+ <method name="changeDebugPort(I)V" deprecated="16"/>
+ <method name="dumpHprofData(Ljava/lang/String;)V" since="3"/>
+ <method name="dumpService(Ljava/lang/String;Ljava/io/FileDescriptor;[Ljava/lang/String;)Z" since="8"/>
+ <method name="enableEmulatorTraceOutput()V"/>
+ <method name="getBinderDeathObjectCount()I"/>
+ <method name="getBinderLocalObjectCount()I"/>
+ <method name="getBinderProxyObjectCount()I"/>
+ <method name="getBinderReceivedTransactions()I"/>
+ <method name="getBinderSentTransactions()I"/>
+ <method name="getGlobalAllocCount()I" deprecated="23"/>
+ <method name="getGlobalAllocSize()I" deprecated="23"/>
+ <method name="getGlobalClassInitCount()I" since="8" deprecated="23"/>
+ <method name="getGlobalClassInitTime()I" since="8" deprecated="23"/>
+ <method name="getGlobalExternalAllocCount()I" deprecated="16"/>
+ <method name="getGlobalExternalAllocSize()I" deprecated="16"/>
+ <method name="getGlobalExternalFreedCount()I" deprecated="16"/>
+ <method name="getGlobalExternalFreedSize()I" deprecated="16"/>
+ <method name="getGlobalFreedCount()I" deprecated="23"/>
+ <method name="getGlobalFreedSize()I" deprecated="23"/>
+ <method name="getGlobalGcInvocationCount()I" deprecated="23"/>
+ <method name="getLoadedClassCount()I"/>
+ <method name="getMemoryInfo(Landroid/os/Debug$MemoryInfo;)V"/>
+ <method name="getNativeHeapAllocatedSize()J"/>
+ <method name="getNativeHeapFreeSize()J"/>
+ <method name="getNativeHeapSize()J"/>
+ <method name="getPss()J" since="14"/>
+ <method name="getRuntimeStat(Ljava/lang/String;)Ljava/lang/String;" since="23"/>
+ <method name="getRuntimeStats()Ljava/util/Map;" since="23"/>
+ <method name="getThreadAllocCount()I" deprecated="23"/>
+ <method name="getThreadAllocSize()I" deprecated="23"/>
+ <method name="getThreadExternalAllocCount()I" deprecated="16"/>
+ <method name="getThreadExternalAllocSize()I" deprecated="16"/>
+ <method name="getThreadGcInvocationCount()I" deprecated="23"/>
+ <method name="isDebuggerConnected()Z"/>
+ <method name="printLoadedClasses(I)V"/>
+ <method name="resetAllCounts()V" deprecated="23"/>
+ <method name="resetGlobalAllocCount()V" deprecated="23"/>
+ <method name="resetGlobalAllocSize()V" deprecated="23"/>
+ <method name="resetGlobalClassInitCount()V" since="8" deprecated="23"/>
+ <method name="resetGlobalClassInitTime()V" since="8" deprecated="23"/>
+ <method name="resetGlobalExternalAllocCount()V" deprecated="16"/>
+ <method name="resetGlobalExternalAllocSize()V" deprecated="16"/>
+ <method name="resetGlobalExternalFreedCount()V" deprecated="16"/>
+ <method name="resetGlobalExternalFreedSize()V" deprecated="16"/>
+ <method name="resetGlobalFreedCount()V" deprecated="23"/>
+ <method name="resetGlobalFreedSize()V" deprecated="23"/>
+ <method name="resetGlobalGcInvocationCount()V" deprecated="23"/>
+ <method name="resetThreadAllocCount()V" deprecated="23"/>
+ <method name="resetThreadAllocSize()V" deprecated="23"/>
+ <method name="resetThreadExternalAllocCount()V" deprecated="16"/>
+ <method name="resetThreadExternalAllocSize()V" deprecated="16"/>
+ <method name="resetThreadGcInvocationCount()V" deprecated="23"/>
+ <method name="setAllocationLimit(I)I" deprecated="16"/>
+ <method name="setGlobalAllocationLimit(I)I" deprecated="16"/>
+ <method name="startAllocCounting()V" deprecated="18"/>
+ <method name="startMethodTracing()V"/>
+ <method name="startMethodTracing(Ljava/lang/String;)V"/>
+ <method name="startMethodTracing(Ljava/lang/String;I)V"/>
+ <method name="startMethodTracing(Ljava/lang/String;II)V"/>
+ <method name="startMethodTracingSampling(Ljava/lang/String;II)V" since="21"/>
+ <method name="startNativeTracing()V"/>
+ <method name="stopAllocCounting()V" deprecated="18"/>
+ <method name="stopMethodTracing()V"/>
+ <method name="stopNativeTracing()V"/>
+ <method name="threadCpuTimeNanos()J"/>
+ <method name="waitForDebugger()V"/>
+ <method name="waitingForDebugger()Z"/>
+ <field name="SHOW_CLASSLOADER"/>
+ <field name="SHOW_FULL_DETAIL"/>
+ <field name="SHOW_INITIALIZED"/>
+ <field name="TRACE_COUNT_ALLOCS" deprecated="23"/>
+ </class>
+ <class name="android/os/Debug$InstructionCount" since="1" deprecated="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="collect()Z"/>
+ <method name="globalMethodInvocations()I"/>
+ <method name="globalTotal()I"/>
+ <method name="resetAndStart()Z"/>
+ </class>
+ <class name="android/os/Debug$MemoryInfo" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable" since="5"/>
+ <method name="&lt;init>()V"/>
+ <method name="getMemoryStat(Ljava/lang/String;)Ljava/lang/String;" since="23"/>
+ <method name="getMemoryStats()Ljava/util/Map;" since="23"/>
+ <method name="getOtherLabel(I)Ljava/lang/String;" since="14" removed="19"/>
+ <method name="getOtherPrivateDirty(I)I" since="14" removed="19"/>
+ <method name="getOtherPss(I)I" since="14" removed="19"/>
+ <method name="getOtherSharedDirty(I)I" since="14" removed="19"/>
+ <method name="getTotalPrivateClean()I" since="19"/>
+ <method name="getTotalPrivateDirty()I" since="5"/>
+ <method name="getTotalPss()I" since="5"/>
+ <method name="getTotalSharedClean()I" since="19"/>
+ <method name="getTotalSharedDirty()I" since="5"/>
+ <method name="getTotalSwappablePss()I" since="19"/>
+ <method name="readFromParcel(Landroid/os/Parcel;)V" since="5"/>
+ <field name="CREATOR" since="5"/>
+ <field name="dalvikPrivateDirty"/>
+ <field name="dalvikPss"/>
+ <field name="dalvikSharedDirty"/>
+ <field name="nativePrivateDirty"/>
+ <field name="nativePss"/>
+ <field name="nativeSharedDirty"/>
+ <field name="otherPrivateDirty"/>
+ <field name="otherPss"/>
+ <field name="otherSharedDirty"/>
+ </class>
+ <class name="android/os/DropBoxManager" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addData(Ljava/lang/String;[BI)V"/>
+ <method name="addFile(Ljava/lang/String;Ljava/io/File;I)V"/>
+ <method name="addText(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="getNextEntry(Ljava/lang/String;J)Landroid/os/DropBoxManager$Entry;"/>
+ <method name="isTagEnabled(Ljava/lang/String;)Z"/>
+ <field name="ACTION_DROPBOX_ENTRY_ADDED" since="11"/>
+ <field name="EXTRA_TAG" since="11"/>
+ <field name="EXTRA_TIME" since="11"/>
+ <field name="IS_EMPTY"/>
+ <field name="IS_GZIPPED"/>
+ <field name="IS_TEXT"/>
+ </class>
+ <class name="android/os/DropBoxManager$Entry" since="8">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <implements name="java/io/Closeable" since="9"/>
+ <method name="&lt;init>(Ljava/lang/String;J)V"/>
+ <method name="&lt;init>(Ljava/lang/String;JLandroid/os/ParcelFileDescriptor;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;JLjava/io/File;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;JLjava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;J[BI)V"/>
+ <method name="close()V"/>
+ <method name="getFlags()I"/>
+ <method name="getInputStream()Ljava/io/InputStream;"/>
+ <method name="getTag()Ljava/lang/String;"/>
+ <method name="getText(I)Ljava/lang/String;"/>
+ <method name="getTimeMillis()J"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/os/Environment" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDataDirectory()Ljava/io/File;"/>
+ <method name="getDownloadCacheDirectory()Ljava/io/File;"/>
+ <method name="getExternalStorageDirectory()Ljava/io/File;"/>
+ <method name="getExternalStoragePublicDirectory(Ljava/lang/String;)Ljava/io/File;" since="8"/>
+ <method name="getExternalStorageState()Ljava/lang/String;"/>
+ <method name="getExternalStorageState(Ljava/io/File;)Ljava/lang/String;" since="21"/>
+ <method name="getRootDirectory()Ljava/io/File;"/>
+ <method name="getStorageState(Ljava/io/File;)Ljava/lang/String;" since="19" deprecated="21"/>
+ <method name="isExternalStorageEmulated()Z" since="11"/>
+ <method name="isExternalStorageEmulated(Ljava/io/File;)Z" since="21"/>
+ <method name="isExternalStorageRemovable()Z" since="9"/>
+ <method name="isExternalStorageRemovable(Ljava/io/File;)Z" since="21"/>
+ <field name="DIRECTORY_ALARMS" since="8"/>
+ <field name="DIRECTORY_DCIM" since="8"/>
+ <field name="DIRECTORY_DOCUMENTS" since="19"/>
+ <field name="DIRECTORY_DOWNLOADS" since="8"/>
+ <field name="DIRECTORY_MOVIES" since="8"/>
+ <field name="DIRECTORY_MUSIC" since="8"/>
+ <field name="DIRECTORY_NOTIFICATIONS" since="8"/>
+ <field name="DIRECTORY_PICTURES" since="8"/>
+ <field name="DIRECTORY_PODCASTS" since="8"/>
+ <field name="DIRECTORY_RINGTONES" since="8"/>
+ <field name="MEDIA_BAD_REMOVAL"/>
+ <field name="MEDIA_CHECKING" since="3"/>
+ <field name="MEDIA_EJECTING" since="23"/>
+ <field name="MEDIA_MOUNTED"/>
+ <field name="MEDIA_MOUNTED_READ_ONLY"/>
+ <field name="MEDIA_NOFS" since="3"/>
+ <field name="MEDIA_REMOVED"/>
+ <field name="MEDIA_SHARED"/>
+ <field name="MEDIA_UNKNOWN" since="19"/>
+ <field name="MEDIA_UNMOUNTABLE"/>
+ <field name="MEDIA_UNMOUNTED"/>
+ </class>
+ <class name="android/os/FileObserver" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="onEvent(ILjava/lang/String;)V"/>
+ <method name="startWatching()V"/>
+ <method name="stopWatching()V"/>
+ <field name="ACCESS"/>
+ <field name="ALL_EVENTS"/>
+ <field name="ATTRIB"/>
+ <field name="CLOSE_NOWRITE"/>
+ <field name="CLOSE_WRITE"/>
+ <field name="CREATE"/>
+ <field name="DELETE"/>
+ <field name="DELETE_SELF"/>
+ <field name="MODIFY"/>
+ <field name="MOVED_FROM"/>
+ <field name="MOVED_TO"/>
+ <field name="MOVE_SELF"/>
+ <field name="OPEN"/>
+ </class>
+ <class name="android/os/FileUriExposedException" since="24">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/os/Handler" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/os/Handler$Callback;)V" since="3"/>
+ <method name="&lt;init>(Landroid/os/Looper;)V"/>
+ <method name="&lt;init>(Landroid/os/Looper;Landroid/os/Handler$Callback;)V" since="3"/>
+ <method name="dispatchMessage(Landroid/os/Message;)V"/>
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V"/>
+ <method name="getLooper()Landroid/os/Looper;"/>
+ <method name="getMessageName(Landroid/os/Message;)Ljava/lang/String;" since="14"/>
+ <method name="handleMessage(Landroid/os/Message;)V"/>
+ <method name="hasMessages(I)Z"/>
+ <method name="hasMessages(ILjava/lang/Object;)Z"/>
+ <method name="obtainMessage()Landroid/os/Message;"/>
+ <method name="obtainMessage(I)Landroid/os/Message;"/>
+ <method name="obtainMessage(III)Landroid/os/Message;"/>
+ <method name="obtainMessage(IIILjava/lang/Object;)Landroid/os/Message;"/>
+ <method name="obtainMessage(ILjava/lang/Object;)Landroid/os/Message;"/>
+ <method name="post(Ljava/lang/Runnable;)Z"/>
+ <method name="postAtFrontOfQueue(Ljava/lang/Runnable;)Z"/>
+ <method name="postAtTime(Ljava/lang/Runnable;J)Z"/>
+ <method name="postAtTime(Ljava/lang/Runnable;Ljava/lang/Object;J)Z"/>
+ <method name="postDelayed(Ljava/lang/Runnable;J)Z"/>
+ <method name="removeCallbacks(Ljava/lang/Runnable;)V"/>
+ <method name="removeCallbacks(Ljava/lang/Runnable;Ljava/lang/Object;)V"/>
+ <method name="removeCallbacksAndMessages(Ljava/lang/Object;)V"/>
+ <method name="removeMessages(I)V"/>
+ <method name="removeMessages(ILjava/lang/Object;)V"/>
+ <method name="sendEmptyMessage(I)Z"/>
+ <method name="sendEmptyMessageAtTime(IJ)Z"/>
+ <method name="sendEmptyMessageDelayed(IJ)Z"/>
+ <method name="sendMessage(Landroid/os/Message;)Z"/>
+ <method name="sendMessageAtFrontOfQueue(Landroid/os/Message;)Z"/>
+ <method name="sendMessageAtTime(Landroid/os/Message;J)Z"/>
+ <method name="sendMessageDelayed(Landroid/os/Message;J)Z"/>
+ </class>
+ <class name="android/os/Handler$Callback" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="handleMessage(Landroid/os/Message;)Z"/>
+ </class>
+ <class name="android/os/HandlerThread" since="1">
+ <extends name="java/lang/Thread"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="getLooper()Landroid/os/Looper;"/>
+ <method name="getThreadId()I"/>
+ <method name="onLooperPrepared()V"/>
+ <method name="quit()Z" since="5"/>
+ <method name="quitSafely()Z" since="18"/>
+ </class>
+ <class name="android/os/HardwarePropertiesManager" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCpuUsages()[Landroid/os/CpuUsageInfo;"/>
+ <method name="getDeviceTemperatures(II)[F"/>
+ <method name="getFanSpeeds()[F"/>
+ <field name="DEVICE_TEMPERATURE_BATTERY"/>
+ <field name="DEVICE_TEMPERATURE_CPU"/>
+ <field name="DEVICE_TEMPERATURE_GPU"/>
+ <field name="DEVICE_TEMPERATURE_SKIN"/>
+ <field name="TEMPERATURE_CURRENT"/>
+ <field name="TEMPERATURE_SHUTDOWN"/>
+ <field name="TEMPERATURE_THROTTLING"/>
+ <field name="TEMPERATURE_THROTTLING_BELOW_VR_MIN"/>
+ <field name="UNDEFINED_TEMPERATURE"/>
+ </class>
+ <class name="android/os/IBinder" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="dump(Ljava/io/FileDescriptor;[Ljava/lang/String;)V" since="3"/>
+ <method name="dumpAsync(Ljava/io/FileDescriptor;[Ljava/lang/String;)V" since="13"/>
+ <method name="getInterfaceDescriptor()Ljava/lang/String;"/>
+ <method name="isBinderAlive()Z"/>
+ <method name="linkToDeath(Landroid/os/IBinder$DeathRecipient;I)V"/>
+ <method name="pingBinder()Z"/>
+ <method name="queryLocalInterface(Ljava/lang/String;)Landroid/os/IInterface;"/>
+ <method name="transact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z"/>
+ <method name="unlinkToDeath(Landroid/os/IBinder$DeathRecipient;I)Z"/>
+ <field name="DUMP_TRANSACTION"/>
+ <field name="FIRST_CALL_TRANSACTION"/>
+ <field name="FLAG_ONEWAY"/>
+ <field name="INTERFACE_TRANSACTION"/>
+ <field name="LAST_CALL_TRANSACTION"/>
+ <field name="LIKE_TRANSACTION" since="15"/>
+ <field name="PING_TRANSACTION"/>
+ <field name="TWEET_TRANSACTION" since="13"/>
+ </class>
+ <class name="android/os/IBinder$DeathRecipient" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="binderDied()V"/>
+ </class>
+ <class name="android/os/IInterface" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="asBinder()Landroid/os/IBinder;"/>
+ </class>
+ <class name="android/os/LocaleList" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>([Ljava/util/Locale;)V"/>
+ <method name="forLanguageTags(Ljava/lang/String;)Landroid/os/LocaleList;"/>
+ <method name="get(I)Ljava/util/Locale;"/>
+ <method name="getAdjustedDefault()Landroid/os/LocaleList;"/>
+ <method name="getDefault()Landroid/os/LocaleList;"/>
+ <method name="getEmptyLocaleList()Landroid/os/LocaleList;"/>
+ <method name="getFirstMatch([Ljava/lang/String;)Ljava/util/Locale;"/>
+ <method name="indexOf(Ljava/util/Locale;)I"/>
+ <method name="isEmpty()Z"/>
+ <method name="setDefault(Landroid/os/LocaleList;)V"/>
+ <method name="size()I"/>
+ <method name="toLanguageTags()Ljava/lang/String;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/os/Looper" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V"/>
+ <method name="getMainLooper()Landroid/os/Looper;"/>
+ <method name="getQueue()Landroid/os/MessageQueue;" since="23"/>
+ <method name="getThread()Ljava/lang/Thread;" since="3"/>
+ <method name="isCurrentThread()Z" since="23"/>
+ <method name="loop()V"/>
+ <method name="myLooper()Landroid/os/Looper;"/>
+ <method name="myQueue()Landroid/os/MessageQueue;"/>
+ <method name="prepare()V"/>
+ <method name="prepareMainLooper()V"/>
+ <method name="quit()V"/>
+ <method name="quitSafely()V" since="18"/>
+ <method name="setMessageLogging(Landroid/util/Printer;)V"/>
+ </class>
+ <class name="android/os/MemoryFile" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="allowPurging(Z)Z"/>
+ <method name="close()V"/>
+ <method name="getInputStream()Ljava/io/InputStream;"/>
+ <method name="getOutputStream()Ljava/io/OutputStream;"/>
+ <method name="isPurgingAllowed()Z"/>
+ <method name="length()I"/>
+ <method name="readBytes([BIII)I"/>
+ <method name="writeBytes([BIII)V"/>
+ </class>
+ <class name="android/os/Message" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="copyFrom(Landroid/os/Message;)V"/>
+ <method name="getCallback()Ljava/lang/Runnable;"/>
+ <method name="getData()Landroid/os/Bundle;"/>
+ <method name="getTarget()Landroid/os/Handler;"/>
+ <method name="getWhen()J"/>
+ <method name="isAsynchronous()Z" since="22"/>
+ <method name="obtain()Landroid/os/Message;"/>
+ <method name="obtain(Landroid/os/Handler;)Landroid/os/Message;"/>
+ <method name="obtain(Landroid/os/Handler;I)Landroid/os/Message;"/>
+ <method name="obtain(Landroid/os/Handler;III)Landroid/os/Message;"/>
+ <method name="obtain(Landroid/os/Handler;IIILjava/lang/Object;)Landroid/os/Message;"/>
+ <method name="obtain(Landroid/os/Handler;ILjava/lang/Object;)Landroid/os/Message;"/>
+ <method name="obtain(Landroid/os/Handler;Ljava/lang/Runnable;)Landroid/os/Message;"/>
+ <method name="obtain(Landroid/os/Message;)Landroid/os/Message;"/>
+ <method name="peekData()Landroid/os/Bundle;"/>
+ <method name="recycle()V"/>
+ <method name="sendToTarget()V"/>
+ <method name="setAsynchronous(Z)V" since="22"/>
+ <method name="setData(Landroid/os/Bundle;)V"/>
+ <method name="setTarget(Landroid/os/Handler;)V"/>
+ <field name="CREATOR"/>
+ <field name="arg1"/>
+ <field name="arg2"/>
+ <field name="obj"/>
+ <field name="replyTo"/>
+ <field name="sendingUid" since="21"/>
+ <field name="what"/>
+ </class>
+ <class name="android/os/MessageQueue" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addIdleHandler(Landroid/os/MessageQueue$IdleHandler;)V"/>
+ <method name="addOnFileDescriptorEventListener(Ljava/io/FileDescriptor;ILandroid/os/MessageQueue$OnFileDescriptorEventListener;)V" since="23"/>
+ <method name="isIdle()Z" since="23"/>
+ <method name="removeIdleHandler(Landroid/os/MessageQueue$IdleHandler;)V"/>
+ <method name="removeOnFileDescriptorEventListener(Ljava/io/FileDescriptor;)V" since="23"/>
+ </class>
+ <class name="android/os/MessageQueue$IdleHandler" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="queueIdle()Z"/>
+ </class>
+ <class name="android/os/MessageQueue$OnFileDescriptorEventListener" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="onFileDescriptorEvents(Ljava/io/FileDescriptor;I)I"/>
+ <field name="EVENT_ERROR"/>
+ <field name="EVENT_INPUT"/>
+ <field name="EVENT_OUTPUT"/>
+ </class>
+ <class name="android/os/Messenger" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/os/Handler;)V"/>
+ <method name="&lt;init>(Landroid/os/IBinder;)V"/>
+ <method name="getBinder()Landroid/os/IBinder;"/>
+ <method name="readMessengerOrNullFromParcel(Landroid/os/Parcel;)Landroid/os/Messenger;"/>
+ <method name="send(Landroid/os/Message;)V"/>
+ <method name="writeMessengerOrNullToParcel(Landroid/os/Messenger;Landroid/os/Parcel;)V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/os/NetworkOnMainThreadException" since="11">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/os/OperationCanceledException" since="16">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/os/Parcel" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="appendFrom(Landroid/os/Parcel;II)V"/>
+ <method name="createBinderArray()[Landroid/os/IBinder;"/>
+ <method name="createBinderArrayList()Ljava/util/ArrayList;"/>
+ <method name="createBooleanArray()[Z"/>
+ <method name="createByteArray()[B"/>
+ <method name="createCharArray()[C"/>
+ <method name="createDoubleArray()[D"/>
+ <method name="createFloatArray()[F"/>
+ <method name="createIntArray()[I"/>
+ <method name="createLongArray()[J"/>
+ <method name="createStringArray()[Ljava/lang/String;"/>
+ <method name="createStringArrayList()Ljava/util/ArrayList;"/>
+ <method name="createTypedArray(Landroid/os/Parcelable$Creator;)[Ljava/lang/Object;"/>
+ <method name="createTypedArrayList(Landroid/os/Parcelable$Creator;)Ljava/util/ArrayList;"/>
+ <method name="dataAvail()I"/>
+ <method name="dataCapacity()I"/>
+ <method name="dataPosition()I"/>
+ <method name="dataSize()I"/>
+ <method name="enforceInterface(Ljava/lang/String;)V"/>
+ <method name="hasFileDescriptors()Z"/>
+ <method name="marshall()[B"/>
+ <method name="obtain()Landroid/os/Parcel;"/>
+ <method name="obtain(I)Landroid/os/Parcel;" removed="21"/>
+ <method name="readArray(Ljava/lang/ClassLoader;)[Ljava/lang/Object;"/>
+ <method name="readArrayList(Ljava/lang/ClassLoader;)Ljava/util/ArrayList;"/>
+ <method name="readBinderArray([Landroid/os/IBinder;)V"/>
+ <method name="readBinderList(Ljava/util/List;)V"/>
+ <method name="readBooleanArray([Z)V"/>
+ <method name="readBundle()Landroid/os/Bundle;"/>
+ <method name="readBundle(Ljava/lang/ClassLoader;)Landroid/os/Bundle;"/>
+ <method name="readByte()B"/>
+ <method name="readByteArray([B)V"/>
+ <method name="readCharArray([C)V"/>
+ <method name="readDouble()D"/>
+ <method name="readDoubleArray([D)V"/>
+ <method name="readException()V"/>
+ <method name="readException(ILjava/lang/String;)V"/>
+ <method name="readFileDescriptor()Landroid/os/ParcelFileDescriptor;"/>
+ <method name="readFloat()F"/>
+ <method name="readFloatArray([F)V"/>
+ <method name="readHashMap(Ljava/lang/ClassLoader;)Ljava/util/HashMap;"/>
+ <method name="readInt()I"/>
+ <method name="readIntArray([I)V"/>
+ <method name="readList(Ljava/util/List;Ljava/lang/ClassLoader;)V"/>
+ <method name="readLong()J"/>
+ <method name="readLongArray([J)V"/>
+ <method name="readMap(Ljava/util/Map;Ljava/lang/ClassLoader;)V"/>
+ <method name="readParcelable(Ljava/lang/ClassLoader;)Landroid/os/Parcelable;"/>
+ <method name="readParcelableArray(Ljava/lang/ClassLoader;)[Landroid/os/Parcelable;"/>
+ <method name="readPersistableBundle()Landroid/os/PersistableBundle;" since="21"/>
+ <method name="readPersistableBundle(Ljava/lang/ClassLoader;)Landroid/os/PersistableBundle;" since="21"/>
+ <method name="readSerializable()Ljava/io/Serializable;"/>
+ <method name="readSize()Landroid/util/Size;" since="21"/>
+ <method name="readSizeF()Landroid/util/SizeF;" since="21"/>
+ <method name="readSparseArray(Ljava/lang/ClassLoader;)Landroid/util/SparseArray;"/>
+ <method name="readSparseBooleanArray()Landroid/util/SparseBooleanArray;"/>
+ <method name="readString()Ljava/lang/String;"/>
+ <method name="readStringArray([Ljava/lang/String;)V"/>
+ <method name="readStringList(Ljava/util/List;)V"/>
+ <method name="readStrongBinder()Landroid/os/IBinder;"/>
+ <method name="readTypedArray([Ljava/lang/Object;Landroid/os/Parcelable$Creator;)V"/>
+ <method name="readTypedList(Ljava/util/List;Landroid/os/Parcelable$Creator;)V"/>
+ <method name="readTypedObject(Landroid/os/Parcelable$Creator;)Ljava/lang/Object;" since="23"/>
+ <method name="readValue(Ljava/lang/ClassLoader;)Ljava/lang/Object;"/>
+ <method name="recycle()V"/>
+ <method name="setDataCapacity(I)V"/>
+ <method name="setDataPosition(I)V"/>
+ <method name="setDataSize(I)V"/>
+ <method name="unmarshall([BII)V"/>
+ <method name="writeArray([Ljava/lang/Object;)V"/>
+ <method name="writeBinderArray([Landroid/os/IBinder;)V"/>
+ <method name="writeBinderList(Ljava/util/List;)V"/>
+ <method name="writeBooleanArray([Z)V"/>
+ <method name="writeBundle(Landroid/os/Bundle;)V"/>
+ <method name="writeByte(B)V"/>
+ <method name="writeByteArray([B)V"/>
+ <method name="writeByteArray([BII)V"/>
+ <method name="writeCharArray([C)V"/>
+ <method name="writeDouble(D)V"/>
+ <method name="writeDoubleArray([D)V"/>
+ <method name="writeException(Ljava/lang/Exception;)V"/>
+ <method name="writeFileDescriptor(Ljava/io/FileDescriptor;)V"/>
+ <method name="writeFloat(F)V"/>
+ <method name="writeFloatArray([F)V"/>
+ <method name="writeInt(I)V"/>
+ <method name="writeIntArray([I)V"/>
+ <method name="writeInterfaceToken(Ljava/lang/String;)V"/>
+ <method name="writeList(Ljava/util/List;)V"/>
+ <method name="writeLong(J)V"/>
+ <method name="writeLongArray([J)V"/>
+ <method name="writeMap(Ljava/util/Map;)V"/>
+ <method name="writeNoException()V"/>
+ <method name="writeParcelable(Landroid/os/Parcelable;I)V"/>
+ <method name="writeParcelableArray([Landroid/os/Parcelable;I)V"/>
+ <method name="writePersistableBundle(Landroid/os/PersistableBundle;)V" since="21"/>
+ <method name="writeSerializable(Ljava/io/Serializable;)V"/>
+ <method name="writeSize(Landroid/util/Size;)V" since="21"/>
+ <method name="writeSizeF(Landroid/util/SizeF;)V" since="21"/>
+ <method name="writeSparseArray(Landroid/util/SparseArray;)V"/>
+ <method name="writeSparseBooleanArray(Landroid/util/SparseBooleanArray;)V"/>
+ <method name="writeString(Ljava/lang/String;)V"/>
+ <method name="writeStringArray([Ljava/lang/String;)V"/>
+ <method name="writeStringList(Ljava/util/List;)V"/>
+ <method name="writeStrongBinder(Landroid/os/IBinder;)V"/>
+ <method name="writeStrongInterface(Landroid/os/IInterface;)V"/>
+ <method name="writeTypedArray([Landroid/os/Parcelable;I)V"/>
+ <method name="writeTypedList(Ljava/util/List;)V"/>
+ <method name="writeTypedObject(Landroid/os/Parcelable;I)V" since="23"/>
+ <method name="writeValue(Ljava/lang/Object;)V"/>
+ <field name="STRING_CREATOR"/>
+ </class>
+ <class name="android/os/ParcelFileDescriptor" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <implements name="java/io/Closeable" since="16"/>
+ <method name="&lt;init>(Landroid/os/ParcelFileDescriptor;)V"/>
+ <method name="adoptFd(I)Landroid/os/ParcelFileDescriptor;" since="13"/>
+ <method name="canDetectErrors()Z" since="19"/>
+ <method name="checkError()V" since="19"/>
+ <method name="close()V"/>
+ <method name="closeWithError(Ljava/lang/String;)V" since="19"/>
+ <method name="createPipe()[Landroid/os/ParcelFileDescriptor;" since="9"/>
+ <method name="createReliablePipe()[Landroid/os/ParcelFileDescriptor;" since="19"/>
+ <method name="createReliableSocketPair()[Landroid/os/ParcelFileDescriptor;" since="19"/>
+ <method name="createSocketPair()[Landroid/os/ParcelFileDescriptor;" since="19"/>
+ <method name="detachFd()I" since="12"/>
+ <method name="dup()Landroid/os/ParcelFileDescriptor;" since="14"/>
+ <method name="dup(Ljava/io/FileDescriptor;)Landroid/os/ParcelFileDescriptor;" since="13"/>
+ <method name="fromDatagramSocket(Ljava/net/DatagramSocket;)Landroid/os/ParcelFileDescriptor;" since="14"/>
+ <method name="fromFd(I)Landroid/os/ParcelFileDescriptor;" since="13"/>
+ <method name="fromSocket(Ljava/net/Socket;)Landroid/os/ParcelFileDescriptor;"/>
+ <method name="getFd()I" since="12"/>
+ <method name="getFileDescriptor()Ljava/io/FileDescriptor;"/>
+ <method name="getStatSize()J" since="3"/>
+ <method name="open(Ljava/io/File;I)Landroid/os/ParcelFileDescriptor;"/>
+ <method name="open(Ljava/io/File;ILandroid/os/Handler;Landroid/os/ParcelFileDescriptor$OnCloseListener;)Landroid/os/ParcelFileDescriptor;" since="19"/>
+ <method name="parseMode(Ljava/lang/String;)I" since="19"/>
+ <field name="CREATOR"/>
+ <field name="MODE_APPEND" since="3"/>
+ <field name="MODE_CREATE"/>
+ <field name="MODE_READ_ONLY"/>
+ <field name="MODE_READ_WRITE"/>
+ <field name="MODE_TRUNCATE"/>
+ <field name="MODE_WORLD_READABLE" deprecated="19"/>
+ <field name="MODE_WORLD_WRITEABLE" deprecated="19"/>
+ <field name="MODE_WRITE_ONLY"/>
+ </class>
+ <class name="android/os/ParcelFileDescriptor$AutoCloseInputStream" since="1">
+ <extends name="java/io/FileInputStream"/>
+ <method name="&lt;init>(Landroid/os/ParcelFileDescriptor;)V"/>
+ </class>
+ <class name="android/os/ParcelFileDescriptor$AutoCloseOutputStream" since="1">
+ <extends name="java/io/FileOutputStream"/>
+ <method name="&lt;init>(Landroid/os/ParcelFileDescriptor;)V"/>
+ </class>
+ <class name="android/os/ParcelFileDescriptor$FileDescriptorDetachedException" since="19">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/os/ParcelFileDescriptor$OnCloseListener" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="onClose(Ljava/io/IOException;)V"/>
+ </class>
+ <class name="android/os/ParcelFormatException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/os/ParcelUuid" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Ljava/util/UUID;)V"/>
+ <method name="fromString(Ljava/lang/String;)Landroid/os/ParcelUuid;"/>
+ <method name="getUuid()Ljava/util/UUID;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/os/Parcelable" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="describeContents()I"/>
+ <method name="writeToParcel(Landroid/os/Parcel;I)V"/>
+ <field name="CONTENTS_FILE_DESCRIPTOR"/>
+ <field name="PARCELABLE_WRITE_RETURN_VALUE"/>
+ </class>
+ <class name="android/os/Parcelable$ClassLoaderCreator" since="13">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable$Creator"/>
+ <method name="createFromParcel(Landroid/os/Parcel;Ljava/lang/ClassLoader;)Ljava/lang/Object;"/>
+ </class>
+ <class name="android/os/Parcelable$Creator" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;"/>
+ <method name="newArray(I)[Ljava/lang/Object;"/>
+ </class>
+ <class name="android/os/PatternMatcher" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="getPath()Ljava/lang/String;"/>
+ <method name="getType()I"/>
+ <method name="match(Ljava/lang/String;)Z"/>
+ <field name="CREATOR"/>
+ <field name="PATTERN_ADVANCED_GLOB" since="26"/>
+ <field name="PATTERN_LITERAL"/>
+ <field name="PATTERN_PREFIX"/>
+ <field name="PATTERN_SIMPLE_GLOB"/>
+ </class>
+ <class name="android/os/PersistableBundle" since="21">
+ <extends name="android/os/BaseBundle"/>
+ <implements name="android/os/Parcelable"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Landroid/os/PersistableBundle;)V"/>
+ <method name="deepCopy()Landroid/os/PersistableBundle;" since="26"/>
+ <method name="getPersistableBundle(Ljava/lang/String;)Landroid/os/PersistableBundle;"/>
+ <method name="putPersistableBundle(Ljava/lang/String;Landroid/os/PersistableBundle;)V"/>
+ <field name="CREATOR"/>
+ <field name="EMPTY"/>
+ </class>
+ <class name="android/os/PowerManager" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="goToSleep(J)V" removed="21"/>
+ <method name="isDeviceIdleMode()Z" since="23"/>
+ <method name="isIgnoringBatteryOptimizations(Ljava/lang/String;)Z" since="23"/>
+ <method name="isInteractive()Z" since="20"/>
+ <method name="isPowerSaveMode()Z" since="21"/>
+ <method name="isScreenOn()Z" since="7" deprecated="20"/>
+ <method name="isSustainedPerformanceModeSupported()Z" since="24"/>
+ <method name="isWakeLockLevelSupported(I)Z" since="21"/>
+ <method name="newWakeLock(ILjava/lang/String;)Landroid/os/PowerManager$WakeLock;"/>
+ <method name="reboot(Ljava/lang/String;)V" since="8"/>
+ <method name="userActivity(JZ)V" removed="21"/>
+ <method name="wakeUp(J)V" since="17" removed="21"/>
+ <field name="ACQUIRE_CAUSES_WAKEUP"/>
+ <field name="ACTION_DEVICE_IDLE_MODE_CHANGED" since="23"/>
+ <field name="ACTION_POWER_SAVE_MODE_CHANGED" since="21"/>
+ <field name="FULL_WAKE_LOCK" deprecated="17"/>
+ <field name="ON_AFTER_RELEASE"/>
+ <field name="PARTIAL_WAKE_LOCK"/>
+ <field name="PROXIMITY_SCREEN_OFF_WAKE_LOCK" since="21"/>
+ <field name="RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY" since="21"/>
+ <field name="SCREEN_BRIGHT_WAKE_LOCK" deprecated="16"/>
+ <field name="SCREEN_DIM_WAKE_LOCK" deprecated="17"/>
+ </class>
+ <class name="android/os/PowerManager$WakeLock" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/os/PowerManager;)V"/>
+ <method name="acquire()V"/>
+ <method name="acquire(J)V"/>
+ <method name="isHeld()Z"/>
+ <method name="release()V"/>
+ <method name="release(I)V" since="21"/>
+ <method name="setReferenceCounted(Z)V"/>
+ <method name="setWorkSource(Landroid/os/WorkSource;)V" since="9"/>
+ </class>
+ <class name="android/os/Process" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getElapsedCpuTime()J"/>
+ <method name="getExclusiveCores()[I" since="24"/>
+ <method name="getGidForName(Ljava/lang/String;)I"/>
+ <method name="getStartElapsedRealtime()J" since="24"/>
+ <method name="getStartUptimeMillis()J" since="24"/>
+ <method name="getThreadPriority(I)I"/>
+ <method name="getUidForName(Ljava/lang/String;)I"/>
+ <method name="is64Bit()Z" since="23"/>
+ <method name="isApplicationUid(I)Z" since="24"/>
+ <method name="killProcess(I)V"/>
+ <method name="myPid()I"/>
+ <method name="myTid()I"/>
+ <method name="myUid()I" since="2"/>
+ <method name="myUserHandle()Landroid/os/UserHandle;" since="17"/>
+ <method name="sendSignal(II)V"/>
+ <method name="setThreadPriority(I)V"/>
+ <method name="setThreadPriority(II)V"/>
+ <method name="supportsProcesses()Z" deprecated="16"/>
+ <field name="BLUETOOTH_GID" removed="18"/>
+ <field name="FIRST_APPLICATION_UID"/>
+ <field name="LAST_APPLICATION_UID"/>
+ <field name="PHONE_UID"/>
+ <field name="SIGNAL_KILL"/>
+ <field name="SIGNAL_QUIT"/>
+ <field name="SIGNAL_USR1"/>
+ <field name="SYSTEM_UID"/>
+ <field name="THREAD_PRIORITY_AUDIO"/>
+ <field name="THREAD_PRIORITY_BACKGROUND"/>
+ <field name="THREAD_PRIORITY_DEFAULT"/>
+ <field name="THREAD_PRIORITY_DISPLAY"/>
+ <field name="THREAD_PRIORITY_FOREGROUND"/>
+ <field name="THREAD_PRIORITY_LESS_FAVORABLE"/>
+ <field name="THREAD_PRIORITY_LOWEST"/>
+ <field name="THREAD_PRIORITY_MORE_FAVORABLE"/>
+ <field name="THREAD_PRIORITY_URGENT_AUDIO"/>
+ <field name="THREAD_PRIORITY_URGENT_DISPLAY"/>
+ </class>
+ <class name="android/os/ProxyFileDescriptorCallback" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onFsync()V"/>
+ <method name="onGetSize()J"/>
+ <method name="onRead(JI[B)I"/>
+ <method name="onRelease()V"/>
+ <method name="onWrite(JI[B)I"/>
+ </class>
+ <class name="android/os/RecoverySystem" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="installPackage(Landroid/content/Context;Ljava/io/File;)V"/>
+ <method name="rebootWipeCache(Landroid/content/Context;)V" since="14"/>
+ <method name="rebootWipeUserData(Landroid/content/Context;)V"/>
+ <method name="verifyPackage(Ljava/io/File;Landroid/os/RecoverySystem$ProgressListener;Ljava/io/File;)V"/>
+ </class>
+ <class name="android/os/RecoverySystem$ProgressListener" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="onProgress(I)V"/>
+ </class>
+ <class name="android/os/RemoteCallbackList" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="beginBroadcast()I"/>
+ <method name="finishBroadcast()V"/>
+ <method name="getBroadcastCookie(I)Ljava/lang/Object;" since="4"/>
+ <method name="getBroadcastItem(I)Landroid/os/IInterface;"/>
+ <method name="getRegisteredCallbackCookie(I)Ljava/lang/Object;" since="26"/>
+ <method name="getRegisteredCallbackCount()I" since="17"/>
+ <method name="getRegisteredCallbackItem(I)Landroid/os/IInterface;" since="26"/>
+ <method name="kill()V"/>
+ <method name="onCallbackDied(Landroid/os/IInterface;)V"/>
+ <method name="onCallbackDied(Landroid/os/IInterface;Ljava/lang/Object;)V" since="4"/>
+ <method name="register(Landroid/os/IInterface;)Z"/>
+ <method name="register(Landroid/os/IInterface;Ljava/lang/Object;)Z" since="4"/>
+ <method name="unregister(Landroid/os/IInterface;)Z"/>
+ </class>
+ <class name="android/os/RemoteException" since="1">
+ <extends name="android/util/AndroidException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V" since="15"/>
+ </class>
+ <class name="android/os/ResultReceiver" since="3">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/os/Handler;)V"/>
+ <method name="onReceiveResult(ILandroid/os/Bundle;)V"/>
+ <method name="send(ILandroid/os/Bundle;)V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/os/StatFs" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getAvailableBlocks()I" deprecated="18"/>
+ <method name="getAvailableBlocksLong()J" since="18"/>
+ <method name="getAvailableBytes()J" since="18"/>
+ <method name="getBlockCount()I" deprecated="18"/>
+ <method name="getBlockCountLong()J" since="18"/>
+ <method name="getBlockSize()I" deprecated="18"/>
+ <method name="getBlockSizeLong()J" since="18"/>
+ <method name="getFreeBlocks()I" deprecated="18"/>
+ <method name="getFreeBlocksLong()J" since="18"/>
+ <method name="getFreeBytes()J" since="18"/>
+ <method name="getTotalBytes()J" since="18"/>
+ <method name="restat(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/os/StrictMode" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="allowThreadDiskReads()Landroid/os/StrictMode$ThreadPolicy;"/>
+ <method name="allowThreadDiskWrites()Landroid/os/StrictMode$ThreadPolicy;"/>
+ <method name="enableDefaults()V"/>
+ <method name="getThreadPolicy()Landroid/os/StrictMode$ThreadPolicy;"/>
+ <method name="getVmPolicy()Landroid/os/StrictMode$VmPolicy;"/>
+ <method name="noteSlowCall(Ljava/lang/String;)V" since="11"/>
+ <method name="setThreadPolicy(Landroid/os/StrictMode$ThreadPolicy;)V"/>
+ <method name="setVmPolicy(Landroid/os/StrictMode$VmPolicy;)V"/>
+ </class>
+ <class name="android/os/StrictMode$ThreadPolicy" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="LAX"/>
+ </class>
+ <class name="android/os/StrictMode$ThreadPolicy$Builder" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/os/StrictMode$ThreadPolicy;)V"/>
+ <method name="build()Landroid/os/StrictMode$ThreadPolicy;"/>
+ <method name="detectAll()Landroid/os/StrictMode$ThreadPolicy$Builder;"/>
+ <method name="detectCustomSlowCalls()Landroid/os/StrictMode$ThreadPolicy$Builder;" since="11"/>
+ <method name="detectDiskReads()Landroid/os/StrictMode$ThreadPolicy$Builder;"/>
+ <method name="detectDiskWrites()Landroid/os/StrictMode$ThreadPolicy$Builder;"/>
+ <method name="detectNetwork()Landroid/os/StrictMode$ThreadPolicy$Builder;"/>
+ <method name="detectResourceMismatches()Landroid/os/StrictMode$ThreadPolicy$Builder;" since="23"/>
+ <method name="detectUnbufferedIo()Landroid/os/StrictMode$ThreadPolicy$Builder;" since="26"/>
+ <method name="penaltyDeath()Landroid/os/StrictMode$ThreadPolicy$Builder;"/>
+ <method name="penaltyDeathOnNetwork()Landroid/os/StrictMode$ThreadPolicy$Builder;" since="11"/>
+ <method name="penaltyDialog()Landroid/os/StrictMode$ThreadPolicy$Builder;"/>
+ <method name="penaltyDropBox()Landroid/os/StrictMode$ThreadPolicy$Builder;"/>
+ <method name="penaltyFlashScreen()Landroid/os/StrictMode$ThreadPolicy$Builder;" since="11"/>
+ <method name="penaltyLog()Landroid/os/StrictMode$ThreadPolicy$Builder;"/>
+ <method name="permitAll()Landroid/os/StrictMode$ThreadPolicy$Builder;"/>
+ <method name="permitCustomSlowCalls()Landroid/os/StrictMode$ThreadPolicy$Builder;" since="11"/>
+ <method name="permitDiskReads()Landroid/os/StrictMode$ThreadPolicy$Builder;"/>
+ <method name="permitDiskWrites()Landroid/os/StrictMode$ThreadPolicy$Builder;"/>
+ <method name="permitNetwork()Landroid/os/StrictMode$ThreadPolicy$Builder;"/>
+ <method name="permitResourceMismatches()Landroid/os/StrictMode$ThreadPolicy$Builder;" since="23"/>
+ <method name="permitUnbufferedIo()Landroid/os/StrictMode$ThreadPolicy$Builder;" since="26"/>
+ </class>
+ <class name="android/os/StrictMode$VmPolicy" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="LAX"/>
+ </class>
+ <class name="android/os/StrictMode$VmPolicy$Builder" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/os/StrictMode$VmPolicy;)V" since="11"/>
+ <method name="build()Landroid/os/StrictMode$VmPolicy;"/>
+ <method name="detectActivityLeaks()Landroid/os/StrictMode$VmPolicy$Builder;" since="11"/>
+ <method name="detectAll()Landroid/os/StrictMode$VmPolicy$Builder;"/>
+ <method name="detectCleartextNetwork()Landroid/os/StrictMode$VmPolicy$Builder;" since="23"/>
+ <method name="detectContentUriWithoutPermission()Landroid/os/StrictMode$VmPolicy$Builder;" since="26"/>
+ <method name="detectFileUriExposure()Landroid/os/StrictMode$VmPolicy$Builder;" since="18"/>
+ <method name="detectLeakedClosableObjects()Landroid/os/StrictMode$VmPolicy$Builder;" since="11"/>
+ <method name="detectLeakedRegistrationObjects()Landroid/os/StrictMode$VmPolicy$Builder;" since="16"/>
+ <method name="detectLeakedSqlLiteObjects()Landroid/os/StrictMode$VmPolicy$Builder;"/>
+ <method name="detectUntaggedSockets()Landroid/os/StrictMode$VmPolicy$Builder;" since="26"/>
+ <method name="penaltyDeath()Landroid/os/StrictMode$VmPolicy$Builder;"/>
+ <method name="penaltyDeathOnCleartextNetwork()Landroid/os/StrictMode$VmPolicy$Builder;" since="23"/>
+ <method name="penaltyDeathOnFileUriExposure()Landroid/os/StrictMode$VmPolicy$Builder;" since="24"/>
+ <method name="penaltyDropBox()Landroid/os/StrictMode$VmPolicy$Builder;"/>
+ <method name="penaltyLog()Landroid/os/StrictMode$VmPolicy$Builder;"/>
+ <method name="setClassInstanceLimit(Ljava/lang/Class;I)Landroid/os/StrictMode$VmPolicy$Builder;" since="11"/>
+ </class>
+ <class name="android/os/SystemClock" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="currentThreadTimeMillis()J"/>
+ <method name="elapsedRealtime()J"/>
+ <method name="elapsedRealtimeNanos()J" since="17"/>
+ <method name="setCurrentTimeMillis(J)Z"/>
+ <method name="sleep(J)V"/>
+ <method name="uptimeMillis()J"/>
+ </class>
+ <class name="android/os/TestLooperManager" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="execute(Landroid/os/Message;)V"/>
+ <method name="getMessageQueue()Landroid/os/MessageQueue;"/>
+ <method name="hasMessages(Landroid/os/Handler;Ljava/lang/Object;I)Z"/>
+ <method name="hasMessages(Landroid/os/Handler;Ljava/lang/Object;Ljava/lang/Runnable;)Z"/>
+ <method name="next()Landroid/os/Message;"/>
+ <method name="recycle(Landroid/os/Message;)V"/>
+ <method name="release()V"/>
+ </class>
+ <class name="android/os/TokenWatcher" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/os/Handler;Ljava/lang/String;)V"/>
+ <method name="acquire(Landroid/os/IBinder;Ljava/lang/String;)V"/>
+ <method name="acquired()V"/>
+ <method name="cleanup(Landroid/os/IBinder;Z)V"/>
+ <method name="dump()V"/>
+ <method name="dump(Ljava/io/PrintWriter;)V" since="16"/>
+ <method name="isAcquired()Z"/>
+ <method name="release(Landroid/os/IBinder;)V"/>
+ <method name="released()V"/>
+ </class>
+ <class name="android/os/Trace" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="beginSection(Ljava/lang/String;)V"/>
+ <method name="endSection()V"/>
+ </class>
+ <class name="android/os/TransactionTooLargeException" since="15">
+ <extends name="android/os/RemoteException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V" since="23"/>
+ </class>
+ <class name="android/os/UserHandle" since="17">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="getUserHandleForUid(I)Landroid/os/UserHandle;" since="24"/>
+ <method name="readFromParcel(Landroid/os/Parcel;)Landroid/os/UserHandle;"/>
+ <method name="writeToParcel(Landroid/os/UserHandle;Landroid/os/Parcel;)V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/os/UserManager" since="17">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="createUserCreationIntent(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/PersistableBundle;)Landroid/content/Intent;" since="24"/>
+ <method name="getApplicationRestrictions(Ljava/lang/String;)Landroid/os/Bundle;" since="18"/>
+ <method name="getSerialNumberForUser(Landroid/os/UserHandle;)J"/>
+ <method name="getUserCount()I"/>
+ <method name="getUserCreationTime(Landroid/os/UserHandle;)J" since="23"/>
+ <method name="getUserForSerialNumber(J)Landroid/os/UserHandle;"/>
+ <method name="getUserName()Ljava/lang/String;"/>
+ <method name="getUserProfiles()Ljava/util/List;" since="21"/>
+ <method name="getUserRestrictions()Landroid/os/Bundle;" since="18"/>
+ <method name="getUserRestrictions(Landroid/os/UserHandle;)Landroid/os/Bundle;" since="18"/>
+ <method name="hasUserRestriction(Ljava/lang/String;)Z" since="21"/>
+ <method name="isDemoUser()Z" since="25"/>
+ <method name="isQuietModeEnabled(Landroid/os/UserHandle;)Z" since="24"/>
+ <method name="isSystemUser()Z" since="23"/>
+ <method name="isUserAGoat()Z"/>
+ <method name="isUserRunning(Landroid/os/UserHandle;)Z"/>
+ <method name="isUserRunningOrStopping(Landroid/os/UserHandle;)Z"/>
+ <method name="isUserUnlocked()Z" since="24"/>
+ <method name="isUserUnlocked(Landroid/os/UserHandle;)Z" since="24"/>
+ <method name="setRestrictionsChallenge(Ljava/lang/String;)Z" since="19" deprecated="23"/>
+ <method name="setUserRestriction(Ljava/lang/String;Z)V" since="18" deprecated="21"/>
+ <method name="setUserRestrictions(Landroid/os/Bundle;)V" since="18" deprecated="21"/>
+ <method name="setUserRestrictions(Landroid/os/Bundle;Landroid/os/UserHandle;)V" since="18" deprecated="21"/>
+ <method name="supportsMultipleUsers()Z" since="24"/>
+ <field name="ALLOW_PARENT_PROFILE_APP_LINKING" since="23"/>
+ <field name="DISALLOW_ADD_MANAGED_PROFILE" since="26"/>
+ <field name="DISALLOW_ADD_USER" since="21"/>
+ <field name="DISALLOW_ADJUST_VOLUME" since="21"/>
+ <field name="DISALLOW_APPS_CONTROL" since="21"/>
+ <field name="DISALLOW_AUTOFILL" since="26"/>
+ <field name="DISALLOW_BLUETOOTH" since="26"/>
+ <field name="DISALLOW_BLUETOOTH_SHARING" since="26"/>
+ <field name="DISALLOW_CONFIG_BLUETOOTH" since="18"/>
+ <field name="DISALLOW_CONFIG_CELL_BROADCASTS" since="21"/>
+ <field name="DISALLOW_CONFIG_CREDENTIALS" since="18"/>
+ <field name="DISALLOW_CONFIG_MOBILE_NETWORKS" since="21"/>
+ <field name="DISALLOW_CONFIG_TETHERING" since="21"/>
+ <field name="DISALLOW_CONFIG_VPN" since="21"/>
+ <field name="DISALLOW_CONFIG_WIFI" since="18"/>
+ <field name="DISALLOW_CREATE_WINDOWS" since="21"/>
+ <field name="DISALLOW_CROSS_PROFILE_COPY_PASTE" since="21"/>
+ <field name="DISALLOW_DATA_ROAMING" since="24"/>
+ <field name="DISALLOW_DEBUGGING_FEATURES" since="21"/>
+ <field name="DISALLOW_FACTORY_RESET" since="21"/>
+ <field name="DISALLOW_FUN" since="23"/>
+ <field name="DISALLOW_INSTALL_APPS" since="18"/>
+ <field name="DISALLOW_INSTALL_UNKNOWN_SOURCES" since="18"/>
+ <field name="DISALLOW_MODIFY_ACCOUNTS" since="18"/>
+ <field name="DISALLOW_MOUNT_PHYSICAL_MEDIA" since="21"/>
+ <field name="DISALLOW_NETWORK_RESET" since="23"/>
+ <field name="DISALLOW_OUTGOING_BEAM" since="22"/>
+ <field name="DISALLOW_OUTGOING_CALLS" since="21"/>
+ <field name="DISALLOW_REMOVE_MANAGED_PROFILE" since="26"/>
+ <field name="DISALLOW_REMOVE_USER" since="18"/>
+ <field name="DISALLOW_SAFE_BOOT" since="23"/>
+ <field name="DISALLOW_SET_USER_ICON" since="24"/>
+ <field name="DISALLOW_SET_WALLPAPER" since="24"/>
+ <field name="DISALLOW_SHARE_LOCATION" since="18"/>
+ <field name="DISALLOW_SMS" since="21"/>
+ <field name="DISALLOW_UNINSTALL_APPS" since="18"/>
+ <field name="DISALLOW_UNMUTE_MICROPHONE" since="21"/>
+ <field name="DISALLOW_USB_FILE_TRANSFER" since="18"/>
+ <field name="ENSURE_VERIFY_APPS" since="21"/>
+ <field name="KEY_RESTRICTIONS_PENDING" since="22"/>
+ <field name="USER_CREATION_FAILED_NOT_PERMITTED" since="24"/>
+ <field name="USER_CREATION_FAILED_NO_MORE_USERS" since="24"/>
+ </class>
+ <class name="android/os/VibrationEffect" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="createOneShot(JI)Landroid/os/VibrationEffect;"/>
+ <method name="createWaveform([JI)Landroid/os/VibrationEffect;"/>
+ <method name="createWaveform([J[II)Landroid/os/VibrationEffect;"/>
+ <field name="CREATOR"/>
+ <field name="DEFAULT_AMPLITUDE"/>
+ </class>
+ <class name="android/os/Vibrator" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="cancel()V"/>
+ <method name="hasAmplitudeControl()Z" since="26"/>
+ <method name="hasVibrator()Z" since="11"/>
+ <method name="vibrate(J)V" deprecated="26"/>
+ <method name="vibrate(JLandroid/media/AudioAttributes;)V" since="21" deprecated="26"/>
+ <method name="vibrate(Landroid/os/VibrationEffect;)V" since="26"/>
+ <method name="vibrate(Landroid/os/VibrationEffect;Landroid/media/AudioAttributes;)V" since="26"/>
+ <method name="vibrate([JI)V" deprecated="26"/>
+ <method name="vibrate([JILandroid/media/AudioAttributes;)V" since="21" deprecated="26"/>
+ </class>
+ <class name="android/os/WorkSource" since="9">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/os/WorkSource;)V"/>
+ <method name="add(Landroid/os/WorkSource;)Z"/>
+ <method name="clear()V"/>
+ <method name="diff(Landroid/os/WorkSource;)Z"/>
+ <method name="remove(Landroid/os/WorkSource;)Z"/>
+ <method name="set(Landroid/os/WorkSource;)V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/os/health/HealthStats" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDataType()Ljava/lang/String;"/>
+ <method name="getMeasurement(I)J"/>
+ <method name="getMeasurementKeyAt(I)I"/>
+ <method name="getMeasurementKeyCount()I"/>
+ <method name="getMeasurements(I)Ljava/util/Map;"/>
+ <method name="getMeasurementsKeyAt(I)I"/>
+ <method name="getMeasurementsKeyCount()I"/>
+ <method name="getStats(I)Ljava/util/Map;"/>
+ <method name="getStatsKeyAt(I)I"/>
+ <method name="getStatsKeyCount()I"/>
+ <method name="getTimer(I)Landroid/os/health/TimerStat;"/>
+ <method name="getTimerCount(I)I"/>
+ <method name="getTimerKeyAt(I)I"/>
+ <method name="getTimerKeyCount()I"/>
+ <method name="getTimerTime(I)J"/>
+ <method name="getTimers(I)Ljava/util/Map;"/>
+ <method name="getTimersKeyAt(I)I"/>
+ <method name="getTimersKeyCount()I"/>
+ <method name="hasMeasurement(I)Z"/>
+ <method name="hasMeasurements(I)Z"/>
+ <method name="hasStats(I)Z"/>
+ <method name="hasTimer(I)Z"/>
+ <method name="hasTimers(I)Z"/>
+ </class>
+ <class name="android/os/health/PackageHealthStats" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="MEASUREMENTS_WAKEUP_ALARMS_COUNT"/>
+ <field name="STATS_SERVICES"/>
+ </class>
+ <class name="android/os/health/PidHealthStats" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="MEASUREMENT_WAKE_NESTING_COUNT"/>
+ <field name="MEASUREMENT_WAKE_START_MS"/>
+ <field name="MEASUREMENT_WAKE_SUM_MS"/>
+ </class>
+ <class name="android/os/health/ProcessHealthStats" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="MEASUREMENT_ANR_COUNT"/>
+ <field name="MEASUREMENT_CRASHES_COUNT"/>
+ <field name="MEASUREMENT_FOREGROUND_MS"/>
+ <field name="MEASUREMENT_STARTS_COUNT"/>
+ <field name="MEASUREMENT_SYSTEM_TIME_MS"/>
+ <field name="MEASUREMENT_USER_TIME_MS"/>
+ </class>
+ <class name="android/os/health/ServiceHealthStats" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="MEASUREMENT_LAUNCH_COUNT"/>
+ <field name="MEASUREMENT_START_SERVICE_COUNT"/>
+ </class>
+ <class name="android/os/health/SystemHealthManager" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="takeMyUidSnapshot()Landroid/os/health/HealthStats;"/>
+ <method name="takeUidSnapshot(I)Landroid/os/health/HealthStats;"/>
+ <method name="takeUidSnapshots([I)[Landroid/os/health/HealthStats;"/>
+ </class>
+ <class name="android/os/health/TimerStat" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(IJ)V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="getCount()I"/>
+ <method name="getTime()J"/>
+ <method name="setCount(I)V"/>
+ <method name="setTime(J)V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/os/health/UidHealthStats" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="MEASUREMENT_BLUETOOTH_IDLE_MS"/>
+ <field name="MEASUREMENT_BLUETOOTH_POWER_MAMS"/>
+ <field name="MEASUREMENT_BLUETOOTH_RX_BYTES"/>
+ <field name="MEASUREMENT_BLUETOOTH_RX_MS"/>
+ <field name="MEASUREMENT_BLUETOOTH_RX_PACKETS"/>
+ <field name="MEASUREMENT_BLUETOOTH_TX_BYTES"/>
+ <field name="MEASUREMENT_BLUETOOTH_TX_MS"/>
+ <field name="MEASUREMENT_BLUETOOTH_TX_PACKETS"/>
+ <field name="MEASUREMENT_BUTTON_USER_ACTIVITY_COUNT"/>
+ <field name="MEASUREMENT_CPU_POWER_MAMS" deprecated="26"/>
+ <field name="MEASUREMENT_MOBILE_IDLE_MS"/>
+ <field name="MEASUREMENT_MOBILE_POWER_MAMS"/>
+ <field name="MEASUREMENT_MOBILE_RX_BYTES"/>
+ <field name="MEASUREMENT_MOBILE_RX_MS"/>
+ <field name="MEASUREMENT_MOBILE_RX_PACKETS"/>
+ <field name="MEASUREMENT_MOBILE_TX_BYTES"/>
+ <field name="MEASUREMENT_MOBILE_TX_MS"/>
+ <field name="MEASUREMENT_MOBILE_TX_PACKETS"/>
+ <field name="MEASUREMENT_OTHER_USER_ACTIVITY_COUNT"/>
+ <field name="MEASUREMENT_REALTIME_BATTERY_MS"/>
+ <field name="MEASUREMENT_REALTIME_SCREEN_OFF_BATTERY_MS"/>
+ <field name="MEASUREMENT_SYSTEM_CPU_TIME_MS"/>
+ <field name="MEASUREMENT_TOUCH_USER_ACTIVITY_COUNT"/>
+ <field name="MEASUREMENT_UPTIME_BATTERY_MS"/>
+ <field name="MEASUREMENT_UPTIME_SCREEN_OFF_BATTERY_MS"/>
+ <field name="MEASUREMENT_USER_CPU_TIME_MS"/>
+ <field name="MEASUREMENT_WIFI_FULL_LOCK_MS"/>
+ <field name="MEASUREMENT_WIFI_IDLE_MS"/>
+ <field name="MEASUREMENT_WIFI_MULTICAST_MS"/>
+ <field name="MEASUREMENT_WIFI_POWER_MAMS"/>
+ <field name="MEASUREMENT_WIFI_RUNNING_MS"/>
+ <field name="MEASUREMENT_WIFI_RX_BYTES"/>
+ <field name="MEASUREMENT_WIFI_RX_MS"/>
+ <field name="MEASUREMENT_WIFI_RX_PACKETS"/>
+ <field name="MEASUREMENT_WIFI_TX_BYTES"/>
+ <field name="MEASUREMENT_WIFI_TX_MS"/>
+ <field name="MEASUREMENT_WIFI_TX_PACKETS"/>
+ <field name="STATS_PACKAGES"/>
+ <field name="STATS_PIDS"/>
+ <field name="STATS_PROCESSES"/>
+ <field name="TIMERS_JOBS"/>
+ <field name="TIMERS_SENSORS"/>
+ <field name="TIMERS_SYNCS"/>
+ <field name="TIMERS_WAKELOCKS_DRAW"/>
+ <field name="TIMERS_WAKELOCKS_FULL"/>
+ <field name="TIMERS_WAKELOCKS_PARTIAL"/>
+ <field name="TIMERS_WAKELOCKS_WINDOW"/>
+ <field name="TIMER_AUDIO"/>
+ <field name="TIMER_BLUETOOTH_SCAN"/>
+ <field name="TIMER_CAMERA"/>
+ <field name="TIMER_FLASHLIGHT"/>
+ <field name="TIMER_FOREGROUND_ACTIVITY"/>
+ <field name="TIMER_GPS_SENSOR"/>
+ <field name="TIMER_MOBILE_RADIO_ACTIVE"/>
+ <field name="TIMER_PROCESS_STATE_BACKGROUND_MS"/>
+ <field name="TIMER_PROCESS_STATE_CACHED_MS"/>
+ <field name="TIMER_PROCESS_STATE_FOREGROUND_MS"/>
+ <field name="TIMER_PROCESS_STATE_FOREGROUND_SERVICE_MS"/>
+ <field name="TIMER_PROCESS_STATE_TOP_MS"/>
+ <field name="TIMER_PROCESS_STATE_TOP_SLEEPING_MS"/>
+ <field name="TIMER_VIBRATOR"/>
+ <field name="TIMER_VIDEO"/>
+ <field name="TIMER_WIFI_SCAN"/>
+ </class>
+ <class name="android/os/storage/OnObbStateChangeListener" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onObbStateChange(Ljava/lang/String;I)V"/>
+ <field name="ERROR_ALREADY_MOUNTED"/>
+ <field name="ERROR_COULD_NOT_MOUNT"/>
+ <field name="ERROR_COULD_NOT_UNMOUNT"/>
+ <field name="ERROR_INTERNAL"/>
+ <field name="ERROR_NOT_MOUNTED"/>
+ <field name="ERROR_PERMISSION_DENIED"/>
+ <field name="MOUNTED"/>
+ <field name="UNMOUNTED"/>
+ </class>
+ <class name="android/os/storage/StorageManager" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="allocateBytes(Ljava/io/FileDescriptor;J)V" since="26"/>
+ <method name="allocateBytes(Ljava/util/UUID;J)V" since="26"/>
+ <method name="getAllocatableBytes(Ljava/util/UUID;)J" since="26"/>
+ <method name="getCacheQuotaBytes(Ljava/util/UUID;)J" since="26"/>
+ <method name="getCacheSizeBytes(Ljava/util/UUID;)J" since="26"/>
+ <method name="getMountedObbPath(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getPrimaryStorageVolume()Landroid/os/storage/StorageVolume;" since="24"/>
+ <method name="getStorageVolume(Ljava/io/File;)Landroid/os/storage/StorageVolume;" since="24"/>
+ <method name="getStorageVolumes()Ljava/util/List;" since="24"/>
+ <method name="getUuidForPath(Ljava/io/File;)Ljava/util/UUID;" since="26"/>
+ <method name="isCacheBehaviorGroup(Ljava/io/File;)Z" since="26"/>
+ <method name="isCacheBehaviorTombstone(Ljava/io/File;)Z" since="26"/>
+ <method name="isEncrypted(Ljava/io/File;)Z" since="24"/>
+ <method name="isObbMounted(Ljava/lang/String;)Z"/>
+ <method name="mountObb(Ljava/lang/String;Ljava/lang/String;Landroid/os/storage/OnObbStateChangeListener;)Z"/>
+ <method name="openProxyFileDescriptor(ILandroid/os/ProxyFileDescriptorCallback;Landroid/os/Handler;)Landroid/os/ParcelFileDescriptor;" since="26"/>
+ <method name="setCacheBehaviorGroup(Ljava/io/File;Z)V" since="26"/>
+ <method name="setCacheBehaviorTombstone(Ljava/io/File;Z)V" since="26"/>
+ <method name="unmountObb(Ljava/lang/String;ZLandroid/os/storage/OnObbStateChangeListener;)Z"/>
+ <field name="ACTION_MANAGE_STORAGE" since="25"/>
+ <field name="EXTRA_REQUESTED_BYTES" since="26"/>
+ <field name="EXTRA_UUID" since="26"/>
+ <field name="UUID_DEFAULT" since="26"/>
+ </class>
+ <class name="android/os/storage/StorageVolume" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="createAccessIntent(Ljava/lang/String;)Landroid/content/Intent;"/>
+ <method name="getDescription(Landroid/content/Context;)Ljava/lang/String;"/>
+ <method name="getState()Ljava/lang/String;"/>
+ <method name="getUuid()Ljava/lang/String;"/>
+ <method name="isEmulated()Z"/>
+ <method name="isPrimary()Z"/>
+ <method name="isRemovable()Z"/>
+ <field name="CREATOR"/>
+ <field name="EXTRA_STORAGE_VOLUME"/>
+ </class>
+ <class name="android/preference/CheckBoxPreference" since="1">
+ <extends name="android/preference/Preference" removed="14"/>
+ <extends name="android/preference/TwoStatePreference" since="14"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getDisableDependentsState()Z" removed="14"/>
+ <method name="getSummaryOff()Ljava/lang/CharSequence;" removed="14"/>
+ <method name="getSummaryOn()Ljava/lang/CharSequence;" removed="14"/>
+ <method name="isChecked()Z" removed="14"/>
+ <method name="setChecked(Z)V" removed="14"/>
+ <method name="setDisableDependentsState(Z)V" removed="14"/>
+ <method name="setSummaryOff(I)V" removed="14"/>
+ <method name="setSummaryOff(Ljava/lang/CharSequence;)V" removed="14"/>
+ <method name="setSummaryOn(I)V" removed="14"/>
+ <method name="setSummaryOn(Ljava/lang/CharSequence;)V" removed="14"/>
+ </class>
+ <class name="android/preference/DialogPreference" since="1">
+ <extends name="android/preference/Preference"/>
+ <implements name="android/content/DialogInterface$OnClickListener"/>
+ <implements name="android/content/DialogInterface$OnDismissListener"/>
+ <implements name="android/preference/PreferenceManager$OnActivityDestroyListener"/>
+ <method name="&lt;init>(Landroid/content/Context;)V" since="21"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getDialog()Landroid/app/Dialog;" since="3"/>
+ <method name="getDialogIcon()Landroid/graphics/drawable/Drawable;"/>
+ <method name="getDialogLayoutResource()I"/>
+ <method name="getDialogMessage()Ljava/lang/CharSequence;"/>
+ <method name="getDialogTitle()Ljava/lang/CharSequence;"/>
+ <method name="getNegativeButtonText()Ljava/lang/CharSequence;"/>
+ <method name="getPositiveButtonText()Ljava/lang/CharSequence;"/>
+ <method name="onBindDialogView(Landroid/view/View;)V"/>
+ <method name="onCreateDialogView()Landroid/view/View;"/>
+ <method name="onDialogClosed(Z)V"/>
+ <method name="onPrepareDialogBuilder(Landroid/app/AlertDialog$Builder;)V"/>
+ <method name="setDialogIcon(I)V"/>
+ <method name="setDialogIcon(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setDialogLayoutResource(I)V"/>
+ <method name="setDialogMessage(I)V"/>
+ <method name="setDialogMessage(Ljava/lang/CharSequence;)V"/>
+ <method name="setDialogTitle(I)V"/>
+ <method name="setDialogTitle(Ljava/lang/CharSequence;)V"/>
+ <method name="setNegativeButtonText(I)V"/>
+ <method name="setNegativeButtonText(Ljava/lang/CharSequence;)V"/>
+ <method name="setPositiveButtonText(I)V"/>
+ <method name="setPositiveButtonText(Ljava/lang/CharSequence;)V"/>
+ <method name="showDialog(Landroid/os/Bundle;)V"/>
+ </class>
+ <class name="android/preference/EditTextPreference" since="1">
+ <extends name="android/preference/DialogPreference"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getEditText()Landroid/widget/EditText;"/>
+ <method name="getText()Ljava/lang/String;"/>
+ <method name="onAddEditTextToDialogView(Landroid/view/View;Landroid/widget/EditText;)V"/>
+ <method name="setText(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/preference/ListPreference" since="1">
+ <extends name="android/preference/DialogPreference"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" since="21"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="findIndexOfValue(Ljava/lang/String;)I"/>
+ <method name="getEntries()[Ljava/lang/CharSequence;"/>
+ <method name="getEntry()Ljava/lang/CharSequence;"/>
+ <method name="getEntryValues()[Ljava/lang/CharSequence;"/>
+ <method name="getValue()Ljava/lang/String;"/>
+ <method name="setEntries(I)V"/>
+ <method name="setEntries([Ljava/lang/CharSequence;)V"/>
+ <method name="setEntryValues(I)V"/>
+ <method name="setEntryValues([Ljava/lang/CharSequence;)V"/>
+ <method name="setValue(Ljava/lang/String;)V"/>
+ <method name="setValueIndex(I)V"/>
+ </class>
+ <class name="android/preference/MultiSelectListPreference" since="11">
+ <extends name="android/preference/DialogPreference"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" since="21"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="findIndexOfValue(Ljava/lang/String;)I"/>
+ <method name="getEntries()[Ljava/lang/CharSequence;"/>
+ <method name="getEntryValues()[Ljava/lang/CharSequence;"/>
+ <method name="getValues()Ljava/util/Set;"/>
+ <method name="setEntries(I)V"/>
+ <method name="setEntries([Ljava/lang/CharSequence;)V"/>
+ <method name="setEntryValues(I)V"/>
+ <method name="setEntryValues([Ljava/lang/CharSequence;)V"/>
+ <method name="setValues(Ljava/util/Set;)V"/>
+ </class>
+ <class name="android/preference/Preference" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="callChangeListener(Ljava/lang/Object;)Z"/>
+ <method name="compareTo(Landroid/preference/Preference;)I"/>
+ <method name="findPreferenceInHierarchy(Ljava/lang/String;)Landroid/preference/Preference;"/>
+ <method name="getContext()Landroid/content/Context;"/>
+ <method name="getDependency()Ljava/lang/String;"/>
+ <method name="getEditor()Landroid/content/SharedPreferences$Editor;"/>
+ <method name="getExtras()Landroid/os/Bundle;" since="11"/>
+ <method name="getFragment()Ljava/lang/String;" since="11"/>
+ <method name="getIcon()Landroid/graphics/drawable/Drawable;" since="11"/>
+ <method name="getIntent()Landroid/content/Intent;"/>
+ <method name="getKey()Ljava/lang/String;"/>
+ <method name="getLayoutResource()I"/>
+ <method name="getOnPreferenceChangeListener()Landroid/preference/Preference$OnPreferenceChangeListener;"/>
+ <method name="getOnPreferenceClickListener()Landroid/preference/Preference$OnPreferenceClickListener;"/>
+ <method name="getOrder()I"/>
+ <method name="getParent()Landroid/preference/PreferenceGroup;" since="26"/>
+ <method name="getPersistedBoolean(Z)Z"/>
+ <method name="getPersistedFloat(F)F"/>
+ <method name="getPersistedInt(I)I"/>
+ <method name="getPersistedLong(J)J"/>
+ <method name="getPersistedString(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getPersistedStringSet(Ljava/util/Set;)Ljava/util/Set;" since="24"/>
+ <method name="getPreferenceDataStore()Landroid/preference/PreferenceDataStore;" since="26"/>
+ <method name="getPreferenceManager()Landroid/preference/PreferenceManager;"/>
+ <method name="getSharedPreferences()Landroid/content/SharedPreferences;"/>
+ <method name="getShouldDisableView()Z"/>
+ <method name="getSummary()Ljava/lang/CharSequence;"/>
+ <method name="getTitle()Ljava/lang/CharSequence;"/>
+ <method name="getTitleRes()I" since="14"/>
+ <method name="getView(Landroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View;"/>
+ <method name="getWidgetLayoutResource()I"/>
+ <method name="hasKey()Z"/>
+ <method name="isEnabled()Z"/>
+ <method name="isIconSpaceReserved()Z" since="26"/>
+ <method name="isPersistent()Z"/>
+ <method name="isRecycleEnabled()Z" since="26"/>
+ <method name="isSelectable()Z"/>
+ <method name="isSingleLineTitle()Z" since="26"/>
+ <method name="notifyChanged()V"/>
+ <method name="notifyDependencyChange(Z)V"/>
+ <method name="notifyHierarchyChanged()V"/>
+ <method name="onAttachedToActivity()V"/>
+ <method name="onAttachedToHierarchy(Landroid/preference/PreferenceManager;)V"/>
+ <method name="onBindView(Landroid/view/View;)V"/>
+ <method name="onClick()V"/>
+ <method name="onCreateView(Landroid/view/ViewGroup;)Landroid/view/View;"/>
+ <method name="onDependencyChanged(Landroid/preference/Preference;Z)V"/>
+ <method name="onGetDefaultValue(Landroid/content/res/TypedArray;I)Ljava/lang/Object;"/>
+ <method name="onParentChanged(Landroid/preference/Preference;Z)V" since="19"/>
+ <method name="onPrepareForRemoval()V"/>
+ <method name="onRestoreInstanceState(Landroid/os/Parcelable;)V"/>
+ <method name="onSaveInstanceState()Landroid/os/Parcelable;"/>
+ <method name="onSetInitialValue(ZLjava/lang/Object;)V"/>
+ <method name="peekExtras()Landroid/os/Bundle;" since="11"/>
+ <method name="persistBoolean(Z)Z"/>
+ <method name="persistFloat(F)Z"/>
+ <method name="persistInt(I)Z"/>
+ <method name="persistLong(J)Z"/>
+ <method name="persistString(Ljava/lang/String;)Z"/>
+ <method name="persistStringSet(Ljava/util/Set;)Z" since="24"/>
+ <method name="restoreHierarchyState(Landroid/os/Bundle;)V"/>
+ <method name="saveHierarchyState(Landroid/os/Bundle;)V"/>
+ <method name="setDefaultValue(Ljava/lang/Object;)V"/>
+ <method name="setDependency(Ljava/lang/String;)V"/>
+ <method name="setEnabled(Z)V"/>
+ <method name="setFragment(Ljava/lang/String;)V" since="11"/>
+ <method name="setIcon(I)V" since="11"/>
+ <method name="setIcon(Landroid/graphics/drawable/Drawable;)V" since="11"/>
+ <method name="setIconSpaceReserved(Z)V" since="26"/>
+ <method name="setIntent(Landroid/content/Intent;)V"/>
+ <method name="setKey(Ljava/lang/String;)V"/>
+ <method name="setLayoutResource(I)V"/>
+ <method name="setOnPreferenceChangeListener(Landroid/preference/Preference$OnPreferenceChangeListener;)V"/>
+ <method name="setOnPreferenceClickListener(Landroid/preference/Preference$OnPreferenceClickListener;)V"/>
+ <method name="setOrder(I)V"/>
+ <method name="setPersistent(Z)V"/>
+ <method name="setPreferenceDataStore(Landroid/preference/PreferenceDataStore;)V" since="26"/>
+ <method name="setRecycleEnabled(Z)V" since="26"/>
+ <method name="setSelectable(Z)V"/>
+ <method name="setShouldDisableView(Z)V"/>
+ <method name="setSingleLineTitle(Z)V" since="26"/>
+ <method name="setSummary(I)V"/>
+ <method name="setSummary(Ljava/lang/CharSequence;)V"/>
+ <method name="setTitle(I)V"/>
+ <method name="setTitle(Ljava/lang/CharSequence;)V"/>
+ <method name="setWidgetLayoutResource(I)V"/>
+ <method name="shouldCommit()Z"/>
+ <method name="shouldDisableDependents()Z"/>
+ <method name="shouldPersist()Z"/>
+ <field name="DEFAULT_ORDER"/>
+ </class>
+ <class name="android/preference/Preference$BaseSavedState" since="1">
+ <extends name="android/view/AbsSavedState"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="&lt;init>(Landroid/os/Parcelable;)V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/preference/Preference$OnPreferenceChangeListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onPreferenceChange(Landroid/preference/Preference;Ljava/lang/Object;)Z"/>
+ </class>
+ <class name="android/preference/Preference$OnPreferenceClickListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onPreferenceClick(Landroid/preference/Preference;)Z"/>
+ </class>
+ <class name="android/preference/PreferenceActivity" since="1">
+ <extends name="android/app/ListActivity"/>
+ <implements name="android/preference/PreferenceFragment$OnPreferenceStartFragmentCallback" since="11"/>
+ <method name="&lt;init>()V"/>
+ <method name="addPreferencesFromIntent(Landroid/content/Intent;)V" deprecated="16"/>
+ <method name="addPreferencesFromResource(I)V" deprecated="16"/>
+ <method name="findPreference(Ljava/lang/CharSequence;)Landroid/preference/Preference;" deprecated="16"/>
+ <method name="finishPreferencePanel(Landroid/app/Fragment;ILandroid/content/Intent;)V" since="11"/>
+ <method name="getPreferenceManager()Landroid/preference/PreferenceManager;" deprecated="16"/>
+ <method name="getPreferenceScreen()Landroid/preference/PreferenceScreen;" deprecated="16"/>
+ <method name="hasHeaders()Z" since="11"/>
+ <method name="invalidateHeaders()V" since="11"/>
+ <method name="isMultiPane()Z" since="11"/>
+ <method name="isValidFragment(Ljava/lang/String;)Z" since="19"/>
+ <method name="loadHeadersFromResource(ILjava/util/List;)V" since="11"/>
+ <method name="onBuildHeaders(Ljava/util/List;)V" since="11"/>
+ <method name="onBuildStartFragmentIntent(Ljava/lang/String;Landroid/os/Bundle;II)Landroid/content/Intent;" since="14"/>
+ <method name="onGetInitialHeader()Landroid/preference/PreferenceActivity$Header;" since="11"/>
+ <method name="onGetNewHeader()Landroid/preference/PreferenceActivity$Header;" since="11"/>
+ <method name="onHeaderClick(Landroid/preference/PreferenceActivity$Header;I)V" since="11"/>
+ <method name="onIsHidingHeaders()Z" since="11"/>
+ <method name="onIsMultiPane()Z" since="11"/>
+ <method name="onPreferenceTreeClick(Landroid/preference/PreferenceScreen;Landroid/preference/Preference;)Z" deprecated="16"/>
+ <method name="setListFooter(Landroid/view/View;)V" since="11"/>
+ <method name="setParentTitle(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/view/View$OnClickListener;)V" since="11"/>
+ <method name="setPreferenceScreen(Landroid/preference/PreferenceScreen;)V" deprecated="16"/>
+ <method name="showBreadCrumbs(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)V" since="11"/>
+ <method name="startPreferenceFragment(Landroid/app/Fragment;Z)V" since="11"/>
+ <method name="startPreferencePanel(Ljava/lang/String;Landroid/os/Bundle;ILjava/lang/CharSequence;Landroid/app/Fragment;I)V" since="11"/>
+ <method name="startWithFragment(Ljava/lang/String;Landroid/os/Bundle;Landroid/app/Fragment;I)V" since="11"/>
+ <method name="startWithFragment(Ljava/lang/String;Landroid/os/Bundle;Landroid/app/Fragment;III)V" since="14"/>
+ <method name="switchToHeader(Landroid/preference/PreferenceActivity$Header;)V" since="11"/>
+ <method name="switchToHeader(Ljava/lang/String;Landroid/os/Bundle;)V" since="11"/>
+ <field name="EXTRA_NO_HEADERS" since="11"/>
+ <field name="EXTRA_SHOW_FRAGMENT" since="11"/>
+ <field name="EXTRA_SHOW_FRAGMENT_ARGUMENTS" since="11"/>
+ <field name="EXTRA_SHOW_FRAGMENT_SHORT_TITLE" since="14"/>
+ <field name="EXTRA_SHOW_FRAGMENT_TITLE" since="14"/>
+ <field name="HEADER_ID_UNDEFINED" since="11"/>
+ </class>
+ <class name="android/preference/PreferenceActivity$Header" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getBreadCrumbShortTitle(Landroid/content/res/Resources;)Ljava/lang/CharSequence;"/>
+ <method name="getBreadCrumbTitle(Landroid/content/res/Resources;)Ljava/lang/CharSequence;"/>
+ <method name="getSummary(Landroid/content/res/Resources;)Ljava/lang/CharSequence;"/>
+ <method name="getTitle(Landroid/content/res/Resources;)Ljava/lang/CharSequence;"/>
+ <method name="readFromParcel(Landroid/os/Parcel;)V"/>
+ <field name="CREATOR"/>
+ <field name="breadCrumbShortTitle"/>
+ <field name="breadCrumbShortTitleRes"/>
+ <field name="breadCrumbTitle"/>
+ <field name="breadCrumbTitleRes"/>
+ <field name="extras"/>
+ <field name="fragment"/>
+ <field name="fragmentArguments"/>
+ <field name="iconRes"/>
+ <field name="id"/>
+ <field name="intent"/>
+ <field name="summary"/>
+ <field name="summaryRes"/>
+ <field name="title"/>
+ <field name="titleRes"/>
+ </class>
+ <class name="android/preference/PreferenceCategory" since="1">
+ <extends name="android/preference/PreferenceGroup"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ </class>
+ <class name="android/preference/PreferenceDataStore" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="getBoolean(Ljava/lang/String;Z)Z"/>
+ <method name="getFloat(Ljava/lang/String;F)F"/>
+ <method name="getInt(Ljava/lang/String;I)I"/>
+ <method name="getLong(Ljava/lang/String;J)J"/>
+ <method name="getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getStringSet(Ljava/lang/String;Ljava/util/Set;)Ljava/util/Set;"/>
+ <method name="putBoolean(Ljava/lang/String;Z)V"/>
+ <method name="putFloat(Ljava/lang/String;F)V"/>
+ <method name="putInt(Ljava/lang/String;I)V"/>
+ <method name="putLong(Ljava/lang/String;J)V"/>
+ <method name="putString(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="putStringSet(Ljava/lang/String;Ljava/util/Set;)V"/>
+ </class>
+ <class name="android/preference/PreferenceFragment" since="11">
+ <extends name="android/app/Fragment"/>
+ <method name="&lt;init>()V"/>
+ <method name="addPreferencesFromIntent(Landroid/content/Intent;)V"/>
+ <method name="addPreferencesFromResource(I)V"/>
+ <method name="findPreference(Ljava/lang/CharSequence;)Landroid/preference/Preference;"/>
+ <method name="getPreferenceManager()Landroid/preference/PreferenceManager;"/>
+ <method name="getPreferenceScreen()Landroid/preference/PreferenceScreen;"/>
+ <method name="onPreferenceTreeClick(Landroid/preference/PreferenceScreen;Landroid/preference/Preference;)Z"/>
+ <method name="setPreferenceScreen(Landroid/preference/PreferenceScreen;)V"/>
+ </class>
+ <class name="android/preference/PreferenceFragment$OnPreferenceStartFragmentCallback" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="onPreferenceStartFragment(Landroid/preference/PreferenceFragment;Landroid/preference/Preference;)Z"/>
+ </class>
+ <class name="android/preference/PreferenceGroup" since="1">
+ <extends name="android/preference/Preference"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="addItemFromInflater(Landroid/preference/Preference;)V"/>
+ <method name="addPreference(Landroid/preference/Preference;)Z"/>
+ <method name="dispatchRestoreInstanceState(Landroid/os/Bundle;)V"/>
+ <method name="dispatchSaveInstanceState(Landroid/os/Bundle;)V"/>
+ <method name="findPreference(Ljava/lang/CharSequence;)Landroid/preference/Preference;"/>
+ <method name="getPreference(I)Landroid/preference/Preference;"/>
+ <method name="getPreferenceCount()I"/>
+ <method name="isOnSameScreenAsChildren()Z"/>
+ <method name="isOrderingAsAdded()Z"/>
+ <method name="onPrepareAddPreference(Landroid/preference/Preference;)Z"/>
+ <method name="removeAll()V"/>
+ <method name="removePreference(Landroid/preference/Preference;)Z"/>
+ <method name="setOrderingAsAdded(Z)V"/>
+ </class>
+ <class name="android/preference/PreferenceManager" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="createPreferenceScreen(Landroid/content/Context;)Landroid/preference/PreferenceScreen;"/>
+ <method name="findPreference(Ljava/lang/CharSequence;)Landroid/preference/Preference;"/>
+ <method name="getDefaultSharedPreferences(Landroid/content/Context;)Landroid/content/SharedPreferences;"/>
+ <method name="getDefaultSharedPreferencesName(Landroid/content/Context;)Ljava/lang/String;" since="24"/>
+ <method name="getPreferenceDataStore()Landroid/preference/PreferenceDataStore;" since="26"/>
+ <method name="getSharedPreferences()Landroid/content/SharedPreferences;"/>
+ <method name="getSharedPreferencesMode()I"/>
+ <method name="getSharedPreferencesName()Ljava/lang/String;"/>
+ <method name="isStorageDefault()Z" since="24"/>
+ <method name="isStorageDeviceProtected()Z" since="24"/>
+ <method name="setDefaultValues(Landroid/content/Context;IZ)V"/>
+ <method name="setDefaultValues(Landroid/content/Context;Ljava/lang/String;IIZ)V"/>
+ <method name="setPreferenceDataStore(Landroid/preference/PreferenceDataStore;)V" since="26"/>
+ <method name="setSharedPreferencesMode(I)V"/>
+ <method name="setSharedPreferencesName(Ljava/lang/String;)V"/>
+ <method name="setStorageDefault()V" since="24"/>
+ <method name="setStorageDeviceProtected()V" since="24"/>
+ <field name="KEY_HAS_SET_DEFAULT_VALUES"/>
+ <field name="METADATA_KEY_PREFERENCES"/>
+ </class>
+ <class name="android/preference/PreferenceManager$OnActivityDestroyListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onActivityDestroy()V"/>
+ </class>
+ <class name="android/preference/PreferenceManager$OnActivityResultListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onActivityResult(IILandroid/content/Intent;)Z"/>
+ </class>
+ <class name="android/preference/PreferenceManager$OnActivityStopListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onActivityStop()V"/>
+ </class>
+ <class name="android/preference/PreferenceScreen" since="1">
+ <extends name="android/preference/PreferenceGroup"/>
+ <implements name="android/content/DialogInterface$OnDismissListener"/>
+ <implements name="android/widget/AdapterView$OnItemClickListener"/>
+ <method name="&lt;init>()V"/>
+ <method name="bind(Landroid/widget/ListView;)V"/>
+ <method name="getDialog()Landroid/app/Dialog;"/>
+ <method name="getRootAdapter()Landroid/widget/ListAdapter;"/>
+ <method name="onCreateRootAdapter()Landroid/widget/ListAdapter;"/>
+ </class>
+ <class name="android/preference/RingtonePreference" since="1">
+ <extends name="android/preference/Preference"/>
+ <implements name="android/preference/PreferenceManager$OnActivityResultListener"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getRingtoneType()I"/>
+ <method name="getShowDefault()Z"/>
+ <method name="getShowSilent()Z"/>
+ <method name="onPrepareRingtonePickerIntent(Landroid/content/Intent;)V"/>
+ <method name="onRestoreRingtone()Landroid/net/Uri;"/>
+ <method name="onSaveRingtone(Landroid/net/Uri;)V"/>
+ <method name="setRingtoneType(I)V"/>
+ <method name="setShowDefault(Z)V"/>
+ <method name="setShowSilent(Z)V"/>
+ </class>
+ <class name="android/preference/SwitchPreference" since="14">
+ <extends name="android/preference/TwoStatePreference"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getSwitchTextOff()Ljava/lang/CharSequence;"/>
+ <method name="getSwitchTextOn()Ljava/lang/CharSequence;"/>
+ <method name="setSwitchTextOff(I)V"/>
+ <method name="setSwitchTextOff(Ljava/lang/CharSequence;)V"/>
+ <method name="setSwitchTextOn(I)V"/>
+ <method name="setSwitchTextOn(Ljava/lang/CharSequence;)V"/>
+ </class>
+ <class name="android/preference/TwoStatePreference" since="14">
+ <extends name="android/preference/Preference"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getDisableDependentsState()Z"/>
+ <method name="getSummaryOff()Ljava/lang/CharSequence;"/>
+ <method name="getSummaryOn()Ljava/lang/CharSequence;"/>
+ <method name="isChecked()Z"/>
+ <method name="setChecked(Z)V"/>
+ <method name="setDisableDependentsState(Z)V"/>
+ <method name="setSummaryOff(I)V"/>
+ <method name="setSummaryOff(Ljava/lang/CharSequence;)V"/>
+ <method name="setSummaryOn(I)V"/>
+ <method name="setSummaryOn(Ljava/lang/CharSequence;)V"/>
+ </class>
+ <class name="android/print/PageRange" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="getEnd()I"/>
+ <method name="getStart()I"/>
+ <field name="ALL_PAGES"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/print/PrintAttributes" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getColorMode()I"/>
+ <method name="getDuplexMode()I" since="23"/>
+ <method name="getMediaSize()Landroid/print/PrintAttributes$MediaSize;"/>
+ <method name="getMinMargins()Landroid/print/PrintAttributes$Margins;"/>
+ <method name="getResolution()Landroid/print/PrintAttributes$Resolution;"/>
+ <field name="COLOR_MODE_COLOR"/>
+ <field name="COLOR_MODE_MONOCHROME"/>
+ <field name="CREATOR"/>
+ <field name="DUPLEX_MODE_LONG_EDGE" since="23"/>
+ <field name="DUPLEX_MODE_NONE" since="23"/>
+ <field name="DUPLEX_MODE_SHORT_EDGE" since="23"/>
+ </class>
+ <class name="android/print/PrintAttributes$Builder" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="build()Landroid/print/PrintAttributes;"/>
+ <method name="setColorMode(I)Landroid/print/PrintAttributes$Builder;"/>
+ <method name="setDuplexMode(I)Landroid/print/PrintAttributes$Builder;" since="23"/>
+ <method name="setMediaSize(Landroid/print/PrintAttributes$MediaSize;)Landroid/print/PrintAttributes$Builder;"/>
+ <method name="setMinMargins(Landroid/print/PrintAttributes$Margins;)Landroid/print/PrintAttributes$Builder;"/>
+ <method name="setResolution(Landroid/print/PrintAttributes$Resolution;)Landroid/print/PrintAttributes$Builder;"/>
+ </class>
+ <class name="android/print/PrintAttributes$Margins" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(IIII)V"/>
+ <method name="getBottomMils()I"/>
+ <method name="getLeftMils()I"/>
+ <method name="getRightMils()I"/>
+ <method name="getTopMils()I"/>
+ <field name="NO_MARGINS"/>
+ </class>
+ <class name="android/print/PrintAttributes$MediaSize" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;II)V"/>
+ <method name="asLandscape()Landroid/print/PrintAttributes$MediaSize;"/>
+ <method name="asPortrait()Landroid/print/PrintAttributes$MediaSize;"/>
+ <method name="getHeightMils()I"/>
+ <method name="getId()Ljava/lang/String;"/>
+ <method name="getLabel(Landroid/content/pm/PackageManager;)Ljava/lang/String;"/>
+ <method name="getWidthMils()I"/>
+ <method name="isPortrait()Z"/>
+ <field name="ISO_A0"/>
+ <field name="ISO_A1"/>
+ <field name="ISO_A10"/>
+ <field name="ISO_A2"/>
+ <field name="ISO_A3"/>
+ <field name="ISO_A4"/>
+ <field name="ISO_A5"/>
+ <field name="ISO_A6"/>
+ <field name="ISO_A7"/>
+ <field name="ISO_A8"/>
+ <field name="ISO_A9"/>
+ <field name="ISO_B0"/>
+ <field name="ISO_B1"/>
+ <field name="ISO_B10"/>
+ <field name="ISO_B2"/>
+ <field name="ISO_B3"/>
+ <field name="ISO_B4"/>
+ <field name="ISO_B5"/>
+ <field name="ISO_B6"/>
+ <field name="ISO_B7"/>
+ <field name="ISO_B8"/>
+ <field name="ISO_B9"/>
+ <field name="ISO_C0"/>
+ <field name="ISO_C1"/>
+ <field name="ISO_C10"/>
+ <field name="ISO_C2"/>
+ <field name="ISO_C3"/>
+ <field name="ISO_C4"/>
+ <field name="ISO_C5"/>
+ <field name="ISO_C6"/>
+ <field name="ISO_C7"/>
+ <field name="ISO_C8"/>
+ <field name="ISO_C9"/>
+ <field name="JIS_B0"/>
+ <field name="JIS_B1"/>
+ <field name="JIS_B10"/>
+ <field name="JIS_B2"/>
+ <field name="JIS_B3"/>
+ <field name="JIS_B4"/>
+ <field name="JIS_B5"/>
+ <field name="JIS_B6"/>
+ <field name="JIS_B7"/>
+ <field name="JIS_B8"/>
+ <field name="JIS_B9"/>
+ <field name="JIS_EXEC"/>
+ <field name="JPN_CHOU2"/>
+ <field name="JPN_CHOU3"/>
+ <field name="JPN_CHOU4"/>
+ <field name="JPN_HAGAKI"/>
+ <field name="JPN_KAHU"/>
+ <field name="JPN_KAKU2"/>
+ <field name="JPN_OUFUKU"/>
+ <field name="JPN_YOU4"/>
+ <field name="NA_FOOLSCAP"/>
+ <field name="NA_GOVT_LETTER"/>
+ <field name="NA_INDEX_3X5"/>
+ <field name="NA_INDEX_4X6"/>
+ <field name="NA_INDEX_5X8"/>
+ <field name="NA_JUNIOR_LEGAL"/>
+ <field name="NA_LEDGER"/>
+ <field name="NA_LEGAL"/>
+ <field name="NA_LETTER"/>
+ <field name="NA_MONARCH"/>
+ <field name="NA_QUARTO"/>
+ <field name="NA_TABLOID"/>
+ <field name="OM_DAI_PA_KAI"/>
+ <field name="OM_JUURO_KU_KAI"/>
+ <field name="OM_PA_KAI"/>
+ <field name="PRC_1"/>
+ <field name="PRC_10"/>
+ <field name="PRC_16K"/>
+ <field name="PRC_2"/>
+ <field name="PRC_3"/>
+ <field name="PRC_4"/>
+ <field name="PRC_5"/>
+ <field name="PRC_6"/>
+ <field name="PRC_7"/>
+ <field name="PRC_8"/>
+ <field name="PRC_9"/>
+ <field name="ROC_16K"/>
+ <field name="ROC_8K"/>
+ <field name="UNKNOWN_LANDSCAPE"/>
+ <field name="UNKNOWN_PORTRAIT"/>
+ </class>
+ <class name="android/print/PrintAttributes$Resolution" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;II)V"/>
+ <method name="getHorizontalDpi()I"/>
+ <method name="getId()Ljava/lang/String;"/>
+ <method name="getLabel()Ljava/lang/String;"/>
+ <method name="getVerticalDpi()I"/>
+ </class>
+ <class name="android/print/PrintDocumentAdapter" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onFinish()V"/>
+ <method name="onLayout(Landroid/print/PrintAttributes;Landroid/print/PrintAttributes;Landroid/os/CancellationSignal;Landroid/print/PrintDocumentAdapter$LayoutResultCallback;Landroid/os/Bundle;)V"/>
+ <method name="onStart()V"/>
+ <method name="onWrite([Landroid/print/PageRange;Landroid/os/ParcelFileDescriptor;Landroid/os/CancellationSignal;Landroid/print/PrintDocumentAdapter$WriteResultCallback;)V"/>
+ <field name="EXTRA_PRINT_PREVIEW"/>
+ </class>
+ <class name="android/print/PrintDocumentAdapter$LayoutResultCallback" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onLayoutCancelled()V"/>
+ <method name="onLayoutFailed(Ljava/lang/CharSequence;)V"/>
+ <method name="onLayoutFinished(Landroid/print/PrintDocumentInfo;Z)V"/>
+ </class>
+ <class name="android/print/PrintDocumentAdapter$WriteResultCallback" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onWriteCancelled()V"/>
+ <method name="onWriteFailed(Ljava/lang/CharSequence;)V"/>
+ <method name="onWriteFinished([Landroid/print/PageRange;)V"/>
+ </class>
+ <class name="android/print/PrintDocumentInfo" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getContentType()I"/>
+ <method name="getDataSize()J"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getPageCount()I"/>
+ <field name="CONTENT_TYPE_DOCUMENT"/>
+ <field name="CONTENT_TYPE_PHOTO"/>
+ <field name="CONTENT_TYPE_UNKNOWN"/>
+ <field name="CREATOR"/>
+ <field name="PAGE_COUNT_UNKNOWN"/>
+ </class>
+ <class name="android/print/PrintDocumentInfo$Builder" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="build()Landroid/print/PrintDocumentInfo;"/>
+ <method name="setContentType(I)Landroid/print/PrintDocumentInfo$Builder;"/>
+ <method name="setPageCount(I)Landroid/print/PrintDocumentInfo$Builder;"/>
+ </class>
+ <class name="android/print/PrintJob" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="cancel()V"/>
+ <method name="getId()Landroid/print/PrintJobId;"/>
+ <method name="getInfo()Landroid/print/PrintJobInfo;"/>
+ <method name="isBlocked()Z"/>
+ <method name="isCancelled()Z"/>
+ <method name="isCompleted()Z"/>
+ <method name="isFailed()Z"/>
+ <method name="isQueued()Z"/>
+ <method name="isStarted()Z"/>
+ <method name="restart()V"/>
+ </class>
+ <class name="android/print/PrintJobId" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/print/PrintJobInfo" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAdvancedIntOption(Ljava/lang/String;)I" since="26"/>
+ <method name="getAdvancedStringOption(Ljava/lang/String;)Ljava/lang/String;" since="26"/>
+ <method name="getAttributes()Landroid/print/PrintAttributes;"/>
+ <method name="getCopies()I"/>
+ <method name="getCreationTime()J"/>
+ <method name="getId()Landroid/print/PrintJobId;"/>
+ <method name="getLabel()Ljava/lang/String;"/>
+ <method name="getPages()[Landroid/print/PageRange;"/>
+ <method name="getPrinterId()Landroid/print/PrinterId;"/>
+ <method name="getState()I"/>
+ <method name="hasAdvancedOption(Ljava/lang/String;)Z" since="26"/>
+ <field name="CREATOR"/>
+ <field name="STATE_BLOCKED"/>
+ <field name="STATE_CANCELED"/>
+ <field name="STATE_COMPLETED"/>
+ <field name="STATE_CREATED"/>
+ <field name="STATE_FAILED"/>
+ <field name="STATE_QUEUED"/>
+ <field name="STATE_STARTED"/>
+ </class>
+ <class name="android/print/PrintJobInfo$Builder" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/print/PrintJobInfo;)V"/>
+ <method name="build()Landroid/print/PrintJobInfo;"/>
+ <method name="putAdvancedOption(Ljava/lang/String;I)V"/>
+ <method name="putAdvancedOption(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="setAttributes(Landroid/print/PrintAttributes;)V"/>
+ <method name="setCopies(I)V"/>
+ <method name="setPages([Landroid/print/PageRange;)V"/>
+ </class>
+ <class name="android/print/PrintManager" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getPrintJobs()Ljava/util/List;"/>
+ <method name="print(Ljava/lang/String;Landroid/print/PrintDocumentAdapter;Landroid/print/PrintAttributes;)Landroid/print/PrintJob;"/>
+ </class>
+ <class name="android/print/PrinterCapabilitiesInfo" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getColorModes()I"/>
+ <method name="getDefaults()Landroid/print/PrintAttributes;"/>
+ <method name="getDuplexModes()I" since="23"/>
+ <method name="getMediaSizes()Ljava/util/List;"/>
+ <method name="getMinMargins()Landroid/print/PrintAttributes$Margins;"/>
+ <method name="getResolutions()Ljava/util/List;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/print/PrinterCapabilitiesInfo$Builder" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/print/PrinterId;)V"/>
+ <method name="addMediaSize(Landroid/print/PrintAttributes$MediaSize;Z)Landroid/print/PrinterCapabilitiesInfo$Builder;"/>
+ <method name="addResolution(Landroid/print/PrintAttributes$Resolution;Z)Landroid/print/PrinterCapabilitiesInfo$Builder;"/>
+ <method name="build()Landroid/print/PrinterCapabilitiesInfo;"/>
+ <method name="setColorModes(II)Landroid/print/PrinterCapabilitiesInfo$Builder;"/>
+ <method name="setDuplexModes(II)Landroid/print/PrinterCapabilitiesInfo$Builder;" since="23"/>
+ <method name="setMinMargins(Landroid/print/PrintAttributes$Margins;)Landroid/print/PrinterCapabilitiesInfo$Builder;"/>
+ </class>
+ <class name="android/print/PrinterId" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getLocalId()Ljava/lang/String;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/print/PrinterInfo" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCapabilities()Landroid/print/PrinterCapabilitiesInfo;"/>
+ <method name="getDescription()Ljava/lang/String;"/>
+ <method name="getId()Landroid/print/PrinterId;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getStatus()I"/>
+ <field name="CREATOR"/>
+ <field name="STATUS_BUSY"/>
+ <field name="STATUS_IDLE"/>
+ <field name="STATUS_UNAVAILABLE"/>
+ </class>
+ <class name="android/print/PrinterInfo$Builder" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/print/PrinterId;Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Landroid/print/PrinterInfo;)V"/>
+ <method name="build()Landroid/print/PrinterInfo;"/>
+ <method name="setCapabilities(Landroid/print/PrinterCapabilitiesInfo;)Landroid/print/PrinterInfo$Builder;"/>
+ <method name="setDescription(Ljava/lang/String;)Landroid/print/PrinterInfo$Builder;"/>
+ <method name="setHasCustomPrinterIcon(Z)Landroid/print/PrinterInfo$Builder;" since="24"/>
+ <method name="setIconResourceId(I)Landroid/print/PrinterInfo$Builder;" since="24"/>
+ <method name="setInfoIntent(Landroid/app/PendingIntent;)Landroid/print/PrinterInfo$Builder;" since="24"/>
+ <method name="setName(Ljava/lang/String;)Landroid/print/PrinterInfo$Builder;"/>
+ <method name="setStatus(I)Landroid/print/PrinterInfo$Builder;"/>
+ </class>
+ <class name="android/print/pdf/PrintedPdfDocument" since="19">
+ <extends name="android/graphics/pdf/PdfDocument"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/print/PrintAttributes;)V"/>
+ <method name="getPageContentRect()Landroid/graphics/Rect;"/>
+ <method name="getPageHeight()I"/>
+ <method name="getPageWidth()I"/>
+ <method name="startPage(I)Landroid/graphics/pdf/PdfDocument$Page;"/>
+ </class>
+ <class name="android/printservice/CustomPrinterIconCallback" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onCustomPrinterIconLoaded(Landroid/graphics/drawable/Icon;)Z"/>
+ </class>
+ <class name="android/printservice/PrintDocument" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getData()Landroid/os/ParcelFileDescriptor;"/>
+ <method name="getInfo()Landroid/print/PrintDocumentInfo;"/>
+ </class>
+ <class name="android/printservice/PrintJob" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="block(Ljava/lang/String;)Z"/>
+ <method name="cancel()Z"/>
+ <method name="complete()Z"/>
+ <method name="fail(Ljava/lang/String;)Z"/>
+ <method name="getAdvancedIntOption(Ljava/lang/String;)I"/>
+ <method name="getAdvancedStringOption(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getDocument()Landroid/printservice/PrintDocument;"/>
+ <method name="getId()Landroid/print/PrintJobId;"/>
+ <method name="getInfo()Landroid/print/PrintJobInfo;"/>
+ <method name="getTag()Ljava/lang/String;"/>
+ <method name="hasAdvancedOption(Ljava/lang/String;)Z"/>
+ <method name="isBlocked()Z"/>
+ <method name="isCancelled()Z"/>
+ <method name="isCompleted()Z"/>
+ <method name="isFailed()Z"/>
+ <method name="isQueued()Z"/>
+ <method name="isStarted()Z"/>
+ <method name="setProgress(F)V" since="24"/>
+ <method name="setStatus(I)V" since="24"/>
+ <method name="setStatus(Ljava/lang/CharSequence;)V" since="24"/>
+ <method name="setTag(Ljava/lang/String;)Z"/>
+ <method name="start()Z"/>
+ </class>
+ <class name="android/printservice/PrintService" since="19">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="generatePrinterId(Ljava/lang/String;)Landroid/print/PrinterId;"/>
+ <method name="getActivePrintJobs()Ljava/util/List;"/>
+ <method name="onConnected()V"/>
+ <method name="onCreatePrinterDiscoverySession()Landroid/printservice/PrinterDiscoverySession;"/>
+ <method name="onDisconnected()V"/>
+ <method name="onPrintJobQueued(Landroid/printservice/PrintJob;)V"/>
+ <method name="onRequestCancelPrintJob(Landroid/printservice/PrintJob;)V"/>
+ <field name="EXTRA_CAN_SELECT_PRINTER" since="26"/>
+ <field name="EXTRA_PRINTER_INFO" since="21"/>
+ <field name="EXTRA_PRINT_DOCUMENT_INFO" since="23"/>
+ <field name="EXTRA_PRINT_JOB_INFO"/>
+ <field name="EXTRA_SELECT_PRINTER" since="26"/>
+ <field name="SERVICE_INTERFACE"/>
+ <field name="SERVICE_META_DATA"/>
+ </class>
+ <class name="android/printservice/PrinterDiscoverySession" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addPrinters(Ljava/util/List;)V"/>
+ <method name="getPrinters()Ljava/util/List;"/>
+ <method name="getTrackedPrinters()Ljava/util/List;"/>
+ <method name="isDestroyed()Z"/>
+ <method name="isPrinterDiscoveryStarted()Z"/>
+ <method name="onDestroy()V"/>
+ <method name="onRequestCustomPrinterIcon(Landroid/print/PrinterId;Landroid/os/CancellationSignal;Landroid/printservice/CustomPrinterIconCallback;)V" since="24"/>
+ <method name="onStartPrinterDiscovery(Ljava/util/List;)V"/>
+ <method name="onStartPrinterStateTracking(Landroid/print/PrinterId;)V"/>
+ <method name="onStopPrinterDiscovery()V"/>
+ <method name="onStopPrinterStateTracking(Landroid/print/PrinterId;)V"/>
+ <method name="onValidatePrinters(Ljava/util/List;)V"/>
+ <method name="removePrinters(Ljava/util/List;)V"/>
+ </class>
+ <class name="android/provider/AlarmClock" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="ACTION_DISMISS_ALARM" since="23"/>
+ <field name="ACTION_SET_ALARM"/>
+ <field name="ACTION_SET_TIMER" since="19"/>
+ <field name="ACTION_SHOW_ALARMS" since="19"/>
+ <field name="ACTION_SHOW_TIMERS" since="26"/>
+ <field name="ACTION_SNOOZE_ALARM" since="23"/>
+ <field name="ALARM_SEARCH_MODE_ALL" since="23"/>
+ <field name="ALARM_SEARCH_MODE_LABEL" since="23"/>
+ <field name="ALARM_SEARCH_MODE_NEXT" since="23"/>
+ <field name="ALARM_SEARCH_MODE_TIME" since="23"/>
+ <field name="EXTRA_ALARM_SEARCH_MODE" since="23"/>
+ <field name="EXTRA_ALARM_SNOOZE_DURATION" since="23"/>
+ <field name="EXTRA_DAYS" since="19"/>
+ <field name="EXTRA_HOUR"/>
+ <field name="EXTRA_IS_PM" since="23"/>
+ <field name="EXTRA_LENGTH" since="19"/>
+ <field name="EXTRA_MESSAGE"/>
+ <field name="EXTRA_MINUTES"/>
+ <field name="EXTRA_RINGTONE" since="19"/>
+ <field name="EXTRA_SKIP_UI" since="11"/>
+ <field name="EXTRA_VIBRATE" since="19"/>
+ <field name="VALUE_RINGTONE_SILENT" since="19"/>
+ </class>
+ <class name="android/provider/BaseColumns" since="1">
+ <extends name="java/lang/Object"/>
+ <field name="_COUNT"/>
+ <field name="_ID"/>
+ </class>
+ <class name="android/provider/BlockedNumberContract" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="canCurrentUserBlockNumbers(Landroid/content/Context;)Z"/>
+ <method name="isBlocked(Landroid/content/Context;Ljava/lang/String;)Z"/>
+ <method name="unblock(Landroid/content/Context;Ljava/lang/String;)I"/>
+ <field name="AUTHORITY"/>
+ <field name="AUTHORITY_URI"/>
+ </class>
+ <class name="android/provider/BlockedNumberContract$BlockedNumbers" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="COLUMN_E164_NUMBER"/>
+ <field name="COLUMN_ID"/>
+ <field name="COLUMN_ORIGINAL_NUMBER"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="CONTENT_URI"/>
+ </class>
+ <class name="android/provider/Browser" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addSearchUrl(Landroid/content/ContentResolver;Ljava/lang/String;)V" removed="23"/>
+ <method name="canClearHistory(Landroid/content/ContentResolver;)Z" removed="23"/>
+ <method name="clearHistory(Landroid/content/ContentResolver;)V" removed="23"/>
+ <method name="clearSearches(Landroid/content/ContentResolver;)V" removed="23"/>
+ <method name="deleteFromHistory(Landroid/content/ContentResolver;Ljava/lang/String;)V" removed="23"/>
+ <method name="deleteHistoryTimeFrame(Landroid/content/ContentResolver;JJ)V" removed="23"/>
+ <method name="getAllBookmarks(Landroid/content/ContentResolver;)Landroid/database/Cursor;" removed="23"/>
+ <method name="getAllVisitedUrls(Landroid/content/ContentResolver;)Landroid/database/Cursor;" removed="23"/>
+ <method name="requestAllIcons(Landroid/content/ContentResolver;Ljava/lang/String;Landroid/webkit/WebIconDatabase$IconListener;)V" removed="23"/>
+ <method name="saveBookmark(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)V" removed="23"/>
+ <method name="sendString(Landroid/content/Context;Ljava/lang/String;)V"/>
+ <method name="truncateHistory(Landroid/content/ContentResolver;)V" removed="23"/>
+ <method name="updateVisitedHistory(Landroid/content/ContentResolver;Ljava/lang/String;Z)V" removed="23"/>
+ <field name="BOOKMARKS_URI" removed="23"/>
+ <field name="EXTRA_APPLICATION_ID" since="3"/>
+ <field name="EXTRA_CREATE_NEW_TAB" since="12"/>
+ <field name="EXTRA_HEADERS" since="8"/>
+ <field name="HISTORY_PROJECTION" removed="23"/>
+ <field name="HISTORY_PROJECTION_BOOKMARK_INDEX" removed="23"/>
+ <field name="HISTORY_PROJECTION_DATE_INDEX" removed="23"/>
+ <field name="HISTORY_PROJECTION_FAVICON_INDEX" removed="23"/>
+ <field name="HISTORY_PROJECTION_ID_INDEX" removed="23"/>
+ <field name="HISTORY_PROJECTION_TITLE_INDEX" removed="23"/>
+ <field name="HISTORY_PROJECTION_URL_INDEX" removed="23"/>
+ <field name="HISTORY_PROJECTION_VISITS_INDEX" removed="23"/>
+ <field name="INITIAL_ZOOM_LEVEL"/>
+ <field name="SEARCHES_PROJECTION" removed="23"/>
+ <field name="SEARCHES_PROJECTION_DATE_INDEX" removed="23"/>
+ <field name="SEARCHES_PROJECTION_SEARCH_INDEX" removed="23"/>
+ <field name="SEARCHES_URI" removed="23"/>
+ <field name="TRUNCATE_HISTORY_PROJECTION" removed="23"/>
+ <field name="TRUNCATE_HISTORY_PROJECTION_ID_INDEX" removed="23"/>
+ <field name="TRUNCATE_N_OLDEST" removed="23"/>
+ </class>
+ <class name="android/provider/Browser$BookmarkColumns" since="1" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="BOOKMARK"/>
+ <field name="CREATED"/>
+ <field name="DATE"/>
+ <field name="FAVICON"/>
+ <field name="TITLE"/>
+ <field name="URL"/>
+ <field name="VISITS"/>
+ </class>
+ <class name="android/provider/Browser$SearchColumns" since="1" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="DATE"/>
+ <field name="SEARCH"/>
+ <field name="URL" deprecated="16"/>
+ </class>
+ <class name="android/provider/CalendarContract" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="ACCOUNT_TYPE_LOCAL"/>
+ <field name="ACTION_EVENT_REMINDER"/>
+ <field name="ACTION_HANDLE_CUSTOM_EVENT" since="16"/>
+ <field name="AUTHORITY"/>
+ <field name="CALLER_IS_SYNCADAPTER"/>
+ <field name="CONTENT_URI"/>
+ <field name="EXTRA_CUSTOM_APP_URI" since="16"/>
+ <field name="EXTRA_EVENT_ALL_DAY"/>
+ <field name="EXTRA_EVENT_BEGIN_TIME"/>
+ <field name="EXTRA_EVENT_END_TIME"/>
+ </class>
+ <class name="android/provider/CalendarContract$Attendees" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/CalendarContract$AttendeesColumns"/>
+ <implements name="android/provider/CalendarContract$EventsColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="query(Landroid/content/ContentResolver;J[Ljava/lang/String;)Landroid/database/Cursor;"/>
+ <field name="CONTENT_URI"/>
+ </class>
+ <class name="android/provider/CalendarContract$AttendeesColumns" since="14">
+ <extends name="java/lang/Object"/>
+ <field name="ATTENDEE_EMAIL"/>
+ <field name="ATTENDEE_IDENTITY" since="16"/>
+ <field name="ATTENDEE_ID_NAMESPACE" since="16"/>
+ <field name="ATTENDEE_NAME"/>
+ <field name="ATTENDEE_RELATIONSHIP"/>
+ <field name="ATTENDEE_STATUS"/>
+ <field name="ATTENDEE_STATUS_ACCEPTED"/>
+ <field name="ATTENDEE_STATUS_DECLINED"/>
+ <field name="ATTENDEE_STATUS_INVITED"/>
+ <field name="ATTENDEE_STATUS_NONE"/>
+ <field name="ATTENDEE_STATUS_TENTATIVE"/>
+ <field name="ATTENDEE_TYPE"/>
+ <field name="EVENT_ID"/>
+ <field name="RELATIONSHIP_ATTENDEE"/>
+ <field name="RELATIONSHIP_NONE"/>
+ <field name="RELATIONSHIP_ORGANIZER"/>
+ <field name="RELATIONSHIP_PERFORMER"/>
+ <field name="RELATIONSHIP_SPEAKER"/>
+ <field name="TYPE_NONE"/>
+ <field name="TYPE_OPTIONAL"/>
+ <field name="TYPE_REQUIRED"/>
+ <field name="TYPE_RESOURCE" since="15"/>
+ </class>
+ <class name="android/provider/CalendarContract$CalendarAlerts" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/CalendarContract$CalendarAlertsColumns"/>
+ <implements name="android/provider/CalendarContract$CalendarColumns"/>
+ <implements name="android/provider/CalendarContract$EventsColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_URI"/>
+ <field name="CONTENT_URI_BY_INSTANCE"/>
+ </class>
+ <class name="android/provider/CalendarContract$CalendarAlertsColumns" since="14">
+ <extends name="java/lang/Object"/>
+ <field name="ALARM_TIME"/>
+ <field name="BEGIN"/>
+ <field name="CREATION_TIME"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ <field name="END"/>
+ <field name="EVENT_ID"/>
+ <field name="MINUTES"/>
+ <field name="NOTIFY_TIME"/>
+ <field name="RECEIVED_TIME"/>
+ <field name="STATE"/>
+ <field name="STATE_DISMISSED"/>
+ <field name="STATE_FIRED"/>
+ <field name="STATE_SCHEDULED"/>
+ </class>
+ <class name="android/provider/CalendarContract$CalendarCache" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/CalendarContract$CalendarCacheColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="KEY_TIMEZONE_INSTANCES"/>
+ <field name="KEY_TIMEZONE_INSTANCES_PREVIOUS"/>
+ <field name="KEY_TIMEZONE_TYPE"/>
+ <field name="TIMEZONE_TYPE_AUTO"/>
+ <field name="TIMEZONE_TYPE_HOME"/>
+ <field name="URI"/>
+ </class>
+ <class name="android/provider/CalendarContract$CalendarCacheColumns" since="14">
+ <extends name="java/lang/Object"/>
+ <field name="KEY"/>
+ <field name="VALUE"/>
+ </class>
+ <class name="android/provider/CalendarContract$CalendarColumns" since="14">
+ <extends name="java/lang/Object"/>
+ <field name="ALLOWED_ATTENDEE_TYPES" since="15"/>
+ <field name="ALLOWED_AVAILABILITY" since="15"/>
+ <field name="ALLOWED_REMINDERS"/>
+ <field name="CALENDAR_ACCESS_LEVEL"/>
+ <field name="CALENDAR_COLOR"/>
+ <field name="CALENDAR_COLOR_KEY" since="15"/>
+ <field name="CALENDAR_DISPLAY_NAME"/>
+ <field name="CALENDAR_TIME_ZONE"/>
+ <field name="CAL_ACCESS_CONTRIBUTOR"/>
+ <field name="CAL_ACCESS_EDITOR"/>
+ <field name="CAL_ACCESS_FREEBUSY"/>
+ <field name="CAL_ACCESS_NONE"/>
+ <field name="CAL_ACCESS_OVERRIDE"/>
+ <field name="CAL_ACCESS_OWNER"/>
+ <field name="CAL_ACCESS_READ"/>
+ <field name="CAL_ACCESS_RESPOND"/>
+ <field name="CAL_ACCESS_ROOT"/>
+ <field name="CAN_MODIFY_TIME_ZONE"/>
+ <field name="CAN_ORGANIZER_RESPOND"/>
+ <field name="IS_PRIMARY" since="17"/>
+ <field name="MAX_REMINDERS"/>
+ <field name="OWNER_ACCOUNT"/>
+ <field name="SYNC_EVENTS"/>
+ <field name="VISIBLE"/>
+ </class>
+ <class name="android/provider/CalendarContract$CalendarEntity" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/CalendarContract$CalendarColumns"/>
+ <implements name="android/provider/CalendarContract$SyncColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="newEntityIterator(Landroid/database/Cursor;)Landroid/content/EntityIterator;"/>
+ <field name="CONTENT_URI"/>
+ </class>
+ <class name="android/provider/CalendarContract$CalendarSyncColumns" since="14">
+ <extends name="java/lang/Object"/>
+ <field name="CAL_SYNC1"/>
+ <field name="CAL_SYNC10"/>
+ <field name="CAL_SYNC2"/>
+ <field name="CAL_SYNC3"/>
+ <field name="CAL_SYNC4"/>
+ <field name="CAL_SYNC5"/>
+ <field name="CAL_SYNC6"/>
+ <field name="CAL_SYNC7"/>
+ <field name="CAL_SYNC8"/>
+ <field name="CAL_SYNC9"/>
+ </class>
+ <class name="android/provider/CalendarContract$Calendars" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/CalendarContract$CalendarColumns"/>
+ <implements name="android/provider/CalendarContract$SyncColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CALENDAR_LOCATION"/>
+ <field name="CONTENT_URI"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ <field name="NAME"/>
+ </class>
+ <class name="android/provider/CalendarContract$Colors" since="15">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/CalendarContract$ColorsColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_URI"/>
+ </class>
+ <class name="android/provider/CalendarContract$ColorsColumns" since="15">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/SyncStateContract$Columns"/>
+ <field name="COLOR"/>
+ <field name="COLOR_KEY"/>
+ <field name="COLOR_TYPE"/>
+ <field name="TYPE_CALENDAR"/>
+ <field name="TYPE_EVENT"/>
+ </class>
+ <class name="android/provider/CalendarContract$EventDays" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/CalendarContract$EventDaysColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="query(Landroid/content/ContentResolver;II[Ljava/lang/String;)Landroid/database/Cursor;"/>
+ <field name="CONTENT_URI"/>
+ </class>
+ <class name="android/provider/CalendarContract$EventDaysColumns" since="14">
+ <extends name="java/lang/Object"/>
+ <field name="ENDDAY"/>
+ <field name="STARTDAY"/>
+ </class>
+ <class name="android/provider/CalendarContract$Events" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/CalendarContract$CalendarColumns"/>
+ <implements name="android/provider/CalendarContract$EventsColumns"/>
+ <implements name="android/provider/CalendarContract$SyncColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_EXCEPTION_URI"/>
+ <field name="CONTENT_URI"/>
+ </class>
+ <class name="android/provider/CalendarContract$EventsColumns" since="14">
+ <extends name="java/lang/Object"/>
+ <field name="ACCESS_CONFIDENTIAL"/>
+ <field name="ACCESS_DEFAULT"/>
+ <field name="ACCESS_LEVEL"/>
+ <field name="ACCESS_PRIVATE"/>
+ <field name="ACCESS_PUBLIC"/>
+ <field name="ALL_DAY"/>
+ <field name="AVAILABILITY"/>
+ <field name="AVAILABILITY_BUSY"/>
+ <field name="AVAILABILITY_FREE"/>
+ <field name="AVAILABILITY_TENTATIVE" since="15"/>
+ <field name="CALENDAR_ID"/>
+ <field name="CAN_INVITE_OTHERS"/>
+ <field name="CUSTOM_APP_PACKAGE" since="16"/>
+ <field name="CUSTOM_APP_URI" since="16"/>
+ <field name="DESCRIPTION"/>
+ <field name="DISPLAY_COLOR" since="16"/>
+ <field name="DTEND"/>
+ <field name="DTSTART"/>
+ <field name="DURATION"/>
+ <field name="EVENT_COLOR"/>
+ <field name="EVENT_COLOR_KEY" since="15"/>
+ <field name="EVENT_END_TIMEZONE"/>
+ <field name="EVENT_LOCATION"/>
+ <field name="EVENT_TIMEZONE"/>
+ <field name="EXDATE"/>
+ <field name="EXRULE"/>
+ <field name="GUESTS_CAN_INVITE_OTHERS"/>
+ <field name="GUESTS_CAN_MODIFY"/>
+ <field name="GUESTS_CAN_SEE_GUESTS"/>
+ <field name="HAS_ALARM"/>
+ <field name="HAS_ATTENDEE_DATA"/>
+ <field name="HAS_EXTENDED_PROPERTIES"/>
+ <field name="IS_ORGANIZER" since="17"/>
+ <field name="LAST_DATE"/>
+ <field name="LAST_SYNCED"/>
+ <field name="ORGANIZER"/>
+ <field name="ORIGINAL_ALL_DAY"/>
+ <field name="ORIGINAL_ID"/>
+ <field name="ORIGINAL_INSTANCE_TIME"/>
+ <field name="ORIGINAL_SYNC_ID"/>
+ <field name="RDATE"/>
+ <field name="RRULE"/>
+ <field name="SELF_ATTENDEE_STATUS"/>
+ <field name="STATUS"/>
+ <field name="STATUS_CANCELED"/>
+ <field name="STATUS_CONFIRMED"/>
+ <field name="STATUS_TENTATIVE"/>
+ <field name="SYNC_DATA1"/>
+ <field name="SYNC_DATA10"/>
+ <field name="SYNC_DATA2"/>
+ <field name="SYNC_DATA3"/>
+ <field name="SYNC_DATA4"/>
+ <field name="SYNC_DATA5"/>
+ <field name="SYNC_DATA6"/>
+ <field name="SYNC_DATA7"/>
+ <field name="SYNC_DATA8"/>
+ <field name="SYNC_DATA9"/>
+ <field name="TITLE"/>
+ <field name="UID_2445" since="17"/>
+ </class>
+ <class name="android/provider/CalendarContract$EventsEntity" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/CalendarContract$EventsColumns"/>
+ <implements name="android/provider/CalendarContract$SyncColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="newEntityIterator(Landroid/database/Cursor;Landroid/content/ContentProviderClient;)Landroid/content/EntityIterator;"/>
+ <method name="newEntityIterator(Landroid/database/Cursor;Landroid/content/ContentResolver;)Landroid/content/EntityIterator;"/>
+ <field name="CONTENT_URI"/>
+ </class>
+ <class name="android/provider/CalendarContract$ExtendedProperties" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/CalendarContract$EventsColumns"/>
+ <implements name="android/provider/CalendarContract$ExtendedPropertiesColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_URI"/>
+ </class>
+ <class name="android/provider/CalendarContract$ExtendedPropertiesColumns" since="14">
+ <extends name="java/lang/Object"/>
+ <field name="EVENT_ID"/>
+ <field name="NAME"/>
+ <field name="VALUE"/>
+ </class>
+ <class name="android/provider/CalendarContract$Instances" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/CalendarContract$CalendarColumns"/>
+ <implements name="android/provider/CalendarContract$EventsColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="query(Landroid/content/ContentResolver;[Ljava/lang/String;JJ)Landroid/database/Cursor;"/>
+ <method name="query(Landroid/content/ContentResolver;[Ljava/lang/String;JJLjava/lang/String;)Landroid/database/Cursor;"/>
+ <field name="BEGIN"/>
+ <field name="CONTENT_BY_DAY_URI"/>
+ <field name="CONTENT_SEARCH_BY_DAY_URI"/>
+ <field name="CONTENT_SEARCH_URI"/>
+ <field name="CONTENT_URI"/>
+ <field name="END"/>
+ <field name="END_DAY"/>
+ <field name="END_MINUTE"/>
+ <field name="EVENT_ID"/>
+ <field name="START_DAY"/>
+ <field name="START_MINUTE"/>
+ </class>
+ <class name="android/provider/CalendarContract$Reminders" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/CalendarContract$EventsColumns"/>
+ <implements name="android/provider/CalendarContract$RemindersColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="query(Landroid/content/ContentResolver;J[Ljava/lang/String;)Landroid/database/Cursor;"/>
+ <field name="CONTENT_URI"/>
+ </class>
+ <class name="android/provider/CalendarContract$RemindersColumns" since="14">
+ <extends name="java/lang/Object"/>
+ <field name="EVENT_ID"/>
+ <field name="METHOD"/>
+ <field name="METHOD_ALARM" since="16"/>
+ <field name="METHOD_ALERT"/>
+ <field name="METHOD_DEFAULT"/>
+ <field name="METHOD_EMAIL"/>
+ <field name="METHOD_SMS"/>
+ <field name="MINUTES"/>
+ <field name="MINUTES_DEFAULT"/>
+ </class>
+ <class name="android/provider/CalendarContract$SyncColumns" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/CalendarContract$CalendarSyncColumns"/>
+ <field name="ACCOUNT_NAME"/>
+ <field name="ACCOUNT_TYPE"/>
+ <field name="CAN_PARTIALLY_UPDATE"/>
+ <field name="DELETED"/>
+ <field name="DIRTY"/>
+ <field name="MUTATORS" since="18"/>
+ <field name="_SYNC_ID"/>
+ </class>
+ <class name="android/provider/CalendarContract$SyncState" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/SyncStateContract$Columns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_URI"/>
+ </class>
+ <class name="android/provider/CallLog" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="AUTHORITY"/>
+ <field name="CONTENT_URI"/>
+ </class>
+ <class name="android/provider/CallLog$Calls" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="getLastOutgoingCall(Landroid/content/Context;)Ljava/lang/String;" since="8"/>
+ <field name="ANSWERED_EXTERNALLY_TYPE" since="25"/>
+ <field name="BLOCKED_TYPE" since="24"/>
+ <field name="CACHED_FORMATTED_NUMBER" since="21"/>
+ <field name="CACHED_LOOKUP_URI" since="21"/>
+ <field name="CACHED_MATCHED_NUMBER" since="21"/>
+ <field name="CACHED_NAME"/>
+ <field name="CACHED_NORMALIZED_NUMBER" since="21"/>
+ <field name="CACHED_NUMBER_LABEL"/>
+ <field name="CACHED_NUMBER_TYPE"/>
+ <field name="CACHED_PHOTO_ID" since="21"/>
+ <field name="CACHED_PHOTO_URI" since="23"/>
+ <field name="CONTENT_FILTER_URI"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="CONTENT_URI"/>
+ <field name="CONTENT_URI_WITH_VOICEMAIL" since="21"/>
+ <field name="COUNTRY_ISO" since="21"/>
+ <field name="DATA_USAGE" since="21"/>
+ <field name="DATE"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ <field name="DURATION"/>
+ <field name="EXTRA_CALL_TYPE_FILTER" since="21"/>
+ <field name="FEATURES" since="21"/>
+ <field name="FEATURES_HD_CALL" since="26"/>
+ <field name="FEATURES_PULLED_EXTERNALLY" since="25"/>
+ <field name="FEATURES_VIDEO" since="21"/>
+ <field name="FEATURES_WIFI" since="26"/>
+ <field name="GEOCODED_LOCATION" since="21"/>
+ <field name="INCOMING_TYPE"/>
+ <field name="IS_READ" since="14"/>
+ <field name="LAST_MODIFIED" since="24"/>
+ <field name="LIMIT_PARAM_KEY" since="17"/>
+ <field name="MISSED_TYPE"/>
+ <field name="NEW"/>
+ <field name="NUMBER"/>
+ <field name="NUMBER_PRESENTATION" since="19"/>
+ <field name="OFFSET_PARAM_KEY" since="17"/>
+ <field name="OUTGOING_TYPE"/>
+ <field name="PHONE_ACCOUNT_COMPONENT_NAME" since="21"/>
+ <field name="PHONE_ACCOUNT_ID" since="21"/>
+ <field name="POST_DIAL_DIGITS" since="24"/>
+ <field name="PRESENTATION_ALLOWED" since="19"/>
+ <field name="PRESENTATION_PAYPHONE" since="19"/>
+ <field name="PRESENTATION_RESTRICTED" since="19"/>
+ <field name="PRESENTATION_UNKNOWN" since="19"/>
+ <field name="REJECTED_TYPE" since="24"/>
+ <field name="TRANSCRIPTION" since="21"/>
+ <field name="TYPE"/>
+ <field name="VIA_NUMBER" since="24"/>
+ <field name="VOICEMAIL_TYPE" since="21"/>
+ <field name="VOICEMAIL_URI" since="21"/>
+ </class>
+ <class name="android/provider/Contacts" since="1" deprecated="5">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="AUTHORITY" deprecated="16"/>
+ <field name="CONTENT_URI" deprecated="16"/>
+ <field name="KIND_EMAIL" deprecated="16"/>
+ <field name="KIND_IM" deprecated="16"/>
+ <field name="KIND_ORGANIZATION" deprecated="16"/>
+ <field name="KIND_PHONE" deprecated="16"/>
+ <field name="KIND_POSTAL" deprecated="16"/>
+ </class>
+ <class name="android/provider/Contacts$ContactMethods" since="1" deprecated="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/Contacts$ContactMethodsColumns"/>
+ <implements name="android/provider/Contacts$PeopleColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="addPostalLocation(Landroid/content/Context;JDD)V" deprecated="16"/>
+ <method name="decodeImProtocol(Ljava/lang/String;)Ljava/lang/Object;" deprecated="16"/>
+ <method name="encodeCustomImProtocol(Ljava/lang/String;)Ljava/lang/String;" deprecated="16"/>
+ <method name="encodePredefinedImProtocol(I)Ljava/lang/String;" deprecated="16"/>
+ <method name="getDisplayLabel(Landroid/content/Context;IILjava/lang/CharSequence;)Ljava/lang/CharSequence;" deprecated="16"/>
+ <field name="CONTENT_EMAIL_ITEM_TYPE" deprecated="16"/>
+ <field name="CONTENT_EMAIL_TYPE" deprecated="16"/>
+ <field name="CONTENT_EMAIL_URI" deprecated="16"/>
+ <field name="CONTENT_IM_ITEM_TYPE" deprecated="16"/>
+ <field name="CONTENT_POSTAL_ITEM_TYPE" deprecated="16"/>
+ <field name="CONTENT_POSTAL_TYPE" deprecated="16"/>
+ <field name="CONTENT_TYPE" deprecated="16"/>
+ <field name="CONTENT_URI" deprecated="16"/>
+ <field name="DEFAULT_SORT_ORDER" deprecated="16"/>
+ <field name="PERSON_ID" deprecated="16"/>
+ <field name="POSTAL_LOCATION_LATITUDE" deprecated="16"/>
+ <field name="POSTAL_LOCATION_LONGITUDE" deprecated="16"/>
+ <field name="PROTOCOL_AIM" deprecated="16"/>
+ <field name="PROTOCOL_GOOGLE_TALK" deprecated="16"/>
+ <field name="PROTOCOL_ICQ" deprecated="16"/>
+ <field name="PROTOCOL_JABBER" deprecated="16"/>
+ <field name="PROTOCOL_MSN" deprecated="16"/>
+ <field name="PROTOCOL_QQ" deprecated="16"/>
+ <field name="PROTOCOL_SKYPE" deprecated="16"/>
+ <field name="PROTOCOL_YAHOO" deprecated="16"/>
+ </class>
+ <class name="android/provider/Contacts$ContactMethodsColumns" since="1" deprecated="5">
+ <extends name="java/lang/Object"/>
+ <field name="AUX_DATA" deprecated="16"/>
+ <field name="DATA" deprecated="16"/>
+ <field name="ISPRIMARY" deprecated="16"/>
+ <field name="KIND" deprecated="16"/>
+ <field name="LABEL" deprecated="16"/>
+ <field name="TYPE" deprecated="16"/>
+ <field name="TYPE_CUSTOM" deprecated="16"/>
+ <field name="TYPE_HOME" deprecated="16"/>
+ <field name="TYPE_OTHER" deprecated="16"/>
+ <field name="TYPE_WORK" deprecated="16"/>
+ </class>
+ <class name="android/provider/Contacts$Extensions" since="1" deprecated="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/Contacts$ExtensionsColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_ITEM_TYPE" deprecated="16"/>
+ <field name="CONTENT_TYPE" deprecated="16"/>
+ <field name="CONTENT_URI" deprecated="16"/>
+ <field name="DEFAULT_SORT_ORDER" deprecated="16"/>
+ <field name="PERSON_ID" deprecated="16"/>
+ </class>
+ <class name="android/provider/Contacts$ExtensionsColumns" since="1" deprecated="5">
+ <extends name="java/lang/Object"/>
+ <field name="NAME" deprecated="16"/>
+ <field name="VALUE" deprecated="16"/>
+ </class>
+ <class name="android/provider/Contacts$GroupMembership" since="1" deprecated="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/Contacts$GroupsColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_DIRECTORY" deprecated="16"/>
+ <field name="CONTENT_ITEM_TYPE" deprecated="16"/>
+ <field name="CONTENT_TYPE" deprecated="16"/>
+ <field name="CONTENT_URI" deprecated="16"/>
+ <field name="DEFAULT_SORT_ORDER" deprecated="16"/>
+ <field name="GROUP_ID" deprecated="16"/>
+ <field name="GROUP_SYNC_ACCOUNT" deprecated="16"/>
+ <field name="GROUP_SYNC_ACCOUNT_TYPE" since="5" deprecated="16"/>
+ <field name="GROUP_SYNC_ID" deprecated="16"/>
+ <field name="PERSON_ID" deprecated="16"/>
+ <field name="RAW_CONTENT_URI" deprecated="16"/>
+ </class>
+ <class name="android/provider/Contacts$Groups" since="1" deprecated="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/Contacts$GroupsColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_ITEM_TYPE" deprecated="16"/>
+ <field name="CONTENT_TYPE" deprecated="16"/>
+ <field name="CONTENT_URI" deprecated="16"/>
+ <field name="DEFAULT_SORT_ORDER" deprecated="16"/>
+ <field name="DELETED_CONTENT_URI" deprecated="16"/>
+ <field name="GROUP_ANDROID_STARRED" deprecated="16"/>
+ <field name="GROUP_MY_CONTACTS" deprecated="16"/>
+ </class>
+ <class name="android/provider/Contacts$GroupsColumns" since="1" deprecated="5">
+ <extends name="java/lang/Object"/>
+ <field name="NAME" deprecated="16"/>
+ <field name="NOTES" deprecated="16"/>
+ <field name="SHOULD_SYNC" deprecated="16"/>
+ <field name="SYSTEM_ID" deprecated="16"/>
+ </class>
+ <class name="android/provider/Contacts$Intents" since="1" deprecated="5">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V" deprecated="16"/>
+ <field name="ATTACH_IMAGE" deprecated="16"/>
+ <field name="EXTRA_CREATE_DESCRIPTION" since="3" deprecated="16"/>
+ <field name="EXTRA_FORCE_CREATE" since="3" deprecated="16"/>
+ <field name="SEARCH_SUGGESTION_CLICKED" deprecated="16"/>
+ <field name="SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED" deprecated="16"/>
+ <field name="SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED" deprecated="16"/>
+ <field name="SHOW_OR_CREATE_CONTACT" since="3" deprecated="16"/>
+ </class>
+ <class name="android/provider/Contacts$Intents$Insert" since="1" deprecated="5">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V" deprecated="16"/>
+ <field name="ACTION" deprecated="16"/>
+ <field name="COMPANY" deprecated="16"/>
+ <field name="EMAIL" deprecated="16"/>
+ <field name="EMAIL_ISPRIMARY" deprecated="16"/>
+ <field name="EMAIL_TYPE" deprecated="16"/>
+ <field name="FULL_MODE" deprecated="16"/>
+ <field name="IM_HANDLE" deprecated="16"/>
+ <field name="IM_ISPRIMARY" deprecated="16"/>
+ <field name="IM_PROTOCOL" deprecated="16"/>
+ <field name="JOB_TITLE" deprecated="16"/>
+ <field name="NAME" deprecated="16"/>
+ <field name="NOTES" deprecated="16"/>
+ <field name="PHONE" deprecated="16"/>
+ <field name="PHONETIC_NAME" since="3" deprecated="16"/>
+ <field name="PHONE_ISPRIMARY" deprecated="16"/>
+ <field name="PHONE_TYPE" deprecated="16"/>
+ <field name="POSTAL" deprecated="16"/>
+ <field name="POSTAL_ISPRIMARY" deprecated="16"/>
+ <field name="POSTAL_TYPE" deprecated="16"/>
+ <field name="SECONDARY_EMAIL" since="3" deprecated="16"/>
+ <field name="SECONDARY_EMAIL_TYPE" since="3" deprecated="16"/>
+ <field name="SECONDARY_PHONE" since="3" deprecated="16"/>
+ <field name="SECONDARY_PHONE_TYPE" since="3" deprecated="16"/>
+ <field name="TERTIARY_EMAIL" since="3" deprecated="16"/>
+ <field name="TERTIARY_EMAIL_TYPE" since="3" deprecated="16"/>
+ <field name="TERTIARY_PHONE" since="3" deprecated="16"/>
+ <field name="TERTIARY_PHONE_TYPE" since="3" deprecated="16"/>
+ </class>
+ <class name="android/provider/Contacts$Intents$UI" since="1" deprecated="5">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V" deprecated="16"/>
+ <field name="FILTER_CONTACTS_ACTION" deprecated="16"/>
+ <field name="FILTER_TEXT_EXTRA_KEY" deprecated="16"/>
+ <field name="GROUP_NAME_EXTRA_KEY" deprecated="16"/>
+ <field name="LIST_ALL_CONTACTS_ACTION" deprecated="16"/>
+ <field name="LIST_CONTACTS_WITH_PHONES_ACTION" deprecated="16"/>
+ <field name="LIST_DEFAULT" deprecated="16"/>
+ <field name="LIST_FREQUENT_ACTION" deprecated="16"/>
+ <field name="LIST_GROUP_ACTION" deprecated="16"/>
+ <field name="LIST_STARRED_ACTION" deprecated="16"/>
+ <field name="LIST_STREQUENT_ACTION" deprecated="16"/>
+ <field name="TITLE_EXTRA_KEY" deprecated="16"/>
+ </class>
+ <class name="android/provider/Contacts$OrganizationColumns" since="1" deprecated="5">
+ <extends name="java/lang/Object"/>
+ <field name="COMPANY" deprecated="16"/>
+ <field name="ISPRIMARY" deprecated="16"/>
+ <field name="LABEL" deprecated="16"/>
+ <field name="PERSON_ID" deprecated="16"/>
+ <field name="TITLE" deprecated="16"/>
+ <field name="TYPE" deprecated="16"/>
+ <field name="TYPE_CUSTOM" deprecated="16"/>
+ <field name="TYPE_OTHER" deprecated="16"/>
+ <field name="TYPE_WORK" deprecated="16"/>
+ </class>
+ <class name="android/provider/Contacts$Organizations" since="1" deprecated="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/Contacts$OrganizationColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDisplayLabel(Landroid/content/Context;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;" deprecated="16"/>
+ <field name="CONTENT_DIRECTORY" deprecated="16"/>
+ <field name="CONTENT_URI" deprecated="16"/>
+ <field name="DEFAULT_SORT_ORDER" deprecated="16"/>
+ </class>
+ <class name="android/provider/Contacts$People" since="1" deprecated="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/Contacts$PeopleColumns"/>
+ <implements name="android/provider/Contacts$PhonesColumns"/>
+ <implements name="android/provider/Contacts$PresenceColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="addToGroup(Landroid/content/ContentResolver;JJ)Landroid/net/Uri;" deprecated="16"/>
+ <method name="addToGroup(Landroid/content/ContentResolver;JLjava/lang/String;)Landroid/net/Uri;" deprecated="16"/>
+ <method name="addToMyContactsGroup(Landroid/content/ContentResolver;J)Landroid/net/Uri;" deprecated="16"/>
+ <method name="createPersonInMyContactsGroup(Landroid/content/ContentResolver;Landroid/content/ContentValues;)Landroid/net/Uri;" deprecated="16"/>
+ <method name="loadContactPhoto(Landroid/content/Context;Landroid/net/Uri;ILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;" deprecated="16"/>
+ <method name="markAsContacted(Landroid/content/ContentResolver;J)V" deprecated="16"/>
+ <method name="openContactPhotoInputStream(Landroid/content/ContentResolver;Landroid/net/Uri;)Ljava/io/InputStream;" deprecated="16"/>
+ <method name="queryGroups(Landroid/content/ContentResolver;J)Landroid/database/Cursor;" deprecated="16"/>
+ <method name="setPhotoData(Landroid/content/ContentResolver;Landroid/net/Uri;[B)V" deprecated="16"/>
+ <field name="CONTENT_FILTER_URI" deprecated="16"/>
+ <field name="CONTENT_ITEM_TYPE" deprecated="16"/>
+ <field name="CONTENT_TYPE" deprecated="16"/>
+ <field name="CONTENT_URI" deprecated="16"/>
+ <field name="DEFAULT_SORT_ORDER" deprecated="16"/>
+ <field name="DELETED_CONTENT_URI" deprecated="16"/>
+ <field name="PRIMARY_EMAIL_ID" deprecated="16"/>
+ <field name="PRIMARY_ORGANIZATION_ID" deprecated="16"/>
+ <field name="PRIMARY_PHONE_ID" deprecated="16"/>
+ </class>
+ <class name="android/provider/Contacts$People$ContactMethods" since="1" deprecated="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/Contacts$ContactMethodsColumns"/>
+ <implements name="android/provider/Contacts$PeopleColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_DIRECTORY" deprecated="16"/>
+ <field name="DEFAULT_SORT_ORDER" deprecated="16"/>
+ </class>
+ <class name="android/provider/Contacts$People$Extensions" since="1" deprecated="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/Contacts$ExtensionsColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_DIRECTORY" deprecated="16"/>
+ <field name="DEFAULT_SORT_ORDER" deprecated="16"/>
+ <field name="PERSON_ID" deprecated="16"/>
+ </class>
+ <class name="android/provider/Contacts$People$Phones" since="1" deprecated="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/Contacts$PeopleColumns"/>
+ <implements name="android/provider/Contacts$PhonesColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_DIRECTORY" deprecated="16"/>
+ <field name="DEFAULT_SORT_ORDER" deprecated="16"/>
+ </class>
+ <class name="android/provider/Contacts$PeopleColumns" since="1" deprecated="5">
+ <extends name="java/lang/Object"/>
+ <field name="CUSTOM_RINGTONE" deprecated="16"/>
+ <field name="DISPLAY_NAME" deprecated="16"/>
+ <field name="LAST_TIME_CONTACTED" deprecated="16"/>
+ <field name="NAME" deprecated="16"/>
+ <field name="NOTES" deprecated="16"/>
+ <field name="PHONETIC_NAME" since="3" deprecated="16"/>
+ <field name="PHOTO_VERSION" deprecated="16"/>
+ <field name="SEND_TO_VOICEMAIL" deprecated="16"/>
+ <field name="STARRED" deprecated="16"/>
+ <field name="TIMES_CONTACTED" deprecated="16"/>
+ </class>
+ <class name="android/provider/Contacts$Phones" since="1" deprecated="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/Contacts$PeopleColumns"/>
+ <implements name="android/provider/Contacts$PhonesColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDisplayLabel(Landroid/content/Context;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;" deprecated="16"/>
+ <method name="getDisplayLabel(Landroid/content/Context;ILjava/lang/CharSequence;[Ljava/lang/CharSequence;)Ljava/lang/CharSequence;" deprecated="16"/>
+ <field name="CONTENT_FILTER_URL" deprecated="16"/>
+ <field name="CONTENT_ITEM_TYPE" deprecated="16"/>
+ <field name="CONTENT_TYPE" deprecated="16"/>
+ <field name="CONTENT_URI" deprecated="16"/>
+ <field name="DEFAULT_SORT_ORDER" deprecated="16"/>
+ <field name="PERSON_ID" deprecated="16"/>
+ </class>
+ <class name="android/provider/Contacts$PhonesColumns" since="1" deprecated="5">
+ <extends name="java/lang/Object"/>
+ <field name="ISPRIMARY" deprecated="16"/>
+ <field name="LABEL" deprecated="16"/>
+ <field name="NUMBER" deprecated="16"/>
+ <field name="NUMBER_KEY" deprecated="16"/>
+ <field name="TYPE" deprecated="16"/>
+ <field name="TYPE_CUSTOM" deprecated="16"/>
+ <field name="TYPE_FAX_HOME" deprecated="16"/>
+ <field name="TYPE_FAX_WORK" deprecated="16"/>
+ <field name="TYPE_HOME" deprecated="16"/>
+ <field name="TYPE_MOBILE" deprecated="16"/>
+ <field name="TYPE_OTHER" deprecated="16"/>
+ <field name="TYPE_PAGER" deprecated="16"/>
+ <field name="TYPE_WORK" deprecated="16"/>
+ </class>
+ <class name="android/provider/Contacts$Photos" since="1" deprecated="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/Contacts$PhotosColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_DIRECTORY" deprecated="16"/>
+ <field name="CONTENT_URI" deprecated="16"/>
+ <field name="DEFAULT_SORT_ORDER" deprecated="16"/>
+ </class>
+ <class name="android/provider/Contacts$PhotosColumns" since="1" deprecated="5">
+ <extends name="java/lang/Object"/>
+ <field name="DATA" deprecated="16"/>
+ <field name="DOWNLOAD_REQUIRED" deprecated="16"/>
+ <field name="EXISTS_ON_SERVER" deprecated="16"/>
+ <field name="LOCAL_VERSION" deprecated="16"/>
+ <field name="PERSON_ID" deprecated="16"/>
+ <field name="SYNC_ERROR" deprecated="16"/>
+ </class>
+ <class name="android/provider/Contacts$PresenceColumns" since="1" deprecated="5">
+ <extends name="java/lang/Object"/>
+ <field name="AVAILABLE" since="8"/>
+ <field name="AWAY" since="8"/>
+ <field name="DO_NOT_DISTURB" since="8"/>
+ <field name="IDLE" since="8"/>
+ <field name="IM_ACCOUNT" deprecated="16"/>
+ <field name="IM_HANDLE" deprecated="16"/>
+ <field name="IM_PROTOCOL" deprecated="16"/>
+ <field name="INVISIBLE" since="8"/>
+ <field name="OFFLINE" since="8"/>
+ <field name="PRESENCE_CUSTOM_STATUS" since="8"/>
+ <field name="PRESENCE_STATUS" since="8"/>
+ <field name="PRIORITY" since="8"/>
+ </class>
+ <class name="android/provider/Contacts$Settings" since="1" deprecated="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/Contacts$SettingsColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="getSetting(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" deprecated="16"/>
+ <method name="setSetting(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" deprecated="16"/>
+ <field name="CONTENT_DIRECTORY" deprecated="16"/>
+ <field name="CONTENT_URI" deprecated="16"/>
+ <field name="DEFAULT_SORT_ORDER" deprecated="16"/>
+ <field name="SYNC_EVERYTHING" deprecated="16"/>
+ </class>
+ <class name="android/provider/Contacts$SettingsColumns" since="1" deprecated="5">
+ <extends name="java/lang/Object"/>
+ <field name="KEY" deprecated="16"/>
+ <field name="VALUE" deprecated="16"/>
+ <field name="_SYNC_ACCOUNT" deprecated="16"/>
+ <field name="_SYNC_ACCOUNT_TYPE" since="5" deprecated="16"/>
+ </class>
+ <class name="android/provider/ContactsContract" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="isProfileId(J)Z" since="14"/>
+ <field name="AUTHORITY"/>
+ <field name="AUTHORITY_URI"/>
+ <field name="CALLER_IS_SYNCADAPTER"/>
+ <field name="DEFERRED_SNIPPETING" since="21"/>
+ <field name="DEFERRED_SNIPPETING_QUERY" since="21"/>
+ <field name="DIRECTORY_PARAM_KEY" since="11"/>
+ <field name="LIMIT_PARAM_KEY" since="11"/>
+ <field name="PRIMARY_ACCOUNT_NAME" since="14"/>
+ <field name="PRIMARY_ACCOUNT_TYPE" since="14"/>
+ <field name="REMOVE_DUPLICATE_ENTRIES" since="21"/>
+ <field name="STREQUENT_PHONE_ONLY" since="21"/>
+ </class>
+ <class name="android/provider/ContactsContract$AggregationExceptions" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="CONTENT_URI"/>
+ <field name="RAW_CONTACT_ID1"/>
+ <field name="RAW_CONTACT_ID2"/>
+ <field name="TYPE"/>
+ <field name="TYPE_AUTOMATIC"/>
+ <field name="TYPE_KEEP_SEPARATE"/>
+ <field name="TYPE_KEEP_TOGETHER"/>
+ </class>
+ <class name="android/provider/ContactsContract$BaseSyncColumns" since="5">
+ <extends name="java/lang/Object"/>
+ <field name="SYNC1"/>
+ <field name="SYNC2"/>
+ <field name="SYNC3"/>
+ <field name="SYNC4"/>
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$BaseTypes" since="5">
+ <extends name="java/lang/Object"/>
+ <field name="TYPE_CUSTOM"/>
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$Callable" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/ContactsContract$CommonDataKinds$CommonColumns"/>
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_FILTER_URI"/>
+ <field name="CONTENT_URI"/>
+ <field name="ENTERPRISE_CONTENT_FILTER_URI" since="24"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES"/>
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$CommonColumns" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/ContactsContract$CommonDataKinds$BaseTypes"/>
+ <field name="DATA"/>
+ <field name="LABEL"/>
+ <field name="TYPE"/>
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$Contactables" since="18">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/ContactsContract$CommonDataKinds$CommonColumns"/>
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_FILTER_URI"/>
+ <field name="CONTENT_URI"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21"/>
+ <field name="VISIBLE_CONTACTS_ONLY"/>
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$Email" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/ContactsContract$CommonDataKinds$CommonColumns"/>
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins"/>
+ <method name="&lt;init>()V"/>
+ <method name="getTypeLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;"/>
+ <method name="getTypeLabelResource(I)I"/>
+ <field name="ADDRESS" since="11"/>
+ <field name="CONTENT_FILTER_URI"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="CONTENT_LOOKUP_URI"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="CONTENT_URI"/>
+ <field name="DISPLAY_NAME"/>
+ <field name="ENTERPRISE_CONTENT_FILTER_URI" since="24"/>
+ <field name="ENTERPRISE_CONTENT_LOOKUP_URI" since="23"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21"/>
+ <field name="TYPE_HOME"/>
+ <field name="TYPE_MOBILE"/>
+ <field name="TYPE_OTHER"/>
+ <field name="TYPE_WORK"/>
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$Event" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/ContactsContract$CommonDataKinds$CommonColumns"/>
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins"/>
+ <method name="&lt;init>()V"/>
+ <method name="getTypeLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;" since="21"/>
+ <method name="getTypeResource(Ljava/lang/Integer;)I"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21"/>
+ <field name="START_DATE"/>
+ <field name="TYPE_ANNIVERSARY"/>
+ <field name="TYPE_BIRTHDAY"/>
+ <field name="TYPE_OTHER"/>
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$GroupMembership" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21"/>
+ <field name="GROUP_ROW_ID"/>
+ <field name="GROUP_SOURCE_ID"/>
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$Identity" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21"/>
+ <field name="IDENTITY"/>
+ <field name="NAMESPACE"/>
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$Im" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/ContactsContract$CommonDataKinds$CommonColumns"/>
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins"/>
+ <method name="&lt;init>()V"/>
+ <method name="getProtocolLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;"/>
+ <method name="getProtocolLabelResource(I)I"/>
+ <method name="getTypeLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;"/>
+ <method name="getTypeLabelResource(I)I"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="CUSTOM_PROTOCOL"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21"/>
+ <field name="PROTOCOL"/>
+ <field name="PROTOCOL_AIM"/>
+ <field name="PROTOCOL_CUSTOM"/>
+ <field name="PROTOCOL_GOOGLE_TALK"/>
+ <field name="PROTOCOL_ICQ"/>
+ <field name="PROTOCOL_JABBER"/>
+ <field name="PROTOCOL_MSN"/>
+ <field name="PROTOCOL_NETMEETING"/>
+ <field name="PROTOCOL_QQ"/>
+ <field name="PROTOCOL_SKYPE"/>
+ <field name="PROTOCOL_YAHOO"/>
+ <field name="TYPE_HOME"/>
+ <field name="TYPE_OTHER"/>
+ <field name="TYPE_WORK"/>
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$Nickname" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/ContactsContract$CommonDataKinds$CommonColumns"/>
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21"/>
+ <field name="NAME"/>
+ <field name="TYPE_DEFAULT"/>
+ <field name="TYPE_INITIALS"/>
+ <field name="TYPE_MAIDEN_NAME" since="9"/>
+ <field name="TYPE_MAINDEN_NAME" deprecated="16"/>
+ <field name="TYPE_OTHER_NAME"/>
+ <field name="TYPE_SHORT_NAME"/>
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$Note" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21"/>
+ <field name="NOTE"/>
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$Organization" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/ContactsContract$CommonDataKinds$CommonColumns"/>
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins"/>
+ <method name="&lt;init>()V"/>
+ <method name="getTypeLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;"/>
+ <method name="getTypeLabelResource(I)I"/>
+ <field name="COMPANY"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="DEPARTMENT"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21"/>
+ <field name="JOB_DESCRIPTION"/>
+ <field name="OFFICE_LOCATION"/>
+ <field name="PHONETIC_NAME"/>
+ <field name="PHONETIC_NAME_STYLE" since="24"/>
+ <field name="SYMBOL"/>
+ <field name="TITLE"/>
+ <field name="TYPE_OTHER"/>
+ <field name="TYPE_WORK"/>
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$Phone" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/ContactsContract$CommonDataKinds$CommonColumns"/>
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins"/>
+ <method name="&lt;init>()V"/>
+ <method name="getTypeLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;"/>
+ <method name="getTypeLabelResource(I)I"/>
+ <field name="CONTENT_FILTER_URI"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="CONTENT_URI"/>
+ <field name="ENTERPRISE_CONTENT_FILTER_URI" since="24"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21"/>
+ <field name="NORMALIZED_NUMBER" since="16"/>
+ <field name="NUMBER"/>
+ <field name="SEARCH_DISPLAY_NAME_KEY" since="16"/>
+ <field name="SEARCH_PHONE_NUMBER_KEY" since="16"/>
+ <field name="TYPE_ASSISTANT"/>
+ <field name="TYPE_CALLBACK"/>
+ <field name="TYPE_CAR"/>
+ <field name="TYPE_COMPANY_MAIN"/>
+ <field name="TYPE_FAX_HOME"/>
+ <field name="TYPE_FAX_WORK"/>
+ <field name="TYPE_HOME"/>
+ <field name="TYPE_ISDN"/>
+ <field name="TYPE_MAIN"/>
+ <field name="TYPE_MMS"/>
+ <field name="TYPE_MOBILE"/>
+ <field name="TYPE_OTHER"/>
+ <field name="TYPE_OTHER_FAX"/>
+ <field name="TYPE_PAGER"/>
+ <field name="TYPE_RADIO"/>
+ <field name="TYPE_TELEX"/>
+ <field name="TYPE_TTY_TDD"/>
+ <field name="TYPE_WORK"/>
+ <field name="TYPE_WORK_MOBILE"/>
+ <field name="TYPE_WORK_PAGER"/>
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$Photo" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21"/>
+ <field name="PHOTO"/>
+ <field name="PHOTO_FILE_ID" since="14"/>
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$Relation" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/ContactsContract$CommonDataKinds$CommonColumns"/>
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins"/>
+ <method name="&lt;init>()V"/>
+ <method name="getTypeLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;" since="11"/>
+ <method name="getTypeLabelResource(I)I" since="11"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21"/>
+ <field name="NAME"/>
+ <field name="TYPE_ASSISTANT"/>
+ <field name="TYPE_BROTHER"/>
+ <field name="TYPE_CHILD"/>
+ <field name="TYPE_DOMESTIC_PARTNER"/>
+ <field name="TYPE_FATHER"/>
+ <field name="TYPE_FRIEND"/>
+ <field name="TYPE_MANAGER"/>
+ <field name="TYPE_MOTHER"/>
+ <field name="TYPE_PARENT"/>
+ <field name="TYPE_PARTNER"/>
+ <field name="TYPE_REFERRED_BY"/>
+ <field name="TYPE_RELATIVE"/>
+ <field name="TYPE_SISTER"/>
+ <field name="TYPE_SPOUSE"/>
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$SipAddress" since="9">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/ContactsContract$CommonDataKinds$CommonColumns"/>
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins"/>
+ <method name="&lt;init>()V"/>
+ <method name="getTypeLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;"/>
+ <method name="getTypeLabelResource(I)I"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21"/>
+ <field name="SIP_ADDRESS"/>
+ <field name="TYPE_HOME"/>
+ <field name="TYPE_OTHER"/>
+ <field name="TYPE_WORK"/>
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$StructuredName" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="DISPLAY_NAME"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21"/>
+ <field name="FAMILY_NAME"/>
+ <field name="FULL_NAME_STYLE" since="21"/>
+ <field name="GIVEN_NAME"/>
+ <field name="MIDDLE_NAME"/>
+ <field name="PHONETIC_FAMILY_NAME"/>
+ <field name="PHONETIC_GIVEN_NAME"/>
+ <field name="PHONETIC_MIDDLE_NAME"/>
+ <field name="PHONETIC_NAME_STYLE" since="24"/>
+ <field name="PREFIX"/>
+ <field name="SUFFIX"/>
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$StructuredPostal" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/ContactsContract$CommonDataKinds$CommonColumns"/>
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins"/>
+ <method name="&lt;init>()V"/>
+ <method name="getTypeLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;"/>
+ <method name="getTypeLabelResource(I)I"/>
+ <field name="CITY"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="CONTENT_URI"/>
+ <field name="COUNTRY"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21"/>
+ <field name="FORMATTED_ADDRESS"/>
+ <field name="NEIGHBORHOOD"/>
+ <field name="POBOX"/>
+ <field name="POSTCODE"/>
+ <field name="REGION"/>
+ <field name="STREET"/>
+ <field name="TYPE_HOME"/>
+ <field name="TYPE_OTHER"/>
+ <field name="TYPE_WORK"/>
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$Website" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/ContactsContract$CommonDataKinds$CommonColumns"/>
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21"/>
+ <field name="TYPE_BLOG"/>
+ <field name="TYPE_FTP"/>
+ <field name="TYPE_HOME"/>
+ <field name="TYPE_HOMEPAGE"/>
+ <field name="TYPE_OTHER"/>
+ <field name="TYPE_PROFILE"/>
+ <field name="TYPE_WORK"/>
+ <field name="URL"/>
+ </class>
+ <class name="android/provider/ContactsContract$ContactNameColumns" since="11">
+ <extends name="java/lang/Object"/>
+ <field name="DISPLAY_NAME_ALTERNATIVE"/>
+ <field name="DISPLAY_NAME_PRIMARY"/>
+ <field name="DISPLAY_NAME_SOURCE"/>
+ <field name="PHONETIC_NAME"/>
+ <field name="PHONETIC_NAME_STYLE"/>
+ <field name="SORT_KEY_ALTERNATIVE"/>
+ <field name="SORT_KEY_PRIMARY"/>
+ </class>
+ <class name="android/provider/ContactsContract$ContactOptionsColumns" since="5">
+ <extends name="java/lang/Object"/>
+ <field name="CUSTOM_RINGTONE"/>
+ <field name="LAST_TIME_CONTACTED"/>
+ <field name="PINNED" since="21"/>
+ <field name="SEND_TO_VOICEMAIL"/>
+ <field name="STARRED"/>
+ <field name="TIMES_CONTACTED"/>
+ </class>
+ <class name="android/provider/ContactsContract$ContactStatusColumns" since="5">
+ <extends name="java/lang/Object"/>
+ <field name="CONTACT_CHAT_CAPABILITY" since="11"/>
+ <field name="CONTACT_PRESENCE"/>
+ <field name="CONTACT_STATUS"/>
+ <field name="CONTACT_STATUS_ICON"/>
+ <field name="CONTACT_STATUS_LABEL"/>
+ <field name="CONTACT_STATUS_RES_PACKAGE"/>
+ <field name="CONTACT_STATUS_TIMESTAMP"/>
+ </class>
+ <class name="android/provider/ContactsContract$Contacts" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/ContactsContract$ContactNameColumns" since="11"/>
+ <implements name="android/provider/ContactsContract$ContactOptionsColumns"/>
+ <implements name="android/provider/ContactsContract$ContactStatusColumns"/>
+ <implements name="android/provider/ContactsContract$ContactsColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="getLookupUri(JLjava/lang/String;)Landroid/net/Uri;"/>
+ <method name="getLookupUri(Landroid/content/ContentResolver;Landroid/net/Uri;)Landroid/net/Uri;"/>
+ <method name="isEnterpriseContactId(J)Z" since="21"/>
+ <method name="lookupContact(Landroid/content/ContentResolver;Landroid/net/Uri;)Landroid/net/Uri;"/>
+ <method name="markAsContacted(Landroid/content/ContentResolver;J)V" deprecated="16"/>
+ <method name="openContactPhotoInputStream(Landroid/content/ContentResolver;Landroid/net/Uri;)Ljava/io/InputStream;"/>
+ <method name="openContactPhotoInputStream(Landroid/content/ContentResolver;Landroid/net/Uri;Z)Ljava/io/InputStream;" since="14"/>
+ <field name="CONTENT_FILTER_URI"/>
+ <field name="CONTENT_FREQUENT_URI" since="21"/>
+ <field name="CONTENT_GROUP_URI"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="CONTENT_LOOKUP_URI"/>
+ <field name="CONTENT_MULTI_VCARD_URI" since="21"/>
+ <field name="CONTENT_STREQUENT_FILTER_URI"/>
+ <field name="CONTENT_STREQUENT_URI"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="CONTENT_URI"/>
+ <field name="CONTENT_VCARD_TYPE"/>
+ <field name="CONTENT_VCARD_URI"/>
+ <field name="ENTERPRISE_CONTENT_FILTER_URI" since="24"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21"/>
+ <field name="QUERY_PARAMETER_VCARD_NO_PHOTO" since="23"/>
+ </class>
+ <class name="android/provider/ContactsContract$Contacts$AggregationSuggestions" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/ContactsContract$ContactOptionsColumns" since="11"/>
+ <implements name="android/provider/ContactsContract$ContactStatusColumns" since="11"/>
+ <implements name="android/provider/ContactsContract$ContactsColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_DIRECTORY"/>
+ </class>
+ <class name="android/provider/ContactsContract$Contacts$AggregationSuggestions$Builder" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addNameParameter(Ljava/lang/String;)Landroid/provider/ContactsContract$Contacts$AggregationSuggestions$Builder;"/>
+ <method name="build()Landroid/net/Uri;"/>
+ <method name="setContactId(J)Landroid/provider/ContactsContract$Contacts$AggregationSuggestions$Builder;"/>
+ <method name="setLimit(I)Landroid/provider/ContactsContract$Contacts$AggregationSuggestions$Builder;"/>
+ </class>
+ <class name="android/provider/ContactsContract$Contacts$Data" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/ContactsContract$DataColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_DIRECTORY"/>
+ </class>
+ <class name="android/provider/ContactsContract$Contacts$Entity" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/ContactsContract$BaseSyncColumns"/>
+ <implements name="android/provider/ContactsContract$ContactNameColumns"/>
+ <implements name="android/provider/ContactsContract$ContactOptionsColumns"/>
+ <implements name="android/provider/ContactsContract$ContactStatusColumns"/>
+ <implements name="android/provider/ContactsContract$ContactsColumns"/>
+ <implements name="android/provider/ContactsContract$DataColumns"/>
+ <implements name="android/provider/ContactsContract$DataUsageStatColumns" since="21"/>
+ <implements name="android/provider/ContactsContract$RawContactsColumns"/>
+ <implements name="android/provider/ContactsContract$StatusColumns"/>
+ <implements name="android/provider/ContactsContract$SyncColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_DIRECTORY"/>
+ <field name="DATA_ID"/>
+ <field name="RAW_CONTACT_ID"/>
+ </class>
+ <class name="android/provider/ContactsContract$Contacts$Photo" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/ContactsContract$DataColumns" removed="11"/>
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins" since="11"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_DIRECTORY"/>
+ <field name="DISPLAY_PHOTO" since="14"/>
+ <field name="PHOTO" since="11"/>
+ <field name="PHOTO_FILE_ID" since="14"/>
+ </class>
+ <class name="android/provider/ContactsContract$Contacts$StreamItems" since="15" deprecated="21" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/ContactsContract$StreamItemsColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_DIRECTORY" deprecated="21"/>
+ </class>
+ <class name="android/provider/ContactsContract$ContactsColumns" since="5">
+ <extends name="java/lang/Object"/>
+ <field name="CONTACT_LAST_UPDATED_TIMESTAMP" since="18"/>
+ <field name="DISPLAY_NAME"/>
+ <field name="HAS_PHONE_NUMBER"/>
+ <field name="IN_DEFAULT_DIRECTORY" since="21"/>
+ <field name="IN_VISIBLE_GROUP"/>
+ <field name="IS_USER_PROFILE" since="14"/>
+ <field name="LOOKUP_KEY"/>
+ <field name="NAME_RAW_CONTACT_ID" since="21"/>
+ <field name="PHOTO_FILE_ID" since="14"/>
+ <field name="PHOTO_ID"/>
+ <field name="PHOTO_THUMBNAIL_URI" since="11"/>
+ <field name="PHOTO_URI" since="11"/>
+ </class>
+ <class name="android/provider/ContactsContract$Data" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins"/>
+ <method name="&lt;init>()V"/>
+ <method name="getContactLookupUri(Landroid/content/ContentResolver;Landroid/net/Uri;)Landroid/net/Uri;"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="CONTENT_URI"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21"/>
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21"/>
+ <field name="VISIBLE_CONTACTS_ONLY" since="18"/>
+ </class>
+ <class name="android/provider/ContactsContract$DataColumns" since="5">
+ <extends name="java/lang/Object"/>
+ <field name="CARRIER_PRESENCE" since="23"/>
+ <field name="CARRIER_PRESENCE_VT_CAPABLE" since="23"/>
+ <field name="DATA1"/>
+ <field name="DATA10"/>
+ <field name="DATA11"/>
+ <field name="DATA12"/>
+ <field name="DATA13"/>
+ <field name="DATA14"/>
+ <field name="DATA15"/>
+ <field name="DATA2"/>
+ <field name="DATA3"/>
+ <field name="DATA4"/>
+ <field name="DATA5"/>
+ <field name="DATA6"/>
+ <field name="DATA7"/>
+ <field name="DATA8"/>
+ <field name="DATA9"/>
+ <field name="DATA_VERSION"/>
+ <field name="IS_PRIMARY"/>
+ <field name="IS_READ_ONLY" since="11"/>
+ <field name="IS_SUPER_PRIMARY"/>
+ <field name="MIMETYPE"/>
+ <field name="RAW_CONTACT_ID"/>
+ <field name="RES_PACKAGE" since="21"/>
+ <field name="SYNC1"/>
+ <field name="SYNC2"/>
+ <field name="SYNC3"/>
+ <field name="SYNC4"/>
+ </class>
+ <class name="android/provider/ContactsContract$DataColumnsWithJoins" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/ContactsContract$ContactNameColumns" since="11"/>
+ <implements name="android/provider/ContactsContract$ContactOptionsColumns"/>
+ <implements name="android/provider/ContactsContract$ContactStatusColumns"/>
+ <implements name="android/provider/ContactsContract$ContactsColumns"/>
+ <implements name="android/provider/ContactsContract$DataColumns"/>
+ <implements name="android/provider/ContactsContract$DataUsageStatColumns" since="18"/>
+ <implements name="android/provider/ContactsContract$RawContactsColumns"/>
+ <implements name="android/provider/ContactsContract$StatusColumns"/>
+ </class>
+ <class name="android/provider/ContactsContract$DataUsageFeedback" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="DELETE_USAGE_URI" since="16"/>
+ <field name="FEEDBACK_URI"/>
+ <field name="USAGE_TYPE"/>
+ <field name="USAGE_TYPE_CALL"/>
+ <field name="USAGE_TYPE_LONG_TEXT"/>
+ <field name="USAGE_TYPE_SHORT_TEXT"/>
+ </class>
+ <class name="android/provider/ContactsContract$DataUsageStatColumns" since="18">
+ <extends name="java/lang/Object"/>
+ <field name="LAST_TIME_USED"/>
+ <field name="TIMES_USED"/>
+ </class>
+ <class name="android/provider/ContactsContract$DeletedContacts" since="18">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/ContactsContract$DeletedContactsColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_URI"/>
+ <field name="DAYS_KEPT_MILLISECONDS"/>
+ </class>
+ <class name="android/provider/ContactsContract$DeletedContactsColumns" since="18">
+ <extends name="java/lang/Object"/>
+ <field name="CONTACT_DELETED_TIMESTAMP"/>
+ <field name="CONTACT_ID"/>
+ </class>
+ <class name="android/provider/ContactsContract$Directory" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="isEnterpriseDirectoryId(J)Z" since="24"/>
+ <method name="isRemoteDirectoryId(J)Z" since="24"/>
+ <method name="notifyDirectoryChange(Landroid/content/ContentResolver;)V"/>
+ <field name="ACCOUNT_NAME"/>
+ <field name="ACCOUNT_TYPE"/>
+ <field name="CALLER_PACKAGE_PARAM_KEY" since="26"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="CONTENT_URI"/>
+ <field name="DEFAULT"/>
+ <field name="DIRECTORY_AUTHORITY"/>
+ <field name="DISPLAY_NAME"/>
+ <field name="ENTERPRISE_CONTENT_URI" since="24"/>
+ <field name="ENTERPRISE_DEFAULT" since="24"/>
+ <field name="ENTERPRISE_LOCAL_INVISIBLE" since="24"/>
+ <field name="EXPORT_SUPPORT"/>
+ <field name="EXPORT_SUPPORT_ANY_ACCOUNT"/>
+ <field name="EXPORT_SUPPORT_NONE"/>
+ <field name="EXPORT_SUPPORT_SAME_ACCOUNT_ONLY"/>
+ <field name="LOCAL_INVISIBLE"/>
+ <field name="PACKAGE_NAME"/>
+ <field name="PHOTO_SUPPORT"/>
+ <field name="PHOTO_SUPPORT_FULL"/>
+ <field name="PHOTO_SUPPORT_FULL_SIZE_ONLY"/>
+ <field name="PHOTO_SUPPORT_NONE"/>
+ <field name="PHOTO_SUPPORT_THUMBNAIL_ONLY"/>
+ <field name="SHORTCUT_SUPPORT"/>
+ <field name="SHORTCUT_SUPPORT_DATA_ITEMS_ONLY"/>
+ <field name="SHORTCUT_SUPPORT_FULL"/>
+ <field name="SHORTCUT_SUPPORT_NONE"/>
+ <field name="TYPE_RESOURCE_ID"/>
+ </class>
+ <class name="android/provider/ContactsContract$DisplayNameSources" since="11">
+ <extends name="java/lang/Object"/>
+ <field name="EMAIL"/>
+ <field name="NICKNAME"/>
+ <field name="ORGANIZATION"/>
+ <field name="PHONE"/>
+ <field name="STRUCTURED_NAME"/>
+ <field name="STRUCTURED_PHONETIC_NAME" since="23"/>
+ <field name="UNDEFINED"/>
+ </class>
+ <class name="android/provider/ContactsContract$DisplayPhoto" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_MAX_DIMENSIONS_URI"/>
+ <field name="CONTENT_URI"/>
+ <field name="DISPLAY_MAX_DIM"/>
+ <field name="THUMBNAIL_MAX_DIM"/>
+ </class>
+ <class name="android/provider/ContactsContract$FullNameStyle" since="11">
+ <extends name="java/lang/Object"/>
+ <field name="CHINESE"/>
+ <field name="CJK"/>
+ <field name="JAPANESE"/>
+ <field name="KOREAN"/>
+ <field name="UNDEFINED"/>
+ <field name="WESTERN"/>
+ </class>
+ <class name="android/provider/ContactsContract$Groups" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/ContactsContract$GroupsColumns"/>
+ <implements name="android/provider/ContactsContract$SyncColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="newEntityIterator(Landroid/database/Cursor;)Landroid/content/EntityIterator;" since="8"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="CONTENT_SUMMARY_URI"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="CONTENT_URI"/>
+ </class>
+ <class name="android/provider/ContactsContract$GroupsColumns" since="5">
+ <extends name="java/lang/Object"/>
+ <field name="AUTO_ADD" since="11"/>
+ <field name="DATA_SET" since="14"/>
+ <field name="DELETED"/>
+ <field name="FAVORITES" since="11"/>
+ <field name="GROUP_IS_READ_ONLY" since="11"/>
+ <field name="GROUP_VISIBLE"/>
+ <field name="NOTES"/>
+ <field name="RES_PACKAGE" since="21"/>
+ <field name="SHOULD_SYNC"/>
+ <field name="SUMMARY_COUNT"/>
+ <field name="SUMMARY_WITH_PHONES"/>
+ <field name="SYSTEM_ID"/>
+ <field name="TITLE"/>
+ <field name="TITLE_RES" since="21"/>
+ </class>
+ <class name="android/provider/ContactsContract$Intents" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="ACTION_VOICE_SEND_MESSAGE_TO_CONTACTS" since="24"/>
+ <field name="ATTACH_IMAGE"/>
+ <field name="CONTACTS_DATABASE_CREATED" since="18"/>
+ <field name="EXTRA_CREATE_DESCRIPTION"/>
+ <field name="EXTRA_FORCE_CREATE"/>
+ <field name="EXTRA_RECIPIENT_CONTACT_CHAT_ID" since="24"/>
+ <field name="EXTRA_RECIPIENT_CONTACT_NAME" since="24"/>
+ <field name="EXTRA_RECIPIENT_CONTACT_URI" since="24"/>
+ <field name="INVITE_CONTACT" since="14"/>
+ <field name="METADATA_ACCOUNT_TYPE" since="24"/>
+ <field name="METADATA_MIMETYPE" since="24"/>
+ <field name="SEARCH_SUGGESTION_CLICKED"/>
+ <field name="SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED"/>
+ <field name="SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED"/>
+ <field name="SHOW_OR_CREATE_CONTACT"/>
+ </class>
+ <class name="android/provider/ContactsContract$Intents$Insert" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="ACTION"/>
+ <field name="COMPANY"/>
+ <field name="DATA" since="11"/>
+ <field name="EMAIL"/>
+ <field name="EMAIL_ISPRIMARY"/>
+ <field name="EMAIL_TYPE"/>
+ <field name="EXTRA_ACCOUNT" since="23"/>
+ <field name="EXTRA_DATA_SET" since="23"/>
+ <field name="FULL_MODE"/>
+ <field name="IM_HANDLE"/>
+ <field name="IM_ISPRIMARY"/>
+ <field name="IM_PROTOCOL"/>
+ <field name="JOB_TITLE"/>
+ <field name="NAME"/>
+ <field name="NOTES"/>
+ <field name="PHONE"/>
+ <field name="PHONETIC_NAME"/>
+ <field name="PHONE_ISPRIMARY"/>
+ <field name="PHONE_TYPE"/>
+ <field name="POSTAL"/>
+ <field name="POSTAL_ISPRIMARY"/>
+ <field name="POSTAL_TYPE"/>
+ <field name="SECONDARY_EMAIL"/>
+ <field name="SECONDARY_EMAIL_TYPE"/>
+ <field name="SECONDARY_PHONE"/>
+ <field name="SECONDARY_PHONE_TYPE"/>
+ <field name="TERTIARY_EMAIL"/>
+ <field name="TERTIARY_EMAIL_TYPE"/>
+ <field name="TERTIARY_PHONE"/>
+ <field name="TERTIARY_PHONE_TYPE"/>
+ </class>
+ <class name="android/provider/ContactsContract$PhoneLookup" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/ContactsContract$ContactNameColumns" since="26"/>
+ <implements name="android/provider/ContactsContract$ContactOptionsColumns"/>
+ <implements name="android/provider/ContactsContract$ContactsColumns"/>
+ <implements name="android/provider/ContactsContract$PhoneLookupColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_FILTER_URI"/>
+ <field name="ENTERPRISE_CONTENT_FILTER_URI" since="21"/>
+ <field name="QUERY_PARAMETER_SIP_ADDRESS" since="21"/>
+ </class>
+ <class name="android/provider/ContactsContract$PhoneLookupColumns" since="5">
+ <extends name="java/lang/Object"/>
+ <field name="CONTACT_ID" since="24"/>
+ <field name="DATA_ID" since="24"/>
+ <field name="LABEL"/>
+ <field name="NORMALIZED_NUMBER" since="16"/>
+ <field name="NUMBER"/>
+ <field name="TYPE"/>
+ </class>
+ <class name="android/provider/ContactsContract$PhoneticNameStyle" since="11">
+ <extends name="java/lang/Object"/>
+ <field name="JAPANESE"/>
+ <field name="KOREAN"/>
+ <field name="PINYIN"/>
+ <field name="UNDEFINED"/>
+ </class>
+ <class name="android/provider/ContactsContract$PinnedPositions" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="pin(Landroid/content/ContentResolver;JI)V"/>
+ <method name="undemote(Landroid/content/ContentResolver;J)V"/>
+ <field name="DEMOTED"/>
+ <field name="UNPINNED"/>
+ </class>
+ <class name="android/provider/ContactsContract$Presence" since="5" deprecated="5">
+ <extends name="android/provider/ContactsContract$StatusUpdates"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/provider/ContactsContract$PresenceColumns" since="5">
+ <extends name="java/lang/Object"/>
+ <field name="CUSTOM_PROTOCOL"/>
+ <field name="DATA_ID"/>
+ <field name="IM_ACCOUNT"/>
+ <field name="IM_HANDLE"/>
+ <field name="PROTOCOL"/>
+ </class>
+ <class name="android/provider/ContactsContract$Profile" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/ContactsContract$ContactNameColumns"/>
+ <implements name="android/provider/ContactsContract$ContactOptionsColumns"/>
+ <implements name="android/provider/ContactsContract$ContactStatusColumns"/>
+ <implements name="android/provider/ContactsContract$ContactsColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_RAW_CONTACTS_URI"/>
+ <field name="CONTENT_URI"/>
+ <field name="CONTENT_VCARD_URI"/>
+ <field name="MIN_ID"/>
+ </class>
+ <class name="android/provider/ContactsContract$ProfileSyncState" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/SyncStateContract$Columns"/>
+ <method name="&lt;init>()V"/>
+ <method name="get(Landroid/content/ContentProviderClient;Landroid/accounts/Account;)[B"/>
+ <method name="getWithUri(Landroid/content/ContentProviderClient;Landroid/accounts/Account;)Landroid/util/Pair;"/>
+ <method name="newSetOperation(Landroid/accounts/Account;[B)Landroid/content/ContentProviderOperation;"/>
+ <method name="set(Landroid/content/ContentProviderClient;Landroid/accounts/Account;[B)V"/>
+ <field name="CONTENT_DIRECTORY"/>
+ <field name="CONTENT_URI"/>
+ </class>
+ <class name="android/provider/ContactsContract$ProviderStatus" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="CONTENT_URI"/>
+ <field name="DATABASE_CREATION_TIMESTAMP" since="26"/>
+ <field name="STATUS"/>
+ <field name="STATUS_BUSY"/>
+ <field name="STATUS_EMPTY"/>
+ <field name="STATUS_NORMAL"/>
+ </class>
+ <class name="android/provider/ContactsContract$QuickContact" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="showQuickContact(Landroid/content/Context;Landroid/graphics/Rect;Landroid/net/Uri;I[Ljava/lang/String;)V"/>
+ <method name="showQuickContact(Landroid/content/Context;Landroid/graphics/Rect;Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;)V" since="23"/>
+ <method name="showQuickContact(Landroid/content/Context;Landroid/view/View;Landroid/net/Uri;I[Ljava/lang/String;)V"/>
+ <method name="showQuickContact(Landroid/content/Context;Landroid/view/View;Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;)V" since="23"/>
+ <field name="ACTION_QUICK_CONTACT" since="21"/>
+ <field name="EXTRA_EXCLUDE_MIMES" since="21"/>
+ <field name="EXTRA_MODE" since="23"/>
+ <field name="EXTRA_PRIORITIZED_MIMETYPE" since="23"/>
+ <field name="MODE_LARGE"/>
+ <field name="MODE_MEDIUM"/>
+ <field name="MODE_SMALL"/>
+ </class>
+ <class name="android/provider/ContactsContract$RawContacts" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/ContactsContract$ContactNameColumns" since="11"/>
+ <implements name="android/provider/ContactsContract$ContactOptionsColumns"/>
+ <implements name="android/provider/ContactsContract$RawContactsColumns"/>
+ <implements name="android/provider/ContactsContract$SyncColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="getContactLookupUri(Landroid/content/ContentResolver;Landroid/net/Uri;)Landroid/net/Uri;"/>
+ <method name="newEntityIterator(Landroid/database/Cursor;)Landroid/content/EntityIterator;" since="8"/>
+ <field name="AGGREGATION_MODE_DEFAULT"/>
+ <field name="AGGREGATION_MODE_DISABLED"/>
+ <field name="AGGREGATION_MODE_IMMEDIATE" deprecated="16"/>
+ <field name="AGGREGATION_MODE_SUSPENDED"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="CONTENT_URI"/>
+ </class>
+ <class name="android/provider/ContactsContract$RawContacts$Data" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/ContactsContract$DataColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_DIRECTORY"/>
+ </class>
+ <class name="android/provider/ContactsContract$RawContacts$DisplayPhoto" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_DIRECTORY"/>
+ </class>
+ <class name="android/provider/ContactsContract$RawContacts$Entity" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/ContactsContract$DataColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_DIRECTORY"/>
+ <field name="DATA_ID"/>
+ </class>
+ <class name="android/provider/ContactsContract$RawContacts$StreamItems" since="15" deprecated="21" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/ContactsContract$StreamItemsColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_DIRECTORY" deprecated="21"/>
+ </class>
+ <class name="android/provider/ContactsContract$RawContactsColumns" since="5">
+ <extends name="java/lang/Object"/>
+ <field name="ACCOUNT_TYPE_AND_DATA_SET" since="21"/>
+ <field name="AGGREGATION_MODE"/>
+ <field name="BACKUP_ID" since="24"/>
+ <field name="CONTACT_ID"/>
+ <field name="DATA_SET" since="14"/>
+ <field name="DELETED"/>
+ <field name="METADATA_DIRTY" since="24"/>
+ <field name="RAW_CONTACT_IS_READ_ONLY" since="11"/>
+ <field name="RAW_CONTACT_IS_USER_PROFILE" since="14"/>
+ </class>
+ <class name="android/provider/ContactsContract$RawContactsEntity" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/ContactsContract$DataColumns"/>
+ <implements name="android/provider/ContactsContract$RawContactsColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="CONTENT_URI"/>
+ <field name="DATA_ID"/>
+ <field name="PROFILE_CONTENT_URI" since="14"/>
+ </class>
+ <class name="android/provider/ContactsContract$SearchSnippets" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="DEFERRED_SNIPPETING_KEY"/>
+ <field name="SNIPPET"/>
+ </class>
+ <class name="android/provider/ContactsContract$Settings" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/ContactsContract$SettingsColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="CONTENT_URI"/>
+ </class>
+ <class name="android/provider/ContactsContract$SettingsColumns" since="5">
+ <extends name="java/lang/Object"/>
+ <field name="ACCOUNT_NAME"/>
+ <field name="ACCOUNT_TYPE"/>
+ <field name="ANY_UNSYNCED"/>
+ <field name="DATA_SET" since="14"/>
+ <field name="SHOULD_SYNC"/>
+ <field name="UNGROUPED_COUNT"/>
+ <field name="UNGROUPED_VISIBLE"/>
+ <field name="UNGROUPED_WITH_PHONES"/>
+ </class>
+ <class name="android/provider/ContactsContract$StatusColumns" since="5">
+ <extends name="java/lang/Object"/>
+ <field name="AVAILABLE" since="8"/>
+ <field name="AWAY" since="8"/>
+ <field name="CAPABILITY_HAS_CAMERA" since="11"/>
+ <field name="CAPABILITY_HAS_VIDEO" since="11"/>
+ <field name="CAPABILITY_HAS_VOICE" since="11"/>
+ <field name="CHAT_CAPABILITY" since="11"/>
+ <field name="DO_NOT_DISTURB" since="8"/>
+ <field name="IDLE" since="8"/>
+ <field name="INVISIBLE" since="8"/>
+ <field name="OFFLINE" since="8"/>
+ <field name="PRESENCE"/>
+ <field name="PRESENCE_CUSTOM_STATUS" since="8" deprecated="16"/>
+ <field name="PRESENCE_STATUS" since="8" deprecated="16"/>
+ <field name="STATUS"/>
+ <field name="STATUS_ICON"/>
+ <field name="STATUS_LABEL"/>
+ <field name="STATUS_RES_PACKAGE"/>
+ <field name="STATUS_TIMESTAMP"/>
+ </class>
+ <class name="android/provider/ContactsContract$StatusUpdates" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/ContactsContract$PresenceColumns"/>
+ <implements name="android/provider/ContactsContract$StatusColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="getPresenceIconResourceId(I)I"/>
+ <method name="getPresencePrecedence(I)I"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="CONTENT_URI"/>
+ <field name="PROFILE_CONTENT_URI" since="14"/>
+ </class>
+ <class name="android/provider/ContactsContract$StreamItemPhotos" since="15" deprecated="21" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/ContactsContract$StreamItemPhotosColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="PHOTO" deprecated="21"/>
+ </class>
+ <class name="android/provider/ContactsContract$StreamItemPhotosColumns" since="15" deprecated="21" removed="23">
+ <extends name="java/lang/Object"/>
+ <field name="PHOTO_FILE_ID" deprecated="21"/>
+ <field name="PHOTO_URI" deprecated="21"/>
+ <field name="SORT_INDEX" deprecated="21"/>
+ <field name="STREAM_ITEM_ID" deprecated="21"/>
+ <field name="SYNC1" deprecated="21"/>
+ <field name="SYNC2" deprecated="21"/>
+ <field name="SYNC3" deprecated="21"/>
+ <field name="SYNC4" deprecated="21"/>
+ </class>
+ <class name="android/provider/ContactsContract$StreamItems" since="15" deprecated="21" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/ContactsContract$StreamItemsColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_ITEM_TYPE" deprecated="21"/>
+ <field name="CONTENT_LIMIT_URI" deprecated="21"/>
+ <field name="CONTENT_PHOTO_URI" deprecated="21"/>
+ <field name="CONTENT_TYPE" deprecated="21"/>
+ <field name="CONTENT_URI" deprecated="21"/>
+ <field name="MAX_ITEMS" deprecated="21"/>
+ </class>
+ <class name="android/provider/ContactsContract$StreamItems$StreamItemPhotos" since="15" deprecated="21" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/ContactsContract$StreamItemPhotosColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_DIRECTORY" deprecated="21"/>
+ <field name="CONTENT_ITEM_TYPE" deprecated="21"/>
+ <field name="CONTENT_TYPE" deprecated="21"/>
+ </class>
+ <class name="android/provider/ContactsContract$StreamItemsColumns" since="15" deprecated="21" removed="23">
+ <extends name="java/lang/Object"/>
+ <field name="ACCOUNT_NAME" deprecated="21"/>
+ <field name="ACCOUNT_TYPE" deprecated="21"/>
+ <field name="COMMENTS" deprecated="21"/>
+ <field name="CONTACT_ID" deprecated="21"/>
+ <field name="CONTACT_LOOKUP_KEY" deprecated="21"/>
+ <field name="DATA_SET" deprecated="21"/>
+ <field name="RAW_CONTACT_ID" deprecated="21"/>
+ <field name="RAW_CONTACT_SOURCE_ID" deprecated="21"/>
+ <field name="RES_ICON" deprecated="21"/>
+ <field name="RES_LABEL" deprecated="21"/>
+ <field name="RES_PACKAGE" deprecated="21"/>
+ <field name="SYNC1" deprecated="21"/>
+ <field name="SYNC2" deprecated="21"/>
+ <field name="SYNC3" deprecated="21"/>
+ <field name="SYNC4" deprecated="21"/>
+ <field name="TEXT" deprecated="21"/>
+ <field name="TIMESTAMP" deprecated="21"/>
+ </class>
+ <class name="android/provider/ContactsContract$SyncColumns" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/ContactsContract$BaseSyncColumns"/>
+ <field name="ACCOUNT_NAME"/>
+ <field name="ACCOUNT_TYPE"/>
+ <field name="DIRTY"/>
+ <field name="SOURCE_ID"/>
+ <field name="VERSION"/>
+ </class>
+ <class name="android/provider/ContactsContract$SyncState" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/SyncStateContract$Columns"/>
+ <method name="&lt;init>()V"/>
+ <method name="get(Landroid/content/ContentProviderClient;Landroid/accounts/Account;)[B"/>
+ <method name="getWithUri(Landroid/content/ContentProviderClient;Landroid/accounts/Account;)Landroid/util/Pair;"/>
+ <method name="newSetOperation(Landroid/accounts/Account;[B)Landroid/content/ContentProviderOperation;"/>
+ <method name="set(Landroid/content/ContentProviderClient;Landroid/accounts/Account;[B)V"/>
+ <field name="CONTENT_DIRECTORY"/>
+ <field name="CONTENT_URI"/>
+ </class>
+ <class name="android/provider/DocumentsContract" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="buildChildDocumentsUri(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;"/>
+ <method name="buildChildDocumentsUriUsingTree(Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;" since="21"/>
+ <method name="buildDocumentUri(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;"/>
+ <method name="buildDocumentUriUsingTree(Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;" since="21"/>
+ <method name="buildRecentDocumentsUri(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;"/>
+ <method name="buildRootUri(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;"/>
+ <method name="buildRootsUri(Ljava/lang/String;)Landroid/net/Uri;"/>
+ <method name="buildSearchDocumentsUri(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;"/>
+ <method name="buildTreeDocumentUri(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;" since="21"/>
+ <method name="copyDocument(Landroid/content/ContentResolver;Landroid/net/Uri;Landroid/net/Uri;)Landroid/net/Uri;" since="24"/>
+ <method name="createDocument(Landroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;" since="21"/>
+ <method name="createWebLinkIntent(Landroid/content/ContentResolver;Landroid/net/Uri;Landroid/os/Bundle;)Landroid/content/IntentSender;" since="26"/>
+ <method name="deleteDocument(Landroid/content/ContentResolver;Landroid/net/Uri;)Z"/>
+ <method name="ejectRoot(Landroid/content/ContentResolver;Landroid/net/Uri;)V" since="26"/>
+ <method name="findDocumentPath(Landroid/content/ContentResolver;Landroid/net/Uri;)Landroid/provider/DocumentsContract$Path;" since="26"/>
+ <method name="getDocumentId(Landroid/net/Uri;)Ljava/lang/String;"/>
+ <method name="getDocumentThumbnail(Landroid/content/ContentResolver;Landroid/net/Uri;Landroid/graphics/Point;Landroid/os/CancellationSignal;)Landroid/graphics/Bitmap;"/>
+ <method name="getRootId(Landroid/net/Uri;)Ljava/lang/String;"/>
+ <method name="getSearchDocumentsQuery(Landroid/net/Uri;)Ljava/lang/String;"/>
+ <method name="getTreeDocumentId(Landroid/net/Uri;)Ljava/lang/String;" since="21"/>
+ <method name="isDocumentUri(Landroid/content/Context;Landroid/net/Uri;)Z"/>
+ <method name="isTreeUri(Landroid/net/Uri;)Z" since="24"/>
+ <method name="moveDocument(Landroid/content/ContentResolver;Landroid/net/Uri;Landroid/net/Uri;Landroid/net/Uri;)Landroid/net/Uri;" since="24"/>
+ <method name="removeDocument(Landroid/content/ContentResolver;Landroid/net/Uri;Landroid/net/Uri;)Z" since="24"/>
+ <method name="renameDocument(Landroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;" since="21"/>
+ <field name="ACTION_DOCUMENT_SETTINGS" since="26"/>
+ <field name="EXTRA_ERROR"/>
+ <field name="EXTRA_EXCLUDE_SELF" since="23"/>
+ <field name="EXTRA_INFO"/>
+ <field name="EXTRA_INITIAL_URI" since="26"/>
+ <field name="EXTRA_LOADING"/>
+ <field name="EXTRA_ORIENTATION" since="24"/>
+ <field name="EXTRA_PROMPT" since="23"/>
+ <field name="PROVIDER_INTERFACE"/>
+ </class>
+ <class name="android/provider/DocumentsContract$Document" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="COLUMN_DISPLAY_NAME"/>
+ <field name="COLUMN_DOCUMENT_ID"/>
+ <field name="COLUMN_FLAGS"/>
+ <field name="COLUMN_ICON"/>
+ <field name="COLUMN_LAST_MODIFIED"/>
+ <field name="COLUMN_MIME_TYPE"/>
+ <field name="COLUMN_SIZE"/>
+ <field name="COLUMN_SUMMARY"/>
+ <field name="FLAG_DIR_PREFERS_GRID"/>
+ <field name="FLAG_DIR_PREFERS_LAST_MODIFIED"/>
+ <field name="FLAG_DIR_SUPPORTS_CREATE"/>
+ <field name="FLAG_SUPPORTS_COPY" since="24"/>
+ <field name="FLAG_SUPPORTS_DELETE"/>
+ <field name="FLAG_SUPPORTS_MOVE" since="24"/>
+ <field name="FLAG_SUPPORTS_REMOVE" since="24"/>
+ <field name="FLAG_SUPPORTS_RENAME" since="21"/>
+ <field name="FLAG_SUPPORTS_SETTINGS" since="26"/>
+ <field name="FLAG_SUPPORTS_THUMBNAIL"/>
+ <field name="FLAG_SUPPORTS_WRITE"/>
+ <field name="FLAG_VIRTUAL_DOCUMENT" since="24"/>
+ <field name="FLAG_WEB_LINKABLE" since="26"/>
+ <field name="MIME_TYPE_DIR"/>
+ </class>
+ <class name="android/provider/DocumentsContract$Path" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/util/List;)V"/>
+ <method name="getPath()Ljava/util/List;"/>
+ <method name="getRootId()Ljava/lang/String;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/provider/DocumentsContract$Root" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="COLUMN_AVAILABLE_BYTES"/>
+ <field name="COLUMN_CAPACITY_BYTES" since="24"/>
+ <field name="COLUMN_DOCUMENT_ID"/>
+ <field name="COLUMN_FLAGS"/>
+ <field name="COLUMN_ICON"/>
+ <field name="COLUMN_MIME_TYPES"/>
+ <field name="COLUMN_ROOT_ID"/>
+ <field name="COLUMN_SUMMARY"/>
+ <field name="COLUMN_TITLE"/>
+ <field name="FLAG_LOCAL_ONLY"/>
+ <field name="FLAG_SUPPORTS_CREATE"/>
+ <field name="FLAG_SUPPORTS_EJECT" since="26"/>
+ <field name="FLAG_SUPPORTS_IS_CHILD" since="21"/>
+ <field name="FLAG_SUPPORTS_RECENTS"/>
+ <field name="FLAG_SUPPORTS_SEARCH"/>
+ <field name="MIME_TYPE_ITEM" since="26"/>
+ </class>
+ <class name="android/provider/DocumentsProvider" since="19">
+ <extends name="android/content/ContentProvider"/>
+ <method name="&lt;init>()V"/>
+ <method name="copyDocument(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" since="24"/>
+ <method name="createDocument(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="createWebLinkIntent(Ljava/lang/String;Landroid/os/Bundle;)Landroid/content/IntentSender;" since="26"/>
+ <method name="deleteDocument(Ljava/lang/String;)V"/>
+ <method name="ejectRoot(Ljava/lang/String;)V" since="26"/>
+ <method name="findDocumentPath(Ljava/lang/String;Ljava/lang/String;)Landroid/provider/DocumentsContract$Path;" since="26"/>
+ <method name="getDocumentStreamTypes(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;" since="24"/>
+ <method name="getDocumentType(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="isChildDocument(Ljava/lang/String;Ljava/lang/String;)Z" since="21"/>
+ <method name="moveDocument(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" since="24"/>
+ <method name="openDocument(Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/os/ParcelFileDescriptor;"/>
+ <method name="openDocumentThumbnail(Ljava/lang/String;Landroid/graphics/Point;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;"/>
+ <method name="openTypedDocument(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;" since="24"/>
+ <method name="queryChildDocuments(Ljava/lang/String;[Ljava/lang/String;Landroid/os/Bundle;)Landroid/database/Cursor;" since="26"/>
+ <method name="queryChildDocuments(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;"/>
+ <method name="queryDocument(Ljava/lang/String;[Ljava/lang/String;)Landroid/database/Cursor;"/>
+ <method name="queryRecentDocuments(Ljava/lang/String;[Ljava/lang/String;)Landroid/database/Cursor;"/>
+ <method name="queryRoots([Ljava/lang/String;)Landroid/database/Cursor;"/>
+ <method name="querySearchDocuments(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)Landroid/database/Cursor;"/>
+ <method name="removeDocument(Ljava/lang/String;Ljava/lang/String;)V" since="24"/>
+ <method name="renameDocument(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" since="21"/>
+ <method name="revokeDocumentPermission(Ljava/lang/String;)V" since="21"/>
+ </class>
+ <class name="android/provider/FontRequest" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V"/>
+ <method name="getCertificates()Ljava/util/List;"/>
+ <method name="getProviderAuthority()Ljava/lang/String;"/>
+ <method name="getProviderPackage()Ljava/lang/String;"/>
+ <method name="getQuery()Ljava/lang/String;"/>
+ </class>
+ <class name="android/provider/FontsContract" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="buildTypeface(Landroid/content/Context;Landroid/os/CancellationSignal;[Landroid/provider/FontsContract$FontInfo;)Landroid/graphics/Typeface;"/>
+ <method name="fetchFonts(Landroid/content/Context;Landroid/os/CancellationSignal;Landroid/provider/FontRequest;)Landroid/provider/FontsContract$FontFamilyResult;"/>
+ <method name="requestFonts(Landroid/content/Context;Landroid/provider/FontRequest;Landroid/os/Handler;Landroid/os/CancellationSignal;Landroid/provider/FontsContract$FontRequestCallback;)V"/>
+ </class>
+ <class name="android/provider/FontsContract$Columns" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="FILE_ID"/>
+ <field name="ITALIC"/>
+ <field name="RESULT_CODE"/>
+ <field name="RESULT_CODE_FONT_NOT_FOUND"/>
+ <field name="RESULT_CODE_FONT_UNAVAILABLE"/>
+ <field name="RESULT_CODE_MALFORMED_QUERY"/>
+ <field name="RESULT_CODE_OK"/>
+ <field name="TTC_INDEX"/>
+ <field name="VARIATION_SETTINGS"/>
+ <field name="WEIGHT"/>
+ </class>
+ <class name="android/provider/FontsContract$FontFamilyResult" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getFonts()[Landroid/provider/FontsContract$FontInfo;"/>
+ <method name="getStatusCode()I"/>
+ <field name="STATUS_OK"/>
+ <field name="STATUS_REJECTED"/>
+ <field name="STATUS_UNEXPECTED_DATA_PROVIDED"/>
+ <field name="STATUS_WRONG_CERTIFICATES"/>
+ </class>
+ <class name="android/provider/FontsContract$FontInfo" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAxes()[Landroid/graphics/fonts/FontVariationAxis;"/>
+ <method name="getResultCode()I"/>
+ <method name="getTtcIndex()I"/>
+ <method name="getUri()Landroid/net/Uri;"/>
+ <method name="getWeight()I"/>
+ <method name="isItalic()Z"/>
+ </class>
+ <class name="android/provider/FontsContract$FontRequestCallback" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onTypefaceRequestFailed(I)V"/>
+ <method name="onTypefaceRetrieved(Landroid/graphics/Typeface;)V"/>
+ <field name="FAIL_REASON_FONT_LOAD_ERROR"/>
+ <field name="FAIL_REASON_FONT_NOT_FOUND"/>
+ <field name="FAIL_REASON_FONT_UNAVAILABLE"/>
+ <field name="FAIL_REASON_MALFORMED_QUERY"/>
+ <field name="FAIL_REASON_PROVIDER_NOT_FOUND"/>
+ <field name="FAIL_REASON_WRONG_CERTIFICATES"/>
+ </class>
+ <class name="android/provider/LiveFolders" since="3" deprecated="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="ACTION_CREATE_LIVE_FOLDER"/>
+ <field name="DESCRIPTION"/>
+ <field name="DISPLAY_MODE_GRID"/>
+ <field name="DISPLAY_MODE_LIST"/>
+ <field name="EXTRA_LIVE_FOLDER_BASE_INTENT"/>
+ <field name="EXTRA_LIVE_FOLDER_DISPLAY_MODE"/>
+ <field name="EXTRA_LIVE_FOLDER_ICON"/>
+ <field name="EXTRA_LIVE_FOLDER_NAME"/>
+ <field name="ICON_BITMAP"/>
+ <field name="ICON_PACKAGE"/>
+ <field name="ICON_RESOURCE"/>
+ <field name="INTENT"/>
+ <field name="NAME"/>
+ </class>
+ <class name="android/provider/MediaStore" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDocumentUri(Landroid/content/Context;Landroid/net/Uri;)Landroid/net/Uri;" since="26"/>
+ <method name="getMediaScannerUri()Landroid/net/Uri;"/>
+ <method name="getVersion(Landroid/content/Context;)Ljava/lang/String;" since="12"/>
+ <field name="ACTION_IMAGE_CAPTURE" since="3"/>
+ <field name="ACTION_IMAGE_CAPTURE_SECURE" since="17"/>
+ <field name="ACTION_VIDEO_CAPTURE" since="3"/>
+ <field name="AUTHORITY"/>
+ <field name="EXTRA_DURATION_LIMIT" since="8"/>
+ <field name="EXTRA_FINISH_ON_COMPLETION" since="3"/>
+ <field name="EXTRA_FULL_SCREEN" since="8"/>
+ <field name="EXTRA_MEDIA_ALBUM" since="3"/>
+ <field name="EXTRA_MEDIA_ARTIST" since="3"/>
+ <field name="EXTRA_MEDIA_FOCUS" since="3"/>
+ <field name="EXTRA_MEDIA_GENRE" since="21"/>
+ <field name="EXTRA_MEDIA_PLAYLIST" since="21"/>
+ <field name="EXTRA_MEDIA_RADIO_CHANNEL" since="21"/>
+ <field name="EXTRA_MEDIA_TITLE" since="3"/>
+ <field name="EXTRA_OUTPUT" since="3"/>
+ <field name="EXTRA_SCREEN_ORIENTATION" since="3"/>
+ <field name="EXTRA_SHOW_ACTION_ICONS" since="8"/>
+ <field name="EXTRA_SIZE_LIMIT" since="8"/>
+ <field name="EXTRA_VIDEO_QUALITY" since="3"/>
+ <field name="INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH" since="9"/>
+ <field name="INTENT_ACTION_MEDIA_SEARCH" since="3"/>
+ <field name="INTENT_ACTION_MUSIC_PLAYER" since="8" deprecated="16"/>
+ <field name="INTENT_ACTION_STILL_IMAGE_CAMERA" since="3"/>
+ <field name="INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE" since="17"/>
+ <field name="INTENT_ACTION_TEXT_OPEN_FROM_SEARCH" since="17"/>
+ <field name="INTENT_ACTION_VIDEO_CAMERA" since="3"/>
+ <field name="INTENT_ACTION_VIDEO_PLAY_FROM_SEARCH" since="17"/>
+ <field name="MEDIA_IGNORE_FILENAME" since="9"/>
+ <field name="MEDIA_SCANNER_VOLUME"/>
+ <field name="META_DATA_STILL_IMAGE_CAMERA_PREWARM_SERVICE" since="23"/>
+ <field name="UNKNOWN_STRING" since="8"/>
+ </class>
+ <class name="android/provider/MediaStore$Audio" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="keyFor(Ljava/lang/String;)Ljava/lang/String;"/>
+ </class>
+ <class name="android/provider/MediaStore$Audio$AlbumColumns" since="1">
+ <extends name="java/lang/Object"/>
+ <field name="ALBUM"/>
+ <field name="ALBUM_ART"/>
+ <field name="ALBUM_ID"/>
+ <field name="ALBUM_KEY"/>
+ <field name="ARTIST"/>
+ <field name="FIRST_YEAR"/>
+ <field name="LAST_YEAR"/>
+ <field name="NUMBER_OF_SONGS"/>
+ <field name="NUMBER_OF_SONGS_FOR_ARTIST" since="3"/>
+ </class>
+ <class name="android/provider/MediaStore$Audio$Albums" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/MediaStore$Audio$AlbumColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="getContentUri(Ljava/lang/String;)Landroid/net/Uri;"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ <field name="ENTRY_CONTENT_TYPE"/>
+ <field name="EXTERNAL_CONTENT_URI"/>
+ <field name="INTERNAL_CONTENT_URI"/>
+ </class>
+ <class name="android/provider/MediaStore$Audio$ArtistColumns" since="1">
+ <extends name="java/lang/Object"/>
+ <field name="ARTIST"/>
+ <field name="ARTIST_KEY"/>
+ <field name="NUMBER_OF_ALBUMS"/>
+ <field name="NUMBER_OF_TRACKS"/>
+ </class>
+ <class name="android/provider/MediaStore$Audio$Artists" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/MediaStore$Audio$ArtistColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="getContentUri(Ljava/lang/String;)Landroid/net/Uri;"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ <field name="ENTRY_CONTENT_TYPE"/>
+ <field name="EXTERNAL_CONTENT_URI"/>
+ <field name="INTERNAL_CONTENT_URI"/>
+ </class>
+ <class name="android/provider/MediaStore$Audio$Artists$Albums" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/MediaStore$Audio$AlbumColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="getContentUri(Ljava/lang/String;J)Landroid/net/Uri;"/>
+ </class>
+ <class name="android/provider/MediaStore$Audio$AudioColumns" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/MediaStore$MediaColumns"/>
+ <field name="ALBUM"/>
+ <field name="ALBUM_ART" removed="14"/>
+ <field name="ALBUM_ID"/>
+ <field name="ALBUM_KEY"/>
+ <field name="ARTIST"/>
+ <field name="ARTIST_ID"/>
+ <field name="ARTIST_KEY"/>
+ <field name="BOOKMARK" since="8"/>
+ <field name="COMPOSER"/>
+ <field name="DURATION"/>
+ <field name="IS_ALARM"/>
+ <field name="IS_MUSIC"/>
+ <field name="IS_NOTIFICATION"/>
+ <field name="IS_PODCAST" since="8"/>
+ <field name="IS_RINGTONE"/>
+ <field name="TITLE_KEY"/>
+ <field name="TRACK"/>
+ <field name="YEAR"/>
+ </class>
+ <class name="android/provider/MediaStore$Audio$Genres" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/MediaStore$Audio$GenresColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="getContentUri(Ljava/lang/String;)Landroid/net/Uri;"/>
+ <method name="getContentUriForAudioId(Ljava/lang/String;I)Landroid/net/Uri;" since="11"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ <field name="ENTRY_CONTENT_TYPE"/>
+ <field name="EXTERNAL_CONTENT_URI"/>
+ <field name="INTERNAL_CONTENT_URI"/>
+ </class>
+ <class name="android/provider/MediaStore$Audio$Genres$Members" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/MediaStore$Audio$AudioColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="getContentUri(Ljava/lang/String;J)Landroid/net/Uri;"/>
+ <field name="AUDIO_ID"/>
+ <field name="CONTENT_DIRECTORY"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ <field name="GENRE_ID"/>
+ </class>
+ <class name="android/provider/MediaStore$Audio$GenresColumns" since="1">
+ <extends name="java/lang/Object"/>
+ <field name="NAME"/>
+ </class>
+ <class name="android/provider/MediaStore$Audio$Media" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/MediaStore$Audio$AudioColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="getContentUri(Ljava/lang/String;)Landroid/net/Uri;"/>
+ <method name="getContentUriForPath(Ljava/lang/String;)Landroid/net/Uri;"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ <field name="ENTRY_CONTENT_TYPE" since="21"/>
+ <field name="EXTERNAL_CONTENT_URI"/>
+ <field name="EXTRA_MAX_BYTES" since="3"/>
+ <field name="INTERNAL_CONTENT_URI"/>
+ <field name="RECORD_SOUND_ACTION"/>
+ </class>
+ <class name="android/provider/MediaStore$Audio$Playlists" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/MediaStore$Audio$PlaylistsColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="getContentUri(Ljava/lang/String;)Landroid/net/Uri;"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ <field name="ENTRY_CONTENT_TYPE"/>
+ <field name="EXTERNAL_CONTENT_URI"/>
+ <field name="INTERNAL_CONTENT_URI"/>
+ </class>
+ <class name="android/provider/MediaStore$Audio$Playlists$Members" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/MediaStore$Audio$AudioColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="getContentUri(Ljava/lang/String;J)Landroid/net/Uri;"/>
+ <method name="moveItem(Landroid/content/ContentResolver;JII)Z" since="8"/>
+ <field name="AUDIO_ID"/>
+ <field name="CONTENT_DIRECTORY"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ <field name="PLAYLIST_ID"/>
+ <field name="PLAY_ORDER"/>
+ <field name="_ID"/>
+ </class>
+ <class name="android/provider/MediaStore$Audio$PlaylistsColumns" since="1">
+ <extends name="java/lang/Object"/>
+ <field name="DATA"/>
+ <field name="DATE_ADDED"/>
+ <field name="DATE_MODIFIED"/>
+ <field name="NAME"/>
+ </class>
+ <class name="android/provider/MediaStore$Audio$Radio" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="ENTRY_CONTENT_TYPE"/>
+ </class>
+ <class name="android/provider/MediaStore$Files" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getContentUri(Ljava/lang/String;)Landroid/net/Uri;"/>
+ <method name="getContentUri(Ljava/lang/String;J)Landroid/net/Uri;"/>
+ </class>
+ <class name="android/provider/MediaStore$Files$FileColumns" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/MediaStore$MediaColumns"/>
+ <field name="MEDIA_TYPE"/>
+ <field name="MEDIA_TYPE_AUDIO"/>
+ <field name="MEDIA_TYPE_IMAGE"/>
+ <field name="MEDIA_TYPE_NONE"/>
+ <field name="MEDIA_TYPE_PLAYLIST"/>
+ <field name="MEDIA_TYPE_VIDEO"/>
+ <field name="MIME_TYPE"/>
+ <field name="PARENT"/>
+ <field name="TITLE"/>
+ </class>
+ <class name="android/provider/MediaStore$Images" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/provider/MediaStore$Images$ImageColumns" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/MediaStore$MediaColumns"/>
+ <field name="BUCKET_DISPLAY_NAME"/>
+ <field name="BUCKET_ID"/>
+ <field name="DATE_TAKEN"/>
+ <field name="DESCRIPTION"/>
+ <field name="IS_PRIVATE"/>
+ <field name="LATITUDE"/>
+ <field name="LONGITUDE"/>
+ <field name="MINI_THUMB_MAGIC"/>
+ <field name="ORIENTATION"/>
+ <field name="PICASA_ID"/>
+ </class>
+ <class name="android/provider/MediaStore$Images$Media" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/MediaStore$Images$ImageColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="getBitmap(Landroid/content/ContentResolver;Landroid/net/Uri;)Landroid/graphics/Bitmap;"/>
+ <method name="getContentUri(Ljava/lang/String;)Landroid/net/Uri;"/>
+ <method name="insertImage(Landroid/content/ContentResolver;Landroid/graphics/Bitmap;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="insertImage(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="query(Landroid/content/ContentResolver;Landroid/net/Uri;[Ljava/lang/String;)Landroid/database/Cursor;"/>
+ <method name="query(Landroid/content/ContentResolver;Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;"/>
+ <method name="query(Landroid/content/ContentResolver;Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ <field name="EXTERNAL_CONTENT_URI"/>
+ <field name="INTERNAL_CONTENT_URI"/>
+ </class>
+ <class name="android/provider/MediaStore$Images$Thumbnails" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="cancelThumbnailRequest(Landroid/content/ContentResolver;J)V" since="5"/>
+ <method name="cancelThumbnailRequest(Landroid/content/ContentResolver;JJ)V" since="8"/>
+ <method name="getContentUri(Ljava/lang/String;)Landroid/net/Uri;"/>
+ <method name="getThumbnail(Landroid/content/ContentResolver;JILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;" since="5"/>
+ <method name="getThumbnail(Landroid/content/ContentResolver;JJILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;" since="8"/>
+ <method name="query(Landroid/content/ContentResolver;Landroid/net/Uri;[Ljava/lang/String;)Landroid/database/Cursor;"/>
+ <method name="queryMiniThumbnail(Landroid/content/ContentResolver;JI[Ljava/lang/String;)Landroid/database/Cursor;"/>
+ <method name="queryMiniThumbnails(Landroid/content/ContentResolver;Landroid/net/Uri;I[Ljava/lang/String;)Landroid/database/Cursor;"/>
+ <field name="DATA"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ <field name="EXTERNAL_CONTENT_URI"/>
+ <field name="FULL_SCREEN_KIND"/>
+ <field name="HEIGHT"/>
+ <field name="IMAGE_ID"/>
+ <field name="INTERNAL_CONTENT_URI"/>
+ <field name="KIND"/>
+ <field name="MICRO_KIND"/>
+ <field name="MINI_KIND"/>
+ <field name="THUMB_DATA" since="5"/>
+ <field name="WIDTH"/>
+ </class>
+ <class name="android/provider/MediaStore$MediaColumns" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <field name="DATA"/>
+ <field name="DATE_ADDED"/>
+ <field name="DATE_MODIFIED"/>
+ <field name="DISPLAY_NAME"/>
+ <field name="HEIGHT" since="16"/>
+ <field name="MIME_TYPE"/>
+ <field name="SIZE"/>
+ <field name="TITLE"/>
+ <field name="WIDTH" since="16"/>
+ </class>
+ <class name="android/provider/MediaStore$Video" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="query(Landroid/content/ContentResolver;Landroid/net/Uri;[Ljava/lang/String;)Landroid/database/Cursor;"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ </class>
+ <class name="android/provider/MediaStore$Video$Media" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/MediaStore$Video$VideoColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="getContentUri(Ljava/lang/String;)Landroid/net/Uri;"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ <field name="EXTERNAL_CONTENT_URI"/>
+ <field name="INTERNAL_CONTENT_URI"/>
+ </class>
+ <class name="android/provider/MediaStore$Video$Thumbnails" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="cancelThumbnailRequest(Landroid/content/ContentResolver;J)V"/>
+ <method name="cancelThumbnailRequest(Landroid/content/ContentResolver;JJ)V" since="8"/>
+ <method name="getContentUri(Ljava/lang/String;)Landroid/net/Uri;"/>
+ <method name="getThumbnail(Landroid/content/ContentResolver;JILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;"/>
+ <method name="getThumbnail(Landroid/content/ContentResolver;JJILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;" since="8"/>
+ <field name="DATA"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ <field name="EXTERNAL_CONTENT_URI"/>
+ <field name="FULL_SCREEN_KIND"/>
+ <field name="HEIGHT"/>
+ <field name="INTERNAL_CONTENT_URI"/>
+ <field name="KIND"/>
+ <field name="MICRO_KIND"/>
+ <field name="MINI_KIND"/>
+ <field name="VIDEO_ID"/>
+ <field name="WIDTH"/>
+ </class>
+ <class name="android/provider/MediaStore$Video$VideoColumns" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/MediaStore$MediaColumns"/>
+ <field name="ALBUM"/>
+ <field name="ARTIST"/>
+ <field name="BOOKMARK" since="3"/>
+ <field name="BUCKET_DISPLAY_NAME" since="3"/>
+ <field name="BUCKET_ID" since="3"/>
+ <field name="CATEGORY"/>
+ <field name="DATE_TAKEN"/>
+ <field name="DESCRIPTION"/>
+ <field name="DURATION"/>
+ <field name="IS_PRIVATE"/>
+ <field name="LANGUAGE"/>
+ <field name="LATITUDE"/>
+ <field name="LONGITUDE"/>
+ <field name="MINI_THUMB_MAGIC"/>
+ <field name="RESOLUTION"/>
+ <field name="TAGS"/>
+ </class>
+ <class name="android/provider/OpenableColumns" since="1">
+ <extends name="java/lang/Object"/>
+ <field name="DISPLAY_NAME"/>
+ <field name="SIZE"/>
+ </class>
+ <class name="android/provider/SearchRecentSuggestions" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;Ljava/lang/String;I)V"/>
+ <method name="clearHistory()V"/>
+ <method name="saveRecentQuery(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="truncateHistory(Landroid/content/ContentResolver;I)V"/>
+ <field name="QUERIES_PROJECTION_1LINE"/>
+ <field name="QUERIES_PROJECTION_2LINE"/>
+ <field name="QUERIES_PROJECTION_DATE_INDEX"/>
+ <field name="QUERIES_PROJECTION_DISPLAY1_INDEX"/>
+ <field name="QUERIES_PROJECTION_DISPLAY2_INDEX"/>
+ <field name="QUERIES_PROJECTION_QUERY_INDEX"/>
+ </class>
+ <class name="android/provider/Settings" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="canDrawOverlays(Landroid/content/Context;)Z" since="23"/>
+ <field name="ACTION_ACCESSIBILITY_SETTINGS" since="5"/>
+ <field name="ACTION_ADD_ACCOUNT" since="8"/>
+ <field name="ACTION_AIRPLANE_MODE_SETTINGS" since="3"/>
+ <field name="ACTION_APN_SETTINGS"/>
+ <field name="ACTION_APPLICATION_DETAILS_SETTINGS" since="9"/>
+ <field name="ACTION_APPLICATION_DEVELOPMENT_SETTINGS" since="3"/>
+ <field name="ACTION_APPLICATION_SETTINGS"/>
+ <field name="ACTION_APP_NOTIFICATION_SETTINGS" since="26"/>
+ <field name="ACTION_BATTERY_SAVER_SETTINGS" since="22"/>
+ <field name="ACTION_BLUETOOTH_SETTINGS"/>
+ <field name="ACTION_CAPTIONING_SETTINGS" since="19"/>
+ <field name="ACTION_CAST_SETTINGS" since="21"/>
+ <field name="ACTION_CHANNEL_NOTIFICATION_SETTINGS" since="26"/>
+ <field name="ACTION_DATA_ROAMING_SETTINGS" since="3"/>
+ <field name="ACTION_DATE_SETTINGS"/>
+ <field name="ACTION_DEVICE_INFO_SETTINGS" since="8"/>
+ <field name="ACTION_DISPLAY_SETTINGS"/>
+ <field name="ACTION_DREAM_SETTINGS" since="18"/>
+ <field name="ACTION_HARD_KEYBOARD_SETTINGS" since="24"/>
+ <field name="ACTION_HOME_SETTINGS" since="21"/>
+ <field name="ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS" since="24"/>
+ <field name="ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS" since="23"/>
+ <field name="ACTION_INPUT_METHOD_SETTINGS" since="3"/>
+ <field name="ACTION_INPUT_METHOD_SUBTYPE_SETTINGS" since="11"/>
+ <field name="ACTION_INTERNAL_STORAGE_SETTINGS" since="3"/>
+ <field name="ACTION_LOCALE_SETTINGS"/>
+ <field name="ACTION_LOCATION_SOURCE_SETTINGS"/>
+ <field name="ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS" since="9"/>
+ <field name="ACTION_MANAGE_APPLICATIONS_SETTINGS" since="3"/>
+ <field name="ACTION_MANAGE_DEFAULT_APPS_SETTINGS" since="24"/>
+ <field name="ACTION_MANAGE_OVERLAY_PERMISSION" since="23"/>
+ <field name="ACTION_MANAGE_UNKNOWN_APP_SOURCES" since="26"/>
+ <field name="ACTION_MANAGE_WRITE_SETTINGS" since="23"/>
+ <field name="ACTION_MEMORY_CARD_SETTINGS" since="3"/>
+ <field name="ACTION_NETWORK_OPERATOR_SETTINGS" since="3"/>
+ <field name="ACTION_NFCSHARING_SETTINGS" since="14"/>
+ <field name="ACTION_NFC_PAYMENT_SETTINGS" since="19"/>
+ <field name="ACTION_NFC_SETTINGS" since="16"/>
+ <field name="ACTION_NIGHT_DISPLAY_SETTINGS" since="26"/>
+ <field name="ACTION_NOTIFICATION_LISTENER_SETTINGS" since="22"/>
+ <field name="ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS" since="23"/>
+ <field name="ACTION_PRINT_SETTINGS" since="19"/>
+ <field name="ACTION_PRIVACY_SETTINGS" since="5"/>
+ <field name="ACTION_QUICK_LAUNCH_SETTINGS" since="3"/>
+ <field name="ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" since="23"/>
+ <field name="ACTION_REQUEST_SET_AUTOFILL_SERVICE" since="26"/>
+ <field name="ACTION_SEARCH_SETTINGS" since="8"/>
+ <field name="ACTION_SECURITY_SETTINGS"/>
+ <field name="ACTION_SETTINGS"/>
+ <field name="ACTION_SHOW_REGULATORY_INFO" since="21"/>
+ <field name="ACTION_SOUND_SETTINGS"/>
+ <field name="ACTION_SYNC_SETTINGS" since="3"/>
+ <field name="ACTION_USAGE_ACCESS_SETTINGS" since="21"/>
+ <field name="ACTION_USER_DICTIONARY_SETTINGS" since="3"/>
+ <field name="ACTION_VOICE_CONTROL_AIRPLANE_MODE" since="23"/>
+ <field name="ACTION_VOICE_CONTROL_BATTERY_SAVER_MODE" since="23"/>
+ <field name="ACTION_VOICE_CONTROL_DO_NOT_DISTURB_MODE" since="23"/>
+ <field name="ACTION_VOICE_INPUT_SETTINGS" since="21"/>
+ <field name="ACTION_VPN_SETTINGS" since="24"/>
+ <field name="ACTION_VR_LISTENER_SETTINGS" since="24"/>
+ <field name="ACTION_WEBVIEW_SETTINGS" since="24"/>
+ <field name="ACTION_WIFI_IP_SETTINGS" since="3"/>
+ <field name="ACTION_WIFI_SETTINGS"/>
+ <field name="ACTION_WIRELESS_SETTINGS"/>
+ <field name="ACTION_ZEN_MODE_PRIORITY_SETTINGS" since="26"/>
+ <field name="AUTHORITY"/>
+ <field name="EXTRA_ACCOUNT_TYPES" since="18"/>
+ <field name="EXTRA_AIRPLANE_MODE_ENABLED" since="23"/>
+ <field name="EXTRA_APP_PACKAGE" since="26"/>
+ <field name="EXTRA_AUTHORITIES" since="8"/>
+ <field name="EXTRA_BATTERY_SAVER_MODE_ENABLED" since="23"/>
+ <field name="EXTRA_CHANNEL_ID" since="26"/>
+ <field name="EXTRA_DO_NOT_DISTURB_MODE_ENABLED" since="23"/>
+ <field name="EXTRA_DO_NOT_DISTURB_MODE_MINUTES" since="23"/>
+ <field name="EXTRA_INPUT_METHOD_ID" since="11"/>
+ <field name="INTENT_CATEGORY_USAGE_ACCESS_CONFIG" since="23"/>
+ <field name="METADATA_USAGE_ACCESS_REASON" since="23"/>
+ </class>
+ <class name="android/provider/Settings$Global" since="17">
+ <extends name="android/provider/Settings$NameValueTable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getFloat(Landroid/content/ContentResolver;Ljava/lang/String;)F"/>
+ <method name="getFloat(Landroid/content/ContentResolver;Ljava/lang/String;F)F"/>
+ <method name="getInt(Landroid/content/ContentResolver;Ljava/lang/String;)I"/>
+ <method name="getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I"/>
+ <method name="getLong(Landroid/content/ContentResolver;Ljava/lang/String;)J"/>
+ <method name="getLong(Landroid/content/ContentResolver;Ljava/lang/String;J)J"/>
+ <method name="getString(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getUriFor(Ljava/lang/String;)Landroid/net/Uri;"/>
+ <method name="putFloat(Landroid/content/ContentResolver;Ljava/lang/String;F)Z"/>
+ <method name="putInt(Landroid/content/ContentResolver;Ljava/lang/String;I)Z"/>
+ <method name="putLong(Landroid/content/ContentResolver;Ljava/lang/String;J)Z"/>
+ <method name="putString(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;)Z"/>
+ <field name="ADB_ENABLED"/>
+ <field name="AIRPLANE_MODE_ON"/>
+ <field name="AIRPLANE_MODE_RADIOS"/>
+ <field name="ALWAYS_FINISH_ACTIVITIES"/>
+ <field name="ANIMATOR_DURATION_SCALE"/>
+ <field name="AUTO_TIME"/>
+ <field name="AUTO_TIME_ZONE"/>
+ <field name="BLUETOOTH_ON"/>
+ <field name="BOOT_COUNT" since="24"/>
+ <field name="CONTACT_METADATA_SYNC_ENABLED" since="24"/>
+ <field name="CONTENT_URI"/>
+ <field name="DATA_ROAMING"/>
+ <field name="DEBUG_APP"/>
+ <field name="DEVELOPMENT_SETTINGS_ENABLED"/>
+ <field name="DEVICE_NAME" since="25"/>
+ <field name="DEVICE_PROVISIONED"/>
+ <field name="HTTP_PROXY"/>
+ <field name="INSTALL_NON_MARKET_APPS" deprecated="21"/>
+ <field name="MODE_RINGER"/>
+ <field name="NETWORK_PREFERENCE"/>
+ <field name="RADIO_BLUETOOTH"/>
+ <field name="RADIO_CELL"/>
+ <field name="RADIO_NFC"/>
+ <field name="RADIO_WIFI"/>
+ <field name="SHOW_PROCESSES" deprecated="26"/>
+ <field name="STAY_ON_WHILE_PLUGGED_IN"/>
+ <field name="SYS_PROP_SETTING_VERSION" removed="24"/>
+ <field name="TRANSITION_ANIMATION_SCALE"/>
+ <field name="USB_MASS_STORAGE_ENABLED"/>
+ <field name="USE_GOOGLE_MAIL"/>
+ <field name="WAIT_FOR_DEBUGGER"/>
+ <field name="WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN" since="23"/>
+ <field name="WIFI_MAX_DHCP_RETRY_COUNT"/>
+ <field name="WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS"/>
+ <field name="WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON" deprecated="26"/>
+ <field name="WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY"/>
+ <field name="WIFI_NUM_OPEN_NETWORKS_KEPT"/>
+ <field name="WIFI_ON"/>
+ <field name="WIFI_SLEEP_POLICY"/>
+ <field name="WIFI_SLEEP_POLICY_DEFAULT"/>
+ <field name="WIFI_SLEEP_POLICY_NEVER"/>
+ <field name="WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED"/>
+ <field name="WIFI_WATCHDOG_ON"/>
+ <field name="WINDOW_ANIMATION_SCALE"/>
+ </class>
+ <class name="android/provider/Settings$NameValueTable" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="getUriFor(Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;"/>
+ <method name="putString(Landroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;)Z"/>
+ <field name="NAME"/>
+ <field name="VALUE"/>
+ </class>
+ <class name="android/provider/Settings$Secure" since="3">
+ <extends name="android/provider/Settings$NameValueTable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getFloat(Landroid/content/ContentResolver;Ljava/lang/String;)F"/>
+ <method name="getFloat(Landroid/content/ContentResolver;Ljava/lang/String;F)F"/>
+ <method name="getInt(Landroid/content/ContentResolver;Ljava/lang/String;)I"/>
+ <method name="getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I"/>
+ <method name="getLong(Landroid/content/ContentResolver;Ljava/lang/String;)J"/>
+ <method name="getLong(Landroid/content/ContentResolver;Ljava/lang/String;J)J"/>
+ <method name="getString(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getUriFor(Ljava/lang/String;)Landroid/net/Uri;"/>
+ <method name="isLocationProviderEnabled(Landroid/content/ContentResolver;Ljava/lang/String;)Z" since="8" deprecated="19"/>
+ <method name="putFloat(Landroid/content/ContentResolver;Ljava/lang/String;F)Z"/>
+ <method name="putInt(Landroid/content/ContentResolver;Ljava/lang/String;I)Z"/>
+ <method name="putLong(Landroid/content/ContentResolver;Ljava/lang/String;J)Z"/>
+ <method name="putString(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;)Z"/>
+ <method name="setLocationProviderEnabled(Landroid/content/ContentResolver;Ljava/lang/String;Z)V" since="8" deprecated="19"/>
+ <field name="ACCESSIBILITY_DISPLAY_INVERSION_ENABLED" since="21"/>
+ <field name="ACCESSIBILITY_ENABLED" since="4"/>
+ <field name="ACCESSIBILITY_SPEAK_PASSWORD" since="15" deprecated="26"/>
+ <field name="ADB_ENABLED" deprecated="17"/>
+ <field name="ALLOWED_GEOLOCATION_ORIGINS" since="8"/>
+ <field name="ALLOW_MOCK_LOCATION" deprecated="23"/>
+ <field name="ANDROID_ID"/>
+ <field name="BACKGROUND_DATA" deprecated="16"/>
+ <field name="BLUETOOTH_ON" deprecated="17"/>
+ <field name="CONTENT_URI"/>
+ <field name="DATA_ROAMING" deprecated="17"/>
+ <field name="DEFAULT_INPUT_METHOD"/>
+ <field name="DEVELOPMENT_SETTINGS_ENABLED" since="16" deprecated="17"/>
+ <field name="DEVICE_PROVISIONED" deprecated="17"/>
+ <field name="ENABLED_ACCESSIBILITY_SERVICES" since="4"/>
+ <field name="ENABLED_INPUT_METHODS"/>
+ <field name="HTTP_PROXY" deprecated="17"/>
+ <field name="INPUT_METHOD_SELECTOR_VISIBILITY" since="11"/>
+ <field name="INSTALL_NON_MARKET_APPS" deprecated="17"/>
+ <field name="LOCATION_MODE" since="19"/>
+ <field name="LOCATION_MODE_BATTERY_SAVING" since="19"/>
+ <field name="LOCATION_MODE_HIGH_ACCURACY" since="19"/>
+ <field name="LOCATION_MODE_OFF" since="19"/>
+ <field name="LOCATION_MODE_SENSORS_ONLY" since="19"/>
+ <field name="LOCATION_PROVIDERS_ALLOWED" deprecated="19"/>
+ <field name="LOCK_PATTERN_ENABLED" since="8" deprecated="23"/>
+ <field name="LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED" since="8" deprecated="17"/>
+ <field name="LOCK_PATTERN_VISIBLE" since="8" deprecated="23"/>
+ <field name="LOGGING_ID" deprecated="16"/>
+ <field name="NETWORK_PREFERENCE" deprecated="17"/>
+ <field name="PARENTAL_CONTROL_ENABLED"/>
+ <field name="PARENTAL_CONTROL_LAST_UPDATE"/>
+ <field name="PARENTAL_CONTROL_REDIRECT_URL"/>
+ <field name="SELECTED_INPUT_METHOD_SUBTYPE" since="11"/>
+ <field name="SETTINGS_CLASSNAME"/>
+ <field name="SKIP_FIRST_USE_HINTS" since="21"/>
+ <field name="SYS_PROP_SETTING_VERSION" removed="24"/>
+ <field name="TOUCH_EXPLORATION_ENABLED" since="14"/>
+ <field name="TTS_DEFAULT_COUNTRY" since="4" deprecated="16"/>
+ <field name="TTS_DEFAULT_LANG" since="4" deprecated="16"/>
+ <field name="TTS_DEFAULT_PITCH" since="4"/>
+ <field name="TTS_DEFAULT_RATE" since="4"/>
+ <field name="TTS_DEFAULT_SYNTH" since="4"/>
+ <field name="TTS_DEFAULT_VARIANT" since="4" deprecated="16"/>
+ <field name="TTS_ENABLED_PLUGINS" since="8"/>
+ <field name="TTS_USE_DEFAULTS" since="4" deprecated="16"/>
+ <field name="USB_MASS_STORAGE_ENABLED" deprecated="17"/>
+ <field name="USE_GOOGLE_MAIL" deprecated="17"/>
+ <field name="WIFI_MAX_DHCP_RETRY_COUNT" deprecated="17"/>
+ <field name="WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS" deprecated="17"/>
+ <field name="WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON" deprecated="17"/>
+ <field name="WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY" deprecated="17"/>
+ <field name="WIFI_NUM_OPEN_NETWORKS_KEPT" deprecated="17"/>
+ <field name="WIFI_ON" deprecated="17"/>
+ <field name="WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE" deprecated="16"/>
+ <field name="WIFI_WATCHDOG_AP_COUNT" deprecated="16"/>
+ <field name="WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS" deprecated="16"/>
+ <field name="WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED" deprecated="16"/>
+ <field name="WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS" deprecated="16"/>
+ <field name="WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT" deprecated="16"/>
+ <field name="WIFI_WATCHDOG_MAX_AP_CHECKS" deprecated="16"/>
+ <field name="WIFI_WATCHDOG_ON" deprecated="17"/>
+ <field name="WIFI_WATCHDOG_PING_COUNT" deprecated="16"/>
+ <field name="WIFI_WATCHDOG_PING_DELAY_MS" deprecated="16"/>
+ <field name="WIFI_WATCHDOG_PING_TIMEOUT_MS" deprecated="16"/>
+ <field name="WIFI_WATCHDOG_WATCH_LIST" deprecated="16"/>
+ </class>
+ <class name="android/provider/Settings$SettingNotFoundException" since="1">
+ <extends name="android/util/AndroidException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/provider/Settings$System" since="1">
+ <extends name="android/provider/Settings$NameValueTable"/>
+ <method name="&lt;init>()V"/>
+ <method name="canWrite(Landroid/content/Context;)Z" since="23"/>
+ <method name="getConfiguration(Landroid/content/ContentResolver;Landroid/content/res/Configuration;)V"/>
+ <method name="getFloat(Landroid/content/ContentResolver;Ljava/lang/String;)F"/>
+ <method name="getFloat(Landroid/content/ContentResolver;Ljava/lang/String;F)F"/>
+ <method name="getInt(Landroid/content/ContentResolver;Ljava/lang/String;)I"/>
+ <method name="getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I"/>
+ <method name="getLong(Landroid/content/ContentResolver;Ljava/lang/String;)J" since="3"/>
+ <method name="getLong(Landroid/content/ContentResolver;Ljava/lang/String;J)J" since="3"/>
+ <method name="getShowGTalkServiceStatus(Landroid/content/ContentResolver;)Z" deprecated="17"/>
+ <method name="getString(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getUriFor(Ljava/lang/String;)Landroid/net/Uri;"/>
+ <method name="putConfiguration(Landroid/content/ContentResolver;Landroid/content/res/Configuration;)Z"/>
+ <method name="putFloat(Landroid/content/ContentResolver;Ljava/lang/String;F)Z"/>
+ <method name="putInt(Landroid/content/ContentResolver;Ljava/lang/String;I)Z"/>
+ <method name="putLong(Landroid/content/ContentResolver;Ljava/lang/String;J)Z" since="3"/>
+ <method name="putString(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;)Z"/>
+ <method name="setShowGTalkServiceStatus(Landroid/content/ContentResolver;Z)V" deprecated="17"/>
+ <field name="ACCELEROMETER_ROTATION" since="3"/>
+ <field name="ADB_ENABLED" deprecated="16"/>
+ <field name="AIRPLANE_MODE_ON" deprecated="17"/>
+ <field name="AIRPLANE_MODE_RADIOS" deprecated="17"/>
+ <field name="ALARM_ALERT" since="5"/>
+ <field name="ALWAYS_FINISH_ACTIVITIES" deprecated="17"/>
+ <field name="ANDROID_ID" deprecated="16"/>
+ <field name="ANIMATOR_DURATION_SCALE" since="16" deprecated="17"/>
+ <field name="APPEND_FOR_LAST_AUDIBLE" removed="23"/>
+ <field name="AUTO_TIME" deprecated="17"/>
+ <field name="AUTO_TIME_ZONE" since="11" deprecated="17"/>
+ <field name="BLUETOOTH_DISCOVERABILITY"/>
+ <field name="BLUETOOTH_DISCOVERABILITY_TIMEOUT"/>
+ <field name="BLUETOOTH_ON" deprecated="16"/>
+ <field name="CONTENT_URI"/>
+ <field name="DATA_ROAMING" deprecated="16"/>
+ <field name="DATE_FORMAT"/>
+ <field name="DEBUG_APP" deprecated="17"/>
+ <field name="DEFAULT_ALARM_ALERT_URI" since="5"/>
+ <field name="DEFAULT_NOTIFICATION_URI"/>
+ <field name="DEFAULT_RINGTONE_URI"/>
+ <field name="DEVICE_PROVISIONED" deprecated="16"/>
+ <field name="DIM_SCREEN" deprecated="17"/>
+ <field name="DTMF_TONE_TYPE_WHEN_DIALING" since="23"/>
+ <field name="DTMF_TONE_WHEN_DIALING"/>
+ <field name="END_BUTTON_BEHAVIOR"/>
+ <field name="FONT_SCALE"/>
+ <field name="HAPTIC_FEEDBACK_ENABLED" since="3"/>
+ <field name="HTTP_PROXY" deprecated="16"/>
+ <field name="INSTALL_NON_MARKET_APPS" deprecated="16"/>
+ <field name="LOCATION_PROVIDERS_ALLOWED" deprecated="16"/>
+ <field name="LOCK_PATTERN_ENABLED" deprecated="16"/>
+ <field name="LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED" since="3" deprecated="16"/>
+ <field name="LOCK_PATTERN_VISIBLE" deprecated="16"/>
+ <field name="LOGGING_ID" deprecated="16"/>
+ <field name="MODE_RINGER" deprecated="17"/>
+ <field name="MODE_RINGER_STREAMS_AFFECTED"/>
+ <field name="MUTE_STREAMS_AFFECTED"/>
+ <field name="NETWORK_PREFERENCE" deprecated="16"/>
+ <field name="NEXT_ALARM_FORMATTED" deprecated="21"/>
+ <field name="NOTIFICATION_SOUND"/>
+ <field name="PARENTAL_CONTROL_ENABLED" deprecated="16"/>
+ <field name="PARENTAL_CONTROL_LAST_UPDATE" deprecated="16"/>
+ <field name="PARENTAL_CONTROL_REDIRECT_URL" deprecated="16"/>
+ <field name="RADIO_BLUETOOTH" deprecated="17"/>
+ <field name="RADIO_CELL" deprecated="17"/>
+ <field name="RADIO_NFC" since="14" deprecated="17"/>
+ <field name="RADIO_WIFI" deprecated="17"/>
+ <field name="RINGTONE"/>
+ <field name="SCREEN_BRIGHTNESS"/>
+ <field name="SCREEN_BRIGHTNESS_MODE" since="8"/>
+ <field name="SCREEN_BRIGHTNESS_MODE_AUTOMATIC" since="8"/>
+ <field name="SCREEN_BRIGHTNESS_MODE_MANUAL" since="8"/>
+ <field name="SCREEN_OFF_TIMEOUT"/>
+ <field name="SETTINGS_CLASSNAME" deprecated="16"/>
+ <field name="SETUP_WIZARD_HAS_RUN"/>
+ <field name="SHOW_GTALK_SERVICE_STATUS"/>
+ <field name="SHOW_PROCESSES" deprecated="17"/>
+ <field name="SHOW_WEB_SUGGESTIONS" since="4" deprecated="16"/>
+ <field name="SOUND_EFFECTS_ENABLED"/>
+ <field name="STAY_ON_WHILE_PLUGGED_IN" deprecated="17"/>
+ <field name="SYS_PROP_SETTING_VERSION" removed="24"/>
+ <field name="TEXT_AUTO_CAPS"/>
+ <field name="TEXT_AUTO_PUNCTUATE"/>
+ <field name="TEXT_AUTO_REPLACE"/>
+ <field name="TEXT_SHOW_PASSWORD"/>
+ <field name="TIME_12_24"/>
+ <field name="TRANSITION_ANIMATION_SCALE" deprecated="17"/>
+ <field name="USB_MASS_STORAGE_ENABLED" deprecated="16"/>
+ <field name="USER_ROTATION" since="11"/>
+ <field name="USE_GOOGLE_MAIL" deprecated="16"/>
+ <field name="VIBRATE_ON"/>
+ <field name="VIBRATE_WHEN_RINGING" since="23"/>
+ <field name="VOLUME_ALARM" removed="23"/>
+ <field name="VOLUME_BLUETOOTH_SCO" since="8" removed="23"/>
+ <field name="VOLUME_MUSIC" removed="23"/>
+ <field name="VOLUME_NOTIFICATION" since="3" removed="23"/>
+ <field name="VOLUME_RING" removed="23"/>
+ <field name="VOLUME_SETTINGS" removed="23"/>
+ <field name="VOLUME_SYSTEM" removed="23"/>
+ <field name="VOLUME_VOICE" removed="23"/>
+ <field name="WAIT_FOR_DEBUGGER" deprecated="17"/>
+ <field name="WALLPAPER_ACTIVITY" deprecated="17"/>
+ <field name="WIFI_MAX_DHCP_RETRY_COUNT" since="3" deprecated="16"/>
+ <field name="WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS" since="3" deprecated="16"/>
+ <field name="WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON" deprecated="16"/>
+ <field name="WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY" deprecated="16"/>
+ <field name="WIFI_NUM_OPEN_NETWORKS_KEPT" deprecated="16"/>
+ <field name="WIFI_ON" deprecated="16"/>
+ <field name="WIFI_SLEEP_POLICY" since="3" deprecated="17"/>
+ <field name="WIFI_SLEEP_POLICY_DEFAULT" since="3" deprecated="17"/>
+ <field name="WIFI_SLEEP_POLICY_NEVER" since="3" deprecated="17"/>
+ <field name="WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED" since="3" deprecated="17"/>
+ <field name="WIFI_STATIC_DNS1" deprecated="17"/>
+ <field name="WIFI_STATIC_DNS2" deprecated="17"/>
+ <field name="WIFI_STATIC_GATEWAY" deprecated="17"/>
+ <field name="WIFI_STATIC_IP" deprecated="17"/>
+ <field name="WIFI_STATIC_NETMASK" deprecated="17"/>
+ <field name="WIFI_USE_STATIC_IP" deprecated="17"/>
+ <field name="WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE" deprecated="16"/>
+ <field name="WIFI_WATCHDOG_AP_COUNT" deprecated="16"/>
+ <field name="WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS" deprecated="16"/>
+ <field name="WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED" deprecated="16"/>
+ <field name="WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS" deprecated="16"/>
+ <field name="WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT" deprecated="16"/>
+ <field name="WIFI_WATCHDOG_MAX_AP_CHECKS" deprecated="16"/>
+ <field name="WIFI_WATCHDOG_ON" deprecated="16"/>
+ <field name="WIFI_WATCHDOG_PING_COUNT" deprecated="16"/>
+ <field name="WIFI_WATCHDOG_PING_DELAY_MS" deprecated="16"/>
+ <field name="WIFI_WATCHDOG_PING_TIMEOUT_MS" deprecated="16"/>
+ <field name="WINDOW_ANIMATION_SCALE" deprecated="17"/>
+ </class>
+ <class name="android/provider/SyncStateContract" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/provider/SyncStateContract$Columns" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <field name="ACCOUNT_NAME"/>
+ <field name="ACCOUNT_TYPE"/>
+ <field name="DATA"/>
+ </class>
+ <class name="android/provider/SyncStateContract$Constants" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/SyncStateContract$Columns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_DIRECTORY"/>
+ </class>
+ <class name="android/provider/SyncStateContract$Helpers" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="get(Landroid/content/ContentProviderClient;Landroid/net/Uri;Landroid/accounts/Account;)[B"/>
+ <method name="getWithUri(Landroid/content/ContentProviderClient;Landroid/net/Uri;Landroid/accounts/Account;)Landroid/util/Pair;"/>
+ <method name="insert(Landroid/content/ContentProviderClient;Landroid/net/Uri;Landroid/accounts/Account;[B)Landroid/net/Uri;"/>
+ <method name="newSetOperation(Landroid/net/Uri;Landroid/accounts/Account;[B)Landroid/content/ContentProviderOperation;"/>
+ <method name="newUpdateOperation(Landroid/net/Uri;[B)Landroid/content/ContentProviderOperation;"/>
+ <method name="set(Landroid/content/ContentProviderClient;Landroid/net/Uri;Landroid/accounts/Account;[B)V"/>
+ <method name="update(Landroid/content/ContentProviderClient;Landroid/net/Uri;[B)V"/>
+ </class>
+ <class name="android/provider/Telephony" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/provider/Telephony$BaseMmsColumns" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <field name="CONTENT_CLASS"/>
+ <field name="CONTENT_LOCATION"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="CREATOR" since="21"/>
+ <field name="DATE"/>
+ <field name="DATE_SENT"/>
+ <field name="DELIVERY_REPORT"/>
+ <field name="DELIVERY_TIME"/>
+ <field name="EXPIRY"/>
+ <field name="LOCKED"/>
+ <field name="MESSAGE_BOX"/>
+ <field name="MESSAGE_BOX_ALL"/>
+ <field name="MESSAGE_BOX_DRAFTS"/>
+ <field name="MESSAGE_BOX_FAILED" since="21"/>
+ <field name="MESSAGE_BOX_INBOX"/>
+ <field name="MESSAGE_BOX_OUTBOX"/>
+ <field name="MESSAGE_BOX_SENT"/>
+ <field name="MESSAGE_CLASS"/>
+ <field name="MESSAGE_ID"/>
+ <field name="MESSAGE_SIZE"/>
+ <field name="MESSAGE_TYPE"/>
+ <field name="MMS_VERSION"/>
+ <field name="PRIORITY"/>
+ <field name="READ"/>
+ <field name="READ_REPORT"/>
+ <field name="READ_STATUS"/>
+ <field name="REPORT_ALLOWED"/>
+ <field name="RESPONSE_STATUS"/>
+ <field name="RESPONSE_TEXT"/>
+ <field name="RETRIEVE_STATUS"/>
+ <field name="RETRIEVE_TEXT"/>
+ <field name="RETRIEVE_TEXT_CHARSET"/>
+ <field name="SEEN"/>
+ <field name="STATUS"/>
+ <field name="SUBJECT"/>
+ <field name="SUBJECT_CHARSET"/>
+ <field name="SUBSCRIPTION_ID" since="22"/>
+ <field name="TEXT_ONLY"/>
+ <field name="THREAD_ID"/>
+ <field name="TRANSACTION_ID"/>
+ </class>
+ <class name="android/provider/Telephony$CanonicalAddressesColumns" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <field name="ADDRESS"/>
+ </class>
+ <class name="android/provider/Telephony$Carriers" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="APN"/>
+ <field name="AUTH_TYPE"/>
+ <field name="BEARER"/>
+ <field name="CARRIER_ENABLED"/>
+ <field name="CONTENT_URI"/>
+ <field name="CURRENT"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ <field name="MCC"/>
+ <field name="MMSC"/>
+ <field name="MMSPORT"/>
+ <field name="MMSPROXY"/>
+ <field name="MNC"/>
+ <field name="MVNO_MATCH_DATA"/>
+ <field name="MVNO_TYPE"/>
+ <field name="NAME"/>
+ <field name="NUMERIC"/>
+ <field name="PASSWORD"/>
+ <field name="PORT"/>
+ <field name="PROTOCOL"/>
+ <field name="PROXY"/>
+ <field name="ROAMING_PROTOCOL"/>
+ <field name="SERVER"/>
+ <field name="SUBSCRIPTION_ID" since="22"/>
+ <field name="TYPE"/>
+ <field name="USER"/>
+ </class>
+ <class name="android/provider/Telephony$Mms" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/Telephony$BaseMmsColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_URI"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ <field name="REPORT_REQUEST_URI"/>
+ <field name="REPORT_STATUS_URI"/>
+ </class>
+ <class name="android/provider/Telephony$Mms$Addr" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="ADDRESS"/>
+ <field name="CHARSET"/>
+ <field name="CONTACT_ID"/>
+ <field name="MSG_ID"/>
+ <field name="TYPE"/>
+ </class>
+ <class name="android/provider/Telephony$Mms$Draft" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/Telephony$BaseMmsColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_URI"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ </class>
+ <class name="android/provider/Telephony$Mms$Inbox" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/Telephony$BaseMmsColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_URI"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ </class>
+ <class name="android/provider/Telephony$Mms$Intents" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_CHANGED_ACTION"/>
+ <field name="DELETED_CONTENTS"/>
+ </class>
+ <class name="android/provider/Telephony$Mms$Outbox" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/Telephony$BaseMmsColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_URI"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ </class>
+ <class name="android/provider/Telephony$Mms$Part" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CHARSET"/>
+ <field name="CONTENT_DISPOSITION"/>
+ <field name="CONTENT_ID"/>
+ <field name="CONTENT_LOCATION"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="CT_START"/>
+ <field name="CT_TYPE"/>
+ <field name="FILENAME"/>
+ <field name="MSG_ID"/>
+ <field name="NAME"/>
+ <field name="SEQ"/>
+ <field name="TEXT"/>
+ <field name="_DATA"/>
+ </class>
+ <class name="android/provider/Telephony$Mms$Rate" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_URI"/>
+ <field name="SENT_TIME"/>
+ </class>
+ <class name="android/provider/Telephony$Mms$Sent" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/Telephony$BaseMmsColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_URI"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ </class>
+ <class name="android/provider/Telephony$MmsSms" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_CONVERSATIONS_URI"/>
+ <field name="CONTENT_DRAFT_URI"/>
+ <field name="CONTENT_FILTER_BYPHONE_URI"/>
+ <field name="CONTENT_LOCKED_URI"/>
+ <field name="CONTENT_UNDELIVERED_URI"/>
+ <field name="CONTENT_URI"/>
+ <field name="ERR_TYPE_GENERIC"/>
+ <field name="ERR_TYPE_GENERIC_PERMANENT"/>
+ <field name="ERR_TYPE_MMS_PROTO_PERMANENT"/>
+ <field name="ERR_TYPE_MMS_PROTO_TRANSIENT"/>
+ <field name="ERR_TYPE_SMS_PROTO_PERMANENT"/>
+ <field name="ERR_TYPE_SMS_PROTO_TRANSIENT"/>
+ <field name="ERR_TYPE_TRANSPORT_FAILURE"/>
+ <field name="MMS_PROTO"/>
+ <field name="NO_ERROR"/>
+ <field name="SEARCH_URI"/>
+ <field name="SMS_PROTO"/>
+ <field name="TYPE_DISCRIMINATOR_COLUMN"/>
+ </class>
+ <class name="android/provider/Telephony$MmsSms$PendingMessages" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_URI"/>
+ <field name="DUE_TIME"/>
+ <field name="ERROR_CODE"/>
+ <field name="ERROR_TYPE"/>
+ <field name="LAST_TRY"/>
+ <field name="MSG_ID"/>
+ <field name="MSG_TYPE"/>
+ <field name="PROTO_TYPE"/>
+ <field name="RETRY_INDEX"/>
+ <field name="SUBSCRIPTION_ID" since="22"/>
+ </class>
+ <class name="android/provider/Telephony$ServiceStateTable" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getUriForSubscriptionId(I)Landroid/net/Uri;"/>
+ <method name="getUriForSubscriptionIdAndField(ILjava/lang/String;)Landroid/net/Uri;"/>
+ <field name="AUTHORITY"/>
+ <field name="CONTENT_URI"/>
+ <field name="IS_MANUAL_NETWORK_SELECTION"/>
+ <field name="VOICE_OPERATOR_NUMERIC"/>
+ <field name="VOICE_REG_STATE"/>
+ </class>
+ <class name="android/provider/Telephony$Sms" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/Telephony$TextBasedSmsColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDefaultSmsPackage(Landroid/content/Context;)Ljava/lang/String;"/>
+ <field name="CONTENT_URI"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ </class>
+ <class name="android/provider/Telephony$Sms$Conversations" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/Telephony$TextBasedSmsColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_URI"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ <field name="MESSAGE_COUNT"/>
+ <field name="SNIPPET"/>
+ </class>
+ <class name="android/provider/Telephony$Sms$Draft" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/Telephony$TextBasedSmsColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_URI"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ </class>
+ <class name="android/provider/Telephony$Sms$Inbox" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/Telephony$TextBasedSmsColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_URI"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ </class>
+ <class name="android/provider/Telephony$Sms$Intents" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getMessagesFromIntent(Landroid/content/Intent;)[Landroid/telephony/SmsMessage;"/>
+ <field name="ACTION_CHANGE_DEFAULT"/>
+ <field name="ACTION_DEFAULT_SMS_PACKAGE_CHANGED" since="24"/>
+ <field name="ACTION_EXTERNAL_PROVIDER_CHANGE" since="24"/>
+ <field name="DATA_SMS_RECEIVED_ACTION"/>
+ <field name="EXTRA_IS_DEFAULT_SMS_APP" since="24"/>
+ <field name="EXTRA_PACKAGE_NAME"/>
+ <field name="RESULT_SMS_DUPLICATED"/>
+ <field name="RESULT_SMS_GENERIC_ERROR"/>
+ <field name="RESULT_SMS_HANDLED"/>
+ <field name="RESULT_SMS_OUT_OF_MEMORY"/>
+ <field name="RESULT_SMS_UNSUPPORTED"/>
+ <field name="SIM_FULL_ACTION"/>
+ <field name="SMS_CB_RECEIVED_ACTION"/>
+ <field name="SMS_DELIVER_ACTION"/>
+ <field name="SMS_EMERGENCY_CB_RECEIVED_ACTION" removed="24"/>
+ <field name="SMS_RECEIVED_ACTION"/>
+ <field name="SMS_REJECTED_ACTION"/>
+ <field name="SMS_SERVICE_CATEGORY_PROGRAM_DATA_RECEIVED_ACTION"/>
+ <field name="WAP_PUSH_DELIVER_ACTION"/>
+ <field name="WAP_PUSH_RECEIVED_ACTION"/>
+ </class>
+ <class name="android/provider/Telephony$Sms$Outbox" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/Telephony$TextBasedSmsColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_URI"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ </class>
+ <class name="android/provider/Telephony$Sms$Sent" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/Telephony$TextBasedSmsColumns"/>
+ <method name="&lt;init>()V"/>
+ <field name="CONTENT_URI"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ </class>
+ <class name="android/provider/Telephony$TextBasedSmsColumns" since="19">
+ <extends name="java/lang/Object"/>
+ <field name="ADDRESS"/>
+ <field name="BODY"/>
+ <field name="CREATOR" since="21"/>
+ <field name="DATE"/>
+ <field name="DATE_SENT"/>
+ <field name="ERROR_CODE"/>
+ <field name="LOCKED"/>
+ <field name="MESSAGE_TYPE_ALL"/>
+ <field name="MESSAGE_TYPE_DRAFT"/>
+ <field name="MESSAGE_TYPE_FAILED"/>
+ <field name="MESSAGE_TYPE_INBOX"/>
+ <field name="MESSAGE_TYPE_OUTBOX"/>
+ <field name="MESSAGE_TYPE_QUEUED"/>
+ <field name="MESSAGE_TYPE_SENT"/>
+ <field name="PERSON"/>
+ <field name="PROTOCOL"/>
+ <field name="READ"/>
+ <field name="REPLY_PATH_PRESENT"/>
+ <field name="SEEN"/>
+ <field name="SERVICE_CENTER"/>
+ <field name="STATUS"/>
+ <field name="STATUS_COMPLETE"/>
+ <field name="STATUS_FAILED"/>
+ <field name="STATUS_NONE"/>
+ <field name="STATUS_PENDING"/>
+ <field name="SUBJECT"/>
+ <field name="SUBSCRIPTION_ID" since="22"/>
+ <field name="THREAD_ID"/>
+ <field name="TYPE"/>
+ </class>
+ <class name="android/provider/Telephony$Threads" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/Telephony$ThreadsColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="getOrCreateThreadId(Landroid/content/Context;Ljava/lang/String;)J" since="23"/>
+ <method name="getOrCreateThreadId(Landroid/content/Context;Ljava/util/Set;)J" since="23"/>
+ <field name="BROADCAST_THREAD"/>
+ <field name="COMMON_THREAD"/>
+ <field name="CONTENT_URI"/>
+ <field name="OBSOLETE_THREADS_URI"/>
+ </class>
+ <class name="android/provider/Telephony$ThreadsColumns" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <field name="ARCHIVED" since="21"/>
+ <field name="DATE"/>
+ <field name="ERROR"/>
+ <field name="HAS_ATTACHMENT"/>
+ <field name="MESSAGE_COUNT"/>
+ <field name="READ"/>
+ <field name="RECIPIENT_IDS"/>
+ <field name="SNIPPET"/>
+ <field name="SNIPPET_CHARSET"/>
+ <field name="TYPE"/>
+ </class>
+ <class name="android/provider/UserDictionary" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="AUTHORITY"/>
+ <field name="CONTENT_URI"/>
+ </class>
+ <class name="android/provider/UserDictionary$Words" since="3">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="addWord(Landroid/content/Context;Ljava/lang/String;II)V" deprecated="16"/>
+ <method name="addWord(Landroid/content/Context;Ljava/lang/String;ILjava/lang/String;Ljava/util/Locale;)V" since="16"/>
+ <field name="APP_ID"/>
+ <field name="CONTENT_ITEM_TYPE"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="CONTENT_URI"/>
+ <field name="DEFAULT_SORT_ORDER"/>
+ <field name="FREQUENCY"/>
+ <field name="LOCALE"/>
+ <field name="LOCALE_TYPE_ALL" deprecated="16"/>
+ <field name="LOCALE_TYPE_CURRENT" deprecated="16"/>
+ <field name="SHORTCUT" since="16"/>
+ <field name="WORD"/>
+ <field name="_ID"/>
+ </class>
+ <class name="android/provider/VoicemailContract" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="ACTION_FETCH_VOICEMAIL"/>
+ <field name="ACTION_NEW_VOICEMAIL"/>
+ <field name="ACTION_SYNC_VOICEMAIL" since="24"/>
+ <field name="AUTHORITY"/>
+ <field name="EXTRA_PHONE_ACCOUNT_HANDLE" since="25"/>
+ <field name="EXTRA_SELF_CHANGE"/>
+ <field name="PARAM_KEY_SOURCE_PACKAGE"/>
+ </class>
+ <class name="android/provider/VoicemailContract$Status" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="buildSourceUri(Ljava/lang/String;)Landroid/net/Uri;"/>
+ <field name="CONFIGURATION_STATE"/>
+ <field name="CONFIGURATION_STATE_CAN_BE_CONFIGURED"/>
+ <field name="CONFIGURATION_STATE_CONFIGURING" since="25"/>
+ <field name="CONFIGURATION_STATE_DISABLED" since="25"/>
+ <field name="CONFIGURATION_STATE_FAILED" since="25"/>
+ <field name="CONFIGURATION_STATE_NOT_CONFIGURED"/>
+ <field name="CONFIGURATION_STATE_OK"/>
+ <field name="CONTENT_URI"/>
+ <field name="DATA_CHANNEL_STATE"/>
+ <field name="DATA_CHANNEL_STATE_BAD_CONFIGURATION" since="24"/>
+ <field name="DATA_CHANNEL_STATE_COMMUNICATION_ERROR" since="24"/>
+ <field name="DATA_CHANNEL_STATE_NO_CONNECTION"/>
+ <field name="DATA_CHANNEL_STATE_NO_CONNECTION_CELLULAR_REQUIRED" since="24"/>
+ <field name="DATA_CHANNEL_STATE_OK"/>
+ <field name="DATA_CHANNEL_STATE_SERVER_CONNECTION_ERROR" since="24"/>
+ <field name="DATA_CHANNEL_STATE_SERVER_ERROR" since="24"/>
+ <field name="DIR_TYPE"/>
+ <field name="ITEM_TYPE"/>
+ <field name="NOTIFICATION_CHANNEL_STATE"/>
+ <field name="NOTIFICATION_CHANNEL_STATE_MESSAGE_WAITING"/>
+ <field name="NOTIFICATION_CHANNEL_STATE_NO_CONNECTION"/>
+ <field name="NOTIFICATION_CHANNEL_STATE_OK"/>
+ <field name="PHONE_ACCOUNT_COMPONENT_NAME" since="23"/>
+ <field name="PHONE_ACCOUNT_ID" since="23"/>
+ <field name="QUOTA_OCCUPIED" since="24"/>
+ <field name="QUOTA_TOTAL" since="24"/>
+ <field name="QUOTA_UNAVAILABLE" since="24"/>
+ <field name="SETTINGS_URI"/>
+ <field name="SOURCE_PACKAGE"/>
+ <field name="SOURCE_TYPE" since="25"/>
+ <field name="VOICEMAIL_ACCESS_URI"/>
+ </class>
+ <class name="android/provider/VoicemailContract$Voicemails" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/provider/BaseColumns"/>
+ <implements name="android/provider/OpenableColumns"/>
+ <method name="&lt;init>()V"/>
+ <method name="buildSourceUri(Ljava/lang/String;)Landroid/net/Uri;"/>
+ <field name="ARCHIVED" since="26"/>
+ <field name="BACKED_UP" since="26"/>
+ <field name="CONTENT_URI"/>
+ <field name="DATE"/>
+ <field name="DELETED" since="23"/>
+ <field name="DIRTY" since="23"/>
+ <field name="DIR_TYPE"/>
+ <field name="DURATION"/>
+ <field name="HAS_CONTENT"/>
+ <field name="IS_OMTP_VOICEMAIL" since="26"/>
+ <field name="IS_READ"/>
+ <field name="ITEM_TYPE"/>
+ <field name="LAST_MODIFIED" since="24"/>
+ <field name="MIME_TYPE"/>
+ <field name="NUMBER"/>
+ <field name="PHONE_ACCOUNT_COMPONENT_NAME" since="23"/>
+ <field name="PHONE_ACCOUNT_ID" since="23"/>
+ <field name="RESTORED" since="26"/>
+ <field name="SOURCE_DATA"/>
+ <field name="SOURCE_PACKAGE"/>
+ <field name="TRANSCRIPTION" since="21"/>
+ </class>
+ <class name="android/renderscript/Allocation" since="11">
+ <extends name="android/renderscript/BaseObj"/>
+ <method name="&lt;init>()V"/>
+ <method name="copy1DRangeFrom(IILandroid/renderscript/Allocation;I)V" since="14"/>
+ <method name="copy1DRangeFrom(IILjava/lang/Object;)V" since="21"/>
+ <method name="copy1DRangeFrom(II[B)V"/>
+ <method name="copy1DRangeFrom(II[F)V"/>
+ <method name="copy1DRangeFrom(II[I)V"/>
+ <method name="copy1DRangeFrom(II[S)V"/>
+ <method name="copy1DRangeFromUnchecked(IILjava/lang/Object;)V" since="21"/>
+ <method name="copy1DRangeFromUnchecked(II[B)V"/>
+ <method name="copy1DRangeFromUnchecked(II[F)V"/>
+ <method name="copy1DRangeFromUnchecked(II[I)V"/>
+ <method name="copy1DRangeFromUnchecked(II[S)V"/>
+ <method name="copy1DRangeTo(IILjava/lang/Object;)V" since="23"/>
+ <method name="copy1DRangeTo(II[B)V" since="23"/>
+ <method name="copy1DRangeTo(II[F)V" since="23"/>
+ <method name="copy1DRangeTo(II[I)V" since="23"/>
+ <method name="copy1DRangeTo(II[S)V" since="23"/>
+ <method name="copy1DRangeToUnchecked(IILjava/lang/Object;)V" since="23"/>
+ <method name="copy1DRangeToUnchecked(II[B)V" since="23"/>
+ <method name="copy1DRangeToUnchecked(II[F)V" since="23"/>
+ <method name="copy1DRangeToUnchecked(II[I)V" since="23"/>
+ <method name="copy1DRangeToUnchecked(II[S)V" since="23"/>
+ <method name="copy2DRangeFrom(IIIILandroid/renderscript/Allocation;II)V" since="14"/>
+ <method name="copy2DRangeFrom(IIIILjava/lang/Object;)V" since="21"/>
+ <method name="copy2DRangeFrom(IIII[B)V"/>
+ <method name="copy2DRangeFrom(IIII[F)V"/>
+ <method name="copy2DRangeFrom(IIII[I)V"/>
+ <method name="copy2DRangeFrom(IIII[S)V"/>
+ <method name="copy2DRangeFrom(IILandroid/graphics/Bitmap;)V"/>
+ <method name="copy2DRangeTo(IIIILjava/lang/Object;)V" since="23"/>
+ <method name="copy2DRangeTo(IIII[B)V" since="23"/>
+ <method name="copy2DRangeTo(IIII[F)V" since="23"/>
+ <method name="copy2DRangeTo(IIII[I)V" since="23"/>
+ <method name="copy2DRangeTo(IIII[S)V" since="23"/>
+ <method name="copy3DRangeFrom(IIIIIILandroid/renderscript/Allocation;III)V" since="23"/>
+ <method name="copy3DRangeFrom(IIIIIILjava/lang/Object;)V" since="23"/>
+ <method name="copy3DRangeTo(IIIIIILjava/lang/Object;)V" since="23"/>
+ <method name="copyFrom(Landroid/graphics/Bitmap;)V"/>
+ <method name="copyFrom(Landroid/renderscript/Allocation;)V" since="18"/>
+ <method name="copyFrom(Ljava/lang/Object;)V" since="21"/>
+ <method name="copyFrom([B)V"/>
+ <method name="copyFrom([F)V"/>
+ <method name="copyFrom([I)V"/>
+ <method name="copyFrom([Landroid/renderscript/BaseObj;)V"/>
+ <method name="copyFrom([S)V"/>
+ <method name="copyFromUnchecked(Ljava/lang/Object;)V" since="21"/>
+ <method name="copyFromUnchecked([B)V"/>
+ <method name="copyFromUnchecked([F)V"/>
+ <method name="copyFromUnchecked([I)V"/>
+ <method name="copyFromUnchecked([S)V"/>
+ <method name="copyTo(Landroid/graphics/Bitmap;)V"/>
+ <method name="copyTo(Ljava/lang/Object;)V" since="21"/>
+ <method name="copyTo([B)V"/>
+ <method name="copyTo([F)V"/>
+ <method name="copyTo([I)V"/>
+ <method name="copyTo([S)V"/>
+ <method name="createAllocations(Landroid/renderscript/RenderScript;Landroid/renderscript/Type;II)[Landroid/renderscript/Allocation;" since="24"/>
+ <method name="createCubemapFromBitmap(Landroid/renderscript/RenderScript;Landroid/graphics/Bitmap;)Landroid/renderscript/Allocation;"/>
+ <method name="createCubemapFromBitmap(Landroid/renderscript/RenderScript;Landroid/graphics/Bitmap;Landroid/renderscript/Allocation$MipmapControl;I)Landroid/renderscript/Allocation;"/>
+ <method name="createCubemapFromCubeFaces(Landroid/renderscript/RenderScript;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;)Landroid/renderscript/Allocation;"/>
+ <method name="createCubemapFromCubeFaces(Landroid/renderscript/RenderScript;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;Landroid/renderscript/Allocation$MipmapControl;I)Landroid/renderscript/Allocation;"/>
+ <method name="createFromBitmap(Landroid/renderscript/RenderScript;Landroid/graphics/Bitmap;)Landroid/renderscript/Allocation;"/>
+ <method name="createFromBitmap(Landroid/renderscript/RenderScript;Landroid/graphics/Bitmap;Landroid/renderscript/Allocation$MipmapControl;I)Landroid/renderscript/Allocation;"/>
+ <method name="createFromBitmapResource(Landroid/renderscript/RenderScript;Landroid/content/res/Resources;I)Landroid/renderscript/Allocation;"/>
+ <method name="createFromBitmapResource(Landroid/renderscript/RenderScript;Landroid/content/res/Resources;ILandroid/renderscript/Allocation$MipmapControl;I)Landroid/renderscript/Allocation;"/>
+ <method name="createFromString(Landroid/renderscript/RenderScript;Ljava/lang/String;I)Landroid/renderscript/Allocation;"/>
+ <method name="createSized(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;I)Landroid/renderscript/Allocation;"/>
+ <method name="createSized(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;II)Landroid/renderscript/Allocation;"/>
+ <method name="createTyped(Landroid/renderscript/RenderScript;Landroid/renderscript/Type;)Landroid/renderscript/Allocation;"/>
+ <method name="createTyped(Landroid/renderscript/RenderScript;Landroid/renderscript/Type;I)Landroid/renderscript/Allocation;"/>
+ <method name="createTyped(Landroid/renderscript/RenderScript;Landroid/renderscript/Type;Landroid/renderscript/Allocation$MipmapControl;I)Landroid/renderscript/Allocation;"/>
+ <method name="generateMipmaps()V"/>
+ <method name="getByteBuffer()Ljava/nio/ByteBuffer;" since="24"/>
+ <method name="getBytesSize()I" since="16"/>
+ <method name="getElement()Landroid/renderscript/Element;" since="16"/>
+ <method name="getStride()J" since="24"/>
+ <method name="getSurface()Landroid/view/Surface;" since="16"/>
+ <method name="getTimeStamp()J" since="24"/>
+ <method name="getType()Landroid/renderscript/Type;"/>
+ <method name="getUsage()I" since="16"/>
+ <method name="ioReceive()V" since="16"/>
+ <method name="ioSend()V" since="16"/>
+ <method name="resize(I)V" deprecated="18"/>
+ <method name="setAutoPadding(Z)V" since="23"/>
+ <method name="setFromFieldPacker(IIIILandroid/renderscript/FieldPacker;)V" since="23"/>
+ <method name="setFromFieldPacker(IILandroid/renderscript/FieldPacker;)V"/>
+ <method name="setFromFieldPacker(ILandroid/renderscript/FieldPacker;)V"/>
+ <method name="setOnBufferAvailableListener(Landroid/renderscript/Allocation$OnBufferAvailableListener;)V" since="19"/>
+ <method name="setSurface(Landroid/view/Surface;)V" since="16"/>
+ <method name="syncAll(I)V"/>
+ <field name="USAGE_GRAPHICS_CONSTANTS"/>
+ <field name="USAGE_GRAPHICS_RENDER_TARGET" since="14"/>
+ <field name="USAGE_GRAPHICS_TEXTURE"/>
+ <field name="USAGE_GRAPHICS_VERTEX"/>
+ <field name="USAGE_IO_INPUT" since="16"/>
+ <field name="USAGE_IO_OUTPUT" since="16"/>
+ <field name="USAGE_SCRIPT"/>
+ <field name="USAGE_SHARED" since="18"/>
+ </class>
+ <class name="android/renderscript/Allocation$MipmapControl" since="11">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/Allocation$MipmapControl;"/>
+ <method name="values()[Landroid/renderscript/Allocation$MipmapControl;"/>
+ <field name="MIPMAP_FULL"/>
+ <field name="MIPMAP_NONE"/>
+ <field name="MIPMAP_ON_SYNC_TO_TEXTURE"/>
+ </class>
+ <class name="android/renderscript/Allocation$OnBufferAvailableListener" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="onBufferAvailable(Landroid/renderscript/Allocation;)V"/>
+ </class>
+ <class name="android/renderscript/AllocationAdapter" since="11">
+ <extends name="android/renderscript/Allocation"/>
+ <method name="&lt;init>()V"/>
+ <method name="create1D(Landroid/renderscript/RenderScript;Landroid/renderscript/Allocation;)Landroid/renderscript/AllocationAdapter;" since="14"/>
+ <method name="create2D(Landroid/renderscript/RenderScript;Landroid/renderscript/Allocation;)Landroid/renderscript/AllocationAdapter;"/>
+ <method name="createTyped(Landroid/renderscript/RenderScript;Landroid/renderscript/Allocation;Landroid/renderscript/Type;)Landroid/renderscript/AllocationAdapter;" since="23"/>
+ <method name="readData([F)V" removed="14"/>
+ <method name="readData([I)V" removed="14"/>
+ <method name="setFace(Landroid/renderscript/Type$CubemapFace;)V"/>
+ <method name="setLOD(I)V"/>
+ <method name="setX(I)V" since="23"/>
+ <method name="setY(I)V"/>
+ <method name="setZ(I)V"/>
+ <method name="subData(ILandroid/renderscript/FieldPacker;)V" removed="14"/>
+ <method name="subData1D(II[B)V" removed="14"/>
+ <method name="subData1D(II[F)V" removed="14"/>
+ <method name="subData1D(II[I)V" removed="14"/>
+ <method name="subData1D(II[S)V" removed="14"/>
+ <method name="subData2D(IIII[F)V" removed="14"/>
+ <method name="subData2D(IIII[I)V" removed="14"/>
+ <method name="subElementData(IILandroid/renderscript/FieldPacker;)V" removed="14"/>
+ </class>
+ <class name="android/renderscript/BaseObj" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="destroy()V"/>
+ <method name="getName()Ljava/lang/String;" since="14"/>
+ <method name="setName(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/renderscript/Byte2" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(BB)V" since="14"/>
+ <field name="x"/>
+ <field name="y"/>
+ </class>
+ <class name="android/renderscript/Byte3" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(BBB)V" since="14"/>
+ <field name="x"/>
+ <field name="y"/>
+ <field name="z"/>
+ </class>
+ <class name="android/renderscript/Byte4" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(BBBB)V" since="14"/>
+ <field name="w"/>
+ <field name="x"/>
+ <field name="y"/>
+ <field name="z"/>
+ </class>
+ <class name="android/renderscript/Double2" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(DD)V"/>
+ <field name="x"/>
+ <field name="y"/>
+ </class>
+ <class name="android/renderscript/Double3" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(DDD)V"/>
+ <field name="x"/>
+ <field name="y"/>
+ <field name="z"/>
+ </class>
+ <class name="android/renderscript/Double4" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(DDDD)V"/>
+ <field name="w"/>
+ <field name="x"/>
+ <field name="y"/>
+ <field name="z"/>
+ </class>
+ <class name="android/renderscript/Element" since="11">
+ <extends name="android/renderscript/BaseObj"/>
+ <method name="&lt;init>()V"/>
+ <method name="ALLOCATION(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="A_8(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="BOOLEAN(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="ELEMENT(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="F16(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="23"/>
+ <method name="F16_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="23"/>
+ <method name="F16_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="23"/>
+ <method name="F16_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="23"/>
+ <method name="F32(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="F32_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="F32_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="F32_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="F64(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="F64_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14"/>
+ <method name="F64_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14"/>
+ <method name="F64_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14"/>
+ <method name="FONT(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="16"/>
+ <method name="I16(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="I16_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14"/>
+ <method name="I16_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14"/>
+ <method name="I16_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14"/>
+ <method name="I32(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="I32_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14"/>
+ <method name="I32_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14"/>
+ <method name="I32_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14"/>
+ <method name="I64(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="I64_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14"/>
+ <method name="I64_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14"/>
+ <method name="I64_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14"/>
+ <method name="I8(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="I8_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14"/>
+ <method name="I8_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14"/>
+ <method name="I8_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14"/>
+ <method name="MATRIX4X4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" deprecated="16"/>
+ <method name="MATRIX_2X2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="MATRIX_3X3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="MATRIX_4X4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="MESH(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="PROGRAM_FRAGMENT(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="PROGRAM_RASTER(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="PROGRAM_STORE(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="PROGRAM_VERTEX(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="RGBA_4444(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="RGBA_5551(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="RGBA_8888(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="RGB_565(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="RGB_888(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="SAMPLER(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="SCRIPT(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="TYPE(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="U16(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="U16_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14"/>
+ <method name="U16_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14"/>
+ <method name="U16_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14"/>
+ <method name="U32(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="U32_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14"/>
+ <method name="U32_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14"/>
+ <method name="U32_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14"/>
+ <method name="U64(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="U64_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14"/>
+ <method name="U64_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14"/>
+ <method name="U64_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14"/>
+ <method name="U8(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="U8_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14"/>
+ <method name="U8_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14"/>
+ <method name="U8_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;"/>
+ <method name="YUV(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="19"/>
+ <method name="createPixel(Landroid/renderscript/RenderScript;Landroid/renderscript/Element$DataType;Landroid/renderscript/Element$DataKind;)Landroid/renderscript/Element;"/>
+ <method name="createVector(Landroid/renderscript/RenderScript;Landroid/renderscript/Element$DataType;I)Landroid/renderscript/Element;"/>
+ <method name="getBytesSize()I" since="16"/>
+ <method name="getDataKind()Landroid/renderscript/Element$DataKind;" since="16"/>
+ <method name="getDataType()Landroid/renderscript/Element$DataType;" since="16"/>
+ <method name="getSubElement(I)Landroid/renderscript/Element;" since="16"/>
+ <method name="getSubElementArraySize(I)I" since="16"/>
+ <method name="getSubElementCount()I" since="16"/>
+ <method name="getSubElementName(I)Ljava/lang/String;" since="16"/>
+ <method name="getSubElementOffsetBytes(I)I" since="16"/>
+ <method name="getVectorSize()I" since="16"/>
+ <method name="isCompatible(Landroid/renderscript/Element;)Z" since="14"/>
+ <method name="isComplex()Z"/>
+ </class>
+ <class name="android/renderscript/Element$Builder" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;)V"/>
+ <method name="add(Landroid/renderscript/Element;Ljava/lang/String;)Landroid/renderscript/Element$Builder;"/>
+ <method name="add(Landroid/renderscript/Element;Ljava/lang/String;I)Landroid/renderscript/Element$Builder;"/>
+ <method name="create()Landroid/renderscript/Element;"/>
+ </class>
+ <class name="android/renderscript/Element$DataKind" since="11">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/Element$DataKind;"/>
+ <method name="values()[Landroid/renderscript/Element$DataKind;"/>
+ <field name="PIXEL_A"/>
+ <field name="PIXEL_DEPTH" since="14"/>
+ <field name="PIXEL_L"/>
+ <field name="PIXEL_LA"/>
+ <field name="PIXEL_RGB"/>
+ <field name="PIXEL_RGBA"/>
+ <field name="PIXEL_YUV" since="18"/>
+ <field name="USER"/>
+ </class>
+ <class name="android/renderscript/Element$DataType" since="11">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/Element$DataType;"/>
+ <method name="values()[Landroid/renderscript/Element$DataType;"/>
+ <field name="BOOLEAN"/>
+ <field name="FLOAT_16" since="23"/>
+ <field name="FLOAT_32"/>
+ <field name="FLOAT_64"/>
+ <field name="MATRIX_2X2"/>
+ <field name="MATRIX_3X3"/>
+ <field name="MATRIX_4X4"/>
+ <field name="NONE" since="16"/>
+ <field name="RS_ALLOCATION"/>
+ <field name="RS_ELEMENT"/>
+ <field name="RS_FONT" since="16"/>
+ <field name="RS_MESH"/>
+ <field name="RS_PROGRAM_FRAGMENT"/>
+ <field name="RS_PROGRAM_RASTER"/>
+ <field name="RS_PROGRAM_STORE"/>
+ <field name="RS_PROGRAM_VERTEX"/>
+ <field name="RS_SAMPLER"/>
+ <field name="RS_SCRIPT"/>
+ <field name="RS_TYPE"/>
+ <field name="SIGNED_16"/>
+ <field name="SIGNED_32"/>
+ <field name="SIGNED_64"/>
+ <field name="SIGNED_8"/>
+ <field name="UNSIGNED_16"/>
+ <field name="UNSIGNED_32"/>
+ <field name="UNSIGNED_4_4_4_4"/>
+ <field name="UNSIGNED_5_5_5_1"/>
+ <field name="UNSIGNED_5_6_5"/>
+ <field name="UNSIGNED_64"/>
+ <field name="UNSIGNED_8"/>
+ </class>
+ <class name="android/renderscript/FieldPacker" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>([B)V" since="18"/>
+ <method name="addBoolean(Z)V"/>
+ <method name="addF32(F)V"/>
+ <method name="addF32(Landroid/renderscript/Float2;)V"/>
+ <method name="addF32(Landroid/renderscript/Float3;)V"/>
+ <method name="addF32(Landroid/renderscript/Float4;)V"/>
+ <method name="addF64(D)V"/>
+ <method name="addF64(Landroid/renderscript/Double2;)V" since="14"/>
+ <method name="addF64(Landroid/renderscript/Double3;)V" since="14"/>
+ <method name="addF64(Landroid/renderscript/Double4;)V" since="14"/>
+ <method name="addI16(Landroid/renderscript/Short2;)V"/>
+ <method name="addI16(Landroid/renderscript/Short3;)V"/>
+ <method name="addI16(Landroid/renderscript/Short4;)V"/>
+ <method name="addI16(S)V"/>
+ <method name="addI32(I)V"/>
+ <method name="addI32(Landroid/renderscript/Int2;)V"/>
+ <method name="addI32(Landroid/renderscript/Int3;)V"/>
+ <method name="addI32(Landroid/renderscript/Int4;)V"/>
+ <method name="addI64(J)V"/>
+ <method name="addI64(Landroid/renderscript/Long2;)V" since="14"/>
+ <method name="addI64(Landroid/renderscript/Long3;)V" since="14"/>
+ <method name="addI64(Landroid/renderscript/Long4;)V" since="14"/>
+ <method name="addI8(B)V"/>
+ <method name="addI8(Landroid/renderscript/Byte2;)V"/>
+ <method name="addI8(Landroid/renderscript/Byte3;)V"/>
+ <method name="addI8(Landroid/renderscript/Byte4;)V"/>
+ <method name="addMatrix(Landroid/renderscript/Matrix2f;)V"/>
+ <method name="addMatrix(Landroid/renderscript/Matrix3f;)V"/>
+ <method name="addMatrix(Landroid/renderscript/Matrix4f;)V"/>
+ <method name="addObj(Landroid/renderscript/BaseObj;)V"/>
+ <method name="addU16(I)V"/>
+ <method name="addU16(Landroid/renderscript/Int2;)V"/>
+ <method name="addU16(Landroid/renderscript/Int3;)V"/>
+ <method name="addU16(Landroid/renderscript/Int4;)V"/>
+ <method name="addU32(J)V"/>
+ <method name="addU32(Landroid/renderscript/Long2;)V"/>
+ <method name="addU32(Landroid/renderscript/Long3;)V"/>
+ <method name="addU32(Landroid/renderscript/Long4;)V"/>
+ <method name="addU64(J)V"/>
+ <method name="addU64(Landroid/renderscript/Long2;)V" since="14"/>
+ <method name="addU64(Landroid/renderscript/Long3;)V" since="14"/>
+ <method name="addU64(Landroid/renderscript/Long4;)V" since="14"/>
+ <method name="addU8(Landroid/renderscript/Short2;)V"/>
+ <method name="addU8(Landroid/renderscript/Short3;)V"/>
+ <method name="addU8(Landroid/renderscript/Short4;)V"/>
+ <method name="addU8(S)V"/>
+ <method name="align(I)V"/>
+ <method name="getData()[B"/>
+ <method name="reset()V"/>
+ <method name="reset(I)V"/>
+ <method name="skip(I)V"/>
+ <method name="subBoolean()Z" since="18"/>
+ <method name="subByte2()Landroid/renderscript/Byte2;" since="18"/>
+ <method name="subByte3()Landroid/renderscript/Byte3;" since="18"/>
+ <method name="subByte4()Landroid/renderscript/Byte4;" since="18"/>
+ <method name="subDouble2()Landroid/renderscript/Double2;" since="18"/>
+ <method name="subDouble3()Landroid/renderscript/Double3;" since="18"/>
+ <method name="subDouble4()Landroid/renderscript/Double4;" since="18"/>
+ <method name="subF32()F" since="18"/>
+ <method name="subF64()D" since="18"/>
+ <method name="subFloat2()Landroid/renderscript/Float2;" since="18"/>
+ <method name="subFloat3()Landroid/renderscript/Float3;" since="18"/>
+ <method name="subFloat4()Landroid/renderscript/Float4;" since="18"/>
+ <method name="subI16()S" since="18"/>
+ <method name="subI32()I" since="18"/>
+ <method name="subI64()J" since="18"/>
+ <method name="subI8()B" since="18"/>
+ <method name="subInt2()Landroid/renderscript/Int2;" since="18"/>
+ <method name="subInt3()Landroid/renderscript/Int3;" since="18"/>
+ <method name="subInt4()Landroid/renderscript/Int4;" since="18"/>
+ <method name="subLong2()Landroid/renderscript/Long2;" since="18"/>
+ <method name="subLong3()Landroid/renderscript/Long3;" since="18"/>
+ <method name="subLong4()Landroid/renderscript/Long4;" since="18"/>
+ <method name="subMatrix2f()Landroid/renderscript/Matrix2f;" since="18"/>
+ <method name="subMatrix3f()Landroid/renderscript/Matrix3f;" since="18"/>
+ <method name="subMatrix4f()Landroid/renderscript/Matrix4f;" since="18"/>
+ <method name="subShort2()Landroid/renderscript/Short2;" since="18"/>
+ <method name="subShort3()Landroid/renderscript/Short3;" since="18"/>
+ <method name="subShort4()Landroid/renderscript/Short4;" since="18"/>
+ <method name="subalign(I)V" since="18"/>
+ </class>
+ <class name="android/renderscript/FileA3D" since="11" deprecated="16" removed="18">
+ <extends name="android/renderscript/BaseObj"/>
+ <method name="&lt;init>()V"/>
+ <method name="createFromAsset(Landroid/renderscript/RenderScript;Landroid/content/res/AssetManager;Ljava/lang/String;)Landroid/renderscript/FileA3D;" deprecated="16"/>
+ <method name="createFromFile(Landroid/renderscript/RenderScript;Ljava/io/File;)Landroid/renderscript/FileA3D;" deprecated="16"/>
+ <method name="createFromFile(Landroid/renderscript/RenderScript;Ljava/lang/String;)Landroid/renderscript/FileA3D;" deprecated="16"/>
+ <method name="createFromResource(Landroid/renderscript/RenderScript;Landroid/content/res/Resources;I)Landroid/renderscript/FileA3D;" deprecated="16"/>
+ <method name="getIndexEntry(I)Landroid/renderscript/FileA3D$IndexEntry;" deprecated="16"/>
+ <method name="getIndexEntryCount()I" deprecated="16"/>
+ </class>
+ <class name="android/renderscript/FileA3D$EntryType" since="11" deprecated="16" removed="18">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/FileA3D$EntryType;"/>
+ <method name="values()[Landroid/renderscript/FileA3D$EntryType;"/>
+ <field name="MESH"/>
+ <field name="UNKNOWN"/>
+ </class>
+ <class name="android/renderscript/FileA3D$IndexEntry" since="11" deprecated="16" removed="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getEntryType()Landroid/renderscript/FileA3D$EntryType;" deprecated="16"/>
+ <method name="getMesh()Landroid/renderscript/Mesh;" deprecated="16"/>
+ <method name="getName()Ljava/lang/String;" deprecated="16"/>
+ <method name="getObject()Landroid/renderscript/BaseObj;" deprecated="16"/>
+ </class>
+ <class name="android/renderscript/Float2" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(FF)V"/>
+ <field name="x"/>
+ <field name="y"/>
+ </class>
+ <class name="android/renderscript/Float3" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(FFF)V"/>
+ <field name="x"/>
+ <field name="y"/>
+ <field name="z"/>
+ </class>
+ <class name="android/renderscript/Float4" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(FFFF)V"/>
+ <field name="w"/>
+ <field name="x"/>
+ <field name="y"/>
+ <field name="z"/>
+ </class>
+ <class name="android/renderscript/Font" since="11" deprecated="16" removed="18">
+ <extends name="android/renderscript/BaseObj"/>
+ <method name="&lt;init>()V"/>
+ <method name="create(Landroid/renderscript/RenderScript;Landroid/content/res/Resources;Ljava/lang/String;Landroid/renderscript/Font$Style;F)Landroid/renderscript/Font;" deprecated="16"/>
+ <method name="createFromAsset(Landroid/renderscript/RenderScript;Landroid/content/res/Resources;Ljava/lang/String;F)Landroid/renderscript/Font;" deprecated="16"/>
+ <method name="createFromFile(Landroid/renderscript/RenderScript;Landroid/content/res/Resources;Ljava/io/File;F)Landroid/renderscript/Font;" deprecated="16"/>
+ <method name="createFromFile(Landroid/renderscript/RenderScript;Landroid/content/res/Resources;Ljava/lang/String;F)Landroid/renderscript/Font;" deprecated="16"/>
+ <method name="createFromResource(Landroid/renderscript/RenderScript;Landroid/content/res/Resources;IF)Landroid/renderscript/Font;" deprecated="16"/>
+ </class>
+ <class name="android/renderscript/Font$Style" since="11" deprecated="16" removed="18">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/Font$Style;"/>
+ <method name="values()[Landroid/renderscript/Font$Style;"/>
+ <field name="BOLD"/>
+ <field name="BOLD_ITALIC"/>
+ <field name="ITALIC"/>
+ <field name="NORMAL"/>
+ </class>
+ <class name="android/renderscript/Int2" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(II)V" since="14"/>
+ <field name="x"/>
+ <field name="y"/>
+ </class>
+ <class name="android/renderscript/Int3" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(III)V" since="14"/>
+ <field name="x"/>
+ <field name="y"/>
+ <field name="z"/>
+ </class>
+ <class name="android/renderscript/Int4" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(IIII)V" since="14"/>
+ <field name="w"/>
+ <field name="x"/>
+ <field name="y"/>
+ <field name="z"/>
+ </class>
+ <class name="android/renderscript/Long2" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(JJ)V" since="14"/>
+ <field name="x"/>
+ <field name="y"/>
+ </class>
+ <class name="android/renderscript/Long3" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(JJJ)V" since="14"/>
+ <field name="x"/>
+ <field name="y"/>
+ <field name="z"/>
+ </class>
+ <class name="android/renderscript/Long4" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(JJJJ)V" since="14"/>
+ <field name="w"/>
+ <field name="x"/>
+ <field name="y"/>
+ <field name="z"/>
+ </class>
+ <class name="android/renderscript/Matrix2f" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>([F)V"/>
+ <method name="get(II)F"/>
+ <method name="getArray()[F"/>
+ <method name="load(Landroid/renderscript/Matrix2f;)V"/>
+ <method name="loadIdentity()V"/>
+ <method name="loadMultiply(Landroid/renderscript/Matrix2f;Landroid/renderscript/Matrix2f;)V"/>
+ <method name="loadRotate(F)V"/>
+ <method name="loadScale(FF)V"/>
+ <method name="multiply(Landroid/renderscript/Matrix2f;)V"/>
+ <method name="rotate(F)V"/>
+ <method name="scale(FF)V"/>
+ <method name="set(IIF)V"/>
+ <method name="transpose()V"/>
+ </class>
+ <class name="android/renderscript/Matrix3f" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>([F)V"/>
+ <method name="get(II)F"/>
+ <method name="getArray()[F"/>
+ <method name="load(Landroid/renderscript/Matrix3f;)V"/>
+ <method name="loadIdentity()V"/>
+ <method name="loadMultiply(Landroid/renderscript/Matrix3f;Landroid/renderscript/Matrix3f;)V"/>
+ <method name="loadRotate(F)V"/>
+ <method name="loadRotate(FFFF)V"/>
+ <method name="loadScale(FF)V"/>
+ <method name="loadScale(FFF)V"/>
+ <method name="loadTranslate(FF)V"/>
+ <method name="multiply(Landroid/renderscript/Matrix3f;)V"/>
+ <method name="rotate(F)V"/>
+ <method name="rotate(FFFF)V"/>
+ <method name="scale(FF)V"/>
+ <method name="scale(FFF)V"/>
+ <method name="set(IIF)V"/>
+ <method name="translate(FF)V"/>
+ <method name="transpose()V"/>
+ </class>
+ <class name="android/renderscript/Matrix4f" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>([F)V"/>
+ <method name="get(II)F"/>
+ <method name="getArray()[F"/>
+ <method name="inverse()Z"/>
+ <method name="inverseTranspose()Z"/>
+ <method name="load(Landroid/renderscript/Matrix4f;)V"/>
+ <method name="loadFrustum(FFFFFF)V"/>
+ <method name="loadIdentity()V"/>
+ <method name="loadMultiply(Landroid/renderscript/Matrix4f;Landroid/renderscript/Matrix4f;)V"/>
+ <method name="loadOrtho(FFFFFF)V"/>
+ <method name="loadOrthoWindow(II)V"/>
+ <method name="loadPerspective(FFFF)V"/>
+ <method name="loadProjectionNormalized(II)V"/>
+ <method name="loadRotate(FFFF)V"/>
+ <method name="loadScale(FFF)V"/>
+ <method name="loadTranslate(FFF)V"/>
+ <method name="multiply(Landroid/renderscript/Matrix4f;)V"/>
+ <method name="rotate(FFFF)V"/>
+ <method name="scale(FFF)V"/>
+ <method name="set(IIF)V"/>
+ <method name="translate(FFF)V"/>
+ <method name="transpose()V"/>
+ </class>
+ <class name="android/renderscript/Mesh" since="11" deprecated="16" removed="18">
+ <extends name="android/renderscript/BaseObj"/>
+ <method name="&lt;init>()V"/>
+ <method name="getIndexSetAllocation(I)Landroid/renderscript/Allocation;" deprecated="16"/>
+ <method name="getPrimitive(I)Landroid/renderscript/Mesh$Primitive;" deprecated="16"/>
+ <method name="getPrimitiveCount()I" deprecated="16"/>
+ <method name="getVertexAllocation(I)Landroid/renderscript/Allocation;" deprecated="16"/>
+ <method name="getVertexAllocationCount()I" deprecated="16"/>
+ </class>
+ <class name="android/renderscript/Mesh$AllocationBuilder" since="11" deprecated="16" removed="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;)V" deprecated="16"/>
+ <method name="addIndexSetAllocation(Landroid/renderscript/Allocation;Landroid/renderscript/Mesh$Primitive;)Landroid/renderscript/Mesh$AllocationBuilder;" deprecated="16"/>
+ <method name="addIndexSetType(Landroid/renderscript/Mesh$Primitive;)Landroid/renderscript/Mesh$AllocationBuilder;" deprecated="16"/>
+ <method name="addVertexAllocation(Landroid/renderscript/Allocation;)Landroid/renderscript/Mesh$AllocationBuilder;" deprecated="16"/>
+ <method name="create()Landroid/renderscript/Mesh;" deprecated="16"/>
+ <method name="getCurrentIndexSetIndex()I" deprecated="16"/>
+ <method name="getCurrentVertexTypeIndex()I" deprecated="16"/>
+ </class>
+ <class name="android/renderscript/Mesh$Builder" since="11" deprecated="16" removed="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;I)V" deprecated="16"/>
+ <method name="addIndexSetType(Landroid/renderscript/Element;ILandroid/renderscript/Mesh$Primitive;)Landroid/renderscript/Mesh$Builder;" deprecated="16"/>
+ <method name="addIndexSetType(Landroid/renderscript/Mesh$Primitive;)Landroid/renderscript/Mesh$Builder;" deprecated="16"/>
+ <method name="addIndexSetType(Landroid/renderscript/Type;Landroid/renderscript/Mesh$Primitive;)Landroid/renderscript/Mesh$Builder;" deprecated="16"/>
+ <method name="addVertexType(Landroid/renderscript/Element;I)Landroid/renderscript/Mesh$Builder;" deprecated="16"/>
+ <method name="addVertexType(Landroid/renderscript/Type;)Landroid/renderscript/Mesh$Builder;" deprecated="16"/>
+ <method name="create()Landroid/renderscript/Mesh;" deprecated="16"/>
+ <method name="getCurrentIndexSetIndex()I" deprecated="16"/>
+ <method name="getCurrentVertexTypeIndex()I" deprecated="16"/>
+ </class>
+ <class name="android/renderscript/Mesh$Primitive" since="11" deprecated="16" removed="18">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/Mesh$Primitive;"/>
+ <method name="values()[Landroid/renderscript/Mesh$Primitive;"/>
+ <field name="LINE"/>
+ <field name="LINE_STRIP"/>
+ <field name="POINT"/>
+ <field name="TRIANGLE"/>
+ <field name="TRIANGLE_FAN"/>
+ <field name="TRIANGLE_STRIP"/>
+ </class>
+ <class name="android/renderscript/Mesh$TriangleMeshBuilder" since="11" deprecated="16" removed="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;II)V" deprecated="16"/>
+ <method name="addTriangle(III)Landroid/renderscript/Mesh$TriangleMeshBuilder;" deprecated="16"/>
+ <method name="addVertex(FF)Landroid/renderscript/Mesh$TriangleMeshBuilder;" deprecated="16"/>
+ <method name="addVertex(FFF)Landroid/renderscript/Mesh$TriangleMeshBuilder;" deprecated="16"/>
+ <method name="create(Z)Landroid/renderscript/Mesh;" deprecated="16"/>
+ <method name="setColor(FFFF)Landroid/renderscript/Mesh$TriangleMeshBuilder;" deprecated="16"/>
+ <method name="setNormal(FFF)Landroid/renderscript/Mesh$TriangleMeshBuilder;" deprecated="16"/>
+ <method name="setTexture(FF)Landroid/renderscript/Mesh$TriangleMeshBuilder;" deprecated="16"/>
+ <field name="COLOR" deprecated="16"/>
+ <field name="NORMAL" deprecated="16"/>
+ <field name="TEXTURE_0" deprecated="16"/>
+ </class>
+ <class name="android/renderscript/Program" since="11" removed="18">
+ <extends name="android/renderscript/BaseObj"/>
+ <method name="&lt;init>()V"/>
+ <method name="bindConstants(Landroid/renderscript/Allocation;I)V"/>
+ <method name="bindSampler(Landroid/renderscript/Sampler;I)V"/>
+ <method name="bindTexture(Landroid/renderscript/Allocation;I)V"/>
+ <method name="getConstant(I)Landroid/renderscript/Type;" since="16"/>
+ <method name="getConstantCount()I" since="16"/>
+ <method name="getTextureCount()I" since="16"/>
+ <method name="getTextureName(I)Ljava/lang/String;" since="16"/>
+ <method name="getTextureType(I)Landroid/renderscript/Program$TextureType;" since="16"/>
+ </class>
+ <class name="android/renderscript/Program$BaseProgramBuilder" since="11" removed="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;)V"/>
+ <method name="addConstant(Landroid/renderscript/Type;)Landroid/renderscript/Program$BaseProgramBuilder;"/>
+ <method name="addTexture(Landroid/renderscript/Program$TextureType;)Landroid/renderscript/Program$BaseProgramBuilder;"/>
+ <method name="addTexture(Landroid/renderscript/Program$TextureType;Ljava/lang/String;)Landroid/renderscript/Program$BaseProgramBuilder;" since="16"/>
+ <method name="getCurrentConstantIndex()I"/>
+ <method name="getCurrentTextureIndex()I"/>
+ <method name="initProgram(Landroid/renderscript/Program;)V"/>
+ <method name="setShader(Landroid/content/res/Resources;I)Landroid/renderscript/Program$BaseProgramBuilder;"/>
+ <method name="setShader(Ljava/lang/String;)Landroid/renderscript/Program$BaseProgramBuilder;"/>
+ </class>
+ <class name="android/renderscript/Program$TextureType" since="11" removed="18">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/Program$TextureType;"/>
+ <method name="values()[Landroid/renderscript/Program$TextureType;"/>
+ <field name="TEXTURE_2D"/>
+ <field name="TEXTURE_CUBE"/>
+ </class>
+ <class name="android/renderscript/ProgramFragment" since="11" deprecated="16" removed="18">
+ <extends name="android/renderscript/Program"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/renderscript/ProgramFragment$Builder" since="11" deprecated="16" removed="18">
+ <extends name="android/renderscript/Program$BaseProgramBuilder"/>
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;)V" deprecated="16"/>
+ <method name="create()Landroid/renderscript/ProgramFragment;" deprecated="16"/>
+ </class>
+ <class name="android/renderscript/ProgramFragmentFixedFunction" since="11" deprecated="16" removed="18">
+ <extends name="android/renderscript/ProgramFragment"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/renderscript/ProgramFragmentFixedFunction$Builder" since="11" deprecated="16" removed="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;)V" deprecated="16"/>
+ <method name="create()Landroid/renderscript/ProgramFragmentFixedFunction;" deprecated="16"/>
+ <method name="setPointSpriteTexCoordinateReplacement(Z)Landroid/renderscript/ProgramFragmentFixedFunction$Builder;" deprecated="16"/>
+ <method name="setTexture(Landroid/renderscript/ProgramFragmentFixedFunction$Builder$EnvMode;Landroid/renderscript/ProgramFragmentFixedFunction$Builder$Format;I)Landroid/renderscript/ProgramFragmentFixedFunction$Builder;" deprecated="16"/>
+ <method name="setVaryingColor(Z)Landroid/renderscript/ProgramFragmentFixedFunction$Builder;" deprecated="16"/>
+ <field name="MAX_TEXTURE" deprecated="16"/>
+ </class>
+ <class name="android/renderscript/ProgramFragmentFixedFunction$Builder$EnvMode" since="11" deprecated="16" removed="18">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/ProgramFragmentFixedFunction$Builder$EnvMode;"/>
+ <method name="values()[Landroid/renderscript/ProgramFragmentFixedFunction$Builder$EnvMode;"/>
+ <field name="DECAL"/>
+ <field name="MODULATE"/>
+ <field name="REPLACE"/>
+ </class>
+ <class name="android/renderscript/ProgramFragmentFixedFunction$Builder$Format" since="11" deprecated="16" removed="18">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/ProgramFragmentFixedFunction$Builder$Format;"/>
+ <method name="values()[Landroid/renderscript/ProgramFragmentFixedFunction$Builder$Format;"/>
+ <field name="ALPHA"/>
+ <field name="LUMINANCE_ALPHA"/>
+ <field name="RGB"/>
+ <field name="RGBA"/>
+ </class>
+ <class name="android/renderscript/ProgramRaster" since="11" deprecated="16" removed="18">
+ <extends name="android/renderscript/BaseObj"/>
+ <method name="&lt;init>()V"/>
+ <method name="CULL_BACK(Landroid/renderscript/RenderScript;)Landroid/renderscript/ProgramRaster;" deprecated="16"/>
+ <method name="CULL_FRONT(Landroid/renderscript/RenderScript;)Landroid/renderscript/ProgramRaster;" deprecated="16"/>
+ <method name="CULL_NONE(Landroid/renderscript/RenderScript;)Landroid/renderscript/ProgramRaster;" deprecated="16"/>
+ <method name="getCullMode()Landroid/renderscript/ProgramRaster$CullMode;" since="16" deprecated="16"/>
+ <method name="isPointSpriteEnabled()Z" since="16" deprecated="16"/>
+ </class>
+ <class name="android/renderscript/ProgramRaster$Builder" since="11" deprecated="16" removed="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;)V" deprecated="16"/>
+ <method name="create()Landroid/renderscript/ProgramRaster;" deprecated="16"/>
+ <method name="setCullMode(Landroid/renderscript/ProgramRaster$CullMode;)Landroid/renderscript/ProgramRaster$Builder;" deprecated="16"/>
+ <method name="setPointSpriteEnabled(Z)Landroid/renderscript/ProgramRaster$Builder;" deprecated="16"/>
+ </class>
+ <class name="android/renderscript/ProgramRaster$CullMode" since="11" deprecated="16" removed="18">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/ProgramRaster$CullMode;"/>
+ <method name="values()[Landroid/renderscript/ProgramRaster$CullMode;"/>
+ <field name="BACK"/>
+ <field name="FRONT"/>
+ <field name="NONE"/>
+ </class>
+ <class name="android/renderscript/ProgramStore" since="11" removed="18">
+ <extends name="android/renderscript/BaseObj"/>
+ <method name="&lt;init>()V"/>
+ <method name="BLEND_ALPHA_DEPTH_NONE(Landroid/renderscript/RenderScript;)Landroid/renderscript/ProgramStore;"/>
+ <method name="BLEND_ALPHA_DEPTH_TEST(Landroid/renderscript/RenderScript;)Landroid/renderscript/ProgramStore;"/>
+ <method name="BLEND_NONE_DEPTH_NONE(Landroid/renderscript/RenderScript;)Landroid/renderscript/ProgramStore;"/>
+ <method name="BLEND_NONE_DEPTH_TEST(Landroid/renderscript/RenderScript;)Landroid/renderscript/ProgramStore;"/>
+ <method name="getBlendDstFunc()Landroid/renderscript/ProgramStore$BlendDstFunc;" since="16"/>
+ <method name="getBlendSrcFunc()Landroid/renderscript/ProgramStore$BlendSrcFunc;" since="16"/>
+ <method name="getDepthFunc()Landroid/renderscript/ProgramStore$DepthFunc;" since="16"/>
+ <method name="isColorMaskAlphaEnabled()Z" since="16"/>
+ <method name="isColorMaskBlueEnabled()Z" since="16"/>
+ <method name="isColorMaskGreenEnabled()Z" since="16"/>
+ <method name="isColorMaskRedEnabled()Z" since="16"/>
+ <method name="isDepthMaskEnabled()Z" since="16"/>
+ <method name="isDitherEnabled()Z" since="16"/>
+ </class>
+ <class name="android/renderscript/ProgramStore$BlendDstFunc" since="11" removed="18">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/ProgramStore$BlendDstFunc;"/>
+ <method name="values()[Landroid/renderscript/ProgramStore$BlendDstFunc;"/>
+ <field name="DST_ALPHA"/>
+ <field name="ONE"/>
+ <field name="ONE_MINUS_DST_ALPHA"/>
+ <field name="ONE_MINUS_SRC_ALPHA"/>
+ <field name="ONE_MINUS_SRC_COLOR"/>
+ <field name="SRC_ALPHA"/>
+ <field name="SRC_COLOR"/>
+ <field name="ZERO"/>
+ </class>
+ <class name="android/renderscript/ProgramStore$BlendSrcFunc" since="11" removed="18">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/ProgramStore$BlendSrcFunc;"/>
+ <method name="values()[Landroid/renderscript/ProgramStore$BlendSrcFunc;"/>
+ <field name="DST_ALPHA"/>
+ <field name="DST_COLOR"/>
+ <field name="ONE"/>
+ <field name="ONE_MINUS_DST_ALPHA"/>
+ <field name="ONE_MINUS_DST_COLOR"/>
+ <field name="ONE_MINUS_SRC_ALPHA"/>
+ <field name="SRC_ALPHA"/>
+ <field name="SRC_ALPHA_SATURATE"/>
+ <field name="ZERO"/>
+ </class>
+ <class name="android/renderscript/ProgramStore$Builder" since="11" removed="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;)V"/>
+ <method name="create()Landroid/renderscript/ProgramStore;"/>
+ <method name="setBlendFunc(Landroid/renderscript/ProgramStore$BlendSrcFunc;Landroid/renderscript/ProgramStore$BlendDstFunc;)Landroid/renderscript/ProgramStore$Builder;"/>
+ <method name="setColorMaskEnabled(ZZZZ)Landroid/renderscript/ProgramStore$Builder;"/>
+ <method name="setDepthFunc(Landroid/renderscript/ProgramStore$DepthFunc;)Landroid/renderscript/ProgramStore$Builder;"/>
+ <method name="setDepthMaskEnabled(Z)Landroid/renderscript/ProgramStore$Builder;"/>
+ <method name="setDitherEnabled(Z)Landroid/renderscript/ProgramStore$Builder;"/>
+ </class>
+ <class name="android/renderscript/ProgramStore$DepthFunc" since="11" removed="18">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/ProgramStore$DepthFunc;"/>
+ <method name="values()[Landroid/renderscript/ProgramStore$DepthFunc;"/>
+ <field name="ALWAYS"/>
+ <field name="EQUAL"/>
+ <field name="GREATER"/>
+ <field name="GREATER_OR_EQUAL"/>
+ <field name="LESS"/>
+ <field name="LESS_OR_EQUAL"/>
+ <field name="NOT_EQUAL"/>
+ </class>
+ <class name="android/renderscript/ProgramVertex" since="11" deprecated="16" removed="18">
+ <extends name="android/renderscript/Program"/>
+ <method name="&lt;init>()V"/>
+ <method name="getInput(I)Landroid/renderscript/Element;" since="16" deprecated="16"/>
+ <method name="getInputCount()I" since="16" deprecated="16"/>
+ </class>
+ <class name="android/renderscript/ProgramVertex$Builder" since="11" deprecated="16" removed="18">
+ <extends name="android/renderscript/Program$BaseProgramBuilder"/>
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;)V" deprecated="16"/>
+ <method name="addInput(Landroid/renderscript/Element;)Landroid/renderscript/ProgramVertex$Builder;" deprecated="16"/>
+ <method name="create()Landroid/renderscript/ProgramVertex;" deprecated="16"/>
+ </class>
+ <class name="android/renderscript/ProgramVertexFixedFunction" since="11" deprecated="16" removed="18">
+ <extends name="android/renderscript/ProgramVertex"/>
+ <method name="&lt;init>()V"/>
+ <method name="bindConstants(Landroid/renderscript/ProgramVertexFixedFunction$Constants;)V" deprecated="16"/>
+ </class>
+ <class name="android/renderscript/ProgramVertexFixedFunction$Builder" since="11" deprecated="16" removed="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;)V" deprecated="16"/>
+ <method name="create()Landroid/renderscript/ProgramVertexFixedFunction;" deprecated="16"/>
+ <method name="setTextureMatrixEnable(Z)Landroid/renderscript/ProgramVertexFixedFunction$Builder;" deprecated="16"/>
+ </class>
+ <class name="android/renderscript/ProgramVertexFixedFunction$Constants" since="11" deprecated="16" removed="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;)V" deprecated="16"/>
+ <method name="destroy()V" deprecated="16"/>
+ <method name="setModelview(Landroid/renderscript/Matrix4f;)V" deprecated="16"/>
+ <method name="setProjection(Landroid/renderscript/Matrix4f;)V" deprecated="16"/>
+ <method name="setTexture(Landroid/renderscript/Matrix4f;)V" deprecated="16"/>
+ </class>
+ <class name="android/renderscript/RSDriverException" since="11">
+ <extends name="android/renderscript/RSRuntimeException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/renderscript/RSIllegalArgumentException" since="11">
+ <extends name="android/renderscript/RSRuntimeException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/renderscript/RSInvalidStateException" since="11">
+ <extends name="android/renderscript/RSRuntimeException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/renderscript/RSRuntimeException" since="11">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/renderscript/RSSurfaceView" since="11" deprecated="16" removed="18">
+ <extends name="android/view/SurfaceView"/>
+ <implements name="android/view/SurfaceHolder$Callback"/>
+ <method name="&lt;init>(Landroid/content/Context;)V" deprecated="16"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" deprecated="16"/>
+ <method name="createRenderScriptGL(Landroid/renderscript/RenderScriptGL$SurfaceConfig;)Landroid/renderscript/RenderScriptGL;" deprecated="16"/>
+ <method name="destroyRenderScriptGL()V" deprecated="16"/>
+ <method name="getRenderScriptGL()Landroid/renderscript/RenderScriptGL;" deprecated="16"/>
+ <method name="pause()V" deprecated="16"/>
+ <method name="resume()V" deprecated="16"/>
+ <method name="setRenderScriptGL(Landroid/renderscript/RenderScriptGL;)V" deprecated="16"/>
+ </class>
+ <class name="android/renderscript/RSTextureView" since="14" deprecated="16" removed="18">
+ <extends name="android/view/TextureView"/>
+ <implements name="android/view/TextureView$SurfaceTextureListener"/>
+ <method name="&lt;init>(Landroid/content/Context;)V" deprecated="16"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" deprecated="16"/>
+ <method name="createRenderScriptGL(Landroid/renderscript/RenderScriptGL$SurfaceConfig;)Landroid/renderscript/RenderScriptGL;" deprecated="16"/>
+ <method name="destroyRenderScriptGL()V" deprecated="16"/>
+ <method name="getRenderScriptGL()Landroid/renderscript/RenderScriptGL;" deprecated="16"/>
+ <method name="pause()V" deprecated="16"/>
+ <method name="resume()V" deprecated="16"/>
+ <method name="setRenderScriptGL(Landroid/renderscript/RenderScriptGL;)V" deprecated="16"/>
+ </class>
+ <class name="android/renderscript/RenderScript" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="contextDump()V"/>
+ <method name="create(Landroid/content/Context;)Landroid/renderscript/RenderScript;"/>
+ <method name="create(Landroid/content/Context;Landroid/renderscript/RenderScript$ContextType;)Landroid/renderscript/RenderScript;" since="18"/>
+ <method name="create(Landroid/content/Context;Landroid/renderscript/RenderScript$ContextType;I)Landroid/renderscript/RenderScript;" since="21"/>
+ <method name="createMultiContext(Landroid/content/Context;Landroid/renderscript/RenderScript$ContextType;II)Landroid/renderscript/RenderScript;" since="23"/>
+ <method name="destroy()V"/>
+ <method name="finish()V"/>
+ <method name="getApplicationContext()Landroid/content/Context;"/>
+ <method name="getErrorHandler()Landroid/renderscript/RenderScript$RSErrorHandler;"/>
+ <method name="getMessageHandler()Landroid/renderscript/RenderScript$RSMessageHandler;"/>
+ <method name="getMinorVersion()J" since="23"/>
+ <method name="releaseAllContexts()V" since="23"/>
+ <method name="sendMessage(I[I)V" since="18"/>
+ <method name="setErrorHandler(Landroid/renderscript/RenderScript$RSErrorHandler;)V"/>
+ <method name="setMessageHandler(Landroid/renderscript/RenderScript$RSMessageHandler;)V"/>
+ <method name="setPriority(Landroid/renderscript/RenderScript$Priority;)V"/>
+ <field name="CREATE_FLAG_LOW_LATENCY" since="21"/>
+ <field name="CREATE_FLAG_LOW_POWER" since="21"/>
+ <field name="CREATE_FLAG_NONE" since="21"/>
+ </class>
+ <class name="android/renderscript/RenderScript$ContextType" since="18">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/RenderScript$ContextType;"/>
+ <method name="values()[Landroid/renderscript/RenderScript$ContextType;"/>
+ <field name="DEBUG"/>
+ <field name="NORMAL"/>
+ <field name="PROFILE"/>
+ </class>
+ <class name="android/renderscript/RenderScript$Priority" since="11">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/RenderScript$Priority;"/>
+ <method name="values()[Landroid/renderscript/RenderScript$Priority;"/>
+ <field name="LOW"/>
+ <field name="NORMAL"/>
+ </class>
+ <class name="android/renderscript/RenderScript$RSErrorHandler" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Runnable"/>
+ <method name="&lt;init>()V"/>
+ <field name="mErrorMessage"/>
+ <field name="mErrorNum"/>
+ </class>
+ <class name="android/renderscript/RenderScript$RSMessageHandler" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Runnable"/>
+ <method name="&lt;init>()V"/>
+ <field name="mData"/>
+ <field name="mID"/>
+ <field name="mLength"/>
+ </class>
+ <class name="android/renderscript/RenderScriptGL" since="11" deprecated="16" removed="18">
+ <extends name="android/renderscript/RenderScript"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/renderscript/RenderScriptGL$SurfaceConfig;)V" deprecated="16"/>
+ <method name="bindProgramFragment(Landroid/renderscript/ProgramFragment;)V" deprecated="16"/>
+ <method name="bindProgramRaster(Landroid/renderscript/ProgramRaster;)V" deprecated="16"/>
+ <method name="bindProgramStore(Landroid/renderscript/ProgramStore;)V" deprecated="16"/>
+ <method name="bindProgramVertex(Landroid/renderscript/ProgramVertex;)V" deprecated="16"/>
+ <method name="bindRootScript(Landroid/renderscript/Script;)V" deprecated="16"/>
+ <method name="getHeight()I" deprecated="16"/>
+ <method name="getWidth()I" deprecated="16"/>
+ <method name="pause()V" deprecated="16"/>
+ <method name="resume()V" deprecated="16"/>
+ <method name="setSurface(Landroid/view/SurfaceHolder;II)V" deprecated="16"/>
+ <method name="setSurfaceTexture(Landroid/graphics/SurfaceTexture;II)V" since="14" deprecated="16"/>
+ </class>
+ <class name="android/renderscript/RenderScriptGL$SurfaceConfig" since="11" deprecated="16" removed="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V" deprecated="16"/>
+ <method name="&lt;init>(Landroid/renderscript/RenderScriptGL$SurfaceConfig;)V" deprecated="16"/>
+ <method name="setAlpha(II)V" deprecated="16"/>
+ <method name="setColor(II)V" deprecated="16"/>
+ <method name="setDepth(II)V" deprecated="16"/>
+ <method name="setSamples(IIF)V" deprecated="16"/>
+ </class>
+ <class name="android/renderscript/Sampler" since="11">
+ <extends name="android/renderscript/BaseObj"/>
+ <method name="&lt;init>()V"/>
+ <method name="CLAMP_LINEAR(Landroid/renderscript/RenderScript;)Landroid/renderscript/Sampler;"/>
+ <method name="CLAMP_LINEAR_MIP_LINEAR(Landroid/renderscript/RenderScript;)Landroid/renderscript/Sampler;"/>
+ <method name="CLAMP_NEAREST(Landroid/renderscript/RenderScript;)Landroid/renderscript/Sampler;"/>
+ <method name="MIRRORED_REPEAT_LINEAR(Landroid/renderscript/RenderScript;)Landroid/renderscript/Sampler;" since="18"/>
+ <method name="MIRRORED_REPEAT_LINEAR_MIP_LINEAR(Landroid/renderscript/RenderScript;)Landroid/renderscript/Sampler;" since="18"/>
+ <method name="MIRRORED_REPEAT_NEAREST(Landroid/renderscript/RenderScript;)Landroid/renderscript/Sampler;" since="18"/>
+ <method name="WRAP_LINEAR(Landroid/renderscript/RenderScript;)Landroid/renderscript/Sampler;"/>
+ <method name="WRAP_LINEAR_MIP_LINEAR(Landroid/renderscript/RenderScript;)Landroid/renderscript/Sampler;"/>
+ <method name="WRAP_NEAREST(Landroid/renderscript/RenderScript;)Landroid/renderscript/Sampler;"/>
+ <method name="getAnisotropy()F" since="16"/>
+ <method name="getMagnification()Landroid/renderscript/Sampler$Value;" since="16"/>
+ <method name="getMinification()Landroid/renderscript/Sampler$Value;" since="16"/>
+ <method name="getWrapS()Landroid/renderscript/Sampler$Value;" since="16"/>
+ <method name="getWrapT()Landroid/renderscript/Sampler$Value;" since="16"/>
+ </class>
+ <class name="android/renderscript/Sampler$Builder" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;)V"/>
+ <method name="create()Landroid/renderscript/Sampler;"/>
+ <method name="setAnisotropy(F)V"/>
+ <method name="setMagnification(Landroid/renderscript/Sampler$Value;)V"/>
+ <method name="setMinification(Landroid/renderscript/Sampler$Value;)V"/>
+ <method name="setWrapS(Landroid/renderscript/Sampler$Value;)V"/>
+ <method name="setWrapT(Landroid/renderscript/Sampler$Value;)V"/>
+ </class>
+ <class name="android/renderscript/Sampler$Value" since="11">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/Sampler$Value;"/>
+ <method name="values()[Landroid/renderscript/Sampler$Value;"/>
+ <field name="CLAMP"/>
+ <field name="LINEAR"/>
+ <field name="LINEAR_MIP_LINEAR"/>
+ <field name="LINEAR_MIP_NEAREST"/>
+ <field name="MIRRORED_REPEAT" since="18"/>
+ <field name="NEAREST"/>
+ <field name="WRAP"/>
+ </class>
+ <class name="android/renderscript/Script" since="11">
+ <extends name="android/renderscript/BaseObj"/>
+ <method name="&lt;init>()V"/>
+ <method name="bindAllocation(Landroid/renderscript/Allocation;I)V"/>
+ <method name="createFieldID(ILandroid/renderscript/Element;)Landroid/renderscript/Script$FieldID;" since="17"/>
+ <method name="createInvokeID(I)Landroid/renderscript/Script$InvokeID;" since="23"/>
+ <method name="createKernelID(IILandroid/renderscript/Element;Landroid/renderscript/Element;)Landroid/renderscript/Script$KernelID;" since="17"/>
+ <method name="forEach(ILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/FieldPacker;)V" since="14"/>
+ <method name="forEach(ILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/FieldPacker;Landroid/renderscript/Script$LaunchOptions;)V" since="18"/>
+ <method name="forEach(I[Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/FieldPacker;)V" since="23"/>
+ <method name="forEach(I[Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/FieldPacker;Landroid/renderscript/Script$LaunchOptions;)V" since="23"/>
+ <method name="getVarB(I)Z" since="18"/>
+ <method name="getVarD(I)D" since="18"/>
+ <method name="getVarF(I)F" since="18"/>
+ <method name="getVarI(I)I" since="18"/>
+ <method name="getVarJ(I)J" since="18"/>
+ <method name="getVarV(ILandroid/renderscript/FieldPacker;)V" since="18"/>
+ <method name="invoke(I)V"/>
+ <method name="invoke(ILandroid/renderscript/FieldPacker;)V"/>
+ <method name="reduce(I[Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="24"/>
+ <method name="setTimeZone(Ljava/lang/String;)V"/>
+ <method name="setVar(ID)V"/>
+ <method name="setVar(IF)V"/>
+ <method name="setVar(II)V"/>
+ <method name="setVar(IJ)V"/>
+ <method name="setVar(ILandroid/renderscript/BaseObj;)V"/>
+ <method name="setVar(ILandroid/renderscript/FieldPacker;)V"/>
+ <method name="setVar(ILandroid/renderscript/FieldPacker;Landroid/renderscript/Element;[I)V" since="16"/>
+ <method name="setVar(IZ)V"/>
+ </class>
+ <class name="android/renderscript/Script$Builder" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/renderscript/Script$FieldBase" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAllocation()Landroid/renderscript/Allocation;"/>
+ <method name="getElement()Landroid/renderscript/Element;"/>
+ <method name="getType()Landroid/renderscript/Type;"/>
+ <method name="init(Landroid/renderscript/RenderScript;I)V"/>
+ <method name="init(Landroid/renderscript/RenderScript;II)V"/>
+ <method name="updateAllocation()V"/>
+ <field name="mAllocation"/>
+ <field name="mElement"/>
+ </class>
+ <class name="android/renderscript/Script$FieldID" since="17">
+ <extends name="android/renderscript/BaseObj"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/renderscript/Script$InvokeID" since="23">
+ <extends name="android/renderscript/BaseObj"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/renderscript/Script$KernelID" since="17">
+ <extends name="android/renderscript/BaseObj"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/renderscript/Script$LaunchOptions" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getXEnd()I"/>
+ <method name="getXStart()I"/>
+ <method name="getYEnd()I"/>
+ <method name="getYStart()I"/>
+ <method name="getZEnd()I"/>
+ <method name="getZStart()I"/>
+ <method name="setX(II)Landroid/renderscript/Script$LaunchOptions;"/>
+ <method name="setY(II)Landroid/renderscript/Script$LaunchOptions;"/>
+ <method name="setZ(II)Landroid/renderscript/Script$LaunchOptions;"/>
+ </class>
+ <class name="android/renderscript/ScriptC" since="11">
+ <extends name="android/renderscript/Script"/>
+ <method name="&lt;init>(ILandroid/renderscript/RenderScript;)V"/>
+ <method name="&lt;init>(JLandroid/renderscript/RenderScript;)V" since="21"/>
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;Landroid/content/res/Resources;I)V"/>
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;Ljava/lang/String;[B[B)V" since="21"/>
+ </class>
+ <class name="android/renderscript/ScriptGroup" since="17">
+ <extends name="android/renderscript/BaseObj"/>
+ <method name="&lt;init>()V"/>
+ <method name="execute()V" deprecated="23"/>
+ <method name="execute([Ljava/lang/Object;)[Ljava/lang/Object;" since="23"/>
+ <method name="setInput(Landroid/renderscript/Script$KernelID;Landroid/renderscript/Allocation;)V" deprecated="23"/>
+ <method name="setOutput(Landroid/renderscript/Script$KernelID;Landroid/renderscript/Allocation;)V" deprecated="23"/>
+ </class>
+ <class name="android/renderscript/ScriptGroup$Binding" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/renderscript/Script$FieldID;Ljava/lang/Object;)V"/>
+ </class>
+ <class name="android/renderscript/ScriptGroup$Builder" since="17" deprecated="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;)V"/>
+ <method name="addConnection(Landroid/renderscript/Type;Landroid/renderscript/Script$KernelID;Landroid/renderscript/Script$FieldID;)Landroid/renderscript/ScriptGroup$Builder;"/>
+ <method name="addConnection(Landroid/renderscript/Type;Landroid/renderscript/Script$KernelID;Landroid/renderscript/Script$KernelID;)Landroid/renderscript/ScriptGroup$Builder;"/>
+ <method name="addKernel(Landroid/renderscript/Script$KernelID;)Landroid/renderscript/ScriptGroup$Builder;"/>
+ <method name="create()Landroid/renderscript/ScriptGroup;"/>
+ </class>
+ <class name="android/renderscript/ScriptGroup$Builder2" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;)V"/>
+ <method name="addInput()Landroid/renderscript/ScriptGroup$Input;"/>
+ <method name="addInvoke(Landroid/renderscript/Script$InvokeID;[Ljava/lang/Object;)Landroid/renderscript/ScriptGroup$Closure;"/>
+ <method name="addKernel(Landroid/renderscript/Script$KernelID;Landroid/renderscript/Type;[Ljava/lang/Object;)Landroid/renderscript/ScriptGroup$Closure;"/>
+ <method name="create(Ljava/lang/String;[Landroid/renderscript/ScriptGroup$Future;)Landroid/renderscript/ScriptGroup;"/>
+ </class>
+ <class name="android/renderscript/ScriptGroup$Closure" since="23">
+ <extends name="android/renderscript/BaseObj"/>
+ <method name="&lt;init>()V"/>
+ <method name="getGlobal(Landroid/renderscript/Script$FieldID;)Landroid/renderscript/ScriptGroup$Future;"/>
+ <method name="getReturn()Landroid/renderscript/ScriptGroup$Future;"/>
+ </class>
+ <class name="android/renderscript/ScriptGroup$Future" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/renderscript/ScriptGroup$Input" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/renderscript/ScriptIntrinsic" since="17">
+ <extends name="android/renderscript/Script"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/renderscript/ScriptIntrinsic3DLUT" since="18">
+ <extends name="android/renderscript/ScriptIntrinsic"/>
+ <method name="&lt;init>()V"/>
+ <method name="create(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)Landroid/renderscript/ScriptIntrinsic3DLUT;"/>
+ <method name="forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V"/>
+ <method name="forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21"/>
+ <method name="getKernelID()Landroid/renderscript/Script$KernelID;"/>
+ <method name="setLUT(Landroid/renderscript/Allocation;)V"/>
+ </class>
+ <class name="android/renderscript/ScriptIntrinsicBLAS" since="23">
+ <extends name="android/renderscript/ScriptIntrinsic"/>
+ <method name="&lt;init>()V"/>
+ <method name="BNNM(Landroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;II)V"/>
+ <method name="CGBMV(IIILandroid/renderscript/Float2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;ILandroid/renderscript/Float2;Landroid/renderscript/Allocation;I)V"/>
+ <method name="CGEMM(IILandroid/renderscript/Float2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Float2;Landroid/renderscript/Allocation;)V"/>
+ <method name="CGEMV(ILandroid/renderscript/Float2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;ILandroid/renderscript/Float2;Landroid/renderscript/Allocation;I)V"/>
+ <method name="CGERC(Landroid/renderscript/Float2;Landroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V"/>
+ <method name="CGERU(Landroid/renderscript/Float2;Landroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V"/>
+ <method name="CHBMV(IILandroid/renderscript/Float2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;ILandroid/renderscript/Float2;Landroid/renderscript/Allocation;I)V"/>
+ <method name="CHEMM(IILandroid/renderscript/Float2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Float2;Landroid/renderscript/Allocation;)V"/>
+ <method name="CHEMV(ILandroid/renderscript/Float2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;ILandroid/renderscript/Float2;Landroid/renderscript/Allocation;I)V"/>
+ <method name="CHER(IFLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V"/>
+ <method name="CHER2(ILandroid/renderscript/Float2;Landroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V"/>
+ <method name="CHER2K(IILandroid/renderscript/Float2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;FLandroid/renderscript/Allocation;)V"/>
+ <method name="CHERK(IIFLandroid/renderscript/Allocation;FLandroid/renderscript/Allocation;)V"/>
+ <method name="CHPMV(ILandroid/renderscript/Float2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;ILandroid/renderscript/Float2;Landroid/renderscript/Allocation;I)V"/>
+ <method name="CHPR(IFLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V"/>
+ <method name="CHPR2(ILandroid/renderscript/Float2;Landroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V"/>
+ <method name="CSYMM(IILandroid/renderscript/Float2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Float2;Landroid/renderscript/Allocation;)V"/>
+ <method name="CSYR2K(IILandroid/renderscript/Float2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Float2;Landroid/renderscript/Allocation;)V"/>
+ <method name="CSYRK(IILandroid/renderscript/Float2;Landroid/renderscript/Allocation;Landroid/renderscript/Float2;Landroid/renderscript/Allocation;)V"/>
+ <method name="CTBMV(IIIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V"/>
+ <method name="CTBSV(IIIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V"/>
+ <method name="CTPMV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V"/>
+ <method name="CTPSV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V"/>
+ <method name="CTRMM(IIIILandroid/renderscript/Float2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V"/>
+ <method name="CTRMV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V"/>
+ <method name="CTRSM(IIIILandroid/renderscript/Float2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V"/>
+ <method name="CTRSV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V"/>
+ <method name="DGBMV(IIIDLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;IDLandroid/renderscript/Allocation;I)V"/>
+ <method name="DGEMM(IIDLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;DLandroid/renderscript/Allocation;)V"/>
+ <method name="DGEMV(IDLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;IDLandroid/renderscript/Allocation;I)V"/>
+ <method name="DGER(DLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V"/>
+ <method name="DSBMV(IIDLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;IDLandroid/renderscript/Allocation;I)V"/>
+ <method name="DSPMV(IDLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;IDLandroid/renderscript/Allocation;I)V"/>
+ <method name="DSPR(IDLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V"/>
+ <method name="DSPR2(IDLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V"/>
+ <method name="DSYMM(IIDLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;DLandroid/renderscript/Allocation;)V"/>
+ <method name="DSYMV(IDLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;IDLandroid/renderscript/Allocation;I)V"/>
+ <method name="DSYR(IDLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V"/>
+ <method name="DSYR2(IDLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V"/>
+ <method name="DSYR2K(IIDLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;DLandroid/renderscript/Allocation;)V"/>
+ <method name="DSYRK(IIDLandroid/renderscript/Allocation;DLandroid/renderscript/Allocation;)V"/>
+ <method name="DTBMV(IIIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V"/>
+ <method name="DTBSV(IIIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V"/>
+ <method name="DTPMV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V"/>
+ <method name="DTPSV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V"/>
+ <method name="DTRMM(IIIIDLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V"/>
+ <method name="DTRMV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V"/>
+ <method name="DTRSM(IIIIDLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V"/>
+ <method name="DTRSV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V"/>
+ <method name="SGBMV(IIIFLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;IFLandroid/renderscript/Allocation;I)V"/>
+ <method name="SGEMM(IIFLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;FLandroid/renderscript/Allocation;)V"/>
+ <method name="SGEMV(IFLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;IFLandroid/renderscript/Allocation;I)V"/>
+ <method name="SGER(FLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V"/>
+ <method name="SSBMV(IIFLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;IFLandroid/renderscript/Allocation;I)V"/>
+ <method name="SSPMV(IFLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;IFLandroid/renderscript/Allocation;I)V"/>
+ <method name="SSPR(IFLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V"/>
+ <method name="SSPR2(IFLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V"/>
+ <method name="SSYMM(IIFLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;FLandroid/renderscript/Allocation;)V"/>
+ <method name="SSYMV(IFLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;IFLandroid/renderscript/Allocation;I)V"/>
+ <method name="SSYR(IFLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V"/>
+ <method name="SSYR2(IFLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V"/>
+ <method name="SSYR2K(IIFLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;FLandroid/renderscript/Allocation;)V"/>
+ <method name="SSYRK(IIFLandroid/renderscript/Allocation;FLandroid/renderscript/Allocation;)V"/>
+ <method name="STBMV(IIIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V"/>
+ <method name="STBSV(IIIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V"/>
+ <method name="STPMV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V"/>
+ <method name="STPSV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V"/>
+ <method name="STRMM(IIIIFLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V"/>
+ <method name="STRMV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V"/>
+ <method name="STRSM(IIIIFLandroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V"/>
+ <method name="STRSV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V"/>
+ <method name="ZGBMV(IIILandroid/renderscript/Double2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;ILandroid/renderscript/Double2;Landroid/renderscript/Allocation;I)V"/>
+ <method name="ZGEMM(IILandroid/renderscript/Double2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Double2;Landroid/renderscript/Allocation;)V"/>
+ <method name="ZGEMV(ILandroid/renderscript/Double2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;ILandroid/renderscript/Double2;Landroid/renderscript/Allocation;I)V"/>
+ <method name="ZGERC(Landroid/renderscript/Double2;Landroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V"/>
+ <method name="ZGERU(Landroid/renderscript/Double2;Landroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V"/>
+ <method name="ZHBMV(IILandroid/renderscript/Double2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;ILandroid/renderscript/Double2;Landroid/renderscript/Allocation;I)V"/>
+ <method name="ZHEMM(IILandroid/renderscript/Double2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Double2;Landroid/renderscript/Allocation;)V"/>
+ <method name="ZHEMV(ILandroid/renderscript/Double2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;ILandroid/renderscript/Double2;Landroid/renderscript/Allocation;I)V"/>
+ <method name="ZHER(IDLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V"/>
+ <method name="ZHER2(ILandroid/renderscript/Double2;Landroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V"/>
+ <method name="ZHER2K(IILandroid/renderscript/Double2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;DLandroid/renderscript/Allocation;)V"/>
+ <method name="ZHERK(IIDLandroid/renderscript/Allocation;DLandroid/renderscript/Allocation;)V"/>
+ <method name="ZHPMV(ILandroid/renderscript/Double2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;ILandroid/renderscript/Double2;Landroid/renderscript/Allocation;I)V"/>
+ <method name="ZHPR(IDLandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V"/>
+ <method name="ZHPR2(ILandroid/renderscript/Double2;Landroid/renderscript/Allocation;ILandroid/renderscript/Allocation;ILandroid/renderscript/Allocation;)V"/>
+ <method name="ZSYMM(IILandroid/renderscript/Double2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Double2;Landroid/renderscript/Allocation;)V"/>
+ <method name="ZSYR2K(IILandroid/renderscript/Double2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Double2;Landroid/renderscript/Allocation;)V"/>
+ <method name="ZSYRK(IILandroid/renderscript/Double2;Landroid/renderscript/Allocation;Landroid/renderscript/Double2;Landroid/renderscript/Allocation;)V"/>
+ <method name="ZTBMV(IIIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V"/>
+ <method name="ZTBSV(IIIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V"/>
+ <method name="ZTPMV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V"/>
+ <method name="ZTPSV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V"/>
+ <method name="ZTRMM(IIIILandroid/renderscript/Double2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V"/>
+ <method name="ZTRMV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V"/>
+ <method name="ZTRSM(IIIILandroid/renderscript/Double2;Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V"/>
+ <method name="ZTRSV(IIILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;I)V"/>
+ <method name="create(Landroid/renderscript/RenderScript;)Landroid/renderscript/ScriptIntrinsicBLAS;"/>
+ <field name="CONJ_TRANSPOSE"/>
+ <field name="LEFT"/>
+ <field name="LOWER"/>
+ <field name="NON_UNIT"/>
+ <field name="NO_TRANSPOSE"/>
+ <field name="RIGHT"/>
+ <field name="TRANSPOSE"/>
+ <field name="UNIT"/>
+ <field name="UPPER"/>
+ </class>
+ <class name="android/renderscript/ScriptIntrinsicBlend" since="17">
+ <extends name="android/renderscript/ScriptIntrinsic"/>
+ <method name="&lt;init>()V"/>
+ <method name="create(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)Landroid/renderscript/ScriptIntrinsicBlend;"/>
+ <method name="forEachAdd(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V"/>
+ <method name="forEachAdd(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21"/>
+ <method name="forEachClear(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V"/>
+ <method name="forEachClear(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21"/>
+ <method name="forEachDst(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V"/>
+ <method name="forEachDst(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21"/>
+ <method name="forEachDstAtop(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V"/>
+ <method name="forEachDstAtop(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21"/>
+ <method name="forEachDstIn(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V"/>
+ <method name="forEachDstIn(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21"/>
+ <method name="forEachDstOut(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V"/>
+ <method name="forEachDstOut(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21"/>
+ <method name="forEachDstOver(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V"/>
+ <method name="forEachDstOver(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21"/>
+ <method name="forEachMultiply(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V"/>
+ <method name="forEachMultiply(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21"/>
+ <method name="forEachSrc(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V"/>
+ <method name="forEachSrc(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21"/>
+ <method name="forEachSrcAtop(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V"/>
+ <method name="forEachSrcAtop(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21"/>
+ <method name="forEachSrcIn(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V"/>
+ <method name="forEachSrcIn(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21"/>
+ <method name="forEachSrcOut(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V"/>
+ <method name="forEachSrcOut(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21"/>
+ <method name="forEachSrcOver(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V"/>
+ <method name="forEachSrcOver(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21"/>
+ <method name="forEachSubtract(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V"/>
+ <method name="forEachSubtract(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21"/>
+ <method name="forEachXor(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V"/>
+ <method name="forEachXor(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21"/>
+ <method name="getKernelIDAdd()Landroid/renderscript/Script$KernelID;"/>
+ <method name="getKernelIDClear()Landroid/renderscript/Script$KernelID;"/>
+ <method name="getKernelIDDst()Landroid/renderscript/Script$KernelID;"/>
+ <method name="getKernelIDDstAtop()Landroid/renderscript/Script$KernelID;"/>
+ <method name="getKernelIDDstIn()Landroid/renderscript/Script$KernelID;"/>
+ <method name="getKernelIDDstOut()Landroid/renderscript/Script$KernelID;"/>
+ <method name="getKernelIDDstOver()Landroid/renderscript/Script$KernelID;"/>
+ <method name="getKernelIDMultiply()Landroid/renderscript/Script$KernelID;"/>
+ <method name="getKernelIDSrc()Landroid/renderscript/Script$KernelID;"/>
+ <method name="getKernelIDSrcAtop()Landroid/renderscript/Script$KernelID;"/>
+ <method name="getKernelIDSrcIn()Landroid/renderscript/Script$KernelID;"/>
+ <method name="getKernelIDSrcOut()Landroid/renderscript/Script$KernelID;"/>
+ <method name="getKernelIDSrcOver()Landroid/renderscript/Script$KernelID;"/>
+ <method name="getKernelIDSubtract()Landroid/renderscript/Script$KernelID;"/>
+ <method name="getKernelIDXor()Landroid/renderscript/Script$KernelID;"/>
+ </class>
+ <class name="android/renderscript/ScriptIntrinsicBlur" since="17">
+ <extends name="android/renderscript/ScriptIntrinsic"/>
+ <method name="&lt;init>()V"/>
+ <method name="create(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)Landroid/renderscript/ScriptIntrinsicBlur;"/>
+ <method name="forEach(Landroid/renderscript/Allocation;)V"/>
+ <method name="forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21"/>
+ <method name="getFieldID_Input()Landroid/renderscript/Script$FieldID;"/>
+ <method name="getKernelID()Landroid/renderscript/Script$KernelID;"/>
+ <method name="setInput(Landroid/renderscript/Allocation;)V"/>
+ <method name="setRadius(F)V"/>
+ </class>
+ <class name="android/renderscript/ScriptIntrinsicColorMatrix" since="17">
+ <extends name="android/renderscript/ScriptIntrinsic"/>
+ <method name="&lt;init>()V"/>
+ <method name="create(Landroid/renderscript/RenderScript;)Landroid/renderscript/ScriptIntrinsicColorMatrix;" since="19"/>
+ <method name="create(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)Landroid/renderscript/ScriptIntrinsicColorMatrix;" deprecated="19"/>
+ <method name="forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V"/>
+ <method name="forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21"/>
+ <method name="getKernelID()Landroid/renderscript/Script$KernelID;"/>
+ <method name="setAdd(FFFF)V" since="19"/>
+ <method name="setAdd(Landroid/renderscript/Float4;)V" since="19"/>
+ <method name="setColorMatrix(Landroid/renderscript/Matrix3f;)V"/>
+ <method name="setColorMatrix(Landroid/renderscript/Matrix4f;)V"/>
+ <method name="setGreyscale()V"/>
+ <method name="setRGBtoYUV()V"/>
+ <method name="setYUVtoRGB()V"/>
+ </class>
+ <class name="android/renderscript/ScriptIntrinsicConvolve3x3" since="17">
+ <extends name="android/renderscript/ScriptIntrinsic"/>
+ <method name="&lt;init>()V"/>
+ <method name="create(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)Landroid/renderscript/ScriptIntrinsicConvolve3x3;"/>
+ <method name="forEach(Landroid/renderscript/Allocation;)V"/>
+ <method name="forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21"/>
+ <method name="getFieldID_Input()Landroid/renderscript/Script$FieldID;"/>
+ <method name="getKernelID()Landroid/renderscript/Script$KernelID;"/>
+ <method name="setCoefficients([F)V"/>
+ <method name="setInput(Landroid/renderscript/Allocation;)V"/>
+ </class>
+ <class name="android/renderscript/ScriptIntrinsicConvolve5x5" since="17">
+ <extends name="android/renderscript/ScriptIntrinsic"/>
+ <method name="&lt;init>()V"/>
+ <method name="create(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)Landroid/renderscript/ScriptIntrinsicConvolve5x5;"/>
+ <method name="forEach(Landroid/renderscript/Allocation;)V"/>
+ <method name="forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21"/>
+ <method name="getFieldID_Input()Landroid/renderscript/Script$FieldID;"/>
+ <method name="getKernelID()Landroid/renderscript/Script$KernelID;"/>
+ <method name="setCoefficients([F)V"/>
+ <method name="setInput(Landroid/renderscript/Allocation;)V"/>
+ </class>
+ <class name="android/renderscript/ScriptIntrinsicHistogram" since="19">
+ <extends name="android/renderscript/ScriptIntrinsic"/>
+ <method name="&lt;init>()V"/>
+ <method name="create(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)Landroid/renderscript/ScriptIntrinsicHistogram;"/>
+ <method name="forEach(Landroid/renderscript/Allocation;)V"/>
+ <method name="forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21"/>
+ <method name="forEach_Dot(Landroid/renderscript/Allocation;)V"/>
+ <method name="forEach_Dot(Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21"/>
+ <method name="getFieldID_Input()Landroid/renderscript/Script$FieldID;"/>
+ <method name="getKernelID_Separate()Landroid/renderscript/Script$KernelID;"/>
+ <method name="setDotCoefficients(FFFF)V"/>
+ <method name="setOutput(Landroid/renderscript/Allocation;)V"/>
+ </class>
+ <class name="android/renderscript/ScriptIntrinsicLUT" since="17">
+ <extends name="android/renderscript/ScriptIntrinsic"/>
+ <method name="&lt;init>()V"/>
+ <method name="create(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)Landroid/renderscript/ScriptIntrinsicLUT;"/>
+ <method name="forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V"/>
+ <method name="forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21"/>
+ <method name="getKernelID()Landroid/renderscript/Script$KernelID;"/>
+ <method name="setAlpha(II)V"/>
+ <method name="setBlue(II)V"/>
+ <method name="setGreen(II)V"/>
+ <method name="setRed(II)V"/>
+ </class>
+ <class name="android/renderscript/ScriptIntrinsicResize" since="20">
+ <extends name="android/renderscript/ScriptIntrinsic"/>
+ <method name="&lt;init>()V"/>
+ <method name="create(Landroid/renderscript/RenderScript;)Landroid/renderscript/ScriptIntrinsicResize;"/>
+ <method name="forEach_bicubic(Landroid/renderscript/Allocation;)V"/>
+ <method name="forEach_bicubic(Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V"/>
+ <method name="getFieldID_Input()Landroid/renderscript/Script$FieldID;"/>
+ <method name="getKernelID_bicubic()Landroid/renderscript/Script$KernelID;"/>
+ <method name="setInput(Landroid/renderscript/Allocation;)V"/>
+ </class>
+ <class name="android/renderscript/ScriptIntrinsicYuvToRGB" since="17">
+ <extends name="android/renderscript/ScriptIntrinsic"/>
+ <method name="&lt;init>()V"/>
+ <method name="create(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)Landroid/renderscript/ScriptIntrinsicYuvToRGB;"/>
+ <method name="forEach(Landroid/renderscript/Allocation;)V"/>
+ <method name="getFieldID_Input()Landroid/renderscript/Script$FieldID;"/>
+ <method name="getKernelID()Landroid/renderscript/Script$KernelID;"/>
+ <method name="setInput(Landroid/renderscript/Allocation;)V"/>
+ </class>
+ <class name="android/renderscript/Short2" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(SS)V" since="14"/>
+ <field name="x"/>
+ <field name="y"/>
+ </class>
+ <class name="android/renderscript/Short3" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(SSS)V" since="14"/>
+ <field name="x"/>
+ <field name="y"/>
+ <field name="z"/>
+ </class>
+ <class name="android/renderscript/Short4" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(SSSS)V" since="14"/>
+ <field name="w"/>
+ <field name="x"/>
+ <field name="y"/>
+ <field name="z"/>
+ </class>
+ <class name="android/renderscript/Type" since="11">
+ <extends name="android/renderscript/BaseObj"/>
+ <method name="&lt;init>()V"/>
+ <method name="createX(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;I)Landroid/renderscript/Type;" since="21"/>
+ <method name="createXY(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;II)Landroid/renderscript/Type;" since="21"/>
+ <method name="createXYZ(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;III)Landroid/renderscript/Type;" since="21"/>
+ <method name="getCount()I"/>
+ <method name="getElement()Landroid/renderscript/Element;"/>
+ <method name="getX()I"/>
+ <method name="getY()I"/>
+ <method name="getYuv()I" since="18"/>
+ <method name="getZ()I"/>
+ <method name="hasFaces()Z"/>
+ <method name="hasMipmaps()Z"/>
+ </class>
+ <class name="android/renderscript/Type$Builder" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)V"/>
+ <method name="create()Landroid/renderscript/Type;"/>
+ <method name="setFaces(Z)Landroid/renderscript/Type$Builder;"/>
+ <method name="setMipmaps(Z)Landroid/renderscript/Type$Builder;"/>
+ <method name="setX(I)Landroid/renderscript/Type$Builder;"/>
+ <method name="setY(I)Landroid/renderscript/Type$Builder;"/>
+ <method name="setYuvFormat(I)Landroid/renderscript/Type$Builder;" since="18"/>
+ <method name="setZ(I)Landroid/renderscript/Type$Builder;" since="18"/>
+ </class>
+ <class name="android/renderscript/Type$CubemapFace" since="11">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/Type$CubemapFace;"/>
+ <method name="values()[Landroid/renderscript/Type$CubemapFace;"/>
+ <field name="NEGATIVE_X"/>
+ <field name="NEGATIVE_Y"/>
+ <field name="NEGATIVE_Z"/>
+ <field name="POSITIVE_X" since="14"/>
+ <field name="POSITIVE_Y" since="14"/>
+ <field name="POSITIVE_Z" since="14"/>
+ <field name="POSITVE_X"/>
+ <field name="POSITVE_Y"/>
+ <field name="POSITVE_Z"/>
+ </class>
+ <class name="android/sax/Element" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getChild(Ljava/lang/String;)Landroid/sax/Element;"/>
+ <method name="getChild(Ljava/lang/String;Ljava/lang/String;)Landroid/sax/Element;"/>
+ <method name="requireChild(Ljava/lang/String;)Landroid/sax/Element;"/>
+ <method name="requireChild(Ljava/lang/String;Ljava/lang/String;)Landroid/sax/Element;"/>
+ <method name="setElementListener(Landroid/sax/ElementListener;)V"/>
+ <method name="setEndElementListener(Landroid/sax/EndElementListener;)V"/>
+ <method name="setEndTextElementListener(Landroid/sax/EndTextElementListener;)V"/>
+ <method name="setStartElementListener(Landroid/sax/StartElementListener;)V"/>
+ <method name="setTextElementListener(Landroid/sax/TextElementListener;)V"/>
+ </class>
+ <class name="android/sax/ElementListener" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/sax/EndElementListener"/>
+ <implements name="android/sax/StartElementListener"/>
+ </class>
+ <class name="android/sax/EndElementListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="end()V"/>
+ </class>
+ <class name="android/sax/EndTextElementListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="end(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/sax/RootElement" since="1">
+ <extends name="android/sax/Element"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="getContentHandler()Lorg/xml/sax/ContentHandler;"/>
+ </class>
+ <class name="android/sax/StartElementListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="start(Lorg/xml/sax/Attributes;)V"/>
+ </class>
+ <class name="android/sax/TextElementListener" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/sax/EndTextElementListener"/>
+ <implements name="android/sax/StartElementListener"/>
+ </class>
+ <class name="android/security/KeyChain" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="choosePrivateKeyAlias(Landroid/app/Activity;Landroid/security/KeyChainAliasCallback;[Ljava/lang/String;[Ljava/security/Principal;Landroid/net/Uri;Ljava/lang/String;)V" since="23"/>
+ <method name="choosePrivateKeyAlias(Landroid/app/Activity;Landroid/security/KeyChainAliasCallback;[Ljava/lang/String;[Ljava/security/Principal;Ljava/lang/String;ILjava/lang/String;)V"/>
+ <method name="createInstallIntent()Landroid/content/Intent;"/>
+ <method name="getCertificateChain(Landroid/content/Context;Ljava/lang/String;)[Ljava/security/cert/X509Certificate;"/>
+ <method name="getPrivateKey(Landroid/content/Context;Ljava/lang/String;)Ljava/security/PrivateKey;"/>
+ <method name="isBoundKeyAlgorithm(Ljava/lang/String;)Z" since="18" deprecated="23"/>
+ <method name="isKeyAlgorithmSupported(Ljava/lang/String;)Z" since="18"/>
+ <field name="ACTION_KEYCHAIN_CHANGED" since="26"/>
+ <field name="ACTION_KEY_ACCESS_CHANGED" since="26"/>
+ <field name="ACTION_STORAGE_CHANGED" since="16" deprecated="26"/>
+ <field name="ACTION_TRUST_STORE_CHANGED" since="26"/>
+ <field name="EXTRA_CERTIFICATE"/>
+ <field name="EXTRA_KEY_ACCESSIBLE" since="26"/>
+ <field name="EXTRA_KEY_ALIAS" since="26"/>
+ <field name="EXTRA_NAME"/>
+ <field name="EXTRA_PKCS12"/>
+ </class>
+ <class name="android/security/KeyChainAliasCallback" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="alias(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/security/KeyChainException" since="14">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="android/security/KeyPairGeneratorSpec" since="18" deprecated="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/AlgorithmParameterSpec"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAlgorithmParameterSpec()Ljava/security/spec/AlgorithmParameterSpec;" since="19"/>
+ <method name="getContext()Landroid/content/Context;"/>
+ <method name="getEndDate()Ljava/util/Date;"/>
+ <method name="getKeySize()I" since="19"/>
+ <method name="getKeyType()Ljava/lang/String;" since="19"/>
+ <method name="getKeystoreAlias()Ljava/lang/String;"/>
+ <method name="getSerialNumber()Ljava/math/BigInteger;"/>
+ <method name="getStartDate()Ljava/util/Date;"/>
+ <method name="getSubjectDN()Ljavax/security/auth/x500/X500Principal;"/>
+ <method name="isEncryptionRequired()Z"/>
+ </class>
+ <class name="android/security/KeyPairGeneratorSpec$Builder" since="18" deprecated="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="build()Landroid/security/KeyPairGeneratorSpec;"/>
+ <method name="setAlgorithmParameterSpec(Ljava/security/spec/AlgorithmParameterSpec;)Landroid/security/KeyPairGeneratorSpec$Builder;" since="19"/>
+ <method name="setAlias(Ljava/lang/String;)Landroid/security/KeyPairGeneratorSpec$Builder;"/>
+ <method name="setEncryptionRequired()Landroid/security/KeyPairGeneratorSpec$Builder;"/>
+ <method name="setEndDate(Ljava/util/Date;)Landroid/security/KeyPairGeneratorSpec$Builder;"/>
+ <method name="setKeySize(I)Landroid/security/KeyPairGeneratorSpec$Builder;" since="19"/>
+ <method name="setKeyType(Ljava/lang/String;)Landroid/security/KeyPairGeneratorSpec$Builder;" since="19"/>
+ <method name="setSerialNumber(Ljava/math/BigInteger;)Landroid/security/KeyPairGeneratorSpec$Builder;"/>
+ <method name="setStartDate(Ljava/util/Date;)Landroid/security/KeyPairGeneratorSpec$Builder;"/>
+ <method name="setSubject(Ljavax/security/auth/x500/X500Principal;)Landroid/security/KeyPairGeneratorSpec$Builder;"/>
+ </class>
+ <class name="android/security/KeyStoreParameter" since="18" deprecated="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/KeyStore$ProtectionParameter"/>
+ <method name="&lt;init>()V"/>
+ <method name="isEncryptionRequired()Z"/>
+ </class>
+ <class name="android/security/KeyStoreParameter$Builder" since="18" deprecated="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="build()Landroid/security/KeyStoreParameter;"/>
+ <method name="setEncryptionRequired(Z)Landroid/security/KeyStoreParameter$Builder;"/>
+ </class>
+ <class name="android/security/NetworkSecurityPolicy" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getInstance()Landroid/security/NetworkSecurityPolicy;"/>
+ <method name="isCleartextTrafficPermitted()Z"/>
+ <method name="isCleartextTrafficPermitted(Ljava/lang/String;)Z" since="24"/>
+ </class>
+ <class name="android/security/keystore/KeyExpiredException" since="23">
+ <extends name="java/security/InvalidKeyException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="android/security/keystore/KeyGenParameterSpec" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/AlgorithmParameterSpec"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAlgorithmParameterSpec()Ljava/security/spec/AlgorithmParameterSpec;"/>
+ <method name="getAttestationChallenge()[B" since="24"/>
+ <method name="getBlockModes()[Ljava/lang/String;"/>
+ <method name="getCertificateNotAfter()Ljava/util/Date;"/>
+ <method name="getCertificateNotBefore()Ljava/util/Date;"/>
+ <method name="getCertificateSerialNumber()Ljava/math/BigInteger;"/>
+ <method name="getCertificateSubject()Ljavax/security/auth/x500/X500Principal;"/>
+ <method name="getDigests()[Ljava/lang/String;"/>
+ <method name="getEncryptionPaddings()[Ljava/lang/String;"/>
+ <method name="getKeySize()I"/>
+ <method name="getKeyValidityForConsumptionEnd()Ljava/util/Date;"/>
+ <method name="getKeyValidityForOriginationEnd()Ljava/util/Date;"/>
+ <method name="getKeyValidityStart()Ljava/util/Date;"/>
+ <method name="getKeystoreAlias()Ljava/lang/String;"/>
+ <method name="getPurposes()I"/>
+ <method name="getSignaturePaddings()[Ljava/lang/String;"/>
+ <method name="getUserAuthenticationValidityDurationSeconds()I"/>
+ <method name="isDigestsSpecified()Z"/>
+ <method name="isInvalidatedByBiometricEnrollment()Z" since="24"/>
+ <method name="isRandomizedEncryptionRequired()Z"/>
+ <method name="isUserAuthenticationRequired()Z"/>
+ <method name="isUserAuthenticationValidWhileOnBody()Z" since="24"/>
+ </class>
+ <class name="android/security/keystore/KeyGenParameterSpec$Builder" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="build()Landroid/security/keystore/KeyGenParameterSpec;"/>
+ <method name="setAlgorithmParameterSpec(Ljava/security/spec/AlgorithmParameterSpec;)Landroid/security/keystore/KeyGenParameterSpec$Builder;"/>
+ <method name="setAttestationChallenge([B)Landroid/security/keystore/KeyGenParameterSpec$Builder;" since="24"/>
+ <method name="setBlockModes([Ljava/lang/String;)Landroid/security/keystore/KeyGenParameterSpec$Builder;"/>
+ <method name="setCertificateNotAfter(Ljava/util/Date;)Landroid/security/keystore/KeyGenParameterSpec$Builder;"/>
+ <method name="setCertificateNotBefore(Ljava/util/Date;)Landroid/security/keystore/KeyGenParameterSpec$Builder;"/>
+ <method name="setCertificateSerialNumber(Ljava/math/BigInteger;)Landroid/security/keystore/KeyGenParameterSpec$Builder;"/>
+ <method name="setCertificateSubject(Ljavax/security/auth/x500/X500Principal;)Landroid/security/keystore/KeyGenParameterSpec$Builder;"/>
+ <method name="setDigests([Ljava/lang/String;)Landroid/security/keystore/KeyGenParameterSpec$Builder;"/>
+ <method name="setEncryptionPaddings([Ljava/lang/String;)Landroid/security/keystore/KeyGenParameterSpec$Builder;"/>
+ <method name="setInvalidatedByBiometricEnrollment(Z)Landroid/security/keystore/KeyGenParameterSpec$Builder;" since="24"/>
+ <method name="setKeySize(I)Landroid/security/keystore/KeyGenParameterSpec$Builder;"/>
+ <method name="setKeyValidityEnd(Ljava/util/Date;)Landroid/security/keystore/KeyGenParameterSpec$Builder;"/>
+ <method name="setKeyValidityForConsumptionEnd(Ljava/util/Date;)Landroid/security/keystore/KeyGenParameterSpec$Builder;"/>
+ <method name="setKeyValidityForOriginationEnd(Ljava/util/Date;)Landroid/security/keystore/KeyGenParameterSpec$Builder;"/>
+ <method name="setKeyValidityStart(Ljava/util/Date;)Landroid/security/keystore/KeyGenParameterSpec$Builder;"/>
+ <method name="setRandomizedEncryptionRequired(Z)Landroid/security/keystore/KeyGenParameterSpec$Builder;"/>
+ <method name="setSignaturePaddings([Ljava/lang/String;)Landroid/security/keystore/KeyGenParameterSpec$Builder;"/>
+ <method name="setUserAuthenticationRequired(Z)Landroid/security/keystore/KeyGenParameterSpec$Builder;"/>
+ <method name="setUserAuthenticationValidWhileOnBody(Z)Landroid/security/keystore/KeyGenParameterSpec$Builder;" since="24"/>
+ <method name="setUserAuthenticationValidityDurationSeconds(I)Landroid/security/keystore/KeyGenParameterSpec$Builder;"/>
+ </class>
+ <class name="android/security/keystore/KeyInfo" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/KeySpec"/>
+ <method name="&lt;init>()V"/>
+ <method name="getBlockModes()[Ljava/lang/String;"/>
+ <method name="getDigests()[Ljava/lang/String;"/>
+ <method name="getEncryptionPaddings()[Ljava/lang/String;"/>
+ <method name="getKeySize()I"/>
+ <method name="getKeyValidityForConsumptionEnd()Ljava/util/Date;"/>
+ <method name="getKeyValidityForOriginationEnd()Ljava/util/Date;"/>
+ <method name="getKeyValidityStart()Ljava/util/Date;"/>
+ <method name="getKeystoreAlias()Ljava/lang/String;"/>
+ <method name="getOrigin()I"/>
+ <method name="getPurposes()I"/>
+ <method name="getSignaturePaddings()[Ljava/lang/String;"/>
+ <method name="getUserAuthenticationValidityDurationSeconds()I"/>
+ <method name="isInsideSecureHardware()Z"/>
+ <method name="isInvalidatedByBiometricEnrollment()Z" since="24"/>
+ <method name="isUserAuthenticationRequired()Z"/>
+ <method name="isUserAuthenticationRequirementEnforcedBySecureHardware()Z"/>
+ <method name="isUserAuthenticationValidWhileOnBody()Z" since="24"/>
+ </class>
+ <class name="android/security/keystore/KeyNotYetValidException" since="23">
+ <extends name="java/security/InvalidKeyException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="android/security/keystore/KeyPermanentlyInvalidatedException" since="23">
+ <extends name="java/security/InvalidKeyException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="android/security/keystore/KeyProperties" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="BLOCK_MODE_CBC"/>
+ <field name="BLOCK_MODE_CTR"/>
+ <field name="BLOCK_MODE_ECB"/>
+ <field name="BLOCK_MODE_GCM"/>
+ <field name="DIGEST_MD5"/>
+ <field name="DIGEST_NONE"/>
+ <field name="DIGEST_SHA1"/>
+ <field name="DIGEST_SHA224"/>
+ <field name="DIGEST_SHA256"/>
+ <field name="DIGEST_SHA384"/>
+ <field name="DIGEST_SHA512"/>
+ <field name="ENCRYPTION_PADDING_NONE"/>
+ <field name="ENCRYPTION_PADDING_PKCS7"/>
+ <field name="ENCRYPTION_PADDING_RSA_OAEP"/>
+ <field name="ENCRYPTION_PADDING_RSA_PKCS1"/>
+ <field name="KEY_ALGORITHM_AES"/>
+ <field name="KEY_ALGORITHM_EC"/>
+ <field name="KEY_ALGORITHM_HMAC_SHA1"/>
+ <field name="KEY_ALGORITHM_HMAC_SHA224"/>
+ <field name="KEY_ALGORITHM_HMAC_SHA256"/>
+ <field name="KEY_ALGORITHM_HMAC_SHA384"/>
+ <field name="KEY_ALGORITHM_HMAC_SHA512"/>
+ <field name="KEY_ALGORITHM_RSA"/>
+ <field name="ORIGIN_GENERATED"/>
+ <field name="ORIGIN_IMPORTED"/>
+ <field name="ORIGIN_UNKNOWN"/>
+ <field name="PURPOSE_DECRYPT"/>
+ <field name="PURPOSE_ENCRYPT"/>
+ <field name="PURPOSE_SIGN"/>
+ <field name="PURPOSE_VERIFY"/>
+ <field name="SIGNATURE_PADDING_RSA_PKCS1"/>
+ <field name="SIGNATURE_PADDING_RSA_PSS"/>
+ </class>
+ <class name="android/security/keystore/KeyProtection" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/KeyStore$ProtectionParameter"/>
+ <method name="&lt;init>()V"/>
+ <method name="getBlockModes()[Ljava/lang/String;"/>
+ <method name="getDigests()[Ljava/lang/String;"/>
+ <method name="getEncryptionPaddings()[Ljava/lang/String;"/>
+ <method name="getKeyValidityForConsumptionEnd()Ljava/util/Date;"/>
+ <method name="getKeyValidityForOriginationEnd()Ljava/util/Date;"/>
+ <method name="getKeyValidityStart()Ljava/util/Date;"/>
+ <method name="getPurposes()I"/>
+ <method name="getSignaturePaddings()[Ljava/lang/String;"/>
+ <method name="getUserAuthenticationValidityDurationSeconds()I"/>
+ <method name="isDigestsSpecified()Z"/>
+ <method name="isInvalidatedByBiometricEnrollment()Z" since="24"/>
+ <method name="isRandomizedEncryptionRequired()Z"/>
+ <method name="isUserAuthenticationRequired()Z"/>
+ <method name="isUserAuthenticationValidWhileOnBody()Z" since="24"/>
+ </class>
+ <class name="android/security/keystore/KeyProtection$Builder" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="build()Landroid/security/keystore/KeyProtection;"/>
+ <method name="setBlockModes([Ljava/lang/String;)Landroid/security/keystore/KeyProtection$Builder;"/>
+ <method name="setDigests([Ljava/lang/String;)Landroid/security/keystore/KeyProtection$Builder;"/>
+ <method name="setEncryptionPaddings([Ljava/lang/String;)Landroid/security/keystore/KeyProtection$Builder;"/>
+ <method name="setInvalidatedByBiometricEnrollment(Z)Landroid/security/keystore/KeyProtection$Builder;" since="24"/>
+ <method name="setKeyValidityEnd(Ljava/util/Date;)Landroid/security/keystore/KeyProtection$Builder;"/>
+ <method name="setKeyValidityForConsumptionEnd(Ljava/util/Date;)Landroid/security/keystore/KeyProtection$Builder;"/>
+ <method name="setKeyValidityForOriginationEnd(Ljava/util/Date;)Landroid/security/keystore/KeyProtection$Builder;"/>
+ <method name="setKeyValidityStart(Ljava/util/Date;)Landroid/security/keystore/KeyProtection$Builder;"/>
+ <method name="setRandomizedEncryptionRequired(Z)Landroid/security/keystore/KeyProtection$Builder;"/>
+ <method name="setSignaturePaddings([Ljava/lang/String;)Landroid/security/keystore/KeyProtection$Builder;"/>
+ <method name="setUserAuthenticationRequired(Z)Landroid/security/keystore/KeyProtection$Builder;"/>
+ <method name="setUserAuthenticationValidWhileOnBody(Z)Landroid/security/keystore/KeyProtection$Builder;" since="24"/>
+ <method name="setUserAuthenticationValidityDurationSeconds(I)Landroid/security/keystore/KeyProtection$Builder;"/>
+ </class>
+ <class name="android/security/keystore/UserNotAuthenticatedException" since="23">
+ <extends name="java/security/InvalidKeyException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="android/service/autofill/AutofillService" since="26">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="getFillEventHistory()Landroid/service/autofill/FillEventHistory;"/>
+ <method name="onConnected()V"/>
+ <method name="onDisconnected()V"/>
+ <method name="onFillRequest(Landroid/service/autofill/FillRequest;Landroid/os/CancellationSignal;Landroid/service/autofill/FillCallback;)V"/>
+ <method name="onSaveRequest(Landroid/service/autofill/SaveRequest;Landroid/service/autofill/SaveCallback;)V"/>
+ <field name="SERVICE_INTERFACE"/>
+ <field name="SERVICE_META_DATA"/>
+ </class>
+ <class name="android/service/autofill/Dataset" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/service/autofill/Dataset$Builder" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/widget/RemoteViews;)V"/>
+ <method name="build()Landroid/service/autofill/Dataset;"/>
+ <method name="setAuthentication(Landroid/content/IntentSender;)Landroid/service/autofill/Dataset$Builder;"/>
+ <method name="setId(Ljava/lang/String;)Landroid/service/autofill/Dataset$Builder;"/>
+ <method name="setValue(Landroid/view/autofill/AutofillId;Landroid/view/autofill/AutofillValue;)Landroid/service/autofill/Dataset$Builder;"/>
+ <method name="setValue(Landroid/view/autofill/AutofillId;Landroid/view/autofill/AutofillValue;Landroid/widget/RemoteViews;)Landroid/service/autofill/Dataset$Builder;"/>
+ </class>
+ <class name="android/service/autofill/FillCallback" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onFailure(Ljava/lang/CharSequence;)V"/>
+ <method name="onSuccess(Landroid/service/autofill/FillResponse;)V"/>
+ </class>
+ <class name="android/service/autofill/FillContext" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getRequestId()I"/>
+ <method name="getStructure()Landroid/app/assist/AssistStructure;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/service/autofill/FillEventHistory" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getClientState()Landroid/os/Bundle;"/>
+ <method name="getEvents()Ljava/util/List;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/service/autofill/FillEventHistory$Event" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDatasetId()Ljava/lang/String;"/>
+ <method name="getType()I"/>
+ <field name="TYPE_AUTHENTICATION_SELECTED"/>
+ <field name="TYPE_DATASET_AUTHENTICATION_SELECTED"/>
+ <field name="TYPE_DATASET_SELECTED"/>
+ <field name="TYPE_SAVE_SHOWN"/>
+ </class>
+ <class name="android/service/autofill/FillRequest" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getClientState()Landroid/os/Bundle;"/>
+ <method name="getFillContexts()Ljava/util/List;"/>
+ <method name="getFlags()I"/>
+ <method name="getId()I"/>
+ <field name="CREATOR"/>
+ <field name="FLAG_MANUAL_REQUEST"/>
+ </class>
+ <class name="android/service/autofill/FillResponse" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/service/autofill/FillResponse$Builder" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addDataset(Landroid/service/autofill/Dataset;)Landroid/service/autofill/FillResponse$Builder;"/>
+ <method name="build()Landroid/service/autofill/FillResponse;"/>
+ <method name="setAuthentication([Landroid/view/autofill/AutofillId;Landroid/content/IntentSender;Landroid/widget/RemoteViews;)Landroid/service/autofill/FillResponse$Builder;"/>
+ <method name="setClientState(Landroid/os/Bundle;)Landroid/service/autofill/FillResponse$Builder;"/>
+ <method name="setIgnoredIds([Landroid/view/autofill/AutofillId;)Landroid/service/autofill/FillResponse$Builder;"/>
+ <method name="setSaveInfo(Landroid/service/autofill/SaveInfo;)Landroid/service/autofill/FillResponse$Builder;"/>
+ </class>
+ <class name="android/service/autofill/SaveCallback" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onFailure(Ljava/lang/CharSequence;)V"/>
+ <method name="onSuccess()V"/>
+ </class>
+ <class name="android/service/autofill/SaveInfo" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <field name="CREATOR"/>
+ <field name="FLAG_SAVE_ON_ALL_VIEWS_INVISIBLE"/>
+ <field name="NEGATIVE_BUTTON_STYLE_CANCEL"/>
+ <field name="NEGATIVE_BUTTON_STYLE_REJECT"/>
+ <field name="SAVE_DATA_TYPE_ADDRESS"/>
+ <field name="SAVE_DATA_TYPE_CREDIT_CARD"/>
+ <field name="SAVE_DATA_TYPE_EMAIL_ADDRESS"/>
+ <field name="SAVE_DATA_TYPE_GENERIC"/>
+ <field name="SAVE_DATA_TYPE_PASSWORD"/>
+ <field name="SAVE_DATA_TYPE_USERNAME"/>
+ </class>
+ <class name="android/service/autofill/SaveInfo$Builder" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(I[Landroid/view/autofill/AutofillId;)V"/>
+ <method name="build()Landroid/service/autofill/SaveInfo;"/>
+ <method name="setDescription(Ljava/lang/CharSequence;)Landroid/service/autofill/SaveInfo$Builder;"/>
+ <method name="setFlags(I)Landroid/service/autofill/SaveInfo$Builder;"/>
+ <method name="setNegativeAction(ILandroid/content/IntentSender;)Landroid/service/autofill/SaveInfo$Builder;"/>
+ <method name="setOptionalIds([Landroid/view/autofill/AutofillId;)Landroid/service/autofill/SaveInfo$Builder;"/>
+ </class>
+ <class name="android/service/autofill/SaveRequest" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getClientState()Landroid/os/Bundle;"/>
+ <method name="getFillContexts()Ljava/util/List;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/service/carrier/CarrierIdentifier" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="getGid1()Ljava/lang/String;"/>
+ <method name="getGid2()Ljava/lang/String;"/>
+ <method name="getImsi()Ljava/lang/String;"/>
+ <method name="getMcc()Ljava/lang/String;"/>
+ <method name="getMnc()Ljava/lang/String;"/>
+ <method name="getSpn()Ljava/lang/String;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/service/carrier/CarrierMessagingService" since="22">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="onDownloadMms(Landroid/net/Uri;ILandroid/net/Uri;Landroid/service/carrier/CarrierMessagingService$ResultCallback;)V"/>
+ <method name="onFilterSms(Landroid/service/carrier/MessagePdu;Ljava/lang/String;IILandroid/service/carrier/CarrierMessagingService$ResultCallback;)V" deprecated="24"/>
+ <method name="onReceiveTextSms(Landroid/service/carrier/MessagePdu;Ljava/lang/String;IILandroid/service/carrier/CarrierMessagingService$ResultCallback;)V" since="24"/>
+ <method name="onSendDataSms([BILjava/lang/String;IILandroid/service/carrier/CarrierMessagingService$ResultCallback;)V" since="23"/>
+ <method name="onSendDataSms([BILjava/lang/String;ILandroid/service/carrier/CarrierMessagingService$ResultCallback;)V" deprecated="23"/>
+ <method name="onSendMms(Landroid/net/Uri;ILandroid/net/Uri;Landroid/service/carrier/CarrierMessagingService$ResultCallback;)V"/>
+ <method name="onSendMultipartTextSms(Ljava/util/List;ILjava/lang/String;ILandroid/service/carrier/CarrierMessagingService$ResultCallback;)V" since="23"/>
+ <method name="onSendMultipartTextSms(Ljava/util/List;ILjava/lang/String;Landroid/service/carrier/CarrierMessagingService$ResultCallback;)V" deprecated="23"/>
+ <method name="onSendTextSms(Ljava/lang/String;ILjava/lang/String;ILandroid/service/carrier/CarrierMessagingService$ResultCallback;)V" since="23"/>
+ <method name="onSendTextSms(Ljava/lang/String;ILjava/lang/String;Landroid/service/carrier/CarrierMessagingService$ResultCallback;)V" deprecated="23"/>
+ <field name="DOWNLOAD_STATUS_ERROR"/>
+ <field name="DOWNLOAD_STATUS_OK"/>
+ <field name="DOWNLOAD_STATUS_RETRY_ON_CARRIER_NETWORK"/>
+ <field name="RECEIVE_OPTIONS_DEFAULT" since="24"/>
+ <field name="RECEIVE_OPTIONS_DROP" since="24"/>
+ <field name="RECEIVE_OPTIONS_SKIP_NOTIFY_WHEN_CREDENTIAL_PROTECTED_STORAGE_UNAVAILABLE" since="24"/>
+ <field name="SEND_FLAG_REQUEST_DELIVERY_STATUS" since="23"/>
+ <field name="SEND_STATUS_ERROR"/>
+ <field name="SEND_STATUS_OK"/>
+ <field name="SEND_STATUS_RETRY_ON_CARRIER_NETWORK"/>
+ <field name="SERVICE_INTERFACE"/>
+ </class>
+ <class name="android/service/carrier/CarrierMessagingService$ResultCallback" since="22">
+ <extends name="java/lang/Object"/>
+ <method name="onReceiveResult(Ljava/lang/Object;)V"/>
+ </class>
+ <class name="android/service/carrier/CarrierMessagingService$SendMmsResult" since="22">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(I[B)V"/>
+ <method name="getSendConfPdu()[B"/>
+ <method name="getSendStatus()I"/>
+ </class>
+ <class name="android/service/carrier/CarrierMessagingService$SendMultipartSmsResult" since="22">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(I[I)V"/>
+ <method name="getMessageRefs()[I"/>
+ <method name="getSendStatus()I"/>
+ </class>
+ <class name="android/service/carrier/CarrierMessagingService$SendSmsResult" since="22">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="getMessageRef()I"/>
+ <method name="getSendStatus()I"/>
+ </class>
+ <class name="android/service/carrier/CarrierService" since="23">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="notifyCarrierNetworkChange(Z)V"/>
+ <method name="onLoadConfig(Landroid/service/carrier/CarrierIdentifier;)Landroid/os/PersistableBundle;"/>
+ <field name="CARRIER_SERVICE_INTERFACE"/>
+ </class>
+ <class name="android/service/carrier/MessagePdu" since="22">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Ljava/util/List;)V"/>
+ <method name="getPdus()Ljava/util/List;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/service/chooser/ChooserTarget" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;Landroid/graphics/drawable/Icon;FLandroid/content/ComponentName;Landroid/os/Bundle;)V"/>
+ <method name="getComponentName()Landroid/content/ComponentName;"/>
+ <method name="getIcon()Landroid/graphics/drawable/Icon;"/>
+ <method name="getIntentExtras()Landroid/os/Bundle;"/>
+ <method name="getScore()F"/>
+ <method name="getTitle()Ljava/lang/CharSequence;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/service/chooser/ChooserTargetService" since="23">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="onGetChooserTargets(Landroid/content/ComponentName;Landroid/content/IntentFilter;)Ljava/util/List;"/>
+ <field name="BIND_PERMISSION"/>
+ <field name="META_DATA_NAME"/>
+ <field name="SERVICE_INTERFACE"/>
+ </class>
+ <class name="android/service/dreams/DreamService" since="17">
+ <extends name="android/app/Service"/>
+ <implements name="android/view/Window$Callback"/>
+ <method name="&lt;init>()V"/>
+ <method name="addContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V"/>
+ <method name="findViewById(I)Landroid/view/View;"/>
+ <method name="finish()V"/>
+ <method name="getWindow()Landroid/view/Window;"/>
+ <method name="getWindowManager()Landroid/view/WindowManager;"/>
+ <method name="isFullscreen()Z"/>
+ <method name="isInteractive()Z"/>
+ <method name="isScreenBright()Z"/>
+ <method name="onDreamingStarted()V"/>
+ <method name="onDreamingStopped()V"/>
+ <method name="onWakeUp()V" since="21"/>
+ <method name="setContentView(I)V"/>
+ <method name="setContentView(Landroid/view/View;)V"/>
+ <method name="setContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V"/>
+ <method name="setFullscreen(Z)V"/>
+ <method name="setInteractive(Z)V"/>
+ <method name="setScreenBright(Z)V"/>
+ <method name="wakeUp()V" since="21"/>
+ <field name="DREAM_META_DATA"/>
+ <field name="SERVICE_INTERFACE"/>
+ </class>
+ <class name="android/service/media/CameraPrewarmService" since="23">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="onCooldown(Z)V"/>
+ <method name="onPrewarm()V"/>
+ </class>
+ <class name="android/service/media/MediaBrowserService" since="21">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="getBrowserRootHints()Landroid/os/Bundle;" since="24"/>
+ <method name="getSessionToken()Landroid/media/session/MediaSession$Token;"/>
+ <method name="notifyChildrenChanged(Ljava/lang/String;)V"/>
+ <method name="notifyChildrenChanged(Ljava/lang/String;Landroid/os/Bundle;)V" since="24"/>
+ <method name="onGetRoot(Ljava/lang/String;ILandroid/os/Bundle;)Landroid/service/media/MediaBrowserService$BrowserRoot;"/>
+ <method name="onLoadChildren(Ljava/lang/String;Landroid/service/media/MediaBrowserService$Result;)V"/>
+ <method name="onLoadChildren(Ljava/lang/String;Landroid/service/media/MediaBrowserService$Result;Landroid/os/Bundle;)V" since="24"/>
+ <method name="onLoadItem(Ljava/lang/String;Landroid/service/media/MediaBrowserService$Result;)V" since="23"/>
+ <method name="setSessionToken(Landroid/media/session/MediaSession$Token;)V"/>
+ <field name="SERVICE_INTERFACE"/>
+ </class>
+ <class name="android/service/media/MediaBrowserService$BrowserRoot" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;Landroid/os/Bundle;)V"/>
+ <method name="getExtras()Landroid/os/Bundle;"/>
+ <method name="getRootId()Ljava/lang/String;"/>
+ <field name="EXTRA_OFFLINE" since="24"/>
+ <field name="EXTRA_RECENT" since="24"/>
+ <field name="EXTRA_SUGGESTED" since="24"/>
+ </class>
+ <class name="android/service/media/MediaBrowserService$Result" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/service/media/MediaBrowserService;)V"/>
+ <method name="detach()V"/>
+ <method name="sendResult(Ljava/lang/Object;)V"/>
+ </class>
+ <class name="android/service/notification/Condition" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/net/Uri;Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;III)V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="copy()Landroid/service/notification/Condition;"/>
+ <method name="isValidId(Landroid/net/Uri;Ljava/lang/String;)Z"/>
+ <method name="newId(Landroid/content/Context;)Landroid/net/Uri$Builder;"/>
+ <method name="relevanceToString(I)Ljava/lang/String;"/>
+ <method name="stateToString(I)Ljava/lang/String;"/>
+ <field name="CREATOR"/>
+ <field name="FLAG_RELEVANT_ALWAYS"/>
+ <field name="FLAG_RELEVANT_NOW"/>
+ <field name="SCHEME"/>
+ <field name="STATE_ERROR"/>
+ <field name="STATE_FALSE"/>
+ <field name="STATE_TRUE"/>
+ <field name="STATE_UNKNOWN"/>
+ <field name="flags"/>
+ <field name="icon"/>
+ <field name="id"/>
+ <field name="line1"/>
+ <field name="line2"/>
+ <field name="state"/>
+ <field name="summary"/>
+ </class>
+ <class name="android/service/notification/ConditionProviderService" since="24">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="notifyCondition(Landroid/service/notification/Condition;)V"/>
+ <method name="notifyConditions([Landroid/service/notification/Condition;)V"/>
+ <method name="onConnected()V"/>
+ <method name="onRequestConditions(I)V"/>
+ <method name="onSubscribe(Landroid/net/Uri;)V"/>
+ <method name="onUnsubscribe(Landroid/net/Uri;)V"/>
+ <method name="requestRebind(Landroid/content/ComponentName;)V" since="26"/>
+ <method name="requestUnbind()V" since="26"/>
+ <field name="EXTRA_RULE_ID"/>
+ <field name="META_DATA_CONFIGURATION_ACTIVITY"/>
+ <field name="META_DATA_RULE_INSTANCE_LIMIT"/>
+ <field name="META_DATA_RULE_TYPE"/>
+ <field name="SERVICE_INTERFACE"/>
+ </class>
+ <class name="android/service/notification/NotificationListenerService" since="18">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="cancelAllNotifications()V"/>
+ <method name="cancelNotification(Ljava/lang/String;)V" since="21"/>
+ <method name="cancelNotification(Ljava/lang/String;Ljava/lang/String;I)V" deprecated="21"/>
+ <method name="cancelNotifications([Ljava/lang/String;)V" since="21"/>
+ <method name="getActiveNotifications()[Landroid/service/notification/StatusBarNotification;"/>
+ <method name="getActiveNotifications([Ljava/lang/String;)[Landroid/service/notification/StatusBarNotification;" since="21"/>
+ <method name="getCurrentInterruptionFilter()I" since="21"/>
+ <method name="getCurrentListenerHints()I" since="21"/>
+ <method name="getCurrentRanking()Landroid/service/notification/NotificationListenerService$RankingMap;" since="21"/>
+ <method name="getNotificationChannelGroups(Ljava/lang/String;Landroid/os/UserHandle;)Ljava/util/List;" since="26"/>
+ <method name="getNotificationChannels(Ljava/lang/String;Landroid/os/UserHandle;)Ljava/util/List;" since="26"/>
+ <method name="getSnoozedNotifications()[Landroid/service/notification/StatusBarNotification;" since="26"/>
+ <method name="onInterruptionFilterChanged(I)V" since="21"/>
+ <method name="onListenerConnected()V" since="21"/>
+ <method name="onListenerDisconnected()V" since="24"/>
+ <method name="onListenerHintsChanged(I)V" since="21"/>
+ <method name="onNotificationChannelGroupModified(Ljava/lang/String;Landroid/os/UserHandle;Landroid/app/NotificationChannelGroup;I)V" since="26"/>
+ <method name="onNotificationChannelModified(Ljava/lang/String;Landroid/os/UserHandle;Landroid/app/NotificationChannel;I)V" since="26"/>
+ <method name="onNotificationPosted(Landroid/service/notification/StatusBarNotification;)V"/>
+ <method name="onNotificationPosted(Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationListenerService$RankingMap;)V" since="21"/>
+ <method name="onNotificationRankingUpdate(Landroid/service/notification/NotificationListenerService$RankingMap;)V" since="21"/>
+ <method name="onNotificationRemoved(Landroid/service/notification/StatusBarNotification;)V"/>
+ <method name="onNotificationRemoved(Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationListenerService$RankingMap;)V" since="21"/>
+ <method name="onNotificationRemoved(Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationListenerService$RankingMap;I)V" since="26"/>
+ <method name="requestInterruptionFilter(I)V" since="21"/>
+ <method name="requestListenerHints(I)V" since="21"/>
+ <method name="requestRebind(Landroid/content/ComponentName;)V" since="24"/>
+ <method name="requestUnbind()V" since="24"/>
+ <method name="setNotificationsShown([Ljava/lang/String;)V" since="23"/>
+ <method name="snoozeNotification(Ljava/lang/String;J)V" since="26"/>
+ <method name="updateNotificationChannel(Ljava/lang/String;Landroid/os/UserHandle;Landroid/app/NotificationChannel;)V" since="26"/>
+ <field name="HINT_HOST_DISABLE_CALL_EFFECTS" since="24"/>
+ <field name="HINT_HOST_DISABLE_EFFECTS" since="21"/>
+ <field name="HINT_HOST_DISABLE_NOTIFICATION_EFFECTS" since="24"/>
+ <field name="INTERRUPTION_FILTER_ALARMS" since="23"/>
+ <field name="INTERRUPTION_FILTER_ALL" since="21"/>
+ <field name="INTERRUPTION_FILTER_NONE" since="21"/>
+ <field name="INTERRUPTION_FILTER_PRIORITY" since="21"/>
+ <field name="INTERRUPTION_FILTER_UNKNOWN" since="23"/>
+ <field name="NOTIFICATION_CHANNEL_OR_GROUP_ADDED" since="26"/>
+ <field name="NOTIFICATION_CHANNEL_OR_GROUP_DELETED" since="26"/>
+ <field name="NOTIFICATION_CHANNEL_OR_GROUP_UPDATED" since="26"/>
+ <field name="REASON_APP_CANCEL" since="26"/>
+ <field name="REASON_APP_CANCEL_ALL" since="26"/>
+ <field name="REASON_CANCEL" since="26"/>
+ <field name="REASON_CANCEL_ALL" since="26"/>
+ <field name="REASON_CHANNEL_BANNED" since="26"/>
+ <field name="REASON_CLICK" since="26"/>
+ <field name="REASON_ERROR" since="26"/>
+ <field name="REASON_GROUP_OPTIMIZATION" since="26"/>
+ <field name="REASON_GROUP_SUMMARY_CANCELED" since="26"/>
+ <field name="REASON_LISTENER_CANCEL" since="26"/>
+ <field name="REASON_LISTENER_CANCEL_ALL" since="26"/>
+ <field name="REASON_PACKAGE_BANNED" since="26"/>
+ <field name="REASON_PACKAGE_CHANGED" since="26"/>
+ <field name="REASON_PACKAGE_SUSPENDED" since="26"/>
+ <field name="REASON_PROFILE_TURNED_OFF" since="26"/>
+ <field name="REASON_SNOOZED" since="26"/>
+ <field name="REASON_TIMEOUT" since="26"/>
+ <field name="REASON_UNAUTOBUNDLED" since="26"/>
+ <field name="REASON_USER_STOPPED" since="26"/>
+ <field name="SERVICE_INTERFACE"/>
+ <field name="SUPPRESSED_EFFECT_SCREEN_OFF" since="24"/>
+ <field name="SUPPRESSED_EFFECT_SCREEN_ON" since="24"/>
+ </class>
+ <class name="android/service/notification/NotificationListenerService$Ranking" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="canShowBadge()Z" since="26"/>
+ <method name="getChannel()Landroid/app/NotificationChannel;" since="26"/>
+ <method name="getImportance()I" since="24"/>
+ <method name="getImportanceExplanation()Ljava/lang/CharSequence;" since="24"/>
+ <method name="getKey()Ljava/lang/String;"/>
+ <method name="getOverrideGroupKey()Ljava/lang/String;" since="24"/>
+ <method name="getRank()I"/>
+ <method name="getSuppressedVisualEffects()I" since="24"/>
+ <method name="isAmbient()Z"/>
+ <method name="matchesInterruptionFilter()Z"/>
+ </class>
+ <class name="android/service/notification/NotificationListenerService$RankingMap" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getOrderedKeys()[Ljava/lang/String;"/>
+ <method name="getRanking(Ljava/lang/String;Landroid/service/notification/NotificationListenerService$Ranking;)Z"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/service/notification/StatusBarNotification" since="18">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;IIILandroid/app/Notification;Landroid/os/UserHandle;J)V" deprecated="26"/>
+ <method name="clone()Landroid/service/notification/StatusBarNotification;"/>
+ <method name="getGroupKey()Ljava/lang/String;" since="21"/>
+ <method name="getId()I"/>
+ <method name="getKey()Ljava/lang/String;" since="20"/>
+ <method name="getNotification()Landroid/app/Notification;"/>
+ <method name="getOverrideGroupKey()Ljava/lang/String;" since="24"/>
+ <method name="getPackageName()Ljava/lang/String;"/>
+ <method name="getPostTime()J"/>
+ <method name="getTag()Ljava/lang/String;"/>
+ <method name="getUser()Landroid/os/UserHandle;" since="21"/>
+ <method name="getUserId()I" deprecated="21"/>
+ <method name="isClearable()Z"/>
+ <method name="isGroup()Z" since="24"/>
+ <method name="isOngoing()Z"/>
+ <method name="setOverrideGroupKey(Ljava/lang/String;)V" since="24"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/service/quicksettings/Tile" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getContentDescription()Ljava/lang/CharSequence;"/>
+ <method name="getIcon()Landroid/graphics/drawable/Icon;"/>
+ <method name="getLabel()Ljava/lang/CharSequence;"/>
+ <method name="getState()I"/>
+ <method name="setContentDescription(Ljava/lang/CharSequence;)V"/>
+ <method name="setIcon(Landroid/graphics/drawable/Icon;)V"/>
+ <method name="setLabel(Ljava/lang/CharSequence;)V"/>
+ <method name="setState(I)V"/>
+ <method name="updateTile()V"/>
+ <field name="CREATOR"/>
+ <field name="STATE_ACTIVE"/>
+ <field name="STATE_INACTIVE"/>
+ <field name="STATE_UNAVAILABLE"/>
+ </class>
+ <class name="android/service/quicksettings/TileService" since="24">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="getQsTile()Landroid/service/quicksettings/Tile;"/>
+ <method name="isLocked()Z"/>
+ <method name="isSecure()Z"/>
+ <method name="onClick()V"/>
+ <method name="onStartListening()V"/>
+ <method name="onStopListening()V"/>
+ <method name="onTileAdded()V"/>
+ <method name="onTileRemoved()V"/>
+ <method name="requestListeningState(Landroid/content/Context;Landroid/content/ComponentName;)V"/>
+ <method name="showDialog(Landroid/app/Dialog;)V"/>
+ <method name="startActivityAndCollapse(Landroid/content/Intent;)V"/>
+ <method name="unlockAndRun(Ljava/lang/Runnable;)V"/>
+ <field name="ACTION_QS_TILE"/>
+ <field name="ACTION_QS_TILE_PREFERENCES"/>
+ <field name="META_DATA_ACTIVE_TILE"/>
+ </class>
+ <class name="android/service/restrictions/RestrictionsReceiver" since="21">
+ <extends name="android/content/BroadcastReceiver"/>
+ <method name="&lt;init>()V"/>
+ <method name="onRequestPermission(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/PersistableBundle;)V"/>
+ </class>
+ <class name="android/service/textservice/SpellCheckerService" since="14">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="createSession()Landroid/service/textservice/SpellCheckerService$Session;"/>
+ <field name="SERVICE_INTERFACE"/>
+ </class>
+ <class name="android/service/textservice/SpellCheckerService$Session" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getBundle()Landroid/os/Bundle;"/>
+ <method name="getLocale()Ljava/lang/String;"/>
+ <method name="onCancel()V"/>
+ <method name="onClose()V" since="15"/>
+ <method name="onCreate()V"/>
+ <method name="onGetSentenceSuggestionsMultiple([Landroid/view/textservice/TextInfo;I)[Landroid/view/textservice/SentenceSuggestionsInfo;" since="16"/>
+ <method name="onGetSuggestions(Landroid/view/textservice/TextInfo;I)Landroid/view/textservice/SuggestionsInfo;"/>
+ <method name="onGetSuggestionsMultiple([Landroid/view/textservice/TextInfo;IZ)[Landroid/view/textservice/SuggestionsInfo;"/>
+ </class>
+ <class name="android/service/voice/AlwaysOnHotwordDetector" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="createEnrollIntent()Landroid/content/Intent;"/>
+ <method name="createReEnrollIntent()Landroid/content/Intent;"/>
+ <method name="createUnEnrollIntent()Landroid/content/Intent;"/>
+ <method name="getSupportedRecognitionModes()I"/>
+ <method name="startRecognition(I)Z"/>
+ <method name="stopRecognition()Z"/>
+ <field name="RECOGNITION_FLAG_ALLOW_MULTIPLE_TRIGGERS"/>
+ <field name="RECOGNITION_FLAG_CAPTURE_TRIGGER_AUDIO"/>
+ <field name="RECOGNITION_MODE_USER_IDENTIFICATION"/>
+ <field name="RECOGNITION_MODE_VOICE_TRIGGER"/>
+ <field name="STATE_HARDWARE_UNAVAILABLE"/>
+ <field name="STATE_KEYPHRASE_ENROLLED"/>
+ <field name="STATE_KEYPHRASE_UNENROLLED"/>
+ <field name="STATE_KEYPHRASE_UNSUPPORTED"/>
+ </class>
+ <class name="android/service/voice/AlwaysOnHotwordDetector$Callback" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onAvailabilityChanged(I)V"/>
+ <method name="onDetected(Landroid/service/voice/AlwaysOnHotwordDetector$EventPayload;)V"/>
+ <method name="onError()V"/>
+ <method name="onRecognitionPaused()V"/>
+ <method name="onRecognitionResumed()V"/>
+ </class>
+ <class name="android/service/voice/AlwaysOnHotwordDetector$EventPayload" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCaptureAudioFormat()Landroid/media/AudioFormat;"/>
+ <method name="getTriggerAudio()[B"/>
+ </class>
+ <class name="android/service/voice/VoiceInteractionService" since="21">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="createAlwaysOnHotwordDetector(Ljava/lang/String;Ljava/util/Locale;Landroid/service/voice/AlwaysOnHotwordDetector$Callback;)Landroid/service/voice/AlwaysOnHotwordDetector;"/>
+ <method name="getDisabledShowContext()I" since="23"/>
+ <method name="isActiveService(Landroid/content/Context;Landroid/content/ComponentName;)Z"/>
+ <method name="onLaunchVoiceAssistFromKeyguard()V" since="23"/>
+ <method name="onReady()V"/>
+ <method name="onShutdown()V"/>
+ <method name="setDisabledShowContext(I)V" since="23"/>
+ <method name="showSession(Landroid/os/Bundle;I)V" since="23"/>
+ <method name="startSession(Landroid/os/Bundle;)V" removed="23"/>
+ <field name="SERVICE_INTERFACE"/>
+ <field name="SERVICE_META_DATA"/>
+ </class>
+ <class name="android/service/voice/VoiceInteractionSession" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/content/ComponentCallbacks2" since="23"/>
+ <implements name="android/view/KeyEvent$Callback"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/os/Handler;)V"/>
+ <method name="closeSystemDialogs()V" since="23"/>
+ <method name="dump(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V" since="23"/>
+ <method name="finish()V"/>
+ <method name="getContext()Landroid/content/Context;" since="23"/>
+ <method name="getDisabledShowContext()I" since="23"/>
+ <method name="getLayoutInflater()Landroid/view/LayoutInflater;" since="23"/>
+ <method name="getUserDisabledShowContext()I" since="23"/>
+ <method name="getWindow()Landroid/app/Dialog;" since="23"/>
+ <method name="hide()V" since="23"/>
+ <method name="onAssistStructureFailure(Ljava/lang/Throwable;)V" since="23"/>
+ <method name="onBackPressed()V" since="23"/>
+ <method name="onCancelRequest(Landroid/service/voice/VoiceInteractionSession$Request;)V" since="23"/>
+ <method name="onCloseSystemDialogs()V"/>
+ <method name="onComputeInsets(Landroid/service/voice/VoiceInteractionSession$Insets;)V" since="23"/>
+ <method name="onCreate()V" since="23"/>
+ <method name="onCreate(Landroid/os/Bundle;)V" removed="23"/>
+ <method name="onCreateContentView()Landroid/view/View;" since="23"/>
+ <method name="onDestroy()V"/>
+ <method name="onGetSupportedCommands([Ljava/lang/String;)[Z" since="23"/>
+ <method name="onHandleAssist(Landroid/os/Bundle;Landroid/app/assist/AssistStructure;Landroid/app/assist/AssistContent;)V" since="23"/>
+ <method name="onHandleAssistSecondary(Landroid/os/Bundle;Landroid/app/assist/AssistStructure;Landroid/app/assist/AssistContent;II)V" since="24"/>
+ <method name="onHandleScreenshot(Landroid/graphics/Bitmap;)V" since="23"/>
+ <method name="onHide()V" since="23"/>
+ <method name="onLockscreenShown()V" since="23"/>
+ <method name="onPrepareShow(Landroid/os/Bundle;I)V" since="26"/>
+ <method name="onRequestAbortVoice(Landroid/service/voice/VoiceInteractionSession$AbortVoiceRequest;)V" since="23"/>
+ <method name="onRequestCommand(Landroid/service/voice/VoiceInteractionSession$CommandRequest;)V" since="23"/>
+ <method name="onRequestCompleteVoice(Landroid/service/voice/VoiceInteractionSession$CompleteVoiceRequest;)V" since="23"/>
+ <method name="onRequestConfirmation(Landroid/service/voice/VoiceInteractionSession$ConfirmationRequest;)V" since="23"/>
+ <method name="onRequestPickOption(Landroid/service/voice/VoiceInteractionSession$PickOptionRequest;)V" since="23"/>
+ <method name="onShow(Landroid/os/Bundle;I)V" since="23"/>
+ <method name="onTaskFinished(Landroid/content/Intent;I)V" since="23"/>
+ <method name="onTaskStarted(Landroid/content/Intent;I)V" since="23"/>
+ <method name="setContentView(Landroid/view/View;)V"/>
+ <method name="setDisabledShowContext(I)V" since="23"/>
+ <method name="setKeepAwake(Z)V" since="23"/>
+ <method name="setTheme(I)V" since="23"/>
+ <method name="setUiEnabled(Z)V" since="26"/>
+ <method name="show(Landroid/os/Bundle;I)V" since="23"/>
+ <method name="startAssistantActivity(Landroid/content/Intent;)V" since="26"/>
+ <method name="startVoiceActivity(Landroid/content/Intent;)V" since="23"/>
+ <field name="SHOW_SOURCE_ACTIVITY" since="24"/>
+ <field name="SHOW_SOURCE_APPLICATION" since="23"/>
+ <field name="SHOW_SOURCE_ASSIST_GESTURE" since="23"/>
+ <field name="SHOW_WITH_ASSIST" since="23"/>
+ <field name="SHOW_WITH_SCREENSHOT" since="23"/>
+ </class>
+ <class name="android/service/voice/VoiceInteractionSession$AbortVoiceRequest" since="23">
+ <extends name="android/service/voice/VoiceInteractionSession$Request"/>
+ <method name="&lt;init>()V"/>
+ <method name="getMessage()Ljava/lang/CharSequence;" deprecated="23"/>
+ <method name="getVoicePrompt()Landroid/app/VoiceInteractor$Prompt;"/>
+ <method name="sendAbortResult(Landroid/os/Bundle;)V"/>
+ </class>
+ <class name="android/service/voice/VoiceInteractionSession$CommandRequest" since="23">
+ <extends name="android/service/voice/VoiceInteractionSession$Request"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCommand()Ljava/lang/String;"/>
+ <method name="sendIntermediateResult(Landroid/os/Bundle;)V"/>
+ <method name="sendResult(Landroid/os/Bundle;)V"/>
+ </class>
+ <class name="android/service/voice/VoiceInteractionSession$CompleteVoiceRequest" since="23">
+ <extends name="android/service/voice/VoiceInteractionSession$Request"/>
+ <method name="&lt;init>()V"/>
+ <method name="getMessage()Ljava/lang/CharSequence;" deprecated="23"/>
+ <method name="getVoicePrompt()Landroid/app/VoiceInteractor$Prompt;"/>
+ <method name="sendCompleteResult(Landroid/os/Bundle;)V"/>
+ </class>
+ <class name="android/service/voice/VoiceInteractionSession$ConfirmationRequest" since="23">
+ <extends name="android/service/voice/VoiceInteractionSession$Request"/>
+ <method name="&lt;init>()V"/>
+ <method name="getPrompt()Ljava/lang/CharSequence;" deprecated="23"/>
+ <method name="getVoicePrompt()Landroid/app/VoiceInteractor$Prompt;"/>
+ <method name="sendConfirmationResult(ZLandroid/os/Bundle;)V"/>
+ </class>
+ <class name="android/service/voice/VoiceInteractionSession$Insets" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="TOUCHABLE_INSETS_CONTENT"/>
+ <field name="TOUCHABLE_INSETS_FRAME"/>
+ <field name="TOUCHABLE_INSETS_REGION"/>
+ <field name="contentInsets"/>
+ <field name="touchableInsets"/>
+ <field name="touchableRegion"/>
+ </class>
+ <class name="android/service/voice/VoiceInteractionSession$PickOptionRequest" since="23">
+ <extends name="android/service/voice/VoiceInteractionSession$Request"/>
+ <method name="&lt;init>()V"/>
+ <method name="getOptions()[Landroid/app/VoiceInteractor$PickOptionRequest$Option;"/>
+ <method name="getPrompt()Ljava/lang/CharSequence;" deprecated="23"/>
+ <method name="getVoicePrompt()Landroid/app/VoiceInteractor$Prompt;"/>
+ <method name="sendIntermediatePickOptionResult([Landroid/app/VoiceInteractor$PickOptionRequest$Option;Landroid/os/Bundle;)V"/>
+ <method name="sendPickOptionResult([Landroid/app/VoiceInteractor$PickOptionRequest$Option;Landroid/os/Bundle;)V"/>
+ </class>
+ <class name="android/service/voice/VoiceInteractionSession$Request" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="cancel()V"/>
+ <method name="getCallingPackage()Ljava/lang/String;"/>
+ <method name="getCallingUid()I"/>
+ <method name="getExtras()Landroid/os/Bundle;"/>
+ <method name="isActive()Z"/>
+ </class>
+ <class name="android/service/voice/VoiceInteractionSessionService" since="21">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="onNewSession(Landroid/os/Bundle;)Landroid/service/voice/VoiceInteractionSession;"/>
+ </class>
+ <class name="android/service/vr/VrListenerService" since="24">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="isVrModePackageEnabled(Landroid/content/Context;Landroid/content/ComponentName;)Z"/>
+ <method name="onCurrentVrActivityChanged(Landroid/content/ComponentName;)V"/>
+ <field name="SERVICE_INTERFACE"/>
+ </class>
+ <class name="android/service/wallpaper/WallpaperService" since="7">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="onCreateEngine()Landroid/service/wallpaper/WallpaperService$Engine;"/>
+ <field name="SERVICE_INTERFACE"/>
+ <field name="SERVICE_META_DATA"/>
+ </class>
+ <class name="android/service/wallpaper/WallpaperService$Engine" since="7">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/service/wallpaper/WallpaperService;)V"/>
+ <method name="dump(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V" since="14"/>
+ <method name="getDesiredMinimumHeight()I"/>
+ <method name="getDesiredMinimumWidth()I"/>
+ <method name="getSurfaceHolder()Landroid/view/SurfaceHolder;"/>
+ <method name="isPreview()Z"/>
+ <method name="isVisible()Z"/>
+ <method name="onApplyWindowInsets(Landroid/view/WindowInsets;)V" since="21"/>
+ <method name="onCommand(Ljava/lang/String;IIILandroid/os/Bundle;Z)Landroid/os/Bundle;"/>
+ <method name="onCreate(Landroid/view/SurfaceHolder;)V"/>
+ <method name="onDesiredSizeChanged(II)V"/>
+ <method name="onDestroy()V"/>
+ <method name="onOffsetsChanged(FFFFII)V"/>
+ <method name="onSurfaceChanged(Landroid/view/SurfaceHolder;III)V"/>
+ <method name="onSurfaceCreated(Landroid/view/SurfaceHolder;)V"/>
+ <method name="onSurfaceDestroyed(Landroid/view/SurfaceHolder;)V"/>
+ <method name="onSurfaceRedrawNeeded(Landroid/view/SurfaceHolder;)V" since="9"/>
+ <method name="onTouchEvent(Landroid/view/MotionEvent;)V"/>
+ <method name="onVisibilityChanged(Z)V"/>
+ <method name="setOffsetNotificationsEnabled(Z)V" since="15"/>
+ <method name="setTouchEventsEnabled(Z)V"/>
+ </class>
+ <class name="android/speech/RecognitionListener" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="onBeginningOfSpeech()V"/>
+ <method name="onBufferReceived([B)V"/>
+ <method name="onEndOfSpeech()V"/>
+ <method name="onError(I)V"/>
+ <method name="onEvent(ILandroid/os/Bundle;)V"/>
+ <method name="onPartialResults(Landroid/os/Bundle;)V"/>
+ <method name="onReadyForSpeech(Landroid/os/Bundle;)V"/>
+ <method name="onResults(Landroid/os/Bundle;)V"/>
+ <method name="onRmsChanged(F)V"/>
+ </class>
+ <class name="android/speech/RecognitionService" since="8">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="onCancel(Landroid/speech/RecognitionService$Callback;)V"/>
+ <method name="onStartListening(Landroid/content/Intent;Landroid/speech/RecognitionService$Callback;)V"/>
+ <method name="onStopListening(Landroid/speech/RecognitionService$Callback;)V"/>
+ <field name="SERVICE_INTERFACE"/>
+ <field name="SERVICE_META_DATA"/>
+ </class>
+ <class name="android/speech/RecognitionService$Callback" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/speech/RecognitionService;)V"/>
+ <method name="beginningOfSpeech()V"/>
+ <method name="bufferReceived([B)V"/>
+ <method name="endOfSpeech()V"/>
+ <method name="error(I)V"/>
+ <method name="getCallingUid()I" since="23"/>
+ <method name="partialResults(Landroid/os/Bundle;)V"/>
+ <method name="readyForSpeech(Landroid/os/Bundle;)V"/>
+ <method name="results(Landroid/os/Bundle;)V"/>
+ <method name="rmsChanged(F)V"/>
+ </class>
+ <class name="android/speech/RecognizerIntent" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getVoiceDetailsIntent(Landroid/content/Context;)Landroid/content/Intent;" since="8"/>
+ <field name="ACTION_GET_LANGUAGE_DETAILS" since="8"/>
+ <field name="ACTION_RECOGNIZE_SPEECH"/>
+ <field name="ACTION_VOICE_SEARCH_HANDS_FREE" since="16"/>
+ <field name="ACTION_WEB_SEARCH"/>
+ <field name="DETAILS_META_DATA" since="8"/>
+ <field name="EXTRA_CALLING_PACKAGE" since="8"/>
+ <field name="EXTRA_CONFIDENCE_SCORES" since="14"/>
+ <field name="EXTRA_LANGUAGE"/>
+ <field name="EXTRA_LANGUAGE_MODEL"/>
+ <field name="EXTRA_LANGUAGE_PREFERENCE" since="8"/>
+ <field name="EXTRA_MAX_RESULTS"/>
+ <field name="EXTRA_ONLY_RETURN_LANGUAGE_PREFERENCE" since="8"/>
+ <field name="EXTRA_ORIGIN" since="14"/>
+ <field name="EXTRA_PARTIAL_RESULTS" since="8"/>
+ <field name="EXTRA_PREFER_OFFLINE" since="23"/>
+ <field name="EXTRA_PROMPT"/>
+ <field name="EXTRA_RESULTS"/>
+ <field name="EXTRA_RESULTS_PENDINGINTENT"/>
+ <field name="EXTRA_RESULTS_PENDINGINTENT_BUNDLE"/>
+ <field name="EXTRA_SECURE" since="16"/>
+ <field name="EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS" since="8"/>
+ <field name="EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS" since="8"/>
+ <field name="EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS" since="8"/>
+ <field name="EXTRA_SUPPORTED_LANGUAGES" since="8"/>
+ <field name="EXTRA_WEB_SEARCH_ONLY" since="11"/>
+ <field name="LANGUAGE_MODEL_FREE_FORM"/>
+ <field name="LANGUAGE_MODEL_WEB_SEARCH"/>
+ <field name="RESULT_AUDIO_ERROR"/>
+ <field name="RESULT_CLIENT_ERROR"/>
+ <field name="RESULT_NETWORK_ERROR"/>
+ <field name="RESULT_NO_MATCH"/>
+ <field name="RESULT_SERVER_ERROR"/>
+ </class>
+ <class name="android/speech/RecognizerResultsIntent" since="10">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="ACTION_VOICE_SEARCH_RESULTS"/>
+ <field name="EXTRA_VOICE_SEARCH_RESULT_HTML"/>
+ <field name="EXTRA_VOICE_SEARCH_RESULT_HTML_BASE_URLS"/>
+ <field name="EXTRA_VOICE_SEARCH_RESULT_HTTP_HEADERS"/>
+ <field name="EXTRA_VOICE_SEARCH_RESULT_STRINGS"/>
+ <field name="EXTRA_VOICE_SEARCH_RESULT_URLS"/>
+ <field name="URI_SCHEME_INLINE"/>
+ </class>
+ <class name="android/speech/SpeechRecognizer" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="cancel()V"/>
+ <method name="createSpeechRecognizer(Landroid/content/Context;)Landroid/speech/SpeechRecognizer;"/>
+ <method name="createSpeechRecognizer(Landroid/content/Context;Landroid/content/ComponentName;)Landroid/speech/SpeechRecognizer;"/>
+ <method name="destroy()V"/>
+ <method name="isRecognitionAvailable(Landroid/content/Context;)Z"/>
+ <method name="setRecognitionListener(Landroid/speech/RecognitionListener;)V"/>
+ <method name="startListening(Landroid/content/Intent;)V"/>
+ <method name="stopListening()V"/>
+ <field name="CONFIDENCE_SCORES" since="14"/>
+ <field name="ERROR_AUDIO"/>
+ <field name="ERROR_CLIENT"/>
+ <field name="ERROR_INSUFFICIENT_PERMISSIONS"/>
+ <field name="ERROR_NETWORK"/>
+ <field name="ERROR_NETWORK_TIMEOUT"/>
+ <field name="ERROR_NO_MATCH"/>
+ <field name="ERROR_RECOGNIZER_BUSY"/>
+ <field name="ERROR_SERVER"/>
+ <field name="ERROR_SPEECH_TIMEOUT"/>
+ <field name="RESULTS_RECOGNITION"/>
+ </class>
+ <class name="android/speech/tts/SynthesisCallback" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="audioAvailable([BII)I"/>
+ <method name="done()I"/>
+ <method name="error()V"/>
+ <method name="error(I)V" since="21"/>
+ <method name="getMaxBufferSize()I"/>
+ <method name="hasFinished()Z" since="21"/>
+ <method name="hasStarted()Z" since="21"/>
+ <method name="rangeStart(III)V" since="26"/>
+ <method name="start(III)I"/>
+ </class>
+ <class name="android/speech/tts/SynthesisRequest" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;Landroid/os/Bundle;)V" since="21"/>
+ <method name="&lt;init>(Ljava/lang/String;Landroid/os/Bundle;)V"/>
+ <method name="getCallerUid()I" since="19"/>
+ <method name="getCharSequenceText()Ljava/lang/CharSequence;" since="21"/>
+ <method name="getCountry()Ljava/lang/String;"/>
+ <method name="getLanguage()Ljava/lang/String;"/>
+ <method name="getParams()Landroid/os/Bundle;"/>
+ <method name="getPitch()I"/>
+ <method name="getSpeechRate()I"/>
+ <method name="getText()Ljava/lang/String;" deprecated="21"/>
+ <method name="getVariant()Ljava/lang/String;"/>
+ <method name="getVoiceName()Ljava/lang/String;" since="21"/>
+ </class>
+ <class name="android/speech/tts/TextToSpeech" since="4">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/speech/tts/TextToSpeech$OnInitListener;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/speech/tts/TextToSpeech$OnInitListener;Ljava/lang/String;)V" since="14"/>
+ <method name="addEarcon(Ljava/lang/String;Ljava/io/File;)I" since="21"/>
+ <method name="addEarcon(Ljava/lang/String;Ljava/lang/String;)I" deprecated="21"/>
+ <method name="addEarcon(Ljava/lang/String;Ljava/lang/String;I)I"/>
+ <method name="addSpeech(Ljava/lang/CharSequence;Ljava/io/File;)I" since="21"/>
+ <method name="addSpeech(Ljava/lang/CharSequence;Ljava/lang/String;I)I" since="21"/>
+ <method name="addSpeech(Ljava/lang/String;Ljava/lang/String;)I"/>
+ <method name="addSpeech(Ljava/lang/String;Ljava/lang/String;I)I"/>
+ <method name="areDefaultsEnforced()Z" since="8" deprecated="21"/>
+ <method name="getAvailableLanguages()Ljava/util/Set;" since="21"/>
+ <method name="getDefaultEngine()Ljava/lang/String;" since="8"/>
+ <method name="getDefaultLanguage()Ljava/util/Locale;" since="18" deprecated="21"/>
+ <method name="getDefaultVoice()Landroid/speech/tts/Voice;" since="21"/>
+ <method name="getEngines()Ljava/util/List;" since="14"/>
+ <method name="getFeatures(Ljava/util/Locale;)Ljava/util/Set;" since="15" deprecated="21"/>
+ <method name="getLanguage()Ljava/util/Locale;" deprecated="21"/>
+ <method name="getMaxSpeechInputLength()I" since="18"/>
+ <method name="getVoice()Landroid/speech/tts/Voice;" since="21"/>
+ <method name="getVoices()Ljava/util/Set;" since="21"/>
+ <method name="isLanguageAvailable(Ljava/util/Locale;)I"/>
+ <method name="isSpeaking()Z"/>
+ <method name="playEarcon(Ljava/lang/String;ILandroid/os/Bundle;Ljava/lang/String;)I" since="21"/>
+ <method name="playEarcon(Ljava/lang/String;ILjava/util/HashMap;)I" deprecated="21"/>
+ <method name="playSilence(JILjava/util/HashMap;)I" deprecated="21"/>
+ <method name="playSilentUtterance(JILjava/lang/String;)I" since="21"/>
+ <method name="setAudioAttributes(Landroid/media/AudioAttributes;)I" since="21"/>
+ <method name="setEngineByPackageName(Ljava/lang/String;)I" since="8" deprecated="16"/>
+ <method name="setLanguage(Ljava/util/Locale;)I"/>
+ <method name="setOnUtteranceCompletedListener(Landroid/speech/tts/TextToSpeech$OnUtteranceCompletedListener;)I" deprecated="16"/>
+ <method name="setOnUtteranceProgressListener(Landroid/speech/tts/UtteranceProgressListener;)I" since="15"/>
+ <method name="setPitch(F)I"/>
+ <method name="setSpeechRate(F)I"/>
+ <method name="setVoice(Landroid/speech/tts/Voice;)I" since="21"/>
+ <method name="shutdown()V"/>
+ <method name="speak(Ljava/lang/CharSequence;ILandroid/os/Bundle;Ljava/lang/String;)I" since="21"/>
+ <method name="speak(Ljava/lang/String;ILjava/util/HashMap;)I" deprecated="21"/>
+ <method name="stop()I"/>
+ <method name="synthesizeToFile(Ljava/lang/CharSequence;Landroid/os/Bundle;Ljava/io/File;Ljava/lang/String;)I" since="21"/>
+ <method name="synthesizeToFile(Ljava/lang/String;Ljava/util/HashMap;Ljava/lang/String;)I" deprecated="21"/>
+ <field name="ACTION_TTS_QUEUE_PROCESSING_COMPLETED"/>
+ <field name="ERROR"/>
+ <field name="ERROR_INVALID_REQUEST" since="21"/>
+ <field name="ERROR_NETWORK" since="21"/>
+ <field name="ERROR_NETWORK_TIMEOUT" since="21"/>
+ <field name="ERROR_NOT_INSTALLED_YET" since="21"/>
+ <field name="ERROR_OUTPUT" since="21"/>
+ <field name="ERROR_SERVICE" since="21"/>
+ <field name="ERROR_SYNTHESIS" since="21"/>
+ <field name="LANG_AVAILABLE"/>
+ <field name="LANG_COUNTRY_AVAILABLE"/>
+ <field name="LANG_COUNTRY_VAR_AVAILABLE"/>
+ <field name="LANG_MISSING_DATA"/>
+ <field name="LANG_NOT_SUPPORTED"/>
+ <field name="QUEUE_ADD"/>
+ <field name="QUEUE_FLUSH"/>
+ <field name="STOPPED" since="21"/>
+ <field name="SUCCESS"/>
+ </class>
+ <class name="android/speech/tts/TextToSpeech$Engine" since="4">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/speech/tts/TextToSpeech;)V"/>
+ <field name="ACTION_CHECK_TTS_DATA"/>
+ <field name="ACTION_GET_SAMPLE_TEXT" since="18"/>
+ <field name="ACTION_INSTALL_TTS_DATA"/>
+ <field name="ACTION_TTS_DATA_INSTALLED"/>
+ <field name="CHECK_VOICE_DATA_BAD_DATA" deprecated="18"/>
+ <field name="CHECK_VOICE_DATA_FAIL"/>
+ <field name="CHECK_VOICE_DATA_MISSING_DATA" deprecated="18"/>
+ <field name="CHECK_VOICE_DATA_MISSING_VOLUME" deprecated="18"/>
+ <field name="CHECK_VOICE_DATA_PASS"/>
+ <field name="DEFAULT_STREAM"/>
+ <field name="EXTRA_AVAILABLE_VOICES" since="8"/>
+ <field name="EXTRA_CHECK_VOICE_DATA_FOR" since="8" deprecated="18"/>
+ <field name="EXTRA_SAMPLE_TEXT" since="18"/>
+ <field name="EXTRA_TTS_DATA_INSTALLED" deprecated="18"/>
+ <field name="EXTRA_UNAVAILABLE_VOICES" since="8"/>
+ <field name="EXTRA_VOICE_DATA_FILES" deprecated="18"/>
+ <field name="EXTRA_VOICE_DATA_FILES_INFO" deprecated="18"/>
+ <field name="EXTRA_VOICE_DATA_ROOT_DIRECTORY" deprecated="18"/>
+ <field name="INTENT_ACTION_TTS_SERVICE" since="14"/>
+ <field name="KEY_FEATURE_EMBEDDED_SYNTHESIS" since="15" deprecated="21"/>
+ <field name="KEY_FEATURE_NETWORK_RETRIES_COUNT" since="21"/>
+ <field name="KEY_FEATURE_NETWORK_SYNTHESIS" since="15" deprecated="21"/>
+ <field name="KEY_FEATURE_NETWORK_TIMEOUT_MS" since="21"/>
+ <field name="KEY_FEATURE_NOT_INSTALLED" since="21"/>
+ <field name="KEY_PARAM_PAN" since="11"/>
+ <field name="KEY_PARAM_SESSION_ID" since="21"/>
+ <field name="KEY_PARAM_STREAM"/>
+ <field name="KEY_PARAM_UTTERANCE_ID"/>
+ <field name="KEY_PARAM_VOLUME" since="11"/>
+ <field name="SERVICE_META_DATA" since="14"/>
+ </class>
+ <class name="android/speech/tts/TextToSpeech$EngineInfo" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="icon"/>
+ <field name="label"/>
+ <field name="name"/>
+ </class>
+ <class name="android/speech/tts/TextToSpeech$OnInitListener" since="4">
+ <extends name="java/lang/Object"/>
+ <method name="onInit(I)V"/>
+ </class>
+ <class name="android/speech/tts/TextToSpeech$OnUtteranceCompletedListener" since="4" deprecated="18">
+ <extends name="java/lang/Object"/>
+ <method name="onUtteranceCompleted(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/speech/tts/TextToSpeechService" since="14">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="onGetDefaultVoiceNameFor(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" since="21"/>
+ <method name="onGetFeaturesForLanguage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/util/Set;" since="15"/>
+ <method name="onGetLanguage()[Ljava/lang/String;"/>
+ <method name="onGetVoices()Ljava/util/List;" since="21"/>
+ <method name="onIsLanguageAvailable(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I"/>
+ <method name="onIsValidVoiceName(Ljava/lang/String;)I" since="21"/>
+ <method name="onLoadLanguage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I"/>
+ <method name="onLoadVoice(Ljava/lang/String;)I" since="21"/>
+ <method name="onStop()V"/>
+ <method name="onSynthesizeText(Landroid/speech/tts/SynthesisRequest;Landroid/speech/tts/SynthesisCallback;)V"/>
+ </class>
+ <class name="android/speech/tts/UtteranceProgressListener" since="15">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onAudioAvailable(Ljava/lang/String;[B)V" since="24"/>
+ <method name="onBeginSynthesis(Ljava/lang/String;III)V" since="24"/>
+ <method name="onDone(Ljava/lang/String;)V"/>
+ <method name="onError(Ljava/lang/String;)V" deprecated="21"/>
+ <method name="onError(Ljava/lang/String;I)V" since="21"/>
+ <method name="onRangeStart(Ljava/lang/String;III)V" since="26"/>
+ <method name="onStart(Ljava/lang/String;)V"/>
+ <method name="onStop(Ljava/lang/String;Z)V" since="23"/>
+ </class>
+ <class name="android/speech/tts/Voice" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/util/Locale;IIZLjava/util/Set;)V"/>
+ <method name="getFeatures()Ljava/util/Set;"/>
+ <method name="getLatency()I"/>
+ <method name="getLocale()Ljava/util/Locale;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getQuality()I"/>
+ <method name="isNetworkConnectionRequired()Z"/>
+ <field name="CREATOR"/>
+ <field name="LATENCY_HIGH"/>
+ <field name="LATENCY_LOW"/>
+ <field name="LATENCY_NORMAL"/>
+ <field name="LATENCY_VERY_HIGH"/>
+ <field name="LATENCY_VERY_LOW"/>
+ <field name="QUALITY_HIGH"/>
+ <field name="QUALITY_LOW"/>
+ <field name="QUALITY_NORMAL"/>
+ <field name="QUALITY_VERY_HIGH"/>
+ <field name="QUALITY_VERY_LOW"/>
+ </class>
+ <class name="android/system/ErrnoException" since="21">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;ILjava/lang/Throwable;)V"/>
+ <field name="errno"/>
+ </class>
+ <class name="android/system/Int32Ref" since="27">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(I)V"/>
+ <field name="value"/>
+ </class>
+ <class name="android/system/Int64Ref" since="27">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(J)V"/>
+ <field name="value"/>
+ </class>
+ <class name="android/system/Os" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="accept(Ljava/io/FileDescriptor;Ljava/net/InetSocketAddress;)Ljava/io/FileDescriptor;"/>
+ <method name="access(Ljava/lang/String;I)Z"/>
+ <method name="bind(Ljava/io/FileDescriptor;Ljava/net/InetAddress;I)V"/>
+ <method name="chmod(Ljava/lang/String;I)V"/>
+ <method name="chown(Ljava/lang/String;II)V"/>
+ <method name="close(Ljava/io/FileDescriptor;)V"/>
+ <method name="connect(Ljava/io/FileDescriptor;Ljava/net/InetAddress;I)V"/>
+ <method name="dup(Ljava/io/FileDescriptor;)Ljava/io/FileDescriptor;"/>
+ <method name="dup2(Ljava/io/FileDescriptor;I)Ljava/io/FileDescriptor;"/>
+ <method name="environ()[Ljava/lang/String;"/>
+ <method name="execv(Ljava/lang/String;[Ljava/lang/String;)V"/>
+ <method name="execve(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;)V"/>
+ <method name="fchmod(Ljava/io/FileDescriptor;I)V"/>
+ <method name="fchown(Ljava/io/FileDescriptor;II)V"/>
+ <method name="fdatasync(Ljava/io/FileDescriptor;)V"/>
+ <method name="fstat(Ljava/io/FileDescriptor;)Landroid/system/StructStat;"/>
+ <method name="fstatvfs(Ljava/io/FileDescriptor;)Landroid/system/StructStatVfs;"/>
+ <method name="fsync(Ljava/io/FileDescriptor;)V"/>
+ <method name="ftruncate(Ljava/io/FileDescriptor;J)V"/>
+ <method name="gai_strerror(I)Ljava/lang/String;"/>
+ <method name="getegid()I"/>
+ <method name="getenv(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="geteuid()I"/>
+ <method name="getgid()I"/>
+ <method name="getpeername(Ljava/io/FileDescriptor;)Ljava/net/SocketAddress;"/>
+ <method name="getpid()I"/>
+ <method name="getppid()I"/>
+ <method name="getsockname(Ljava/io/FileDescriptor;)Ljava/net/SocketAddress;"/>
+ <method name="gettid()I"/>
+ <method name="getuid()I"/>
+ <method name="getxattr(Ljava/lang/String;Ljava/lang/String;)[B" since="26"/>
+ <method name="if_indextoname(I)Ljava/lang/String;"/>
+ <method name="if_nametoindex(Ljava/lang/String;)I" since="26"/>
+ <method name="inet_pton(ILjava/lang/String;)Ljava/net/InetAddress;"/>
+ <method name="isatty(Ljava/io/FileDescriptor;)Z"/>
+ <method name="kill(II)V"/>
+ <method name="lchown(Ljava/lang/String;II)V"/>
+ <method name="link(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="listen(Ljava/io/FileDescriptor;I)V"/>
+ <method name="listxattr(Ljava/lang/String;)[Ljava/lang/String;" since="26"/>
+ <method name="lseek(Ljava/io/FileDescriptor;JI)J"/>
+ <method name="lstat(Ljava/lang/String;)Landroid/system/StructStat;"/>
+ <method name="mincore(JJ[B)V"/>
+ <method name="mkdir(Ljava/lang/String;I)V"/>
+ <method name="mkfifo(Ljava/lang/String;I)V"/>
+ <method name="mlock(JJ)V"/>
+ <method name="mmap(JJIILjava/io/FileDescriptor;J)J"/>
+ <method name="msync(JJI)V"/>
+ <method name="munlock(JJ)V"/>
+ <method name="munmap(JJ)V"/>
+ <method name="open(Ljava/lang/String;II)Ljava/io/FileDescriptor;"/>
+ <method name="pipe()[Ljava/io/FileDescriptor;"/>
+ <method name="poll([Landroid/system/StructPollfd;I)I"/>
+ <method name="posix_fallocate(Ljava/io/FileDescriptor;JJ)V"/>
+ <method name="prctl(IJJJJ)I"/>
+ <method name="pread(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;J)I"/>
+ <method name="pread(Ljava/io/FileDescriptor;[BIIJ)I"/>
+ <method name="pwrite(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;J)I"/>
+ <method name="pwrite(Ljava/io/FileDescriptor;[BIIJ)I"/>
+ <method name="read(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;)I"/>
+ <method name="read(Ljava/io/FileDescriptor;[BII)I"/>
+ <method name="readlink(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="readv(Ljava/io/FileDescriptor;[Ljava/lang/Object;[I[I)I"/>
+ <method name="recvfrom(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;ILjava/net/InetSocketAddress;)I"/>
+ <method name="recvfrom(Ljava/io/FileDescriptor;[BIIILjava/net/InetSocketAddress;)I"/>
+ <method name="remove(Ljava/lang/String;)V"/>
+ <method name="removexattr(Ljava/lang/String;Ljava/lang/String;)V" since="26"/>
+ <method name="rename(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="sendfile(Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;Landroid/system/Int64Ref;J)J" since="27"/>
+ <method name="sendfile(Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;Landroid/util/MutableLong;J)J" deprecated="27"/>
+ <method name="sendto(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;ILjava/net/InetAddress;I)I"/>
+ <method name="sendto(Ljava/io/FileDescriptor;[BIIILjava/net/InetAddress;I)I"/>
+ <method name="setegid(I)V"/>
+ <method name="setenv(Ljava/lang/String;Ljava/lang/String;Z)V"/>
+ <method name="seteuid(I)V"/>
+ <method name="setgid(I)V"/>
+ <method name="setsid()I"/>
+ <method name="setsockoptInt(Ljava/io/FileDescriptor;III)V" since="26"/>
+ <method name="setuid(I)V"/>
+ <method name="setxattr(Ljava/lang/String;Ljava/lang/String;[BI)V" since="26"/>
+ <method name="shutdown(Ljava/io/FileDescriptor;I)V"/>
+ <method name="socket(III)Ljava/io/FileDescriptor;"/>
+ <method name="socketpair(IIILjava/io/FileDescriptor;Ljava/io/FileDescriptor;)V"/>
+ <method name="stat(Ljava/lang/String;)Landroid/system/StructStat;"/>
+ <method name="statvfs(Ljava/lang/String;)Landroid/system/StructStatVfs;"/>
+ <method name="strerror(I)Ljava/lang/String;"/>
+ <method name="strsignal(I)Ljava/lang/String;"/>
+ <method name="symlink(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="sysconf(I)J"/>
+ <method name="tcdrain(Ljava/io/FileDescriptor;)V"/>
+ <method name="tcsendbreak(Ljava/io/FileDescriptor;I)V"/>
+ <method name="umask(I)I"/>
+ <method name="uname()Landroid/system/StructUtsname;"/>
+ <method name="unsetenv(Ljava/lang/String;)V"/>
+ <method name="waitpid(ILandroid/system/Int32Ref;I)I" since="27"/>
+ <method name="waitpid(ILandroid/util/MutableInt;I)I" deprecated="27"/>
+ <method name="write(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;)I"/>
+ <method name="write(Ljava/io/FileDescriptor;[BII)I"/>
+ <method name="writev(Ljava/io/FileDescriptor;[Ljava/lang/Object;[I[I)I"/>
+ </class>
+ <class name="android/system/OsConstants" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="S_ISBLK(I)Z"/>
+ <method name="S_ISCHR(I)Z"/>
+ <method name="S_ISDIR(I)Z"/>
+ <method name="S_ISFIFO(I)Z"/>
+ <method name="S_ISLNK(I)Z"/>
+ <method name="S_ISREG(I)Z"/>
+ <method name="S_ISSOCK(I)Z"/>
+ <method name="WCOREDUMP(I)Z"/>
+ <method name="WEXITSTATUS(I)I"/>
+ <method name="WIFEXITED(I)Z"/>
+ <method name="WIFSIGNALED(I)Z"/>
+ <method name="WIFSTOPPED(I)Z"/>
+ <method name="WSTOPSIG(I)I"/>
+ <method name="WTERMSIG(I)I"/>
+ <method name="errnoName(I)Ljava/lang/String;"/>
+ <method name="gaiName(I)Ljava/lang/String;"/>
+ <field name="AF_INET"/>
+ <field name="AF_INET6"/>
+ <field name="AF_UNIX"/>
+ <field name="AF_UNSPEC"/>
+ <field name="AI_ADDRCONFIG"/>
+ <field name="AI_ALL"/>
+ <field name="AI_CANONNAME"/>
+ <field name="AI_NUMERICHOST"/>
+ <field name="AI_NUMERICSERV"/>
+ <field name="AI_PASSIVE"/>
+ <field name="AI_V4MAPPED"/>
+ <field name="CAP_AUDIT_CONTROL"/>
+ <field name="CAP_AUDIT_WRITE"/>
+ <field name="CAP_BLOCK_SUSPEND"/>
+ <field name="CAP_CHOWN"/>
+ <field name="CAP_DAC_OVERRIDE"/>
+ <field name="CAP_DAC_READ_SEARCH"/>
+ <field name="CAP_FOWNER"/>
+ <field name="CAP_FSETID"/>
+ <field name="CAP_IPC_LOCK"/>
+ <field name="CAP_IPC_OWNER"/>
+ <field name="CAP_KILL"/>
+ <field name="CAP_LAST_CAP"/>
+ <field name="CAP_LEASE"/>
+ <field name="CAP_LINUX_IMMUTABLE"/>
+ <field name="CAP_MAC_ADMIN"/>
+ <field name="CAP_MAC_OVERRIDE"/>
+ <field name="CAP_MKNOD"/>
+ <field name="CAP_NET_ADMIN"/>
+ <field name="CAP_NET_BIND_SERVICE"/>
+ <field name="CAP_NET_BROADCAST"/>
+ <field name="CAP_NET_RAW"/>
+ <field name="CAP_SETFCAP"/>
+ <field name="CAP_SETGID"/>
+ <field name="CAP_SETPCAP"/>
+ <field name="CAP_SETUID"/>
+ <field name="CAP_SYSLOG"/>
+ <field name="CAP_SYS_ADMIN"/>
+ <field name="CAP_SYS_BOOT"/>
+ <field name="CAP_SYS_CHROOT"/>
+ <field name="CAP_SYS_MODULE"/>
+ <field name="CAP_SYS_NICE"/>
+ <field name="CAP_SYS_PACCT"/>
+ <field name="CAP_SYS_PTRACE"/>
+ <field name="CAP_SYS_RAWIO"/>
+ <field name="CAP_SYS_RESOURCE"/>
+ <field name="CAP_SYS_TIME"/>
+ <field name="CAP_SYS_TTY_CONFIG"/>
+ <field name="CAP_WAKE_ALARM"/>
+ <field name="E2BIG"/>
+ <field name="EACCES"/>
+ <field name="EADDRINUSE"/>
+ <field name="EADDRNOTAVAIL"/>
+ <field name="EAFNOSUPPORT"/>
+ <field name="EAGAIN"/>
+ <field name="EAI_AGAIN"/>
+ <field name="EAI_BADFLAGS"/>
+ <field name="EAI_FAIL"/>
+ <field name="EAI_FAMILY"/>
+ <field name="EAI_MEMORY"/>
+ <field name="EAI_NODATA"/>
+ <field name="EAI_NONAME"/>
+ <field name="EAI_OVERFLOW"/>
+ <field name="EAI_SERVICE"/>
+ <field name="EAI_SOCKTYPE"/>
+ <field name="EAI_SYSTEM"/>
+ <field name="EALREADY"/>
+ <field name="EBADF"/>
+ <field name="EBADMSG"/>
+ <field name="EBUSY"/>
+ <field name="ECANCELED"/>
+ <field name="ECHILD"/>
+ <field name="ECONNABORTED"/>
+ <field name="ECONNREFUSED"/>
+ <field name="ECONNRESET"/>
+ <field name="EDEADLK"/>
+ <field name="EDESTADDRREQ"/>
+ <field name="EDOM"/>
+ <field name="EDQUOT"/>
+ <field name="EEXIST"/>
+ <field name="EFAULT"/>
+ <field name="EFBIG"/>
+ <field name="EHOSTUNREACH"/>
+ <field name="EIDRM"/>
+ <field name="EILSEQ"/>
+ <field name="EINPROGRESS"/>
+ <field name="EINTR"/>
+ <field name="EINVAL"/>
+ <field name="EIO"/>
+ <field name="EISCONN"/>
+ <field name="EISDIR"/>
+ <field name="ELOOP"/>
+ <field name="EMFILE"/>
+ <field name="EMLINK"/>
+ <field name="EMSGSIZE"/>
+ <field name="EMULTIHOP"/>
+ <field name="ENAMETOOLONG"/>
+ <field name="ENETDOWN"/>
+ <field name="ENETRESET"/>
+ <field name="ENETUNREACH"/>
+ <field name="ENFILE"/>
+ <field name="ENOBUFS"/>
+ <field name="ENODATA"/>
+ <field name="ENODEV"/>
+ <field name="ENOENT"/>
+ <field name="ENOEXEC"/>
+ <field name="ENOLCK"/>
+ <field name="ENOLINK"/>
+ <field name="ENOMEM"/>
+ <field name="ENOMSG"/>
+ <field name="ENOPROTOOPT"/>
+ <field name="ENOSPC"/>
+ <field name="ENOSR"/>
+ <field name="ENOSTR"/>
+ <field name="ENOSYS"/>
+ <field name="ENOTCONN"/>
+ <field name="ENOTDIR"/>
+ <field name="ENOTEMPTY"/>
+ <field name="ENOTSOCK"/>
+ <field name="ENOTSUP"/>
+ <field name="ENOTTY"/>
+ <field name="ENXIO"/>
+ <field name="EOPNOTSUPP"/>
+ <field name="EOVERFLOW"/>
+ <field name="EPERM"/>
+ <field name="EPIPE"/>
+ <field name="EPROTO"/>
+ <field name="EPROTONOSUPPORT"/>
+ <field name="EPROTOTYPE"/>
+ <field name="ERANGE"/>
+ <field name="EROFS"/>
+ <field name="ESPIPE"/>
+ <field name="ESRCH"/>
+ <field name="ESTALE"/>
+ <field name="ETIME"/>
+ <field name="ETIMEDOUT"/>
+ <field name="ETXTBSY"/>
+ <field name="EXDEV"/>
+ <field name="EXIT_FAILURE"/>
+ <field name="EXIT_SUCCESS"/>
+ <field name="FD_CLOEXEC"/>
+ <field name="FIONREAD"/>
+ <field name="F_DUPFD"/>
+ <field name="F_DUPFD_CLOEXEC" since="27"/>
+ <field name="F_GETFD"/>
+ <field name="F_GETFL"/>
+ <field name="F_GETLK"/>
+ <field name="F_GETLK64"/>
+ <field name="F_GETOWN"/>
+ <field name="F_OK"/>
+ <field name="F_RDLCK"/>
+ <field name="F_SETFD"/>
+ <field name="F_SETFL"/>
+ <field name="F_SETLK"/>
+ <field name="F_SETLK64"/>
+ <field name="F_SETLKW"/>
+ <field name="F_SETLKW64"/>
+ <field name="F_SETOWN"/>
+ <field name="F_UNLCK"/>
+ <field name="F_WRLCK"/>
+ <field name="IFA_F_DADFAILED"/>
+ <field name="IFA_F_DEPRECATED"/>
+ <field name="IFA_F_HOMEADDRESS"/>
+ <field name="IFA_F_NODAD"/>
+ <field name="IFA_F_OPTIMISTIC"/>
+ <field name="IFA_F_PERMANENT"/>
+ <field name="IFA_F_SECONDARY"/>
+ <field name="IFA_F_TEMPORARY"/>
+ <field name="IFA_F_TENTATIVE"/>
+ <field name="IFF_ALLMULTI"/>
+ <field name="IFF_AUTOMEDIA"/>
+ <field name="IFF_BROADCAST"/>
+ <field name="IFF_DEBUG"/>
+ <field name="IFF_DYNAMIC"/>
+ <field name="IFF_LOOPBACK"/>
+ <field name="IFF_MASTER"/>
+ <field name="IFF_MULTICAST"/>
+ <field name="IFF_NOARP"/>
+ <field name="IFF_NOTRAILERS"/>
+ <field name="IFF_POINTOPOINT"/>
+ <field name="IFF_PORTSEL"/>
+ <field name="IFF_PROMISC"/>
+ <field name="IFF_RUNNING"/>
+ <field name="IFF_SLAVE"/>
+ <field name="IFF_UP"/>
+ <field name="IPPROTO_ICMP"/>
+ <field name="IPPROTO_ICMPV6"/>
+ <field name="IPPROTO_IP"/>
+ <field name="IPPROTO_IPV6"/>
+ <field name="IPPROTO_RAW"/>
+ <field name="IPPROTO_TCP"/>
+ <field name="IPPROTO_UDP"/>
+ <field name="IPV6_CHECKSUM"/>
+ <field name="IPV6_MULTICAST_HOPS"/>
+ <field name="IPV6_MULTICAST_IF"/>
+ <field name="IPV6_MULTICAST_LOOP"/>
+ <field name="IPV6_RECVDSTOPTS"/>
+ <field name="IPV6_RECVHOPLIMIT"/>
+ <field name="IPV6_RECVHOPOPTS"/>
+ <field name="IPV6_RECVPKTINFO"/>
+ <field name="IPV6_RECVRTHDR"/>
+ <field name="IPV6_RECVTCLASS"/>
+ <field name="IPV6_TCLASS"/>
+ <field name="IPV6_UNICAST_HOPS"/>
+ <field name="IPV6_V6ONLY"/>
+ <field name="IP_MULTICAST_IF"/>
+ <field name="IP_MULTICAST_LOOP"/>
+ <field name="IP_MULTICAST_TTL"/>
+ <field name="IP_TOS"/>
+ <field name="IP_TTL"/>
+ <field name="MAP_FIXED"/>
+ <field name="MAP_PRIVATE"/>
+ <field name="MAP_SHARED"/>
+ <field name="MCAST_BLOCK_SOURCE"/>
+ <field name="MCAST_JOIN_GROUP"/>
+ <field name="MCAST_JOIN_SOURCE_GROUP"/>
+ <field name="MCAST_LEAVE_GROUP"/>
+ <field name="MCAST_LEAVE_SOURCE_GROUP"/>
+ <field name="MCAST_UNBLOCK_SOURCE"/>
+ <field name="MCL_CURRENT"/>
+ <field name="MCL_FUTURE"/>
+ <field name="MSG_CTRUNC"/>
+ <field name="MSG_DONTROUTE"/>
+ <field name="MSG_EOR"/>
+ <field name="MSG_OOB"/>
+ <field name="MSG_PEEK"/>
+ <field name="MSG_TRUNC"/>
+ <field name="MSG_WAITALL"/>
+ <field name="MS_ASYNC"/>
+ <field name="MS_INVALIDATE"/>
+ <field name="MS_SYNC"/>
+ <field name="NI_DGRAM"/>
+ <field name="NI_NAMEREQD"/>
+ <field name="NI_NOFQDN"/>
+ <field name="NI_NUMERICHOST"/>
+ <field name="NI_NUMERICSERV"/>
+ <field name="O_ACCMODE"/>
+ <field name="O_APPEND"/>
+ <field name="O_CLOEXEC" since="27"/>
+ <field name="O_CREAT"/>
+ <field name="O_DSYNC" since="27"/>
+ <field name="O_EXCL"/>
+ <field name="O_NOCTTY"/>
+ <field name="O_NOFOLLOW"/>
+ <field name="O_NONBLOCK"/>
+ <field name="O_RDONLY"/>
+ <field name="O_RDWR"/>
+ <field name="O_SYNC"/>
+ <field name="O_TRUNC"/>
+ <field name="O_WRONLY"/>
+ <field name="POLLERR"/>
+ <field name="POLLHUP"/>
+ <field name="POLLIN"/>
+ <field name="POLLNVAL"/>
+ <field name="POLLOUT"/>
+ <field name="POLLPRI"/>
+ <field name="POLLRDBAND"/>
+ <field name="POLLRDNORM"/>
+ <field name="POLLWRBAND"/>
+ <field name="POLLWRNORM"/>
+ <field name="PROT_EXEC"/>
+ <field name="PROT_NONE"/>
+ <field name="PROT_READ"/>
+ <field name="PROT_WRITE"/>
+ <field name="PR_GET_DUMPABLE"/>
+ <field name="PR_SET_DUMPABLE"/>
+ <field name="PR_SET_NO_NEW_PRIVS"/>
+ <field name="RT_SCOPE_HOST"/>
+ <field name="RT_SCOPE_LINK"/>
+ <field name="RT_SCOPE_NOWHERE"/>
+ <field name="RT_SCOPE_SITE"/>
+ <field name="RT_SCOPE_UNIVERSE"/>
+ <field name="R_OK"/>
+ <field name="SEEK_CUR"/>
+ <field name="SEEK_END"/>
+ <field name="SEEK_SET"/>
+ <field name="SHUT_RD"/>
+ <field name="SHUT_RDWR"/>
+ <field name="SHUT_WR"/>
+ <field name="SIGABRT"/>
+ <field name="SIGALRM"/>
+ <field name="SIGBUS"/>
+ <field name="SIGCHLD"/>
+ <field name="SIGCONT"/>
+ <field name="SIGFPE"/>
+ <field name="SIGHUP"/>
+ <field name="SIGILL"/>
+ <field name="SIGINT"/>
+ <field name="SIGIO"/>
+ <field name="SIGKILL"/>
+ <field name="SIGPIPE"/>
+ <field name="SIGPROF"/>
+ <field name="SIGPWR"/>
+ <field name="SIGQUIT"/>
+ <field name="SIGRTMAX"/>
+ <field name="SIGRTMIN"/>
+ <field name="SIGSEGV"/>
+ <field name="SIGSTKFLT"/>
+ <field name="SIGSTOP"/>
+ <field name="SIGSYS"/>
+ <field name="SIGTERM"/>
+ <field name="SIGTRAP"/>
+ <field name="SIGTSTP"/>
+ <field name="SIGTTIN"/>
+ <field name="SIGTTOU"/>
+ <field name="SIGURG"/>
+ <field name="SIGUSR1"/>
+ <field name="SIGUSR2"/>
+ <field name="SIGVTALRM"/>
+ <field name="SIGWINCH"/>
+ <field name="SIGXCPU"/>
+ <field name="SIGXFSZ"/>
+ <field name="SIOCGIFADDR"/>
+ <field name="SIOCGIFBRDADDR"/>
+ <field name="SIOCGIFDSTADDR"/>
+ <field name="SIOCGIFNETMASK"/>
+ <field name="SOCK_DGRAM"/>
+ <field name="SOCK_RAW"/>
+ <field name="SOCK_SEQPACKET"/>
+ <field name="SOCK_STREAM"/>
+ <field name="SOL_SOCKET"/>
+ <field name="SO_BINDTODEVICE"/>
+ <field name="SO_BROADCAST"/>
+ <field name="SO_DEBUG"/>
+ <field name="SO_DONTROUTE"/>
+ <field name="SO_ERROR"/>
+ <field name="SO_KEEPALIVE"/>
+ <field name="SO_LINGER"/>
+ <field name="SO_OOBINLINE"/>
+ <field name="SO_PASSCRED"/>
+ <field name="SO_PEERCRED"/>
+ <field name="SO_RCVBUF"/>
+ <field name="SO_RCVLOWAT"/>
+ <field name="SO_RCVTIMEO"/>
+ <field name="SO_REUSEADDR"/>
+ <field name="SO_SNDBUF"/>
+ <field name="SO_SNDLOWAT"/>
+ <field name="SO_SNDTIMEO"/>
+ <field name="SO_TYPE"/>
+ <field name="STDERR_FILENO"/>
+ <field name="STDIN_FILENO"/>
+ <field name="STDOUT_FILENO"/>
+ <field name="ST_MANDLOCK" since="23"/>
+ <field name="ST_NOATIME" since="23"/>
+ <field name="ST_NODEV" since="23"/>
+ <field name="ST_NODIRATIME" since="23"/>
+ <field name="ST_NOEXEC" since="23"/>
+ <field name="ST_NOSUID" since="23"/>
+ <field name="ST_RDONLY" since="23"/>
+ <field name="ST_RELATIME" since="23"/>
+ <field name="ST_SYNCHRONOUS" since="23"/>
+ <field name="S_IFBLK"/>
+ <field name="S_IFCHR"/>
+ <field name="S_IFDIR"/>
+ <field name="S_IFIFO"/>
+ <field name="S_IFLNK"/>
+ <field name="S_IFMT"/>
+ <field name="S_IFREG"/>
+ <field name="S_IFSOCK"/>
+ <field name="S_IRGRP"/>
+ <field name="S_IROTH"/>
+ <field name="S_IRUSR"/>
+ <field name="S_IRWXG"/>
+ <field name="S_IRWXO"/>
+ <field name="S_IRWXU"/>
+ <field name="S_ISGID"/>
+ <field name="S_ISUID"/>
+ <field name="S_ISVTX"/>
+ <field name="S_IWGRP"/>
+ <field name="S_IWOTH"/>
+ <field name="S_IWUSR"/>
+ <field name="S_IXGRP"/>
+ <field name="S_IXOTH"/>
+ <field name="S_IXUSR"/>
+ <field name="TCP_NODELAY"/>
+ <field name="TCP_USER_TIMEOUT" since="26"/>
+ <field name="WCONTINUED"/>
+ <field name="WEXITED"/>
+ <field name="WNOHANG"/>
+ <field name="WNOWAIT"/>
+ <field name="WSTOPPED"/>
+ <field name="WUNTRACED"/>
+ <field name="W_OK"/>
+ <field name="X_OK"/>
+ <field name="_SC_2_CHAR_TERM"/>
+ <field name="_SC_2_C_BIND"/>
+ <field name="_SC_2_C_DEV"/>
+ <field name="_SC_2_C_VERSION"/>
+ <field name="_SC_2_FORT_DEV"/>
+ <field name="_SC_2_FORT_RUN"/>
+ <field name="_SC_2_LOCALEDEF"/>
+ <field name="_SC_2_SW_DEV"/>
+ <field name="_SC_2_UPE"/>
+ <field name="_SC_2_VERSION"/>
+ <field name="_SC_AIO_LISTIO_MAX"/>
+ <field name="_SC_AIO_MAX"/>
+ <field name="_SC_AIO_PRIO_DELTA_MAX"/>
+ <field name="_SC_ARG_MAX"/>
+ <field name="_SC_ASYNCHRONOUS_IO"/>
+ <field name="_SC_ATEXIT_MAX"/>
+ <field name="_SC_AVPHYS_PAGES"/>
+ <field name="_SC_BC_BASE_MAX"/>
+ <field name="_SC_BC_DIM_MAX"/>
+ <field name="_SC_BC_SCALE_MAX"/>
+ <field name="_SC_BC_STRING_MAX"/>
+ <field name="_SC_CHILD_MAX"/>
+ <field name="_SC_CLK_TCK"/>
+ <field name="_SC_COLL_WEIGHTS_MAX"/>
+ <field name="_SC_DELAYTIMER_MAX"/>
+ <field name="_SC_EXPR_NEST_MAX"/>
+ <field name="_SC_FSYNC"/>
+ <field name="_SC_GETGR_R_SIZE_MAX"/>
+ <field name="_SC_GETPW_R_SIZE_MAX"/>
+ <field name="_SC_IOV_MAX"/>
+ <field name="_SC_JOB_CONTROL"/>
+ <field name="_SC_LINE_MAX"/>
+ <field name="_SC_LOGIN_NAME_MAX"/>
+ <field name="_SC_MAPPED_FILES"/>
+ <field name="_SC_MEMLOCK"/>
+ <field name="_SC_MEMLOCK_RANGE"/>
+ <field name="_SC_MEMORY_PROTECTION"/>
+ <field name="_SC_MESSAGE_PASSING"/>
+ <field name="_SC_MQ_OPEN_MAX"/>
+ <field name="_SC_MQ_PRIO_MAX"/>
+ <field name="_SC_NGROUPS_MAX"/>
+ <field name="_SC_NPROCESSORS_CONF"/>
+ <field name="_SC_NPROCESSORS_ONLN"/>
+ <field name="_SC_OPEN_MAX"/>
+ <field name="_SC_PAGESIZE"/>
+ <field name="_SC_PAGE_SIZE"/>
+ <field name="_SC_PASS_MAX"/>
+ <field name="_SC_PHYS_PAGES"/>
+ <field name="_SC_PRIORITIZED_IO"/>
+ <field name="_SC_PRIORITY_SCHEDULING"/>
+ <field name="_SC_REALTIME_SIGNALS"/>
+ <field name="_SC_RE_DUP_MAX"/>
+ <field name="_SC_RTSIG_MAX"/>
+ <field name="_SC_SAVED_IDS"/>
+ <field name="_SC_SEMAPHORES"/>
+ <field name="_SC_SEM_NSEMS_MAX"/>
+ <field name="_SC_SEM_VALUE_MAX"/>
+ <field name="_SC_SHARED_MEMORY_OBJECTS"/>
+ <field name="_SC_SIGQUEUE_MAX"/>
+ <field name="_SC_STREAM_MAX"/>
+ <field name="_SC_SYNCHRONIZED_IO"/>
+ <field name="_SC_THREADS"/>
+ <field name="_SC_THREAD_ATTR_STACKADDR"/>
+ <field name="_SC_THREAD_ATTR_STACKSIZE"/>
+ <field name="_SC_THREAD_DESTRUCTOR_ITERATIONS"/>
+ <field name="_SC_THREAD_KEYS_MAX"/>
+ <field name="_SC_THREAD_PRIORITY_SCHEDULING"/>
+ <field name="_SC_THREAD_PRIO_INHERIT"/>
+ <field name="_SC_THREAD_PRIO_PROTECT"/>
+ <field name="_SC_THREAD_SAFE_FUNCTIONS"/>
+ <field name="_SC_THREAD_STACK_MIN"/>
+ <field name="_SC_THREAD_THREADS_MAX"/>
+ <field name="_SC_TIMERS"/>
+ <field name="_SC_TIMER_MAX"/>
+ <field name="_SC_TTY_NAME_MAX"/>
+ <field name="_SC_TZNAME_MAX"/>
+ <field name="_SC_VERSION"/>
+ <field name="_SC_XBS5_ILP32_OFF32"/>
+ <field name="_SC_XBS5_ILP32_OFFBIG"/>
+ <field name="_SC_XBS5_LP64_OFF64"/>
+ <field name="_SC_XBS5_LPBIG_OFFBIG"/>
+ <field name="_SC_XOPEN_CRYPT"/>
+ <field name="_SC_XOPEN_ENH_I18N"/>
+ <field name="_SC_XOPEN_LEGACY"/>
+ <field name="_SC_XOPEN_REALTIME"/>
+ <field name="_SC_XOPEN_REALTIME_THREADS"/>
+ <field name="_SC_XOPEN_SHM"/>
+ <field name="_SC_XOPEN_UNIX"/>
+ <field name="_SC_XOPEN_VERSION"/>
+ <field name="_SC_XOPEN_XCU_VERSION"/>
+ </class>
+ <class name="android/system/StructPollfd" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="events"/>
+ <field name="fd"/>
+ <field name="revents"/>
+ <field name="userData"/>
+ </class>
+ <class name="android/system/StructStat" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(JJIJIIJJJJJJJ)V"/>
+ <method name="&lt;init>(JJIJIIJJLandroid/system/StructTimespec;Landroid/system/StructTimespec;Landroid/system/StructTimespec;JJ)V" since="27"/>
+ <field name="st_atim" since="27"/>
+ <field name="st_atime"/>
+ <field name="st_blksize"/>
+ <field name="st_blocks"/>
+ <field name="st_ctim" since="27"/>
+ <field name="st_ctime"/>
+ <field name="st_dev"/>
+ <field name="st_gid"/>
+ <field name="st_ino"/>
+ <field name="st_mode"/>
+ <field name="st_mtim" since="27"/>
+ <field name="st_mtime"/>
+ <field name="st_nlink"/>
+ <field name="st_rdev"/>
+ <field name="st_size"/>
+ <field name="st_uid"/>
+ </class>
+ <class name="android/system/StructStatVfs" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(JJJJJJJJJJJ)V"/>
+ <field name="f_bavail"/>
+ <field name="f_bfree"/>
+ <field name="f_blocks"/>
+ <field name="f_bsize"/>
+ <field name="f_favail"/>
+ <field name="f_ffree"/>
+ <field name="f_files"/>
+ <field name="f_flag"/>
+ <field name="f_frsize"/>
+ <field name="f_fsid"/>
+ <field name="f_namemax"/>
+ </class>
+ <class name="android/system/StructTimespec" since="27">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>(JJ)V"/>
+ <method name="compareTo(Landroid/system/StructTimespec;)I"/>
+ <field name="tv_nsec"/>
+ <field name="tv_sec"/>
+ </class>
+ <class name="android/system/StructUtsname" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <field name="machine"/>
+ <field name="nodename"/>
+ <field name="release"/>
+ <field name="sysname"/>
+ <field name="version"/>
+ </class>
+ <class name="android/telecom/Call" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="answer(I)V"/>
+ <method name="conference(Landroid/telecom/Call;)V"/>
+ <method name="disconnect()V"/>
+ <method name="getCannedTextResponses()Ljava/util/List;"/>
+ <method name="getChildren()Ljava/util/List;"/>
+ <method name="getConferenceableCalls()Ljava/util/List;"/>
+ <method name="getDetails()Landroid/telecom/Call$Details;"/>
+ <method name="getParent()Landroid/telecom/Call;"/>
+ <method name="getRemainingPostDialSequence()Ljava/lang/String;"/>
+ <method name="getRttCall()Landroid/telecom/Call$RttCall;" since="26"/>
+ <method name="getState()I"/>
+ <method name="getVideoCall()Landroid/telecom/InCallService$VideoCall;"/>
+ <method name="hold()V"/>
+ <method name="isRttActive()Z" since="26"/>
+ <method name="mergeConference()V"/>
+ <method name="phoneAccountSelected(Landroid/telecom/PhoneAccountHandle;Z)V"/>
+ <method name="playDtmfTone(C)V"/>
+ <method name="postDialContinue(Z)V"/>
+ <method name="pullExternalCall()V" since="25"/>
+ <method name="putExtras(Landroid/os/Bundle;)V" since="25"/>
+ <method name="registerCallback(Landroid/telecom/Call$Callback;)V"/>
+ <method name="registerCallback(Landroid/telecom/Call$Callback;Landroid/os/Handler;)V"/>
+ <method name="reject(ZLjava/lang/String;)V"/>
+ <method name="removeExtras(Ljava/util/List;)V" since="25"/>
+ <method name="removeExtras([Ljava/lang/String;)V" since="25"/>
+ <method name="respondToRttRequest(IZ)V" since="26"/>
+ <method name="sendCallEvent(Ljava/lang/String;Landroid/os/Bundle;)V" since="25"/>
+ <method name="sendRttRequest()V" since="26"/>
+ <method name="splitFromConference()V"/>
+ <method name="stopDtmfTone()V"/>
+ <method name="stopRtt()V" since="26"/>
+ <method name="swapConference()V"/>
+ <method name="unhold()V"/>
+ <method name="unregisterCallback(Landroid/telecom/Call$Callback;)V"/>
+ <field name="AVAILABLE_PHONE_ACCOUNTS"/>
+ <field name="EXTRA_LAST_EMERGENCY_CALLBACK_TIME_MILLIS" since="26"/>
+ <field name="STATE_ACTIVE"/>
+ <field name="STATE_CONNECTING"/>
+ <field name="STATE_DIALING"/>
+ <field name="STATE_DISCONNECTED"/>
+ <field name="STATE_DISCONNECTING"/>
+ <field name="STATE_HOLDING"/>
+ <field name="STATE_NEW"/>
+ <field name="STATE_PULLING_CALL" since="25"/>
+ <field name="STATE_RINGING"/>
+ <field name="STATE_SELECT_PHONE_ACCOUNT"/>
+ </class>
+ <class name="android/telecom/Call$Callback" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onCallDestroyed(Landroid/telecom/Call;)V"/>
+ <method name="onCannedTextResponsesLoaded(Landroid/telecom/Call;Ljava/util/List;)V"/>
+ <method name="onChildrenChanged(Landroid/telecom/Call;Ljava/util/List;)V"/>
+ <method name="onConferenceableCallsChanged(Landroid/telecom/Call;Ljava/util/List;)V"/>
+ <method name="onConnectionEvent(Landroid/telecom/Call;Ljava/lang/String;Landroid/os/Bundle;)V" since="25"/>
+ <method name="onDetailsChanged(Landroid/telecom/Call;Landroid/telecom/Call$Details;)V"/>
+ <method name="onParentChanged(Landroid/telecom/Call;Landroid/telecom/Call;)V"/>
+ <method name="onPostDialWait(Landroid/telecom/Call;Ljava/lang/String;)V"/>
+ <method name="onRttInitiationFailure(Landroid/telecom/Call;I)V" since="26"/>
+ <method name="onRttModeChanged(Landroid/telecom/Call;I)V" since="26"/>
+ <method name="onRttRequest(Landroid/telecom/Call;I)V" since="26"/>
+ <method name="onRttStatusChanged(Landroid/telecom/Call;ZLandroid/telecom/Call$RttCall;)V" since="26"/>
+ <method name="onStateChanged(Landroid/telecom/Call;I)V"/>
+ <method name="onVideoCallChanged(Landroid/telecom/Call;Landroid/telecom/InCallService$VideoCall;)V"/>
+ </class>
+ <class name="android/telecom/Call$Details" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="can(I)Z"/>
+ <method name="can(II)Z"/>
+ <method name="capabilitiesToString(I)Ljava/lang/String;"/>
+ <method name="getAccountHandle()Landroid/telecom/PhoneAccountHandle;"/>
+ <method name="getCallCapabilities()I"/>
+ <method name="getCallProperties()I"/>
+ <method name="getCallerDisplayName()Ljava/lang/String;"/>
+ <method name="getCallerDisplayNamePresentation()I"/>
+ <method name="getConnectTimeMillis()J"/>
+ <method name="getCreationTimeMillis()J" since="26"/>
+ <method name="getDisconnectCause()Landroid/telecom/DisconnectCause;"/>
+ <method name="getExtras()Landroid/os/Bundle;"/>
+ <method name="getGatewayInfo()Landroid/telecom/GatewayInfo;"/>
+ <method name="getHandle()Landroid/net/Uri;"/>
+ <method name="getHandlePresentation()I"/>
+ <method name="getIntentExtras()Landroid/os/Bundle;"/>
+ <method name="getStatusHints()Landroid/telecom/StatusHints;"/>
+ <method name="getVideoState()I"/>
+ <method name="hasProperty(I)Z"/>
+ <method name="hasProperty(II)Z"/>
+ <method name="propertiesToString(I)Ljava/lang/String;"/>
+ <field name="CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO" since="24"/>
+ <field name="CAPABILITY_CAN_PAUSE_VIDEO"/>
+ <field name="CAPABILITY_CAN_PULL_CALL" since="25"/>
+ <field name="CAPABILITY_DISCONNECT_FROM_CONFERENCE"/>
+ <field name="CAPABILITY_HOLD"/>
+ <field name="CAPABILITY_MANAGE_CONFERENCE"/>
+ <field name="CAPABILITY_MERGE_CONFERENCE"/>
+ <field name="CAPABILITY_MUTE"/>
+ <field name="CAPABILITY_RESPOND_VIA_TEXT"/>
+ <field name="CAPABILITY_SEPARATE_FROM_CONFERENCE"/>
+ <field name="CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL"/>
+ <field name="CAPABILITY_SUPPORTS_VT_LOCAL_RX"/>
+ <field name="CAPABILITY_SUPPORTS_VT_LOCAL_TX"/>
+ <field name="CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL"/>
+ <field name="CAPABILITY_SUPPORTS_VT_REMOTE_RX"/>
+ <field name="CAPABILITY_SUPPORTS_VT_REMOTE_TX"/>
+ <field name="CAPABILITY_SUPPORT_HOLD"/>
+ <field name="CAPABILITY_SWAP_CONFERENCE"/>
+ <field name="PROPERTY_CONFERENCE"/>
+ <field name="PROPERTY_EMERGENCY_CALLBACK_MODE"/>
+ <field name="PROPERTY_ENTERPRISE_CALL" since="24"/>
+ <field name="PROPERTY_GENERIC_CONFERENCE"/>
+ <field name="PROPERTY_HAS_CDMA_VOICE_PRIVACY" since="25"/>
+ <field name="PROPERTY_HIGH_DEF_AUDIO"/>
+ <field name="PROPERTY_IS_EXTERNAL_CALL" since="25"/>
+ <field name="PROPERTY_SELF_MANAGED" since="26"/>
+ <field name="PROPERTY_WIFI"/>
+ </class>
+ <class name="android/telecom/Call$RttCall" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getRttAudioMode()I"/>
+ <method name="read()Ljava/lang/String;"/>
+ <method name="setRttMode(I)V"/>
+ <method name="write(Ljava/lang/String;)V"/>
+ <field name="RTT_MODE_FULL"/>
+ <field name="RTT_MODE_HCO"/>
+ <field name="RTT_MODE_VCO"/>
+ </class>
+ <class name="android/telecom/CallAudioState" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(ZII)V"/>
+ <method name="audioRouteToString(I)Ljava/lang/String;"/>
+ <method name="getActiveBluetoothDevice()Landroid/bluetooth/BluetoothDevice;" since="27"/>
+ <method name="getRoute()I"/>
+ <method name="getSupportedBluetoothDevices()Ljava/util/Collection;" since="27"/>
+ <method name="getSupportedRouteMask()I"/>
+ <method name="isMuted()Z"/>
+ <field name="CREATOR"/>
+ <field name="ROUTE_BLUETOOTH"/>
+ <field name="ROUTE_EARPIECE"/>
+ <field name="ROUTE_SPEAKER"/>
+ <field name="ROUTE_WIRED_HEADSET"/>
+ <field name="ROUTE_WIRED_OR_EARPIECE"/>
+ </class>
+ <class name="android/telecom/CallScreeningService" since="24">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="onScreenCall(Landroid/telecom/Call$Details;)V"/>
+ <method name="respondToCall(Landroid/telecom/Call$Details;Landroid/telecom/CallScreeningService$CallResponse;)V"/>
+ <field name="SERVICE_INTERFACE"/>
+ </class>
+ <class name="android/telecom/CallScreeningService$CallResponse" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDisallowCall()Z"/>
+ <method name="getRejectCall()Z"/>
+ <method name="getSkipCallLog()Z"/>
+ <method name="getSkipNotification()Z"/>
+ </class>
+ <class name="android/telecom/CallScreeningService$CallResponse$Builder" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="build()Landroid/telecom/CallScreeningService$CallResponse;"/>
+ <method name="setDisallowCall(Z)Landroid/telecom/CallScreeningService$CallResponse$Builder;"/>
+ <method name="setRejectCall(Z)Landroid/telecom/CallScreeningService$CallResponse$Builder;"/>
+ <method name="setSkipCallLog(Z)Landroid/telecom/CallScreeningService$CallResponse$Builder;"/>
+ <method name="setSkipNotification(Z)Landroid/telecom/CallScreeningService$CallResponse$Builder;"/>
+ </class>
+ <class name="android/telecom/Conference" since="23">
+ <extends name="android/telecom/Conferenceable"/>
+ <method name="&lt;init>(Landroid/telecom/PhoneAccountHandle;)V"/>
+ <method name="addConnection(Landroid/telecom/Connection;)Z"/>
+ <method name="destroy()V"/>
+ <method name="getCallAudioState()Landroid/telecom/CallAudioState;"/>
+ <method name="getConferenceableConnections()Ljava/util/List;"/>
+ <method name="getConnectionCapabilities()I"/>
+ <method name="getConnectionProperties()I" since="25"/>
+ <method name="getConnectionTime()J"/>
+ <method name="getConnections()Ljava/util/List;"/>
+ <method name="getDisconnectCause()Landroid/telecom/DisconnectCause;"/>
+ <method name="getExtras()Landroid/os/Bundle;"/>
+ <method name="getPhoneAccountHandle()Landroid/telecom/PhoneAccountHandle;"/>
+ <method name="getState()I"/>
+ <method name="getStatusHints()Landroid/telecom/StatusHints;"/>
+ <method name="getVideoProvider()Landroid/telecom/Connection$VideoProvider;"/>
+ <method name="getVideoState()I"/>
+ <method name="onCallAudioStateChanged(Landroid/telecom/CallAudioState;)V"/>
+ <method name="onConnectionAdded(Landroid/telecom/Connection;)V"/>
+ <method name="onDisconnect()V"/>
+ <method name="onExtrasChanged(Landroid/os/Bundle;)V" since="25"/>
+ <method name="onHold()V"/>
+ <method name="onMerge()V"/>
+ <method name="onMerge(Landroid/telecom/Connection;)V"/>
+ <method name="onPlayDtmfTone(C)V"/>
+ <method name="onSeparate(Landroid/telecom/Connection;)V"/>
+ <method name="onStopDtmfTone()V"/>
+ <method name="onSwap()V"/>
+ <method name="onUnhold()V"/>
+ <method name="putExtras(Landroid/os/Bundle;)V" since="25"/>
+ <method name="removeConnection(Landroid/telecom/Connection;)V"/>
+ <method name="removeExtras(Ljava/util/List;)V" since="25"/>
+ <method name="removeExtras([Ljava/lang/String;)V" since="25"/>
+ <method name="setActive()V"/>
+ <method name="setConferenceableConnections(Ljava/util/List;)V"/>
+ <method name="setConnectionCapabilities(I)V"/>
+ <method name="setConnectionElapsedTime(J)V" since="27"/>
+ <method name="setConnectionProperties(I)V" since="25"/>
+ <method name="setConnectionTime(J)V"/>
+ <method name="setDialing()V"/>
+ <method name="setDisconnected(Landroid/telecom/DisconnectCause;)V"/>
+ <method name="setExtras(Landroid/os/Bundle;)V"/>
+ <method name="setOnHold()V"/>
+ <method name="setStatusHints(Landroid/telecom/StatusHints;)V"/>
+ <method name="setVideoProvider(Landroid/telecom/Connection;Landroid/telecom/Connection$VideoProvider;)V"/>
+ <method name="setVideoState(Landroid/telecom/Connection;I)V"/>
+ <field name="CONNECT_TIME_NOT_SPECIFIED"/>
+ </class>
+ <class name="android/telecom/Conferenceable" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/telecom/Connection" since="23">
+ <extends name="android/telecom/Conferenceable"/>
+ <method name="&lt;init>()V"/>
+ <method name="capabilitiesToString(I)Ljava/lang/String;"/>
+ <method name="createCanceledConnection()Landroid/telecom/Connection;"/>
+ <method name="createFailedConnection(Landroid/telecom/DisconnectCause;)Landroid/telecom/Connection;"/>
+ <method name="destroy()V"/>
+ <method name="getAddress()Landroid/net/Uri;"/>
+ <method name="getAddressPresentation()I"/>
+ <method name="getAudioModeIsVoip()Z"/>
+ <method name="getCallAudioState()Landroid/telecom/CallAudioState;"/>
+ <method name="getCallerDisplayName()Ljava/lang/String;"/>
+ <method name="getCallerDisplayNamePresentation()I"/>
+ <method name="getConference()Landroid/telecom/Conference;"/>
+ <method name="getConferenceables()Ljava/util/List;"/>
+ <method name="getConnectionCapabilities()I"/>
+ <method name="getConnectionProperties()I" since="25"/>
+ <method name="getDisconnectCause()Landroid/telecom/DisconnectCause;"/>
+ <method name="getExtras()Landroid/os/Bundle;"/>
+ <method name="getState()I"/>
+ <method name="getStatusHints()Landroid/telecom/StatusHints;"/>
+ <method name="getVideoProvider()Landroid/telecom/Connection$VideoProvider;"/>
+ <method name="isRingbackRequested()Z"/>
+ <method name="onAbort()V"/>
+ <method name="onAnswer()V"/>
+ <method name="onAnswer(I)V"/>
+ <method name="onCallAudioStateChanged(Landroid/telecom/CallAudioState;)V"/>
+ <method name="onCallEvent(Ljava/lang/String;Landroid/os/Bundle;)V" since="25"/>
+ <method name="onDisconnect()V"/>
+ <method name="onExtrasChanged(Landroid/os/Bundle;)V" since="25"/>
+ <method name="onHold()V"/>
+ <method name="onPlayDtmfTone(C)V"/>
+ <method name="onPostDialContinue(Z)V"/>
+ <method name="onPullExternalCall()V" since="25"/>
+ <method name="onReject()V"/>
+ <method name="onReject(Ljava/lang/String;)V" since="24"/>
+ <method name="onSeparate()V"/>
+ <method name="onShowIncomingCallUi()V" since="26"/>
+ <method name="onStateChanged(I)V"/>
+ <method name="onStopDtmfTone()V"/>
+ <method name="onUnhold()V"/>
+ <method name="propertiesToString(I)Ljava/lang/String;" since="25"/>
+ <method name="putExtras(Landroid/os/Bundle;)V" since="25"/>
+ <method name="removeExtras(Ljava/util/List;)V" since="25"/>
+ <method name="removeExtras([Ljava/lang/String;)V" since="25"/>
+ <method name="requestBluetoothAudio(Ljava/lang/String;)V" since="27"/>
+ <method name="sendConnectionEvent(Ljava/lang/String;Landroid/os/Bundle;)V" since="25"/>
+ <method name="setActive()V"/>
+ <method name="setAddress(Landroid/net/Uri;I)V"/>
+ <method name="setAudioModeIsVoip(Z)V"/>
+ <method name="setAudioRoute(I)V" since="26"/>
+ <method name="setCallerDisplayName(Ljava/lang/String;I)V"/>
+ <method name="setConferenceableConnections(Ljava/util/List;)V"/>
+ <method name="setConferenceables(Ljava/util/List;)V"/>
+ <method name="setConnectionCapabilities(I)V"/>
+ <method name="setConnectionProperties(I)V" since="25"/>
+ <method name="setDialing()V"/>
+ <method name="setDisconnected(Landroid/telecom/DisconnectCause;)V"/>
+ <method name="setExtras(Landroid/os/Bundle;)V"/>
+ <method name="setInitialized()V"/>
+ <method name="setInitializing()V"/>
+ <method name="setNextPostDialChar(C)V"/>
+ <method name="setOnHold()V"/>
+ <method name="setPostDialWait(Ljava/lang/String;)V"/>
+ <method name="setPulling()V" since="25"/>
+ <method name="setRingbackRequested(Z)V"/>
+ <method name="setRinging()V"/>
+ <method name="setStatusHints(Landroid/telecom/StatusHints;)V"/>
+ <method name="setVideoProvider(Landroid/telecom/Connection$VideoProvider;)V"/>
+ <method name="setVideoState(I)V"/>
+ <method name="stateToString(I)Ljava/lang/String;"/>
+ <field name="CAPABILITY_CANNOT_DOWNGRADE_VIDEO_TO_AUDIO" since="24"/>
+ <field name="CAPABILITY_CAN_PAUSE_VIDEO"/>
+ <field name="CAPABILITY_CAN_PULL_CALL" since="25"/>
+ <field name="CAPABILITY_CAN_SEND_RESPONSE_VIA_CONNECTION" since="24"/>
+ <field name="CAPABILITY_CAN_UPGRADE_TO_VIDEO"/>
+ <field name="CAPABILITY_DISCONNECT_FROM_CONFERENCE"/>
+ <field name="CAPABILITY_HOLD"/>
+ <field name="CAPABILITY_MANAGE_CONFERENCE"/>
+ <field name="CAPABILITY_MERGE_CONFERENCE"/>
+ <field name="CAPABILITY_MUTE"/>
+ <field name="CAPABILITY_RESPOND_VIA_TEXT"/>
+ <field name="CAPABILITY_SEPARATE_FROM_CONFERENCE"/>
+ <field name="CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL"/>
+ <field name="CAPABILITY_SUPPORTS_VT_LOCAL_RX"/>
+ <field name="CAPABILITY_SUPPORTS_VT_LOCAL_TX"/>
+ <field name="CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL"/>
+ <field name="CAPABILITY_SUPPORTS_VT_REMOTE_RX"/>
+ <field name="CAPABILITY_SUPPORTS_VT_REMOTE_TX"/>
+ <field name="CAPABILITY_SUPPORT_HOLD"/>
+ <field name="CAPABILITY_SWAP_CONFERENCE"/>
+ <field name="EVENT_CALL_MERGE_FAILED" since="25"/>
+ <field name="EVENT_CALL_PULL_FAILED" since="25"/>
+ <field name="EXTRA_ANSWERING_DROPS_FG_CALL" since="25"/>
+ <field name="EXTRA_ANSWERING_DROPS_FG_CALL_APP_NAME" since="26"/>
+ <field name="EXTRA_CALL_SUBJECT"/>
+ <field name="EXTRA_CHILD_ADDRESS"/>
+ <field name="EXTRA_LAST_FORWARDED_NUMBER"/>
+ <field name="PROPERTY_HAS_CDMA_VOICE_PRIVACY" since="25"/>
+ <field name="PROPERTY_IS_EXTERNAL_CALL" since="25"/>
+ <field name="PROPERTY_SELF_MANAGED" since="26"/>
+ <field name="STATE_ACTIVE"/>
+ <field name="STATE_DIALING"/>
+ <field name="STATE_DISCONNECTED"/>
+ <field name="STATE_HOLDING"/>
+ <field name="STATE_INITIALIZING"/>
+ <field name="STATE_NEW"/>
+ <field name="STATE_PULLING_CALL" since="25"/>
+ <field name="STATE_RINGING"/>
+ </class>
+ <class name="android/telecom/Connection$RttModifyStatus" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="SESSION_MODIFY_REQUEST_FAIL"/>
+ <field name="SESSION_MODIFY_REQUEST_INVALID"/>
+ <field name="SESSION_MODIFY_REQUEST_REJECTED_BY_REMOTE"/>
+ <field name="SESSION_MODIFY_REQUEST_SUCCESS"/>
+ <field name="SESSION_MODIFY_REQUEST_TIMED_OUT"/>
+ </class>
+ <class name="android/telecom/Connection$VideoProvider" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="changeCameraCapabilities(Landroid/telecom/VideoProfile$CameraCapabilities;)V"/>
+ <method name="changePeerDimensions(II)V"/>
+ <method name="changeVideoQuality(I)V"/>
+ <method name="handleCallSessionEvent(I)V"/>
+ <method name="onRequestCameraCapabilities()V"/>
+ <method name="onRequestConnectionDataUsage()V"/>
+ <method name="onSendSessionModifyRequest(Landroid/telecom/VideoProfile;Landroid/telecom/VideoProfile;)V"/>
+ <method name="onSendSessionModifyResponse(Landroid/telecom/VideoProfile;)V"/>
+ <method name="onSetCamera(Ljava/lang/String;)V"/>
+ <method name="onSetDeviceOrientation(I)V"/>
+ <method name="onSetDisplaySurface(Landroid/view/Surface;)V"/>
+ <method name="onSetPauseImage(Landroid/net/Uri;)V"/>
+ <method name="onSetPreviewSurface(Landroid/view/Surface;)V"/>
+ <method name="onSetZoom(F)V"/>
+ <method name="receiveSessionModifyRequest(Landroid/telecom/VideoProfile;)V"/>
+ <method name="receiveSessionModifyResponse(ILandroid/telecom/VideoProfile;Landroid/telecom/VideoProfile;)V"/>
+ <method name="setCallDataUsage(J)V"/>
+ <field name="SESSION_EVENT_CAMERA_FAILURE"/>
+ <field name="SESSION_EVENT_CAMERA_PERMISSION_ERROR" since="26"/>
+ <field name="SESSION_EVENT_CAMERA_READY"/>
+ <field name="SESSION_EVENT_RX_PAUSE"/>
+ <field name="SESSION_EVENT_RX_RESUME"/>
+ <field name="SESSION_EVENT_TX_START"/>
+ <field name="SESSION_EVENT_TX_STOP"/>
+ <field name="SESSION_MODIFY_REQUEST_FAIL"/>
+ <field name="SESSION_MODIFY_REQUEST_INVALID"/>
+ <field name="SESSION_MODIFY_REQUEST_REJECTED_BY_REMOTE"/>
+ <field name="SESSION_MODIFY_REQUEST_SUCCESS"/>
+ <field name="SESSION_MODIFY_REQUEST_TIMED_OUT"/>
+ </class>
+ <class name="android/telecom/ConnectionRequest" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/telecom/PhoneAccountHandle;Landroid/net/Uri;Landroid/os/Bundle;)V"/>
+ <method name="&lt;init>(Landroid/telecom/PhoneAccountHandle;Landroid/net/Uri;Landroid/os/Bundle;I)V"/>
+ <method name="getAccountHandle()Landroid/telecom/PhoneAccountHandle;"/>
+ <method name="getAddress()Landroid/net/Uri;"/>
+ <method name="getExtras()Landroid/os/Bundle;"/>
+ <method name="getVideoState()I"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/telecom/ConnectionService" since="23">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="addConference(Landroid/telecom/Conference;)V"/>
+ <method name="addExistingConnection(Landroid/telecom/PhoneAccountHandle;Landroid/telecom/Connection;)V"/>
+ <method name="conferenceRemoteConnections(Landroid/telecom/RemoteConnection;Landroid/telecom/RemoteConnection;)V"/>
+ <method name="createRemoteIncomingConnection(Landroid/telecom/PhoneAccountHandle;Landroid/telecom/ConnectionRequest;)Landroid/telecom/RemoteConnection;"/>
+ <method name="createRemoteOutgoingConnection(Landroid/telecom/PhoneAccountHandle;Landroid/telecom/ConnectionRequest;)Landroid/telecom/RemoteConnection;"/>
+ <method name="getAllConferences()Ljava/util/Collection;" since="24"/>
+ <method name="getAllConnections()Ljava/util/Collection;"/>
+ <method name="onConference(Landroid/telecom/Connection;Landroid/telecom/Connection;)V"/>
+ <method name="onCreateIncomingConnection(Landroid/telecom/PhoneAccountHandle;Landroid/telecom/ConnectionRequest;)Landroid/telecom/Connection;"/>
+ <method name="onCreateIncomingConnectionFailed(Landroid/telecom/PhoneAccountHandle;Landroid/telecom/ConnectionRequest;)V" since="26"/>
+ <method name="onCreateOutgoingConnection(Landroid/telecom/PhoneAccountHandle;Landroid/telecom/ConnectionRequest;)Landroid/telecom/Connection;"/>
+ <method name="onCreateOutgoingConnectionFailed(Landroid/telecom/PhoneAccountHandle;Landroid/telecom/ConnectionRequest;)V" since="26"/>
+ <method name="onRemoteConferenceAdded(Landroid/telecom/RemoteConference;)V"/>
+ <method name="onRemoteExistingConnectionAdded(Landroid/telecom/RemoteConnection;)V"/>
+ <field name="SERVICE_INTERFACE"/>
+ </class>
+ <class name="android/telecom/DisconnectCause" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(ILjava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(ILjava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(ILjava/lang/String;)V"/>
+ <method name="getCode()I"/>
+ <method name="getDescription()Ljava/lang/CharSequence;"/>
+ <method name="getLabel()Ljava/lang/CharSequence;"/>
+ <method name="getReason()Ljava/lang/String;"/>
+ <method name="getTone()I"/>
+ <field name="ANSWERED_ELSEWHERE" since="25"/>
+ <field name="BUSY"/>
+ <field name="CALL_PULLED" since="25"/>
+ <field name="CANCELED"/>
+ <field name="CONNECTION_MANAGER_NOT_SUPPORTED"/>
+ <field name="CREATOR"/>
+ <field name="ERROR"/>
+ <field name="LOCAL"/>
+ <field name="MISSED"/>
+ <field name="OTHER"/>
+ <field name="REJECTED"/>
+ <field name="REMOTE"/>
+ <field name="RESTRICTED"/>
+ <field name="UNKNOWN"/>
+ </class>
+ <class name="android/telecom/GatewayInfo" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Ljava/lang/String;Landroid/net/Uri;Landroid/net/Uri;)V"/>
+ <method name="getGatewayAddress()Landroid/net/Uri;"/>
+ <method name="getGatewayProviderPackageName()Ljava/lang/String;"/>
+ <method name="getOriginalAddress()Landroid/net/Uri;"/>
+ <method name="isEmpty()Z"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/telecom/InCallService" since="23">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="canAddCall()Z"/>
+ <method name="getCallAudioState()Landroid/telecom/CallAudioState;"/>
+ <method name="getCalls()Ljava/util/List;"/>
+ <method name="onBringToForeground(Z)V"/>
+ <method name="onCallAdded(Landroid/telecom/Call;)V"/>
+ <method name="onCallAudioStateChanged(Landroid/telecom/CallAudioState;)V"/>
+ <method name="onCallRemoved(Landroid/telecom/Call;)V"/>
+ <method name="onCanAddCallChanged(Z)V"/>
+ <method name="onConnectionEvent(Landroid/telecom/Call;Ljava/lang/String;Landroid/os/Bundle;)V" since="25"/>
+ <method name="onSilenceRinger()V" since="24"/>
+ <method name="requestBluetoothAudio(Ljava/lang/String;)V" since="27"/>
+ <method name="setAudioRoute(I)V"/>
+ <method name="setMuted(Z)V"/>
+ <field name="SERVICE_INTERFACE"/>
+ </class>
+ <class name="android/telecom/InCallService$VideoCall" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="registerCallback(Landroid/telecom/InCallService$VideoCall$Callback;)V"/>
+ <method name="registerCallback(Landroid/telecom/InCallService$VideoCall$Callback;Landroid/os/Handler;)V"/>
+ <method name="requestCallDataUsage()V"/>
+ <method name="requestCameraCapabilities()V"/>
+ <method name="sendSessionModifyRequest(Landroid/telecom/VideoProfile;)V"/>
+ <method name="sendSessionModifyResponse(Landroid/telecom/VideoProfile;)V"/>
+ <method name="setCamera(Ljava/lang/String;)V"/>
+ <method name="setDeviceOrientation(I)V"/>
+ <method name="setDisplaySurface(Landroid/view/Surface;)V"/>
+ <method name="setPauseImage(Landroid/net/Uri;)V"/>
+ <method name="setPreviewSurface(Landroid/view/Surface;)V"/>
+ <method name="setZoom(F)V"/>
+ <method name="unregisterCallback(Landroid/telecom/InCallService$VideoCall$Callback;)V"/>
+ </class>
+ <class name="android/telecom/InCallService$VideoCall$Callback" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onCallDataUsageChanged(J)V"/>
+ <method name="onCallSessionEvent(I)V"/>
+ <method name="onCameraCapabilitiesChanged(Landroid/telecom/VideoProfile$CameraCapabilities;)V"/>
+ <method name="onPeerDimensionsChanged(II)V"/>
+ <method name="onSessionModifyRequestReceived(Landroid/telecom/VideoProfile;)V"/>
+ <method name="onSessionModifyResponseReceived(ILandroid/telecom/VideoProfile;Landroid/telecom/VideoProfile;)V"/>
+ <method name="onVideoQualityChanged(I)V"/>
+ </class>
+ <class name="android/telecom/PhoneAccount" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="builder(Landroid/telecom/PhoneAccountHandle;Ljava/lang/CharSequence;)Landroid/telecom/PhoneAccount$Builder;"/>
+ <method name="getAccountHandle()Landroid/telecom/PhoneAccountHandle;"/>
+ <method name="getAddress()Landroid/net/Uri;"/>
+ <method name="getCapabilities()I"/>
+ <method name="getExtras()Landroid/os/Bundle;" since="24"/>
+ <method name="getHighlightColor()I"/>
+ <method name="getIcon()Landroid/graphics/drawable/Icon;"/>
+ <method name="getLabel()Ljava/lang/CharSequence;"/>
+ <method name="getShortDescription()Ljava/lang/CharSequence;"/>
+ <method name="getSubscriptionAddress()Landroid/net/Uri;"/>
+ <method name="getSupportedUriSchemes()Ljava/util/List;"/>
+ <method name="hasCapabilities(I)Z"/>
+ <method name="isEnabled()Z"/>
+ <method name="supportsUriScheme(Ljava/lang/String;)Z"/>
+ <method name="toBuilder()Landroid/telecom/PhoneAccount$Builder;"/>
+ <field name="CAPABILITY_CALL_PROVIDER"/>
+ <field name="CAPABILITY_CALL_SUBJECT"/>
+ <field name="CAPABILITY_CONNECTION_MANAGER"/>
+ <field name="CAPABILITY_PLACE_EMERGENCY_CALLS"/>
+ <field name="CAPABILITY_RTT" since="26"/>
+ <field name="CAPABILITY_SELF_MANAGED" since="26"/>
+ <field name="CAPABILITY_SIM_SUBSCRIPTION"/>
+ <field name="CAPABILITY_SUPPORTS_VIDEO_CALLING" since="26"/>
+ <field name="CAPABILITY_VIDEO_CALLING"/>
+ <field name="CAPABILITY_VIDEO_CALLING_RELIES_ON_PRESENCE" since="24"/>
+ <field name="CREATOR"/>
+ <field name="EXTRA_CALL_SUBJECT_CHARACTER_ENCODING" since="24"/>
+ <field name="EXTRA_CALL_SUBJECT_MAX_LENGTH" since="24"/>
+ <field name="NO_HIGHLIGHT_COLOR"/>
+ <field name="NO_RESOURCE_ID"/>
+ <field name="SCHEME_SIP"/>
+ <field name="SCHEME_TEL"/>
+ <field name="SCHEME_VOICEMAIL"/>
+ </class>
+ <class name="android/telecom/PhoneAccount$Builder" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/telecom/PhoneAccount;)V"/>
+ <method name="&lt;init>(Landroid/telecom/PhoneAccountHandle;Ljava/lang/CharSequence;)V"/>
+ <method name="addSupportedUriScheme(Ljava/lang/String;)Landroid/telecom/PhoneAccount$Builder;"/>
+ <method name="build()Landroid/telecom/PhoneAccount;"/>
+ <method name="setAddress(Landroid/net/Uri;)Landroid/telecom/PhoneAccount$Builder;"/>
+ <method name="setCapabilities(I)Landroid/telecom/PhoneAccount$Builder;"/>
+ <method name="setExtras(Landroid/os/Bundle;)Landroid/telecom/PhoneAccount$Builder;" since="24"/>
+ <method name="setHighlightColor(I)Landroid/telecom/PhoneAccount$Builder;"/>
+ <method name="setIcon(Landroid/graphics/drawable/Icon;)Landroid/telecom/PhoneAccount$Builder;"/>
+ <method name="setShortDescription(Ljava/lang/CharSequence;)Landroid/telecom/PhoneAccount$Builder;"/>
+ <method name="setSubscriptionAddress(Landroid/net/Uri;)Landroid/telecom/PhoneAccount$Builder;"/>
+ <method name="setSupportedUriSchemes(Ljava/util/List;)Landroid/telecom/PhoneAccount$Builder;"/>
+ </class>
+ <class name="android/telecom/PhoneAccountHandle" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/content/ComponentName;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Landroid/content/ComponentName;Ljava/lang/String;Landroid/os/UserHandle;)V"/>
+ <method name="getComponentName()Landroid/content/ComponentName;"/>
+ <method name="getId()Ljava/lang/String;"/>
+ <method name="getUserHandle()Landroid/os/UserHandle;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/telecom/RemoteConference" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="disconnect()V"/>
+ <method name="getConferenceableConnections()Ljava/util/List;"/>
+ <method name="getConnectionCapabilities()I"/>
+ <method name="getConnectionProperties()I" since="24"/>
+ <method name="getConnections()Ljava/util/List;"/>
+ <method name="getDisconnectCause()Landroid/telecom/DisconnectCause;"/>
+ <method name="getExtras()Landroid/os/Bundle;"/>
+ <method name="getState()I"/>
+ <method name="hold()V"/>
+ <method name="merge()V"/>
+ <method name="playDtmfTone(C)V"/>
+ <method name="registerCallback(Landroid/telecom/RemoteConference$Callback;)V"/>
+ <method name="registerCallback(Landroid/telecom/RemoteConference$Callback;Landroid/os/Handler;)V"/>
+ <method name="separate(Landroid/telecom/RemoteConnection;)V"/>
+ <method name="setCallAudioState(Landroid/telecom/CallAudioState;)V"/>
+ <method name="stopDtmfTone()V"/>
+ <method name="swap()V"/>
+ <method name="unhold()V"/>
+ <method name="unregisterCallback(Landroid/telecom/RemoteConference$Callback;)V"/>
+ </class>
+ <class name="android/telecom/RemoteConference$Callback" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onConferenceableConnectionsChanged(Landroid/telecom/RemoteConference;Ljava/util/List;)V"/>
+ <method name="onConnectionAdded(Landroid/telecom/RemoteConference;Landroid/telecom/RemoteConnection;)V"/>
+ <method name="onConnectionCapabilitiesChanged(Landroid/telecom/RemoteConference;I)V"/>
+ <method name="onConnectionPropertiesChanged(Landroid/telecom/RemoteConference;I)V" since="25"/>
+ <method name="onConnectionRemoved(Landroid/telecom/RemoteConference;Landroid/telecom/RemoteConnection;)V"/>
+ <method name="onDestroyed(Landroid/telecom/RemoteConference;)V"/>
+ <method name="onDisconnected(Landroid/telecom/RemoteConference;Landroid/telecom/DisconnectCause;)V"/>
+ <method name="onExtrasChanged(Landroid/telecom/RemoteConference;Landroid/os/Bundle;)V"/>
+ <method name="onStateChanged(Landroid/telecom/RemoteConference;II)V"/>
+ </class>
+ <class name="android/telecom/RemoteConnection" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="abort()V"/>
+ <method name="answer()V"/>
+ <method name="disconnect()V"/>
+ <method name="getAddress()Landroid/net/Uri;"/>
+ <method name="getAddressPresentation()I"/>
+ <method name="getCallerDisplayName()Ljava/lang/CharSequence;"/>
+ <method name="getCallerDisplayNamePresentation()I"/>
+ <method name="getConference()Landroid/telecom/RemoteConference;"/>
+ <method name="getConferenceableConnections()Ljava/util/List;"/>
+ <method name="getConnectionCapabilities()I"/>
+ <method name="getConnectionProperties()I" since="25"/>
+ <method name="getDisconnectCause()Landroid/telecom/DisconnectCause;"/>
+ <method name="getExtras()Landroid/os/Bundle;"/>
+ <method name="getState()I"/>
+ <method name="getStatusHints()Landroid/telecom/StatusHints;"/>
+ <method name="getVideoProvider()Landroid/telecom/RemoteConnection$VideoProvider;"/>
+ <method name="getVideoState()I"/>
+ <method name="hold()V"/>
+ <method name="isRingbackRequested()Z"/>
+ <method name="isVoipAudioMode()Z"/>
+ <method name="playDtmfTone(C)V"/>
+ <method name="postDialContinue(Z)V"/>
+ <method name="pullExternalCall()V" since="25"/>
+ <method name="registerCallback(Landroid/telecom/RemoteConnection$Callback;)V"/>
+ <method name="registerCallback(Landroid/telecom/RemoteConnection$Callback;Landroid/os/Handler;)V"/>
+ <method name="reject()V"/>
+ <method name="setCallAudioState(Landroid/telecom/CallAudioState;)V"/>
+ <method name="stopDtmfTone()V"/>
+ <method name="unhold()V"/>
+ <method name="unregisterCallback(Landroid/telecom/RemoteConnection$Callback;)V"/>
+ </class>
+ <class name="android/telecom/RemoteConnection$Callback" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onAddressChanged(Landroid/telecom/RemoteConnection;Landroid/net/Uri;I)V"/>
+ <method name="onCallerDisplayNameChanged(Landroid/telecom/RemoteConnection;Ljava/lang/String;I)V"/>
+ <method name="onConferenceChanged(Landroid/telecom/RemoteConnection;Landroid/telecom/RemoteConference;)V"/>
+ <method name="onConferenceableConnectionsChanged(Landroid/telecom/RemoteConnection;Ljava/util/List;)V"/>
+ <method name="onConnectionCapabilitiesChanged(Landroid/telecom/RemoteConnection;I)V"/>
+ <method name="onConnectionEvent(Landroid/telecom/RemoteConnection;Ljava/lang/String;Landroid/os/Bundle;)V" since="25"/>
+ <method name="onConnectionPropertiesChanged(Landroid/telecom/RemoteConnection;I)V" since="25"/>
+ <method name="onDestroyed(Landroid/telecom/RemoteConnection;)V"/>
+ <method name="onDisconnected(Landroid/telecom/RemoteConnection;Landroid/telecom/DisconnectCause;)V"/>
+ <method name="onExtrasChanged(Landroid/telecom/RemoteConnection;Landroid/os/Bundle;)V"/>
+ <method name="onPostDialChar(Landroid/telecom/RemoteConnection;C)V"/>
+ <method name="onPostDialWait(Landroid/telecom/RemoteConnection;Ljava/lang/String;)V"/>
+ <method name="onRingbackRequested(Landroid/telecom/RemoteConnection;Z)V"/>
+ <method name="onStateChanged(Landroid/telecom/RemoteConnection;I)V"/>
+ <method name="onStatusHintsChanged(Landroid/telecom/RemoteConnection;Landroid/telecom/StatusHints;)V"/>
+ <method name="onVideoProviderChanged(Landroid/telecom/RemoteConnection;Landroid/telecom/RemoteConnection$VideoProvider;)V"/>
+ <method name="onVideoStateChanged(Landroid/telecom/RemoteConnection;I)V"/>
+ <method name="onVoipAudioChanged(Landroid/telecom/RemoteConnection;Z)V"/>
+ </class>
+ <class name="android/telecom/RemoteConnection$VideoProvider" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="registerCallback(Landroid/telecom/RemoteConnection$VideoProvider$Callback;)V"/>
+ <method name="requestCallDataUsage()V"/>
+ <method name="requestCameraCapabilities()V"/>
+ <method name="sendSessionModifyRequest(Landroid/telecom/VideoProfile;Landroid/telecom/VideoProfile;)V"/>
+ <method name="sendSessionModifyResponse(Landroid/telecom/VideoProfile;)V"/>
+ <method name="setCamera(Ljava/lang/String;)V"/>
+ <method name="setDeviceOrientation(I)V"/>
+ <method name="setDisplaySurface(Landroid/view/Surface;)V"/>
+ <method name="setPauseImage(Landroid/net/Uri;)V"/>
+ <method name="setPreviewSurface(Landroid/view/Surface;)V"/>
+ <method name="setZoom(F)V"/>
+ <method name="unregisterCallback(Landroid/telecom/RemoteConnection$VideoProvider$Callback;)V"/>
+ </class>
+ <class name="android/telecom/RemoteConnection$VideoProvider$Callback" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onCallDataUsageChanged(Landroid/telecom/RemoteConnection$VideoProvider;J)V"/>
+ <method name="onCallSessionEvent(Landroid/telecom/RemoteConnection$VideoProvider;I)V"/>
+ <method name="onCameraCapabilitiesChanged(Landroid/telecom/RemoteConnection$VideoProvider;Landroid/telecom/VideoProfile$CameraCapabilities;)V"/>
+ <method name="onPeerDimensionsChanged(Landroid/telecom/RemoteConnection$VideoProvider;II)V"/>
+ <method name="onSessionModifyRequestReceived(Landroid/telecom/RemoteConnection$VideoProvider;Landroid/telecom/VideoProfile;)V"/>
+ <method name="onSessionModifyResponseReceived(Landroid/telecom/RemoteConnection$VideoProvider;ILandroid/telecom/VideoProfile;Landroid/telecom/VideoProfile;)V"/>
+ <method name="onVideoQualityChanged(Landroid/telecom/RemoteConnection$VideoProvider;I)V"/>
+ </class>
+ <class name="android/telecom/StatusHints" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;Landroid/graphics/drawable/Icon;Landroid/os/Bundle;)V"/>
+ <method name="getExtras()Landroid/os/Bundle;"/>
+ <method name="getIcon()Landroid/graphics/drawable/Icon;"/>
+ <method name="getLabel()Ljava/lang/CharSequence;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/telecom/TelecomManager" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="acceptRingingCall()V" since="26"/>
+ <method name="acceptRingingCall(I)V" since="26"/>
+ <method name="addNewIncomingCall(Landroid/telecom/PhoneAccountHandle;Landroid/os/Bundle;)V" since="23"/>
+ <method name="cancelMissedCallsNotification()V"/>
+ <method name="createManageBlockedNumbersIntent()Landroid/content/Intent;" since="24"/>
+ <method name="getAdnUriForPhoneAccount(Landroid/telecom/PhoneAccountHandle;)Landroid/net/Uri;" since="23"/>
+ <method name="getCallCapablePhoneAccounts()Ljava/util/List;" since="23"/>
+ <method name="getDefaultDialerPackage()Ljava/lang/String;" since="23"/>
+ <method name="getDefaultOutgoingPhoneAccount(Ljava/lang/String;)Landroid/telecom/PhoneAccountHandle;" since="23"/>
+ <method name="getLine1Number(Landroid/telecom/PhoneAccountHandle;)Ljava/lang/String;" since="23"/>
+ <method name="getPhoneAccount(Landroid/telecom/PhoneAccountHandle;)Landroid/telecom/PhoneAccount;" since="23"/>
+ <method name="getSelfManagedPhoneAccounts()Ljava/util/List;" since="26"/>
+ <method name="getSimCallManager()Landroid/telecom/PhoneAccountHandle;" since="23"/>
+ <method name="getVoiceMailNumber(Landroid/telecom/PhoneAccountHandle;)Ljava/lang/String;" since="23"/>
+ <method name="handleMmi(Ljava/lang/String;)Z"/>
+ <method name="handleMmi(Ljava/lang/String;Landroid/telecom/PhoneAccountHandle;)Z" since="23"/>
+ <method name="isInCall()Z"/>
+ <method name="isInManagedCall()Z" since="26"/>
+ <method name="isIncomingCallPermitted(Landroid/telecom/PhoneAccountHandle;)Z" since="26"/>
+ <method name="isOutgoingCallPermitted(Landroid/telecom/PhoneAccountHandle;)Z" since="26"/>
+ <method name="isTtySupported()Z" since="27"/>
+ <method name="isVoiceMailNumber(Landroid/telecom/PhoneAccountHandle;Ljava/lang/String;)Z" since="23"/>
+ <method name="placeCall(Landroid/net/Uri;Landroid/os/Bundle;)V" since="23"/>
+ <method name="registerPhoneAccount(Landroid/telecom/PhoneAccount;)V" since="23"/>
+ <method name="showInCallScreen(Z)V"/>
+ <method name="silenceRinger()V" since="23"/>
+ <method name="unregisterPhoneAccount(Landroid/telecom/PhoneAccountHandle;)V" since="23"/>
+ <field name="ACTION_CHANGE_DEFAULT_DIALER" since="23"/>
+ <field name="ACTION_CHANGE_PHONE_ACCOUNTS" since="23"/>
+ <field name="ACTION_CONFIGURE_PHONE_ACCOUNT" since="23"/>
+ <field name="ACTION_DEFAULT_DIALER_CHANGED" since="23"/>
+ <field name="ACTION_INCOMING_CALL" since="23" deprecated="26"/>
+ <field name="ACTION_PHONE_ACCOUNT_REGISTERED" since="26"/>
+ <field name="ACTION_PHONE_ACCOUNT_UNREGISTERED" since="26"/>
+ <field name="ACTION_SHOW_CALL_ACCESSIBILITY_SETTINGS" since="23"/>
+ <field name="ACTION_SHOW_CALL_SETTINGS"/>
+ <field name="ACTION_SHOW_MISSED_CALLS_NOTIFICATION" since="24"/>
+ <field name="ACTION_SHOW_RESPOND_VIA_SMS_SETTINGS" since="23"/>
+ <field name="DTMF_CHARACTER_PAUSE"/>
+ <field name="DTMF_CHARACTER_WAIT"/>
+ <field name="EXTRA_CALL_BACK_NUMBER" since="23"/>
+ <field name="EXTRA_CALL_DISCONNECT_CAUSE"/>
+ <field name="EXTRA_CALL_DISCONNECT_MESSAGE"/>
+ <field name="EXTRA_CALL_SUBJECT" since="23"/>
+ <field name="EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME" since="23"/>
+ <field name="EXTRA_INCOMING_CALL_ADDRESS" since="23"/>
+ <field name="EXTRA_INCOMING_CALL_EXTRAS" since="23"/>
+ <field name="EXTRA_INCOMING_VIDEO_STATE" since="26"/>
+ <field name="EXTRA_NOTIFICATION_COUNT" since="24"/>
+ <field name="EXTRA_NOTIFICATION_PHONE_NUMBER" since="24"/>
+ <field name="EXTRA_OUTGOING_CALL_EXTRAS" since="23"/>
+ <field name="EXTRA_PHONE_ACCOUNT_HANDLE" since="23"/>
+ <field name="EXTRA_START_CALL_WITH_RTT" since="26"/>
+ <field name="EXTRA_START_CALL_WITH_SPEAKERPHONE"/>
+ <field name="EXTRA_START_CALL_WITH_VIDEO_STATE" since="23"/>
+ <field name="GATEWAY_ORIGINAL_ADDRESS"/>
+ <field name="GATEWAY_PROVIDER_PACKAGE"/>
+ <field name="METADATA_INCLUDE_EXTERNAL_CALLS" since="25"/>
+ <field name="METADATA_INCLUDE_SELF_MANAGED_CALLS" since="26"/>
+ <field name="METADATA_IN_CALL_SERVICE_RINGING" since="24"/>
+ <field name="METADATA_IN_CALL_SERVICE_UI" since="23"/>
+ <field name="PRESENTATION_ALLOWED"/>
+ <field name="PRESENTATION_PAYPHONE"/>
+ <field name="PRESENTATION_RESTRICTED"/>
+ <field name="PRESENTATION_UNKNOWN"/>
+ </class>
+ <class name="android/telecom/VideoProfile" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="getQuality()I"/>
+ <method name="getVideoState()I"/>
+ <method name="isAudioOnly(I)Z"/>
+ <method name="isBidirectional(I)Z"/>
+ <method name="isPaused(I)Z"/>
+ <method name="isReceptionEnabled(I)Z"/>
+ <method name="isTransmissionEnabled(I)Z"/>
+ <method name="isVideo(I)Z"/>
+ <method name="videoStateToString(I)Ljava/lang/String;"/>
+ <field name="CREATOR"/>
+ <field name="QUALITY_DEFAULT"/>
+ <field name="QUALITY_HIGH"/>
+ <field name="QUALITY_LOW"/>
+ <field name="QUALITY_MEDIUM"/>
+ <field name="STATE_AUDIO_ONLY"/>
+ <field name="STATE_BIDIRECTIONAL"/>
+ <field name="STATE_PAUSED"/>
+ <field name="STATE_RX_ENABLED"/>
+ <field name="STATE_TX_ENABLED"/>
+ </class>
+ <class name="android/telecom/VideoProfile$CameraCapabilities" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="getHeight()I"/>
+ <method name="getWidth()I"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/telephony/CarrierConfigManager" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getConfig()Landroid/os/PersistableBundle;"/>
+ <method name="getConfigForSubId(I)Landroid/os/PersistableBundle;"/>
+ <method name="notifyConfigChangedForSubId(I)V"/>
+ <field name="ACTION_CARRIER_CONFIG_CHANGED"/>
+ <field name="DATA_CYCLE_THRESHOLD_DISABLED" since="26"/>
+ <field name="KEY_ADDITIONAL_CALL_SETTING_BOOL"/>
+ <field name="KEY_ALLOW_ADDING_APNS_BOOL" since="24"/>
+ <field name="KEY_ALLOW_ADD_CALL_DURING_VIDEO_CALL_BOOL" since="25"/>
+ <field name="KEY_ALLOW_EMERGENCY_NUMBERS_IN_CALL_LOG_BOOL"/>
+ <field name="KEY_ALLOW_EMERGENCY_VIDEO_CALLS_BOOL" since="24"/>
+ <field name="KEY_ALLOW_LOCAL_DTMF_TONES_BOOL"/>
+ <field name="KEY_ALLOW_MERGE_WIFI_CALLS_WHEN_VOWIFI_OFF_BOOL" since="25"/>
+ <field name="KEY_ALLOW_NON_EMERGENCY_CALLS_IN_ECM_BOOL" since="24"/>
+ <field name="KEY_ALWAYS_SHOW_EMERGENCY_ALERT_ONOFF_BOOL" since="24"/>
+ <field name="KEY_APN_EXPAND_BOOL"/>
+ <field name="KEY_AUTO_RETRY_ENABLED_BOOL"/>
+ <field name="KEY_CALL_FORWARDING_BLOCKS_WHILE_ROAMING_STRING_ARRAY" since="26"/>
+ <field name="KEY_CARRIER_ALLOW_TURNOFF_IMS_BOOL"/>
+ <field name="KEY_CARRIER_DATA_CALL_PERMANENT_FAILURE_STRINGS" since="26"/>
+ <field name="KEY_CARRIER_FORCE_DISABLE_ETWS_CMAS_TEST_BOOL" since="24"/>
+ <field name="KEY_CARRIER_IMS_GBA_REQUIRED_BOOL" since="24"/>
+ <field name="KEY_CARRIER_INSTANT_LETTERING_AVAILABLE_BOOL" since="24"/>
+ <field name="KEY_CARRIER_INSTANT_LETTERING_ENCODING_STRING" since="24"/>
+ <field name="KEY_CARRIER_INSTANT_LETTERING_ESCAPED_CHARS_STRING" since="24"/>
+ <field name="KEY_CARRIER_INSTANT_LETTERING_INVALID_CHARS_STRING" since="24"/>
+ <field name="KEY_CARRIER_INSTANT_LETTERING_LENGTH_LIMIT_INT" since="24"/>
+ <field name="KEY_CARRIER_SETTINGS_ENABLE_BOOL"/>
+ <field name="KEY_CARRIER_USE_IMS_FIRST_FOR_EMERGENCY_BOOL" since="24"/>
+ <field name="KEY_CARRIER_VOLTE_AVAILABLE_BOOL"/>
+ <field name="KEY_CARRIER_VOLTE_PROVISIONED_BOOL" since="26"/>
+ <field name="KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL"/>
+ <field name="KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL"/>
+ <field name="KEY_CARRIER_VT_AVAILABLE_BOOL"/>
+ <field name="KEY_CARRIER_VVM_PACKAGE_NAME_STRING" deprecated="26"/>
+ <field name="KEY_CARRIER_VVM_PACKAGE_NAME_STRING_ARRAY" since="26"/>
+ <field name="KEY_CARRIER_WFC_IMS_AVAILABLE_BOOL"/>
+ <field name="KEY_CARRIER_WFC_SUPPORTS_WIFI_ONLY_BOOL" since="24"/>
+ <field name="KEY_CDMA_3WAYCALL_FLASH_DELAY_INT" since="26"/>
+ <field name="KEY_CDMA_DTMF_TONE_DELAY_INT" since="24"/>
+ <field name="KEY_CDMA_NONROAMING_NETWORKS_STRING_ARRAY"/>
+ <field name="KEY_CDMA_ROAMING_NETWORKS_STRING_ARRAY"/>
+ <field name="KEY_CI_ACTION_ON_SYS_UPDATE_BOOL" since="24"/>
+ <field name="KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_STRING" since="24"/>
+ <field name="KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_VAL_STRING" since="24"/>
+ <field name="KEY_CI_ACTION_ON_SYS_UPDATE_INTENT_STRING" since="24"/>
+ <field name="KEY_CONFIG_IMS_PACKAGE_OVERRIDE_STRING" since="26"/>
+ <field name="KEY_CSP_ENABLED_BOOL"/>
+ <field name="KEY_DATA_LIMIT_THRESHOLD_BYTES_LONG" since="26"/>
+ <field name="KEY_DATA_WARNING_THRESHOLD_BYTES_LONG" since="26"/>
+ <field name="KEY_DEFAULT_SIM_CALL_MANAGER_STRING"/>
+ <field name="KEY_DEFAULT_VM_NUMBER_STRING" since="26"/>
+ <field name="KEY_DIAL_STRING_REPLACE_STRING_ARRAY" since="26"/>
+ <field name="KEY_DISABLE_CDMA_ACTIVATION_CODE_BOOL"/>
+ <field name="KEY_DROP_VIDEO_CALL_WHEN_ANSWERING_AUDIO_CALL_BOOL" since="25"/>
+ <field name="KEY_DTMF_TYPE_ENABLED_BOOL"/>
+ <field name="KEY_DURATION_BLOCKING_DISABLED_AFTER_EMERGENCY_INT" since="24"/>
+ <field name="KEY_EDITABLE_ENHANCED_4G_LTE_BOOL" since="24"/>
+ <field name="KEY_EDITABLE_VOICEMAIL_NUMBER_BOOL" since="26"/>
+ <field name="KEY_EDITABLE_VOICEMAIL_NUMBER_SETTING_BOOL" since="27"/>
+ <field name="KEY_ENABLE_DIALER_KEY_VIBRATION_BOOL"/>
+ <field name="KEY_FORCE_HOME_NETWORK_BOOL"/>
+ <field name="KEY_GSM_DTMF_TONE_DELAY_INT" since="24"/>
+ <field name="KEY_GSM_NONROAMING_NETWORKS_STRING_ARRAY"/>
+ <field name="KEY_GSM_ROAMING_NETWORKS_STRING_ARRAY"/>
+ <field name="KEY_HAS_IN_CALL_NOISE_SUPPRESSION_BOOL"/>
+ <field name="KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL"/>
+ <field name="KEY_HIDE_ENHANCED_4G_LTE_BOOL" since="26"/>
+ <field name="KEY_HIDE_IMS_APN_BOOL" since="24"/>
+ <field name="KEY_HIDE_PREFERRED_NETWORK_TYPE_BOOL" since="24"/>
+ <field name="KEY_HIDE_SIM_LOCK_SETTINGS_BOOL"/>
+ <field name="KEY_IGNORE_SIM_NETWORK_LOCKED_EVENTS_BOOL"/>
+ <field name="KEY_IMS_CONFERENCE_SIZE_LIMIT_INT" since="26"/>
+ <field name="KEY_IMS_DTMF_TONE_DELAY_INT" since="24"/>
+ <field name="KEY_IS_IMS_CONFERENCE_SIZE_ENFORCED_BOOL" since="26"/>
+ <field name="KEY_MDN_IS_ADDITIONAL_VOICEMAIL_NUMBER_BOOL" since="26"/>
+ <field name="KEY_MMS_ALIAS_ENABLED_BOOL"/>
+ <field name="KEY_MMS_ALIAS_MAX_CHARS_INT"/>
+ <field name="KEY_MMS_ALIAS_MIN_CHARS_INT"/>
+ <field name="KEY_MMS_ALLOW_ATTACH_AUDIO_BOOL"/>
+ <field name="KEY_MMS_APPEND_TRANSACTION_ID_BOOL"/>
+ <field name="KEY_MMS_EMAIL_GATEWAY_NUMBER_STRING"/>
+ <field name="KEY_MMS_GROUP_MMS_ENABLED_BOOL"/>
+ <field name="KEY_MMS_HTTP_PARAMS_STRING"/>
+ <field name="KEY_MMS_HTTP_SOCKET_TIMEOUT_INT"/>
+ <field name="KEY_MMS_MAX_IMAGE_HEIGHT_INT"/>
+ <field name="KEY_MMS_MAX_IMAGE_WIDTH_INT"/>
+ <field name="KEY_MMS_MAX_MESSAGE_SIZE_INT"/>
+ <field name="KEY_MMS_MESSAGE_TEXT_MAX_SIZE_INT"/>
+ <field name="KEY_MMS_MMS_DELIVERY_REPORT_ENABLED_BOOL"/>
+ <field name="KEY_MMS_MMS_ENABLED_BOOL"/>
+ <field name="KEY_MMS_MMS_READ_REPORT_ENABLED_BOOL"/>
+ <field name="KEY_MMS_MULTIPART_SMS_ENABLED_BOOL"/>
+ <field name="KEY_MMS_NAI_SUFFIX_STRING"/>
+ <field name="KEY_MMS_NOTIFY_WAP_MMSC_ENABLED_BOOL"/>
+ <field name="KEY_MMS_RECIPIENT_LIMIT_INT"/>
+ <field name="KEY_MMS_SEND_MULTIPART_SMS_AS_SEPARATE_MESSAGES_BOOL"/>
+ <field name="KEY_MMS_SHOW_CELL_BROADCAST_APP_LINKS_BOOL"/>
+ <field name="KEY_MMS_SMS_DELIVERY_REPORT_ENABLED_BOOL"/>
+ <field name="KEY_MMS_SMS_TO_MMS_TEXT_LENGTH_THRESHOLD_INT"/>
+ <field name="KEY_MMS_SMS_TO_MMS_TEXT_THRESHOLD_INT"/>
+ <field name="KEY_MMS_SUBJECT_MAX_LENGTH_INT"/>
+ <field name="KEY_MMS_SUPPORT_HTTP_CHARSET_HEADER_BOOL"/>
+ <field name="KEY_MMS_SUPPORT_MMS_CONTENT_DISPOSITION_BOOL"/>
+ <field name="KEY_MMS_UA_PROF_TAG_NAME_STRING"/>
+ <field name="KEY_MMS_UA_PROF_URL_STRING"/>
+ <field name="KEY_MMS_USER_AGENT_STRING"/>
+ <field name="KEY_MONTHLY_DATA_CYCLE_DAY_INT" since="26"/>
+ <field name="KEY_ONLY_SINGLE_DC_ALLOWED_INT_ARRAY" since="26"/>
+ <field name="KEY_OPERATOR_SELECTION_EXPAND_BOOL"/>
+ <field name="KEY_PREFER_2G_BOOL"/>
+ <field name="KEY_RCS_CONFIG_SERVER_URL_STRING" since="26"/>
+ <field name="KEY_REQUIRE_ENTITLEMENT_CHECKS_BOOL" since="24"/>
+ <field name="KEY_RESTART_RADIO_ON_PDP_FAIL_REGULAR_DEACTIVATION_BOOL" since="26"/>
+ <field name="KEY_SHOW_APN_SETTING_CDMA_BOOL"/>
+ <field name="KEY_SHOW_CDMA_CHOICES_BOOL"/>
+ <field name="KEY_SHOW_ICCID_IN_SIM_STATUS_BOOL" since="24"/>
+ <field name="KEY_SHOW_ONSCREEN_DIAL_BUTTON_BOOL"/>
+ <field name="KEY_SIMPLIFIED_NETWORK_SETTINGS_BOOL" since="26"/>
+ <field name="KEY_SIM_NETWORK_UNLOCK_ALLOW_DISMISS_BOOL"/>
+ <field name="KEY_SMS_REQUIRES_DESTINATION_NUMBER_CONVERSION_BOOL" since="26"/>
+ <field name="KEY_SUPPORT_3GPP_CALL_FORWARDING_WHILE_ROAMING_BOOL" since="26"/>
+ <field name="KEY_SUPPORT_CONFERENCE_CALL_BOOL" since="24"/>
+ <field name="KEY_SUPPORT_PAUSE_IMS_VIDEO_CALLS_BOOL"/>
+ <field name="KEY_SUPPORT_SWAP_AFTER_MERGE_BOOL"/>
+ <field name="KEY_TREAT_DOWNGRADED_VIDEO_CALLS_AS_VIDEO_CALLS_BOOL" since="25"/>
+ <field name="KEY_USE_HFA_FOR_PROVISIONING_BOOL"/>
+ <field name="KEY_USE_OTASP_FOR_PROVISIONING_BOOL"/>
+ <field name="KEY_USE_RCS_PRESENCE_BOOL" since="24"/>
+ <field name="KEY_VOICEMAIL_NOTIFICATION_PERSISTENT_BOOL"/>
+ <field name="KEY_VOICE_PRIVACY_DISABLE_UI_BOOL"/>
+ <field name="KEY_VOLTE_REPLACEMENT_RAT_INT"/>
+ <field name="KEY_VVM_CELLULAR_DATA_REQUIRED_BOOL" since="24"/>
+ <field name="KEY_VVM_CLIENT_PREFIX_STRING" since="26"/>
+ <field name="KEY_VVM_DESTINATION_NUMBER_STRING"/>
+ <field name="KEY_VVM_DISABLED_CAPABILITIES_STRING_ARRAY" since="26"/>
+ <field name="KEY_VVM_LEGACY_MODE_ENABLED_BOOL" since="26"/>
+ <field name="KEY_VVM_PORT_NUMBER_INT"/>
+ <field name="KEY_VVM_PREFETCH_BOOL" since="24"/>
+ <field name="KEY_VVM_SSL_ENABLED_BOOL" since="26"/>
+ <field name="KEY_VVM_TYPE_STRING"/>
+ <field name="KEY_WORLD_PHONE_BOOL"/>
+ </class>
+ <class name="android/telephony/CellIdentityCdma" since="17">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getBasestationId()I"/>
+ <method name="getLatitude()I"/>
+ <method name="getLongitude()I"/>
+ <method name="getNetworkId()I"/>
+ <method name="getOperatorAlphaLong()Ljava/lang/CharSequence;" since="27"/>
+ <method name="getOperatorAlphaShort()Ljava/lang/CharSequence;" since="27"/>
+ <method name="getSystemId()I"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/telephony/CellIdentityGsm" since="17">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getArfcn()I" since="24"/>
+ <method name="getBsic()I" since="24"/>
+ <method name="getCid()I"/>
+ <method name="getLac()I"/>
+ <method name="getMcc()I" deprecated="27"/>
+ <method name="getMccStr()Ljava/lang/String;" since="27"/>
+ <method name="getMnc()I" deprecated="27"/>
+ <method name="getMncStr()Ljava/lang/String;" since="27"/>
+ <method name="getMobileNetworkOperator()Ljava/lang/String;" since="27"/>
+ <method name="getOperatorAlphaLong()Ljava/lang/CharSequence;" since="27"/>
+ <method name="getOperatorAlphaShort()Ljava/lang/CharSequence;" since="27"/>
+ <method name="getPsc()I" deprecated="18"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/telephony/CellIdentityLte" since="17">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCi()I"/>
+ <method name="getEarfcn()I" since="24"/>
+ <method name="getMcc()I" deprecated="27"/>
+ <method name="getMccStr()Ljava/lang/String;" since="27"/>
+ <method name="getMnc()I" deprecated="27"/>
+ <method name="getMncStr()Ljava/lang/String;" since="27"/>
+ <method name="getMobileNetworkOperator()Ljava/lang/String;" since="27"/>
+ <method name="getOperatorAlphaLong()Ljava/lang/CharSequence;" since="27"/>
+ <method name="getOperatorAlphaShort()Ljava/lang/CharSequence;" since="27"/>
+ <method name="getPci()I"/>
+ <method name="getTac()I"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/telephony/CellIdentityWcdma" since="18">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCid()I"/>
+ <method name="getLac()I"/>
+ <method name="getMcc()I" deprecated="27"/>
+ <method name="getMccStr()Ljava/lang/String;" since="27"/>
+ <method name="getMnc()I" deprecated="27"/>
+ <method name="getMncStr()Ljava/lang/String;" since="27"/>
+ <method name="getMobileNetworkOperator()Ljava/lang/String;" since="27"/>
+ <method name="getOperatorAlphaLong()Ljava/lang/CharSequence;" since="27"/>
+ <method name="getOperatorAlphaShort()Ljava/lang/CharSequence;" since="27"/>
+ <method name="getPsc()I"/>
+ <method name="getUarfcn()I" since="24"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/telephony/CellInfo" since="17">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getTimeStamp()J"/>
+ <method name="isRegistered()Z"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/telephony/CellInfoCdma" since="17">
+ <extends name="android/telephony/CellInfo"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCellIdentity()Landroid/telephony/CellIdentityCdma;"/>
+ <method name="getCellSignalStrength()Landroid/telephony/CellSignalStrengthCdma;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/telephony/CellInfoGsm" since="17">
+ <extends name="android/telephony/CellInfo"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCellIdentity()Landroid/telephony/CellIdentityGsm;"/>
+ <method name="getCellSignalStrength()Landroid/telephony/CellSignalStrengthGsm;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/telephony/CellInfoLte" since="17">
+ <extends name="android/telephony/CellInfo"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCellIdentity()Landroid/telephony/CellIdentityLte;"/>
+ <method name="getCellSignalStrength()Landroid/telephony/CellSignalStrengthLte;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/telephony/CellInfoWcdma" since="18">
+ <extends name="android/telephony/CellInfo"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCellIdentity()Landroid/telephony/CellIdentityWcdma;"/>
+ <method name="getCellSignalStrength()Landroid/telephony/CellSignalStrengthWcdma;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/telephony/CellLocation" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getEmpty()Landroid/telephony/CellLocation;"/>
+ <method name="requestLocationUpdate()V"/>
+ </class>
+ <class name="android/telephony/CellSignalStrength" since="17">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAsuLevel()I"/>
+ <method name="getDbm()I"/>
+ <method name="getLevel()I"/>
+ <field name="SIGNAL_STRENGTH_GOOD" since="23"/>
+ <field name="SIGNAL_STRENGTH_GREAT" since="23"/>
+ <field name="SIGNAL_STRENGTH_MODERATE" since="23"/>
+ <field name="SIGNAL_STRENGTH_NONE_OR_UNKNOWN" since="23"/>
+ <field name="SIGNAL_STRENGTH_POOR" since="23"/>
+ </class>
+ <class name="android/telephony/CellSignalStrengthCdma" since="17">
+ <extends name="android/telephony/CellSignalStrength"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCdmaDbm()I"/>
+ <method name="getCdmaEcio()I"/>
+ <method name="getCdmaLevel()I"/>
+ <method name="getEvdoDbm()I"/>
+ <method name="getEvdoEcio()I"/>
+ <method name="getEvdoLevel()I"/>
+ <method name="getEvdoSnr()I"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/telephony/CellSignalStrengthGsm" since="17">
+ <extends name="android/telephony/CellSignalStrength"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getTimingAdvance()I" since="26"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/telephony/CellSignalStrengthLte" since="17">
+ <extends name="android/telephony/CellSignalStrength"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCqi()I" since="26"/>
+ <method name="getRsrp()I" since="26"/>
+ <method name="getRsrq()I" since="26"/>
+ <method name="getRssnr()I" since="26"/>
+ <method name="getTimingAdvance()I"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/telephony/CellSignalStrengthWcdma" since="18">
+ <extends name="android/telephony/CellSignalStrength"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/telephony/IccOpenLogicalChannelResponse" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getChannel()I"/>
+ <method name="getSelectResponse()[B"/>
+ <method name="getStatus()I"/>
+ <field name="CREATOR"/>
+ <field name="INVALID_CHANNEL"/>
+ <field name="STATUS_MISSING_RESOURCE"/>
+ <field name="STATUS_NO_ERROR"/>
+ <field name="STATUS_NO_SUCH_ELEMENT"/>
+ <field name="STATUS_UNKNOWN_ERROR"/>
+ </class>
+ <class name="android/telephony/MbmsDownloadSession" since="27">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable"/>
+ <method name="&lt;init>()V"/>
+ <method name="cancelDownload(Landroid/telephony/mbms/DownloadRequest;)V"/>
+ <method name="create(Landroid/content/Context;Landroid/telephony/mbms/MbmsDownloadSessionCallback;ILandroid/os/Handler;)Landroid/telephony/MbmsDownloadSession;"/>
+ <method name="create(Landroid/content/Context;Landroid/telephony/mbms/MbmsDownloadSessionCallback;Landroid/os/Handler;)Landroid/telephony/MbmsDownloadSession;"/>
+ <method name="download(Landroid/telephony/mbms/DownloadRequest;)V"/>
+ <method name="getDownloadStatus(Landroid/telephony/mbms/DownloadRequest;Landroid/telephony/mbms/FileInfo;)I"/>
+ <method name="getTempFileRootDirectory()Ljava/io/File;"/>
+ <method name="listPendingDownloads()Ljava/util/List;"/>
+ <method name="registerStateCallback(Landroid/telephony/mbms/DownloadRequest;Landroid/telephony/mbms/DownloadStateCallback;Landroid/os/Handler;)V"/>
+ <method name="requestUpdateFileServices(Ljava/util/List;)V"/>
+ <method name="resetDownloadKnowledge(Landroid/telephony/mbms/DownloadRequest;)V"/>
+ <method name="setTempFileRootDirectory(Ljava/io/File;)V"/>
+ <method name="unregisterStateCallback(Landroid/telephony/mbms/DownloadRequest;Landroid/telephony/mbms/DownloadStateCallback;)V"/>
+ <field name="DEFAULT_TOP_LEVEL_TEMP_DIRECTORY"/>
+ <field name="EXTRA_MBMS_COMPLETED_FILE_URI"/>
+ <field name="EXTRA_MBMS_DOWNLOAD_REQUEST"/>
+ <field name="EXTRA_MBMS_DOWNLOAD_RESULT"/>
+ <field name="EXTRA_MBMS_FILE_INFO"/>
+ <field name="RESULT_CANCELLED"/>
+ <field name="RESULT_DOWNLOAD_FAILURE"/>
+ <field name="RESULT_EXPIRED"/>
+ <field name="RESULT_FILE_ROOT_UNREACHABLE"/>
+ <field name="RESULT_IO_ERROR"/>
+ <field name="RESULT_OUT_OF_STORAGE"/>
+ <field name="RESULT_SERVICE_ID_NOT_DEFINED"/>
+ <field name="RESULT_SUCCESSFUL"/>
+ <field name="STATUS_ACTIVELY_DOWNLOADING"/>
+ <field name="STATUS_PENDING_DOWNLOAD"/>
+ <field name="STATUS_PENDING_DOWNLOAD_WINDOW"/>
+ <field name="STATUS_PENDING_REPAIR"/>
+ <field name="STATUS_UNKNOWN"/>
+ </class>
+ <class name="android/telephony/MbmsStreamingSession" since="27">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable"/>
+ <method name="&lt;init>()V"/>
+ <method name="create(Landroid/content/Context;Landroid/telephony/mbms/MbmsStreamingSessionCallback;ILandroid/os/Handler;)Landroid/telephony/MbmsStreamingSession;"/>
+ <method name="create(Landroid/content/Context;Landroid/telephony/mbms/MbmsStreamingSessionCallback;Landroid/os/Handler;)Landroid/telephony/MbmsStreamingSession;"/>
+ <method name="requestUpdateStreamingServices(Ljava/util/List;)V"/>
+ <method name="startStreaming(Landroid/telephony/mbms/StreamingServiceInfo;Landroid/telephony/mbms/StreamingServiceCallback;Landroid/os/Handler;)Landroid/telephony/mbms/StreamingService;"/>
+ </class>
+ <class name="android/telephony/NeighboringCellInfo" since="3">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V" deprecated="16"/>
+ <method name="&lt;init>(II)V" deprecated="16"/>
+ <method name="&lt;init>(ILjava/lang/String;I)V" since="7"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="getCid()I"/>
+ <method name="getLac()I" since="5"/>
+ <method name="getNetworkType()I" since="5"/>
+ <method name="getPsc()I" since="5"/>
+ <method name="getRssi()I"/>
+ <method name="setCid(I)V" deprecated="16"/>
+ <method name="setRssi(I)V" deprecated="16"/>
+ <field name="CREATOR"/>
+ <field name="UNKNOWN_CID"/>
+ <field name="UNKNOWN_RSSI"/>
+ </class>
+ <class name="android/telephony/PhoneNumberFormattingTextWatcher" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/TextWatcher"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V" since="21"/>
+ </class>
+ <class name="android/telephony/PhoneNumberUtils" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addTtsSpan(Landroid/text/Spannable;II)V" since="23"/>
+ <method name="calledPartyBCDFragmentToString([BII)Ljava/lang/String;" deprecated="27"/>
+ <method name="calledPartyBCDFragmentToString([BIII)Ljava/lang/String;" since="27"/>
+ <method name="calledPartyBCDToString([BII)Ljava/lang/String;" deprecated="27"/>
+ <method name="calledPartyBCDToString([BIII)Ljava/lang/String;" since="27"/>
+ <method name="compare(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)Z" since="5"/>
+ <method name="compare(Ljava/lang/String;Ljava/lang/String;)Z"/>
+ <method name="convertKeypadLettersToDigits(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="createTtsSpan(Ljava/lang/String;)Landroid/text/style/TtsSpan;" since="23"/>
+ <method name="createTtsSpannable(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;" since="23"/>
+ <method name="extractNetworkPortion(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="extractPostDialPortion(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="formatJapaneseNumber(Landroid/text/Editable;)V" since="3" deprecated="21"/>
+ <method name="formatNanpNumber(Landroid/text/Editable;)V" deprecated="21"/>
+ <method name="formatNumber(Landroid/text/Editable;I)V" deprecated="21"/>
+ <method name="formatNumber(Ljava/lang/String;)Ljava/lang/String;" deprecated="21"/>
+ <method name="formatNumber(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" since="21"/>
+ <method name="formatNumber(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" since="21"/>
+ <method name="formatNumberToE164(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" since="21"/>
+ <method name="formatNumberToRFC3966(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" since="23"/>
+ <method name="getFormatTypeForLocale(Ljava/util/Locale;)I" deprecated="21"/>
+ <method name="getNumberFromIntent(Landroid/content/Intent;Landroid/content/Context;)Ljava/lang/String;"/>
+ <method name="getStrippedReversed(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="is12Key(C)Z"/>
+ <method name="isDialable(C)Z"/>
+ <method name="isEmergencyNumber(Ljava/lang/String;)Z"/>
+ <method name="isGlobalPhoneNumber(Ljava/lang/String;)Z"/>
+ <method name="isISODigit(C)Z"/>
+ <method name="isLocalEmergencyNumber(Landroid/content/Context;Ljava/lang/String;)Z" since="21"/>
+ <method name="isNonSeparator(C)Z"/>
+ <method name="isReallyDialable(C)Z"/>
+ <method name="isStartsPostDial(C)Z"/>
+ <method name="isVoiceMailNumber(Ljava/lang/String;)Z" since="21"/>
+ <method name="isWellFormedSmsAddress(Ljava/lang/String;)Z"/>
+ <method name="networkPortionToCalledPartyBCD(Ljava/lang/String;)[B"/>
+ <method name="networkPortionToCalledPartyBCDWithLength(Ljava/lang/String;)[B"/>
+ <method name="normalizeNumber(Ljava/lang/String;)Ljava/lang/String;" since="21"/>
+ <method name="numberToCalledPartyBCD(Ljava/lang/String;)[B" deprecated="27"/>
+ <method name="numberToCalledPartyBCD(Ljava/lang/String;I)[B" since="27"/>
+ <method name="replaceUnicodeDigits(Ljava/lang/String;)Ljava/lang/String;" since="21"/>
+ <method name="stringFromStringAndTOA(Ljava/lang/String;I)Ljava/lang/String;"/>
+ <method name="stripSeparators(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="toCallerIDMinMatch(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="toaFromString(Ljava/lang/String;)I"/>
+ <field name="BCD_EXTENDED_TYPE_CALLED_PARTY" since="27"/>
+ <field name="BCD_EXTENDED_TYPE_EF_ADN" since="27"/>
+ <field name="FORMAT_JAPAN" since="3"/>
+ <field name="FORMAT_NANP"/>
+ <field name="FORMAT_UNKNOWN"/>
+ <field name="PAUSE"/>
+ <field name="TOA_International"/>
+ <field name="TOA_Unknown"/>
+ <field name="WAIT"/>
+ <field name="WILD"/>
+ </class>
+ <class name="android/telephony/PhoneStateListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onCallForwardingIndicatorChanged(Z)V"/>
+ <method name="onCallStateChanged(ILjava/lang/String;)V"/>
+ <method name="onCellInfoChanged(Ljava/util/List;)V" since="17"/>
+ <method name="onCellLocationChanged(Landroid/telephony/CellLocation;)V"/>
+ <method name="onDataActivity(I)V"/>
+ <method name="onDataConnectionStateChanged(I)V"/>
+ <method name="onDataConnectionStateChanged(II)V" since="7"/>
+ <method name="onMessageWaitingIndicatorChanged(Z)V"/>
+ <method name="onServiceStateChanged(Landroid/telephony/ServiceState;)V"/>
+ <method name="onSignalStrengthChanged(I)V" deprecated="16"/>
+ <method name="onSignalStrengthsChanged(Landroid/telephony/SignalStrength;)V" since="7"/>
+ <field name="LISTEN_CALL_FORWARDING_INDICATOR"/>
+ <field name="LISTEN_CALL_STATE"/>
+ <field name="LISTEN_CELL_INFO" since="17"/>
+ <field name="LISTEN_CELL_LOCATION"/>
+ <field name="LISTEN_DATA_ACTIVITY"/>
+ <field name="LISTEN_DATA_CONNECTION_STATE"/>
+ <field name="LISTEN_MESSAGE_WAITING_INDICATOR"/>
+ <field name="LISTEN_NONE"/>
+ <field name="LISTEN_SERVICE_STATE"/>
+ <field name="LISTEN_SIGNAL_STRENGTH" deprecated="16"/>
+ <field name="LISTEN_SIGNAL_STRENGTHS" since="7"/>
+ </class>
+ <class name="android/telephony/ServiceState" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="&lt;init>(Landroid/telephony/ServiceState;)V"/>
+ <method name="copyFrom(Landroid/telephony/ServiceState;)V"/>
+ <method name="getIsManualSelection()Z"/>
+ <method name="getOperatorAlphaLong()Ljava/lang/String;"/>
+ <method name="getOperatorAlphaShort()Ljava/lang/String;"/>
+ <method name="getOperatorNumeric()Ljava/lang/String;"/>
+ <method name="getRoaming()Z"/>
+ <method name="getState()I"/>
+ <method name="setIsManualSelection(Z)V"/>
+ <method name="setOperatorName(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="setRoaming(Z)V"/>
+ <method name="setState(I)V"/>
+ <method name="setStateOff()V"/>
+ <method name="setStateOutOfService()V"/>
+ <field name="CREATOR"/>
+ <field name="STATE_EMERGENCY_ONLY"/>
+ <field name="STATE_IN_SERVICE"/>
+ <field name="STATE_OUT_OF_SERVICE"/>
+ <field name="STATE_POWER_OFF"/>
+ </class>
+ <class name="android/telephony/SignalStrength" since="7">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCdmaDbm()I"/>
+ <method name="getCdmaEcio()I"/>
+ <method name="getEvdoDbm()I"/>
+ <method name="getEvdoEcio()I"/>
+ <method name="getEvdoSnr()I"/>
+ <method name="getGsmBitErrorRate()I"/>
+ <method name="getGsmSignalStrength()I"/>
+ <method name="getLevel()I" since="23"/>
+ <method name="isGsm()Z"/>
+ </class>
+ <class name="android/telephony/SmsManager" since="4">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="createAppSpecificSmsToken(Landroid/app/PendingIntent;)Ljava/lang/String;" since="26"/>
+ <method name="divideMessage(Ljava/lang/String;)Ljava/util/ArrayList;"/>
+ <method name="downloadMultimediaMessage(Landroid/content/Context;Ljava/lang/String;Landroid/net/Uri;Landroid/os/Bundle;Landroid/app/PendingIntent;)V" since="21"/>
+ <method name="getCarrierConfigValues()Landroid/os/Bundle;" since="21"/>
+ <method name="getDefault()Landroid/telephony/SmsManager;"/>
+ <method name="getDefaultSmsSubscriptionId()I" since="22"/>
+ <method name="getSmsManagerForSubscriptionId(I)Landroid/telephony/SmsManager;" since="22"/>
+ <method name="getSubscriptionId()I" since="22"/>
+ <method name="injectSmsPdu([BLjava/lang/String;Landroid/app/PendingIntent;)V" since="22"/>
+ <method name="sendDataMessage(Ljava/lang/String;Ljava/lang/String;S[BLandroid/app/PendingIntent;Landroid/app/PendingIntent;)V"/>
+ <method name="sendMultimediaMessage(Landroid/content/Context;Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;Landroid/app/PendingIntent;)V" since="21"/>
+ <method name="sendMultipartTextMessage(Ljava/lang/String;Ljava/lang/String;Ljava/util/ArrayList;Ljava/util/ArrayList;Ljava/util/ArrayList;)V"/>
+ <method name="sendTextMessage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/app/PendingIntent;Landroid/app/PendingIntent;)V"/>
+ <field name="EXTRA_MMS_DATA" since="21"/>
+ <field name="EXTRA_MMS_HTTP_STATUS" since="22"/>
+ <field name="MMS_CONFIG_ALIAS_ENABLED" since="21"/>
+ <field name="MMS_CONFIG_ALIAS_MAX_CHARS" since="21"/>
+ <field name="MMS_CONFIG_ALIAS_MIN_CHARS" since="21"/>
+ <field name="MMS_CONFIG_ALLOW_ATTACH_AUDIO" since="21"/>
+ <field name="MMS_CONFIG_APPEND_TRANSACTION_ID" since="21"/>
+ <field name="MMS_CONFIG_EMAIL_GATEWAY_NUMBER" since="21"/>
+ <field name="MMS_CONFIG_GROUP_MMS_ENABLED" since="21"/>
+ <field name="MMS_CONFIG_HTTP_PARAMS" since="21"/>
+ <field name="MMS_CONFIG_HTTP_SOCKET_TIMEOUT" since="21"/>
+ <field name="MMS_CONFIG_MAX_IMAGE_HEIGHT" since="21"/>
+ <field name="MMS_CONFIG_MAX_IMAGE_WIDTH" since="21"/>
+ <field name="MMS_CONFIG_MAX_MESSAGE_SIZE" since="21"/>
+ <field name="MMS_CONFIG_MESSAGE_TEXT_MAX_SIZE" since="21"/>
+ <field name="MMS_CONFIG_MMS_DELIVERY_REPORT_ENABLED" since="21"/>
+ <field name="MMS_CONFIG_MMS_ENABLED" since="21"/>
+ <field name="MMS_CONFIG_MMS_READ_REPORT_ENABLED" since="21"/>
+ <field name="MMS_CONFIG_MULTIPART_SMS_ENABLED" since="21"/>
+ <field name="MMS_CONFIG_NAI_SUFFIX" since="21"/>
+ <field name="MMS_CONFIG_NOTIFY_WAP_MMSC_ENABLED" since="21"/>
+ <field name="MMS_CONFIG_RECIPIENT_LIMIT" since="21"/>
+ <field name="MMS_CONFIG_SEND_MULTIPART_SMS_AS_SEPARATE_MESSAGES" since="21"/>
+ <field name="MMS_CONFIG_SHOW_CELL_BROADCAST_APP_LINKS" since="22"/>
+ <field name="MMS_CONFIG_SMS_DELIVERY_REPORT_ENABLED" since="21"/>
+ <field name="MMS_CONFIG_SMS_TO_MMS_TEXT_LENGTH_THRESHOLD" since="21"/>
+ <field name="MMS_CONFIG_SMS_TO_MMS_TEXT_THRESHOLD" since="21"/>
+ <field name="MMS_CONFIG_SUBJECT_MAX_LENGTH" since="21"/>
+ <field name="MMS_CONFIG_SUPPORT_HTTP_CHARSET_HEADER" since="23"/>
+ <field name="MMS_CONFIG_SUPPORT_MMS_CONTENT_DISPOSITION" since="21"/>
+ <field name="MMS_CONFIG_UA_PROF_TAG_NAME" since="21"/>
+ <field name="MMS_CONFIG_UA_PROF_URL" since="21"/>
+ <field name="MMS_CONFIG_USER_AGENT" since="21"/>
+ <field name="MMS_ERROR_CONFIGURATION_ERROR" since="21"/>
+ <field name="MMS_ERROR_HTTP_FAILURE" since="21"/>
+ <field name="MMS_ERROR_INVALID_APN" since="21"/>
+ <field name="MMS_ERROR_IO_ERROR" since="21"/>
+ <field name="MMS_ERROR_NO_DATA_NETWORK" since="22"/>
+ <field name="MMS_ERROR_RETRY" since="21"/>
+ <field name="MMS_ERROR_UNABLE_CONNECT_MMS" since="21"/>
+ <field name="MMS_ERROR_UNSPECIFIED" since="21"/>
+ <field name="RESULT_ERROR_GENERIC_FAILURE"/>
+ <field name="RESULT_ERROR_LIMIT_EXCEEDED" since="27"/>
+ <field name="RESULT_ERROR_NO_SERVICE"/>
+ <field name="RESULT_ERROR_NULL_PDU"/>
+ <field name="RESULT_ERROR_RADIO_OFF"/>
+ <field name="RESULT_ERROR_SHORT_CODE_NEVER_ALLOWED" since="27"/>
+ <field name="RESULT_ERROR_SHORT_CODE_NOT_ALLOWED" since="27"/>
+ <field name="STATUS_ON_ICC_FREE"/>
+ <field name="STATUS_ON_ICC_READ"/>
+ <field name="STATUS_ON_ICC_SENT"/>
+ <field name="STATUS_ON_ICC_UNREAD"/>
+ <field name="STATUS_ON_ICC_UNSENT"/>
+ </class>
+ <class name="android/telephony/SmsMessage" since="4">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="calculateLength(Ljava/lang/CharSequence;Z)[I"/>
+ <method name="calculateLength(Ljava/lang/String;Z)[I"/>
+ <method name="createFromPdu([B)Landroid/telephony/SmsMessage;" deprecated="23"/>
+ <method name="createFromPdu([BLjava/lang/String;)Landroid/telephony/SmsMessage;" since="23"/>
+ <method name="getDisplayMessageBody()Ljava/lang/String;"/>
+ <method name="getDisplayOriginatingAddress()Ljava/lang/String;"/>
+ <method name="getEmailBody()Ljava/lang/String;"/>
+ <method name="getEmailFrom()Ljava/lang/String;"/>
+ <method name="getIndexOnIcc()I"/>
+ <method name="getIndexOnSim()I" deprecated="16"/>
+ <method name="getMessageBody()Ljava/lang/String;"/>
+ <method name="getMessageClass()Landroid/telephony/SmsMessage$MessageClass;"/>
+ <method name="getOriginatingAddress()Ljava/lang/String;"/>
+ <method name="getPdu()[B"/>
+ <method name="getProtocolIdentifier()I"/>
+ <method name="getPseudoSubject()Ljava/lang/String;"/>
+ <method name="getServiceCenterAddress()Ljava/lang/String;"/>
+ <method name="getStatus()I"/>
+ <method name="getStatusOnIcc()I"/>
+ <method name="getStatusOnSim()I" deprecated="16"/>
+ <method name="getSubmitPdu(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)Landroid/telephony/SmsMessage$SubmitPdu;"/>
+ <method name="getSubmitPdu(Ljava/lang/String;Ljava/lang/String;S[BZ)Landroid/telephony/SmsMessage$SubmitPdu;"/>
+ <method name="getTPLayerLengthForPDU(Ljava/lang/String;)I"/>
+ <method name="getTimestampMillis()J"/>
+ <method name="getUserData()[B"/>
+ <method name="isCphsMwiMessage()Z"/>
+ <method name="isEmail()Z"/>
+ <method name="isMWIClearMessage()Z"/>
+ <method name="isMWISetMessage()Z"/>
+ <method name="isMwiDontStore()Z"/>
+ <method name="isReplace()Z"/>
+ <method name="isReplyPathPresent()Z"/>
+ <method name="isStatusReportMessage()Z"/>
+ <field name="ENCODING_16BIT"/>
+ <field name="ENCODING_7BIT"/>
+ <field name="ENCODING_8BIT"/>
+ <field name="ENCODING_UNKNOWN"/>
+ <field name="MAX_USER_DATA_BYTES"/>
+ <field name="MAX_USER_DATA_BYTES_WITH_HEADER"/>
+ <field name="MAX_USER_DATA_SEPTETS"/>
+ <field name="MAX_USER_DATA_SEPTETS_WITH_HEADER"/>
+ </class>
+ <class name="android/telephony/SmsMessage$MessageClass" since="4">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/telephony/SmsMessage$MessageClass;"/>
+ <method name="values()[Landroid/telephony/SmsMessage$MessageClass;"/>
+ <field name="CLASS_0"/>
+ <field name="CLASS_1"/>
+ <field name="CLASS_2"/>
+ <field name="CLASS_3"/>
+ <field name="UNKNOWN"/>
+ </class>
+ <class name="android/telephony/SmsMessage$SubmitPdu" since="4">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="encodedMessage"/>
+ <field name="encodedScAddress"/>
+ </class>
+ <class name="android/telephony/SubscriptionInfo" since="22">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="createIconBitmap(Landroid/content/Context;)Landroid/graphics/Bitmap;"/>
+ <method name="getCarrierName()Ljava/lang/CharSequence;"/>
+ <method name="getCountryIso()Ljava/lang/String;"/>
+ <method name="getDataRoaming()I"/>
+ <method name="getDisplayName()Ljava/lang/CharSequence;"/>
+ <method name="getIccId()Ljava/lang/String;"/>
+ <method name="getIconTint()I"/>
+ <method name="getMcc()I"/>
+ <method name="getMnc()I"/>
+ <method name="getNumber()Ljava/lang/String;"/>
+ <method name="getSimSlotIndex()I"/>
+ <method name="getSubscriptionId()I"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/telephony/SubscriptionManager" since="22">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addOnSubscriptionsChangedListener(Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;)V"/>
+ <method name="from(Landroid/content/Context;)Landroid/telephony/SubscriptionManager;"/>
+ <method name="getActiveSubscriptionInfo(I)Landroid/telephony/SubscriptionInfo;"/>
+ <method name="getActiveSubscriptionInfoCount()I"/>
+ <method name="getActiveSubscriptionInfoCountMax()I"/>
+ <method name="getActiveSubscriptionInfoForSimSlotIndex(I)Landroid/telephony/SubscriptionInfo;"/>
+ <method name="getActiveSubscriptionInfoList()Ljava/util/List;"/>
+ <method name="getDefaultDataSubscriptionId()I" since="24"/>
+ <method name="getDefaultSmsSubscriptionId()I" since="24"/>
+ <method name="getDefaultSubscriptionId()I" since="24"/>
+ <method name="getDefaultVoiceSubscriptionId()I" since="24"/>
+ <method name="isNetworkRoaming(I)Z"/>
+ <method name="removeOnSubscriptionsChangedListener(Landroid/telephony/SubscriptionManager$OnSubscriptionsChangedListener;)V"/>
+ <field name="ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED" since="26"/>
+ <field name="ACTION_DEFAULT_SUBSCRIPTION_CHANGED" since="26"/>
+ <field name="DATA_ROAMING_DISABLE"/>
+ <field name="DATA_ROAMING_ENABLE"/>
+ <field name="EXTRA_SUBSCRIPTION_INDEX" since="26"/>
+ <field name="INVALID_SUBSCRIPTION_ID" since="24"/>
+ </class>
+ <class name="android/telephony/SubscriptionManager$OnSubscriptionsChangedListener" since="22">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onSubscriptionsChanged()V"/>
+ </class>
+ <class name="android/telephony/TelephonyManager" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="canChangeDtmfToneLength()Z" since="23"/>
+ <method name="createForPhoneAccountHandle(Landroid/telecom/PhoneAccountHandle;)Landroid/telephony/TelephonyManager;" since="26"/>
+ <method name="createForSubscriptionId(I)Landroid/telephony/TelephonyManager;" since="24"/>
+ <method name="getAllCellInfo()Ljava/util/List;" since="17"/>
+ <method name="getCallState()I"/>
+ <method name="getCarrierConfig()Landroid/os/PersistableBundle;" since="26"/>
+ <method name="getCellLocation()Landroid/telephony/CellLocation;" deprecated="26"/>
+ <method name="getDataActivity()I"/>
+ <method name="getDataNetworkType()I" since="24"/>
+ <method name="getDataState()I"/>
+ <method name="getDeviceId()Ljava/lang/String;" deprecated="26"/>
+ <method name="getDeviceId(I)Ljava/lang/String;" since="23" deprecated="26"/>
+ <method name="getDeviceSoftwareVersion()Ljava/lang/String;"/>
+ <method name="getForbiddenPlmns()[Ljava/lang/String;" since="26"/>
+ <method name="getGroupIdLevel1()Ljava/lang/String;" since="18"/>
+ <method name="getIccAuthentication(IILjava/lang/String;)Ljava/lang/String;" since="24"/>
+ <method name="getImei()Ljava/lang/String;" since="26"/>
+ <method name="getImei(I)Ljava/lang/String;" since="26"/>
+ <method name="getLine1Number()Ljava/lang/String;"/>
+ <method name="getMeid()Ljava/lang/String;" since="26"/>
+ <method name="getMeid(I)Ljava/lang/String;" since="26"/>
+ <method name="getMmsUAProfUrl()Ljava/lang/String;" since="19"/>
+ <method name="getMmsUserAgent()Ljava/lang/String;" since="19"/>
+ <method name="getNeighboringCellInfo()Ljava/util/List;" since="3" deprecated="23"/>
+ <method name="getNetworkCountryIso()Ljava/lang/String;"/>
+ <method name="getNetworkOperator()Ljava/lang/String;"/>
+ <method name="getNetworkOperatorName()Ljava/lang/String;"/>
+ <method name="getNetworkSpecifier()Ljava/lang/String;" since="26"/>
+ <method name="getNetworkType()I"/>
+ <method name="getPhoneCount()I" since="23"/>
+ <method name="getPhoneType()I"/>
+ <method name="getServiceState()Landroid/telephony/ServiceState;" since="26"/>
+ <method name="getSignalStrength()Landroid/telephony/SignalStrength;" since="27"/>
+ <method name="getSimCountryIso()Ljava/lang/String;"/>
+ <method name="getSimOperator()Ljava/lang/String;"/>
+ <method name="getSimOperatorName()Ljava/lang/String;"/>
+ <method name="getSimSerialNumber()Ljava/lang/String;"/>
+ <method name="getSimState()I"/>
+ <method name="getSimState(I)I" since="26"/>
+ <method name="getSubscriberId()Ljava/lang/String;"/>
+ <method name="getVisualVoicemailPackageName()Ljava/lang/String;" since="26"/>
+ <method name="getVoiceMailAlphaTag()Ljava/lang/String;"/>
+ <method name="getVoiceMailNumber()Ljava/lang/String;"/>
+ <method name="getVoiceNetworkType()I" since="24"/>
+ <method name="getVoicemailRingtoneUri(Landroid/telecom/PhoneAccountHandle;)Landroid/net/Uri;" since="24"/>
+ <method name="hasCarrierPrivileges()Z" since="22"/>
+ <method name="hasIccCard()Z" since="5"/>
+ <method name="iccCloseLogicalChannel(I)Z" since="21"/>
+ <method name="iccExchangeSimIO(IIIIILjava/lang/String;)[B" since="21"/>
+ <method name="iccOpenLogicalChannel(Ljava/lang/String;)Landroid/telephony/IccOpenLogicalChannelResponse;" since="21" deprecated="26"/>
+ <method name="iccOpenLogicalChannel(Ljava/lang/String;I)Landroid/telephony/IccOpenLogicalChannelResponse;" since="26"/>
+ <method name="iccTransmitApduBasicChannel(IIIIILjava/lang/String;)Ljava/lang/String;" since="21"/>
+ <method name="iccTransmitApduLogicalChannel(IIIIIILjava/lang/String;)Ljava/lang/String;" since="21"/>
+ <method name="isConcurrentVoiceAndDataSupported()Z" since="26"/>
+ <method name="isDataEnabled()Z" since="26"/>
+ <method name="isHearingAidCompatibilitySupported()Z" since="23"/>
+ <method name="isNetworkRoaming()Z"/>
+ <method name="isSmsCapable()Z" since="21"/>
+ <method name="isTtyModeSupported()Z" since="23" deprecated="27"/>
+ <method name="isVoiceCapable()Z" since="22"/>
+ <method name="isVoicemailVibrationEnabled(Landroid/telecom/PhoneAccountHandle;)Z" since="24"/>
+ <method name="isWorldPhone()Z" since="23"/>
+ <method name="listen(Landroid/telephony/PhoneStateListener;I)V"/>
+ <method name="sendDialerSpecialCode(Ljava/lang/String;)V" since="26"/>
+ <method name="sendEnvelopeWithStatus(Ljava/lang/String;)Ljava/lang/String;" since="21"/>
+ <method name="sendUssdRequest(Ljava/lang/String;Landroid/telephony/TelephonyManager$UssdResponseCallback;Landroid/os/Handler;)V" since="26"/>
+ <method name="sendVisualVoicemailSms(Ljava/lang/String;ILjava/lang/String;Landroid/app/PendingIntent;)V" since="26"/>
+ <method name="setDataEnabled(Z)V" since="26"/>
+ <method name="setLine1NumberForDisplay(Ljava/lang/String;Ljava/lang/String;)Z" since="22"/>
+ <method name="setOperatorBrandOverride(Ljava/lang/String;)Z" since="22"/>
+ <method name="setPreferredNetworkTypeToGlobal()Z" since="22"/>
+ <method name="setVisualVoicemailSmsFilterSettings(Landroid/telephony/VisualVoicemailSmsFilterSettings;)V" since="26"/>
+ <method name="setVoiceMailNumber(Ljava/lang/String;Ljava/lang/String;)Z" since="22"/>
+ <method name="setVoicemailRingtoneUri(Landroid/telecom/PhoneAccountHandle;Landroid/net/Uri;)V" since="26"/>
+ <method name="setVoicemailVibrationEnabled(Landroid/telecom/PhoneAccountHandle;Z)V" since="26"/>
+ <field name="ACTION_CONFIGURE_VOICEMAIL" since="23"/>
+ <field name="ACTION_PHONE_STATE_CHANGED" since="3"/>
+ <field name="ACTION_RESPOND_VIA_MESSAGE" since="18"/>
+ <field name="ACTION_SHOW_VOICEMAIL_NOTIFICATION" since="26"/>
+ <field name="APPTYPE_CSIM" since="24"/>
+ <field name="APPTYPE_ISIM" since="24"/>
+ <field name="APPTYPE_RUIM" since="24"/>
+ <field name="APPTYPE_SIM" since="24"/>
+ <field name="APPTYPE_USIM" since="24"/>
+ <field name="AUTHTYPE_EAP_AKA" since="24"/>
+ <field name="AUTHTYPE_EAP_SIM" since="24"/>
+ <field name="CALL_STATE_IDLE"/>
+ <field name="CALL_STATE_OFFHOOK"/>
+ <field name="CALL_STATE_RINGING"/>
+ <field name="DATA_ACTIVITY_DORMANT" since="4"/>
+ <field name="DATA_ACTIVITY_IN"/>
+ <field name="DATA_ACTIVITY_INOUT"/>
+ <field name="DATA_ACTIVITY_NONE"/>
+ <field name="DATA_ACTIVITY_OUT"/>
+ <field name="DATA_CONNECTED"/>
+ <field name="DATA_CONNECTING"/>
+ <field name="DATA_DISCONNECTED"/>
+ <field name="DATA_SUSPENDED"/>
+ <field name="EXTRA_CALL_VOICEMAIL_INTENT" since="26"/>
+ <field name="EXTRA_HIDE_PUBLIC_SETTINGS" since="26"/>
+ <field name="EXTRA_INCOMING_NUMBER" since="3"/>
+ <field name="EXTRA_LAUNCH_VOICEMAIL_SETTINGS_INTENT" since="26"/>
+ <field name="EXTRA_NOTIFICATION_COUNT" since="26"/>
+ <field name="EXTRA_PHONE_ACCOUNT_HANDLE" since="26"/>
+ <field name="EXTRA_STATE" since="3"/>
+ <field name="EXTRA_STATE_IDLE" since="3"/>
+ <field name="EXTRA_STATE_OFFHOOK" since="3"/>
+ <field name="EXTRA_STATE_RINGING" since="3"/>
+ <field name="EXTRA_VOICEMAIL_NUMBER" since="26"/>
+ <field name="METADATA_HIDE_VOICEMAIL_SETTINGS_MENU" since="26"/>
+ <field name="NETWORK_TYPE_1xRTT" since="4"/>
+ <field name="NETWORK_TYPE_CDMA" since="4"/>
+ <field name="NETWORK_TYPE_EDGE"/>
+ <field name="NETWORK_TYPE_EHRPD" since="11"/>
+ <field name="NETWORK_TYPE_EVDO_0" since="4"/>
+ <field name="NETWORK_TYPE_EVDO_A" since="4"/>
+ <field name="NETWORK_TYPE_EVDO_B" since="9"/>
+ <field name="NETWORK_TYPE_GPRS"/>
+ <field name="NETWORK_TYPE_GSM" since="25"/>
+ <field name="NETWORK_TYPE_HSDPA" since="5"/>
+ <field name="NETWORK_TYPE_HSPA" since="5"/>
+ <field name="NETWORK_TYPE_HSPAP" since="13"/>
+ <field name="NETWORK_TYPE_HSUPA" since="5"/>
+ <field name="NETWORK_TYPE_IDEN" since="8"/>
+ <field name="NETWORK_TYPE_IWLAN" since="25"/>
+ <field name="NETWORK_TYPE_LTE" since="11"/>
+ <field name="NETWORK_TYPE_TD_SCDMA" since="25"/>
+ <field name="NETWORK_TYPE_UMTS"/>
+ <field name="NETWORK_TYPE_UNKNOWN"/>
+ <field name="PHONE_TYPE_CDMA" since="4"/>
+ <field name="PHONE_TYPE_GSM"/>
+ <field name="PHONE_TYPE_NONE"/>
+ <field name="PHONE_TYPE_SIP" since="11"/>
+ <field name="SIM_STATE_ABSENT"/>
+ <field name="SIM_STATE_CARD_IO_ERROR" since="26"/>
+ <field name="SIM_STATE_CARD_RESTRICTED" since="26"/>
+ <field name="SIM_STATE_NETWORK_LOCKED"/>
+ <field name="SIM_STATE_NOT_READY" since="26"/>
+ <field name="SIM_STATE_PERM_DISABLED" since="26"/>
+ <field name="SIM_STATE_PIN_REQUIRED"/>
+ <field name="SIM_STATE_PUK_REQUIRED"/>
+ <field name="SIM_STATE_READY"/>
+ <field name="SIM_STATE_UNKNOWN"/>
+ <field name="USSD_ERROR_SERVICE_UNAVAIL" since="26"/>
+ <field name="USSD_RETURN_FAILURE" since="26"/>
+ <field name="VVM_TYPE_CVVM" since="23"/>
+ <field name="VVM_TYPE_OMTP" since="23"/>
+ </class>
+ <class name="android/telephony/TelephonyManager$UssdResponseCallback" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onReceiveUssdResponse(Landroid/telephony/TelephonyManager;Ljava/lang/String;Ljava/lang/CharSequence;)V"/>
+ <method name="onReceiveUssdResponseFailed(Landroid/telephony/TelephonyManager;Ljava/lang/String;I)V"/>
+ </class>
+ <class name="android/telephony/VisualVoicemailService" since="26">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="onCellServiceConnected(Landroid/telephony/VisualVoicemailService$VisualVoicemailTask;Landroid/telecom/PhoneAccountHandle;)V"/>
+ <method name="onSimRemoved(Landroid/telephony/VisualVoicemailService$VisualVoicemailTask;Landroid/telecom/PhoneAccountHandle;)V"/>
+ <method name="onSmsReceived(Landroid/telephony/VisualVoicemailService$VisualVoicemailTask;Landroid/telephony/VisualVoicemailSms;)V"/>
+ <method name="onStopped(Landroid/telephony/VisualVoicemailService$VisualVoicemailTask;)V"/>
+ <field name="SERVICE_INTERFACE"/>
+ </class>
+ <class name="android/telephony/VisualVoicemailService$VisualVoicemailTask" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="finish()V"/>
+ </class>
+ <class name="android/telephony/VisualVoicemailSms" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getFields()Landroid/os/Bundle;"/>
+ <method name="getMessageBody()Ljava/lang/String;"/>
+ <method name="getPhoneAccountHandle()Landroid/telecom/PhoneAccountHandle;"/>
+ <method name="getPrefix()Ljava/lang/String;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/telephony/VisualVoicemailSmsFilterSettings" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <field name="CREATOR"/>
+ <field name="DESTINATION_PORT_ANY"/>
+ <field name="DESTINATION_PORT_DATA_SMS"/>
+ <field name="clientPrefix"/>
+ <field name="destinationPort"/>
+ <field name="originatingNumbers"/>
+ </class>
+ <class name="android/telephony/VisualVoicemailSmsFilterSettings$Builder" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="build()Landroid/telephony/VisualVoicemailSmsFilterSettings;"/>
+ <method name="setClientPrefix(Ljava/lang/String;)Landroid/telephony/VisualVoicemailSmsFilterSettings$Builder;"/>
+ <method name="setDestinationPort(I)Landroid/telephony/VisualVoicemailSmsFilterSettings$Builder;"/>
+ <method name="setOriginatingNumbers(Ljava/util/List;)Landroid/telephony/VisualVoicemailSmsFilterSettings$Builder;"/>
+ </class>
+ <class name="android/telephony/cdma/CdmaCellLocation" since="5">
+ <extends name="android/telephony/CellLocation"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/os/Bundle;)V"/>
+ <method name="convertQuartSecToDecDegrees(I)D" since="17"/>
+ <method name="fillInNotifierBundle(Landroid/os/Bundle;)V"/>
+ <method name="getBaseStationId()I"/>
+ <method name="getBaseStationLatitude()I"/>
+ <method name="getBaseStationLongitude()I"/>
+ <method name="getNetworkId()I"/>
+ <method name="getSystemId()I"/>
+ <method name="setCellLocationData(III)V"/>
+ <method name="setCellLocationData(IIIII)V"/>
+ <method name="setStateInvalid()V"/>
+ </class>
+ <class name="android/telephony/gsm/GsmCellLocation" since="1">
+ <extends name="android/telephony/CellLocation"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/os/Bundle;)V"/>
+ <method name="fillInNotifierBundle(Landroid/os/Bundle;)V"/>
+ <method name="getCid()I"/>
+ <method name="getLac()I"/>
+ <method name="getPsc()I" since="9"/>
+ <method name="setLacAndCid(II)V"/>
+ <method name="setStateInvalid()V"/>
+ </class>
+ <class name="android/telephony/gsm/SmsManager" since="1" deprecated="4">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="divideMessage(Ljava/lang/String;)Ljava/util/ArrayList;" deprecated="16"/>
+ <method name="getDefault()Landroid/telephony/gsm/SmsManager;" deprecated="16"/>
+ <method name="sendDataMessage(Ljava/lang/String;Ljava/lang/String;S[BLandroid/app/PendingIntent;Landroid/app/PendingIntent;)V" deprecated="16"/>
+ <method name="sendMultipartTextMessage(Ljava/lang/String;Ljava/lang/String;Ljava/util/ArrayList;Ljava/util/ArrayList;Ljava/util/ArrayList;)V" deprecated="16"/>
+ <method name="sendTextMessage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/app/PendingIntent;Landroid/app/PendingIntent;)V" deprecated="16"/>
+ <field name="RESULT_ERROR_GENERIC_FAILURE" deprecated="16"/>
+ <field name="RESULT_ERROR_NO_SERVICE" deprecated="16"/>
+ <field name="RESULT_ERROR_NULL_PDU" deprecated="16"/>
+ <field name="RESULT_ERROR_RADIO_OFF" deprecated="16"/>
+ <field name="STATUS_ON_SIM_FREE" deprecated="16"/>
+ <field name="STATUS_ON_SIM_READ" deprecated="16"/>
+ <field name="STATUS_ON_SIM_SENT" deprecated="16"/>
+ <field name="STATUS_ON_SIM_UNREAD" deprecated="16"/>
+ <field name="STATUS_ON_SIM_UNSENT" deprecated="16"/>
+ </class>
+ <class name="android/telephony/gsm/SmsMessage" since="1" deprecated="4">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V" deprecated="16"/>
+ <method name="calculateLength(Ljava/lang/CharSequence;Z)[I" since="3" deprecated="16"/>
+ <method name="calculateLength(Ljava/lang/String;Z)[I" deprecated="16"/>
+ <method name="createFromPdu([B)Landroid/telephony/gsm/SmsMessage;" deprecated="16"/>
+ <method name="getDisplayMessageBody()Ljava/lang/String;" deprecated="16"/>
+ <method name="getDisplayOriginatingAddress()Ljava/lang/String;" deprecated="16"/>
+ <method name="getEmailBody()Ljava/lang/String;" deprecated="16"/>
+ <method name="getEmailFrom()Ljava/lang/String;" deprecated="16"/>
+ <method name="getIndexOnSim()I" deprecated="16"/>
+ <method name="getMessageBody()Ljava/lang/String;" deprecated="16"/>
+ <method name="getMessageClass()Landroid/telephony/gsm/SmsMessage$MessageClass;" deprecated="16"/>
+ <method name="getOriginatingAddress()Ljava/lang/String;" deprecated="16"/>
+ <method name="getPdu()[B" deprecated="16"/>
+ <method name="getProtocolIdentifier()I" deprecated="16"/>
+ <method name="getPseudoSubject()Ljava/lang/String;" deprecated="16"/>
+ <method name="getServiceCenterAddress()Ljava/lang/String;" deprecated="16"/>
+ <method name="getStatus()I" deprecated="16"/>
+ <method name="getStatusOnSim()I" deprecated="16"/>
+ <method name="getSubmitPdu(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)Landroid/telephony/gsm/SmsMessage$SubmitPdu;" deprecated="16"/>
+ <method name="getSubmitPdu(Ljava/lang/String;Ljava/lang/String;S[BZ)Landroid/telephony/gsm/SmsMessage$SubmitPdu;" deprecated="16"/>
+ <method name="getTPLayerLengthForPDU(Ljava/lang/String;)I" deprecated="16"/>
+ <method name="getTimestampMillis()J" deprecated="16"/>
+ <method name="getUserData()[B" deprecated="16"/>
+ <method name="isCphsMwiMessage()Z" deprecated="16"/>
+ <method name="isEmail()Z" deprecated="16"/>
+ <method name="isMWIClearMessage()Z" deprecated="16"/>
+ <method name="isMWISetMessage()Z" deprecated="16"/>
+ <method name="isMwiDontStore()Z" deprecated="16"/>
+ <method name="isReplace()Z" deprecated="16"/>
+ <method name="isReplyPathPresent()Z" deprecated="16"/>
+ <method name="isStatusReportMessage()Z" deprecated="16"/>
+ <field name="ENCODING_16BIT" deprecated="16"/>
+ <field name="ENCODING_7BIT" deprecated="16"/>
+ <field name="ENCODING_8BIT" deprecated="16"/>
+ <field name="ENCODING_UNKNOWN" deprecated="16"/>
+ <field name="MAX_USER_DATA_BYTES" deprecated="16"/>
+ <field name="MAX_USER_DATA_SEPTETS" deprecated="16"/>
+ <field name="MAX_USER_DATA_SEPTETS_WITH_HEADER" deprecated="16"/>
+ </class>
+ <class name="android/telephony/gsm/SmsMessage$MessageClass" since="1" deprecated="4">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/telephony/gsm/SmsMessage$MessageClass;"/>
+ <method name="values()[Landroid/telephony/gsm/SmsMessage$MessageClass;"/>
+ <field name="CLASS_0"/>
+ <field name="CLASS_1"/>
+ <field name="CLASS_2"/>
+ <field name="CLASS_3"/>
+ <field name="UNKNOWN"/>
+ </class>
+ <class name="android/telephony/gsm/SmsMessage$SubmitPdu" since="1" deprecated="4">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V" deprecated="16"/>
+ <field name="encodedMessage" deprecated="16"/>
+ <field name="encodedScAddress" deprecated="16"/>
+ </class>
+ <class name="android/telephony/mbms/DownloadRequest" since="27">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="copy(Landroid/telephony/mbms/DownloadRequest;)Landroid/telephony/mbms/DownloadRequest;"/>
+ <method name="getFileServiceId()Ljava/lang/String;"/>
+ <method name="getMaxAppIntentSize()I"/>
+ <method name="getMaxDestinationUriSize()I"/>
+ <method name="getSourceUri()Landroid/net/Uri;"/>
+ <method name="getSubscriptionId()I"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/telephony/mbms/DownloadRequest$Builder" since="27">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/net/Uri;)V"/>
+ <method name="build()Landroid/telephony/mbms/DownloadRequest;"/>
+ <method name="setAppIntent(Landroid/content/Intent;)Landroid/telephony/mbms/DownloadRequest$Builder;"/>
+ <method name="setServiceInfo(Landroid/telephony/mbms/FileServiceInfo;)Landroid/telephony/mbms/DownloadRequest$Builder;"/>
+ <method name="setSubscriptionId(I)Landroid/telephony/mbms/DownloadRequest$Builder;"/>
+ </class>
+ <class name="android/telephony/mbms/DownloadStateCallback" since="27">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="isFilterFlagSet(I)Z"/>
+ <method name="onProgressUpdated(Landroid/telephony/mbms/DownloadRequest;Landroid/telephony/mbms/FileInfo;IIII)V"/>
+ <method name="onStateUpdated(Landroid/telephony/mbms/DownloadRequest;Landroid/telephony/mbms/FileInfo;I)V"/>
+ <field name="ALL_UPDATES"/>
+ <field name="PROGRESS_UPDATES"/>
+ <field name="STATE_UPDATES"/>
+ </class>
+ <class name="android/telephony/mbms/FileInfo" since="27">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getMimeType()Ljava/lang/String;"/>
+ <method name="getUri()Landroid/net/Uri;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/telephony/mbms/FileServiceInfo" since="27">
+ <extends name="android/telephony/mbms/ServiceInfo"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getFiles()Ljava/util/List;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/telephony/mbms/MbmsDownloadReceiver" since="27">
+ <extends name="android/content/BroadcastReceiver"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/telephony/mbms/MbmsDownloadSessionCallback" since="27">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onError(ILjava/lang/String;)V"/>
+ <method name="onFileServicesUpdated(Ljava/util/List;)V"/>
+ <method name="onMiddlewareReady()V"/>
+ </class>
+ <class name="android/telephony/mbms/MbmsErrors" since="27">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="ERROR_MIDDLEWARE_LOST"/>
+ <field name="ERROR_MIDDLEWARE_NOT_BOUND"/>
+ <field name="ERROR_NO_UNIQUE_MIDDLEWARE"/>
+ <field name="SUCCESS"/>
+ </class>
+ <class name="android/telephony/mbms/MbmsErrors$DownloadErrors" since="27">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT"/>
+ <field name="ERROR_UNKNOWN_DOWNLOAD_REQUEST"/>
+ </class>
+ <class name="android/telephony/mbms/MbmsErrors$GeneralErrors" since="27">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="ERROR_CARRIER_CHANGE_NOT_ALLOWED"/>
+ <field name="ERROR_IN_E911"/>
+ <field name="ERROR_MIDDLEWARE_NOT_YET_READY"/>
+ <field name="ERROR_MIDDLEWARE_TEMPORARILY_UNAVAILABLE"/>
+ <field name="ERROR_NOT_CONNECTED_TO_HOME_CARRIER_LTE"/>
+ <field name="ERROR_OUT_OF_MEMORY"/>
+ <field name="ERROR_UNABLE_TO_READ_SIM"/>
+ </class>
+ <class name="android/telephony/mbms/MbmsErrors$InitializationErrors" since="27">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="ERROR_APP_PERMISSIONS_NOT_GRANTED"/>
+ <field name="ERROR_DUPLICATE_INITIALIZE"/>
+ <field name="ERROR_UNABLE_TO_INITIALIZE"/>
+ </class>
+ <class name="android/telephony/mbms/MbmsErrors$StreamingErrors" since="27">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="ERROR_CONCURRENT_SERVICE_LIMIT_REACHED"/>
+ <field name="ERROR_DUPLICATE_START_STREAM"/>
+ <field name="ERROR_UNABLE_TO_START_SERVICE"/>
+ </class>
+ <class name="android/telephony/mbms/MbmsStreamingSessionCallback" since="27">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onError(ILjava/lang/String;)V"/>
+ <method name="onMiddlewareReady()V"/>
+ <method name="onStreamingServicesUpdated(Ljava/util/List;)V"/>
+ </class>
+ <class name="android/telephony/mbms/ServiceInfo" since="27">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getLocales()Ljava/util/List;"/>
+ <method name="getNameForLocale(Ljava/util/Locale;)Ljava/lang/CharSequence;"/>
+ <method name="getNamedContentLocales()Ljava/util/Set;"/>
+ <method name="getServiceClassName()Ljava/lang/String;"/>
+ <method name="getServiceId()Ljava/lang/String;"/>
+ <method name="getSessionEndTime()Ljava/util/Date;"/>
+ <method name="getSessionStartTime()Ljava/util/Date;"/>
+ </class>
+ <class name="android/telephony/mbms/StreamingService" since="27">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getInfo()Landroid/telephony/mbms/StreamingServiceInfo;"/>
+ <method name="getPlaybackUri()Landroid/net/Uri;"/>
+ <method name="stopStreaming()V"/>
+ <field name="BROADCAST_METHOD"/>
+ <field name="REASON_BY_USER_REQUEST"/>
+ <field name="REASON_END_OF_SESSION"/>
+ <field name="REASON_FREQUENCY_CONFLICT"/>
+ <field name="REASON_LEFT_MBMS_BROADCAST_AREA"/>
+ <field name="REASON_NONE"/>
+ <field name="REASON_NOT_CONNECTED_TO_HOMECARRIER_LTE"/>
+ <field name="REASON_OUT_OF_MEMORY"/>
+ <field name="STATE_STALLED"/>
+ <field name="STATE_STARTED"/>
+ <field name="STATE_STOPPED"/>
+ <field name="UNICAST_METHOD"/>
+ </class>
+ <class name="android/telephony/mbms/StreamingServiceCallback" since="27">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onBroadcastSignalStrengthUpdated(I)V"/>
+ <method name="onError(ILjava/lang/String;)V"/>
+ <method name="onMediaDescriptionUpdated()V"/>
+ <method name="onStreamMethodUpdated(I)V"/>
+ <method name="onStreamStateUpdated(II)V"/>
+ <field name="SIGNAL_STRENGTH_UNAVAILABLE"/>
+ </class>
+ <class name="android/telephony/mbms/StreamingServiceInfo" since="27">
+ <extends name="android/telephony/mbms/ServiceInfo"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/test/ActivityInstrumentationTestCase" since="1" deprecated="3">
+ <extends name="android/test/ActivityTestCase"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Class;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Class;Z)V"/>
+ <method name="testActivityTestCaseSetUpProperly()V"/>
+ </class>
+ <class name="android/test/ActivityInstrumentationTestCase2" since="3" deprecated="24">
+ <extends name="android/test/ActivityTestCase"/>
+ <method name="&lt;init>(Ljava/lang/Class;)V" since="8"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Class;)V" deprecated="16"/>
+ <method name="setActivityInitialTouchMode(Z)V"/>
+ <method name="setActivityIntent(Landroid/content/Intent;)V"/>
+ </class>
+ <class name="android/test/ActivityTestCase" since="1" deprecated="24">
+ <extends name="android/test/InstrumentationTestCase"/>
+ <method name="&lt;init>()V"/>
+ <method name="getActivity()Landroid/app/Activity;"/>
+ <method name="scrubClass(Ljava/lang/Class;)V"/>
+ <method name="setActivity(Landroid/app/Activity;)V"/>
+ </class>
+ <class name="android/test/ActivityUnitTestCase" since="1" deprecated="24">
+ <extends name="android/test/ActivityTestCase"/>
+ <method name="&lt;init>(Ljava/lang/Class;)V"/>
+ <method name="getFinishedActivityRequest()I"/>
+ <method name="getRequestedOrientation()I"/>
+ <method name="getStartedActivityIntent()Landroid/content/Intent;"/>
+ <method name="getStartedActivityRequest()I"/>
+ <method name="isFinishCalled()Z"/>
+ <method name="setActivityContext(Landroid/content/Context;)V"/>
+ <method name="setApplication(Landroid/app/Application;)V"/>
+ <method name="startActivity(Landroid/content/Intent;Landroid/os/Bundle;Ljava/lang/Object;)Landroid/app/Activity;"/>
+ </class>
+ <class name="android/test/AndroidTestCase" since="1" deprecated="24">
+ <extends name="junit/framework/TestCase"/>
+ <method name="&lt;init>()V"/>
+ <method name="assertActivityRequiresPermission(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" since="4"/>
+ <method name="assertReadingContentUriRequiresPermission(Landroid/net/Uri;Ljava/lang/String;)V" since="4"/>
+ <method name="assertWritingContentUriRequiresPermission(Landroid/net/Uri;Ljava/lang/String;)V" since="4"/>
+ <method name="getContext()Landroid/content/Context;"/>
+ <method name="scrubClass(Ljava/lang/Class;)V"/>
+ <method name="setContext(Landroid/content/Context;)V"/>
+ <method name="testAndroidTestCaseSetupProperly()V"/>
+ <field name="mContext"/>
+ </class>
+ <class name="android/test/AndroidTestRunner" since="1" deprecated="24">
+ <extends name="junit/runner/BaseTestRunner"/>
+ <method name="&lt;init>()V"/>
+ <method name="addTestListener(Ljunit/framework/TestListener;)V"/>
+ <method name="clearTestListeners()V"/>
+ <method name="createTestResult()Ljunit/framework/TestResult;"/>
+ <method name="getTestCases()Ljava/util/List;"/>
+ <method name="getTestClassName()Ljava/lang/String;"/>
+ <method name="getTestResult()Ljunit/framework/TestResult;"/>
+ <method name="runTest()V"/>
+ <method name="runTest(Ljunit/framework/TestResult;)V"/>
+ <method name="setContext(Landroid/content/Context;)V"/>
+ <method name="setInstrumentaiton(Landroid/app/Instrumentation;)V" deprecated="16"/>
+ <method name="setInstrumentation(Landroid/app/Instrumentation;)V" since="5"/>
+ <method name="setTest(Ljunit/framework/Test;)V"/>
+ <method name="setTestClassName(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/test/ApplicationTestCase" since="1" deprecated="24">
+ <extends name="android/test/AndroidTestCase"/>
+ <method name="&lt;init>(Ljava/lang/Class;)V"/>
+ <method name="createApplication()V"/>
+ <method name="getApplication()Landroid/app/Application;"/>
+ <method name="getSystemContext()Landroid/content/Context;"/>
+ <method name="terminateApplication()V"/>
+ <method name="testApplicationTestCaseSetUpProperly()V"/>
+ </class>
+ <class name="android/test/AssertionFailedError" since="1" deprecated="16">
+ <extends name="java/lang/Error"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/test/ComparisonFailure" since="1" deprecated="16">
+ <extends name="android/test/AssertionFailedError"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/test/FlakyTest" since="1" deprecated="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ <method name="tolerance()I"/>
+ </class>
+ <class name="android/test/InstrumentationTestCase" since="1" deprecated="24">
+ <extends name="junit/framework/TestCase"/>
+ <method name="&lt;init>()V"/>
+ <method name="getInstrumentation()Landroid/app/Instrumentation;"/>
+ <method name="injectInsrumentation(Landroid/app/Instrumentation;)V" deprecated="16"/>
+ <method name="injectInstrumentation(Landroid/app/Instrumentation;)V" since="5"/>
+ <method name="launchActivity(Ljava/lang/String;Ljava/lang/Class;Landroid/os/Bundle;)Landroid/app/Activity;"/>
+ <method name="launchActivityWithIntent(Ljava/lang/String;Ljava/lang/Class;Landroid/content/Intent;)Landroid/app/Activity;" since="3"/>
+ <method name="runTestOnUiThread(Ljava/lang/Runnable;)V" since="3"/>
+ <method name="sendKeys(Ljava/lang/String;)V"/>
+ <method name="sendKeys([I)V"/>
+ <method name="sendRepeatedKeys([I)V"/>
+ </class>
+ <class name="android/test/InstrumentationTestRunner" since="1" deprecated="24">
+ <extends name="android/app/Instrumentation"/>
+ <implements name="android/test/TestSuiteProvider"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAllTests()Ljunit/framework/TestSuite;"/>
+ <method name="getAndroidTestRunner()Landroid/test/AndroidTestRunner;"/>
+ <method name="getArguments()Landroid/os/Bundle;" since="18"/>
+ <method name="getLoader()Ljava/lang/ClassLoader;"/>
+ <field name="REPORT_KEY_NAME_CLASS"/>
+ <field name="REPORT_KEY_NAME_TEST"/>
+ <field name="REPORT_KEY_NUM_CURRENT"/>
+ <field name="REPORT_KEY_NUM_TOTAL"/>
+ <field name="REPORT_KEY_STACK"/>
+ <field name="REPORT_VALUE_ID"/>
+ <field name="REPORT_VALUE_RESULT_ERROR"/>
+ <field name="REPORT_VALUE_RESULT_FAILURE"/>
+ <field name="REPORT_VALUE_RESULT_OK"/>
+ <field name="REPORT_VALUE_RESULT_START"/>
+ </class>
+ <class name="android/test/InstrumentationTestSuite" since="1" deprecated="24">
+ <extends name="junit/framework/TestSuite"/>
+ <method name="&lt;init>(Landroid/app/Instrumentation;)V"/>
+ <method name="&lt;init>(Ljava/lang/Class;Landroid/app/Instrumentation;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Landroid/app/Instrumentation;)V"/>
+ </class>
+ <class name="android/test/IsolatedContext" since="1" deprecated="24">
+ <extends name="android/content/ContextWrapper"/>
+ <method name="&lt;init>(Landroid/content/ContentResolver;Landroid/content/Context;)V"/>
+ <method name="getAndClearBroadcastIntents()Ljava/util/List;"/>
+ </class>
+ <class name="android/test/LoaderTestCase" since="11">
+ <extends name="android/test/AndroidTestCase"/>
+ <method name="&lt;init>()V"/>
+ <method name="getLoaderResultSynchronously(Landroid/content/Loader;)Ljava/lang/Object;"/>
+ </class>
+ <class name="android/test/MoreAsserts" since="1" deprecated="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="assertAssignableFrom(Ljava/lang/Class;Ljava/lang/Class;)V"/>
+ <method name="assertAssignableFrom(Ljava/lang/Class;Ljava/lang/Object;)V"/>
+ <method name="assertContainsRegex(Ljava/lang/String;Ljava/lang/String;)Ljava/util/regex/MatchResult;"/>
+ <method name="assertContainsRegex(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/util/regex/MatchResult;"/>
+ <method name="assertContentsInAnyOrder(Ljava/lang/Iterable;[Ljava/lang/Object;)V"/>
+ <method name="assertContentsInAnyOrder(Ljava/lang/String;Ljava/lang/Iterable;[Ljava/lang/Object;)V"/>
+ <method name="assertContentsInOrder(Ljava/lang/Iterable;[Ljava/lang/Object;)V"/>
+ <method name="assertContentsInOrder(Ljava/lang/String;Ljava/lang/Iterable;[Ljava/lang/Object;)V"/>
+ <method name="assertEmpty(Ljava/lang/Iterable;)V"/>
+ <method name="assertEmpty(Ljava/lang/String;Ljava/lang/Iterable;)V"/>
+ <method name="assertEmpty(Ljava/lang/String;Ljava/util/Map;)V"/>
+ <method name="assertEmpty(Ljava/util/Map;)V"/>
+ <method name="assertEquals(Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;)V"/>
+ <method name="assertEquals(Ljava/lang/String;[B[B)V"/>
+ <method name="assertEquals(Ljava/lang/String;[D[D)V"/>
+ <method name="assertEquals(Ljava/lang/String;[I[I)V"/>
+ <method name="assertEquals(Ljava/lang/String;[Ljava/lang/Object;[Ljava/lang/Object;)V"/>
+ <method name="assertEquals(Ljava/util/Set;Ljava/util/Set;)V"/>
+ <method name="assertEquals([B[B)V"/>
+ <method name="assertEquals([D[D)V"/>
+ <method name="assertEquals([I[I)V"/>
+ <method name="assertEquals([Ljava/lang/Object;[Ljava/lang/Object;)V"/>
+ <method name="assertMatchesRegex(Ljava/lang/String;Ljava/lang/String;)Ljava/util/regex/MatchResult;"/>
+ <method name="assertMatchesRegex(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/util/regex/MatchResult;"/>
+ <method name="assertNotContainsRegex(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="assertNotContainsRegex(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="assertNotEmpty(Ljava/lang/Iterable;)V"/>
+ <method name="assertNotEmpty(Ljava/lang/String;Ljava/lang/Iterable;)V"/>
+ <method name="assertNotEmpty(Ljava/lang/String;Ljava/util/Map;)V"/>
+ <method name="assertNotEmpty(Ljava/util/Map;)V"/>
+ <method name="assertNotEqual(Ljava/lang/Object;Ljava/lang/Object;)V"/>
+ <method name="assertNotEqual(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V"/>
+ <method name="assertNotMatchesRegex(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="assertNotMatchesRegex(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="checkEqualsAndHashCodeMethods(Ljava/lang/Object;Ljava/lang/Object;Z)V"/>
+ <method name="checkEqualsAndHashCodeMethods(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Z)V"/>
+ </class>
+ <class name="android/test/PerformanceTestCase" since="1" deprecated="24">
+ <extends name="java/lang/Object"/>
+ <method name="isPerformanceOnly()Z"/>
+ <method name="startPerformance(Landroid/test/PerformanceTestCase$Intermediates;)I"/>
+ </class>
+ <class name="android/test/PerformanceTestCase$Intermediates" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="addIntermediate(Ljava/lang/String;)V"/>
+ <method name="addIntermediate(Ljava/lang/String;J)V"/>
+ <method name="finishTiming(Z)V"/>
+ <method name="setInternalIterations(I)V"/>
+ <method name="startTiming(Z)V"/>
+ </class>
+ <class name="android/test/ProviderTestCase" since="1" deprecated="5">
+ <extends name="android/test/InstrumentationTestCase"/>
+ <method name="&lt;init>(Ljava/lang/Class;Ljava/lang/String;)V"/>
+ <method name="getMockContentResolver()Landroid/test/mock/MockContentResolver;"/>
+ <method name="getMockContext()Landroid/test/IsolatedContext;"/>
+ <method name="getProvider()Landroid/content/ContentProvider;"/>
+ <method name="newResolverWithContentProviderFromSql(Landroid/content/Context;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)Landroid/content/ContentResolver;"/>
+ </class>
+ <class name="android/test/ProviderTestCase2" since="3">
+ <extends name="android/test/AndroidTestCase"/>
+ <method name="&lt;init>(Ljava/lang/Class;Ljava/lang/String;)V"/>
+ <method name="getMockContentResolver()Landroid/test/mock/MockContentResolver;"/>
+ <method name="getMockContext()Landroid/test/IsolatedContext;"/>
+ <method name="getProvider()Landroid/content/ContentProvider;"/>
+ <method name="newResolverWithContentProviderFromSql(Landroid/content/Context;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)Landroid/content/ContentResolver;"/>
+ </class>
+ <class name="android/test/RenamingDelegatingContext" since="1" deprecated="24">
+ <extends name="android/content/ContextWrapper"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/content/Context;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Ljava/lang/String;)V"/>
+ <method name="getDatabasePrefix()Ljava/lang/String;"/>
+ <method name="makeExistingFilesAndDbsAccessible()V"/>
+ <method name="providerWithRenamedContext(Ljava/lang/Class;Landroid/content/Context;Ljava/lang/String;)Landroid/content/ContentProvider;"/>
+ <method name="providerWithRenamedContext(Ljava/lang/Class;Landroid/content/Context;Ljava/lang/String;Z)Landroid/content/ContentProvider;"/>
+ </class>
+ <class name="android/test/ServiceTestCase" since="1" deprecated="24">
+ <extends name="android/test/AndroidTestCase"/>
+ <method name="&lt;init>(Ljava/lang/Class;)V"/>
+ <method name="bindService(Landroid/content/Intent;)Landroid/os/IBinder;"/>
+ <method name="getApplication()Landroid/app/Application;"/>
+ <method name="getService()Landroid/app/Service;"/>
+ <method name="getSystemContext()Landroid/content/Context;"/>
+ <method name="setApplication(Landroid/app/Application;)V"/>
+ <method name="setupService()V"/>
+ <method name="shutdownService()V"/>
+ <method name="startService(Landroid/content/Intent;)V"/>
+ <method name="testServiceTestCaseSetUpProperly()V"/>
+ </class>
+ <class name="android/test/SingleLaunchActivityTestCase" since="1" deprecated="24">
+ <extends name="android/test/InstrumentationTestCase"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Class;)V"/>
+ <method name="getActivity()Landroid/app/Activity;"/>
+ <method name="testActivityTestCaseSetUpProperly()V"/>
+ </class>
+ <class name="android/test/SyncBaseInstrumentation" since="1" deprecated="24">
+ <extends name="android/test/InstrumentationTestCase"/>
+ <method name="&lt;init>()V"/>
+ <method name="cancelSyncsandDisableAutoSync()V"/>
+ <method name="syncProvider(Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/test/TestSuiteProvider" since="1" deprecated="24">
+ <extends name="java/lang/Object"/>
+ <method name="getTestSuite()Ljunit/framework/TestSuite;"/>
+ </class>
+ <class name="android/test/TouchUtils" since="1" deprecated="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="clickView(Landroid/test/InstrumentationTestCase;Landroid/view/View;)V"/>
+ <method name="drag(Landroid/test/ActivityInstrumentationTestCase;FFFFI)V" deprecated="16"/>
+ <method name="drag(Landroid/test/InstrumentationTestCase;FFFFI)V" since="3"/>
+ <method name="dragQuarterScreenDown(Landroid/test/ActivityInstrumentationTestCase;)V" deprecated="16"/>
+ <method name="dragQuarterScreenDown(Landroid/test/InstrumentationTestCase;Landroid/app/Activity;)V" since="3"/>
+ <method name="dragQuarterScreenUp(Landroid/test/ActivityInstrumentationTestCase;)V" deprecated="16"/>
+ <method name="dragQuarterScreenUp(Landroid/test/InstrumentationTestCase;Landroid/app/Activity;)V" since="3"/>
+ <method name="dragViewBy(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/View;III)I" deprecated="16"/>
+ <method name="dragViewBy(Landroid/test/InstrumentationTestCase;Landroid/view/View;III)I" since="3" deprecated="16"/>
+ <method name="dragViewTo(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/View;III)I" deprecated="16"/>
+ <method name="dragViewTo(Landroid/test/InstrumentationTestCase;Landroid/view/View;III)I" since="3"/>
+ <method name="dragViewToBottom(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/View;)V" deprecated="16"/>
+ <method name="dragViewToBottom(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/View;I)V" deprecated="16"/>
+ <method name="dragViewToBottom(Landroid/test/InstrumentationTestCase;Landroid/app/Activity;Landroid/view/View;)V" since="3"/>
+ <method name="dragViewToBottom(Landroid/test/InstrumentationTestCase;Landroid/app/Activity;Landroid/view/View;I)V" since="3"/>
+ <method name="dragViewToTop(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/View;)V" deprecated="16"/>
+ <method name="dragViewToTop(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/View;I)V" deprecated="16"/>
+ <method name="dragViewToTop(Landroid/test/InstrumentationTestCase;Landroid/view/View;)V" since="3"/>
+ <method name="dragViewToTop(Landroid/test/InstrumentationTestCase;Landroid/view/View;I)V" since="3"/>
+ <method name="dragViewToX(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/View;II)I" deprecated="16"/>
+ <method name="dragViewToX(Landroid/test/InstrumentationTestCase;Landroid/view/View;II)I" since="3"/>
+ <method name="dragViewToY(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/View;II)I" deprecated="16"/>
+ <method name="dragViewToY(Landroid/test/InstrumentationTestCase;Landroid/view/View;II)I" since="3"/>
+ <method name="longClickView(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/View;)V" deprecated="16"/>
+ <method name="longClickView(Landroid/test/InstrumentationTestCase;Landroid/view/View;)V" since="3"/>
+ <method name="scrollToBottom(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/ViewGroup;)V" deprecated="16"/>
+ <method name="scrollToBottom(Landroid/test/InstrumentationTestCase;Landroid/app/Activity;Landroid/view/ViewGroup;)V" since="3"/>
+ <method name="scrollToTop(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/ViewGroup;)V" deprecated="16"/>
+ <method name="scrollToTop(Landroid/test/InstrumentationTestCase;Landroid/app/Activity;Landroid/view/ViewGroup;)V" since="3"/>
+ <method name="tapView(Landroid/test/InstrumentationTestCase;Landroid/view/View;)V"/>
+ <method name="touchAndCancelView(Landroid/test/InstrumentationTestCase;Landroid/view/View;)V"/>
+ </class>
+ <class name="android/test/UiThreadTest" since="1" deprecated="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ </class>
+ <class name="android/test/ViewAsserts" since="1" deprecated="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="assertBaselineAligned(Landroid/view/View;Landroid/view/View;)V"/>
+ <method name="assertBottomAligned(Landroid/view/View;Landroid/view/View;)V"/>
+ <method name="assertBottomAligned(Landroid/view/View;Landroid/view/View;I)V"/>
+ <method name="assertGroupContains(Landroid/view/ViewGroup;Landroid/view/View;)V"/>
+ <method name="assertGroupIntegrity(Landroid/view/ViewGroup;)V"/>
+ <method name="assertGroupNotContains(Landroid/view/ViewGroup;Landroid/view/View;)V"/>
+ <method name="assertHasScreenCoordinates(Landroid/view/View;Landroid/view/View;II)V"/>
+ <method name="assertHorizontalCenterAligned(Landroid/view/View;Landroid/view/View;)V"/>
+ <method name="assertLeftAligned(Landroid/view/View;Landroid/view/View;)V"/>
+ <method name="assertLeftAligned(Landroid/view/View;Landroid/view/View;I)V"/>
+ <method name="assertOffScreenAbove(Landroid/view/View;Landroid/view/View;)V"/>
+ <method name="assertOffScreenBelow(Landroid/view/View;Landroid/view/View;)V"/>
+ <method name="assertOnScreen(Landroid/view/View;Landroid/view/View;)V"/>
+ <method name="assertRightAligned(Landroid/view/View;Landroid/view/View;)V"/>
+ <method name="assertRightAligned(Landroid/view/View;Landroid/view/View;I)V"/>
+ <method name="assertTopAligned(Landroid/view/View;Landroid/view/View;)V"/>
+ <method name="assertTopAligned(Landroid/view/View;Landroid/view/View;I)V"/>
+ <method name="assertVerticalCenterAligned(Landroid/view/View;Landroid/view/View;)V"/>
+ </class>
+ <class name="android/test/mock/MockApplication" since="1" deprecated="24">
+ <extends name="android/app/Application"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/test/mock/MockContentProvider" since="8">
+ <extends name="android/content/ContentProvider"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;[Landroid/content/pm/PathPermission;)V"/>
+ </class>
+ <class name="android/test/mock/MockContentResolver" since="1">
+ <extends name="android/content/ContentResolver"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/Context;)V" since="18"/>
+ <method name="addProvider(Ljava/lang/String;Landroid/content/ContentProvider;)V"/>
+ </class>
+ <class name="android/test/mock/MockContext" since="1">
+ <extends name="android/content/Context"/>
+ <method name="&lt;init>()V"/>
+ <method name="getPackageCodePath()Ljava/lang/String;"/>
+ <method name="getPackageResourcePath()Ljava/lang/String;"/>
+ </class>
+ <class name="android/test/mock/MockCursor" since="8" deprecated="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/database/Cursor"/>
+ <method name="&lt;init>()V"/>
+ <method name="abortUpdates()V" removed="11"/>
+ <method name="commitUpdates()Z" removed="11"/>
+ <method name="commitUpdates(Ljava/util/Map;)Z" removed="11"/>
+ <method name="deleteRow()Z" removed="11"/>
+ <method name="hasUpdates()Z" removed="11"/>
+ <method name="supportsUpdates()Z" removed="11"/>
+ <method name="updateBlob(I[B)Z" removed="11"/>
+ <method name="updateDouble(ID)Z" removed="11"/>
+ <method name="updateFloat(IF)Z" removed="11"/>
+ <method name="updateInt(II)Z" removed="11"/>
+ <method name="updateLong(IJ)Z" removed="11"/>
+ <method name="updateShort(IS)Z" removed="11"/>
+ <method name="updateString(ILjava/lang/String;)Z" removed="11"/>
+ <method name="updateToNull(I)Z" removed="11"/>
+ </class>
+ <class name="android/test/mock/MockDialogInterface" since="1" deprecated="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/content/DialogInterface"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/test/mock/MockPackageManager" since="1" deprecated="24">
+ <extends name="android/content/pm/PackageManager"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAllIntentFilters(Ljava/lang/String;)Ljava/util/List;" since="23"/>
+ <method name="getDefaultBrowserPackageName(I)Ljava/lang/String;" since="23" removed="24"/>
+ <method name="setDefaultBrowserPackageName(Ljava/lang/String;I)Z" since="23" removed="24"/>
+ <method name="setPackageObbPath(Ljava/lang/String;Ljava/lang/String;)V" since="9" removed="10"/>
+ </class>
+ <class name="android/test/mock/MockResources" since="1" deprecated="24">
+ <extends name="android/content/res/Resources"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/test/suitebuilder/TestMethod" since="1" deprecated="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Class;)V" since="3"/>
+ <method name="&lt;init>(Ljava/lang/reflect/Method;Ljava/lang/Class;)V"/>
+ <method name="&lt;init>(Ljunit/framework/TestCase;)V" since="3"/>
+ <method name="createTest()Ljunit/framework/TestCase;"/>
+ <method name="getAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;"/>
+ <method name="getEnclosingClass()Ljava/lang/Class;"/>
+ <method name="getEnclosingClassname()Ljava/lang/String;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ </class>
+ <class name="android/test/suitebuilder/TestSuiteBuilder" since="1" deprecated="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/Class;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/ClassLoader;)V"/>
+ <method name="addRequirements(Ljava/util/List;)Landroid/test/suitebuilder/TestSuiteBuilder;"/>
+ <method name="addRequirements([Lcom/android/internal/util/Predicate;)Landroid/test/suitebuilder/TestSuiteBuilder;"/>
+ <method name="build()Ljunit/framework/TestSuite;"/>
+ <method name="excludePackages([Ljava/lang/String;)Landroid/test/suitebuilder/TestSuiteBuilder;"/>
+ <method name="getSuiteName()Ljava/lang/String;"/>
+ <method name="includeAllPackagesUnderHere()Landroid/test/suitebuilder/TestSuiteBuilder;"/>
+ <method name="includePackages([Ljava/lang/String;)Landroid/test/suitebuilder/TestSuiteBuilder;"/>
+ <method name="named(Ljava/lang/String;)Landroid/test/suitebuilder/TestSuiteBuilder;"/>
+ </class>
+ <class name="android/test/suitebuilder/TestSuiteBuilder$FailedToCreateTests" since="1" deprecated="26">
+ <extends name="junit/framework/TestCase"/>
+ <method name="&lt;init>(Ljava/lang/Exception;)V"/>
+ <method name="testSuiteConstructionFailed()V"/>
+ </class>
+ <class name="android/test/suitebuilder/annotation/LargeTest" since="2" deprecated="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ </class>
+ <class name="android/test/suitebuilder/annotation/MediumTest" since="2" deprecated="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ </class>
+ <class name="android/test/suitebuilder/annotation/SmallTest" since="2" deprecated="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ </class>
+ <class name="android/test/suitebuilder/annotation/Smoke" since="1" deprecated="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ </class>
+ <class name="android/test/suitebuilder/annotation/Suppress" since="1" deprecated="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ </class>
+ <class name="android/text/AlteredCharSequence" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/GetChars"/>
+ <implements name="java/lang/CharSequence"/>
+ <method name="&lt;init>()V"/>
+ <method name="make(Ljava/lang/CharSequence;[CII)Landroid/text/AlteredCharSequence;"/>
+ </class>
+ <class name="android/text/AndroidCharacter" since="1" deprecated="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDirectionalities([C[BI)V"/>
+ <method name="getEastAsianWidth(C)I" since="8"/>
+ <method name="getEastAsianWidths([CII[B)V" since="8"/>
+ <method name="getMirror(C)C"/>
+ <method name="mirror([CII)Z"/>
+ <field name="EAST_ASIAN_WIDTH_AMBIGUOUS" since="8"/>
+ <field name="EAST_ASIAN_WIDTH_FULL_WIDTH" since="8"/>
+ <field name="EAST_ASIAN_WIDTH_HALF_WIDTH" since="8"/>
+ <field name="EAST_ASIAN_WIDTH_NARROW" since="8"/>
+ <field name="EAST_ASIAN_WIDTH_NEUTRAL" since="8"/>
+ <field name="EAST_ASIAN_WIDTH_WIDE" since="8"/>
+ </class>
+ <class name="android/text/Annotation" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/ParcelableSpan" since="3"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="getKey()Ljava/lang/String;"/>
+ <method name="getValue()Ljava/lang/String;"/>
+ </class>
+ <class name="android/text/AutoText" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="get(Ljava/lang/CharSequence;IILandroid/view/View;)Ljava/lang/String;"/>
+ <method name="getSize(Landroid/view/View;)I" since="3"/>
+ </class>
+ <class name="android/text/BidiFormatter" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getInstance()Landroid/text/BidiFormatter;"/>
+ <method name="getInstance(Ljava/util/Locale;)Landroid/text/BidiFormatter;"/>
+ <method name="getInstance(Z)Landroid/text/BidiFormatter;"/>
+ <method name="getStereoReset()Z"/>
+ <method name="isRtl(Ljava/lang/CharSequence;)Z" since="26"/>
+ <method name="isRtl(Ljava/lang/String;)Z"/>
+ <method name="isRtlContext()Z"/>
+ <method name="unicodeWrap(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;" since="26"/>
+ <method name="unicodeWrap(Ljava/lang/CharSequence;Landroid/text/TextDirectionHeuristic;)Ljava/lang/CharSequence;" since="26"/>
+ <method name="unicodeWrap(Ljava/lang/CharSequence;Landroid/text/TextDirectionHeuristic;Z)Ljava/lang/CharSequence;" since="26"/>
+ <method name="unicodeWrap(Ljava/lang/CharSequence;Z)Ljava/lang/CharSequence;" since="26"/>
+ <method name="unicodeWrap(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="unicodeWrap(Ljava/lang/String;Landroid/text/TextDirectionHeuristic;)Ljava/lang/String;"/>
+ <method name="unicodeWrap(Ljava/lang/String;Landroid/text/TextDirectionHeuristic;Z)Ljava/lang/String;"/>
+ <method name="unicodeWrap(Ljava/lang/String;Z)Ljava/lang/String;"/>
+ </class>
+ <class name="android/text/BidiFormatter$Builder" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V"/>
+ <method name="&lt;init>(Z)V"/>
+ <method name="build()Landroid/text/BidiFormatter;"/>
+ <method name="setTextDirectionHeuristic(Landroid/text/TextDirectionHeuristic;)Landroid/text/BidiFormatter$Builder;"/>
+ <method name="stereoReset(Z)Landroid/text/BidiFormatter$Builder;"/>
+ </class>
+ <class name="android/text/BoringLayout" since="1">
+ <extends name="android/text/Layout"/>
+ <implements name="android/text/TextUtils$EllipsizeCallback"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;Z)V"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;ZLandroid/text/TextUtils$TruncateAt;I)V"/>
+ <method name="isBoring(Ljava/lang/CharSequence;Landroid/text/TextPaint;)Landroid/text/BoringLayout$Metrics;"/>
+ <method name="isBoring(Ljava/lang/CharSequence;Landroid/text/TextPaint;Landroid/text/BoringLayout$Metrics;)Landroid/text/BoringLayout$Metrics;"/>
+ <method name="make(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;Z)Landroid/text/BoringLayout;"/>
+ <method name="make(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;ZLandroid/text/TextUtils$TruncateAt;I)Landroid/text/BoringLayout;"/>
+ <method name="replaceOrMake(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;Z)Landroid/text/BoringLayout;"/>
+ <method name="replaceOrMake(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;ZLandroid/text/TextUtils$TruncateAt;I)Landroid/text/BoringLayout;"/>
+ </class>
+ <class name="android/text/BoringLayout$Metrics" since="1">
+ <extends name="android/graphics/Paint$FontMetricsInt"/>
+ <method name="&lt;init>()V"/>
+ <field name="width"/>
+ </class>
+ <class name="android/text/ClipboardManager" since="1" deprecated="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getText()Ljava/lang/CharSequence;"/>
+ <method name="hasText()Z"/>
+ <method name="setText(Ljava/lang/CharSequence;)V"/>
+ </class>
+ <class name="android/text/DynamicLayout" since="1">
+ <extends name="android/text/Layout"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFZ)V"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFZ)V"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFZLandroid/text/TextUtils$TruncateAt;I)V"/>
+ </class>
+ <class name="android/text/Editable" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/GetChars"/>
+ <implements name="android/text/Spannable"/>
+ <implements name="java/lang/Appendable"/>
+ <implements name="java/lang/CharSequence"/>
+ <method name="append(C)Landroid/text/Editable;"/>
+ <method name="append(Ljava/lang/CharSequence;)Landroid/text/Editable;"/>
+ <method name="append(Ljava/lang/CharSequence;II)Landroid/text/Editable;"/>
+ <method name="clear()V"/>
+ <method name="clearSpans()V"/>
+ <method name="delete(II)Landroid/text/Editable;"/>
+ <method name="getFilters()[Landroid/text/InputFilter;"/>
+ <method name="insert(ILjava/lang/CharSequence;)Landroid/text/Editable;"/>
+ <method name="insert(ILjava/lang/CharSequence;II)Landroid/text/Editable;"/>
+ <method name="replace(IILjava/lang/CharSequence;)Landroid/text/Editable;"/>
+ <method name="replace(IILjava/lang/CharSequence;II)Landroid/text/Editable;"/>
+ <method name="setFilters([Landroid/text/InputFilter;)V"/>
+ </class>
+ <class name="android/text/Editable$Factory" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getInstance()Landroid/text/Editable$Factory;"/>
+ <method name="newEditable(Ljava/lang/CharSequence;)Landroid/text/Editable;"/>
+ </class>
+ <class name="android/text/GetChars" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/CharSequence"/>
+ <method name="getChars(II[CI)V"/>
+ </class>
+ <class name="android/text/Html" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="escapeHtml(Ljava/lang/CharSequence;)Ljava/lang/String;" since="16"/>
+ <method name="fromHtml(Ljava/lang/String;)Landroid/text/Spanned;" deprecated="24"/>
+ <method name="fromHtml(Ljava/lang/String;I)Landroid/text/Spanned;" since="24"/>
+ <method name="fromHtml(Ljava/lang/String;ILandroid/text/Html$ImageGetter;Landroid/text/Html$TagHandler;)Landroid/text/Spanned;" since="24"/>
+ <method name="fromHtml(Ljava/lang/String;Landroid/text/Html$ImageGetter;Landroid/text/Html$TagHandler;)Landroid/text/Spanned;" deprecated="24"/>
+ <method name="toHtml(Landroid/text/Spanned;)Ljava/lang/String;" deprecated="24"/>
+ <method name="toHtml(Landroid/text/Spanned;I)Ljava/lang/String;" since="24"/>
+ <field name="FROM_HTML_MODE_COMPACT" since="24"/>
+ <field name="FROM_HTML_MODE_LEGACY" since="24"/>
+ <field name="FROM_HTML_OPTION_USE_CSS_COLORS" since="24"/>
+ <field name="FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE" since="24"/>
+ <field name="FROM_HTML_SEPARATOR_LINE_BREAK_DIV" since="24"/>
+ <field name="FROM_HTML_SEPARATOR_LINE_BREAK_HEADING" since="24"/>
+ <field name="FROM_HTML_SEPARATOR_LINE_BREAK_LIST" since="24"/>
+ <field name="FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM" since="24"/>
+ <field name="FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH" since="24"/>
+ <field name="TO_HTML_PARAGRAPH_LINES_CONSECUTIVE" since="24"/>
+ <field name="TO_HTML_PARAGRAPH_LINES_INDIVIDUAL" since="24"/>
+ </class>
+ <class name="android/text/Html$ImageGetter" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getDrawable(Ljava/lang/String;)Landroid/graphics/drawable/Drawable;"/>
+ </class>
+ <class name="android/text/Html$TagHandler" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="handleTag(ZLjava/lang/String;Landroid/text/Editable;Lorg/xml/sax/XMLReader;)V"/>
+ </class>
+ <class name="android/text/InputFilter" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="filter(Ljava/lang/CharSequence;IILandroid/text/Spanned;II)Ljava/lang/CharSequence;"/>
+ </class>
+ <class name="android/text/InputFilter$AllCaps" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/InputFilter"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/text/InputFilter$LengthFilter" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/InputFilter"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="getMax()I" since="21"/>
+ </class>
+ <class name="android/text/InputType" since="3">
+ <extends name="java/lang/Object"/>
+ <field name="TYPE_CLASS_DATETIME"/>
+ <field name="TYPE_CLASS_NUMBER"/>
+ <field name="TYPE_CLASS_PHONE"/>
+ <field name="TYPE_CLASS_TEXT"/>
+ <field name="TYPE_DATETIME_VARIATION_DATE"/>
+ <field name="TYPE_DATETIME_VARIATION_NORMAL"/>
+ <field name="TYPE_DATETIME_VARIATION_TIME"/>
+ <field name="TYPE_MASK_CLASS"/>
+ <field name="TYPE_MASK_FLAGS"/>
+ <field name="TYPE_MASK_VARIATION"/>
+ <field name="TYPE_NULL"/>
+ <field name="TYPE_NUMBER_FLAG_DECIMAL"/>
+ <field name="TYPE_NUMBER_FLAG_SIGNED"/>
+ <field name="TYPE_NUMBER_VARIATION_NORMAL" since="11"/>
+ <field name="TYPE_NUMBER_VARIATION_PASSWORD" since="11"/>
+ <field name="TYPE_TEXT_FLAG_AUTO_COMPLETE"/>
+ <field name="TYPE_TEXT_FLAG_AUTO_CORRECT"/>
+ <field name="TYPE_TEXT_FLAG_CAP_CHARACTERS"/>
+ <field name="TYPE_TEXT_FLAG_CAP_SENTENCES"/>
+ <field name="TYPE_TEXT_FLAG_CAP_WORDS"/>
+ <field name="TYPE_TEXT_FLAG_IME_MULTI_LINE"/>
+ <field name="TYPE_TEXT_FLAG_MULTI_LINE"/>
+ <field name="TYPE_TEXT_FLAG_NO_SUGGESTIONS" since="5"/>
+ <field name="TYPE_TEXT_VARIATION_EMAIL_ADDRESS"/>
+ <field name="TYPE_TEXT_VARIATION_EMAIL_SUBJECT"/>
+ <field name="TYPE_TEXT_VARIATION_FILTER"/>
+ <field name="TYPE_TEXT_VARIATION_LONG_MESSAGE"/>
+ <field name="TYPE_TEXT_VARIATION_NORMAL"/>
+ <field name="TYPE_TEXT_VARIATION_PASSWORD"/>
+ <field name="TYPE_TEXT_VARIATION_PERSON_NAME"/>
+ <field name="TYPE_TEXT_VARIATION_PHONETIC"/>
+ <field name="TYPE_TEXT_VARIATION_POSTAL_ADDRESS"/>
+ <field name="TYPE_TEXT_VARIATION_SHORT_MESSAGE"/>
+ <field name="TYPE_TEXT_VARIATION_URI"/>
+ <field name="TYPE_TEXT_VARIATION_VISIBLE_PASSWORD"/>
+ <field name="TYPE_TEXT_VARIATION_WEB_EDIT_TEXT"/>
+ <field name="TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS" since="11"/>
+ <field name="TYPE_TEXT_VARIATION_WEB_PASSWORD" since="11"/>
+ </class>
+ <class name="android/text/Layout" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FF)V"/>
+ <method name="draw(Landroid/graphics/Canvas;)V"/>
+ <method name="draw(Landroid/graphics/Canvas;Landroid/graphics/Path;Landroid/graphics/Paint;I)V"/>
+ <method name="getAlignment()Landroid/text/Layout$Alignment;"/>
+ <method name="getBottomPadding()I"/>
+ <method name="getCursorPath(ILandroid/graphics/Path;Ljava/lang/CharSequence;)V"/>
+ <method name="getDesiredWidth(Ljava/lang/CharSequence;IILandroid/text/TextPaint;)F"/>
+ <method name="getDesiredWidth(Ljava/lang/CharSequence;Landroid/text/TextPaint;)F"/>
+ <method name="getEllipsisCount(I)I"/>
+ <method name="getEllipsisStart(I)I"/>
+ <method name="getEllipsizedWidth()I"/>
+ <method name="getHeight()I"/>
+ <method name="getLineAscent(I)I"/>
+ <method name="getLineBaseline(I)I"/>
+ <method name="getLineBottom(I)I"/>
+ <method name="getLineBounds(ILandroid/graphics/Rect;)I"/>
+ <method name="getLineContainsTab(I)Z"/>
+ <method name="getLineCount()I"/>
+ <method name="getLineDescent(I)I"/>
+ <method name="getLineDirections(I)Landroid/text/Layout$Directions;"/>
+ <method name="getLineEnd(I)I"/>
+ <method name="getLineForOffset(I)I"/>
+ <method name="getLineForVertical(I)I"/>
+ <method name="getLineLeft(I)F"/>
+ <method name="getLineMax(I)F"/>
+ <method name="getLineRight(I)F"/>
+ <method name="getLineStart(I)I"/>
+ <method name="getLineTop(I)I"/>
+ <method name="getLineVisibleEnd(I)I"/>
+ <method name="getLineWidth(I)F"/>
+ <method name="getOffsetForHorizontal(IF)I"/>
+ <method name="getOffsetToLeftOf(I)I"/>
+ <method name="getOffsetToRightOf(I)I"/>
+ <method name="getPaint()Landroid/text/TextPaint;"/>
+ <method name="getParagraphAlignment(I)Landroid/text/Layout$Alignment;"/>
+ <method name="getParagraphDirection(I)I"/>
+ <method name="getParagraphLeft(I)I"/>
+ <method name="getParagraphRight(I)I"/>
+ <method name="getPrimaryHorizontal(I)F"/>
+ <method name="getSecondaryHorizontal(I)F"/>
+ <method name="getSelectionPath(IILandroid/graphics/Path;)V"/>
+ <method name="getSpacingAdd()F"/>
+ <method name="getSpacingMultiplier()F"/>
+ <method name="getText()Ljava/lang/CharSequence;"/>
+ <method name="getTopPadding()I"/>
+ <method name="getWidth()I"/>
+ <method name="increaseWidthTo(I)V"/>
+ <method name="isRtlCharAt(I)Z" since="14"/>
+ <method name="isSpanned()Z"/>
+ <field name="BREAK_STRATEGY_BALANCED" since="23"/>
+ <field name="BREAK_STRATEGY_HIGH_QUALITY" since="23"/>
+ <field name="BREAK_STRATEGY_SIMPLE" since="23"/>
+ <field name="DIR_LEFT_TO_RIGHT"/>
+ <field name="DIR_RIGHT_TO_LEFT"/>
+ <field name="HYPHENATION_FREQUENCY_FULL" since="23"/>
+ <field name="HYPHENATION_FREQUENCY_NONE" since="23"/>
+ <field name="HYPHENATION_FREQUENCY_NORMAL" since="23"/>
+ <field name="JUSTIFICATION_MODE_INTER_WORD" since="26"/>
+ <field name="JUSTIFICATION_MODE_NONE" since="26"/>
+ </class>
+ <class name="android/text/Layout$Alignment" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/text/Layout$Alignment;"/>
+ <method name="values()[Landroid/text/Layout$Alignment;"/>
+ <field name="ALIGN_CENTER"/>
+ <field name="ALIGN_NORMAL"/>
+ <field name="ALIGN_OPPOSITE"/>
+ </class>
+ <class name="android/text/Layout$Directions" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/text/LoginFilter" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/InputFilter"/>
+ <method name="&lt;init>()V"/>
+ <method name="isAllowed(C)Z"/>
+ <method name="onInvalidCharacter(C)V"/>
+ <method name="onStart()V"/>
+ <method name="onStop()V"/>
+ </class>
+ <class name="android/text/LoginFilter$PasswordFilterGMail" since="1">
+ <extends name="android/text/LoginFilter"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Z)V"/>
+ </class>
+ <class name="android/text/LoginFilter$UsernameFilterGMail" since="1">
+ <extends name="android/text/LoginFilter"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Z)V"/>
+ </class>
+ <class name="android/text/LoginFilter$UsernameFilterGeneric" since="1">
+ <extends name="android/text/LoginFilter"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Z)V"/>
+ </class>
+ <class name="android/text/NoCopySpan" since="3">
+ <extends name="java/lang/Object"/>
+ </class>
+ <class name="android/text/NoCopySpan$Concrete" since="3">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/NoCopySpan"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/text/ParcelableSpan" since="3">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="getSpanTypeId()I"/>
+ </class>
+ <class name="android/text/Selection" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="extendDown(Landroid/text/Spannable;Landroid/text/Layout;)Z"/>
+ <method name="extendLeft(Landroid/text/Spannable;Landroid/text/Layout;)Z"/>
+ <method name="extendRight(Landroid/text/Spannable;Landroid/text/Layout;)Z"/>
+ <method name="extendSelection(Landroid/text/Spannable;I)V"/>
+ <method name="extendToLeftEdge(Landroid/text/Spannable;Landroid/text/Layout;)Z"/>
+ <method name="extendToRightEdge(Landroid/text/Spannable;Landroid/text/Layout;)Z"/>
+ <method name="extendUp(Landroid/text/Spannable;Landroid/text/Layout;)Z"/>
+ <method name="getSelectionEnd(Ljava/lang/CharSequence;)I"/>
+ <method name="getSelectionStart(Ljava/lang/CharSequence;)I"/>
+ <method name="moveDown(Landroid/text/Spannable;Landroid/text/Layout;)Z"/>
+ <method name="moveLeft(Landroid/text/Spannable;Landroid/text/Layout;)Z"/>
+ <method name="moveRight(Landroid/text/Spannable;Landroid/text/Layout;)Z"/>
+ <method name="moveToLeftEdge(Landroid/text/Spannable;Landroid/text/Layout;)Z"/>
+ <method name="moveToRightEdge(Landroid/text/Spannable;Landroid/text/Layout;)Z"/>
+ <method name="moveUp(Landroid/text/Spannable;Landroid/text/Layout;)Z"/>
+ <method name="removeSelection(Landroid/text/Spannable;)V"/>
+ <method name="selectAll(Landroid/text/Spannable;)V"/>
+ <method name="setSelection(Landroid/text/Spannable;I)V"/>
+ <method name="setSelection(Landroid/text/Spannable;II)V"/>
+ <field name="SELECTION_END"/>
+ <field name="SELECTION_START"/>
+ </class>
+ <class name="android/text/SpanWatcher" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/NoCopySpan" since="3"/>
+ <method name="onSpanAdded(Landroid/text/Spannable;Ljava/lang/Object;II)V"/>
+ <method name="onSpanChanged(Landroid/text/Spannable;Ljava/lang/Object;IIII)V"/>
+ <method name="onSpanRemoved(Landroid/text/Spannable;Ljava/lang/Object;II)V"/>
+ </class>
+ <class name="android/text/Spannable" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/Spanned"/>
+ <method name="removeSpan(Ljava/lang/Object;)V"/>
+ <method name="setSpan(Ljava/lang/Object;III)V"/>
+ </class>
+ <class name="android/text/Spannable$Factory" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getInstance()Landroid/text/Spannable$Factory;"/>
+ <method name="newSpannable(Ljava/lang/CharSequence;)Landroid/text/Spannable;"/>
+ </class>
+ <class name="android/text/SpannableString" since="1">
+ <extends name="android/text/SpannableStringInternal"/>
+ <implements name="android/text/GetChars"/>
+ <implements name="android/text/Spannable"/>
+ <implements name="java/lang/CharSequence"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;)V"/>
+ <method name="valueOf(Ljava/lang/CharSequence;)Landroid/text/SpannableString;"/>
+ </class>
+ <class name="android/text/SpannableStringBuilder" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/Editable"/>
+ <implements name="android/text/GetChars"/>
+ <implements name="android/text/Spannable"/>
+ <implements name="java/lang/Appendable"/>
+ <implements name="java/lang/CharSequence"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;)V"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;II)V"/>
+ <method name="append(C)Landroid/text/SpannableStringBuilder;"/>
+ <method name="append(Ljava/lang/CharSequence;)Landroid/text/SpannableStringBuilder;"/>
+ <method name="append(Ljava/lang/CharSequence;II)Landroid/text/SpannableStringBuilder;"/>
+ <method name="append(Ljava/lang/CharSequence;Ljava/lang/Object;I)Landroid/text/SpannableStringBuilder;" since="21"/>
+ <method name="delete(II)Landroid/text/SpannableStringBuilder;"/>
+ <method name="getTextRunCursor(IIIIILandroid/graphics/Paint;)I" since="11" deprecated="16"/>
+ <method name="getTextWatcherDepth()I" since="23"/>
+ <method name="insert(ILjava/lang/CharSequence;)Landroid/text/SpannableStringBuilder;"/>
+ <method name="insert(ILjava/lang/CharSequence;II)Landroid/text/SpannableStringBuilder;"/>
+ <method name="replace(IILjava/lang/CharSequence;)Landroid/text/SpannableStringBuilder;"/>
+ <method name="replace(IILjava/lang/CharSequence;II)Landroid/text/SpannableStringBuilder;"/>
+ <method name="valueOf(Ljava/lang/CharSequence;)Landroid/text/SpannableStringBuilder;"/>
+ </class>
+ <class name="android/text/SpannableStringInternal" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="charAt(I)C"/>
+ <method name="getChars(II[CI)V"/>
+ <method name="getSpanEnd(Ljava/lang/Object;)I"/>
+ <method name="getSpanFlags(Ljava/lang/Object;)I"/>
+ <method name="getSpanStart(Ljava/lang/Object;)I"/>
+ <method name="getSpans(IILjava/lang/Class;)[Ljava/lang/Object;"/>
+ <method name="length()I"/>
+ <method name="nextSpanTransition(IILjava/lang/Class;)I"/>
+ </class>
+ <class name="android/text/Spanned" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/CharSequence"/>
+ <method name="getSpanEnd(Ljava/lang/Object;)I"/>
+ <method name="getSpanFlags(Ljava/lang/Object;)I"/>
+ <method name="getSpanStart(Ljava/lang/Object;)I"/>
+ <method name="getSpans(IILjava/lang/Class;)[Ljava/lang/Object;"/>
+ <method name="nextSpanTransition(IILjava/lang/Class;)I"/>
+ <field name="SPAN_COMPOSING" since="3"/>
+ <field name="SPAN_EXCLUSIVE_EXCLUSIVE"/>
+ <field name="SPAN_EXCLUSIVE_INCLUSIVE"/>
+ <field name="SPAN_INCLUSIVE_EXCLUSIVE"/>
+ <field name="SPAN_INCLUSIVE_INCLUSIVE"/>
+ <field name="SPAN_INTERMEDIATE" since="3"/>
+ <field name="SPAN_MARK_MARK"/>
+ <field name="SPAN_MARK_POINT"/>
+ <field name="SPAN_PARAGRAPH"/>
+ <field name="SPAN_POINT_MARK"/>
+ <field name="SPAN_POINT_MARK_MASK" since="3"/>
+ <field name="SPAN_POINT_POINT"/>
+ <field name="SPAN_PRIORITY"/>
+ <field name="SPAN_PRIORITY_SHIFT"/>
+ <field name="SPAN_USER"/>
+ <field name="SPAN_USER_SHIFT"/>
+ </class>
+ <class name="android/text/SpannedString" since="1">
+ <extends name="android/text/SpannableStringInternal"/>
+ <implements name="android/text/GetChars"/>
+ <implements name="android/text/Spanned"/>
+ <implements name="java/lang/CharSequence"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;)V"/>
+ <method name="valueOf(Ljava/lang/CharSequence;)Landroid/text/SpannedString;"/>
+ </class>
+ <class name="android/text/StaticLayout" since="1">
+ <extends name="android/text/Layout"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;IILandroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFZ)V"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;IILandroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFZLandroid/text/TextUtils$TruncateAt;I)V"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFZ)V"/>
+ </class>
+ <class name="android/text/StaticLayout$Builder" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="build()Landroid/text/StaticLayout;"/>
+ <method name="obtain(Ljava/lang/CharSequence;IILandroid/text/TextPaint;I)Landroid/text/StaticLayout$Builder;"/>
+ <method name="setAlignment(Landroid/text/Layout$Alignment;)Landroid/text/StaticLayout$Builder;"/>
+ <method name="setBreakStrategy(I)Landroid/text/StaticLayout$Builder;"/>
+ <method name="setEllipsize(Landroid/text/TextUtils$TruncateAt;)Landroid/text/StaticLayout$Builder;"/>
+ <method name="setEllipsizedWidth(I)Landroid/text/StaticLayout$Builder;"/>
+ <method name="setHyphenationFrequency(I)Landroid/text/StaticLayout$Builder;"/>
+ <method name="setIncludePad(Z)Landroid/text/StaticLayout$Builder;"/>
+ <method name="setIndents([I[I)Landroid/text/StaticLayout$Builder;"/>
+ <method name="setJustificationMode(I)Landroid/text/StaticLayout$Builder;" since="26"/>
+ <method name="setLineSpacing(FF)Landroid/text/StaticLayout$Builder;"/>
+ <method name="setMaxLines(I)Landroid/text/StaticLayout$Builder;"/>
+ <method name="setText(Ljava/lang/CharSequence;)Landroid/text/StaticLayout$Builder;"/>
+ <method name="setTextDirection(Landroid/text/TextDirectionHeuristic;)Landroid/text/StaticLayout$Builder;"/>
+ </class>
+ <class name="android/text/TextDirectionHeuristic" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="isRtl(Ljava/lang/CharSequence;II)Z"/>
+ <method name="isRtl([CII)Z"/>
+ </class>
+ <class name="android/text/TextDirectionHeuristics" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="ANYRTL_LTR"/>
+ <field name="FIRSTSTRONG_LTR"/>
+ <field name="FIRSTSTRONG_RTL"/>
+ <field name="LOCALE"/>
+ <field name="LTR"/>
+ <field name="RTL"/>
+ </class>
+ <class name="android/text/TextPaint" since="1">
+ <extends name="android/graphics/Paint"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Landroid/graphics/Paint;)V"/>
+ <method name="set(Landroid/text/TextPaint;)V"/>
+ <field name="baselineShift"/>
+ <field name="bgColor"/>
+ <field name="density" since="5"/>
+ <field name="drawableState"/>
+ <field name="linkColor"/>
+ </class>
+ <class name="android/text/TextUtils" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="commaEllipsize(Ljava/lang/CharSequence;Landroid/text/TextPaint;FLjava/lang/String;Ljava/lang/String;)Ljava/lang/CharSequence;" deprecated="26"/>
+ <method name="concat([Ljava/lang/CharSequence;)Ljava/lang/CharSequence;"/>
+ <method name="copySpansFrom(Landroid/text/Spanned;IILjava/lang/Class;Landroid/text/Spannable;I)V"/>
+ <method name="dumpSpans(Ljava/lang/CharSequence;Landroid/util/Printer;Ljava/lang/String;)V" since="3"/>
+ <method name="ellipsize(Ljava/lang/CharSequence;Landroid/text/TextPaint;FLandroid/text/TextUtils$TruncateAt;)Ljava/lang/CharSequence;"/>
+ <method name="ellipsize(Ljava/lang/CharSequence;Landroid/text/TextPaint;FLandroid/text/TextUtils$TruncateAt;ZLandroid/text/TextUtils$EllipsizeCallback;)Ljava/lang/CharSequence;"/>
+ <method name="equals(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Z"/>
+ <method name="expandTemplate(Ljava/lang/CharSequence;[Ljava/lang/CharSequence;)Ljava/lang/CharSequence;"/>
+ <method name="getCapsMode(Ljava/lang/CharSequence;II)I" since="3"/>
+ <method name="getChars(Ljava/lang/CharSequence;II[CI)V"/>
+ <method name="getLayoutDirectionFromLocale(Ljava/util/Locale;)I" since="17"/>
+ <method name="getOffsetAfter(Ljava/lang/CharSequence;I)I"/>
+ <method name="getOffsetBefore(Ljava/lang/CharSequence;I)I"/>
+ <method name="getReverse(Ljava/lang/CharSequence;II)Ljava/lang/CharSequence;" deprecated="24"/>
+ <method name="getTrimmedLength(Ljava/lang/CharSequence;)I"/>
+ <method name="htmlEncode(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="indexOf(Ljava/lang/CharSequence;C)I"/>
+ <method name="indexOf(Ljava/lang/CharSequence;CI)I"/>
+ <method name="indexOf(Ljava/lang/CharSequence;CII)I"/>
+ <method name="indexOf(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)I"/>
+ <method name="indexOf(Ljava/lang/CharSequence;Ljava/lang/CharSequence;I)I"/>
+ <method name="indexOf(Ljava/lang/CharSequence;Ljava/lang/CharSequence;II)I"/>
+ <method name="isDigitsOnly(Ljava/lang/CharSequence;)Z"/>
+ <method name="isEmpty(Ljava/lang/CharSequence;)Z"/>
+ <method name="isGraphic(C)Z" deprecated="24"/>
+ <method name="isGraphic(Ljava/lang/CharSequence;)Z"/>
+ <method name="join(Ljava/lang/CharSequence;Ljava/lang/Iterable;)Ljava/lang/String;"/>
+ <method name="join(Ljava/lang/CharSequence;[Ljava/lang/Object;)Ljava/lang/String;"/>
+ <method name="lastIndexOf(Ljava/lang/CharSequence;C)I"/>
+ <method name="lastIndexOf(Ljava/lang/CharSequence;CI)I"/>
+ <method name="lastIndexOf(Ljava/lang/CharSequence;CII)I"/>
+ <method name="listEllipsize(Landroid/content/Context;Ljava/util/List;Ljava/lang/String;Landroid/text/TextPaint;FI)Ljava/lang/CharSequence;" since="26"/>
+ <method name="regionMatches(Ljava/lang/CharSequence;ILjava/lang/CharSequence;II)Z"/>
+ <method name="replace(Ljava/lang/CharSequence;[Ljava/lang/String;[Ljava/lang/CharSequence;)Ljava/lang/CharSequence;"/>
+ <method name="split(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;"/>
+ <method name="split(Ljava/lang/String;Ljava/util/regex/Pattern;)[Ljava/lang/String;"/>
+ <method name="stringOrSpannedString(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;"/>
+ <method name="substring(Ljava/lang/CharSequence;II)Ljava/lang/String;"/>
+ <method name="writeToParcel(Ljava/lang/CharSequence;Landroid/os/Parcel;I)V"/>
+ <field name="CAP_MODE_CHARACTERS" since="3"/>
+ <field name="CAP_MODE_SENTENCES" since="3"/>
+ <field name="CAP_MODE_WORDS" since="3"/>
+ <field name="CHAR_SEQUENCE_CREATOR"/>
+ </class>
+ <class name="android/text/TextUtils$EllipsizeCallback" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="ellipsized(II)V"/>
+ </class>
+ <class name="android/text/TextUtils$SimpleStringSplitter" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/TextUtils$StringSplitter"/>
+ <implements name="java/util/Iterator"/>
+ <method name="&lt;init>(C)V"/>
+ <method name="next()Ljava/lang/String;"/>
+ </class>
+ <class name="android/text/TextUtils$StringSplitter" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Iterable"/>
+ <method name="setString(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/text/TextUtils$TruncateAt" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/text/TextUtils$TruncateAt;"/>
+ <method name="values()[Landroid/text/TextUtils$TruncateAt;"/>
+ <field name="END"/>
+ <field name="MARQUEE" since="2"/>
+ <field name="MIDDLE"/>
+ <field name="START"/>
+ </class>
+ <class name="android/text/TextWatcher" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/NoCopySpan" since="3"/>
+ <method name="afterTextChanged(Landroid/text/Editable;)V"/>
+ <method name="beforeTextChanged(Ljava/lang/CharSequence;III)V"/>
+ <method name="onTextChanged(Ljava/lang/CharSequence;III)V"/>
+ </class>
+ <class name="android/text/format/DateFormat" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="format(Ljava/lang/CharSequence;J)Ljava/lang/CharSequence;"/>
+ <method name="format(Ljava/lang/CharSequence;Ljava/util/Calendar;)Ljava/lang/CharSequence;"/>
+ <method name="format(Ljava/lang/CharSequence;Ljava/util/Date;)Ljava/lang/CharSequence;"/>
+ <method name="getBestDateTimePattern(Ljava/util/Locale;Ljava/lang/String;)Ljava/lang/String;" since="18"/>
+ <method name="getDateFormat(Landroid/content/Context;)Ljava/text/DateFormat;"/>
+ <method name="getDateFormatOrder(Landroid/content/Context;)[C"/>
+ <method name="getLongDateFormat(Landroid/content/Context;)Ljava/text/DateFormat;"/>
+ <method name="getMediumDateFormat(Landroid/content/Context;)Ljava/text/DateFormat;"/>
+ <method name="getTimeFormat(Landroid/content/Context;)Ljava/text/DateFormat;"/>
+ <method name="is24HourFormat(Landroid/content/Context;)Z"/>
+ <field name="AM_PM" deprecated="18" removed="22"/>
+ <field name="CAPITAL_AM_PM" deprecated="18" removed="22"/>
+ <field name="DATE" deprecated="18" removed="22"/>
+ <field name="DAY" deprecated="18" removed="22"/>
+ <field name="HOUR" deprecated="18" removed="22"/>
+ <field name="HOUR_OF_DAY" deprecated="18" removed="22"/>
+ <field name="MINUTE" deprecated="18" removed="22"/>
+ <field name="MONTH" deprecated="18" removed="22"/>
+ <field name="QUOTE" deprecated="18" removed="22"/>
+ <field name="SECONDS" deprecated="18" removed="22"/>
+ <field name="STANDALONE_MONTH" since="17" deprecated="18" removed="22"/>
+ <field name="TIME_ZONE" deprecated="18" removed="22"/>
+ <field name="YEAR" deprecated="18" removed="22"/>
+ </class>
+ <class name="android/text/format/DateUtils" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="formatDateRange(Landroid/content/Context;JJI)Ljava/lang/String;"/>
+ <method name="formatDateRange(Landroid/content/Context;Ljava/util/Formatter;JJI)Ljava/util/Formatter;" since="5"/>
+ <method name="formatDateRange(Landroid/content/Context;Ljava/util/Formatter;JJILjava/lang/String;)Ljava/util/Formatter;" since="9"/>
+ <method name="formatDateTime(Landroid/content/Context;JI)Ljava/lang/String;"/>
+ <method name="formatElapsedTime(J)Ljava/lang/String;"/>
+ <method name="formatElapsedTime(Ljava/lang/StringBuilder;J)Ljava/lang/String;"/>
+ <method name="formatSameDayTime(JJII)Ljava/lang/CharSequence;"/>
+ <method name="getAMPMString(I)Ljava/lang/String;" deprecated="17"/>
+ <method name="getDayOfWeekString(II)Ljava/lang/String;" deprecated="17"/>
+ <method name="getMonthString(II)Ljava/lang/String;" deprecated="17"/>
+ <method name="getRelativeDateTimeString(Landroid/content/Context;JJJI)Ljava/lang/CharSequence;"/>
+ <method name="getRelativeTimeSpanString(J)Ljava/lang/CharSequence;"/>
+ <method name="getRelativeTimeSpanString(JJJ)Ljava/lang/CharSequence;"/>
+ <method name="getRelativeTimeSpanString(JJJI)Ljava/lang/CharSequence;"/>
+ <method name="getRelativeTimeSpanString(Landroid/content/Context;J)Ljava/lang/CharSequence;"/>
+ <method name="getRelativeTimeSpanString(Landroid/content/Context;JZ)Ljava/lang/CharSequence;"/>
+ <method name="isToday(J)Z"/>
+ <field name="ABBREV_MONTH_FORMAT" deprecated="17"/>
+ <field name="ABBREV_WEEKDAY_FORMAT"/>
+ <field name="DAY_IN_MILLIS"/>
+ <field name="FORMAT_12HOUR" deprecated="17"/>
+ <field name="FORMAT_24HOUR" deprecated="17"/>
+ <field name="FORMAT_ABBREV_ALL"/>
+ <field name="FORMAT_ABBREV_MONTH"/>
+ <field name="FORMAT_ABBREV_RELATIVE"/>
+ <field name="FORMAT_ABBREV_TIME"/>
+ <field name="FORMAT_ABBREV_WEEKDAY"/>
+ <field name="FORMAT_CAP_AMPM" deprecated="17"/>
+ <field name="FORMAT_CAP_MIDNIGHT" deprecated="17"/>
+ <field name="FORMAT_CAP_NOON" deprecated="17"/>
+ <field name="FORMAT_CAP_NOON_MIDNIGHT" deprecated="17"/>
+ <field name="FORMAT_NO_MIDNIGHT"/>
+ <field name="FORMAT_NO_MONTH_DAY"/>
+ <field name="FORMAT_NO_NOON"/>
+ <field name="FORMAT_NO_NOON_MIDNIGHT" deprecated="17"/>
+ <field name="FORMAT_NO_YEAR"/>
+ <field name="FORMAT_NUMERIC_DATE"/>
+ <field name="FORMAT_SHOW_DATE"/>
+ <field name="FORMAT_SHOW_TIME"/>
+ <field name="FORMAT_SHOW_WEEKDAY"/>
+ <field name="FORMAT_SHOW_YEAR"/>
+ <field name="FORMAT_UTC" deprecated="16"/>
+ <field name="HOUR_IN_MILLIS"/>
+ <field name="HOUR_MINUTE_24" deprecated="17"/>
+ <field name="LENGTH_LONG" deprecated="17"/>
+ <field name="LENGTH_MEDIUM" deprecated="17"/>
+ <field name="LENGTH_SHORT" deprecated="17"/>
+ <field name="LENGTH_SHORTER" deprecated="17"/>
+ <field name="LENGTH_SHORTEST" deprecated="17"/>
+ <field name="MINUTE_IN_MILLIS"/>
+ <field name="MONTH_DAY_FORMAT"/>
+ <field name="MONTH_FORMAT"/>
+ <field name="NUMERIC_MONTH_FORMAT"/>
+ <field name="SECOND_IN_MILLIS"/>
+ <field name="WEEKDAY_FORMAT"/>
+ <field name="WEEK_IN_MILLIS"/>
+ <field name="YEAR_FORMAT"/>
+ <field name="YEAR_FORMAT_TWO_DIGITS"/>
+ <field name="YEAR_IN_MILLIS"/>
+ <field name="sameMonthTable" deprecated="17"/>
+ <field name="sameYearTable" deprecated="17"/>
+ </class>
+ <class name="android/text/format/Formatter" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="formatFileSize(Landroid/content/Context;J)Ljava/lang/String;"/>
+ <method name="formatIpAddress(I)Ljava/lang/String;" deprecated="16"/>
+ <method name="formatShortFileSize(Landroid/content/Context;J)Ljava/lang/String;" since="5"/>
+ </class>
+ <class name="android/text/format/Time" since="3" deprecated="22">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/text/format/Time;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="after(Landroid/text/format/Time;)Z"/>
+ <method name="before(Landroid/text/format/Time;)Z"/>
+ <method name="clear(Ljava/lang/String;)V"/>
+ <method name="compare(Landroid/text/format/Time;Landroid/text/format/Time;)I"/>
+ <method name="format(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="format2445()Ljava/lang/String;"/>
+ <method name="format3339(Z)Ljava/lang/String;"/>
+ <method name="getActualMaximum(I)I"/>
+ <method name="getCurrentTimezone()Ljava/lang/String;"/>
+ <method name="getJulianDay(JJ)I"/>
+ <method name="getJulianMondayFromWeeksSinceEpoch(I)I" since="11"/>
+ <method name="getWeekNumber()I"/>
+ <method name="getWeeksSinceEpochFromJulianDay(II)I" since="11"/>
+ <method name="isEpoch(Landroid/text/format/Time;)Z"/>
+ <method name="normalize(Z)J"/>
+ <method name="parse(Ljava/lang/String;)Z"/>
+ <method name="parse3339(Ljava/lang/String;)Z"/>
+ <method name="set(III)V"/>
+ <method name="set(IIIIII)V"/>
+ <method name="set(J)V"/>
+ <method name="set(Landroid/text/format/Time;)V"/>
+ <method name="setJulianDay(I)J"/>
+ <method name="setToNow()V"/>
+ <method name="switchTimezone(Ljava/lang/String;)V"/>
+ <method name="toMillis(Z)J"/>
+ <field name="EPOCH_JULIAN_DAY"/>
+ <field name="FRIDAY"/>
+ <field name="HOUR"/>
+ <field name="MINUTE"/>
+ <field name="MONDAY"/>
+ <field name="MONDAY_BEFORE_JULIAN_EPOCH" since="11"/>
+ <field name="MONTH"/>
+ <field name="MONTH_DAY"/>
+ <field name="SATURDAY"/>
+ <field name="SECOND"/>
+ <field name="SUNDAY"/>
+ <field name="THURSDAY"/>
+ <field name="TIMEZONE_UTC"/>
+ <field name="TUESDAY"/>
+ <field name="WEDNESDAY"/>
+ <field name="WEEK_DAY"/>
+ <field name="WEEK_NUM"/>
+ <field name="YEAR"/>
+ <field name="YEAR_DAY"/>
+ <field name="allDay"/>
+ <field name="gmtoff"/>
+ <field name="hour"/>
+ <field name="isDst"/>
+ <field name="minute"/>
+ <field name="month"/>
+ <field name="monthDay"/>
+ <field name="second"/>
+ <field name="timezone"/>
+ <field name="weekDay"/>
+ <field name="year"/>
+ <field name="yearDay"/>
+ </class>
+ <class name="android/text/method/ArrowKeyMovementMethod" since="1">
+ <extends name="android/text/method/BaseMovementMethod" since="11"/>
+ <extends name="java/lang/Object" removed="11"/>
+ <implements name="android/text/method/MovementMethod"/>
+ <method name="&lt;init>()V"/>
+ <method name="getInstance()Landroid/text/method/MovementMethod;"/>
+ </class>
+ <class name="android/text/method/BaseKeyListener" since="1">
+ <extends name="android/text/method/MetaKeyKeyListener"/>
+ <implements name="android/text/method/KeyListener"/>
+ <method name="&lt;init>()V"/>
+ <method name="backspace(Landroid/view/View;Landroid/text/Editable;ILandroid/view/KeyEvent;)Z"/>
+ <method name="forwardDelete(Landroid/view/View;Landroid/text/Editable;ILandroid/view/KeyEvent;)Z" since="11"/>
+ </class>
+ <class name="android/text/method/BaseMovementMethod" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/method/MovementMethod"/>
+ <method name="&lt;init>()V"/>
+ <method name="bottom(Landroid/widget/TextView;Landroid/text/Spannable;)Z"/>
+ <method name="down(Landroid/widget/TextView;Landroid/text/Spannable;)Z"/>
+ <method name="end(Landroid/widget/TextView;Landroid/text/Spannable;)Z"/>
+ <method name="getMovementMetaState(Landroid/text/Spannable;Landroid/view/KeyEvent;)I"/>
+ <method name="handleMovementKey(Landroid/widget/TextView;Landroid/text/Spannable;IILandroid/view/KeyEvent;)Z"/>
+ <method name="home(Landroid/widget/TextView;Landroid/text/Spannable;)Z"/>
+ <method name="left(Landroid/widget/TextView;Landroid/text/Spannable;)Z"/>
+ <method name="lineEnd(Landroid/widget/TextView;Landroid/text/Spannable;)Z"/>
+ <method name="lineStart(Landroid/widget/TextView;Landroid/text/Spannable;)Z"/>
+ <method name="pageDown(Landroid/widget/TextView;Landroid/text/Spannable;)Z"/>
+ <method name="pageUp(Landroid/widget/TextView;Landroid/text/Spannable;)Z"/>
+ <method name="right(Landroid/widget/TextView;Landroid/text/Spannable;)Z"/>
+ <method name="top(Landroid/widget/TextView;Landroid/text/Spannable;)Z"/>
+ <method name="up(Landroid/widget/TextView;Landroid/text/Spannable;)Z"/>
+ </class>
+ <class name="android/text/method/CharacterPickerDialog" since="1">
+ <extends name="android/app/Dialog"/>
+ <implements name="android/view/View$OnClickListener"/>
+ <implements name="android/widget/AdapterView$OnItemClickListener"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/View;Landroid/text/Editable;Ljava/lang/String;Z)V"/>
+ </class>
+ <class name="android/text/method/DateKeyListener" since="1">
+ <extends name="android/text/method/NumberKeyListener"/>
+ <method name="&lt;init>()V" deprecated="26"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V" since="26"/>
+ <method name="getInstance()Landroid/text/method/DateKeyListener;" deprecated="26"/>
+ <method name="getInstance(Ljava/util/Locale;)Landroid/text/method/DateKeyListener;" since="26"/>
+ <field name="CHARACTERS" deprecated="26"/>
+ </class>
+ <class name="android/text/method/DateTimeKeyListener" since="1">
+ <extends name="android/text/method/NumberKeyListener"/>
+ <method name="&lt;init>()V" deprecated="26"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V" since="26"/>
+ <method name="getInstance()Landroid/text/method/DateTimeKeyListener;" deprecated="26"/>
+ <method name="getInstance(Ljava/util/Locale;)Landroid/text/method/DateTimeKeyListener;" since="26"/>
+ <field name="CHARACTERS" deprecated="26"/>
+ </class>
+ <class name="android/text/method/DialerKeyListener" since="1">
+ <extends name="android/text/method/NumberKeyListener"/>
+ <method name="&lt;init>()V"/>
+ <method name="getInstance()Landroid/text/method/DialerKeyListener;"/>
+ <field name="CHARACTERS"/>
+ </class>
+ <class name="android/text/method/DigitsKeyListener" since="1">
+ <extends name="android/text/method/NumberKeyListener"/>
+ <method name="&lt;init>()V" deprecated="26"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V" since="26"/>
+ <method name="&lt;init>(Ljava/util/Locale;ZZ)V" since="26"/>
+ <method name="&lt;init>(ZZ)V" deprecated="26"/>
+ <method name="getInstance()Landroid/text/method/DigitsKeyListener;" deprecated="26"/>
+ <method name="getInstance(Ljava/lang/String;)Landroid/text/method/DigitsKeyListener;"/>
+ <method name="getInstance(Ljava/util/Locale;)Landroid/text/method/DigitsKeyListener;" since="26"/>
+ <method name="getInstance(Ljava/util/Locale;ZZ)Landroid/text/method/DigitsKeyListener;" since="26"/>
+ <method name="getInstance(ZZ)Landroid/text/method/DigitsKeyListener;" deprecated="26"/>
+ </class>
+ <class name="android/text/method/HideReturnsTransformationMethod" since="1">
+ <extends name="android/text/method/ReplacementTransformationMethod"/>
+ <method name="&lt;init>()V"/>
+ <method name="getInstance()Landroid/text/method/HideReturnsTransformationMethod;"/>
+ </class>
+ <class name="android/text/method/KeyListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="clearMetaKeyState(Landroid/view/View;Landroid/text/Editable;I)V" since="3"/>
+ <method name="getInputType()I" since="3"/>
+ <method name="onKeyDown(Landroid/view/View;Landroid/text/Editable;ILandroid/view/KeyEvent;)Z"/>
+ <method name="onKeyOther(Landroid/view/View;Landroid/text/Editable;Landroid/view/KeyEvent;)Z" since="3"/>
+ <method name="onKeyUp(Landroid/view/View;Landroid/text/Editable;ILandroid/view/KeyEvent;)Z"/>
+ </class>
+ <class name="android/text/method/LinkMovementMethod" since="1">
+ <extends name="android/text/method/ScrollingMovementMethod"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/text/method/MetaKeyKeyListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="adjustMetaAfterKeypress(J)J" since="3"/>
+ <method name="adjustMetaAfterKeypress(Landroid/text/Spannable;)V"/>
+ <method name="clearMetaKeyState(JI)J" since="3"/>
+ <method name="clearMetaKeyState(Landroid/text/Editable;I)V" since="3"/>
+ <method name="clearMetaKeyState(Landroid/view/View;Landroid/text/Editable;I)V" since="3"/>
+ <method name="getMetaState(J)I" since="3"/>
+ <method name="getMetaState(JI)I" since="3"/>
+ <method name="getMetaState(Ljava/lang/CharSequence;)I"/>
+ <method name="getMetaState(Ljava/lang/CharSequence;I)I"/>
+ <method name="getMetaState(Ljava/lang/CharSequence;ILandroid/view/KeyEvent;)I" since="19"/>
+ <method name="getMetaState(Ljava/lang/CharSequence;Landroid/view/KeyEvent;)I" since="19"/>
+ <method name="handleKeyDown(JILandroid/view/KeyEvent;)J" since="3"/>
+ <method name="handleKeyUp(JILandroid/view/KeyEvent;)J" since="3"/>
+ <method name="isMetaTracker(Ljava/lang/CharSequence;Ljava/lang/Object;)Z"/>
+ <method name="isSelectingMetaTracker(Ljava/lang/CharSequence;Ljava/lang/Object;)Z" since="3"/>
+ <method name="onKeyDown(Landroid/view/View;Landroid/text/Editable;ILandroid/view/KeyEvent;)Z"/>
+ <method name="onKeyUp(Landroid/view/View;Landroid/text/Editable;ILandroid/view/KeyEvent;)Z"/>
+ <method name="resetLockedMeta(J)J" since="3"/>
+ <method name="resetLockedMeta(Landroid/text/Spannable;)V"/>
+ <method name="resetMetaState(Landroid/text/Spannable;)V"/>
+ <field name="META_ALT_LOCKED"/>
+ <field name="META_ALT_ON"/>
+ <field name="META_CAP_LOCKED"/>
+ <field name="META_SHIFT_ON"/>
+ <field name="META_SYM_LOCKED"/>
+ <field name="META_SYM_ON"/>
+ </class>
+ <class name="android/text/method/MovementMethod" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="canSelectArbitrarily()Z"/>
+ <method name="initialize(Landroid/widget/TextView;Landroid/text/Spannable;)V"/>
+ <method name="onGenericMotionEvent(Landroid/widget/TextView;Landroid/text/Spannable;Landroid/view/MotionEvent;)Z" since="12"/>
+ <method name="onKeyDown(Landroid/widget/TextView;Landroid/text/Spannable;ILandroid/view/KeyEvent;)Z"/>
+ <method name="onKeyOther(Landroid/widget/TextView;Landroid/text/Spannable;Landroid/view/KeyEvent;)Z" since="3"/>
+ <method name="onKeyUp(Landroid/widget/TextView;Landroid/text/Spannable;ILandroid/view/KeyEvent;)Z"/>
+ <method name="onTakeFocus(Landroid/widget/TextView;Landroid/text/Spannable;I)V"/>
+ <method name="onTouchEvent(Landroid/widget/TextView;Landroid/text/Spannable;Landroid/view/MotionEvent;)Z"/>
+ <method name="onTrackballEvent(Landroid/widget/TextView;Landroid/text/Spannable;Landroid/view/MotionEvent;)Z"/>
+ </class>
+ <class name="android/text/method/MultiTapKeyListener" since="1">
+ <extends name="android/text/method/BaseKeyListener"/>
+ <implements name="android/text/SpanWatcher"/>
+ <method name="&lt;init>(Landroid/text/method/TextKeyListener$Capitalize;Z)V"/>
+ <method name="getInstance(ZLandroid/text/method/TextKeyListener$Capitalize;)Landroid/text/method/MultiTapKeyListener;"/>
+ </class>
+ <class name="android/text/method/NumberKeyListener" since="1">
+ <extends name="android/text/method/BaseKeyListener"/>
+ <implements name="android/text/InputFilter"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAcceptedChars()[C"/>
+ <method name="lookup(Landroid/view/KeyEvent;Landroid/text/Spannable;)I"/>
+ <method name="ok([CC)Z"/>
+ </class>
+ <class name="android/text/method/PasswordTransformationMethod" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/TextWatcher"/>
+ <implements name="android/text/method/TransformationMethod"/>
+ <method name="&lt;init>()V"/>
+ <method name="getInstance()Landroid/text/method/PasswordTransformationMethod;"/>
+ </class>
+ <class name="android/text/method/QwertyKeyListener" since="1">
+ <extends name="android/text/method/BaseKeyListener"/>
+ <method name="&lt;init>(Landroid/text/method/TextKeyListener$Capitalize;Z)V"/>
+ <method name="getInstance(ZLandroid/text/method/TextKeyListener$Capitalize;)Landroid/text/method/QwertyKeyListener;"/>
+ <method name="getInstanceForFullKeyboard()Landroid/text/method/QwertyKeyListener;" since="11"/>
+ <method name="markAsReplaced(Landroid/text/Spannable;IILjava/lang/String;)V"/>
+ </class>
+ <class name="android/text/method/ReplacementTransformationMethod" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/method/TransformationMethod"/>
+ <method name="&lt;init>()V"/>
+ <method name="getOriginal()[C"/>
+ <method name="getReplacement()[C"/>
+ </class>
+ <class name="android/text/method/ScrollingMovementMethod" since="1">
+ <extends name="android/text/method/BaseMovementMethod" since="11"/>
+ <extends name="java/lang/Object" removed="11"/>
+ <implements name="android/text/method/MovementMethod"/>
+ <method name="&lt;init>()V"/>
+ <method name="down(Landroid/widget/TextView;Landroid/text/Spannable;)Z"/>
+ <method name="getInstance()Landroid/text/method/MovementMethod;"/>
+ <method name="left(Landroid/widget/TextView;Landroid/text/Spannable;)Z"/>
+ <method name="right(Landroid/widget/TextView;Landroid/text/Spannable;)Z"/>
+ <method name="up(Landroid/widget/TextView;Landroid/text/Spannable;)Z"/>
+ </class>
+ <class name="android/text/method/SingleLineTransformationMethod" since="1">
+ <extends name="android/text/method/ReplacementTransformationMethod"/>
+ <method name="&lt;init>()V"/>
+ <method name="getInstance()Landroid/text/method/SingleLineTransformationMethod;"/>
+ </class>
+ <class name="android/text/method/TextKeyListener" since="1">
+ <extends name="android/text/method/BaseKeyListener"/>
+ <implements name="android/text/SpanWatcher"/>
+ <method name="&lt;init>(Landroid/text/method/TextKeyListener$Capitalize;Z)V"/>
+ <method name="clear(Landroid/text/Editable;)V"/>
+ <method name="getInstance()Landroid/text/method/TextKeyListener;"/>
+ <method name="getInstance(ZLandroid/text/method/TextKeyListener$Capitalize;)Landroid/text/method/TextKeyListener;"/>
+ <method name="release()V"/>
+ <method name="shouldCap(Landroid/text/method/TextKeyListener$Capitalize;Ljava/lang/CharSequence;I)Z"/>
+ </class>
+ <class name="android/text/method/TextKeyListener$Capitalize" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/text/method/TextKeyListener$Capitalize;"/>
+ <method name="values()[Landroid/text/method/TextKeyListener$Capitalize;"/>
+ <field name="CHARACTERS"/>
+ <field name="NONE"/>
+ <field name="SENTENCES"/>
+ <field name="WORDS"/>
+ </class>
+ <class name="android/text/method/TimeKeyListener" since="1">
+ <extends name="android/text/method/NumberKeyListener"/>
+ <method name="&lt;init>()V" deprecated="26"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V" since="26"/>
+ <method name="getInstance()Landroid/text/method/TimeKeyListener;" deprecated="26"/>
+ <method name="getInstance(Ljava/util/Locale;)Landroid/text/method/TimeKeyListener;" since="26"/>
+ <field name="CHARACTERS" deprecated="26"/>
+ </class>
+ <class name="android/text/method/Touch" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getInitialScrollX(Landroid/widget/TextView;Landroid/text/Spannable;)I" since="3"/>
+ <method name="getInitialScrollY(Landroid/widget/TextView;Landroid/text/Spannable;)I" since="3"/>
+ <method name="onTouchEvent(Landroid/widget/TextView;Landroid/text/Spannable;Landroid/view/MotionEvent;)Z"/>
+ <method name="scrollTo(Landroid/widget/TextView;Landroid/text/Layout;II)V"/>
+ </class>
+ <class name="android/text/method/TransformationMethod" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getTransformation(Ljava/lang/CharSequence;Landroid/view/View;)Ljava/lang/CharSequence;"/>
+ <method name="onFocusChanged(Landroid/view/View;Ljava/lang/CharSequence;ZILandroid/graphics/Rect;)V"/>
+ </class>
+ <class name="android/text/style/AbsoluteSizeSpan" since="1">
+ <extends name="android/text/style/MetricAffectingSpan"/>
+ <implements name="android/text/ParcelableSpan" since="3"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(IZ)V" since="5"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3"/>
+ <method name="getDip()Z" since="5"/>
+ <method name="getSize()I"/>
+ </class>
+ <class name="android/text/style/AlignmentSpan" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/style/ParagraphStyle"/>
+ <method name="getAlignment()Landroid/text/Layout$Alignment;"/>
+ </class>
+ <class name="android/text/style/AlignmentSpan$Standard" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/ParcelableSpan" since="3"/>
+ <implements name="android/text/style/AlignmentSpan"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3"/>
+ <method name="&lt;init>(Landroid/text/Layout$Alignment;)V"/>
+ </class>
+ <class name="android/text/style/BackgroundColorSpan" since="1">
+ <extends name="android/text/style/CharacterStyle"/>
+ <implements name="android/text/ParcelableSpan" since="3"/>
+ <implements name="android/text/style/UpdateAppearance" since="3"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3"/>
+ <method name="getBackgroundColor()I"/>
+ </class>
+ <class name="android/text/style/BulletSpan" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/ParcelableSpan" since="3"/>
+ <implements name="android/text/style/LeadingMarginSpan"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3"/>
+ <field name="STANDARD_GAP_WIDTH"/>
+ </class>
+ <class name="android/text/style/CharacterStyle" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getUnderlying()Landroid/text/style/CharacterStyle;"/>
+ <method name="updateDrawState(Landroid/text/TextPaint;)V"/>
+ <method name="wrap(Landroid/text/style/CharacterStyle;)Landroid/text/style/CharacterStyle;"/>
+ </class>
+ <class name="android/text/style/ClickableSpan" since="1">
+ <extends name="android/text/style/CharacterStyle"/>
+ <implements name="android/text/style/UpdateAppearance" since="3"/>
+ <method name="&lt;init>()V"/>
+ <method name="onClick(Landroid/view/View;)V"/>
+ </class>
+ <class name="android/text/style/DrawableMarginSpan" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/style/LeadingMarginSpan"/>
+ <implements name="android/text/style/LineHeightSpan"/>
+ <method name="&lt;init>(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="&lt;init>(Landroid/graphics/drawable/Drawable;I)V"/>
+ </class>
+ <class name="android/text/style/DynamicDrawableSpan" since="1">
+ <extends name="android/text/style/ReplacementSpan"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V" since="3"/>
+ <method name="getDrawable()Landroid/graphics/drawable/Drawable;"/>
+ <method name="getVerticalAlignment()I" since="3"/>
+ <field name="ALIGN_BASELINE" since="3"/>
+ <field name="ALIGN_BOTTOM" since="3"/>
+ <field name="mVerticalAlignment" since="3"/>
+ </class>
+ <class name="android/text/style/EasyEditSpan" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/ParcelableSpan"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/app/PendingIntent;)V" since="18"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="18"/>
+ <field name="EXTRA_TEXT_CHANGED_TYPE" since="18"/>
+ <field name="TEXT_DELETED" since="18"/>
+ <field name="TEXT_MODIFIED" since="18"/>
+ </class>
+ <class name="android/text/style/ForegroundColorSpan" since="1">
+ <extends name="android/text/style/CharacterStyle"/>
+ <implements name="android/text/ParcelableSpan" since="3"/>
+ <implements name="android/text/style/UpdateAppearance" since="3"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3"/>
+ <method name="getForegroundColor()I"/>
+ </class>
+ <class name="android/text/style/IconMarginSpan" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/style/LeadingMarginSpan"/>
+ <implements name="android/text/style/LineHeightSpan"/>
+ <method name="&lt;init>(Landroid/graphics/Bitmap;)V"/>
+ <method name="&lt;init>(Landroid/graphics/Bitmap;I)V"/>
+ </class>
+ <class name="android/text/style/ImageSpan" since="1">
+ <extends name="android/text/style/DynamicDrawableSpan"/>
+ <method name="&lt;init>(Landroid/content/Context;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;II)V" since="3"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/graphics/Bitmap;)V" since="4"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/graphics/Bitmap;I)V" since="4"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/net/Uri;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/net/Uri;I)V" since="3"/>
+ <method name="&lt;init>(Landroid/graphics/Bitmap;)V" deprecated="16"/>
+ <method name="&lt;init>(Landroid/graphics/Bitmap;I)V" since="3" deprecated="16"/>
+ <method name="&lt;init>(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="&lt;init>(Landroid/graphics/drawable/Drawable;I)V" since="3"/>
+ <method name="&lt;init>(Landroid/graphics/drawable/Drawable;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Landroid/graphics/drawable/Drawable;Ljava/lang/String;I)V" since="3"/>
+ <method name="getSource()Ljava/lang/String;"/>
+ </class>
+ <class name="android/text/style/LeadingMarginSpan" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/style/ParagraphStyle"/>
+ <method name="drawLeadingMargin(Landroid/graphics/Canvas;Landroid/graphics/Paint;IIIIILjava/lang/CharSequence;IIZLandroid/text/Layout;)V"/>
+ <method name="getLeadingMargin(Z)I"/>
+ </class>
+ <class name="android/text/style/LeadingMarginSpan$LeadingMarginSpan2" since="8">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/style/LeadingMarginSpan"/>
+ <implements name="android/text/style/WrapTogetherSpan"/>
+ <method name="getLeadingMarginLineCount()I"/>
+ </class>
+ <class name="android/text/style/LeadingMarginSpan$Standard" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/ParcelableSpan" since="3"/>
+ <implements name="android/text/style/LeadingMarginSpan"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3"/>
+ </class>
+ <class name="android/text/style/LineBackgroundSpan" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/style/ParagraphStyle"/>
+ <method name="drawBackground(Landroid/graphics/Canvas;Landroid/graphics/Paint;IIIIILjava/lang/CharSequence;III)V"/>
+ </class>
+ <class name="android/text/style/LineHeightSpan" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/style/ParagraphStyle"/>
+ <implements name="android/text/style/WrapTogetherSpan"/>
+ <method name="chooseHeight(Ljava/lang/CharSequence;IIIILandroid/graphics/Paint$FontMetricsInt;)V"/>
+ </class>
+ <class name="android/text/style/LineHeightSpan$WithDensity" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/style/LineHeightSpan"/>
+ <method name="chooseHeight(Ljava/lang/CharSequence;IIIILandroid/graphics/Paint$FontMetricsInt;Landroid/text/TextPaint;)V"/>
+ </class>
+ <class name="android/text/style/LocaleSpan" since="17">
+ <extends name="android/text/style/MetricAffectingSpan"/>
+ <implements name="android/text/ParcelableSpan"/>
+ <method name="&lt;init>(Landroid/os/LocaleList;)V" since="24"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V"/>
+ <method name="getLocale()Ljava/util/Locale;"/>
+ <method name="getLocales()Landroid/os/LocaleList;" since="24"/>
+ </class>
+ <class name="android/text/style/MaskFilterSpan" since="1">
+ <extends name="android/text/style/CharacterStyle"/>
+ <implements name="android/text/style/UpdateAppearance" since="3"/>
+ <method name="&lt;init>(Landroid/graphics/MaskFilter;)V"/>
+ <method name="getMaskFilter()Landroid/graphics/MaskFilter;"/>
+ </class>
+ <class name="android/text/style/MetricAffectingSpan" since="1">
+ <extends name="android/text/style/CharacterStyle"/>
+ <implements name="android/text/style/UpdateLayout"/>
+ <method name="&lt;init>()V"/>
+ <method name="getUnderlying()Landroid/text/style/MetricAffectingSpan;"/>
+ <method name="updateMeasureState(Landroid/text/TextPaint;)V"/>
+ </class>
+ <class name="android/text/style/ParagraphStyle" since="1">
+ <extends name="java/lang/Object"/>
+ </class>
+ <class name="android/text/style/QuoteSpan" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/ParcelableSpan" since="3"/>
+ <implements name="android/text/style/LeadingMarginSpan"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3"/>
+ <method name="getColor()I"/>
+ </class>
+ <class name="android/text/style/RasterizerSpan" since="1" removed="26">
+ <extends name="android/text/style/CharacterStyle"/>
+ <implements name="android/text/style/UpdateAppearance" since="3"/>
+ <method name="&lt;init>(Landroid/graphics/Rasterizer;)V"/>
+ <method name="getRasterizer()Landroid/graphics/Rasterizer;"/>
+ </class>
+ <class name="android/text/style/RelativeSizeSpan" since="1">
+ <extends name="android/text/style/MetricAffectingSpan"/>
+ <implements name="android/text/ParcelableSpan" since="3"/>
+ <method name="&lt;init>(F)V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3"/>
+ <method name="getSizeChange()F"/>
+ </class>
+ <class name="android/text/style/ReplacementSpan" since="1">
+ <extends name="android/text/style/MetricAffectingSpan"/>
+ <method name="&lt;init>()V"/>
+ <method name="draw(Landroid/graphics/Canvas;Ljava/lang/CharSequence;IIFIIILandroid/graphics/Paint;)V"/>
+ <method name="getSize(Landroid/graphics/Paint;Ljava/lang/CharSequence;IILandroid/graphics/Paint$FontMetricsInt;)I"/>
+ </class>
+ <class name="android/text/style/ScaleXSpan" since="1">
+ <extends name="android/text/style/MetricAffectingSpan"/>
+ <implements name="android/text/ParcelableSpan" since="3"/>
+ <method name="&lt;init>(F)V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3"/>
+ <method name="getScaleX()F"/>
+ </class>
+ <class name="android/text/style/StrikethroughSpan" since="1">
+ <extends name="android/text/style/CharacterStyle"/>
+ <implements name="android/text/ParcelableSpan" since="3"/>
+ <implements name="android/text/style/UpdateAppearance" since="3"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3"/>
+ </class>
+ <class name="android/text/style/StyleSpan" since="1">
+ <extends name="android/text/style/MetricAffectingSpan"/>
+ <implements name="android/text/ParcelableSpan" since="3"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3"/>
+ <method name="getStyle()I"/>
+ </class>
+ <class name="android/text/style/SubscriptSpan" since="1">
+ <extends name="android/text/style/MetricAffectingSpan"/>
+ <implements name="android/text/ParcelableSpan" since="3"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3"/>
+ </class>
+ <class name="android/text/style/SuggestionSpan" since="14">
+ <extends name="android/text/style/CharacterStyle"/>
+ <implements name="android/text/ParcelableSpan"/>
+ <method name="&lt;init>(Landroid/content/Context;Ljava/util/Locale;[Ljava/lang/String;ILjava/lang/Class;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;[Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="&lt;init>(Ljava/util/Locale;[Ljava/lang/String;I)V"/>
+ <method name="getFlags()I"/>
+ <method name="getLocale()Ljava/lang/String;" deprecated="24"/>
+ <method name="getLocaleObject()Ljava/util/Locale;" since="24"/>
+ <method name="getSuggestions()[Ljava/lang/String;"/>
+ <method name="setFlags(I)V"/>
+ <field name="ACTION_SUGGESTION_PICKED"/>
+ <field name="CREATOR"/>
+ <field name="FLAG_AUTO_CORRECTION" since="15"/>
+ <field name="FLAG_EASY_CORRECT"/>
+ <field name="FLAG_MISSPELLED"/>
+ <field name="SUGGESTIONS_MAX_SIZE"/>
+ <field name="SUGGESTION_SPAN_PICKED_AFTER"/>
+ <field name="SUGGESTION_SPAN_PICKED_BEFORE"/>
+ <field name="SUGGESTION_SPAN_PICKED_HASHCODE"/>
+ </class>
+ <class name="android/text/style/SuperscriptSpan" since="1">
+ <extends name="android/text/style/MetricAffectingSpan"/>
+ <implements name="android/text/ParcelableSpan" since="3"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3"/>
+ </class>
+ <class name="android/text/style/TabStopSpan" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/style/ParagraphStyle"/>
+ <method name="getTabStop()I"/>
+ </class>
+ <class name="android/text/style/TabStopSpan$Standard" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/style/TabStopSpan"/>
+ <method name="&lt;init>(I)V"/>
+ </class>
+ <class name="android/text/style/TextAppearanceSpan" since="1">
+ <extends name="android/text/style/MetricAffectingSpan"/>
+ <implements name="android/text/ParcelableSpan" since="3"/>
+ <method name="&lt;init>(Landroid/content/Context;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;II)V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3"/>
+ <method name="&lt;init>(Ljava/lang/String;IILandroid/content/res/ColorStateList;Landroid/content/res/ColorStateList;)V"/>
+ <method name="getFamily()Ljava/lang/String;"/>
+ <method name="getLinkTextColor()Landroid/content/res/ColorStateList;"/>
+ <method name="getTextColor()Landroid/content/res/ColorStateList;"/>
+ <method name="getTextSize()I"/>
+ <method name="getTextStyle()I"/>
+ </class>
+ <class name="android/text/style/TtsSpan" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/ParcelableSpan"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Landroid/os/PersistableBundle;)V"/>
+ <method name="getArgs()Landroid/os/PersistableBundle;"/>
+ <method name="getType()Ljava/lang/String;"/>
+ <field name="ANIMACY_ANIMATE"/>
+ <field name="ANIMACY_INANIMATE"/>
+ <field name="ARG_ANIMACY"/>
+ <field name="ARG_CASE"/>
+ <field name="ARG_COUNTRY_CODE"/>
+ <field name="ARG_CURRENCY"/>
+ <field name="ARG_DAY"/>
+ <field name="ARG_DENOMINATOR"/>
+ <field name="ARG_DIGITS"/>
+ <field name="ARG_DOMAIN"/>
+ <field name="ARG_EXTENSION"/>
+ <field name="ARG_FRACTIONAL_PART"/>
+ <field name="ARG_FRAGMENT_ID"/>
+ <field name="ARG_GENDER"/>
+ <field name="ARG_HOURS"/>
+ <field name="ARG_INTEGER_PART"/>
+ <field name="ARG_MINUTES"/>
+ <field name="ARG_MONTH"/>
+ <field name="ARG_MULTIPLICITY"/>
+ <field name="ARG_NUMBER"/>
+ <field name="ARG_NUMBER_PARTS"/>
+ <field name="ARG_NUMERATOR"/>
+ <field name="ARG_PASSWORD"/>
+ <field name="ARG_PATH"/>
+ <field name="ARG_PORT"/>
+ <field name="ARG_PROTOCOL"/>
+ <field name="ARG_QUANTITY"/>
+ <field name="ARG_QUERY_STRING"/>
+ <field name="ARG_TEXT"/>
+ <field name="ARG_UNIT"/>
+ <field name="ARG_USERNAME"/>
+ <field name="ARG_VERBATIM"/>
+ <field name="ARG_WEEKDAY"/>
+ <field name="ARG_YEAR"/>
+ <field name="CASE_ABLATIVE"/>
+ <field name="CASE_ACCUSATIVE"/>
+ <field name="CASE_DATIVE"/>
+ <field name="CASE_GENITIVE"/>
+ <field name="CASE_INSTRUMENTAL"/>
+ <field name="CASE_LOCATIVE"/>
+ <field name="CASE_NOMINATIVE"/>
+ <field name="CASE_VOCATIVE"/>
+ <field name="GENDER_FEMALE"/>
+ <field name="GENDER_MALE"/>
+ <field name="GENDER_NEUTRAL"/>
+ <field name="MONTH_APRIL"/>
+ <field name="MONTH_AUGUST"/>
+ <field name="MONTH_DECEMBER"/>
+ <field name="MONTH_FEBRUARY"/>
+ <field name="MONTH_JANUARY"/>
+ <field name="MONTH_JULY"/>
+ <field name="MONTH_JUNE"/>
+ <field name="MONTH_MARCH"/>
+ <field name="MONTH_MAY"/>
+ <field name="MONTH_NOVEMBER"/>
+ <field name="MONTH_OCTOBER"/>
+ <field name="MONTH_SEPTEMBER"/>
+ <field name="MULTIPLICITY_DUAL"/>
+ <field name="MULTIPLICITY_PLURAL"/>
+ <field name="MULTIPLICITY_SINGLE"/>
+ <field name="TYPE_CARDINAL"/>
+ <field name="TYPE_DATE"/>
+ <field name="TYPE_DECIMAL"/>
+ <field name="TYPE_DIGITS"/>
+ <field name="TYPE_ELECTRONIC"/>
+ <field name="TYPE_FRACTION"/>
+ <field name="TYPE_MEASURE"/>
+ <field name="TYPE_MONEY"/>
+ <field name="TYPE_ORDINAL"/>
+ <field name="TYPE_TELEPHONE"/>
+ <field name="TYPE_TEXT"/>
+ <field name="TYPE_TIME"/>
+ <field name="TYPE_VERBATIM"/>
+ <field name="WEEKDAY_FRIDAY"/>
+ <field name="WEEKDAY_MONDAY"/>
+ <field name="WEEKDAY_SATURDAY"/>
+ <field name="WEEKDAY_SUNDAY"/>
+ <field name="WEEKDAY_THURSDAY"/>
+ <field name="WEEKDAY_TUESDAY"/>
+ <field name="WEEKDAY_WEDNESDAY"/>
+ </class>
+ <class name="android/text/style/TtsSpan$Builder" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="build()Landroid/text/style/TtsSpan;"/>
+ <method name="setIntArgument(Ljava/lang/String;I)Landroid/text/style/TtsSpan$Builder;"/>
+ <method name="setLongArgument(Ljava/lang/String;J)Landroid/text/style/TtsSpan$Builder;"/>
+ <method name="setStringArgument(Ljava/lang/String;Ljava/lang/String;)Landroid/text/style/TtsSpan$Builder;"/>
+ </class>
+ <class name="android/text/style/TtsSpan$CardinalBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$SemioticClassBuilder"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(J)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="setNumber(J)Landroid/text/style/TtsSpan$CardinalBuilder;"/>
+ <method name="setNumber(Ljava/lang/String;)Landroid/text/style/TtsSpan$CardinalBuilder;"/>
+ </class>
+ <class name="android/text/style/TtsSpan$DateBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$SemioticClassBuilder"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;)V"/>
+ <method name="setDay(I)Landroid/text/style/TtsSpan$DateBuilder;"/>
+ <method name="setMonth(I)Landroid/text/style/TtsSpan$DateBuilder;"/>
+ <method name="setWeekday(I)Landroid/text/style/TtsSpan$DateBuilder;"/>
+ <method name="setYear(I)Landroid/text/style/TtsSpan$DateBuilder;"/>
+ </class>
+ <class name="android/text/style/TtsSpan$DecimalBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$SemioticClassBuilder"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(DII)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="setArgumentsFromDouble(DII)Landroid/text/style/TtsSpan$DecimalBuilder;"/>
+ <method name="setFractionalPart(Ljava/lang/String;)Landroid/text/style/TtsSpan$DecimalBuilder;"/>
+ <method name="setIntegerPart(J)Landroid/text/style/TtsSpan$DecimalBuilder;"/>
+ <method name="setIntegerPart(Ljava/lang/String;)Landroid/text/style/TtsSpan$DecimalBuilder;"/>
+ </class>
+ <class name="android/text/style/TtsSpan$DigitsBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$SemioticClassBuilder"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="setDigits(Ljava/lang/String;)Landroid/text/style/TtsSpan$DigitsBuilder;"/>
+ </class>
+ <class name="android/text/style/TtsSpan$ElectronicBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$SemioticClassBuilder"/>
+ <method name="&lt;init>()V"/>
+ <method name="setDomain(Ljava/lang/String;)Landroid/text/style/TtsSpan$ElectronicBuilder;"/>
+ <method name="setEmailArguments(Ljava/lang/String;Ljava/lang/String;)Landroid/text/style/TtsSpan$ElectronicBuilder;"/>
+ <method name="setFragmentId(Ljava/lang/String;)Landroid/text/style/TtsSpan$ElectronicBuilder;"/>
+ <method name="setPassword(Ljava/lang/String;)Landroid/text/style/TtsSpan$ElectronicBuilder;"/>
+ <method name="setPath(Ljava/lang/String;)Landroid/text/style/TtsSpan$ElectronicBuilder;"/>
+ <method name="setPort(I)Landroid/text/style/TtsSpan$ElectronicBuilder;"/>
+ <method name="setProtocol(Ljava/lang/String;)Landroid/text/style/TtsSpan$ElectronicBuilder;"/>
+ <method name="setQueryString(Ljava/lang/String;)Landroid/text/style/TtsSpan$ElectronicBuilder;"/>
+ <method name="setUsername(Ljava/lang/String;)Landroid/text/style/TtsSpan$ElectronicBuilder;"/>
+ </class>
+ <class name="android/text/style/TtsSpan$FractionBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$SemioticClassBuilder"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(JJJ)V"/>
+ <method name="setDenominator(J)Landroid/text/style/TtsSpan$FractionBuilder;"/>
+ <method name="setDenominator(Ljava/lang/String;)Landroid/text/style/TtsSpan$FractionBuilder;"/>
+ <method name="setIntegerPart(J)Landroid/text/style/TtsSpan$FractionBuilder;"/>
+ <method name="setIntegerPart(Ljava/lang/String;)Landroid/text/style/TtsSpan$FractionBuilder;"/>
+ <method name="setNumerator(J)Landroid/text/style/TtsSpan$FractionBuilder;"/>
+ <method name="setNumerator(Ljava/lang/String;)Landroid/text/style/TtsSpan$FractionBuilder;"/>
+ </class>
+ <class name="android/text/style/TtsSpan$MeasureBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$SemioticClassBuilder"/>
+ <method name="&lt;init>()V"/>
+ <method name="setDenominator(J)Landroid/text/style/TtsSpan$MeasureBuilder;"/>
+ <method name="setDenominator(Ljava/lang/String;)Landroid/text/style/TtsSpan$MeasureBuilder;"/>
+ <method name="setFractionalPart(Ljava/lang/String;)Landroid/text/style/TtsSpan$MeasureBuilder;"/>
+ <method name="setIntegerPart(J)Landroid/text/style/TtsSpan$MeasureBuilder;"/>
+ <method name="setIntegerPart(Ljava/lang/String;)Landroid/text/style/TtsSpan$MeasureBuilder;"/>
+ <method name="setNumber(J)Landroid/text/style/TtsSpan$MeasureBuilder;"/>
+ <method name="setNumber(Ljava/lang/String;)Landroid/text/style/TtsSpan$MeasureBuilder;"/>
+ <method name="setNumerator(J)Landroid/text/style/TtsSpan$MeasureBuilder;"/>
+ <method name="setNumerator(Ljava/lang/String;)Landroid/text/style/TtsSpan$MeasureBuilder;"/>
+ <method name="setUnit(Ljava/lang/String;)Landroid/text/style/TtsSpan$MeasureBuilder;"/>
+ </class>
+ <class name="android/text/style/TtsSpan$MoneyBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$SemioticClassBuilder"/>
+ <method name="&lt;init>()V"/>
+ <method name="setCurrency(Ljava/lang/String;)Landroid/text/style/TtsSpan$MoneyBuilder;"/>
+ <method name="setFractionalPart(Ljava/lang/String;)Landroid/text/style/TtsSpan$MoneyBuilder;"/>
+ <method name="setIntegerPart(J)Landroid/text/style/TtsSpan$MoneyBuilder;"/>
+ <method name="setIntegerPart(Ljava/lang/String;)Landroid/text/style/TtsSpan$MoneyBuilder;"/>
+ <method name="setQuantity(Ljava/lang/String;)Landroid/text/style/TtsSpan$MoneyBuilder;"/>
+ </class>
+ <class name="android/text/style/TtsSpan$OrdinalBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$SemioticClassBuilder"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(J)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="setNumber(J)Landroid/text/style/TtsSpan$OrdinalBuilder;"/>
+ <method name="setNumber(Ljava/lang/String;)Landroid/text/style/TtsSpan$OrdinalBuilder;"/>
+ </class>
+ <class name="android/text/style/TtsSpan$SemioticClassBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$Builder"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="setAnimacy(Ljava/lang/String;)Landroid/text/style/TtsSpan$SemioticClassBuilder;"/>
+ <method name="setCase(Ljava/lang/String;)Landroid/text/style/TtsSpan$SemioticClassBuilder;"/>
+ <method name="setGender(Ljava/lang/String;)Landroid/text/style/TtsSpan$SemioticClassBuilder;"/>
+ <method name="setMultiplicity(Ljava/lang/String;)Landroid/text/style/TtsSpan$SemioticClassBuilder;"/>
+ </class>
+ <class name="android/text/style/TtsSpan$TelephoneBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$SemioticClassBuilder"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="setCountryCode(Ljava/lang/String;)Landroid/text/style/TtsSpan$TelephoneBuilder;"/>
+ <method name="setExtension(Ljava/lang/String;)Landroid/text/style/TtsSpan$TelephoneBuilder;"/>
+ <method name="setNumberParts(Ljava/lang/String;)Landroid/text/style/TtsSpan$TelephoneBuilder;"/>
+ </class>
+ <class name="android/text/style/TtsSpan$TextBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$SemioticClassBuilder"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="setText(Ljava/lang/String;)Landroid/text/style/TtsSpan$TextBuilder;"/>
+ </class>
+ <class name="android/text/style/TtsSpan$TimeBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$SemioticClassBuilder"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="setHours(I)Landroid/text/style/TtsSpan$TimeBuilder;"/>
+ <method name="setMinutes(I)Landroid/text/style/TtsSpan$TimeBuilder;"/>
+ </class>
+ <class name="android/text/style/TtsSpan$VerbatimBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$SemioticClassBuilder"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="setVerbatim(Ljava/lang/String;)Landroid/text/style/TtsSpan$VerbatimBuilder;"/>
+ </class>
+ <class name="android/text/style/TypefaceSpan" since="1">
+ <extends name="android/text/style/MetricAffectingSpan"/>
+ <implements name="android/text/ParcelableSpan" since="3"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getFamily()Ljava/lang/String;"/>
+ </class>
+ <class name="android/text/style/URLSpan" since="1">
+ <extends name="android/text/style/ClickableSpan"/>
+ <implements name="android/text/ParcelableSpan" since="3"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getURL()Ljava/lang/String;"/>
+ </class>
+ <class name="android/text/style/UnderlineSpan" since="1">
+ <extends name="android/text/style/CharacterStyle"/>
+ <implements name="android/text/ParcelableSpan" since="3"/>
+ <implements name="android/text/style/UpdateAppearance" since="3"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3"/>
+ </class>
+ <class name="android/text/style/UpdateAppearance" since="3">
+ <extends name="java/lang/Object"/>
+ </class>
+ <class name="android/text/style/UpdateLayout" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/style/UpdateAppearance" since="3"/>
+ </class>
+ <class name="android/text/style/WrapTogetherSpan" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/text/style/ParagraphStyle"/>
+ </class>
+ <class name="android/text/util/Linkify" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addLinks(Landroid/text/Spannable;I)Z"/>
+ <method name="addLinks(Landroid/text/Spannable;Ljava/util/regex/Pattern;Ljava/lang/String;)Z"/>
+ <method name="addLinks(Landroid/text/Spannable;Ljava/util/regex/Pattern;Ljava/lang/String;Landroid/text/util/Linkify$MatchFilter;Landroid/text/util/Linkify$TransformFilter;)Z"/>
+ <method name="addLinks(Landroid/text/Spannable;Ljava/util/regex/Pattern;Ljava/lang/String;[Ljava/lang/String;Landroid/text/util/Linkify$MatchFilter;Landroid/text/util/Linkify$TransformFilter;)Z" since="24"/>
+ <method name="addLinks(Landroid/widget/TextView;I)Z"/>
+ <method name="addLinks(Landroid/widget/TextView;Ljava/util/regex/Pattern;Ljava/lang/String;)V"/>
+ <method name="addLinks(Landroid/widget/TextView;Ljava/util/regex/Pattern;Ljava/lang/String;Landroid/text/util/Linkify$MatchFilter;Landroid/text/util/Linkify$TransformFilter;)V"/>
+ <method name="addLinks(Landroid/widget/TextView;Ljava/util/regex/Pattern;Ljava/lang/String;[Ljava/lang/String;Landroid/text/util/Linkify$MatchFilter;Landroid/text/util/Linkify$TransformFilter;)V" since="24"/>
+ <field name="ALL"/>
+ <field name="EMAIL_ADDRESSES"/>
+ <field name="MAP_ADDRESSES"/>
+ <field name="PHONE_NUMBERS"/>
+ <field name="WEB_URLS"/>
+ <field name="sPhoneNumberMatchFilter"/>
+ <field name="sPhoneNumberTransformFilter"/>
+ <field name="sUrlMatchFilter"/>
+ </class>
+ <class name="android/text/util/Linkify$MatchFilter" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="acceptMatch(Ljava/lang/CharSequence;II)Z"/>
+ </class>
+ <class name="android/text/util/Linkify$TransformFilter" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="transformUrl(Ljava/util/regex/Matcher;Ljava/lang/String;)Ljava/lang/String;"/>
+ </class>
+ <class name="android/text/util/Rfc822Token" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="getAddress()Ljava/lang/String;"/>
+ <method name="getComment()Ljava/lang/String;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="quoteComment(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="quoteName(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="quoteNameIfNecessary(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="setAddress(Ljava/lang/String;)V"/>
+ <method name="setComment(Ljava/lang/String;)V"/>
+ <method name="setName(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/text/util/Rfc822Tokenizer" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/widget/MultiAutoCompleteTextView$Tokenizer"/>
+ <method name="&lt;init>()V"/>
+ <method name="tokenize(Ljava/lang/CharSequence;)[Landroid/text/util/Rfc822Token;"/>
+ <method name="tokenize(Ljava/lang/CharSequence;Ljava/util/Collection;)V" since="8"/>
+ </class>
+ <class name="android/transition/ArcMotion" since="21">
+ <extends name="android/transition/PathMotion"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="getMaximumAngle()F"/>
+ <method name="getMinimumHorizontalAngle()F"/>
+ <method name="getMinimumVerticalAngle()F"/>
+ <method name="setMaximumAngle(F)V"/>
+ <method name="setMinimumHorizontalAngle(F)V"/>
+ <method name="setMinimumVerticalAngle(F)V"/>
+ </class>
+ <class name="android/transition/AutoTransition" since="19">
+ <extends name="android/transition/TransitionSet"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" since="21"/>
+ </class>
+ <class name="android/transition/ChangeBounds" since="19">
+ <extends name="android/transition/Transition"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" since="21"/>
+ <method name="getResizeClip()Z" since="22"/>
+ <method name="setReparent(Z)V" deprecated="21"/>
+ <method name="setResizeClip(Z)V"/>
+ </class>
+ <class name="android/transition/ChangeClipBounds" since="21">
+ <extends name="android/transition/Transition"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ </class>
+ <class name="android/transition/ChangeImageTransform" since="21">
+ <extends name="android/transition/Transition"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ </class>
+ <class name="android/transition/ChangeScroll" since="23">
+ <extends name="android/transition/Transition"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ </class>
+ <class name="android/transition/ChangeTransform" since="21">
+ <extends name="android/transition/Transition"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="getReparent()Z"/>
+ <method name="getReparentWithOverlay()Z"/>
+ <method name="setReparent(Z)V"/>
+ <method name="setReparentWithOverlay(Z)V"/>
+ </class>
+ <class name="android/transition/CircularPropagation" since="21">
+ <extends name="android/transition/VisibilityPropagation"/>
+ <method name="&lt;init>()V"/>
+ <method name="setPropagationSpeed(F)V"/>
+ </class>
+ <class name="android/transition/Explode" since="21">
+ <extends name="android/transition/Visibility"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ </class>
+ <class name="android/transition/Fade" since="19">
+ <extends name="android/transition/Visibility"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" since="21"/>
+ <field name="IN"/>
+ <field name="OUT"/>
+ </class>
+ <class name="android/transition/PathMotion" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="getPath(FFFF)Landroid/graphics/Path;"/>
+ </class>
+ <class name="android/transition/PatternPathMotion" since="21">
+ <extends name="android/transition/PathMotion"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/graphics/Path;)V"/>
+ <method name="getPatternPath()Landroid/graphics/Path;"/>
+ <method name="setPatternPath(Landroid/graphics/Path;)V"/>
+ </class>
+ <class name="android/transition/Scene" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup;)V"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup;Landroid/view/View;)V" since="21"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup;Landroid/view/ViewGroup;)V" deprecated="21"/>
+ <method name="enter()V"/>
+ <method name="exit()V"/>
+ <method name="getSceneForLayout(Landroid/view/ViewGroup;ILandroid/content/Context;)Landroid/transition/Scene;"/>
+ <method name="getSceneRoot()Landroid/view/ViewGroup;"/>
+ <method name="setEnterAction(Ljava/lang/Runnable;)V"/>
+ <method name="setExitAction(Ljava/lang/Runnable;)V"/>
+ </class>
+ <class name="android/transition/SidePropagation" since="21">
+ <extends name="android/transition/VisibilityPropagation"/>
+ <method name="&lt;init>()V"/>
+ <method name="setPropagationSpeed(F)V"/>
+ <method name="setSide(I)V"/>
+ </class>
+ <class name="android/transition/Slide" since="21">
+ <extends name="android/transition/Visibility"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="getSlideEdge()I"/>
+ <method name="setSlideEdge(I)V"/>
+ </class>
+ <class name="android/transition/Transition" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" since="21"/>
+ <method name="addListener(Landroid/transition/Transition$TransitionListener;)Landroid/transition/Transition;"/>
+ <method name="addTarget(I)Landroid/transition/Transition;"/>
+ <method name="addTarget(Landroid/view/View;)Landroid/transition/Transition;"/>
+ <method name="addTarget(Ljava/lang/Class;)Landroid/transition/Transition;" since="21"/>
+ <method name="addTarget(Ljava/lang/String;)Landroid/transition/Transition;" since="21"/>
+ <method name="canRemoveViews()Z" since="21"/>
+ <method name="captureEndValues(Landroid/transition/TransitionValues;)V"/>
+ <method name="captureStartValues(Landroid/transition/TransitionValues;)V"/>
+ <method name="clone()Landroid/transition/Transition;"/>
+ <method name="createAnimator(Landroid/view/ViewGroup;Landroid/transition/TransitionValues;Landroid/transition/TransitionValues;)Landroid/animation/Animator;"/>
+ <method name="excludeChildren(IZ)Landroid/transition/Transition;"/>
+ <method name="excludeChildren(Landroid/view/View;Z)Landroid/transition/Transition;"/>
+ <method name="excludeChildren(Ljava/lang/Class;Z)Landroid/transition/Transition;"/>
+ <method name="excludeTarget(IZ)Landroid/transition/Transition;"/>
+ <method name="excludeTarget(Landroid/view/View;Z)Landroid/transition/Transition;"/>
+ <method name="excludeTarget(Ljava/lang/Class;Z)Landroid/transition/Transition;"/>
+ <method name="excludeTarget(Ljava/lang/String;Z)Landroid/transition/Transition;" since="21"/>
+ <method name="getDuration()J"/>
+ <method name="getEpicenter()Landroid/graphics/Rect;" since="21"/>
+ <method name="getEpicenterCallback()Landroid/transition/Transition$EpicenterCallback;" since="21"/>
+ <method name="getInterpolator()Landroid/animation/TimeInterpolator;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getPathMotion()Landroid/transition/PathMotion;" since="21"/>
+ <method name="getPropagation()Landroid/transition/TransitionPropagation;" since="21"/>
+ <method name="getStartDelay()J"/>
+ <method name="getTargetIds()Ljava/util/List;"/>
+ <method name="getTargetNames()Ljava/util/List;" since="21"/>
+ <method name="getTargetTypes()Ljava/util/List;" since="21"/>
+ <method name="getTargets()Ljava/util/List;"/>
+ <method name="getTransitionProperties()[Ljava/lang/String;"/>
+ <method name="getTransitionValues(Landroid/view/View;Z)Landroid/transition/TransitionValues;"/>
+ <method name="isTransitionRequired(Landroid/transition/TransitionValues;Landroid/transition/TransitionValues;)Z" since="23"/>
+ <method name="removeListener(Landroid/transition/Transition$TransitionListener;)Landroid/transition/Transition;"/>
+ <method name="removeTarget(I)Landroid/transition/Transition;"/>
+ <method name="removeTarget(Landroid/view/View;)Landroid/transition/Transition;"/>
+ <method name="removeTarget(Ljava/lang/Class;)Landroid/transition/Transition;" since="21"/>
+ <method name="removeTarget(Ljava/lang/String;)Landroid/transition/Transition;" since="21"/>
+ <method name="setDuration(J)Landroid/transition/Transition;"/>
+ <method name="setEpicenterCallback(Landroid/transition/Transition$EpicenterCallback;)V" since="21"/>
+ <method name="setInterpolator(Landroid/animation/TimeInterpolator;)Landroid/transition/Transition;"/>
+ <method name="setMatchOrder([I)V" since="21"/>
+ <method name="setPathMotion(Landroid/transition/PathMotion;)V" since="21"/>
+ <method name="setPropagation(Landroid/transition/TransitionPropagation;)V" since="21"/>
+ <method name="setStartDelay(J)Landroid/transition/Transition;"/>
+ <field name="MATCH_ID" since="21"/>
+ <field name="MATCH_INSTANCE" since="21"/>
+ <field name="MATCH_ITEM_ID" since="21"/>
+ <field name="MATCH_NAME" since="21"/>
+ </class>
+ <class name="android/transition/Transition$EpicenterCallback" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onGetEpicenter(Landroid/transition/Transition;)Landroid/graphics/Rect;"/>
+ </class>
+ <class name="android/transition/Transition$TransitionListener" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="onTransitionCancel(Landroid/transition/Transition;)V"/>
+ <method name="onTransitionEnd(Landroid/transition/Transition;)V"/>
+ <method name="onTransitionPause(Landroid/transition/Transition;)V"/>
+ <method name="onTransitionResume(Landroid/transition/Transition;)V"/>
+ <method name="onTransitionStart(Landroid/transition/Transition;)V"/>
+ </class>
+ <class name="android/transition/TransitionInflater" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="from(Landroid/content/Context;)Landroid/transition/TransitionInflater;"/>
+ <method name="inflateTransition(I)Landroid/transition/Transition;"/>
+ <method name="inflateTransitionManager(ILandroid/view/ViewGroup;)Landroid/transition/TransitionManager;"/>
+ </class>
+ <class name="android/transition/TransitionListenerAdapter" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/transition/Transition$TransitionListener"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/transition/TransitionManager" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="beginDelayedTransition(Landroid/view/ViewGroup;)V"/>
+ <method name="beginDelayedTransition(Landroid/view/ViewGroup;Landroid/transition/Transition;)V"/>
+ <method name="endTransitions(Landroid/view/ViewGroup;)V" since="23"/>
+ <method name="go(Landroid/transition/Scene;)V"/>
+ <method name="go(Landroid/transition/Scene;Landroid/transition/Transition;)V"/>
+ <method name="setTransition(Landroid/transition/Scene;Landroid/transition/Scene;Landroid/transition/Transition;)V"/>
+ <method name="setTransition(Landroid/transition/Scene;Landroid/transition/Transition;)V"/>
+ <method name="transitionTo(Landroid/transition/Scene;)V"/>
+ </class>
+ <class name="android/transition/TransitionPropagation" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="captureValues(Landroid/transition/TransitionValues;)V"/>
+ <method name="getPropagationProperties()[Ljava/lang/String;"/>
+ <method name="getStartDelay(Landroid/view/ViewGroup;Landroid/transition/Transition;Landroid/transition/TransitionValues;Landroid/transition/TransitionValues;)J"/>
+ </class>
+ <class name="android/transition/TransitionSet" since="19">
+ <extends name="android/transition/Transition"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" since="21"/>
+ <method name="addListener(Landroid/transition/Transition$TransitionListener;)Landroid/transition/TransitionSet;"/>
+ <method name="addTarget(I)Landroid/transition/TransitionSet;"/>
+ <method name="addTarget(Landroid/view/View;)Landroid/transition/TransitionSet;"/>
+ <method name="addTarget(Ljava/lang/Class;)Landroid/transition/TransitionSet;" since="21"/>
+ <method name="addTarget(Ljava/lang/String;)Landroid/transition/TransitionSet;" since="21"/>
+ <method name="addTransition(Landroid/transition/Transition;)Landroid/transition/TransitionSet;"/>
+ <method name="clone()Landroid/transition/TransitionSet;"/>
+ <method name="getOrdering()I"/>
+ <method name="getTransitionAt(I)Landroid/transition/Transition;" since="21"/>
+ <method name="getTransitionCount()I" since="21"/>
+ <method name="removeListener(Landroid/transition/Transition$TransitionListener;)Landroid/transition/TransitionSet;"/>
+ <method name="removeTarget(I)Landroid/transition/TransitionSet;"/>
+ <method name="removeTarget(Landroid/view/View;)Landroid/transition/TransitionSet;"/>
+ <method name="removeTarget(Ljava/lang/Class;)Landroid/transition/TransitionSet;" since="21"/>
+ <method name="removeTarget(Ljava/lang/String;)Landroid/transition/TransitionSet;" since="21"/>
+ <method name="removeTransition(Landroid/transition/Transition;)Landroid/transition/TransitionSet;"/>
+ <method name="setDuration(J)Landroid/transition/TransitionSet;"/>
+ <method name="setInterpolator(Landroid/animation/TimeInterpolator;)Landroid/transition/TransitionSet;"/>
+ <method name="setOrdering(I)Landroid/transition/TransitionSet;"/>
+ <method name="setStartDelay(J)Landroid/transition/TransitionSet;"/>
+ <field name="ORDERING_SEQUENTIAL"/>
+ <field name="ORDERING_TOGETHER"/>
+ </class>
+ <class name="android/transition/TransitionValues" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="values"/>
+ <field name="view"/>
+ </class>
+ <class name="android/transition/Visibility" since="19">
+ <extends name="android/transition/Transition"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" since="21"/>
+ <method name="getMode()I" since="21"/>
+ <method name="isVisible(Landroid/transition/TransitionValues;)Z"/>
+ <method name="onAppear(Landroid/view/ViewGroup;Landroid/transition/TransitionValues;ILandroid/transition/TransitionValues;I)Landroid/animation/Animator;"/>
+ <method name="onAppear(Landroid/view/ViewGroup;Landroid/view/View;Landroid/transition/TransitionValues;Landroid/transition/TransitionValues;)Landroid/animation/Animator;" since="21"/>
+ <method name="onDisappear(Landroid/view/ViewGroup;Landroid/transition/TransitionValues;ILandroid/transition/TransitionValues;I)Landroid/animation/Animator;"/>
+ <method name="onDisappear(Landroid/view/ViewGroup;Landroid/view/View;Landroid/transition/TransitionValues;Landroid/transition/TransitionValues;)Landroid/animation/Animator;" since="21"/>
+ <method name="setMode(I)V" since="21"/>
+ <field name="MODE_IN" since="21"/>
+ <field name="MODE_OUT" since="21"/>
+ </class>
+ <class name="android/transition/VisibilityPropagation" since="21">
+ <extends name="android/transition/TransitionPropagation"/>
+ <method name="&lt;init>()V"/>
+ <method name="getViewVisibility(Landroid/transition/TransitionValues;)I"/>
+ <method name="getViewX(Landroid/transition/TransitionValues;)I"/>
+ <method name="getViewY(Landroid/transition/TransitionValues;)I"/>
+ </class>
+ <class name="android/util/AndroidException" since="1">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/Exception;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" since="11"/>
+ </class>
+ <class name="android/util/AndroidRuntimeException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/Exception;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" since="11"/>
+ </class>
+ <class name="android/util/ArrayMap" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Map"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Landroid/util/ArrayMap;)V"/>
+ <method name="containsAll(Ljava/util/Collection;)Z"/>
+ <method name="ensureCapacity(I)V"/>
+ <method name="indexOfKey(Ljava/lang/Object;)I" since="21"/>
+ <method name="keyAt(I)Ljava/lang/Object;"/>
+ <method name="putAll(Landroid/util/ArrayMap;)V"/>
+ <method name="removeAll(Ljava/util/Collection;)Z"/>
+ <method name="removeAt(I)Ljava/lang/Object;"/>
+ <method name="retainAll(Ljava/util/Collection;)Z"/>
+ <method name="setValueAt(ILjava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="valueAt(I)Ljava/lang/Object;"/>
+ </class>
+ <class name="android/util/ArraySet" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Collection"/>
+ <implements name="java/util/Set"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Landroid/util/ArraySet;)V"/>
+ <method name="addAll(Landroid/util/ArraySet;)V"/>
+ <method name="ensureCapacity(I)V"/>
+ <method name="indexOf(Ljava/lang/Object;)I"/>
+ <method name="removeAll(Landroid/util/ArraySet;)Z"/>
+ <method name="removeAt(I)Ljava/lang/Object;"/>
+ <method name="valueAt(I)Ljava/lang/Object;"/>
+ </class>
+ <class name="android/util/AtomicFile" since="17">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/io/File;)V"/>
+ <method name="delete()V"/>
+ <method name="failWrite(Ljava/io/FileOutputStream;)V"/>
+ <method name="finishWrite(Ljava/io/FileOutputStream;)V"/>
+ <method name="getBaseFile()Ljava/io/File;"/>
+ <method name="openRead()Ljava/io/FileInputStream;"/>
+ <method name="readFully()[B"/>
+ <method name="startWrite()Ljava/io/FileOutputStream;"/>
+ </class>
+ <class name="android/util/AttributeSet" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getAttributeBooleanValue(IZ)Z"/>
+ <method name="getAttributeBooleanValue(Ljava/lang/String;Ljava/lang/String;Z)Z"/>
+ <method name="getAttributeCount()I"/>
+ <method name="getAttributeFloatValue(IF)F"/>
+ <method name="getAttributeFloatValue(Ljava/lang/String;Ljava/lang/String;F)F"/>
+ <method name="getAttributeIntValue(II)I"/>
+ <method name="getAttributeIntValue(Ljava/lang/String;Ljava/lang/String;I)I"/>
+ <method name="getAttributeListValue(I[Ljava/lang/String;I)I"/>
+ <method name="getAttributeListValue(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;I)I"/>
+ <method name="getAttributeName(I)Ljava/lang/String;"/>
+ <method name="getAttributeNameResource(I)I"/>
+ <method name="getAttributeResourceValue(II)I"/>
+ <method name="getAttributeResourceValue(Ljava/lang/String;Ljava/lang/String;I)I"/>
+ <method name="getAttributeUnsignedIntValue(II)I"/>
+ <method name="getAttributeUnsignedIntValue(Ljava/lang/String;Ljava/lang/String;I)I"/>
+ <method name="getAttributeValue(I)Ljava/lang/String;"/>
+ <method name="getAttributeValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getClassAttribute()Ljava/lang/String;"/>
+ <method name="getIdAttribute()Ljava/lang/String;"/>
+ <method name="getIdAttributeResourceValue(I)I"/>
+ <method name="getPositionDescription()Ljava/lang/String;"/>
+ <method name="getStyleAttribute()I"/>
+ </class>
+ <class name="android/util/Base64" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="decode(Ljava/lang/String;I)[B"/>
+ <method name="decode([BI)[B"/>
+ <method name="decode([BIII)[B"/>
+ <method name="encode([BI)[B"/>
+ <method name="encode([BIII)[B"/>
+ <method name="encodeToString([BI)Ljava/lang/String;"/>
+ <method name="encodeToString([BIII)Ljava/lang/String;"/>
+ <field name="CRLF"/>
+ <field name="DEFAULT"/>
+ <field name="NO_CLOSE"/>
+ <field name="NO_PADDING"/>
+ <field name="NO_WRAP"/>
+ <field name="URL_SAFE"/>
+ </class>
+ <class name="android/util/Base64DataException" since="11">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/util/Base64InputStream" since="8">
+ <extends name="java/io/FilterInputStream"/>
+ <method name="&lt;init>(Ljava/io/InputStream;I)V"/>
+ </class>
+ <class name="android/util/Base64OutputStream" since="8">
+ <extends name="java/io/FilterOutputStream"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;I)V"/>
+ </class>
+ <class name="android/util/Config" since="1" deprecated="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="DEBUG" deprecated="16"/>
+ <field name="LOGD" deprecated="16"/>
+ <field name="LOGV" deprecated="16"/>
+ <field name="PROFILE" deprecated="16"/>
+ <field name="RELEASE" deprecated="16"/>
+ </class>
+ <class name="android/util/DebugUtils" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="isObjectSelected(Ljava/lang/Object;)Z"/>
+ </class>
+ <class name="android/util/DisplayMetrics" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="equals(Landroid/util/DisplayMetrics;)Z" since="17"/>
+ <method name="setTo(Landroid/util/DisplayMetrics;)V"/>
+ <method name="setToDefaults()V"/>
+ <field name="DENSITY_260" since="25"/>
+ <field name="DENSITY_280" since="22"/>
+ <field name="DENSITY_300" since="25"/>
+ <field name="DENSITY_340" since="25"/>
+ <field name="DENSITY_360" since="23"/>
+ <field name="DENSITY_400" since="19"/>
+ <field name="DENSITY_420" since="23"/>
+ <field name="DENSITY_560" since="21"/>
+ <field name="DENSITY_DEFAULT" since="4"/>
+ <field name="DENSITY_DEVICE_STABLE" since="24"/>
+ <field name="DENSITY_HIGH" since="4"/>
+ <field name="DENSITY_LOW" since="4"/>
+ <field name="DENSITY_MEDIUM" since="4"/>
+ <field name="DENSITY_TV" since="13"/>
+ <field name="DENSITY_XHIGH" since="9"/>
+ <field name="DENSITY_XXHIGH" since="16"/>
+ <field name="DENSITY_XXXHIGH" since="18"/>
+ <field name="density"/>
+ <field name="densityDpi" since="4"/>
+ <field name="heightPixels"/>
+ <field name="scaledDensity"/>
+ <field name="widthPixels"/>
+ <field name="xdpi"/>
+ <field name="ydpi"/>
+ </class>
+ <class name="android/util/EventLog" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getTagCode(Ljava/lang/String;)I"/>
+ <method name="getTagName(I)Ljava/lang/String;"/>
+ <method name="readEvents([ILjava/util/Collection;)V"/>
+ <method name="writeEvent(IF)I" since="23"/>
+ <method name="writeEvent(II)I"/>
+ <method name="writeEvent(IJ)I"/>
+ <method name="writeEvent(ILjava/lang/String;)I"/>
+ <method name="writeEvent(I[Ljava/lang/Object;)I"/>
+ </class>
+ <class name="android/util/EventLog$Event" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getData()Ljava/lang/Object;"/>
+ <method name="getProcessId()I"/>
+ <method name="getTag()I"/>
+ <method name="getThreadId()I"/>
+ <method name="getTimeNanos()J"/>
+ </class>
+ <class name="android/util/EventLogTags" since="1" deprecated="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/io/BufferedReader;)V"/>
+ <method name="get(I)Landroid/util/EventLogTags$Description;"/>
+ <method name="get(Ljava/lang/String;)Landroid/util/EventLogTags$Description;"/>
+ </class>
+ <class name="android/util/EventLogTags$Description" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="mName"/>
+ <field name="mTag"/>
+ </class>
+ <class name="android/util/FloatMath" since="1" deprecated="22">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="ceil(F)F" removed="23"/>
+ <method name="cos(F)F" removed="23"/>
+ <method name="exp(F)F" since="17" removed="23"/>
+ <method name="floor(F)F" removed="23"/>
+ <method name="hypot(FF)F" since="17" removed="23"/>
+ <method name="pow(FF)F" since="17" removed="23"/>
+ <method name="sin(F)F" removed="23"/>
+ <method name="sqrt(F)F" removed="23"/>
+ </class>
+ <class name="android/util/FloatProperty" since="24">
+ <extends name="android/util/Property"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="set(Ljava/lang/Object;Ljava/lang/Float;)V"/>
+ <method name="setValue(Ljava/lang/Object;F)V"/>
+ </class>
+ <class name="android/util/Half" since="26">
+ <extends name="java/lang/Number"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>(D)V"/>
+ <method name="&lt;init>(F)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(S)V"/>
+ <method name="abs(S)S"/>
+ <method name="ceil(S)S"/>
+ <method name="compare(SS)I"/>
+ <method name="compareTo(Landroid/util/Half;)I"/>
+ <method name="copySign(SS)S"/>
+ <method name="equals(SS)Z"/>
+ <method name="floor(S)S"/>
+ <method name="getExponent(S)I"/>
+ <method name="getSign(S)I"/>
+ <method name="getSignificand(S)I"/>
+ <method name="greater(SS)Z"/>
+ <method name="greaterEquals(SS)Z"/>
+ <method name="halfToIntBits(S)I"/>
+ <method name="halfToRawIntBits(S)I"/>
+ <method name="halfToShortBits(S)S"/>
+ <method name="halfValue()S"/>
+ <method name="hashCode(S)I"/>
+ <method name="intBitsToHalf(I)S"/>
+ <method name="isInfinite(S)Z"/>
+ <method name="isNaN()Z"/>
+ <method name="isNaN(S)Z"/>
+ <method name="isNormalized(S)Z"/>
+ <method name="less(SS)Z"/>
+ <method name="lessEquals(SS)Z"/>
+ <method name="max(SS)S"/>
+ <method name="min(SS)S"/>
+ <method name="parseHalf(Ljava/lang/String;)S"/>
+ <method name="round(S)S"/>
+ <method name="toFloat(S)F"/>
+ <method name="toHalf(F)S"/>
+ <method name="toHexString(S)Ljava/lang/String;"/>
+ <method name="toString(S)Ljava/lang/String;"/>
+ <method name="trunc(S)S"/>
+ <method name="valueOf(F)Landroid/util/Half;"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/util/Half;"/>
+ <method name="valueOf(S)Landroid/util/Half;"/>
+ <field name="EPSILON"/>
+ <field name="LOWEST_VALUE"/>
+ <field name="MAX_EXPONENT"/>
+ <field name="MAX_VALUE"/>
+ <field name="MIN_EXPONENT"/>
+ <field name="MIN_NORMAL"/>
+ <field name="MIN_VALUE"/>
+ <field name="NEGATIVE_INFINITY"/>
+ <field name="NEGATIVE_ZERO"/>
+ <field name="NaN"/>
+ <field name="POSITIVE_INFINITY"/>
+ <field name="POSITIVE_ZERO"/>
+ <field name="SIZE"/>
+ </class>
+ <class name="android/util/IntProperty" since="24">
+ <extends name="android/util/Property"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="set(Ljava/lang/Object;Ljava/lang/Integer;)V"/>
+ <method name="setValue(Ljava/lang/Object;I)V"/>
+ </class>
+ <class name="android/util/JsonReader" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable"/>
+ <method name="&lt;init>(Ljava/io/Reader;)V"/>
+ <method name="beginArray()V"/>
+ <method name="beginObject()V"/>
+ <method name="endArray()V"/>
+ <method name="endObject()V"/>
+ <method name="hasNext()Z"/>
+ <method name="isLenient()Z"/>
+ <method name="nextBoolean()Z"/>
+ <method name="nextDouble()D"/>
+ <method name="nextInt()I"/>
+ <method name="nextLong()J"/>
+ <method name="nextName()Ljava/lang/String;"/>
+ <method name="nextNull()V"/>
+ <method name="nextString()Ljava/lang/String;"/>
+ <method name="peek()Landroid/util/JsonToken;"/>
+ <method name="setLenient(Z)V"/>
+ <method name="skipValue()V"/>
+ </class>
+ <class name="android/util/JsonToken" since="11">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/util/JsonToken;"/>
+ <method name="values()[Landroid/util/JsonToken;"/>
+ <field name="BEGIN_ARRAY"/>
+ <field name="BEGIN_OBJECT"/>
+ <field name="BOOLEAN"/>
+ <field name="END_ARRAY"/>
+ <field name="END_DOCUMENT"/>
+ <field name="END_OBJECT"/>
+ <field name="NAME"/>
+ <field name="NULL"/>
+ <field name="NUMBER"/>
+ <field name="STRING"/>
+ </class>
+ <class name="android/util/JsonWriter" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable"/>
+ <method name="&lt;init>(Ljava/io/Writer;)V"/>
+ <method name="beginArray()Landroid/util/JsonWriter;"/>
+ <method name="beginObject()Landroid/util/JsonWriter;"/>
+ <method name="endArray()Landroid/util/JsonWriter;"/>
+ <method name="endObject()Landroid/util/JsonWriter;"/>
+ <method name="flush()V"/>
+ <method name="isLenient()Z"/>
+ <method name="name(Ljava/lang/String;)Landroid/util/JsonWriter;"/>
+ <method name="nullValue()Landroid/util/JsonWriter;"/>
+ <method name="setIndent(Ljava/lang/String;)V"/>
+ <method name="setLenient(Z)V"/>
+ <method name="value(D)Landroid/util/JsonWriter;"/>
+ <method name="value(J)Landroid/util/JsonWriter;"/>
+ <method name="value(Ljava/lang/Number;)Landroid/util/JsonWriter;"/>
+ <method name="value(Ljava/lang/String;)Landroid/util/JsonWriter;"/>
+ <method name="value(Z)Landroid/util/JsonWriter;"/>
+ </class>
+ <class name="android/util/LayoutDirection" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="INHERIT"/>
+ <field name="LOCALE"/>
+ <field name="LTR"/>
+ <field name="RTL"/>
+ </class>
+ <class name="android/util/Log" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="d(Ljava/lang/String;Ljava/lang/String;)I"/>
+ <method name="d(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I"/>
+ <method name="e(Ljava/lang/String;Ljava/lang/String;)I"/>
+ <method name="e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I"/>
+ <method name="getStackTraceString(Ljava/lang/Throwable;)Ljava/lang/String;"/>
+ <method name="i(Ljava/lang/String;Ljava/lang/String;)I"/>
+ <method name="i(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I"/>
+ <method name="isLoggable(Ljava/lang/String;I)Z"/>
+ <method name="println(ILjava/lang/String;Ljava/lang/String;)I"/>
+ <method name="v(Ljava/lang/String;Ljava/lang/String;)I"/>
+ <method name="v(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I"/>
+ <method name="w(Ljava/lang/String;Ljava/lang/String;)I"/>
+ <method name="w(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I"/>
+ <method name="w(Ljava/lang/String;Ljava/lang/Throwable;)I"/>
+ <method name="wtf(Ljava/lang/String;Ljava/lang/String;)I" since="8"/>
+ <method name="wtf(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I" since="8"/>
+ <method name="wtf(Ljava/lang/String;Ljava/lang/Throwable;)I" since="8"/>
+ <field name="ASSERT"/>
+ <field name="DEBUG"/>
+ <field name="ERROR"/>
+ <field name="INFO"/>
+ <field name="VERBOSE"/>
+ <field name="WARN"/>
+ </class>
+ <class name="android/util/LogPrinter" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/util/Printer"/>
+ <method name="&lt;init>(ILjava/lang/String;)V"/>
+ </class>
+ <class name="android/util/LongSparseArray" since="16">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="append(JLjava/lang/Object;)V"/>
+ <method name="clear()V"/>
+ <method name="clone()Landroid/util/LongSparseArray;"/>
+ <method name="delete(J)V"/>
+ <method name="get(J)Ljava/lang/Object;"/>
+ <method name="get(JLjava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="indexOfKey(J)I"/>
+ <method name="indexOfValue(Ljava/lang/Object;)I"/>
+ <method name="keyAt(I)J"/>
+ <method name="put(JLjava/lang/Object;)V"/>
+ <method name="remove(J)V"/>
+ <method name="removeAt(I)V"/>
+ <method name="setValueAt(ILjava/lang/Object;)V"/>
+ <method name="size()I"/>
+ <method name="valueAt(I)Ljava/lang/Object;"/>
+ </class>
+ <class name="android/util/LruCache" since="12">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="create(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="createCount()I"/>
+ <method name="entryRemoved(ZLjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V"/>
+ <method name="evictAll()V"/>
+ <method name="evictionCount()I"/>
+ <method name="get(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="hitCount()I"/>
+ <method name="maxSize()I"/>
+ <method name="missCount()I"/>
+ <method name="put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="putCount()I"/>
+ <method name="remove(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="resize(I)V" since="21"/>
+ <method name="size()I"/>
+ <method name="sizeOf(Ljava/lang/Object;Ljava/lang/Object;)I"/>
+ <method name="snapshot()Ljava/util/Map;"/>
+ <method name="trimToSize(I)V" since="17"/>
+ </class>
+ <class name="android/util/MalformedJsonException" since="11">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/util/MonthDisplayHelper" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="&lt;init>(III)V"/>
+ <method name="getColumnOf(I)I"/>
+ <method name="getDayAt(II)I"/>
+ <method name="getDigitsForRow(I)[I"/>
+ <method name="getFirstDayOfMonth()I"/>
+ <method name="getMonth()I"/>
+ <method name="getNumberOfDaysInMonth()I"/>
+ <method name="getOffset()I"/>
+ <method name="getRowOf(I)I"/>
+ <method name="getWeekStartDay()I"/>
+ <method name="getYear()I"/>
+ <method name="isWithinCurrentMonth(II)Z"/>
+ <method name="nextMonth()V"/>
+ <method name="previousMonth()V"/>
+ </class>
+ <class name="android/util/MutableBoolean" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Z)V"/>
+ <field name="value"/>
+ </class>
+ <class name="android/util/MutableByte" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(B)V"/>
+ <field name="value"/>
+ </class>
+ <class name="android/util/MutableChar" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(C)V"/>
+ <field name="value"/>
+ </class>
+ <class name="android/util/MutableDouble" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(D)V"/>
+ <field name="value"/>
+ </class>
+ <class name="android/util/MutableFloat" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(F)V"/>
+ <field name="value"/>
+ </class>
+ <class name="android/util/MutableInt" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(I)V"/>
+ <field name="value"/>
+ </class>
+ <class name="android/util/MutableLong" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(J)V"/>
+ <field name="value"/>
+ </class>
+ <class name="android/util/MutableShort" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(S)V"/>
+ <field name="value"/>
+ </class>
+ <class name="android/util/NoSuchPropertyException" since="14">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/util/Pair" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/Object;Ljava/lang/Object;)V"/>
+ <method name="create(Ljava/lang/Object;Ljava/lang/Object;)Landroid/util/Pair;"/>
+ <field name="first"/>
+ <field name="second"/>
+ </class>
+ <class name="android/util/Patterns" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="concatGroups(Ljava/util/regex/Matcher;)Ljava/lang/String;"/>
+ <method name="digitsAndPlusOnly(Ljava/util/regex/Matcher;)Ljava/lang/String;"/>
+ <field name="DOMAIN_NAME"/>
+ <field name="EMAIL_ADDRESS"/>
+ <field name="GOOD_IRI_CHAR" deprecated="24"/>
+ <field name="IP_ADDRESS"/>
+ <field name="PHONE"/>
+ <field name="TOP_LEVEL_DOMAIN" deprecated="21"/>
+ <field name="TOP_LEVEL_DOMAIN_STR" deprecated="21"/>
+ <field name="TOP_LEVEL_DOMAIN_STR_FOR_WEB_URL" deprecated="21"/>
+ <field name="WEB_URL"/>
+ </class>
+ <class name="android/util/PrintStreamPrinter" since="3">
+ <extends name="java/lang/Object"/>
+ <implements name="android/util/Printer"/>
+ <method name="&lt;init>(Ljava/io/PrintStream;)V"/>
+ </class>
+ <class name="android/util/PrintWriterPrinter" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/util/Printer"/>
+ <method name="&lt;init>(Ljava/io/PrintWriter;)V"/>
+ </class>
+ <class name="android/util/Printer" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="println(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/util/Property" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/Class;Ljava/lang/String;)V"/>
+ <method name="get(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getType()Ljava/lang/Class;"/>
+ <method name="isReadOnly()Z"/>
+ <method name="of(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/String;)Landroid/util/Property;"/>
+ <method name="set(Ljava/lang/Object;Ljava/lang/Object;)V"/>
+ </class>
+ <class name="android/util/Range" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/Comparable;Ljava/lang/Comparable;)V"/>
+ <method name="clamp(Ljava/lang/Comparable;)Ljava/lang/Comparable;"/>
+ <method name="contains(Landroid/util/Range;)Z"/>
+ <method name="contains(Ljava/lang/Comparable;)Z"/>
+ <method name="create(Ljava/lang/Comparable;Ljava/lang/Comparable;)Landroid/util/Range;"/>
+ <method name="extend(Landroid/util/Range;)Landroid/util/Range;"/>
+ <method name="extend(Ljava/lang/Comparable;)Landroid/util/Range;"/>
+ <method name="extend(Ljava/lang/Comparable;Ljava/lang/Comparable;)Landroid/util/Range;"/>
+ <method name="getLower()Ljava/lang/Comparable;"/>
+ <method name="getUpper()Ljava/lang/Comparable;"/>
+ <method name="intersect(Landroid/util/Range;)Landroid/util/Range;"/>
+ <method name="intersect(Ljava/lang/Comparable;Ljava/lang/Comparable;)Landroid/util/Range;"/>
+ </class>
+ <class name="android/util/Rational" since="21">
+ <extends name="java/lang/Number"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="compareTo(Landroid/util/Rational;)I"/>
+ <method name="getDenominator()I"/>
+ <method name="getNumerator()I"/>
+ <method name="isFinite()Z"/>
+ <method name="isInfinite()Z"/>
+ <method name="isNaN()Z"/>
+ <method name="isZero()Z"/>
+ <method name="parseRational(Ljava/lang/String;)Landroid/util/Rational;"/>
+ <field name="NEGATIVE_INFINITY"/>
+ <field name="NaN"/>
+ <field name="POSITIVE_INFINITY"/>
+ <field name="ZERO"/>
+ </class>
+ <class name="android/util/Size" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="getHeight()I"/>
+ <method name="getWidth()I"/>
+ <method name="parseSize(Ljava/lang/String;)Landroid/util/Size;"/>
+ </class>
+ <class name="android/util/SizeF" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(FF)V"/>
+ <method name="getHeight()F"/>
+ <method name="getWidth()F"/>
+ <method name="parseSizeF(Ljava/lang/String;)Landroid/util/SizeF;"/>
+ </class>
+ <class name="android/util/SparseArray" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable" since="14"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="append(ILjava/lang/Object;)V"/>
+ <method name="clear()V"/>
+ <method name="clone()Landroid/util/SparseArray;" since="14"/>
+ <method name="delete(I)V"/>
+ <method name="get(I)Ljava/lang/Object;"/>
+ <method name="get(ILjava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="indexOfKey(I)I"/>
+ <method name="indexOfValue(Ljava/lang/Object;)I"/>
+ <method name="keyAt(I)I"/>
+ <method name="put(ILjava/lang/Object;)V"/>
+ <method name="remove(I)V"/>
+ <method name="removeAt(I)V" since="11"/>
+ <method name="removeAtRange(II)V" since="19"/>
+ <method name="setValueAt(ILjava/lang/Object;)V"/>
+ <method name="size()I"/>
+ <method name="valueAt(I)Ljava/lang/Object;"/>
+ </class>
+ <class name="android/util/SparseBooleanArray" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable" since="14"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="append(IZ)V"/>
+ <method name="clear()V"/>
+ <method name="clone()Landroid/util/SparseBooleanArray;" since="14"/>
+ <method name="delete(I)V"/>
+ <method name="get(I)Z"/>
+ <method name="get(IZ)Z"/>
+ <method name="indexOfKey(I)I"/>
+ <method name="indexOfValue(Z)I"/>
+ <method name="keyAt(I)I"/>
+ <method name="put(IZ)V"/>
+ <method name="size()I"/>
+ <method name="valueAt(I)Z"/>
+ </class>
+ <class name="android/util/SparseIntArray" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable" since="14"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="append(II)V"/>
+ <method name="clear()V"/>
+ <method name="clone()Landroid/util/SparseIntArray;" since="14"/>
+ <method name="delete(I)V"/>
+ <method name="get(I)I"/>
+ <method name="get(II)I"/>
+ <method name="indexOfKey(I)I"/>
+ <method name="indexOfValue(I)I"/>
+ <method name="keyAt(I)I"/>
+ <method name="put(II)V"/>
+ <method name="removeAt(I)V" since="3"/>
+ <method name="size()I"/>
+ <method name="valueAt(I)I"/>
+ </class>
+ <class name="android/util/SparseLongArray" since="18">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="append(IJ)V"/>
+ <method name="clear()V"/>
+ <method name="clone()Landroid/util/SparseLongArray;"/>
+ <method name="delete(I)V"/>
+ <method name="get(I)J"/>
+ <method name="get(IJ)J"/>
+ <method name="indexOfKey(I)I"/>
+ <method name="indexOfValue(J)I"/>
+ <method name="keyAt(I)I"/>
+ <method name="put(IJ)V"/>
+ <method name="removeAt(I)V"/>
+ <method name="size()I"/>
+ <method name="valueAt(I)J"/>
+ </class>
+ <class name="android/util/StateSet" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="dump([I)Ljava/lang/String;"/>
+ <method name="isWildCard([I)Z"/>
+ <method name="stateSetMatches([II)Z"/>
+ <method name="stateSetMatches([I[I)Z"/>
+ <method name="trimStateSet([II)[I"/>
+ <field name="NOTHING" since="11"/>
+ <field name="WILD_CARD"/>
+ </class>
+ <class name="android/util/StringBuilderPrinter" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/util/Printer"/>
+ <method name="&lt;init>(Ljava/lang/StringBuilder;)V"/>
+ </class>
+ <class name="android/util/TimeFormatException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/util/TimeUtils" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getTimeZone(IZJLjava/lang/String;)Ljava/util/TimeZone;"/>
+ <method name="getTimeZoneDatabaseVersion()Ljava/lang/String;" since="3"/>
+ </class>
+ <class name="android/util/TimingLogger" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="addSplit(Ljava/lang/String;)V"/>
+ <method name="dumpToLog()V"/>
+ <method name="reset()V"/>
+ <method name="reset(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/util/TypedValue" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="applyDimension(IFLandroid/util/DisplayMetrics;)F"/>
+ <method name="coerceToString()Ljava/lang/CharSequence;"/>
+ <method name="coerceToString(II)Ljava/lang/String;"/>
+ <method name="complexToDimension(ILandroid/util/DisplayMetrics;)F"/>
+ <method name="complexToDimensionNoisy(ILandroid/util/DisplayMetrics;)F" removed="20"/>
+ <method name="complexToDimensionPixelOffset(ILandroid/util/DisplayMetrics;)I"/>
+ <method name="complexToDimensionPixelSize(ILandroid/util/DisplayMetrics;)I"/>
+ <method name="complexToFloat(I)F"/>
+ <method name="complexToFraction(IFF)F"/>
+ <method name="getComplexUnit()I" since="22"/>
+ <method name="getDimension(Landroid/util/DisplayMetrics;)F"/>
+ <method name="getFloat()F"/>
+ <method name="getFraction(FF)F"/>
+ <method name="setTo(Landroid/util/TypedValue;)V"/>
+ <field name="COMPLEX_MANTISSA_MASK"/>
+ <field name="COMPLEX_MANTISSA_SHIFT"/>
+ <field name="COMPLEX_RADIX_0p23"/>
+ <field name="COMPLEX_RADIX_16p7"/>
+ <field name="COMPLEX_RADIX_23p0"/>
+ <field name="COMPLEX_RADIX_8p15"/>
+ <field name="COMPLEX_RADIX_MASK"/>
+ <field name="COMPLEX_RADIX_SHIFT"/>
+ <field name="COMPLEX_UNIT_DIP"/>
+ <field name="COMPLEX_UNIT_FRACTION"/>
+ <field name="COMPLEX_UNIT_FRACTION_PARENT"/>
+ <field name="COMPLEX_UNIT_IN"/>
+ <field name="COMPLEX_UNIT_MASK"/>
+ <field name="COMPLEX_UNIT_MM"/>
+ <field name="COMPLEX_UNIT_PT"/>
+ <field name="COMPLEX_UNIT_PX"/>
+ <field name="COMPLEX_UNIT_SHIFT"/>
+ <field name="COMPLEX_UNIT_SP"/>
+ <field name="DATA_NULL_EMPTY" since="22"/>
+ <field name="DATA_NULL_UNDEFINED" since="22"/>
+ <field name="DENSITY_DEFAULT" since="4"/>
+ <field name="DENSITY_NONE" since="4"/>
+ <field name="TYPE_ATTRIBUTE"/>
+ <field name="TYPE_DIMENSION"/>
+ <field name="TYPE_FIRST_COLOR_INT"/>
+ <field name="TYPE_FIRST_INT"/>
+ <field name="TYPE_FLOAT"/>
+ <field name="TYPE_FRACTION"/>
+ <field name="TYPE_INT_BOOLEAN"/>
+ <field name="TYPE_INT_COLOR_ARGB4"/>
+ <field name="TYPE_INT_COLOR_ARGB8"/>
+ <field name="TYPE_INT_COLOR_RGB4"/>
+ <field name="TYPE_INT_COLOR_RGB8"/>
+ <field name="TYPE_INT_DEC"/>
+ <field name="TYPE_INT_HEX"/>
+ <field name="TYPE_LAST_COLOR_INT"/>
+ <field name="TYPE_LAST_INT"/>
+ <field name="TYPE_NULL"/>
+ <field name="TYPE_REFERENCE"/>
+ <field name="TYPE_STRING"/>
+ <field name="assetCookie"/>
+ <field name="changingConfigurations"/>
+ <field name="data"/>
+ <field name="density" since="4"/>
+ <field name="resourceId"/>
+ <field name="string"/>
+ <field name="type"/>
+ </class>
+ <class name="android/util/Xml" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="asAttributeSet(Lorg/xmlpull/v1/XmlPullParser;)Landroid/util/AttributeSet;"/>
+ <method name="findEncodingByName(Ljava/lang/String;)Landroid/util/Xml$Encoding;"/>
+ <method name="newPullParser()Lorg/xmlpull/v1/XmlPullParser;"/>
+ <method name="newSerializer()Lorg/xmlpull/v1/XmlSerializer;"/>
+ <method name="parse(Ljava/io/InputStream;Landroid/util/Xml$Encoding;Lorg/xml/sax/ContentHandler;)V"/>
+ <method name="parse(Ljava/io/Reader;Lorg/xml/sax/ContentHandler;)V"/>
+ <method name="parse(Ljava/lang/String;Lorg/xml/sax/ContentHandler;)V"/>
+ <field name="FEATURE_RELAXED"/>
+ </class>
+ <class name="android/util/Xml$Encoding" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/util/Xml$Encoding;"/>
+ <method name="values()[Landroid/util/Xml$Encoding;"/>
+ <field name="ISO_8859_1"/>
+ <field name="US_ASCII"/>
+ <field name="UTF_16"/>
+ <field name="UTF_8"/>
+ </class>
+ <class name="android/view/AbsSavedState" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;Ljava/lang/ClassLoader;)V" since="24"/>
+ <method name="&lt;init>(Landroid/os/Parcelable;)V"/>
+ <method name="getSuperState()Landroid/os/Parcelable;"/>
+ <field name="CREATOR"/>
+ <field name="EMPTY_STATE"/>
+ </class>
+ <class name="android/view/ActionMode" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="finish()V"/>
+ <method name="getCustomView()Landroid/view/View;"/>
+ <method name="getMenu()Landroid/view/Menu;"/>
+ <method name="getMenuInflater()Landroid/view/MenuInflater;"/>
+ <method name="getSubtitle()Ljava/lang/CharSequence;"/>
+ <method name="getTag()Ljava/lang/Object;" since="14"/>
+ <method name="getTitle()Ljava/lang/CharSequence;"/>
+ <method name="getTitleOptionalHint()Z" since="16"/>
+ <method name="getType()I" since="23"/>
+ <method name="hide(J)V" since="23"/>
+ <method name="invalidate()V"/>
+ <method name="invalidateContentRect()V" since="23"/>
+ <method name="isTitleOptional()Z" since="16"/>
+ <method name="onWindowFocusChanged(Z)V" since="23"/>
+ <method name="setCustomView(Landroid/view/View;)V"/>
+ <method name="setSubtitle(I)V"/>
+ <method name="setSubtitle(Ljava/lang/CharSequence;)V"/>
+ <method name="setTag(Ljava/lang/Object;)V" since="14"/>
+ <method name="setTitle(I)V"/>
+ <method name="setTitle(Ljava/lang/CharSequence;)V"/>
+ <method name="setTitleOptionalHint(Z)V" since="16"/>
+ <method name="setType(I)V" since="23"/>
+ <field name="DEFAULT_HIDE_DURATION" since="23"/>
+ <field name="TYPE_FLOATING" since="23"/>
+ <field name="TYPE_PRIMARY" since="23"/>
+ </class>
+ <class name="android/view/ActionMode$Callback" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="onActionItemClicked(Landroid/view/ActionMode;Landroid/view/MenuItem;)Z"/>
+ <method name="onCreateActionMode(Landroid/view/ActionMode;Landroid/view/Menu;)Z"/>
+ <method name="onDestroyActionMode(Landroid/view/ActionMode;)V"/>
+ <method name="onPrepareActionMode(Landroid/view/ActionMode;Landroid/view/Menu;)Z"/>
+ </class>
+ <class name="android/view/ActionMode$Callback2" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/view/ActionMode$Callback"/>
+ <method name="&lt;init>()V"/>
+ <method name="onGetContentRect(Landroid/view/ActionMode;Landroid/view/View;Landroid/graphics/Rect;)V"/>
+ </class>
+ <class name="android/view/ActionProvider" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="hasSubMenu()Z"/>
+ <method name="isVisible()Z" since="16"/>
+ <method name="onCreateActionView()Landroid/view/View;" deprecated="16"/>
+ <method name="onCreateActionView(Landroid/view/MenuItem;)Landroid/view/View;" since="16"/>
+ <method name="onPerformDefaultAction()Z"/>
+ <method name="onPrepareSubMenu(Landroid/view/SubMenu;)V"/>
+ <method name="overridesItemVisibility()Z" since="16"/>
+ <method name="refreshVisibility()V" since="16"/>
+ <method name="setVisibilityListener(Landroid/view/ActionProvider$VisibilityListener;)V" since="16"/>
+ </class>
+ <class name="android/view/ActionProvider$VisibilityListener" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="onActionProviderVisibilityChanged(Z)V"/>
+ </class>
+ <class name="android/view/Choreographer" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getInstance()Landroid/view/Choreographer;"/>
+ <method name="postFrameCallback(Landroid/view/Choreographer$FrameCallback;)V"/>
+ <method name="postFrameCallbackDelayed(Landroid/view/Choreographer$FrameCallback;J)V"/>
+ <method name="removeFrameCallback(Landroid/view/Choreographer$FrameCallback;)V"/>
+ </class>
+ <class name="android/view/Choreographer$FrameCallback" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="doFrame(J)V"/>
+ </class>
+ <class name="android/view/CollapsibleActionView" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="onActionViewCollapsed()V"/>
+ <method name="onActionViewExpanded()V"/>
+ </class>
+ <class name="android/view/ContextMenu" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/view/Menu"/>
+ <method name="clearHeader()V"/>
+ <method name="setHeaderIcon(I)Landroid/view/ContextMenu;"/>
+ <method name="setHeaderIcon(Landroid/graphics/drawable/Drawable;)Landroid/view/ContextMenu;"/>
+ <method name="setHeaderTitle(I)Landroid/view/ContextMenu;"/>
+ <method name="setHeaderTitle(Ljava/lang/CharSequence;)Landroid/view/ContextMenu;"/>
+ <method name="setHeaderView(Landroid/view/View;)Landroid/view/ContextMenu;"/>
+ </class>
+ <class name="android/view/ContextMenu$ContextMenuInfo" since="1">
+ <extends name="java/lang/Object"/>
+ </class>
+ <class name="android/view/ContextThemeWrapper" since="1">
+ <extends name="android/content/ContextWrapper"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/Context;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/content/res/Resources$Theme;)V" since="23"/>
+ <method name="applyOverrideConfiguration(Landroid/content/res/Configuration;)V" since="17"/>
+ <method name="onApplyThemeResource(Landroid/content/res/Resources$Theme;IZ)V"/>
+ </class>
+ <class name="android/view/Display" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAppVsyncOffsetNanos()J" since="21"/>
+ <method name="getCurrentSizeRange(Landroid/graphics/Point;Landroid/graphics/Point;)V" since="16"/>
+ <method name="getDisplayId()I"/>
+ <method name="getFlags()I" since="17"/>
+ <method name="getHdrCapabilities()Landroid/view/Display$HdrCapabilities;" since="24"/>
+ <method name="getHeight()I" deprecated="16"/>
+ <method name="getMetrics(Landroid/util/DisplayMetrics;)V"/>
+ <method name="getMode()Landroid/view/Display$Mode;" since="23"/>
+ <method name="getName()Ljava/lang/String;" since="17"/>
+ <method name="getOrientation()I" deprecated="16"/>
+ <method name="getPixelFormat()I" deprecated="17"/>
+ <method name="getPresentationDeadlineNanos()J" since="21"/>
+ <method name="getRealMetrics(Landroid/util/DisplayMetrics;)V" since="17"/>
+ <method name="getRealSize(Landroid/graphics/Point;)V" since="17"/>
+ <method name="getRectSize(Landroid/graphics/Rect;)V" since="13"/>
+ <method name="getRefreshRate()F"/>
+ <method name="getRotation()I" since="8"/>
+ <method name="getSize(Landroid/graphics/Point;)V" since="13"/>
+ <method name="getState()I" since="20"/>
+ <method name="getSupportedModes()[Landroid/view/Display$Mode;" since="23"/>
+ <method name="getSupportedRefreshRates()[F" since="21" deprecated="23"/>
+ <method name="getWidth()I" deprecated="16"/>
+ <method name="isHdr()Z" since="26"/>
+ <method name="isValid()Z" since="17"/>
+ <method name="isWideColorGamut()Z" since="26"/>
+ <field name="DEFAULT_DISPLAY"/>
+ <field name="FLAG_PRESENTATION" since="19"/>
+ <field name="FLAG_PRIVATE" since="19"/>
+ <field name="FLAG_ROUND" since="23"/>
+ <field name="FLAG_SECURE" since="17"/>
+ <field name="FLAG_SUPPORTS_PROTECTED_BUFFERS" since="17"/>
+ <field name="INVALID_DISPLAY" since="23"/>
+ <field name="STATE_DOZE" since="21"/>
+ <field name="STATE_DOZE_SUSPEND" since="21"/>
+ <field name="STATE_DOZING" since="20" removed="21"/>
+ <field name="STATE_OFF" since="20"/>
+ <field name="STATE_ON" since="20"/>
+ <field name="STATE_UNKNOWN" since="20"/>
+ <field name="STATE_VR" since="26"/>
+ </class>
+ <class name="android/view/Display$HdrCapabilities" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDesiredMaxAverageLuminance()F"/>
+ <method name="getDesiredMaxLuminance()F"/>
+ <method name="getDesiredMinLuminance()F"/>
+ <method name="getSupportedHdrTypes()[I"/>
+ <field name="CREATOR"/>
+ <field name="HDR_TYPE_DOLBY_VISION"/>
+ <field name="HDR_TYPE_HDR10"/>
+ <field name="HDR_TYPE_HLG"/>
+ <field name="INVALID_LUMINANCE"/>
+ </class>
+ <class name="android/view/Display$Mode" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getModeId()I"/>
+ <method name="getPhysicalHeight()I"/>
+ <method name="getPhysicalWidth()I"/>
+ <method name="getRefreshRate()F"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/view/DragAndDropPermissions" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable" since="25"/>
+ <method name="&lt;init>()V"/>
+ <method name="release()V"/>
+ <field name="CREATOR" since="25"/>
+ </class>
+ <class name="android/view/DragEvent" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAction()I"/>
+ <method name="getClipData()Landroid/content/ClipData;"/>
+ <method name="getClipDescription()Landroid/content/ClipDescription;"/>
+ <method name="getLocalState()Ljava/lang/Object;"/>
+ <method name="getResult()Z"/>
+ <method name="getX()F"/>
+ <method name="getY()F"/>
+ <field name="ACTION_DRAG_ENDED"/>
+ <field name="ACTION_DRAG_ENTERED"/>
+ <field name="ACTION_DRAG_EXITED"/>
+ <field name="ACTION_DRAG_LOCATION"/>
+ <field name="ACTION_DRAG_STARTED"/>
+ <field name="ACTION_DROP"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/view/FocusFinder" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="findNearestTouchable(Landroid/view/ViewGroup;III[I)Landroid/view/View;"/>
+ <method name="findNextFocus(Landroid/view/ViewGroup;Landroid/view/View;I)Landroid/view/View;"/>
+ <method name="findNextFocusFromRect(Landroid/view/ViewGroup;Landroid/graphics/Rect;I)Landroid/view/View;"/>
+ <method name="findNextKeyboardNavigationCluster(Landroid/view/View;Landroid/view/View;I)Landroid/view/View;" since="26"/>
+ <method name="getInstance()Landroid/view/FocusFinder;"/>
+ </class>
+ <class name="android/view/FrameMetrics" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/view/FrameMetrics;)V"/>
+ <method name="getMetric(I)J"/>
+ <field name="ANIMATION_DURATION"/>
+ <field name="COMMAND_ISSUE_DURATION"/>
+ <field name="DRAW_DURATION"/>
+ <field name="FIRST_DRAW_FRAME"/>
+ <field name="INPUT_HANDLING_DURATION"/>
+ <field name="INTENDED_VSYNC_TIMESTAMP" since="26"/>
+ <field name="LAYOUT_MEASURE_DURATION"/>
+ <field name="SWAP_BUFFERS_DURATION"/>
+ <field name="SYNC_DURATION"/>
+ <field name="TOTAL_DURATION"/>
+ <field name="UNKNOWN_DELAY_DURATION"/>
+ <field name="VSYNC_TIMESTAMP" since="26"/>
+ </class>
+ <class name="android/view/FrameStats" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getEndTimeNano()J"/>
+ <method name="getFrameCount()I"/>
+ <method name="getFramePresentedTimeNano(I)J"/>
+ <method name="getRefreshPeriodNano()J"/>
+ <method name="getStartTimeNano()J"/>
+ <field name="UNDEFINED_TIME_NANO"/>
+ </class>
+ <class name="android/view/GestureDetector" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/GestureDetector$OnGestureListener;)V" since="3"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/GestureDetector$OnGestureListener;Landroid/os/Handler;)V" since="3"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/GestureDetector$OnGestureListener;Landroid/os/Handler;Z)V" since="8"/>
+ <method name="&lt;init>(Landroid/view/GestureDetector$OnGestureListener;)V" deprecated="16"/>
+ <method name="&lt;init>(Landroid/view/GestureDetector$OnGestureListener;Landroid/os/Handler;)V" deprecated="16"/>
+ <method name="isLongpressEnabled()Z"/>
+ <method name="onGenericMotionEvent(Landroid/view/MotionEvent;)Z" since="23"/>
+ <method name="onTouchEvent(Landroid/view/MotionEvent;)Z"/>
+ <method name="setContextClickListener(Landroid/view/GestureDetector$OnContextClickListener;)V" since="23"/>
+ <method name="setIsLongpressEnabled(Z)V"/>
+ <method name="setOnDoubleTapListener(Landroid/view/GestureDetector$OnDoubleTapListener;)V" since="3"/>
+ </class>
+ <class name="android/view/GestureDetector$OnContextClickListener" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="onContextClick(Landroid/view/MotionEvent;)Z"/>
+ </class>
+ <class name="android/view/GestureDetector$OnDoubleTapListener" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="onDoubleTap(Landroid/view/MotionEvent;)Z"/>
+ <method name="onDoubleTapEvent(Landroid/view/MotionEvent;)Z"/>
+ <method name="onSingleTapConfirmed(Landroid/view/MotionEvent;)Z"/>
+ </class>
+ <class name="android/view/GestureDetector$OnGestureListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onDown(Landroid/view/MotionEvent;)Z"/>
+ <method name="onFling(Landroid/view/MotionEvent;Landroid/view/MotionEvent;FF)Z"/>
+ <method name="onLongPress(Landroid/view/MotionEvent;)V"/>
+ <method name="onScroll(Landroid/view/MotionEvent;Landroid/view/MotionEvent;FF)Z"/>
+ <method name="onShowPress(Landroid/view/MotionEvent;)V"/>
+ <method name="onSingleTapUp(Landroid/view/MotionEvent;)Z"/>
+ </class>
+ <class name="android/view/GestureDetector$SimpleOnGestureListener" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/view/GestureDetector$OnContextClickListener" since="23"/>
+ <implements name="android/view/GestureDetector$OnDoubleTapListener" since="3"/>
+ <implements name="android/view/GestureDetector$OnGestureListener"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/view/Gravity" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="apply(IIILandroid/graphics/Rect;IILandroid/graphics/Rect;)V"/>
+ <method name="apply(IIILandroid/graphics/Rect;IILandroid/graphics/Rect;I)V" since="17"/>
+ <method name="apply(IIILandroid/graphics/Rect;Landroid/graphics/Rect;)V"/>
+ <method name="apply(IIILandroid/graphics/Rect;Landroid/graphics/Rect;I)V" since="17"/>
+ <method name="applyDisplay(ILandroid/graphics/Rect;Landroid/graphics/Rect;)V" since="3"/>
+ <method name="applyDisplay(ILandroid/graphics/Rect;Landroid/graphics/Rect;I)V" since="17"/>
+ <method name="getAbsoluteGravity(II)I" since="14"/>
+ <method name="isHorizontal(I)Z"/>
+ <method name="isVertical(I)Z"/>
+ <field name="AXIS_CLIP" since="3"/>
+ <field name="AXIS_PULL_AFTER"/>
+ <field name="AXIS_PULL_BEFORE"/>
+ <field name="AXIS_SPECIFIED"/>
+ <field name="AXIS_X_SHIFT"/>
+ <field name="AXIS_Y_SHIFT"/>
+ <field name="BOTTOM"/>
+ <field name="CENTER"/>
+ <field name="CENTER_HORIZONTAL"/>
+ <field name="CENTER_VERTICAL"/>
+ <field name="CLIP_HORIZONTAL" since="3"/>
+ <field name="CLIP_VERTICAL" since="3"/>
+ <field name="DISPLAY_CLIP_HORIZONTAL" since="3"/>
+ <field name="DISPLAY_CLIP_VERTICAL" since="3"/>
+ <field name="END" since="14"/>
+ <field name="FILL"/>
+ <field name="FILL_HORIZONTAL"/>
+ <field name="FILL_VERTICAL"/>
+ <field name="HORIZONTAL_GRAVITY_MASK"/>
+ <field name="LEFT"/>
+ <field name="NO_GRAVITY"/>
+ <field name="RELATIVE_HORIZONTAL_GRAVITY_MASK" since="14"/>
+ <field name="RELATIVE_LAYOUT_DIRECTION" since="14"/>
+ <field name="RIGHT"/>
+ <field name="START" since="14"/>
+ <field name="TOP"/>
+ <field name="VERTICAL_GRAVITY_MASK"/>
+ </class>
+ <class name="android/view/HapticFeedbackConstants" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="CLOCK_TICK" since="21"/>
+ <field name="CONTEXT_CLICK" since="23"/>
+ <field name="FLAG_IGNORE_GLOBAL_SETTING"/>
+ <field name="FLAG_IGNORE_VIEW_SETTING"/>
+ <field name="KEYBOARD_TAP" since="8"/>
+ <field name="LONG_PRESS"/>
+ <field name="VIRTUAL_KEY" since="5"/>
+ </class>
+ <class name="android/view/InflateException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="android/view/InputDevice" since="9">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getControllerNumber()I" since="19"/>
+ <method name="getDescriptor()Ljava/lang/String;" since="16"/>
+ <method name="getDevice(I)Landroid/view/InputDevice;"/>
+ <method name="getDeviceIds()[I"/>
+ <method name="getId()I"/>
+ <method name="getKeyCharacterMap()Landroid/view/KeyCharacterMap;"/>
+ <method name="getKeyboardType()I"/>
+ <method name="getMotionRange(I)Landroid/view/InputDevice$MotionRange;"/>
+ <method name="getMotionRange(II)Landroid/view/InputDevice$MotionRange;" since="12"/>
+ <method name="getMotionRanges()Ljava/util/List;" since="12"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getProductId()I" since="19"/>
+ <method name="getSources()I"/>
+ <method name="getVendorId()I" since="19"/>
+ <method name="getVibrator()Landroid/os/Vibrator;" since="16"/>
+ <method name="hasKeys([I)[Z" since="19"/>
+ <method name="hasMicrophone()Z" since="23"/>
+ <method name="isVirtual()Z" since="16"/>
+ <method name="supportsSource(I)Z" since="21"/>
+ <field name="CREATOR"/>
+ <field name="KEYBOARD_TYPE_ALPHABETIC"/>
+ <field name="KEYBOARD_TYPE_NONE"/>
+ <field name="KEYBOARD_TYPE_NON_ALPHABETIC"/>
+ <field name="MOTION_RANGE_ORIENTATION" deprecated="16"/>
+ <field name="MOTION_RANGE_PRESSURE" deprecated="16"/>
+ <field name="MOTION_RANGE_SIZE" deprecated="16"/>
+ <field name="MOTION_RANGE_TOOL_MAJOR" deprecated="16"/>
+ <field name="MOTION_RANGE_TOOL_MINOR" deprecated="16"/>
+ <field name="MOTION_RANGE_TOUCH_MAJOR" deprecated="16"/>
+ <field name="MOTION_RANGE_TOUCH_MINOR" deprecated="16"/>
+ <field name="MOTION_RANGE_X" deprecated="16"/>
+ <field name="MOTION_RANGE_Y" deprecated="16"/>
+ <field name="SOURCE_ANY"/>
+ <field name="SOURCE_BLUETOOTH_STYLUS" since="23"/>
+ <field name="SOURCE_CLASS_BUTTON"/>
+ <field name="SOURCE_CLASS_JOYSTICK" since="12"/>
+ <field name="SOURCE_CLASS_MASK"/>
+ <field name="SOURCE_CLASS_NONE" since="18"/>
+ <field name="SOURCE_CLASS_POINTER"/>
+ <field name="SOURCE_CLASS_POSITION"/>
+ <field name="SOURCE_CLASS_TRACKBALL"/>
+ <field name="SOURCE_DPAD"/>
+ <field name="SOURCE_GAMEPAD" since="12"/>
+ <field name="SOURCE_HDMI" since="21"/>
+ <field name="SOURCE_JOYSTICK" since="12"/>
+ <field name="SOURCE_KEYBOARD"/>
+ <field name="SOURCE_MOUSE"/>
+ <field name="SOURCE_MOUSE_RELATIVE" since="26"/>
+ <field name="SOURCE_ROTARY_ENCODER" since="26"/>
+ <field name="SOURCE_STYLUS" since="14"/>
+ <field name="SOURCE_TOUCHPAD"/>
+ <field name="SOURCE_TOUCHSCREEN"/>
+ <field name="SOURCE_TOUCH_NAVIGATION" since="18"/>
+ <field name="SOURCE_TRACKBALL"/>
+ <field name="SOURCE_UNKNOWN"/>
+ </class>
+ <class name="android/view/InputDevice$MotionRange" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAxis()I" since="12"/>
+ <method name="getFlat()F"/>
+ <method name="getFuzz()F"/>
+ <method name="getMax()F"/>
+ <method name="getMin()F"/>
+ <method name="getRange()F"/>
+ <method name="getResolution()F" since="18"/>
+ <method name="getSource()I" since="12"/>
+ <method name="isFromSource(I)Z" since="18"/>
+ </class>
+ <class name="android/view/InputEvent" since="9">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDevice()Landroid/view/InputDevice;"/>
+ <method name="getDeviceId()I"/>
+ <method name="getEventTime()J" since="16"/>
+ <method name="getSource()I"/>
+ <method name="isFromSource(I)Z" since="18"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/view/InputQueue" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/view/InputQueue$Callback" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="onInputQueueCreated(Landroid/view/InputQueue;)V"/>
+ <method name="onInputQueueDestroyed(Landroid/view/InputQueue;)V"/>
+ </class>
+ <class name="android/view/KeyCharacterMap" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable" since="16"/>
+ <method name="&lt;init>()V"/>
+ <method name="deviceHasKey(I)Z" since="3"/>
+ <method name="deviceHasKeys([I)[Z" since="3"/>
+ <method name="get(II)I"/>
+ <method name="getDeadChar(II)I"/>
+ <method name="getDisplayLabel(I)C"/>
+ <method name="getEvents([C)[Landroid/view/KeyEvent;"/>
+ <method name="getKeyData(ILandroid/view/KeyCharacterMap$KeyData;)Z" deprecated="16"/>
+ <method name="getKeyboardType()I"/>
+ <method name="getMatch(I[C)C"/>
+ <method name="getMatch(I[CI)C"/>
+ <method name="getModifierBehavior()I" since="11"/>
+ <method name="getNumber(I)C"/>
+ <method name="isPrintingKey(I)Z"/>
+ <method name="load(I)Landroid/view/KeyCharacterMap;"/>
+ <field name="ALPHA"/>
+ <field name="BUILT_IN_KEYBOARD" deprecated="16"/>
+ <field name="COMBINING_ACCENT"/>
+ <field name="COMBINING_ACCENT_MASK"/>
+ <field name="CREATOR" since="16"/>
+ <field name="FULL" since="11"/>
+ <field name="HEX_INPUT"/>
+ <field name="MODIFIER_BEHAVIOR_CHORDED" since="11"/>
+ <field name="MODIFIER_BEHAVIOR_CHORDED_OR_TOGGLED" since="11"/>
+ <field name="NUMERIC"/>
+ <field name="PICKER_DIALOG_INPUT"/>
+ <field name="PREDICTIVE"/>
+ <field name="SPECIAL_FUNCTION" since="11"/>
+ <field name="VIRTUAL_KEYBOARD" since="11"/>
+ </class>
+ <class name="android/view/KeyCharacterMap$KeyData" since="1" deprecated="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="META_LENGTH"/>
+ <field name="displayLabel"/>
+ <field name="meta"/>
+ <field name="number"/>
+ </class>
+ <class name="android/view/KeyCharacterMap$UnavailableException" since="11">
+ <extends name="android/util/AndroidRuntimeException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/view/KeyEvent" since="1">
+ <extends name="android/view/InputEvent" since="9"/>
+ <extends name="java/lang/Object" removed="9"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="&lt;init>(JJIII)V"/>
+ <method name="&lt;init>(JJIIII)V"/>
+ <method name="&lt;init>(JJIIIIII)V"/>
+ <method name="&lt;init>(JJIIIIIII)V"/>
+ <method name="&lt;init>(JJIIIIIIII)V" since="9"/>
+ <method name="&lt;init>(JLjava/lang/String;II)V" since="3"/>
+ <method name="&lt;init>(Landroid/view/KeyEvent;)V" since="3"/>
+ <method name="&lt;init>(Landroid/view/KeyEvent;JI)V" deprecated="16"/>
+ <method name="changeAction(Landroid/view/KeyEvent;I)Landroid/view/KeyEvent;" since="3"/>
+ <method name="changeFlags(Landroid/view/KeyEvent;I)Landroid/view/KeyEvent;" since="3"/>
+ <method name="changeTimeRepeat(Landroid/view/KeyEvent;JI)Landroid/view/KeyEvent;" since="3"/>
+ <method name="changeTimeRepeat(Landroid/view/KeyEvent;JII)Landroid/view/KeyEvent;" since="5"/>
+ <method name="dispatch(Landroid/view/KeyEvent$Callback;)Z" deprecated="16"/>
+ <method name="dispatch(Landroid/view/KeyEvent$Callback;Landroid/view/KeyEvent$DispatcherState;Ljava/lang/Object;)Z" since="5"/>
+ <method name="getAction()I"/>
+ <method name="getCharacters()Ljava/lang/String;" since="3"/>
+ <method name="getDeadChar(II)I"/>
+ <method name="getDeviceId()I"/>
+ <method name="getDisplayLabel()C"/>
+ <method name="getDownTime()J"/>
+ <method name="getEventTime()J"/>
+ <method name="getFlags()I"/>
+ <method name="getKeyCharacterMap()Landroid/view/KeyCharacterMap;" since="11"/>
+ <method name="getKeyCode()I"/>
+ <method name="getKeyData(Landroid/view/KeyCharacterMap$KeyData;)Z" deprecated="16"/>
+ <method name="getMatch([C)C"/>
+ <method name="getMatch([CI)C"/>
+ <method name="getMaxKeyCode()I" since="3"/>
+ <method name="getMetaState()I"/>
+ <method name="getModifierMetaStateMask()I" since="11"/>
+ <method name="getModifiers()I" since="13"/>
+ <method name="getNumber()C"/>
+ <method name="getRepeatCount()I"/>
+ <method name="getScanCode()I"/>
+ <method name="getUnicodeChar()I"/>
+ <method name="getUnicodeChar(I)I"/>
+ <method name="hasModifiers(I)Z" since="11"/>
+ <method name="hasNoModifiers()Z" since="11"/>
+ <method name="isAltPressed()Z"/>
+ <method name="isCanceled()Z" since="5"/>
+ <method name="isCapsLockOn()Z" since="11"/>
+ <method name="isCtrlPressed()Z" since="11"/>
+ <method name="isFunctionPressed()Z" since="11"/>
+ <method name="isGamepadButton(I)Z" since="12"/>
+ <method name="isLongPress()Z" since="5"/>
+ <method name="isMetaPressed()Z" since="11"/>
+ <method name="isModifierKey(I)Z"/>
+ <method name="isNumLockOn()Z" since="11"/>
+ <method name="isPrintingKey()Z"/>
+ <method name="isScrollLockOn()Z" since="11"/>
+ <method name="isShiftPressed()Z"/>
+ <method name="isSymPressed()Z"/>
+ <method name="isSystem()Z"/>
+ <method name="isTracking()Z" since="5"/>
+ <method name="keyCodeFromString(Ljava/lang/String;)I" since="12"/>
+ <method name="keyCodeToString(I)Ljava/lang/String;" since="12"/>
+ <method name="metaStateHasModifiers(II)Z" since="11"/>
+ <method name="metaStateHasNoModifiers(I)Z" since="11"/>
+ <method name="normalizeMetaState(I)I" since="11"/>
+ <method name="setSource(I)V" since="12"/>
+ <method name="startTracking()V" since="5"/>
+ <field name="ACTION_DOWN"/>
+ <field name="ACTION_MULTIPLE"/>
+ <field name="ACTION_UP"/>
+ <field name="CREATOR"/>
+ <field name="FLAG_CANCELED" since="5"/>
+ <field name="FLAG_CANCELED_LONG_PRESS" since="5"/>
+ <field name="FLAG_EDITOR_ACTION" since="3"/>
+ <field name="FLAG_FALLBACK" since="11"/>
+ <field name="FLAG_FROM_SYSTEM" since="3"/>
+ <field name="FLAG_KEEP_TOUCH_MODE" since="3"/>
+ <field name="FLAG_LONG_PRESS" since="5"/>
+ <field name="FLAG_SOFT_KEYBOARD" since="3"/>
+ <field name="FLAG_TRACKING" since="5"/>
+ <field name="FLAG_VIRTUAL_HARD_KEY" since="5"/>
+ <field name="FLAG_WOKE_HERE" deprecated="20"/>
+ <field name="KEYCODE_0"/>
+ <field name="KEYCODE_1"/>
+ <field name="KEYCODE_11" since="21"/>
+ <field name="KEYCODE_12" since="21"/>
+ <field name="KEYCODE_2"/>
+ <field name="KEYCODE_3"/>
+ <field name="KEYCODE_3D_MODE" since="14"/>
+ <field name="KEYCODE_4"/>
+ <field name="KEYCODE_5"/>
+ <field name="KEYCODE_6"/>
+ <field name="KEYCODE_7"/>
+ <field name="KEYCODE_8"/>
+ <field name="KEYCODE_9"/>
+ <field name="KEYCODE_A"/>
+ <field name="KEYCODE_ALT_LEFT"/>
+ <field name="KEYCODE_ALT_RIGHT"/>
+ <field name="KEYCODE_APOSTROPHE"/>
+ <field name="KEYCODE_APP_SWITCH" since="11"/>
+ <field name="KEYCODE_ASSIST" since="16"/>
+ <field name="KEYCODE_AT"/>
+ <field name="KEYCODE_AVR_INPUT" since="11"/>
+ <field name="KEYCODE_AVR_POWER" since="11"/>
+ <field name="KEYCODE_B"/>
+ <field name="KEYCODE_BACK"/>
+ <field name="KEYCODE_BACKSLASH"/>
+ <field name="KEYCODE_BOOKMARK" since="11"/>
+ <field name="KEYCODE_BREAK" since="11"/>
+ <field name="KEYCODE_BRIGHTNESS_DOWN" since="18"/>
+ <field name="KEYCODE_BRIGHTNESS_UP" since="18"/>
+ <field name="KEYCODE_BUTTON_1" since="12"/>
+ <field name="KEYCODE_BUTTON_10" since="12"/>
+ <field name="KEYCODE_BUTTON_11" since="12"/>
+ <field name="KEYCODE_BUTTON_12" since="12"/>
+ <field name="KEYCODE_BUTTON_13" since="12"/>
+ <field name="KEYCODE_BUTTON_14" since="12"/>
+ <field name="KEYCODE_BUTTON_15" since="12"/>
+ <field name="KEYCODE_BUTTON_16" since="12"/>
+ <field name="KEYCODE_BUTTON_2" since="12"/>
+ <field name="KEYCODE_BUTTON_3" since="12"/>
+ <field name="KEYCODE_BUTTON_4" since="12"/>
+ <field name="KEYCODE_BUTTON_5" since="12"/>
+ <field name="KEYCODE_BUTTON_6" since="12"/>
+ <field name="KEYCODE_BUTTON_7" since="12"/>
+ <field name="KEYCODE_BUTTON_8" since="12"/>
+ <field name="KEYCODE_BUTTON_9" since="12"/>
+ <field name="KEYCODE_BUTTON_A" since="9"/>
+ <field name="KEYCODE_BUTTON_B" since="9"/>
+ <field name="KEYCODE_BUTTON_C" since="9"/>
+ <field name="KEYCODE_BUTTON_L1" since="9"/>
+ <field name="KEYCODE_BUTTON_L2" since="9"/>
+ <field name="KEYCODE_BUTTON_MODE" since="9"/>
+ <field name="KEYCODE_BUTTON_R1" since="9"/>
+ <field name="KEYCODE_BUTTON_R2" since="9"/>
+ <field name="KEYCODE_BUTTON_SELECT" since="9"/>
+ <field name="KEYCODE_BUTTON_START" since="9"/>
+ <field name="KEYCODE_BUTTON_THUMBL" since="9"/>
+ <field name="KEYCODE_BUTTON_THUMBR" since="9"/>
+ <field name="KEYCODE_BUTTON_X" since="9"/>
+ <field name="KEYCODE_BUTTON_Y" since="9"/>
+ <field name="KEYCODE_BUTTON_Z" since="9"/>
+ <field name="KEYCODE_C"/>
+ <field name="KEYCODE_CALCULATOR" since="15"/>
+ <field name="KEYCODE_CALENDAR" since="15"/>
+ <field name="KEYCODE_CALL"/>
+ <field name="KEYCODE_CAMERA"/>
+ <field name="KEYCODE_CAPS_LOCK" since="11"/>
+ <field name="KEYCODE_CAPTIONS" since="11"/>
+ <field name="KEYCODE_CHANNEL_DOWN" since="11"/>
+ <field name="KEYCODE_CHANNEL_UP" since="11"/>
+ <field name="KEYCODE_CLEAR"/>
+ <field name="KEYCODE_COMMA"/>
+ <field name="KEYCODE_CONTACTS" since="15"/>
+ <field name="KEYCODE_COPY" since="24"/>
+ <field name="KEYCODE_CTRL_LEFT" since="11"/>
+ <field name="KEYCODE_CTRL_RIGHT" since="11"/>
+ <field name="KEYCODE_CUT" since="24"/>
+ <field name="KEYCODE_D"/>
+ <field name="KEYCODE_DEL"/>
+ <field name="KEYCODE_DPAD_CENTER"/>
+ <field name="KEYCODE_DPAD_DOWN"/>
+ <field name="KEYCODE_DPAD_DOWN_LEFT" since="24"/>
+ <field name="KEYCODE_DPAD_DOWN_RIGHT" since="24"/>
+ <field name="KEYCODE_DPAD_LEFT"/>
+ <field name="KEYCODE_DPAD_RIGHT"/>
+ <field name="KEYCODE_DPAD_UP"/>
+ <field name="KEYCODE_DPAD_UP_LEFT" since="24"/>
+ <field name="KEYCODE_DPAD_UP_RIGHT" since="24"/>
+ <field name="KEYCODE_DVR" since="11"/>
+ <field name="KEYCODE_E"/>
+ <field name="KEYCODE_EISU" since="16"/>
+ <field name="KEYCODE_ENDCALL"/>
+ <field name="KEYCODE_ENTER"/>
+ <field name="KEYCODE_ENVELOPE"/>
+ <field name="KEYCODE_EQUALS"/>
+ <field name="KEYCODE_ESCAPE" since="11"/>
+ <field name="KEYCODE_EXPLORER"/>
+ <field name="KEYCODE_F"/>
+ <field name="KEYCODE_F1" since="11"/>
+ <field name="KEYCODE_F10" since="11"/>
+ <field name="KEYCODE_F11" since="11"/>
+ <field name="KEYCODE_F12" since="11"/>
+ <field name="KEYCODE_F2" since="11"/>
+ <field name="KEYCODE_F3" since="11"/>
+ <field name="KEYCODE_F4" since="11"/>
+ <field name="KEYCODE_F5" since="11"/>
+ <field name="KEYCODE_F6" since="11"/>
+ <field name="KEYCODE_F7" since="11"/>
+ <field name="KEYCODE_F8" since="11"/>
+ <field name="KEYCODE_F9" since="11"/>
+ <field name="KEYCODE_FOCUS"/>
+ <field name="KEYCODE_FORWARD" since="11"/>
+ <field name="KEYCODE_FORWARD_DEL" since="11"/>
+ <field name="KEYCODE_FUNCTION" since="11"/>
+ <field name="KEYCODE_G"/>
+ <field name="KEYCODE_GRAVE"/>
+ <field name="KEYCODE_GUIDE" since="11"/>
+ <field name="KEYCODE_H"/>
+ <field name="KEYCODE_HEADSETHOOK"/>
+ <field name="KEYCODE_HELP" since="21"/>
+ <field name="KEYCODE_HENKAN" since="16"/>
+ <field name="KEYCODE_HOME"/>
+ <field name="KEYCODE_I"/>
+ <field name="KEYCODE_INFO" since="11"/>
+ <field name="KEYCODE_INSERT" since="11"/>
+ <field name="KEYCODE_J"/>
+ <field name="KEYCODE_K"/>
+ <field name="KEYCODE_KANA" since="16"/>
+ <field name="KEYCODE_KATAKANA_HIRAGANA" since="16"/>
+ <field name="KEYCODE_L"/>
+ <field name="KEYCODE_LANGUAGE_SWITCH" since="14"/>
+ <field name="KEYCODE_LAST_CHANNEL" since="21"/>
+ <field name="KEYCODE_LEFT_BRACKET"/>
+ <field name="KEYCODE_M"/>
+ <field name="KEYCODE_MANNER_MODE" since="14"/>
+ <field name="KEYCODE_MEDIA_AUDIO_TRACK" since="19"/>
+ <field name="KEYCODE_MEDIA_CLOSE" since="11"/>
+ <field name="KEYCODE_MEDIA_EJECT" since="11"/>
+ <field name="KEYCODE_MEDIA_FAST_FORWARD" since="3"/>
+ <field name="KEYCODE_MEDIA_NEXT" since="3"/>
+ <field name="KEYCODE_MEDIA_PAUSE" since="11"/>
+ <field name="KEYCODE_MEDIA_PLAY" since="11"/>
+ <field name="KEYCODE_MEDIA_PLAY_PAUSE" since="3"/>
+ <field name="KEYCODE_MEDIA_PREVIOUS" since="3"/>
+ <field name="KEYCODE_MEDIA_RECORD" since="11"/>
+ <field name="KEYCODE_MEDIA_REWIND" since="3"/>
+ <field name="KEYCODE_MEDIA_SKIP_BACKWARD" since="23"/>
+ <field name="KEYCODE_MEDIA_SKIP_FORWARD" since="23"/>
+ <field name="KEYCODE_MEDIA_STEP_BACKWARD" since="23"/>
+ <field name="KEYCODE_MEDIA_STEP_FORWARD" since="23"/>
+ <field name="KEYCODE_MEDIA_STOP" since="3"/>
+ <field name="KEYCODE_MEDIA_TOP_MENU" since="21"/>
+ <field name="KEYCODE_MENU"/>
+ <field name="KEYCODE_META_LEFT" since="11"/>
+ <field name="KEYCODE_META_RIGHT" since="11"/>
+ <field name="KEYCODE_MINUS"/>
+ <field name="KEYCODE_MOVE_END" since="11"/>
+ <field name="KEYCODE_MOVE_HOME" since="11"/>
+ <field name="KEYCODE_MUHENKAN" since="16"/>
+ <field name="KEYCODE_MUSIC" since="15"/>
+ <field name="KEYCODE_MUTE" since="3"/>
+ <field name="KEYCODE_N"/>
+ <field name="KEYCODE_NAVIGATE_IN" since="23"/>
+ <field name="KEYCODE_NAVIGATE_NEXT" since="23"/>
+ <field name="KEYCODE_NAVIGATE_OUT" since="23"/>
+ <field name="KEYCODE_NAVIGATE_PREVIOUS" since="23"/>
+ <field name="KEYCODE_NOTIFICATION"/>
+ <field name="KEYCODE_NUM"/>
+ <field name="KEYCODE_NUMPAD_0" since="11"/>
+ <field name="KEYCODE_NUMPAD_1" since="11"/>
+ <field name="KEYCODE_NUMPAD_2" since="11"/>
+ <field name="KEYCODE_NUMPAD_3" since="11"/>
+ <field name="KEYCODE_NUMPAD_4" since="11"/>
+ <field name="KEYCODE_NUMPAD_5" since="11"/>
+ <field name="KEYCODE_NUMPAD_6" since="11"/>
+ <field name="KEYCODE_NUMPAD_7" since="11"/>
+ <field name="KEYCODE_NUMPAD_8" since="11"/>
+ <field name="KEYCODE_NUMPAD_9" since="11"/>
+ <field name="KEYCODE_NUMPAD_ADD" since="11"/>
+ <field name="KEYCODE_NUMPAD_COMMA" since="11"/>
+ <field name="KEYCODE_NUMPAD_DIVIDE" since="11"/>
+ <field name="KEYCODE_NUMPAD_DOT" since="11"/>
+ <field name="KEYCODE_NUMPAD_ENTER" since="11"/>
+ <field name="KEYCODE_NUMPAD_EQUALS" since="11"/>
+ <field name="KEYCODE_NUMPAD_LEFT_PAREN" since="11"/>
+ <field name="KEYCODE_NUMPAD_MULTIPLY" since="11"/>
+ <field name="KEYCODE_NUMPAD_RIGHT_PAREN" since="11"/>
+ <field name="KEYCODE_NUMPAD_SUBTRACT" since="11"/>
+ <field name="KEYCODE_NUM_LOCK" since="11"/>
+ <field name="KEYCODE_O"/>
+ <field name="KEYCODE_P"/>
+ <field name="KEYCODE_PAGE_DOWN" since="9"/>
+ <field name="KEYCODE_PAGE_UP" since="9"/>
+ <field name="KEYCODE_PAIRING" since="21"/>
+ <field name="KEYCODE_PASTE" since="24"/>
+ <field name="KEYCODE_PERIOD"/>
+ <field name="KEYCODE_PICTSYMBOLS" since="9"/>
+ <field name="KEYCODE_PLUS"/>
+ <field name="KEYCODE_POUND"/>
+ <field name="KEYCODE_POWER"/>
+ <field name="KEYCODE_PROG_BLUE" since="11"/>
+ <field name="KEYCODE_PROG_GREEN" since="11"/>
+ <field name="KEYCODE_PROG_RED" since="11"/>
+ <field name="KEYCODE_PROG_YELLOW" since="11"/>
+ <field name="KEYCODE_Q"/>
+ <field name="KEYCODE_R"/>
+ <field name="KEYCODE_RIGHT_BRACKET"/>
+ <field name="KEYCODE_RO" since="16"/>
+ <field name="KEYCODE_S"/>
+ <field name="KEYCODE_SCROLL_LOCK" since="11"/>
+ <field name="KEYCODE_SEARCH"/>
+ <field name="KEYCODE_SEMICOLON"/>
+ <field name="KEYCODE_SETTINGS" since="11"/>
+ <field name="KEYCODE_SHIFT_LEFT"/>
+ <field name="KEYCODE_SHIFT_RIGHT"/>
+ <field name="KEYCODE_SLASH"/>
+ <field name="KEYCODE_SLEEP" since="20"/>
+ <field name="KEYCODE_SOFT_LEFT"/>
+ <field name="KEYCODE_SOFT_RIGHT"/>
+ <field name="KEYCODE_SOFT_SLEEP" since="24"/>
+ <field name="KEYCODE_SPACE"/>
+ <field name="KEYCODE_STAR"/>
+ <field name="KEYCODE_STB_INPUT" since="11"/>
+ <field name="KEYCODE_STB_POWER" since="11"/>
+ <field name="KEYCODE_STEM_1" since="24"/>
+ <field name="KEYCODE_STEM_2" since="24"/>
+ <field name="KEYCODE_STEM_3" since="24"/>
+ <field name="KEYCODE_STEM_PRIMARY" since="24"/>
+ <field name="KEYCODE_SWITCH_CHARSET" since="9"/>
+ <field name="KEYCODE_SYM"/>
+ <field name="KEYCODE_SYSRQ" since="11"/>
+ <field name="KEYCODE_SYSTEM_NAVIGATION_DOWN" since="25"/>
+ <field name="KEYCODE_SYSTEM_NAVIGATION_LEFT" since="25"/>
+ <field name="KEYCODE_SYSTEM_NAVIGATION_RIGHT" since="25"/>
+ <field name="KEYCODE_SYSTEM_NAVIGATION_UP" since="25"/>
+ <field name="KEYCODE_T"/>
+ <field name="KEYCODE_TAB"/>
+ <field name="KEYCODE_TV" since="11"/>
+ <field name="KEYCODE_TV_ANTENNA_CABLE" since="21"/>
+ <field name="KEYCODE_TV_AUDIO_DESCRIPTION" since="21"/>
+ <field name="KEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN" since="21"/>
+ <field name="KEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP" since="21"/>
+ <field name="KEYCODE_TV_CONTENTS_MENU" since="21"/>
+ <field name="KEYCODE_TV_DATA_SERVICE" since="21"/>
+ <field name="KEYCODE_TV_INPUT" since="11"/>
+ <field name="KEYCODE_TV_INPUT_COMPONENT_1" since="21"/>
+ <field name="KEYCODE_TV_INPUT_COMPONENT_2" since="21"/>
+ <field name="KEYCODE_TV_INPUT_COMPOSITE_1" since="21"/>
+ <field name="KEYCODE_TV_INPUT_COMPOSITE_2" since="21"/>
+ <field name="KEYCODE_TV_INPUT_HDMI_1" since="21"/>
+ <field name="KEYCODE_TV_INPUT_HDMI_2" since="21"/>
+ <field name="KEYCODE_TV_INPUT_HDMI_3" since="21"/>
+ <field name="KEYCODE_TV_INPUT_HDMI_4" since="21"/>
+ <field name="KEYCODE_TV_INPUT_VGA_1" since="21"/>
+ <field name="KEYCODE_TV_MEDIA_CONTEXT_MENU" since="21"/>
+ <field name="KEYCODE_TV_NETWORK" since="21"/>
+ <field name="KEYCODE_TV_NUMBER_ENTRY" since="21"/>
+ <field name="KEYCODE_TV_POWER" since="11"/>
+ <field name="KEYCODE_TV_RADIO_SERVICE" since="21"/>
+ <field name="KEYCODE_TV_SATELLITE" since="21"/>
+ <field name="KEYCODE_TV_SATELLITE_BS" since="21"/>
+ <field name="KEYCODE_TV_SATELLITE_CS" since="21"/>
+ <field name="KEYCODE_TV_SATELLITE_SERVICE" since="21"/>
+ <field name="KEYCODE_TV_TELETEXT" since="21"/>
+ <field name="KEYCODE_TV_TERRESTRIAL_ANALOG" since="21"/>
+ <field name="KEYCODE_TV_TERRESTRIAL_DIGITAL" since="21"/>
+ <field name="KEYCODE_TV_TIMER_PROGRAMMING" since="21"/>
+ <field name="KEYCODE_TV_ZOOM_MODE" since="21"/>
+ <field name="KEYCODE_U"/>
+ <field name="KEYCODE_UNKNOWN"/>
+ <field name="KEYCODE_V"/>
+ <field name="KEYCODE_VOICE_ASSIST" since="21"/>
+ <field name="KEYCODE_VOLUME_DOWN"/>
+ <field name="KEYCODE_VOLUME_MUTE" since="11"/>
+ <field name="KEYCODE_VOLUME_UP"/>
+ <field name="KEYCODE_W"/>
+ <field name="KEYCODE_WAKEUP" since="20"/>
+ <field name="KEYCODE_WINDOW" since="11"/>
+ <field name="KEYCODE_X"/>
+ <field name="KEYCODE_Y"/>
+ <field name="KEYCODE_YEN" since="16"/>
+ <field name="KEYCODE_Z"/>
+ <field name="KEYCODE_ZENKAKU_HANKAKU" since="16"/>
+ <field name="KEYCODE_ZOOM_IN" since="11"/>
+ <field name="KEYCODE_ZOOM_OUT" since="11"/>
+ <field name="MAX_KEYCODE" deprecated="16"/>
+ <field name="META_ALT_LEFT_ON"/>
+ <field name="META_ALT_MASK" since="11"/>
+ <field name="META_ALT_ON"/>
+ <field name="META_ALT_RIGHT_ON"/>
+ <field name="META_CAPS_LOCK_ON" since="11"/>
+ <field name="META_CTRL_LEFT_ON" since="11"/>
+ <field name="META_CTRL_MASK" since="11"/>
+ <field name="META_CTRL_ON" since="11"/>
+ <field name="META_CTRL_RIGHT_ON" since="11"/>
+ <field name="META_FUNCTION_ON" since="11"/>
+ <field name="META_META_LEFT_ON" since="11"/>
+ <field name="META_META_MASK" since="11"/>
+ <field name="META_META_ON" since="11"/>
+ <field name="META_META_RIGHT_ON" since="11"/>
+ <field name="META_NUM_LOCK_ON" since="11"/>
+ <field name="META_SCROLL_LOCK_ON" since="11"/>
+ <field name="META_SHIFT_LEFT_ON"/>
+ <field name="META_SHIFT_MASK" since="11"/>
+ <field name="META_SHIFT_ON"/>
+ <field name="META_SHIFT_RIGHT_ON"/>
+ <field name="META_SYM_ON"/>
+ </class>
+ <class name="android/view/KeyEvent$Callback" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onKeyDown(ILandroid/view/KeyEvent;)Z"/>
+ <method name="onKeyLongPress(ILandroid/view/KeyEvent;)Z" since="5"/>
+ <method name="onKeyMultiple(IILandroid/view/KeyEvent;)Z"/>
+ <method name="onKeyUp(ILandroid/view/KeyEvent;)Z"/>
+ </class>
+ <class name="android/view/KeyEvent$DispatcherState" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="handleUpEvent(Landroid/view/KeyEvent;)V"/>
+ <method name="isTracking(Landroid/view/KeyEvent;)Z"/>
+ <method name="performedLongPress(Landroid/view/KeyEvent;)V"/>
+ <method name="reset()V"/>
+ <method name="reset(Ljava/lang/Object;)V"/>
+ <method name="startTracking(Landroid/view/KeyEvent;Ljava/lang/Object;)V"/>
+ </class>
+ <class name="android/view/KeyboardShortcutGroup" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;)V"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;Ljava/util/List;)V"/>
+ <method name="addItem(Landroid/view/KeyboardShortcutInfo;)V"/>
+ <method name="getItems()Ljava/util/List;"/>
+ <method name="getLabel()Ljava/lang/CharSequence;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/view/KeyboardShortcutInfo" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;CI)V"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;II)V"/>
+ <method name="getBaseCharacter()C"/>
+ <method name="getKeycode()I"/>
+ <method name="getLabel()Ljava/lang/CharSequence;"/>
+ <method name="getModifiers()I"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/view/LayoutInflater" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/view/LayoutInflater;Landroid/content/Context;)V"/>
+ <method name="cloneInContext(Landroid/content/Context;)Landroid/view/LayoutInflater;"/>
+ <method name="createView(Ljava/lang/String;Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/view/View;"/>
+ <method name="from(Landroid/content/Context;)Landroid/view/LayoutInflater;"/>
+ <method name="getContext()Landroid/content/Context;"/>
+ <method name="getFactory()Landroid/view/LayoutInflater$Factory;"/>
+ <method name="getFactory2()Landroid/view/LayoutInflater$Factory2;" since="11"/>
+ <method name="getFilter()Landroid/view/LayoutInflater$Filter;"/>
+ <method name="inflate(ILandroid/view/ViewGroup;)Landroid/view/View;"/>
+ <method name="inflate(ILandroid/view/ViewGroup;Z)Landroid/view/View;"/>
+ <method name="inflate(Lorg/xmlpull/v1/XmlPullParser;Landroid/view/ViewGroup;)Landroid/view/View;"/>
+ <method name="inflate(Lorg/xmlpull/v1/XmlPullParser;Landroid/view/ViewGroup;Z)Landroid/view/View;"/>
+ <method name="onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/view/View;" since="11"/>
+ <method name="onCreateView(Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/view/View;"/>
+ <method name="setFactory(Landroid/view/LayoutInflater$Factory;)V"/>
+ <method name="setFactory2(Landroid/view/LayoutInflater$Factory2;)V" since="11"/>
+ <method name="setFilter(Landroid/view/LayoutInflater$Filter;)V"/>
+ </class>
+ <class name="android/view/LayoutInflater$Factory" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onCreateView(Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;"/>
+ </class>
+ <class name="android/view/LayoutInflater$Factory2" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="android/view/LayoutInflater$Factory"/>
+ <method name="onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;"/>
+ </class>
+ <class name="android/view/LayoutInflater$Filter" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onLoadClass(Ljava/lang/Class;)Z"/>
+ </class>
+ <class name="android/view/Menu" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="add(I)Landroid/view/MenuItem;"/>
+ <method name="add(IIII)Landroid/view/MenuItem;"/>
+ <method name="add(IIILjava/lang/CharSequence;)Landroid/view/MenuItem;"/>
+ <method name="add(Ljava/lang/CharSequence;)Landroid/view/MenuItem;"/>
+ <method name="addIntentOptions(IIILandroid/content/ComponentName;[Landroid/content/Intent;Landroid/content/Intent;I[Landroid/view/MenuItem;)I"/>
+ <method name="addSubMenu(I)Landroid/view/SubMenu;"/>
+ <method name="addSubMenu(IIII)Landroid/view/SubMenu;"/>
+ <method name="addSubMenu(IIILjava/lang/CharSequence;)Landroid/view/SubMenu;"/>
+ <method name="addSubMenu(Ljava/lang/CharSequence;)Landroid/view/SubMenu;"/>
+ <method name="clear()V"/>
+ <method name="close()V" since="3"/>
+ <method name="findItem(I)Landroid/view/MenuItem;"/>
+ <method name="getItem(I)Landroid/view/MenuItem;" since="3"/>
+ <method name="hasVisibleItems()Z"/>
+ <method name="isShortcutKey(ILandroid/view/KeyEvent;)Z"/>
+ <method name="performIdentifierAction(II)Z"/>
+ <method name="performShortcut(ILandroid/view/KeyEvent;I)Z"/>
+ <method name="removeGroup(I)V"/>
+ <method name="removeItem(I)V"/>
+ <method name="setGroupCheckable(IZZ)V"/>
+ <method name="setGroupEnabled(IZ)V"/>
+ <method name="setGroupVisible(IZ)V"/>
+ <method name="setQwertyMode(Z)V"/>
+ <method name="size()I"/>
+ <field name="CATEGORY_ALTERNATIVE"/>
+ <field name="CATEGORY_CONTAINER"/>
+ <field name="CATEGORY_SECONDARY"/>
+ <field name="CATEGORY_SYSTEM"/>
+ <field name="FIRST"/>
+ <field name="FLAG_ALWAYS_PERFORM_CLOSE"/>
+ <field name="FLAG_APPEND_TO_GROUP"/>
+ <field name="FLAG_PERFORM_NO_CLOSE"/>
+ <field name="NONE"/>
+ <field name="SUPPORTED_MODIFIERS_MASK" since="26"/>
+ </class>
+ <class name="android/view/MenuInflater" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="inflate(ILandroid/view/Menu;)V"/>
+ </class>
+ <class name="android/view/MenuItem" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="collapseActionView()Z" since="14"/>
+ <method name="expandActionView()Z" since="14"/>
+ <method name="getActionProvider()Landroid/view/ActionProvider;" since="14"/>
+ <method name="getActionView()Landroid/view/View;" since="11"/>
+ <method name="getAlphabeticModifiers()I" since="26"/>
+ <method name="getAlphabeticShortcut()C"/>
+ <method name="getContentDescription()Ljava/lang/CharSequence;" since="26"/>
+ <method name="getGroupId()I"/>
+ <method name="getIcon()Landroid/graphics/drawable/Drawable;"/>
+ <method name="getIconTintList()Landroid/content/res/ColorStateList;" since="26"/>
+ <method name="getIconTintMode()Landroid/graphics/PorterDuff$Mode;" since="26"/>
+ <method name="getIntent()Landroid/content/Intent;"/>
+ <method name="getItemId()I"/>
+ <method name="getMenuInfo()Landroid/view/ContextMenu$ContextMenuInfo;"/>
+ <method name="getNumericModifiers()I" since="26"/>
+ <method name="getNumericShortcut()C"/>
+ <method name="getOrder()I"/>
+ <method name="getSubMenu()Landroid/view/SubMenu;"/>
+ <method name="getTitle()Ljava/lang/CharSequence;"/>
+ <method name="getTitleCondensed()Ljava/lang/CharSequence;"/>
+ <method name="getTooltipText()Ljava/lang/CharSequence;" since="26"/>
+ <method name="hasSubMenu()Z"/>
+ <method name="isActionViewExpanded()Z" since="14"/>
+ <method name="isCheckable()Z"/>
+ <method name="isChecked()Z"/>
+ <method name="isEnabled()Z"/>
+ <method name="isVisible()Z"/>
+ <method name="setActionProvider(Landroid/view/ActionProvider;)Landroid/view/MenuItem;" since="14"/>
+ <method name="setActionView(I)Landroid/view/MenuItem;" since="11"/>
+ <method name="setActionView(Landroid/view/View;)Landroid/view/MenuItem;" since="11"/>
+ <method name="setAlphabeticShortcut(C)Landroid/view/MenuItem;"/>
+ <method name="setAlphabeticShortcut(CI)Landroid/view/MenuItem;" since="26"/>
+ <method name="setCheckable(Z)Landroid/view/MenuItem;"/>
+ <method name="setChecked(Z)Landroid/view/MenuItem;"/>
+ <method name="setContentDescription(Ljava/lang/CharSequence;)Landroid/view/MenuItem;" since="26"/>
+ <method name="setEnabled(Z)Landroid/view/MenuItem;"/>
+ <method name="setIcon(I)Landroid/view/MenuItem;"/>
+ <method name="setIcon(Landroid/graphics/drawable/Drawable;)Landroid/view/MenuItem;"/>
+ <method name="setIconTintList(Landroid/content/res/ColorStateList;)Landroid/view/MenuItem;" since="26"/>
+ <method name="setIconTintMode(Landroid/graphics/PorterDuff$Mode;)Landroid/view/MenuItem;" since="26"/>
+ <method name="setIntent(Landroid/content/Intent;)Landroid/view/MenuItem;"/>
+ <method name="setNumericShortcut(C)Landroid/view/MenuItem;"/>
+ <method name="setNumericShortcut(CI)Landroid/view/MenuItem;" since="26"/>
+ <method name="setOnActionExpandListener(Landroid/view/MenuItem$OnActionExpandListener;)Landroid/view/MenuItem;" since="14"/>
+ <method name="setOnMenuItemClickListener(Landroid/view/MenuItem$OnMenuItemClickListener;)Landroid/view/MenuItem;"/>
+ <method name="setShortcut(CC)Landroid/view/MenuItem;"/>
+ <method name="setShortcut(CCII)Landroid/view/MenuItem;" since="26"/>
+ <method name="setShowAsAction(I)V" since="11"/>
+ <method name="setShowAsActionFlags(I)Landroid/view/MenuItem;" since="14"/>
+ <method name="setTitle(I)Landroid/view/MenuItem;"/>
+ <method name="setTitle(Ljava/lang/CharSequence;)Landroid/view/MenuItem;"/>
+ <method name="setTitleCondensed(Ljava/lang/CharSequence;)Landroid/view/MenuItem;"/>
+ <method name="setTooltipText(Ljava/lang/CharSequence;)Landroid/view/MenuItem;" since="26"/>
+ <method name="setVisible(Z)Landroid/view/MenuItem;"/>
+ <field name="SHOW_AS_ACTION_ALWAYS" since="11"/>
+ <field name="SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW" since="14"/>
+ <field name="SHOW_AS_ACTION_IF_ROOM" since="11"/>
+ <field name="SHOW_AS_ACTION_NEVER" since="11"/>
+ <field name="SHOW_AS_ACTION_WITH_TEXT" since="11"/>
+ </class>
+ <class name="android/view/MenuItem$OnActionExpandListener" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="onMenuItemActionCollapse(Landroid/view/MenuItem;)Z"/>
+ <method name="onMenuItemActionExpand(Landroid/view/MenuItem;)Z"/>
+ </class>
+ <class name="android/view/MenuItem$OnMenuItemClickListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onMenuItemClick(Landroid/view/MenuItem;)Z"/>
+ </class>
+ <class name="android/view/MotionEvent" since="1">
+ <extends name="android/view/InputEvent" since="9"/>
+ <extends name="java/lang/Object" removed="9"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="actionToString(I)Ljava/lang/String;" since="19"/>
+ <method name="addBatch(JFFFFI)V"/>
+ <method name="addBatch(J[Landroid/view/MotionEvent$PointerCoords;I)V" since="9"/>
+ <method name="axisFromString(Ljava/lang/String;)I" since="12"/>
+ <method name="axisToString(I)Ljava/lang/String;" since="12"/>
+ <method name="findPointerIndex(I)I" since="5"/>
+ <method name="getAction()I"/>
+ <method name="getActionButton()I" since="23"/>
+ <method name="getActionIndex()I" since="8"/>
+ <method name="getActionMasked()I" since="8"/>
+ <method name="getAxisValue(I)F" since="12"/>
+ <method name="getAxisValue(II)F" since="12"/>
+ <method name="getButtonState()I" since="14"/>
+ <method name="getDeviceId()I"/>
+ <method name="getDownTime()J"/>
+ <method name="getEdgeFlags()I"/>
+ <method name="getEventTime()J"/>
+ <method name="getFlags()I" since="9"/>
+ <method name="getHistoricalAxisValue(II)F" since="12"/>
+ <method name="getHistoricalAxisValue(III)F" since="12"/>
+ <method name="getHistoricalEventTime(I)J"/>
+ <method name="getHistoricalOrientation(I)F" since="9"/>
+ <method name="getHistoricalOrientation(II)F" since="9"/>
+ <method name="getHistoricalPointerCoords(IILandroid/view/MotionEvent$PointerCoords;)V" since="9"/>
+ <method name="getHistoricalPressure(I)F"/>
+ <method name="getHistoricalPressure(II)F" since="5"/>
+ <method name="getHistoricalSize(I)F"/>
+ <method name="getHistoricalSize(II)F" since="5"/>
+ <method name="getHistoricalToolMajor(I)F" since="9"/>
+ <method name="getHistoricalToolMajor(II)F" since="9"/>
+ <method name="getHistoricalToolMinor(I)F" since="9"/>
+ <method name="getHistoricalToolMinor(II)F" since="9"/>
+ <method name="getHistoricalTouchMajor(I)F" since="9"/>
+ <method name="getHistoricalTouchMajor(II)F" since="9"/>
+ <method name="getHistoricalTouchMinor(I)F" since="9"/>
+ <method name="getHistoricalTouchMinor(II)F" since="9"/>
+ <method name="getHistoricalX(I)F"/>
+ <method name="getHistoricalX(II)F" since="5"/>
+ <method name="getHistoricalY(I)F"/>
+ <method name="getHistoricalY(II)F" since="5"/>
+ <method name="getHistorySize()I"/>
+ <method name="getMetaState()I"/>
+ <method name="getOrientation()F" since="9"/>
+ <method name="getOrientation(I)F" since="9"/>
+ <method name="getPointerCoords(ILandroid/view/MotionEvent$PointerCoords;)V" since="9"/>
+ <method name="getPointerCount()I" since="5"/>
+ <method name="getPointerId(I)I" since="5"/>
+ <method name="getPointerProperties(ILandroid/view/MotionEvent$PointerProperties;)V" since="14"/>
+ <method name="getPressure()F"/>
+ <method name="getPressure(I)F" since="5"/>
+ <method name="getRawX()F"/>
+ <method name="getRawY()F"/>
+ <method name="getSize()F"/>
+ <method name="getSize(I)F" since="5"/>
+ <method name="getToolMajor()F" since="9"/>
+ <method name="getToolMajor(I)F" since="9"/>
+ <method name="getToolMinor()F" since="9"/>
+ <method name="getToolMinor(I)F" since="9"/>
+ <method name="getToolType(I)I" since="14"/>
+ <method name="getTouchMajor()F" since="9"/>
+ <method name="getTouchMajor(I)F" since="9"/>
+ <method name="getTouchMinor()F" since="9"/>
+ <method name="getTouchMinor(I)F" since="9"/>
+ <method name="getX()F"/>
+ <method name="getX(I)F" since="5"/>
+ <method name="getXPrecision()F"/>
+ <method name="getY()F"/>
+ <method name="getY(I)F" since="5"/>
+ <method name="getYPrecision()F"/>
+ <method name="isButtonPressed(I)Z" since="21"/>
+ <method name="obtain(JJIFFFFIFFII)Landroid/view/MotionEvent;"/>
+ <method name="obtain(JJIFFI)Landroid/view/MotionEvent;"/>
+ <method name="obtain(JJIIFFFFIFFII)Landroid/view/MotionEvent;" since="5" deprecated="16"/>
+ <method name="obtain(JJII[I[Landroid/view/MotionEvent$PointerCoords;IFFIIII)Landroid/view/MotionEvent;" since="9" deprecated="16"/>
+ <method name="obtain(JJII[Landroid/view/MotionEvent$PointerProperties;[Landroid/view/MotionEvent$PointerCoords;IIFFIIII)Landroid/view/MotionEvent;" since="14"/>
+ <method name="obtain(Landroid/view/MotionEvent;)Landroid/view/MotionEvent;"/>
+ <method name="obtainNoHistory(Landroid/view/MotionEvent;)Landroid/view/MotionEvent;" since="5"/>
+ <method name="offsetLocation(FF)V"/>
+ <method name="recycle()V"/>
+ <method name="setAction(I)V"/>
+ <method name="setEdgeFlags(I)V"/>
+ <method name="setLocation(FF)V"/>
+ <method name="setSource(I)V" since="12"/>
+ <method name="transform(Landroid/graphics/Matrix;)V" since="11"/>
+ <field name="ACTION_BUTTON_PRESS" since="23"/>
+ <field name="ACTION_BUTTON_RELEASE" since="23"/>
+ <field name="ACTION_CANCEL"/>
+ <field name="ACTION_DOWN"/>
+ <field name="ACTION_HOVER_ENTER" since="14"/>
+ <field name="ACTION_HOVER_EXIT" since="14"/>
+ <field name="ACTION_HOVER_MOVE" since="12"/>
+ <field name="ACTION_MASK" since="5"/>
+ <field name="ACTION_MOVE"/>
+ <field name="ACTION_OUTSIDE" since="3"/>
+ <field name="ACTION_POINTER_1_DOWN" since="5" deprecated="16"/>
+ <field name="ACTION_POINTER_1_UP" since="5" deprecated="16"/>
+ <field name="ACTION_POINTER_2_DOWN" since="5" deprecated="16"/>
+ <field name="ACTION_POINTER_2_UP" since="5" deprecated="16"/>
+ <field name="ACTION_POINTER_3_DOWN" since="5" deprecated="16"/>
+ <field name="ACTION_POINTER_3_UP" since="5" deprecated="16"/>
+ <field name="ACTION_POINTER_DOWN" since="5"/>
+ <field name="ACTION_POINTER_ID_MASK" since="5" deprecated="16"/>
+ <field name="ACTION_POINTER_ID_SHIFT" since="5" deprecated="16"/>
+ <field name="ACTION_POINTER_INDEX_MASK" since="8"/>
+ <field name="ACTION_POINTER_INDEX_SHIFT" since="8"/>
+ <field name="ACTION_POINTER_UP" since="5"/>
+ <field name="ACTION_SCROLL" since="12"/>
+ <field name="ACTION_UP"/>
+ <field name="AXIS_BRAKE" since="12"/>
+ <field name="AXIS_DISTANCE" since="14"/>
+ <field name="AXIS_GAS" since="12"/>
+ <field name="AXIS_GENERIC_1" since="12"/>
+ <field name="AXIS_GENERIC_10" since="12"/>
+ <field name="AXIS_GENERIC_11" since="12"/>
+ <field name="AXIS_GENERIC_12" since="12"/>
+ <field name="AXIS_GENERIC_13" since="12"/>
+ <field name="AXIS_GENERIC_14" since="12"/>
+ <field name="AXIS_GENERIC_15" since="12"/>
+ <field name="AXIS_GENERIC_16" since="12"/>
+ <field name="AXIS_GENERIC_2" since="12"/>
+ <field name="AXIS_GENERIC_3" since="12"/>
+ <field name="AXIS_GENERIC_4" since="12"/>
+ <field name="AXIS_GENERIC_5" since="12"/>
+ <field name="AXIS_GENERIC_6" since="12"/>
+ <field name="AXIS_GENERIC_7" since="12"/>
+ <field name="AXIS_GENERIC_8" since="12"/>
+ <field name="AXIS_GENERIC_9" since="12"/>
+ <field name="AXIS_HAT_X" since="12"/>
+ <field name="AXIS_HAT_Y" since="12"/>
+ <field name="AXIS_HSCROLL" since="12"/>
+ <field name="AXIS_LTRIGGER" since="12"/>
+ <field name="AXIS_ORIENTATION" since="12"/>
+ <field name="AXIS_PRESSURE" since="12"/>
+ <field name="AXIS_RELATIVE_X" since="24"/>
+ <field name="AXIS_RELATIVE_Y" since="24"/>
+ <field name="AXIS_RTRIGGER" since="12"/>
+ <field name="AXIS_RUDDER" since="12"/>
+ <field name="AXIS_RX" since="12"/>
+ <field name="AXIS_RY" since="12"/>
+ <field name="AXIS_RZ" since="12"/>
+ <field name="AXIS_SCROLL" since="26"/>
+ <field name="AXIS_SIZE" since="12"/>
+ <field name="AXIS_THROTTLE" since="12"/>
+ <field name="AXIS_TILT" since="14"/>
+ <field name="AXIS_TOOL_MAJOR" since="12"/>
+ <field name="AXIS_TOOL_MINOR" since="12"/>
+ <field name="AXIS_TOUCH_MAJOR" since="12"/>
+ <field name="AXIS_TOUCH_MINOR" since="12"/>
+ <field name="AXIS_VSCROLL" since="12"/>
+ <field name="AXIS_WHEEL" since="12"/>
+ <field name="AXIS_X" since="12"/>
+ <field name="AXIS_Y" since="12"/>
+ <field name="AXIS_Z" since="12"/>
+ <field name="BUTTON_BACK" since="14"/>
+ <field name="BUTTON_FORWARD" since="14"/>
+ <field name="BUTTON_PRIMARY" since="14"/>
+ <field name="BUTTON_SECONDARY" since="14"/>
+ <field name="BUTTON_STYLUS_PRIMARY" since="23"/>
+ <field name="BUTTON_STYLUS_SECONDARY" since="23"/>
+ <field name="BUTTON_TERTIARY" since="14"/>
+ <field name="CREATOR"/>
+ <field name="EDGE_BOTTOM"/>
+ <field name="EDGE_LEFT"/>
+ <field name="EDGE_RIGHT"/>
+ <field name="EDGE_TOP"/>
+ <field name="FLAG_WINDOW_IS_OBSCURED" since="9"/>
+ <field name="INVALID_POINTER_ID" since="14"/>
+ <field name="TOOL_TYPE_ERASER" since="14"/>
+ <field name="TOOL_TYPE_FINGER" since="14"/>
+ <field name="TOOL_TYPE_MOUSE" since="14"/>
+ <field name="TOOL_TYPE_STYLUS" since="14"/>
+ <field name="TOOL_TYPE_UNKNOWN" since="14"/>
+ </class>
+ <class name="android/view/MotionEvent$PointerCoords" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/view/MotionEvent$PointerCoords;)V" since="12"/>
+ <method name="clear()V" since="12"/>
+ <method name="copyFrom(Landroid/view/MotionEvent$PointerCoords;)V" since="12"/>
+ <method name="getAxisValue(I)F" since="12"/>
+ <method name="setAxisValue(IF)V" since="12"/>
+ <field name="orientation"/>
+ <field name="pressure"/>
+ <field name="size"/>
+ <field name="toolMajor"/>
+ <field name="toolMinor"/>
+ <field name="touchMajor"/>
+ <field name="touchMinor"/>
+ <field name="x"/>
+ <field name="y"/>
+ </class>
+ <class name="android/view/MotionEvent$PointerProperties" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/view/MotionEvent$PointerProperties;)V"/>
+ <method name="clear()V"/>
+ <method name="copyFrom(Landroid/view/MotionEvent$PointerProperties;)V"/>
+ <field name="id"/>
+ <field name="toolType"/>
+ </class>
+ <class name="android/view/OrientationEventListener" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;I)V"/>
+ <method name="canDetectOrientation()Z"/>
+ <method name="disable()V"/>
+ <method name="enable()V"/>
+ <method name="onOrientationChanged(I)V"/>
+ <field name="ORIENTATION_UNKNOWN"/>
+ </class>
+ <class name="android/view/OrientationListener" since="1" deprecated="3">
+ <extends name="java/lang/Object"/>
+ <implements name="android/hardware/SensorListener"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;I)V" since="3"/>
+ <method name="disable()V"/>
+ <method name="enable()V"/>
+ <method name="onOrientationChanged(I)V"/>
+ <field name="ORIENTATION_UNKNOWN"/>
+ </class>
+ <class name="android/view/PixelCopy" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="request(Landroid/view/Surface;Landroid/graphics/Bitmap;Landroid/view/PixelCopy$OnPixelCopyFinishedListener;Landroid/os/Handler;)V"/>
+ <method name="request(Landroid/view/Surface;Landroid/graphics/Rect;Landroid/graphics/Bitmap;Landroid/view/PixelCopy$OnPixelCopyFinishedListener;Landroid/os/Handler;)V" since="26"/>
+ <method name="request(Landroid/view/SurfaceView;Landroid/graphics/Bitmap;Landroid/view/PixelCopy$OnPixelCopyFinishedListener;Landroid/os/Handler;)V"/>
+ <method name="request(Landroid/view/SurfaceView;Landroid/graphics/Rect;Landroid/graphics/Bitmap;Landroid/view/PixelCopy$OnPixelCopyFinishedListener;Landroid/os/Handler;)V" since="26"/>
+ <method name="request(Landroid/view/Window;Landroid/graphics/Bitmap;Landroid/view/PixelCopy$OnPixelCopyFinishedListener;Landroid/os/Handler;)V" since="26"/>
+ <method name="request(Landroid/view/Window;Landroid/graphics/Rect;Landroid/graphics/Bitmap;Landroid/view/PixelCopy$OnPixelCopyFinishedListener;Landroid/os/Handler;)V" since="26"/>
+ <field name="ERROR_DESTINATION_INVALID"/>
+ <field name="ERROR_SOURCE_INVALID"/>
+ <field name="ERROR_SOURCE_NO_DATA"/>
+ <field name="ERROR_TIMEOUT"/>
+ <field name="ERROR_UNKNOWN"/>
+ <field name="SUCCESS"/>
+ </class>
+ <class name="android/view/PixelCopy$OnPixelCopyFinishedListener" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="onPixelCopyFinished(I)V"/>
+ </class>
+ <class name="android/view/PointerIcon" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="create(Landroid/graphics/Bitmap;FF)Landroid/view/PointerIcon;"/>
+ <method name="getSystemIcon(Landroid/content/Context;I)Landroid/view/PointerIcon;"/>
+ <method name="load(Landroid/content/res/Resources;I)Landroid/view/PointerIcon;"/>
+ <field name="CREATOR"/>
+ <field name="TYPE_ALIAS"/>
+ <field name="TYPE_ALL_SCROLL"/>
+ <field name="TYPE_ARROW"/>
+ <field name="TYPE_CELL"/>
+ <field name="TYPE_CONTEXT_MENU"/>
+ <field name="TYPE_COPY"/>
+ <field name="TYPE_CROSSHAIR"/>
+ <field name="TYPE_DEFAULT"/>
+ <field name="TYPE_GRAB"/>
+ <field name="TYPE_GRABBING"/>
+ <field name="TYPE_HAND"/>
+ <field name="TYPE_HELP"/>
+ <field name="TYPE_HORIZONTAL_DOUBLE_ARROW"/>
+ <field name="TYPE_NO_DROP"/>
+ <field name="TYPE_NULL"/>
+ <field name="TYPE_TEXT"/>
+ <field name="TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW"/>
+ <field name="TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW"/>
+ <field name="TYPE_VERTICAL_DOUBLE_ARROW"/>
+ <field name="TYPE_VERTICAL_TEXT"/>
+ <field name="TYPE_WAIT"/>
+ <field name="TYPE_ZOOM_IN"/>
+ <field name="TYPE_ZOOM_OUT"/>
+ </class>
+ <class name="android/view/ScaleGestureDetector" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/ScaleGestureDetector$OnScaleGestureListener;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/ScaleGestureDetector$OnScaleGestureListener;Landroid/os/Handler;)V" since="19"/>
+ <method name="getCurrentSpan()F"/>
+ <method name="getCurrentSpanX()F" since="11"/>
+ <method name="getCurrentSpanY()F" since="11"/>
+ <method name="getEventTime()J"/>
+ <method name="getFocusX()F"/>
+ <method name="getFocusY()F"/>
+ <method name="getPreviousSpan()F"/>
+ <method name="getPreviousSpanX()F" since="11"/>
+ <method name="getPreviousSpanY()F" since="11"/>
+ <method name="getScaleFactor()F"/>
+ <method name="getTimeDelta()J"/>
+ <method name="isInProgress()Z"/>
+ <method name="isQuickScaleEnabled()Z" since="19"/>
+ <method name="isStylusScaleEnabled()Z" since="23"/>
+ <method name="onTouchEvent(Landroid/view/MotionEvent;)Z"/>
+ <method name="setQuickScaleEnabled(Z)V" since="19"/>
+ <method name="setStylusScaleEnabled(Z)V" since="23"/>
+ </class>
+ <class name="android/view/ScaleGestureDetector$OnScaleGestureListener" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="onScale(Landroid/view/ScaleGestureDetector;)Z"/>
+ <method name="onScaleBegin(Landroid/view/ScaleGestureDetector;)Z"/>
+ <method name="onScaleEnd(Landroid/view/ScaleGestureDetector;)V"/>
+ </class>
+ <class name="android/view/ScaleGestureDetector$SimpleOnScaleGestureListener" since="8">
+ <extends name="java/lang/Object"/>
+ <implements name="android/view/ScaleGestureDetector$OnScaleGestureListener"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/view/SearchEvent" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/view/InputDevice;)V"/>
+ <method name="getInputDevice()Landroid/view/InputDevice;"/>
+ </class>
+ <class name="android/view/SoundEffectConstants" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getContantForFocusDirection(I)I"/>
+ <field name="CLICK"/>
+ <field name="NAVIGATION_DOWN"/>
+ <field name="NAVIGATION_LEFT"/>
+ <field name="NAVIGATION_RIGHT"/>
+ <field name="NAVIGATION_UP"/>
+ </class>
+ <class name="android/view/SubMenu" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/view/Menu"/>
+ <method name="clearHeader()V"/>
+ <method name="getItem()Landroid/view/MenuItem;"/>
+ <method name="setHeaderIcon(I)Landroid/view/SubMenu;"/>
+ <method name="setHeaderIcon(Landroid/graphics/drawable/Drawable;)Landroid/view/SubMenu;"/>
+ <method name="setHeaderTitle(I)Landroid/view/SubMenu;"/>
+ <method name="setHeaderTitle(Ljava/lang/CharSequence;)Landroid/view/SubMenu;"/>
+ <method name="setHeaderView(Landroid/view/View;)Landroid/view/SubMenu;"/>
+ <method name="setIcon(I)Landroid/view/SubMenu;"/>
+ <method name="setIcon(Landroid/graphics/drawable/Drawable;)Landroid/view/SubMenu;"/>
+ </class>
+ <class name="android/view/Surface" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V" removed="14"/>
+ <method name="&lt;init>(Landroid/graphics/SurfaceTexture;)V" since="14"/>
+ <method name="freeze()V" removed="14"/>
+ <method name="hide()V" removed="14"/>
+ <method name="isValid()Z"/>
+ <method name="lockCanvas(Landroid/graphics/Rect;)Landroid/graphics/Canvas;"/>
+ <method name="lockHardwareCanvas()Landroid/graphics/Canvas;" since="23"/>
+ <method name="readFromParcel(Landroid/os/Parcel;)V"/>
+ <method name="release()V" since="14"/>
+ <method name="setAlpha(F)V" removed="14"/>
+ <method name="setFlags(II)V" removed="14"/>
+ <method name="setFreezeTint(I)V" removed="14"/>
+ <method name="setLayer(I)V" removed="14"/>
+ <method name="setMatrix(FFFF)V" removed="14"/>
+ <method name="setOrientation(II)V" removed="14"/>
+ <method name="setPosition(II)V" removed="14"/>
+ <method name="setSize(II)V" removed="14"/>
+ <method name="setTransparentRegionHint(Landroid/graphics/Region;)V" removed="14"/>
+ <method name="show()V" removed="14"/>
+ <method name="unfreeze()V" removed="14"/>
+ <method name="unlockCanvas(Landroid/graphics/Canvas;)V" deprecated="17"/>
+ <method name="unlockCanvasAndPost(Landroid/graphics/Canvas;)V"/>
+ <field name="CREATOR"/>
+ <field name="FX_SURFACE_BLUR" removed="14"/>
+ <field name="FX_SURFACE_DIM" removed="14"/>
+ <field name="FX_SURFACE_MASK" removed="14"/>
+ <field name="FX_SURFACE_NORMAL" removed="14"/>
+ <field name="GPU" removed="14"/>
+ <field name="HARDWARE" removed="14"/>
+ <field name="HIDDEN" removed="14"/>
+ <field name="NON_PREMULTIPLIED" removed="14"/>
+ <field name="PUSH_BUFFERS" removed="14"/>
+ <field name="ROTATION_0"/>
+ <field name="ROTATION_180"/>
+ <field name="ROTATION_270"/>
+ <field name="ROTATION_90"/>
+ <field name="SECURE" removed="14"/>
+ <field name="SURACE_FROZEN" removed="14"/>
+ <field name="SURFACE_BLUR_FREEZE" removed="14"/>
+ <field name="SURFACE_DITHER" removed="14"/>
+ <field name="SURFACE_FROZEN" since="4" removed="14"/>
+ <field name="SURFACE_HIDDEN" removed="14"/>
+ </class>
+ <class name="android/view/Surface$OutOfResourcesException" since="1">
+ <extends name="java/lang/Exception" removed="19"/>
+ <extends name="java/lang/RuntimeException" since="19"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/view/SurfaceHolder" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="addCallback(Landroid/view/SurfaceHolder$Callback;)V"/>
+ <method name="getSurface()Landroid/view/Surface;"/>
+ <method name="getSurfaceFrame()Landroid/graphics/Rect;"/>
+ <method name="isCreating()Z"/>
+ <method name="lockCanvas()Landroid/graphics/Canvas;"/>
+ <method name="lockCanvas(Landroid/graphics/Rect;)Landroid/graphics/Canvas;"/>
+ <method name="lockHardwareCanvas()Landroid/graphics/Canvas;" since="26"/>
+ <method name="removeCallback(Landroid/view/SurfaceHolder$Callback;)V"/>
+ <method name="setFixedSize(II)V"/>
+ <method name="setFormat(I)V"/>
+ <method name="setKeepScreenOn(Z)V"/>
+ <method name="setSizeFromLayout()V"/>
+ <method name="setType(I)V" deprecated="16"/>
+ <method name="unlockCanvasAndPost(Landroid/graphics/Canvas;)V"/>
+ <field name="SURFACE_TYPE_GPU" deprecated="16"/>
+ <field name="SURFACE_TYPE_HARDWARE" deprecated="16"/>
+ <field name="SURFACE_TYPE_NORMAL" deprecated="16"/>
+ <field name="SURFACE_TYPE_PUSH_BUFFERS" deprecated="16"/>
+ </class>
+ <class name="android/view/SurfaceHolder$BadSurfaceTypeException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/view/SurfaceHolder$Callback" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="surfaceChanged(Landroid/view/SurfaceHolder;III)V"/>
+ <method name="surfaceCreated(Landroid/view/SurfaceHolder;)V"/>
+ <method name="surfaceDestroyed(Landroid/view/SurfaceHolder;)V"/>
+ </class>
+ <class name="android/view/SurfaceHolder$Callback2" since="9">
+ <extends name="java/lang/Object"/>
+ <implements name="android/view/SurfaceHolder$Callback"/>
+ <method name="surfaceRedrawNeeded(Landroid/view/SurfaceHolder;)V"/>
+ <method name="surfaceRedrawNeededAsync(Landroid/view/SurfaceHolder;Ljava/lang/Runnable;)V" since="26"/>
+ </class>
+ <class name="android/view/SurfaceView" since="1">
+ <extends name="android/view/View"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="gatherTransparentRegion(Landroid/graphics/Region;)Z"/>
+ <method name="getHolder()Landroid/view/SurfaceHolder;"/>
+ <method name="setSecure(Z)V" since="17"/>
+ <method name="setZOrderMediaOverlay(Z)V" since="5"/>
+ <method name="setZOrderOnTop(Z)V" since="5"/>
+ </class>
+ <class name="android/view/TextureView" since="14">
+ <extends name="android/view/View"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getBitmap()Landroid/graphics/Bitmap;"/>
+ <method name="getBitmap(II)Landroid/graphics/Bitmap;"/>
+ <method name="getBitmap(Landroid/graphics/Bitmap;)Landroid/graphics/Bitmap;"/>
+ <method name="getSurfaceTexture()Landroid/graphics/SurfaceTexture;"/>
+ <method name="getSurfaceTextureListener()Landroid/view/TextureView$SurfaceTextureListener;"/>
+ <method name="getTransform(Landroid/graphics/Matrix;)Landroid/graphics/Matrix;"/>
+ <method name="isAvailable()Z"/>
+ <method name="lockCanvas()Landroid/graphics/Canvas;"/>
+ <method name="lockCanvas(Landroid/graphics/Rect;)Landroid/graphics/Canvas;"/>
+ <method name="setOpaque(Z)V"/>
+ <method name="setSurfaceTexture(Landroid/graphics/SurfaceTexture;)V" since="16"/>
+ <method name="setSurfaceTextureListener(Landroid/view/TextureView$SurfaceTextureListener;)V"/>
+ <method name="setTransform(Landroid/graphics/Matrix;)V"/>
+ <method name="unlockCanvasAndPost(Landroid/graphics/Canvas;)V"/>
+ </class>
+ <class name="android/view/TextureView$SurfaceTextureListener" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="onSurfaceTextureAvailable(Landroid/graphics/SurfaceTexture;II)V"/>
+ <method name="onSurfaceTextureDestroyed(Landroid/graphics/SurfaceTexture;)Z"/>
+ <method name="onSurfaceTextureSizeChanged(Landroid/graphics/SurfaceTexture;II)V"/>
+ <method name="onSurfaceTextureUpdated(Landroid/graphics/SurfaceTexture;)V"/>
+ </class>
+ <class name="android/view/TouchDelegate" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/graphics/Rect;Landroid/view/View;)V"/>
+ <method name="onTouchEvent(Landroid/view/MotionEvent;)Z"/>
+ <field name="ABOVE"/>
+ <field name="BELOW"/>
+ <field name="TO_LEFT"/>
+ <field name="TO_RIGHT"/>
+ </class>
+ <class name="android/view/VelocityTracker" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addMovement(Landroid/view/MotionEvent;)V"/>
+ <method name="clear()V"/>
+ <method name="computeCurrentVelocity(I)V"/>
+ <method name="computeCurrentVelocity(IF)V" since="4"/>
+ <method name="getXVelocity()F"/>
+ <method name="getXVelocity(I)F" since="8"/>
+ <method name="getYVelocity()F"/>
+ <method name="getYVelocity(I)F" since="8"/>
+ <method name="obtain()Landroid/view/VelocityTracker;"/>
+ <method name="recycle()V"/>
+ </class>
+ <class name="android/view/View" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/graphics/drawable/Drawable$Callback"/>
+ <implements name="android/view/KeyEvent$Callback"/>
+ <implements name="android/view/accessibility/AccessibilityEventSource" since="4"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="addChildrenForAccessibility(Ljava/util/ArrayList;)V" since="16"/>
+ <method name="addExtraDataToAccessibilityNodeInfo(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/String;Landroid/os/Bundle;)V" since="26"/>
+ <method name="addFocusables(Ljava/util/ArrayList;I)V"/>
+ <method name="addFocusables(Ljava/util/ArrayList;II)V" since="4"/>
+ <method name="addKeyboardNavigationClusters(Ljava/util/Collection;I)V" since="26"/>
+ <method name="addOnAttachStateChangeListener(Landroid/view/View$OnAttachStateChangeListener;)V" since="12"/>
+ <method name="addOnLayoutChangeListener(Landroid/view/View$OnLayoutChangeListener;)V" since="11"/>
+ <method name="addTouchables(Ljava/util/ArrayList;)V"/>
+ <method name="animate()Landroid/view/ViewPropertyAnimator;" since="12"/>
+ <method name="announceForAccessibility(Ljava/lang/CharSequence;)V" since="16"/>
+ <method name="autofill(Landroid/util/SparseArray;)V" since="26"/>
+ <method name="autofill(Landroid/view/autofill/AutofillValue;)V" since="26"/>
+ <method name="awakenScrollBars()Z" since="5"/>
+ <method name="awakenScrollBars(I)Z" since="5"/>
+ <method name="awakenScrollBars(IZ)Z" since="5"/>
+ <method name="bringToFront()V"/>
+ <method name="buildDrawingCache()V"/>
+ <method name="buildDrawingCache(Z)V" since="4"/>
+ <method name="buildLayer()V" since="12"/>
+ <method name="callOnClick()Z" since="15"/>
+ <method name="canResolveLayoutDirection()Z" since="19"/>
+ <method name="canResolveTextAlignment()Z" since="19"/>
+ <method name="canResolveTextDirection()Z" since="19"/>
+ <method name="canScrollHorizontally(I)Z" since="14"/>
+ <method name="canScrollVertically(I)Z" since="14"/>
+ <method name="cancelDragAndDrop()V" since="24"/>
+ <method name="cancelLongPress()V"/>
+ <method name="cancelPendingInputEvents()V" since="19"/>
+ <method name="checkInputConnectionProxy(Landroid/view/View;)Z" since="3"/>
+ <method name="clearAnimation()V"/>
+ <method name="clearFocus()V"/>
+ <method name="combineMeasuredStates(II)I" since="11"/>
+ <method name="computeHorizontalScrollExtent()I"/>
+ <method name="computeHorizontalScrollOffset()I"/>
+ <method name="computeHorizontalScrollRange()I"/>
+ <method name="computeScroll()V"/>
+ <method name="computeSystemWindowInsets(Landroid/view/WindowInsets;Landroid/graphics/Rect;)Landroid/view/WindowInsets;" since="21"/>
+ <method name="computeVerticalScrollExtent()I"/>
+ <method name="computeVerticalScrollOffset()I"/>
+ <method name="computeVerticalScrollRange()I"/>
+ <method name="createAccessibilityNodeInfo()Landroid/view/accessibility/AccessibilityNodeInfo;" since="14"/>
+ <method name="createContextMenu(Landroid/view/ContextMenu;)V"/>
+ <method name="destroyDrawingCache()V"/>
+ <method name="dispatchApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets;" since="20"/>
+ <method name="dispatchCapturedPointerEvent(Landroid/view/MotionEvent;)Z" since="26"/>
+ <method name="dispatchConfigurationChanged(Landroid/content/res/Configuration;)V" since="8"/>
+ <method name="dispatchDisplayHint(I)V" since="8"/>
+ <method name="dispatchDragEvent(Landroid/view/DragEvent;)Z" since="11"/>
+ <method name="dispatchDraw(Landroid/graphics/Canvas;)V"/>
+ <method name="dispatchDrawableHotspotChanged(FF)V" since="22"/>
+ <method name="dispatchFinishTemporaryDetach()V" since="24"/>
+ <method name="dispatchGenericFocusedEvent(Landroid/view/MotionEvent;)Z" since="14"/>
+ <method name="dispatchGenericMotionEvent(Landroid/view/MotionEvent;)Z" since="12"/>
+ <method name="dispatchGenericPointerEvent(Landroid/view/MotionEvent;)Z" since="14"/>
+ <method name="dispatchHoverEvent(Landroid/view/MotionEvent;)Z" since="14"/>
+ <method name="dispatchKeyEvent(Landroid/view/KeyEvent;)Z"/>
+ <method name="dispatchKeyEventPreIme(Landroid/view/KeyEvent;)Z" since="3"/>
+ <method name="dispatchKeyShortcutEvent(Landroid/view/KeyEvent;)Z"/>
+ <method name="dispatchNestedFling(FFZ)Z" since="21"/>
+ <method name="dispatchNestedPreFling(FF)Z" since="21"/>
+ <method name="dispatchNestedPrePerformAccessibilityAction(ILandroid/os/Bundle;)Z" since="22"/>
+ <method name="dispatchNestedPreScroll(II[I[I)Z" since="21"/>
+ <method name="dispatchNestedScroll(IIII[I)Z" since="21"/>
+ <method name="dispatchPointerCaptureChanged(Z)V" since="26"/>
+ <method name="dispatchPopulateAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)Z" since="4"/>
+ <method name="dispatchProvideAutofillStructure(Landroid/view/ViewStructure;I)V" since="26"/>
+ <method name="dispatchProvideStructure(Landroid/view/ViewStructure;)V" since="23"/>
+ <method name="dispatchRestoreInstanceState(Landroid/util/SparseArray;)V"/>
+ <method name="dispatchSaveInstanceState(Landroid/util/SparseArray;)V"/>
+ <method name="dispatchSetActivated(Z)V" since="11"/>
+ <method name="dispatchSetPressed(Z)V"/>
+ <method name="dispatchSetSelected(Z)V"/>
+ <method name="dispatchStartTemporaryDetach()V" since="24"/>
+ <method name="dispatchSystemUiVisibilityChanged(I)V" since="11"/>
+ <method name="dispatchTouchEvent(Landroid/view/MotionEvent;)Z"/>
+ <method name="dispatchTrackballEvent(Landroid/view/MotionEvent;)Z"/>
+ <method name="dispatchUnhandledMove(Landroid/view/View;I)Z"/>
+ <method name="dispatchVisibilityChanged(Landroid/view/View;I)V" since="8"/>
+ <method name="dispatchWindowFocusChanged(Z)V"/>
+ <method name="dispatchWindowSystemUiVisiblityChanged(I)V" since="16"/>
+ <method name="dispatchWindowVisibilityChanged(I)V"/>
+ <method name="draw(Landroid/graphics/Canvas;)V"/>
+ <method name="drawableHotspotChanged(FF)V" since="21"/>
+ <method name="drawableStateChanged()V"/>
+ <method name="findFocus()Landroid/view/View;"/>
+ <method name="findViewById(I)Landroid/view/View;"/>
+ <method name="findViewWithTag(Ljava/lang/Object;)Landroid/view/View;"/>
+ <method name="findViewsWithText(Ljava/util/ArrayList;Ljava/lang/CharSequence;I)V" since="14"/>
+ <method name="fitSystemWindows(Landroid/graphics/Rect;)Z" deprecated="20"/>
+ <method name="fitsSystemWindows()Z" since="14" removed="16"/>
+ <method name="focusSearch(I)Landroid/view/View;"/>
+ <method name="forceHasOverlappingRendering(Z)V" since="24"/>
+ <method name="forceLayout()V"/>
+ <method name="generateViewId()I" since="17"/>
+ <method name="getAccessibilityClassName()Ljava/lang/CharSequence;" since="23"/>
+ <method name="getAccessibilityLiveRegion()I" since="19"/>
+ <method name="getAccessibilityNodeProvider()Landroid/view/accessibility/AccessibilityNodeProvider;" since="16"/>
+ <method name="getAccessibilityTraversalAfter()I" since="22"/>
+ <method name="getAccessibilityTraversalBefore()I" since="22"/>
+ <method name="getAlpha()F" since="11"/>
+ <method name="getAnimation()Landroid/view/animation/Animation;"/>
+ <method name="getApplicationWindowToken()Landroid/os/IBinder;"/>
+ <method name="getAutofillHints()[Ljava/lang/String;" since="26"/>
+ <method name="getAutofillId()Landroid/view/autofill/AutofillId;" since="26"/>
+ <method name="getAutofillType()I" since="26"/>
+ <method name="getAutofillValue()Landroid/view/autofill/AutofillValue;" since="26"/>
+ <method name="getBackground()Landroid/graphics/drawable/Drawable;"/>
+ <method name="getBackgroundTintList()Landroid/content/res/ColorStateList;" since="21"/>
+ <method name="getBackgroundTintMode()Landroid/graphics/PorterDuff$Mode;" since="21"/>
+ <method name="getBaseline()I"/>
+ <method name="getBottom()I"/>
+ <method name="getBottomFadingEdgeStrength()F"/>
+ <method name="getBottomPaddingOffset()I" since="2"/>
+ <method name="getCameraDistance()F" since="16"/>
+ <method name="getClipBounds()Landroid/graphics/Rect;" since="18"/>
+ <method name="getClipBounds(Landroid/graphics/Rect;)Z" since="23"/>
+ <method name="getClipToOutline()Z" since="21"/>
+ <method name="getContentDescription()Ljava/lang/CharSequence;" since="4"/>
+ <method name="getContext()Landroid/content/Context;"/>
+ <method name="getContextMenuInfo()Landroid/view/ContextMenu$ContextMenuInfo;"/>
+ <method name="getDefaultFocusHighlightEnabled()Z" since="26"/>
+ <method name="getDefaultSize(II)I"/>
+ <method name="getDisplay()Landroid/view/Display;" since="17"/>
+ <method name="getDrawableState()[I"/>
+ <method name="getDrawingCache()Landroid/graphics/Bitmap;"/>
+ <method name="getDrawingCache(Z)Landroid/graphics/Bitmap;" since="4"/>
+ <method name="getDrawingCacheBackgroundColor()I"/>
+ <method name="getDrawingCacheQuality()I"/>
+ <method name="getDrawingRect(Landroid/graphics/Rect;)V"/>
+ <method name="getDrawingTime()J"/>
+ <method name="getElevation()F" since="21"/>
+ <method name="getFilterTouchesWhenObscured()Z" since="9"/>
+ <method name="getFitsSystemWindows()Z" since="16"/>
+ <method name="getFocusable()I" since="26"/>
+ <method name="getFocusables(I)Ljava/util/ArrayList;"/>
+ <method name="getFocusedRect(Landroid/graphics/Rect;)V"/>
+ <method name="getForeground()Landroid/graphics/drawable/Drawable;" since="23"/>
+ <method name="getForegroundGravity()I" since="23"/>
+ <method name="getForegroundTintList()Landroid/content/res/ColorStateList;" since="23"/>
+ <method name="getForegroundTintMode()Landroid/graphics/PorterDuff$Mode;" since="23"/>
+ <method name="getGlobalVisibleRect(Landroid/graphics/Rect;)Z"/>
+ <method name="getGlobalVisibleRect(Landroid/graphics/Rect;Landroid/graphics/Point;)Z"/>
+ <method name="getHandler()Landroid/os/Handler;"/>
+ <method name="getHasOverlappingRendering()Z" since="24"/>
+ <method name="getHeight()I"/>
+ <method name="getHitRect(Landroid/graphics/Rect;)V"/>
+ <method name="getHorizontalFadingEdgeLength()I"/>
+ <method name="getHorizontalScrollbarHeight()I"/>
+ <method name="getId()I"/>
+ <method name="getImportantForAccessibility()I" since="16"/>
+ <method name="getImportantForAutofill()I" since="26"/>
+ <method name="getKeepScreenOn()Z"/>
+ <method name="getKeyDispatcherState()Landroid/view/KeyEvent$DispatcherState;" since="5"/>
+ <method name="getLabelFor()I" since="17"/>
+ <method name="getLayerType()I" since="11"/>
+ <method name="getLayoutDirection()I" since="17"/>
+ <method name="getLayoutParams()Landroid/view/ViewGroup$LayoutParams;"/>
+ <method name="getLeft()I"/>
+ <method name="getLeftFadingEdgeStrength()F"/>
+ <method name="getLeftPaddingOffset()I" since="2"/>
+ <method name="getLocalVisibleRect(Landroid/graphics/Rect;)Z"/>
+ <method name="getLocationInWindow([I)V"/>
+ <method name="getLocationOnScreen([I)V"/>
+ <method name="getMatrix()Landroid/graphics/Matrix;" since="11"/>
+ <method name="getMeasuredHeight()I"/>
+ <method name="getMeasuredHeightAndState()I" since="11"/>
+ <method name="getMeasuredState()I" since="11"/>
+ <method name="getMeasuredWidth()I"/>
+ <method name="getMeasuredWidthAndState()I" since="11"/>
+ <method name="getMinimumHeight()I" since="16"/>
+ <method name="getMinimumWidth()I" since="16"/>
+ <method name="getNextClusterForwardId()I" since="26"/>
+ <method name="getNextFocusDownId()I"/>
+ <method name="getNextFocusForwardId()I" since="11"/>
+ <method name="getNextFocusLeftId()I"/>
+ <method name="getNextFocusRightId()I"/>
+ <method name="getNextFocusUpId()I"/>
+ <method name="getOnFocusChangeListener()Landroid/view/View$OnFocusChangeListener;"/>
+ <method name="getOutlineProvider()Landroid/view/ViewOutlineProvider;" since="21"/>
+ <method name="getOverScrollMode()I" since="9"/>
+ <method name="getOverlay()Landroid/view/ViewOverlay;" since="18"/>
+ <method name="getPaddingBottom()I"/>
+ <method name="getPaddingEnd()I" since="17"/>
+ <method name="getPaddingLeft()I"/>
+ <method name="getPaddingRight()I"/>
+ <method name="getPaddingStart()I" since="17"/>
+ <method name="getPaddingTop()I"/>
+ <method name="getParent()Landroid/view/ViewParent;"/>
+ <method name="getParentForAccessibility()Landroid/view/ViewParent;" since="16"/>
+ <method name="getPivotX()F" since="11"/>
+ <method name="getPivotY()F" since="11"/>
+ <method name="getPointerIcon()Landroid/view/PointerIcon;" since="24"/>
+ <method name="getResources()Landroid/content/res/Resources;"/>
+ <method name="getRevealOnFocusHint()Z" since="25"/>
+ <method name="getRight()I"/>
+ <method name="getRightFadingEdgeStrength()F"/>
+ <method name="getRightPaddingOffset()I" since="2"/>
+ <method name="getRootView()Landroid/view/View;"/>
+ <method name="getRootWindowInsets()Landroid/view/WindowInsets;" since="23"/>
+ <method name="getRotation()F" since="11"/>
+ <method name="getRotationX()F" since="11"/>
+ <method name="getRotationY()F" since="11"/>
+ <method name="getScaleX()F" since="11"/>
+ <method name="getScaleY()F" since="11"/>
+ <method name="getScrollBarDefaultDelayBeforeFade()I" since="16"/>
+ <method name="getScrollBarFadeDuration()I" since="16"/>
+ <method name="getScrollBarSize()I" since="16"/>
+ <method name="getScrollBarStyle()I"/>
+ <method name="getScrollIndicators()I" since="23"/>
+ <method name="getScrollX()I"/>
+ <method name="getScrollY()I"/>
+ <method name="getSolidColor()I"/>
+ <method name="getStateListAnimator()Landroid/animation/StateListAnimator;" since="21"/>
+ <method name="getSuggestedMinimumHeight()I"/>
+ <method name="getSuggestedMinimumWidth()I"/>
+ <method name="getSystemUiVisibility()I" since="11"/>
+ <method name="getTag()Ljava/lang/Object;"/>
+ <method name="getTag(I)Ljava/lang/Object;" since="4"/>
+ <method name="getTextAlignment()I" since="17"/>
+ <method name="getTextDirection()I" since="17"/>
+ <method name="getTooltipText()Ljava/lang/CharSequence;" since="26"/>
+ <method name="getTop()I"/>
+ <method name="getTopFadingEdgeStrength()F"/>
+ <method name="getTopPaddingOffset()I" since="2"/>
+ <method name="getTouchDelegate()Landroid/view/TouchDelegate;"/>
+ <method name="getTouchables()Ljava/util/ArrayList;"/>
+ <method name="getTransitionName()Ljava/lang/String;" since="21"/>
+ <method name="getTranslationX()F" since="11"/>
+ <method name="getTranslationY()F" since="11"/>
+ <method name="getTranslationZ()F" since="21"/>
+ <method name="getVerticalFadingEdgeLength()I"/>
+ <method name="getVerticalScrollbarPosition()I" since="11"/>
+ <method name="getVerticalScrollbarWidth()I"/>
+ <method name="getViewTreeObserver()Landroid/view/ViewTreeObserver;"/>
+ <method name="getVisibility()I"/>
+ <method name="getWidth()I"/>
+ <method name="getWindowAttachCount()I"/>
+ <method name="getWindowId()Landroid/view/WindowId;" since="18"/>
+ <method name="getWindowSystemUiVisibility()I" since="16"/>
+ <method name="getWindowToken()Landroid/os/IBinder;"/>
+ <method name="getWindowVisibility()I"/>
+ <method name="getWindowVisibleDisplayFrame(Landroid/graphics/Rect;)V" since="3"/>
+ <method name="getX()F" since="11"/>
+ <method name="getY()F" since="11"/>
+ <method name="getZ()F" since="21"/>
+ <method name="hasExplicitFocusable()Z" since="26"/>
+ <method name="hasFocus()Z"/>
+ <method name="hasFocusable()Z"/>
+ <method name="hasNestedScrollingParent()Z" since="21"/>
+ <method name="hasOnClickListeners()Z" since="15"/>
+ <method name="hasOverlappingRendering()Z" since="16"/>
+ <method name="hasPointerCapture()Z" since="26"/>
+ <method name="hasTransientState()Z" since="16"/>
+ <method name="hasWindowFocus()Z"/>
+ <method name="inflate(Landroid/content/Context;ILandroid/view/ViewGroup;)Landroid/view/View;"/>
+ <method name="initializeFadingEdge(Landroid/content/res/TypedArray;)V" removed="21"/>
+ <method name="initializeScrollbars(Landroid/content/res/TypedArray;)V" removed="21"/>
+ <method name="invalidate()V"/>
+ <method name="invalidate(IIII)V"/>
+ <method name="invalidate(Landroid/graphics/Rect;)V"/>
+ <method name="invalidateOutline()V" since="21"/>
+ <method name="isAccessibilityFocused()Z" since="21"/>
+ <method name="isActivated()Z" since="11"/>
+ <method name="isAttachedToWindow()Z" since="19"/>
+ <method name="isClickable()Z"/>
+ <method name="isContextClickable()Z" since="23"/>
+ <method name="isDirty()Z" since="11"/>
+ <method name="isDrawingCacheEnabled()Z"/>
+ <method name="isDuplicateParentStateEnabled()Z"/>
+ <method name="isEnabled()Z"/>
+ <method name="isFocusable()Z"/>
+ <method name="isFocusableInTouchMode()Z"/>
+ <method name="isFocused()Z"/>
+ <method name="isFocusedByDefault()Z" since="26"/>
+ <method name="isHapticFeedbackEnabled()Z" since="3"/>
+ <method name="isHardwareAccelerated()Z" since="11"/>
+ <method name="isHorizontalFadingEdgeEnabled()Z"/>
+ <method name="isHorizontalScrollBarEnabled()Z"/>
+ <method name="isHovered()Z" since="14"/>
+ <method name="isImportantForAccessibility()Z" since="21"/>
+ <method name="isImportantForAutofill()Z" since="26"/>
+ <method name="isInEditMode()Z" since="3"/>
+ <method name="isInLayout()Z" since="18"/>
+ <method name="isInTouchMode()Z"/>
+ <method name="isKeyboardNavigationCluster()Z" since="26"/>
+ <method name="isLaidOut()Z" since="19"/>
+ <method name="isLayoutDirectionResolved()Z" since="19"/>
+ <method name="isLayoutRequested()Z"/>
+ <method name="isLongClickable()Z"/>
+ <method name="isNestedScrollingEnabled()Z" since="21"/>
+ <method name="isOpaque()Z" since="7"/>
+ <method name="isPaddingOffsetRequired()Z" since="2"/>
+ <method name="isPaddingRelative()Z" since="17"/>
+ <method name="isPressed()Z"/>
+ <method name="isSaveEnabled()Z"/>
+ <method name="isSaveFromParentEnabled()Z" since="11"/>
+ <method name="isScrollContainer()Z" since="16"/>
+ <method name="isScrollbarFadingEnabled()Z" since="5"/>
+ <method name="isSelected()Z"/>
+ <method name="isShown()Z"/>
+ <method name="isSoundEffectsEnabled()Z"/>
+ <method name="isTemporarilyDetached()Z" since="24"/>
+ <method name="isTextAlignmentResolved()Z" since="19"/>
+ <method name="isTextDirectionResolved()Z" since="19"/>
+ <method name="isVerticalFadingEdgeEnabled()Z"/>
+ <method name="isVerticalScrollBarEnabled()Z"/>
+ <method name="jumpDrawablesToCurrentState()V" since="11"/>
+ <method name="keyboardNavigationClusterSearch(Landroid/view/View;I)Landroid/view/View;" since="26"/>
+ <method name="layout(IIII)V"/>
+ <method name="measure(II)V"/>
+ <method name="mergeDrawableStates([I[I)[I"/>
+ <method name="offsetLeftAndRight(I)V"/>
+ <method name="offsetTopAndBottom(I)V"/>
+ <method name="onAnimationEnd()V"/>
+ <method name="onAnimationStart()V"/>
+ <method name="onApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets;" since="20"/>
+ <method name="onAttachedToWindow()V"/>
+ <method name="onCancelPendingInputEvents()V" since="19"/>
+ <method name="onCapturedPointerEvent(Landroid/view/MotionEvent;)Z" since="26"/>
+ <method name="onCheckIsTextEditor()Z" since="3"/>
+ <method name="onConfigurationChanged(Landroid/content/res/Configuration;)V" since="8"/>
+ <method name="onCreateContextMenu(Landroid/view/ContextMenu;)V"/>
+ <method name="onCreateDrawableState(I)[I"/>
+ <method name="onCreateInputConnection(Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection;" since="3"/>
+ <method name="onDetachedFromWindow()V"/>
+ <method name="onDisplayHint(I)V" since="8"/>
+ <method name="onDragEvent(Landroid/view/DragEvent;)Z" since="11"/>
+ <method name="onDraw(Landroid/graphics/Canvas;)V"/>
+ <method name="onDrawForeground(Landroid/graphics/Canvas;)V" since="23"/>
+ <method name="onDrawScrollBars(Landroid/graphics/Canvas;)V" since="7"/>
+ <method name="onFilterTouchEventForSecurity(Landroid/view/MotionEvent;)Z" since="9"/>
+ <method name="onFinishInflate()V"/>
+ <method name="onFinishTemporaryDetach()V" since="3"/>
+ <method name="onFocusChanged(ZILandroid/graphics/Rect;)V"/>
+ <method name="onGenericMotionEvent(Landroid/view/MotionEvent;)Z" since="12"/>
+ <method name="onHoverChanged(Z)V" since="14"/>
+ <method name="onHoverEvent(Landroid/view/MotionEvent;)Z" since="14"/>
+ <method name="onInitializeAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V" since="14"/>
+ <method name="onInitializeAccessibilityNodeInfo(Landroid/view/accessibility/AccessibilityNodeInfo;)V" since="14"/>
+ <method name="onKeyPreIme(ILandroid/view/KeyEvent;)Z" since="3"/>
+ <method name="onKeyShortcut(ILandroid/view/KeyEvent;)Z"/>
+ <method name="onLayout(ZIIII)V"/>
+ <method name="onMeasure(II)V"/>
+ <method name="onOverScrolled(IIZZ)V" since="9"/>
+ <method name="onPointerCaptureChange(Z)V" since="26"/>
+ <method name="onPopulateAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V" since="14"/>
+ <method name="onProvideAutofillStructure(Landroid/view/ViewStructure;I)V" since="26"/>
+ <method name="onProvideAutofillVirtualStructure(Landroid/view/ViewStructure;I)V" since="26"/>
+ <method name="onProvideStructure(Landroid/view/ViewStructure;)V" since="23"/>
+ <method name="onProvideVirtualStructure(Landroid/view/ViewStructure;)V" since="23"/>
+ <method name="onResolvePointerIcon(Landroid/view/MotionEvent;I)Landroid/view/PointerIcon;" since="24"/>
+ <method name="onRestoreInstanceState(Landroid/os/Parcelable;)V"/>
+ <method name="onRtlPropertiesChanged(I)V" since="17"/>
+ <method name="onSaveInstanceState()Landroid/os/Parcelable;"/>
+ <method name="onScreenStateChanged(I)V" since="16"/>
+ <method name="onScrollChanged(IIII)V"/>
+ <method name="onSetAlpha(I)Z"/>
+ <method name="onSizeChanged(IIII)V"/>
+ <method name="onStartTemporaryDetach()V" since="3"/>
+ <method name="onTouchEvent(Landroid/view/MotionEvent;)Z"/>
+ <method name="onTrackballEvent(Landroid/view/MotionEvent;)Z"/>
+ <method name="onVisibilityAggregated(Z)V" since="24"/>
+ <method name="onVisibilityChanged(Landroid/view/View;I)V" since="8"/>
+ <method name="onWindowFocusChanged(Z)V"/>
+ <method name="onWindowSystemUiVisibilityChanged(I)V" since="16"/>
+ <method name="onWindowVisibilityChanged(I)V"/>
+ <method name="overScrollBy(IIIIIIIIZ)Z" since="9"/>
+ <method name="performAccessibilityAction(ILandroid/os/Bundle;)Z" since="16"/>
+ <method name="performClick()Z"/>
+ <method name="performContextClick()Z" since="23"/>
+ <method name="performContextClick(FF)Z" since="24"/>
+ <method name="performHapticFeedback(I)Z" since="3"/>
+ <method name="performHapticFeedback(II)Z" since="3"/>
+ <method name="performLongClick()Z"/>
+ <method name="performLongClick(FF)Z" since="24"/>
+ <method name="playSoundEffect(I)V"/>
+ <method name="post(Ljava/lang/Runnable;)Z"/>
+ <method name="postDelayed(Ljava/lang/Runnable;J)Z"/>
+ <method name="postInvalidate()V"/>
+ <method name="postInvalidate(IIII)V"/>
+ <method name="postInvalidateDelayed(J)V"/>
+ <method name="postInvalidateDelayed(JIIII)V"/>
+ <method name="postInvalidateOnAnimation()V" since="16"/>
+ <method name="postInvalidateOnAnimation(IIII)V" since="16"/>
+ <method name="postOnAnimation(Ljava/lang/Runnable;)V" since="16"/>
+ <method name="postOnAnimationDelayed(Ljava/lang/Runnable;J)V" since="16"/>
+ <method name="refreshDrawableState()V"/>
+ <method name="releasePointerCapture()V" since="26"/>
+ <method name="removeCallbacks(Ljava/lang/Runnable;)Z"/>
+ <method name="removeOnAttachStateChangeListener(Landroid/view/View$OnAttachStateChangeListener;)V" since="12"/>
+ <method name="removeOnLayoutChangeListener(Landroid/view/View$OnLayoutChangeListener;)V" since="11"/>
+ <method name="requestApplyInsets()V" since="20"/>
+ <method name="requestFitSystemWindows()V" since="16" deprecated="20"/>
+ <method name="requestFocus()Z"/>
+ <method name="requestFocus(I)Z"/>
+ <method name="requestFocus(ILandroid/graphics/Rect;)Z"/>
+ <method name="requestFocusFromTouch()Z"/>
+ <method name="requestLayout()V"/>
+ <method name="requestPointerCapture()V" since="26"/>
+ <method name="requestRectangleOnScreen(Landroid/graphics/Rect;)Z"/>
+ <method name="requestRectangleOnScreen(Landroid/graphics/Rect;Z)Z"/>
+ <method name="requestUnbufferedDispatch(Landroid/view/MotionEvent;)V" since="21"/>
+ <method name="resolveSize(II)I"/>
+ <method name="resolveSizeAndState(III)I" since="11"/>
+ <method name="restoreDefaultFocus()Z" since="26"/>
+ <method name="restoreHierarchyState(Landroid/util/SparseArray;)V"/>
+ <method name="saveHierarchyState(Landroid/util/SparseArray;)V"/>
+ <method name="scrollBy(II)V"/>
+ <method name="scrollTo(II)V"/>
+ <method name="setAccessibilityDelegate(Landroid/view/View$AccessibilityDelegate;)V" since="14"/>
+ <method name="setAccessibilityLiveRegion(I)V" since="19"/>
+ <method name="setAccessibilityTraversalAfter(I)V" since="22"/>
+ <method name="setAccessibilityTraversalBefore(I)V" since="22"/>
+ <method name="setActivated(Z)V" since="11"/>
+ <method name="setAlpha(F)V" since="11"/>
+ <method name="setAnimation(Landroid/view/animation/Animation;)V"/>
+ <method name="setAutofillHints([Ljava/lang/String;)V" since="26"/>
+ <method name="setBackground(Landroid/graphics/drawable/Drawable;)V" since="16"/>
+ <method name="setBackgroundColor(I)V"/>
+ <method name="setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V" deprecated="16"/>
+ <method name="setBackgroundResource(I)V"/>
+ <method name="setBackgroundTintList(Landroid/content/res/ColorStateList;)V" since="21"/>
+ <method name="setBackgroundTintMode(Landroid/graphics/PorterDuff$Mode;)V" since="21"/>
+ <method name="setBottom(I)V" since="11"/>
+ <method name="setCameraDistance(F)V" since="12"/>
+ <method name="setClickable(Z)V"/>
+ <method name="setClipBounds(Landroid/graphics/Rect;)V" since="18"/>
+ <method name="setClipToOutline(Z)V" since="21"/>
+ <method name="setContentDescription(Ljava/lang/CharSequence;)V" since="4"/>
+ <method name="setContextClickable(Z)V" since="23"/>
+ <method name="setDefaultFocusHighlightEnabled(Z)V" since="26"/>
+ <method name="setDrawingCacheBackgroundColor(I)V"/>
+ <method name="setDrawingCacheEnabled(Z)V"/>
+ <method name="setDrawingCacheQuality(I)V"/>
+ <method name="setDuplicateParentStateEnabled(Z)V"/>
+ <method name="setElevation(F)V" since="21"/>
+ <method name="setEnabled(Z)V"/>
+ <method name="setFadingEdgeLength(I)V"/>
+ <method name="setFilterTouchesWhenObscured(Z)V" since="9"/>
+ <method name="setFitsSystemWindows(Z)V" since="14"/>
+ <method name="setFocusable(I)V" since="26"/>
+ <method name="setFocusable(Z)V"/>
+ <method name="setFocusableInTouchMode(Z)V"/>
+ <method name="setFocusedByDefault(Z)V" since="26"/>
+ <method name="setForeground(Landroid/graphics/drawable/Drawable;)V" since="23"/>
+ <method name="setForegroundGravity(I)V" since="23"/>
+ <method name="setForegroundTintList(Landroid/content/res/ColorStateList;)V" since="23"/>
+ <method name="setForegroundTintMode(Landroid/graphics/PorterDuff$Mode;)V" since="23"/>
+ <method name="setHapticFeedbackEnabled(Z)V" since="3"/>
+ <method name="setHasTransientState(Z)V" since="16"/>
+ <method name="setHorizontalFadingEdgeEnabled(Z)V"/>
+ <method name="setHorizontalScrollBarEnabled(Z)V"/>
+ <method name="setHovered(Z)V" since="14"/>
+ <method name="setId(I)V"/>
+ <method name="setImportantForAccessibility(I)V" since="16"/>
+ <method name="setImportantForAutofill(I)V" since="26"/>
+ <method name="setKeepScreenOn(Z)V"/>
+ <method name="setKeyboardNavigationCluster(Z)V" since="26"/>
+ <method name="setLabelFor(I)V" since="17"/>
+ <method name="setLayerPaint(Landroid/graphics/Paint;)V" since="17"/>
+ <method name="setLayerType(ILandroid/graphics/Paint;)V" since="11"/>
+ <method name="setLayoutDirection(I)V" since="17"/>
+ <method name="setLayoutParams(Landroid/view/ViewGroup$LayoutParams;)V"/>
+ <method name="setLeft(I)V" since="11"/>
+ <method name="setLongClickable(Z)V"/>
+ <method name="setMeasuredDimension(II)V"/>
+ <method name="setMinimumHeight(I)V"/>
+ <method name="setMinimumWidth(I)V"/>
+ <method name="setNestedScrollingEnabled(Z)V" since="21"/>
+ <method name="setNextClusterForwardId(I)V" since="26"/>
+ <method name="setNextFocusDownId(I)V"/>
+ <method name="setNextFocusForwardId(I)V" since="11"/>
+ <method name="setNextFocusLeftId(I)V"/>
+ <method name="setNextFocusRightId(I)V"/>
+ <method name="setNextFocusUpId(I)V"/>
+ <method name="setOnApplyWindowInsetsListener(Landroid/view/View$OnApplyWindowInsetsListener;)V" since="20"/>
+ <method name="setOnCapturedPointerListener(Landroid/view/View$OnCapturedPointerListener;)V" since="26"/>
+ <method name="setOnClickListener(Landroid/view/View$OnClickListener;)V"/>
+ <method name="setOnContextClickListener(Landroid/view/View$OnContextClickListener;)V" since="23"/>
+ <method name="setOnCreateContextMenuListener(Landroid/view/View$OnCreateContextMenuListener;)V"/>
+ <method name="setOnDragListener(Landroid/view/View$OnDragListener;)V" since="11"/>
+ <method name="setOnFocusChangeListener(Landroid/view/View$OnFocusChangeListener;)V"/>
+ <method name="setOnGenericMotionListener(Landroid/view/View$OnGenericMotionListener;)V" since="12"/>
+ <method name="setOnHoverListener(Landroid/view/View$OnHoverListener;)V" since="14"/>
+ <method name="setOnKeyListener(Landroid/view/View$OnKeyListener;)V"/>
+ <method name="setOnLongClickListener(Landroid/view/View$OnLongClickListener;)V"/>
+ <method name="setOnScrollChangeListener(Landroid/view/View$OnScrollChangeListener;)V" since="23"/>
+ <method name="setOnSystemUiVisibilityChangeListener(Landroid/view/View$OnSystemUiVisibilityChangeListener;)V" since="11"/>
+ <method name="setOnTouchListener(Landroid/view/View$OnTouchListener;)V"/>
+ <method name="setOutlineProvider(Landroid/view/ViewOutlineProvider;)V" since="21"/>
+ <method name="setOverScrollMode(I)V" since="9"/>
+ <method name="setPadding(IIII)V"/>
+ <method name="setPaddingRelative(IIII)V" since="17"/>
+ <method name="setPivotX(F)V" since="11"/>
+ <method name="setPivotY(F)V" since="11"/>
+ <method name="setPointerIcon(Landroid/view/PointerIcon;)V" since="24"/>
+ <method name="setPressed(Z)V"/>
+ <method name="setRevealOnFocusHint(Z)V" since="25"/>
+ <method name="setRight(I)V" since="11"/>
+ <method name="setRotation(F)V" since="11"/>
+ <method name="setRotationX(F)V" since="11"/>
+ <method name="setRotationY(F)V" since="11"/>
+ <method name="setSaveEnabled(Z)V"/>
+ <method name="setSaveFromParentEnabled(Z)V" since="11"/>
+ <method name="setScaleX(F)V" since="11"/>
+ <method name="setScaleY(F)V" since="11"/>
+ <method name="setScrollBarDefaultDelayBeforeFade(I)V" since="16"/>
+ <method name="setScrollBarFadeDuration(I)V" since="16"/>
+ <method name="setScrollBarSize(I)V" since="16"/>
+ <method name="setScrollBarStyle(I)V"/>
+ <method name="setScrollContainer(Z)V" since="3"/>
+ <method name="setScrollIndicators(I)V" since="23"/>
+ <method name="setScrollIndicators(II)V" since="23"/>
+ <method name="setScrollX(I)V" since="14"/>
+ <method name="setScrollY(I)V" since="14"/>
+ <method name="setScrollbarFadingEnabled(Z)V" since="5"/>
+ <method name="setSelected(Z)V"/>
+ <method name="setSoundEffectsEnabled(Z)V"/>
+ <method name="setStateListAnimator(Landroid/animation/StateListAnimator;)V" since="21"/>
+ <method name="setSystemUiVisibility(I)V" since="11"/>
+ <method name="setTag(ILjava/lang/Object;)V" since="4"/>
+ <method name="setTag(Ljava/lang/Object;)V"/>
+ <method name="setTextAlignment(I)V" since="17"/>
+ <method name="setTextDirection(I)V" since="17"/>
+ <method name="setTooltipText(Ljava/lang/CharSequence;)V" since="26"/>
+ <method name="setTop(I)V" since="11"/>
+ <method name="setTouchDelegate(Landroid/view/TouchDelegate;)V"/>
+ <method name="setTransitionName(Ljava/lang/String;)V" since="21"/>
+ <method name="setTranslationX(F)V" since="11"/>
+ <method name="setTranslationY(F)V" since="11"/>
+ <method name="setTranslationZ(F)V" since="21"/>
+ <method name="setVerticalFadingEdgeEnabled(Z)V"/>
+ <method name="setVerticalScrollBarEnabled(Z)V"/>
+ <method name="setVerticalScrollbarPosition(I)V" since="11"/>
+ <method name="setVisibility(I)V"/>
+ <method name="setWillNotCacheDrawing(Z)V"/>
+ <method name="setWillNotDraw(Z)V"/>
+ <method name="setX(F)V" since="11"/>
+ <method name="setY(F)V" since="11"/>
+ <method name="setZ(F)V" since="21"/>
+ <method name="showContextMenu()Z"/>
+ <method name="showContextMenu(FF)Z" since="24"/>
+ <method name="startActionMode(Landroid/view/ActionMode$Callback;)Landroid/view/ActionMode;" since="11"/>
+ <method name="startActionMode(Landroid/view/ActionMode$Callback;I)Landroid/view/ActionMode;" since="23"/>
+ <method name="startAnimation(Landroid/view/animation/Animation;)V"/>
+ <method name="startDrag(Landroid/content/ClipData;Landroid/view/View$DragShadowBuilder;Ljava/lang/Object;I)Z" since="11" deprecated="24"/>
+ <method name="startDragAndDrop(Landroid/content/ClipData;Landroid/view/View$DragShadowBuilder;Ljava/lang/Object;I)Z" since="24"/>
+ <method name="startNestedScroll(I)Z" since="21"/>
+ <method name="stopNestedScroll()V" since="21"/>
+ <method name="unscheduleDrawable(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="updateDragShadow(Landroid/view/View$DragShadowBuilder;)V" since="24"/>
+ <method name="verifyDrawable(Landroid/graphics/drawable/Drawable;)Z"/>
+ <method name="willNotCacheDrawing()Z"/>
+ <method name="willNotDraw()Z"/>
+ <field name="ACCESSIBILITY_LIVE_REGION_ASSERTIVE" since="19"/>
+ <field name="ACCESSIBILITY_LIVE_REGION_NONE" since="19"/>
+ <field name="ACCESSIBILITY_LIVE_REGION_POLITE" since="19"/>
+ <field name="ALPHA" since="14"/>
+ <field name="AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS" since="26"/>
+ <field name="AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE" since="26"/>
+ <field name="AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY" since="26"/>
+ <field name="AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH" since="26"/>
+ <field name="AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR" since="26"/>
+ <field name="AUTOFILL_HINT_CREDIT_CARD_NUMBER" since="26"/>
+ <field name="AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE" since="26"/>
+ <field name="AUTOFILL_HINT_EMAIL_ADDRESS" since="26"/>
+ <field name="AUTOFILL_HINT_NAME" since="26"/>
+ <field name="AUTOFILL_HINT_PASSWORD" since="26"/>
+ <field name="AUTOFILL_HINT_PHONE" since="26"/>
+ <field name="AUTOFILL_HINT_POSTAL_ADDRESS" since="26"/>
+ <field name="AUTOFILL_HINT_POSTAL_CODE" since="26"/>
+ <field name="AUTOFILL_HINT_USERNAME" since="26"/>
+ <field name="AUTOFILL_TYPE_DATE" since="26"/>
+ <field name="AUTOFILL_TYPE_LIST" since="26"/>
+ <field name="AUTOFILL_TYPE_NONE" since="26"/>
+ <field name="AUTOFILL_TYPE_TEXT" since="26"/>
+ <field name="AUTOFILL_TYPE_TOGGLE" since="26"/>
+ <field name="DRAG_FLAG_GLOBAL" since="24"/>
+ <field name="DRAG_FLAG_GLOBAL_PERSISTABLE_URI_PERMISSION" since="24"/>
+ <field name="DRAG_FLAG_GLOBAL_PREFIX_URI_PERMISSION" since="24"/>
+ <field name="DRAG_FLAG_GLOBAL_URI_READ" since="24"/>
+ <field name="DRAG_FLAG_GLOBAL_URI_WRITE" since="24"/>
+ <field name="DRAG_FLAG_OPAQUE" since="24"/>
+ <field name="DRAWING_CACHE_QUALITY_AUTO"/>
+ <field name="DRAWING_CACHE_QUALITY_HIGH"/>
+ <field name="DRAWING_CACHE_QUALITY_LOW"/>
+ <field name="EMPTY_STATE_SET"/>
+ <field name="ENABLED_FOCUSED_SELECTED_STATE_SET"/>
+ <field name="ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET"/>
+ <field name="ENABLED_FOCUSED_STATE_SET"/>
+ <field name="ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET"/>
+ <field name="ENABLED_SELECTED_STATE_SET"/>
+ <field name="ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET"/>
+ <field name="ENABLED_STATE_SET"/>
+ <field name="ENABLED_WINDOW_FOCUSED_STATE_SET"/>
+ <field name="FIND_VIEWS_WITH_CONTENT_DESCRIPTION" since="14"/>
+ <field name="FIND_VIEWS_WITH_TEXT" since="14"/>
+ <field name="FOCUSABLE" since="26"/>
+ <field name="FOCUSABLES_ALL" since="4"/>
+ <field name="FOCUSABLES_TOUCH_MODE" since="4"/>
+ <field name="FOCUSABLE_AUTO" since="26"/>
+ <field name="FOCUSED_SELECTED_STATE_SET"/>
+ <field name="FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET"/>
+ <field name="FOCUSED_STATE_SET"/>
+ <field name="FOCUSED_WINDOW_FOCUSED_STATE_SET"/>
+ <field name="FOCUS_BACKWARD"/>
+ <field name="FOCUS_DOWN"/>
+ <field name="FOCUS_FORWARD"/>
+ <field name="FOCUS_LEFT"/>
+ <field name="FOCUS_RIGHT"/>
+ <field name="FOCUS_UP"/>
+ <field name="GONE"/>
+ <field name="HAPTIC_FEEDBACK_ENABLED" since="3"/>
+ <field name="IMPORTANT_FOR_ACCESSIBILITY_AUTO" since="16"/>
+ <field name="IMPORTANT_FOR_ACCESSIBILITY_NO" since="16"/>
+ <field name="IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS" since="19"/>
+ <field name="IMPORTANT_FOR_ACCESSIBILITY_YES" since="16"/>
+ <field name="IMPORTANT_FOR_AUTOFILL_AUTO" since="26"/>
+ <field name="IMPORTANT_FOR_AUTOFILL_NO" since="26"/>
+ <field name="IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS" since="26"/>
+ <field name="IMPORTANT_FOR_AUTOFILL_YES" since="26"/>
+ <field name="IMPORTANT_FOR_AUTOFILL_YES_EXCLUDE_DESCENDANTS" since="26"/>
+ <field name="INVISIBLE"/>
+ <field name="KEEP_SCREEN_ON"/>
+ <field name="LAYER_TYPE_HARDWARE" since="11"/>
+ <field name="LAYER_TYPE_NONE" since="11"/>
+ <field name="LAYER_TYPE_SOFTWARE" since="11"/>
+ <field name="LAYOUT_DIRECTION_INHERIT" since="17"/>
+ <field name="LAYOUT_DIRECTION_LOCALE" since="17"/>
+ <field name="LAYOUT_DIRECTION_LTR" since="17"/>
+ <field name="LAYOUT_DIRECTION_RTL" since="17"/>
+ <field name="MEASURED_HEIGHT_STATE_SHIFT" since="11"/>
+ <field name="MEASURED_SIZE_MASK" since="11"/>
+ <field name="MEASURED_STATE_MASK" since="11"/>
+ <field name="MEASURED_STATE_TOO_SMALL" since="11"/>
+ <field name="NOT_FOCUSABLE" since="26"/>
+ <field name="NO_ID"/>
+ <field name="OVER_SCROLL_ALWAYS" since="9"/>
+ <field name="OVER_SCROLL_IF_CONTENT_SCROLLS" since="9"/>
+ <field name="OVER_SCROLL_NEVER" since="9"/>
+ <field name="PRESSED_ENABLED_FOCUSED_SELECTED_STATE_SET"/>
+ <field name="PRESSED_ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET"/>
+ <field name="PRESSED_ENABLED_FOCUSED_STATE_SET"/>
+ <field name="PRESSED_ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET"/>
+ <field name="PRESSED_ENABLED_SELECTED_STATE_SET"/>
+ <field name="PRESSED_ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET"/>
+ <field name="PRESSED_ENABLED_STATE_SET"/>
+ <field name="PRESSED_ENABLED_WINDOW_FOCUSED_STATE_SET"/>
+ <field name="PRESSED_FOCUSED_SELECTED_STATE_SET"/>
+ <field name="PRESSED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET"/>
+ <field name="PRESSED_FOCUSED_STATE_SET"/>
+ <field name="PRESSED_FOCUSED_WINDOW_FOCUSED_STATE_SET"/>
+ <field name="PRESSED_SELECTED_STATE_SET"/>
+ <field name="PRESSED_SELECTED_WINDOW_FOCUSED_STATE_SET"/>
+ <field name="PRESSED_STATE_SET" since="19"/>
+ <field name="PRESSED_WINDOW_FOCUSED_STATE_SET"/>
+ <field name="ROTATION" since="14"/>
+ <field name="ROTATION_X" since="14"/>
+ <field name="ROTATION_Y" since="14"/>
+ <field name="SCALE_X" since="14"/>
+ <field name="SCALE_Y" since="14"/>
+ <field name="SCREEN_STATE_OFF" since="16"/>
+ <field name="SCREEN_STATE_ON" since="16"/>
+ <field name="SCROLLBARS_INSIDE_INSET"/>
+ <field name="SCROLLBARS_INSIDE_OVERLAY"/>
+ <field name="SCROLLBARS_OUTSIDE_INSET"/>
+ <field name="SCROLLBARS_OUTSIDE_OVERLAY"/>
+ <field name="SCROLLBAR_POSITION_DEFAULT" since="11"/>
+ <field name="SCROLLBAR_POSITION_LEFT" since="11"/>
+ <field name="SCROLLBAR_POSITION_RIGHT" since="11"/>
+ <field name="SCROLL_AXIS_HORIZONTAL" since="21"/>
+ <field name="SCROLL_AXIS_NONE" since="21"/>
+ <field name="SCROLL_AXIS_VERTICAL" since="21"/>
+ <field name="SCROLL_INDICATOR_BOTTOM" since="23"/>
+ <field name="SCROLL_INDICATOR_END" since="23"/>
+ <field name="SCROLL_INDICATOR_LEFT" since="23"/>
+ <field name="SCROLL_INDICATOR_RIGHT" since="23"/>
+ <field name="SCROLL_INDICATOR_START" since="23"/>
+ <field name="SCROLL_INDICATOR_TOP" since="23"/>
+ <field name="SELECTED_STATE_SET"/>
+ <field name="SELECTED_WINDOW_FOCUSED_STATE_SET"/>
+ <field name="SOUND_EFFECTS_ENABLED"/>
+ <field name="STATUS_BAR_HIDDEN" since="11" deprecated="16"/>
+ <field name="STATUS_BAR_VISIBLE" since="11" deprecated="16"/>
+ <field name="SYSTEM_UI_FLAG_FULLSCREEN" since="16"/>
+ <field name="SYSTEM_UI_FLAG_HIDE_NAVIGATION" since="14"/>
+ <field name="SYSTEM_UI_FLAG_IMMERSIVE" since="19"/>
+ <field name="SYSTEM_UI_FLAG_IMMERSIVE_STICKY" since="19"/>
+ <field name="SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN" since="16"/>
+ <field name="SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION" since="16"/>
+ <field name="SYSTEM_UI_FLAG_LAYOUT_STABLE" since="16"/>
+ <field name="SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR" since="26"/>
+ <field name="SYSTEM_UI_FLAG_LIGHT_STATUS_BAR" since="23"/>
+ <field name="SYSTEM_UI_FLAG_LOW_PROFILE" since="14"/>
+ <field name="SYSTEM_UI_FLAG_VISIBLE" since="14"/>
+ <field name="SYSTEM_UI_LAYOUT_FLAGS" since="16"/>
+ <field name="TEXT_ALIGNMENT_CENTER" since="17"/>
+ <field name="TEXT_ALIGNMENT_GRAVITY" since="17"/>
+ <field name="TEXT_ALIGNMENT_INHERIT" since="16"/>
+ <field name="TEXT_ALIGNMENT_RESOLVED_DEFAULT" since="16" removed="17"/>
+ <field name="TEXT_ALIGNMENT_TEXT_END" since="17"/>
+ <field name="TEXT_ALIGNMENT_TEXT_START" since="17"/>
+ <field name="TEXT_ALIGNMENT_VIEW_END" since="17"/>
+ <field name="TEXT_ALIGNMENT_VIEW_START" since="17"/>
+ <field name="TEXT_DIRECTION_ANY_RTL" since="17"/>
+ <field name="TEXT_DIRECTION_FIRST_STRONG" since="17"/>
+ <field name="TEXT_DIRECTION_FIRST_STRONG_LTR" since="23"/>
+ <field name="TEXT_DIRECTION_FIRST_STRONG_RTL" since="23"/>
+ <field name="TEXT_DIRECTION_INHERIT" since="17"/>
+ <field name="TEXT_DIRECTION_LOCALE" since="17"/>
+ <field name="TEXT_DIRECTION_LTR" since="17"/>
+ <field name="TEXT_DIRECTION_RTL" since="17"/>
+ <field name="TRANSLATION_X" since="14"/>
+ <field name="TRANSLATION_Y" since="14"/>
+ <field name="TRANSLATION_Z" since="21"/>
+ <field name="VIEW_LOG_TAG"/>
+ <field name="VISIBLE"/>
+ <field name="WINDOW_FOCUSED_STATE_SET"/>
+ <field name="X" since="14"/>
+ <field name="Y" since="14"/>
+ <field name="Z" since="21"/>
+ </class>
+ <class name="android/view/View$AccessibilityDelegate" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addExtraDataToAccessibilityNodeInfo(Landroid/view/View;Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/String;Landroid/os/Bundle;)V" since="26"/>
+ <method name="dispatchPopulateAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z"/>
+ <method name="getAccessibilityNodeProvider(Landroid/view/View;)Landroid/view/accessibility/AccessibilityNodeProvider;" since="16"/>
+ <method name="onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V"/>
+ <method name="onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroid/view/accessibility/AccessibilityNodeInfo;)V"/>
+ <method name="onPopulateAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V"/>
+ <method name="onRequestSendAccessibilityEvent(Landroid/view/ViewGroup;Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z"/>
+ <method name="performAccessibilityAction(Landroid/view/View;ILandroid/os/Bundle;)Z" since="16"/>
+ <method name="sendAccessibilityEvent(Landroid/view/View;I)V"/>
+ <method name="sendAccessibilityEventUnchecked(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V"/>
+ </class>
+ <class name="android/view/View$BaseSavedState" since="1">
+ <extends name="android/view/AbsSavedState"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;Ljava/lang/ClassLoader;)V" since="24"/>
+ <method name="&lt;init>(Landroid/os/Parcelable;)V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/view/View$DragShadowBuilder" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/view/View;)V"/>
+ <method name="getView()Landroid/view/View;"/>
+ <method name="onDrawShadow(Landroid/graphics/Canvas;)V"/>
+ <method name="onProvideShadowMetrics(Landroid/graphics/Point;Landroid/graphics/Point;)V"/>
+ </class>
+ <class name="android/view/View$MeasureSpec" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getMode(I)I"/>
+ <method name="getSize(I)I"/>
+ <method name="makeMeasureSpec(II)I"/>
+ <method name="toString(I)Ljava/lang/String;"/>
+ <field name="AT_MOST"/>
+ <field name="EXACTLY"/>
+ <field name="UNSPECIFIED"/>
+ </class>
+ <class name="android/view/View$OnApplyWindowInsetsListener" since="20">
+ <extends name="java/lang/Object"/>
+ <method name="onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets;"/>
+ </class>
+ <class name="android/view/View$OnAttachStateChangeListener" since="12">
+ <extends name="java/lang/Object"/>
+ <method name="onViewAttachedToWindow(Landroid/view/View;)V"/>
+ <method name="onViewDetachedFromWindow(Landroid/view/View;)V"/>
+ </class>
+ <class name="android/view/View$OnCapturedPointerListener" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="onCapturedPointer(Landroid/view/View;Landroid/view/MotionEvent;)Z"/>
+ </class>
+ <class name="android/view/View$OnClickListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onClick(Landroid/view/View;)V"/>
+ </class>
+ <class name="android/view/View$OnContextClickListener" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="onContextClick(Landroid/view/View;)Z"/>
+ </class>
+ <class name="android/view/View$OnCreateContextMenuListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onCreateContextMenu(Landroid/view/ContextMenu;Landroid/view/View;Landroid/view/ContextMenu$ContextMenuInfo;)V"/>
+ </class>
+ <class name="android/view/View$OnDragListener" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="onDrag(Landroid/view/View;Landroid/view/DragEvent;)Z"/>
+ </class>
+ <class name="android/view/View$OnFocusChangeListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onFocusChange(Landroid/view/View;Z)V"/>
+ </class>
+ <class name="android/view/View$OnGenericMotionListener" since="12">
+ <extends name="java/lang/Object"/>
+ <method name="onGenericMotion(Landroid/view/View;Landroid/view/MotionEvent;)Z"/>
+ </class>
+ <class name="android/view/View$OnHoverListener" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="onHover(Landroid/view/View;Landroid/view/MotionEvent;)Z"/>
+ </class>
+ <class name="android/view/View$OnKeyListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onKey(Landroid/view/View;ILandroid/view/KeyEvent;)Z"/>
+ </class>
+ <class name="android/view/View$OnLayoutChangeListener" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="onLayoutChange(Landroid/view/View;IIIIIIII)V"/>
+ </class>
+ <class name="android/view/View$OnLongClickListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onLongClick(Landroid/view/View;)Z"/>
+ </class>
+ <class name="android/view/View$OnScrollChangeListener" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="onScrollChange(Landroid/view/View;IIII)V"/>
+ </class>
+ <class name="android/view/View$OnSystemUiVisibilityChangeListener" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="onSystemUiVisibilityChange(I)V"/>
+ </class>
+ <class name="android/view/View$OnTouchListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onTouch(Landroid/view/View;Landroid/view/MotionEvent;)Z"/>
+ </class>
+ <class name="android/view/ViewAnimationUtils" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="createCircularReveal(Landroid/view/View;IIFF)Landroid/animation/Animator;"/>
+ </class>
+ <class name="android/view/ViewConfiguration" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V" deprecated="16"/>
+ <method name="get(Landroid/content/Context;)Landroid/view/ViewConfiguration;" since="3"/>
+ <method name="getDefaultActionModeHideDuration()J" since="23"/>
+ <method name="getDoubleTapTimeout()I" since="3"/>
+ <method name="getEdgeSlop()I" deprecated="16"/>
+ <method name="getFadingEdgeLength()I" deprecated="16"/>
+ <method name="getGlobalActionKeyTimeout()J" deprecated="20"/>
+ <method name="getJumpTapTimeout()I"/>
+ <method name="getKeyRepeatDelay()I" since="12"/>
+ <method name="getKeyRepeatTimeout()I" since="12"/>
+ <method name="getLongPressTimeout()I"/>
+ <method name="getMaximumDrawingCacheSize()I" deprecated="16"/>
+ <method name="getMaximumFlingVelocity()I" since="4" deprecated="16"/>
+ <method name="getMinimumFlingVelocity()I" deprecated="16"/>
+ <method name="getPressedStateDuration()I"/>
+ <method name="getScaledDoubleTapSlop()I" since="3"/>
+ <method name="getScaledEdgeSlop()I" since="3"/>
+ <method name="getScaledFadingEdgeLength()I" since="3"/>
+ <method name="getScaledHorizontalScrollFactor()F" since="26"/>
+ <method name="getScaledMaximumDrawingCacheSize()I" since="3"/>
+ <method name="getScaledMaximumFlingVelocity()I" since="4"/>
+ <method name="getScaledMinimumFlingVelocity()I" since="3"/>
+ <method name="getScaledOverflingDistance()I" since="9"/>
+ <method name="getScaledOverscrollDistance()I" since="9"/>
+ <method name="getScaledPagingTouchSlop()I" since="8"/>
+ <method name="getScaledScrollBarSize()I" since="3"/>
+ <method name="getScaledTouchSlop()I" since="3"/>
+ <method name="getScaledVerticalScrollFactor()F" since="26"/>
+ <method name="getScaledWindowTouchSlop()I" since="3"/>
+ <method name="getScrollBarFadeDuration()I" since="5"/>
+ <method name="getScrollBarSize()I" deprecated="16"/>
+ <method name="getScrollDefaultDelay()I" since="5"/>
+ <method name="getScrollFriction()F"/>
+ <method name="getTapTimeout()I"/>
+ <method name="getTouchSlop()I" deprecated="16"/>
+ <method name="getWindowTouchSlop()I" deprecated="16"/>
+ <method name="getZoomControlsTimeout()J"/>
+ <method name="hasPermanentMenuKey()Z" since="14"/>
+ </class>
+ <class name="android/view/ViewDebug" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="dumpCapturedView(Ljava/lang/String;Ljava/lang/Object;)V" since="3"/>
+ <method name="startHierarchyTracing(Ljava/lang/String;Landroid/view/View;)V" deprecated="16"/>
+ <method name="startRecyclerTracing(Ljava/lang/String;Landroid/view/View;)V" deprecated="16"/>
+ <method name="stopHierarchyTracing()V" deprecated="16"/>
+ <method name="stopRecyclerTracing()V" deprecated="16"/>
+ <method name="trace(Landroid/view/View;Landroid/view/ViewDebug$HierarchyTraceType;)V" deprecated="16"/>
+ <method name="trace(Landroid/view/View;Landroid/view/ViewDebug$RecyclerTraceType;[I)V" deprecated="16"/>
+ <field name="TRACE_HIERARCHY" deprecated="16"/>
+ <field name="TRACE_RECYCLER" deprecated="16"/>
+ </class>
+ <class name="android/view/ViewDebug$CapturedViewProperty" since="3">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ <method name="retrieveReturn()Z"/>
+ </class>
+ <class name="android/view/ViewDebug$ExportedProperty" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ <method name="category()Ljava/lang/String;" since="9"/>
+ <method name="deepExport()Z"/>
+ <method name="flagMapping()[Landroid/view/ViewDebug$FlagToString;" since="4"/>
+ <method name="formatToHexString()Z" since="21"/>
+ <method name="hasAdjacentMapping()Z" since="21"/>
+ <method name="indexMapping()[Landroid/view/ViewDebug$IntToString;" since="3"/>
+ <method name="mapping()[Landroid/view/ViewDebug$IntToString;"/>
+ <method name="prefix()Ljava/lang/String;"/>
+ <method name="resolveId()Z"/>
+ </class>
+ <class name="android/view/ViewDebug$FlagToString" since="4">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ <method name="equals()I"/>
+ <method name="mask()I"/>
+ <method name="name()Ljava/lang/String;"/>
+ <method name="outputIf()Z"/>
+ </class>
+ <class name="android/view/ViewDebug$HierarchyTraceType" since="1" deprecated="16">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/view/ViewDebug$HierarchyTraceType;"/>
+ <method name="values()[Landroid/view/ViewDebug$HierarchyTraceType;"/>
+ <field name="BUILD_CACHE"/>
+ <field name="DRAW"/>
+ <field name="INVALIDATE"/>
+ <field name="INVALIDATE_CHILD"/>
+ <field name="INVALIDATE_CHILD_IN_PARENT"/>
+ <field name="ON_LAYOUT"/>
+ <field name="ON_MEASURE"/>
+ <field name="REQUEST_LAYOUT"/>
+ </class>
+ <class name="android/view/ViewDebug$IntToString" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ <method name="from()I"/>
+ <method name="to()Ljava/lang/String;"/>
+ </class>
+ <class name="android/view/ViewDebug$RecyclerTraceType" since="1" deprecated="16">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/view/ViewDebug$RecyclerTraceType;"/>
+ <method name="values()[Landroid/view/ViewDebug$RecyclerTraceType;"/>
+ <field name="BIND_VIEW"/>
+ <field name="MOVE_FROM_ACTIVE_TO_SCRAP_HEAP"/>
+ <field name="MOVE_TO_ACTIVE_HEAP" removed="8"/>
+ <field name="MOVE_TO_SCRAP_HEAP"/>
+ <field name="NEW_VIEW"/>
+ <field name="RECYCLE_FROM_ACTIVE_HEAP"/>
+ <field name="RECYCLE_FROM_SCRAP_HEAP"/>
+ </class>
+ <class name="android/view/ViewGroup" since="1">
+ <extends name="android/view/View"/>
+ <implements name="android/view/ViewManager"/>
+ <implements name="android/view/ViewParent"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="addStatesFromChildren()Z"/>
+ <method name="addView(Landroid/view/View;)V"/>
+ <method name="addView(Landroid/view/View;I)V"/>
+ <method name="addView(Landroid/view/View;II)V"/>
+ <method name="addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V"/>
+ <method name="addViewInLayout(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)Z"/>
+ <method name="addViewInLayout(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;Z)Z"/>
+ <method name="attachLayoutAnimationParameters(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;II)V"/>
+ <method name="attachViewToParent(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V"/>
+ <method name="canAnimate()Z"/>
+ <method name="checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z"/>
+ <method name="cleanupLayoutState(Landroid/view/View;)V"/>
+ <method name="clearDisappearingChildren()V"/>
+ <method name="debug(I)V"/>
+ <method name="detachAllViewsFromParent()V"/>
+ <method name="detachViewFromParent(I)V"/>
+ <method name="detachViewFromParent(Landroid/view/View;)V"/>
+ <method name="detachViewsFromParent(II)V"/>
+ <method name="dispatchFreezeSelfOnly(Landroid/util/SparseArray;)V"/>
+ <method name="dispatchThawSelfOnly(Landroid/util/SparseArray;)V"/>
+ <method name="drawChild(Landroid/graphics/Canvas;Landroid/view/View;J)Z"/>
+ <method name="endViewTransition(Landroid/view/View;)V" since="11"/>
+ <method name="gatherTransparentRegion(Landroid/graphics/Region;)Z"/>
+ <method name="generateDefaultLayoutParams()Landroid/view/ViewGroup$LayoutParams;"/>
+ <method name="generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams;"/>
+ <method name="generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroid/view/ViewGroup$LayoutParams;"/>
+ <method name="getChildAt(I)Landroid/view/View;"/>
+ <method name="getChildCount()I"/>
+ <method name="getChildDrawingOrder(II)I"/>
+ <method name="getChildMeasureSpec(III)I"/>
+ <method name="getChildStaticTransformation(Landroid/view/View;Landroid/view/animation/Transformation;)Z"/>
+ <method name="getClipChildren()Z" since="18"/>
+ <method name="getClipToPadding()Z" since="21"/>
+ <method name="getDescendantFocusability()I"/>
+ <method name="getFocusedChild()Landroid/view/View;"/>
+ <method name="getLayoutAnimation()Landroid/view/animation/LayoutAnimationController;"/>
+ <method name="getLayoutAnimationListener()Landroid/view/animation/Animation$AnimationListener;"/>
+ <method name="getLayoutMode()I" since="18"/>
+ <method name="getLayoutTransition()Landroid/animation/LayoutTransition;" since="11"/>
+ <method name="getNestedScrollAxes()I" since="21"/>
+ <method name="getOverlay()Landroid/view/ViewGroupOverlay;" since="18"/>
+ <method name="getPersistentDrawingCache()I"/>
+ <method name="getTouchscreenBlocksFocus()Z" since="21"/>
+ <method name="indexOfChild(Landroid/view/View;)I"/>
+ <method name="isAlwaysDrawnWithCacheEnabled()Z" deprecated="23"/>
+ <method name="isAnimationCacheEnabled()Z" deprecated="23"/>
+ <method name="isChildrenDrawingOrderEnabled()Z" since="7"/>
+ <method name="isChildrenDrawnWithCacheEnabled()Z" deprecated="23"/>
+ <method name="isMotionEventSplittingEnabled()Z" since="11"/>
+ <method name="isTransitionGroup()Z" since="21"/>
+ <method name="measureChild(Landroid/view/View;II)V"/>
+ <method name="measureChildWithMargins(Landroid/view/View;IIII)V"/>
+ <method name="measureChildren(II)V"/>
+ <method name="offsetDescendantRectToMyCoords(Landroid/view/View;Landroid/graphics/Rect;)V"/>
+ <method name="offsetRectIntoDescendantCoords(Landroid/view/View;Landroid/graphics/Rect;)V"/>
+ <method name="onInterceptHoverEvent(Landroid/view/MotionEvent;)Z" since="14"/>
+ <method name="onInterceptTouchEvent(Landroid/view/MotionEvent;)Z"/>
+ <method name="onRequestFocusInDescendants(ILandroid/graphics/Rect;)Z"/>
+ <method name="onRequestSendAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z" since="14"/>
+ <method name="onViewAdded(Landroid/view/View;)V" since="23"/>
+ <method name="onViewRemoved(Landroid/view/View;)V" since="23"/>
+ <method name="removeAllViews()V"/>
+ <method name="removeAllViewsInLayout()V"/>
+ <method name="removeDetachedView(Landroid/view/View;Z)V"/>
+ <method name="removeViewAt(I)V"/>
+ <method name="removeViewInLayout(Landroid/view/View;)V"/>
+ <method name="removeViews(II)V"/>
+ <method name="removeViewsInLayout(II)V"/>
+ <method name="requestChildRectangleOnScreen(Landroid/view/View;Landroid/graphics/Rect;Z)Z"/>
+ <method name="resetResolvedLayoutDirection()V" since="14" removed="16"/>
+ <method name="resetResolvedTextDirection()V" since="14" removed="16"/>
+ <method name="scheduleLayoutAnimation()V"/>
+ <method name="setAddStatesFromChildren(Z)V"/>
+ <method name="setAlwaysDrawnWithCacheEnabled(Z)V" deprecated="23"/>
+ <method name="setAnimationCacheEnabled(Z)V" deprecated="23"/>
+ <method name="setChildrenDrawingCacheEnabled(Z)V"/>
+ <method name="setChildrenDrawingOrderEnabled(Z)V" since="7"/>
+ <method name="setChildrenDrawnWithCacheEnabled(Z)V" deprecated="23"/>
+ <method name="setClipChildren(Z)V"/>
+ <method name="setClipToPadding(Z)V"/>
+ <method name="setDescendantFocusability(I)V"/>
+ <method name="setLayoutAnimation(Landroid/view/animation/LayoutAnimationController;)V"/>
+ <method name="setLayoutAnimationListener(Landroid/view/animation/Animation$AnimationListener;)V"/>
+ <method name="setLayoutMode(I)V" since="18"/>
+ <method name="setLayoutTransition(Landroid/animation/LayoutTransition;)V" since="11"/>
+ <method name="setMotionEventSplittingEnabled(Z)V" since="11"/>
+ <method name="setOnHierarchyChangeListener(Landroid/view/ViewGroup$OnHierarchyChangeListener;)V"/>
+ <method name="setPersistentDrawingCache(I)V"/>
+ <method name="setStaticTransformationsEnabled(Z)V" since="3"/>
+ <method name="setTouchscreenBlocksFocus(Z)V" since="21"/>
+ <method name="setTransitionGroup(Z)V" since="21"/>
+ <method name="shouldDelayChildPressedState()Z" since="14"/>
+ <method name="startLayoutAnimation()V"/>
+ <method name="startViewTransition(Landroid/view/View;)V" since="11"/>
+ <field name="CLIP_TO_PADDING_MASK"/>
+ <field name="FLAG_USE_CHILD_DRAWING_ORDER" removed="7"/>
+ <field name="FOCUS_AFTER_DESCENDANTS"/>
+ <field name="FOCUS_BEFORE_DESCENDANTS"/>
+ <field name="FOCUS_BLOCK_DESCENDANTS"/>
+ <field name="LAYOUT_MODE_CLIP_BOUNDS" since="18"/>
+ <field name="LAYOUT_MODE_OPTICAL_BOUNDS" since="18"/>
+ <field name="PERSISTENT_ALL_CACHES"/>
+ <field name="PERSISTENT_ANIMATION_CACHE"/>
+ <field name="PERSISTENT_NO_CACHE"/>
+ <field name="PERSISTENT_SCROLLING_CACHE"/>
+ </class>
+ <class name="android/view/ViewGroup$LayoutParams" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V"/>
+ <method name="resolveLayoutDirection(I)V" since="17"/>
+ <method name="setBaseAttributes(Landroid/content/res/TypedArray;II)V"/>
+ <field name="FILL_PARENT" deprecated="16"/>
+ <field name="MATCH_PARENT" since="8"/>
+ <field name="WRAP_CONTENT"/>
+ <field name="height"/>
+ <field name="layoutAnimationParameters"/>
+ <field name="width"/>
+ </class>
+ <class name="android/view/ViewGroup$MarginLayoutParams" since="1">
+ <extends name="android/view/ViewGroup$LayoutParams"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup$MarginLayoutParams;)V"/>
+ <method name="getLayoutDirection()I" since="17"/>
+ <method name="getMarginEnd()I" since="17"/>
+ <method name="getMarginStart()I" since="17"/>
+ <method name="isMarginRelative()Z" since="17"/>
+ <method name="setLayoutDirection(I)V" since="17"/>
+ <method name="setMarginEnd(I)V" since="17"/>
+ <method name="setMarginStart(I)V" since="17"/>
+ <method name="setMargins(IIII)V"/>
+ <field name="bottomMargin"/>
+ <field name="leftMargin"/>
+ <field name="rightMargin"/>
+ <field name="topMargin"/>
+ </class>
+ <class name="android/view/ViewGroup$OnHierarchyChangeListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onChildViewAdded(Landroid/view/View;Landroid/view/View;)V"/>
+ <method name="onChildViewRemoved(Landroid/view/View;Landroid/view/View;)V"/>
+ </class>
+ <class name="android/view/ViewGroupOverlay" since="18">
+ <extends name="android/view/ViewOverlay"/>
+ <method name="&lt;init>()V"/>
+ <method name="add(Landroid/view/View;)V"/>
+ <method name="remove(Landroid/view/View;)V"/>
+ </class>
+ <class name="android/view/ViewManager" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="addView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V"/>
+ <method name="removeView(Landroid/view/View;)V"/>
+ <method name="updateViewLayout(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V"/>
+ </class>
+ <class name="android/view/ViewOutlineProvider" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getOutline(Landroid/view/View;Landroid/graphics/Outline;)V"/>
+ <field name="BACKGROUND"/>
+ <field name="BOUNDS"/>
+ <field name="PADDED_BOUNDS"/>
+ </class>
+ <class name="android/view/ViewOverlay" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="add(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="clear()V"/>
+ <method name="remove(Landroid/graphics/drawable/Drawable;)V"/>
+ </class>
+ <class name="android/view/ViewParent" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="bringChildToFront(Landroid/view/View;)V"/>
+ <method name="canResolveLayoutDirection()Z" since="19"/>
+ <method name="canResolveTextAlignment()Z" since="19"/>
+ <method name="canResolveTextDirection()Z" since="19"/>
+ <method name="childDrawableStateChanged(Landroid/view/View;)V"/>
+ <method name="childHasTransientStateChanged(Landroid/view/View;Z)V" since="19"/>
+ <method name="clearChildFocus(Landroid/view/View;)V"/>
+ <method name="createContextMenu(Landroid/view/ContextMenu;)V"/>
+ <method name="focusSearch(Landroid/view/View;I)Landroid/view/View;"/>
+ <method name="focusableViewAvailable(Landroid/view/View;)V"/>
+ <method name="getChildVisibleRect(Landroid/view/View;Landroid/graphics/Rect;Landroid/graphics/Point;)Z"/>
+ <method name="getLayoutDirection()I" since="19"/>
+ <method name="getParent()Landroid/view/ViewParent;"/>
+ <method name="getParentForAccessibility()Landroid/view/ViewParent;" since="16"/>
+ <method name="getTextAlignment()I" since="19"/>
+ <method name="getTextDirection()I" since="19"/>
+ <method name="invalidateChild(Landroid/view/View;Landroid/graphics/Rect;)V" deprecated="26"/>
+ <method name="invalidateChildInParent([ILandroid/graphics/Rect;)Landroid/view/ViewParent;" deprecated="26"/>
+ <method name="isLayoutDirectionResolved()Z" since="19"/>
+ <method name="isLayoutRequested()Z"/>
+ <method name="isTextAlignmentResolved()Z" since="19"/>
+ <method name="isTextDirectionResolved()Z" since="19"/>
+ <method name="keyboardNavigationClusterSearch(Landroid/view/View;I)Landroid/view/View;" since="26"/>
+ <method name="notifySubtreeAccessibilityStateChanged(Landroid/view/View;Landroid/view/View;I)V" since="19"/>
+ <method name="onDescendantInvalidated(Landroid/view/View;Landroid/view/View;)V" since="26"/>
+ <method name="onNestedFling(Landroid/view/View;FFZ)Z" since="21"/>
+ <method name="onNestedPreFling(Landroid/view/View;FF)Z" since="21"/>
+ <method name="onNestedPrePerformAccessibilityAction(Landroid/view/View;ILandroid/os/Bundle;)Z" since="22"/>
+ <method name="onNestedPreScroll(Landroid/view/View;II[I)V" since="21"/>
+ <method name="onNestedScroll(Landroid/view/View;IIII)V" since="21"/>
+ <method name="onNestedScrollAccepted(Landroid/view/View;Landroid/view/View;I)V" since="21"/>
+ <method name="onStartNestedScroll(Landroid/view/View;Landroid/view/View;I)Z" since="21"/>
+ <method name="onStopNestedScroll(Landroid/view/View;)V" since="21"/>
+ <method name="recomputeViewAttributes(Landroid/view/View;)V"/>
+ <method name="requestChildFocus(Landroid/view/View;Landroid/view/View;)V"/>
+ <method name="requestChildRectangleOnScreen(Landroid/view/View;Landroid/graphics/Rect;Z)Z" since="3"/>
+ <method name="requestDisallowInterceptTouchEvent(Z)V"/>
+ <method name="requestFitSystemWindows()V" since="16"/>
+ <method name="requestLayout()V"/>
+ <method name="requestSendAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z" since="14"/>
+ <method name="requestTransparentRegion(Landroid/view/View;)V"/>
+ <method name="showContextMenuForChild(Landroid/view/View;)Z"/>
+ <method name="showContextMenuForChild(Landroid/view/View;FF)Z" since="24"/>
+ <method name="startActionModeForChild(Landroid/view/View;Landroid/view/ActionMode$Callback;)Landroid/view/ActionMode;" since="11"/>
+ <method name="startActionModeForChild(Landroid/view/View;Landroid/view/ActionMode$Callback;I)Landroid/view/ActionMode;" since="23"/>
+ </class>
+ <class name="android/view/ViewPropertyAnimator" since="12">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="alpha(F)Landroid/view/ViewPropertyAnimator;"/>
+ <method name="alphaBy(F)Landroid/view/ViewPropertyAnimator;"/>
+ <method name="cancel()V" since="14"/>
+ <method name="getDuration()J" since="14"/>
+ <method name="getInterpolator()Landroid/animation/TimeInterpolator;" since="18"/>
+ <method name="getStartDelay()J" since="14"/>
+ <method name="rotation(F)Landroid/view/ViewPropertyAnimator;"/>
+ <method name="rotationBy(F)Landroid/view/ViewPropertyAnimator;"/>
+ <method name="rotationX(F)Landroid/view/ViewPropertyAnimator;"/>
+ <method name="rotationXBy(F)Landroid/view/ViewPropertyAnimator;"/>
+ <method name="rotationY(F)Landroid/view/ViewPropertyAnimator;"/>
+ <method name="rotationYBy(F)Landroid/view/ViewPropertyAnimator;"/>
+ <method name="scaleX(F)Landroid/view/ViewPropertyAnimator;"/>
+ <method name="scaleXBy(F)Landroid/view/ViewPropertyAnimator;"/>
+ <method name="scaleY(F)Landroid/view/ViewPropertyAnimator;"/>
+ <method name="scaleYBy(F)Landroid/view/ViewPropertyAnimator;"/>
+ <method name="setDuration(J)Landroid/view/ViewPropertyAnimator;"/>
+ <method name="setInterpolator(Landroid/animation/TimeInterpolator;)Landroid/view/ViewPropertyAnimator;"/>
+ <method name="setListener(Landroid/animation/Animator$AnimatorListener;)Landroid/view/ViewPropertyAnimator;"/>
+ <method name="setStartDelay(J)Landroid/view/ViewPropertyAnimator;" since="14"/>
+ <method name="setUpdateListener(Landroid/animation/ValueAnimator$AnimatorUpdateListener;)Landroid/view/ViewPropertyAnimator;" since="19"/>
+ <method name="start()V" since="14"/>
+ <method name="translationX(F)Landroid/view/ViewPropertyAnimator;"/>
+ <method name="translationXBy(F)Landroid/view/ViewPropertyAnimator;"/>
+ <method name="translationY(F)Landroid/view/ViewPropertyAnimator;"/>
+ <method name="translationYBy(F)Landroid/view/ViewPropertyAnimator;"/>
+ <method name="translationZ(F)Landroid/view/ViewPropertyAnimator;" since="21"/>
+ <method name="translationZBy(F)Landroid/view/ViewPropertyAnimator;" since="21"/>
+ <method name="withEndAction(Ljava/lang/Runnable;)Landroid/view/ViewPropertyAnimator;" since="16"/>
+ <method name="withLayer()Landroid/view/ViewPropertyAnimator;" since="16"/>
+ <method name="withStartAction(Ljava/lang/Runnable;)Landroid/view/ViewPropertyAnimator;" since="16"/>
+ <method name="x(F)Landroid/view/ViewPropertyAnimator;"/>
+ <method name="xBy(F)Landroid/view/ViewPropertyAnimator;"/>
+ <method name="y(F)Landroid/view/ViewPropertyAnimator;"/>
+ <method name="yBy(F)Landroid/view/ViewPropertyAnimator;"/>
+ <method name="z(F)Landroid/view/ViewPropertyAnimator;" since="21"/>
+ <method name="zBy(F)Landroid/view/ViewPropertyAnimator;" since="21"/>
+ </class>
+ <class name="android/view/ViewStructure" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addChildCount(I)I"/>
+ <method name="asyncCommit()V"/>
+ <method name="asyncNewChild(I)Landroid/view/ViewStructure;"/>
+ <method name="getAutofillId()Landroid/view/autofill/AutofillId;" since="26"/>
+ <method name="getChildCount()I"/>
+ <method name="getExtras()Landroid/os/Bundle;"/>
+ <method name="getHint()Ljava/lang/CharSequence;"/>
+ <method name="getText()Ljava/lang/CharSequence;"/>
+ <method name="getTextSelectionEnd()I"/>
+ <method name="getTextSelectionStart()I"/>
+ <method name="hasExtras()Z"/>
+ <method name="newChild(I)Landroid/view/ViewStructure;"/>
+ <method name="newHtmlInfoBuilder(Ljava/lang/String;)Landroid/view/ViewStructure$HtmlInfo$Builder;" since="26"/>
+ <method name="setAccessibilityFocused(Z)V"/>
+ <method name="setActivated(Z)V"/>
+ <method name="setAlpha(F)V"/>
+ <method name="setAutofillHints([Ljava/lang/String;)V" since="26"/>
+ <method name="setAutofillId(Landroid/view/autofill/AutofillId;)V" since="26"/>
+ <method name="setAutofillId(Landroid/view/autofill/AutofillId;I)V" since="26"/>
+ <method name="setAutofillOptions([Ljava/lang/CharSequence;)V" since="26"/>
+ <method name="setAutofillType(I)V" since="26"/>
+ <method name="setAutofillValue(Landroid/view/autofill/AutofillValue;)V" since="26"/>
+ <method name="setCheckable(Z)V"/>
+ <method name="setChecked(Z)V"/>
+ <method name="setChildCount(I)V"/>
+ <method name="setClassName(Ljava/lang/String;)V"/>
+ <method name="setClickable(Z)V"/>
+ <method name="setContentDescription(Ljava/lang/CharSequence;)V"/>
+ <method name="setContextClickable(Z)V"/>
+ <method name="setDataIsSensitive(Z)V" since="26"/>
+ <method name="setDimens(IIIIII)V"/>
+ <method name="setElevation(F)V"/>
+ <method name="setEnabled(Z)V"/>
+ <method name="setFocusable(Z)V"/>
+ <method name="setFocused(Z)V"/>
+ <method name="setHint(Ljava/lang/CharSequence;)V"/>
+ <method name="setHtmlInfo(Landroid/view/ViewStructure$HtmlInfo;)V" since="26"/>
+ <method name="setId(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="setInputType(I)V" since="26"/>
+ <method name="setLocaleList(Landroid/os/LocaleList;)V" since="26"/>
+ <method name="setLongClickable(Z)V"/>
+ <method name="setOpaque(Z)V" since="26"/>
+ <method name="setSelected(Z)V"/>
+ <method name="setText(Ljava/lang/CharSequence;)V"/>
+ <method name="setText(Ljava/lang/CharSequence;II)V"/>
+ <method name="setTextLines([I[I)V"/>
+ <method name="setTextStyle(FIII)V"/>
+ <method name="setTransformation(Landroid/graphics/Matrix;)V"/>
+ <method name="setVisibility(I)V"/>
+ <method name="setWebDomain(Ljava/lang/String;)V" since="26"/>
+ </class>
+ <class name="android/view/ViewStructure$HtmlInfo" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAttributes()Ljava/util/List;"/>
+ <method name="getTag()Ljava/lang/String;"/>
+ </class>
+ <class name="android/view/ViewStructure$HtmlInfo$Builder" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addAttribute(Ljava/lang/String;Ljava/lang/String;)Landroid/view/ViewStructure$HtmlInfo$Builder;"/>
+ <method name="build()Landroid/view/ViewStructure$HtmlInfo;"/>
+ </class>
+ <class name="android/view/ViewStub" since="1">
+ <extends name="android/view/View"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getInflatedId()I"/>
+ <method name="getLayoutInflater()Landroid/view/LayoutInflater;" since="16"/>
+ <method name="getLayoutResource()I"/>
+ <method name="inflate()Landroid/view/View;"/>
+ <method name="setInflatedId(I)V"/>
+ <method name="setLayoutInflater(Landroid/view/LayoutInflater;)V" since="16"/>
+ <method name="setLayoutResource(I)V"/>
+ <method name="setOnInflateListener(Landroid/view/ViewStub$OnInflateListener;)V"/>
+ </class>
+ <class name="android/view/ViewStub$OnInflateListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onInflate(Landroid/view/ViewStub;Landroid/view/View;)V"/>
+ </class>
+ <class name="android/view/ViewTreeObserver" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addOnDrawListener(Landroid/view/ViewTreeObserver$OnDrawListener;)V" since="16"/>
+ <method name="addOnGlobalFocusChangeListener(Landroid/view/ViewTreeObserver$OnGlobalFocusChangeListener;)V"/>
+ <method name="addOnGlobalLayoutListener(Landroid/view/ViewTreeObserver$OnGlobalLayoutListener;)V"/>
+ <method name="addOnPreDrawListener(Landroid/view/ViewTreeObserver$OnPreDrawListener;)V"/>
+ <method name="addOnScrollChangedListener(Landroid/view/ViewTreeObserver$OnScrollChangedListener;)V" since="3"/>
+ <method name="addOnTouchModeChangeListener(Landroid/view/ViewTreeObserver$OnTouchModeChangeListener;)V"/>
+ <method name="addOnWindowAttachListener(Landroid/view/ViewTreeObserver$OnWindowAttachListener;)V" since="18"/>
+ <method name="addOnWindowFocusChangeListener(Landroid/view/ViewTreeObserver$OnWindowFocusChangeListener;)V" since="18"/>
+ <method name="dispatchOnDraw()V" since="16"/>
+ <method name="dispatchOnGlobalLayout()V"/>
+ <method name="dispatchOnPreDraw()Z"/>
+ <method name="isAlive()Z"/>
+ <method name="removeGlobalOnLayoutListener(Landroid/view/ViewTreeObserver$OnGlobalLayoutListener;)V" deprecated="16"/>
+ <method name="removeOnDrawListener(Landroid/view/ViewTreeObserver$OnDrawListener;)V" since="16"/>
+ <method name="removeOnGlobalFocusChangeListener(Landroid/view/ViewTreeObserver$OnGlobalFocusChangeListener;)V"/>
+ <method name="removeOnGlobalLayoutListener(Landroid/view/ViewTreeObserver$OnGlobalLayoutListener;)V" since="16"/>
+ <method name="removeOnPreDrawListener(Landroid/view/ViewTreeObserver$OnPreDrawListener;)V"/>
+ <method name="removeOnScrollChangedListener(Landroid/view/ViewTreeObserver$OnScrollChangedListener;)V" since="3"/>
+ <method name="removeOnTouchModeChangeListener(Landroid/view/ViewTreeObserver$OnTouchModeChangeListener;)V"/>
+ <method name="removeOnWindowAttachListener(Landroid/view/ViewTreeObserver$OnWindowAttachListener;)V" since="18"/>
+ <method name="removeOnWindowFocusChangeListener(Landroid/view/ViewTreeObserver$OnWindowFocusChangeListener;)V" since="18"/>
+ </class>
+ <class name="android/view/ViewTreeObserver$OnDrawListener" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="onDraw()V"/>
+ </class>
+ <class name="android/view/ViewTreeObserver$OnGlobalFocusChangeListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onGlobalFocusChanged(Landroid/view/View;Landroid/view/View;)V"/>
+ </class>
+ <class name="android/view/ViewTreeObserver$OnGlobalLayoutListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onGlobalLayout()V"/>
+ </class>
+ <class name="android/view/ViewTreeObserver$OnPreDrawListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onPreDraw()Z"/>
+ </class>
+ <class name="android/view/ViewTreeObserver$OnScrollChangedListener" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="onScrollChanged()V"/>
+ </class>
+ <class name="android/view/ViewTreeObserver$OnTouchModeChangeListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onTouchModeChanged(Z)V"/>
+ </class>
+ <class name="android/view/ViewTreeObserver$OnWindowAttachListener" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="onWindowAttached()V"/>
+ <method name="onWindowDetached()V"/>
+ </class>
+ <class name="android/view/ViewTreeObserver$OnWindowFocusChangeListener" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="onWindowFocusChanged(Z)V"/>
+ </class>
+ <class name="android/view/Window" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="addContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V"/>
+ <method name="addFlags(I)V"/>
+ <method name="addOnFrameMetricsAvailableListener(Landroid/view/Window$OnFrameMetricsAvailableListener;Landroid/os/Handler;)V" since="24"/>
+ <method name="clearFlags(I)V"/>
+ <method name="closeAllPanels()V"/>
+ <method name="closePanel(I)V"/>
+ <method name="findViewById(I)Landroid/view/View;"/>
+ <method name="getAllowEnterTransitionOverlap()Z" since="21"/>
+ <method name="getAllowReturnTransitionOverlap()Z" since="21"/>
+ <method name="getAttributes()Landroid/view/WindowManager$LayoutParams;"/>
+ <method name="getCallback()Landroid/view/Window$Callback;"/>
+ <method name="getColorMode()I" since="26"/>
+ <method name="getContainer()Landroid/view/Window;"/>
+ <method name="getContentScene()Landroid/transition/Scene;" since="21"/>
+ <method name="getContext()Landroid/content/Context;"/>
+ <method name="getCurrentFocus()Landroid/view/View;"/>
+ <method name="getDecorView()Landroid/view/View;"/>
+ <method name="getDefaultFeatures(Landroid/content/Context;)I" since="22"/>
+ <method name="getEnterTransition()Landroid/transition/Transition;" since="21"/>
+ <method name="getExitTransition()Landroid/transition/Transition;" since="21"/>
+ <method name="getFeatures()I"/>
+ <method name="getForcedWindowFlags()I"/>
+ <method name="getLayoutInflater()Landroid/view/LayoutInflater;"/>
+ <method name="getLocalFeatures()I"/>
+ <method name="getMediaController()Landroid/media/session/MediaController;" since="21"/>
+ <method name="getNavigationBarColor()I" since="21"/>
+ <method name="getReenterTransition()Landroid/transition/Transition;" since="21"/>
+ <method name="getReturnTransition()Landroid/transition/Transition;" since="21"/>
+ <method name="getSharedElementEnterTransition()Landroid/transition/Transition;" since="21"/>
+ <method name="getSharedElementExitTransition()Landroid/transition/Transition;" since="21"/>
+ <method name="getSharedElementReenterTransition()Landroid/transition/Transition;" since="21"/>
+ <method name="getSharedElementReturnTransition()Landroid/transition/Transition;" since="21"/>
+ <method name="getSharedElementsUseOverlay()Z" since="21"/>
+ <method name="getStatusBarColor()I" since="21"/>
+ <method name="getTransitionBackgroundFadeDuration()J" since="21"/>
+ <method name="getTransitionManager()Landroid/transition/TransitionManager;" since="21"/>
+ <method name="getVolumeControlStream()I"/>
+ <method name="getWindowManager()Landroid/view/WindowManager;"/>
+ <method name="getWindowStyle()Landroid/content/res/TypedArray;"/>
+ <method name="hasChildren()Z"/>
+ <method name="hasFeature(I)Z" since="11"/>
+ <method name="hasSoftInputMode()Z" since="3"/>
+ <method name="injectInputEvent(Landroid/view/InputEvent;)V" since="19"/>
+ <method name="invalidatePanelMenu(I)V" since="11"/>
+ <method name="isActive()Z"/>
+ <method name="isFloating()Z"/>
+ <method name="isShortcutKey(ILandroid/view/KeyEvent;)Z"/>
+ <method name="makeActive()V"/>
+ <method name="onActive()V"/>
+ <method name="onConfigurationChanged(Landroid/content/res/Configuration;)V"/>
+ <method name="openPanel(ILandroid/view/KeyEvent;)V"/>
+ <method name="peekDecorView()Landroid/view/View;"/>
+ <method name="performContextMenuIdentifierAction(II)Z"/>
+ <method name="performPanelIdentifierAction(III)Z"/>
+ <method name="performPanelShortcut(IILandroid/view/KeyEvent;I)Z"/>
+ <method name="removeOnFrameMetricsAvailableListener(Landroid/view/Window$OnFrameMetricsAvailableListener;)V" since="24"/>
+ <method name="requestFeature(I)Z"/>
+ <method name="restoreHierarchyState(Landroid/os/Bundle;)V"/>
+ <method name="saveHierarchyState()Landroid/os/Bundle;"/>
+ <method name="setAllowEnterTransitionOverlap(Z)V" since="21"/>
+ <method name="setAllowReturnTransitionOverlap(Z)V" since="21"/>
+ <method name="setAttributes(Landroid/view/WindowManager$LayoutParams;)V"/>
+ <method name="setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setBackgroundDrawableResource(I)V"/>
+ <method name="setCallback(Landroid/view/Window$Callback;)V"/>
+ <method name="setChildDrawable(ILandroid/graphics/drawable/Drawable;)V"/>
+ <method name="setChildInt(II)V"/>
+ <method name="setClipToOutline(Z)V" since="22"/>
+ <method name="setColorMode(I)V" since="26"/>
+ <method name="setContainer(Landroid/view/Window;)V"/>
+ <method name="setContentView(I)V"/>
+ <method name="setContentView(Landroid/view/View;)V"/>
+ <method name="setContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V"/>
+ <method name="setDecorCaptionShade(I)V" since="24"/>
+ <method name="setDefaultWindowFormat(I)V"/>
+ <method name="setDimAmount(F)V" since="14"/>
+ <method name="setElevation(F)V" since="22"/>
+ <method name="setEnterTransition(Landroid/transition/Transition;)V" since="21"/>
+ <method name="setExitTransition(Landroid/transition/Transition;)V" since="21"/>
+ <method name="setFeatureDrawable(ILandroid/graphics/drawable/Drawable;)V"/>
+ <method name="setFeatureDrawableAlpha(II)V"/>
+ <method name="setFeatureDrawableResource(II)V"/>
+ <method name="setFeatureDrawableUri(ILandroid/net/Uri;)V"/>
+ <method name="setFeatureInt(II)V"/>
+ <method name="setFlags(II)V"/>
+ <method name="setFormat(I)V"/>
+ <method name="setGravity(I)V"/>
+ <method name="setIcon(I)V" since="19"/>
+ <method name="setLayout(II)V"/>
+ <method name="setLocalFocus(ZZ)V" since="19"/>
+ <method name="setLogo(I)V" since="19"/>
+ <method name="setMediaController(Landroid/media/session/MediaController;)V" since="21"/>
+ <method name="setNavigationBarColor(I)V" since="21"/>
+ <method name="setReenterTransition(Landroid/transition/Transition;)V" since="21"/>
+ <method name="setResizingCaptionDrawable(Landroid/graphics/drawable/Drawable;)V" since="24"/>
+ <method name="setRestrictedCaptionAreaListener(Landroid/view/Window$OnRestrictedCaptionAreaChangedListener;)V" since="24"/>
+ <method name="setReturnTransition(Landroid/transition/Transition;)V" since="21"/>
+ <method name="setSharedElementEnterTransition(Landroid/transition/Transition;)V" since="21"/>
+ <method name="setSharedElementExitTransition(Landroid/transition/Transition;)V" since="21"/>
+ <method name="setSharedElementReenterTransition(Landroid/transition/Transition;)V" since="21"/>
+ <method name="setSharedElementReturnTransition(Landroid/transition/Transition;)V" since="21"/>
+ <method name="setSharedElementsUseOverlay(Z)V" since="21"/>
+ <method name="setSoftInputMode(I)V" since="3"/>
+ <method name="setStatusBarColor(I)V" since="21"/>
+ <method name="setSustainedPerformanceMode(Z)V" since="24"/>
+ <method name="setTitle(Ljava/lang/CharSequence;)V"/>
+ <method name="setTitleColor(I)V" deprecated="21"/>
+ <method name="setTransitionBackgroundFadeDuration(J)V" since="21"/>
+ <method name="setTransitionManager(Landroid/transition/TransitionManager;)V" since="21"/>
+ <method name="setType(I)V"/>
+ <method name="setUiOptions(I)V" since="14"/>
+ <method name="setUiOptions(II)V" since="14"/>
+ <method name="setVolumeControlStream(I)V"/>
+ <method name="setWindowAnimations(I)V" since="3"/>
+ <method name="setWindowManager(Landroid/view/WindowManager;Landroid/os/IBinder;Ljava/lang/String;)V"/>
+ <method name="setWindowManager(Landroid/view/WindowManager;Landroid/os/IBinder;Ljava/lang/String;Z)V" since="11"/>
+ <method name="superDispatchGenericMotionEvent(Landroid/view/MotionEvent;)Z" since="12"/>
+ <method name="superDispatchKeyEvent(Landroid/view/KeyEvent;)Z"/>
+ <method name="superDispatchKeyShortcutEvent(Landroid/view/KeyEvent;)Z" since="11"/>
+ <method name="superDispatchTouchEvent(Landroid/view/MotionEvent;)Z"/>
+ <method name="superDispatchTrackballEvent(Landroid/view/MotionEvent;)Z"/>
+ <method name="takeInputQueue(Landroid/view/InputQueue$Callback;)V" since="9"/>
+ <method name="takeKeyEvents(Z)V"/>
+ <method name="takeSurface(Landroid/view/SurfaceHolder$Callback2;)V" since="9"/>
+ <method name="togglePanel(ILandroid/view/KeyEvent;)V"/>
+ <field name="DECOR_CAPTION_SHADE_AUTO" since="24"/>
+ <field name="DECOR_CAPTION_SHADE_DARK" since="24"/>
+ <field name="DECOR_CAPTION_SHADE_LIGHT" since="24"/>
+ <field name="DEFAULT_FEATURES" deprecated="22"/>
+ <field name="FEATURE_ACTION_BAR" since="11"/>
+ <field name="FEATURE_ACTION_BAR_OVERLAY" since="11"/>
+ <field name="FEATURE_ACTION_MODE_OVERLAY" since="11"/>
+ <field name="FEATURE_ACTIVITY_TRANSITIONS" since="21"/>
+ <field name="FEATURE_CONTENT_TRANSITIONS" since="21"/>
+ <field name="FEATURE_CONTEXT_MENU"/>
+ <field name="FEATURE_CUSTOM_TITLE"/>
+ <field name="FEATURE_INDETERMINATE_PROGRESS" deprecated="24"/>
+ <field name="FEATURE_LEFT_ICON"/>
+ <field name="FEATURE_NO_TITLE"/>
+ <field name="FEATURE_OPTIONS_PANEL"/>
+ <field name="FEATURE_PROGRESS" deprecated="24"/>
+ <field name="FEATURE_RIGHT_ICON"/>
+ <field name="FEATURE_SWIPE_TO_DISMISS" since="20"/>
+ <field name="ID_ANDROID_CONTENT"/>
+ <field name="NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME" since="21"/>
+ <field name="PROGRESS_END" deprecated="24"/>
+ <field name="PROGRESS_INDETERMINATE_OFF" deprecated="24"/>
+ <field name="PROGRESS_INDETERMINATE_ON" deprecated="24"/>
+ <field name="PROGRESS_SECONDARY_END" deprecated="24"/>
+ <field name="PROGRESS_SECONDARY_START" deprecated="24"/>
+ <field name="PROGRESS_START" deprecated="24"/>
+ <field name="PROGRESS_VISIBILITY_OFF" deprecated="24"/>
+ <field name="PROGRESS_VISIBILITY_ON" deprecated="24"/>
+ <field name="STATUS_BAR_BACKGROUND_TRANSITION_NAME" since="21"/>
+ </class>
+ <class name="android/view/Window$Callback" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="dispatchGenericMotionEvent(Landroid/view/MotionEvent;)Z" since="12"/>
+ <method name="dispatchKeyEvent(Landroid/view/KeyEvent;)Z"/>
+ <method name="dispatchKeyShortcutEvent(Landroid/view/KeyEvent;)Z" since="11"/>
+ <method name="dispatchPopulateAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)Z" since="4"/>
+ <method name="dispatchTouchEvent(Landroid/view/MotionEvent;)Z"/>
+ <method name="dispatchTrackballEvent(Landroid/view/MotionEvent;)Z"/>
+ <method name="onActionModeFinished(Landroid/view/ActionMode;)V" since="11"/>
+ <method name="onActionModeStarted(Landroid/view/ActionMode;)V" since="11"/>
+ <method name="onAttachedToWindow()V" since="5"/>
+ <method name="onContentChanged()V"/>
+ <method name="onCreatePanelMenu(ILandroid/view/Menu;)Z"/>
+ <method name="onCreatePanelView(I)Landroid/view/View;"/>
+ <method name="onDetachedFromWindow()V" since="5"/>
+ <method name="onMenuItemSelected(ILandroid/view/MenuItem;)Z"/>
+ <method name="onMenuOpened(ILandroid/view/Menu;)Z"/>
+ <method name="onPanelClosed(ILandroid/view/Menu;)V"/>
+ <method name="onPointerCaptureChanged(Z)V" since="26"/>
+ <method name="onPreparePanel(ILandroid/view/View;Landroid/view/Menu;)Z"/>
+ <method name="onProvideKeyboardShortcuts(Ljava/util/List;Landroid/view/Menu;I)V" since="24"/>
+ <method name="onSearchRequested()Z"/>
+ <method name="onSearchRequested(Landroid/view/SearchEvent;)Z" since="23"/>
+ <method name="onWindowAttributesChanged(Landroid/view/WindowManager$LayoutParams;)V"/>
+ <method name="onWindowFocusChanged(Z)V"/>
+ <method name="onWindowStartingActionMode(Landroid/view/ActionMode$Callback;)Landroid/view/ActionMode;" since="11"/>
+ <method name="onWindowStartingActionMode(Landroid/view/ActionMode$Callback;I)Landroid/view/ActionMode;" since="23"/>
+ </class>
+ <class name="android/view/Window$OnFrameMetricsAvailableListener" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="onFrameMetricsAvailable(Landroid/view/Window;Landroid/view/FrameMetrics;I)V"/>
+ </class>
+ <class name="android/view/Window$OnRestrictedCaptionAreaChangedListener" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="onRestrictedCaptionAreaChanged(Landroid/graphics/Rect;)V"/>
+ </class>
+ <class name="android/view/WindowAnimationFrameStats" since="21">
+ <extends name="android/view/FrameStats"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/view/WindowContentFrameStats" since="21">
+ <extends name="android/view/FrameStats"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getFramePostedTimeNano(I)J"/>
+ <method name="getFrameReadyTimeNano(I)J"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/view/WindowId" since="18">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="isFocused()Z"/>
+ <method name="registerFocusObserver(Landroid/view/WindowId$FocusObserver;)V"/>
+ <method name="unregisterFocusObserver(Landroid/view/WindowId$FocusObserver;)V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/view/WindowId$FocusObserver" since="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onFocusGained(Landroid/view/WindowId;)V"/>
+ <method name="onFocusLost(Landroid/view/WindowId;)V"/>
+ </class>
+ <class name="android/view/WindowInsets" since="20">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/view/WindowInsets;)V"/>
+ <method name="consumeStableInsets()Landroid/view/WindowInsets;" since="21"/>
+ <method name="consumeSystemWindowInsets()Landroid/view/WindowInsets;"/>
+ <method name="getStableInsetBottom()I" since="21"/>
+ <method name="getStableInsetLeft()I" since="21"/>
+ <method name="getStableInsetRight()I" since="21"/>
+ <method name="getStableInsetTop()I" since="21"/>
+ <method name="getSystemWindowInsetBottom()I"/>
+ <method name="getSystemWindowInsetLeft()I"/>
+ <method name="getSystemWindowInsetRight()I"/>
+ <method name="getSystemWindowInsetTop()I"/>
+ <method name="hasInsets()Z"/>
+ <method name="hasStableInsets()Z" since="21"/>
+ <method name="hasSystemWindowInsets()Z"/>
+ <method name="isConsumed()Z" since="21"/>
+ <method name="isRound()Z"/>
+ <method name="replaceSystemWindowInsets(IIII)Landroid/view/WindowInsets;"/>
+ <method name="replaceSystemWindowInsets(Landroid/graphics/Rect;)Landroid/view/WindowInsets;" since="21"/>
+ </class>
+ <class name="android/view/WindowManager" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/view/ViewManager"/>
+ <method name="getDefaultDisplay()Landroid/view/Display;"/>
+ <method name="removeViewImmediate(Landroid/view/View;)V"/>
+ </class>
+ <class name="android/view/WindowManager$BadTokenException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/view/WindowManager$InvalidDisplayException" since="17">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/view/WindowManager$LayoutParams" since="1">
+ <extends name="android/view/ViewGroup$LayoutParams"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="&lt;init>(III)V"/>
+ <method name="&lt;init>(IIIII)V"/>
+ <method name="&lt;init>(IIIIIII)V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="copyFrom(Landroid/view/WindowManager$LayoutParams;)I"/>
+ <method name="debug(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getColorMode()I" since="26"/>
+ <method name="getTitle()Ljava/lang/CharSequence;"/>
+ <method name="mayUseInputMethod(I)Z" since="3"/>
+ <method name="setColorMode(I)V" since="26"/>
+ <method name="setTitle(Ljava/lang/CharSequence;)V"/>
+ <field name="ALPHA_CHANGED"/>
+ <field name="ANIMATION_CHANGED"/>
+ <field name="BRIGHTNESS_OVERRIDE_FULL" since="8"/>
+ <field name="BRIGHTNESS_OVERRIDE_NONE" since="8"/>
+ <field name="BRIGHTNESS_OVERRIDE_OFF" since="8"/>
+ <field name="CREATOR"/>
+ <field name="DIM_AMOUNT_CHANGED"/>
+ <field name="FIRST_APPLICATION_WINDOW"/>
+ <field name="FIRST_SUB_WINDOW"/>
+ <field name="FIRST_SYSTEM_WINDOW"/>
+ <field name="FLAGS_CHANGED"/>
+ <field name="FLAG_ALLOW_LOCK_WHILE_SCREEN_ON" since="8"/>
+ <field name="FLAG_ALT_FOCUSABLE_IM" since="3"/>
+ <field name="FLAG_BLUR_BEHIND" deprecated="16"/>
+ <field name="FLAG_DIM_BEHIND"/>
+ <field name="FLAG_DISMISS_KEYGUARD" since="5" deprecated="26"/>
+ <field name="FLAG_DITHER" deprecated="17"/>
+ <field name="FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS" since="21"/>
+ <field name="FLAG_FORCE_NOT_FULLSCREEN"/>
+ <field name="FLAG_FULLSCREEN"/>
+ <field name="FLAG_HARDWARE_ACCELERATED" since="11"/>
+ <field name="FLAG_IGNORE_CHEEK_PRESSES"/>
+ <field name="FLAG_KEEP_SCREEN_ON"/>
+ <field name="FLAG_LAYOUT_ATTACHED_IN_DECOR" since="22"/>
+ <field name="FLAG_LAYOUT_INSET_DECOR"/>
+ <field name="FLAG_LAYOUT_IN_OVERSCAN" since="18"/>
+ <field name="FLAG_LAYOUT_IN_SCREEN"/>
+ <field name="FLAG_LAYOUT_NO_LIMITS"/>
+ <field name="FLAG_LOCAL_FOCUS_MODE" since="19"/>
+ <field name="FLAG_NOT_FOCUSABLE"/>
+ <field name="FLAG_NOT_TOUCHABLE"/>
+ <field name="FLAG_NOT_TOUCH_MODAL"/>
+ <field name="FLAG_SCALED"/>
+ <field name="FLAG_SECURE"/>
+ <field name="FLAG_SHOW_WALLPAPER" since="5"/>
+ <field name="FLAG_SHOW_WHEN_LOCKED" since="5"/>
+ <field name="FLAG_SPLIT_TOUCH" since="11"/>
+ <field name="FLAG_TOUCHABLE_WHEN_WAKING" deprecated="20"/>
+ <field name="FLAG_TRANSLUCENT_NAVIGATION" since="19"/>
+ <field name="FLAG_TRANSLUCENT_STATUS" since="19"/>
+ <field name="FLAG_TURN_SCREEN_ON" since="5"/>
+ <field name="FLAG_WATCH_OUTSIDE_TOUCH" since="3"/>
+ <field name="FORMAT_CHANGED"/>
+ <field name="LAST_APPLICATION_WINDOW"/>
+ <field name="LAST_SUB_WINDOW"/>
+ <field name="LAST_SYSTEM_WINDOW"/>
+ <field name="LAYOUT_CHANGED"/>
+ <field name="MEMORY_TYPE_CHANGED"/>
+ <field name="MEMORY_TYPE_GPU" deprecated="16"/>
+ <field name="MEMORY_TYPE_HARDWARE" deprecated="16"/>
+ <field name="MEMORY_TYPE_NORMAL" deprecated="16"/>
+ <field name="MEMORY_TYPE_PUSH_BUFFERS" deprecated="16"/>
+ <field name="ROTATION_ANIMATION_CHANGED" since="18"/>
+ <field name="ROTATION_ANIMATION_CROSSFADE" since="18"/>
+ <field name="ROTATION_ANIMATION_JUMPCUT" since="18"/>
+ <field name="ROTATION_ANIMATION_ROTATE" since="18"/>
+ <field name="ROTATION_ANIMATION_SEAMLESS" since="26"/>
+ <field name="SCREEN_BRIGHTNESS_CHANGED" since="3"/>
+ <field name="SCREEN_ORIENTATION_CHANGED" since="3"/>
+ <field name="SOFT_INPUT_ADJUST_NOTHING" since="11"/>
+ <field name="SOFT_INPUT_ADJUST_PAN" since="3"/>
+ <field name="SOFT_INPUT_ADJUST_RESIZE" since="3"/>
+ <field name="SOFT_INPUT_ADJUST_UNSPECIFIED" since="3"/>
+ <field name="SOFT_INPUT_IS_FORWARD_NAVIGATION" since="3"/>
+ <field name="SOFT_INPUT_MASK_ADJUST" since="3"/>
+ <field name="SOFT_INPUT_MASK_STATE" since="3"/>
+ <field name="SOFT_INPUT_MODE_CHANGED" since="3"/>
+ <field name="SOFT_INPUT_STATE_ALWAYS_HIDDEN" since="3"/>
+ <field name="SOFT_INPUT_STATE_ALWAYS_VISIBLE" since="3"/>
+ <field name="SOFT_INPUT_STATE_HIDDEN" since="3"/>
+ <field name="SOFT_INPUT_STATE_UNCHANGED" since="3"/>
+ <field name="SOFT_INPUT_STATE_UNSPECIFIED" since="3"/>
+ <field name="SOFT_INPUT_STATE_VISIBLE" since="3"/>
+ <field name="TITLE_CHANGED"/>
+ <field name="TYPE_ACCESSIBILITY_OVERLAY" since="22"/>
+ <field name="TYPE_APPLICATION"/>
+ <field name="TYPE_APPLICATION_ATTACHED_DIALOG" since="3"/>
+ <field name="TYPE_APPLICATION_MEDIA"/>
+ <field name="TYPE_APPLICATION_OVERLAY" since="26"/>
+ <field name="TYPE_APPLICATION_PANEL"/>
+ <field name="TYPE_APPLICATION_STARTING"/>
+ <field name="TYPE_APPLICATION_SUB_PANEL"/>
+ <field name="TYPE_BASE_APPLICATION"/>
+ <field name="TYPE_CHANGED"/>
+ <field name="TYPE_DRAWN_APPLICATION" since="25"/>
+ <field name="TYPE_INPUT_METHOD" since="3"/>
+ <field name="TYPE_INPUT_METHOD_DIALOG" since="3"/>
+ <field name="TYPE_KEYGUARD" removed="21"/>
+ <field name="TYPE_KEYGUARD_DIALOG"/>
+ <field name="TYPE_PHONE" deprecated="26"/>
+ <field name="TYPE_PRIORITY_PHONE" deprecated="26"/>
+ <field name="TYPE_PRIVATE_PRESENTATION" since="19"/>
+ <field name="TYPE_SEARCH_BAR"/>
+ <field name="TYPE_STATUS_BAR"/>
+ <field name="TYPE_STATUS_BAR_PANEL"/>
+ <field name="TYPE_SYSTEM_ALERT" deprecated="26"/>
+ <field name="TYPE_SYSTEM_DIALOG"/>
+ <field name="TYPE_SYSTEM_ERROR" deprecated="26"/>
+ <field name="TYPE_SYSTEM_OVERLAY" deprecated="26"/>
+ <field name="TYPE_TOAST" deprecated="26"/>
+ <field name="TYPE_WALLPAPER" since="5"/>
+ <field name="alpha"/>
+ <field name="buttonBrightness" since="8"/>
+ <field name="dimAmount"/>
+ <field name="flags"/>
+ <field name="format"/>
+ <field name="gravity"/>
+ <field name="horizontalMargin"/>
+ <field name="horizontalWeight"/>
+ <field name="memoryType" deprecated="16"/>
+ <field name="packageName"/>
+ <field name="preferredDisplayModeId" since="23"/>
+ <field name="preferredRefreshRate" since="21" deprecated="23"/>
+ <field name="rotationAnimation" since="18"/>
+ <field name="screenBrightness" since="3"/>
+ <field name="screenOrientation" since="3"/>
+ <field name="softInputMode" since="3"/>
+ <field name="systemUiVisibility" since="11"/>
+ <field name="token"/>
+ <field name="type"/>
+ <field name="verticalMargin"/>
+ <field name="verticalWeight"/>
+ <field name="windowAnimations"/>
+ <field name="x"/>
+ <field name="y"/>
+ </class>
+ <class name="android/view/accessibility/AccessibilityEvent" since="4">
+ <extends name="android/view/accessibility/AccessibilityRecord" since="14"/>
+ <extends name="java/lang/Object" removed="14"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="appendRecord(Landroid/view/accessibility/AccessibilityRecord;)V" since="14"/>
+ <method name="eventTypeToString(I)Ljava/lang/String;" since="14"/>
+ <method name="getAction()I" since="16"/>
+ <method name="getAddedCount()I" removed="14"/>
+ <method name="getBeforeText()Ljava/lang/CharSequence;" removed="14"/>
+ <method name="getClassName()Ljava/lang/CharSequence;" removed="14"/>
+ <method name="getContentChangeTypes()I" since="19"/>
+ <method name="getContentDescription()Ljava/lang/CharSequence;" removed="14"/>
+ <method name="getCurrentItemIndex()I" removed="14"/>
+ <method name="getEventTime()J"/>
+ <method name="getEventType()I"/>
+ <method name="getFromIndex()I" removed="14"/>
+ <method name="getItemCount()I" removed="14"/>
+ <method name="getMovementGranularity()I" since="16"/>
+ <method name="getPackageName()Ljava/lang/CharSequence;"/>
+ <method name="getParcelableData()Landroid/os/Parcelable;" removed="14"/>
+ <method name="getRecord(I)Landroid/view/accessibility/AccessibilityRecord;" since="14"/>
+ <method name="getRecordCount()I" since="14"/>
+ <method name="getRemovedCount()I" removed="14"/>
+ <method name="getText()Ljava/util/List;" removed="14"/>
+ <method name="initFromParcel(Landroid/os/Parcel;)V"/>
+ <method name="isChecked()Z" removed="14"/>
+ <method name="isEnabled()Z" removed="14"/>
+ <method name="isFullScreen()Z" removed="14"/>
+ <method name="isPassword()Z" removed="14"/>
+ <method name="obtain()Landroid/view/accessibility/AccessibilityEvent;"/>
+ <method name="obtain(I)Landroid/view/accessibility/AccessibilityEvent;"/>
+ <method name="obtain(Landroid/view/accessibility/AccessibilityEvent;)Landroid/view/accessibility/AccessibilityEvent;" since="14"/>
+ <method name="recycle()V"/>
+ <method name="setAction(I)V" since="16"/>
+ <method name="setAddedCount(I)V" removed="14"/>
+ <method name="setBeforeText(Ljava/lang/CharSequence;)V" removed="14"/>
+ <method name="setChecked(Z)V" removed="14"/>
+ <method name="setClassName(Ljava/lang/CharSequence;)V" removed="14"/>
+ <method name="setContentChangeTypes(I)V" since="19"/>
+ <method name="setContentDescription(Ljava/lang/CharSequence;)V" removed="14"/>
+ <method name="setCurrentItemIndex(I)V" removed="14"/>
+ <method name="setEnabled(Z)V" removed="14"/>
+ <method name="setEventTime(J)V"/>
+ <method name="setEventType(I)V"/>
+ <method name="setFromIndex(I)V" removed="14"/>
+ <method name="setFullScreen(Z)V" removed="14"/>
+ <method name="setItemCount(I)V" removed="14"/>
+ <method name="setMovementGranularity(I)V" since="16"/>
+ <method name="setPackageName(Ljava/lang/CharSequence;)V"/>
+ <method name="setParcelableData(Landroid/os/Parcelable;)V" removed="14"/>
+ <method name="setPassword(Z)V" removed="14"/>
+ <method name="setRemovedCount(I)V" removed="14"/>
+ <field name="CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION" since="19"/>
+ <field name="CONTENT_CHANGE_TYPE_SUBTREE" since="19"/>
+ <field name="CONTENT_CHANGE_TYPE_TEXT" since="19"/>
+ <field name="CONTENT_CHANGE_TYPE_UNDEFINED" since="19"/>
+ <field name="CREATOR"/>
+ <field name="INVALID_POSITION"/>
+ <field name="MAX_TEXT_LENGTH" deprecated="16"/>
+ <field name="TYPES_ALL_MASK"/>
+ <field name="TYPE_ANNOUNCEMENT" since="16"/>
+ <field name="TYPE_ASSIST_READING_CONTEXT" since="23"/>
+ <field name="TYPE_GESTURE_DETECTION_END" since="17"/>
+ <field name="TYPE_GESTURE_DETECTION_START" since="17"/>
+ <field name="TYPE_NOTIFICATION_STATE_CHANGED"/>
+ <field name="TYPE_TOUCH_EXPLORATION_GESTURE_END" since="14"/>
+ <field name="TYPE_TOUCH_EXPLORATION_GESTURE_START" since="14"/>
+ <field name="TYPE_TOUCH_INTERACTION_END" since="17"/>
+ <field name="TYPE_TOUCH_INTERACTION_START" since="17"/>
+ <field name="TYPE_VIEW_ACCESSIBILITY_FOCUSED" since="16"/>
+ <field name="TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED" since="16"/>
+ <field name="TYPE_VIEW_CLICKED"/>
+ <field name="TYPE_VIEW_CONTEXT_CLICKED" since="23"/>
+ <field name="TYPE_VIEW_FOCUSED"/>
+ <field name="TYPE_VIEW_HOVER_ENTER" since="14"/>
+ <field name="TYPE_VIEW_HOVER_EXIT" since="14"/>
+ <field name="TYPE_VIEW_LONG_CLICKED"/>
+ <field name="TYPE_VIEW_SCROLLED" since="14"/>
+ <field name="TYPE_VIEW_SELECTED"/>
+ <field name="TYPE_VIEW_TEXT_CHANGED"/>
+ <field name="TYPE_VIEW_TEXT_SELECTION_CHANGED" since="14"/>
+ <field name="TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY" since="16"/>
+ <field name="TYPE_WINDOWS_CHANGED" since="21"/>
+ <field name="TYPE_WINDOW_CONTENT_CHANGED" since="14"/>
+ <field name="TYPE_WINDOW_STATE_CHANGED"/>
+ </class>
+ <class name="android/view/accessibility/AccessibilityEventSource" since="4">
+ <extends name="java/lang/Object"/>
+ <method name="sendAccessibilityEvent(I)V"/>
+ <method name="sendAccessibilityEventUnchecked(Landroid/view/accessibility/AccessibilityEvent;)V"/>
+ </class>
+ <class name="android/view/accessibility/AccessibilityManager" since="4">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addAccessibilityStateChangeListener(Landroid/view/accessibility/AccessibilityManager$AccessibilityStateChangeListener;)Z" since="14"/>
+ <method name="addAccessibilityStateChangeListener(Landroid/view/accessibility/AccessibilityManager$AccessibilityStateChangeListener;Landroid/os/Handler;)V" since="26"/>
+ <method name="addTouchExplorationStateChangeListener(Landroid/view/accessibility/AccessibilityManager$TouchExplorationStateChangeListener;)Z" since="19"/>
+ <method name="addTouchExplorationStateChangeListener(Landroid/view/accessibility/AccessibilityManager$TouchExplorationStateChangeListener;Landroid/os/Handler;)V" since="26"/>
+ <method name="getAccessibilityServiceList()Ljava/util/List;" deprecated="16"/>
+ <method name="getEnabledAccessibilityServiceList(I)Ljava/util/List;" since="14"/>
+ <method name="getInstalledAccessibilityServiceList()Ljava/util/List;" since="14"/>
+ <method name="interrupt()V"/>
+ <method name="isEnabled()Z"/>
+ <method name="isTouchExplorationEnabled()Z" since="14"/>
+ <method name="removeAccessibilityStateChangeListener(Landroid/view/accessibility/AccessibilityManager$AccessibilityStateChangeListener;)Z" since="14"/>
+ <method name="removeTouchExplorationStateChangeListener(Landroid/view/accessibility/AccessibilityManager$TouchExplorationStateChangeListener;)Z" since="19"/>
+ <method name="sendAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V"/>
+ </class>
+ <class name="android/view/accessibility/AccessibilityManager$AccessibilityStateChangeListener" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="onAccessibilityStateChanged(Z)V"/>
+ </class>
+ <class name="android/view/accessibility/AccessibilityManager$TouchExplorationStateChangeListener" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="onTouchExplorationStateChanged(Z)V"/>
+ </class>
+ <class name="android/view/accessibility/AccessibilityNodeInfo" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="addAction(I)V" deprecated="21"/>
+ <method name="addAction(Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction;)V" since="21"/>
+ <method name="addChild(Landroid/view/View;)V"/>
+ <method name="addChild(Landroid/view/View;I)V" since="16"/>
+ <method name="canOpenPopup()Z" since="19"/>
+ <method name="findAccessibilityNodeInfosByText(Ljava/lang/String;)Ljava/util/List;"/>
+ <method name="findAccessibilityNodeInfosByViewId(Ljava/lang/String;)Ljava/util/List;" since="18"/>
+ <method name="findFocus(I)Landroid/view/accessibility/AccessibilityNodeInfo;" since="16"/>
+ <method name="focusSearch(I)Landroid/view/accessibility/AccessibilityNodeInfo;" since="16"/>
+ <method name="getActionList()Ljava/util/List;" since="21"/>
+ <method name="getActions()I" deprecated="21"/>
+ <method name="getAvailableExtraData()Ljava/util/List;" since="26"/>
+ <method name="getBoundsInParent(Landroid/graphics/Rect;)V"/>
+ <method name="getBoundsInScreen(Landroid/graphics/Rect;)V"/>
+ <method name="getChild(I)Landroid/view/accessibility/AccessibilityNodeInfo;"/>
+ <method name="getChildCount()I"/>
+ <method name="getClassName()Ljava/lang/CharSequence;"/>
+ <method name="getCollectionInfo()Landroid/view/accessibility/AccessibilityNodeInfo$CollectionInfo;" since="19"/>
+ <method name="getCollectionItemInfo()Landroid/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo;" since="19"/>
+ <method name="getContentDescription()Ljava/lang/CharSequence;"/>
+ <method name="getDrawingOrder()I" since="24"/>
+ <method name="getError()Ljava/lang/CharSequence;" since="21"/>
+ <method name="getExtras()Landroid/os/Bundle;" since="19"/>
+ <method name="getHintText()Ljava/lang/CharSequence;" since="26"/>
+ <method name="getInputType()I" since="19"/>
+ <method name="getLabelFor()Landroid/view/accessibility/AccessibilityNodeInfo;" since="17"/>
+ <method name="getLabeledBy()Landroid/view/accessibility/AccessibilityNodeInfo;" since="17"/>
+ <method name="getLiveRegion()I" since="19"/>
+ <method name="getMaxTextLength()I" since="21"/>
+ <method name="getMovementGranularities()I" since="16"/>
+ <method name="getPackageName()Ljava/lang/CharSequence;"/>
+ <method name="getParent()Landroid/view/accessibility/AccessibilityNodeInfo;"/>
+ <method name="getRangeInfo()Landroid/view/accessibility/AccessibilityNodeInfo$RangeInfo;" since="19"/>
+ <method name="getText()Ljava/lang/CharSequence;"/>
+ <method name="getTextSelectionEnd()I" since="18"/>
+ <method name="getTextSelectionStart()I" since="18"/>
+ <method name="getTraversalAfter()Landroid/view/accessibility/AccessibilityNodeInfo;" since="22"/>
+ <method name="getTraversalBefore()Landroid/view/accessibility/AccessibilityNodeInfo;" since="22"/>
+ <method name="getViewIdResourceName()Ljava/lang/String;" since="18"/>
+ <method name="getWindow()Landroid/view/accessibility/AccessibilityWindowInfo;" since="21"/>
+ <method name="getWindowId()I"/>
+ <method name="isAccessibilityFocused()Z" since="16"/>
+ <method name="isCheckable()Z"/>
+ <method name="isChecked()Z"/>
+ <method name="isClickable()Z"/>
+ <method name="isContentInvalid()Z" since="19"/>
+ <method name="isContextClickable()Z" since="23"/>
+ <method name="isDismissable()Z" since="19"/>
+ <method name="isEditable()Z" since="18"/>
+ <method name="isEnabled()Z"/>
+ <method name="isFocusable()Z"/>
+ <method name="isFocused()Z"/>
+ <method name="isImportantForAccessibility()Z" since="24"/>
+ <method name="isLongClickable()Z"/>
+ <method name="isMultiLine()Z" since="19"/>
+ <method name="isPassword()Z"/>
+ <method name="isScrollable()Z"/>
+ <method name="isSelected()Z"/>
+ <method name="isShowingHintText()Z" since="26"/>
+ <method name="isVisibleToUser()Z" since="16"/>
+ <method name="obtain()Landroid/view/accessibility/AccessibilityNodeInfo;"/>
+ <method name="obtain(Landroid/view/View;)Landroid/view/accessibility/AccessibilityNodeInfo;"/>
+ <method name="obtain(Landroid/view/View;I)Landroid/view/accessibility/AccessibilityNodeInfo;" since="16"/>
+ <method name="obtain(Landroid/view/accessibility/AccessibilityNodeInfo;)Landroid/view/accessibility/AccessibilityNodeInfo;"/>
+ <method name="performAction(I)Z"/>
+ <method name="performAction(ILandroid/os/Bundle;)Z" since="16"/>
+ <method name="recycle()V"/>
+ <method name="refresh()Z" since="18"/>
+ <method name="refreshWithExtraData(Ljava/lang/String;Landroid/os/Bundle;)Z" since="26"/>
+ <method name="removeAction(I)V" since="21" deprecated="21"/>
+ <method name="removeAction(Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction;)Z" since="21"/>
+ <method name="removeChild(Landroid/view/View;)Z" since="21"/>
+ <method name="removeChild(Landroid/view/View;I)Z" since="21"/>
+ <method name="setAccessibilityFocused(Z)V" since="16"/>
+ <method name="setAvailableExtraData(Ljava/util/List;)V" since="26"/>
+ <method name="setBoundsInParent(Landroid/graphics/Rect;)V"/>
+ <method name="setBoundsInScreen(Landroid/graphics/Rect;)V"/>
+ <method name="setCanOpenPopup(Z)V" since="19"/>
+ <method name="setCheckable(Z)V"/>
+ <method name="setChecked(Z)V"/>
+ <method name="setClassName(Ljava/lang/CharSequence;)V"/>
+ <method name="setClickable(Z)V"/>
+ <method name="setCollectionInfo(Landroid/view/accessibility/AccessibilityNodeInfo$CollectionInfo;)V" since="19"/>
+ <method name="setCollectionItemInfo(Landroid/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo;)V" since="19"/>
+ <method name="setContentDescription(Ljava/lang/CharSequence;)V"/>
+ <method name="setContentInvalid(Z)V" since="19"/>
+ <method name="setContextClickable(Z)V" since="23"/>
+ <method name="setDismissable(Z)V" since="19"/>
+ <method name="setDrawingOrder(I)V" since="24"/>
+ <method name="setEditable(Z)V" since="18"/>
+ <method name="setEnabled(Z)V"/>
+ <method name="setError(Ljava/lang/CharSequence;)V" since="21"/>
+ <method name="setFocusable(Z)V"/>
+ <method name="setFocused(Z)V"/>
+ <method name="setHintText(Ljava/lang/CharSequence;)V" since="26"/>
+ <method name="setImportantForAccessibility(Z)V" since="24"/>
+ <method name="setInputType(I)V" since="19"/>
+ <method name="setLabelFor(Landroid/view/View;)V" since="17"/>
+ <method name="setLabelFor(Landroid/view/View;I)V" since="17"/>
+ <method name="setLabeledBy(Landroid/view/View;)V" since="17"/>
+ <method name="setLabeledBy(Landroid/view/View;I)V" since="17"/>
+ <method name="setLiveRegion(I)V" since="19"/>
+ <method name="setLongClickable(Z)V"/>
+ <method name="setMaxTextLength(I)V" since="21"/>
+ <method name="setMovementGranularities(I)V" since="16"/>
+ <method name="setMultiLine(Z)V" since="19"/>
+ <method name="setPackageName(Ljava/lang/CharSequence;)V"/>
+ <method name="setParent(Landroid/view/View;)V"/>
+ <method name="setParent(Landroid/view/View;I)V" since="16"/>
+ <method name="setPassword(Z)V"/>
+ <method name="setRangeInfo(Landroid/view/accessibility/AccessibilityNodeInfo$RangeInfo;)V" since="19"/>
+ <method name="setScrollable(Z)V"/>
+ <method name="setSelected(Z)V"/>
+ <method name="setShowingHintText(Z)V" since="26"/>
+ <method name="setSource(Landroid/view/View;)V"/>
+ <method name="setSource(Landroid/view/View;I)V" since="16"/>
+ <method name="setText(Ljava/lang/CharSequence;)V"/>
+ <method name="setTextSelection(II)V" since="18"/>
+ <method name="setTraversalAfter(Landroid/view/View;)V" since="22"/>
+ <method name="setTraversalAfter(Landroid/view/View;I)V" since="22"/>
+ <method name="setTraversalBefore(Landroid/view/View;)V" since="22"/>
+ <method name="setTraversalBefore(Landroid/view/View;I)V" since="22"/>
+ <method name="setViewIdResourceName(Ljava/lang/String;)V" since="18"/>
+ <method name="setVisibleToUser(Z)V" since="16"/>
+ <field name="ACTION_ACCESSIBILITY_FOCUS" since="16"/>
+ <field name="ACTION_ARGUMENT_COLUMN_INT" since="23"/>
+ <field name="ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN" since="18"/>
+ <field name="ACTION_ARGUMENT_HTML_ELEMENT_STRING" since="16"/>
+ <field name="ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT" since="16"/>
+ <field name="ACTION_ARGUMENT_MOVE_WINDOW_X" since="26"/>
+ <field name="ACTION_ARGUMENT_MOVE_WINDOW_Y" since="26"/>
+ <field name="ACTION_ARGUMENT_PROGRESS_VALUE" since="24"/>
+ <field name="ACTION_ARGUMENT_ROW_INT" since="23"/>
+ <field name="ACTION_ARGUMENT_SELECTION_END_INT" since="18"/>
+ <field name="ACTION_ARGUMENT_SELECTION_START_INT" since="18"/>
+ <field name="ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE" since="21"/>
+ <field name="ACTION_CLEAR_ACCESSIBILITY_FOCUS" since="16"/>
+ <field name="ACTION_CLEAR_FOCUS"/>
+ <field name="ACTION_CLEAR_SELECTION"/>
+ <field name="ACTION_CLICK" since="16"/>
+ <field name="ACTION_COLLAPSE" since="19"/>
+ <field name="ACTION_COPY" since="18"/>
+ <field name="ACTION_CUT" since="18"/>
+ <field name="ACTION_DISMISS" since="19"/>
+ <field name="ACTION_EXPAND" since="19"/>
+ <field name="ACTION_FOCUS"/>
+ <field name="ACTION_LONG_CLICK" since="16"/>
+ <field name="ACTION_NEXT_AT_MOVEMENT_GRANULARITY" since="16"/>
+ <field name="ACTION_NEXT_HTML_ELEMENT" since="16"/>
+ <field name="ACTION_PASTE" since="18"/>
+ <field name="ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY" since="16"/>
+ <field name="ACTION_PREVIOUS_HTML_ELEMENT" since="16"/>
+ <field name="ACTION_SCROLL_BACKWARD" since="16"/>
+ <field name="ACTION_SCROLL_FORWARD" since="16"/>
+ <field name="ACTION_SELECT"/>
+ <field name="ACTION_SET_SELECTION" since="18"/>
+ <field name="ACTION_SET_TEXT" since="21"/>
+ <field name="CREATOR"/>
+ <field name="EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_LENGTH" since="26"/>
+ <field name="EXTRA_DATA_TEXT_CHARACTER_LOCATION_ARG_START_INDEX" since="26"/>
+ <field name="EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY" since="26"/>
+ <field name="FOCUS_ACCESSIBILITY" since="16"/>
+ <field name="FOCUS_INPUT" since="16"/>
+ <field name="MOVEMENT_GRANULARITY_CHARACTER" since="16"/>
+ <field name="MOVEMENT_GRANULARITY_LINE" since="16"/>
+ <field name="MOVEMENT_GRANULARITY_PAGE" since="16"/>
+ <field name="MOVEMENT_GRANULARITY_PARAGRAPH" since="16"/>
+ <field name="MOVEMENT_GRANULARITY_WORD" since="16"/>
+ </class>
+ <class name="android/view/accessibility/AccessibilityNodeInfo$AccessibilityAction" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(ILjava/lang/CharSequence;)V"/>
+ <method name="getId()I"/>
+ <method name="getLabel()Ljava/lang/CharSequence;"/>
+ <field name="ACTION_ACCESSIBILITY_FOCUS"/>
+ <field name="ACTION_CLEAR_ACCESSIBILITY_FOCUS"/>
+ <field name="ACTION_CLEAR_FOCUS"/>
+ <field name="ACTION_CLEAR_SELECTION"/>
+ <field name="ACTION_CLICK"/>
+ <field name="ACTION_COLLAPSE"/>
+ <field name="ACTION_CONTEXT_CLICK" since="23"/>
+ <field name="ACTION_COPY"/>
+ <field name="ACTION_CUT"/>
+ <field name="ACTION_DISMISS"/>
+ <field name="ACTION_EXPAND"/>
+ <field name="ACTION_FOCUS"/>
+ <field name="ACTION_LONG_CLICK"/>
+ <field name="ACTION_MOVE_WINDOW" since="26"/>
+ <field name="ACTION_NEXT_AT_MOVEMENT_GRANULARITY"/>
+ <field name="ACTION_NEXT_HTML_ELEMENT"/>
+ <field name="ACTION_PASTE"/>
+ <field name="ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY"/>
+ <field name="ACTION_PREVIOUS_HTML_ELEMENT"/>
+ <field name="ACTION_SCROLL_BACKWARD"/>
+ <field name="ACTION_SCROLL_DOWN" since="23"/>
+ <field name="ACTION_SCROLL_FORWARD"/>
+ <field name="ACTION_SCROLL_LEFT" since="23"/>
+ <field name="ACTION_SCROLL_RIGHT" since="23"/>
+ <field name="ACTION_SCROLL_TO_POSITION" since="23"/>
+ <field name="ACTION_SCROLL_UP" since="23"/>
+ <field name="ACTION_SELECT"/>
+ <field name="ACTION_SET_PROGRESS" since="24"/>
+ <field name="ACTION_SET_SELECTION"/>
+ <field name="ACTION_SET_TEXT"/>
+ <field name="ACTION_SHOW_ON_SCREEN" since="23"/>
+ </class>
+ <class name="android/view/accessibility/AccessibilityNodeInfo$CollectionInfo" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getColumnCount()I"/>
+ <method name="getRowCount()I"/>
+ <method name="getSelectionMode()I" since="21"/>
+ <method name="isHierarchical()Z"/>
+ <method name="obtain(IIZ)Landroid/view/accessibility/AccessibilityNodeInfo$CollectionInfo;"/>
+ <method name="obtain(IIZI)Landroid/view/accessibility/AccessibilityNodeInfo$CollectionInfo;" since="21"/>
+ <field name="SELECTION_MODE_MULTIPLE" since="21"/>
+ <field name="SELECTION_MODE_NONE" since="21"/>
+ <field name="SELECTION_MODE_SINGLE" since="21"/>
+ </class>
+ <class name="android/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getColumnIndex()I"/>
+ <method name="getColumnSpan()I"/>
+ <method name="getRowIndex()I"/>
+ <method name="getRowSpan()I"/>
+ <method name="isHeading()Z"/>
+ <method name="isSelected()Z" since="21"/>
+ <method name="obtain(IIIIZ)Landroid/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo;"/>
+ <method name="obtain(IIIIZZ)Landroid/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo;" since="21"/>
+ </class>
+ <class name="android/view/accessibility/AccessibilityNodeInfo$RangeInfo" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCurrent()F"/>
+ <method name="getMax()F"/>
+ <method name="getMin()F"/>
+ <method name="getType()I"/>
+ <method name="obtain(IFFF)Landroid/view/accessibility/AccessibilityNodeInfo$RangeInfo;"/>
+ <field name="RANGE_TYPE_FLOAT"/>
+ <field name="RANGE_TYPE_INT"/>
+ <field name="RANGE_TYPE_PERCENT"/>
+ </class>
+ <class name="android/view/accessibility/AccessibilityNodeProvider" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addExtraDataToAccessibilityNodeInfo(ILandroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/String;Landroid/os/Bundle;)V" since="26"/>
+ <method name="createAccessibilityNodeInfo(I)Landroid/view/accessibility/AccessibilityNodeInfo;"/>
+ <method name="findAccessibilityNodeInfosByText(Ljava/lang/String;I)Ljava/util/List;"/>
+ <method name="findFocus(I)Landroid/view/accessibility/AccessibilityNodeInfo;" since="19"/>
+ <method name="performAction(IILandroid/os/Bundle;)Z"/>
+ <field name="HOST_VIEW_ID" since="21"/>
+ </class>
+ <class name="android/view/accessibility/AccessibilityRecord" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAddedCount()I"/>
+ <method name="getBeforeText()Ljava/lang/CharSequence;"/>
+ <method name="getClassName()Ljava/lang/CharSequence;"/>
+ <method name="getContentDescription()Ljava/lang/CharSequence;"/>
+ <method name="getCurrentItemIndex()I"/>
+ <method name="getFromIndex()I"/>
+ <method name="getItemCount()I"/>
+ <method name="getMaxScrollX()I" since="15"/>
+ <method name="getMaxScrollY()I" since="15"/>
+ <method name="getParcelableData()Landroid/os/Parcelable;"/>
+ <method name="getRemovedCount()I"/>
+ <method name="getScrollX()I"/>
+ <method name="getScrollY()I"/>
+ <method name="getSource()Landroid/view/accessibility/AccessibilityNodeInfo;"/>
+ <method name="getText()Ljava/util/List;"/>
+ <method name="getToIndex()I"/>
+ <method name="getWindowId()I"/>
+ <method name="isChecked()Z"/>
+ <method name="isEnabled()Z"/>
+ <method name="isFullScreen()Z"/>
+ <method name="isPassword()Z"/>
+ <method name="isScrollable()Z"/>
+ <method name="obtain()Landroid/view/accessibility/AccessibilityRecord;"/>
+ <method name="obtain(Landroid/view/accessibility/AccessibilityRecord;)Landroid/view/accessibility/AccessibilityRecord;"/>
+ <method name="recycle()V"/>
+ <method name="setAddedCount(I)V"/>
+ <method name="setBeforeText(Ljava/lang/CharSequence;)V"/>
+ <method name="setChecked(Z)V"/>
+ <method name="setClassName(Ljava/lang/CharSequence;)V"/>
+ <method name="setContentDescription(Ljava/lang/CharSequence;)V"/>
+ <method name="setCurrentItemIndex(I)V"/>
+ <method name="setEnabled(Z)V"/>
+ <method name="setFromIndex(I)V"/>
+ <method name="setFullScreen(Z)V"/>
+ <method name="setItemCount(I)V"/>
+ <method name="setMaxScrollX(I)V" since="15"/>
+ <method name="setMaxScrollY(I)V" since="15"/>
+ <method name="setParcelableData(Landroid/os/Parcelable;)V"/>
+ <method name="setPassword(Z)V"/>
+ <method name="setRemovedCount(I)V"/>
+ <method name="setScrollX(I)V"/>
+ <method name="setScrollY(I)V"/>
+ <method name="setScrollable(Z)V"/>
+ <method name="setSource(Landroid/view/View;)V"/>
+ <method name="setSource(Landroid/view/View;I)V" since="16"/>
+ <method name="setToIndex(I)V"/>
+ </class>
+ <class name="android/view/accessibility/AccessibilityWindowInfo" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAnchor()Landroid/view/accessibility/AccessibilityNodeInfo;" since="24"/>
+ <method name="getBoundsInScreen(Landroid/graphics/Rect;)V"/>
+ <method name="getChild(I)Landroid/view/accessibility/AccessibilityWindowInfo;"/>
+ <method name="getChildCount()I"/>
+ <method name="getId()I"/>
+ <method name="getLayer()I"/>
+ <method name="getParent()Landroid/view/accessibility/AccessibilityWindowInfo;"/>
+ <method name="getRoot()Landroid/view/accessibility/AccessibilityNodeInfo;"/>
+ <method name="getTitle()Ljava/lang/CharSequence;" since="24"/>
+ <method name="getType()I"/>
+ <method name="isAccessibilityFocused()Z"/>
+ <method name="isActive()Z"/>
+ <method name="isFocused()Z"/>
+ <method name="isInPictureInPictureMode()Z" since="26"/>
+ <method name="obtain()Landroid/view/accessibility/AccessibilityWindowInfo;"/>
+ <method name="obtain(Landroid/view/accessibility/AccessibilityWindowInfo;)Landroid/view/accessibility/AccessibilityWindowInfo;"/>
+ <method name="recycle()V"/>
+ <field name="CREATOR"/>
+ <field name="TYPE_ACCESSIBILITY_OVERLAY" since="22"/>
+ <field name="TYPE_APPLICATION"/>
+ <field name="TYPE_INPUT_METHOD"/>
+ <field name="TYPE_SPLIT_SCREEN_DIVIDER" since="24"/>
+ <field name="TYPE_SYSTEM"/>
+ </class>
+ <class name="android/view/accessibility/CaptioningManager" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addCaptioningChangeListener(Landroid/view/accessibility/CaptioningManager$CaptioningChangeListener;)V"/>
+ <method name="getFontScale()F"/>
+ <method name="getLocale()Ljava/util/Locale;"/>
+ <method name="getUserStyle()Landroid/view/accessibility/CaptioningManager$CaptionStyle;"/>
+ <method name="isEnabled()Z"/>
+ <method name="removeCaptioningChangeListener(Landroid/view/accessibility/CaptioningManager$CaptioningChangeListener;)V"/>
+ </class>
+ <class name="android/view/accessibility/CaptioningManager$CaptionStyle" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getTypeface()Landroid/graphics/Typeface;"/>
+ <method name="hasBackgroundColor()Z" since="21"/>
+ <method name="hasEdgeColor()Z" since="21"/>
+ <method name="hasEdgeType()Z" since="21"/>
+ <method name="hasForegroundColor()Z" since="21"/>
+ <method name="hasWindowColor()Z" since="21"/>
+ <field name="EDGE_TYPE_DEPRESSED" since="21"/>
+ <field name="EDGE_TYPE_DROP_SHADOW"/>
+ <field name="EDGE_TYPE_NONE"/>
+ <field name="EDGE_TYPE_OUTLINE"/>
+ <field name="EDGE_TYPE_RAISED" since="21"/>
+ <field name="EDGE_TYPE_UNSPECIFIED" since="21"/>
+ <field name="backgroundColor"/>
+ <field name="edgeColor"/>
+ <field name="edgeType"/>
+ <field name="foregroundColor"/>
+ <field name="windowColor" since="21"/>
+ </class>
+ <class name="android/view/accessibility/CaptioningManager$CaptioningChangeListener" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onEnabledChanged(Z)V"/>
+ <method name="onFontScaleChanged(F)V"/>
+ <method name="onLocaleChanged(Ljava/util/Locale;)V"/>
+ <method name="onUserStyleChanged(Landroid/view/accessibility/CaptioningManager$CaptionStyle;)V"/>
+ </class>
+ <class name="android/view/animation/AccelerateDecelerateInterpolator" since="1">
+ <extends name="android/view/animation/BaseInterpolator" since="22"/>
+ <extends name="java/lang/Object" removed="22"/>
+ <implements name="android/view/animation/Interpolator" removed="22"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ </class>
+ <class name="android/view/animation/AccelerateInterpolator" since="1">
+ <extends name="android/view/animation/BaseInterpolator" since="22"/>
+ <extends name="java/lang/Object" removed="22"/>
+ <implements name="android/view/animation/Interpolator" removed="22"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(F)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ </class>
+ <class name="android/view/animation/AlphaAnimation" since="1">
+ <extends name="android/view/animation/Animation"/>
+ <method name="&lt;init>(FF)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ </class>
+ <class name="android/view/animation/Animation" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable" since="3"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="applyTransformation(FLandroid/view/animation/Transformation;)V"/>
+ <method name="cancel()V" since="8"/>
+ <method name="clone()Landroid/view/animation/Animation;" since="3"/>
+ <method name="computeDurationHint()J" since="3"/>
+ <method name="ensureInterpolator()V"/>
+ <method name="getBackgroundColor()I" since="12"/>
+ <method name="getDetachWallpaper()Z" since="5"/>
+ <method name="getDuration()J"/>
+ <method name="getFillAfter()Z"/>
+ <method name="getFillBefore()Z"/>
+ <method name="getInterpolator()Landroid/view/animation/Interpolator;"/>
+ <method name="getRepeatCount()I"/>
+ <method name="getRepeatMode()I"/>
+ <method name="getScaleFactor()F" since="11"/>
+ <method name="getStartOffset()J"/>
+ <method name="getStartTime()J"/>
+ <method name="getTransformation(JLandroid/view/animation/Transformation;)Z"/>
+ <method name="getTransformation(JLandroid/view/animation/Transformation;F)Z" since="11"/>
+ <method name="getZAdjustment()I"/>
+ <method name="hasEnded()Z"/>
+ <method name="hasStarted()Z"/>
+ <method name="initialize(IIII)V"/>
+ <method name="isFillEnabled()Z" since="3"/>
+ <method name="isInitialized()Z"/>
+ <method name="reset()V"/>
+ <method name="resolveSize(IFII)F"/>
+ <method name="restrictDuration(J)V"/>
+ <method name="scaleCurrentDuration(F)V"/>
+ <method name="setAnimationListener(Landroid/view/animation/Animation$AnimationListener;)V"/>
+ <method name="setBackgroundColor(I)V" since="12"/>
+ <method name="setDetachWallpaper(Z)V" since="5"/>
+ <method name="setDuration(J)V"/>
+ <method name="setFillAfter(Z)V"/>
+ <method name="setFillBefore(Z)V"/>
+ <method name="setFillEnabled(Z)V" since="3"/>
+ <method name="setInterpolator(Landroid/content/Context;I)V"/>
+ <method name="setInterpolator(Landroid/view/animation/Interpolator;)V"/>
+ <method name="setRepeatCount(I)V"/>
+ <method name="setRepeatMode(I)V"/>
+ <method name="setStartOffset(J)V"/>
+ <method name="setStartTime(J)V"/>
+ <method name="setZAdjustment(I)V"/>
+ <method name="start()V"/>
+ <method name="startNow()V"/>
+ <method name="willChangeBounds()Z"/>
+ <method name="willChangeTransformationMatrix()Z"/>
+ <field name="ABSOLUTE"/>
+ <field name="INFINITE"/>
+ <field name="RELATIVE_TO_PARENT"/>
+ <field name="RELATIVE_TO_SELF"/>
+ <field name="RESTART"/>
+ <field name="REVERSE"/>
+ <field name="START_ON_FIRST_FRAME"/>
+ <field name="ZORDER_BOTTOM"/>
+ <field name="ZORDER_NORMAL"/>
+ <field name="ZORDER_TOP"/>
+ </class>
+ <class name="android/view/animation/Animation$AnimationListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onAnimationEnd(Landroid/view/animation/Animation;)V"/>
+ <method name="onAnimationRepeat(Landroid/view/animation/Animation;)V"/>
+ <method name="onAnimationStart(Landroid/view/animation/Animation;)V"/>
+ </class>
+ <class name="android/view/animation/Animation$Description" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="type"/>
+ <field name="value"/>
+ </class>
+ <class name="android/view/animation/AnimationSet" since="1">
+ <extends name="android/view/animation/Animation"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Z)V"/>
+ <method name="addAnimation(Landroid/view/animation/Animation;)V"/>
+ <method name="clone()Landroid/view/animation/AnimationSet;" since="3"/>
+ <method name="getAnimations()Ljava/util/List;"/>
+ </class>
+ <class name="android/view/animation/AnimationUtils" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="currentAnimationTimeMillis()J"/>
+ <method name="loadAnimation(Landroid/content/Context;I)Landroid/view/animation/Animation;"/>
+ <method name="loadInterpolator(Landroid/content/Context;I)Landroid/view/animation/Interpolator;"/>
+ <method name="loadLayoutAnimation(Landroid/content/Context;I)Landroid/view/animation/LayoutAnimationController;"/>
+ <method name="makeInAnimation(Landroid/content/Context;Z)Landroid/view/animation/Animation;"/>
+ <method name="makeInChildBottomAnimation(Landroid/content/Context;)Landroid/view/animation/Animation;"/>
+ <method name="makeOutAnimation(Landroid/content/Context;Z)Landroid/view/animation/Animation;"/>
+ </class>
+ <class name="android/view/animation/AnticipateInterpolator" since="4">
+ <extends name="android/view/animation/BaseInterpolator" since="22"/>
+ <extends name="java/lang/Object" removed="22"/>
+ <implements name="android/view/animation/Interpolator" removed="22"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(F)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ </class>
+ <class name="android/view/animation/AnticipateOvershootInterpolator" since="4">
+ <extends name="android/view/animation/BaseInterpolator" since="22"/>
+ <extends name="java/lang/Object" removed="22"/>
+ <implements name="android/view/animation/Interpolator" removed="22"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(F)V"/>
+ <method name="&lt;init>(FF)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ </class>
+ <class name="android/view/animation/BaseInterpolator" since="22">
+ <extends name="java/lang/Object"/>
+ <implements name="android/view/animation/Interpolator"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/view/animation/BounceInterpolator" since="4">
+ <extends name="android/view/animation/BaseInterpolator" since="22"/>
+ <extends name="java/lang/Object" removed="22"/>
+ <implements name="android/view/animation/Interpolator" removed="22"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ </class>
+ <class name="android/view/animation/CycleInterpolator" since="1">
+ <extends name="android/view/animation/BaseInterpolator" since="22"/>
+ <extends name="java/lang/Object" removed="22"/>
+ <implements name="android/view/animation/Interpolator" removed="22"/>
+ <method name="&lt;init>(F)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ </class>
+ <class name="android/view/animation/DecelerateInterpolator" since="1">
+ <extends name="android/view/animation/BaseInterpolator" since="22"/>
+ <extends name="java/lang/Object" removed="22"/>
+ <implements name="android/view/animation/Interpolator" removed="22"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(F)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ </class>
+ <class name="android/view/animation/GridLayoutAnimationController" since="1">
+ <extends name="android/view/animation/LayoutAnimationController"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/view/animation/Animation;)V"/>
+ <method name="&lt;init>(Landroid/view/animation/Animation;FF)V"/>
+ <method name="getColumnDelay()F"/>
+ <method name="getDirection()I"/>
+ <method name="getDirectionPriority()I"/>
+ <method name="getRowDelay()F"/>
+ <method name="setColumnDelay(F)V"/>
+ <method name="setDirection(I)V"/>
+ <method name="setDirectionPriority(I)V"/>
+ <method name="setRowDelay(F)V"/>
+ <field name="DIRECTION_BOTTOM_TO_TOP"/>
+ <field name="DIRECTION_HORIZONTAL_MASK"/>
+ <field name="DIRECTION_LEFT_TO_RIGHT"/>
+ <field name="DIRECTION_RIGHT_TO_LEFT"/>
+ <field name="DIRECTION_TOP_TO_BOTTOM"/>
+ <field name="DIRECTION_VERTICAL_MASK"/>
+ <field name="PRIORITY_COLUMN"/>
+ <field name="PRIORITY_NONE"/>
+ <field name="PRIORITY_ROW"/>
+ </class>
+ <class name="android/view/animation/GridLayoutAnimationController$AnimationParameters" since="1">
+ <extends name="android/view/animation/LayoutAnimationController$AnimationParameters"/>
+ <method name="&lt;init>()V"/>
+ <field name="column"/>
+ <field name="columnsCount"/>
+ <field name="row"/>
+ <field name="rowsCount"/>
+ </class>
+ <class name="android/view/animation/Interpolator" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/animation/TimeInterpolator" since="11"/>
+ <method name="getInterpolation(F)F" removed="11"/>
+ </class>
+ <class name="android/view/animation/LayoutAnimationController" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/view/animation/Animation;)V"/>
+ <method name="&lt;init>(Landroid/view/animation/Animation;F)V"/>
+ <method name="getAnimation()Landroid/view/animation/Animation;"/>
+ <method name="getAnimationForView(Landroid/view/View;)Landroid/view/animation/Animation;"/>
+ <method name="getDelay()F"/>
+ <method name="getDelayForView(Landroid/view/View;)J"/>
+ <method name="getInterpolator()Landroid/view/animation/Interpolator;"/>
+ <method name="getOrder()I"/>
+ <method name="getTransformedIndex(Landroid/view/animation/LayoutAnimationController$AnimationParameters;)I"/>
+ <method name="isDone()Z"/>
+ <method name="setAnimation(Landroid/content/Context;I)V"/>
+ <method name="setAnimation(Landroid/view/animation/Animation;)V"/>
+ <method name="setDelay(F)V"/>
+ <method name="setInterpolator(Landroid/content/Context;I)V"/>
+ <method name="setInterpolator(Landroid/view/animation/Interpolator;)V"/>
+ <method name="setOrder(I)V"/>
+ <method name="start()V"/>
+ <method name="willOverlap()Z"/>
+ <field name="ORDER_NORMAL"/>
+ <field name="ORDER_RANDOM"/>
+ <field name="ORDER_REVERSE"/>
+ <field name="mAnimation"/>
+ <field name="mInterpolator"/>
+ <field name="mRandomizer"/>
+ </class>
+ <class name="android/view/animation/LayoutAnimationController$AnimationParameters" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="count"/>
+ <field name="index"/>
+ </class>
+ <class name="android/view/animation/LinearInterpolator" since="1">
+ <extends name="android/view/animation/BaseInterpolator" since="22"/>
+ <extends name="java/lang/Object" removed="22"/>
+ <implements name="android/view/animation/Interpolator" removed="22"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ </class>
+ <class name="android/view/animation/OvershootInterpolator" since="4">
+ <extends name="android/view/animation/BaseInterpolator" since="22"/>
+ <extends name="java/lang/Object" removed="22"/>
+ <implements name="android/view/animation/Interpolator" removed="22"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(F)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ </class>
+ <class name="android/view/animation/PathInterpolator" since="21">
+ <extends name="android/view/animation/BaseInterpolator" since="22"/>
+ <extends name="java/lang/Object" removed="22"/>
+ <implements name="android/view/animation/Interpolator" removed="22"/>
+ <method name="&lt;init>(FF)V"/>
+ <method name="&lt;init>(FFFF)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/graphics/Path;)V"/>
+ </class>
+ <class name="android/view/animation/RotateAnimation" since="1">
+ <extends name="android/view/animation/Animation"/>
+ <method name="&lt;init>(FF)V"/>
+ <method name="&lt;init>(FFFF)V"/>
+ <method name="&lt;init>(FFIFIF)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ </class>
+ <class name="android/view/animation/ScaleAnimation" since="1">
+ <extends name="android/view/animation/Animation"/>
+ <method name="&lt;init>(FFFF)V"/>
+ <method name="&lt;init>(FFFFFF)V"/>
+ <method name="&lt;init>(FFFFIFIF)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ </class>
+ <class name="android/view/animation/Transformation" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="clear()V"/>
+ <method name="compose(Landroid/view/animation/Transformation;)V"/>
+ <method name="getAlpha()F"/>
+ <method name="getMatrix()Landroid/graphics/Matrix;"/>
+ <method name="getTransformationType()I"/>
+ <method name="set(Landroid/view/animation/Transformation;)V"/>
+ <method name="setAlpha(F)V"/>
+ <method name="setTransformationType(I)V"/>
+ <method name="toShortString()Ljava/lang/String;" since="3"/>
+ <field name="TYPE_ALPHA"/>
+ <field name="TYPE_BOTH"/>
+ <field name="TYPE_IDENTITY"/>
+ <field name="TYPE_MATRIX"/>
+ <field name="mAlpha"/>
+ <field name="mMatrix"/>
+ <field name="mTransformationType"/>
+ </class>
+ <class name="android/view/animation/TranslateAnimation" since="1">
+ <extends name="android/view/animation/Animation"/>
+ <method name="&lt;init>(FFFF)V"/>
+ <method name="&lt;init>(IFIFIFIF)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ </class>
+ <class name="android/view/autofill/AutofillId" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/view/autofill/AutofillManager" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="cancel()V"/>
+ <method name="commit()V"/>
+ <method name="disableAutofillServices()V"/>
+ <method name="hasEnabledAutofillServices()Z"/>
+ <method name="isAutofillSupported()Z"/>
+ <method name="isEnabled()Z"/>
+ <method name="notifyValueChanged(Landroid/view/View;)V"/>
+ <method name="notifyValueChanged(Landroid/view/View;ILandroid/view/autofill/AutofillValue;)V"/>
+ <method name="notifyViewEntered(Landroid/view/View;)V"/>
+ <method name="notifyViewEntered(Landroid/view/View;ILandroid/graphics/Rect;)V"/>
+ <method name="notifyViewExited(Landroid/view/View;)V"/>
+ <method name="notifyViewExited(Landroid/view/View;I)V"/>
+ <method name="registerCallback(Landroid/view/autofill/AutofillManager$AutofillCallback;)V"/>
+ <method name="requestAutofill(Landroid/view/View;)V"/>
+ <method name="requestAutofill(Landroid/view/View;ILandroid/graphics/Rect;)V"/>
+ <method name="unregisterCallback(Landroid/view/autofill/AutofillManager$AutofillCallback;)V"/>
+ <field name="EXTRA_ASSIST_STRUCTURE"/>
+ <field name="EXTRA_AUTHENTICATION_RESULT"/>
+ <field name="EXTRA_CLIENT_STATE"/>
+ </class>
+ <class name="android/view/autofill/AutofillManager$AutofillCallback" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onAutofillEvent(Landroid/view/View;I)V"/>
+ <method name="onAutofillEvent(Landroid/view/View;II)V"/>
+ <field name="EVENT_INPUT_HIDDEN"/>
+ <field name="EVENT_INPUT_SHOWN"/>
+ <field name="EVENT_INPUT_UNAVAILABLE"/>
+ </class>
+ <class name="android/view/autofill/AutofillValue" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="forDate(J)Landroid/view/autofill/AutofillValue;"/>
+ <method name="forList(I)Landroid/view/autofill/AutofillValue;"/>
+ <method name="forText(Ljava/lang/CharSequence;)Landroid/view/autofill/AutofillValue;"/>
+ <method name="forToggle(Z)Landroid/view/autofill/AutofillValue;"/>
+ <method name="getDateValue()J"/>
+ <method name="getListValue()I"/>
+ <method name="getTextValue()Ljava/lang/CharSequence;"/>
+ <method name="getToggleValue()Z"/>
+ <method name="isDate()Z"/>
+ <method name="isList()Z"/>
+ <method name="isText()Z"/>
+ <method name="isToggle()Z"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/view/inputmethod/BaseInputConnection" since="3">
+ <extends name="java/lang/Object"/>
+ <implements name="android/view/inputmethod/InputConnection"/>
+ <method name="&lt;init>(Landroid/view/View;Z)V"/>
+ <method name="getComposingSpanEnd(Landroid/text/Spannable;)I"/>
+ <method name="getComposingSpanStart(Landroid/text/Spannable;)I"/>
+ <method name="getEditable()Landroid/text/Editable;"/>
+ <method name="removeComposingSpans(Landroid/text/Spannable;)V"/>
+ <method name="setComposingSpans(Landroid/text/Spannable;)V"/>
+ </class>
+ <class name="android/view/inputmethod/CompletionInfo" since="3">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(JILjava/lang/CharSequence;)V"/>
+ <method name="&lt;init>(JILjava/lang/CharSequence;Ljava/lang/CharSequence;)V"/>
+ <method name="getId()J"/>
+ <method name="getLabel()Ljava/lang/CharSequence;"/>
+ <method name="getPosition()I"/>
+ <method name="getText()Ljava/lang/CharSequence;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/view/inputmethod/CorrectionInfo" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(ILjava/lang/CharSequence;Ljava/lang/CharSequence;)V"/>
+ <method name="getNewText()Ljava/lang/CharSequence;"/>
+ <method name="getOffset()I"/>
+ <method name="getOldText()Ljava/lang/CharSequence;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/view/inputmethod/CursorAnchorInfo" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="getCharacterBounds(I)Landroid/graphics/RectF;"/>
+ <method name="getCharacterBoundsFlags(I)I"/>
+ <method name="getComposingText()Ljava/lang/CharSequence;"/>
+ <method name="getComposingTextStart()I"/>
+ <method name="getInsertionMarkerBaseline()F"/>
+ <method name="getInsertionMarkerBottom()F"/>
+ <method name="getInsertionMarkerFlags()I"/>
+ <method name="getInsertionMarkerHorizontal()F"/>
+ <method name="getInsertionMarkerTop()F"/>
+ <method name="getMatrix()Landroid/graphics/Matrix;"/>
+ <method name="getSelectionEnd()I"/>
+ <method name="getSelectionStart()I"/>
+ <field name="CREATOR"/>
+ <field name="FLAG_HAS_INVISIBLE_REGION"/>
+ <field name="FLAG_HAS_VISIBLE_REGION"/>
+ <field name="FLAG_IS_RTL"/>
+ </class>
+ <class name="android/view/inputmethod/CursorAnchorInfo$Builder" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addCharacterBounds(IFFFFI)Landroid/view/inputmethod/CursorAnchorInfo$Builder;"/>
+ <method name="build()Landroid/view/inputmethod/CursorAnchorInfo;"/>
+ <method name="reset()V"/>
+ <method name="setComposingText(ILjava/lang/CharSequence;)Landroid/view/inputmethod/CursorAnchorInfo$Builder;"/>
+ <method name="setInsertionMarkerLocation(FFFFI)Landroid/view/inputmethod/CursorAnchorInfo$Builder;"/>
+ <method name="setMatrix(Landroid/graphics/Matrix;)Landroid/view/inputmethod/CursorAnchorInfo$Builder;"/>
+ <method name="setSelectionRange(II)Landroid/view/inputmethod/CursorAnchorInfo$Builder;"/>
+ </class>
+ <class name="android/view/inputmethod/EditorInfo" since="3">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <implements name="android/text/InputType"/>
+ <method name="&lt;init>()V"/>
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V"/>
+ <method name="makeCompatible(I)V" since="11"/>
+ <field name="CREATOR"/>
+ <field name="IME_ACTION_DONE"/>
+ <field name="IME_ACTION_GO"/>
+ <field name="IME_ACTION_NEXT"/>
+ <field name="IME_ACTION_NONE"/>
+ <field name="IME_ACTION_PREVIOUS" since="11"/>
+ <field name="IME_ACTION_SEARCH"/>
+ <field name="IME_ACTION_SEND"/>
+ <field name="IME_ACTION_UNSPECIFIED"/>
+ <field name="IME_FLAG_FORCE_ASCII" since="16"/>
+ <field name="IME_FLAG_NAVIGATE_NEXT" since="11"/>
+ <field name="IME_FLAG_NAVIGATE_PREVIOUS" since="11"/>
+ <field name="IME_FLAG_NO_ACCESSORY_ACTION"/>
+ <field name="IME_FLAG_NO_ENTER_ACTION"/>
+ <field name="IME_FLAG_NO_EXTRACT_UI"/>
+ <field name="IME_FLAG_NO_FULLSCREEN" since="11"/>
+ <field name="IME_FLAG_NO_PERSONALIZED_LEARNING" since="26"/>
+ <field name="IME_MASK_ACTION"/>
+ <field name="IME_NULL"/>
+ <field name="actionId"/>
+ <field name="actionLabel"/>
+ <field name="contentMimeTypes" since="25"/>
+ <field name="extras"/>
+ <field name="fieldId"/>
+ <field name="fieldName"/>
+ <field name="hintLocales" since="24"/>
+ <field name="hintText"/>
+ <field name="imeOptions"/>
+ <field name="initialCapsMode"/>
+ <field name="initialSelEnd"/>
+ <field name="initialSelStart"/>
+ <field name="inputType"/>
+ <field name="label"/>
+ <field name="packageName"/>
+ <field name="privateImeOptions"/>
+ </class>
+ <class name="android/view/inputmethod/ExtractedText" since="3">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <field name="CREATOR"/>
+ <field name="FLAG_SELECTING"/>
+ <field name="FLAG_SINGLE_LINE"/>
+ <field name="flags"/>
+ <field name="partialEndOffset"/>
+ <field name="partialStartOffset"/>
+ <field name="selectionEnd"/>
+ <field name="selectionStart"/>
+ <field name="startOffset"/>
+ <field name="text"/>
+ </class>
+ <class name="android/view/inputmethod/ExtractedTextRequest" since="3">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <field name="CREATOR"/>
+ <field name="flags"/>
+ <field name="hintMaxChars"/>
+ <field name="hintMaxLines"/>
+ <field name="token"/>
+ </class>
+ <class name="android/view/inputmethod/InputBinding" since="3">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/view/inputmethod/InputConnection;Landroid/os/IBinder;II)V"/>
+ <method name="&lt;init>(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/InputBinding;)V"/>
+ <method name="getConnection()Landroid/view/inputmethod/InputConnection;"/>
+ <method name="getConnectionToken()Landroid/os/IBinder;"/>
+ <method name="getPid()I"/>
+ <method name="getUid()I"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/view/inputmethod/InputConnection" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="beginBatchEdit()Z"/>
+ <method name="clearMetaKeyStates(I)Z"/>
+ <method name="closeConnection()V" since="24"/>
+ <method name="commitCompletion(Landroid/view/inputmethod/CompletionInfo;)Z"/>
+ <method name="commitContent(Landroid/view/inputmethod/InputContentInfo;ILandroid/os/Bundle;)Z" since="25"/>
+ <method name="commitCorrection(Landroid/view/inputmethod/CorrectionInfo;)Z" since="11"/>
+ <method name="commitText(Ljava/lang/CharSequence;I)Z"/>
+ <method name="deleteSurroundingText(II)Z"/>
+ <method name="deleteSurroundingTextInCodePoints(II)Z" since="24"/>
+ <method name="endBatchEdit()Z"/>
+ <method name="finishComposingText()Z"/>
+ <method name="getCursorCapsMode(I)I"/>
+ <method name="getExtractedText(Landroid/view/inputmethod/ExtractedTextRequest;I)Landroid/view/inputmethod/ExtractedText;"/>
+ <method name="getHandler()Landroid/os/Handler;" since="24"/>
+ <method name="getSelectedText(I)Ljava/lang/CharSequence;" since="9"/>
+ <method name="getTextAfterCursor(II)Ljava/lang/CharSequence;"/>
+ <method name="getTextBeforeCursor(II)Ljava/lang/CharSequence;"/>
+ <method name="performContextMenuAction(I)Z"/>
+ <method name="performEditorAction(I)Z"/>
+ <method name="performPrivateCommand(Ljava/lang/String;Landroid/os/Bundle;)Z"/>
+ <method name="reportFullscreenMode(Z)Z"/>
+ <method name="requestCursorUpdates(I)Z" since="21"/>
+ <method name="sendKeyEvent(Landroid/view/KeyEvent;)Z"/>
+ <method name="setComposingRegion(II)Z" since="9"/>
+ <method name="setComposingText(Ljava/lang/CharSequence;I)Z"/>
+ <method name="setSelection(II)Z"/>
+ <field name="CURSOR_UPDATE_IMMEDIATE" since="21"/>
+ <field name="CURSOR_UPDATE_MONITOR" since="21"/>
+ <field name="GET_EXTRACTED_TEXT_MONITOR"/>
+ <field name="GET_TEXT_WITH_STYLES"/>
+ <field name="INPUT_CONTENT_GRANT_READ_URI_PERMISSION" since="25"/>
+ </class>
+ <class name="android/view/inputmethod/InputConnectionWrapper" since="3">
+ <extends name="java/lang/Object"/>
+ <implements name="android/view/inputmethod/InputConnection"/>
+ <method name="&lt;init>(Landroid/view/inputmethod/InputConnection;Z)V"/>
+ <method name="setTarget(Landroid/view/inputmethod/InputConnection;)V"/>
+ </class>
+ <class name="android/view/inputmethod/InputContentInfo" since="25">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/net/Uri;Landroid/content/ClipDescription;)V"/>
+ <method name="&lt;init>(Landroid/net/Uri;Landroid/content/ClipDescription;Landroid/net/Uri;)V"/>
+ <method name="getContentUri()Landroid/net/Uri;"/>
+ <method name="getDescription()Landroid/content/ClipDescription;"/>
+ <method name="getLinkUri()Landroid/net/Uri;"/>
+ <method name="releasePermission()V"/>
+ <method name="requestPermission()V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/view/inputmethod/InputMethod" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="attachToken(Landroid/os/IBinder;)V"/>
+ <method name="bindInput(Landroid/view/inputmethod/InputBinding;)V"/>
+ <method name="changeInputMethodSubtype(Landroid/view/inputmethod/InputMethodSubtype;)V" since="11"/>
+ <method name="createSession(Landroid/view/inputmethod/InputMethod$SessionCallback;)V"/>
+ <method name="hideSoftInput(ILandroid/os/ResultReceiver;)V"/>
+ <method name="restartInput(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;)V"/>
+ <method name="revokeSession(Landroid/view/inputmethod/InputMethodSession;)V"/>
+ <method name="setSessionEnabled(Landroid/view/inputmethod/InputMethodSession;Z)V"/>
+ <method name="showSoftInput(ILandroid/os/ResultReceiver;)V"/>
+ <method name="startInput(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;)V"/>
+ <method name="unbindInput()V"/>
+ <field name="SERVICE_INTERFACE"/>
+ <field name="SERVICE_META_DATA"/>
+ <field name="SHOW_EXPLICIT"/>
+ <field name="SHOW_FORCED"/>
+ </class>
+ <class name="android/view/inputmethod/InputMethod$SessionCallback" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="sessionCreated(Landroid/view/inputmethod/InputMethodSession;)V"/>
+ </class>
+ <class name="android/view/inputmethod/InputMethodInfo" since="3">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/content/pm/ResolveInfo;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/CharSequence;Ljava/lang/String;)V"/>
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V"/>
+ <method name="getComponent()Landroid/content/ComponentName;"/>
+ <method name="getId()Ljava/lang/String;"/>
+ <method name="getIsDefaultResourceId()I"/>
+ <method name="getPackageName()Ljava/lang/String;"/>
+ <method name="getServiceInfo()Landroid/content/pm/ServiceInfo;"/>
+ <method name="getServiceName()Ljava/lang/String;"/>
+ <method name="getSettingsActivity()Ljava/lang/String;"/>
+ <method name="getSubtypeAt(I)Landroid/view/inputmethod/InputMethodSubtype;" since="11"/>
+ <method name="getSubtypeCount()I" since="11"/>
+ <method name="loadIcon(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;"/>
+ <method name="loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/view/inputmethod/InputMethodManager" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="dispatchKeyEventFromInputMethod(Landroid/view/View;Landroid/view/KeyEvent;)V" since="24"/>
+ <method name="displayCompletions(Landroid/view/View;[Landroid/view/inputmethod/CompletionInfo;)V"/>
+ <method name="getCurrentInputMethodSubtype()Landroid/view/inputmethod/InputMethodSubtype;" since="11"/>
+ <method name="getEnabledInputMethodList()Ljava/util/List;"/>
+ <method name="getEnabledInputMethodSubtypeList(Landroid/view/inputmethod/InputMethodInfo;Z)Ljava/util/List;" since="11"/>
+ <method name="getInputMethodList()Ljava/util/List;"/>
+ <method name="getLastInputMethodSubtype()Landroid/view/inputmethod/InputMethodSubtype;" since="14"/>
+ <method name="getShortcutInputMethodsAndSubtypes()Ljava/util/Map;" since="11"/>
+ <method name="hideSoftInputFromInputMethod(Landroid/os/IBinder;I)V"/>
+ <method name="hideSoftInputFromWindow(Landroid/os/IBinder;I)Z"/>
+ <method name="hideSoftInputFromWindow(Landroid/os/IBinder;ILandroid/os/ResultReceiver;)Z"/>
+ <method name="hideStatusIcon(Landroid/os/IBinder;)V"/>
+ <method name="isAcceptingText()Z"/>
+ <method name="isActive()Z"/>
+ <method name="isActive(Landroid/view/View;)Z"/>
+ <method name="isFullscreenMode()Z"/>
+ <method name="isWatchingCursor(Landroid/view/View;)Z" deprecated="21"/>
+ <method name="restartInput(Landroid/view/View;)V"/>
+ <method name="sendAppPrivateCommand(Landroid/view/View;Ljava/lang/String;Landroid/os/Bundle;)V"/>
+ <method name="setAdditionalInputMethodSubtypes(Ljava/lang/String;[Landroid/view/inputmethod/InputMethodSubtype;)V" since="14"/>
+ <method name="setCurrentInputMethodSubtype(Landroid/view/inputmethod/InputMethodSubtype;)Z" since="11"/>
+ <method name="setInputMethod(Landroid/os/IBinder;Ljava/lang/String;)V"/>
+ <method name="setInputMethodAndSubtype(Landroid/os/IBinder;Ljava/lang/String;Landroid/view/inputmethod/InputMethodSubtype;)V" since="11"/>
+ <method name="shouldOfferSwitchingToNextInputMethod(Landroid/os/IBinder;)Z" since="19"/>
+ <method name="showInputMethodAndSubtypeEnabler(Ljava/lang/String;)V" since="11"/>
+ <method name="showInputMethodPicker()V"/>
+ <method name="showSoftInput(Landroid/view/View;I)Z"/>
+ <method name="showSoftInput(Landroid/view/View;ILandroid/os/ResultReceiver;)Z"/>
+ <method name="showSoftInputFromInputMethod(Landroid/os/IBinder;I)V"/>
+ <method name="showStatusIcon(Landroid/os/IBinder;Ljava/lang/String;I)V"/>
+ <method name="switchToLastInputMethod(Landroid/os/IBinder;)Z" since="11"/>
+ <method name="switchToNextInputMethod(Landroid/os/IBinder;Z)Z" since="16"/>
+ <method name="toggleSoftInput(II)V"/>
+ <method name="toggleSoftInputFromWindow(Landroid/os/IBinder;II)V"/>
+ <method name="updateCursor(Landroid/view/View;IIII)V" deprecated="21"/>
+ <method name="updateCursorAnchorInfo(Landroid/view/View;Landroid/view/inputmethod/CursorAnchorInfo;)V" since="21"/>
+ <method name="updateExtractedText(Landroid/view/View;ILandroid/view/inputmethod/ExtractedText;)V"/>
+ <method name="updateSelection(Landroid/view/View;IIII)V"/>
+ <method name="viewClicked(Landroid/view/View;)V" since="14"/>
+ <field name="HIDE_IMPLICIT_ONLY"/>
+ <field name="HIDE_NOT_ALWAYS"/>
+ <field name="RESULT_HIDDEN"/>
+ <field name="RESULT_SHOWN"/>
+ <field name="RESULT_UNCHANGED_HIDDEN"/>
+ <field name="RESULT_UNCHANGED_SHOWN"/>
+ <field name="SHOW_FORCED"/>
+ <field name="SHOW_IMPLICIT"/>
+ </class>
+ <class name="android/view/inputmethod/InputMethodSession" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="appPrivateCommand(Ljava/lang/String;Landroid/os/Bundle;)V"/>
+ <method name="dispatchGenericMotionEvent(ILandroid/view/MotionEvent;Landroid/view/inputmethod/InputMethodSession$EventCallback;)V" since="17"/>
+ <method name="dispatchKeyEvent(ILandroid/view/KeyEvent;Landroid/view/inputmethod/InputMethodSession$EventCallback;)V"/>
+ <method name="dispatchTrackballEvent(ILandroid/view/MotionEvent;Landroid/view/inputmethod/InputMethodSession$EventCallback;)V"/>
+ <method name="displayCompletions([Landroid/view/inputmethod/CompletionInfo;)V"/>
+ <method name="finishInput()V"/>
+ <method name="toggleSoftInput(II)V"/>
+ <method name="updateCursor(Landroid/graphics/Rect;)V"/>
+ <method name="updateCursorAnchorInfo(Landroid/view/inputmethod/CursorAnchorInfo;)V" since="21"/>
+ <method name="updateExtractedText(ILandroid/view/inputmethod/ExtractedText;)V"/>
+ <method name="updateSelection(IIIIII)V"/>
+ <method name="viewClicked(Z)V" since="14"/>
+ </class>
+ <class name="android/view/inputmethod/InputMethodSession$EventCallback" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="finishedEvent(IZ)V"/>
+ </class>
+ <class name="android/view/inputmethod/InputMethodSubtype" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V" removed="14"/>
+ <method name="&lt;init>(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZ)V" since="14" deprecated="19"/>
+ <method name="&lt;init>(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZI)V" since="17" deprecated="19"/>
+ <method name="containsExtraValueKey(Ljava/lang/String;)Z" since="12"/>
+ <method name="getDisplayName(Landroid/content/Context;Ljava/lang/String;Landroid/content/pm/ApplicationInfo;)Ljava/lang/CharSequence;" since="14"/>
+ <method name="getExtraValue()Ljava/lang/String;"/>
+ <method name="getExtraValueOf(Ljava/lang/String;)Ljava/lang/String;" since="12"/>
+ <method name="getIconResId()I"/>
+ <method name="getLanguageTag()Ljava/lang/String;" since="24"/>
+ <method name="getLocale()Ljava/lang/String;" deprecated="24"/>
+ <method name="getMode()Ljava/lang/String;"/>
+ <method name="getNameResId()I"/>
+ <method name="isAsciiCapable()Z" since="19"/>
+ <method name="isAuxiliary()Z" since="14"/>
+ <method name="overridesImplicitlyEnabledSubtype()Z" since="14"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="build()Landroid/view/inputmethod/InputMethodSubtype;"/>
+ <method name="setIsAsciiCapable(Z)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;"/>
+ <method name="setIsAuxiliary(Z)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;"/>
+ <method name="setLanguageTag(Ljava/lang/String;)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;" since="24"/>
+ <method name="setOverridesImplicitlyEnabledSubtype(Z)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;"/>
+ <method name="setSubtypeExtraValue(Ljava/lang/String;)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;"/>
+ <method name="setSubtypeIconResId(I)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;"/>
+ <method name="setSubtypeId(I)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;"/>
+ <method name="setSubtypeLocale(Ljava/lang/String;)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;"/>
+ <method name="setSubtypeMode(Ljava/lang/String;)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;"/>
+ <method name="setSubtypeNameResId(I)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;"/>
+ </class>
+ <class name="android/view/textclassifier/TextClassification" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getConfidenceScore(Ljava/lang/String;)F"/>
+ <method name="getEntity(I)Ljava/lang/String;"/>
+ <method name="getEntityCount()I"/>
+ <method name="getIcon()Landroid/graphics/drawable/Drawable;"/>
+ <method name="getIntent()Landroid/content/Intent;"/>
+ <method name="getLabel()Ljava/lang/CharSequence;"/>
+ <method name="getOnClickListener()Landroid/view/View$OnClickListener;"/>
+ <method name="getText()Ljava/lang/String;"/>
+ </class>
+ <class name="android/view/textclassifier/TextClassification$Builder" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="build()Landroid/view/textclassifier/TextClassification;"/>
+ <method name="setEntityType(Ljava/lang/String;F)Landroid/view/textclassifier/TextClassification$Builder;"/>
+ <method name="setIcon(Landroid/graphics/drawable/Drawable;)Landroid/view/textclassifier/TextClassification$Builder;"/>
+ <method name="setIntent(Landroid/content/Intent;)Landroid/view/textclassifier/TextClassification$Builder;"/>
+ <method name="setLabel(Ljava/lang/String;)Landroid/view/textclassifier/TextClassification$Builder;"/>
+ <method name="setOnClickListener(Landroid/view/View$OnClickListener;)Landroid/view/textclassifier/TextClassification$Builder;"/>
+ <method name="setText(Ljava/lang/String;)Landroid/view/textclassifier/TextClassification$Builder;"/>
+ </class>
+ <class name="android/view/textclassifier/TextClassificationManager" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getTextClassifier()Landroid/view/textclassifier/TextClassifier;"/>
+ <method name="setTextClassifier(Landroid/view/textclassifier/TextClassifier;)V"/>
+ </class>
+ <class name="android/view/textclassifier/TextClassifier" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="classifyText(Ljava/lang/CharSequence;IILandroid/os/LocaleList;)Landroid/view/textclassifier/TextClassification;"/>
+ <method name="suggestSelection(Ljava/lang/CharSequence;IILandroid/os/LocaleList;)Landroid/view/textclassifier/TextSelection;"/>
+ <field name="NO_OP"/>
+ <field name="TYPE_ADDRESS"/>
+ <field name="TYPE_EMAIL"/>
+ <field name="TYPE_OTHER"/>
+ <field name="TYPE_PHONE"/>
+ <field name="TYPE_URL"/>
+ </class>
+ <class name="android/view/textclassifier/TextSelection" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getConfidenceScore(Ljava/lang/String;)F"/>
+ <method name="getEntity(I)Ljava/lang/String;"/>
+ <method name="getEntityCount()I"/>
+ <method name="getSelectionEndIndex()I"/>
+ <method name="getSelectionStartIndex()I"/>
+ </class>
+ <class name="android/view/textclassifier/TextSelection$Builder" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="build()Landroid/view/textclassifier/TextSelection;"/>
+ <method name="setEntityType(Ljava/lang/String;F)Landroid/view/textclassifier/TextSelection$Builder;"/>
+ </class>
+ <class name="android/view/textservice/SentenceSuggestionsInfo" since="16">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="&lt;init>([Landroid/view/textservice/SuggestionsInfo;[I[I)V"/>
+ <method name="getLengthAt(I)I"/>
+ <method name="getOffsetAt(I)I"/>
+ <method name="getSuggestionsCount()I"/>
+ <method name="getSuggestionsInfoAt(I)Landroid/view/textservice/SuggestionsInfo;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/view/textservice/SpellCheckerInfo" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getComponent()Landroid/content/ComponentName;"/>
+ <method name="getId()Ljava/lang/String;"/>
+ <method name="getPackageName()Ljava/lang/String;"/>
+ <method name="getServiceInfo()Landroid/content/pm/ServiceInfo;"/>
+ <method name="getSettingsActivity()Ljava/lang/String;"/>
+ <method name="getSubtypeAt(I)Landroid/view/textservice/SpellCheckerSubtype;"/>
+ <method name="getSubtypeCount()I"/>
+ <method name="loadIcon(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;"/>
+ <method name="loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/view/textservice/SpellCheckerSession" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="cancel()V" since="15"/>
+ <method name="close()V"/>
+ <method name="getSentenceSuggestions([Landroid/view/textservice/TextInfo;I)V" since="16"/>
+ <method name="getSpellChecker()Landroid/view/textservice/SpellCheckerInfo;"/>
+ <method name="getSuggestions(Landroid/view/textservice/TextInfo;I)V" deprecated="16"/>
+ <method name="getSuggestions([Landroid/view/textservice/TextInfo;IZ)V" deprecated="16"/>
+ <method name="isSessionDisconnected()Z"/>
+ <field name="SERVICE_META_DATA"/>
+ </class>
+ <class name="android/view/textservice/SpellCheckerSession$SpellCheckerSessionListener" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="onGetSentenceSuggestions([Landroid/view/textservice/SentenceSuggestionsInfo;)V" since="16"/>
+ <method name="onGetSuggestions([Landroid/view/textservice/SuggestionsInfo;)V"/>
+ </class>
+ <class name="android/view/textservice/SpellCheckerSubtype" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(ILjava/lang/String;Ljava/lang/String;)V" deprecated="24"/>
+ <method name="containsExtraValueKey(Ljava/lang/String;)Z" since="16"/>
+ <method name="getDisplayName(Landroid/content/Context;Ljava/lang/String;Landroid/content/pm/ApplicationInfo;)Ljava/lang/CharSequence;"/>
+ <method name="getExtraValue()Ljava/lang/String;"/>
+ <method name="getExtraValueOf(Ljava/lang/String;)Ljava/lang/String;" since="16"/>
+ <method name="getLanguageTag()Ljava/lang/String;" since="24"/>
+ <method name="getLocale()Ljava/lang/String;" deprecated="24"/>
+ <method name="getNameResId()I"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/view/textservice/SuggestionsInfo" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(I[Ljava/lang/String;)V"/>
+ <method name="&lt;init>(I[Ljava/lang/String;II)V"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="getCookie()I"/>
+ <method name="getSequence()I"/>
+ <method name="getSuggestionAt(I)Ljava/lang/String;"/>
+ <method name="getSuggestionsAttributes()I"/>
+ <method name="getSuggestionsCount()I"/>
+ <method name="setCookieAndSequence(II)V"/>
+ <field name="CREATOR"/>
+ <field name="RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS" since="15"/>
+ <field name="RESULT_ATTR_IN_THE_DICTIONARY"/>
+ <field name="RESULT_ATTR_LOOKS_LIKE_TYPO"/>
+ </class>
+ <class name="android/view/textservice/TextInfo" since="14">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;IIII)V" since="21"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;II)V"/>
+ <method name="getCharSequence()Ljava/lang/CharSequence;" since="21"/>
+ <method name="getCookie()I"/>
+ <method name="getSequence()I"/>
+ <method name="getText()Ljava/lang/String;"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/view/textservice/TextServicesManager" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="newSpellCheckerSession(Landroid/os/Bundle;Ljava/util/Locale;Landroid/view/textservice/SpellCheckerSession$SpellCheckerSessionListener;Z)Landroid/view/textservice/SpellCheckerSession;"/>
+ </class>
+ <class name="android/webkit/CacheManager" since="1" deprecated="11" removed="17">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="cacheDisabled()Z" deprecated="16"/>
+ <method name="endCacheTransaction()Z" deprecated="16"/>
+ <method name="getCacheFile(Ljava/lang/String;Ljava/util/Map;)Landroid/webkit/CacheManager$CacheResult;" deprecated="16"/>
+ <method name="getCacheFileBaseDir()Ljava/io/File;" deprecated="16"/>
+ <method name="saveCacheFile(Ljava/lang/String;Landroid/webkit/CacheManager$CacheResult;)V" deprecated="16"/>
+ <method name="startCacheTransaction()Z" deprecated="16"/>
+ </class>
+ <class name="android/webkit/CacheManager$CacheResult" since="1" deprecated="11" removed="17">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getContentDisposition()Ljava/lang/String;" since="7"/>
+ <method name="getContentLength()J"/>
+ <method name="getETag()Ljava/lang/String;"/>
+ <method name="getEncoding()Ljava/lang/String;"/>
+ <method name="getExpires()J"/>
+ <method name="getExpiresString()Ljava/lang/String;" since="7"/>
+ <method name="getHttpStatusCode()I"/>
+ <method name="getInputStream()Ljava/io/InputStream;"/>
+ <method name="getLastModified()Ljava/lang/String;"/>
+ <method name="getLocalPath()Ljava/lang/String;"/>
+ <method name="getLocation()Ljava/lang/String;"/>
+ <method name="getMimeType()Ljava/lang/String;"/>
+ <method name="getOutputStream()Ljava/io/OutputStream;"/>
+ <method name="setEncoding(Ljava/lang/String;)V"/>
+ <method name="setInputStream(Ljava/io/InputStream;)V"/>
+ </class>
+ <class name="android/webkit/CallbackProxy" since="1" removed="8">
+ <extends name="android/os/Handler"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/webkit/WebView;)V"/>
+ <method name="addMessageToConsole(Ljava/lang/String;ILjava/lang/String;)V" since="7"/>
+ <method name="createWindow(ZZ)Landroid/webkit/WebView;"/>
+ <method name="doUpdateVisitedHistory(Ljava/lang/String;Z)V"/>
+ <method name="getBackForwardList()Landroid/webkit/WebBackForwardList;"/>
+ <method name="getProgress()I"/>
+ <method name="getVisitedHistory(Landroid/webkit/ValueCallback;)V" since="7"/>
+ <method name="getWebChromeClient()Landroid/webkit/WebChromeClient;" since="7"/>
+ <method name="onCloseWindow(Landroid/webkit/WebView;)V"/>
+ <method name="onDownloadStart(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;J)Z"/>
+ <method name="onExceededDatabaseQuota(Ljava/lang/String;Ljava/lang/String;JJJLandroid/webkit/WebStorage$QuotaUpdater;)V" since="5"/>
+ <method name="onFormResubmission(Landroid/os/Message;Landroid/os/Message;)V"/>
+ <method name="onGeolocationPermissionsHidePrompt()V" since="7"/>
+ <method name="onGeolocationPermissionsShowPrompt(Ljava/lang/String;Landroid/webkit/GeolocationPermissions$Callback;)V" since="7"/>
+ <method name="onJsAlert(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="onJsBeforeUnload(Ljava/lang/String;Ljava/lang/String;)Z"/>
+ <method name="onJsConfirm(Ljava/lang/String;Ljava/lang/String;)Z"/>
+ <method name="onJsPrompt(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="onJsTimeout()Z" since="7"/>
+ <method name="onLoadResource(Ljava/lang/String;)V"/>
+ <method name="onPageFinished(Ljava/lang/String;)V"/>
+ <method name="onPageStarted(Ljava/lang/String;Landroid/graphics/Bitmap;)V"/>
+ <method name="onProgressChanged(I)V"/>
+ <method name="onReachedMaxAppCacheSize(JJLandroid/webkit/WebStorage$QuotaUpdater;)V" since="7"/>
+ <method name="onReceivedError(ILjava/lang/String;Ljava/lang/String;)V"/>
+ <method name="onReceivedHttpAuthRequest(Landroid/webkit/HttpAuthHandler;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="onReceivedIcon(Landroid/graphics/Bitmap;)V"/>
+ <method name="onReceivedTitle(Ljava/lang/String;)V"/>
+ <method name="onRequestFocus()V"/>
+ <method name="onSavePassword(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Message;)Z"/>
+ <method name="onScaleChanged(FF)V"/>
+ <method name="onTooManyRedirects(Landroid/os/Message;Landroid/os/Message;)V"/>
+ <method name="onUnhandledKeyEvent(Landroid/view/KeyEvent;)V"/>
+ <method name="setDownloadListener(Landroid/webkit/DownloadListener;)V"/>
+ <method name="setWebChromeClient(Landroid/webkit/WebChromeClient;)V"/>
+ <method name="setWebViewClient(Landroid/webkit/WebViewClient;)V"/>
+ <method name="shouldOverrideUrlLoading(Ljava/lang/String;)Z"/>
+ <method name="uiOverrideKeyEvent(Landroid/view/KeyEvent;)Z"/>
+ <method name="uiOverrideUrlLoading(Ljava/lang/String;)Z"/>
+ </class>
+ <class name="android/webkit/ClientCertRequest" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="cancel()V"/>
+ <method name="getHost()Ljava/lang/String;"/>
+ <method name="getKeyTypes()[Ljava/lang/String;"/>
+ <method name="getPort()I"/>
+ <method name="getPrincipals()[Ljava/security/Principal;"/>
+ <method name="ignore()V"/>
+ <method name="proceed(Ljava/security/PrivateKey;[Ljava/security/cert/X509Certificate;)V"/>
+ </class>
+ <class name="android/webkit/ConsoleMessage" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILandroid/webkit/ConsoleMessage$MessageLevel;)V"/>
+ <method name="lineNumber()I"/>
+ <method name="message()Ljava/lang/String;"/>
+ <method name="messageLevel()Landroid/webkit/ConsoleMessage$MessageLevel;"/>
+ <method name="sourceId()Ljava/lang/String;"/>
+ </class>
+ <class name="android/webkit/ConsoleMessage$MessageLevel" since="8">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/webkit/ConsoleMessage$MessageLevel;"/>
+ <method name="values()[Landroid/webkit/ConsoleMessage$MessageLevel;"/>
+ <field name="DEBUG"/>
+ <field name="ERROR"/>
+ <field name="LOG"/>
+ <field name="TIP"/>
+ <field name="WARNING"/>
+ </class>
+ <class name="android/webkit/CookieManager" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="acceptCookie()Z"/>
+ <method name="acceptThirdPartyCookies(Landroid/webkit/WebView;)Z" since="21"/>
+ <method name="allowFileSchemeCookies()Z" since="12"/>
+ <method name="flush()V" since="21"/>
+ <method name="getCookie(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getInstance()Landroid/webkit/CookieManager;"/>
+ <method name="hasCookies()Z"/>
+ <method name="removeAllCookie()V" deprecated="21"/>
+ <method name="removeAllCookies(Landroid/webkit/ValueCallback;)V" since="21"/>
+ <method name="removeExpiredCookie()V" deprecated="21"/>
+ <method name="removeSessionCookie()V" deprecated="21"/>
+ <method name="removeSessionCookies(Landroid/webkit/ValueCallback;)V" since="21"/>
+ <method name="setAcceptCookie(Z)V"/>
+ <method name="setAcceptFileSchemeCookies(Z)V" since="12"/>
+ <method name="setAcceptThirdPartyCookies(Landroid/webkit/WebView;Z)V" since="21"/>
+ <method name="setCookie(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="setCookie(Ljava/lang/String;Ljava/lang/String;Landroid/webkit/ValueCallback;)V" since="21"/>
+ </class>
+ <class name="android/webkit/CookieSyncManager" since="1" deprecated="21">
+ <extends name="android/webkit/WebSyncManager"/>
+ <method name="&lt;init>()V"/>
+ <method name="createInstance(Landroid/content/Context;)Landroid/webkit/CookieSyncManager;"/>
+ <method name="getInstance()Landroid/webkit/CookieSyncManager;"/>
+ <method name="syncFromRamToFlash()V" deprecated="21"/>
+ <field name="LOGTAG" since="21"/>
+ <field name="mDataBase" since="21"/>
+ <field name="mHandler" since="21"/>
+ </class>
+ <class name="android/webkit/DateSorter" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="getBoundary(I)J"/>
+ <method name="getIndex(J)I"/>
+ <method name="getLabel(I)Ljava/lang/String;"/>
+ <field name="DAY_COUNT"/>
+ </class>
+ <class name="android/webkit/DownloadListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onDownloadStart(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;J)V"/>
+ </class>
+ <class name="android/webkit/GeolocationPermissions" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="allow(Ljava/lang/String;)V" since="7"/>
+ <method name="clear(Ljava/lang/String;)V" since="7"/>
+ <method name="clearAll()V" since="7"/>
+ <method name="getAllowed(Ljava/lang/String;Landroid/webkit/ValueCallback;)V" since="7"/>
+ <method name="getInstance()Landroid/webkit/GeolocationPermissions;" since="7"/>
+ <method name="getOrigins(Landroid/webkit/ValueCallback;)V" since="7"/>
+ </class>
+ <class name="android/webkit/GeolocationPermissions$Callback" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="invoke(Ljava/lang/String;ZZ)V"/>
+ </class>
+ <class name="android/webkit/HttpAuthHandler" since="1">
+ <extends name="android/os/Handler"/>
+ <method name="&lt;init>()V"/>
+ <method name="cancel()V"/>
+ <method name="proceed(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="useHttpAuthUsernamePassword()Z"/>
+ </class>
+ <class name="android/webkit/JavascriptInterface" since="17">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ </class>
+ <class name="android/webkit/JsPromptResult" since="1">
+ <extends name="android/webkit/JsResult"/>
+ <method name="&lt;init>()V"/>
+ <method name="confirm(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/webkit/JsResult" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="cancel()V"/>
+ <method name="confirm()V"/>
+ <method name="wakeUp()V" removed="16"/>
+ <field name="mProxy" removed="8"/>
+ <field name="mResult" removed="16"/>
+ </class>
+ <class name="android/webkit/MimeTypeMap" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getExtensionFromMimeType(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getFileExtensionFromUrl(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getMimeTypeFromExtension(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getSingleton()Landroid/webkit/MimeTypeMap;"/>
+ <method name="hasExtension(Ljava/lang/String;)Z"/>
+ <method name="hasMimeType(Ljava/lang/String;)Z"/>
+ </class>
+ <class name="android/webkit/PermissionRequest" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="deny()V"/>
+ <method name="getOrigin()Landroid/net/Uri;"/>
+ <method name="getResources()[Ljava/lang/String;"/>
+ <method name="grant([Ljava/lang/String;)V"/>
+ <field name="RESOURCE_AUDIO_CAPTURE"/>
+ <field name="RESOURCE_MIDI_SYSEX" since="23"/>
+ <field name="RESOURCE_PROTECTED_MEDIA_ID"/>
+ <field name="RESOURCE_VIDEO_CAPTURE"/>
+ </class>
+ <class name="android/webkit/Plugin" since="1" deprecated="5" removed="12">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="dispatchClickEvent(Landroid/content/Context;)V"/>
+ <method name="getDescription()Ljava/lang/String;"/>
+ <method name="getFileName()Ljava/lang/String;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getPath()Ljava/lang/String;"/>
+ <method name="setClickHandler(Landroid/webkit/Plugin$PreferencesClickHandler;)V"/>
+ <method name="setDescription(Ljava/lang/String;)V"/>
+ <method name="setFileName(Ljava/lang/String;)V"/>
+ <method name="setName(Ljava/lang/String;)V"/>
+ <method name="setPath(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/webkit/Plugin$PreferencesClickHandler" since="1" removed="12">
+ <extends name="java/lang/Object"/>
+ <method name="handleClickEvent(Landroid/content/Context;)V"/>
+ </class>
+ <class name="android/webkit/PluginData" since="3" deprecated="5" removed="12">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/io/InputStream;JLjava/util/Map;I)V"/>
+ <method name="getContentLength()J"/>
+ <method name="getHeaders()Ljava/util/Map;"/>
+ <method name="getInputStream()Ljava/io/InputStream;"/>
+ <method name="getStatusCode()I"/>
+ </class>
+ <class name="android/webkit/PluginList" since="1" deprecated="5" removed="12">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addPlugin(Landroid/webkit/Plugin;)V"/>
+ <method name="clear()V"/>
+ <method name="getList()Ljava/util/List;"/>
+ <method name="pluginClicked(Landroid/content/Context;I)V"/>
+ <method name="removePlugin(Landroid/webkit/Plugin;)V"/>
+ </class>
+ <class name="android/webkit/PluginStub" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="getEmbeddedView(ILandroid/content/Context;)Landroid/view/View;"/>
+ <method name="getFullScreenView(ILandroid/content/Context;)Landroid/view/View;"/>
+ </class>
+ <class name="android/webkit/RenderProcessGoneDetail" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="didCrash()Z"/>
+ <method name="rendererPriorityAtExit()I"/>
+ </class>
+ <class name="android/webkit/ServiceWorkerClient" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="shouldInterceptRequest(Landroid/webkit/WebResourceRequest;)Landroid/webkit/WebResourceResponse;"/>
+ </class>
+ <class name="android/webkit/ServiceWorkerController" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getInstance()Landroid/webkit/ServiceWorkerController;"/>
+ <method name="getServiceWorkerWebSettings()Landroid/webkit/ServiceWorkerWebSettings;"/>
+ <method name="setServiceWorkerClient(Landroid/webkit/ServiceWorkerClient;)V"/>
+ </class>
+ <class name="android/webkit/ServiceWorkerWebSettings" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAllowContentAccess()Z"/>
+ <method name="getAllowFileAccess()Z"/>
+ <method name="getBlockNetworkLoads()Z"/>
+ <method name="getCacheMode()I"/>
+ <method name="setAllowContentAccess(Z)V"/>
+ <method name="setAllowFileAccess(Z)V"/>
+ <method name="setBlockNetworkLoads(Z)V"/>
+ <method name="setCacheMode(I)V"/>
+ </class>
+ <class name="android/webkit/SslErrorHandler" since="1">
+ <extends name="android/os/Handler"/>
+ <method name="&lt;init>()V"/>
+ <method name="cancel()V"/>
+ <method name="proceed()V"/>
+ </class>
+ <class name="android/webkit/URLUtil" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="composeSearchUrl(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="decode([B)[B"/>
+ <method name="guessFileName(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="guessUrl(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="isAboutUrl(Ljava/lang/String;)Z"/>
+ <method name="isAssetUrl(Ljava/lang/String;)Z"/>
+ <method name="isContentUrl(Ljava/lang/String;)Z"/>
+ <method name="isCookielessProxyUrl(Ljava/lang/String;)Z" deprecated="16"/>
+ <method name="isDataUrl(Ljava/lang/String;)Z"/>
+ <method name="isFileUrl(Ljava/lang/String;)Z"/>
+ <method name="isHttpUrl(Ljava/lang/String;)Z"/>
+ <method name="isHttpsUrl(Ljava/lang/String;)Z"/>
+ <method name="isJavaScriptUrl(Ljava/lang/String;)Z"/>
+ <method name="isNetworkUrl(Ljava/lang/String;)Z"/>
+ <method name="isValidUrl(Ljava/lang/String;)Z"/>
+ <method name="stripAnchor(Ljava/lang/String;)Ljava/lang/String;"/>
+ </class>
+ <class name="android/webkit/UrlInterceptHandler" since="1" deprecated="5" removed="12">
+ <extends name="java/lang/Object"/>
+ <method name="getPluginData(Ljava/lang/String;Ljava/util/Map;)Landroid/webkit/PluginData;" since="3"/>
+ <method name="service(Ljava/lang/String;Ljava/util/Map;)Landroid/webkit/CacheManager$CacheResult;"/>
+ </class>
+ <class name="android/webkit/UrlInterceptRegistry" since="1" deprecated="5" removed="12">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getPluginData(Ljava/lang/String;Ljava/util/Map;)Landroid/webkit/PluginData;" since="3"/>
+ <method name="getSurrogate(Ljava/lang/String;Ljava/util/Map;)Landroid/webkit/CacheManager$CacheResult;"/>
+ <method name="registerHandler(Landroid/webkit/UrlInterceptHandler;)Z"/>
+ <method name="setUrlInterceptDisabled(Z)V"/>
+ <method name="unregisterHandler(Landroid/webkit/UrlInterceptHandler;)Z"/>
+ <method name="urlInterceptDisabled()Z"/>
+ </class>
+ <class name="android/webkit/ValueCallback" since="7">
+ <extends name="java/lang/Object"/>
+ <method name="onReceiveValue(Ljava/lang/Object;)V"/>
+ </class>
+ <class name="android/webkit/WebBackForwardList" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="clone()Landroid/webkit/WebBackForwardList;"/>
+ <method name="getCurrentIndex()I"/>
+ <method name="getCurrentItem()Landroid/webkit/WebHistoryItem;"/>
+ <method name="getItemAtIndex(I)Landroid/webkit/WebHistoryItem;"/>
+ <method name="getSize()I"/>
+ </class>
+ <class name="android/webkit/WebChromeClient" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDefaultVideoPoster()Landroid/graphics/Bitmap;" since="7"/>
+ <method name="getVideoLoadingProgressView()Landroid/view/View;" since="7"/>
+ <method name="getVisitedHistory(Landroid/webkit/ValueCallback;)V" since="7"/>
+ <method name="onCloseWindow(Landroid/webkit/WebView;)V"/>
+ <method name="onConsoleMessage(Landroid/webkit/ConsoleMessage;)Z" since="8"/>
+ <method name="onConsoleMessage(Ljava/lang/String;ILjava/lang/String;)V" since="7" deprecated="16"/>
+ <method name="onCreateWindow(Landroid/webkit/WebView;ZZLandroid/os/Message;)Z"/>
+ <method name="onExceededDatabaseQuota(Ljava/lang/String;Ljava/lang/String;JJJLandroid/webkit/WebStorage$QuotaUpdater;)V" since="5" deprecated="19"/>
+ <method name="onGeolocationPermissionsHidePrompt()V" since="5"/>
+ <method name="onGeolocationPermissionsShowPrompt(Ljava/lang/String;Landroid/webkit/GeolocationPermissions$Callback;)V" since="5"/>
+ <method name="onHideCustomView()V" since="7"/>
+ <method name="onJsAlert(Landroid/webkit/WebView;Ljava/lang/String;Ljava/lang/String;Landroid/webkit/JsResult;)Z"/>
+ <method name="onJsBeforeUnload(Landroid/webkit/WebView;Ljava/lang/String;Ljava/lang/String;Landroid/webkit/JsResult;)Z"/>
+ <method name="onJsConfirm(Landroid/webkit/WebView;Ljava/lang/String;Ljava/lang/String;Landroid/webkit/JsResult;)Z"/>
+ <method name="onJsPrompt(Landroid/webkit/WebView;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/webkit/JsPromptResult;)Z"/>
+ <method name="onJsTimeout()Z" since="7" deprecated="17"/>
+ <method name="onPermissionRequest(Landroid/webkit/PermissionRequest;)V" since="21"/>
+ <method name="onPermissionRequestCanceled(Landroid/webkit/PermissionRequest;)V" since="21"/>
+ <method name="onProgressChanged(Landroid/webkit/WebView;I)V"/>
+ <method name="onReachedMaxAppCacheSize(JJLandroid/webkit/WebStorage$QuotaUpdater;)V" since="7" deprecated="19"/>
+ <method name="onReceivedIcon(Landroid/webkit/WebView;Landroid/graphics/Bitmap;)V"/>
+ <method name="onReceivedTitle(Landroid/webkit/WebView;Ljava/lang/String;)V"/>
+ <method name="onReceivedTouchIconUrl(Landroid/webkit/WebView;Ljava/lang/String;Z)V" since="7"/>
+ <method name="onRequestFocus(Landroid/webkit/WebView;)V"/>
+ <method name="onShowCustomView(Landroid/view/View;ILandroid/webkit/WebChromeClient$CustomViewCallback;)V" since="14" deprecated="18"/>
+ <method name="onShowCustomView(Landroid/view/View;Landroid/webkit/WebChromeClient$CustomViewCallback;)V" since="7"/>
+ <method name="onShowFileChooser(Landroid/webkit/WebView;Landroid/webkit/ValueCallback;Landroid/webkit/WebChromeClient$FileChooserParams;)Z" since="21"/>
+ </class>
+ <class name="android/webkit/WebChromeClient$CustomViewCallback" since="7">
+ <extends name="java/lang/Object"/>
+ <method name="onCustomViewHidden()V"/>
+ </class>
+ <class name="android/webkit/WebChromeClient$FileChooserParams" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="createIntent()Landroid/content/Intent;"/>
+ <method name="getAcceptTypes()[Ljava/lang/String;"/>
+ <method name="getFilenameHint()Ljava/lang/String;"/>
+ <method name="getMode()I"/>
+ <method name="getTitle()Ljava/lang/CharSequence;"/>
+ <method name="isCaptureEnabled()Z"/>
+ <method name="parseResult(ILandroid/content/Intent;)[Landroid/net/Uri;"/>
+ <field name="MODE_OPEN"/>
+ <field name="MODE_OPEN_MULTIPLE"/>
+ <field name="MODE_SAVE"/>
+ </class>
+ <class name="android/webkit/WebHistoryItem" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="clone()Landroid/webkit/WebHistoryItem;"/>
+ <method name="getFavicon()Landroid/graphics/Bitmap;"/>
+ <method name="getId()I" deprecated="16" removed="17"/>
+ <method name="getOriginalUrl()Ljava/lang/String;" since="3"/>
+ <method name="getTitle()Ljava/lang/String;"/>
+ <method name="getUrl()Ljava/lang/String;"/>
+ </class>
+ <class name="android/webkit/WebIconDatabase" since="1" deprecated="18">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="close()V"/>
+ <method name="getInstance()Landroid/webkit/WebIconDatabase;"/>
+ <method name="open(Ljava/lang/String;)V"/>
+ <method name="releaseIconForPageUrl(Ljava/lang/String;)V"/>
+ <method name="removeAllIcons()V"/>
+ <method name="requestIconForPageUrl(Ljava/lang/String;Landroid/webkit/WebIconDatabase$IconListener;)V"/>
+ <method name="retainIconForPageUrl(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/webkit/WebIconDatabase$IconListener" since="1" deprecated="18">
+ <extends name="java/lang/Object"/>
+ <method name="onReceivedIcon(Ljava/lang/String;Landroid/graphics/Bitmap;)V"/>
+ </class>
+ <class name="android/webkit/WebMessage" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;[Landroid/webkit/WebMessagePort;)V"/>
+ <method name="getData()Ljava/lang/String;"/>
+ <method name="getPorts()[Landroid/webkit/WebMessagePort;"/>
+ </class>
+ <class name="android/webkit/WebMessagePort" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="close()V"/>
+ <method name="postMessage(Landroid/webkit/WebMessage;)V"/>
+ <method name="setWebMessageCallback(Landroid/webkit/WebMessagePort$WebMessageCallback;)V"/>
+ <method name="setWebMessageCallback(Landroid/webkit/WebMessagePort$WebMessageCallback;Landroid/os/Handler;)V"/>
+ </class>
+ <class name="android/webkit/WebMessagePort$WebMessageCallback" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onMessage(Landroid/webkit/WebMessagePort;Landroid/webkit/WebMessage;)V"/>
+ </class>
+ <class name="android/webkit/WebResourceError" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDescription()Ljava/lang/CharSequence;"/>
+ <method name="getErrorCode()I"/>
+ </class>
+ <class name="android/webkit/WebResourceRequest" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="getMethod()Ljava/lang/String;"/>
+ <method name="getRequestHeaders()Ljava/util/Map;"/>
+ <method name="getUrl()Landroid/net/Uri;"/>
+ <method name="hasGesture()Z"/>
+ <method name="isForMainFrame()Z"/>
+ <method name="isRedirect()Z" since="24"/>
+ </class>
+ <class name="android/webkit/WebResourceResponse" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/util/Map;Ljava/io/InputStream;)V" since="21"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/io/InputStream;)V"/>
+ <method name="getData()Ljava/io/InputStream;"/>
+ <method name="getEncoding()Ljava/lang/String;"/>
+ <method name="getMimeType()Ljava/lang/String;"/>
+ <method name="getReasonPhrase()Ljava/lang/String;" since="21"/>
+ <method name="getResponseHeaders()Ljava/util/Map;" since="21"/>
+ <method name="getStatusCode()I" since="21"/>
+ <method name="setData(Ljava/io/InputStream;)V"/>
+ <method name="setEncoding(Ljava/lang/String;)V"/>
+ <method name="setMimeType(Ljava/lang/String;)V"/>
+ <method name="setResponseHeaders(Ljava/util/Map;)V" since="21"/>
+ <method name="setStatusCodeAndReasonPhrase(ILjava/lang/String;)V" since="21"/>
+ </class>
+ <class name="android/webkit/WebSettings" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="enableSmoothTransition()Z" since="11" deprecated="17"/>
+ <method name="getAllowContentAccess()Z" since="11"/>
+ <method name="getAllowFileAccess()Z" since="3"/>
+ <method name="getAllowFileAccessFromFileURLs()Z" since="16"/>
+ <method name="getAllowUniversalAccessFromFileURLs()Z" since="16"/>
+ <method name="getBlockNetworkImage()Z"/>
+ <method name="getBlockNetworkLoads()Z" since="8"/>
+ <method name="getBuiltInZoomControls()Z" since="3"/>
+ <method name="getCacheMode()I"/>
+ <method name="getCursiveFontFamily()Ljava/lang/String;"/>
+ <method name="getDatabaseEnabled()Z" since="5"/>
+ <method name="getDatabasePath()Ljava/lang/String;" since="5" deprecated="19"/>
+ <method name="getDefaultFixedFontSize()I"/>
+ <method name="getDefaultFontSize()I"/>
+ <method name="getDefaultTextEncodingName()Ljava/lang/String;"/>
+ <method name="getDefaultUserAgent(Landroid/content/Context;)Ljava/lang/String;" since="17"/>
+ <method name="getDefaultZoom()Landroid/webkit/WebSettings$ZoomDensity;" since="7" deprecated="19"/>
+ <method name="getDisabledActionModeMenuItems()I" since="24"/>
+ <method name="getDisplayZoomControls()Z" since="11"/>
+ <method name="getDomStorageEnabled()Z" since="7"/>
+ <method name="getFantasyFontFamily()Ljava/lang/String;"/>
+ <method name="getFixedFontFamily()Ljava/lang/String;"/>
+ <method name="getJavaScriptCanOpenWindowsAutomatically()Z"/>
+ <method name="getJavaScriptEnabled()Z"/>
+ <method name="getLayoutAlgorithm()Landroid/webkit/WebSettings$LayoutAlgorithm;"/>
+ <method name="getLightTouchEnabled()Z" deprecated="18"/>
+ <method name="getLoadWithOverviewMode()Z" since="7"/>
+ <method name="getLoadsImagesAutomatically()Z"/>
+ <method name="getMediaPlaybackRequiresUserGesture()Z" since="17"/>
+ <method name="getMinimumFontSize()I"/>
+ <method name="getMinimumLogicalFontSize()I"/>
+ <method name="getMixedContentMode()I" since="21"/>
+ <method name="getNavDump()Z" deprecated="16" removed="17"/>
+ <method name="getOffscreenPreRaster()Z" since="23"/>
+ <method name="getPluginState()Landroid/webkit/WebSettings$PluginState;" since="8" deprecated="18"/>
+ <method name="getPluginsEnabled()Z" deprecated="16" removed="18"/>
+ <method name="getPluginsPath()Ljava/lang/String;" deprecated="16" removed="18"/>
+ <method name="getSafeBrowsingEnabled()Z" since="26"/>
+ <method name="getSansSerifFontFamily()Ljava/lang/String;"/>
+ <method name="getSaveFormData()Z" deprecated="26"/>
+ <method name="getSavePassword()Z" deprecated="18"/>
+ <method name="getSerifFontFamily()Ljava/lang/String;"/>
+ <method name="getStandardFontFamily()Ljava/lang/String;"/>
+ <method name="getTextSize()Landroid/webkit/WebSettings$TextSize;" deprecated="16"/>
+ <method name="getTextZoom()I" since="14"/>
+ <method name="getUseDoubleTree()Z" deprecated="16" removed="17"/>
+ <method name="getUseWebViewBackgroundForOverscrollBackground()Z" since="9" deprecated="16" removed="17"/>
+ <method name="getUseWideViewPort()Z"/>
+ <method name="getUserAgent()I" deprecated="16" removed="17"/>
+ <method name="getUserAgentString()Ljava/lang/String;" since="3"/>
+ <method name="setAllowContentAccess(Z)V" since="11"/>
+ <method name="setAllowFileAccess(Z)V" since="3"/>
+ <method name="setAllowFileAccessFromFileURLs(Z)V" since="16"/>
+ <method name="setAllowUniversalAccessFromFileURLs(Z)V" since="16"/>
+ <method name="setAppCacheEnabled(Z)V" since="7"/>
+ <method name="setAppCacheMaxSize(J)V" since="7" deprecated="18"/>
+ <method name="setAppCachePath(Ljava/lang/String;)V" since="7"/>
+ <method name="setBlockNetworkImage(Z)V"/>
+ <method name="setBlockNetworkLoads(Z)V" since="8"/>
+ <method name="setBuiltInZoomControls(Z)V" since="3"/>
+ <method name="setCacheMode(I)V"/>
+ <method name="setCursiveFontFamily(Ljava/lang/String;)V"/>
+ <method name="setDatabaseEnabled(Z)V" since="5"/>
+ <method name="setDatabasePath(Ljava/lang/String;)V" since="5" deprecated="19"/>
+ <method name="setDefaultFixedFontSize(I)V"/>
+ <method name="setDefaultFontSize(I)V"/>
+ <method name="setDefaultTextEncodingName(Ljava/lang/String;)V"/>
+ <method name="setDefaultZoom(Landroid/webkit/WebSettings$ZoomDensity;)V" since="7" deprecated="19"/>
+ <method name="setDisabledActionModeMenuItems(I)V" since="24"/>
+ <method name="setDisplayZoomControls(Z)V" since="11"/>
+ <method name="setDomStorageEnabled(Z)V" since="7"/>
+ <method name="setEnableSmoothTransition(Z)V" since="11" deprecated="17"/>
+ <method name="setFantasyFontFamily(Ljava/lang/String;)V"/>
+ <method name="setFixedFontFamily(Ljava/lang/String;)V"/>
+ <method name="setGeolocationDatabasePath(Ljava/lang/String;)V" since="5" deprecated="24"/>
+ <method name="setGeolocationEnabled(Z)V" since="5"/>
+ <method name="setJavaScriptCanOpenWindowsAutomatically(Z)V"/>
+ <method name="setJavaScriptEnabled(Z)V"/>
+ <method name="setLayoutAlgorithm(Landroid/webkit/WebSettings$LayoutAlgorithm;)V"/>
+ <method name="setLightTouchEnabled(Z)V" deprecated="18"/>
+ <method name="setLoadWithOverviewMode(Z)V" since="7"/>
+ <method name="setLoadsImagesAutomatically(Z)V"/>
+ <method name="setMediaPlaybackRequiresUserGesture(Z)V" since="17"/>
+ <method name="setMinimumFontSize(I)V"/>
+ <method name="setMinimumLogicalFontSize(I)V"/>
+ <method name="setMixedContentMode(I)V" since="21"/>
+ <method name="setNavDump(Z)V" deprecated="16" removed="17"/>
+ <method name="setNeedInitialFocus(Z)V"/>
+ <method name="setOffscreenPreRaster(Z)V" since="23"/>
+ <method name="setPluginState(Landroid/webkit/WebSettings$PluginState;)V" since="8" deprecated="18"/>
+ <method name="setPluginsEnabled(Z)V" deprecated="16" removed="18"/>
+ <method name="setPluginsPath(Ljava/lang/String;)V" deprecated="16" removed="18"/>
+ <method name="setRenderPriority(Landroid/webkit/WebSettings$RenderPriority;)V" deprecated="18"/>
+ <method name="setSafeBrowsingEnabled(Z)V" since="26"/>
+ <method name="setSansSerifFontFamily(Ljava/lang/String;)V"/>
+ <method name="setSaveFormData(Z)V" deprecated="26"/>
+ <method name="setSavePassword(Z)V" deprecated="18"/>
+ <method name="setSerifFontFamily(Ljava/lang/String;)V"/>
+ <method name="setStandardFontFamily(Ljava/lang/String;)V"/>
+ <method name="setSupportMultipleWindows(Z)V"/>
+ <method name="setSupportZoom(Z)V"/>
+ <method name="setTextSize(Landroid/webkit/WebSettings$TextSize;)V" deprecated="16"/>
+ <method name="setTextZoom(I)V" since="14"/>
+ <method name="setUseDoubleTree(Z)V" deprecated="16" removed="17"/>
+ <method name="setUseWebViewBackgroundForOverscrollBackground(Z)V" since="9" deprecated="16" removed="17"/>
+ <method name="setUseWideViewPort(Z)V"/>
+ <method name="setUserAgent(I)V" deprecated="16" removed="17"/>
+ <method name="setUserAgentString(Ljava/lang/String;)V" since="3"/>
+ <method name="supportMultipleWindows()Z"/>
+ <method name="supportZoom()Z"/>
+ <field name="LOAD_CACHE_ELSE_NETWORK"/>
+ <field name="LOAD_CACHE_ONLY"/>
+ <field name="LOAD_DEFAULT"/>
+ <field name="LOAD_NORMAL" deprecated="17"/>
+ <field name="LOAD_NO_CACHE"/>
+ <field name="MENU_ITEM_NONE" since="24"/>
+ <field name="MENU_ITEM_PROCESS_TEXT" since="24"/>
+ <field name="MENU_ITEM_SHARE" since="24"/>
+ <field name="MENU_ITEM_WEB_SEARCH" since="24"/>
+ <field name="MIXED_CONTENT_ALWAYS_ALLOW" since="21"/>
+ <field name="MIXED_CONTENT_COMPATIBILITY_MODE" since="21"/>
+ <field name="MIXED_CONTENT_NEVER_ALLOW" since="21"/>
+ </class>
+ <class name="android/webkit/WebSettings$LayoutAlgorithm" since="1" deprecated="12">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/webkit/WebSettings$LayoutAlgorithm;"/>
+ <method name="values()[Landroid/webkit/WebSettings$LayoutAlgorithm;"/>
+ <field name="NARROW_COLUMNS"/>
+ <field name="NORMAL"/>
+ <field name="SINGLE_COLUMN"/>
+ <field name="TEXT_AUTOSIZING" since="19"/>
+ </class>
+ <class name="android/webkit/WebSettings$PluginState" since="8">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/webkit/WebSettings$PluginState;"/>
+ <method name="values()[Landroid/webkit/WebSettings$PluginState;"/>
+ <field name="OFF"/>
+ <field name="ON"/>
+ <field name="ON_DEMAND"/>
+ </class>
+ <class name="android/webkit/WebSettings$RenderPriority" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/webkit/WebSettings$RenderPriority;"/>
+ <method name="values()[Landroid/webkit/WebSettings$RenderPriority;"/>
+ <field name="HIGH"/>
+ <field name="LOW"/>
+ <field name="NORMAL"/>
+ </class>
+ <class name="android/webkit/WebSettings$TextSize" since="1" deprecated="16">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/webkit/WebSettings$TextSize;"/>
+ <method name="values()[Landroid/webkit/WebSettings$TextSize;"/>
+ <field name="LARGER"/>
+ <field name="LARGEST"/>
+ <field name="NORMAL"/>
+ <field name="SMALLER"/>
+ <field name="SMALLEST"/>
+ </class>
+ <class name="android/webkit/WebSettings$ZoomDensity" since="7">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/webkit/WebSettings$ZoomDensity;"/>
+ <method name="values()[Landroid/webkit/WebSettings$ZoomDensity;"/>
+ <field name="CLOSE"/>
+ <field name="FAR"/>
+ <field name="MEDIUM"/>
+ </class>
+ <class name="android/webkit/WebStorage" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="deleteAllData()V" since="7"/>
+ <method name="deleteOrigin(Ljava/lang/String;)V" since="7"/>
+ <method name="getInstance()Landroid/webkit/WebStorage;" since="7"/>
+ <method name="getOrigins(Landroid/webkit/ValueCallback;)V" since="7"/>
+ <method name="getQuotaForOrigin(Ljava/lang/String;Landroid/webkit/ValueCallback;)V" since="7"/>
+ <method name="getUsageForOrigin(Ljava/lang/String;Landroid/webkit/ValueCallback;)V" since="7"/>
+ <method name="setQuotaForOrigin(Ljava/lang/String;J)V" since="7" deprecated="18"/>
+ </class>
+ <class name="android/webkit/WebStorage$Origin" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getOrigin()Ljava/lang/String;"/>
+ <method name="getQuota()J"/>
+ <method name="getUsage()J"/>
+ </class>
+ <class name="android/webkit/WebStorage$QuotaUpdater" since="5" deprecated="19">
+ <extends name="java/lang/Object"/>
+ <method name="updateQuota(J)V"/>
+ </class>
+ <class name="android/webkit/WebSyncManager" since="1" deprecated="21">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Runnable"/>
+ <method name="&lt;init>(Landroid/content/Context;Ljava/lang/String;)V"/>
+ <method name="onSyncInit()V"/>
+ <method name="resetSync()V"/>
+ <method name="startSync()V"/>
+ <method name="stopSync()V"/>
+ <method name="sync()V"/>
+ <field name="LOGTAG"/>
+ <field name="mDataBase"/>
+ <field name="mHandler"/>
+ </class>
+ <class name="android/webkit/WebView" since="1">
+ <extends name="android/widget/AbsoluteLayout"/>
+ <implements name="android/view/ViewGroup$OnHierarchyChangeListener"/>
+ <implements name="android/view/ViewTreeObserver$OnGlobalFocusChangeListener"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;IZ)V" since="11" deprecated="17"/>
+ <method name="addJavascriptInterface(Ljava/lang/Object;Ljava/lang/String;)V"/>
+ <method name="canGoBack()Z"/>
+ <method name="canGoBackOrForward(I)Z"/>
+ <method name="canGoForward()Z"/>
+ <method name="canZoomIn()Z" since="11" deprecated="17"/>
+ <method name="canZoomOut()Z" since="11" deprecated="17"/>
+ <method name="capturePicture()Landroid/graphics/Picture;" deprecated="19"/>
+ <method name="clearCache(Z)V"/>
+ <method name="clearClientCertPreferences(Ljava/lang/Runnable;)V" since="21"/>
+ <method name="clearFormData()V"/>
+ <method name="clearHistory()V"/>
+ <method name="clearMatches()V" since="3"/>
+ <method name="clearSslPreferences()V"/>
+ <method name="clearView()V" deprecated="18"/>
+ <method name="copyBackForwardList()Landroid/webkit/WebBackForwardList;"/>
+ <method name="createPrintDocumentAdapter()Landroid/print/PrintDocumentAdapter;" since="19" deprecated="21"/>
+ <method name="createPrintDocumentAdapter(Ljava/lang/String;)Landroid/print/PrintDocumentAdapter;" since="21"/>
+ <method name="createWebMessageChannel()[Landroid/webkit/WebMessagePort;" since="23"/>
+ <method name="debugDump()V" deprecated="16" removed="17"/>
+ <method name="destroy()V"/>
+ <method name="disablePlatformNotifications()V" deprecated="16" removed="17"/>
+ <method name="documentHasImages(Landroid/os/Message;)V"/>
+ <method name="emulateShiftHeld()V" since="8" deprecated="16" removed="17"/>
+ <method name="enablePlatformNotifications()V" deprecated="16" removed="17"/>
+ <method name="enableSlowWholeDocumentDraw()V" since="21"/>
+ <method name="evaluateJavascript(Ljava/lang/String;Landroid/webkit/ValueCallback;)V" since="19"/>
+ <method name="findAddress(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="findAll(Ljava/lang/String;)I" since="3" deprecated="16"/>
+ <method name="findAllAsync(Ljava/lang/String;)V" since="16"/>
+ <method name="findNext(Z)V" since="3"/>
+ <method name="flingScroll(II)V"/>
+ <method name="freeMemory()V" since="7" deprecated="19"/>
+ <method name="getCertificate()Landroid/net/http/SslCertificate;"/>
+ <method name="getContentHeight()I"/>
+ <method name="getCurrentWebViewPackage()Landroid/content/pm/PackageInfo;" since="26"/>
+ <method name="getFavicon()Landroid/graphics/Bitmap;"/>
+ <method name="getHitTestResult()Landroid/webkit/WebView$HitTestResult;"/>
+ <method name="getHttpAuthUsernamePassword(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;" deprecated="26"/>
+ <method name="getOriginalUrl()Ljava/lang/String;" since="3"/>
+ <method name="getPluginList()Landroid/webkit/PluginList;" removed="12"/>
+ <method name="getProgress()I"/>
+ <method name="getRendererPriorityWaivedWhenNotVisible()Z" since="26"/>
+ <method name="getRendererRequestedPriority()I" since="26"/>
+ <method name="getScale()F" deprecated="17"/>
+ <method name="getSettings()Landroid/webkit/WebSettings;"/>
+ <method name="getTitle()Ljava/lang/String;"/>
+ <method name="getUrl()Ljava/lang/String;"/>
+ <method name="getVisibleTitleHeight()I" since="11" deprecated="16" removed="17"/>
+ <method name="getWebChromeClient()Landroid/webkit/WebChromeClient;" since="26"/>
+ <method name="getWebViewClient()Landroid/webkit/WebViewClient;" since="26"/>
+ <method name="getZoomControls()Landroid/view/View;" removed="16"/>
+ <method name="goBack()V"/>
+ <method name="goBackOrForward(I)V"/>
+ <method name="goForward()V"/>
+ <method name="invokeZoomPicker()V"/>
+ <method name="isPrivateBrowsingEnabled()Z" since="11"/>
+ <method name="loadData(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="loadDataWithBaseURL(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="loadUrl(Ljava/lang/String;)V"/>
+ <method name="loadUrl(Ljava/lang/String;Ljava/util/Map;)V" since="8"/>
+ <method name="onPause()V" since="11"/>
+ <method name="onResume()V" since="11"/>
+ <method name="overlayHorizontalScrollbar()Z" deprecated="23"/>
+ <method name="overlayVerticalScrollbar()Z" deprecated="23"/>
+ <method name="pageDown(Z)Z"/>
+ <method name="pageUp(Z)Z"/>
+ <method name="pauseTimers()V"/>
+ <method name="postUrl(Ljava/lang/String;[B)V" since="5"/>
+ <method name="postVisualStateCallback(JLandroid/webkit/WebView$VisualStateCallback;)V" since="23"/>
+ <method name="postWebMessage(Landroid/webkit/WebMessage;Landroid/net/Uri;)V" since="23"/>
+ <method name="refreshPlugins(Z)V" removed="12"/>
+ <method name="reload()V"/>
+ <method name="removeJavascriptInterface(Ljava/lang/String;)V" since="11"/>
+ <method name="requestFocusNodeHref(Landroid/os/Message;)V"/>
+ <method name="requestImageRef(Landroid/os/Message;)V"/>
+ <method name="restorePicture(Landroid/os/Bundle;Ljava/io/File;)Z" since="3" deprecated="16" removed="17"/>
+ <method name="restoreState(Landroid/os/Bundle;)Landroid/webkit/WebBackForwardList;"/>
+ <method name="resumeTimers()V"/>
+ <method name="savePassword(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" deprecated="18"/>
+ <method name="savePicture(Landroid/os/Bundle;Ljava/io/File;)Z" since="3" deprecated="16" removed="17"/>
+ <method name="saveState(Landroid/os/Bundle;)Landroid/webkit/WebBackForwardList;"/>
+ <method name="saveWebArchive(Ljava/lang/String;)V" since="11"/>
+ <method name="saveWebArchive(Ljava/lang/String;ZLandroid/webkit/ValueCallback;)V" since="11"/>
+ <method name="setCertificate(Landroid/net/http/SslCertificate;)V" deprecated="17"/>
+ <method name="setDownloadListener(Landroid/webkit/DownloadListener;)V"/>
+ <method name="setFindListener(Landroid/webkit/WebView$FindListener;)V" since="16"/>
+ <method name="setHorizontalScrollbarOverlay(Z)V" deprecated="23"/>
+ <method name="setHttpAuthUsernamePassword(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" deprecated="26"/>
+ <method name="setInitialScale(I)V"/>
+ <method name="setMapTrackballToArrowKeys(Z)V" deprecated="17"/>
+ <method name="setNetworkAvailable(Z)V" since="3"/>
+ <method name="setPictureListener(Landroid/webkit/WebView$PictureListener;)V" deprecated="16"/>
+ <method name="setRendererPriorityPolicy(IZ)V" since="26"/>
+ <method name="setVerticalScrollbarOverlay(Z)V" deprecated="23"/>
+ <method name="setWebChromeClient(Landroid/webkit/WebChromeClient;)V"/>
+ <method name="setWebContentsDebuggingEnabled(Z)V" since="19"/>
+ <method name="setWebViewClient(Landroid/webkit/WebViewClient;)V"/>
+ <method name="showFindDialog(Ljava/lang/String;Z)Z" since="11" deprecated="18"/>
+ <method name="stopLoading()V"/>
+ <method name="zoomBy(F)V" since="21"/>
+ <method name="zoomIn()Z"/>
+ <method name="zoomOut()Z"/>
+ <field name="RENDERER_PRIORITY_BOUND" since="26"/>
+ <field name="RENDERER_PRIORITY_IMPORTANT" since="26"/>
+ <field name="RENDERER_PRIORITY_WAIVED" since="26"/>
+ <field name="SCHEME_GEO"/>
+ <field name="SCHEME_MAILTO"/>
+ <field name="SCHEME_TEL"/>
+ </class>
+ <class name="android/webkit/WebView$FindListener" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="onFindResultReceived(IIZ)V"/>
+ </class>
+ <class name="android/webkit/WebView$HitTestResult" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V" since="16"/>
+ <method name="&lt;init>(Landroid/webkit/WebView;)V" removed="16"/>
+ <method name="getExtra()Ljava/lang/String;"/>
+ <method name="getType()I"/>
+ <field name="ANCHOR_TYPE" deprecated="16"/>
+ <field name="EDIT_TEXT_TYPE"/>
+ <field name="EMAIL_TYPE"/>
+ <field name="GEO_TYPE"/>
+ <field name="IMAGE_ANCHOR_TYPE" deprecated="16"/>
+ <field name="IMAGE_TYPE"/>
+ <field name="PHONE_TYPE"/>
+ <field name="SRC_ANCHOR_TYPE"/>
+ <field name="SRC_IMAGE_ANCHOR_TYPE"/>
+ <field name="UNKNOWN_TYPE"/>
+ </class>
+ <class name="android/webkit/WebView$PictureListener" since="1" deprecated="12">
+ <extends name="java/lang/Object"/>
+ <method name="onNewPicture(Landroid/webkit/WebView;Landroid/graphics/Picture;)V" deprecated="16"/>
+ </class>
+ <class name="android/webkit/WebView$VisualStateCallback" since="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="onComplete(J)V"/>
+ </class>
+ <class name="android/webkit/WebView$WebViewTransport" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/webkit/WebView;)V"/>
+ <method name="getWebView()Landroid/webkit/WebView;"/>
+ <method name="setWebView(Landroid/webkit/WebView;)V"/>
+ </class>
+ <class name="android/webkit/WebViewClient" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="doUpdateVisitedHistory(Landroid/webkit/WebView;Ljava/lang/String;Z)V"/>
+ <method name="onFormResubmission(Landroid/webkit/WebView;Landroid/os/Message;Landroid/os/Message;)V"/>
+ <method name="onLoadResource(Landroid/webkit/WebView;Ljava/lang/String;)V"/>
+ <method name="onPageCommitVisible(Landroid/webkit/WebView;Ljava/lang/String;)V" since="23"/>
+ <method name="onPageFinished(Landroid/webkit/WebView;Ljava/lang/String;)V"/>
+ <method name="onPageStarted(Landroid/webkit/WebView;Ljava/lang/String;Landroid/graphics/Bitmap;)V"/>
+ <method name="onReceivedClientCertRequest(Landroid/webkit/WebView;Landroid/webkit/ClientCertRequest;)V" since="21"/>
+ <method name="onReceivedError(Landroid/webkit/WebView;ILjava/lang/String;Ljava/lang/String;)V" deprecated="23"/>
+ <method name="onReceivedError(Landroid/webkit/WebView;Landroid/webkit/WebResourceRequest;Landroid/webkit/WebResourceError;)V" since="23"/>
+ <method name="onReceivedHttpAuthRequest(Landroid/webkit/WebView;Landroid/webkit/HttpAuthHandler;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="onReceivedHttpError(Landroid/webkit/WebView;Landroid/webkit/WebResourceRequest;Landroid/webkit/WebResourceResponse;)V" since="23"/>
+ <method name="onReceivedLoginRequest(Landroid/webkit/WebView;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" since="12"/>
+ <method name="onReceivedSslError(Landroid/webkit/WebView;Landroid/webkit/SslErrorHandler;Landroid/net/http/SslError;)V" since="8"/>
+ <method name="onRenderProcessGone(Landroid/webkit/WebView;Landroid/webkit/RenderProcessGoneDetail;)Z" since="26"/>
+ <method name="onScaleChanged(Landroid/webkit/WebView;FF)V"/>
+ <method name="onTooManyRedirects(Landroid/webkit/WebView;Landroid/os/Message;Landroid/os/Message;)V" deprecated="16"/>
+ <method name="onUnhandledInputEvent(Landroid/webkit/WebView;Landroid/view/InputEvent;)V" since="21" removed="24"/>
+ <method name="onUnhandledKeyEvent(Landroid/webkit/WebView;Landroid/view/KeyEvent;)V" deprecated="21"/>
+ <method name="shouldInterceptRequest(Landroid/webkit/WebView;Landroid/webkit/WebResourceRequest;)Landroid/webkit/WebResourceResponse;" since="21"/>
+ <method name="shouldInterceptRequest(Landroid/webkit/WebView;Ljava/lang/String;)Landroid/webkit/WebResourceResponse;" since="11" deprecated="21"/>
+ <method name="shouldOverrideKeyEvent(Landroid/webkit/WebView;Landroid/view/KeyEvent;)Z"/>
+ <method name="shouldOverrideUrlLoading(Landroid/webkit/WebView;Landroid/webkit/WebResourceRequest;)Z" since="24"/>
+ <method name="shouldOverrideUrlLoading(Landroid/webkit/WebView;Ljava/lang/String;)Z" deprecated="24"/>
+ <field name="ERROR_AUTHENTICATION" since="5"/>
+ <field name="ERROR_BAD_URL" since="5"/>
+ <field name="ERROR_CONNECT" since="5"/>
+ <field name="ERROR_FAILED_SSL_HANDSHAKE" since="5"/>
+ <field name="ERROR_FILE" since="5"/>
+ <field name="ERROR_FILE_NOT_FOUND" since="5"/>
+ <field name="ERROR_HOST_LOOKUP" since="5"/>
+ <field name="ERROR_IO" since="5"/>
+ <field name="ERROR_PROXY_AUTHENTICATION" since="5"/>
+ <field name="ERROR_REDIRECT_LOOP" since="5"/>
+ <field name="ERROR_TIMEOUT" since="5"/>
+ <field name="ERROR_TOO_MANY_REQUESTS" since="5"/>
+ <field name="ERROR_UNKNOWN" since="5"/>
+ <field name="ERROR_UNSAFE_RESOURCE" since="26"/>
+ <field name="ERROR_UNSUPPORTED_AUTH_SCHEME" since="5"/>
+ <field name="ERROR_UNSUPPORTED_SCHEME" since="5"/>
+ </class>
+ <class name="android/webkit/WebViewDatabase" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="clearFormData()V" deprecated="26"/>
+ <method name="clearHttpAuthUsernamePassword()V"/>
+ <method name="clearUsernamePassword()V" deprecated="18"/>
+ <method name="getHttpAuthUsernamePassword(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;" since="26"/>
+ <method name="getInstance(Landroid/content/Context;)Landroid/webkit/WebViewDatabase;"/>
+ <method name="hasFormData()Z" deprecated="26"/>
+ <method name="hasHttpAuthUsernamePassword()Z"/>
+ <method name="hasUsernamePassword()Z" deprecated="18"/>
+ <method name="setHttpAuthUsernamePassword(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" since="26"/>
+ <field name="LOGTAG" removed="17"/>
+ </class>
+ <class name="android/webkit/WebViewFragment" since="11">
+ <extends name="android/app/Fragment"/>
+ <method name="&lt;init>()V"/>
+ <method name="getWebView()Landroid/webkit/WebView;"/>
+ </class>
+ <class name="android/widget/AbsListView" since="1">
+ <extends name="android/widget/AdapterView"/>
+ <implements name="android/text/TextWatcher"/>
+ <implements name="android/view/ViewTreeObserver$OnGlobalLayoutListener"/>
+ <implements name="android/view/ViewTreeObserver$OnTouchModeChangeListener"/>
+ <implements name="android/widget/Filter$FilterListener"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="canScrollList(I)Z" since="19"/>
+ <method name="clearChoices()V" since="11"/>
+ <method name="clearTextFilter()V"/>
+ <method name="deferNotifyDataSetChanged()V" since="14"/>
+ <method name="fling(I)V" since="21"/>
+ <method name="generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/AbsListView$LayoutParams;"/>
+ <method name="getCacheColorHint()I"/>
+ <method name="getCheckedItemCount()I" since="11"/>
+ <method name="getCheckedItemIds()[J" since="11"/>
+ <method name="getCheckedItemPosition()I" since="11"/>
+ <method name="getCheckedItemPositions()Landroid/util/SparseBooleanArray;" since="11"/>
+ <method name="getChoiceMode()I" since="11"/>
+ <method name="getListPaddingBottom()I"/>
+ <method name="getListPaddingLeft()I"/>
+ <method name="getListPaddingRight()I"/>
+ <method name="getListPaddingTop()I"/>
+ <method name="getSelector()Landroid/graphics/drawable/Drawable;"/>
+ <method name="getTextFilter()Ljava/lang/CharSequence;" since="3"/>
+ <method name="getTranscriptMode()I"/>
+ <method name="handleDataChanged()V"/>
+ <method name="hasTextFilter()Z"/>
+ <method name="invalidateViews()V"/>
+ <method name="isFastScrollAlwaysVisible()Z" since="11"/>
+ <method name="isFastScrollEnabled()Z" since="3"/>
+ <method name="isInFilterMode()Z"/>
+ <method name="isItemChecked(I)Z" since="11"/>
+ <method name="isScrollingCacheEnabled()Z"/>
+ <method name="isSmoothScrollbarEnabled()Z" since="3"/>
+ <method name="isStackFromBottom()Z"/>
+ <method name="isTextFilterEnabled()Z"/>
+ <method name="layoutChildren()V"/>
+ <method name="onInitializeAccessibilityNodeInfoForItem(Landroid/view/View;ILandroid/view/accessibility/AccessibilityNodeInfo;)V" since="19"/>
+ <method name="onRemoteAdapterConnected()Z" since="11"/>
+ <method name="onRemoteAdapterDisconnected()V" since="11"/>
+ <method name="pointToPosition(II)I"/>
+ <method name="pointToRowId(II)J"/>
+ <method name="reclaimViews(Ljava/util/List;)V"/>
+ <method name="scrollListBy(I)V" since="19"/>
+ <method name="setAdapter(Landroid/widget/ListAdapter;)V" since="11"/>
+ <method name="setCacheColorHint(I)V"/>
+ <method name="setChoiceMode(I)V" since="11"/>
+ <method name="setDrawSelectorOnTop(Z)V"/>
+ <method name="setFastScrollAlwaysVisible(Z)V" since="11"/>
+ <method name="setFastScrollEnabled(Z)V" since="3"/>
+ <method name="setFastScrollStyle(I)V" since="21"/>
+ <method name="setFilterText(Ljava/lang/String;)V"/>
+ <method name="setFriction(F)V" since="11"/>
+ <method name="setItemChecked(IZ)V" since="11"/>
+ <method name="setMultiChoiceModeListener(Landroid/widget/AbsListView$MultiChoiceModeListener;)V" since="11"/>
+ <method name="setOnScrollListener(Landroid/widget/AbsListView$OnScrollListener;)V"/>
+ <method name="setRecyclerListener(Landroid/widget/AbsListView$RecyclerListener;)V"/>
+ <method name="setRemoteViewsAdapter(Landroid/content/Intent;)V" since="11"/>
+ <method name="setScrollIndicators(Landroid/view/View;Landroid/view/View;)V"/>
+ <method name="setScrollingCacheEnabled(Z)V"/>
+ <method name="setSelectionFromTop(II)V" since="21"/>
+ <method name="setSelector(I)V"/>
+ <method name="setSelector(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setSmoothScrollbarEnabled(Z)V" since="3"/>
+ <method name="setStackFromBottom(Z)V"/>
+ <method name="setTextFilterEnabled(Z)V"/>
+ <method name="setTranscriptMode(I)V"/>
+ <method name="setVelocityScale(F)V" since="11"/>
+ <method name="smoothScrollBy(II)V" since="8"/>
+ <method name="smoothScrollToPosition(I)V" since="8"/>
+ <method name="smoothScrollToPosition(II)V" since="8"/>
+ <method name="smoothScrollToPositionFromTop(II)V" since="11"/>
+ <method name="smoothScrollToPositionFromTop(III)V" since="11"/>
+ <field name="CHOICE_MODE_MULTIPLE" since="11"/>
+ <field name="CHOICE_MODE_MULTIPLE_MODAL" since="11"/>
+ <field name="CHOICE_MODE_NONE" since="11"/>
+ <field name="CHOICE_MODE_SINGLE" since="11"/>
+ <field name="TRANSCRIPT_MODE_ALWAYS_SCROLL"/>
+ <field name="TRANSCRIPT_MODE_DISABLED"/>
+ <field name="TRANSCRIPT_MODE_NORMAL"/>
+ </class>
+ <class name="android/widget/AbsListView$LayoutParams" since="1">
+ <extends name="android/view/ViewGroup$LayoutParams"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="&lt;init>(III)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V"/>
+ </class>
+ <class name="android/widget/AbsListView$MultiChoiceModeListener" since="11">
+ <extends name="java/lang/Object"/>
+ <implements name="android/view/ActionMode$Callback"/>
+ <method name="onItemCheckedStateChanged(Landroid/view/ActionMode;IJZ)V"/>
+ </class>
+ <class name="android/widget/AbsListView$OnScrollListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onScroll(Landroid/widget/AbsListView;III)V"/>
+ <method name="onScrollStateChanged(Landroid/widget/AbsListView;I)V"/>
+ <field name="SCROLL_STATE_FLING"/>
+ <field name="SCROLL_STATE_IDLE"/>
+ <field name="SCROLL_STATE_TOUCH_SCROLL"/>
+ </class>
+ <class name="android/widget/AbsListView$RecyclerListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onMovedToScrapHeap(Landroid/view/View;)V"/>
+ </class>
+ <class name="android/widget/AbsListView$SelectionBoundsAdjuster" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="adjustListItemSelectionBounds(Landroid/graphics/Rect;)V"/>
+ </class>
+ <class name="android/widget/AbsSeekBar" since="1">
+ <extends name="android/widget/ProgressBar"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getKeyProgressIncrement()I" since="3"/>
+ <method name="getSplitTrack()Z" since="21"/>
+ <method name="getThumb()Landroid/graphics/drawable/Drawable;" since="16"/>
+ <method name="getThumbOffset()I"/>
+ <method name="getThumbTintList()Landroid/content/res/ColorStateList;" since="21"/>
+ <method name="getThumbTintMode()Landroid/graphics/PorterDuff$Mode;" since="21"/>
+ <method name="getTickMark()Landroid/graphics/drawable/Drawable;" since="24"/>
+ <method name="getTickMarkTintList()Landroid/content/res/ColorStateList;" since="24"/>
+ <method name="getTickMarkTintMode()Landroid/graphics/PorterDuff$Mode;" since="24"/>
+ <method name="setKeyProgressIncrement(I)V" since="3"/>
+ <method name="setSplitTrack(Z)V" since="21"/>
+ <method name="setThumb(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setThumbOffset(I)V"/>
+ <method name="setThumbTintList(Landroid/content/res/ColorStateList;)V" since="21"/>
+ <method name="setThumbTintMode(Landroid/graphics/PorterDuff$Mode;)V" since="21"/>
+ <method name="setTickMark(Landroid/graphics/drawable/Drawable;)V" since="24"/>
+ <method name="setTickMarkTintList(Landroid/content/res/ColorStateList;)V" since="24"/>
+ <method name="setTickMarkTintMode(Landroid/graphics/PorterDuff$Mode;)V" since="24"/>
+ </class>
+ <class name="android/widget/AbsSpinner" since="1">
+ <extends name="android/widget/AdapterView"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getAdapter()Landroid/widget/SpinnerAdapter;"/>
+ <method name="pointToPosition(II)I"/>
+ <method name="setAdapter(Landroid/widget/SpinnerAdapter;)V"/>
+ <method name="setSelection(IZ)V"/>
+ </class>
+ <class name="android/widget/AbsoluteLayout" since="1" deprecated="3">
+ <extends name="android/view/ViewGroup"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ </class>
+ <class name="android/widget/AbsoluteLayout$LayoutParams" since="1">
+ <extends name="android/view/ViewGroup$LayoutParams"/>
+ <method name="&lt;init>(IIII)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V"/>
+ <method name="debug(Ljava/lang/String;)Ljava/lang/String;"/>
+ <field name="x"/>
+ <field name="y"/>
+ </class>
+ <class name="android/widget/ActionMenuView" since="21">
+ <extends name="android/widget/LinearLayout"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="dismissPopupMenus()V"/>
+ <method name="generateDefaultLayoutParams()Landroid/widget/ActionMenuView$LayoutParams;"/>
+ <method name="generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/ActionMenuView$LayoutParams;"/>
+ <method name="generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroid/widget/ActionMenuView$LayoutParams;"/>
+ <method name="getMenu()Landroid/view/Menu;"/>
+ <method name="getOverflowIcon()Landroid/graphics/drawable/Drawable;" since="23"/>
+ <method name="getPopupTheme()I"/>
+ <method name="hideOverflowMenu()Z"/>
+ <method name="isOverflowMenuShowing()Z"/>
+ <method name="setOnMenuItemClickListener(Landroid/widget/ActionMenuView$OnMenuItemClickListener;)V"/>
+ <method name="setOverflowIcon(Landroid/graphics/drawable/Drawable;)V" since="23"/>
+ <method name="setPopupTheme(I)V"/>
+ <method name="showOverflowMenu()Z"/>
+ </class>
+ <class name="android/widget/ActionMenuView$LayoutParams" since="21">
+ <extends name="android/widget/LinearLayout$LayoutParams"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V"/>
+ <method name="&lt;init>(Landroid/widget/ActionMenuView$LayoutParams;)V"/>
+ </class>
+ <class name="android/widget/ActionMenuView$OnMenuItemClickListener" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="onMenuItemClick(Landroid/view/MenuItem;)Z"/>
+ </class>
+ <class name="android/widget/Adapter" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getAutofillOptions()[Ljava/lang/CharSequence;" since="26"/>
+ <method name="getCount()I"/>
+ <method name="getItem(I)Ljava/lang/Object;"/>
+ <method name="getItemId(I)J"/>
+ <method name="getItemViewType(I)I"/>
+ <method name="getView(ILandroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View;"/>
+ <method name="getViewTypeCount()I"/>
+ <method name="hasStableIds()Z"/>
+ <method name="isEmpty()Z"/>
+ <method name="registerDataSetObserver(Landroid/database/DataSetObserver;)V"/>
+ <method name="unregisterDataSetObserver(Landroid/database/DataSetObserver;)V"/>
+ <field name="IGNORE_ITEM_VIEW_TYPE"/>
+ <field name="NO_SELECTION"/>
+ </class>
+ <class name="android/widget/AdapterView" since="1">
+ <extends name="android/view/ViewGroup"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getAdapter()Landroid/widget/Adapter;"/>
+ <method name="getCount()I"/>
+ <method name="getEmptyView()Landroid/view/View;"/>
+ <method name="getFirstVisiblePosition()I"/>
+ <method name="getItemAtPosition(I)Ljava/lang/Object;"/>
+ <method name="getItemIdAtPosition(I)J"/>
+ <method name="getLastVisiblePosition()I"/>
+ <method name="getOnItemClickListener()Landroid/widget/AdapterView$OnItemClickListener;"/>
+ <method name="getOnItemLongClickListener()Landroid/widget/AdapterView$OnItemLongClickListener;"/>
+ <method name="getOnItemSelectedListener()Landroid/widget/AdapterView$OnItemSelectedListener;"/>
+ <method name="getPositionForView(Landroid/view/View;)I"/>
+ <method name="getSelectedItem()Ljava/lang/Object;"/>
+ <method name="getSelectedItemId()J"/>
+ <method name="getSelectedItemPosition()I"/>
+ <method name="getSelectedView()Landroid/view/View;"/>
+ <method name="performItemClick(Landroid/view/View;IJ)Z"/>
+ <method name="setAdapter(Landroid/widget/Adapter;)V"/>
+ <method name="setEmptyView(Landroid/view/View;)V"/>
+ <method name="setOnItemClickListener(Landroid/widget/AdapterView$OnItemClickListener;)V"/>
+ <method name="setOnItemLongClickListener(Landroid/widget/AdapterView$OnItemLongClickListener;)V"/>
+ <method name="setOnItemSelectedListener(Landroid/widget/AdapterView$OnItemSelectedListener;)V"/>
+ <method name="setSelection(I)V"/>
+ <field name="INVALID_POSITION"/>
+ <field name="INVALID_ROW_ID"/>
+ <field name="ITEM_VIEW_TYPE_HEADER_OR_FOOTER"/>
+ <field name="ITEM_VIEW_TYPE_IGNORE"/>
+ </class>
+ <class name="android/widget/AdapterView$AdapterContextMenuInfo" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/view/ContextMenu$ContextMenuInfo"/>
+ <method name="&lt;init>(Landroid/view/View;IJ)V"/>
+ <field name="id"/>
+ <field name="position"/>
+ <field name="targetView"/>
+ </class>
+ <class name="android/widget/AdapterView$OnItemClickListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onItemClick(Landroid/widget/AdapterView;Landroid/view/View;IJ)V"/>
+ </class>
+ <class name="android/widget/AdapterView$OnItemLongClickListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onItemLongClick(Landroid/widget/AdapterView;Landroid/view/View;IJ)Z"/>
+ </class>
+ <class name="android/widget/AdapterView$OnItemSelectedListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onItemSelected(Landroid/widget/AdapterView;Landroid/view/View;IJ)V"/>
+ <method name="onNothingSelected(Landroid/widget/AdapterView;)V"/>
+ </class>
+ <class name="android/widget/AdapterViewAnimator" since="11">
+ <extends name="android/widget/AdapterView"/>
+ <implements name="android/widget/Advanceable" since="16"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" since="14"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="advance()V"/>
+ <method name="deferNotifyDataSetChanged()V" since="14"/>
+ <method name="fyiWillBeAdvancedByHostKThx()V"/>
+ <method name="getCurrentView()Landroid/view/View;"/>
+ <method name="getDisplayedChild()I"/>
+ <method name="getInAnimation()Landroid/animation/ObjectAnimator;"/>
+ <method name="getOutAnimation()Landroid/animation/ObjectAnimator;"/>
+ <method name="onRemoteAdapterConnected()Z"/>
+ <method name="onRemoteAdapterDisconnected()V"/>
+ <method name="setAnimateFirstView(Z)V"/>
+ <method name="setDisplayedChild(I)V"/>
+ <method name="setInAnimation(Landroid/animation/ObjectAnimator;)V"/>
+ <method name="setInAnimation(Landroid/content/Context;I)V"/>
+ <method name="setOutAnimation(Landroid/animation/ObjectAnimator;)V"/>
+ <method name="setOutAnimation(Landroid/content/Context;I)V"/>
+ <method name="setRemoteViewsAdapter(Landroid/content/Intent;)V"/>
+ <method name="showNext()V"/>
+ <method name="showPrevious()V"/>
+ </class>
+ <class name="android/widget/AdapterViewFlipper" since="11">
+ <extends name="android/widget/AdapterViewAnimator"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" since="21"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getFlipInterval()I" since="16"/>
+ <method name="isAutoStart()Z"/>
+ <method name="isFlipping()Z"/>
+ <method name="setAutoStart(Z)V"/>
+ <method name="setFlipInterval(I)V"/>
+ <method name="startFlipping()V"/>
+ <method name="stopFlipping()V"/>
+ </class>
+ <class name="android/widget/Advanceable" since="16">
+ <extends name="java/lang/Object"/>
+ <method name="advance()V"/>
+ <method name="fyiWillBeAdvancedByHostKThx()V"/>
+ </class>
+ <class name="android/widget/AlphabetIndexer" since="3">
+ <extends name="android/database/DataSetObserver"/>
+ <implements name="android/widget/SectionIndexer"/>
+ <method name="&lt;init>(Landroid/database/Cursor;ILjava/lang/CharSequence;)V"/>
+ <method name="compare(Ljava/lang/String;Ljava/lang/String;)I"/>
+ <method name="setCursor(Landroid/database/Cursor;)V"/>
+ <field name="mAlphabet"/>
+ <field name="mColumnIndex"/>
+ <field name="mDataCursor"/>
+ </class>
+ <class name="android/widget/AnalogClock" since="1" deprecated="23">
+ <extends name="android/view/View"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ </class>
+ <class name="android/widget/ArrayAdapter" since="1">
+ <extends name="android/widget/BaseAdapter"/>
+ <implements name="android/widget/Filterable"/>
+ <implements name="android/widget/ThemedSpinnerAdapter" since="23"/>
+ <method name="&lt;init>(Landroid/content/Context;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;II)V"/>
+ <method name="&lt;init>(Landroid/content/Context;IILjava/util/List;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;II[Ljava/lang/Object;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;ILjava/util/List;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;I[Ljava/lang/Object;)V"/>
+ <method name="add(Ljava/lang/Object;)V"/>
+ <method name="addAll(Ljava/util/Collection;)V" since="11"/>
+ <method name="addAll([Ljava/lang/Object;)V" since="11"/>
+ <method name="clear()V"/>
+ <method name="createFromResource(Landroid/content/Context;II)Landroid/widget/ArrayAdapter;"/>
+ <method name="getContext()Landroid/content/Context;"/>
+ <method name="getPosition(Ljava/lang/Object;)I"/>
+ <method name="insert(Ljava/lang/Object;I)V"/>
+ <method name="remove(Ljava/lang/Object;)V"/>
+ <method name="setDropDownViewResource(I)V"/>
+ <method name="setNotifyOnChange(Z)V"/>
+ <method name="sort(Ljava/util/Comparator;)V" since="3"/>
+ </class>
+ <class name="android/widget/AutoCompleteTextView" since="1">
+ <extends name="android/widget/EditText"/>
+ <implements name="android/widget/Filter$FilterListener"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;IILandroid/content/res/Resources$Theme;)V" since="24"/>
+ <method name="clearListSelection()V" since="3"/>
+ <method name="convertSelectionToString(Ljava/lang/Object;)Ljava/lang/CharSequence;"/>
+ <method name="dismissDropDown()V"/>
+ <method name="enoughToFilter()Z"/>
+ <method name="getAdapter()Landroid/widget/ListAdapter;"/>
+ <method name="getCompletionHint()Ljava/lang/CharSequence;" since="16"/>
+ <method name="getDropDownAnchor()I" since="3"/>
+ <method name="getDropDownBackground()Landroid/graphics/drawable/Drawable;" since="5"/>
+ <method name="getDropDownHeight()I" since="4"/>
+ <method name="getDropDownHorizontalOffset()I" since="5"/>
+ <method name="getDropDownVerticalOffset()I" since="5"/>
+ <method name="getDropDownWidth()I" since="3"/>
+ <method name="getFilter()Landroid/widget/Filter;"/>
+ <method name="getItemClickListener()Landroid/widget/AdapterView$OnItemClickListener;" deprecated="16"/>
+ <method name="getItemSelectedListener()Landroid/widget/AdapterView$OnItemSelectedListener;" deprecated="16"/>
+ <method name="getListSelection()I" since="3"/>
+ <method name="getOnItemClickListener()Landroid/widget/AdapterView$OnItemClickListener;" since="3"/>
+ <method name="getOnItemSelectedListener()Landroid/widget/AdapterView$OnItemSelectedListener;" since="3"/>
+ <method name="getThreshold()I"/>
+ <method name="getValidator()Landroid/widget/AutoCompleteTextView$Validator;"/>
+ <method name="isPerformingCompletion()Z" since="3"/>
+ <method name="isPopupShowing()Z"/>
+ <method name="performCompletion()V"/>
+ <method name="performFiltering(Ljava/lang/CharSequence;I)V"/>
+ <method name="performValidation()V"/>
+ <method name="replaceText(Ljava/lang/CharSequence;)V"/>
+ <method name="setAdapter(Landroid/widget/ListAdapter;)V"/>
+ <method name="setCompletionHint(Ljava/lang/CharSequence;)V"/>
+ <method name="setDropDownAnchor(I)V" since="3"/>
+ <method name="setDropDownBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V" since="5"/>
+ <method name="setDropDownBackgroundResource(I)V" since="5"/>
+ <method name="setDropDownHeight(I)V" since="4"/>
+ <method name="setDropDownHorizontalOffset(I)V" since="5"/>
+ <method name="setDropDownVerticalOffset(I)V" since="5"/>
+ <method name="setDropDownWidth(I)V" since="3"/>
+ <method name="setListSelection(I)V" since="3"/>
+ <method name="setOnDismissListener(Landroid/widget/AutoCompleteTextView$OnDismissListener;)V" since="17"/>
+ <method name="setOnItemClickListener(Landroid/widget/AdapterView$OnItemClickListener;)V"/>
+ <method name="setOnItemSelectedListener(Landroid/widget/AdapterView$OnItemSelectedListener;)V"/>
+ <method name="setText(Ljava/lang/CharSequence;Z)V" since="17"/>
+ <method name="setThreshold(I)V"/>
+ <method name="setValidator(Landroid/widget/AutoCompleteTextView$Validator;)V"/>
+ <method name="showDropDown()V"/>
+ </class>
+ <class name="android/widget/AutoCompleteTextView$OnDismissListener" since="17">
+ <extends name="java/lang/Object"/>
+ <method name="onDismiss()V"/>
+ </class>
+ <class name="android/widget/AutoCompleteTextView$Validator" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="fixText(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;"/>
+ <method name="isValid(Ljava/lang/CharSequence;)Z"/>
+ </class>
+ <class name="android/widget/BaseAdapter" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/widget/ListAdapter"/>
+ <implements name="android/widget/SpinnerAdapter"/>
+ <method name="&lt;init>()V"/>
+ <method name="notifyDataSetChanged()V"/>
+ <method name="notifyDataSetInvalidated()V"/>
+ </class>
+ <class name="android/widget/BaseExpandableListAdapter" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/widget/ExpandableListAdapter"/>
+ <implements name="android/widget/HeterogeneousExpandableList" since="8"/>
+ <method name="&lt;init>()V"/>
+ <method name="notifyDataSetChanged()V"/>
+ <method name="notifyDataSetInvalidated()V"/>
+ </class>
+ <class name="android/widget/Button" since="1">
+ <extends name="android/widget/TextView"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ </class>
+ <class name="android/widget/CalendarView" since="11">
+ <extends name="android/widget/FrameLayout"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getDate()J"/>
+ <method name="getDateTextAppearance()I" since="16"/>
+ <method name="getFirstDayOfWeek()I"/>
+ <method name="getFocusedMonthDateColor()I" since="16" deprecated="23"/>
+ <method name="getMaxDate()J"/>
+ <method name="getMinDate()J"/>
+ <method name="getSelectedDateVerticalBar()Landroid/graphics/drawable/Drawable;" since="16" deprecated="23"/>
+ <method name="getSelectedWeekBackgroundColor()I" since="16" deprecated="23"/>
+ <method name="getShowWeekNumber()Z" deprecated="24"/>
+ <method name="getShownWeekCount()I" since="16" deprecated="23"/>
+ <method name="getUnfocusedMonthDateColor()I" since="16" deprecated="23"/>
+ <method name="getWeekDayTextAppearance()I" since="16"/>
+ <method name="getWeekNumberColor()I" since="16" deprecated="23"/>
+ <method name="getWeekSeparatorLineColor()I" since="16" deprecated="23"/>
+ <method name="setDate(J)V"/>
+ <method name="setDate(JZZ)V"/>
+ <method name="setDateTextAppearance(I)V" since="16"/>
+ <method name="setFirstDayOfWeek(I)V"/>
+ <method name="setFocusedMonthDateColor(I)V" since="16" deprecated="23"/>
+ <method name="setMaxDate(J)V"/>
+ <method name="setMinDate(J)V"/>
+ <method name="setOnDateChangeListener(Landroid/widget/CalendarView$OnDateChangeListener;)V"/>
+ <method name="setSelectedDateVerticalBar(I)V" since="16" deprecated="23"/>
+ <method name="setSelectedDateVerticalBar(Landroid/graphics/drawable/Drawable;)V" since="16" deprecated="23"/>
+ <method name="setSelectedWeekBackgroundColor(I)V" since="16" deprecated="23"/>
+ <method name="setShowWeekNumber(Z)V" deprecated="24"/>
+ <method name="setShownWeekCount(I)V" since="16" deprecated="23"/>
+ <method name="setUnfocusedMonthDateColor(I)V" since="16" deprecated="23"/>
+ <method name="setWeekDayTextAppearance(I)V" since="16"/>
+ <method name="setWeekNumberColor(I)V" since="16" deprecated="23"/>
+ <method name="setWeekSeparatorLineColor(I)V" since="16" deprecated="23"/>
+ </class>
+ <class name="android/widget/CalendarView$OnDateChangeListener" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="onSelectedDayChange(Landroid/widget/CalendarView;III)V"/>
+ </class>
+ <class name="android/widget/CheckBox" since="1">
+ <extends name="android/widget/CompoundButton"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ </class>
+ <class name="android/widget/Checkable" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="isChecked()Z"/>
+ <method name="setChecked(Z)V"/>
+ <method name="toggle()V"/>
+ </class>
+ <class name="android/widget/CheckedTextView" since="1">
+ <extends name="android/widget/TextView"/>
+ <implements name="android/widget/Checkable"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getCheckMarkDrawable()Landroid/graphics/drawable/Drawable;" since="16"/>
+ <method name="getCheckMarkTintList()Landroid/content/res/ColorStateList;" since="21"/>
+ <method name="getCheckMarkTintMode()Landroid/graphics/PorterDuff$Mode;" since="21"/>
+ <method name="onPaddingChanged(I)V" since="16" removed="17"/>
+ <method name="setCheckMarkDrawable(I)V"/>
+ <method name="setCheckMarkDrawable(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setCheckMarkTintList(Landroid/content/res/ColorStateList;)V" since="21"/>
+ <method name="setCheckMarkTintMode(Landroid/graphics/PorterDuff$Mode;)V" since="21"/>
+ </class>
+ <class name="android/widget/Chronometer" since="1">
+ <extends name="android/widget/TextView"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getBase()J"/>
+ <method name="getFormat()Ljava/lang/String;"/>
+ <method name="getOnChronometerTickListener()Landroid/widget/Chronometer$OnChronometerTickListener;" since="3"/>
+ <method name="isCountDown()Z" since="24"/>
+ <method name="isTheFinalCountDown()Z" since="26"/>
+ <method name="setBase(J)V"/>
+ <method name="setCountDown(Z)V" since="24"/>
+ <method name="setFormat(Ljava/lang/String;)V"/>
+ <method name="setOnChronometerTickListener(Landroid/widget/Chronometer$OnChronometerTickListener;)V" since="3"/>
+ <method name="start()V"/>
+ <method name="stop()V"/>
+ </class>
+ <class name="android/widget/Chronometer$OnChronometerTickListener" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="onChronometerTick(Landroid/widget/Chronometer;)V"/>
+ </class>
+ <class name="android/widget/CompoundButton" since="1">
+ <extends name="android/widget/Button"/>
+ <implements name="android/widget/Checkable"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getButtonDrawable()Landroid/graphics/drawable/Drawable;" since="23"/>
+ <method name="getButtonTintList()Landroid/content/res/ColorStateList;" since="21"/>
+ <method name="getButtonTintMode()Landroid/graphics/PorterDuff$Mode;" since="21"/>
+ <method name="setButtonDrawable(I)V"/>
+ <method name="setButtonDrawable(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setButtonTintList(Landroid/content/res/ColorStateList;)V" since="21"/>
+ <method name="setButtonTintMode(Landroid/graphics/PorterDuff$Mode;)V" since="21"/>
+ <method name="setOnCheckedChangeListener(Landroid/widget/CompoundButton$OnCheckedChangeListener;)V"/>
+ </class>
+ <class name="android/widget/CompoundButton$OnCheckedChangeListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onCheckedChanged(Landroid/widget/CompoundButton;Z)V"/>
+ </class>
+ <class name="android/widget/CursorAdapter" since="1">
+ <extends name="android/widget/BaseAdapter"/>
+ <implements name="android/widget/Filterable"/>
+ <implements name="android/widget/ThemedSpinnerAdapter" since="23"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/database/Cursor;)V" deprecated="16"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/database/Cursor;I)V" since="11"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/database/Cursor;Z)V"/>
+ <method name="bindView(Landroid/view/View;Landroid/content/Context;Landroid/database/Cursor;)V"/>
+ <method name="changeCursor(Landroid/database/Cursor;)V"/>
+ <method name="convertToString(Landroid/database/Cursor;)Ljava/lang/CharSequence;"/>
+ <method name="getCursor()Landroid/database/Cursor;"/>
+ <method name="getFilterQueryProvider()Landroid/widget/FilterQueryProvider;"/>
+ <method name="init(Landroid/content/Context;Landroid/database/Cursor;Z)V" deprecated="16"/>
+ <method name="newDropDownView(Landroid/content/Context;Landroid/database/Cursor;Landroid/view/ViewGroup;)Landroid/view/View;"/>
+ <method name="newView(Landroid/content/Context;Landroid/database/Cursor;Landroid/view/ViewGroup;)Landroid/view/View;"/>
+ <method name="onContentChanged()V" since="3"/>
+ <method name="runQueryOnBackgroundThread(Ljava/lang/CharSequence;)Landroid/database/Cursor;"/>
+ <method name="setFilterQueryProvider(Landroid/widget/FilterQueryProvider;)V"/>
+ <method name="swapCursor(Landroid/database/Cursor;)Landroid/database/Cursor;" since="11"/>
+ <field name="FLAG_AUTO_REQUERY" since="11" deprecated="16"/>
+ <field name="FLAG_REGISTER_CONTENT_OBSERVER" since="11"/>
+ </class>
+ <class name="android/widget/CursorTreeAdapter" since="1">
+ <extends name="android/widget/BaseExpandableListAdapter"/>
+ <implements name="android/widget/Filterable"/>
+ <method name="&lt;init>(Landroid/database/Cursor;Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/database/Cursor;Landroid/content/Context;Z)V"/>
+ <method name="bindChildView(Landroid/view/View;Landroid/content/Context;Landroid/database/Cursor;Z)V"/>
+ <method name="bindGroupView(Landroid/view/View;Landroid/content/Context;Landroid/database/Cursor;Z)V"/>
+ <method name="changeCursor(Landroid/database/Cursor;)V"/>
+ <method name="convertToString(Landroid/database/Cursor;)Ljava/lang/String;"/>
+ <method name="getChild(II)Landroid/database/Cursor;"/>
+ <method name="getChildrenCursor(Landroid/database/Cursor;)Landroid/database/Cursor;"/>
+ <method name="getCursor()Landroid/database/Cursor;"/>
+ <method name="getFilterQueryProvider()Landroid/widget/FilterQueryProvider;"/>
+ <method name="getGroup(I)Landroid/database/Cursor;"/>
+ <method name="newChildView(Landroid/content/Context;Landroid/database/Cursor;ZLandroid/view/ViewGroup;)Landroid/view/View;"/>
+ <method name="newGroupView(Landroid/content/Context;Landroid/database/Cursor;ZLandroid/view/ViewGroup;)Landroid/view/View;"/>
+ <method name="notifyDataSetChanged(Z)V"/>
+ <method name="runQueryOnBackgroundThread(Ljava/lang/CharSequence;)Landroid/database/Cursor;"/>
+ <method name="setChildrenCursor(ILandroid/database/Cursor;)V"/>
+ <method name="setFilterQueryProvider(Landroid/widget/FilterQueryProvider;)V"/>
+ <method name="setGroupCursor(Landroid/database/Cursor;)V"/>
+ </class>
+ <class name="android/widget/DatePicker" since="1">
+ <extends name="android/widget/FrameLayout"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getCalendarView()Landroid/widget/CalendarView;" since="12" deprecated="24"/>
+ <method name="getCalendarViewShown()Z" since="11" deprecated="24"/>
+ <method name="getDayOfMonth()I"/>
+ <method name="getFirstDayOfWeek()I" since="21"/>
+ <method name="getMaxDate()J" since="11"/>
+ <method name="getMinDate()J" since="11"/>
+ <method name="getMonth()I"/>
+ <method name="getSpinnersShown()Z" since="11" deprecated="24"/>
+ <method name="getYear()I"/>
+ <method name="init(IIILandroid/widget/DatePicker$OnDateChangedListener;)V"/>
+ <method name="setCalendarViewShown(Z)V" since="11" deprecated="24"/>
+ <method name="setFirstDayOfWeek(I)V" since="21"/>
+ <method name="setMaxDate(J)V" since="11"/>
+ <method name="setMinDate(J)V" since="11"/>
+ <method name="setOnDateChangedListener(Landroid/widget/DatePicker$OnDateChangedListener;)V" since="26"/>
+ <method name="setSpinnersShown(Z)V" since="11" deprecated="24"/>
+ <method name="updateDate(III)V"/>
+ </class>
+ <class name="android/widget/DatePicker$OnDateChangedListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onDateChanged(Landroid/widget/DatePicker;III)V"/>
+ </class>
+ <class name="android/widget/DialerFilter" since="1" deprecated="26">
+ <extends name="android/widget/RelativeLayout"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="append(Ljava/lang/String;)V"/>
+ <method name="clearText()V"/>
+ <method name="getDigits()Ljava/lang/CharSequence;"/>
+ <method name="getFilterText()Ljava/lang/CharSequence;"/>
+ <method name="getLetters()Ljava/lang/CharSequence;"/>
+ <method name="getMode()I"/>
+ <method name="isQwertyKeyboard()Z"/>
+ <method name="onModeChange(II)V"/>
+ <method name="removeFilterWatcher(Landroid/text/TextWatcher;)V"/>
+ <method name="setDigitsWatcher(Landroid/text/TextWatcher;)V"/>
+ <method name="setFilterWatcher(Landroid/text/TextWatcher;)V"/>
+ <method name="setLettersWatcher(Landroid/text/TextWatcher;)V"/>
+ <method name="setMode(I)V"/>
+ <field name="DIGITS_AND_LETTERS"/>
+ <field name="DIGITS_AND_LETTERS_NO_DIGITS"/>
+ <field name="DIGITS_AND_LETTERS_NO_LETTERS"/>
+ <field name="DIGITS_ONLY"/>
+ <field name="LETTERS_ONLY"/>
+ </class>
+ <class name="android/widget/DigitalClock" since="1" deprecated="17">
+ <extends name="android/widget/TextView"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ </class>
+ <class name="android/widget/EdgeEffect" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="draw(Landroid/graphics/Canvas;)Z"/>
+ <method name="finish()V"/>
+ <method name="getColor()I" since="21"/>
+ <method name="getMaxHeight()I" since="21"/>
+ <method name="isFinished()Z"/>
+ <method name="onAbsorb(I)V"/>
+ <method name="onPull(F)V"/>
+ <method name="onPull(FF)V" since="21"/>
+ <method name="onRelease()V"/>
+ <method name="setColor(I)V" since="21"/>
+ <method name="setSize(II)V"/>
+ </class>
+ <class name="android/widget/EditText" since="1">
+ <extends name="android/widget/TextView"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="extendSelection(I)V"/>
+ <method name="getText()Landroid/text/Editable;"/>
+ <method name="selectAll()V"/>
+ <method name="setSelection(I)V"/>
+ <method name="setSelection(II)V"/>
+ </class>
+ <class name="android/widget/ExpandableListAdapter" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="areAllItemsEnabled()Z"/>
+ <method name="getChild(II)Ljava/lang/Object;"/>
+ <method name="getChildId(II)J"/>
+ <method name="getChildView(IIZLandroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View;"/>
+ <method name="getChildrenCount(I)I"/>
+ <method name="getCombinedChildId(JJ)J"/>
+ <method name="getCombinedGroupId(J)J"/>
+ <method name="getGroup(I)Ljava/lang/Object;"/>
+ <method name="getGroupCount()I"/>
+ <method name="getGroupId(I)J"/>
+ <method name="getGroupView(IZLandroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View;"/>
+ <method name="hasStableIds()Z"/>
+ <method name="isChildSelectable(II)Z"/>
+ <method name="isEmpty()Z"/>
+ <method name="onGroupCollapsed(I)V"/>
+ <method name="onGroupExpanded(I)V"/>
+ <method name="registerDataSetObserver(Landroid/database/DataSetObserver;)V"/>
+ <method name="unregisterDataSetObserver(Landroid/database/DataSetObserver;)V"/>
+ </class>
+ <class name="android/widget/ExpandableListView" since="1">
+ <extends name="android/widget/ListView"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="collapseGroup(I)Z"/>
+ <method name="expandGroup(I)Z"/>
+ <method name="expandGroup(IZ)Z" since="14"/>
+ <method name="getExpandableListAdapter()Landroid/widget/ExpandableListAdapter;"/>
+ <method name="getExpandableListPosition(I)J"/>
+ <method name="getFlatListPosition(J)I"/>
+ <method name="getPackedPositionChild(J)I"/>
+ <method name="getPackedPositionForChild(II)J"/>
+ <method name="getPackedPositionForGroup(I)J"/>
+ <method name="getPackedPositionGroup(J)I"/>
+ <method name="getPackedPositionType(J)I"/>
+ <method name="getSelectedId()J"/>
+ <method name="getSelectedPosition()J"/>
+ <method name="isGroupExpanded(I)Z"/>
+ <method name="setAdapter(Landroid/widget/ExpandableListAdapter;)V"/>
+ <method name="setChildDivider(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setChildIndicator(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setChildIndicatorBounds(II)V"/>
+ <method name="setChildIndicatorBoundsRelative(II)V" since="18"/>
+ <method name="setGroupIndicator(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setIndicatorBounds(II)V"/>
+ <method name="setIndicatorBoundsRelative(II)V" since="18"/>
+ <method name="setOnChildClickListener(Landroid/widget/ExpandableListView$OnChildClickListener;)V"/>
+ <method name="setOnGroupClickListener(Landroid/widget/ExpandableListView$OnGroupClickListener;)V"/>
+ <method name="setOnGroupCollapseListener(Landroid/widget/ExpandableListView$OnGroupCollapseListener;)V"/>
+ <method name="setOnGroupExpandListener(Landroid/widget/ExpandableListView$OnGroupExpandListener;)V"/>
+ <method name="setSelectedChild(IIZ)Z"/>
+ <method name="setSelectedGroup(I)V"/>
+ <field name="CHILD_INDICATOR_INHERIT"/>
+ <field name="PACKED_POSITION_TYPE_CHILD"/>
+ <field name="PACKED_POSITION_TYPE_GROUP"/>
+ <field name="PACKED_POSITION_TYPE_NULL"/>
+ <field name="PACKED_POSITION_VALUE_NULL"/>
+ </class>
+ <class name="android/widget/ExpandableListView$ExpandableListContextMenuInfo" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/view/ContextMenu$ContextMenuInfo"/>
+ <method name="&lt;init>(Landroid/view/View;JJ)V"/>
+ <field name="id"/>
+ <field name="packedPosition"/>
+ <field name="targetView"/>
+ </class>
+ <class name="android/widget/ExpandableListView$OnChildClickListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onChildClick(Landroid/widget/ExpandableListView;Landroid/view/View;IIJ)Z"/>
+ </class>
+ <class name="android/widget/ExpandableListView$OnGroupClickListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onGroupClick(Landroid/widget/ExpandableListView;Landroid/view/View;IJ)Z"/>
+ </class>
+ <class name="android/widget/ExpandableListView$OnGroupCollapseListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onGroupCollapse(I)V"/>
+ </class>
+ <class name="android/widget/ExpandableListView$OnGroupExpandListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onGroupExpand(I)V"/>
+ </class>
+ <class name="android/widget/Filter" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="convertResultToString(Ljava/lang/Object;)Ljava/lang/CharSequence;"/>
+ <method name="filter(Ljava/lang/CharSequence;)V"/>
+ <method name="filter(Ljava/lang/CharSequence;Landroid/widget/Filter$FilterListener;)V"/>
+ <method name="performFiltering(Ljava/lang/CharSequence;)Landroid/widget/Filter$FilterResults;"/>
+ <method name="publishResults(Ljava/lang/CharSequence;Landroid/widget/Filter$FilterResults;)V"/>
+ </class>
+ <class name="android/widget/Filter$FilterListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onFilterComplete(I)V"/>
+ </class>
+ <class name="android/widget/Filter$FilterResults" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="count"/>
+ <field name="values"/>
+ </class>
+ <class name="android/widget/FilterQueryProvider" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="runQuery(Ljava/lang/CharSequence;)Landroid/database/Cursor;"/>
+ </class>
+ <class name="android/widget/Filterable" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getFilter()Landroid/widget/Filter;"/>
+ </class>
+ <class name="android/widget/FrameLayout" since="1">
+ <extends name="android/view/ViewGroup"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="generateDefaultLayoutParams()Landroid/widget/FrameLayout$LayoutParams;"/>
+ <method name="generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/FrameLayout$LayoutParams;"/>
+ <method name="getConsiderGoneChildrenWhenMeasuring()Z" deprecated="16"/>
+ <method name="getForeground()Landroid/graphics/drawable/Drawable;" removed="23"/>
+ <method name="getForegroundGravity()I" since="16" removed="23"/>
+ <method name="getForegroundTintList()Landroid/content/res/ColorStateList;" since="21" removed="23"/>
+ <method name="getForegroundTintMode()Landroid/graphics/PorterDuff$Mode;" since="21" removed="23"/>
+ <method name="getMeasureAllChildren()Z" since="14"/>
+ <method name="setForeground(Landroid/graphics/drawable/Drawable;)V" removed="23"/>
+ <method name="setForegroundGravity(I)V"/>
+ <method name="setForegroundTintList(Landroid/content/res/ColorStateList;)V" since="21" removed="23"/>
+ <method name="setForegroundTintMode(Landroid/graphics/PorterDuff$Mode;)V" since="21" removed="23"/>
+ <method name="setMeasureAllChildren(Z)V"/>
+ </class>
+ <class name="android/widget/FrameLayout$LayoutParams" since="1">
+ <extends name="android/view/ViewGroup$MarginLayoutParams"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="&lt;init>(III)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup$MarginLayoutParams;)V"/>
+ <method name="&lt;init>(Landroid/widget/FrameLayout$LayoutParams;)V" since="19"/>
+ <field name="UNSPECIFIED_GRAVITY" since="24"/>
+ <field name="gravity"/>
+ </class>
+ <class name="android/widget/Gallery" since="1" deprecated="16">
+ <extends name="android/widget/AbsSpinner"/>
+ <implements name="android/view/GestureDetector$OnGestureListener"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="setAnimationDuration(I)V"/>
+ <method name="setCallbackDuringFling(Z)V"/>
+ <method name="setGravity(I)V"/>
+ <method name="setSpacing(I)V"/>
+ <method name="setUnselectedAlpha(F)V"/>
+ </class>
+ <class name="android/widget/Gallery$LayoutParams" since="1">
+ <extends name="android/view/ViewGroup$LayoutParams"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V"/>
+ </class>
+ <class name="android/widget/GridLayout" since="14">
+ <extends name="android/view/ViewGroup"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="generateDefaultLayoutParams()Landroid/widget/GridLayout$LayoutParams;"/>
+ <method name="generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/GridLayout$LayoutParams;"/>
+ <method name="generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroid/widget/GridLayout$LayoutParams;"/>
+ <method name="getAlignmentMode()I"/>
+ <method name="getColumnCount()I"/>
+ <method name="getOrientation()I"/>
+ <method name="getRowCount()I"/>
+ <method name="getUseDefaultMargins()Z"/>
+ <method name="isColumnOrderPreserved()Z"/>
+ <method name="isRowOrderPreserved()Z"/>
+ <method name="setAlignmentMode(I)V"/>
+ <method name="setColumnCount(I)V"/>
+ <method name="setColumnOrderPreserved(Z)V"/>
+ <method name="setOrientation(I)V"/>
+ <method name="setRowCount(I)V"/>
+ <method name="setRowOrderPreserved(Z)V"/>
+ <method name="setUseDefaultMargins(Z)V"/>
+ <method name="spec(I)Landroid/widget/GridLayout$Spec;"/>
+ <method name="spec(IF)Landroid/widget/GridLayout$Spec;" since="21"/>
+ <method name="spec(II)Landroid/widget/GridLayout$Spec;"/>
+ <method name="spec(IIF)Landroid/widget/GridLayout$Spec;" since="21"/>
+ <method name="spec(IILandroid/widget/GridLayout$Alignment;)Landroid/widget/GridLayout$Spec;"/>
+ <method name="spec(IILandroid/widget/GridLayout$Alignment;F)Landroid/widget/GridLayout$Spec;" since="21"/>
+ <method name="spec(ILandroid/widget/GridLayout$Alignment;)Landroid/widget/GridLayout$Spec;"/>
+ <method name="spec(ILandroid/widget/GridLayout$Alignment;F)Landroid/widget/GridLayout$Spec;" since="21"/>
+ <field name="ALIGN_BOUNDS"/>
+ <field name="ALIGN_MARGINS"/>
+ <field name="BASELINE"/>
+ <field name="BOTTOM"/>
+ <field name="CENTER"/>
+ <field name="END" since="16"/>
+ <field name="FILL"/>
+ <field name="HORIZONTAL"/>
+ <field name="LEFT"/>
+ <field name="RIGHT"/>
+ <field name="START" since="16"/>
+ <field name="TOP"/>
+ <field name="UNDEFINED"/>
+ <field name="VERTICAL"/>
+ </class>
+ <class name="android/widget/GridLayout$Alignment" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/widget/GridLayout$LayoutParams" since="14">
+ <extends name="android/view/ViewGroup$MarginLayoutParams"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup$MarginLayoutParams;)V"/>
+ <method name="&lt;init>(Landroid/widget/GridLayout$LayoutParams;)V"/>
+ <method name="&lt;init>(Landroid/widget/GridLayout$Spec;Landroid/widget/GridLayout$Spec;)V"/>
+ <method name="setGravity(I)V"/>
+ <field name="columnSpec"/>
+ <field name="rowSpec"/>
+ </class>
+ <class name="android/widget/GridLayout$Spec" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/widget/GridView" since="1">
+ <extends name="android/widget/AbsListView"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getAdapter()Landroid/widget/ListAdapter;"/>
+ <method name="getColumnWidth()I" since="16"/>
+ <method name="getGravity()I" since="16"/>
+ <method name="getHorizontalSpacing()I" since="16"/>
+ <method name="getNumColumns()I" since="11"/>
+ <method name="getRequestedColumnWidth()I" since="16"/>
+ <method name="getRequestedHorizontalSpacing()I" since="16"/>
+ <method name="getStretchMode()I"/>
+ <method name="getVerticalSpacing()I" since="16"/>
+ <method name="setAdapter(Landroid/widget/ListAdapter;)V"/>
+ <method name="setColumnWidth(I)V"/>
+ <method name="setGravity(I)V"/>
+ <method name="setHorizontalSpacing(I)V"/>
+ <method name="setNumColumns(I)V"/>
+ <method name="setStretchMode(I)V"/>
+ <method name="setVerticalSpacing(I)V"/>
+ <method name="smoothScrollByOffset(I)V" since="11"/>
+ <field name="AUTO_FIT"/>
+ <field name="NO_STRETCH"/>
+ <field name="STRETCH_COLUMN_WIDTH"/>
+ <field name="STRETCH_SPACING"/>
+ <field name="STRETCH_SPACING_UNIFORM" since="3"/>
+ </class>
+ <class name="android/widget/HeaderViewListAdapter" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/widget/Filterable"/>
+ <implements name="android/widget/WrapperListAdapter"/>
+ <method name="&lt;init>(Ljava/util/ArrayList;Ljava/util/ArrayList;Landroid/widget/ListAdapter;)V"/>
+ <method name="getFootersCount()I"/>
+ <method name="getHeadersCount()I"/>
+ <method name="removeFooter(Landroid/view/View;)Z"/>
+ <method name="removeHeader(Landroid/view/View;)Z"/>
+ </class>
+ <class name="android/widget/HeterogeneousExpandableList" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="getChildType(II)I"/>
+ <method name="getChildTypeCount()I"/>
+ <method name="getGroupType(I)I"/>
+ <method name="getGroupTypeCount()I"/>
+ </class>
+ <class name="android/widget/HorizontalScrollView" since="3">
+ <extends name="android/widget/FrameLayout"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="arrowScroll(I)Z"/>
+ <method name="computeScrollDeltaToGetChildRectOnScreen(Landroid/graphics/Rect;)I"/>
+ <method name="executeKeyEvent(Landroid/view/KeyEvent;)Z"/>
+ <method name="fling(I)V"/>
+ <method name="fullScroll(I)Z"/>
+ <method name="getMaxScrollAmount()I"/>
+ <method name="isFillViewport()Z"/>
+ <method name="isSmoothScrollingEnabled()Z"/>
+ <method name="pageScroll(I)Z"/>
+ <method name="setFillViewport(Z)V"/>
+ <method name="setSmoothScrollingEnabled(Z)V"/>
+ <method name="smoothScrollBy(II)V"/>
+ <method name="smoothScrollTo(II)V"/>
+ </class>
+ <class name="android/widget/ImageButton" since="1">
+ <extends name="android/widget/ImageView"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ </class>
+ <class name="android/widget/ImageSwitcher" since="1">
+ <extends name="android/widget/ViewSwitcher"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="setImageDrawable(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setImageResource(I)V"/>
+ <method name="setImageURI(Landroid/net/Uri;)V"/>
+ </class>
+ <class name="android/widget/ImageView" since="1">
+ <extends name="android/view/View"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="clearColorFilter()V"/>
+ <method name="getAdjustViewBounds()Z" since="16"/>
+ <method name="getBaselineAlignBottom()Z" since="11"/>
+ <method name="getColorFilter()Landroid/graphics/ColorFilter;" since="16"/>
+ <method name="getCropToPadding()Z" since="16"/>
+ <method name="getDrawable()Landroid/graphics/drawable/Drawable;"/>
+ <method name="getImageAlpha()I" since="16"/>
+ <method name="getImageMatrix()Landroid/graphics/Matrix;"/>
+ <method name="getImageTintList()Landroid/content/res/ColorStateList;" since="21"/>
+ <method name="getImageTintMode()Landroid/graphics/PorterDuff$Mode;" since="21"/>
+ <method name="getMaxHeight()I" since="16"/>
+ <method name="getMaxWidth()I" since="16"/>
+ <method name="getScaleType()Landroid/widget/ImageView$ScaleType;"/>
+ <method name="setAdjustViewBounds(Z)V"/>
+ <method name="setAlpha(I)V" deprecated="16"/>
+ <method name="setBaseline(I)V" since="11"/>
+ <method name="setBaselineAlignBottom(Z)V" since="11"/>
+ <method name="setColorFilter(I)V" since="8"/>
+ <method name="setColorFilter(ILandroid/graphics/PorterDuff$Mode;)V"/>
+ <method name="setColorFilter(Landroid/graphics/ColorFilter;)V"/>
+ <method name="setCropToPadding(Z)V" since="16"/>
+ <method name="setFrame(IIII)Z"/>
+ <method name="setImageAlpha(I)V" since="16"/>
+ <method name="setImageBitmap(Landroid/graphics/Bitmap;)V"/>
+ <method name="setImageDrawable(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setImageIcon(Landroid/graphics/drawable/Icon;)V" since="23"/>
+ <method name="setImageLevel(I)V"/>
+ <method name="setImageMatrix(Landroid/graphics/Matrix;)V"/>
+ <method name="setImageResource(I)V"/>
+ <method name="setImageState([IZ)V"/>
+ <method name="setImageTintList(Landroid/content/res/ColorStateList;)V" since="21"/>
+ <method name="setImageTintMode(Landroid/graphics/PorterDuff$Mode;)V" since="21"/>
+ <method name="setImageURI(Landroid/net/Uri;)V"/>
+ <method name="setMaxHeight(I)V"/>
+ <method name="setMaxWidth(I)V"/>
+ <method name="setScaleType(Landroid/widget/ImageView$ScaleType;)V"/>
+ </class>
+ <class name="android/widget/ImageView$ScaleType" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/widget/ImageView$ScaleType;"/>
+ <method name="values()[Landroid/widget/ImageView$ScaleType;"/>
+ <field name="CENTER"/>
+ <field name="CENTER_CROP"/>
+ <field name="CENTER_INSIDE"/>
+ <field name="FIT_CENTER"/>
+ <field name="FIT_END"/>
+ <field name="FIT_START"/>
+ <field name="FIT_XY"/>
+ <field name="MATRIX"/>
+ </class>
+ <class name="android/widget/LinearLayout" since="1">
+ <extends name="android/view/ViewGroup"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" since="11"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="generateDefaultLayoutParams()Landroid/widget/LinearLayout$LayoutParams;"/>
+ <method name="generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/LinearLayout$LayoutParams;"/>
+ <method name="generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroid/widget/LinearLayout$LayoutParams;"/>
+ <method name="getBaselineAlignedChildIndex()I"/>
+ <method name="getDividerDrawable()Landroid/graphics/drawable/Drawable;" since="16"/>
+ <method name="getDividerPadding()I" since="14"/>
+ <method name="getGravity()I" since="24"/>
+ <method name="getOrientation()I"/>
+ <method name="getShowDividers()I" since="11"/>
+ <method name="getWeightSum()F"/>
+ <method name="isBaselineAligned()Z"/>
+ <method name="isMeasureWithLargestChildEnabled()Z" since="11"/>
+ <method name="setBaselineAligned(Z)V"/>
+ <method name="setBaselineAlignedChildIndex(I)V"/>
+ <method name="setDividerDrawable(Landroid/graphics/drawable/Drawable;)V" since="11"/>
+ <method name="setDividerPadding(I)V" since="14"/>
+ <method name="setGravity(I)V"/>
+ <method name="setHorizontalGravity(I)V"/>
+ <method name="setMeasureWithLargestChildEnabled(Z)V" since="11"/>
+ <method name="setOrientation(I)V"/>
+ <method name="setShowDividers(I)V" since="11"/>
+ <method name="setVerticalGravity(I)V"/>
+ <method name="setWeightSum(F)V"/>
+ <field name="HORIZONTAL"/>
+ <field name="SHOW_DIVIDER_BEGINNING" since="11"/>
+ <field name="SHOW_DIVIDER_END" since="11"/>
+ <field name="SHOW_DIVIDER_MIDDLE" since="11"/>
+ <field name="SHOW_DIVIDER_NONE" since="11"/>
+ <field name="VERTICAL"/>
+ </class>
+ <class name="android/widget/LinearLayout$LayoutParams" since="1">
+ <extends name="android/view/ViewGroup$MarginLayoutParams"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="&lt;init>(IIF)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup$MarginLayoutParams;)V"/>
+ <method name="&lt;init>(Landroid/widget/LinearLayout$LayoutParams;)V" since="19"/>
+ <method name="debug(Ljava/lang/String;)Ljava/lang/String;"/>
+ <field name="gravity"/>
+ <field name="weight"/>
+ </class>
+ <class name="android/widget/ListAdapter" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/widget/Adapter"/>
+ <method name="areAllItemsEnabled()Z"/>
+ <method name="isEnabled(I)Z"/>
+ </class>
+ <class name="android/widget/ListPopupWindow" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V"/>
+ <method name="clearListSelection()V"/>
+ <method name="createDragToOpenListener(Landroid/view/View;)Landroid/view/View$OnTouchListener;" since="19"/>
+ <method name="dismiss()V"/>
+ <method name="getAnchorView()Landroid/view/View;"/>
+ <method name="getAnimationStyle()I"/>
+ <method name="getBackground()Landroid/graphics/drawable/Drawable;"/>
+ <method name="getHeight()I"/>
+ <method name="getHorizontalOffset()I"/>
+ <method name="getInputMethodMode()I"/>
+ <method name="getListView()Landroid/widget/ListView;"/>
+ <method name="getPromptPosition()I"/>
+ <method name="getSelectedItem()Ljava/lang/Object;"/>
+ <method name="getSelectedItemId()J"/>
+ <method name="getSelectedItemPosition()I"/>
+ <method name="getSelectedView()Landroid/view/View;"/>
+ <method name="getSoftInputMode()I"/>
+ <method name="getVerticalOffset()I"/>
+ <method name="getWidth()I"/>
+ <method name="isInputMethodNotNeeded()Z"/>
+ <method name="isModal()Z"/>
+ <method name="isShowing()Z"/>
+ <method name="onKeyDown(ILandroid/view/KeyEvent;)Z"/>
+ <method name="onKeyPreIme(ILandroid/view/KeyEvent;)Z"/>
+ <method name="onKeyUp(ILandroid/view/KeyEvent;)Z"/>
+ <method name="performItemClick(I)Z"/>
+ <method name="postShow()V"/>
+ <method name="setAdapter(Landroid/widget/ListAdapter;)V"/>
+ <method name="setAnchorView(Landroid/view/View;)V"/>
+ <method name="setAnimationStyle(I)V"/>
+ <method name="setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setContentWidth(I)V"/>
+ <method name="setDropDownGravity(I)V" since="19"/>
+ <method name="setHeight(I)V"/>
+ <method name="setHorizontalOffset(I)V"/>
+ <method name="setInputMethodMode(I)V"/>
+ <method name="setListSelector(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setModal(Z)V"/>
+ <method name="setOnDismissListener(Landroid/widget/PopupWindow$OnDismissListener;)V"/>
+ <method name="setOnItemClickListener(Landroid/widget/AdapterView$OnItemClickListener;)V"/>
+ <method name="setOnItemSelectedListener(Landroid/widget/AdapterView$OnItemSelectedListener;)V"/>
+ <method name="setPromptPosition(I)V"/>
+ <method name="setPromptView(Landroid/view/View;)V"/>
+ <method name="setSelection(I)V"/>
+ <method name="setSoftInputMode(I)V"/>
+ <method name="setVerticalOffset(I)V"/>
+ <method name="setWidth(I)V"/>
+ <method name="setWindowLayoutType(I)V" since="23"/>
+ <method name="show()V"/>
+ <field name="INPUT_METHOD_FROM_FOCUSABLE"/>
+ <field name="INPUT_METHOD_NEEDED"/>
+ <field name="INPUT_METHOD_NOT_NEEDED"/>
+ <field name="MATCH_PARENT"/>
+ <field name="POSITION_PROMPT_ABOVE"/>
+ <field name="POSITION_PROMPT_BELOW"/>
+ <field name="WRAP_CONTENT"/>
+ </class>
+ <class name="android/widget/ListView" since="1">
+ <extends name="android/widget/AbsListView"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="addFooterView(Landroid/view/View;)V"/>
+ <method name="addFooterView(Landroid/view/View;Ljava/lang/Object;Z)V"/>
+ <method name="addHeaderView(Landroid/view/View;)V"/>
+ <method name="addHeaderView(Landroid/view/View;Ljava/lang/Object;Z)V"/>
+ <method name="areFooterDividersEnabled()Z" since="19"/>
+ <method name="areHeaderDividersEnabled()Z" since="19"/>
+ <method name="clearChoices()V" removed="11"/>
+ <method name="findViewTraversal(I)Landroid/view/View;" removed="26"/>
+ <method name="findViewWithTagTraversal(Ljava/lang/Object;)Landroid/view/View;" removed="26"/>
+ <method name="getAdapter()Landroid/widget/ListAdapter;"/>
+ <method name="getCheckItemIds()[J" since="4" deprecated="16"/>
+ <method name="getCheckedItemIds()[J" since="8" removed="11"/>
+ <method name="getCheckedItemPosition()I" removed="11"/>
+ <method name="getCheckedItemPositions()Landroid/util/SparseBooleanArray;" removed="11"/>
+ <method name="getChoiceMode()I" removed="11"/>
+ <method name="getDivider()Landroid/graphics/drawable/Drawable;"/>
+ <method name="getDividerHeight()I"/>
+ <method name="getFooterViewsCount()I"/>
+ <method name="getHeaderViewsCount()I"/>
+ <method name="getItemsCanFocus()Z"/>
+ <method name="getMaxScrollAmount()I"/>
+ <method name="getOverscrollFooter()Landroid/graphics/drawable/Drawable;" since="9"/>
+ <method name="getOverscrollHeader()Landroid/graphics/drawable/Drawable;" since="9"/>
+ <method name="isItemChecked(I)Z" removed="11"/>
+ <method name="removeFooterView(Landroid/view/View;)Z"/>
+ <method name="removeHeaderView(Landroid/view/View;)Z"/>
+ <method name="setAdapter(Landroid/widget/ListAdapter;)V"/>
+ <method name="setChoiceMode(I)V" removed="11"/>
+ <method name="setDivider(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setDividerHeight(I)V"/>
+ <method name="setFooterDividersEnabled(Z)V" since="3"/>
+ <method name="setHeaderDividersEnabled(Z)V" since="3"/>
+ <method name="setItemChecked(IZ)V" removed="11"/>
+ <method name="setItemsCanFocus(Z)V"/>
+ <method name="setOverscrollFooter(Landroid/graphics/drawable/Drawable;)V" since="9"/>
+ <method name="setOverscrollHeader(Landroid/graphics/drawable/Drawable;)V" since="9"/>
+ <method name="setSelectionAfterHeaderView()V"/>
+ <method name="setSelectionFromTop(II)V" removed="21"/>
+ <method name="smoothScrollByOffset(I)V" since="11"/>
+ <field name="CHOICE_MODE_MULTIPLE" removed="11"/>
+ <field name="CHOICE_MODE_NONE" removed="11"/>
+ <field name="CHOICE_MODE_SINGLE" removed="11"/>
+ </class>
+ <class name="android/widget/ListView$FixedViewInfo" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/widget/ListView;)V"/>
+ <field name="data"/>
+ <field name="isSelectable"/>
+ <field name="view"/>
+ </class>
+ <class name="android/widget/MediaController" since="1">
+ <extends name="android/widget/FrameLayout"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Z)V"/>
+ <method name="hide()V"/>
+ <method name="isShowing()Z"/>
+ <method name="setAnchorView(Landroid/view/View;)V"/>
+ <method name="setMediaPlayer(Landroid/widget/MediaController$MediaPlayerControl;)V"/>
+ <method name="setPrevNextListeners(Landroid/view/View$OnClickListener;Landroid/view/View$OnClickListener;)V"/>
+ <method name="show()V"/>
+ <method name="show(I)V"/>
+ </class>
+ <class name="android/widget/MediaController$MediaPlayerControl" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="canPause()Z" since="5"/>
+ <method name="canSeekBackward()Z" since="5"/>
+ <method name="canSeekForward()Z" since="5"/>
+ <method name="getAudioSessionId()I" since="18"/>
+ <method name="getBufferPercentage()I"/>
+ <method name="getCurrentPosition()I"/>
+ <method name="getDuration()I"/>
+ <method name="isPlaying()Z"/>
+ <method name="pause()V"/>
+ <method name="seekTo(I)V"/>
+ <method name="start()V"/>
+ </class>
+ <class name="android/widget/MultiAutoCompleteTextView" since="1">
+ <extends name="android/widget/AutoCompleteTextView"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="performFiltering(Ljava/lang/CharSequence;III)V"/>
+ <method name="setTokenizer(Landroid/widget/MultiAutoCompleteTextView$Tokenizer;)V"/>
+ </class>
+ <class name="android/widget/MultiAutoCompleteTextView$CommaTokenizer" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/widget/MultiAutoCompleteTextView$Tokenizer"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="android/widget/MultiAutoCompleteTextView$Tokenizer" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="findTokenEnd(Ljava/lang/CharSequence;I)I"/>
+ <method name="findTokenStart(Ljava/lang/CharSequence;I)I"/>
+ <method name="terminateToken(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;"/>
+ </class>
+ <class name="android/widget/NumberPicker" since="11">
+ <extends name="android/widget/LinearLayout"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getDisplayedValues()[Ljava/lang/String;"/>
+ <method name="getMaxValue()I"/>
+ <method name="getMinValue()I"/>
+ <method name="getValue()I"/>
+ <method name="getWrapSelectorWheel()Z"/>
+ <method name="setDisplayedValues([Ljava/lang/String;)V"/>
+ <method name="setFormatter(Landroid/widget/NumberPicker$Formatter;)V"/>
+ <method name="setMaxValue(I)V"/>
+ <method name="setMinValue(I)V"/>
+ <method name="setOnLongPressUpdateInterval(J)V"/>
+ <method name="setOnScrollListener(Landroid/widget/NumberPicker$OnScrollListener;)V"/>
+ <method name="setOnValueChangedListener(Landroid/widget/NumberPicker$OnValueChangeListener;)V"/>
+ <method name="setValue(I)V"/>
+ <method name="setWrapSelectorWheel(Z)V"/>
+ </class>
+ <class name="android/widget/NumberPicker$Formatter" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="format(I)Ljava/lang/String;"/>
+ </class>
+ <class name="android/widget/NumberPicker$OnScrollListener" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="onScrollStateChange(Landroid/widget/NumberPicker;I)V"/>
+ <field name="SCROLL_STATE_FLING"/>
+ <field name="SCROLL_STATE_IDLE"/>
+ <field name="SCROLL_STATE_TOUCH_SCROLL"/>
+ </class>
+ <class name="android/widget/NumberPicker$OnValueChangeListener" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="onValueChange(Landroid/widget/NumberPicker;II)V"/>
+ </class>
+ <class name="android/widget/OverScroller" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/animation/Interpolator;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/animation/Interpolator;FF)V" deprecated="26"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/animation/Interpolator;FFZ)V" since="11" deprecated="26"/>
+ <method name="abortAnimation()V"/>
+ <method name="computeScrollOffset()Z"/>
+ <method name="fling(IIIIIIII)V"/>
+ <method name="fling(IIIIIIIIII)V"/>
+ <method name="forceFinished(Z)V"/>
+ <method name="getCurrVelocity()F" since="14"/>
+ <method name="getCurrX()I"/>
+ <method name="getCurrY()I"/>
+ <method name="getFinalX()I"/>
+ <method name="getFinalY()I"/>
+ <method name="getStartX()I"/>
+ <method name="getStartY()I"/>
+ <method name="isFinished()Z"/>
+ <method name="isOverScrolled()Z"/>
+ <method name="notifyHorizontalEdgeReached(III)V"/>
+ <method name="notifyVerticalEdgeReached(III)V"/>
+ <method name="setFriction(F)V" since="11"/>
+ <method name="springBack(IIIIII)Z"/>
+ <method name="startScroll(IIII)V"/>
+ <method name="startScroll(IIIII)V"/>
+ </class>
+ <class name="android/widget/PopupMenu" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/View;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/View;I)V" since="19"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/View;III)V" since="22"/>
+ <method name="dismiss()V"/>
+ <method name="getDragToOpenListener()Landroid/view/View$OnTouchListener;" since="19"/>
+ <method name="getGravity()I" since="23"/>
+ <method name="getMenu()Landroid/view/Menu;"/>
+ <method name="getMenuInflater()Landroid/view/MenuInflater;"/>
+ <method name="inflate(I)V" since="14"/>
+ <method name="setGravity(I)V" since="23"/>
+ <method name="setOnDismissListener(Landroid/widget/PopupMenu$OnDismissListener;)V" since="14"/>
+ <method name="setOnMenuItemClickListener(Landroid/widget/PopupMenu$OnMenuItemClickListener;)V"/>
+ <method name="show()V"/>
+ </class>
+ <class name="android/widget/PopupMenu$OnDismissListener" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="onDismiss(Landroid/widget/PopupMenu;)V"/>
+ </class>
+ <class name="android/widget/PopupMenu$OnMenuItemClickListener" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="onMenuItemClick(Landroid/view/MenuItem;)Z"/>
+ </class>
+ <class name="android/widget/PopupWindow" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="11"/>
+ <method name="&lt;init>(Landroid/view/View;)V"/>
+ <method name="&lt;init>(Landroid/view/View;II)V"/>
+ <method name="&lt;init>(Landroid/view/View;IIZ)V"/>
+ <method name="dismiss()V"/>
+ <method name="getAnimationStyle()I"/>
+ <method name="getBackground()Landroid/graphics/drawable/Drawable;"/>
+ <method name="getContentView()Landroid/view/View;"/>
+ <method name="getElevation()F" since="21"/>
+ <method name="getEnterTransition()Landroid/transition/Transition;" since="24"/>
+ <method name="getExitTransition()Landroid/transition/Transition;" since="24"/>
+ <method name="getHeight()I"/>
+ <method name="getInputMethodMode()I" since="3"/>
+ <method name="getMaxAvailableHeight(Landroid/view/View;)I"/>
+ <method name="getMaxAvailableHeight(Landroid/view/View;I)I" since="3"/>
+ <method name="getMaxAvailableHeight(Landroid/view/View;IZ)I" since="24"/>
+ <method name="getOverlapAnchor()Z" since="23"/>
+ <method name="getSoftInputMode()I" since="4"/>
+ <method name="getWidth()I"/>
+ <method name="getWindowLayoutType()I" since="23"/>
+ <method name="isAboveAnchor()Z" since="3"/>
+ <method name="isAttachedInDecor()Z" since="22"/>
+ <method name="isClippingEnabled()Z" since="3"/>
+ <method name="isFocusable()Z"/>
+ <method name="isOutsideTouchable()Z" since="3"/>
+ <method name="isShowing()Z"/>
+ <method name="isSplitTouchEnabled()Z" since="11"/>
+ <method name="isTouchable()Z" since="3"/>
+ <method name="setAnimationStyle(I)V"/>
+ <method name="setAttachedInDecor(Z)V" since="22"/>
+ <method name="setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setClippingEnabled(Z)V" since="3"/>
+ <method name="setContentView(Landroid/view/View;)V"/>
+ <method name="setElevation(F)V" since="21"/>
+ <method name="setEnterTransition(Landroid/transition/Transition;)V" since="23"/>
+ <method name="setExitTransition(Landroid/transition/Transition;)V" since="23"/>
+ <method name="setFocusable(Z)V"/>
+ <method name="setHeight(I)V"/>
+ <method name="setIgnoreCheekPress()V"/>
+ <method name="setInputMethodMode(I)V" since="3"/>
+ <method name="setOnDismissListener(Landroid/widget/PopupWindow$OnDismissListener;)V"/>
+ <method name="setOutsideTouchable(Z)V" since="3"/>
+ <method name="setOverlapAnchor(Z)V" since="23"/>
+ <method name="setSoftInputMode(I)V" since="4"/>
+ <method name="setSplitTouchEnabled(Z)V" since="11"/>
+ <method name="setTouchInterceptor(Landroid/view/View$OnTouchListener;)V" since="3"/>
+ <method name="setTouchable(Z)V" since="3"/>
+ <method name="setWidth(I)V"/>
+ <method name="setWindowLayoutMode(II)V" since="3" deprecated="23"/>
+ <method name="setWindowLayoutType(I)V" since="23"/>
+ <method name="showAsDropDown(Landroid/view/View;)V"/>
+ <method name="showAsDropDown(Landroid/view/View;II)V"/>
+ <method name="showAsDropDown(Landroid/view/View;III)V" since="19"/>
+ <method name="showAtLocation(Landroid/view/View;III)V"/>
+ <method name="update()V" since="3"/>
+ <method name="update(II)V" since="4"/>
+ <method name="update(IIII)V"/>
+ <method name="update(IIIIZ)V" since="3"/>
+ <method name="update(Landroid/view/View;II)V"/>
+ <method name="update(Landroid/view/View;IIII)V"/>
+ <field name="INPUT_METHOD_FROM_FOCUSABLE" since="3"/>
+ <field name="INPUT_METHOD_NEEDED" since="3"/>
+ <field name="INPUT_METHOD_NOT_NEEDED" since="3"/>
+ </class>
+ <class name="android/widget/PopupWindow$OnDismissListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onDismiss()V"/>
+ </class>
+ <class name="android/widget/ProgressBar" since="1">
+ <extends name="android/view/View"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getIndeterminateDrawable()Landroid/graphics/drawable/Drawable;"/>
+ <method name="getIndeterminateTintList()Landroid/content/res/ColorStateList;" since="21"/>
+ <method name="getIndeterminateTintMode()Landroid/graphics/PorterDuff$Mode;" since="21"/>
+ <method name="getInterpolator()Landroid/view/animation/Interpolator;"/>
+ <method name="getMax()I"/>
+ <method name="getMin()I" since="26"/>
+ <method name="getProgress()I"/>
+ <method name="getProgressBackgroundTintList()Landroid/content/res/ColorStateList;" since="21"/>
+ <method name="getProgressBackgroundTintMode()Landroid/graphics/PorterDuff$Mode;" since="21"/>
+ <method name="getProgressDrawable()Landroid/graphics/drawable/Drawable;"/>
+ <method name="getProgressTintList()Landroid/content/res/ColorStateList;" since="21"/>
+ <method name="getProgressTintMode()Landroid/graphics/PorterDuff$Mode;" since="21"/>
+ <method name="getSecondaryProgress()I"/>
+ <method name="getSecondaryProgressTintList()Landroid/content/res/ColorStateList;" since="21"/>
+ <method name="getSecondaryProgressTintMode()Landroid/graphics/PorterDuff$Mode;" since="21"/>
+ <method name="incrementProgressBy(I)V"/>
+ <method name="incrementSecondaryProgressBy(I)V"/>
+ <method name="isAnimating()Z" since="26"/>
+ <method name="isIndeterminate()Z"/>
+ <method name="setIndeterminate(Z)V"/>
+ <method name="setIndeterminateDrawable(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setIndeterminateDrawableTiled(Landroid/graphics/drawable/Drawable;)V" since="21"/>
+ <method name="setIndeterminateTintList(Landroid/content/res/ColorStateList;)V" since="21"/>
+ <method name="setIndeterminateTintMode(Landroid/graphics/PorterDuff$Mode;)V" since="21"/>
+ <method name="setInterpolator(Landroid/content/Context;I)V"/>
+ <method name="setInterpolator(Landroid/view/animation/Interpolator;)V"/>
+ <method name="setMax(I)V"/>
+ <method name="setMin(I)V" since="26"/>
+ <method name="setProgress(I)V"/>
+ <method name="setProgress(IZ)V" since="24"/>
+ <method name="setProgressBackgroundTintList(Landroid/content/res/ColorStateList;)V" since="21"/>
+ <method name="setProgressBackgroundTintMode(Landroid/graphics/PorterDuff$Mode;)V" since="21"/>
+ <method name="setProgressDrawable(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setProgressDrawableTiled(Landroid/graphics/drawable/Drawable;)V" since="21"/>
+ <method name="setProgressTintList(Landroid/content/res/ColorStateList;)V" since="21"/>
+ <method name="setProgressTintMode(Landroid/graphics/PorterDuff$Mode;)V" since="21"/>
+ <method name="setSecondaryProgress(I)V"/>
+ <method name="setSecondaryProgressTintList(Landroid/content/res/ColorStateList;)V" since="21"/>
+ <method name="setSecondaryProgressTintMode(Landroid/graphics/PorterDuff$Mode;)V" since="21"/>
+ </class>
+ <class name="android/widget/QuickContactBadge" since="5">
+ <extends name="android/widget/ImageView"/>
+ <implements name="android/view/View$OnClickListener"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="assignContactFromEmail(Ljava/lang/String;Z)V"/>
+ <method name="assignContactFromEmail(Ljava/lang/String;ZLandroid/os/Bundle;)V" since="18"/>
+ <method name="assignContactFromPhone(Ljava/lang/String;Z)V"/>
+ <method name="assignContactFromPhone(Ljava/lang/String;ZLandroid/os/Bundle;)V" since="18"/>
+ <method name="assignContactUri(Landroid/net/Uri;)V"/>
+ <method name="setExcludeMimes([Ljava/lang/String;)V"/>
+ <method name="setImageToDefault()V" since="11"/>
+ <method name="setMode(I)V"/>
+ <method name="setOverlay(Landroid/graphics/drawable/Drawable;)V" since="21"/>
+ <method name="setPrioritizedMimeType(Ljava/lang/String;)V" since="23"/>
+ <field name="mExcludeMimes"/>
+ </class>
+ <class name="android/widget/RadioButton" since="1">
+ <extends name="android/widget/CompoundButton"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ </class>
+ <class name="android/widget/RadioGroup" since="1">
+ <extends name="android/widget/LinearLayout"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="check(I)V"/>
+ <method name="clearCheck()V"/>
+ <method name="generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/RadioGroup$LayoutParams;"/>
+ <method name="getCheckedRadioButtonId()I"/>
+ <method name="setOnCheckedChangeListener(Landroid/widget/RadioGroup$OnCheckedChangeListener;)V"/>
+ </class>
+ <class name="android/widget/RadioGroup$LayoutParams" since="1">
+ <extends name="android/widget/LinearLayout$LayoutParams"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="&lt;init>(IIF)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup$MarginLayoutParams;)V"/>
+ </class>
+ <class name="android/widget/RadioGroup$OnCheckedChangeListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onCheckedChanged(Landroid/widget/RadioGroup;I)V"/>
+ </class>
+ <class name="android/widget/RatingBar" since="1">
+ <extends name="android/widget/AbsSeekBar"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getNumStars()I"/>
+ <method name="getOnRatingBarChangeListener()Landroid/widget/RatingBar$OnRatingBarChangeListener;"/>
+ <method name="getRating()F"/>
+ <method name="getStepSize()F"/>
+ <method name="isIndicator()Z"/>
+ <method name="setIsIndicator(Z)V"/>
+ <method name="setNumStars(I)V"/>
+ <method name="setOnRatingBarChangeListener(Landroid/widget/RatingBar$OnRatingBarChangeListener;)V"/>
+ <method name="setRating(F)V"/>
+ <method name="setStepSize(F)V"/>
+ </class>
+ <class name="android/widget/RatingBar$OnRatingBarChangeListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onRatingChanged(Landroid/widget/RatingBar;FZ)V"/>
+ </class>
+ <class name="android/widget/RelativeLayout" since="1">
+ <extends name="android/view/ViewGroup"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/RelativeLayout$LayoutParams;"/>
+ <method name="getGravity()I" since="16"/>
+ <method name="setGravity(I)V"/>
+ <method name="setHorizontalGravity(I)V"/>
+ <method name="setIgnoreGravity(I)V"/>
+ <method name="setVerticalGravity(I)V"/>
+ <field name="ABOVE"/>
+ <field name="ALIGN_BASELINE"/>
+ <field name="ALIGN_BOTTOM"/>
+ <field name="ALIGN_END" since="17"/>
+ <field name="ALIGN_LEFT"/>
+ <field name="ALIGN_PARENT_BOTTOM"/>
+ <field name="ALIGN_PARENT_END" since="17"/>
+ <field name="ALIGN_PARENT_LEFT"/>
+ <field name="ALIGN_PARENT_RIGHT"/>
+ <field name="ALIGN_PARENT_START" since="17"/>
+ <field name="ALIGN_PARENT_TOP"/>
+ <field name="ALIGN_RIGHT"/>
+ <field name="ALIGN_START" since="17"/>
+ <field name="ALIGN_TOP"/>
+ <field name="BELOW"/>
+ <field name="CENTER_HORIZONTAL"/>
+ <field name="CENTER_IN_PARENT"/>
+ <field name="CENTER_VERTICAL"/>
+ <field name="END_OF" since="17"/>
+ <field name="LEFT_OF"/>
+ <field name="RIGHT_OF"/>
+ <field name="START_OF" since="17"/>
+ <field name="TRUE"/>
+ </class>
+ <class name="android/widget/RelativeLayout$LayoutParams" since="1">
+ <extends name="android/view/ViewGroup$MarginLayoutParams"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup$MarginLayoutParams;)V"/>
+ <method name="&lt;init>(Landroid/widget/RelativeLayout$LayoutParams;)V" since="19"/>
+ <method name="addRule(I)V"/>
+ <method name="addRule(II)V"/>
+ <method name="debug(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getRule(I)I" since="23"/>
+ <method name="getRules()[I"/>
+ <method name="removeRule(I)V" since="17"/>
+ <field name="alignWithParent"/>
+ </class>
+ <class name="android/widget/RemoteViews" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/os/Parcelable"/>
+ <implements name="android/view/LayoutInflater$Filter"/>
+ <method name="&lt;init>(Landroid/os/Parcel;)V"/>
+ <method name="&lt;init>(Landroid/widget/RemoteViews;Landroid/widget/RemoteViews;)V" since="16"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="addView(ILandroid/widget/RemoteViews;)V" since="7"/>
+ <method name="apply(Landroid/content/Context;Landroid/view/ViewGroup;)Landroid/view/View;"/>
+ <method name="clone()Landroid/widget/RemoteViews;" since="9"/>
+ <method name="getLayoutId()I"/>
+ <method name="getPackage()Ljava/lang/String;"/>
+ <method name="reapply(Landroid/content/Context;Landroid/view/View;)V"/>
+ <method name="removeAllViews(I)V" since="7"/>
+ <method name="setAccessibilityTraversalAfter(II)V" since="22"/>
+ <method name="setAccessibilityTraversalBefore(II)V" since="22"/>
+ <method name="setBitmap(ILjava/lang/String;Landroid/graphics/Bitmap;)V" since="3"/>
+ <method name="setBoolean(ILjava/lang/String;Z)V" since="3"/>
+ <method name="setBundle(ILjava/lang/String;Landroid/os/Bundle;)V" since="8"/>
+ <method name="setByte(ILjava/lang/String;B)V" since="3"/>
+ <method name="setChar(ILjava/lang/String;C)V" since="3"/>
+ <method name="setCharSequence(ILjava/lang/String;Ljava/lang/CharSequence;)V" since="3"/>
+ <method name="setChronometer(IJLjava/lang/String;Z)V"/>
+ <method name="setChronometerCountDown(IZ)V" since="24"/>
+ <method name="setContentDescription(ILjava/lang/CharSequence;)V" since="15"/>
+ <method name="setDisplayedChild(II)V" since="12"/>
+ <method name="setDouble(ILjava/lang/String;D)V" since="3"/>
+ <method name="setEmptyView(II)V" since="11"/>
+ <method name="setFloat(ILjava/lang/String;F)V" since="3"/>
+ <method name="setIcon(ILjava/lang/String;Landroid/graphics/drawable/Icon;)V" since="23"/>
+ <method name="setImageViewBitmap(ILandroid/graphics/Bitmap;)V" since="3"/>
+ <method name="setImageViewIcon(ILandroid/graphics/drawable/Icon;)V" since="23"/>
+ <method name="setImageViewResource(II)V"/>
+ <method name="setImageViewUri(ILandroid/net/Uri;)V"/>
+ <method name="setInt(ILjava/lang/String;I)V" since="3"/>
+ <method name="setIntent(ILjava/lang/String;Landroid/content/Intent;)V" since="11"/>
+ <method name="setLabelFor(II)V" since="17"/>
+ <method name="setLong(ILjava/lang/String;J)V" since="3"/>
+ <method name="setOnClickFillInIntent(ILandroid/content/Intent;)V" since="11"/>
+ <method name="setOnClickPendingIntent(ILandroid/app/PendingIntent;)V" since="3"/>
+ <method name="setPendingIntentTemplate(ILandroid/app/PendingIntent;)V" since="11"/>
+ <method name="setProgressBar(IIIZ)V"/>
+ <method name="setRelativeScrollPosition(II)V" since="11"/>
+ <method name="setRemoteAdapter(IILandroid/content/Intent;)V" since="11" deprecated="16"/>
+ <method name="setRemoteAdapter(ILandroid/content/Intent;)V" since="14"/>
+ <method name="setScrollPosition(II)V" since="11"/>
+ <method name="setShort(ILjava/lang/String;S)V" since="3"/>
+ <method name="setString(ILjava/lang/String;Ljava/lang/String;)V" since="3"/>
+ <method name="setTextColor(II)V" since="3"/>
+ <method name="setTextViewCompoundDrawables(IIIII)V" since="16"/>
+ <method name="setTextViewCompoundDrawablesRelative(IIIII)V" since="16"/>
+ <method name="setTextViewText(ILjava/lang/CharSequence;)V"/>
+ <method name="setTextViewTextSize(IIF)V" since="16"/>
+ <method name="setUri(ILjava/lang/String;Landroid/net/Uri;)V" since="3"/>
+ <method name="setViewPadding(IIIII)V" since="16"/>
+ <method name="setViewVisibility(II)V"/>
+ <method name="showNext(I)V" since="11"/>
+ <method name="showPrevious(I)V" since="11"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/widget/RemoteViews$ActionException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>(Ljava/lang/Exception;)V" since="3"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/widget/RemoteViews$RemoteView" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ </class>
+ <class name="android/widget/RemoteViewsService" since="11">
+ <extends name="android/app/Service"/>
+ <method name="&lt;init>()V"/>
+ <method name="onGetViewFactory(Landroid/content/Intent;)Landroid/widget/RemoteViewsService$RemoteViewsFactory;"/>
+ </class>
+ <class name="android/widget/RemoteViewsService$RemoteViewsFactory" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="getCount()I"/>
+ <method name="getItemId(I)J"/>
+ <method name="getLoadingView()Landroid/widget/RemoteViews;"/>
+ <method name="getViewAt(I)Landroid/widget/RemoteViews;"/>
+ <method name="getViewTypeCount()I"/>
+ <method name="hasStableIds()Z"/>
+ <method name="onCreate()V"/>
+ <method name="onDataSetChanged()V"/>
+ <method name="onDestroy()V"/>
+ </class>
+ <class name="android/widget/ResourceCursorAdapter" since="1">
+ <extends name="android/widget/CursorAdapter"/>
+ <method name="&lt;init>(Landroid/content/Context;ILandroid/database/Cursor;)V" deprecated="16"/>
+ <method name="&lt;init>(Landroid/content/Context;ILandroid/database/Cursor;I)V" since="11"/>
+ <method name="&lt;init>(Landroid/content/Context;ILandroid/database/Cursor;Z)V" since="3"/>
+ <method name="setDropDownViewResource(I)V"/>
+ <method name="setViewResource(I)V" since="3"/>
+ </class>
+ <class name="android/widget/ResourceCursorTreeAdapter" since="1">
+ <extends name="android/widget/CursorTreeAdapter"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/database/Cursor;II)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/database/Cursor;III)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/database/Cursor;IIII)V"/>
+ </class>
+ <class name="android/widget/ScrollView" since="1">
+ <extends name="android/widget/FrameLayout"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="arrowScroll(I)Z"/>
+ <method name="computeScrollDeltaToGetChildRectOnScreen(Landroid/graphics/Rect;)I"/>
+ <method name="executeKeyEvent(Landroid/view/KeyEvent;)Z"/>
+ <method name="fling(I)V"/>
+ <method name="fullScroll(I)Z"/>
+ <method name="getMaxScrollAmount()I"/>
+ <method name="isFillViewport()Z"/>
+ <method name="isSmoothScrollingEnabled()Z"/>
+ <method name="pageScroll(I)Z"/>
+ <method name="setFillViewport(Z)V"/>
+ <method name="setSmoothScrollingEnabled(Z)V"/>
+ <method name="smoothScrollBy(II)V"/>
+ <method name="smoothScrollTo(II)V"/>
+ </class>
+ <class name="android/widget/Scroller" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/animation/Interpolator;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/animation/Interpolator;Z)V" since="11"/>
+ <method name="abortAnimation()V"/>
+ <method name="computeScrollOffset()Z"/>
+ <method name="extendDuration(I)V"/>
+ <method name="fling(IIIIIIII)V"/>
+ <method name="forceFinished(Z)V"/>
+ <method name="getCurrVelocity()F" since="14"/>
+ <method name="getCurrX()I"/>
+ <method name="getCurrY()I"/>
+ <method name="getDuration()I"/>
+ <method name="getFinalX()I"/>
+ <method name="getFinalY()I"/>
+ <method name="getStartX()I" since="3"/>
+ <method name="getStartY()I" since="3"/>
+ <method name="isFinished()Z"/>
+ <method name="setFinalX(I)V"/>
+ <method name="setFinalY(I)V"/>
+ <method name="setFriction(F)V" since="11"/>
+ <method name="startScroll(IIII)V"/>
+ <method name="startScroll(IIIII)V"/>
+ <method name="timePassed()I"/>
+ </class>
+ <class name="android/widget/SearchView" since="11">
+ <extends name="android/widget/LinearLayout"/>
+ <implements name="android/view/CollapsibleActionView" since="14"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" since="21"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getImeOptions()I" since="16"/>
+ <method name="getInputType()I" since="16"/>
+ <method name="getMaxWidth()I" since="16"/>
+ <method name="getQuery()Ljava/lang/CharSequence;"/>
+ <method name="getQueryHint()Ljava/lang/CharSequence;" since="16"/>
+ <method name="getSuggestionsAdapter()Landroid/widget/CursorAdapter;"/>
+ <method name="isIconfiedByDefault()Z"/>
+ <method name="isIconified()Z"/>
+ <method name="isQueryRefinementEnabled()Z"/>
+ <method name="isSubmitButtonEnabled()Z"/>
+ <method name="setIconified(Z)V"/>
+ <method name="setIconifiedByDefault(Z)V"/>
+ <method name="setImeOptions(I)V" since="14"/>
+ <method name="setInputType(I)V" since="14"/>
+ <method name="setMaxWidth(I)V"/>
+ <method name="setOnCloseListener(Landroid/widget/SearchView$OnCloseListener;)V"/>
+ <method name="setOnQueryTextFocusChangeListener(Landroid/view/View$OnFocusChangeListener;)V"/>
+ <method name="setOnQueryTextListener(Landroid/widget/SearchView$OnQueryTextListener;)V"/>
+ <method name="setOnSearchClickListener(Landroid/view/View$OnClickListener;)V"/>
+ <method name="setOnSuggestionListener(Landroid/widget/SearchView$OnSuggestionListener;)V"/>
+ <method name="setQuery(Ljava/lang/CharSequence;Z)V"/>
+ <method name="setQueryHint(Ljava/lang/CharSequence;)V"/>
+ <method name="setQueryRefinementEnabled(Z)V"/>
+ <method name="setSearchableInfo(Landroid/app/SearchableInfo;)V"/>
+ <method name="setSubmitButtonEnabled(Z)V"/>
+ <method name="setSuggestionsAdapter(Landroid/widget/CursorAdapter;)V"/>
+ </class>
+ <class name="android/widget/SearchView$OnCloseListener" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="onClose()Z"/>
+ </class>
+ <class name="android/widget/SearchView$OnQueryTextListener" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="onQueryTextChange(Ljava/lang/String;)Z"/>
+ <method name="onQueryTextSubmit(Ljava/lang/String;)Z"/>
+ </class>
+ <class name="android/widget/SearchView$OnSuggestionListener" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="onSuggestionClick(I)Z"/>
+ <method name="onSuggestionSelect(I)Z"/>
+ </class>
+ <class name="android/widget/SectionIndexer" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="getPositionForSection(I)I"/>
+ <method name="getSectionForPosition(I)I"/>
+ <method name="getSections()[Ljava/lang/Object;"/>
+ </class>
+ <class name="android/widget/SeekBar" since="1">
+ <extends name="android/widget/AbsSeekBar"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="setOnSeekBarChangeListener(Landroid/widget/SeekBar$OnSeekBarChangeListener;)V"/>
+ </class>
+ <class name="android/widget/SeekBar$OnSeekBarChangeListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onProgressChanged(Landroid/widget/SeekBar;IZ)V"/>
+ <method name="onStartTrackingTouch(Landroid/widget/SeekBar;)V"/>
+ <method name="onStopTrackingTouch(Landroid/widget/SeekBar;)V"/>
+ </class>
+ <class name="android/widget/ShareActionProvider" since="14">
+ <extends name="android/view/ActionProvider"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="setOnShareTargetSelectedListener(Landroid/widget/ShareActionProvider$OnShareTargetSelectedListener;)V"/>
+ <method name="setShareHistoryFileName(Ljava/lang/String;)V"/>
+ <method name="setShareIntent(Landroid/content/Intent;)V"/>
+ <field name="DEFAULT_SHARE_HISTORY_FILE_NAME"/>
+ </class>
+ <class name="android/widget/ShareActionProvider$OnShareTargetSelectedListener" since="14">
+ <extends name="java/lang/Object"/>
+ <method name="onShareTargetSelected(Landroid/widget/ShareActionProvider;Landroid/content/Intent;)Z"/>
+ </class>
+ <class name="android/widget/SimpleAdapter" since="1">
+ <extends name="android/widget/BaseAdapter"/>
+ <implements name="android/widget/Filterable"/>
+ <implements name="android/widget/ThemedSpinnerAdapter" since="23"/>
+ <method name="&lt;init>(Landroid/content/Context;Ljava/util/List;I[Ljava/lang/String;[I)V"/>
+ <method name="getViewBinder()Landroid/widget/SimpleAdapter$ViewBinder;"/>
+ <method name="setDropDownViewResource(I)V"/>
+ <method name="setViewBinder(Landroid/widget/SimpleAdapter$ViewBinder;)V"/>
+ <method name="setViewImage(Landroid/widget/ImageView;I)V"/>
+ <method name="setViewImage(Landroid/widget/ImageView;Ljava/lang/String;)V"/>
+ <method name="setViewText(Landroid/widget/TextView;Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/widget/SimpleAdapter$ViewBinder" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="setViewValue(Landroid/view/View;Ljava/lang/Object;Ljava/lang/String;)Z"/>
+ </class>
+ <class name="android/widget/SimpleCursorAdapter" since="1">
+ <extends name="android/widget/ResourceCursorAdapter"/>
+ <method name="&lt;init>(Landroid/content/Context;ILandroid/database/Cursor;[Ljava/lang/String;[I)V" deprecated="16"/>
+ <method name="&lt;init>(Landroid/content/Context;ILandroid/database/Cursor;[Ljava/lang/String;[II)V" since="11"/>
+ <method name="changeCursorAndColumns(Landroid/database/Cursor;[Ljava/lang/String;[I)V" since="3"/>
+ <method name="getCursorToStringConverter()Landroid/widget/SimpleCursorAdapter$CursorToStringConverter;"/>
+ <method name="getStringConversionColumn()I"/>
+ <method name="getViewBinder()Landroid/widget/SimpleCursorAdapter$ViewBinder;"/>
+ <method name="setCursorToStringConverter(Landroid/widget/SimpleCursorAdapter$CursorToStringConverter;)V"/>
+ <method name="setStringConversionColumn(I)V"/>
+ <method name="setViewBinder(Landroid/widget/SimpleCursorAdapter$ViewBinder;)V"/>
+ <method name="setViewImage(Landroid/widget/ImageView;Ljava/lang/String;)V"/>
+ <method name="setViewText(Landroid/widget/TextView;Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/widget/SimpleCursorAdapter$CursorToStringConverter" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="convertToString(Landroid/database/Cursor;)Ljava/lang/CharSequence;"/>
+ </class>
+ <class name="android/widget/SimpleCursorAdapter$ViewBinder" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="setViewValue(Landroid/view/View;Landroid/database/Cursor;I)Z"/>
+ </class>
+ <class name="android/widget/SimpleCursorTreeAdapter" since="1">
+ <extends name="android/widget/ResourceCursorTreeAdapter"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/database/Cursor;II[Ljava/lang/String;[III[Ljava/lang/String;[I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/database/Cursor;II[Ljava/lang/String;[II[Ljava/lang/String;[I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/database/Cursor;I[Ljava/lang/String;[II[Ljava/lang/String;[I)V"/>
+ <method name="getViewBinder()Landroid/widget/SimpleCursorTreeAdapter$ViewBinder;" since="5"/>
+ <method name="setViewBinder(Landroid/widget/SimpleCursorTreeAdapter$ViewBinder;)V" since="5"/>
+ <method name="setViewImage(Landroid/widget/ImageView;Ljava/lang/String;)V"/>
+ <method name="setViewText(Landroid/widget/TextView;Ljava/lang/String;)V" since="5"/>
+ </class>
+ <class name="android/widget/SimpleCursorTreeAdapter$ViewBinder" since="5">
+ <extends name="java/lang/Object"/>
+ <method name="setViewValue(Landroid/view/View;Landroid/database/Cursor;I)Z"/>
+ </class>
+ <class name="android/widget/SimpleExpandableListAdapter" since="1">
+ <extends name="android/widget/BaseExpandableListAdapter"/>
+ <method name="&lt;init>(Landroid/content/Context;Ljava/util/List;II[Ljava/lang/String;[ILjava/util/List;II[Ljava/lang/String;[I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Ljava/util/List;II[Ljava/lang/String;[ILjava/util/List;I[Ljava/lang/String;[I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Ljava/util/List;I[Ljava/lang/String;[ILjava/util/List;I[Ljava/lang/String;[I)V"/>
+ <method name="newChildView(ZLandroid/view/ViewGroup;)Landroid/view/View;"/>
+ <method name="newGroupView(ZLandroid/view/ViewGroup;)Landroid/view/View;"/>
+ </class>
+ <class name="android/widget/SlidingDrawer" since="3" deprecated="17">
+ <extends name="android/view/ViewGroup"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="animateClose()V"/>
+ <method name="animateOpen()V"/>
+ <method name="animateToggle()V"/>
+ <method name="close()V"/>
+ <method name="getContent()Landroid/view/View;"/>
+ <method name="getHandle()Landroid/view/View;"/>
+ <method name="isMoving()Z"/>
+ <method name="isOpened()Z"/>
+ <method name="lock()V"/>
+ <method name="open()V"/>
+ <method name="setOnDrawerCloseListener(Landroid/widget/SlidingDrawer$OnDrawerCloseListener;)V"/>
+ <method name="setOnDrawerOpenListener(Landroid/widget/SlidingDrawer$OnDrawerOpenListener;)V"/>
+ <method name="setOnDrawerScrollListener(Landroid/widget/SlidingDrawer$OnDrawerScrollListener;)V"/>
+ <method name="toggle()V"/>
+ <method name="unlock()V"/>
+ <field name="ORIENTATION_HORIZONTAL"/>
+ <field name="ORIENTATION_VERTICAL"/>
+ </class>
+ <class name="android/widget/SlidingDrawer$OnDrawerCloseListener" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="onDrawerClosed()V"/>
+ </class>
+ <class name="android/widget/SlidingDrawer$OnDrawerOpenListener" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="onDrawerOpened()V"/>
+ </class>
+ <class name="android/widget/SlidingDrawer$OnDrawerScrollListener" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="onScrollEnded()V"/>
+ <method name="onScrollStarted()V"/>
+ </class>
+ <class name="android/widget/Space" since="14">
+ <extends name="android/view/View"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ </class>
+ <class name="android/widget/Spinner" since="1">
+ <extends name="android/widget/AbsSpinner"/>
+ <implements name="android/content/DialogInterface$OnClickListener"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;I)V" since="11"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="11"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;III)V" since="21"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;IIILandroid/content/res/Resources$Theme;)V" since="23"/>
+ <method name="getDropDownHorizontalOffset()I" since="16"/>
+ <method name="getDropDownVerticalOffset()I" since="16"/>
+ <method name="getDropDownWidth()I" since="16"/>
+ <method name="getGravity()I" since="16"/>
+ <method name="getPopupBackground()Landroid/graphics/drawable/Drawable;" since="16"/>
+ <method name="getPopupContext()Landroid/content/Context;" since="23"/>
+ <method name="getPrompt()Ljava/lang/CharSequence;"/>
+ <method name="setDropDownHorizontalOffset(I)V" since="16"/>
+ <method name="setDropDownVerticalOffset(I)V" since="16"/>
+ <method name="setDropDownWidth(I)V" since="16"/>
+ <method name="setGravity(I)V" since="11"/>
+ <method name="setPopupBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V" since="16"/>
+ <method name="setPopupBackgroundResource(I)V" since="16"/>
+ <method name="setPrompt(Ljava/lang/CharSequence;)V"/>
+ <method name="setPromptId(I)V"/>
+ <field name="MODE_DIALOG" since="11"/>
+ <field name="MODE_DROPDOWN" since="11"/>
+ </class>
+ <class name="android/widget/SpinnerAdapter" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/widget/Adapter"/>
+ <method name="getDropDownView(ILandroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View;"/>
+ </class>
+ <class name="android/widget/StackView" since="11">
+ <extends name="android/widget/AdapterViewAnimator"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" since="14"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ </class>
+ <class name="android/widget/Switch" since="14">
+ <extends name="android/widget/CompoundButton"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getShowText()Z" since="21"/>
+ <method name="getSplitTrack()Z" since="21"/>
+ <method name="getSwitchMinWidth()I" since="16"/>
+ <method name="getSwitchPadding()I" since="16"/>
+ <method name="getTextOff()Ljava/lang/CharSequence;"/>
+ <method name="getTextOn()Ljava/lang/CharSequence;"/>
+ <method name="getThumbDrawable()Landroid/graphics/drawable/Drawable;" since="16"/>
+ <method name="getThumbTextPadding()I" since="16"/>
+ <method name="getThumbTintList()Landroid/content/res/ColorStateList;" since="23"/>
+ <method name="getThumbTintMode()Landroid/graphics/PorterDuff$Mode;" since="23"/>
+ <method name="getTrackDrawable()Landroid/graphics/drawable/Drawable;" since="16"/>
+ <method name="getTrackTintList()Landroid/content/res/ColorStateList;" since="23"/>
+ <method name="getTrackTintMode()Landroid/graphics/PorterDuff$Mode;" since="23"/>
+ <method name="setShowText(Z)V" since="21"/>
+ <method name="setSplitTrack(Z)V" since="21"/>
+ <method name="setSwitchMinWidth(I)V" since="16"/>
+ <method name="setSwitchPadding(I)V" since="16"/>
+ <method name="setSwitchTextAppearance(Landroid/content/Context;I)V"/>
+ <method name="setSwitchTypeface(Landroid/graphics/Typeface;)V"/>
+ <method name="setSwitchTypeface(Landroid/graphics/Typeface;I)V"/>
+ <method name="setTextOff(Ljava/lang/CharSequence;)V"/>
+ <method name="setTextOn(Ljava/lang/CharSequence;)V"/>
+ <method name="setThumbDrawable(Landroid/graphics/drawable/Drawable;)V" since="16"/>
+ <method name="setThumbResource(I)V" since="16"/>
+ <method name="setThumbTextPadding(I)V" since="16"/>
+ <method name="setThumbTintList(Landroid/content/res/ColorStateList;)V" since="23"/>
+ <method name="setThumbTintMode(Landroid/graphics/PorterDuff$Mode;)V" since="23"/>
+ <method name="setTrackDrawable(Landroid/graphics/drawable/Drawable;)V" since="16"/>
+ <method name="setTrackResource(I)V" since="16"/>
+ <method name="setTrackTintList(Landroid/content/res/ColorStateList;)V" since="23"/>
+ <method name="setTrackTintMode(Landroid/graphics/PorterDuff$Mode;)V" since="23"/>
+ </class>
+ <class name="android/widget/TabHost" since="1">
+ <extends name="android/widget/FrameLayout"/>
+ <implements name="android/view/ViewTreeObserver$OnTouchModeChangeListener"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" since="21"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="addTab(Landroid/widget/TabHost$TabSpec;)V"/>
+ <method name="clearAllTabs()V"/>
+ <method name="getCurrentTab()I"/>
+ <method name="getCurrentTabTag()Ljava/lang/String;"/>
+ <method name="getCurrentTabView()Landroid/view/View;"/>
+ <method name="getCurrentView()Landroid/view/View;"/>
+ <method name="getTabContentView()Landroid/widget/FrameLayout;"/>
+ <method name="getTabWidget()Landroid/widget/TabWidget;"/>
+ <method name="newTabSpec(Ljava/lang/String;)Landroid/widget/TabHost$TabSpec;"/>
+ <method name="setCurrentTab(I)V"/>
+ <method name="setCurrentTabByTag(Ljava/lang/String;)V"/>
+ <method name="setOnTabChangedListener(Landroid/widget/TabHost$OnTabChangeListener;)V"/>
+ <method name="setup()V"/>
+ <method name="setup(Landroid/app/LocalActivityManager;)V"/>
+ </class>
+ <class name="android/widget/TabHost$OnTabChangeListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onTabChanged(Ljava/lang/String;)V"/>
+ </class>
+ <class name="android/widget/TabHost$TabContentFactory" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="createTabContent(Ljava/lang/String;)Landroid/view/View;"/>
+ </class>
+ <class name="android/widget/TabHost$TabSpec" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/widget/TabHost;)V"/>
+ <method name="getTag()Ljava/lang/String;" since="4"/>
+ <method name="setContent(I)Landroid/widget/TabHost$TabSpec;"/>
+ <method name="setContent(Landroid/content/Intent;)Landroid/widget/TabHost$TabSpec;"/>
+ <method name="setContent(Landroid/widget/TabHost$TabContentFactory;)Landroid/widget/TabHost$TabSpec;"/>
+ <method name="setIndicator(Landroid/view/View;)Landroid/widget/TabHost$TabSpec;" since="4"/>
+ <method name="setIndicator(Ljava/lang/CharSequence;)Landroid/widget/TabHost$TabSpec;"/>
+ <method name="setIndicator(Ljava/lang/CharSequence;Landroid/graphics/drawable/Drawable;)Landroid/widget/TabHost$TabSpec;"/>
+ </class>
+ <class name="android/widget/TabWidget" since="1">
+ <extends name="android/widget/LinearLayout"/>
+ <implements name="android/view/View$OnFocusChangeListener"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="focusCurrentTab(I)V"/>
+ <method name="getChildTabViewAt(I)Landroid/view/View;" since="4"/>
+ <method name="getLeftStripDrawable()Landroid/graphics/drawable/Drawable;" since="24"/>
+ <method name="getRightStripDrawable()Landroid/graphics/drawable/Drawable;" since="24"/>
+ <method name="getTabCount()I" since="4"/>
+ <method name="isStripEnabled()Z" since="8"/>
+ <method name="setCurrentTab(I)V"/>
+ <method name="setDividerDrawable(I)V" since="4"/>
+ <method name="setDividerDrawable(Landroid/graphics/drawable/Drawable;)V" since="4"/>
+ <method name="setLeftStripDrawable(I)V" since="8"/>
+ <method name="setLeftStripDrawable(Landroid/graphics/drawable/Drawable;)V" since="8"/>
+ <method name="setRightStripDrawable(I)V" since="8"/>
+ <method name="setRightStripDrawable(Landroid/graphics/drawable/Drawable;)V" since="8"/>
+ <method name="setStripEnabled(Z)V" since="8"/>
+ </class>
+ <class name="android/widget/TableLayout" since="1">
+ <extends name="android/widget/LinearLayout"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/TableLayout$LayoutParams;"/>
+ <method name="isColumnCollapsed(I)Z"/>
+ <method name="isColumnShrinkable(I)Z"/>
+ <method name="isColumnStretchable(I)Z"/>
+ <method name="isShrinkAllColumns()Z"/>
+ <method name="isStretchAllColumns()Z"/>
+ <method name="setColumnCollapsed(IZ)V"/>
+ <method name="setColumnShrinkable(IZ)V"/>
+ <method name="setColumnStretchable(IZ)V"/>
+ <method name="setShrinkAllColumns(Z)V"/>
+ <method name="setStretchAllColumns(Z)V"/>
+ </class>
+ <class name="android/widget/TableLayout$LayoutParams" since="1">
+ <extends name="android/widget/LinearLayout$LayoutParams"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="&lt;init>(IIF)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup$MarginLayoutParams;)V"/>
+ </class>
+ <class name="android/widget/TableRow" since="1">
+ <extends name="android/widget/LinearLayout"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/TableRow$LayoutParams;"/>
+ <method name="getVirtualChildAt(I)Landroid/view/View;"/>
+ <method name="getVirtualChildCount()I"/>
+ </class>
+ <class name="android/widget/TableRow$LayoutParams" since="1">
+ <extends name="android/widget/LinearLayout$LayoutParams"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="&lt;init>(IIF)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup$MarginLayoutParams;)V"/>
+ <field name="column"/>
+ <field name="span"/>
+ </class>
+ <class name="android/widget/TextClock" since="17">
+ <extends name="android/widget/TextView"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getFormat12Hour()Ljava/lang/CharSequence;"/>
+ <method name="getFormat24Hour()Ljava/lang/CharSequence;"/>
+ <method name="getTimeZone()Ljava/lang/String;"/>
+ <method name="is24HourModeEnabled()Z"/>
+ <method name="setFormat12Hour(Ljava/lang/CharSequence;)V"/>
+ <method name="setFormat24Hour(Ljava/lang/CharSequence;)V"/>
+ <method name="setTimeZone(Ljava/lang/String;)V"/>
+ <field name="DEFAULT_FORMAT_12_HOUR" deprecated="18"/>
+ <field name="DEFAULT_FORMAT_24_HOUR" deprecated="18"/>
+ </class>
+ <class name="android/widget/TextSwitcher" since="1">
+ <extends name="android/widget/ViewSwitcher"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="setCurrentText(Ljava/lang/CharSequence;)V"/>
+ <method name="setText(Ljava/lang/CharSequence;)V"/>
+ </class>
+ <class name="android/widget/TextView" since="1">
+ <extends name="android/view/View"/>
+ <implements name="android/view/ViewTreeObserver$OnPreDrawListener"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="addTextChangedListener(Landroid/text/TextWatcher;)V"/>
+ <method name="append(Ljava/lang/CharSequence;)V"/>
+ <method name="append(Ljava/lang/CharSequence;II)V"/>
+ <method name="beginBatchEdit()V" since="3"/>
+ <method name="bringPointIntoView(I)Z" since="3"/>
+ <method name="clearComposingText()V" since="3"/>
+ <method name="debug(I)V"/>
+ <method name="didTouchFocusSelect()Z" since="3"/>
+ <method name="endBatchEdit()V" since="3"/>
+ <method name="extractText(Landroid/view/inputmethod/ExtractedTextRequest;Landroid/view/inputmethod/ExtractedText;)Z" since="3"/>
+ <method name="getAutoLinkMask()I"/>
+ <method name="getAutoSizeMaxTextSize()I" since="26"/>
+ <method name="getAutoSizeMinTextSize()I" since="26"/>
+ <method name="getAutoSizeStepGranularity()I" since="26"/>
+ <method name="getAutoSizeTextAvailableSizes()[I" since="26"/>
+ <method name="getAutoSizeTextType()I" since="26"/>
+ <method name="getBreakStrategy()I" since="23"/>
+ <method name="getCompoundDrawablePadding()I"/>
+ <method name="getCompoundDrawableTintList()Landroid/content/res/ColorStateList;" since="23"/>
+ <method name="getCompoundDrawableTintMode()Landroid/graphics/PorterDuff$Mode;" since="23"/>
+ <method name="getCompoundDrawables()[Landroid/graphics/drawable/Drawable;"/>
+ <method name="getCompoundDrawablesRelative()[Landroid/graphics/drawable/Drawable;" since="17"/>
+ <method name="getCompoundPaddingBottom()I"/>
+ <method name="getCompoundPaddingEnd()I" since="17"/>
+ <method name="getCompoundPaddingLeft()I"/>
+ <method name="getCompoundPaddingRight()I"/>
+ <method name="getCompoundPaddingStart()I" since="17"/>
+ <method name="getCompoundPaddingTop()I"/>
+ <method name="getCurrentHintTextColor()I"/>
+ <method name="getCurrentTextColor()I"/>
+ <method name="getCustomInsertionActionModeCallback()Landroid/view/ActionMode$Callback;" since="23"/>
+ <method name="getCustomSelectionActionModeCallback()Landroid/view/ActionMode$Callback;" since="11"/>
+ <method name="getDefaultEditable()Z"/>
+ <method name="getDefaultMovementMethod()Landroid/text/method/MovementMethod;"/>
+ <method name="getEditableText()Landroid/text/Editable;" since="3"/>
+ <method name="getEllipsize()Landroid/text/TextUtils$TruncateAt;"/>
+ <method name="getError()Ljava/lang/CharSequence;"/>
+ <method name="getExtendedPaddingBottom()I"/>
+ <method name="getExtendedPaddingTop()I"/>
+ <method name="getFilters()[Landroid/text/InputFilter;"/>
+ <method name="getFontFeatureSettings()Ljava/lang/String;" since="21"/>
+ <method name="getFontVariationSettings()Ljava/lang/String;" since="26"/>
+ <method name="getFreezesText()Z"/>
+ <method name="getGravity()I"/>
+ <method name="getHighlightColor()I" since="16"/>
+ <method name="getHint()Ljava/lang/CharSequence;"/>
+ <method name="getHintTextColors()Landroid/content/res/ColorStateList;"/>
+ <method name="getHyphenationFrequency()I" since="23"/>
+ <method name="getImeActionId()I" since="3"/>
+ <method name="getImeActionLabel()Ljava/lang/CharSequence;" since="3"/>
+ <method name="getImeHintLocales()Landroid/os/LocaleList;" since="24"/>
+ <method name="getImeOptions()I" since="3"/>
+ <method name="getIncludeFontPadding()Z" since="16"/>
+ <method name="getInputExtras(Z)Landroid/os/Bundle;" since="3"/>
+ <method name="getInputType()I" since="3"/>
+ <method name="getJustificationMode()I" since="26"/>
+ <method name="getKeyListener()Landroid/text/method/KeyListener;"/>
+ <method name="getLayout()Landroid/text/Layout;"/>
+ <method name="getLetterSpacing()F" since="21"/>
+ <method name="getLineBounds(ILandroid/graphics/Rect;)I"/>
+ <method name="getLineCount()I"/>
+ <method name="getLineHeight()I"/>
+ <method name="getLineSpacingExtra()F" since="16"/>
+ <method name="getLineSpacingMultiplier()F" since="16"/>
+ <method name="getLinkTextColors()Landroid/content/res/ColorStateList;"/>
+ <method name="getLinksClickable()Z"/>
+ <method name="getMarqueeRepeatLimit()I" since="16"/>
+ <method name="getMaxEms()I" since="16"/>
+ <method name="getMaxHeight()I" since="16"/>
+ <method name="getMaxLines()I" since="16"/>
+ <method name="getMaxWidth()I" since="16"/>
+ <method name="getMinEms()I" since="16"/>
+ <method name="getMinHeight()I" since="16"/>
+ <method name="getMinLines()I" since="16"/>
+ <method name="getMinWidth()I" since="16"/>
+ <method name="getMovementMethod()Landroid/text/method/MovementMethod;"/>
+ <method name="getOffsetForPosition(FF)I" since="14"/>
+ <method name="getPaint()Landroid/text/TextPaint;"/>
+ <method name="getPaintFlags()I"/>
+ <method name="getPrivateImeOptions()Ljava/lang/String;" since="3"/>
+ <method name="getSelectionEnd()I"/>
+ <method name="getSelectionStart()I"/>
+ <method name="getShadowColor()I" since="16"/>
+ <method name="getShadowDx()F" since="16"/>
+ <method name="getShadowDy()F" since="16"/>
+ <method name="getShadowRadius()F" since="16"/>
+ <method name="getShowSoftInputOnFocus()Z" since="21"/>
+ <method name="getText()Ljava/lang/CharSequence;"/>
+ <method name="getTextClassifier()Landroid/view/textclassifier/TextClassifier;" since="26"/>
+ <method name="getTextColor(Landroid/content/Context;Landroid/content/res/TypedArray;I)I" removed="21"/>
+ <method name="getTextColors()Landroid/content/res/ColorStateList;"/>
+ <method name="getTextColors(Landroid/content/Context;Landroid/content/res/TypedArray;)Landroid/content/res/ColorStateList;" removed="21"/>
+ <method name="getTextLocale()Ljava/util/Locale;" since="17"/>
+ <method name="getTextLocales()Landroid/os/LocaleList;" since="24"/>
+ <method name="getTextScaleX()F"/>
+ <method name="getTextSize()F"/>
+ <method name="getTotalPaddingBottom()I"/>
+ <method name="getTotalPaddingEnd()I" since="17"/>
+ <method name="getTotalPaddingLeft()I"/>
+ <method name="getTotalPaddingRight()I"/>
+ <method name="getTotalPaddingStart()I" since="17"/>
+ <method name="getTotalPaddingTop()I"/>
+ <method name="getTransformationMethod()Landroid/text/method/TransformationMethod;"/>
+ <method name="getTypeface()Landroid/graphics/Typeface;"/>
+ <method name="getUrls()[Landroid/text/style/URLSpan;"/>
+ <method name="hasSelection()Z"/>
+ <method name="isCursorVisible()Z" since="16"/>
+ <method name="isInputMethodTarget()Z" since="3"/>
+ <method name="isSuggestionsEnabled()Z" since="14"/>
+ <method name="isTextSelectable()Z" since="11"/>
+ <method name="length()I"/>
+ <method name="moveCursorToVisibleOffset()Z" since="3"/>
+ <method name="onBeginBatchEdit()V" since="3"/>
+ <method name="onCommitCompletion(Landroid/view/inputmethod/CompletionInfo;)V" since="3"/>
+ <method name="onCommitCorrection(Landroid/view/inputmethod/CorrectionInfo;)V" since="11"/>
+ <method name="onEditorAction(I)V" since="3"/>
+ <method name="onEndBatchEdit()V" since="3"/>
+ <method name="onPrivateIMECommand(Ljava/lang/String;Landroid/os/Bundle;)Z" since="3"/>
+ <method name="onSelectionChanged(II)V" since="3"/>
+ <method name="onTextChanged(Ljava/lang/CharSequence;III)V"/>
+ <method name="onTextContextMenuItem(I)Z" since="3"/>
+ <method name="removeTextChangedListener(Landroid/text/TextWatcher;)V"/>
+ <method name="resetResolvedDrawables()V" since="14" removed="17"/>
+ <method name="resetResolvedLayoutDirection()V" since="14" removed="16"/>
+ <method name="resolveDrawables()V" since="14" removed="17"/>
+ <method name="resolveTextDirection()V" since="14" removed="16"/>
+ <method name="setAllCaps(Z)V" since="14"/>
+ <method name="setAutoLinkMask(I)V"/>
+ <method name="setAutoSizeTextTypeUniformWithConfiguration(IIII)V" since="26"/>
+ <method name="setAutoSizeTextTypeUniformWithPresetSizes([II)V" since="26"/>
+ <method name="setAutoSizeTextTypeWithDefaults(I)V" since="26"/>
+ <method name="setBreakStrategy(I)V" since="23"/>
+ <method name="setCompoundDrawablePadding(I)V"/>
+ <method name="setCompoundDrawableTintList(Landroid/content/res/ColorStateList;)V" since="23"/>
+ <method name="setCompoundDrawableTintMode(Landroid/graphics/PorterDuff$Mode;)V" since="23"/>
+ <method name="setCompoundDrawables(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setCompoundDrawablesRelative(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V" since="17"/>
+ <method name="setCompoundDrawablesRelativeWithIntrinsicBounds(IIII)V" since="17"/>
+ <method name="setCompoundDrawablesRelativeWithIntrinsicBounds(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V" since="17"/>
+ <method name="setCompoundDrawablesWithIntrinsicBounds(IIII)V" since="3"/>
+ <method name="setCompoundDrawablesWithIntrinsicBounds(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setCursorVisible(Z)V"/>
+ <method name="setCustomInsertionActionModeCallback(Landroid/view/ActionMode$Callback;)V" since="23"/>
+ <method name="setCustomSelectionActionModeCallback(Landroid/view/ActionMode$Callback;)V" since="11"/>
+ <method name="setEditableFactory(Landroid/text/Editable$Factory;)V"/>
+ <method name="setElegantTextHeight(Z)V" since="21"/>
+ <method name="setEllipsize(Landroid/text/TextUtils$TruncateAt;)V"/>
+ <method name="setEms(I)V"/>
+ <method name="setError(Ljava/lang/CharSequence;)V"/>
+ <method name="setError(Ljava/lang/CharSequence;Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setExtractedText(Landroid/view/inputmethod/ExtractedText;)V" since="3"/>
+ <method name="setFilters([Landroid/text/InputFilter;)V"/>
+ <method name="setFontFeatureSettings(Ljava/lang/String;)V" since="21"/>
+ <method name="setFontVariationSettings(Ljava/lang/String;)Z" since="26"/>
+ <method name="setFrame(IIII)Z"/>
+ <method name="setFreezesText(Z)V"/>
+ <method name="setGravity(I)V"/>
+ <method name="setHeight(I)V"/>
+ <method name="setHighlightColor(I)V"/>
+ <method name="setHint(I)V"/>
+ <method name="setHint(Ljava/lang/CharSequence;)V"/>
+ <method name="setHintTextColor(I)V"/>
+ <method name="setHintTextColor(Landroid/content/res/ColorStateList;)V"/>
+ <method name="setHorizontallyScrolling(Z)V"/>
+ <method name="setHyphenationFrequency(I)V" since="23"/>
+ <method name="setImeActionLabel(Ljava/lang/CharSequence;I)V" since="3"/>
+ <method name="setImeHintLocales(Landroid/os/LocaleList;)V" since="24"/>
+ <method name="setImeOptions(I)V" since="3"/>
+ <method name="setIncludeFontPadding(Z)V"/>
+ <method name="setInputExtras(I)V" since="3"/>
+ <method name="setInputType(I)V" since="3"/>
+ <method name="setJustificationMode(I)V" since="26"/>
+ <method name="setKeyListener(Landroid/text/method/KeyListener;)V"/>
+ <method name="setLetterSpacing(F)V" since="21"/>
+ <method name="setLineSpacing(FF)V"/>
+ <method name="setLines(I)V"/>
+ <method name="setLinkTextColor(I)V"/>
+ <method name="setLinkTextColor(Landroid/content/res/ColorStateList;)V"/>
+ <method name="setLinksClickable(Z)V"/>
+ <method name="setMarqueeRepeatLimit(I)V" since="2"/>
+ <method name="setMaxEms(I)V"/>
+ <method name="setMaxHeight(I)V"/>
+ <method name="setMaxLines(I)V"/>
+ <method name="setMaxWidth(I)V"/>
+ <method name="setMinEms(I)V"/>
+ <method name="setMinHeight(I)V"/>
+ <method name="setMinLines(I)V"/>
+ <method name="setMinWidth(I)V"/>
+ <method name="setMovementMethod(Landroid/text/method/MovementMethod;)V"/>
+ <method name="setOnEditorActionListener(Landroid/widget/TextView$OnEditorActionListener;)V" since="3"/>
+ <method name="setPaddingRelative(IIII)V" since="16"/>
+ <method name="setPaintFlags(I)V"/>
+ <method name="setPrivateImeOptions(Ljava/lang/String;)V" since="3"/>
+ <method name="setRawInputType(I)V" since="3"/>
+ <method name="setScroller(Landroid/widget/Scroller;)V"/>
+ <method name="setSelectAllOnFocus(Z)V"/>
+ <method name="setShadowLayer(FFFI)V"/>
+ <method name="setShowSoftInputOnFocus(Z)V" since="21"/>
+ <method name="setSingleLine()V"/>
+ <method name="setSingleLine(Z)V"/>
+ <method name="setSpannableFactory(Landroid/text/Spannable$Factory;)V"/>
+ <method name="setText(I)V"/>
+ <method name="setText(ILandroid/widget/TextView$BufferType;)V"/>
+ <method name="setText(Ljava/lang/CharSequence;)V"/>
+ <method name="setText(Ljava/lang/CharSequence;Landroid/widget/TextView$BufferType;)V"/>
+ <method name="setText([CII)V"/>
+ <method name="setTextAppearance(I)V" since="23"/>
+ <method name="setTextAppearance(Landroid/content/Context;I)V" deprecated="23"/>
+ <method name="setTextClassifier(Landroid/view/textclassifier/TextClassifier;)V" since="26"/>
+ <method name="setTextColor(I)V"/>
+ <method name="setTextColor(Landroid/content/res/ColorStateList;)V"/>
+ <method name="setTextIsSelectable(Z)V" since="11"/>
+ <method name="setTextKeepState(Ljava/lang/CharSequence;)V"/>
+ <method name="setTextKeepState(Ljava/lang/CharSequence;Landroid/widget/TextView$BufferType;)V"/>
+ <method name="setTextLocale(Ljava/util/Locale;)V" since="17"/>
+ <method name="setTextLocales(Landroid/os/LocaleList;)V" since="24"/>
+ <method name="setTextScaleX(F)V"/>
+ <method name="setTextSize(F)V"/>
+ <method name="setTextSize(IF)V"/>
+ <method name="setTransformationMethod(Landroid/text/method/TransformationMethod;)V"/>
+ <method name="setTypeface(Landroid/graphics/Typeface;)V"/>
+ <method name="setTypeface(Landroid/graphics/Typeface;I)V"/>
+ <method name="setWidth(I)V"/>
+ <field name="AUTO_SIZE_TEXT_TYPE_NONE" since="26"/>
+ <field name="AUTO_SIZE_TEXT_TYPE_UNIFORM" since="26"/>
+ </class>
+ <class name="android/widget/TextView$BufferType" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Landroid/widget/TextView$BufferType;"/>
+ <method name="values()[Landroid/widget/TextView$BufferType;"/>
+ <field name="EDITABLE"/>
+ <field name="NORMAL"/>
+ <field name="SPANNABLE"/>
+ </class>
+ <class name="android/widget/TextView$OnEditorActionListener" since="3">
+ <extends name="java/lang/Object"/>
+ <method name="onEditorAction(Landroid/widget/TextView;ILandroid/view/KeyEvent;)Z"/>
+ </class>
+ <class name="android/widget/TextView$SavedState" since="1">
+ <extends name="android/view/View$BaseSavedState"/>
+ <method name="&lt;init>()V"/>
+ <field name="CREATOR"/>
+ </class>
+ <class name="android/widget/ThemedSpinnerAdapter" since="23">
+ <extends name="java/lang/Object"/>
+ <implements name="android/widget/SpinnerAdapter"/>
+ <method name="getDropDownViewTheme()Landroid/content/res/Resources$Theme;"/>
+ <method name="setDropDownViewTheme(Landroid/content/res/Resources$Theme;)V"/>
+ </class>
+ <class name="android/widget/TimePicker" since="1">
+ <extends name="android/widget/FrameLayout"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getCurrentHour()Ljava/lang/Integer;" deprecated="23"/>
+ <method name="getCurrentMinute()Ljava/lang/Integer;" deprecated="23"/>
+ <method name="getHour()I" since="23"/>
+ <method name="getMinute()I" since="23"/>
+ <method name="is24HourView()Z"/>
+ <method name="setCurrentHour(Ljava/lang/Integer;)V" deprecated="23"/>
+ <method name="setCurrentMinute(Ljava/lang/Integer;)V" deprecated="23"/>
+ <method name="setHour(I)V" since="23"/>
+ <method name="setIs24HourView(Ljava/lang/Boolean;)V"/>
+ <method name="setMinute(I)V" since="23"/>
+ <method name="setOnTimeChangedListener(Landroid/widget/TimePicker$OnTimeChangedListener;)V"/>
+ <method name="validateInput()Z" since="26"/>
+ </class>
+ <class name="android/widget/TimePicker$OnTimeChangedListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="onTimeChanged(Landroid/widget/TimePicker;II)V"/>
+ </class>
+ <class name="android/widget/Toast" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="cancel()V"/>
+ <method name="getDuration()I"/>
+ <method name="getGravity()I"/>
+ <method name="getHorizontalMargin()F"/>
+ <method name="getVerticalMargin()F"/>
+ <method name="getView()Landroid/view/View;"/>
+ <method name="getXOffset()I"/>
+ <method name="getYOffset()I"/>
+ <method name="makeText(Landroid/content/Context;II)Landroid/widget/Toast;"/>
+ <method name="makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;"/>
+ <method name="setDuration(I)V"/>
+ <method name="setGravity(III)V"/>
+ <method name="setMargin(FF)V"/>
+ <method name="setText(I)V"/>
+ <method name="setText(Ljava/lang/CharSequence;)V"/>
+ <method name="setView(Landroid/view/View;)V"/>
+ <method name="show()V"/>
+ <field name="LENGTH_LONG"/>
+ <field name="LENGTH_SHORT"/>
+ </class>
+ <class name="android/widget/ToggleButton" since="1">
+ <extends name="android/widget/CompoundButton"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getTextOff()Ljava/lang/CharSequence;"/>
+ <method name="getTextOn()Ljava/lang/CharSequence;"/>
+ <method name="setTextOff(Ljava/lang/CharSequence;)V"/>
+ <method name="setTextOn(Ljava/lang/CharSequence;)V"/>
+ </class>
+ <class name="android/widget/Toolbar" since="21">
+ <extends name="android/view/ViewGroup"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V"/>
+ <method name="collapseActionView()V"/>
+ <method name="dismissPopupMenus()V"/>
+ <method name="generateDefaultLayoutParams()Landroid/widget/Toolbar$LayoutParams;"/>
+ <method name="generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/Toolbar$LayoutParams;"/>
+ <method name="generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroid/widget/Toolbar$LayoutParams;"/>
+ <method name="getContentInsetEnd()I"/>
+ <method name="getContentInsetEndWithActions()I" since="24"/>
+ <method name="getContentInsetLeft()I"/>
+ <method name="getContentInsetRight()I"/>
+ <method name="getContentInsetStart()I"/>
+ <method name="getContentInsetStartWithNavigation()I" since="24"/>
+ <method name="getCurrentContentInsetEnd()I" since="24"/>
+ <method name="getCurrentContentInsetLeft()I" since="24"/>
+ <method name="getCurrentContentInsetRight()I" since="24"/>
+ <method name="getCurrentContentInsetStart()I" since="24"/>
+ <method name="getLogo()Landroid/graphics/drawable/Drawable;"/>
+ <method name="getLogoDescription()Ljava/lang/CharSequence;"/>
+ <method name="getMenu()Landroid/view/Menu;"/>
+ <method name="getNavigationContentDescription()Ljava/lang/CharSequence;"/>
+ <method name="getNavigationIcon()Landroid/graphics/drawable/Drawable;"/>
+ <method name="getOverflowIcon()Landroid/graphics/drawable/Drawable;" since="23"/>
+ <method name="getPopupTheme()I"/>
+ <method name="getSubtitle()Ljava/lang/CharSequence;"/>
+ <method name="getTitle()Ljava/lang/CharSequence;"/>
+ <method name="getTitleMarginBottom()I" since="24"/>
+ <method name="getTitleMarginEnd()I" since="24"/>
+ <method name="getTitleMarginStart()I" since="24"/>
+ <method name="getTitleMarginTop()I" since="24"/>
+ <method name="hasExpandedActionView()Z"/>
+ <method name="hideOverflowMenu()Z"/>
+ <method name="inflateMenu(I)V"/>
+ <method name="isOverflowMenuShowing()Z"/>
+ <method name="setContentInsetEndWithActions(I)V" since="24"/>
+ <method name="setContentInsetStartWithNavigation(I)V" since="24"/>
+ <method name="setContentInsetsAbsolute(II)V"/>
+ <method name="setContentInsetsRelative(II)V"/>
+ <method name="setLogo(I)V"/>
+ <method name="setLogo(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setLogoDescription(I)V"/>
+ <method name="setLogoDescription(Ljava/lang/CharSequence;)V"/>
+ <method name="setNavigationContentDescription(I)V"/>
+ <method name="setNavigationContentDescription(Ljava/lang/CharSequence;)V"/>
+ <method name="setNavigationIcon(I)V"/>
+ <method name="setNavigationIcon(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setNavigationOnClickListener(Landroid/view/View$OnClickListener;)V"/>
+ <method name="setOnMenuItemClickListener(Landroid/widget/Toolbar$OnMenuItemClickListener;)V"/>
+ <method name="setOverflowIcon(Landroid/graphics/drawable/Drawable;)V" since="23"/>
+ <method name="setPopupTheme(I)V"/>
+ <method name="setSubtitle(I)V"/>
+ <method name="setSubtitle(Ljava/lang/CharSequence;)V"/>
+ <method name="setSubtitleTextAppearance(Landroid/content/Context;I)V"/>
+ <method name="setSubtitleTextColor(I)V"/>
+ <method name="setTitle(I)V"/>
+ <method name="setTitle(Ljava/lang/CharSequence;)V"/>
+ <method name="setTitleMargin(IIII)V" since="24"/>
+ <method name="setTitleMarginBottom(I)V" since="24"/>
+ <method name="setTitleMarginEnd(I)V" since="24"/>
+ <method name="setTitleMarginStart(I)V" since="24"/>
+ <method name="setTitleMarginTop(I)V" since="24"/>
+ <method name="setTitleTextAppearance(Landroid/content/Context;I)V"/>
+ <method name="setTitleTextColor(I)V"/>
+ <method name="showOverflowMenu()Z"/>
+ </class>
+ <class name="android/widget/Toolbar$LayoutParams" since="21">
+ <extends name="android/app/ActionBar$LayoutParams"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="&lt;init>(III)V"/>
+ <method name="&lt;init>(Landroid/app/ActionBar$LayoutParams;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup$MarginLayoutParams;)V"/>
+ <method name="&lt;init>(Landroid/widget/Toolbar$LayoutParams;)V"/>
+ </class>
+ <class name="android/widget/Toolbar$OnMenuItemClickListener" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="onMenuItemClick(Landroid/view/MenuItem;)Z"/>
+ </class>
+ <class name="android/widget/TwoLineListItem" since="1" deprecated="17">
+ <extends name="android/widget/RelativeLayout"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="getText1()Landroid/widget/TextView;"/>
+ <method name="getText2()Landroid/widget/TextView;"/>
+ </class>
+ <class name="android/widget/VideoView" since="1">
+ <extends name="android/view/SurfaceView"/>
+ <implements name="android/widget/MediaController$MediaPlayerControl"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="addSubtitleSource(Ljava/io/InputStream;Landroid/media/MediaFormat;)V" since="19"/>
+ <method name="resolveAdjustedSize(II)I"/>
+ <method name="resume()V" since="8"/>
+ <method name="setAudioAttributes(Landroid/media/AudioAttributes;)V" since="26"/>
+ <method name="setAudioFocusRequest(I)V" since="26"/>
+ <method name="setMediaController(Landroid/widget/MediaController;)V"/>
+ <method name="setOnCompletionListener(Landroid/media/MediaPlayer$OnCompletionListener;)V"/>
+ <method name="setOnErrorListener(Landroid/media/MediaPlayer$OnErrorListener;)V"/>
+ <method name="setOnInfoListener(Landroid/media/MediaPlayer$OnInfoListener;)V" since="17"/>
+ <method name="setOnPreparedListener(Landroid/media/MediaPlayer$OnPreparedListener;)V"/>
+ <method name="setVideoPath(Ljava/lang/String;)V"/>
+ <method name="setVideoURI(Landroid/net/Uri;)V"/>
+ <method name="setVideoURI(Landroid/net/Uri;Ljava/util/Map;)V" since="21"/>
+ <method name="stopPlayback()V"/>
+ <method name="suspend()V" since="8"/>
+ </class>
+ <class name="android/widget/ViewAnimator" since="1">
+ <extends name="android/widget/FrameLayout"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="getAnimateFirstView()Z" since="17"/>
+ <method name="getCurrentView()Landroid/view/View;"/>
+ <method name="getDisplayedChild()I"/>
+ <method name="getInAnimation()Landroid/view/animation/Animation;"/>
+ <method name="getOutAnimation()Landroid/view/animation/Animation;"/>
+ <method name="setAnimateFirstView(Z)V"/>
+ <method name="setDisplayedChild(I)V"/>
+ <method name="setInAnimation(Landroid/content/Context;I)V"/>
+ <method name="setInAnimation(Landroid/view/animation/Animation;)V"/>
+ <method name="setOutAnimation(Landroid/content/Context;I)V"/>
+ <method name="setOutAnimation(Landroid/view/animation/Animation;)V"/>
+ <method name="showNext()V"/>
+ <method name="showPrevious()V"/>
+ </class>
+ <class name="android/widget/ViewFlipper" since="1">
+ <extends name="android/widget/ViewAnimator"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="isAutoStart()Z" since="7"/>
+ <method name="isFlipping()Z"/>
+ <method name="setAutoStart(Z)V" since="7"/>
+ <method name="setFlipInterval(I)V"/>
+ <method name="startFlipping()V"/>
+ <method name="stopFlipping()V"/>
+ </class>
+ <class name="android/widget/ViewSwitcher" since="1">
+ <extends name="android/widget/ViewAnimator"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="getNextView()Landroid/view/View;"/>
+ <method name="reset()V"/>
+ <method name="setFactory(Landroid/widget/ViewSwitcher$ViewFactory;)V"/>
+ </class>
+ <class name="android/widget/ViewSwitcher$ViewFactory" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="makeView()Landroid/view/View;"/>
+ </class>
+ <class name="android/widget/WrapperListAdapter" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="android/widget/ListAdapter"/>
+ <method name="getWrappedAdapter()Landroid/widget/ListAdapter;"/>
+ </class>
+ <class name="android/widget/ZoomButton" since="1" deprecated="26">
+ <extends name="android/widget/ImageButton"/>
+ <implements name="android/view/View$OnLongClickListener"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21"/>
+ <method name="setZoomSpeed(J)V"/>
+ </class>
+ <class name="android/widget/ZoomButtonsController" since="4" deprecated="26">
+ <extends name="java/lang/Object"/>
+ <implements name="android/view/View$OnTouchListener"/>
+ <method name="&lt;init>(Landroid/view/View;)V"/>
+ <method name="getContainer()Landroid/view/ViewGroup;"/>
+ <method name="getZoomControls()Landroid/view/View;"/>
+ <method name="isAutoDismissed()Z"/>
+ <method name="isVisible()Z"/>
+ <method name="setAutoDismissed(Z)V"/>
+ <method name="setFocusable(Z)V"/>
+ <method name="setOnZoomListener(Landroid/widget/ZoomButtonsController$OnZoomListener;)V"/>
+ <method name="setVisible(Z)V"/>
+ <method name="setZoomInEnabled(Z)V"/>
+ <method name="setZoomOutEnabled(Z)V"/>
+ <method name="setZoomSpeed(J)V"/>
+ </class>
+ <class name="android/widget/ZoomButtonsController$OnZoomListener" since="4">
+ <extends name="java/lang/Object"/>
+ <method name="onVisibilityChanged(Z)V"/>
+ <method name="onZoom(Z)V"/>
+ </class>
+ <class name="android/widget/ZoomControls" since="1">
+ <extends name="android/widget/LinearLayout"/>
+ <method name="&lt;init>(Landroid/content/Context;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="hide()V"/>
+ <method name="setIsZoomInEnabled(Z)V"/>
+ <method name="setIsZoomOutEnabled(Z)V"/>
+ <method name="setOnZoomInClickListener(Landroid/view/View$OnClickListener;)V"/>
+ <method name="setOnZoomOutClickListener(Landroid/view/View$OnClickListener;)V"/>
+ <method name="setZoomSpeed(J)V"/>
+ <method name="show()V"/>
+ </class>
+ <class name="com/android/internal/util/Predicate" since="1" deprecated="26">
+ <extends name="java/lang/Object"/>
+ <method name="apply(Ljava/lang/Object;)Z"/>
+ </class>
+ <class name="com/google/android/maps/GeoPoint" since="1" removed="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="getLatitudeE6()I"/>
+ <method name="getLongitudeE6()I"/>
+ </class>
+ <class name="com/google/android/maps/ItemizedOverlay" since="1" removed="3">
+ <extends name="com/google/android/maps/Overlay"/>
+ <method name="&lt;init>(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="boundCenter(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable;"/>
+ <method name="boundCenterBottom(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable;"/>
+ <method name="createItem(I)Lcom/google/android/maps/OverlayItem;"/>
+ <method name="getCenter()Lcom/google/android/maps/GeoPoint;"/>
+ <method name="getFocus()Lcom/google/android/maps/OverlayItem;"/>
+ <method name="getIndexToDraw(I)I"/>
+ <method name="getItem(I)Lcom/google/android/maps/OverlayItem;"/>
+ <method name="getLastFocusedIndex()I"/>
+ <method name="getLatSpanE6()I"/>
+ <method name="getLonSpanE6()I"/>
+ <method name="hitTest(Lcom/google/android/maps/OverlayItem;Landroid/graphics/drawable/Drawable;II)Z"/>
+ <method name="nextFocus(Z)Lcom/google/android/maps/OverlayItem;"/>
+ <method name="onTap(I)Z"/>
+ <method name="populate()V"/>
+ <method name="setDrawFocusedItem(Z)V"/>
+ <method name="setFocus(Lcom/google/android/maps/OverlayItem;)V"/>
+ <method name="setLastFocusedIndex(I)V"/>
+ <method name="setOnFocusChangeListener(Lcom/google/android/maps/ItemizedOverlay$OnFocusChangeListener;)V"/>
+ <method name="size()I"/>
+ </class>
+ <class name="com/google/android/maps/ItemizedOverlay$OnFocusChangeListener" since="1" removed="3">
+ <extends name="java/lang/Object"/>
+ <method name="onFocusChanged(Lcom/google/android/maps/ItemizedOverlay;Lcom/google/android/maps/OverlayItem;)V"/>
+ </class>
+ <class name="com/google/android/maps/MapActivity" since="1" removed="3">
+ <extends name="android/app/Activity"/>
+ <method name="&lt;init>()V"/>
+ <method name="isLocationDisplayed()Z"/>
+ <method name="isRouteDisplayed()Z"/>
+ </class>
+ <class name="com/google/android/maps/MapController" since="1" removed="3">
+ <extends name="java/lang/Object"/>
+ <implements name="android/view/View$OnKeyListener"/>
+ <method name="&lt;init>()V"/>
+ <method name="animateTo(Lcom/google/android/maps/GeoPoint;)V"/>
+ <method name="animateTo(Lcom/google/android/maps/GeoPoint;Landroid/os/Message;)V"/>
+ <method name="animateTo(Lcom/google/android/maps/GeoPoint;Ljava/lang/Runnable;)V"/>
+ <method name="scrollBy(II)V"/>
+ <method name="setCenter(Lcom/google/android/maps/GeoPoint;)V"/>
+ <method name="setZoom(I)I"/>
+ <method name="stopAnimation(Z)V"/>
+ <method name="stopPanning()V"/>
+ <method name="zoomIn()Z"/>
+ <method name="zoomInFixing(II)Z"/>
+ <method name="zoomOut()Z"/>
+ <method name="zoomOutFixing(II)Z"/>
+ <method name="zoomToSpan(II)V"/>
+ </class>
+ <class name="com/google/android/maps/MapView" since="1" removed="3">
+ <extends name="android/view/ViewGroup"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Ljava/lang/String;)V"/>
+ <method name="canCoverCenter()Z"/>
+ <method name="displayZoomControls(Z)V"/>
+ <method name="generateDefaultLayoutParams()Lcom/google/android/maps/MapView$LayoutParams;"/>
+ <method name="getController()Lcom/google/android/maps/MapController;"/>
+ <method name="getLatitudeSpan()I"/>
+ <method name="getLongitudeSpan()I"/>
+ <method name="getMapCenter()Lcom/google/android/maps/GeoPoint;"/>
+ <method name="getMaxZoomLevel()I"/>
+ <method name="getOverlays()Ljava/util/List;"/>
+ <method name="getProjection()Lcom/google/android/maps/Projection;"/>
+ <method name="getZoomControls()Landroid/view/View;"/>
+ <method name="getZoomLevel()I"/>
+ <method name="isSatellite()Z"/>
+ <method name="isStreetView()Z"/>
+ <method name="isTraffic()Z"/>
+ <method name="onRestoreInstanceState(Landroid/os/Bundle;)V"/>
+ <method name="onSaveInstanceState(Landroid/os/Bundle;)V"/>
+ <method name="preLoad()V"/>
+ <method name="setReticleDrawMode(Lcom/google/android/maps/MapView$ReticleDrawMode;)V"/>
+ <method name="setSatellite(Z)V"/>
+ <method name="setStreetView(Z)V"/>
+ <method name="setTraffic(Z)V"/>
+ </class>
+ <class name="com/google/android/maps/MapView$LayoutParams" since="1" removed="3">
+ <extends name="android/view/ViewGroup$LayoutParams"/>
+ <method name="&lt;init>(IIIII)V"/>
+ <method name="&lt;init>(IILcom/google/android/maps/GeoPoint;I)V"/>
+ <method name="&lt;init>(IILcom/google/android/maps/GeoPoint;III)V"/>
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V"/>
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V"/>
+ <method name="debug(Ljava/lang/String;)Ljava/lang/String;"/>
+ <field name="BOTTOM"/>
+ <field name="BOTTOM_CENTER"/>
+ <field name="CENTER"/>
+ <field name="CENTER_HORIZONTAL"/>
+ <field name="CENTER_VERTICAL"/>
+ <field name="LEFT"/>
+ <field name="MODE_MAP"/>
+ <field name="MODE_VIEW"/>
+ <field name="RIGHT"/>
+ <field name="TOP"/>
+ <field name="TOP_LEFT"/>
+ <field name="alignment"/>
+ <field name="mode"/>
+ <field name="point"/>
+ <field name="x"/>
+ <field name="y"/>
+ </class>
+ <class name="com/google/android/maps/MapView$ReticleDrawMode" since="1" removed="3">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Lcom/google/android/maps/MapView$ReticleDrawMode;"/>
+ <method name="values()[Lcom/google/android/maps/MapView$ReticleDrawMode;"/>
+ <field name="DRAW_RETICLE_NEVER"/>
+ <field name="DRAW_RETICLE_OVER"/>
+ <field name="DRAW_RETICLE_UNDER"/>
+ </class>
+ <class name="com/google/android/maps/MyLocationOverlay" since="1" removed="3">
+ <extends name="com/google/android/maps/Overlay"/>
+ <implements name="android/hardware/SensorListener"/>
+ <implements name="android/location/LocationListener"/>
+ <method name="&lt;init>(Landroid/content/Context;Lcom/google/android/maps/MapView;)V"/>
+ <method name="disableCompass()V"/>
+ <method name="disableMyLocation()V"/>
+ <method name="dispatchTap()Z"/>
+ <method name="drawCompass(Landroid/graphics/Canvas;F)V"/>
+ <method name="drawMyLocation(Landroid/graphics/Canvas;Lcom/google/android/maps/MapView;Landroid/location/Location;Lcom/google/android/maps/GeoPoint;J)V"/>
+ <method name="enableCompass()Z"/>
+ <method name="enableMyLocation()Z"/>
+ <method name="getLastFix()Landroid/location/Location;"/>
+ <method name="getMyLocation()Lcom/google/android/maps/GeoPoint;"/>
+ <method name="getOrientation()F"/>
+ <method name="isCompassEnabled()Z"/>
+ <method name="isMyLocationEnabled()Z"/>
+ <method name="runOnFirstFix(Ljava/lang/Runnable;)Z"/>
+ </class>
+ <class name="com/google/android/maps/Overlay" since="1" removed="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="draw(Landroid/graphics/Canvas;Lcom/google/android/maps/MapView;Z)V"/>
+ <method name="draw(Landroid/graphics/Canvas;Lcom/google/android/maps/MapView;ZJ)Z"/>
+ <method name="drawAt(Landroid/graphics/Canvas;Landroid/graphics/drawable/Drawable;IIZ)V"/>
+ <method name="onKeyDown(ILandroid/view/KeyEvent;Lcom/google/android/maps/MapView;)Z"/>
+ <method name="onKeyUp(ILandroid/view/KeyEvent;Lcom/google/android/maps/MapView;)Z"/>
+ <method name="onTap(Lcom/google/android/maps/GeoPoint;Lcom/google/android/maps/MapView;)Z"/>
+ <method name="onTouchEvent(Landroid/view/MotionEvent;Lcom/google/android/maps/MapView;)Z"/>
+ <method name="onTrackballEvent(Landroid/view/MotionEvent;Lcom/google/android/maps/MapView;)Z"/>
+ <field name="SHADOW_X_SKEW"/>
+ <field name="SHADOW_Y_SCALE"/>
+ </class>
+ <class name="com/google/android/maps/OverlayItem" since="1" removed="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Lcom/google/android/maps/GeoPoint;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="getMarker(I)Landroid/graphics/drawable/Drawable;"/>
+ <method name="getPoint()Lcom/google/android/maps/GeoPoint;"/>
+ <method name="getSnippet()Ljava/lang/String;"/>
+ <method name="getTitle()Ljava/lang/String;"/>
+ <method name="routableAddress()Ljava/lang/String;"/>
+ <method name="setMarker(Landroid/graphics/drawable/Drawable;)V"/>
+ <method name="setState(Landroid/graphics/drawable/Drawable;I)V"/>
+ <field name="ITEM_STATE_FOCUSED_MASK"/>
+ <field name="ITEM_STATE_PRESSED_MASK"/>
+ <field name="ITEM_STATE_SELECTED_MASK"/>
+ <field name="mMarker"/>
+ <field name="mPoint"/>
+ <field name="mSnippet"/>
+ <field name="mTitle"/>
+ </class>
+ <class name="com/google/android/maps/Projection" since="1" removed="3">
+ <extends name="java/lang/Object"/>
+ <method name="fromPixels(II)Lcom/google/android/maps/GeoPoint;"/>
+ <method name="metersToEquatorPixels(F)F"/>
+ <method name="toPixels(Lcom/google/android/maps/GeoPoint;Landroid/graphics/Point;)Landroid/graphics/Point;"/>
+ </class>
+ <class name="com/google/android/maps/TrackballGestureDetector" since="1" removed="3">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="analyze(Landroid/view/MotionEvent;)V"/>
+ <method name="getCurrentDownX()F"/>
+ <method name="getCurrentDownY()F"/>
+ <method name="getFirstDownX()F"/>
+ <method name="getFirstDownY()F"/>
+ <method name="isDoubleTap()Z"/>
+ <method name="isScroll()Z"/>
+ <method name="isTap()Z"/>
+ <method name="registerLongPressCallback(Ljava/lang/Runnable;)V"/>
+ <method name="scrollX()F"/>
+ <method name="scrollY()F"/>
+ </class>
+ <class name="dalvik/annotation/TestTarget" since="1" deprecated="14">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ <method name="conceptName()Ljava/lang/String;" since="3"/>
+ <method name="methodArgs()[Ljava/lang/Class;"/>
+ <method name="methodName()Ljava/lang/String;"/>
+ </class>
+ <class name="dalvik/annotation/TestTargetClass" since="1" deprecated="14">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ <method name="value()Ljava/lang/Class;"/>
+ </class>
+ <class name="dalvik/bytecode/OpcodeInfo" since="11">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="MAXIMUM_PACKED_VALUE"/>
+ <field name="MAXIMUM_VALUE"/>
+ </class>
+ <class name="dalvik/bytecode/Opcodes" since="1">
+ <extends name="java/lang/Object"/>
+ <field name="OP_ADD_DOUBLE"/>
+ <field name="OP_ADD_DOUBLE_2ADDR"/>
+ <field name="OP_ADD_FLOAT"/>
+ <field name="OP_ADD_FLOAT_2ADDR"/>
+ <field name="OP_ADD_INT"/>
+ <field name="OP_ADD_INT_2ADDR"/>
+ <field name="OP_ADD_INT_LIT16"/>
+ <field name="OP_ADD_INT_LIT8"/>
+ <field name="OP_ADD_LONG"/>
+ <field name="OP_ADD_LONG_2ADDR"/>
+ <field name="OP_AGET"/>
+ <field name="OP_AGET_BOOLEAN"/>
+ <field name="OP_AGET_BYTE"/>
+ <field name="OP_AGET_CHAR"/>
+ <field name="OP_AGET_OBJECT"/>
+ <field name="OP_AGET_SHORT"/>
+ <field name="OP_AGET_WIDE"/>
+ <field name="OP_AND_INT"/>
+ <field name="OP_AND_INT_2ADDR"/>
+ <field name="OP_AND_INT_LIT16"/>
+ <field name="OP_AND_INT_LIT8"/>
+ <field name="OP_AND_LONG"/>
+ <field name="OP_AND_LONG_2ADDR"/>
+ <field name="OP_APUT"/>
+ <field name="OP_APUT_BOOLEAN"/>
+ <field name="OP_APUT_BYTE"/>
+ <field name="OP_APUT_CHAR"/>
+ <field name="OP_APUT_OBJECT"/>
+ <field name="OP_APUT_SHORT"/>
+ <field name="OP_APUT_WIDE"/>
+ <field name="OP_ARRAY_LENGTH"/>
+ <field name="OP_BREAKPOINT" since="8" deprecated="16"/>
+ <field name="OP_CHECK_CAST"/>
+ <field name="OP_CHECK_CAST_JUMBO" since="11"/>
+ <field name="OP_CMPG_DOUBLE"/>
+ <field name="OP_CMPG_FLOAT"/>
+ <field name="OP_CMPL_DOUBLE"/>
+ <field name="OP_CMPL_FLOAT"/>
+ <field name="OP_CMP_LONG"/>
+ <field name="OP_CONST"/>
+ <field name="OP_CONST_16"/>
+ <field name="OP_CONST_4"/>
+ <field name="OP_CONST_CLASS"/>
+ <field name="OP_CONST_CLASS_JUMBO" since="11"/>
+ <field name="OP_CONST_HIGH16"/>
+ <field name="OP_CONST_METHOD_HANDLE" since="27"/>
+ <field name="OP_CONST_METHOD_TYPE" since="27"/>
+ <field name="OP_CONST_STRING"/>
+ <field name="OP_CONST_STRING_JUMBO"/>
+ <field name="OP_CONST_WIDE"/>
+ <field name="OP_CONST_WIDE_16"/>
+ <field name="OP_CONST_WIDE_32"/>
+ <field name="OP_CONST_WIDE_HIGH16"/>
+ <field name="OP_DIV_DOUBLE"/>
+ <field name="OP_DIV_DOUBLE_2ADDR"/>
+ <field name="OP_DIV_FLOAT"/>
+ <field name="OP_DIV_FLOAT_2ADDR"/>
+ <field name="OP_DIV_INT"/>
+ <field name="OP_DIV_INT_2ADDR"/>
+ <field name="OP_DIV_INT_LIT16"/>
+ <field name="OP_DIV_INT_LIT8"/>
+ <field name="OP_DIV_LONG"/>
+ <field name="OP_DIV_LONG_2ADDR"/>
+ <field name="OP_DOUBLE_TO_FLOAT"/>
+ <field name="OP_DOUBLE_TO_INT"/>
+ <field name="OP_DOUBLE_TO_LONG"/>
+ <field name="OP_EXECUTE_INLINE" deprecated="16"/>
+ <field name="OP_EXECUTE_INLINE_RANGE" since="8" deprecated="16"/>
+ <field name="OP_FILLED_NEW_ARRAY"/>
+ <field name="OP_FILLED_NEW_ARRAY_JUMBO" since="11"/>
+ <field name="OP_FILLED_NEW_ARRAY_RANGE"/>
+ <field name="OP_FILL_ARRAY_DATA"/>
+ <field name="OP_FLOAT_TO_DOUBLE"/>
+ <field name="OP_FLOAT_TO_INT"/>
+ <field name="OP_FLOAT_TO_LONG"/>
+ <field name="OP_GOTO"/>
+ <field name="OP_GOTO_16"/>
+ <field name="OP_GOTO_32"/>
+ <field name="OP_IF_EQ"/>
+ <field name="OP_IF_EQZ"/>
+ <field name="OP_IF_GE"/>
+ <field name="OP_IF_GEZ"/>
+ <field name="OP_IF_GT"/>
+ <field name="OP_IF_GTZ"/>
+ <field name="OP_IF_LE"/>
+ <field name="OP_IF_LEZ"/>
+ <field name="OP_IF_LT"/>
+ <field name="OP_IF_LTZ"/>
+ <field name="OP_IF_NE"/>
+ <field name="OP_IF_NEZ"/>
+ <field name="OP_IGET"/>
+ <field name="OP_IGET_BOOLEAN"/>
+ <field name="OP_IGET_BOOLEAN_JUMBO" since="11"/>
+ <field name="OP_IGET_BYTE"/>
+ <field name="OP_IGET_BYTE_JUMBO" since="11"/>
+ <field name="OP_IGET_CHAR"/>
+ <field name="OP_IGET_CHAR_JUMBO" since="11"/>
+ <field name="OP_IGET_JUMBO" since="11"/>
+ <field name="OP_IGET_OBJECT"/>
+ <field name="OP_IGET_OBJECT_JUMBO" since="11"/>
+ <field name="OP_IGET_OBJECT_QUICK" deprecated="16"/>
+ <field name="OP_IGET_QUICK" deprecated="16"/>
+ <field name="OP_IGET_SHORT"/>
+ <field name="OP_IGET_SHORT_JUMBO" since="11"/>
+ <field name="OP_IGET_WIDE"/>
+ <field name="OP_IGET_WIDE_JUMBO" since="11"/>
+ <field name="OP_IGET_WIDE_QUICK" deprecated="16"/>
+ <field name="OP_IGET_WIDE_VOLATILE" since="9" deprecated="16"/>
+ <field name="OP_INSTANCE_OF"/>
+ <field name="OP_INSTANCE_OF_JUMBO" since="11"/>
+ <field name="OP_INT_TO_BYTE"/>
+ <field name="OP_INT_TO_CHAR"/>
+ <field name="OP_INT_TO_DOUBLE"/>
+ <field name="OP_INT_TO_FLOAT"/>
+ <field name="OP_INT_TO_LONG"/>
+ <field name="OP_INT_TO_SHORT"/>
+ <field name="OP_INVOKE_CUSTOM" since="26"/>
+ <field name="OP_INVOKE_CUSTOM_RANGE" since="26"/>
+ <field name="OP_INVOKE_DIRECT"/>
+ <field name="OP_INVOKE_DIRECT_EMPTY" deprecated="16"/>
+ <field name="OP_INVOKE_DIRECT_JUMBO" since="11"/>
+ <field name="OP_INVOKE_DIRECT_RANGE"/>
+ <field name="OP_INVOKE_INTERFACE"/>
+ <field name="OP_INVOKE_INTERFACE_JUMBO" since="11"/>
+ <field name="OP_INVOKE_INTERFACE_RANGE"/>
+ <field name="OP_INVOKE_POLYMORPHIC" since="26"/>
+ <field name="OP_INVOKE_POLYMORPHIC_RANGE" since="26"/>
+ <field name="OP_INVOKE_STATIC"/>
+ <field name="OP_INVOKE_STATIC_JUMBO" since="11"/>
+ <field name="OP_INVOKE_STATIC_RANGE"/>
+ <field name="OP_INVOKE_SUPER"/>
+ <field name="OP_INVOKE_SUPER_JUMBO" since="11"/>
+ <field name="OP_INVOKE_SUPER_QUICK" deprecated="16"/>
+ <field name="OP_INVOKE_SUPER_QUICK_RANGE" deprecated="16"/>
+ <field name="OP_INVOKE_SUPER_RANGE"/>
+ <field name="OP_INVOKE_VIRTUAL"/>
+ <field name="OP_INVOKE_VIRTUAL_JUMBO" since="11"/>
+ <field name="OP_INVOKE_VIRTUAL_QUICK" deprecated="16"/>
+ <field name="OP_INVOKE_VIRTUAL_QUICK_RANGE" deprecated="16"/>
+ <field name="OP_INVOKE_VIRTUAL_RANGE"/>
+ <field name="OP_IPUT"/>
+ <field name="OP_IPUT_BOOLEAN"/>
+ <field name="OP_IPUT_BOOLEAN_JUMBO" since="11"/>
+ <field name="OP_IPUT_BYTE"/>
+ <field name="OP_IPUT_BYTE_JUMBO" since="11"/>
+ <field name="OP_IPUT_CHAR"/>
+ <field name="OP_IPUT_CHAR_JUMBO" since="11"/>
+ <field name="OP_IPUT_JUMBO" since="11"/>
+ <field name="OP_IPUT_OBJECT"/>
+ <field name="OP_IPUT_OBJECT_JUMBO" since="11"/>
+ <field name="OP_IPUT_OBJECT_QUICK" deprecated="16"/>
+ <field name="OP_IPUT_QUICK" deprecated="16"/>
+ <field name="OP_IPUT_SHORT"/>
+ <field name="OP_IPUT_SHORT_JUMBO" since="11"/>
+ <field name="OP_IPUT_WIDE"/>
+ <field name="OP_IPUT_WIDE_JUMBO" since="11"/>
+ <field name="OP_IPUT_WIDE_QUICK" deprecated="16"/>
+ <field name="OP_IPUT_WIDE_VOLATILE" since="9" deprecated="16"/>
+ <field name="OP_LONG_TO_DOUBLE"/>
+ <field name="OP_LONG_TO_FLOAT"/>
+ <field name="OP_LONG_TO_INT"/>
+ <field name="OP_MONITOR_ENTER"/>
+ <field name="OP_MONITOR_EXIT"/>
+ <field name="OP_MOVE"/>
+ <field name="OP_MOVE_16"/>
+ <field name="OP_MOVE_EXCEPTION"/>
+ <field name="OP_MOVE_FROM16"/>
+ <field name="OP_MOVE_OBJECT"/>
+ <field name="OP_MOVE_OBJECT_16"/>
+ <field name="OP_MOVE_OBJECT_FROM16"/>
+ <field name="OP_MOVE_RESULT"/>
+ <field name="OP_MOVE_RESULT_OBJECT"/>
+ <field name="OP_MOVE_RESULT_WIDE"/>
+ <field name="OP_MOVE_WIDE"/>
+ <field name="OP_MOVE_WIDE_16"/>
+ <field name="OP_MOVE_WIDE_FROM16"/>
+ <field name="OP_MUL_DOUBLE"/>
+ <field name="OP_MUL_DOUBLE_2ADDR"/>
+ <field name="OP_MUL_FLOAT"/>
+ <field name="OP_MUL_FLOAT_2ADDR"/>
+ <field name="OP_MUL_INT"/>
+ <field name="OP_MUL_INT_2ADDR"/>
+ <field name="OP_MUL_INT_LIT16"/>
+ <field name="OP_MUL_INT_LIT8"/>
+ <field name="OP_MUL_LONG"/>
+ <field name="OP_MUL_LONG_2ADDR"/>
+ <field name="OP_NEG_DOUBLE"/>
+ <field name="OP_NEG_FLOAT"/>
+ <field name="OP_NEG_INT"/>
+ <field name="OP_NEG_LONG"/>
+ <field name="OP_NEW_ARRAY"/>
+ <field name="OP_NEW_ARRAY_JUMBO" since="11"/>
+ <field name="OP_NEW_INSTANCE"/>
+ <field name="OP_NEW_INSTANCE_JUMBO" since="11"/>
+ <field name="OP_NOP"/>
+ <field name="OP_NOT_INT"/>
+ <field name="OP_NOT_LONG"/>
+ <field name="OP_OR_INT"/>
+ <field name="OP_OR_INT_2ADDR"/>
+ <field name="OP_OR_INT_LIT16"/>
+ <field name="OP_OR_INT_LIT8"/>
+ <field name="OP_OR_LONG"/>
+ <field name="OP_OR_LONG_2ADDR"/>
+ <field name="OP_PACKED_SWITCH"/>
+ <field name="OP_REM_DOUBLE"/>
+ <field name="OP_REM_DOUBLE_2ADDR"/>
+ <field name="OP_REM_FLOAT"/>
+ <field name="OP_REM_FLOAT_2ADDR"/>
+ <field name="OP_REM_INT"/>
+ <field name="OP_REM_INT_2ADDR"/>
+ <field name="OP_REM_INT_LIT16"/>
+ <field name="OP_REM_INT_LIT8"/>
+ <field name="OP_REM_LONG"/>
+ <field name="OP_REM_LONG_2ADDR"/>
+ <field name="OP_RETURN"/>
+ <field name="OP_RETURN_OBJECT"/>
+ <field name="OP_RETURN_VOID"/>
+ <field name="OP_RETURN_WIDE"/>
+ <field name="OP_RSUB_INT"/>
+ <field name="OP_RSUB_INT_LIT8"/>
+ <field name="OP_SGET"/>
+ <field name="OP_SGET_BOOLEAN"/>
+ <field name="OP_SGET_BOOLEAN_JUMBO" since="11"/>
+ <field name="OP_SGET_BYTE"/>
+ <field name="OP_SGET_BYTE_JUMBO" since="11"/>
+ <field name="OP_SGET_CHAR"/>
+ <field name="OP_SGET_CHAR_JUMBO" since="11"/>
+ <field name="OP_SGET_JUMBO" since="11"/>
+ <field name="OP_SGET_OBJECT"/>
+ <field name="OP_SGET_OBJECT_JUMBO" since="11"/>
+ <field name="OP_SGET_SHORT"/>
+ <field name="OP_SGET_SHORT_JUMBO" since="11"/>
+ <field name="OP_SGET_WIDE"/>
+ <field name="OP_SGET_WIDE_JUMBO" since="11"/>
+ <field name="OP_SGET_WIDE_VOLATILE" since="9" deprecated="16"/>
+ <field name="OP_SHL_INT"/>
+ <field name="OP_SHL_INT_2ADDR"/>
+ <field name="OP_SHL_INT_LIT8"/>
+ <field name="OP_SHL_LONG"/>
+ <field name="OP_SHL_LONG_2ADDR"/>
+ <field name="OP_SHR_INT"/>
+ <field name="OP_SHR_INT_2ADDR"/>
+ <field name="OP_SHR_INT_LIT8"/>
+ <field name="OP_SHR_LONG"/>
+ <field name="OP_SHR_LONG_2ADDR"/>
+ <field name="OP_SPARSE_SWITCH"/>
+ <field name="OP_SPUT"/>
+ <field name="OP_SPUT_BOOLEAN"/>
+ <field name="OP_SPUT_BOOLEAN_JUMBO" since="11"/>
+ <field name="OP_SPUT_BYTE"/>
+ <field name="OP_SPUT_BYTE_JUMBO" since="11"/>
+ <field name="OP_SPUT_CHAR"/>
+ <field name="OP_SPUT_CHAR_JUMBO" since="11"/>
+ <field name="OP_SPUT_JUMBO" since="11"/>
+ <field name="OP_SPUT_OBJECT"/>
+ <field name="OP_SPUT_OBJECT_JUMBO" since="11"/>
+ <field name="OP_SPUT_SHORT"/>
+ <field name="OP_SPUT_SHORT_JUMBO" since="11"/>
+ <field name="OP_SPUT_WIDE"/>
+ <field name="OP_SPUT_WIDE_JUMBO" since="11"/>
+ <field name="OP_SPUT_WIDE_VOLATILE" since="9" deprecated="16"/>
+ <field name="OP_SUB_DOUBLE"/>
+ <field name="OP_SUB_DOUBLE_2ADDR"/>
+ <field name="OP_SUB_FLOAT"/>
+ <field name="OP_SUB_FLOAT_2ADDR"/>
+ <field name="OP_SUB_INT"/>
+ <field name="OP_SUB_INT_2ADDR"/>
+ <field name="OP_SUB_LONG"/>
+ <field name="OP_SUB_LONG_2ADDR"/>
+ <field name="OP_THROW"/>
+ <field name="OP_THROW_VERIFICATION_ERROR" since="8" deprecated="16"/>
+ <field name="OP_UNUSED_3e" removed="8"/>
+ <field name="OP_UNUSED_3f" removed="8"/>
+ <field name="OP_UNUSED_40" removed="8"/>
+ <field name="OP_UNUSED_41" removed="8"/>
+ <field name="OP_UNUSED_42" removed="8"/>
+ <field name="OP_UNUSED_43" removed="8"/>
+ <field name="OP_UNUSED_73" removed="8"/>
+ <field name="OP_UNUSED_79" removed="8"/>
+ <field name="OP_UNUSED_7A" removed="8"/>
+ <field name="OP_UNUSED_E3" removed="8"/>
+ <field name="OP_UNUSED_E4" removed="8"/>
+ <field name="OP_UNUSED_E5" removed="8"/>
+ <field name="OP_UNUSED_E6" removed="8"/>
+ <field name="OP_UNUSED_E7" removed="8"/>
+ <field name="OP_UNUSED_E8" removed="8"/>
+ <field name="OP_UNUSED_E9" removed="8"/>
+ <field name="OP_UNUSED_EA" removed="8"/>
+ <field name="OP_UNUSED_EB" removed="8"/>
+ <field name="OP_UNUSED_EC" removed="8"/>
+ <field name="OP_UNUSED_ED" removed="8"/>
+ <field name="OP_UNUSED_EF" removed="8"/>
+ <field name="OP_UNUSED_F1" removed="8"/>
+ <field name="OP_UNUSED_FC" removed="8"/>
+ <field name="OP_UNUSED_FD" removed="8"/>
+ <field name="OP_UNUSED_FE" removed="8"/>
+ <field name="OP_UNUSED_FF" removed="8"/>
+ <field name="OP_USHR_INT"/>
+ <field name="OP_USHR_INT_2ADDR"/>
+ <field name="OP_USHR_INT_LIT8"/>
+ <field name="OP_USHR_LONG"/>
+ <field name="OP_USHR_LONG_2ADDR"/>
+ <field name="OP_XOR_INT"/>
+ <field name="OP_XOR_INT_2ADDR"/>
+ <field name="OP_XOR_INT_LIT16"/>
+ <field name="OP_XOR_INT_LIT8"/>
+ <field name="OP_XOR_LONG"/>
+ <field name="OP_XOR_LONG_2ADDR"/>
+ </class>
+ <class name="dalvik/system/AllocationLimitError" since="1" removed="9">
+ <extends name="java/lang/VirtualMachineError"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="dalvik/system/BaseDexClassLoader" since="14">
+ <extends name="java/lang/ClassLoader"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/io/File;Ljava/lang/String;Ljava/lang/ClassLoader;)V"/>
+ </class>
+ <class name="dalvik/system/DexClassLoader" since="3">
+ <extends name="dalvik/system/BaseDexClassLoader" since="14"/>
+ <extends name="java/lang/ClassLoader" removed="14"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)V"/>
+ </class>
+ <class name="dalvik/system/DexFile" since="1" deprecated="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/io/File;)V" deprecated="26"/>
+ <method name="&lt;init>(Ljava/lang/String;)V" deprecated="26"/>
+ <method name="close()V"/>
+ <method name="entries()Ljava/util/Enumeration;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="isDexOptNeeded(Ljava/lang/String;)Z"/>
+ <method name="loadClass(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/lang/Class;"/>
+ <method name="loadDex(Ljava/lang/String;Ljava/lang/String;I)Ldalvik/system/DexFile;" since="3" deprecated="26"/>
+ </class>
+ <class name="dalvik/system/InMemoryDexClassLoader" since="26">
+ <extends name="dalvik/system/BaseDexClassLoader"/>
+ <method name="&lt;init>(Ljava/nio/ByteBuffer;Ljava/lang/ClassLoader;)V"/>
+ <method name="&lt;init>([Ljava/nio/ByteBuffer;Ljava/lang/ClassLoader;)V" since="27"/>
+ </class>
+ <class name="dalvik/system/PathClassLoader" since="1">
+ <extends name="dalvik/system/BaseDexClassLoader" since="14"/>
+ <extends name="java/lang/ClassLoader" removed="14"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/ClassLoader;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)V"/>
+ </class>
+ <class name="dalvik/system/PotentialDeadlockError" since="1" removed="9">
+ <extends name="java/lang/VirtualMachineError"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="dalvik/system/StaleDexCacheError" since="1" removed="9">
+ <extends name="java/lang/VirtualMachineError"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="dalvik/system/TemporaryDirectory" since="1" removed="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="setUpDirectory(Ljava/io/File;)V"/>
+ <method name="setUpDirectory(Ljava/lang/String;)V"/>
+ </class>
+ <class name="dalvik/system/TouchDex" since="1" removed="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="main([Ljava/lang/String;)V"/>
+ <method name="start(Ljava/lang/String;)I"/>
+ </class>
+ <class name="dalvik/system/VMDebug" since="1" removed="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="dumpHprofData(Ljava/lang/String;)V" since="3"/>
+ <method name="getAllocCount(I)I"/>
+ <method name="getInstructionCount([I)V"/>
+ <method name="getLoadedClassCount()I"/>
+ <method name="isDebuggerConnected()Z"/>
+ <method name="isDebuggingEnabled()Z" since="3"/>
+ <method name="lastDebuggerActivity()J"/>
+ <method name="printLoadedClasses(I)V"/>
+ <method name="resetAllocCount(I)V"/>
+ <method name="resetInstructionCount()V"/>
+ <method name="setAllocationLimit(I)I"/>
+ <method name="setGlobalAllocationLimit(I)I"/>
+ <method name="startAllocCounting()V"/>
+ <method name="startEmulatorTracing()V"/>
+ <method name="startInstructionCounting()V"/>
+ <method name="startMethodTracing()V"/>
+ <method name="startMethodTracing(Ljava/lang/String;II)V"/>
+ <method name="stopAllocCounting()V"/>
+ <method name="stopEmulatorTracing()V"/>
+ <method name="stopInstructionCounting()V"/>
+ <method name="stopMethodTracing()V"/>
+ <method name="threadCpuTimeNanos()J"/>
+ <field name="DEFAULT_METHOD_TRACE_FILE_NAME"/>
+ <field name="KIND_ALL_COUNTS"/>
+ <field name="KIND_GLOBAL_ALLOCATED_BYTES"/>
+ <field name="KIND_GLOBAL_ALLOCATED_OBJECTS"/>
+ <field name="KIND_GLOBAL_CLASS_INIT_COUNT" since="8"/>
+ <field name="KIND_GLOBAL_CLASS_INIT_TIME" since="8"/>
+ <field name="KIND_GLOBAL_EXT_ALLOCATED_BYTES"/>
+ <field name="KIND_GLOBAL_EXT_ALLOCATED_OBJECTS"/>
+ <field name="KIND_GLOBAL_EXT_FREED_BYTES"/>
+ <field name="KIND_GLOBAL_EXT_FREED_OBJECTS"/>
+ <field name="KIND_GLOBAL_FREED_BYTES"/>
+ <field name="KIND_GLOBAL_FREED_OBJECTS"/>
+ <field name="KIND_GLOBAL_GC_INVOCATIONS"/>
+ <field name="KIND_THREAD_ALLOCATED_BYTES"/>
+ <field name="KIND_THREAD_ALLOCATED_OBJECTS"/>
+ <field name="KIND_THREAD_CLASS_INIT_COUNT" since="8"/>
+ <field name="KIND_THREAD_CLASS_INIT_TIME" since="8"/>
+ <field name="KIND_THREAD_EXT_ALLOCATED_BYTES"/>
+ <field name="KIND_THREAD_EXT_ALLOCATED_OBJECTS"/>
+ <field name="KIND_THREAD_EXT_FREED_BYTES"/>
+ <field name="KIND_THREAD_EXT_FREED_OBJECTS"/>
+ <field name="KIND_THREAD_FREED_BYTES"/>
+ <field name="KIND_THREAD_FREED_OBJECTS"/>
+ <field name="KIND_THREAD_GC_INVOCATIONS"/>
+ <field name="TRACE_COUNT_ALLOCS"/>
+ </class>
+ <class name="dalvik/system/VMRuntime" since="1" removed="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="gcSoftReferences()V"/>
+ <method name="getExternalBytesAllocated()J"/>
+ <method name="getMinimumHeapSize()J"/>
+ <method name="getRuntime()Ldalvik/system/VMRuntime;"/>
+ <method name="getTargetHeapUtilization()F"/>
+ <method name="runFinalizationSync()V"/>
+ <method name="setMinimumHeapSize(J)J"/>
+ <method name="setTargetHeapUtilization(F)F"/>
+ </class>
+ <class name="dalvik/system/VMStack" since="1" removed="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCallingClassLoader()Ljava/lang/ClassLoader;"/>
+ <method name="getCallingClassLoader2()Ljava/lang/ClassLoader;"/>
+ <method name="getClasses(IZ)[Ljava/lang/Class;"/>
+ <method name="getThreadStackTrace(Ljava/lang/Thread;)[Ljava/lang/StackTraceElement;"/>
+ </class>
+ <class name="dalvik/system/Zygote" since="1" removed="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="fork()I"/>
+ <method name="forkAndSpecialize(II[II[[I)I" since="3"/>
+ <method name="forkAndSpecialize(II[IZ[[I)I"/>
+ <method name="forkSystemServer(II[II[[I)I" since="3"/>
+ <method name="forkSystemServer(II[IZ[[I)I"/>
+ <field name="DEBUG_ENABLE_ASSERT" since="3"/>
+ <field name="DEBUG_ENABLE_CHECKJNI" since="3"/>
+ <field name="DEBUG_ENABLE_DEBUGGER" since="3"/>
+ <field name="DEBUG_ENABLE_SAFEMODE" since="8"/>
+ </class>
+ <class name="java/awt/font/NumericShaper" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getContextualShaper(I)Ljava/awt/font/NumericShaper;"/>
+ <method name="getContextualShaper(II)Ljava/awt/font/NumericShaper;"/>
+ <method name="getContextualShaper(Ljava/util/Set;)Ljava/awt/font/NumericShaper;" since="24"/>
+ <method name="getContextualShaper(Ljava/util/Set;Ljava/awt/font/NumericShaper$Range;)Ljava/awt/font/NumericShaper;" since="24"/>
+ <method name="getRangeSet()Ljava/util/Set;" since="24"/>
+ <method name="getRanges()I"/>
+ <method name="getShaper(I)Ljava/awt/font/NumericShaper;"/>
+ <method name="getShaper(Ljava/awt/font/NumericShaper$Range;)Ljava/awt/font/NumericShaper;" since="24"/>
+ <method name="isContextual()Z"/>
+ <method name="shape([CII)V"/>
+ <method name="shape([CIII)V"/>
+ <method name="shape([CIILjava/awt/font/NumericShaper$Range;)V" since="24"/>
+ <field name="ALL_RANGES"/>
+ <field name="ARABIC"/>
+ <field name="BENGALI"/>
+ <field name="DEVANAGARI"/>
+ <field name="EASTERN_ARABIC"/>
+ <field name="ETHIOPIC"/>
+ <field name="EUROPEAN"/>
+ <field name="GUJARATI"/>
+ <field name="GURMUKHI"/>
+ <field name="KANNADA"/>
+ <field name="KHMER"/>
+ <field name="LAO"/>
+ <field name="MALAYALAM"/>
+ <field name="MONGOLIAN"/>
+ <field name="MYANMAR"/>
+ <field name="ORIYA"/>
+ <field name="TAMIL"/>
+ <field name="TELUGU"/>
+ <field name="THAI"/>
+ <field name="TIBETAN"/>
+ </class>
+ <class name="java/awt/font/NumericShaper$Range" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/awt/font/NumericShaper$Range;"/>
+ <method name="values()[Ljava/awt/font/NumericShaper$Range;"/>
+ <field name="ARABIC"/>
+ <field name="BALINESE"/>
+ <field name="BENGALI"/>
+ <field name="CHAM"/>
+ <field name="DEVANAGARI"/>
+ <field name="EASTERN_ARABIC"/>
+ <field name="ETHIOPIC"/>
+ <field name="EUROPEAN"/>
+ <field name="GUJARATI"/>
+ <field name="GURMUKHI"/>
+ <field name="JAVANESE"/>
+ <field name="KANNADA"/>
+ <field name="KAYAH_LI"/>
+ <field name="KHMER"/>
+ <field name="LAO"/>
+ <field name="LEPCHA"/>
+ <field name="LIMBU"/>
+ <field name="MALAYALAM"/>
+ <field name="MEETEI_MAYEK"/>
+ <field name="MONGOLIAN"/>
+ <field name="MYANMAR"/>
+ <field name="MYANMAR_SHAN"/>
+ <field name="NEW_TAI_LUE"/>
+ <field name="NKO"/>
+ <field name="OL_CHIKI"/>
+ <field name="ORIYA"/>
+ <field name="SAURASHTRA"/>
+ <field name="SUNDANESE"/>
+ <field name="TAI_THAM_HORA"/>
+ <field name="TAI_THAM_THAM"/>
+ <field name="TAMIL"/>
+ <field name="TELUGU"/>
+ <field name="THAI"/>
+ <field name="TIBETAN"/>
+ <field name="VAI"/>
+ </class>
+ <class name="java/awt/font/TextAttribute" since="1">
+ <extends name="java/text/AttributedCharacterIterator$Attribute"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <field name="BACKGROUND"/>
+ <field name="BIDI_EMBEDDING"/>
+ <field name="CHAR_REPLACEMENT"/>
+ <field name="FAMILY"/>
+ <field name="FONT"/>
+ <field name="FOREGROUND"/>
+ <field name="INPUT_METHOD_HIGHLIGHT"/>
+ <field name="INPUT_METHOD_UNDERLINE"/>
+ <field name="JUSTIFICATION"/>
+ <field name="JUSTIFICATION_FULL"/>
+ <field name="JUSTIFICATION_NONE"/>
+ <field name="KERNING" since="9"/>
+ <field name="KERNING_ON" since="9"/>
+ <field name="LIGATURES" since="9"/>
+ <field name="LIGATURES_ON" since="9"/>
+ <field name="NUMERIC_SHAPING"/>
+ <field name="POSTURE"/>
+ <field name="POSTURE_OBLIQUE"/>
+ <field name="POSTURE_REGULAR"/>
+ <field name="RUN_DIRECTION"/>
+ <field name="RUN_DIRECTION_LTR"/>
+ <field name="RUN_DIRECTION_RTL"/>
+ <field name="SIZE"/>
+ <field name="STRIKETHROUGH"/>
+ <field name="STRIKETHROUGH_ON"/>
+ <field name="SUPERSCRIPT"/>
+ <field name="SUPERSCRIPT_SUB"/>
+ <field name="SUPERSCRIPT_SUPER"/>
+ <field name="SWAP_COLORS"/>
+ <field name="SWAP_COLORS_ON"/>
+ <field name="TRACKING" since="9"/>
+ <field name="TRACKING_LOOSE" since="9"/>
+ <field name="TRACKING_TIGHT" since="9"/>
+ <field name="TRANSFORM"/>
+ <field name="UNDERLINE"/>
+ <field name="UNDERLINE_LOW_DASHED"/>
+ <field name="UNDERLINE_LOW_DOTTED"/>
+ <field name="UNDERLINE_LOW_GRAY"/>
+ <field name="UNDERLINE_LOW_ONE_PIXEL"/>
+ <field name="UNDERLINE_LOW_TWO_PIXEL"/>
+ <field name="UNDERLINE_ON"/>
+ <field name="WEIGHT"/>
+ <field name="WEIGHT_BOLD"/>
+ <field name="WEIGHT_DEMIBOLD"/>
+ <field name="WEIGHT_DEMILIGHT"/>
+ <field name="WEIGHT_EXTRABOLD"/>
+ <field name="WEIGHT_EXTRA_LIGHT"/>
+ <field name="WEIGHT_HEAVY"/>
+ <field name="WEIGHT_LIGHT"/>
+ <field name="WEIGHT_MEDIUM"/>
+ <field name="WEIGHT_REGULAR"/>
+ <field name="WEIGHT_SEMIBOLD"/>
+ <field name="WEIGHT_ULTRABOLD"/>
+ <field name="WIDTH"/>
+ <field name="WIDTH_CONDENSED"/>
+ <field name="WIDTH_EXTENDED"/>
+ <field name="WIDTH_REGULAR"/>
+ <field name="WIDTH_SEMI_CONDENSED"/>
+ <field name="WIDTH_SEMI_EXTENDED"/>
+ </class>
+ <class name="java/beans/IndexedPropertyChangeEvent" since="3">
+ <extends name="java/beans/PropertyChangeEvent"/>
+ <method name="&lt;init>(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;I)V"/>
+ <method name="getIndex()I"/>
+ </class>
+ <class name="java/beans/PropertyChangeEvent" since="3">
+ <extends name="java/util/EventObject"/>
+ <method name="&lt;init>(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V"/>
+ <method name="getNewValue()Ljava/lang/Object;"/>
+ <method name="getOldValue()Ljava/lang/Object;"/>
+ <method name="getPropagationId()Ljava/lang/Object;"/>
+ <method name="getPropertyName()Ljava/lang/String;"/>
+ <method name="setPropagationId(Ljava/lang/Object;)V"/>
+ </class>
+ <class name="java/beans/PropertyChangeListener" since="3">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/EventListener"/>
+ <method name="propertyChange(Ljava/beans/PropertyChangeEvent;)V"/>
+ </class>
+ <class name="java/beans/PropertyChangeListenerProxy" since="3">
+ <extends name="java/util/EventListenerProxy"/>
+ <implements name="java/beans/PropertyChangeListener"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/beans/PropertyChangeListener;)V"/>
+ <method name="getPropertyName()Ljava/lang/String;"/>
+ </class>
+ <class name="java/beans/PropertyChangeSupport" since="3">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(Ljava/lang/Object;)V"/>
+ <method name="addPropertyChangeListener(Ljava/beans/PropertyChangeListener;)V"/>
+ <method name="addPropertyChangeListener(Ljava/lang/String;Ljava/beans/PropertyChangeListener;)V"/>
+ <method name="fireIndexedPropertyChange(Ljava/lang/String;III)V"/>
+ <method name="fireIndexedPropertyChange(Ljava/lang/String;ILjava/lang/Object;Ljava/lang/Object;)V"/>
+ <method name="fireIndexedPropertyChange(Ljava/lang/String;IZZ)V"/>
+ <method name="firePropertyChange(Ljava/beans/PropertyChangeEvent;)V"/>
+ <method name="firePropertyChange(Ljava/lang/String;II)V"/>
+ <method name="firePropertyChange(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V"/>
+ <method name="firePropertyChange(Ljava/lang/String;ZZ)V"/>
+ <method name="getPropertyChangeListeners()[Ljava/beans/PropertyChangeListener;"/>
+ <method name="getPropertyChangeListeners(Ljava/lang/String;)[Ljava/beans/PropertyChangeListener;"/>
+ <method name="hasListeners(Ljava/lang/String;)Z"/>
+ <method name="removePropertyChangeListener(Ljava/beans/PropertyChangeListener;)V"/>
+ <method name="removePropertyChangeListener(Ljava/lang/String;Ljava/beans/PropertyChangeListener;)V"/>
+ </class>
+ <class name="java/io/BufferedInputStream" since="1">
+ <extends name="java/io/FilterInputStream"/>
+ <method name="&lt;init>(Ljava/io/InputStream;)V"/>
+ <method name="&lt;init>(Ljava/io/InputStream;I)V"/>
+ <field name="buf"/>
+ <field name="count"/>
+ <field name="marklimit"/>
+ <field name="markpos"/>
+ <field name="pos"/>
+ </class>
+ <class name="java/io/BufferedOutputStream" since="1">
+ <extends name="java/io/FilterOutputStream"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;)V"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;I)V"/>
+ <field name="buf"/>
+ <field name="count"/>
+ </class>
+ <class name="java/io/BufferedReader" since="1">
+ <extends name="java/io/Reader"/>
+ <method name="&lt;init>(Ljava/io/Reader;)V"/>
+ <method name="&lt;init>(Ljava/io/Reader;I)V"/>
+ <method name="lines()Ljava/util/stream/Stream;" since="24"/>
+ <method name="readLine()Ljava/lang/String;"/>
+ </class>
+ <class name="java/io/BufferedWriter" since="1">
+ <extends name="java/io/Writer"/>
+ <method name="&lt;init>(Ljava/io/Writer;)V"/>
+ <method name="&lt;init>(Ljava/io/Writer;I)V"/>
+ <method name="newLine()V"/>
+ </class>
+ <class name="java/io/ByteArrayInputStream" since="1">
+ <extends name="java/io/InputStream"/>
+ <method name="&lt;init>([B)V"/>
+ <method name="&lt;init>([BII)V"/>
+ <field name="buf"/>
+ <field name="count"/>
+ <field name="mark"/>
+ <field name="pos"/>
+ </class>
+ <class name="java/io/ByteArrayOutputStream" since="1">
+ <extends name="java/io/OutputStream"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="reset()V"/>
+ <method name="size()I"/>
+ <method name="toByteArray()[B"/>
+ <method name="toString(I)Ljava/lang/String;" deprecated="16"/>
+ <method name="toString(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="writeTo(Ljava/io/OutputStream;)V"/>
+ <field name="buf"/>
+ <field name="count"/>
+ </class>
+ <class name="java/io/CharArrayReader" since="1">
+ <extends name="java/io/Reader"/>
+ <method name="&lt;init>([C)V"/>
+ <method name="&lt;init>([CII)V"/>
+ <field name="buf"/>
+ <field name="count"/>
+ <field name="markedPos"/>
+ <field name="pos"/>
+ </class>
+ <class name="java/io/CharArrayWriter" since="1">
+ <extends name="java/io/Writer"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="append(C)Ljava/io/CharArrayWriter;"/>
+ <method name="append(Ljava/lang/CharSequence;)Ljava/io/CharArrayWriter;"/>
+ <method name="append(Ljava/lang/CharSequence;II)Ljava/io/CharArrayWriter;"/>
+ <method name="reset()V"/>
+ <method name="size()I"/>
+ <method name="toCharArray()[C"/>
+ <method name="writeTo(Ljava/io/Writer;)V"/>
+ <field name="buf"/>
+ <field name="count"/>
+ </class>
+ <class name="java/io/CharConversionException" since="1">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/io/Closeable" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable" since="19"/>
+ <method name="close()V"/>
+ </class>
+ <class name="java/io/Console" since="9">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Flushable"/>
+ <method name="&lt;init>()V"/>
+ <method name="format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/Console;"/>
+ <method name="printf(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/Console;"/>
+ <method name="readLine()Ljava/lang/String;"/>
+ <method name="readLine(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;"/>
+ <method name="readPassword()[C"/>
+ <method name="readPassword(Ljava/lang/String;[Ljava/lang/Object;)[C"/>
+ <method name="reader()Ljava/io/Reader;"/>
+ <method name="writer()Ljava/io/PrintWriter;"/>
+ </class>
+ <class name="java/io/DataInput" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="readBoolean()Z"/>
+ <method name="readByte()B"/>
+ <method name="readChar()C"/>
+ <method name="readDouble()D"/>
+ <method name="readFloat()F"/>
+ <method name="readFully([B)V"/>
+ <method name="readFully([BII)V"/>
+ <method name="readInt()I"/>
+ <method name="readLine()Ljava/lang/String;"/>
+ <method name="readLong()J"/>
+ <method name="readShort()S"/>
+ <method name="readUTF()Ljava/lang/String;"/>
+ <method name="readUnsignedByte()I"/>
+ <method name="readUnsignedShort()I"/>
+ <method name="skipBytes(I)I"/>
+ </class>
+ <class name="java/io/DataInputStream" since="1">
+ <extends name="java/io/FilterInputStream"/>
+ <implements name="java/io/DataInput"/>
+ <method name="&lt;init>(Ljava/io/InputStream;)V"/>
+ <method name="readUTF(Ljava/io/DataInput;)Ljava/lang/String;"/>
+ </class>
+ <class name="java/io/DataOutput" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="write(I)V"/>
+ <method name="write([B)V"/>
+ <method name="write([BII)V"/>
+ <method name="writeBoolean(Z)V"/>
+ <method name="writeByte(I)V"/>
+ <method name="writeBytes(Ljava/lang/String;)V"/>
+ <method name="writeChar(I)V"/>
+ <method name="writeChars(Ljava/lang/String;)V"/>
+ <method name="writeDouble(D)V"/>
+ <method name="writeFloat(F)V"/>
+ <method name="writeInt(I)V"/>
+ <method name="writeLong(J)V"/>
+ <method name="writeShort(I)V"/>
+ <method name="writeUTF(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/io/DataOutputStream" since="1">
+ <extends name="java/io/FilterOutputStream"/>
+ <implements name="java/io/DataOutput"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;)V"/>
+ <method name="size()I"/>
+ <field name="written"/>
+ </class>
+ <class name="java/io/EOFException" since="1">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/io/Externalizable" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="readExternal(Ljava/io/ObjectInput;)V"/>
+ <method name="writeExternal(Ljava/io/ObjectOutput;)V"/>
+ </class>
+ <class name="java/io/File" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>(Ljava/io/File;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/net/URI;)V"/>
+ <method name="canExecute()Z" since="9"/>
+ <method name="canRead()Z"/>
+ <method name="canWrite()Z"/>
+ <method name="compareTo(Ljava/io/File;)I"/>
+ <method name="createNewFile()Z"/>
+ <method name="createTempFile(Ljava/lang/String;Ljava/lang/String;)Ljava/io/File;"/>
+ <method name="createTempFile(Ljava/lang/String;Ljava/lang/String;Ljava/io/File;)Ljava/io/File;"/>
+ <method name="delete()Z"/>
+ <method name="deleteOnExit()V"/>
+ <method name="exists()Z"/>
+ <method name="getAbsoluteFile()Ljava/io/File;"/>
+ <method name="getAbsolutePath()Ljava/lang/String;"/>
+ <method name="getCanonicalFile()Ljava/io/File;"/>
+ <method name="getCanonicalPath()Ljava/lang/String;"/>
+ <method name="getFreeSpace()J" since="9"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getParent()Ljava/lang/String;"/>
+ <method name="getParentFile()Ljava/io/File;"/>
+ <method name="getPath()Ljava/lang/String;"/>
+ <method name="getTotalSpace()J" since="9"/>
+ <method name="getUsableSpace()J" since="9"/>
+ <method name="isAbsolute()Z"/>
+ <method name="isDirectory()Z"/>
+ <method name="isFile()Z"/>
+ <method name="isHidden()Z"/>
+ <method name="lastModified()J"/>
+ <method name="length()J"/>
+ <method name="list()[Ljava/lang/String;"/>
+ <method name="list(Ljava/io/FilenameFilter;)[Ljava/lang/String;"/>
+ <method name="listFiles()[Ljava/io/File;"/>
+ <method name="listFiles(Ljava/io/FileFilter;)[Ljava/io/File;"/>
+ <method name="listFiles(Ljava/io/FilenameFilter;)[Ljava/io/File;"/>
+ <method name="listRoots()[Ljava/io/File;"/>
+ <method name="mkdir()Z"/>
+ <method name="mkdirs()Z"/>
+ <method name="renameTo(Ljava/io/File;)Z"/>
+ <method name="setExecutable(Z)Z" since="9"/>
+ <method name="setExecutable(ZZ)Z" since="9"/>
+ <method name="setLastModified(J)Z"/>
+ <method name="setReadOnly()Z"/>
+ <method name="setReadable(Z)Z" since="9"/>
+ <method name="setReadable(ZZ)Z" since="9"/>
+ <method name="setWritable(Z)Z" since="9"/>
+ <method name="setWritable(ZZ)Z" since="9"/>
+ <method name="toPath()Ljava/nio/file/Path;" since="26"/>
+ <method name="toURI()Ljava/net/URI;"/>
+ <method name="toURL()Ljava/net/URL;" deprecated="16"/>
+ <field name="pathSeparator"/>
+ <field name="pathSeparatorChar"/>
+ <field name="separator"/>
+ <field name="separatorChar"/>
+ </class>
+ <class name="java/io/FileDescriptor" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="sync()V"/>
+ <method name="valid()Z"/>
+ <field name="err"/>
+ <field name="in"/>
+ <field name="out"/>
+ </class>
+ <class name="java/io/FileFilter" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="accept(Ljava/io/File;)Z"/>
+ </class>
+ <class name="java/io/FileInputStream" since="1">
+ <extends name="java/io/InputStream"/>
+ <method name="&lt;init>(Ljava/io/File;)V"/>
+ <method name="&lt;init>(Ljava/io/FileDescriptor;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getChannel()Ljava/nio/channels/FileChannel;"/>
+ <method name="getFD()Ljava/io/FileDescriptor;"/>
+ </class>
+ <class name="java/io/FileNotFoundException" since="1">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/io/FileOutputStream" since="1">
+ <extends name="java/io/OutputStream"/>
+ <method name="&lt;init>(Ljava/io/File;)V"/>
+ <method name="&lt;init>(Ljava/io/File;Z)V"/>
+ <method name="&lt;init>(Ljava/io/FileDescriptor;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Z)V"/>
+ <method name="getChannel()Ljava/nio/channels/FileChannel;"/>
+ <method name="getFD()Ljava/io/FileDescriptor;"/>
+ </class>
+ <class name="java/io/FilePermission" since="1">
+ <extends name="java/security/Permission"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/io/FileReader" since="1">
+ <extends name="java/io/InputStreamReader"/>
+ <method name="&lt;init>(Ljava/io/File;)V"/>
+ <method name="&lt;init>(Ljava/io/FileDescriptor;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/io/FileWriter" since="1">
+ <extends name="java/io/OutputStreamWriter"/>
+ <method name="&lt;init>(Ljava/io/File;)V"/>
+ <method name="&lt;init>(Ljava/io/File;Z)V"/>
+ <method name="&lt;init>(Ljava/io/FileDescriptor;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Z)V"/>
+ </class>
+ <class name="java/io/FilenameFilter" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="accept(Ljava/io/File;Ljava/lang/String;)Z"/>
+ </class>
+ <class name="java/io/FilterInputStream" since="1">
+ <extends name="java/io/InputStream"/>
+ <method name="&lt;init>(Ljava/io/InputStream;)V"/>
+ <field name="in"/>
+ </class>
+ <class name="java/io/FilterOutputStream" since="1">
+ <extends name="java/io/OutputStream"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;)V"/>
+ <field name="out"/>
+ </class>
+ <class name="java/io/FilterReader" since="1">
+ <extends name="java/io/Reader"/>
+ <method name="&lt;init>(Ljava/io/Reader;)V"/>
+ <field name="in"/>
+ </class>
+ <class name="java/io/FilterWriter" since="1">
+ <extends name="java/io/Writer"/>
+ <method name="&lt;init>(Ljava/io/Writer;)V"/>
+ <field name="out"/>
+ </class>
+ <class name="java/io/Flushable" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="flush()V"/>
+ </class>
+ <class name="java/io/IOError" since="9">
+ <extends name="java/lang/Error"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/io/IOException" since="1">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" since="9"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" since="9"/>
+ </class>
+ <class name="java/io/InputStream" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable"/>
+ <method name="&lt;init>()V"/>
+ <method name="available()I"/>
+ <method name="mark(I)V"/>
+ <method name="markSupported()Z"/>
+ <method name="read()I"/>
+ <method name="read([B)I"/>
+ <method name="read([BII)I"/>
+ <method name="reset()V"/>
+ <method name="skip(J)J"/>
+ </class>
+ <class name="java/io/InputStreamReader" since="1">
+ <extends name="java/io/Reader"/>
+ <method name="&lt;init>(Ljava/io/InputStream;)V"/>
+ <method name="&lt;init>(Ljava/io/InputStream;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/io/InputStream;Ljava/nio/charset/Charset;)V"/>
+ <method name="&lt;init>(Ljava/io/InputStream;Ljava/nio/charset/CharsetDecoder;)V"/>
+ <method name="getEncoding()Ljava/lang/String;"/>
+ </class>
+ <class name="java/io/InterruptedIOException" since="1">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <field name="bytesTransferred"/>
+ </class>
+ <class name="java/io/InvalidClassException" since="1">
+ <extends name="java/io/ObjectStreamException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <field name="classname"/>
+ </class>
+ <class name="java/io/InvalidObjectException" since="1">
+ <extends name="java/io/ObjectStreamException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/io/LineNumberInputStream" since="1" deprecated="1">
+ <extends name="java/io/FilterInputStream"/>
+ <method name="&lt;init>(Ljava/io/InputStream;)V"/>
+ <method name="getLineNumber()I"/>
+ <method name="setLineNumber(I)V"/>
+ </class>
+ <class name="java/io/LineNumberReader" since="1">
+ <extends name="java/io/BufferedReader"/>
+ <method name="&lt;init>(Ljava/io/Reader;)V"/>
+ <method name="&lt;init>(Ljava/io/Reader;I)V"/>
+ <method name="getLineNumber()I"/>
+ <method name="setLineNumber(I)V"/>
+ </class>
+ <class name="java/io/NotActiveException" since="1">
+ <extends name="java/io/ObjectStreamException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/io/NotSerializableException" since="1">
+ <extends name="java/io/ObjectStreamException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/io/ObjectInput" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/DataInput"/>
+ <implements name="java/lang/AutoCloseable" since="19"/>
+ <method name="available()I"/>
+ <method name="close()V"/>
+ <method name="read()I"/>
+ <method name="read([B)I"/>
+ <method name="read([BII)I"/>
+ <method name="readObject()Ljava/lang/Object;"/>
+ <method name="skip(J)J"/>
+ </class>
+ <class name="java/io/ObjectInputStream" since="1">
+ <extends name="java/io/InputStream"/>
+ <implements name="java/io/ObjectInput"/>
+ <implements name="java/io/ObjectStreamConstants"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/io/InputStream;)V"/>
+ <method name="defaultReadObject()V"/>
+ <method name="enableResolveObject(Z)Z"/>
+ <method name="readClassDescriptor()Ljava/io/ObjectStreamClass;"/>
+ <method name="readFields()Ljava/io/ObjectInputStream$GetField;"/>
+ <method name="readObjectOverride()Ljava/lang/Object;"/>
+ <method name="readStreamHeader()V"/>
+ <method name="readUnshared()Ljava/lang/Object;"/>
+ <method name="registerValidation(Ljava/io/ObjectInputValidation;I)V"/>
+ <method name="resolveClass(Ljava/io/ObjectStreamClass;)Ljava/lang/Class;"/>
+ <method name="resolveObject(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="resolveProxyClass([Ljava/lang/String;)Ljava/lang/Class;"/>
+ </class>
+ <class name="java/io/ObjectInputStream$GetField" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="defaulted(Ljava/lang/String;)Z"/>
+ <method name="get(Ljava/lang/String;B)B"/>
+ <method name="get(Ljava/lang/String;C)C"/>
+ <method name="get(Ljava/lang/String;D)D"/>
+ <method name="get(Ljava/lang/String;F)F"/>
+ <method name="get(Ljava/lang/String;I)I"/>
+ <method name="get(Ljava/lang/String;J)J"/>
+ <method name="get(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="get(Ljava/lang/String;S)S"/>
+ <method name="get(Ljava/lang/String;Z)Z"/>
+ <method name="getObjectStreamClass()Ljava/io/ObjectStreamClass;"/>
+ </class>
+ <class name="java/io/ObjectInputValidation" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="validateObject()V"/>
+ </class>
+ <class name="java/io/ObjectOutput" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/DataOutput"/>
+ <implements name="java/lang/AutoCloseable" since="19"/>
+ <method name="close()V"/>
+ <method name="flush()V"/>
+ <method name="writeObject(Ljava/lang/Object;)V"/>
+ </class>
+ <class name="java/io/ObjectOutputStream" since="1">
+ <extends name="java/io/OutputStream"/>
+ <implements name="java/io/ObjectOutput"/>
+ <implements name="java/io/ObjectStreamConstants"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;)V"/>
+ <method name="annotateClass(Ljava/lang/Class;)V"/>
+ <method name="annotateProxyClass(Ljava/lang/Class;)V"/>
+ <method name="defaultWriteObject()V"/>
+ <method name="drain()V"/>
+ <method name="enableReplaceObject(Z)Z"/>
+ <method name="putFields()Ljava/io/ObjectOutputStream$PutField;"/>
+ <method name="replaceObject(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="reset()V"/>
+ <method name="useProtocolVersion(I)V"/>
+ <method name="writeClassDescriptor(Ljava/io/ObjectStreamClass;)V"/>
+ <method name="writeFields()V"/>
+ <method name="writeObjectOverride(Ljava/lang/Object;)V"/>
+ <method name="writeStreamHeader()V"/>
+ <method name="writeUnshared(Ljava/lang/Object;)V"/>
+ </class>
+ <class name="java/io/ObjectOutputStream$PutField" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="put(Ljava/lang/String;B)V"/>
+ <method name="put(Ljava/lang/String;C)V"/>
+ <method name="put(Ljava/lang/String;D)V"/>
+ <method name="put(Ljava/lang/String;F)V"/>
+ <method name="put(Ljava/lang/String;I)V"/>
+ <method name="put(Ljava/lang/String;J)V"/>
+ <method name="put(Ljava/lang/String;Ljava/lang/Object;)V"/>
+ <method name="put(Ljava/lang/String;S)V"/>
+ <method name="put(Ljava/lang/String;Z)V"/>
+ <method name="write(Ljava/io/ObjectOutput;)V" deprecated="16"/>
+ </class>
+ <class name="java/io/ObjectStreamClass" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="forClass()Ljava/lang/Class;"/>
+ <method name="getField(Ljava/lang/String;)Ljava/io/ObjectStreamField;"/>
+ <method name="getFields()[Ljava/io/ObjectStreamField;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getSerialVersionUID()J"/>
+ <method name="lookup(Ljava/lang/Class;)Ljava/io/ObjectStreamClass;"/>
+ <method name="lookupAny(Ljava/lang/Class;)Ljava/io/ObjectStreamClass;" since="9"/>
+ <field name="NO_FIELDS"/>
+ </class>
+ <class name="java/io/ObjectStreamConstants" since="1">
+ <extends name="java/lang/Object"/>
+ <field name="PROTOCOL_VERSION_1"/>
+ <field name="PROTOCOL_VERSION_2"/>
+ <field name="SC_BLOCK_DATA"/>
+ <field name="SC_ENUM"/>
+ <field name="SC_EXTERNALIZABLE"/>
+ <field name="SC_SERIALIZABLE"/>
+ <field name="SC_WRITE_METHOD"/>
+ <field name="STREAM_MAGIC"/>
+ <field name="STREAM_VERSION"/>
+ <field name="SUBCLASS_IMPLEMENTATION_PERMISSION"/>
+ <field name="SUBSTITUTION_PERMISSION"/>
+ <field name="TC_ARRAY"/>
+ <field name="TC_BASE"/>
+ <field name="TC_BLOCKDATA"/>
+ <field name="TC_BLOCKDATALONG"/>
+ <field name="TC_CLASS"/>
+ <field name="TC_CLASSDESC"/>
+ <field name="TC_ENDBLOCKDATA"/>
+ <field name="TC_ENUM"/>
+ <field name="TC_EXCEPTION"/>
+ <field name="TC_LONGSTRING"/>
+ <field name="TC_MAX"/>
+ <field name="TC_NULL"/>
+ <field name="TC_OBJECT"/>
+ <field name="TC_PROXYCLASSDESC"/>
+ <field name="TC_REFERENCE"/>
+ <field name="TC_RESET"/>
+ <field name="TC_STRING"/>
+ <field name="baseWireHandle"/>
+ </class>
+ <class name="java/io/ObjectStreamException" since="1">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/io/ObjectStreamField" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Class;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Class;Z)V"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getOffset()I"/>
+ <method name="getType()Ljava/lang/Class;"/>
+ <method name="getTypeCode()C"/>
+ <method name="getTypeString()Ljava/lang/String;"/>
+ <method name="isPrimitive()Z"/>
+ <method name="isUnshared()Z"/>
+ <method name="setOffset(I)V"/>
+ </class>
+ <class name="java/io/OptionalDataException" since="1">
+ <extends name="java/io/ObjectStreamException"/>
+ <method name="&lt;init>()V"/>
+ <field name="eof"/>
+ <field name="length"/>
+ </class>
+ <class name="java/io/OutputStream" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable"/>
+ <implements name="java/io/Flushable"/>
+ <method name="&lt;init>()V"/>
+ <method name="write(I)V"/>
+ <method name="write([B)V"/>
+ <method name="write([BII)V"/>
+ </class>
+ <class name="java/io/OutputStreamWriter" since="1">
+ <extends name="java/io/Writer"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;)V"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/nio/charset/Charset;)V"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/nio/charset/CharsetEncoder;)V"/>
+ <method name="getEncoding()Ljava/lang/String;"/>
+ </class>
+ <class name="java/io/PipedInputStream" since="1">
+ <extends name="java/io/InputStream"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V" since="9"/>
+ <method name="&lt;init>(Ljava/io/PipedOutputStream;)V"/>
+ <method name="&lt;init>(Ljava/io/PipedOutputStream;I)V" since="9"/>
+ <method name="connect(Ljava/io/PipedOutputStream;)V"/>
+ <method name="receive(I)V"/>
+ <field name="PIPE_SIZE"/>
+ <field name="buffer"/>
+ <field name="in"/>
+ <field name="out"/>
+ </class>
+ <class name="java/io/PipedOutputStream" since="1">
+ <extends name="java/io/OutputStream"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/io/PipedInputStream;)V"/>
+ <method name="connect(Ljava/io/PipedInputStream;)V"/>
+ </class>
+ <class name="java/io/PipedReader" since="1">
+ <extends name="java/io/Reader"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V" since="9"/>
+ <method name="&lt;init>(Ljava/io/PipedWriter;)V"/>
+ <method name="&lt;init>(Ljava/io/PipedWriter;I)V" since="9"/>
+ <method name="connect(Ljava/io/PipedWriter;)V"/>
+ </class>
+ <class name="java/io/PipedWriter" since="1">
+ <extends name="java/io/Writer"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/io/PipedReader;)V"/>
+ <method name="connect(Ljava/io/PipedReader;)V"/>
+ </class>
+ <class name="java/io/PrintStream" since="1">
+ <extends name="java/io/FilterOutputStream"/>
+ <implements name="java/lang/Appendable"/>
+ <method name="&lt;init>(Ljava/io/File;)V"/>
+ <method name="&lt;init>(Ljava/io/File;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;)V"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;Z)V"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;ZLjava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="append(C)Ljava/io/PrintStream;"/>
+ <method name="append(Ljava/lang/CharSequence;)Ljava/io/PrintStream;"/>
+ <method name="append(Ljava/lang/CharSequence;II)Ljava/io/PrintStream;"/>
+ <method name="checkError()Z"/>
+ <method name="clearError()V" since="9"/>
+ <method name="format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;"/>
+ <method name="format(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;"/>
+ <method name="print(C)V"/>
+ <method name="print(D)V"/>
+ <method name="print(F)V"/>
+ <method name="print(I)V"/>
+ <method name="print(J)V"/>
+ <method name="print(Ljava/lang/Object;)V"/>
+ <method name="print(Ljava/lang/String;)V"/>
+ <method name="print(Z)V"/>
+ <method name="print([C)V"/>
+ <method name="printf(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;"/>
+ <method name="printf(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;"/>
+ <method name="println()V"/>
+ <method name="println(C)V"/>
+ <method name="println(D)V"/>
+ <method name="println(F)V"/>
+ <method name="println(I)V"/>
+ <method name="println(J)V"/>
+ <method name="println(Ljava/lang/Object;)V"/>
+ <method name="println(Ljava/lang/String;)V"/>
+ <method name="println(Z)V"/>
+ <method name="println([C)V"/>
+ <method name="setError()V"/>
+ </class>
+ <class name="java/io/PrintWriter" since="1">
+ <extends name="java/io/Writer"/>
+ <method name="&lt;init>(Ljava/io/File;)V"/>
+ <method name="&lt;init>(Ljava/io/File;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;)V"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;Z)V"/>
+ <method name="&lt;init>(Ljava/io/Writer;)V"/>
+ <method name="&lt;init>(Ljava/io/Writer;Z)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="append(C)Ljava/io/PrintWriter;"/>
+ <method name="append(Ljava/lang/CharSequence;)Ljava/io/PrintWriter;"/>
+ <method name="append(Ljava/lang/CharSequence;II)Ljava/io/PrintWriter;"/>
+ <method name="checkError()Z"/>
+ <method name="clearError()V" since="9"/>
+ <method name="format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintWriter;"/>
+ <method name="format(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintWriter;"/>
+ <method name="print(C)V"/>
+ <method name="print(D)V"/>
+ <method name="print(F)V"/>
+ <method name="print(I)V"/>
+ <method name="print(J)V"/>
+ <method name="print(Ljava/lang/Object;)V"/>
+ <method name="print(Ljava/lang/String;)V"/>
+ <method name="print(Z)V"/>
+ <method name="print([C)V"/>
+ <method name="printf(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintWriter;"/>
+ <method name="printf(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintWriter;"/>
+ <method name="println()V"/>
+ <method name="println(C)V"/>
+ <method name="println(D)V"/>
+ <method name="println(F)V"/>
+ <method name="println(I)V"/>
+ <method name="println(J)V"/>
+ <method name="println(Ljava/lang/Object;)V"/>
+ <method name="println(Ljava/lang/String;)V"/>
+ <method name="println(Z)V"/>
+ <method name="println([C)V"/>
+ <method name="setError()V"/>
+ <field name="out"/>
+ </class>
+ <class name="java/io/PushbackInputStream" since="1">
+ <extends name="java/io/FilterInputStream"/>
+ <method name="&lt;init>(Ljava/io/InputStream;)V"/>
+ <method name="&lt;init>(Ljava/io/InputStream;I)V"/>
+ <method name="unread(I)V"/>
+ <method name="unread([B)V"/>
+ <method name="unread([BII)V"/>
+ <field name="buf"/>
+ <field name="pos"/>
+ </class>
+ <class name="java/io/PushbackReader" since="1">
+ <extends name="java/io/FilterReader"/>
+ <method name="&lt;init>(Ljava/io/Reader;)V"/>
+ <method name="&lt;init>(Ljava/io/Reader;I)V"/>
+ <method name="unread(I)V"/>
+ <method name="unread([C)V"/>
+ <method name="unread([CII)V"/>
+ </class>
+ <class name="java/io/RandomAccessFile" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable"/>
+ <implements name="java/io/DataInput"/>
+ <implements name="java/io/DataOutput"/>
+ <method name="&lt;init>(Ljava/io/File;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="getChannel()Ljava/nio/channels/FileChannel;"/>
+ <method name="getFD()Ljava/io/FileDescriptor;"/>
+ <method name="getFilePointer()J"/>
+ <method name="length()J"/>
+ <method name="read()I"/>
+ <method name="read([B)I"/>
+ <method name="read([BII)I"/>
+ <method name="seek(J)V"/>
+ <method name="setLength(J)V"/>
+ </class>
+ <class name="java/io/Reader" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable"/>
+ <implements name="java/lang/Readable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/Object;)V"/>
+ <method name="mark(I)V"/>
+ <method name="markSupported()Z"/>
+ <method name="read()I"/>
+ <method name="read([C)I"/>
+ <method name="read([CII)I"/>
+ <method name="ready()Z"/>
+ <method name="reset()V"/>
+ <method name="skip(J)J"/>
+ <field name="lock"/>
+ </class>
+ <class name="java/io/SequenceInputStream" since="1">
+ <extends name="java/io/InputStream"/>
+ <method name="&lt;init>(Ljava/io/InputStream;Ljava/io/InputStream;)V"/>
+ <method name="&lt;init>(Ljava/util/Enumeration;)V"/>
+ </class>
+ <class name="java/io/Serializable" since="1">
+ <extends name="java/lang/Object"/>
+ </class>
+ <class name="java/io/SerializablePermission" since="1">
+ <extends name="java/security/BasicPermission"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/io/StreamCorruptedException" since="1">
+ <extends name="java/io/ObjectStreamException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/io/StreamTokenizer" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/io/InputStream;)V" deprecated="16"/>
+ <method name="&lt;init>(Ljava/io/Reader;)V"/>
+ <method name="commentChar(I)V"/>
+ <method name="eolIsSignificant(Z)V"/>
+ <method name="lineno()I"/>
+ <method name="lowerCaseMode(Z)V"/>
+ <method name="nextToken()I"/>
+ <method name="ordinaryChar(I)V"/>
+ <method name="ordinaryChars(II)V"/>
+ <method name="parseNumbers()V"/>
+ <method name="pushBack()V"/>
+ <method name="quoteChar(I)V"/>
+ <method name="resetSyntax()V"/>
+ <method name="slashSlashComments(Z)V"/>
+ <method name="slashStarComments(Z)V"/>
+ <method name="whitespaceChars(II)V"/>
+ <method name="wordChars(II)V"/>
+ <field name="TT_EOF"/>
+ <field name="TT_EOL"/>
+ <field name="TT_NUMBER"/>
+ <field name="TT_WORD"/>
+ <field name="nval"/>
+ <field name="sval"/>
+ <field name="ttype"/>
+ </class>
+ <class name="java/io/StringBufferInputStream" since="1" deprecated="1">
+ <extends name="java/io/InputStream"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <field name="buffer"/>
+ <field name="count"/>
+ <field name="pos"/>
+ </class>
+ <class name="java/io/StringReader" since="1">
+ <extends name="java/io/Reader"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/io/StringWriter" since="1">
+ <extends name="java/io/Writer"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="append(C)Ljava/io/StringWriter;"/>
+ <method name="append(Ljava/lang/CharSequence;)Ljava/io/StringWriter;"/>
+ <method name="append(Ljava/lang/CharSequence;II)Ljava/io/StringWriter;"/>
+ <method name="getBuffer()Ljava/lang/StringBuffer;"/>
+ </class>
+ <class name="java/io/SyncFailedException" since="1">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/io/UTFDataFormatException" since="1">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/io/UncheckedIOException" since="24">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>(Ljava/io/IOException;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/io/IOException;)V"/>
+ <method name="getCause()Ljava/io/IOException;"/>
+ </class>
+ <class name="java/io/UnsupportedEncodingException" since="1">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/io/WriteAbortedException" since="1">
+ <extends name="java/io/ObjectStreamException"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Exception;)V"/>
+ <field name="detail"/>
+ </class>
+ <class name="java/io/Writer" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable"/>
+ <implements name="java/io/Flushable"/>
+ <implements name="java/lang/Appendable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/Object;)V"/>
+ <method name="append(C)Ljava/io/Writer;"/>
+ <method name="append(Ljava/lang/CharSequence;)Ljava/io/Writer;"/>
+ <method name="append(Ljava/lang/CharSequence;II)Ljava/io/Writer;"/>
+ <method name="write(I)V"/>
+ <method name="write(Ljava/lang/String;)V"/>
+ <method name="write(Ljava/lang/String;II)V"/>
+ <method name="write([C)V"/>
+ <method name="write([CII)V"/>
+ <field name="lock"/>
+ </class>
+ <class name="java/lang/AbstractMethodError" since="1">
+ <extends name="java/lang/IncompatibleClassChangeError"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/AbstractStringBuilder" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Appendable" since="26"/>
+ <implements name="java/lang/CharSequence" since="24"/>
+ <method name="&lt;init>()V"/>
+ <method name="append(C)Ljava/lang/AbstractStringBuilder;" since="26"/>
+ <method name="append(Ljava/lang/CharSequence;)Ljava/lang/AbstractStringBuilder;" since="26"/>
+ <method name="append(Ljava/lang/CharSequence;II)Ljava/lang/AbstractStringBuilder;" since="26"/>
+ <method name="capacity()I"/>
+ <method name="charAt(I)C"/>
+ <method name="codePointAt(I)I"/>
+ <method name="codePointBefore(I)I"/>
+ <method name="codePointCount(II)I"/>
+ <method name="ensureCapacity(I)V"/>
+ <method name="getChars(II[CI)V"/>
+ <method name="indexOf(Ljava/lang/String;)I"/>
+ <method name="indexOf(Ljava/lang/String;I)I"/>
+ <method name="lastIndexOf(Ljava/lang/String;)I"/>
+ <method name="lastIndexOf(Ljava/lang/String;I)I"/>
+ <method name="length()I"/>
+ <method name="offsetByCodePoints(II)I"/>
+ <method name="setCharAt(IC)V"/>
+ <method name="setLength(I)V"/>
+ <method name="subSequence(II)Ljava/lang/CharSequence;"/>
+ <method name="substring(I)Ljava/lang/String;"/>
+ <method name="substring(II)Ljava/lang/String;"/>
+ <method name="trimToSize()V"/>
+ </class>
+ <class name="java/lang/Appendable" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="append(C)Ljava/lang/Appendable;"/>
+ <method name="append(Ljava/lang/CharSequence;)Ljava/lang/Appendable;"/>
+ <method name="append(Ljava/lang/CharSequence;II)Ljava/lang/Appendable;"/>
+ </class>
+ <class name="java/lang/ArithmeticException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/ArrayIndexOutOfBoundsException" since="1">
+ <extends name="java/lang/IndexOutOfBoundsException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/ArrayStoreException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/AssertionError" since="1">
+ <extends name="java/lang/Error"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(C)V"/>
+ <method name="&lt;init>(D)V"/>
+ <method name="&lt;init>(F)V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(J)V"/>
+ <method name="&lt;init>(Ljava/lang/Object;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" since="19"/>
+ <method name="&lt;init>(Z)V"/>
+ </class>
+ <class name="java/lang/AutoCloseable" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="close()V"/>
+ </class>
+ <class name="java/lang/Boolean" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Z)V"/>
+ <method name="booleanValue()Z"/>
+ <method name="compare(ZZ)I" since="19"/>
+ <method name="compareTo(Ljava/lang/Boolean;)I"/>
+ <method name="getBoolean(Ljava/lang/String;)Z"/>
+ <method name="hashCode(Z)I" since="24"/>
+ <method name="logicalAnd(ZZ)Z" since="24"/>
+ <method name="logicalOr(ZZ)Z" since="24"/>
+ <method name="logicalXor(ZZ)Z" since="24"/>
+ <method name="parseBoolean(Ljava/lang/String;)Z"/>
+ <method name="toString(Z)Ljava/lang/String;"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/lang/Boolean;"/>
+ <method name="valueOf(Z)Ljava/lang/Boolean;"/>
+ <field name="FALSE"/>
+ <field name="TRUE"/>
+ <field name="TYPE"/>
+ </class>
+ <class name="java/lang/BootstrapMethodError" since="26">
+ <extends name="java/lang/LinkageError"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/lang/Byte" since="1">
+ <extends name="java/lang/Number"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>(B)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="compare(BB)I" since="19"/>
+ <method name="compareTo(Ljava/lang/Byte;)I"/>
+ <method name="decode(Ljava/lang/String;)Ljava/lang/Byte;"/>
+ <method name="hashCode(B)I" since="24"/>
+ <method name="parseByte(Ljava/lang/String;)B"/>
+ <method name="parseByte(Ljava/lang/String;I)B"/>
+ <method name="toString(B)Ljava/lang/String;"/>
+ <method name="toUnsignedInt(B)I" since="26"/>
+ <method name="toUnsignedLong(B)J" since="26"/>
+ <method name="valueOf(B)Ljava/lang/Byte;"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/lang/Byte;"/>
+ <method name="valueOf(Ljava/lang/String;I)Ljava/lang/Byte;"/>
+ <field name="BYTES" since="24"/>
+ <field name="MAX_VALUE"/>
+ <field name="MIN_VALUE"/>
+ <field name="SIZE"/>
+ <field name="TYPE"/>
+ </class>
+ <class name="java/lang/CharSequence" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="charAt(I)C"/>
+ <method name="chars()Ljava/util/stream/IntStream;" since="24"/>
+ <method name="codePoints()Ljava/util/stream/IntStream;" since="24"/>
+ <method name="length()I"/>
+ <method name="subSequence(II)Ljava/lang/CharSequence;"/>
+ </class>
+ <class name="java/lang/Character" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>(C)V"/>
+ <method name="charCount(I)I"/>
+ <method name="charValue()C"/>
+ <method name="codePointAt(Ljava/lang/CharSequence;I)I"/>
+ <method name="codePointAt([CI)I"/>
+ <method name="codePointAt([CII)I"/>
+ <method name="codePointBefore(Ljava/lang/CharSequence;I)I"/>
+ <method name="codePointBefore([CI)I"/>
+ <method name="codePointBefore([CII)I"/>
+ <method name="codePointCount(Ljava/lang/CharSequence;II)I"/>
+ <method name="codePointCount([CII)I"/>
+ <method name="compare(CC)I" since="19"/>
+ <method name="compareTo(Ljava/lang/Character;)I"/>
+ <method name="digit(CI)I"/>
+ <method name="digit(II)I"/>
+ <method name="forDigit(II)C"/>
+ <method name="getDirectionality(C)B"/>
+ <method name="getDirectionality(I)B"/>
+ <method name="getName(I)Ljava/lang/String;" since="19"/>
+ <method name="getNumericValue(C)I"/>
+ <method name="getNumericValue(I)I"/>
+ <method name="getType(C)I"/>
+ <method name="getType(I)I"/>
+ <method name="hashCode(C)I" since="24"/>
+ <method name="highSurrogate(I)C" since="19"/>
+ <method name="isAlphabetic(I)Z" since="19"/>
+ <method name="isBmpCodePoint(I)Z" since="19"/>
+ <method name="isDefined(C)Z"/>
+ <method name="isDefined(I)Z"/>
+ <method name="isDigit(C)Z"/>
+ <method name="isDigit(I)Z"/>
+ <method name="isHighSurrogate(C)Z"/>
+ <method name="isISOControl(C)Z"/>
+ <method name="isISOControl(I)Z"/>
+ <method name="isIdentifierIgnorable(C)Z"/>
+ <method name="isIdentifierIgnorable(I)Z"/>
+ <method name="isIdeographic(I)Z" since="19"/>
+ <method name="isJavaIdentifierPart(C)Z"/>
+ <method name="isJavaIdentifierPart(I)Z"/>
+ <method name="isJavaIdentifierStart(C)Z"/>
+ <method name="isJavaIdentifierStart(I)Z"/>
+ <method name="isJavaLetter(C)Z" deprecated="16"/>
+ <method name="isJavaLetterOrDigit(C)Z" deprecated="16"/>
+ <method name="isLetter(C)Z"/>
+ <method name="isLetter(I)Z"/>
+ <method name="isLetterOrDigit(C)Z"/>
+ <method name="isLetterOrDigit(I)Z"/>
+ <method name="isLowSurrogate(C)Z"/>
+ <method name="isLowerCase(C)Z"/>
+ <method name="isLowerCase(I)Z"/>
+ <method name="isMirrored(C)Z"/>
+ <method name="isMirrored(I)Z"/>
+ <method name="isSpace(C)Z" deprecated="16"/>
+ <method name="isSpaceChar(C)Z"/>
+ <method name="isSpaceChar(I)Z"/>
+ <method name="isSupplementaryCodePoint(I)Z"/>
+ <method name="isSurrogate(C)Z" since="19"/>
+ <method name="isSurrogatePair(CC)Z"/>
+ <method name="isTitleCase(C)Z"/>
+ <method name="isTitleCase(I)Z"/>
+ <method name="isUnicodeIdentifierPart(C)Z"/>
+ <method name="isUnicodeIdentifierPart(I)Z"/>
+ <method name="isUnicodeIdentifierStart(C)Z"/>
+ <method name="isUnicodeIdentifierStart(I)Z"/>
+ <method name="isUpperCase(C)Z"/>
+ <method name="isUpperCase(I)Z"/>
+ <method name="isValidCodePoint(I)Z"/>
+ <method name="isWhitespace(C)Z"/>
+ <method name="isWhitespace(I)Z"/>
+ <method name="lowSurrogate(I)C" since="19"/>
+ <method name="offsetByCodePoints(Ljava/lang/CharSequence;II)I"/>
+ <method name="offsetByCodePoints([CIIII)I"/>
+ <method name="reverseBytes(C)C"/>
+ <method name="toChars(I)[C"/>
+ <method name="toChars(I[CI)I"/>
+ <method name="toCodePoint(CC)I"/>
+ <method name="toLowerCase(C)C"/>
+ <method name="toLowerCase(I)I"/>
+ <method name="toString(C)Ljava/lang/String;"/>
+ <method name="toTitleCase(C)C"/>
+ <method name="toTitleCase(I)I"/>
+ <method name="toUpperCase(C)C"/>
+ <method name="toUpperCase(I)I"/>
+ <method name="valueOf(C)Ljava/lang/Character;"/>
+ <field name="BYTES" since="24"/>
+ <field name="COMBINING_SPACING_MARK"/>
+ <field name="CONNECTOR_PUNCTUATION"/>
+ <field name="CONTROL"/>
+ <field name="CURRENCY_SYMBOL"/>
+ <field name="DASH_PUNCTUATION"/>
+ <field name="DECIMAL_DIGIT_NUMBER"/>
+ <field name="DIRECTIONALITY_ARABIC_NUMBER"/>
+ <field name="DIRECTIONALITY_BOUNDARY_NEUTRAL"/>
+ <field name="DIRECTIONALITY_COMMON_NUMBER_SEPARATOR"/>
+ <field name="DIRECTIONALITY_EUROPEAN_NUMBER"/>
+ <field name="DIRECTIONALITY_EUROPEAN_NUMBER_SEPARATOR"/>
+ <field name="DIRECTIONALITY_EUROPEAN_NUMBER_TERMINATOR"/>
+ <field name="DIRECTIONALITY_LEFT_TO_RIGHT"/>
+ <field name="DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING"/>
+ <field name="DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE"/>
+ <field name="DIRECTIONALITY_NONSPACING_MARK"/>
+ <field name="DIRECTIONALITY_OTHER_NEUTRALS"/>
+ <field name="DIRECTIONALITY_PARAGRAPH_SEPARATOR"/>
+ <field name="DIRECTIONALITY_POP_DIRECTIONAL_FORMAT"/>
+ <field name="DIRECTIONALITY_RIGHT_TO_LEFT"/>
+ <field name="DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC"/>
+ <field name="DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING"/>
+ <field name="DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE"/>
+ <field name="DIRECTIONALITY_SEGMENT_SEPARATOR"/>
+ <field name="DIRECTIONALITY_UNDEFINED"/>
+ <field name="DIRECTIONALITY_WHITESPACE"/>
+ <field name="ENCLOSING_MARK"/>
+ <field name="END_PUNCTUATION"/>
+ <field name="FINAL_QUOTE_PUNCTUATION"/>
+ <field name="FORMAT"/>
+ <field name="INITIAL_QUOTE_PUNCTUATION"/>
+ <field name="LETTER_NUMBER"/>
+ <field name="LINE_SEPARATOR"/>
+ <field name="LOWERCASE_LETTER"/>
+ <field name="MATH_SYMBOL"/>
+ <field name="MAX_CODE_POINT"/>
+ <field name="MAX_HIGH_SURROGATE"/>
+ <field name="MAX_LOW_SURROGATE"/>
+ <field name="MAX_RADIX"/>
+ <field name="MAX_SURROGATE"/>
+ <field name="MAX_VALUE"/>
+ <field name="MIN_CODE_POINT"/>
+ <field name="MIN_HIGH_SURROGATE"/>
+ <field name="MIN_LOW_SURROGATE"/>
+ <field name="MIN_RADIX"/>
+ <field name="MIN_SUPPLEMENTARY_CODE_POINT"/>
+ <field name="MIN_SURROGATE"/>
+ <field name="MIN_VALUE"/>
+ <field name="MODIFIER_LETTER"/>
+ <field name="MODIFIER_SYMBOL"/>
+ <field name="NON_SPACING_MARK"/>
+ <field name="OTHER_LETTER"/>
+ <field name="OTHER_NUMBER"/>
+ <field name="OTHER_PUNCTUATION"/>
+ <field name="OTHER_SYMBOL"/>
+ <field name="PARAGRAPH_SEPARATOR"/>
+ <field name="PRIVATE_USE"/>
+ <field name="SIZE"/>
+ <field name="SPACE_SEPARATOR"/>
+ <field name="START_PUNCTUATION"/>
+ <field name="SURROGATE"/>
+ <field name="TITLECASE_LETTER"/>
+ <field name="TYPE"/>
+ <field name="UNASSIGNED"/>
+ <field name="UPPERCASE_LETTER"/>
+ </class>
+ <class name="java/lang/Character$Subset" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/Character$UnicodeBlock" since="1">
+ <extends name="java/lang/Character$Subset"/>
+ <method name="&lt;init>()V"/>
+ <method name="forName(Ljava/lang/String;)Ljava/lang/Character$UnicodeBlock;"/>
+ <method name="of(C)Ljava/lang/Character$UnicodeBlock;"/>
+ <method name="of(I)Ljava/lang/Character$UnicodeBlock;"/>
+ <field name="AEGEAN_NUMBERS"/>
+ <field name="ALCHEMICAL_SYMBOLS" since="19"/>
+ <field name="ALPHABETIC_PRESENTATION_FORMS"/>
+ <field name="ANCIENT_GREEK_MUSICAL_NOTATION" since="19"/>
+ <field name="ANCIENT_GREEK_NUMBERS" since="19"/>
+ <field name="ANCIENT_SYMBOLS" since="19"/>
+ <field name="ARABIC"/>
+ <field name="ARABIC_EXTENDED_A" since="26"/>
+ <field name="ARABIC_MATHEMATICAL_ALPHABETIC_SYMBOLS" since="26"/>
+ <field name="ARABIC_PRESENTATION_FORMS_A"/>
+ <field name="ARABIC_PRESENTATION_FORMS_B"/>
+ <field name="ARABIC_SUPPLEMENT" since="19"/>
+ <field name="ARMENIAN"/>
+ <field name="ARROWS"/>
+ <field name="AVESTAN" since="19"/>
+ <field name="BALINESE" since="19"/>
+ <field name="BAMUM" since="19"/>
+ <field name="BAMUM_SUPPLEMENT" since="19"/>
+ <field name="BASIC_LATIN"/>
+ <field name="BATAK" since="19"/>
+ <field name="BENGALI"/>
+ <field name="BLOCK_ELEMENTS"/>
+ <field name="BOPOMOFO"/>
+ <field name="BOPOMOFO_EXTENDED"/>
+ <field name="BOX_DRAWING"/>
+ <field name="BRAHMI" since="19"/>
+ <field name="BRAILLE_PATTERNS"/>
+ <field name="BUGINESE" since="19"/>
+ <field name="BUHID"/>
+ <field name="BYZANTINE_MUSICAL_SYMBOLS"/>
+ <field name="CARIAN" since="19"/>
+ <field name="CHAKMA" since="26"/>
+ <field name="CHAM" since="19"/>
+ <field name="CHEROKEE"/>
+ <field name="CJK_COMPATIBILITY"/>
+ <field name="CJK_COMPATIBILITY_FORMS"/>
+ <field name="CJK_COMPATIBILITY_IDEOGRAPHS"/>
+ <field name="CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT"/>
+ <field name="CJK_RADICALS_SUPPLEMENT"/>
+ <field name="CJK_STROKES" since="19"/>
+ <field name="CJK_SYMBOLS_AND_PUNCTUATION"/>
+ <field name="CJK_UNIFIED_IDEOGRAPHS"/>
+ <field name="CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A"/>
+ <field name="CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B"/>
+ <field name="CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C" since="19"/>
+ <field name="CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D" since="19"/>
+ <field name="COMBINING_DIACRITICAL_MARKS"/>
+ <field name="COMBINING_DIACRITICAL_MARKS_SUPPLEMENT" since="19"/>
+ <field name="COMBINING_HALF_MARKS"/>
+ <field name="COMBINING_MARKS_FOR_SYMBOLS"/>
+ <field name="COMMON_INDIC_NUMBER_FORMS" since="19"/>
+ <field name="CONTROL_PICTURES"/>
+ <field name="COPTIC" since="19"/>
+ <field name="COUNTING_ROD_NUMERALS" since="19"/>
+ <field name="CUNEIFORM" since="19"/>
+ <field name="CUNEIFORM_NUMBERS_AND_PUNCTUATION" since="19"/>
+ <field name="CURRENCY_SYMBOLS"/>
+ <field name="CYPRIOT_SYLLABARY"/>
+ <field name="CYRILLIC"/>
+ <field name="CYRILLIC_EXTENDED_A" since="19"/>
+ <field name="CYRILLIC_EXTENDED_B" since="19"/>
+ <field name="CYRILLIC_SUPPLEMENTARY"/>
+ <field name="DESERET"/>
+ <field name="DEVANAGARI"/>
+ <field name="DEVANAGARI_EXTENDED" since="19"/>
+ <field name="DINGBATS"/>
+ <field name="DOMINO_TILES" since="19"/>
+ <field name="EGYPTIAN_HIEROGLYPHS" since="19"/>
+ <field name="EMOTICONS" since="19"/>
+ <field name="ENCLOSED_ALPHANUMERICS"/>
+ <field name="ENCLOSED_ALPHANUMERIC_SUPPLEMENT" since="19"/>
+ <field name="ENCLOSED_CJK_LETTERS_AND_MONTHS"/>
+ <field name="ENCLOSED_IDEOGRAPHIC_SUPPLEMENT" since="19"/>
+ <field name="ETHIOPIC"/>
+ <field name="ETHIOPIC_EXTENDED" since="19"/>
+ <field name="ETHIOPIC_EXTENDED_A" since="19"/>
+ <field name="ETHIOPIC_SUPPLEMENT" since="19"/>
+ <field name="GENERAL_PUNCTUATION"/>
+ <field name="GEOMETRIC_SHAPES"/>
+ <field name="GEORGIAN"/>
+ <field name="GEORGIAN_SUPPLEMENT" since="19"/>
+ <field name="GLAGOLITIC" since="19"/>
+ <field name="GOTHIC"/>
+ <field name="GREEK"/>
+ <field name="GREEK_EXTENDED"/>
+ <field name="GUJARATI"/>
+ <field name="GURMUKHI"/>
+ <field name="HALFWIDTH_AND_FULLWIDTH_FORMS"/>
+ <field name="HANGUL_COMPATIBILITY_JAMO"/>
+ <field name="HANGUL_JAMO"/>
+ <field name="HANGUL_JAMO_EXTENDED_A" since="19"/>
+ <field name="HANGUL_JAMO_EXTENDED_B" since="19"/>
+ <field name="HANGUL_SYLLABLES"/>
+ <field name="HANUNOO"/>
+ <field name="HEBREW"/>
+ <field name="HIGH_PRIVATE_USE_SURROGATES"/>
+ <field name="HIGH_SURROGATES"/>
+ <field name="HIRAGANA"/>
+ <field name="IDEOGRAPHIC_DESCRIPTION_CHARACTERS"/>
+ <field name="IMPERIAL_ARAMAIC" since="19"/>
+ <field name="INSCRIPTIONAL_PAHLAVI" since="19"/>
+ <field name="INSCRIPTIONAL_PARTHIAN" since="19"/>
+ <field name="IPA_EXTENSIONS"/>
+ <field name="JAVANESE" since="19"/>
+ <field name="KAITHI" since="19"/>
+ <field name="KANA_SUPPLEMENT" since="19"/>
+ <field name="KANBUN"/>
+ <field name="KANGXI_RADICALS"/>
+ <field name="KANNADA"/>
+ <field name="KATAKANA"/>
+ <field name="KATAKANA_PHONETIC_EXTENSIONS"/>
+ <field name="KAYAH_LI" since="19"/>
+ <field name="KHAROSHTHI" since="19"/>
+ <field name="KHMER"/>
+ <field name="KHMER_SYMBOLS"/>
+ <field name="LAO"/>
+ <field name="LATIN_1_SUPPLEMENT"/>
+ <field name="LATIN_EXTENDED_A"/>
+ <field name="LATIN_EXTENDED_ADDITIONAL"/>
+ <field name="LATIN_EXTENDED_B"/>
+ <field name="LATIN_EXTENDED_C" since="19"/>
+ <field name="LATIN_EXTENDED_D" since="19"/>
+ <field name="LEPCHA" since="19"/>
+ <field name="LETTERLIKE_SYMBOLS"/>
+ <field name="LIMBU"/>
+ <field name="LINEAR_B_IDEOGRAMS"/>
+ <field name="LINEAR_B_SYLLABARY"/>
+ <field name="LISU" since="19"/>
+ <field name="LOW_SURROGATES"/>
+ <field name="LYCIAN" since="19"/>
+ <field name="LYDIAN" since="19"/>
+ <field name="MAHJONG_TILES" since="19"/>
+ <field name="MALAYALAM"/>
+ <field name="MANDAIC" since="19"/>
+ <field name="MATHEMATICAL_ALPHANUMERIC_SYMBOLS"/>
+ <field name="MATHEMATICAL_OPERATORS"/>
+ <field name="MEETEI_MAYEK" since="19"/>
+ <field name="MEETEI_MAYEK_EXTENSIONS" since="26"/>
+ <field name="MEROITIC_CURSIVE" since="26"/>
+ <field name="MEROITIC_HIEROGLYPHS" since="26"/>
+ <field name="MIAO" since="26"/>
+ <field name="MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A"/>
+ <field name="MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B"/>
+ <field name="MISCELLANEOUS_SYMBOLS"/>
+ <field name="MISCELLANEOUS_SYMBOLS_AND_ARROWS"/>
+ <field name="MISCELLANEOUS_SYMBOLS_AND_PICTOGRAPHS" since="19"/>
+ <field name="MISCELLANEOUS_TECHNICAL"/>
+ <field name="MODIFIER_TONE_LETTERS" since="19"/>
+ <field name="MONGOLIAN"/>
+ <field name="MUSICAL_SYMBOLS"/>
+ <field name="MYANMAR"/>
+ <field name="MYANMAR_EXTENDED_A" since="19"/>
+ <field name="NEW_TAI_LUE" since="19"/>
+ <field name="NKO" since="19"/>
+ <field name="NUMBER_FORMS"/>
+ <field name="OGHAM"/>
+ <field name="OLD_ITALIC"/>
+ <field name="OLD_PERSIAN" since="19"/>
+ <field name="OLD_SOUTH_ARABIAN" since="19"/>
+ <field name="OLD_TURKIC" since="19"/>
+ <field name="OL_CHIKI" since="19"/>
+ <field name="OPTICAL_CHARACTER_RECOGNITION"/>
+ <field name="ORIYA"/>
+ <field name="OSMANYA"/>
+ <field name="PHAGS_PA" since="19"/>
+ <field name="PHAISTOS_DISC" since="19"/>
+ <field name="PHOENICIAN" since="19"/>
+ <field name="PHONETIC_EXTENSIONS"/>
+ <field name="PHONETIC_EXTENSIONS_SUPPLEMENT" since="19"/>
+ <field name="PLAYING_CARDS" since="19"/>
+ <field name="PRIVATE_USE_AREA"/>
+ <field name="REJANG" since="19"/>
+ <field name="RUMI_NUMERAL_SYMBOLS" since="19"/>
+ <field name="RUNIC"/>
+ <field name="SAMARITAN" since="19"/>
+ <field name="SAURASHTRA" since="19"/>
+ <field name="SHARADA" since="26"/>
+ <field name="SHAVIAN"/>
+ <field name="SINHALA"/>
+ <field name="SMALL_FORM_VARIANTS"/>
+ <field name="SORA_SOMPENG" since="26"/>
+ <field name="SPACING_MODIFIER_LETTERS"/>
+ <field name="SPECIALS"/>
+ <field name="SUNDANESE" since="19"/>
+ <field name="SUNDANESE_SUPPLEMENT" since="26"/>
+ <field name="SUPERSCRIPTS_AND_SUBSCRIPTS"/>
+ <field name="SUPPLEMENTAL_ARROWS_A"/>
+ <field name="SUPPLEMENTAL_ARROWS_B"/>
+ <field name="SUPPLEMENTAL_MATHEMATICAL_OPERATORS"/>
+ <field name="SUPPLEMENTAL_PUNCTUATION" since="19"/>
+ <field name="SUPPLEMENTARY_PRIVATE_USE_AREA_A"/>
+ <field name="SUPPLEMENTARY_PRIVATE_USE_AREA_B"/>
+ <field name="SURROGATES_AREA" deprecated="16"/>
+ <field name="SYLOTI_NAGRI" since="19"/>
+ <field name="SYRIAC"/>
+ <field name="TAGALOG"/>
+ <field name="TAGBANWA"/>
+ <field name="TAGS"/>
+ <field name="TAI_LE"/>
+ <field name="TAI_THAM" since="19"/>
+ <field name="TAI_VIET" since="19"/>
+ <field name="TAI_XUAN_JING_SYMBOLS"/>
+ <field name="TAKRI" since="26"/>
+ <field name="TAMIL"/>
+ <field name="TELUGU"/>
+ <field name="THAANA"/>
+ <field name="THAI"/>
+ <field name="TIBETAN"/>
+ <field name="TIFINAGH" since="19"/>
+ <field name="TRANSPORT_AND_MAP_SYMBOLS" since="19"/>
+ <field name="UGARITIC"/>
+ <field name="UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS"/>
+ <field name="UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_EXTENDED" since="19"/>
+ <field name="VAI" since="19"/>
+ <field name="VARIATION_SELECTORS"/>
+ <field name="VARIATION_SELECTORS_SUPPLEMENT"/>
+ <field name="VEDIC_EXTENSIONS" since="19"/>
+ <field name="VERTICAL_FORMS" since="19"/>
+ <field name="YIJING_HEXAGRAM_SYMBOLS"/>
+ <field name="YI_RADICALS"/>
+ <field name="YI_SYLLABLES"/>
+ </class>
+ <class name="java/lang/Character$UnicodeScript" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="forName(Ljava/lang/String;)Ljava/lang/Character$UnicodeScript;"/>
+ <method name="of(I)Ljava/lang/Character$UnicodeScript;"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/lang/Character$UnicodeScript;"/>
+ <method name="values()[Ljava/lang/Character$UnicodeScript;"/>
+ <field name="ARABIC"/>
+ <field name="ARMENIAN"/>
+ <field name="AVESTAN"/>
+ <field name="BALINESE"/>
+ <field name="BAMUM"/>
+ <field name="BATAK"/>
+ <field name="BENGALI"/>
+ <field name="BOPOMOFO"/>
+ <field name="BRAHMI"/>
+ <field name="BRAILLE"/>
+ <field name="BUGINESE"/>
+ <field name="BUHID"/>
+ <field name="CANADIAN_ABORIGINAL"/>
+ <field name="CARIAN"/>
+ <field name="CHAKMA" since="26"/>
+ <field name="CHAM"/>
+ <field name="CHEROKEE"/>
+ <field name="COMMON"/>
+ <field name="COPTIC"/>
+ <field name="CUNEIFORM"/>
+ <field name="CYPRIOT"/>
+ <field name="CYRILLIC"/>
+ <field name="DESERET"/>
+ <field name="DEVANAGARI"/>
+ <field name="EGYPTIAN_HIEROGLYPHS"/>
+ <field name="ETHIOPIC"/>
+ <field name="GEORGIAN"/>
+ <field name="GLAGOLITIC"/>
+ <field name="GOTHIC"/>
+ <field name="GREEK"/>
+ <field name="GUJARATI"/>
+ <field name="GURMUKHI"/>
+ <field name="HAN"/>
+ <field name="HANGUL"/>
+ <field name="HANUNOO"/>
+ <field name="HEBREW"/>
+ <field name="HIRAGANA"/>
+ <field name="IMPERIAL_ARAMAIC"/>
+ <field name="INHERITED"/>
+ <field name="INSCRIPTIONAL_PAHLAVI"/>
+ <field name="INSCRIPTIONAL_PARTHIAN"/>
+ <field name="JAVANESE"/>
+ <field name="KAITHI"/>
+ <field name="KANNADA"/>
+ <field name="KATAKANA"/>
+ <field name="KAYAH_LI"/>
+ <field name="KHAROSHTHI"/>
+ <field name="KHMER"/>
+ <field name="LAO"/>
+ <field name="LATIN"/>
+ <field name="LEPCHA"/>
+ <field name="LIMBU"/>
+ <field name="LINEAR_B"/>
+ <field name="LISU"/>
+ <field name="LYCIAN"/>
+ <field name="LYDIAN"/>
+ <field name="MALAYALAM"/>
+ <field name="MANDAIC"/>
+ <field name="MEETEI_MAYEK"/>
+ <field name="MEROITIC_CURSIVE" since="26"/>
+ <field name="MEROITIC_HIEROGLYPHS" since="26"/>
+ <field name="MIAO" since="26"/>
+ <field name="MONGOLIAN"/>
+ <field name="MYANMAR"/>
+ <field name="NEW_TAI_LUE"/>
+ <field name="NKO"/>
+ <field name="OGHAM"/>
+ <field name="OLD_ITALIC"/>
+ <field name="OLD_PERSIAN"/>
+ <field name="OLD_SOUTH_ARABIAN"/>
+ <field name="OLD_TURKIC"/>
+ <field name="OL_CHIKI"/>
+ <field name="ORIYA"/>
+ <field name="OSMANYA"/>
+ <field name="PHAGS_PA"/>
+ <field name="PHOENICIAN"/>
+ <field name="REJANG"/>
+ <field name="RUNIC"/>
+ <field name="SAMARITAN"/>
+ <field name="SAURASHTRA"/>
+ <field name="SHARADA" since="26"/>
+ <field name="SHAVIAN"/>
+ <field name="SINHALA"/>
+ <field name="SORA_SOMPENG" since="26"/>
+ <field name="SUNDANESE"/>
+ <field name="SYLOTI_NAGRI"/>
+ <field name="SYRIAC"/>
+ <field name="TAGALOG"/>
+ <field name="TAGBANWA"/>
+ <field name="TAI_LE"/>
+ <field name="TAI_THAM"/>
+ <field name="TAI_VIET"/>
+ <field name="TAKRI" since="26"/>
+ <field name="TAMIL"/>
+ <field name="TELUGU"/>
+ <field name="THAANA"/>
+ <field name="THAI"/>
+ <field name="TIBETAN"/>
+ <field name="TIFINAGH"/>
+ <field name="UGARITIC"/>
+ <field name="UNKNOWN"/>
+ <field name="VAI"/>
+ <field name="YI"/>
+ </class>
+ <class name="java/lang/Class" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/reflect/AnnotatedElement"/>
+ <implements name="java/lang/reflect/GenericDeclaration"/>
+ <implements name="java/lang/reflect/Type"/>
+ <method name="&lt;init>()V"/>
+ <method name="asSubclass(Ljava/lang/Class;)Ljava/lang/Class;"/>
+ <method name="cast(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="desiredAssertionStatus()Z"/>
+ <method name="forName(Ljava/lang/String;)Ljava/lang/Class;"/>
+ <method name="forName(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;"/>
+ <method name="getCanonicalName()Ljava/lang/String;"/>
+ <method name="getClassLoader()Ljava/lang/ClassLoader;"/>
+ <method name="getClasses()[Ljava/lang/Class;"/>
+ <method name="getComponentType()Ljava/lang/Class;"/>
+ <method name="getConstructor([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;"/>
+ <method name="getConstructors()[Ljava/lang/reflect/Constructor;"/>
+ <method name="getDeclaredClasses()[Ljava/lang/Class;"/>
+ <method name="getDeclaredConstructor([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;"/>
+ <method name="getDeclaredConstructors()[Ljava/lang/reflect/Constructor;"/>
+ <method name="getDeclaredField(Ljava/lang/String;)Ljava/lang/reflect/Field;"/>
+ <method name="getDeclaredFields()[Ljava/lang/reflect/Field;"/>
+ <method name="getDeclaredMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;"/>
+ <method name="getDeclaredMethods()[Ljava/lang/reflect/Method;"/>
+ <method name="getDeclaringClass()Ljava/lang/Class;"/>
+ <method name="getEnclosingClass()Ljava/lang/Class;"/>
+ <method name="getEnclosingConstructor()Ljava/lang/reflect/Constructor;"/>
+ <method name="getEnclosingMethod()Ljava/lang/reflect/Method;"/>
+ <method name="getEnumConstants()[Ljava/lang/Object;"/>
+ <method name="getField(Ljava/lang/String;)Ljava/lang/reflect/Field;"/>
+ <method name="getFields()[Ljava/lang/reflect/Field;"/>
+ <method name="getGenericInterfaces()[Ljava/lang/reflect/Type;"/>
+ <method name="getGenericSuperclass()Ljava/lang/reflect/Type;"/>
+ <method name="getInterfaces()[Ljava/lang/Class;"/>
+ <method name="getMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;"/>
+ <method name="getMethods()[Ljava/lang/reflect/Method;"/>
+ <method name="getModifiers()I"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getPackage()Ljava/lang/Package;"/>
+ <method name="getProtectionDomain()Ljava/security/ProtectionDomain;"/>
+ <method name="getResource(Ljava/lang/String;)Ljava/net/URL;"/>
+ <method name="getResourceAsStream(Ljava/lang/String;)Ljava/io/InputStream;"/>
+ <method name="getSigners()[Ljava/lang/Object;"/>
+ <method name="getSimpleName()Ljava/lang/String;"/>
+ <method name="getSuperclass()Ljava/lang/Class;"/>
+ <method name="getTypeName()Ljava/lang/String;" since="26"/>
+ <method name="isAnnotation()Z"/>
+ <method name="isAnonymousClass()Z"/>
+ <method name="isArray()Z"/>
+ <method name="isAssignableFrom(Ljava/lang/Class;)Z"/>
+ <method name="isEnum()Z"/>
+ <method name="isInstance(Ljava/lang/Object;)Z"/>
+ <method name="isInterface()Z"/>
+ <method name="isLocalClass()Z"/>
+ <method name="isMemberClass()Z"/>
+ <method name="isPrimitive()Z"/>
+ <method name="isSynthetic()Z"/>
+ <method name="newInstance()Ljava/lang/Object;"/>
+ <method name="toGenericString()Ljava/lang/String;" since="26"/>
+ </class>
+ <class name="java/lang/ClassCastException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/ClassCircularityError" since="1">
+ <extends name="java/lang/LinkageError"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/ClassFormatError" since="1">
+ <extends name="java/lang/LinkageError"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/ClassLoader" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/ClassLoader;)V"/>
+ <method name="clearAssertionStatus()V"/>
+ <method name="defineClass(Ljava/lang/String;Ljava/nio/ByteBuffer;Ljava/security/ProtectionDomain;)Ljava/lang/Class;"/>
+ <method name="defineClass(Ljava/lang/String;[BII)Ljava/lang/Class;"/>
+ <method name="defineClass(Ljava/lang/String;[BIILjava/security/ProtectionDomain;)Ljava/lang/Class;"/>
+ <method name="defineClass([BII)Ljava/lang/Class;" deprecated="16"/>
+ <method name="definePackage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/net/URL;)Ljava/lang/Package;"/>
+ <method name="findClass(Ljava/lang/String;)Ljava/lang/Class;"/>
+ <method name="findLibrary(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="findLoadedClass(Ljava/lang/String;)Ljava/lang/Class;"/>
+ <method name="findResource(Ljava/lang/String;)Ljava/net/URL;"/>
+ <method name="findResources(Ljava/lang/String;)Ljava/util/Enumeration;"/>
+ <method name="findSystemClass(Ljava/lang/String;)Ljava/lang/Class;"/>
+ <method name="getPackage(Ljava/lang/String;)Ljava/lang/Package;"/>
+ <method name="getPackages()[Ljava/lang/Package;"/>
+ <method name="getParent()Ljava/lang/ClassLoader;"/>
+ <method name="getResource(Ljava/lang/String;)Ljava/net/URL;"/>
+ <method name="getResourceAsStream(Ljava/lang/String;)Ljava/io/InputStream;"/>
+ <method name="getResources(Ljava/lang/String;)Ljava/util/Enumeration;"/>
+ <method name="getSystemClassLoader()Ljava/lang/ClassLoader;"/>
+ <method name="getSystemResource(Ljava/lang/String;)Ljava/net/URL;"/>
+ <method name="getSystemResourceAsStream(Ljava/lang/String;)Ljava/io/InputStream;"/>
+ <method name="getSystemResources(Ljava/lang/String;)Ljava/util/Enumeration;"/>
+ <method name="loadClass(Ljava/lang/String;)Ljava/lang/Class;"/>
+ <method name="loadClass(Ljava/lang/String;Z)Ljava/lang/Class;"/>
+ <method name="registerAsParallelCapable()Z" since="24"/>
+ <method name="resolveClass(Ljava/lang/Class;)V"/>
+ <method name="setClassAssertionStatus(Ljava/lang/String;Z)V"/>
+ <method name="setDefaultAssertionStatus(Z)V"/>
+ <method name="setPackageAssertionStatus(Ljava/lang/String;Z)V"/>
+ <method name="setSigners(Ljava/lang/Class;[Ljava/lang/Object;)V"/>
+ </class>
+ <class name="java/lang/ClassNotFoundException" since="1">
+ <extends name="java/lang/Exception" removed="19"/>
+ <extends name="java/lang/ReflectiveOperationException" since="19"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="getException()Ljava/lang/Throwable;"/>
+ </class>
+ <class name="java/lang/CloneNotSupportedException" since="1">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/Cloneable" since="1">
+ <extends name="java/lang/Object"/>
+ </class>
+ <class name="java/lang/Comparable" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="compareTo(Ljava/lang/Object;)I"/>
+ </class>
+ <class name="java/lang/Compiler" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="command(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="compileClass(Ljava/lang/Class;)Z"/>
+ <method name="compileClasses(Ljava/lang/String;)Z"/>
+ <method name="disable()V"/>
+ <method name="enable()V"/>
+ </class>
+ <class name="java/lang/Deprecated" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ </class>
+ <class name="java/lang/Double" since="1">
+ <extends name="java/lang/Number"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>(D)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="compare(DD)I"/>
+ <method name="compareTo(Ljava/lang/Double;)I"/>
+ <method name="doubleToLongBits(D)J"/>
+ <method name="doubleToRawLongBits(D)J"/>
+ <method name="hashCode(D)I" since="24"/>
+ <method name="isFinite(D)Z" since="24"/>
+ <method name="isInfinite()Z"/>
+ <method name="isInfinite(D)Z"/>
+ <method name="isNaN()Z"/>
+ <method name="isNaN(D)Z"/>
+ <method name="longBitsToDouble(J)D"/>
+ <method name="max(DD)D" since="24"/>
+ <method name="min(DD)D" since="24"/>
+ <method name="parseDouble(Ljava/lang/String;)D"/>
+ <method name="sum(DD)D" since="24"/>
+ <method name="toHexString(D)Ljava/lang/String;"/>
+ <method name="toString(D)Ljava/lang/String;"/>
+ <method name="valueOf(D)Ljava/lang/Double;"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/lang/Double;"/>
+ <field name="BYTES" since="24"/>
+ <field name="MAX_EXPONENT" since="9"/>
+ <field name="MAX_VALUE"/>
+ <field name="MIN_EXPONENT" since="9"/>
+ <field name="MIN_NORMAL" since="9"/>
+ <field name="MIN_VALUE"/>
+ <field name="NEGATIVE_INFINITY"/>
+ <field name="NaN"/>
+ <field name="POSITIVE_INFINITY"/>
+ <field name="SIZE"/>
+ <field name="TYPE"/>
+ </class>
+ <class name="java/lang/Enum" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="compareTo(Ljava/lang/Enum;)I"/>
+ <method name="getDeclaringClass()Ljava/lang/Class;"/>
+ <method name="name()Ljava/lang/String;"/>
+ <method name="ordinal()I"/>
+ <method name="valueOf(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;"/>
+ </class>
+ <class name="java/lang/EnumConstantNotPresentException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>(Ljava/lang/Class;Ljava/lang/String;)V"/>
+ <method name="constantName()Ljava/lang/String;"/>
+ <method name="enumType()Ljava/lang/Class;"/>
+ </class>
+ <class name="java/lang/Error" since="1">
+ <extends name="java/lang/Throwable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;ZZ)V" since="24"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/lang/Exception" since="1">
+ <extends name="java/lang/Throwable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;ZZ)V" since="24"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/lang/ExceptionInInitializerError" since="1">
+ <extends name="java/lang/LinkageError"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ <method name="getException()Ljava/lang/Throwable;"/>
+ </class>
+ <class name="java/lang/Float" since="1">
+ <extends name="java/lang/Number"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>(D)V"/>
+ <method name="&lt;init>(F)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="compare(FF)I"/>
+ <method name="compareTo(Ljava/lang/Float;)I"/>
+ <method name="floatToIntBits(F)I"/>
+ <method name="floatToRawIntBits(F)I"/>
+ <method name="hashCode(F)I" since="24"/>
+ <method name="intBitsToFloat(I)F"/>
+ <method name="isFinite(F)Z" since="24"/>
+ <method name="isInfinite()Z"/>
+ <method name="isInfinite(F)Z"/>
+ <method name="isNaN()Z"/>
+ <method name="isNaN(F)Z"/>
+ <method name="max(FF)F" since="24"/>
+ <method name="min(FF)F" since="24"/>
+ <method name="parseFloat(Ljava/lang/String;)F"/>
+ <method name="sum(FF)F" since="24"/>
+ <method name="toHexString(F)Ljava/lang/String;"/>
+ <method name="toString(F)Ljava/lang/String;"/>
+ <method name="valueOf(F)Ljava/lang/Float;"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/lang/Float;"/>
+ <field name="BYTES" since="24"/>
+ <field name="MAX_EXPONENT" since="9"/>
+ <field name="MAX_VALUE"/>
+ <field name="MIN_EXPONENT" since="9"/>
+ <field name="MIN_NORMAL" since="9"/>
+ <field name="MIN_VALUE"/>
+ <field name="NEGATIVE_INFINITY"/>
+ <field name="NaN"/>
+ <field name="POSITIVE_INFINITY"/>
+ <field name="SIZE"/>
+ <field name="TYPE"/>
+ </class>
+ <class name="java/lang/FunctionalInterface" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ </class>
+ <class name="java/lang/IllegalAccessError" since="1">
+ <extends name="java/lang/IncompatibleClassChangeError"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/IllegalAccessException" since="1">
+ <extends name="java/lang/Exception" removed="19"/>
+ <extends name="java/lang/ReflectiveOperationException" since="19"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/IllegalArgumentException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/lang/IllegalMonitorStateException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/IllegalStateException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/lang/IllegalThreadStateException" since="1">
+ <extends name="java/lang/IllegalArgumentException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/IncompatibleClassChangeError" since="1">
+ <extends name="java/lang/LinkageError"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/IndexOutOfBoundsException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/InheritableThreadLocal" since="1">
+ <extends name="java/lang/ThreadLocal"/>
+ <method name="&lt;init>()V"/>
+ <method name="childValue(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ </class>
+ <class name="java/lang/InstantiationError" since="1">
+ <extends name="java/lang/IncompatibleClassChangeError"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/InstantiationException" since="1">
+ <extends name="java/lang/Exception" removed="19"/>
+ <extends name="java/lang/ReflectiveOperationException" since="19"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/Integer" since="1">
+ <extends name="java/lang/Number"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="bitCount(I)I"/>
+ <method name="compare(II)I" since="19"/>
+ <method name="compareTo(Ljava/lang/Integer;)I"/>
+ <method name="compareUnsigned(II)I" since="26"/>
+ <method name="decode(Ljava/lang/String;)Ljava/lang/Integer;"/>
+ <method name="divideUnsigned(II)I" since="26"/>
+ <method name="getInteger(Ljava/lang/String;)Ljava/lang/Integer;"/>
+ <method name="getInteger(Ljava/lang/String;I)Ljava/lang/Integer;"/>
+ <method name="getInteger(Ljava/lang/String;Ljava/lang/Integer;)Ljava/lang/Integer;"/>
+ <method name="hashCode(I)I" since="24"/>
+ <method name="highestOneBit(I)I"/>
+ <method name="lowestOneBit(I)I"/>
+ <method name="max(II)I" since="24"/>
+ <method name="min(II)I" since="24"/>
+ <method name="numberOfLeadingZeros(I)I"/>
+ <method name="numberOfTrailingZeros(I)I"/>
+ <method name="parseInt(Ljava/lang/String;)I"/>
+ <method name="parseInt(Ljava/lang/String;I)I"/>
+ <method name="parseUnsignedInt(Ljava/lang/String;)I" since="26"/>
+ <method name="parseUnsignedInt(Ljava/lang/String;I)I" since="26"/>
+ <method name="remainderUnsigned(II)I" since="26"/>
+ <method name="reverse(I)I"/>
+ <method name="reverseBytes(I)I"/>
+ <method name="rotateLeft(II)I"/>
+ <method name="rotateRight(II)I"/>
+ <method name="signum(I)I"/>
+ <method name="sum(II)I" since="24"/>
+ <method name="toBinaryString(I)Ljava/lang/String;"/>
+ <method name="toHexString(I)Ljava/lang/String;"/>
+ <method name="toOctalString(I)Ljava/lang/String;"/>
+ <method name="toString(I)Ljava/lang/String;"/>
+ <method name="toString(II)Ljava/lang/String;"/>
+ <method name="toUnsignedLong(I)J" since="26"/>
+ <method name="toUnsignedString(I)Ljava/lang/String;" since="26"/>
+ <method name="toUnsignedString(II)Ljava/lang/String;" since="26"/>
+ <method name="valueOf(I)Ljava/lang/Integer;"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/lang/Integer;"/>
+ <method name="valueOf(Ljava/lang/String;I)Ljava/lang/Integer;"/>
+ <field name="BYTES" since="24"/>
+ <field name="MAX_VALUE"/>
+ <field name="MIN_VALUE"/>
+ <field name="SIZE"/>
+ <field name="TYPE"/>
+ </class>
+ <class name="java/lang/InternalError" since="1">
+ <extends name="java/lang/VirtualMachineError"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" since="24"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" since="24"/>
+ </class>
+ <class name="java/lang/InterruptedException" since="1">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/Iterable" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="forEach(Ljava/util/function/Consumer;)V" since="24"/>
+ <method name="iterator()Ljava/util/Iterator;"/>
+ <method name="spliterator()Ljava/util/Spliterator;" since="24"/>
+ </class>
+ <class name="java/lang/LinkageError" since="1">
+ <extends name="java/lang/Error"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" since="19"/>
+ </class>
+ <class name="java/lang/Long" since="1">
+ <extends name="java/lang/Number"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>(J)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="bitCount(J)I"/>
+ <method name="compare(JJ)I" since="19"/>
+ <method name="compareTo(Ljava/lang/Long;)I"/>
+ <method name="compareUnsigned(JJ)I" since="26"/>
+ <method name="decode(Ljava/lang/String;)Ljava/lang/Long;"/>
+ <method name="divideUnsigned(JJ)J" since="26"/>
+ <method name="getLong(Ljava/lang/String;)Ljava/lang/Long;"/>
+ <method name="getLong(Ljava/lang/String;J)Ljava/lang/Long;"/>
+ <method name="getLong(Ljava/lang/String;Ljava/lang/Long;)Ljava/lang/Long;"/>
+ <method name="hashCode(J)I" since="24"/>
+ <method name="highestOneBit(J)J"/>
+ <method name="lowestOneBit(J)J"/>
+ <method name="max(JJ)J" since="24"/>
+ <method name="min(JJ)J" since="24"/>
+ <method name="numberOfLeadingZeros(J)I"/>
+ <method name="numberOfTrailingZeros(J)I"/>
+ <method name="parseLong(Ljava/lang/String;)J"/>
+ <method name="parseLong(Ljava/lang/String;I)J"/>
+ <method name="parseUnsignedLong(Ljava/lang/String;)J" since="26"/>
+ <method name="parseUnsignedLong(Ljava/lang/String;I)J" since="26"/>
+ <method name="remainderUnsigned(JJ)J" since="26"/>
+ <method name="reverse(J)J"/>
+ <method name="reverseBytes(J)J"/>
+ <method name="rotateLeft(JI)J"/>
+ <method name="rotateRight(JI)J"/>
+ <method name="signum(J)I"/>
+ <method name="sum(JJ)J" since="24"/>
+ <method name="toBinaryString(J)Ljava/lang/String;"/>
+ <method name="toHexString(J)Ljava/lang/String;"/>
+ <method name="toOctalString(J)Ljava/lang/String;"/>
+ <method name="toString(J)Ljava/lang/String;"/>
+ <method name="toString(JI)Ljava/lang/String;"/>
+ <method name="toUnsignedString(J)Ljava/lang/String;" since="26"/>
+ <method name="toUnsignedString(JI)Ljava/lang/String;" since="26"/>
+ <method name="valueOf(J)Ljava/lang/Long;"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/lang/Long;"/>
+ <method name="valueOf(Ljava/lang/String;I)Ljava/lang/Long;"/>
+ <field name="BYTES" since="24"/>
+ <field name="MAX_VALUE"/>
+ <field name="MIN_VALUE"/>
+ <field name="SIZE"/>
+ <field name="TYPE"/>
+ </class>
+ <class name="java/lang/Math" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="IEEEremainder(DD)D"/>
+ <method name="abs(D)D"/>
+ <method name="abs(F)F"/>
+ <method name="abs(I)I"/>
+ <method name="abs(J)J"/>
+ <method name="acos(D)D"/>
+ <method name="addExact(II)I" since="24"/>
+ <method name="addExact(JJ)J" since="24"/>
+ <method name="asin(D)D"/>
+ <method name="atan(D)D"/>
+ <method name="atan2(DD)D"/>
+ <method name="cbrt(D)D"/>
+ <method name="ceil(D)D"/>
+ <method name="copySign(DD)D" since="9"/>
+ <method name="copySign(FF)F" since="9"/>
+ <method name="cos(D)D"/>
+ <method name="cosh(D)D"/>
+ <method name="decrementExact(I)I" since="24"/>
+ <method name="decrementExact(J)J" since="24"/>
+ <method name="exp(D)D"/>
+ <method name="expm1(D)D"/>
+ <method name="floor(D)D"/>
+ <method name="floorDiv(II)I" since="24"/>
+ <method name="floorDiv(JJ)J" since="24"/>
+ <method name="floorMod(II)I" since="24"/>
+ <method name="floorMod(JJ)J" since="24"/>
+ <method name="getExponent(D)I" since="9"/>
+ <method name="getExponent(F)I" since="9"/>
+ <method name="hypot(DD)D"/>
+ <method name="incrementExact(I)I" since="24"/>
+ <method name="incrementExact(J)J" since="24"/>
+ <method name="log(D)D"/>
+ <method name="log10(D)D"/>
+ <method name="log1p(D)D"/>
+ <method name="max(DD)D"/>
+ <method name="max(FF)F"/>
+ <method name="max(II)I"/>
+ <method name="max(JJ)J"/>
+ <method name="min(DD)D"/>
+ <method name="min(FF)F"/>
+ <method name="min(II)I"/>
+ <method name="min(JJ)J"/>
+ <method name="multiplyExact(II)I" since="24"/>
+ <method name="multiplyExact(JJ)J" since="24"/>
+ <method name="negateExact(I)I" since="24"/>
+ <method name="negateExact(J)J" since="24"/>
+ <method name="nextAfter(DD)D" since="9"/>
+ <method name="nextAfter(FD)F" since="9"/>
+ <method name="nextDown(D)D" since="24"/>
+ <method name="nextDown(F)F" since="24"/>
+ <method name="nextUp(D)D" since="9"/>
+ <method name="nextUp(F)F" since="9"/>
+ <method name="pow(DD)D"/>
+ <method name="random()D"/>
+ <method name="rint(D)D"/>
+ <method name="round(D)J"/>
+ <method name="round(F)I"/>
+ <method name="scalb(DI)D" since="9"/>
+ <method name="scalb(FI)F" since="9"/>
+ <method name="signum(D)D"/>
+ <method name="signum(F)F"/>
+ <method name="sin(D)D"/>
+ <method name="sinh(D)D"/>
+ <method name="sqrt(D)D"/>
+ <method name="subtractExact(II)I" since="24"/>
+ <method name="subtractExact(JJ)J" since="24"/>
+ <method name="tan(D)D"/>
+ <method name="tanh(D)D"/>
+ <method name="toDegrees(D)D"/>
+ <method name="toIntExact(J)I" since="24"/>
+ <method name="toRadians(D)D"/>
+ <method name="ulp(D)D"/>
+ <method name="ulp(F)F"/>
+ <field name="E"/>
+ <field name="PI"/>
+ </class>
+ <class name="java/lang/NegativeArraySizeException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/NoClassDefFoundError" since="1">
+ <extends name="java/lang/LinkageError"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/NoSuchFieldError" since="1">
+ <extends name="java/lang/IncompatibleClassChangeError"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/NoSuchFieldException" since="1">
+ <extends name="java/lang/Exception" removed="19"/>
+ <extends name="java/lang/ReflectiveOperationException" since="19"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/NoSuchMethodError" since="1">
+ <extends name="java/lang/IncompatibleClassChangeError"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/NoSuchMethodException" since="1">
+ <extends name="java/lang/Exception" removed="19"/>
+ <extends name="java/lang/ReflectiveOperationException" since="19"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/NullPointerException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/Number" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="byteValue()B"/>
+ <method name="doubleValue()D"/>
+ <method name="floatValue()F"/>
+ <method name="intValue()I"/>
+ <method name="longValue()J"/>
+ <method name="shortValue()S"/>
+ </class>
+ <class name="java/lang/NumberFormatException" since="1">
+ <extends name="java/lang/IllegalArgumentException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/Object" since="1">
+ <method name="&lt;init>()V"/>
+ <method name="clone()Ljava/lang/Object;"/>
+ <method name="equals(Ljava/lang/Object;)Z"/>
+ <method name="finalize()V"/>
+ <method name="getClass()Ljava/lang/Class;"/>
+ <method name="hashCode()I"/>
+ <method name="notify()V"/>
+ <method name="notifyAll()V"/>
+ <method name="toString()Ljava/lang/String;"/>
+ <method name="wait()V"/>
+ <method name="wait(J)V"/>
+ <method name="wait(JI)V"/>
+ </class>
+ <class name="java/lang/OutOfMemoryError" since="1">
+ <extends name="java/lang/VirtualMachineError"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/Override" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ </class>
+ <class name="java/lang/Package" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/reflect/AnnotatedElement"/>
+ <method name="&lt;init>()V"/>
+ <method name="getImplementationTitle()Ljava/lang/String;"/>
+ <method name="getImplementationVendor()Ljava/lang/String;"/>
+ <method name="getImplementationVersion()Ljava/lang/String;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getPackage(Ljava/lang/String;)Ljava/lang/Package;"/>
+ <method name="getPackages()[Ljava/lang/Package;"/>
+ <method name="getSpecificationTitle()Ljava/lang/String;"/>
+ <method name="getSpecificationVendor()Ljava/lang/String;"/>
+ <method name="getSpecificationVersion()Ljava/lang/String;"/>
+ <method name="isCompatibleWith(Ljava/lang/String;)Z"/>
+ <method name="isSealed()Z"/>
+ <method name="isSealed(Ljava/net/URL;)Z"/>
+ </class>
+ <class name="java/lang/Process" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="destroy()V"/>
+ <method name="destroyForcibly()Ljava/lang/Process;" since="26"/>
+ <method name="exitValue()I"/>
+ <method name="getErrorStream()Ljava/io/InputStream;"/>
+ <method name="getInputStream()Ljava/io/InputStream;"/>
+ <method name="getOutputStream()Ljava/io/OutputStream;"/>
+ <method name="isAlive()Z" since="26"/>
+ <method name="waitFor()I"/>
+ <method name="waitFor(JLjava/util/concurrent/TimeUnit;)Z" since="26"/>
+ </class>
+ <class name="java/lang/ProcessBuilder" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/util/List;)V"/>
+ <method name="&lt;init>([Ljava/lang/String;)V"/>
+ <method name="command()Ljava/util/List;"/>
+ <method name="command(Ljava/util/List;)Ljava/lang/ProcessBuilder;"/>
+ <method name="command([Ljava/lang/String;)Ljava/lang/ProcessBuilder;"/>
+ <method name="directory()Ljava/io/File;"/>
+ <method name="directory(Ljava/io/File;)Ljava/lang/ProcessBuilder;"/>
+ <method name="environment()Ljava/util/Map;"/>
+ <method name="inheritIO()Ljava/lang/ProcessBuilder;" since="26"/>
+ <method name="redirectError()Ljava/lang/ProcessBuilder$Redirect;" since="26"/>
+ <method name="redirectError(Ljava/io/File;)Ljava/lang/ProcessBuilder;" since="26"/>
+ <method name="redirectError(Ljava/lang/ProcessBuilder$Redirect;)Ljava/lang/ProcessBuilder;" since="26"/>
+ <method name="redirectErrorStream()Z"/>
+ <method name="redirectErrorStream(Z)Ljava/lang/ProcessBuilder;"/>
+ <method name="redirectInput()Ljava/lang/ProcessBuilder$Redirect;" since="26"/>
+ <method name="redirectInput(Ljava/io/File;)Ljava/lang/ProcessBuilder;" since="26"/>
+ <method name="redirectInput(Ljava/lang/ProcessBuilder$Redirect;)Ljava/lang/ProcessBuilder;" since="26"/>
+ <method name="redirectOutput()Ljava/lang/ProcessBuilder$Redirect;" since="26"/>
+ <method name="redirectOutput(Ljava/io/File;)Ljava/lang/ProcessBuilder;" since="26"/>
+ <method name="redirectOutput(Ljava/lang/ProcessBuilder$Redirect;)Ljava/lang/ProcessBuilder;" since="26"/>
+ <method name="start()Ljava/lang/Process;"/>
+ </class>
+ <class name="java/lang/ProcessBuilder$Redirect" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="appendTo(Ljava/io/File;)Ljava/lang/ProcessBuilder$Redirect;"/>
+ <method name="file()Ljava/io/File;"/>
+ <method name="from(Ljava/io/File;)Ljava/lang/ProcessBuilder$Redirect;"/>
+ <method name="to(Ljava/io/File;)Ljava/lang/ProcessBuilder$Redirect;"/>
+ <method name="type()Ljava/lang/ProcessBuilder$Redirect$Type;"/>
+ <field name="INHERIT"/>
+ <field name="PIPE"/>
+ </class>
+ <class name="java/lang/ProcessBuilder$Redirect$Type" since="26">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/lang/ProcessBuilder$Redirect$Type;"/>
+ <method name="values()[Ljava/lang/ProcessBuilder$Redirect$Type;"/>
+ <field name="APPEND"/>
+ <field name="INHERIT"/>
+ <field name="PIPE"/>
+ <field name="READ"/>
+ <field name="WRITE"/>
+ </class>
+ <class name="java/lang/Readable" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="read(Ljava/nio/CharBuffer;)I"/>
+ </class>
+ <class name="java/lang/ReflectiveOperationException" since="19">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/lang/Runnable" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="run()V"/>
+ </class>
+ <class name="java/lang/Runtime" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addShutdownHook(Ljava/lang/Thread;)V"/>
+ <method name="availableProcessors()I"/>
+ <method name="exec(Ljava/lang/String;)Ljava/lang/Process;"/>
+ <method name="exec(Ljava/lang/String;[Ljava/lang/String;)Ljava/lang/Process;"/>
+ <method name="exec(Ljava/lang/String;[Ljava/lang/String;Ljava/io/File;)Ljava/lang/Process;"/>
+ <method name="exec([Ljava/lang/String;)Ljava/lang/Process;"/>
+ <method name="exec([Ljava/lang/String;[Ljava/lang/String;)Ljava/lang/Process;"/>
+ <method name="exec([Ljava/lang/String;[Ljava/lang/String;Ljava/io/File;)Ljava/lang/Process;"/>
+ <method name="exit(I)V"/>
+ <method name="freeMemory()J"/>
+ <method name="gc()V"/>
+ <method name="getLocalizedInputStream(Ljava/io/InputStream;)Ljava/io/InputStream;" deprecated="16"/>
+ <method name="getLocalizedOutputStream(Ljava/io/OutputStream;)Ljava/io/OutputStream;" deprecated="16"/>
+ <method name="getRuntime()Ljava/lang/Runtime;"/>
+ <method name="halt(I)V"/>
+ <method name="load(Ljava/lang/String;)V"/>
+ <method name="loadLibrary(Ljava/lang/String;)V"/>
+ <method name="maxMemory()J"/>
+ <method name="removeShutdownHook(Ljava/lang/Thread;)Z"/>
+ <method name="runFinalization()V"/>
+ <method name="runFinalizersOnExit(Z)V" deprecated="16"/>
+ <method name="totalMemory()J"/>
+ <method name="traceInstructions(Z)V"/>
+ <method name="traceMethodCalls(Z)V"/>
+ </class>
+ <class name="java/lang/RuntimeException" since="1">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;ZZ)V" since="24"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/lang/RuntimePermission" since="1">
+ <extends name="java/security/BasicPermission"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/SafeVarargs" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ </class>
+ <class name="java/lang/SecurityException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/lang/SecurityManager" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="checkAccept(Ljava/lang/String;I)V"/>
+ <method name="checkAccess(Ljava/lang/Thread;)V"/>
+ <method name="checkAccess(Ljava/lang/ThreadGroup;)V"/>
+ <method name="checkAwtEventQueueAccess()V"/>
+ <method name="checkConnect(Ljava/lang/String;I)V"/>
+ <method name="checkConnect(Ljava/lang/String;ILjava/lang/Object;)V"/>
+ <method name="checkCreateClassLoader()V"/>
+ <method name="checkDelete(Ljava/lang/String;)V"/>
+ <method name="checkExec(Ljava/lang/String;)V"/>
+ <method name="checkExit(I)V"/>
+ <method name="checkLink(Ljava/lang/String;)V"/>
+ <method name="checkListen(I)V"/>
+ <method name="checkMemberAccess(Ljava/lang/Class;I)V"/>
+ <method name="checkMulticast(Ljava/net/InetAddress;)V"/>
+ <method name="checkMulticast(Ljava/net/InetAddress;B)V" deprecated="16"/>
+ <method name="checkPackageAccess(Ljava/lang/String;)V"/>
+ <method name="checkPackageDefinition(Ljava/lang/String;)V"/>
+ <method name="checkPermission(Ljava/security/Permission;)V"/>
+ <method name="checkPermission(Ljava/security/Permission;Ljava/lang/Object;)V"/>
+ <method name="checkPrintJobAccess()V"/>
+ <method name="checkPropertiesAccess()V"/>
+ <method name="checkPropertyAccess(Ljava/lang/String;)V"/>
+ <method name="checkRead(Ljava/io/FileDescriptor;)V"/>
+ <method name="checkRead(Ljava/lang/String;)V"/>
+ <method name="checkRead(Ljava/lang/String;Ljava/lang/Object;)V"/>
+ <method name="checkSecurityAccess(Ljava/lang/String;)V"/>
+ <method name="checkSetFactory()V"/>
+ <method name="checkSystemClipboardAccess()V"/>
+ <method name="checkTopLevelWindow(Ljava/lang/Object;)Z"/>
+ <method name="checkWrite(Ljava/io/FileDescriptor;)V"/>
+ <method name="checkWrite(Ljava/lang/String;)V"/>
+ <method name="classDepth(Ljava/lang/String;)I" deprecated="16"/>
+ <method name="classLoaderDepth()I" deprecated="16"/>
+ <method name="currentClassLoader()Ljava/lang/ClassLoader;" deprecated="16"/>
+ <method name="currentLoadedClass()Ljava/lang/Class;" deprecated="16"/>
+ <method name="getClassContext()[Ljava/lang/Class;"/>
+ <method name="getInCheck()Z" deprecated="16"/>
+ <method name="getSecurityContext()Ljava/lang/Object;"/>
+ <method name="getThreadGroup()Ljava/lang/ThreadGroup;"/>
+ <method name="inClass(Ljava/lang/String;)Z" deprecated="16"/>
+ <method name="inClassLoader()Z" deprecated="16"/>
+ <field name="inCheck" deprecated="16"/>
+ </class>
+ <class name="java/lang/Short" since="1">
+ <extends name="java/lang/Number"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(S)V"/>
+ <method name="compare(SS)I" since="19"/>
+ <method name="compareTo(Ljava/lang/Short;)I"/>
+ <method name="decode(Ljava/lang/String;)Ljava/lang/Short;"/>
+ <method name="hashCode(S)I" since="24"/>
+ <method name="parseShort(Ljava/lang/String;)S"/>
+ <method name="parseShort(Ljava/lang/String;I)S"/>
+ <method name="reverseBytes(S)S"/>
+ <method name="toString(S)Ljava/lang/String;"/>
+ <method name="toUnsignedInt(S)I" since="26"/>
+ <method name="toUnsignedLong(S)J" since="26"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/lang/Short;"/>
+ <method name="valueOf(Ljava/lang/String;I)Ljava/lang/Short;"/>
+ <method name="valueOf(S)Ljava/lang/Short;"/>
+ <field name="BYTES" since="24"/>
+ <field name="MAX_VALUE"/>
+ <field name="MIN_VALUE"/>
+ <field name="SIZE"/>
+ <field name="TYPE"/>
+ </class>
+ <class name="java/lang/StackOverflowError" since="1">
+ <extends name="java/lang/VirtualMachineError"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/StackTraceElement" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V"/>
+ <method name="getClassName()Ljava/lang/String;"/>
+ <method name="getFileName()Ljava/lang/String;"/>
+ <method name="getLineNumber()I"/>
+ <method name="getMethodName()Ljava/lang/String;"/>
+ <method name="isNativeMethod()Z"/>
+ </class>
+ <class name="java/lang/StrictMath" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="IEEEremainder(DD)D"/>
+ <method name="abs(D)D"/>
+ <method name="abs(F)F"/>
+ <method name="abs(I)I"/>
+ <method name="abs(J)J"/>
+ <method name="acos(D)D"/>
+ <method name="addExact(II)I" since="24"/>
+ <method name="addExact(JJ)J" since="24"/>
+ <method name="asin(D)D"/>
+ <method name="atan(D)D"/>
+ <method name="atan2(DD)D"/>
+ <method name="cbrt(D)D"/>
+ <method name="ceil(D)D"/>
+ <method name="copySign(DD)D" since="9"/>
+ <method name="copySign(FF)F" since="9"/>
+ <method name="cos(D)D"/>
+ <method name="cosh(D)D"/>
+ <method name="exp(D)D"/>
+ <method name="expm1(D)D"/>
+ <method name="floor(D)D"/>
+ <method name="floorDiv(II)I" since="24"/>
+ <method name="floorDiv(JJ)J" since="24"/>
+ <method name="floorMod(II)I" since="24"/>
+ <method name="floorMod(JJ)J" since="24"/>
+ <method name="getExponent(D)I" since="9"/>
+ <method name="getExponent(F)I" since="9"/>
+ <method name="hypot(DD)D"/>
+ <method name="log(D)D"/>
+ <method name="log10(D)D"/>
+ <method name="log1p(D)D"/>
+ <method name="max(DD)D"/>
+ <method name="max(FF)F"/>
+ <method name="max(II)I"/>
+ <method name="max(JJ)J"/>
+ <method name="min(DD)D"/>
+ <method name="min(FF)F"/>
+ <method name="min(II)I"/>
+ <method name="min(JJ)J"/>
+ <method name="multiplyExact(II)I" since="24"/>
+ <method name="multiplyExact(JJ)J" since="24"/>
+ <method name="nextAfter(DD)D" since="9"/>
+ <method name="nextAfter(FD)F" since="9"/>
+ <method name="nextDown(D)D" since="24"/>
+ <method name="nextDown(F)F" since="24"/>
+ <method name="nextUp(D)D" since="9"/>
+ <method name="nextUp(F)F" since="9"/>
+ <method name="pow(DD)D"/>
+ <method name="random()D"/>
+ <method name="rint(D)D"/>
+ <method name="round(D)J"/>
+ <method name="round(F)I"/>
+ <method name="scalb(DI)D" since="9"/>
+ <method name="scalb(FI)F" since="9"/>
+ <method name="signum(D)D"/>
+ <method name="signum(F)F"/>
+ <method name="sin(D)D"/>
+ <method name="sinh(D)D"/>
+ <method name="sqrt(D)D"/>
+ <method name="subtractExact(II)I" since="24"/>
+ <method name="subtractExact(JJ)J" since="24"/>
+ <method name="tan(D)D"/>
+ <method name="tanh(D)D"/>
+ <method name="toDegrees(D)D"/>
+ <method name="toIntExact(J)I" since="24"/>
+ <method name="toRadians(D)D"/>
+ <method name="ulp(D)D"/>
+ <method name="ulp(F)F"/>
+ <field name="E"/>
+ <field name="PI"/>
+ </class>
+ <class name="java/lang/String" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/CharSequence"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/StringBuffer;)V"/>
+ <method name="&lt;init>(Ljava/lang/StringBuilder;)V"/>
+ <method name="&lt;init>([B)V"/>
+ <method name="&lt;init>([BI)V" deprecated="16"/>
+ <method name="&lt;init>([BII)V"/>
+ <method name="&lt;init>([BIII)V" deprecated="16"/>
+ <method name="&lt;init>([BIILjava/lang/String;)V"/>
+ <method name="&lt;init>([BIILjava/nio/charset/Charset;)V" since="9"/>
+ <method name="&lt;init>([BLjava/lang/String;)V"/>
+ <method name="&lt;init>([BLjava/nio/charset/Charset;)V" since="9"/>
+ <method name="&lt;init>([C)V"/>
+ <method name="&lt;init>([CII)V"/>
+ <method name="&lt;init>([III)V"/>
+ <method name="codePointAt(I)I"/>
+ <method name="codePointBefore(I)I"/>
+ <method name="codePointCount(II)I"/>
+ <method name="compareTo(Ljava/lang/String;)I"/>
+ <method name="compareToIgnoreCase(Ljava/lang/String;)I"/>
+ <method name="concat(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="contains(Ljava/lang/CharSequence;)Z"/>
+ <method name="contentEquals(Ljava/lang/CharSequence;)Z"/>
+ <method name="contentEquals(Ljava/lang/StringBuffer;)Z"/>
+ <method name="copyValueOf([C)Ljava/lang/String;"/>
+ <method name="copyValueOf([CII)Ljava/lang/String;"/>
+ <method name="endsWith(Ljava/lang/String;)Z"/>
+ <method name="equalsIgnoreCase(Ljava/lang/String;)Z"/>
+ <method name="format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;"/>
+ <method name="format(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;"/>
+ <method name="getBytes()[B"/>
+ <method name="getBytes(II[BI)V" deprecated="16"/>
+ <method name="getBytes(Ljava/lang/String;)[B"/>
+ <method name="getBytes(Ljava/nio/charset/Charset;)[B" since="9"/>
+ <method name="getChars(II[CI)V"/>
+ <method name="indexOf(I)I"/>
+ <method name="indexOf(II)I"/>
+ <method name="indexOf(Ljava/lang/String;)I"/>
+ <method name="indexOf(Ljava/lang/String;I)I"/>
+ <method name="intern()Ljava/lang/String;"/>
+ <method name="isEmpty()Z" since="9"/>
+ <method name="join(Ljava/lang/CharSequence;Ljava/lang/Iterable;)Ljava/lang/String;" since="26"/>
+ <method name="join(Ljava/lang/CharSequence;[Ljava/lang/CharSequence;)Ljava/lang/String;" since="26"/>
+ <method name="lastIndexOf(I)I"/>
+ <method name="lastIndexOf(II)I"/>
+ <method name="lastIndexOf(Ljava/lang/String;)I"/>
+ <method name="lastIndexOf(Ljava/lang/String;I)I"/>
+ <method name="matches(Ljava/lang/String;)Z"/>
+ <method name="offsetByCodePoints(II)I"/>
+ <method name="regionMatches(ILjava/lang/String;II)Z"/>
+ <method name="regionMatches(ZILjava/lang/String;II)Z"/>
+ <method name="replace(CC)Ljava/lang/String;"/>
+ <method name="replace(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String;"/>
+ <method name="replaceAll(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="replaceFirst(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="split(Ljava/lang/String;)[Ljava/lang/String;"/>
+ <method name="split(Ljava/lang/String;I)[Ljava/lang/String;"/>
+ <method name="startsWith(Ljava/lang/String;)Z"/>
+ <method name="startsWith(Ljava/lang/String;I)Z"/>
+ <method name="substring(I)Ljava/lang/String;"/>
+ <method name="substring(II)Ljava/lang/String;"/>
+ <method name="toCharArray()[C"/>
+ <method name="toLowerCase()Ljava/lang/String;"/>
+ <method name="toLowerCase(Ljava/util/Locale;)Ljava/lang/String;"/>
+ <method name="toUpperCase()Ljava/lang/String;"/>
+ <method name="toUpperCase(Ljava/util/Locale;)Ljava/lang/String;"/>
+ <method name="trim()Ljava/lang/String;"/>
+ <method name="valueOf(C)Ljava/lang/String;"/>
+ <method name="valueOf(D)Ljava/lang/String;"/>
+ <method name="valueOf(F)Ljava/lang/String;"/>
+ <method name="valueOf(I)Ljava/lang/String;"/>
+ <method name="valueOf(J)Ljava/lang/String;"/>
+ <method name="valueOf(Ljava/lang/Object;)Ljava/lang/String;"/>
+ <method name="valueOf(Z)Ljava/lang/String;"/>
+ <method name="valueOf([C)Ljava/lang/String;"/>
+ <method name="valueOf([CII)Ljava/lang/String;"/>
+ <field name="CASE_INSENSITIVE_ORDER"/>
+ </class>
+ <class name="java/lang/StringBuffer" since="1">
+ <extends name="java/lang/AbstractStringBuilder"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Appendable" removed="26"/>
+ <implements name="java/lang/CharSequence"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="append(C)Ljava/lang/StringBuffer;"/>
+ <method name="append(D)Ljava/lang/StringBuffer;"/>
+ <method name="append(F)Ljava/lang/StringBuffer;"/>
+ <method name="append(I)Ljava/lang/StringBuffer;"/>
+ <method name="append(J)Ljava/lang/StringBuffer;"/>
+ <method name="append(Ljava/lang/CharSequence;)Ljava/lang/StringBuffer;"/>
+ <method name="append(Ljava/lang/CharSequence;II)Ljava/lang/StringBuffer;"/>
+ <method name="append(Ljava/lang/Object;)Ljava/lang/StringBuffer;"/>
+ <method name="append(Ljava/lang/String;)Ljava/lang/StringBuffer;"/>
+ <method name="append(Ljava/lang/StringBuffer;)Ljava/lang/StringBuffer;"/>
+ <method name="append(Z)Ljava/lang/StringBuffer;"/>
+ <method name="append([C)Ljava/lang/StringBuffer;"/>
+ <method name="append([CII)Ljava/lang/StringBuffer;"/>
+ <method name="appendCodePoint(I)Ljava/lang/StringBuffer;"/>
+ <method name="delete(II)Ljava/lang/StringBuffer;"/>
+ <method name="deleteCharAt(I)Ljava/lang/StringBuffer;"/>
+ <method name="insert(IC)Ljava/lang/StringBuffer;"/>
+ <method name="insert(ID)Ljava/lang/StringBuffer;"/>
+ <method name="insert(IF)Ljava/lang/StringBuffer;"/>
+ <method name="insert(II)Ljava/lang/StringBuffer;"/>
+ <method name="insert(IJ)Ljava/lang/StringBuffer;"/>
+ <method name="insert(ILjava/lang/CharSequence;)Ljava/lang/StringBuffer;"/>
+ <method name="insert(ILjava/lang/CharSequence;II)Ljava/lang/StringBuffer;"/>
+ <method name="insert(ILjava/lang/Object;)Ljava/lang/StringBuffer;"/>
+ <method name="insert(ILjava/lang/String;)Ljava/lang/StringBuffer;"/>
+ <method name="insert(IZ)Ljava/lang/StringBuffer;"/>
+ <method name="insert(I[C)Ljava/lang/StringBuffer;"/>
+ <method name="insert(I[CII)Ljava/lang/StringBuffer;"/>
+ <method name="replace(IILjava/lang/String;)Ljava/lang/StringBuffer;"/>
+ <method name="reverse()Ljava/lang/StringBuffer;"/>
+ </class>
+ <class name="java/lang/StringBuilder" since="1">
+ <extends name="java/lang/AbstractStringBuilder"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Appendable" removed="26"/>
+ <implements name="java/lang/CharSequence"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="append(C)Ljava/lang/StringBuilder;"/>
+ <method name="append(D)Ljava/lang/StringBuilder;"/>
+ <method name="append(F)Ljava/lang/StringBuilder;"/>
+ <method name="append(I)Ljava/lang/StringBuilder;"/>
+ <method name="append(J)Ljava/lang/StringBuilder;"/>
+ <method name="append(Ljava/lang/CharSequence;)Ljava/lang/StringBuilder;"/>
+ <method name="append(Ljava/lang/CharSequence;II)Ljava/lang/StringBuilder;"/>
+ <method name="append(Ljava/lang/Object;)Ljava/lang/StringBuilder;"/>
+ <method name="append(Ljava/lang/String;)Ljava/lang/StringBuilder;"/>
+ <method name="append(Ljava/lang/StringBuffer;)Ljava/lang/StringBuilder;"/>
+ <method name="append(Z)Ljava/lang/StringBuilder;"/>
+ <method name="append([C)Ljava/lang/StringBuilder;"/>
+ <method name="append([CII)Ljava/lang/StringBuilder;"/>
+ <method name="appendCodePoint(I)Ljava/lang/StringBuilder;"/>
+ <method name="delete(II)Ljava/lang/StringBuilder;"/>
+ <method name="deleteCharAt(I)Ljava/lang/StringBuilder;"/>
+ <method name="insert(IC)Ljava/lang/StringBuilder;"/>
+ <method name="insert(ID)Ljava/lang/StringBuilder;"/>
+ <method name="insert(IF)Ljava/lang/StringBuilder;"/>
+ <method name="insert(II)Ljava/lang/StringBuilder;"/>
+ <method name="insert(IJ)Ljava/lang/StringBuilder;"/>
+ <method name="insert(ILjava/lang/CharSequence;)Ljava/lang/StringBuilder;"/>
+ <method name="insert(ILjava/lang/CharSequence;II)Ljava/lang/StringBuilder;"/>
+ <method name="insert(ILjava/lang/Object;)Ljava/lang/StringBuilder;"/>
+ <method name="insert(ILjava/lang/String;)Ljava/lang/StringBuilder;"/>
+ <method name="insert(IZ)Ljava/lang/StringBuilder;"/>
+ <method name="insert(I[C)Ljava/lang/StringBuilder;"/>
+ <method name="insert(I[CII)Ljava/lang/StringBuilder;"/>
+ <method name="replace(IILjava/lang/String;)Ljava/lang/StringBuilder;"/>
+ <method name="reverse()Ljava/lang/StringBuilder;"/>
+ </class>
+ <class name="java/lang/StringIndexOutOfBoundsException" since="1">
+ <extends name="java/lang/IndexOutOfBoundsException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/SuppressWarnings" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ <method name="value()[Ljava/lang/String;"/>
+ </class>
+ <class name="java/lang/System" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V"/>
+ <method name="clearProperty(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="console()Ljava/io/Console;" since="9"/>
+ <method name="currentTimeMillis()J"/>
+ <method name="exit(I)V"/>
+ <method name="gc()V"/>
+ <method name="getProperties()Ljava/util/Properties;"/>
+ <method name="getProperty(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getSecurityManager()Ljava/lang/SecurityManager;"/>
+ <method name="getenv()Ljava/util/Map;"/>
+ <method name="getenv(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="identityHashCode(Ljava/lang/Object;)I"/>
+ <method name="inheritedChannel()Ljava/nio/channels/Channel;"/>
+ <method name="lineSeparator()Ljava/lang/String;" since="19"/>
+ <method name="load(Ljava/lang/String;)V"/>
+ <method name="loadLibrary(Ljava/lang/String;)V"/>
+ <method name="mapLibraryName(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="nanoTime()J"/>
+ <method name="runFinalization()V"/>
+ <method name="runFinalizersOnExit(Z)V" deprecated="16"/>
+ <method name="setErr(Ljava/io/PrintStream;)V"/>
+ <method name="setIn(Ljava/io/InputStream;)V"/>
+ <method name="setOut(Ljava/io/PrintStream;)V"/>
+ <method name="setProperties(Ljava/util/Properties;)V"/>
+ <method name="setProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="setSecurityManager(Ljava/lang/SecurityManager;)V"/>
+ <field name="err"/>
+ <field name="in"/>
+ <field name="out"/>
+ </class>
+ <class name="java/lang/Thread" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Runnable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/Runnable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Runnable;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/ThreadGroup;Ljava/lang/Runnable;)V"/>
+ <method name="&lt;init>(Ljava/lang/ThreadGroup;Ljava/lang/Runnable;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/ThreadGroup;Ljava/lang/Runnable;Ljava/lang/String;J)V"/>
+ <method name="&lt;init>(Ljava/lang/ThreadGroup;Ljava/lang/String;)V"/>
+ <method name="activeCount()I"/>
+ <method name="checkAccess()V"/>
+ <method name="countStackFrames()I" deprecated="16"/>
+ <method name="currentThread()Ljava/lang/Thread;"/>
+ <method name="destroy()V" deprecated="16"/>
+ <method name="dumpStack()V"/>
+ <method name="enumerate([Ljava/lang/Thread;)I"/>
+ <method name="getAllStackTraces()Ljava/util/Map;"/>
+ <method name="getContextClassLoader()Ljava/lang/ClassLoader;"/>
+ <method name="getDefaultUncaughtExceptionHandler()Ljava/lang/Thread$UncaughtExceptionHandler;"/>
+ <method name="getId()J"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getPriority()I"/>
+ <method name="getStackTrace()[Ljava/lang/StackTraceElement;"/>
+ <method name="getState()Ljava/lang/Thread$State;"/>
+ <method name="getThreadGroup()Ljava/lang/ThreadGroup;"/>
+ <method name="getUncaughtExceptionHandler()Ljava/lang/Thread$UncaughtExceptionHandler;"/>
+ <method name="holdsLock(Ljava/lang/Object;)Z"/>
+ <method name="interrupt()V"/>
+ <method name="interrupted()Z"/>
+ <method name="isAlive()Z"/>
+ <method name="isDaemon()Z"/>
+ <method name="isInterrupted()Z"/>
+ <method name="join()V"/>
+ <method name="join(J)V"/>
+ <method name="join(JI)V"/>
+ <method name="resume()V" deprecated="16"/>
+ <method name="setContextClassLoader(Ljava/lang/ClassLoader;)V"/>
+ <method name="setDaemon(Z)V"/>
+ <method name="setDefaultUncaughtExceptionHandler(Ljava/lang/Thread$UncaughtExceptionHandler;)V"/>
+ <method name="setName(Ljava/lang/String;)V"/>
+ <method name="setPriority(I)V"/>
+ <method name="setUncaughtExceptionHandler(Ljava/lang/Thread$UncaughtExceptionHandler;)V"/>
+ <method name="sleep(J)V"/>
+ <method name="sleep(JI)V"/>
+ <method name="start()V"/>
+ <method name="stop()V" deprecated="16"/>
+ <method name="stop(Ljava/lang/Throwable;)V" deprecated="16"/>
+ <method name="suspend()V" deprecated="16"/>
+ <method name="yield()V"/>
+ <field name="MAX_PRIORITY"/>
+ <field name="MIN_PRIORITY"/>
+ <field name="NORM_PRIORITY"/>
+ </class>
+ <class name="java/lang/Thread$State" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/lang/Thread$State;"/>
+ <method name="values()[Ljava/lang/Thread$State;"/>
+ <field name="BLOCKED"/>
+ <field name="NEW"/>
+ <field name="RUNNABLE"/>
+ <field name="TERMINATED"/>
+ <field name="TIMED_WAITING"/>
+ <field name="WAITING"/>
+ </class>
+ <class name="java/lang/Thread$UncaughtExceptionHandler" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="uncaughtException(Ljava/lang/Thread;Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/lang/ThreadDeath" since="1">
+ <extends name="java/lang/Error"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/lang/ThreadGroup" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Thread$UncaughtExceptionHandler"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/ThreadGroup;Ljava/lang/String;)V"/>
+ <method name="activeCount()I"/>
+ <method name="activeGroupCount()I"/>
+ <method name="allowThreadSuspension(Z)Z" deprecated="16"/>
+ <method name="checkAccess()V"/>
+ <method name="destroy()V"/>
+ <method name="enumerate([Ljava/lang/Thread;)I"/>
+ <method name="enumerate([Ljava/lang/Thread;Z)I"/>
+ <method name="enumerate([Ljava/lang/ThreadGroup;)I"/>
+ <method name="enumerate([Ljava/lang/ThreadGroup;Z)I"/>
+ <method name="getMaxPriority()I"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getParent()Ljava/lang/ThreadGroup;"/>
+ <method name="interrupt()V"/>
+ <method name="isDaemon()Z"/>
+ <method name="isDestroyed()Z"/>
+ <method name="list()V"/>
+ <method name="parentOf(Ljava/lang/ThreadGroup;)Z"/>
+ <method name="resume()V" deprecated="16"/>
+ <method name="setDaemon(Z)V"/>
+ <method name="setMaxPriority(I)V"/>
+ <method name="stop()V" deprecated="16"/>
+ <method name="suspend()V" deprecated="16"/>
+ </class>
+ <class name="java/lang/ThreadLocal" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="get()Ljava/lang/Object;"/>
+ <method name="initialValue()Ljava/lang/Object;"/>
+ <method name="remove()V"/>
+ <method name="set(Ljava/lang/Object;)V"/>
+ <method name="withInitial(Ljava/util/function/Supplier;)Ljava/lang/ThreadLocal;" since="26"/>
+ </class>
+ <class name="java/lang/Throwable" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;ZZ)V" since="19"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ <method name="addSuppressed(Ljava/lang/Throwable;)V" since="19"/>
+ <method name="fillInStackTrace()Ljava/lang/Throwable;"/>
+ <method name="getCause()Ljava/lang/Throwable;"/>
+ <method name="getLocalizedMessage()Ljava/lang/String;"/>
+ <method name="getMessage()Ljava/lang/String;"/>
+ <method name="getStackTrace()[Ljava/lang/StackTraceElement;"/>
+ <method name="getSuppressed()[Ljava/lang/Throwable;" since="19"/>
+ <method name="initCause(Ljava/lang/Throwable;)Ljava/lang/Throwable;"/>
+ <method name="printStackTrace()V"/>
+ <method name="printStackTrace(Ljava/io/PrintStream;)V"/>
+ <method name="printStackTrace(Ljava/io/PrintWriter;)V"/>
+ <method name="setStackTrace([Ljava/lang/StackTraceElement;)V"/>
+ </class>
+ <class name="java/lang/TypeNotPresentException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="typeName()Ljava/lang/String;"/>
+ </class>
+ <class name="java/lang/UnknownError" since="1">
+ <extends name="java/lang/VirtualMachineError"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/UnsatisfiedLinkError" since="1">
+ <extends name="java/lang/LinkageError"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/UnsupportedClassVersionError" since="1">
+ <extends name="java/lang/ClassFormatError"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/UnsupportedOperationException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/lang/VerifyError" since="1">
+ <extends name="java/lang/LinkageError"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/VirtualMachineError" since="1">
+ <extends name="java/lang/Error"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" since="24"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" since="24"/>
+ </class>
+ <class name="java/lang/Void" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="TYPE"/>
+ </class>
+ <class name="java/lang/annotation/Annotation" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="annotationType()Ljava/lang/Class;"/>
+ </class>
+ <class name="java/lang/annotation/AnnotationFormatError" since="1">
+ <extends name="java/lang/Error"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/lang/annotation/AnnotationTypeMismatchException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>(Ljava/lang/reflect/Method;Ljava/lang/String;)V"/>
+ <method name="element()Ljava/lang/reflect/Method;"/>
+ <method name="foundType()Ljava/lang/String;"/>
+ </class>
+ <class name="java/lang/annotation/Documented" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ </class>
+ <class name="java/lang/annotation/ElementType" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/lang/annotation/ElementType;"/>
+ <method name="values()[Ljava/lang/annotation/ElementType;"/>
+ <field name="ANNOTATION_TYPE"/>
+ <field name="CONSTRUCTOR"/>
+ <field name="FIELD"/>
+ <field name="LOCAL_VARIABLE"/>
+ <field name="METHOD"/>
+ <field name="PACKAGE"/>
+ <field name="PARAMETER"/>
+ <field name="TYPE"/>
+ <field name="TYPE_PARAMETER" since="26"/>
+ <field name="TYPE_USE" since="26"/>
+ </class>
+ <class name="java/lang/annotation/IncompleteAnnotationException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>(Ljava/lang/Class;Ljava/lang/String;)V"/>
+ <method name="annotationType()Ljava/lang/Class;"/>
+ <method name="elementName()Ljava/lang/String;"/>
+ </class>
+ <class name="java/lang/annotation/Inherited" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ </class>
+ <class name="java/lang/annotation/Native" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ </class>
+ <class name="java/lang/annotation/Repeatable" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ <method name="value()Ljava/lang/Class;"/>
+ </class>
+ <class name="java/lang/annotation/Retention" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ <method name="value()Ljava/lang/annotation/RetentionPolicy;"/>
+ </class>
+ <class name="java/lang/annotation/RetentionPolicy" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/lang/annotation/RetentionPolicy;"/>
+ <method name="values()[Ljava/lang/annotation/RetentionPolicy;"/>
+ <field name="CLASS"/>
+ <field name="RUNTIME"/>
+ <field name="SOURCE"/>
+ </class>
+ <class name="java/lang/annotation/Target" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/annotation/Annotation"/>
+ <method name="value()[Ljava/lang/annotation/ElementType;"/>
+ </class>
+ <class name="java/lang/invoke/CallSite" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="dynamicInvoker()Ljava/lang/invoke/MethodHandle;"/>
+ <method name="getTarget()Ljava/lang/invoke/MethodHandle;"/>
+ <method name="setTarget(Ljava/lang/invoke/MethodHandle;)V"/>
+ <method name="type()Ljava/lang/invoke/MethodType;"/>
+ </class>
+ <class name="java/lang/invoke/ConstantCallSite" since="26">
+ <extends name="java/lang/invoke/CallSite"/>
+ <method name="&lt;init>(Ljava/lang/invoke/MethodHandle;)V"/>
+ <method name="&lt;init>(Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;)V"/>
+ </class>
+ <class name="java/lang/invoke/LambdaConversionException" since="26">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;ZZ)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/lang/invoke/MethodHandle" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="asCollector(Ljava/lang/Class;I)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="asFixedArity()Ljava/lang/invoke/MethodHandle;"/>
+ <method name="asSpreader(Ljava/lang/Class;I)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="asType(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="asVarargsCollector(Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="bindTo(Ljava/lang/Object;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="invoke([Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="invokeExact([Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="invokeWithArguments(Ljava/util/List;)Ljava/lang/Object;"/>
+ <method name="invokeWithArguments([Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="isVarargsCollector()Z"/>
+ <method name="type()Ljava/lang/invoke/MethodType;"/>
+ </class>
+ <class name="java/lang/invoke/MethodHandleInfo" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="getDeclaringClass()Ljava/lang/Class;"/>
+ <method name="getMethodType()Ljava/lang/invoke/MethodType;"/>
+ <method name="getModifiers()I"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getReferenceKind()I"/>
+ <method name="isVarArgs()Z"/>
+ <method name="refKindIsField(I)Z"/>
+ <method name="refKindIsValid(I)Z"/>
+ <method name="refKindName(I)Ljava/lang/String;"/>
+ <method name="referenceKindToString(I)Ljava/lang/String;"/>
+ <method name="reflectAs(Ljava/lang/Class;Ljava/lang/invoke/MethodHandles$Lookup;)Ljava/lang/reflect/Member;"/>
+ <method name="toString(ILjava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/String;"/>
+ <field name="REF_getField"/>
+ <field name="REF_getStatic"/>
+ <field name="REF_invokeInterface"/>
+ <field name="REF_invokeSpecial"/>
+ <field name="REF_invokeStatic"/>
+ <field name="REF_invokeVirtual"/>
+ <field name="REF_newInvokeSpecial"/>
+ <field name="REF_putField"/>
+ <field name="REF_putStatic"/>
+ </class>
+ <class name="java/lang/invoke/MethodHandles" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="arrayElementGetter(Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="arrayElementSetter(Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="catchException(Ljava/lang/invoke/MethodHandle;Ljava/lang/Class;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="collectArguments(Ljava/lang/invoke/MethodHandle;ILjava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="constant(Ljava/lang/Class;Ljava/lang/Object;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="dropArguments(Ljava/lang/invoke/MethodHandle;ILjava/util/List;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="dropArguments(Ljava/lang/invoke/MethodHandle;I[Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="exactInvoker(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="explicitCastArguments(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="filterArguments(Ljava/lang/invoke/MethodHandle;I[Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="filterReturnValue(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="foldArguments(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="guardWithTest(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="identity(Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="insertArguments(Ljava/lang/invoke/MethodHandle;I[Ljava/lang/Object;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="invoker(Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="lookup()Ljava/lang/invoke/MethodHandles$Lookup;"/>
+ <method name="permuteArguments(Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;[I)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="publicLookup()Ljava/lang/invoke/MethodHandles$Lookup;"/>
+ <method name="reflectAs(Ljava/lang/Class;Ljava/lang/invoke/MethodHandle;)Ljava/lang/reflect/Member;"/>
+ <method name="spreadInvoker(Ljava/lang/invoke/MethodType;I)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="throwException(Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;"/>
+ </class>
+ <class name="java/lang/invoke/MethodHandles$Lookup" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="bind(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="findConstructor(Ljava/lang/Class;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="findGetter(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="findSetter(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="findSpecial(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="findStatic(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="findStaticGetter(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="findStaticSetter(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="findVirtual(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="in(Ljava/lang/Class;)Ljava/lang/invoke/MethodHandles$Lookup;"/>
+ <method name="lookupClass()Ljava/lang/Class;"/>
+ <method name="lookupModes()I"/>
+ <method name="revealDirect(Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/MethodHandleInfo;"/>
+ <method name="unreflect(Ljava/lang/reflect/Method;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="unreflectConstructor(Ljava/lang/reflect/Constructor;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="unreflectGetter(Ljava/lang/reflect/Field;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="unreflectSetter(Ljava/lang/reflect/Field;)Ljava/lang/invoke/MethodHandle;"/>
+ <method name="unreflectSpecial(Ljava/lang/reflect/Method;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;"/>
+ <field name="PACKAGE"/>
+ <field name="PRIVATE"/>
+ <field name="PROTECTED"/>
+ <field name="PUBLIC"/>
+ </class>
+ <class name="java/lang/invoke/MethodType" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="appendParameterTypes(Ljava/util/List;)Ljava/lang/invoke/MethodType;"/>
+ <method name="appendParameterTypes([Ljava/lang/Class;)Ljava/lang/invoke/MethodType;"/>
+ <method name="changeParameterType(ILjava/lang/Class;)Ljava/lang/invoke/MethodType;"/>
+ <method name="changeReturnType(Ljava/lang/Class;)Ljava/lang/invoke/MethodType;"/>
+ <method name="dropParameterTypes(II)Ljava/lang/invoke/MethodType;"/>
+ <method name="erase()Ljava/lang/invoke/MethodType;"/>
+ <method name="fromMethodDescriptorString(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/lang/invoke/MethodType;"/>
+ <method name="generic()Ljava/lang/invoke/MethodType;"/>
+ <method name="genericMethodType(I)Ljava/lang/invoke/MethodType;"/>
+ <method name="genericMethodType(IZ)Ljava/lang/invoke/MethodType;"/>
+ <method name="hasPrimitives()Z"/>
+ <method name="hasWrappers()Z"/>
+ <method name="insertParameterTypes(ILjava/util/List;)Ljava/lang/invoke/MethodType;"/>
+ <method name="insertParameterTypes(I[Ljava/lang/Class;)Ljava/lang/invoke/MethodType;"/>
+ <method name="methodType(Ljava/lang/Class;)Ljava/lang/invoke/MethodType;"/>
+ <method name="methodType(Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/invoke/MethodType;"/>
+ <method name="methodType(Ljava/lang/Class;Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/invoke/MethodType;"/>
+ <method name="methodType(Ljava/lang/Class;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodType;"/>
+ <method name="methodType(Ljava/lang/Class;Ljava/util/List;)Ljava/lang/invoke/MethodType;"/>
+ <method name="methodType(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/invoke/MethodType;"/>
+ <method name="parameterArray()[Ljava/lang/Class;"/>
+ <method name="parameterCount()I"/>
+ <method name="parameterList()Ljava/util/List;"/>
+ <method name="parameterType(I)Ljava/lang/Class;"/>
+ <method name="returnType()Ljava/lang/Class;"/>
+ <method name="toMethodDescriptorString()Ljava/lang/String;"/>
+ <method name="unwrap()Ljava/lang/invoke/MethodType;"/>
+ <method name="wrap()Ljava/lang/invoke/MethodType;"/>
+ </class>
+ <class name="java/lang/invoke/MutableCallSite" since="26">
+ <extends name="java/lang/invoke/CallSite"/>
+ <method name="&lt;init>(Ljava/lang/invoke/MethodHandle;)V"/>
+ <method name="&lt;init>(Ljava/lang/invoke/MethodType;)V"/>
+ </class>
+ <class name="java/lang/invoke/VolatileCallSite" since="26">
+ <extends name="java/lang/invoke/CallSite"/>
+ <method name="&lt;init>(Ljava/lang/invoke/MethodHandle;)V"/>
+ <method name="&lt;init>(Ljava/lang/invoke/MethodType;)V"/>
+ </class>
+ <class name="java/lang/invoke/WrongMethodTypeException" since="26">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/ref/PhantomReference" since="1">
+ <extends name="java/lang/ref/Reference"/>
+ <method name="&lt;init>(Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V"/>
+ </class>
+ <class name="java/lang/ref/Reference" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="clear()V"/>
+ <method name="enqueue()Z"/>
+ <method name="get()Ljava/lang/Object;"/>
+ <method name="isEnqueued()Z"/>
+ </class>
+ <class name="java/lang/ref/ReferenceQueue" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="poll()Ljava/lang/ref/Reference;"/>
+ <method name="remove()Ljava/lang/ref/Reference;"/>
+ <method name="remove(J)Ljava/lang/ref/Reference;"/>
+ </class>
+ <class name="java/lang/ref/SoftReference" since="1">
+ <extends name="java/lang/ref/Reference"/>
+ <method name="&lt;init>(Ljava/lang/Object;)V"/>
+ <method name="&lt;init>(Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V"/>
+ </class>
+ <class name="java/lang/ref/WeakReference" since="1">
+ <extends name="java/lang/ref/Reference"/>
+ <method name="&lt;init>(Ljava/lang/Object;)V"/>
+ <method name="&lt;init>(Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V"/>
+ </class>
+ <class name="java/lang/reflect/AccessibleObject" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/reflect/AnnotatedElement"/>
+ <method name="&lt;init>()V"/>
+ <method name="isAccessible()Z"/>
+ <method name="setAccessible(Z)V"/>
+ <method name="setAccessible([Ljava/lang/reflect/AccessibleObject;Z)V"/>
+ </class>
+ <class name="java/lang/reflect/AnnotatedElement" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;"/>
+ <method name="getAnnotations()[Ljava/lang/annotation/Annotation;"/>
+ <method name="getAnnotationsByType(Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;" since="24"/>
+ <method name="getDeclaredAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;" since="24"/>
+ <method name="getDeclaredAnnotations()[Ljava/lang/annotation/Annotation;"/>
+ <method name="getDeclaredAnnotationsByType(Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;" since="24"/>
+ <method name="isAnnotationPresent(Ljava/lang/Class;)Z"/>
+ </class>
+ <class name="java/lang/reflect/Array" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="get(Ljava/lang/Object;I)Ljava/lang/Object;"/>
+ <method name="getBoolean(Ljava/lang/Object;I)Z"/>
+ <method name="getByte(Ljava/lang/Object;I)B"/>
+ <method name="getChar(Ljava/lang/Object;I)C"/>
+ <method name="getDouble(Ljava/lang/Object;I)D"/>
+ <method name="getFloat(Ljava/lang/Object;I)F"/>
+ <method name="getInt(Ljava/lang/Object;I)I"/>
+ <method name="getLength(Ljava/lang/Object;)I"/>
+ <method name="getLong(Ljava/lang/Object;I)J"/>
+ <method name="getShort(Ljava/lang/Object;I)S"/>
+ <method name="newInstance(Ljava/lang/Class;I)Ljava/lang/Object;"/>
+ <method name="newInstance(Ljava/lang/Class;[I)Ljava/lang/Object;"/>
+ <method name="set(Ljava/lang/Object;ILjava/lang/Object;)V"/>
+ <method name="setBoolean(Ljava/lang/Object;IZ)V"/>
+ <method name="setByte(Ljava/lang/Object;IB)V"/>
+ <method name="setChar(Ljava/lang/Object;IC)V"/>
+ <method name="setDouble(Ljava/lang/Object;ID)V"/>
+ <method name="setFloat(Ljava/lang/Object;IF)V"/>
+ <method name="setInt(Ljava/lang/Object;II)V"/>
+ <method name="setLong(Ljava/lang/Object;IJ)V"/>
+ <method name="setShort(Ljava/lang/Object;IS)V"/>
+ </class>
+ <class name="java/lang/reflect/Constructor" since="1">
+ <extends name="java/lang/reflect/AccessibleObject" removed="26"/>
+ <extends name="java/lang/reflect/Executable" since="26"/>
+ <implements name="java/lang/reflect/GenericDeclaration" removed="26"/>
+ <implements name="java/lang/reflect/Member" removed="26"/>
+ <method name="&lt;init>()V"/>
+ <method name="getExceptionTypes()[Ljava/lang/Class;"/>
+ <method name="getGenericExceptionTypes()[Ljava/lang/reflect/Type;"/>
+ <method name="getGenericParameterTypes()[Ljava/lang/reflect/Type;"/>
+ <method name="getParameterAnnotations()[[Ljava/lang/annotation/Annotation;"/>
+ <method name="getParameterTypes()[Ljava/lang/Class;"/>
+ <method name="isVarArgs()Z"/>
+ <method name="newInstance([Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="toGenericString()Ljava/lang/String;"/>
+ </class>
+ <class name="java/lang/reflect/Executable" since="26">
+ <extends name="java/lang/reflect/AccessibleObject"/>
+ <implements name="java/lang/reflect/GenericDeclaration"/>
+ <implements name="java/lang/reflect/Member"/>
+ <method name="&lt;init>()V"/>
+ <method name="getExceptionTypes()[Ljava/lang/Class;"/>
+ <method name="getGenericExceptionTypes()[Ljava/lang/reflect/Type;"/>
+ <method name="getGenericParameterTypes()[Ljava/lang/reflect/Type;"/>
+ <method name="getParameterAnnotations()[[Ljava/lang/annotation/Annotation;"/>
+ <method name="getParameterCount()I"/>
+ <method name="getParameterTypes()[Ljava/lang/Class;"/>
+ <method name="getParameters()[Ljava/lang/reflect/Parameter;"/>
+ <method name="isVarArgs()Z"/>
+ <method name="toGenericString()Ljava/lang/String;"/>
+ </class>
+ <class name="java/lang/reflect/Field" since="1">
+ <extends name="java/lang/reflect/AccessibleObject"/>
+ <implements name="java/lang/reflect/Member"/>
+ <method name="&lt;init>()V"/>
+ <method name="get(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="getBoolean(Ljava/lang/Object;)Z"/>
+ <method name="getByte(Ljava/lang/Object;)B"/>
+ <method name="getChar(Ljava/lang/Object;)C"/>
+ <method name="getDouble(Ljava/lang/Object;)D"/>
+ <method name="getFloat(Ljava/lang/Object;)F"/>
+ <method name="getGenericType()Ljava/lang/reflect/Type;"/>
+ <method name="getInt(Ljava/lang/Object;)I"/>
+ <method name="getLong(Ljava/lang/Object;)J"/>
+ <method name="getShort(Ljava/lang/Object;)S"/>
+ <method name="getType()Ljava/lang/Class;"/>
+ <method name="isEnumConstant()Z"/>
+ <method name="set(Ljava/lang/Object;Ljava/lang/Object;)V"/>
+ <method name="setBoolean(Ljava/lang/Object;Z)V"/>
+ <method name="setByte(Ljava/lang/Object;B)V"/>
+ <method name="setChar(Ljava/lang/Object;C)V"/>
+ <method name="setDouble(Ljava/lang/Object;D)V"/>
+ <method name="setFloat(Ljava/lang/Object;F)V"/>
+ <method name="setInt(Ljava/lang/Object;I)V"/>
+ <method name="setLong(Ljava/lang/Object;J)V"/>
+ <method name="setShort(Ljava/lang/Object;S)V"/>
+ <method name="toGenericString()Ljava/lang/String;"/>
+ </class>
+ <class name="java/lang/reflect/GenericArrayType" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/reflect/Type"/>
+ <method name="getGenericComponentType()Ljava/lang/reflect/Type;"/>
+ </class>
+ <class name="java/lang/reflect/GenericDeclaration" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/reflect/AnnotatedElement" since="26"/>
+ <method name="getTypeParameters()[Ljava/lang/reflect/TypeVariable;"/>
+ </class>
+ <class name="java/lang/reflect/GenericSignatureFormatError" since="1">
+ <extends name="java/lang/ClassFormatError"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V" since="26"/>
+ </class>
+ <class name="java/lang/reflect/InvocationHandler" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="invoke(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;"/>
+ </class>
+ <class name="java/lang/reflect/InvocationTargetException" since="1">
+ <extends name="java/lang/Exception" removed="19"/>
+ <extends name="java/lang/ReflectiveOperationException" since="19"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;Ljava/lang/String;)V"/>
+ <method name="getTargetException()Ljava/lang/Throwable;"/>
+ </class>
+ <class name="java/lang/reflect/MalformedParameterizedTypeException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/lang/reflect/Member" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getDeclaringClass()Ljava/lang/Class;"/>
+ <method name="getModifiers()I"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="isSynthetic()Z"/>
+ <field name="DECLARED"/>
+ <field name="PUBLIC"/>
+ </class>
+ <class name="java/lang/reflect/Method" since="1">
+ <extends name="java/lang/reflect/AccessibleObject" removed="26"/>
+ <extends name="java/lang/reflect/Executable" since="26"/>
+ <implements name="java/lang/reflect/GenericDeclaration" removed="26"/>
+ <implements name="java/lang/reflect/Member" removed="26"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDefaultValue()Ljava/lang/Object;"/>
+ <method name="getExceptionTypes()[Ljava/lang/Class;"/>
+ <method name="getGenericExceptionTypes()[Ljava/lang/reflect/Type;"/>
+ <method name="getGenericParameterTypes()[Ljava/lang/reflect/Type;"/>
+ <method name="getGenericReturnType()Ljava/lang/reflect/Type;"/>
+ <method name="getParameterAnnotations()[[Ljava/lang/annotation/Annotation;"/>
+ <method name="getParameterTypes()[Ljava/lang/Class;"/>
+ <method name="getReturnType()Ljava/lang/Class;"/>
+ <method name="invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="isBridge()Z"/>
+ <method name="isDefault()Z" since="24"/>
+ <method name="isVarArgs()Z"/>
+ <method name="toGenericString()Ljava/lang/String;"/>
+ </class>
+ <class name="java/lang/reflect/Modifier" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="classModifiers()I" since="19"/>
+ <method name="constructorModifiers()I" since="19"/>
+ <method name="fieldModifiers()I" since="19"/>
+ <method name="interfaceModifiers()I" since="19"/>
+ <method name="isAbstract(I)Z"/>
+ <method name="isFinal(I)Z"/>
+ <method name="isInterface(I)Z"/>
+ <method name="isNative(I)Z"/>
+ <method name="isPrivate(I)Z"/>
+ <method name="isProtected(I)Z"/>
+ <method name="isPublic(I)Z"/>
+ <method name="isStatic(I)Z"/>
+ <method name="isStrict(I)Z"/>
+ <method name="isSynchronized(I)Z"/>
+ <method name="isTransient(I)Z"/>
+ <method name="isVolatile(I)Z"/>
+ <method name="methodModifiers()I" since="19"/>
+ <method name="parameterModifiers()I" since="26"/>
+ <method name="toString(I)Ljava/lang/String;"/>
+ <field name="ABSTRACT"/>
+ <field name="FINAL"/>
+ <field name="INTERFACE"/>
+ <field name="NATIVE"/>
+ <field name="PRIVATE"/>
+ <field name="PROTECTED"/>
+ <field name="PUBLIC"/>
+ <field name="STATIC"/>
+ <field name="STRICT"/>
+ <field name="SYNCHRONIZED"/>
+ <field name="TRANSIENT"/>
+ <field name="VOLATILE"/>
+ </class>
+ <class name="java/lang/reflect/Parameter" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/reflect/AnnotatedElement"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDeclaringExecutable()Ljava/lang/reflect/Executable;"/>
+ <method name="getModifiers()I"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getParameterizedType()Ljava/lang/reflect/Type;"/>
+ <method name="getType()Ljava/lang/Class;"/>
+ <method name="isImplicit()Z"/>
+ <method name="isNamePresent()Z"/>
+ <method name="isSynthetic()Z"/>
+ <method name="isVarArgs()Z"/>
+ </class>
+ <class name="java/lang/reflect/ParameterizedType" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/reflect/Type"/>
+ <method name="getActualTypeArguments()[Ljava/lang/reflect/Type;"/>
+ <method name="getOwnerType()Ljava/lang/reflect/Type;"/>
+ <method name="getRawType()Ljava/lang/reflect/Type;"/>
+ </class>
+ <class name="java/lang/reflect/Proxy" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(Ljava/lang/reflect/InvocationHandler;)V"/>
+ <method name="getInvocationHandler(Ljava/lang/Object;)Ljava/lang/reflect/InvocationHandler;"/>
+ <method name="getProxyClass(Ljava/lang/ClassLoader;[Ljava/lang/Class;)Ljava/lang/Class;"/>
+ <method name="isProxyClass(Ljava/lang/Class;)Z"/>
+ <method name="newProxyInstance(Ljava/lang/ClassLoader;[Ljava/lang/Class;Ljava/lang/reflect/InvocationHandler;)Ljava/lang/Object;"/>
+ <field name="h"/>
+ </class>
+ <class name="java/lang/reflect/ReflectPermission" since="1">
+ <extends name="java/security/BasicPermission"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/lang/reflect/Type" since="1">
+ <extends name="java/lang/Object"/>
+ </class>
+ <class name="java/lang/reflect/TypeVariable" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/reflect/Type"/>
+ <method name="getBounds()[Ljava/lang/reflect/Type;"/>
+ <method name="getGenericDeclaration()Ljava/lang/reflect/GenericDeclaration;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ </class>
+ <class name="java/lang/reflect/UndeclaredThrowableException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;Ljava/lang/String;)V"/>
+ <method name="getUndeclaredThrowable()Ljava/lang/Throwable;"/>
+ </class>
+ <class name="java/lang/reflect/WildcardType" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/reflect/Type"/>
+ <method name="getLowerBounds()[Ljava/lang/reflect/Type;"/>
+ <method name="getUpperBounds()[Ljava/lang/reflect/Type;"/>
+ </class>
+ <class name="java/math/BigDecimal" since="1">
+ <extends name="java/lang/Number"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>(D)V"/>
+ <method name="&lt;init>(DLjava/math/MathContext;)V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(ILjava/math/MathContext;)V"/>
+ <method name="&lt;init>(J)V"/>
+ <method name="&lt;init>(JLjava/math/MathContext;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/math/MathContext;)V"/>
+ <method name="&lt;init>(Ljava/math/BigInteger;)V"/>
+ <method name="&lt;init>(Ljava/math/BigInteger;I)V"/>
+ <method name="&lt;init>(Ljava/math/BigInteger;ILjava/math/MathContext;)V"/>
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/MathContext;)V"/>
+ <method name="&lt;init>([C)V"/>
+ <method name="&lt;init>([CII)V"/>
+ <method name="&lt;init>([CIILjava/math/MathContext;)V"/>
+ <method name="&lt;init>([CLjava/math/MathContext;)V"/>
+ <method name="abs()Ljava/math/BigDecimal;"/>
+ <method name="abs(Ljava/math/MathContext;)Ljava/math/BigDecimal;"/>
+ <method name="add(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;"/>
+ <method name="add(Ljava/math/BigDecimal;Ljava/math/MathContext;)Ljava/math/BigDecimal;"/>
+ <method name="byteValueExact()B"/>
+ <method name="compareTo(Ljava/math/BigDecimal;)I"/>
+ <method name="divide(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;"/>
+ <method name="divide(Ljava/math/BigDecimal;I)Ljava/math/BigDecimal;"/>
+ <method name="divide(Ljava/math/BigDecimal;II)Ljava/math/BigDecimal;"/>
+ <method name="divide(Ljava/math/BigDecimal;ILjava/math/RoundingMode;)Ljava/math/BigDecimal;"/>
+ <method name="divide(Ljava/math/BigDecimal;Ljava/math/MathContext;)Ljava/math/BigDecimal;"/>
+ <method name="divide(Ljava/math/BigDecimal;Ljava/math/RoundingMode;)Ljava/math/BigDecimal;"/>
+ <method name="divideAndRemainder(Ljava/math/BigDecimal;)[Ljava/math/BigDecimal;"/>
+ <method name="divideAndRemainder(Ljava/math/BigDecimal;Ljava/math/MathContext;)[Ljava/math/BigDecimal;"/>
+ <method name="divideToIntegralValue(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;"/>
+ <method name="divideToIntegralValue(Ljava/math/BigDecimal;Ljava/math/MathContext;)Ljava/math/BigDecimal;"/>
+ <method name="intValueExact()I"/>
+ <method name="longValueExact()J"/>
+ <method name="max(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;"/>
+ <method name="min(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;"/>
+ <method name="movePointLeft(I)Ljava/math/BigDecimal;"/>
+ <method name="movePointRight(I)Ljava/math/BigDecimal;"/>
+ <method name="multiply(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;"/>
+ <method name="multiply(Ljava/math/BigDecimal;Ljava/math/MathContext;)Ljava/math/BigDecimal;"/>
+ <method name="negate()Ljava/math/BigDecimal;"/>
+ <method name="negate(Ljava/math/MathContext;)Ljava/math/BigDecimal;"/>
+ <method name="plus()Ljava/math/BigDecimal;"/>
+ <method name="plus(Ljava/math/MathContext;)Ljava/math/BigDecimal;"/>
+ <method name="pow(I)Ljava/math/BigDecimal;"/>
+ <method name="pow(ILjava/math/MathContext;)Ljava/math/BigDecimal;"/>
+ <method name="precision()I"/>
+ <method name="remainder(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;"/>
+ <method name="remainder(Ljava/math/BigDecimal;Ljava/math/MathContext;)Ljava/math/BigDecimal;"/>
+ <method name="round(Ljava/math/MathContext;)Ljava/math/BigDecimal;"/>
+ <method name="scale()I"/>
+ <method name="scaleByPowerOfTen(I)Ljava/math/BigDecimal;"/>
+ <method name="setScale(I)Ljava/math/BigDecimal;"/>
+ <method name="setScale(II)Ljava/math/BigDecimal;"/>
+ <method name="setScale(ILjava/math/RoundingMode;)Ljava/math/BigDecimal;"/>
+ <method name="shortValueExact()S"/>
+ <method name="signum()I"/>
+ <method name="stripTrailingZeros()Ljava/math/BigDecimal;"/>
+ <method name="subtract(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;"/>
+ <method name="subtract(Ljava/math/BigDecimal;Ljava/math/MathContext;)Ljava/math/BigDecimal;"/>
+ <method name="toBigInteger()Ljava/math/BigInteger;"/>
+ <method name="toBigIntegerExact()Ljava/math/BigInteger;"/>
+ <method name="toEngineeringString()Ljava/lang/String;"/>
+ <method name="toPlainString()Ljava/lang/String;"/>
+ <method name="ulp()Ljava/math/BigDecimal;"/>
+ <method name="unscaledValue()Ljava/math/BigInteger;"/>
+ <method name="valueOf(D)Ljava/math/BigDecimal;"/>
+ <method name="valueOf(J)Ljava/math/BigDecimal;"/>
+ <method name="valueOf(JI)Ljava/math/BigDecimal;"/>
+ <field name="ONE"/>
+ <field name="ROUND_CEILING"/>
+ <field name="ROUND_DOWN"/>
+ <field name="ROUND_FLOOR"/>
+ <field name="ROUND_HALF_DOWN"/>
+ <field name="ROUND_HALF_EVEN"/>
+ <field name="ROUND_HALF_UP"/>
+ <field name="ROUND_UNNECESSARY"/>
+ <field name="ROUND_UP"/>
+ <field name="TEN"/>
+ <field name="ZERO"/>
+ </class>
+ <class name="java/math/BigInteger" since="1">
+ <extends name="java/lang/Number"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>(IILjava/util/Random;)V"/>
+ <method name="&lt;init>(ILjava/util/Random;)V"/>
+ <method name="&lt;init>(I[B)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="&lt;init>([B)V"/>
+ <method name="abs()Ljava/math/BigInteger;"/>
+ <method name="add(Ljava/math/BigInteger;)Ljava/math/BigInteger;"/>
+ <method name="and(Ljava/math/BigInteger;)Ljava/math/BigInteger;"/>
+ <method name="andNot(Ljava/math/BigInteger;)Ljava/math/BigInteger;"/>
+ <method name="bitCount()I"/>
+ <method name="bitLength()I"/>
+ <method name="clearBit(I)Ljava/math/BigInteger;"/>
+ <method name="compareTo(Ljava/math/BigInteger;)I"/>
+ <method name="divide(Ljava/math/BigInteger;)Ljava/math/BigInteger;"/>
+ <method name="divideAndRemainder(Ljava/math/BigInteger;)[Ljava/math/BigInteger;"/>
+ <method name="flipBit(I)Ljava/math/BigInteger;"/>
+ <method name="gcd(Ljava/math/BigInteger;)Ljava/math/BigInteger;"/>
+ <method name="getLowestSetBit()I"/>
+ <method name="isProbablePrime(I)Z"/>
+ <method name="max(Ljava/math/BigInteger;)Ljava/math/BigInteger;"/>
+ <method name="min(Ljava/math/BigInteger;)Ljava/math/BigInteger;"/>
+ <method name="mod(Ljava/math/BigInteger;)Ljava/math/BigInteger;"/>
+ <method name="modInverse(Ljava/math/BigInteger;)Ljava/math/BigInteger;"/>
+ <method name="modPow(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/math/BigInteger;"/>
+ <method name="multiply(Ljava/math/BigInteger;)Ljava/math/BigInteger;"/>
+ <method name="negate()Ljava/math/BigInteger;"/>
+ <method name="nextProbablePrime()Ljava/math/BigInteger;"/>
+ <method name="not()Ljava/math/BigInteger;"/>
+ <method name="or(Ljava/math/BigInteger;)Ljava/math/BigInteger;"/>
+ <method name="pow(I)Ljava/math/BigInteger;"/>
+ <method name="probablePrime(ILjava/util/Random;)Ljava/math/BigInteger;"/>
+ <method name="remainder(Ljava/math/BigInteger;)Ljava/math/BigInteger;"/>
+ <method name="setBit(I)Ljava/math/BigInteger;"/>
+ <method name="shiftLeft(I)Ljava/math/BigInteger;"/>
+ <method name="shiftRight(I)Ljava/math/BigInteger;"/>
+ <method name="signum()I"/>
+ <method name="subtract(Ljava/math/BigInteger;)Ljava/math/BigInteger;"/>
+ <method name="testBit(I)Z"/>
+ <method name="toByteArray()[B"/>
+ <method name="toString(I)Ljava/lang/String;"/>
+ <method name="valueOf(J)Ljava/math/BigInteger;"/>
+ <method name="xor(Ljava/math/BigInteger;)Ljava/math/BigInteger;"/>
+ <field name="ONE"/>
+ <field name="TEN"/>
+ <field name="ZERO"/>
+ </class>
+ <class name="java/math/MathContext" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(ILjava/math/RoundingMode;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getPrecision()I"/>
+ <method name="getRoundingMode()Ljava/math/RoundingMode;"/>
+ <field name="DECIMAL128"/>
+ <field name="DECIMAL32"/>
+ <field name="DECIMAL64"/>
+ <field name="UNLIMITED"/>
+ </class>
+ <class name="java/math/RoundingMode" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(I)Ljava/math/RoundingMode;"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/math/RoundingMode;"/>
+ <method name="values()[Ljava/math/RoundingMode;"/>
+ <field name="CEILING"/>
+ <field name="DOWN"/>
+ <field name="FLOOR"/>
+ <field name="HALF_DOWN"/>
+ <field name="HALF_EVEN"/>
+ <field name="HALF_UP"/>
+ <field name="UNNECESSARY"/>
+ <field name="UP"/>
+ </class>
+ <class name="java/net/Authenticator" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getPasswordAuthentication()Ljava/net/PasswordAuthentication;"/>
+ <method name="getRequestingHost()Ljava/lang/String;"/>
+ <method name="getRequestingPort()I"/>
+ <method name="getRequestingPrompt()Ljava/lang/String;"/>
+ <method name="getRequestingProtocol()Ljava/lang/String;"/>
+ <method name="getRequestingScheme()Ljava/lang/String;"/>
+ <method name="getRequestingSite()Ljava/net/InetAddress;"/>
+ <method name="getRequestingURL()Ljava/net/URL;"/>
+ <method name="getRequestorType()Ljava/net/Authenticator$RequestorType;"/>
+ <method name="requestPasswordAuthentication(Ljava/lang/String;Ljava/net/InetAddress;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/net/PasswordAuthentication;"/>
+ <method name="requestPasswordAuthentication(Ljava/lang/String;Ljava/net/InetAddress;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/net/URL;Ljava/net/Authenticator$RequestorType;)Ljava/net/PasswordAuthentication;"/>
+ <method name="requestPasswordAuthentication(Ljava/net/InetAddress;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/net/PasswordAuthentication;"/>
+ <method name="setDefault(Ljava/net/Authenticator;)V"/>
+ </class>
+ <class name="java/net/Authenticator$RequestorType" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/net/Authenticator$RequestorType;"/>
+ <method name="values()[Ljava/net/Authenticator$RequestorType;"/>
+ <field name="PROXY"/>
+ <field name="SERVER"/>
+ </class>
+ <class name="java/net/BindException" since="1">
+ <extends name="java/net/SocketException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/net/CacheRequest" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="abort()V"/>
+ <method name="getBody()Ljava/io/OutputStream;"/>
+ </class>
+ <class name="java/net/CacheResponse" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getBody()Ljava/io/InputStream;"/>
+ <method name="getHeaders()Ljava/util/Map;"/>
+ </class>
+ <class name="java/net/ConnectException" since="1">
+ <extends name="java/net/SocketException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/net/ContentHandler" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getContent(Ljava/net/URLConnection;)Ljava/lang/Object;"/>
+ <method name="getContent(Ljava/net/URLConnection;[Ljava/lang/Class;)Ljava/lang/Object;"/>
+ </class>
+ <class name="java/net/ContentHandlerFactory" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="createContentHandler(Ljava/lang/String;)Ljava/net/ContentHandler;"/>
+ </class>
+ <class name="java/net/CookieHandler" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="get(Ljava/net/URI;Ljava/util/Map;)Ljava/util/Map;"/>
+ <method name="getDefault()Ljava/net/CookieHandler;"/>
+ <method name="put(Ljava/net/URI;Ljava/util/Map;)V"/>
+ <method name="setDefault(Ljava/net/CookieHandler;)V"/>
+ </class>
+ <class name="java/net/CookieManager" since="9">
+ <extends name="java/net/CookieHandler"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/net/CookieStore;Ljava/net/CookiePolicy;)V"/>
+ <method name="getCookieStore()Ljava/net/CookieStore;"/>
+ <method name="setCookiePolicy(Ljava/net/CookiePolicy;)V"/>
+ </class>
+ <class name="java/net/CookiePolicy" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="shouldAccept(Ljava/net/URI;Ljava/net/HttpCookie;)Z"/>
+ <field name="ACCEPT_ALL"/>
+ <field name="ACCEPT_NONE"/>
+ <field name="ACCEPT_ORIGINAL_SERVER"/>
+ </class>
+ <class name="java/net/CookieStore" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="add(Ljava/net/URI;Ljava/net/HttpCookie;)V"/>
+ <method name="get(Ljava/net/URI;)Ljava/util/List;"/>
+ <method name="getCookies()Ljava/util/List;"/>
+ <method name="getURIs()Ljava/util/List;"/>
+ <method name="remove(Ljava/net/URI;Ljava/net/HttpCookie;)Z"/>
+ <method name="removeAll()Z"/>
+ </class>
+ <class name="java/net/DatagramPacket" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>([BI)V"/>
+ <method name="&lt;init>([BII)V"/>
+ <method name="&lt;init>([BIILjava/net/InetAddress;I)V"/>
+ <method name="&lt;init>([BIILjava/net/SocketAddress;)V"/>
+ <method name="&lt;init>([BILjava/net/InetAddress;I)V"/>
+ <method name="&lt;init>([BILjava/net/SocketAddress;)V"/>
+ <method name="getAddress()Ljava/net/InetAddress;"/>
+ <method name="getData()[B"/>
+ <method name="getLength()I"/>
+ <method name="getOffset()I"/>
+ <method name="getPort()I"/>
+ <method name="getSocketAddress()Ljava/net/SocketAddress;"/>
+ <method name="setAddress(Ljava/net/InetAddress;)V"/>
+ <method name="setData([B)V"/>
+ <method name="setData([BII)V"/>
+ <method name="setLength(I)V"/>
+ <method name="setPort(I)V"/>
+ <method name="setSocketAddress(Ljava/net/SocketAddress;)V"/>
+ </class>
+ <class name="java/net/DatagramSocket" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable" since="19"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(ILjava/net/InetAddress;)V"/>
+ <method name="&lt;init>(Ljava/net/DatagramSocketImpl;)V"/>
+ <method name="&lt;init>(Ljava/net/SocketAddress;)V"/>
+ <method name="bind(Ljava/net/SocketAddress;)V"/>
+ <method name="close()V"/>
+ <method name="connect(Ljava/net/InetAddress;I)V"/>
+ <method name="connect(Ljava/net/SocketAddress;)V"/>
+ <method name="disconnect()V"/>
+ <method name="getBroadcast()Z"/>
+ <method name="getChannel()Ljava/nio/channels/DatagramChannel;"/>
+ <method name="getInetAddress()Ljava/net/InetAddress;"/>
+ <method name="getLocalAddress()Ljava/net/InetAddress;"/>
+ <method name="getLocalPort()I"/>
+ <method name="getLocalSocketAddress()Ljava/net/SocketAddress;"/>
+ <method name="getPort()I"/>
+ <method name="getReceiveBufferSize()I"/>
+ <method name="getRemoteSocketAddress()Ljava/net/SocketAddress;"/>
+ <method name="getReuseAddress()Z"/>
+ <method name="getSendBufferSize()I"/>
+ <method name="getSoTimeout()I"/>
+ <method name="getTrafficClass()I"/>
+ <method name="isBound()Z"/>
+ <method name="isClosed()Z"/>
+ <method name="isConnected()Z"/>
+ <method name="receive(Ljava/net/DatagramPacket;)V"/>
+ <method name="send(Ljava/net/DatagramPacket;)V"/>
+ <method name="setBroadcast(Z)V"/>
+ <method name="setDatagramSocketImplFactory(Ljava/net/DatagramSocketImplFactory;)V"/>
+ <method name="setReceiveBufferSize(I)V"/>
+ <method name="setReuseAddress(Z)V"/>
+ <method name="setSendBufferSize(I)V"/>
+ <method name="setSoTimeout(I)V"/>
+ <method name="setTrafficClass(I)V"/>
+ </class>
+ <class name="java/net/DatagramSocketImpl" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/net/SocketOptions"/>
+ <method name="&lt;init>()V"/>
+ <method name="bind(ILjava/net/InetAddress;)V"/>
+ <method name="close()V"/>
+ <method name="connect(Ljava/net/InetAddress;I)V"/>
+ <method name="create()V"/>
+ <method name="disconnect()V"/>
+ <method name="getFileDescriptor()Ljava/io/FileDescriptor;"/>
+ <method name="getLocalPort()I"/>
+ <method name="getTTL()B" deprecated="16"/>
+ <method name="getTimeToLive()I"/>
+ <method name="join(Ljava/net/InetAddress;)V"/>
+ <method name="joinGroup(Ljava/net/SocketAddress;Ljava/net/NetworkInterface;)V"/>
+ <method name="leave(Ljava/net/InetAddress;)V"/>
+ <method name="leaveGroup(Ljava/net/SocketAddress;Ljava/net/NetworkInterface;)V"/>
+ <method name="peek(Ljava/net/InetAddress;)I"/>
+ <method name="peekData(Ljava/net/DatagramPacket;)I"/>
+ <method name="receive(Ljava/net/DatagramPacket;)V"/>
+ <method name="send(Ljava/net/DatagramPacket;)V"/>
+ <method name="setTTL(B)V" deprecated="16"/>
+ <method name="setTimeToLive(I)V"/>
+ <field name="fd"/>
+ <field name="localPort"/>
+ </class>
+ <class name="java/net/DatagramSocketImplFactory" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="createDatagramSocketImpl()Ljava/net/DatagramSocketImpl;"/>
+ </class>
+ <class name="java/net/FileNameMap" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getContentTypeFor(Ljava/lang/String;)Ljava/lang/String;"/>
+ </class>
+ <class name="java/net/HttpCookie" since="9">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="domainMatches(Ljava/lang/String;Ljava/lang/String;)Z"/>
+ <method name="getComment()Ljava/lang/String;"/>
+ <method name="getCommentURL()Ljava/lang/String;"/>
+ <method name="getDiscard()Z"/>
+ <method name="getDomain()Ljava/lang/String;"/>
+ <method name="getMaxAge()J"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getPath()Ljava/lang/String;"/>
+ <method name="getPortlist()Ljava/lang/String;"/>
+ <method name="getSecure()Z"/>
+ <method name="getValue()Ljava/lang/String;"/>
+ <method name="getVersion()I"/>
+ <method name="hasExpired()Z"/>
+ <method name="isHttpOnly()Z" since="24"/>
+ <method name="parse(Ljava/lang/String;)Ljava/util/List;"/>
+ <method name="setComment(Ljava/lang/String;)V"/>
+ <method name="setCommentURL(Ljava/lang/String;)V"/>
+ <method name="setDiscard(Z)V"/>
+ <method name="setDomain(Ljava/lang/String;)V"/>
+ <method name="setHttpOnly(Z)V" since="24"/>
+ <method name="setMaxAge(J)V"/>
+ <method name="setPath(Ljava/lang/String;)V"/>
+ <method name="setPortlist(Ljava/lang/String;)V"/>
+ <method name="setSecure(Z)V"/>
+ <method name="setValue(Ljava/lang/String;)V"/>
+ <method name="setVersion(I)V"/>
+ </class>
+ <class name="java/net/HttpRetryException" since="1">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;ILjava/lang/String;)V"/>
+ <method name="getLocation()Ljava/lang/String;"/>
+ <method name="getReason()Ljava/lang/String;"/>
+ <method name="responseCode()I"/>
+ </class>
+ <class name="java/net/HttpURLConnection" since="1">
+ <extends name="java/net/URLConnection"/>
+ <method name="&lt;init>(Ljava/net/URL;)V"/>
+ <method name="disconnect()V"/>
+ <method name="getErrorStream()Ljava/io/InputStream;"/>
+ <method name="getFollowRedirects()Z"/>
+ <method name="getInstanceFollowRedirects()Z"/>
+ <method name="getRequestMethod()Ljava/lang/String;"/>
+ <method name="getResponseCode()I"/>
+ <method name="getResponseMessage()Ljava/lang/String;"/>
+ <method name="setChunkedStreamingMode(I)V"/>
+ <method name="setFixedLengthStreamingMode(I)V"/>
+ <method name="setFixedLengthStreamingMode(J)V" since="19"/>
+ <method name="setFollowRedirects(Z)V"/>
+ <method name="setInstanceFollowRedirects(Z)V"/>
+ <method name="setRequestMethod(Ljava/lang/String;)V"/>
+ <method name="usingProxy()Z"/>
+ <field name="HTTP_ACCEPTED"/>
+ <field name="HTTP_BAD_GATEWAY"/>
+ <field name="HTTP_BAD_METHOD"/>
+ <field name="HTTP_BAD_REQUEST"/>
+ <field name="HTTP_CLIENT_TIMEOUT"/>
+ <field name="HTTP_CONFLICT"/>
+ <field name="HTTP_CREATED"/>
+ <field name="HTTP_ENTITY_TOO_LARGE"/>
+ <field name="HTTP_FORBIDDEN"/>
+ <field name="HTTP_GATEWAY_TIMEOUT"/>
+ <field name="HTTP_GONE"/>
+ <field name="HTTP_INTERNAL_ERROR"/>
+ <field name="HTTP_LENGTH_REQUIRED"/>
+ <field name="HTTP_MOVED_PERM"/>
+ <field name="HTTP_MOVED_TEMP"/>
+ <field name="HTTP_MULT_CHOICE"/>
+ <field name="HTTP_NOT_ACCEPTABLE"/>
+ <field name="HTTP_NOT_AUTHORITATIVE"/>
+ <field name="HTTP_NOT_FOUND"/>
+ <field name="HTTP_NOT_IMPLEMENTED"/>
+ <field name="HTTP_NOT_MODIFIED"/>
+ <field name="HTTP_NO_CONTENT"/>
+ <field name="HTTP_OK"/>
+ <field name="HTTP_PARTIAL"/>
+ <field name="HTTP_PAYMENT_REQUIRED"/>
+ <field name="HTTP_PRECON_FAILED"/>
+ <field name="HTTP_PROXY_AUTH"/>
+ <field name="HTTP_REQ_TOO_LONG"/>
+ <field name="HTTP_RESET"/>
+ <field name="HTTP_SEE_OTHER"/>
+ <field name="HTTP_SERVER_ERROR" deprecated="16"/>
+ <field name="HTTP_UNAUTHORIZED"/>
+ <field name="HTTP_UNAVAILABLE"/>
+ <field name="HTTP_UNSUPPORTED_TYPE"/>
+ <field name="HTTP_USE_PROXY"/>
+ <field name="HTTP_VERSION"/>
+ <field name="chunkLength"/>
+ <field name="fixedContentLength"/>
+ <field name="fixedContentLengthLong" since="19"/>
+ <field name="instanceFollowRedirects"/>
+ <field name="method"/>
+ <field name="responseCode"/>
+ <field name="responseMessage"/>
+ </class>
+ <class name="java/net/IDN" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="toASCII(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="toASCII(Ljava/lang/String;I)Ljava/lang/String;"/>
+ <method name="toUnicode(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="toUnicode(Ljava/lang/String;I)Ljava/lang/String;"/>
+ <field name="ALLOW_UNASSIGNED"/>
+ <field name="USE_STD3_ASCII_RULES"/>
+ </class>
+ <class name="java/net/Inet4Address" since="1">
+ <extends name="java/net/InetAddress"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/net/Inet6Address" since="1">
+ <extends name="java/net/InetAddress"/>
+ <method name="&lt;init>()V"/>
+ <method name="getByAddress(Ljava/lang/String;[BI)Ljava/net/Inet6Address;"/>
+ <method name="getByAddress(Ljava/lang/String;[BLjava/net/NetworkInterface;)Ljava/net/Inet6Address;"/>
+ <method name="getScopeId()I"/>
+ <method name="getScopedInterface()Ljava/net/NetworkInterface;"/>
+ <method name="isIPv4CompatibleAddress()Z"/>
+ </class>
+ <class name="java/net/InetAddress" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAddress()[B"/>
+ <method name="getAllByName(Ljava/lang/String;)[Ljava/net/InetAddress;"/>
+ <method name="getByAddress(Ljava/lang/String;[B)Ljava/net/InetAddress;"/>
+ <method name="getByAddress([B)Ljava/net/InetAddress;"/>
+ <method name="getByName(Ljava/lang/String;)Ljava/net/InetAddress;"/>
+ <method name="getCanonicalHostName()Ljava/lang/String;"/>
+ <method name="getHostAddress()Ljava/lang/String;"/>
+ <method name="getHostName()Ljava/lang/String;"/>
+ <method name="getLocalHost()Ljava/net/InetAddress;"/>
+ <method name="getLoopbackAddress()Ljava/net/InetAddress;" since="19"/>
+ <method name="isAnyLocalAddress()Z"/>
+ <method name="isLinkLocalAddress()Z"/>
+ <method name="isLoopbackAddress()Z"/>
+ <method name="isMCGlobal()Z"/>
+ <method name="isMCLinkLocal()Z"/>
+ <method name="isMCNodeLocal()Z"/>
+ <method name="isMCOrgLocal()Z"/>
+ <method name="isMCSiteLocal()Z"/>
+ <method name="isMulticastAddress()Z"/>
+ <method name="isReachable(I)Z"/>
+ <method name="isReachable(Ljava/net/NetworkInterface;II)Z"/>
+ <method name="isSiteLocalAddress()Z"/>
+ </class>
+ <class name="java/net/InetSocketAddress" since="1">
+ <extends name="java/net/SocketAddress"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/net/InetAddress;I)V"/>
+ <method name="createUnresolved(Ljava/lang/String;I)Ljava/net/InetSocketAddress;"/>
+ <method name="getAddress()Ljava/net/InetAddress;"/>
+ <method name="getHostName()Ljava/lang/String;"/>
+ <method name="getHostString()Ljava/lang/String;" since="19"/>
+ <method name="getPort()I"/>
+ <method name="isUnresolved()Z"/>
+ </class>
+ <class name="java/net/InterfaceAddress" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAddress()Ljava/net/InetAddress;"/>
+ <method name="getBroadcast()Ljava/net/InetAddress;"/>
+ <method name="getNetworkPrefixLength()S"/>
+ </class>
+ <class name="java/net/JarURLConnection" since="1">
+ <extends name="java/net/URLConnection"/>
+ <method name="&lt;init>(Ljava/net/URL;)V"/>
+ <method name="getAttributes()Ljava/util/jar/Attributes;"/>
+ <method name="getCertificates()[Ljava/security/cert/Certificate;"/>
+ <method name="getEntryName()Ljava/lang/String;"/>
+ <method name="getJarEntry()Ljava/util/jar/JarEntry;"/>
+ <method name="getJarFile()Ljava/util/jar/JarFile;"/>
+ <method name="getJarFileURL()Ljava/net/URL;"/>
+ <method name="getMainAttributes()Ljava/util/jar/Attributes;"/>
+ <method name="getManifest()Ljava/util/jar/Manifest;"/>
+ <field name="jarFileURLConnection"/>
+ </class>
+ <class name="java/net/MalformedURLException" since="1">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/net/MulticastSocket" since="1">
+ <extends name="java/net/DatagramSocket"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Ljava/net/SocketAddress;)V"/>
+ <method name="getInterface()Ljava/net/InetAddress;"/>
+ <method name="getLoopbackMode()Z"/>
+ <method name="getNetworkInterface()Ljava/net/NetworkInterface;"/>
+ <method name="getTTL()B" deprecated="16"/>
+ <method name="getTimeToLive()I"/>
+ <method name="joinGroup(Ljava/net/InetAddress;)V"/>
+ <method name="joinGroup(Ljava/net/SocketAddress;Ljava/net/NetworkInterface;)V"/>
+ <method name="leaveGroup(Ljava/net/InetAddress;)V"/>
+ <method name="leaveGroup(Ljava/net/SocketAddress;Ljava/net/NetworkInterface;)V"/>
+ <method name="send(Ljava/net/DatagramPacket;B)V" deprecated="16"/>
+ <method name="setInterface(Ljava/net/InetAddress;)V"/>
+ <method name="setLoopbackMode(Z)V"/>
+ <method name="setNetworkInterface(Ljava/net/NetworkInterface;)V"/>
+ <method name="setTTL(B)V" deprecated="16"/>
+ <method name="setTimeToLive(I)V"/>
+ </class>
+ <class name="java/net/NetPermission" since="1">
+ <extends name="java/security/BasicPermission"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/net/NetworkInterface" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getByIndex(I)Ljava/net/NetworkInterface;" since="19"/>
+ <method name="getByInetAddress(Ljava/net/InetAddress;)Ljava/net/NetworkInterface;"/>
+ <method name="getByName(Ljava/lang/String;)Ljava/net/NetworkInterface;"/>
+ <method name="getDisplayName()Ljava/lang/String;"/>
+ <method name="getHardwareAddress()[B" since="9"/>
+ <method name="getIndex()I" since="19"/>
+ <method name="getInetAddresses()Ljava/util/Enumeration;"/>
+ <method name="getInterfaceAddresses()Ljava/util/List;" since="9"/>
+ <method name="getMTU()I" since="9"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getNetworkInterfaces()Ljava/util/Enumeration;"/>
+ <method name="getParent()Ljava/net/NetworkInterface;" since="9"/>
+ <method name="getSubInterfaces()Ljava/util/Enumeration;" since="9"/>
+ <method name="isLoopback()Z" since="9"/>
+ <method name="isPointToPoint()Z" since="9"/>
+ <method name="isUp()Z" since="9"/>
+ <method name="isVirtual()Z" since="9"/>
+ <method name="supportsMulticast()Z" since="9"/>
+ </class>
+ <class name="java/net/NoRouteToHostException" since="1">
+ <extends name="java/net/SocketException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/net/PasswordAuthentication" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;[C)V"/>
+ <method name="getPassword()[C"/>
+ <method name="getUserName()Ljava/lang/String;"/>
+ </class>
+ <class name="java/net/PortUnreachableException" since="1">
+ <extends name="java/net/SocketException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/net/ProtocolException" since="1">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/net/ProtocolFamily" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="name()Ljava/lang/String;"/>
+ </class>
+ <class name="java/net/Proxy" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/net/Proxy$Type;Ljava/net/SocketAddress;)V"/>
+ <method name="address()Ljava/net/SocketAddress;"/>
+ <method name="type()Ljava/net/Proxy$Type;"/>
+ <field name="NO_PROXY"/>
+ </class>
+ <class name="java/net/Proxy$Type" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/net/Proxy$Type;"/>
+ <method name="values()[Ljava/net/Proxy$Type;"/>
+ <field name="DIRECT"/>
+ <field name="HTTP"/>
+ <field name="SOCKS"/>
+ </class>
+ <class name="java/net/ProxySelector" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="connectFailed(Ljava/net/URI;Ljava/net/SocketAddress;Ljava/io/IOException;)V"/>
+ <method name="getDefault()Ljava/net/ProxySelector;"/>
+ <method name="select(Ljava/net/URI;)Ljava/util/List;"/>
+ <method name="setDefault(Ljava/net/ProxySelector;)V"/>
+ </class>
+ <class name="java/net/ResponseCache" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="get(Ljava/net/URI;Ljava/lang/String;Ljava/util/Map;)Ljava/net/CacheResponse;"/>
+ <method name="getDefault()Ljava/net/ResponseCache;"/>
+ <method name="put(Ljava/net/URI;Ljava/net/URLConnection;)Ljava/net/CacheRequest;"/>
+ <method name="setDefault(Ljava/net/ResponseCache;)V"/>
+ </class>
+ <class name="java/net/SecureCacheResponse" since="1">
+ <extends name="java/net/CacheResponse"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCipherSuite()Ljava/lang/String;"/>
+ <method name="getLocalCertificateChain()Ljava/util/List;"/>
+ <method name="getLocalPrincipal()Ljava/security/Principal;"/>
+ <method name="getPeerPrincipal()Ljava/security/Principal;"/>
+ <method name="getServerCertificateChain()Ljava/util/List;"/>
+ </class>
+ <class name="java/net/ServerSocket" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable" since="19"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="&lt;init>(IILjava/net/InetAddress;)V"/>
+ <method name="&lt;init>(Ljava/net/SocketImpl;)V" removed="2"/>
+ <method name="accept()Ljava/net/Socket;"/>
+ <method name="bind(Ljava/net/SocketAddress;)V"/>
+ <method name="bind(Ljava/net/SocketAddress;I)V"/>
+ <method name="close()V"/>
+ <method name="getChannel()Ljava/nio/channels/ServerSocketChannel;"/>
+ <method name="getInetAddress()Ljava/net/InetAddress;"/>
+ <method name="getLocalPort()I"/>
+ <method name="getLocalSocketAddress()Ljava/net/SocketAddress;"/>
+ <method name="getReceiveBufferSize()I"/>
+ <method name="getReuseAddress()Z"/>
+ <method name="getSoTimeout()I"/>
+ <method name="implAccept(Ljava/net/Socket;)V"/>
+ <method name="isBound()Z"/>
+ <method name="isClosed()Z"/>
+ <method name="setPerformancePreferences(III)V"/>
+ <method name="setReceiveBufferSize(I)V"/>
+ <method name="setReuseAddress(Z)V"/>
+ <method name="setSoTimeout(I)V"/>
+ <method name="setSocketFactory(Ljava/net/SocketImplFactory;)V"/>
+ </class>
+ <class name="java/net/Socket" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable" since="19"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;ILjava/net/InetAddress;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;IZ)V" deprecated="16"/>
+ <method name="&lt;init>(Ljava/net/InetAddress;I)V"/>
+ <method name="&lt;init>(Ljava/net/InetAddress;ILjava/net/InetAddress;I)V"/>
+ <method name="&lt;init>(Ljava/net/InetAddress;IZ)V" deprecated="16"/>
+ <method name="&lt;init>(Ljava/net/Proxy;)V"/>
+ <method name="&lt;init>(Ljava/net/SocketImpl;)V"/>
+ <method name="bind(Ljava/net/SocketAddress;)V"/>
+ <method name="close()V"/>
+ <method name="connect(Ljava/net/SocketAddress;)V"/>
+ <method name="connect(Ljava/net/SocketAddress;I)V"/>
+ <method name="getChannel()Ljava/nio/channels/SocketChannel;"/>
+ <method name="getInetAddress()Ljava/net/InetAddress;"/>
+ <method name="getInputStream()Ljava/io/InputStream;"/>
+ <method name="getKeepAlive()Z"/>
+ <method name="getLocalAddress()Ljava/net/InetAddress;"/>
+ <method name="getLocalPort()I"/>
+ <method name="getLocalSocketAddress()Ljava/net/SocketAddress;"/>
+ <method name="getOOBInline()Z"/>
+ <method name="getOutputStream()Ljava/io/OutputStream;"/>
+ <method name="getPort()I"/>
+ <method name="getReceiveBufferSize()I"/>
+ <method name="getRemoteSocketAddress()Ljava/net/SocketAddress;"/>
+ <method name="getReuseAddress()Z"/>
+ <method name="getSendBufferSize()I"/>
+ <method name="getSoLinger()I"/>
+ <method name="getSoTimeout()I"/>
+ <method name="getTcpNoDelay()Z"/>
+ <method name="getTrafficClass()I"/>
+ <method name="isBound()Z"/>
+ <method name="isClosed()Z"/>
+ <method name="isConnected()Z"/>
+ <method name="isInputShutdown()Z"/>
+ <method name="isOutputShutdown()Z"/>
+ <method name="sendUrgentData(I)V"/>
+ <method name="setKeepAlive(Z)V"/>
+ <method name="setOOBInline(Z)V"/>
+ <method name="setPerformancePreferences(III)V"/>
+ <method name="setReceiveBufferSize(I)V"/>
+ <method name="setReuseAddress(Z)V"/>
+ <method name="setSendBufferSize(I)V"/>
+ <method name="setSoLinger(ZI)V"/>
+ <method name="setSoTimeout(I)V"/>
+ <method name="setSocketImplFactory(Ljava/net/SocketImplFactory;)V"/>
+ <method name="setTcpNoDelay(Z)V"/>
+ <method name="setTrafficClass(I)V"/>
+ <method name="shutdownInput()V"/>
+ <method name="shutdownOutput()V"/>
+ </class>
+ <class name="java/net/SocketAddress" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/net/SocketException" since="1">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/net/SocketImpl" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/net/SocketOptions"/>
+ <method name="&lt;init>()V"/>
+ <method name="accept(Ljava/net/SocketImpl;)V"/>
+ <method name="available()I"/>
+ <method name="bind(Ljava/net/InetAddress;I)V"/>
+ <method name="close()V"/>
+ <method name="connect(Ljava/lang/String;I)V"/>
+ <method name="connect(Ljava/net/InetAddress;I)V"/>
+ <method name="connect(Ljava/net/SocketAddress;I)V"/>
+ <method name="create(Z)V"/>
+ <method name="getFileDescriptor()Ljava/io/FileDescriptor;"/>
+ <method name="getInetAddress()Ljava/net/InetAddress;"/>
+ <method name="getInputStream()Ljava/io/InputStream;"/>
+ <method name="getLocalPort()I"/>
+ <method name="getOutputStream()Ljava/io/OutputStream;"/>
+ <method name="getPort()I"/>
+ <method name="listen(I)V"/>
+ <method name="sendUrgentData(I)V"/>
+ <method name="setPerformancePreferences(III)V"/>
+ <method name="shutdownInput()V"/>
+ <method name="shutdownOutput()V"/>
+ <method name="supportsUrgentData()Z"/>
+ <field name="address"/>
+ <field name="fd"/>
+ <field name="localport"/>
+ <field name="port"/>
+ </class>
+ <class name="java/net/SocketImplFactory" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="createSocketImpl()Ljava/net/SocketImpl;"/>
+ </class>
+ <class name="java/net/SocketOption" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="name()Ljava/lang/String;"/>
+ <method name="type()Ljava/lang/Class;"/>
+ </class>
+ <class name="java/net/SocketOptions" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getOption(I)Ljava/lang/Object;"/>
+ <method name="setOption(ILjava/lang/Object;)V"/>
+ <field name="IP_MULTICAST_IF"/>
+ <field name="IP_MULTICAST_IF2"/>
+ <field name="IP_MULTICAST_LOOP"/>
+ <field name="IP_TOS"/>
+ <field name="SO_BINDADDR"/>
+ <field name="SO_BROADCAST"/>
+ <field name="SO_KEEPALIVE"/>
+ <field name="SO_LINGER"/>
+ <field name="SO_OOBINLINE"/>
+ <field name="SO_RCVBUF"/>
+ <field name="SO_REUSEADDR"/>
+ <field name="SO_SNDBUF"/>
+ <field name="SO_TIMEOUT"/>
+ <field name="TCP_NODELAY"/>
+ </class>
+ <class name="java/net/SocketPermission" since="1">
+ <extends name="java/security/Permission"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/net/SocketTimeoutException" since="1">
+ <extends name="java/io/InterruptedIOException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/net/StandardProtocolFamily" since="24">
+ <extends name="java/lang/Enum"/>
+ <implements name="java/net/ProtocolFamily"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/net/StandardProtocolFamily;"/>
+ <method name="values()[Ljava/net/StandardProtocolFamily;"/>
+ <field name="INET"/>
+ <field name="INET6"/>
+ </class>
+ <class name="java/net/StandardSocketOptions" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="IP_MULTICAST_IF"/>
+ <field name="IP_MULTICAST_LOOP"/>
+ <field name="IP_MULTICAST_TTL"/>
+ <field name="IP_TOS"/>
+ <field name="SO_BROADCAST"/>
+ <field name="SO_KEEPALIVE"/>
+ <field name="SO_LINGER"/>
+ <field name="SO_RCVBUF"/>
+ <field name="SO_REUSEADDR"/>
+ <field name="SO_SNDBUF"/>
+ <field name="TCP_NODELAY"/>
+ </class>
+ <class name="java/net/URI" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="compareTo(Ljava/net/URI;)I"/>
+ <method name="create(Ljava/lang/String;)Ljava/net/URI;"/>
+ <method name="getAuthority()Ljava/lang/String;"/>
+ <method name="getFragment()Ljava/lang/String;"/>
+ <method name="getHost()Ljava/lang/String;"/>
+ <method name="getPath()Ljava/lang/String;"/>
+ <method name="getPort()I"/>
+ <method name="getQuery()Ljava/lang/String;"/>
+ <method name="getRawAuthority()Ljava/lang/String;"/>
+ <method name="getRawFragment()Ljava/lang/String;"/>
+ <method name="getRawPath()Ljava/lang/String;"/>
+ <method name="getRawQuery()Ljava/lang/String;"/>
+ <method name="getRawSchemeSpecificPart()Ljava/lang/String;"/>
+ <method name="getRawUserInfo()Ljava/lang/String;"/>
+ <method name="getScheme()Ljava/lang/String;"/>
+ <method name="getSchemeSpecificPart()Ljava/lang/String;"/>
+ <method name="getUserInfo()Ljava/lang/String;"/>
+ <method name="isAbsolute()Z"/>
+ <method name="isOpaque()Z"/>
+ <method name="normalize()Ljava/net/URI;"/>
+ <method name="parseServerAuthority()Ljava/net/URI;"/>
+ <method name="relativize(Ljava/net/URI;)Ljava/net/URI;"/>
+ <method name="resolve(Ljava/lang/String;)Ljava/net/URI;"/>
+ <method name="resolve(Ljava/net/URI;)Ljava/net/URI;"/>
+ <method name="toASCIIString()Ljava/lang/String;"/>
+ <method name="toURL()Ljava/net/URL;"/>
+ </class>
+ <class name="java/net/URISyntaxException" since="1">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V"/>
+ <method name="getIndex()I"/>
+ <method name="getInput()Ljava/lang/String;"/>
+ <method name="getReason()Ljava/lang/String;"/>
+ </class>
+ <class name="java/net/URL" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/net/URLStreamHandler;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/net/URL;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/net/URL;Ljava/lang/String;Ljava/net/URLStreamHandler;)V"/>
+ <method name="getAuthority()Ljava/lang/String;"/>
+ <method name="getContent()Ljava/lang/Object;"/>
+ <method name="getContent([Ljava/lang/Class;)Ljava/lang/Object;"/>
+ <method name="getDefaultPort()I"/>
+ <method name="getFile()Ljava/lang/String;"/>
+ <method name="getHost()Ljava/lang/String;"/>
+ <method name="getPath()Ljava/lang/String;"/>
+ <method name="getPort()I"/>
+ <method name="getProtocol()Ljava/lang/String;"/>
+ <method name="getQuery()Ljava/lang/String;"/>
+ <method name="getRef()Ljava/lang/String;"/>
+ <method name="getUserInfo()Ljava/lang/String;"/>
+ <method name="openConnection()Ljava/net/URLConnection;"/>
+ <method name="openConnection(Ljava/net/Proxy;)Ljava/net/URLConnection;"/>
+ <method name="openStream()Ljava/io/InputStream;"/>
+ <method name="sameFile(Ljava/net/URL;)Z"/>
+ <method name="set(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V" removed="26"/>
+ <method name="set(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" removed="26"/>
+ <method name="setURLStreamHandlerFactory(Ljava/net/URLStreamHandlerFactory;)V"/>
+ <method name="toExternalForm()Ljava/lang/String;"/>
+ <method name="toURI()Ljava/net/URI;"/>
+ </class>
+ <class name="java/net/URLClassLoader" since="1">
+ <extends name="java/security/SecureClassLoader"/>
+ <implements name="java/io/Closeable" since="24"/>
+ <method name="&lt;init>([Ljava/net/URL;)V"/>
+ <method name="&lt;init>([Ljava/net/URL;Ljava/lang/ClassLoader;)V"/>
+ <method name="&lt;init>([Ljava/net/URL;Ljava/lang/ClassLoader;Ljava/net/URLStreamHandlerFactory;)V"/>
+ <method name="addURL(Ljava/net/URL;)V"/>
+ <method name="definePackage(Ljava/lang/String;Ljava/util/jar/Manifest;Ljava/net/URL;)Ljava/lang/Package;"/>
+ <method name="getURLs()[Ljava/net/URL;"/>
+ <method name="newInstance([Ljava/net/URL;)Ljava/net/URLClassLoader;"/>
+ <method name="newInstance([Ljava/net/URL;Ljava/lang/ClassLoader;)Ljava/net/URLClassLoader;"/>
+ </class>
+ <class name="java/net/URLConnection" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/net/URL;)V"/>
+ <method name="addRequestProperty(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="connect()V"/>
+ <method name="getAllowUserInteraction()Z"/>
+ <method name="getConnectTimeout()I"/>
+ <method name="getContent()Ljava/lang/Object;"/>
+ <method name="getContent([Ljava/lang/Class;)Ljava/lang/Object;"/>
+ <method name="getContentEncoding()Ljava/lang/String;"/>
+ <method name="getContentLength()I"/>
+ <method name="getContentLengthLong()J" since="24"/>
+ <method name="getContentType()Ljava/lang/String;"/>
+ <method name="getDate()J"/>
+ <method name="getDefaultAllowUserInteraction()Z"/>
+ <method name="getDefaultRequestProperty(Ljava/lang/String;)Ljava/lang/String;" deprecated="16"/>
+ <method name="getDefaultUseCaches()Z"/>
+ <method name="getDoInput()Z"/>
+ <method name="getDoOutput()Z"/>
+ <method name="getExpiration()J"/>
+ <method name="getFileNameMap()Ljava/net/FileNameMap;"/>
+ <method name="getHeaderField(I)Ljava/lang/String;"/>
+ <method name="getHeaderField(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getHeaderFieldDate(Ljava/lang/String;J)J"/>
+ <method name="getHeaderFieldInt(Ljava/lang/String;I)I"/>
+ <method name="getHeaderFieldKey(I)Ljava/lang/String;"/>
+ <method name="getHeaderFieldLong(Ljava/lang/String;J)J" since="24"/>
+ <method name="getHeaderFields()Ljava/util/Map;"/>
+ <method name="getIfModifiedSince()J"/>
+ <method name="getInputStream()Ljava/io/InputStream;"/>
+ <method name="getLastModified()J"/>
+ <method name="getOutputStream()Ljava/io/OutputStream;"/>
+ <method name="getPermission()Ljava/security/Permission;"/>
+ <method name="getReadTimeout()I"/>
+ <method name="getRequestProperties()Ljava/util/Map;"/>
+ <method name="getRequestProperty(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getURL()Ljava/net/URL;"/>
+ <method name="getUseCaches()Z"/>
+ <method name="guessContentTypeFromName(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="guessContentTypeFromStream(Ljava/io/InputStream;)Ljava/lang/String;"/>
+ <method name="setAllowUserInteraction(Z)V"/>
+ <method name="setConnectTimeout(I)V"/>
+ <method name="setContentHandlerFactory(Ljava/net/ContentHandlerFactory;)V"/>
+ <method name="setDefaultAllowUserInteraction(Z)V"/>
+ <method name="setDefaultRequestProperty(Ljava/lang/String;Ljava/lang/String;)V" deprecated="16"/>
+ <method name="setDefaultUseCaches(Z)V"/>
+ <method name="setDoInput(Z)V"/>
+ <method name="setDoOutput(Z)V"/>
+ <method name="setFileNameMap(Ljava/net/FileNameMap;)V"/>
+ <method name="setIfModifiedSince(J)V"/>
+ <method name="setReadTimeout(I)V"/>
+ <method name="setRequestProperty(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="setUseCaches(Z)V"/>
+ <field name="allowUserInteraction"/>
+ <field name="connected"/>
+ <field name="doInput"/>
+ <field name="doOutput"/>
+ <field name="ifModifiedSince"/>
+ <field name="url"/>
+ <field name="useCaches"/>
+ </class>
+ <class name="java/net/URLDecoder" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="decode(Ljava/lang/String;)Ljava/lang/String;" deprecated="16"/>
+ <method name="decode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ </class>
+ <class name="java/net/URLEncoder" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="encode(Ljava/lang/String;)Ljava/lang/String;" deprecated="16"/>
+ <method name="encode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ </class>
+ <class name="java/net/URLStreamHandler" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="equals(Ljava/net/URL;Ljava/net/URL;)Z"/>
+ <method name="getDefaultPort()I"/>
+ <method name="getHostAddress(Ljava/net/URL;)Ljava/net/InetAddress;"/>
+ <method name="hashCode(Ljava/net/URL;)I"/>
+ <method name="hostsEqual(Ljava/net/URL;Ljava/net/URL;)Z"/>
+ <method name="openConnection(Ljava/net/URL;)Ljava/net/URLConnection;"/>
+ <method name="openConnection(Ljava/net/URL;Ljava/net/Proxy;)Ljava/net/URLConnection;"/>
+ <method name="parseURL(Ljava/net/URL;Ljava/lang/String;II)V"/>
+ <method name="sameFile(Ljava/net/URL;Ljava/net/URL;)Z"/>
+ <method name="setURL(Ljava/net/URL;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V" deprecated="16"/>
+ <method name="setURL(Ljava/net/URL;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="toExternalForm(Ljava/net/URL;)Ljava/lang/String;"/>
+ </class>
+ <class name="java/net/URLStreamHandlerFactory" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="createURLStreamHandler(Ljava/lang/String;)Ljava/net/URLStreamHandler;"/>
+ </class>
+ <class name="java/net/UnknownHostException" since="1">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/net/UnknownServiceException" since="1">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/nio/Buffer" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="array()Ljava/lang/Object;" since="9"/>
+ <method name="arrayOffset()I" since="9"/>
+ <method name="capacity()I"/>
+ <method name="clear()Ljava/nio/Buffer;"/>
+ <method name="flip()Ljava/nio/Buffer;"/>
+ <method name="hasArray()Z" since="9"/>
+ <method name="hasRemaining()Z"/>
+ <method name="isDirect()Z" since="9"/>
+ <method name="isReadOnly()Z"/>
+ <method name="limit()I"/>
+ <method name="limit(I)Ljava/nio/Buffer;"/>
+ <method name="mark()Ljava/nio/Buffer;"/>
+ <method name="position()I"/>
+ <method name="position(I)Ljava/nio/Buffer;"/>
+ <method name="remaining()I"/>
+ <method name="reset()Ljava/nio/Buffer;"/>
+ <method name="rewind()Ljava/nio/Buffer;"/>
+ </class>
+ <class name="java/nio/BufferOverflowException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/BufferUnderflowException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/ByteBuffer" since="1">
+ <extends name="java/nio/Buffer"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>()V"/>
+ <method name="allocate(I)Ljava/nio/ByteBuffer;"/>
+ <method name="allocateDirect(I)Ljava/nio/ByteBuffer;"/>
+ <method name="array()[B"/>
+ <method name="arrayOffset()I"/>
+ <method name="asCharBuffer()Ljava/nio/CharBuffer;"/>
+ <method name="asDoubleBuffer()Ljava/nio/DoubleBuffer;"/>
+ <method name="asFloatBuffer()Ljava/nio/FloatBuffer;"/>
+ <method name="asIntBuffer()Ljava/nio/IntBuffer;"/>
+ <method name="asLongBuffer()Ljava/nio/LongBuffer;"/>
+ <method name="asReadOnlyBuffer()Ljava/nio/ByteBuffer;"/>
+ <method name="asShortBuffer()Ljava/nio/ShortBuffer;"/>
+ <method name="compact()Ljava/nio/ByteBuffer;"/>
+ <method name="compareTo(Ljava/nio/ByteBuffer;)I"/>
+ <method name="duplicate()Ljava/nio/ByteBuffer;"/>
+ <method name="get()B"/>
+ <method name="get(I)B"/>
+ <method name="get([B)Ljava/nio/ByteBuffer;"/>
+ <method name="get([BII)Ljava/nio/ByteBuffer;"/>
+ <method name="getChar()C"/>
+ <method name="getChar(I)C"/>
+ <method name="getDouble()D"/>
+ <method name="getDouble(I)D"/>
+ <method name="getFloat()F"/>
+ <method name="getFloat(I)F"/>
+ <method name="getInt()I"/>
+ <method name="getInt(I)I"/>
+ <method name="getLong()J"/>
+ <method name="getLong(I)J"/>
+ <method name="getShort()S"/>
+ <method name="getShort(I)S"/>
+ <method name="hasArray()Z"/>
+ <method name="isDirect()Z"/>
+ <method name="order()Ljava/nio/ByteOrder;"/>
+ <method name="order(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;"/>
+ <method name="put(B)Ljava/nio/ByteBuffer;"/>
+ <method name="put(IB)Ljava/nio/ByteBuffer;"/>
+ <method name="put(Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;"/>
+ <method name="put([B)Ljava/nio/ByteBuffer;"/>
+ <method name="put([BII)Ljava/nio/ByteBuffer;"/>
+ <method name="putChar(C)Ljava/nio/ByteBuffer;"/>
+ <method name="putChar(IC)Ljava/nio/ByteBuffer;"/>
+ <method name="putDouble(D)Ljava/nio/ByteBuffer;"/>
+ <method name="putDouble(ID)Ljava/nio/ByteBuffer;"/>
+ <method name="putFloat(F)Ljava/nio/ByteBuffer;"/>
+ <method name="putFloat(IF)Ljava/nio/ByteBuffer;"/>
+ <method name="putInt(I)Ljava/nio/ByteBuffer;"/>
+ <method name="putInt(II)Ljava/nio/ByteBuffer;"/>
+ <method name="putLong(IJ)Ljava/nio/ByteBuffer;"/>
+ <method name="putLong(J)Ljava/nio/ByteBuffer;"/>
+ <method name="putShort(IS)Ljava/nio/ByteBuffer;"/>
+ <method name="putShort(S)Ljava/nio/ByteBuffer;"/>
+ <method name="slice()Ljava/nio/ByteBuffer;"/>
+ <method name="wrap([B)Ljava/nio/ByteBuffer;"/>
+ <method name="wrap([BII)Ljava/nio/ByteBuffer;"/>
+ </class>
+ <class name="java/nio/ByteOrder" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="nativeOrder()Ljava/nio/ByteOrder;"/>
+ <field name="BIG_ENDIAN"/>
+ <field name="LITTLE_ENDIAN"/>
+ </class>
+ <class name="java/nio/CharBuffer" since="1">
+ <extends name="java/nio/Buffer"/>
+ <implements name="java/lang/Appendable"/>
+ <implements name="java/lang/CharSequence"/>
+ <implements name="java/lang/Comparable"/>
+ <implements name="java/lang/Readable"/>
+ <method name="&lt;init>()V"/>
+ <method name="allocate(I)Ljava/nio/CharBuffer;"/>
+ <method name="append(C)Ljava/nio/CharBuffer;"/>
+ <method name="append(Ljava/lang/CharSequence;)Ljava/nio/CharBuffer;"/>
+ <method name="append(Ljava/lang/CharSequence;II)Ljava/nio/CharBuffer;"/>
+ <method name="array()[C"/>
+ <method name="arrayOffset()I"/>
+ <method name="asReadOnlyBuffer()Ljava/nio/CharBuffer;"/>
+ <method name="compact()Ljava/nio/CharBuffer;"/>
+ <method name="compareTo(Ljava/nio/CharBuffer;)I"/>
+ <method name="duplicate()Ljava/nio/CharBuffer;"/>
+ <method name="get()C"/>
+ <method name="get(I)C"/>
+ <method name="get([C)Ljava/nio/CharBuffer;"/>
+ <method name="get([CII)Ljava/nio/CharBuffer;"/>
+ <method name="hasArray()Z"/>
+ <method name="isDirect()Z"/>
+ <method name="order()Ljava/nio/ByteOrder;"/>
+ <method name="put(C)Ljava/nio/CharBuffer;"/>
+ <method name="put(IC)Ljava/nio/CharBuffer;"/>
+ <method name="put(Ljava/lang/String;)Ljava/nio/CharBuffer;"/>
+ <method name="put(Ljava/lang/String;II)Ljava/nio/CharBuffer;"/>
+ <method name="put(Ljava/nio/CharBuffer;)Ljava/nio/CharBuffer;"/>
+ <method name="put([C)Ljava/nio/CharBuffer;"/>
+ <method name="put([CII)Ljava/nio/CharBuffer;"/>
+ <method name="slice()Ljava/nio/CharBuffer;"/>
+ <method name="subSequence(II)Ljava/nio/CharBuffer;" since="19"/>
+ <method name="wrap(Ljava/lang/CharSequence;)Ljava/nio/CharBuffer;"/>
+ <method name="wrap(Ljava/lang/CharSequence;II)Ljava/nio/CharBuffer;"/>
+ <method name="wrap([C)Ljava/nio/CharBuffer;"/>
+ <method name="wrap([CII)Ljava/nio/CharBuffer;"/>
+ </class>
+ <class name="java/nio/DoubleBuffer" since="1">
+ <extends name="java/nio/Buffer"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>()V"/>
+ <method name="allocate(I)Ljava/nio/DoubleBuffer;"/>
+ <method name="array()[D"/>
+ <method name="arrayOffset()I"/>
+ <method name="asReadOnlyBuffer()Ljava/nio/DoubleBuffer;"/>
+ <method name="compact()Ljava/nio/DoubleBuffer;"/>
+ <method name="compareTo(Ljava/nio/DoubleBuffer;)I"/>
+ <method name="duplicate()Ljava/nio/DoubleBuffer;"/>
+ <method name="get()D"/>
+ <method name="get(I)D"/>
+ <method name="get([D)Ljava/nio/DoubleBuffer;"/>
+ <method name="get([DII)Ljava/nio/DoubleBuffer;"/>
+ <method name="hasArray()Z"/>
+ <method name="isDirect()Z"/>
+ <method name="order()Ljava/nio/ByteOrder;"/>
+ <method name="put(D)Ljava/nio/DoubleBuffer;"/>
+ <method name="put(ID)Ljava/nio/DoubleBuffer;"/>
+ <method name="put(Ljava/nio/DoubleBuffer;)Ljava/nio/DoubleBuffer;"/>
+ <method name="put([D)Ljava/nio/DoubleBuffer;"/>
+ <method name="put([DII)Ljava/nio/DoubleBuffer;"/>
+ <method name="slice()Ljava/nio/DoubleBuffer;"/>
+ <method name="wrap([D)Ljava/nio/DoubleBuffer;"/>
+ <method name="wrap([DII)Ljava/nio/DoubleBuffer;"/>
+ </class>
+ <class name="java/nio/FloatBuffer" since="1">
+ <extends name="java/nio/Buffer"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>()V"/>
+ <method name="allocate(I)Ljava/nio/FloatBuffer;"/>
+ <method name="array()[F"/>
+ <method name="arrayOffset()I"/>
+ <method name="asReadOnlyBuffer()Ljava/nio/FloatBuffer;"/>
+ <method name="compact()Ljava/nio/FloatBuffer;"/>
+ <method name="compareTo(Ljava/nio/FloatBuffer;)I"/>
+ <method name="duplicate()Ljava/nio/FloatBuffer;"/>
+ <method name="get()F"/>
+ <method name="get(I)F"/>
+ <method name="get([F)Ljava/nio/FloatBuffer;"/>
+ <method name="get([FII)Ljava/nio/FloatBuffer;"/>
+ <method name="hasArray()Z"/>
+ <method name="isDirect()Z"/>
+ <method name="order()Ljava/nio/ByteOrder;"/>
+ <method name="put(F)Ljava/nio/FloatBuffer;"/>
+ <method name="put(IF)Ljava/nio/FloatBuffer;"/>
+ <method name="put(Ljava/nio/FloatBuffer;)Ljava/nio/FloatBuffer;"/>
+ <method name="put([F)Ljava/nio/FloatBuffer;"/>
+ <method name="put([FII)Ljava/nio/FloatBuffer;"/>
+ <method name="slice()Ljava/nio/FloatBuffer;"/>
+ <method name="wrap([F)Ljava/nio/FloatBuffer;"/>
+ <method name="wrap([FII)Ljava/nio/FloatBuffer;"/>
+ </class>
+ <class name="java/nio/IntBuffer" since="1">
+ <extends name="java/nio/Buffer"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>()V"/>
+ <method name="allocate(I)Ljava/nio/IntBuffer;"/>
+ <method name="array()[I"/>
+ <method name="arrayOffset()I"/>
+ <method name="asReadOnlyBuffer()Ljava/nio/IntBuffer;"/>
+ <method name="compact()Ljava/nio/IntBuffer;"/>
+ <method name="compareTo(Ljava/nio/IntBuffer;)I"/>
+ <method name="duplicate()Ljava/nio/IntBuffer;"/>
+ <method name="get()I"/>
+ <method name="get(I)I"/>
+ <method name="get([I)Ljava/nio/IntBuffer;"/>
+ <method name="get([III)Ljava/nio/IntBuffer;"/>
+ <method name="hasArray()Z"/>
+ <method name="isDirect()Z"/>
+ <method name="order()Ljava/nio/ByteOrder;"/>
+ <method name="put(I)Ljava/nio/IntBuffer;"/>
+ <method name="put(II)Ljava/nio/IntBuffer;"/>
+ <method name="put(Ljava/nio/IntBuffer;)Ljava/nio/IntBuffer;"/>
+ <method name="put([I)Ljava/nio/IntBuffer;"/>
+ <method name="put([III)Ljava/nio/IntBuffer;"/>
+ <method name="slice()Ljava/nio/IntBuffer;"/>
+ <method name="wrap([I)Ljava/nio/IntBuffer;"/>
+ <method name="wrap([III)Ljava/nio/IntBuffer;"/>
+ </class>
+ <class name="java/nio/InvalidMarkException" since="1">
+ <extends name="java/lang/IllegalStateException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/LongBuffer" since="1">
+ <extends name="java/nio/Buffer"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>()V"/>
+ <method name="allocate(I)Ljava/nio/LongBuffer;"/>
+ <method name="array()[J"/>
+ <method name="arrayOffset()I"/>
+ <method name="asReadOnlyBuffer()Ljava/nio/LongBuffer;"/>
+ <method name="compact()Ljava/nio/LongBuffer;"/>
+ <method name="compareTo(Ljava/nio/LongBuffer;)I"/>
+ <method name="duplicate()Ljava/nio/LongBuffer;"/>
+ <method name="get()J"/>
+ <method name="get(I)J"/>
+ <method name="get([J)Ljava/nio/LongBuffer;"/>
+ <method name="get([JII)Ljava/nio/LongBuffer;"/>
+ <method name="hasArray()Z"/>
+ <method name="isDirect()Z"/>
+ <method name="order()Ljava/nio/ByteOrder;"/>
+ <method name="put(IJ)Ljava/nio/LongBuffer;"/>
+ <method name="put(J)Ljava/nio/LongBuffer;"/>
+ <method name="put(Ljava/nio/LongBuffer;)Ljava/nio/LongBuffer;"/>
+ <method name="put([J)Ljava/nio/LongBuffer;"/>
+ <method name="put([JII)Ljava/nio/LongBuffer;"/>
+ <method name="slice()Ljava/nio/LongBuffer;"/>
+ <method name="wrap([J)Ljava/nio/LongBuffer;"/>
+ <method name="wrap([JII)Ljava/nio/LongBuffer;"/>
+ </class>
+ <class name="java/nio/MappedByteBuffer" since="1">
+ <extends name="java/nio/ByteBuffer"/>
+ <method name="&lt;init>()V"/>
+ <method name="force()Ljava/nio/MappedByteBuffer;"/>
+ <method name="isLoaded()Z"/>
+ <method name="load()Ljava/nio/MappedByteBuffer;"/>
+ </class>
+ <class name="java/nio/ReadOnlyBufferException" since="1">
+ <extends name="java/lang/UnsupportedOperationException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/ShortBuffer" since="1">
+ <extends name="java/nio/Buffer"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>()V"/>
+ <method name="allocate(I)Ljava/nio/ShortBuffer;"/>
+ <method name="array()[S"/>
+ <method name="arrayOffset()I"/>
+ <method name="asReadOnlyBuffer()Ljava/nio/ShortBuffer;"/>
+ <method name="compact()Ljava/nio/ShortBuffer;"/>
+ <method name="compareTo(Ljava/nio/ShortBuffer;)I"/>
+ <method name="duplicate()Ljava/nio/ShortBuffer;"/>
+ <method name="get()S"/>
+ <method name="get(I)S"/>
+ <method name="get([S)Ljava/nio/ShortBuffer;"/>
+ <method name="get([SII)Ljava/nio/ShortBuffer;"/>
+ <method name="hasArray()Z"/>
+ <method name="isDirect()Z"/>
+ <method name="order()Ljava/nio/ByteOrder;"/>
+ <method name="put(IS)Ljava/nio/ShortBuffer;"/>
+ <method name="put(Ljava/nio/ShortBuffer;)Ljava/nio/ShortBuffer;"/>
+ <method name="put(S)Ljava/nio/ShortBuffer;"/>
+ <method name="put([S)Ljava/nio/ShortBuffer;"/>
+ <method name="put([SII)Ljava/nio/ShortBuffer;"/>
+ <method name="slice()Ljava/nio/ShortBuffer;"/>
+ <method name="wrap([S)Ljava/nio/ShortBuffer;"/>
+ <method name="wrap([SII)Ljava/nio/ShortBuffer;"/>
+ </class>
+ <class name="java/nio/channels/AcceptPendingException" since="26">
+ <extends name="java/lang/IllegalStateException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/channels/AlreadyBoundException" since="24">
+ <extends name="java/lang/IllegalStateException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/channels/AlreadyConnectedException" since="1">
+ <extends name="java/lang/IllegalStateException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/channels/AsynchronousByteChannel" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/channels/AsynchronousChannel"/>
+ <method name="read(Ljava/nio/ByteBuffer;)Ljava/util/concurrent/Future;"/>
+ <method name="read(Ljava/nio/ByteBuffer;Ljava/lang/Object;Ljava/nio/channels/CompletionHandler;)V"/>
+ <method name="write(Ljava/nio/ByteBuffer;)Ljava/util/concurrent/Future;"/>
+ <method name="write(Ljava/nio/ByteBuffer;Ljava/lang/Object;Ljava/nio/channels/CompletionHandler;)V"/>
+ </class>
+ <class name="java/nio/channels/AsynchronousChannel" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/channels/Channel"/>
+ </class>
+ <class name="java/nio/channels/AsynchronousChannelGroup" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/nio/channels/spi/AsynchronousChannelProvider;)V"/>
+ <method name="awaitTermination(JLjava/util/concurrent/TimeUnit;)Z"/>
+ <method name="isShutdown()Z"/>
+ <method name="isTerminated()Z"/>
+ <method name="provider()Ljava/nio/channels/spi/AsynchronousChannelProvider;"/>
+ <method name="shutdown()V"/>
+ <method name="shutdownNow()V"/>
+ <method name="withCachedThreadPool(Ljava/util/concurrent/ExecutorService;I)Ljava/nio/channels/AsynchronousChannelGroup;"/>
+ <method name="withFixedThreadPool(ILjava/util/concurrent/ThreadFactory;)Ljava/nio/channels/AsynchronousChannelGroup;"/>
+ <method name="withThreadPool(Ljava/util/concurrent/ExecutorService;)Ljava/nio/channels/AsynchronousChannelGroup;"/>
+ </class>
+ <class name="java/nio/channels/AsynchronousCloseException" since="1">
+ <extends name="java/nio/channels/ClosedChannelException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/channels/AsynchronousFileChannel" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/channels/AsynchronousChannel"/>
+ <method name="&lt;init>()V"/>
+ <method name="force(Z)V"/>
+ <method name="lock()Ljava/util/concurrent/Future;"/>
+ <method name="lock(JJZ)Ljava/util/concurrent/Future;"/>
+ <method name="lock(JJZLjava/lang/Object;Ljava/nio/channels/CompletionHandler;)V"/>
+ <method name="lock(Ljava/lang/Object;Ljava/nio/channels/CompletionHandler;)V"/>
+ <method name="open(Ljava/nio/file/Path;Ljava/util/Set;Ljava/util/concurrent/ExecutorService;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/channels/AsynchronousFileChannel;"/>
+ <method name="open(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/nio/channels/AsynchronousFileChannel;"/>
+ <method name="read(Ljava/nio/ByteBuffer;J)Ljava/util/concurrent/Future;"/>
+ <method name="read(Ljava/nio/ByteBuffer;JLjava/lang/Object;Ljava/nio/channels/CompletionHandler;)V"/>
+ <method name="size()J"/>
+ <method name="truncate(J)Ljava/nio/channels/AsynchronousFileChannel;"/>
+ <method name="tryLock()Ljava/nio/channels/FileLock;"/>
+ <method name="tryLock(JJZ)Ljava/nio/channels/FileLock;"/>
+ <method name="write(Ljava/nio/ByteBuffer;J)Ljava/util/concurrent/Future;"/>
+ <method name="write(Ljava/nio/ByteBuffer;JLjava/lang/Object;Ljava/nio/channels/CompletionHandler;)V"/>
+ </class>
+ <class name="java/nio/channels/AsynchronousServerSocketChannel" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/channels/AsynchronousChannel"/>
+ <implements name="java/nio/channels/NetworkChannel"/>
+ <method name="&lt;init>(Ljava/nio/channels/spi/AsynchronousChannelProvider;)V"/>
+ <method name="accept()Ljava/util/concurrent/Future;"/>
+ <method name="accept(Ljava/lang/Object;Ljava/nio/channels/CompletionHandler;)V"/>
+ <method name="bind(Ljava/net/SocketAddress;)Ljava/nio/channels/AsynchronousServerSocketChannel;"/>
+ <method name="bind(Ljava/net/SocketAddress;I)Ljava/nio/channels/AsynchronousServerSocketChannel;"/>
+ <method name="open()Ljava/nio/channels/AsynchronousServerSocketChannel;"/>
+ <method name="open(Ljava/nio/channels/AsynchronousChannelGroup;)Ljava/nio/channels/AsynchronousServerSocketChannel;"/>
+ <method name="provider()Ljava/nio/channels/spi/AsynchronousChannelProvider;"/>
+ <method name="setOption(Ljava/net/SocketOption;Ljava/lang/Object;)Ljava/nio/channels/AsynchronousServerSocketChannel;"/>
+ </class>
+ <class name="java/nio/channels/AsynchronousSocketChannel" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/channels/AsynchronousByteChannel"/>
+ <implements name="java/nio/channels/NetworkChannel"/>
+ <method name="&lt;init>(Ljava/nio/channels/spi/AsynchronousChannelProvider;)V"/>
+ <method name="bind(Ljava/net/SocketAddress;)Ljava/nio/channels/AsynchronousSocketChannel;"/>
+ <method name="connect(Ljava/net/SocketAddress;)Ljava/util/concurrent/Future;"/>
+ <method name="connect(Ljava/net/SocketAddress;Ljava/lang/Object;Ljava/nio/channels/CompletionHandler;)V"/>
+ <method name="getRemoteAddress()Ljava/net/SocketAddress;"/>
+ <method name="open()Ljava/nio/channels/AsynchronousSocketChannel;"/>
+ <method name="open(Ljava/nio/channels/AsynchronousChannelGroup;)Ljava/nio/channels/AsynchronousSocketChannel;"/>
+ <method name="provider()Ljava/nio/channels/spi/AsynchronousChannelProvider;"/>
+ <method name="read(Ljava/nio/ByteBuffer;JLjava/util/concurrent/TimeUnit;Ljava/lang/Object;Ljava/nio/channels/CompletionHandler;)V"/>
+ <method name="read([Ljava/nio/ByteBuffer;IIJLjava/util/concurrent/TimeUnit;Ljava/lang/Object;Ljava/nio/channels/CompletionHandler;)V"/>
+ <method name="setOption(Ljava/net/SocketOption;Ljava/lang/Object;)Ljava/nio/channels/AsynchronousSocketChannel;"/>
+ <method name="shutdownInput()Ljava/nio/channels/AsynchronousSocketChannel;"/>
+ <method name="shutdownOutput()Ljava/nio/channels/AsynchronousSocketChannel;"/>
+ <method name="write(Ljava/nio/ByteBuffer;JLjava/util/concurrent/TimeUnit;Ljava/lang/Object;Ljava/nio/channels/CompletionHandler;)V"/>
+ <method name="write([Ljava/nio/ByteBuffer;IIJLjava/util/concurrent/TimeUnit;Ljava/lang/Object;Ljava/nio/channels/CompletionHandler;)V"/>
+ </class>
+ <class name="java/nio/channels/ByteChannel" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/channels/ReadableByteChannel"/>
+ <implements name="java/nio/channels/WritableByteChannel"/>
+ </class>
+ <class name="java/nio/channels/CancelledKeyException" since="1">
+ <extends name="java/lang/IllegalStateException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/channels/Channel" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable"/>
+ <method name="isOpen()Z"/>
+ </class>
+ <class name="java/nio/channels/Channels" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="newChannel(Ljava/io/InputStream;)Ljava/nio/channels/ReadableByteChannel;"/>
+ <method name="newChannel(Ljava/io/OutputStream;)Ljava/nio/channels/WritableByteChannel;"/>
+ <method name="newInputStream(Ljava/nio/channels/AsynchronousByteChannel;)Ljava/io/InputStream;" since="26"/>
+ <method name="newInputStream(Ljava/nio/channels/ReadableByteChannel;)Ljava/io/InputStream;"/>
+ <method name="newOutputStream(Ljava/nio/channels/AsynchronousByteChannel;)Ljava/io/OutputStream;" since="26"/>
+ <method name="newOutputStream(Ljava/nio/channels/WritableByteChannel;)Ljava/io/OutputStream;"/>
+ <method name="newReader(Ljava/nio/channels/ReadableByteChannel;Ljava/lang/String;)Ljava/io/Reader;"/>
+ <method name="newReader(Ljava/nio/channels/ReadableByteChannel;Ljava/nio/charset/CharsetDecoder;I)Ljava/io/Reader;"/>
+ <method name="newWriter(Ljava/nio/channels/WritableByteChannel;Ljava/lang/String;)Ljava/io/Writer;"/>
+ <method name="newWriter(Ljava/nio/channels/WritableByteChannel;Ljava/nio/charset/CharsetEncoder;I)Ljava/io/Writer;"/>
+ </class>
+ <class name="java/nio/channels/ClosedByInterruptException" since="1">
+ <extends name="java/nio/channels/AsynchronousCloseException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/channels/ClosedChannelException" since="1">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/channels/ClosedSelectorException" since="1">
+ <extends name="java/lang/IllegalStateException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/channels/CompletionHandler" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="completed(Ljava/lang/Object;Ljava/lang/Object;)V"/>
+ <method name="failed(Ljava/lang/Throwable;Ljava/lang/Object;)V"/>
+ </class>
+ <class name="java/nio/channels/ConnectionPendingException" since="1">
+ <extends name="java/lang/IllegalStateException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/channels/DatagramChannel" since="1">
+ <extends name="java/nio/channels/spi/AbstractSelectableChannel"/>
+ <implements name="java/nio/channels/ByteChannel"/>
+ <implements name="java/nio/channels/GatheringByteChannel"/>
+ <implements name="java/nio/channels/MulticastChannel" since="26"/>
+ <implements name="java/nio/channels/NetworkChannel" since="24" removed="26"/>
+ <implements name="java/nio/channels/ScatteringByteChannel"/>
+ <method name="&lt;init>(Ljava/nio/channels/spi/SelectorProvider;)V"/>
+ <method name="bind(Ljava/net/SocketAddress;)Ljava/nio/channels/DatagramChannel;" since="24"/>
+ <method name="connect(Ljava/net/SocketAddress;)Ljava/nio/channels/DatagramChannel;"/>
+ <method name="disconnect()Ljava/nio/channels/DatagramChannel;"/>
+ <method name="getRemoteAddress()Ljava/net/SocketAddress;" since="24"/>
+ <method name="isConnected()Z"/>
+ <method name="open()Ljava/nio/channels/DatagramChannel;"/>
+ <method name="open(Ljava/net/ProtocolFamily;)Ljava/nio/channels/DatagramChannel;" since="24"/>
+ <method name="receive(Ljava/nio/ByteBuffer;)Ljava/net/SocketAddress;"/>
+ <method name="send(Ljava/nio/ByteBuffer;Ljava/net/SocketAddress;)I"/>
+ <method name="setOption(Ljava/net/SocketOption;Ljava/lang/Object;)Ljava/nio/channels/DatagramChannel;" since="24"/>
+ <method name="socket()Ljava/net/DatagramSocket;"/>
+ </class>
+ <class name="java/nio/channels/FileChannel" since="1">
+ <extends name="java/nio/channels/spi/AbstractInterruptibleChannel"/>
+ <implements name="java/nio/channels/ByteChannel" removed="24"/>
+ <implements name="java/nio/channels/GatheringByteChannel"/>
+ <implements name="java/nio/channels/ScatteringByteChannel"/>
+ <implements name="java/nio/channels/SeekableByteChannel" since="24"/>
+ <method name="&lt;init>()V"/>
+ <method name="force(Z)V"/>
+ <method name="lock()Ljava/nio/channels/FileLock;"/>
+ <method name="lock(JJZ)Ljava/nio/channels/FileLock;"/>
+ <method name="map(Ljava/nio/channels/FileChannel$MapMode;JJ)Ljava/nio/MappedByteBuffer;"/>
+ <method name="open(Ljava/nio/file/Path;Ljava/util/Set;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/channels/FileChannel;" since="26"/>
+ <method name="open(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/nio/channels/FileChannel;" since="26"/>
+ <method name="position()J"/>
+ <method name="position(J)Ljava/nio/channels/FileChannel;"/>
+ <method name="read(Ljava/nio/ByteBuffer;J)I"/>
+ <method name="size()J"/>
+ <method name="transferFrom(Ljava/nio/channels/ReadableByteChannel;JJ)J"/>
+ <method name="transferTo(JJLjava/nio/channels/WritableByteChannel;)J"/>
+ <method name="truncate(J)Ljava/nio/channels/FileChannel;"/>
+ <method name="tryLock()Ljava/nio/channels/FileLock;"/>
+ <method name="tryLock(JJZ)Ljava/nio/channels/FileLock;"/>
+ <method name="write(Ljava/nio/ByteBuffer;J)I"/>
+ </class>
+ <class name="java/nio/channels/FileChannel$MapMode" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="PRIVATE"/>
+ <field name="READ_ONLY"/>
+ <field name="READ_WRITE"/>
+ </class>
+ <class name="java/nio/channels/FileLock" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable" since="19"/>
+ <method name="&lt;init>(Ljava/nio/channels/AsynchronousFileChannel;JJZ)V" since="26"/>
+ <method name="&lt;init>(Ljava/nio/channels/FileChannel;JJZ)V"/>
+ <method name="acquiredBy()Ljava/nio/channels/Channel;" since="24"/>
+ <method name="channel()Ljava/nio/channels/FileChannel;"/>
+ <method name="isShared()Z"/>
+ <method name="isValid()Z"/>
+ <method name="overlaps(JJ)Z"/>
+ <method name="position()J"/>
+ <method name="release()V"/>
+ <method name="size()J"/>
+ </class>
+ <class name="java/nio/channels/FileLockInterruptionException" since="1">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/channels/GatheringByteChannel" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/channels/WritableByteChannel"/>
+ <method name="write([Ljava/nio/ByteBuffer;)J"/>
+ <method name="write([Ljava/nio/ByteBuffer;II)J"/>
+ </class>
+ <class name="java/nio/channels/IllegalBlockingModeException" since="1">
+ <extends name="java/lang/IllegalStateException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/channels/IllegalChannelGroupException" since="26">
+ <extends name="java/lang/IllegalArgumentException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/channels/IllegalSelectorException" since="1">
+ <extends name="java/lang/IllegalArgumentException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/channels/InterruptedByTimeoutException" since="26">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/channels/InterruptibleChannel" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/channels/Channel"/>
+ </class>
+ <class name="java/nio/channels/MembershipKey" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="block(Ljava/net/InetAddress;)Ljava/nio/channels/MembershipKey;"/>
+ <method name="channel()Ljava/nio/channels/MulticastChannel;"/>
+ <method name="drop()V"/>
+ <method name="group()Ljava/net/InetAddress;"/>
+ <method name="isValid()Z"/>
+ <method name="networkInterface()Ljava/net/NetworkInterface;"/>
+ <method name="sourceAddress()Ljava/net/InetAddress;"/>
+ <method name="unblock(Ljava/net/InetAddress;)Ljava/nio/channels/MembershipKey;"/>
+ </class>
+ <class name="java/nio/channels/MulticastChannel" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/channels/NetworkChannel"/>
+ <method name="join(Ljava/net/InetAddress;Ljava/net/NetworkInterface;)Ljava/nio/channels/MembershipKey;"/>
+ <method name="join(Ljava/net/InetAddress;Ljava/net/NetworkInterface;Ljava/net/InetAddress;)Ljava/nio/channels/MembershipKey;"/>
+ </class>
+ <class name="java/nio/channels/NetworkChannel" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/channels/Channel"/>
+ <method name="bind(Ljava/net/SocketAddress;)Ljava/nio/channels/NetworkChannel;"/>
+ <method name="getLocalAddress()Ljava/net/SocketAddress;"/>
+ <method name="getOption(Ljava/net/SocketOption;)Ljava/lang/Object;"/>
+ <method name="setOption(Ljava/net/SocketOption;Ljava/lang/Object;)Ljava/nio/channels/NetworkChannel;"/>
+ <method name="supportedOptions()Ljava/util/Set;"/>
+ </class>
+ <class name="java/nio/channels/NoConnectionPendingException" since="1">
+ <extends name="java/lang/IllegalStateException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/channels/NonReadableChannelException" since="1">
+ <extends name="java/lang/IllegalStateException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/channels/NonWritableChannelException" since="1">
+ <extends name="java/lang/IllegalStateException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/channels/NotYetBoundException" since="1">
+ <extends name="java/lang/IllegalStateException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/channels/NotYetConnectedException" since="1">
+ <extends name="java/lang/IllegalStateException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/channels/OverlappingFileLockException" since="1">
+ <extends name="java/lang/IllegalStateException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/channels/Pipe" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="open()Ljava/nio/channels/Pipe;"/>
+ <method name="sink()Ljava/nio/channels/Pipe$SinkChannel;"/>
+ <method name="source()Ljava/nio/channels/Pipe$SourceChannel;"/>
+ </class>
+ <class name="java/nio/channels/Pipe$SinkChannel" since="1">
+ <extends name="java/nio/channels/spi/AbstractSelectableChannel"/>
+ <implements name="java/nio/channels/GatheringByteChannel"/>
+ <implements name="java/nio/channels/WritableByteChannel"/>
+ <method name="&lt;init>(Ljava/nio/channels/spi/SelectorProvider;)V"/>
+ </class>
+ <class name="java/nio/channels/Pipe$SourceChannel" since="1">
+ <extends name="java/nio/channels/spi/AbstractSelectableChannel"/>
+ <implements name="java/nio/channels/ReadableByteChannel"/>
+ <implements name="java/nio/channels/ScatteringByteChannel"/>
+ <method name="&lt;init>(Ljava/nio/channels/spi/SelectorProvider;)V"/>
+ </class>
+ <class name="java/nio/channels/ReadPendingException" since="26">
+ <extends name="java/lang/IllegalStateException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/channels/ReadableByteChannel" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/channels/Channel"/>
+ <method name="read(Ljava/nio/ByteBuffer;)I"/>
+ </class>
+ <class name="java/nio/channels/ScatteringByteChannel" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/channels/ReadableByteChannel"/>
+ <method name="read([Ljava/nio/ByteBuffer;)J"/>
+ <method name="read([Ljava/nio/ByteBuffer;II)J"/>
+ </class>
+ <class name="java/nio/channels/SeekableByteChannel" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/channels/ByteChannel"/>
+ <method name="position()J"/>
+ <method name="position(J)Ljava/nio/channels/SeekableByteChannel;"/>
+ <method name="size()J"/>
+ <method name="truncate(J)Ljava/nio/channels/SeekableByteChannel;"/>
+ </class>
+ <class name="java/nio/channels/SelectableChannel" since="1">
+ <extends name="java/nio/channels/spi/AbstractInterruptibleChannel"/>
+ <method name="&lt;init>()V"/>
+ <method name="blockingLock()Ljava/lang/Object;"/>
+ <method name="configureBlocking(Z)Ljava/nio/channels/SelectableChannel;"/>
+ <method name="isBlocking()Z"/>
+ <method name="isRegistered()Z"/>
+ <method name="keyFor(Ljava/nio/channels/Selector;)Ljava/nio/channels/SelectionKey;"/>
+ <method name="provider()Ljava/nio/channels/spi/SelectorProvider;"/>
+ <method name="register(Ljava/nio/channels/Selector;I)Ljava/nio/channels/SelectionKey;"/>
+ <method name="register(Ljava/nio/channels/Selector;ILjava/lang/Object;)Ljava/nio/channels/SelectionKey;"/>
+ <method name="validOps()I"/>
+ </class>
+ <class name="java/nio/channels/SelectionKey" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="attach(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="attachment()Ljava/lang/Object;"/>
+ <method name="cancel()V"/>
+ <method name="channel()Ljava/nio/channels/SelectableChannel;"/>
+ <method name="interestOps()I"/>
+ <method name="interestOps(I)Ljava/nio/channels/SelectionKey;"/>
+ <method name="isAcceptable()Z"/>
+ <method name="isConnectable()Z"/>
+ <method name="isReadable()Z"/>
+ <method name="isValid()Z"/>
+ <method name="isWritable()Z"/>
+ <method name="readyOps()I"/>
+ <method name="selector()Ljava/nio/channels/Selector;"/>
+ <field name="OP_ACCEPT"/>
+ <field name="OP_CONNECT"/>
+ <field name="OP_READ"/>
+ <field name="OP_WRITE"/>
+ </class>
+ <class name="java/nio/channels/Selector" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable" since="19"/>
+ <method name="&lt;init>()V"/>
+ <method name="close()V"/>
+ <method name="isOpen()Z"/>
+ <method name="keys()Ljava/util/Set;"/>
+ <method name="open()Ljava/nio/channels/Selector;"/>
+ <method name="provider()Ljava/nio/channels/spi/SelectorProvider;"/>
+ <method name="select()I"/>
+ <method name="select(J)I"/>
+ <method name="selectNow()I"/>
+ <method name="selectedKeys()Ljava/util/Set;"/>
+ <method name="wakeup()Ljava/nio/channels/Selector;"/>
+ </class>
+ <class name="java/nio/channels/ServerSocketChannel" since="1">
+ <extends name="java/nio/channels/spi/AbstractSelectableChannel"/>
+ <implements name="java/nio/channels/NetworkChannel" since="24"/>
+ <method name="&lt;init>(Ljava/nio/channels/spi/SelectorProvider;)V"/>
+ <method name="accept()Ljava/nio/channels/SocketChannel;"/>
+ <method name="bind(Ljava/net/SocketAddress;)Ljava/nio/channels/ServerSocketChannel;" since="24"/>
+ <method name="bind(Ljava/net/SocketAddress;I)Ljava/nio/channels/ServerSocketChannel;" since="24"/>
+ <method name="open()Ljava/nio/channels/ServerSocketChannel;"/>
+ <method name="setOption(Ljava/net/SocketOption;Ljava/lang/Object;)Ljava/nio/channels/ServerSocketChannel;" since="24"/>
+ <method name="socket()Ljava/net/ServerSocket;"/>
+ </class>
+ <class name="java/nio/channels/ShutdownChannelGroupException" since="26">
+ <extends name="java/lang/IllegalStateException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/channels/SocketChannel" since="1">
+ <extends name="java/nio/channels/spi/AbstractSelectableChannel"/>
+ <implements name="java/nio/channels/ByteChannel"/>
+ <implements name="java/nio/channels/GatheringByteChannel"/>
+ <implements name="java/nio/channels/NetworkChannel" since="24"/>
+ <implements name="java/nio/channels/ScatteringByteChannel"/>
+ <method name="&lt;init>(Ljava/nio/channels/spi/SelectorProvider;)V"/>
+ <method name="bind(Ljava/net/SocketAddress;)Ljava/nio/channels/SocketChannel;" since="24"/>
+ <method name="connect(Ljava/net/SocketAddress;)Z"/>
+ <method name="finishConnect()Z"/>
+ <method name="getRemoteAddress()Ljava/net/SocketAddress;" since="24"/>
+ <method name="isConnected()Z"/>
+ <method name="isConnectionPending()Z"/>
+ <method name="open()Ljava/nio/channels/SocketChannel;"/>
+ <method name="open(Ljava/net/SocketAddress;)Ljava/nio/channels/SocketChannel;"/>
+ <method name="setOption(Ljava/net/SocketOption;Ljava/lang/Object;)Ljava/nio/channels/SocketChannel;" since="24"/>
+ <method name="shutdownInput()Ljava/nio/channels/SocketChannel;" since="24"/>
+ <method name="shutdownOutput()Ljava/nio/channels/SocketChannel;" since="24"/>
+ <method name="socket()Ljava/net/Socket;"/>
+ </class>
+ <class name="java/nio/channels/UnresolvedAddressException" since="1">
+ <extends name="java/lang/IllegalArgumentException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/channels/UnsupportedAddressTypeException" since="1">
+ <extends name="java/lang/IllegalArgumentException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/channels/WritableByteChannel" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/channels/Channel"/>
+ <method name="write(Ljava/nio/ByteBuffer;)I"/>
+ </class>
+ <class name="java/nio/channels/WritePendingException" since="26">
+ <extends name="java/lang/IllegalStateException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/channels/spi/AbstractInterruptibleChannel" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/channels/Channel"/>
+ <implements name="java/nio/channels/InterruptibleChannel"/>
+ <method name="&lt;init>()V"/>
+ <method name="begin()V"/>
+ <method name="end(Z)V"/>
+ <method name="implCloseChannel()V"/>
+ </class>
+ <class name="java/nio/channels/spi/AbstractSelectableChannel" since="1">
+ <extends name="java/nio/channels/SelectableChannel"/>
+ <method name="&lt;init>(Ljava/nio/channels/spi/SelectorProvider;)V"/>
+ <method name="implCloseSelectableChannel()V"/>
+ <method name="implConfigureBlocking(Z)V"/>
+ </class>
+ <class name="java/nio/channels/spi/AbstractSelectionKey" since="1">
+ <extends name="java/nio/channels/SelectionKey"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/channels/spi/AbstractSelector" since="1">
+ <extends name="java/nio/channels/Selector"/>
+ <method name="&lt;init>(Ljava/nio/channels/spi/SelectorProvider;)V"/>
+ <method name="begin()V"/>
+ <method name="cancelledKeys()Ljava/util/Set;"/>
+ <method name="deregister(Ljava/nio/channels/spi/AbstractSelectionKey;)V"/>
+ <method name="end()V"/>
+ <method name="implCloseSelector()V"/>
+ <method name="register(Ljava/nio/channels/spi/AbstractSelectableChannel;ILjava/lang/Object;)Ljava/nio/channels/SelectionKey;"/>
+ </class>
+ <class name="java/nio/channels/spi/AsynchronousChannelProvider" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="openAsynchronousChannelGroup(ILjava/util/concurrent/ThreadFactory;)Ljava/nio/channels/AsynchronousChannelGroup;"/>
+ <method name="openAsynchronousChannelGroup(Ljava/util/concurrent/ExecutorService;I)Ljava/nio/channels/AsynchronousChannelGroup;"/>
+ <method name="openAsynchronousServerSocketChannel(Ljava/nio/channels/AsynchronousChannelGroup;)Ljava/nio/channels/AsynchronousServerSocketChannel;"/>
+ <method name="openAsynchronousSocketChannel(Ljava/nio/channels/AsynchronousChannelGroup;)Ljava/nio/channels/AsynchronousSocketChannel;"/>
+ <method name="provider()Ljava/nio/channels/spi/AsynchronousChannelProvider;"/>
+ </class>
+ <class name="java/nio/channels/spi/SelectorProvider" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="inheritedChannel()Ljava/nio/channels/Channel;"/>
+ <method name="openDatagramChannel()Ljava/nio/channels/DatagramChannel;"/>
+ <method name="openDatagramChannel(Ljava/net/ProtocolFamily;)Ljava/nio/channels/DatagramChannel;" since="24"/>
+ <method name="openPipe()Ljava/nio/channels/Pipe;"/>
+ <method name="openSelector()Ljava/nio/channels/spi/AbstractSelector;"/>
+ <method name="openServerSocketChannel()Ljava/nio/channels/ServerSocketChannel;"/>
+ <method name="openSocketChannel()Ljava/nio/channels/SocketChannel;"/>
+ <method name="provider()Ljava/nio/channels/spi/SelectorProvider;"/>
+ </class>
+ <class name="java/nio/charset/CharacterCodingException" since="1">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/charset/Charset" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>(Ljava/lang/String;[Ljava/lang/String;)V"/>
+ <method name="aliases()Ljava/util/Set;"/>
+ <method name="availableCharsets()Ljava/util/SortedMap;"/>
+ <method name="canEncode()Z"/>
+ <method name="compareTo(Ljava/nio/charset/Charset;)I"/>
+ <method name="contains(Ljava/nio/charset/Charset;)Z"/>
+ <method name="decode(Ljava/nio/ByteBuffer;)Ljava/nio/CharBuffer;"/>
+ <method name="defaultCharset()Ljava/nio/charset/Charset;"/>
+ <method name="displayName()Ljava/lang/String;"/>
+ <method name="displayName(Ljava/util/Locale;)Ljava/lang/String;"/>
+ <method name="encode(Ljava/lang/String;)Ljava/nio/ByteBuffer;"/>
+ <method name="encode(Ljava/nio/CharBuffer;)Ljava/nio/ByteBuffer;"/>
+ <method name="forName(Ljava/lang/String;)Ljava/nio/charset/Charset;"/>
+ <method name="isRegistered()Z"/>
+ <method name="isSupported(Ljava/lang/String;)Z"/>
+ <method name="name()Ljava/lang/String;"/>
+ <method name="newDecoder()Ljava/nio/charset/CharsetDecoder;"/>
+ <method name="newEncoder()Ljava/nio/charset/CharsetEncoder;"/>
+ </class>
+ <class name="java/nio/charset/CharsetDecoder" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/nio/charset/Charset;FF)V"/>
+ <method name="averageCharsPerByte()F"/>
+ <method name="charset()Ljava/nio/charset/Charset;"/>
+ <method name="decode(Ljava/nio/ByteBuffer;)Ljava/nio/CharBuffer;"/>
+ <method name="decode(Ljava/nio/ByteBuffer;Ljava/nio/CharBuffer;Z)Ljava/nio/charset/CoderResult;"/>
+ <method name="decodeLoop(Ljava/nio/ByteBuffer;Ljava/nio/CharBuffer;)Ljava/nio/charset/CoderResult;"/>
+ <method name="detectedCharset()Ljava/nio/charset/Charset;"/>
+ <method name="flush(Ljava/nio/CharBuffer;)Ljava/nio/charset/CoderResult;"/>
+ <method name="implFlush(Ljava/nio/CharBuffer;)Ljava/nio/charset/CoderResult;"/>
+ <method name="implOnMalformedInput(Ljava/nio/charset/CodingErrorAction;)V"/>
+ <method name="implOnUnmappableCharacter(Ljava/nio/charset/CodingErrorAction;)V"/>
+ <method name="implReplaceWith(Ljava/lang/String;)V"/>
+ <method name="implReset()V"/>
+ <method name="isAutoDetecting()Z"/>
+ <method name="isCharsetDetected()Z"/>
+ <method name="malformedInputAction()Ljava/nio/charset/CodingErrorAction;"/>
+ <method name="maxCharsPerByte()F"/>
+ <method name="onMalformedInput(Ljava/nio/charset/CodingErrorAction;)Ljava/nio/charset/CharsetDecoder;"/>
+ <method name="onUnmappableCharacter(Ljava/nio/charset/CodingErrorAction;)Ljava/nio/charset/CharsetDecoder;"/>
+ <method name="replaceWith(Ljava/lang/String;)Ljava/nio/charset/CharsetDecoder;"/>
+ <method name="replacement()Ljava/lang/String;"/>
+ <method name="reset()Ljava/nio/charset/CharsetDecoder;"/>
+ <method name="unmappableCharacterAction()Ljava/nio/charset/CodingErrorAction;"/>
+ </class>
+ <class name="java/nio/charset/CharsetEncoder" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/nio/charset/Charset;FF)V"/>
+ <method name="&lt;init>(Ljava/nio/charset/Charset;FF[B)V"/>
+ <method name="averageBytesPerChar()F"/>
+ <method name="canEncode(C)Z"/>
+ <method name="canEncode(Ljava/lang/CharSequence;)Z"/>
+ <method name="charset()Ljava/nio/charset/Charset;"/>
+ <method name="encode(Ljava/nio/CharBuffer;)Ljava/nio/ByteBuffer;"/>
+ <method name="encode(Ljava/nio/CharBuffer;Ljava/nio/ByteBuffer;Z)Ljava/nio/charset/CoderResult;"/>
+ <method name="encodeLoop(Ljava/nio/CharBuffer;Ljava/nio/ByteBuffer;)Ljava/nio/charset/CoderResult;"/>
+ <method name="flush(Ljava/nio/ByteBuffer;)Ljava/nio/charset/CoderResult;"/>
+ <method name="implFlush(Ljava/nio/ByteBuffer;)Ljava/nio/charset/CoderResult;"/>
+ <method name="implOnMalformedInput(Ljava/nio/charset/CodingErrorAction;)V"/>
+ <method name="implOnUnmappableCharacter(Ljava/nio/charset/CodingErrorAction;)V"/>
+ <method name="implReplaceWith([B)V"/>
+ <method name="implReset()V"/>
+ <method name="isLegalReplacement([B)Z"/>
+ <method name="malformedInputAction()Ljava/nio/charset/CodingErrorAction;"/>
+ <method name="maxBytesPerChar()F"/>
+ <method name="onMalformedInput(Ljava/nio/charset/CodingErrorAction;)Ljava/nio/charset/CharsetEncoder;"/>
+ <method name="onUnmappableCharacter(Ljava/nio/charset/CodingErrorAction;)Ljava/nio/charset/CharsetEncoder;"/>
+ <method name="replaceWith([B)Ljava/nio/charset/CharsetEncoder;"/>
+ <method name="replacement()[B"/>
+ <method name="reset()Ljava/nio/charset/CharsetEncoder;"/>
+ <method name="unmappableCharacterAction()Ljava/nio/charset/CodingErrorAction;"/>
+ </class>
+ <class name="java/nio/charset/CoderMalfunctionError" since="1">
+ <extends name="java/lang/Error"/>
+ <method name="&lt;init>(Ljava/lang/Exception;)V"/>
+ </class>
+ <class name="java/nio/charset/CoderResult" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="isError()Z"/>
+ <method name="isMalformed()Z"/>
+ <method name="isOverflow()Z"/>
+ <method name="isUnderflow()Z"/>
+ <method name="isUnmappable()Z"/>
+ <method name="length()I"/>
+ <method name="malformedForLength(I)Ljava/nio/charset/CoderResult;"/>
+ <method name="throwException()V"/>
+ <method name="unmappableForLength(I)Ljava/nio/charset/CoderResult;"/>
+ <field name="OVERFLOW"/>
+ <field name="UNDERFLOW"/>
+ </class>
+ <class name="java/nio/charset/CodingErrorAction" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="IGNORE"/>
+ <field name="REPLACE"/>
+ <field name="REPORT"/>
+ </class>
+ <class name="java/nio/charset/IllegalCharsetNameException" since="1">
+ <extends name="java/lang/IllegalArgumentException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getCharsetName()Ljava/lang/String;"/>
+ </class>
+ <class name="java/nio/charset/MalformedInputException" since="1">
+ <extends name="java/nio/charset/CharacterCodingException"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="getInputLength()I"/>
+ </class>
+ <class name="java/nio/charset/StandardCharsets" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="ISO_8859_1"/>
+ <field name="US_ASCII"/>
+ <field name="UTF_16"/>
+ <field name="UTF_16BE"/>
+ <field name="UTF_16LE"/>
+ <field name="UTF_8"/>
+ </class>
+ <class name="java/nio/charset/UnmappableCharacterException" since="1">
+ <extends name="java/nio/charset/CharacterCodingException"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="getInputLength()I"/>
+ </class>
+ <class name="java/nio/charset/UnsupportedCharsetException" since="1">
+ <extends name="java/lang/IllegalArgumentException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getCharsetName()Ljava/lang/String;"/>
+ </class>
+ <class name="java/nio/charset/spi/CharsetProvider" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="charsetForName(Ljava/lang/String;)Ljava/nio/charset/Charset;"/>
+ <method name="charsets()Ljava/util/Iterator;"/>
+ </class>
+ <class name="java/nio/file/AccessDeniedException" since="26">
+ <extends name="java/nio/file/FileSystemException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/nio/file/AccessMode" since="26">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/nio/file/AccessMode;"/>
+ <method name="values()[Ljava/nio/file/AccessMode;"/>
+ <field name="EXECUTE"/>
+ <field name="READ"/>
+ <field name="WRITE"/>
+ </class>
+ <class name="java/nio/file/AtomicMoveNotSupportedException" since="26">
+ <extends name="java/nio/file/FileSystemException"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/nio/file/ClosedDirectoryStreamException" since="26">
+ <extends name="java/lang/IllegalStateException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/file/ClosedFileSystemException" since="26">
+ <extends name="java/lang/IllegalStateException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/file/ClosedWatchServiceException" since="26">
+ <extends name="java/lang/IllegalStateException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/file/CopyOption" since="26">
+ <extends name="java/lang/Object"/>
+ </class>
+ <class name="java/nio/file/DirectoryIteratorException" since="26">
+ <extends name="java/util/ConcurrentModificationException"/>
+ <method name="&lt;init>(Ljava/io/IOException;)V"/>
+ <method name="getCause()Ljava/io/IOException;"/>
+ </class>
+ <class name="java/nio/file/DirectoryNotEmptyException" since="26">
+ <extends name="java/nio/file/FileSystemException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/nio/file/DirectoryStream" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable"/>
+ <implements name="java/lang/Iterable"/>
+ </class>
+ <class name="java/nio/file/DirectoryStream$Filter" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="accept(Ljava/lang/Object;)Z"/>
+ </class>
+ <class name="java/nio/file/FileAlreadyExistsException" since="26">
+ <extends name="java/nio/file/FileSystemException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/nio/file/FileStore" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAttribute(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="getFileStoreAttributeView(Ljava/lang/Class;)Ljava/nio/file/attribute/FileStoreAttributeView;"/>
+ <method name="getTotalSpace()J"/>
+ <method name="getUnallocatedSpace()J"/>
+ <method name="getUsableSpace()J"/>
+ <method name="isReadOnly()Z"/>
+ <method name="name()Ljava/lang/String;"/>
+ <method name="supportsFileAttributeView(Ljava/lang/Class;)Z"/>
+ <method name="supportsFileAttributeView(Ljava/lang/String;)Z"/>
+ <method name="type()Ljava/lang/String;"/>
+ </class>
+ <class name="java/nio/file/FileSystem" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getFileStores()Ljava/lang/Iterable;"/>
+ <method name="getPath(Ljava/lang/String;[Ljava/lang/String;)Ljava/nio/file/Path;"/>
+ <method name="getPathMatcher(Ljava/lang/String;)Ljava/nio/file/PathMatcher;"/>
+ <method name="getRootDirectories()Ljava/lang/Iterable;"/>
+ <method name="getSeparator()Ljava/lang/String;"/>
+ <method name="getUserPrincipalLookupService()Ljava/nio/file/attribute/UserPrincipalLookupService;"/>
+ <method name="isOpen()Z"/>
+ <method name="isReadOnly()Z"/>
+ <method name="newWatchService()Ljava/nio/file/WatchService;"/>
+ <method name="provider()Ljava/nio/file/spi/FileSystemProvider;"/>
+ <method name="supportedFileAttributeViews()Ljava/util/Set;"/>
+ </class>
+ <class name="java/nio/file/FileSystemAlreadyExistsException" since="26">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/nio/file/FileSystemException" since="26">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="getFile()Ljava/lang/String;"/>
+ <method name="getOtherFile()Ljava/lang/String;"/>
+ <method name="getReason()Ljava/lang/String;"/>
+ </class>
+ <class name="java/nio/file/FileSystemLoopException" since="26">
+ <extends name="java/nio/file/FileSystemException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/nio/file/FileSystemNotFoundException" since="26">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/nio/file/FileSystems" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDefault()Ljava/nio/file/FileSystem;"/>
+ <method name="getFileSystem(Ljava/net/URI;)Ljava/nio/file/FileSystem;"/>
+ <method name="newFileSystem(Ljava/net/URI;Ljava/util/Map;)Ljava/nio/file/FileSystem;"/>
+ <method name="newFileSystem(Ljava/net/URI;Ljava/util/Map;Ljava/lang/ClassLoader;)Ljava/nio/file/FileSystem;"/>
+ <method name="newFileSystem(Ljava/nio/file/Path;Ljava/lang/ClassLoader;)Ljava/nio/file/FileSystem;"/>
+ </class>
+ <class name="java/nio/file/FileVisitOption" since="26">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/nio/file/FileVisitOption;"/>
+ <method name="values()[Ljava/nio/file/FileVisitOption;"/>
+ <field name="FOLLOW_LINKS"/>
+ </class>
+ <class name="java/nio/file/FileVisitResult" since="26">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/nio/file/FileVisitResult;"/>
+ <method name="values()[Ljava/nio/file/FileVisitResult;"/>
+ <field name="CONTINUE"/>
+ <field name="SKIP_SIBLINGS"/>
+ <field name="SKIP_SUBTREE"/>
+ <field name="TERMINATE"/>
+ </class>
+ <class name="java/nio/file/FileVisitor" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="postVisitDirectory(Ljava/lang/Object;Ljava/io/IOException;)Ljava/nio/file/FileVisitResult;"/>
+ <method name="preVisitDirectory(Ljava/lang/Object;Ljava/nio/file/attribute/BasicFileAttributes;)Ljava/nio/file/FileVisitResult;"/>
+ <method name="visitFile(Ljava/lang/Object;Ljava/nio/file/attribute/BasicFileAttributes;)Ljava/nio/file/FileVisitResult;"/>
+ <method name="visitFileFailed(Ljava/lang/Object;Ljava/io/IOException;)Ljava/nio/file/FileVisitResult;"/>
+ </class>
+ <class name="java/nio/file/Files" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="copy(Ljava/io/InputStream;Ljava/nio/file/Path;[Ljava/nio/file/CopyOption;)J"/>
+ <method name="copy(Ljava/nio/file/Path;Ljava/io/OutputStream;)J"/>
+ <method name="copy(Ljava/nio/file/Path;Ljava/nio/file/Path;[Ljava/nio/file/CopyOption;)Ljava/nio/file/Path;"/>
+ <method name="createDirectories(Ljava/nio/file/Path;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/file/Path;"/>
+ <method name="createDirectory(Ljava/nio/file/Path;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/file/Path;"/>
+ <method name="createFile(Ljava/nio/file/Path;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/file/Path;"/>
+ <method name="createLink(Ljava/nio/file/Path;Ljava/nio/file/Path;)Ljava/nio/file/Path;"/>
+ <method name="createSymbolicLink(Ljava/nio/file/Path;Ljava/nio/file/Path;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/file/Path;"/>
+ <method name="createTempDirectory(Ljava/lang/String;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/file/Path;"/>
+ <method name="createTempDirectory(Ljava/nio/file/Path;Ljava/lang/String;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/file/Path;"/>
+ <method name="createTempFile(Ljava/lang/String;Ljava/lang/String;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/file/Path;"/>
+ <method name="createTempFile(Ljava/nio/file/Path;Ljava/lang/String;Ljava/lang/String;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/file/Path;"/>
+ <method name="delete(Ljava/nio/file/Path;)V"/>
+ <method name="deleteIfExists(Ljava/nio/file/Path;)Z"/>
+ <method name="exists(Ljava/nio/file/Path;[Ljava/nio/file/LinkOption;)Z"/>
+ <method name="find(Ljava/nio/file/Path;ILjava/util/function/BiPredicate;[Ljava/nio/file/FileVisitOption;)Ljava/util/stream/Stream;"/>
+ <method name="getAttribute(Ljava/nio/file/Path;Ljava/lang/String;[Ljava/nio/file/LinkOption;)Ljava/lang/Object;"/>
+ <method name="getFileAttributeView(Ljava/nio/file/Path;Ljava/lang/Class;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/FileAttributeView;"/>
+ <method name="getFileStore(Ljava/nio/file/Path;)Ljava/nio/file/FileStore;"/>
+ <method name="getLastModifiedTime(Ljava/nio/file/Path;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/FileTime;"/>
+ <method name="getOwner(Ljava/nio/file/Path;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/UserPrincipal;"/>
+ <method name="getPosixFilePermissions(Ljava/nio/file/Path;[Ljava/nio/file/LinkOption;)Ljava/util/Set;"/>
+ <method name="isDirectory(Ljava/nio/file/Path;[Ljava/nio/file/LinkOption;)Z"/>
+ <method name="isExecutable(Ljava/nio/file/Path;)Z"/>
+ <method name="isHidden(Ljava/nio/file/Path;)Z"/>
+ <method name="isReadable(Ljava/nio/file/Path;)Z"/>
+ <method name="isRegularFile(Ljava/nio/file/Path;[Ljava/nio/file/LinkOption;)Z"/>
+ <method name="isSameFile(Ljava/nio/file/Path;Ljava/nio/file/Path;)Z"/>
+ <method name="isSymbolicLink(Ljava/nio/file/Path;)Z"/>
+ <method name="isWritable(Ljava/nio/file/Path;)Z"/>
+ <method name="lines(Ljava/nio/file/Path;)Ljava/util/stream/Stream;"/>
+ <method name="lines(Ljava/nio/file/Path;Ljava/nio/charset/Charset;)Ljava/util/stream/Stream;"/>
+ <method name="list(Ljava/nio/file/Path;)Ljava/util/stream/Stream;"/>
+ <method name="move(Ljava/nio/file/Path;Ljava/nio/file/Path;[Ljava/nio/file/CopyOption;)Ljava/nio/file/Path;"/>
+ <method name="newBufferedReader(Ljava/nio/file/Path;)Ljava/io/BufferedReader;"/>
+ <method name="newBufferedReader(Ljava/nio/file/Path;Ljava/nio/charset/Charset;)Ljava/io/BufferedReader;"/>
+ <method name="newBufferedWriter(Ljava/nio/file/Path;Ljava/nio/charset/Charset;[Ljava/nio/file/OpenOption;)Ljava/io/BufferedWriter;"/>
+ <method name="newBufferedWriter(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/io/BufferedWriter;"/>
+ <method name="newByteChannel(Ljava/nio/file/Path;Ljava/util/Set;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/channels/SeekableByteChannel;"/>
+ <method name="newByteChannel(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/nio/channels/SeekableByteChannel;"/>
+ <method name="newDirectoryStream(Ljava/nio/file/Path;)Ljava/nio/file/DirectoryStream;"/>
+ <method name="newDirectoryStream(Ljava/nio/file/Path;Ljava/lang/String;)Ljava/nio/file/DirectoryStream;"/>
+ <method name="newDirectoryStream(Ljava/nio/file/Path;Ljava/nio/file/DirectoryStream$Filter;)Ljava/nio/file/DirectoryStream;"/>
+ <method name="newInputStream(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/io/InputStream;"/>
+ <method name="newOutputStream(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/io/OutputStream;"/>
+ <method name="notExists(Ljava/nio/file/Path;[Ljava/nio/file/LinkOption;)Z"/>
+ <method name="probeContentType(Ljava/nio/file/Path;)Ljava/lang/String;"/>
+ <method name="readAllBytes(Ljava/nio/file/Path;)[B"/>
+ <method name="readAllLines(Ljava/nio/file/Path;)Ljava/util/List;"/>
+ <method name="readAllLines(Ljava/nio/file/Path;Ljava/nio/charset/Charset;)Ljava/util/List;"/>
+ <method name="readAttributes(Ljava/nio/file/Path;Ljava/lang/Class;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/BasicFileAttributes;"/>
+ <method name="readAttributes(Ljava/nio/file/Path;Ljava/lang/String;[Ljava/nio/file/LinkOption;)Ljava/util/Map;"/>
+ <method name="readSymbolicLink(Ljava/nio/file/Path;)Ljava/nio/file/Path;"/>
+ <method name="setAttribute(Ljava/nio/file/Path;Ljava/lang/String;Ljava/lang/Object;[Ljava/nio/file/LinkOption;)Ljava/nio/file/Path;"/>
+ <method name="setLastModifiedTime(Ljava/nio/file/Path;Ljava/nio/file/attribute/FileTime;)Ljava/nio/file/Path;"/>
+ <method name="setOwner(Ljava/nio/file/Path;Ljava/nio/file/attribute/UserPrincipal;)Ljava/nio/file/Path;"/>
+ <method name="setPosixFilePermissions(Ljava/nio/file/Path;Ljava/util/Set;)Ljava/nio/file/Path;"/>
+ <method name="size(Ljava/nio/file/Path;)J"/>
+ <method name="walk(Ljava/nio/file/Path;I[Ljava/nio/file/FileVisitOption;)Ljava/util/stream/Stream;"/>
+ <method name="walk(Ljava/nio/file/Path;[Ljava/nio/file/FileVisitOption;)Ljava/util/stream/Stream;"/>
+ <method name="walkFileTree(Ljava/nio/file/Path;Ljava/nio/file/FileVisitor;)Ljava/nio/file/Path;"/>
+ <method name="walkFileTree(Ljava/nio/file/Path;Ljava/util/Set;ILjava/nio/file/FileVisitor;)Ljava/nio/file/Path;"/>
+ <method name="write(Ljava/nio/file/Path;Ljava/lang/Iterable;Ljava/nio/charset/Charset;[Ljava/nio/file/OpenOption;)Ljava/nio/file/Path;"/>
+ <method name="write(Ljava/nio/file/Path;Ljava/lang/Iterable;[Ljava/nio/file/OpenOption;)Ljava/nio/file/Path;"/>
+ <method name="write(Ljava/nio/file/Path;[B[Ljava/nio/file/OpenOption;)Ljava/nio/file/Path;"/>
+ </class>
+ <class name="java/nio/file/InvalidPathException" since="26">
+ <extends name="java/lang/IllegalArgumentException"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V"/>
+ <method name="getIndex()I"/>
+ <method name="getInput()Ljava/lang/String;"/>
+ <method name="getReason()Ljava/lang/String;"/>
+ </class>
+ <class name="java/nio/file/LinkOption" since="26">
+ <extends name="java/lang/Enum"/>
+ <implements name="java/nio/file/CopyOption"/>
+ <implements name="java/nio/file/OpenOption"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/nio/file/LinkOption;"/>
+ <method name="values()[Ljava/nio/file/LinkOption;"/>
+ <field name="NOFOLLOW_LINKS"/>
+ </class>
+ <class name="java/nio/file/LinkPermission" since="26">
+ <extends name="java/security/BasicPermission"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/nio/file/NoSuchFileException" since="26">
+ <extends name="java/nio/file/FileSystemException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/nio/file/NotDirectoryException" since="26">
+ <extends name="java/nio/file/FileSystemException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/nio/file/NotLinkException" since="26">
+ <extends name="java/nio/file/FileSystemException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/nio/file/OpenOption" since="26">
+ <extends name="java/lang/Object"/>
+ </class>
+ <class name="java/nio/file/Path" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Comparable"/>
+ <implements name="java/lang/Iterable"/>
+ <implements name="java/nio/file/Watchable"/>
+ <method name="compareTo(Ljava/nio/file/Path;)I"/>
+ <method name="endsWith(Ljava/lang/String;)Z"/>
+ <method name="endsWith(Ljava/nio/file/Path;)Z"/>
+ <method name="getFileName()Ljava/nio/file/Path;"/>
+ <method name="getFileSystem()Ljava/nio/file/FileSystem;"/>
+ <method name="getName(I)Ljava/nio/file/Path;"/>
+ <method name="getNameCount()I"/>
+ <method name="getParent()Ljava/nio/file/Path;"/>
+ <method name="getRoot()Ljava/nio/file/Path;"/>
+ <method name="isAbsolute()Z"/>
+ <method name="normalize()Ljava/nio/file/Path;"/>
+ <method name="relativize(Ljava/nio/file/Path;)Ljava/nio/file/Path;"/>
+ <method name="resolve(Ljava/lang/String;)Ljava/nio/file/Path;"/>
+ <method name="resolve(Ljava/nio/file/Path;)Ljava/nio/file/Path;"/>
+ <method name="resolveSibling(Ljava/lang/String;)Ljava/nio/file/Path;"/>
+ <method name="resolveSibling(Ljava/nio/file/Path;)Ljava/nio/file/Path;"/>
+ <method name="startsWith(Ljava/lang/String;)Z"/>
+ <method name="startsWith(Ljava/nio/file/Path;)Z"/>
+ <method name="subpath(II)Ljava/nio/file/Path;"/>
+ <method name="toAbsolutePath()Ljava/nio/file/Path;"/>
+ <method name="toFile()Ljava/io/File;"/>
+ <method name="toRealPath([Ljava/nio/file/LinkOption;)Ljava/nio/file/Path;"/>
+ <method name="toUri()Ljava/net/URI;"/>
+ </class>
+ <class name="java/nio/file/PathMatcher" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="matches(Ljava/nio/file/Path;)Z"/>
+ </class>
+ <class name="java/nio/file/Paths" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="get(Ljava/lang/String;[Ljava/lang/String;)Ljava/nio/file/Path;"/>
+ <method name="get(Ljava/net/URI;)Ljava/nio/file/Path;"/>
+ </class>
+ <class name="java/nio/file/ProviderMismatchException" since="26">
+ <extends name="java/lang/IllegalArgumentException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/nio/file/ProviderNotFoundException" since="26">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/nio/file/ReadOnlyFileSystemException" since="26">
+ <extends name="java/lang/UnsupportedOperationException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/file/SecureDirectoryStream" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/file/DirectoryStream"/>
+ <method name="deleteDirectory(Ljava/lang/Object;)V"/>
+ <method name="deleteFile(Ljava/lang/Object;)V"/>
+ <method name="getFileAttributeView(Ljava/lang/Class;)Ljava/nio/file/attribute/FileAttributeView;"/>
+ <method name="getFileAttributeView(Ljava/lang/Object;Ljava/lang/Class;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/FileAttributeView;"/>
+ <method name="move(Ljava/lang/Object;Ljava/nio/file/SecureDirectoryStream;Ljava/lang/Object;)V"/>
+ <method name="newByteChannel(Ljava/lang/Object;Ljava/util/Set;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/channels/SeekableByteChannel;"/>
+ <method name="newDirectoryStream(Ljava/lang/Object;[Ljava/nio/file/LinkOption;)Ljava/nio/file/SecureDirectoryStream;"/>
+ </class>
+ <class name="java/nio/file/SimpleFileVisitor" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/file/FileVisitor"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/nio/file/StandardCopyOption" since="26">
+ <extends name="java/lang/Enum"/>
+ <implements name="java/nio/file/CopyOption"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/nio/file/StandardCopyOption;"/>
+ <method name="values()[Ljava/nio/file/StandardCopyOption;"/>
+ <field name="ATOMIC_MOVE"/>
+ <field name="COPY_ATTRIBUTES"/>
+ <field name="REPLACE_EXISTING"/>
+ </class>
+ <class name="java/nio/file/StandardOpenOption" since="26">
+ <extends name="java/lang/Enum"/>
+ <implements name="java/nio/file/OpenOption"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/nio/file/StandardOpenOption;"/>
+ <method name="values()[Ljava/nio/file/StandardOpenOption;"/>
+ <field name="APPEND"/>
+ <field name="CREATE"/>
+ <field name="CREATE_NEW"/>
+ <field name="DELETE_ON_CLOSE"/>
+ <field name="DSYNC"/>
+ <field name="READ"/>
+ <field name="SPARSE"/>
+ <field name="SYNC"/>
+ <field name="TRUNCATE_EXISTING"/>
+ <field name="WRITE"/>
+ </class>
+ <class name="java/nio/file/StandardWatchEventKinds" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="ENTRY_CREATE"/>
+ <field name="ENTRY_DELETE"/>
+ <field name="ENTRY_MODIFY"/>
+ <field name="OVERFLOW"/>
+ </class>
+ <class name="java/nio/file/WatchEvent" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="context()Ljava/lang/Object;"/>
+ <method name="count()I"/>
+ <method name="kind()Ljava/nio/file/WatchEvent$Kind;"/>
+ </class>
+ <class name="java/nio/file/WatchEvent$Kind" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="name()Ljava/lang/String;"/>
+ <method name="type()Ljava/lang/Class;"/>
+ </class>
+ <class name="java/nio/file/WatchEvent$Modifier" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="name()Ljava/lang/String;"/>
+ </class>
+ <class name="java/nio/file/WatchKey" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="cancel()V"/>
+ <method name="isValid()Z"/>
+ <method name="pollEvents()Ljava/util/List;"/>
+ <method name="reset()Z"/>
+ <method name="watchable()Ljava/nio/file/Watchable;"/>
+ </class>
+ <class name="java/nio/file/WatchService" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable"/>
+ <method name="poll()Ljava/nio/file/WatchKey;"/>
+ <method name="poll(JLjava/util/concurrent/TimeUnit;)Ljava/nio/file/WatchKey;"/>
+ <method name="take()Ljava/nio/file/WatchKey;"/>
+ </class>
+ <class name="java/nio/file/Watchable" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="register(Ljava/nio/file/WatchService;[Ljava/nio/file/WatchEvent$Kind;)Ljava/nio/file/WatchKey;"/>
+ <method name="register(Ljava/nio/file/WatchService;[Ljava/nio/file/WatchEvent$Kind;[Ljava/nio/file/WatchEvent$Modifier;)Ljava/nio/file/WatchKey;"/>
+ </class>
+ <class name="java/nio/file/attribute/AclEntry" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="flags()Ljava/util/Set;"/>
+ <method name="newBuilder()Ljava/nio/file/attribute/AclEntry$Builder;"/>
+ <method name="newBuilder(Ljava/nio/file/attribute/AclEntry;)Ljava/nio/file/attribute/AclEntry$Builder;"/>
+ <method name="permissions()Ljava/util/Set;"/>
+ <method name="principal()Ljava/nio/file/attribute/UserPrincipal;"/>
+ <method name="type()Ljava/nio/file/attribute/AclEntryType;"/>
+ </class>
+ <class name="java/nio/file/attribute/AclEntry$Builder" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="build()Ljava/nio/file/attribute/AclEntry;"/>
+ <method name="setFlags(Ljava/util/Set;)Ljava/nio/file/attribute/AclEntry$Builder;"/>
+ <method name="setFlags([Ljava/nio/file/attribute/AclEntryFlag;)Ljava/nio/file/attribute/AclEntry$Builder;"/>
+ <method name="setPermissions(Ljava/util/Set;)Ljava/nio/file/attribute/AclEntry$Builder;"/>
+ <method name="setPermissions([Ljava/nio/file/attribute/AclEntryPermission;)Ljava/nio/file/attribute/AclEntry$Builder;"/>
+ <method name="setPrincipal(Ljava/nio/file/attribute/UserPrincipal;)Ljava/nio/file/attribute/AclEntry$Builder;"/>
+ <method name="setType(Ljava/nio/file/attribute/AclEntryType;)Ljava/nio/file/attribute/AclEntry$Builder;"/>
+ </class>
+ <class name="java/nio/file/attribute/AclEntryFlag" since="26">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/nio/file/attribute/AclEntryFlag;"/>
+ <method name="values()[Ljava/nio/file/attribute/AclEntryFlag;"/>
+ <field name="DIRECTORY_INHERIT"/>
+ <field name="FILE_INHERIT"/>
+ <field name="INHERIT_ONLY"/>
+ <field name="NO_PROPAGATE_INHERIT"/>
+ </class>
+ <class name="java/nio/file/attribute/AclEntryPermission" since="26">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/nio/file/attribute/AclEntryPermission;"/>
+ <method name="values()[Ljava/nio/file/attribute/AclEntryPermission;"/>
+ <field name="ADD_FILE"/>
+ <field name="ADD_SUBDIRECTORY"/>
+ <field name="APPEND_DATA"/>
+ <field name="DELETE"/>
+ <field name="DELETE_CHILD"/>
+ <field name="EXECUTE"/>
+ <field name="LIST_DIRECTORY"/>
+ <field name="READ_ACL"/>
+ <field name="READ_ATTRIBUTES"/>
+ <field name="READ_DATA"/>
+ <field name="READ_NAMED_ATTRS"/>
+ <field name="SYNCHRONIZE"/>
+ <field name="WRITE_ACL"/>
+ <field name="WRITE_ATTRIBUTES"/>
+ <field name="WRITE_DATA"/>
+ <field name="WRITE_NAMED_ATTRS"/>
+ <field name="WRITE_OWNER"/>
+ </class>
+ <class name="java/nio/file/attribute/AclEntryType" since="26">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/nio/file/attribute/AclEntryType;"/>
+ <method name="values()[Ljava/nio/file/attribute/AclEntryType;"/>
+ <field name="ALARM"/>
+ <field name="ALLOW"/>
+ <field name="AUDIT"/>
+ <field name="DENY"/>
+ </class>
+ <class name="java/nio/file/attribute/AclFileAttributeView" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/file/attribute/FileOwnerAttributeView"/>
+ <method name="getAcl()Ljava/util/List;"/>
+ <method name="setAcl(Ljava/util/List;)V"/>
+ </class>
+ <class name="java/nio/file/attribute/AttributeView" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="name()Ljava/lang/String;"/>
+ </class>
+ <class name="java/nio/file/attribute/BasicFileAttributeView" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/file/attribute/FileAttributeView"/>
+ <method name="readAttributes()Ljava/nio/file/attribute/BasicFileAttributes;"/>
+ <method name="setTimes(Ljava/nio/file/attribute/FileTime;Ljava/nio/file/attribute/FileTime;Ljava/nio/file/attribute/FileTime;)V"/>
+ </class>
+ <class name="java/nio/file/attribute/BasicFileAttributes" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="creationTime()Ljava/nio/file/attribute/FileTime;"/>
+ <method name="fileKey()Ljava/lang/Object;"/>
+ <method name="isDirectory()Z"/>
+ <method name="isOther()Z"/>
+ <method name="isRegularFile()Z"/>
+ <method name="isSymbolicLink()Z"/>
+ <method name="lastAccessTime()Ljava/nio/file/attribute/FileTime;"/>
+ <method name="lastModifiedTime()Ljava/nio/file/attribute/FileTime;"/>
+ <method name="size()J"/>
+ </class>
+ <class name="java/nio/file/attribute/DosFileAttributeView" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/file/attribute/BasicFileAttributeView"/>
+ <method name="readAttributes()Ljava/nio/file/attribute/DosFileAttributes;"/>
+ <method name="setArchive(Z)V"/>
+ <method name="setHidden(Z)V"/>
+ <method name="setReadOnly(Z)V"/>
+ <method name="setSystem(Z)V"/>
+ </class>
+ <class name="java/nio/file/attribute/DosFileAttributes" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/file/attribute/BasicFileAttributes"/>
+ <method name="isArchive()Z"/>
+ <method name="isHidden()Z"/>
+ <method name="isReadOnly()Z"/>
+ <method name="isSystem()Z"/>
+ </class>
+ <class name="java/nio/file/attribute/FileAttribute" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="name()Ljava/lang/String;"/>
+ <method name="value()Ljava/lang/Object;"/>
+ </class>
+ <class name="java/nio/file/attribute/FileAttributeView" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/file/attribute/AttributeView"/>
+ </class>
+ <class name="java/nio/file/attribute/FileOwnerAttributeView" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/file/attribute/FileAttributeView"/>
+ <method name="getOwner()Ljava/nio/file/attribute/UserPrincipal;"/>
+ <method name="setOwner(Ljava/nio/file/attribute/UserPrincipal;)V"/>
+ </class>
+ <class name="java/nio/file/attribute/FileStoreAttributeView" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/file/attribute/AttributeView"/>
+ </class>
+ <class name="java/nio/file/attribute/FileTime" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>()V"/>
+ <method name="compareTo(Ljava/nio/file/attribute/FileTime;)I"/>
+ <method name="from(JLjava/util/concurrent/TimeUnit;)Ljava/nio/file/attribute/FileTime;"/>
+ <method name="from(Ljava/time/Instant;)Ljava/nio/file/attribute/FileTime;"/>
+ <method name="fromMillis(J)Ljava/nio/file/attribute/FileTime;"/>
+ <method name="to(Ljava/util/concurrent/TimeUnit;)J"/>
+ <method name="toInstant()Ljava/time/Instant;"/>
+ <method name="toMillis()J"/>
+ </class>
+ <class name="java/nio/file/attribute/GroupPrincipal" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/file/attribute/UserPrincipal"/>
+ </class>
+ <class name="java/nio/file/attribute/PosixFileAttributeView" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/file/attribute/BasicFileAttributeView"/>
+ <implements name="java/nio/file/attribute/FileOwnerAttributeView"/>
+ <method name="readAttributes()Ljava/nio/file/attribute/PosixFileAttributes;"/>
+ <method name="setGroup(Ljava/nio/file/attribute/GroupPrincipal;)V"/>
+ <method name="setPermissions(Ljava/util/Set;)V"/>
+ </class>
+ <class name="java/nio/file/attribute/PosixFileAttributes" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/file/attribute/BasicFileAttributes"/>
+ <method name="group()Ljava/nio/file/attribute/GroupPrincipal;"/>
+ <method name="owner()Ljava/nio/file/attribute/UserPrincipal;"/>
+ <method name="permissions()Ljava/util/Set;"/>
+ </class>
+ <class name="java/nio/file/attribute/PosixFilePermission" since="26">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/nio/file/attribute/PosixFilePermission;"/>
+ <method name="values()[Ljava/nio/file/attribute/PosixFilePermission;"/>
+ <field name="GROUP_EXECUTE"/>
+ <field name="GROUP_READ"/>
+ <field name="GROUP_WRITE"/>
+ <field name="OTHERS_EXECUTE"/>
+ <field name="OTHERS_READ"/>
+ <field name="OTHERS_WRITE"/>
+ <field name="OWNER_EXECUTE"/>
+ <field name="OWNER_READ"/>
+ <field name="OWNER_WRITE"/>
+ </class>
+ <class name="java/nio/file/attribute/PosixFilePermissions" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="asFileAttribute(Ljava/util/Set;)Ljava/nio/file/attribute/FileAttribute;"/>
+ <method name="fromString(Ljava/lang/String;)Ljava/util/Set;"/>
+ <method name="toString(Ljava/util/Set;)Ljava/lang/String;"/>
+ </class>
+ <class name="java/nio/file/attribute/UserDefinedFileAttributeView" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/nio/file/attribute/FileAttributeView"/>
+ <method name="delete(Ljava/lang/String;)V"/>
+ <method name="list()Ljava/util/List;"/>
+ <method name="read(Ljava/lang/String;Ljava/nio/ByteBuffer;)I"/>
+ <method name="size(Ljava/lang/String;)I"/>
+ <method name="write(Ljava/lang/String;Ljava/nio/ByteBuffer;)I"/>
+ </class>
+ <class name="java/nio/file/attribute/UserPrincipal" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/Principal"/>
+ </class>
+ <class name="java/nio/file/attribute/UserPrincipalLookupService" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="lookupPrincipalByGroupName(Ljava/lang/String;)Ljava/nio/file/attribute/GroupPrincipal;"/>
+ <method name="lookupPrincipalByName(Ljava/lang/String;)Ljava/nio/file/attribute/UserPrincipal;"/>
+ </class>
+ <class name="java/nio/file/attribute/UserPrincipalNotFoundException" since="26">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getName()Ljava/lang/String;"/>
+ </class>
+ <class name="java/nio/file/spi/FileSystemProvider" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="checkAccess(Ljava/nio/file/Path;[Ljava/nio/file/AccessMode;)V"/>
+ <method name="copy(Ljava/nio/file/Path;Ljava/nio/file/Path;[Ljava/nio/file/CopyOption;)V"/>
+ <method name="createDirectory(Ljava/nio/file/Path;[Ljava/nio/file/attribute/FileAttribute;)V"/>
+ <method name="createLink(Ljava/nio/file/Path;Ljava/nio/file/Path;)V"/>
+ <method name="createSymbolicLink(Ljava/nio/file/Path;Ljava/nio/file/Path;[Ljava/nio/file/attribute/FileAttribute;)V"/>
+ <method name="delete(Ljava/nio/file/Path;)V"/>
+ <method name="deleteIfExists(Ljava/nio/file/Path;)Z"/>
+ <method name="getFileAttributeView(Ljava/nio/file/Path;Ljava/lang/Class;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/FileAttributeView;"/>
+ <method name="getFileStore(Ljava/nio/file/Path;)Ljava/nio/file/FileStore;"/>
+ <method name="getFileSystem(Ljava/net/URI;)Ljava/nio/file/FileSystem;"/>
+ <method name="getPath(Ljava/net/URI;)Ljava/nio/file/Path;"/>
+ <method name="getScheme()Ljava/lang/String;"/>
+ <method name="installedProviders()Ljava/util/List;"/>
+ <method name="isHidden(Ljava/nio/file/Path;)Z"/>
+ <method name="isSameFile(Ljava/nio/file/Path;Ljava/nio/file/Path;)Z"/>
+ <method name="move(Ljava/nio/file/Path;Ljava/nio/file/Path;[Ljava/nio/file/CopyOption;)V"/>
+ <method name="newAsynchronousFileChannel(Ljava/nio/file/Path;Ljava/util/Set;Ljava/util/concurrent/ExecutorService;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/channels/AsynchronousFileChannel;"/>
+ <method name="newByteChannel(Ljava/nio/file/Path;Ljava/util/Set;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/channels/SeekableByteChannel;"/>
+ <method name="newDirectoryStream(Ljava/nio/file/Path;Ljava/nio/file/DirectoryStream$Filter;)Ljava/nio/file/DirectoryStream;"/>
+ <method name="newFileChannel(Ljava/nio/file/Path;Ljava/util/Set;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/channels/FileChannel;"/>
+ <method name="newFileSystem(Ljava/net/URI;Ljava/util/Map;)Ljava/nio/file/FileSystem;"/>
+ <method name="newFileSystem(Ljava/nio/file/Path;Ljava/util/Map;)Ljava/nio/file/FileSystem;"/>
+ <method name="newInputStream(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/io/InputStream;"/>
+ <method name="newOutputStream(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/io/OutputStream;"/>
+ <method name="readAttributes(Ljava/nio/file/Path;Ljava/lang/Class;[Ljava/nio/file/LinkOption;)Ljava/nio/file/attribute/BasicFileAttributes;"/>
+ <method name="readAttributes(Ljava/nio/file/Path;Ljava/lang/String;[Ljava/nio/file/LinkOption;)Ljava/util/Map;"/>
+ <method name="readSymbolicLink(Ljava/nio/file/Path;)Ljava/nio/file/Path;"/>
+ <method name="setAttribute(Ljava/nio/file/Path;Ljava/lang/String;Ljava/lang/Object;[Ljava/nio/file/LinkOption;)V"/>
+ </class>
+ <class name="java/nio/file/spi/FileTypeDetector" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="probeContentType(Ljava/nio/file/Path;)Ljava/lang/String;"/>
+ </class>
+ <class name="java/security/AccessControlContext" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/security/AccessControlContext;Ljava/security/DomainCombiner;)V"/>
+ <method name="&lt;init>([Ljava/security/ProtectionDomain;)V"/>
+ <method name="checkPermission(Ljava/security/Permission;)V"/>
+ <method name="getDomainCombiner()Ljava/security/DomainCombiner;"/>
+ </class>
+ <class name="java/security/AccessControlException" since="1">
+ <extends name="java/lang/SecurityException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/security/Permission;)V"/>
+ <method name="getPermission()Ljava/security/Permission;"/>
+ </class>
+ <class name="java/security/AccessController" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="checkPermission(Ljava/security/Permission;)V"/>
+ <method name="doPrivileged(Ljava/security/PrivilegedAction;)Ljava/lang/Object;"/>
+ <method name="doPrivileged(Ljava/security/PrivilegedAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;"/>
+ <method name="doPrivileged(Ljava/security/PrivilegedExceptionAction;)Ljava/lang/Object;"/>
+ <method name="doPrivileged(Ljava/security/PrivilegedExceptionAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;"/>
+ <method name="doPrivilegedWithCombiner(Ljava/security/PrivilegedAction;)Ljava/lang/Object;" since="9"/>
+ <method name="doPrivilegedWithCombiner(Ljava/security/PrivilegedExceptionAction;)Ljava/lang/Object;" since="9"/>
+ <method name="getContext()Ljava/security/AccessControlContext;"/>
+ </class>
+ <class name="java/security/AlgorithmConstraints" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="permits(Ljava/util/Set;Ljava/lang/String;Ljava/security/AlgorithmParameters;)Z"/>
+ <method name="permits(Ljava/util/Set;Ljava/lang/String;Ljava/security/Key;Ljava/security/AlgorithmParameters;)Z"/>
+ <method name="permits(Ljava/util/Set;Ljava/security/Key;)Z"/>
+ </class>
+ <class name="java/security/AlgorithmParameterGenerator" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/security/AlgorithmParameterGeneratorSpi;Ljava/security/Provider;Ljava/lang/String;)V"/>
+ <method name="generateParameters()Ljava/security/AlgorithmParameters;"/>
+ <method name="getAlgorithm()Ljava/lang/String;"/>
+ <method name="getInstance(Ljava/lang/String;)Ljava/security/AlgorithmParameterGenerator;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/AlgorithmParameterGenerator;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/AlgorithmParameterGenerator;"/>
+ <method name="getProvider()Ljava/security/Provider;"/>
+ <method name="init(I)V"/>
+ <method name="init(ILjava/security/SecureRandom;)V"/>
+ <method name="init(Ljava/security/spec/AlgorithmParameterSpec;)V"/>
+ <method name="init(Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V"/>
+ </class>
+ <class name="java/security/AlgorithmParameterGeneratorSpi" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="engineGenerateParameters()Ljava/security/AlgorithmParameters;"/>
+ <method name="engineInit(ILjava/security/SecureRandom;)V"/>
+ <method name="engineInit(Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V"/>
+ </class>
+ <class name="java/security/AlgorithmParameters" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/security/AlgorithmParametersSpi;Ljava/security/Provider;Ljava/lang/String;)V"/>
+ <method name="getAlgorithm()Ljava/lang/String;"/>
+ <method name="getEncoded()[B"/>
+ <method name="getEncoded(Ljava/lang/String;)[B"/>
+ <method name="getInstance(Ljava/lang/String;)Ljava/security/AlgorithmParameters;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/AlgorithmParameters;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/AlgorithmParameters;"/>
+ <method name="getParameterSpec(Ljava/lang/Class;)Ljava/security/spec/AlgorithmParameterSpec;"/>
+ <method name="getProvider()Ljava/security/Provider;"/>
+ <method name="init(Ljava/security/spec/AlgorithmParameterSpec;)V"/>
+ <method name="init([B)V"/>
+ <method name="init([BLjava/lang/String;)V"/>
+ </class>
+ <class name="java/security/AlgorithmParametersSpi" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="engineGetEncoded()[B"/>
+ <method name="engineGetEncoded(Ljava/lang/String;)[B"/>
+ <method name="engineGetParameterSpec(Ljava/lang/Class;)Ljava/security/spec/AlgorithmParameterSpec;"/>
+ <method name="engineInit(Ljava/security/spec/AlgorithmParameterSpec;)V"/>
+ <method name="engineInit([B)V"/>
+ <method name="engineInit([BLjava/lang/String;)V"/>
+ <method name="engineToString()Ljava/lang/String;"/>
+ </class>
+ <class name="java/security/AllPermission" since="1">
+ <extends name="java/security/Permission"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/security/AuthProvider" since="1">
+ <extends name="java/security/Provider"/>
+ <method name="&lt;init>(Ljava/lang/String;DLjava/lang/String;)V"/>
+ <method name="login(Ljavax/security/auth/Subject;Ljavax/security/auth/callback/CallbackHandler;)V"/>
+ <method name="logout()V"/>
+ <method name="setCallbackHandler(Ljavax/security/auth/callback/CallbackHandler;)V"/>
+ </class>
+ <class name="java/security/BasicPermission" since="1">
+ <extends name="java/security/Permission"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/security/Certificate" since="1" deprecated="3">
+ <extends name="java/lang/Object"/>
+ <method name="decode(Ljava/io/InputStream;)V"/>
+ <method name="encode(Ljava/io/OutputStream;)V"/>
+ <method name="getFormat()Ljava/lang/String;"/>
+ <method name="getGuarantor()Ljava/security/Principal;"/>
+ <method name="getPrincipal()Ljava/security/Principal;"/>
+ <method name="getPublicKey()Ljava/security/PublicKey;"/>
+ <method name="toString(Z)Ljava/lang/String;"/>
+ </class>
+ <class name="java/security/CodeSigner" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(Ljava/security/cert/CertPath;Ljava/security/Timestamp;)V"/>
+ <method name="getSignerCertPath()Ljava/security/cert/CertPath;"/>
+ <method name="getTimestamp()Ljava/security/Timestamp;"/>
+ </class>
+ <class name="java/security/CodeSource" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(Ljava/net/URL;[Ljava/security/CodeSigner;)V"/>
+ <method name="&lt;init>(Ljava/net/URL;[Ljava/security/cert/Certificate;)V"/>
+ <method name="getCertificates()[Ljava/security/cert/Certificate;"/>
+ <method name="getCodeSigners()[Ljava/security/CodeSigner;"/>
+ <method name="getLocation()Ljava/net/URL;"/>
+ <method name="implies(Ljava/security/CodeSource;)Z"/>
+ </class>
+ <class name="java/security/CryptoPrimitive" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/security/CryptoPrimitive;"/>
+ <method name="values()[Ljava/security/CryptoPrimitive;"/>
+ <field name="BLOCK_CIPHER"/>
+ <field name="KEY_AGREEMENT"/>
+ <field name="KEY_ENCAPSULATION"/>
+ <field name="KEY_WRAP"/>
+ <field name="MAC"/>
+ <field name="MESSAGE_DIGEST"/>
+ <field name="PUBLIC_KEY_ENCRYPTION"/>
+ <field name="SECURE_RANDOM"/>
+ <field name="SIGNATURE"/>
+ <field name="STREAM_CIPHER"/>
+ </class>
+ <class name="java/security/DigestException" since="1">
+ <extends name="java/security/GeneralSecurityException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/security/DigestInputStream" since="1">
+ <extends name="java/io/FilterInputStream"/>
+ <method name="&lt;init>(Ljava/io/InputStream;Ljava/security/MessageDigest;)V"/>
+ <method name="getMessageDigest()Ljava/security/MessageDigest;"/>
+ <method name="on(Z)V"/>
+ <method name="setMessageDigest(Ljava/security/MessageDigest;)V"/>
+ <field name="digest"/>
+ </class>
+ <class name="java/security/DigestOutputStream" since="1">
+ <extends name="java/io/FilterOutputStream"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/security/MessageDigest;)V"/>
+ <method name="getMessageDigest()Ljava/security/MessageDigest;"/>
+ <method name="on(Z)V"/>
+ <method name="setMessageDigest(Ljava/security/MessageDigest;)V"/>
+ <field name="digest"/>
+ </class>
+ <class name="java/security/DomainCombiner" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="combine([Ljava/security/ProtectionDomain;[Ljava/security/ProtectionDomain;)[Ljava/security/ProtectionDomain;"/>
+ </class>
+ <class name="java/security/DomainLoadStoreParameter" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/KeyStore$LoadStoreParameter"/>
+ <method name="&lt;init>(Ljava/net/URI;Ljava/util/Map;)V"/>
+ <method name="getConfiguration()Ljava/net/URI;"/>
+ <method name="getProtectionParams()Ljava/util/Map;"/>
+ </class>
+ <class name="java/security/GeneralSecurityException" since="1">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/security/Guard" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="checkGuard(Ljava/lang/Object;)V"/>
+ </class>
+ <class name="java/security/GuardedObject" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(Ljava/lang/Object;Ljava/security/Guard;)V"/>
+ <method name="getObject()Ljava/lang/Object;"/>
+ </class>
+ <class name="java/security/Identity" since="1" deprecated="3">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/security/Principal"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/security/IdentityScope;)V"/>
+ <method name="addCertificate(Ljava/security/Certificate;)V"/>
+ <method name="certificates()[Ljava/security/Certificate;"/>
+ <method name="getInfo()Ljava/lang/String;"/>
+ <method name="getPublicKey()Ljava/security/PublicKey;"/>
+ <method name="getScope()Ljava/security/IdentityScope;"/>
+ <method name="identityEquals(Ljava/security/Identity;)Z"/>
+ <method name="removeCertificate(Ljava/security/Certificate;)V"/>
+ <method name="setInfo(Ljava/lang/String;)V"/>
+ <method name="setPublicKey(Ljava/security/PublicKey;)V"/>
+ <method name="toString(Z)Ljava/lang/String;"/>
+ </class>
+ <class name="java/security/IdentityScope" since="1" deprecated="3">
+ <extends name="java/security/Identity"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/security/IdentityScope;)V"/>
+ <method name="addIdentity(Ljava/security/Identity;)V"/>
+ <method name="getIdentity(Ljava/lang/String;)Ljava/security/Identity;"/>
+ <method name="getIdentity(Ljava/security/Principal;)Ljava/security/Identity;"/>
+ <method name="getIdentity(Ljava/security/PublicKey;)Ljava/security/Identity;"/>
+ <method name="getSystemScope()Ljava/security/IdentityScope;"/>
+ <method name="identities()Ljava/util/Enumeration;"/>
+ <method name="removeIdentity(Ljava/security/Identity;)V"/>
+ <method name="setSystemScope(Ljava/security/IdentityScope;)V"/>
+ <method name="size()I"/>
+ </class>
+ <class name="java/security/InvalidAlgorithmParameterException" since="1">
+ <extends name="java/security/GeneralSecurityException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/security/InvalidKeyException" since="1">
+ <extends name="java/security/KeyException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/security/InvalidParameterException" since="1">
+ <extends name="java/lang/IllegalArgumentException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/security/Key" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="getAlgorithm()Ljava/lang/String;"/>
+ <method name="getEncoded()[B"/>
+ <method name="getFormat()Ljava/lang/String;"/>
+ <field name="serialVersionUID"/>
+ </class>
+ <class name="java/security/KeyException" since="1">
+ <extends name="java/security/GeneralSecurityException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/security/KeyFactory" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/security/KeyFactorySpi;Ljava/security/Provider;Ljava/lang/String;)V"/>
+ <method name="generatePrivate(Ljava/security/spec/KeySpec;)Ljava/security/PrivateKey;"/>
+ <method name="generatePublic(Ljava/security/spec/KeySpec;)Ljava/security/PublicKey;"/>
+ <method name="getAlgorithm()Ljava/lang/String;"/>
+ <method name="getInstance(Ljava/lang/String;)Ljava/security/KeyFactory;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/KeyFactory;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/KeyFactory;"/>
+ <method name="getKeySpec(Ljava/security/Key;Ljava/lang/Class;)Ljava/security/spec/KeySpec;"/>
+ <method name="getProvider()Ljava/security/Provider;"/>
+ <method name="translateKey(Ljava/security/Key;)Ljava/security/Key;"/>
+ </class>
+ <class name="java/security/KeyFactorySpi" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="engineGeneratePrivate(Ljava/security/spec/KeySpec;)Ljava/security/PrivateKey;"/>
+ <method name="engineGeneratePublic(Ljava/security/spec/KeySpec;)Ljava/security/PublicKey;"/>
+ <method name="engineGetKeySpec(Ljava/security/Key;Ljava/lang/Class;)Ljava/security/spec/KeySpec;"/>
+ <method name="engineTranslateKey(Ljava/security/Key;)Ljava/security/Key;"/>
+ </class>
+ <class name="java/security/KeyManagementException" since="1">
+ <extends name="java/security/KeyException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/security/KeyPair" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(Ljava/security/PublicKey;Ljava/security/PrivateKey;)V"/>
+ <method name="getPrivate()Ljava/security/PrivateKey;"/>
+ <method name="getPublic()Ljava/security/PublicKey;"/>
+ </class>
+ <class name="java/security/KeyPairGenerator" since="1">
+ <extends name="java/security/KeyPairGeneratorSpi"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="genKeyPair()Ljava/security/KeyPair;"/>
+ <method name="getAlgorithm()Ljava/lang/String;"/>
+ <method name="getInstance(Ljava/lang/String;)Ljava/security/KeyPairGenerator;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/KeyPairGenerator;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/KeyPairGenerator;"/>
+ <method name="getProvider()Ljava/security/Provider;"/>
+ <method name="initialize(I)V"/>
+ <method name="initialize(Ljava/security/spec/AlgorithmParameterSpec;)V"/>
+ </class>
+ <class name="java/security/KeyPairGeneratorSpi" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="generateKeyPair()Ljava/security/KeyPair;"/>
+ <method name="initialize(ILjava/security/SecureRandom;)V"/>
+ <method name="initialize(Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V"/>
+ </class>
+ <class name="java/security/KeyRep" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(Ljava/security/KeyRep$Type;Ljava/lang/String;Ljava/lang/String;[B)V"/>
+ <method name="readResolve()Ljava/lang/Object;"/>
+ </class>
+ <class name="java/security/KeyRep$Type" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/security/KeyRep$Type;"/>
+ <method name="values()[Ljava/security/KeyRep$Type;"/>
+ <field name="PRIVATE"/>
+ <field name="PUBLIC"/>
+ <field name="SECRET"/>
+ </class>
+ <class name="java/security/KeyStore" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/security/KeyStoreSpi;Ljava/security/Provider;Ljava/lang/String;)V"/>
+ <method name="aliases()Ljava/util/Enumeration;"/>
+ <method name="containsAlias(Ljava/lang/String;)Z"/>
+ <method name="deleteEntry(Ljava/lang/String;)V"/>
+ <method name="entryInstanceOf(Ljava/lang/String;Ljava/lang/Class;)Z"/>
+ <method name="getCertificate(Ljava/lang/String;)Ljava/security/cert/Certificate;"/>
+ <method name="getCertificateAlias(Ljava/security/cert/Certificate;)Ljava/lang/String;"/>
+ <method name="getCertificateChain(Ljava/lang/String;)[Ljava/security/cert/Certificate;"/>
+ <method name="getCreationDate(Ljava/lang/String;)Ljava/util/Date;"/>
+ <method name="getDefaultType()Ljava/lang/String;"/>
+ <method name="getEntry(Ljava/lang/String;Ljava/security/KeyStore$ProtectionParameter;)Ljava/security/KeyStore$Entry;"/>
+ <method name="getInstance(Ljava/lang/String;)Ljava/security/KeyStore;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/KeyStore;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/KeyStore;"/>
+ <method name="getKey(Ljava/lang/String;[C)Ljava/security/Key;"/>
+ <method name="getProvider()Ljava/security/Provider;"/>
+ <method name="getType()Ljava/lang/String;"/>
+ <method name="isCertificateEntry(Ljava/lang/String;)Z"/>
+ <method name="isKeyEntry(Ljava/lang/String;)Z"/>
+ <method name="load(Ljava/io/InputStream;[C)V"/>
+ <method name="load(Ljava/security/KeyStore$LoadStoreParameter;)V"/>
+ <method name="setCertificateEntry(Ljava/lang/String;Ljava/security/cert/Certificate;)V"/>
+ <method name="setEntry(Ljava/lang/String;Ljava/security/KeyStore$Entry;Ljava/security/KeyStore$ProtectionParameter;)V"/>
+ <method name="setKeyEntry(Ljava/lang/String;Ljava/security/Key;[C[Ljava/security/cert/Certificate;)V"/>
+ <method name="setKeyEntry(Ljava/lang/String;[B[Ljava/security/cert/Certificate;)V"/>
+ <method name="size()I"/>
+ <method name="store(Ljava/io/OutputStream;[C)V"/>
+ <method name="store(Ljava/security/KeyStore$LoadStoreParameter;)V"/>
+ </class>
+ <class name="java/security/KeyStore$Builder" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getKeyStore()Ljava/security/KeyStore;"/>
+ <method name="getProtectionParameter(Ljava/lang/String;)Ljava/security/KeyStore$ProtectionParameter;"/>
+ <method name="newInstance(Ljava/lang/String;Ljava/security/Provider;Ljava/io/File;Ljava/security/KeyStore$ProtectionParameter;)Ljava/security/KeyStore$Builder;"/>
+ <method name="newInstance(Ljava/lang/String;Ljava/security/Provider;Ljava/security/KeyStore$ProtectionParameter;)Ljava/security/KeyStore$Builder;"/>
+ <method name="newInstance(Ljava/security/KeyStore;Ljava/security/KeyStore$ProtectionParameter;)Ljava/security/KeyStore$Builder;"/>
+ </class>
+ <class name="java/security/KeyStore$CallbackHandlerProtection" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/KeyStore$ProtectionParameter"/>
+ <method name="&lt;init>(Ljavax/security/auth/callback/CallbackHandler;)V"/>
+ <method name="getCallbackHandler()Ljavax/security/auth/callback/CallbackHandler;"/>
+ </class>
+ <class name="java/security/KeyStore$Entry" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getAttributes()Ljava/util/Set;" since="26"/>
+ </class>
+ <class name="java/security/KeyStore$Entry$Attribute" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getValue()Ljava/lang/String;"/>
+ </class>
+ <class name="java/security/KeyStore$LoadStoreParameter" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getProtectionParameter()Ljava/security/KeyStore$ProtectionParameter;"/>
+ </class>
+ <class name="java/security/KeyStore$PasswordProtection" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/KeyStore$ProtectionParameter"/>
+ <implements name="javax/security/auth/Destroyable"/>
+ <method name="&lt;init>([C)V"/>
+ <method name="&lt;init>([CLjava/lang/String;Ljava/security/spec/AlgorithmParameterSpec;)V" since="26"/>
+ <method name="getPassword()[C"/>
+ <method name="getProtectionAlgorithm()Ljava/lang/String;" since="26"/>
+ <method name="getProtectionParameters()Ljava/security/spec/AlgorithmParameterSpec;" since="26"/>
+ </class>
+ <class name="java/security/KeyStore$PrivateKeyEntry" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/KeyStore$Entry"/>
+ <method name="&lt;init>(Ljava/security/PrivateKey;[Ljava/security/cert/Certificate;)V"/>
+ <method name="&lt;init>(Ljava/security/PrivateKey;[Ljava/security/cert/Certificate;Ljava/util/Set;)V" since="26"/>
+ <method name="getCertificate()Ljava/security/cert/Certificate;"/>
+ <method name="getCertificateChain()[Ljava/security/cert/Certificate;"/>
+ <method name="getPrivateKey()Ljava/security/PrivateKey;"/>
+ </class>
+ <class name="java/security/KeyStore$ProtectionParameter" since="1">
+ <extends name="java/lang/Object"/>
+ </class>
+ <class name="java/security/KeyStore$SecretKeyEntry" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/KeyStore$Entry"/>
+ <method name="&lt;init>(Ljavax/crypto/SecretKey;)V"/>
+ <method name="&lt;init>(Ljavax/crypto/SecretKey;Ljava/util/Set;)V" since="26"/>
+ <method name="getSecretKey()Ljavax/crypto/SecretKey;"/>
+ </class>
+ <class name="java/security/KeyStore$TrustedCertificateEntry" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/KeyStore$Entry"/>
+ <method name="&lt;init>(Ljava/security/cert/Certificate;)V"/>
+ <method name="&lt;init>(Ljava/security/cert/Certificate;Ljava/util/Set;)V" since="26"/>
+ <method name="getTrustedCertificate()Ljava/security/cert/Certificate;"/>
+ </class>
+ <class name="java/security/KeyStoreException" since="1">
+ <extends name="java/security/GeneralSecurityException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/security/KeyStoreSpi" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="engineAliases()Ljava/util/Enumeration;"/>
+ <method name="engineContainsAlias(Ljava/lang/String;)Z"/>
+ <method name="engineDeleteEntry(Ljava/lang/String;)V"/>
+ <method name="engineEntryInstanceOf(Ljava/lang/String;Ljava/lang/Class;)Z"/>
+ <method name="engineGetCertificate(Ljava/lang/String;)Ljava/security/cert/Certificate;"/>
+ <method name="engineGetCertificateAlias(Ljava/security/cert/Certificate;)Ljava/lang/String;"/>
+ <method name="engineGetCertificateChain(Ljava/lang/String;)[Ljava/security/cert/Certificate;"/>
+ <method name="engineGetCreationDate(Ljava/lang/String;)Ljava/util/Date;"/>
+ <method name="engineGetEntry(Ljava/lang/String;Ljava/security/KeyStore$ProtectionParameter;)Ljava/security/KeyStore$Entry;"/>
+ <method name="engineGetKey(Ljava/lang/String;[C)Ljava/security/Key;"/>
+ <method name="engineIsCertificateEntry(Ljava/lang/String;)Z"/>
+ <method name="engineIsKeyEntry(Ljava/lang/String;)Z"/>
+ <method name="engineLoad(Ljava/io/InputStream;[C)V"/>
+ <method name="engineLoad(Ljava/security/KeyStore$LoadStoreParameter;)V"/>
+ <method name="engineSetCertificateEntry(Ljava/lang/String;Ljava/security/cert/Certificate;)V"/>
+ <method name="engineSetEntry(Ljava/lang/String;Ljava/security/KeyStore$Entry;Ljava/security/KeyStore$ProtectionParameter;)V"/>
+ <method name="engineSetKeyEntry(Ljava/lang/String;Ljava/security/Key;[C[Ljava/security/cert/Certificate;)V"/>
+ <method name="engineSetKeyEntry(Ljava/lang/String;[B[Ljava/security/cert/Certificate;)V"/>
+ <method name="engineSize()I"/>
+ <method name="engineStore(Ljava/io/OutputStream;[C)V"/>
+ <method name="engineStore(Ljava/security/KeyStore$LoadStoreParameter;)V"/>
+ </class>
+ <class name="java/security/MessageDigest" since="1">
+ <extends name="java/security/MessageDigestSpi"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="digest()[B"/>
+ <method name="digest([B)[B"/>
+ <method name="digest([BII)I"/>
+ <method name="getAlgorithm()Ljava/lang/String;"/>
+ <method name="getDigestLength()I"/>
+ <method name="getInstance(Ljava/lang/String;)Ljava/security/MessageDigest;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/MessageDigest;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/MessageDigest;"/>
+ <method name="getProvider()Ljava/security/Provider;"/>
+ <method name="isEqual([B[B)Z"/>
+ <method name="reset()V"/>
+ <method name="update(B)V"/>
+ <method name="update(Ljava/nio/ByteBuffer;)V"/>
+ <method name="update([B)V"/>
+ <method name="update([BII)V"/>
+ </class>
+ <class name="java/security/MessageDigestSpi" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="engineDigest()[B"/>
+ <method name="engineDigest([BII)I"/>
+ <method name="engineGetDigestLength()I"/>
+ <method name="engineReset()V"/>
+ <method name="engineUpdate(B)V"/>
+ <method name="engineUpdate(Ljava/nio/ByteBuffer;)V"/>
+ <method name="engineUpdate([BII)V"/>
+ </class>
+ <class name="java/security/NoSuchAlgorithmException" since="1">
+ <extends name="java/security/GeneralSecurityException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/security/NoSuchProviderException" since="1">
+ <extends name="java/security/GeneralSecurityException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/security/PKCS12Attribute" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/KeyStore$Entry$Attribute"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>([B)V"/>
+ <method name="getEncoded()[B"/>
+ </class>
+ <class name="java/security/Permission" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/security/Guard"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getActions()Ljava/lang/String;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="implies(Ljava/security/Permission;)Z"/>
+ <method name="newPermissionCollection()Ljava/security/PermissionCollection;"/>
+ </class>
+ <class name="java/security/PermissionCollection" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="add(Ljava/security/Permission;)V"/>
+ <method name="elements()Ljava/util/Enumeration;"/>
+ <method name="implies(Ljava/security/Permission;)Z"/>
+ <method name="isReadOnly()Z"/>
+ <method name="setReadOnly()V"/>
+ </class>
+ <class name="java/security/Permissions" since="1">
+ <extends name="java/security/PermissionCollection"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/security/Policy" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Policy$Parameters;)Ljava/security/Policy;" since="9"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Policy$Parameters;Ljava/lang/String;)Ljava/security/Policy;" since="9"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Policy$Parameters;Ljava/security/Provider;)Ljava/security/Policy;" since="9"/>
+ <method name="getParameters()Ljava/security/Policy$Parameters;" since="9"/>
+ <method name="getPermissions(Ljava/security/CodeSource;)Ljava/security/PermissionCollection;"/>
+ <method name="getPermissions(Ljava/security/ProtectionDomain;)Ljava/security/PermissionCollection;"/>
+ <method name="getPolicy()Ljava/security/Policy;"/>
+ <method name="getProvider()Ljava/security/Provider;" since="9"/>
+ <method name="getType()Ljava/lang/String;" since="9"/>
+ <method name="implies(Ljava/security/ProtectionDomain;Ljava/security/Permission;)Z"/>
+ <method name="refresh()V"/>
+ <method name="setPolicy(Ljava/security/Policy;)V"/>
+ <field name="UNSUPPORTED_EMPTY_COLLECTION" since="9"/>
+ </class>
+ <class name="java/security/Policy$Parameters" since="9">
+ <extends name="java/lang/Object"/>
+ </class>
+ <class name="java/security/PolicySpi" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="engineGetPermissions(Ljava/security/CodeSource;)Ljava/security/PermissionCollection;"/>
+ <method name="engineGetPermissions(Ljava/security/ProtectionDomain;)Ljava/security/PermissionCollection;"/>
+ <method name="engineImplies(Ljava/security/ProtectionDomain;Ljava/security/Permission;)Z"/>
+ <method name="engineRefresh()V"/>
+ </class>
+ <class name="java/security/Principal" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="implies(Ljavax/security/auth/Subject;)Z" since="26"/>
+ </class>
+ <class name="java/security/PrivateKey" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/Key"/>
+ <implements name="javax/security/auth/Destroyable" since="26"/>
+ <field name="serialVersionUID"/>
+ </class>
+ <class name="java/security/PrivilegedAction" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="run()Ljava/lang/Object;"/>
+ </class>
+ <class name="java/security/PrivilegedActionException" since="1">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>(Ljava/lang/Exception;)V"/>
+ <method name="getException()Ljava/lang/Exception;"/>
+ </class>
+ <class name="java/security/PrivilegedExceptionAction" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="run()Ljava/lang/Object;"/>
+ </class>
+ <class name="java/security/ProtectionDomain" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/security/CodeSource;Ljava/security/PermissionCollection;)V"/>
+ <method name="&lt;init>(Ljava/security/CodeSource;Ljava/security/PermissionCollection;Ljava/lang/ClassLoader;[Ljava/security/Principal;)V"/>
+ <method name="getClassLoader()Ljava/lang/ClassLoader;"/>
+ <method name="getCodeSource()Ljava/security/CodeSource;"/>
+ <method name="getPermissions()Ljava/security/PermissionCollection;"/>
+ <method name="getPrincipals()[Ljava/security/Principal;"/>
+ <method name="implies(Ljava/security/Permission;)Z"/>
+ </class>
+ <class name="java/security/Provider" since="1">
+ <extends name="java/util/Properties"/>
+ <method name="&lt;init>(Ljava/lang/String;DLjava/lang/String;)V"/>
+ <method name="getInfo()Ljava/lang/String;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getService(Ljava/lang/String;Ljava/lang/String;)Ljava/security/Provider$Service;"/>
+ <method name="getServices()Ljava/util/Set;"/>
+ <method name="getVersion()D"/>
+ <method name="putService(Ljava/security/Provider$Service;)V"/>
+ <method name="removeService(Ljava/security/Provider$Service;)V"/>
+ </class>
+ <class name="java/security/Provider$Service" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/security/Provider;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/Map;)V"/>
+ <method name="getAlgorithm()Ljava/lang/String;"/>
+ <method name="getAttribute(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getClassName()Ljava/lang/String;"/>
+ <method name="getProvider()Ljava/security/Provider;"/>
+ <method name="getType()Ljava/lang/String;"/>
+ <method name="newInstance(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="supportsParameter(Ljava/lang/Object;)Z"/>
+ </class>
+ <class name="java/security/ProviderException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/security/PublicKey" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/Key"/>
+ <field name="serialVersionUID"/>
+ </class>
+ <class name="java/security/SecureClassLoader" since="1">
+ <extends name="java/lang/ClassLoader"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/ClassLoader;)V"/>
+ <method name="defineClass(Ljava/lang/String;Ljava/nio/ByteBuffer;Ljava/security/CodeSource;)Ljava/lang/Class;"/>
+ <method name="defineClass(Ljava/lang/String;[BIILjava/security/CodeSource;)Ljava/lang/Class;"/>
+ <method name="getPermissions(Ljava/security/CodeSource;)Ljava/security/PermissionCollection;"/>
+ </class>
+ <class name="java/security/SecureRandom" since="1">
+ <extends name="java/util/Random"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/security/SecureRandomSpi;Ljava/security/Provider;)V"/>
+ <method name="&lt;init>([B)V"/>
+ <method name="generateSeed(I)[B"/>
+ <method name="getAlgorithm()Ljava/lang/String;"/>
+ <method name="getInstance(Ljava/lang/String;)Ljava/security/SecureRandom;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/SecureRandom;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/SecureRandom;"/>
+ <method name="getInstanceStrong()Ljava/security/SecureRandom;" since="26"/>
+ <method name="getProvider()Ljava/security/Provider;"/>
+ <method name="getSeed(I)[B"/>
+ <method name="setSeed([B)V"/>
+ </class>
+ <class name="java/security/SecureRandomSpi" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="engineGenerateSeed(I)[B"/>
+ <method name="engineNextBytes([B)V"/>
+ <method name="engineSetSeed([B)V"/>
+ </class>
+ <class name="java/security/Security" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addProvider(Ljava/security/Provider;)I"/>
+ <method name="getAlgorithmProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" deprecated="16"/>
+ <method name="getAlgorithms(Ljava/lang/String;)Ljava/util/Set;"/>
+ <method name="getProperty(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getProvider(Ljava/lang/String;)Ljava/security/Provider;"/>
+ <method name="getProviders()[Ljava/security/Provider;"/>
+ <method name="getProviders(Ljava/lang/String;)[Ljava/security/Provider;"/>
+ <method name="getProviders(Ljava/util/Map;)[Ljava/security/Provider;"/>
+ <method name="insertProviderAt(Ljava/security/Provider;I)I"/>
+ <method name="removeProvider(Ljava/lang/String;)V"/>
+ <method name="setProperty(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/security/SecurityPermission" since="1">
+ <extends name="java/security/BasicPermission"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/security/Signature" since="1">
+ <extends name="java/security/SignatureSpi"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getAlgorithm()Ljava/lang/String;"/>
+ <method name="getInstance(Ljava/lang/String;)Ljava/security/Signature;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/Signature;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/Signature;"/>
+ <method name="getParameter(Ljava/lang/String;)Ljava/lang/Object;" deprecated="16"/>
+ <method name="getParameters()Ljava/security/AlgorithmParameters;"/>
+ <method name="getProvider()Ljava/security/Provider;"/>
+ <method name="initSign(Ljava/security/PrivateKey;)V"/>
+ <method name="initSign(Ljava/security/PrivateKey;Ljava/security/SecureRandom;)V"/>
+ <method name="initVerify(Ljava/security/PublicKey;)V"/>
+ <method name="initVerify(Ljava/security/cert/Certificate;)V"/>
+ <method name="setParameter(Ljava/lang/String;Ljava/lang/Object;)V" deprecated="16"/>
+ <method name="setParameter(Ljava/security/spec/AlgorithmParameterSpec;)V"/>
+ <method name="sign()[B"/>
+ <method name="sign([BII)I"/>
+ <method name="update(B)V"/>
+ <method name="update(Ljava/nio/ByteBuffer;)V"/>
+ <method name="update([B)V"/>
+ <method name="update([BII)V"/>
+ <method name="verify([B)Z"/>
+ <method name="verify([BII)Z"/>
+ <field name="SIGN"/>
+ <field name="UNINITIALIZED"/>
+ <field name="VERIFY"/>
+ <field name="state"/>
+ </class>
+ <class name="java/security/SignatureException" since="1">
+ <extends name="java/security/GeneralSecurityException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/security/SignatureSpi" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="engineGetParameter(Ljava/lang/String;)Ljava/lang/Object;" deprecated="16"/>
+ <method name="engineGetParameters()Ljava/security/AlgorithmParameters;"/>
+ <method name="engineInitSign(Ljava/security/PrivateKey;)V"/>
+ <method name="engineInitSign(Ljava/security/PrivateKey;Ljava/security/SecureRandom;)V"/>
+ <method name="engineInitVerify(Ljava/security/PublicKey;)V"/>
+ <method name="engineSetParameter(Ljava/lang/String;Ljava/lang/Object;)V" deprecated="16"/>
+ <method name="engineSetParameter(Ljava/security/spec/AlgorithmParameterSpec;)V"/>
+ <method name="engineSign()[B"/>
+ <method name="engineSign([BII)I"/>
+ <method name="engineUpdate(B)V"/>
+ <method name="engineUpdate(Ljava/nio/ByteBuffer;)V"/>
+ <method name="engineUpdate([BII)V"/>
+ <method name="engineVerify([B)Z"/>
+ <method name="engineVerify([BII)Z"/>
+ <field name="appRandom"/>
+ </class>
+ <class name="java/security/SignedObject" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(Ljava/io/Serializable;Ljava/security/PrivateKey;Ljava/security/Signature;)V"/>
+ <method name="getAlgorithm()Ljava/lang/String;"/>
+ <method name="getObject()Ljava/lang/Object;"/>
+ <method name="getSignature()[B"/>
+ <method name="verify(Ljava/security/PublicKey;Ljava/security/Signature;)Z"/>
+ </class>
+ <class name="java/security/Signer" since="1" deprecated="3">
+ <extends name="java/security/Identity"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/security/IdentityScope;)V"/>
+ <method name="getPrivateKey()Ljava/security/PrivateKey;"/>
+ <method name="setKeyPair(Ljava/security/KeyPair;)V"/>
+ </class>
+ <class name="java/security/Timestamp" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(Ljava/util/Date;Ljava/security/cert/CertPath;)V"/>
+ <method name="getSignerCertPath()Ljava/security/cert/CertPath;"/>
+ <method name="getTimestamp()Ljava/util/Date;"/>
+ </class>
+ <class name="java/security/UnrecoverableEntryException" since="1">
+ <extends name="java/security/GeneralSecurityException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/security/UnrecoverableKeyException" since="1">
+ <extends name="java/security/GeneralSecurityException" removed="9"/>
+ <extends name="java/security/UnrecoverableEntryException" since="9"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/security/UnresolvedPermission" since="1">
+ <extends name="java/security/Permission"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/security/cert/Certificate;)V"/>
+ <method name="getUnresolvedActions()Ljava/lang/String;"/>
+ <method name="getUnresolvedCerts()[Ljava/security/cert/Certificate;"/>
+ <method name="getUnresolvedName()Ljava/lang/String;"/>
+ <method name="getUnresolvedType()Ljava/lang/String;"/>
+ </class>
+ <class name="java/security/acl/Acl" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/acl/Owner"/>
+ <method name="addEntry(Ljava/security/Principal;Ljava/security/acl/AclEntry;)Z"/>
+ <method name="checkPermission(Ljava/security/Principal;Ljava/security/acl/Permission;)Z"/>
+ <method name="entries()Ljava/util/Enumeration;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getPermissions(Ljava/security/Principal;)Ljava/util/Enumeration;"/>
+ <method name="removeEntry(Ljava/security/Principal;Ljava/security/acl/AclEntry;)Z"/>
+ <method name="setName(Ljava/security/Principal;Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/security/acl/AclEntry" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="addPermission(Ljava/security/acl/Permission;)Z"/>
+ <method name="checkPermission(Ljava/security/acl/Permission;)Z"/>
+ <method name="getPrincipal()Ljava/security/Principal;"/>
+ <method name="isNegative()Z"/>
+ <method name="permissions()Ljava/util/Enumeration;"/>
+ <method name="removePermission(Ljava/security/acl/Permission;)Z"/>
+ <method name="setNegativePermissions()V"/>
+ <method name="setPrincipal(Ljava/security/Principal;)Z"/>
+ </class>
+ <class name="java/security/acl/AclNotFoundException" since="1">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/security/acl/Group" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/Principal"/>
+ <method name="addMember(Ljava/security/Principal;)Z"/>
+ <method name="isMember(Ljava/security/Principal;)Z"/>
+ <method name="members()Ljava/util/Enumeration;"/>
+ <method name="removeMember(Ljava/security/Principal;)Z"/>
+ </class>
+ <class name="java/security/acl/LastOwnerException" since="1">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/security/acl/NotOwnerException" since="1">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/security/acl/Owner" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="addOwner(Ljava/security/Principal;Ljava/security/Principal;)Z"/>
+ <method name="deleteOwner(Ljava/security/Principal;Ljava/security/Principal;)Z"/>
+ <method name="isOwner(Ljava/security/Principal;)Z"/>
+ </class>
+ <class name="java/security/acl/Permission" since="1">
+ <extends name="java/lang/Object"/>
+ </class>
+ <class name="java/security/cert/CRL" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getType()Ljava/lang/String;"/>
+ <method name="isRevoked(Ljava/security/cert/Certificate;)Z"/>
+ </class>
+ <class name="java/security/cert/CRLException" since="1">
+ <extends name="java/security/GeneralSecurityException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/security/cert/CRLReason" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/security/cert/CRLReason;"/>
+ <method name="values()[Ljava/security/cert/CRLReason;"/>
+ <field name="AA_COMPROMISE"/>
+ <field name="AFFILIATION_CHANGED"/>
+ <field name="CA_COMPROMISE"/>
+ <field name="CERTIFICATE_HOLD"/>
+ <field name="CESSATION_OF_OPERATION"/>
+ <field name="KEY_COMPROMISE"/>
+ <field name="PRIVILEGE_WITHDRAWN"/>
+ <field name="REMOVE_FROM_CRL"/>
+ <field name="SUPERSEDED"/>
+ <field name="UNSPECIFIED"/>
+ <field name="UNUSED"/>
+ </class>
+ <class name="java/security/cert/CRLSelector" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="match(Ljava/security/cert/CRL;)Z"/>
+ </class>
+ <class name="java/security/cert/CertPath" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getCertificates()Ljava/util/List;"/>
+ <method name="getEncoded()[B"/>
+ <method name="getEncoded(Ljava/lang/String;)[B"/>
+ <method name="getEncodings()Ljava/util/Iterator;"/>
+ <method name="getType()Ljava/lang/String;"/>
+ <method name="writeReplace()Ljava/lang/Object;"/>
+ </class>
+ <class name="java/security/cert/CertPath$CertPathRep" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(Ljava/lang/String;[B)V"/>
+ <method name="readResolve()Ljava/lang/Object;"/>
+ </class>
+ <class name="java/security/cert/CertPathBuilder" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/security/cert/CertPathBuilderSpi;Ljava/security/Provider;Ljava/lang/String;)V"/>
+ <method name="build(Ljava/security/cert/CertPathParameters;)Ljava/security/cert/CertPathBuilderResult;"/>
+ <method name="getAlgorithm()Ljava/lang/String;"/>
+ <method name="getDefaultType()Ljava/lang/String;"/>
+ <method name="getInstance(Ljava/lang/String;)Ljava/security/cert/CertPathBuilder;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/cert/CertPathBuilder;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/cert/CertPathBuilder;"/>
+ <method name="getProvider()Ljava/security/Provider;"/>
+ <method name="getRevocationChecker()Ljava/security/cert/CertPathChecker;" since="24"/>
+ </class>
+ <class name="java/security/cert/CertPathBuilderException" since="1">
+ <extends name="java/security/GeneralSecurityException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/security/cert/CertPathBuilderResult" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="getCertPath()Ljava/security/cert/CertPath;"/>
+ </class>
+ <class name="java/security/cert/CertPathBuilderSpi" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="engineBuild(Ljava/security/cert/CertPathParameters;)Ljava/security/cert/CertPathBuilderResult;"/>
+ <method name="engineGetRevocationChecker()Ljava/security/cert/CertPathChecker;" since="24"/>
+ </class>
+ <class name="java/security/cert/CertPathChecker" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="check(Ljava/security/cert/Certificate;)V"/>
+ <method name="init(Z)V"/>
+ <method name="isForwardCheckingSupported()Z"/>
+ </class>
+ <class name="java/security/cert/CertPathParameters" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ </class>
+ <class name="java/security/cert/CertPathValidator" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/security/cert/CertPathValidatorSpi;Ljava/security/Provider;Ljava/lang/String;)V"/>
+ <method name="getAlgorithm()Ljava/lang/String;"/>
+ <method name="getDefaultType()Ljava/lang/String;"/>
+ <method name="getInstance(Ljava/lang/String;)Ljava/security/cert/CertPathValidator;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/cert/CertPathValidator;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/cert/CertPathValidator;"/>
+ <method name="getProvider()Ljava/security/Provider;"/>
+ <method name="getRevocationChecker()Ljava/security/cert/CertPathChecker;" since="24"/>
+ <method name="validate(Ljava/security/cert/CertPath;Ljava/security/cert/CertPathParameters;)Ljava/security/cert/CertPathValidatorResult;"/>
+ </class>
+ <class name="java/security/cert/CertPathValidatorException" since="1">
+ <extends name="java/security/GeneralSecurityException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;Ljava/security/cert/CertPath;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;Ljava/security/cert/CertPath;ILjava/security/cert/CertPathValidatorException$Reason;)V" since="24"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ <method name="getCertPath()Ljava/security/cert/CertPath;"/>
+ <method name="getIndex()I"/>
+ <method name="getReason()Ljava/security/cert/CertPathValidatorException$Reason;" since="24"/>
+ </class>
+ <class name="java/security/cert/CertPathValidatorException$BasicReason" since="24">
+ <extends name="java/lang/Enum"/>
+ <implements name="java/security/cert/CertPathValidatorException$Reason"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/security/cert/CertPathValidatorException$BasicReason;"/>
+ <method name="values()[Ljava/security/cert/CertPathValidatorException$BasicReason;"/>
+ <field name="ALGORITHM_CONSTRAINED"/>
+ <field name="EXPIRED"/>
+ <field name="INVALID_SIGNATURE"/>
+ <field name="NOT_YET_VALID"/>
+ <field name="REVOKED"/>
+ <field name="UNDETERMINED_REVOCATION_STATUS"/>
+ <field name="UNSPECIFIED"/>
+ </class>
+ <class name="java/security/cert/CertPathValidatorException$Reason" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ </class>
+ <class name="java/security/cert/CertPathValidatorResult" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ </class>
+ <class name="java/security/cert/CertPathValidatorSpi" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="engineGetRevocationChecker()Ljava/security/cert/CertPathChecker;" since="24"/>
+ <method name="engineValidate(Ljava/security/cert/CertPath;Ljava/security/cert/CertPathParameters;)Ljava/security/cert/CertPathValidatorResult;"/>
+ </class>
+ <class name="java/security/cert/CertSelector" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="match(Ljava/security/cert/Certificate;)Z"/>
+ </class>
+ <class name="java/security/cert/CertStore" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/security/cert/CertStoreSpi;Ljava/security/Provider;Ljava/lang/String;Ljava/security/cert/CertStoreParameters;)V"/>
+ <method name="getCRLs(Ljava/security/cert/CRLSelector;)Ljava/util/Collection;"/>
+ <method name="getCertStoreParameters()Ljava/security/cert/CertStoreParameters;"/>
+ <method name="getCertificates(Ljava/security/cert/CertSelector;)Ljava/util/Collection;"/>
+ <method name="getDefaultType()Ljava/lang/String;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/security/cert/CertStoreParameters;)Ljava/security/cert/CertStore;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/security/cert/CertStoreParameters;Ljava/lang/String;)Ljava/security/cert/CertStore;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/security/cert/CertStoreParameters;Ljava/security/Provider;)Ljava/security/cert/CertStore;"/>
+ <method name="getProvider()Ljava/security/Provider;"/>
+ <method name="getType()Ljava/lang/String;"/>
+ </class>
+ <class name="java/security/cert/CertStoreException" since="1">
+ <extends name="java/security/GeneralSecurityException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/security/cert/CertStoreParameters" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ </class>
+ <class name="java/security/cert/CertStoreSpi" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/security/cert/CertStoreParameters;)V"/>
+ <method name="engineGetCRLs(Ljava/security/cert/CRLSelector;)Ljava/util/Collection;"/>
+ <method name="engineGetCertificates(Ljava/security/cert/CertSelector;)Ljava/util/Collection;"/>
+ </class>
+ <class name="java/security/cert/Certificate" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getEncoded()[B"/>
+ <method name="getPublicKey()Ljava/security/PublicKey;"/>
+ <method name="getType()Ljava/lang/String;"/>
+ <method name="verify(Ljava/security/PublicKey;)V"/>
+ <method name="verify(Ljava/security/PublicKey;Ljava/lang/String;)V"/>
+ <method name="verify(Ljava/security/PublicKey;Ljava/security/Provider;)V" since="26"/>
+ <method name="writeReplace()Ljava/lang/Object;"/>
+ </class>
+ <class name="java/security/cert/Certificate$CertificateRep" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(Ljava/lang/String;[B)V"/>
+ <method name="readResolve()Ljava/lang/Object;"/>
+ </class>
+ <class name="java/security/cert/CertificateEncodingException" since="1">
+ <extends name="java/security/cert/CertificateException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/security/cert/CertificateException" since="1">
+ <extends name="java/security/GeneralSecurityException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/security/cert/CertificateExpiredException" since="1">
+ <extends name="java/security/cert/CertificateException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/security/cert/CertificateFactory" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/security/cert/CertificateFactorySpi;Ljava/security/Provider;Ljava/lang/String;)V"/>
+ <method name="generateCRL(Ljava/io/InputStream;)Ljava/security/cert/CRL;"/>
+ <method name="generateCRLs(Ljava/io/InputStream;)Ljava/util/Collection;"/>
+ <method name="generateCertPath(Ljava/io/InputStream;)Ljava/security/cert/CertPath;"/>
+ <method name="generateCertPath(Ljava/io/InputStream;Ljava/lang/String;)Ljava/security/cert/CertPath;"/>
+ <method name="generateCertPath(Ljava/util/List;)Ljava/security/cert/CertPath;"/>
+ <method name="generateCertificate(Ljava/io/InputStream;)Ljava/security/cert/Certificate;"/>
+ <method name="generateCertificates(Ljava/io/InputStream;)Ljava/util/Collection;"/>
+ <method name="getCertPathEncodings()Ljava/util/Iterator;"/>
+ <method name="getInstance(Ljava/lang/String;)Ljava/security/cert/CertificateFactory;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/cert/CertificateFactory;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/cert/CertificateFactory;"/>
+ <method name="getProvider()Ljava/security/Provider;"/>
+ <method name="getType()Ljava/lang/String;"/>
+ </class>
+ <class name="java/security/cert/CertificateFactorySpi" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="engineGenerateCRL(Ljava/io/InputStream;)Ljava/security/cert/CRL;"/>
+ <method name="engineGenerateCRLs(Ljava/io/InputStream;)Ljava/util/Collection;"/>
+ <method name="engineGenerateCertPath(Ljava/io/InputStream;)Ljava/security/cert/CertPath;"/>
+ <method name="engineGenerateCertPath(Ljava/io/InputStream;Ljava/lang/String;)Ljava/security/cert/CertPath;"/>
+ <method name="engineGenerateCertPath(Ljava/util/List;)Ljava/security/cert/CertPath;"/>
+ <method name="engineGenerateCertificate(Ljava/io/InputStream;)Ljava/security/cert/Certificate;"/>
+ <method name="engineGenerateCertificates(Ljava/io/InputStream;)Ljava/util/Collection;"/>
+ <method name="engineGetCertPathEncodings()Ljava/util/Iterator;"/>
+ </class>
+ <class name="java/security/cert/CertificateNotYetValidException" since="1">
+ <extends name="java/security/cert/CertificateException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/security/cert/CertificateParsingException" since="1">
+ <extends name="java/security/cert/CertificateException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/security/cert/CertificateRevokedException" since="24">
+ <extends name="java/security/cert/CertificateException"/>
+ <method name="&lt;init>(Ljava/util/Date;Ljava/security/cert/CRLReason;Ljavax/security/auth/x500/X500Principal;Ljava/util/Map;)V"/>
+ <method name="getAuthorityName()Ljavax/security/auth/x500/X500Principal;"/>
+ <method name="getExtensions()Ljava/util/Map;"/>
+ <method name="getInvalidityDate()Ljava/util/Date;"/>
+ <method name="getRevocationDate()Ljava/util/Date;"/>
+ <method name="getRevocationReason()Ljava/security/cert/CRLReason;"/>
+ </class>
+ <class name="java/security/cert/CollectionCertStoreParameters" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/cert/CertStoreParameters"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/util/Collection;)V"/>
+ <method name="getCollection()Ljava/util/Collection;"/>
+ </class>
+ <class name="java/security/cert/Extension" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="encode(Ljava/io/OutputStream;)V"/>
+ <method name="getId()Ljava/lang/String;"/>
+ <method name="getValue()[B"/>
+ <method name="isCritical()Z"/>
+ </class>
+ <class name="java/security/cert/LDAPCertStoreParameters" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/cert/CertStoreParameters"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="getPort()I"/>
+ <method name="getServerName()Ljava/lang/String;"/>
+ </class>
+ <class name="java/security/cert/PKIXBuilderParameters" since="1">
+ <extends name="java/security/cert/PKIXParameters"/>
+ <method name="&lt;init>(Ljava/security/KeyStore;Ljava/security/cert/CertSelector;)V"/>
+ <method name="&lt;init>(Ljava/util/Set;Ljava/security/cert/CertSelector;)V"/>
+ <method name="getMaxPathLength()I"/>
+ <method name="setMaxPathLength(I)V"/>
+ </class>
+ <class name="java/security/cert/PKIXCertPathBuilderResult" since="1">
+ <extends name="java/security/cert/PKIXCertPathValidatorResult"/>
+ <implements name="java/security/cert/CertPathBuilderResult"/>
+ <method name="&lt;init>(Ljava/security/cert/CertPath;Ljava/security/cert/TrustAnchor;Ljava/security/cert/PolicyNode;Ljava/security/PublicKey;)V"/>
+ </class>
+ <class name="java/security/cert/PKIXCertPathChecker" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="java/security/cert/CertPathChecker" since="24"/>
+ <method name="&lt;init>()V"/>
+ <method name="check(Ljava/security/cert/Certificate;Ljava/util/Collection;)V"/>
+ <method name="getSupportedExtensions()Ljava/util/Set;"/>
+ <method name="init(Z)V"/>
+ <method name="isForwardCheckingSupported()Z"/>
+ </class>
+ <class name="java/security/cert/PKIXCertPathValidatorResult" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/cert/CertPathValidatorResult"/>
+ <method name="&lt;init>(Ljava/security/cert/TrustAnchor;Ljava/security/cert/PolicyNode;Ljava/security/PublicKey;)V"/>
+ <method name="getPolicyTree()Ljava/security/cert/PolicyNode;"/>
+ <method name="getPublicKey()Ljava/security/PublicKey;"/>
+ <method name="getTrustAnchor()Ljava/security/cert/TrustAnchor;"/>
+ </class>
+ <class name="java/security/cert/PKIXParameters" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/cert/CertPathParameters"/>
+ <method name="&lt;init>(Ljava/security/KeyStore;)V"/>
+ <method name="&lt;init>(Ljava/util/Set;)V"/>
+ <method name="addCertPathChecker(Ljava/security/cert/PKIXCertPathChecker;)V"/>
+ <method name="addCertStore(Ljava/security/cert/CertStore;)V"/>
+ <method name="getCertPathCheckers()Ljava/util/List;"/>
+ <method name="getCertStores()Ljava/util/List;"/>
+ <method name="getDate()Ljava/util/Date;"/>
+ <method name="getInitialPolicies()Ljava/util/Set;"/>
+ <method name="getPolicyQualifiersRejected()Z"/>
+ <method name="getSigProvider()Ljava/lang/String;"/>
+ <method name="getTargetCertConstraints()Ljava/security/cert/CertSelector;"/>
+ <method name="getTrustAnchors()Ljava/util/Set;"/>
+ <method name="isAnyPolicyInhibited()Z"/>
+ <method name="isExplicitPolicyRequired()Z"/>
+ <method name="isPolicyMappingInhibited()Z"/>
+ <method name="isRevocationEnabled()Z"/>
+ <method name="setAnyPolicyInhibited(Z)V"/>
+ <method name="setCertPathCheckers(Ljava/util/List;)V"/>
+ <method name="setCertStores(Ljava/util/List;)V"/>
+ <method name="setDate(Ljava/util/Date;)V"/>
+ <method name="setExplicitPolicyRequired(Z)V"/>
+ <method name="setInitialPolicies(Ljava/util/Set;)V"/>
+ <method name="setPolicyMappingInhibited(Z)V"/>
+ <method name="setPolicyQualifiersRejected(Z)V"/>
+ <method name="setRevocationEnabled(Z)V"/>
+ <method name="setSigProvider(Ljava/lang/String;)V"/>
+ <method name="setTargetCertConstraints(Ljava/security/cert/CertSelector;)V"/>
+ <method name="setTrustAnchors(Ljava/util/Set;)V"/>
+ </class>
+ <class name="java/security/cert/PKIXReason" since="24">
+ <extends name="java/lang/Enum"/>
+ <implements name="java/security/cert/CertPathValidatorException$Reason"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/security/cert/PKIXReason;"/>
+ <method name="values()[Ljava/security/cert/PKIXReason;"/>
+ <field name="INVALID_KEY_USAGE"/>
+ <field name="INVALID_NAME"/>
+ <field name="INVALID_POLICY"/>
+ <field name="NAME_CHAINING"/>
+ <field name="NOT_CA_CERT"/>
+ <field name="NO_TRUST_ANCHOR"/>
+ <field name="PATH_TOO_LONG"/>
+ <field name="UNRECOGNIZED_CRIT_EXT"/>
+ </class>
+ <class name="java/security/cert/PKIXRevocationChecker" since="24">
+ <extends name="java/security/cert/PKIXCertPathChecker"/>
+ <method name="&lt;init>()V"/>
+ <method name="clone()Ljava/security/cert/PKIXRevocationChecker;"/>
+ <method name="getOcspExtensions()Ljava/util/List;"/>
+ <method name="getOcspResponder()Ljava/net/URI;"/>
+ <method name="getOcspResponderCert()Ljava/security/cert/X509Certificate;"/>
+ <method name="getOcspResponses()Ljava/util/Map;"/>
+ <method name="getOptions()Ljava/util/Set;"/>
+ <method name="getSoftFailExceptions()Ljava/util/List;"/>
+ <method name="setOcspExtensions(Ljava/util/List;)V"/>
+ <method name="setOcspResponder(Ljava/net/URI;)V"/>
+ <method name="setOcspResponderCert(Ljava/security/cert/X509Certificate;)V"/>
+ <method name="setOcspResponses(Ljava/util/Map;)V"/>
+ <method name="setOptions(Ljava/util/Set;)V"/>
+ </class>
+ <class name="java/security/cert/PKIXRevocationChecker$Option" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/security/cert/PKIXRevocationChecker$Option;"/>
+ <method name="values()[Ljava/security/cert/PKIXRevocationChecker$Option;"/>
+ <field name="NO_FALLBACK"/>
+ <field name="ONLY_END_ENTITY"/>
+ <field name="PREFER_CRLS"/>
+ <field name="SOFT_FAIL"/>
+ </class>
+ <class name="java/security/cert/PolicyNode" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getChildren()Ljava/util/Iterator;"/>
+ <method name="getDepth()I"/>
+ <method name="getExpectedPolicies()Ljava/util/Set;"/>
+ <method name="getParent()Ljava/security/cert/PolicyNode;"/>
+ <method name="getPolicyQualifiers()Ljava/util/Set;"/>
+ <method name="getValidPolicy()Ljava/lang/String;"/>
+ <method name="isCritical()Z"/>
+ </class>
+ <class name="java/security/cert/PolicyQualifierInfo" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>([B)V"/>
+ <method name="getEncoded()[B"/>
+ <method name="getPolicyQualifier()[B"/>
+ <method name="getPolicyQualifierId()Ljava/lang/String;"/>
+ </class>
+ <class name="java/security/cert/TrustAnchor" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/security/PublicKey;[B)V"/>
+ <method name="&lt;init>(Ljava/security/cert/X509Certificate;[B)V"/>
+ <method name="&lt;init>(Ljavax/security/auth/x500/X500Principal;Ljava/security/PublicKey;[B)V"/>
+ <method name="getCA()Ljavax/security/auth/x500/X500Principal;"/>
+ <method name="getCAName()Ljava/lang/String;"/>
+ <method name="getCAPublicKey()Ljava/security/PublicKey;"/>
+ <method name="getNameConstraints()[B"/>
+ <method name="getTrustedCert()Ljava/security/cert/X509Certificate;"/>
+ </class>
+ <class name="java/security/cert/X509CRL" since="1">
+ <extends name="java/security/cert/CRL"/>
+ <implements name="java/security/cert/X509Extension"/>
+ <method name="&lt;init>()V"/>
+ <method name="getEncoded()[B"/>
+ <method name="getIssuerDN()Ljava/security/Principal;"/>
+ <method name="getIssuerX500Principal()Ljavax/security/auth/x500/X500Principal;"/>
+ <method name="getNextUpdate()Ljava/util/Date;"/>
+ <method name="getRevokedCertificate(Ljava/math/BigInteger;)Ljava/security/cert/X509CRLEntry;"/>
+ <method name="getRevokedCertificate(Ljava/security/cert/X509Certificate;)Ljava/security/cert/X509CRLEntry;"/>
+ <method name="getRevokedCertificates()Ljava/util/Set;"/>
+ <method name="getSigAlgName()Ljava/lang/String;"/>
+ <method name="getSigAlgOID()Ljava/lang/String;"/>
+ <method name="getSigAlgParams()[B"/>
+ <method name="getSignature()[B"/>
+ <method name="getTBSCertList()[B"/>
+ <method name="getThisUpdate()Ljava/util/Date;"/>
+ <method name="getVersion()I"/>
+ <method name="verify(Ljava/security/PublicKey;)V"/>
+ <method name="verify(Ljava/security/PublicKey;Ljava/lang/String;)V"/>
+ <method name="verify(Ljava/security/PublicKey;Ljava/security/Provider;)V" since="26"/>
+ </class>
+ <class name="java/security/cert/X509CRLEntry" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/cert/X509Extension"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCertificateIssuer()Ljavax/security/auth/x500/X500Principal;"/>
+ <method name="getEncoded()[B"/>
+ <method name="getRevocationDate()Ljava/util/Date;"/>
+ <method name="getRevocationReason()Ljava/security/cert/CRLReason;" since="24"/>
+ <method name="getSerialNumber()Ljava/math/BigInteger;"/>
+ <method name="hasExtensions()Z"/>
+ </class>
+ <class name="java/security/cert/X509CRLSelector" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/cert/CRLSelector"/>
+ <method name="&lt;init>()V"/>
+ <method name="addIssuer(Ljavax/security/auth/x500/X500Principal;)V"/>
+ <method name="addIssuerName(Ljava/lang/String;)V"/>
+ <method name="addIssuerName([B)V"/>
+ <method name="getCertificateChecking()Ljava/security/cert/X509Certificate;"/>
+ <method name="getDateAndTime()Ljava/util/Date;"/>
+ <method name="getIssuerNames()Ljava/util/Collection;"/>
+ <method name="getIssuers()Ljava/util/Collection;"/>
+ <method name="getMaxCRL()Ljava/math/BigInteger;"/>
+ <method name="getMinCRL()Ljava/math/BigInteger;"/>
+ <method name="setCertificateChecking(Ljava/security/cert/X509Certificate;)V"/>
+ <method name="setDateAndTime(Ljava/util/Date;)V"/>
+ <method name="setIssuerNames(Ljava/util/Collection;)V"/>
+ <method name="setIssuers(Ljava/util/Collection;)V"/>
+ <method name="setMaxCRLNumber(Ljava/math/BigInteger;)V"/>
+ <method name="setMinCRLNumber(Ljava/math/BigInteger;)V"/>
+ </class>
+ <class name="java/security/cert/X509CertSelector" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/cert/CertSelector"/>
+ <method name="&lt;init>()V"/>
+ <method name="addPathToName(ILjava/lang/String;)V"/>
+ <method name="addPathToName(I[B)V"/>
+ <method name="addSubjectAlternativeName(ILjava/lang/String;)V"/>
+ <method name="addSubjectAlternativeName(I[B)V"/>
+ <method name="getAuthorityKeyIdentifier()[B"/>
+ <method name="getBasicConstraints()I"/>
+ <method name="getCertificate()Ljava/security/cert/X509Certificate;"/>
+ <method name="getCertificateValid()Ljava/util/Date;"/>
+ <method name="getExtendedKeyUsage()Ljava/util/Set;"/>
+ <method name="getIssuer()Ljavax/security/auth/x500/X500Principal;"/>
+ <method name="getIssuerAsBytes()[B"/>
+ <method name="getIssuerAsString()Ljava/lang/String;"/>
+ <method name="getKeyUsage()[Z"/>
+ <method name="getMatchAllSubjectAltNames()Z"/>
+ <method name="getNameConstraints()[B"/>
+ <method name="getPathToNames()Ljava/util/Collection;"/>
+ <method name="getPolicy()Ljava/util/Set;"/>
+ <method name="getPrivateKeyValid()Ljava/util/Date;"/>
+ <method name="getSerialNumber()Ljava/math/BigInteger;"/>
+ <method name="getSubject()Ljavax/security/auth/x500/X500Principal;"/>
+ <method name="getSubjectAlternativeNames()Ljava/util/Collection;"/>
+ <method name="getSubjectAsBytes()[B"/>
+ <method name="getSubjectAsString()Ljava/lang/String;"/>
+ <method name="getSubjectKeyIdentifier()[B"/>
+ <method name="getSubjectPublicKey()Ljava/security/PublicKey;"/>
+ <method name="getSubjectPublicKeyAlgID()Ljava/lang/String;"/>
+ <method name="setAuthorityKeyIdentifier([B)V"/>
+ <method name="setBasicConstraints(I)V"/>
+ <method name="setCertificate(Ljava/security/cert/X509Certificate;)V"/>
+ <method name="setCertificateValid(Ljava/util/Date;)V"/>
+ <method name="setExtendedKeyUsage(Ljava/util/Set;)V"/>
+ <method name="setIssuer(Ljava/lang/String;)V"/>
+ <method name="setIssuer(Ljavax/security/auth/x500/X500Principal;)V"/>
+ <method name="setIssuer([B)V"/>
+ <method name="setKeyUsage([Z)V"/>
+ <method name="setMatchAllSubjectAltNames(Z)V"/>
+ <method name="setNameConstraints([B)V"/>
+ <method name="setPathToNames(Ljava/util/Collection;)V"/>
+ <method name="setPolicy(Ljava/util/Set;)V"/>
+ <method name="setPrivateKeyValid(Ljava/util/Date;)V"/>
+ <method name="setSerialNumber(Ljava/math/BigInteger;)V"/>
+ <method name="setSubject(Ljava/lang/String;)V"/>
+ <method name="setSubject(Ljavax/security/auth/x500/X500Principal;)V"/>
+ <method name="setSubject([B)V"/>
+ <method name="setSubjectAlternativeNames(Ljava/util/Collection;)V"/>
+ <method name="setSubjectKeyIdentifier([B)V"/>
+ <method name="setSubjectPublicKey(Ljava/security/PublicKey;)V"/>
+ <method name="setSubjectPublicKey([B)V"/>
+ <method name="setSubjectPublicKeyAlgID(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/security/cert/X509Certificate" since="1">
+ <extends name="java/security/cert/Certificate"/>
+ <implements name="java/security/cert/X509Extension"/>
+ <method name="&lt;init>()V"/>
+ <method name="checkValidity()V"/>
+ <method name="checkValidity(Ljava/util/Date;)V"/>
+ <method name="getBasicConstraints()I"/>
+ <method name="getExtendedKeyUsage()Ljava/util/List;"/>
+ <method name="getIssuerAlternativeNames()Ljava/util/Collection;"/>
+ <method name="getIssuerDN()Ljava/security/Principal;"/>
+ <method name="getIssuerUniqueID()[Z"/>
+ <method name="getIssuerX500Principal()Ljavax/security/auth/x500/X500Principal;"/>
+ <method name="getKeyUsage()[Z"/>
+ <method name="getNotAfter()Ljava/util/Date;"/>
+ <method name="getNotBefore()Ljava/util/Date;"/>
+ <method name="getSerialNumber()Ljava/math/BigInteger;"/>
+ <method name="getSigAlgName()Ljava/lang/String;"/>
+ <method name="getSigAlgOID()Ljava/lang/String;"/>
+ <method name="getSigAlgParams()[B"/>
+ <method name="getSignature()[B"/>
+ <method name="getSubjectAlternativeNames()Ljava/util/Collection;"/>
+ <method name="getSubjectDN()Ljava/security/Principal;"/>
+ <method name="getSubjectUniqueID()[Z"/>
+ <method name="getSubjectX500Principal()Ljavax/security/auth/x500/X500Principal;"/>
+ <method name="getTBSCertificate()[B"/>
+ <method name="getVersion()I"/>
+ <method name="verify(Ljava/security/PublicKey;Ljava/security/Provider;)V" since="24"/>
+ </class>
+ <class name="java/security/cert/X509Extension" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getCriticalExtensionOIDs()Ljava/util/Set;"/>
+ <method name="getExtensionValue(Ljava/lang/String;)[B"/>
+ <method name="getNonCriticalExtensionOIDs()Ljava/util/Set;"/>
+ <method name="hasUnsupportedCriticalExtension()Z"/>
+ </class>
+ <class name="java/security/interfaces/DSAKey" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getParams()Ljava/security/interfaces/DSAParams;"/>
+ </class>
+ <class name="java/security/interfaces/DSAKeyPairGenerator" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="initialize(IZLjava/security/SecureRandom;)V"/>
+ <method name="initialize(Ljava/security/interfaces/DSAParams;Ljava/security/SecureRandom;)V"/>
+ </class>
+ <class name="java/security/interfaces/DSAParams" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getG()Ljava/math/BigInteger;"/>
+ <method name="getP()Ljava/math/BigInteger;"/>
+ <method name="getQ()Ljava/math/BigInteger;"/>
+ </class>
+ <class name="java/security/interfaces/DSAPrivateKey" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/PrivateKey"/>
+ <implements name="java/security/interfaces/DSAKey"/>
+ <method name="getX()Ljava/math/BigInteger;"/>
+ <field name="serialVersionUID"/>
+ </class>
+ <class name="java/security/interfaces/DSAPublicKey" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/PublicKey"/>
+ <implements name="java/security/interfaces/DSAKey"/>
+ <method name="getY()Ljava/math/BigInteger;"/>
+ <field name="serialVersionUID"/>
+ </class>
+ <class name="java/security/interfaces/ECKey" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getParams()Ljava/security/spec/ECParameterSpec;"/>
+ </class>
+ <class name="java/security/interfaces/ECPrivateKey" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/PrivateKey"/>
+ <implements name="java/security/interfaces/ECKey"/>
+ <method name="getS()Ljava/math/BigInteger;"/>
+ <field name="serialVersionUID"/>
+ </class>
+ <class name="java/security/interfaces/ECPublicKey" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/PublicKey"/>
+ <implements name="java/security/interfaces/ECKey"/>
+ <method name="getW()Ljava/security/spec/ECPoint;"/>
+ <field name="serialVersionUID"/>
+ </class>
+ <class name="java/security/interfaces/RSAKey" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getModulus()Ljava/math/BigInteger;"/>
+ </class>
+ <class name="java/security/interfaces/RSAMultiPrimePrivateCrtKey" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/interfaces/RSAPrivateKey"/>
+ <method name="getCrtCoefficient()Ljava/math/BigInteger;"/>
+ <method name="getOtherPrimeInfo()[Ljava/security/spec/RSAOtherPrimeInfo;"/>
+ <method name="getPrimeExponentP()Ljava/math/BigInteger;"/>
+ <method name="getPrimeExponentQ()Ljava/math/BigInteger;"/>
+ <method name="getPrimeP()Ljava/math/BigInteger;"/>
+ <method name="getPrimeQ()Ljava/math/BigInteger;"/>
+ <method name="getPublicExponent()Ljava/math/BigInteger;"/>
+ <field name="serialVersionUID"/>
+ </class>
+ <class name="java/security/interfaces/RSAPrivateCrtKey" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/interfaces/RSAPrivateKey"/>
+ <method name="getCrtCoefficient()Ljava/math/BigInteger;"/>
+ <method name="getPrimeExponentP()Ljava/math/BigInteger;"/>
+ <method name="getPrimeExponentQ()Ljava/math/BigInteger;"/>
+ <method name="getPrimeP()Ljava/math/BigInteger;"/>
+ <method name="getPrimeQ()Ljava/math/BigInteger;"/>
+ <method name="getPublicExponent()Ljava/math/BigInteger;"/>
+ <field name="serialVersionUID"/>
+ </class>
+ <class name="java/security/interfaces/RSAPrivateKey" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/PrivateKey"/>
+ <implements name="java/security/interfaces/RSAKey"/>
+ <method name="getPrivateExponent()Ljava/math/BigInteger;"/>
+ <field name="serialVersionUID"/>
+ </class>
+ <class name="java/security/interfaces/RSAPublicKey" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/PublicKey"/>
+ <implements name="java/security/interfaces/RSAKey"/>
+ <method name="getPublicExponent()Ljava/math/BigInteger;"/>
+ <field name="serialVersionUID"/>
+ </class>
+ <class name="java/security/spec/AlgorithmParameterSpec" since="1">
+ <extends name="java/lang/Object"/>
+ </class>
+ <class name="java/security/spec/DSAParameterSpec" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/interfaces/DSAParams"/>
+ <implements name="java/security/spec/AlgorithmParameterSpec"/>
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)V"/>
+ </class>
+ <class name="java/security/spec/DSAPrivateKeySpec" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/KeySpec"/>
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)V"/>
+ <method name="getG()Ljava/math/BigInteger;"/>
+ <method name="getP()Ljava/math/BigInteger;"/>
+ <method name="getQ()Ljava/math/BigInteger;"/>
+ <method name="getX()Ljava/math/BigInteger;"/>
+ </class>
+ <class name="java/security/spec/DSAPublicKeySpec" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/KeySpec"/>
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)V"/>
+ <method name="getG()Ljava/math/BigInteger;"/>
+ <method name="getP()Ljava/math/BigInteger;"/>
+ <method name="getQ()Ljava/math/BigInteger;"/>
+ <method name="getY()Ljava/math/BigInteger;"/>
+ </class>
+ <class name="java/security/spec/ECField" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getFieldSize()I"/>
+ </class>
+ <class name="java/security/spec/ECFieldF2m" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/ECField"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(ILjava/math/BigInteger;)V"/>
+ <method name="&lt;init>(I[I)V"/>
+ <method name="getM()I"/>
+ <method name="getMidTermsOfReductionPolynomial()[I"/>
+ <method name="getReductionPolynomial()Ljava/math/BigInteger;"/>
+ </class>
+ <class name="java/security/spec/ECFieldFp" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/ECField"/>
+ <method name="&lt;init>(Ljava/math/BigInteger;)V"/>
+ <method name="getP()Ljava/math/BigInteger;"/>
+ </class>
+ <class name="java/security/spec/ECGenParameterSpec" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/AlgorithmParameterSpec"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getName()Ljava/lang/String;"/>
+ </class>
+ <class name="java/security/spec/ECParameterSpec" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/AlgorithmParameterSpec"/>
+ <method name="&lt;init>(Ljava/security/spec/EllipticCurve;Ljava/security/spec/ECPoint;Ljava/math/BigInteger;I)V"/>
+ <method name="getCofactor()I"/>
+ <method name="getCurve()Ljava/security/spec/EllipticCurve;"/>
+ <method name="getGenerator()Ljava/security/spec/ECPoint;"/>
+ <method name="getOrder()Ljava/math/BigInteger;"/>
+ </class>
+ <class name="java/security/spec/ECPoint" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;)V"/>
+ <method name="getAffineX()Ljava/math/BigInteger;"/>
+ <method name="getAffineY()Ljava/math/BigInteger;"/>
+ <field name="POINT_INFINITY"/>
+ </class>
+ <class name="java/security/spec/ECPrivateKeySpec" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/KeySpec"/>
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/security/spec/ECParameterSpec;)V"/>
+ <method name="getParams()Ljava/security/spec/ECParameterSpec;"/>
+ <method name="getS()Ljava/math/BigInteger;"/>
+ </class>
+ <class name="java/security/spec/ECPublicKeySpec" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/KeySpec"/>
+ <method name="&lt;init>(Ljava/security/spec/ECPoint;Ljava/security/spec/ECParameterSpec;)V"/>
+ <method name="getParams()Ljava/security/spec/ECParameterSpec;"/>
+ <method name="getW()Ljava/security/spec/ECPoint;"/>
+ </class>
+ <class name="java/security/spec/EllipticCurve" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/math/BigInteger;)V"/>
+ <method name="&lt;init>(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/math/BigInteger;[B)V"/>
+ <method name="getA()Ljava/math/BigInteger;"/>
+ <method name="getB()Ljava/math/BigInteger;"/>
+ <method name="getField()Ljava/security/spec/ECField;"/>
+ <method name="getSeed()[B"/>
+ </class>
+ <class name="java/security/spec/EncodedKeySpec" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/KeySpec"/>
+ <method name="&lt;init>([B)V"/>
+ <method name="getEncoded()[B"/>
+ <method name="getFormat()Ljava/lang/String;"/>
+ </class>
+ <class name="java/security/spec/InvalidKeySpecException" since="1">
+ <extends name="java/security/GeneralSecurityException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/security/spec/InvalidParameterSpecException" since="1">
+ <extends name="java/security/GeneralSecurityException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/security/spec/KeySpec" since="1">
+ <extends name="java/lang/Object"/>
+ </class>
+ <class name="java/security/spec/MGF1ParameterSpec" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/AlgorithmParameterSpec"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getDigestAlgorithm()Ljava/lang/String;"/>
+ <field name="SHA1"/>
+ <field name="SHA224" since="26"/>
+ <field name="SHA256"/>
+ <field name="SHA384"/>
+ <field name="SHA512"/>
+ </class>
+ <class name="java/security/spec/PKCS8EncodedKeySpec" since="1">
+ <extends name="java/security/spec/EncodedKeySpec"/>
+ <method name="&lt;init>([B)V"/>
+ </class>
+ <class name="java/security/spec/PSSParameterSpec" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/AlgorithmParameterSpec"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/security/spec/AlgorithmParameterSpec;II)V"/>
+ <method name="getDigestAlgorithm()Ljava/lang/String;"/>
+ <method name="getMGFAlgorithm()Ljava/lang/String;"/>
+ <method name="getMGFParameters()Ljava/security/spec/AlgorithmParameterSpec;"/>
+ <method name="getSaltLength()I"/>
+ <method name="getTrailerField()I"/>
+ <field name="DEFAULT"/>
+ </class>
+ <class name="java/security/spec/RSAKeyGenParameterSpec" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/AlgorithmParameterSpec"/>
+ <method name="&lt;init>(ILjava/math/BigInteger;)V"/>
+ <method name="getKeysize()I"/>
+ <method name="getPublicExponent()Ljava/math/BigInteger;"/>
+ <field name="F0"/>
+ <field name="F4"/>
+ </class>
+ <class name="java/security/spec/RSAMultiPrimePrivateCrtKeySpec" since="1">
+ <extends name="java/security/spec/RSAPrivateKeySpec"/>
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;[Ljava/security/spec/RSAOtherPrimeInfo;)V"/>
+ <method name="getCrtCoefficient()Ljava/math/BigInteger;"/>
+ <method name="getOtherPrimeInfo()[Ljava/security/spec/RSAOtherPrimeInfo;"/>
+ <method name="getPrimeExponentP()Ljava/math/BigInteger;"/>
+ <method name="getPrimeExponentQ()Ljava/math/BigInteger;"/>
+ <method name="getPrimeP()Ljava/math/BigInteger;"/>
+ <method name="getPrimeQ()Ljava/math/BigInteger;"/>
+ <method name="getPublicExponent()Ljava/math/BigInteger;"/>
+ </class>
+ <class name="java/security/spec/RSAOtherPrimeInfo" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)V"/>
+ <method name="getCrtCoefficient()Ljava/math/BigInteger;"/>
+ <method name="getExponent()Ljava/math/BigInteger;"/>
+ <method name="getPrime()Ljava/math/BigInteger;"/>
+ </class>
+ <class name="java/security/spec/RSAPrivateCrtKeySpec" since="1">
+ <extends name="java/security/spec/RSAPrivateKeySpec"/>
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)V"/>
+ <method name="getCrtCoefficient()Ljava/math/BigInteger;"/>
+ <method name="getPrimeExponentP()Ljava/math/BigInteger;"/>
+ <method name="getPrimeExponentQ()Ljava/math/BigInteger;"/>
+ <method name="getPrimeP()Ljava/math/BigInteger;"/>
+ <method name="getPrimeQ()Ljava/math/BigInteger;"/>
+ <method name="getPublicExponent()Ljava/math/BigInteger;"/>
+ </class>
+ <class name="java/security/spec/RSAPrivateKeySpec" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/KeySpec"/>
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;)V"/>
+ <method name="getModulus()Ljava/math/BigInteger;"/>
+ <method name="getPrivateExponent()Ljava/math/BigInteger;"/>
+ </class>
+ <class name="java/security/spec/RSAPublicKeySpec" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/KeySpec"/>
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;)V"/>
+ <method name="getModulus()Ljava/math/BigInteger;"/>
+ <method name="getPublicExponent()Ljava/math/BigInteger;"/>
+ </class>
+ <class name="java/security/spec/X509EncodedKeySpec" since="1">
+ <extends name="java/security/spec/EncodedKeySpec"/>
+ <method name="&lt;init>([B)V"/>
+ </class>
+ <class name="java/sql/Array" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="free()V" since="9"/>
+ <method name="getArray()Ljava/lang/Object;"/>
+ <method name="getArray(JI)Ljava/lang/Object;"/>
+ <method name="getArray(JILjava/util/Map;)Ljava/lang/Object;"/>
+ <method name="getArray(Ljava/util/Map;)Ljava/lang/Object;"/>
+ <method name="getBaseType()I"/>
+ <method name="getBaseTypeName()Ljava/lang/String;"/>
+ <method name="getResultSet()Ljava/sql/ResultSet;"/>
+ <method name="getResultSet(JI)Ljava/sql/ResultSet;"/>
+ <method name="getResultSet(JILjava/util/Map;)Ljava/sql/ResultSet;"/>
+ <method name="getResultSet(Ljava/util/Map;)Ljava/sql/ResultSet;"/>
+ </class>
+ <class name="java/sql/BatchUpdateException" since="1">
+ <extends name="java/sql/SQLException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I[I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I[ILjava/lang/Throwable;)V" since="9"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;[I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;[ILjava/lang/Throwable;)V" since="9"/>
+ <method name="&lt;init>(Ljava/lang/String;[I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;[ILjava/lang/Throwable;)V" since="9"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" since="9"/>
+ <method name="&lt;init>([I)V"/>
+ <method name="&lt;init>([ILjava/lang/Throwable;)V" since="9"/>
+ <method name="getUpdateCounts()[I"/>
+ </class>
+ <class name="java/sql/Blob" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="free()V" since="9"/>
+ <method name="getBinaryStream()Ljava/io/InputStream;"/>
+ <method name="getBinaryStream(JJ)Ljava/io/InputStream;" since="9"/>
+ <method name="getBytes(JI)[B"/>
+ <method name="length()J"/>
+ <method name="position(Ljava/sql/Blob;J)J"/>
+ <method name="position([BJ)J"/>
+ <method name="setBinaryStream(J)Ljava/io/OutputStream;"/>
+ <method name="setBytes(J[B)I"/>
+ <method name="setBytes(J[BII)I"/>
+ <method name="truncate(J)V"/>
+ </class>
+ <class name="java/sql/CallableStatement" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/sql/PreparedStatement"/>
+ <method name="getArray(I)Ljava/sql/Array;"/>
+ <method name="getArray(Ljava/lang/String;)Ljava/sql/Array;"/>
+ <method name="getBigDecimal(I)Ljava/math/BigDecimal;"/>
+ <method name="getBigDecimal(II)Ljava/math/BigDecimal;" deprecated="16"/>
+ <method name="getBigDecimal(Ljava/lang/String;)Ljava/math/BigDecimal;"/>
+ <method name="getBlob(I)Ljava/sql/Blob;"/>
+ <method name="getBlob(Ljava/lang/String;)Ljava/sql/Blob;"/>
+ <method name="getBoolean(I)Z"/>
+ <method name="getBoolean(Ljava/lang/String;)Z"/>
+ <method name="getByte(I)B"/>
+ <method name="getByte(Ljava/lang/String;)B"/>
+ <method name="getBytes(I)[B"/>
+ <method name="getBytes(Ljava/lang/String;)[B"/>
+ <method name="getCharacterStream(I)Ljava/io/Reader;" since="9"/>
+ <method name="getCharacterStream(Ljava/lang/String;)Ljava/io/Reader;" since="9"/>
+ <method name="getClob(I)Ljava/sql/Clob;"/>
+ <method name="getClob(Ljava/lang/String;)Ljava/sql/Clob;"/>
+ <method name="getDate(I)Ljava/sql/Date;"/>
+ <method name="getDate(ILjava/util/Calendar;)Ljava/sql/Date;"/>
+ <method name="getDate(Ljava/lang/String;)Ljava/sql/Date;"/>
+ <method name="getDate(Ljava/lang/String;Ljava/util/Calendar;)Ljava/sql/Date;"/>
+ <method name="getDouble(I)D"/>
+ <method name="getDouble(Ljava/lang/String;)D"/>
+ <method name="getFloat(I)F"/>
+ <method name="getFloat(Ljava/lang/String;)F"/>
+ <method name="getInt(I)I"/>
+ <method name="getInt(Ljava/lang/String;)I"/>
+ <method name="getLong(I)J"/>
+ <method name="getLong(Ljava/lang/String;)J"/>
+ <method name="getNCharacterStream(I)Ljava/io/Reader;" since="9"/>
+ <method name="getNCharacterStream(Ljava/lang/String;)Ljava/io/Reader;" since="9"/>
+ <method name="getNClob(I)Ljava/sql/NClob;" since="9"/>
+ <method name="getNClob(Ljava/lang/String;)Ljava/sql/NClob;" since="9"/>
+ <method name="getNString(I)Ljava/lang/String;" since="9"/>
+ <method name="getNString(Ljava/lang/String;)Ljava/lang/String;" since="9"/>
+ <method name="getObject(I)Ljava/lang/Object;"/>
+ <method name="getObject(ILjava/util/Map;)Ljava/lang/Object;"/>
+ <method name="getObject(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="getObject(Ljava/lang/String;Ljava/util/Map;)Ljava/lang/Object;"/>
+ <method name="getRef(I)Ljava/sql/Ref;"/>
+ <method name="getRef(Ljava/lang/String;)Ljava/sql/Ref;"/>
+ <method name="getRowId(I)Ljava/sql/RowId;" since="9"/>
+ <method name="getRowId(Ljava/lang/String;)Ljava/sql/RowId;" since="9"/>
+ <method name="getSQLXML(I)Ljava/sql/SQLXML;" since="9"/>
+ <method name="getSQLXML(Ljava/lang/String;)Ljava/sql/SQLXML;" since="9"/>
+ <method name="getShort(I)S"/>
+ <method name="getShort(Ljava/lang/String;)S"/>
+ <method name="getString(I)Ljava/lang/String;"/>
+ <method name="getString(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getTime(I)Ljava/sql/Time;"/>
+ <method name="getTime(ILjava/util/Calendar;)Ljava/sql/Time;"/>
+ <method name="getTime(Ljava/lang/String;)Ljava/sql/Time;"/>
+ <method name="getTime(Ljava/lang/String;Ljava/util/Calendar;)Ljava/sql/Time;"/>
+ <method name="getTimestamp(I)Ljava/sql/Timestamp;"/>
+ <method name="getTimestamp(ILjava/util/Calendar;)Ljava/sql/Timestamp;"/>
+ <method name="getTimestamp(Ljava/lang/String;)Ljava/sql/Timestamp;"/>
+ <method name="getTimestamp(Ljava/lang/String;Ljava/util/Calendar;)Ljava/sql/Timestamp;"/>
+ <method name="getURL(I)Ljava/net/URL;"/>
+ <method name="getURL(Ljava/lang/String;)Ljava/net/URL;"/>
+ <method name="registerOutParameter(II)V"/>
+ <method name="registerOutParameter(III)V"/>
+ <method name="registerOutParameter(IILjava/lang/String;)V"/>
+ <method name="registerOutParameter(Ljava/lang/String;I)V"/>
+ <method name="registerOutParameter(Ljava/lang/String;II)V"/>
+ <method name="registerOutParameter(Ljava/lang/String;ILjava/lang/String;)V"/>
+ <method name="setAsciiStream(Ljava/lang/String;Ljava/io/InputStream;)V" since="9"/>
+ <method name="setAsciiStream(Ljava/lang/String;Ljava/io/InputStream;I)V"/>
+ <method name="setAsciiStream(Ljava/lang/String;Ljava/io/InputStream;J)V" since="9"/>
+ <method name="setBigDecimal(Ljava/lang/String;Ljava/math/BigDecimal;)V"/>
+ <method name="setBinaryStream(Ljava/lang/String;Ljava/io/InputStream;)V" since="9"/>
+ <method name="setBinaryStream(Ljava/lang/String;Ljava/io/InputStream;I)V"/>
+ <method name="setBinaryStream(Ljava/lang/String;Ljava/io/InputStream;J)V" since="9"/>
+ <method name="setBlob(Ljava/lang/String;Ljava/io/InputStream;)V" since="9"/>
+ <method name="setBlob(Ljava/lang/String;Ljava/io/InputStream;J)V" since="9"/>
+ <method name="setBlob(Ljava/lang/String;Ljava/sql/Blob;)V" since="9"/>
+ <method name="setBoolean(Ljava/lang/String;Z)V"/>
+ <method name="setByte(Ljava/lang/String;B)V"/>
+ <method name="setBytes(Ljava/lang/String;[B)V"/>
+ <method name="setCharacterStream(Ljava/lang/String;Ljava/io/Reader;)V" since="9"/>
+ <method name="setCharacterStream(Ljava/lang/String;Ljava/io/Reader;I)V"/>
+ <method name="setCharacterStream(Ljava/lang/String;Ljava/io/Reader;J)V" since="9"/>
+ <method name="setClob(Ljava/lang/String;Ljava/io/Reader;)V" since="9"/>
+ <method name="setClob(Ljava/lang/String;Ljava/io/Reader;J)V" since="9"/>
+ <method name="setClob(Ljava/lang/String;Ljava/sql/Clob;)V" since="9"/>
+ <method name="setDate(Ljava/lang/String;Ljava/sql/Date;)V"/>
+ <method name="setDate(Ljava/lang/String;Ljava/sql/Date;Ljava/util/Calendar;)V"/>
+ <method name="setDouble(Ljava/lang/String;D)V"/>
+ <method name="setFloat(Ljava/lang/String;F)V"/>
+ <method name="setInt(Ljava/lang/String;I)V"/>
+ <method name="setLong(Ljava/lang/String;J)V"/>
+ <method name="setNCharacterStream(Ljava/lang/String;Ljava/io/Reader;)V" since="9"/>
+ <method name="setNCharacterStream(Ljava/lang/String;Ljava/io/Reader;J)V" since="9"/>
+ <method name="setNClob(Ljava/lang/String;Ljava/io/Reader;)V" since="9"/>
+ <method name="setNClob(Ljava/lang/String;Ljava/io/Reader;J)V" since="9"/>
+ <method name="setNClob(Ljava/lang/String;Ljava/sql/NClob;)V" since="9"/>
+ <method name="setNString(Ljava/lang/String;Ljava/lang/String;)V" since="9"/>
+ <method name="setNull(Ljava/lang/String;I)V"/>
+ <method name="setNull(Ljava/lang/String;ILjava/lang/String;)V"/>
+ <method name="setObject(Ljava/lang/String;Ljava/lang/Object;)V"/>
+ <method name="setObject(Ljava/lang/String;Ljava/lang/Object;I)V"/>
+ <method name="setObject(Ljava/lang/String;Ljava/lang/Object;II)V"/>
+ <method name="setRowId(Ljava/lang/String;Ljava/sql/RowId;)V" since="9"/>
+ <method name="setSQLXML(Ljava/lang/String;Ljava/sql/SQLXML;)V" since="9"/>
+ <method name="setShort(Ljava/lang/String;S)V"/>
+ <method name="setString(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="setTime(Ljava/lang/String;Ljava/sql/Time;)V"/>
+ <method name="setTime(Ljava/lang/String;Ljava/sql/Time;Ljava/util/Calendar;)V"/>
+ <method name="setTimestamp(Ljava/lang/String;Ljava/sql/Timestamp;)V"/>
+ <method name="setTimestamp(Ljava/lang/String;Ljava/sql/Timestamp;Ljava/util/Calendar;)V"/>
+ <method name="setURL(Ljava/lang/String;Ljava/net/URL;)V"/>
+ <method name="wasNull()Z"/>
+ </class>
+ <class name="java/sql/ClientInfoStatus" since="9">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/sql/ClientInfoStatus;"/>
+ <method name="values()[Ljava/sql/ClientInfoStatus;"/>
+ <field name="REASON_UNKNOWN"/>
+ <field name="REASON_UNKNOWN_PROPERTY"/>
+ <field name="REASON_VALUE_INVALID"/>
+ <field name="REASON_VALUE_TRUNCATED"/>
+ </class>
+ <class name="java/sql/Clob" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="free()V" since="9"/>
+ <method name="getAsciiStream()Ljava/io/InputStream;"/>
+ <method name="getCharacterStream()Ljava/io/Reader;"/>
+ <method name="getCharacterStream(JJ)Ljava/io/Reader;" since="9"/>
+ <method name="getSubString(JI)Ljava/lang/String;"/>
+ <method name="length()J"/>
+ <method name="position(Ljava/lang/String;J)J"/>
+ <method name="position(Ljava/sql/Clob;J)J"/>
+ <method name="setAsciiStream(J)Ljava/io/OutputStream;"/>
+ <method name="setCharacterStream(J)Ljava/io/Writer;"/>
+ <method name="setString(JLjava/lang/String;)I"/>
+ <method name="setString(JLjava/lang/String;II)I"/>
+ <method name="truncate(J)V"/>
+ </class>
+ <class name="java/sql/Connection" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable" since="19"/>
+ <implements name="java/sql/Wrapper" since="9"/>
+ <method name="clearWarnings()V"/>
+ <method name="close()V"/>
+ <method name="commit()V"/>
+ <method name="createArrayOf(Ljava/lang/String;[Ljava/lang/Object;)Ljava/sql/Array;" since="9"/>
+ <method name="createBlob()Ljava/sql/Blob;" since="9"/>
+ <method name="createClob()Ljava/sql/Clob;" since="9"/>
+ <method name="createNClob()Ljava/sql/NClob;" since="9"/>
+ <method name="createSQLXML()Ljava/sql/SQLXML;" since="9"/>
+ <method name="createStatement()Ljava/sql/Statement;"/>
+ <method name="createStatement(II)Ljava/sql/Statement;"/>
+ <method name="createStatement(III)Ljava/sql/Statement;"/>
+ <method name="createStruct(Ljava/lang/String;[Ljava/lang/Object;)Ljava/sql/Struct;" since="9"/>
+ <method name="getAutoCommit()Z"/>
+ <method name="getCatalog()Ljava/lang/String;"/>
+ <method name="getClientInfo()Ljava/util/Properties;" since="9"/>
+ <method name="getClientInfo(Ljava/lang/String;)Ljava/lang/String;" since="9"/>
+ <method name="getHoldability()I"/>
+ <method name="getMetaData()Ljava/sql/DatabaseMetaData;"/>
+ <method name="getTransactionIsolation()I"/>
+ <method name="getTypeMap()Ljava/util/Map;"/>
+ <method name="getWarnings()Ljava/sql/SQLWarning;"/>
+ <method name="isClosed()Z"/>
+ <method name="isReadOnly()Z"/>
+ <method name="isValid(I)Z" since="9"/>
+ <method name="nativeSQL(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="prepareCall(Ljava/lang/String;)Ljava/sql/CallableStatement;"/>
+ <method name="prepareCall(Ljava/lang/String;II)Ljava/sql/CallableStatement;"/>
+ <method name="prepareCall(Ljava/lang/String;III)Ljava/sql/CallableStatement;"/>
+ <method name="prepareStatement(Ljava/lang/String;)Ljava/sql/PreparedStatement;"/>
+ <method name="prepareStatement(Ljava/lang/String;I)Ljava/sql/PreparedStatement;"/>
+ <method name="prepareStatement(Ljava/lang/String;II)Ljava/sql/PreparedStatement;"/>
+ <method name="prepareStatement(Ljava/lang/String;III)Ljava/sql/PreparedStatement;"/>
+ <method name="prepareStatement(Ljava/lang/String;[I)Ljava/sql/PreparedStatement;"/>
+ <method name="prepareStatement(Ljava/lang/String;[Ljava/lang/String;)Ljava/sql/PreparedStatement;"/>
+ <method name="releaseSavepoint(Ljava/sql/Savepoint;)V"/>
+ <method name="rollback()V"/>
+ <method name="rollback(Ljava/sql/Savepoint;)V"/>
+ <method name="setAutoCommit(Z)V"/>
+ <method name="setCatalog(Ljava/lang/String;)V"/>
+ <method name="setClientInfo(Ljava/lang/String;Ljava/lang/String;)V" since="9"/>
+ <method name="setClientInfo(Ljava/util/Properties;)V" since="9"/>
+ <method name="setHoldability(I)V"/>
+ <method name="setReadOnly(Z)V"/>
+ <method name="setSavepoint()Ljava/sql/Savepoint;"/>
+ <method name="setSavepoint(Ljava/lang/String;)Ljava/sql/Savepoint;"/>
+ <method name="setTransactionIsolation(I)V"/>
+ <method name="setTypeMap(Ljava/util/Map;)V"/>
+ <field name="TRANSACTION_NONE"/>
+ <field name="TRANSACTION_READ_COMMITTED"/>
+ <field name="TRANSACTION_READ_UNCOMMITTED"/>
+ <field name="TRANSACTION_REPEATABLE_READ"/>
+ <field name="TRANSACTION_SERIALIZABLE"/>
+ </class>
+ <class name="java/sql/DataTruncation" since="1">
+ <extends name="java/sql/SQLWarning"/>
+ <method name="&lt;init>(IZZII)V"/>
+ <method name="&lt;init>(IZZIILjava/lang/Throwable;)V" since="9"/>
+ <method name="getDataSize()I"/>
+ <method name="getIndex()I"/>
+ <method name="getParameter()Z"/>
+ <method name="getRead()Z"/>
+ <method name="getTransferSize()I"/>
+ </class>
+ <class name="java/sql/DatabaseMetaData" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/sql/Wrapper" since="9"/>
+ <method name="allProceduresAreCallable()Z"/>
+ <method name="allTablesAreSelectable()Z"/>
+ <method name="autoCommitFailureClosesAllResultSets()Z" since="9"/>
+ <method name="dataDefinitionCausesTransactionCommit()Z"/>
+ <method name="dataDefinitionIgnoredInTransactions()Z"/>
+ <method name="deletesAreDetected(I)Z"/>
+ <method name="doesMaxRowSizeIncludeBlobs()Z"/>
+ <method name="getAttributes(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;"/>
+ <method name="getBestRowIdentifier(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IZ)Ljava/sql/ResultSet;"/>
+ <method name="getCatalogSeparator()Ljava/lang/String;"/>
+ <method name="getCatalogTerm()Ljava/lang/String;"/>
+ <method name="getCatalogs()Ljava/sql/ResultSet;"/>
+ <method name="getClientInfoProperties()Ljava/sql/ResultSet;" since="9"/>
+ <method name="getColumnPrivileges(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;"/>
+ <method name="getColumns(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;"/>
+ <method name="getConnection()Ljava/sql/Connection;"/>
+ <method name="getCrossReference(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;"/>
+ <method name="getDatabaseMajorVersion()I"/>
+ <method name="getDatabaseMinorVersion()I"/>
+ <method name="getDatabaseProductName()Ljava/lang/String;"/>
+ <method name="getDatabaseProductVersion()Ljava/lang/String;"/>
+ <method name="getDefaultTransactionIsolation()I"/>
+ <method name="getDriverMajorVersion()I"/>
+ <method name="getDriverMinorVersion()I"/>
+ <method name="getDriverName()Ljava/lang/String;"/>
+ <method name="getDriverVersion()Ljava/lang/String;"/>
+ <method name="getExportedKeys(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;"/>
+ <method name="getExtraNameCharacters()Ljava/lang/String;"/>
+ <method name="getFunctionColumns(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;" since="9"/>
+ <method name="getFunctions(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;" since="9"/>
+ <method name="getIdentifierQuoteString()Ljava/lang/String;"/>
+ <method name="getImportedKeys(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;"/>
+ <method name="getIndexInfo(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZ)Ljava/sql/ResultSet;"/>
+ <method name="getJDBCMajorVersion()I"/>
+ <method name="getJDBCMinorVersion()I"/>
+ <method name="getMaxBinaryLiteralLength()I"/>
+ <method name="getMaxCatalogNameLength()I"/>
+ <method name="getMaxCharLiteralLength()I"/>
+ <method name="getMaxColumnNameLength()I"/>
+ <method name="getMaxColumnsInGroupBy()I"/>
+ <method name="getMaxColumnsInIndex()I"/>
+ <method name="getMaxColumnsInOrderBy()I"/>
+ <method name="getMaxColumnsInSelect()I"/>
+ <method name="getMaxColumnsInTable()I"/>
+ <method name="getMaxConnections()I"/>
+ <method name="getMaxCursorNameLength()I"/>
+ <method name="getMaxIndexLength()I"/>
+ <method name="getMaxProcedureNameLength()I"/>
+ <method name="getMaxRowSize()I"/>
+ <method name="getMaxSchemaNameLength()I"/>
+ <method name="getMaxStatementLength()I"/>
+ <method name="getMaxStatements()I"/>
+ <method name="getMaxTableNameLength()I"/>
+ <method name="getMaxTablesInSelect()I"/>
+ <method name="getMaxUserNameLength()I"/>
+ <method name="getNumericFunctions()Ljava/lang/String;"/>
+ <method name="getPrimaryKeys(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;"/>
+ <method name="getProcedureColumns(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;"/>
+ <method name="getProcedureTerm()Ljava/lang/String;"/>
+ <method name="getProcedures(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;"/>
+ <method name="getResultSetHoldability()I"/>
+ <method name="getRowIdLifetime()Ljava/sql/RowIdLifetime;" since="9"/>
+ <method name="getSQLKeywords()Ljava/lang/String;"/>
+ <method name="getSQLStateType()I"/>
+ <method name="getSchemaTerm()Ljava/lang/String;"/>
+ <method name="getSchemas()Ljava/sql/ResultSet;"/>
+ <method name="getSchemas(Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;" since="9"/>
+ <method name="getSearchStringEscape()Ljava/lang/String;"/>
+ <method name="getStringFunctions()Ljava/lang/String;"/>
+ <method name="getSuperTables(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;"/>
+ <method name="getSuperTypes(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;"/>
+ <method name="getSystemFunctions()Ljava/lang/String;"/>
+ <method name="getTablePrivileges(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;"/>
+ <method name="getTableTypes()Ljava/sql/ResultSet;"/>
+ <method name="getTables(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)Ljava/sql/ResultSet;"/>
+ <method name="getTimeDateFunctions()Ljava/lang/String;"/>
+ <method name="getTypeInfo()Ljava/sql/ResultSet;"/>
+ <method name="getUDTs(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[I)Ljava/sql/ResultSet;"/>
+ <method name="getURL()Ljava/lang/String;"/>
+ <method name="getUserName()Ljava/lang/String;"/>
+ <method name="getVersionColumns(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;"/>
+ <method name="insertsAreDetected(I)Z"/>
+ <method name="isCatalogAtStart()Z"/>
+ <method name="isReadOnly()Z"/>
+ <method name="locatorsUpdateCopy()Z"/>
+ <method name="nullPlusNonNullIsNull()Z"/>
+ <method name="nullsAreSortedAtEnd()Z"/>
+ <method name="nullsAreSortedAtStart()Z"/>
+ <method name="nullsAreSortedHigh()Z"/>
+ <method name="nullsAreSortedLow()Z"/>
+ <method name="othersDeletesAreVisible(I)Z"/>
+ <method name="othersInsertsAreVisible(I)Z"/>
+ <method name="othersUpdatesAreVisible(I)Z"/>
+ <method name="ownDeletesAreVisible(I)Z"/>
+ <method name="ownInsertsAreVisible(I)Z"/>
+ <method name="ownUpdatesAreVisible(I)Z"/>
+ <method name="storesLowerCaseIdentifiers()Z"/>
+ <method name="storesLowerCaseQuotedIdentifiers()Z"/>
+ <method name="storesMixedCaseIdentifiers()Z"/>
+ <method name="storesMixedCaseQuotedIdentifiers()Z"/>
+ <method name="storesUpperCaseIdentifiers()Z"/>
+ <method name="storesUpperCaseQuotedIdentifiers()Z"/>
+ <method name="supportsANSI92EntryLevelSQL()Z"/>
+ <method name="supportsANSI92FullSQL()Z"/>
+ <method name="supportsANSI92IntermediateSQL()Z"/>
+ <method name="supportsAlterTableWithAddColumn()Z"/>
+ <method name="supportsAlterTableWithDropColumn()Z"/>
+ <method name="supportsBatchUpdates()Z"/>
+ <method name="supportsCatalogsInDataManipulation()Z"/>
+ <method name="supportsCatalogsInIndexDefinitions()Z"/>
+ <method name="supportsCatalogsInPrivilegeDefinitions()Z"/>
+ <method name="supportsCatalogsInProcedureCalls()Z"/>
+ <method name="supportsCatalogsInTableDefinitions()Z"/>
+ <method name="supportsColumnAliasing()Z"/>
+ <method name="supportsConvert()Z"/>
+ <method name="supportsConvert(II)Z"/>
+ <method name="supportsCoreSQLGrammar()Z"/>
+ <method name="supportsCorrelatedSubqueries()Z"/>
+ <method name="supportsDataDefinitionAndDataManipulationTransactions()Z"/>
+ <method name="supportsDataManipulationTransactionsOnly()Z"/>
+ <method name="supportsDifferentTableCorrelationNames()Z"/>
+ <method name="supportsExpressionsInOrderBy()Z"/>
+ <method name="supportsExtendedSQLGrammar()Z"/>
+ <method name="supportsFullOuterJoins()Z"/>
+ <method name="supportsGetGeneratedKeys()Z"/>
+ <method name="supportsGroupBy()Z"/>
+ <method name="supportsGroupByBeyondSelect()Z"/>
+ <method name="supportsGroupByUnrelated()Z"/>
+ <method name="supportsIntegrityEnhancementFacility()Z"/>
+ <method name="supportsLikeEscapeClause()Z"/>
+ <method name="supportsLimitedOuterJoins()Z"/>
+ <method name="supportsMinimumSQLGrammar()Z"/>
+ <method name="supportsMixedCaseIdentifiers()Z"/>
+ <method name="supportsMixedCaseQuotedIdentifiers()Z"/>
+ <method name="supportsMultipleOpenResults()Z"/>
+ <method name="supportsMultipleResultSets()Z"/>
+ <method name="supportsMultipleTransactions()Z"/>
+ <method name="supportsNamedParameters()Z"/>
+ <method name="supportsNonNullableColumns()Z"/>
+ <method name="supportsOpenCursorsAcrossCommit()Z"/>
+ <method name="supportsOpenCursorsAcrossRollback()Z"/>
+ <method name="supportsOpenStatementsAcrossCommit()Z"/>
+ <method name="supportsOpenStatementsAcrossRollback()Z"/>
+ <method name="supportsOrderByUnrelated()Z"/>
+ <method name="supportsOuterJoins()Z"/>
+ <method name="supportsPositionedDelete()Z"/>
+ <method name="supportsPositionedUpdate()Z"/>
+ <method name="supportsResultSetConcurrency(II)Z"/>
+ <method name="supportsResultSetHoldability(I)Z"/>
+ <method name="supportsResultSetType(I)Z"/>
+ <method name="supportsSavepoints()Z"/>
+ <method name="supportsSchemasInDataManipulation()Z"/>
+ <method name="supportsSchemasInIndexDefinitions()Z"/>
+ <method name="supportsSchemasInPrivilegeDefinitions()Z"/>
+ <method name="supportsSchemasInProcedureCalls()Z"/>
+ <method name="supportsSchemasInTableDefinitions()Z"/>
+ <method name="supportsSelectForUpdate()Z"/>
+ <method name="supportsStatementPooling()Z"/>
+ <method name="supportsStoredFunctionsUsingCallSyntax()Z" since="9"/>
+ <method name="supportsStoredProcedures()Z"/>
+ <method name="supportsSubqueriesInComparisons()Z"/>
+ <method name="supportsSubqueriesInExists()Z"/>
+ <method name="supportsSubqueriesInIns()Z"/>
+ <method name="supportsSubqueriesInQuantifieds()Z"/>
+ <method name="supportsTableCorrelationNames()Z"/>
+ <method name="supportsTransactionIsolationLevel(I)Z"/>
+ <method name="supportsTransactions()Z"/>
+ <method name="supportsUnion()Z"/>
+ <method name="supportsUnionAll()Z"/>
+ <method name="updatesAreDetected(I)Z"/>
+ <method name="usesLocalFilePerTable()Z"/>
+ <method name="usesLocalFiles()Z"/>
+ <field name="attributeNoNulls"/>
+ <field name="attributeNullable"/>
+ <field name="attributeNullableUnknown"/>
+ <field name="bestRowNotPseudo"/>
+ <field name="bestRowPseudo"/>
+ <field name="bestRowSession"/>
+ <field name="bestRowTemporary"/>
+ <field name="bestRowTransaction"/>
+ <field name="bestRowUnknown"/>
+ <field name="columnNoNulls"/>
+ <field name="columnNullable"/>
+ <field name="columnNullableUnknown"/>
+ <field name="functionColumnIn" since="9"/>
+ <field name="functionColumnInOut" since="9"/>
+ <field name="functionColumnOut" since="9"/>
+ <field name="functionColumnResult" since="9"/>
+ <field name="functionColumnUnknown" since="9"/>
+ <field name="functionNoNulls" since="9"/>
+ <field name="functionNoTable" since="9"/>
+ <field name="functionNullable" since="9"/>
+ <field name="functionNullableUnknown" since="9"/>
+ <field name="functionResultUnknown" since="9"/>
+ <field name="functionReturn" since="9"/>
+ <field name="functionReturnsTable" since="9"/>
+ <field name="importedKeyCascade"/>
+ <field name="importedKeyInitiallyDeferred"/>
+ <field name="importedKeyInitiallyImmediate"/>
+ <field name="importedKeyNoAction"/>
+ <field name="importedKeyNotDeferrable"/>
+ <field name="importedKeyRestrict"/>
+ <field name="importedKeySetDefault"/>
+ <field name="importedKeySetNull"/>
+ <field name="procedureColumnIn"/>
+ <field name="procedureColumnInOut"/>
+ <field name="procedureColumnOut"/>
+ <field name="procedureColumnResult"/>
+ <field name="procedureColumnReturn"/>
+ <field name="procedureColumnUnknown"/>
+ <field name="procedureNoNulls"/>
+ <field name="procedureNoResult"/>
+ <field name="procedureNullable"/>
+ <field name="procedureNullableUnknown"/>
+ <field name="procedureResultUnknown"/>
+ <field name="procedureReturnsResult"/>
+ <field name="sqlStateSQL" since="9"/>
+ <field name="sqlStateSQL99"/>
+ <field name="sqlStateXOpen"/>
+ <field name="tableIndexClustered"/>
+ <field name="tableIndexHashed"/>
+ <field name="tableIndexOther"/>
+ <field name="tableIndexStatistic"/>
+ <field name="typeNoNulls"/>
+ <field name="typeNullable"/>
+ <field name="typeNullableUnknown"/>
+ <field name="typePredBasic"/>
+ <field name="typePredChar"/>
+ <field name="typePredNone"/>
+ <field name="typeSearchable"/>
+ <field name="versionColumnNotPseudo"/>
+ <field name="versionColumnPseudo"/>
+ <field name="versionColumnUnknown"/>
+ </class>
+ <class name="java/sql/Date" since="1">
+ <extends name="java/util/Date"/>
+ <method name="&lt;init>(III)V" deprecated="16"/>
+ <method name="&lt;init>(J)V"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/sql/Date;"/>
+ </class>
+ <class name="java/sql/Driver" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="acceptsURL(Ljava/lang/String;)Z"/>
+ <method name="connect(Ljava/lang/String;Ljava/util/Properties;)Ljava/sql/Connection;"/>
+ <method name="getMajorVersion()I"/>
+ <method name="getMinorVersion()I"/>
+ <method name="getPropertyInfo(Ljava/lang/String;Ljava/util/Properties;)[Ljava/sql/DriverPropertyInfo;"/>
+ <method name="jdbcCompliant()Z"/>
+ </class>
+ <class name="java/sql/DriverManager" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="deregisterDriver(Ljava/sql/Driver;)V"/>
+ <method name="getConnection(Ljava/lang/String;)Ljava/sql/Connection;"/>
+ <method name="getConnection(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/Connection;"/>
+ <method name="getConnection(Ljava/lang/String;Ljava/util/Properties;)Ljava/sql/Connection;"/>
+ <method name="getDriver(Ljava/lang/String;)Ljava/sql/Driver;"/>
+ <method name="getDrivers()Ljava/util/Enumeration;"/>
+ <method name="getLogStream()Ljava/io/PrintStream;" deprecated="16"/>
+ <method name="getLogWriter()Ljava/io/PrintWriter;"/>
+ <method name="getLoginTimeout()I"/>
+ <method name="println(Ljava/lang/String;)V"/>
+ <method name="registerDriver(Ljava/sql/Driver;)V"/>
+ <method name="setLogStream(Ljava/io/PrintStream;)V" deprecated="16"/>
+ <method name="setLogWriter(Ljava/io/PrintWriter;)V"/>
+ <method name="setLoginTimeout(I)V"/>
+ </class>
+ <class name="java/sql/DriverPropertyInfo" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <field name="choices"/>
+ <field name="description"/>
+ <field name="name"/>
+ <field name="required"/>
+ <field name="value"/>
+ </class>
+ <class name="java/sql/NClob" since="9">
+ <extends name="java/lang/Object"/>
+ <implements name="java/sql/Clob"/>
+ </class>
+ <class name="java/sql/ParameterMetaData" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/sql/Wrapper" since="9"/>
+ <method name="getParameterClassName(I)Ljava/lang/String;"/>
+ <method name="getParameterCount()I"/>
+ <method name="getParameterMode(I)I"/>
+ <method name="getParameterType(I)I"/>
+ <method name="getParameterTypeName(I)Ljava/lang/String;"/>
+ <method name="getPrecision(I)I"/>
+ <method name="getScale(I)I"/>
+ <method name="isNullable(I)I"/>
+ <method name="isSigned(I)Z"/>
+ <field name="parameterModeIn"/>
+ <field name="parameterModeInOut"/>
+ <field name="parameterModeOut"/>
+ <field name="parameterModeUnknown"/>
+ <field name="parameterNoNulls"/>
+ <field name="parameterNullable"/>
+ <field name="parameterNullableUnknown"/>
+ </class>
+ <class name="java/sql/PreparedStatement" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/sql/Statement"/>
+ <method name="addBatch()V"/>
+ <method name="clearParameters()V"/>
+ <method name="execute()Z"/>
+ <method name="executeQuery()Ljava/sql/ResultSet;"/>
+ <method name="executeUpdate()I"/>
+ <method name="getMetaData()Ljava/sql/ResultSetMetaData;"/>
+ <method name="getParameterMetaData()Ljava/sql/ParameterMetaData;"/>
+ <method name="setArray(ILjava/sql/Array;)V"/>
+ <method name="setAsciiStream(ILjava/io/InputStream;)V" since="9"/>
+ <method name="setAsciiStream(ILjava/io/InputStream;I)V"/>
+ <method name="setAsciiStream(ILjava/io/InputStream;J)V" since="9"/>
+ <method name="setBigDecimal(ILjava/math/BigDecimal;)V"/>
+ <method name="setBinaryStream(ILjava/io/InputStream;)V" since="9"/>
+ <method name="setBinaryStream(ILjava/io/InputStream;I)V"/>
+ <method name="setBinaryStream(ILjava/io/InputStream;J)V" since="9"/>
+ <method name="setBlob(ILjava/io/InputStream;)V" since="9"/>
+ <method name="setBlob(ILjava/io/InputStream;J)V" since="9"/>
+ <method name="setBlob(ILjava/sql/Blob;)V"/>
+ <method name="setBoolean(IZ)V"/>
+ <method name="setByte(IB)V"/>
+ <method name="setBytes(I[B)V"/>
+ <method name="setCharacterStream(ILjava/io/Reader;)V" since="9"/>
+ <method name="setCharacterStream(ILjava/io/Reader;I)V"/>
+ <method name="setCharacterStream(ILjava/io/Reader;J)V" since="9"/>
+ <method name="setClob(ILjava/io/Reader;)V" since="9"/>
+ <method name="setClob(ILjava/io/Reader;J)V" since="9"/>
+ <method name="setClob(ILjava/sql/Clob;)V"/>
+ <method name="setDate(ILjava/sql/Date;)V"/>
+ <method name="setDate(ILjava/sql/Date;Ljava/util/Calendar;)V"/>
+ <method name="setDouble(ID)V"/>
+ <method name="setFloat(IF)V"/>
+ <method name="setInt(II)V"/>
+ <method name="setLong(IJ)V"/>
+ <method name="setNCharacterStream(ILjava/io/Reader;)V" since="9"/>
+ <method name="setNCharacterStream(ILjava/io/Reader;J)V" since="9"/>
+ <method name="setNClob(ILjava/io/Reader;)V" since="9"/>
+ <method name="setNClob(ILjava/io/Reader;J)V" since="9"/>
+ <method name="setNClob(ILjava/sql/NClob;)V" since="9"/>
+ <method name="setNString(ILjava/lang/String;)V" since="9"/>
+ <method name="setNull(II)V"/>
+ <method name="setNull(IILjava/lang/String;)V"/>
+ <method name="setObject(ILjava/lang/Object;)V"/>
+ <method name="setObject(ILjava/lang/Object;I)V"/>
+ <method name="setObject(ILjava/lang/Object;II)V"/>
+ <method name="setRef(ILjava/sql/Ref;)V"/>
+ <method name="setRowId(ILjava/sql/RowId;)V" since="9"/>
+ <method name="setSQLXML(ILjava/sql/SQLXML;)V" since="9"/>
+ <method name="setShort(IS)V"/>
+ <method name="setString(ILjava/lang/String;)V"/>
+ <method name="setTime(ILjava/sql/Time;)V"/>
+ <method name="setTime(ILjava/sql/Time;Ljava/util/Calendar;)V"/>
+ <method name="setTimestamp(ILjava/sql/Timestamp;)V"/>
+ <method name="setTimestamp(ILjava/sql/Timestamp;Ljava/util/Calendar;)V"/>
+ <method name="setURL(ILjava/net/URL;)V"/>
+ <method name="setUnicodeStream(ILjava/io/InputStream;I)V" deprecated="16"/>
+ </class>
+ <class name="java/sql/Ref" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getBaseTypeName()Ljava/lang/String;"/>
+ <method name="getObject()Ljava/lang/Object;"/>
+ <method name="getObject(Ljava/util/Map;)Ljava/lang/Object;"/>
+ <method name="setObject(Ljava/lang/Object;)V"/>
+ </class>
+ <class name="java/sql/ResultSet" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable" since="19"/>
+ <implements name="java/sql/Wrapper" since="9"/>
+ <method name="absolute(I)Z"/>
+ <method name="afterLast()V"/>
+ <method name="beforeFirst()V"/>
+ <method name="cancelRowUpdates()V"/>
+ <method name="clearWarnings()V"/>
+ <method name="close()V"/>
+ <method name="deleteRow()V"/>
+ <method name="findColumn(Ljava/lang/String;)I"/>
+ <method name="first()Z"/>
+ <method name="getArray(I)Ljava/sql/Array;"/>
+ <method name="getArray(Ljava/lang/String;)Ljava/sql/Array;"/>
+ <method name="getAsciiStream(I)Ljava/io/InputStream;"/>
+ <method name="getAsciiStream(Ljava/lang/String;)Ljava/io/InputStream;"/>
+ <method name="getBigDecimal(I)Ljava/math/BigDecimal;"/>
+ <method name="getBigDecimal(II)Ljava/math/BigDecimal;" deprecated="16"/>
+ <method name="getBigDecimal(Ljava/lang/String;)Ljava/math/BigDecimal;"/>
+ <method name="getBigDecimal(Ljava/lang/String;I)Ljava/math/BigDecimal;" deprecated="16"/>
+ <method name="getBinaryStream(I)Ljava/io/InputStream;"/>
+ <method name="getBinaryStream(Ljava/lang/String;)Ljava/io/InputStream;"/>
+ <method name="getBlob(I)Ljava/sql/Blob;"/>
+ <method name="getBlob(Ljava/lang/String;)Ljava/sql/Blob;"/>
+ <method name="getBoolean(I)Z"/>
+ <method name="getBoolean(Ljava/lang/String;)Z"/>
+ <method name="getByte(I)B"/>
+ <method name="getByte(Ljava/lang/String;)B"/>
+ <method name="getBytes(I)[B"/>
+ <method name="getBytes(Ljava/lang/String;)[B"/>
+ <method name="getCharacterStream(I)Ljava/io/Reader;"/>
+ <method name="getCharacterStream(Ljava/lang/String;)Ljava/io/Reader;"/>
+ <method name="getClob(I)Ljava/sql/Clob;"/>
+ <method name="getClob(Ljava/lang/String;)Ljava/sql/Clob;"/>
+ <method name="getConcurrency()I"/>
+ <method name="getCursorName()Ljava/lang/String;"/>
+ <method name="getDate(I)Ljava/sql/Date;"/>
+ <method name="getDate(ILjava/util/Calendar;)Ljava/sql/Date;"/>
+ <method name="getDate(Ljava/lang/String;)Ljava/sql/Date;"/>
+ <method name="getDate(Ljava/lang/String;Ljava/util/Calendar;)Ljava/sql/Date;"/>
+ <method name="getDouble(I)D"/>
+ <method name="getDouble(Ljava/lang/String;)D"/>
+ <method name="getFetchDirection()I"/>
+ <method name="getFetchSize()I"/>
+ <method name="getFloat(I)F"/>
+ <method name="getFloat(Ljava/lang/String;)F"/>
+ <method name="getHoldability()I" since="9"/>
+ <method name="getInt(I)I"/>
+ <method name="getInt(Ljava/lang/String;)I"/>
+ <method name="getLong(I)J"/>
+ <method name="getLong(Ljava/lang/String;)J"/>
+ <method name="getMetaData()Ljava/sql/ResultSetMetaData;"/>
+ <method name="getNCharacterStream(I)Ljava/io/Reader;" since="9"/>
+ <method name="getNCharacterStream(Ljava/lang/String;)Ljava/io/Reader;" since="9"/>
+ <method name="getNClob(I)Ljava/sql/NClob;" since="9"/>
+ <method name="getNClob(Ljava/lang/String;)Ljava/sql/NClob;" since="9"/>
+ <method name="getNString(I)Ljava/lang/String;" since="9"/>
+ <method name="getNString(Ljava/lang/String;)Ljava/lang/String;" since="9"/>
+ <method name="getObject(I)Ljava/lang/Object;"/>
+ <method name="getObject(ILjava/util/Map;)Ljava/lang/Object;"/>
+ <method name="getObject(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="getObject(Ljava/lang/String;Ljava/util/Map;)Ljava/lang/Object;"/>
+ <method name="getRef(I)Ljava/sql/Ref;"/>
+ <method name="getRef(Ljava/lang/String;)Ljava/sql/Ref;"/>
+ <method name="getRow()I"/>
+ <method name="getRowId(I)Ljava/sql/RowId;" since="9"/>
+ <method name="getRowId(Ljava/lang/String;)Ljava/sql/RowId;" since="9"/>
+ <method name="getSQLXML(I)Ljava/sql/SQLXML;" since="9"/>
+ <method name="getSQLXML(Ljava/lang/String;)Ljava/sql/SQLXML;" since="9"/>
+ <method name="getShort(I)S"/>
+ <method name="getShort(Ljava/lang/String;)S"/>
+ <method name="getStatement()Ljava/sql/Statement;"/>
+ <method name="getString(I)Ljava/lang/String;"/>
+ <method name="getString(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getTime(I)Ljava/sql/Time;"/>
+ <method name="getTime(ILjava/util/Calendar;)Ljava/sql/Time;"/>
+ <method name="getTime(Ljava/lang/String;)Ljava/sql/Time;"/>
+ <method name="getTime(Ljava/lang/String;Ljava/util/Calendar;)Ljava/sql/Time;"/>
+ <method name="getTimestamp(I)Ljava/sql/Timestamp;"/>
+ <method name="getTimestamp(ILjava/util/Calendar;)Ljava/sql/Timestamp;"/>
+ <method name="getTimestamp(Ljava/lang/String;)Ljava/sql/Timestamp;"/>
+ <method name="getTimestamp(Ljava/lang/String;Ljava/util/Calendar;)Ljava/sql/Timestamp;"/>
+ <method name="getType()I"/>
+ <method name="getURL(I)Ljava/net/URL;"/>
+ <method name="getURL(Ljava/lang/String;)Ljava/net/URL;"/>
+ <method name="getUnicodeStream(I)Ljava/io/InputStream;" deprecated="16"/>
+ <method name="getUnicodeStream(Ljava/lang/String;)Ljava/io/InputStream;" deprecated="16"/>
+ <method name="getWarnings()Ljava/sql/SQLWarning;"/>
+ <method name="insertRow()V"/>
+ <method name="isAfterLast()Z"/>
+ <method name="isBeforeFirst()Z"/>
+ <method name="isClosed()Z" since="9"/>
+ <method name="isFirst()Z"/>
+ <method name="isLast()Z"/>
+ <method name="last()Z"/>
+ <method name="moveToCurrentRow()V"/>
+ <method name="moveToInsertRow()V"/>
+ <method name="next()Z"/>
+ <method name="previous()Z"/>
+ <method name="refreshRow()V"/>
+ <method name="relative(I)Z"/>
+ <method name="rowDeleted()Z"/>
+ <method name="rowInserted()Z"/>
+ <method name="rowUpdated()Z"/>
+ <method name="setFetchDirection(I)V"/>
+ <method name="setFetchSize(I)V"/>
+ <method name="updateArray(ILjava/sql/Array;)V"/>
+ <method name="updateArray(Ljava/lang/String;Ljava/sql/Array;)V"/>
+ <method name="updateAsciiStream(ILjava/io/InputStream;)V" since="9"/>
+ <method name="updateAsciiStream(ILjava/io/InputStream;I)V"/>
+ <method name="updateAsciiStream(ILjava/io/InputStream;J)V" since="9"/>
+ <method name="updateAsciiStream(Ljava/lang/String;Ljava/io/InputStream;)V" since="9"/>
+ <method name="updateAsciiStream(Ljava/lang/String;Ljava/io/InputStream;I)V"/>
+ <method name="updateAsciiStream(Ljava/lang/String;Ljava/io/InputStream;J)V" since="9"/>
+ <method name="updateBigDecimal(ILjava/math/BigDecimal;)V"/>
+ <method name="updateBigDecimal(Ljava/lang/String;Ljava/math/BigDecimal;)V"/>
+ <method name="updateBinaryStream(ILjava/io/InputStream;)V" since="9"/>
+ <method name="updateBinaryStream(ILjava/io/InputStream;I)V"/>
+ <method name="updateBinaryStream(ILjava/io/InputStream;J)V" since="9"/>
+ <method name="updateBinaryStream(Ljava/lang/String;Ljava/io/InputStream;)V" since="9"/>
+ <method name="updateBinaryStream(Ljava/lang/String;Ljava/io/InputStream;I)V"/>
+ <method name="updateBinaryStream(Ljava/lang/String;Ljava/io/InputStream;J)V" since="9"/>
+ <method name="updateBlob(ILjava/io/InputStream;)V" since="9"/>
+ <method name="updateBlob(ILjava/io/InputStream;J)V" since="9"/>
+ <method name="updateBlob(ILjava/sql/Blob;)V"/>
+ <method name="updateBlob(Ljava/lang/String;Ljava/io/InputStream;)V" since="9"/>
+ <method name="updateBlob(Ljava/lang/String;Ljava/io/InputStream;J)V" since="9"/>
+ <method name="updateBlob(Ljava/lang/String;Ljava/sql/Blob;)V"/>
+ <method name="updateBoolean(IZ)V"/>
+ <method name="updateBoolean(Ljava/lang/String;Z)V"/>
+ <method name="updateByte(IB)V"/>
+ <method name="updateByte(Ljava/lang/String;B)V"/>
+ <method name="updateBytes(I[B)V"/>
+ <method name="updateBytes(Ljava/lang/String;[B)V"/>
+ <method name="updateCharacterStream(ILjava/io/Reader;)V" since="9"/>
+ <method name="updateCharacterStream(ILjava/io/Reader;I)V"/>
+ <method name="updateCharacterStream(ILjava/io/Reader;J)V" since="9"/>
+ <method name="updateCharacterStream(Ljava/lang/String;Ljava/io/Reader;)V" since="9"/>
+ <method name="updateCharacterStream(Ljava/lang/String;Ljava/io/Reader;I)V"/>
+ <method name="updateCharacterStream(Ljava/lang/String;Ljava/io/Reader;J)V" since="9"/>
+ <method name="updateClob(ILjava/io/Reader;)V" since="9"/>
+ <method name="updateClob(ILjava/io/Reader;J)V" since="9"/>
+ <method name="updateClob(ILjava/sql/Clob;)V"/>
+ <method name="updateClob(Ljava/lang/String;Ljava/io/Reader;)V" since="9"/>
+ <method name="updateClob(Ljava/lang/String;Ljava/io/Reader;J)V" since="9"/>
+ <method name="updateClob(Ljava/lang/String;Ljava/sql/Clob;)V"/>
+ <method name="updateDate(ILjava/sql/Date;)V"/>
+ <method name="updateDate(Ljava/lang/String;Ljava/sql/Date;)V"/>
+ <method name="updateDouble(ID)V"/>
+ <method name="updateDouble(Ljava/lang/String;D)V"/>
+ <method name="updateFloat(IF)V"/>
+ <method name="updateFloat(Ljava/lang/String;F)V"/>
+ <method name="updateInt(II)V"/>
+ <method name="updateInt(Ljava/lang/String;I)V"/>
+ <method name="updateLong(IJ)V"/>
+ <method name="updateLong(Ljava/lang/String;J)V"/>
+ <method name="updateNCharacterStream(ILjava/io/Reader;)V" since="9"/>
+ <method name="updateNCharacterStream(ILjava/io/Reader;J)V" since="9"/>
+ <method name="updateNCharacterStream(Ljava/lang/String;Ljava/io/Reader;)V" since="9"/>
+ <method name="updateNCharacterStream(Ljava/lang/String;Ljava/io/Reader;J)V" since="9"/>
+ <method name="updateNClob(ILjava/io/Reader;)V" since="9"/>
+ <method name="updateNClob(ILjava/io/Reader;J)V" since="9"/>
+ <method name="updateNClob(ILjava/sql/NClob;)V" since="9"/>
+ <method name="updateNClob(Ljava/lang/String;Ljava/io/Reader;)V" since="9"/>
+ <method name="updateNClob(Ljava/lang/String;Ljava/io/Reader;J)V" since="9"/>
+ <method name="updateNClob(Ljava/lang/String;Ljava/sql/NClob;)V" since="9"/>
+ <method name="updateNString(ILjava/lang/String;)V" since="9"/>
+ <method name="updateNString(Ljava/lang/String;Ljava/lang/String;)V" since="9"/>
+ <method name="updateNull(I)V"/>
+ <method name="updateNull(Ljava/lang/String;)V"/>
+ <method name="updateObject(ILjava/lang/Object;)V"/>
+ <method name="updateObject(ILjava/lang/Object;I)V"/>
+ <method name="updateObject(Ljava/lang/String;Ljava/lang/Object;)V"/>
+ <method name="updateObject(Ljava/lang/String;Ljava/lang/Object;I)V"/>
+ <method name="updateRef(ILjava/sql/Ref;)V"/>
+ <method name="updateRef(Ljava/lang/String;Ljava/sql/Ref;)V"/>
+ <method name="updateRow()V"/>
+ <method name="updateRowId(ILjava/sql/RowId;)V" since="9"/>
+ <method name="updateRowId(Ljava/lang/String;Ljava/sql/RowId;)V" since="9"/>
+ <method name="updateSQLXML(ILjava/sql/SQLXML;)V" since="9"/>
+ <method name="updateSQLXML(Ljava/lang/String;Ljava/sql/SQLXML;)V" since="9"/>
+ <method name="updateShort(IS)V"/>
+ <method name="updateShort(Ljava/lang/String;S)V"/>
+ <method name="updateString(ILjava/lang/String;)V"/>
+ <method name="updateString(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="updateTime(ILjava/sql/Time;)V"/>
+ <method name="updateTime(Ljava/lang/String;Ljava/sql/Time;)V"/>
+ <method name="updateTimestamp(ILjava/sql/Timestamp;)V"/>
+ <method name="updateTimestamp(Ljava/lang/String;Ljava/sql/Timestamp;)V"/>
+ <method name="wasNull()Z"/>
+ <field name="CLOSE_CURSORS_AT_COMMIT"/>
+ <field name="CONCUR_READ_ONLY"/>
+ <field name="CONCUR_UPDATABLE"/>
+ <field name="FETCH_FORWARD"/>
+ <field name="FETCH_REVERSE"/>
+ <field name="FETCH_UNKNOWN"/>
+ <field name="HOLD_CURSORS_OVER_COMMIT"/>
+ <field name="TYPE_FORWARD_ONLY"/>
+ <field name="TYPE_SCROLL_INSENSITIVE"/>
+ <field name="TYPE_SCROLL_SENSITIVE"/>
+ </class>
+ <class name="java/sql/ResultSetMetaData" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/sql/Wrapper" since="9"/>
+ <method name="getCatalogName(I)Ljava/lang/String;"/>
+ <method name="getColumnClassName(I)Ljava/lang/String;"/>
+ <method name="getColumnCount()I"/>
+ <method name="getColumnDisplaySize(I)I"/>
+ <method name="getColumnLabel(I)Ljava/lang/String;"/>
+ <method name="getColumnName(I)Ljava/lang/String;"/>
+ <method name="getColumnType(I)I"/>
+ <method name="getColumnTypeName(I)Ljava/lang/String;"/>
+ <method name="getPrecision(I)I"/>
+ <method name="getScale(I)I"/>
+ <method name="getSchemaName(I)Ljava/lang/String;"/>
+ <method name="getTableName(I)Ljava/lang/String;"/>
+ <method name="isAutoIncrement(I)Z"/>
+ <method name="isCaseSensitive(I)Z"/>
+ <method name="isCurrency(I)Z"/>
+ <method name="isDefinitelyWritable(I)Z"/>
+ <method name="isNullable(I)I"/>
+ <method name="isReadOnly(I)Z"/>
+ <method name="isSearchable(I)Z"/>
+ <method name="isSigned(I)Z"/>
+ <method name="isWritable(I)Z"/>
+ <field name="columnNoNulls"/>
+ <field name="columnNullable"/>
+ <field name="columnNullableUnknown"/>
+ </class>
+ <class name="java/sql/RowId" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="getBytes()[B"/>
+ </class>
+ <class name="java/sql/RowIdLifetime" since="9">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/sql/RowIdLifetime;"/>
+ <method name="values()[Ljava/sql/RowIdLifetime;"/>
+ <field name="ROWID_UNSUPPORTED"/>
+ <field name="ROWID_VALID_FOREVER"/>
+ <field name="ROWID_VALID_OTHER"/>
+ <field name="ROWID_VALID_SESSION"/>
+ <field name="ROWID_VALID_TRANSACTION"/>
+ </class>
+ <class name="java/sql/SQLClientInfoException" since="9">
+ <extends name="java/sql/SQLException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/util/Map;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/util/Map;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/util/Map;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/util/Map;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/util/Map;)V"/>
+ <method name="&lt;init>(Ljava/util/Map;Ljava/lang/Throwable;)V"/>
+ <method name="getFailedProperties()Ljava/util/Map;"/>
+ </class>
+ <class name="java/sql/SQLData" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getSQLTypeName()Ljava/lang/String;"/>
+ <method name="readSQL(Ljava/sql/SQLInput;Ljava/lang/String;)V"/>
+ <method name="writeSQL(Ljava/sql/SQLOutput;)V"/>
+ </class>
+ <class name="java/sql/SQLDataException" since="9">
+ <extends name="java/sql/SQLNonTransientException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/sql/SQLException" since="1">
+ <extends name="java/lang/Exception"/>
+ <implements name="java/lang/Iterable" since="9"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V" since="9"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V" since="9"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" since="9"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" since="9"/>
+ <method name="getErrorCode()I"/>
+ <method name="getNextException()Ljava/sql/SQLException;"/>
+ <method name="getSQLState()Ljava/lang/String;"/>
+ <method name="setNextException(Ljava/sql/SQLException;)V"/>
+ </class>
+ <class name="java/sql/SQLFeatureNotSupportedException" since="9">
+ <extends name="java/sql/SQLNonTransientException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/sql/SQLInput" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="readArray()Ljava/sql/Array;"/>
+ <method name="readAsciiStream()Ljava/io/InputStream;"/>
+ <method name="readBigDecimal()Ljava/math/BigDecimal;"/>
+ <method name="readBinaryStream()Ljava/io/InputStream;"/>
+ <method name="readBlob()Ljava/sql/Blob;"/>
+ <method name="readBoolean()Z"/>
+ <method name="readByte()B"/>
+ <method name="readBytes()[B"/>
+ <method name="readCharacterStream()Ljava/io/Reader;"/>
+ <method name="readClob()Ljava/sql/Clob;"/>
+ <method name="readDate()Ljava/sql/Date;"/>
+ <method name="readDouble()D"/>
+ <method name="readFloat()F"/>
+ <method name="readInt()I"/>
+ <method name="readLong()J"/>
+ <method name="readNClob()Ljava/sql/NClob;" since="9"/>
+ <method name="readNString()Ljava/lang/String;" since="9"/>
+ <method name="readObject()Ljava/lang/Object;"/>
+ <method name="readRef()Ljava/sql/Ref;"/>
+ <method name="readRowId()Ljava/sql/RowId;" since="9"/>
+ <method name="readSQLXML()Ljava/sql/SQLXML;" since="9"/>
+ <method name="readShort()S"/>
+ <method name="readString()Ljava/lang/String;"/>
+ <method name="readTime()Ljava/sql/Time;"/>
+ <method name="readTimestamp()Ljava/sql/Timestamp;"/>
+ <method name="readURL()Ljava/net/URL;"/>
+ <method name="wasNull()Z"/>
+ </class>
+ <class name="java/sql/SQLIntegrityConstraintViolationException" since="9">
+ <extends name="java/sql/SQLNonTransientException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/sql/SQLInvalidAuthorizationSpecException" since="9">
+ <extends name="java/sql/SQLNonTransientException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/sql/SQLNonTransientConnectionException" since="9">
+ <extends name="java/sql/SQLNonTransientException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/sql/SQLNonTransientException" since="9">
+ <extends name="java/sql/SQLException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/sql/SQLOutput" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="writeArray(Ljava/sql/Array;)V"/>
+ <method name="writeAsciiStream(Ljava/io/InputStream;)V"/>
+ <method name="writeBigDecimal(Ljava/math/BigDecimal;)V"/>
+ <method name="writeBinaryStream(Ljava/io/InputStream;)V"/>
+ <method name="writeBlob(Ljava/sql/Blob;)V"/>
+ <method name="writeBoolean(Z)V"/>
+ <method name="writeByte(B)V"/>
+ <method name="writeBytes([B)V"/>
+ <method name="writeCharacterStream(Ljava/io/Reader;)V"/>
+ <method name="writeClob(Ljava/sql/Clob;)V"/>
+ <method name="writeDate(Ljava/sql/Date;)V"/>
+ <method name="writeDouble(D)V"/>
+ <method name="writeFloat(F)V"/>
+ <method name="writeInt(I)V"/>
+ <method name="writeLong(J)V"/>
+ <method name="writeNClob(Ljava/sql/NClob;)V" since="9"/>
+ <method name="writeNString(Ljava/lang/String;)V" since="9"/>
+ <method name="writeObject(Ljava/sql/SQLData;)V"/>
+ <method name="writeRef(Ljava/sql/Ref;)V"/>
+ <method name="writeRowId(Ljava/sql/RowId;)V" since="9"/>
+ <method name="writeSQLXML(Ljava/sql/SQLXML;)V" since="9"/>
+ <method name="writeShort(S)V"/>
+ <method name="writeString(Ljava/lang/String;)V"/>
+ <method name="writeStruct(Ljava/sql/Struct;)V"/>
+ <method name="writeTime(Ljava/sql/Time;)V"/>
+ <method name="writeTimestamp(Ljava/sql/Timestamp;)V"/>
+ <method name="writeURL(Ljava/net/URL;)V"/>
+ </class>
+ <class name="java/sql/SQLPermission" since="1">
+ <extends name="java/security/BasicPermission"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/sql/SQLRecoverableException" since="9">
+ <extends name="java/sql/SQLException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/sql/SQLSyntaxErrorException" since="9">
+ <extends name="java/sql/SQLNonTransientException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/sql/SQLTimeoutException" since="9">
+ <extends name="java/sql/SQLTransientException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/sql/SQLTransactionRollbackException" since="9">
+ <extends name="java/sql/SQLTransientException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/sql/SQLTransientConnectionException" since="9">
+ <extends name="java/sql/SQLTransientException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/sql/SQLTransientException" since="9">
+ <extends name="java/sql/SQLException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/sql/SQLWarning" since="1">
+ <extends name="java/sql/SQLException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V" since="9"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V" since="9"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" since="9"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" since="9"/>
+ <method name="getNextWarning()Ljava/sql/SQLWarning;"/>
+ <method name="setNextWarning(Ljava/sql/SQLWarning;)V"/>
+ </class>
+ <class name="java/sql/SQLXML" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="free()V"/>
+ <method name="getBinaryStream()Ljava/io/InputStream;"/>
+ <method name="getCharacterStream()Ljava/io/Reader;"/>
+ <method name="getSource(Ljava/lang/Class;)Ljavax/xml/transform/Source;"/>
+ <method name="getString()Ljava/lang/String;"/>
+ <method name="setBinaryStream()Ljava/io/OutputStream;"/>
+ <method name="setCharacterStream()Ljava/io/Writer;"/>
+ <method name="setResult(Ljava/lang/Class;)Ljavax/xml/transform/Result;"/>
+ <method name="setString(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/sql/Savepoint" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getSavepointId()I"/>
+ <method name="getSavepointName()Ljava/lang/String;"/>
+ </class>
+ <class name="java/sql/Statement" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable" since="19"/>
+ <implements name="java/sql/Wrapper" since="9"/>
+ <method name="addBatch(Ljava/lang/String;)V"/>
+ <method name="cancel()V"/>
+ <method name="clearBatch()V"/>
+ <method name="clearWarnings()V"/>
+ <method name="close()V"/>
+ <method name="execute(Ljava/lang/String;)Z"/>
+ <method name="execute(Ljava/lang/String;I)Z"/>
+ <method name="execute(Ljava/lang/String;[I)Z"/>
+ <method name="execute(Ljava/lang/String;[Ljava/lang/String;)Z"/>
+ <method name="executeBatch()[I"/>
+ <method name="executeQuery(Ljava/lang/String;)Ljava/sql/ResultSet;"/>
+ <method name="executeUpdate(Ljava/lang/String;)I"/>
+ <method name="executeUpdate(Ljava/lang/String;I)I"/>
+ <method name="executeUpdate(Ljava/lang/String;[I)I"/>
+ <method name="executeUpdate(Ljava/lang/String;[Ljava/lang/String;)I"/>
+ <method name="getConnection()Ljava/sql/Connection;"/>
+ <method name="getFetchDirection()I"/>
+ <method name="getFetchSize()I"/>
+ <method name="getGeneratedKeys()Ljava/sql/ResultSet;"/>
+ <method name="getMaxFieldSize()I"/>
+ <method name="getMaxRows()I"/>
+ <method name="getMoreResults()Z"/>
+ <method name="getMoreResults(I)Z"/>
+ <method name="getQueryTimeout()I"/>
+ <method name="getResultSet()Ljava/sql/ResultSet;"/>
+ <method name="getResultSetConcurrency()I"/>
+ <method name="getResultSetHoldability()I"/>
+ <method name="getResultSetType()I"/>
+ <method name="getUpdateCount()I"/>
+ <method name="getWarnings()Ljava/sql/SQLWarning;"/>
+ <method name="isClosed()Z" since="9"/>
+ <method name="isPoolable()Z" since="9"/>
+ <method name="setCursorName(Ljava/lang/String;)V"/>
+ <method name="setEscapeProcessing(Z)V"/>
+ <method name="setFetchDirection(I)V"/>
+ <method name="setFetchSize(I)V"/>
+ <method name="setMaxFieldSize(I)V"/>
+ <method name="setMaxRows(I)V"/>
+ <method name="setPoolable(Z)V" since="9"/>
+ <method name="setQueryTimeout(I)V"/>
+ <field name="CLOSE_ALL_RESULTS"/>
+ <field name="CLOSE_CURRENT_RESULT"/>
+ <field name="EXECUTE_FAILED"/>
+ <field name="KEEP_CURRENT_RESULT"/>
+ <field name="NO_GENERATED_KEYS"/>
+ <field name="RETURN_GENERATED_KEYS"/>
+ <field name="SUCCESS_NO_INFO"/>
+ </class>
+ <class name="java/sql/Struct" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getAttributes()[Ljava/lang/Object;"/>
+ <method name="getAttributes(Ljava/util/Map;)[Ljava/lang/Object;"/>
+ <method name="getSQLTypeName()Ljava/lang/String;"/>
+ </class>
+ <class name="java/sql/Time" since="1">
+ <extends name="java/util/Date"/>
+ <method name="&lt;init>(III)V" deprecated="16"/>
+ <method name="&lt;init>(J)V"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/sql/Time;"/>
+ </class>
+ <class name="java/sql/Timestamp" since="1">
+ <extends name="java/util/Date"/>
+ <method name="&lt;init>(IIIIIII)V" deprecated="16"/>
+ <method name="&lt;init>(J)V"/>
+ <method name="after(Ljava/sql/Timestamp;)Z"/>
+ <method name="before(Ljava/sql/Timestamp;)Z"/>
+ <method name="compareTo(Ljava/sql/Timestamp;)I"/>
+ <method name="equals(Ljava/sql/Timestamp;)Z"/>
+ <method name="getNanos()I"/>
+ <method name="setNanos(I)V"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/sql/Timestamp;"/>
+ </class>
+ <class name="java/sql/Types" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="ARRAY"/>
+ <field name="BIGINT"/>
+ <field name="BINARY"/>
+ <field name="BIT"/>
+ <field name="BLOB"/>
+ <field name="BOOLEAN"/>
+ <field name="CHAR"/>
+ <field name="CLOB"/>
+ <field name="DATALINK"/>
+ <field name="DATE"/>
+ <field name="DECIMAL"/>
+ <field name="DISTINCT"/>
+ <field name="DOUBLE"/>
+ <field name="FLOAT"/>
+ <field name="INTEGER"/>
+ <field name="JAVA_OBJECT"/>
+ <field name="LONGNVARCHAR" since="9"/>
+ <field name="LONGVARBINARY"/>
+ <field name="LONGVARCHAR"/>
+ <field name="NCHAR" since="9"/>
+ <field name="NCLOB" since="9"/>
+ <field name="NULL"/>
+ <field name="NUMERIC"/>
+ <field name="NVARCHAR" since="9"/>
+ <field name="OTHER"/>
+ <field name="REAL"/>
+ <field name="REF"/>
+ <field name="ROWID" since="9"/>
+ <field name="SMALLINT"/>
+ <field name="SQLXML" since="9"/>
+ <field name="STRUCT"/>
+ <field name="TIME"/>
+ <field name="TIMESTAMP"/>
+ <field name="TINYINT"/>
+ <field name="VARBINARY"/>
+ <field name="VARCHAR"/>
+ </class>
+ <class name="java/sql/Wrapper" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="isWrapperFor(Ljava/lang/Class;)Z"/>
+ <method name="unwrap(Ljava/lang/Class;)Ljava/lang/Object;"/>
+ </class>
+ <class name="java/text/Annotation" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/Object;)V"/>
+ <method name="getValue()Ljava/lang/Object;"/>
+ </class>
+ <class name="java/text/AttributedCharacterIterator" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/text/CharacterIterator"/>
+ <method name="getAllAttributeKeys()Ljava/util/Set;"/>
+ <method name="getAttribute(Ljava/text/AttributedCharacterIterator$Attribute;)Ljava/lang/Object;"/>
+ <method name="getAttributes()Ljava/util/Map;"/>
+ <method name="getRunLimit()I"/>
+ <method name="getRunLimit(Ljava/text/AttributedCharacterIterator$Attribute;)I"/>
+ <method name="getRunLimit(Ljava/util/Set;)I"/>
+ <method name="getRunStart()I"/>
+ <method name="getRunStart(Ljava/text/AttributedCharacterIterator$Attribute;)I"/>
+ <method name="getRunStart(Ljava/util/Set;)I"/>
+ </class>
+ <class name="java/text/AttributedCharacterIterator$Attribute" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="readResolve()Ljava/lang/Object;"/>
+ <field name="INPUT_METHOD_SEGMENT"/>
+ <field name="LANGUAGE"/>
+ <field name="READING"/>
+ </class>
+ <class name="java/text/AttributedString" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/util/Map;)V"/>
+ <method name="&lt;init>(Ljava/text/AttributedCharacterIterator;)V"/>
+ <method name="&lt;init>(Ljava/text/AttributedCharacterIterator;II)V"/>
+ <method name="&lt;init>(Ljava/text/AttributedCharacterIterator;II[Ljava/text/AttributedCharacterIterator$Attribute;)V"/>
+ <method name="addAttribute(Ljava/text/AttributedCharacterIterator$Attribute;Ljava/lang/Object;)V"/>
+ <method name="addAttribute(Ljava/text/AttributedCharacterIterator$Attribute;Ljava/lang/Object;II)V"/>
+ <method name="addAttributes(Ljava/util/Map;II)V"/>
+ <method name="getIterator()Ljava/text/AttributedCharacterIterator;"/>
+ <method name="getIterator([Ljava/text/AttributedCharacterIterator$Attribute;)Ljava/text/AttributedCharacterIterator;"/>
+ <method name="getIterator([Ljava/text/AttributedCharacterIterator$Attribute;II)Ljava/text/AttributedCharacterIterator;"/>
+ </class>
+ <class name="java/text/Bidi" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/text/AttributedCharacterIterator;)V"/>
+ <method name="&lt;init>([CI[BIII)V"/>
+ <method name="baseIsLeftToRight()Z"/>
+ <method name="createLineBidi(II)Ljava/text/Bidi;"/>
+ <method name="getBaseLevel()I"/>
+ <method name="getLength()I"/>
+ <method name="getLevelAt(I)I"/>
+ <method name="getRunCount()I"/>
+ <method name="getRunLevel(I)I"/>
+ <method name="getRunLimit(I)I"/>
+ <method name="getRunStart(I)I"/>
+ <method name="isLeftToRight()Z"/>
+ <method name="isMixed()Z"/>
+ <method name="isRightToLeft()Z"/>
+ <method name="reorderVisually([BI[Ljava/lang/Object;II)V"/>
+ <method name="requiresBidi([CII)Z"/>
+ <field name="DIRECTION_DEFAULT_LEFT_TO_RIGHT"/>
+ <field name="DIRECTION_DEFAULT_RIGHT_TO_LEFT"/>
+ <field name="DIRECTION_LEFT_TO_RIGHT"/>
+ <field name="DIRECTION_RIGHT_TO_LEFT"/>
+ </class>
+ <class name="java/text/BreakIterator" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="current()I"/>
+ <method name="first()I"/>
+ <method name="following(I)I"/>
+ <method name="getAvailableLocales()[Ljava/util/Locale;"/>
+ <method name="getCharacterInstance()Ljava/text/BreakIterator;"/>
+ <method name="getCharacterInstance(Ljava/util/Locale;)Ljava/text/BreakIterator;"/>
+ <method name="getInt([BI)I" removed="9"/>
+ <method name="getLineInstance()Ljava/text/BreakIterator;"/>
+ <method name="getLineInstance(Ljava/util/Locale;)Ljava/text/BreakIterator;"/>
+ <method name="getLong([BI)J" removed="9"/>
+ <method name="getSentenceInstance()Ljava/text/BreakIterator;"/>
+ <method name="getSentenceInstance(Ljava/util/Locale;)Ljava/text/BreakIterator;"/>
+ <method name="getShort([BI)S" removed="9"/>
+ <method name="getText()Ljava/text/CharacterIterator;"/>
+ <method name="getWordInstance()Ljava/text/BreakIterator;"/>
+ <method name="getWordInstance(Ljava/util/Locale;)Ljava/text/BreakIterator;"/>
+ <method name="isBoundary(I)Z"/>
+ <method name="last()I"/>
+ <method name="next()I"/>
+ <method name="next(I)I"/>
+ <method name="preceding(I)I"/>
+ <method name="previous()I"/>
+ <method name="setText(Ljava/lang/String;)V"/>
+ <method name="setText(Ljava/text/CharacterIterator;)V"/>
+ <field name="DONE"/>
+ </class>
+ <class name="java/text/CharacterIterator" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="current()C"/>
+ <method name="first()C"/>
+ <method name="getBeginIndex()I"/>
+ <method name="getEndIndex()I"/>
+ <method name="getIndex()I"/>
+ <method name="last()C"/>
+ <method name="next()C"/>
+ <method name="previous()C"/>
+ <method name="setIndex(I)C"/>
+ <field name="DONE"/>
+ </class>
+ <class name="java/text/ChoiceFormat" since="1">
+ <extends name="java/text/NumberFormat"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>([D[Ljava/lang/String;)V"/>
+ <method name="applyPattern(Ljava/lang/String;)V"/>
+ <method name="getFormats()[Ljava/lang/Object;"/>
+ <method name="getLimits()[D"/>
+ <method name="nextDouble(D)D"/>
+ <method name="nextDouble(DZ)D"/>
+ <method name="previousDouble(D)D"/>
+ <method name="setChoices([D[Ljava/lang/String;)V"/>
+ <method name="toPattern()Ljava/lang/String;"/>
+ </class>
+ <class name="java/text/CollationElementIterator" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getMaxExpansion(I)I"/>
+ <method name="getOffset()I"/>
+ <method name="next()I"/>
+ <method name="previous()I"/>
+ <method name="primaryOrder(I)I"/>
+ <method name="reset()V"/>
+ <method name="secondaryOrder(I)S"/>
+ <method name="setOffset(I)V"/>
+ <method name="setText(Ljava/lang/String;)V"/>
+ <method name="setText(Ljava/text/CharacterIterator;)V"/>
+ <method name="tertiaryOrder(I)S"/>
+ <field name="NULLORDER"/>
+ </class>
+ <class name="java/text/CollationKey" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>()V" removed="9"/>
+ <method name="&lt;init>(Ljava/lang/String;)V" since="9"/>
+ <method name="compareTo(Ljava/text/CollationKey;)I"/>
+ <method name="getSourceString()Ljava/lang/String;"/>
+ <method name="toByteArray()[B"/>
+ </class>
+ <class name="java/text/Collator" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="java/util/Comparator"/>
+ <method name="&lt;init>()V"/>
+ <method name="compare(Ljava/lang/String;Ljava/lang/String;)I"/>
+ <method name="equals(Ljava/lang/String;Ljava/lang/String;)Z"/>
+ <method name="getAvailableLocales()[Ljava/util/Locale;"/>
+ <method name="getCollationKey(Ljava/lang/String;)Ljava/text/CollationKey;"/>
+ <method name="getDecomposition()I"/>
+ <method name="getInstance()Ljava/text/Collator;"/>
+ <method name="getInstance(Ljava/util/Locale;)Ljava/text/Collator;"/>
+ <method name="getStrength()I"/>
+ <method name="setDecomposition(I)V"/>
+ <method name="setStrength(I)V"/>
+ <field name="CANONICAL_DECOMPOSITION"/>
+ <field name="FULL_DECOMPOSITION"/>
+ <field name="IDENTICAL"/>
+ <field name="NO_DECOMPOSITION"/>
+ <field name="PRIMARY"/>
+ <field name="SECONDARY"/>
+ <field name="TERTIARY"/>
+ </class>
+ <class name="java/text/DateFormat" since="1">
+ <extends name="java/text/Format"/>
+ <method name="&lt;init>()V"/>
+ <method name="format(Ljava/util/Date;)Ljava/lang/String;"/>
+ <method name="format(Ljava/util/Date;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;"/>
+ <method name="getAvailableLocales()[Ljava/util/Locale;"/>
+ <method name="getCalendar()Ljava/util/Calendar;"/>
+ <method name="getDateInstance()Ljava/text/DateFormat;"/>
+ <method name="getDateInstance(I)Ljava/text/DateFormat;"/>
+ <method name="getDateInstance(ILjava/util/Locale;)Ljava/text/DateFormat;"/>
+ <method name="getDateTimeInstance()Ljava/text/DateFormat;"/>
+ <method name="getDateTimeInstance(II)Ljava/text/DateFormat;"/>
+ <method name="getDateTimeInstance(IILjava/util/Locale;)Ljava/text/DateFormat;"/>
+ <method name="getInstance()Ljava/text/DateFormat;"/>
+ <method name="getNumberFormat()Ljava/text/NumberFormat;"/>
+ <method name="getTimeInstance()Ljava/text/DateFormat;"/>
+ <method name="getTimeInstance(I)Ljava/text/DateFormat;"/>
+ <method name="getTimeInstance(ILjava/util/Locale;)Ljava/text/DateFormat;"/>
+ <method name="getTimeZone()Ljava/util/TimeZone;"/>
+ <method name="isLenient()Z"/>
+ <method name="parse(Ljava/lang/String;)Ljava/util/Date;"/>
+ <method name="parse(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/util/Date;"/>
+ <method name="setCalendar(Ljava/util/Calendar;)V"/>
+ <method name="setLenient(Z)V"/>
+ <method name="setNumberFormat(Ljava/text/NumberFormat;)V"/>
+ <method name="setTimeZone(Ljava/util/TimeZone;)V"/>
+ <field name="AM_PM_FIELD"/>
+ <field name="DATE_FIELD"/>
+ <field name="DAY_OF_WEEK_FIELD"/>
+ <field name="DAY_OF_WEEK_IN_MONTH_FIELD"/>
+ <field name="DAY_OF_YEAR_FIELD"/>
+ <field name="DEFAULT"/>
+ <field name="ERA_FIELD"/>
+ <field name="FULL"/>
+ <field name="HOUR0_FIELD"/>
+ <field name="HOUR1_FIELD"/>
+ <field name="HOUR_OF_DAY0_FIELD"/>
+ <field name="HOUR_OF_DAY1_FIELD"/>
+ <field name="LONG"/>
+ <field name="MEDIUM"/>
+ <field name="MILLISECOND_FIELD"/>
+ <field name="MINUTE_FIELD"/>
+ <field name="MONTH_FIELD"/>
+ <field name="SECOND_FIELD"/>
+ <field name="SHORT"/>
+ <field name="TIMEZONE_FIELD"/>
+ <field name="WEEK_OF_MONTH_FIELD"/>
+ <field name="WEEK_OF_YEAR_FIELD"/>
+ <field name="YEAR_FIELD"/>
+ <field name="calendar"/>
+ <field name="numberFormat"/>
+ </class>
+ <class name="java/text/DateFormat$Field" since="1">
+ <extends name="java/text/Format$Field"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="getCalendarField()I"/>
+ <method name="ofCalendarField(I)Ljava/text/DateFormat$Field;"/>
+ <field name="AM_PM"/>
+ <field name="DAY_OF_MONTH"/>
+ <field name="DAY_OF_WEEK"/>
+ <field name="DAY_OF_WEEK_IN_MONTH"/>
+ <field name="DAY_OF_YEAR"/>
+ <field name="ERA"/>
+ <field name="HOUR0"/>
+ <field name="HOUR1"/>
+ <field name="HOUR_OF_DAY0"/>
+ <field name="HOUR_OF_DAY1"/>
+ <field name="MILLISECOND"/>
+ <field name="MINUTE"/>
+ <field name="MONTH"/>
+ <field name="SECOND"/>
+ <field name="TIME_ZONE"/>
+ <field name="WEEK_OF_MONTH"/>
+ <field name="WEEK_OF_YEAR"/>
+ <field name="YEAR"/>
+ </class>
+ <class name="java/text/DateFormatSymbols" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V"/>
+ <method name="getAmPmStrings()[Ljava/lang/String;"/>
+ <method name="getAvailableLocales()[Ljava/util/Locale;" since="9"/>
+ <method name="getEras()[Ljava/lang/String;"/>
+ <method name="getInstance()Ljava/text/DateFormatSymbols;" since="9"/>
+ <method name="getInstance(Ljava/util/Locale;)Ljava/text/DateFormatSymbols;" since="9"/>
+ <method name="getLocalPatternChars()Ljava/lang/String;"/>
+ <method name="getMonths()[Ljava/lang/String;"/>
+ <method name="getShortMonths()[Ljava/lang/String;"/>
+ <method name="getShortWeekdays()[Ljava/lang/String;"/>
+ <method name="getWeekdays()[Ljava/lang/String;"/>
+ <method name="getZoneStrings()[[Ljava/lang/String;"/>
+ <method name="setAmPmStrings([Ljava/lang/String;)V"/>
+ <method name="setEras([Ljava/lang/String;)V"/>
+ <method name="setLocalPatternChars(Ljava/lang/String;)V"/>
+ <method name="setMonths([Ljava/lang/String;)V"/>
+ <method name="setShortMonths([Ljava/lang/String;)V"/>
+ <method name="setShortWeekdays([Ljava/lang/String;)V"/>
+ <method name="setWeekdays([Ljava/lang/String;)V"/>
+ <method name="setZoneStrings([[Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/text/DecimalFormat" since="1">
+ <extends name="java/text/NumberFormat"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/text/DecimalFormatSymbols;)V"/>
+ <method name="applyLocalizedPattern(Ljava/lang/String;)V"/>
+ <method name="applyPattern(Ljava/lang/String;)V"/>
+ <method name="getDecimalFormatSymbols()Ljava/text/DecimalFormatSymbols;"/>
+ <method name="getGroupingSize()I"/>
+ <method name="getMultiplier()I"/>
+ <method name="getNegativePrefix()Ljava/lang/String;"/>
+ <method name="getNegativeSuffix()Ljava/lang/String;"/>
+ <method name="getPositivePrefix()Ljava/lang/String;"/>
+ <method name="getPositiveSuffix()Ljava/lang/String;"/>
+ <method name="isDecimalSeparatorAlwaysShown()Z"/>
+ <method name="isParseBigDecimal()Z"/>
+ <method name="setDecimalFormatSymbols(Ljava/text/DecimalFormatSymbols;)V"/>
+ <method name="setDecimalSeparatorAlwaysShown(Z)V"/>
+ <method name="setGroupingSize(I)V"/>
+ <method name="setMultiplier(I)V"/>
+ <method name="setNegativePrefix(Ljava/lang/String;)V"/>
+ <method name="setNegativeSuffix(Ljava/lang/String;)V"/>
+ <method name="setParseBigDecimal(Z)V"/>
+ <method name="setPositivePrefix(Ljava/lang/String;)V"/>
+ <method name="setPositiveSuffix(Ljava/lang/String;)V"/>
+ <method name="toLocalizedPattern()Ljava/lang/String;"/>
+ <method name="toPattern()Ljava/lang/String;"/>
+ </class>
+ <class name="java/text/DecimalFormatSymbols" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V"/>
+ <method name="getAvailableLocales()[Ljava/util/Locale;" since="9"/>
+ <method name="getCurrency()Ljava/util/Currency;"/>
+ <method name="getCurrencySymbol()Ljava/lang/String;"/>
+ <method name="getDecimalSeparator()C"/>
+ <method name="getDigit()C"/>
+ <method name="getExponentSeparator()Ljava/lang/String;" since="9"/>
+ <method name="getGroupingSeparator()C"/>
+ <method name="getInfinity()Ljava/lang/String;"/>
+ <method name="getInstance()Ljava/text/DecimalFormatSymbols;" since="9"/>
+ <method name="getInstance(Ljava/util/Locale;)Ljava/text/DecimalFormatSymbols;" since="9"/>
+ <method name="getInternationalCurrencySymbol()Ljava/lang/String;"/>
+ <method name="getMinusSign()C"/>
+ <method name="getMonetaryDecimalSeparator()C"/>
+ <method name="getNaN()Ljava/lang/String;"/>
+ <method name="getPatternSeparator()C"/>
+ <method name="getPerMill()C"/>
+ <method name="getPercent()C"/>
+ <method name="getZeroDigit()C"/>
+ <method name="setCurrency(Ljava/util/Currency;)V"/>
+ <method name="setCurrencySymbol(Ljava/lang/String;)V"/>
+ <method name="setDecimalSeparator(C)V"/>
+ <method name="setDigit(C)V"/>
+ <method name="setExponentSeparator(Ljava/lang/String;)V" since="9"/>
+ <method name="setGroupingSeparator(C)V"/>
+ <method name="setInfinity(Ljava/lang/String;)V"/>
+ <method name="setInternationalCurrencySymbol(Ljava/lang/String;)V"/>
+ <method name="setMinusSign(C)V"/>
+ <method name="setMonetaryDecimalSeparator(C)V"/>
+ <method name="setNaN(Ljava/lang/String;)V"/>
+ <method name="setPatternSeparator(C)V"/>
+ <method name="setPerMill(C)V"/>
+ <method name="setPercent(C)V"/>
+ <method name="setZeroDigit(C)V"/>
+ </class>
+ <class name="java/text/FieldPosition" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Ljava/text/Format$Field;)V"/>
+ <method name="&lt;init>(Ljava/text/Format$Field;I)V"/>
+ <method name="getBeginIndex()I"/>
+ <method name="getEndIndex()I"/>
+ <method name="getField()I"/>
+ <method name="getFieldAttribute()Ljava/text/Format$Field;"/>
+ <method name="setBeginIndex(I)V"/>
+ <method name="setEndIndex(I)V"/>
+ </class>
+ <class name="java/text/Format" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="format(Ljava/lang/Object;)Ljava/lang/String;"/>
+ <method name="format(Ljava/lang/Object;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;"/>
+ <method name="formatToCharacterIterator(Ljava/lang/Object;)Ljava/text/AttributedCharacterIterator;"/>
+ <method name="parseObject(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="parseObject(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/lang/Object;"/>
+ </class>
+ <class name="java/text/Format$Field" since="1">
+ <extends name="java/text/AttributedCharacterIterator$Attribute"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/text/MessageFormat" since="1">
+ <extends name="java/text/Format"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/util/Locale;)V"/>
+ <method name="applyPattern(Ljava/lang/String;)V"/>
+ <method name="format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;"/>
+ <method name="format([Ljava/lang/Object;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;"/>
+ <method name="getFormats()[Ljava/text/Format;"/>
+ <method name="getFormatsByArgumentIndex()[Ljava/text/Format;"/>
+ <method name="getLocale()Ljava/util/Locale;"/>
+ <method name="parse(Ljava/lang/String;)[Ljava/lang/Object;"/>
+ <method name="parse(Ljava/lang/String;Ljava/text/ParsePosition;)[Ljava/lang/Object;"/>
+ <method name="setFormat(ILjava/text/Format;)V"/>
+ <method name="setFormatByArgumentIndex(ILjava/text/Format;)V"/>
+ <method name="setFormats([Ljava/text/Format;)V"/>
+ <method name="setFormatsByArgumentIndex([Ljava/text/Format;)V"/>
+ <method name="setLocale(Ljava/util/Locale;)V"/>
+ <method name="toPattern()Ljava/lang/String;"/>
+ </class>
+ <class name="java/text/MessageFormat$Field" since="1">
+ <extends name="java/text/Format$Field"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <field name="ARGUMENT"/>
+ </class>
+ <class name="java/text/Normalizer" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="isNormalized(Ljava/lang/CharSequence;Ljava/text/Normalizer$Form;)Z"/>
+ <method name="normalize(Ljava/lang/CharSequence;Ljava/text/Normalizer$Form;)Ljava/lang/String;"/>
+ </class>
+ <class name="java/text/Normalizer$Form" since="9">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/text/Normalizer$Form;"/>
+ <method name="values()[Ljava/text/Normalizer$Form;"/>
+ <field name="NFC"/>
+ <field name="NFD"/>
+ <field name="NFKC"/>
+ <field name="NFKD"/>
+ </class>
+ <class name="java/text/NumberFormat" since="1">
+ <extends name="java/text/Format"/>
+ <method name="&lt;init>()V"/>
+ <method name="format(D)Ljava/lang/String;"/>
+ <method name="format(DLjava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;"/>
+ <method name="format(J)Ljava/lang/String;"/>
+ <method name="format(JLjava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;"/>
+ <method name="getAvailableLocales()[Ljava/util/Locale;"/>
+ <method name="getCurrency()Ljava/util/Currency;"/>
+ <method name="getCurrencyInstance()Ljava/text/NumberFormat;"/>
+ <method name="getCurrencyInstance(Ljava/util/Locale;)Ljava/text/NumberFormat;"/>
+ <method name="getInstance()Ljava/text/NumberFormat;"/>
+ <method name="getInstance(Ljava/util/Locale;)Ljava/text/NumberFormat;"/>
+ <method name="getIntegerInstance()Ljava/text/NumberFormat;"/>
+ <method name="getIntegerInstance(Ljava/util/Locale;)Ljava/text/NumberFormat;"/>
+ <method name="getMaximumFractionDigits()I"/>
+ <method name="getMaximumIntegerDigits()I"/>
+ <method name="getMinimumFractionDigits()I"/>
+ <method name="getMinimumIntegerDigits()I"/>
+ <method name="getNumberInstance()Ljava/text/NumberFormat;"/>
+ <method name="getNumberInstance(Ljava/util/Locale;)Ljava/text/NumberFormat;"/>
+ <method name="getPercentInstance()Ljava/text/NumberFormat;"/>
+ <method name="getPercentInstance(Ljava/util/Locale;)Ljava/text/NumberFormat;"/>
+ <method name="getRoundingMode()Ljava/math/RoundingMode;" since="9"/>
+ <method name="isGroupingUsed()Z"/>
+ <method name="isParseIntegerOnly()Z"/>
+ <method name="parse(Ljava/lang/String;)Ljava/lang/Number;"/>
+ <method name="parse(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/lang/Number;"/>
+ <method name="setCurrency(Ljava/util/Currency;)V"/>
+ <method name="setGroupingUsed(Z)V"/>
+ <method name="setMaximumFractionDigits(I)V"/>
+ <method name="setMaximumIntegerDigits(I)V"/>
+ <method name="setMinimumFractionDigits(I)V"/>
+ <method name="setMinimumIntegerDigits(I)V"/>
+ <method name="setParseIntegerOnly(Z)V"/>
+ <method name="setRoundingMode(Ljava/math/RoundingMode;)V" since="9"/>
+ <field name="FRACTION_FIELD"/>
+ <field name="INTEGER_FIELD"/>
+ </class>
+ <class name="java/text/NumberFormat$Field" since="1">
+ <extends name="java/text/Format$Field"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <field name="CURRENCY"/>
+ <field name="DECIMAL_SEPARATOR"/>
+ <field name="EXPONENT"/>
+ <field name="EXPONENT_SIGN"/>
+ <field name="EXPONENT_SYMBOL"/>
+ <field name="FRACTION"/>
+ <field name="GROUPING_SEPARATOR"/>
+ <field name="INTEGER"/>
+ <field name="PERCENT"/>
+ <field name="PERMILLE"/>
+ <field name="SIGN"/>
+ </class>
+ <class name="java/text/ParseException" since="1">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="getErrorOffset()I"/>
+ </class>
+ <class name="java/text/ParsePosition" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="getErrorIndex()I"/>
+ <method name="getIndex()I"/>
+ <method name="setErrorIndex(I)V"/>
+ <method name="setIndex(I)V"/>
+ </class>
+ <class name="java/text/RuleBasedCollator" since="1">
+ <extends name="java/text/Collator"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getCollationElementIterator(Ljava/lang/String;)Ljava/text/CollationElementIterator;"/>
+ <method name="getCollationElementIterator(Ljava/text/CharacterIterator;)Ljava/text/CollationElementIterator;"/>
+ <method name="getRules()Ljava/lang/String;"/>
+ </class>
+ <class name="java/text/SimpleDateFormat" since="1">
+ <extends name="java/text/DateFormat"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/text/DateFormatSymbols;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/util/Locale;)V"/>
+ <method name="applyLocalizedPattern(Ljava/lang/String;)V"/>
+ <method name="applyPattern(Ljava/lang/String;)V"/>
+ <method name="get2DigitYearStart()Ljava/util/Date;"/>
+ <method name="getDateFormatSymbols()Ljava/text/DateFormatSymbols;"/>
+ <method name="set2DigitYearStart(Ljava/util/Date;)V"/>
+ <method name="setDateFormatSymbols(Ljava/text/DateFormatSymbols;)V"/>
+ <method name="toLocalizedPattern()Ljava/lang/String;"/>
+ <method name="toPattern()Ljava/lang/String;"/>
+ </class>
+ <class name="java/text/StringCharacterIterator" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/text/CharacterIterator"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;III)V"/>
+ <method name="setText(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/time/Clock" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="fixed(Ljava/time/Instant;Ljava/time/ZoneId;)Ljava/time/Clock;"/>
+ <method name="getZone()Ljava/time/ZoneId;"/>
+ <method name="instant()Ljava/time/Instant;"/>
+ <method name="millis()J"/>
+ <method name="offset(Ljava/time/Clock;Ljava/time/Duration;)Ljava/time/Clock;"/>
+ <method name="system(Ljava/time/ZoneId;)Ljava/time/Clock;"/>
+ <method name="systemDefaultZone()Ljava/time/Clock;"/>
+ <method name="systemUTC()Ljava/time/Clock;"/>
+ <method name="tick(Ljava/time/Clock;Ljava/time/Duration;)Ljava/time/Clock;"/>
+ <method name="tickMinutes(Ljava/time/ZoneId;)Ljava/time/Clock;"/>
+ <method name="tickSeconds(Ljava/time/ZoneId;)Ljava/time/Clock;"/>
+ <method name="withZone(Ljava/time/ZoneId;)Ljava/time/Clock;"/>
+ </class>
+ <class name="java/time/DateTimeException" since="26">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/time/DayOfWeek" since="26">
+ <extends name="java/lang/Enum"/>
+ <implements name="java/time/temporal/TemporalAccessor"/>
+ <implements name="java/time/temporal/TemporalAdjuster"/>
+ <method name="from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/DayOfWeek;"/>
+ <method name="getDisplayName(Ljava/time/format/TextStyle;Ljava/util/Locale;)Ljava/lang/String;"/>
+ <method name="getValue()I"/>
+ <method name="minus(J)Ljava/time/DayOfWeek;"/>
+ <method name="of(I)Ljava/time/DayOfWeek;"/>
+ <method name="plus(J)Ljava/time/DayOfWeek;"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/time/DayOfWeek;"/>
+ <method name="values()[Ljava/time/DayOfWeek;"/>
+ <field name="FRIDAY"/>
+ <field name="MONDAY"/>
+ <field name="SATURDAY"/>
+ <field name="SUNDAY"/>
+ <field name="THURSDAY"/>
+ <field name="TUESDAY"/>
+ <field name="WEDNESDAY"/>
+ </class>
+ <class name="java/time/Duration" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Comparable"/>
+ <implements name="java/time/temporal/TemporalAmount"/>
+ <method name="&lt;init>()V"/>
+ <method name="abs()Ljava/time/Duration;"/>
+ <method name="between(Ljava/time/temporal/Temporal;Ljava/time/temporal/Temporal;)Ljava/time/Duration;"/>
+ <method name="compareTo(Ljava/time/Duration;)I"/>
+ <method name="dividedBy(J)Ljava/time/Duration;"/>
+ <method name="from(Ljava/time/temporal/TemporalAmount;)Ljava/time/Duration;"/>
+ <method name="getNano()I"/>
+ <method name="getSeconds()J"/>
+ <method name="isNegative()Z"/>
+ <method name="isZero()Z"/>
+ <method name="minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/Duration;"/>
+ <method name="minus(Ljava/time/Duration;)Ljava/time/Duration;"/>
+ <method name="minusDays(J)Ljava/time/Duration;"/>
+ <method name="minusHours(J)Ljava/time/Duration;"/>
+ <method name="minusMillis(J)Ljava/time/Duration;"/>
+ <method name="minusMinutes(J)Ljava/time/Duration;"/>
+ <method name="minusNanos(J)Ljava/time/Duration;"/>
+ <method name="minusSeconds(J)Ljava/time/Duration;"/>
+ <method name="multipliedBy(J)Ljava/time/Duration;"/>
+ <method name="negated()Ljava/time/Duration;"/>
+ <method name="of(JLjava/time/temporal/TemporalUnit;)Ljava/time/Duration;"/>
+ <method name="ofDays(J)Ljava/time/Duration;"/>
+ <method name="ofHours(J)Ljava/time/Duration;"/>
+ <method name="ofMillis(J)Ljava/time/Duration;"/>
+ <method name="ofMinutes(J)Ljava/time/Duration;"/>
+ <method name="ofNanos(J)Ljava/time/Duration;"/>
+ <method name="ofSeconds(J)Ljava/time/Duration;"/>
+ <method name="ofSeconds(JJ)Ljava/time/Duration;"/>
+ <method name="parse(Ljava/lang/CharSequence;)Ljava/time/Duration;"/>
+ <method name="plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/Duration;"/>
+ <method name="plus(Ljava/time/Duration;)Ljava/time/Duration;"/>
+ <method name="plusDays(J)Ljava/time/Duration;"/>
+ <method name="plusHours(J)Ljava/time/Duration;"/>
+ <method name="plusMillis(J)Ljava/time/Duration;"/>
+ <method name="plusMinutes(J)Ljava/time/Duration;"/>
+ <method name="plusNanos(J)Ljava/time/Duration;"/>
+ <method name="plusSeconds(J)Ljava/time/Duration;"/>
+ <method name="toDays()J"/>
+ <method name="toHours()J"/>
+ <method name="toMillis()J"/>
+ <method name="toMinutes()J"/>
+ <method name="toNanos()J"/>
+ <method name="withNanos(I)Ljava/time/Duration;"/>
+ <method name="withSeconds(J)Ljava/time/Duration;"/>
+ <field name="ZERO"/>
+ </class>
+ <class name="java/time/Instant" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Comparable"/>
+ <implements name="java/time/temporal/Temporal"/>
+ <implements name="java/time/temporal/TemporalAdjuster"/>
+ <method name="&lt;init>()V"/>
+ <method name="atOffset(Ljava/time/ZoneOffset;)Ljava/time/OffsetDateTime;"/>
+ <method name="atZone(Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;"/>
+ <method name="compareTo(Ljava/time/Instant;)I"/>
+ <method name="from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/Instant;"/>
+ <method name="getEpochSecond()J"/>
+ <method name="getNano()I"/>
+ <method name="isAfter(Ljava/time/Instant;)Z"/>
+ <method name="isBefore(Ljava/time/Instant;)Z"/>
+ <method name="minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/Instant;"/>
+ <method name="minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/Instant;"/>
+ <method name="minusMillis(J)Ljava/time/Instant;"/>
+ <method name="minusNanos(J)Ljava/time/Instant;"/>
+ <method name="minusSeconds(J)Ljava/time/Instant;"/>
+ <method name="now()Ljava/time/Instant;"/>
+ <method name="now(Ljava/time/Clock;)Ljava/time/Instant;"/>
+ <method name="ofEpochMilli(J)Ljava/time/Instant;"/>
+ <method name="ofEpochSecond(J)Ljava/time/Instant;"/>
+ <method name="ofEpochSecond(JJ)Ljava/time/Instant;"/>
+ <method name="parse(Ljava/lang/CharSequence;)Ljava/time/Instant;"/>
+ <method name="plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/Instant;"/>
+ <method name="plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/Instant;"/>
+ <method name="plusMillis(J)Ljava/time/Instant;"/>
+ <method name="plusNanos(J)Ljava/time/Instant;"/>
+ <method name="plusSeconds(J)Ljava/time/Instant;"/>
+ <method name="toEpochMilli()J"/>
+ <method name="truncatedTo(Ljava/time/temporal/TemporalUnit;)Ljava/time/Instant;"/>
+ <method name="with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/Instant;"/>
+ <method name="with(Ljava/time/temporal/TemporalField;J)Ljava/time/Instant;"/>
+ <field name="EPOCH"/>
+ <field name="MAX"/>
+ <field name="MIN"/>
+ </class>
+ <class name="java/time/LocalDate" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/time/chrono/ChronoLocalDate"/>
+ <implements name="java/time/temporal/Temporal"/>
+ <implements name="java/time/temporal/TemporalAdjuster"/>
+ <method name="&lt;init>()V"/>
+ <method name="atStartOfDay()Ljava/time/LocalDateTime;"/>
+ <method name="atStartOfDay(Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;"/>
+ <method name="atTime(II)Ljava/time/LocalDateTime;"/>
+ <method name="atTime(III)Ljava/time/LocalDateTime;"/>
+ <method name="atTime(IIII)Ljava/time/LocalDateTime;"/>
+ <method name="atTime(Ljava/time/LocalTime;)Ljava/time/LocalDateTime;"/>
+ <method name="atTime(Ljava/time/OffsetTime;)Ljava/time/OffsetDateTime;"/>
+ <method name="from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/LocalDate;"/>
+ <method name="getChronology()Ljava/time/chrono/IsoChronology;"/>
+ <method name="getDayOfMonth()I"/>
+ <method name="getDayOfWeek()Ljava/time/DayOfWeek;"/>
+ <method name="getDayOfYear()I"/>
+ <method name="getMonth()Ljava/time/Month;"/>
+ <method name="getMonthValue()I"/>
+ <method name="getYear()I"/>
+ <method name="minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/LocalDate;"/>
+ <method name="minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/LocalDate;"/>
+ <method name="minusDays(J)Ljava/time/LocalDate;"/>
+ <method name="minusMonths(J)Ljava/time/LocalDate;"/>
+ <method name="minusWeeks(J)Ljava/time/LocalDate;"/>
+ <method name="minusYears(J)Ljava/time/LocalDate;"/>
+ <method name="now()Ljava/time/LocalDate;"/>
+ <method name="now(Ljava/time/Clock;)Ljava/time/LocalDate;"/>
+ <method name="now(Ljava/time/ZoneId;)Ljava/time/LocalDate;"/>
+ <method name="of(III)Ljava/time/LocalDate;"/>
+ <method name="of(ILjava/time/Month;I)Ljava/time/LocalDate;"/>
+ <method name="ofEpochDay(J)Ljava/time/LocalDate;"/>
+ <method name="ofYearDay(II)Ljava/time/LocalDate;"/>
+ <method name="parse(Ljava/lang/CharSequence;)Ljava/time/LocalDate;"/>
+ <method name="parse(Ljava/lang/CharSequence;Ljava/time/format/DateTimeFormatter;)Ljava/time/LocalDate;"/>
+ <method name="plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/LocalDate;"/>
+ <method name="plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/LocalDate;"/>
+ <method name="plusDays(J)Ljava/time/LocalDate;"/>
+ <method name="plusMonths(J)Ljava/time/LocalDate;"/>
+ <method name="plusWeeks(J)Ljava/time/LocalDate;"/>
+ <method name="plusYears(J)Ljava/time/LocalDate;"/>
+ <method name="until(Ljava/time/chrono/ChronoLocalDate;)Ljava/time/Period;"/>
+ <method name="with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/LocalDate;"/>
+ <method name="with(Ljava/time/temporal/TemporalField;J)Ljava/time/LocalDate;"/>
+ <method name="withDayOfMonth(I)Ljava/time/LocalDate;"/>
+ <method name="withDayOfYear(I)Ljava/time/LocalDate;"/>
+ <method name="withMonth(I)Ljava/time/LocalDate;"/>
+ <method name="withYear(I)Ljava/time/LocalDate;"/>
+ <field name="MAX"/>
+ <field name="MIN"/>
+ </class>
+ <class name="java/time/LocalDateTime" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/time/chrono/ChronoLocalDateTime"/>
+ <implements name="java/time/temporal/Temporal"/>
+ <implements name="java/time/temporal/TemporalAdjuster"/>
+ <method name="&lt;init>()V"/>
+ <method name="atOffset(Ljava/time/ZoneOffset;)Ljava/time/OffsetDateTime;"/>
+ <method name="atZone(Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;"/>
+ <method name="from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/LocalDateTime;"/>
+ <method name="getDayOfMonth()I"/>
+ <method name="getDayOfWeek()Ljava/time/DayOfWeek;"/>
+ <method name="getDayOfYear()I"/>
+ <method name="getHour()I"/>
+ <method name="getMinute()I"/>
+ <method name="getMonth()Ljava/time/Month;"/>
+ <method name="getMonthValue()I"/>
+ <method name="getNano()I"/>
+ <method name="getSecond()I"/>
+ <method name="getYear()I"/>
+ <method name="minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/LocalDateTime;"/>
+ <method name="minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/LocalDateTime;"/>
+ <method name="minusDays(J)Ljava/time/LocalDateTime;"/>
+ <method name="minusHours(J)Ljava/time/LocalDateTime;"/>
+ <method name="minusMinutes(J)Ljava/time/LocalDateTime;"/>
+ <method name="minusMonths(J)Ljava/time/LocalDateTime;"/>
+ <method name="minusNanos(J)Ljava/time/LocalDateTime;"/>
+ <method name="minusSeconds(J)Ljava/time/LocalDateTime;"/>
+ <method name="minusWeeks(J)Ljava/time/LocalDateTime;"/>
+ <method name="minusYears(J)Ljava/time/LocalDateTime;"/>
+ <method name="now()Ljava/time/LocalDateTime;"/>
+ <method name="now(Ljava/time/Clock;)Ljava/time/LocalDateTime;"/>
+ <method name="now(Ljava/time/ZoneId;)Ljava/time/LocalDateTime;"/>
+ <method name="of(IIIII)Ljava/time/LocalDateTime;"/>
+ <method name="of(IIIIII)Ljava/time/LocalDateTime;"/>
+ <method name="of(IIIIIII)Ljava/time/LocalDateTime;"/>
+ <method name="of(ILjava/time/Month;III)Ljava/time/LocalDateTime;"/>
+ <method name="of(ILjava/time/Month;IIII)Ljava/time/LocalDateTime;"/>
+ <method name="of(ILjava/time/Month;IIIII)Ljava/time/LocalDateTime;"/>
+ <method name="of(Ljava/time/LocalDate;Ljava/time/LocalTime;)Ljava/time/LocalDateTime;"/>
+ <method name="ofEpochSecond(JILjava/time/ZoneOffset;)Ljava/time/LocalDateTime;"/>
+ <method name="ofInstant(Ljava/time/Instant;Ljava/time/ZoneId;)Ljava/time/LocalDateTime;"/>
+ <method name="parse(Ljava/lang/CharSequence;)Ljava/time/LocalDateTime;"/>
+ <method name="parse(Ljava/lang/CharSequence;Ljava/time/format/DateTimeFormatter;)Ljava/time/LocalDateTime;"/>
+ <method name="plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/LocalDateTime;"/>
+ <method name="plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/LocalDateTime;"/>
+ <method name="plusDays(J)Ljava/time/LocalDateTime;"/>
+ <method name="plusHours(J)Ljava/time/LocalDateTime;"/>
+ <method name="plusMinutes(J)Ljava/time/LocalDateTime;"/>
+ <method name="plusMonths(J)Ljava/time/LocalDateTime;"/>
+ <method name="plusNanos(J)Ljava/time/LocalDateTime;"/>
+ <method name="plusSeconds(J)Ljava/time/LocalDateTime;"/>
+ <method name="plusWeeks(J)Ljava/time/LocalDateTime;"/>
+ <method name="plusYears(J)Ljava/time/LocalDateTime;"/>
+ <method name="toLocalDate()Ljava/time/LocalDate;"/>
+ <method name="truncatedTo(Ljava/time/temporal/TemporalUnit;)Ljava/time/LocalDateTime;"/>
+ <method name="with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/LocalDateTime;"/>
+ <method name="with(Ljava/time/temporal/TemporalField;J)Ljava/time/LocalDateTime;"/>
+ <method name="withDayOfMonth(I)Ljava/time/LocalDateTime;"/>
+ <method name="withDayOfYear(I)Ljava/time/LocalDateTime;"/>
+ <method name="withHour(I)Ljava/time/LocalDateTime;"/>
+ <method name="withMinute(I)Ljava/time/LocalDateTime;"/>
+ <method name="withMonth(I)Ljava/time/LocalDateTime;"/>
+ <method name="withNano(I)Ljava/time/LocalDateTime;"/>
+ <method name="withSecond(I)Ljava/time/LocalDateTime;"/>
+ <method name="withYear(I)Ljava/time/LocalDateTime;"/>
+ <field name="MAX"/>
+ <field name="MIN"/>
+ </class>
+ <class name="java/time/LocalTime" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Comparable"/>
+ <implements name="java/time/temporal/Temporal"/>
+ <implements name="java/time/temporal/TemporalAdjuster"/>
+ <method name="&lt;init>()V"/>
+ <method name="atDate(Ljava/time/LocalDate;)Ljava/time/LocalDateTime;"/>
+ <method name="atOffset(Ljava/time/ZoneOffset;)Ljava/time/OffsetTime;"/>
+ <method name="compareTo(Ljava/time/LocalTime;)I"/>
+ <method name="format(Ljava/time/format/DateTimeFormatter;)Ljava/lang/String;"/>
+ <method name="from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/LocalTime;"/>
+ <method name="getHour()I"/>
+ <method name="getMinute()I"/>
+ <method name="getNano()I"/>
+ <method name="getSecond()I"/>
+ <method name="isAfter(Ljava/time/LocalTime;)Z"/>
+ <method name="isBefore(Ljava/time/LocalTime;)Z"/>
+ <method name="minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/LocalTime;"/>
+ <method name="minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/LocalTime;"/>
+ <method name="minusHours(J)Ljava/time/LocalTime;"/>
+ <method name="minusMinutes(J)Ljava/time/LocalTime;"/>
+ <method name="minusNanos(J)Ljava/time/LocalTime;"/>
+ <method name="minusSeconds(J)Ljava/time/LocalTime;"/>
+ <method name="now()Ljava/time/LocalTime;"/>
+ <method name="now(Ljava/time/Clock;)Ljava/time/LocalTime;"/>
+ <method name="now(Ljava/time/ZoneId;)Ljava/time/LocalTime;"/>
+ <method name="of(II)Ljava/time/LocalTime;"/>
+ <method name="of(III)Ljava/time/LocalTime;"/>
+ <method name="of(IIII)Ljava/time/LocalTime;"/>
+ <method name="ofNanoOfDay(J)Ljava/time/LocalTime;"/>
+ <method name="ofSecondOfDay(J)Ljava/time/LocalTime;"/>
+ <method name="parse(Ljava/lang/CharSequence;)Ljava/time/LocalTime;"/>
+ <method name="parse(Ljava/lang/CharSequence;Ljava/time/format/DateTimeFormatter;)Ljava/time/LocalTime;"/>
+ <method name="plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/LocalTime;"/>
+ <method name="plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/LocalTime;"/>
+ <method name="plusHours(J)Ljava/time/LocalTime;"/>
+ <method name="plusMinutes(J)Ljava/time/LocalTime;"/>
+ <method name="plusNanos(J)Ljava/time/LocalTime;"/>
+ <method name="plusSeconds(J)Ljava/time/LocalTime;"/>
+ <method name="toNanoOfDay()J"/>
+ <method name="toSecondOfDay()I"/>
+ <method name="truncatedTo(Ljava/time/temporal/TemporalUnit;)Ljava/time/LocalTime;"/>
+ <method name="with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/LocalTime;"/>
+ <method name="with(Ljava/time/temporal/TemporalField;J)Ljava/time/LocalTime;"/>
+ <method name="withHour(I)Ljava/time/LocalTime;"/>
+ <method name="withMinute(I)Ljava/time/LocalTime;"/>
+ <method name="withNano(I)Ljava/time/LocalTime;"/>
+ <method name="withSecond(I)Ljava/time/LocalTime;"/>
+ <field name="MAX"/>
+ <field name="MIDNIGHT"/>
+ <field name="MIN"/>
+ <field name="NOON"/>
+ </class>
+ <class name="java/time/Month" since="26">
+ <extends name="java/lang/Enum"/>
+ <implements name="java/time/temporal/TemporalAccessor"/>
+ <implements name="java/time/temporal/TemporalAdjuster"/>
+ <method name="firstDayOfYear(Z)I"/>
+ <method name="firstMonthOfQuarter()Ljava/time/Month;"/>
+ <method name="from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/Month;"/>
+ <method name="getDisplayName(Ljava/time/format/TextStyle;Ljava/util/Locale;)Ljava/lang/String;"/>
+ <method name="getValue()I"/>
+ <method name="length(Z)I"/>
+ <method name="maxLength()I"/>
+ <method name="minLength()I"/>
+ <method name="minus(J)Ljava/time/Month;"/>
+ <method name="of(I)Ljava/time/Month;"/>
+ <method name="plus(J)Ljava/time/Month;"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/time/Month;"/>
+ <method name="values()[Ljava/time/Month;"/>
+ <field name="APRIL"/>
+ <field name="AUGUST"/>
+ <field name="DECEMBER"/>
+ <field name="FEBRUARY"/>
+ <field name="JANUARY"/>
+ <field name="JULY"/>
+ <field name="JUNE"/>
+ <field name="MARCH"/>
+ <field name="MAY"/>
+ <field name="NOVEMBER"/>
+ <field name="OCTOBER"/>
+ <field name="SEPTEMBER"/>
+ </class>
+ <class name="java/time/MonthDay" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Comparable"/>
+ <implements name="java/time/temporal/TemporalAccessor"/>
+ <implements name="java/time/temporal/TemporalAdjuster"/>
+ <method name="&lt;init>()V"/>
+ <method name="atYear(I)Ljava/time/LocalDate;"/>
+ <method name="compareTo(Ljava/time/MonthDay;)I"/>
+ <method name="format(Ljava/time/format/DateTimeFormatter;)Ljava/lang/String;"/>
+ <method name="from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/MonthDay;"/>
+ <method name="getDayOfMonth()I"/>
+ <method name="getMonth()Ljava/time/Month;"/>
+ <method name="getMonthValue()I"/>
+ <method name="isAfter(Ljava/time/MonthDay;)Z"/>
+ <method name="isBefore(Ljava/time/MonthDay;)Z"/>
+ <method name="isValidYear(I)Z"/>
+ <method name="now()Ljava/time/MonthDay;"/>
+ <method name="now(Ljava/time/Clock;)Ljava/time/MonthDay;"/>
+ <method name="now(Ljava/time/ZoneId;)Ljava/time/MonthDay;"/>
+ <method name="of(II)Ljava/time/MonthDay;"/>
+ <method name="of(Ljava/time/Month;I)Ljava/time/MonthDay;"/>
+ <method name="parse(Ljava/lang/CharSequence;)Ljava/time/MonthDay;"/>
+ <method name="parse(Ljava/lang/CharSequence;Ljava/time/format/DateTimeFormatter;)Ljava/time/MonthDay;"/>
+ <method name="with(Ljava/time/Month;)Ljava/time/MonthDay;"/>
+ <method name="withDayOfMonth(I)Ljava/time/MonthDay;"/>
+ <method name="withMonth(I)Ljava/time/MonthDay;"/>
+ </class>
+ <class name="java/time/OffsetDateTime" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Comparable"/>
+ <implements name="java/time/temporal/Temporal"/>
+ <implements name="java/time/temporal/TemporalAdjuster"/>
+ <method name="&lt;init>()V"/>
+ <method name="atZoneSameInstant(Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;"/>
+ <method name="atZoneSimilarLocal(Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;"/>
+ <method name="compareTo(Ljava/time/OffsetDateTime;)I"/>
+ <method name="format(Ljava/time/format/DateTimeFormatter;)Ljava/lang/String;"/>
+ <method name="from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/OffsetDateTime;"/>
+ <method name="getDayOfMonth()I"/>
+ <method name="getDayOfWeek()Ljava/time/DayOfWeek;"/>
+ <method name="getDayOfYear()I"/>
+ <method name="getHour()I"/>
+ <method name="getMinute()I"/>
+ <method name="getMonth()Ljava/time/Month;"/>
+ <method name="getMonthValue()I"/>
+ <method name="getNano()I"/>
+ <method name="getOffset()Ljava/time/ZoneOffset;"/>
+ <method name="getSecond()I"/>
+ <method name="getYear()I"/>
+ <method name="isAfter(Ljava/time/OffsetDateTime;)Z"/>
+ <method name="isBefore(Ljava/time/OffsetDateTime;)Z"/>
+ <method name="isEqual(Ljava/time/OffsetDateTime;)Z"/>
+ <method name="minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/OffsetDateTime;"/>
+ <method name="minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/OffsetDateTime;"/>
+ <method name="minusDays(J)Ljava/time/OffsetDateTime;"/>
+ <method name="minusHours(J)Ljava/time/OffsetDateTime;"/>
+ <method name="minusMinutes(J)Ljava/time/OffsetDateTime;"/>
+ <method name="minusMonths(J)Ljava/time/OffsetDateTime;"/>
+ <method name="minusNanos(J)Ljava/time/OffsetDateTime;"/>
+ <method name="minusSeconds(J)Ljava/time/OffsetDateTime;"/>
+ <method name="minusWeeks(J)Ljava/time/OffsetDateTime;"/>
+ <method name="minusYears(J)Ljava/time/OffsetDateTime;"/>
+ <method name="now()Ljava/time/OffsetDateTime;"/>
+ <method name="now(Ljava/time/Clock;)Ljava/time/OffsetDateTime;"/>
+ <method name="now(Ljava/time/ZoneId;)Ljava/time/OffsetDateTime;"/>
+ <method name="of(IIIIIIILjava/time/ZoneOffset;)Ljava/time/OffsetDateTime;"/>
+ <method name="of(Ljava/time/LocalDate;Ljava/time/LocalTime;Ljava/time/ZoneOffset;)Ljava/time/OffsetDateTime;"/>
+ <method name="of(Ljava/time/LocalDateTime;Ljava/time/ZoneOffset;)Ljava/time/OffsetDateTime;"/>
+ <method name="ofInstant(Ljava/time/Instant;Ljava/time/ZoneId;)Ljava/time/OffsetDateTime;"/>
+ <method name="parse(Ljava/lang/CharSequence;)Ljava/time/OffsetDateTime;"/>
+ <method name="parse(Ljava/lang/CharSequence;Ljava/time/format/DateTimeFormatter;)Ljava/time/OffsetDateTime;"/>
+ <method name="plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/OffsetDateTime;"/>
+ <method name="plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/OffsetDateTime;"/>
+ <method name="plusDays(J)Ljava/time/OffsetDateTime;"/>
+ <method name="plusHours(J)Ljava/time/OffsetDateTime;"/>
+ <method name="plusMinutes(J)Ljava/time/OffsetDateTime;"/>
+ <method name="plusMonths(J)Ljava/time/OffsetDateTime;"/>
+ <method name="plusNanos(J)Ljava/time/OffsetDateTime;"/>
+ <method name="plusSeconds(J)Ljava/time/OffsetDateTime;"/>
+ <method name="plusWeeks(J)Ljava/time/OffsetDateTime;"/>
+ <method name="plusYears(J)Ljava/time/OffsetDateTime;"/>
+ <method name="timeLineOrder()Ljava/util/Comparator;"/>
+ <method name="toEpochSecond()J"/>
+ <method name="toInstant()Ljava/time/Instant;"/>
+ <method name="toLocalDate()Ljava/time/LocalDate;"/>
+ <method name="toLocalDateTime()Ljava/time/LocalDateTime;"/>
+ <method name="toLocalTime()Ljava/time/LocalTime;"/>
+ <method name="toOffsetTime()Ljava/time/OffsetTime;"/>
+ <method name="toZonedDateTime()Ljava/time/ZonedDateTime;"/>
+ <method name="truncatedTo(Ljava/time/temporal/TemporalUnit;)Ljava/time/OffsetDateTime;"/>
+ <method name="with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/OffsetDateTime;"/>
+ <method name="with(Ljava/time/temporal/TemporalField;J)Ljava/time/OffsetDateTime;"/>
+ <method name="withDayOfMonth(I)Ljava/time/OffsetDateTime;"/>
+ <method name="withDayOfYear(I)Ljava/time/OffsetDateTime;"/>
+ <method name="withHour(I)Ljava/time/OffsetDateTime;"/>
+ <method name="withMinute(I)Ljava/time/OffsetDateTime;"/>
+ <method name="withMonth(I)Ljava/time/OffsetDateTime;"/>
+ <method name="withNano(I)Ljava/time/OffsetDateTime;"/>
+ <method name="withOffsetSameInstant(Ljava/time/ZoneOffset;)Ljava/time/OffsetDateTime;"/>
+ <method name="withOffsetSameLocal(Ljava/time/ZoneOffset;)Ljava/time/OffsetDateTime;"/>
+ <method name="withSecond(I)Ljava/time/OffsetDateTime;"/>
+ <method name="withYear(I)Ljava/time/OffsetDateTime;"/>
+ <field name="MAX"/>
+ <field name="MIN"/>
+ </class>
+ <class name="java/time/OffsetTime" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Comparable"/>
+ <implements name="java/time/temporal/Temporal"/>
+ <implements name="java/time/temporal/TemporalAdjuster"/>
+ <method name="&lt;init>()V"/>
+ <method name="atDate(Ljava/time/LocalDate;)Ljava/time/OffsetDateTime;"/>
+ <method name="compareTo(Ljava/time/OffsetTime;)I"/>
+ <method name="format(Ljava/time/format/DateTimeFormatter;)Ljava/lang/String;"/>
+ <method name="from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/OffsetTime;"/>
+ <method name="getHour()I"/>
+ <method name="getMinute()I"/>
+ <method name="getNano()I"/>
+ <method name="getOffset()Ljava/time/ZoneOffset;"/>
+ <method name="getSecond()I"/>
+ <method name="isAfter(Ljava/time/OffsetTime;)Z"/>
+ <method name="isBefore(Ljava/time/OffsetTime;)Z"/>
+ <method name="isEqual(Ljava/time/OffsetTime;)Z"/>
+ <method name="minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/OffsetTime;"/>
+ <method name="minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/OffsetTime;"/>
+ <method name="minusHours(J)Ljava/time/OffsetTime;"/>
+ <method name="minusMinutes(J)Ljava/time/OffsetTime;"/>
+ <method name="minusNanos(J)Ljava/time/OffsetTime;"/>
+ <method name="minusSeconds(J)Ljava/time/OffsetTime;"/>
+ <method name="now()Ljava/time/OffsetTime;"/>
+ <method name="now(Ljava/time/Clock;)Ljava/time/OffsetTime;"/>
+ <method name="now(Ljava/time/ZoneId;)Ljava/time/OffsetTime;"/>
+ <method name="of(IIIILjava/time/ZoneOffset;)Ljava/time/OffsetTime;"/>
+ <method name="of(Ljava/time/LocalTime;Ljava/time/ZoneOffset;)Ljava/time/OffsetTime;"/>
+ <method name="ofInstant(Ljava/time/Instant;Ljava/time/ZoneId;)Ljava/time/OffsetTime;"/>
+ <method name="parse(Ljava/lang/CharSequence;)Ljava/time/OffsetTime;"/>
+ <method name="parse(Ljava/lang/CharSequence;Ljava/time/format/DateTimeFormatter;)Ljava/time/OffsetTime;"/>
+ <method name="plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/OffsetTime;"/>
+ <method name="plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/OffsetTime;"/>
+ <method name="plusHours(J)Ljava/time/OffsetTime;"/>
+ <method name="plusMinutes(J)Ljava/time/OffsetTime;"/>
+ <method name="plusNanos(J)Ljava/time/OffsetTime;"/>
+ <method name="plusSeconds(J)Ljava/time/OffsetTime;"/>
+ <method name="toLocalTime()Ljava/time/LocalTime;"/>
+ <method name="truncatedTo(Ljava/time/temporal/TemporalUnit;)Ljava/time/OffsetTime;"/>
+ <method name="with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/OffsetTime;"/>
+ <method name="with(Ljava/time/temporal/TemporalField;J)Ljava/time/OffsetTime;"/>
+ <method name="withHour(I)Ljava/time/OffsetTime;"/>
+ <method name="withMinute(I)Ljava/time/OffsetTime;"/>
+ <method name="withNano(I)Ljava/time/OffsetTime;"/>
+ <method name="withOffsetSameInstant(Ljava/time/ZoneOffset;)Ljava/time/OffsetTime;"/>
+ <method name="withOffsetSameLocal(Ljava/time/ZoneOffset;)Ljava/time/OffsetTime;"/>
+ <method name="withSecond(I)Ljava/time/OffsetTime;"/>
+ <field name="MAX"/>
+ <field name="MIN"/>
+ </class>
+ <class name="java/time/Period" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/time/chrono/ChronoPeriod"/>
+ <method name="&lt;init>()V"/>
+ <method name="between(Ljava/time/LocalDate;Ljava/time/LocalDate;)Ljava/time/Period;"/>
+ <method name="from(Ljava/time/temporal/TemporalAmount;)Ljava/time/Period;"/>
+ <method name="getChronology()Ljava/time/chrono/IsoChronology;"/>
+ <method name="getDays()I"/>
+ <method name="getMonths()I"/>
+ <method name="getYears()I"/>
+ <method name="minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/Period;"/>
+ <method name="minusDays(J)Ljava/time/Period;"/>
+ <method name="minusMonths(J)Ljava/time/Period;"/>
+ <method name="minusYears(J)Ljava/time/Period;"/>
+ <method name="multipliedBy(I)Ljava/time/Period;"/>
+ <method name="negated()Ljava/time/Period;"/>
+ <method name="normalized()Ljava/time/Period;"/>
+ <method name="of(III)Ljava/time/Period;"/>
+ <method name="ofDays(I)Ljava/time/Period;"/>
+ <method name="ofMonths(I)Ljava/time/Period;"/>
+ <method name="ofWeeks(I)Ljava/time/Period;"/>
+ <method name="ofYears(I)Ljava/time/Period;"/>
+ <method name="parse(Ljava/lang/CharSequence;)Ljava/time/Period;"/>
+ <method name="plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/Period;"/>
+ <method name="plusDays(J)Ljava/time/Period;"/>
+ <method name="plusMonths(J)Ljava/time/Period;"/>
+ <method name="plusYears(J)Ljava/time/Period;"/>
+ <method name="toTotalMonths()J"/>
+ <method name="withDays(I)Ljava/time/Period;"/>
+ <method name="withMonths(I)Ljava/time/Period;"/>
+ <method name="withYears(I)Ljava/time/Period;"/>
+ <field name="ZERO"/>
+ </class>
+ <class name="java/time/Year" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Comparable"/>
+ <implements name="java/time/temporal/Temporal"/>
+ <implements name="java/time/temporal/TemporalAdjuster"/>
+ <method name="&lt;init>()V"/>
+ <method name="atDay(I)Ljava/time/LocalDate;"/>
+ <method name="atMonth(I)Ljava/time/YearMonth;"/>
+ <method name="atMonth(Ljava/time/Month;)Ljava/time/YearMonth;"/>
+ <method name="atMonthDay(Ljava/time/MonthDay;)Ljava/time/LocalDate;"/>
+ <method name="compareTo(Ljava/time/Year;)I"/>
+ <method name="format(Ljava/time/format/DateTimeFormatter;)Ljava/lang/String;"/>
+ <method name="from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/Year;"/>
+ <method name="getValue()I"/>
+ <method name="isAfter(Ljava/time/Year;)Z"/>
+ <method name="isBefore(Ljava/time/Year;)Z"/>
+ <method name="isLeap()Z"/>
+ <method name="isLeap(J)Z"/>
+ <method name="isValidMonthDay(Ljava/time/MonthDay;)Z"/>
+ <method name="length()I"/>
+ <method name="minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/Year;"/>
+ <method name="minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/Year;"/>
+ <method name="minusYears(J)Ljava/time/Year;"/>
+ <method name="now()Ljava/time/Year;"/>
+ <method name="now(Ljava/time/Clock;)Ljava/time/Year;"/>
+ <method name="now(Ljava/time/ZoneId;)Ljava/time/Year;"/>
+ <method name="of(I)Ljava/time/Year;"/>
+ <method name="parse(Ljava/lang/CharSequence;)Ljava/time/Year;"/>
+ <method name="parse(Ljava/lang/CharSequence;Ljava/time/format/DateTimeFormatter;)Ljava/time/Year;"/>
+ <method name="plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/Year;"/>
+ <method name="plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/Year;"/>
+ <method name="plusYears(J)Ljava/time/Year;"/>
+ <method name="with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/Year;"/>
+ <method name="with(Ljava/time/temporal/TemporalField;J)Ljava/time/Year;"/>
+ <field name="MAX_VALUE"/>
+ <field name="MIN_VALUE"/>
+ </class>
+ <class name="java/time/YearMonth" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Comparable"/>
+ <implements name="java/time/temporal/Temporal"/>
+ <implements name="java/time/temporal/TemporalAdjuster"/>
+ <method name="&lt;init>()V"/>
+ <method name="atDay(I)Ljava/time/LocalDate;"/>
+ <method name="atEndOfMonth()Ljava/time/LocalDate;"/>
+ <method name="compareTo(Ljava/time/YearMonth;)I"/>
+ <method name="format(Ljava/time/format/DateTimeFormatter;)Ljava/lang/String;"/>
+ <method name="from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/YearMonth;"/>
+ <method name="getMonth()Ljava/time/Month;"/>
+ <method name="getMonthValue()I"/>
+ <method name="getYear()I"/>
+ <method name="isAfter(Ljava/time/YearMonth;)Z"/>
+ <method name="isBefore(Ljava/time/YearMonth;)Z"/>
+ <method name="isLeapYear()Z"/>
+ <method name="isValidDay(I)Z"/>
+ <method name="lengthOfMonth()I"/>
+ <method name="lengthOfYear()I"/>
+ <method name="minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/YearMonth;"/>
+ <method name="minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/YearMonth;"/>
+ <method name="minusMonths(J)Ljava/time/YearMonth;"/>
+ <method name="minusYears(J)Ljava/time/YearMonth;"/>
+ <method name="now()Ljava/time/YearMonth;"/>
+ <method name="now(Ljava/time/Clock;)Ljava/time/YearMonth;"/>
+ <method name="now(Ljava/time/ZoneId;)Ljava/time/YearMonth;"/>
+ <method name="of(II)Ljava/time/YearMonth;"/>
+ <method name="of(ILjava/time/Month;)Ljava/time/YearMonth;"/>
+ <method name="parse(Ljava/lang/CharSequence;)Ljava/time/YearMonth;"/>
+ <method name="parse(Ljava/lang/CharSequence;Ljava/time/format/DateTimeFormatter;)Ljava/time/YearMonth;"/>
+ <method name="plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/YearMonth;"/>
+ <method name="plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/YearMonth;"/>
+ <method name="plusMonths(J)Ljava/time/YearMonth;"/>
+ <method name="plusYears(J)Ljava/time/YearMonth;"/>
+ <method name="with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/YearMonth;"/>
+ <method name="with(Ljava/time/temporal/TemporalField;J)Ljava/time/YearMonth;"/>
+ <method name="withMonth(I)Ljava/time/YearMonth;"/>
+ <method name="withYear(I)Ljava/time/YearMonth;"/>
+ </class>
+ <class name="java/time/ZoneId" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/ZoneId;"/>
+ <method name="getAvailableZoneIds()Ljava/util/Set;"/>
+ <method name="getDisplayName(Ljava/time/format/TextStyle;Ljava/util/Locale;)Ljava/lang/String;"/>
+ <method name="getId()Ljava/lang/String;"/>
+ <method name="getRules()Ljava/time/zone/ZoneRules;"/>
+ <method name="normalized()Ljava/time/ZoneId;"/>
+ <method name="of(Ljava/lang/String;)Ljava/time/ZoneId;"/>
+ <method name="of(Ljava/lang/String;Ljava/util/Map;)Ljava/time/ZoneId;"/>
+ <method name="ofOffset(Ljava/lang/String;Ljava/time/ZoneOffset;)Ljava/time/ZoneId;"/>
+ <method name="systemDefault()Ljava/time/ZoneId;"/>
+ <field name="SHORT_IDS"/>
+ </class>
+ <class name="java/time/ZoneOffset" since="26">
+ <extends name="java/time/ZoneId"/>
+ <implements name="java/lang/Comparable"/>
+ <implements name="java/time/temporal/TemporalAccessor"/>
+ <implements name="java/time/temporal/TemporalAdjuster"/>
+ <method name="&lt;init>()V"/>
+ <method name="compareTo(Ljava/time/ZoneOffset;)I"/>
+ <method name="from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/ZoneOffset;"/>
+ <method name="getTotalSeconds()I"/>
+ <method name="of(Ljava/lang/String;)Ljava/time/ZoneOffset;"/>
+ <method name="ofHours(I)Ljava/time/ZoneOffset;"/>
+ <method name="ofHoursMinutes(II)Ljava/time/ZoneOffset;"/>
+ <method name="ofHoursMinutesSeconds(III)Ljava/time/ZoneOffset;"/>
+ <method name="ofTotalSeconds(I)Ljava/time/ZoneOffset;"/>
+ <field name="MAX"/>
+ <field name="MIN"/>
+ <field name="UTC"/>
+ </class>
+ <class name="java/time/ZonedDateTime" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/time/chrono/ChronoZonedDateTime"/>
+ <implements name="java/time/temporal/Temporal"/>
+ <method name="&lt;init>()V"/>
+ <method name="from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/ZonedDateTime;"/>
+ <method name="getDayOfMonth()I"/>
+ <method name="getDayOfWeek()Ljava/time/DayOfWeek;"/>
+ <method name="getDayOfYear()I"/>
+ <method name="getHour()I"/>
+ <method name="getMinute()I"/>
+ <method name="getMonth()Ljava/time/Month;"/>
+ <method name="getMonthValue()I"/>
+ <method name="getNano()I"/>
+ <method name="getSecond()I"/>
+ <method name="getYear()I"/>
+ <method name="minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/ZonedDateTime;"/>
+ <method name="minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/ZonedDateTime;"/>
+ <method name="minusDays(J)Ljava/time/ZonedDateTime;"/>
+ <method name="minusHours(J)Ljava/time/ZonedDateTime;"/>
+ <method name="minusMinutes(J)Ljava/time/ZonedDateTime;"/>
+ <method name="minusMonths(J)Ljava/time/ZonedDateTime;"/>
+ <method name="minusNanos(J)Ljava/time/ZonedDateTime;"/>
+ <method name="minusSeconds(J)Ljava/time/ZonedDateTime;"/>
+ <method name="minusWeeks(J)Ljava/time/ZonedDateTime;"/>
+ <method name="minusYears(J)Ljava/time/ZonedDateTime;"/>
+ <method name="now()Ljava/time/ZonedDateTime;"/>
+ <method name="now(Ljava/time/Clock;)Ljava/time/ZonedDateTime;"/>
+ <method name="now(Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;"/>
+ <method name="of(IIIIIIILjava/time/ZoneId;)Ljava/time/ZonedDateTime;"/>
+ <method name="of(Ljava/time/LocalDate;Ljava/time/LocalTime;Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;"/>
+ <method name="of(Ljava/time/LocalDateTime;Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;"/>
+ <method name="ofInstant(Ljava/time/Instant;Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;"/>
+ <method name="ofInstant(Ljava/time/LocalDateTime;Ljava/time/ZoneOffset;Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;"/>
+ <method name="ofLocal(Ljava/time/LocalDateTime;Ljava/time/ZoneId;Ljava/time/ZoneOffset;)Ljava/time/ZonedDateTime;"/>
+ <method name="ofStrict(Ljava/time/LocalDateTime;Ljava/time/ZoneOffset;Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;"/>
+ <method name="parse(Ljava/lang/CharSequence;)Ljava/time/ZonedDateTime;"/>
+ <method name="parse(Ljava/lang/CharSequence;Ljava/time/format/DateTimeFormatter;)Ljava/time/ZonedDateTime;"/>
+ <method name="plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/ZonedDateTime;"/>
+ <method name="plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/ZonedDateTime;"/>
+ <method name="plusDays(J)Ljava/time/ZonedDateTime;"/>
+ <method name="plusHours(J)Ljava/time/ZonedDateTime;"/>
+ <method name="plusMinutes(J)Ljava/time/ZonedDateTime;"/>
+ <method name="plusMonths(J)Ljava/time/ZonedDateTime;"/>
+ <method name="plusNanos(J)Ljava/time/ZonedDateTime;"/>
+ <method name="plusSeconds(J)Ljava/time/ZonedDateTime;"/>
+ <method name="plusWeeks(J)Ljava/time/ZonedDateTime;"/>
+ <method name="plusYears(J)Ljava/time/ZonedDateTime;"/>
+ <method name="toLocalDate()Ljava/time/LocalDate;"/>
+ <method name="toLocalDateTime()Ljava/time/LocalDateTime;"/>
+ <method name="toOffsetDateTime()Ljava/time/OffsetDateTime;"/>
+ <method name="truncatedTo(Ljava/time/temporal/TemporalUnit;)Ljava/time/ZonedDateTime;"/>
+ <method name="with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/ZonedDateTime;"/>
+ <method name="with(Ljava/time/temporal/TemporalField;J)Ljava/time/ZonedDateTime;"/>
+ <method name="withDayOfMonth(I)Ljava/time/ZonedDateTime;"/>
+ <method name="withDayOfYear(I)Ljava/time/ZonedDateTime;"/>
+ <method name="withEarlierOffsetAtOverlap()Ljava/time/ZonedDateTime;"/>
+ <method name="withFixedOffsetZone()Ljava/time/ZonedDateTime;"/>
+ <method name="withHour(I)Ljava/time/ZonedDateTime;"/>
+ <method name="withLaterOffsetAtOverlap()Ljava/time/ZonedDateTime;"/>
+ <method name="withMinute(I)Ljava/time/ZonedDateTime;"/>
+ <method name="withMonth(I)Ljava/time/ZonedDateTime;"/>
+ <method name="withNano(I)Ljava/time/ZonedDateTime;"/>
+ <method name="withSecond(I)Ljava/time/ZonedDateTime;"/>
+ <method name="withYear(I)Ljava/time/ZonedDateTime;"/>
+ <method name="withZoneSameInstant(Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;"/>
+ <method name="withZoneSameLocal(Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;"/>
+ </class>
+ <class name="java/time/chrono/AbstractChronology" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/time/chrono/Chronology"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/time/chrono/ChronoLocalDate" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Comparable"/>
+ <implements name="java/time/temporal/Temporal"/>
+ <implements name="java/time/temporal/TemporalAdjuster"/>
+ <method name="atTime(Ljava/time/LocalTime;)Ljava/time/chrono/ChronoLocalDateTime;"/>
+ <method name="compareTo(Ljava/time/chrono/ChronoLocalDate;)I"/>
+ <method name="format(Ljava/time/format/DateTimeFormatter;)Ljava/lang/String;"/>
+ <method name="from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/ChronoLocalDate;"/>
+ <method name="getChronology()Ljava/time/chrono/Chronology;"/>
+ <method name="getEra()Ljava/time/chrono/Era;"/>
+ <method name="isAfter(Ljava/time/chrono/ChronoLocalDate;)Z"/>
+ <method name="isBefore(Ljava/time/chrono/ChronoLocalDate;)Z"/>
+ <method name="isEqual(Ljava/time/chrono/ChronoLocalDate;)Z"/>
+ <method name="isLeapYear()Z"/>
+ <method name="lengthOfMonth()I"/>
+ <method name="lengthOfYear()I"/>
+ <method name="minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/ChronoLocalDate;"/>
+ <method name="minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/ChronoLocalDate;"/>
+ <method name="plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/ChronoLocalDate;"/>
+ <method name="plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/ChronoLocalDate;"/>
+ <method name="timeLineOrder()Ljava/util/Comparator;"/>
+ <method name="toEpochDay()J"/>
+ <method name="until(Ljava/time/chrono/ChronoLocalDate;)Ljava/time/chrono/ChronoPeriod;"/>
+ <method name="with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/chrono/ChronoLocalDate;"/>
+ <method name="with(Ljava/time/temporal/TemporalField;J)Ljava/time/chrono/ChronoLocalDate;"/>
+ </class>
+ <class name="java/time/chrono/ChronoLocalDateImpl" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/time/chrono/ChronoLocalDate"/>
+ <implements name="java/time/temporal/Temporal"/>
+ <implements name="java/time/temporal/TemporalAdjuster"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/time/chrono/ChronoLocalDateTime" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Comparable"/>
+ <implements name="java/time/temporal/Temporal"/>
+ <implements name="java/time/temporal/TemporalAdjuster"/>
+ <method name="atZone(Ljava/time/ZoneId;)Ljava/time/chrono/ChronoZonedDateTime;"/>
+ <method name="compareTo(Ljava/time/chrono/ChronoLocalDateTime;)I"/>
+ <method name="format(Ljava/time/format/DateTimeFormatter;)Ljava/lang/String;"/>
+ <method name="from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/ChronoLocalDateTime;"/>
+ <method name="getChronology()Ljava/time/chrono/Chronology;"/>
+ <method name="isAfter(Ljava/time/chrono/ChronoLocalDateTime;)Z"/>
+ <method name="isBefore(Ljava/time/chrono/ChronoLocalDateTime;)Z"/>
+ <method name="isEqual(Ljava/time/chrono/ChronoLocalDateTime;)Z"/>
+ <method name="minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/ChronoLocalDateTime;"/>
+ <method name="minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/ChronoLocalDateTime;"/>
+ <method name="plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/ChronoLocalDateTime;"/>
+ <method name="plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/ChronoLocalDateTime;"/>
+ <method name="timeLineOrder()Ljava/util/Comparator;"/>
+ <method name="toEpochSecond(Ljava/time/ZoneOffset;)J"/>
+ <method name="toInstant(Ljava/time/ZoneOffset;)Ljava/time/Instant;"/>
+ <method name="toLocalDate()Ljava/time/chrono/ChronoLocalDate;"/>
+ <method name="toLocalTime()Ljava/time/LocalTime;"/>
+ <method name="with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/chrono/ChronoLocalDateTime;"/>
+ <method name="with(Ljava/time/temporal/TemporalField;J)Ljava/time/chrono/ChronoLocalDateTime;"/>
+ </class>
+ <class name="java/time/chrono/ChronoPeriod" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/time/temporal/TemporalAmount"/>
+ <method name="between(Ljava/time/chrono/ChronoLocalDate;Ljava/time/chrono/ChronoLocalDate;)Ljava/time/chrono/ChronoPeriod;"/>
+ <method name="getChronology()Ljava/time/chrono/Chronology;"/>
+ <method name="isNegative()Z"/>
+ <method name="isZero()Z"/>
+ <method name="minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/ChronoPeriod;"/>
+ <method name="multipliedBy(I)Ljava/time/chrono/ChronoPeriod;"/>
+ <method name="negated()Ljava/time/chrono/ChronoPeriod;"/>
+ <method name="normalized()Ljava/time/chrono/ChronoPeriod;"/>
+ <method name="plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/ChronoPeriod;"/>
+ </class>
+ <class name="java/time/chrono/ChronoZonedDateTime" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Comparable"/>
+ <implements name="java/time/temporal/Temporal"/>
+ <method name="compareTo(Ljava/time/chrono/ChronoZonedDateTime;)I"/>
+ <method name="format(Ljava/time/format/DateTimeFormatter;)Ljava/lang/String;"/>
+ <method name="from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/ChronoZonedDateTime;"/>
+ <method name="getChronology()Ljava/time/chrono/Chronology;"/>
+ <method name="getOffset()Ljava/time/ZoneOffset;"/>
+ <method name="getZone()Ljava/time/ZoneId;"/>
+ <method name="isAfter(Ljava/time/chrono/ChronoZonedDateTime;)Z"/>
+ <method name="isBefore(Ljava/time/chrono/ChronoZonedDateTime;)Z"/>
+ <method name="isEqual(Ljava/time/chrono/ChronoZonedDateTime;)Z"/>
+ <method name="minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/ChronoZonedDateTime;"/>
+ <method name="minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/ChronoZonedDateTime;"/>
+ <method name="plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/ChronoZonedDateTime;"/>
+ <method name="plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/ChronoZonedDateTime;"/>
+ <method name="timeLineOrder()Ljava/util/Comparator;"/>
+ <method name="toEpochSecond()J"/>
+ <method name="toInstant()Ljava/time/Instant;"/>
+ <method name="toLocalDate()Ljava/time/chrono/ChronoLocalDate;"/>
+ <method name="toLocalDateTime()Ljava/time/chrono/ChronoLocalDateTime;"/>
+ <method name="toLocalTime()Ljava/time/LocalTime;"/>
+ <method name="with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/chrono/ChronoZonedDateTime;"/>
+ <method name="with(Ljava/time/temporal/TemporalField;J)Ljava/time/chrono/ChronoZonedDateTime;"/>
+ <method name="withEarlierOffsetAtOverlap()Ljava/time/chrono/ChronoZonedDateTime;"/>
+ <method name="withLaterOffsetAtOverlap()Ljava/time/chrono/ChronoZonedDateTime;"/>
+ <method name="withZoneSameInstant(Ljava/time/ZoneId;)Ljava/time/chrono/ChronoZonedDateTime;"/>
+ <method name="withZoneSameLocal(Ljava/time/ZoneId;)Ljava/time/chrono/ChronoZonedDateTime;"/>
+ </class>
+ <class name="java/time/chrono/Chronology" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="compareTo(Ljava/time/chrono/Chronology;)I"/>
+ <method name="date(III)Ljava/time/chrono/ChronoLocalDate;"/>
+ <method name="date(Ljava/time/chrono/Era;III)Ljava/time/chrono/ChronoLocalDate;"/>
+ <method name="date(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/ChronoLocalDate;"/>
+ <method name="dateEpochDay(J)Ljava/time/chrono/ChronoLocalDate;"/>
+ <method name="dateNow()Ljava/time/chrono/ChronoLocalDate;"/>
+ <method name="dateNow(Ljava/time/Clock;)Ljava/time/chrono/ChronoLocalDate;"/>
+ <method name="dateNow(Ljava/time/ZoneId;)Ljava/time/chrono/ChronoLocalDate;"/>
+ <method name="dateYearDay(II)Ljava/time/chrono/ChronoLocalDate;"/>
+ <method name="dateYearDay(Ljava/time/chrono/Era;II)Ljava/time/chrono/ChronoLocalDate;"/>
+ <method name="eraOf(I)Ljava/time/chrono/Era;"/>
+ <method name="eras()Ljava/util/List;"/>
+ <method name="from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/Chronology;"/>
+ <method name="getAvailableChronologies()Ljava/util/Set;"/>
+ <method name="getCalendarType()Ljava/lang/String;"/>
+ <method name="getDisplayName(Ljava/time/format/TextStyle;Ljava/util/Locale;)Ljava/lang/String;"/>
+ <method name="getId()Ljava/lang/String;"/>
+ <method name="isLeapYear(J)Z"/>
+ <method name="localDateTime(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/ChronoLocalDateTime;"/>
+ <method name="of(Ljava/lang/String;)Ljava/time/chrono/Chronology;"/>
+ <method name="ofLocale(Ljava/util/Locale;)Ljava/time/chrono/Chronology;"/>
+ <method name="period(III)Ljava/time/chrono/ChronoPeriod;"/>
+ <method name="prolepticYear(Ljava/time/chrono/Era;I)I"/>
+ <method name="range(Ljava/time/temporal/ChronoField;)Ljava/time/temporal/ValueRange;"/>
+ <method name="resolveDate(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/chrono/ChronoLocalDate;"/>
+ <method name="zonedDateTime(Ljava/time/Instant;Ljava/time/ZoneId;)Ljava/time/chrono/ChronoZonedDateTime;"/>
+ <method name="zonedDateTime(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/ChronoZonedDateTime;"/>
+ </class>
+ <class name="java/time/chrono/Era" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/time/temporal/TemporalAccessor"/>
+ <implements name="java/time/temporal/TemporalAdjuster"/>
+ <method name="getDisplayName(Ljava/time/format/TextStyle;Ljava/util/Locale;)Ljava/lang/String;"/>
+ <method name="getValue()I"/>
+ </class>
+ <class name="java/time/chrono/HijrahChronology" since="26">
+ <extends name="java/time/chrono/AbstractChronology"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="date(III)Ljava/time/chrono/HijrahDate;"/>
+ <method name="date(Ljava/time/chrono/Era;III)Ljava/time/chrono/HijrahDate;"/>
+ <method name="date(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/HijrahDate;"/>
+ <method name="dateEpochDay(J)Ljava/time/chrono/HijrahDate;"/>
+ <method name="dateNow()Ljava/time/chrono/HijrahDate;"/>
+ <method name="dateNow(Ljava/time/Clock;)Ljava/time/chrono/HijrahDate;"/>
+ <method name="dateNow(Ljava/time/ZoneId;)Ljava/time/chrono/HijrahDate;"/>
+ <method name="dateYearDay(II)Ljava/time/chrono/HijrahDate;"/>
+ <method name="dateYearDay(Ljava/time/chrono/Era;II)Ljava/time/chrono/HijrahDate;"/>
+ <method name="eraOf(I)Ljava/time/chrono/HijrahEra;"/>
+ <method name="resolveDate(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/chrono/HijrahDate;"/>
+ <field name="INSTANCE"/>
+ </class>
+ <class name="java/time/chrono/HijrahDate" since="26">
+ <extends name="java/time/chrono/ChronoLocalDateImpl"/>
+ <method name="&lt;init>()V"/>
+ <method name="from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/HijrahDate;"/>
+ <method name="getChronology()Ljava/time/chrono/HijrahChronology;"/>
+ <method name="getEra()Ljava/time/chrono/HijrahEra;"/>
+ <method name="minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/HijrahDate;"/>
+ <method name="minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/HijrahDate;"/>
+ <method name="now()Ljava/time/chrono/HijrahDate;"/>
+ <method name="now(Ljava/time/Clock;)Ljava/time/chrono/HijrahDate;"/>
+ <method name="now(Ljava/time/ZoneId;)Ljava/time/chrono/HijrahDate;"/>
+ <method name="of(III)Ljava/time/chrono/HijrahDate;"/>
+ <method name="plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/HijrahDate;"/>
+ <method name="plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/HijrahDate;"/>
+ <method name="with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/chrono/HijrahDate;"/>
+ <method name="with(Ljava/time/temporal/TemporalField;J)Ljava/time/chrono/HijrahDate;"/>
+ <method name="withVariant(Ljava/time/chrono/HijrahChronology;)Ljava/time/chrono/HijrahDate;"/>
+ </class>
+ <class name="java/time/chrono/HijrahEra" since="26">
+ <extends name="java/lang/Enum"/>
+ <implements name="java/time/chrono/Era"/>
+ <method name="of(I)Ljava/time/chrono/HijrahEra;"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/time/chrono/HijrahEra;"/>
+ <method name="values()[Ljava/time/chrono/HijrahEra;"/>
+ <field name="AH"/>
+ </class>
+ <class name="java/time/chrono/IsoChronology" since="26">
+ <extends name="java/time/chrono/AbstractChronology"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="date(III)Ljava/time/LocalDate;"/>
+ <method name="date(Ljava/time/chrono/Era;III)Ljava/time/LocalDate;"/>
+ <method name="date(Ljava/time/temporal/TemporalAccessor;)Ljava/time/LocalDate;"/>
+ <method name="dateEpochDay(J)Ljava/time/LocalDate;"/>
+ <method name="dateNow()Ljava/time/LocalDate;"/>
+ <method name="dateNow(Ljava/time/Clock;)Ljava/time/LocalDate;"/>
+ <method name="dateNow(Ljava/time/ZoneId;)Ljava/time/LocalDate;"/>
+ <method name="dateYearDay(II)Ljava/time/LocalDate;"/>
+ <method name="dateYearDay(Ljava/time/chrono/Era;II)Ljava/time/LocalDate;"/>
+ <method name="eraOf(I)Ljava/time/chrono/IsoEra;"/>
+ <method name="localDateTime(Ljava/time/temporal/TemporalAccessor;)Ljava/time/LocalDateTime;"/>
+ <method name="period(III)Ljava/time/Period;"/>
+ <method name="resolveDate(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/LocalDate;"/>
+ <method name="zonedDateTime(Ljava/time/Instant;Ljava/time/ZoneId;)Ljava/time/ZonedDateTime;"/>
+ <method name="zonedDateTime(Ljava/time/temporal/TemporalAccessor;)Ljava/time/ZonedDateTime;"/>
+ <field name="INSTANCE"/>
+ </class>
+ <class name="java/time/chrono/IsoEra" since="26">
+ <extends name="java/lang/Enum"/>
+ <implements name="java/time/chrono/Era"/>
+ <method name="of(I)Ljava/time/chrono/IsoEra;"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/time/chrono/IsoEra;"/>
+ <method name="values()[Ljava/time/chrono/IsoEra;"/>
+ <field name="BCE"/>
+ <field name="CE"/>
+ </class>
+ <class name="java/time/chrono/JapaneseChronology" since="26">
+ <extends name="java/time/chrono/AbstractChronology"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="date(III)Ljava/time/chrono/JapaneseDate;"/>
+ <method name="date(Ljava/time/chrono/Era;III)Ljava/time/chrono/JapaneseDate;"/>
+ <method name="date(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/JapaneseDate;"/>
+ <method name="dateEpochDay(J)Ljava/time/chrono/JapaneseDate;"/>
+ <method name="dateNow()Ljava/time/chrono/JapaneseDate;"/>
+ <method name="dateNow(Ljava/time/Clock;)Ljava/time/chrono/JapaneseDate;"/>
+ <method name="dateNow(Ljava/time/ZoneId;)Ljava/time/chrono/JapaneseDate;"/>
+ <method name="dateYearDay(II)Ljava/time/chrono/JapaneseDate;"/>
+ <method name="dateYearDay(Ljava/time/chrono/Era;II)Ljava/time/chrono/JapaneseDate;"/>
+ <method name="eraOf(I)Ljava/time/chrono/JapaneseEra;"/>
+ <method name="resolveDate(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/chrono/JapaneseDate;"/>
+ <field name="INSTANCE"/>
+ </class>
+ <class name="java/time/chrono/JapaneseDate" since="26">
+ <extends name="java/time/chrono/ChronoLocalDateImpl"/>
+ <method name="&lt;init>()V"/>
+ <method name="from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/JapaneseDate;"/>
+ <method name="getChronology()Ljava/time/chrono/JapaneseChronology;"/>
+ <method name="getEra()Ljava/time/chrono/JapaneseEra;"/>
+ <method name="minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/JapaneseDate;"/>
+ <method name="minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/JapaneseDate;"/>
+ <method name="now()Ljava/time/chrono/JapaneseDate;"/>
+ <method name="now(Ljava/time/Clock;)Ljava/time/chrono/JapaneseDate;"/>
+ <method name="now(Ljava/time/ZoneId;)Ljava/time/chrono/JapaneseDate;"/>
+ <method name="of(III)Ljava/time/chrono/JapaneseDate;"/>
+ <method name="of(Ljava/time/chrono/JapaneseEra;III)Ljava/time/chrono/JapaneseDate;"/>
+ <method name="plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/JapaneseDate;"/>
+ <method name="plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/JapaneseDate;"/>
+ <method name="with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/chrono/JapaneseDate;"/>
+ <method name="with(Ljava/time/temporal/TemporalField;J)Ljava/time/chrono/JapaneseDate;"/>
+ </class>
+ <class name="java/time/chrono/JapaneseEra" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/time/chrono/Era"/>
+ <method name="&lt;init>()V"/>
+ <method name="of(I)Ljava/time/chrono/JapaneseEra;"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/time/chrono/JapaneseEra;"/>
+ <method name="values()[Ljava/time/chrono/JapaneseEra;"/>
+ <field name="HEISEI"/>
+ <field name="MEIJI"/>
+ <field name="SHOWA"/>
+ <field name="TAISHO"/>
+ </class>
+ <class name="java/time/chrono/MinguoChronology" since="26">
+ <extends name="java/time/chrono/AbstractChronology"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="date(III)Ljava/time/chrono/MinguoDate;"/>
+ <method name="date(Ljava/time/chrono/Era;III)Ljava/time/chrono/MinguoDate;"/>
+ <method name="date(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/MinguoDate;"/>
+ <method name="dateEpochDay(J)Ljava/time/chrono/MinguoDate;"/>
+ <method name="dateNow()Ljava/time/chrono/MinguoDate;"/>
+ <method name="dateNow(Ljava/time/Clock;)Ljava/time/chrono/MinguoDate;"/>
+ <method name="dateNow(Ljava/time/ZoneId;)Ljava/time/chrono/MinguoDate;"/>
+ <method name="dateYearDay(II)Ljava/time/chrono/MinguoDate;"/>
+ <method name="dateYearDay(Ljava/time/chrono/Era;II)Ljava/time/chrono/MinguoDate;"/>
+ <method name="eraOf(I)Ljava/time/chrono/MinguoEra;"/>
+ <method name="resolveDate(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/chrono/MinguoDate;"/>
+ <field name="INSTANCE"/>
+ </class>
+ <class name="java/time/chrono/MinguoDate" since="26">
+ <extends name="java/time/chrono/ChronoLocalDateImpl"/>
+ <method name="&lt;init>()V"/>
+ <method name="from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/MinguoDate;"/>
+ <method name="getChronology()Ljava/time/chrono/MinguoChronology;"/>
+ <method name="getEra()Ljava/time/chrono/MinguoEra;"/>
+ <method name="minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/MinguoDate;"/>
+ <method name="minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/MinguoDate;"/>
+ <method name="now()Ljava/time/chrono/MinguoDate;"/>
+ <method name="now(Ljava/time/Clock;)Ljava/time/chrono/MinguoDate;"/>
+ <method name="now(Ljava/time/ZoneId;)Ljava/time/chrono/MinguoDate;"/>
+ <method name="of(III)Ljava/time/chrono/MinguoDate;"/>
+ <method name="plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/MinguoDate;"/>
+ <method name="plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/MinguoDate;"/>
+ <method name="with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/chrono/MinguoDate;"/>
+ <method name="with(Ljava/time/temporal/TemporalField;J)Ljava/time/chrono/MinguoDate;"/>
+ </class>
+ <class name="java/time/chrono/MinguoEra" since="26">
+ <extends name="java/lang/Enum"/>
+ <implements name="java/time/chrono/Era"/>
+ <method name="of(I)Ljava/time/chrono/MinguoEra;"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/time/chrono/MinguoEra;"/>
+ <method name="values()[Ljava/time/chrono/MinguoEra;"/>
+ <field name="BEFORE_ROC"/>
+ <field name="ROC"/>
+ </class>
+ <class name="java/time/chrono/ThaiBuddhistChronology" since="26">
+ <extends name="java/time/chrono/AbstractChronology"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="date(III)Ljava/time/chrono/ThaiBuddhistDate;"/>
+ <method name="date(Ljava/time/chrono/Era;III)Ljava/time/chrono/ThaiBuddhistDate;"/>
+ <method name="date(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/ThaiBuddhistDate;"/>
+ <method name="dateEpochDay(J)Ljava/time/chrono/ThaiBuddhistDate;"/>
+ <method name="dateNow()Ljava/time/chrono/ThaiBuddhistDate;"/>
+ <method name="dateNow(Ljava/time/Clock;)Ljava/time/chrono/ThaiBuddhistDate;"/>
+ <method name="dateNow(Ljava/time/ZoneId;)Ljava/time/chrono/ThaiBuddhistDate;"/>
+ <method name="dateYearDay(II)Ljava/time/chrono/ThaiBuddhistDate;"/>
+ <method name="dateYearDay(Ljava/time/chrono/Era;II)Ljava/time/chrono/ThaiBuddhistDate;"/>
+ <method name="eraOf(I)Ljava/time/chrono/ThaiBuddhistEra;"/>
+ <method name="resolveDate(Ljava/util/Map;Ljava/time/format/ResolverStyle;)Ljava/time/chrono/ThaiBuddhistDate;"/>
+ <field name="INSTANCE"/>
+ </class>
+ <class name="java/time/chrono/ThaiBuddhistDate" since="26">
+ <extends name="java/time/chrono/ChronoLocalDateImpl"/>
+ <method name="&lt;init>()V"/>
+ <method name="from(Ljava/time/temporal/TemporalAccessor;)Ljava/time/chrono/ThaiBuddhistDate;"/>
+ <method name="getChronology()Ljava/time/chrono/ThaiBuddhistChronology;"/>
+ <method name="getEra()Ljava/time/chrono/ThaiBuddhistEra;"/>
+ <method name="minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/ThaiBuddhistDate;"/>
+ <method name="minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/ThaiBuddhistDate;"/>
+ <method name="now()Ljava/time/chrono/ThaiBuddhistDate;"/>
+ <method name="now(Ljava/time/Clock;)Ljava/time/chrono/ThaiBuddhistDate;"/>
+ <method name="now(Ljava/time/ZoneId;)Ljava/time/chrono/ThaiBuddhistDate;"/>
+ <method name="of(III)Ljava/time/chrono/ThaiBuddhistDate;"/>
+ <method name="plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/chrono/ThaiBuddhistDate;"/>
+ <method name="plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/chrono/ThaiBuddhistDate;"/>
+ <method name="with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/chrono/ThaiBuddhistDate;"/>
+ <method name="with(Ljava/time/temporal/TemporalField;J)Ljava/time/chrono/ThaiBuddhistDate;"/>
+ </class>
+ <class name="java/time/chrono/ThaiBuddhistEra" since="26">
+ <extends name="java/lang/Enum"/>
+ <implements name="java/time/chrono/Era"/>
+ <method name="of(I)Ljava/time/chrono/ThaiBuddhistEra;"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/time/chrono/ThaiBuddhistEra;"/>
+ <method name="values()[Ljava/time/chrono/ThaiBuddhistEra;"/>
+ <field name="BE"/>
+ <field name="BEFORE_BE"/>
+ </class>
+ <class name="java/time/format/DateTimeFormatter" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="format(Ljava/time/temporal/TemporalAccessor;)Ljava/lang/String;"/>
+ <method name="formatTo(Ljava/time/temporal/TemporalAccessor;Ljava/lang/Appendable;)V"/>
+ <method name="getChronology()Ljava/time/chrono/Chronology;"/>
+ <method name="getDecimalStyle()Ljava/time/format/DecimalStyle;"/>
+ <method name="getLocale()Ljava/util/Locale;"/>
+ <method name="getResolverFields()Ljava/util/Set;"/>
+ <method name="getResolverStyle()Ljava/time/format/ResolverStyle;"/>
+ <method name="getZone()Ljava/time/ZoneId;"/>
+ <method name="ofLocalizedDate(Ljava/time/format/FormatStyle;)Ljava/time/format/DateTimeFormatter;"/>
+ <method name="ofLocalizedDateTime(Ljava/time/format/FormatStyle;)Ljava/time/format/DateTimeFormatter;"/>
+ <method name="ofLocalizedDateTime(Ljava/time/format/FormatStyle;Ljava/time/format/FormatStyle;)Ljava/time/format/DateTimeFormatter;"/>
+ <method name="ofLocalizedTime(Ljava/time/format/FormatStyle;)Ljava/time/format/DateTimeFormatter;"/>
+ <method name="ofPattern(Ljava/lang/String;)Ljava/time/format/DateTimeFormatter;"/>
+ <method name="ofPattern(Ljava/lang/String;Ljava/util/Locale;)Ljava/time/format/DateTimeFormatter;"/>
+ <method name="parse(Ljava/lang/CharSequence;)Ljava/time/temporal/TemporalAccessor;"/>
+ <method name="parse(Ljava/lang/CharSequence;Ljava/text/ParsePosition;)Ljava/time/temporal/TemporalAccessor;"/>
+ <method name="parse(Ljava/lang/CharSequence;Ljava/time/temporal/TemporalQuery;)Ljava/lang/Object;"/>
+ <method name="parseBest(Ljava/lang/CharSequence;[Ljava/time/temporal/TemporalQuery;)Ljava/time/temporal/TemporalAccessor;"/>
+ <method name="parseUnresolved(Ljava/lang/CharSequence;Ljava/text/ParsePosition;)Ljava/time/temporal/TemporalAccessor;"/>
+ <method name="parsedExcessDays()Ljava/time/temporal/TemporalQuery;"/>
+ <method name="parsedLeapSecond()Ljava/time/temporal/TemporalQuery;"/>
+ <method name="toFormat()Ljava/text/Format;"/>
+ <method name="toFormat(Ljava/time/temporal/TemporalQuery;)Ljava/text/Format;"/>
+ <method name="withChronology(Ljava/time/chrono/Chronology;)Ljava/time/format/DateTimeFormatter;"/>
+ <method name="withDecimalStyle(Ljava/time/format/DecimalStyle;)Ljava/time/format/DateTimeFormatter;"/>
+ <method name="withLocale(Ljava/util/Locale;)Ljava/time/format/DateTimeFormatter;"/>
+ <method name="withResolverFields(Ljava/util/Set;)Ljava/time/format/DateTimeFormatter;"/>
+ <method name="withResolverFields([Ljava/time/temporal/TemporalField;)Ljava/time/format/DateTimeFormatter;"/>
+ <method name="withResolverStyle(Ljava/time/format/ResolverStyle;)Ljava/time/format/DateTimeFormatter;"/>
+ <method name="withZone(Ljava/time/ZoneId;)Ljava/time/format/DateTimeFormatter;"/>
+ <field name="BASIC_ISO_DATE"/>
+ <field name="ISO_DATE"/>
+ <field name="ISO_DATE_TIME"/>
+ <field name="ISO_INSTANT"/>
+ <field name="ISO_LOCAL_DATE"/>
+ <field name="ISO_LOCAL_DATE_TIME"/>
+ <field name="ISO_LOCAL_TIME"/>
+ <field name="ISO_OFFSET_DATE"/>
+ <field name="ISO_OFFSET_DATE_TIME"/>
+ <field name="ISO_OFFSET_TIME"/>
+ <field name="ISO_ORDINAL_DATE"/>
+ <field name="ISO_TIME"/>
+ <field name="ISO_WEEK_DATE"/>
+ <field name="ISO_ZONED_DATE_TIME"/>
+ <field name="RFC_1123_DATE_TIME"/>
+ </class>
+ <class name="java/time/format/DateTimeFormatterBuilder" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="append(Ljava/time/format/DateTimeFormatter;)Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="appendChronologyId()Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="appendChronologyText(Ljava/time/format/TextStyle;)Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="appendFraction(Ljava/time/temporal/TemporalField;IIZ)Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="appendInstant()Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="appendInstant(I)Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="appendLiteral(C)Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="appendLiteral(Ljava/lang/String;)Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="appendLocalized(Ljava/time/format/FormatStyle;Ljava/time/format/FormatStyle;)Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="appendLocalizedOffset(Ljava/time/format/TextStyle;)Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="appendOffset(Ljava/lang/String;Ljava/lang/String;)Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="appendOffsetId()Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="appendOptional(Ljava/time/format/DateTimeFormatter;)Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="appendPattern(Ljava/lang/String;)Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="appendText(Ljava/time/temporal/TemporalField;)Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="appendText(Ljava/time/temporal/TemporalField;Ljava/time/format/TextStyle;)Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="appendText(Ljava/time/temporal/TemporalField;Ljava/util/Map;)Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="appendValue(Ljava/time/temporal/TemporalField;)Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="appendValue(Ljava/time/temporal/TemporalField;I)Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="appendValue(Ljava/time/temporal/TemporalField;IILjava/time/format/SignStyle;)Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="appendValueReduced(Ljava/time/temporal/TemporalField;III)Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="appendValueReduced(Ljava/time/temporal/TemporalField;IILjava/time/chrono/ChronoLocalDate;)Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="appendZoneId()Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="appendZoneOrOffsetId()Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="appendZoneRegionId()Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="appendZoneText(Ljava/time/format/TextStyle;)Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="appendZoneText(Ljava/time/format/TextStyle;Ljava/util/Set;)Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="getLocalizedDateTimePattern(Ljava/time/format/FormatStyle;Ljava/time/format/FormatStyle;Ljava/time/chrono/Chronology;Ljava/util/Locale;)Ljava/lang/String;"/>
+ <method name="optionalEnd()Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="optionalStart()Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="padNext(I)Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="padNext(IC)Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="parseCaseInsensitive()Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="parseCaseSensitive()Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="parseDefaulting(Ljava/time/temporal/TemporalField;J)Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="parseLenient()Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="parseStrict()Ljava/time/format/DateTimeFormatterBuilder;"/>
+ <method name="toFormatter()Ljava/time/format/DateTimeFormatter;"/>
+ <method name="toFormatter(Ljava/util/Locale;)Ljava/time/format/DateTimeFormatter;"/>
+ </class>
+ <class name="java/time/format/DateTimeParseException" since="26">
+ <extends name="java/time/DateTimeException"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/CharSequence;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/CharSequence;ILjava/lang/Throwable;)V"/>
+ <method name="getErrorIndex()I"/>
+ <method name="getParsedString()Ljava/lang/String;"/>
+ </class>
+ <class name="java/time/format/DecimalStyle" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAvailableLocales()Ljava/util/Set;"/>
+ <method name="getDecimalSeparator()C"/>
+ <method name="getNegativeSign()C"/>
+ <method name="getPositiveSign()C"/>
+ <method name="getZeroDigit()C"/>
+ <method name="of(Ljava/util/Locale;)Ljava/time/format/DecimalStyle;"/>
+ <method name="ofDefaultLocale()Ljava/time/format/DecimalStyle;"/>
+ <method name="withDecimalSeparator(C)Ljava/time/format/DecimalStyle;"/>
+ <method name="withNegativeSign(C)Ljava/time/format/DecimalStyle;"/>
+ <method name="withPositiveSign(C)Ljava/time/format/DecimalStyle;"/>
+ <method name="withZeroDigit(C)Ljava/time/format/DecimalStyle;"/>
+ <field name="STANDARD"/>
+ </class>
+ <class name="java/time/format/FormatStyle" since="26">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/time/format/FormatStyle;"/>
+ <method name="values()[Ljava/time/format/FormatStyle;"/>
+ <field name="FULL"/>
+ <field name="LONG"/>
+ <field name="MEDIUM"/>
+ <field name="SHORT"/>
+ </class>
+ <class name="java/time/format/ResolverStyle" since="26">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/time/format/ResolverStyle;"/>
+ <method name="values()[Ljava/time/format/ResolverStyle;"/>
+ <field name="LENIENT"/>
+ <field name="SMART"/>
+ <field name="STRICT"/>
+ </class>
+ <class name="java/time/format/SignStyle" since="26">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/time/format/SignStyle;"/>
+ <method name="values()[Ljava/time/format/SignStyle;"/>
+ <field name="ALWAYS"/>
+ <field name="EXCEEDS_PAD"/>
+ <field name="NEVER"/>
+ <field name="NORMAL"/>
+ <field name="NOT_NEGATIVE"/>
+ </class>
+ <class name="java/time/format/TextStyle" since="26">
+ <extends name="java/lang/Enum"/>
+ <method name="asNormal()Ljava/time/format/TextStyle;"/>
+ <method name="asStandalone()Ljava/time/format/TextStyle;"/>
+ <method name="isStandalone()Z"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/time/format/TextStyle;"/>
+ <method name="values()[Ljava/time/format/TextStyle;"/>
+ <field name="FULL"/>
+ <field name="FULL_STANDALONE"/>
+ <field name="NARROW"/>
+ <field name="NARROW_STANDALONE"/>
+ <field name="SHORT"/>
+ <field name="SHORT_STANDALONE"/>
+ </class>
+ <class name="java/time/temporal/ChronoField" since="26">
+ <extends name="java/lang/Enum"/>
+ <implements name="java/time/temporal/TemporalField"/>
+ <method name="checkValidIntValue(J)I"/>
+ <method name="checkValidValue(J)J"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/time/temporal/ChronoField;"/>
+ <method name="values()[Ljava/time/temporal/ChronoField;"/>
+ <field name="ALIGNED_DAY_OF_WEEK_IN_MONTH"/>
+ <field name="ALIGNED_DAY_OF_WEEK_IN_YEAR"/>
+ <field name="ALIGNED_WEEK_OF_MONTH"/>
+ <field name="ALIGNED_WEEK_OF_YEAR"/>
+ <field name="AMPM_OF_DAY"/>
+ <field name="CLOCK_HOUR_OF_AMPM"/>
+ <field name="CLOCK_HOUR_OF_DAY"/>
+ <field name="DAY_OF_MONTH"/>
+ <field name="DAY_OF_WEEK"/>
+ <field name="DAY_OF_YEAR"/>
+ <field name="EPOCH_DAY"/>
+ <field name="ERA"/>
+ <field name="HOUR_OF_AMPM"/>
+ <field name="HOUR_OF_DAY"/>
+ <field name="INSTANT_SECONDS"/>
+ <field name="MICRO_OF_DAY"/>
+ <field name="MICRO_OF_SECOND"/>
+ <field name="MILLI_OF_DAY"/>
+ <field name="MILLI_OF_SECOND"/>
+ <field name="MINUTE_OF_DAY"/>
+ <field name="MINUTE_OF_HOUR"/>
+ <field name="MONTH_OF_YEAR"/>
+ <field name="NANO_OF_DAY"/>
+ <field name="NANO_OF_SECOND"/>
+ <field name="OFFSET_SECONDS"/>
+ <field name="PROLEPTIC_MONTH"/>
+ <field name="SECOND_OF_DAY"/>
+ <field name="SECOND_OF_MINUTE"/>
+ <field name="YEAR"/>
+ <field name="YEAR_OF_ERA"/>
+ </class>
+ <class name="java/time/temporal/ChronoUnit" since="26">
+ <extends name="java/lang/Enum"/>
+ <implements name="java/time/temporal/TemporalUnit"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/time/temporal/ChronoUnit;"/>
+ <method name="values()[Ljava/time/temporal/ChronoUnit;"/>
+ <field name="CENTURIES"/>
+ <field name="DAYS"/>
+ <field name="DECADES"/>
+ <field name="ERAS"/>
+ <field name="FOREVER"/>
+ <field name="HALF_DAYS"/>
+ <field name="HOURS"/>
+ <field name="MICROS"/>
+ <field name="MILLENNIA"/>
+ <field name="MILLIS"/>
+ <field name="MINUTES"/>
+ <field name="MONTHS"/>
+ <field name="NANOS"/>
+ <field name="SECONDS"/>
+ <field name="WEEKS"/>
+ <field name="YEARS"/>
+ </class>
+ <class name="java/time/temporal/IsoFields" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="DAY_OF_QUARTER"/>
+ <field name="QUARTER_OF_YEAR"/>
+ <field name="QUARTER_YEARS"/>
+ <field name="WEEK_BASED_YEAR"/>
+ <field name="WEEK_BASED_YEARS"/>
+ <field name="WEEK_OF_WEEK_BASED_YEAR"/>
+ </class>
+ <class name="java/time/temporal/JulianFields" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="JULIAN_DAY"/>
+ <field name="MODIFIED_JULIAN_DAY"/>
+ <field name="RATA_DIE"/>
+ </class>
+ <class name="java/time/temporal/Temporal" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/time/temporal/TemporalAccessor"/>
+ <method name="isSupported(Ljava/time/temporal/TemporalUnit;)Z"/>
+ <method name="minus(JLjava/time/temporal/TemporalUnit;)Ljava/time/temporal/Temporal;"/>
+ <method name="minus(Ljava/time/temporal/TemporalAmount;)Ljava/time/temporal/Temporal;"/>
+ <method name="plus(JLjava/time/temporal/TemporalUnit;)Ljava/time/temporal/Temporal;"/>
+ <method name="plus(Ljava/time/temporal/TemporalAmount;)Ljava/time/temporal/Temporal;"/>
+ <method name="until(Ljava/time/temporal/Temporal;Ljava/time/temporal/TemporalUnit;)J"/>
+ <method name="with(Ljava/time/temporal/TemporalAdjuster;)Ljava/time/temporal/Temporal;"/>
+ <method name="with(Ljava/time/temporal/TemporalField;J)Ljava/time/temporal/Temporal;"/>
+ </class>
+ <class name="java/time/temporal/TemporalAccessor" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="get(Ljava/time/temporal/TemporalField;)I"/>
+ <method name="getLong(Ljava/time/temporal/TemporalField;)J"/>
+ <method name="isSupported(Ljava/time/temporal/TemporalField;)Z"/>
+ <method name="query(Ljava/time/temporal/TemporalQuery;)Ljava/lang/Object;"/>
+ <method name="range(Ljava/time/temporal/TemporalField;)Ljava/time/temporal/ValueRange;"/>
+ </class>
+ <class name="java/time/temporal/TemporalAdjuster" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="adjustInto(Ljava/time/temporal/Temporal;)Ljava/time/temporal/Temporal;"/>
+ </class>
+ <class name="java/time/temporal/TemporalAdjusters" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="dayOfWeekInMonth(ILjava/time/DayOfWeek;)Ljava/time/temporal/TemporalAdjuster;"/>
+ <method name="firstDayOfMonth()Ljava/time/temporal/TemporalAdjuster;"/>
+ <method name="firstDayOfNextMonth()Ljava/time/temporal/TemporalAdjuster;"/>
+ <method name="firstDayOfNextYear()Ljava/time/temporal/TemporalAdjuster;"/>
+ <method name="firstDayOfYear()Ljava/time/temporal/TemporalAdjuster;"/>
+ <method name="firstInMonth(Ljava/time/DayOfWeek;)Ljava/time/temporal/TemporalAdjuster;"/>
+ <method name="lastDayOfMonth()Ljava/time/temporal/TemporalAdjuster;"/>
+ <method name="lastDayOfYear()Ljava/time/temporal/TemporalAdjuster;"/>
+ <method name="lastInMonth(Ljava/time/DayOfWeek;)Ljava/time/temporal/TemporalAdjuster;"/>
+ <method name="next(Ljava/time/DayOfWeek;)Ljava/time/temporal/TemporalAdjuster;"/>
+ <method name="nextOrSame(Ljava/time/DayOfWeek;)Ljava/time/temporal/TemporalAdjuster;"/>
+ <method name="ofDateAdjuster(Ljava/util/function/UnaryOperator;)Ljava/time/temporal/TemporalAdjuster;"/>
+ <method name="previous(Ljava/time/DayOfWeek;)Ljava/time/temporal/TemporalAdjuster;"/>
+ <method name="previousOrSame(Ljava/time/DayOfWeek;)Ljava/time/temporal/TemporalAdjuster;"/>
+ </class>
+ <class name="java/time/temporal/TemporalAmount" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="addTo(Ljava/time/temporal/Temporal;)Ljava/time/temporal/Temporal;"/>
+ <method name="get(Ljava/time/temporal/TemporalUnit;)J"/>
+ <method name="getUnits()Ljava/util/List;"/>
+ <method name="subtractFrom(Ljava/time/temporal/Temporal;)Ljava/time/temporal/Temporal;"/>
+ </class>
+ <class name="java/time/temporal/TemporalField" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="adjustInto(Ljava/time/temporal/Temporal;J)Ljava/time/temporal/Temporal;"/>
+ <method name="getBaseUnit()Ljava/time/temporal/TemporalUnit;"/>
+ <method name="getDisplayName(Ljava/util/Locale;)Ljava/lang/String;"/>
+ <method name="getFrom(Ljava/time/temporal/TemporalAccessor;)J"/>
+ <method name="getRangeUnit()Ljava/time/temporal/TemporalUnit;"/>
+ <method name="isDateBased()Z"/>
+ <method name="isSupportedBy(Ljava/time/temporal/TemporalAccessor;)Z"/>
+ <method name="isTimeBased()Z"/>
+ <method name="range()Ljava/time/temporal/ValueRange;"/>
+ <method name="rangeRefinedBy(Ljava/time/temporal/TemporalAccessor;)Ljava/time/temporal/ValueRange;"/>
+ <method name="resolve(Ljava/util/Map;Ljava/time/temporal/TemporalAccessor;Ljava/time/format/ResolverStyle;)Ljava/time/temporal/TemporalAccessor;"/>
+ </class>
+ <class name="java/time/temporal/TemporalQueries" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="chronology()Ljava/time/temporal/TemporalQuery;"/>
+ <method name="localDate()Ljava/time/temporal/TemporalQuery;"/>
+ <method name="localTime()Ljava/time/temporal/TemporalQuery;"/>
+ <method name="offset()Ljava/time/temporal/TemporalQuery;"/>
+ <method name="precision()Ljava/time/temporal/TemporalQuery;"/>
+ <method name="zone()Ljava/time/temporal/TemporalQuery;"/>
+ <method name="zoneId()Ljava/time/temporal/TemporalQuery;"/>
+ </class>
+ <class name="java/time/temporal/TemporalQuery" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="queryFrom(Ljava/time/temporal/TemporalAccessor;)Ljava/lang/Object;"/>
+ </class>
+ <class name="java/time/temporal/TemporalUnit" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="addTo(Ljava/time/temporal/Temporal;J)Ljava/time/temporal/Temporal;"/>
+ <method name="between(Ljava/time/temporal/Temporal;Ljava/time/temporal/Temporal;)J"/>
+ <method name="getDuration()Ljava/time/Duration;"/>
+ <method name="isDateBased()Z"/>
+ <method name="isDurationEstimated()Z"/>
+ <method name="isSupportedBy(Ljava/time/temporal/Temporal;)Z"/>
+ <method name="isTimeBased()Z"/>
+ </class>
+ <class name="java/time/temporal/UnsupportedTemporalTypeException" since="26">
+ <extends name="java/time/DateTimeException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/time/temporal/ValueRange" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="checkValidIntValue(JLjava/time/temporal/TemporalField;)I"/>
+ <method name="checkValidValue(JLjava/time/temporal/TemporalField;)J"/>
+ <method name="getLargestMinimum()J"/>
+ <method name="getMaximum()J"/>
+ <method name="getMinimum()J"/>
+ <method name="getSmallestMaximum()J"/>
+ <method name="isFixed()Z"/>
+ <method name="isIntValue()Z"/>
+ <method name="isValidIntValue(J)Z"/>
+ <method name="isValidValue(J)Z"/>
+ <method name="of(JJ)Ljava/time/temporal/ValueRange;"/>
+ <method name="of(JJJ)Ljava/time/temporal/ValueRange;"/>
+ <method name="of(JJJJ)Ljava/time/temporal/ValueRange;"/>
+ </class>
+ <class name="java/time/temporal/WeekFields" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="dayOfWeek()Ljava/time/temporal/TemporalField;"/>
+ <method name="getFirstDayOfWeek()Ljava/time/DayOfWeek;"/>
+ <method name="getMinimalDaysInFirstWeek()I"/>
+ <method name="of(Ljava/time/DayOfWeek;I)Ljava/time/temporal/WeekFields;"/>
+ <method name="of(Ljava/util/Locale;)Ljava/time/temporal/WeekFields;"/>
+ <method name="weekBasedYear()Ljava/time/temporal/TemporalField;"/>
+ <method name="weekOfMonth()Ljava/time/temporal/TemporalField;"/>
+ <method name="weekOfWeekBasedYear()Ljava/time/temporal/TemporalField;"/>
+ <method name="weekOfYear()Ljava/time/temporal/TemporalField;"/>
+ <field name="ISO"/>
+ <field name="SUNDAY_START"/>
+ <field name="WEEK_BASED_YEARS"/>
+ </class>
+ <class name="java/time/zone/ZoneOffsetTransition" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>()V"/>
+ <method name="compareTo(Ljava/time/zone/ZoneOffsetTransition;)I"/>
+ <method name="getDateTimeAfter()Ljava/time/LocalDateTime;"/>
+ <method name="getDateTimeBefore()Ljava/time/LocalDateTime;"/>
+ <method name="getDuration()Ljava/time/Duration;"/>
+ <method name="getInstant()Ljava/time/Instant;"/>
+ <method name="getOffsetAfter()Ljava/time/ZoneOffset;"/>
+ <method name="getOffsetBefore()Ljava/time/ZoneOffset;"/>
+ <method name="isGap()Z"/>
+ <method name="isOverlap()Z"/>
+ <method name="isValidOffset(Ljava/time/ZoneOffset;)Z"/>
+ <method name="of(Ljava/time/LocalDateTime;Ljava/time/ZoneOffset;Ljava/time/ZoneOffset;)Ljava/time/zone/ZoneOffsetTransition;"/>
+ <method name="toEpochSecond()J"/>
+ </class>
+ <class name="java/time/zone/ZoneOffsetTransitionRule" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="createTransition(I)Ljava/time/zone/ZoneOffsetTransition;"/>
+ <method name="getDayOfMonthIndicator()I"/>
+ <method name="getDayOfWeek()Ljava/time/DayOfWeek;"/>
+ <method name="getLocalTime()Ljava/time/LocalTime;"/>
+ <method name="getMonth()Ljava/time/Month;"/>
+ <method name="getOffsetAfter()Ljava/time/ZoneOffset;"/>
+ <method name="getOffsetBefore()Ljava/time/ZoneOffset;"/>
+ <method name="getStandardOffset()Ljava/time/ZoneOffset;"/>
+ <method name="getTimeDefinition()Ljava/time/zone/ZoneOffsetTransitionRule$TimeDefinition;"/>
+ <method name="isMidnightEndOfDay()Z"/>
+ <method name="of(Ljava/time/Month;ILjava/time/DayOfWeek;Ljava/time/LocalTime;ZLjava/time/zone/ZoneOffsetTransitionRule$TimeDefinition;Ljava/time/ZoneOffset;Ljava/time/ZoneOffset;Ljava/time/ZoneOffset;)Ljava/time/zone/ZoneOffsetTransitionRule;"/>
+ </class>
+ <class name="java/time/zone/ZoneOffsetTransitionRule$TimeDefinition" since="26">
+ <extends name="java/lang/Enum"/>
+ <method name="createDateTime(Ljava/time/LocalDateTime;Ljava/time/ZoneOffset;Ljava/time/ZoneOffset;)Ljava/time/LocalDateTime;"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/time/zone/ZoneOffsetTransitionRule$TimeDefinition;"/>
+ <method name="values()[Ljava/time/zone/ZoneOffsetTransitionRule$TimeDefinition;"/>
+ <field name="STANDARD"/>
+ <field name="UTC"/>
+ <field name="WALL"/>
+ </class>
+ <class name="java/time/zone/ZoneRules" since="26">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDaylightSavings(Ljava/time/Instant;)Ljava/time/Duration;"/>
+ <method name="getOffset(Ljava/time/Instant;)Ljava/time/ZoneOffset;"/>
+ <method name="getOffset(Ljava/time/LocalDateTime;)Ljava/time/ZoneOffset;"/>
+ <method name="getStandardOffset(Ljava/time/Instant;)Ljava/time/ZoneOffset;"/>
+ <method name="getTransition(Ljava/time/LocalDateTime;)Ljava/time/zone/ZoneOffsetTransition;"/>
+ <method name="getTransitionRules()Ljava/util/List;"/>
+ <method name="getTransitions()Ljava/util/List;"/>
+ <method name="getValidOffsets(Ljava/time/LocalDateTime;)Ljava/util/List;"/>
+ <method name="isDaylightSavings(Ljava/time/Instant;)Z"/>
+ <method name="isFixedOffset()Z"/>
+ <method name="isValidOffset(Ljava/time/LocalDateTime;Ljava/time/ZoneOffset;)Z"/>
+ <method name="nextTransition(Ljava/time/Instant;)Ljava/time/zone/ZoneOffsetTransition;"/>
+ <method name="of(Ljava/time/ZoneOffset;)Ljava/time/zone/ZoneRules;"/>
+ <method name="of(Ljava/time/ZoneOffset;Ljava/time/ZoneOffset;Ljava/util/List;Ljava/util/List;Ljava/util/List;)Ljava/time/zone/ZoneRules;"/>
+ <method name="previousTransition(Ljava/time/Instant;)Ljava/time/zone/ZoneOffsetTransition;"/>
+ </class>
+ <class name="java/time/zone/ZoneRulesException" since="26">
+ <extends name="java/time/DateTimeException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/util/AbstractCollection" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Collection"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/util/AbstractList" since="1">
+ <extends name="java/util/AbstractCollection"/>
+ <implements name="java/util/List"/>
+ <method name="&lt;init>()V"/>
+ <method name="removeRange(II)V"/>
+ <field name="modCount"/>
+ </class>
+ <class name="java/util/AbstractMap" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Map"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/util/AbstractMap$SimpleEntry" since="9">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/util/Map$Entry"/>
+ <method name="&lt;init>(Ljava/lang/Object;Ljava/lang/Object;)V"/>
+ <method name="&lt;init>(Ljava/util/Map$Entry;)V"/>
+ </class>
+ <class name="java/util/AbstractMap$SimpleImmutableEntry" since="9">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/util/Map$Entry"/>
+ <method name="&lt;init>(Ljava/lang/Object;Ljava/lang/Object;)V"/>
+ <method name="&lt;init>(Ljava/util/Map$Entry;)V"/>
+ </class>
+ <class name="java/util/AbstractQueue" since="1">
+ <extends name="java/util/AbstractCollection"/>
+ <implements name="java/util/Queue"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/util/AbstractSequentialList" since="1">
+ <extends name="java/util/AbstractList"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/util/AbstractSet" since="1">
+ <extends name="java/util/AbstractCollection"/>
+ <implements name="java/util/Set"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/util/ArrayDeque" since="9">
+ <extends name="java/util/AbstractCollection"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="java/util/Deque"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Ljava/util/Collection;)V"/>
+ <method name="clone()Ljava/util/ArrayDeque;"/>
+ </class>
+ <class name="java/util/ArrayList" since="1">
+ <extends name="java/util/AbstractList"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="java/util/RandomAccess"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Ljava/util/Collection;)V"/>
+ <method name="ensureCapacity(I)V"/>
+ <method name="trimToSize()V"/>
+ </class>
+ <class name="java/util/Arrays" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="asList([Ljava/lang/Object;)Ljava/util/List;"/>
+ <method name="binarySearch([BB)I"/>
+ <method name="binarySearch([BIIB)I" since="9"/>
+ <method name="binarySearch([CC)I"/>
+ <method name="binarySearch([CIIC)I" since="9"/>
+ <method name="binarySearch([DD)I"/>
+ <method name="binarySearch([DIID)I" since="9"/>
+ <method name="binarySearch([FF)I"/>
+ <method name="binarySearch([FIIF)I" since="9"/>
+ <method name="binarySearch([II)I"/>
+ <method name="binarySearch([IIII)I" since="9"/>
+ <method name="binarySearch([JIIJ)I" since="9"/>
+ <method name="binarySearch([JJ)I"/>
+ <method name="binarySearch([Ljava/lang/Object;IILjava/lang/Object;)I" since="9"/>
+ <method name="binarySearch([Ljava/lang/Object;IILjava/lang/Object;Ljava/util/Comparator;)I" since="9"/>
+ <method name="binarySearch([Ljava/lang/Object;Ljava/lang/Object;)I"/>
+ <method name="binarySearch([Ljava/lang/Object;Ljava/lang/Object;Ljava/util/Comparator;)I"/>
+ <method name="binarySearch([SIIS)I" since="9"/>
+ <method name="binarySearch([SS)I"/>
+ <method name="copyOf([BI)[B" since="9"/>
+ <method name="copyOf([CI)[C" since="9"/>
+ <method name="copyOf([DI)[D" since="9"/>
+ <method name="copyOf([FI)[F" since="9"/>
+ <method name="copyOf([II)[I" since="9"/>
+ <method name="copyOf([JI)[J" since="9"/>
+ <method name="copyOf([Ljava/lang/Object;I)[Ljava/lang/Object;" since="9"/>
+ <method name="copyOf([Ljava/lang/Object;ILjava/lang/Class;)[Ljava/lang/Object;" since="9"/>
+ <method name="copyOf([SI)[S" since="9"/>
+ <method name="copyOf([ZI)[Z" since="9"/>
+ <method name="copyOfRange([BII)[B" since="9"/>
+ <method name="copyOfRange([CII)[C" since="9"/>
+ <method name="copyOfRange([DII)[D" since="9"/>
+ <method name="copyOfRange([FII)[F" since="9"/>
+ <method name="copyOfRange([III)[I" since="9"/>
+ <method name="copyOfRange([JII)[J" since="9"/>
+ <method name="copyOfRange([Ljava/lang/Object;II)[Ljava/lang/Object;" since="9"/>
+ <method name="copyOfRange([Ljava/lang/Object;IILjava/lang/Class;)[Ljava/lang/Object;" since="9"/>
+ <method name="copyOfRange([SII)[S" since="9"/>
+ <method name="copyOfRange([ZII)[Z" since="9"/>
+ <method name="deepEquals([Ljava/lang/Object;[Ljava/lang/Object;)Z"/>
+ <method name="deepHashCode([Ljava/lang/Object;)I"/>
+ <method name="deepToString([Ljava/lang/Object;)Ljava/lang/String;"/>
+ <method name="equals([B[B)Z"/>
+ <method name="equals([C[C)Z"/>
+ <method name="equals([D[D)Z"/>
+ <method name="equals([F[F)Z"/>
+ <method name="equals([I[I)Z"/>
+ <method name="equals([J[J)Z"/>
+ <method name="equals([Ljava/lang/Object;[Ljava/lang/Object;)Z"/>
+ <method name="equals([S[S)Z"/>
+ <method name="equals([Z[Z)Z"/>
+ <method name="fill([BB)V"/>
+ <method name="fill([BIIB)V"/>
+ <method name="fill([CC)V"/>
+ <method name="fill([CIIC)V"/>
+ <method name="fill([DD)V"/>
+ <method name="fill([DIID)V"/>
+ <method name="fill([FF)V"/>
+ <method name="fill([FIIF)V"/>
+ <method name="fill([II)V"/>
+ <method name="fill([IIII)V"/>
+ <method name="fill([JIIJ)V"/>
+ <method name="fill([JJ)V"/>
+ <method name="fill([Ljava/lang/Object;IILjava/lang/Object;)V"/>
+ <method name="fill([Ljava/lang/Object;Ljava/lang/Object;)V"/>
+ <method name="fill([SIIS)V"/>
+ <method name="fill([SS)V"/>
+ <method name="fill([ZIIZ)V"/>
+ <method name="fill([ZZ)V"/>
+ <method name="hashCode([B)I"/>
+ <method name="hashCode([C)I"/>
+ <method name="hashCode([D)I"/>
+ <method name="hashCode([F)I"/>
+ <method name="hashCode([I)I"/>
+ <method name="hashCode([J)I"/>
+ <method name="hashCode([Ljava/lang/Object;)I"/>
+ <method name="hashCode([S)I"/>
+ <method name="hashCode([Z)I"/>
+ <method name="parallelPrefix([DIILjava/util/function/DoubleBinaryOperator;)V" since="24"/>
+ <method name="parallelPrefix([DLjava/util/function/DoubleBinaryOperator;)V" since="24"/>
+ <method name="parallelPrefix([IIILjava/util/function/IntBinaryOperator;)V" since="24"/>
+ <method name="parallelPrefix([ILjava/util/function/IntBinaryOperator;)V" since="24"/>
+ <method name="parallelPrefix([JIILjava/util/function/LongBinaryOperator;)V" since="24"/>
+ <method name="parallelPrefix([JLjava/util/function/LongBinaryOperator;)V" since="24"/>
+ <method name="parallelPrefix([Ljava/lang/Object;IILjava/util/function/BinaryOperator;)V" since="24"/>
+ <method name="parallelPrefix([Ljava/lang/Object;Ljava/util/function/BinaryOperator;)V" since="24"/>
+ <method name="parallelSetAll([DLjava/util/function/IntToDoubleFunction;)V" since="24"/>
+ <method name="parallelSetAll([ILjava/util/function/IntUnaryOperator;)V" since="24"/>
+ <method name="parallelSetAll([JLjava/util/function/IntToLongFunction;)V" since="24"/>
+ <method name="parallelSetAll([Ljava/lang/Object;Ljava/util/function/IntFunction;)V" since="24"/>
+ <method name="parallelSort([B)V" since="24"/>
+ <method name="parallelSort([BII)V" since="24"/>
+ <method name="parallelSort([C)V" since="24"/>
+ <method name="parallelSort([CII)V" since="24"/>
+ <method name="parallelSort([D)V" since="24"/>
+ <method name="parallelSort([DII)V" since="24"/>
+ <method name="parallelSort([F)V" since="24"/>
+ <method name="parallelSort([FII)V" since="24"/>
+ <method name="parallelSort([I)V" since="24"/>
+ <method name="parallelSort([III)V" since="24"/>
+ <method name="parallelSort([J)V" since="24"/>
+ <method name="parallelSort([JII)V" since="24"/>
+ <method name="parallelSort([Ljava/lang/Comparable;)V" since="24"/>
+ <method name="parallelSort([Ljava/lang/Comparable;II)V" since="24"/>
+ <method name="parallelSort([Ljava/lang/Object;IILjava/util/Comparator;)V" since="24"/>
+ <method name="parallelSort([Ljava/lang/Object;Ljava/util/Comparator;)V" since="24"/>
+ <method name="parallelSort([S)V" since="24"/>
+ <method name="parallelSort([SII)V" since="24"/>
+ <method name="setAll([DLjava/util/function/IntToDoubleFunction;)V" since="24"/>
+ <method name="setAll([ILjava/util/function/IntUnaryOperator;)V" since="24"/>
+ <method name="setAll([JLjava/util/function/IntToLongFunction;)V" since="24"/>
+ <method name="setAll([Ljava/lang/Object;Ljava/util/function/IntFunction;)V" since="24"/>
+ <method name="sort([B)V"/>
+ <method name="sort([BII)V"/>
+ <method name="sort([C)V"/>
+ <method name="sort([CII)V"/>
+ <method name="sort([D)V"/>
+ <method name="sort([DII)V"/>
+ <method name="sort([F)V"/>
+ <method name="sort([FII)V"/>
+ <method name="sort([I)V"/>
+ <method name="sort([III)V"/>
+ <method name="sort([J)V"/>
+ <method name="sort([JII)V"/>
+ <method name="sort([Ljava/lang/Object;)V"/>
+ <method name="sort([Ljava/lang/Object;II)V"/>
+ <method name="sort([Ljava/lang/Object;IILjava/util/Comparator;)V"/>
+ <method name="sort([Ljava/lang/Object;Ljava/util/Comparator;)V"/>
+ <method name="sort([S)V"/>
+ <method name="sort([SII)V"/>
+ <method name="spliterator([D)Ljava/util/Spliterator$OfDouble;" since="24"/>
+ <method name="spliterator([DII)Ljava/util/Spliterator$OfDouble;" since="24"/>
+ <method name="spliterator([I)Ljava/util/Spliterator$OfInt;" since="24"/>
+ <method name="spliterator([III)Ljava/util/Spliterator$OfInt;" since="24"/>
+ <method name="spliterator([J)Ljava/util/Spliterator$OfLong;" since="24"/>
+ <method name="spliterator([JII)Ljava/util/Spliterator$OfLong;" since="24"/>
+ <method name="spliterator([Ljava/lang/Object;)Ljava/util/Spliterator;" since="24"/>
+ <method name="spliterator([Ljava/lang/Object;II)Ljava/util/Spliterator;" since="24"/>
+ <method name="stream([D)Ljava/util/stream/DoubleStream;" since="24"/>
+ <method name="stream([DII)Ljava/util/stream/DoubleStream;" since="24"/>
+ <method name="stream([I)Ljava/util/stream/IntStream;" since="24"/>
+ <method name="stream([III)Ljava/util/stream/IntStream;" since="24"/>
+ <method name="stream([J)Ljava/util/stream/LongStream;" since="24"/>
+ <method name="stream([JII)Ljava/util/stream/LongStream;" since="24"/>
+ <method name="stream([Ljava/lang/Object;)Ljava/util/stream/Stream;" since="24"/>
+ <method name="stream([Ljava/lang/Object;II)Ljava/util/stream/Stream;" since="24"/>
+ <method name="toString([B)Ljava/lang/String;"/>
+ <method name="toString([C)Ljava/lang/String;"/>
+ <method name="toString([D)Ljava/lang/String;"/>
+ <method name="toString([F)Ljava/lang/String;"/>
+ <method name="toString([I)Ljava/lang/String;"/>
+ <method name="toString([J)Ljava/lang/String;"/>
+ <method name="toString([Ljava/lang/Object;)Ljava/lang/String;"/>
+ <method name="toString([S)Ljava/lang/String;"/>
+ <method name="toString([Z)Ljava/lang/String;"/>
+ </class>
+ <class name="java/util/Base64" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDecoder()Ljava/util/Base64$Decoder;"/>
+ <method name="getEncoder()Ljava/util/Base64$Encoder;"/>
+ <method name="getMimeDecoder()Ljava/util/Base64$Decoder;"/>
+ <method name="getMimeEncoder()Ljava/util/Base64$Encoder;"/>
+ <method name="getMimeEncoder(I[B)Ljava/util/Base64$Encoder;"/>
+ <method name="getUrlDecoder()Ljava/util/Base64$Decoder;"/>
+ <method name="getUrlEncoder()Ljava/util/Base64$Encoder;"/>
+ </class>
+ <class name="java/util/Base64$Decoder" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="decode(Ljava/lang/String;)[B"/>
+ <method name="decode(Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;"/>
+ <method name="decode([B)[B"/>
+ <method name="decode([B[B)I"/>
+ <method name="wrap(Ljava/io/InputStream;)Ljava/io/InputStream;"/>
+ </class>
+ <class name="java/util/Base64$Encoder" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="encode(Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;"/>
+ <method name="encode([B)[B"/>
+ <method name="encode([B[B)I"/>
+ <method name="encodeToString([B)Ljava/lang/String;"/>
+ <method name="withoutPadding()Ljava/util/Base64$Encoder;"/>
+ <method name="wrap(Ljava/io/OutputStream;)Ljava/io/OutputStream;"/>
+ </class>
+ <class name="java/util/BitSet" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="and(Ljava/util/BitSet;)V"/>
+ <method name="andNot(Ljava/util/BitSet;)V"/>
+ <method name="cardinality()I"/>
+ <method name="clear()V"/>
+ <method name="clear(I)V"/>
+ <method name="clear(II)V"/>
+ <method name="flip(I)V"/>
+ <method name="flip(II)V"/>
+ <method name="get(I)Z"/>
+ <method name="get(II)Ljava/util/BitSet;"/>
+ <method name="intersects(Ljava/util/BitSet;)Z"/>
+ <method name="isEmpty()Z"/>
+ <method name="length()I"/>
+ <method name="nextClearBit(I)I"/>
+ <method name="nextSetBit(I)I"/>
+ <method name="or(Ljava/util/BitSet;)V"/>
+ <method name="previousClearBit(I)I" since="19"/>
+ <method name="previousSetBit(I)I" since="19"/>
+ <method name="set(I)V"/>
+ <method name="set(II)V"/>
+ <method name="set(IIZ)V"/>
+ <method name="set(IZ)V"/>
+ <method name="size()I"/>
+ <method name="stream()Ljava/util/stream/IntStream;" since="24"/>
+ <method name="toByteArray()[B" since="19"/>
+ <method name="toLongArray()[J" since="19"/>
+ <method name="valueOf(Ljava/nio/ByteBuffer;)Ljava/util/BitSet;" since="19"/>
+ <method name="valueOf(Ljava/nio/LongBuffer;)Ljava/util/BitSet;" since="19"/>
+ <method name="valueOf([B)Ljava/util/BitSet;" since="19"/>
+ <method name="valueOf([J)Ljava/util/BitSet;" since="19"/>
+ <method name="xor(Ljava/util/BitSet;)V"/>
+ </class>
+ <class name="java/util/Calendar" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/util/TimeZone;Ljava/util/Locale;)V"/>
+ <method name="add(II)V"/>
+ <method name="after(Ljava/lang/Object;)Z"/>
+ <method name="before(Ljava/lang/Object;)Z"/>
+ <method name="clear()V"/>
+ <method name="clear(I)V"/>
+ <method name="compareTo(Ljava/util/Calendar;)I"/>
+ <method name="complete()V"/>
+ <method name="computeFields()V"/>
+ <method name="computeTime()V"/>
+ <method name="get(I)I"/>
+ <method name="getActualMaximum(I)I"/>
+ <method name="getActualMinimum(I)I"/>
+ <method name="getAvailableCalendarTypes()Ljava/util/Set;" since="26"/>
+ <method name="getAvailableLocales()[Ljava/util/Locale;"/>
+ <method name="getCalendarType()Ljava/lang/String;" since="26"/>
+ <method name="getDisplayName(IILjava/util/Locale;)Ljava/lang/String;" since="9"/>
+ <method name="getDisplayNames(IILjava/util/Locale;)Ljava/util/Map;" since="9"/>
+ <method name="getFirstDayOfWeek()I"/>
+ <method name="getGreatestMinimum(I)I"/>
+ <method name="getInstance()Ljava/util/Calendar;"/>
+ <method name="getInstance(Ljava/util/Locale;)Ljava/util/Calendar;"/>
+ <method name="getInstance(Ljava/util/TimeZone;)Ljava/util/Calendar;"/>
+ <method name="getInstance(Ljava/util/TimeZone;Ljava/util/Locale;)Ljava/util/Calendar;"/>
+ <method name="getLeastMaximum(I)I"/>
+ <method name="getMaximum(I)I"/>
+ <method name="getMinimalDaysInFirstWeek()I"/>
+ <method name="getMinimum(I)I"/>
+ <method name="getTime()Ljava/util/Date;"/>
+ <method name="getTimeInMillis()J"/>
+ <method name="getTimeZone()Ljava/util/TimeZone;"/>
+ <method name="getWeekYear()I" since="24"/>
+ <method name="getWeeksInWeekYear()I" since="24"/>
+ <method name="internalGet(I)I"/>
+ <method name="isLenient()Z"/>
+ <method name="isSet(I)Z"/>
+ <method name="isWeekDateSupported()Z" since="24"/>
+ <method name="roll(II)V"/>
+ <method name="roll(IZ)V"/>
+ <method name="set(II)V"/>
+ <method name="set(III)V"/>
+ <method name="set(IIIII)V"/>
+ <method name="set(IIIIII)V"/>
+ <method name="setFirstDayOfWeek(I)V"/>
+ <method name="setLenient(Z)V"/>
+ <method name="setMinimalDaysInFirstWeek(I)V"/>
+ <method name="setTime(Ljava/util/Date;)V"/>
+ <method name="setTimeInMillis(J)V"/>
+ <method name="setTimeZone(Ljava/util/TimeZone;)V"/>
+ <method name="setWeekDate(III)V" since="24"/>
+ <method name="toInstant()Ljava/time/Instant;" since="26"/>
+ <field name="ALL_STYLES" since="9"/>
+ <field name="AM"/>
+ <field name="AM_PM"/>
+ <field name="APRIL"/>
+ <field name="AUGUST"/>
+ <field name="DATE"/>
+ <field name="DAY_OF_MONTH"/>
+ <field name="DAY_OF_WEEK"/>
+ <field name="DAY_OF_WEEK_IN_MONTH"/>
+ <field name="DAY_OF_YEAR"/>
+ <field name="DECEMBER"/>
+ <field name="DST_OFFSET"/>
+ <field name="ERA"/>
+ <field name="FEBRUARY"/>
+ <field name="FIELD_COUNT"/>
+ <field name="FRIDAY"/>
+ <field name="HOUR"/>
+ <field name="HOUR_OF_DAY"/>
+ <field name="JANUARY"/>
+ <field name="JULY"/>
+ <field name="JUNE"/>
+ <field name="LONG" since="9"/>
+ <field name="LONG_FORMAT" since="26"/>
+ <field name="LONG_STANDALONE" since="26"/>
+ <field name="MARCH"/>
+ <field name="MAY"/>
+ <field name="MILLISECOND"/>
+ <field name="MINUTE"/>
+ <field name="MONDAY"/>
+ <field name="MONTH"/>
+ <field name="NARROW_FORMAT" since="26"/>
+ <field name="NARROW_STANDALONE" since="26"/>
+ <field name="NOVEMBER"/>
+ <field name="OCTOBER"/>
+ <field name="PM"/>
+ <field name="SATURDAY"/>
+ <field name="SECOND"/>
+ <field name="SEPTEMBER"/>
+ <field name="SHORT" since="9"/>
+ <field name="SHORT_FORMAT" since="26"/>
+ <field name="SHORT_STANDALONE" since="26"/>
+ <field name="SUNDAY"/>
+ <field name="THURSDAY"/>
+ <field name="TUESDAY"/>
+ <field name="UNDECIMBER"/>
+ <field name="WEDNESDAY"/>
+ <field name="WEEK_OF_MONTH"/>
+ <field name="WEEK_OF_YEAR"/>
+ <field name="YEAR"/>
+ <field name="ZONE_OFFSET"/>
+ <field name="areFieldsSet"/>
+ <field name="fields"/>
+ <field name="isSet"/>
+ <field name="isTimeSet"/>
+ <field name="time"/>
+ </class>
+ <class name="java/util/Calendar$Builder" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="build()Ljava/util/Calendar;"/>
+ <method name="set(II)Ljava/util/Calendar$Builder;"/>
+ <method name="setCalendarType(Ljava/lang/String;)Ljava/util/Calendar$Builder;"/>
+ <method name="setDate(III)Ljava/util/Calendar$Builder;"/>
+ <method name="setFields([I)Ljava/util/Calendar$Builder;"/>
+ <method name="setInstant(J)Ljava/util/Calendar$Builder;"/>
+ <method name="setInstant(Ljava/util/Date;)Ljava/util/Calendar$Builder;"/>
+ <method name="setLenient(Z)Ljava/util/Calendar$Builder;"/>
+ <method name="setLocale(Ljava/util/Locale;)Ljava/util/Calendar$Builder;"/>
+ <method name="setTimeOfDay(III)Ljava/util/Calendar$Builder;"/>
+ <method name="setTimeOfDay(IIII)Ljava/util/Calendar$Builder;"/>
+ <method name="setTimeZone(Ljava/util/TimeZone;)Ljava/util/Calendar$Builder;"/>
+ <method name="setWeekDate(III)Ljava/util/Calendar$Builder;"/>
+ <method name="setWeekDefinition(II)Ljava/util/Calendar$Builder;"/>
+ </class>
+ <class name="java/util/Collection" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Iterable"/>
+ <method name="add(Ljava/lang/Object;)Z"/>
+ <method name="addAll(Ljava/util/Collection;)Z"/>
+ <method name="clear()V"/>
+ <method name="contains(Ljava/lang/Object;)Z"/>
+ <method name="containsAll(Ljava/util/Collection;)Z"/>
+ <method name="isEmpty()Z"/>
+ <method name="parallelStream()Ljava/util/stream/Stream;" since="24"/>
+ <method name="remove(Ljava/lang/Object;)Z"/>
+ <method name="removeAll(Ljava/util/Collection;)Z"/>
+ <method name="removeIf(Ljava/util/function/Predicate;)Z" since="24"/>
+ <method name="retainAll(Ljava/util/Collection;)Z"/>
+ <method name="size()I"/>
+ <method name="stream()Ljava/util/stream/Stream;" since="24"/>
+ <method name="toArray()[Ljava/lang/Object;"/>
+ <method name="toArray([Ljava/lang/Object;)[Ljava/lang/Object;"/>
+ </class>
+ <class name="java/util/Collections" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addAll(Ljava/util/Collection;[Ljava/lang/Object;)Z"/>
+ <method name="asLifoQueue(Ljava/util/Deque;)Ljava/util/Queue;" since="9"/>
+ <method name="binarySearch(Ljava/util/List;Ljava/lang/Object;)I"/>
+ <method name="binarySearch(Ljava/util/List;Ljava/lang/Object;Ljava/util/Comparator;)I"/>
+ <method name="checkedCollection(Ljava/util/Collection;Ljava/lang/Class;)Ljava/util/Collection;"/>
+ <method name="checkedList(Ljava/util/List;Ljava/lang/Class;)Ljava/util/List;"/>
+ <method name="checkedMap(Ljava/util/Map;Ljava/lang/Class;Ljava/lang/Class;)Ljava/util/Map;"/>
+ <method name="checkedNavigableMap(Ljava/util/NavigableMap;Ljava/lang/Class;Ljava/lang/Class;)Ljava/util/NavigableMap;" since="26"/>
+ <method name="checkedNavigableSet(Ljava/util/NavigableSet;Ljava/lang/Class;)Ljava/util/NavigableSet;" since="26"/>
+ <method name="checkedQueue(Ljava/util/Queue;Ljava/lang/Class;)Ljava/util/Queue;" since="26"/>
+ <method name="checkedSet(Ljava/util/Set;Ljava/lang/Class;)Ljava/util/Set;"/>
+ <method name="checkedSortedMap(Ljava/util/SortedMap;Ljava/lang/Class;Ljava/lang/Class;)Ljava/util/SortedMap;"/>
+ <method name="checkedSortedSet(Ljava/util/SortedSet;Ljava/lang/Class;)Ljava/util/SortedSet;"/>
+ <method name="copy(Ljava/util/List;Ljava/util/List;)V"/>
+ <method name="disjoint(Ljava/util/Collection;Ljava/util/Collection;)Z"/>
+ <method name="emptyEnumeration()Ljava/util/Enumeration;" since="19"/>
+ <method name="emptyIterator()Ljava/util/Iterator;" since="19"/>
+ <method name="emptyList()Ljava/util/List;"/>
+ <method name="emptyListIterator()Ljava/util/ListIterator;" since="19"/>
+ <method name="emptyMap()Ljava/util/Map;"/>
+ <method name="emptyNavigableMap()Ljava/util/NavigableMap;" since="26"/>
+ <method name="emptyNavigableSet()Ljava/util/NavigableSet;" since="26"/>
+ <method name="emptySet()Ljava/util/Set;"/>
+ <method name="emptySortedMap()Ljava/util/SortedMap;" since="26"/>
+ <method name="emptySortedSet()Ljava/util/SortedSet;" since="26"/>
+ <method name="enumeration(Ljava/util/Collection;)Ljava/util/Enumeration;"/>
+ <method name="fill(Ljava/util/List;Ljava/lang/Object;)V"/>
+ <method name="frequency(Ljava/util/Collection;Ljava/lang/Object;)I"/>
+ <method name="indexOfSubList(Ljava/util/List;Ljava/util/List;)I"/>
+ <method name="lastIndexOfSubList(Ljava/util/List;Ljava/util/List;)I"/>
+ <method name="list(Ljava/util/Enumeration;)Ljava/util/ArrayList;"/>
+ <method name="max(Ljava/util/Collection;)Ljava/lang/Object;"/>
+ <method name="max(Ljava/util/Collection;Ljava/util/Comparator;)Ljava/lang/Object;"/>
+ <method name="min(Ljava/util/Collection;)Ljava/lang/Object;"/>
+ <method name="min(Ljava/util/Collection;Ljava/util/Comparator;)Ljava/lang/Object;"/>
+ <method name="nCopies(ILjava/lang/Object;)Ljava/util/List;"/>
+ <method name="newSetFromMap(Ljava/util/Map;)Ljava/util/Set;" since="9"/>
+ <method name="replaceAll(Ljava/util/List;Ljava/lang/Object;Ljava/lang/Object;)Z"/>
+ <method name="reverse(Ljava/util/List;)V"/>
+ <method name="reverseOrder()Ljava/util/Comparator;"/>
+ <method name="reverseOrder(Ljava/util/Comparator;)Ljava/util/Comparator;"/>
+ <method name="rotate(Ljava/util/List;I)V"/>
+ <method name="shuffle(Ljava/util/List;)V"/>
+ <method name="shuffle(Ljava/util/List;Ljava/util/Random;)V"/>
+ <method name="singleton(Ljava/lang/Object;)Ljava/util/Set;"/>
+ <method name="singletonList(Ljava/lang/Object;)Ljava/util/List;"/>
+ <method name="singletonMap(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;"/>
+ <method name="sort(Ljava/util/List;)V"/>
+ <method name="sort(Ljava/util/List;Ljava/util/Comparator;)V"/>
+ <method name="swap(Ljava/util/List;II)V"/>
+ <method name="synchronizedCollection(Ljava/util/Collection;)Ljava/util/Collection;"/>
+ <method name="synchronizedList(Ljava/util/List;)Ljava/util/List;"/>
+ <method name="synchronizedMap(Ljava/util/Map;)Ljava/util/Map;"/>
+ <method name="synchronizedNavigableMap(Ljava/util/NavigableMap;)Ljava/util/NavigableMap;" since="26"/>
+ <method name="synchronizedNavigableSet(Ljava/util/NavigableSet;)Ljava/util/NavigableSet;" since="26"/>
+ <method name="synchronizedSet(Ljava/util/Set;)Ljava/util/Set;"/>
+ <method name="synchronizedSortedMap(Ljava/util/SortedMap;)Ljava/util/SortedMap;"/>
+ <method name="synchronizedSortedSet(Ljava/util/SortedSet;)Ljava/util/SortedSet;"/>
+ <method name="unmodifiableCollection(Ljava/util/Collection;)Ljava/util/Collection;"/>
+ <method name="unmodifiableList(Ljava/util/List;)Ljava/util/List;"/>
+ <method name="unmodifiableMap(Ljava/util/Map;)Ljava/util/Map;"/>
+ <method name="unmodifiableNavigableMap(Ljava/util/NavigableMap;)Ljava/util/NavigableMap;" since="26"/>
+ <method name="unmodifiableNavigableSet(Ljava/util/NavigableSet;)Ljava/util/NavigableSet;" since="26"/>
+ <method name="unmodifiableSet(Ljava/util/Set;)Ljava/util/Set;"/>
+ <method name="unmodifiableSortedMap(Ljava/util/SortedMap;)Ljava/util/SortedMap;"/>
+ <method name="unmodifiableSortedSet(Ljava/util/SortedSet;)Ljava/util/SortedSet;"/>
+ <field name="EMPTY_LIST"/>
+ <field name="EMPTY_MAP"/>
+ <field name="EMPTY_SET"/>
+ </class>
+ <class name="java/util/Comparator" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="compare(Ljava/lang/Object;Ljava/lang/Object;)I"/>
+ <method name="comparing(Ljava/util/function/Function;)Ljava/util/Comparator;" since="24"/>
+ <method name="comparing(Ljava/util/function/Function;Ljava/util/Comparator;)Ljava/util/Comparator;" since="24"/>
+ <method name="comparingDouble(Ljava/util/function/ToDoubleFunction;)Ljava/util/Comparator;" since="24"/>
+ <method name="comparingInt(Ljava/util/function/ToIntFunction;)Ljava/util/Comparator;" since="24"/>
+ <method name="comparingLong(Ljava/util/function/ToLongFunction;)Ljava/util/Comparator;" since="24"/>
+ <method name="naturalOrder()Ljava/util/Comparator;" since="24"/>
+ <method name="nullsFirst(Ljava/util/Comparator;)Ljava/util/Comparator;" since="24"/>
+ <method name="nullsLast(Ljava/util/Comparator;)Ljava/util/Comparator;" since="24"/>
+ <method name="reverseOrder()Ljava/util/Comparator;" since="24"/>
+ <method name="reversed()Ljava/util/Comparator;" since="24"/>
+ <method name="thenComparing(Ljava/util/Comparator;)Ljava/util/Comparator;" since="24"/>
+ <method name="thenComparing(Ljava/util/function/Function;)Ljava/util/Comparator;" since="24"/>
+ <method name="thenComparing(Ljava/util/function/Function;Ljava/util/Comparator;)Ljava/util/Comparator;" since="24"/>
+ <method name="thenComparingDouble(Ljava/util/function/ToDoubleFunction;)Ljava/util/Comparator;" since="24"/>
+ <method name="thenComparingInt(Ljava/util/function/ToIntFunction;)Ljava/util/Comparator;" since="24"/>
+ <method name="thenComparingLong(Ljava/util/function/ToLongFunction;)Ljava/util/Comparator;" since="24"/>
+ </class>
+ <class name="java/util/ConcurrentModificationException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" since="19"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" since="19"/>
+ </class>
+ <class name="java/util/Currency" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAvailableCurrencies()Ljava/util/Set;" since="19"/>
+ <method name="getCurrencyCode()Ljava/lang/String;"/>
+ <method name="getDefaultFractionDigits()I"/>
+ <method name="getDisplayName()Ljava/lang/String;" since="19"/>
+ <method name="getDisplayName(Ljava/util/Locale;)Ljava/lang/String;" since="19"/>
+ <method name="getInstance(Ljava/lang/String;)Ljava/util/Currency;"/>
+ <method name="getInstance(Ljava/util/Locale;)Ljava/util/Currency;"/>
+ <method name="getNumericCode()I" since="24"/>
+ <method name="getSymbol()Ljava/lang/String;"/>
+ <method name="getSymbol(Ljava/util/Locale;)Ljava/lang/String;"/>
+ </class>
+ <class name="java/util/Date" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(III)V" deprecated="16"/>
+ <method name="&lt;init>(IIIII)V" deprecated="16"/>
+ <method name="&lt;init>(IIIIII)V" deprecated="16"/>
+ <method name="&lt;init>(J)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V" deprecated="16"/>
+ <method name="UTC(IIIIII)J" deprecated="16"/>
+ <method name="after(Ljava/util/Date;)Z"/>
+ <method name="before(Ljava/util/Date;)Z"/>
+ <method name="compareTo(Ljava/util/Date;)I"/>
+ <method name="from(Ljava/time/Instant;)Ljava/util/Date;" since="26"/>
+ <method name="getDate()I" deprecated="16"/>
+ <method name="getDay()I" deprecated="16"/>
+ <method name="getHours()I" deprecated="16"/>
+ <method name="getMinutes()I" deprecated="16"/>
+ <method name="getMonth()I" deprecated="16"/>
+ <method name="getSeconds()I" deprecated="16"/>
+ <method name="getTime()J"/>
+ <method name="getTimezoneOffset()I" deprecated="16"/>
+ <method name="getYear()I" deprecated="16"/>
+ <method name="parse(Ljava/lang/String;)J" deprecated="16"/>
+ <method name="setDate(I)V" deprecated="16"/>
+ <method name="setHours(I)V" deprecated="16"/>
+ <method name="setMinutes(I)V" deprecated="16"/>
+ <method name="setMonth(I)V" deprecated="16"/>
+ <method name="setSeconds(I)V" deprecated="16"/>
+ <method name="setTime(J)V"/>
+ <method name="setYear(I)V" deprecated="16"/>
+ <method name="toGMTString()Ljava/lang/String;" deprecated="16"/>
+ <method name="toInstant()Ljava/time/Instant;" since="26"/>
+ <method name="toLocaleString()Ljava/lang/String;" deprecated="16"/>
+ </class>
+ <class name="java/util/Deque" since="9">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Queue"/>
+ <method name="addFirst(Ljava/lang/Object;)V"/>
+ <method name="addLast(Ljava/lang/Object;)V"/>
+ <method name="descendingIterator()Ljava/util/Iterator;"/>
+ <method name="getFirst()Ljava/lang/Object;"/>
+ <method name="getLast()Ljava/lang/Object;"/>
+ <method name="offerFirst(Ljava/lang/Object;)Z"/>
+ <method name="offerLast(Ljava/lang/Object;)Z"/>
+ <method name="peekFirst()Ljava/lang/Object;"/>
+ <method name="peekLast()Ljava/lang/Object;"/>
+ <method name="pollFirst()Ljava/lang/Object;"/>
+ <method name="pollLast()Ljava/lang/Object;"/>
+ <method name="pop()Ljava/lang/Object;"/>
+ <method name="push(Ljava/lang/Object;)V"/>
+ <method name="removeFirst()Ljava/lang/Object;"/>
+ <method name="removeFirstOccurrence(Ljava/lang/Object;)Z"/>
+ <method name="removeLast()Ljava/lang/Object;"/>
+ <method name="removeLastOccurrence(Ljava/lang/Object;)Z"/>
+ </class>
+ <class name="java/util/Dictionary" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="elements()Ljava/util/Enumeration;"/>
+ <method name="get(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="isEmpty()Z"/>
+ <method name="keys()Ljava/util/Enumeration;"/>
+ <method name="put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="remove(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="size()I"/>
+ </class>
+ <class name="java/util/DoubleSummaryStatistics" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/function/DoubleConsumer"/>
+ <method name="&lt;init>()V"/>
+ <method name="combine(Ljava/util/DoubleSummaryStatistics;)V"/>
+ <method name="getAverage()D"/>
+ <method name="getCount()J"/>
+ <method name="getMax()D"/>
+ <method name="getMin()D"/>
+ <method name="getSum()D"/>
+ </class>
+ <class name="java/util/DuplicateFormatFlagsException" since="1">
+ <extends name="java/util/IllegalFormatException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getFlags()Ljava/lang/String;"/>
+ </class>
+ <class name="java/util/EmptyStackException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/util/EnumMap" since="1">
+ <extends name="java/util/AbstractMap"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>(Ljava/lang/Class;)V"/>
+ <method name="&lt;init>(Ljava/util/EnumMap;)V"/>
+ <method name="&lt;init>(Ljava/util/Map;)V"/>
+ <method name="clone()Ljava/util/EnumMap;"/>
+ <method name="put(Ljava/lang/Enum;Ljava/lang/Object;)Ljava/lang/Object;"/>
+ </class>
+ <class name="java/util/EnumSet" since="1">
+ <extends name="java/util/AbstractSet"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="allOf(Ljava/lang/Class;)Ljava/util/EnumSet;"/>
+ <method name="clone()Ljava/util/EnumSet;"/>
+ <method name="complementOf(Ljava/util/EnumSet;)Ljava/util/EnumSet;"/>
+ <method name="copyOf(Ljava/util/Collection;)Ljava/util/EnumSet;"/>
+ <method name="copyOf(Ljava/util/EnumSet;)Ljava/util/EnumSet;"/>
+ <method name="noneOf(Ljava/lang/Class;)Ljava/util/EnumSet;"/>
+ <method name="of(Ljava/lang/Enum;)Ljava/util/EnumSet;"/>
+ <method name="of(Ljava/lang/Enum;Ljava/lang/Enum;)Ljava/util/EnumSet;"/>
+ <method name="of(Ljava/lang/Enum;Ljava/lang/Enum;Ljava/lang/Enum;)Ljava/util/EnumSet;"/>
+ <method name="of(Ljava/lang/Enum;Ljava/lang/Enum;Ljava/lang/Enum;Ljava/lang/Enum;)Ljava/util/EnumSet;"/>
+ <method name="of(Ljava/lang/Enum;Ljava/lang/Enum;Ljava/lang/Enum;Ljava/lang/Enum;Ljava/lang/Enum;)Ljava/util/EnumSet;"/>
+ <method name="of(Ljava/lang/Enum;[Ljava/lang/Enum;)Ljava/util/EnumSet;"/>
+ <method name="range(Ljava/lang/Enum;Ljava/lang/Enum;)Ljava/util/EnumSet;"/>
+ </class>
+ <class name="java/util/Enumeration" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="hasMoreElements()Z"/>
+ <method name="nextElement()Ljava/lang/Object;"/>
+ </class>
+ <class name="java/util/EventListener" since="1">
+ <extends name="java/lang/Object"/>
+ </class>
+ <class name="java/util/EventListenerProxy" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/EventListener"/>
+ <method name="&lt;init>(Ljava/util/EventListener;)V"/>
+ <method name="getListener()Ljava/util/EventListener;"/>
+ </class>
+ <class name="java/util/EventObject" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(Ljava/lang/Object;)V"/>
+ <method name="getSource()Ljava/lang/Object;"/>
+ <field name="source"/>
+ </class>
+ <class name="java/util/FormatFlagsConversionMismatchException" since="1">
+ <extends name="java/util/IllegalFormatException"/>
+ <method name="&lt;init>(Ljava/lang/String;C)V"/>
+ <method name="getConversion()C"/>
+ <method name="getFlags()Ljava/lang/String;"/>
+ </class>
+ <class name="java/util/Formattable" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="formatTo(Ljava/util/Formatter;III)V"/>
+ </class>
+ <class name="java/util/FormattableFlags" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="ALTERNATE"/>
+ <field name="LEFT_JUSTIFY"/>
+ <field name="UPPERCASE"/>
+ </class>
+ <class name="java/util/Formatter" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable"/>
+ <implements name="java/io/Flushable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/io/File;)V"/>
+ <method name="&lt;init>(Ljava/io/File;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/io/File;Ljava/lang/String;Ljava/util/Locale;)V"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;)V"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/lang/String;Ljava/util/Locale;)V"/>
+ <method name="&lt;init>(Ljava/io/PrintStream;)V"/>
+ <method name="&lt;init>(Ljava/lang/Appendable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Appendable;Ljava/util/Locale;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/util/Locale;)V"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V"/>
+ <method name="format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/util/Formatter;"/>
+ <method name="format(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/util/Formatter;"/>
+ <method name="ioException()Ljava/io/IOException;"/>
+ <method name="locale()Ljava/util/Locale;"/>
+ <method name="out()Ljava/lang/Appendable;"/>
+ </class>
+ <class name="java/util/Formatter$BigDecimalLayoutForm" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/util/Formatter$BigDecimalLayoutForm;"/>
+ <method name="values()[Ljava/util/Formatter$BigDecimalLayoutForm;"/>
+ <field name="DECIMAL_FLOAT"/>
+ <field name="SCIENTIFIC"/>
+ </class>
+ <class name="java/util/FormatterClosedException" since="1">
+ <extends name="java/lang/IllegalStateException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/util/GregorianCalendar" since="1">
+ <extends name="java/util/Calendar"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(III)V"/>
+ <method name="&lt;init>(IIIII)V"/>
+ <method name="&lt;init>(IIIIII)V"/>
+ <method name="&lt;init>(Ljava/util/Locale;)V"/>
+ <method name="&lt;init>(Ljava/util/TimeZone;)V"/>
+ <method name="&lt;init>(Ljava/util/TimeZone;Ljava/util/Locale;)V"/>
+ <method name="from(Ljava/time/ZonedDateTime;)Ljava/util/GregorianCalendar;" since="26"/>
+ <method name="getGregorianChange()Ljava/util/Date;"/>
+ <method name="isLeapYear(I)Z"/>
+ <method name="setGregorianChange(Ljava/util/Date;)V"/>
+ <method name="toZonedDateTime()Ljava/time/ZonedDateTime;" since="26"/>
+ <field name="AD"/>
+ <field name="BC"/>
+ </class>
+ <class name="java/util/HashMap" since="1">
+ <extends name="java/util/AbstractMap"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(IF)V"/>
+ <method name="&lt;init>(Ljava/util/Map;)V"/>
+ </class>
+ <class name="java/util/HashSet" since="1">
+ <extends name="java/util/AbstractSet"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(IF)V"/>
+ <method name="&lt;init>(Ljava/util/Collection;)V"/>
+ </class>
+ <class name="java/util/Hashtable" since="1">
+ <extends name="java/util/Dictionary"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="java/util/Map"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(IF)V"/>
+ <method name="&lt;init>(Ljava/util/Map;)V"/>
+ <method name="contains(Ljava/lang/Object;)Z"/>
+ <method name="rehash()V"/>
+ </class>
+ <class name="java/util/IdentityHashMap" since="1">
+ <extends name="java/util/AbstractMap"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Ljava/util/Map;)V"/>
+ </class>
+ <class name="java/util/IllegalFormatCodePointException" since="1">
+ <extends name="java/util/IllegalFormatException"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="getCodePoint()I"/>
+ </class>
+ <class name="java/util/IllegalFormatConversionException" since="1">
+ <extends name="java/util/IllegalFormatException"/>
+ <method name="&lt;init>(CLjava/lang/Class;)V"/>
+ <method name="getArgumentClass()Ljava/lang/Class;"/>
+ <method name="getConversion()C"/>
+ </class>
+ <class name="java/util/IllegalFormatException" since="1">
+ <extends name="java/lang/IllegalArgumentException"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/util/IllegalFormatFlagsException" since="1">
+ <extends name="java/util/IllegalFormatException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getFlags()Ljava/lang/String;"/>
+ </class>
+ <class name="java/util/IllegalFormatPrecisionException" since="1">
+ <extends name="java/util/IllegalFormatException"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="getPrecision()I"/>
+ </class>
+ <class name="java/util/IllegalFormatWidthException" since="1">
+ <extends name="java/util/IllegalFormatException"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="getWidth()I"/>
+ </class>
+ <class name="java/util/IllformedLocaleException" since="21">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="getErrorIndex()I"/>
+ </class>
+ <class name="java/util/InputMismatchException" since="1">
+ <extends name="java/util/NoSuchElementException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/util/IntSummaryStatistics" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/function/IntConsumer"/>
+ <method name="&lt;init>()V"/>
+ <method name="combine(Ljava/util/IntSummaryStatistics;)V"/>
+ <method name="getAverage()D"/>
+ <method name="getCount()J"/>
+ <method name="getMax()I"/>
+ <method name="getMin()I"/>
+ <method name="getSum()J"/>
+ </class>
+ <class name="java/util/InvalidPropertiesFormatException" since="1">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/util/Iterator" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="forEachRemaining(Ljava/util/function/Consumer;)V" since="24"/>
+ <method name="hasNext()Z"/>
+ <method name="next()Ljava/lang/Object;"/>
+ <method name="remove()V"/>
+ </class>
+ <class name="java/util/LinkedHashMap" since="1">
+ <extends name="java/util/HashMap"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(IF)V"/>
+ <method name="&lt;init>(IFZ)V"/>
+ <method name="&lt;init>(Ljava/util/Map;)V"/>
+ <method name="removeEldestEntry(Ljava/util/Map$Entry;)Z"/>
+ </class>
+ <class name="java/util/LinkedHashSet" since="1">
+ <extends name="java/util/HashSet"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(IF)V"/>
+ <method name="&lt;init>(Ljava/util/Collection;)V"/>
+ </class>
+ <class name="java/util/LinkedList" since="1">
+ <extends name="java/util/AbstractSequentialList"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="java/util/Deque" since="9"/>
+ <implements name="java/util/Queue" removed="24"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/util/Collection;)V"/>
+ <method name="addFirst(Ljava/lang/Object;)V"/>
+ <method name="addLast(Ljava/lang/Object;)V"/>
+ <method name="getFirst()Ljava/lang/Object;"/>
+ <method name="getLast()Ljava/lang/Object;"/>
+ <method name="removeFirst()Ljava/lang/Object;"/>
+ <method name="removeLast()Ljava/lang/Object;"/>
+ </class>
+ <class name="java/util/List" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Collection"/>
+ <method name="add(ILjava/lang/Object;)V"/>
+ <method name="addAll(ILjava/util/Collection;)Z"/>
+ <method name="get(I)Ljava/lang/Object;"/>
+ <method name="indexOf(Ljava/lang/Object;)I"/>
+ <method name="lastIndexOf(Ljava/lang/Object;)I"/>
+ <method name="listIterator()Ljava/util/ListIterator;"/>
+ <method name="listIterator(I)Ljava/util/ListIterator;"/>
+ <method name="remove(I)Ljava/lang/Object;"/>
+ <method name="replaceAll(Ljava/util/function/UnaryOperator;)V" since="24"/>
+ <method name="set(ILjava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="sort(Ljava/util/Comparator;)V" since="24"/>
+ <method name="subList(II)Ljava/util/List;"/>
+ </class>
+ <class name="java/util/ListIterator" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Iterator"/>
+ <method name="add(Ljava/lang/Object;)V"/>
+ <method name="hasPrevious()Z"/>
+ <method name="nextIndex()I"/>
+ <method name="previous()Ljava/lang/Object;"/>
+ <method name="previousIndex()I"/>
+ <method name="set(Ljava/lang/Object;)V"/>
+ </class>
+ <class name="java/util/ListResourceBundle" since="1">
+ <extends name="java/util/ResourceBundle"/>
+ <method name="&lt;init>()V"/>
+ <method name="getContents()[[Ljava/lang/Object;"/>
+ </class>
+ <class name="java/util/Locale" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="filter(Ljava/util/List;Ljava/util/Collection;)Ljava/util/List;" since="26"/>
+ <method name="filter(Ljava/util/List;Ljava/util/Collection;Ljava/util/Locale$FilteringMode;)Ljava/util/List;" since="26"/>
+ <method name="filterTags(Ljava/util/List;Ljava/util/Collection;)Ljava/util/List;" since="26"/>
+ <method name="filterTags(Ljava/util/List;Ljava/util/Collection;Ljava/util/Locale$FilteringMode;)Ljava/util/List;" since="26"/>
+ <method name="forLanguageTag(Ljava/lang/String;)Ljava/util/Locale;" since="21"/>
+ <method name="getAvailableLocales()[Ljava/util/Locale;"/>
+ <method name="getCountry()Ljava/lang/String;"/>
+ <method name="getDefault()Ljava/util/Locale;"/>
+ <method name="getDefault(Ljava/util/Locale$Category;)Ljava/util/Locale;" since="24"/>
+ <method name="getDisplayCountry()Ljava/lang/String;"/>
+ <method name="getDisplayCountry(Ljava/util/Locale;)Ljava/lang/String;"/>
+ <method name="getDisplayLanguage()Ljava/lang/String;"/>
+ <method name="getDisplayLanguage(Ljava/util/Locale;)Ljava/lang/String;"/>
+ <method name="getDisplayName()Ljava/lang/String;"/>
+ <method name="getDisplayName(Ljava/util/Locale;)Ljava/lang/String;"/>
+ <method name="getDisplayScript()Ljava/lang/String;" since="21"/>
+ <method name="getDisplayScript(Ljava/util/Locale;)Ljava/lang/String;" since="21"/>
+ <method name="getDisplayVariant()Ljava/lang/String;"/>
+ <method name="getDisplayVariant(Ljava/util/Locale;)Ljava/lang/String;"/>
+ <method name="getExtension(C)Ljava/lang/String;" since="21"/>
+ <method name="getExtensionKeys()Ljava/util/Set;" since="21"/>
+ <method name="getISO3Country()Ljava/lang/String;"/>
+ <method name="getISO3Language()Ljava/lang/String;"/>
+ <method name="getISOCountries()[Ljava/lang/String;"/>
+ <method name="getISOLanguages()[Ljava/lang/String;"/>
+ <method name="getLanguage()Ljava/lang/String;"/>
+ <method name="getScript()Ljava/lang/String;" since="21"/>
+ <method name="getUnicodeLocaleAttributes()Ljava/util/Set;" since="21"/>
+ <method name="getUnicodeLocaleKeys()Ljava/util/Set;" since="21"/>
+ <method name="getUnicodeLocaleType(Ljava/lang/String;)Ljava/lang/String;" since="21"/>
+ <method name="getVariant()Ljava/lang/String;"/>
+ <method name="hasExtensions()Z" since="26"/>
+ <method name="lookup(Ljava/util/List;Ljava/util/Collection;)Ljava/util/Locale;" since="26"/>
+ <method name="lookupTag(Ljava/util/List;Ljava/util/Collection;)Ljava/lang/String;" since="26"/>
+ <method name="setDefault(Ljava/util/Locale$Category;Ljava/util/Locale;)V" since="24"/>
+ <method name="setDefault(Ljava/util/Locale;)V"/>
+ <method name="stripExtensions()Ljava/util/Locale;" since="26"/>
+ <method name="toLanguageTag()Ljava/lang/String;" since="21"/>
+ <field name="CANADA"/>
+ <field name="CANADA_FRENCH"/>
+ <field name="CHINA"/>
+ <field name="CHINESE"/>
+ <field name="ENGLISH"/>
+ <field name="FRANCE"/>
+ <field name="FRENCH"/>
+ <field name="GERMAN"/>
+ <field name="GERMANY"/>
+ <field name="ITALIAN"/>
+ <field name="ITALY"/>
+ <field name="JAPAN"/>
+ <field name="JAPANESE"/>
+ <field name="KOREA"/>
+ <field name="KOREAN"/>
+ <field name="PRC"/>
+ <field name="PRIVATE_USE_EXTENSION" since="21"/>
+ <field name="ROOT" since="9"/>
+ <field name="SIMPLIFIED_CHINESE"/>
+ <field name="TAIWAN"/>
+ <field name="TRADITIONAL_CHINESE"/>
+ <field name="UK"/>
+ <field name="UNICODE_LOCALE_EXTENSION" since="21"/>
+ <field name="US"/>
+ </class>
+ <class name="java/util/Locale$Builder" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addUnicodeLocaleAttribute(Ljava/lang/String;)Ljava/util/Locale$Builder;"/>
+ <method name="build()Ljava/util/Locale;"/>
+ <method name="clear()Ljava/util/Locale$Builder;"/>
+ <method name="clearExtensions()Ljava/util/Locale$Builder;"/>
+ <method name="removeUnicodeLocaleAttribute(Ljava/lang/String;)Ljava/util/Locale$Builder;"/>
+ <method name="setExtension(CLjava/lang/String;)Ljava/util/Locale$Builder;"/>
+ <method name="setLanguage(Ljava/lang/String;)Ljava/util/Locale$Builder;"/>
+ <method name="setLanguageTag(Ljava/lang/String;)Ljava/util/Locale$Builder;"/>
+ <method name="setLocale(Ljava/util/Locale;)Ljava/util/Locale$Builder;"/>
+ <method name="setRegion(Ljava/lang/String;)Ljava/util/Locale$Builder;"/>
+ <method name="setScript(Ljava/lang/String;)Ljava/util/Locale$Builder;"/>
+ <method name="setUnicodeLocaleKeyword(Ljava/lang/String;Ljava/lang/String;)Ljava/util/Locale$Builder;"/>
+ <method name="setVariant(Ljava/lang/String;)Ljava/util/Locale$Builder;"/>
+ </class>
+ <class name="java/util/Locale$Category" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/util/Locale$Category;"/>
+ <method name="values()[Ljava/util/Locale$Category;"/>
+ <field name="DISPLAY"/>
+ <field name="FORMAT"/>
+ </class>
+ <class name="java/util/Locale$FilteringMode" since="26">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/util/Locale$FilteringMode;"/>
+ <method name="values()[Ljava/util/Locale$FilteringMode;"/>
+ <field name="AUTOSELECT_FILTERING"/>
+ <field name="EXTENDED_FILTERING"/>
+ <field name="IGNORE_EXTENDED_RANGES"/>
+ <field name="MAP_EXTENDED_RANGES"/>
+ <field name="REJECT_EXTENDED_RANGES"/>
+ </class>
+ <class name="java/util/Locale$LanguageRange" since="26">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;D)V"/>
+ <method name="getRange()Ljava/lang/String;"/>
+ <method name="getWeight()D"/>
+ <method name="mapEquivalents(Ljava/util/List;Ljava/util/Map;)Ljava/util/List;"/>
+ <method name="parse(Ljava/lang/String;)Ljava/util/List;"/>
+ <method name="parse(Ljava/lang/String;Ljava/util/Map;)Ljava/util/List;"/>
+ <field name="MAX_WEIGHT"/>
+ <field name="MIN_WEIGHT"/>
+ </class>
+ <class name="java/util/LongSummaryStatistics" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/function/IntConsumer"/>
+ <implements name="java/util/function/LongConsumer"/>
+ <method name="&lt;init>()V"/>
+ <method name="combine(Ljava/util/LongSummaryStatistics;)V"/>
+ <method name="getAverage()D"/>
+ <method name="getCount()J"/>
+ <method name="getMax()J"/>
+ <method name="getMin()J"/>
+ <method name="getSum()J"/>
+ </class>
+ <class name="java/util/Map" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="clear()V"/>
+ <method name="compute(Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;" since="24"/>
+ <method name="computeIfAbsent(Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;" since="24"/>
+ <method name="computeIfPresent(Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;" since="24"/>
+ <method name="containsKey(Ljava/lang/Object;)Z"/>
+ <method name="containsValue(Ljava/lang/Object;)Z"/>
+ <method name="entrySet()Ljava/util/Set;"/>
+ <method name="forEach(Ljava/util/function/BiConsumer;)V" since="24"/>
+ <method name="get(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;" since="24"/>
+ <method name="isEmpty()Z"/>
+ <method name="keySet()Ljava/util/Set;"/>
+ <method name="merge(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;" since="24"/>
+ <method name="put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="putAll(Ljava/util/Map;)V"/>
+ <method name="putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;" since="24"/>
+ <method name="remove(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="remove(Ljava/lang/Object;Ljava/lang/Object;)Z" since="24"/>
+ <method name="replace(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;" since="24"/>
+ <method name="replace(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z" since="24"/>
+ <method name="replaceAll(Ljava/util/function/BiFunction;)V" since="24"/>
+ <method name="size()I"/>
+ <method name="values()Ljava/util/Collection;"/>
+ </class>
+ <class name="java/util/Map$Entry" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="comparingByKey()Ljava/util/Comparator;" since="24"/>
+ <method name="comparingByKey(Ljava/util/Comparator;)Ljava/util/Comparator;" since="24"/>
+ <method name="comparingByValue()Ljava/util/Comparator;" since="24"/>
+ <method name="comparingByValue(Ljava/util/Comparator;)Ljava/util/Comparator;" since="24"/>
+ <method name="getKey()Ljava/lang/Object;"/>
+ <method name="getValue()Ljava/lang/Object;"/>
+ <method name="setValue(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ </class>
+ <class name="java/util/MissingFormatArgumentException" since="1">
+ <extends name="java/util/IllegalFormatException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getFormatSpecifier()Ljava/lang/String;"/>
+ </class>
+ <class name="java/util/MissingFormatWidthException" since="1">
+ <extends name="java/util/IllegalFormatException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getFormatSpecifier()Ljava/lang/String;"/>
+ </class>
+ <class name="java/util/MissingResourceException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="getClassName()Ljava/lang/String;"/>
+ <method name="getKey()Ljava/lang/String;"/>
+ </class>
+ <class name="java/util/NavigableMap" since="9">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/SortedMap"/>
+ <method name="ceilingEntry(Ljava/lang/Object;)Ljava/util/Map$Entry;"/>
+ <method name="ceilingKey(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="descendingKeySet()Ljava/util/NavigableSet;"/>
+ <method name="descendingMap()Ljava/util/NavigableMap;"/>
+ <method name="firstEntry()Ljava/util/Map$Entry;"/>
+ <method name="floorEntry(Ljava/lang/Object;)Ljava/util/Map$Entry;"/>
+ <method name="floorKey(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="headMap(Ljava/lang/Object;Z)Ljava/util/NavigableMap;"/>
+ <method name="higherEntry(Ljava/lang/Object;)Ljava/util/Map$Entry;"/>
+ <method name="higherKey(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="lastEntry()Ljava/util/Map$Entry;"/>
+ <method name="lowerEntry(Ljava/lang/Object;)Ljava/util/Map$Entry;"/>
+ <method name="lowerKey(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="navigableKeySet()Ljava/util/NavigableSet;"/>
+ <method name="pollFirstEntry()Ljava/util/Map$Entry;"/>
+ <method name="pollLastEntry()Ljava/util/Map$Entry;"/>
+ <method name="subMap(Ljava/lang/Object;ZLjava/lang/Object;Z)Ljava/util/NavigableMap;"/>
+ <method name="tailMap(Ljava/lang/Object;Z)Ljava/util/NavigableMap;"/>
+ </class>
+ <class name="java/util/NavigableSet" since="9">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/SortedSet"/>
+ <method name="ceiling(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="descendingIterator()Ljava/util/Iterator;"/>
+ <method name="descendingSet()Ljava/util/NavigableSet;"/>
+ <method name="floor(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="headSet(Ljava/lang/Object;Z)Ljava/util/NavigableSet;"/>
+ <method name="higher(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="lower(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="pollFirst()Ljava/lang/Object;"/>
+ <method name="pollLast()Ljava/lang/Object;"/>
+ <method name="subSet(Ljava/lang/Object;ZLjava/lang/Object;Z)Ljava/util/NavigableSet;"/>
+ <method name="tailSet(Ljava/lang/Object;Z)Ljava/util/NavigableSet;"/>
+ </class>
+ <class name="java/util/NoSuchElementException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/util/Objects" since="19">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="compare(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/Comparator;)I"/>
+ <method name="deepEquals(Ljava/lang/Object;Ljava/lang/Object;)Z"/>
+ <method name="equals(Ljava/lang/Object;Ljava/lang/Object;)Z"/>
+ <method name="hash([Ljava/lang/Object;)I"/>
+ <method name="hashCode(Ljava/lang/Object;)I"/>
+ <method name="isNull(Ljava/lang/Object;)Z" since="24"/>
+ <method name="nonNull(Ljava/lang/Object;)Z" since="24"/>
+ <method name="requireNonNull(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="requireNonNull(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="requireNonNull(Ljava/lang/Object;Ljava/util/function/Supplier;)Ljava/lang/Object;" since="24"/>
+ <method name="toString(Ljava/lang/Object;)Ljava/lang/String;"/>
+ <method name="toString(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/String;"/>
+ </class>
+ <class name="java/util/Observable" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addObserver(Ljava/util/Observer;)V"/>
+ <method name="clearChanged()V"/>
+ <method name="countObservers()I"/>
+ <method name="deleteObserver(Ljava/util/Observer;)V"/>
+ <method name="deleteObservers()V"/>
+ <method name="hasChanged()Z"/>
+ <method name="notifyObservers()V"/>
+ <method name="notifyObservers(Ljava/lang/Object;)V"/>
+ <method name="setChanged()V"/>
+ </class>
+ <class name="java/util/Observer" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="update(Ljava/util/Observable;Ljava/lang/Object;)V"/>
+ </class>
+ <class name="java/util/Optional" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="empty()Ljava/util/Optional;"/>
+ <method name="filter(Ljava/util/function/Predicate;)Ljava/util/Optional;"/>
+ <method name="flatMap(Ljava/util/function/Function;)Ljava/util/Optional;"/>
+ <method name="get()Ljava/lang/Object;"/>
+ <method name="ifPresent(Ljava/util/function/Consumer;)V"/>
+ <method name="isPresent()Z"/>
+ <method name="map(Ljava/util/function/Function;)Ljava/util/Optional;"/>
+ <method name="of(Ljava/lang/Object;)Ljava/util/Optional;"/>
+ <method name="ofNullable(Ljava/lang/Object;)Ljava/util/Optional;"/>
+ <method name="orElse(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="orElseGet(Ljava/util/function/Supplier;)Ljava/lang/Object;"/>
+ <method name="orElseThrow(Ljava/util/function/Supplier;)Ljava/lang/Object;"/>
+ </class>
+ <class name="java/util/OptionalDouble" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="empty()Ljava/util/OptionalDouble;"/>
+ <method name="getAsDouble()D"/>
+ <method name="ifPresent(Ljava/util/function/DoubleConsumer;)V"/>
+ <method name="isPresent()Z"/>
+ <method name="of(D)Ljava/util/OptionalDouble;"/>
+ <method name="orElse(D)D"/>
+ <method name="orElseGet(Ljava/util/function/DoubleSupplier;)D"/>
+ <method name="orElseThrow(Ljava/util/function/Supplier;)D"/>
+ </class>
+ <class name="java/util/OptionalInt" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="empty()Ljava/util/OptionalInt;"/>
+ <method name="getAsInt()I"/>
+ <method name="ifPresent(Ljava/util/function/IntConsumer;)V"/>
+ <method name="isPresent()Z"/>
+ <method name="of(I)Ljava/util/OptionalInt;"/>
+ <method name="orElse(I)I"/>
+ <method name="orElseGet(Ljava/util/function/IntSupplier;)I"/>
+ <method name="orElseThrow(Ljava/util/function/Supplier;)I"/>
+ </class>
+ <class name="java/util/OptionalLong" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="empty()Ljava/util/OptionalLong;"/>
+ <method name="getAsLong()J"/>
+ <method name="ifPresent(Ljava/util/function/LongConsumer;)V"/>
+ <method name="isPresent()Z"/>
+ <method name="of(J)Ljava/util/OptionalLong;"/>
+ <method name="orElse(J)J"/>
+ <method name="orElseGet(Ljava/util/function/LongSupplier;)J"/>
+ <method name="orElseThrow(Ljava/util/function/Supplier;)J"/>
+ </class>
+ <class name="java/util/PrimitiveIterator" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Iterator"/>
+ <method name="forEachRemaining(Ljava/lang/Object;)V"/>
+ </class>
+ <class name="java/util/PrimitiveIterator$OfDouble" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/PrimitiveIterator"/>
+ <method name="forEachRemaining(Ljava/util/function/DoubleConsumer;)V"/>
+ <method name="next()Ljava/lang/Double;"/>
+ <method name="nextDouble()D"/>
+ </class>
+ <class name="java/util/PrimitiveIterator$OfInt" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/PrimitiveIterator"/>
+ <method name="forEachRemaining(Ljava/util/function/IntConsumer;)V"/>
+ <method name="next()Ljava/lang/Integer;"/>
+ <method name="nextInt()I"/>
+ </class>
+ <class name="java/util/PrimitiveIterator$OfLong" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/PrimitiveIterator"/>
+ <method name="forEachRemaining(Ljava/util/function/LongConsumer;)V"/>
+ <method name="next()Ljava/lang/Long;"/>
+ <method name="nextLong()J"/>
+ </class>
+ <class name="java/util/PriorityQueue" since="1">
+ <extends name="java/util/AbstractQueue"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(ILjava/util/Comparator;)V"/>
+ <method name="&lt;init>(Ljava/util/Collection;)V"/>
+ <method name="&lt;init>(Ljava/util/Comparator;)V" since="24"/>
+ <method name="&lt;init>(Ljava/util/PriorityQueue;)V"/>
+ <method name="&lt;init>(Ljava/util/SortedSet;)V"/>
+ <method name="comparator()Ljava/util/Comparator;"/>
+ </class>
+ <class name="java/util/Properties" since="1">
+ <extends name="java/util/Hashtable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/util/Properties;)V"/>
+ <method name="getProperty(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="list(Ljava/io/PrintStream;)V"/>
+ <method name="list(Ljava/io/PrintWriter;)V"/>
+ <method name="load(Ljava/io/InputStream;)V"/>
+ <method name="load(Ljava/io/Reader;)V" since="9"/>
+ <method name="loadFromXML(Ljava/io/InputStream;)V"/>
+ <method name="propertyNames()Ljava/util/Enumeration;"/>
+ <method name="save(Ljava/io/OutputStream;Ljava/lang/String;)V" deprecated="16"/>
+ <method name="setProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="store(Ljava/io/OutputStream;Ljava/lang/String;)V"/>
+ <method name="store(Ljava/io/Writer;Ljava/lang/String;)V" since="9"/>
+ <method name="storeToXML(Ljava/io/OutputStream;Ljava/lang/String;)V"/>
+ <method name="storeToXML(Ljava/io/OutputStream;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="stringPropertyNames()Ljava/util/Set;" since="9"/>
+ <field name="defaults"/>
+ </class>
+ <class name="java/util/PropertyPermission" since="1">
+ <extends name="java/security/BasicPermission"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/util/PropertyResourceBundle" since="1">
+ <extends name="java/util/ResourceBundle"/>
+ <method name="&lt;init>(Ljava/io/InputStream;)V"/>
+ <method name="&lt;init>(Ljava/io/Reader;)V" since="9"/>
+ </class>
+ <class name="java/util/Queue" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Collection"/>
+ <method name="element()Ljava/lang/Object;"/>
+ <method name="offer(Ljava/lang/Object;)Z"/>
+ <method name="peek()Ljava/lang/Object;"/>
+ <method name="poll()Ljava/lang/Object;"/>
+ <method name="remove()Ljava/lang/Object;"/>
+ </class>
+ <class name="java/util/Random" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(J)V"/>
+ <method name="doubles()Ljava/util/stream/DoubleStream;" since="24"/>
+ <method name="doubles(DD)Ljava/util/stream/DoubleStream;" since="24"/>
+ <method name="doubles(J)Ljava/util/stream/DoubleStream;" since="24"/>
+ <method name="doubles(JDD)Ljava/util/stream/DoubleStream;" since="24"/>
+ <method name="ints()Ljava/util/stream/IntStream;" since="24"/>
+ <method name="ints(II)Ljava/util/stream/IntStream;" since="24"/>
+ <method name="ints(J)Ljava/util/stream/IntStream;" since="24"/>
+ <method name="ints(JII)Ljava/util/stream/IntStream;" since="24"/>
+ <method name="longs()Ljava/util/stream/LongStream;" since="24"/>
+ <method name="longs(J)Ljava/util/stream/LongStream;" since="24"/>
+ <method name="longs(JJ)Ljava/util/stream/LongStream;" since="24"/>
+ <method name="longs(JJJ)Ljava/util/stream/LongStream;" since="24"/>
+ <method name="next(I)I"/>
+ <method name="nextBoolean()Z"/>
+ <method name="nextBytes([B)V"/>
+ <method name="nextDouble()D"/>
+ <method name="nextFloat()F"/>
+ <method name="nextGaussian()D"/>
+ <method name="nextInt()I"/>
+ <method name="nextInt(I)I"/>
+ <method name="nextLong()J"/>
+ <method name="setSeed(J)V"/>
+ </class>
+ <class name="java/util/RandomAccess" since="1">
+ <extends name="java/lang/Object"/>
+ </class>
+ <class name="java/util/ResourceBundle" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="clearCache()V" since="9"/>
+ <method name="clearCache(Ljava/lang/ClassLoader;)V" since="9"/>
+ <method name="containsKey(Ljava/lang/String;)Z" since="9"/>
+ <method name="getBaseBundleName()Ljava/lang/String;" since="26"/>
+ <method name="getBundle(Ljava/lang/String;)Ljava/util/ResourceBundle;"/>
+ <method name="getBundle(Ljava/lang/String;Ljava/util/Locale;)Ljava/util/ResourceBundle;"/>
+ <method name="getBundle(Ljava/lang/String;Ljava/util/Locale;Ljava/lang/ClassLoader;)Ljava/util/ResourceBundle;"/>
+ <method name="getBundle(Ljava/lang/String;Ljava/util/Locale;Ljava/lang/ClassLoader;Ljava/util/ResourceBundle$Control;)Ljava/util/ResourceBundle;" since="9"/>
+ <method name="getBundle(Ljava/lang/String;Ljava/util/Locale;Ljava/util/ResourceBundle$Control;)Ljava/util/ResourceBundle;" since="9"/>
+ <method name="getBundle(Ljava/lang/String;Ljava/util/ResourceBundle$Control;)Ljava/util/ResourceBundle;" since="9"/>
+ <method name="getKeys()Ljava/util/Enumeration;"/>
+ <method name="getLocale()Ljava/util/Locale;"/>
+ <method name="getObject(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="getString(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getStringArray(Ljava/lang/String;)[Ljava/lang/String;"/>
+ <method name="handleGetObject(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="handleKeySet()Ljava/util/Set;" since="9"/>
+ <method name="keySet()Ljava/util/Set;" since="9"/>
+ <method name="setParent(Ljava/util/ResourceBundle;)V"/>
+ <field name="parent"/>
+ </class>
+ <class name="java/util/ResourceBundle$Control" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCandidateLocales(Ljava/lang/String;Ljava/util/Locale;)Ljava/util/List;"/>
+ <method name="getControl(Ljava/util/List;)Ljava/util/ResourceBundle$Control;"/>
+ <method name="getFallbackLocale(Ljava/lang/String;Ljava/util/Locale;)Ljava/util/Locale;"/>
+ <method name="getFormats(Ljava/lang/String;)Ljava/util/List;"/>
+ <method name="getNoFallbackControl(Ljava/util/List;)Ljava/util/ResourceBundle$Control;"/>
+ <method name="getTimeToLive(Ljava/lang/String;Ljava/util/Locale;)J"/>
+ <method name="needsReload(Ljava/lang/String;Ljava/util/Locale;Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/util/ResourceBundle;J)Z"/>
+ <method name="newBundle(Ljava/lang/String;Ljava/util/Locale;Ljava/lang/String;Ljava/lang/ClassLoader;Z)Ljava/util/ResourceBundle;"/>
+ <method name="toBundleName(Ljava/lang/String;Ljava/util/Locale;)Ljava/lang/String;"/>
+ <method name="toResourceName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <field name="FORMAT_CLASS"/>
+ <field name="FORMAT_DEFAULT"/>
+ <field name="FORMAT_PROPERTIES"/>
+ <field name="TTL_DONT_CACHE"/>
+ <field name="TTL_NO_EXPIRATION_CONTROL"/>
+ </class>
+ <class name="java/util/Scanner" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable" since="19"/>
+ <implements name="java/util/Iterator"/>
+ <method name="&lt;init>(Ljava/io/File;)V"/>
+ <method name="&lt;init>(Ljava/io/File;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/io/InputStream;)V"/>
+ <method name="&lt;init>(Ljava/io/InputStream;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/Readable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/nio/channels/ReadableByteChannel;)V"/>
+ <method name="&lt;init>(Ljava/nio/channels/ReadableByteChannel;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/nio/file/Path;)V" since="26"/>
+ <method name="&lt;init>(Ljava/nio/file/Path;Ljava/lang/String;)V" since="26"/>
+ <method name="close()V"/>
+ <method name="delimiter()Ljava/util/regex/Pattern;"/>
+ <method name="findInLine(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="findInLine(Ljava/util/regex/Pattern;)Ljava/lang/String;"/>
+ <method name="findWithinHorizon(Ljava/lang/String;I)Ljava/lang/String;"/>
+ <method name="findWithinHorizon(Ljava/util/regex/Pattern;I)Ljava/lang/String;"/>
+ <method name="hasNext(Ljava/lang/String;)Z"/>
+ <method name="hasNext(Ljava/util/regex/Pattern;)Z"/>
+ <method name="hasNextBigDecimal()Z"/>
+ <method name="hasNextBigInteger()Z"/>
+ <method name="hasNextBigInteger(I)Z"/>
+ <method name="hasNextBoolean()Z"/>
+ <method name="hasNextByte()Z"/>
+ <method name="hasNextByte(I)Z"/>
+ <method name="hasNextDouble()Z"/>
+ <method name="hasNextFloat()Z"/>
+ <method name="hasNextInt()Z"/>
+ <method name="hasNextInt(I)Z"/>
+ <method name="hasNextLine()Z"/>
+ <method name="hasNextLong()Z"/>
+ <method name="hasNextLong(I)Z"/>
+ <method name="hasNextShort()Z"/>
+ <method name="hasNextShort(I)Z"/>
+ <method name="ioException()Ljava/io/IOException;"/>
+ <method name="locale()Ljava/util/Locale;"/>
+ <method name="match()Ljava/util/regex/MatchResult;"/>
+ <method name="next()Ljava/lang/String;"/>
+ <method name="next(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="next(Ljava/util/regex/Pattern;)Ljava/lang/String;"/>
+ <method name="nextBigDecimal()Ljava/math/BigDecimal;"/>
+ <method name="nextBigInteger()Ljava/math/BigInteger;"/>
+ <method name="nextBigInteger(I)Ljava/math/BigInteger;"/>
+ <method name="nextBoolean()Z"/>
+ <method name="nextByte()B"/>
+ <method name="nextByte(I)B"/>
+ <method name="nextDouble()D"/>
+ <method name="nextFloat()F"/>
+ <method name="nextInt()I"/>
+ <method name="nextInt(I)I"/>
+ <method name="nextLine()Ljava/lang/String;"/>
+ <method name="nextLong()J"/>
+ <method name="nextLong(I)J"/>
+ <method name="nextShort()S"/>
+ <method name="nextShort(I)S"/>
+ <method name="radix()I"/>
+ <method name="reset()Ljava/util/Scanner;" since="9"/>
+ <method name="skip(Ljava/lang/String;)Ljava/util/Scanner;"/>
+ <method name="skip(Ljava/util/regex/Pattern;)Ljava/util/Scanner;"/>
+ <method name="useDelimiter(Ljava/lang/String;)Ljava/util/Scanner;"/>
+ <method name="useDelimiter(Ljava/util/regex/Pattern;)Ljava/util/Scanner;"/>
+ <method name="useLocale(Ljava/util/Locale;)Ljava/util/Scanner;"/>
+ <method name="useRadix(I)Ljava/util/Scanner;"/>
+ </class>
+ <class name="java/util/ServiceConfigurationError" since="9">
+ <extends name="java/lang/Error"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/util/ServiceLoader" since="9">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Iterable"/>
+ <method name="&lt;init>()V"/>
+ <method name="load(Ljava/lang/Class;)Ljava/util/ServiceLoader;"/>
+ <method name="load(Ljava/lang/Class;Ljava/lang/ClassLoader;)Ljava/util/ServiceLoader;"/>
+ <method name="loadInstalled(Ljava/lang/Class;)Ljava/util/ServiceLoader;"/>
+ <method name="reload()V"/>
+ </class>
+ <class name="java/util/Set" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Collection"/>
+ </class>
+ <class name="java/util/SimpleTimeZone" since="1">
+ <extends name="java/util/TimeZone"/>
+ <method name="&lt;init>(ILjava/lang/String;)V"/>
+ <method name="&lt;init>(ILjava/lang/String;IIIIIIII)V"/>
+ <method name="&lt;init>(ILjava/lang/String;IIIIIIIII)V"/>
+ <method name="&lt;init>(ILjava/lang/String;IIIIIIIIIII)V"/>
+ <method name="setDSTSavings(I)V"/>
+ <method name="setEndRule(III)V"/>
+ <method name="setEndRule(IIII)V"/>
+ <method name="setEndRule(IIIIZ)V"/>
+ <method name="setStartRule(III)V"/>
+ <method name="setStartRule(IIII)V"/>
+ <method name="setStartRule(IIIIZ)V"/>
+ <method name="setStartYear(I)V"/>
+ <field name="STANDARD_TIME"/>
+ <field name="UTC_TIME"/>
+ <field name="WALL_TIME"/>
+ </class>
+ <class name="java/util/SortedMap" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Map"/>
+ <method name="comparator()Ljava/util/Comparator;"/>
+ <method name="firstKey()Ljava/lang/Object;"/>
+ <method name="headMap(Ljava/lang/Object;)Ljava/util/SortedMap;"/>
+ <method name="lastKey()Ljava/lang/Object;"/>
+ <method name="subMap(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/SortedMap;"/>
+ <method name="tailMap(Ljava/lang/Object;)Ljava/util/SortedMap;"/>
+ </class>
+ <class name="java/util/SortedSet" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Set"/>
+ <method name="comparator()Ljava/util/Comparator;"/>
+ <method name="first()Ljava/lang/Object;"/>
+ <method name="headSet(Ljava/lang/Object;)Ljava/util/SortedSet;"/>
+ <method name="last()Ljava/lang/Object;"/>
+ <method name="subSet(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/SortedSet;"/>
+ <method name="tailSet(Ljava/lang/Object;)Ljava/util/SortedSet;"/>
+ </class>
+ <class name="java/util/Spliterator" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="characteristics()I"/>
+ <method name="estimateSize()J"/>
+ <method name="forEachRemaining(Ljava/util/function/Consumer;)V"/>
+ <method name="getComparator()Ljava/util/Comparator;"/>
+ <method name="getExactSizeIfKnown()J"/>
+ <method name="hasCharacteristics(I)Z"/>
+ <method name="tryAdvance(Ljava/util/function/Consumer;)Z"/>
+ <method name="trySplit()Ljava/util/Spliterator;"/>
+ <field name="CONCURRENT"/>
+ <field name="DISTINCT"/>
+ <field name="IMMUTABLE"/>
+ <field name="NONNULL"/>
+ <field name="ORDERED"/>
+ <field name="SIZED"/>
+ <field name="SORTED"/>
+ <field name="SUBSIZED"/>
+ </class>
+ <class name="java/util/Spliterator$OfDouble" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Spliterator$OfPrimitive"/>
+ <method name="forEachRemaining(Ljava/util/function/DoubleConsumer;)V"/>
+ <method name="tryAdvance(Ljava/util/function/DoubleConsumer;)Z"/>
+ <method name="trySplit()Ljava/util/Spliterator$OfDouble;"/>
+ </class>
+ <class name="java/util/Spliterator$OfInt" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Spliterator$OfPrimitive"/>
+ <method name="forEachRemaining(Ljava/util/function/IntConsumer;)V"/>
+ <method name="tryAdvance(Ljava/util/function/IntConsumer;)Z"/>
+ <method name="trySplit()Ljava/util/Spliterator$OfInt;"/>
+ </class>
+ <class name="java/util/Spliterator$OfLong" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Spliterator$OfPrimitive"/>
+ <method name="forEachRemaining(Ljava/util/function/LongConsumer;)V"/>
+ <method name="tryAdvance(Ljava/util/function/LongConsumer;)Z"/>
+ <method name="trySplit()Ljava/util/Spliterator$OfLong;"/>
+ </class>
+ <class name="java/util/Spliterator$OfPrimitive" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Spliterator"/>
+ <method name="forEachRemaining(Ljava/lang/Object;)V"/>
+ <method name="tryAdvance(Ljava/lang/Object;)Z"/>
+ <method name="trySplit()Ljava/util/Spliterator$OfPrimitive;"/>
+ </class>
+ <class name="java/util/Spliterators" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="emptyDoubleSpliterator()Ljava/util/Spliterator$OfDouble;"/>
+ <method name="emptyIntSpliterator()Ljava/util/Spliterator$OfInt;"/>
+ <method name="emptyLongSpliterator()Ljava/util/Spliterator$OfLong;"/>
+ <method name="emptySpliterator()Ljava/util/Spliterator;"/>
+ <method name="iterator(Ljava/util/Spliterator$OfDouble;)Ljava/util/PrimitiveIterator$OfDouble;"/>
+ <method name="iterator(Ljava/util/Spliterator$OfInt;)Ljava/util/PrimitiveIterator$OfInt;"/>
+ <method name="iterator(Ljava/util/Spliterator$OfLong;)Ljava/util/PrimitiveIterator$OfLong;"/>
+ <method name="iterator(Ljava/util/Spliterator;)Ljava/util/Iterator;"/>
+ <method name="spliterator(Ljava/util/Collection;I)Ljava/util/Spliterator;"/>
+ <method name="spliterator(Ljava/util/Iterator;JI)Ljava/util/Spliterator;"/>
+ <method name="spliterator(Ljava/util/PrimitiveIterator$OfDouble;JI)Ljava/util/Spliterator$OfDouble;"/>
+ <method name="spliterator(Ljava/util/PrimitiveIterator$OfInt;JI)Ljava/util/Spliterator$OfInt;"/>
+ <method name="spliterator(Ljava/util/PrimitiveIterator$OfLong;JI)Ljava/util/Spliterator$OfLong;"/>
+ <method name="spliterator([DI)Ljava/util/Spliterator$OfDouble;"/>
+ <method name="spliterator([DIII)Ljava/util/Spliterator$OfDouble;"/>
+ <method name="spliterator([II)Ljava/util/Spliterator$OfInt;"/>
+ <method name="spliterator([IIII)Ljava/util/Spliterator$OfInt;"/>
+ <method name="spliterator([JI)Ljava/util/Spliterator$OfLong;"/>
+ <method name="spliterator([JIII)Ljava/util/Spliterator$OfLong;"/>
+ <method name="spliterator([Ljava/lang/Object;I)Ljava/util/Spliterator;"/>
+ <method name="spliterator([Ljava/lang/Object;III)Ljava/util/Spliterator;"/>
+ <method name="spliteratorUnknownSize(Ljava/util/Iterator;I)Ljava/util/Spliterator;"/>
+ <method name="spliteratorUnknownSize(Ljava/util/PrimitiveIterator$OfDouble;I)Ljava/util/Spliterator$OfDouble;"/>
+ <method name="spliteratorUnknownSize(Ljava/util/PrimitiveIterator$OfInt;I)Ljava/util/Spliterator$OfInt;"/>
+ <method name="spliteratorUnknownSize(Ljava/util/PrimitiveIterator$OfLong;I)Ljava/util/Spliterator$OfLong;"/>
+ </class>
+ <class name="java/util/Spliterators$AbstractDoubleSpliterator" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Spliterator$OfDouble"/>
+ <method name="&lt;init>(JI)V"/>
+ </class>
+ <class name="java/util/Spliterators$AbstractIntSpliterator" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Spliterator$OfInt"/>
+ <method name="&lt;init>(JI)V"/>
+ </class>
+ <class name="java/util/Spliterators$AbstractLongSpliterator" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Spliterator$OfLong"/>
+ <method name="&lt;init>(JI)V"/>
+ </class>
+ <class name="java/util/Spliterators$AbstractSpliterator" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Spliterator"/>
+ <method name="&lt;init>(JI)V"/>
+ </class>
+ <class name="java/util/SplittableRandom" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(J)V"/>
+ <method name="doubles()Ljava/util/stream/DoubleStream;"/>
+ <method name="doubles(DD)Ljava/util/stream/DoubleStream;"/>
+ <method name="doubles(J)Ljava/util/stream/DoubleStream;"/>
+ <method name="doubles(JDD)Ljava/util/stream/DoubleStream;"/>
+ <method name="ints()Ljava/util/stream/IntStream;"/>
+ <method name="ints(II)Ljava/util/stream/IntStream;"/>
+ <method name="ints(J)Ljava/util/stream/IntStream;"/>
+ <method name="ints(JII)Ljava/util/stream/IntStream;"/>
+ <method name="longs()Ljava/util/stream/LongStream;"/>
+ <method name="longs(J)Ljava/util/stream/LongStream;"/>
+ <method name="longs(JJ)Ljava/util/stream/LongStream;"/>
+ <method name="longs(JJJ)Ljava/util/stream/LongStream;"/>
+ <method name="nextBoolean()Z"/>
+ <method name="nextDouble()D"/>
+ <method name="nextDouble(D)D"/>
+ <method name="nextDouble(DD)D"/>
+ <method name="nextInt()I"/>
+ <method name="nextInt(I)I"/>
+ <method name="nextInt(II)I"/>
+ <method name="nextLong()J"/>
+ <method name="nextLong(J)J"/>
+ <method name="nextLong(JJ)J"/>
+ <method name="split()Ljava/util/SplittableRandom;"/>
+ </class>
+ <class name="java/util/Stack" since="1">
+ <extends name="java/util/Vector"/>
+ <method name="&lt;init>()V"/>
+ <method name="empty()Z"/>
+ <method name="peek()Ljava/lang/Object;"/>
+ <method name="pop()Ljava/lang/Object;"/>
+ <method name="push(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="search(Ljava/lang/Object;)I"/>
+ </class>
+ <class name="java/util/StringJoiner" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;)V"/>
+ <method name="&lt;init>(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;)V"/>
+ <method name="add(Ljava/lang/CharSequence;)Ljava/util/StringJoiner;"/>
+ <method name="length()I"/>
+ <method name="merge(Ljava/util/StringJoiner;)Ljava/util/StringJoiner;"/>
+ <method name="setEmptyValue(Ljava/lang/CharSequence;)Ljava/util/StringJoiner;"/>
+ </class>
+ <class name="java/util/StringTokenizer" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Enumeration"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Z)V"/>
+ <method name="countTokens()I"/>
+ <method name="hasMoreTokens()Z"/>
+ <method name="nextToken()Ljava/lang/String;"/>
+ <method name="nextToken(Ljava/lang/String;)Ljava/lang/String;"/>
+ </class>
+ <class name="java/util/TimeZone" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAvailableIDs()[Ljava/lang/String;"/>
+ <method name="getAvailableIDs(I)[Ljava/lang/String;"/>
+ <method name="getDSTSavings()I"/>
+ <method name="getDefault()Ljava/util/TimeZone;"/>
+ <method name="getDisplayName()Ljava/lang/String;"/>
+ <method name="getDisplayName(Ljava/util/Locale;)Ljava/lang/String;"/>
+ <method name="getDisplayName(ZI)Ljava/lang/String;"/>
+ <method name="getDisplayName(ZILjava/util/Locale;)Ljava/lang/String;"/>
+ <method name="getID()Ljava/lang/String;"/>
+ <method name="getOffset(IIIIII)I"/>
+ <method name="getOffset(J)I"/>
+ <method name="getRawOffset()I"/>
+ <method name="getTimeZone(Ljava/lang/String;)Ljava/util/TimeZone;"/>
+ <method name="getTimeZone(Ljava/time/ZoneId;)Ljava/util/TimeZone;" since="26"/>
+ <method name="hasSameRules(Ljava/util/TimeZone;)Z"/>
+ <method name="inDaylightTime(Ljava/util/Date;)Z"/>
+ <method name="observesDaylightTime()Z" since="24"/>
+ <method name="setDefault(Ljava/util/TimeZone;)V"/>
+ <method name="setID(Ljava/lang/String;)V"/>
+ <method name="setRawOffset(I)V"/>
+ <method name="toZoneId()Ljava/time/ZoneId;" since="26"/>
+ <method name="useDaylightTime()Z"/>
+ <field name="LONG"/>
+ <field name="SHORT"/>
+ </class>
+ <class name="java/util/Timer" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Z)V"/>
+ <method name="&lt;init>(Z)V"/>
+ <method name="cancel()V"/>
+ <method name="purge()I"/>
+ <method name="schedule(Ljava/util/TimerTask;J)V"/>
+ <method name="schedule(Ljava/util/TimerTask;JJ)V"/>
+ <method name="schedule(Ljava/util/TimerTask;Ljava/util/Date;)V"/>
+ <method name="schedule(Ljava/util/TimerTask;Ljava/util/Date;J)V"/>
+ <method name="scheduleAtFixedRate(Ljava/util/TimerTask;JJ)V"/>
+ <method name="scheduleAtFixedRate(Ljava/util/TimerTask;Ljava/util/Date;J)V"/>
+ </class>
+ <class name="java/util/TimerTask" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Runnable"/>
+ <method name="&lt;init>()V"/>
+ <method name="cancel()Z"/>
+ <method name="scheduledExecutionTime()J"/>
+ </class>
+ <class name="java/util/TooManyListenersException" since="1">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/util/TreeMap" since="1">
+ <extends name="java/util/AbstractMap"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="java/util/NavigableMap" since="9"/>
+ <implements name="java/util/SortedMap" removed="24"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/util/Comparator;)V"/>
+ <method name="&lt;init>(Ljava/util/Map;)V"/>
+ <method name="&lt;init>(Ljava/util/SortedMap;)V"/>
+ </class>
+ <class name="java/util/TreeSet" since="1">
+ <extends name="java/util/AbstractSet"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="java/util/NavigableSet" since="9"/>
+ <implements name="java/util/SortedSet" removed="9"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/util/Collection;)V"/>
+ <method name="&lt;init>(Ljava/util/Comparator;)V"/>
+ <method name="&lt;init>(Ljava/util/SortedSet;)V"/>
+ </class>
+ <class name="java/util/UUID" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="&lt;init>(JJ)V"/>
+ <method name="clockSequence()I"/>
+ <method name="compareTo(Ljava/util/UUID;)I"/>
+ <method name="fromString(Ljava/lang/String;)Ljava/util/UUID;"/>
+ <method name="getLeastSignificantBits()J"/>
+ <method name="getMostSignificantBits()J"/>
+ <method name="nameUUIDFromBytes([B)Ljava/util/UUID;"/>
+ <method name="node()J"/>
+ <method name="randomUUID()Ljava/util/UUID;"/>
+ <method name="timestamp()J"/>
+ <method name="variant()I"/>
+ <method name="version()I"/>
+ </class>
+ <class name="java/util/UnknownFormatConversionException" since="1">
+ <extends name="java/util/IllegalFormatException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getConversion()Ljava/lang/String;"/>
+ </class>
+ <class name="java/util/UnknownFormatFlagsException" since="1">
+ <extends name="java/util/IllegalFormatException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getFlags()Ljava/lang/String;"/>
+ </class>
+ <class name="java/util/Vector" since="1">
+ <extends name="java/util/AbstractList"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="java/util/RandomAccess"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="&lt;init>(Ljava/util/Collection;)V"/>
+ <method name="addElement(Ljava/lang/Object;)V"/>
+ <method name="capacity()I"/>
+ <method name="copyInto([Ljava/lang/Object;)V"/>
+ <method name="elementAt(I)Ljava/lang/Object;"/>
+ <method name="elements()Ljava/util/Enumeration;"/>
+ <method name="ensureCapacity(I)V"/>
+ <method name="firstElement()Ljava/lang/Object;"/>
+ <method name="indexOf(Ljava/lang/Object;I)I"/>
+ <method name="insertElementAt(Ljava/lang/Object;I)V"/>
+ <method name="lastElement()Ljava/lang/Object;"/>
+ <method name="lastIndexOf(Ljava/lang/Object;I)I"/>
+ <method name="removeAllElements()V"/>
+ <method name="removeElement(Ljava/lang/Object;)Z"/>
+ <method name="removeElementAt(I)V"/>
+ <method name="setElementAt(Ljava/lang/Object;I)V"/>
+ <method name="setSize(I)V"/>
+ <method name="trimToSize()V"/>
+ <field name="capacityIncrement"/>
+ <field name="elementCount"/>
+ <field name="elementData"/>
+ </class>
+ <class name="java/util/WeakHashMap" since="1">
+ <extends name="java/util/AbstractMap"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(IF)V"/>
+ <method name="&lt;init>(Ljava/util/Map;)V"/>
+ </class>
+ <class name="java/util/concurrent/AbstractExecutorService" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/concurrent/ExecutorService"/>
+ <method name="&lt;init>()V"/>
+ <method name="newTaskFor(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/RunnableFuture;" since="9"/>
+ <method name="newTaskFor(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/RunnableFuture;" since="9"/>
+ </class>
+ <class name="java/util/concurrent/ArrayBlockingQueue" since="1">
+ <extends name="java/util/AbstractQueue"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/util/concurrent/BlockingQueue"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(IZ)V"/>
+ <method name="&lt;init>(IZLjava/util/Collection;)V"/>
+ </class>
+ <class name="java/util/concurrent/BlockingDeque" since="9">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Deque"/>
+ <implements name="java/util/concurrent/BlockingQueue"/>
+ <method name="offerFirst(Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;)Z"/>
+ <method name="offerLast(Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;)Z"/>
+ <method name="pollFirst(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;"/>
+ <method name="pollLast(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;"/>
+ <method name="putFirst(Ljava/lang/Object;)V"/>
+ <method name="putLast(Ljava/lang/Object;)V"/>
+ <method name="takeFirst()Ljava/lang/Object;"/>
+ <method name="takeLast()Ljava/lang/Object;"/>
+ </class>
+ <class name="java/util/concurrent/BlockingQueue" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Queue"/>
+ <method name="drainTo(Ljava/util/Collection;)I"/>
+ <method name="drainTo(Ljava/util/Collection;I)I"/>
+ <method name="offer(Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;)Z"/>
+ <method name="poll(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;"/>
+ <method name="put(Ljava/lang/Object;)V"/>
+ <method name="remainingCapacity()I"/>
+ <method name="take()Ljava/lang/Object;"/>
+ </class>
+ <class name="java/util/concurrent/BrokenBarrierException" since="1">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/util/concurrent/Callable" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="call()Ljava/lang/Object;"/>
+ </class>
+ <class name="java/util/concurrent/CancellationException" since="1">
+ <extends name="java/lang/IllegalStateException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/util/concurrent/CompletableFuture" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/concurrent/CompletionStage"/>
+ <implements name="java/util/concurrent/Future"/>
+ <method name="&lt;init>()V"/>
+ <method name="acceptEither(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Consumer;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="acceptEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Consumer;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="acceptEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Consumer;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="allOf([Ljava/util/concurrent/CompletableFuture;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="anyOf([Ljava/util/concurrent/CompletableFuture;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="applyToEither(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Function;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="applyToEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Function;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="applyToEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Function;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="complete(Ljava/lang/Object;)Z"/>
+ <method name="completeExceptionally(Ljava/lang/Throwable;)Z"/>
+ <method name="completedFuture(Ljava/lang/Object;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="exceptionally(Ljava/util/function/Function;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="getNow(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="getNumberOfDependents()I"/>
+ <method name="handle(Ljava/util/function/BiFunction;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="handleAsync(Ljava/util/function/BiFunction;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="handleAsync(Ljava/util/function/BiFunction;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="isCompletedExceptionally()Z"/>
+ <method name="join()Ljava/lang/Object;"/>
+ <method name="obtrudeException(Ljava/lang/Throwable;)V"/>
+ <method name="obtrudeValue(Ljava/lang/Object;)V"/>
+ <method name="runAfterBoth(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="runAfterBothAsync(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="runAfterBothAsync(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="runAfterEither(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="runAfterEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="runAfterEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="runAsync(Ljava/lang/Runnable;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="runAsync(Ljava/lang/Runnable;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="supplyAsync(Ljava/util/function/Supplier;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="supplyAsync(Ljava/util/function/Supplier;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="thenAccept(Ljava/util/function/Consumer;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="thenAcceptAsync(Ljava/util/function/Consumer;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="thenAcceptAsync(Ljava/util/function/Consumer;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="thenAcceptBoth(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiConsumer;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="thenAcceptBothAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiConsumer;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="thenAcceptBothAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiConsumer;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="thenApply(Ljava/util/function/Function;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="thenApplyAsync(Ljava/util/function/Function;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="thenApplyAsync(Ljava/util/function/Function;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="thenCombine(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiFunction;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="thenCombineAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiFunction;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="thenCombineAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiFunction;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="thenCompose(Ljava/util/function/Function;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="thenComposeAsync(Ljava/util/function/Function;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="thenComposeAsync(Ljava/util/function/Function;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="thenRun(Ljava/lang/Runnable;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="thenRunAsync(Ljava/lang/Runnable;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="thenRunAsync(Ljava/lang/Runnable;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="whenComplete(Ljava/util/function/BiConsumer;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="whenCompleteAsync(Ljava/util/function/BiConsumer;)Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="whenCompleteAsync(Ljava/util/function/BiConsumer;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;"/>
+ </class>
+ <class name="java/util/concurrent/CompletableFuture$AsynchronousCompletionTask" since="24">
+ <extends name="java/lang/Object"/>
+ </class>
+ <class name="java/util/concurrent/CompletionException" since="24">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/util/concurrent/CompletionService" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="poll()Ljava/util/concurrent/Future;"/>
+ <method name="poll(JLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/Future;"/>
+ <method name="submit(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/Future;"/>
+ <method name="submit(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/Future;"/>
+ <method name="take()Ljava/util/concurrent/Future;"/>
+ </class>
+ <class name="java/util/concurrent/CompletionStage" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="acceptEither(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Consumer;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="acceptEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Consumer;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="acceptEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Consumer;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="applyToEither(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Function;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="applyToEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Function;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="applyToEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/Function;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="exceptionally(Ljava/util/function/Function;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="handle(Ljava/util/function/BiFunction;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="handleAsync(Ljava/util/function/BiFunction;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="handleAsync(Ljava/util/function/BiFunction;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="runAfterBoth(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="runAfterBothAsync(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="runAfterBothAsync(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="runAfterEither(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="runAfterEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="runAfterEitherAsync(Ljava/util/concurrent/CompletionStage;Ljava/lang/Runnable;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="thenAccept(Ljava/util/function/Consumer;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="thenAcceptAsync(Ljava/util/function/Consumer;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="thenAcceptAsync(Ljava/util/function/Consumer;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="thenAcceptBoth(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiConsumer;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="thenAcceptBothAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiConsumer;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="thenAcceptBothAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiConsumer;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="thenApply(Ljava/util/function/Function;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="thenApplyAsync(Ljava/util/function/Function;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="thenApplyAsync(Ljava/util/function/Function;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="thenCombine(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiFunction;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="thenCombineAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiFunction;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="thenCombineAsync(Ljava/util/concurrent/CompletionStage;Ljava/util/function/BiFunction;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="thenCompose(Ljava/util/function/Function;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="thenComposeAsync(Ljava/util/function/Function;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="thenComposeAsync(Ljava/util/function/Function;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="thenRun(Ljava/lang/Runnable;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="thenRunAsync(Ljava/lang/Runnable;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="thenRunAsync(Ljava/lang/Runnable;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="toCompletableFuture()Ljava/util/concurrent/CompletableFuture;"/>
+ <method name="whenComplete(Ljava/util/function/BiConsumer;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="whenCompleteAsync(Ljava/util/function/BiConsumer;)Ljava/util/concurrent/CompletionStage;"/>
+ <method name="whenCompleteAsync(Ljava/util/function/BiConsumer;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletionStage;"/>
+ </class>
+ <class name="java/util/concurrent/ConcurrentHashMap" since="1">
+ <extends name="java/util/AbstractMap"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/util/concurrent/ConcurrentMap"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(IF)V" since="9"/>
+ <method name="&lt;init>(IFI)V"/>
+ <method name="&lt;init>(Ljava/util/Map;)V"/>
+ <method name="contains(Ljava/lang/Object;)Z"/>
+ <method name="elements()Ljava/util/Enumeration;"/>
+ <method name="forEach(JLjava/util/function/BiConsumer;)V" since="24"/>
+ <method name="forEach(JLjava/util/function/BiFunction;Ljava/util/function/Consumer;)V" since="24"/>
+ <method name="forEachEntry(JLjava/util/function/Consumer;)V" since="24"/>
+ <method name="forEachEntry(JLjava/util/function/Function;Ljava/util/function/Consumer;)V" since="24"/>
+ <method name="forEachKey(JLjava/util/function/Consumer;)V" since="24"/>
+ <method name="forEachKey(JLjava/util/function/Function;Ljava/util/function/Consumer;)V" since="24"/>
+ <method name="forEachValue(JLjava/util/function/Consumer;)V" since="24"/>
+ <method name="forEachValue(JLjava/util/function/Function;Ljava/util/function/Consumer;)V" since="24"/>
+ <method name="keySet(Ljava/lang/Object;)Ljava/util/concurrent/ConcurrentHashMap$KeySetView;" since="24"/>
+ <method name="keys()Ljava/util/Enumeration;"/>
+ <method name="mappingCount()J" since="24"/>
+ <method name="newKeySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetView;" since="24"/>
+ <method name="newKeySet(I)Ljava/util/concurrent/ConcurrentHashMap$KeySetView;" since="24"/>
+ <method name="reduce(JLjava/util/function/BiFunction;Ljava/util/function/BiFunction;)Ljava/lang/Object;" since="24"/>
+ <method name="reduceEntries(JLjava/util/function/BiFunction;)Ljava/util/Map$Entry;" since="24"/>
+ <method name="reduceEntries(JLjava/util/function/Function;Ljava/util/function/BiFunction;)Ljava/lang/Object;" since="24"/>
+ <method name="reduceEntriesToDouble(JLjava/util/function/ToDoubleFunction;DLjava/util/function/DoubleBinaryOperator;)D" since="24"/>
+ <method name="reduceEntriesToInt(JLjava/util/function/ToIntFunction;ILjava/util/function/IntBinaryOperator;)I" since="24"/>
+ <method name="reduceEntriesToLong(JLjava/util/function/ToLongFunction;JLjava/util/function/LongBinaryOperator;)J" since="24"/>
+ <method name="reduceKeys(JLjava/util/function/BiFunction;)Ljava/lang/Object;" since="24"/>
+ <method name="reduceKeys(JLjava/util/function/Function;Ljava/util/function/BiFunction;)Ljava/lang/Object;" since="24"/>
+ <method name="reduceKeysToDouble(JLjava/util/function/ToDoubleFunction;DLjava/util/function/DoubleBinaryOperator;)D" since="24"/>
+ <method name="reduceKeysToInt(JLjava/util/function/ToIntFunction;ILjava/util/function/IntBinaryOperator;)I" since="24"/>
+ <method name="reduceKeysToLong(JLjava/util/function/ToLongFunction;JLjava/util/function/LongBinaryOperator;)J" since="24"/>
+ <method name="reduceToDouble(JLjava/util/function/ToDoubleBiFunction;DLjava/util/function/DoubleBinaryOperator;)D" since="24"/>
+ <method name="reduceToInt(JLjava/util/function/ToIntBiFunction;ILjava/util/function/IntBinaryOperator;)I" since="24"/>
+ <method name="reduceToLong(JLjava/util/function/ToLongBiFunction;JLjava/util/function/LongBinaryOperator;)J" since="24"/>
+ <method name="reduceValues(JLjava/util/function/BiFunction;)Ljava/lang/Object;" since="24"/>
+ <method name="reduceValues(JLjava/util/function/Function;Ljava/util/function/BiFunction;)Ljava/lang/Object;" since="24"/>
+ <method name="reduceValuesToDouble(JLjava/util/function/ToDoubleFunction;DLjava/util/function/DoubleBinaryOperator;)D" since="24"/>
+ <method name="reduceValuesToInt(JLjava/util/function/ToIntFunction;ILjava/util/function/IntBinaryOperator;)I" since="24"/>
+ <method name="reduceValuesToLong(JLjava/util/function/ToLongFunction;JLjava/util/function/LongBinaryOperator;)J" since="24"/>
+ <method name="search(JLjava/util/function/BiFunction;)Ljava/lang/Object;" since="24"/>
+ <method name="searchEntries(JLjava/util/function/Function;)Ljava/lang/Object;" since="24"/>
+ <method name="searchKeys(JLjava/util/function/Function;)Ljava/lang/Object;" since="24"/>
+ <method name="searchValues(JLjava/util/function/Function;)Ljava/lang/Object;" since="24"/>
+ </class>
+ <class name="java/util/concurrent/ConcurrentHashMap$CollectionView" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/util/Collection"/>
+ <method name="&lt;init>()V"/>
+ <method name="getMap()Ljava/util/concurrent/ConcurrentHashMap;"/>
+ </class>
+ <class name="java/util/concurrent/ConcurrentHashMap$KeySetView" since="24">
+ <extends name="java/util/concurrent/ConcurrentHashMap$CollectionView"/>
+ <implements name="java/util/Set"/>
+ <method name="&lt;init>()V"/>
+ <method name="getMappedValue()Ljava/lang/Object;"/>
+ </class>
+ <class name="java/util/concurrent/ConcurrentLinkedDeque" since="21">
+ <extends name="java/util/AbstractCollection"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/util/Deque"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/util/Collection;)V"/>
+ </class>
+ <class name="java/util/concurrent/ConcurrentLinkedQueue" since="1">
+ <extends name="java/util/AbstractQueue"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/util/Collection;)V"/>
+ </class>
+ <class name="java/util/concurrent/ConcurrentMap" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Map"/>
+ <method name="putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="remove(Ljava/lang/Object;Ljava/lang/Object;)Z"/>
+ <method name="replace(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="replace(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z"/>
+ </class>
+ <class name="java/util/concurrent/ConcurrentNavigableMap" since="9">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/NavigableMap"/>
+ <implements name="java/util/concurrent/ConcurrentMap"/>
+ <method name="descendingMap()Ljava/util/concurrent/ConcurrentNavigableMap;"/>
+ <method name="headMap(Ljava/lang/Object;)Ljava/util/concurrent/ConcurrentNavigableMap;"/>
+ <method name="headMap(Ljava/lang/Object;Z)Ljava/util/concurrent/ConcurrentNavigableMap;"/>
+ <method name="keySet()Ljava/util/NavigableSet;"/>
+ <method name="subMap(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/concurrent/ConcurrentNavigableMap;"/>
+ <method name="subMap(Ljava/lang/Object;ZLjava/lang/Object;Z)Ljava/util/concurrent/ConcurrentNavigableMap;"/>
+ <method name="tailMap(Ljava/lang/Object;)Ljava/util/concurrent/ConcurrentNavigableMap;"/>
+ <method name="tailMap(Ljava/lang/Object;Z)Ljava/util/concurrent/ConcurrentNavigableMap;"/>
+ </class>
+ <class name="java/util/concurrent/ConcurrentSkipListMap" since="9">
+ <extends name="java/util/AbstractMap"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="java/util/concurrent/ConcurrentNavigableMap"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/util/Comparator;)V"/>
+ <method name="&lt;init>(Ljava/util/Map;)V"/>
+ <method name="&lt;init>(Ljava/util/SortedMap;)V"/>
+ <method name="clone()Ljava/util/concurrent/ConcurrentSkipListMap;"/>
+ </class>
+ <class name="java/util/concurrent/ConcurrentSkipListSet" since="9">
+ <extends name="java/util/AbstractSet"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="java/util/NavigableSet"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/util/Collection;)V"/>
+ <method name="&lt;init>(Ljava/util/Comparator;)V"/>
+ <method name="&lt;init>(Ljava/util/SortedSet;)V"/>
+ <method name="clone()Ljava/util/concurrent/ConcurrentSkipListSet;"/>
+ <method name="headSet(Ljava/lang/Object;)Ljava/util/NavigableSet;"/>
+ <method name="subSet(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/NavigableSet;"/>
+ <method name="tailSet(Ljava/lang/Object;)Ljava/util/NavigableSet;"/>
+ </class>
+ <class name="java/util/concurrent/CopyOnWriteArrayList" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="java/util/List"/>
+ <implements name="java/util/RandomAccess"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/util/Collection;)V"/>
+ <method name="&lt;init>([Ljava/lang/Object;)V"/>
+ <method name="addAllAbsent(Ljava/util/Collection;)I"/>
+ <method name="addIfAbsent(Ljava/lang/Object;)Z"/>
+ <method name="indexOf(Ljava/lang/Object;I)I"/>
+ <method name="lastIndexOf(Ljava/lang/Object;I)I"/>
+ </class>
+ <class name="java/util/concurrent/CopyOnWriteArraySet" since="1">
+ <extends name="java/util/AbstractSet"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/util/Collection;)V"/>
+ </class>
+ <class name="java/util/concurrent/CountDownLatch" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="await()V"/>
+ <method name="await(JLjava/util/concurrent/TimeUnit;)Z"/>
+ <method name="countDown()V"/>
+ <method name="getCount()J"/>
+ </class>
+ <class name="java/util/concurrent/CountedCompleter" since="24">
+ <extends name="java/util/concurrent/ForkJoinTask"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/util/concurrent/CountedCompleter;)V"/>
+ <method name="&lt;init>(Ljava/util/concurrent/CountedCompleter;I)V"/>
+ <method name="addToPendingCount(I)V"/>
+ <method name="compareAndSetPendingCount(II)Z"/>
+ <method name="compute()V"/>
+ <method name="decrementPendingCountUnlessZero()I"/>
+ <method name="firstComplete()Ljava/util/concurrent/CountedCompleter;"/>
+ <method name="getCompleter()Ljava/util/concurrent/CountedCompleter;"/>
+ <method name="getPendingCount()I"/>
+ <method name="getRoot()Ljava/util/concurrent/CountedCompleter;"/>
+ <method name="helpComplete(I)V"/>
+ <method name="nextComplete()Ljava/util/concurrent/CountedCompleter;"/>
+ <method name="onCompletion(Ljava/util/concurrent/CountedCompleter;)V"/>
+ <method name="onExceptionalCompletion(Ljava/lang/Throwable;Ljava/util/concurrent/CountedCompleter;)Z"/>
+ <method name="propagateCompletion()V"/>
+ <method name="quietlyCompleteRoot()V"/>
+ <method name="setPendingCount(I)V"/>
+ <method name="tryComplete()V"/>
+ </class>
+ <class name="java/util/concurrent/CyclicBarrier" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(ILjava/lang/Runnable;)V"/>
+ <method name="await()I"/>
+ <method name="await(JLjava/util/concurrent/TimeUnit;)I"/>
+ <method name="getNumberWaiting()I"/>
+ <method name="getParties()I"/>
+ <method name="isBroken()Z"/>
+ <method name="reset()V"/>
+ </class>
+ <class name="java/util/concurrent/DelayQueue" since="1">
+ <extends name="java/util/AbstractQueue"/>
+ <implements name="java/util/concurrent/BlockingQueue"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/util/Collection;)V"/>
+ <method name="add(Ljava/util/concurrent/Delayed;)Z"/>
+ <method name="offer(Ljava/util/concurrent/Delayed;)Z"/>
+ <method name="offer(Ljava/util/concurrent/Delayed;JLjava/util/concurrent/TimeUnit;)Z"/>
+ <method name="peek()Ljava/util/concurrent/Delayed;"/>
+ <method name="poll()Ljava/util/concurrent/Delayed;"/>
+ <method name="poll(JLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/Delayed;"/>
+ <method name="put(Ljava/util/concurrent/Delayed;)V"/>
+ <method name="take()Ljava/util/concurrent/Delayed;"/>
+ </class>
+ <class name="java/util/concurrent/Delayed" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Comparable"/>
+ <method name="getDelay(Ljava/util/concurrent/TimeUnit;)J"/>
+ </class>
+ <class name="java/util/concurrent/Exchanger" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="exchange(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="exchange(Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;"/>
+ </class>
+ <class name="java/util/concurrent/ExecutionException" since="1">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/util/concurrent/Executor" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="execute(Ljava/lang/Runnable;)V"/>
+ </class>
+ <class name="java/util/concurrent/ExecutorCompletionService" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/concurrent/CompletionService"/>
+ <method name="&lt;init>(Ljava/util/concurrent/Executor;)V"/>
+ <method name="&lt;init>(Ljava/util/concurrent/Executor;Ljava/util/concurrent/BlockingQueue;)V"/>
+ </class>
+ <class name="java/util/concurrent/ExecutorService" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/concurrent/Executor"/>
+ <method name="awaitTermination(JLjava/util/concurrent/TimeUnit;)Z"/>
+ <method name="invokeAll(Ljava/util/Collection;)Ljava/util/List;"/>
+ <method name="invokeAll(Ljava/util/Collection;JLjava/util/concurrent/TimeUnit;)Ljava/util/List;"/>
+ <method name="invokeAny(Ljava/util/Collection;)Ljava/lang/Object;"/>
+ <method name="invokeAny(Ljava/util/Collection;JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;"/>
+ <method name="isShutdown()Z"/>
+ <method name="isTerminated()Z"/>
+ <method name="shutdown()V"/>
+ <method name="shutdownNow()Ljava/util/List;"/>
+ <method name="submit(Ljava/lang/Runnable;)Ljava/util/concurrent/Future;"/>
+ <method name="submit(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/Future;"/>
+ <method name="submit(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/Future;"/>
+ </class>
+ <class name="java/util/concurrent/Executors" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="callable(Ljava/lang/Runnable;)Ljava/util/concurrent/Callable;"/>
+ <method name="callable(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/Callable;"/>
+ <method name="callable(Ljava/security/PrivilegedAction;)Ljava/util/concurrent/Callable;"/>
+ <method name="callable(Ljava/security/PrivilegedExceptionAction;)Ljava/util/concurrent/Callable;"/>
+ <method name="defaultThreadFactory()Ljava/util/concurrent/ThreadFactory;"/>
+ <method name="newCachedThreadPool()Ljava/util/concurrent/ExecutorService;"/>
+ <method name="newCachedThreadPool(Ljava/util/concurrent/ThreadFactory;)Ljava/util/concurrent/ExecutorService;"/>
+ <method name="newFixedThreadPool(I)Ljava/util/concurrent/ExecutorService;"/>
+ <method name="newFixedThreadPool(ILjava/util/concurrent/ThreadFactory;)Ljava/util/concurrent/ExecutorService;"/>
+ <method name="newScheduledThreadPool(I)Ljava/util/concurrent/ScheduledExecutorService;"/>
+ <method name="newScheduledThreadPool(ILjava/util/concurrent/ThreadFactory;)Ljava/util/concurrent/ScheduledExecutorService;"/>
+ <method name="newSingleThreadExecutor()Ljava/util/concurrent/ExecutorService;"/>
+ <method name="newSingleThreadExecutor(Ljava/util/concurrent/ThreadFactory;)Ljava/util/concurrent/ExecutorService;"/>
+ <method name="newSingleThreadScheduledExecutor()Ljava/util/concurrent/ScheduledExecutorService;"/>
+ <method name="newSingleThreadScheduledExecutor(Ljava/util/concurrent/ThreadFactory;)Ljava/util/concurrent/ScheduledExecutorService;"/>
+ <method name="newWorkStealingPool()Ljava/util/concurrent/ExecutorService;" since="24"/>
+ <method name="newWorkStealingPool(I)Ljava/util/concurrent/ExecutorService;" since="24"/>
+ <method name="privilegedCallable(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/Callable;"/>
+ <method name="privilegedCallableUsingCurrentClassLoader(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/Callable;"/>
+ <method name="privilegedThreadFactory()Ljava/util/concurrent/ThreadFactory;"/>
+ <method name="unconfigurableExecutorService(Ljava/util/concurrent/ExecutorService;)Ljava/util/concurrent/ExecutorService;"/>
+ <method name="unconfigurableScheduledExecutorService(Ljava/util/concurrent/ScheduledExecutorService;)Ljava/util/concurrent/ScheduledExecutorService;"/>
+ </class>
+ <class name="java/util/concurrent/ForkJoinPool" since="21">
+ <extends name="java/util/concurrent/AbstractExecutorService"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(ILjava/util/concurrent/ForkJoinPool$ForkJoinWorkerThreadFactory;Ljava/lang/Thread$UncaughtExceptionHandler;Z)V"/>
+ <method name="awaitQuiescence(JLjava/util/concurrent/TimeUnit;)Z"/>
+ <method name="commonPool()Ljava/util/concurrent/ForkJoinPool;" since="24"/>
+ <method name="drainTasksTo(Ljava/util/Collection;)I"/>
+ <method name="execute(Ljava/util/concurrent/ForkJoinTask;)V"/>
+ <method name="getActiveThreadCount()I"/>
+ <method name="getAsyncMode()Z"/>
+ <method name="getCommonPoolParallelism()I" since="24"/>
+ <method name="getFactory()Ljava/util/concurrent/ForkJoinPool$ForkJoinWorkerThreadFactory;"/>
+ <method name="getParallelism()I"/>
+ <method name="getPoolSize()I"/>
+ <method name="getQueuedSubmissionCount()I"/>
+ <method name="getQueuedTaskCount()J"/>
+ <method name="getRunningThreadCount()I"/>
+ <method name="getStealCount()J"/>
+ <method name="getUncaughtExceptionHandler()Ljava/lang/Thread$UncaughtExceptionHandler;"/>
+ <method name="hasQueuedSubmissions()Z"/>
+ <method name="invoke(Ljava/util/concurrent/ForkJoinTask;)Ljava/lang/Object;"/>
+ <method name="isQuiescent()Z"/>
+ <method name="isTerminating()Z"/>
+ <method name="managedBlock(Ljava/util/concurrent/ForkJoinPool$ManagedBlocker;)V"/>
+ <method name="pollSubmission()Ljava/util/concurrent/ForkJoinTask;"/>
+ <method name="submit(Ljava/lang/Runnable;)Ljava/util/concurrent/ForkJoinTask;"/>
+ <method name="submit(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/ForkJoinTask;"/>
+ <method name="submit(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/ForkJoinTask;"/>
+ <method name="submit(Ljava/util/concurrent/ForkJoinTask;)Ljava/util/concurrent/ForkJoinTask;"/>
+ <field name="defaultForkJoinWorkerThreadFactory"/>
+ </class>
+ <class name="java/util/concurrent/ForkJoinPool$ForkJoinWorkerThreadFactory" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="newThread(Ljava/util/concurrent/ForkJoinPool;)Ljava/util/concurrent/ForkJoinWorkerThread;"/>
+ </class>
+ <class name="java/util/concurrent/ForkJoinPool$ManagedBlocker" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="block()Z"/>
+ <method name="isReleasable()Z"/>
+ </class>
+ <class name="java/util/concurrent/ForkJoinTask" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/util/concurrent/Future"/>
+ <method name="&lt;init>()V"/>
+ <method name="adapt(Ljava/lang/Runnable;)Ljava/util/concurrent/ForkJoinTask;"/>
+ <method name="adapt(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/ForkJoinTask;"/>
+ <method name="adapt(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/ForkJoinTask;"/>
+ <method name="compareAndSetForkJoinTaskTag(SS)Z" since="24"/>
+ <method name="complete(Ljava/lang/Object;)V"/>
+ <method name="completeExceptionally(Ljava/lang/Throwable;)V"/>
+ <method name="exec()Z"/>
+ <method name="fork()Ljava/util/concurrent/ForkJoinTask;"/>
+ <method name="getException()Ljava/lang/Throwable;"/>
+ <method name="getForkJoinTaskTag()S" since="24"/>
+ <method name="getPool()Ljava/util/concurrent/ForkJoinPool;"/>
+ <method name="getQueuedTaskCount()I"/>
+ <method name="getRawResult()Ljava/lang/Object;"/>
+ <method name="getSurplusQueuedTaskCount()I"/>
+ <method name="helpQuiesce()V"/>
+ <method name="inForkJoinPool()Z"/>
+ <method name="invoke()Ljava/lang/Object;"/>
+ <method name="invokeAll(Ljava/util/Collection;)Ljava/util/Collection;"/>
+ <method name="invokeAll(Ljava/util/concurrent/ForkJoinTask;Ljava/util/concurrent/ForkJoinTask;)V"/>
+ <method name="invokeAll([Ljava/util/concurrent/ForkJoinTask;)V"/>
+ <method name="isCompletedAbnormally()Z"/>
+ <method name="isCompletedNormally()Z"/>
+ <method name="join()Ljava/lang/Object;"/>
+ <method name="peekNextLocalTask()Ljava/util/concurrent/ForkJoinTask;"/>
+ <method name="pollNextLocalTask()Ljava/util/concurrent/ForkJoinTask;"/>
+ <method name="pollTask()Ljava/util/concurrent/ForkJoinTask;"/>
+ <method name="quietlyComplete()V" since="24"/>
+ <method name="quietlyInvoke()V"/>
+ <method name="quietlyJoin()V"/>
+ <method name="reinitialize()V"/>
+ <method name="setForkJoinTaskTag(S)S" since="24"/>
+ <method name="setRawResult(Ljava/lang/Object;)V"/>
+ <method name="tryUnfork()Z"/>
+ </class>
+ <class name="java/util/concurrent/ForkJoinWorkerThread" since="21">
+ <extends name="java/lang/Thread"/>
+ <method name="&lt;init>(Ljava/util/concurrent/ForkJoinPool;)V"/>
+ <method name="getPool()Ljava/util/concurrent/ForkJoinPool;"/>
+ <method name="getPoolIndex()I"/>
+ <method name="onStart()V"/>
+ <method name="onTermination(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/util/concurrent/Future" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="cancel(Z)Z"/>
+ <method name="get()Ljava/lang/Object;"/>
+ <method name="get(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;"/>
+ <method name="isCancelled()Z"/>
+ <method name="isDone()Z"/>
+ </class>
+ <class name="java/util/concurrent/FutureTask" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Runnable" removed="9"/>
+ <implements name="java/util/concurrent/Future" removed="9"/>
+ <implements name="java/util/concurrent/RunnableFuture" since="9"/>
+ <method name="&lt;init>(Ljava/lang/Runnable;Ljava/lang/Object;)V"/>
+ <method name="&lt;init>(Ljava/util/concurrent/Callable;)V"/>
+ <method name="done()V"/>
+ <method name="runAndReset()Z"/>
+ <method name="set(Ljava/lang/Object;)V"/>
+ <method name="setException(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/util/concurrent/LinkedBlockingDeque" since="9">
+ <extends name="java/util/AbstractQueue"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/util/concurrent/BlockingDeque"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Ljava/util/Collection;)V"/>
+ </class>
+ <class name="java/util/concurrent/LinkedBlockingQueue" since="1">
+ <extends name="java/util/AbstractQueue"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/util/concurrent/BlockingQueue"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Ljava/util/Collection;)V"/>
+ </class>
+ <class name="java/util/concurrent/LinkedTransferQueue" since="21">
+ <extends name="java/util/AbstractQueue"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/util/concurrent/TransferQueue"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/util/Collection;)V"/>
+ </class>
+ <class name="java/util/concurrent/Phaser" since="21">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Ljava/util/concurrent/Phaser;)V"/>
+ <method name="&lt;init>(Ljava/util/concurrent/Phaser;I)V"/>
+ <method name="arrive()I"/>
+ <method name="arriveAndAwaitAdvance()I"/>
+ <method name="arriveAndDeregister()I"/>
+ <method name="awaitAdvance(I)I"/>
+ <method name="awaitAdvanceInterruptibly(I)I"/>
+ <method name="awaitAdvanceInterruptibly(IJLjava/util/concurrent/TimeUnit;)I"/>
+ <method name="bulkRegister(I)I"/>
+ <method name="forceTermination()V"/>
+ <method name="getArrivedParties()I"/>
+ <method name="getParent()Ljava/util/concurrent/Phaser;"/>
+ <method name="getPhase()I"/>
+ <method name="getRegisteredParties()I"/>
+ <method name="getRoot()Ljava/util/concurrent/Phaser;"/>
+ <method name="getUnarrivedParties()I"/>
+ <method name="isTerminated()Z"/>
+ <method name="onAdvance(II)Z"/>
+ <method name="register()I"/>
+ </class>
+ <class name="java/util/concurrent/PriorityBlockingQueue" since="1">
+ <extends name="java/util/AbstractQueue"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/util/concurrent/BlockingQueue"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(ILjava/util/Comparator;)V"/>
+ <method name="&lt;init>(Ljava/util/Collection;)V"/>
+ <method name="comparator()Ljava/util/Comparator;"/>
+ </class>
+ <class name="java/util/concurrent/RecursiveAction" since="21">
+ <extends name="java/util/concurrent/ForkJoinTask"/>
+ <method name="&lt;init>()V"/>
+ <method name="compute()V"/>
+ <method name="getRawResult()Ljava/lang/Void;"/>
+ <method name="setRawResult(Ljava/lang/Void;)V"/>
+ </class>
+ <class name="java/util/concurrent/RecursiveTask" since="21">
+ <extends name="java/util/concurrent/ForkJoinTask"/>
+ <method name="&lt;init>()V"/>
+ <method name="compute()Ljava/lang/Object;"/>
+ </class>
+ <class name="java/util/concurrent/RejectedExecutionException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/util/concurrent/RejectedExecutionHandler" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="rejectedExecution(Ljava/lang/Runnable;Ljava/util/concurrent/ThreadPoolExecutor;)V"/>
+ </class>
+ <class name="java/util/concurrent/RunnableFuture" since="9">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Runnable"/>
+ <implements name="java/util/concurrent/Future"/>
+ </class>
+ <class name="java/util/concurrent/RunnableScheduledFuture" since="9">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/concurrent/RunnableFuture"/>
+ <implements name="java/util/concurrent/ScheduledFuture"/>
+ <method name="isPeriodic()Z"/>
+ </class>
+ <class name="java/util/concurrent/ScheduledExecutorService" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/concurrent/ExecutorService"/>
+ <method name="schedule(Ljava/lang/Runnable;JLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/ScheduledFuture;"/>
+ <method name="schedule(Ljava/util/concurrent/Callable;JLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/ScheduledFuture;"/>
+ <method name="scheduleAtFixedRate(Ljava/lang/Runnable;JJLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/ScheduledFuture;"/>
+ <method name="scheduleWithFixedDelay(Ljava/lang/Runnable;JJLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/ScheduledFuture;"/>
+ </class>
+ <class name="java/util/concurrent/ScheduledFuture" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/concurrent/Delayed"/>
+ <implements name="java/util/concurrent/Future"/>
+ </class>
+ <class name="java/util/concurrent/ScheduledThreadPoolExecutor" since="1">
+ <extends name="java/util/concurrent/ThreadPoolExecutor"/>
+ <implements name="java/util/concurrent/ScheduledExecutorService"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(ILjava/util/concurrent/RejectedExecutionHandler;)V"/>
+ <method name="&lt;init>(ILjava/util/concurrent/ThreadFactory;)V"/>
+ <method name="&lt;init>(ILjava/util/concurrent/ThreadFactory;Ljava/util/concurrent/RejectedExecutionHandler;)V"/>
+ <method name="decorateTask(Ljava/lang/Runnable;Ljava/util/concurrent/RunnableScheduledFuture;)Ljava/util/concurrent/RunnableScheduledFuture;" since="9"/>
+ <method name="decorateTask(Ljava/util/concurrent/Callable;Ljava/util/concurrent/RunnableScheduledFuture;)Ljava/util/concurrent/RunnableScheduledFuture;" since="9"/>
+ <method name="getContinueExistingPeriodicTasksAfterShutdownPolicy()Z"/>
+ <method name="getExecuteExistingDelayedTasksAfterShutdownPolicy()Z"/>
+ <method name="getRemoveOnCancelPolicy()Z" since="21"/>
+ <method name="setContinueExistingPeriodicTasksAfterShutdownPolicy(Z)V"/>
+ <method name="setExecuteExistingDelayedTasksAfterShutdownPolicy(Z)V"/>
+ <method name="setRemoveOnCancelPolicy(Z)V" since="21"/>
+ </class>
+ <class name="java/util/concurrent/Semaphore" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(IZ)V"/>
+ <method name="acquire()V"/>
+ <method name="acquire(I)V"/>
+ <method name="acquireUninterruptibly()V"/>
+ <method name="acquireUninterruptibly(I)V"/>
+ <method name="availablePermits()I"/>
+ <method name="drainPermits()I"/>
+ <method name="getQueueLength()I"/>
+ <method name="getQueuedThreads()Ljava/util/Collection;"/>
+ <method name="hasQueuedThreads()Z"/>
+ <method name="isFair()Z"/>
+ <method name="reducePermits(I)V"/>
+ <method name="release()V"/>
+ <method name="release(I)V"/>
+ <method name="tryAcquire()Z"/>
+ <method name="tryAcquire(I)Z"/>
+ <method name="tryAcquire(IJLjava/util/concurrent/TimeUnit;)Z"/>
+ <method name="tryAcquire(JLjava/util/concurrent/TimeUnit;)Z"/>
+ </class>
+ <class name="java/util/concurrent/SynchronousQueue" since="1">
+ <extends name="java/util/AbstractQueue"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/util/concurrent/BlockingQueue"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Z)V"/>
+ </class>
+ <class name="java/util/concurrent/ThreadFactory" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="newThread(Ljava/lang/Runnable;)Ljava/lang/Thread;"/>
+ </class>
+ <class name="java/util/concurrent/ThreadLocalRandom" since="21">
+ <extends name="java/util/Random"/>
+ <method name="&lt;init>()V"/>
+ <method name="current()Ljava/util/concurrent/ThreadLocalRandom;"/>
+ <method name="nextDouble(D)D"/>
+ <method name="nextDouble(DD)D"/>
+ <method name="nextInt(II)I"/>
+ <method name="nextLong(J)J"/>
+ <method name="nextLong(JJ)J"/>
+ </class>
+ <class name="java/util/concurrent/ThreadPoolExecutor" since="1">
+ <extends name="java/util/concurrent/AbstractExecutorService"/>
+ <method name="&lt;init>(IIJLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/BlockingQueue;)V"/>
+ <method name="&lt;init>(IIJLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/BlockingQueue;Ljava/util/concurrent/RejectedExecutionHandler;)V"/>
+ <method name="&lt;init>(IIJLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/BlockingQueue;Ljava/util/concurrent/ThreadFactory;)V"/>
+ <method name="&lt;init>(IIJLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/BlockingQueue;Ljava/util/concurrent/ThreadFactory;Ljava/util/concurrent/RejectedExecutionHandler;)V"/>
+ <method name="afterExecute(Ljava/lang/Runnable;Ljava/lang/Throwable;)V"/>
+ <method name="allowCoreThreadTimeOut(Z)V" since="9"/>
+ <method name="allowsCoreThreadTimeOut()Z" since="9"/>
+ <method name="beforeExecute(Ljava/lang/Thread;Ljava/lang/Runnable;)V"/>
+ <method name="getActiveCount()I"/>
+ <method name="getCompletedTaskCount()J"/>
+ <method name="getCorePoolSize()I"/>
+ <method name="getKeepAliveTime(Ljava/util/concurrent/TimeUnit;)J"/>
+ <method name="getLargestPoolSize()I"/>
+ <method name="getMaximumPoolSize()I"/>
+ <method name="getPoolSize()I"/>
+ <method name="getQueue()Ljava/util/concurrent/BlockingQueue;"/>
+ <method name="getRejectedExecutionHandler()Ljava/util/concurrent/RejectedExecutionHandler;"/>
+ <method name="getTaskCount()J"/>
+ <method name="getThreadFactory()Ljava/util/concurrent/ThreadFactory;"/>
+ <method name="isTerminating()Z"/>
+ <method name="prestartAllCoreThreads()I"/>
+ <method name="prestartCoreThread()Z"/>
+ <method name="purge()V"/>
+ <method name="remove(Ljava/lang/Runnable;)Z"/>
+ <method name="setCorePoolSize(I)V"/>
+ <method name="setKeepAliveTime(JLjava/util/concurrent/TimeUnit;)V"/>
+ <method name="setMaximumPoolSize(I)V"/>
+ <method name="setRejectedExecutionHandler(Ljava/util/concurrent/RejectedExecutionHandler;)V"/>
+ <method name="setThreadFactory(Ljava/util/concurrent/ThreadFactory;)V"/>
+ <method name="terminated()V"/>
+ </class>
+ <class name="java/util/concurrent/ThreadPoolExecutor$AbortPolicy" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/concurrent/RejectedExecutionHandler"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/util/concurrent/ThreadPoolExecutor$CallerRunsPolicy" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/concurrent/RejectedExecutionHandler"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/util/concurrent/ThreadPoolExecutor$DiscardOldestPolicy" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/concurrent/RejectedExecutionHandler"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/util/concurrent/ThreadPoolExecutor$DiscardPolicy" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/concurrent/RejectedExecutionHandler"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/util/concurrent/TimeUnit" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="convert(JLjava/util/concurrent/TimeUnit;)J"/>
+ <method name="sleep(J)V"/>
+ <method name="timedJoin(Ljava/lang/Thread;J)V"/>
+ <method name="timedWait(Ljava/lang/Object;J)V"/>
+ <method name="toDays(J)J" since="9"/>
+ <method name="toHours(J)J" since="9"/>
+ <method name="toMicros(J)J"/>
+ <method name="toMillis(J)J"/>
+ <method name="toMinutes(J)J" since="9"/>
+ <method name="toNanos(J)J"/>
+ <method name="toSeconds(J)J"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/util/concurrent/TimeUnit;"/>
+ <method name="values()[Ljava/util/concurrent/TimeUnit;"/>
+ <field name="DAYS" since="9"/>
+ <field name="HOURS" since="9"/>
+ <field name="MICROSECONDS"/>
+ <field name="MILLISECONDS"/>
+ <field name="MINUTES" since="9"/>
+ <field name="NANOSECONDS"/>
+ <field name="SECONDS"/>
+ </class>
+ <class name="java/util/concurrent/TimeoutException" since="1">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/util/concurrent/TransferQueue" since="21">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/concurrent/BlockingQueue"/>
+ <method name="getWaitingConsumerCount()I"/>
+ <method name="hasWaitingConsumer()Z"/>
+ <method name="transfer(Ljava/lang/Object;)V"/>
+ <method name="tryTransfer(Ljava/lang/Object;)Z"/>
+ <method name="tryTransfer(Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;)Z"/>
+ </class>
+ <class name="java/util/concurrent/atomic/AtomicBoolean" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Z)V"/>
+ <method name="compareAndSet(ZZ)Z"/>
+ <method name="get()Z"/>
+ <method name="getAndSet(Z)Z"/>
+ <method name="lazySet(Z)V" since="9"/>
+ <method name="set(Z)V"/>
+ <method name="weakCompareAndSet(ZZ)Z"/>
+ </class>
+ <class name="java/util/concurrent/atomic/AtomicInteger" since="1">
+ <extends name="java/lang/Number"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="accumulateAndGet(ILjava/util/function/IntBinaryOperator;)I" since="24"/>
+ <method name="addAndGet(I)I"/>
+ <method name="compareAndSet(II)Z"/>
+ <method name="decrementAndGet()I"/>
+ <method name="get()I"/>
+ <method name="getAndAccumulate(ILjava/util/function/IntBinaryOperator;)I" since="24"/>
+ <method name="getAndAdd(I)I"/>
+ <method name="getAndDecrement()I"/>
+ <method name="getAndIncrement()I"/>
+ <method name="getAndSet(I)I"/>
+ <method name="getAndUpdate(Ljava/util/function/IntUnaryOperator;)I" since="24"/>
+ <method name="incrementAndGet()I"/>
+ <method name="lazySet(I)V" since="9"/>
+ <method name="set(I)V"/>
+ <method name="updateAndGet(Ljava/util/function/IntUnaryOperator;)I" since="24"/>
+ <method name="weakCompareAndSet(II)Z"/>
+ </class>
+ <class name="java/util/concurrent/atomic/AtomicIntegerArray" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>([I)V"/>
+ <method name="accumulateAndGet(IILjava/util/function/IntBinaryOperator;)I" since="24"/>
+ <method name="addAndGet(II)I"/>
+ <method name="compareAndSet(III)Z"/>
+ <method name="decrementAndGet(I)I"/>
+ <method name="get(I)I"/>
+ <method name="getAndAccumulate(IILjava/util/function/IntBinaryOperator;)I" since="24"/>
+ <method name="getAndAdd(II)I"/>
+ <method name="getAndDecrement(I)I"/>
+ <method name="getAndIncrement(I)I"/>
+ <method name="getAndSet(II)I"/>
+ <method name="getAndUpdate(ILjava/util/function/IntUnaryOperator;)I" since="24"/>
+ <method name="incrementAndGet(I)I"/>
+ <method name="lazySet(II)V" since="9"/>
+ <method name="length()I"/>
+ <method name="set(II)V"/>
+ <method name="updateAndGet(ILjava/util/function/IntUnaryOperator;)I" since="24"/>
+ <method name="weakCompareAndSet(III)Z"/>
+ </class>
+ <class name="java/util/concurrent/atomic/AtomicIntegerFieldUpdater" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="accumulateAndGet(Ljava/lang/Object;ILjava/util/function/IntBinaryOperator;)I" since="24"/>
+ <method name="addAndGet(Ljava/lang/Object;I)I"/>
+ <method name="compareAndSet(Ljava/lang/Object;II)Z"/>
+ <method name="decrementAndGet(Ljava/lang/Object;)I"/>
+ <method name="get(Ljava/lang/Object;)I"/>
+ <method name="getAndAccumulate(Ljava/lang/Object;ILjava/util/function/IntBinaryOperator;)I" since="24"/>
+ <method name="getAndAdd(Ljava/lang/Object;I)I"/>
+ <method name="getAndDecrement(Ljava/lang/Object;)I"/>
+ <method name="getAndIncrement(Ljava/lang/Object;)I"/>
+ <method name="getAndSet(Ljava/lang/Object;I)I"/>
+ <method name="getAndUpdate(Ljava/lang/Object;Ljava/util/function/IntUnaryOperator;)I" since="24"/>
+ <method name="incrementAndGet(Ljava/lang/Object;)I"/>
+ <method name="lazySet(Ljava/lang/Object;I)V" since="9"/>
+ <method name="newUpdater(Ljava/lang/Class;Ljava/lang/String;)Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater;"/>
+ <method name="set(Ljava/lang/Object;I)V"/>
+ <method name="updateAndGet(Ljava/lang/Object;Ljava/util/function/IntUnaryOperator;)I" since="24"/>
+ <method name="weakCompareAndSet(Ljava/lang/Object;II)Z"/>
+ </class>
+ <class name="java/util/concurrent/atomic/AtomicLong" since="1">
+ <extends name="java/lang/Number"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(J)V"/>
+ <method name="accumulateAndGet(JLjava/util/function/LongBinaryOperator;)J" since="24"/>
+ <method name="addAndGet(J)J"/>
+ <method name="compareAndSet(JJ)Z"/>
+ <method name="decrementAndGet()J"/>
+ <method name="get()J"/>
+ <method name="getAndAccumulate(JLjava/util/function/LongBinaryOperator;)J" since="24"/>
+ <method name="getAndAdd(J)J"/>
+ <method name="getAndDecrement()J"/>
+ <method name="getAndIncrement()J"/>
+ <method name="getAndSet(J)J"/>
+ <method name="getAndUpdate(Ljava/util/function/LongUnaryOperator;)J" since="24"/>
+ <method name="incrementAndGet()J"/>
+ <method name="lazySet(J)V" since="9"/>
+ <method name="set(J)V"/>
+ <method name="updateAndGet(Ljava/util/function/LongUnaryOperator;)J" since="24"/>
+ <method name="weakCompareAndSet(JJ)Z"/>
+ </class>
+ <class name="java/util/concurrent/atomic/AtomicLongArray" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>([J)V"/>
+ <method name="accumulateAndGet(IJLjava/util/function/LongBinaryOperator;)J" since="24"/>
+ <method name="addAndGet(IJ)J"/>
+ <method name="compareAndSet(IJJ)Z"/>
+ <method name="decrementAndGet(I)J"/>
+ <method name="get(I)J"/>
+ <method name="getAndAccumulate(IJLjava/util/function/LongBinaryOperator;)J" since="24"/>
+ <method name="getAndAdd(IJ)J"/>
+ <method name="getAndDecrement(I)J"/>
+ <method name="getAndIncrement(I)J"/>
+ <method name="getAndSet(IJ)J"/>
+ <method name="getAndUpdate(ILjava/util/function/LongUnaryOperator;)J" since="24"/>
+ <method name="incrementAndGet(I)J"/>
+ <method name="lazySet(IJ)V" since="9"/>
+ <method name="length()I"/>
+ <method name="set(IJ)V"/>
+ <method name="updateAndGet(ILjava/util/function/LongUnaryOperator;)J" since="24"/>
+ <method name="weakCompareAndSet(IJJ)Z"/>
+ </class>
+ <class name="java/util/concurrent/atomic/AtomicLongFieldUpdater" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="accumulateAndGet(Ljava/lang/Object;JLjava/util/function/LongBinaryOperator;)J" since="24"/>
+ <method name="addAndGet(Ljava/lang/Object;J)J"/>
+ <method name="compareAndSet(Ljava/lang/Object;JJ)Z"/>
+ <method name="decrementAndGet(Ljava/lang/Object;)J"/>
+ <method name="get(Ljava/lang/Object;)J"/>
+ <method name="getAndAccumulate(Ljava/lang/Object;JLjava/util/function/LongBinaryOperator;)J" since="24"/>
+ <method name="getAndAdd(Ljava/lang/Object;J)J"/>
+ <method name="getAndDecrement(Ljava/lang/Object;)J"/>
+ <method name="getAndIncrement(Ljava/lang/Object;)J"/>
+ <method name="getAndSet(Ljava/lang/Object;J)J"/>
+ <method name="getAndUpdate(Ljava/lang/Object;Ljava/util/function/LongUnaryOperator;)J" since="24"/>
+ <method name="incrementAndGet(Ljava/lang/Object;)J"/>
+ <method name="lazySet(Ljava/lang/Object;J)V" since="9"/>
+ <method name="newUpdater(Ljava/lang/Class;Ljava/lang/String;)Ljava/util/concurrent/atomic/AtomicLongFieldUpdater;"/>
+ <method name="set(Ljava/lang/Object;J)V"/>
+ <method name="updateAndGet(Ljava/lang/Object;Ljava/util/function/LongUnaryOperator;)J" since="24"/>
+ <method name="weakCompareAndSet(Ljava/lang/Object;JJ)Z"/>
+ </class>
+ <class name="java/util/concurrent/atomic/AtomicMarkableReference" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/Object;Z)V"/>
+ <method name="attemptMark(Ljava/lang/Object;Z)Z"/>
+ <method name="compareAndSet(Ljava/lang/Object;Ljava/lang/Object;ZZ)Z"/>
+ <method name="get([Z)Ljava/lang/Object;"/>
+ <method name="getReference()Ljava/lang/Object;"/>
+ <method name="isMarked()Z"/>
+ <method name="set(Ljava/lang/Object;Z)V"/>
+ <method name="weakCompareAndSet(Ljava/lang/Object;Ljava/lang/Object;ZZ)Z"/>
+ </class>
+ <class name="java/util/concurrent/atomic/AtomicReference" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/Object;)V"/>
+ <method name="accumulateAndGet(Ljava/lang/Object;Ljava/util/function/BinaryOperator;)Ljava/lang/Object;" since="24"/>
+ <method name="compareAndSet(Ljava/lang/Object;Ljava/lang/Object;)Z"/>
+ <method name="get()Ljava/lang/Object;"/>
+ <method name="getAndAccumulate(Ljava/lang/Object;Ljava/util/function/BinaryOperator;)Ljava/lang/Object;" since="24"/>
+ <method name="getAndSet(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="getAndUpdate(Ljava/util/function/UnaryOperator;)Ljava/lang/Object;" since="24"/>
+ <method name="lazySet(Ljava/lang/Object;)V" since="9"/>
+ <method name="set(Ljava/lang/Object;)V"/>
+ <method name="updateAndGet(Ljava/util/function/UnaryOperator;)Ljava/lang/Object;" since="24"/>
+ <method name="weakCompareAndSet(Ljava/lang/Object;Ljava/lang/Object;)Z"/>
+ </class>
+ <class name="java/util/concurrent/atomic/AtomicReferenceArray" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>([Ljava/lang/Object;)V"/>
+ <method name="accumulateAndGet(ILjava/lang/Object;Ljava/util/function/BinaryOperator;)Ljava/lang/Object;" since="24"/>
+ <method name="compareAndSet(ILjava/lang/Object;Ljava/lang/Object;)Z"/>
+ <method name="get(I)Ljava/lang/Object;"/>
+ <method name="getAndAccumulate(ILjava/lang/Object;Ljava/util/function/BinaryOperator;)Ljava/lang/Object;" since="24"/>
+ <method name="getAndSet(ILjava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="getAndUpdate(ILjava/util/function/UnaryOperator;)Ljava/lang/Object;" since="24"/>
+ <method name="lazySet(ILjava/lang/Object;)V" since="9"/>
+ <method name="length()I"/>
+ <method name="set(ILjava/lang/Object;)V"/>
+ <method name="updateAndGet(ILjava/util/function/UnaryOperator;)Ljava/lang/Object;" since="24"/>
+ <method name="weakCompareAndSet(ILjava/lang/Object;Ljava/lang/Object;)Z"/>
+ </class>
+ <class name="java/util/concurrent/atomic/AtomicReferenceFieldUpdater" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="accumulateAndGet(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/function/BinaryOperator;)Ljava/lang/Object;" since="24"/>
+ <method name="compareAndSet(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z"/>
+ <method name="get(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="getAndAccumulate(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/function/BinaryOperator;)Ljava/lang/Object;" since="24"/>
+ <method name="getAndSet(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="getAndUpdate(Ljava/lang/Object;Ljava/util/function/UnaryOperator;)Ljava/lang/Object;" since="24"/>
+ <method name="lazySet(Ljava/lang/Object;Ljava/lang/Object;)V" since="9"/>
+ <method name="newUpdater(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/String;)Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;"/>
+ <method name="set(Ljava/lang/Object;Ljava/lang/Object;)V"/>
+ <method name="updateAndGet(Ljava/lang/Object;Ljava/util/function/UnaryOperator;)Ljava/lang/Object;" since="24"/>
+ <method name="weakCompareAndSet(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z"/>
+ </class>
+ <class name="java/util/concurrent/atomic/AtomicStampedReference" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/Object;I)V"/>
+ <method name="attemptStamp(Ljava/lang/Object;I)Z"/>
+ <method name="compareAndSet(Ljava/lang/Object;Ljava/lang/Object;II)Z"/>
+ <method name="get([I)Ljava/lang/Object;"/>
+ <method name="getReference()Ljava/lang/Object;"/>
+ <method name="getStamp()I"/>
+ <method name="set(Ljava/lang/Object;I)V"/>
+ <method name="weakCompareAndSet(Ljava/lang/Object;Ljava/lang/Object;II)Z"/>
+ </class>
+ <class name="java/util/concurrent/atomic/DoubleAccumulator" since="24">
+ <extends name="java/util/concurrent/atomic/Striped64"/>
+ <method name="&lt;init>(Ljava/util/function/DoubleBinaryOperator;D)V"/>
+ <method name="accumulate(D)V"/>
+ <method name="get()D"/>
+ <method name="getThenReset()D"/>
+ <method name="reset()V"/>
+ </class>
+ <class name="java/util/concurrent/atomic/DoubleAdder" since="24">
+ <extends name="java/util/concurrent/atomic/Striped64"/>
+ <method name="&lt;init>()V"/>
+ <method name="add(D)V"/>
+ <method name="reset()V"/>
+ <method name="sum()D"/>
+ <method name="sumThenReset()D"/>
+ </class>
+ <class name="java/util/concurrent/atomic/LongAccumulator" since="24">
+ <extends name="java/util/concurrent/atomic/Striped64"/>
+ <method name="&lt;init>(Ljava/util/function/LongBinaryOperator;J)V"/>
+ <method name="accumulate(J)V"/>
+ <method name="get()J"/>
+ <method name="getThenReset()J"/>
+ <method name="reset()V"/>
+ </class>
+ <class name="java/util/concurrent/atomic/LongAdder" since="24">
+ <extends name="java/util/concurrent/atomic/Striped64"/>
+ <method name="&lt;init>()V"/>
+ <method name="add(J)V"/>
+ <method name="decrement()V"/>
+ <method name="increment()V"/>
+ <method name="reset()V"/>
+ <method name="sum()J"/>
+ <method name="sumThenReset()J"/>
+ </class>
+ <class name="java/util/concurrent/atomic/Striped64" since="24">
+ <extends name="java/lang/Number"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/util/concurrent/locks/AbstractOwnableSynchronizer" since="5">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="getExclusiveOwnerThread()Ljava/lang/Thread;"/>
+ <method name="setExclusiveOwnerThread(Ljava/lang/Thread;)V"/>
+ </class>
+ <class name="java/util/concurrent/locks/AbstractQueuedLongSynchronizer" since="9">
+ <extends name="java/util/concurrent/locks/AbstractOwnableSynchronizer"/>
+ <method name="&lt;init>()V"/>
+ <method name="acquire(J)V"/>
+ <method name="acquireInterruptibly(J)V"/>
+ <method name="acquireShared(J)V"/>
+ <method name="acquireSharedInterruptibly(J)V"/>
+ <method name="compareAndSetState(JJ)Z"/>
+ <method name="getExclusiveQueuedThreads()Ljava/util/Collection;"/>
+ <method name="getFirstQueuedThread()Ljava/lang/Thread;"/>
+ <method name="getQueueLength()I"/>
+ <method name="getQueuedThreads()Ljava/util/Collection;"/>
+ <method name="getSharedQueuedThreads()Ljava/util/Collection;"/>
+ <method name="getState()J"/>
+ <method name="getWaitQueueLength(Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject;)I"/>
+ <method name="getWaitingThreads(Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject;)Ljava/util/Collection;"/>
+ <method name="hasContended()Z"/>
+ <method name="hasQueuedPredecessors()Z" since="21"/>
+ <method name="hasQueuedThreads()Z"/>
+ <method name="hasWaiters(Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject;)Z"/>
+ <method name="isHeldExclusively()Z"/>
+ <method name="isQueued(Ljava/lang/Thread;)Z"/>
+ <method name="owns(Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject;)Z"/>
+ <method name="release(J)Z"/>
+ <method name="releaseShared(J)Z"/>
+ <method name="setState(J)V"/>
+ <method name="tryAcquire(J)Z"/>
+ <method name="tryAcquireNanos(JJ)Z"/>
+ <method name="tryAcquireShared(J)J"/>
+ <method name="tryAcquireSharedNanos(JJ)Z"/>
+ <method name="tryRelease(J)Z"/>
+ <method name="tryReleaseShared(J)Z"/>
+ </class>
+ <class name="java/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject" since="9">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/util/concurrent/locks/Condition"/>
+ <method name="&lt;init>(Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;)V"/>
+ <method name="getWaitQueueLength()I"/>
+ <method name="getWaitingThreads()Ljava/util/Collection;"/>
+ <method name="hasWaiters()Z"/>
+ </class>
+ <class name="java/util/concurrent/locks/AbstractQueuedSynchronizer" since="1">
+ <extends name="java/lang/Object" removed="5"/>
+ <extends name="java/util/concurrent/locks/AbstractOwnableSynchronizer" since="5"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="acquire(I)V"/>
+ <method name="acquireInterruptibly(I)V"/>
+ <method name="acquireShared(I)V"/>
+ <method name="acquireSharedInterruptibly(I)V"/>
+ <method name="compareAndSetState(II)Z"/>
+ <method name="getExclusiveQueuedThreads()Ljava/util/Collection;"/>
+ <method name="getFirstQueuedThread()Ljava/lang/Thread;"/>
+ <method name="getQueueLength()I"/>
+ <method name="getQueuedThreads()Ljava/util/Collection;"/>
+ <method name="getSharedQueuedThreads()Ljava/util/Collection;"/>
+ <method name="getState()I"/>
+ <method name="getWaitQueueLength(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;)I"/>
+ <method name="getWaitingThreads(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;)Ljava/util/Collection;"/>
+ <method name="hasContended()Z"/>
+ <method name="hasQueuedPredecessors()Z" since="21"/>
+ <method name="hasQueuedThreads()Z"/>
+ <method name="hasWaiters(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;)Z"/>
+ <method name="isHeldExclusively()Z"/>
+ <method name="isQueued(Ljava/lang/Thread;)Z"/>
+ <method name="owns(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;)Z"/>
+ <method name="release(I)Z"/>
+ <method name="releaseShared(I)Z"/>
+ <method name="setState(I)V"/>
+ <method name="tryAcquire(I)Z"/>
+ <method name="tryAcquireNanos(IJ)Z"/>
+ <method name="tryAcquireShared(I)I"/>
+ <method name="tryAcquireSharedNanos(IJ)Z"/>
+ <method name="tryRelease(I)Z"/>
+ <method name="tryReleaseShared(I)Z"/>
+ </class>
+ <class name="java/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/util/concurrent/locks/Condition"/>
+ <method name="&lt;init>(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;)V"/>
+ <method name="getWaitQueueLength()I"/>
+ <method name="getWaitingThreads()Ljava/util/Collection;"/>
+ <method name="hasWaiters()Z"/>
+ </class>
+ <class name="java/util/concurrent/locks/Condition" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="await()V"/>
+ <method name="await(JLjava/util/concurrent/TimeUnit;)Z"/>
+ <method name="awaitNanos(J)J"/>
+ <method name="awaitUninterruptibly()V"/>
+ <method name="awaitUntil(Ljava/util/Date;)Z"/>
+ <method name="signal()V"/>
+ <method name="signalAll()V"/>
+ </class>
+ <class name="java/util/concurrent/locks/Lock" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="lock()V"/>
+ <method name="lockInterruptibly()V"/>
+ <method name="newCondition()Ljava/util/concurrent/locks/Condition;"/>
+ <method name="tryLock()Z"/>
+ <method name="tryLock(JLjava/util/concurrent/TimeUnit;)Z"/>
+ <method name="unlock()V"/>
+ </class>
+ <class name="java/util/concurrent/locks/LockSupport" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getBlocker(Ljava/lang/Thread;)Ljava/lang/Object;" since="9"/>
+ <method name="park()V"/>
+ <method name="park(Ljava/lang/Object;)V" since="9"/>
+ <method name="parkNanos(J)V"/>
+ <method name="parkNanos(Ljava/lang/Object;J)V" since="9"/>
+ <method name="parkUntil(J)V"/>
+ <method name="parkUntil(Ljava/lang/Object;J)V" since="9"/>
+ <method name="unpark(Ljava/lang/Thread;)V"/>
+ </class>
+ <class name="java/util/concurrent/locks/ReadWriteLock" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="readLock()Ljava/util/concurrent/locks/Lock;"/>
+ <method name="writeLock()Ljava/util/concurrent/locks/Lock;"/>
+ </class>
+ <class name="java/util/concurrent/locks/ReentrantLock" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/util/concurrent/locks/Lock"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Z)V"/>
+ <method name="getHoldCount()I"/>
+ <method name="getOwner()Ljava/lang/Thread;"/>
+ <method name="getQueueLength()I"/>
+ <method name="getQueuedThreads()Ljava/util/Collection;"/>
+ <method name="getWaitQueueLength(Ljava/util/concurrent/locks/Condition;)I"/>
+ <method name="getWaitingThreads(Ljava/util/concurrent/locks/Condition;)Ljava/util/Collection;"/>
+ <method name="hasQueuedThread(Ljava/lang/Thread;)Z"/>
+ <method name="hasQueuedThreads()Z"/>
+ <method name="hasWaiters(Ljava/util/concurrent/locks/Condition;)Z"/>
+ <method name="isFair()Z"/>
+ <method name="isHeldByCurrentThread()Z"/>
+ <method name="isLocked()Z"/>
+ </class>
+ <class name="java/util/concurrent/locks/ReentrantReadWriteLock" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/util/concurrent/locks/ReadWriteLock"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Z)V"/>
+ <method name="getOwner()Ljava/lang/Thread;"/>
+ <method name="getQueueLength()I"/>
+ <method name="getQueuedReaderThreads()Ljava/util/Collection;"/>
+ <method name="getQueuedThreads()Ljava/util/Collection;"/>
+ <method name="getQueuedWriterThreads()Ljava/util/Collection;"/>
+ <method name="getReadHoldCount()I" since="9"/>
+ <method name="getReadLockCount()I"/>
+ <method name="getWaitQueueLength(Ljava/util/concurrent/locks/Condition;)I"/>
+ <method name="getWaitingThreads(Ljava/util/concurrent/locks/Condition;)Ljava/util/Collection;"/>
+ <method name="getWriteHoldCount()I"/>
+ <method name="hasQueuedThread(Ljava/lang/Thread;)Z"/>
+ <method name="hasQueuedThreads()Z"/>
+ <method name="hasWaiters(Ljava/util/concurrent/locks/Condition;)Z"/>
+ <method name="isFair()Z"/>
+ <method name="isWriteLocked()Z"/>
+ <method name="isWriteLockedByCurrentThread()Z"/>
+ <method name="readLock()Ljava/util/concurrent/locks/ReentrantReadWriteLock$ReadLock;"/>
+ <method name="writeLock()Ljava/util/concurrent/locks/ReentrantReadWriteLock$WriteLock;"/>
+ </class>
+ <class name="java/util/concurrent/locks/ReentrantReadWriteLock$ReadLock" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/util/concurrent/locks/Lock"/>
+ <method name="&lt;init>(Ljava/util/concurrent/locks/ReentrantReadWriteLock;)V"/>
+ </class>
+ <class name="java/util/concurrent/locks/ReentrantReadWriteLock$WriteLock" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/util/concurrent/locks/Lock"/>
+ <method name="&lt;init>(Ljava/util/concurrent/locks/ReentrantReadWriteLock;)V"/>
+ <method name="getHoldCount()I" since="9"/>
+ <method name="isHeldByCurrentThread()Z" since="9"/>
+ </class>
+ <class name="java/util/concurrent/locks/StampedLock" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="asReadLock()Ljava/util/concurrent/locks/Lock;"/>
+ <method name="asReadWriteLock()Ljava/util/concurrent/locks/ReadWriteLock;"/>
+ <method name="asWriteLock()Ljava/util/concurrent/locks/Lock;"/>
+ <method name="getReadLockCount()I"/>
+ <method name="isReadLocked()Z"/>
+ <method name="isWriteLocked()Z"/>
+ <method name="readLock()J"/>
+ <method name="readLockInterruptibly()J"/>
+ <method name="tryConvertToOptimisticRead(J)J"/>
+ <method name="tryConvertToReadLock(J)J"/>
+ <method name="tryConvertToWriteLock(J)J"/>
+ <method name="tryOptimisticRead()J"/>
+ <method name="tryReadLock()J"/>
+ <method name="tryReadLock(JLjava/util/concurrent/TimeUnit;)J"/>
+ <method name="tryUnlockRead()Z"/>
+ <method name="tryUnlockWrite()Z"/>
+ <method name="tryWriteLock()J"/>
+ <method name="tryWriteLock(JLjava/util/concurrent/TimeUnit;)J"/>
+ <method name="unlock(J)V"/>
+ <method name="unlockRead(J)V"/>
+ <method name="unlockWrite(J)V"/>
+ <method name="validate(J)Z"/>
+ <method name="writeLock()J"/>
+ <method name="writeLockInterruptibly()J"/>
+ </class>
+ <class name="java/util/function/BiConsumer" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="accept(Ljava/lang/Object;Ljava/lang/Object;)V"/>
+ <method name="andThen(Ljava/util/function/BiConsumer;)Ljava/util/function/BiConsumer;"/>
+ </class>
+ <class name="java/util/function/BiFunction" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="andThen(Ljava/util/function/Function;)Ljava/util/function/BiFunction;"/>
+ <method name="apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"/>
+ </class>
+ <class name="java/util/function/BiPredicate" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="and(Ljava/util/function/BiPredicate;)Ljava/util/function/BiPredicate;"/>
+ <method name="negate()Ljava/util/function/BiPredicate;"/>
+ <method name="or(Ljava/util/function/BiPredicate;)Ljava/util/function/BiPredicate;"/>
+ <method name="test(Ljava/lang/Object;Ljava/lang/Object;)Z"/>
+ </class>
+ <class name="java/util/function/BinaryOperator" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/function/BiFunction"/>
+ <method name="maxBy(Ljava/util/Comparator;)Ljava/util/function/BinaryOperator;"/>
+ <method name="minBy(Ljava/util/Comparator;)Ljava/util/function/BinaryOperator;"/>
+ </class>
+ <class name="java/util/function/BooleanSupplier" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="getAsBoolean()Z"/>
+ </class>
+ <class name="java/util/function/Consumer" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="accept(Ljava/lang/Object;)V"/>
+ <method name="andThen(Ljava/util/function/Consumer;)Ljava/util/function/Consumer;"/>
+ </class>
+ <class name="java/util/function/DoubleBinaryOperator" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="applyAsDouble(DD)D"/>
+ </class>
+ <class name="java/util/function/DoubleConsumer" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="accept(D)V"/>
+ <method name="andThen(Ljava/util/function/DoubleConsumer;)Ljava/util/function/DoubleConsumer;"/>
+ </class>
+ <class name="java/util/function/DoubleFunction" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="apply(D)Ljava/lang/Object;"/>
+ </class>
+ <class name="java/util/function/DoublePredicate" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="and(Ljava/util/function/DoublePredicate;)Ljava/util/function/DoublePredicate;"/>
+ <method name="negate()Ljava/util/function/DoublePredicate;"/>
+ <method name="or(Ljava/util/function/DoublePredicate;)Ljava/util/function/DoublePredicate;"/>
+ <method name="test(D)Z"/>
+ </class>
+ <class name="java/util/function/DoubleSupplier" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="getAsDouble()D"/>
+ </class>
+ <class name="java/util/function/DoubleToIntFunction" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="applyAsInt(D)I"/>
+ </class>
+ <class name="java/util/function/DoubleToLongFunction" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="applyAsLong(D)J"/>
+ </class>
+ <class name="java/util/function/DoubleUnaryOperator" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="andThen(Ljava/util/function/DoubleUnaryOperator;)Ljava/util/function/DoubleUnaryOperator;"/>
+ <method name="applyAsDouble(D)D"/>
+ <method name="compose(Ljava/util/function/DoubleUnaryOperator;)Ljava/util/function/DoubleUnaryOperator;"/>
+ <method name="identity()Ljava/util/function/DoubleUnaryOperator;"/>
+ </class>
+ <class name="java/util/function/Function" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="andThen(Ljava/util/function/Function;)Ljava/util/function/Function;"/>
+ <method name="apply(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ <method name="compose(Ljava/util/function/Function;)Ljava/util/function/Function;"/>
+ <method name="identity()Ljava/util/function/Function;"/>
+ </class>
+ <class name="java/util/function/IntBinaryOperator" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="applyAsInt(II)I"/>
+ </class>
+ <class name="java/util/function/IntConsumer" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="accept(I)V"/>
+ <method name="andThen(Ljava/util/function/IntConsumer;)Ljava/util/function/IntConsumer;"/>
+ </class>
+ <class name="java/util/function/IntFunction" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="apply(I)Ljava/lang/Object;"/>
+ </class>
+ <class name="java/util/function/IntPredicate" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="and(Ljava/util/function/IntPredicate;)Ljava/util/function/IntPredicate;"/>
+ <method name="negate()Ljava/util/function/IntPredicate;"/>
+ <method name="or(Ljava/util/function/IntPredicate;)Ljava/util/function/IntPredicate;"/>
+ <method name="test(I)Z"/>
+ </class>
+ <class name="java/util/function/IntSupplier" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="getAsInt()I"/>
+ </class>
+ <class name="java/util/function/IntToDoubleFunction" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="applyAsDouble(I)D"/>
+ </class>
+ <class name="java/util/function/IntToLongFunction" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="applyAsLong(I)J"/>
+ </class>
+ <class name="java/util/function/IntUnaryOperator" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="andThen(Ljava/util/function/IntUnaryOperator;)Ljava/util/function/IntUnaryOperator;"/>
+ <method name="applyAsInt(I)I"/>
+ <method name="compose(Ljava/util/function/IntUnaryOperator;)Ljava/util/function/IntUnaryOperator;"/>
+ <method name="identity()Ljava/util/function/IntUnaryOperator;"/>
+ </class>
+ <class name="java/util/function/LongBinaryOperator" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="applyAsLong(JJ)J"/>
+ </class>
+ <class name="java/util/function/LongConsumer" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="accept(J)V"/>
+ <method name="andThen(Ljava/util/function/LongConsumer;)Ljava/util/function/LongConsumer;"/>
+ </class>
+ <class name="java/util/function/LongFunction" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="apply(J)Ljava/lang/Object;"/>
+ </class>
+ <class name="java/util/function/LongPredicate" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="and(Ljava/util/function/LongPredicate;)Ljava/util/function/LongPredicate;"/>
+ <method name="negate()Ljava/util/function/LongPredicate;"/>
+ <method name="or(Ljava/util/function/LongPredicate;)Ljava/util/function/LongPredicate;"/>
+ <method name="test(J)Z"/>
+ </class>
+ <class name="java/util/function/LongSupplier" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="getAsLong()J"/>
+ </class>
+ <class name="java/util/function/LongToDoubleFunction" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="applyAsDouble(J)D"/>
+ </class>
+ <class name="java/util/function/LongToIntFunction" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="applyAsInt(J)I"/>
+ </class>
+ <class name="java/util/function/LongUnaryOperator" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="andThen(Ljava/util/function/LongUnaryOperator;)Ljava/util/function/LongUnaryOperator;"/>
+ <method name="applyAsLong(J)J"/>
+ <method name="compose(Ljava/util/function/LongUnaryOperator;)Ljava/util/function/LongUnaryOperator;"/>
+ <method name="identity()Ljava/util/function/LongUnaryOperator;"/>
+ </class>
+ <class name="java/util/function/ObjDoubleConsumer" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="accept(Ljava/lang/Object;D)V"/>
+ </class>
+ <class name="java/util/function/ObjIntConsumer" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="accept(Ljava/lang/Object;I)V"/>
+ </class>
+ <class name="java/util/function/ObjLongConsumer" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="accept(Ljava/lang/Object;J)V"/>
+ </class>
+ <class name="java/util/function/Predicate" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="and(Ljava/util/function/Predicate;)Ljava/util/function/Predicate;"/>
+ <method name="isEqual(Ljava/lang/Object;)Ljava/util/function/Predicate;"/>
+ <method name="negate()Ljava/util/function/Predicate;"/>
+ <method name="or(Ljava/util/function/Predicate;)Ljava/util/function/Predicate;"/>
+ <method name="test(Ljava/lang/Object;)Z"/>
+ </class>
+ <class name="java/util/function/Supplier" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="get()Ljava/lang/Object;"/>
+ </class>
+ <class name="java/util/function/ToDoubleBiFunction" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="applyAsDouble(Ljava/lang/Object;Ljava/lang/Object;)D"/>
+ </class>
+ <class name="java/util/function/ToDoubleFunction" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="applyAsDouble(Ljava/lang/Object;)D"/>
+ </class>
+ <class name="java/util/function/ToIntBiFunction" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="applyAsInt(Ljava/lang/Object;Ljava/lang/Object;)I"/>
+ </class>
+ <class name="java/util/function/ToIntFunction" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="applyAsInt(Ljava/lang/Object;)I"/>
+ </class>
+ <class name="java/util/function/ToLongBiFunction" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="applyAsLong(Ljava/lang/Object;Ljava/lang/Object;)J"/>
+ </class>
+ <class name="java/util/function/ToLongFunction" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="applyAsLong(Ljava/lang/Object;)J"/>
+ </class>
+ <class name="java/util/function/UnaryOperator" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/function/Function"/>
+ <method name="identity()Ljava/util/function/UnaryOperator;"/>
+ </class>
+ <class name="java/util/jar/Attributes" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="java/util/Map"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(Ljava/util/jar/Attributes;)V"/>
+ <method name="getValue(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getValue(Ljava/util/jar/Attributes$Name;)Ljava/lang/String;"/>
+ <method name="putValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <field name="map"/>
+ </class>
+ <class name="java/util/jar/Attributes$Name" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <field name="CLASS_PATH"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="EXTENSION_INSTALLATION" deprecated="26"/>
+ <field name="EXTENSION_LIST"/>
+ <field name="EXTENSION_NAME"/>
+ <field name="IMPLEMENTATION_TITLE"/>
+ <field name="IMPLEMENTATION_URL" deprecated="26"/>
+ <field name="IMPLEMENTATION_VENDOR"/>
+ <field name="IMPLEMENTATION_VENDOR_ID" deprecated="26"/>
+ <field name="IMPLEMENTATION_VERSION"/>
+ <field name="MAIN_CLASS"/>
+ <field name="MANIFEST_VERSION"/>
+ <field name="SEALED"/>
+ <field name="SIGNATURE_VERSION"/>
+ <field name="SPECIFICATION_TITLE"/>
+ <field name="SPECIFICATION_VENDOR"/>
+ <field name="SPECIFICATION_VERSION"/>
+ </class>
+ <class name="java/util/jar/JarEntry" since="1">
+ <extends name="java/util/zip/ZipEntry"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/util/jar/JarEntry;)V"/>
+ <method name="&lt;init>(Ljava/util/zip/ZipEntry;)V"/>
+ <method name="getAttributes()Ljava/util/jar/Attributes;"/>
+ <method name="getCertificates()[Ljava/security/cert/Certificate;"/>
+ <method name="getCodeSigners()[Ljava/security/CodeSigner;"/>
+ </class>
+ <class name="java/util/jar/JarException" since="1">
+ <extends name="java/util/zip/ZipException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/util/jar/JarFile" since="1">
+ <extends name="java/util/zip/ZipFile"/>
+ <method name="&lt;init>(Ljava/io/File;)V"/>
+ <method name="&lt;init>(Ljava/io/File;Z)V"/>
+ <method name="&lt;init>(Ljava/io/File;ZI)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Z)V"/>
+ <method name="getJarEntry(Ljava/lang/String;)Ljava/util/jar/JarEntry;"/>
+ <method name="getManifest()Ljava/util/jar/Manifest;"/>
+ <field name="MANIFEST_NAME"/>
+ </class>
+ <class name="java/util/jar/JarInputStream" since="1">
+ <extends name="java/util/zip/ZipInputStream"/>
+ <method name="&lt;init>(Ljava/io/InputStream;)V"/>
+ <method name="&lt;init>(Ljava/io/InputStream;Z)V"/>
+ <method name="getManifest()Ljava/util/jar/Manifest;"/>
+ <method name="getNextJarEntry()Ljava/util/jar/JarEntry;"/>
+ </class>
+ <class name="java/util/jar/JarOutputStream" since="1">
+ <extends name="java/util/zip/ZipOutputStream"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;)V"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/util/jar/Manifest;)V"/>
+ </class>
+ <class name="java/util/jar/Manifest" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/io/InputStream;)V"/>
+ <method name="&lt;init>(Ljava/util/jar/Manifest;)V"/>
+ <method name="clear()V"/>
+ <method name="getAttributes(Ljava/lang/String;)Ljava/util/jar/Attributes;"/>
+ <method name="getEntries()Ljava/util/Map;"/>
+ <method name="getMainAttributes()Ljava/util/jar/Attributes;"/>
+ <method name="read(Ljava/io/InputStream;)V"/>
+ <method name="write(Ljava/io/OutputStream;)V"/>
+ </class>
+ <class name="java/util/jar/Pack200" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="newPacker()Ljava/util/jar/Pack200$Packer;"/>
+ <method name="newUnpacker()Ljava/util/jar/Pack200$Unpacker;"/>
+ </class>
+ <class name="java/util/jar/Pack200$Packer" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="addPropertyChangeListener(Ljava/beans/PropertyChangeListener;)V" since="3" deprecated="26"/>
+ <method name="pack(Ljava/util/jar/JarFile;Ljava/io/OutputStream;)V"/>
+ <method name="pack(Ljava/util/jar/JarInputStream;Ljava/io/OutputStream;)V"/>
+ <method name="properties()Ljava/util/SortedMap;"/>
+ <method name="removePropertyChangeListener(Ljava/beans/PropertyChangeListener;)V" since="3" deprecated="26"/>
+ <field name="CLASS_ATTRIBUTE_PFX"/>
+ <field name="CODE_ATTRIBUTE_PFX"/>
+ <field name="DEFLATE_HINT"/>
+ <field name="EFFORT"/>
+ <field name="ERROR"/>
+ <field name="FALSE"/>
+ <field name="FIELD_ATTRIBUTE_PFX"/>
+ <field name="KEEP"/>
+ <field name="KEEP_FILE_ORDER"/>
+ <field name="LATEST"/>
+ <field name="METHOD_ATTRIBUTE_PFX"/>
+ <field name="MODIFICATION_TIME"/>
+ <field name="PASS"/>
+ <field name="PASS_FILE_PFX"/>
+ <field name="PROGRESS"/>
+ <field name="SEGMENT_LIMIT"/>
+ <field name="STRIP"/>
+ <field name="TRUE"/>
+ <field name="UNKNOWN_ATTRIBUTE"/>
+ </class>
+ <class name="java/util/jar/Pack200$Unpacker" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="addPropertyChangeListener(Ljava/beans/PropertyChangeListener;)V" since="3" deprecated="26"/>
+ <method name="properties()Ljava/util/SortedMap;"/>
+ <method name="removePropertyChangeListener(Ljava/beans/PropertyChangeListener;)V" since="3" deprecated="26"/>
+ <method name="unpack(Ljava/io/File;Ljava/util/jar/JarOutputStream;)V"/>
+ <method name="unpack(Ljava/io/InputStream;Ljava/util/jar/JarOutputStream;)V"/>
+ <field name="DEFLATE_HINT"/>
+ <field name="FALSE"/>
+ <field name="KEEP"/>
+ <field name="PROGRESS"/>
+ <field name="TRUE"/>
+ </class>
+ <class name="java/util/logging/ConsoleHandler" since="1">
+ <extends name="java/util/logging/StreamHandler"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/util/logging/ErrorManager" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="error(Ljava/lang/String;Ljava/lang/Exception;I)V"/>
+ <field name="CLOSE_FAILURE"/>
+ <field name="FLUSH_FAILURE"/>
+ <field name="FORMAT_FAILURE"/>
+ <field name="GENERIC_FAILURE"/>
+ <field name="OPEN_FAILURE"/>
+ <field name="WRITE_FAILURE"/>
+ </class>
+ <class name="java/util/logging/FileHandler" since="1">
+ <extends name="java/util/logging/StreamHandler"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;II)V"/>
+ <method name="&lt;init>(Ljava/lang/String;IIZ)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Z)V"/>
+ </class>
+ <class name="java/util/logging/Filter" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="isLoggable(Ljava/util/logging/LogRecord;)Z"/>
+ </class>
+ <class name="java/util/logging/Formatter" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="format(Ljava/util/logging/LogRecord;)Ljava/lang/String;"/>
+ <method name="formatMessage(Ljava/util/logging/LogRecord;)Ljava/lang/String;"/>
+ <method name="getHead(Ljava/util/logging/Handler;)Ljava/lang/String;"/>
+ <method name="getTail(Ljava/util/logging/Handler;)Ljava/lang/String;"/>
+ </class>
+ <class name="java/util/logging/Handler" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="close()V"/>
+ <method name="flush()V"/>
+ <method name="getEncoding()Ljava/lang/String;"/>
+ <method name="getErrorManager()Ljava/util/logging/ErrorManager;"/>
+ <method name="getFilter()Ljava/util/logging/Filter;"/>
+ <method name="getFormatter()Ljava/util/logging/Formatter;"/>
+ <method name="getLevel()Ljava/util/logging/Level;"/>
+ <method name="isLoggable(Ljava/util/logging/LogRecord;)Z"/>
+ <method name="publish(Ljava/util/logging/LogRecord;)V"/>
+ <method name="reportError(Ljava/lang/String;Ljava/lang/Exception;I)V"/>
+ <method name="setEncoding(Ljava/lang/String;)V"/>
+ <method name="setErrorManager(Ljava/util/logging/ErrorManager;)V"/>
+ <method name="setFilter(Ljava/util/logging/Filter;)V"/>
+ <method name="setFormatter(Ljava/util/logging/Formatter;)V"/>
+ <method name="setLevel(Ljava/util/logging/Level;)V"/>
+ </class>
+ <class name="java/util/logging/Level" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;ILjava/lang/String;)V"/>
+ <method name="getLocalizedName()Ljava/lang/String;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getResourceBundleName()Ljava/lang/String;"/>
+ <method name="intValue()I"/>
+ <method name="parse(Ljava/lang/String;)Ljava/util/logging/Level;"/>
+ <field name="ALL"/>
+ <field name="CONFIG"/>
+ <field name="FINE"/>
+ <field name="FINER"/>
+ <field name="FINEST"/>
+ <field name="INFO"/>
+ <field name="OFF"/>
+ <field name="SEVERE"/>
+ <field name="WARNING"/>
+ </class>
+ <class name="java/util/logging/LogManager" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addLogger(Ljava/util/logging/Logger;)Z"/>
+ <method name="addPropertyChangeListener(Ljava/beans/PropertyChangeListener;)V" since="3" deprecated="26"/>
+ <method name="checkAccess()V"/>
+ <method name="getLogManager()Ljava/util/logging/LogManager;"/>
+ <method name="getLogger(Ljava/lang/String;)Ljava/util/logging/Logger;"/>
+ <method name="getLoggerNames()Ljava/util/Enumeration;"/>
+ <method name="getLoggingMXBean()Ljava/util/logging/LoggingMXBean;" since="3"/>
+ <method name="getProperty(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="readConfiguration()V"/>
+ <method name="readConfiguration(Ljava/io/InputStream;)V"/>
+ <method name="removePropertyChangeListener(Ljava/beans/PropertyChangeListener;)V" since="3" deprecated="26"/>
+ <method name="reset()V"/>
+ <field name="LOGGING_MXBEAN_NAME"/>
+ </class>
+ <class name="java/util/logging/LogRecord" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(Ljava/util/logging/Level;Ljava/lang/String;)V"/>
+ <method name="getLevel()Ljava/util/logging/Level;"/>
+ <method name="getLoggerName()Ljava/lang/String;"/>
+ <method name="getMessage()Ljava/lang/String;"/>
+ <method name="getMillis()J"/>
+ <method name="getParameters()[Ljava/lang/Object;"/>
+ <method name="getResourceBundle()Ljava/util/ResourceBundle;"/>
+ <method name="getResourceBundleName()Ljava/lang/String;"/>
+ <method name="getSequenceNumber()J"/>
+ <method name="getSourceClassName()Ljava/lang/String;"/>
+ <method name="getSourceMethodName()Ljava/lang/String;"/>
+ <method name="getThreadID()I"/>
+ <method name="getThrown()Ljava/lang/Throwable;"/>
+ <method name="setLevel(Ljava/util/logging/Level;)V"/>
+ <method name="setLoggerName(Ljava/lang/String;)V"/>
+ <method name="setMessage(Ljava/lang/String;)V"/>
+ <method name="setMillis(J)V"/>
+ <method name="setParameters([Ljava/lang/Object;)V"/>
+ <method name="setResourceBundle(Ljava/util/ResourceBundle;)V"/>
+ <method name="setResourceBundleName(Ljava/lang/String;)V"/>
+ <method name="setSequenceNumber(J)V"/>
+ <method name="setSourceClassName(Ljava/lang/String;)V"/>
+ <method name="setSourceMethodName(Ljava/lang/String;)V"/>
+ <method name="setThreadID(I)V"/>
+ <method name="setThrown(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/util/logging/Logger" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="addHandler(Ljava/util/logging/Handler;)V"/>
+ <method name="config(Ljava/lang/String;)V"/>
+ <method name="config(Ljava/util/function/Supplier;)V" since="26"/>
+ <method name="entering(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="entering(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V"/>
+ <method name="entering(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V"/>
+ <method name="exiting(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="exiting(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V"/>
+ <method name="fine(Ljava/lang/String;)V"/>
+ <method name="fine(Ljava/util/function/Supplier;)V" since="26"/>
+ <method name="finer(Ljava/lang/String;)V"/>
+ <method name="finer(Ljava/util/function/Supplier;)V" since="26"/>
+ <method name="finest(Ljava/lang/String;)V"/>
+ <method name="finest(Ljava/util/function/Supplier;)V" since="26"/>
+ <method name="getAnonymousLogger()Ljava/util/logging/Logger;"/>
+ <method name="getAnonymousLogger(Ljava/lang/String;)Ljava/util/logging/Logger;"/>
+ <method name="getFilter()Ljava/util/logging/Filter;"/>
+ <method name="getGlobal()Ljava/util/logging/Logger;" since="19"/>
+ <method name="getHandlers()[Ljava/util/logging/Handler;"/>
+ <method name="getLevel()Ljava/util/logging/Level;"/>
+ <method name="getLogger(Ljava/lang/String;)Ljava/util/logging/Logger;"/>
+ <method name="getLogger(Ljava/lang/String;Ljava/lang/String;)Ljava/util/logging/Logger;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getParent()Ljava/util/logging/Logger;"/>
+ <method name="getResourceBundle()Ljava/util/ResourceBundle;"/>
+ <method name="getResourceBundleName()Ljava/lang/String;"/>
+ <method name="getUseParentHandlers()Z"/>
+ <method name="info(Ljava/lang/String;)V"/>
+ <method name="info(Ljava/util/function/Supplier;)V" since="26"/>
+ <method name="isLoggable(Ljava/util/logging/Level;)Z"/>
+ <method name="log(Ljava/util/logging/Level;Ljava/lang/String;)V"/>
+ <method name="log(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/Object;)V"/>
+ <method name="log(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="log(Ljava/util/logging/Level;Ljava/lang/String;[Ljava/lang/Object;)V"/>
+ <method name="log(Ljava/util/logging/Level;Ljava/lang/Throwable;Ljava/util/function/Supplier;)V" since="26"/>
+ <method name="log(Ljava/util/logging/Level;Ljava/util/function/Supplier;)V" since="26"/>
+ <method name="log(Ljava/util/logging/LogRecord;)V"/>
+ <method name="logp(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="logp(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V"/>
+ <method name="logp(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="logp(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V"/>
+ <method name="logp(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;Ljava/util/function/Supplier;)V" since="26"/>
+ <method name="logp(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/util/function/Supplier;)V" since="26"/>
+ <method name="logrb(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" deprecated="26"/>
+ <method name="logrb(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V" deprecated="26"/>
+ <method name="logrb(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V" deprecated="26"/>
+ <method name="logrb(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V" deprecated="26"/>
+ <method name="logrb(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/util/ResourceBundle;Ljava/lang/String;Ljava/lang/Throwable;)V" since="26"/>
+ <method name="logrb(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/util/ResourceBundle;Ljava/lang/String;[Ljava/lang/Object;)V" since="26"/>
+ <method name="removeHandler(Ljava/util/logging/Handler;)V"/>
+ <method name="setFilter(Ljava/util/logging/Filter;)V"/>
+ <method name="setLevel(Ljava/util/logging/Level;)V"/>
+ <method name="setParent(Ljava/util/logging/Logger;)V"/>
+ <method name="setResourceBundle(Ljava/util/ResourceBundle;)V" since="26"/>
+ <method name="setUseParentHandlers(Z)V"/>
+ <method name="severe(Ljava/lang/String;)V"/>
+ <method name="severe(Ljava/util/function/Supplier;)V" since="26"/>
+ <method name="throwing(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="warning(Ljava/lang/String;)V"/>
+ <method name="warning(Ljava/util/function/Supplier;)V" since="26"/>
+ <field name="GLOBAL_LOGGER_NAME" since="9"/>
+ <field name="global" deprecated="16"/>
+ </class>
+ <class name="java/util/logging/LoggingMXBean" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getLoggerLevel(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getLoggerNames()Ljava/util/List;"/>
+ <method name="getParentLoggerName(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="setLoggerLevel(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/util/logging/LoggingPermission" since="1">
+ <extends name="java/security/BasicPermission"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/util/logging/MemoryHandler" since="1">
+ <extends name="java/util/logging/Handler"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/util/logging/Handler;ILjava/util/logging/Level;)V"/>
+ <method name="getPushLevel()Ljava/util/logging/Level;"/>
+ <method name="push()V"/>
+ <method name="setPushLevel(Ljava/util/logging/Level;)V"/>
+ </class>
+ <class name="java/util/logging/SimpleFormatter" since="1">
+ <extends name="java/util/logging/Formatter"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/util/logging/SocketHandler" since="1">
+ <extends name="java/util/logging/StreamHandler"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ </class>
+ <class name="java/util/logging/StreamHandler" since="1">
+ <extends name="java/util/logging/Handler"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/util/logging/Formatter;)V"/>
+ <method name="setOutputStream(Ljava/io/OutputStream;)V"/>
+ </class>
+ <class name="java/util/logging/XMLFormatter" since="1">
+ <extends name="java/util/logging/Formatter"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="java/util/prefs/AbstractPreferences" since="1">
+ <extends name="java/util/prefs/Preferences"/>
+ <method name="&lt;init>(Ljava/util/prefs/AbstractPreferences;Ljava/lang/String;)V"/>
+ <method name="cachedChildren()[Ljava/util/prefs/AbstractPreferences;"/>
+ <method name="childSpi(Ljava/lang/String;)Ljava/util/prefs/AbstractPreferences;"/>
+ <method name="childrenNamesSpi()[Ljava/lang/String;"/>
+ <method name="flushSpi()V"/>
+ <method name="getChild(Ljava/lang/String;)Ljava/util/prefs/AbstractPreferences;"/>
+ <method name="getSpi(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="isRemoved()Z"/>
+ <method name="keysSpi()[Ljava/lang/String;"/>
+ <method name="putSpi(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="removeNodeSpi()V"/>
+ <method name="removeSpi(Ljava/lang/String;)V"/>
+ <method name="syncSpi()V"/>
+ <field name="lock"/>
+ <field name="newNode"/>
+ </class>
+ <class name="java/util/prefs/BackingStoreException" since="1">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/util/prefs/InvalidPreferencesFormatException" since="1">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="java/util/prefs/NodeChangeEvent" since="1">
+ <extends name="java/util/EventObject"/>
+ <method name="&lt;init>(Ljava/util/prefs/Preferences;Ljava/util/prefs/Preferences;)V"/>
+ <method name="getChild()Ljava/util/prefs/Preferences;"/>
+ <method name="getParent()Ljava/util/prefs/Preferences;"/>
+ </class>
+ <class name="java/util/prefs/NodeChangeListener" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/EventListener"/>
+ <method name="childAdded(Ljava/util/prefs/NodeChangeEvent;)V"/>
+ <method name="childRemoved(Ljava/util/prefs/NodeChangeEvent;)V"/>
+ </class>
+ <class name="java/util/prefs/PreferenceChangeEvent" since="1">
+ <extends name="java/util/EventObject"/>
+ <method name="&lt;init>(Ljava/util/prefs/Preferences;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="getKey()Ljava/lang/String;"/>
+ <method name="getNewValue()Ljava/lang/String;"/>
+ <method name="getNode()Ljava/util/prefs/Preferences;"/>
+ </class>
+ <class name="java/util/prefs/PreferenceChangeListener" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/EventListener"/>
+ <method name="preferenceChange(Ljava/util/prefs/PreferenceChangeEvent;)V"/>
+ </class>
+ <class name="java/util/prefs/Preferences" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="absolutePath()Ljava/lang/String;"/>
+ <method name="addNodeChangeListener(Ljava/util/prefs/NodeChangeListener;)V"/>
+ <method name="addPreferenceChangeListener(Ljava/util/prefs/PreferenceChangeListener;)V"/>
+ <method name="childrenNames()[Ljava/lang/String;"/>
+ <method name="clear()V"/>
+ <method name="exportNode(Ljava/io/OutputStream;)V"/>
+ <method name="exportSubtree(Ljava/io/OutputStream;)V"/>
+ <method name="flush()V"/>
+ <method name="get(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getBoolean(Ljava/lang/String;Z)Z"/>
+ <method name="getByteArray(Ljava/lang/String;[B)[B"/>
+ <method name="getDouble(Ljava/lang/String;D)D"/>
+ <method name="getFloat(Ljava/lang/String;F)F"/>
+ <method name="getInt(Ljava/lang/String;I)I"/>
+ <method name="getLong(Ljava/lang/String;J)J"/>
+ <method name="importPreferences(Ljava/io/InputStream;)V"/>
+ <method name="isUserNode()Z"/>
+ <method name="keys()[Ljava/lang/String;"/>
+ <method name="name()Ljava/lang/String;"/>
+ <method name="node(Ljava/lang/String;)Ljava/util/prefs/Preferences;"/>
+ <method name="nodeExists(Ljava/lang/String;)Z"/>
+ <method name="parent()Ljava/util/prefs/Preferences;"/>
+ <method name="put(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="putBoolean(Ljava/lang/String;Z)V"/>
+ <method name="putByteArray(Ljava/lang/String;[B)V"/>
+ <method name="putDouble(Ljava/lang/String;D)V"/>
+ <method name="putFloat(Ljava/lang/String;F)V"/>
+ <method name="putInt(Ljava/lang/String;I)V"/>
+ <method name="putLong(Ljava/lang/String;J)V"/>
+ <method name="remove(Ljava/lang/String;)V"/>
+ <method name="removeNode()V"/>
+ <method name="removeNodeChangeListener(Ljava/util/prefs/NodeChangeListener;)V"/>
+ <method name="removePreferenceChangeListener(Ljava/util/prefs/PreferenceChangeListener;)V"/>
+ <method name="sync()V"/>
+ <method name="systemNodeForPackage(Ljava/lang/Class;)Ljava/util/prefs/Preferences;"/>
+ <method name="systemRoot()Ljava/util/prefs/Preferences;"/>
+ <method name="userNodeForPackage(Ljava/lang/Class;)Ljava/util/prefs/Preferences;"/>
+ <method name="userRoot()Ljava/util/prefs/Preferences;"/>
+ <field name="MAX_KEY_LENGTH"/>
+ <field name="MAX_NAME_LENGTH"/>
+ <field name="MAX_VALUE_LENGTH"/>
+ </class>
+ <class name="java/util/prefs/PreferencesFactory" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="systemRoot()Ljava/util/prefs/Preferences;"/>
+ <method name="userRoot()Ljava/util/prefs/Preferences;"/>
+ </class>
+ <class name="java/util/regex/MatchResult" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="end()I"/>
+ <method name="end(I)I"/>
+ <method name="group()Ljava/lang/String;"/>
+ <method name="group(I)Ljava/lang/String;"/>
+ <method name="groupCount()I"/>
+ <method name="start()I"/>
+ <method name="start(I)I"/>
+ </class>
+ <class name="java/util/regex/Matcher" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/regex/MatchResult"/>
+ <method name="&lt;init>()V"/>
+ <method name="appendReplacement(Ljava/lang/StringBuffer;Ljava/lang/String;)Ljava/util/regex/Matcher;"/>
+ <method name="appendTail(Ljava/lang/StringBuffer;)Ljava/lang/StringBuffer;"/>
+ <method name="end(Ljava/lang/String;)I" since="26"/>
+ <method name="find()Z"/>
+ <method name="find(I)Z"/>
+ <method name="group(Ljava/lang/String;)Ljava/lang/String;" since="26"/>
+ <method name="hasAnchoringBounds()Z"/>
+ <method name="hasTransparentBounds()Z"/>
+ <method name="hitEnd()Z"/>
+ <method name="lookingAt()Z"/>
+ <method name="matches()Z"/>
+ <method name="pattern()Ljava/util/regex/Pattern;"/>
+ <method name="quoteReplacement(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="region(II)Ljava/util/regex/Matcher;"/>
+ <method name="regionEnd()I"/>
+ <method name="regionStart()I"/>
+ <method name="replaceAll(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="replaceFirst(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="requireEnd()Z"/>
+ <method name="reset()Ljava/util/regex/Matcher;"/>
+ <method name="reset(Ljava/lang/CharSequence;)Ljava/util/regex/Matcher;"/>
+ <method name="start(Ljava/lang/String;)I" since="26"/>
+ <method name="toMatchResult()Ljava/util/regex/MatchResult;"/>
+ <method name="useAnchoringBounds(Z)Ljava/util/regex/Matcher;"/>
+ <method name="usePattern(Ljava/util/regex/Pattern;)Ljava/util/regex/Matcher;"/>
+ <method name="useTransparentBounds(Z)Ljava/util/regex/Matcher;"/>
+ </class>
+ <class name="java/util/regex/Pattern" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="asPredicate()Ljava/util/function/Predicate;" since="24"/>
+ <method name="compile(Ljava/lang/String;)Ljava/util/regex/Pattern;"/>
+ <method name="compile(Ljava/lang/String;I)Ljava/util/regex/Pattern;"/>
+ <method name="flags()I"/>
+ <method name="matcher(Ljava/lang/CharSequence;)Ljava/util/regex/Matcher;"/>
+ <method name="matches(Ljava/lang/String;Ljava/lang/CharSequence;)Z"/>
+ <method name="pattern()Ljava/lang/String;"/>
+ <method name="quote(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="split(Ljava/lang/CharSequence;)[Ljava/lang/String;"/>
+ <method name="split(Ljava/lang/CharSequence;I)[Ljava/lang/String;"/>
+ <method name="splitAsStream(Ljava/lang/CharSequence;)Ljava/util/stream/Stream;" since="24"/>
+ <field name="CANON_EQ"/>
+ <field name="CASE_INSENSITIVE"/>
+ <field name="COMMENTS"/>
+ <field name="DOTALL"/>
+ <field name="LITERAL"/>
+ <field name="MULTILINE"/>
+ <field name="UNICODE_CASE"/>
+ <field name="UNICODE_CHARACTER_CLASS" since="24"/>
+ <field name="UNIX_LINES"/>
+ </class>
+ <class name="java/util/regex/PatternSyntaxException" since="1">
+ <extends name="java/lang/IllegalArgumentException"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V"/>
+ <method name="getDescription()Ljava/lang/String;"/>
+ <method name="getIndex()I"/>
+ <method name="getPattern()Ljava/lang/String;"/>
+ </class>
+ <class name="java/util/stream/BaseStream" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/AutoCloseable"/>
+ <method name="isParallel()Z"/>
+ <method name="iterator()Ljava/util/Iterator;"/>
+ <method name="onClose(Ljava/lang/Runnable;)Ljava/util/stream/BaseStream;"/>
+ <method name="parallel()Ljava/util/stream/BaseStream;"/>
+ <method name="sequential()Ljava/util/stream/BaseStream;"/>
+ <method name="spliterator()Ljava/util/Spliterator;"/>
+ <method name="unordered()Ljava/util/stream/BaseStream;"/>
+ </class>
+ <class name="java/util/stream/Collector" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="accumulator()Ljava/util/function/BiConsumer;"/>
+ <method name="characteristics()Ljava/util/Set;"/>
+ <method name="combiner()Ljava/util/function/BinaryOperator;"/>
+ <method name="finisher()Ljava/util/function/Function;"/>
+ <method name="of(Ljava/util/function/Supplier;Ljava/util/function/BiConsumer;Ljava/util/function/BinaryOperator;Ljava/util/function/Function;[Ljava/util/stream/Collector$Characteristics;)Ljava/util/stream/Collector;"/>
+ <method name="of(Ljava/util/function/Supplier;Ljava/util/function/BiConsumer;Ljava/util/function/BinaryOperator;[Ljava/util/stream/Collector$Characteristics;)Ljava/util/stream/Collector;"/>
+ <method name="supplier()Ljava/util/function/Supplier;"/>
+ </class>
+ <class name="java/util/stream/Collector$Characteristics" since="24">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljava/util/stream/Collector$Characteristics;"/>
+ <method name="values()[Ljava/util/stream/Collector$Characteristics;"/>
+ <field name="CONCURRENT"/>
+ <field name="IDENTITY_FINISH"/>
+ <field name="UNORDERED"/>
+ </class>
+ <class name="java/util/stream/Collectors" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="averagingDouble(Ljava/util/function/ToDoubleFunction;)Ljava/util/stream/Collector;"/>
+ <method name="averagingInt(Ljava/util/function/ToIntFunction;)Ljava/util/stream/Collector;"/>
+ <method name="averagingLong(Ljava/util/function/ToLongFunction;)Ljava/util/stream/Collector;"/>
+ <method name="collectingAndThen(Ljava/util/stream/Collector;Ljava/util/function/Function;)Ljava/util/stream/Collector;"/>
+ <method name="counting()Ljava/util/stream/Collector;"/>
+ <method name="groupingBy(Ljava/util/function/Function;)Ljava/util/stream/Collector;"/>
+ <method name="groupingBy(Ljava/util/function/Function;Ljava/util/function/Supplier;Ljava/util/stream/Collector;)Ljava/util/stream/Collector;"/>
+ <method name="groupingBy(Ljava/util/function/Function;Ljava/util/stream/Collector;)Ljava/util/stream/Collector;"/>
+ <method name="groupingByConcurrent(Ljava/util/function/Function;)Ljava/util/stream/Collector;"/>
+ <method name="groupingByConcurrent(Ljava/util/function/Function;Ljava/util/function/Supplier;Ljava/util/stream/Collector;)Ljava/util/stream/Collector;"/>
+ <method name="groupingByConcurrent(Ljava/util/function/Function;Ljava/util/stream/Collector;)Ljava/util/stream/Collector;"/>
+ <method name="joining()Ljava/util/stream/Collector;"/>
+ <method name="joining(Ljava/lang/CharSequence;)Ljava/util/stream/Collector;"/>
+ <method name="joining(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/util/stream/Collector;"/>
+ <method name="mapping(Ljava/util/function/Function;Ljava/util/stream/Collector;)Ljava/util/stream/Collector;"/>
+ <method name="maxBy(Ljava/util/Comparator;)Ljava/util/stream/Collector;"/>
+ <method name="minBy(Ljava/util/Comparator;)Ljava/util/stream/Collector;"/>
+ <method name="partitioningBy(Ljava/util/function/Predicate;)Ljava/util/stream/Collector;"/>
+ <method name="partitioningBy(Ljava/util/function/Predicate;Ljava/util/stream/Collector;)Ljava/util/stream/Collector;"/>
+ <method name="reducing(Ljava/lang/Object;Ljava/util/function/BinaryOperator;)Ljava/util/stream/Collector;"/>
+ <method name="reducing(Ljava/lang/Object;Ljava/util/function/Function;Ljava/util/function/BinaryOperator;)Ljava/util/stream/Collector;"/>
+ <method name="reducing(Ljava/util/function/BinaryOperator;)Ljava/util/stream/Collector;"/>
+ <method name="summarizingDouble(Ljava/util/function/ToDoubleFunction;)Ljava/util/stream/Collector;"/>
+ <method name="summarizingInt(Ljava/util/function/ToIntFunction;)Ljava/util/stream/Collector;"/>
+ <method name="summarizingLong(Ljava/util/function/ToLongFunction;)Ljava/util/stream/Collector;"/>
+ <method name="summingDouble(Ljava/util/function/ToDoubleFunction;)Ljava/util/stream/Collector;"/>
+ <method name="summingInt(Ljava/util/function/ToIntFunction;)Ljava/util/stream/Collector;"/>
+ <method name="summingLong(Ljava/util/function/ToLongFunction;)Ljava/util/stream/Collector;"/>
+ <method name="toCollection(Ljava/util/function/Supplier;)Ljava/util/stream/Collector;"/>
+ <method name="toConcurrentMap(Ljava/util/function/Function;Ljava/util/function/Function;)Ljava/util/stream/Collector;"/>
+ <method name="toConcurrentMap(Ljava/util/function/Function;Ljava/util/function/Function;Ljava/util/function/BinaryOperator;)Ljava/util/stream/Collector;"/>
+ <method name="toConcurrentMap(Ljava/util/function/Function;Ljava/util/function/Function;Ljava/util/function/BinaryOperator;Ljava/util/function/Supplier;)Ljava/util/stream/Collector;"/>
+ <method name="toList()Ljava/util/stream/Collector;"/>
+ <method name="toMap(Ljava/util/function/Function;Ljava/util/function/Function;)Ljava/util/stream/Collector;"/>
+ <method name="toMap(Ljava/util/function/Function;Ljava/util/function/Function;Ljava/util/function/BinaryOperator;)Ljava/util/stream/Collector;"/>
+ <method name="toMap(Ljava/util/function/Function;Ljava/util/function/Function;Ljava/util/function/BinaryOperator;Ljava/util/function/Supplier;)Ljava/util/stream/Collector;"/>
+ <method name="toSet()Ljava/util/stream/Collector;"/>
+ </class>
+ <class name="java/util/stream/DoubleStream" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/stream/BaseStream"/>
+ <method name="allMatch(Ljava/util/function/DoublePredicate;)Z"/>
+ <method name="anyMatch(Ljava/util/function/DoublePredicate;)Z"/>
+ <method name="average()Ljava/util/OptionalDouble;"/>
+ <method name="boxed()Ljava/util/stream/Stream;"/>
+ <method name="builder()Ljava/util/stream/DoubleStream$Builder;"/>
+ <method name="collect(Ljava/util/function/Supplier;Ljava/util/function/ObjDoubleConsumer;Ljava/util/function/BiConsumer;)Ljava/lang/Object;"/>
+ <method name="concat(Ljava/util/stream/DoubleStream;Ljava/util/stream/DoubleStream;)Ljava/util/stream/DoubleStream;"/>
+ <method name="count()J"/>
+ <method name="distinct()Ljava/util/stream/DoubleStream;"/>
+ <method name="empty()Ljava/util/stream/DoubleStream;"/>
+ <method name="filter(Ljava/util/function/DoublePredicate;)Ljava/util/stream/DoubleStream;"/>
+ <method name="findAny()Ljava/util/OptionalDouble;"/>
+ <method name="findFirst()Ljava/util/OptionalDouble;"/>
+ <method name="flatMap(Ljava/util/function/DoubleFunction;)Ljava/util/stream/DoubleStream;"/>
+ <method name="forEach(Ljava/util/function/DoubleConsumer;)V"/>
+ <method name="forEachOrdered(Ljava/util/function/DoubleConsumer;)V"/>
+ <method name="generate(Ljava/util/function/DoubleSupplier;)Ljava/util/stream/DoubleStream;"/>
+ <method name="iterate(DLjava/util/function/DoubleUnaryOperator;)Ljava/util/stream/DoubleStream;"/>
+ <method name="iterator()Ljava/util/PrimitiveIterator$OfDouble;"/>
+ <method name="limit(J)Ljava/util/stream/DoubleStream;"/>
+ <method name="map(Ljava/util/function/DoubleUnaryOperator;)Ljava/util/stream/DoubleStream;"/>
+ <method name="mapToInt(Ljava/util/function/DoubleToIntFunction;)Ljava/util/stream/IntStream;"/>
+ <method name="mapToLong(Ljava/util/function/DoubleToLongFunction;)Ljava/util/stream/LongStream;"/>
+ <method name="mapToObj(Ljava/util/function/DoubleFunction;)Ljava/util/stream/Stream;"/>
+ <method name="max()Ljava/util/OptionalDouble;"/>
+ <method name="min()Ljava/util/OptionalDouble;"/>
+ <method name="noneMatch(Ljava/util/function/DoublePredicate;)Z"/>
+ <method name="of(D)Ljava/util/stream/DoubleStream;"/>
+ <method name="of([D)Ljava/util/stream/DoubleStream;"/>
+ <method name="parallel()Ljava/util/stream/DoubleStream;"/>
+ <method name="peek(Ljava/util/function/DoubleConsumer;)Ljava/util/stream/DoubleStream;"/>
+ <method name="reduce(DLjava/util/function/DoubleBinaryOperator;)D"/>
+ <method name="reduce(Ljava/util/function/DoubleBinaryOperator;)Ljava/util/OptionalDouble;"/>
+ <method name="sequential()Ljava/util/stream/DoubleStream;"/>
+ <method name="skip(J)Ljava/util/stream/DoubleStream;"/>
+ <method name="sorted()Ljava/util/stream/DoubleStream;"/>
+ <method name="spliterator()Ljava/util/Spliterator$OfDouble;"/>
+ <method name="sum()D"/>
+ <method name="summaryStatistics()Ljava/util/DoubleSummaryStatistics;"/>
+ <method name="toArray()[D"/>
+ </class>
+ <class name="java/util/stream/DoubleStream$Builder" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/function/DoubleConsumer"/>
+ <method name="add(D)Ljava/util/stream/DoubleStream$Builder;"/>
+ <method name="build()Ljava/util/stream/DoubleStream;"/>
+ </class>
+ <class name="java/util/stream/IntStream" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/stream/BaseStream"/>
+ <method name="allMatch(Ljava/util/function/IntPredicate;)Z"/>
+ <method name="anyMatch(Ljava/util/function/IntPredicate;)Z"/>
+ <method name="asDoubleStream()Ljava/util/stream/DoubleStream;"/>
+ <method name="asLongStream()Ljava/util/stream/LongStream;"/>
+ <method name="average()Ljava/util/OptionalDouble;"/>
+ <method name="boxed()Ljava/util/stream/Stream;"/>
+ <method name="builder()Ljava/util/stream/IntStream$Builder;"/>
+ <method name="collect(Ljava/util/function/Supplier;Ljava/util/function/ObjIntConsumer;Ljava/util/function/BiConsumer;)Ljava/lang/Object;"/>
+ <method name="concat(Ljava/util/stream/IntStream;Ljava/util/stream/IntStream;)Ljava/util/stream/IntStream;"/>
+ <method name="count()J"/>
+ <method name="distinct()Ljava/util/stream/IntStream;"/>
+ <method name="empty()Ljava/util/stream/IntStream;"/>
+ <method name="filter(Ljava/util/function/IntPredicate;)Ljava/util/stream/IntStream;"/>
+ <method name="findAny()Ljava/util/OptionalInt;"/>
+ <method name="findFirst()Ljava/util/OptionalInt;"/>
+ <method name="flatMap(Ljava/util/function/IntFunction;)Ljava/util/stream/IntStream;"/>
+ <method name="forEach(Ljava/util/function/IntConsumer;)V"/>
+ <method name="forEachOrdered(Ljava/util/function/IntConsumer;)V"/>
+ <method name="generate(Ljava/util/function/IntSupplier;)Ljava/util/stream/IntStream;"/>
+ <method name="iterate(ILjava/util/function/IntUnaryOperator;)Ljava/util/stream/IntStream;"/>
+ <method name="iterator()Ljava/util/PrimitiveIterator$OfInt;"/>
+ <method name="limit(J)Ljava/util/stream/IntStream;"/>
+ <method name="map(Ljava/util/function/IntUnaryOperator;)Ljava/util/stream/IntStream;"/>
+ <method name="mapToDouble(Ljava/util/function/IntToDoubleFunction;)Ljava/util/stream/DoubleStream;"/>
+ <method name="mapToLong(Ljava/util/function/IntToLongFunction;)Ljava/util/stream/LongStream;"/>
+ <method name="mapToObj(Ljava/util/function/IntFunction;)Ljava/util/stream/Stream;"/>
+ <method name="max()Ljava/util/OptionalInt;"/>
+ <method name="min()Ljava/util/OptionalInt;"/>
+ <method name="noneMatch(Ljava/util/function/IntPredicate;)Z"/>
+ <method name="of(I)Ljava/util/stream/IntStream;"/>
+ <method name="of([I)Ljava/util/stream/IntStream;"/>
+ <method name="parallel()Ljava/util/stream/IntStream;"/>
+ <method name="peek(Ljava/util/function/IntConsumer;)Ljava/util/stream/IntStream;"/>
+ <method name="range(II)Ljava/util/stream/IntStream;"/>
+ <method name="rangeClosed(II)Ljava/util/stream/IntStream;"/>
+ <method name="reduce(ILjava/util/function/IntBinaryOperator;)I"/>
+ <method name="reduce(Ljava/util/function/IntBinaryOperator;)Ljava/util/OptionalInt;"/>
+ <method name="sequential()Ljava/util/stream/IntStream;"/>
+ <method name="skip(J)Ljava/util/stream/IntStream;"/>
+ <method name="sorted()Ljava/util/stream/IntStream;"/>
+ <method name="spliterator()Ljava/util/Spliterator$OfInt;"/>
+ <method name="sum()I"/>
+ <method name="summaryStatistics()Ljava/util/IntSummaryStatistics;"/>
+ <method name="toArray()[I"/>
+ </class>
+ <class name="java/util/stream/IntStream$Builder" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/function/IntConsumer"/>
+ <method name="add(I)Ljava/util/stream/IntStream$Builder;"/>
+ <method name="build()Ljava/util/stream/IntStream;"/>
+ </class>
+ <class name="java/util/stream/LongStream" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/stream/BaseStream"/>
+ <method name="allMatch(Ljava/util/function/LongPredicate;)Z"/>
+ <method name="anyMatch(Ljava/util/function/LongPredicate;)Z"/>
+ <method name="asDoubleStream()Ljava/util/stream/DoubleStream;"/>
+ <method name="average()Ljava/util/OptionalDouble;"/>
+ <method name="boxed()Ljava/util/stream/Stream;"/>
+ <method name="builder()Ljava/util/stream/LongStream$Builder;"/>
+ <method name="collect(Ljava/util/function/Supplier;Ljava/util/function/ObjLongConsumer;Ljava/util/function/BiConsumer;)Ljava/lang/Object;"/>
+ <method name="concat(Ljava/util/stream/LongStream;Ljava/util/stream/LongStream;)Ljava/util/stream/LongStream;"/>
+ <method name="count()J"/>
+ <method name="distinct()Ljava/util/stream/LongStream;"/>
+ <method name="empty()Ljava/util/stream/LongStream;"/>
+ <method name="filter(Ljava/util/function/LongPredicate;)Ljava/util/stream/LongStream;"/>
+ <method name="findAny()Ljava/util/OptionalLong;"/>
+ <method name="findFirst()Ljava/util/OptionalLong;"/>
+ <method name="flatMap(Ljava/util/function/LongFunction;)Ljava/util/stream/LongStream;"/>
+ <method name="forEach(Ljava/util/function/LongConsumer;)V"/>
+ <method name="forEachOrdered(Ljava/util/function/LongConsumer;)V"/>
+ <method name="generate(Ljava/util/function/LongSupplier;)Ljava/util/stream/LongStream;"/>
+ <method name="iterate(JLjava/util/function/LongUnaryOperator;)Ljava/util/stream/LongStream;"/>
+ <method name="iterator()Ljava/util/PrimitiveIterator$OfLong;"/>
+ <method name="limit(J)Ljava/util/stream/LongStream;"/>
+ <method name="map(Ljava/util/function/LongUnaryOperator;)Ljava/util/stream/LongStream;"/>
+ <method name="mapToDouble(Ljava/util/function/LongToDoubleFunction;)Ljava/util/stream/DoubleStream;"/>
+ <method name="mapToInt(Ljava/util/function/LongToIntFunction;)Ljava/util/stream/IntStream;"/>
+ <method name="mapToObj(Ljava/util/function/LongFunction;)Ljava/util/stream/Stream;"/>
+ <method name="max()Ljava/util/OptionalLong;"/>
+ <method name="min()Ljava/util/OptionalLong;"/>
+ <method name="noneMatch(Ljava/util/function/LongPredicate;)Z"/>
+ <method name="of(J)Ljava/util/stream/LongStream;"/>
+ <method name="of([J)Ljava/util/stream/LongStream;"/>
+ <method name="parallel()Ljava/util/stream/LongStream;"/>
+ <method name="peek(Ljava/util/function/LongConsumer;)Ljava/util/stream/LongStream;"/>
+ <method name="range(JJ)Ljava/util/stream/LongStream;"/>
+ <method name="rangeClosed(JJ)Ljava/util/stream/LongStream;"/>
+ <method name="reduce(JLjava/util/function/LongBinaryOperator;)J"/>
+ <method name="reduce(Ljava/util/function/LongBinaryOperator;)Ljava/util/OptionalLong;"/>
+ <method name="sequential()Ljava/util/stream/LongStream;"/>
+ <method name="skip(J)Ljava/util/stream/LongStream;"/>
+ <method name="sorted()Ljava/util/stream/LongStream;"/>
+ <method name="spliterator()Ljava/util/Spliterator$OfLong;"/>
+ <method name="sum()J"/>
+ <method name="summaryStatistics()Ljava/util/LongSummaryStatistics;"/>
+ <method name="toArray()[J"/>
+ </class>
+ <class name="java/util/stream/LongStream$Builder" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/function/LongConsumer"/>
+ <method name="add(J)Ljava/util/stream/LongStream$Builder;"/>
+ <method name="build()Ljava/util/stream/LongStream;"/>
+ </class>
+ <class name="java/util/stream/Stream" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/stream/BaseStream"/>
+ <method name="allMatch(Ljava/util/function/Predicate;)Z"/>
+ <method name="anyMatch(Ljava/util/function/Predicate;)Z"/>
+ <method name="builder()Ljava/util/stream/Stream$Builder;"/>
+ <method name="collect(Ljava/util/function/Supplier;Ljava/util/function/BiConsumer;Ljava/util/function/BiConsumer;)Ljava/lang/Object;"/>
+ <method name="collect(Ljava/util/stream/Collector;)Ljava/lang/Object;"/>
+ <method name="concat(Ljava/util/stream/Stream;Ljava/util/stream/Stream;)Ljava/util/stream/Stream;"/>
+ <method name="count()J"/>
+ <method name="distinct()Ljava/util/stream/Stream;"/>
+ <method name="empty()Ljava/util/stream/Stream;"/>
+ <method name="filter(Ljava/util/function/Predicate;)Ljava/util/stream/Stream;"/>
+ <method name="findAny()Ljava/util/Optional;"/>
+ <method name="findFirst()Ljava/util/Optional;"/>
+ <method name="flatMap(Ljava/util/function/Function;)Ljava/util/stream/Stream;"/>
+ <method name="flatMapToDouble(Ljava/util/function/Function;)Ljava/util/stream/DoubleStream;"/>
+ <method name="flatMapToInt(Ljava/util/function/Function;)Ljava/util/stream/IntStream;"/>
+ <method name="flatMapToLong(Ljava/util/function/Function;)Ljava/util/stream/LongStream;"/>
+ <method name="forEach(Ljava/util/function/Consumer;)V"/>
+ <method name="forEachOrdered(Ljava/util/function/Consumer;)V"/>
+ <method name="generate(Ljava/util/function/Supplier;)Ljava/util/stream/Stream;"/>
+ <method name="iterate(Ljava/lang/Object;Ljava/util/function/UnaryOperator;)Ljava/util/stream/Stream;"/>
+ <method name="limit(J)Ljava/util/stream/Stream;"/>
+ <method name="map(Ljava/util/function/Function;)Ljava/util/stream/Stream;"/>
+ <method name="mapToDouble(Ljava/util/function/ToDoubleFunction;)Ljava/util/stream/DoubleStream;"/>
+ <method name="mapToInt(Ljava/util/function/ToIntFunction;)Ljava/util/stream/IntStream;"/>
+ <method name="mapToLong(Ljava/util/function/ToLongFunction;)Ljava/util/stream/LongStream;"/>
+ <method name="max(Ljava/util/Comparator;)Ljava/util/Optional;"/>
+ <method name="min(Ljava/util/Comparator;)Ljava/util/Optional;"/>
+ <method name="noneMatch(Ljava/util/function/Predicate;)Z"/>
+ <method name="of(Ljava/lang/Object;)Ljava/util/stream/Stream;"/>
+ <method name="of([Ljava/lang/Object;)Ljava/util/stream/Stream;"/>
+ <method name="peek(Ljava/util/function/Consumer;)Ljava/util/stream/Stream;"/>
+ <method name="reduce(Ljava/lang/Object;Ljava/util/function/BiFunction;Ljava/util/function/BinaryOperator;)Ljava/lang/Object;"/>
+ <method name="reduce(Ljava/lang/Object;Ljava/util/function/BinaryOperator;)Ljava/lang/Object;"/>
+ <method name="reduce(Ljava/util/function/BinaryOperator;)Ljava/util/Optional;"/>
+ <method name="skip(J)Ljava/util/stream/Stream;"/>
+ <method name="sorted()Ljava/util/stream/Stream;"/>
+ <method name="sorted(Ljava/util/Comparator;)Ljava/util/stream/Stream;"/>
+ <method name="toArray()[Ljava/lang/Object;"/>
+ <method name="toArray(Ljava/util/function/IntFunction;)[Ljava/lang/Object;"/>
+ </class>
+ <class name="java/util/stream/Stream$Builder" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/function/Consumer"/>
+ <method name="add(Ljava/lang/Object;)Ljava/util/stream/Stream$Builder;"/>
+ <method name="build()Ljava/util/stream/Stream;"/>
+ </class>
+ <class name="java/util/stream/StreamSupport" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="doubleStream(Ljava/util/Spliterator$OfDouble;Z)Ljava/util/stream/DoubleStream;"/>
+ <method name="doubleStream(Ljava/util/function/Supplier;IZ)Ljava/util/stream/DoubleStream;"/>
+ <method name="intStream(Ljava/util/Spliterator$OfInt;Z)Ljava/util/stream/IntStream;"/>
+ <method name="intStream(Ljava/util/function/Supplier;IZ)Ljava/util/stream/IntStream;"/>
+ <method name="longStream(Ljava/util/Spliterator$OfLong;Z)Ljava/util/stream/LongStream;"/>
+ <method name="longStream(Ljava/util/function/Supplier;IZ)Ljava/util/stream/LongStream;"/>
+ <method name="stream(Ljava/util/Spliterator;Z)Ljava/util/stream/Stream;"/>
+ <method name="stream(Ljava/util/function/Supplier;IZ)Ljava/util/stream/Stream;"/>
+ </class>
+ <class name="java/util/zip/Adler32" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/zip/Checksum"/>
+ <method name="&lt;init>()V"/>
+ <method name="update(Ljava/nio/ByteBuffer;)V" since="26"/>
+ <method name="update([B)V"/>
+ </class>
+ <class name="java/util/zip/CRC32" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/zip/Checksum"/>
+ <method name="&lt;init>()V"/>
+ <method name="update(Ljava/nio/ByteBuffer;)V" since="26"/>
+ <method name="update([B)V"/>
+ </class>
+ <class name="java/util/zip/CheckedInputStream" since="1">
+ <extends name="java/io/FilterInputStream"/>
+ <method name="&lt;init>(Ljava/io/InputStream;Ljava/util/zip/Checksum;)V"/>
+ <method name="getChecksum()Ljava/util/zip/Checksum;"/>
+ </class>
+ <class name="java/util/zip/CheckedOutputStream" since="1">
+ <extends name="java/io/FilterOutputStream"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/util/zip/Checksum;)V"/>
+ <method name="getChecksum()Ljava/util/zip/Checksum;"/>
+ </class>
+ <class name="java/util/zip/Checksum" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getValue()J"/>
+ <method name="reset()V"/>
+ <method name="update(I)V"/>
+ <method name="update([BII)V"/>
+ </class>
+ <class name="java/util/zip/DataFormatException" since="1">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/util/zip/Deflater" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(IZ)V"/>
+ <method name="deflate([B)I"/>
+ <method name="deflate([BII)I"/>
+ <method name="deflate([BIII)I" since="19"/>
+ <method name="end()V"/>
+ <method name="finish()V"/>
+ <method name="finished()Z"/>
+ <method name="getAdler()I"/>
+ <method name="getBytesRead()J"/>
+ <method name="getBytesWritten()J"/>
+ <method name="getTotalIn()I"/>
+ <method name="getTotalOut()I"/>
+ <method name="needsInput()Z"/>
+ <method name="reset()V"/>
+ <method name="setDictionary([B)V"/>
+ <method name="setDictionary([BII)V"/>
+ <method name="setInput([B)V"/>
+ <method name="setInput([BII)V"/>
+ <method name="setLevel(I)V"/>
+ <method name="setStrategy(I)V"/>
+ <field name="BEST_COMPRESSION"/>
+ <field name="BEST_SPEED"/>
+ <field name="DEFAULT_COMPRESSION"/>
+ <field name="DEFAULT_STRATEGY"/>
+ <field name="DEFLATED"/>
+ <field name="FILTERED"/>
+ <field name="FULL_FLUSH" since="19"/>
+ <field name="HUFFMAN_ONLY"/>
+ <field name="NO_COMPRESSION"/>
+ <field name="NO_FLUSH" since="19"/>
+ <field name="SYNC_FLUSH" since="19"/>
+ </class>
+ <class name="java/util/zip/DeflaterInputStream" since="9">
+ <extends name="java/io/FilterInputStream"/>
+ <method name="&lt;init>(Ljava/io/InputStream;)V"/>
+ <method name="&lt;init>(Ljava/io/InputStream;Ljava/util/zip/Deflater;)V"/>
+ <method name="&lt;init>(Ljava/io/InputStream;Ljava/util/zip/Deflater;I)V"/>
+ <field name="buf"/>
+ <field name="def"/>
+ </class>
+ <class name="java/util/zip/DeflaterOutputStream" since="1">
+ <extends name="java/io/FilterOutputStream"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;)V"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/util/zip/Deflater;)V"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/util/zip/Deflater;I)V"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/util/zip/Deflater;IZ)V" since="19"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/util/zip/Deflater;Z)V" since="19"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;Z)V" since="19"/>
+ <method name="deflate()V"/>
+ <method name="finish()V"/>
+ <field name="buf"/>
+ <field name="def"/>
+ </class>
+ <class name="java/util/zip/GZIPInputStream" since="1">
+ <extends name="java/util/zip/InflaterInputStream"/>
+ <method name="&lt;init>(Ljava/io/InputStream;)V"/>
+ <method name="&lt;init>(Ljava/io/InputStream;I)V"/>
+ <field name="GZIP_MAGIC"/>
+ <field name="crc"/>
+ <field name="eos"/>
+ </class>
+ <class name="java/util/zip/GZIPOutputStream" since="1">
+ <extends name="java/util/zip/DeflaterOutputStream"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;)V"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;I)V"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;IZ)V" since="19"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;Z)V" since="19"/>
+ <field name="crc"/>
+ </class>
+ <class name="java/util/zip/Inflater" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Z)V"/>
+ <method name="end()V"/>
+ <method name="finished()Z"/>
+ <method name="getAdler()I"/>
+ <method name="getBytesRead()J"/>
+ <method name="getBytesWritten()J"/>
+ <method name="getRemaining()I"/>
+ <method name="getTotalIn()I"/>
+ <method name="getTotalOut()I"/>
+ <method name="inflate([B)I"/>
+ <method name="inflate([BII)I"/>
+ <method name="needsDictionary()Z"/>
+ <method name="needsInput()Z"/>
+ <method name="reset()V"/>
+ <method name="setDictionary([B)V"/>
+ <method name="setDictionary([BII)V"/>
+ <method name="setInput([B)V"/>
+ <method name="setInput([BII)V"/>
+ </class>
+ <class name="java/util/zip/InflaterInputStream" since="1">
+ <extends name="java/io/FilterInputStream"/>
+ <method name="&lt;init>(Ljava/io/InputStream;)V"/>
+ <method name="&lt;init>(Ljava/io/InputStream;Ljava/util/zip/Inflater;)V"/>
+ <method name="&lt;init>(Ljava/io/InputStream;Ljava/util/zip/Inflater;I)V"/>
+ <method name="fill()V"/>
+ <field name="buf"/>
+ <field name="closed" since="24"/>
+ <field name="inf"/>
+ <field name="len"/>
+ </class>
+ <class name="java/util/zip/InflaterOutputStream" since="9">
+ <extends name="java/io/FilterOutputStream"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;)V"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/util/zip/Inflater;)V"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/util/zip/Inflater;I)V"/>
+ <method name="finish()V"/>
+ <field name="buf"/>
+ <field name="inf"/>
+ </class>
+ <class name="java/util/zip/ZipEntry" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/util/zip/ZipEntry;)V"/>
+ <method name="getComment()Ljava/lang/String;"/>
+ <method name="getCompressedSize()J"/>
+ <method name="getCrc()J"/>
+ <method name="getCreationTime()Ljava/nio/file/attribute/FileTime;" since="26"/>
+ <method name="getExtra()[B"/>
+ <method name="getLastAccessTime()Ljava/nio/file/attribute/FileTime;" since="26"/>
+ <method name="getLastModifiedTime()Ljava/nio/file/attribute/FileTime;" since="26"/>
+ <method name="getMethod()I"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getSize()J"/>
+ <method name="getTime()J"/>
+ <method name="isDirectory()Z"/>
+ <method name="setComment(Ljava/lang/String;)V"/>
+ <method name="setCompressedSize(J)V"/>
+ <method name="setCrc(J)V"/>
+ <method name="setCreationTime(Ljava/nio/file/attribute/FileTime;)Ljava/util/zip/ZipEntry;" since="26"/>
+ <method name="setExtra([B)V"/>
+ <method name="setLastAccessTime(Ljava/nio/file/attribute/FileTime;)Ljava/util/zip/ZipEntry;" since="26"/>
+ <method name="setLastModifiedTime(Ljava/nio/file/attribute/FileTime;)Ljava/util/zip/ZipEntry;" since="26"/>
+ <method name="setMethod(I)V"/>
+ <method name="setSize(J)V"/>
+ <method name="setTime(J)V"/>
+ <field name="CENATT" since="21"/>
+ <field name="CENATX" since="21"/>
+ <field name="CENCOM" since="21"/>
+ <field name="CENCRC" since="21"/>
+ <field name="CENDSK" since="21"/>
+ <field name="CENEXT" since="21"/>
+ <field name="CENFLG" since="21"/>
+ <field name="CENHDR" since="21"/>
+ <field name="CENHOW" since="21"/>
+ <field name="CENLEN" since="21"/>
+ <field name="CENNAM" since="21"/>
+ <field name="CENOFF" since="21"/>
+ <field name="CENSIG" since="21"/>
+ <field name="CENSIZ" since="21"/>
+ <field name="CENTIM" since="21"/>
+ <field name="CENVEM" since="21"/>
+ <field name="CENVER" since="21"/>
+ <field name="DEFLATED"/>
+ <field name="ENDCOM" since="21"/>
+ <field name="ENDHDR" since="21"/>
+ <field name="ENDOFF" since="21"/>
+ <field name="ENDSIG" since="21"/>
+ <field name="ENDSIZ" since="21"/>
+ <field name="ENDSUB" since="21"/>
+ <field name="ENDTOT" since="21"/>
+ <field name="EXTCRC" since="21"/>
+ <field name="EXTHDR" since="21"/>
+ <field name="EXTLEN" since="21"/>
+ <field name="EXTSIG" since="21"/>
+ <field name="EXTSIZ" since="21"/>
+ <field name="LOCCRC" since="21"/>
+ <field name="LOCEXT" since="21"/>
+ <field name="LOCFLG" since="21"/>
+ <field name="LOCHDR" since="21"/>
+ <field name="LOCHOW" since="21"/>
+ <field name="LOCLEN" since="21"/>
+ <field name="LOCNAM" since="21"/>
+ <field name="LOCSIG" since="21"/>
+ <field name="LOCSIZ" since="21"/>
+ <field name="LOCTIM" since="21"/>
+ <field name="LOCVER" since="21"/>
+ <field name="STORED"/>
+ </class>
+ <class name="java/util/zip/ZipError" since="9">
+ <extends name="java/lang/InternalError"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/util/zip/ZipException" since="1">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="java/util/zip/ZipFile" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Closeable" since="19"/>
+ <method name="&lt;init>(Ljava/io/File;)V"/>
+ <method name="&lt;init>(Ljava/io/File;I)V"/>
+ <method name="&lt;init>(Ljava/io/File;ILjava/nio/charset/Charset;)V" since="24"/>
+ <method name="&lt;init>(Ljava/io/File;Ljava/nio/charset/Charset;)V" since="24"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/nio/charset/Charset;)V" since="24"/>
+ <method name="close()V"/>
+ <method name="entries()Ljava/util/Enumeration;"/>
+ <method name="getComment()Ljava/lang/String;" since="19"/>
+ <method name="getEntry(Ljava/lang/String;)Ljava/util/zip/ZipEntry;"/>
+ <method name="getInputStream(Ljava/util/zip/ZipEntry;)Ljava/io/InputStream;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="size()I"/>
+ <method name="stream()Ljava/util/stream/Stream;" since="26"/>
+ <field name="CENATT" since="21"/>
+ <field name="CENATX" since="21"/>
+ <field name="CENCOM" since="21"/>
+ <field name="CENCRC" since="21"/>
+ <field name="CENDSK" since="21"/>
+ <field name="CENEXT" since="21"/>
+ <field name="CENFLG" since="21"/>
+ <field name="CENHDR" since="21"/>
+ <field name="CENHOW" since="21"/>
+ <field name="CENLEN" since="21"/>
+ <field name="CENNAM" since="21"/>
+ <field name="CENOFF" since="21"/>
+ <field name="CENSIG" since="21"/>
+ <field name="CENSIZ" since="21"/>
+ <field name="CENTIM" since="21"/>
+ <field name="CENVEM" since="21"/>
+ <field name="CENVER" since="21"/>
+ <field name="ENDCOM" since="21"/>
+ <field name="ENDHDR" since="21"/>
+ <field name="ENDOFF" since="21"/>
+ <field name="ENDSIG" since="21"/>
+ <field name="ENDSIZ" since="21"/>
+ <field name="ENDSUB" since="21"/>
+ <field name="ENDTOT" since="21"/>
+ <field name="EXTCRC" since="21"/>
+ <field name="EXTHDR" since="21"/>
+ <field name="EXTLEN" since="21"/>
+ <field name="EXTSIG" since="21"/>
+ <field name="EXTSIZ" since="21"/>
+ <field name="LOCCRC" since="21"/>
+ <field name="LOCEXT" since="21"/>
+ <field name="LOCFLG" since="21"/>
+ <field name="LOCHDR" since="21"/>
+ <field name="LOCHOW" since="21"/>
+ <field name="LOCLEN" since="21"/>
+ <field name="LOCNAM" since="21"/>
+ <field name="LOCSIG" since="21"/>
+ <field name="LOCSIZ" since="21"/>
+ <field name="LOCTIM" since="21"/>
+ <field name="LOCVER" since="21"/>
+ <field name="OPEN_DELETE"/>
+ <field name="OPEN_READ"/>
+ </class>
+ <class name="java/util/zip/ZipInputStream" since="1">
+ <extends name="java/util/zip/InflaterInputStream"/>
+ <method name="&lt;init>(Ljava/io/InputStream;)V"/>
+ <method name="&lt;init>(Ljava/io/InputStream;Ljava/nio/charset/Charset;)V" since="24"/>
+ <method name="closeEntry()V"/>
+ <method name="createZipEntry(Ljava/lang/String;)Ljava/util/zip/ZipEntry;"/>
+ <method name="getNextEntry()Ljava/util/zip/ZipEntry;"/>
+ <field name="CENATT" since="21"/>
+ <field name="CENATX" since="21"/>
+ <field name="CENCOM" since="21"/>
+ <field name="CENCRC" since="21"/>
+ <field name="CENDSK" since="21"/>
+ <field name="CENEXT" since="21"/>
+ <field name="CENFLG" since="21"/>
+ <field name="CENHDR" since="21"/>
+ <field name="CENHOW" since="21"/>
+ <field name="CENLEN" since="21"/>
+ <field name="CENNAM" since="21"/>
+ <field name="CENOFF" since="21"/>
+ <field name="CENSIG" since="21"/>
+ <field name="CENSIZ" since="21"/>
+ <field name="CENTIM" since="21"/>
+ <field name="CENVEM" since="21"/>
+ <field name="CENVER" since="21"/>
+ <field name="ENDCOM" since="21"/>
+ <field name="ENDHDR" since="21"/>
+ <field name="ENDOFF" since="21"/>
+ <field name="ENDSIG" since="21"/>
+ <field name="ENDSIZ" since="21"/>
+ <field name="ENDSUB" since="21"/>
+ <field name="ENDTOT" since="21"/>
+ <field name="EXTCRC" since="21"/>
+ <field name="EXTHDR" since="21"/>
+ <field name="EXTLEN" since="21"/>
+ <field name="EXTSIG" since="21"/>
+ <field name="EXTSIZ" since="21"/>
+ <field name="LOCCRC" since="21"/>
+ <field name="LOCEXT" since="21"/>
+ <field name="LOCFLG" since="21"/>
+ <field name="LOCHDR" since="21"/>
+ <field name="LOCHOW" since="21"/>
+ <field name="LOCLEN" since="21"/>
+ <field name="LOCNAM" since="21"/>
+ <field name="LOCSIG" since="21"/>
+ <field name="LOCSIZ" since="21"/>
+ <field name="LOCTIM" since="21"/>
+ <field name="LOCVER" since="21"/>
+ </class>
+ <class name="java/util/zip/ZipOutputStream" since="1">
+ <extends name="java/util/zip/DeflaterOutputStream"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;)V"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/nio/charset/Charset;)V" since="24"/>
+ <method name="closeEntry()V"/>
+ <method name="putNextEntry(Ljava/util/zip/ZipEntry;)V"/>
+ <method name="setComment(Ljava/lang/String;)V"/>
+ <method name="setLevel(I)V"/>
+ <method name="setMethod(I)V"/>
+ <field name="CENATT" since="21"/>
+ <field name="CENATX" since="21"/>
+ <field name="CENCOM" since="21"/>
+ <field name="CENCRC" since="21"/>
+ <field name="CENDSK" since="21"/>
+ <field name="CENEXT" since="21"/>
+ <field name="CENFLG" since="21"/>
+ <field name="CENHDR" since="21"/>
+ <field name="CENHOW" since="21"/>
+ <field name="CENLEN" since="21"/>
+ <field name="CENNAM" since="21"/>
+ <field name="CENOFF" since="21"/>
+ <field name="CENSIG" since="21"/>
+ <field name="CENSIZ" since="21"/>
+ <field name="CENTIM" since="21"/>
+ <field name="CENVEM" since="21"/>
+ <field name="CENVER" since="21"/>
+ <field name="DEFLATED"/>
+ <field name="ENDCOM" since="21"/>
+ <field name="ENDHDR" since="21"/>
+ <field name="ENDOFF" since="21"/>
+ <field name="ENDSIG" since="21"/>
+ <field name="ENDSIZ" since="21"/>
+ <field name="ENDSUB" since="21"/>
+ <field name="ENDTOT" since="21"/>
+ <field name="EXTCRC" since="21"/>
+ <field name="EXTHDR" since="21"/>
+ <field name="EXTLEN" since="21"/>
+ <field name="EXTSIG" since="21"/>
+ <field name="EXTSIZ" since="21"/>
+ <field name="LOCCRC" since="21"/>
+ <field name="LOCEXT" since="21"/>
+ <field name="LOCFLG" since="21"/>
+ <field name="LOCHDR" since="21"/>
+ <field name="LOCHOW" since="21"/>
+ <field name="LOCLEN" since="21"/>
+ <field name="LOCNAM" since="21"/>
+ <field name="LOCSIG" since="21"/>
+ <field name="LOCSIZ" since="21"/>
+ <field name="LOCTIM" since="21"/>
+ <field name="LOCVER" since="21"/>
+ <field name="STORED"/>
+ </class>
+ <class name="javax/crypto/AEADBadTagException" since="19">
+ <extends name="javax/crypto/BadPaddingException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="javax/crypto/BadPaddingException" since="1">
+ <extends name="java/security/GeneralSecurityException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="javax/crypto/Cipher" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljavax/crypto/CipherSpi;Ljava/security/Provider;Ljava/lang/String;)V"/>
+ <method name="doFinal()[B"/>
+ <method name="doFinal(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)I"/>
+ <method name="doFinal([B)[B"/>
+ <method name="doFinal([BI)I"/>
+ <method name="doFinal([BII)[B"/>
+ <method name="doFinal([BII[B)I"/>
+ <method name="doFinal([BII[BI)I"/>
+ <method name="getAlgorithm()Ljava/lang/String;"/>
+ <method name="getBlockSize()I"/>
+ <method name="getExemptionMechanism()Ljavax/crypto/ExemptionMechanism;"/>
+ <method name="getIV()[B"/>
+ <method name="getInstance(Ljava/lang/String;)Ljavax/crypto/Cipher;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/crypto/Cipher;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/crypto/Cipher;"/>
+ <method name="getMaxAllowedKeyLength(Ljava/lang/String;)I"/>
+ <method name="getMaxAllowedParameterSpec(Ljava/lang/String;)Ljava/security/spec/AlgorithmParameterSpec;"/>
+ <method name="getOutputSize(I)I"/>
+ <method name="getParameters()Ljava/security/AlgorithmParameters;"/>
+ <method name="getProvider()Ljava/security/Provider;"/>
+ <method name="init(ILjava/security/Key;)V"/>
+ <method name="init(ILjava/security/Key;Ljava/security/AlgorithmParameters;)V"/>
+ <method name="init(ILjava/security/Key;Ljava/security/AlgorithmParameters;Ljava/security/SecureRandom;)V"/>
+ <method name="init(ILjava/security/Key;Ljava/security/SecureRandom;)V"/>
+ <method name="init(ILjava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;)V"/>
+ <method name="init(ILjava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V"/>
+ <method name="init(ILjava/security/cert/Certificate;)V"/>
+ <method name="init(ILjava/security/cert/Certificate;Ljava/security/SecureRandom;)V"/>
+ <method name="unwrap([BLjava/lang/String;I)Ljava/security/Key;"/>
+ <method name="update(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)I"/>
+ <method name="update([B)[B"/>
+ <method name="update([BII)[B"/>
+ <method name="update([BII[B)I"/>
+ <method name="update([BII[BI)I"/>
+ <method name="updateAAD(Ljava/nio/ByteBuffer;)V" since="19"/>
+ <method name="updateAAD([B)V" since="19"/>
+ <method name="updateAAD([BII)V" since="19"/>
+ <method name="wrap(Ljava/security/Key;)[B"/>
+ <field name="DECRYPT_MODE"/>
+ <field name="ENCRYPT_MODE"/>
+ <field name="PRIVATE_KEY"/>
+ <field name="PUBLIC_KEY"/>
+ <field name="SECRET_KEY"/>
+ <field name="UNWRAP_MODE"/>
+ <field name="WRAP_MODE"/>
+ </class>
+ <class name="javax/crypto/CipherInputStream" since="1">
+ <extends name="java/io/FilterInputStream"/>
+ <method name="&lt;init>(Ljava/io/InputStream;)V"/>
+ <method name="&lt;init>(Ljava/io/InputStream;Ljavax/crypto/Cipher;)V"/>
+ </class>
+ <class name="javax/crypto/CipherOutputStream" since="1">
+ <extends name="java/io/FilterOutputStream"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;)V"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljavax/crypto/Cipher;)V"/>
+ </class>
+ <class name="javax/crypto/CipherSpi" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="engineDoFinal(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)I"/>
+ <method name="engineDoFinal([BII)[B"/>
+ <method name="engineDoFinal([BII[BI)I"/>
+ <method name="engineGetBlockSize()I"/>
+ <method name="engineGetIV()[B"/>
+ <method name="engineGetKeySize(Ljava/security/Key;)I"/>
+ <method name="engineGetOutputSize(I)I"/>
+ <method name="engineGetParameters()Ljava/security/AlgorithmParameters;"/>
+ <method name="engineInit(ILjava/security/Key;Ljava/security/AlgorithmParameters;Ljava/security/SecureRandom;)V"/>
+ <method name="engineInit(ILjava/security/Key;Ljava/security/SecureRandom;)V"/>
+ <method name="engineInit(ILjava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V"/>
+ <method name="engineSetMode(Ljava/lang/String;)V"/>
+ <method name="engineSetPadding(Ljava/lang/String;)V"/>
+ <method name="engineUnwrap([BLjava/lang/String;I)Ljava/security/Key;"/>
+ <method name="engineUpdate(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)I"/>
+ <method name="engineUpdate([BII)[B"/>
+ <method name="engineUpdate([BII[BI)I"/>
+ <method name="engineUpdateAAD(Ljava/nio/ByteBuffer;)V" since="19"/>
+ <method name="engineUpdateAAD([BII)V" since="19"/>
+ <method name="engineWrap(Ljava/security/Key;)[B"/>
+ </class>
+ <class name="javax/crypto/EncryptedPrivateKeyInfo" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;[B)V"/>
+ <method name="&lt;init>(Ljava/security/AlgorithmParameters;[B)V"/>
+ <method name="&lt;init>([B)V"/>
+ <method name="getAlgName()Ljava/lang/String;"/>
+ <method name="getAlgParameters()Ljava/security/AlgorithmParameters;"/>
+ <method name="getEncoded()[B"/>
+ <method name="getEncryptedData()[B"/>
+ <method name="getKeySpec(Ljava/security/Key;)Ljava/security/spec/PKCS8EncodedKeySpec;"/>
+ <method name="getKeySpec(Ljava/security/Key;Ljava/lang/String;)Ljava/security/spec/PKCS8EncodedKeySpec;"/>
+ <method name="getKeySpec(Ljava/security/Key;Ljava/security/Provider;)Ljava/security/spec/PKCS8EncodedKeySpec;"/>
+ <method name="getKeySpec(Ljavax/crypto/Cipher;)Ljava/security/spec/PKCS8EncodedKeySpec;"/>
+ </class>
+ <class name="javax/crypto/ExemptionMechanism" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljavax/crypto/ExemptionMechanismSpi;Ljava/security/Provider;Ljava/lang/String;)V"/>
+ <method name="genExemptionBlob()[B"/>
+ <method name="genExemptionBlob([B)I"/>
+ <method name="genExemptionBlob([BI)I"/>
+ <method name="getInstance(Ljava/lang/String;)Ljavax/crypto/ExemptionMechanism;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/crypto/ExemptionMechanism;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/crypto/ExemptionMechanism;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getOutputSize(I)I"/>
+ <method name="getProvider()Ljava/security/Provider;"/>
+ <method name="init(Ljava/security/Key;)V"/>
+ <method name="init(Ljava/security/Key;Ljava/security/AlgorithmParameters;)V"/>
+ <method name="init(Ljava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;)V"/>
+ <method name="isCryptoAllowed(Ljava/security/Key;)Z"/>
+ </class>
+ <class name="javax/crypto/ExemptionMechanismException" since="1">
+ <extends name="java/security/GeneralSecurityException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="javax/crypto/ExemptionMechanismSpi" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="engineGenExemptionBlob()[B"/>
+ <method name="engineGenExemptionBlob([BI)I"/>
+ <method name="engineGetOutputSize(I)I"/>
+ <method name="engineInit(Ljava/security/Key;)V"/>
+ <method name="engineInit(Ljava/security/Key;Ljava/security/AlgorithmParameters;)V"/>
+ <method name="engineInit(Ljava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;)V"/>
+ </class>
+ <class name="javax/crypto/IllegalBlockSizeException" since="1">
+ <extends name="java/security/GeneralSecurityException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="javax/crypto/KeyAgreement" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljavax/crypto/KeyAgreementSpi;Ljava/security/Provider;Ljava/lang/String;)V"/>
+ <method name="doPhase(Ljava/security/Key;Z)Ljava/security/Key;"/>
+ <method name="generateSecret()[B"/>
+ <method name="generateSecret(Ljava/lang/String;)Ljavax/crypto/SecretKey;"/>
+ <method name="generateSecret([BI)I"/>
+ <method name="getAlgorithm()Ljava/lang/String;"/>
+ <method name="getInstance(Ljava/lang/String;)Ljavax/crypto/KeyAgreement;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/crypto/KeyAgreement;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/crypto/KeyAgreement;"/>
+ <method name="getProvider()Ljava/security/Provider;"/>
+ <method name="init(Ljava/security/Key;)V"/>
+ <method name="init(Ljava/security/Key;Ljava/security/SecureRandom;)V"/>
+ <method name="init(Ljava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;)V"/>
+ <method name="init(Ljava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V"/>
+ </class>
+ <class name="javax/crypto/KeyAgreementSpi" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="engineDoPhase(Ljava/security/Key;Z)Ljava/security/Key;"/>
+ <method name="engineGenerateSecret()[B"/>
+ <method name="engineGenerateSecret(Ljava/lang/String;)Ljavax/crypto/SecretKey;"/>
+ <method name="engineGenerateSecret([BI)I"/>
+ <method name="engineInit(Ljava/security/Key;Ljava/security/SecureRandom;)V"/>
+ <method name="engineInit(Ljava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V"/>
+ </class>
+ <class name="javax/crypto/KeyGenerator" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljavax/crypto/KeyGeneratorSpi;Ljava/security/Provider;Ljava/lang/String;)V"/>
+ <method name="generateKey()Ljavax/crypto/SecretKey;"/>
+ <method name="getAlgorithm()Ljava/lang/String;"/>
+ <method name="getInstance(Ljava/lang/String;)Ljavax/crypto/KeyGenerator;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/crypto/KeyGenerator;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/crypto/KeyGenerator;"/>
+ <method name="getProvider()Ljava/security/Provider;"/>
+ <method name="init(I)V"/>
+ <method name="init(ILjava/security/SecureRandom;)V"/>
+ <method name="init(Ljava/security/SecureRandom;)V"/>
+ <method name="init(Ljava/security/spec/AlgorithmParameterSpec;)V"/>
+ <method name="init(Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V"/>
+ </class>
+ <class name="javax/crypto/KeyGeneratorSpi" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="engineGenerateKey()Ljavax/crypto/SecretKey;"/>
+ <method name="engineInit(ILjava/security/SecureRandom;)V"/>
+ <method name="engineInit(Ljava/security/SecureRandom;)V"/>
+ <method name="engineInit(Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V"/>
+ </class>
+ <class name="javax/crypto/Mac" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>(Ljavax/crypto/MacSpi;Ljava/security/Provider;Ljava/lang/String;)V"/>
+ <method name="doFinal()[B"/>
+ <method name="doFinal([B)[B"/>
+ <method name="doFinal([BI)V"/>
+ <method name="getAlgorithm()Ljava/lang/String;"/>
+ <method name="getInstance(Ljava/lang/String;)Ljavax/crypto/Mac;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/crypto/Mac;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/crypto/Mac;"/>
+ <method name="getMacLength()I"/>
+ <method name="getProvider()Ljava/security/Provider;"/>
+ <method name="init(Ljava/security/Key;)V"/>
+ <method name="init(Ljava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;)V"/>
+ <method name="reset()V"/>
+ <method name="update(B)V"/>
+ <method name="update(Ljava/nio/ByteBuffer;)V"/>
+ <method name="update([B)V"/>
+ <method name="update([BII)V"/>
+ </class>
+ <class name="javax/crypto/MacSpi" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="engineDoFinal()[B"/>
+ <method name="engineGetMacLength()I"/>
+ <method name="engineInit(Ljava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;)V"/>
+ <method name="engineReset()V"/>
+ <method name="engineUpdate(B)V"/>
+ <method name="engineUpdate(Ljava/nio/ByteBuffer;)V"/>
+ <method name="engineUpdate([BII)V"/>
+ </class>
+ <class name="javax/crypto/NoSuchPaddingException" since="1">
+ <extends name="java/security/GeneralSecurityException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="javax/crypto/NullCipher" since="1">
+ <extends name="javax/crypto/Cipher"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="javax/crypto/SealedObject" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(Ljava/io/Serializable;Ljavax/crypto/Cipher;)V"/>
+ <method name="&lt;init>(Ljavax/crypto/SealedObject;)V"/>
+ <method name="getAlgorithm()Ljava/lang/String;"/>
+ <method name="getObject(Ljava/security/Key;)Ljava/lang/Object;"/>
+ <method name="getObject(Ljava/security/Key;Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="getObject(Ljavax/crypto/Cipher;)Ljava/lang/Object;"/>
+ <field name="encodedParams"/>
+ </class>
+ <class name="javax/crypto/SecretKey" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/Key"/>
+ <implements name="javax/security/auth/Destroyable" since="26"/>
+ <field name="serialVersionUID"/>
+ </class>
+ <class name="javax/crypto/SecretKeyFactory" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljavax/crypto/SecretKeyFactorySpi;Ljava/security/Provider;Ljava/lang/String;)V"/>
+ <method name="generateSecret(Ljava/security/spec/KeySpec;)Ljavax/crypto/SecretKey;"/>
+ <method name="getAlgorithm()Ljava/lang/String;"/>
+ <method name="getInstance(Ljava/lang/String;)Ljavax/crypto/SecretKeyFactory;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/crypto/SecretKeyFactory;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/crypto/SecretKeyFactory;"/>
+ <method name="getKeySpec(Ljavax/crypto/SecretKey;Ljava/lang/Class;)Ljava/security/spec/KeySpec;"/>
+ <method name="getProvider()Ljava/security/Provider;"/>
+ <method name="translateKey(Ljavax/crypto/SecretKey;)Ljavax/crypto/SecretKey;"/>
+ </class>
+ <class name="javax/crypto/SecretKeyFactorySpi" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="engineGenerateSecret(Ljava/security/spec/KeySpec;)Ljavax/crypto/SecretKey;"/>
+ <method name="engineGetKeySpec(Ljavax/crypto/SecretKey;Ljava/lang/Class;)Ljava/security/spec/KeySpec;"/>
+ <method name="engineTranslateKey(Ljavax/crypto/SecretKey;)Ljavax/crypto/SecretKey;"/>
+ </class>
+ <class name="javax/crypto/ShortBufferException" since="1">
+ <extends name="java/security/GeneralSecurityException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="javax/crypto/interfaces/DHKey" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getParams()Ljavax/crypto/spec/DHParameterSpec;"/>
+ </class>
+ <class name="javax/crypto/interfaces/DHPrivateKey" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/PrivateKey"/>
+ <implements name="javax/crypto/interfaces/DHKey"/>
+ <method name="getX()Ljava/math/BigInteger;"/>
+ <field name="serialVersionUID"/>
+ </class>
+ <class name="javax/crypto/interfaces/DHPublicKey" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/PublicKey"/>
+ <implements name="javax/crypto/interfaces/DHKey"/>
+ <method name="getY()Ljava/math/BigInteger;"/>
+ <field name="serialVersionUID"/>
+ </class>
+ <class name="javax/crypto/interfaces/PBEKey" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="javax/crypto/SecretKey"/>
+ <method name="getIterationCount()I"/>
+ <method name="getPassword()[C"/>
+ <method name="getSalt()[B"/>
+ <field name="serialVersionUID"/>
+ </class>
+ <class name="javax/crypto/spec/DESKeySpec" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/KeySpec"/>
+ <method name="&lt;init>([B)V"/>
+ <method name="&lt;init>([BI)V"/>
+ <method name="getKey()[B"/>
+ <method name="isParityAdjusted([BI)Z"/>
+ <method name="isWeak([BI)Z"/>
+ <field name="DES_KEY_LEN"/>
+ </class>
+ <class name="javax/crypto/spec/DESedeKeySpec" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/KeySpec"/>
+ <method name="&lt;init>([B)V"/>
+ <method name="&lt;init>([BI)V"/>
+ <method name="getKey()[B"/>
+ <method name="isParityAdjusted([BI)Z"/>
+ <field name="DES_EDE_KEY_LEN"/>
+ </class>
+ <class name="javax/crypto/spec/DHGenParameterSpec" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/AlgorithmParameterSpec"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="getExponentSize()I"/>
+ <method name="getPrimeSize()I"/>
+ </class>
+ <class name="javax/crypto/spec/DHParameterSpec" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/AlgorithmParameterSpec"/>
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;)V"/>
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;I)V"/>
+ <method name="getG()Ljava/math/BigInteger;"/>
+ <method name="getL()I"/>
+ <method name="getP()Ljava/math/BigInteger;"/>
+ </class>
+ <class name="javax/crypto/spec/DHPrivateKeySpec" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/KeySpec"/>
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)V"/>
+ <method name="getG()Ljava/math/BigInteger;"/>
+ <method name="getP()Ljava/math/BigInteger;"/>
+ <method name="getX()Ljava/math/BigInteger;"/>
+ </class>
+ <class name="javax/crypto/spec/DHPublicKeySpec" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/KeySpec"/>
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)V"/>
+ <method name="getG()Ljava/math/BigInteger;"/>
+ <method name="getP()Ljava/math/BigInteger;"/>
+ <method name="getY()Ljava/math/BigInteger;"/>
+ </class>
+ <class name="javax/crypto/spec/GCMParameterSpec" since="19">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/AlgorithmParameterSpec"/>
+ <method name="&lt;init>(I[B)V"/>
+ <method name="&lt;init>(I[BII)V"/>
+ <method name="getIV()[B"/>
+ <method name="getTLen()I"/>
+ </class>
+ <class name="javax/crypto/spec/IvParameterSpec" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/AlgorithmParameterSpec"/>
+ <method name="&lt;init>([B)V"/>
+ <method name="&lt;init>([BII)V"/>
+ <method name="getIV()[B"/>
+ </class>
+ <class name="javax/crypto/spec/OAEPParameterSpec" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/AlgorithmParameterSpec"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/security/spec/AlgorithmParameterSpec;Ljavax/crypto/spec/PSource;)V"/>
+ <method name="getDigestAlgorithm()Ljava/lang/String;"/>
+ <method name="getMGFAlgorithm()Ljava/lang/String;"/>
+ <method name="getMGFParameters()Ljava/security/spec/AlgorithmParameterSpec;"/>
+ <method name="getPSource()Ljavax/crypto/spec/PSource;"/>
+ <field name="DEFAULT"/>
+ </class>
+ <class name="javax/crypto/spec/PBEKeySpec" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/KeySpec"/>
+ <method name="&lt;init>([C)V"/>
+ <method name="&lt;init>([C[BI)V"/>
+ <method name="&lt;init>([C[BII)V"/>
+ <method name="clearPassword()V"/>
+ <method name="getIterationCount()I"/>
+ <method name="getKeyLength()I"/>
+ <method name="getPassword()[C"/>
+ <method name="getSalt()[B"/>
+ </class>
+ <class name="javax/crypto/spec/PBEParameterSpec" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/AlgorithmParameterSpec"/>
+ <method name="&lt;init>([BI)V"/>
+ <method name="&lt;init>([BILjava/security/spec/AlgorithmParameterSpec;)V" since="26"/>
+ <method name="getIterationCount()I"/>
+ <method name="getParameterSpec()Ljava/security/spec/AlgorithmParameterSpec;" since="26"/>
+ <method name="getSalt()[B"/>
+ </class>
+ <class name="javax/crypto/spec/PSource" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getAlgorithm()Ljava/lang/String;"/>
+ </class>
+ <class name="javax/crypto/spec/PSource$PSpecified" since="1">
+ <extends name="javax/crypto/spec/PSource"/>
+ <method name="&lt;init>([B)V"/>
+ <method name="getValue()[B"/>
+ <field name="DEFAULT"/>
+ </class>
+ <class name="javax/crypto/spec/RC2ParameterSpec" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/AlgorithmParameterSpec"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(I[B)V"/>
+ <method name="&lt;init>(I[BI)V"/>
+ <method name="getEffectiveKeyBits()I"/>
+ <method name="getIV()[B"/>
+ </class>
+ <class name="javax/crypto/spec/RC5ParameterSpec" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/spec/AlgorithmParameterSpec"/>
+ <method name="&lt;init>(III)V"/>
+ <method name="&lt;init>(III[B)V"/>
+ <method name="&lt;init>(III[BI)V"/>
+ <method name="getIV()[B"/>
+ <method name="getRounds()I"/>
+ <method name="getVersion()I"/>
+ <method name="getWordSize()I"/>
+ </class>
+ <class name="javax/crypto/spec/SecretKeySpec" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable" removed="24"/>
+ <implements name="java/security/spec/KeySpec"/>
+ <implements name="javax/crypto/SecretKey"/>
+ <method name="&lt;init>([BIILjava/lang/String;)V"/>
+ <method name="&lt;init>([BLjava/lang/String;)V"/>
+ </class>
+ <class name="javax/microedition/khronos/egl/EGL" since="1">
+ <extends name="java/lang/Object"/>
+ </class>
+ <class name="javax/microedition/khronos/egl/EGL10" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="javax/microedition/khronos/egl/EGL"/>
+ <method name="eglChooseConfig(Ljavax/microedition/khronos/egl/EGLDisplay;[I[Ljavax/microedition/khronos/egl/EGLConfig;I[I)Z"/>
+ <method name="eglCopyBuffers(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLSurface;Ljava/lang/Object;)Z"/>
+ <method name="eglCreateContext(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLConfig;Ljavax/microedition/khronos/egl/EGLContext;[I)Ljavax/microedition/khronos/egl/EGLContext;"/>
+ <method name="eglCreatePbufferSurface(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLConfig;[I)Ljavax/microedition/khronos/egl/EGLSurface;"/>
+ <method name="eglCreatePixmapSurface(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLConfig;Ljava/lang/Object;[I)Ljavax/microedition/khronos/egl/EGLSurface;" deprecated="26"/>
+ <method name="eglCreateWindowSurface(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLConfig;Ljava/lang/Object;[I)Ljavax/microedition/khronos/egl/EGLSurface;"/>
+ <method name="eglDestroyContext(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLContext;)Z"/>
+ <method name="eglDestroySurface(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLSurface;)Z"/>
+ <method name="eglGetConfigAttrib(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLConfig;I[I)Z"/>
+ <method name="eglGetConfigs(Ljavax/microedition/khronos/egl/EGLDisplay;[Ljavax/microedition/khronos/egl/EGLConfig;I[I)Z"/>
+ <method name="eglGetCurrentContext()Ljavax/microedition/khronos/egl/EGLContext;"/>
+ <method name="eglGetCurrentDisplay()Ljavax/microedition/khronos/egl/EGLDisplay;"/>
+ <method name="eglGetCurrentSurface(I)Ljavax/microedition/khronos/egl/EGLSurface;"/>
+ <method name="eglGetDisplay(Ljava/lang/Object;)Ljavax/microedition/khronos/egl/EGLDisplay;"/>
+ <method name="eglGetError()I"/>
+ <method name="eglInitialize(Ljavax/microedition/khronos/egl/EGLDisplay;[I)Z"/>
+ <method name="eglMakeCurrent(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLSurface;Ljavax/microedition/khronos/egl/EGLSurface;Ljavax/microedition/khronos/egl/EGLContext;)Z"/>
+ <method name="eglQueryContext(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLContext;I[I)Z"/>
+ <method name="eglQueryString(Ljavax/microedition/khronos/egl/EGLDisplay;I)Ljava/lang/String;"/>
+ <method name="eglQuerySurface(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLSurface;I[I)Z"/>
+ <method name="eglSwapBuffers(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLSurface;)Z"/>
+ <method name="eglTerminate(Ljavax/microedition/khronos/egl/EGLDisplay;)Z"/>
+ <method name="eglWaitGL()Z"/>
+ <method name="eglWaitNative(ILjava/lang/Object;)Z"/>
+ <field name="EGL_ALPHA_FORMAT"/>
+ <field name="EGL_ALPHA_MASK_SIZE"/>
+ <field name="EGL_ALPHA_SIZE"/>
+ <field name="EGL_BAD_ACCESS"/>
+ <field name="EGL_BAD_ALLOC"/>
+ <field name="EGL_BAD_ATTRIBUTE"/>
+ <field name="EGL_BAD_CONFIG"/>
+ <field name="EGL_BAD_CONTEXT"/>
+ <field name="EGL_BAD_CURRENT_SURFACE"/>
+ <field name="EGL_BAD_DISPLAY"/>
+ <field name="EGL_BAD_MATCH"/>
+ <field name="EGL_BAD_NATIVE_PIXMAP"/>
+ <field name="EGL_BAD_NATIVE_WINDOW"/>
+ <field name="EGL_BAD_PARAMETER"/>
+ <field name="EGL_BAD_SURFACE"/>
+ <field name="EGL_BLUE_SIZE"/>
+ <field name="EGL_BUFFER_SIZE"/>
+ <field name="EGL_COLORSPACE"/>
+ <field name="EGL_COLOR_BUFFER_TYPE"/>
+ <field name="EGL_CONFIG_CAVEAT"/>
+ <field name="EGL_CONFIG_ID"/>
+ <field name="EGL_CORE_NATIVE_ENGINE"/>
+ <field name="EGL_DEFAULT_DISPLAY"/>
+ <field name="EGL_DEPTH_SIZE"/>
+ <field name="EGL_DONT_CARE"/>
+ <field name="EGL_DRAW"/>
+ <field name="EGL_EXTENSIONS"/>
+ <field name="EGL_GREEN_SIZE"/>
+ <field name="EGL_HEIGHT"/>
+ <field name="EGL_HORIZONTAL_RESOLUTION"/>
+ <field name="EGL_LARGEST_PBUFFER"/>
+ <field name="EGL_LEVEL"/>
+ <field name="EGL_LUMINANCE_BUFFER"/>
+ <field name="EGL_LUMINANCE_SIZE"/>
+ <field name="EGL_MAX_PBUFFER_HEIGHT"/>
+ <field name="EGL_MAX_PBUFFER_PIXELS"/>
+ <field name="EGL_MAX_PBUFFER_WIDTH"/>
+ <field name="EGL_NATIVE_RENDERABLE"/>
+ <field name="EGL_NATIVE_VISUAL_ID"/>
+ <field name="EGL_NATIVE_VISUAL_TYPE"/>
+ <field name="EGL_NONE"/>
+ <field name="EGL_NON_CONFORMANT_CONFIG"/>
+ <field name="EGL_NOT_INITIALIZED"/>
+ <field name="EGL_NO_CONTEXT"/>
+ <field name="EGL_NO_DISPLAY"/>
+ <field name="EGL_NO_SURFACE"/>
+ <field name="EGL_PBUFFER_BIT"/>
+ <field name="EGL_PIXEL_ASPECT_RATIO"/>
+ <field name="EGL_PIXMAP_BIT"/>
+ <field name="EGL_READ"/>
+ <field name="EGL_RED_SIZE"/>
+ <field name="EGL_RENDERABLE_TYPE"/>
+ <field name="EGL_RENDER_BUFFER"/>
+ <field name="EGL_RGB_BUFFER"/>
+ <field name="EGL_SAMPLES"/>
+ <field name="EGL_SAMPLE_BUFFERS"/>
+ <field name="EGL_SINGLE_BUFFER"/>
+ <field name="EGL_SLOW_CONFIG"/>
+ <field name="EGL_STENCIL_SIZE"/>
+ <field name="EGL_SUCCESS"/>
+ <field name="EGL_SURFACE_TYPE"/>
+ <field name="EGL_TRANSPARENT_BLUE_VALUE"/>
+ <field name="EGL_TRANSPARENT_GREEN_VALUE"/>
+ <field name="EGL_TRANSPARENT_RED_VALUE"/>
+ <field name="EGL_TRANSPARENT_RGB"/>
+ <field name="EGL_TRANSPARENT_TYPE"/>
+ <field name="EGL_VENDOR"/>
+ <field name="EGL_VERSION"/>
+ <field name="EGL_VERTICAL_RESOLUTION"/>
+ <field name="EGL_WIDTH"/>
+ <field name="EGL_WINDOW_BIT"/>
+ </class>
+ <class name="javax/microedition/khronos/egl/EGL11" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="javax/microedition/khronos/egl/EGL10"/>
+ <field name="EGL_CONTEXT_LOST"/>
+ </class>
+ <class name="javax/microedition/khronos/egl/EGLConfig" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="javax/microedition/khronos/egl/EGLContext" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getEGL()Ljavax/microedition/khronos/egl/EGL;"/>
+ <method name="getGL()Ljavax/microedition/khronos/opengles/GL;"/>
+ </class>
+ <class name="javax/microedition/khronos/egl/EGLDisplay" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="javax/microedition/khronos/egl/EGLSurface" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="javax/microedition/khronos/opengles/GL" since="1">
+ <extends name="java/lang/Object"/>
+ </class>
+ <class name="javax/microedition/khronos/opengles/GL10" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="javax/microedition/khronos/opengles/GL"/>
+ <method name="glActiveTexture(I)V"/>
+ <method name="glAlphaFunc(IF)V"/>
+ <method name="glAlphaFuncx(II)V"/>
+ <method name="glBindTexture(II)V"/>
+ <method name="glBlendFunc(II)V"/>
+ <method name="glClear(I)V"/>
+ <method name="glClearColor(FFFF)V"/>
+ <method name="glClearColorx(IIII)V"/>
+ <method name="glClearDepthf(F)V"/>
+ <method name="glClearDepthx(I)V"/>
+ <method name="glClearStencil(I)V"/>
+ <method name="glClientActiveTexture(I)V"/>
+ <method name="glColor4f(FFFF)V"/>
+ <method name="glColor4x(IIII)V"/>
+ <method name="glColorMask(ZZZZ)V"/>
+ <method name="glColorPointer(IIILjava/nio/Buffer;)V"/>
+ <method name="glCompressedTexImage2D(IIIIIIILjava/nio/Buffer;)V"/>
+ <method name="glCompressedTexSubImage2D(IIIIIIIILjava/nio/Buffer;)V"/>
+ <method name="glCopyTexImage2D(IIIIIIII)V"/>
+ <method name="glCopyTexSubImage2D(IIIIIIII)V"/>
+ <method name="glCullFace(I)V"/>
+ <method name="glDeleteTextures(ILjava/nio/IntBuffer;)V"/>
+ <method name="glDeleteTextures(I[II)V"/>
+ <method name="glDepthFunc(I)V"/>
+ <method name="glDepthMask(Z)V"/>
+ <method name="glDepthRangef(FF)V"/>
+ <method name="glDepthRangex(II)V"/>
+ <method name="glDisable(I)V"/>
+ <method name="glDisableClientState(I)V"/>
+ <method name="glDrawArrays(III)V"/>
+ <method name="glDrawElements(IIILjava/nio/Buffer;)V"/>
+ <method name="glEnable(I)V"/>
+ <method name="glEnableClientState(I)V"/>
+ <method name="glFinish()V"/>
+ <method name="glFlush()V"/>
+ <method name="glFogf(IF)V"/>
+ <method name="glFogfv(ILjava/nio/FloatBuffer;)V"/>
+ <method name="glFogfv(I[FI)V"/>
+ <method name="glFogx(II)V"/>
+ <method name="glFogxv(ILjava/nio/IntBuffer;)V"/>
+ <method name="glFogxv(I[II)V"/>
+ <method name="glFrontFace(I)V"/>
+ <method name="glFrustumf(FFFFFF)V"/>
+ <method name="glFrustumx(IIIIII)V"/>
+ <method name="glGenTextures(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGenTextures(I[II)V"/>
+ <method name="glGetError()I"/>
+ <method name="glGetIntegerv(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGetIntegerv(I[II)V"/>
+ <method name="glGetString(I)Ljava/lang/String;"/>
+ <method name="glHint(II)V"/>
+ <method name="glLightModelf(IF)V"/>
+ <method name="glLightModelfv(ILjava/nio/FloatBuffer;)V"/>
+ <method name="glLightModelfv(I[FI)V"/>
+ <method name="glLightModelx(II)V"/>
+ <method name="glLightModelxv(ILjava/nio/IntBuffer;)V"/>
+ <method name="glLightModelxv(I[II)V"/>
+ <method name="glLightf(IIF)V"/>
+ <method name="glLightfv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glLightfv(II[FI)V"/>
+ <method name="glLightx(III)V"/>
+ <method name="glLightxv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glLightxv(II[II)V"/>
+ <method name="glLineWidth(F)V"/>
+ <method name="glLineWidthx(I)V"/>
+ <method name="glLoadIdentity()V"/>
+ <method name="glLoadMatrixf(Ljava/nio/FloatBuffer;)V"/>
+ <method name="glLoadMatrixf([FI)V"/>
+ <method name="glLoadMatrixx(Ljava/nio/IntBuffer;)V"/>
+ <method name="glLoadMatrixx([II)V"/>
+ <method name="glLogicOp(I)V"/>
+ <method name="glMaterialf(IIF)V"/>
+ <method name="glMaterialfv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glMaterialfv(II[FI)V"/>
+ <method name="glMaterialx(III)V"/>
+ <method name="glMaterialxv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glMaterialxv(II[II)V"/>
+ <method name="glMatrixMode(I)V"/>
+ <method name="glMultMatrixf(Ljava/nio/FloatBuffer;)V"/>
+ <method name="glMultMatrixf([FI)V"/>
+ <method name="glMultMatrixx(Ljava/nio/IntBuffer;)V"/>
+ <method name="glMultMatrixx([II)V"/>
+ <method name="glMultiTexCoord4f(IFFFF)V"/>
+ <method name="glMultiTexCoord4x(IIIII)V"/>
+ <method name="glNormal3f(FFF)V"/>
+ <method name="glNormal3x(III)V"/>
+ <method name="glNormalPointer(IILjava/nio/Buffer;)V"/>
+ <method name="glOrthof(FFFFFF)V"/>
+ <method name="glOrthox(IIIIII)V"/>
+ <method name="glPixelStorei(II)V"/>
+ <method name="glPointSize(F)V"/>
+ <method name="glPointSizex(I)V"/>
+ <method name="glPolygonOffset(FF)V"/>
+ <method name="glPolygonOffsetx(II)V"/>
+ <method name="glPopMatrix()V"/>
+ <method name="glPushMatrix()V"/>
+ <method name="glReadPixels(IIIIIILjava/nio/Buffer;)V"/>
+ <method name="glRotatef(FFFF)V"/>
+ <method name="glRotatex(IIII)V"/>
+ <method name="glSampleCoverage(FZ)V"/>
+ <method name="glSampleCoveragex(IZ)V"/>
+ <method name="glScalef(FFF)V"/>
+ <method name="glScalex(III)V"/>
+ <method name="glScissor(IIII)V"/>
+ <method name="glShadeModel(I)V"/>
+ <method name="glStencilFunc(III)V"/>
+ <method name="glStencilMask(I)V"/>
+ <method name="glStencilOp(III)V"/>
+ <method name="glTexCoordPointer(IIILjava/nio/Buffer;)V"/>
+ <method name="glTexEnvf(IIF)V"/>
+ <method name="glTexEnvfv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glTexEnvfv(II[FI)V"/>
+ <method name="glTexEnvx(III)V"/>
+ <method name="glTexEnvxv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glTexEnvxv(II[II)V"/>
+ <method name="glTexImage2D(IIIIIIIILjava/nio/Buffer;)V"/>
+ <method name="glTexParameterf(IIF)V"/>
+ <method name="glTexParameterx(III)V"/>
+ <method name="glTexSubImage2D(IIIIIIIILjava/nio/Buffer;)V"/>
+ <method name="glTranslatef(FFF)V"/>
+ <method name="glTranslatex(III)V"/>
+ <method name="glVertexPointer(IIILjava/nio/Buffer;)V"/>
+ <method name="glViewport(IIII)V"/>
+ <field name="GL_ADD"/>
+ <field name="GL_ALIASED_LINE_WIDTH_RANGE"/>
+ <field name="GL_ALIASED_POINT_SIZE_RANGE"/>
+ <field name="GL_ALPHA"/>
+ <field name="GL_ALPHA_BITS"/>
+ <field name="GL_ALPHA_TEST"/>
+ <field name="GL_ALWAYS"/>
+ <field name="GL_AMBIENT"/>
+ <field name="GL_AMBIENT_AND_DIFFUSE"/>
+ <field name="GL_AND"/>
+ <field name="GL_AND_INVERTED"/>
+ <field name="GL_AND_REVERSE"/>
+ <field name="GL_BACK"/>
+ <field name="GL_BLEND"/>
+ <field name="GL_BLUE_BITS"/>
+ <field name="GL_BYTE"/>
+ <field name="GL_CCW"/>
+ <field name="GL_CLAMP_TO_EDGE"/>
+ <field name="GL_CLEAR"/>
+ <field name="GL_COLOR_ARRAY"/>
+ <field name="GL_COLOR_BUFFER_BIT"/>
+ <field name="GL_COLOR_LOGIC_OP"/>
+ <field name="GL_COLOR_MATERIAL"/>
+ <field name="GL_COMPRESSED_TEXTURE_FORMATS"/>
+ <field name="GL_CONSTANT_ATTENUATION"/>
+ <field name="GL_COPY"/>
+ <field name="GL_COPY_INVERTED"/>
+ <field name="GL_CULL_FACE"/>
+ <field name="GL_CW"/>
+ <field name="GL_DECAL"/>
+ <field name="GL_DECR"/>
+ <field name="GL_DEPTH_BITS"/>
+ <field name="GL_DEPTH_BUFFER_BIT"/>
+ <field name="GL_DEPTH_TEST"/>
+ <field name="GL_DIFFUSE"/>
+ <field name="GL_DITHER"/>
+ <field name="GL_DONT_CARE"/>
+ <field name="GL_DST_ALPHA"/>
+ <field name="GL_DST_COLOR"/>
+ <field name="GL_EMISSION"/>
+ <field name="GL_EQUAL"/>
+ <field name="GL_EQUIV"/>
+ <field name="GL_EXP"/>
+ <field name="GL_EXP2"/>
+ <field name="GL_EXTENSIONS"/>
+ <field name="GL_FALSE"/>
+ <field name="GL_FASTEST"/>
+ <field name="GL_FIXED"/>
+ <field name="GL_FLAT"/>
+ <field name="GL_FLOAT"/>
+ <field name="GL_FOG"/>
+ <field name="GL_FOG_COLOR"/>
+ <field name="GL_FOG_DENSITY"/>
+ <field name="GL_FOG_END"/>
+ <field name="GL_FOG_HINT"/>
+ <field name="GL_FOG_MODE"/>
+ <field name="GL_FOG_START"/>
+ <field name="GL_FRONT"/>
+ <field name="GL_FRONT_AND_BACK"/>
+ <field name="GL_GEQUAL"/>
+ <field name="GL_GREATER"/>
+ <field name="GL_GREEN_BITS"/>
+ <field name="GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES"/>
+ <field name="GL_IMPLEMENTATION_COLOR_READ_TYPE_OES"/>
+ <field name="GL_INCR"/>
+ <field name="GL_INVALID_ENUM"/>
+ <field name="GL_INVALID_OPERATION"/>
+ <field name="GL_INVALID_VALUE"/>
+ <field name="GL_INVERT"/>
+ <field name="GL_KEEP"/>
+ <field name="GL_LEQUAL"/>
+ <field name="GL_LESS"/>
+ <field name="GL_LIGHT0"/>
+ <field name="GL_LIGHT1"/>
+ <field name="GL_LIGHT2"/>
+ <field name="GL_LIGHT3"/>
+ <field name="GL_LIGHT4"/>
+ <field name="GL_LIGHT5"/>
+ <field name="GL_LIGHT6"/>
+ <field name="GL_LIGHT7"/>
+ <field name="GL_LIGHTING"/>
+ <field name="GL_LIGHT_MODEL_AMBIENT"/>
+ <field name="GL_LIGHT_MODEL_TWO_SIDE"/>
+ <field name="GL_LINEAR"/>
+ <field name="GL_LINEAR_ATTENUATION"/>
+ <field name="GL_LINEAR_MIPMAP_LINEAR"/>
+ <field name="GL_LINEAR_MIPMAP_NEAREST"/>
+ <field name="GL_LINES"/>
+ <field name="GL_LINE_LOOP"/>
+ <field name="GL_LINE_SMOOTH"/>
+ <field name="GL_LINE_SMOOTH_HINT"/>
+ <field name="GL_LINE_STRIP"/>
+ <field name="GL_LUMINANCE"/>
+ <field name="GL_LUMINANCE_ALPHA"/>
+ <field name="GL_MAX_ELEMENTS_INDICES"/>
+ <field name="GL_MAX_ELEMENTS_VERTICES"/>
+ <field name="GL_MAX_LIGHTS"/>
+ <field name="GL_MAX_MODELVIEW_STACK_DEPTH"/>
+ <field name="GL_MAX_PROJECTION_STACK_DEPTH"/>
+ <field name="GL_MAX_TEXTURE_SIZE"/>
+ <field name="GL_MAX_TEXTURE_STACK_DEPTH"/>
+ <field name="GL_MAX_TEXTURE_UNITS"/>
+ <field name="GL_MAX_VIEWPORT_DIMS"/>
+ <field name="GL_MODELVIEW"/>
+ <field name="GL_MODULATE"/>
+ <field name="GL_MULTISAMPLE"/>
+ <field name="GL_NAND"/>
+ <field name="GL_NEAREST"/>
+ <field name="GL_NEAREST_MIPMAP_LINEAR"/>
+ <field name="GL_NEAREST_MIPMAP_NEAREST"/>
+ <field name="GL_NEVER"/>
+ <field name="GL_NICEST"/>
+ <field name="GL_NOOP"/>
+ <field name="GL_NOR"/>
+ <field name="GL_NORMALIZE"/>
+ <field name="GL_NORMAL_ARRAY"/>
+ <field name="GL_NOTEQUAL"/>
+ <field name="GL_NO_ERROR"/>
+ <field name="GL_NUM_COMPRESSED_TEXTURE_FORMATS"/>
+ <field name="GL_ONE"/>
+ <field name="GL_ONE_MINUS_DST_ALPHA"/>
+ <field name="GL_ONE_MINUS_DST_COLOR"/>
+ <field name="GL_ONE_MINUS_SRC_ALPHA"/>
+ <field name="GL_ONE_MINUS_SRC_COLOR"/>
+ <field name="GL_OR"/>
+ <field name="GL_OR_INVERTED"/>
+ <field name="GL_OR_REVERSE"/>
+ <field name="GL_OUT_OF_MEMORY"/>
+ <field name="GL_PACK_ALIGNMENT"/>
+ <field name="GL_PALETTE4_R5_G6_B5_OES"/>
+ <field name="GL_PALETTE4_RGB5_A1_OES"/>
+ <field name="GL_PALETTE4_RGB8_OES"/>
+ <field name="GL_PALETTE4_RGBA4_OES"/>
+ <field name="GL_PALETTE4_RGBA8_OES"/>
+ <field name="GL_PALETTE8_R5_G6_B5_OES"/>
+ <field name="GL_PALETTE8_RGB5_A1_OES"/>
+ <field name="GL_PALETTE8_RGB8_OES"/>
+ <field name="GL_PALETTE8_RGBA4_OES"/>
+ <field name="GL_PALETTE8_RGBA8_OES"/>
+ <field name="GL_PERSPECTIVE_CORRECTION_HINT"/>
+ <field name="GL_POINTS"/>
+ <field name="GL_POINT_FADE_THRESHOLD_SIZE"/>
+ <field name="GL_POINT_SIZE"/>
+ <field name="GL_POINT_SMOOTH"/>
+ <field name="GL_POINT_SMOOTH_HINT"/>
+ <field name="GL_POLYGON_OFFSET_FILL"/>
+ <field name="GL_POLYGON_SMOOTH_HINT"/>
+ <field name="GL_POSITION"/>
+ <field name="GL_PROJECTION"/>
+ <field name="GL_QUADRATIC_ATTENUATION"/>
+ <field name="GL_RED_BITS"/>
+ <field name="GL_RENDERER"/>
+ <field name="GL_REPEAT"/>
+ <field name="GL_REPLACE"/>
+ <field name="GL_RESCALE_NORMAL"/>
+ <field name="GL_RGB"/>
+ <field name="GL_RGBA"/>
+ <field name="GL_SAMPLE_ALPHA_TO_COVERAGE"/>
+ <field name="GL_SAMPLE_ALPHA_TO_ONE"/>
+ <field name="GL_SAMPLE_COVERAGE"/>
+ <field name="GL_SCISSOR_TEST"/>
+ <field name="GL_SET"/>
+ <field name="GL_SHININESS"/>
+ <field name="GL_SHORT"/>
+ <field name="GL_SMOOTH"/>
+ <field name="GL_SMOOTH_LINE_WIDTH_RANGE"/>
+ <field name="GL_SMOOTH_POINT_SIZE_RANGE"/>
+ <field name="GL_SPECULAR"/>
+ <field name="GL_SPOT_CUTOFF"/>
+ <field name="GL_SPOT_DIRECTION"/>
+ <field name="GL_SPOT_EXPONENT"/>
+ <field name="GL_SRC_ALPHA"/>
+ <field name="GL_SRC_ALPHA_SATURATE"/>
+ <field name="GL_SRC_COLOR"/>
+ <field name="GL_STACK_OVERFLOW"/>
+ <field name="GL_STACK_UNDERFLOW"/>
+ <field name="GL_STENCIL_BITS"/>
+ <field name="GL_STENCIL_BUFFER_BIT"/>
+ <field name="GL_STENCIL_TEST"/>
+ <field name="GL_SUBPIXEL_BITS"/>
+ <field name="GL_TEXTURE"/>
+ <field name="GL_TEXTURE0"/>
+ <field name="GL_TEXTURE1"/>
+ <field name="GL_TEXTURE10"/>
+ <field name="GL_TEXTURE11"/>
+ <field name="GL_TEXTURE12"/>
+ <field name="GL_TEXTURE13"/>
+ <field name="GL_TEXTURE14"/>
+ <field name="GL_TEXTURE15"/>
+ <field name="GL_TEXTURE16"/>
+ <field name="GL_TEXTURE17"/>
+ <field name="GL_TEXTURE18"/>
+ <field name="GL_TEXTURE19"/>
+ <field name="GL_TEXTURE2"/>
+ <field name="GL_TEXTURE20"/>
+ <field name="GL_TEXTURE21"/>
+ <field name="GL_TEXTURE22"/>
+ <field name="GL_TEXTURE23"/>
+ <field name="GL_TEXTURE24"/>
+ <field name="GL_TEXTURE25"/>
+ <field name="GL_TEXTURE26"/>
+ <field name="GL_TEXTURE27"/>
+ <field name="GL_TEXTURE28"/>
+ <field name="GL_TEXTURE29"/>
+ <field name="GL_TEXTURE3"/>
+ <field name="GL_TEXTURE30"/>
+ <field name="GL_TEXTURE31"/>
+ <field name="GL_TEXTURE4"/>
+ <field name="GL_TEXTURE5"/>
+ <field name="GL_TEXTURE6"/>
+ <field name="GL_TEXTURE7"/>
+ <field name="GL_TEXTURE8"/>
+ <field name="GL_TEXTURE9"/>
+ <field name="GL_TEXTURE_2D"/>
+ <field name="GL_TEXTURE_COORD_ARRAY"/>
+ <field name="GL_TEXTURE_ENV"/>
+ <field name="GL_TEXTURE_ENV_COLOR"/>
+ <field name="GL_TEXTURE_ENV_MODE"/>
+ <field name="GL_TEXTURE_MAG_FILTER"/>
+ <field name="GL_TEXTURE_MIN_FILTER"/>
+ <field name="GL_TEXTURE_WRAP_S"/>
+ <field name="GL_TEXTURE_WRAP_T"/>
+ <field name="GL_TRIANGLES"/>
+ <field name="GL_TRIANGLE_FAN"/>
+ <field name="GL_TRIANGLE_STRIP"/>
+ <field name="GL_TRUE"/>
+ <field name="GL_UNPACK_ALIGNMENT"/>
+ <field name="GL_UNSIGNED_BYTE"/>
+ <field name="GL_UNSIGNED_SHORT"/>
+ <field name="GL_UNSIGNED_SHORT_4_4_4_4"/>
+ <field name="GL_UNSIGNED_SHORT_5_5_5_1"/>
+ <field name="GL_UNSIGNED_SHORT_5_6_5"/>
+ <field name="GL_VENDOR"/>
+ <field name="GL_VERSION"/>
+ <field name="GL_VERTEX_ARRAY"/>
+ <field name="GL_XOR"/>
+ <field name="GL_ZERO"/>
+ </class>
+ <class name="javax/microedition/khronos/opengles/GL10Ext" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="javax/microedition/khronos/opengles/GL"/>
+ <method name="glQueryMatrixxOES(Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;)I"/>
+ <method name="glQueryMatrixxOES([II[II)I"/>
+ </class>
+ <class name="javax/microedition/khronos/opengles/GL11" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="javax/microedition/khronos/opengles/GL10"/>
+ <method name="glBindBuffer(II)V"/>
+ <method name="glBufferData(IILjava/nio/Buffer;I)V"/>
+ <method name="glBufferSubData(IIILjava/nio/Buffer;)V"/>
+ <method name="glClipPlanef(ILjava/nio/FloatBuffer;)V"/>
+ <method name="glClipPlanef(I[FI)V"/>
+ <method name="glClipPlanex(ILjava/nio/IntBuffer;)V"/>
+ <method name="glClipPlanex(I[II)V"/>
+ <method name="glColor4ub(BBBB)V"/>
+ <method name="glColorPointer(IIII)V"/>
+ <method name="glDeleteBuffers(ILjava/nio/IntBuffer;)V"/>
+ <method name="glDeleteBuffers(I[II)V"/>
+ <method name="glDrawElements(IIII)V"/>
+ <method name="glGenBuffers(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGenBuffers(I[II)V"/>
+ <method name="glGetBooleanv(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGetBooleanv(I[ZI)V"/>
+ <method name="glGetBufferParameteriv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetBufferParameteriv(II[II)V"/>
+ <method name="glGetClipPlanef(ILjava/nio/FloatBuffer;)V"/>
+ <method name="glGetClipPlanef(I[FI)V"/>
+ <method name="glGetClipPlanex(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGetClipPlanex(I[II)V"/>
+ <method name="glGetFixedv(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGetFixedv(I[II)V"/>
+ <method name="glGetFloatv(ILjava/nio/FloatBuffer;)V"/>
+ <method name="glGetFloatv(I[FI)V"/>
+ <method name="glGetLightfv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glGetLightfv(II[FI)V"/>
+ <method name="glGetLightxv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetLightxv(II[II)V"/>
+ <method name="glGetMaterialfv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glGetMaterialfv(II[FI)V"/>
+ <method name="glGetMaterialxv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetMaterialxv(II[II)V"/>
+ <method name="glGetPointerv(I[Ljava/nio/Buffer;)V"/>
+ <method name="glGetTexEnviv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetTexEnviv(II[II)V"/>
+ <method name="glGetTexEnvxv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetTexEnvxv(II[II)V"/>
+ <method name="glGetTexParameterfv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glGetTexParameterfv(II[FI)V"/>
+ <method name="glGetTexParameteriv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetTexParameteriv(II[II)V"/>
+ <method name="glGetTexParameterxv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetTexParameterxv(II[II)V"/>
+ <method name="glIsBuffer(I)Z"/>
+ <method name="glIsEnabled(I)Z"/>
+ <method name="glIsTexture(I)Z"/>
+ <method name="glNormalPointer(III)V"/>
+ <method name="glPointParameterf(IF)V"/>
+ <method name="glPointParameterfv(ILjava/nio/FloatBuffer;)V"/>
+ <method name="glPointParameterfv(I[FI)V"/>
+ <method name="glPointParameterx(II)V"/>
+ <method name="glPointParameterxv(ILjava/nio/IntBuffer;)V"/>
+ <method name="glPointParameterxv(I[II)V"/>
+ <method name="glPointSizePointerOES(IILjava/nio/Buffer;)V"/>
+ <method name="glTexCoordPointer(IIII)V"/>
+ <method name="glTexEnvi(III)V"/>
+ <method name="glTexEnviv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glTexEnviv(II[II)V"/>
+ <method name="glTexParameterfv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glTexParameterfv(II[FI)V"/>
+ <method name="glTexParameteri(III)V"/>
+ <method name="glTexParameteriv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glTexParameteriv(II[II)V"/>
+ <method name="glTexParameterxv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glTexParameterxv(II[II)V"/>
+ <method name="glVertexPointer(IIII)V"/>
+ <field name="GL_ACTIVE_TEXTURE"/>
+ <field name="GL_ADD_SIGNED"/>
+ <field name="GL_ALPHA_SCALE"/>
+ <field name="GL_ALPHA_TEST_FUNC"/>
+ <field name="GL_ALPHA_TEST_REF"/>
+ <field name="GL_ARRAY_BUFFER"/>
+ <field name="GL_ARRAY_BUFFER_BINDING"/>
+ <field name="GL_BLEND_DST"/>
+ <field name="GL_BLEND_SRC"/>
+ <field name="GL_BUFFER_ACCESS"/>
+ <field name="GL_BUFFER_SIZE"/>
+ <field name="GL_BUFFER_USAGE"/>
+ <field name="GL_CLIENT_ACTIVE_TEXTURE"/>
+ <field name="GL_CLIP_PLANE0"/>
+ <field name="GL_CLIP_PLANE1"/>
+ <field name="GL_CLIP_PLANE2"/>
+ <field name="GL_CLIP_PLANE3"/>
+ <field name="GL_CLIP_PLANE4"/>
+ <field name="GL_CLIP_PLANE5"/>
+ <field name="GL_COLOR_ARRAY_BUFFER_BINDING"/>
+ <field name="GL_COLOR_ARRAY_POINTER"/>
+ <field name="GL_COLOR_ARRAY_SIZE"/>
+ <field name="GL_COLOR_ARRAY_STRIDE"/>
+ <field name="GL_COLOR_ARRAY_TYPE"/>
+ <field name="GL_COLOR_CLEAR_VALUE"/>
+ <field name="GL_COLOR_WRITEMASK"/>
+ <field name="GL_COMBINE"/>
+ <field name="GL_COMBINE_ALPHA"/>
+ <field name="GL_COMBINE_RGB"/>
+ <field name="GL_CONSTANT"/>
+ <field name="GL_COORD_REPLACE_OES"/>
+ <field name="GL_CULL_FACE_MODE"/>
+ <field name="GL_CURRENT_COLOR"/>
+ <field name="GL_CURRENT_NORMAL"/>
+ <field name="GL_CURRENT_TEXTURE_COORDS"/>
+ <field name="GL_DEPTH_CLEAR_VALUE"/>
+ <field name="GL_DEPTH_FUNC"/>
+ <field name="GL_DEPTH_RANGE"/>
+ <field name="GL_DEPTH_WRITEMASK"/>
+ <field name="GL_DOT3_RGB"/>
+ <field name="GL_DOT3_RGBA"/>
+ <field name="GL_DYNAMIC_DRAW"/>
+ <field name="GL_ELEMENT_ARRAY_BUFFER"/>
+ <field name="GL_ELEMENT_ARRAY_BUFFER_BINDING"/>
+ <field name="GL_FRONT_FACE"/>
+ <field name="GL_GENERATE_MIPMAP"/>
+ <field name="GL_GENERATE_MIPMAP_HINT"/>
+ <field name="GL_INTERPOLATE"/>
+ <field name="GL_LINE_WIDTH"/>
+ <field name="GL_LOGIC_OP_MODE"/>
+ <field name="GL_MATRIX_MODE"/>
+ <field name="GL_MAX_CLIP_PLANES"/>
+ <field name="GL_MODELVIEW_MATRIX"/>
+ <field name="GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES"/>
+ <field name="GL_MODELVIEW_STACK_DEPTH"/>
+ <field name="GL_NORMAL_ARRAY_BUFFER_BINDING"/>
+ <field name="GL_NORMAL_ARRAY_POINTER"/>
+ <field name="GL_NORMAL_ARRAY_STRIDE"/>
+ <field name="GL_NORMAL_ARRAY_TYPE"/>
+ <field name="GL_OPERAND0_ALPHA"/>
+ <field name="GL_OPERAND0_RGB"/>
+ <field name="GL_OPERAND1_ALPHA"/>
+ <field name="GL_OPERAND1_RGB"/>
+ <field name="GL_OPERAND2_ALPHA"/>
+ <field name="GL_OPERAND2_RGB"/>
+ <field name="GL_POINT_DISTANCE_ATTENUATION"/>
+ <field name="GL_POINT_FADE_THRESHOLD_SIZE"/>
+ <field name="GL_POINT_SIZE"/>
+ <field name="GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES"/>
+ <field name="GL_POINT_SIZE_ARRAY_OES"/>
+ <field name="GL_POINT_SIZE_ARRAY_POINTER_OES"/>
+ <field name="GL_POINT_SIZE_ARRAY_STRIDE_OES"/>
+ <field name="GL_POINT_SIZE_ARRAY_TYPE_OES"/>
+ <field name="GL_POINT_SIZE_MAX"/>
+ <field name="GL_POINT_SIZE_MIN"/>
+ <field name="GL_POINT_SPRITE_OES"/>
+ <field name="GL_POLYGON_OFFSET_FACTOR"/>
+ <field name="GL_POLYGON_OFFSET_UNITS"/>
+ <field name="GL_PREVIOUS"/>
+ <field name="GL_PRIMARY_COLOR"/>
+ <field name="GL_PROJECTION_MATRIX"/>
+ <field name="GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES"/>
+ <field name="GL_PROJECTION_STACK_DEPTH"/>
+ <field name="GL_RGB_SCALE"/>
+ <field name="GL_SAMPLES"/>
+ <field name="GL_SAMPLE_BUFFERS"/>
+ <field name="GL_SAMPLE_COVERAGE_INVERT"/>
+ <field name="GL_SAMPLE_COVERAGE_VALUE"/>
+ <field name="GL_SCISSOR_BOX"/>
+ <field name="GL_SHADE_MODEL"/>
+ <field name="GL_SRC0_ALPHA"/>
+ <field name="GL_SRC0_RGB"/>
+ <field name="GL_SRC1_ALPHA"/>
+ <field name="GL_SRC1_RGB"/>
+ <field name="GL_SRC2_ALPHA"/>
+ <field name="GL_SRC2_RGB"/>
+ <field name="GL_STATIC_DRAW"/>
+ <field name="GL_STENCIL_CLEAR_VALUE"/>
+ <field name="GL_STENCIL_FAIL"/>
+ <field name="GL_STENCIL_FUNC"/>
+ <field name="GL_STENCIL_PASS_DEPTH_FAIL"/>
+ <field name="GL_STENCIL_PASS_DEPTH_PASS"/>
+ <field name="GL_STENCIL_REF"/>
+ <field name="GL_STENCIL_VALUE_MASK"/>
+ <field name="GL_STENCIL_WRITEMASK"/>
+ <field name="GL_SUBTRACT"/>
+ <field name="GL_TEXTURE_BINDING_2D"/>
+ <field name="GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING"/>
+ <field name="GL_TEXTURE_COORD_ARRAY_POINTER"/>
+ <field name="GL_TEXTURE_COORD_ARRAY_SIZE"/>
+ <field name="GL_TEXTURE_COORD_ARRAY_STRIDE"/>
+ <field name="GL_TEXTURE_COORD_ARRAY_TYPE"/>
+ <field name="GL_TEXTURE_MATRIX"/>
+ <field name="GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES"/>
+ <field name="GL_TEXTURE_STACK_DEPTH"/>
+ <field name="GL_VERTEX_ARRAY_BUFFER_BINDING"/>
+ <field name="GL_VERTEX_ARRAY_POINTER"/>
+ <field name="GL_VERTEX_ARRAY_SIZE"/>
+ <field name="GL_VERTEX_ARRAY_STRIDE"/>
+ <field name="GL_VERTEX_ARRAY_TYPE"/>
+ <field name="GL_VIEWPORT"/>
+ <field name="GL_WRITE_ONLY"/>
+ </class>
+ <class name="javax/microedition/khronos/opengles/GL11Ext" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="javax/microedition/khronos/opengles/GL"/>
+ <method name="glCurrentPaletteMatrixOES(I)V"/>
+ <method name="glDrawTexfOES(FFFFF)V"/>
+ <method name="glDrawTexfvOES(Ljava/nio/FloatBuffer;)V"/>
+ <method name="glDrawTexfvOES([FI)V"/>
+ <method name="glDrawTexiOES(IIIII)V"/>
+ <method name="glDrawTexivOES(Ljava/nio/IntBuffer;)V"/>
+ <method name="glDrawTexivOES([II)V"/>
+ <method name="glDrawTexsOES(SSSSS)V"/>
+ <method name="glDrawTexsvOES(Ljava/nio/ShortBuffer;)V"/>
+ <method name="glDrawTexsvOES([SI)V"/>
+ <method name="glDrawTexxOES(IIIII)V"/>
+ <method name="glDrawTexxvOES(Ljava/nio/IntBuffer;)V"/>
+ <method name="glDrawTexxvOES([II)V"/>
+ <method name="glEnable(I)V"/>
+ <method name="glEnableClientState(I)V"/>
+ <method name="glLoadPaletteFromModelViewMatrixOES()V"/>
+ <method name="glMatrixIndexPointerOES(IIII)V"/>
+ <method name="glMatrixIndexPointerOES(IIILjava/nio/Buffer;)V"/>
+ <method name="glTexParameterfv(II[FI)V"/>
+ <method name="glWeightPointerOES(IIII)V"/>
+ <method name="glWeightPointerOES(IIILjava/nio/Buffer;)V"/>
+ <field name="GL_MATRIX_INDEX_ARRAY_BUFFER_BINDING_OES"/>
+ <field name="GL_MATRIX_INDEX_ARRAY_OES"/>
+ <field name="GL_MATRIX_INDEX_ARRAY_POINTER_OES"/>
+ <field name="GL_MATRIX_INDEX_ARRAY_SIZE_OES"/>
+ <field name="GL_MATRIX_INDEX_ARRAY_STRIDE_OES"/>
+ <field name="GL_MATRIX_INDEX_ARRAY_TYPE_OES"/>
+ <field name="GL_MATRIX_PALETTE_OES"/>
+ <field name="GL_MAX_PALETTE_MATRICES_OES"/>
+ <field name="GL_MAX_VERTEX_UNITS_OES"/>
+ <field name="GL_TEXTURE_CROP_RECT_OES"/>
+ <field name="GL_WEIGHT_ARRAY_BUFFER_BINDING_OES"/>
+ <field name="GL_WEIGHT_ARRAY_OES"/>
+ <field name="GL_WEIGHT_ARRAY_POINTER_OES"/>
+ <field name="GL_WEIGHT_ARRAY_SIZE_OES"/>
+ <field name="GL_WEIGHT_ARRAY_STRIDE_OES"/>
+ <field name="GL_WEIGHT_ARRAY_TYPE_OES"/>
+ </class>
+ <class name="javax/microedition/khronos/opengles/GL11ExtensionPack" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="javax/microedition/khronos/opengles/GL"/>
+ <method name="glBindFramebufferOES(II)V"/>
+ <method name="glBindRenderbufferOES(II)V"/>
+ <method name="glBindTexture(II)V"/>
+ <method name="glBlendEquation(I)V"/>
+ <method name="glBlendEquationSeparate(II)V"/>
+ <method name="glBlendFuncSeparate(IIII)V"/>
+ <method name="glCheckFramebufferStatusOES(I)I"/>
+ <method name="glCompressedTexImage2D(IIIIIIILjava/nio/Buffer;)V"/>
+ <method name="glCopyTexImage2D(IIIIIIII)V"/>
+ <method name="glDeleteFramebuffersOES(ILjava/nio/IntBuffer;)V"/>
+ <method name="glDeleteFramebuffersOES(I[II)V"/>
+ <method name="glDeleteRenderbuffersOES(ILjava/nio/IntBuffer;)V"/>
+ <method name="glDeleteRenderbuffersOES(I[II)V"/>
+ <method name="glEnable(I)V"/>
+ <method name="glFramebufferRenderbufferOES(IIII)V"/>
+ <method name="glFramebufferTexture2DOES(IIIII)V"/>
+ <method name="glGenFramebuffersOES(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGenFramebuffersOES(I[II)V"/>
+ <method name="glGenRenderbuffersOES(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGenRenderbuffersOES(I[II)V"/>
+ <method name="glGenerateMipmapOES(I)V"/>
+ <method name="glGetFramebufferAttachmentParameterivOES(IIILjava/nio/IntBuffer;)V"/>
+ <method name="glGetFramebufferAttachmentParameterivOES(III[II)V"/>
+ <method name="glGetIntegerv(ILjava/nio/IntBuffer;)V"/>
+ <method name="glGetIntegerv(I[II)V"/>
+ <method name="glGetRenderbufferParameterivOES(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetRenderbufferParameterivOES(II[II)V"/>
+ <method name="glGetTexGenfv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glGetTexGenfv(II[FI)V"/>
+ <method name="glGetTexGeniv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetTexGeniv(II[II)V"/>
+ <method name="glGetTexGenxv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glGetTexGenxv(II[II)V"/>
+ <method name="glIsFramebufferOES(I)Z"/>
+ <method name="glIsRenderbufferOES(I)Z"/>
+ <method name="glRenderbufferStorageOES(IIII)V"/>
+ <method name="glStencilOp(III)V"/>
+ <method name="glTexEnvf(IIF)V"/>
+ <method name="glTexEnvfv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glTexEnvfv(II[FI)V"/>
+ <method name="glTexEnvx(III)V"/>
+ <method name="glTexEnvxv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glTexEnvxv(II[II)V"/>
+ <method name="glTexGenf(IIF)V"/>
+ <method name="glTexGenfv(IILjava/nio/FloatBuffer;)V"/>
+ <method name="glTexGenfv(II[FI)V"/>
+ <method name="glTexGeni(III)V"/>
+ <method name="glTexGeniv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glTexGeniv(II[II)V"/>
+ <method name="glTexGenx(III)V"/>
+ <method name="glTexGenxv(IILjava/nio/IntBuffer;)V"/>
+ <method name="glTexGenxv(II[II)V"/>
+ <method name="glTexParameterf(IIF)V"/>
+ <field name="GL_BLEND_DST_ALPHA"/>
+ <field name="GL_BLEND_DST_RGB"/>
+ <field name="GL_BLEND_EQUATION"/>
+ <field name="GL_BLEND_EQUATION_ALPHA"/>
+ <field name="GL_BLEND_EQUATION_RGB"/>
+ <field name="GL_BLEND_SRC_ALPHA"/>
+ <field name="GL_BLEND_SRC_RGB"/>
+ <field name="GL_COLOR_ATTACHMENT0_OES"/>
+ <field name="GL_COLOR_ATTACHMENT10_OES"/>
+ <field name="GL_COLOR_ATTACHMENT11_OES"/>
+ <field name="GL_COLOR_ATTACHMENT12_OES"/>
+ <field name="GL_COLOR_ATTACHMENT13_OES"/>
+ <field name="GL_COLOR_ATTACHMENT14_OES"/>
+ <field name="GL_COLOR_ATTACHMENT15_OES"/>
+ <field name="GL_COLOR_ATTACHMENT1_OES"/>
+ <field name="GL_COLOR_ATTACHMENT2_OES"/>
+ <field name="GL_COLOR_ATTACHMENT3_OES"/>
+ <field name="GL_COLOR_ATTACHMENT4_OES"/>
+ <field name="GL_COLOR_ATTACHMENT5_OES"/>
+ <field name="GL_COLOR_ATTACHMENT6_OES"/>
+ <field name="GL_COLOR_ATTACHMENT7_OES"/>
+ <field name="GL_COLOR_ATTACHMENT8_OES"/>
+ <field name="GL_COLOR_ATTACHMENT9_OES"/>
+ <field name="GL_DECR_WRAP"/>
+ <field name="GL_DEPTH_ATTACHMENT_OES"/>
+ <field name="GL_DEPTH_COMPONENT"/>
+ <field name="GL_DEPTH_COMPONENT16"/>
+ <field name="GL_DEPTH_COMPONENT24"/>
+ <field name="GL_DEPTH_COMPONENT32"/>
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES"/>
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES"/>
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES"/>
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES"/>
+ <field name="GL_FRAMEBUFFER_BINDING_OES"/>
+ <field name="GL_FRAMEBUFFER_COMPLETE_OES"/>
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES"/>
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES"/>
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_OES"/>
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES"/>
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES"/>
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_OES"/>
+ <field name="GL_FRAMEBUFFER_OES"/>
+ <field name="GL_FRAMEBUFFER_UNSUPPORTED_OES"/>
+ <field name="GL_FUNC_ADD"/>
+ <field name="GL_FUNC_REVERSE_SUBTRACT"/>
+ <field name="GL_FUNC_SUBTRACT"/>
+ <field name="GL_INCR_WRAP"/>
+ <field name="GL_INVALID_FRAMEBUFFER_OPERATION_OES"/>
+ <field name="GL_MAX_COLOR_ATTACHMENTS_OES"/>
+ <field name="GL_MAX_CUBE_MAP_TEXTURE_SIZE"/>
+ <field name="GL_MAX_RENDERBUFFER_SIZE_OES"/>
+ <field name="GL_MIRRORED_REPEAT"/>
+ <field name="GL_NORMAL_MAP"/>
+ <field name="GL_REFLECTION_MAP"/>
+ <field name="GL_RENDERBUFFER_ALPHA_SIZE_OES"/>
+ <field name="GL_RENDERBUFFER_BINDING_OES"/>
+ <field name="GL_RENDERBUFFER_BLUE_SIZE_OES"/>
+ <field name="GL_RENDERBUFFER_DEPTH_SIZE_OES"/>
+ <field name="GL_RENDERBUFFER_GREEN_SIZE_OES"/>
+ <field name="GL_RENDERBUFFER_HEIGHT_OES"/>
+ <field name="GL_RENDERBUFFER_INTERNAL_FORMAT_OES"/>
+ <field name="GL_RENDERBUFFER_OES"/>
+ <field name="GL_RENDERBUFFER_RED_SIZE_OES"/>
+ <field name="GL_RENDERBUFFER_STENCIL_SIZE_OES"/>
+ <field name="GL_RENDERBUFFER_WIDTH_OES"/>
+ <field name="GL_RGB565_OES"/>
+ <field name="GL_RGB5_A1"/>
+ <field name="GL_RGB8"/>
+ <field name="GL_RGBA4"/>
+ <field name="GL_RGBA8"/>
+ <field name="GL_STENCIL_ATTACHMENT_OES"/>
+ <field name="GL_STENCIL_INDEX"/>
+ <field name="GL_STENCIL_INDEX1_OES"/>
+ <field name="GL_STENCIL_INDEX4_OES"/>
+ <field name="GL_STENCIL_INDEX8_OES"/>
+ <field name="GL_STR"/>
+ <field name="GL_TEXTURE_BINDING_CUBE_MAP"/>
+ <field name="GL_TEXTURE_CUBE_MAP"/>
+ <field name="GL_TEXTURE_CUBE_MAP_NEGATIVE_X"/>
+ <field name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Y"/>
+ <field name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Z"/>
+ <field name="GL_TEXTURE_CUBE_MAP_POSITIVE_X"/>
+ <field name="GL_TEXTURE_CUBE_MAP_POSITIVE_Y"/>
+ <field name="GL_TEXTURE_CUBE_MAP_POSITIVE_Z"/>
+ <field name="GL_TEXTURE_GEN_MODE"/>
+ <field name="GL_TEXTURE_GEN_STR"/>
+ </class>
+ <class name="javax/net/ServerSocketFactory" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="createServerSocket()Ljava/net/ServerSocket;"/>
+ <method name="createServerSocket(I)Ljava/net/ServerSocket;"/>
+ <method name="createServerSocket(II)Ljava/net/ServerSocket;"/>
+ <method name="createServerSocket(IILjava/net/InetAddress;)Ljava/net/ServerSocket;"/>
+ <method name="getDefault()Ljavax/net/ServerSocketFactory;"/>
+ </class>
+ <class name="javax/net/SocketFactory" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="createSocket()Ljava/net/Socket;"/>
+ <method name="createSocket(Ljava/lang/String;I)Ljava/net/Socket;"/>
+ <method name="createSocket(Ljava/lang/String;ILjava/net/InetAddress;I)Ljava/net/Socket;"/>
+ <method name="createSocket(Ljava/net/InetAddress;I)Ljava/net/Socket;"/>
+ <method name="createSocket(Ljava/net/InetAddress;ILjava/net/InetAddress;I)Ljava/net/Socket;"/>
+ <method name="getDefault()Ljavax/net/SocketFactory;"/>
+ </class>
+ <class name="javax/net/ssl/CertPathTrustManagerParameters" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="javax/net/ssl/ManagerFactoryParameters"/>
+ <method name="&lt;init>(Ljava/security/cert/CertPathParameters;)V"/>
+ <method name="getParameters()Ljava/security/cert/CertPathParameters;"/>
+ </class>
+ <class name="javax/net/ssl/ExtendedSSLSession" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="javax/net/ssl/SSLSession"/>
+ <method name="&lt;init>()V"/>
+ <method name="getLocalSupportedSignatureAlgorithms()[Ljava/lang/String;"/>
+ <method name="getPeerSupportedSignatureAlgorithms()[Ljava/lang/String;"/>
+ <method name="getRequestedServerNames()Ljava/util/List;"/>
+ </class>
+ <class name="javax/net/ssl/HandshakeCompletedEvent" since="1">
+ <extends name="java/util/EventObject"/>
+ <method name="&lt;init>(Ljavax/net/ssl/SSLSocket;Ljavax/net/ssl/SSLSession;)V"/>
+ <method name="getCipherSuite()Ljava/lang/String;"/>
+ <method name="getLocalCertificates()[Ljava/security/cert/Certificate;"/>
+ <method name="getLocalPrincipal()Ljava/security/Principal;"/>
+ <method name="getPeerCertificateChain()[Ljavax/security/cert/X509Certificate;"/>
+ <method name="getPeerCertificates()[Ljava/security/cert/Certificate;"/>
+ <method name="getPeerPrincipal()Ljava/security/Principal;"/>
+ <method name="getSession()Ljavax/net/ssl/SSLSession;"/>
+ <method name="getSocket()Ljavax/net/ssl/SSLSocket;"/>
+ </class>
+ <class name="javax/net/ssl/HandshakeCompletedListener" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/EventListener"/>
+ <method name="handshakeCompleted(Ljavax/net/ssl/HandshakeCompletedEvent;)V"/>
+ </class>
+ <class name="javax/net/ssl/HostnameVerifier" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="verify(Ljava/lang/String;Ljavax/net/ssl/SSLSession;)Z"/>
+ </class>
+ <class name="javax/net/ssl/HttpsURLConnection" since="1">
+ <extends name="java/net/HttpURLConnection"/>
+ <method name="&lt;init>(Ljava/net/URL;)V"/>
+ <method name="getCipherSuite()Ljava/lang/String;"/>
+ <method name="getDefaultHostnameVerifier()Ljavax/net/ssl/HostnameVerifier;"/>
+ <method name="getDefaultSSLSocketFactory()Ljavax/net/ssl/SSLSocketFactory;"/>
+ <method name="getHostnameVerifier()Ljavax/net/ssl/HostnameVerifier;"/>
+ <method name="getLocalCertificates()[Ljava/security/cert/Certificate;"/>
+ <method name="getLocalPrincipal()Ljava/security/Principal;"/>
+ <method name="getPeerPrincipal()Ljava/security/Principal;"/>
+ <method name="getSSLSocketFactory()Ljavax/net/ssl/SSLSocketFactory;"/>
+ <method name="getServerCertificates()[Ljava/security/cert/Certificate;"/>
+ <method name="setDefaultHostnameVerifier(Ljavax/net/ssl/HostnameVerifier;)V"/>
+ <method name="setDefaultSSLSocketFactory(Ljavax/net/ssl/SSLSocketFactory;)V"/>
+ <method name="setHostnameVerifier(Ljavax/net/ssl/HostnameVerifier;)V"/>
+ <method name="setSSLSocketFactory(Ljavax/net/ssl/SSLSocketFactory;)V"/>
+ <field name="hostnameVerifier"/>
+ </class>
+ <class name="javax/net/ssl/KeyManager" since="1">
+ <extends name="java/lang/Object"/>
+ </class>
+ <class name="javax/net/ssl/KeyManagerFactory" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljavax/net/ssl/KeyManagerFactorySpi;Ljava/security/Provider;Ljava/lang/String;)V"/>
+ <method name="getAlgorithm()Ljava/lang/String;"/>
+ <method name="getDefaultAlgorithm()Ljava/lang/String;"/>
+ <method name="getInstance(Ljava/lang/String;)Ljavax/net/ssl/KeyManagerFactory;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/net/ssl/KeyManagerFactory;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/net/ssl/KeyManagerFactory;"/>
+ <method name="getKeyManagers()[Ljavax/net/ssl/KeyManager;"/>
+ <method name="getProvider()Ljava/security/Provider;"/>
+ <method name="init(Ljava/security/KeyStore;[C)V"/>
+ <method name="init(Ljavax/net/ssl/ManagerFactoryParameters;)V"/>
+ </class>
+ <class name="javax/net/ssl/KeyManagerFactorySpi" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="engineGetKeyManagers()[Ljavax/net/ssl/KeyManager;"/>
+ <method name="engineInit(Ljava/security/KeyStore;[C)V"/>
+ <method name="engineInit(Ljavax/net/ssl/ManagerFactoryParameters;)V"/>
+ </class>
+ <class name="javax/net/ssl/KeyStoreBuilderParameters" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="javax/net/ssl/ManagerFactoryParameters"/>
+ <method name="&lt;init>(Ljava/security/KeyStore$Builder;)V"/>
+ <method name="&lt;init>(Ljava/util/List;)V"/>
+ <method name="getParameters()Ljava/util/List;"/>
+ </class>
+ <class name="javax/net/ssl/ManagerFactoryParameters" since="1">
+ <extends name="java/lang/Object"/>
+ </class>
+ <class name="javax/net/ssl/SNIHostName" since="24">
+ <extends name="javax/net/ssl/SNIServerName"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>([B)V"/>
+ <method name="createSNIMatcher(Ljava/lang/String;)Ljavax/net/ssl/SNIMatcher;"/>
+ <method name="getAsciiName()Ljava/lang/String;"/>
+ </class>
+ <class name="javax/net/ssl/SNIMatcher" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="getType()I"/>
+ <method name="matches(Ljavax/net/ssl/SNIServerName;)Z"/>
+ </class>
+ <class name="javax/net/ssl/SNIServerName" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(I[B)V"/>
+ <method name="getEncoded()[B"/>
+ <method name="getType()I"/>
+ </class>
+ <class name="javax/net/ssl/SSLContext" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljavax/net/ssl/SSLContextSpi;Ljava/security/Provider;Ljava/lang/String;)V"/>
+ <method name="createSSLEngine()Ljavax/net/ssl/SSLEngine;"/>
+ <method name="createSSLEngine(Ljava/lang/String;I)Ljavax/net/ssl/SSLEngine;"/>
+ <method name="getClientSessionContext()Ljavax/net/ssl/SSLSessionContext;"/>
+ <method name="getDefault()Ljavax/net/ssl/SSLContext;" since="9"/>
+ <method name="getDefaultSSLParameters()Ljavax/net/ssl/SSLParameters;" since="9"/>
+ <method name="getInstance(Ljava/lang/String;)Ljavax/net/ssl/SSLContext;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/net/ssl/SSLContext;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/net/ssl/SSLContext;"/>
+ <method name="getProtocol()Ljava/lang/String;"/>
+ <method name="getProvider()Ljava/security/Provider;"/>
+ <method name="getServerSessionContext()Ljavax/net/ssl/SSLSessionContext;"/>
+ <method name="getServerSocketFactory()Ljavax/net/ssl/SSLServerSocketFactory;"/>
+ <method name="getSocketFactory()Ljavax/net/ssl/SSLSocketFactory;"/>
+ <method name="getSupportedSSLParameters()Ljavax/net/ssl/SSLParameters;" since="9"/>
+ <method name="init([Ljavax/net/ssl/KeyManager;[Ljavax/net/ssl/TrustManager;Ljava/security/SecureRandom;)V"/>
+ <method name="setDefault(Ljavax/net/ssl/SSLContext;)V" since="9"/>
+ </class>
+ <class name="javax/net/ssl/SSLContextSpi" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="engineCreateSSLEngine()Ljavax/net/ssl/SSLEngine;"/>
+ <method name="engineCreateSSLEngine(Ljava/lang/String;I)Ljavax/net/ssl/SSLEngine;"/>
+ <method name="engineGetClientSessionContext()Ljavax/net/ssl/SSLSessionContext;"/>
+ <method name="engineGetDefaultSSLParameters()Ljavax/net/ssl/SSLParameters;" since="9"/>
+ <method name="engineGetServerSessionContext()Ljavax/net/ssl/SSLSessionContext;"/>
+ <method name="engineGetServerSocketFactory()Ljavax/net/ssl/SSLServerSocketFactory;"/>
+ <method name="engineGetSocketFactory()Ljavax/net/ssl/SSLSocketFactory;"/>
+ <method name="engineGetSupportedSSLParameters()Ljavax/net/ssl/SSLParameters;" since="9"/>
+ <method name="engineInit([Ljavax/net/ssl/KeyManager;[Ljavax/net/ssl/TrustManager;Ljava/security/SecureRandom;)V"/>
+ </class>
+ <class name="javax/net/ssl/SSLEngine" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="beginHandshake()V"/>
+ <method name="closeInbound()V"/>
+ <method name="closeOutbound()V"/>
+ <method name="getDelegatedTask()Ljava/lang/Runnable;"/>
+ <method name="getEnableSessionCreation()Z"/>
+ <method name="getEnabledCipherSuites()[Ljava/lang/String;"/>
+ <method name="getEnabledProtocols()[Ljava/lang/String;"/>
+ <method name="getHandshakeSession()Ljavax/net/ssl/SSLSession;" since="24"/>
+ <method name="getHandshakeStatus()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;"/>
+ <method name="getNeedClientAuth()Z"/>
+ <method name="getPeerHost()Ljava/lang/String;"/>
+ <method name="getPeerPort()I"/>
+ <method name="getSSLParameters()Ljavax/net/ssl/SSLParameters;" since="9"/>
+ <method name="getSession()Ljavax/net/ssl/SSLSession;"/>
+ <method name="getSupportedCipherSuites()[Ljava/lang/String;"/>
+ <method name="getSupportedProtocols()[Ljava/lang/String;"/>
+ <method name="getUseClientMode()Z"/>
+ <method name="getWantClientAuth()Z"/>
+ <method name="isInboundDone()Z"/>
+ <method name="isOutboundDone()Z"/>
+ <method name="setEnableSessionCreation(Z)V"/>
+ <method name="setEnabledCipherSuites([Ljava/lang/String;)V"/>
+ <method name="setEnabledProtocols([Ljava/lang/String;)V"/>
+ <method name="setNeedClientAuth(Z)V"/>
+ <method name="setSSLParameters(Ljavax/net/ssl/SSLParameters;)V" since="9"/>
+ <method name="setUseClientMode(Z)V"/>
+ <method name="setWantClientAuth(Z)V"/>
+ <method name="unwrap(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult;"/>
+ <method name="unwrap(Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult;"/>
+ <method name="unwrap(Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;II)Ljavax/net/ssl/SSLEngineResult;"/>
+ <method name="wrap(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult;"/>
+ <method name="wrap([Ljava/nio/ByteBuffer;IILjava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult;"/>
+ <method name="wrap([Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult;"/>
+ </class>
+ <class name="javax/net/ssl/SSLEngineResult" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljavax/net/ssl/SSLEngineResult$Status;Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;II)V"/>
+ <method name="bytesConsumed()I"/>
+ <method name="bytesProduced()I"/>
+ <method name="getHandshakeStatus()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;"/>
+ <method name="getStatus()Ljavax/net/ssl/SSLEngineResult$Status;"/>
+ </class>
+ <class name="javax/net/ssl/SSLEngineResult$HandshakeStatus" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;"/>
+ <method name="values()[Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;"/>
+ <field name="FINISHED"/>
+ <field name="NEED_TASK"/>
+ <field name="NEED_UNWRAP"/>
+ <field name="NEED_WRAP"/>
+ <field name="NOT_HANDSHAKING"/>
+ </class>
+ <class name="javax/net/ssl/SSLEngineResult$Status" since="1">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Ljavax/net/ssl/SSLEngineResult$Status;"/>
+ <method name="values()[Ljavax/net/ssl/SSLEngineResult$Status;"/>
+ <field name="BUFFER_OVERFLOW"/>
+ <field name="BUFFER_UNDERFLOW"/>
+ <field name="CLOSED"/>
+ <field name="OK"/>
+ </class>
+ <class name="javax/net/ssl/SSLException" since="1">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="javax/net/ssl/SSLHandshakeException" since="1">
+ <extends name="javax/net/ssl/SSLException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="javax/net/ssl/SSLKeyException" since="1">
+ <extends name="javax/net/ssl/SSLException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="javax/net/ssl/SSLParameters" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>([Ljava/lang/String;)V"/>
+ <method name="&lt;init>([Ljava/lang/String;[Ljava/lang/String;)V"/>
+ <method name="getAlgorithmConstraints()Ljava/security/AlgorithmConstraints;" since="24"/>
+ <method name="getCipherSuites()[Ljava/lang/String;"/>
+ <method name="getEndpointIdentificationAlgorithm()Ljava/lang/String;" since="24"/>
+ <method name="getNeedClientAuth()Z"/>
+ <method name="getProtocols()[Ljava/lang/String;"/>
+ <method name="getSNIMatchers()Ljava/util/Collection;" since="24"/>
+ <method name="getServerNames()Ljava/util/List;" since="24"/>
+ <method name="getUseCipherSuitesOrder()Z" since="24"/>
+ <method name="getWantClientAuth()Z"/>
+ <method name="setAlgorithmConstraints(Ljava/security/AlgorithmConstraints;)V" since="24"/>
+ <method name="setCipherSuites([Ljava/lang/String;)V"/>
+ <method name="setEndpointIdentificationAlgorithm(Ljava/lang/String;)V" since="24"/>
+ <method name="setNeedClientAuth(Z)V"/>
+ <method name="setProtocols([Ljava/lang/String;)V"/>
+ <method name="setSNIMatchers(Ljava/util/Collection;)V" since="24"/>
+ <method name="setServerNames(Ljava/util/List;)V" since="24"/>
+ <method name="setUseCipherSuitesOrder(Z)V" since="24"/>
+ <method name="setWantClientAuth(Z)V"/>
+ </class>
+ <class name="javax/net/ssl/SSLPeerUnverifiedException" since="1">
+ <extends name="javax/net/ssl/SSLException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="javax/net/ssl/SSLPermission" since="1">
+ <extends name="java/security/BasicPermission"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="javax/net/ssl/SSLProtocolException" since="1">
+ <extends name="javax/net/ssl/SSLException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="javax/net/ssl/SSLServerSocket" since="1">
+ <extends name="java/net/ServerSocket"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="&lt;init>(IILjava/net/InetAddress;)V"/>
+ <method name="getEnableSessionCreation()Z"/>
+ <method name="getEnabledCipherSuites()[Ljava/lang/String;"/>
+ <method name="getEnabledProtocols()[Ljava/lang/String;"/>
+ <method name="getNeedClientAuth()Z"/>
+ <method name="getSSLParameters()Ljavax/net/ssl/SSLParameters;" since="24"/>
+ <method name="getSupportedCipherSuites()[Ljava/lang/String;"/>
+ <method name="getSupportedProtocols()[Ljava/lang/String;"/>
+ <method name="getUseClientMode()Z"/>
+ <method name="getWantClientAuth()Z"/>
+ <method name="setEnableSessionCreation(Z)V"/>
+ <method name="setEnabledCipherSuites([Ljava/lang/String;)V"/>
+ <method name="setEnabledProtocols([Ljava/lang/String;)V"/>
+ <method name="setNeedClientAuth(Z)V"/>
+ <method name="setSSLParameters(Ljavax/net/ssl/SSLParameters;)V" since="24"/>
+ <method name="setUseClientMode(Z)V"/>
+ <method name="setWantClientAuth(Z)V"/>
+ </class>
+ <class name="javax/net/ssl/SSLServerSocketFactory" since="1">
+ <extends name="javax/net/ServerSocketFactory"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDefaultCipherSuites()[Ljava/lang/String;"/>
+ <method name="getSupportedCipherSuites()[Ljava/lang/String;"/>
+ </class>
+ <class name="javax/net/ssl/SSLSession" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getApplicationBufferSize()I"/>
+ <method name="getCipherSuite()Ljava/lang/String;"/>
+ <method name="getCreationTime()J"/>
+ <method name="getId()[B"/>
+ <method name="getLastAccessedTime()J"/>
+ <method name="getLocalCertificates()[Ljava/security/cert/Certificate;"/>
+ <method name="getLocalPrincipal()Ljava/security/Principal;"/>
+ <method name="getPacketBufferSize()I"/>
+ <method name="getPeerCertificateChain()[Ljavax/security/cert/X509Certificate;"/>
+ <method name="getPeerCertificates()[Ljava/security/cert/Certificate;"/>
+ <method name="getPeerHost()Ljava/lang/String;"/>
+ <method name="getPeerPort()I"/>
+ <method name="getPeerPrincipal()Ljava/security/Principal;"/>
+ <method name="getProtocol()Ljava/lang/String;"/>
+ <method name="getSessionContext()Ljavax/net/ssl/SSLSessionContext;"/>
+ <method name="getValue(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="getValueNames()[Ljava/lang/String;"/>
+ <method name="invalidate()V"/>
+ <method name="isValid()Z"/>
+ <method name="putValue(Ljava/lang/String;Ljava/lang/Object;)V"/>
+ <method name="removeValue(Ljava/lang/String;)V"/>
+ </class>
+ <class name="javax/net/ssl/SSLSessionBindingEvent" since="1">
+ <extends name="java/util/EventObject"/>
+ <method name="&lt;init>(Ljavax/net/ssl/SSLSession;Ljava/lang/String;)V"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getSession()Ljavax/net/ssl/SSLSession;"/>
+ </class>
+ <class name="javax/net/ssl/SSLSessionBindingListener" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/EventListener"/>
+ <method name="valueBound(Ljavax/net/ssl/SSLSessionBindingEvent;)V"/>
+ <method name="valueUnbound(Ljavax/net/ssl/SSLSessionBindingEvent;)V"/>
+ </class>
+ <class name="javax/net/ssl/SSLSessionContext" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getIds()Ljava/util/Enumeration;"/>
+ <method name="getSession([B)Ljavax/net/ssl/SSLSession;"/>
+ <method name="getSessionCacheSize()I"/>
+ <method name="getSessionTimeout()I"/>
+ <method name="setSessionCacheSize(I)V"/>
+ <method name="setSessionTimeout(I)V"/>
+ </class>
+ <class name="javax/net/ssl/SSLSocket" since="1">
+ <extends name="java/net/Socket"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;ILjava/net/InetAddress;I)V"/>
+ <method name="&lt;init>(Ljava/net/InetAddress;I)V"/>
+ <method name="&lt;init>(Ljava/net/InetAddress;ILjava/net/InetAddress;I)V"/>
+ <method name="addHandshakeCompletedListener(Ljavax/net/ssl/HandshakeCompletedListener;)V"/>
+ <method name="getEnableSessionCreation()Z"/>
+ <method name="getEnabledCipherSuites()[Ljava/lang/String;"/>
+ <method name="getEnabledProtocols()[Ljava/lang/String;"/>
+ <method name="getHandshakeSession()Ljavax/net/ssl/SSLSession;" since="24"/>
+ <method name="getNeedClientAuth()Z"/>
+ <method name="getSSLParameters()Ljavax/net/ssl/SSLParameters;" since="9"/>
+ <method name="getSession()Ljavax/net/ssl/SSLSession;"/>
+ <method name="getSupportedCipherSuites()[Ljava/lang/String;"/>
+ <method name="getSupportedProtocols()[Ljava/lang/String;"/>
+ <method name="getUseClientMode()Z"/>
+ <method name="getWantClientAuth()Z"/>
+ <method name="removeHandshakeCompletedListener(Ljavax/net/ssl/HandshakeCompletedListener;)V"/>
+ <method name="setEnableSessionCreation(Z)V"/>
+ <method name="setEnabledCipherSuites([Ljava/lang/String;)V"/>
+ <method name="setEnabledProtocols([Ljava/lang/String;)V"/>
+ <method name="setNeedClientAuth(Z)V"/>
+ <method name="setSSLParameters(Ljavax/net/ssl/SSLParameters;)V" since="9"/>
+ <method name="setUseClientMode(Z)V"/>
+ <method name="setWantClientAuth(Z)V"/>
+ <method name="startHandshake()V"/>
+ </class>
+ <class name="javax/net/ssl/SSLSocketFactory" since="1">
+ <extends name="javax/net/SocketFactory"/>
+ <method name="&lt;init>()V"/>
+ <method name="createSocket(Ljava/net/Socket;Ljava/lang/String;IZ)Ljava/net/Socket;"/>
+ <method name="getDefaultCipherSuites()[Ljava/lang/String;"/>
+ <method name="getSupportedCipherSuites()[Ljava/lang/String;"/>
+ </class>
+ <class name="javax/net/ssl/StandardConstants" since="24">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="SNI_HOST_NAME"/>
+ </class>
+ <class name="javax/net/ssl/TrustManager" since="1">
+ <extends name="java/lang/Object"/>
+ </class>
+ <class name="javax/net/ssl/TrustManagerFactory" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljavax/net/ssl/TrustManagerFactorySpi;Ljava/security/Provider;Ljava/lang/String;)V"/>
+ <method name="getAlgorithm()Ljava/lang/String;"/>
+ <method name="getDefaultAlgorithm()Ljava/lang/String;"/>
+ <method name="getInstance(Ljava/lang/String;)Ljavax/net/ssl/TrustManagerFactory;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/net/ssl/TrustManagerFactory;"/>
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/net/ssl/TrustManagerFactory;"/>
+ <method name="getProvider()Ljava/security/Provider;"/>
+ <method name="getTrustManagers()[Ljavax/net/ssl/TrustManager;"/>
+ <method name="init(Ljava/security/KeyStore;)V"/>
+ <method name="init(Ljavax/net/ssl/ManagerFactoryParameters;)V"/>
+ </class>
+ <class name="javax/net/ssl/TrustManagerFactorySpi" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="engineGetTrustManagers()[Ljavax/net/ssl/TrustManager;"/>
+ <method name="engineInit(Ljava/security/KeyStore;)V"/>
+ <method name="engineInit(Ljavax/net/ssl/ManagerFactoryParameters;)V"/>
+ </class>
+ <class name="javax/net/ssl/X509ExtendedKeyManager" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="javax/net/ssl/X509KeyManager"/>
+ <method name="&lt;init>()V"/>
+ <method name="chooseEngineClientAlias([Ljava/lang/String;[Ljava/security/Principal;Ljavax/net/ssl/SSLEngine;)Ljava/lang/String;"/>
+ <method name="chooseEngineServerAlias(Ljava/lang/String;[Ljava/security/Principal;Ljavax/net/ssl/SSLEngine;)Ljava/lang/String;"/>
+ </class>
+ <class name="javax/net/ssl/X509ExtendedTrustManager" since="24">
+ <extends name="java/lang/Object"/>
+ <implements name="javax/net/ssl/X509TrustManager"/>
+ <method name="&lt;init>()V"/>
+ <method name="checkClientTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljava/net/Socket;)V"/>
+ <method name="checkClientTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljavax/net/ssl/SSLEngine;)V"/>
+ <method name="checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljava/net/Socket;)V"/>
+ <method name="checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljavax/net/ssl/SSLEngine;)V"/>
+ </class>
+ <class name="javax/net/ssl/X509KeyManager" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="javax/net/ssl/KeyManager"/>
+ <method name="chooseClientAlias([Ljava/lang/String;[Ljava/security/Principal;Ljava/net/Socket;)Ljava/lang/String;"/>
+ <method name="chooseServerAlias(Ljava/lang/String;[Ljava/security/Principal;Ljava/net/Socket;)Ljava/lang/String;"/>
+ <method name="getCertificateChain(Ljava/lang/String;)[Ljava/security/cert/X509Certificate;"/>
+ <method name="getClientAliases(Ljava/lang/String;[Ljava/security/Principal;)[Ljava/lang/String;"/>
+ <method name="getPrivateKey(Ljava/lang/String;)Ljava/security/PrivateKey;"/>
+ <method name="getServerAliases(Ljava/lang/String;[Ljava/security/Principal;)[Ljava/lang/String;"/>
+ </class>
+ <class name="javax/net/ssl/X509TrustManager" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="javax/net/ssl/TrustManager"/>
+ <method name="checkClientTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;)V"/>
+ <method name="checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;)V"/>
+ <method name="getAcceptedIssuers()[Ljava/security/cert/X509Certificate;"/>
+ </class>
+ <class name="javax/security/auth/AuthPermission" since="1">
+ <extends name="java/security/BasicPermission"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="javax/security/auth/DestroyFailedException" since="1">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="javax/security/auth/Destroyable" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="destroy()V"/>
+ <method name="isDestroyed()Z"/>
+ </class>
+ <class name="javax/security/auth/PrivateCredentialPermission" since="1">
+ <extends name="java/security/Permission"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="getCredentialClass()Ljava/lang/String;"/>
+ <method name="getPrincipals()[[Ljava/lang/String;"/>
+ </class>
+ <class name="javax/security/auth/Subject" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(ZLjava/util/Set;Ljava/util/Set;Ljava/util/Set;)V"/>
+ <method name="doAs(Ljavax/security/auth/Subject;Ljava/security/PrivilegedAction;)Ljava/lang/Object;"/>
+ <method name="doAs(Ljavax/security/auth/Subject;Ljava/security/PrivilegedExceptionAction;)Ljava/lang/Object;"/>
+ <method name="doAsPrivileged(Ljavax/security/auth/Subject;Ljava/security/PrivilegedAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;"/>
+ <method name="doAsPrivileged(Ljavax/security/auth/Subject;Ljava/security/PrivilegedExceptionAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;"/>
+ <method name="getPrincipals()Ljava/util/Set;"/>
+ <method name="getPrincipals(Ljava/lang/Class;)Ljava/util/Set;"/>
+ <method name="getPrivateCredentials()Ljava/util/Set;"/>
+ <method name="getPrivateCredentials(Ljava/lang/Class;)Ljava/util/Set;"/>
+ <method name="getPublicCredentials()Ljava/util/Set;"/>
+ <method name="getPublicCredentials(Ljava/lang/Class;)Ljava/util/Set;"/>
+ <method name="getSubject(Ljava/security/AccessControlContext;)Ljavax/security/auth/Subject;"/>
+ <method name="isReadOnly()Z"/>
+ <method name="setReadOnly()V"/>
+ </class>
+ <class name="javax/security/auth/SubjectDomainCombiner" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/DomainCombiner"/>
+ <method name="&lt;init>(Ljavax/security/auth/Subject;)V"/>
+ <method name="getSubject()Ljavax/security/auth/Subject;"/>
+ </class>
+ <class name="javax/security/auth/callback/Callback" since="1">
+ <extends name="java/lang/Object"/>
+ </class>
+ <class name="javax/security/auth/callback/CallbackHandler" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="handle([Ljavax/security/auth/callback/Callback;)V"/>
+ </class>
+ <class name="javax/security/auth/callback/PasswordCallback" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="javax/security/auth/callback/Callback"/>
+ <method name="&lt;init>(Ljava/lang/String;Z)V"/>
+ <method name="clearPassword()V"/>
+ <method name="getPassword()[C"/>
+ <method name="getPrompt()Ljava/lang/String;"/>
+ <method name="isEchoOn()Z"/>
+ <method name="setPassword([C)V"/>
+ </class>
+ <class name="javax/security/auth/callback/UnsupportedCallbackException" since="1">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>(Ljavax/security/auth/callback/Callback;)V"/>
+ <method name="&lt;init>(Ljavax/security/auth/callback/Callback;Ljava/lang/String;)V"/>
+ <method name="getCallback()Ljavax/security/auth/callback/Callback;"/>
+ </class>
+ <class name="javax/security/auth/login/LoginException" since="1">
+ <extends name="java/security/GeneralSecurityException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="javax/security/auth/x500/X500Principal" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/security/Principal"/>
+ <method name="&lt;init>(Ljava/io/InputStream;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/util/Map;)V" since="9"/>
+ <method name="&lt;init>([B)V"/>
+ <method name="getEncoded()[B"/>
+ <method name="getName(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getName(Ljava/lang/String;Ljava/util/Map;)Ljava/lang/String;" since="9"/>
+ <field name="CANONICAL"/>
+ <field name="RFC1779"/>
+ <field name="RFC2253"/>
+ </class>
+ <class name="javax/security/cert/Certificate" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getEncoded()[B"/>
+ <method name="getPublicKey()Ljava/security/PublicKey;"/>
+ <method name="verify(Ljava/security/PublicKey;)V"/>
+ <method name="verify(Ljava/security/PublicKey;Ljava/lang/String;)V"/>
+ </class>
+ <class name="javax/security/cert/CertificateEncodingException" since="1">
+ <extends name="javax/security/cert/CertificateException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="javax/security/cert/CertificateException" since="1">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="javax/security/cert/CertificateExpiredException" since="1">
+ <extends name="javax/security/cert/CertificateException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="javax/security/cert/CertificateNotYetValidException" since="1">
+ <extends name="javax/security/cert/CertificateException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="javax/security/cert/CertificateParsingException" since="1">
+ <extends name="javax/security/cert/CertificateException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="javax/security/cert/X509Certificate" since="1">
+ <extends name="javax/security/cert/Certificate"/>
+ <method name="&lt;init>()V"/>
+ <method name="checkValidity()V"/>
+ <method name="checkValidity(Ljava/util/Date;)V"/>
+ <method name="getInstance(Ljava/io/InputStream;)Ljavax/security/cert/X509Certificate;"/>
+ <method name="getInstance([B)Ljavax/security/cert/X509Certificate;"/>
+ <method name="getIssuerDN()Ljava/security/Principal;"/>
+ <method name="getNotAfter()Ljava/util/Date;"/>
+ <method name="getNotBefore()Ljava/util/Date;"/>
+ <method name="getSerialNumber()Ljava/math/BigInteger;"/>
+ <method name="getSigAlgName()Ljava/lang/String;"/>
+ <method name="getSigAlgOID()Ljava/lang/String;"/>
+ <method name="getSigAlgParams()[B"/>
+ <method name="getSubjectDN()Ljava/security/Principal;"/>
+ <method name="getVersion()I"/>
+ </class>
+ <class name="javax/sql/CommonDataSource" since="9">
+ <extends name="java/lang/Object"/>
+ <method name="getLogWriter()Ljava/io/PrintWriter;"/>
+ <method name="getLoginTimeout()I"/>
+ <method name="getParentLogger()Ljava/util/logging/Logger;" since="24"/>
+ <method name="setLogWriter(Ljava/io/PrintWriter;)V"/>
+ <method name="setLoginTimeout(I)V"/>
+ </class>
+ <class name="javax/sql/ConnectionEvent" since="1">
+ <extends name="java/util/EventObject"/>
+ <method name="&lt;init>(Ljavax/sql/PooledConnection;)V"/>
+ <method name="&lt;init>(Ljavax/sql/PooledConnection;Ljava/sql/SQLException;)V"/>
+ <method name="getSQLException()Ljava/sql/SQLException;"/>
+ </class>
+ <class name="javax/sql/ConnectionEventListener" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/EventListener"/>
+ <method name="connectionClosed(Ljavax/sql/ConnectionEvent;)V"/>
+ <method name="connectionErrorOccurred(Ljavax/sql/ConnectionEvent;)V"/>
+ </class>
+ <class name="javax/sql/ConnectionPoolDataSource" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="javax/sql/CommonDataSource" since="9"/>
+ <method name="getLogWriter()Ljava/io/PrintWriter;" removed="9"/>
+ <method name="getLoginTimeout()I" removed="9"/>
+ <method name="getPooledConnection()Ljavax/sql/PooledConnection;"/>
+ <method name="getPooledConnection(Ljava/lang/String;Ljava/lang/String;)Ljavax/sql/PooledConnection;"/>
+ <method name="setLogWriter(Ljava/io/PrintWriter;)V" removed="9"/>
+ <method name="setLoginTimeout(I)V" removed="9"/>
+ </class>
+ <class name="javax/sql/DataSource" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/sql/Wrapper" since="9"/>
+ <implements name="javax/sql/CommonDataSource" since="9"/>
+ <method name="getConnection()Ljava/sql/Connection;"/>
+ <method name="getConnection(Ljava/lang/String;Ljava/lang/String;)Ljava/sql/Connection;"/>
+ <method name="getLogWriter()Ljava/io/PrintWriter;" removed="9"/>
+ <method name="getLoginTimeout()I" removed="9"/>
+ <method name="setLogWriter(Ljava/io/PrintWriter;)V" removed="9"/>
+ <method name="setLoginTimeout(I)V" removed="9"/>
+ </class>
+ <class name="javax/sql/PooledConnection" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="addConnectionEventListener(Ljavax/sql/ConnectionEventListener;)V"/>
+ <method name="addStatementEventListener(Ljavax/sql/StatementEventListener;)V" since="9"/>
+ <method name="close()V"/>
+ <method name="getConnection()Ljava/sql/Connection;"/>
+ <method name="removeConnectionEventListener(Ljavax/sql/ConnectionEventListener;)V"/>
+ <method name="removeStatementEventListener(Ljavax/sql/StatementEventListener;)V" since="9"/>
+ </class>
+ <class name="javax/sql/RowSet" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/sql/ResultSet"/>
+ <method name="addRowSetListener(Ljavax/sql/RowSetListener;)V"/>
+ <method name="clearParameters()V"/>
+ <method name="execute()V"/>
+ <method name="getCommand()Ljava/lang/String;"/>
+ <method name="getDataSourceName()Ljava/lang/String;"/>
+ <method name="getEscapeProcessing()Z"/>
+ <method name="getMaxFieldSize()I"/>
+ <method name="getMaxRows()I"/>
+ <method name="getPassword()Ljava/lang/String;"/>
+ <method name="getQueryTimeout()I"/>
+ <method name="getTransactionIsolation()I"/>
+ <method name="getTypeMap()Ljava/util/Map;"/>
+ <method name="getUrl()Ljava/lang/String;"/>
+ <method name="getUsername()Ljava/lang/String;"/>
+ <method name="isReadOnly()Z"/>
+ <method name="removeRowSetListener(Ljavax/sql/RowSetListener;)V"/>
+ <method name="setArray(ILjava/sql/Array;)V"/>
+ <method name="setAsciiStream(ILjava/io/InputStream;)V" since="9"/>
+ <method name="setAsciiStream(ILjava/io/InputStream;I)V"/>
+ <method name="setAsciiStream(Ljava/lang/String;Ljava/io/InputStream;)V" since="9"/>
+ <method name="setAsciiStream(Ljava/lang/String;Ljava/io/InputStream;I)V" since="9"/>
+ <method name="setBigDecimal(ILjava/math/BigDecimal;)V"/>
+ <method name="setBigDecimal(Ljava/lang/String;Ljava/math/BigDecimal;)V" since="9"/>
+ <method name="setBinaryStream(ILjava/io/InputStream;)V" since="9"/>
+ <method name="setBinaryStream(ILjava/io/InputStream;I)V"/>
+ <method name="setBinaryStream(Ljava/lang/String;Ljava/io/InputStream;)V" since="9"/>
+ <method name="setBinaryStream(Ljava/lang/String;Ljava/io/InputStream;I)V" since="9"/>
+ <method name="setBlob(ILjava/io/InputStream;)V" since="9"/>
+ <method name="setBlob(ILjava/io/InputStream;J)V" since="9"/>
+ <method name="setBlob(ILjava/sql/Blob;)V"/>
+ <method name="setBlob(Ljava/lang/String;Ljava/io/InputStream;)V" since="9"/>
+ <method name="setBlob(Ljava/lang/String;Ljava/io/InputStream;J)V" since="9"/>
+ <method name="setBlob(Ljava/lang/String;Ljava/sql/Blob;)V" since="9"/>
+ <method name="setBoolean(IZ)V"/>
+ <method name="setBoolean(Ljava/lang/String;Z)V" since="9"/>
+ <method name="setByte(IB)V"/>
+ <method name="setByte(Ljava/lang/String;B)V" since="9"/>
+ <method name="setBytes(I[B)V"/>
+ <method name="setBytes(Ljava/lang/String;[B)V" since="9"/>
+ <method name="setCharacterStream(ILjava/io/Reader;)V" since="9"/>
+ <method name="setCharacterStream(ILjava/io/Reader;I)V"/>
+ <method name="setCharacterStream(Ljava/lang/String;Ljava/io/Reader;)V" since="9"/>
+ <method name="setCharacterStream(Ljava/lang/String;Ljava/io/Reader;I)V" since="9"/>
+ <method name="setClob(ILjava/io/Reader;)V" since="9"/>
+ <method name="setClob(ILjava/io/Reader;J)V" since="9"/>
+ <method name="setClob(ILjava/sql/Clob;)V"/>
+ <method name="setClob(Ljava/lang/String;Ljava/io/Reader;)V" since="9"/>
+ <method name="setClob(Ljava/lang/String;Ljava/io/Reader;J)V" since="9"/>
+ <method name="setClob(Ljava/lang/String;Ljava/sql/Clob;)V" since="9"/>
+ <method name="setCommand(Ljava/lang/String;)V"/>
+ <method name="setConcurrency(I)V"/>
+ <method name="setDataSourceName(Ljava/lang/String;)V"/>
+ <method name="setDate(ILjava/sql/Date;)V"/>
+ <method name="setDate(ILjava/sql/Date;Ljava/util/Calendar;)V"/>
+ <method name="setDate(Ljava/lang/String;Ljava/sql/Date;)V" since="9"/>
+ <method name="setDate(Ljava/lang/String;Ljava/sql/Date;Ljava/util/Calendar;)V" since="9"/>
+ <method name="setDouble(ID)V"/>
+ <method name="setDouble(Ljava/lang/String;D)V" since="9"/>
+ <method name="setEscapeProcessing(Z)V"/>
+ <method name="setFloat(IF)V"/>
+ <method name="setFloat(Ljava/lang/String;F)V" since="9"/>
+ <method name="setInt(II)V"/>
+ <method name="setInt(Ljava/lang/String;I)V" since="9"/>
+ <method name="setLong(IJ)V"/>
+ <method name="setLong(Ljava/lang/String;J)V" since="9"/>
+ <method name="setMaxFieldSize(I)V"/>
+ <method name="setMaxRows(I)V"/>
+ <method name="setNCharacterStream(ILjava/io/Reader;)V" since="9"/>
+ <method name="setNCharacterStream(ILjava/io/Reader;J)V" since="9"/>
+ <method name="setNCharacterStream(Ljava/lang/String;Ljava/io/Reader;)V" since="9"/>
+ <method name="setNCharacterStream(Ljava/lang/String;Ljava/io/Reader;J)V" since="9"/>
+ <method name="setNClob(ILjava/io/Reader;)V" since="9"/>
+ <method name="setNClob(ILjava/io/Reader;J)V" since="9"/>
+ <method name="setNClob(ILjava/sql/NClob;)V" since="9"/>
+ <method name="setNClob(Ljava/lang/String;Ljava/io/Reader;)V" since="9"/>
+ <method name="setNClob(Ljava/lang/String;Ljava/io/Reader;J)V" since="9"/>
+ <method name="setNClob(Ljava/lang/String;Ljava/sql/NClob;)V" since="9"/>
+ <method name="setNString(ILjava/lang/String;)V" since="9"/>
+ <method name="setNString(Ljava/lang/String;Ljava/lang/String;)V" since="9"/>
+ <method name="setNull(II)V"/>
+ <method name="setNull(IILjava/lang/String;)V"/>
+ <method name="setNull(Ljava/lang/String;I)V" since="9"/>
+ <method name="setNull(Ljava/lang/String;ILjava/lang/String;)V" since="9"/>
+ <method name="setObject(ILjava/lang/Object;)V"/>
+ <method name="setObject(ILjava/lang/Object;I)V"/>
+ <method name="setObject(ILjava/lang/Object;II)V"/>
+ <method name="setObject(Ljava/lang/String;Ljava/lang/Object;)V" since="9"/>
+ <method name="setObject(Ljava/lang/String;Ljava/lang/Object;I)V" since="9"/>
+ <method name="setObject(Ljava/lang/String;Ljava/lang/Object;II)V" since="9"/>
+ <method name="setPassword(Ljava/lang/String;)V"/>
+ <method name="setQueryTimeout(I)V"/>
+ <method name="setReadOnly(Z)V"/>
+ <method name="setRef(ILjava/sql/Ref;)V"/>
+ <method name="setRowId(ILjava/sql/RowId;)V" since="9"/>
+ <method name="setRowId(Ljava/lang/String;Ljava/sql/RowId;)V" since="9"/>
+ <method name="setSQLXML(ILjava/sql/SQLXML;)V" since="9"/>
+ <method name="setSQLXML(Ljava/lang/String;Ljava/sql/SQLXML;)V" since="9"/>
+ <method name="setShort(IS)V"/>
+ <method name="setShort(Ljava/lang/String;S)V" since="9"/>
+ <method name="setString(ILjava/lang/String;)V"/>
+ <method name="setString(Ljava/lang/String;Ljava/lang/String;)V" since="9"/>
+ <method name="setTime(ILjava/sql/Time;)V"/>
+ <method name="setTime(ILjava/sql/Time;Ljava/util/Calendar;)V"/>
+ <method name="setTime(Ljava/lang/String;Ljava/sql/Time;)V" since="9"/>
+ <method name="setTime(Ljava/lang/String;Ljava/sql/Time;Ljava/util/Calendar;)V" since="9"/>
+ <method name="setTimestamp(ILjava/sql/Timestamp;)V"/>
+ <method name="setTimestamp(ILjava/sql/Timestamp;Ljava/util/Calendar;)V"/>
+ <method name="setTimestamp(Ljava/lang/String;Ljava/sql/Timestamp;)V" since="9"/>
+ <method name="setTimestamp(Ljava/lang/String;Ljava/sql/Timestamp;Ljava/util/Calendar;)V" since="9"/>
+ <method name="setTransactionIsolation(I)V"/>
+ <method name="setType(I)V"/>
+ <method name="setTypeMap(Ljava/util/Map;)V"/>
+ <method name="setURL(ILjava/net/URL;)V" since="9"/>
+ <method name="setUrl(Ljava/lang/String;)V"/>
+ <method name="setUsername(Ljava/lang/String;)V"/>
+ </class>
+ <class name="javax/sql/RowSetEvent" since="1">
+ <extends name="java/util/EventObject"/>
+ <method name="&lt;init>(Ljavax/sql/RowSet;)V"/>
+ </class>
+ <class name="javax/sql/RowSetInternal" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getConnection()Ljava/sql/Connection;"/>
+ <method name="getOriginal()Ljava/sql/ResultSet;"/>
+ <method name="getOriginalRow()Ljava/sql/ResultSet;"/>
+ <method name="getParams()[Ljava/lang/Object;"/>
+ <method name="setMetaData(Ljavax/sql/RowSetMetaData;)V"/>
+ </class>
+ <class name="javax/sql/RowSetListener" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/EventListener"/>
+ <method name="cursorMoved(Ljavax/sql/RowSetEvent;)V"/>
+ <method name="rowChanged(Ljavax/sql/RowSetEvent;)V"/>
+ <method name="rowSetChanged(Ljavax/sql/RowSetEvent;)V"/>
+ </class>
+ <class name="javax/sql/RowSetMetaData" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="java/sql/ResultSetMetaData"/>
+ <method name="setAutoIncrement(IZ)V"/>
+ <method name="setCaseSensitive(IZ)V"/>
+ <method name="setCatalogName(ILjava/lang/String;)V"/>
+ <method name="setColumnCount(I)V"/>
+ <method name="setColumnDisplaySize(II)V"/>
+ <method name="setColumnLabel(ILjava/lang/String;)V"/>
+ <method name="setColumnName(ILjava/lang/String;)V"/>
+ <method name="setColumnType(II)V"/>
+ <method name="setColumnTypeName(ILjava/lang/String;)V"/>
+ <method name="setCurrency(IZ)V"/>
+ <method name="setNullable(II)V"/>
+ <method name="setPrecision(II)V"/>
+ <method name="setScale(II)V"/>
+ <method name="setSchemaName(ILjava/lang/String;)V"/>
+ <method name="setSearchable(IZ)V"/>
+ <method name="setSigned(IZ)V"/>
+ <method name="setTableName(ILjava/lang/String;)V"/>
+ </class>
+ <class name="javax/sql/RowSetReader" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="readData(Ljavax/sql/RowSetInternal;)V"/>
+ </class>
+ <class name="javax/sql/RowSetWriter" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="writeData(Ljavax/sql/RowSetInternal;)Z"/>
+ </class>
+ <class name="javax/sql/StatementEvent" since="9">
+ <extends name="java/util/EventObject"/>
+ <method name="&lt;init>(Ljavax/sql/PooledConnection;Ljava/sql/PreparedStatement;)V"/>
+ <method name="&lt;init>(Ljavax/sql/PooledConnection;Ljava/sql/PreparedStatement;Ljava/sql/SQLException;)V"/>
+ <method name="getSQLException()Ljava/sql/SQLException;"/>
+ <method name="getStatement()Ljava/sql/PreparedStatement;"/>
+ </class>
+ <class name="javax/sql/StatementEventListener" since="9">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/EventListener"/>
+ <method name="statementClosed(Ljavax/sql/StatementEvent;)V"/>
+ <method name="statementErrorOccurred(Ljavax/sql/StatementEvent;)V"/>
+ </class>
+ <class name="javax/xml/XMLConstants" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="DEFAULT_NS_PREFIX"/>
+ <field name="FEATURE_SECURE_PROCESSING"/>
+ <field name="NULL_NS_URI"/>
+ <field name="RELAXNG_NS_URI"/>
+ <field name="W3C_XML_SCHEMA_INSTANCE_NS_URI"/>
+ <field name="W3C_XML_SCHEMA_NS_URI"/>
+ <field name="W3C_XPATH_DATATYPE_NS_URI"/>
+ <field name="XMLNS_ATTRIBUTE"/>
+ <field name="XMLNS_ATTRIBUTE_NS_URI"/>
+ <field name="XML_DTD_NS_URI"/>
+ <field name="XML_NS_PREFIX"/>
+ <field name="XML_NS_URI"/>
+ </class>
+ <class name="javax/xml/datatype/DatatypeConfigurationException" since="8">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="javax/xml/datatype/DatatypeConstants" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="APRIL"/>
+ <field name="AUGUST"/>
+ <field name="DATE"/>
+ <field name="DATETIME"/>
+ <field name="DAYS"/>
+ <field name="DECEMBER"/>
+ <field name="DURATION"/>
+ <field name="DURATION_DAYTIME"/>
+ <field name="DURATION_YEARMONTH"/>
+ <field name="EQUAL"/>
+ <field name="FEBRUARY"/>
+ <field name="FIELD_UNDEFINED"/>
+ <field name="GDAY"/>
+ <field name="GMONTH"/>
+ <field name="GMONTHDAY"/>
+ <field name="GREATER"/>
+ <field name="GYEAR"/>
+ <field name="GYEARMONTH"/>
+ <field name="HOURS"/>
+ <field name="INDETERMINATE"/>
+ <field name="JANUARY"/>
+ <field name="JULY"/>
+ <field name="JUNE"/>
+ <field name="LESSER"/>
+ <field name="MARCH"/>
+ <field name="MAX_TIMEZONE_OFFSET"/>
+ <field name="MAY"/>
+ <field name="MINUTES"/>
+ <field name="MIN_TIMEZONE_OFFSET"/>
+ <field name="MONTHS"/>
+ <field name="NOVEMBER"/>
+ <field name="OCTOBER"/>
+ <field name="SECONDS"/>
+ <field name="SEPTEMBER"/>
+ <field name="TIME"/>
+ <field name="YEARS"/>
+ </class>
+ <class name="javax/xml/datatype/DatatypeConstants$Field" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getId()I"/>
+ </class>
+ <class name="javax/xml/datatype/DatatypeFactory" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="newDuration(J)Ljavax/xml/datatype/Duration;"/>
+ <method name="newDuration(Ljava/lang/String;)Ljavax/xml/datatype/Duration;"/>
+ <method name="newDuration(ZIIIIII)Ljavax/xml/datatype/Duration;"/>
+ <method name="newDuration(ZLjava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigDecimal;)Ljavax/xml/datatype/Duration;"/>
+ <method name="newDurationDayTime(J)Ljavax/xml/datatype/Duration;"/>
+ <method name="newDurationDayTime(Ljava/lang/String;)Ljavax/xml/datatype/Duration;"/>
+ <method name="newDurationDayTime(ZIIII)Ljavax/xml/datatype/Duration;"/>
+ <method name="newDurationDayTime(ZLjava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljavax/xml/datatype/Duration;"/>
+ <method name="newDurationYearMonth(J)Ljavax/xml/datatype/Duration;"/>
+ <method name="newDurationYearMonth(Ljava/lang/String;)Ljavax/xml/datatype/Duration;"/>
+ <method name="newDurationYearMonth(ZII)Ljavax/xml/datatype/Duration;"/>
+ <method name="newDurationYearMonth(ZLjava/math/BigInteger;Ljava/math/BigInteger;)Ljavax/xml/datatype/Duration;"/>
+ <method name="newInstance()Ljavax/xml/datatype/DatatypeFactory;"/>
+ <method name="newInstance(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljavax/xml/datatype/DatatypeFactory;" since="9"/>
+ <method name="newXMLGregorianCalendar()Ljavax/xml/datatype/XMLGregorianCalendar;"/>
+ <method name="newXMLGregorianCalendar(IIIIIIII)Ljavax/xml/datatype/XMLGregorianCalendar;"/>
+ <method name="newXMLGregorianCalendar(Ljava/lang/String;)Ljavax/xml/datatype/XMLGregorianCalendar;"/>
+ <method name="newXMLGregorianCalendar(Ljava/math/BigInteger;IIIIILjava/math/BigDecimal;I)Ljavax/xml/datatype/XMLGregorianCalendar;"/>
+ <method name="newXMLGregorianCalendar(Ljava/util/GregorianCalendar;)Ljavax/xml/datatype/XMLGregorianCalendar;"/>
+ <method name="newXMLGregorianCalendarDate(IIII)Ljavax/xml/datatype/XMLGregorianCalendar;"/>
+ <method name="newXMLGregorianCalendarTime(IIII)Ljavax/xml/datatype/XMLGregorianCalendar;"/>
+ <method name="newXMLGregorianCalendarTime(IIIII)Ljavax/xml/datatype/XMLGregorianCalendar;"/>
+ <method name="newXMLGregorianCalendarTime(IIILjava/math/BigDecimal;I)Ljavax/xml/datatype/XMLGregorianCalendar;"/>
+ <field name="DATATYPEFACTORY_IMPLEMENTATION_CLASS"/>
+ <field name="DATATYPEFACTORY_PROPERTY"/>
+ </class>
+ <class name="javax/xml/datatype/Duration" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="add(Ljavax/xml/datatype/Duration;)Ljavax/xml/datatype/Duration;"/>
+ <method name="addTo(Ljava/util/Calendar;)V"/>
+ <method name="addTo(Ljava/util/Date;)V"/>
+ <method name="compare(Ljavax/xml/datatype/Duration;)I"/>
+ <method name="getDays()I"/>
+ <method name="getField(Ljavax/xml/datatype/DatatypeConstants$Field;)Ljava/lang/Number;"/>
+ <method name="getHours()I"/>
+ <method name="getMinutes()I"/>
+ <method name="getMonths()I"/>
+ <method name="getSeconds()I"/>
+ <method name="getSign()I"/>
+ <method name="getTimeInMillis(Ljava/util/Calendar;)J"/>
+ <method name="getTimeInMillis(Ljava/util/Date;)J"/>
+ <method name="getXMLSchemaType()Ljavax/xml/namespace/QName;"/>
+ <method name="getYears()I"/>
+ <method name="isLongerThan(Ljavax/xml/datatype/Duration;)Z"/>
+ <method name="isSet(Ljavax/xml/datatype/DatatypeConstants$Field;)Z"/>
+ <method name="isShorterThan(Ljavax/xml/datatype/Duration;)Z"/>
+ <method name="multiply(I)Ljavax/xml/datatype/Duration;"/>
+ <method name="multiply(Ljava/math/BigDecimal;)Ljavax/xml/datatype/Duration;"/>
+ <method name="negate()Ljavax/xml/datatype/Duration;"/>
+ <method name="normalizeWith(Ljava/util/Calendar;)Ljavax/xml/datatype/Duration;"/>
+ <method name="subtract(Ljavax/xml/datatype/Duration;)Ljavax/xml/datatype/Duration;"/>
+ </class>
+ <class name="javax/xml/datatype/XMLGregorianCalendar" since="8">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="add(Ljavax/xml/datatype/Duration;)V"/>
+ <method name="clear()V"/>
+ <method name="compare(Ljavax/xml/datatype/XMLGregorianCalendar;)I"/>
+ <method name="getDay()I"/>
+ <method name="getEon()Ljava/math/BigInteger;"/>
+ <method name="getEonAndYear()Ljava/math/BigInteger;"/>
+ <method name="getFractionalSecond()Ljava/math/BigDecimal;"/>
+ <method name="getHour()I"/>
+ <method name="getMillisecond()I"/>
+ <method name="getMinute()I"/>
+ <method name="getMonth()I"/>
+ <method name="getSecond()I"/>
+ <method name="getTimeZone(I)Ljava/util/TimeZone;"/>
+ <method name="getTimezone()I"/>
+ <method name="getXMLSchemaType()Ljavax/xml/namespace/QName;"/>
+ <method name="getYear()I"/>
+ <method name="isValid()Z"/>
+ <method name="normalize()Ljavax/xml/datatype/XMLGregorianCalendar;"/>
+ <method name="reset()V"/>
+ <method name="setDay(I)V"/>
+ <method name="setFractionalSecond(Ljava/math/BigDecimal;)V"/>
+ <method name="setHour(I)V"/>
+ <method name="setMillisecond(I)V"/>
+ <method name="setMinute(I)V"/>
+ <method name="setMonth(I)V"/>
+ <method name="setSecond(I)V"/>
+ <method name="setTime(III)V"/>
+ <method name="setTime(IIII)V"/>
+ <method name="setTime(IIILjava/math/BigDecimal;)V"/>
+ <method name="setTimezone(I)V"/>
+ <method name="setYear(I)V"/>
+ <method name="setYear(Ljava/math/BigInteger;)V"/>
+ <method name="toGregorianCalendar()Ljava/util/GregorianCalendar;"/>
+ <method name="toGregorianCalendar(Ljava/util/TimeZone;Ljava/util/Locale;Ljavax/xml/datatype/XMLGregorianCalendar;)Ljava/util/GregorianCalendar;"/>
+ <method name="toXMLFormat()Ljava/lang/String;"/>
+ </class>
+ <class name="javax/xml/namespace/NamespaceContext" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="getNamespaceURI(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getPrefix(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getPrefixes(Ljava/lang/String;)Ljava/util/Iterator;"/>
+ </class>
+ <class name="javax/xml/namespace/QName" since="8">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="getLocalPart()Ljava/lang/String;"/>
+ <method name="getNamespaceURI()Ljava/lang/String;"/>
+ <method name="getPrefix()Ljava/lang/String;"/>
+ <method name="valueOf(Ljava/lang/String;)Ljavax/xml/namespace/QName;"/>
+ </class>
+ <class name="javax/xml/parsers/DocumentBuilder" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDOMImplementation()Lorg/w3c/dom/DOMImplementation;"/>
+ <method name="getSchema()Ljavax/xml/validation/Schema;" since="8"/>
+ <method name="isNamespaceAware()Z"/>
+ <method name="isValidating()Z"/>
+ <method name="isXIncludeAware()Z"/>
+ <method name="newDocument()Lorg/w3c/dom/Document;"/>
+ <method name="parse(Ljava/io/File;)Lorg/w3c/dom/Document;"/>
+ <method name="parse(Ljava/io/InputStream;)Lorg/w3c/dom/Document;"/>
+ <method name="parse(Ljava/io/InputStream;Ljava/lang/String;)Lorg/w3c/dom/Document;"/>
+ <method name="parse(Ljava/lang/String;)Lorg/w3c/dom/Document;"/>
+ <method name="parse(Lorg/xml/sax/InputSource;)Lorg/w3c/dom/Document;"/>
+ <method name="reset()V"/>
+ <method name="setEntityResolver(Lorg/xml/sax/EntityResolver;)V"/>
+ <method name="setErrorHandler(Lorg/xml/sax/ErrorHandler;)V"/>
+ </class>
+ <class name="javax/xml/parsers/DocumentBuilderFactory" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAttribute(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="getFeature(Ljava/lang/String;)Z"/>
+ <method name="getSchema()Ljavax/xml/validation/Schema;" since="8"/>
+ <method name="isCoalescing()Z"/>
+ <method name="isExpandEntityReferences()Z"/>
+ <method name="isIgnoringComments()Z"/>
+ <method name="isIgnoringElementContentWhitespace()Z"/>
+ <method name="isNamespaceAware()Z"/>
+ <method name="isValidating()Z"/>
+ <method name="isXIncludeAware()Z"/>
+ <method name="newDocumentBuilder()Ljavax/xml/parsers/DocumentBuilder;"/>
+ <method name="newInstance()Ljavax/xml/parsers/DocumentBuilderFactory;"/>
+ <method name="newInstance(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljavax/xml/parsers/DocumentBuilderFactory;" since="9"/>
+ <method name="setAttribute(Ljava/lang/String;Ljava/lang/Object;)V"/>
+ <method name="setCoalescing(Z)V"/>
+ <method name="setExpandEntityReferences(Z)V"/>
+ <method name="setFeature(Ljava/lang/String;Z)V"/>
+ <method name="setIgnoringComments(Z)V"/>
+ <method name="setIgnoringElementContentWhitespace(Z)V"/>
+ <method name="setNamespaceAware(Z)V"/>
+ <method name="setSchema(Ljavax/xml/validation/Schema;)V" since="8"/>
+ <method name="setValidating(Z)V"/>
+ <method name="setXIncludeAware(Z)V"/>
+ </class>
+ <class name="javax/xml/parsers/FactoryConfigurationError" since="1">
+ <extends name="java/lang/Error"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/Exception;)V"/>
+ <method name="&lt;init>(Ljava/lang/Exception;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getException()Ljava/lang/Exception;"/>
+ </class>
+ <class name="javax/xml/parsers/ParserConfigurationException" since="1">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="javax/xml/parsers/SAXParser" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getParser()Lorg/xml/sax/Parser;"/>
+ <method name="getProperty(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="getSchema()Ljavax/xml/validation/Schema;" since="8"/>
+ <method name="getXMLReader()Lorg/xml/sax/XMLReader;"/>
+ <method name="isNamespaceAware()Z"/>
+ <method name="isValidating()Z"/>
+ <method name="isXIncludeAware()Z"/>
+ <method name="parse(Ljava/io/File;Lorg/xml/sax/HandlerBase;)V"/>
+ <method name="parse(Ljava/io/File;Lorg/xml/sax/helpers/DefaultHandler;)V"/>
+ <method name="parse(Ljava/io/InputStream;Lorg/xml/sax/HandlerBase;)V"/>
+ <method name="parse(Ljava/io/InputStream;Lorg/xml/sax/HandlerBase;Ljava/lang/String;)V"/>
+ <method name="parse(Ljava/io/InputStream;Lorg/xml/sax/helpers/DefaultHandler;)V"/>
+ <method name="parse(Ljava/io/InputStream;Lorg/xml/sax/helpers/DefaultHandler;Ljava/lang/String;)V"/>
+ <method name="parse(Ljava/lang/String;Lorg/xml/sax/HandlerBase;)V"/>
+ <method name="parse(Ljava/lang/String;Lorg/xml/sax/helpers/DefaultHandler;)V"/>
+ <method name="parse(Lorg/xml/sax/InputSource;Lorg/xml/sax/HandlerBase;)V"/>
+ <method name="parse(Lorg/xml/sax/InputSource;Lorg/xml/sax/helpers/DefaultHandler;)V"/>
+ <method name="reset()V"/>
+ <method name="setProperty(Ljava/lang/String;Ljava/lang/Object;)V"/>
+ </class>
+ <class name="javax/xml/parsers/SAXParserFactory" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getFeature(Ljava/lang/String;)Z"/>
+ <method name="getSchema()Ljavax/xml/validation/Schema;" since="8"/>
+ <method name="isNamespaceAware()Z"/>
+ <method name="isValidating()Z"/>
+ <method name="isXIncludeAware()Z"/>
+ <method name="newInstance()Ljavax/xml/parsers/SAXParserFactory;"/>
+ <method name="newInstance(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljavax/xml/parsers/SAXParserFactory;" since="9"/>
+ <method name="newSAXParser()Ljavax/xml/parsers/SAXParser;"/>
+ <method name="setFeature(Ljava/lang/String;Z)V"/>
+ <method name="setNamespaceAware(Z)V"/>
+ <method name="setSchema(Ljavax/xml/validation/Schema;)V" since="8"/>
+ <method name="setValidating(Z)V"/>
+ <method name="setXIncludeAware(Z)V"/>
+ </class>
+ <class name="javax/xml/transform/ErrorListener" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="error(Ljavax/xml/transform/TransformerException;)V"/>
+ <method name="fatalError(Ljavax/xml/transform/TransformerException;)V"/>
+ <method name="warning(Ljavax/xml/transform/TransformerException;)V"/>
+ </class>
+ <class name="javax/xml/transform/OutputKeys" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="CDATA_SECTION_ELEMENTS"/>
+ <field name="DOCTYPE_PUBLIC"/>
+ <field name="DOCTYPE_SYSTEM"/>
+ <field name="ENCODING"/>
+ <field name="INDENT"/>
+ <field name="MEDIA_TYPE"/>
+ <field name="METHOD"/>
+ <field name="OMIT_XML_DECLARATION"/>
+ <field name="STANDALONE"/>
+ <field name="VERSION"/>
+ </class>
+ <class name="javax/xml/transform/Result" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="getSystemId()Ljava/lang/String;"/>
+ <method name="setSystemId(Ljava/lang/String;)V"/>
+ <field name="PI_DISABLE_OUTPUT_ESCAPING"/>
+ <field name="PI_ENABLE_OUTPUT_ESCAPING"/>
+ </class>
+ <class name="javax/xml/transform/Source" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="getSystemId()Ljava/lang/String;"/>
+ <method name="setSystemId(Ljava/lang/String;)V"/>
+ </class>
+ <class name="javax/xml/transform/SourceLocator" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="getColumnNumber()I"/>
+ <method name="getLineNumber()I"/>
+ <method name="getPublicId()Ljava/lang/String;"/>
+ <method name="getSystemId()Ljava/lang/String;"/>
+ </class>
+ <class name="javax/xml/transform/Templates" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="getOutputProperties()Ljava/util/Properties;"/>
+ <method name="newTransformer()Ljavax/xml/transform/Transformer;"/>
+ </class>
+ <class name="javax/xml/transform/Transformer" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="clearParameters()V"/>
+ <method name="getErrorListener()Ljavax/xml/transform/ErrorListener;"/>
+ <method name="getOutputProperties()Ljava/util/Properties;"/>
+ <method name="getOutputProperty(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getParameter(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="getURIResolver()Ljavax/xml/transform/URIResolver;"/>
+ <method name="reset()V"/>
+ <method name="setErrorListener(Ljavax/xml/transform/ErrorListener;)V"/>
+ <method name="setOutputProperties(Ljava/util/Properties;)V"/>
+ <method name="setOutputProperty(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="setParameter(Ljava/lang/String;Ljava/lang/Object;)V"/>
+ <method name="setURIResolver(Ljavax/xml/transform/URIResolver;)V"/>
+ <method name="transform(Ljavax/xml/transform/Source;Ljavax/xml/transform/Result;)V"/>
+ </class>
+ <class name="javax/xml/transform/TransformerConfigurationException" since="8">
+ <extends name="javax/xml/transform/TransformerException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljavax/xml/transform/SourceLocator;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljavax/xml/transform/SourceLocator;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="javax/xml/transform/TransformerException" since="8">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljavax/xml/transform/SourceLocator;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljavax/xml/transform/SourceLocator;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ <method name="getException()Ljava/lang/Throwable;"/>
+ <method name="getLocationAsString()Ljava/lang/String;"/>
+ <method name="getLocator()Ljavax/xml/transform/SourceLocator;"/>
+ <method name="getMessageAndLocation()Ljava/lang/String;"/>
+ <method name="setLocator(Ljavax/xml/transform/SourceLocator;)V"/>
+ </class>
+ <class name="javax/xml/transform/TransformerFactory" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAssociatedStylesheet(Ljavax/xml/transform/Source;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljavax/xml/transform/Source;"/>
+ <method name="getAttribute(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="getErrorListener()Ljavax/xml/transform/ErrorListener;"/>
+ <method name="getFeature(Ljava/lang/String;)Z"/>
+ <method name="getURIResolver()Ljavax/xml/transform/URIResolver;"/>
+ <method name="newInstance()Ljavax/xml/transform/TransformerFactory;"/>
+ <method name="newInstance(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljavax/xml/transform/TransformerFactory;" since="9"/>
+ <method name="newTemplates(Ljavax/xml/transform/Source;)Ljavax/xml/transform/Templates;"/>
+ <method name="newTransformer()Ljavax/xml/transform/Transformer;"/>
+ <method name="newTransformer(Ljavax/xml/transform/Source;)Ljavax/xml/transform/Transformer;"/>
+ <method name="setAttribute(Ljava/lang/String;Ljava/lang/Object;)V"/>
+ <method name="setErrorListener(Ljavax/xml/transform/ErrorListener;)V"/>
+ <method name="setFeature(Ljava/lang/String;Z)V"/>
+ <method name="setURIResolver(Ljavax/xml/transform/URIResolver;)V"/>
+ </class>
+ <class name="javax/xml/transform/TransformerFactoryConfigurationError" since="8">
+ <extends name="java/lang/Error"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/Exception;)V"/>
+ <method name="&lt;init>(Ljava/lang/Exception;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getException()Ljava/lang/Exception;"/>
+ </class>
+ <class name="javax/xml/transform/URIResolver" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="resolve(Ljava/lang/String;Ljava/lang/String;)Ljavax/xml/transform/Source;"/>
+ </class>
+ <class name="javax/xml/transform/dom/DOMLocator" since="8">
+ <extends name="java/lang/Object"/>
+ <implements name="javax/xml/transform/SourceLocator"/>
+ <method name="getOriginatingNode()Lorg/w3c/dom/Node;"/>
+ </class>
+ <class name="javax/xml/transform/dom/DOMResult" since="8">
+ <extends name="java/lang/Object"/>
+ <implements name="javax/xml/transform/Result"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Lorg/w3c/dom/Node;)V"/>
+ <method name="&lt;init>(Lorg/w3c/dom/Node;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Lorg/w3c/dom/Node;Lorg/w3c/dom/Node;)V"/>
+ <method name="&lt;init>(Lorg/w3c/dom/Node;Lorg/w3c/dom/Node;Ljava/lang/String;)V"/>
+ <method name="getNextSibling()Lorg/w3c/dom/Node;"/>
+ <method name="getNode()Lorg/w3c/dom/Node;"/>
+ <method name="setNextSibling(Lorg/w3c/dom/Node;)V"/>
+ <method name="setNode(Lorg/w3c/dom/Node;)V"/>
+ <field name="FEATURE"/>
+ </class>
+ <class name="javax/xml/transform/dom/DOMSource" since="8">
+ <extends name="java/lang/Object"/>
+ <implements name="javax/xml/transform/Source"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Lorg/w3c/dom/Node;)V"/>
+ <method name="&lt;init>(Lorg/w3c/dom/Node;Ljava/lang/String;)V"/>
+ <method name="getNode()Lorg/w3c/dom/Node;"/>
+ <method name="setNode(Lorg/w3c/dom/Node;)V"/>
+ <field name="FEATURE"/>
+ </class>
+ <class name="javax/xml/transform/sax/SAXResult" since="8">
+ <extends name="java/lang/Object"/>
+ <implements name="javax/xml/transform/Result"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Lorg/xml/sax/ContentHandler;)V"/>
+ <method name="getHandler()Lorg/xml/sax/ContentHandler;"/>
+ <method name="getLexicalHandler()Lorg/xml/sax/ext/LexicalHandler;"/>
+ <method name="setHandler(Lorg/xml/sax/ContentHandler;)V"/>
+ <method name="setLexicalHandler(Lorg/xml/sax/ext/LexicalHandler;)V"/>
+ <field name="FEATURE"/>
+ </class>
+ <class name="javax/xml/transform/sax/SAXSource" since="8">
+ <extends name="java/lang/Object"/>
+ <implements name="javax/xml/transform/Source"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Lorg/xml/sax/InputSource;)V"/>
+ <method name="&lt;init>(Lorg/xml/sax/XMLReader;Lorg/xml/sax/InputSource;)V"/>
+ <method name="getInputSource()Lorg/xml/sax/InputSource;"/>
+ <method name="getXMLReader()Lorg/xml/sax/XMLReader;"/>
+ <method name="setInputSource(Lorg/xml/sax/InputSource;)V"/>
+ <method name="setXMLReader(Lorg/xml/sax/XMLReader;)V"/>
+ <method name="sourceToInputSource(Ljavax/xml/transform/Source;)Lorg/xml/sax/InputSource;"/>
+ <field name="FEATURE"/>
+ </class>
+ <class name="javax/xml/transform/sax/SAXTransformerFactory" since="8">
+ <extends name="javax/xml/transform/TransformerFactory"/>
+ <method name="&lt;init>()V"/>
+ <method name="newTemplatesHandler()Ljavax/xml/transform/sax/TemplatesHandler;"/>
+ <method name="newTransformerHandler()Ljavax/xml/transform/sax/TransformerHandler;"/>
+ <method name="newTransformerHandler(Ljavax/xml/transform/Source;)Ljavax/xml/transform/sax/TransformerHandler;"/>
+ <method name="newTransformerHandler(Ljavax/xml/transform/Templates;)Ljavax/xml/transform/sax/TransformerHandler;"/>
+ <method name="newXMLFilter(Ljavax/xml/transform/Source;)Lorg/xml/sax/XMLFilter;"/>
+ <method name="newXMLFilter(Ljavax/xml/transform/Templates;)Lorg/xml/sax/XMLFilter;"/>
+ <field name="FEATURE"/>
+ <field name="FEATURE_XMLFILTER"/>
+ </class>
+ <class name="javax/xml/transform/sax/TemplatesHandler" since="8">
+ <extends name="java/lang/Object"/>
+ <implements name="org/xml/sax/ContentHandler"/>
+ <method name="getSystemId()Ljava/lang/String;"/>
+ <method name="getTemplates()Ljavax/xml/transform/Templates;"/>
+ <method name="setSystemId(Ljava/lang/String;)V"/>
+ </class>
+ <class name="javax/xml/transform/sax/TransformerHandler" since="8">
+ <extends name="java/lang/Object"/>
+ <implements name="org/xml/sax/ContentHandler"/>
+ <implements name="org/xml/sax/DTDHandler"/>
+ <implements name="org/xml/sax/ext/LexicalHandler"/>
+ <method name="getSystemId()Ljava/lang/String;"/>
+ <method name="getTransformer()Ljavax/xml/transform/Transformer;"/>
+ <method name="setResult(Ljavax/xml/transform/Result;)V"/>
+ <method name="setSystemId(Ljava/lang/String;)V"/>
+ </class>
+ <class name="javax/xml/transform/stream/StreamResult" since="8">
+ <extends name="java/lang/Object"/>
+ <implements name="javax/xml/transform/Result"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/io/File;)V"/>
+ <method name="&lt;init>(Ljava/io/OutputStream;)V"/>
+ <method name="&lt;init>(Ljava/io/Writer;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getOutputStream()Ljava/io/OutputStream;"/>
+ <method name="getWriter()Ljava/io/Writer;"/>
+ <method name="setOutputStream(Ljava/io/OutputStream;)V"/>
+ <method name="setSystemId(Ljava/io/File;)V"/>
+ <method name="setWriter(Ljava/io/Writer;)V"/>
+ <field name="FEATURE"/>
+ </class>
+ <class name="javax/xml/transform/stream/StreamSource" since="8">
+ <extends name="java/lang/Object"/>
+ <implements name="javax/xml/transform/Source"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/io/File;)V"/>
+ <method name="&lt;init>(Ljava/io/InputStream;)V"/>
+ <method name="&lt;init>(Ljava/io/InputStream;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/io/Reader;)V"/>
+ <method name="&lt;init>(Ljava/io/Reader;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getInputStream()Ljava/io/InputStream;"/>
+ <method name="getPublicId()Ljava/lang/String;"/>
+ <method name="getReader()Ljava/io/Reader;"/>
+ <method name="setInputStream(Ljava/io/InputStream;)V"/>
+ <method name="setPublicId(Ljava/lang/String;)V"/>
+ <method name="setReader(Ljava/io/Reader;)V"/>
+ <method name="setSystemId(Ljava/io/File;)V"/>
+ <field name="FEATURE"/>
+ </class>
+ <class name="javax/xml/validation/Schema" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="newValidator()Ljavax/xml/validation/Validator;"/>
+ <method name="newValidatorHandler()Ljavax/xml/validation/ValidatorHandler;"/>
+ </class>
+ <class name="javax/xml/validation/SchemaFactory" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getErrorHandler()Lorg/xml/sax/ErrorHandler;"/>
+ <method name="getFeature(Ljava/lang/String;)Z"/>
+ <method name="getProperty(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="getResourceResolver()Lorg/w3c/dom/ls/LSResourceResolver;"/>
+ <method name="isSchemaLanguageSupported(Ljava/lang/String;)Z"/>
+ <method name="newInstance(Ljava/lang/String;)Ljavax/xml/validation/SchemaFactory;"/>
+ <method name="newInstance(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)Ljavax/xml/validation/SchemaFactory;" since="9"/>
+ <method name="newSchema()Ljavax/xml/validation/Schema;"/>
+ <method name="newSchema(Ljava/io/File;)Ljavax/xml/validation/Schema;"/>
+ <method name="newSchema(Ljava/net/URL;)Ljavax/xml/validation/Schema;"/>
+ <method name="newSchema(Ljavax/xml/transform/Source;)Ljavax/xml/validation/Schema;"/>
+ <method name="newSchema([Ljavax/xml/transform/Source;)Ljavax/xml/validation/Schema;"/>
+ <method name="setErrorHandler(Lorg/xml/sax/ErrorHandler;)V"/>
+ <method name="setFeature(Ljava/lang/String;Z)V"/>
+ <method name="setProperty(Ljava/lang/String;Ljava/lang/Object;)V"/>
+ <method name="setResourceResolver(Lorg/w3c/dom/ls/LSResourceResolver;)V"/>
+ </class>
+ <class name="javax/xml/validation/SchemaFactoryLoader" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="newFactory(Ljava/lang/String;)Ljavax/xml/validation/SchemaFactory;"/>
+ </class>
+ <class name="javax/xml/validation/TypeInfoProvider" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAttributeTypeInfo(I)Lorg/w3c/dom/TypeInfo;"/>
+ <method name="getElementTypeInfo()Lorg/w3c/dom/TypeInfo;"/>
+ <method name="isIdAttribute(I)Z"/>
+ <method name="isSpecified(I)Z"/>
+ </class>
+ <class name="javax/xml/validation/Validator" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getErrorHandler()Lorg/xml/sax/ErrorHandler;"/>
+ <method name="getFeature(Ljava/lang/String;)Z"/>
+ <method name="getProperty(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="getResourceResolver()Lorg/w3c/dom/ls/LSResourceResolver;"/>
+ <method name="reset()V"/>
+ <method name="setErrorHandler(Lorg/xml/sax/ErrorHandler;)V"/>
+ <method name="setFeature(Ljava/lang/String;Z)V"/>
+ <method name="setProperty(Ljava/lang/String;Ljava/lang/Object;)V"/>
+ <method name="setResourceResolver(Lorg/w3c/dom/ls/LSResourceResolver;)V"/>
+ <method name="validate(Ljavax/xml/transform/Source;)V"/>
+ <method name="validate(Ljavax/xml/transform/Source;Ljavax/xml/transform/Result;)V"/>
+ </class>
+ <class name="javax/xml/validation/ValidatorHandler" since="8">
+ <extends name="java/lang/Object"/>
+ <implements name="org/xml/sax/ContentHandler"/>
+ <method name="&lt;init>()V"/>
+ <method name="getContentHandler()Lorg/xml/sax/ContentHandler;"/>
+ <method name="getErrorHandler()Lorg/xml/sax/ErrorHandler;"/>
+ <method name="getFeature(Ljava/lang/String;)Z"/>
+ <method name="getProperty(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="getResourceResolver()Lorg/w3c/dom/ls/LSResourceResolver;"/>
+ <method name="getTypeInfoProvider()Ljavax/xml/validation/TypeInfoProvider;"/>
+ <method name="setContentHandler(Lorg/xml/sax/ContentHandler;)V"/>
+ <method name="setErrorHandler(Lorg/xml/sax/ErrorHandler;)V"/>
+ <method name="setFeature(Ljava/lang/String;Z)V"/>
+ <method name="setProperty(Ljava/lang/String;Ljava/lang/Object;)V"/>
+ <method name="setResourceResolver(Lorg/w3c/dom/ls/LSResourceResolver;)V"/>
+ </class>
+ <class name="javax/xml/xpath/XPath" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="compile(Ljava/lang/String;)Ljavax/xml/xpath/XPathExpression;"/>
+ <method name="evaluate(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String;"/>
+ <method name="evaluate(Ljava/lang/String;Ljava/lang/Object;Ljavax/xml/namespace/QName;)Ljava/lang/Object;"/>
+ <method name="evaluate(Ljava/lang/String;Lorg/xml/sax/InputSource;)Ljava/lang/String;"/>
+ <method name="evaluate(Ljava/lang/String;Lorg/xml/sax/InputSource;Ljavax/xml/namespace/QName;)Ljava/lang/Object;"/>
+ <method name="getNamespaceContext()Ljavax/xml/namespace/NamespaceContext;"/>
+ <method name="getXPathFunctionResolver()Ljavax/xml/xpath/XPathFunctionResolver;"/>
+ <method name="getXPathVariableResolver()Ljavax/xml/xpath/XPathVariableResolver;"/>
+ <method name="reset()V"/>
+ <method name="setNamespaceContext(Ljavax/xml/namespace/NamespaceContext;)V"/>
+ <method name="setXPathFunctionResolver(Ljavax/xml/xpath/XPathFunctionResolver;)V"/>
+ <method name="setXPathVariableResolver(Ljavax/xml/xpath/XPathVariableResolver;)V"/>
+ </class>
+ <class name="javax/xml/xpath/XPathConstants" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="BOOLEAN"/>
+ <field name="DOM_OBJECT_MODEL"/>
+ <field name="NODE"/>
+ <field name="NODESET"/>
+ <field name="NUMBER"/>
+ <field name="STRING"/>
+ </class>
+ <class name="javax/xml/xpath/XPathException" since="8">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="javax/xml/xpath/XPathExpression" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="evaluate(Ljava/lang/Object;)Ljava/lang/String;"/>
+ <method name="evaluate(Ljava/lang/Object;Ljavax/xml/namespace/QName;)Ljava/lang/Object;"/>
+ <method name="evaluate(Lorg/xml/sax/InputSource;)Ljava/lang/String;"/>
+ <method name="evaluate(Lorg/xml/sax/InputSource;Ljavax/xml/namespace/QName;)Ljava/lang/Object;"/>
+ </class>
+ <class name="javax/xml/xpath/XPathExpressionException" since="8">
+ <extends name="javax/xml/xpath/XPathException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="javax/xml/xpath/XPathFactory" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getFeature(Ljava/lang/String;)Z"/>
+ <method name="isObjectModelSupported(Ljava/lang/String;)Z"/>
+ <method name="newInstance()Ljavax/xml/xpath/XPathFactory;"/>
+ <method name="newInstance(Ljava/lang/String;)Ljavax/xml/xpath/XPathFactory;"/>
+ <method name="newInstance(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)Ljavax/xml/xpath/XPathFactory;"/>
+ <method name="newXPath()Ljavax/xml/xpath/XPath;"/>
+ <method name="setFeature(Ljava/lang/String;Z)V"/>
+ <method name="setXPathFunctionResolver(Ljavax/xml/xpath/XPathFunctionResolver;)V"/>
+ <method name="setXPathVariableResolver(Ljavax/xml/xpath/XPathVariableResolver;)V"/>
+ <field name="DEFAULT_OBJECT_MODEL_URI"/>
+ <field name="DEFAULT_PROPERTY_NAME"/>
+ </class>
+ <class name="javax/xml/xpath/XPathFactoryConfigurationException" since="8">
+ <extends name="javax/xml/xpath/XPathException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="javax/xml/xpath/XPathFunction" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="evaluate(Ljava/util/List;)Ljava/lang/Object;"/>
+ </class>
+ <class name="javax/xml/xpath/XPathFunctionException" since="8">
+ <extends name="javax/xml/xpath/XPathExpressionException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="javax/xml/xpath/XPathFunctionResolver" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="resolveFunction(Ljavax/xml/namespace/QName;I)Ljavax/xml/xpath/XPathFunction;"/>
+ </class>
+ <class name="javax/xml/xpath/XPathVariableResolver" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="resolveVariable(Ljavax/xml/namespace/QName;)Ljava/lang/Object;"/>
+ </class>
+ <class name="junit/framework/Assert" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="assertEquals(BB)V"/>
+ <method name="assertEquals(CC)V"/>
+ <method name="assertEquals(DDD)V"/>
+ <method name="assertEquals(FFF)V"/>
+ <method name="assertEquals(II)V"/>
+ <method name="assertEquals(JJ)V"/>
+ <method name="assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V"/>
+ <method name="assertEquals(Ljava/lang/String;BB)V"/>
+ <method name="assertEquals(Ljava/lang/String;CC)V"/>
+ <method name="assertEquals(Ljava/lang/String;DDD)V"/>
+ <method name="assertEquals(Ljava/lang/String;FFF)V"/>
+ <method name="assertEquals(Ljava/lang/String;II)V"/>
+ <method name="assertEquals(Ljava/lang/String;JJ)V"/>
+ <method name="assertEquals(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V"/>
+ <method name="assertEquals(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="assertEquals(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="assertEquals(Ljava/lang/String;SS)V"/>
+ <method name="assertEquals(Ljava/lang/String;ZZ)V"/>
+ <method name="assertEquals(SS)V"/>
+ <method name="assertEquals(ZZ)V"/>
+ <method name="assertFalse(Ljava/lang/String;Z)V"/>
+ <method name="assertFalse(Z)V"/>
+ <method name="assertNotNull(Ljava/lang/Object;)V"/>
+ <method name="assertNotNull(Ljava/lang/String;Ljava/lang/Object;)V"/>
+ <method name="assertNotSame(Ljava/lang/Object;Ljava/lang/Object;)V"/>
+ <method name="assertNotSame(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V"/>
+ <method name="assertNull(Ljava/lang/Object;)V"/>
+ <method name="assertNull(Ljava/lang/String;Ljava/lang/Object;)V"/>
+ <method name="assertSame(Ljava/lang/Object;Ljava/lang/Object;)V"/>
+ <method name="assertSame(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V"/>
+ <method name="assertTrue(Ljava/lang/String;Z)V"/>
+ <method name="assertTrue(Z)V"/>
+ <method name="fail()V"/>
+ <method name="fail(Ljava/lang/String;)V"/>
+ <method name="failNotEquals(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V" since="16"/>
+ <method name="failNotSame(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V" since="16"/>
+ <method name="failSame(Ljava/lang/String;)V" since="16"/>
+ <method name="format(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/String;" since="16"/>
+ </class>
+ <class name="junit/framework/AssertionFailedError" since="1">
+ <extends name="java/lang/AssertionError" since="16"/>
+ <extends name="java/lang/Error" removed="16"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="junit/framework/ComparisonFailure" since="1">
+ <extends name="junit/framework/AssertionFailedError"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="getActual()Ljava/lang/String;" since="16"/>
+ <method name="getExpected()Ljava/lang/String;" since="16"/>
+ </class>
+ <class name="junit/framework/Protectable" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="protect()V"/>
+ </class>
+ <class name="junit/framework/Test" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="countTestCases()I"/>
+ <method name="run(Ljunit/framework/TestResult;)V"/>
+ </class>
+ <class name="junit/framework/TestCase" since="1">
+ <extends name="junit/framework/Assert"/>
+ <implements name="junit/framework/Test"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="createResult()Ljunit/framework/TestResult;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="run()Ljunit/framework/TestResult;"/>
+ <method name="runBare()V"/>
+ <method name="runTest()V"/>
+ <method name="setName(Ljava/lang/String;)V"/>
+ <method name="setUp()V"/>
+ <method name="tearDown()V"/>
+ </class>
+ <class name="junit/framework/TestFailure" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljunit/framework/Test;Ljava/lang/Throwable;)V"/>
+ <method name="exceptionMessage()Ljava/lang/String;"/>
+ <method name="failedTest()Ljunit/framework/Test;"/>
+ <method name="isFailure()Z"/>
+ <method name="thrownException()Ljava/lang/Throwable;"/>
+ <method name="trace()Ljava/lang/String;"/>
+ <field name="fFailedTest"/>
+ <field name="fThrownException"/>
+ </class>
+ <class name="junit/framework/TestListener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="addError(Ljunit/framework/Test;Ljava/lang/Throwable;)V"/>
+ <method name="addFailure(Ljunit/framework/Test;Ljunit/framework/AssertionFailedError;)V"/>
+ <method name="endTest(Ljunit/framework/Test;)V"/>
+ <method name="startTest(Ljunit/framework/Test;)V"/>
+ </class>
+ <class name="junit/framework/TestResult" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="addError(Ljunit/framework/Test;Ljava/lang/Throwable;)V"/>
+ <method name="addFailure(Ljunit/framework/Test;Ljunit/framework/AssertionFailedError;)V"/>
+ <method name="addListener(Ljunit/framework/TestListener;)V"/>
+ <method name="endTest(Ljunit/framework/Test;)V"/>
+ <method name="errorCount()I"/>
+ <method name="errors()Ljava/util/Enumeration;"/>
+ <method name="failureCount()I"/>
+ <method name="failures()Ljava/util/Enumeration;"/>
+ <method name="removeListener(Ljunit/framework/TestListener;)V"/>
+ <method name="run(Ljunit/framework/TestCase;)V"/>
+ <method name="runCount()I"/>
+ <method name="runProtected(Ljunit/framework/Test;Ljunit/framework/Protectable;)V"/>
+ <method name="shouldStop()Z"/>
+ <method name="startTest(Ljunit/framework/Test;)V"/>
+ <method name="stop()V"/>
+ <method name="wasSuccessful()Z"/>
+ <field name="fErrors"/>
+ <field name="fFailures"/>
+ <field name="fListeners"/>
+ <field name="fRunTests"/>
+ </class>
+ <class name="junit/framework/TestSuite" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="junit/framework/Test"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/Class;)V"/>
+ <method name="&lt;init>(Ljava/lang/Class;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>([Ljava/lang/Class;)V" since="16"/>
+ <method name="&lt;init>([Ljava/lang/Class;Ljava/lang/String;)V" since="16"/>
+ <method name="addTest(Ljunit/framework/Test;)V"/>
+ <method name="addTestSuite(Ljava/lang/Class;)V"/>
+ <method name="createTest(Ljava/lang/Class;Ljava/lang/String;)Ljunit/framework/Test;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getTestConstructor(Ljava/lang/Class;)Ljava/lang/reflect/Constructor;"/>
+ <method name="runTest(Ljunit/framework/Test;Ljunit/framework/TestResult;)V"/>
+ <method name="setName(Ljava/lang/String;)V"/>
+ <method name="testAt(I)Ljunit/framework/Test;"/>
+ <method name="testCount()I"/>
+ <method name="tests()Ljava/util/Enumeration;"/>
+ <method name="warning(Ljava/lang/String;)Ljunit/framework/Test;" since="16"/>
+ </class>
+ <class name="junit/runner/BaseTestRunner" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="junit/framework/TestListener"/>
+ <method name="&lt;init>()V"/>
+ <method name="clearStatus()V"/>
+ <method name="elapsedTimeAsString(J)Ljava/lang/String;"/>
+ <method name="extractClassName(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getFilteredTrace(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getFilteredTrace(Ljava/lang/Throwable;)Ljava/lang/String;"/>
+ <method name="getLoader()Ljunit/runner/TestSuiteLoader;" deprecated="16"/>
+ <method name="getPreference(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getPreference(Ljava/lang/String;I)I"/>
+ <method name="getPreferences()Ljava/util/Properties;"/>
+ <method name="getTest(Ljava/lang/String;)Ljunit/framework/Test;"/>
+ <method name="inVAJava()Z" deprecated="16"/>
+ <method name="loadSuiteClass(Ljava/lang/String;)Ljava/lang/Class;"/>
+ <method name="processArguments([Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="runFailed(Ljava/lang/String;)V"/>
+ <method name="savePreferences()V"/>
+ <method name="setLoading(Z)V"/>
+ <method name="setPreference(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="setPreferences(Ljava/util/Properties;)V"/>
+ <method name="showStackRaw()Z"/>
+ <method name="testEnded(Ljava/lang/String;)V"/>
+ <method name="testFailed(ILjunit/framework/Test;Ljava/lang/Throwable;)V"/>
+ <method name="testStarted(Ljava/lang/String;)V"/>
+ <method name="truncate(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="useReloadingTestSuiteLoader()Z"/>
+ <field name="SUITE_METHODNAME"/>
+ </class>
+ <class name="junit/runner/TestSuiteLoader" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="load(Ljava/lang/String;)Ljava/lang/Class;"/>
+ <method name="reload(Ljava/lang/Class;)Ljava/lang/Class;"/>
+ </class>
+ <class name="junit/runner/Version" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="id()Ljava/lang/String;"/>
+ </class>
+ <class name="org/apache/commons/logging/Log" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="debug(Ljava/lang/Object;)V"/>
+ <method name="debug(Ljava/lang/Object;Ljava/lang/Throwable;)V"/>
+ <method name="error(Ljava/lang/Object;)V"/>
+ <method name="error(Ljava/lang/Object;Ljava/lang/Throwable;)V"/>
+ <method name="fatal(Ljava/lang/Object;)V"/>
+ <method name="fatal(Ljava/lang/Object;Ljava/lang/Throwable;)V"/>
+ <method name="info(Ljava/lang/Object;)V"/>
+ <method name="info(Ljava/lang/Object;Ljava/lang/Throwable;)V"/>
+ <method name="isDebugEnabled()Z"/>
+ <method name="isErrorEnabled()Z"/>
+ <method name="isFatalEnabled()Z"/>
+ <method name="isInfoEnabled()Z"/>
+ <method name="isTraceEnabled()Z"/>
+ <method name="isWarnEnabled()Z"/>
+ <method name="trace(Ljava/lang/Object;)V"/>
+ <method name="trace(Ljava/lang/Object;Ljava/lang/Throwable;)V"/>
+ <method name="warn(Ljava/lang/Object;)V"/>
+ <method name="warn(Ljava/lang/Object;Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="org/apache/http/ConnectionClosedException" since="1" deprecated="22" removed="23">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/apache/http/ConnectionReuseStrategy" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="keepAlive(Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)Z"/>
+ </class>
+ <class name="org/apache/http/FormattedHeader" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/Header"/>
+ <method name="getBuffer()Lorg/apache/http/util/CharArrayBuffer;"/>
+ <method name="getValuePos()I"/>
+ </class>
+ <class name="org/apache/http/Header" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="getElements()[Lorg/apache/http/HeaderElement;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getValue()Ljava/lang/String;"/>
+ </class>
+ <class name="org/apache/http/HeaderElement" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getParameter(I)Lorg/apache/http/NameValuePair;"/>
+ <method name="getParameterByName(Ljava/lang/String;)Lorg/apache/http/NameValuePair;"/>
+ <method name="getParameterCount()I"/>
+ <method name="getParameters()[Lorg/apache/http/NameValuePair;"/>
+ <method name="getValue()Ljava/lang/String;"/>
+ </class>
+ <class name="org/apache/http/HeaderElementIterator" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Iterator"/>
+ <method name="nextElement()Lorg/apache/http/HeaderElement;"/>
+ </class>
+ <class name="org/apache/http/HeaderIterator" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Iterator"/>
+ <method name="nextHeader()Lorg/apache/http/Header;"/>
+ </class>
+ <class name="org/apache/http/HttpClientConnection" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpConnection"/>
+ <method name="flush()V"/>
+ <method name="isResponseAvailable(I)Z"/>
+ <method name="receiveResponseEntity(Lorg/apache/http/HttpResponse;)V"/>
+ <method name="receiveResponseHeader()Lorg/apache/http/HttpResponse;"/>
+ <method name="sendRequestEntity(Lorg/apache/http/HttpEntityEnclosingRequest;)V"/>
+ <method name="sendRequestHeader(Lorg/apache/http/HttpRequest;)V"/>
+ </class>
+ <class name="org/apache/http/HttpConnection" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="close()V"/>
+ <method name="getMetrics()Lorg/apache/http/HttpConnectionMetrics;"/>
+ <method name="getSocketTimeout()I"/>
+ <method name="isOpen()Z"/>
+ <method name="isStale()Z"/>
+ <method name="setSocketTimeout(I)V"/>
+ <method name="shutdown()V"/>
+ </class>
+ <class name="org/apache/http/HttpConnectionMetrics" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="getMetric(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="getReceivedBytesCount()J"/>
+ <method name="getRequestCount()J"/>
+ <method name="getResponseCount()J"/>
+ <method name="getSentBytesCount()J"/>
+ <method name="reset()V"/>
+ </class>
+ <class name="org/apache/http/HttpEntity" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="consumeContent()V"/>
+ <method name="getContent()Ljava/io/InputStream;"/>
+ <method name="getContentEncoding()Lorg/apache/http/Header;"/>
+ <method name="getContentLength()J"/>
+ <method name="getContentType()Lorg/apache/http/Header;"/>
+ <method name="isChunked()Z"/>
+ <method name="isRepeatable()Z"/>
+ <method name="isStreaming()Z"/>
+ <method name="writeTo(Ljava/io/OutputStream;)V"/>
+ </class>
+ <class name="org/apache/http/HttpEntityEnclosingRequest" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpRequest"/>
+ <method name="expectContinue()Z"/>
+ <method name="getEntity()Lorg/apache/http/HttpEntity;"/>
+ <method name="setEntity(Lorg/apache/http/HttpEntity;)V"/>
+ </class>
+ <class name="org/apache/http/HttpException" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="org/apache/http/HttpHost" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;ILjava/lang/String;)V"/>
+ <method name="&lt;init>(Lorg/apache/http/HttpHost;)V"/>
+ <method name="getHostName()Ljava/lang/String;"/>
+ <method name="getPort()I"/>
+ <method name="getSchemeName()Ljava/lang/String;"/>
+ <method name="toHostString()Ljava/lang/String;"/>
+ <method name="toURI()Ljava/lang/String;"/>
+ <field name="DEFAULT_SCHEME_NAME"/>
+ <field name="hostname"/>
+ <field name="lcHostname"/>
+ <field name="port"/>
+ <field name="schemeName"/>
+ </class>
+ <class name="org/apache/http/HttpInetConnection" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpConnection"/>
+ <method name="getLocalAddress()Ljava/net/InetAddress;"/>
+ <method name="getLocalPort()I"/>
+ <method name="getRemoteAddress()Ljava/net/InetAddress;"/>
+ <method name="getRemotePort()I"/>
+ </class>
+ <class name="org/apache/http/HttpMessage" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="addHeader(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="addHeader(Lorg/apache/http/Header;)V"/>
+ <method name="containsHeader(Ljava/lang/String;)Z"/>
+ <method name="getAllHeaders()[Lorg/apache/http/Header;"/>
+ <method name="getFirstHeader(Ljava/lang/String;)Lorg/apache/http/Header;"/>
+ <method name="getHeaders(Ljava/lang/String;)[Lorg/apache/http/Header;"/>
+ <method name="getLastHeader(Ljava/lang/String;)Lorg/apache/http/Header;"/>
+ <method name="getParams()Lorg/apache/http/params/HttpParams;"/>
+ <method name="getProtocolVersion()Lorg/apache/http/ProtocolVersion;"/>
+ <method name="headerIterator()Lorg/apache/http/HeaderIterator;"/>
+ <method name="headerIterator(Ljava/lang/String;)Lorg/apache/http/HeaderIterator;"/>
+ <method name="removeHeader(Lorg/apache/http/Header;)V"/>
+ <method name="removeHeaders(Ljava/lang/String;)V"/>
+ <method name="setHeader(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="setHeader(Lorg/apache/http/Header;)V"/>
+ <method name="setHeaders([Lorg/apache/http/Header;)V"/>
+ <method name="setParams(Lorg/apache/http/params/HttpParams;)V"/>
+ </class>
+ <class name="org/apache/http/HttpRequest" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpMessage"/>
+ <method name="getRequestLine()Lorg/apache/http/RequestLine;"/>
+ </class>
+ <class name="org/apache/http/HttpRequestFactory" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="newHttpRequest(Ljava/lang/String;Ljava/lang/String;)Lorg/apache/http/HttpRequest;"/>
+ <method name="newHttpRequest(Lorg/apache/http/RequestLine;)Lorg/apache/http/HttpRequest;"/>
+ </class>
+ <class name="org/apache/http/HttpRequestInterceptor" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="process(Lorg/apache/http/HttpRequest;Lorg/apache/http/protocol/HttpContext;)V"/>
+ </class>
+ <class name="org/apache/http/HttpResponse" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpMessage"/>
+ <method name="getEntity()Lorg/apache/http/HttpEntity;"/>
+ <method name="getLocale()Ljava/util/Locale;"/>
+ <method name="getStatusLine()Lorg/apache/http/StatusLine;"/>
+ <method name="setEntity(Lorg/apache/http/HttpEntity;)V"/>
+ <method name="setLocale(Ljava/util/Locale;)V"/>
+ <method name="setReasonPhrase(Ljava/lang/String;)V"/>
+ <method name="setStatusCode(I)V"/>
+ <method name="setStatusLine(Lorg/apache/http/ProtocolVersion;I)V"/>
+ <method name="setStatusLine(Lorg/apache/http/ProtocolVersion;ILjava/lang/String;)V"/>
+ <method name="setStatusLine(Lorg/apache/http/StatusLine;)V"/>
+ </class>
+ <class name="org/apache/http/HttpResponseFactory" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="newHttpResponse(Lorg/apache/http/ProtocolVersion;ILorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpResponse;"/>
+ <method name="newHttpResponse(Lorg/apache/http/StatusLine;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpResponse;"/>
+ </class>
+ <class name="org/apache/http/HttpResponseInterceptor" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="process(Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)V"/>
+ </class>
+ <class name="org/apache/http/HttpServerConnection" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpConnection"/>
+ <method name="flush()V"/>
+ <method name="receiveRequestEntity(Lorg/apache/http/HttpEntityEnclosingRequest;)V"/>
+ <method name="receiveRequestHeader()Lorg/apache/http/HttpRequest;"/>
+ <method name="sendResponseEntity(Lorg/apache/http/HttpResponse;)V"/>
+ <method name="sendResponseHeader(Lorg/apache/http/HttpResponse;)V"/>
+ </class>
+ <class name="org/apache/http/HttpStatus" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <field name="SC_ACCEPTED"/>
+ <field name="SC_BAD_GATEWAY"/>
+ <field name="SC_BAD_REQUEST"/>
+ <field name="SC_CONFLICT"/>
+ <field name="SC_CONTINUE"/>
+ <field name="SC_CREATED"/>
+ <field name="SC_EXPECTATION_FAILED"/>
+ <field name="SC_FAILED_DEPENDENCY"/>
+ <field name="SC_FORBIDDEN"/>
+ <field name="SC_GATEWAY_TIMEOUT"/>
+ <field name="SC_GONE"/>
+ <field name="SC_HTTP_VERSION_NOT_SUPPORTED"/>
+ <field name="SC_INSUFFICIENT_SPACE_ON_RESOURCE"/>
+ <field name="SC_INSUFFICIENT_STORAGE"/>
+ <field name="SC_INTERNAL_SERVER_ERROR"/>
+ <field name="SC_LENGTH_REQUIRED"/>
+ <field name="SC_LOCKED"/>
+ <field name="SC_METHOD_FAILURE"/>
+ <field name="SC_METHOD_NOT_ALLOWED"/>
+ <field name="SC_MOVED_PERMANENTLY"/>
+ <field name="SC_MOVED_TEMPORARILY"/>
+ <field name="SC_MULTIPLE_CHOICES"/>
+ <field name="SC_MULTI_STATUS"/>
+ <field name="SC_NON_AUTHORITATIVE_INFORMATION"/>
+ <field name="SC_NOT_ACCEPTABLE"/>
+ <field name="SC_NOT_FOUND"/>
+ <field name="SC_NOT_IMPLEMENTED"/>
+ <field name="SC_NOT_MODIFIED"/>
+ <field name="SC_NO_CONTENT"/>
+ <field name="SC_OK"/>
+ <field name="SC_PARTIAL_CONTENT"/>
+ <field name="SC_PAYMENT_REQUIRED"/>
+ <field name="SC_PRECONDITION_FAILED"/>
+ <field name="SC_PROCESSING"/>
+ <field name="SC_PROXY_AUTHENTICATION_REQUIRED"/>
+ <field name="SC_REQUESTED_RANGE_NOT_SATISFIABLE"/>
+ <field name="SC_REQUEST_TIMEOUT"/>
+ <field name="SC_REQUEST_TOO_LONG"/>
+ <field name="SC_REQUEST_URI_TOO_LONG"/>
+ <field name="SC_RESET_CONTENT"/>
+ <field name="SC_SEE_OTHER"/>
+ <field name="SC_SERVICE_UNAVAILABLE"/>
+ <field name="SC_SWITCHING_PROTOCOLS"/>
+ <field name="SC_TEMPORARY_REDIRECT"/>
+ <field name="SC_UNAUTHORIZED"/>
+ <field name="SC_UNPROCESSABLE_ENTITY"/>
+ <field name="SC_UNSUPPORTED_MEDIA_TYPE"/>
+ <field name="SC_USE_PROXY"/>
+ </class>
+ <class name="org/apache/http/HttpVersion" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/ProtocolVersion"/>
+ <method name="&lt;init>(II)V"/>
+ <field name="HTTP"/>
+ <field name="HTTP_0_9"/>
+ <field name="HTTP_1_0"/>
+ <field name="HTTP_1_1"/>
+ </class>
+ <class name="org/apache/http/MalformedChunkCodingException" since="1" deprecated="22" removed="23">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/apache/http/MethodNotSupportedException" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/HttpException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="org/apache/http/NameValuePair" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getValue()Ljava/lang/String;"/>
+ </class>
+ <class name="org/apache/http/NoHttpResponseException" since="1" deprecated="22" removed="23">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/apache/http/ParseException" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/apache/http/ProtocolException" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/HttpException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="org/apache/http/ProtocolVersion" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>(Ljava/lang/String;II)V"/>
+ <method name="compareToVersion(Lorg/apache/http/ProtocolVersion;)I"/>
+ <method name="forVersion(II)Lorg/apache/http/ProtocolVersion;"/>
+ <method name="getMajor()I"/>
+ <method name="getMinor()I"/>
+ <method name="getProtocol()Ljava/lang/String;"/>
+ <method name="greaterEquals(Lorg/apache/http/ProtocolVersion;)Z"/>
+ <method name="isComparable(Lorg/apache/http/ProtocolVersion;)Z"/>
+ <method name="lessEquals(Lorg/apache/http/ProtocolVersion;)Z"/>
+ <field name="major"/>
+ <field name="minor"/>
+ <field name="protocol"/>
+ </class>
+ <class name="org/apache/http/ReasonPhraseCatalog" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="getReason(ILjava/util/Locale;)Ljava/lang/String;"/>
+ </class>
+ <class name="org/apache/http/RequestLine" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="getMethod()Ljava/lang/String;"/>
+ <method name="getProtocolVersion()Lorg/apache/http/ProtocolVersion;"/>
+ <method name="getUri()Ljava/lang/String;"/>
+ </class>
+ <class name="org/apache/http/StatusLine" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="getProtocolVersion()Lorg/apache/http/ProtocolVersion;"/>
+ <method name="getReasonPhrase()Ljava/lang/String;"/>
+ <method name="getStatusCode()I"/>
+ </class>
+ <class name="org/apache/http/TokenIterator" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/util/Iterator"/>
+ <method name="nextToken()Ljava/lang/String;"/>
+ </class>
+ <class name="org/apache/http/UnsupportedHttpVersionException" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/ProtocolException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/apache/http/auth/AUTH" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="PROXY_AUTH"/>
+ <field name="PROXY_AUTH_RESP"/>
+ <field name="WWW_AUTH"/>
+ <field name="WWW_AUTH_RESP"/>
+ </class>
+ <class name="org/apache/http/auth/AuthScheme" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="authenticate(Lorg/apache/http/auth/Credentials;Lorg/apache/http/HttpRequest;)Lorg/apache/http/Header;"/>
+ <method name="getParameter(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getRealm()Ljava/lang/String;"/>
+ <method name="getSchemeName()Ljava/lang/String;"/>
+ <method name="isComplete()Z"/>
+ <method name="isConnectionBased()Z"/>
+ <method name="processChallenge(Lorg/apache/http/Header;)V"/>
+ </class>
+ <class name="org/apache/http/auth/AuthSchemeFactory" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="newInstance(Lorg/apache/http/params/HttpParams;)Lorg/apache/http/auth/AuthScheme;"/>
+ </class>
+ <class name="org/apache/http/auth/AuthSchemeRegistry" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAuthScheme(Ljava/lang/String;Lorg/apache/http/params/HttpParams;)Lorg/apache/http/auth/AuthScheme;"/>
+ <method name="getSchemeNames()Ljava/util/List;"/>
+ <method name="register(Ljava/lang/String;Lorg/apache/http/auth/AuthSchemeFactory;)V"/>
+ <method name="setItems(Ljava/util/Map;)V"/>
+ <method name="unregister(Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/apache/http/auth/AuthScope" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;I)V"/>
+ <method name="&lt;init>(Ljava/lang/String;ILjava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Lorg/apache/http/auth/AuthScope;)V"/>
+ <method name="getHost()Ljava/lang/String;"/>
+ <method name="getPort()I"/>
+ <method name="getRealm()Ljava/lang/String;"/>
+ <method name="getScheme()Ljava/lang/String;"/>
+ <method name="match(Lorg/apache/http/auth/AuthScope;)I"/>
+ <field name="ANY"/>
+ <field name="ANY_HOST"/>
+ <field name="ANY_PORT"/>
+ <field name="ANY_REALM"/>
+ <field name="ANY_SCHEME"/>
+ </class>
+ <class name="org/apache/http/auth/AuthState" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAuthScheme()Lorg/apache/http/auth/AuthScheme;"/>
+ <method name="getAuthScope()Lorg/apache/http/auth/AuthScope;"/>
+ <method name="getCredentials()Lorg/apache/http/auth/Credentials;"/>
+ <method name="invalidate()V"/>
+ <method name="isValid()Z"/>
+ <method name="setAuthScheme(Lorg/apache/http/auth/AuthScheme;)V"/>
+ <method name="setAuthScope(Lorg/apache/http/auth/AuthScope;)V"/>
+ <method name="setCredentials(Lorg/apache/http/auth/Credentials;)V"/>
+ </class>
+ <class name="org/apache/http/auth/AuthenticationException" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/ProtocolException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="org/apache/http/auth/BasicUserPrincipal" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/Principal"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/apache/http/auth/Credentials" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="getPassword()Ljava/lang/String;"/>
+ <method name="getUserPrincipal()Ljava/security/Principal;"/>
+ </class>
+ <class name="org/apache/http/auth/InvalidCredentialsException" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/auth/AuthenticationException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="org/apache/http/auth/MalformedChallengeException" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/ProtocolException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="org/apache/http/auth/NTCredentials" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/auth/Credentials"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="getDomain()Ljava/lang/String;"/>
+ <method name="getUserName()Ljava/lang/String;"/>
+ <method name="getWorkstation()Ljava/lang/String;"/>
+ </class>
+ <class name="org/apache/http/auth/NTUserPrincipal" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/security/Principal"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="getDomain()Ljava/lang/String;"/>
+ <method name="getUsername()Ljava/lang/String;"/>
+ </class>
+ <class name="org/apache/http/auth/UsernamePasswordCredentials" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/auth/Credentials"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="getUserName()Ljava/lang/String;"/>
+ </class>
+ <class name="org/apache/http/auth/params/AuthPNames" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <field name="CREDENTIAL_CHARSET"/>
+ </class>
+ <class name="org/apache/http/auth/params/AuthParamBean" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/params/HttpAbstractParamBean"/>
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;)V"/>
+ <method name="setCredentialCharset(Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/apache/http/auth/params/AuthParams" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCredentialCharset(Lorg/apache/http/params/HttpParams;)Ljava/lang/String;"/>
+ <method name="setCredentialCharset(Lorg/apache/http/params/HttpParams;Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/apache/http/client/AuthenticationHandler" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="getChallenges(Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)Ljava/util/Map;"/>
+ <method name="isAuthenticationRequested(Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)Z"/>
+ <method name="selectScheme(Ljava/util/Map;Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/auth/AuthScheme;"/>
+ </class>
+ <class name="org/apache/http/client/CircularRedirectException" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/client/RedirectException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="org/apache/http/client/ClientProtocolException" since="1" deprecated="22" removed="23">
+ <extends name="java/io/IOException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="org/apache/http/client/CookieStore" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="addCookie(Lorg/apache/http/cookie/Cookie;)V"/>
+ <method name="clear()V"/>
+ <method name="clearExpired(Ljava/util/Date;)Z"/>
+ <method name="getCookies()Ljava/util/List;"/>
+ </class>
+ <class name="org/apache/http/client/CredentialsProvider" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="clear()V"/>
+ <method name="getCredentials(Lorg/apache/http/auth/AuthScope;)Lorg/apache/http/auth/Credentials;"/>
+ <method name="setCredentials(Lorg/apache/http/auth/AuthScope;Lorg/apache/http/auth/Credentials;)V"/>
+ </class>
+ <class name="org/apache/http/client/HttpClient" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="execute(Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;)Lorg/apache/http/HttpResponse;"/>
+ <method name="execute(Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;Lorg/apache/http/client/ResponseHandler;)Ljava/lang/Object;"/>
+ <method name="execute(Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;Lorg/apache/http/client/ResponseHandler;Lorg/apache/http/protocol/HttpContext;)Ljava/lang/Object;"/>
+ <method name="execute(Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpResponse;"/>
+ <method name="execute(Lorg/apache/http/client/methods/HttpUriRequest;)Lorg/apache/http/HttpResponse;"/>
+ <method name="execute(Lorg/apache/http/client/methods/HttpUriRequest;Lorg/apache/http/client/ResponseHandler;)Ljava/lang/Object;"/>
+ <method name="execute(Lorg/apache/http/client/methods/HttpUriRequest;Lorg/apache/http/client/ResponseHandler;Lorg/apache/http/protocol/HttpContext;)Ljava/lang/Object;"/>
+ <method name="execute(Lorg/apache/http/client/methods/HttpUriRequest;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpResponse;"/>
+ <method name="getConnectionManager()Lorg/apache/http/conn/ClientConnectionManager;"/>
+ <method name="getParams()Lorg/apache/http/params/HttpParams;"/>
+ </class>
+ <class name="org/apache/http/client/HttpRequestRetryHandler" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="retryRequest(Ljava/io/IOException;ILorg/apache/http/protocol/HttpContext;)Z"/>
+ </class>
+ <class name="org/apache/http/client/HttpResponseException" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/client/ClientProtocolException"/>
+ <method name="&lt;init>(ILjava/lang/String;)V"/>
+ <method name="getStatusCode()I"/>
+ </class>
+ <class name="org/apache/http/client/NonRepeatableRequestException" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/ProtocolException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/apache/http/client/RedirectException" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/ProtocolException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="org/apache/http/client/RedirectHandler" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="getLocationURI(Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)Ljava/net/URI;"/>
+ <method name="isRedirectRequested(Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)Z"/>
+ </class>
+ <class name="org/apache/http/client/RequestDirector" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="execute(Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpResponse;"/>
+ </class>
+ <class name="org/apache/http/client/ResponseHandler" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="handleResponse(Lorg/apache/http/HttpResponse;)Ljava/lang/Object;"/>
+ </class>
+ <class name="org/apache/http/client/UserTokenHandler" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="getUserToken(Lorg/apache/http/protocol/HttpContext;)Ljava/lang/Object;"/>
+ </class>
+ <class name="org/apache/http/client/entity/UrlEncodedFormEntity" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/entity/StringEntity"/>
+ <method name="&lt;init>(Ljava/util/List;)V"/>
+ <method name="&lt;init>(Ljava/util/List;Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/apache/http/client/methods/AbortableHttpRequest" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="abort()V"/>
+ <method name="setConnectionRequest(Lorg/apache/http/conn/ClientConnectionRequest;)V"/>
+ <method name="setReleaseTrigger(Lorg/apache/http/conn/ConnectionReleaseTrigger;)V"/>
+ </class>
+ <class name="org/apache/http/client/methods/HttpDelete" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/client/methods/HttpRequestBase"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/net/URI;)V"/>
+ <field name="METHOD_NAME"/>
+ </class>
+ <class name="org/apache/http/client/methods/HttpEntityEnclosingRequestBase" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/client/methods/HttpRequestBase"/>
+ <implements name="org/apache/http/HttpEntityEnclosingRequest"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/client/methods/HttpGet" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/client/methods/HttpRequestBase"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/net/URI;)V"/>
+ <field name="METHOD_NAME"/>
+ </class>
+ <class name="org/apache/http/client/methods/HttpHead" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/client/methods/HttpRequestBase"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/net/URI;)V"/>
+ <field name="METHOD_NAME"/>
+ </class>
+ <class name="org/apache/http/client/methods/HttpOptions" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/client/methods/HttpRequestBase"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/net/URI;)V"/>
+ <method name="getAllowedMethods(Lorg/apache/http/HttpResponse;)Ljava/util/Set;"/>
+ <field name="METHOD_NAME"/>
+ </class>
+ <class name="org/apache/http/client/methods/HttpPost" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/client/methods/HttpEntityEnclosingRequestBase"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/net/URI;)V"/>
+ <field name="METHOD_NAME"/>
+ </class>
+ <class name="org/apache/http/client/methods/HttpPut" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/client/methods/HttpEntityEnclosingRequestBase"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/net/URI;)V"/>
+ <field name="METHOD_NAME"/>
+ </class>
+ <class name="org/apache/http/client/methods/HttpRequestBase" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/message/AbstractHttpMessage"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="org/apache/http/client/methods/AbortableHttpRequest"/>
+ <implements name="org/apache/http/client/methods/HttpUriRequest"/>
+ <method name="&lt;init>()V"/>
+ <method name="setURI(Ljava/net/URI;)V"/>
+ </class>
+ <class name="org/apache/http/client/methods/HttpTrace" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/client/methods/HttpRequestBase"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/net/URI;)V"/>
+ <field name="METHOD_NAME"/>
+ </class>
+ <class name="org/apache/http/client/methods/HttpUriRequest" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpRequest"/>
+ <method name="abort()V"/>
+ <method name="getMethod()Ljava/lang/String;"/>
+ <method name="getURI()Ljava/net/URI;"/>
+ <method name="isAborted()Z"/>
+ </class>
+ <class name="org/apache/http/client/params/AllClientPNames" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/auth/params/AuthPNames"/>
+ <implements name="org/apache/http/client/params/ClientPNames"/>
+ <implements name="org/apache/http/conn/params/ConnConnectionPNames"/>
+ <implements name="org/apache/http/conn/params/ConnManagerPNames"/>
+ <implements name="org/apache/http/conn/params/ConnRoutePNames"/>
+ <implements name="org/apache/http/cookie/params/CookieSpecPNames"/>
+ <implements name="org/apache/http/params/CoreConnectionPNames"/>
+ <implements name="org/apache/http/params/CoreProtocolPNames"/>
+ </class>
+ <class name="org/apache/http/client/params/AuthPolicy" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="BASIC"/>
+ <field name="DIGEST"/>
+ <field name="NTLM"/>
+ </class>
+ <class name="org/apache/http/client/params/ClientPNames" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <field name="ALLOW_CIRCULAR_REDIRECTS"/>
+ <field name="CONNECTION_MANAGER_FACTORY"/>
+ <field name="CONNECTION_MANAGER_FACTORY_CLASS_NAME"/>
+ <field name="COOKIE_POLICY"/>
+ <field name="DEFAULT_HEADERS"/>
+ <field name="DEFAULT_HOST"/>
+ <field name="HANDLE_AUTHENTICATION"/>
+ <field name="HANDLE_REDIRECTS"/>
+ <field name="MAX_REDIRECTS"/>
+ <field name="REJECT_RELATIVE_REDIRECT"/>
+ <field name="VIRTUAL_HOST"/>
+ </class>
+ <class name="org/apache/http/client/params/ClientParamBean" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/params/HttpAbstractParamBean"/>
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;)V"/>
+ <method name="setAllowCircularRedirects(Z)V"/>
+ <method name="setConnectionManagerFactory(Lorg/apache/http/conn/ClientConnectionManagerFactory;)V"/>
+ <method name="setConnectionManagerFactoryClassName(Ljava/lang/String;)V"/>
+ <method name="setCookiePolicy(Ljava/lang/String;)V"/>
+ <method name="setDefaultHeaders(Ljava/util/Collection;)V"/>
+ <method name="setDefaultHost(Lorg/apache/http/HttpHost;)V"/>
+ <method name="setHandleAuthentication(Z)V"/>
+ <method name="setHandleRedirects(Z)V"/>
+ <method name="setMaxRedirects(I)V"/>
+ <method name="setRejectRelativeRedirect(Z)V"/>
+ <method name="setVirtualHost(Lorg/apache/http/HttpHost;)V"/>
+ </class>
+ <class name="org/apache/http/client/params/CookiePolicy" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <field name="BEST_MATCH"/>
+ <field name="BROWSER_COMPATIBILITY"/>
+ <field name="NETSCAPE"/>
+ <field name="RFC_2109"/>
+ <field name="RFC_2965"/>
+ </class>
+ <class name="org/apache/http/client/params/HttpClientParams" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCookiePolicy(Lorg/apache/http/params/HttpParams;)Ljava/lang/String;"/>
+ <method name="isAuthenticating(Lorg/apache/http/params/HttpParams;)Z"/>
+ <method name="isRedirecting(Lorg/apache/http/params/HttpParams;)Z"/>
+ <method name="setAuthenticating(Lorg/apache/http/params/HttpParams;Z)V"/>
+ <method name="setCookiePolicy(Lorg/apache/http/params/HttpParams;Ljava/lang/String;)V"/>
+ <method name="setRedirecting(Lorg/apache/http/params/HttpParams;Z)V"/>
+ </class>
+ <class name="org/apache/http/client/protocol/ClientContext" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <field name="AUTHSCHEME_REGISTRY"/>
+ <field name="AUTH_SCHEME_PREF"/>
+ <field name="COOKIESPEC_REGISTRY"/>
+ <field name="COOKIE_ORIGIN"/>
+ <field name="COOKIE_SPEC"/>
+ <field name="COOKIE_STORE"/>
+ <field name="CREDS_PROVIDER"/>
+ <field name="PROXY_AUTH_STATE"/>
+ <field name="TARGET_AUTH_STATE"/>
+ <field name="USER_TOKEN"/>
+ </class>
+ <class name="org/apache/http/client/protocol/ClientContextConfigurer" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/client/protocol/ClientContext"/>
+ <method name="&lt;init>(Lorg/apache/http/protocol/HttpContext;)V"/>
+ <method name="setAuthSchemePref(Ljava/util/List;)V"/>
+ <method name="setAuthSchemeRegistry(Lorg/apache/http/auth/AuthSchemeRegistry;)V"/>
+ <method name="setCookieSpecRegistry(Lorg/apache/http/cookie/CookieSpecRegistry;)V"/>
+ <method name="setCookieStore(Lorg/apache/http/client/CookieStore;)V"/>
+ <method name="setCredentialsProvider(Lorg/apache/http/client/CredentialsProvider;)V"/>
+ </class>
+ <class name="org/apache/http/client/protocol/RequestAddCookies" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpRequestInterceptor"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/client/protocol/RequestDefaultHeaders" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpRequestInterceptor"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/client/protocol/RequestProxyAuthentication" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpRequestInterceptor"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/client/protocol/RequestTargetAuthentication" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpRequestInterceptor"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/client/protocol/ResponseProcessCookies" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpResponseInterceptor"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/client/utils/CloneUtils" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="clone(Ljava/lang/Object;)Ljava/lang/Object;"/>
+ </class>
+ <class name="org/apache/http/client/utils/URIUtils" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="createURI(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/net/URI;"/>
+ <method name="resolve(Ljava/net/URI;Ljava/lang/String;)Ljava/net/URI;"/>
+ <method name="resolve(Ljava/net/URI;Ljava/net/URI;)Ljava/net/URI;"/>
+ <method name="rewriteURI(Ljava/net/URI;Lorg/apache/http/HttpHost;)Ljava/net/URI;"/>
+ <method name="rewriteURI(Ljava/net/URI;Lorg/apache/http/HttpHost;Z)Ljava/net/URI;"/>
+ </class>
+ <class name="org/apache/http/client/utils/URLEncodedUtils" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="format(Ljava/util/List;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="isEncoded(Lorg/apache/http/HttpEntity;)Z"/>
+ <method name="parse(Ljava/net/URI;Ljava/lang/String;)Ljava/util/List;"/>
+ <method name="parse(Ljava/util/List;Ljava/util/Scanner;Ljava/lang/String;)V"/>
+ <method name="parse(Lorg/apache/http/HttpEntity;)Ljava/util/List;"/>
+ <field name="CONTENT_TYPE"/>
+ </class>
+ <class name="org/apache/http/conn/BasicEofSensorWatcher" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/conn/EofSensorWatcher"/>
+ <method name="&lt;init>(Lorg/apache/http/conn/ManagedClientConnection;Z)V"/>
+ <field name="attemptReuse"/>
+ <field name="managedConn"/>
+ </class>
+ <class name="org/apache/http/conn/BasicManagedEntity" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/entity/HttpEntityWrapper"/>
+ <implements name="org/apache/http/conn/ConnectionReleaseTrigger"/>
+ <implements name="org/apache/http/conn/EofSensorWatcher"/>
+ <method name="&lt;init>(Lorg/apache/http/HttpEntity;Lorg/apache/http/conn/ManagedClientConnection;Z)V"/>
+ <method name="releaseManagedConnection()V"/>
+ <field name="attemptReuse"/>
+ <field name="managedConn"/>
+ </class>
+ <class name="org/apache/http/conn/ClientConnectionManager" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="closeExpiredConnections()V"/>
+ <method name="closeIdleConnections(JLjava/util/concurrent/TimeUnit;)V"/>
+ <method name="getSchemeRegistry()Lorg/apache/http/conn/scheme/SchemeRegistry;"/>
+ <method name="releaseConnection(Lorg/apache/http/conn/ManagedClientConnection;JLjava/util/concurrent/TimeUnit;)V"/>
+ <method name="requestConnection(Lorg/apache/http/conn/routing/HttpRoute;Ljava/lang/Object;)Lorg/apache/http/conn/ClientConnectionRequest;"/>
+ <method name="shutdown()V"/>
+ </class>
+ <class name="org/apache/http/conn/ClientConnectionManagerFactory" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="newInstance(Lorg/apache/http/params/HttpParams;Lorg/apache/http/conn/scheme/SchemeRegistry;)Lorg/apache/http/conn/ClientConnectionManager;"/>
+ </class>
+ <class name="org/apache/http/conn/ClientConnectionOperator" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="createConnection()Lorg/apache/http/conn/OperatedClientConnection;"/>
+ <method name="openConnection(Lorg/apache/http/conn/OperatedClientConnection;Lorg/apache/http/HttpHost;Ljava/net/InetAddress;Lorg/apache/http/protocol/HttpContext;Lorg/apache/http/params/HttpParams;)V"/>
+ <method name="updateSecureConnection(Lorg/apache/http/conn/OperatedClientConnection;Lorg/apache/http/HttpHost;Lorg/apache/http/protocol/HttpContext;Lorg/apache/http/params/HttpParams;)V"/>
+ </class>
+ <class name="org/apache/http/conn/ClientConnectionRequest" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="abortRequest()V"/>
+ <method name="getConnection(JLjava/util/concurrent/TimeUnit;)Lorg/apache/http/conn/ManagedClientConnection;"/>
+ </class>
+ <class name="org/apache/http/conn/ConnectTimeoutException" since="1" deprecated="22">
+ <extends name="java/io/InterruptedIOException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/apache/http/conn/ConnectionKeepAliveStrategy" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="getKeepAliveDuration(Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)J"/>
+ </class>
+ <class name="org/apache/http/conn/ConnectionPoolTimeoutException" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/conn/ConnectTimeoutException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/apache/http/conn/ConnectionReleaseTrigger" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="abortConnection()V"/>
+ <method name="releaseConnection()V"/>
+ </class>
+ <class name="org/apache/http/conn/EofSensorInputStream" since="1" deprecated="22" removed="23">
+ <extends name="java/io/InputStream"/>
+ <implements name="org/apache/http/conn/ConnectionReleaseTrigger"/>
+ <method name="&lt;init>(Ljava/io/InputStream;Lorg/apache/http/conn/EofSensorWatcher;)V"/>
+ <method name="checkAbort()V"/>
+ <method name="checkClose()V"/>
+ <method name="checkEOF(I)V"/>
+ <method name="isReadAllowed()Z"/>
+ <field name="wrappedStream"/>
+ </class>
+ <class name="org/apache/http/conn/EofSensorWatcher" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="eofDetected(Ljava/io/InputStream;)Z"/>
+ <method name="streamAbort(Ljava/io/InputStream;)Z"/>
+ <method name="streamClosed(Ljava/io/InputStream;)Z"/>
+ </class>
+ <class name="org/apache/http/conn/HttpHostConnectException" since="1" deprecated="22" removed="23">
+ <extends name="java/net/ConnectException"/>
+ <method name="&lt;init>(Lorg/apache/http/HttpHost;Ljava/net/ConnectException;)V"/>
+ <method name="getHost()Lorg/apache/http/HttpHost;"/>
+ </class>
+ <class name="org/apache/http/conn/ManagedClientConnection" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpClientConnection"/>
+ <implements name="org/apache/http/HttpInetConnection"/>
+ <implements name="org/apache/http/conn/ConnectionReleaseTrigger"/>
+ <method name="getRoute()Lorg/apache/http/conn/routing/HttpRoute;"/>
+ <method name="getSSLSession()Ljavax/net/ssl/SSLSession;"/>
+ <method name="getState()Ljava/lang/Object;"/>
+ <method name="isMarkedReusable()Z"/>
+ <method name="isSecure()Z"/>
+ <method name="layerProtocol(Lorg/apache/http/protocol/HttpContext;Lorg/apache/http/params/HttpParams;)V"/>
+ <method name="markReusable()V"/>
+ <method name="open(Lorg/apache/http/conn/routing/HttpRoute;Lorg/apache/http/protocol/HttpContext;Lorg/apache/http/params/HttpParams;)V"/>
+ <method name="setIdleDuration(JLjava/util/concurrent/TimeUnit;)V"/>
+ <method name="setState(Ljava/lang/Object;)V"/>
+ <method name="tunnelProxy(Lorg/apache/http/HttpHost;ZLorg/apache/http/params/HttpParams;)V"/>
+ <method name="tunnelTarget(ZLorg/apache/http/params/HttpParams;)V"/>
+ <method name="unmarkReusable()V"/>
+ </class>
+ <class name="org/apache/http/conn/MultihomePlainSocketFactory" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/conn/scheme/SocketFactory"/>
+ <method name="&lt;init>()V"/>
+ <method name="getSocketFactory()Lorg/apache/http/conn/MultihomePlainSocketFactory;"/>
+ </class>
+ <class name="org/apache/http/conn/OperatedClientConnection" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpClientConnection"/>
+ <implements name="org/apache/http/HttpInetConnection"/>
+ <method name="getSocket()Ljava/net/Socket;"/>
+ <method name="getTargetHost()Lorg/apache/http/HttpHost;"/>
+ <method name="isSecure()Z"/>
+ <method name="openCompleted(ZLorg/apache/http/params/HttpParams;)V"/>
+ <method name="opening(Ljava/net/Socket;Lorg/apache/http/HttpHost;)V"/>
+ <method name="update(Ljava/net/Socket;Lorg/apache/http/HttpHost;ZLorg/apache/http/params/HttpParams;)V"/>
+ </class>
+ <class name="org/apache/http/conn/params/ConnConnectionPNames" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <field name="MAX_STATUS_LINE_GARBAGE"/>
+ </class>
+ <class name="org/apache/http/conn/params/ConnConnectionParamBean" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/params/HttpAbstractParamBean"/>
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;)V"/>
+ <method name="setMaxStatusLineGarbage(I)V"/>
+ </class>
+ <class name="org/apache/http/conn/params/ConnManagerPNames" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <field name="MAX_CONNECTIONS_PER_ROUTE"/>
+ <field name="MAX_TOTAL_CONNECTIONS"/>
+ <field name="TIMEOUT"/>
+ </class>
+ <class name="org/apache/http/conn/params/ConnManagerParamBean" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/params/HttpAbstractParamBean"/>
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;)V"/>
+ <method name="setConnectionsPerRoute(Lorg/apache/http/conn/params/ConnPerRouteBean;)V"/>
+ <method name="setMaxTotalConnections(I)V"/>
+ <method name="setTimeout(J)V"/>
+ </class>
+ <class name="org/apache/http/conn/params/ConnManagerParams" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/conn/params/ConnManagerPNames"/>
+ <method name="&lt;init>()V"/>
+ <method name="getMaxConnectionsPerRoute(Lorg/apache/http/params/HttpParams;)Lorg/apache/http/conn/params/ConnPerRoute;"/>
+ <method name="getMaxTotalConnections(Lorg/apache/http/params/HttpParams;)I"/>
+ <method name="getTimeout(Lorg/apache/http/params/HttpParams;)J"/>
+ <method name="setMaxConnectionsPerRoute(Lorg/apache/http/params/HttpParams;Lorg/apache/http/conn/params/ConnPerRoute;)V"/>
+ <method name="setMaxTotalConnections(Lorg/apache/http/params/HttpParams;I)V"/>
+ <method name="setTimeout(Lorg/apache/http/params/HttpParams;J)V"/>
+ <field name="DEFAULT_MAX_TOTAL_CONNECTIONS"/>
+ </class>
+ <class name="org/apache/http/conn/params/ConnPerRoute" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="getMaxForRoute(Lorg/apache/http/conn/routing/HttpRoute;)I"/>
+ </class>
+ <class name="org/apache/http/conn/params/ConnPerRouteBean" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/conn/params/ConnPerRoute"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="getDefaultMax()I"/>
+ <method name="setDefaultMaxPerRoute(I)V"/>
+ <method name="setMaxForRoute(Lorg/apache/http/conn/routing/HttpRoute;I)V"/>
+ <method name="setMaxForRoutes(Ljava/util/Map;)V"/>
+ <field name="DEFAULT_MAX_CONNECTIONS_PER_ROUTE"/>
+ </class>
+ <class name="org/apache/http/conn/params/ConnRoutePNames" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <field name="DEFAULT_PROXY"/>
+ <field name="FORCED_ROUTE"/>
+ <field name="LOCAL_ADDRESS"/>
+ </class>
+ <class name="org/apache/http/conn/params/ConnRouteParamBean" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/params/HttpAbstractParamBean"/>
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;)V"/>
+ <method name="setDefaultProxy(Lorg/apache/http/HttpHost;)V"/>
+ <method name="setForcedRoute(Lorg/apache/http/conn/routing/HttpRoute;)V"/>
+ <method name="setLocalAddress(Ljava/net/InetAddress;)V"/>
+ </class>
+ <class name="org/apache/http/conn/params/ConnRouteParams" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/conn/params/ConnRoutePNames"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDefaultProxy(Lorg/apache/http/params/HttpParams;)Lorg/apache/http/HttpHost;"/>
+ <method name="getForcedRoute(Lorg/apache/http/params/HttpParams;)Lorg/apache/http/conn/routing/HttpRoute;"/>
+ <method name="getLocalAddress(Lorg/apache/http/params/HttpParams;)Ljava/net/InetAddress;"/>
+ <method name="setDefaultProxy(Lorg/apache/http/params/HttpParams;Lorg/apache/http/HttpHost;)V"/>
+ <method name="setForcedRoute(Lorg/apache/http/params/HttpParams;Lorg/apache/http/conn/routing/HttpRoute;)V"/>
+ <method name="setLocalAddress(Lorg/apache/http/params/HttpParams;Ljava/net/InetAddress;)V"/>
+ <field name="NO_HOST"/>
+ <field name="NO_ROUTE"/>
+ </class>
+ <class name="org/apache/http/conn/routing/BasicRouteDirector" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/conn/routing/HttpRouteDirector"/>
+ <method name="&lt;init>()V"/>
+ <method name="directStep(Lorg/apache/http/conn/routing/RouteInfo;Lorg/apache/http/conn/routing/RouteInfo;)I"/>
+ <method name="firstStep(Lorg/apache/http/conn/routing/RouteInfo;)I"/>
+ <method name="proxiedStep(Lorg/apache/http/conn/routing/RouteInfo;Lorg/apache/http/conn/routing/RouteInfo;)I"/>
+ </class>
+ <class name="org/apache/http/conn/routing/HttpRoute" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="org/apache/http/conn/routing/RouteInfo"/>
+ <method name="&lt;init>(Lorg/apache/http/HttpHost;)V"/>
+ <method name="&lt;init>(Lorg/apache/http/HttpHost;Ljava/net/InetAddress;Lorg/apache/http/HttpHost;Z)V"/>
+ <method name="&lt;init>(Lorg/apache/http/HttpHost;Ljava/net/InetAddress;Lorg/apache/http/HttpHost;ZLorg/apache/http/conn/routing/RouteInfo$TunnelType;Lorg/apache/http/conn/routing/RouteInfo$LayerType;)V"/>
+ <method name="&lt;init>(Lorg/apache/http/HttpHost;Ljava/net/InetAddress;Z)V"/>
+ <method name="&lt;init>(Lorg/apache/http/HttpHost;Ljava/net/InetAddress;[Lorg/apache/http/HttpHost;ZLorg/apache/http/conn/routing/RouteInfo$TunnelType;Lorg/apache/http/conn/routing/RouteInfo$LayerType;)V"/>
+ </class>
+ <class name="org/apache/http/conn/routing/HttpRouteDirector" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="nextStep(Lorg/apache/http/conn/routing/RouteInfo;Lorg/apache/http/conn/routing/RouteInfo;)I"/>
+ <field name="COMPLETE"/>
+ <field name="CONNECT_PROXY"/>
+ <field name="CONNECT_TARGET"/>
+ <field name="LAYER_PROTOCOL"/>
+ <field name="TUNNEL_PROXY"/>
+ <field name="TUNNEL_TARGET"/>
+ <field name="UNREACHABLE"/>
+ </class>
+ <class name="org/apache/http/conn/routing/HttpRoutePlanner" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="determineRoute(Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/conn/routing/HttpRoute;"/>
+ </class>
+ <class name="org/apache/http/conn/routing/RouteInfo" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="getHopCount()I"/>
+ <method name="getHopTarget(I)Lorg/apache/http/HttpHost;"/>
+ <method name="getLayerType()Lorg/apache/http/conn/routing/RouteInfo$LayerType;"/>
+ <method name="getLocalAddress()Ljava/net/InetAddress;"/>
+ <method name="getProxyHost()Lorg/apache/http/HttpHost;"/>
+ <method name="getTargetHost()Lorg/apache/http/HttpHost;"/>
+ <method name="getTunnelType()Lorg/apache/http/conn/routing/RouteInfo$TunnelType;"/>
+ <method name="isLayered()Z"/>
+ <method name="isSecure()Z"/>
+ <method name="isTunnelled()Z"/>
+ </class>
+ <class name="org/apache/http/conn/routing/RouteInfo$LayerType" since="1" removed="23">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Lorg/apache/http/conn/routing/RouteInfo$LayerType;"/>
+ <method name="values()[Lorg/apache/http/conn/routing/RouteInfo$LayerType;"/>
+ <field name="LAYERED"/>
+ <field name="PLAIN"/>
+ </class>
+ <class name="org/apache/http/conn/routing/RouteInfo$TunnelType" since="1" removed="23">
+ <extends name="java/lang/Enum"/>
+ <method name="valueOf(Ljava/lang/String;)Lorg/apache/http/conn/routing/RouteInfo$TunnelType;"/>
+ <method name="values()[Lorg/apache/http/conn/routing/RouteInfo$TunnelType;"/>
+ <field name="PLAIN"/>
+ <field name="TUNNELLED"/>
+ </class>
+ <class name="org/apache/http/conn/routing/RouteTracker" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="org/apache/http/conn/routing/RouteInfo"/>
+ <method name="&lt;init>(Lorg/apache/http/HttpHost;Ljava/net/InetAddress;)V"/>
+ <method name="&lt;init>(Lorg/apache/http/conn/routing/HttpRoute;)V"/>
+ <method name="connectProxy(Lorg/apache/http/HttpHost;Z)V"/>
+ <method name="connectTarget(Z)V"/>
+ <method name="isConnected()Z"/>
+ <method name="layerProtocol(Z)V"/>
+ <method name="toRoute()Lorg/apache/http/conn/routing/HttpRoute;"/>
+ <method name="tunnelProxy(Lorg/apache/http/HttpHost;Z)V"/>
+ <method name="tunnelTarget(Z)V"/>
+ </class>
+ <class name="org/apache/http/conn/scheme/HostNameResolver" since="1" deprecated="22">
+ <extends name="java/lang/Object"/>
+ <method name="resolve(Ljava/lang/String;)Ljava/net/InetAddress;"/>
+ </class>
+ <class name="org/apache/http/conn/scheme/LayeredSocketFactory" since="1" deprecated="22">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/conn/scheme/SocketFactory"/>
+ <method name="createSocket(Ljava/net/Socket;Ljava/lang/String;IZ)Ljava/net/Socket;"/>
+ </class>
+ <class name="org/apache/http/conn/scheme/PlainSocketFactory" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/conn/scheme/SocketFactory"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Lorg/apache/http/conn/scheme/HostNameResolver;)V"/>
+ <method name="getSocketFactory()Lorg/apache/http/conn/scheme/PlainSocketFactory;"/>
+ </class>
+ <class name="org/apache/http/conn/scheme/Scheme" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;Lorg/apache/http/conn/scheme/SocketFactory;I)V"/>
+ <method name="getDefaultPort()I"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getSocketFactory()Lorg/apache/http/conn/scheme/SocketFactory;"/>
+ <method name="isLayered()Z"/>
+ <method name="resolvePort(I)I"/>
+ </class>
+ <class name="org/apache/http/conn/scheme/SchemeRegistry" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="get(Ljava/lang/String;)Lorg/apache/http/conn/scheme/Scheme;"/>
+ <method name="getScheme(Ljava/lang/String;)Lorg/apache/http/conn/scheme/Scheme;"/>
+ <method name="getScheme(Lorg/apache/http/HttpHost;)Lorg/apache/http/conn/scheme/Scheme;"/>
+ <method name="getSchemeNames()Ljava/util/List;"/>
+ <method name="register(Lorg/apache/http/conn/scheme/Scheme;)Lorg/apache/http/conn/scheme/Scheme;"/>
+ <method name="setItems(Ljava/util/Map;)V"/>
+ <method name="unregister(Ljava/lang/String;)Lorg/apache/http/conn/scheme/Scheme;"/>
+ </class>
+ <class name="org/apache/http/conn/scheme/SocketFactory" since="1" deprecated="22">
+ <extends name="java/lang/Object"/>
+ <method name="connectSocket(Ljava/net/Socket;Ljava/lang/String;ILjava/net/InetAddress;ILorg/apache/http/params/HttpParams;)Ljava/net/Socket;"/>
+ <method name="createSocket()Ljava/net/Socket;"/>
+ <method name="isSecure(Ljava/net/Socket;)Z"/>
+ </class>
+ <class name="org/apache/http/conn/ssl/AbstractVerifier" since="1" deprecated="22">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/conn/ssl/X509HostnameVerifier"/>
+ <method name="&lt;init>()V"/>
+ <method name="acceptableCountryWildcard(Ljava/lang/String;)Z"/>
+ <method name="countDots(Ljava/lang/String;)I"/>
+ <method name="getCNs(Ljava/security/cert/X509Certificate;)[Ljava/lang/String;"/>
+ <method name="getDNSSubjectAlts(Ljava/security/cert/X509Certificate;)[Ljava/lang/String;"/>
+ <method name="verify(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;Z)V"/>
+ </class>
+ <class name="org/apache/http/conn/ssl/AllowAllHostnameVerifier" since="1" deprecated="22">
+ <extends name="org/apache/http/conn/ssl/AbstractVerifier"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/conn/ssl/BrowserCompatHostnameVerifier" since="1" deprecated="22">
+ <extends name="org/apache/http/conn/ssl/AbstractVerifier"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/conn/ssl/SSLSocketFactory" since="1" deprecated="22">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/conn/scheme/LayeredSocketFactory"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/security/KeyStore;Ljava/lang/String;Ljava/security/KeyStore;Ljava/security/SecureRandom;Lorg/apache/http/conn/scheme/HostNameResolver;)V"/>
+ <method name="&lt;init>(Ljava/security/KeyStore;)V"/>
+ <method name="&lt;init>(Ljava/security/KeyStore;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/security/KeyStore;Ljava/lang/String;Ljava/security/KeyStore;)V"/>
+ <method name="getHostnameVerifier()Lorg/apache/http/conn/ssl/X509HostnameVerifier;"/>
+ <method name="getSocketFactory()Lorg/apache/http/conn/ssl/SSLSocketFactory;"/>
+ <method name="setHostnameVerifier(Lorg/apache/http/conn/ssl/X509HostnameVerifier;)V"/>
+ <field name="ALLOW_ALL_HOSTNAME_VERIFIER"/>
+ <field name="BROWSER_COMPATIBLE_HOSTNAME_VERIFIER"/>
+ <field name="SSL"/>
+ <field name="SSLV2"/>
+ <field name="STRICT_HOSTNAME_VERIFIER"/>
+ <field name="TLS"/>
+ </class>
+ <class name="org/apache/http/conn/ssl/StrictHostnameVerifier" since="1" deprecated="22">
+ <extends name="org/apache/http/conn/ssl/AbstractVerifier"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/conn/ssl/X509HostnameVerifier" since="1" deprecated="22">
+ <extends name="java/lang/Object"/>
+ <implements name="javax/net/ssl/HostnameVerifier"/>
+ <method name="verify(Ljava/lang/String;Ljava/security/cert/X509Certificate;)V"/>
+ <method name="verify(Ljava/lang/String;Ljavax/net/ssl/SSLSocket;)V"/>
+ <method name="verify(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/apache/http/conn/util/InetAddressUtils" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="isIPv4Address(Ljava/lang/String;)Z"/>
+ <method name="isIPv6Address(Ljava/lang/String;)Z"/>
+ <method name="isIPv6HexCompressedAddress(Ljava/lang/String;)Z"/>
+ <method name="isIPv6StdAddress(Ljava/lang/String;)Z"/>
+ </class>
+ <class name="org/apache/http/cookie/ClientCookie" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/cookie/Cookie"/>
+ <method name="containsAttribute(Ljava/lang/String;)Z"/>
+ <method name="getAttribute(Ljava/lang/String;)Ljava/lang/String;"/>
+ <field name="COMMENTURL_ATTR"/>
+ <field name="COMMENT_ATTR"/>
+ <field name="DISCARD_ATTR"/>
+ <field name="DOMAIN_ATTR"/>
+ <field name="EXPIRES_ATTR"/>
+ <field name="MAX_AGE_ATTR"/>
+ <field name="PATH_ATTR"/>
+ <field name="PORT_ATTR"/>
+ <field name="SECURE_ATTR"/>
+ <field name="VERSION_ATTR"/>
+ </class>
+ <class name="org/apache/http/cookie/Cookie" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="getComment()Ljava/lang/String;"/>
+ <method name="getCommentURL()Ljava/lang/String;"/>
+ <method name="getDomain()Ljava/lang/String;"/>
+ <method name="getExpiryDate()Ljava/util/Date;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getPath()Ljava/lang/String;"/>
+ <method name="getPorts()[I"/>
+ <method name="getValue()Ljava/lang/String;"/>
+ <method name="getVersion()I"/>
+ <method name="isExpired(Ljava/util/Date;)Z"/>
+ <method name="isPersistent()Z"/>
+ <method name="isSecure()Z"/>
+ </class>
+ <class name="org/apache/http/cookie/CookieAttributeHandler" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="match(Lorg/apache/http/cookie/Cookie;Lorg/apache/http/cookie/CookieOrigin;)Z"/>
+ <method name="parse(Lorg/apache/http/cookie/SetCookie;Ljava/lang/String;)V"/>
+ <method name="validate(Lorg/apache/http/cookie/Cookie;Lorg/apache/http/cookie/CookieOrigin;)V"/>
+ </class>
+ <class name="org/apache/http/cookie/CookieIdentityComparator" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/util/Comparator"/>
+ <method name="&lt;init>()V"/>
+ <method name="compare(Lorg/apache/http/cookie/Cookie;Lorg/apache/http/cookie/Cookie;)I"/>
+ </class>
+ <class name="org/apache/http/cookie/CookieOrigin" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;ILjava/lang/String;Z)V"/>
+ <method name="getHost()Ljava/lang/String;"/>
+ <method name="getPath()Ljava/lang/String;"/>
+ <method name="getPort()I"/>
+ <method name="isSecure()Z"/>
+ </class>
+ <class name="org/apache/http/cookie/CookiePathComparator" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/util/Comparator"/>
+ <method name="&lt;init>()V"/>
+ <method name="compare(Lorg/apache/http/cookie/Cookie;Lorg/apache/http/cookie/Cookie;)I"/>
+ </class>
+ <class name="org/apache/http/cookie/CookieSpec" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="formatCookies(Ljava/util/List;)Ljava/util/List;"/>
+ <method name="getVersion()I"/>
+ <method name="getVersionHeader()Lorg/apache/http/Header;"/>
+ <method name="match(Lorg/apache/http/cookie/Cookie;Lorg/apache/http/cookie/CookieOrigin;)Z"/>
+ <method name="parse(Lorg/apache/http/Header;Lorg/apache/http/cookie/CookieOrigin;)Ljava/util/List;"/>
+ <method name="validate(Lorg/apache/http/cookie/Cookie;Lorg/apache/http/cookie/CookieOrigin;)V"/>
+ </class>
+ <class name="org/apache/http/cookie/CookieSpecFactory" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="newInstance(Lorg/apache/http/params/HttpParams;)Lorg/apache/http/cookie/CookieSpec;"/>
+ </class>
+ <class name="org/apache/http/cookie/CookieSpecRegistry" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCookieSpec(Ljava/lang/String;)Lorg/apache/http/cookie/CookieSpec;"/>
+ <method name="getCookieSpec(Ljava/lang/String;Lorg/apache/http/params/HttpParams;)Lorg/apache/http/cookie/CookieSpec;"/>
+ <method name="getSpecNames()Ljava/util/List;"/>
+ <method name="register(Ljava/lang/String;Lorg/apache/http/cookie/CookieSpecFactory;)V"/>
+ <method name="setItems(Ljava/util/Map;)V"/>
+ <method name="unregister(Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/apache/http/cookie/MalformedCookieException" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/ProtocolException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="org/apache/http/cookie/SM" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <field name="COOKIE"/>
+ <field name="COOKIE2"/>
+ <field name="SET_COOKIE"/>
+ <field name="SET_COOKIE2"/>
+ </class>
+ <class name="org/apache/http/cookie/SetCookie" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/cookie/Cookie"/>
+ <method name="setComment(Ljava/lang/String;)V"/>
+ <method name="setDomain(Ljava/lang/String;)V"/>
+ <method name="setExpiryDate(Ljava/util/Date;)V"/>
+ <method name="setPath(Ljava/lang/String;)V"/>
+ <method name="setSecure(Z)V"/>
+ <method name="setValue(Ljava/lang/String;)V"/>
+ <method name="setVersion(I)V"/>
+ </class>
+ <class name="org/apache/http/cookie/SetCookie2" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/cookie/SetCookie"/>
+ <method name="setCommentURL(Ljava/lang/String;)V"/>
+ <method name="setDiscard(Z)V"/>
+ <method name="setPorts([I)V"/>
+ </class>
+ <class name="org/apache/http/cookie/params/CookieSpecPNames" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <field name="DATE_PATTERNS"/>
+ <field name="SINGLE_COOKIE_HEADER"/>
+ </class>
+ <class name="org/apache/http/cookie/params/CookieSpecParamBean" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/params/HttpAbstractParamBean"/>
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;)V"/>
+ <method name="setDatePatterns(Ljava/util/Collection;)V"/>
+ <method name="setSingleHeader(Z)V"/>
+ </class>
+ <class name="org/apache/http/entity/AbstractHttpEntity" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpEntity"/>
+ <method name="&lt;init>()V"/>
+ <method name="setChunked(Z)V"/>
+ <method name="setContentEncoding(Ljava/lang/String;)V"/>
+ <method name="setContentEncoding(Lorg/apache/http/Header;)V"/>
+ <method name="setContentType(Ljava/lang/String;)V"/>
+ <method name="setContentType(Lorg/apache/http/Header;)V"/>
+ <field name="chunked"/>
+ <field name="contentEncoding"/>
+ <field name="contentType"/>
+ </class>
+ <class name="org/apache/http/entity/BasicHttpEntity" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/entity/AbstractHttpEntity"/>
+ <method name="&lt;init>()V"/>
+ <method name="setContent(Ljava/io/InputStream;)V"/>
+ <method name="setContentLength(J)V"/>
+ </class>
+ <class name="org/apache/http/entity/BufferedHttpEntity" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/entity/HttpEntityWrapper"/>
+ <method name="&lt;init>(Lorg/apache/http/HttpEntity;)V"/>
+ </class>
+ <class name="org/apache/http/entity/ByteArrayEntity" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/entity/AbstractHttpEntity"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>([B)V"/>
+ <field name="content"/>
+ </class>
+ <class name="org/apache/http/entity/ContentLengthStrategy" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="determineLength(Lorg/apache/http/HttpMessage;)J"/>
+ <field name="CHUNKED"/>
+ <field name="IDENTITY"/>
+ </class>
+ <class name="org/apache/http/entity/ContentProducer" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="writeTo(Ljava/io/OutputStream;)V"/>
+ </class>
+ <class name="org/apache/http/entity/EntityTemplate" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/entity/AbstractHttpEntity"/>
+ <method name="&lt;init>(Lorg/apache/http/entity/ContentProducer;)V"/>
+ </class>
+ <class name="org/apache/http/entity/FileEntity" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/entity/AbstractHttpEntity"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>(Ljava/io/File;Ljava/lang/String;)V"/>
+ <field name="file"/>
+ </class>
+ <class name="org/apache/http/entity/HttpEntityWrapper" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpEntity"/>
+ <method name="&lt;init>(Lorg/apache/http/HttpEntity;)V"/>
+ <field name="wrappedEntity"/>
+ </class>
+ <class name="org/apache/http/entity/InputStreamEntity" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/entity/AbstractHttpEntity"/>
+ <method name="&lt;init>(Ljava/io/InputStream;J)V"/>
+ </class>
+ <class name="org/apache/http/entity/SerializableEntity" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/entity/AbstractHttpEntity"/>
+ <method name="&lt;init>(Ljava/io/Serializable;Z)V"/>
+ </class>
+ <class name="org/apache/http/entity/StringEntity" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/entity/AbstractHttpEntity"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <field name="content"/>
+ </class>
+ <class name="org/apache/http/impl/AbstractHttpClientConnection" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpClientConnection"/>
+ <method name="&lt;init>()V"/>
+ <method name="assertOpen()V"/>
+ <method name="createEntityDeserializer()Lorg/apache/http/impl/entity/EntityDeserializer;"/>
+ <method name="createEntitySerializer()Lorg/apache/http/impl/entity/EntitySerializer;"/>
+ <method name="createHttpResponseFactory()Lorg/apache/http/HttpResponseFactory;"/>
+ <method name="createRequestWriter(Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/params/HttpParams;)Lorg/apache/http/io/HttpMessageWriter;"/>
+ <method name="createResponseParser(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/HttpResponseFactory;Lorg/apache/http/params/HttpParams;)Lorg/apache/http/io/HttpMessageParser;"/>
+ <method name="doFlush()V"/>
+ <method name="init(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/params/HttpParams;)V"/>
+ </class>
+ <class name="org/apache/http/impl/AbstractHttpServerConnection" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpServerConnection"/>
+ <method name="&lt;init>()V"/>
+ <method name="assertOpen()V"/>
+ <method name="createEntityDeserializer()Lorg/apache/http/impl/entity/EntityDeserializer;"/>
+ <method name="createEntitySerializer()Lorg/apache/http/impl/entity/EntitySerializer;"/>
+ <method name="createHttpRequestFactory()Lorg/apache/http/HttpRequestFactory;"/>
+ <method name="createRequestParser(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/HttpRequestFactory;Lorg/apache/http/params/HttpParams;)Lorg/apache/http/io/HttpMessageParser;"/>
+ <method name="createResponseWriter(Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/params/HttpParams;)Lorg/apache/http/io/HttpMessageWriter;"/>
+ <method name="doFlush()V"/>
+ <method name="init(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/params/HttpParams;)V"/>
+ </class>
+ <class name="org/apache/http/impl/DefaultConnectionReuseStrategy" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/ConnectionReuseStrategy"/>
+ <method name="&lt;init>()V"/>
+ <method name="createTokenIterator(Lorg/apache/http/HeaderIterator;)Lorg/apache/http/TokenIterator;"/>
+ </class>
+ <class name="org/apache/http/impl/DefaultHttpClientConnection" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/SocketHttpClientConnection"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/DefaultHttpRequestFactory" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpRequestFactory"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/DefaultHttpResponseFactory" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpResponseFactory"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Lorg/apache/http/ReasonPhraseCatalog;)V"/>
+ <method name="determineLocale(Lorg/apache/http/protocol/HttpContext;)Ljava/util/Locale;"/>
+ <field name="reasonCatalog"/>
+ </class>
+ <class name="org/apache/http/impl/DefaultHttpServerConnection" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/SocketHttpServerConnection"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/EnglishReasonPhraseCatalog" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/ReasonPhraseCatalog"/>
+ <method name="&lt;init>()V"/>
+ <field name="INSTANCE"/>
+ </class>
+ <class name="org/apache/http/impl/HttpConnectionMetricsImpl" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpConnectionMetrics"/>
+ <method name="&lt;init>(Lorg/apache/http/io/HttpTransportMetrics;Lorg/apache/http/io/HttpTransportMetrics;)V"/>
+ <method name="incrementRequestCount()V"/>
+ <method name="incrementResponseCount()V"/>
+ <method name="setMetric(Ljava/lang/String;Ljava/lang/Object;)V"/>
+ <field name="RECEIVED_BYTES_COUNT"/>
+ <field name="REQUEST_COUNT"/>
+ <field name="RESPONSE_COUNT"/>
+ <field name="SENT_BYTES_COUNT"/>
+ </class>
+ <class name="org/apache/http/impl/NoConnectionReuseStrategy" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/ConnectionReuseStrategy"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/SocketHttpClientConnection" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/AbstractHttpClientConnection"/>
+ <implements name="org/apache/http/HttpInetConnection"/>
+ <method name="&lt;init>()V"/>
+ <method name="assertNotOpen()V"/>
+ <method name="bind(Ljava/net/Socket;Lorg/apache/http/params/HttpParams;)V"/>
+ <method name="createSessionInputBuffer(Ljava/net/Socket;ILorg/apache/http/params/HttpParams;)Lorg/apache/http/io/SessionInputBuffer;"/>
+ <method name="createSessionOutputBuffer(Ljava/net/Socket;ILorg/apache/http/params/HttpParams;)Lorg/apache/http/io/SessionOutputBuffer;"/>
+ <method name="getSocket()Ljava/net/Socket;"/>
+ </class>
+ <class name="org/apache/http/impl/SocketHttpServerConnection" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/AbstractHttpServerConnection"/>
+ <implements name="org/apache/http/HttpInetConnection"/>
+ <method name="&lt;init>()V"/>
+ <method name="assertNotOpen()V"/>
+ <method name="bind(Ljava/net/Socket;Lorg/apache/http/params/HttpParams;)V"/>
+ <method name="createHttpDataReceiver(Ljava/net/Socket;ILorg/apache/http/params/HttpParams;)Lorg/apache/http/io/SessionInputBuffer;"/>
+ <method name="createHttpDataTransmitter(Ljava/net/Socket;ILorg/apache/http/params/HttpParams;)Lorg/apache/http/io/SessionOutputBuffer;"/>
+ <method name="getSocket()Ljava/net/Socket;"/>
+ </class>
+ <class name="org/apache/http/impl/auth/AuthSchemeBase" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/auth/AuthScheme"/>
+ <method name="&lt;init>()V"/>
+ <method name="isProxy()Z"/>
+ <method name="parseChallenge(Lorg/apache/http/util/CharArrayBuffer;II)V"/>
+ </class>
+ <class name="org/apache/http/impl/auth/BasicScheme" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/auth/RFC2617Scheme"/>
+ <method name="&lt;init>()V"/>
+ <method name="authenticate(Lorg/apache/http/auth/Credentials;Ljava/lang/String;Z)Lorg/apache/http/Header;"/>
+ </class>
+ <class name="org/apache/http/impl/auth/BasicSchemeFactory" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/auth/AuthSchemeFactory"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/auth/DigestScheme" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/auth/RFC2617Scheme"/>
+ <method name="&lt;init>()V"/>
+ <method name="createCnonce()Ljava/lang/String;"/>
+ <method name="overrideParamter(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/apache/http/impl/auth/DigestSchemeFactory" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/auth/AuthSchemeFactory"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/auth/NTLMEngine" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="generateType1Msg(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="generateType3Msg(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ </class>
+ <class name="org/apache/http/impl/auth/NTLMEngineException" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/auth/AuthenticationException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="org/apache/http/impl/auth/NTLMScheme" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/auth/AuthSchemeBase"/>
+ <method name="&lt;init>(Lorg/apache/http/impl/auth/NTLMEngine;)V"/>
+ </class>
+ <class name="org/apache/http/impl/auth/RFC2617Scheme" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/auth/AuthSchemeBase"/>
+ <method name="&lt;init>()V"/>
+ <method name="getParameters()Ljava/util/Map;"/>
+ </class>
+ <class name="org/apache/http/impl/auth/UnsupportedDigestAlgorithmException" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="org/apache/http/impl/client/AbstractAuthenticationHandler" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/client/AuthenticationHandler"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAuthPreferences()Ljava/util/List;"/>
+ <method name="parseChallenges([Lorg/apache/http/Header;)Ljava/util/Map;"/>
+ </class>
+ <class name="org/apache/http/impl/client/AbstractHttpClient" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/client/HttpClient"/>
+ <method name="&lt;init>(Lorg/apache/http/conn/ClientConnectionManager;Lorg/apache/http/params/HttpParams;)V"/>
+ <method name="addRequestInterceptor(Lorg/apache/http/HttpRequestInterceptor;)V"/>
+ <method name="addRequestInterceptor(Lorg/apache/http/HttpRequestInterceptor;I)V"/>
+ <method name="addResponseInterceptor(Lorg/apache/http/HttpResponseInterceptor;)V"/>
+ <method name="addResponseInterceptor(Lorg/apache/http/HttpResponseInterceptor;I)V"/>
+ <method name="clearRequestInterceptors()V"/>
+ <method name="clearResponseInterceptors()V"/>
+ <method name="createAuthSchemeRegistry()Lorg/apache/http/auth/AuthSchemeRegistry;"/>
+ <method name="createClientConnectionManager()Lorg/apache/http/conn/ClientConnectionManager;"/>
+ <method name="createClientRequestDirector(Lorg/apache/http/protocol/HttpRequestExecutor;Lorg/apache/http/conn/ClientConnectionManager;Lorg/apache/http/ConnectionReuseStrategy;Lorg/apache/http/conn/ConnectionKeepAliveStrategy;Lorg/apache/http/conn/routing/HttpRoutePlanner;Lorg/apache/http/protocol/HttpProcessor;Lorg/apache/http/client/HttpRequestRetryHandler;Lorg/apache/http/client/RedirectHandler;Lorg/apache/http/client/AuthenticationHandler;Lorg/apache/http/client/AuthenticationHandler;Lorg/apache/http/client/UserTokenHandler;Lorg/apache/http/params/HttpParams;)Lorg/apache/http/client/RequestDirector;"/>
+ <method name="createConnectionKeepAliveStrategy()Lorg/apache/http/conn/ConnectionKeepAliveStrategy;"/>
+ <method name="createConnectionReuseStrategy()Lorg/apache/http/ConnectionReuseStrategy;"/>
+ <method name="createCookieSpecRegistry()Lorg/apache/http/cookie/CookieSpecRegistry;"/>
+ <method name="createCookieStore()Lorg/apache/http/client/CookieStore;"/>
+ <method name="createCredentialsProvider()Lorg/apache/http/client/CredentialsProvider;"/>
+ <method name="createHttpContext()Lorg/apache/http/protocol/HttpContext;"/>
+ <method name="createHttpParams()Lorg/apache/http/params/HttpParams;"/>
+ <method name="createHttpProcessor()Lorg/apache/http/protocol/BasicHttpProcessor;"/>
+ <method name="createHttpRequestRetryHandler()Lorg/apache/http/client/HttpRequestRetryHandler;"/>
+ <method name="createHttpRoutePlanner()Lorg/apache/http/conn/routing/HttpRoutePlanner;"/>
+ <method name="createProxyAuthenticationHandler()Lorg/apache/http/client/AuthenticationHandler;"/>
+ <method name="createRedirectHandler()Lorg/apache/http/client/RedirectHandler;"/>
+ <method name="createRequestExecutor()Lorg/apache/http/protocol/HttpRequestExecutor;"/>
+ <method name="createTargetAuthenticationHandler()Lorg/apache/http/client/AuthenticationHandler;"/>
+ <method name="createUserTokenHandler()Lorg/apache/http/client/UserTokenHandler;"/>
+ <method name="determineParams(Lorg/apache/http/HttpRequest;)Lorg/apache/http/params/HttpParams;"/>
+ <method name="getAuthSchemes()Lorg/apache/http/auth/AuthSchemeRegistry;"/>
+ <method name="getConnectionKeepAliveStrategy()Lorg/apache/http/conn/ConnectionKeepAliveStrategy;"/>
+ <method name="getConnectionReuseStrategy()Lorg/apache/http/ConnectionReuseStrategy;"/>
+ <method name="getCookieSpecs()Lorg/apache/http/cookie/CookieSpecRegistry;"/>
+ <method name="getCookieStore()Lorg/apache/http/client/CookieStore;"/>
+ <method name="getCredentialsProvider()Lorg/apache/http/client/CredentialsProvider;"/>
+ <method name="getHttpProcessor()Lorg/apache/http/protocol/BasicHttpProcessor;"/>
+ <method name="getHttpRequestRetryHandler()Lorg/apache/http/client/HttpRequestRetryHandler;"/>
+ <method name="getProxyAuthenticationHandler()Lorg/apache/http/client/AuthenticationHandler;"/>
+ <method name="getRedirectHandler()Lorg/apache/http/client/RedirectHandler;"/>
+ <method name="getRequestExecutor()Lorg/apache/http/protocol/HttpRequestExecutor;"/>
+ <method name="getRequestInterceptor(I)Lorg/apache/http/HttpRequestInterceptor;"/>
+ <method name="getRequestInterceptorCount()I"/>
+ <method name="getResponseInterceptor(I)Lorg/apache/http/HttpResponseInterceptor;"/>
+ <method name="getResponseInterceptorCount()I"/>
+ <method name="getRoutePlanner()Lorg/apache/http/conn/routing/HttpRoutePlanner;"/>
+ <method name="getTargetAuthenticationHandler()Lorg/apache/http/client/AuthenticationHandler;"/>
+ <method name="getUserTokenHandler()Lorg/apache/http/client/UserTokenHandler;"/>
+ <method name="removeRequestInterceptorByClass(Ljava/lang/Class;)V"/>
+ <method name="removeResponseInterceptorByClass(Ljava/lang/Class;)V"/>
+ <method name="setAuthSchemes(Lorg/apache/http/auth/AuthSchemeRegistry;)V"/>
+ <method name="setCookieSpecs(Lorg/apache/http/cookie/CookieSpecRegistry;)V"/>
+ <method name="setCookieStore(Lorg/apache/http/client/CookieStore;)V"/>
+ <method name="setCredentialsProvider(Lorg/apache/http/client/CredentialsProvider;)V"/>
+ <method name="setHttpRequestRetryHandler(Lorg/apache/http/client/HttpRequestRetryHandler;)V"/>
+ <method name="setKeepAliveStrategy(Lorg/apache/http/conn/ConnectionKeepAliveStrategy;)V"/>
+ <method name="setParams(Lorg/apache/http/params/HttpParams;)V"/>
+ <method name="setProxyAuthenticationHandler(Lorg/apache/http/client/AuthenticationHandler;)V"/>
+ <method name="setRedirectHandler(Lorg/apache/http/client/RedirectHandler;)V"/>
+ <method name="setReuseStrategy(Lorg/apache/http/ConnectionReuseStrategy;)V"/>
+ <method name="setRoutePlanner(Lorg/apache/http/conn/routing/HttpRoutePlanner;)V"/>
+ <method name="setTargetAuthenticationHandler(Lorg/apache/http/client/AuthenticationHandler;)V"/>
+ <method name="setUserTokenHandler(Lorg/apache/http/client/UserTokenHandler;)V"/>
+ </class>
+ <class name="org/apache/http/impl/client/BasicCookieStore" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/client/CookieStore"/>
+ <method name="&lt;init>()V"/>
+ <method name="addCookies([Lorg/apache/http/cookie/Cookie;)V"/>
+ </class>
+ <class name="org/apache/http/impl/client/BasicCredentialsProvider" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/client/CredentialsProvider"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/client/BasicResponseHandler" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/client/ResponseHandler"/>
+ <method name="&lt;init>()V"/>
+ <method name="handleResponse(Lorg/apache/http/HttpResponse;)Ljava/lang/String;"/>
+ </class>
+ <class name="org/apache/http/impl/client/ClientParamsStack" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/params/AbstractHttpParams"/>
+ <method name="&lt;init>(Lorg/apache/http/impl/client/ClientParamsStack;)V"/>
+ <method name="&lt;init>(Lorg/apache/http/impl/client/ClientParamsStack;Lorg/apache/http/params/HttpParams;Lorg/apache/http/params/HttpParams;Lorg/apache/http/params/HttpParams;Lorg/apache/http/params/HttpParams;)V"/>
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;Lorg/apache/http/params/HttpParams;Lorg/apache/http/params/HttpParams;Lorg/apache/http/params/HttpParams;)V"/>
+ <method name="getApplicationParams()Lorg/apache/http/params/HttpParams;"/>
+ <method name="getClientParams()Lorg/apache/http/params/HttpParams;"/>
+ <method name="getOverrideParams()Lorg/apache/http/params/HttpParams;"/>
+ <method name="getRequestParams()Lorg/apache/http/params/HttpParams;"/>
+ <field name="applicationParams"/>
+ <field name="clientParams"/>
+ <field name="overrideParams"/>
+ <field name="requestParams"/>
+ </class>
+ <class name="org/apache/http/impl/client/DefaultConnectionKeepAliveStrategy" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/conn/ConnectionKeepAliveStrategy"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/client/DefaultHttpClient" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/client/AbstractHttpClient"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Lorg/apache/http/conn/ClientConnectionManager;Lorg/apache/http/params/HttpParams;)V"/>
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;)V"/>
+ </class>
+ <class name="org/apache/http/impl/client/DefaultHttpRequestRetryHandler" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/client/HttpRequestRetryHandler"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(IZ)V"/>
+ <method name="getRetryCount()I"/>
+ <method name="isRequestSentRetryEnabled()Z"/>
+ </class>
+ <class name="org/apache/http/impl/client/DefaultProxyAuthenticationHandler" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/client/AbstractAuthenticationHandler"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/client/DefaultRedirectHandler" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/client/RedirectHandler"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/client/DefaultRequestDirector" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/client/RequestDirector"/>
+ <method name="&lt;init>(Lorg/apache/http/protocol/HttpRequestExecutor;Lorg/apache/http/conn/ClientConnectionManager;Lorg/apache/http/ConnectionReuseStrategy;Lorg/apache/http/conn/ConnectionKeepAliveStrategy;Lorg/apache/http/conn/routing/HttpRoutePlanner;Lorg/apache/http/protocol/HttpProcessor;Lorg/apache/http/client/HttpRequestRetryHandler;Lorg/apache/http/client/RedirectHandler;Lorg/apache/http/client/AuthenticationHandler;Lorg/apache/http/client/AuthenticationHandler;Lorg/apache/http/client/UserTokenHandler;Lorg/apache/http/params/HttpParams;)V"/>
+ <method name="createConnectRequest(Lorg/apache/http/conn/routing/HttpRoute;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpRequest;"/>
+ <method name="createTunnelToProxy(Lorg/apache/http/conn/routing/HttpRoute;ILorg/apache/http/protocol/HttpContext;)Z"/>
+ <method name="createTunnelToTarget(Lorg/apache/http/conn/routing/HttpRoute;Lorg/apache/http/protocol/HttpContext;)Z"/>
+ <method name="determineRoute(Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/conn/routing/HttpRoute;"/>
+ <method name="establishRoute(Lorg/apache/http/conn/routing/HttpRoute;Lorg/apache/http/protocol/HttpContext;)V"/>
+ <method name="handleResponse(Lorg/apache/http/impl/client/RoutedRequest;Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/impl/client/RoutedRequest;"/>
+ <method name="releaseConnection()V"/>
+ <method name="rewriteRequestURI(Lorg/apache/http/impl/client/RequestWrapper;Lorg/apache/http/conn/routing/HttpRoute;)V"/>
+ <field name="connManager"/>
+ <field name="httpProcessor"/>
+ <field name="keepAliveStrategy"/>
+ <field name="managedConn"/>
+ <field name="params"/>
+ <field name="redirectHandler"/>
+ <field name="requestExec"/>
+ <field name="retryHandler"/>
+ <field name="reuseStrategy"/>
+ <field name="routePlanner"/>
+ </class>
+ <class name="org/apache/http/impl/client/DefaultTargetAuthenticationHandler" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/client/AbstractAuthenticationHandler"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/client/DefaultUserTokenHandler" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/client/UserTokenHandler"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/client/EntityEnclosingRequestWrapper" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/client/RequestWrapper"/>
+ <implements name="org/apache/http/HttpEntityEnclosingRequest"/>
+ <method name="&lt;init>(Lorg/apache/http/HttpEntityEnclosingRequest;)V"/>
+ </class>
+ <class name="org/apache/http/impl/client/RedirectLocations" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="add(Ljava/net/URI;)V"/>
+ <method name="contains(Ljava/net/URI;)Z"/>
+ <method name="remove(Ljava/net/URI;)Z"/>
+ </class>
+ <class name="org/apache/http/impl/client/RequestWrapper" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/message/AbstractHttpMessage"/>
+ <implements name="org/apache/http/client/methods/HttpUriRequest"/>
+ <method name="&lt;init>(Lorg/apache/http/HttpRequest;)V"/>
+ <method name="getExecCount()I"/>
+ <method name="getOriginal()Lorg/apache/http/HttpRequest;"/>
+ <method name="incrementExecCount()V"/>
+ <method name="isRepeatable()Z"/>
+ <method name="resetHeaders()V"/>
+ <method name="setMethod(Ljava/lang/String;)V"/>
+ <method name="setProtocolVersion(Lorg/apache/http/ProtocolVersion;)V"/>
+ <method name="setURI(Ljava/net/URI;)V"/>
+ </class>
+ <class name="org/apache/http/impl/client/RoutedRequest" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Lorg/apache/http/impl/client/RequestWrapper;Lorg/apache/http/conn/routing/HttpRoute;)V"/>
+ <method name="getRequest()Lorg/apache/http/impl/client/RequestWrapper;"/>
+ <method name="getRoute()Lorg/apache/http/conn/routing/HttpRoute;"/>
+ <field name="request"/>
+ <field name="route"/>
+ </class>
+ <class name="org/apache/http/impl/client/TunnelRefusedException" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/HttpException"/>
+ <method name="&lt;init>(Ljava/lang/String;Lorg/apache/http/HttpResponse;)V"/>
+ <method name="getResponse()Lorg/apache/http/HttpResponse;"/>
+ </class>
+ <class name="org/apache/http/impl/conn/AbstractClientConnAdapter" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/conn/ManagedClientConnection"/>
+ <method name="&lt;init>(Lorg/apache/http/conn/ClientConnectionManager;Lorg/apache/http/conn/OperatedClientConnection;)V"/>
+ <method name="assertNotAborted()V"/>
+ <method name="assertValid(Lorg/apache/http/conn/OperatedClientConnection;)V"/>
+ <method name="detach()V"/>
+ <method name="getManager()Lorg/apache/http/conn/ClientConnectionManager;"/>
+ <method name="getWrappedConnection()Lorg/apache/http/conn/OperatedClientConnection;"/>
+ </class>
+ <class name="org/apache/http/impl/conn/AbstractPoolEntry" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Lorg/apache/http/conn/ClientConnectionOperator;Lorg/apache/http/conn/routing/HttpRoute;)V"/>
+ <method name="getState()Ljava/lang/Object;"/>
+ <method name="layerProtocol(Lorg/apache/http/protocol/HttpContext;Lorg/apache/http/params/HttpParams;)V"/>
+ <method name="open(Lorg/apache/http/conn/routing/HttpRoute;Lorg/apache/http/protocol/HttpContext;Lorg/apache/http/params/HttpParams;)V"/>
+ <method name="setState(Ljava/lang/Object;)V"/>
+ <method name="shutdownEntry()V"/>
+ <method name="tunnelProxy(Lorg/apache/http/HttpHost;ZLorg/apache/http/params/HttpParams;)V"/>
+ <method name="tunnelTarget(ZLorg/apache/http/params/HttpParams;)V"/>
+ <field name="connOperator"/>
+ <field name="connection"/>
+ <field name="route"/>
+ <field name="state"/>
+ <field name="tracker"/>
+ </class>
+ <class name="org/apache/http/impl/conn/AbstractPooledConnAdapter" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/conn/AbstractClientConnAdapter"/>
+ <method name="&lt;init>(Lorg/apache/http/conn/ClientConnectionManager;Lorg/apache/http/impl/conn/AbstractPoolEntry;)V"/>
+ <method name="assertAttached()V"/>
+ <field name="poolEntry"/>
+ </class>
+ <class name="org/apache/http/impl/conn/DefaultClientConnection" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/SocketHttpClientConnection"/>
+ <implements name="org/apache/http/conn/OperatedClientConnection"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/conn/DefaultClientConnectionOperator" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/conn/ClientConnectionOperator"/>
+ <method name="&lt;init>(Lorg/apache/http/conn/scheme/SchemeRegistry;)V"/>
+ <method name="prepareSocket(Ljava/net/Socket;Lorg/apache/http/protocol/HttpContext;Lorg/apache/http/params/HttpParams;)V"/>
+ <field name="schemeRegistry"/>
+ </class>
+ <class name="org/apache/http/impl/conn/DefaultHttpRoutePlanner" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/conn/routing/HttpRoutePlanner"/>
+ <method name="&lt;init>(Lorg/apache/http/conn/scheme/SchemeRegistry;)V"/>
+ <field name="schemeRegistry"/>
+ </class>
+ <class name="org/apache/http/impl/conn/DefaultResponseParser" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/io/AbstractMessageParser"/>
+ <method name="&lt;init>(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/message/LineParser;Lorg/apache/http/HttpResponseFactory;Lorg/apache/http/params/HttpParams;)V"/>
+ </class>
+ <class name="org/apache/http/impl/conn/IdleConnectionHandler" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="add(Lorg/apache/http/HttpConnection;JLjava/util/concurrent/TimeUnit;)V"/>
+ <method name="closeExpiredConnections()V"/>
+ <method name="closeIdleConnections(J)V"/>
+ <method name="remove(Lorg/apache/http/HttpConnection;)Z"/>
+ <method name="removeAll()V"/>
+ </class>
+ <class name="org/apache/http/impl/conn/LoggingSessionInputBuffer" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/io/SessionInputBuffer"/>
+ <method name="&lt;init>(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/impl/conn/Wire;)V"/>
+ </class>
+ <class name="org/apache/http/impl/conn/LoggingSessionOutputBuffer" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/io/SessionOutputBuffer"/>
+ <method name="&lt;init>(Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/impl/conn/Wire;)V"/>
+ </class>
+ <class name="org/apache/http/impl/conn/ProxySelectorRoutePlanner" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/conn/routing/HttpRoutePlanner"/>
+ <method name="&lt;init>(Lorg/apache/http/conn/scheme/SchemeRegistry;Ljava/net/ProxySelector;)V"/>
+ <method name="chooseProxy(Ljava/util/List;Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;Lorg/apache/http/protocol/HttpContext;)Ljava/net/Proxy;"/>
+ <method name="determineProxy(Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpHost;"/>
+ <method name="getHost(Ljava/net/InetSocketAddress;)Ljava/lang/String;"/>
+ <method name="getProxySelector()Ljava/net/ProxySelector;"/>
+ <method name="setProxySelector(Ljava/net/ProxySelector;)V"/>
+ <field name="proxySelector"/>
+ <field name="schemeRegistry"/>
+ </class>
+ <class name="org/apache/http/impl/conn/SingleClientConnManager" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/conn/ClientConnectionManager"/>
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;Lorg/apache/http/conn/scheme/SchemeRegistry;)V"/>
+ <method name="assertStillUp()V"/>
+ <method name="createConnectionOperator(Lorg/apache/http/conn/scheme/SchemeRegistry;)Lorg/apache/http/conn/ClientConnectionOperator;"/>
+ <method name="getConnection(Lorg/apache/http/conn/routing/HttpRoute;Ljava/lang/Object;)Lorg/apache/http/conn/ManagedClientConnection;"/>
+ <method name="revokeConnection()V"/>
+ <field name="MISUSE_MESSAGE"/>
+ <field name="alwaysShutDown"/>
+ <field name="connOperator"/>
+ <field name="connectionExpiresTime"/>
+ <field name="isShutDown"/>
+ <field name="lastReleaseTime"/>
+ <field name="managedConn"/>
+ <field name="schemeRegistry"/>
+ <field name="uniquePoolEntry"/>
+ </class>
+ <class name="org/apache/http/impl/conn/SingleClientConnManager$ConnAdapter" since="1" removed="23">
+ <extends name="org/apache/http/impl/conn/AbstractPooledConnAdapter"/>
+ <method name="&lt;init>(Lorg/apache/http/impl/conn/SingleClientConnManager;Lorg/apache/http/impl/conn/SingleClientConnManager$PoolEntry;Lorg/apache/http/conn/routing/HttpRoute;)V"/>
+ </class>
+ <class name="org/apache/http/impl/conn/SingleClientConnManager$PoolEntry" since="1" removed="23">
+ <extends name="org/apache/http/impl/conn/AbstractPoolEntry"/>
+ <method name="&lt;init>(Lorg/apache/http/impl/conn/SingleClientConnManager;)V"/>
+ <method name="close()V"/>
+ <method name="shutdown()V"/>
+ </class>
+ <class name="org/apache/http/impl/conn/Wire" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Lorg/apache/commons/logging/Log;)V"/>
+ <method name="enabled()Z"/>
+ <method name="input(I)V"/>
+ <method name="input(Ljava/io/InputStream;)V"/>
+ <method name="input(Ljava/lang/String;)V"/>
+ <method name="input([B)V"/>
+ <method name="input([BII)V"/>
+ <method name="output(I)V"/>
+ <method name="output(Ljava/io/InputStream;)V"/>
+ <method name="output(Ljava/lang/String;)V"/>
+ <method name="output([B)V"/>
+ <method name="output([BII)V"/>
+ </class>
+ <class name="org/apache/http/impl/conn/tsccm/AbstractConnPool" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/impl/conn/tsccm/RefQueueHandler"/>
+ <method name="&lt;init>()V"/>
+ <method name="closeConnection(Lorg/apache/http/conn/OperatedClientConnection;)V"/>
+ <method name="closeExpiredConnections()V"/>
+ <method name="closeIdleConnections(JLjava/util/concurrent/TimeUnit;)V"/>
+ <method name="deleteClosedConnections()V"/>
+ <method name="enableConnectionGC()V"/>
+ <method name="freeEntry(Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;ZJLjava/util/concurrent/TimeUnit;)V"/>
+ <method name="getEntry(Lorg/apache/http/conn/routing/HttpRoute;Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;)Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;"/>
+ <method name="handleLostEntry(Lorg/apache/http/conn/routing/HttpRoute;)V"/>
+ <method name="requestPoolEntry(Lorg/apache/http/conn/routing/HttpRoute;Ljava/lang/Object;)Lorg/apache/http/impl/conn/tsccm/PoolEntryRequest;"/>
+ <method name="shutdown()V"/>
+ <field name="idleConnHandler"/>
+ <field name="isShutDown"/>
+ <field name="issuedConnections"/>
+ <field name="numConnections"/>
+ <field name="poolLock"/>
+ <field name="refQueue"/>
+ </class>
+ <class name="org/apache/http/impl/conn/tsccm/BasicPoolEntry" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/conn/AbstractPoolEntry"/>
+ <method name="&lt;init>(Lorg/apache/http/conn/ClientConnectionOperator;Lorg/apache/http/conn/routing/HttpRoute;Ljava/lang/ref/ReferenceQueue;)V"/>
+ <method name="getConnection()Lorg/apache/http/conn/OperatedClientConnection;"/>
+ <method name="getPlannedRoute()Lorg/apache/http/conn/routing/HttpRoute;"/>
+ <method name="getWeakRef()Lorg/apache/http/impl/conn/tsccm/BasicPoolEntryRef;"/>
+ </class>
+ <class name="org/apache/http/impl/conn/tsccm/BasicPoolEntryRef" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/ref/WeakReference"/>
+ <method name="&lt;init>(Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;Ljava/lang/ref/ReferenceQueue;)V"/>
+ <method name="getRoute()Lorg/apache/http/conn/routing/HttpRoute;"/>
+ </class>
+ <class name="org/apache/http/impl/conn/tsccm/BasicPooledConnAdapter" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/conn/AbstractPooledConnAdapter"/>
+ <method name="&lt;init>(Lorg/apache/http/impl/conn/tsccm/ThreadSafeClientConnManager;Lorg/apache/http/impl/conn/AbstractPoolEntry;)V"/>
+ <method name="getPoolEntry()Lorg/apache/http/impl/conn/AbstractPoolEntry;"/>
+ </class>
+ <class name="org/apache/http/impl/conn/tsccm/ConnPoolByRoute" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/conn/tsccm/AbstractConnPool"/>
+ <method name="&lt;init>(Lorg/apache/http/conn/ClientConnectionOperator;Lorg/apache/http/params/HttpParams;)V"/>
+ <method name="createEntry(Lorg/apache/http/impl/conn/tsccm/RouteSpecificPool;Lorg/apache/http/conn/ClientConnectionOperator;)Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;"/>
+ <method name="createFreeConnQueue()Ljava/util/Queue;"/>
+ <method name="createRouteToPoolMap()Ljava/util/Map;"/>
+ <method name="createWaitingThreadQueue()Ljava/util/Queue;"/>
+ <method name="deleteEntry(Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;)V"/>
+ <method name="deleteLeastUsedEntry()V"/>
+ <method name="getConnectionsInPool(Lorg/apache/http/conn/routing/HttpRoute;)I"/>
+ <method name="getEntryBlocking(Lorg/apache/http/conn/routing/HttpRoute;Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;Lorg/apache/http/impl/conn/tsccm/WaitingThreadAborter;)Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;"/>
+ <method name="getFreeEntry(Lorg/apache/http/impl/conn/tsccm/RouteSpecificPool;Ljava/lang/Object;)Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;"/>
+ <method name="getRoutePool(Lorg/apache/http/conn/routing/HttpRoute;Z)Lorg/apache/http/impl/conn/tsccm/RouteSpecificPool;"/>
+ <method name="newRouteSpecificPool(Lorg/apache/http/conn/routing/HttpRoute;)Lorg/apache/http/impl/conn/tsccm/RouteSpecificPool;"/>
+ <method name="newWaitingThread(Ljava/util/concurrent/locks/Condition;Lorg/apache/http/impl/conn/tsccm/RouteSpecificPool;)Lorg/apache/http/impl/conn/tsccm/WaitingThread;"/>
+ <method name="notifyWaitingThread(Lorg/apache/http/impl/conn/tsccm/RouteSpecificPool;)V"/>
+ <field name="freeConnections"/>
+ <field name="maxTotalConnections"/>
+ <field name="operator"/>
+ <field name="routeToPool"/>
+ <field name="waitingThreads"/>
+ </class>
+ <class name="org/apache/http/impl/conn/tsccm/PoolEntryRequest" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="abortRequest()V"/>
+ <method name="getPoolEntry(JLjava/util/concurrent/TimeUnit;)Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;"/>
+ </class>
+ <class name="org/apache/http/impl/conn/tsccm/RefQueueHandler" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="handleReference(Ljava/lang/ref/Reference;)V"/>
+ </class>
+ <class name="org/apache/http/impl/conn/tsccm/RefQueueWorker" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Runnable"/>
+ <method name="&lt;init>(Ljava/lang/ref/ReferenceQueue;Lorg/apache/http/impl/conn/tsccm/RefQueueHandler;)V"/>
+ <method name="shutdown()V"/>
+ <field name="refHandler"/>
+ <field name="refQueue"/>
+ <field name="workerThread"/>
+ </class>
+ <class name="org/apache/http/impl/conn/tsccm/RouteSpecificPool" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Lorg/apache/http/conn/routing/HttpRoute;I)V"/>
+ <method name="allocEntry(Ljava/lang/Object;)Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;"/>
+ <method name="createdEntry(Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;)V"/>
+ <method name="deleteEntry(Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;)Z"/>
+ <method name="dropEntry()V"/>
+ <method name="freeEntry(Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;)V"/>
+ <method name="getCapacity()I"/>
+ <method name="getEntryCount()I"/>
+ <method name="getMaxEntries()I"/>
+ <method name="getRoute()Lorg/apache/http/conn/routing/HttpRoute;"/>
+ <method name="hasThread()Z"/>
+ <method name="isUnused()Z"/>
+ <method name="nextThread()Lorg/apache/http/impl/conn/tsccm/WaitingThread;"/>
+ <method name="queueThread(Lorg/apache/http/impl/conn/tsccm/WaitingThread;)V"/>
+ <method name="removeThread(Lorg/apache/http/impl/conn/tsccm/WaitingThread;)V"/>
+ <field name="freeEntries"/>
+ <field name="maxEntries"/>
+ <field name="numEntries"/>
+ <field name="route"/>
+ <field name="waitingThreads"/>
+ </class>
+ <class name="org/apache/http/impl/conn/tsccm/ThreadSafeClientConnManager" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/conn/ClientConnectionManager"/>
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;Lorg/apache/http/conn/scheme/SchemeRegistry;)V"/>
+ <method name="createConnectionOperator(Lorg/apache/http/conn/scheme/SchemeRegistry;)Lorg/apache/http/conn/ClientConnectionOperator;"/>
+ <method name="createConnectionPool(Lorg/apache/http/params/HttpParams;)Lorg/apache/http/impl/conn/tsccm/AbstractConnPool;"/>
+ <method name="getConnectionsInPool()I"/>
+ <method name="getConnectionsInPool(Lorg/apache/http/conn/routing/HttpRoute;)I"/>
+ <field name="connOperator"/>
+ <field name="connectionPool"/>
+ <field name="schemeRegistry"/>
+ </class>
+ <class name="org/apache/http/impl/conn/tsccm/WaitingThread" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/util/concurrent/locks/Condition;Lorg/apache/http/impl/conn/tsccm/RouteSpecificPool;)V"/>
+ <method name="await(Ljava/util/Date;)Z"/>
+ <method name="getCondition()Ljava/util/concurrent/locks/Condition;"/>
+ <method name="getPool()Lorg/apache/http/impl/conn/tsccm/RouteSpecificPool;"/>
+ <method name="getThread()Ljava/lang/Thread;"/>
+ <method name="interrupt()V"/>
+ <method name="wakeup()V"/>
+ </class>
+ <class name="org/apache/http/impl/conn/tsccm/WaitingThreadAborter" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="abort()V"/>
+ <method name="setWaitingThread(Lorg/apache/http/impl/conn/tsccm/WaitingThread;)V"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/AbstractCookieAttributeHandler" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/cookie/CookieAttributeHandler"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/AbstractCookieSpec" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/cookie/CookieSpec"/>
+ <method name="&lt;init>()V"/>
+ <method name="findAttribHandler(Ljava/lang/String;)Lorg/apache/http/cookie/CookieAttributeHandler;"/>
+ <method name="getAttribHandler(Ljava/lang/String;)Lorg/apache/http/cookie/CookieAttributeHandler;"/>
+ <method name="getAttribHandlers()Ljava/util/Collection;"/>
+ <method name="registerAttribHandler(Ljava/lang/String;Lorg/apache/http/cookie/CookieAttributeHandler;)V"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/BasicClientCookie" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="org/apache/http/cookie/ClientCookie"/>
+ <implements name="org/apache/http/cookie/SetCookie"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="setAttribute(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/BasicClientCookie2" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/cookie/BasicClientCookie"/>
+ <implements name="org/apache/http/cookie/SetCookie2"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/BasicCommentHandler" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/cookie/AbstractCookieAttributeHandler"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/BasicDomainHandler" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/cookie/CookieAttributeHandler"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/BasicExpiresHandler" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/cookie/AbstractCookieAttributeHandler"/>
+ <method name="&lt;init>([Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/BasicMaxAgeHandler" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/cookie/AbstractCookieAttributeHandler"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/BasicPathHandler" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/cookie/CookieAttributeHandler"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/BasicSecureHandler" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/cookie/AbstractCookieAttributeHandler"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/BestMatchSpec" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/cookie/CookieSpec"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>([Ljava/lang/String;Z)V"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/BestMatchSpecFactory" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/cookie/CookieSpecFactory"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/BrowserCompatSpec" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/cookie/CookieSpecBase"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>([Ljava/lang/String;)V"/>
+ <field name="DATE_PATTERNS"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/BrowserCompatSpecFactory" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/cookie/CookieSpecFactory"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/CookieSpecBase" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/cookie/AbstractCookieSpec"/>
+ <method name="&lt;init>()V"/>
+ <method name="getDefaultDomain(Lorg/apache/http/cookie/CookieOrigin;)Ljava/lang/String;"/>
+ <method name="getDefaultPath(Lorg/apache/http/cookie/CookieOrigin;)Ljava/lang/String;"/>
+ <method name="parse([Lorg/apache/http/HeaderElement;Lorg/apache/http/cookie/CookieOrigin;)Ljava/util/List;"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/DateParseException" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/DateUtils" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="formatDate(Ljava/util/Date;)Ljava/lang/String;"/>
+ <method name="formatDate(Ljava/util/Date;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="parseDate(Ljava/lang/String;)Ljava/util/Date;"/>
+ <method name="parseDate(Ljava/lang/String;[Ljava/lang/String;)Ljava/util/Date;"/>
+ <method name="parseDate(Ljava/lang/String;[Ljava/lang/String;Ljava/util/Date;)Ljava/util/Date;"/>
+ <field name="GMT"/>
+ <field name="PATTERN_ASCTIME"/>
+ <field name="PATTERN_RFC1036"/>
+ <field name="PATTERN_RFC1123"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/NetscapeDomainHandler" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/cookie/BasicDomainHandler"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/NetscapeDraftHeaderParser" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="parseHeader(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)Lorg/apache/http/HeaderElement;"/>
+ <field name="DEFAULT"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/NetscapeDraftSpec" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/cookie/CookieSpecBase"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>([Ljava/lang/String;)V"/>
+ <field name="EXPIRES_PATTERN"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/NetscapeDraftSpecFactory" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/cookie/CookieSpecFactory"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/RFC2109DomainHandler" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/cookie/CookieAttributeHandler"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/RFC2109Spec" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/cookie/CookieSpecBase"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>([Ljava/lang/String;Z)V"/>
+ <method name="formatCookieAsVer(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/cookie/Cookie;I)V"/>
+ <method name="formatParamAsVer(Lorg/apache/http/util/CharArrayBuffer;Ljava/lang/String;Ljava/lang/String;I)V"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/RFC2109SpecFactory" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/cookie/CookieSpecFactory"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/RFC2109VersionHandler" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/cookie/AbstractCookieAttributeHandler"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/RFC2965CommentUrlAttributeHandler" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/cookie/CookieAttributeHandler"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/RFC2965DiscardAttributeHandler" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/cookie/CookieAttributeHandler"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/RFC2965DomainAttributeHandler" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/cookie/CookieAttributeHandler"/>
+ <method name="&lt;init>()V"/>
+ <method name="domainMatch(Ljava/lang/String;Ljava/lang/String;)Z"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/RFC2965PortAttributeHandler" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/cookie/CookieAttributeHandler"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/RFC2965Spec" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/cookie/RFC2109Spec"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>([Ljava/lang/String;Z)V"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/RFC2965SpecFactory" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/cookie/CookieSpecFactory"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/cookie/RFC2965VersionAttributeHandler" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/cookie/CookieAttributeHandler"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/entity/EntityDeserializer" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Lorg/apache/http/entity/ContentLengthStrategy;)V"/>
+ <method name="deserialize(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/HttpMessage;)Lorg/apache/http/HttpEntity;"/>
+ <method name="doDeserialize(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/HttpMessage;)Lorg/apache/http/entity/BasicHttpEntity;"/>
+ </class>
+ <class name="org/apache/http/impl/entity/EntitySerializer" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Lorg/apache/http/entity/ContentLengthStrategy;)V"/>
+ <method name="doSerialize(Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/HttpMessage;)Ljava/io/OutputStream;"/>
+ <method name="serialize(Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/HttpMessage;Lorg/apache/http/HttpEntity;)V"/>
+ </class>
+ <class name="org/apache/http/impl/entity/LaxContentLengthStrategy" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/entity/ContentLengthStrategy"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/entity/StrictContentLengthStrategy" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/entity/ContentLengthStrategy"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/impl/io/AbstractMessageParser" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/io/HttpMessageParser"/>
+ <method name="&lt;init>(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/message/LineParser;Lorg/apache/http/params/HttpParams;)V"/>
+ <method name="parseHead(Lorg/apache/http/io/SessionInputBuffer;)Lorg/apache/http/HttpMessage;"/>
+ <method name="parseHeaders(Lorg/apache/http/io/SessionInputBuffer;IILorg/apache/http/message/LineParser;)[Lorg/apache/http/Header;"/>
+ <field name="lineParser"/>
+ </class>
+ <class name="org/apache/http/impl/io/AbstractMessageWriter" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/io/HttpMessageWriter"/>
+ <method name="&lt;init>(Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/message/LineFormatter;Lorg/apache/http/params/HttpParams;)V"/>
+ <method name="writeHeadLine(Lorg/apache/http/HttpMessage;)V"/>
+ <field name="lineBuf"/>
+ <field name="lineFormatter"/>
+ <field name="sessionBuffer"/>
+ </class>
+ <class name="org/apache/http/impl/io/AbstractSessionInputBuffer" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/io/SessionInputBuffer"/>
+ <method name="&lt;init>()V"/>
+ <method name="fillBuffer()I"/>
+ <method name="hasBufferedData()Z"/>
+ <method name="init(Ljava/io/InputStream;ILorg/apache/http/params/HttpParams;)V"/>
+ </class>
+ <class name="org/apache/http/impl/io/AbstractSessionOutputBuffer" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/io/SessionOutputBuffer"/>
+ <method name="&lt;init>()V"/>
+ <method name="flushBuffer()V"/>
+ <method name="init(Ljava/io/OutputStream;ILorg/apache/http/params/HttpParams;)V"/>
+ </class>
+ <class name="org/apache/http/impl/io/ChunkedInputStream" since="1" deprecated="22" removed="23">
+ <extends name="java/io/InputStream"/>
+ <method name="&lt;init>(Lorg/apache/http/io/SessionInputBuffer;)V"/>
+ <method name="getFooters()[Lorg/apache/http/Header;"/>
+ </class>
+ <class name="org/apache/http/impl/io/ChunkedOutputStream" since="1" deprecated="22" removed="23">
+ <extends name="java/io/OutputStream"/>
+ <method name="&lt;init>(Lorg/apache/http/io/SessionOutputBuffer;)V"/>
+ <method name="&lt;init>(Lorg/apache/http/io/SessionOutputBuffer;I)V"/>
+ <method name="finish()V"/>
+ <method name="flushCache()V"/>
+ <method name="flushCacheWithAppend([BII)V"/>
+ <method name="writeClosingChunk()V"/>
+ </class>
+ <class name="org/apache/http/impl/io/ContentLengthInputStream" since="1" deprecated="22" removed="23">
+ <extends name="java/io/InputStream"/>
+ <method name="&lt;init>(Lorg/apache/http/io/SessionInputBuffer;J)V"/>
+ </class>
+ <class name="org/apache/http/impl/io/ContentLengthOutputStream" since="1" deprecated="22" removed="23">
+ <extends name="java/io/OutputStream"/>
+ <method name="&lt;init>(Lorg/apache/http/io/SessionOutputBuffer;J)V"/>
+ </class>
+ <class name="org/apache/http/impl/io/HttpRequestParser" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/io/AbstractMessageParser"/>
+ <method name="&lt;init>(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/message/LineParser;Lorg/apache/http/HttpRequestFactory;Lorg/apache/http/params/HttpParams;)V"/>
+ </class>
+ <class name="org/apache/http/impl/io/HttpRequestWriter" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/io/AbstractMessageWriter"/>
+ <method name="&lt;init>(Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/message/LineFormatter;Lorg/apache/http/params/HttpParams;)V"/>
+ </class>
+ <class name="org/apache/http/impl/io/HttpResponseParser" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/io/AbstractMessageParser"/>
+ <method name="&lt;init>(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/message/LineParser;Lorg/apache/http/HttpResponseFactory;Lorg/apache/http/params/HttpParams;)V"/>
+ </class>
+ <class name="org/apache/http/impl/io/HttpResponseWriter" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/io/AbstractMessageWriter"/>
+ <method name="&lt;init>(Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/message/LineFormatter;Lorg/apache/http/params/HttpParams;)V"/>
+ </class>
+ <class name="org/apache/http/impl/io/HttpTransportMetricsImpl" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/io/HttpTransportMetrics"/>
+ <method name="&lt;init>()V"/>
+ <method name="incrementBytesTransferred(J)V"/>
+ <method name="setBytesTransferred(J)V"/>
+ </class>
+ <class name="org/apache/http/impl/io/IdentityInputStream" since="1" deprecated="22" removed="23">
+ <extends name="java/io/InputStream"/>
+ <method name="&lt;init>(Lorg/apache/http/io/SessionInputBuffer;)V"/>
+ </class>
+ <class name="org/apache/http/impl/io/IdentityOutputStream" since="1" deprecated="22" removed="23">
+ <extends name="java/io/OutputStream"/>
+ <method name="&lt;init>(Lorg/apache/http/io/SessionOutputBuffer;)V"/>
+ </class>
+ <class name="org/apache/http/impl/io/SocketInputBuffer" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/io/AbstractSessionInputBuffer"/>
+ <method name="&lt;init>(Ljava/net/Socket;ILorg/apache/http/params/HttpParams;)V"/>
+ </class>
+ <class name="org/apache/http/impl/io/SocketOutputBuffer" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/impl/io/AbstractSessionOutputBuffer"/>
+ <method name="&lt;init>(Ljava/net/Socket;ILorg/apache/http/params/HttpParams;)V"/>
+ </class>
+ <class name="org/apache/http/io/HttpMessageParser" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="parse()Lorg/apache/http/HttpMessage;"/>
+ </class>
+ <class name="org/apache/http/io/HttpMessageWriter" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="write(Lorg/apache/http/HttpMessage;)V"/>
+ </class>
+ <class name="org/apache/http/io/HttpTransportMetrics" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="getBytesTransferred()J"/>
+ <method name="reset()V"/>
+ </class>
+ <class name="org/apache/http/io/SessionInputBuffer" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="getMetrics()Lorg/apache/http/io/HttpTransportMetrics;"/>
+ <method name="isDataAvailable(I)Z"/>
+ <method name="read()I"/>
+ <method name="read([B)I"/>
+ <method name="read([BII)I"/>
+ <method name="readLine()Ljava/lang/String;"/>
+ <method name="readLine(Lorg/apache/http/util/CharArrayBuffer;)I"/>
+ </class>
+ <class name="org/apache/http/io/SessionOutputBuffer" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="flush()V"/>
+ <method name="getMetrics()Lorg/apache/http/io/HttpTransportMetrics;"/>
+ <method name="write(I)V"/>
+ <method name="write([B)V"/>
+ <method name="write([BII)V"/>
+ <method name="writeLine(Ljava/lang/String;)V"/>
+ <method name="writeLine(Lorg/apache/http/util/CharArrayBuffer;)V"/>
+ </class>
+ <class name="org/apache/http/message/AbstractHttpMessage" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpMessage"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;)V"/>
+ <field name="headergroup"/>
+ <field name="params"/>
+ </class>
+ <class name="org/apache/http/message/BasicHeader" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="org/apache/http/Header"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/apache/http/message/BasicHeaderElement" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="org/apache/http/HeaderElement"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;[Lorg/apache/http/NameValuePair;)V"/>
+ </class>
+ <class name="org/apache/http/message/BasicHeaderElementIterator" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HeaderElementIterator"/>
+ <method name="&lt;init>(Lorg/apache/http/HeaderIterator;)V"/>
+ <method name="&lt;init>(Lorg/apache/http/HeaderIterator;Lorg/apache/http/message/HeaderValueParser;)V"/>
+ </class>
+ <class name="org/apache/http/message/BasicHeaderIterator" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HeaderIterator"/>
+ <method name="&lt;init>([Lorg/apache/http/Header;Ljava/lang/String;)V"/>
+ <method name="filterHeader(I)Z"/>
+ <method name="findNext(I)I"/>
+ <field name="allHeaders"/>
+ <field name="currentIndex"/>
+ <field name="headerName"/>
+ </class>
+ <class name="org/apache/http/message/BasicHeaderValueFormatter" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/message/HeaderValueFormatter"/>
+ <method name="&lt;init>()V"/>
+ <method name="doFormatValue(Lorg/apache/http/util/CharArrayBuffer;Ljava/lang/String;Z)V"/>
+ <method name="estimateElementsLen([Lorg/apache/http/HeaderElement;)I"/>
+ <method name="estimateHeaderElementLen(Lorg/apache/http/HeaderElement;)I"/>
+ <method name="estimateNameValuePairLen(Lorg/apache/http/NameValuePair;)I"/>
+ <method name="estimateParametersLen([Lorg/apache/http/NameValuePair;)I"/>
+ <method name="formatElements([Lorg/apache/http/HeaderElement;ZLorg/apache/http/message/HeaderValueFormatter;)Ljava/lang/String;"/>
+ <method name="formatHeaderElement(Lorg/apache/http/HeaderElement;ZLorg/apache/http/message/HeaderValueFormatter;)Ljava/lang/String;"/>
+ <method name="formatNameValuePair(Lorg/apache/http/NameValuePair;ZLorg/apache/http/message/HeaderValueFormatter;)Ljava/lang/String;"/>
+ <method name="formatParameters([Lorg/apache/http/NameValuePair;ZLorg/apache/http/message/HeaderValueFormatter;)Ljava/lang/String;"/>
+ <method name="isSeparator(C)Z"/>
+ <method name="isUnsafe(C)Z"/>
+ <field name="DEFAULT"/>
+ <field name="SEPARATORS"/>
+ <field name="UNSAFE_CHARS"/>
+ </class>
+ <class name="org/apache/http/message/BasicHeaderValueParser" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/message/HeaderValueParser"/>
+ <method name="&lt;init>()V"/>
+ <method name="createHeaderElement(Ljava/lang/String;Ljava/lang/String;[Lorg/apache/http/NameValuePair;)Lorg/apache/http/HeaderElement;"/>
+ <method name="createNameValuePair(Ljava/lang/String;Ljava/lang/String;)Lorg/apache/http/NameValuePair;"/>
+ <method name="parseElements(Ljava/lang/String;Lorg/apache/http/message/HeaderValueParser;)[Lorg/apache/http/HeaderElement;"/>
+ <method name="parseHeaderElement(Ljava/lang/String;Lorg/apache/http/message/HeaderValueParser;)Lorg/apache/http/HeaderElement;"/>
+ <method name="parseNameValuePair(Ljava/lang/String;Lorg/apache/http/message/HeaderValueParser;)Lorg/apache/http/NameValuePair;"/>
+ <method name="parseNameValuePair(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;[C)Lorg/apache/http/NameValuePair;"/>
+ <method name="parseParameters(Ljava/lang/String;Lorg/apache/http/message/HeaderValueParser;)[Lorg/apache/http/NameValuePair;"/>
+ <field name="DEFAULT"/>
+ </class>
+ <class name="org/apache/http/message/BasicHttpEntityEnclosingRequest" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/message/BasicHttpRequest"/>
+ <implements name="org/apache/http/HttpEntityEnclosingRequest"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Lorg/apache/http/ProtocolVersion;)V"/>
+ <method name="&lt;init>(Lorg/apache/http/RequestLine;)V"/>
+ </class>
+ <class name="org/apache/http/message/BasicHttpRequest" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/message/AbstractHttpMessage"/>
+ <implements name="org/apache/http/HttpRequest"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Lorg/apache/http/ProtocolVersion;)V"/>
+ <method name="&lt;init>(Lorg/apache/http/RequestLine;)V"/>
+ </class>
+ <class name="org/apache/http/message/BasicHttpResponse" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/message/AbstractHttpMessage"/>
+ <implements name="org/apache/http/HttpResponse"/>
+ <method name="&lt;init>(Lorg/apache/http/ProtocolVersion;ILjava/lang/String;)V"/>
+ <method name="&lt;init>(Lorg/apache/http/StatusLine;)V"/>
+ <method name="&lt;init>(Lorg/apache/http/StatusLine;Lorg/apache/http/ReasonPhraseCatalog;Ljava/util/Locale;)V"/>
+ <method name="getReason(I)Ljava/lang/String;"/>
+ </class>
+ <class name="org/apache/http/message/BasicLineFormatter" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/message/LineFormatter"/>
+ <method name="&lt;init>()V"/>
+ <method name="doFormatHeader(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/Header;)V"/>
+ <method name="doFormatRequestLine(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/RequestLine;)V"/>
+ <method name="doFormatStatusLine(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/StatusLine;)V"/>
+ <method name="estimateProtocolVersionLen(Lorg/apache/http/ProtocolVersion;)I"/>
+ <method name="formatHeader(Lorg/apache/http/Header;Lorg/apache/http/message/LineFormatter;)Ljava/lang/String;"/>
+ <method name="formatProtocolVersion(Lorg/apache/http/ProtocolVersion;Lorg/apache/http/message/LineFormatter;)Ljava/lang/String;"/>
+ <method name="formatRequestLine(Lorg/apache/http/RequestLine;Lorg/apache/http/message/LineFormatter;)Ljava/lang/String;"/>
+ <method name="formatStatusLine(Lorg/apache/http/StatusLine;Lorg/apache/http/message/LineFormatter;)Ljava/lang/String;"/>
+ <method name="initBuffer(Lorg/apache/http/util/CharArrayBuffer;)Lorg/apache/http/util/CharArrayBuffer;"/>
+ <field name="DEFAULT"/>
+ </class>
+ <class name="org/apache/http/message/BasicLineParser" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/message/LineParser"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Lorg/apache/http/ProtocolVersion;)V"/>
+ <method name="createProtocolVersion(II)Lorg/apache/http/ProtocolVersion;"/>
+ <method name="createRequestLine(Ljava/lang/String;Ljava/lang/String;Lorg/apache/http/ProtocolVersion;)Lorg/apache/http/RequestLine;"/>
+ <method name="createStatusLine(Lorg/apache/http/ProtocolVersion;ILjava/lang/String;)Lorg/apache/http/StatusLine;"/>
+ <method name="parseHeader(Ljava/lang/String;Lorg/apache/http/message/LineParser;)Lorg/apache/http/Header;"/>
+ <method name="parseProtocolVersion(Ljava/lang/String;Lorg/apache/http/message/LineParser;)Lorg/apache/http/ProtocolVersion;"/>
+ <method name="parseRequestLine(Ljava/lang/String;Lorg/apache/http/message/LineParser;)Lorg/apache/http/RequestLine;"/>
+ <method name="parseStatusLine(Ljava/lang/String;Lorg/apache/http/message/LineParser;)Lorg/apache/http/StatusLine;"/>
+ <method name="skipWhitespace(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)V"/>
+ <field name="DEFAULT"/>
+ <field name="protocol"/>
+ </class>
+ <class name="org/apache/http/message/BasicListHeaderIterator" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HeaderIterator"/>
+ <method name="&lt;init>(Ljava/util/List;Ljava/lang/String;)V"/>
+ <method name="filterHeader(I)Z"/>
+ <method name="findNext(I)I"/>
+ <field name="allHeaders"/>
+ <field name="currentIndex"/>
+ <field name="headerName"/>
+ <field name="lastIndex"/>
+ </class>
+ <class name="org/apache/http/message/BasicNameValuePair" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="org/apache/http/NameValuePair"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/apache/http/message/BasicRequestLine" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="org/apache/http/RequestLine"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Lorg/apache/http/ProtocolVersion;)V"/>
+ </class>
+ <class name="org/apache/http/message/BasicStatusLine" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="org/apache/http/StatusLine"/>
+ <method name="&lt;init>(Lorg/apache/http/ProtocolVersion;ILjava/lang/String;)V"/>
+ </class>
+ <class name="org/apache/http/message/BasicTokenIterator" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/TokenIterator"/>
+ <method name="&lt;init>(Lorg/apache/http/HeaderIterator;)V"/>
+ <method name="createToken(Ljava/lang/String;II)Ljava/lang/String;"/>
+ <method name="findNext(I)I"/>
+ <method name="findTokenEnd(I)I"/>
+ <method name="findTokenSeparator(I)I"/>
+ <method name="findTokenStart(I)I"/>
+ <method name="isHttpSeparator(C)Z"/>
+ <method name="isTokenChar(C)Z"/>
+ <method name="isTokenSeparator(C)Z"/>
+ <method name="isWhitespace(C)Z"/>
+ <field name="HTTP_SEPARATORS"/>
+ <field name="currentHeader"/>
+ <field name="currentToken"/>
+ <field name="headerIt"/>
+ <field name="searchPos"/>
+ </class>
+ <class name="org/apache/http/message/BufferedHeader" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="org/apache/http/FormattedHeader"/>
+ <method name="&lt;init>(Lorg/apache/http/util/CharArrayBuffer;)V"/>
+ </class>
+ <class name="org/apache/http/message/HeaderGroup" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="addHeader(Lorg/apache/http/Header;)V"/>
+ <method name="clear()V"/>
+ <method name="containsHeader(Ljava/lang/String;)Z"/>
+ <method name="copy()Lorg/apache/http/message/HeaderGroup;"/>
+ <method name="getAllHeaders()[Lorg/apache/http/Header;"/>
+ <method name="getCondensedHeader(Ljava/lang/String;)Lorg/apache/http/Header;"/>
+ <method name="getFirstHeader(Ljava/lang/String;)Lorg/apache/http/Header;"/>
+ <method name="getHeaders(Ljava/lang/String;)[Lorg/apache/http/Header;"/>
+ <method name="getLastHeader(Ljava/lang/String;)Lorg/apache/http/Header;"/>
+ <method name="iterator()Lorg/apache/http/HeaderIterator;"/>
+ <method name="iterator(Ljava/lang/String;)Lorg/apache/http/HeaderIterator;"/>
+ <method name="removeHeader(Lorg/apache/http/Header;)V"/>
+ <method name="setHeaders([Lorg/apache/http/Header;)V"/>
+ <method name="updateHeader(Lorg/apache/http/Header;)V"/>
+ </class>
+ <class name="org/apache/http/message/HeaderValueFormatter" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="formatElements(Lorg/apache/http/util/CharArrayBuffer;[Lorg/apache/http/HeaderElement;Z)Lorg/apache/http/util/CharArrayBuffer;"/>
+ <method name="formatHeaderElement(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/HeaderElement;Z)Lorg/apache/http/util/CharArrayBuffer;"/>
+ <method name="formatNameValuePair(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/NameValuePair;Z)Lorg/apache/http/util/CharArrayBuffer;"/>
+ <method name="formatParameters(Lorg/apache/http/util/CharArrayBuffer;[Lorg/apache/http/NameValuePair;Z)Lorg/apache/http/util/CharArrayBuffer;"/>
+ </class>
+ <class name="org/apache/http/message/HeaderValueParser" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="parseElements(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)[Lorg/apache/http/HeaderElement;"/>
+ <method name="parseHeaderElement(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)Lorg/apache/http/HeaderElement;"/>
+ <method name="parseNameValuePair(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)Lorg/apache/http/NameValuePair;"/>
+ <method name="parseParameters(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)[Lorg/apache/http/NameValuePair;"/>
+ </class>
+ <class name="org/apache/http/message/LineFormatter" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="appendProtocolVersion(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/ProtocolVersion;)Lorg/apache/http/util/CharArrayBuffer;"/>
+ <method name="formatHeader(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/Header;)Lorg/apache/http/util/CharArrayBuffer;"/>
+ <method name="formatRequestLine(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/RequestLine;)Lorg/apache/http/util/CharArrayBuffer;"/>
+ <method name="formatStatusLine(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/StatusLine;)Lorg/apache/http/util/CharArrayBuffer;"/>
+ </class>
+ <class name="org/apache/http/message/LineParser" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="hasProtocolVersion(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)Z"/>
+ <method name="parseHeader(Lorg/apache/http/util/CharArrayBuffer;)Lorg/apache/http/Header;"/>
+ <method name="parseProtocolVersion(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)Lorg/apache/http/ProtocolVersion;"/>
+ <method name="parseRequestLine(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)Lorg/apache/http/RequestLine;"/>
+ <method name="parseStatusLine(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)Lorg/apache/http/StatusLine;"/>
+ </class>
+ <class name="org/apache/http/message/ParserCursor" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(II)V"/>
+ <method name="atEnd()Z"/>
+ <method name="getLowerBound()I"/>
+ <method name="getPos()I"/>
+ <method name="getUpperBound()I"/>
+ <method name="updatePos(I)V"/>
+ </class>
+ <class name="org/apache/http/params/AbstractHttpParams" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/params/HttpParams"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/params/BasicHttpParams" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/params/AbstractHttpParams"/>
+ <implements name="java/io/Serializable"/>
+ <implements name="java/lang/Cloneable"/>
+ <method name="&lt;init>()V"/>
+ <method name="clear()V"/>
+ <method name="copyParams(Lorg/apache/http/params/HttpParams;)V"/>
+ <method name="isParameterSet(Ljava/lang/String;)Z"/>
+ <method name="isParameterSetLocally(Ljava/lang/String;)Z"/>
+ <method name="setParameters([Ljava/lang/String;Ljava/lang/Object;)V"/>
+ </class>
+ <class name="org/apache/http/params/CoreConnectionPNames" since="1" deprecated="22">
+ <extends name="java/lang/Object"/>
+ <field name="CONNECTION_TIMEOUT"/>
+ <field name="MAX_HEADER_COUNT"/>
+ <field name="MAX_LINE_LENGTH"/>
+ <field name="SOCKET_BUFFER_SIZE"/>
+ <field name="SO_LINGER"/>
+ <field name="SO_TIMEOUT"/>
+ <field name="STALE_CONNECTION_CHECK"/>
+ <field name="TCP_NODELAY"/>
+ </class>
+ <class name="org/apache/http/params/CoreProtocolPNames" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <field name="HTTP_CONTENT_CHARSET"/>
+ <field name="HTTP_ELEMENT_CHARSET"/>
+ <field name="ORIGIN_SERVER"/>
+ <field name="PROTOCOL_VERSION"/>
+ <field name="STRICT_TRANSFER_ENCODING"/>
+ <field name="USER_AGENT"/>
+ <field name="USE_EXPECT_CONTINUE"/>
+ <field name="WAIT_FOR_CONTINUE"/>
+ </class>
+ <class name="org/apache/http/params/DefaultedHttpParams" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/params/AbstractHttpParams"/>
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;Lorg/apache/http/params/HttpParams;)V"/>
+ <method name="getDefaults()Lorg/apache/http/params/HttpParams;"/>
+ </class>
+ <class name="org/apache/http/params/HttpAbstractParamBean" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;)V"/>
+ <field name="params"/>
+ </class>
+ <class name="org/apache/http/params/HttpConnectionParamBean" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/params/HttpAbstractParamBean"/>
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;)V"/>
+ <method name="setConnectionTimeout(I)V"/>
+ <method name="setLinger(I)V"/>
+ <method name="setSoTimeout(I)V"/>
+ <method name="setSocketBufferSize(I)V"/>
+ <method name="setStaleCheckingEnabled(Z)V"/>
+ <method name="setTcpNoDelay(Z)V"/>
+ </class>
+ <class name="org/apache/http/params/HttpConnectionParams" since="1" deprecated="22">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/params/CoreConnectionPNames"/>
+ <method name="&lt;init>()V"/>
+ <method name="getConnectionTimeout(Lorg/apache/http/params/HttpParams;)I"/>
+ <method name="getLinger(Lorg/apache/http/params/HttpParams;)I"/>
+ <method name="getSoTimeout(Lorg/apache/http/params/HttpParams;)I"/>
+ <method name="getSocketBufferSize(Lorg/apache/http/params/HttpParams;)I"/>
+ <method name="getTcpNoDelay(Lorg/apache/http/params/HttpParams;)Z"/>
+ <method name="isStaleCheckingEnabled(Lorg/apache/http/params/HttpParams;)Z"/>
+ <method name="setConnectionTimeout(Lorg/apache/http/params/HttpParams;I)V"/>
+ <method name="setLinger(Lorg/apache/http/params/HttpParams;I)V"/>
+ <method name="setSoTimeout(Lorg/apache/http/params/HttpParams;I)V"/>
+ <method name="setSocketBufferSize(Lorg/apache/http/params/HttpParams;I)V"/>
+ <method name="setStaleCheckingEnabled(Lorg/apache/http/params/HttpParams;Z)V"/>
+ <method name="setTcpNoDelay(Lorg/apache/http/params/HttpParams;Z)V"/>
+ </class>
+ <class name="org/apache/http/params/HttpParams" since="1" deprecated="22">
+ <extends name="java/lang/Object"/>
+ <method name="copy()Lorg/apache/http/params/HttpParams;"/>
+ <method name="getBooleanParameter(Ljava/lang/String;Z)Z"/>
+ <method name="getDoubleParameter(Ljava/lang/String;D)D"/>
+ <method name="getIntParameter(Ljava/lang/String;I)I"/>
+ <method name="getLongParameter(Ljava/lang/String;J)J"/>
+ <method name="getParameter(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="isParameterFalse(Ljava/lang/String;)Z"/>
+ <method name="isParameterTrue(Ljava/lang/String;)Z"/>
+ <method name="removeParameter(Ljava/lang/String;)Z"/>
+ <method name="setBooleanParameter(Ljava/lang/String;Z)Lorg/apache/http/params/HttpParams;"/>
+ <method name="setDoubleParameter(Ljava/lang/String;D)Lorg/apache/http/params/HttpParams;"/>
+ <method name="setIntParameter(Ljava/lang/String;I)Lorg/apache/http/params/HttpParams;"/>
+ <method name="setLongParameter(Ljava/lang/String;J)Lorg/apache/http/params/HttpParams;"/>
+ <method name="setParameter(Ljava/lang/String;Ljava/lang/Object;)Lorg/apache/http/params/HttpParams;"/>
+ </class>
+ <class name="org/apache/http/params/HttpProtocolParamBean" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/params/HttpAbstractParamBean"/>
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;)V"/>
+ <method name="setContentCharset(Ljava/lang/String;)V"/>
+ <method name="setHttpElementCharset(Ljava/lang/String;)V"/>
+ <method name="setUseExpectContinue(Z)V"/>
+ <method name="setUserAgent(Ljava/lang/String;)V"/>
+ <method name="setVersion(Lorg/apache/http/HttpVersion;)V"/>
+ </class>
+ <class name="org/apache/http/params/HttpProtocolParams" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/params/CoreProtocolPNames"/>
+ <method name="&lt;init>()V"/>
+ <method name="getContentCharset(Lorg/apache/http/params/HttpParams;)Ljava/lang/String;"/>
+ <method name="getHttpElementCharset(Lorg/apache/http/params/HttpParams;)Ljava/lang/String;"/>
+ <method name="getUserAgent(Lorg/apache/http/params/HttpParams;)Ljava/lang/String;"/>
+ <method name="getVersion(Lorg/apache/http/params/HttpParams;)Lorg/apache/http/ProtocolVersion;"/>
+ <method name="setContentCharset(Lorg/apache/http/params/HttpParams;Ljava/lang/String;)V"/>
+ <method name="setHttpElementCharset(Lorg/apache/http/params/HttpParams;Ljava/lang/String;)V"/>
+ <method name="setUseExpectContinue(Lorg/apache/http/params/HttpParams;Z)V"/>
+ <method name="setUserAgent(Lorg/apache/http/params/HttpParams;Ljava/lang/String;)V"/>
+ <method name="setVersion(Lorg/apache/http/params/HttpParams;Lorg/apache/http/ProtocolVersion;)V"/>
+ <method name="useExpectContinue(Lorg/apache/http/params/HttpParams;)Z"/>
+ </class>
+ <class name="org/apache/http/protocol/BasicHttpContext" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/protocol/HttpContext"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Lorg/apache/http/protocol/HttpContext;)V"/>
+ </class>
+ <class name="org/apache/http/protocol/BasicHttpProcessor" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="java/lang/Cloneable"/>
+ <implements name="org/apache/http/protocol/HttpProcessor"/>
+ <implements name="org/apache/http/protocol/HttpRequestInterceptorList"/>
+ <implements name="org/apache/http/protocol/HttpResponseInterceptorList"/>
+ <method name="&lt;init>()V"/>
+ <method name="addInterceptor(Lorg/apache/http/HttpRequestInterceptor;)V"/>
+ <method name="addInterceptor(Lorg/apache/http/HttpRequestInterceptor;I)V"/>
+ <method name="addInterceptor(Lorg/apache/http/HttpResponseInterceptor;)V"/>
+ <method name="addInterceptor(Lorg/apache/http/HttpResponseInterceptor;I)V"/>
+ <method name="clearInterceptors()V"/>
+ <method name="copy()Lorg/apache/http/protocol/BasicHttpProcessor;"/>
+ <method name="copyInterceptors(Lorg/apache/http/protocol/BasicHttpProcessor;)V"/>
+ <field name="requestInterceptors"/>
+ <field name="responseInterceptors"/>
+ </class>
+ <class name="org/apache/http/protocol/DefaultedHttpContext" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/protocol/HttpContext"/>
+ <method name="&lt;init>(Lorg/apache/http/protocol/HttpContext;Lorg/apache/http/protocol/HttpContext;)V"/>
+ <method name="getDefaults()Lorg/apache/http/protocol/HttpContext;"/>
+ </class>
+ <class name="org/apache/http/protocol/ExecutionContext" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <field name="HTTP_CONNECTION"/>
+ <field name="HTTP_PROXY_HOST"/>
+ <field name="HTTP_REQUEST"/>
+ <field name="HTTP_REQ_SENT"/>
+ <field name="HTTP_RESPONSE"/>
+ <field name="HTTP_TARGET_HOST"/>
+ </class>
+ <class name="org/apache/http/protocol/HTTP" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="isWhitespace(C)Z"/>
+ <field name="ASCII"/>
+ <field name="CHARSET_PARAM"/>
+ <field name="CHUNK_CODING"/>
+ <field name="CONN_CLOSE"/>
+ <field name="CONN_DIRECTIVE"/>
+ <field name="CONN_KEEP_ALIVE"/>
+ <field name="CONTENT_ENCODING"/>
+ <field name="CONTENT_LEN"/>
+ <field name="CONTENT_TYPE"/>
+ <field name="CR"/>
+ <field name="DATE_HEADER"/>
+ <field name="DEFAULT_CONTENT_CHARSET"/>
+ <field name="DEFAULT_CONTENT_TYPE"/>
+ <field name="DEFAULT_PROTOCOL_CHARSET"/>
+ <field name="EXPECT_CONTINUE"/>
+ <field name="EXPECT_DIRECTIVE"/>
+ <field name="HT"/>
+ <field name="IDENTITY_CODING"/>
+ <field name="ISO_8859_1"/>
+ <field name="LF"/>
+ <field name="OCTET_STREAM_TYPE"/>
+ <field name="PLAIN_TEXT_TYPE"/>
+ <field name="SERVER_HEADER"/>
+ <field name="SP"/>
+ <field name="TARGET_HOST"/>
+ <field name="TRANSFER_ENCODING"/>
+ <field name="USER_AGENT"/>
+ <field name="US_ASCII"/>
+ <field name="UTF_16"/>
+ <field name="UTF_8"/>
+ </class>
+ <class name="org/apache/http/protocol/HttpContext" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="getAttribute(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="removeAttribute(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="setAttribute(Ljava/lang/String;Ljava/lang/Object;)V"/>
+ <field name="RESERVED_PREFIX"/>
+ </class>
+ <class name="org/apache/http/protocol/HttpDateGenerator" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getCurrentDate()Ljava/lang/String;"/>
+ <field name="GMT"/>
+ <field name="PATTERN_RFC1123"/>
+ </class>
+ <class name="org/apache/http/protocol/HttpExpectationVerifier" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="verify(Lorg/apache/http/HttpRequest;Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)V"/>
+ </class>
+ <class name="org/apache/http/protocol/HttpProcessor" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpRequestInterceptor"/>
+ <implements name="org/apache/http/HttpResponseInterceptor"/>
+ </class>
+ <class name="org/apache/http/protocol/HttpRequestExecutor" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="canResponseHaveBody(Lorg/apache/http/HttpRequest;Lorg/apache/http/HttpResponse;)Z"/>
+ <method name="doReceiveResponse(Lorg/apache/http/HttpRequest;Lorg/apache/http/HttpClientConnection;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpResponse;"/>
+ <method name="doSendRequest(Lorg/apache/http/HttpRequest;Lorg/apache/http/HttpClientConnection;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpResponse;"/>
+ <method name="execute(Lorg/apache/http/HttpRequest;Lorg/apache/http/HttpClientConnection;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpResponse;"/>
+ <method name="postProcess(Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpProcessor;Lorg/apache/http/protocol/HttpContext;)V"/>
+ <method name="preProcess(Lorg/apache/http/HttpRequest;Lorg/apache/http/protocol/HttpProcessor;Lorg/apache/http/protocol/HttpContext;)V"/>
+ </class>
+ <class name="org/apache/http/protocol/HttpRequestHandler" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="handle(Lorg/apache/http/HttpRequest;Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)V"/>
+ </class>
+ <class name="org/apache/http/protocol/HttpRequestHandlerRegistry" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/protocol/HttpRequestHandlerResolver"/>
+ <method name="&lt;init>()V"/>
+ <method name="matchUriRequestPattern(Ljava/lang/String;Ljava/lang/String;)Z" deprecated="16"/>
+ <method name="register(Ljava/lang/String;Lorg/apache/http/protocol/HttpRequestHandler;)V"/>
+ <method name="setHandlers(Ljava/util/Map;)V"/>
+ <method name="unregister(Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/apache/http/protocol/HttpRequestHandlerResolver" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="lookup(Ljava/lang/String;)Lorg/apache/http/protocol/HttpRequestHandler;"/>
+ </class>
+ <class name="org/apache/http/protocol/HttpRequestInterceptorList" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="addRequestInterceptor(Lorg/apache/http/HttpRequestInterceptor;)V"/>
+ <method name="addRequestInterceptor(Lorg/apache/http/HttpRequestInterceptor;I)V"/>
+ <method name="clearRequestInterceptors()V"/>
+ <method name="getRequestInterceptor(I)Lorg/apache/http/HttpRequestInterceptor;"/>
+ <method name="getRequestInterceptorCount()I"/>
+ <method name="removeRequestInterceptorByClass(Ljava/lang/Class;)V"/>
+ <method name="setInterceptors(Ljava/util/List;)V"/>
+ </class>
+ <class name="org/apache/http/protocol/HttpResponseInterceptorList" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="addResponseInterceptor(Lorg/apache/http/HttpResponseInterceptor;)V"/>
+ <method name="addResponseInterceptor(Lorg/apache/http/HttpResponseInterceptor;I)V"/>
+ <method name="clearResponseInterceptors()V"/>
+ <method name="getResponseInterceptor(I)Lorg/apache/http/HttpResponseInterceptor;"/>
+ <method name="getResponseInterceptorCount()I"/>
+ <method name="removeResponseInterceptorByClass(Ljava/lang/Class;)V"/>
+ <method name="setInterceptors(Ljava/util/List;)V"/>
+ </class>
+ <class name="org/apache/http/protocol/HttpService" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Lorg/apache/http/protocol/HttpProcessor;Lorg/apache/http/ConnectionReuseStrategy;Lorg/apache/http/HttpResponseFactory;)V"/>
+ <method name="doService(Lorg/apache/http/HttpRequest;Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)V"/>
+ <method name="getParams()Lorg/apache/http/params/HttpParams;"/>
+ <method name="handleException(Lorg/apache/http/HttpException;Lorg/apache/http/HttpResponse;)V"/>
+ <method name="handleRequest(Lorg/apache/http/HttpServerConnection;Lorg/apache/http/protocol/HttpContext;)V"/>
+ <method name="setConnReuseStrategy(Lorg/apache/http/ConnectionReuseStrategy;)V"/>
+ <method name="setExpectationVerifier(Lorg/apache/http/protocol/HttpExpectationVerifier;)V"/>
+ <method name="setHandlerResolver(Lorg/apache/http/protocol/HttpRequestHandlerResolver;)V"/>
+ <method name="setHttpProcessor(Lorg/apache/http/protocol/HttpProcessor;)V"/>
+ <method name="setParams(Lorg/apache/http/params/HttpParams;)V"/>
+ <method name="setResponseFactory(Lorg/apache/http/HttpResponseFactory;)V"/>
+ </class>
+ <class name="org/apache/http/protocol/RequestConnControl" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpRequestInterceptor"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/protocol/RequestContent" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpRequestInterceptor"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/protocol/RequestDate" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpRequestInterceptor"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/protocol/RequestExpectContinue" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpRequestInterceptor"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/protocol/RequestTargetHost" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpRequestInterceptor"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/protocol/RequestUserAgent" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpRequestInterceptor"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/protocol/ResponseConnControl" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpResponseInterceptor"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/protocol/ResponseContent" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpResponseInterceptor"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/protocol/ResponseDate" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpResponseInterceptor"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/protocol/ResponseServer" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <implements name="org/apache/http/HttpResponseInterceptor"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/apache/http/protocol/SyncBasicHttpContext" since="1" deprecated="22" removed="23">
+ <extends name="org/apache/http/protocol/BasicHttpContext"/>
+ <method name="&lt;init>(Lorg/apache/http/protocol/HttpContext;)V"/>
+ </class>
+ <class name="org/apache/http/protocol/UriPatternMatcher" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="lookup(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="matchUriRequestPattern(Ljava/lang/String;Ljava/lang/String;)Z"/>
+ <method name="register(Ljava/lang/String;Ljava/lang/Object;)V"/>
+ <method name="setHandlers(Ljava/util/Map;)V"/>
+ <method name="unregister(Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/apache/http/util/ByteArrayBuffer" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="append(I)V"/>
+ <method name="append(Lorg/apache/http/util/CharArrayBuffer;II)V"/>
+ <method name="append([BII)V"/>
+ <method name="append([CII)V"/>
+ <method name="buffer()[B"/>
+ <method name="byteAt(I)I"/>
+ <method name="capacity()I"/>
+ <method name="clear()V"/>
+ <method name="isEmpty()Z"/>
+ <method name="isFull()Z"/>
+ <method name="length()I"/>
+ <method name="setLength(I)V"/>
+ <method name="toByteArray()[B"/>
+ </class>
+ <class name="org/apache/http/util/CharArrayBuffer" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(I)V"/>
+ <method name="append(C)V"/>
+ <method name="append(Ljava/lang/Object;)V"/>
+ <method name="append(Ljava/lang/String;)V"/>
+ <method name="append(Lorg/apache/http/util/ByteArrayBuffer;II)V"/>
+ <method name="append(Lorg/apache/http/util/CharArrayBuffer;)V"/>
+ <method name="append(Lorg/apache/http/util/CharArrayBuffer;II)V"/>
+ <method name="append([BII)V"/>
+ <method name="append([CII)V"/>
+ <method name="buffer()[C"/>
+ <method name="capacity()I"/>
+ <method name="charAt(I)C"/>
+ <method name="clear()V"/>
+ <method name="ensureCapacity(I)V"/>
+ <method name="indexOf(I)I"/>
+ <method name="indexOf(III)I"/>
+ <method name="isEmpty()Z"/>
+ <method name="isFull()Z"/>
+ <method name="length()I"/>
+ <method name="setLength(I)V"/>
+ <method name="substring(II)Ljava/lang/String;"/>
+ <method name="substringTrimmed(II)Ljava/lang/String;"/>
+ <method name="toCharArray()[C"/>
+ </class>
+ <class name="org/apache/http/util/EncodingUtils" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getAsciiBytes(Ljava/lang/String;)[B"/>
+ <method name="getAsciiString([B)Ljava/lang/String;"/>
+ <method name="getAsciiString([BII)Ljava/lang/String;"/>
+ <method name="getBytes(Ljava/lang/String;Ljava/lang/String;)[B"/>
+ <method name="getString([BIILjava/lang/String;)Ljava/lang/String;"/>
+ <method name="getString([BLjava/lang/String;)Ljava/lang/String;"/>
+ </class>
+ <class name="org/apache/http/util/EntityUtils" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getContentCharSet(Lorg/apache/http/HttpEntity;)Ljava/lang/String;"/>
+ <method name="toByteArray(Lorg/apache/http/HttpEntity;)[B"/>
+ <method name="toString(Lorg/apache/http/HttpEntity;)Ljava/lang/String;"/>
+ <method name="toString(Lorg/apache/http/HttpEntity;Ljava/lang/String;)Ljava/lang/String;"/>
+ </class>
+ <class name="org/apache/http/util/ExceptionUtils" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="initCause(Ljava/lang/Throwable;Ljava/lang/Throwable;)V"/>
+ </class>
+ <class name="org/apache/http/util/LangUtils" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="equals(Ljava/lang/Object;Ljava/lang/Object;)Z"/>
+ <method name="equals([Ljava/lang/Object;[Ljava/lang/Object;)Z"/>
+ <method name="hashCode(II)I"/>
+ <method name="hashCode(ILjava/lang/Object;)I"/>
+ <method name="hashCode(IZ)I"/>
+ <field name="HASH_OFFSET"/>
+ <field name="HASH_SEED"/>
+ </class>
+ <class name="org/apache/http/util/VersionInfo" since="1" deprecated="22" removed="23">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="fromMap(Ljava/lang/String;Ljava/util/Map;Ljava/lang/ClassLoader;)Lorg/apache/http/util/VersionInfo;"/>
+ <method name="getClassloader()Ljava/lang/String;"/>
+ <method name="getModule()Ljava/lang/String;"/>
+ <method name="getPackage()Ljava/lang/String;"/>
+ <method name="getRelease()Ljava/lang/String;"/>
+ <method name="getTimestamp()Ljava/lang/String;"/>
+ <method name="loadVersionInfo(Ljava/lang/String;Ljava/lang/ClassLoader;)Lorg/apache/http/util/VersionInfo;"/>
+ <method name="loadVersionInfo([Ljava/lang/String;Ljava/lang/ClassLoader;)[Lorg/apache/http/util/VersionInfo;"/>
+ <field name="PROPERTY_MODULE"/>
+ <field name="PROPERTY_RELEASE"/>
+ <field name="PROPERTY_TIMESTAMP"/>
+ <field name="UNAVAILABLE"/>
+ <field name="VERSION_PROPERTY_FILE"/>
+ </class>
+ <class name="org/json/JSONArray" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/Object;)V" since="19"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/util/Collection;)V"/>
+ <method name="&lt;init>(Lorg/json/JSONTokener;)V"/>
+ <method name="get(I)Ljava/lang/Object;"/>
+ <method name="getBoolean(I)Z"/>
+ <method name="getDouble(I)D"/>
+ <method name="getInt(I)I"/>
+ <method name="getJSONArray(I)Lorg/json/JSONArray;"/>
+ <method name="getJSONObject(I)Lorg/json/JSONObject;"/>
+ <method name="getLong(I)J"/>
+ <method name="getString(I)Ljava/lang/String;"/>
+ <method name="isNull(I)Z"/>
+ <method name="join(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="length()I"/>
+ <method name="opt(I)Ljava/lang/Object;"/>
+ <method name="optBoolean(I)Z"/>
+ <method name="optBoolean(IZ)Z"/>
+ <method name="optDouble(I)D"/>
+ <method name="optDouble(ID)D"/>
+ <method name="optInt(I)I"/>
+ <method name="optInt(II)I"/>
+ <method name="optJSONArray(I)Lorg/json/JSONArray;"/>
+ <method name="optJSONObject(I)Lorg/json/JSONObject;"/>
+ <method name="optLong(I)J"/>
+ <method name="optLong(IJ)J"/>
+ <method name="optString(I)Ljava/lang/String;"/>
+ <method name="optString(ILjava/lang/String;)Ljava/lang/String;"/>
+ <method name="put(D)Lorg/json/JSONArray;"/>
+ <method name="put(I)Lorg/json/JSONArray;"/>
+ <method name="put(ID)Lorg/json/JSONArray;"/>
+ <method name="put(II)Lorg/json/JSONArray;"/>
+ <method name="put(IJ)Lorg/json/JSONArray;"/>
+ <method name="put(ILjava/lang/Object;)Lorg/json/JSONArray;"/>
+ <method name="put(IZ)Lorg/json/JSONArray;"/>
+ <method name="put(J)Lorg/json/JSONArray;"/>
+ <method name="put(Ljava/lang/Object;)Lorg/json/JSONArray;"/>
+ <method name="put(Z)Lorg/json/JSONArray;"/>
+ <method name="remove(I)Ljava/lang/Object;" since="19"/>
+ <method name="toJSONObject(Lorg/json/JSONArray;)Lorg/json/JSONObject;"/>
+ <method name="toString(I)Ljava/lang/String;"/>
+ </class>
+ <class name="org/json/JSONException" since="1">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" since="27"/>
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" since="27"/>
+ </class>
+ <class name="org/json/JSONObject" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/util/Map;)V"/>
+ <method name="&lt;init>(Lorg/json/JSONObject;[Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Lorg/json/JSONTokener;)V"/>
+ <method name="accumulate(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;"/>
+ <method name="get(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="getBoolean(Ljava/lang/String;)Z"/>
+ <method name="getDouble(Ljava/lang/String;)D"/>
+ <method name="getInt(Ljava/lang/String;)I"/>
+ <method name="getJSONArray(Ljava/lang/String;)Lorg/json/JSONArray;"/>
+ <method name="getJSONObject(Ljava/lang/String;)Lorg/json/JSONObject;"/>
+ <method name="getLong(Ljava/lang/String;)J"/>
+ <method name="getString(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="has(Ljava/lang/String;)Z"/>
+ <method name="isNull(Ljava/lang/String;)Z"/>
+ <method name="keys()Ljava/util/Iterator;"/>
+ <method name="length()I"/>
+ <method name="names()Lorg/json/JSONArray;"/>
+ <method name="numberToString(Ljava/lang/Number;)Ljava/lang/String;"/>
+ <method name="opt(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="optBoolean(Ljava/lang/String;)Z"/>
+ <method name="optBoolean(Ljava/lang/String;Z)Z"/>
+ <method name="optDouble(Ljava/lang/String;)D"/>
+ <method name="optDouble(Ljava/lang/String;D)D"/>
+ <method name="optInt(Ljava/lang/String;)I"/>
+ <method name="optInt(Ljava/lang/String;I)I"/>
+ <method name="optJSONArray(Ljava/lang/String;)Lorg/json/JSONArray;"/>
+ <method name="optJSONObject(Ljava/lang/String;)Lorg/json/JSONObject;"/>
+ <method name="optLong(Ljava/lang/String;)J"/>
+ <method name="optLong(Ljava/lang/String;J)J"/>
+ <method name="optString(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="optString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="put(Ljava/lang/String;D)Lorg/json/JSONObject;"/>
+ <method name="put(Ljava/lang/String;I)Lorg/json/JSONObject;"/>
+ <method name="put(Ljava/lang/String;J)Lorg/json/JSONObject;"/>
+ <method name="put(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;"/>
+ <method name="put(Ljava/lang/String;Z)Lorg/json/JSONObject;"/>
+ <method name="putOpt(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;"/>
+ <method name="quote(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="remove(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="toJSONArray(Lorg/json/JSONArray;)Lorg/json/JSONArray;"/>
+ <method name="toString(I)Ljava/lang/String;"/>
+ <method name="wrap(Ljava/lang/Object;)Ljava/lang/Object;" since="19"/>
+ <field name="NULL"/>
+ </class>
+ <class name="org/json/JSONStringer" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="array()Lorg/json/JSONStringer;"/>
+ <method name="endArray()Lorg/json/JSONStringer;"/>
+ <method name="endObject()Lorg/json/JSONStringer;"/>
+ <method name="key(Ljava/lang/String;)Lorg/json/JSONStringer;"/>
+ <method name="object()Lorg/json/JSONStringer;"/>
+ <method name="value(D)Lorg/json/JSONStringer;"/>
+ <method name="value(J)Lorg/json/JSONStringer;"/>
+ <method name="value(Ljava/lang/Object;)Lorg/json/JSONStringer;"/>
+ <method name="value(Z)Lorg/json/JSONStringer;"/>
+ </class>
+ <class name="org/json/JSONTokener" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="back()V"/>
+ <method name="dehexchar(C)I"/>
+ <method name="more()Z"/>
+ <method name="next()C"/>
+ <method name="next(C)C"/>
+ <method name="next(I)Ljava/lang/String;"/>
+ <method name="nextClean()C"/>
+ <method name="nextString(C)Ljava/lang/String;"/>
+ <method name="nextTo(C)Ljava/lang/String;"/>
+ <method name="nextTo(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="nextValue()Ljava/lang/Object;"/>
+ <method name="skipPast(Ljava/lang/String;)V"/>
+ <method name="skipTo(C)C"/>
+ <method name="syntaxError(Ljava/lang/String;)Lorg/json/JSONException;"/>
+ </class>
+ <class name="org/w3c/dom/Attr" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="org/w3c/dom/Node"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getOwnerElement()Lorg/w3c/dom/Element;"/>
+ <method name="getSchemaTypeInfo()Lorg/w3c/dom/TypeInfo;" since="8"/>
+ <method name="getSpecified()Z"/>
+ <method name="getValue()Ljava/lang/String;"/>
+ <method name="isId()Z" since="8"/>
+ <method name="setValue(Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/w3c/dom/CDATASection" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="org/w3c/dom/Text"/>
+ </class>
+ <class name="org/w3c/dom/CharacterData" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="org/w3c/dom/Node"/>
+ <method name="appendData(Ljava/lang/String;)V"/>
+ <method name="deleteData(II)V"/>
+ <method name="getData()Ljava/lang/String;"/>
+ <method name="getLength()I"/>
+ <method name="insertData(ILjava/lang/String;)V"/>
+ <method name="replaceData(IILjava/lang/String;)V"/>
+ <method name="setData(Ljava/lang/String;)V"/>
+ <method name="substringData(II)Ljava/lang/String;"/>
+ </class>
+ <class name="org/w3c/dom/Comment" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="org/w3c/dom/CharacterData"/>
+ </class>
+ <class name="org/w3c/dom/DOMConfiguration" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="canSetParameter(Ljava/lang/String;Ljava/lang/Object;)Z"/>
+ <method name="getParameter(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="getParameterNames()Lorg/w3c/dom/DOMStringList;"/>
+ <method name="setParameter(Ljava/lang/String;Ljava/lang/Object;)V"/>
+ </class>
+ <class name="org/w3c/dom/DOMError" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="getLocation()Lorg/w3c/dom/DOMLocator;"/>
+ <method name="getMessage()Ljava/lang/String;"/>
+ <method name="getRelatedData()Ljava/lang/Object;"/>
+ <method name="getRelatedException()Ljava/lang/Object;"/>
+ <method name="getSeverity()S"/>
+ <method name="getType()Ljava/lang/String;"/>
+ <field name="SEVERITY_ERROR"/>
+ <field name="SEVERITY_FATAL_ERROR"/>
+ <field name="SEVERITY_WARNING"/>
+ </class>
+ <class name="org/w3c/dom/DOMErrorHandler" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="handleError(Lorg/w3c/dom/DOMError;)Z"/>
+ </class>
+ <class name="org/w3c/dom/DOMException" since="1">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>(SLjava/lang/String;)V"/>
+ <field name="DOMSTRING_SIZE_ERR"/>
+ <field name="HIERARCHY_REQUEST_ERR"/>
+ <field name="INDEX_SIZE_ERR"/>
+ <field name="INUSE_ATTRIBUTE_ERR"/>
+ <field name="INVALID_ACCESS_ERR"/>
+ <field name="INVALID_CHARACTER_ERR"/>
+ <field name="INVALID_MODIFICATION_ERR"/>
+ <field name="INVALID_STATE_ERR"/>
+ <field name="NAMESPACE_ERR"/>
+ <field name="NOT_FOUND_ERR"/>
+ <field name="NOT_SUPPORTED_ERR"/>
+ <field name="NO_DATA_ALLOWED_ERR"/>
+ <field name="NO_MODIFICATION_ALLOWED_ERR"/>
+ <field name="SYNTAX_ERR"/>
+ <field name="TYPE_MISMATCH_ERR" since="8"/>
+ <field name="VALIDATION_ERR" since="8"/>
+ <field name="WRONG_DOCUMENT_ERR"/>
+ <field name="code"/>
+ </class>
+ <class name="org/w3c/dom/DOMImplementation" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="createDocument(Ljava/lang/String;Ljava/lang/String;Lorg/w3c/dom/DocumentType;)Lorg/w3c/dom/Document;"/>
+ <method name="createDocumentType(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/DocumentType;"/>
+ <method name="getFeature(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;" since="8"/>
+ <method name="hasFeature(Ljava/lang/String;Ljava/lang/String;)Z"/>
+ </class>
+ <class name="org/w3c/dom/DOMImplementationList" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="getLength()I"/>
+ <method name="item(I)Lorg/w3c/dom/DOMImplementation;"/>
+ </class>
+ <class name="org/w3c/dom/DOMImplementationSource" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="getDOMImplementation(Ljava/lang/String;)Lorg/w3c/dom/DOMImplementation;"/>
+ <method name="getDOMImplementationList(Ljava/lang/String;)Lorg/w3c/dom/DOMImplementationList;"/>
+ </class>
+ <class name="org/w3c/dom/DOMLocator" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="getByteOffset()I"/>
+ <method name="getColumnNumber()I"/>
+ <method name="getLineNumber()I"/>
+ <method name="getRelatedNode()Lorg/w3c/dom/Node;"/>
+ <method name="getUri()Ljava/lang/String;"/>
+ <method name="getUtf16Offset()I"/>
+ </class>
+ <class name="org/w3c/dom/DOMStringList" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="contains(Ljava/lang/String;)Z"/>
+ <method name="getLength()I"/>
+ <method name="item(I)Ljava/lang/String;"/>
+ </class>
+ <class name="org/w3c/dom/Document" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="org/w3c/dom/Node"/>
+ <method name="adoptNode(Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node;" since="8"/>
+ <method name="createAttribute(Ljava/lang/String;)Lorg/w3c/dom/Attr;"/>
+ <method name="createAttributeNS(Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/Attr;"/>
+ <method name="createCDATASection(Ljava/lang/String;)Lorg/w3c/dom/CDATASection;"/>
+ <method name="createComment(Ljava/lang/String;)Lorg/w3c/dom/Comment;"/>
+ <method name="createDocumentFragment()Lorg/w3c/dom/DocumentFragment;"/>
+ <method name="createElement(Ljava/lang/String;)Lorg/w3c/dom/Element;"/>
+ <method name="createElementNS(Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/Element;"/>
+ <method name="createEntityReference(Ljava/lang/String;)Lorg/w3c/dom/EntityReference;"/>
+ <method name="createProcessingInstruction(Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/ProcessingInstruction;"/>
+ <method name="createTextNode(Ljava/lang/String;)Lorg/w3c/dom/Text;"/>
+ <method name="getDoctype()Lorg/w3c/dom/DocumentType;"/>
+ <method name="getDocumentElement()Lorg/w3c/dom/Element;"/>
+ <method name="getDocumentURI()Ljava/lang/String;" since="8"/>
+ <method name="getDomConfig()Lorg/w3c/dom/DOMConfiguration;" since="8"/>
+ <method name="getElementById(Ljava/lang/String;)Lorg/w3c/dom/Element;"/>
+ <method name="getElementsByTagName(Ljava/lang/String;)Lorg/w3c/dom/NodeList;"/>
+ <method name="getElementsByTagNameNS(Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/NodeList;"/>
+ <method name="getImplementation()Lorg/w3c/dom/DOMImplementation;"/>
+ <method name="getInputEncoding()Ljava/lang/String;" since="8"/>
+ <method name="getStrictErrorChecking()Z" since="8"/>
+ <method name="getXmlEncoding()Ljava/lang/String;" since="8"/>
+ <method name="getXmlStandalone()Z" since="8"/>
+ <method name="getXmlVersion()Ljava/lang/String;" since="8"/>
+ <method name="importNode(Lorg/w3c/dom/Node;Z)Lorg/w3c/dom/Node;"/>
+ <method name="normalizeDocument()V" since="8"/>
+ <method name="renameNode(Lorg/w3c/dom/Node;Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/Node;" since="8"/>
+ <method name="setDocumentURI(Ljava/lang/String;)V" since="8"/>
+ <method name="setStrictErrorChecking(Z)V" since="8"/>
+ <method name="setXmlStandalone(Z)V" since="8"/>
+ <method name="setXmlVersion(Ljava/lang/String;)V" since="8"/>
+ </class>
+ <class name="org/w3c/dom/DocumentFragment" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="org/w3c/dom/Node"/>
+ </class>
+ <class name="org/w3c/dom/DocumentType" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="org/w3c/dom/Node"/>
+ <method name="getEntities()Lorg/w3c/dom/NamedNodeMap;"/>
+ <method name="getInternalSubset()Ljava/lang/String;"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getNotations()Lorg/w3c/dom/NamedNodeMap;"/>
+ <method name="getPublicId()Ljava/lang/String;"/>
+ <method name="getSystemId()Ljava/lang/String;"/>
+ </class>
+ <class name="org/w3c/dom/Element" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="org/w3c/dom/Node"/>
+ <method name="getAttribute(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getAttributeNS(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getAttributeNode(Ljava/lang/String;)Lorg/w3c/dom/Attr;"/>
+ <method name="getAttributeNodeNS(Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/Attr;"/>
+ <method name="getElementsByTagName(Ljava/lang/String;)Lorg/w3c/dom/NodeList;"/>
+ <method name="getElementsByTagNameNS(Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/NodeList;"/>
+ <method name="getSchemaTypeInfo()Lorg/w3c/dom/TypeInfo;" since="8"/>
+ <method name="getTagName()Ljava/lang/String;"/>
+ <method name="hasAttribute(Ljava/lang/String;)Z"/>
+ <method name="hasAttributeNS(Ljava/lang/String;Ljava/lang/String;)Z"/>
+ <method name="removeAttribute(Ljava/lang/String;)V"/>
+ <method name="removeAttributeNS(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="removeAttributeNode(Lorg/w3c/dom/Attr;)Lorg/w3c/dom/Attr;"/>
+ <method name="setAttribute(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="setAttributeNS(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="setAttributeNode(Lorg/w3c/dom/Attr;)Lorg/w3c/dom/Attr;"/>
+ <method name="setAttributeNodeNS(Lorg/w3c/dom/Attr;)Lorg/w3c/dom/Attr;"/>
+ <method name="setIdAttribute(Ljava/lang/String;Z)V" since="8"/>
+ <method name="setIdAttributeNS(Ljava/lang/String;Ljava/lang/String;Z)V" since="8"/>
+ <method name="setIdAttributeNode(Lorg/w3c/dom/Attr;Z)V" since="8"/>
+ </class>
+ <class name="org/w3c/dom/Entity" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="org/w3c/dom/Node"/>
+ <method name="getInputEncoding()Ljava/lang/String;" since="8"/>
+ <method name="getNotationName()Ljava/lang/String;"/>
+ <method name="getPublicId()Ljava/lang/String;"/>
+ <method name="getSystemId()Ljava/lang/String;"/>
+ <method name="getXmlEncoding()Ljava/lang/String;" since="8"/>
+ <method name="getXmlVersion()Ljava/lang/String;" since="8"/>
+ </class>
+ <class name="org/w3c/dom/EntityReference" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="org/w3c/dom/Node"/>
+ </class>
+ <class name="org/w3c/dom/NameList" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="contains(Ljava/lang/String;)Z"/>
+ <method name="containsNS(Ljava/lang/String;Ljava/lang/String;)Z"/>
+ <method name="getLength()I"/>
+ <method name="getName(I)Ljava/lang/String;"/>
+ <method name="getNamespaceURI(I)Ljava/lang/String;"/>
+ </class>
+ <class name="org/w3c/dom/NamedNodeMap" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getLength()I"/>
+ <method name="getNamedItem(Ljava/lang/String;)Lorg/w3c/dom/Node;"/>
+ <method name="getNamedItemNS(Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/Node;"/>
+ <method name="item(I)Lorg/w3c/dom/Node;"/>
+ <method name="removeNamedItem(Ljava/lang/String;)Lorg/w3c/dom/Node;"/>
+ <method name="removeNamedItemNS(Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/Node;"/>
+ <method name="setNamedItem(Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node;"/>
+ <method name="setNamedItemNS(Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node;"/>
+ </class>
+ <class name="org/w3c/dom/Node" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="appendChild(Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node;"/>
+ <method name="cloneNode(Z)Lorg/w3c/dom/Node;"/>
+ <method name="compareDocumentPosition(Lorg/w3c/dom/Node;)S" since="8"/>
+ <method name="getAttributes()Lorg/w3c/dom/NamedNodeMap;"/>
+ <method name="getBaseURI()Ljava/lang/String;" since="8"/>
+ <method name="getChildNodes()Lorg/w3c/dom/NodeList;"/>
+ <method name="getFeature(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;" since="8"/>
+ <method name="getFirstChild()Lorg/w3c/dom/Node;"/>
+ <method name="getLastChild()Lorg/w3c/dom/Node;"/>
+ <method name="getLocalName()Ljava/lang/String;"/>
+ <method name="getNamespaceURI()Ljava/lang/String;"/>
+ <method name="getNextSibling()Lorg/w3c/dom/Node;"/>
+ <method name="getNodeName()Ljava/lang/String;"/>
+ <method name="getNodeType()S"/>
+ <method name="getNodeValue()Ljava/lang/String;"/>
+ <method name="getOwnerDocument()Lorg/w3c/dom/Document;"/>
+ <method name="getParentNode()Lorg/w3c/dom/Node;"/>
+ <method name="getPrefix()Ljava/lang/String;"/>
+ <method name="getPreviousSibling()Lorg/w3c/dom/Node;"/>
+ <method name="getTextContent()Ljava/lang/String;" since="8"/>
+ <method name="getUserData(Ljava/lang/String;)Ljava/lang/Object;" since="8"/>
+ <method name="hasAttributes()Z"/>
+ <method name="hasChildNodes()Z"/>
+ <method name="insertBefore(Lorg/w3c/dom/Node;Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node;"/>
+ <method name="isDefaultNamespace(Ljava/lang/String;)Z" since="8"/>
+ <method name="isEqualNode(Lorg/w3c/dom/Node;)Z" since="8"/>
+ <method name="isSameNode(Lorg/w3c/dom/Node;)Z" since="8"/>
+ <method name="isSupported(Ljava/lang/String;Ljava/lang/String;)Z"/>
+ <method name="lookupNamespaceURI(Ljava/lang/String;)Ljava/lang/String;" since="8"/>
+ <method name="lookupPrefix(Ljava/lang/String;)Ljava/lang/String;" since="8"/>
+ <method name="normalize()V"/>
+ <method name="removeChild(Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node;"/>
+ <method name="replaceChild(Lorg/w3c/dom/Node;Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node;"/>
+ <method name="setNodeValue(Ljava/lang/String;)V"/>
+ <method name="setPrefix(Ljava/lang/String;)V"/>
+ <method name="setTextContent(Ljava/lang/String;)V" since="8"/>
+ <method name="setUserData(Ljava/lang/String;Ljava/lang/Object;Lorg/w3c/dom/UserDataHandler;)Ljava/lang/Object;" since="8"/>
+ <field name="ATTRIBUTE_NODE"/>
+ <field name="CDATA_SECTION_NODE"/>
+ <field name="COMMENT_NODE"/>
+ <field name="DOCUMENT_FRAGMENT_NODE"/>
+ <field name="DOCUMENT_NODE"/>
+ <field name="DOCUMENT_POSITION_CONTAINED_BY" since="8"/>
+ <field name="DOCUMENT_POSITION_CONTAINS" since="8"/>
+ <field name="DOCUMENT_POSITION_DISCONNECTED" since="8"/>
+ <field name="DOCUMENT_POSITION_FOLLOWING" since="8"/>
+ <field name="DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" since="8"/>
+ <field name="DOCUMENT_POSITION_PRECEDING" since="8"/>
+ <field name="DOCUMENT_TYPE_NODE"/>
+ <field name="ELEMENT_NODE"/>
+ <field name="ENTITY_NODE"/>
+ <field name="ENTITY_REFERENCE_NODE"/>
+ <field name="NOTATION_NODE"/>
+ <field name="PROCESSING_INSTRUCTION_NODE"/>
+ <field name="TEXT_NODE"/>
+ </class>
+ <class name="org/w3c/dom/NodeList" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getLength()I"/>
+ <method name="item(I)Lorg/w3c/dom/Node;"/>
+ </class>
+ <class name="org/w3c/dom/Notation" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="org/w3c/dom/Node"/>
+ <method name="getPublicId()Ljava/lang/String;"/>
+ <method name="getSystemId()Ljava/lang/String;"/>
+ </class>
+ <class name="org/w3c/dom/ProcessingInstruction" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="org/w3c/dom/Node"/>
+ <method name="getData()Ljava/lang/String;"/>
+ <method name="getTarget()Ljava/lang/String;"/>
+ <method name="setData(Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/w3c/dom/Text" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="org/w3c/dom/CharacterData"/>
+ <method name="getWholeText()Ljava/lang/String;" since="8"/>
+ <method name="isElementContentWhitespace()Z" since="8"/>
+ <method name="replaceWholeText(Ljava/lang/String;)Lorg/w3c/dom/Text;" since="8"/>
+ <method name="splitText(I)Lorg/w3c/dom/Text;"/>
+ </class>
+ <class name="org/w3c/dom/TypeInfo" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="getTypeName()Ljava/lang/String;"/>
+ <method name="getTypeNamespace()Ljava/lang/String;"/>
+ <method name="isDerivedFrom(Ljava/lang/String;Ljava/lang/String;I)Z"/>
+ <field name="DERIVATION_EXTENSION"/>
+ <field name="DERIVATION_LIST"/>
+ <field name="DERIVATION_RESTRICTION"/>
+ <field name="DERIVATION_UNION"/>
+ </class>
+ <class name="org/w3c/dom/UserDataHandler" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="handle(SLjava/lang/String;Ljava/lang/Object;Lorg/w3c/dom/Node;Lorg/w3c/dom/Node;)V"/>
+ <field name="NODE_ADOPTED"/>
+ <field name="NODE_CLONED"/>
+ <field name="NODE_DELETED"/>
+ <field name="NODE_IMPORTED"/>
+ <field name="NODE_RENAMED"/>
+ </class>
+ <class name="org/w3c/dom/ls/DOMImplementationLS" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="createLSInput()Lorg/w3c/dom/ls/LSInput;"/>
+ <method name="createLSOutput()Lorg/w3c/dom/ls/LSOutput;"/>
+ <method name="createLSParser(SLjava/lang/String;)Lorg/w3c/dom/ls/LSParser;"/>
+ <method name="createLSSerializer()Lorg/w3c/dom/ls/LSSerializer;"/>
+ <field name="MODE_ASYNCHRONOUS"/>
+ <field name="MODE_SYNCHRONOUS"/>
+ </class>
+ <class name="org/w3c/dom/ls/LSException" since="8">
+ <extends name="java/lang/RuntimeException"/>
+ <method name="&lt;init>(SLjava/lang/String;)V"/>
+ <field name="PARSE_ERR"/>
+ <field name="SERIALIZE_ERR"/>
+ <field name="code"/>
+ </class>
+ <class name="org/w3c/dom/ls/LSInput" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="getBaseURI()Ljava/lang/String;"/>
+ <method name="getByteStream()Ljava/io/InputStream;"/>
+ <method name="getCertifiedText()Z"/>
+ <method name="getCharacterStream()Ljava/io/Reader;"/>
+ <method name="getEncoding()Ljava/lang/String;"/>
+ <method name="getPublicId()Ljava/lang/String;"/>
+ <method name="getStringData()Ljava/lang/String;"/>
+ <method name="getSystemId()Ljava/lang/String;"/>
+ <method name="setBaseURI(Ljava/lang/String;)V"/>
+ <method name="setByteStream(Ljava/io/InputStream;)V"/>
+ <method name="setCertifiedText(Z)V"/>
+ <method name="setCharacterStream(Ljava/io/Reader;)V"/>
+ <method name="setEncoding(Ljava/lang/String;)V"/>
+ <method name="setPublicId(Ljava/lang/String;)V"/>
+ <method name="setStringData(Ljava/lang/String;)V"/>
+ <method name="setSystemId(Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/w3c/dom/ls/LSOutput" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="getByteStream()Ljava/io/OutputStream;"/>
+ <method name="getCharacterStream()Ljava/io/Writer;"/>
+ <method name="getEncoding()Ljava/lang/String;"/>
+ <method name="getSystemId()Ljava/lang/String;"/>
+ <method name="setByteStream(Ljava/io/OutputStream;)V"/>
+ <method name="setCharacterStream(Ljava/io/Writer;)V"/>
+ <method name="setEncoding(Ljava/lang/String;)V"/>
+ <method name="setSystemId(Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/w3c/dom/ls/LSParser" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="abort()V"/>
+ <method name="getAsync()Z"/>
+ <method name="getBusy()Z"/>
+ <method name="getDomConfig()Lorg/w3c/dom/DOMConfiguration;"/>
+ <method name="getFilter()Lorg/w3c/dom/ls/LSParserFilter;"/>
+ <method name="parse(Lorg/w3c/dom/ls/LSInput;)Lorg/w3c/dom/Document;"/>
+ <method name="parseURI(Ljava/lang/String;)Lorg/w3c/dom/Document;"/>
+ <method name="parseWithContext(Lorg/w3c/dom/ls/LSInput;Lorg/w3c/dom/Node;S)Lorg/w3c/dom/Node;"/>
+ <method name="setFilter(Lorg/w3c/dom/ls/LSParserFilter;)V"/>
+ <field name="ACTION_APPEND_AS_CHILDREN"/>
+ <field name="ACTION_INSERT_AFTER"/>
+ <field name="ACTION_INSERT_BEFORE"/>
+ <field name="ACTION_REPLACE"/>
+ <field name="ACTION_REPLACE_CHILDREN"/>
+ </class>
+ <class name="org/w3c/dom/ls/LSParserFilter" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="acceptNode(Lorg/w3c/dom/Node;)S"/>
+ <method name="getWhatToShow()I"/>
+ <method name="startElement(Lorg/w3c/dom/Element;)S"/>
+ <field name="FILTER_ACCEPT"/>
+ <field name="FILTER_INTERRUPT"/>
+ <field name="FILTER_REJECT"/>
+ <field name="FILTER_SKIP"/>
+ </class>
+ <class name="org/w3c/dom/ls/LSResourceResolver" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="resolveResource(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/ls/LSInput;"/>
+ </class>
+ <class name="org/w3c/dom/ls/LSSerializer" since="8">
+ <extends name="java/lang/Object"/>
+ <method name="getDomConfig()Lorg/w3c/dom/DOMConfiguration;"/>
+ <method name="getNewLine()Ljava/lang/String;"/>
+ <method name="setNewLine(Ljava/lang/String;)V"/>
+ <method name="write(Lorg/w3c/dom/Node;Lorg/w3c/dom/ls/LSOutput;)Z"/>
+ <method name="writeToString(Lorg/w3c/dom/Node;)Ljava/lang/String;"/>
+ <method name="writeToURI(Lorg/w3c/dom/Node;Ljava/lang/String;)Z"/>
+ </class>
+ <class name="org/xml/sax/AttributeList" since="1" deprecated="9">
+ <extends name="java/lang/Object"/>
+ <method name="getLength()I"/>
+ <method name="getName(I)Ljava/lang/String;"/>
+ <method name="getType(I)Ljava/lang/String;"/>
+ <method name="getType(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getValue(I)Ljava/lang/String;"/>
+ <method name="getValue(Ljava/lang/String;)Ljava/lang/String;"/>
+ </class>
+ <class name="org/xml/sax/Attributes" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getIndex(Ljava/lang/String;)I"/>
+ <method name="getIndex(Ljava/lang/String;Ljava/lang/String;)I"/>
+ <method name="getLength()I"/>
+ <method name="getLocalName(I)Ljava/lang/String;"/>
+ <method name="getQName(I)Ljava/lang/String;"/>
+ <method name="getType(I)Ljava/lang/String;"/>
+ <method name="getType(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getType(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getURI(I)Ljava/lang/String;"/>
+ <method name="getValue(I)Ljava/lang/String;"/>
+ <method name="getValue(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ </class>
+ <class name="org/xml/sax/ContentHandler" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="characters([CII)V"/>
+ <method name="endDocument()V"/>
+ <method name="endElement(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="endPrefixMapping(Ljava/lang/String;)V"/>
+ <method name="ignorableWhitespace([CII)V"/>
+ <method name="processingInstruction(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="setDocumentLocator(Lorg/xml/sax/Locator;)V"/>
+ <method name="skippedEntity(Ljava/lang/String;)V"/>
+ <method name="startDocument()V"/>
+ <method name="startElement(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/xml/sax/Attributes;)V"/>
+ <method name="startPrefixMapping(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/xml/sax/DTDHandler" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="notationDecl(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="unparsedEntityDecl(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/xml/sax/DocumentHandler" since="1" deprecated="9">
+ <extends name="java/lang/Object"/>
+ <method name="characters([CII)V"/>
+ <method name="endDocument()V"/>
+ <method name="endElement(Ljava/lang/String;)V"/>
+ <method name="ignorableWhitespace([CII)V"/>
+ <method name="processingInstruction(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="setDocumentLocator(Lorg/xml/sax/Locator;)V"/>
+ <method name="startDocument()V"/>
+ <method name="startElement(Ljava/lang/String;Lorg/xml/sax/AttributeList;)V"/>
+ </class>
+ <class name="org/xml/sax/EntityResolver" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="resolveEntity(Ljava/lang/String;Ljava/lang/String;)Lorg/xml/sax/InputSource;"/>
+ </class>
+ <class name="org/xml/sax/ErrorHandler" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="error(Lorg/xml/sax/SAXParseException;)V"/>
+ <method name="fatalError(Lorg/xml/sax/SAXParseException;)V"/>
+ <method name="warning(Lorg/xml/sax/SAXParseException;)V"/>
+ </class>
+ <class name="org/xml/sax/HandlerBase" since="1" deprecated="9">
+ <extends name="java/lang/Object"/>
+ <implements name="org/xml/sax/DTDHandler"/>
+ <implements name="org/xml/sax/DocumentHandler"/>
+ <implements name="org/xml/sax/EntityResolver"/>
+ <implements name="org/xml/sax/ErrorHandler"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/xml/sax/InputSource" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/io/InputStream;)V"/>
+ <method name="&lt;init>(Ljava/io/Reader;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="getByteStream()Ljava/io/InputStream;"/>
+ <method name="getCharacterStream()Ljava/io/Reader;"/>
+ <method name="getEncoding()Ljava/lang/String;"/>
+ <method name="getPublicId()Ljava/lang/String;"/>
+ <method name="getSystemId()Ljava/lang/String;"/>
+ <method name="setByteStream(Ljava/io/InputStream;)V"/>
+ <method name="setCharacterStream(Ljava/io/Reader;)V"/>
+ <method name="setEncoding(Ljava/lang/String;)V"/>
+ <method name="setPublicId(Ljava/lang/String;)V"/>
+ <method name="setSystemId(Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/xml/sax/Locator" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getColumnNumber()I"/>
+ <method name="getLineNumber()I"/>
+ <method name="getPublicId()Ljava/lang/String;"/>
+ <method name="getSystemId()Ljava/lang/String;"/>
+ </class>
+ <class name="org/xml/sax/Parser" since="1" deprecated="9">
+ <extends name="java/lang/Object"/>
+ <method name="parse(Ljava/lang/String;)V"/>
+ <method name="parse(Lorg/xml/sax/InputSource;)V"/>
+ <method name="setDTDHandler(Lorg/xml/sax/DTDHandler;)V"/>
+ <method name="setDocumentHandler(Lorg/xml/sax/DocumentHandler;)V"/>
+ <method name="setEntityResolver(Lorg/xml/sax/EntityResolver;)V"/>
+ <method name="setErrorHandler(Lorg/xml/sax/ErrorHandler;)V"/>
+ <method name="setLocale(Ljava/util/Locale;)V"/>
+ </class>
+ <class name="org/xml/sax/SAXException" since="1">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/Exception;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Exception;)V"/>
+ <method name="getException()Ljava/lang/Exception;"/>
+ </class>
+ <class name="org/xml/sax/SAXNotRecognizedException" since="1">
+ <extends name="org/xml/sax/SAXException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/xml/sax/SAXNotSupportedException" since="1">
+ <extends name="org/xml/sax/SAXException"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/xml/sax/SAXParseException" since="1">
+ <extends name="org/xml/sax/SAXException"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IILjava/lang/Exception;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Lorg/xml/sax/Locator;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Lorg/xml/sax/Locator;Ljava/lang/Exception;)V"/>
+ <method name="getColumnNumber()I"/>
+ <method name="getLineNumber()I"/>
+ <method name="getPublicId()Ljava/lang/String;"/>
+ <method name="getSystemId()Ljava/lang/String;"/>
+ </class>
+ <class name="org/xml/sax/XMLFilter" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="org/xml/sax/XMLReader"/>
+ <method name="getParent()Lorg/xml/sax/XMLReader;"/>
+ <method name="setParent(Lorg/xml/sax/XMLReader;)V"/>
+ </class>
+ <class name="org/xml/sax/XMLReader" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="getContentHandler()Lorg/xml/sax/ContentHandler;"/>
+ <method name="getDTDHandler()Lorg/xml/sax/DTDHandler;"/>
+ <method name="getEntityResolver()Lorg/xml/sax/EntityResolver;"/>
+ <method name="getErrorHandler()Lorg/xml/sax/ErrorHandler;"/>
+ <method name="getFeature(Ljava/lang/String;)Z"/>
+ <method name="getProperty(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="parse(Ljava/lang/String;)V"/>
+ <method name="parse(Lorg/xml/sax/InputSource;)V"/>
+ <method name="setContentHandler(Lorg/xml/sax/ContentHandler;)V"/>
+ <method name="setDTDHandler(Lorg/xml/sax/DTDHandler;)V"/>
+ <method name="setEntityResolver(Lorg/xml/sax/EntityResolver;)V"/>
+ <method name="setErrorHandler(Lorg/xml/sax/ErrorHandler;)V"/>
+ <method name="setFeature(Ljava/lang/String;Z)V"/>
+ <method name="setProperty(Ljava/lang/String;Ljava/lang/Object;)V"/>
+ </class>
+ <class name="org/xml/sax/ext/Attributes2" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="org/xml/sax/Attributes"/>
+ <method name="isDeclared(I)Z"/>
+ <method name="isDeclared(Ljava/lang/String;)Z"/>
+ <method name="isDeclared(Ljava/lang/String;Ljava/lang/String;)Z"/>
+ <method name="isSpecified(I)Z"/>
+ <method name="isSpecified(Ljava/lang/String;)Z"/>
+ <method name="isSpecified(Ljava/lang/String;Ljava/lang/String;)Z"/>
+ </class>
+ <class name="org/xml/sax/ext/Attributes2Impl" since="1">
+ <extends name="org/xml/sax/helpers/AttributesImpl"/>
+ <implements name="org/xml/sax/ext/Attributes2"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Lorg/xml/sax/Attributes;)V"/>
+ <method name="setDeclared(IZ)V"/>
+ <method name="setSpecified(IZ)V"/>
+ </class>
+ <class name="org/xml/sax/ext/DeclHandler" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="attributeDecl(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="elementDecl(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="externalEntityDecl(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="internalEntityDecl(Ljava/lang/String;Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/xml/sax/ext/DefaultHandler2" since="1">
+ <extends name="org/xml/sax/helpers/DefaultHandler"/>
+ <implements name="org/xml/sax/ext/DeclHandler"/>
+ <implements name="org/xml/sax/ext/EntityResolver2"/>
+ <implements name="org/xml/sax/ext/LexicalHandler"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/xml/sax/ext/EntityResolver2" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="org/xml/sax/EntityResolver"/>
+ <method name="getExternalSubset(Ljava/lang/String;Ljava/lang/String;)Lorg/xml/sax/InputSource;"/>
+ <method name="resolveEntity(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xml/sax/InputSource;"/>
+ </class>
+ <class name="org/xml/sax/ext/LexicalHandler" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="comment([CII)V"/>
+ <method name="endCDATA()V"/>
+ <method name="endDTD()V"/>
+ <method name="endEntity(Ljava/lang/String;)V"/>
+ <method name="startCDATA()V"/>
+ <method name="startDTD(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="startEntity(Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/xml/sax/ext/Locator2" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="org/xml/sax/Locator"/>
+ <method name="getEncoding()Ljava/lang/String;"/>
+ <method name="getXMLVersion()Ljava/lang/String;"/>
+ </class>
+ <class name="org/xml/sax/ext/Locator2Impl" since="1">
+ <extends name="org/xml/sax/helpers/LocatorImpl"/>
+ <implements name="org/xml/sax/ext/Locator2"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Lorg/xml/sax/Locator;)V"/>
+ <method name="setEncoding(Ljava/lang/String;)V"/>
+ <method name="setXMLVersion(Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/xml/sax/helpers/AttributeListImpl" since="1" deprecated="9">
+ <extends name="java/lang/Object"/>
+ <implements name="org/xml/sax/AttributeList"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Lorg/xml/sax/AttributeList;)V"/>
+ <method name="addAttribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="clear()V"/>
+ <method name="removeAttribute(Ljava/lang/String;)V"/>
+ <method name="setAttributeList(Lorg/xml/sax/AttributeList;)V"/>
+ </class>
+ <class name="org/xml/sax/helpers/AttributesImpl" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="org/xml/sax/Attributes"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Lorg/xml/sax/Attributes;)V"/>
+ <method name="addAttribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="clear()V"/>
+ <method name="removeAttribute(I)V"/>
+ <method name="setAttribute(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="setAttributes(Lorg/xml/sax/Attributes;)V"/>
+ <method name="setLocalName(ILjava/lang/String;)V"/>
+ <method name="setQName(ILjava/lang/String;)V"/>
+ <method name="setType(ILjava/lang/String;)V"/>
+ <method name="setURI(ILjava/lang/String;)V"/>
+ <method name="setValue(ILjava/lang/String;)V"/>
+ </class>
+ <class name="org/xml/sax/helpers/DefaultHandler" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="org/xml/sax/ContentHandler"/>
+ <implements name="org/xml/sax/DTDHandler"/>
+ <implements name="org/xml/sax/EntityResolver"/>
+ <implements name="org/xml/sax/ErrorHandler"/>
+ <method name="&lt;init>()V"/>
+ </class>
+ <class name="org/xml/sax/helpers/LocatorImpl" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="org/xml/sax/Locator"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Lorg/xml/sax/Locator;)V"/>
+ <method name="setColumnNumber(I)V"/>
+ <method name="setLineNumber(I)V"/>
+ <method name="setPublicId(Ljava/lang/String;)V"/>
+ <method name="setSystemId(Ljava/lang/String;)V"/>
+ </class>
+ <class name="org/xml/sax/helpers/NamespaceSupport" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="declarePrefix(Ljava/lang/String;Ljava/lang/String;)Z"/>
+ <method name="getDeclaredPrefixes()Ljava/util/Enumeration;"/>
+ <method name="getPrefix(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getPrefixes()Ljava/util/Enumeration;"/>
+ <method name="getPrefixes(Ljava/lang/String;)Ljava/util/Enumeration;"/>
+ <method name="getURI(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="isNamespaceDeclUris()Z"/>
+ <method name="popContext()V"/>
+ <method name="processName(Ljava/lang/String;[Ljava/lang/String;Z)[Ljava/lang/String;"/>
+ <method name="pushContext()V"/>
+ <method name="reset()V"/>
+ <method name="setNamespaceDeclUris(Z)V"/>
+ <field name="NSDECL"/>
+ <field name="XMLNS"/>
+ </class>
+ <class name="org/xml/sax/helpers/ParserAdapter" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="org/xml/sax/DocumentHandler"/>
+ <implements name="org/xml/sax/XMLReader"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Lorg/xml/sax/Parser;)V"/>
+ </class>
+ <class name="org/xml/sax/helpers/ParserFactory" since="1" deprecated="9">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="makeParser()Lorg/xml/sax/Parser;"/>
+ <method name="makeParser(Ljava/lang/String;)Lorg/xml/sax/Parser;"/>
+ </class>
+ <class name="org/xml/sax/helpers/XMLFilterImpl" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="org/xml/sax/ContentHandler"/>
+ <implements name="org/xml/sax/DTDHandler"/>
+ <implements name="org/xml/sax/EntityResolver"/>
+ <implements name="org/xml/sax/ErrorHandler"/>
+ <implements name="org/xml/sax/XMLFilter"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Lorg/xml/sax/XMLReader;)V"/>
+ </class>
+ <class name="org/xml/sax/helpers/XMLReaderAdapter" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="org/xml/sax/ContentHandler"/>
+ <implements name="org/xml/sax/Parser"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Lorg/xml/sax/XMLReader;)V"/>
+ </class>
+ <class name="org/xml/sax/helpers/XMLReaderFactory" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="createXMLReader()Lorg/xml/sax/XMLReader;"/>
+ <method name="createXMLReader(Ljava/lang/String;)Lorg/xml/sax/XMLReader;"/>
+ </class>
+ <class name="org/xmlpull/v1/XmlPullParser" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="defineEntityReplacementText(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="getAttributeCount()I"/>
+ <method name="getAttributeName(I)Ljava/lang/String;"/>
+ <method name="getAttributeNamespace(I)Ljava/lang/String;"/>
+ <method name="getAttributePrefix(I)Ljava/lang/String;"/>
+ <method name="getAttributeType(I)Ljava/lang/String;"/>
+ <method name="getAttributeValue(I)Ljava/lang/String;"/>
+ <method name="getAttributeValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getColumnNumber()I"/>
+ <method name="getDepth()I"/>
+ <method name="getEventType()I"/>
+ <method name="getFeature(Ljava/lang/String;)Z"/>
+ <method name="getInputEncoding()Ljava/lang/String;"/>
+ <method name="getLineNumber()I"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getNamespace()Ljava/lang/String;"/>
+ <method name="getNamespace(Ljava/lang/String;)Ljava/lang/String;"/>
+ <method name="getNamespaceCount(I)I"/>
+ <method name="getNamespacePrefix(I)Ljava/lang/String;"/>
+ <method name="getNamespaceUri(I)Ljava/lang/String;"/>
+ <method name="getPositionDescription()Ljava/lang/String;"/>
+ <method name="getPrefix()Ljava/lang/String;"/>
+ <method name="getProperty(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="getText()Ljava/lang/String;"/>
+ <method name="getTextCharacters([I)[C"/>
+ <method name="isAttributeDefault(I)Z"/>
+ <method name="isEmptyElementTag()Z"/>
+ <method name="isWhitespace()Z"/>
+ <method name="next()I"/>
+ <method name="nextTag()I"/>
+ <method name="nextText()Ljava/lang/String;"/>
+ <method name="nextToken()I"/>
+ <method name="require(ILjava/lang/String;Ljava/lang/String;)V"/>
+ <method name="setFeature(Ljava/lang/String;Z)V"/>
+ <method name="setInput(Ljava/io/InputStream;Ljava/lang/String;)V"/>
+ <method name="setInput(Ljava/io/Reader;)V"/>
+ <method name="setProperty(Ljava/lang/String;Ljava/lang/Object;)V"/>
+ <field name="CDSECT"/>
+ <field name="COMMENT"/>
+ <field name="DOCDECL"/>
+ <field name="END_DOCUMENT"/>
+ <field name="END_TAG"/>
+ <field name="ENTITY_REF"/>
+ <field name="FEATURE_PROCESS_DOCDECL"/>
+ <field name="FEATURE_PROCESS_NAMESPACES"/>
+ <field name="FEATURE_REPORT_NAMESPACE_ATTRIBUTES"/>
+ <field name="FEATURE_VALIDATION"/>
+ <field name="IGNORABLE_WHITESPACE"/>
+ <field name="NO_NAMESPACE"/>
+ <field name="PROCESSING_INSTRUCTION"/>
+ <field name="START_DOCUMENT"/>
+ <field name="START_TAG"/>
+ <field name="TEXT"/>
+ <field name="TYPES"/>
+ </class>
+ <class name="org/xmlpull/v1/XmlPullParserException" since="1">
+ <extends name="java/lang/Exception"/>
+ <method name="&lt;init>(Ljava/lang/String;)V"/>
+ <method name="&lt;init>(Ljava/lang/String;Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/Throwable;)V"/>
+ <method name="getColumnNumber()I"/>
+ <method name="getDetail()Ljava/lang/Throwable;"/>
+ <method name="getLineNumber()I"/>
+ <field name="column"/>
+ <field name="detail"/>
+ <field name="row"/>
+ </class>
+ <class name="org/xmlpull/v1/XmlPullParserFactory" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="&lt;init>()V"/>
+ <method name="getFeature(Ljava/lang/String;)Z"/>
+ <method name="isNamespaceAware()Z"/>
+ <method name="isValidating()Z"/>
+ <method name="newInstance()Lorg/xmlpull/v1/XmlPullParserFactory;"/>
+ <method name="newInstance(Ljava/lang/String;Ljava/lang/Class;)Lorg/xmlpull/v1/XmlPullParserFactory;"/>
+ <method name="newPullParser()Lorg/xmlpull/v1/XmlPullParser;"/>
+ <method name="newSerializer()Lorg/xmlpull/v1/XmlSerializer;"/>
+ <method name="setFeature(Ljava/lang/String;Z)V"/>
+ <method name="setNamespaceAware(Z)V"/>
+ <method name="setValidating(Z)V"/>
+ <field name="PROPERTY_NAME"/>
+ <field name="classNamesLocation"/>
+ <field name="features"/>
+ <field name="parserClasses"/>
+ <field name="serializerClasses"/>
+ </class>
+ <class name="org/xmlpull/v1/XmlSerializer" since="1">
+ <extends name="java/lang/Object"/>
+ <method name="attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;"/>
+ <method name="cdsect(Ljava/lang/String;)V"/>
+ <method name="comment(Ljava/lang/String;)V"/>
+ <method name="docdecl(Ljava/lang/String;)V"/>
+ <method name="endDocument()V"/>
+ <method name="endTag(Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;"/>
+ <method name="entityRef(Ljava/lang/String;)V"/>
+ <method name="flush()V"/>
+ <method name="getDepth()I"/>
+ <method name="getFeature(Ljava/lang/String;)Z"/>
+ <method name="getName()Ljava/lang/String;"/>
+ <method name="getNamespace()Ljava/lang/String;"/>
+ <method name="getPrefix(Ljava/lang/String;Z)Ljava/lang/String;"/>
+ <method name="getProperty(Ljava/lang/String;)Ljava/lang/Object;"/>
+ <method name="ignorableWhitespace(Ljava/lang/String;)V"/>
+ <method name="processingInstruction(Ljava/lang/String;)V"/>
+ <method name="setFeature(Ljava/lang/String;Z)V"/>
+ <method name="setOutput(Ljava/io/OutputStream;Ljava/lang/String;)V"/>
+ <method name="setOutput(Ljava/io/Writer;)V"/>
+ <method name="setPrefix(Ljava/lang/String;Ljava/lang/String;)V"/>
+ <method name="setProperty(Ljava/lang/String;Ljava/lang/Object;)V"/>
+ <method name="startDocument(Ljava/lang/String;Ljava/lang/Boolean;)V"/>
+ <method name="startTag(Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;"/>
+ <method name="text(Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;"/>
+ <method name="text([CII)Lorg/xmlpull/v1/XmlSerializer;"/>
+ </class>
+ <class name="org/xmlpull/v1/sax2/Driver" since="1">
+ <extends name="java/lang/Object"/>
+ <implements name="org/xml/sax/Attributes"/>
+ <implements name="org/xml/sax/Locator"/>
+ <implements name="org/xml/sax/XMLReader"/>
+ <method name="&lt;init>()V"/>
+ <method name="&lt;init>(Lorg/xmlpull/v1/XmlPullParser;)V"/>
+ <method name="parseSubTree(Lorg/xmlpull/v1/XmlPullParser;)V"/>
+ <method name="startElement(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"/>
+ <field name="APACHE_DYNAMIC_VALIDATION_FEATURE"/>
+ <field name="APACHE_SCHEMA_VALIDATION_FEATURE"/>
+ <field name="DECLARATION_HANDLER_PROPERTY"/>
+ <field name="LEXICAL_HANDLER_PROPERTY"/>
+ <field name="NAMESPACES_FEATURE"/>
+ <field name="NAMESPACE_PREFIXES_FEATURE"/>
+ <field name="VALIDATION_FEATURE"/>
+ <field name="contentHandler"/>
+ <field name="errorHandler"/>
+ <field name="pp"/>
+ <field name="systemId"/>
+ </class>
+</api>
diff --git a/love2dToAPK/tools/tools/adb/dmtracedump.exe b/love2dToAPK/tools/tools/adb/dmtracedump.exe
new file mode 100644
index 0000000..db5b507
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/dmtracedump.exe
Binary files differ
diff --git a/love2dToAPK/tools/tools/adb/etc1tool.exe b/love2dToAPK/tools/tools/adb/etc1tool.exe
new file mode 100644
index 0000000..86aabc6
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/etc1tool.exe
Binary files differ
diff --git a/love2dToAPK/tools/tools/adb/fastboot.exe b/love2dToAPK/tools/tools/adb/fastboot.exe
new file mode 100644
index 0000000..6e15f5a
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/fastboot.exe
Binary files differ
diff --git a/love2dToAPK/tools/tools/adb/hprof-conv.exe b/love2dToAPK/tools/tools/adb/hprof-conv.exe
new file mode 100644
index 0000000..0c53d48
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/hprof-conv.exe
Binary files differ
diff --git a/love2dToAPK/tools/tools/adb/lib64/libc++.so b/love2dToAPK/tools/tools/adb/lib64/libc++.so
new file mode 100644
index 0000000..7489d9c
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/lib64/libc++.so
Binary files differ
diff --git a/love2dToAPK/tools/tools/adb/libwinpthread-1.dll b/love2dToAPK/tools/tools/adb/libwinpthread-1.dll
new file mode 100644
index 0000000..3aa88d7
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/libwinpthread-1.dll
Binary files differ
diff --git a/love2dToAPK/tools/tools/adb/mke2fs.exe b/love2dToAPK/tools/tools/adb/mke2fs.exe
new file mode 100644
index 0000000..d4491e1
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/mke2fs.exe
Binary files differ
diff --git a/love2dToAPK/tools/tools/adb/source.properties b/love2dToAPK/tools/tools/adb/source.properties
new file mode 100644
index 0000000..7b0ac1b
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/source.properties
@@ -0,0 +1,3 @@
+Pkg.UserSrc=false
+#Pkg.Revision=26.0.0
+Pkg.Revision=27.0.0
diff --git a/love2dToAPK/tools/tools/adb/sqlite3.exe b/love2dToAPK/tools/tools/adb/sqlite3.exe
new file mode 100644
index 0000000..ef34825
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/sqlite3.exe
Binary files differ
diff --git a/love2dToAPK/tools/tools/adb/systrace/NOTICE b/love2dToAPK/tools/tools/adb/systrace/NOTICE
new file mode 100644
index 0000000..624b6da
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/NOTICE
@@ -0,0 +1,205 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
diff --git a/love2dToAPK/tools/tools/adb/systrace/UPSTREAM_REVISION b/love2dToAPK/tools/tools/adb/systrace/UPSTREAM_REVISION
new file mode 100644
index 0000000..d19651e
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/UPSTREAM_REVISION
@@ -0,0 +1 @@
+6171fd4dd88d738437b803fbf5374be6bf9c5342
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/battor/battor/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/battor/battor/__init__.py
new file mode 100644
index 0000000..f18f330
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/battor/battor/__init__.py
@@ -0,0 +1,27 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+import os
+import sys
+
+def _JoinPath(*path_parts):
+ return os.path.abspath(os.path.join(*path_parts))
+
+
+def _AddDirToPythonPath(*path_parts):
+ path = _JoinPath(*path_parts)
+ if os.path.isdir(path) and path not in sys.path:
+ # Some call sites that use Telemetry assume that sys.path[0] is the
+ # directory containing the script, so we add these extra paths to right
+ # after sys.path[0].
+ sys.path.insert(1, path)
+
+_CATAPULT_DIR = os.path.join(
+ os.path.dirname(os.path.abspath(__file__)),
+ os.path.pardir, os.path.pardir, os.path.pardir)
+
+_AddDirToPythonPath(_CATAPULT_DIR, 'common', 'battor')
+_AddDirToPythonPath(_CATAPULT_DIR, 'common', 'py_utils')
+_AddDirToPythonPath(_CATAPULT_DIR, 'dependency_manager')
+_AddDirToPythonPath(_CATAPULT_DIR, 'devil')
+_AddDirToPythonPath(_CATAPULT_DIR, 'third_party', 'pyserial')
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/battor/battor/battor_binary_dependencies.json b/love2dToAPK/tools/tools/adb/systrace/catapult/common/battor/battor/battor_binary_dependencies.json
new file mode 100644
index 0000000..58c203e
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/battor/battor/battor_binary_dependencies.json
@@ -0,0 +1,114 @@
+{
+ "config_type": "BaseConfig",
+ "dependencies": {
+ "avrdude_binary": {
+ "cloud_storage_base_folder": "binary_dependencies/battor",
+ "cloud_storage_bucket": "chromium-telemetry",
+ "file_info": {
+ "darwin_x86_64": {
+ "cloud_storage_hash": "6de6324c279ea75c79c68cab4c2ddcc68da1b286",
+ "download_path": "../bin/darwin/x86_64/avrdude",
+ "local_paths": [
+ "../bin/override/avrdude"
+ ]
+ },
+ "linux2_x86_64": {
+ "cloud_storage_hash": "db29526605f6f95a75ab33f4060b8c330152de69",
+ "download_path": "../bin/linux2/x86_64/avrdude",
+ "local_paths": [
+ "../bin/override/avrdude"
+ ]
+ },
+ "win32_AMD64": {
+ "cloud_storage_hash": "517aa73b093e254007076cf5ac7afb94151df2ed",
+ "download_path": "../bin/win/x86_64/avrdude.exe",
+ "local_paths": [
+ "../bin/override/avrdude.exe"
+ ]
+ },
+ "win32_x86": {
+ "cloud_storage_hash": "517aa73b093e254007076cf5ac7afb94151df2ed",
+ "download_path": "../bin/win/x86_64/avrdude.exe",
+ "local_paths": [
+ "../bin/override/avrdude.exe"
+ ]
+ },
+ "win_AMD64": {
+ "cloud_storage_hash": "517aa73b093e254007076cf5ac7afb94151df2ed",
+ "download_path": "../bin/win/x86_64/avrdude.exe",
+ "local_paths": [
+ "../bin/override/avrdude.exe"
+ ]
+ }
+ }
+ },
+ "avrdude_config": {
+ "cloud_storage_base_folder": "binary_dependencies/battor",
+ "cloud_storage_bucket": "chromium-telemetry",
+ "file_info": {
+ "default": {
+ "cloud_storage_hash": "ccdfa12743429b8b92b61a20163d6311ab55a4fa",
+ "download_path": "../bin/battor/avrdude.conf",
+ "local_paths": [
+ "../bin/override/avrdude.conf"
+ ]
+ }
+ }
+ },
+ "battor_agent_binary": {
+ "cloud_storage_base_folder": "binary_dependencies/battor",
+ "cloud_storage_bucket": "chromium-telemetry",
+ "file_info": {
+ "darwin_x86_64": {
+ "cloud_storage_hash": "276b3507a1c617c01734d85a2133ed200f2a477b",
+ "download_path": "../bin/darwin/x86_64/battor_agent",
+ "local_paths": [
+ "../bin/override/battor_agent"
+ ]
+ },
+ "linux2_x86_64": {
+ "cloud_storage_hash": "582cfe85971ca84aa75cf078bafb737d0cbdfb31",
+ "download_path": "../bin/linux2/x86_64/battor_agent",
+ "local_paths": [
+ "../bin/override/battor_agent"
+ ]
+ },
+ "win32_AMD64": {
+ "cloud_storage_hash": "609c5f79a03b347ddbfd6e544d229a56851c0f66",
+ "download_path": "../bin/win/AMD64/battor_agent.exe",
+ "local_paths": [
+ "../bin/override/battor_agent.exe"
+ ]
+ },
+ "win32_x86": {
+ "cloud_storage_hash": "609c5f79a03b347ddbfd6e544d229a56851c0f66",
+ "download_path": "../bin/win/x86_64/battor_agent.exe",
+ "local_paths": [
+ "../bin/override/battor_agent.exe"
+ ]
+ },
+ "win_AMD64": {
+ "cloud_storage_hash": "609c5f79a03b347ddbfd6e544d229a56851c0f66",
+ "download_path": "../bin/win/AMD64/battor_agent.exe",
+ "local_paths": [
+ "../bin/override/battor_agent.exe"
+ ]
+ }
+ }
+ },
+ "battor_firmware": {
+ "cloud_storage_base_folder": "binary_dependencies/battor",
+ "cloud_storage_bucket": "chromium-telemetry",
+ "file_info": {
+ "default": {
+ "cloud_storage_hash": "da987f879c341bf2f928dc0f65cc6477c2d32bbc",
+ "download_path": "../bin/battor/battor_firmware.hex",
+ "local_paths": [
+ "../bin/override/battor_firmware.hex"
+ ],
+ "version_in_cs": "3c3ce4d"
+ }
+ }
+ }
+ }
+}
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/battor/battor/battor_error.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/battor/battor/battor_error.py
new file mode 100644
index 0000000..3ea6efc
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/battor/battor/battor_error.py
@@ -0,0 +1,8 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from devil import base_error
+
+class BattOrError(base_error.BaseError):
+ pass
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/battor/battor/battor_wrapper.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/battor/battor/battor_wrapper.py
new file mode 100644
index 0000000..6947f83
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/battor/battor/battor_wrapper.py
@@ -0,0 +1,420 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import atexit
+import datetime
+import os
+import logging
+import platform
+import random
+import subprocess
+import sys
+import tempfile
+import time
+
+from battor import battor_error
+import py_utils
+from py_utils import cloud_storage
+import dependency_manager
+from devil.utils import battor_device_mapping
+from devil.utils import find_usb_devices
+
+import serial
+from serial.tools import list_ports
+
+
+DEFAULT_SHELL_CLOSE_TIMEOUT_S = 60
+
+
+def IsBattOrConnected(test_platform, android_device=None,
+ android_device_map=None, android_device_file=None):
+ """Returns True if BattOr is detected."""
+ if test_platform == 'android':
+ if not android_device:
+ raise ValueError('Must pass android device serial when determining '
+ 'support on android platform')
+
+ if not android_device_map:
+ device_tree = find_usb_devices.GetBusNumberToDeviceTreeMap()
+ if device_tree:
+ logging.warning('Device tree:')
+ for _, node in sorted(device_tree.iteritems()):
+ node.Display()
+ else:
+ logging.warning('Empty device tree.')
+ if len(battor_device_mapping.GetBattOrList(device_tree)) == 1:
+ return True
+ if android_device_file:
+ android_device_map = battor_device_mapping.ReadSerialMapFile(
+ android_device_file)
+ else:
+ try:
+ android_device_map = battor_device_mapping.GenerateSerialMap()
+ logging.warning('Android device map: %s', android_device_map)
+ except battor_error.BattOrError:
+ logging.exception('Error generating serial map')
+ return False
+
+ # If neither if statement above is triggered, it means that an
+ # android_device_map was passed in and will be used.
+ return str(android_device) in android_device_map
+
+ elif test_platform == 'win':
+ for (_1, desc, _2) in serial.tools.list_ports.comports():
+ if 'USB Serial Port' in desc:
+ return True
+ logging.info('No usb serial port discovered. Available ones are: %s' %
+ list(serial.tools.list_ports.comports()))
+ return False
+
+ elif test_platform == 'mac':
+ for (_1, desc, _2) in serial.tools.list_ports.comports():
+ if 'BattOr' in desc:
+ return True
+ return False
+
+ elif test_platform == 'linux':
+ device_tree = find_usb_devices.GetBusNumberToDeviceTreeMap(fast=True)
+ return bool(battor_device_mapping.GetBattOrList(device_tree))
+
+ return False
+
+
+class BattOrWrapper(object):
+ """A class for communicating with a BattOr in python."""
+ _EXIT_CMD = 'Exit'
+ _GET_FIRMWARE_GIT_HASH_CMD = 'GetFirmwareGitHash'
+ _START_TRACING_CMD = 'StartTracing'
+ _STOP_TRACING_CMD = 'StopTracing'
+ _SUPPORTS_CLOCKSYNC_CMD = 'SupportsExplicitClockSync'
+ _RECORD_CLOCKSYNC_CMD = 'RecordClockSyncMarker'
+ _SUPPORTED_PLATFORMS = ['android', 'chromeos', 'linux', 'mac', 'win']
+
+ _BATTOR_PARTNO = 'x192a3u'
+ _BATTOR_PROGRAMMER = 'avr109'
+ _BATTOR_BAUDRATE = '115200'
+
+ def __init__(self, target_platform, android_device=None, battor_path=None,
+ battor_map_file=None, battor_map=None, serial_log_bucket=None,
+ autoflash=True):
+ """Constructor.
+
+ Args:
+ target_platform: Platform BattOr is attached to.
+ android_device: Serial number of Android device.
+ battor_path: Path to BattOr device.
+ battor_map_file: File giving map of [device serial: BattOr path]
+ battor_map: Map of [device serial: BattOr path]
+ serial_log_bucket: The cloud storage bucket to which BattOr agent serial
+ logs are uploaded on failure.
+
+ Attributes:
+ _battor_path: Path to BattOr. Typically similar to /tty/USB0.
+ _battor_agent_binary: Path to the BattOr agent binary used to communicate
+ with the BattOr.
+ _tracing: A bool saying if tracing has been started.
+ _battor_shell: A subprocess running the battor_agent_binary
+ _trace_results_path: Path to BattOr trace results file.
+ _serial_log_bucket: Cloud storage bucket to which BattOr agent serial logs
+ are uploaded on failure.
+ _serial_log_file: Temp file for the BattOr agent serial log.
+ """
+ self._battor_path = self._GetBattOrPath(target_platform, android_device,
+ battor_path, battor_map_file, battor_map)
+ config = os.path.join(
+ os.path.dirname(os.path.abspath(__file__)),
+ 'battor_binary_dependencies.json')
+
+ self._dm = dependency_manager.DependencyManager(
+ [dependency_manager.BaseConfig(config)])
+ self._battor_agent_binary = self._dm.FetchPath(
+ 'battor_agent_binary', '%s_%s' % (sys.platform, platform.machine()))
+
+ self._autoflash = autoflash
+ self._serial_log_bucket = serial_log_bucket
+ self._tracing = False
+ self._battor_shell = None
+ self._trace_results_path = None
+ self._start_tracing_time = None
+ self._stop_tracing_time = None
+ self._trace_results = None
+ self._serial_log_file = None
+ self._target_platform = target_platform
+ self._git_hash = None
+
+ atexit.register(self.KillBattOrShell)
+
+ def _FlashBattOr(self):
+ assert self._battor_shell, (
+ 'Must start shell before attempting to flash BattOr')
+
+ try:
+ device_git_hash = self.GetFirmwareGitHash()
+ battor_firmware, cs_git_hash = self._dm.FetchPathWithVersion(
+ 'battor_firmware', 'default')
+ if cs_git_hash != device_git_hash:
+ logging.info(
+ 'Flashing BattOr with old firmware version <%s> with new '
+ 'version <%s>.', device_git_hash, cs_git_hash)
+ avrdude_config = self._dm.FetchPath('avrdude_config', 'default')
+ self.StopShell()
+ return self.FlashFirmware(battor_firmware, avrdude_config)
+ return False
+ except ValueError:
+ logging.exception('Git hash returned from BattOr was not as expected: %s'
+ % self._git_hash)
+
+ finally:
+ if not self._battor_shell:
+ # TODO(charliea): Once we understand why BattOrs are crashing, remove
+ # this log.
+ # http://crbug.com/699581
+ logging.info('_FlashBattOr serial log:')
+ self._UploadSerialLogToCloudStorage()
+ self._serial_log_file = None
+
+ self.StartShell()
+
+ def KillBattOrShell(self):
+ if self._battor_shell:
+ logging.critical('BattOr shell was not properly closed. Killing now.')
+ self._battor_shell.kill()
+
+ def GetShellReturnCode(self):
+ """Gets the return code of the BattOr agent shell."""
+ rc = self._battor_shell.poll()
+ return rc
+
+ def StartShell(self):
+ """Start BattOr binary shell."""
+ assert not self._battor_shell, 'Attempting to start running BattOr shell.'
+
+ battor_cmd = [self._battor_agent_binary]
+ if self._serial_log_bucket:
+ # Create and immediately close a temp file in order to get a filename
+ # for the serial log.
+ self._serial_log_file = tempfile.NamedTemporaryFile(delete=False)
+ self._serial_log_file.close()
+ battor_cmd.append('--battor-serial-log=%s' % self._serial_log_file.name)
+ if self._battor_path:
+ battor_cmd.append('--battor-path=%s' % self._battor_path)
+ self._battor_shell = self._StartShellImpl(battor_cmd)
+ assert self.GetShellReturnCode() is None, 'Shell failed to start.'
+
+ def StopShell(self, timeout=None):
+ """Stop BattOr binary shell."""
+ assert self._battor_shell, 'Attempting to stop a non-running BattOr shell.'
+ assert not self._tracing, 'Attempting to stop a BattOr shell while tracing.'
+ timeout = timeout if timeout else DEFAULT_SHELL_CLOSE_TIMEOUT_S
+
+ self._SendBattOrCommand(self._EXIT_CMD, check_return=False)
+ try:
+ py_utils.WaitFor(lambda: self.GetShellReturnCode() != None, timeout)
+ except py_utils.TimeoutException:
+ self.KillBattOrShell()
+ finally:
+ self._battor_shell = None
+
+ def StartTracing(self):
+ """Start tracing on the BattOr."""
+ assert self._battor_shell, 'Must start shell before tracing'
+ assert not self._tracing, 'Tracing already started.'
+ self._FlashBattOr()
+ self._SendBattOrCommand(self._START_TRACING_CMD)
+ self._tracing = True
+ self._start_tracing_time = int(time.time())
+
+ def StopTracing(self):
+ """Stop tracing on the BattOr."""
+ assert self._tracing, 'Must run StartTracing before StopTracing'
+ # Create temp file to reserve location for saving results.
+ temp_file = tempfile.NamedTemporaryFile(delete=False)
+ self._trace_results_path = temp_file.name
+ temp_file.close()
+ self._SendBattOrCommand(
+ '%s %s' % (self._STOP_TRACING_CMD, self._trace_results_path),
+ check_return=False)
+ self._tracing = False
+ self._stop_tracing_time = int(time.time())
+
+ def CollectTraceData(self, timeout=None):
+ """Collect trace data from battor.
+ Args:
+ timeout: timeout for waiting on the BattOr process to terminate in
+ seconds.
+ Returns: Trace data in form of a list.
+ """
+ # The BattOr shell terminates after returning the results.
+ if timeout is None:
+ timeout = self._stop_tracing_time - self._start_tracing_time
+ py_utils.WaitFor(lambda: self.GetShellReturnCode() != None, timeout)
+
+ # TODO(charliea): Once we understand why BattOrs are crashing, only do
+ # this on failure.
+ # http://crbug.com/699581
+ logging.info('CollectTraceData serial log:')
+ self._UploadSerialLogToCloudStorage()
+
+ with open(self._trace_results_path) as results:
+ self._trace_results = results.read()
+ self._battor_shell = None
+ self._serial_log_file = None
+ return self._trace_results
+
+ def SupportsExplicitClockSync(self):
+ """Returns if BattOr supports Clock Sync events."""
+ return bool(int(self._SendBattOrCommand(self._SUPPORTS_CLOCKSYNC_CMD,
+ check_return=False)))
+
+ def RecordClockSyncMarker(self, sync_id):
+ """Record clock sync event on BattOr."""
+ if not isinstance(sync_id, basestring):
+ raise TypeError('sync_id must be a string.')
+ self._SendBattOrCommand('%s %s' % (self._RECORD_CLOCKSYNC_CMD, sync_id))
+
+ def _GetBattOrPath(self, target_platform, android_device=None,
+ battor_path=None, battor_map_file=None, battor_map=None):
+ """Determines most likely path to the correct BattOr."""
+ if target_platform not in self._SUPPORTED_PLATFORMS:
+ raise battor_error.BattOrError(
+ '%s is an unsupported platform.' % target_platform)
+ if target_platform in ['win']:
+ # Right now, the BattOr agent binary isn't able to automatically detect
+ # the BattOr port on Windows. To get around this, we know that the BattOr
+ # shows up with a name of 'USB Serial Port', so use the COM port that
+ # corresponds to a device with that name.
+ for (port, desc, _) in serial.tools.list_ports.comports():
+ if 'USB Serial Port' in desc:
+ return port
+ raise battor_error.BattOrError(
+ 'Could not find BattOr attached to machine.')
+ if target_platform in ['mac']:
+ for (port, desc, _) in serial.tools.list_ports.comports():
+ if 'BattOr' in desc:
+ return port
+
+ if target_platform in ['android', 'linux']:
+ device_tree = find_usb_devices.GetBusNumberToDeviceTreeMap(fast=True)
+ if battor_path:
+ if not isinstance(battor_path, basestring):
+ raise battor_error.BattOrError(
+ 'An invalid BattOr path was specified.')
+ return battor_path
+
+ if target_platform == 'android':
+ if not android_device:
+ raise battor_error.BattOrError(
+ 'Must specify device for Android platform.')
+ if not battor_map_file and not battor_map:
+ # No map was passed, so must create one.
+ battor_map = battor_device_mapping.GenerateSerialMap()
+
+ return battor_device_mapping.GetBattOrPathFromPhoneSerial(
+ str(android_device), serial_map_file=battor_map_file,
+ serial_map=battor_map)
+
+ # Not Android and no explicitly passed BattOr.
+ battors = battor_device_mapping.GetBattOrList(device_tree)
+ if len(battors) != 1:
+ raise battor_error.BattOrError(
+ 'For non-Android platforms, exactly one BattOr must be '
+ 'attached unless address is explicitly given.')
+ return '/dev/%s' % battors.pop()
+
+ raise NotImplementedError(
+ 'BattOr Wrapper not implemented for given platform')
+
+ def _SendBattOrCommandImpl(self, cmd):
+ """Sends command to the BattOr."""
+ self._battor_shell.stdin.write('%s\n' % cmd)
+ self._battor_shell.stdin.flush()
+ return self._battor_shell.stdout.readline()
+
+ def _SendBattOrCommand(self, cmd, check_return=True):
+ status = self._SendBattOrCommandImpl(cmd)
+
+ if check_return and not 'Done.' in status:
+ self.KillBattOrShell()
+ self._UploadSerialLogToCloudStorage()
+ self._serial_log_file = None
+ raise battor_error.BattOrError(
+ 'BattOr did not complete command \'%s\' correctly.\n'
+ 'Outputted: %s' % (cmd, status))
+ return status
+
+ def _StartShellImpl(self, battor_cmd):
+ return subprocess.Popen(
+ battor_cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT, shell=False)
+
+ def _UploadSerialLogToCloudStorage(self):
+ """Uploads the BattOr serial log to cloud storage."""
+ if not self._serial_log_file or not cloud_storage.IsNetworkIOEnabled():
+ return
+
+ remote_path = ('battor-serial-log-%s-%d.txt' % (
+ datetime.datetime.now().strftime('%Y-%m-%d_%H-%M.txt'),
+ random.randint(1, 100000)))
+
+ try:
+ cloud_url = cloud_storage.Insert(
+ self._serial_log_bucket, remote_path, self._serial_log_file.name)
+ sys.stderr.write('View BattOr serial log at %s\n' % cloud_url)
+ except cloud_storage.PermissionError as e:
+ logging.error('Cannot upload BattOr serial log file to cloud storage due '
+ 'to permission error: %s' % e.message)
+
+ def GetFirmwareGitHash(self):
+ """Gets the git hash for the BattOr firmware.
+
+ Returns: Git hash for firmware currently on the BattOr.
+ Also sets self._git_hash to this value.
+
+ Raises: ValueException if the git hash is not in hex.
+ """
+ assert self._battor_shell, ('Must start shell before getting firmware git '
+ 'hash')
+ self._git_hash = self._SendBattOrCommand(self._GET_FIRMWARE_GIT_HASH_CMD,
+ check_return=False).strip()
+ # We expect the git hash to be a valid 6 character hexstring. This will
+ # throw a ValueError exception otherwise.
+ int(self._git_hash, 16)
+ return self._git_hash
+
+ def FlashFirmware(self, hex_path, avrdude_config_path):
+ """Flashes the BattOr using an avrdude config at config_path with the new
+ firmware at hex_path.
+ """
+ assert not self._battor_shell, 'Cannot flash BattOr with open shell'
+
+ avrdude_binary = self._dm.FetchPath(
+ 'avrdude_binary', '%s_%s' % (sys.platform, platform.machine()))
+ # Sanitize hex file path for windows. It contains <drive>:/ which avrdude
+ # is not capable of handling.
+ _, hex_path = os.path.splitdrive(hex_path)
+ avr_cmd = [
+ avrdude_binary,
+ '-e', # Specify to erase data on chip.
+ '-p', self._BATTOR_PARTNO, # Specify AVR device.
+ # Specify which microcontroller programmer to use.
+ '-c', self._BATTOR_PROGRAMMER,
+ '-b', self._BATTOR_BAUDRATE, # Specify the baud rate to communicate at.
+ '-P', self._battor_path, # Serial path to the battor.
+ # Command to execute with hex file and path to hex file.
+ '-U', 'flash:w:%s' % hex_path,
+ '-C', avrdude_config_path, # AVRdude config file path.
+ '2>&1' # All output goes to stderr for some reason.
+ ]
+ try:
+ subprocess.check_output(avr_cmd)
+ except subprocess.CalledProcessError as e:
+ raise BattOrFlashError('BattOr flash failed with return code %s.'
+ % e.returncode)
+
+ self._git_hash = None
+ return True
+
+
+class BattOrFlashError(Exception):
+ pass
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/battor/battor/battor_wrapper_devicetest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/battor/battor/battor_wrapper_devicetest.py
new file mode 100644
index 0000000..4ca59a7
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/battor/battor/battor_wrapper_devicetest.py
@@ -0,0 +1,106 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import logging
+import platform
+import os
+import sys
+import time
+import unittest
+
+if __name__ == '__main__':
+ sys.path.append(
+ os.path.join(os.path.dirname(__file__), '..'))
+
+from battor import battor_wrapper
+from devil.utils import battor_device_mapping
+from devil.utils import find_usb_devices
+from py_utils import cloud_storage
+
+
+_SUPPORTED_CQ_PLATFORMS = ['win', 'linux', 'mac']
+
+class BattOrWrapperDeviceTest(unittest.TestCase):
+ def setUp(self):
+ test_platform = platform.system()
+ self._battor_list = None
+ if 'Win' in test_platform:
+ self._platform = 'win'
+ elif 'Linux' in test_platform:
+ self._platform = 'linux'
+ device_tree = find_usb_devices.GetBusNumberToDeviceTreeMap()
+ self._battor_list = battor_device_mapping.GetBattOrList(device_tree)
+ elif 'Darwin' in test_platform:
+ self._platform = 'mac'
+
+ if not battor_wrapper.IsBattOrConnected(self._platform):
+ self._battor_list = []
+
+ def testFullRun(self):
+ # If battor_list is an empty list, a BattOr was expected but not found.
+ if self._battor_list is not None and not self._battor_list:
+ logging.critical('No BattOrs attached. Cannot run tests.')
+ return
+
+ if self._platform not in _SUPPORTED_CQ_PLATFORMS:
+ logging.critical('Platform %s is not supported on CQ.' % self._platform)
+ return
+
+
+ battor_path = (None if not self._battor_list
+ else '/dev/%s' % self._battor_list[0])
+ battor = battor_wrapper.BattOrWrapper(
+ self._platform, battor_path=battor_path,
+ serial_log_bucket=cloud_storage.TELEMETRY_OUTPUT)
+ try:
+ battor.StartShell()
+ self.assertTrue(isinstance(battor.GetFirmwareGitHash(), basestring))
+ # We expect the git hash to be a valid 6 character hexstring. This will
+ # throw a ValueError exception otherwise.
+ int(battor.GetFirmwareGitHash(), 16)
+ self.assertTrue(len(battor.GetFirmwareGitHash()) == 7)
+ battor.StopShell()
+
+ battor.StartShell()
+ battor.StartTracing()
+ # TODO(rnephew): This sleep is required for now because crbug.com/602266
+ # causes the BattOr to crash when the trace time is too short. Once that
+ # bug is fixed, we should remove this delay.
+ time.sleep(1)
+ battor.RecordClockSyncMarker('abc')
+ # Sleep here because clock sync marker will be flaky if not.
+ time.sleep(1)
+ battor.StopTracing()
+
+ # Below is a work around for crbug.com/603309. On this short of a trace, 5
+ # seconds is enough to ensure that the trace will finish flushing to the
+ # file. The process is then killed so that BattOrWrapper knows that the
+ # process has been closed after tracing stops.
+ if self._platform == 'win':
+ time.sleep(5)
+ battor._battor_shell.kill()
+ results = battor.CollectTraceData().splitlines()
+ except:
+ if battor._battor_shell is not None:
+ battor._battor_shell.kill()
+ battor._battor_shell = None
+ raise
+
+ self.assertTrue('# BattOr' in results[0])
+ self.assertTrue('# voltage_range' in results[1])
+ self.assertTrue('# current_range' in results[2])
+ self.assertTrue('# sample_rate' in results[3])
+ # First line with results. Should be 3 'words'.
+ self.assertTrue(len(results[4].split()) == 3)
+ clock_sync_found = False
+ for entry in results:
+ if '<abc>' in entry:
+ clock_sync_found = True
+ break
+ self.assertTrue(clock_sync_found, 'BattOr Data:%s\n' % repr(results))
+
+
+if __name__ == '__main__':
+ logging.getLogger().setLevel(logging.DEBUG)
+ unittest.main(verbosity=2)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/battor/battor/battor_wrapper_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/battor/battor/battor_wrapper_unittest.py
new file mode 100644
index 0000000..3e48a33
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/battor/battor/battor_wrapper_unittest.py
@@ -0,0 +1,365 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import dependency_manager
+import logging
+import mock
+import subprocess
+import unittest
+
+from battor import battor_error
+from battor import battor_wrapper
+from devil.utils import battor_device_mapping
+from devil.utils import find_usb_devices
+
+import serial
+from serial.tools import list_ports
+
+
+class DependencyManagerMock(object):
+ def __init__(self, _):
+ self._fetch_return = 'path'
+ self._version_return = 'cbaa843'
+
+ def FetchPath(self, _, *unused):
+ del unused
+ return self._fetch_return
+
+ def FetchPathWithVersion(self, _, *unused):
+ del unused
+ return self._fetch_return, self._version_return
+
+class PopenMock(object):
+ def __init__(self, *unused):
+ pass
+
+ def poll(self):
+ pass
+
+ def kill(self):
+ pass
+
+
+class IsBattOrConnectedTest(unittest.TestCase):
+ def setUp(self):
+ # Windows monkey patches.
+ self._serial_tools_return = []
+ self._comports = serial.tools.list_ports.comports
+ serial.tools.list_ports.comports = lambda: self._serial_tools_return
+
+ # Linux/Android monkey patches.
+ self._generate_serial_map_return = {}
+ self._generate_serial_map = battor_device_mapping.GenerateSerialMap
+ battor_device_mapping.GenerateSerialMap = (
+ lambda: self._generate_serial_map_return)
+
+ self._read_serial_map_file_return = {}
+ self._read_serial_map_file = battor_device_mapping.ReadSerialMapFile
+ battor_device_mapping.ReadSerialMapFile = (
+ lambda f: self._read_serial_map_file_return)
+
+ self._get_bus_number_to_device_tree_map = (
+ find_usb_devices.GetBusNumberToDeviceTreeMap)
+ find_usb_devices.GetBusNumberToDeviceTreeMap = lambda fast=None: {}
+
+ self._get_battor_list_return = []
+ self._get_battor_list = battor_device_mapping.GetBattOrList
+ battor_device_mapping.GetBattOrList = lambda x: self._get_battor_list_return
+
+ def tearDown(self):
+ serial.tools.list_ports.comports = self._comports
+ battor_device_mapping.GenerateSerialMap = self._generate_serial_map
+ battor_device_mapping.ReadSerialMapFile = self._read_serial_map_file
+ find_usb_devices.GetBusNumberToDeviceTreeMap = (
+ self._get_bus_number_to_device_tree_map)
+ battor_device_mapping.GetBattOrList = self._get_battor_list
+
+ def forceException(self):
+ raise NotImplementedError
+
+ def testAndroidWithBattOr(self):
+ self._generate_serial_map_return = {'abc': '123'}
+ self.assertTrue(battor_wrapper.IsBattOrConnected('android', 'abc'))
+
+ def testAndroidWithoutMatchingBattOr(self):
+ self._generate_serial_map_return = {'notabc': 'not123'}
+ self.assertFalse(battor_wrapper.IsBattOrConnected('android', 'abc'))
+
+ def testAndroidNoDevicePassed(self):
+ with self.assertRaises(ValueError):
+ battor_wrapper.IsBattOrConnected('android')
+
+ def testAndroidWithMapAndFile(self):
+ device_map = {'abc': '123'}
+ battor_device_mapping.ReadSerialMapFile = self.forceException
+ self.assertTrue(
+ battor_wrapper.IsBattOrConnected('android', android_device='abc',
+ android_device_map=device_map,
+ android_device_file='file'))
+
+ def testAndroidWithMap(self):
+ self.assertTrue(
+ battor_wrapper.IsBattOrConnected('android', android_device='abc',
+ android_device_map={'abc', '123'}))
+
+ def testAndroidWithFile(self):
+ self._read_serial_map_file_return = {'abc': '123'}
+ self.assertTrue(
+ battor_wrapper.IsBattOrConnected('android', android_device='abc',
+ android_device_file='file'))
+
+ def testLinuxWithBattOr(self):
+ self._get_battor_list_return = ['battor']
+ self.assertTrue(battor_wrapper.IsBattOrConnected('linux'))
+
+ def testLinuxWithoutBattOr(self):
+ self._get_battor_list_return = []
+ self.assertFalse(battor_wrapper.IsBattOrConnected('linux'))
+
+ def testMacWithBattOr(self):
+ self._serial_tools_return = [('/dev/tty.usbserial-MAA', 'BattOr v3.3', '')]
+ self.assertTrue(battor_wrapper.IsBattOrConnected('mac'))
+
+ def testMacWithoutBattOr(self):
+ self._serial_tools_return = [('/dev/tty.usbserial-MAA', 'not_one', '')]
+ self.assertFalse(battor_wrapper.IsBattOrConnected('mac'))
+
+ def testWinWithBattOr(self):
+ self._serial_tools_return = [('COM4', 'USB Serial Port', '')]
+ self.assertTrue(battor_wrapper.IsBattOrConnected('win'))
+
+ def testWinWithoutBattOr(self):
+ self._get_battor_list_return = []
+ self.assertFalse(battor_wrapper.IsBattOrConnected('win'))
+
+
+class BattOrWrapperTest(unittest.TestCase):
+ def setUp(self):
+ self._battor = None
+ self._is_battor = True
+ self._battor_list = ['battor1']
+ self._should_pass = True
+ self._fake_map = {'battor1': 'device1'}
+ self._fake_return_code = None
+ self._fake_battor_return = 'Done.\n'
+
+ self._get_battor_path_from_phone_serial = (
+ battor_device_mapping.GetBattOrPathFromPhoneSerial)
+ self._get_bus_number_to_device_tree_map = (
+ find_usb_devices.GetBusNumberToDeviceTreeMap)
+ self._dependency_manager = dependency_manager.DependencyManager
+ self._get_battor_list = battor_device_mapping.GetBattOrList
+ self._is_battor = battor_device_mapping.IsBattOr
+ self._generate_serial_map = battor_device_mapping.GenerateSerialMap
+ self._serial_tools = serial.tools.list_ports.comports
+
+ battor_device_mapping.GetBattOrPathFromPhoneSerial = (
+ lambda x, serial_map_file=None, serial_map=None: x + '_battor')
+ find_usb_devices.GetBusNumberToDeviceTreeMap = lambda fast=False: True
+ dependency_manager.DependencyManager = DependencyManagerMock
+ battor_device_mapping.GetBattOrList = lambda x: self._battor_list
+ battor_device_mapping.IsBattOr = lambda x, y: self._is_battor
+ battor_device_mapping.GenerateSerialMap = lambda: self._fake_map
+ serial.tools.list_ports.comports = lambda: [('COM4', 'USB Serial Port', '')]
+
+ self._subprocess_check_output_code = 0
+ def subprocess_check_output_mock(*unused):
+ if self._subprocess_check_output_code != 0:
+ raise subprocess.CalledProcessError(None, None)
+ return 0
+ self._subprocess_check_output = subprocess.check_output
+ subprocess.check_output = subprocess_check_output_mock
+
+ def tearDown(self):
+ battor_device_mapping.GetBattOrPathFromPhoneSerial = (
+ self._get_battor_path_from_phone_serial)
+ find_usb_devices.GetBusNumberToDeviceTreeMap = (
+ self._get_bus_number_to_device_tree_map)
+ dependency_manager.DependencyManager = self._dependency_manager
+ battor_device_mapping.GetBattOrList = self._get_battor_list
+ battor_device_mapping.IsBattOr = self._is_battor
+ battor_device_mapping.GenerateSerialMap = self._generate_serial_map
+ serial.tools.list_ports.comports = self._serial_tools
+ subprocess.check_output = self._subprocess_check_output
+
+ def _DefaultBattOrReplacements(self):
+ battor_wrapper.DEFAULT_SHELL_CLOSE_TIMEOUT_S = .1
+ self._battor._StartShellImpl = lambda *unused: PopenMock()
+ self._battor.GetShellReturnCode = lambda *unused: self._fake_return_code
+ self._battor._SendBattOrCommandImpl = lambda x: self._fake_battor_return
+ self._battor._StopTracingImpl = lambda *unused: (self._fake_battor_return,
+ None)
+
+ def testBadPlatform(self):
+ with self.assertRaises(battor_error.BattOrError):
+ self._battor = battor_wrapper.BattOrWrapper('unknown')
+
+ def testInitAndroidWithBattOr(self):
+ self._battor = battor_wrapper.BattOrWrapper('android', android_device='abc')
+ self.assertEquals(self._battor._battor_path, 'abc_battor')
+
+ def testInitAndroidWithoutBattOr(self):
+ self._battor_list = []
+ self._fake_map = {}
+ battor_device_mapping.GetBattOrPathFromPhoneSerial = (
+ self._get_battor_path_from_phone_serial)
+ with self.assertRaises(battor_error.BattOrError):
+ self._battor = battor_wrapper.BattOrWrapper('android',
+ android_device='abc')
+
+ def testInitBattOrPathIsBattOr(self):
+ battor_path = 'battor/path/here'
+ self._battor = battor_wrapper.BattOrWrapper(
+ 'android', android_device='abc', battor_path=battor_path)
+ self.assertEquals(self._battor._battor_path, battor_path)
+
+ def testInitNonAndroidWithBattOr(self):
+ self._battor = battor_wrapper.BattOrWrapper('win')
+ self.assertEquals(self._battor._battor_path, 'COM4')
+
+ def testInitNonAndroidWithMultipleBattOr(self):
+ self._battor_list.append('battor2')
+ with self.assertRaises(battor_error.BattOrError):
+ self._battor = battor_wrapper.BattOrWrapper('linux')
+
+ def testInitNonAndroidWithoutBattOr(self):
+ self._battor_list = []
+ serial.tools.list_ports.comports = lambda: [('COM4', 'None', '')]
+ with self.assertRaises(battor_error.BattOrError):
+ self._battor = battor_wrapper.BattOrWrapper('win')
+
+ def testStartShellPass(self):
+ self._battor = battor_wrapper.BattOrWrapper('win')
+ self._DefaultBattOrReplacements()
+ self._battor.StartShell()
+ self.assertIsNotNone(self._battor._battor_shell)
+
+ def testStartShellDoubleStart(self):
+ self._battor = battor_wrapper.BattOrWrapper('win')
+ self._DefaultBattOrReplacements()
+ self._battor.StartShell()
+ with self.assertRaises(AssertionError):
+ self._battor.StartShell()
+
+ def testStartShellFail(self):
+ self._battor = battor_wrapper.BattOrWrapper('win')
+ self._DefaultBattOrReplacements()
+ self._battor.GetShellReturnCode = lambda *unused: 1
+ with self.assertRaises(AssertionError):
+ self._battor.StartShell()
+
+ def testStartTracingPass(self):
+ self._battor = battor_wrapper.BattOrWrapper('win')
+ self._DefaultBattOrReplacements()
+ self._battor.StartShell()
+ self._battor.StartTracing()
+ self.assertTrue(self._battor._tracing)
+
+ def testStartTracingDoubleStart(self):
+ self._battor = battor_wrapper.BattOrWrapper('win')
+ self._DefaultBattOrReplacements()
+ self._battor.StartShell()
+ self._battor.StartTracing()
+ with self.assertRaises(AssertionError):
+ self._battor.StartTracing()
+
+ def testStartTracingCommandFails(self):
+ self._battor = battor_wrapper.BattOrWrapper('win')
+ self._DefaultBattOrReplacements()
+ self._battor._SendBattOrCommandImpl = lambda *unused: 'Fail.\n'
+ self._battor.StartShell()
+ with self.assertRaises(battor_error.BattOrError):
+ self._battor.StartTracing()
+
+ def testStopTracingPass(self):
+ self._battor = battor_wrapper.BattOrWrapper('win')
+ self._DefaultBattOrReplacements()
+ self._battor.StartShell()
+ self._battor.StartTracing()
+ self._battor.GetShellReturnCode = lambda *unused: 0
+ self._battor.StopTracing()
+ self.assertFalse(self._battor._tracing)
+
+ def testStopTracingNotRunning(self):
+ self._battor = battor_wrapper.BattOrWrapper('win')
+ self._DefaultBattOrReplacements()
+ with self.assertRaises(AssertionError):
+ self._battor.StopTracing()
+
+ def testFlashFirmwarePass(self):
+ self._battor = battor_wrapper.BattOrWrapper('linux')
+ self._DefaultBattOrReplacements()
+ self.assertTrue(self._battor.FlashFirmware('hex_path', 'config_path'))
+
+ def testFlashFirmwareFail(self):
+ self._battor = battor_wrapper.BattOrWrapper('linux')
+ self._DefaultBattOrReplacements()
+ self._subprocess_check_output_code = 1
+ with self.assertRaises(battor_wrapper.BattOrFlashError):
+ self._battor.FlashFirmware('hex_path', 'config_path')
+
+ def testFlashFirmwareShellRunning(self):
+ self._battor = battor_wrapper.BattOrWrapper('linux')
+ self._DefaultBattOrReplacements()
+ self._battor.StartShell()
+ with self.assertRaises(AssertionError):
+ self._battor.FlashFirmware('hex_path', 'config_path')
+
+ def testGetFirmwareGitHashNotRunning(self):
+ self._battor = battor_wrapper.BattOrWrapper('win')
+ self._DefaultBattOrReplacements()
+ with self.assertRaises(AssertionError):
+ self._battor.GetFirmwareGitHash()
+
+ def testGetFirmwareGitHashPass(self):
+ self._battor = battor_wrapper.BattOrWrapper('win')
+ self._DefaultBattOrReplacements()
+ self._battor.StartShell()
+ self._battor.GetFirmwareGitHash = lambda: 'cbaa843'
+ self.assertTrue(isinstance(self._battor.GetFirmwareGitHash(), basestring))
+
+ def testStopShellPass(self):
+ self._battor = battor_wrapper.BattOrWrapper('win')
+ self._DefaultBattOrReplacements()
+ self._battor.StartShell()
+ self._fake_return_code = 0
+ self._battor.StopShell()
+ self.assertIsNone(self._battor._battor_shell)
+
+ @mock.patch('time.sleep', mock.Mock)
+ def testStopShellTimeOutAndKill(self):
+ self._battor = battor_wrapper.BattOrWrapper('win')
+ self._DefaultBattOrReplacements()
+ self._battor.StartShell()
+ self._battor.StopShell()
+ self.assertIsNone(self._battor._battor_shell)
+
+ def testStopShellNotStarted(self):
+ self._battor = battor_wrapper.BattOrWrapper('win')
+ self._DefaultBattOrReplacements()
+ with self.assertRaises(AssertionError):
+ self._battor.StopShell()
+
+ @mock.patch('time.sleep', mock.Mock)
+ def testFlashBattOrSameGitHash(self):
+ self._battor = battor_wrapper.BattOrWrapper('linux')
+ self._DefaultBattOrReplacements()
+ self._battor.StartShell()
+ self._battor.GetFirmwareGitHash = lambda: 'cbaa843'
+ dependency_manager.DependencyManager._version_return = 'cbaa843'
+ self.assertFalse(self._battor._FlashBattOr())
+
+ @mock.patch('time.sleep', mock.Mock)
+ def testFlashBattOrDifferentGitHash(self):
+ self._battor = battor_wrapper.BattOrWrapper('linux')
+ self._DefaultBattOrReplacements()
+ self._battor.StartShell()
+ self._battor.GetFirmwareGitHash = lambda: 'bazz732'
+ dependency_manager.DependencyManager._version_return = 'cbaa843'
+ self.assertTrue(self._battor._FlashBattOr())
+
+
+if __name__ == '__main__':
+ logging.getLogger().setLevel(logging.DEBUG)
+ unittest.main(verbosity=2)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/eslint/LICENSE b/love2dToAPK/tools/tools/adb/systrace/catapult/common/eslint/LICENSE
new file mode 100644
index 0000000..f943447
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/eslint/LICENSE
@@ -0,0 +1,20 @@
+ESLint
+Copyright jQuery Foundation and other contributors, https://jquery.org/
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE. \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/eslint/README.md b/love2dToAPK/tools/tools/adb/systrace/catapult/common/eslint/README.md
new file mode 100644
index 0000000..8ba5b63
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/eslint/README.md
@@ -0,0 +1,5 @@
+This directory contains the Catapult eslint config, custom Catapult eslint rules,
+and tests for those rules.
+
+Some of our custom rules are modified versions of those included with eslint, as
+suggested in https://goo.gl/uAxFHq.
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/eslint/eslint/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/eslint/eslint/__init__.py
new file mode 100644
index 0000000..082178a
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/eslint/eslint/__init__.py
@@ -0,0 +1,68 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import subprocess
+import sys
+
+
+_CATAPULT_PATH = os.path.join(
+ os.path.dirname(os.path.abspath(__file__)),
+ os.path.pardir, os.path.pardir, os.path.pardir)
+
+
+def _AddToPathIfNeeded(path):
+ if path not in sys.path:
+ sys.path.insert(0, path)
+
+
+def _UpdateSysPathIfNeeded():
+ _AddToPathIfNeeded(os.path.join(_CATAPULT_PATH, 'common', 'node_runner'))
+ _AddToPathIfNeeded(os.path.join(_CATAPULT_PATH, 'common', 'py_utils'))
+
+
+_UpdateSysPathIfNeeded()
+
+
+import py_utils
+from node_runner import node_util
+
+
+BASE_ESLINT_CMD = [
+ node_util.GetNodePath(),
+ os.path.join(node_util.GetNodeModulesPath(), 'eslint', 'bin', 'eslint.js'),
+ '--color'
+]
+
+
+DEFAULT_ESLINT_RULES_DIR = os.path.join(
+ py_utils.GetCatapultDir(), 'common', 'eslint', 'rules')
+
+
+def _CreateEslintCommand(rulesdir, extra_args):
+ eslint_cmd = BASE_ESLINT_CMD + [
+ '--rulesdir', rulesdir, '--ext', '.js,.html'
+ ]
+ if extra_args:
+ eslint_cmd.extend(extra_args.strip().split(' '))
+ return eslint_cmd
+
+
+def RunEslint(paths, rules_dir=DEFAULT_ESLINT_RULES_DIR, extra_args=None):
+ """Runs eslint on a list of paths.
+
+ Args:
+ paths: A list of paths to run eslint on.
+ rules_dir: A directory of custom eslint rules.
+ extra_args: A string to append to the end of the eslint command.
+ """
+ if type(paths) is not list or len(paths) == 0:
+ raise ValueError('Must specify a non-empty list of paths to lint.')
+
+ try:
+ eslint_cmd = _CreateEslintCommand(rules_dir, extra_args)
+ return True, subprocess.check_output(eslint_cmd + paths,
+ stderr=subprocess.STDOUT).rstrip()
+ except subprocess.CalledProcessError as e:
+ return False, e.output.rstrip()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/eslint/eslint/smoke_test.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/eslint/eslint/smoke_test.py
new file mode 100644
index 0000000..9a0f442
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/eslint/eslint/smoke_test.py
@@ -0,0 +1,36 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import eslint
+import os
+import tempfile
+import unittest
+
+
+_TEMP_FILE_CONTENTS = '''<!DOCTYPE html>
+<!--
+Copyright 2016 The Chromium Authors. All rights reserved.
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+<script>
+// This should cause a linter error because we require camelCase.
+var non_camel_case = 0;
+</script>
+'''
+
+
+class SmokeTest(unittest.TestCase):
+ def testEslintFindsError(self):
+ try:
+ tmp_file = tempfile.NamedTemporaryFile(
+ delete=False, dir=os.path.dirname(__file__), suffix=".html")
+ tmp_file.write(_TEMP_FILE_CONTENTS)
+ tmp_file.close()
+
+ success, output = eslint.RunEslint([tmp_file.name])
+ self.assertFalse(success)
+ self.assertTrue('is not in camel case' in output)
+ finally:
+ os.remove(tmp_file.name)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/eslint/rules/catapult-camelcase.js b/love2dToAPK/tools/tools/adb/systrace/catapult/common/eslint/rules/catapult-camelcase.js
new file mode 100644
index 0000000..bf31052
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/eslint/rules/catapult-camelcase.js
@@ -0,0 +1,154 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+/* eslint-disable */
+
+/**
+ * @fileoverview Rule to flag non-camelcased identifiers
+ * @author Nicholas C. Zakas
+ */
+
+'use strict';
+
+//------------------------------------------------------------------------------
+// Rule Definition
+//------------------------------------------------------------------------------
+
+module.exports = {
+ meta: {
+ docs: {
+ description: "enforce Catapult camelcase naming convention",
+ category: "Stylistic Issues",
+ recommended: false
+ },
+
+ schema: [
+ {
+ type: "object",
+ properties: {
+ properties: {
+ enum: ["always", "never"]
+ }
+ },
+ additionalProperties: false
+ }
+ ]
+ },
+
+ create(context) {
+
+ //--------------------------------------------------------------------------
+ // Helpers
+ //--------------------------------------------------------------------------
+
+ // contains reported nodes to avoid reporting twice on destructuring with shorthand notation
+ var reported = [];
+
+ /**
+ * Checks if a string contains an underscore and isn't all upper-case
+ * @param {string} name The string to check.
+ * @returns {boolean} if the string is underscored
+ * @private
+ */
+ function isUnderscored(name) {
+
+ // if there's an underscore, it might be A_VARANT, which is okay
+ return name.indexOf("_") > -1 && name !== name.toUpperCase();
+ }
+
+ /**
+ * Reports an AST node as a rule violation.
+ * @param {ASTNode} node The node to report.
+ * @returns {void}
+ * @private
+ */
+ function report(node) {
+ if (reported.indexOf(node) < 0) {
+ reported.push(node);
+ context.report(node, "Identifier '{{name}}' is not in camel case.", { name: node.name });
+ }
+ }
+
+ var options = context.options[0] || {};
+ let properties = options.properties || "";
+
+ if (properties !== "always" && properties !== "never") {
+ properties = "always";
+ }
+
+ return {
+
+ Identifier(node) {
+
+ /*
+ * Leading and trailing underscores are commonly used to flag
+ * private/protected identifiers, strip them.
+ *
+ * NOTE: This has four Catapult-specific style exceptions:
+ *
+ * - The prefix opt_
+ * - The prefix g_
+ * - The suffix _smallerIsBetter
+ * - The suffix _biggerIsBetter
+ */
+ var name = node.name.replace(/(?:^opt_)|^(?:^g_)|^_+|_+$|(?:_smallerIsBetter)$|(?:_biggerIsBetter)$/g, ""),
+ effectiveParent = (node.parent.type === "MemberExpression") ? node.parent.parent : node.parent;
+
+ // MemberExpressions get special rules
+ if (node.parent.type === "MemberExpression") {
+
+ // "never" check properties
+ if (properties === "never") {
+ return;
+ }
+
+ // Always report underscored object names
+ if (node.parent.object.type === "Identifier" &&
+ node.parent.object.name === node.name &&
+ isUnderscored(name)) {
+ report(node);
+
+ // Report AssignmentExpressions only if they are the left side of the assignment
+ } else if (effectiveParent.type === "AssignmentExpression" &&
+ isUnderscored(name) &&
+ (effectiveParent.right.type !== "MemberExpression" ||
+ effectiveParent.left.type === "MemberExpression" &&
+ effectiveParent.left.property.name === node.name)) {
+ report(node);
+ }
+
+ // Properties have their own rules
+ } else if (node.parent.type === "Property") {
+
+ // "never" check properties
+ if (properties === "never") {
+ return;
+ }
+
+ if (node.parent.parent && node.parent.parent.type === "ObjectPattern" &&
+ node.parent.key === node && node.parent.value !== node) {
+ return;
+ }
+
+ if (isUnderscored(name) && effectiveParent.type !== "CallExpression") {
+ report(node);
+ }
+
+ // Check if it's an import specifier
+ } else if (["ImportSpecifier", "ImportNamespaceSpecifier", "ImportDefaultSpecifier"].indexOf(node.parent.type) >= 0) {
+
+ // Report only if the local imported identifier is underscored
+ if (node.parent.local && node.parent.local.name === node.name && isUnderscored(name)) {
+ report(node);
+ }
+
+ // Report anything that is underscored that isn't a CallExpression
+ } else if (isUnderscored(name) && effectiveParent.type !== "CallExpression") {
+ report(node);
+ }
+ }
+
+ };
+
+ }
+};
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/eslint/tests/catapult-camelcase.js b/love2dToAPK/tools/tools/adb/systrace/catapult/common/eslint/tests/catapult-camelcase.js
new file mode 100644
index 0000000..f0bdb37
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/eslint/tests/catapult-camelcase.js
@@ -0,0 +1,324 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+/* eslint-disable */
+
+/**
+ * @fileoverview Tests for camelcase rule.
+ * @author Nicholas C. Zakas
+ */
+
+'use strict';
+
+//------------------------------------------------------------------------------
+// Requirements
+//------------------------------------------------------------------------------
+
+var rule = require("../rules/catapult-camelcase"),
+ RuleTester = require("../../node_runner/node_runner/node_modules/eslint/lib/testers/rule-tester");
+
+//------------------------------------------------------------------------------
+// Tests
+//------------------------------------------------------------------------------
+
+var ruleTester = new RuleTester();
+
+ruleTester.run("camelcase", rule, {
+ valid: [
+ "firstName = \"Nicholas\"",
+ "FIRST_NAME = \"Nicholas\"",
+ "__myPrivateVariable = \"Patrick\"",
+ "myPrivateVariable_ = \"Patrick\"",
+ "function doSomething(){}",
+ "do_something()",
+ "foo.do_something()",
+ "var foo = bar.baz_boom;",
+ "var foo = bar.baz_boom.something;",
+ "foo.boom_pow.qux = bar.baz_boom.something;",
+ "if (bar.baz_boom) {}",
+ "var obj = { key: foo.bar_baz };",
+ "var arr = [foo.bar_baz];",
+ "[foo.bar_baz]",
+ "var arr = [foo.bar_baz.qux];",
+ "[foo.bar_baz.nesting]",
+ "if (foo.bar_baz === boom.bam_pow) { [foo.baz_boom] }",
+ // These tests are for Catapult-specific exceptions.
+ "opt_firstName = \"Nicholas\"",
+ "g_firstName = \"Nicholas\"",
+ "sizeInBytes_smallerIsBetter = \"Nicholas\"",
+ "sizeInBytes_biggerIsBetter = \"Nicholas\"",
+ {
+ code: "var o = {key: 1}",
+ options: [{properties: "always"}]
+ },
+ {
+ code: "var o = {bar_baz: 1}",
+ options: [{properties: "never"}]
+ },
+ {
+ code: "obj.a_b = 2;",
+ options: [{properties: "never"}]
+ },
+ {
+ code: "var obj = {\n a_a: 1 \n};\n obj.a_b = 2;",
+ options: [{properties: "never"}]
+ },
+ {
+ code: "obj.foo_bar = function(){};",
+ options: [{properties: "never"}]
+ },
+ {
+ code: "var { category_id: category } = query;",
+ parserOptions: { ecmaVersion: 6 }
+ },
+ {
+ code: "var { category_id: category } = query;",
+ parserOptions: { ecmaVersion: 6 },
+ options: [{properties: "never"}]
+ },
+ {
+ code: "import { camelCased } from \"external module\";",
+ parserOptions: { ecmaVersion: 6, sourceType: "module" }
+ },
+ {
+ code: "import { no_camelcased as camelCased } from \"external-module\";",
+ parserOptions: { ecmaVersion: 6, sourceType: "module" }
+ },
+ {
+ code: "import { no_camelcased as camelCased, anoterCamelCased } from \"external-module\";",
+ parserOptions: { ecmaVersion: 6, sourceType: "module" }
+ }
+ ],
+ invalid: [
+ {
+ code: "first_name = \"Nicholas\"",
+ errors: [
+ {
+ message: "Identifier 'first_name' is not in camel case.",
+ type: "Identifier"
+ }
+ ]
+ },
+ {
+ code: "__private_first_name = \"Patrick\"",
+ errors: [
+ {
+ message: "Identifier '__private_first_name' is not in camel case.",
+ type: "Identifier"
+ }
+ ]
+ },
+ {
+ code: "function foo_bar(){}",
+ errors: [
+ {
+ message: "Identifier 'foo_bar' is not in camel case.",
+ type: "Identifier"
+ }
+ ]
+ },
+ {
+ code: "obj.foo_bar = function(){};",
+ errors: [
+ {
+ message: "Identifier 'foo_bar' is not in camel case.",
+ type: "Identifier"
+ }
+ ]
+ },
+ {
+ code: "bar_baz.foo = function(){};",
+ errors: [
+ {
+ message: "Identifier 'bar_baz' is not in camel case.",
+ type: "Identifier"
+ }
+ ]
+ },
+ {
+ code: "[foo_bar.baz]",
+ errors: [
+ {
+ message: "Identifier 'foo_bar' is not in camel case.",
+ type: "Identifier"
+ }
+ ]
+ },
+ {
+ code: "if (foo.bar_baz === boom.bam_pow) { [foo_bar.baz] }",
+ errors: [
+ {
+ message: "Identifier 'foo_bar' is not in camel case.",
+ type: "Identifier"
+ }
+ ]
+ },
+ {
+ code: "foo.bar_baz = boom.bam_pow",
+ errors: [
+ {
+ message: "Identifier 'bar_baz' is not in camel case.",
+ type: "Identifier"
+ }
+ ]
+ },
+ {
+ code: "var foo = { bar_baz: boom.bam_pow }",
+ errors: [
+ {
+ message: "Identifier 'bar_baz' is not in camel case.",
+ type: "Identifier"
+ }
+ ]
+ },
+ {
+ code: "foo.qux.boom_pow = { bar: boom.bam_pow }",
+ errors: [
+ {
+ message: "Identifier 'boom_pow' is not in camel case.",
+ type: "Identifier"
+ }
+ ]
+ },
+ {
+ code: "var o = {bar_baz: 1}",
+ options: [{properties: "always"}],
+ errors: [
+ {
+ message: "Identifier 'bar_baz' is not in camel case.",
+ type: "Identifier"
+ }
+ ]
+ },
+ {
+ code: "obj.a_b = 2;",
+ options: [{properties: "always"}],
+ errors: [
+ {
+ message: "Identifier 'a_b' is not in camel case.",
+ type: "Identifier"
+ }
+ ]
+ },
+ {
+ code: "obj.a_b = 2;",
+ options: [{properties: "always"}],
+ errors: [
+ {
+ message: "Identifier 'a_b' is not in camel case.",
+ type: "Identifier"
+ }
+ ]
+ },
+ {
+ code: "var { category_id: category_id } = query;",
+ parserOptions: { ecmaVersion: 6 },
+ errors: [
+ {
+ message: "Identifier 'category_id' is not in camel case.",
+ type: "Identifier"
+ }
+ ]
+ },
+ {
+ code: "var { category_id } = query;",
+ parserOptions: { ecmaVersion: 6 },
+ errors: [
+ {
+ message: "Identifier 'category_id' is not in camel case.",
+ type: "Identifier"
+ }
+ ]
+ },
+ {
+ code: "import no_camelcased from \"external-module\";",
+ parserOptions: { ecmaVersion: 6, sourceType: "module" },
+ errors: [
+ {
+ message: "Identifier 'no_camelcased' is not in camel case.",
+ type: "Identifier"
+ }
+ ]
+ },
+ {
+ code: "import * as no_camelcased from \"external-module\";",
+ parserOptions: { ecmaVersion: 6, sourceType: "module" },
+ errors: [
+ {
+ message: "Identifier 'no_camelcased' is not in camel case.",
+ type: "Identifier"
+ }
+ ]
+ },
+ {
+ code: "import { no_camelcased } from \"external-module\";",
+ parserOptions: { ecmaVersion: 6, sourceType: "module" },
+ errors: [
+ {
+ message: "Identifier 'no_camelcased' is not in camel case.",
+ type: "Identifier"
+ }
+ ]
+ },
+ {
+ code: "import { no_camelcased as no_camel_cased } from \"external module\";",
+ parserOptions: { ecmaVersion: 6, sourceType: "module" },
+ errors: [
+ {
+ message: "Identifier 'no_camel_cased' is not in camel case.",
+ type: "Identifier"
+ }
+ ]
+ },
+ {
+ code: "import { camelCased as no_camel_cased } from \"external module\";",
+ parserOptions: { ecmaVersion: 6, sourceType: "module" },
+ errors: [
+ {
+ message: "Identifier 'no_camel_cased' is not in camel case.",
+ type: "Identifier"
+ }
+ ]
+ },
+ {
+ code: "import { camelCased, no_camelcased } from \"external-module\";",
+ parserOptions: { ecmaVersion: 6, sourceType: "module" },
+ errors: [
+ {
+ message: "Identifier 'no_camelcased' is not in camel case.",
+ type: "Identifier"
+ }
+ ]
+ },
+ {
+ code: "import { no_camelcased as camelCased, another_no_camelcased } from \"external-module\";",
+ parserOptions: { ecmaVersion: 6, sourceType: "module" },
+ errors: [
+ {
+ message: "Identifier 'another_no_camelcased' is not in camel case.",
+ type: "Identifier"
+ }
+ ]
+ },
+ {
+ code: "import camelCased, { no_camelcased } from \"external-module\";",
+ parserOptions: { ecmaVersion: 6, sourceType: "module" },
+ errors: [
+ {
+ message: "Identifier 'no_camelcased' is not in camel case.",
+ type: "Identifier"
+ }
+ ]
+ },
+ {
+ code: "import no_camelcased, { another_no_camelcased as camelCased } from \"external-module\";",
+ parserOptions: { ecmaVersion: 6, sourceType: "module" },
+ errors: [
+ {
+ message: "Identifier 'no_camelcased' is not in camel case.",
+ type: "Identifier"
+ }
+ ]
+ }
+ ]
+});
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/lab/commits.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/lab/commits.py
new file mode 100644
index 0000000..3938c40
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/lab/commits.py
@@ -0,0 +1,101 @@
+#!/usr/bin/env python
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Print statistics about the rate of commits to a repository."""
+
+import datetime
+import itertools
+import json
+import math
+import urllib
+import urllib2
+
+
+_BASE_URL = 'https://chromium.googlesource.com/'
+# Can be up to 10,000.
+_REVISION_COUNT = 1000
+
+_REPOSITORIES = [
+ 'chromium/src',
+ 'angle/angle',
+ 'skia',
+ 'v8/v8',
+]
+
+
+def Pairwise(iterable):
+ """s -> (s0,s1), (s1,s2), (s2, s3), ..."""
+ a, b = itertools.tee(iterable)
+ next(b, None)
+ return itertools.izip(a, b)
+
+
+def Percentile(data, percentile):
+ """Find a percentile of a list of values.
+
+ Parameters:
+ data: A sorted list of values.
+ percentile: The percentile to look up, from 0.0 to 1.0.
+
+ Returns:
+ The percentile.
+
+ Raises:
+ ValueError: If data is empty.
+ """
+ if not data:
+ raise ValueError()
+
+ k = (len(data) - 1) * percentile
+ f = math.floor(k)
+ c = math.ceil(k)
+
+ if f == c:
+ return data[int(k)]
+ return data[int(f)] * (c - k) + data[int(c)] * (k - f)
+
+
+def CommitTimes(repository, revision_count):
+ parameters = urllib.urlencode((('n', revision_count), ('format', 'JSON')))
+ url = '%s/%s/+log?%s' % (_BASE_URL, urllib.quote(repository), parameters)
+ data = json.loads(''.join(urllib2.urlopen(url).read().splitlines()[1:]))
+
+ commit_times = []
+ for revision in data['log']:
+ commit_time_string = revision['committer']['time']
+ commit_time = datetime.datetime.strptime(
+ commit_time_string, '%a %b %d %H:%M:%S %Y')
+ commit_times.append(commit_time)
+
+ return commit_times
+
+
+def main():
+ for repository in _REPOSITORIES:
+ commit_times = CommitTimes(repository, _REVISION_COUNT)
+
+ commit_durations = []
+ for time1, time2 in Pairwise(commit_times):
+ commit_durations.append((time1 - time2).total_seconds())
+ commit_durations.sort()
+
+ print 'REPOSITORY:', repository
+ print 'Start Date:', min(commit_times)
+ print ' End Date:', max(commit_times)
+ print ' Duration:', max(commit_times) - min(commit_times)
+ print ' n:', len(commit_times)
+
+ for p in (0.00, 0.05, 0.25, 0.50, 0.75, 0.95, 1.00):
+ percentile = Percentile(commit_durations, p)
+ print '%3d%% commit duration:' % (p * 100), '%6ds' % percentile
+ mean = math.fsum(commit_durations) / len(commit_durations)
+ print ' Min commit duration:', '%6ds' % min(commit_durations)
+ print 'Mean commit duration:', '%6ds' % mean
+ print ' Max commit duration:', '%6ds' % max(commit_durations)
+ print
+
+
+if __name__ == '__main__':
+ main()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/lab/hardware.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/lab/hardware.py
new file mode 100644
index 0000000..5e49c5c
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/lab/hardware.py
@@ -0,0 +1,93 @@
+#!/usr/bin/env python
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Query build slave hardware info, and print it to stdout as csv."""
+
+import csv
+import json
+import logging
+import sys
+import urllib2
+
+
+_MASTERS = [
+ 'chromium.perf',
+ 'chromium.perf.fyi',
+ 'client.catapult',
+ 'tryserver.chromium.perf',
+ 'tryserver.client.catapult',
+]
+
+
+_KEYS = [
+ 'master', 'builder', 'hostname',
+
+ 'os family', 'os version', 'bitness (userland)',
+
+ 'product name', 'architecture', 'processor count', 'processor type',
+ 'memory total',
+
+ 'facter version', 'git version', 'puppet version', 'python version',
+ 'ruby version',
+
+ 'android device 1', 'android device 2', 'android device 3',
+ 'android device 4', 'android device 5', 'android device 6',
+ 'android device 7', 'android device 8',
+]
+_EXCLUDED_KEYS = frozenset([
+ 'architecture (userland)',
+ 'b directory',
+ 'last puppet run',
+ 'uptime',
+ 'windows version',
+])
+
+
+def main():
+ writer = csv.DictWriter(sys.stdout, _KEYS)
+ writer.writeheader()
+
+ for master_name in _MASTERS:
+ master_data = json.load(urllib2.urlopen(
+ 'http://build.chromium.org/p/%s/json/slaves' % master_name))
+
+ slaves = sorted(master_data.iteritems(),
+ key=lambda x: (x[1]['builders'].keys(), x[0]))
+ for slave_name, slave_data in slaves:
+ for builder_name in slave_data['builders']:
+ row = {
+ 'master': master_name,
+ 'builder': builder_name,
+ 'hostname': slave_name,
+ }
+
+ host_data = slave_data['host']
+ if host_data:
+ host_data = host_data.splitlines()
+ if len(host_data) > 1:
+ for line in host_data:
+ if not line:
+ continue
+ key, value = line.split(': ')
+ if key in _EXCLUDED_KEYS:
+ continue
+ row[key] = value
+
+ # Munge keys.
+ row = {key.replace('_', ' '): value for key, value in row.iteritems()}
+ if 'osfamily' in row:
+ row['os family'] = row.pop('osfamily')
+ if 'product name' not in row and slave_name.startswith('slave'):
+ row['product name'] = 'Google Compute Engine'
+
+ try:
+ writer.writerow(row)
+ except ValueError:
+ logging.error(row)
+ raise
+
+
+if __name__ == '__main__':
+ main()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/lab/keychain_unlock.sh b/love2dToAPK/tools/tools/adb/systrace/catapult/common/lab/keychain_unlock.sh
new file mode 100644
index 0000000..e550f8d
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/lab/keychain_unlock.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+#
+# Script to SSH into a list of bots and set up their keychains for Telemetry.
+# https://www.chromium.org/developers/telemetry/telemetry-mac-keychain-setup
+
+for hostname in "$@"
+do
+ ssh -t "$hostname" 'security unlock-keychain login.keychain
+security delete-generic-password -s "Chrome Safe Storage" login.keychain
+security add-generic-password -a Chrome -w "+NTclOvR4wLMgRlLIL9bHQ==" \
+ -s "Chrome Safe Storage" -A login.keychain'
+done
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/node_runner/node_runner/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/node_runner/node_runner/__init__.py
new file mode 100644
index 0000000..ce33e05
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/node_runner/node_runner/__init__.py
@@ -0,0 +1,4 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/node_runner/node_runner/node_binaries.json b/love2dToAPK/tools/tools/adb/systrace/catapult/common/node_runner/node_runner/node_binaries.json
new file mode 100644
index 0000000..4245249
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/node_runner/node_runner/node_binaries.json
@@ -0,0 +1,53 @@
+{
+ "config_type": "BaseConfig",
+ "dependencies": {
+ "node": {
+ "cloud_storage_base_folder": "binary_dependencies",
+ "cloud_storage_bucket": "chromium-telemetry",
+ "file_info": {
+ "linux_x86_64": {
+ "cloud_storage_hash": "5750e968975e7f5ab8cb694f5e92a34a890e129d",
+ "download_path": "bin/node/node-linux64.zip",
+ "path_within_archive": "node-v6.7.0-linux-x64/bin/node",
+ "version_in_cs": "6.7.0"
+ },
+ "mac_x86_64": {
+ "cloud_storage_hash": "1af7c221e530165af8a6ab8ff7ccb1f2dd54036d",
+ "download_path": "bin/node/node-mac64.zip",
+ "path_within_archive": "node-v6.7.0-darwin-x64/bin/node",
+ "version_in_cs": "6.7.0"
+ },
+ "win_AMD64": {
+ "cloud_storage_hash": "23f21bfb2edf874a8b6bdb6c1acb408bc7edeced",
+ "download_path": "bin/node/node-win64.zip",
+ "path_within_archive": "node-v6.7.0-win-x64/node.exe",
+ "version_in_cs": "6.7.0"
+ }
+ }
+ },
+ "npm": {
+ "cloud_storage_base_folder": "binary_dependencies",
+ "cloud_storage_bucket": "chromium-telemetry",
+ "file_info": {
+ "linux_x86_64": {
+ "cloud_storage_hash": "5750e968975e7f5ab8cb694f5e92a34a890e129d",
+ "download_path": "bin/node/node-linux64.zip",
+ "path_within_archive": "node-v6.7.0-linux-x64/lib/node_modules/npm/bin/npm-cli.js",
+ "version_in_cs": "6.7.0"
+ },
+ "mac_x86_64": {
+ "cloud_storage_hash": "1af7c221e530165af8a6ab8ff7ccb1f2dd54036d",
+ "download_path": "bin/node/node-mac64.zip",
+ "path_within_archive": "node-v6.7.0-darwin-x64/lib/node_modules/npm/bin/npm-cli.js",
+ "version_in_cs": "6.7.0"
+ },
+ "win_AMD64": {
+ "cloud_storage_hash": "23f21bfb2edf874a8b6bdb6c1acb408bc7edeced",
+ "download_path": "bin/node/node-win64.zip",
+ "path_within_archive": "node-v6.7.0-win-x64\\node_modules\\npm\\bin\\npm-cli.js",
+ "version_in_cs": "6.7.0"
+ }
+ }
+ }
+ }
+}
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/node_runner/node_runner/node_util.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/node_runner/node_runner/node_util.py
new file mode 100644
index 0000000..05d0084
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/node_runner/node_runner/node_util.py
@@ -0,0 +1,60 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import subprocess
+import sys
+
+import py_utils
+from py_utils import binary_manager
+from py_utils import dependency_util
+
+
+def _NodeBinariesConfigPath():
+ return os.path.realpath(os.path.join(
+ os.path.dirname(os.path.abspath(__file__)), 'node_binaries.json'))
+
+
+class _NodeManager(object):
+ def __init__(self):
+ self.bm = binary_manager.BinaryManager(
+ [_NodeBinariesConfigPath()])
+ self.os_name = dependency_util.GetOSNameForCurrentDesktopPlatform()
+ self.arch_name = dependency_util.GetArchForCurrentDesktopPlatform(
+ self.os_name)
+ self.node_path = self.bm.FetchPath('node', self.os_name, self.arch_name)
+ self.npm_path = self.bm.FetchPath('npm', self.os_name, self.arch_name)
+
+ self.node_initialized = False
+
+ def InitNode(self):
+ if self.node_initialized:
+ return # So we only init once per run
+ self.node_initialized = True
+ old_dir = os.path.abspath(os.curdir)
+ os.chdir(os.path.join(os.path.abspath(
+ py_utils.GetCatapultDir()), 'common', 'node_runner', 'node_runner'))
+ subprocess.call([self.node_path, self.npm_path, 'install'])
+ os.chdir(old_dir)
+
+
+_NODE_MANAGER = _NodeManager()
+
+
+def InitNode():
+ _NODE_MANAGER.InitNode()
+
+
+def GetNodePath():
+ return _NODE_MANAGER.node_path
+
+
+def GetNodeModulesPath():
+ _NODE_MANAGER.InitNode()
+ path = os.path.abspath(os.path.join(os.path.dirname(__file__),
+ 'node_modules'))
+ if sys.platform.startswith('win'):
+ # Escape path on Windows because it's very long and must be passed to NTFS.
+ path = u'\\\\?\\' + path
+ return path
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/node_runner/node_runner/package.json b/love2dToAPK/tools/tools/adb/systrace/catapult/common/node_runner/node_runner/package.json
new file mode 100644
index 0000000..27d0325
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/node_runner/node_runner/package.json
@@ -0,0 +1,22 @@
+{
+ "name": "catapult_base",
+ "version": "1.0.0",
+ "description": "Catapult project base",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/catapult-project/catapult/tree/master/catapult_base"
+ },
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "author": "The Chromium Authors",
+ "license": "BSD-2-Clause",
+ "gypfile": false,
+ "private": true,
+ "dependencies": {
+ "eslint": "^3.14.1",
+ "eslint-config-google": "^0.6.0",
+ "eslint-plugin-html": "^2.0.0"
+ }
+}
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/README.txt b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/README.txt
new file mode 100644
index 0000000..2f0d33d
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/README.txt
@@ -0,0 +1,7 @@
+py_trace_event allows low-overhead instrumentation of a multi-threaded,
+multi-process application in order to study its global performance
+characteristics. It uses the trace event format used in Chromium/Chrome's
+about:tracing system.
+
+Trace files generated by py_trace_event can be viewed and manipulated by
+trace_event_viewer.
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/__init__.py
new file mode 100644
index 0000000..b8b6630
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/__init__.py
@@ -0,0 +1,9 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+import os
+import sys
+
+SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__))
+PY_UTILS = os.path.abspath(os.path.join(SCRIPT_DIR, '..', '..', 'py_utils'))
+sys.path.append(PY_UTILS)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/run_tests b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/run_tests
new file mode 100644
index 0000000..7f9673d
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/run_tests
@@ -0,0 +1,163 @@
+#!/usr/bin/env python
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+import logging
+import optparse
+import os
+import platform
+import re
+import sys
+import types
+import traceback
+import unittest
+
+
+def discover(dir, filters):
+ if hasattr(unittest.TestLoader, 'discover'):
+ return unittest.TestLoader().discover(dir, '*')
+
+ # poor mans unittest.discover
+ loader = unittest.TestLoader()
+ subsuites = []
+
+ for (dirpath, dirnames, filenames) in os.walk(dir):
+ for filename in [x for x in filenames if re.match('.*_test\.py$', x)]:
+ if filename.startswith('.') or filename.startswith('_'):
+ continue
+ fqn = dirpath.replace(
+ '/', '.') + '.' + re.match('(.+)\.py$', filename).group(1)
+
+ # load the test
+ try:
+ module = __import__(fqn,fromlist=[True])
+ except:
+ print "While importing [%s]\n" % fqn
+ traceback.print_exc()
+ continue
+
+ def test_is_selected(name):
+ for f in filters:
+ if re.search(f,name):
+ return True
+ return False
+
+ if hasattr(module, 'suite'):
+ base_suite = module.suite()
+ else:
+ base_suite = loader.loadTestsFromModule(module)
+ new_suite = unittest.TestSuite()
+ for t in base_suite:
+ if isinstance(t, unittest.TestSuite):
+ for i in t:
+ if test_is_selected(i.id()):
+ new_suite.addTest(i)
+ elif isinstance(t, unittest.TestCase):
+ if test_is_selected(t.id()):
+ new_suite.addTest(t)
+ else:
+ raise Exception("Wtf, expected TestSuite or TestCase, got %s" % t)
+
+ if new_suite.countTestCases():
+ subsuites.append(new_suite)
+
+ return unittest.TestSuite(subsuites)
+
+
+def main():
+ parser = optparse.OptionParser()
+ parser.add_option(
+ '-v', '--verbose', action='count', default=0,
+ help='Increase verbosity level (repeat as needed)')
+ parser.add_option('--debug', dest='debug', action='store_true', default=False,
+ help='Break into pdb when an assertion fails')
+ parser.add_option('--incremental', dest='incremental', action='store_true',
+ default=False, help='Run tests one at a time.')
+ parser.add_option('--stop', dest='stop_on_error', action='store_true',
+ default=False, help='Stop running tests on error.')
+ (options, args) = parser.parse_args()
+
+ if options.verbose >= 2:
+ logging.basicConfig(level=logging.DEBUG)
+ elif options.verbose:
+ logging.basicConfig(level=logging.INFO)
+ else:
+ logging.basicConfig(level=logging.WARNING)
+
+ # install hook on set_trace if --debug
+ if options.debug:
+ import exceptions
+ class DebuggingAssertionError(exceptions.AssertionError):
+ def __init__(self, *args):
+ exceptions.AssertionError.__init__(self, *args)
+ print "Assertion failed, entering PDB..."
+ import pdb
+ if hasattr(sys, '_getframe'):
+ pdb.Pdb().set_trace(sys._getframe().f_back.f_back)
+ else:
+ pdb.set_trace()
+ unittest.TestCase.failureException = DebuggingAssertionError
+
+ def hook(*args):
+ import traceback, pdb
+ traceback.print_exception(*args)
+ pdb.pm()
+ sys.excepthook = hook
+
+ import browser
+ browser.debug_mode = True
+
+ else:
+ def hook(exc, value, tb):
+ import traceback
+ if not str(value).startswith("_noprint"):
+ traceback.print_exception(exc, value, tb)
+ import src.message_loop
+ if src.message_loop.is_main_loop_running():
+ if not str(value).startswith("_noprint"):
+ print "Untrapped exception! Exiting message loop with exception."
+ src.message_loop.quit_main_loop(quit_with_exception=True)
+
+ sys.excepthook = hook
+
+ # make sure cwd is the base directory!
+ os.chdir(os.path.dirname(__file__))
+
+ if len(args) > 0:
+ suites = discover('trace_event_impl', args)
+ else:
+ suites = discover('trace_event_impl', ['.*'])
+
+ r = unittest.TextTestRunner()
+ if not options.incremental:
+ res = r.run(suites)
+ if res.wasSuccessful():
+ return 0
+ return 255
+ else:
+ ok = True
+ for s in suites:
+ if isinstance(s, unittest.TestSuite):
+ for t in s:
+ print '--------------------------------------------------------------'
+ print 'Running %s' % str(t)
+ res = r.run(t)
+ if not res.wasSuccessful():
+ ok = False
+ if options.stop_on_error:
+ break
+ if ok == False and options.stop_on_error:
+ break
+ else:
+ res = r.run(s)
+ if not res.wasSuccessful():
+ ok = False
+ if options.stop_on_error:
+ break
+ if ok:
+ return 0
+ return 255
+
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/setup.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/setup.py
new file mode 100644
index 0000000..0b0070a
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/setup.py
@@ -0,0 +1,12 @@
+#!/usr/bin/env python
+# Copyright 2011 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+from distutils.core import setup
+setup(
+ name='py_trace_event',
+ packages=['trace_event_impl'],
+ version='0.1.0',
+ description='Performance tracing for python',
+ author='Nat Duca'
+)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event.py
new file mode 100644
index 0000000..1abbfa7
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event.py
@@ -0,0 +1,266 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+from py_trace_event import trace_time
+
+
+r"""Instrumentation-based profiling for Python.
+
+trace_event allows you to hand-instrument your code with areas of interest.
+When enabled, trace_event logs the start and stop times of these events to a
+logfile. These resulting logfiles can be viewed with either Chrome's
+about:tracing UI or with the standalone trace_event_viewer available at
+ http://www.github.com/natduca/trace_event_viewer/
+
+To use trace event, call trace_event_enable and start instrumenting your code:
+ from trace_event import *
+
+ if "--trace" in sys.argv:
+ trace_enable("myfile.trace")
+
+ @traced
+ def foo():
+ ...
+
+ class MyFoo(object):
+ @traced
+ def bar(self):
+ ...
+
+trace_event records trace events to an in-memory buffer. If your application is
+long running and you want to see the results of a trace before it exits, you can
+call trace_flush to write any in-memory events to disk.
+
+To help intregrating trace_event into existing codebases that dont want to add
+trace_event as a dependancy, trace_event is split into an import shim
+(trace_event.py) and an implementaiton (trace_event_impl/*). You can copy the
+shim, trace_event.py, directly into your including codebase. If the
+trace_event_impl is not found, the shim will simply noop.
+
+trace_event is safe with regard to Python threads. Simply trace as you normally
+would and each thread's timing will show up in the trace file.
+
+Multiple processes can safely output into a single trace_event logfile. If you
+fork after enabling tracing, the child process will continue outputting to the
+logfile. Use of the multiprocessing module will work as well. In both cases,
+however, note that disabling tracing in the parent process will not stop tracing
+in the child processes.
+"""
+
+try:
+ import trace_event_impl
+except ImportError:
+ trace_event_impl = None
+
+
+def trace_can_enable():
+ """
+ Returns True if a trace_event_impl was found. If false,
+ trace_enable will fail. Regular tracing methods, including
+ trace_begin and trace_end, will simply be no-ops.
+ """
+ return trace_event_impl != None
+
+if trace_event_impl:
+ import time
+
+
+ def trace_is_enabled():
+ return trace_event_impl.trace_is_enabled()
+
+ def trace_enable(logfile):
+ return trace_event_impl.trace_enable(logfile)
+
+ def trace_disable():
+ return trace_event_impl.trace_disable()
+
+ def trace_flush():
+ trace_event_impl.trace_flush()
+
+ def trace_begin(name, **kwargs):
+ args_to_log = {key: repr(value) for key, value in kwargs.iteritems()}
+ trace_event_impl.add_trace_event("B", trace_time.Now(), "python", name,
+ args_to_log)
+
+ def trace_end(name):
+ trace_event_impl.add_trace_event("E", trace_time.Now(), "python", name)
+
+ def trace(name, **kwargs):
+ return trace_event_impl.trace(name, **kwargs)
+
+ TracedMetaClass = trace_event_impl.TracedMetaClass
+
+ def traced(fn):
+ return trace_event_impl.traced(fn)
+
+ def clock_sync(sync_id, issue_ts=None):
+ '''
+ Add a clock sync event to the trace log.
+
+ Args:
+ sync_id: ID of clock sync event.
+ issue_ts: Time at which clock sync was issued, in microseconds.
+ '''
+ time_stamp = trace_time.Now()
+ args_to_log = {'sync_id': sync_id}
+ if issue_ts: # Issuer if issue_ts is set, else reciever.
+ assert issue_ts <= time_stamp
+ args_to_log['issue_ts'] = issue_ts
+ trace_event_impl.add_trace_event(
+ "c", time_stamp, "python", "clock_sync", args_to_log)
+
+ def is_tracing_controllable():
+ return trace_event_impl.is_tracing_controllable()
+
+else:
+ import contextlib
+
+ def trace_enable():
+ raise TraceException(
+ "Cannot enable trace_event. No trace_event_impl module found.")
+
+ def trace_disable():
+ pass
+
+ def trace_is_enabled():
+ return False
+
+ def trace_flush():
+ pass
+
+ def trace_begin(name, **kwargs):
+ del name # unused.
+ del kwargs # unused.
+ pass
+
+ def trace_end(name):
+ del name # unused.
+ pass
+
+ @contextlib.contextmanager
+ def trace(name, **kwargs):
+ del name # unused
+ del kwargs # unused
+ yield
+
+ def traced(fn):
+ return fn
+
+ def clock_sync(sync_id, issue_ts=None):
+ del sync_id # unused.
+ pass
+
+ def is_tracing_controllable():
+ return False
+
+trace_enable.__doc__ = """Enables tracing.
+
+ Once enabled, the enabled bit propagates to forked processes and
+ multiprocessing subprocesses. Regular child processes, e.g. those created via
+ os.system/popen, or subprocess.Popen instances, will not get traced. You can,
+ however, enable tracing on those subprocess manually.
+
+ Trace files are multiprocess safe, so you can have multiple processes
+ outputting to the same tracelog at once.
+
+ log_file can be one of three things:
+
+ None: a logfile is opened based on sys[argv], namely
+ "./" + sys.argv[0] + ".json"
+
+ string: a logfile of the given name is opened.
+
+ file-like object: the fileno() is is used. The underlying file descriptor
+ must support fcntl.lockf() operations.
+ """
+
+trace_disable.__doc__ = """Disables tracing, if enabled.
+
+ Will not disable tracing on any existing child proceses that were forked
+ from this process. You must disable them yourself.
+ """
+
+trace_flush.__doc__ = """Flushes any currently-recorded trace data to disk.
+
+ trace_event records traces into an in-memory buffer for efficiency. Flushing
+ is only done at process exit or when this method is called.
+ """
+
+trace_is_enabled.__doc__ = """Returns whether tracing is enabled.
+ """
+
+trace_begin.__doc__ = """Records the beginning of an event of the given name.
+
+ The building block for performance tracing. A typical example is:
+ from trace_event import *
+ def something_heavy():
+ trace_begin("something_heavy")
+
+ trace_begin("read")
+ try:
+ lines = open().readlines()
+ finally:
+ trace_end("read")
+
+ trace_begin("parse")
+ try:
+ parse(lines)
+ finally:
+ trace_end("parse")
+
+ trace_end("something_heavy")
+
+ Note that a trace_end call must be issued for every trace_begin call. When
+ tracing around blocks that might throw exceptions, you should use the trace
+ function, or a try-finally pattern to ensure that the trace_end method is
+ called.
+
+ See the documentation for the @traced decorator for a simpler way to
+ instrument functions and methods.
+ """
+
+trace_end.__doc__ = """Records the end of an event of the given name.
+
+ See the documentation for trace_begin for more information.
+
+ Make sure to issue a trace_end for every trace_begin issued. Failure to pair
+ these calls will lead to bizarrely tall looking traces in the
+ trace_event_viewer UI.
+ """
+
+trace.__doc__ = """Traces a block of code using a with statement.
+
+ Example usage:
+ from trace_event import *
+ def something_heavy(lines):
+ with trace("parse_lines", lines=lines):
+ parse(lines)
+
+ If tracing an entire function call, prefer the @traced decorator.
+ """
+
+traced.__doc__ = """
+ Traces the provided function, using the function name for the actual generated
+ event.
+
+ Prefer this decorator over the explicit trace_begin and trace_end functions
+ whenever you are tracing the start and stop of a function. It automatically
+ issues trace_begin/end events, even when the wrapped function throws.
+
+ You can also pass the function's argument names to traced, and the argument
+ values will be added to the trace. Example usage:
+ from trace_event import *
+ @traced("url")
+ def send_request(url):
+ urllib2.urlopen(url).read()
+ """
+
+clock_sync.__doc__ = """
+ Issues a clock sync marker event.
+
+ Clock sync markers are used to synchronize the clock domains of different
+ traces so that they can be used together. It takes a sync_id, and if it is
+ the issuer of a clock sync event it will also require an issue_ts. The
+ issue_ts is a timestamp from when the clocksync was first issued. This is used
+ to calculate the time difference between clock domains.
+ """
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/__init__.py
new file mode 100644
index 0000000..d250e03
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/__init__.py
@@ -0,0 +1,7 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+from log import *
+from decorators import *
+from meta_class import *
+import multiprocessing_shim
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/decorators.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/decorators.py
new file mode 100644
index 0000000..dc753f1
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/decorators.py
@@ -0,0 +1,87 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+import contextlib
+import inspect
+import time
+import functools
+
+import log
+from py_trace_event import trace_time
+
+
+@contextlib.contextmanager
+def trace(name, **kwargs):
+ category = "python"
+ start = trace_time.Now()
+ args_to_log = {key: repr(value) for key, value in kwargs.iteritems()}
+ log.add_trace_event("B", start, category, name, args_to_log)
+ try:
+ yield
+ finally:
+ end = trace_time.Now()
+ log.add_trace_event("E", end, category, name)
+
+def traced(*args):
+ def get_wrapper(func):
+ if inspect.isgeneratorfunction(func):
+ raise Exception("Can not trace generators.")
+
+ category = "python"
+
+ arg_spec = inspect.getargspec(func)
+ is_method = arg_spec.args and arg_spec.args[0] == "self"
+
+ def arg_spec_tuple(name):
+ arg_index = arg_spec.args.index(name)
+ defaults_length = len(arg_spec.defaults) if arg_spec.defaults else 0
+ default_index = arg_index + defaults_length - len(arg_spec.args)
+ if default_index >= 0:
+ default = arg_spec.defaults[default_index]
+ else:
+ default = None
+ return (name, arg_index, default)
+
+ args_to_log = map(arg_spec_tuple, arg_names)
+
+ @functools.wraps(func)
+ def traced_function(*args, **kwargs):
+ # Everything outside traced_function is done at decoration-time.
+ # Everything inside traced_function is done at run-time and must be fast.
+ if not log._enabled: # This check must be at run-time.
+ return func(*args, **kwargs)
+
+ def get_arg_value(name, index, default):
+ if name in kwargs:
+ return kwargs[name]
+ elif index < len(args):
+ return args[index]
+ else:
+ return default
+
+ if is_method:
+ name = "%s.%s" % (args[0].__class__.__name__, func.__name__)
+ else:
+ name = "%s.%s" % (func.__module__, func.__name__)
+
+ # Be sure to repr before calling func. Argument values may change.
+ arg_values = {
+ name: repr(get_arg_value(name, index, default))
+ for name, index, default in args_to_log}
+
+ start = trace_time.Now()
+ log.add_trace_event("B", start, category, name, arg_values)
+ try:
+ return func(*args, **kwargs)
+ finally:
+ end = trace_time.Now()
+ log.add_trace_event("E", end, category, name)
+ return traced_function
+
+ no_decorator_arguments = len(args) == 1 and callable(args[0])
+ if no_decorator_arguments:
+ arg_names = ()
+ return get_wrapper(args[0])
+ else:
+ arg_names = args
+ return get_wrapper
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/decorators_test.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/decorators_test.py
new file mode 100644
index 0000000..5bb13ad
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/decorators_test.py
@@ -0,0 +1,62 @@
+#!/usr/bin/env python
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+import decorators
+import logging
+import unittest
+
+from trace_test import TraceTest
+#from .trace_test import TraceTest
+
+def generator():
+ yield 1
+ yield 2
+
+class DecoratorTests(unittest.TestCase):
+ def test_tracing_object_fails(self):
+ self.assertRaises(Exception, lambda: decorators.trace(1))
+ self.assertRaises(Exception, lambda: decorators.trace(""))
+ self.assertRaises(Exception, lambda: decorators.trace([]))
+
+ def test_tracing_generators_fail(self):
+ self.assertRaises(Exception, lambda: decorators.trace(generator))
+
+class ClassToTest(object):
+ @decorators.traced
+ def method1(self):
+ return 1
+
+ @decorators.traced
+ def method2(self):
+ return 1
+
+@decorators.traced
+def traced_func():
+ return 1
+
+class DecoratorTests(TraceTest):
+ def _get_decorated_method_name(self, f):
+ res = self.go(f)
+ events = res.findEventsOnThread(res.findThreadIds()[0])
+
+ # Sanity checks.
+ self.assertEquals(2, len(events))
+ self.assertEquals(events[0]["name"], events[1]["name"])
+ return events[1]["name"]
+
+
+ def test_func_names_work(self):
+ self.assertEquals('__main__.traced_func',
+ self._get_decorated_method_name(traced_func))
+
+ def test_method_names_work(self):
+ ctt = ClassToTest()
+ self.assertEquals('ClassToTest.method1',
+ self._get_decorated_method_name(ctt.method1))
+ self.assertEquals('ClassToTest.method2',
+ self._get_decorated_method_name(ctt.method2))
+
+if __name__ == '__main__':
+ logging.getLogger().setLevel(logging.DEBUG)
+ unittest.main(verbosity=2)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/log.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/log.py
new file mode 100644
index 0000000..95d012f
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/log.py
@@ -0,0 +1,179 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+import atexit
+import json
+import os
+import sys
+import time
+import threading
+
+from py_trace_event import trace_time
+
+from py_utils import lock
+
+
+_lock = threading.Lock()
+
+_enabled = False
+_log_file = None
+
+_cur_events = [] # events that have yet to be buffered
+
+_tls = threading.local() # tls used to detect forking/etc
+_atexit_regsitered_for_pid = None
+
+_control_allowed = True
+
+
+class TraceException(Exception):
+ pass
+
+def _note(msg, *args):
+ pass
+# print "%i: %s" % (os.getpid(), msg)
+
+
+def _locked(fn):
+ def locked_fn(*args,**kwargs):
+ _lock.acquire()
+ try:
+ ret = fn(*args,**kwargs)
+ finally:
+ _lock.release()
+ return ret
+ return locked_fn
+
+def _disallow_tracing_control():
+ global _control_allowed
+ _control_allowed = False
+
+def trace_enable(log_file=None):
+ _trace_enable(log_file)
+
+@_locked
+def _trace_enable(log_file=None):
+ global _enabled
+ if _enabled:
+ raise TraceException("Already enabled")
+ if not _control_allowed:
+ raise TraceException("Tracing control not allowed in child processes.")
+ _enabled = True
+ global _log_file
+ if log_file == None:
+ if sys.argv[0] == '':
+ n = 'trace_event'
+ else:
+ n = sys.argv[0]
+ log_file = open("%s.json" % n, "ab", False)
+ _note("trace_event: tracelog name is %s.json" % n)
+ elif isinstance(log_file, basestring):
+ _note("trace_event: tracelog name is %s" % log_file)
+ log_file = open("%s" % log_file, "ab", False)
+ elif not hasattr(log_file, 'fileno'):
+ raise TraceException(
+ "Log file must be None, a string, or file-like object with a fileno()")
+
+ _log_file = log_file
+ with lock.FileLock(_log_file, lock.LOCK_EX):
+ _log_file.seek(0, os.SEEK_END)
+
+ lastpos = _log_file.tell()
+ creator = lastpos == 0
+ if creator:
+ _note("trace_event: Opened new tracelog, lastpos=%i", lastpos)
+ _log_file.write('[')
+
+ tid = threading.current_thread().ident
+ if not tid:
+ tid = os.getpid()
+ x = {"ph": "M", "category": "process_argv",
+ "pid": os.getpid(), "tid": threading.current_thread().ident,
+ "ts": trace_time.Now(),
+ "name": "process_argv", "args": {"argv": sys.argv}}
+ _log_file.write("%s\n" % json.dumps(x))
+ else:
+ _note("trace_event: Opened existing tracelog")
+ _log_file.flush()
+
+@_locked
+def trace_flush():
+ if _enabled:
+ _flush()
+
+@_locked
+def trace_disable():
+ global _enabled
+ if not _control_allowed:
+ raise TraceException("Tracing control not allowed in child processes.")
+ if not _enabled:
+ return
+ _enabled = False
+ _flush(close=True)
+
+def _flush(close=False):
+ global _log_file
+ with lock.FileLock(_log_file, lock.LOCK_EX):
+ _log_file.seek(0, os.SEEK_END)
+ if len(_cur_events):
+ _log_file.write(",\n")
+ _log_file.write(",\n".join([json.dumps(e) for e in _cur_events]))
+ del _cur_events[:]
+
+ if close:
+ # We might not be the only process writing to this logfile. So,
+ # we will simply close the file rather than writign the trailing ] that
+ # it technically requires. The trace viewer understands that this may
+ # happen and will insert a trailing ] during loading.
+ pass
+ _log_file.flush()
+
+ if close:
+ _note("trace_event: Closed")
+ _log_file.close()
+ _log_file = None
+ else:
+ _note("trace_event: Flushed")
+
+@_locked
+def trace_is_enabled():
+ return _enabled
+
+@_locked
+def add_trace_event(ph, ts, category, name, args=None):
+ global _enabled
+ if not _enabled:
+ return
+ if not hasattr(_tls, 'pid') or _tls.pid != os.getpid():
+ _tls.pid = os.getpid()
+ global _atexit_regsitered_for_pid
+ if _tls.pid != _atexit_regsitered_for_pid:
+ _atexit_regsitered_for_pid = _tls.pid
+ atexit.register(_trace_disable_atexit)
+ _tls.pid = os.getpid()
+ del _cur_events[:] # we forked, clear the event buffer!
+ tid = threading.current_thread().ident
+ if not tid:
+ tid = os.getpid()
+ _tls.tid = tid
+
+ _cur_events.append({"ph": ph,
+ "category": category,
+ "pid": _tls.pid,
+ "tid": _tls.tid,
+ "ts": ts,
+ "name": name,
+ "args": args or {}});
+
+def trace_begin(name, args=None):
+ add_trace_event("B", trace_time.Now(), "python", name, args)
+
+def trace_end(name, args=None):
+ add_trace_event("E", trace_time.Now(), "python", name, args)
+
+def _trace_disable_atexit():
+ trace_disable()
+
+def is_tracing_controllable():
+ global _control_allowed
+ return _control_allowed
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/log_io_test.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/log_io_test.py
new file mode 100644
index 0000000..99a0621
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/log_io_test.py
@@ -0,0 +1,50 @@
+#!/usr/bin/env python
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+import logging
+import os
+import sys
+import tempfile
+import unittest
+
+from log import *
+from parsed_trace_events import *
+
+
+class LogIOTest(unittest.TestCase):
+ def test_enable_with_file(self):
+ file = tempfile.NamedTemporaryFile()
+ trace_enable(open(file.name, 'w+'))
+ trace_disable()
+ e = ParsedTraceEvents(trace_filename = file.name)
+ file.close()
+ self.assertTrue(len(e) > 0)
+
+ def test_enable_with_filename(self):
+ file = tempfile.NamedTemporaryFile()
+ trace_enable(file.name)
+ trace_disable()
+ e = ParsedTraceEvents(trace_filename = file.name)
+ file.close()
+ self.assertTrue(len(e) > 0)
+
+ def test_enable_with_implicit_filename(self):
+ expected_filename = "%s.json" % sys.argv[0]
+ def do_work():
+ file = tempfile.NamedTemporaryFile()
+ trace_enable()
+ trace_disable()
+ e = ParsedTraceEvents(trace_filename = expected_filename)
+ file.close()
+ self.assertTrue(len(e) > 0)
+ try:
+ do_work()
+ finally:
+ if os.path.exists(expected_filename):
+ os.unlink(expected_filename)
+
+if __name__ == '__main__':
+ logging.getLogger().setLevel(logging.DEBUG)
+ unittest.main(verbosity=2)
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/meta_class.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/meta_class.py
new file mode 100644
index 0000000..4ede79b
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/meta_class.py
@@ -0,0 +1,16 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import types
+
+from py_trace_event.trace_event_impl import decorators
+
+
+class TracedMetaClass(type):
+ def __new__(cls, name, bases, attrs):
+ for attr_name, attr_value in attrs.iteritems():
+ if isinstance(attr_value, types.FunctionType):
+ attrs[attr_name] = decorators.traced(attr_value)
+
+ return super(TracedMetaClass, cls).__new__(cls, name, bases, attrs)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/multiprocessing_shim.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/multiprocessing_shim.py
new file mode 100644
index 0000000..9796bdf
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/multiprocessing_shim.py
@@ -0,0 +1,92 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+import multiprocessing
+import log
+import time
+
+
+_RealProcess = multiprocessing.Process
+__all__ = []
+
+
+class ProcessSubclass(_RealProcess):
+ def __init__(self, shim, *args, **kwards):
+ _RealProcess.__init__(self, *args, **kwards)
+ self._shim = shim
+
+ def run(self,*args,**kwargs):
+ log._disallow_tracing_control()
+ try:
+ r = _RealProcess.run(self, *args, **kwargs)
+ finally:
+ if log.trace_is_enabled():
+ log.trace_flush() # todo, reduce need for this...
+ return r
+
+class ProcessShim():
+ def __init__(self, group=None, target=None, name=None, args=(), kwargs={}):
+ self._proc = ProcessSubclass(self, group, target, name, args, kwargs)
+ # hint to testing code that the shimming worked
+ self._shimmed_by_trace_event = True
+
+ def run(self):
+ self._proc.run()
+
+ def start(self):
+ self._proc.start()
+
+ def terminate(self):
+ if log.trace_is_enabled():
+ # give the flush a chance to finish --> TODO: find some other way.
+ time.sleep(0.25)
+ self._proc.terminate()
+
+ def join(self, timeout=None):
+ self._proc.join( timeout)
+
+ def is_alive(self):
+ return self._proc.is_alive()
+
+ @property
+ def name(self):
+ return self._proc.name
+
+ @name.setter
+ def name(self, name):
+ self._proc.name = name
+
+ @property
+ def daemon(self):
+ return self._proc.daemon
+
+ @daemon.setter
+ def daemon(self, daemonic):
+ self._proc.daemon = daemonic
+
+ @property
+ def authkey(self):
+ return self._proc._authkey
+
+ @authkey.setter
+ def authkey(self, authkey):
+ self._proc.authkey = AuthenticationString(authkey)
+
+ @property
+ def exitcode(self):
+ return self._proc.exitcode
+
+ @property
+ def ident(self):
+ return self._proc.ident
+
+ @property
+ def pid(self):
+ return self._proc.pid
+
+ def __repr__(self):
+ return self._proc.__repr__()
+
+# Monkeypatch in our process replacement.
+if multiprocessing.Process != ProcessShim:
+ multiprocessing.Process = ProcessShim
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/parsed_trace_events.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/parsed_trace_events.py
new file mode 100644
index 0000000..fdc7514
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/parsed_trace_events.py
@@ -0,0 +1,98 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+import math
+import json
+
+
+class ParsedTraceEvents(object):
+ def __init__(self, events = None, trace_filename = None):
+ """
+ Utility class for filtering and manipulating trace data.
+
+ events -- An iterable object containing trace events
+ trace_filename -- A file object that contains a complete trace.
+
+ """
+ if trace_filename and events:
+ raise Exception("Provide either a trace file or event list")
+ if not trace_filename and events == None:
+ raise Exception("Provide either a trace file or event list")
+
+ if trace_filename:
+ f = open(trace_filename, 'r')
+ t = f.read()
+ f.close()
+
+ # If the event data begins with a [, then we know it should end with a ].
+ # The reason we check for this is because some tracing implementations
+ # cannot guarantee that a ']' gets written to the trace file. So, we are
+ # forgiving and if this is obviously the case, we fix it up before
+ # throwing the string at JSON.parse.
+ if t[0] == '[':
+ n = len(t);
+ if t[n - 1] != ']' and t[n - 1] != '\n':
+ t = t + ']'
+ elif t[n - 2] != ']' and t[n - 1] == '\n':
+ t = t + ']'
+ elif t[n - 3] != ']' and t[n - 2] == '\r' and t[n - 1] == '\n':
+ t = t + ']'
+
+ try:
+ events = json.loads(t)
+ except ValueError:
+ raise Exception("Corrupt trace, did not parse. Value: %s" % t)
+
+ if 'traceEvents' in events:
+ events = events['traceEvents']
+
+ if not hasattr(events, '__iter__'):
+ raise Exception, 'events must be iteraable.'
+ self.events = events
+ self.pids = None
+ self.tids = None
+
+ def __len__(self):
+ return len(self.events)
+
+ def __getitem__(self, i):
+ return self.events[i]
+
+ def __setitem__(self, i, v):
+ self.events[i] = v
+
+ def __repr__(self):
+ return "[%s]" % ",\n ".join([repr(e) for e in self.events])
+
+ def findProcessIds(self):
+ if self.pids:
+ return self.pids
+ pids = set()
+ for e in self.events:
+ if "pid" in e and e["pid"]:
+ pids.add(e["pid"])
+ self.pids = list(pids)
+ return self.pids
+
+ def findThreadIds(self):
+ if self.tids:
+ return self.tids
+ tids = set()
+ for e in self.events:
+ if "tid" in e and e["tid"]:
+ tids.add(e["tid"])
+ self.tids = list(tids)
+ return self.tids
+
+ def findEventsOnProcess(self, pid):
+ return ParsedTraceEvents([e for e in self.events if e["pid"] == pid])
+
+ def findEventsOnThread(self, tid):
+ return ParsedTraceEvents(
+ [e for e in self.events if e["ph"] != "M" and e["tid"] == tid])
+
+ def findByPhase(self, ph):
+ return ParsedTraceEvents([e for e in self.events if e["ph"] == ph])
+
+ def findByName(self, n):
+ return ParsedTraceEvents([e for e in self.events if e["name"] == n])
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/trace_test.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/trace_test.py
new file mode 100644
index 0000000..7047e0e
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_impl/trace_test.py
@@ -0,0 +1,48 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+import tempfile
+import unittest
+
+#from .log import *
+#from .parsed_trace_events import *
+
+from log import *
+from parsed_trace_events import *
+
+class TraceTest(unittest.TestCase):
+ def __init__(self, *args):
+ """
+ Infrastructure for running tests of the tracing system.
+
+ Does not actually run any tests. Look at subclasses for those.
+ """
+ unittest.TestCase.__init__(self, *args)
+ self._file = None
+
+ def go(self, cb):
+ """
+ Enables tracing, runs the provided callback, and if successful, returns a
+ TraceEvents object with the results.
+ """
+ self._file = tempfile.NamedTemporaryFile()
+ trace_enable(open(self._file.name, 'a+'))
+
+ try:
+ cb()
+ finally:
+ trace_disable()
+ e = ParsedTraceEvents(trace_filename = self._file.name)
+ self._file.close()
+ self._file = None
+ return e
+
+ @property
+ def trace_filename(self):
+ return self._file.name
+
+ def tearDown(self):
+ if trace_is_enabled():
+ trace_disable()
+ if self._file:
+ self._file.close()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_unittest.py
new file mode 100644
index 0000000..f88ef95
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_event_unittest.py
@@ -0,0 +1,423 @@
+#!/usr/bin/env python
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+import contextlib
+import json
+import logging
+import math
+import multiprocessing
+import os
+import tempfile
+import time
+import unittest
+
+from py_trace_event import trace_event
+from py_trace_event import trace_time
+from py_trace_event.trace_event_impl import log
+
+
+class TraceEventTests(unittest.TestCase):
+
+ def setUp(self):
+ tf = tempfile.NamedTemporaryFile(delete=False)
+ self._log_path = tf.name
+ tf.close()
+
+ def tearDown(self):
+ if os.path.exists(self._log_path):
+ os.remove(self._log_path)
+
+ @contextlib.contextmanager
+ def _test_trace(self, disable=True):
+ try:
+ trace_event.trace_enable(self._log_path)
+ yield
+ finally:
+ if disable:
+ trace_event.trace_disable()
+
+ def testNoImpl(self):
+ orig_impl = trace_event.trace_event_impl
+ try:
+ trace_event.trace_event_impl = None
+ self.assertFalse(trace_event.trace_can_enable())
+ finally:
+ trace_event.trace_event_impl = orig_impl
+
+ def testImpl(self):
+ self.assertTrue(trace_event.trace_can_enable())
+
+ def testIsEnabledFalse(self):
+ self.assertFalse(trace_event.trace_is_enabled())
+
+ def testIsEnabledTrue(self):
+ with self._test_trace():
+ self.assertTrue(trace_event.trace_is_enabled())
+
+ def testEnable(self):
+ with self._test_trace():
+ with open(self._log_path, 'r') as f:
+ log_output = json.loads(f.read() + ']')
+ self.assertEquals(len(log_output), 1)
+ self.assertTrue(trace_event.trace_is_enabled())
+ log_output = log_output.pop()
+ self.assertEquals(log_output['category'], 'process_argv')
+ self.assertEquals(log_output['name'], 'process_argv')
+ self.assertTrue(log_output['args']['argv'])
+ self.assertEquals(log_output['ph'], 'M')
+
+ def testDoubleEnable(self):
+ try:
+ with self._test_trace():
+ with self._test_trace():
+ pass
+ except log.TraceException:
+ return
+ assert False
+
+ def testDisable(self):
+ with self._test_trace(disable=False):
+ with open(self._log_path, 'r') as f:
+ self.assertTrue(trace_event.trace_is_enabled())
+ trace_event.trace_disable()
+ self.assertEquals(len(json.loads(f.read() + ']')), 1)
+ self.assertFalse(trace_event.trace_is_enabled())
+
+ def testDoubleDisable(self):
+ with self._test_trace():
+ pass
+ trace_event.trace_disable()
+
+ def testFlushChanges(self):
+ with self._test_trace():
+ with open(self._log_path, 'r') as f:
+ trace_event.clock_sync('1')
+ self.assertEquals(len(json.loads(f.read() + ']')), 1)
+ f.seek(0)
+ trace_event.trace_flush()
+ self.assertEquals(len(json.loads(f.read() + ']')), 2)
+
+ def testFlushNoChanges(self):
+ with self._test_trace():
+ with open(self._log_path, 'r') as f:
+ self.assertEquals(len(json.loads(f.read() + ']')),1)
+ f.seek(0)
+ trace_event.trace_flush()
+ self.assertEquals(len(json.loads(f.read() + ']')), 1)
+
+ def testDoubleFlush(self):
+ with self._test_trace():
+ with open(self._log_path, 'r') as f:
+ trace_event.clock_sync('1')
+ self.assertEquals(len(json.loads(f.read() + ']')), 1)
+ f.seek(0)
+ trace_event.trace_flush()
+ trace_event.trace_flush()
+ self.assertEquals(len(json.loads(f.read() + ']')), 2)
+
+ def testTraceBegin(self):
+ with self._test_trace():
+ with open(self._log_path, 'r') as f:
+ trace_event.trace_begin('test_event', this='that')
+ trace_event.trace_flush()
+ log_output = json.loads(f.read() + ']')
+ self.assertEquals(len(log_output), 2)
+ current_entry = log_output.pop(0)
+ self.assertEquals(current_entry['category'], 'process_argv')
+ self.assertEquals(current_entry['name'], 'process_argv')
+ self.assertTrue( current_entry['args']['argv'])
+ self.assertEquals( current_entry['ph'], 'M')
+ current_entry = log_output.pop(0)
+ self.assertEquals(current_entry['category'], 'python')
+ self.assertEquals(current_entry['name'], 'test_event')
+ self.assertEquals(current_entry['args']['this'], '\'that\'')
+ self.assertEquals(current_entry['ph'], 'B')
+
+ def testTraceEnd(self):
+ with self._test_trace():
+ with open(self._log_path, 'r') as f:
+ trace_event.trace_end('test_event')
+ trace_event.trace_flush()
+ log_output = json.loads(f.read() + ']')
+ self.assertEquals(len(log_output), 2)
+ current_entry = log_output.pop(0)
+ self.assertEquals(current_entry['category'], 'process_argv')
+ self.assertEquals(current_entry['name'], 'process_argv')
+ self.assertTrue(current_entry['args']['argv'])
+ self.assertEquals(current_entry['ph'], 'M')
+ current_entry = log_output.pop(0)
+ self.assertEquals(current_entry['category'], 'python')
+ self.assertEquals(current_entry['name'], 'test_event')
+ self.assertEquals(current_entry['args'], {})
+ self.assertEquals(current_entry['ph'], 'E')
+
+ def testTrace(self):
+ with self._test_trace():
+ with trace_event.trace('test_event', this='that'):
+ pass
+ trace_event.trace_flush()
+ with open(self._log_path, 'r') as f:
+ log_output = json.loads(f.read() + ']')
+ self.assertEquals(len(log_output), 3)
+ current_entry = log_output.pop(0)
+ self.assertEquals(current_entry['category'], 'process_argv')
+ self.assertEquals(current_entry['name'], 'process_argv')
+ self.assertTrue(current_entry['args']['argv'])
+ self.assertEquals(current_entry['ph'], 'M')
+ current_entry = log_output.pop(0)
+ self.assertEquals(current_entry['category'], 'python')
+ self.assertEquals(current_entry['name'], 'test_event')
+ self.assertEquals(current_entry['args']['this'], '\'that\'')
+ self.assertEquals(current_entry['ph'], 'B')
+ current_entry = log_output.pop(0)
+ self.assertEquals(current_entry['category'], 'python')
+ self.assertEquals(current_entry['name'], 'test_event')
+ self.assertEquals(current_entry['args'], {})
+ self.assertEquals(current_entry['ph'], 'E')
+
+ def testTracedDecorator(self):
+ @trace_event.traced("this")
+ def test_decorator(this="that"):
+ pass
+
+ with self._test_trace():
+ test_decorator()
+ trace_event.trace_flush()
+ with open(self._log_path, 'r') as f:
+ log_output = json.loads(f.read() + ']')
+ self.assertEquals(len(log_output), 3)
+ current_entry = log_output.pop(0)
+ self.assertEquals(current_entry['category'], 'process_argv')
+ self.assertEquals(current_entry['name'], 'process_argv')
+ self.assertTrue(current_entry['args']['argv'])
+ self.assertEquals(current_entry['ph'], 'M')
+ current_entry = log_output.pop(0)
+ self.assertEquals(current_entry['category'], 'python')
+ self.assertEquals(current_entry['name'], '__main__.test_decorator')
+ self.assertEquals(current_entry['args']['this'], '\'that\'')
+ self.assertEquals(current_entry['ph'], 'B')
+ current_entry = log_output.pop(0)
+ self.assertEquals(current_entry['category'], 'python')
+ self.assertEquals(current_entry['name'], '__main__.test_decorator')
+ self.assertEquals(current_entry['args'], {})
+ self.assertEquals(current_entry['ph'], 'E')
+
+ def testClockSyncWithTs(self):
+ with self._test_trace():
+ with open(self._log_path, 'r') as f:
+ trace_event.clock_sync('id', issue_ts=trace_time.Now())
+ trace_event.trace_flush()
+ log_output = json.loads(f.read() + ']')
+ self.assertEquals(len(log_output), 2)
+ current_entry = log_output.pop(0)
+ self.assertEquals(current_entry['category'], 'process_argv')
+ self.assertEquals(current_entry['name'], 'process_argv')
+ self.assertTrue(current_entry['args']['argv'])
+ self.assertEquals(current_entry['ph'], 'M')
+ current_entry = log_output.pop(0)
+ self.assertEquals(current_entry['category'], 'python')
+ self.assertEquals(current_entry['name'], 'clock_sync')
+ self.assertTrue(current_entry['args']['issue_ts'])
+ self.assertEquals(current_entry['ph'], 'c')
+
+ def testClockSyncWithoutTs(self):
+ with self._test_trace():
+ with open(self._log_path, 'r') as f:
+ trace_event.clock_sync('id')
+ trace_event.trace_flush()
+ log_output = json.loads(f.read() + ']')
+ self.assertEquals(len(log_output), 2)
+ current_entry = log_output.pop(0)
+ self.assertEquals(current_entry['category'], 'process_argv')
+ self.assertEquals(current_entry['name'], 'process_argv')
+ self.assertTrue(current_entry['args']['argv'])
+ self.assertEquals(current_entry['ph'], 'M')
+ current_entry = log_output.pop(0)
+ self.assertEquals(current_entry['category'], 'python')
+ self.assertEquals(current_entry['name'], 'clock_sync')
+ self.assertFalse(current_entry['args'].get('issue_ts'))
+ self.assertEquals(current_entry['ph'], 'c')
+
+ def testTime(self):
+ actual_diff = []
+ def func1():
+ trace_begin("func1")
+ start = time.time()
+ time.sleep(0.25)
+ end = time.time()
+ actual_diff.append(end-start) # Pass via array because of Python scoping
+ trace_end("func1")
+
+ with self._test_trace():
+ start_ts = time.time()
+ trace_event.trace_begin('test')
+ end_ts = time.time()
+ trace_event.trace_end('test')
+ trace_event.trace_flush()
+ with open(self._log_path, 'r') as f:
+ log_output = json.loads(f.read() + ']')
+ self.assertEquals(len(log_output), 3)
+ meta_data = log_output[0]
+ open_data = log_output[1]
+ close_data = log_output[2]
+ self.assertEquals(meta_data['category'], 'process_argv')
+ self.assertEquals(meta_data['name'], 'process_argv')
+ self.assertTrue(meta_data['args']['argv'])
+ self.assertEquals(meta_data['ph'], 'M')
+ self.assertEquals(open_data['category'], 'python')
+ self.assertEquals(open_data['name'], 'test')
+ self.assertEquals(open_data['ph'], 'B')
+ self.assertEquals(close_data['category'], 'python')
+ self.assertEquals(close_data['name'], 'test')
+ self.assertEquals(close_data['ph'], 'E')
+ event_time_diff = close_data['ts'] - open_data['ts']
+ recorded_time_diff = (end_ts - start_ts) * 1000000
+ self.assertLess(math.fabs(event_time_diff - recorded_time_diff), 1000)
+
+ def testNestedCalls(self):
+ with self._test_trace():
+ trace_event.trace_begin('one')
+ trace_event.trace_begin('two')
+ trace_event.trace_end('two')
+ trace_event.trace_end('one')
+ trace_event.trace_flush()
+ with open(self._log_path, 'r') as f:
+ log_output = json.loads(f.read() + ']')
+ self.assertEquals(len(log_output), 5)
+ meta_data = log_output[0]
+ one_open = log_output[1]
+ two_open = log_output[2]
+ two_close = log_output[3]
+ one_close = log_output[4]
+ self.assertEquals(meta_data['category'], 'process_argv')
+ self.assertEquals(meta_data['name'], 'process_argv')
+ self.assertTrue(meta_data['args']['argv'])
+ self.assertEquals(meta_data['ph'], 'M')
+
+ self.assertEquals(one_open['category'], 'python')
+ self.assertEquals(one_open['name'], 'one')
+ self.assertEquals(one_open['ph'], 'B')
+ self.assertEquals(one_close['category'], 'python')
+ self.assertEquals(one_close['name'], 'one')
+ self.assertEquals(one_close['ph'], 'E')
+
+ self.assertEquals(two_open['category'], 'python')
+ self.assertEquals(two_open['name'], 'two')
+ self.assertEquals(two_open['ph'], 'B')
+ self.assertEquals(two_close['category'], 'python')
+ self.assertEquals(two_close['name'], 'two')
+ self.assertEquals(two_close['ph'], 'E')
+
+ self.assertLessEqual(one_open['ts'], two_open['ts'])
+ self.assertGreaterEqual(one_close['ts'], two_close['ts'])
+
+ def testInterleavedCalls(self):
+ with self._test_trace():
+ trace_event.trace_begin('one')
+ trace_event.trace_begin('two')
+ trace_event.trace_end('one')
+ trace_event.trace_end('two')
+ trace_event.trace_flush()
+ with open(self._log_path, 'r') as f:
+ log_output = json.loads(f.read() + ']')
+ self.assertEquals(len(log_output), 5)
+ meta_data = log_output[0]
+ one_open = log_output[1]
+ two_open = log_output[2]
+ two_close = log_output[4]
+ one_close = log_output[3]
+ self.assertEquals(meta_data['category'], 'process_argv')
+ self.assertEquals(meta_data['name'], 'process_argv')
+ self.assertTrue(meta_data['args']['argv'])
+ self.assertEquals(meta_data['ph'], 'M')
+
+ self.assertEquals(one_open['category'], 'python')
+ self.assertEquals(one_open['name'], 'one')
+ self.assertEquals(one_open['ph'], 'B')
+ self.assertEquals(one_close['category'], 'python')
+ self.assertEquals(one_close['name'], 'one')
+ self.assertEquals(one_close['ph'], 'E')
+
+ self.assertEquals(two_open['category'], 'python')
+ self.assertEquals(two_open['name'], 'two')
+ self.assertEquals(two_open['ph'], 'B')
+ self.assertEquals(two_close['category'], 'python')
+ self.assertEquals(two_close['name'], 'two')
+ self.assertEquals(two_close['ph'], 'E')
+
+ self.assertLessEqual(one_open['ts'], two_open['ts'])
+ self.assertLessEqual(one_close['ts'], two_close['ts'])
+
+ def testMultiprocess(self):
+ def child_function():
+ with trace_event.trace('child_event'):
+ pass
+
+ with self._test_trace():
+ trace_event.trace_begin('parent_event')
+ trace_event.trace_flush()
+ p = multiprocessing.Process(target=child_function)
+ p.start()
+ self.assertTrue(hasattr(p, "_shimmed_by_trace_event"))
+ p.join()
+ trace_event.trace_end('parent_event')
+ trace_event.trace_flush()
+ with open(self._log_path, 'r') as f:
+ log_output = json.loads(f.read() + ']')
+ self.assertEquals(len(log_output), 5)
+ meta_data = log_output[0]
+ parent_open = log_output[1]
+ child_open = log_output[2]
+ child_close = log_output[3]
+ parent_close = log_output[4]
+ self.assertEquals(meta_data['category'], 'process_argv')
+ self.assertEquals(meta_data['name'], 'process_argv')
+ self.assertTrue(meta_data['args']['argv'])
+ self.assertEquals(meta_data['ph'], 'M')
+
+ self.assertEquals(parent_open['category'], 'python')
+ self.assertEquals(parent_open['name'], 'parent_event')
+ self.assertEquals(parent_open['ph'], 'B')
+
+ self.assertEquals(child_open['category'], 'python')
+ self.assertEquals(child_open['name'], 'child_event')
+ self.assertEquals(child_open['ph'], 'B')
+
+ self.assertEquals(child_close['category'], 'python')
+ self.assertEquals(child_close['name'], 'child_event')
+ self.assertEquals(child_close['ph'], 'E')
+
+ self.assertEquals(parent_close['category'], 'python')
+ self.assertEquals(parent_close['name'], 'parent_event')
+ self.assertEquals(parent_close['ph'], 'E')
+
+ def testMultiprocessExceptionInChild(self):
+ def bad_child():
+ trace_event.trace_disable()
+
+ with self._test_trace():
+ p = multiprocessing.Pool(1)
+ trace_event.trace_begin('parent')
+ self.assertRaises(Exception, lambda: p.apply(bad_child, ()))
+ p.close()
+ p.terminate()
+ p.join()
+ trace_event.trace_end('parent')
+ trace_event.trace_flush()
+ with open(self._log_path, 'r') as f:
+ log_output = json.loads(f.read() + ']')
+ self.assertEquals(len(log_output), 3)
+ meta_data = log_output[0]
+ parent_open = log_output[1]
+ parent_close = log_output[2]
+ self.assertEquals(parent_open['category'], 'python')
+ self.assertEquals(parent_open['name'], 'parent')
+ self.assertEquals(parent_open['ph'], 'B')
+ self.assertEquals(parent_close['category'], 'python')
+ self.assertEquals(parent_close['name'], 'parent')
+ self.assertEquals(parent_close['ph'], 'E')
+
+if __name__ == '__main__':
+ logging.getLogger().setLevel(logging.DEBUG)
+ unittest.main(verbosity=2)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_time.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_time.py
new file mode 100644
index 0000000..c5e3fe1
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_time.py
@@ -0,0 +1,234 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import ctypes
+import ctypes.util
+import logging
+import os
+import platform
+import sys
+import time
+import threading
+
+
+GET_TICK_COUNT_LAST_NOW = 0
+# If GET_TICK_COUNTER_LAST_NOW is less than the current time, the clock has
+# rolled over, and this needs to be accounted for.
+GET_TICK_COUNT_WRAPAROUNDS = 0
+# The current detected platform
+_CLOCK = None
+_NOW_FUNCTION = None
+# Mapping of supported platforms and what is returned by sys.platform.
+_PLATFORMS = {
+ 'mac': 'darwin',
+ 'linux': 'linux',
+ 'windows': 'win32',
+ 'cygwin': 'cygwin',
+ 'freebsd': 'freebsd',
+ 'sunos': 'sunos5',
+ 'bsd': 'bsd'
+}
+# Mapping of what to pass get_clocktime based on platform.
+_CLOCK_MONOTONIC = {
+ 'linux': 1,
+ 'freebsd': 4,
+ 'bsd': 3,
+ 'sunos5': 4
+}
+
+_LINUX_CLOCK = 'LINUX_CLOCK_MONOTONIC'
+_MAC_CLOCK = 'MAC_MACH_ABSOLUTE_TIME'
+_WIN_HIRES = 'WIN_QPC'
+_WIN_LORES = 'WIN_ROLLOVER_PROTECTED_TIME_GET_TIME'
+
+def InitializeMacNowFunction(plat):
+ """Sets a monotonic clock for the Mac platform.
+
+ Args:
+ plat: Platform that is being run on. Unused in GetMacNowFunction. Passed
+ for consistency between initilaizers.
+ """
+ del plat # Unused
+ global _CLOCK # pylint: disable=global-statement
+ global _NOW_FUNCTION # pylint: disable=global-statement
+ _CLOCK = _MAC_CLOCK
+ libc = ctypes.CDLL('/usr/lib/libc.dylib', use_errno=True)
+ class MachTimebaseInfoData(ctypes.Structure):
+ """System timebase info. Defined in <mach/mach_time.h>."""
+ _fields_ = (('numer', ctypes.c_uint32),
+ ('denom', ctypes.c_uint32))
+
+ mach_absolute_time = libc.mach_absolute_time
+ mach_absolute_time.restype = ctypes.c_uint64
+
+ timebase = MachTimebaseInfoData()
+ libc.mach_timebase_info(ctypes.byref(timebase))
+ ticks_per_second = timebase.numer / timebase.denom * 1.0e9
+
+ def MacNowFunctionImpl():
+ return mach_absolute_time() / ticks_per_second
+ _NOW_FUNCTION = MacNowFunctionImpl
+
+
+def GetClockGetTimeClockNumber(plat):
+ for key in _CLOCK_MONOTONIC:
+ if plat.startswith(key):
+ return _CLOCK_MONOTONIC[key]
+ raise LookupError('Platform not in clock dicitonary')
+
+def InitializeLinuxNowFunction(plat):
+ """Sets a monotonic clock for linux platforms.
+
+ Args:
+ plat: Platform that is being run on.
+ """
+ global _CLOCK # pylint: disable=global-statement
+ global _NOW_FUNCTION # pylint: disable=global-statement
+ _CLOCK = _LINUX_CLOCK
+ clock_monotonic = GetClockGetTimeClockNumber(plat)
+ try:
+ # Attempt to find clock_gettime in the C library.
+ clock_gettime = ctypes.CDLL(ctypes.util.find_library('c'),
+ use_errno=True).clock_gettime
+ except AttributeError:
+ # If not able to find int in the C library, look in rt library.
+ clock_gettime = ctypes.CDLL(ctypes.util.find_library('rt'),
+ use_errno=True).clock_gettime
+
+ class Timespec(ctypes.Structure):
+ """Time specification, as described in clock_gettime(3)."""
+ _fields_ = (('tv_sec', ctypes.c_long),
+ ('tv_nsec', ctypes.c_long))
+
+ def LinuxNowFunctionImpl():
+ ts = Timespec()
+ if clock_gettime(clock_monotonic, ctypes.pointer(ts)):
+ errno = ctypes.get_errno()
+ raise OSError(errno, os.strerror(errno))
+ return ts.tv_sec + ts.tv_nsec / 1.0e9
+
+ _NOW_FUNCTION = LinuxNowFunctionImpl
+
+
+def IsQPCUsable():
+ """Determines if system can query the performance counter.
+ The performance counter is a high resolution timer on windows systems.
+ Some chipsets have unreliable performance counters, so this checks that one
+ of those chipsets is not present.
+
+ Returns:
+ True if QPC is useable, false otherwise.
+ """
+
+ # Sample output: 'Intel64 Family 6 Model 23 Stepping 6, GenuineIntel'
+ info = platform.processor()
+ if 'AuthenticAMD' in info and 'Family 15' in info:
+ return False
+ if not hasattr(ctypes, 'windll'):
+ return False
+ try: # If anything goes wrong during this, assume QPC isn't available.
+ frequency = ctypes.c_int64()
+ ctypes.windll.Kernel32.QueryPerformanceFrequency(
+ ctypes.byref(frequency))
+ if float(frequency.value) <= 0:
+ return False
+ except Exception: # pylint: disable=broad-except
+ logging.exception('Error when determining if QPC is usable.')
+ return False
+ return True
+
+
+def InitializeWinNowFunction(plat):
+ """Sets a monotonic clock for windows platforms.
+
+ Args:
+ plat: Platform that is being run on.
+ """
+ global _CLOCK # pylint: disable=global-statement
+ global _NOW_FUNCTION # pylint: disable=global-statement
+
+ if IsQPCUsable():
+ _CLOCK = _WIN_HIRES
+ qpc_return = ctypes.c_int64()
+ qpc_frequency = ctypes.c_int64()
+ ctypes.windll.Kernel32.QueryPerformanceFrequency(
+ ctypes.byref(qpc_frequency))
+ qpc_frequency = float(qpc_frequency.value)
+ qpc = ctypes.windll.Kernel32.QueryPerformanceCounter
+
+ def WinNowFunctionImpl():
+ qpc(ctypes.byref(qpc_return))
+ return qpc_return.value / qpc_frequency
+
+ else:
+ _CLOCK = _WIN_LORES
+ kernel32 = (ctypes.cdll.kernel32
+ if plat.startswith(_PLATFORMS['cygwin'])
+ else ctypes.windll.kernel32)
+ get_tick_count_64 = getattr(kernel32, 'GetTickCount64', None)
+
+ # Windows Vista or newer
+ if get_tick_count_64:
+ get_tick_count_64.restype = ctypes.c_ulonglong
+
+ def WinNowFunctionImpl():
+ return get_tick_count_64() / 1000.0
+
+ else: # Pre Vista.
+ get_tick_count = kernel32.GetTickCount
+ get_tick_count.restype = ctypes.c_uint32
+ get_tick_count_lock = threading.Lock()
+
+ def WinNowFunctionImpl():
+ global GET_TICK_COUNT_LAST_NOW # pylint: disable=global-statement
+ global GET_TICK_COUNT_WRAPAROUNDS # pylint: disable=global-statement
+ with get_tick_count_lock:
+ current_sample = get_tick_count()
+ if current_sample < GET_TICK_COUNT_LAST_NOW:
+ GET_TICK_COUNT_WRAPAROUNDS += 1
+ GET_TICK_COUNT_LAST_NOW = current_sample
+ final_ms = GET_TICK_COUNT_WRAPAROUNDS << 32
+ final_ms += GET_TICK_COUNT_LAST_NOW
+ return final_ms / 1000.0
+
+ _NOW_FUNCTION = WinNowFunctionImpl
+
+
+def InitializeNowFunction(plat):
+ """Sets a monotonic clock for the current platform.
+
+ Args:
+ plat: Platform that is being run on.
+ """
+ if plat.startswith(_PLATFORMS['mac']):
+ InitializeMacNowFunction(plat)
+
+ elif (plat.startswith(_PLATFORMS['linux'])
+ or plat.startswith(_PLATFORMS['freebsd'])
+ or plat.startswith(_PLATFORMS['bsd'])
+ or plat.startswith(_PLATFORMS['sunos'])):
+ InitializeLinuxNowFunction(plat)
+
+ elif (plat.startswith(_PLATFORMS['windows'])
+ or plat.startswith(_PLATFORMS['cygwin'])):
+ InitializeWinNowFunction(plat)
+
+ else:
+ raise RuntimeError('%s is not a supported platform.' % plat)
+
+ global _NOW_FUNCTION
+ global _CLOCK
+ assert _NOW_FUNCTION, 'Now function not properly set during initialization.'
+ assert _CLOCK, 'Clock not properly set during initialization.'
+
+
+def Now():
+ return _NOW_FUNCTION() * 1e6 # convert from seconds to microseconds
+
+
+def GetClock():
+ return _CLOCK
+
+
+InitializeNowFunction(sys.platform)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_time_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_time_unittest.py
new file mode 100644
index 0000000..ab54bd6
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_trace_event/py_trace_event/trace_time_unittest.py
@@ -0,0 +1,123 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import contextlib
+import logging
+import platform
+import sys
+import unittest
+
+from py_trace_event import trace_time
+
+
+class TimerTest(unittest.TestCase):
+ # Helper methods.
+ @contextlib.contextmanager
+ def ReplacePlatformProcessorCall(self, f):
+ try:
+ old_proc = platform.processor
+ platform.processor = f
+ yield
+ finally:
+ platform.processor = old_proc
+
+ @contextlib.contextmanager
+ def ReplaceQPCCheck(self, f):
+ try:
+ old_qpc = trace_time.IsQPCUsable
+ trace_time.IsQPCUsable = f
+ yield
+ finally:
+ trace_time.IsQPCUsable = old_qpc
+
+ # Platform detection tests.
+ def testInitializeNowFunction_platformNotSupported(self):
+ with self.assertRaises(RuntimeError):
+ trace_time.InitializeNowFunction('invalid_platform')
+
+ def testInitializeNowFunction_windows(self):
+ if not (sys.platform.startswith(trace_time._PLATFORMS['windows'])
+ or sys.platform.startswith(trace_time._PLATFORMS['cygwin'])):
+ return True
+ trace_time.InitializeNowFunction(sys.platform)
+ self.assertTrue(trace_time.GetClock() == trace_time._WIN_HIRES
+ or trace_time.GetClock() == trace_time._WIN_LORES)
+
+ def testInitializeNowFunction_linux(self):
+ if not sys.platform.startswith(trace_time._PLATFORMS['linux']):
+ return True
+ trace_time.InitializeNowFunction(sys.platform)
+ self.assertEqual(trace_time.GetClock(), trace_time._LINUX_CLOCK)
+
+ def testInitializeNowFunction_mac(self):
+ if not sys.platform.startswith(trace_time._PLATFORMS['mac']):
+ return True
+ trace_time.InitializeNowFunction(sys.platform)
+ self.assertEqual(trace_time.GetClock(), trace_time._MAC_CLOCK)
+
+ # Windows Tests
+ def testIsQPCUsable_buggyAthlonProcReturnsFalse(self):
+ if not (sys.platform.startswith(trace_time._PLATFORMS['windows'])
+ or sys.platform.startswith(trace_time._PLATFORMS['cygwin'])):
+ return True
+
+ def BuggyAthlonProc():
+ return 'AMD64 Family 15 Model 23 Stepping 6, AuthenticAMD'
+
+ with self.ReplacePlatformProcessorCall(BuggyAthlonProc):
+ self.assertFalse(trace_time.IsQPCUsable())
+
+ def testIsQPCUsable_returnsTrueOnWindows(self):
+ if not (sys.platform.startswith(trace_time._PLATFORMS['windows'])
+ or sys.platform.startswith(trace_time._PLATFORMS['cygwin'])):
+ return True
+
+ def Proc():
+ return 'Intel64 Family 15 Model 23 Stepping 6, GenuineIntel'
+
+ with self.ReplacePlatformProcessorCall(Proc):
+ self.assertTrue(trace_time.IsQPCUsable())
+
+ def testGetWinNowFunction_QPC(self):
+ if not (sys.platform.startswith(trace_time._PLATFORMS['windows'])
+ or sys.platform.startswith(trace_time._PLATFORMS['cygwin'])):
+ return True
+ # Test requires QPC to be available on platform.
+ if not trace_time.IsQPCUsable():
+ return True
+ self.assertGreater(trace_time.monotonic(), 0)
+
+ # Works even if QPC would work.
+ def testGetWinNowFunction_GetTickCount(self):
+ if not (sys.platform.startswith(trace_time._PLATFORMS['windows'])
+ or sys.platform.startswith(trace_time._PLATFORMS['cygwin'])):
+ return True
+ with self.ReplaceQPCCheck(lambda: False):
+ self.assertGreater(trace_time.monotonic(), 0)
+
+ # Linux tests.
+ def testGetClockGetTimeClockNumber_linux(self):
+ self.assertEquals(trace_time.GetClockGetTimeClockNumber('linux'), 1)
+
+ def testGetClockGetTimeClockNumber_freebsd(self):
+ self.assertEquals(trace_time.GetClockGetTimeClockNumber('freebsd'), 4)
+
+ def testGetClockGetTimeClockNumber_bsd(self):
+ self.assertEquals(trace_time.GetClockGetTimeClockNumber('bsd'), 3)
+
+ def testGetClockGetTimeClockNumber_sunos(self):
+ self.assertEquals(trace_time.GetClockGetTimeClockNumber('sunos5'), 4)
+
+ # Smoke Test.
+ def testMonotonic(self):
+ time_one = trace_time.Now()
+ for _ in xrange(1000):
+ time_two = trace_time.Now()
+ self.assertLessEqual(time_one, time_two)
+ time_one = time_two
+
+
+if __name__ == '__main__':
+ logging.getLogger().setLevel(logging.DEBUG)
+ unittest.main(verbosity=2)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/PRESUBMIT.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/PRESUBMIT.py
new file mode 100644
index 0000000..c1d92fe
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/PRESUBMIT.py
@@ -0,0 +1,31 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+def CheckChangeOnUpload(input_api, output_api):
+ return _CommonChecks(input_api, output_api)
+
+
+def CheckChangeOnCommit(input_api, output_api):
+ return _CommonChecks(input_api, output_api)
+
+
+def _CommonChecks(input_api, output_api):
+ results = []
+ results += input_api.RunTests(input_api.canned_checks.GetPylint(
+ input_api, output_api, extra_paths_list=_GetPathsToPrepend(input_api),
+ pylintrc='../../pylintrc'))
+ return results
+
+
+def _GetPathsToPrepend(input_api):
+ project_dir = input_api.PresubmitLocalPath()
+ catapult_dir = input_api.os_path.join(project_dir, '..', '..')
+ return [
+ project_dir,
+ input_api.os_path.join(catapult_dir, 'dependency_manager'),
+ input_api.os_path.join(catapult_dir, 'devil'),
+ input_api.os_path.join(catapult_dir, 'third_party', 'mock'),
+ input_api.os_path.join(catapult_dir, 'third_party', 'pyfakefs'),
+ ]
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/__init__.py
new file mode 100644
index 0000000..3f26311
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/__init__.py
@@ -0,0 +1,140 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import functools
+import inspect
+import os
+import sys
+import time
+
+
+def GetCatapultDir():
+ return os.path.normpath(
+ os.path.join(os.path.dirname(__file__), '..', '..', '..'))
+
+
+def IsRunningOnCrosDevice():
+ """Returns True if we're on a ChromeOS device."""
+ lsb_release = '/etc/lsb-release'
+ if sys.platform.startswith('linux') and os.path.exists(lsb_release):
+ with open(lsb_release, 'r') as f:
+ res = f.read()
+ if res.count('CHROMEOS_RELEASE_NAME'):
+ return True
+ return False
+
+
+def _ExecutableExtensions():
+ # pathext is, e.g. '.com;.exe;.bat;.cmd'
+ exts = os.getenv('PATHEXT').split(';') #e.g. ['.com','.exe','.bat','.cmd']
+ return [x[1:].upper() for x in exts] #e.g. ['COM','EXE','BAT','CMD']
+
+
+def IsExecutable(path):
+ if os.path.isfile(path):
+ if hasattr(os, 'name') and os.name == 'nt':
+ return path.split('.')[-1].upper() in _ExecutableExtensions()
+ else:
+ return os.access(path, os.X_OK)
+ else:
+ return False
+
+
+def _AddDirToPythonPath(*path_parts):
+ path = os.path.abspath(os.path.join(*path_parts))
+ if os.path.isdir(path) and path not in sys.path:
+ # Some callsite that use telemetry assumes that sys.path[0] is the directory
+ # containing the script, so we add these extra paths to right after it.
+ sys.path.insert(1, path)
+
+_AddDirToPythonPath(os.path.join(GetCatapultDir(), 'devil'))
+_AddDirToPythonPath(os.path.join(GetCatapultDir(), 'dependency_manager'))
+_AddDirToPythonPath(os.path.join(GetCatapultDir(), 'third_party', 'mock'))
+# mox3 is needed for pyfakefs usage, but not for pylint.
+_AddDirToPythonPath(os.path.join(GetCatapultDir(), 'third_party', 'mox3'))
+_AddDirToPythonPath(
+ os.path.join(GetCatapultDir(), 'third_party', 'pyfakefs'))
+
+from devil.utils import timeout_retry
+from devil.utils import reraiser_thread
+
+
+# Decorator that adds timeout functionality to a function.
+def Timeout(default_timeout):
+ return lambda func: TimeoutDeco(func, default_timeout)
+
+# Note: Even though the "timeout" keyword argument is the only
+# keyword argument that will need to be given to the decorated function,
+# we still have to use the **kwargs syntax, because we have to use
+# the *args syntax here before (since the decorator decorates functions
+# with different numbers of positional arguments) and Python doesn't allow
+# a single named keyword argument after *args.
+# (e.g., 'def foo(*args, bar=42):' is a syntax error)
+
+def TimeoutDeco(func, default_timeout):
+ @functools.wraps(func)
+ def RunWithTimeout(*args, **kwargs):
+ if 'timeout' in kwargs:
+ timeout = kwargs['timeout']
+ else:
+ timeout = default_timeout
+ try:
+ return timeout_retry.Run(func, timeout, 0, args=args)
+ except reraiser_thread.TimeoutError:
+ print '%s timed out.' % func.__name__
+ return False
+ return RunWithTimeout
+
+
+MIN_POLL_INTERVAL_IN_SECONDS = 0.1
+MAX_POLL_INTERVAL_IN_SECONDS = 5
+OUTPUT_INTERVAL_IN_SECONDS = 300
+
+def WaitFor(condition, timeout):
+ """Waits for up to |timeout| secs for the function |condition| to return True.
+
+ Polling frequency is (elapsed_time / 10), with a min of .1s and max of 5s.
+
+ Returns:
+ Result of |condition| function (if present).
+ """
+ def GetConditionString():
+ if condition.__name__ == '<lambda>':
+ try:
+ return inspect.getsource(condition).strip()
+ except IOError:
+ pass
+ return condition.__name__
+
+ # Do an initial check to see if its true.
+ res = condition()
+ if res:
+ return res
+ start_time = time.time()
+ last_output_time = start_time
+ elapsed_time = time.time() - start_time
+ while elapsed_time < timeout:
+ res = condition()
+ if res:
+ return res
+ now = time.time()
+ elapsed_time = now - start_time
+ last_output_elapsed_time = now - last_output_time
+ if last_output_elapsed_time > OUTPUT_INTERVAL_IN_SECONDS:
+ last_output_time = time.time()
+ poll_interval = min(max(elapsed_time / 10., MIN_POLL_INTERVAL_IN_SECONDS),
+ MAX_POLL_INTERVAL_IN_SECONDS)
+ time.sleep(poll_interval)
+ raise TimeoutException('Timed out while waiting %ds for %s.' %
+ (timeout, GetConditionString()))
+
+class TimeoutException(Exception):
+ """The operation failed to complete because of a timeout.
+
+ It is possible that waiting for a longer period of time would result in a
+ successful operation.
+ """
+ pass
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/binary_manager.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/binary_manager.py
new file mode 100644
index 0000000..8af08cf
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/binary_manager.py
@@ -0,0 +1,61 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import logging
+
+import dependency_manager
+
+
+class BinaryManager(object):
+ """ This class is effectively a subclass of dependency_manager, but uses a
+ different number of arguments for FetchPath and LocalPath.
+ """
+
+ def __init__(self, config_files):
+ if not config_files or type(config_files) != list:
+ raise ValueError(
+ 'Must supply a list of config files to the BinaryManager')
+ configs = [dependency_manager.BaseConfig(config) for config in config_files]
+ self._dependency_manager = dependency_manager.DependencyManager(configs)
+
+ def FetchPathWithVersion(self, binary_name, os_name, arch, os_version=None):
+ """ Return a path to the executable for <binary_name>, or None if not found.
+
+ Will attempt to download from cloud storage if needed.
+ """
+ return self._WrapDependencyManagerFunction(
+ self._dependency_manager.FetchPathWithVersion, binary_name, os_name,
+ arch, os_version)
+
+ def FetchPath(self, binary_name, os_name, arch, os_version=None):
+ """ Return a path to the executable for <binary_name>, or None if not found.
+
+ Will attempt to download from cloud storage if needed.
+ """
+ return self._WrapDependencyManagerFunction(
+ self._dependency_manager.FetchPath, binary_name, os_name, arch,
+ os_version)
+
+ def LocalPath(self, binary_name, os_name, arch, os_version=None):
+ """ Return a local path to the given binary name, or None if not found.
+
+ Will not download from cloud_storage.
+ """
+ return self._WrapDependencyManagerFunction(
+ self._dependency_manager.LocalPath, binary_name, os_name, arch,
+ os_version)
+
+ def _WrapDependencyManagerFunction(
+ self, function, binary_name, os_name, arch, os_version):
+ platform = '%s_%s' % (os_name, arch)
+ if os_version:
+ try:
+ versioned_platform = '%s_%s_%s' % (os_name, os_version, arch)
+ return function(binary_name, versioned_platform)
+ except dependency_manager.NoPathFoundError:
+ logging.warning(
+ 'Cannot find path for %s on platform %s. Falling back to %s.',
+ binary_name, versioned_platform, platform)
+ return function(binary_name, platform)
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/binary_manager_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/binary_manager_unittest.py
new file mode 100644
index 0000000..ccf21ad
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/binary_manager_unittest.py
@@ -0,0 +1,214 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import json
+import os
+
+from pyfakefs import fake_filesystem_unittest
+from dependency_manager import exceptions
+
+from py_utils import binary_manager
+
+class BinaryManagerTest(fake_filesystem_unittest.TestCase):
+ # TODO(aiolos): disable cloud storage use during this test.
+
+ def setUp(self):
+ self.setUpPyfakefs()
+ # pylint: disable=bad-continuation
+ self.expected_dependencies = {
+ 'dep_1': {
+ 'cloud_storage_base_folder': 'dependencies/fake_config',
+ 'cloud_storage_bucket': 'chrome-tel',
+ 'file_info': {
+ 'linux_x86_64': {
+ 'cloud_storage_hash': '661ce936b3276f7ec3d687ab62be05b96d796f21',
+ 'download_path': 'bin/linux/x86_64/dep_1'
+ },
+ 'mac_x86_64': {
+ 'cloud_storage_hash': 'c7b1bfc6399dc683058e88dac1ef0f877edea74b',
+ 'download_path': 'bin/mac/x86_64/dep_1'
+ },
+ 'win_AMD64': {
+ 'cloud_storage_hash': 'ac4fee89a51662b9d920bce443c19b9b2929b198',
+ 'download_path': 'bin/win/AMD64/dep_1.exe'
+ },
+ 'win_x86': {
+ 'cloud_storage_hash': 'e246e183553ea26967d7b323ea269e3357b9c837',
+ 'download_path': 'bin/win/x86/dep_1.exe'
+ }
+ }
+ },
+ 'dep_2': {
+ 'cloud_storage_base_folder': 'dependencies/fake_config',
+ 'cloud_storage_bucket': 'chrome-tel',
+ 'file_info': {
+ 'linux_x86_64': {
+ 'cloud_storage_hash': '13a57efae9a680ac0f160b3567e02e81f4ac493c',
+ 'download_path': 'bin/linux/x86_64/dep_2',
+ 'local_paths': [
+ '../../example/location/linux/dep_2',
+ '../../example/location2/linux/dep_2'
+ ]
+ },
+ 'mac_x86_64': {
+ 'cloud_storage_hash': 'd10c0ddaa8586b20449e951216bee852fa0f8850',
+ 'download_path': 'bin/mac/x86_64/dep_2',
+ 'local_paths': [
+ '../../example/location/mac/dep_2',
+ '../../example/location2/mac/dep_2'
+ ]
+ },
+ 'win_AMD64': {
+ 'cloud_storage_hash': 'fd5b417f78c7f7d9192a98967058709ded1d399d',
+ 'download_path': 'bin/win/AMD64/dep_2.exe',
+ 'local_paths': [
+ '../../example/location/win64/dep_2',
+ '../../example/location2/win64/dep_2'
+ ]
+ },
+ 'win_x86': {
+ 'cloud_storage_hash': 'cf5c8fe920378ce30d057e76591d57f63fd31c1a',
+ 'download_path': 'bin/win/x86/dep_2.exe',
+ 'local_paths': [
+ '../../example/location/win32/dep_2',
+ '../../example/location2/win32/dep_2'
+ ]
+ },
+ 'android_k_x64': {
+ 'cloud_storage_hash': '09177be2fed00b44df0e777932828425440b23b3',
+ 'download_path': 'bin/android/x64/k/dep_2.apk',
+ 'local_paths': [
+ '../../example/location/android_x64/k/dep_2',
+ '../../example/location2/android_x64/k/dep_2'
+ ]
+ },
+ 'android_l_x64': {
+ 'cloud_storage_hash': '09177be2fed00b44df0e777932828425440b23b3',
+ 'download_path': 'bin/android/x64/l/dep_2.apk',
+ 'local_paths': [
+ '../../example/location/android_x64/l/dep_2',
+ '../../example/location2/android_x64/l/dep_2'
+ ]
+ },
+ 'android_k_x86': {
+ 'cloud_storage_hash': 'bcf02af039713a48b69b89bd7f0f9c81ed8183a4',
+ 'download_path': 'bin/android/x86/k/dep_2.apk',
+ 'local_paths': [
+ '../../example/location/android_x86/k/dep_2',
+ '../../example/location2/android_x86/k/dep_2'
+ ]
+ },
+ 'android_l_x86': {
+ 'cloud_storage_hash': '12a74cec071017ba11655b5740b8a58e2f52a219',
+ 'download_path': 'bin/android/x86/l/dep_2.apk',
+ 'local_paths': [
+ '../../example/location/android_x86/l/dep_2',
+ '../../example/location2/android_x86/l/dep_2'
+ ]
+ }
+ }
+ },
+ 'dep_3': {
+ 'file_info': {
+ 'linux_x86_64': {
+ 'local_paths': [
+ '../../example/location/linux/dep_3',
+ '../../example/location2/linux/dep_3'
+ ]
+ },
+ 'mac_x86_64': {
+ 'local_paths': [
+ '../../example/location/mac/dep_3',
+ '../../example/location2/mac/dep_3'
+ ]
+ },
+ 'win_AMD64': {
+ 'local_paths': [
+ '../../example/location/win64/dep_3',
+ '../../example/location2/win64/dep_3'
+ ]
+ },
+ 'win_x86': {
+ 'local_paths': [
+ '../../example/location/win32/dep_3',
+ '../../example/location2/win32/dep_3'
+ ]
+ }
+ }
+ }
+ }
+ # pylint: enable=bad-continuation
+ fake_config = {
+ 'config_type': 'BaseConfig',
+ 'dependencies': self.expected_dependencies
+ }
+
+ self.base_config = os.path.join(os.path.dirname(__file__),
+ 'example_config.json')
+ self.fs.CreateFile(self.base_config, contents=json.dumps(fake_config))
+ linux_file = os.path.join(
+ os.path.dirname(self.base_config),
+ os.path.join('..', '..', 'example', 'location2', 'linux', 'dep_2'))
+ android_file = os.path.join(
+ os.path.dirname(self.base_config),
+ '..', '..', 'example', 'location', 'android_x86', 'l', 'dep_2')
+ self.expected_dep2_linux_file = os.path.abspath(linux_file)
+ self.expected_dep2_android_file = os.path.abspath(android_file)
+ self.fs.CreateFile(self.expected_dep2_linux_file)
+ self.fs.CreateFile(self.expected_dep2_android_file)
+
+ def tearDown(self):
+ self.tearDownPyfakefs()
+
+ def testInitializationNoConfig(self):
+ with self.assertRaises(ValueError):
+ binary_manager.BinaryManager(None)
+
+ def testInitializationMissingConfig(self):
+ with self.assertRaises(ValueError):
+ binary_manager.BinaryManager(os.path.join('missing', 'path'))
+
+ def testInitializationWithConfig(self):
+ with self.assertRaises(ValueError):
+ manager = binary_manager.BinaryManager(self.base_config)
+ manager = binary_manager.BinaryManager([self.base_config])
+ self.assertItemsEqual(self.expected_dependencies,
+ manager._dependency_manager._lookup_dict)
+
+ def testSuccessfulFetchPathNoOsVersion(self):
+ manager = binary_manager.BinaryManager([self.base_config])
+ found_path = manager.FetchPath('dep_2', 'linux', 'x86_64')
+ self.assertEqual(self.expected_dep2_linux_file, found_path)
+
+ def testSuccessfulFetchPathOsVersion(self):
+ manager = binary_manager.BinaryManager([self.base_config])
+ found_path = manager.FetchPath('dep_2', 'android', 'x86', 'l')
+ self.assertEqual(self.expected_dep2_android_file, found_path)
+
+ def testSuccessfulFetchPathFallbackToNoOsVersion(self):
+ manager = binary_manager.BinaryManager([self.base_config])
+ found_path = manager.FetchPath('dep_2', 'linux', 'x86_64', 'fake_version')
+ self.assertEqual(self.expected_dep2_linux_file, found_path)
+
+ def testFailedFetchPathMissingDep(self):
+ manager = binary_manager.BinaryManager([self.base_config])
+ with self.assertRaises(exceptions.NoPathFoundError):
+ manager.FetchPath('missing_dep', 'linux', 'x86_64')
+ with self.assertRaises(exceptions.NoPathFoundError):
+ manager.FetchPath('missing_dep', 'android', 'x86', 'l')
+ with self.assertRaises(exceptions.NoPathFoundError):
+ manager.FetchPath('dep_1', 'linux', 'bad_arch')
+ with self.assertRaises(exceptions.NoPathFoundError):
+ manager.FetchPath('dep_1', 'bad_os', 'x86')
+
+ def testSuccessfulLocalPathNoOsVersion(self):
+ manager = binary_manager.BinaryManager([self.base_config])
+ found_path = manager.LocalPath('dep_2', 'linux', 'x86_64')
+ self.assertEqual(self.expected_dep2_linux_file, found_path)
+
+ def testSuccessfulLocalPathOsVersion(self):
+ manager = binary_manager.BinaryManager([self.base_config])
+ found_path = manager.LocalPath('dep_2', 'android', 'x86', 'l')
+ self.assertEqual(self.expected_dep2_android_file, found_path)
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/chrome_binaries.json b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/chrome_binaries.json
new file mode 100644
index 0000000..bb0b2e1
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/chrome_binaries.json
@@ -0,0 +1,86 @@
+{
+ "config_type": "BaseConfig",
+ "dependencies": {
+ "chrome_canary": {
+ "cloud_storage_base_folder": "binary_dependencies",
+ "cloud_storage_bucket": "chrome-telemetry",
+ "file_info": {
+ "mac_x86_64": {
+ "cloud_storage_hash": "ab33866d00fb0c9d6543c20a21da5f047ba6a7b6",
+ "download_path": "bin/reference_builds/chrome-mac64.zip",
+ "path_within_archive": "chrome-mac/Google Chrome.app/Contents/MacOS/Google Chrome",
+ "version_in_cs": "58.0.3004.0"
+ },
+ "win_AMD64": {
+ "cloud_storage_hash": "2348f9bcf421fa4739493a12b4c8e3210a528d84",
+ "download_path": "bin\\reference_build\\chrome-win64-pgo.zip",
+ "path_within_archive": "chrome-win64-pgo\\chrome.exe",
+ "version_in_cs": "58.0.3004.0"
+ },
+ "win_x86": {
+ "cloud_storage_hash": "421c59cfbc02bee9b74f68869af3a930b5988e71",
+ "download_path": "bin\\reference_build\\chrome-win32-pgo.zip",
+ "path_within_archive": "chrome-win32-pgo\\chrome.exe",
+ "version_in_cs": "58.0.3004.0"
+ }
+ }
+ },
+ "chrome_dev": {
+ "cloud_storage_base_folder": "binary_dependencies",
+ "cloud_storage_bucket": "chrome-telemetry",
+ "file_info": {
+ "linux_x86_64": {
+ "cloud_storage_hash": "d61c3c5a81dc5e0a896589ab3d72a253e4b9cc90",
+ "download_path": "bin/reference_build/chrome-linux64.zip",
+ "path_within_archive": "chrome-precise64/chrome",
+ "version_in_cs": "58.0.3000.4"
+ }
+ }
+ },
+ "chrome_stable": {
+ "cloud_storage_base_folder": "binary_dependencies",
+ "cloud_storage_bucket": "chrome-telemetry",
+ "file_info": {
+ "android_k_armeabi-v7a": {
+ "cloud_storage_hash": "2f0629a395974793c3a25e6c2dc971487742bd49",
+ "download_path": "bin/reference_build/android_k_armeabi-v7a/ChromeStable.apk",
+ "version_in_cs": "56.0.2924.87"
+ },
+ "android_l_arm64-v8a": {
+ "cloud_storage_hash": "03306b04e49ed3b0c4c29da84a128d76659624f2",
+ "download_path": "bin/reference_build/android_l_arm64-v8a/ChromeStable.apk",
+ "version_in_cs": "56.0.2924.87"
+ },
+ "android_l_armeabi-v7a": {
+ "cloud_storage_hash": "2f0629a395974793c3a25e6c2dc971487742bd49",
+ "download_path": "bin/reference_build/android_l_armeabi-v7a/ChromeStable.apk",
+ "version_in_cs": "56.0.2924.87"
+ },
+ "linux_x86_64": {
+ "cloud_storage_hash": "07dd594d89c8350978ed368b55204d7ee3641001",
+ "download_path": "bin/reference_build/chrome-linux64.zip",
+ "path_within_archive": "chrome-precise64/chrome",
+ "version_in_cs": "56.0.2924.87"
+ },
+ "mac_x86_64": {
+ "cloud_storage_hash": "e2e1ac31913ab6976084375540e17bbaa2401820",
+ "download_path": "bin/reference_builds/chrome-mac64.zip",
+ "path_within_archive": "chrome-mac/Google Chrome.app/Contents/MacOS/Google Chrome",
+ "version_in_cs": "56.0.2924.87"
+ },
+ "win_AMD64": {
+ "cloud_storage_hash": "d6624303bceff81503db78c4ad17d1ebd1af7b68",
+ "download_path": "bin\\reference_build\\chrome-win64-pgo.zip",
+ "path_within_archive": "chrome-win64-pgo\\chrome.exe",
+ "version_in_cs": "56.0.2924.87"
+ },
+ "win_x86": {
+ "cloud_storage_hash": "2b89d4571eeac4d80d4a1fac7c92db3f7e0bd565",
+ "download_path": "bin\\reference_build\\chrome-win32-pgo.zip",
+ "path_within_archive": "chrome-win32-pgo\\chrome.exe",
+ "version_in_cs": "56.0.2924.87"
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/cloud_storage.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/cloud_storage.py
new file mode 100644
index 0000000..7bc9a19
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/cloud_storage.py
@@ -0,0 +1,461 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Wrappers for gsutil, for basic interaction with Google Cloud Storage."""
+
+import collections
+import contextlib
+import hashlib
+import logging
+import os
+import shutil
+import stat
+import subprocess
+import re
+import sys
+import tempfile
+
+import py_utils
+from py_utils import lock
+
+# Do a no-op import here so that cloud_storage_global_lock dep is picked up
+# by https://cs.chromium.org/chromium/src/build/android/test_runner.pydeps.
+# TODO(nedn, jbudorick): figure out a way to get rid of this ugly hack.
+from py_utils import cloud_storage_global_lock # pylint: disable=unused-import
+
+logger = logging.getLogger(__name__) # pylint: disable=invalid-name
+
+
+PUBLIC_BUCKET = 'chromium-telemetry'
+PARTNER_BUCKET = 'chrome-partner-telemetry'
+INTERNAL_BUCKET = 'chrome-telemetry'
+TELEMETRY_OUTPUT = 'chrome-telemetry-output'
+
+# Uses ordered dict to make sure that bucket's key-value items are ordered from
+# the most open to the most restrictive.
+BUCKET_ALIASES = collections.OrderedDict((
+ ('public', PUBLIC_BUCKET),
+ ('partner', PARTNER_BUCKET),
+ ('internal', INTERNAL_BUCKET),
+ ('output', TELEMETRY_OUTPUT),
+))
+
+BUCKET_ALIAS_NAMES = BUCKET_ALIASES.keys()
+
+
+_GSUTIL_PATH = os.path.join(py_utils.GetCatapultDir(), 'third_party', 'gsutil',
+ 'gsutil')
+
+# TODO(tbarzic): A workaround for http://crbug.com/386416 and
+# http://crbug.com/359293. See |_RunCommand|.
+_CROS_GSUTIL_HOME_WAR = '/home/chromeos-test/'
+
+
+# If Environment variables has DISABLE_CLOUD_STORAGE_IO set to '1', any method
+# calls that invoke cloud storage network io will throw exceptions.
+DISABLE_CLOUD_STORAGE_IO = 'DISABLE_CLOUD_STORAGE_IO'
+
+# The maximum number of seconds to wait to acquire the pseudo lock for a cloud
+# storage file before raising an exception.
+LOCK_ACQUISITION_TIMEOUT = 10
+
+
+class CloudStorageError(Exception):
+
+ @staticmethod
+ def _GetConfigInstructions():
+ command = _GSUTIL_PATH
+ if py_utils.IsRunningOnCrosDevice():
+ command = 'HOME=%s %s' % (_CROS_GSUTIL_HOME_WAR, _GSUTIL_PATH)
+ return ('To configure your credentials:\n'
+ ' 1. Run "%s config" and follow its instructions.\n'
+ ' 2. If you have a @google.com account, use that account.\n'
+ ' 3. For the project-id, just enter 0.' % command)
+
+
+class PermissionError(CloudStorageError):
+
+ def __init__(self):
+ super(PermissionError, self).__init__(
+ 'Attempted to access a file from Cloud Storage but you don\'t '
+ 'have permission. ' + self._GetConfigInstructions())
+
+
+class CredentialsError(CloudStorageError):
+
+ def __init__(self):
+ super(CredentialsError, self).__init__(
+ 'Attempted to access a file from Cloud Storage but you have no '
+ 'configured credentials. ' + self._GetConfigInstructions())
+
+
+class CloudStorageIODisabled(CloudStorageError):
+ pass
+
+
+class NotFoundError(CloudStorageError):
+ pass
+
+
+class ServerError(CloudStorageError):
+ pass
+
+
+# TODO(tonyg/dtu): Can this be replaced with distutils.spawn.find_executable()?
+def _FindExecutableInPath(relative_executable_path, *extra_search_paths):
+ search_paths = list(extra_search_paths) + os.environ['PATH'].split(os.pathsep)
+ for search_path in search_paths:
+ executable_path = os.path.join(search_path, relative_executable_path)
+ if py_utils.IsExecutable(executable_path):
+ return executable_path
+ return None
+
+
+def _EnsureExecutable(gsutil):
+ """chmod +x if gsutil is not executable."""
+ st = os.stat(gsutil)
+ if not st.st_mode & stat.S_IEXEC:
+ os.chmod(gsutil, st.st_mode | stat.S_IEXEC)
+
+
+def _RunCommand(args):
+ # On cros device, as telemetry is running as root, home will be set to /root/,
+ # which is not writable. gsutil will attempt to create a download tracker dir
+ # in home dir and fail. To avoid this, override HOME dir to something writable
+ # when running on cros device.
+ #
+ # TODO(tbarzic): Figure out a better way to handle gsutil on cros.
+ # http://crbug.com/386416, http://crbug.com/359293.
+ gsutil_env = None
+ if py_utils.IsRunningOnCrosDevice():
+ gsutil_env = os.environ.copy()
+ gsutil_env['HOME'] = _CROS_GSUTIL_HOME_WAR
+
+ if os.name == 'nt':
+ # If Windows, prepend python. Python scripts aren't directly executable.
+ args = [sys.executable, _GSUTIL_PATH] + args
+ else:
+ # Don't do it on POSIX, in case someone is using a shell script to redirect.
+ args = [_GSUTIL_PATH] + args
+ _EnsureExecutable(_GSUTIL_PATH)
+
+ if args[0] not in ('help', 'hash', 'version') and not IsNetworkIOEnabled():
+ raise CloudStorageIODisabled(
+ "Environment variable DISABLE_CLOUD_STORAGE_IO is set to 1. "
+ 'Command %s is not allowed to run' % args)
+
+ gsutil = subprocess.Popen(args, stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE, env=gsutil_env)
+ stdout, stderr = gsutil.communicate()
+
+ if gsutil.returncode:
+ raise GetErrorObjectForCloudStorageStderr(stderr)
+
+ return stdout
+
+
+def GetErrorObjectForCloudStorageStderr(stderr):
+ if (stderr.startswith((
+ 'You are attempting to access protected data with no configured',
+ 'Failure: No handler was ready to authenticate.')) or
+ re.match('.*401.*does not have .* access to .*', stderr)):
+ return CredentialsError()
+ if ('status=403' in stderr or 'status 403' in stderr or
+ '403 Forbidden' in stderr or
+ re.match('.*403.*does not have .* access to .*', stderr)):
+ return PermissionError()
+ if (stderr.startswith('InvalidUriError') or 'No such object' in stderr or
+ 'No URLs matched' in stderr or 'One or more URLs matched no' in stderr):
+ return NotFoundError(stderr)
+ if '500 Internal Server Error' in stderr:
+ return ServerError(stderr)
+ return CloudStorageError(stderr)
+
+
+def IsNetworkIOEnabled():
+ """Returns true if cloud storage is enabled."""
+ disable_cloud_storage_env_val = os.getenv(DISABLE_CLOUD_STORAGE_IO)
+
+ if disable_cloud_storage_env_val and disable_cloud_storage_env_val != '1':
+ logger.error(
+ 'Unsupported value of environment variable '
+ 'DISABLE_CLOUD_STORAGE_IO. Expected None or \'1\' but got %s.',
+ disable_cloud_storage_env_val)
+
+ return disable_cloud_storage_env_val != '1'
+
+
+def List(bucket):
+ query = 'gs://%s/' % bucket
+ stdout = _RunCommand(['ls', query])
+ return [url[len(query):] for url in stdout.splitlines()]
+
+
+def Exists(bucket, remote_path):
+ try:
+ _RunCommand(['ls', 'gs://%s/%s' % (bucket, remote_path)])
+ return True
+ except NotFoundError:
+ return False
+
+
+def Move(bucket1, bucket2, remote_path):
+ url1 = 'gs://%s/%s' % (bucket1, remote_path)
+ url2 = 'gs://%s/%s' % (bucket2, remote_path)
+ logger.info('Moving %s to %s', url1, url2)
+ _RunCommand(['mv', url1, url2])
+
+
+def Copy(bucket_from, bucket_to, remote_path_from, remote_path_to):
+ """Copy a file from one location in CloudStorage to another.
+
+ Args:
+ bucket_from: The cloud storage bucket where the file is currently located.
+ bucket_to: The cloud storage bucket it is being copied to.
+ remote_path_from: The file path where the file is located in bucket_from.
+ remote_path_to: The file path it is being copied to in bucket_to.
+
+ It should: cause no changes locally or to the starting file, and will
+ overwrite any existing files in the destination location.
+ """
+ url1 = 'gs://%s/%s' % (bucket_from, remote_path_from)
+ url2 = 'gs://%s/%s' % (bucket_to, remote_path_to)
+ logger.info('Copying %s to %s', url1, url2)
+ _RunCommand(['cp', url1, url2])
+
+
+def Delete(bucket, remote_path):
+ url = 'gs://%s/%s' % (bucket, remote_path)
+ logger.info('Deleting %s', url)
+ _RunCommand(['rm', url])
+
+
+def Get(bucket, remote_path, local_path):
+ with _FileLock(local_path):
+ _GetLocked(bucket, remote_path, local_path)
+
+
+_CLOUD_STORAGE_GLOBAL_LOCK = os.path.join(
+ os.path.dirname(os.path.abspath(__file__)), 'cloud_storage_global_lock.py')
+
+
+@contextlib.contextmanager
+def _FileLock(base_path):
+ pseudo_lock_path = '%s.pseudo_lock' % base_path
+ _CreateDirectoryIfNecessary(os.path.dirname(pseudo_lock_path))
+
+ # Make sure that we guard the creation, acquisition, release, and removal of
+ # the pseudo lock all with the same guard (_CLOUD_STORAGE_GLOBAL_LOCK).
+ # Otherwise, we can get nasty interleavings that result in multiple processes
+ # thinking they have an exclusive lock, like:
+ #
+ # (Process 1) Create and acquire the pseudo lock
+ # (Process 1) Release the pseudo lock
+ # (Process 1) Release the file lock
+ # (Process 2) Open and acquire the existing pseudo lock
+ # (Process 1) Delete the (existing) pseudo lock
+ # (Process 3) Create and acquire a new pseudo lock
+ #
+ # Using the same guard for creation and removal of the pseudo lock guarantees
+ # that all processes are referring to the same lock.
+ pseudo_lock_fd = None
+ pseudo_lock_fd_return = []
+ py_utils.WaitFor(lambda: _AttemptPseudoLockAcquisition(pseudo_lock_path,
+ pseudo_lock_fd_return),
+ LOCK_ACQUISITION_TIMEOUT)
+ pseudo_lock_fd = pseudo_lock_fd_return[0]
+
+ try:
+ yield
+ finally:
+ py_utils.WaitFor(lambda: _AttemptPseudoLockRelease(pseudo_lock_fd),
+ LOCK_ACQUISITION_TIMEOUT)
+
+def _AttemptPseudoLockAcquisition(pseudo_lock_path, pseudo_lock_fd_return):
+ """Try to acquire the lock and return a boolean indicating whether the attempt
+ was successful. If the attempt was successful, pseudo_lock_fd_return, which
+ should be an empty array, will be modified to contain a single entry: the file
+ descriptor of the (now acquired) lock file.
+
+ This whole operation is guarded with the global cloud storage lock, which
+ prevents race conditions that might otherwise cause multiple processes to
+ believe they hold the same pseudo lock (see _FileLock for more details).
+ """
+ pseudo_lock_fd = None
+ try:
+ with open(_CLOUD_STORAGE_GLOBAL_LOCK) as global_file:
+ with lock.FileLock(global_file, lock.LOCK_EX | lock.LOCK_NB):
+ # Attempt to acquire the lock in a non-blocking manner. If we block,
+ # then we'll cause deadlock because another process will be unable to
+ # acquire the cloud storage global lock in order to release the pseudo
+ # lock.
+ pseudo_lock_fd = open(pseudo_lock_path, 'w')
+ lock.AcquireFileLock(pseudo_lock_fd, lock.LOCK_EX | lock.LOCK_NB)
+ pseudo_lock_fd_return.append(pseudo_lock_fd)
+ return True
+ except (lock.LockException, IOError):
+ # We failed to acquire either the global cloud storage lock or the pseudo
+ # lock.
+ if pseudo_lock_fd:
+ pseudo_lock_fd.close()
+ return False
+
+
+def _AttemptPseudoLockRelease(pseudo_lock_fd):
+ """Try to release the pseudo lock and return a boolean indicating whether
+ the release was succesful.
+
+ This whole operation is guarded with the global cloud storage lock, which
+ prevents race conditions that might otherwise cause multiple processes to
+ believe they hold the same pseudo lock (see _FileLock for more details).
+ """
+ pseudo_lock_path = pseudo_lock_fd.name
+ try:
+ with open(_CLOUD_STORAGE_GLOBAL_LOCK) as global_file:
+ with lock.FileLock(global_file, lock.LOCK_EX | lock.LOCK_NB):
+ lock.ReleaseFileLock(pseudo_lock_fd)
+ pseudo_lock_fd.close()
+ try:
+ os.remove(pseudo_lock_path)
+ except OSError:
+ # We don't care if the pseudo lock gets removed elsewhere before
+ # we have a chance to do so.
+ pass
+ return True
+ except (lock.LockException, IOError):
+ # We failed to acquire the global cloud storage lock and are thus unable to
+ # release the pseudo lock.
+ return False
+
+
+def _CreateDirectoryIfNecessary(directory):
+ if not os.path.exists(directory):
+ os.makedirs(directory)
+
+
+def _GetLocked(bucket, remote_path, local_path):
+ url = 'gs://%s/%s' % (bucket, remote_path)
+ logger.info('Downloading %s to %s', url, local_path)
+ _CreateDirectoryIfNecessary(os.path.dirname(local_path))
+ with tempfile.NamedTemporaryFile(
+ dir=os.path.dirname(local_path),
+ delete=False) as partial_download_path:
+ try:
+ # Windows won't download to an open file.
+ partial_download_path.close()
+ try:
+ _RunCommand(['cp', url, partial_download_path.name])
+ except ServerError:
+ logger.info('Cloud Storage server error, retrying download')
+ _RunCommand(['cp', url, partial_download_path.name])
+ shutil.move(partial_download_path.name, local_path)
+ finally:
+ if os.path.exists(partial_download_path.name):
+ os.remove(partial_download_path.name)
+
+
+def Insert(bucket, remote_path, local_path, publicly_readable=False):
+ """ Upload file in |local_path| to cloud storage.
+ Args:
+ bucket: the google cloud storage bucket name.
+ remote_path: the remote file path in |bucket|.
+ local_path: path of the local file to be uploaded.
+ publicly_readable: whether the uploaded file has publicly readable
+ permission.
+
+ Returns:
+ The url where the file is uploaded to.
+ """
+ url = 'gs://%s/%s' % (bucket, remote_path)
+ command_and_args = ['cp']
+ extra_info = ''
+ if publicly_readable:
+ command_and_args += ['-a', 'public-read']
+ extra_info = ' (publicly readable)'
+ command_and_args += [local_path, url]
+ logger.info('Uploading %s to %s%s', local_path, url, extra_info)
+ _RunCommand(command_and_args)
+ return 'https://console.developers.google.com/m/cloudstorage/b/%s/o/%s' % (
+ bucket, remote_path)
+
+
+def GetIfHashChanged(cs_path, download_path, bucket, file_hash):
+ """Downloads |download_path| to |file_path| if |file_path| doesn't exist or
+ it's hash doesn't match |file_hash|.
+
+ Returns:
+ True if the binary was changed.
+ Raises:
+ CredentialsError if the user has no configured credentials.
+ PermissionError if the user does not have permission to access the bucket.
+ NotFoundError if the file is not in the given bucket in cloud_storage.
+ """
+ with _FileLock(download_path):
+ if (os.path.exists(download_path) and
+ CalculateHash(download_path) == file_hash):
+ return False
+ _GetLocked(bucket, cs_path, download_path)
+ return True
+
+
+def GetIfChanged(file_path, bucket):
+ """Gets the file at file_path if it has a hash file that doesn't match or
+ if there is no local copy of file_path, but there is a hash file for it.
+
+ Returns:
+ True if the binary was changed.
+ Raises:
+ CredentialsError if the user has no configured credentials.
+ PermissionError if the user does not have permission to access the bucket.
+ NotFoundError if the file is not in the given bucket in cloud_storage.
+ """
+ with _FileLock(file_path):
+ hash_path = file_path + '.sha1'
+ if not os.path.exists(hash_path):
+ logger.warning('Hash file not found: %s', hash_path)
+ return False
+
+ expected_hash = ReadHash(hash_path)
+ if os.path.exists(file_path) and CalculateHash(file_path) == expected_hash:
+ return False
+ _GetLocked(bucket, expected_hash, file_path)
+ return True
+
+
+def GetFilesInDirectoryIfChanged(directory, bucket):
+ """ Scan the directory for .sha1 files, and download them from the given
+ bucket in cloud storage if the local and remote hash don't match or
+ there is no local copy.
+ """
+ if not os.path.isdir(directory):
+ raise ValueError(
+ '%s does not exist. Must provide a valid directory path.' % directory)
+ # Don't allow the root directory to be a serving_dir.
+ if directory == os.path.abspath(os.sep):
+ raise ValueError('Trying to serve root directory from HTTP server.')
+ for dirpath, _, filenames in os.walk(directory):
+ for filename in filenames:
+ path_name, extension = os.path.splitext(
+ os.path.join(dirpath, filename))
+ if extension != '.sha1':
+ continue
+ GetIfChanged(path_name, bucket)
+
+
+def CalculateHash(file_path):
+ """Calculates and returns the hash of the file at file_path."""
+ sha1 = hashlib.sha1()
+ with open(file_path, 'rb') as f:
+ while True:
+ # Read in 1mb chunks, so it doesn't all have to be loaded into memory.
+ chunk = f.read(1024 * 1024)
+ if not chunk:
+ break
+ sha1.update(chunk)
+ return sha1.hexdigest()
+
+
+def ReadHash(hash_path):
+ with open(hash_path, 'rb') as f:
+ return f.read(1024).rstrip()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/cloud_storage_global_lock.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/cloud_storage_global_lock.py
new file mode 100644
index 0000000..5718e10
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/cloud_storage_global_lock.py
@@ -0,0 +1,5 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# This file is used by cloud_storage._FileLock implementation, don't delete it!
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/cloud_storage_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/cloud_storage_unittest.py
new file mode 100644
index 0000000..a513b26
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/cloud_storage_unittest.py
@@ -0,0 +1,284 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import shutil
+import sys
+import tempfile
+import unittest
+
+import mock
+from pyfakefs import fake_filesystem_unittest
+
+import py_utils
+from py_utils import cloud_storage
+from py_utils import lock
+
+_CLOUD_STORAGE_GLOBAL_LOCK_PATH = os.path.join(
+ os.path.dirname(__file__), 'cloud_storage_global_lock.py')
+
+def _FakeReadHash(_):
+ return 'hashthis!'
+
+
+def _FakeCalulateHashMatchesRead(_):
+ return 'hashthis!'
+
+
+def _FakeCalulateHashNewHash(_):
+ return 'omgnewhash'
+
+
+class CloudStorageFakeFsUnitTest(fake_filesystem_unittest.TestCase):
+
+ def setUp(self):
+ self.original_environ = os.environ.copy()
+ os.environ['DISABLE_CLOUD_STORAGE_IO'] = ''
+ self.setUpPyfakefs()
+ self.fs.CreateFile(
+ os.path.join(py_utils.GetCatapultDir(),
+ 'third_party', 'gsutil', 'gsutil'))
+
+ def CreateFiles(self, file_paths):
+ for f in file_paths:
+ self.fs.CreateFile(f)
+
+ def tearDown(self):
+ self.tearDownPyfakefs()
+ os.environ = self.original_environ
+
+ def _FakeRunCommand(self, cmd):
+ pass
+
+ def _FakeGet(self, bucket, remote_path, local_path):
+ pass
+
+ def _AssertRunCommandRaisesError(self, communicate_strs, error):
+ with mock.patch('py_utils.cloud_storage.subprocess.Popen') as popen:
+ p_mock = mock.Mock()
+ popen.return_value = p_mock
+ p_mock.returncode = 1
+ for stderr in communicate_strs:
+ p_mock.communicate.return_value = ('', stderr)
+ self.assertRaises(error, cloud_storage._RunCommand, [])
+
+ def testRunCommandCredentialsError(self):
+ strs = ['You are attempting to access protected data with no configured',
+ 'Failure: No handler was ready to authenticate.']
+ self._AssertRunCommandRaisesError(strs, cloud_storage.CredentialsError)
+
+ def testRunCommandPermissionError(self):
+ strs = ['status=403', 'status 403', '403 Forbidden']
+ self._AssertRunCommandRaisesError(strs, cloud_storage.PermissionError)
+
+ def testRunCommandNotFoundError(self):
+ strs = ['InvalidUriError', 'No such object', 'No URLs matched',
+ 'One or more URLs matched no', 'InvalidUriError']
+ self._AssertRunCommandRaisesError(strs, cloud_storage.NotFoundError)
+
+ def testRunCommandServerError(self):
+ strs = ['500 Internal Server Error']
+ self._AssertRunCommandRaisesError(strs, cloud_storage.ServerError)
+
+ def testRunCommandGenericError(self):
+ strs = ['Random string']
+ self._AssertRunCommandRaisesError(strs, cloud_storage.CloudStorageError)
+
+ def testInsertCreatesValidCloudUrl(self):
+ orig_run_command = cloud_storage._RunCommand
+ try:
+ cloud_storage._RunCommand = self._FakeRunCommand
+ remote_path = 'test-remote-path.html'
+ local_path = 'test-local-path.html'
+ cloud_url = cloud_storage.Insert(cloud_storage.PUBLIC_BUCKET,
+ remote_path, local_path)
+ self.assertEqual('https://console.developers.google.com/m/cloudstorage'
+ '/b/chromium-telemetry/o/test-remote-path.html',
+ cloud_url)
+ finally:
+ cloud_storage._RunCommand = orig_run_command
+
+ @mock.patch('py_utils.cloud_storage.subprocess')
+ def testExistsReturnsFalse(self, subprocess_mock):
+ p_mock = mock.Mock()
+ subprocess_mock.Popen.return_value = p_mock
+ p_mock.communicate.return_value = (
+ '',
+ 'CommandException: One or more URLs matched no objects.\n')
+ p_mock.returncode_result = 1
+ self.assertFalse(cloud_storage.Exists('fake bucket',
+ 'fake remote path'))
+
+ @mock.patch('py_utils.cloud_storage.CalculateHash')
+ @mock.patch('py_utils.cloud_storage._GetLocked')
+ @mock.patch('py_utils.cloud_storage._FileLock')
+ @mock.patch('py_utils.cloud_storage.os.path')
+ def testGetIfHashChanged(self, path_mock, unused_lock_mock, get_mock,
+ calc_hash_mock):
+ path_mock.exists.side_effect = [False, True, True]
+ calc_hash_mock.return_value = 'hash'
+
+ # The file at |local_path| doesn't exist. We should download file from cs.
+ ret = cloud_storage.GetIfHashChanged(
+ 'remote_path', 'local_path', 'cs_bucket', 'hash')
+ self.assertTrue(ret)
+ get_mock.assert_called_once_with('cs_bucket', 'remote_path', 'local_path')
+ get_mock.reset_mock()
+ self.assertFalse(calc_hash_mock.call_args)
+ calc_hash_mock.reset_mock()
+
+ # A local file exists at |local_path| but has the wrong hash.
+ # We should download file from cs.
+ ret = cloud_storage.GetIfHashChanged(
+ 'remote_path', 'local_path', 'cs_bucket', 'new_hash')
+ self.assertTrue(ret)
+ get_mock.assert_called_once_with('cs_bucket', 'remote_path', 'local_path')
+ get_mock.reset_mock()
+ calc_hash_mock.assert_called_once_with('local_path')
+ calc_hash_mock.reset_mock()
+
+ # Downloaded file exists locally and has the right hash. Don't download.
+ ret = cloud_storage.GetIfHashChanged(
+ 'remote_path', 'local_path', 'cs_bucket', 'hash')
+ self.assertFalse(get_mock.call_args)
+ self.assertFalse(ret)
+ calc_hash_mock.reset_mock()
+ get_mock.reset_mock()
+
+ @mock.patch('py_utils.cloud_storage._FileLock')
+ def testGetIfChanged(self, unused_lock_mock):
+ orig_get = cloud_storage._GetLocked
+ orig_read_hash = cloud_storage.ReadHash
+ orig_calculate_hash = cloud_storage.CalculateHash
+ cloud_storage.ReadHash = _FakeReadHash
+ cloud_storage.CalculateHash = _FakeCalulateHashMatchesRead
+ file_path = 'test-file-path.wpr'
+ hash_path = file_path + '.sha1'
+ try:
+ cloud_storage._GetLocked = self._FakeGet
+ # hash_path doesn't exist.
+ self.assertFalse(cloud_storage.GetIfChanged(file_path,
+ cloud_storage.PUBLIC_BUCKET))
+ # hash_path exists, but file_path doesn't.
+ self.CreateFiles([hash_path])
+ self.assertTrue(cloud_storage.GetIfChanged(file_path,
+ cloud_storage.PUBLIC_BUCKET))
+ # hash_path and file_path exist, and have same hash.
+ self.CreateFiles([file_path])
+ self.assertFalse(cloud_storage.GetIfChanged(file_path,
+ cloud_storage.PUBLIC_BUCKET))
+ # hash_path and file_path exist, and have different hashes.
+ cloud_storage.CalculateHash = _FakeCalulateHashNewHash
+ self.assertTrue(cloud_storage.GetIfChanged(file_path,
+ cloud_storage.PUBLIC_BUCKET))
+ finally:
+ cloud_storage._GetLocked = orig_get
+ cloud_storage.CalculateHash = orig_calculate_hash
+ cloud_storage.ReadHash = orig_read_hash
+
+ @unittest.skipIf(sys.platform.startswith('win'),
+ 'https://github.com/catapult-project/catapult/issues/1861')
+ def testGetFilesInDirectoryIfChanged(self):
+ self.CreateFiles([
+ 'real_dir_path/dir1/1file1.sha1',
+ 'real_dir_path/dir1/1file2.txt',
+ 'real_dir_path/dir1/1file3.sha1',
+ 'real_dir_path/dir2/2file.txt',
+ 'real_dir_path/dir3/3file1.sha1'])
+
+ def IncrementFilesUpdated(*_):
+ IncrementFilesUpdated.files_updated += 1
+ IncrementFilesUpdated.files_updated = 0
+ orig_get_if_changed = cloud_storage.GetIfChanged
+ cloud_storage.GetIfChanged = IncrementFilesUpdated
+ try:
+ self.assertRaises(ValueError, cloud_storage.GetFilesInDirectoryIfChanged,
+ os.path.abspath(os.sep), cloud_storage.PUBLIC_BUCKET)
+ self.assertEqual(0, IncrementFilesUpdated.files_updated)
+ self.assertRaises(ValueError, cloud_storage.GetFilesInDirectoryIfChanged,
+ 'fake_dir_path', cloud_storage.PUBLIC_BUCKET)
+ self.assertEqual(0, IncrementFilesUpdated.files_updated)
+ cloud_storage.GetFilesInDirectoryIfChanged('real_dir_path',
+ cloud_storage.PUBLIC_BUCKET)
+ self.assertEqual(3, IncrementFilesUpdated.files_updated)
+ finally:
+ cloud_storage.GetIfChanged = orig_get_if_changed
+
+ def testCopy(self):
+ orig_run_command = cloud_storage._RunCommand
+
+ def AssertCorrectRunCommandArgs(args):
+ self.assertEqual(expected_args, args)
+ cloud_storage._RunCommand = AssertCorrectRunCommandArgs
+ expected_args = ['cp', 'gs://bucket1/remote_path1',
+ 'gs://bucket2/remote_path2']
+ try:
+ cloud_storage.Copy('bucket1', 'bucket2', 'remote_path1', 'remote_path2')
+ finally:
+ cloud_storage._RunCommand = orig_run_command
+
+
+ @mock.patch('py_utils.cloud_storage._FileLock')
+ def testDisableCloudStorageIo(self, unused_lock_mock):
+ os.environ['DISABLE_CLOUD_STORAGE_IO'] = '1'
+ dir_path = 'real_dir_path'
+ self.fs.CreateDirectory(dir_path)
+ file_path = os.path.join(dir_path, 'file1')
+ file_path_sha = file_path + '.sha1'
+ self.CreateFiles([file_path, file_path_sha])
+ with open(file_path_sha, 'w') as f:
+ f.write('hash1234')
+ with self.assertRaises(cloud_storage.CloudStorageIODisabled):
+ cloud_storage.Copy('bucket1', 'bucket2', 'remote_path1', 'remote_path2')
+ with self.assertRaises(cloud_storage.CloudStorageIODisabled):
+ cloud_storage.Get('bucket', 'foo', file_path)
+ with self.assertRaises(cloud_storage.CloudStorageIODisabled):
+ cloud_storage.GetIfChanged(file_path, 'foo')
+ with self.assertRaises(cloud_storage.CloudStorageIODisabled):
+ cloud_storage.GetIfHashChanged('bar', file_path, 'bucket', 'hash1234')
+ with self.assertRaises(cloud_storage.CloudStorageIODisabled):
+ cloud_storage.Insert('bucket', 'foo', file_path)
+ with self.assertRaises(cloud_storage.CloudStorageIODisabled):
+ cloud_storage.GetFilesInDirectoryIfChanged(dir_path, 'bucket')
+
+
+class CloudStorageRealFsUnitTest(unittest.TestCase):
+
+ def setUp(self):
+ self.original_environ = os.environ.copy()
+ os.environ['DISABLE_CLOUD_STORAGE_IO'] = ''
+
+ def tearDown(self):
+ os.environ = self.original_environ
+
+ @mock.patch('py_utils.cloud_storage.LOCK_ACQUISITION_TIMEOUT', .005)
+ def testGetPseudoLockUnavailableCausesTimeout(self):
+ with tempfile.NamedTemporaryFile(suffix='.pseudo_lock') as pseudo_lock_fd:
+ with lock.FileLock(pseudo_lock_fd, lock.LOCK_EX | lock.LOCK_NB):
+ with self.assertRaises(py_utils.TimeoutException):
+ file_path = pseudo_lock_fd.name.replace('.pseudo_lock', '')
+ cloud_storage.GetIfChanged(file_path, cloud_storage.PUBLIC_BUCKET)
+
+ @mock.patch('py_utils.cloud_storage.LOCK_ACQUISITION_TIMEOUT', .005)
+ def testGetGlobalLockUnavailableCausesTimeout(self):
+ with open(_CLOUD_STORAGE_GLOBAL_LOCK_PATH) as global_lock_fd:
+ with lock.FileLock(global_lock_fd, lock.LOCK_EX | lock.LOCK_NB):
+ tmp_dir = tempfile.mkdtemp()
+ try:
+ file_path = os.path.join(tmp_dir, 'foo')
+ with self.assertRaises(py_utils.TimeoutException):
+ cloud_storage.GetIfChanged(file_path, cloud_storage.PUBLIC_BUCKET)
+ finally:
+ shutil.rmtree(tmp_dir)
+
+
+class CloudStorageErrorHandlingTest(unittest.TestCase):
+ def runTest(self):
+ self.assertIsInstance(cloud_storage.GetErrorObjectForCloudStorageStderr(
+ 'ServiceException: 401 Anonymous users does not have '
+ 'storage.objects.get access to object chrome-partner-telemetry'),
+ cloud_storage.CredentialsError)
+ self.assertIsInstance(cloud_storage.GetErrorObjectForCloudStorageStderr(
+ '403 Caller does not have storage.objects.list access to bucket '
+ 'chrome-telemetry'), cloud_storage.PermissionError)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/contextlib_ext.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/contextlib_ext.py
new file mode 100644
index 0000000..922d27d
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/contextlib_ext.py
@@ -0,0 +1,33 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+class _OptionalContextManager(object):
+
+ def __init__(self, manager, condition):
+ self._manager = manager
+ self._condition = condition
+
+ def __enter__(self):
+ if self._condition:
+ return self._manager.__enter__()
+ return None
+
+ def __exit__(self, exc_type, exc_val, exc_tb):
+ if self._condition:
+ return self._manager.__exit__(exc_type, exc_val, exc_tb)
+ return None
+
+
+def Optional(manager, condition):
+ """Wraps the provided context manager and runs it if condition is True.
+
+ Args:
+ manager: A context manager to conditionally run.
+ condition: If true, runs the given context manager.
+ Returns:
+ A context manager that conditionally executes the given manager.
+ """
+ return _OptionalContextManager(manager, condition)
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/contextlib_ext_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/contextlib_ext_unittest.py
new file mode 100644
index 0000000..b83e7e5
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/contextlib_ext_unittest.py
@@ -0,0 +1,34 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import unittest
+
+from py_utils import contextlib_ext
+
+
+class OptionalUnittest(unittest.TestCase):
+
+ class SampleContextMgr(object):
+
+ def __init__(self):
+ self.entered = False
+ self.exited = False
+
+ def __enter__(self):
+ self.entered = True
+
+ def __exit__(self, exc_type, exc_val, exc_tb):
+ self.exited = True
+
+ def testConditionTrue(self):
+ c = self.SampleContextMgr()
+ with contextlib_ext.Optional(c, True):
+ self.assertTrue(c.entered)
+ self.assertTrue(c.exited)
+
+ def testConditionFalse(self):
+ c = self.SampleContextMgr()
+ with contextlib_ext.Optional(c, False):
+ self.assertFalse(c.entered)
+ self.assertFalse(c.exited)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/dependency_util.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/dependency_util.py
new file mode 100644
index 0000000..d3cfe89
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/dependency_util.py
@@ -0,0 +1,49 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import platform
+import sys
+
+import py_utils
+
+def GetOSAndArchForCurrentDesktopPlatform():
+ os_name = GetOSNameForCurrentDesktopPlatform()
+ return os_name, GetArchForCurrentDesktopPlatform(os_name)
+
+
+def GetOSNameForCurrentDesktopPlatform():
+ if py_utils.IsRunningOnCrosDevice():
+ return 'chromeos'
+ if sys.platform.startswith('linux'):
+ return 'linux'
+ if sys.platform == 'darwin':
+ return 'mac'
+ if sys.platform == 'win32':
+ return 'win'
+ return sys.platform
+
+
+def GetArchForCurrentDesktopPlatform(os_name):
+ if os_name == 'chromeos':
+ # Current tests outside of telemetry don't run on chromeos, and
+ # platform.machine is not the way telemetry gets the arch name on chromeos.
+ raise NotImplementedError()
+ return platform.machine()
+
+
+def GetChromeApkOsVersion(version_name):
+ version = version_name[0]
+ assert version.isupper(), (
+ 'First character of versions name %s was not an uppercase letter.')
+ if version < 'L':
+ return 'k'
+ elif version > 'M':
+ return 'n'
+ return 'l'
+
+
+def ChromeBinariesConfigPath():
+ return os.path.realpath(os.path.join(
+ os.path.dirname(os.path.abspath(__file__)), 'chrome_binaries.json'))
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/lock.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/lock.py
new file mode 100644
index 0000000..aa9a095
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/lock.py
@@ -0,0 +1,117 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import contextlib
+import os
+
+LOCK_EX = None # Exclusive lock
+LOCK_SH = None # Shared lock
+LOCK_NB = None # Non-blocking (LockException is raised if resource is locked)
+
+
+class LockException(Exception):
+ pass
+
+
+if os.name == 'nt':
+ import win32con # pylint: disable=import-error
+ import win32file # pylint: disable=import-error
+ import pywintypes # pylint: disable=import-error
+ LOCK_EX = win32con.LOCKFILE_EXCLUSIVE_LOCK
+ LOCK_SH = 0 # the default
+ LOCK_NB = win32con.LOCKFILE_FAIL_IMMEDIATELY
+ _OVERLAPPED = pywintypes.OVERLAPPED()
+elif os.name == 'posix':
+ import fcntl # pylint: disable=import-error
+ LOCK_EX = fcntl.LOCK_EX
+ LOCK_SH = fcntl.LOCK_SH
+ LOCK_NB = fcntl.LOCK_NB
+
+
+@contextlib.contextmanager
+def FileLock(target_file, flags):
+ """ Lock the target file. Similar to AcquireFileLock but allow user to write:
+ with FileLock(f, LOCK_EX):
+ ...do stuff on file f without worrying about race condition
+ Args: see AcquireFileLock's documentation.
+ """
+ AcquireFileLock(target_file, flags)
+ try:
+ yield
+ finally:
+ ReleaseFileLock(target_file)
+
+
+def AcquireFileLock(target_file, flags):
+ """ Lock the target file. Note that if |target_file| is closed, the lock is
+ automatically released.
+ Args:
+ target_file: file handle of the file to acquire lock.
+ flags: can be any of the type LOCK_EX, LOCK_SH, LOCK_NB, or a bitwise
+ OR combination of flags.
+ """
+ assert flags in (
+ LOCK_EX, LOCK_SH, LOCK_NB, LOCK_EX | LOCK_NB, LOCK_SH | LOCK_NB)
+ if os.name == 'nt':
+ _LockImplWin(target_file, flags)
+ elif os.name == 'posix':
+ _LockImplPosix(target_file, flags)
+ else:
+ raise NotImplementedError('%s is not supported' % os.name)
+
+
+def ReleaseFileLock(target_file):
+ """ Unlock the target file.
+ Args:
+ target_file: file handle of the file to release the lock.
+ """
+ if os.name == 'nt':
+ _UnlockImplWin(target_file)
+ elif os.name == 'posix':
+ _UnlockImplPosix(target_file)
+ else:
+ raise NotImplementedError('%s is not supported' % os.name)
+
+# These implementations are based on
+# http://code.activestate.com/recipes/65203/
+
+def _LockImplWin(target_file, flags):
+ hfile = win32file._get_osfhandle(target_file.fileno())
+ try:
+ win32file.LockFileEx(hfile, flags, 0, -0x10000, _OVERLAPPED)
+ except pywintypes.error, exc_value:
+ if exc_value[0] == 33:
+ raise LockException('Error trying acquiring lock of %s: %s' %
+ (target_file.name, exc_value[2]))
+ else:
+ raise
+
+
+def _UnlockImplWin(target_file):
+ hfile = win32file._get_osfhandle(target_file.fileno())
+ try:
+ win32file.UnlockFileEx(hfile, 0, -0x10000, _OVERLAPPED)
+ except pywintypes.error, exc_value:
+ if exc_value[0] == 158:
+ # error: (158, 'UnlockFileEx', 'The segment is already unlocked.')
+ # To match the 'posix' implementation, silently ignore this error
+ pass
+ else:
+ # Q: Are there exceptions/codes we should be dealing with here?
+ raise
+
+
+def _LockImplPosix(target_file, flags):
+ try:
+ fcntl.flock(target_file.fileno(), flags)
+ except IOError, exc_value:
+ if exc_value[0] == 11 or exc_value[0] == 35:
+ raise LockException('Error trying acquiring lock of %s: %s' %
+ (target_file.name, exc_value[1]))
+ else:
+ raise
+
+
+def _UnlockImplPosix(target_file):
+ fcntl.flock(target_file.fileno(), fcntl.LOCK_UN)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/lock_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/lock_unittest.py
new file mode 100644
index 0000000..a260621
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/lock_unittest.py
@@ -0,0 +1,165 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import multiprocessing
+import os
+import time
+import unittest
+import tempfile
+
+
+from py_utils import lock
+
+
+def _AppendTextToFile(file_name):
+ with open(file_name, 'a') as f:
+ lock.AcquireFileLock(f, lock.LOCK_EX)
+ # Sleep 100 ms to increase the chance of another process trying to acquire
+ # the lock of file as the same time.
+ time.sleep(0.1)
+ f.write('Start')
+ for _ in range(10000):
+ f.write('*')
+ f.write('End')
+
+
+def _ReadFileWithSharedLockBlockingThenWrite(read_file, write_file):
+ with open(read_file, 'r') as f:
+ lock.AcquireFileLock(f, lock.LOCK_SH)
+ content = f.read()
+ with open(write_file, 'a') as f2:
+ lock.AcquireFileLock(f2, lock.LOCK_EX)
+ f2.write(content)
+
+
+def _ReadFileWithExclusiveLockNonBlocking(target_file, status_file):
+ with open(target_file, 'r') as f:
+ try:
+ lock.AcquireFileLock(f, lock.LOCK_EX | lock.LOCK_NB)
+ with open(status_file, 'w') as f2:
+ f2.write('LockException was not raised')
+ except lock.LockException:
+ with open(status_file, 'w') as f2:
+ f2.write('LockException raised')
+
+
+class FileLockTest(unittest.TestCase):
+ def setUp(self):
+ tf = tempfile.NamedTemporaryFile(delete=False)
+ tf.close()
+ self.temp_file_path = tf.name
+
+ def tearDown(self):
+ os.remove(self.temp_file_path)
+
+ def testExclusiveLock(self):
+ processess = []
+ for _ in range(10):
+ p = multiprocessing.Process(
+ target=_AppendTextToFile, args=(self.temp_file_path,))
+ p.start()
+ processess.append(p)
+ for p in processess:
+ p.join()
+
+ # If the file lock works as expected, there should be 10 atomic writes of
+ # 'Start***...***End' to the file in some order, which lead to the final
+ # file content as below.
+ expected_file_content = ''.join((['Start'] + ['*']*10000 + ['End']) * 10)
+ with open(self.temp_file_path, 'r') as f:
+ # Use assertTrue instead of assertEquals since the strings are big, hence
+ # assertEquals's assertion failure will contain huge strings.
+ self.assertTrue(expected_file_content == f.read())
+
+ def testSharedLock(self):
+ tf = tempfile.NamedTemporaryFile(delete=False)
+ tf.close()
+ temp_write_file = tf.name
+ try:
+ with open(self.temp_file_path, 'w') as f:
+ f.write('0123456789')
+ with open(self.temp_file_path, 'r') as f:
+ # First, acquire a shared lock on temp_file_path
+ lock.AcquireFileLock(f, lock.LOCK_SH)
+
+ processess = []
+ # Create 10 processes that also try to acquire shared lock from
+ # temp_file_path then append temp_file_path's content to temp_write_file
+ for _ in range(10):
+ p = multiprocessing.Process(
+ target=_ReadFileWithSharedLockBlockingThenWrite,
+ args=(self.temp_file_path, temp_write_file))
+ p.start()
+ processess.append(p)
+ for p in processess:
+ p.join()
+
+ # temp_write_file should contains 10 copy of temp_file_path's content.
+ with open(temp_write_file, 'r') as f:
+ self.assertEquals('0123456789'*10, f.read())
+ finally:
+ os.remove(temp_write_file)
+
+ def testNonBlockingLockAcquiring(self):
+ tf = tempfile.NamedTemporaryFile(delete=False)
+ tf.close()
+ temp_status_file = tf.name
+ try:
+ with open(self.temp_file_path, 'w') as f:
+ lock.AcquireFileLock(f, lock.LOCK_EX)
+ p = multiprocessing.Process(
+ target=_ReadFileWithExclusiveLockNonBlocking,
+ args=(self.temp_file_path, temp_status_file))
+ p.start()
+ p.join()
+ with open(temp_status_file, 'r') as f:
+ self.assertEquals('LockException raised', f.read())
+ finally:
+ os.remove(temp_status_file)
+
+ def testUnlockBeforeClosingFile(self):
+ tf = tempfile.NamedTemporaryFile(delete=False)
+ tf.close()
+ temp_status_file = tf.name
+ try:
+ with open(self.temp_file_path, 'r') as f:
+ lock.AcquireFileLock(f, lock.LOCK_SH)
+ lock.ReleaseFileLock(f)
+ p = multiprocessing.Process(
+ target=_ReadFileWithExclusiveLockNonBlocking,
+ args=(self.temp_file_path, temp_status_file))
+ p.start()
+ p.join()
+ with open(temp_status_file, 'r') as f:
+ self.assertEquals('LockException was not raised', f.read())
+ finally:
+ os.remove(temp_status_file)
+
+ def testContextualLock(self):
+ tf = tempfile.NamedTemporaryFile(delete=False)
+ tf.close()
+ temp_status_file = tf.name
+ try:
+ with open(self.temp_file_path, 'r') as f:
+ with lock.FileLock(f, lock.LOCK_EX):
+ # Within this block, accessing self.temp_file_path from another
+ # process should raise exception.
+ p = multiprocessing.Process(
+ target=_ReadFileWithExclusiveLockNonBlocking,
+ args=(self.temp_file_path, temp_status_file))
+ p.start()
+ p.join()
+ with open(temp_status_file, 'r') as f:
+ self.assertEquals('LockException raised', f.read())
+
+ # Accessing self.temp_file_path here should not raise exception.
+ p = multiprocessing.Process(
+ target=_ReadFileWithExclusiveLockNonBlocking,
+ args=(self.temp_file_path, temp_status_file))
+ p.start()
+ p.join()
+ with open(temp_status_file, 'r') as f:
+ self.assertEquals('LockException was not raised', f.read())
+ finally:
+ os.remove(temp_status_file)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/py_utils_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/py_utils_unittest.py
new file mode 100644
index 0000000..e614a45
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/py_utils_unittest.py
@@ -0,0 +1,55 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+import os
+import sys
+import unittest
+
+import py_utils
+
+
+class PathTest(unittest.TestCase):
+
+ def testIsExecutable(self):
+ self.assertFalse(py_utils.IsExecutable('nonexistent_file'))
+ # We use actual files on disk instead of pyfakefs because the executable is
+ # set different on win that posix platforms and pyfakefs doesn't support
+ # win platform well.
+ self.assertFalse(py_utils.IsExecutable(_GetFileInTestDir('foo.txt')))
+ self.assertTrue(py_utils.IsExecutable(sys.executable))
+
+
+def _GetFileInTestDir(file_name):
+ return os.path.join(os.path.dirname(__file__), 'test_data', file_name)
+
+
+class WaitForTest(unittest.TestCase):
+
+ def testWaitForTrue(self):
+ def ReturnTrue():
+ return True
+ self.assertTrue(py_utils.WaitFor(ReturnTrue, .1))
+
+ def testWaitForFalse(self):
+ def ReturnFalse():
+ return False
+
+ with self.assertRaises(py_utils.TimeoutException):
+ py_utils.WaitFor(ReturnFalse, .1)
+
+ def testWaitForEventuallyTrue(self):
+ # Use list to pass to inner function in order to allow modifying the
+ # variable from the outer scope.
+ c = [0]
+ def ReturnCounterBasedValue():
+ c[0] += 1
+ return c[0] > 2
+
+ self.assertTrue(py_utils.WaitFor(ReturnCounterBasedValue, .5))
+
+ def testWaitForTrueLambda(self):
+ self.assertTrue(py_utils.WaitFor(lambda: True, .1))
+
+ def testWaitForFalseLambda(self):
+ with self.assertRaises(py_utils.TimeoutException):
+ py_utils.WaitFor(lambda: False, .1)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/__init__.py
new file mode 100644
index 0000000..e3fbb5f
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/__init__.py
@@ -0,0 +1,28 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Style-preserving Python code transforms.
+
+This module provides components for modifying and querying Python code. They can
+be used to build custom refactorings and linters.
+"""
+
+import functools
+import multiprocessing
+
+# pylint: disable=wildcard-import
+from py_utils.refactor.annotated_symbol import *
+from py_utils.refactor.module import Module
+
+
+def _TransformFile(transform, file_path):
+ module = Module(file_path)
+ result = transform(module)
+ module.Write()
+ return result
+
+
+def Transform(transform, file_paths):
+ transform = functools.partial(_TransformFile, transform)
+ return multiprocessing.Pool().map(transform, file_paths)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/__init__.py
new file mode 100644
index 0000000..610bc15
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/__init__.py
@@ -0,0 +1,71 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# pylint: disable=wildcard-import
+from py_utils.refactor.annotated_symbol.class_definition import *
+from py_utils.refactor.annotated_symbol.function_definition import *
+from py_utils.refactor.annotated_symbol.import_statement import *
+from py_utils.refactor.annotated_symbol.reference import *
+from py_utils.refactor import snippet
+
+
+__all__ = [
+ 'Annotate',
+
+ 'Class',
+ 'Function',
+ 'Import',
+ 'Reference',
+]
+
+
+# Specific symbol types with extra methods for manipulating them.
+# Python's full grammar is here:
+# https://docs.python.org/2/reference/grammar.html
+
+# Annotated Symbols have an Annotate classmethod that takes a symbol type and
+# list of children, and returns an instance of that annotated Symbol.
+
+ANNOTATED_SYMBOLS = (
+ AsName,
+ Class,
+ DottedName,
+ ImportFrom,
+ ImportName,
+ Function,
+)
+
+
+# Unfortunately, some logical groupings are not represented by a node in the
+# parse tree. To work around this, some annotated Symbols have an Annotate
+# classmethod that takes and returns a list of Snippets instead.
+
+ANNOTATED_GROUPINGS = (
+ Reference,
+)
+
+
+def Annotate(f):
+ """Return the syntax tree of the given file."""
+ return _AnnotateNode(snippet.Snippetize(f))
+
+
+def _AnnotateNode(node):
+ if not isinstance(node, snippet.Symbol):
+ return node
+
+ children = map(_AnnotateNode, node.children)
+
+ for symbol_type in ANNOTATED_GROUPINGS:
+ annotated_grouping = symbol_type.Annotate(children)
+ if annotated_grouping:
+ children = annotated_grouping
+ break
+
+ for symbol_type in ANNOTATED_SYMBOLS:
+ annotated_symbol = symbol_type.Annotate(node.type, children)
+ if annotated_symbol:
+ return annotated_symbol
+
+ return snippet.Symbol(node.type, children)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/base_symbol.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/base_symbol.py
new file mode 100644
index 0000000..2e28e89
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/base_symbol.py
@@ -0,0 +1,36 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from py_utils.refactor import snippet
+
+
+class AnnotatedSymbol(snippet.Symbol):
+ def __init__(self, symbol_type, children):
+ super(AnnotatedSymbol, self).__init__(symbol_type, children)
+ self._modified = False
+
+ @property
+ def modified(self):
+ if self._modified:
+ return True
+ return super(AnnotatedSymbol, self).modified
+
+ def __setattr__(self, name, value):
+ if (hasattr(self.__class__, name) and
+ isinstance(getattr(self.__class__, name), property)):
+ self._modified = True
+ return super(AnnotatedSymbol, self).__setattr__(name, value)
+
+ def Cut(self, child):
+ for i in xrange(len(self._children)):
+ if self._children[i] == child:
+ self._modified = True
+ del self._children[i]
+ break
+ else:
+ raise ValueError('%s is not in %s.' % (child, self))
+
+ def Paste(self, child):
+ self._modified = True
+ self._children.append(child)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/class_definition.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/class_definition.py
new file mode 100644
index 0000000..814958f
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/class_definition.py
@@ -0,0 +1,51 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import symbol
+
+from py_utils.refactor.annotated_symbol import base_symbol
+
+
+__all__ = [
+ 'Class',
+]
+
+
+class Class(base_symbol.AnnotatedSymbol):
+ # pylint: disable=abstract-class-not-used
+
+ @classmethod
+ def Annotate(cls, symbol_type, children):
+ if symbol_type != symbol.stmt:
+ return None
+
+ compound_statement = children[0]
+ if compound_statement.type != symbol.compound_stmt:
+ return None
+
+ statement = compound_statement.children[0]
+ if statement.type == symbol.classdef:
+ return cls(statement.type, statement.children)
+ elif (statement.type == symbol.decorated and
+ statement.children[-1].type == symbol.classdef):
+ return cls(statement.type, statement.children)
+ else:
+ return None
+
+ @property
+ def suite(self):
+ # TODO: Complete.
+ raise NotImplementedError()
+
+ def FindChild(self, snippet_type, **kwargs):
+ return self.suite.FindChild(snippet_type, **kwargs)
+
+ def FindChildren(self, snippet_type):
+ return self.suite.FindChildren(snippet_type)
+
+ def Cut(self, child):
+ self.suite.Cut(child)
+
+ def Paste(self, child):
+ self.suite.Paste(child)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/function_definition.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/function_definition.py
new file mode 100644
index 0000000..50a1672
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/function_definition.py
@@ -0,0 +1,51 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import symbol
+
+from py_utils.refactor.annotated_symbol import base_symbol
+
+
+__all__ = [
+ 'Function',
+]
+
+
+class Function(base_symbol.AnnotatedSymbol):
+ # pylint: disable=abstract-class-not-used
+
+ @classmethod
+ def Annotate(cls, symbol_type, children):
+ if symbol_type != symbol.stmt:
+ return None
+
+ compound_statement = children[0]
+ if compound_statement.type != symbol.compound_stmt:
+ return None
+
+ statement = compound_statement.children[0]
+ if statement.type == symbol.funcdef:
+ return cls(statement.type, statement.children)
+ elif (statement.type == symbol.decorated and
+ statement.children[-1].type == symbol.funcdef):
+ return cls(statement.type, statement.children)
+ else:
+ return None
+
+ @property
+ def suite(self):
+ # TODO: Complete.
+ raise NotImplementedError()
+
+ def FindChild(self, snippet_type, **kwargs):
+ return self.suite.FindChild(snippet_type, **kwargs)
+
+ def FindChildren(self, snippet_type):
+ return self.suite.FindChildren(snippet_type)
+
+ def Cut(self, child):
+ self.suite.Cut(child)
+
+ def Paste(self, child):
+ self.suite.Paste(child)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/import_statement.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/import_statement.py
new file mode 100644
index 0000000..5c38c10
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/import_statement.py
@@ -0,0 +1,322 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import itertools
+import keyword
+import symbol
+import token
+
+from py_utils.refactor.annotated_symbol import base_symbol
+from py_utils.refactor import snippet
+
+
+__all__ = [
+ 'AsName',
+ 'DottedName',
+ 'Import',
+ 'ImportFrom',
+ 'ImportName',
+]
+
+
+class DottedName(base_symbol.AnnotatedSymbol):
+ @classmethod
+ def Annotate(cls, symbol_type, children):
+ if symbol_type != symbol.dotted_name:
+ return None
+ return cls(symbol_type, children)
+
+ @property
+ def value(self):
+ return ''.join(token_snippet.value for token_snippet in self._children)
+
+ @value.setter
+ def value(self, value):
+ value_parts = value.split('.')
+ for value_part in value_parts:
+ if keyword.iskeyword(value_part):
+ raise ValueError('%s is a reserved keyword.' % value_part)
+
+ # If we have too many children, cut the list down to size.
+ self._children = self._children[:len(value_parts)*2-1]
+
+ # Update child nodes.
+ for child, value_part in itertools.izip_longest(
+ self._children[::2], value_parts):
+ if child:
+ # Modify existing children. This helps preserve comments and spaces.
+ child.value = value_part
+ else:
+ # Add children as needed.
+ self._children.append(snippet.TokenSnippet.Create(token.DOT, '.'))
+ self._children.append(
+ snippet.TokenSnippet.Create(token.NAME, value_part))
+
+
+class AsName(base_symbol.AnnotatedSymbol):
+ @classmethod
+ def Annotate(cls, symbol_type, children):
+ if (symbol_type != symbol.dotted_as_name and
+ symbol_type != symbol.import_as_name):
+ return None
+ return cls(symbol_type, children)
+
+ @property
+ def name(self):
+ return self.children[0].value
+
+ @name.setter
+ def name(self, value):
+ self.children[0].value = value
+
+ @property
+ def alias(self):
+ if len(self.children) < 3:
+ return None
+ return self.children[2].value
+
+ @alias.setter
+ def alias(self, value):
+ if keyword.iskeyword(value):
+ raise ValueError('%s is a reserved keyword.' % value)
+
+ if value:
+ if len(self.children) < 3:
+ # If we currently have no alias, add one.
+ self.children.append(
+ snippet.TokenSnippet.Create(token.NAME, 'as', (0, 1)))
+ self.children.append(
+ snippet.TokenSnippet.Create(token.NAME, value, (0, 1)))
+ else:
+ # We already have an alias. Just update the value.
+ self.children[2].value = value
+ else:
+ # Removing the alias. Strip the "as foo".
+ self.children = [self.children[0]]
+
+
+class Import(base_symbol.AnnotatedSymbol):
+ """An import statement.
+
+ Example:
+ import a.b.c as d
+ from a.b import c as d
+
+ In these examples,
+ path == 'a.b.c'
+ alias == 'd'
+ root == 'a.b' (only for "from" imports)
+ module == 'c' (only for "from" imports)
+ name (read-only) == the name used by references to the module, which is the
+ alias if there is one, the full module path in "full" imports, and the
+ module name in "from" imports.
+ """
+ @property
+ def has_from(self):
+ """Returns True iff the import statment is of the form "from x import y"."""
+ raise NotImplementedError()
+
+ @property
+ def values(self):
+ raise NotImplementedError()
+
+ @property
+ def paths(self):
+ raise NotImplementedError()
+
+ @property
+ def aliases(self):
+ raise NotImplementedError()
+
+ @property
+ def path(self):
+ """The full dotted path of the module."""
+ raise NotImplementedError()
+
+ @path.setter
+ def path(self, value):
+ raise NotImplementedError()
+
+ @property
+ def alias(self):
+ """The alias, if the module is renamed with "as". None otherwise."""
+ raise NotImplementedError()
+
+ @alias.setter
+ def alias(self, value):
+ raise NotImplementedError()
+
+ @property
+ def name(self):
+ """The name used to reference this import's module."""
+ raise NotImplementedError()
+
+
+class ImportName(Import):
+ @classmethod
+ def Annotate(cls, symbol_type, children):
+ if symbol_type != symbol.import_stmt:
+ return None
+ if children[0].type != symbol.import_name:
+ return None
+ assert len(children) == 1
+ return cls(symbol_type, children[0].children)
+
+ @property
+ def has_from(self):
+ return False
+
+ @property
+ def values(self):
+ dotted_as_names = self.children[1]
+ return tuple((dotted_as_name.name, dotted_as_name.alias)
+ for dotted_as_name in dotted_as_names.children[::2])
+
+ @property
+ def paths(self):
+ return tuple(path for path, _ in self.values)
+
+ @property
+ def aliases(self):
+ return tuple(alias for _, alias in self.values)
+
+ @property
+ def _dotted_as_name(self):
+ dotted_as_names = self.children[1]
+ if len(dotted_as_names.children) != 1:
+ raise NotImplementedError(
+ 'This method only works if the statement has one import.')
+ return dotted_as_names.children[0]
+
+ @property
+ def path(self):
+ return self._dotted_as_name.name
+
+ @path.setter
+ def path(self, value): # pylint: disable=arguments-differ
+ self._dotted_as_name.name = value
+
+ @property
+ def alias(self):
+ return self._dotted_as_name.alias
+
+ @alias.setter
+ def alias(self, value): # pylint: disable=arguments-differ
+ self._dotted_as_name.alias = value
+
+ @property
+ def name(self):
+ if self.alias:
+ return self.alias
+ else:
+ return self.path
+
+
+class ImportFrom(Import):
+ @classmethod
+ def Annotate(cls, symbol_type, children):
+ if symbol_type != symbol.import_stmt:
+ return None
+ if children[0].type != symbol.import_from:
+ return None
+ assert len(children) == 1
+ return cls(symbol_type, children[0].children)
+
+ @property
+ def has_from(self):
+ return True
+
+ @property
+ def values(self):
+ try:
+ import_as_names = self.FindChild(symbol.import_as_names)
+ except ValueError:
+ return (('*', None),)
+
+ return tuple((import_as_name.name, import_as_name.alias)
+ for import_as_name in import_as_names.children[::2])
+
+ @property
+ def paths(self):
+ module = self.module
+ return tuple('.'.join((module, name)) for name, _ in self.values)
+
+ @property
+ def aliases(self):
+ return tuple(alias for _, alias in self.values)
+
+ @property
+ def root(self):
+ return self.FindChild(symbol.dotted_name).value
+
+ @root.setter
+ def root(self, value):
+ self.FindChild(symbol.dotted_name).value = value
+
+ @property
+ def _import_as_name(self):
+ try:
+ import_as_names = self.FindChild(symbol.import_as_names)
+ except ValueError:
+ return None
+
+ if len(import_as_names.children) != 1:
+ raise NotImplementedError(
+ 'This method only works if the statement has one import.')
+
+ return import_as_names.children[0]
+
+ @property
+ def module(self):
+ import_as_name = self._import_as_name
+ if import_as_name:
+ return import_as_name.name
+ else:
+ return '*'
+
+ @module.setter
+ def module(self, value):
+ if keyword.iskeyword(value):
+ raise ValueError('%s is a reserved keyword.' % value)
+
+ import_as_name = self._import_as_name
+ if value == '*':
+ # TODO: Implement this.
+ raise NotImplementedError()
+ else:
+ if import_as_name:
+ import_as_name.name = value
+ else:
+ # TODO: Implement this.
+ raise NotImplementedError()
+
+ @property
+ def path(self):
+ return '.'.join((self.root, self.module))
+
+ @path.setter
+ def path(self, value): # pylint: disable=arguments-differ
+ self.root, _, self.module = value.rpartition('.')
+
+ @property
+ def alias(self):
+ import_as_name = self._import_as_name
+ if import_as_name:
+ return import_as_name.alias
+ else:
+ return None
+
+ @alias.setter
+ def alias(self, value): # pylint: disable=arguments-differ
+ import_as_name = self._import_as_name
+ if not import_as_name:
+ raise NotImplementedError('Cannot change alias for "import *".')
+ import_as_name.alias = value
+
+ @property
+ def name(self):
+ if self.alias:
+ return self.alias
+ else:
+ return self.module
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/reference.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/reference.py
new file mode 100644
index 0000000..757c57f
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/annotated_symbol/reference.py
@@ -0,0 +1,75 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import itertools
+import symbol
+import token
+
+from py_utils.refactor.annotated_symbol import base_symbol
+from py_utils.refactor import snippet
+
+
+__all__ = [
+ 'Reference',
+]
+
+
+class Reference(base_symbol.AnnotatedSymbol):
+ @classmethod
+ def Annotate(cls, nodes):
+ if not nodes:
+ return None
+ if nodes[0].type != symbol.atom:
+ return None
+ if not nodes[0].children or nodes[0].children[0].type != token.NAME:
+ return None
+
+ for i in xrange(1, len(nodes)):
+ if not nodes:
+ break
+ if nodes[i].type != symbol.trailer:
+ break
+ if len(nodes[i].children) != 2:
+ break
+ if (nodes[i].children[0].type != token.DOT or
+ nodes[i].children[1].type != token.NAME):
+ break
+ else:
+ i = len(nodes)
+
+ return [cls(nodes[:i])] + nodes[i:]
+
+ def __init__(self, children):
+ super(Reference, self).__init__(-1, children)
+
+ @property
+ def type_name(self):
+ return 'attribute_reference'
+
+ @property
+ def value(self):
+ return ''.join(token_snippet.value
+ for child in self.children
+ for token_snippet in child.children)
+
+ @value.setter
+ def value(self, value):
+ value_parts = value.split('.')
+
+ # If we have too many children, cut the list down to size.
+ self._children = self._children[:len(value_parts)]
+
+ # Update child nodes.
+ for child, value_part in itertools.izip_longest(
+ self._children, value_parts):
+ if child:
+ # Modify existing children. This helps preserve comments and spaces.
+ child.children[-1].value = value_part
+ else:
+ # Add children as needed.
+ token_snippets = [
+ snippet.TokenSnippet.Create(token.DOT, '.'),
+ snippet.TokenSnippet.Create(token.NAME, value_part),
+ ]
+ self._children.append(snippet.Symbol(symbol.trailer, token_snippets))
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/module.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/module.py
new file mode 100644
index 0000000..d6eae00
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/module.py
@@ -0,0 +1,39 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from py_utils.refactor import annotated_symbol
+
+
+class Module(object):
+
+ def __init__(self, file_path):
+ self._file_path = file_path
+
+ with open(self._file_path, 'r') as f:
+ self._snippet = annotated_symbol.Annotate(f)
+
+ @property
+ def file_path(self):
+ return self._file_path
+
+ @property
+ def modified(self):
+ return self._snippet.modified
+
+ def FindAll(self, snippet_type):
+ return self._snippet.FindAll(snippet_type)
+
+ def FindChildren(self, snippet_type):
+ return self._snippet.FindChildren(snippet_type)
+
+ def Write(self):
+ """Write modifications to the file."""
+ if not self.modified:
+ return
+
+ # Stringify before opening the file for writing.
+ # If we fail, we won't truncate the file.
+ string = str(self._snippet)
+ with open(self._file_path, 'w') as f:
+ f.write(string)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/offset_token.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/offset_token.py
new file mode 100644
index 0000000..5fa953e
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/offset_token.py
@@ -0,0 +1,115 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import collections
+import itertools
+import token
+import tokenize
+
+
+def _Pairwise(iterable):
+ """s -> (None, s0), (s0, s1), (s1, s2), (s2, s3), ..."""
+ a, b = itertools.tee(iterable)
+ a = itertools.chain((None,), a)
+ return itertools.izip(a, b)
+
+
+class OffsetToken(object):
+ """A Python token with a relative position.
+
+ A token is represented by a type defined in Python's token module, a string
+ representing the content, and an offset. Using relative positions makes it
+ easy to insert and remove tokens.
+ """
+
+ def __init__(self, token_type, string, offset):
+ self._type = token_type
+ self._string = string
+ self._offset = offset
+
+ @property
+ def type(self):
+ return self._type
+
+ @property
+ def type_name(self):
+ return token.tok_name[self._type]
+
+ @property
+ def string(self):
+ return self._string
+
+ @string.setter
+ def string(self, value):
+ self._string = value
+
+ @property
+ def offset(self):
+ return self._offset
+
+ def __str__(self):
+ return str((self.type_name, self.string, self.offset))
+
+
+def Tokenize(f):
+ """Read tokens from a file-like object.
+
+ Args:
+ f: Any object that has a readline method.
+
+ Returns:
+ A collections.deque containing OffsetTokens. Deques are cheaper and easier
+ to manipulate sequentially than lists.
+ """
+ f.seek(0)
+ tokenize_tokens = tokenize.generate_tokens(f.readline)
+
+ offset_tokens = collections.deque()
+ for prev_token, next_token in _Pairwise(tokenize_tokens):
+ token_type, string, (srow, scol), _, _ = next_token
+ if not prev_token:
+ offset_tokens.append(OffsetToken(token_type, string, (0, 0)))
+ else:
+ erow, ecol = prev_token[3]
+ if erow == srow:
+ offset_tokens.append(OffsetToken(token_type, string, (0, scol - ecol)))
+ else:
+ offset_tokens.append(OffsetToken(
+ token_type, string, (srow - erow, scol)))
+
+ return offset_tokens
+
+
+def Untokenize(offset_tokens):
+ """Return the string representation of an iterable of OffsetTokens."""
+ # Make a copy. Don't modify the original.
+ offset_tokens = collections.deque(offset_tokens)
+
+ # Strip leading NL tokens.
+ while offset_tokens[0].type == tokenize.NL:
+ offset_tokens.popleft()
+
+ # Strip leading vertical whitespace.
+ first_token = offset_tokens.popleft()
+ # Take care not to modify the existing token. Create a new one in its place.
+ first_token = OffsetToken(first_token.type, first_token.string,
+ (0, first_token.offset[1]))
+ offset_tokens.appendleft(first_token)
+
+ # Convert OffsetTokens to tokenize tokens.
+ tokenize_tokens = []
+ row = 1
+ col = 0
+ for t in offset_tokens:
+ offset_row, offset_col = t.offset
+ if offset_row == 0:
+ col += offset_col
+ else:
+ row += offset_row
+ col = offset_col
+ tokenize_tokens.append((t.type, t.string, (row, col), (row, col), None))
+
+ # tokenize can't handle whitespace before line continuations.
+ # So add a space.
+ return tokenize.untokenize(tokenize_tokens).replace('\\\n', ' \\\n')
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/snippet.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/snippet.py
new file mode 100644
index 0000000..b98561a
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor/snippet.py
@@ -0,0 +1,244 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import parser
+import symbol
+import sys
+import token
+import tokenize
+
+from py_utils.refactor import offset_token
+
+
+class Snippet(object):
+ """A node in the Python parse tree.
+
+ The Python grammar is defined at:
+ https://docs.python.org/2/reference/grammar.html
+
+ There are two types of Snippets:
+ TokenSnippets are leaf nodes containing actual text.
+ Symbols are internal nodes representing higher-level groupings, and are
+ defined by the left-hand sides of the BNFs in the above link.
+ """
+ @property
+ def type(self):
+ raise NotImplementedError()
+
+ @property
+ def type_name(self):
+ raise NotImplementedError()
+
+ @property
+ def children(self):
+ """Return a list of this node's children."""
+ raise NotImplementedError()
+
+ @property
+ def tokens(self):
+ """Return a tuple of the tokens this Snippet contains."""
+ raise NotImplementedError()
+
+ def PrintTree(self, indent=0, stream=sys.stdout):
+ """Spew a pretty-printed parse tree. Mostly useful for debugging."""
+ raise NotImplementedError()
+
+ def __str__(self):
+ return offset_token.Untokenize(self.tokens)
+
+ def FindAll(self, snippet_type):
+ if isinstance(snippet_type, int):
+ if self.type == snippet_type:
+ yield self
+ else:
+ if isinstance(self, snippet_type):
+ yield self
+
+ for child in self.children:
+ for snippet in child.FindAll(snippet_type):
+ yield snippet
+
+ def FindChild(self, snippet_type, **kwargs):
+ for child in self.children:
+ if isinstance(snippet_type, int):
+ if child.type != snippet_type:
+ continue
+ else:
+ if not isinstance(child, snippet_type):
+ continue
+
+ for attribute, value in kwargs:
+ if getattr(child, attribute) != value:
+ break
+ else:
+ return child
+ raise ValueError('%s is not in %s. Children are: %s' %
+ (snippet_type, self, self.children))
+
+ def FindChildren(self, snippet_type):
+ if isinstance(snippet_type, int):
+ for child in self.children:
+ if child.type == snippet_type:
+ yield child
+ else:
+ for child in self.children:
+ if isinstance(child, snippet_type):
+ yield child
+
+
+class TokenSnippet(Snippet):
+ """A Snippet containing a list of tokens.
+
+ A list of tokens may start with any number of comments and non-terminating
+ newlines, but must end with a syntactically meaningful token.
+ """
+
+ def __init__(self, token_type, tokens):
+ # For operators and delimiters, the TokenSnippet's type may be more specific
+ # than the type of the constituent token. E.g. the TokenSnippet type is
+ # token.DOT, but the token type is token.OP. This is because the parser
+ # has more context than the tokenizer.
+ self._type = token_type
+ self._tokens = tokens
+ self._modified = False
+
+ @classmethod
+ def Create(cls, token_type, string, offset=(0, 0)):
+ return cls(token_type,
+ [offset_token.OffsetToken(token_type, string, offset)])
+
+ @property
+ def type(self):
+ return self._type
+
+ @property
+ def type_name(self):
+ return token.tok_name[self.type]
+
+ @property
+ def value(self):
+ return self._tokens[-1].string
+
+ @value.setter
+ def value(self, value):
+ self._tokens[-1].string = value
+ self._modified = True
+
+ @property
+ def children(self):
+ return []
+
+ @property
+ def tokens(self):
+ return tuple(self._tokens)
+
+ @property
+ def modified(self):
+ return self._modified
+
+ def PrintTree(self, indent=0, stream=sys.stdout):
+ stream.write(' ' * indent)
+ if not self.tokens:
+ print >> stream, self.type_name
+ return
+
+ print >> stream, '%-4s' % self.type_name, repr(self.tokens[0].string)
+ for tok in self.tokens[1:]:
+ stream.write(' ' * indent)
+ print >> stream, ' ' * max(len(self.type_name), 4), repr(tok.string)
+
+
+class Symbol(Snippet):
+ """A Snippet containing sub-Snippets.
+
+ The possible types and type_names are defined in Python's symbol module."""
+
+ def __init__(self, symbol_type, children):
+ self._type = symbol_type
+ self._children = children
+
+ @property
+ def type(self):
+ return self._type
+
+ @property
+ def type_name(self):
+ return symbol.sym_name[self.type]
+
+ @property
+ def children(self):
+ return self._children
+
+ @children.setter
+ def children(self, value): # pylint: disable=arguments-differ
+ self._children = value
+
+ @property
+ def tokens(self):
+ tokens = []
+ for child in self.children:
+ tokens += child.tokens
+ return tuple(tokens)
+
+ @property
+ def modified(self):
+ return any(child.modified for child in self.children)
+
+ def PrintTree(self, indent=0, stream=sys.stdout):
+ stream.write(' ' * indent)
+
+ # If there's only one child, collapse it onto the same line.
+ node = self
+ while len(node.children) == 1 and len(node.children[0].children) == 1:
+ print >> stream, node.type_name,
+ node = node.children[0]
+
+ print >> stream, node.type_name
+ for child in node.children:
+ child.PrintTree(indent + 2, stream)
+
+
+def Snippetize(f):
+ """Return the syntax tree of the given file."""
+ f.seek(0)
+ syntax_tree = parser.st2list(parser.suite(f.read()))
+ tokens = offset_token.Tokenize(f)
+
+ snippet = _SnippetizeNode(syntax_tree, tokens)
+ assert not tokens
+ return snippet
+
+
+def _SnippetizeNode(node, tokens):
+ # The parser module gives a syntax tree that discards comments,
+ # non-terminating newlines, and whitespace information. Use the tokens given
+ # by the tokenize module to annotate the syntax tree with the information
+ # needed to exactly reproduce the original source code.
+ node_type = node[0]
+
+ if node_type >= token.NT_OFFSET:
+ # Symbol.
+ children = tuple(_SnippetizeNode(child, tokens) for child in node[1:])
+ return Symbol(node_type, children)
+ else:
+ # Token.
+ grabbed_tokens = []
+ while tokens and (
+ tokens[0].type == tokenize.COMMENT or tokens[0].type == tokenize.NL):
+ grabbed_tokens.append(tokens.popleft())
+
+ # parser has 2 NEWLINEs right before the end.
+ # tokenize has 0 or 1 depending on if the file has one.
+ # Create extra nodes without consuming tokens to account for this.
+ if node_type == token.NEWLINE:
+ for tok in tokens:
+ if tok.type == token.ENDMARKER:
+ return TokenSnippet(node_type, grabbed_tokens)
+ if tok.type != token.DEDENT:
+ break
+
+ assert tokens[0].type == token.OP or node_type == tokens[0].type
+
+ grabbed_tokens.append(tokens.popleft())
+ return TokenSnippet(node_type, grabbed_tokens)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor_util/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor_util/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor_util/__init__.py
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor_util/move.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor_util/move.py
new file mode 100644
index 0000000..d68f93b
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/refactor_util/move.py
@@ -0,0 +1,116 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import functools
+import os
+import sys
+
+from py_utils import refactor
+
+
+def Run(sources, target, files_to_update):
+ """Move modules and update imports.
+
+ Args:
+ sources: List of source module or package paths.
+ target: Destination module or package path.
+ files_to_update: Modules whose imports we should check for changes.
+ """
+ # TODO(dtu): Support moving classes and functions.
+ moves = tuple(_Move(source, target) for source in sources)
+
+ # Update imports and references.
+ refactor.Transform(functools.partial(_Update, moves), files_to_update)
+
+ # Move files.
+ for move in moves:
+ os.rename(move.source_path, move.target_path)
+
+
+def _Update(moves, module):
+ for import_statement in module.FindAll(refactor.Import):
+ for move in moves:
+ try:
+ if move.UpdateImportAndReferences(module, import_statement):
+ break
+ except NotImplementedError as e:
+ print >> sys.stderr, 'Error updating %s: %s' % (module.file_path, e)
+
+
+class _Move(object):
+
+ def __init__(self, source, target):
+ self._source_path = os.path.realpath(source)
+ self._target_path = os.path.realpath(target)
+
+ if os.path.isdir(self._target_path):
+ self._target_path = os.path.join(
+ self._target_path, os.path.basename(self._source_path))
+
+ @property
+ def source_path(self):
+ return self._source_path
+
+ @property
+ def target_path(self):
+ return self._target_path
+
+ @property
+ def source_module_path(self):
+ return _ModulePath(self._source_path)
+
+ @property
+ def target_module_path(self):
+ return _ModulePath(self._target_path)
+
+ def UpdateImportAndReferences(self, module, import_statement):
+ """Update an import statement in a module and all its references..
+
+ Args:
+ module: The refactor.Module to update.
+ import_statement: The refactor.Import to update.
+
+ Returns:
+ True if the import statement was updated, or False if the import statement
+ needed no updating.
+ """
+ statement_path_parts = import_statement.path.split('.')
+ source_path_parts = self.source_module_path.split('.')
+ if source_path_parts != statement_path_parts[:len(source_path_parts)]:
+ return False
+
+ # Update import statement.
+ old_name_parts = import_statement.name.split('.')
+ new_name_parts = ([self.target_module_path] +
+ statement_path_parts[len(source_path_parts):])
+ import_statement.path = '.'.join(new_name_parts)
+ new_name = import_statement.name
+
+ # Update references.
+ for reference in module.FindAll(refactor.Reference):
+ reference_parts = reference.value.split('.')
+ if old_name_parts != reference_parts[:len(old_name_parts)]:
+ continue
+
+ new_reference_parts = [new_name] + reference_parts[len(old_name_parts):]
+ reference.value = '.'.join(new_reference_parts)
+
+ return True
+
+
+def _BaseDir(module_path):
+ if not os.path.isdir(module_path):
+ module_path = os.path.dirname(module_path)
+
+ while '__init__.py' in os.listdir(module_path):
+ module_path = os.path.dirname(module_path)
+
+ return module_path
+
+
+def _ModulePath(module_path):
+ if os.path.split(module_path)[1] == '__init__.py':
+ module_path = os.path.dirname(module_path)
+ rel_path = os.path.relpath(module_path, _BaseDir(module_path))
+ return os.path.splitext(rel_path)[0].replace(os.sep, '.')
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/shell_util.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/shell_util.py
new file mode 100644
index 0000000..2a529c8
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/shell_util.py
@@ -0,0 +1,40 @@
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+#
+# Shell scripting helpers (created for Telemetry dependency roll scripts).
+
+import os as _os
+import shutil as _shutil
+import subprocess as _subprocess
+import tempfile as _tempfile
+from contextlib import contextmanager as _contextmanager
+
+@_contextmanager
+def ScopedChangeDir(new_path):
+ old_path = _os.getcwd()
+ _os.chdir(new_path)
+ print '> cd', _os.getcwd()
+ try:
+ yield
+ finally:
+ _os.chdir(old_path)
+ print '> cd', old_path
+
+@_contextmanager
+def ScopedTempDir():
+ temp_dir = _tempfile.mkdtemp()
+ try:
+ with ScopedChangeDir(temp_dir):
+ yield
+ finally:
+ _shutil.rmtree(temp_dir)
+
+def CallProgram(path_parts, *args, **kwargs):
+ '''Call an executable os.path.join(*path_parts) with the arguments specified
+ by *args. Any keyword arguments are passed as environment variables.'''
+ args = [_os.path.join(*path_parts)] + list(args)
+ env = dict(_os.environ)
+ env.update(kwargs)
+ print '>', ' '.join(args)
+ _subprocess.check_call(args, env=env)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/tempfile_ext.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/tempfile_ext.py
new file mode 100644
index 0000000..b095530
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/tempfile_ext.py
@@ -0,0 +1,25 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+import contextlib
+import shutil
+import tempfile
+
+
+@contextlib.contextmanager
+def NamedTemporaryDirectory(suffix='', prefix='tmp', dir=None):
+ """A context manager that manages a temporary directory.
+
+ This is a context manager version of tempfile.mkdtemp. The arguments to this
+ function are the same as the arguments for that one.
+ """
+ # This uses |dir| as a parameter name for consistency with mkdtemp.
+ # pylint: disable=redefined-builtin
+
+ d = tempfile.mkdtemp(suffix=suffix, prefix=prefix, dir=dir)
+ try:
+ yield d
+ finally:
+ shutil.rmtree(d)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/tempfile_ext_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/tempfile_ext_unittest.py
new file mode 100644
index 0000000..6844623
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/tempfile_ext_unittest.py
@@ -0,0 +1,39 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+
+from py_utils import tempfile_ext
+from pyfakefs import fake_filesystem_unittest
+
+
+class NamedTemporaryDirectoryTest(fake_filesystem_unittest.TestCase):
+
+ def setUp(self):
+ self.setUpPyfakefs()
+
+ def tearDown(self):
+ self.tearDownPyfakefs()
+
+ def testBasic(self):
+ with tempfile_ext.NamedTemporaryDirectory() as d:
+ self.assertTrue(os.path.exists(d))
+ self.assertTrue(os.path.isdir(d))
+ self.assertFalse(os.path.exists(d))
+
+ def testSuffix(self):
+ test_suffix = 'foo'
+ with tempfile_ext.NamedTemporaryDirectory(suffix=test_suffix) as d:
+ self.assertTrue(os.path.basename(d).endswith(test_suffix))
+
+ def testPrefix(self):
+ test_prefix = 'bar'
+ with tempfile_ext.NamedTemporaryDirectory(prefix=test_prefix) as d:
+ self.assertTrue(os.path.basename(d).startswith(test_prefix))
+
+ def testDir(self):
+ test_dir = '/baz'
+ self.fs.CreateDirectory(test_dir)
+ with tempfile_ext.NamedTemporaryDirectory(dir=test_dir) as d:
+ self.assertEquals(test_dir, os.path.dirname(d))
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/test_data/foo.txt b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/test_data/foo.txt
new file mode 100644
index 0000000..a9cac3e
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/test_data/foo.txt
@@ -0,0 +1 @@
+This file is not executable.
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/xvfb.py b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/xvfb.py
new file mode 100644
index 0000000..c09f3e3
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/common/py_utils/py_utils/xvfb.py
@@ -0,0 +1,29 @@
+#!/usr/bin/env python
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+import os
+import logging
+import subprocess
+import platform
+import time
+
+
+def ShouldStartXvfb():
+ return platform.system() == 'Linux'
+
+
+def StartXvfb():
+ display = ':99'
+ xvfb_command = ['Xvfb', display, '-screen', '0', '1024x769x24', '-ac']
+ xvfb_process = subprocess.Popen(
+ xvfb_command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ time.sleep(0.2)
+ returncode = xvfb_process.poll()
+ if returncode is None:
+ os.environ['DISPLAY'] = display
+ else:
+ logging.error('Xvfb did not start, returncode: %s, stdout:\n%s',
+ returncode, xvfb_process.stdout.read())
+ xvfb_process = None
+ return xvfb_process
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/PRESUBMIT.py b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/PRESUBMIT.py
new file mode 100644
index 0000000..a34480c
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/PRESUBMIT.py
@@ -0,0 +1,32 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+def CheckChangeOnUpload(input_api, output_api):
+ return _CommonChecks(input_api, output_api)
+
+
+def CheckChangeOnCommit(input_api, output_api):
+ return _CommonChecks(input_api, output_api)
+
+
+def _CommonChecks(input_api, output_api):
+ results = []
+ results += input_api.RunTests(input_api.canned_checks.GetPylint(
+ input_api, output_api, extra_paths_list=_GetPathsToPrepend(input_api),
+ pylintrc='pylintrc'))
+ return results
+
+
+def _GetPathsToPrepend(input_api):
+ project_dir = input_api.PresubmitLocalPath()
+ catapult_dir = input_api.os_path.join(project_dir, '..')
+ return [
+ project_dir,
+
+ input_api.os_path.join(catapult_dir, 'common', 'py_utils'),
+
+ input_api.os_path.join(catapult_dir, 'third_party', 'mock'),
+ input_api.os_path.join(catapult_dir, 'third_party', 'pyfakefs'),
+ ]
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/__init__.py
new file mode 100644
index 0000000..68efbdb
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/__init__.py
@@ -0,0 +1,43 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import sys
+
+
+CATAPULT_PATH = os.path.dirname(os.path.dirname(os.path.dirname(
+ os.path.abspath(__file__))))
+CATAPULT_THIRD_PARTY_PATH = os.path.join(CATAPULT_PATH, 'third_party')
+DEPENDENCY_MANAGER_PATH = os.path.join(CATAPULT_PATH, 'dependency_manager')
+
+
+def _AddDirToPythonPath(*path_parts):
+ path = os.path.abspath(os.path.join(*path_parts))
+ if os.path.isdir(path) and path not in sys.path:
+ sys.path.append(path)
+
+
+_AddDirToPythonPath(CATAPULT_PATH, 'common', 'py_utils')
+_AddDirToPythonPath(CATAPULT_THIRD_PARTY_PATH, 'mock')
+_AddDirToPythonPath(CATAPULT_THIRD_PARTY_PATH, 'pyfakefs')
+_AddDirToPythonPath(CATAPULT_THIRD_PARTY_PATH, 'zipfile')
+_AddDirToPythonPath(DEPENDENCY_MANAGER_PATH)
+
+
+# pylint: disable=unused-import
+from .archive_info import ArchiveInfo
+from .base_config import BaseConfig
+from .cloud_storage_info import CloudStorageInfo
+from .dependency_info import DependencyInfo
+from .exceptions import CloudStorageError
+from .exceptions import CloudStorageUploadConflictError
+from .exceptions import EmptyConfigError
+from .exceptions import FileNotFoundError
+from .exceptions import NoPathFoundError
+from .exceptions import ReadWriteError
+from .exceptions import UnsupportedConfigFormatError
+from .local_path_info import LocalPathInfo
+from .manager import DependencyManager
+# pylint: enable=unused-import
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/archive_info.py b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/archive_info.py
new file mode 100644
index 0000000..ff13f90
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/archive_info.py
@@ -0,0 +1,80 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import glob
+import os
+import shutil
+
+from dependency_manager import exceptions
+from dependency_manager import dependency_manager_util
+
+
+class ArchiveInfo(object):
+
+ def __init__(self, archive_file, unzip_path, path_within_archive,
+ stale_unzip_path_glob=None):
+ """ Container for the information needed to unzip a downloaded archive.
+
+ Args:
+ archive_path: Path to the archive file.
+ unzip_path: Path to unzip the archive into. Assumes that this path
+ is unique for the archive.
+ path_within_archive: Specify if and how to handle zip archives
+ downloaded from cloud_storage. Expected values:
+ None: Do not unzip the file downloaded from cloud_storage.
+ '.': Unzip the file downloaded from cloud_storage. The
+ unzipped file/folder is the expected dependency.
+ file_path: Unzip the file downloaded from cloud_storage.
+ |file_path| is the path to the expected dependency,
+ relative to the unzipped archive path.
+ stale_unzip_path_glob: Optional argument specifying a glob matching
+ string which matches directories that should be removed before this
+ archive is extracted (if it is extracted at all).
+ """
+ self._archive_file = archive_file
+ self._unzip_path = unzip_path
+ self._path_within_archive = path_within_archive
+ self._dependency_path = os.path.join(
+ self._unzip_path, self._path_within_archive)
+ self._stale_unzip_path_glob = stale_unzip_path_glob
+ if not self._has_minimum_data:
+ raise ValueError(
+ 'Not enough information specified to initialize an archive info.'
+ ' %s' % self)
+
+ def GetUnzippedPath(self):
+ if self.ShouldUnzipArchive():
+ # Remove stale unzip results
+ if self._stale_unzip_path_glob:
+ for path in glob.glob(self._stale_unzip_path_glob):
+ shutil.rmtree(path)
+ # TODO(aiolos): Replace UnzipFile with zipfile.extractall once python
+ # version 2.7.4 or later can safely be assumed.
+ dependency_manager_util.UnzipArchive(
+ self._archive_file, self._unzip_path)
+ if self.ShouldUnzipArchive():
+ raise exceptions.ArchiveError(
+ "Expected path '%s' was not extracted from archive '%s'." %
+ (self._dependency_path, self._archive_file))
+ return self._dependency_path
+
+ def ShouldUnzipArchive(self):
+ if not self._has_minimum_data:
+ raise exceptions.ArchiveError(
+ 'Missing needed info to unzip archive. Known data: %s',
+ self.data_string)
+ return not os.path.exists(self._dependency_path)
+
+ @property
+ def _has_minimum_data(self):
+ return all([self._archive_file, self._unzip_path,
+ self._dependency_path])
+
+ def __repr__(self):
+ return (
+ 'ArchiveInfo(archive_file=%s, unzip_path=%s, path_within_archive=%s, '
+ 'dependency_path =%s)' % (
+ self._archive_file, self._unzip_path, self._path_within_archive,
+ self._dependency_path))
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/base_config.py b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/base_config.py
new file mode 100644
index 0000000..c735688
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/base_config.py
@@ -0,0 +1,388 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import json
+import logging
+import os
+
+from py_utils import cloud_storage
+from dependency_manager import archive_info
+from dependency_manager import cloud_storage_info
+from dependency_manager import dependency_info
+from dependency_manager import exceptions
+from dependency_manager import local_path_info
+from dependency_manager import uploader
+
+
+class BaseConfig(object):
+ """A basic config class for use with the DependencyManager.
+
+ Initiated with a json file in the following format:
+
+ { "config_type": "BaseConfig",
+ "dependencies": {
+ "dep_name1": {
+ "cloud_storage_base_folder": "base_folder1",
+ "cloud_storage_bucket": "bucket1",
+ "file_info": {
+ "platform1": {
+ "cloud_storage_hash": "hash_for_platform1",
+ "download_path": "download_path111",
+ "version_in_cs": "1.11.1.11."
+ "local_paths": ["local_path1110", "local_path1111"]
+ },
+ "platform2": {
+ "cloud_storage_hash": "hash_for_platform2",
+ "download_path": "download_path2",
+ "local_paths": ["local_path20", "local_path21"]
+ },
+ ...
+ }
+ },
+ "dependency_name_2": {
+ ...
+ },
+ ...
+ }
+ }
+
+ Required fields: "dependencies" and "config_type".
+ Note that config_type must be "BaseConfig"
+
+ Assumptions:
+ "cloud_storage_base_folder" is a top level folder in the given
+ "cloud_storage_bucket" where all of the dependency files are stored
+ at "dependency_name"_"cloud_storage_hash".
+
+ "download_path" and all paths in "local_paths" are relative to the
+ config file's location.
+
+ All or none of the following cloud storage related fields must be
+ included in each platform dictionary:
+ "cloud_storage_hash", "download_path", "cs_remote_path"
+
+ "version_in_cs" is an optional cloud storage field, but is dependent
+ on the above cloud storage related fields.
+
+
+ Also note that platform names are often of the form os_architechture.
+ Ex: "win_AMD64"
+
+ More information on the fields can be found in dependencies_info.py
+ """
+ def __init__(self, file_path, writable=False):
+ """ Initialize a BaseConfig for the DependencyManager.
+
+ Args:
+ writable: False: This config will be used to lookup information.
+ True: This config will be used to update information.
+
+ file_path: Path to a file containing a json dictionary in the expected
+ json format for this config class. Base format expected:
+
+ { "config_type": config_type,
+ "dependencies": dependencies_dict }
+
+ config_type: must match the return value of GetConfigType.
+ dependencies: A dictionary with the information needed to
+ create dependency_info instances for the given
+ dependencies.
+
+ See dependency_info.py for more information.
+ """
+ self._config_path = file_path
+ self._writable = writable
+ self._pending_uploads = []
+ if not self._config_path:
+ raise ValueError('Must supply config file path.')
+ if not os.path.exists(self._config_path):
+ if not writable:
+ raise exceptions.EmptyConfigError(file_path)
+ self._config_data = {}
+ self._WriteConfigToFile(self._config_path, dependencies=self._config_data)
+ else:
+ with open(file_path, 'r') as f:
+ config_data = json.load(f)
+ if not config_data:
+ raise exceptions.EmptyConfigError(file_path)
+ config_type = config_data.pop('config_type', None)
+ if config_type != self.GetConfigType():
+ raise ValueError(
+ 'Supplied config_type (%s) is not the expected type (%s) in file '
+ '%s' % (config_type, self.GetConfigType(), file_path))
+ self._config_data = config_data.get('dependencies', {})
+
+ def IterDependencyInfo(self):
+ """ Yields a DependencyInfo for each dependency/platform pair.
+
+ Raises:
+ ReadWriteError: If called when the config is writable.
+ ValueError: If any of the dependencies contain partial information for
+ downloading from cloud_storage. (See dependency_info.py)
+ """
+ if self._writable:
+ raise exceptions.ReadWriteError(
+ 'Trying to read dependency info from a writable config. File for '
+ 'config: %s' % self._config_path)
+ base_path = os.path.dirname(self._config_path)
+ for dependency in self._config_data:
+ dependency_dict = self._config_data.get(dependency)
+ platforms_dict = dependency_dict.get('file_info', {})
+ for platform in platforms_dict:
+ platform_info = platforms_dict.get(platform)
+
+ local_info = None
+ local_paths = platform_info.get('local_paths', [])
+ if local_paths:
+ paths = []
+ for path in local_paths:
+ path = self._FormatPath(path)
+ paths.append(os.path.abspath(os.path.join(base_path, path)))
+ local_info = local_path_info.LocalPathInfo(paths)
+
+ cs_info = None
+ cs_bucket = dependency_dict.get('cloud_storage_bucket')
+ cs_base_folder = dependency_dict.get('cloud_storage_base_folder', '')
+ download_path = platform_info.get('download_path')
+ if download_path:
+ download_path = self._FormatPath(download_path)
+ download_path = os.path.abspath(
+ os.path.join(base_path, download_path))
+
+ cs_hash = platform_info.get('cloud_storage_hash')
+ if not cs_hash:
+ raise exceptions.ConfigError(
+ 'Dependency %s has cloud storage info on platform %s, but is '
+ 'missing a cloud storage hash.', dependency, platform)
+ cs_remote_path = self._CloudStorageRemotePath(
+ dependency, cs_hash, cs_base_folder)
+ version_in_cs = platform_info.get('version_in_cs')
+
+ zip_info = None
+ path_within_archive = platform_info.get('path_within_archive')
+ if path_within_archive:
+ unzip_path = os.path.abspath(
+ os.path.join(os.path.dirname(download_path),
+ '%s_%s_%s' % (dependency, platform, cs_hash)))
+ stale_unzip_path_glob = os.path.abspath(
+ os.path.join(os.path.dirname(download_path),
+ '%s_%s_%s' % (dependency, platform,
+ '[0-9a-f]' * 40)))
+ zip_info = archive_info.ArchiveInfo(
+ download_path, unzip_path, path_within_archive,
+ stale_unzip_path_glob)
+
+ cs_info = cloud_storage_info.CloudStorageInfo(
+ cs_bucket, cs_hash, download_path, cs_remote_path,
+ version_in_cs=version_in_cs, archive_info=zip_info)
+
+ dep_info = dependency_info.DependencyInfo(
+ dependency, platform, self._config_path,
+ local_path_info=local_info, cloud_storage_info=cs_info)
+ yield dep_info
+
+ @classmethod
+ def GetConfigType(cls):
+ return 'BaseConfig'
+
+ @property
+ def config_path(self):
+ return self._config_path
+
+ def AddCloudStorageDependencyUpdateJob(
+ self, dependency, platform, dependency_path, version=None,
+ execute_job=True):
+ """Update the file downloaded from cloud storage for a dependency/platform.
+
+ Upload a new file to cloud storage for the given dependency and platform
+ pair and update the cloud storage hash and the version for the given pair.
+
+ Example usage:
+ The following should update the default platform for 'dep_name':
+ UpdateCloudStorageDependency('dep_name', 'default', 'path/to/file')
+
+ The following should update both the mac and win platforms for 'dep_name',
+ or neither if either update fails:
+ UpdateCloudStorageDependency(
+ 'dep_name', 'mac_x86_64', 'path/to/mac/file', execute_job=False)
+ UpdateCloudStorageDependency(
+ 'dep_name', 'win_AMD64', 'path/to/win/file', execute_job=False)
+ ExecuteUpdateJobs()
+
+ Args:
+ dependency: The dependency to update.
+ platform: The platform to update the dependency info for.
+ dependency_path: Path to the new dependency to be used.
+ version: Version of the updated dependency, for checking future updates
+ against.
+ execute_job: True if the config should be written to disk and the file
+ should be uploaded to cloud storage after the update. False if
+ multiple updates should be performed atomically. Must call
+ ExecuteUpdateJobs after all non-executed jobs are added to complete
+ the update.
+
+ Raises:
+ ReadWriteError: If the config was not initialized as writable, or if
+ |execute_job| is True but the config has update jobs still pending
+ execution.
+ ValueError: If no information exists in the config for |dependency| on
+ |platform|.
+ """
+ self._ValidateIsConfigUpdatable(
+ execute_job=execute_job, dependency=dependency, platform=platform)
+ cs_hash = cloud_storage.CalculateHash(dependency_path)
+ if version:
+ self._SetPlatformData(dependency, platform, 'version_in_cs', version)
+ self._SetPlatformData(dependency, platform, 'cloud_storage_hash', cs_hash)
+
+ cs_base_folder = self._GetPlatformData(
+ dependency, platform, 'cloud_storage_base_folder')
+ cs_bucket = self._GetPlatformData(
+ dependency, platform, 'cloud_storage_bucket')
+ cs_remote_path = self._CloudStorageRemotePath(
+ dependency, cs_hash, cs_base_folder)
+ self._pending_uploads.append(uploader.CloudStorageUploader(
+ cs_bucket, cs_remote_path, dependency_path))
+ if execute_job:
+ self.ExecuteUpdateJobs()
+
+ def ExecuteUpdateJobs(self, force=False):
+ """Write all config changes to the config_path specified in __init__.
+
+ Upload all files pending upload and then write the updated config to
+ file. Attempt to remove all uploaded files on failure.
+
+ Args:
+ force: True if files should be uploaded to cloud storage even if a
+ file already exists in the upload location.
+
+ Returns:
+ True: if the config was dirty and the upload succeeded.
+ False: if the config was not dirty.
+
+ Raises:
+ CloudStorageUploadConflictError: If |force| is False and the potential
+ upload location of a file already exists.
+ CloudStorageError: If copying an existing file to the backup location
+ or uploading a new file fails.
+ """
+ self._ValidateIsConfigUpdatable()
+ if not self._IsDirty():
+ logging.info('ExecuteUpdateJobs called on clean config')
+ return False
+ if not self._pending_uploads:
+ logging.debug('No files needing upload.')
+ else:
+ try:
+ for item_pending_upload in self._pending_uploads:
+ item_pending_upload.Upload(force)
+ self._WriteConfigToFile(self._config_path, self._config_data)
+ self._pending_uploads = []
+ except:
+ # Attempt to rollback the update in any instance of failure, even user
+ # interrupt via Ctrl+C; but don't consume the exception.
+ logging.error('Update failed, attempting to roll it back.')
+ for upload_item in reversed(self._pending_uploads):
+ upload_item.Rollback()
+ raise
+ return True
+
+ def GetVersion(self, dependency, platform):
+ """Return the Version information for the given dependency."""
+ return self._GetPlatformData(
+ dependency, platform, data_type='version_in_cs')
+
+ def _IsDirty(self):
+ with open(self._config_path, 'r') as fstream:
+ curr_config_data = json.load(fstream)
+ curr_config_data = curr_config_data.get('dependencies', {})
+ return self._config_data != curr_config_data
+
+ def _SetPlatformData(self, dependency, platform, data_type, data):
+ self._ValidateIsConfigWritable()
+ dependency_dict = self._config_data.get(dependency, {})
+ platform_dict = dependency_dict.get('file_info', {}).get(platform)
+ if not platform_dict:
+ raise ValueError('No platform data for platform %s on dependency %s' %
+ (platform, dependency))
+ if (data_type == 'cloud_storage_bucket' or
+ data_type == 'cloud_storage_base_folder'):
+ self._config_data[dependency][data_type] = data
+ else:
+ self._config_data[dependency]['file_info'][platform][data_type] = data
+
+ def _GetPlatformData(self, dependency, platform, data_type=None):
+ dependency_dict = self._config_data.get(dependency, {})
+ if not dependency_dict:
+ raise ValueError('Dependency %s is not in config.' % dependency)
+ platform_dict = dependency_dict.get('file_info', {}).get(platform)
+ if not platform_dict:
+ raise ValueError('No platform data for platform %s on dependency %s' %
+ (platform, dependency))
+ if data_type:
+ if (data_type == 'cloud_storage_bucket' or
+ data_type == 'cloud_storage_base_folder'):
+ return dependency_dict.get(data_type)
+ return platform_dict.get(data_type)
+ return platform_dict
+
+ def _ValidateIsConfigUpdatable(
+ self, execute_job=False, dependency=None, platform=None):
+ self._ValidateIsConfigWritable()
+ if self._IsDirty() and execute_job:
+ raise exceptions.ReadWriteError(
+ 'A change has already been made to this config. Either call without'
+ 'using the execute_job option or first call ExecuteUpdateJobs().')
+ if dependency and not self._config_data.get(dependency):
+ raise ValueError('Cannot update information because dependency %s does '
+ 'not exist.' % dependency)
+ if platform and not self._GetPlatformData(dependency, platform):
+ raise ValueError('No dependency info is available for the given '
+ 'dependency: %s' % dependency)
+
+ def _ValidateIsConfigWritable(self):
+ if not self._writable:
+ raise exceptions.ReadWriteError(
+ 'Trying to update the information from a read-only config. '
+ 'File for config: %s' % self._config_path)
+
+ @staticmethod
+ def _CloudStorageRemotePath(dependency, cs_hash, cs_base_folder):
+ cs_remote_file = '%s_%s' % (dependency, cs_hash)
+ cs_remote_path = cs_remote_file if not cs_base_folder else (
+ '%s/%s' % (cs_base_folder, cs_remote_file))
+ return cs_remote_path
+
+ @classmethod
+ def _FormatPath(cls, file_path):
+ """ Format |file_path| for the current file system.
+
+ We may be downloading files for another platform, so paths must be
+ downloadable on the current system.
+ """
+ if not file_path:
+ return file_path
+ if os.path.sep != '\\':
+ return file_path.replace('\\', os.path.sep)
+ elif os.path.sep != '/':
+ return file_path.replace('/', os.path.sep)
+ return file_path
+
+ @classmethod
+ def _WriteConfigToFile(cls, file_path, dependencies=None):
+ json_dict = cls._GetJsonDict(dependencies)
+ file_dir = os.path.dirname(file_path)
+ if not os.path.exists(file_dir):
+ os.makedirs(file_dir)
+ with open(file_path, 'w') as outfile:
+ json.dump(
+ json_dict, outfile, indent=2, sort_keys=True, separators=(',', ': '))
+ return json_dict
+
+ @classmethod
+ def _GetJsonDict(cls, dependencies=None):
+ dependencies = dependencies or {}
+ json_dict = {'config_type': cls.GetConfigType(),
+ 'dependencies': dependencies}
+ return json_dict
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/base_config_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/base_config_unittest.py
new file mode 100644
index 0000000..0dc775b
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/base_config_unittest.py
@@ -0,0 +1,1525 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# pylint: disable=unused-argument
+
+import os
+import unittest
+
+from py_utils import cloud_storage
+import mock
+from pyfakefs import fake_filesystem_unittest
+from pyfakefs import fake_filesystem
+from pyfakefs import fake_filesystem_glob
+
+import dependency_manager
+from dependency_manager import uploader
+
+
+class BaseConfigCreationAndUpdateUnittests(fake_filesystem_unittest.TestCase):
+ def setUp(self):
+ self.addTypeEqualityFunc(uploader.CloudStorageUploader,
+ uploader.CloudStorageUploader.__eq__)
+ self.setUpPyfakefs()
+ self.dependencies = {
+ 'dep1': {'cloud_storage_bucket': 'bucket1',
+ 'cloud_storage_base_folder': 'dependencies_folder',
+ 'file_info': {
+ 'plat1': {
+ 'cloud_storage_hash': 'hash11',
+ 'download_path': '../../relative/dep1/path1'},
+ 'plat2': {
+ 'cloud_storage_hash': 'hash12',
+ 'download_path': '../../relative/dep1/path2'}}},
+ 'dep2': {'cloud_storage_bucket': 'bucket2',
+ 'file_info': {
+ 'plat1': {
+ 'cloud_storage_hash': 'hash21',
+ 'download_path': '../../relative/dep2/path1'},
+ 'plat2': {
+ 'cloud_storage_hash': 'hash22',
+ 'download_path': '../../relative/dep2/path2'}}}}
+
+ self.expected_file_lines = [
+ # pylint: disable=bad-continuation
+ '{', '"config_type": "BaseConfig",', '"dependencies": {',
+ '"dep1": {', '"cloud_storage_base_folder": "dependencies_folder",',
+ '"cloud_storage_bucket": "bucket1",', '"file_info": {',
+ '"plat1": {', '"cloud_storage_hash": "hash11",',
+ '"download_path": "../../relative/dep1/path1"', '},',
+ '"plat2": {', '"cloud_storage_hash": "hash12",',
+ '"download_path": "../../relative/dep1/path2"', '}', '}', '},',
+ '"dep2": {', '"cloud_storage_bucket": "bucket2",', '"file_info": {',
+ '"plat1": {', '"cloud_storage_hash": "hash21",',
+ '"download_path": "../../relative/dep2/path1"', '},',
+ '"plat2": {', '"cloud_storage_hash": "hash22",',
+ '"download_path": "../../relative/dep2/path2"', '}', '}', '}',
+ '}', '}']
+
+ self.file_path = os.path.abspath(os.path.join(
+ 'path', 'to', 'config', 'file'))
+
+ self.new_dep_path = 'path/to/new/dep'
+ self.fs.CreateFile(self.new_dep_path)
+ self.new_dep_hash = 'A23B56B7F23E798601F'
+ self.new_dependencies = {
+ 'dep1': {'cloud_storage_bucket': 'bucket1',
+ 'cloud_storage_base_folder': 'dependencies_folder',
+ 'file_info': {
+ 'plat1': {
+ 'cloud_storage_hash': 'hash11',
+ 'download_path': '../../relative/dep1/path1'},
+ 'plat2': {
+ 'cloud_storage_hash': self.new_dep_hash,
+ 'download_path': '../../relative/dep1/path2'}}},
+ 'dep2': {'cloud_storage_bucket': 'bucket2',
+ 'file_info': {
+ 'plat1': {
+ 'cloud_storage_hash': 'hash21',
+ 'download_path': '../../relative/dep2/path1'},
+ 'plat2': {
+ 'cloud_storage_hash': 'hash22',
+ 'download_path': '../../relative/dep2/path2'}}}}
+ self.new_bucket = 'bucket1'
+ self.new_remote_path = 'dependencies_folder/dep1_%s' % self.new_dep_hash
+ self.new_pending_upload = uploader.CloudStorageUploader(
+ self.new_bucket, self.new_remote_path, self.new_dep_path)
+ self.expected_new_backup_path = '.'.join([self.new_remote_path, 'old'])
+ self.new_expected_file_lines = [
+ # pylint: disable=bad-continuation
+ '{', '"config_type": "BaseConfig",', '"dependencies": {',
+ '"dep1": {', '"cloud_storage_base_folder": "dependencies_folder",',
+ '"cloud_storage_bucket": "bucket1",', '"file_info": {',
+ '"plat1": {', '"cloud_storage_hash": "hash11",',
+ '"download_path": "../../relative/dep1/path1"', '},',
+ '"plat2": {', '"cloud_storage_hash": "%s",' % self.new_dep_hash,
+ '"download_path": "../../relative/dep1/path2"', '}', '}', '},',
+ '"dep2": {', '"cloud_storage_bucket": "bucket2",', '"file_info": {',
+ '"plat1": {', '"cloud_storage_hash": "hash21",',
+ '"download_path": "../../relative/dep2/path1"', '},',
+ '"plat2": {', '"cloud_storage_hash": "hash22",',
+ '"download_path": "../../relative/dep2/path2"', '}', '}', '}',
+ '}', '}']
+
+ self.final_dep_path = 'path/to/final/dep'
+ self.fs.CreateFile(self.final_dep_path)
+ self.final_dep_hash = 'B34662F23B56B7F98601F'
+ self.final_bucket = 'bucket2'
+ self.final_remote_path = 'dep1_%s' % self.final_dep_hash
+ self.final_pending_upload = uploader.CloudStorageUploader(
+ self.final_bucket, self.final_remote_path, self.final_dep_path)
+ self.expected_final_backup_path = '.'.join([self.final_remote_path,
+ 'old'])
+ self.final_dependencies = {
+ 'dep1': {'cloud_storage_bucket': 'bucket1',
+ 'cloud_storage_base_folder': 'dependencies_folder',
+ 'file_info': {
+ 'plat1': {
+ 'cloud_storage_hash': 'hash11',
+ 'download_path': '../../relative/dep1/path1'},
+ 'plat2': {
+ 'cloud_storage_hash': self.new_dep_hash,
+ 'download_path': '../../relative/dep1/path2'}}},
+ 'dep2': {'cloud_storage_bucket': 'bucket2',
+ 'file_info': {
+ 'plat1': {
+ 'cloud_storage_hash': self.final_dep_hash,
+ 'download_path': '../../relative/dep2/path1'},
+ 'plat2': {
+ 'cloud_storage_hash': 'hash22',
+ 'download_path': '../../relative/dep2/path2'}}}}
+ self.final_expected_file_lines = [
+ # pylint: disable=bad-continuation
+ '{', '"config_type": "BaseConfig",', '"dependencies": {',
+ '"dep1": {', '"cloud_storage_base_folder": "dependencies_folder",',
+ '"cloud_storage_bucket": "bucket1",', '"file_info": {',
+ '"plat1": {', '"cloud_storage_hash": "hash11",',
+ '"download_path": "../../relative/dep1/path1"', '},',
+ '"plat2": {', '"cloud_storage_hash": "%s",' % self.new_dep_hash,
+ '"download_path": "../../relative/dep1/path2"', '}', '}', '},',
+ '"dep2": {', '"cloud_storage_bucket": "bucket2",', '"file_info": {',
+ '"plat1": {', '"cloud_storage_hash": "%s",' % self.final_dep_hash,
+ '"download_path": "../../relative/dep2/path1"', '},',
+ '"plat2": {', '"cloud_storage_hash": "hash22",',
+ '"download_path": "../../relative/dep2/path2"', '}', '}', '}',
+ '}', '}']
+
+
+ def tearDown(self):
+ self.tearDownPyfakefs()
+
+ # Init is not meant to be overridden, so we should be mocking the
+ # base_config's json module, even in subclasses.
+ def testCreateEmptyConfig(self):
+ expected_file_lines = ['{',
+ '"config_type": "BaseConfig",',
+ '"dependencies": {}',
+ '}']
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+
+ file_module = fake_filesystem.FakeFileOpen(self.fs)
+ for line in file_module(self.file_path):
+ self.assertEqual(expected_file_lines.pop(0), line.strip())
+ self.fs.CloseOpenFile(file_module(self.file_path))
+ self.assertEqual({}, config._config_data)
+ self.assertEqual(self.file_path, config._config_path)
+
+ def testCreateEmptyConfigError(self):
+ self.assertRaises(dependency_manager.EmptyConfigError,
+ dependency_manager.BaseConfig, self.file_path)
+
+ def testCloudStorageRemotePath(self):
+ dependency = 'dep_name'
+ cs_hash = self.new_dep_hash
+ cs_base_folder = 'dependency_remote_folder'
+ expected_remote_path = '%s/%s_%s' % (cs_base_folder, dependency, cs_hash)
+ remote_path = dependency_manager.BaseConfig._CloudStorageRemotePath(
+ dependency, cs_hash, cs_base_folder)
+ self.assertEqual(expected_remote_path, remote_path)
+
+ cs_base_folder = 'dependency_remote_folder'
+ expected_remote_path = '%s_%s' % (dependency, cs_hash)
+ remote_path = dependency_manager.BaseConfig._CloudStorageRemotePath(
+ dependency, cs_hash, cs_base_folder)
+
+ def testGetEmptyJsonDict(self):
+ expected_json_dict = {'config_type': 'BaseConfig',
+ 'dependencies': {}}
+ json_dict = dependency_manager.BaseConfig._GetJsonDict()
+ self.assertEqual(expected_json_dict, json_dict)
+
+ def testGetNonEmptyJsonDict(self):
+ expected_json_dict = {"config_type": "BaseConfig",
+ "dependencies": self.dependencies}
+ json_dict = dependency_manager.BaseConfig._GetJsonDict(self.dependencies)
+ self.assertEqual(expected_json_dict, json_dict)
+
+ def testWriteEmptyConfigToFile(self):
+ expected_file_lines = ['{', '"config_type": "BaseConfig",',
+ '"dependencies": {}', '}']
+ self.assertFalse(os.path.exists(self.file_path))
+ dependency_manager.BaseConfig._WriteConfigToFile(self.file_path)
+ self.assertTrue(os.path.exists(self.file_path))
+ file_module = fake_filesystem.FakeFileOpen(self.fs)
+ for line in file_module(self.file_path):
+ self.assertEqual(expected_file_lines.pop(0), line.strip())
+ self.fs.CloseOpenFile(file_module(self.file_path))
+
+ def testWriteNonEmptyConfigToFile(self):
+ self.assertFalse(os.path.exists(self.file_path))
+ dependency_manager.BaseConfig._WriteConfigToFile(self.file_path,
+ self.dependencies)
+ self.assertTrue(os.path.exists(self.file_path))
+ expected_file_lines = list(self.expected_file_lines)
+ file_module = fake_filesystem.FakeFileOpen(self.fs)
+ for line in file_module(self.file_path):
+ self.assertEqual(expected_file_lines.pop(0), line.strip())
+ self.fs.CloseOpenFile(file_module(self.file_path))
+
+ @mock.patch('dependency_manager.uploader.cloud_storage')
+ def testExecuteUpdateJobsNoOp(self, uploader_cs_mock):
+ self.fs.CreateFile(self.file_path,
+ contents='\n'.join(self.expected_file_lines))
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+
+ self.assertFalse(config.ExecuteUpdateJobs())
+ self.assertFalse(config._IsDirty())
+ self.assertFalse(config._pending_uploads)
+ self.assertEqual(self.dependencies, config._config_data)
+ file_module = fake_filesystem.FakeFileOpen(self.fs)
+ expected_file_lines = list(self.expected_file_lines)
+ for line in file_module(self.file_path):
+ self.assertEqual(expected_file_lines.pop(0), line.strip())
+ self.fs.CloseOpenFile(file_module(self.file_path))
+
+ @mock.patch('dependency_manager.uploader.cloud_storage')
+ def testExecuteUpdateJobsFailureOnInsertNoCSCollision(
+ self, uploader_cs_mock):
+ uploader_cs_mock.Exists.return_value = False
+ uploader_cs_mock.Insert.side_effect = cloud_storage.CloudStorageError
+ self.fs.CreateFile(self.file_path,
+ contents='\n'.join(self.expected_file_lines))
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ config._config_data = self.new_dependencies.copy()
+ config._is_dirty = True
+ config._pending_uploads = [self.new_pending_upload]
+ self.assertEqual(self.new_dependencies, config._config_data)
+ self.assertTrue(config._is_dirty)
+ self.assertEqual(1, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path)]
+ expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
+ self.new_dep_path)]
+ expected_copy_calls = []
+ expected_delete_calls = []
+
+ self.assertRaises(cloud_storage.CloudStorageError,
+ config.ExecuteUpdateJobs)
+ self.assertTrue(config._is_dirty)
+ self.assertEqual(1, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ self.assertEqual(self.new_dependencies, config._config_data)
+ file_module = fake_filesystem.FakeFileOpen(self.fs)
+ expected_file_lines = list(self.expected_file_lines)
+ for line in file_module(self.file_path):
+ self.assertEqual(expected_file_lines.pop(0), line.strip())
+ self.fs.CloseOpenFile(file_module(self.file_path))
+ self.assertEqual(1, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ self.assertEqual(expected_insert_calls,
+ uploader_cs_mock.Insert.call_args_list)
+ self.assertEqual(expected_exists_calls,
+ uploader_cs_mock.Exists.call_args_list)
+ self.assertEqual(expected_copy_calls,
+ uploader_cs_mock.Copy.call_args_list)
+ self.assertEqual(expected_delete_calls,
+ uploader_cs_mock.Delete.call_args_list)
+
+ @mock.patch('dependency_manager.uploader.cloud_storage')
+ def testExecuteUpdateJobsFailureOnInsertCSCollisionForce(
+ self, uploader_cs_mock):
+ uploader_cs_mock.Exists.return_value = True
+ uploader_cs_mock.Insert.side_effect = cloud_storage.CloudStorageError
+ self.fs.CreateFile(self.file_path,
+ contents='\n'.join(self.expected_file_lines))
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ config._config_data = self.new_dependencies.copy()
+ config._is_dirty = True
+ config._pending_uploads = [self.new_pending_upload]
+ self.assertEqual(self.new_dependencies, config._config_data)
+ self.assertTrue(config._is_dirty)
+ self.assertEqual(1, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path)]
+ expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
+ self.new_dep_path)]
+ expected_copy_calls = [mock.call(self.new_bucket, self.new_bucket,
+ self.new_remote_path,
+ self.expected_new_backup_path),
+ mock.call(self.new_bucket, self.new_bucket,
+ self.expected_new_backup_path,
+ self.new_remote_path)]
+ expected_delete_calls = []
+
+ self.assertRaises(cloud_storage.CloudStorageError,
+ config.ExecuteUpdateJobs, force=True)
+ self.assertTrue(config._is_dirty)
+ self.assertEqual(1, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ self.assertEqual(self.new_dependencies, config._config_data)
+ file_module = fake_filesystem.FakeFileOpen(self.fs)
+ expected_file_lines = list(self.expected_file_lines)
+ for line in file_module(self.file_path):
+ self.assertEqual(expected_file_lines.pop(0), line.strip())
+ self.fs.CloseOpenFile(file_module(self.file_path))
+ self.assertEqual(1, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ self.assertEqual(expected_insert_calls,
+ uploader_cs_mock.Insert.call_args_list)
+ self.assertEqual(expected_exists_calls,
+ uploader_cs_mock.Exists.call_args_list)
+ self.assertEqual(expected_copy_calls,
+ uploader_cs_mock.Copy.call_args_list)
+ self.assertEqual(expected_delete_calls,
+ uploader_cs_mock.Delete.call_args_list)
+
+ @mock.patch('dependency_manager.uploader.cloud_storage')
+ def testExecuteUpdateJobsFailureOnInsertCSCollisionNoForce(
+ self, uploader_cs_mock):
+ uploader_cs_mock.Exists.return_value = True
+ uploader_cs_mock.Insert.side_effect = cloud_storage.CloudStorageError
+ self.fs.CreateFile(self.file_path,
+ contents='\n'.join(self.expected_file_lines))
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ config._config_data = self.new_dependencies.copy()
+ config._is_dirty = True
+ config._pending_uploads = [self.new_pending_upload]
+ self.assertEqual(self.new_dependencies, config._config_data)
+ self.assertTrue(config._is_dirty)
+ self.assertEqual(1, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path)]
+ expected_insert_calls = []
+ expected_copy_calls = []
+ expected_delete_calls = []
+
+ self.assertRaises(cloud_storage.CloudStorageError,
+ config.ExecuteUpdateJobs)
+ self.assertTrue(config._is_dirty)
+ self.assertEqual(1, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ self.assertEqual(self.new_dependencies, config._config_data)
+ file_module = fake_filesystem.FakeFileOpen(self.fs)
+ expected_file_lines = list(self.expected_file_lines)
+ for line in file_module(self.file_path):
+ self.assertEqual(expected_file_lines.pop(0), line.strip())
+ self.fs.CloseOpenFile(file_module(self.file_path))
+ self.assertEqual(1, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ self.assertEqual(expected_insert_calls,
+ uploader_cs_mock.Insert.call_args_list)
+ self.assertEqual(expected_exists_calls,
+ uploader_cs_mock.Exists.call_args_list)
+ self.assertEqual(expected_copy_calls,
+ uploader_cs_mock.Copy.call_args_list)
+ self.assertEqual(expected_delete_calls,
+ uploader_cs_mock.Delete.call_args_list)
+
+ @mock.patch('dependency_manager.uploader.cloud_storage')
+ def testExecuteUpdateJobsFailureOnCopy(
+ self, uploader_cs_mock):
+ uploader_cs_mock.Exists.return_value = True
+ uploader_cs_mock.Copy.side_effect = cloud_storage.CloudStorageError
+ self.fs.CreateFile(self.file_path,
+ contents='\n'.join(self.expected_file_lines))
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ config._config_data = self.new_dependencies.copy()
+ config._is_dirty = True
+ config._pending_uploads = [self.new_pending_upload]
+ self.assertEqual(self.new_dependencies, config._config_data)
+ self.assertTrue(config._is_dirty)
+ self.assertEqual(1, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path)]
+ expected_insert_calls = []
+ expected_copy_calls = [mock.call(self.new_bucket, self.new_bucket,
+ self.new_remote_path,
+ self.expected_new_backup_path)]
+ expected_delete_calls = []
+
+ self.assertRaises(cloud_storage.CloudStorageError,
+ config.ExecuteUpdateJobs, force=True)
+ self.assertTrue(config._is_dirty)
+ self.assertEqual(1, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ self.assertEqual(self.new_dependencies, config._config_data)
+ file_module = fake_filesystem.FakeFileOpen(self.fs)
+ expected_file_lines = list(self.expected_file_lines)
+ for line in file_module(self.file_path):
+ self.assertEqual(expected_file_lines.pop(0), line.strip())
+ self.fs.CloseOpenFile(file_module(self.file_path))
+ self.assertEqual(1, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ self.assertEqual(expected_insert_calls,
+ uploader_cs_mock.Insert.call_args_list)
+ self.assertEqual(expected_exists_calls,
+ uploader_cs_mock.Exists.call_args_list)
+ self.assertEqual(expected_copy_calls,
+ uploader_cs_mock.Copy.call_args_list)
+ self.assertEqual(expected_delete_calls,
+ uploader_cs_mock.Delete.call_args_list)
+
+ @mock.patch('dependency_manager.uploader.cloud_storage')
+ def testExecuteUpdateJobsFailureOnSecondInsertNoCSCollision(
+ self, uploader_cs_mock):
+ uploader_cs_mock.Exists.return_value = False
+ uploader_cs_mock.Insert.side_effect = [
+ True, cloud_storage.CloudStorageError]
+ self.fs.CreateFile(self.file_path,
+ contents='\n'.join(self.expected_file_lines))
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ config._config_data = self.new_dependencies.copy()
+ config._is_dirty = True
+ config._pending_uploads = [self.new_pending_upload,
+ self.final_pending_upload]
+ self.assertEqual(self.new_dependencies, config._config_data)
+ self.assertTrue(config._is_dirty)
+ self.assertEqual(2, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
+ expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path),
+ mock.call(self.final_bucket,
+ self.final_remote_path)]
+ expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
+ self.new_dep_path),
+ mock.call(self.final_bucket,
+ self.final_remote_path,
+ self.final_dep_path)]
+ expected_copy_calls = []
+ expected_delete_calls = [mock.call(self.new_bucket, self.new_remote_path)]
+
+ self.assertRaises(cloud_storage.CloudStorageError,
+ config.ExecuteUpdateJobs)
+ self.assertTrue(config._is_dirty)
+ self.assertEqual(2, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
+ self.assertEqual(self.new_dependencies, config._config_data)
+ file_module = fake_filesystem.FakeFileOpen(self.fs)
+ expected_file_lines = list(self.expected_file_lines)
+ for line in file_module(self.file_path):
+ self.assertEqual(expected_file_lines.pop(0), line.strip())
+ self.fs.CloseOpenFile(file_module(self.file_path))
+ self.assertEqual(expected_insert_calls,
+ uploader_cs_mock.Insert.call_args_list)
+ self.assertEqual(expected_exists_calls,
+ uploader_cs_mock.Exists.call_args_list)
+ self.assertEqual(expected_copy_calls,
+ uploader_cs_mock.Copy.call_args_list)
+ self.assertEqual(expected_delete_calls,
+ uploader_cs_mock.Delete.call_args_list)
+
+ @mock.patch('dependency_manager.uploader.cloud_storage')
+ def testExecuteUpdateJobsFailureOnSecondInsertCSCollisionForce(
+ self, uploader_cs_mock):
+ uploader_cs_mock.Exists.return_value = True
+ uploader_cs_mock.Insert.side_effect = [
+ True, cloud_storage.CloudStorageError]
+ self.fs.CreateFile(self.file_path,
+ contents='\n'.join(self.expected_file_lines))
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ config._config_data = self.new_dependencies.copy()
+ config._is_dirty = True
+ config._pending_uploads = [self.new_pending_upload,
+ self.final_pending_upload]
+ self.assertEqual(self.new_dependencies, config._config_data)
+ self.assertTrue(config._is_dirty)
+ self.assertEqual(2, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
+ expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path),
+ mock.call(self.final_bucket,
+ self.final_remote_path)]
+ expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
+ self.new_dep_path),
+ mock.call(self.final_bucket,
+ self.final_remote_path,
+ self.final_dep_path)]
+ expected_copy_calls = [mock.call(self.new_bucket, self.new_bucket,
+ self.new_remote_path,
+ self.expected_new_backup_path),
+ mock.call(self.final_bucket, self.final_bucket,
+ self.final_remote_path,
+ self.expected_final_backup_path),
+ mock.call(self.final_bucket, self.final_bucket,
+ self.expected_final_backup_path,
+ self.final_remote_path),
+ mock.call(self.new_bucket, self.new_bucket,
+ self.expected_new_backup_path,
+ self.new_remote_path)]
+ expected_delete_calls = []
+
+ self.assertRaises(cloud_storage.CloudStorageError,
+ config.ExecuteUpdateJobs, force=True)
+ self.assertTrue(config._is_dirty)
+ self.assertEqual(2, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
+ self.assertEqual(self.new_dependencies, config._config_data)
+ file_module = fake_filesystem.FakeFileOpen(self.fs)
+ expected_file_lines = list(self.expected_file_lines)
+ for line in file_module(self.file_path):
+ self.assertEqual(expected_file_lines.pop(0), line.strip())
+ self.fs.CloseOpenFile(file_module(self.file_path))
+ self.assertEqual(expected_insert_calls,
+ uploader_cs_mock.Insert.call_args_list)
+ self.assertEqual(expected_exists_calls,
+ uploader_cs_mock.Exists.call_args_list)
+ self.assertEqual(expected_copy_calls,
+ uploader_cs_mock.Copy.call_args_list)
+ self.assertEqual(expected_delete_calls,
+ uploader_cs_mock.Delete.call_args_list)
+
+ @mock.patch('dependency_manager.uploader.cloud_storage')
+ def testExecuteUpdateJobsFailureOnSecondInsertFirstCSCollisionForce(
+ self, uploader_cs_mock):
+ uploader_cs_mock.Exists.side_effect = [True, False, True]
+ uploader_cs_mock.Insert.side_effect = [
+ True, cloud_storage.CloudStorageError]
+ self.fs.CreateFile(self.file_path,
+ contents='\n'.join(self.expected_file_lines))
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ config._config_data = self.new_dependencies.copy()
+ config._is_dirty = True
+ config._pending_uploads = [self.new_pending_upload,
+ self.final_pending_upload]
+ self.assertEqual(self.new_dependencies, config._config_data)
+ self.assertTrue(config._is_dirty)
+ self.assertEqual(2, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
+ expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path),
+ mock.call(self.final_bucket,
+ self.final_remote_path)]
+ expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
+ self.new_dep_path),
+ mock.call(self.final_bucket,
+ self.final_remote_path,
+ self.final_dep_path)]
+ expected_copy_calls = [mock.call(self.new_bucket, self.new_bucket,
+ self.new_remote_path,
+ self.expected_new_backup_path),
+ mock.call(self.new_bucket, self.new_bucket,
+ self.expected_new_backup_path,
+ self.new_remote_path)]
+ expected_delete_calls = []
+
+ self.assertRaises(cloud_storage.CloudStorageError,
+ config.ExecuteUpdateJobs, force=True)
+ self.assertTrue(config._is_dirty)
+ self.assertEqual(2, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
+ self.assertEqual(self.new_dependencies, config._config_data)
+ file_module = fake_filesystem.FakeFileOpen(self.fs)
+ expected_file_lines = list(self.expected_file_lines)
+ for line in file_module(self.file_path):
+ self.assertEqual(expected_file_lines.pop(0), line.strip())
+ self.fs.CloseOpenFile(file_module(self.file_path))
+ self.assertEqual(expected_insert_calls,
+ uploader_cs_mock.Insert.call_args_list)
+ self.assertEqual(expected_exists_calls,
+ uploader_cs_mock.Exists.call_args_list)
+ self.assertEqual(expected_copy_calls,
+ uploader_cs_mock.Copy.call_args_list)
+ self.assertEqual(expected_delete_calls,
+ uploader_cs_mock.Delete.call_args_list)
+
+ @mock.patch('dependency_manager.uploader.cloud_storage')
+ def testExecuteUpdateJobsFailureOnFirstCSCollisionNoForce(
+ self, uploader_cs_mock):
+ uploader_cs_mock.Exists.side_effect = [True, False, True]
+ uploader_cs_mock.Insert.side_effect = [
+ True, cloud_storage.CloudStorageError]
+ self.fs.CreateFile(self.file_path,
+ contents='\n'.join(self.expected_file_lines))
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ config._config_data = self.new_dependencies.copy()
+ config._is_dirty = True
+ config._pending_uploads = [self.new_pending_upload,
+ self.final_pending_upload]
+ self.assertEqual(self.new_dependencies, config._config_data)
+ self.assertTrue(config._is_dirty)
+ self.assertEqual(2, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
+ expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path)]
+ expected_insert_calls = []
+ expected_copy_calls = []
+ expected_delete_calls = []
+
+ self.assertRaises(cloud_storage.CloudStorageError,
+ config.ExecuteUpdateJobs)
+ self.assertTrue(config._is_dirty)
+ self.assertEqual(2, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
+ self.assertEqual(self.new_dependencies, config._config_data)
+ file_module = fake_filesystem.FakeFileOpen(self.fs)
+ expected_file_lines = list(self.expected_file_lines)
+ for line in file_module(self.file_path):
+ self.assertEqual(expected_file_lines.pop(0), line.strip())
+ self.fs.CloseOpenFile(file_module(self.file_path))
+ self.assertEqual(expected_insert_calls,
+ uploader_cs_mock.Insert.call_args_list)
+ self.assertEqual(expected_exists_calls,
+ uploader_cs_mock.Exists.call_args_list)
+ self.assertEqual(expected_copy_calls,
+ uploader_cs_mock.Copy.call_args_list)
+ self.assertEqual(expected_delete_calls,
+ uploader_cs_mock.Delete.call_args_list)
+
+ @mock.patch('dependency_manager.uploader.cloud_storage')
+ def testExecuteUpdateJobsFailureOnSecondCopyCSCollision(
+ self, uploader_cs_mock):
+ uploader_cs_mock.Exists.return_value = True
+ uploader_cs_mock.Insert.return_value = True
+ uploader_cs_mock.Copy.side_effect = [
+ True, cloud_storage.CloudStorageError, True]
+ self.fs.CreateFile(self.file_path,
+ contents='\n'.join(self.expected_file_lines))
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ config._config_data = self.new_dependencies.copy()
+ config._is_dirty = True
+ config._pending_uploads = [self.new_pending_upload,
+ self.final_pending_upload]
+ self.assertEqual(self.new_dependencies, config._config_data)
+ self.assertTrue(config._is_dirty)
+ self.assertEqual(2, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
+ expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path),
+ mock.call(self.final_bucket,
+ self.final_remote_path)]
+ expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
+ self.new_dep_path)]
+ expected_copy_calls = [mock.call(self.new_bucket, self.new_bucket,
+ self.new_remote_path,
+ self.expected_new_backup_path),
+ mock.call(self.final_bucket, self.final_bucket,
+ self.final_remote_path,
+ self.expected_final_backup_path),
+ mock.call(self.new_bucket, self.new_bucket,
+ self.expected_new_backup_path,
+ self.new_remote_path)]
+ expected_delete_calls = []
+
+ self.assertRaises(cloud_storage.CloudStorageError,
+ config.ExecuteUpdateJobs, force=True)
+ self.assertTrue(config._is_dirty)
+ self.assertEqual(2, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
+ self.assertEqual(self.new_dependencies, config._config_data)
+ file_module = fake_filesystem.FakeFileOpen(self.fs)
+ expected_file_lines = list(self.expected_file_lines)
+ for line in file_module(self.file_path):
+ self.assertEqual(expected_file_lines.pop(0), line.strip())
+ self.fs.CloseOpenFile(file_module(self.file_path))
+ self.assertEqual(expected_insert_calls,
+ uploader_cs_mock.Insert.call_args_list)
+ self.assertEqual(expected_exists_calls,
+ uploader_cs_mock.Exists.call_args_list)
+ self.assertEqual(expected_copy_calls,
+ uploader_cs_mock.Copy.call_args_list)
+ self.assertEqual(expected_delete_calls,
+ uploader_cs_mock.Delete.call_args_list)
+
+ @mock.patch('dependency_manager.uploader.cloud_storage')
+ def testExecuteUpdateJobsFailureOnSecondCopyNoCSCollisionForce(
+ self, uploader_cs_mock):
+ uploader_cs_mock.Exists.side_effect = [False, True, False]
+ uploader_cs_mock.Copy.side_effect = cloud_storage.CloudStorageError
+ self.fs.CreateFile(self.file_path,
+ contents='\n'.join(self.expected_file_lines))
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ config._config_data = self.new_dependencies.copy()
+ config._is_dirty = True
+ config._pending_uploads = [self.new_pending_upload,
+ self.final_pending_upload]
+ self.assertEqual(self.new_dependencies, config._config_data)
+ self.assertTrue(config._is_dirty)
+ self.assertEqual(2, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
+ expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path),
+ mock.call(self.final_bucket,
+ self.final_remote_path)]
+ expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
+ self.new_dep_path)]
+ expected_copy_calls = [mock.call(self.final_bucket, self.final_bucket,
+ self.final_remote_path,
+ self.expected_final_backup_path)]
+ expected_delete_calls = [mock.call(self.new_bucket, self.new_remote_path)]
+
+ self.assertRaises(cloud_storage.CloudStorageError,
+ config.ExecuteUpdateJobs, force=True)
+ self.assertTrue(config._is_dirty)
+ self.assertEqual(2, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
+ self.assertEqual(self.new_dependencies, config._config_data)
+ file_module = fake_filesystem.FakeFileOpen(self.fs)
+ expected_file_lines = list(self.expected_file_lines)
+ for line in file_module(self.file_path):
+ self.assertEqual(expected_file_lines.pop(0), line.strip())
+ self.fs.CloseOpenFile(file_module(self.file_path))
+ self.assertEqual(expected_insert_calls,
+ uploader_cs_mock.Insert.call_args_list)
+ self.assertEqual(expected_exists_calls,
+ uploader_cs_mock.Exists.call_args_list)
+ self.assertEqual(expected_copy_calls,
+ uploader_cs_mock.Copy.call_args_list)
+ self.assertEqual(expected_delete_calls,
+ uploader_cs_mock.Delete.call_args_list)
+
+ @mock.patch('dependency_manager.uploader.cloud_storage')
+ def testExecuteUpdateJobsFailureOnSecondCopyNoCSCollisionNoForce(
+ self, uploader_cs_mock):
+ uploader_cs_mock.Exists.side_effect = [False, True, False]
+ uploader_cs_mock.Copy.side_effect = cloud_storage.CloudStorageError
+ self.fs.CreateFile(self.file_path,
+ contents='\n'.join(self.expected_file_lines))
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ config._config_data = self.new_dependencies.copy()
+ config._is_dirty = True
+ config._pending_uploads = [self.new_pending_upload,
+ self.final_pending_upload]
+ self.assertEqual(self.new_dependencies, config._config_data)
+ self.assertTrue(config._is_dirty)
+ self.assertEqual(2, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
+ expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path),
+ mock.call(self.final_bucket,
+ self.final_remote_path)]
+ expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
+ self.new_dep_path)]
+ expected_copy_calls = []
+ expected_delete_calls = [mock.call(self.new_bucket, self.new_remote_path)]
+
+ self.assertRaises(cloud_storage.CloudStorageError,
+ config.ExecuteUpdateJobs)
+ self.assertTrue(config._is_dirty)
+ self.assertEqual(2, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
+ self.assertEqual(self.new_dependencies, config._config_data)
+ file_module = fake_filesystem.FakeFileOpen(self.fs)
+ expected_file_lines = list(self.expected_file_lines)
+ for line in file_module(self.file_path):
+ self.assertEqual(expected_file_lines.pop(0), line.strip())
+ self.fs.CloseOpenFile(file_module(self.file_path))
+ self.assertEqual(expected_insert_calls,
+ uploader_cs_mock.Insert.call_args_list)
+ self.assertEqual(expected_exists_calls,
+ uploader_cs_mock.Exists.call_args_list)
+ self.assertEqual(expected_copy_calls,
+ uploader_cs_mock.Copy.call_args_list)
+ self.assertEqual(expected_delete_calls,
+ uploader_cs_mock.Delete.call_args_list)
+
+ @mock.patch('dependency_manager.uploader.cloud_storage')
+ def testExecuteUpdateJobsSuccessOnePendingDepNoCloudStorageCollision(
+ self, uploader_cs_mock):
+ uploader_cs_mock.Exists.return_value = False
+ self.fs.CreateFile(self.file_path,
+ contents='\n'.join(self.expected_file_lines))
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ config._config_data = self.new_dependencies.copy()
+ config._pending_uploads = [self.new_pending_upload]
+ self.assertEqual(self.new_dependencies, config._config_data)
+ self.assertTrue(config._IsDirty())
+ self.assertEqual(1, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path)]
+ expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
+ self.new_dep_path)]
+ expected_copy_calls = []
+ expected_delete_calls = []
+
+ self.assertTrue(config.ExecuteUpdateJobs())
+ self.assertFalse(config._IsDirty())
+ self.assertFalse(config._pending_uploads)
+ self.assertEqual(self.new_dependencies, config._config_data)
+ file_module = fake_filesystem.FakeFileOpen(self.fs)
+ expected_file_lines = list(self.new_expected_file_lines)
+ for line in file_module(self.file_path):
+ self.assertEqual(expected_file_lines.pop(0), line.strip())
+ self.fs.CloseOpenFile(file_module(self.file_path))
+ self.assertFalse(config._pending_uploads)
+ self.assertEqual(expected_insert_calls,
+ uploader_cs_mock.Insert.call_args_list)
+ self.assertEqual(expected_exists_calls,
+ uploader_cs_mock.Exists.call_args_list)
+ self.assertEqual(expected_copy_calls,
+ uploader_cs_mock.Copy.call_args_list)
+ self.assertEqual(expected_delete_calls,
+ uploader_cs_mock.Delete.call_args_list)
+
+ @mock.patch('dependency_manager.uploader.cloud_storage')
+ def testExecuteUpdateJobsSuccessOnePendingDepCloudStorageCollision(
+ self, uploader_cs_mock):
+ uploader_cs_mock.Exists.return_value = True
+ self.fs.CreateFile(self.file_path,
+ contents='\n'.join(self.expected_file_lines))
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ config._config_data = self.new_dependencies.copy()
+ config._pending_uploads = [self.new_pending_upload]
+ self.assertEqual(self.new_dependencies, config._config_data)
+ self.assertTrue(config._IsDirty())
+ self.assertEqual(1, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path)]
+ expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
+ self.new_dep_path)]
+ expected_copy_calls = [mock.call(self.new_bucket, self.new_bucket,
+ self.new_remote_path,
+ self.expected_new_backup_path)]
+
+ self.assertTrue(config.ExecuteUpdateJobs(force=True))
+ self.assertFalse(config._IsDirty())
+ self.assertFalse(config._pending_uploads)
+ self.assertEqual(self.new_dependencies, config._config_data)
+ file_module = fake_filesystem.FakeFileOpen(self.fs)
+ expected_file_lines = list(self.new_expected_file_lines)
+ for line in file_module(self.file_path):
+ self.assertEqual(expected_file_lines.pop(0), line.strip())
+ self.fs.CloseOpenFile(file_module(self.file_path))
+ self.assertFalse(config._pending_uploads)
+ self.assertEqual(expected_insert_calls,
+ uploader_cs_mock.Insert.call_args_list)
+ self.assertEqual(expected_exists_calls,
+ uploader_cs_mock.Exists.call_args_list)
+ self.assertEqual(expected_copy_calls,
+ uploader_cs_mock.Copy.call_args_list)
+
+ @mock.patch('dependency_manager.uploader.cloud_storage')
+ def testExecuteUpdateJobsErrorOnePendingDepCloudStorageCollisionNoForce(
+ self, uploader_cs_mock):
+ uploader_cs_mock.Exists.return_value = True
+ self.fs.CreateFile(self.file_path,
+ contents='\n'.join(self.expected_file_lines))
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ config._config_data = self.new_dependencies.copy()
+ config._is_dirty = True
+ config._pending_uploads = [self.new_pending_upload]
+ self.assertEqual(self.new_dependencies, config._config_data)
+ self.assertTrue(config._is_dirty)
+ self.assertEqual(1, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path)]
+ expected_insert_calls = []
+ expected_copy_calls = []
+
+ self.assertRaises(dependency_manager.CloudStorageUploadConflictError,
+ config.ExecuteUpdateJobs)
+ self.assertTrue(config._is_dirty)
+ self.assertTrue(config._pending_uploads)
+ self.assertEqual(self.new_dependencies, config._config_data)
+ self.assertEqual(1, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ file_module = fake_filesystem.FakeFileOpen(self.fs)
+ expected_file_lines = list(self.expected_file_lines)
+ for line in file_module(self.file_path):
+ self.assertEqual(expected_file_lines.pop(0), line.strip())
+ self.fs.CloseOpenFile(file_module(self.file_path))
+ self.assertEqual(expected_insert_calls,
+ uploader_cs_mock.Insert.call_args_list)
+ self.assertEqual(expected_exists_calls,
+ uploader_cs_mock.Exists.call_args_list)
+ self.assertEqual(expected_copy_calls,
+ uploader_cs_mock.Copy.call_args_list)
+
+ @mock.patch('dependency_manager.uploader.cloud_storage')
+ def testExecuteUpdateJobsSuccessMultiplePendingDepsOneCloudStorageCollision(
+ self, uploader_cs_mock):
+ uploader_cs_mock.Exists.side_effect = [False, True]
+ self.fs.CreateFile(self.file_path,
+ contents='\n'.join(self.expected_file_lines))
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ config._config_data = self.final_dependencies.copy()
+ config._pending_uploads = [self.new_pending_upload,
+ self.final_pending_upload]
+ self.assertEqual(self.final_dependencies, config._config_data)
+ self.assertTrue(config._IsDirty())
+ self.assertEqual(2, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ self.assertEqual(self.final_pending_upload, config._pending_uploads[1])
+
+ expected_exists_calls = [mock.call(self.new_bucket, self.new_remote_path),
+ mock.call(self.final_bucket,
+ self.final_remote_path)]
+ expected_insert_calls = [mock.call(self.new_bucket, self.new_remote_path,
+ self.new_dep_path),
+ mock.call(self.final_bucket,
+ self.final_remote_path,
+ self.final_dep_path)]
+ expected_copy_calls = [mock.call(self.final_bucket, self.final_bucket,
+ self.final_remote_path,
+ self.expected_final_backup_path)]
+
+ self.assertTrue(config.ExecuteUpdateJobs(force=True))
+ self.assertFalse(config._IsDirty())
+ self.assertFalse(config._pending_uploads)
+ self.assertEqual(self.final_dependencies, config._config_data)
+ file_module = fake_filesystem.FakeFileOpen(self.fs)
+ expected_file_lines = list(self.final_expected_file_lines)
+ for line in file_module(self.file_path):
+ self.assertEqual(expected_file_lines.pop(0), line.strip())
+ self.fs.CloseOpenFile(file_module(self.file_path))
+ self.assertFalse(config._pending_uploads)
+ self.assertEqual(expected_insert_calls,
+ uploader_cs_mock.Insert.call_args_list)
+ self.assertEqual(expected_exists_calls,
+ uploader_cs_mock.Exists.call_args_list)
+ self.assertEqual(expected_copy_calls,
+ uploader_cs_mock.Copy.call_args_list)
+
+ @mock.patch('dependency_manager.uploader.cloud_storage')
+ def testUpdateCloudStorageDependenciesReadOnlyConfig(
+ self, uploader_cs_mock):
+ self.fs.CreateFile(self.file_path,
+ contents='\n'.join(self.expected_file_lines))
+ config = dependency_manager.BaseConfig(self.file_path)
+ with self.assertRaises(dependency_manager.ReadWriteError):
+ config.AddCloudStorageDependencyUpdateJob(
+ 'dep', 'plat', 'path')
+ with self.assertRaises(dependency_manager.ReadWriteError):
+ config.AddCloudStorageDependencyUpdateJob(
+ 'dep', 'plat', 'path', version='1.2.3')
+ with self.assertRaises(dependency_manager.ReadWriteError):
+ config.AddCloudStorageDependencyUpdateJob(
+ 'dep', 'plat', 'path', execute_job=False)
+ with self.assertRaises(dependency_manager.ReadWriteError):
+ config.AddCloudStorageDependencyUpdateJob(
+ 'dep', 'plat', 'path', version='1.2.3', execute_job=False)
+
+ @mock.patch('dependency_manager.uploader.cloud_storage')
+ def testUpdateCloudStorageDependenciesMissingDependency(
+ self, uploader_cs_mock):
+ self.fs.CreateFile(self.file_path,
+ contents='\n'.join(self.expected_file_lines))
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ self.assertRaises(ValueError, config.AddCloudStorageDependencyUpdateJob,
+ 'dep', 'plat', 'path')
+ self.assertRaises(ValueError, config.AddCloudStorageDependencyUpdateJob,
+ 'dep', 'plat', 'path', version='1.2.3')
+ self.assertRaises(ValueError, config.AddCloudStorageDependencyUpdateJob,
+ 'dep', 'plat', 'path', execute_job=False)
+ self.assertRaises(ValueError, config.AddCloudStorageDependencyUpdateJob,
+ 'dep', 'plat', 'path', version='1.2.3', execute_job=False)
+
+ @mock.patch('dependency_manager.uploader.cloud_storage')
+ @mock.patch('dependency_manager.base_config.cloud_storage')
+ def testUpdateCloudStorageDependenciesWrite(
+ self, base_config_cs_mock, uploader_cs_mock):
+ expected_dependencies = self.dependencies
+ self.fs.CreateFile(self.file_path,
+ contents='\n'.join(self.expected_file_lines))
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ self.assertFalse(config._IsDirty())
+ self.assertEqual(expected_dependencies, config._config_data)
+
+ base_config_cs_mock.CalculateHash.return_value = self.new_dep_hash
+ uploader_cs_mock.Exists.return_value = False
+ expected_dependencies = self.new_dependencies
+ config.AddCloudStorageDependencyUpdateJob(
+ 'dep1', 'plat2', self.new_dep_path, execute_job=True)
+ self.assertFalse(config._IsDirty())
+ self.assertFalse(config._pending_uploads)
+ self.assertEqual(expected_dependencies, config._config_data)
+ # check that file contents has been updated
+ file_module = fake_filesystem.FakeFileOpen(self.fs)
+ expected_file_lines = list(self.new_expected_file_lines)
+ for line in file_module(self.file_path):
+ self.assertEqual(expected_file_lines.pop(0), line.strip())
+ self.fs.CloseOpenFile(file_module(self.file_path))
+
+ expected_dependencies = self.final_dependencies
+ base_config_cs_mock.CalculateHash.return_value = self.final_dep_hash
+ config.AddCloudStorageDependencyUpdateJob(
+ 'dep2', 'plat1', self.final_dep_path, execute_job=True)
+ self.assertFalse(config._IsDirty())
+ self.assertFalse(config._pending_uploads)
+ self.assertEqual(expected_dependencies, config._config_data)
+ # check that file contents has been updated
+ expected_file_lines = list(self.final_expected_file_lines)
+ file_module = fake_filesystem.FakeFileOpen(self.fs)
+ for line in file_module(self.file_path):
+ self.assertEqual(expected_file_lines.pop(0), line.strip())
+ self.fs.CloseOpenFile(file_module(self.file_path))
+
+ @mock.patch('dependency_manager.uploader.cloud_storage')
+ @mock.patch('dependency_manager.base_config.cloud_storage')
+ def testUpdateCloudStorageDependenciesNoWrite(
+ self, base_config_cs_mock, uploader_cs_mock):
+ self.fs.CreateFile(self.file_path,
+ contents='\n'.join(self.expected_file_lines))
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+
+ self.assertRaises(ValueError, config.AddCloudStorageDependencyUpdateJob,
+ 'dep', 'plat', 'path')
+ self.assertRaises(ValueError, config.AddCloudStorageDependencyUpdateJob,
+ 'dep', 'plat', 'path', version='1.2.3')
+
+ expected_dependencies = self.dependencies
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ self.assertFalse(config._IsDirty())
+ self.assertFalse(config._pending_uploads)
+ self.assertEqual(expected_dependencies, config._config_data)
+
+ base_config_cs_mock.CalculateHash.return_value = self.new_dep_hash
+ uploader_cs_mock.Exists.return_value = False
+ expected_dependencies = self.new_dependencies
+ config.AddCloudStorageDependencyUpdateJob(
+ 'dep1', 'plat2', self.new_dep_path, execute_job=False)
+ self.assertTrue(config._IsDirty())
+ self.assertEqual(1, len(config._pending_uploads))
+ self.assertEqual(self.new_pending_upload, config._pending_uploads[0])
+ self.assertEqual(expected_dependencies, config._config_data)
+ # check that file contents have not been updated.
+ expected_file_lines = list(self.expected_file_lines)
+ file_module = fake_filesystem.FakeFileOpen(self.fs)
+ for line in file_module(self.file_path):
+ self.assertEqual(expected_file_lines.pop(0), line.strip())
+ self.fs.CloseOpenFile(file_module(self.file_path))
+
+ expected_dependencies = self.final_dependencies
+ base_config_cs_mock.CalculateHash.return_value = self.final_dep_hash
+ config.AddCloudStorageDependencyUpdateJob(
+ 'dep2', 'plat1', self.final_dep_path, execute_job=False)
+ self.assertTrue(config._IsDirty())
+ self.assertEqual(expected_dependencies, config._config_data)
+ # check that file contents have not been updated.
+ expected_file_lines = list(self.expected_file_lines)
+ file_module = fake_filesystem.FakeFileOpen(self.fs)
+ for line in file_module(self.file_path):
+ self.assertEqual(expected_file_lines.pop(0), line.strip())
+ self.fs.CloseOpenFile(file_module(self.file_path))
+
+
+class BaseConfigDataManipulationUnittests(fake_filesystem_unittest.TestCase):
+ def setUp(self):
+ self.addTypeEqualityFunc(uploader.CloudStorageUploader,
+ uploader.CloudStorageUploader.__eq__)
+ self.setUpPyfakefs()
+
+ self.cs_bucket = 'bucket1'
+ self.cs_base_folder = 'dependencies_folder'
+ self.cs_hash = 'hash12'
+ self.download_path = '../../relative/dep1/path2'
+ self.local_paths = ['../../../relative/local/path21',
+ '../../../relative/local/path22']
+ self.platform_dict = {'cloud_storage_hash': self.cs_hash,
+ 'download_path': self.download_path,
+ 'local_paths': self.local_paths}
+ self.dependencies = {
+ 'dep1': {
+ 'cloud_storage_bucket': self.cs_bucket,
+ 'cloud_storage_base_folder': self.cs_base_folder,
+ 'file_info': {
+ 'plat1': {
+ 'cloud_storage_hash': 'hash11',
+ 'download_path': '../../relative/dep1/path1',
+ 'local_paths': ['../../../relative/local/path11',
+ '../../../relative/local/path12']},
+ 'plat2': self.platform_dict
+ }
+ },
+ 'dep2': {
+ 'cloud_storage_bucket': 'bucket2',
+ 'file_info': {
+ 'plat1': {
+ 'cloud_storage_hash': 'hash21',
+ 'download_path': '../../relative/dep2/path1',
+ 'local_paths': ['../../../relative/local/path31',
+ '../../../relative/local/path32']},
+ 'plat2': {
+ 'cloud_storage_hash': 'hash22',
+ 'download_path': '../../relative/dep2/path2'}}}}
+
+ self.file_path = os.path.abspath(os.path.join(
+ 'path', 'to', 'config', 'file'))
+
+
+ self.expected_file_lines = [
+ # pylint: disable=bad-continuation
+ '{', '"config_type": "BaseConfig",', '"dependencies": {',
+ '"dep1": {', '"cloud_storage_base_folder": "dependencies_folder",',
+ '"cloud_storage_bucket": "bucket1",', '"file_info": {',
+ '"plat1": {', '"cloud_storage_hash": "hash11",',
+ '"download_path": "../../relative/dep1/path1",',
+ '"local_paths": [', '"../../../relative/local/path11",',
+ '"../../../relative/local/path12"', ']', '},',
+ '"plat2": {', '"cloud_storage_hash": "hash12",',
+ '"download_path": "../../relative/dep1/path2",',
+ '"local_paths": [', '"../../../relative/local/path21",',
+ '"../../../relative/local/path22"', ']',
+ '}', '}', '},',
+ '"dep2": {', '"cloud_storage_bucket": "bucket2",', '"file_info": {',
+ '"plat1": {', '"cloud_storage_hash": "hash21",',
+ '"download_path": "../../relative/dep2/path1",',
+ '"local_paths": [', '"../../../relative/local/path31",',
+ '"../../../relative/local/path32"', ']', '},',
+ '"plat2": {', '"cloud_storage_hash": "hash22",',
+ '"download_path": "../../relative/dep2/path2"', '}', '}', '}',
+ '}', '}']
+ self.fs.CreateFile(self.file_path,
+ contents='\n'.join(self.expected_file_lines))
+
+
+ def testSetPlatformDataFailureNotWritable(self):
+ config = dependency_manager.BaseConfig(self.file_path)
+ self.assertRaises(
+ dependency_manager.ReadWriteError, config._SetPlatformData,
+ 'dep1', 'plat1', 'cloud_storage_bucket', 'new_bucket')
+ self.assertEqual(self.dependencies, config._config_data)
+
+ def testSetPlatformDataFailure(self):
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ self.assertRaises(ValueError, config._SetPlatformData, 'missing_dep',
+ 'plat2', 'cloud_storage_bucket', 'new_bucket')
+ self.assertEqual(self.dependencies, config._config_data)
+ self.assertRaises(ValueError, config._SetPlatformData, 'dep1',
+ 'missing_plat', 'cloud_storage_bucket', 'new_bucket')
+ self.assertEqual(self.dependencies, config._config_data)
+
+
+ def testSetPlatformDataCloudStorageBucketSuccess(self):
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ updated_cs_dependencies = {
+ 'dep1': {'cloud_storage_bucket': 'new_bucket',
+ 'cloud_storage_base_folder': 'dependencies_folder',
+ 'file_info': {
+ 'plat1': {
+ 'cloud_storage_hash': 'hash11',
+ 'download_path': '../../relative/dep1/path1',
+ 'local_paths': ['../../../relative/local/path11',
+ '../../../relative/local/path12']},
+ 'plat2': {
+ 'cloud_storage_hash': 'hash12',
+ 'download_path': '../../relative/dep1/path2',
+ 'local_paths': ['../../../relative/local/path21',
+ '../../../relative/local/path22']}}},
+ 'dep2': {'cloud_storage_bucket': 'bucket2',
+ 'file_info': {
+ 'plat1': {
+ 'cloud_storage_hash': 'hash21',
+ 'download_path': '../../relative/dep2/path1',
+ 'local_paths': ['../../../relative/local/path31',
+ '../../../relative/local/path32']},
+ 'plat2': {
+ 'cloud_storage_hash': 'hash22',
+ 'download_path': '../../relative/dep2/path2'}}}}
+ config._SetPlatformData('dep1', 'plat2', 'cloud_storage_bucket',
+ 'new_bucket')
+ self.assertEqual(updated_cs_dependencies, config._config_data)
+
+ def testSetPlatformDataCloudStorageBaseFolderSuccess(self):
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ updated_cs_dependencies = {
+ 'dep1': {'cloud_storage_bucket': 'bucket1',
+ 'cloud_storage_base_folder': 'new_dependencies_folder',
+ 'file_info': {
+ 'plat1': {
+ 'cloud_storage_hash': 'hash11',
+ 'download_path': '../../relative/dep1/path1',
+ 'local_paths': ['../../../relative/local/path11',
+ '../../../relative/local/path12']},
+ 'plat2': {
+ 'cloud_storage_hash': 'hash12',
+ 'download_path': '../../relative/dep1/path2',
+ 'local_paths': ['../../../relative/local/path21',
+ '../../../relative/local/path22']}}},
+ 'dep2': {'cloud_storage_bucket': 'bucket2',
+ 'file_info': {
+ 'plat1': {
+ 'cloud_storage_hash': 'hash21',
+ 'download_path': '../../relative/dep2/path1',
+ 'local_paths': ['../../../relative/local/path31',
+ '../../../relative/local/path32']},
+ 'plat2': {
+ 'cloud_storage_hash': 'hash22',
+ 'download_path': '../../relative/dep2/path2'}}}}
+ config._SetPlatformData('dep1', 'plat2', 'cloud_storage_base_folder',
+ 'new_dependencies_folder')
+ self.assertEqual(updated_cs_dependencies, config._config_data)
+
+ def testSetPlatformDataHashSuccess(self):
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ updated_cs_dependencies = {
+ 'dep1': {'cloud_storage_bucket': 'bucket1',
+ 'cloud_storage_base_folder': 'dependencies_folder',
+ 'file_info': {
+ 'plat1': {
+ 'cloud_storage_hash': 'hash11',
+ 'download_path': '../../relative/dep1/path1',
+ 'local_paths': ['../../../relative/local/path11',
+ '../../../relative/local/path12']},
+ 'plat2': {
+ 'cloud_storage_hash': 'new_hash',
+ 'download_path': '../../relative/dep1/path2',
+ 'local_paths': ['../../../relative/local/path21',
+ '../../../relative/local/path22']}}},
+ 'dep2': {'cloud_storage_bucket': 'bucket2',
+ 'file_info': {
+ 'plat1': {
+ 'cloud_storage_hash': 'hash21',
+ 'download_path': '../../relative/dep2/path1',
+ 'local_paths': ['../../../relative/local/path31',
+ '../../../relative/local/path32']},
+ 'plat2': {
+ 'cloud_storage_hash': 'hash22',
+ 'download_path': '../../relative/dep2/path2'}}}}
+ config._SetPlatformData('dep1', 'plat2', 'cloud_storage_hash',
+ 'new_hash')
+ self.assertEqual(updated_cs_dependencies, config._config_data)
+
+ def testSetPlatformDataDownloadPathSuccess(self):
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ updated_cs_dependencies = {
+ 'dep1': {'cloud_storage_bucket': 'bucket1',
+ 'cloud_storage_base_folder': 'dependencies_folder',
+ 'file_info': {
+ 'plat1': {
+ 'cloud_storage_hash': 'hash11',
+ 'download_path': '../../relative/dep1/path1',
+ 'local_paths': ['../../../relative/local/path11',
+ '../../../relative/local/path12']},
+ 'plat2': {
+ 'cloud_storage_hash': 'hash12',
+ 'download_path': '../../new/dep1/path2',
+ 'local_paths': ['../../../relative/local/path21',
+ '../../../relative/local/path22']}}},
+ 'dep2': {'cloud_storage_bucket': 'bucket2',
+ 'file_info': {
+ 'plat1': {
+ 'cloud_storage_hash': 'hash21',
+ 'download_path': '../../relative/dep2/path1',
+ 'local_paths': ['../../../relative/local/path31',
+ '../../../relative/local/path32']},
+ 'plat2': {
+ 'cloud_storage_hash': 'hash22',
+ 'download_path': '../../relative/dep2/path2'}}}}
+ config._SetPlatformData('dep1', 'plat2', 'download_path',
+ '../../new/dep1/path2')
+ self.assertEqual(updated_cs_dependencies, config._config_data)
+
+ def testSetPlatformDataLocalPathSuccess(self):
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ updated_cs_dependencies = {
+ 'dep1': {'cloud_storage_bucket': 'bucket1',
+ 'cloud_storage_base_folder': 'dependencies_folder',
+ 'file_info': {
+ 'plat1': {
+ 'cloud_storage_hash': 'hash11',
+ 'download_path': '../../relative/dep1/path1',
+ 'local_paths': ['../../../relative/local/path11',
+ '../../../relative/local/path12']},
+ 'plat2': {
+ 'cloud_storage_hash': 'hash12',
+ 'download_path': '../../relative/dep1/path2',
+ 'local_paths': ['../../new/relative/local/path21',
+ '../../new/relative/local/path22']}}},
+ 'dep2': {'cloud_storage_bucket': 'bucket2',
+ 'file_info': {
+ 'plat1': {
+ 'cloud_storage_hash': 'hash21',
+ 'download_path': '../../relative/dep2/path1',
+ 'local_paths': ['../../../relative/local/path31',
+ '../../../relative/local/path32']},
+ 'plat2': {
+ 'cloud_storage_hash': 'hash22',
+ 'download_path': '../../relative/dep2/path2'}}}}
+ config._SetPlatformData('dep1', 'plat2', 'local_paths',
+ ['../../new/relative/local/path21',
+ '../../new/relative/local/path22'])
+ self.assertEqual(updated_cs_dependencies, config._config_data)
+
+ def testGetPlatformDataFailure(self):
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ self.assertRaises(ValueError, config._GetPlatformData, 'missing_dep',
+ 'plat2', 'cloud_storage_bucket')
+ self.assertEqual(self.dependencies, config._config_data)
+ self.assertRaises(ValueError, config._GetPlatformData, 'dep1',
+ 'missing_plat', 'cloud_storage_bucket')
+ self.assertEqual(self.dependencies, config._config_data)
+
+ def testGetPlatformDataDictSuccess(self):
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ self.assertEqual(self.platform_dict,
+ config._GetPlatformData('dep1', 'plat2'))
+ self.assertEqual(self.dependencies, config._config_data)
+
+ def testGetPlatformDataCloudStorageBucketSuccess(self):
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ self.assertEqual(self.cs_bucket, config._GetPlatformData(
+ 'dep1', 'plat2', 'cloud_storage_bucket'))
+ self.assertEqual(self.dependencies, config._config_data)
+
+ def testGetPlatformDataCloudStorageBaseFolderSuccess(self):
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ self.assertEqual(self.cs_base_folder, config._GetPlatformData(
+ 'dep1', 'plat2', 'cloud_storage_base_folder'))
+ self.assertEqual(self.dependencies, config._config_data)
+
+ def testGetPlatformDataHashSuccess(self):
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ self.assertEqual(self.cs_hash, config._GetPlatformData(
+ 'dep1', 'plat2', 'cloud_storage_hash'))
+ self.assertEqual(self.dependencies, config._config_data)
+
+ def testGetPlatformDataDownloadPathSuccess(self):
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ self.assertEqual(self.download_path, config._GetPlatformData(
+ 'dep1', 'plat2', 'download_path'))
+ self.assertEqual(self.dependencies, config._config_data)
+
+ def testGetPlatformDataLocalPathSuccess(self):
+ config = dependency_manager.BaseConfig(self.file_path, writable=True)
+ self.assertEqual(self.local_paths, config._GetPlatformData(
+ 'dep1', 'plat2', 'local_paths'))
+ self.assertEqual(self.dependencies, config._config_data)
+
+class BaseConfigTest(unittest.TestCase):
+ """ Subclassable unittests for BaseConfig.
+ For subclasses: override setUp, GetConfigDataFromDict,
+ and EndToEndExpectedConfigData as needed.
+
+ setUp must set the following properties:
+ self.config_type: String returnedd from GetConfigType in config subclass.
+ self.config_class: the class for the config subclass.
+ self.config_module: importable module for the config subclass.
+ self.empty_dict: expected dictionary for an empty config, as it would be
+ stored in a json file.
+ self.one_dep_dict: example dictionary for a config with one dependency,
+ as it would be stored in a json file.
+ """
+ def setUp(self):
+ self.config_type = 'BaseConfig'
+ self.config_class = dependency_manager.BaseConfig
+ self.config_module = 'dependency_manager.base_config'
+
+ self.empty_dict = {'config_type': self.config_type,
+ 'dependencies': {}}
+
+ dependency_dict = {
+ 'dep': {
+ 'cloud_storage_base_folder': 'cs_base_folder1',
+ 'cloud_storage_bucket': 'bucket1',
+ 'file_info': {
+ 'plat1_arch1': {
+ 'cloud_storage_hash': 'hash111',
+ 'download_path': 'download_path111',
+ 'cs_remote_path': 'cs_path111',
+ 'version_in_cs': 'version_111',
+ 'local_paths': ['local_path1110', 'local_path1111']
+ },
+ 'plat1_arch2': {
+ 'cloud_storage_hash': 'hash112',
+ 'download_path': 'download_path112',
+ 'cs_remote_path': 'cs_path112',
+ 'local_paths': ['local_path1120', 'local_path1121']
+ },
+ 'win_arch1': {
+ 'cloud_storage_hash': 'hash1w1',
+ 'download_path': 'download\\path\\1w1',
+ 'cs_remote_path': 'cs_path1w1',
+ 'local_paths': ['local\\path\\1w10', 'local\\path\\1w11']
+ },
+ 'all_the_variables': {
+ 'cloud_storage_hash': 'hash111',
+ 'download_path': 'download_path111',
+ 'cs_remote_path': 'cs_path111',
+ 'version_in_cs': 'version_111',
+ 'path_within_archive': 'path/within/archive',
+ 'local_paths': ['local_path1110', 'local_path1111']
+ }
+ }
+ }
+ }
+ self.one_dep_dict = {'config_type': self.config_type,
+ 'dependencies': dependency_dict}
+
+ def GetConfigDataFromDict(self, config_dict):
+ return config_dict.get('dependencies', {})
+
+ @mock.patch('os.path')
+ @mock.patch('__builtin__.open')
+ def testInitBaseProperties(self, open_mock, path_mock):
+ # Init is not meant to be overridden, so we should be mocking the
+ # base_config's json module, even in subclasses.
+ json_module = 'dependency_manager.base_config.json'
+ with mock.patch(json_module) as json_mock:
+ json_mock.load.return_value = self.empty_dict.copy()
+ config = self.config_class('file_path')
+ self.assertEqual('file_path', config._config_path)
+ self.assertEqual(self.config_type, config.GetConfigType())
+ self.assertEqual(self.GetConfigDataFromDict(self.empty_dict),
+ config._config_data)
+
+
+ @mock.patch('dependency_manager.dependency_info.DependencyInfo')
+ @mock.patch('os.path')
+ @mock.patch('__builtin__.open')
+ def testInitWithDependencies(self, open_mock, path_mock, dep_info_mock):
+ # Init is not meant to be overridden, so we should be mocking the
+ # base_config's json module, even in subclasses.
+ json_module = 'dependency_manager.base_config.json'
+ with mock.patch(json_module) as json_mock:
+ json_mock.load.return_value = self.one_dep_dict
+ config = self.config_class('file_path')
+ self.assertEqual('file_path', config._config_path)
+ self.assertEqual(self.config_type, config.GetConfigType())
+ self.assertEqual(self.GetConfigDataFromDict(self.one_dep_dict),
+ config._config_data)
+
+ def testFormatPath(self):
+ self.assertEqual(None, self.config_class._FormatPath(None))
+ self.assertEqual('', self.config_class._FormatPath(''))
+ self.assertEqual('some_string',
+ self.config_class._FormatPath('some_string'))
+
+ expected_path = os.path.join('some', 'file', 'path')
+ self.assertEqual(expected_path,
+ self.config_class._FormatPath('some/file/path'))
+ self.assertEqual(expected_path,
+ self.config_class._FormatPath('some\\file\\path'))
+
+ @mock.patch('dependency_manager.base_config.json')
+ @mock.patch('dependency_manager.dependency_info.DependencyInfo')
+ @mock.patch('os.path.exists')
+ @mock.patch('__builtin__.open')
+ def testIterDependenciesError(
+ self, open_mock, exists_mock, dep_info_mock, json_mock):
+ # Init is not meant to be overridden, so we should be mocking the
+ # base_config's json module, even in subclasses.
+ json_mock.load.return_value = self.one_dep_dict
+ config = self.config_class('file_path', writable=True)
+ self.assertEqual(self.GetConfigDataFromDict(self.one_dep_dict),
+ config._config_data)
+ self.assertTrue(config._writable)
+ with self.assertRaises(dependency_manager.ReadWriteError):
+ for _ in config.IterDependencyInfo():
+ pass
+
+ @mock.patch('dependency_manager.base_config.json')
+ @mock.patch('dependency_manager.dependency_info.DependencyInfo')
+ @mock.patch('os.path.exists')
+ @mock.patch('__builtin__.open')
+ def testIterDependencies(
+ self, open_mock, exists_mock, dep_info_mock, json_mock):
+ json_mock.load.return_value = self.one_dep_dict
+ config = self.config_class('file_path')
+ self.assertEqual(self.GetConfigDataFromDict(self.one_dep_dict),
+ config._config_data)
+ expected_dep_info = ['dep_info0', 'dep_info1', 'dep_info2']
+ dep_info_mock.side_effect = expected_dep_info
+ expected_calls = [
+ mock.call('dep', 'plat1_arch1', 'file_path', cs_bucket='bucket1',
+ cs_hash='hash111', download_path='download_path111',
+ cs_remote_path='cs_path111',
+ local_paths=['local_path1110', 'local_path1111']),
+ mock.call('dep', 'plat1_arch1', 'file_path', cs_bucket='bucket1',
+ cs_hash='hash112', download_path='download_path112',
+ cs_remote_path='cs_path112',
+ local_paths=['local_path1120', 'local_path1121']),
+ mock.call('dep', 'win_arch1', 'file_path', cs_bucket='bucket1',
+ cs_hash='hash1w1',
+ download_path=os.path.join('download', 'path', '1w1'),
+ cs_remote_path='cs_path1w1',
+ local_paths=[os.path.join('download', 'path', '1w10'),
+ os.path.join('download', 'path', '1w11')])]
+ deps_seen = []
+ for dep_info in config.IterDependencyInfo():
+ deps_seen.append(dep_info)
+ dep_info_mock.assert_call_args(expected_calls)
+ self.assertItemsEqual(expected_dep_info, deps_seen)
+
+ @mock.patch('dependency_manager.base_config.json')
+ @mock.patch('os.path.exists')
+ @mock.patch('__builtin__.open')
+ def testIterDependenciesStaleGlob(self, open_mock, exists_mock, json_mock):
+ json_mock.load.return_value = self.one_dep_dict
+ config = self.config_class('file_path')
+
+ abspath = os.path.abspath
+ should_match = set(map(abspath, [
+ 'dep_all_the_variables_0123456789abcdef0123456789abcdef01234567',
+ 'dep_all_the_variables_123456789abcdef0123456789abcdef012345678']))
+ # Not testing case changes, because Windows is case-insensitive.
+ should_not_match = set(map(abspath, [
+ # A configuration that doesn't unzip shouldn't clear any stale unzips.
+ 'dep_plat1_arch1_0123456789abcdef0123456789abcdef01234567',
+ # "Hash" component less than 40 characters (not a valid SHA1 hash).
+ 'dep_all_the_variables_0123456789abcdef0123456789abcdef0123456',
+ # "Hash" component greater than 40 characters (not a valid SHA1 hash).
+ 'dep_all_the_variables_0123456789abcdef0123456789abcdef012345678',
+ # "Hash" component not comprised of hex (not a valid SHA1 hash).
+ 'dep_all_the_variables_0123456789gggggg0123456789gggggg01234567']))
+
+ # Create a fake filesystem just for glob to use
+ fake_fs = fake_filesystem.FakeFilesystem()
+ fake_glob = fake_filesystem_glob.FakeGlobModule(fake_fs)
+ for stale_dir in set.union(should_match, should_not_match):
+ fake_fs.CreateDirectory(stale_dir)
+ fake_fs.CreateFile(os.path.join(stale_dir, 'some_file'))
+
+ for dep_info in config.IterDependencyInfo():
+ if dep_info.platform == 'all_the_variables':
+ cs_info = dep_info.cloud_storage_info
+ actual_glob = cs_info._archive_info._stale_unzip_path_glob
+ actual_matches = set(fake_glob.glob(actual_glob))
+ self.assertItemsEqual(should_match, actual_matches)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/cloud_storage_info.py b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/cloud_storage_info.py
new file mode 100644
index 0000000..376c311
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/cloud_storage_info.py
@@ -0,0 +1,110 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import errno
+import os
+import stat
+
+from py_utils import cloud_storage
+
+from dependency_manager import exceptions
+
+class CloudStorageInfo(object):
+ def __init__(self, cs_bucket, cs_hash, download_path, cs_remote_path,
+ version_in_cs=None, archive_info=None):
+ """ Container for the information needed to download a dependency from
+ cloud storage.
+
+ Args:
+ cs_bucket: The cloud storage bucket the dependency is located in.
+ cs_hash: The hash of the file stored in cloud storage.
+ download_path: Where the file should be downloaded to.
+ cs_remote_path: Where the file is stored in the cloud storage bucket.
+ version_in_cs: The version of the file stored in cloud storage.
+ archive_info: An instance of ArchiveInfo if this dependency is an
+ archive. Else None.
+ """
+ self._download_path = download_path
+ self._cs_remote_path = cs_remote_path
+ self._cs_bucket = cs_bucket
+ self._cs_hash = cs_hash
+ self._version_in_cs = version_in_cs
+ self._archive_info = archive_info
+ if not self._has_minimum_data:
+ raise ValueError(
+ 'Not enough information specified to initialize a cloud storage info.'
+ ' %s' % self)
+
+ def DependencyExistsInCloudStorage(self):
+ return cloud_storage.Exists(self._cs_bucket, self._cs_remote_path)
+
+ def GetRemotePath(self):
+ """Gets the path to a downloaded version of the dependency.
+
+ May not download the file if it has already been downloaded.
+ Will unzip the downloaded file if a non-empty archive_info was passed in at
+ init.
+
+ Returns: A path to an executable that was stored in cloud_storage, or None
+ if not found.
+
+ Raises:
+ CredentialsError: If cloud_storage credentials aren't configured.
+ PermissionError: If cloud_storage credentials are configured, but not
+ with an account that has permission to download the needed file.
+ NotFoundError: If the needed file does not exist where expected in
+ cloud_storage or the downloaded zip file.
+ ServerError: If an internal server error is hit while downloading the
+ needed file.
+ CloudStorageError: If another error occured while downloading the remote
+ path.
+ FileNotFoundError: If the download was otherwise unsuccessful.
+ """
+ if not self._has_minimum_data:
+ return None
+
+ download_dir = os.path.dirname(self._download_path)
+ if not os.path.exists(download_dir):
+ try:
+ os.makedirs(download_dir)
+ except OSError as e:
+ # The logic above is racy, and os.makedirs will raise an OSError if
+ # the directory exists.
+ if e.errno != errno.EEXIST:
+ raise
+
+ dependency_path = self._download_path
+ cloud_storage.GetIfHashChanged(
+ self._cs_remote_path, self._download_path, self._cs_bucket,
+ self._cs_hash)
+ if not os.path.exists(dependency_path):
+ raise exceptions.FileNotFoundError(dependency_path)
+
+ if self.has_archive_info:
+ dependency_path = self._archive_info.GetUnzippedPath()
+ else:
+ mode = os.stat(dependency_path).st_mode
+ os.chmod(dependency_path, mode | stat.S_IXUSR)
+ return os.path.abspath(dependency_path)
+
+ @property
+ def version_in_cs(self):
+ return self._version_in_cs
+
+ @property
+ def _has_minimum_data(self):
+ return all([self._cs_bucket, self._cs_remote_path, self._download_path,
+ self._cs_hash])
+
+
+ @property
+ def has_archive_info(self):
+ return bool(self._archive_info)
+
+ def __repr__(self):
+ return (
+ 'CloudStorageInfo(download_path=%s, cs_remote_path=%s, cs_bucket=%s, '
+ 'cs_hash=%s, version_in_cs=%s, archive_info=%s)' % (
+ self._download_path, self._cs_remote_path, self._cs_bucket,
+ self._cs_hash, self._version_in_cs, self._archive_info))
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/cloud_storage_info_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/cloud_storage_info_unittest.py
new file mode 100644
index 0000000..699cd50
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/cloud_storage_info_unittest.py
@@ -0,0 +1,233 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import stat
+import unittest
+
+import mock
+from pyfakefs import fake_filesystem_unittest
+from py_utils import cloud_storage
+
+from dependency_manager import archive_info
+from dependency_manager import cloud_storage_info
+from dependency_manager import exceptions
+
+class CloudStorageInfoTest(unittest.TestCase):
+ def testInitCloudStorageInfoErrors(self):
+ # Must specify cloud storage information atomically.
+ self.assertRaises(ValueError, cloud_storage_info.CloudStorageInfo,
+ None, None, None, None)
+ self.assertRaises(ValueError, cloud_storage_info.CloudStorageInfo,
+ 'cs_bucket', None, None, None)
+ self.assertRaises(ValueError, cloud_storage_info.CloudStorageInfo,
+ None, 'cs_hash', None, None)
+ self.assertRaises(ValueError, cloud_storage_info.CloudStorageInfo,
+ None, None, 'download_path', None)
+ self.assertRaises(ValueError, cloud_storage_info.CloudStorageInfo,
+ None, None, None, 'cs_remote_path')
+ self.assertRaises(ValueError, cloud_storage_info.CloudStorageInfo,
+ None, 'cs_hash', 'download_path', 'cs_remote_path')
+ self.assertRaises(ValueError, cloud_storage_info.CloudStorageInfo,
+ 'cs_bucket', None, 'download_path', 'cs_remote_path')
+ self.assertRaises(ValueError, cloud_storage_info.CloudStorageInfo,
+ 'cs_bucket', 'cs_hash', None, 'cs_remote_path')
+ self.assertRaises(ValueError, cloud_storage_info.CloudStorageInfo,
+ 'cs_bucket', 'cs_hash', 'download_path', None)
+
+ def testInitWithVersion(self):
+ self.assertRaises(
+ ValueError, cloud_storage_info.CloudStorageInfo, None, None, None,
+ 'cs_remote_path', version_in_cs='version_in_cs')
+ self.assertRaises(
+ ValueError, cloud_storage_info.CloudStorageInfo, None, 'cs_hash',
+ 'download_path', 'cs_remote_path', version_in_cs='version_in_cs')
+
+ cs_info = cloud_storage_info.CloudStorageInfo(
+ 'cs_bucket', 'cs_hash', 'download_path', 'cs_remote_path',
+ version_in_cs='version_in_cs')
+ self.assertEqual('cs_hash', cs_info._cs_hash)
+ self.assertEqual('cs_bucket', cs_info._cs_bucket)
+ self.assertEqual('cs_remote_path', cs_info._cs_remote_path)
+ self.assertEqual('download_path', cs_info._download_path)
+ self.assertEqual('version_in_cs', cs_info._version_in_cs)
+
+ def testInitWithArchiveInfoErrors(self):
+ zip_info = archive_info.ArchiveInfo(
+ 'download_path', 'unzip_location', 'path_within_archive')
+ self.assertRaises(
+ ValueError, cloud_storage_info.CloudStorageInfo, None, None, None, None,
+ archive_info=zip_info)
+ self.assertRaises(
+ ValueError, cloud_storage_info.CloudStorageInfo, None, None, None,
+ 'cs_remote_path', archive_info=zip_info)
+ self.assertRaises(
+ ValueError, cloud_storage_info.CloudStorageInfo, 'cs_bucket', 'cs_hash',
+ None, 'cs_remote_path', archive_info=zip_info)
+ self.assertRaises(ValueError, cloud_storage_info.CloudStorageInfo,
+ 'cs_bucket', 'cs_hash',
+ 'cs_remote_path', None, version_in_cs='version',
+ archive_info=zip_info)
+
+
+ def testInitWithArchiveInfo(self):
+ zip_info = archive_info.ArchiveInfo(
+ 'download_path', 'unzip_location', 'path_within_archive')
+ cs_info = cloud_storage_info.CloudStorageInfo(
+ 'cs_bucket', 'cs_hash', 'download_path', 'cs_remote_path',
+ archive_info=zip_info)
+ self.assertEqual('cs_hash', cs_info._cs_hash)
+ self.assertEqual('cs_bucket', cs_info._cs_bucket)
+ self.assertEqual('cs_remote_path', cs_info._cs_remote_path)
+ self.assertEqual('download_path', cs_info._download_path)
+ self.assertEqual(zip_info, cs_info._archive_info)
+ self.assertFalse(cs_info._version_in_cs)
+
+ def testInitWithVersionAndArchiveInfo(self):
+ zip_info = archive_info.ArchiveInfo(
+ 'download_path', 'unzip_location', 'path_within_archive')
+ cs_info = cloud_storage_info.CloudStorageInfo(
+ 'cs_bucket', 'cs_hash', 'download_path',
+ 'cs_remote_path', version_in_cs='version_in_cs',
+ archive_info=zip_info)
+ self.assertEqual('cs_hash', cs_info._cs_hash)
+ self.assertEqual('cs_bucket', cs_info._cs_bucket)
+ self.assertEqual('cs_remote_path', cs_info._cs_remote_path)
+ self.assertEqual('download_path', cs_info._download_path)
+ self.assertEqual(zip_info, cs_info._archive_info)
+ self.assertEqual('version_in_cs', cs_info._version_in_cs)
+
+ def testInitMinimumCloudStorageInfo(self):
+ cs_info = cloud_storage_info.CloudStorageInfo(
+ 'cs_bucket',
+ 'cs_hash', 'download_path',
+ 'cs_remote_path')
+ self.assertEqual('cs_hash', cs_info._cs_hash)
+ self.assertEqual('cs_bucket', cs_info._cs_bucket)
+ self.assertEqual('cs_remote_path', cs_info._cs_remote_path)
+ self.assertEqual('download_path', cs_info._download_path)
+ self.assertFalse(cs_info._version_in_cs)
+ self.assertFalse(cs_info._archive_info)
+
+
+class TestGetRemotePath(fake_filesystem_unittest.TestCase):
+ def setUp(self):
+ self.setUpPyfakefs()
+ self.config_path = '/test/dep_config.json'
+ self.fs.CreateFile(self.config_path, contents='{}')
+ self.download_path = '/foo/download_path'
+ self.fs.CreateFile(
+ self.download_path, contents='1010110', st_mode=stat.S_IWOTH)
+ self.cs_info = cloud_storage_info.CloudStorageInfo(
+ 'cs_bucket', 'cs_hash', self.download_path, 'cs_remote_path',
+ version_in_cs='1.2.3.4',)
+
+ def tearDown(self):
+ self.tearDownPyfakefs()
+
+ @mock.patch(
+ 'py_utils.cloud_storage.GetIfHashChanged')
+ def testGetRemotePathNoArchive(self, cs_get_mock):
+ def _GetIfHashChangedMock(cs_path, download_path, bucket, file_hash):
+ del cs_path, bucket, file_hash
+ if not os.path.exists(download_path):
+ self.fs.CreateFile(download_path, contents='1010001010101010110101')
+ cs_get_mock.side_effect = _GetIfHashChangedMock
+ # All of the needed information is given, and the downloaded path exists
+ # after calling cloud storage.
+ self.assertEqual(
+ os.path.abspath(self.download_path),
+ self.cs_info.GetRemotePath())
+ self.assertTrue(os.stat(self.download_path).st_mode & stat.S_IXUSR)
+
+ # All of the needed information is given, but the downloaded path doesn't
+ # exists after calling cloud storage.
+ self.fs.RemoveObject(self.download_path)
+ cs_get_mock.side_effect = [True]
+ self.assertRaises(
+ exceptions.FileNotFoundError, self.cs_info.GetRemotePath)
+
+ @mock.patch(
+ 'dependency_manager.dependency_manager_util.UnzipArchive')
+ @mock.patch(
+ 'dependency_manager.cloud_storage_info.cloud_storage.GetIfHashChanged') # pylint: disable=line-too-long
+ def testGetRemotePathWithArchive(self, cs_get_mock, unzip_mock):
+ def _GetIfHashChangedMock(cs_path, download_path, bucket, file_hash):
+ del cs_path, bucket, file_hash
+ if not os.path.exists(download_path):
+ self.fs.CreateFile(download_path, contents='1010001010101010110101')
+ cs_get_mock.side_effect = _GetIfHashChangedMock
+
+ unzip_path = os.path.join(
+ os.path.dirname(self.download_path), 'unzip_dir')
+ path_within_archive = os.path.join('path', 'within', 'archive')
+ dep_path = os.path.join(unzip_path, path_within_archive)
+ def _UnzipFileMock(archive_file, unzip_location, tmp_location=None):
+ del archive_file, tmp_location
+ self.fs.CreateFile(dep_path)
+ self.fs.CreateFile(os.path.join(unzip_location, 'extra', 'path'))
+ self.fs.CreateFile(os.path.join(unzip_location, 'another_extra_path'))
+ unzip_mock.side_effect = _UnzipFileMock
+
+ # Create a stale directory that's expected to get deleted
+ stale_unzip_path_glob = os.path.join(
+ os.path.dirname(self.download_path), 'unzip_dir_*')
+ stale_path = os.path.join(
+ os.path.dirname(self.download_path), 'unzip_dir_stale')
+ self.fs.CreateDirectory(stale_path)
+ self.fs.CreateFile(os.path.join(stale_path, 'some_file'))
+
+ self.assertFalse(os.path.exists(dep_path))
+ zip_info = archive_info.ArchiveInfo(
+ self.download_path, unzip_path, path_within_archive,
+ stale_unzip_path_glob)
+ self.cs_info = cloud_storage_info.CloudStorageInfo(
+ 'cs_bucket', 'cs_hash', self.download_path, 'cs_remote_path',
+ version_in_cs='1.2.3.4', archive_info=zip_info)
+
+ self.assertFalse(unzip_mock.called)
+ self.assertEqual(
+ os.path.abspath(dep_path),
+ self.cs_info.GetRemotePath())
+ self.assertTrue(os.path.exists(dep_path))
+ self.assertTrue(stat.S_IMODE(os.stat(os.path.abspath(dep_path)).st_mode) &
+ (stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR))
+ unzip_mock.assert_called_once_with(self.download_path, unzip_path)
+
+ # Stale directory should have been deleted
+ self.assertFalse(os.path.exists(stale_path))
+
+ # Should not need to unzip a second time, but should return the same path.
+ unzip_mock.reset_mock()
+ self.assertTrue(os.path.exists(dep_path))
+ self.assertEqual(
+ os.path.abspath(dep_path),
+ self.cs_info.GetRemotePath())
+ self.assertTrue(stat.S_IMODE(os.stat(os.path.abspath(dep_path)).st_mode) &
+ (stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR))
+ self.assertFalse(unzip_mock.called)
+
+
+ @mock.patch(
+ 'py_utils.cloud_storage.GetIfHashChanged')
+ def testGetRemotePathCloudStorageErrors(self, cs_get_mock):
+ cs_get_mock.side_effect = cloud_storage.CloudStorageError
+ self.assertRaises(cloud_storage.CloudStorageError,
+ self.cs_info.GetRemotePath)
+
+ cs_get_mock.side_effect = cloud_storage.ServerError
+ self.assertRaises(cloud_storage.ServerError,
+ self.cs_info.GetRemotePath)
+
+ cs_get_mock.side_effect = cloud_storage.NotFoundError
+ self.assertRaises(cloud_storage.NotFoundError,
+ self.cs_info.GetRemotePath)
+
+ cs_get_mock.side_effect = cloud_storage.PermissionError
+ self.assertRaises(cloud_storage.PermissionError,
+ self.cs_info.GetRemotePath)
+
+ cs_get_mock.side_effect = cloud_storage.CredentialsError
+ self.assertRaises(cloud_storage.CredentialsError,
+ self.cs_info.GetRemotePath)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/dependency_info.py b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/dependency_info.py
new file mode 100644
index 0000000..942d57e
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/dependency_info.py
@@ -0,0 +1,128 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+class DependencyInfo(object):
+ def __init__(self, dependency, platform, config_path, local_path_info=None,
+ cloud_storage_info=None):
+ """ Container for the information needed for each dependency/platform pair
+ in the dependency_manager.
+
+ Args:
+ Required:
+ dependency: Name of the dependency.
+ platform: Name of the platform to be run on.
+ config_path: Path to the config_path this information came from. Used
+ for error messages to improve debugging.
+
+ Optional:
+ local_paths: A list of paths to search in order for a local file.
+ cloud_storage_info: An instance of CloudStorageInfo.
+ """
+ # TODO(aiolos): update the above doc string for A) the usage of zip files
+ # and B) supporting lists of local_paths to be checked for most recently
+ # changed files.
+ if not dependency or not platform:
+ raise ValueError(
+ 'Must supply both a dependency and platform to DependencyInfo')
+
+ self._dependency = dependency
+ self._platform = platform
+ self._config_paths = [config_path]
+ self._local_path_info = local_path_info
+ self._cloud_storage_info = cloud_storage_info
+
+ def Update(self, new_dep_info):
+ """Add the information from |new_dep_info| to this instance.
+ """
+ self._config_paths.extend(new_dep_info.config_paths)
+ if (self.dependency != new_dep_info.dependency or
+ self.platform != new_dep_info.platform):
+ raise ValueError(
+ 'Cannot update DependencyInfo with different dependency or platform.'
+ 'Existing dep: %s, existing platform: %s. New dep: %s, new platform:'
+ '%s. Config_paths conflicting: %s' % (
+ self.dependency, self.platform, new_dep_info.dependency,
+ new_dep_info.platform, self.config_paths))
+ if new_dep_info.has_cloud_storage_info:
+ if self.has_cloud_storage_info:
+ raise ValueError(
+ 'Overriding cloud storage data is not allowed when updating a '
+ 'DependencyInfo. Conflict in dependency %s on platform %s in '
+ 'config_paths: %s.' % (self.dependency, self.platform,
+ self.config_paths))
+ else:
+ self._cloud_storage_info = new_dep_info._cloud_storage_info
+ if not self._local_path_info:
+ self._local_path_info = new_dep_info._local_path_info
+ else:
+ self._local_path_info.Update(new_dep_info._local_path_info)
+
+ def GetRemotePath(self):
+ """Gets the path to a downloaded version of the dependency.
+
+ May not download the file if it has already been downloaded.
+ Will unzip the downloaded file if specified in the config
+ via unzipped_hash.
+
+ Returns: A path to an executable that was stored in cloud_storage, or None
+ if not found.
+
+ Raises:
+ CredentialsError: If cloud_storage credentials aren't configured.
+ PermissionError: If cloud_storage credentials are configured, but not
+ with an account that has permission to download the needed file.
+ NotFoundError: If the needed file does not exist where expected in
+ cloud_storage or the downloaded zip file.
+ ServerError: If an internal server error is hit while downloading the
+ needed file.
+ CloudStorageError: If another error occured while downloading the remote
+ path.
+ FileNotFoundError: If the download was otherwise unsuccessful.
+ """
+ if self.has_cloud_storage_info:
+ return self._cloud_storage_info.GetRemotePath()
+ return None
+
+ def GetRemotePathVersion(self):
+ if self.has_cloud_storage_info:
+ return self._cloud_storage_info.version_in_cs
+ return None
+
+ def GetLocalPath(self):
+ """Gets the path to a local version of the dependency.
+
+ Returns: A path to a local dependency, or None if not found.
+
+ """
+ if self.has_local_path_info:
+ return self._local_path_info.GetLocalPath()
+ return None
+
+ @property
+ def dependency(self):
+ return self._dependency
+
+ @property
+ def platform(self):
+ return self._platform
+
+ @property
+ def config_paths(self):
+ return self._config_paths
+
+ @property
+ def local_path_info(self):
+ return self._local_path_info
+
+ @property
+ def has_cloud_storage_info(self):
+ return bool(self._cloud_storage_info)
+
+ @property
+ def has_local_path_info(self):
+ return bool(self._local_path_info)
+
+ @property
+ def cloud_storage_info(self):
+ return self._cloud_storage_info
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/dependency_info_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/dependency_info_unittest.py
new file mode 100644
index 0000000..6117cd3
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/dependency_info_unittest.py
@@ -0,0 +1,234 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import unittest
+
+import dependency_manager
+
+class DependencyInfoTest(unittest.TestCase):
+ def testInitRequiredInfo(self):
+ # Must have a dependency, platform and file_path.
+ self.assertRaises(ValueError, dependency_manager.DependencyInfo,
+ None, None, None)
+ self.assertRaises(ValueError, dependency_manager.DependencyInfo,
+ 'dep', None, None)
+ self.assertRaises(ValueError, dependency_manager.DependencyInfo,
+ None, 'plat', None)
+ self.assertRaises(ValueError, dependency_manager.DependencyInfo,
+ None, None, 'config_path')
+ # Empty DependencyInfo.
+ empty_di = dependency_manager.DependencyInfo('dep', 'plat', 'config_path')
+ self.assertEqual('dep', empty_di.dependency)
+ self.assertEqual('plat', empty_di.platform)
+ self.assertEqual(['config_path'], empty_di.config_paths)
+ self.assertFalse(empty_di.has_local_path_info)
+ self.assertFalse(empty_di.has_cloud_storage_info)
+
+ def testInitLocalPaths(self):
+ local_path_info = dependency_manager.LocalPathInfo(['path0', 'path1'])
+ dep_info = dependency_manager.DependencyInfo(
+ 'dep', 'platform', 'config_path', local_path_info
+ )
+ self.assertEqual('dep', dep_info.dependency)
+ self.assertEqual('platform', dep_info.platform)
+ self.assertEqual(['config_path'], dep_info.config_paths)
+ self.assertEqual(local_path_info, dep_info._local_path_info)
+ self.assertFalse(dep_info.has_cloud_storage_info)
+
+ def testInitCloudStorageInfo(self):
+ cs_info = dependency_manager.CloudStorageInfo(
+ 'cs_bucket', 'cs_hash', 'dowload_path', 'cs_remote_path')
+ dep_info = dependency_manager.DependencyInfo(
+ 'dep', 'platform', 'config_path', cloud_storage_info=cs_info)
+ self.assertEqual('dep', dep_info.dependency)
+ self.assertEqual('platform', dep_info.platform)
+ self.assertEqual(['config_path'], dep_info.config_paths)
+ self.assertFalse(dep_info.has_local_path_info)
+ self.assertTrue(dep_info.has_cloud_storage_info)
+ self.assertEqual(cs_info, dep_info._cloud_storage_info)
+
+ def testInitAllInfo(self):
+ cs_info = dependency_manager.CloudStorageInfo(
+ 'cs_bucket', 'cs_hash', 'dowload_path', 'cs_remote_path')
+ dep_info = dependency_manager.DependencyInfo(
+ 'dep', 'platform', 'config_path', cloud_storage_info=cs_info)
+ self.assertEqual('dep', dep_info.dependency)
+ self.assertEqual('platform', dep_info.platform)
+ self.assertEqual(['config_path'], dep_info.config_paths)
+ self.assertFalse(dep_info.has_local_path_info)
+ self.assertTrue(dep_info.has_cloud_storage_info)
+
+
+ def testUpdateRequiredArgsConflicts(self):
+ lp_info = dependency_manager.LocalPathInfo(['path0', 'path2'])
+ dep_info1 = dependency_manager.DependencyInfo(
+ 'dep1', 'platform1', 'config_path1', local_path_info=lp_info)
+ dep_info2 = dependency_manager.DependencyInfo(
+ 'dep1', 'platform2', 'config_path2', local_path_info=lp_info)
+ dep_info3 = dependency_manager.DependencyInfo(
+ 'dep2', 'platform1', 'config_path3', local_path_info=lp_info)
+ self.assertRaises(ValueError, dep_info1.Update, dep_info2)
+ self.assertRaises(ValueError, dep_info1.Update, dep_info3)
+ self.assertRaises(ValueError, dep_info3.Update, dep_info2)
+
+ def testUpdateMinimumCloudStorageInfo(self):
+ dep_info1 = dependency_manager.DependencyInfo(
+ 'dep1', 'platform1', 'config_path1')
+
+ cs_info2 = dependency_manager.CloudStorageInfo(
+ cs_bucket='cs_bucket2', cs_hash='cs_hash2',
+ download_path='download_path2', cs_remote_path='cs_remote_path2')
+ dep_info2 = dependency_manager.DependencyInfo(
+ 'dep1', 'platform1', 'config_path2', cloud_storage_info=cs_info2)
+
+ dep_info3 = dependency_manager.DependencyInfo(
+ 'dep1', 'platform1', 'config_path3')
+
+ cs_info4 = dependency_manager.CloudStorageInfo(
+ cs_bucket='cs_bucket4', cs_hash='cs_hash4',
+ download_path='download_path4', cs_remote_path='cs_remote_path4')
+ dep_info4 = dependency_manager.DependencyInfo(
+ 'dep1', 'platform1', 'config_path4', cloud_storage_info=cs_info4)
+
+ self.assertEqual('dep1', dep_info1.dependency)
+ self.assertEqual('platform1', dep_info1.platform)
+ self.assertEqual(['config_path1'], dep_info1.config_paths)
+
+ dep_info1.Update(dep_info2)
+ self.assertFalse(dep_info1.has_local_path_info)
+ self.assertEqual('dep1', dep_info1.dependency)
+ self.assertEqual('platform1', dep_info1.platform)
+ self.assertEqual(['config_path1', 'config_path2'], dep_info1.config_paths)
+
+ cs_info = dep_info1._cloud_storage_info
+ self.assertEqual(cs_info, cs_info2)
+ self.assertEqual('cs_bucket2', cs_info._cs_bucket)
+ self.assertEqual('cs_hash2', cs_info._cs_hash)
+ self.assertEqual('download_path2', cs_info._download_path)
+ self.assertEqual('cs_remote_path2', cs_info._cs_remote_path)
+
+ dep_info1.Update(dep_info3)
+ self.assertEqual('dep1', dep_info1.dependency)
+ self.assertEqual('platform1', dep_info1.platform)
+ self.assertEqual(['config_path1', 'config_path2', 'config_path3'],
+ dep_info1.config_paths)
+ self.assertFalse(dep_info1.has_local_path_info)
+ cs_info = dep_info1._cloud_storage_info
+ self.assertEqual(cs_info, cs_info2)
+ self.assertEqual('cs_bucket2', cs_info._cs_bucket)
+ self.assertEqual('cs_hash2', cs_info._cs_hash)
+ self.assertEqual('download_path2', cs_info._download_path)
+ self.assertEqual('cs_remote_path2', cs_info._cs_remote_path)
+
+ self.assertRaises(ValueError, dep_info1.Update, dep_info4)
+
+ def testUpdateMaxCloudStorageInfo(self):
+ dep_info1 = dependency_manager.DependencyInfo(
+ 'dep1', 'platform1', 'config_path1')
+
+ zip_info2 = dependency_manager.ArchiveInfo(
+ 'archive_path2', 'unzip_path2', 'path_withing_archive2')
+ cs_info2 = dependency_manager.CloudStorageInfo(
+ 'cs_bucket2', 'cs_hash2', 'download_path2', 'cs_remote_path2',
+ version_in_cs='2.1.1', archive_info=zip_info2)
+ dep_info2 = dependency_manager.DependencyInfo(
+ 'dep1', 'platform1', 'config_path2', cloud_storage_info=cs_info2)
+
+ dep_info3 = dependency_manager.DependencyInfo(
+ 'dep1', 'platform1', 'config_path3')
+
+ zip_info4 = dependency_manager.ArchiveInfo(
+ 'archive_path4', 'unzip_path4', 'path_withing_archive4')
+ cs_info4 = dependency_manager.CloudStorageInfo(
+ 'cs_bucket4', 'cs_hash4', 'download_path4', 'cs_remote_path4',
+ version_in_cs='4.2.1', archive_info=zip_info4)
+ dep_info4 = dependency_manager.DependencyInfo(
+ 'dep1', 'platform1', 'config_path4', cloud_storage_info=cs_info4)
+
+ self.assertEqual('dep1', dep_info1.dependency)
+ self.assertEqual('platform1', dep_info1.platform)
+ self.assertEqual(['config_path1'], dep_info1.config_paths)
+
+ dep_info1.Update(dep_info2)
+ self.assertFalse(dep_info1.has_local_path_info)
+ self.assertEqual('dep1', dep_info1.dependency)
+ self.assertEqual('platform1', dep_info1.platform)
+ self.assertEqual(['config_path1', 'config_path2'], dep_info1.config_paths)
+
+ cs_info = dep_info1._cloud_storage_info
+ self.assertEqual(cs_info, cs_info2)
+ self.assertEqual('cs_bucket2', cs_info._cs_bucket)
+ self.assertEqual('cs_hash2', cs_info._cs_hash)
+ self.assertEqual('download_path2', cs_info._download_path)
+ self.assertEqual('cs_remote_path2', cs_info._cs_remote_path)
+ self.assertEqual('cs_remote_path2', cs_info._cs_remote_path)
+
+ dep_info1.Update(dep_info3)
+ self.assertEqual('dep1', dep_info1.dependency)
+ self.assertEqual('platform1', dep_info1.platform)
+ self.assertEqual(['config_path1', 'config_path2', 'config_path3'],
+ dep_info1.config_paths)
+ self.assertFalse(dep_info1.has_local_path_info)
+ cs_info = dep_info1._cloud_storage_info
+ self.assertEqual(cs_info, cs_info2)
+ self.assertEqual('cs_bucket2', cs_info._cs_bucket)
+ self.assertEqual('cs_hash2', cs_info._cs_hash)
+ self.assertEqual('download_path2', cs_info._download_path)
+ self.assertEqual('cs_remote_path2', cs_info._cs_remote_path)
+
+ self.assertRaises(ValueError, dep_info1.Update, dep_info4)
+
+ def testUpdateAllInfo(self):
+ lp_info1 = dependency_manager.LocalPathInfo(['path1'])
+ dep_info1 = dependency_manager.DependencyInfo(
+ 'dep1', 'platform1', 'config_path1', local_path_info=lp_info1)
+ cs_info2 = dependency_manager.CloudStorageInfo(
+ cs_bucket='cs_bucket2', cs_hash='cs_hash2',
+ download_path='download_path2', cs_remote_path='cs_remote_path2')
+ lp_info2 = dependency_manager.LocalPathInfo(['path2'])
+ dep_info2 = dependency_manager.DependencyInfo(
+ 'dep1', 'platform1', 'config_path2', local_path_info=lp_info2,
+ cloud_storage_info=cs_info2)
+ lp_info3 = dependency_manager.LocalPathInfo(['path3'])
+ dep_info3 = dependency_manager.DependencyInfo(
+ 'dep1', 'platform1', 'config_path3', local_path_info=lp_info3)
+ lp_info4 = dependency_manager.LocalPathInfo(['path4'])
+ cs_info4 = dependency_manager.CloudStorageInfo(
+ cs_bucket='cs_bucket4', cs_hash='cs_hash4',
+ download_path='download_path4', cs_remote_path='cs_remote_path4')
+ dep_info4 = dependency_manager.DependencyInfo(
+ 'dep1', 'platform1', 'config_path4', local_path_info=lp_info4,
+ cloud_storage_info=cs_info4)
+
+ self.assertTrue(dep_info1._local_path_info.IsPathInLocalPaths('path1'))
+ self.assertFalse(dep_info1._local_path_info.IsPathInLocalPaths('path2'))
+ self.assertFalse(dep_info1._local_path_info.IsPathInLocalPaths('path3'))
+ self.assertFalse(dep_info1._local_path_info.IsPathInLocalPaths('path4'))
+
+ dep_info1.Update(dep_info2)
+ cs_info = dep_info1._cloud_storage_info
+ self.assertEqual(cs_info, cs_info2)
+ self.assertEqual('cs_bucket2', cs_info._cs_bucket)
+ self.assertEqual('cs_hash2', cs_info._cs_hash)
+ self.assertEqual('download_path2', cs_info._download_path)
+ self.assertEqual('cs_remote_path2', cs_info._cs_remote_path)
+ self.assertTrue(dep_info1._local_path_info.IsPathInLocalPaths('path1'))
+ self.assertTrue(dep_info1._local_path_info.IsPathInLocalPaths('path2'))
+ self.assertFalse(dep_info1._local_path_info.IsPathInLocalPaths('path3'))
+ self.assertFalse(dep_info1._local_path_info.IsPathInLocalPaths('path4'))
+
+ dep_info1.Update(dep_info3)
+ cs_info = dep_info1._cloud_storage_info
+ self.assertEqual(cs_info, cs_info2)
+ self.assertEqual('cs_bucket2', cs_info._cs_bucket)
+ self.assertEqual('cs_hash2', cs_info._cs_hash)
+ self.assertEqual('download_path2', cs_info._download_path)
+ self.assertEqual('cs_remote_path2', cs_info._cs_remote_path)
+ self.assertTrue(dep_info1._local_path_info.IsPathInLocalPaths('path1'))
+ self.assertTrue(dep_info1._local_path_info.IsPathInLocalPaths('path2'))
+ self.assertTrue(dep_info1._local_path_info.IsPathInLocalPaths('path3'))
+ self.assertFalse(dep_info1._local_path_info.IsPathInLocalPaths('path4'))
+
+ self.assertRaises(ValueError, dep_info1.Update, dep_info4)
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/dependency_manager_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/dependency_manager_unittest.py
new file mode 100644
index 0000000..86d17f7
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/dependency_manager_unittest.py
@@ -0,0 +1,527 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# pylint: disable=unused-argument
+
+import mock
+
+from pyfakefs import fake_filesystem_unittest
+from py_utils import cloud_storage
+
+import dependency_manager
+from dependency_manager import exceptions
+
+
+class DependencyManagerTest(fake_filesystem_unittest.TestCase):
+
+ def setUp(self):
+ self.lp_info012 = dependency_manager.LocalPathInfo(
+ ['path0', 'path1', 'path2'])
+ self.cloud_storage_info = dependency_manager.CloudStorageInfo(
+ 'cs_bucket', 'cs_hash', 'download_path', 'cs_remote_path')
+
+ self.dep_info = dependency_manager.DependencyInfo(
+ 'dep', 'platform', 'config_file', local_path_info=self.lp_info012,
+ cloud_storage_info=self.cloud_storage_info)
+ self.setUpPyfakefs()
+
+ def tearDown(self):
+ self.tearDownPyfakefs()
+
+ # TODO(nednguyen): add a test that construct
+ # dependency_manager.DependencyManager from a list of DependencyInfo.
+ def testErrorInit(self):
+ with self.assertRaises(ValueError):
+ dependency_manager.DependencyManager(None)
+ with self.assertRaises(ValueError):
+ dependency_manager.DependencyManager('config_file?')
+
+ def testInitialUpdateDependencies(self):
+ dep_manager = dependency_manager.DependencyManager([])
+
+ # Empty BaseConfig.
+ dep_manager._lookup_dict = {}
+ base_config_mock = mock.MagicMock(spec=dependency_manager.BaseConfig)
+ base_config_mock.IterDependencyInfo.return_value = iter([])
+ dep_manager._UpdateDependencies(base_config_mock)
+ self.assertFalse(dep_manager._lookup_dict)
+
+ # One dependency/platform in a BaseConfig.
+ dep_manager._lookup_dict = {}
+ base_config_mock = mock.MagicMock(spec=dependency_manager.BaseConfig)
+ dep_info = mock.MagicMock(spec=dependency_manager.DependencyInfo)
+ dep = 'dependency'
+ plat = 'platform'
+ dep_info.dependency = dep
+ dep_info.platform = plat
+ base_config_mock.IterDependencyInfo.return_value = iter([dep_info])
+ expected_lookup_dict = {dep: {plat: dep_info}}
+ dep_manager._UpdateDependencies(base_config_mock)
+ self.assertEqual(expected_lookup_dict, dep_manager._lookup_dict)
+ self.assertFalse(dep_info.Update.called)
+
+ # One dependency multiple platforms in a BaseConfig.
+ dep_manager._lookup_dict = {}
+ base_config_mock = mock.MagicMock(spec=dependency_manager.BaseConfig)
+ dep = 'dependency'
+ plat1 = 'platform1'
+ plat2 = 'platform2'
+ dep_info1 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
+ dep_info1.dependency = dep
+ dep_info1.platform = plat1
+ dep_info2 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
+ dep_info2.dependency = dep
+ dep_info2.platform = plat2
+ base_config_mock.IterDependencyInfo.return_value = iter([dep_info1,
+ dep_info2])
+ expected_lookup_dict = {dep: {plat1: dep_info1,
+ plat2: dep_info2}}
+ dep_manager._UpdateDependencies(base_config_mock)
+ self.assertEqual(expected_lookup_dict, dep_manager._lookup_dict)
+ self.assertFalse(dep_info1.Update.called)
+ self.assertFalse(dep_info2.Update.called)
+
+ # Multiple dependencies, multiple platforms in a BaseConfig.
+ dep_manager._lookup_dict = {}
+ base_config_mock = mock.MagicMock(spec=dependency_manager.BaseConfig)
+ dep1 = 'dependency1'
+ dep2 = 'dependency2'
+ plat1 = 'platform1'
+ plat2 = 'platform2'
+ dep_info1 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
+ dep_info1.dependency = dep1
+ dep_info1.platform = plat1
+ dep_info2 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
+ dep_info2.dependency = dep1
+ dep_info2.platform = plat2
+ dep_info3 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
+ dep_info3.dependency = dep2
+ dep_info3.platform = plat2
+ base_config_mock.IterDependencyInfo.return_value = iter(
+ [dep_info1, dep_info2, dep_info3])
+ expected_lookup_dict = {dep1: {plat1: dep_info1,
+ plat2: dep_info2},
+ dep2: {plat2: dep_info3}}
+ dep_manager._UpdateDependencies(base_config_mock)
+ self.assertEqual(expected_lookup_dict, dep_manager._lookup_dict)
+ self.assertFalse(dep_info1.Update.called)
+ self.assertFalse(dep_info2.Update.called)
+ self.assertFalse(dep_info3.Update.called)
+
+ def testFollowupUpdateDependenciesNoOverlap(self):
+ dep_manager = dependency_manager.DependencyManager([])
+ dep = 'dependency'
+ dep1 = 'dependency1'
+ dep2 = 'dependency2'
+ dep3 = 'dependency3'
+ plat1 = 'platform1'
+ plat2 = 'platform2'
+ plat3 = 'platform3'
+ dep_info_a = mock.MagicMock(spec=dependency_manager.DependencyInfo)
+ dep_info_a.dependency = dep1
+ dep_info_a.platform = plat1
+ dep_info_b = mock.MagicMock(spec=dependency_manager.DependencyInfo)
+ dep_info_b.dependency = dep1
+ dep_info_b.platform = plat2
+ dep_info_c = mock.MagicMock(spec=dependency_manager.DependencyInfo)
+ dep_info_c.dependency = dep
+ dep_info_c.platform = plat1
+
+ start_lookup_dict = {dep: {plat1: dep_info_a,
+ plat2: dep_info_b},
+ dep1: {plat1: dep_info_c}}
+ base_config_mock = mock.MagicMock(spec=dependency_manager.BaseConfig)
+
+ # Empty BaseConfig.
+ dep_manager._lookup_dict = start_lookup_dict.copy()
+ base_config_mock.IterDependencyInfo.return_value = iter([])
+ dep_manager._UpdateDependencies(base_config_mock)
+ self.assertEqual(start_lookup_dict, dep_manager._lookup_dict)
+
+ # One dependency/platform in a BaseConfig.
+ dep_manager._lookup_dict = start_lookup_dict.copy()
+ dep_info = mock.MagicMock(spec=dependency_manager.DependencyInfo)
+ dep_info.dependency = dep3
+ dep_info.platform = plat1
+ base_config_mock.IterDependencyInfo.return_value = iter([dep_info])
+ expected_lookup_dict = {dep: {plat1: dep_info_a,
+ plat2: dep_info_b},
+ dep1: {plat1: dep_info_c},
+ dep3: {plat3: dep_info}}
+
+ dep_manager._UpdateDependencies(base_config_mock)
+ self.assertItemsEqual(expected_lookup_dict, dep_manager._lookup_dict)
+ self.assertFalse(dep_info.Update.called)
+ self.assertFalse(dep_info_a.Update.called)
+ self.assertFalse(dep_info_b.Update.called)
+ self.assertFalse(dep_info_c.Update.called)
+
+ # One dependency multiple platforms in a BaseConfig.
+ dep_manager._lookup_dict = start_lookup_dict.copy()
+ dep_info1 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
+ dep_info1.dependency = dep2
+ dep_info1.platform = plat1
+ dep_info2 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
+ dep_info2.dependency = dep2
+ dep_info2.platform = plat2
+ base_config_mock.IterDependencyInfo.return_value = iter([dep_info1,
+ dep_info2])
+ expected_lookup_dict = {dep: {plat1: dep_info_a,
+ plat2: dep_info_b},
+ dep1: {plat1: dep_info_c},
+ dep2: {plat1: dep_info1,
+ plat2: dep_info2}}
+ dep_manager._UpdateDependencies(base_config_mock)
+ self.assertEqual(expected_lookup_dict, dep_manager._lookup_dict)
+ self.assertFalse(dep_info1.Update.called)
+ self.assertFalse(dep_info2.Update.called)
+ self.assertFalse(dep_info_a.Update.called)
+ self.assertFalse(dep_info_b.Update.called)
+ self.assertFalse(dep_info_c.Update.called)
+
+ # Multiple dependencies, multiple platforms in a BaseConfig.
+ dep_manager._lookup_dict = start_lookup_dict.copy()
+ dep1 = 'dependency1'
+ plat1 = 'platform1'
+ plat2 = 'platform2'
+ dep_info1 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
+ dep_info1.dependency = dep2
+ dep_info1.platform = plat1
+ dep_info2 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
+ dep_info2.dependency = dep2
+ dep_info2.platform = plat2
+ dep_info3 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
+ dep_info3.dependency = dep3
+ dep_info3.platform = plat2
+ base_config_mock.IterDependencyInfo.return_value = iter(
+ [dep_info1, dep_info2, dep_info3])
+ expected_lookup_dict = {dep: {plat1: dep_info_a,
+ plat2: dep_info_b},
+ dep1: {plat1: dep_info_c},
+ dep2: {plat1: dep_info1,
+ plat2: dep_info2},
+ dep3: {plat2: dep_info3}}
+ dep_manager._UpdateDependencies(base_config_mock)
+ self.assertEqual(expected_lookup_dict, dep_manager._lookup_dict)
+ self.assertFalse(dep_info1.Update.called)
+ self.assertFalse(dep_info2.Update.called)
+ self.assertFalse(dep_info3.Update.called)
+ self.assertFalse(dep_info_a.Update.called)
+ self.assertFalse(dep_info_b.Update.called)
+ self.assertFalse(dep_info_c.Update.called)
+
+ # Ensure the testing data wasn't corrupted.
+ self.assertEqual(start_lookup_dict,
+ {dep: {plat1: dep_info_a,
+ plat2: dep_info_b},
+ dep1: {plat1: dep_info_c}})
+
+ def testFollowupUpdateDependenciesWithCollisions(self):
+ dep_manager = dependency_manager.DependencyManager([])
+ dep = 'dependency'
+ dep1 = 'dependency1'
+ dep2 = 'dependency2'
+ plat1 = 'platform1'
+ plat2 = 'platform2'
+ dep_info_a = mock.MagicMock(spec=dependency_manager.DependencyInfo)
+ dep_info_a.dependency = dep1
+ dep_info_a.platform = plat1
+ dep_info_b = mock.MagicMock(spec=dependency_manager.DependencyInfo)
+ dep_info_b.dependency = dep1
+ dep_info_b.platform = plat2
+ dep_info_c = mock.MagicMock(spec=dependency_manager.DependencyInfo)
+ dep_info_c.dependency = dep
+ dep_info_c.platform = plat1
+
+ start_lookup_dict = {dep: {plat1: dep_info_a,
+ plat2: dep_info_b},
+ dep1: {plat1: dep_info_c}}
+ base_config_mock = mock.MagicMock(spec=dependency_manager.BaseConfig)
+
+ # One dependency/platform.
+ dep_manager._lookup_dict = start_lookup_dict.copy()
+ dep_info = mock.MagicMock(spec=dependency_manager.DependencyInfo)
+ dep_info.dependency = dep
+ dep_info.platform = plat1
+ base_config_mock.IterDependencyInfo.return_value = iter([dep_info])
+ expected_lookup_dict = {dep: {plat1: dep_info_a,
+ plat2: dep_info_b},
+ dep1: {plat1: dep_info_c}}
+
+ dep_manager._UpdateDependencies(base_config_mock)
+ self.assertItemsEqual(expected_lookup_dict, dep_manager._lookup_dict)
+ dep_info_a.Update.assert_called_once_with(dep_info)
+ self.assertFalse(dep_info.Update.called)
+ self.assertFalse(dep_info_b.Update.called)
+ self.assertFalse(dep_info_c.Update.called)
+ dep_info_a.reset_mock()
+ dep_info_b.reset_mock()
+ dep_info_c.reset_mock()
+
+ # One dependency multiple platforms in a BaseConfig.
+ dep_manager._lookup_dict = start_lookup_dict.copy()
+ dep_info1 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
+ dep_info1.dependency = dep1
+ dep_info1.platform = plat1
+ dep_info2 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
+ dep_info2.dependency = dep2
+ dep_info2.platform = plat2
+ base_config_mock.IterDependencyInfo.return_value = iter([dep_info1,
+ dep_info2])
+ expected_lookup_dict = {dep: {plat1: dep_info_a,
+ plat2: dep_info_b},
+ dep1: {plat1: dep_info_c},
+ dep2: {plat2: dep_info2}}
+ dep_manager._UpdateDependencies(base_config_mock)
+ self.assertEqual(expected_lookup_dict, dep_manager._lookup_dict)
+ self.assertFalse(dep_info1.Update.called)
+ self.assertFalse(dep_info2.Update.called)
+ self.assertFalse(dep_info_a.Update.called)
+ self.assertFalse(dep_info_b.Update.called)
+ dep_info_c.Update.assert_called_once_with(dep_info1)
+ dep_info_a.reset_mock()
+ dep_info_b.reset_mock()
+ dep_info_c.reset_mock()
+
+ # Multiple dependencies, multiple platforms in a BaseConfig.
+ dep_manager._lookup_dict = start_lookup_dict.copy()
+ dep1 = 'dependency1'
+ plat1 = 'platform1'
+ plat2 = 'platform2'
+ dep_info1 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
+ dep_info1.dependency = dep
+ dep_info1.platform = plat1
+ dep_info2 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
+ dep_info2.dependency = dep1
+ dep_info2.platform = plat1
+ dep_info3 = mock.MagicMock(spec=dependency_manager.DependencyInfo)
+ dep_info3.dependency = dep2
+ dep_info3.platform = plat2
+ base_config_mock.IterDependencyInfo.return_value = iter(
+ [dep_info1, dep_info2, dep_info3])
+ expected_lookup_dict = {dep: {plat1: dep_info_a,
+ plat2: dep_info_b},
+ dep1: {plat1: dep_info_c},
+ dep2: {plat2: dep_info3}}
+ dep_manager._UpdateDependencies(base_config_mock)
+ self.assertEqual(expected_lookup_dict, dep_manager._lookup_dict)
+ self.assertFalse(dep_info1.Update.called)
+ self.assertFalse(dep_info2.Update.called)
+ self.assertFalse(dep_info3.Update.called)
+ self.assertFalse(dep_info_b.Update.called)
+ dep_info_a.Update.assert_called_once_with(dep_info1)
+ dep_info_c.Update.assert_called_once_with(dep_info2)
+
+ # Collision error.
+ dep_manager._lookup_dict = start_lookup_dict.copy()
+ dep_info = mock.MagicMock(spec=dependency_manager.DependencyInfo)
+ dep_info.dependency = dep
+ dep_info.platform = plat1
+ base_config_mock.IterDependencyInfo.return_value = iter([dep_info])
+ dep_info_a.Update.side_effect = ValueError
+ self.assertRaises(ValueError,
+ dep_manager._UpdateDependencies, base_config_mock)
+
+ # Ensure the testing data wasn't corrupted.
+ self.assertEqual(start_lookup_dict,
+ {dep: {plat1: dep_info_a,
+ plat2: dep_info_b},
+ dep1: {plat1: dep_info_c}})
+
+ def testGetDependencyInfo(self):
+ dep_manager = dependency_manager.DependencyManager([])
+ self.assertFalse(dep_manager._lookup_dict)
+
+ # No dependencies in the dependency manager.
+ self.assertEqual(None, dep_manager._GetDependencyInfo('missing_dep',
+ 'missing_plat'))
+
+ dep_manager._lookup_dict = {'dep1': {'plat1': 'dep_info11',
+ 'plat2': 'dep_info12',
+ 'plat3': 'dep_info13'},
+ 'dep2': {'plat1': 'dep_info11',
+ 'plat2': 'dep_info21',
+ 'plat3': 'dep_info23',
+ 'default': 'dep_info2d'},
+ 'dep3': {'plat1': 'dep_info31',
+ 'plat2': 'dep_info32',
+ 'default': 'dep_info3d'}}
+ # Dependency not in the dependency manager.
+ self.assertEqual(None, dep_manager._GetDependencyInfo(
+ 'missing_dep', 'missing_plat'))
+ # Dependency in the dependency manager, but not the platform. No default.
+ self.assertEqual(None, dep_manager._GetDependencyInfo(
+ 'dep1', 'missing_plat'))
+ # Dependency in the dependency manager, but not the platform, but a default
+ # exists.
+ self.assertEqual('dep_info2d', dep_manager._GetDependencyInfo(
+ 'dep2', 'missing_plat'))
+ # Dependency and platform in the dependency manager. A default exists.
+ self.assertEqual('dep_info23', dep_manager._GetDependencyInfo(
+ 'dep2', 'plat3'))
+ # Dependency and platform in the dependency manager. No default exists.
+ self.assertEqual('dep_info12', dep_manager._GetDependencyInfo(
+ 'dep1', 'plat2'))
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @mock.patch(
+ 'dependency_manager.dependency_info.DependencyInfo.GetRemotePath') # pylint: disable=line-too-long
+ def testFetchPathUnititializedDependency(
+ self, cs_path_mock):
+ dep_manager = dependency_manager.DependencyManager([])
+ self.assertFalse(cs_path_mock.call_args)
+ cs_path = 'cs_path'
+ cs_path_mock.return_value = cs_path
+
+ # Empty lookup_dict
+ with self.assertRaises(exceptions.NoPathFoundError):
+ dep_manager.FetchPath('dep', 'plat_arch_x86')
+
+ # Non-empty lookup dict that doesn't contain the dependency we're looking
+ # for.
+ dep_manager._lookup_dict = {'dep1': mock.MagicMock(),
+ 'dep2': mock.MagicMock()}
+ with self.assertRaises(exceptions.NoPathFoundError):
+ dep_manager.FetchPath('dep', 'plat_arch_x86')
+
+ @mock.patch('os.path')
+ @mock.patch(
+ 'dependency_manager.DependencyManager._GetDependencyInfo')
+ @mock.patch(
+ 'dependency_manager.dependency_info.DependencyInfo.GetRemotePath') # pylint: disable=line-too-long
+ def testFetchPathLocalFile(self, cs_path_mock, dep_info_mock, path_mock):
+ dep_manager = dependency_manager.DependencyManager([])
+ self.assertFalse(cs_path_mock.call_args)
+ cs_path = 'cs_path'
+ dep_info = self.dep_info
+ cs_path_mock.return_value = cs_path
+ # The DependencyInfo returned should be passed through to LocalPath.
+ dep_info_mock.return_value = dep_info
+
+ # Non-empty lookup dict that contains the dependency we're looking for.
+ # Local path exists.
+ dep_manager._lookup_dict = {'dep': {'platform' : self.dep_info},
+ 'dep2': mock.MagicMock()}
+ self.fs.CreateFile('path1')
+ found_path = dep_manager.FetchPath('dep', 'platform')
+
+ self.assertEqual('path1', found_path)
+ self.assertFalse(cs_path_mock.call_args)
+
+
+ @mock.patch(
+ 'dependency_manager.dependency_info.DependencyInfo.GetRemotePath') # pylint: disable=line-too-long
+ def testFetchPathRemoteFile(
+ self, cs_path_mock):
+ dep_manager = dependency_manager.DependencyManager([])
+ self.assertFalse(cs_path_mock.call_args)
+ cs_path = 'cs_path'
+ def FakeCSPath():
+ self.fs.CreateFile(cs_path)
+ return cs_path
+ cs_path_mock.side_effect = FakeCSPath
+
+ # Non-empty lookup dict that contains the dependency we're looking for.
+ # Local path doesn't exist, but cloud_storage_path is downloaded.
+ dep_manager._lookup_dict = {'dep': {'platform' : self.dep_info,
+ 'plat1': mock.MagicMock()},
+ 'dep2': {'plat2': mock.MagicMock()}}
+ found_path = dep_manager.FetchPath('dep', 'platform')
+ self.assertEqual(cs_path, found_path)
+
+
+ @mock.patch(
+ 'dependency_manager.dependency_info.DependencyInfo.GetRemotePath') # pylint: disable=line-too-long
+ def testFetchPathError(
+ self, cs_path_mock):
+ dep_manager = dependency_manager.DependencyManager([])
+ self.assertFalse(cs_path_mock.call_args)
+ cs_path_mock.return_value = None
+ dep_manager._lookup_dict = {'dep': {'platform' : self.dep_info,
+ 'plat1': mock.MagicMock()},
+ 'dep2': {'plat2': mock.MagicMock()}}
+ # Non-empty lookup dict that contains the dependency we're looking for.
+ # Local path doesn't exist, and cloud_storage path wasn't successfully
+ # found.
+ self.assertRaises(exceptions.NoPathFoundError,
+ dep_manager.FetchPath, 'dep', 'platform')
+
+ cs_path_mock.side_effect = cloud_storage.CredentialsError
+ self.assertRaises(cloud_storage.CredentialsError,
+ dep_manager.FetchPath, 'dep', 'platform')
+
+ cs_path_mock.side_effect = cloud_storage.CloudStorageError
+ self.assertRaises(cloud_storage.CloudStorageError,
+ dep_manager.FetchPath, 'dep', 'platform')
+
+ cs_path_mock.side_effect = cloud_storage.PermissionError
+ self.assertRaises(cloud_storage.PermissionError,
+ dep_manager.FetchPath, 'dep', 'platform')
+
+ def testLocalPath(self):
+ dep_manager = dependency_manager.DependencyManager([])
+ # Empty lookup_dict
+ with self.assertRaises(exceptions.NoPathFoundError):
+ dep_manager.LocalPath('dep', 'plat')
+
+ def testLocalPathNoDependency(self):
+ # Non-empty lookup dict that doesn't contain the dependency we're looking
+ # for.
+ dep_manager = dependency_manager.DependencyManager([])
+ dep_manager._lookup_dict = {'dep1': mock.MagicMock(),
+ 'dep2': mock.MagicMock()}
+ with self.assertRaises(exceptions.NoPathFoundError):
+ dep_manager.LocalPath('dep', 'plat')
+
+ def testLocalPathExists(self):
+ # Non-empty lookup dict that contains the dependency we're looking for.
+ # Local path exists.
+ dep_manager = dependency_manager.DependencyManager([])
+ dep_manager._lookup_dict = {'dependency' : {'platform': self.dep_info},
+ 'dep1': mock.MagicMock(),
+ 'dep2': mock.MagicMock()}
+ self.fs.CreateFile('path1')
+ found_path = dep_manager.LocalPath('dependency', 'platform')
+
+ self.assertEqual('path1', found_path)
+
+ def testLocalPathMissingPaths(self):
+ # Non-empty lookup dict that contains the dependency we're looking for.
+ # Local path is found but doesn't exist.
+ dep_manager = dependency_manager.DependencyManager([])
+ dep_manager._lookup_dict = {'dependency' : {'platform': self.dep_info},
+ 'dep1': mock.MagicMock(),
+ 'dep2': mock.MagicMock()}
+ self.assertRaises(exceptions.NoPathFoundError,
+ dep_manager.LocalPath, 'dependency', 'platform')
+
+ def testLocalPathNoPaths(self):
+ # Non-empty lookup dict that contains the dependency we're looking for.
+ # Local path isn't found.
+ dep_manager = dependency_manager.DependencyManager([])
+ dep_info = dependency_manager.DependencyInfo(
+ 'dep', 'platform', 'config_file',
+ cloud_storage_info=self.cloud_storage_info)
+ dep_manager._lookup_dict = {'dependency' : {'platform': dep_info},
+ 'dep1': mock.MagicMock(),
+ 'dep2': mock.MagicMock()}
+ self.assertRaises(exceptions.NoPathFoundError,
+ dep_manager.LocalPath, 'dependency', 'platform')
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/dependency_manager_util.py b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/dependency_manager_util.py
new file mode 100644
index 0000000..7ec2ec6
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/dependency_manager_util.py
@@ -0,0 +1,103 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import shutil
+import stat
+import sys
+import zipfile_2_7_13 as zipfile
+
+from dependency_manager import exceptions
+
+
+def _WinReadOnlyHandler(func, path, execinfo):
+ if not os.access(path, os.W_OK):
+ os.chmod(path, stat.S_IWRITE)
+ func(path)
+ else:
+ raise execinfo[0], execinfo[1], execinfo[2]
+
+
+def RemoveDir(dir_path):
+ assert os.path.isabs(dir_path)
+ if sys.platform.startswith('win'):
+ dir_path = u'\\\\?\\' + dir_path
+ if os.path.isdir(dir_path):
+ shutil.rmtree(dir_path, onerror=_WinReadOnlyHandler)
+
+
+def VerifySafeArchive(archive):
+ def ResolvePath(path_name):
+ return os.path.realpath(os.path.abspath(path_name))
+ # Must add pathsep to avoid false positives.
+ # Ex: /tmp/abc/bad_file.py starts with /tmp/a but not /tmp/a/
+ base_path = ResolvePath(os.getcwd()) + os.path.sep
+ for member in archive.namelist():
+ if not ResolvePath(os.path.join(base_path, member)).startswith(base_path):
+ raise exceptions.ArchiveError(
+ 'Archive %s contains a bad member: %s.' % (archive.filename, member))
+
+
+def GetModeFromPath(file_path):
+ return stat.S_IMODE(os.stat(file_path).st_mode)
+
+
+def GetModeFromZipInfo(zip_info):
+ return zip_info.external_attr >> 16
+
+
+def SetUnzippedDirPermissions(archive, unzipped_dir):
+ """Set the file permissions in an unzipped archive.
+
+ Designed to be called right after extractall() was called on |archive|.
+ Noop on Win. Otherwise sets the executable bit on files where needed.
+
+ Args:
+ archive: A zipfile.ZipFile object opened for reading.
+ unzipped_dir: A path to a directory containing the unzipped contents
+ of |archive|.
+ """
+ if sys.platform.startswith('win'):
+ # Windows doesn't have an executable bit, so don't mess with the ACLs.
+ return
+ for zip_info in archive.infolist():
+ archive_acls = GetModeFromZipInfo(zip_info)
+ if archive_acls & stat.S_IXUSR:
+ # Only preserve owner execurable permissions.
+ unzipped_path = os.path.abspath(
+ os.path.join(unzipped_dir, zip_info.filename))
+ mode = GetModeFromPath(unzipped_path)
+ os.chmod(unzipped_path, mode | stat.S_IXUSR)
+
+
+def UnzipArchive(archive_path, unzip_path):
+ """Unzips a file if it is a zip file.
+
+ Args:
+ archive_path: The downloaded file to unzip.
+ unzip_path: The destination directory to unzip to.
+
+ Raises:
+ ValueError: If |archive_path| is not a zipfile.
+ """
+ # TODO(aiolos): Add tests once the refactor is completed. crbug.com/551158
+ if not (archive_path and zipfile.is_zipfile(archive_path)):
+ raise ValueError(
+ 'Attempting to unzip a non-archive file at %s' % archive_path)
+ if not os.path.exists(unzip_path):
+ os.makedirs(unzip_path)
+ try:
+ with zipfile.ZipFile(archive_path, 'r') as archive:
+ VerifySafeArchive(archive)
+ assert os.path.isabs(unzip_path)
+ unzip_path_without_prefix = unzip_path
+ if sys.platform.startswith('win'):
+ unzip_path = u'\\\\?\\' + unzip_path
+ archive.extractall(path=unzip_path)
+ SetUnzippedDirPermissions(archive, unzip_path)
+ except:
+ # Hack necessary because isdir doesn't work with escaped paths on Windows.
+ if unzip_path_without_prefix and os.path.isdir(unzip_path_without_prefix):
+ RemoveDir(unzip_path_without_prefix)
+ raise
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/dependency_manager_util_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/dependency_manager_util_unittest.py
new file mode 100644
index 0000000..c62bfd5
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/dependency_manager_util_unittest.py
@@ -0,0 +1,193 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import shutil
+import stat
+import sys
+import tempfile
+import unittest
+import uuid
+import zipfile
+
+import mock
+
+from dependency_manager import dependency_manager_util
+from dependency_manager import exceptions
+
+
+class DependencyManagerUtilTest(unittest.TestCase):
+ # This class intentionally uses actual file I/O to test real system behavior.
+
+ def setUp(self):
+ self.tmp_dir = os.path.abspath(tempfile.mkdtemp(prefix='telemetry'))
+ self.sub_dir = os.path.join(self.tmp_dir, 'sub_dir')
+ os.mkdir(self.sub_dir)
+
+ self.read_only_path = (os.path.join(self.tmp_dir, 'read_only'))
+ with open(self.read_only_path, 'w+') as read_file:
+ read_file.write('Read-only file')
+ os.chmod(self.read_only_path, stat.S_IRUSR)
+
+ self.writable_path = (os.path.join(self.tmp_dir, 'writable'))
+ with open(self.writable_path, 'w+') as writable_file:
+ writable_file.write('Writable file')
+ os.chmod(self.writable_path, stat.S_IRUSR | stat.S_IWUSR)
+
+ self.executable_path = (os.path.join(self.tmp_dir, 'executable'))
+ with open(self.executable_path, 'w+') as executable_file:
+ executable_file.write('Executable file')
+ os.chmod(self.executable_path, stat.S_IRWXU)
+
+ self.sub_read_only_path = (os.path.join(self.sub_dir, 'read_only'))
+ with open(self.sub_read_only_path, 'w+') as read_file:
+ read_file.write('Read-only sub file')
+ os.chmod(self.sub_read_only_path, stat.S_IRUSR)
+
+ self.sub_writable_path = (os.path.join(self.sub_dir, 'writable'))
+ with open(self.sub_writable_path, 'w+') as writable_file:
+ writable_file.write('Writable sub file')
+ os.chmod(self.sub_writable_path, stat.S_IRUSR | stat.S_IWUSR)
+
+ self.sub_executable_path = (os.path.join(self.sub_dir, 'executable'))
+ with open(self.sub_executable_path, 'w+') as executable_file:
+ executable_file.write('Executable sub file')
+ os.chmod(self.sub_executable_path, stat.S_IRWXU)
+
+ self.AssertExpectedDirFiles(self.tmp_dir)
+ self.archive_path = self.CreateZipArchiveFromDir(self.tmp_dir)
+
+ def tearDown(self):
+ if os.path.isdir(self.tmp_dir):
+ dependency_manager_util.RemoveDir(self.tmp_dir)
+ if os.path.isfile(self.archive_path):
+ os.remove(self.archive_path)
+
+ def AssertExpectedDirFiles(self, top_dir):
+ sub_dir = os.path.join(top_dir, 'sub_dir')
+ read_only_path = (os.path.join(top_dir, 'read_only'))
+ writable_path = (os.path.join(top_dir, 'writable'))
+ executable_path = (os.path.join(top_dir, 'executable'))
+ sub_read_only_path = (os.path.join(sub_dir, 'read_only'))
+ sub_writable_path = (os.path.join(sub_dir, 'writable'))
+ sub_executable_path = (os.path.join(sub_dir, 'executable'))
+ # assert contents as expected
+ self.assertTrue(os.path.isdir(top_dir))
+ self.assertTrue(os.path.isdir(sub_dir))
+ self.assertTrue(os.path.isfile(read_only_path))
+ self.assertTrue(os.path.isfile(writable_path))
+ self.assertTrue(os.path.isfile(executable_path))
+ self.assertTrue(os.path.isfile(sub_read_only_path))
+ self.assertTrue(os.path.isfile(sub_writable_path))
+ self.assertTrue(os.path.isfile(sub_executable_path))
+
+ # assert permissions as expected
+ self.assertTrue(
+ stat.S_IRUSR & stat.S_IMODE(os.stat(read_only_path).st_mode))
+ self.assertTrue(
+ stat.S_IRUSR & stat.S_IMODE(os.stat(sub_read_only_path).st_mode))
+ self.assertTrue(
+ stat.S_IRUSR & stat.S_IMODE(os.stat(writable_path).st_mode))
+ self.assertTrue(
+ stat.S_IWUSR & stat.S_IMODE(os.stat(writable_path).st_mode))
+ self.assertTrue(
+ stat.S_IRUSR & stat.S_IMODE(os.stat(sub_writable_path).st_mode))
+ self.assertTrue(
+ stat.S_IWUSR & stat.S_IMODE(os.stat(sub_writable_path).st_mode))
+ if not sys.platform.startswith('win'):
+ self.assertEqual(
+ stat.S_IRWXU,
+ stat.S_IRWXU & stat.S_IMODE(os.stat(executable_path).st_mode))
+ self.assertEqual(
+ stat.S_IRWXU,
+ stat.S_IRWXU & stat.S_IMODE(os.stat(sub_executable_path).st_mode))
+
+ def CreateZipArchiveFromDir(self, dir_path):
+ try:
+ base_path = os.path.join(tempfile.gettempdir(), str(uuid.uuid4()))
+ archive_path = shutil.make_archive(base_path, 'zip', dir_path)
+ self.assertTrue(os.path.exists(archive_path))
+ self.assertTrue(zipfile.is_zipfile(archive_path))
+ except:
+ if os.path.isfile(archive_path):
+ os.remove(archive_path)
+ raise
+ return archive_path
+
+ def testRemoveDirWithSubDir(self):
+ dependency_manager_util.RemoveDir(self.tmp_dir)
+
+ self.assertFalse(os.path.exists(self.tmp_dir))
+ self.assertFalse(os.path.exists(self.sub_dir))
+ self.assertFalse(os.path.exists(self.read_only_path))
+ self.assertFalse(os.path.exists(self.writable_path))
+ self.assertFalse(os.path.isfile(self.executable_path))
+ self.assertFalse(os.path.exists(self.sub_read_only_path))
+ self.assertFalse(os.path.exists(self.sub_writable_path))
+ self.assertFalse(os.path.isfile(self.sub_executable_path))
+
+ def testUnzipFile(self):
+ self.AssertExpectedDirFiles(self.tmp_dir)
+ unzip_path = os.path.join(tempfile.gettempdir(), str(uuid.uuid4()))
+ dependency_manager_util.UnzipArchive(self.archive_path, unzip_path)
+ self.AssertExpectedDirFiles(unzip_path)
+ self.AssertExpectedDirFiles(self.tmp_dir)
+ dependency_manager_util.RemoveDir(unzip_path)
+
+ def testUnzipFileContainingLongPath(self):
+ try:
+ dir_path = self.tmp_dir
+ if sys.platform.startswith('win'):
+ dir_path = u'\\\\?\\' + dir_path
+
+ archive_suffix = ''
+ # 260 is the Windows API path length limit.
+ while len(archive_suffix) < 260:
+ archive_suffix = os.path.join(archive_suffix, 'really')
+ contents_dir_path = os.path.join(dir_path, archive_suffix)
+ os.makedirs(contents_dir_path)
+ filename = os.path.join(contents_dir_path, 'longpath.txt')
+ open(filename, 'a').close()
+
+ base_path = os.path.join(tempfile.gettempdir(), str(uuid.uuid4()))
+ archive_path = shutil.make_archive(base_path, 'zip', dir_path)
+ self.assertTrue(os.path.exists(archive_path))
+ self.assertTrue(zipfile.is_zipfile(archive_path))
+ except:
+ if os.path.isfile(archive_path):
+ os.remove(archive_path)
+ raise
+
+ unzip_path = os.path.join(tempfile.gettempdir(), str(uuid.uuid4()))
+ dependency_manager_util.UnzipArchive(archive_path, unzip_path)
+ dependency_manager_util.RemoveDir(unzip_path)
+
+ def testUnzipFileFailure(self):
+ unzip_path = os.path.join(tempfile.gettempdir(), str(uuid.uuid4()))
+ self.assertFalse(os.path.exists(unzip_path))
+ with mock.patch(
+ 'dependency_manager.dependency_manager_util.zipfile.ZipFile.extractall' # pylint: disable=line-too-long
+ ) as zipfile_mock:
+ zipfile_mock.side_effect = IOError
+ self.assertRaises(
+ IOError, dependency_manager_util.UnzipArchive, self.archive_path,
+ unzip_path)
+ self.AssertExpectedDirFiles(self.tmp_dir)
+ self.assertFalse(os.path.exists(unzip_path))
+
+ def testVerifySafeArchivePasses(self):
+ with zipfile.ZipFile(self.archive_path) as archive:
+ dependency_manager_util.VerifySafeArchive(archive)
+
+ def testVerifySafeArchiveFailsOnRelativePathWithPardir(self):
+ tmp_file = tempfile.NamedTemporaryFile(delete=False)
+ tmp_file_name = tmp_file.name
+ tmp_file.write('Bad file!')
+ tmp_file.close()
+ with zipfile.ZipFile(self.archive_path, 'w') as archive:
+ archive.write(tmp_file_name, '../../foo')
+ self.assertRaises(
+ exceptions.ArchiveError, dependency_manager_util.VerifySafeArchive,
+ archive)
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/exceptions.py b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/exceptions.py
new file mode 100644
index 0000000..d7863db
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/exceptions.py
@@ -0,0 +1,52 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from py_utils import cloud_storage
+
+
+CloudStorageError = cloud_storage.CloudStorageError
+
+
+class UnsupportedConfigFormatError(ValueError):
+ def __init__(self, config_type, config_file):
+ if not config_type:
+ message = ('The json file at %s is unsupported by the dependency_manager '
+ 'due to no specified config type' % config_file)
+ else:
+ message = ('The json file at %s has config type %s, which is unsupported '
+ 'by the dependency manager.' % (config_file, config_type))
+ super(UnsupportedConfigFormatError, self).__init__(message)
+
+
+class EmptyConfigError(ValueError):
+ def __init__(self, file_path):
+ super(EmptyConfigError, self).__init__('Empty config at %s.' % file_path)
+
+
+class FileNotFoundError(Exception):
+ def __init__(self, file_path):
+ super(FileNotFoundError, self).__init__('No file found at %s' % file_path)
+
+
+class NoPathFoundError(Exception):
+ def __init__(self, dependency, platform):
+ super(NoPathFoundError, self).__init__(
+ 'No file could be found locally, and no file to download from cloud '
+ 'storage for %s on platform %s' % (dependency, platform))
+
+
+class ReadWriteError(Exception):
+ pass
+
+
+class CloudStorageUploadConflictError(CloudStorageError):
+ def __init__(self, bucket, path):
+ super(CloudStorageUploadConflictError, self).__init__(
+ 'File location %s already exists in bucket %s' % (path, bucket))
+
+
+class ArchiveError(Exception):
+ def __init__(self, msg):
+ super(ArchiveError, self).__init__(msg)
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/local_path_info.py b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/local_path_info.py
new file mode 100644
index 0000000..0103e8f
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/local_path_info.py
@@ -0,0 +1,40 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+
+
+class LocalPathInfo(object):
+
+ def __init__(self, path_priority_groups):
+ self._path_priority_groups = self._ParseLocalPaths(path_priority_groups)
+
+ def GetLocalPath(self):
+ for priority_group in self._path_priority_groups:
+ priority_group = filter(os.path.exists, priority_group)
+ if not priority_group:
+ continue
+ return max(priority_group, key=lambda path: os.stat(path).st_mtime)
+ return None
+
+ def IsPathInLocalPaths(self, path):
+ return any(
+ path in priority_group for priority_group in self._path_priority_groups)
+
+ def Update(self, local_path_info):
+ if not local_path_info:
+ return
+ for priority_group in local_path_info._path_priority_groups:
+ group_list = []
+ for path in priority_group:
+ if not self.IsPathInLocalPaths(path):
+ group_list.append(path)
+ if group_list:
+ self._path_priority_groups.append(group_list)
+
+ @staticmethod
+ def _ParseLocalPaths(local_paths):
+ if not local_paths:
+ return []
+ return [[e] if isinstance(e, basestring) else e for e in local_paths]
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/manager.py b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/manager.py
new file mode 100644
index 0000000..69ca550
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/manager.py
@@ -0,0 +1,247 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import logging
+import os
+
+from dependency_manager import base_config
+from dependency_manager import exceptions
+
+
+DEFAULT_TYPE = 'default'
+
+
+class DependencyManager(object):
+ def __init__(self, configs, supported_config_types=None):
+ """Manages file dependencies found locally or in cloud_storage.
+
+ Args:
+ configs: A list of instances of BaseConfig or it's subclasses, passed
+ in decreasing order of precedence.
+ supported_config_types: A list of whitelisted config_types.
+ No restrictions if None is specified.
+
+ Raises:
+ ValueError: If |configs| is not a list of instances of BaseConfig or
+ its subclasses.
+ UnsupportedConfigFormatError: If supported_config_types is specified and
+ configs contains a config not in the supported config_types.
+
+ Example: DependencyManager([config1, config2, config3])
+ No requirements on the type of Config, and any dependencies that have
+ local files for the same platform will first look in those from
+ config1, then those from config2, and finally those from config3.
+ """
+ if configs is None or type(configs) != list:
+ raise ValueError(
+ 'Must supply a list of config files to DependencyManager')
+ # self._lookup_dict is a dictionary with the following format:
+ # { dependency1: {platform1: dependency_info1,
+ # platform2: dependency_info2}
+ # dependency2: {platform1: dependency_info3,
+ # ...}
+ # ...}
+ #
+ # Where the dependencies and platforms are strings, and the
+ # dependency_info's are DependencyInfo instances.
+ self._lookup_dict = {}
+ self.supported_configs = supported_config_types or []
+ for config in configs:
+ self._UpdateDependencies(config)
+
+
+ def FetchPathWithVersion(self, dependency, platform):
+ """Get a path to an executable for |dependency|, downloading as needed.
+
+ A path to a default executable may be returned if a platform specific
+ version is not specified in the config(s).
+
+ Args:
+ dependency: Name of the desired dependency, as given in the config(s)
+ used in this DependencyManager.
+ platform: Name of the platform the dependency will run on. Often of the
+ form 'os_architecture'. Must match those specified in the config(s)
+ used in this DependencyManager.
+ Returns:
+ <path>, <version> where:
+ <path> is the path to an executable of |dependency| that will run
+ on |platform|, downloading from cloud storage if needed.
+ <version> is the version of the executable at <path> or None.
+
+ Raises:
+ NoPathFoundError: If a local copy of the executable cannot be found and
+ a remote path could not be downloaded from cloud_storage.
+ CredentialsError: If cloud_storage credentials aren't configured.
+ PermissionError: If cloud_storage credentials are configured, but not
+ with an account that has permission to download the remote file.
+ NotFoundError: If the remote file does not exist where expected in
+ cloud_storage.
+ ServerError: If an internal server error is hit while downloading the
+ remote file.
+ CloudStorageError: If another error occured while downloading the remote
+ path.
+ FileNotFoundError: If an attempted download was otherwise unsuccessful.
+
+ """
+ dependency_info = self._GetDependencyInfo(dependency, platform)
+ if not dependency_info:
+ raise exceptions.NoPathFoundError(dependency, platform)
+ path = dependency_info.GetLocalPath()
+ version = None
+ if not path or not os.path.exists(path):
+ path = dependency_info.GetRemotePath()
+ if not path or not os.path.exists(path):
+ raise exceptions.NoPathFoundError(dependency, platform)
+ version = dependency_info.GetRemotePathVersion()
+ return path, version
+
+ def FetchPath(self, dependency, platform):
+ """Get a path to an executable for |dependency|, downloading as needed.
+
+ A path to a default executable may be returned if a platform specific
+ version is not specified in the config(s).
+
+ Args:
+ dependency: Name of the desired dependency, as given in the config(s)
+ used in this DependencyManager.
+ platform: Name of the platform the dependency will run on. Often of the
+ form 'os_architecture'. Must match those specified in the config(s)
+ used in this DependencyManager.
+ Returns:
+ A path to an executable of |dependency| that will run on |platform|,
+ downloading from cloud storage if needed.
+
+ Raises:
+ NoPathFoundError: If a local copy of the executable cannot be found and
+ a remote path could not be downloaded from cloud_storage.
+ CredentialsError: If cloud_storage credentials aren't configured.
+ PermissionError: If cloud_storage credentials are configured, but not
+ with an account that has permission to download the remote file.
+ NotFoundError: If the remote file does not exist where expected in
+ cloud_storage.
+ ServerError: If an internal server error is hit while downloading the
+ remote file.
+ CloudStorageError: If another error occured while downloading the remote
+ path.
+ FileNotFoundError: If an attempted download was otherwise unsuccessful.
+
+ """
+ path, _ = self.FetchPathWithVersion(dependency, platform)
+ return path
+
+ def LocalPath(self, dependency, platform):
+ """Get a path to a locally stored executable for |dependency|.
+
+ A path to a default executable may be returned if a platform specific
+ version is not specified in the config(s).
+ Will not download the executable.
+
+ Args:
+ dependency: Name of the desired dependency, as given in the config(s)
+ used in this DependencyManager.
+ platform: Name of the platform the dependency will run on. Often of the
+ form 'os_architecture'. Must match those specified in the config(s)
+ used in this DependencyManager.
+ Returns:
+ A path to an executable for |dependency| that will run on |platform|.
+
+ Raises:
+ NoPathFoundError: If a local copy of the executable cannot be found.
+ """
+ dependency_info = self._GetDependencyInfo(dependency, platform)
+ if not dependency_info:
+ raise exceptions.NoPathFoundError(dependency, platform)
+ local_path = dependency_info.GetLocalPath()
+ if not local_path or not os.path.exists(local_path):
+ raise exceptions.NoPathFoundError(dependency, platform)
+ return local_path
+
+ def PrefetchPaths(self, platform, dependencies=None, cloud_storage_retries=3):
+ if not dependencies:
+ dependencies = self._lookup_dict.keys()
+
+ skipped_deps = []
+ found_deps = []
+ missing_deps = []
+ for dependency in dependencies:
+ dependency_info = self._GetDependencyInfo(dependency, platform)
+ if not dependency_info:
+ # The dependency is only configured for other platforms.
+ skipped_deps.append(dependency)
+ logging.warning(
+ 'Dependency %s not configured for platform %s. Skipping prefetch.',
+ dependency, platform)
+ continue
+ local_path = dependency_info.GetLocalPath()
+ if local_path:
+ found_deps.append(dependency)
+ continue
+ fetched_path = None
+ for _ in range(0, cloud_storage_retries + 1):
+ try:
+ fetched_path = dependency_info.GetRemotePath()
+ except exceptions.CloudStorageError:
+ continue
+ break
+ if fetched_path:
+ found_deps.append(dependency)
+ else:
+ missing_deps.append(dependency)
+ logging.error(
+ 'Dependency %s could not be found or fetched from cloud storage for'
+ ' platform %s.', dependency, platform)
+ if missing_deps:
+ raise exceptions.NoPathFoundError(', '.join(missing_deps), platform)
+ return (found_deps, skipped_deps)
+
+ def _UpdateDependencies(self, config):
+ """Add the dependency information stored in |config| to this instance.
+
+ Args:
+ config: An instances of BaseConfig or a subclasses.
+
+ Raises:
+ UnsupportedConfigFormatError: If supported_config_types was specified
+ and config is not in the supported config_types.
+ """
+ if not isinstance(config, base_config.BaseConfig):
+ raise ValueError('Must use a BaseConfig or subclass instance with the '
+ 'DependencyManager.')
+ if (self.supported_configs and
+ config.GetConfigType() not in self.supported_configs):
+ raise exceptions.UnsupportedConfigFormatError(config.GetConfigType(),
+ config.config_path)
+ for dep_info in config.IterDependencyInfo():
+ dependency = dep_info.dependency
+ platform = dep_info.platform
+ if dependency not in self._lookup_dict:
+ self._lookup_dict[dependency] = {}
+ if platform not in self._lookup_dict[dependency]:
+ self._lookup_dict[dependency][platform] = dep_info
+ else:
+ self._lookup_dict[dependency][platform].Update(dep_info)
+
+
+ def _GetDependencyInfo(self, dependency, platform):
+ """Get information for |dependency| on |platform|, or a default if needed.
+
+ Args:
+ dependency: Name of the desired dependency, as given in the config(s)
+ used in this DependencyManager.
+ platform: Name of the platform the dependency will run on. Often of the
+ form 'os_architecture'. Must match those specified in the config(s)
+ used in this DependencyManager.
+
+ Returns: The dependency_info for |dependency| on |platform| if it exists.
+ Or the default version of |dependency| if it exists, or None if neither
+ exist.
+ """
+ if not self._lookup_dict or dependency not in self._lookup_dict:
+ return None
+ dependency_dict = self._lookup_dict[dependency]
+ device_type = platform
+ if not device_type in dependency_dict:
+ device_type = DEFAULT_TYPE
+ return dependency_dict.get(device_type)
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/uploader.py b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/uploader.py
new file mode 100644
index 0000000..e88b7c0
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/uploader.py
@@ -0,0 +1,108 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import logging
+import os
+
+from py_utils import cloud_storage
+
+from dependency_manager import exceptions
+
+
+BACKUP_PATH_EXTENSION = 'old'
+
+
+class CloudStorageUploader(object):
+ def __init__(self, bucket, remote_path, local_path, cs_backup_path=None):
+ if not bucket or not remote_path or not local_path:
+ raise ValueError(
+ 'Attempted to partially initialize upload data with bucket %s, '
+ 'remote_path %s, and local_path %s', bucket, remote_path, local_path)
+ if not os.path.exists(local_path):
+ raise ValueError('Attempting to initilize UploadInfo with missing '
+ 'local path %s', local_path)
+
+ self._cs_bucket = bucket
+ self._cs_remote_path = remote_path
+ self._local_path = local_path
+ self._cs_backup_path = (cs_backup_path or
+ '%s.%s' % (self._cs_remote_path,
+ BACKUP_PATH_EXTENSION))
+ self._updated = False
+ self._backed_up = False
+
+ def Upload(self, force=False):
+ """Upload all pending files and then write the updated config to disk.
+
+ Will attempt to copy files existing in the upload location to a backup
+ location in the same bucket in cloud storage if |force| is True.
+
+ Args:
+ force: True if files should be uploaded to cloud storage even if a
+ file already exists in the upload location.
+
+ Raises:
+ CloudStorageUploadConflictError: If |force| is False and the potential
+ upload location of a file already exists.
+ CloudStorageError: If copying an existing file to the backup location
+ or uploading the new file fails.
+ """
+ if cloud_storage.Exists(self._cs_bucket, self._cs_remote_path):
+ if not force:
+ #pylint: disable=nonstandard-exception
+ raise exceptions.CloudStorageUploadConflictError(self._cs_bucket,
+ self._cs_remote_path)
+ #pylint: enable=nonstandard-exception
+ logging.debug('A file already exists at upload path %s in self.cs_bucket'
+ ' %s', self._cs_remote_path, self._cs_bucket)
+ try:
+ cloud_storage.Copy(self._cs_bucket, self._cs_bucket,
+ self._cs_remote_path, self._cs_backup_path)
+ self._backed_up = True
+ except cloud_storage.CloudStorageError:
+ logging.error('Failed to copy existing file %s in cloud storage bucket '
+ '%s to backup location %s', self._cs_remote_path,
+ self._cs_bucket, self._cs_backup_path)
+ raise
+
+ try:
+ cloud_storage.Insert(
+ self._cs_bucket, self._cs_remote_path, self._local_path)
+ except cloud_storage.CloudStorageError:
+ logging.error('Failed to upload %s to %s in cloud_storage bucket %s',
+ self._local_path, self._cs_remote_path, self._cs_bucket)
+ raise
+ self._updated = True
+
+ def Rollback(self):
+ """Attempt to undo the previous call to Upload.
+
+ Does nothing if no previous call to Upload was made, or if nothing was
+ successfully changed.
+
+ Returns:
+ True iff changes were successfully rolled back.
+ Raises:
+ CloudStorageError: If copying the backed up file to its original
+ location or removing the uploaded file fails.
+ """
+ cloud_storage_changed = False
+ if self._backed_up:
+ cloud_storage.Copy(self._cs_bucket, self._cs_bucket, self._cs_backup_path,
+ self._cs_remote_path)
+ cloud_storage_changed = True
+ self._cs_backup_path = None
+ elif self._updated:
+ cloud_storage.Delete(self._cs_bucket, self._cs_remote_path)
+ cloud_storage_changed = True
+ self._updated = False
+ return cloud_storage_changed
+
+ def __eq__(self, other, msg=None):
+ if type(self) != type(other):
+ return False
+ return (self._local_path == other._local_path and
+ self._cs_remote_path == other._cs_remote_path and
+ self._cs_bucket == other._cs_bucket)
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/uploader_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/uploader_unittest.py
new file mode 100644
index 0000000..5c8e2a0
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/dependency_manager/uploader_unittest.py
@@ -0,0 +1,91 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+
+from pyfakefs import fake_filesystem_unittest
+
+from dependency_manager import uploader
+
+
+class CloudStorageUploaderTest(fake_filesystem_unittest.TestCase):
+ def setUp(self):
+ self.setUpPyfakefs()
+ self.bucket = 'cloud_storage_bucket'
+ self.local_path = os.path.abspath(os.path.join('path', 'to', 'dependency'))
+ self.fs.CreateFile(self.local_path)
+ self.remote_path = 'config_folder/remote_path'
+
+ def testCloudStorageUploaderMissingData(self):
+ self.assertRaises(ValueError, uploader.CloudStorageUploader,
+ None, self.remote_path, self.local_path)
+ self.assertRaises(ValueError, uploader.CloudStorageUploader,
+ self.bucket, None, self.local_path)
+ self.assertRaises(ValueError, uploader.CloudStorageUploader,
+ self.bucket, self.remote_path, None)
+
+ def testCloudStorageUploaderLocalFileMissing(self):
+ self.fs.RemoveObject(self.local_path)
+ self.assertRaises(ValueError, uploader.CloudStorageUploader,
+ self.bucket, self.remote_path, self.local_path)
+
+ def testCloudStorageUploaderCreation(self):
+ upload_data = uploader.CloudStorageUploader(
+ self.bucket, self.remote_path, self.local_path)
+ expected_bucket = self.bucket
+ expected_remote_path = self.remote_path
+ expected_cs_backup_path = '%s.old' % expected_remote_path
+ expected_local_path = self.local_path
+ self.assertEqual(expected_bucket, upload_data._cs_bucket)
+ self.assertEqual(expected_remote_path, upload_data._cs_remote_path)
+ self.assertEqual(expected_local_path, upload_data._local_path)
+ self.assertEqual(expected_cs_backup_path, upload_data._cs_backup_path)
+
+ def testCloudStorageUploaderEquality(self):
+ upload_data = uploader.CloudStorageUploader(
+ self.bucket, self.remote_path, self.local_path)
+ upload_data_exact = uploader.CloudStorageUploader(
+ self.bucket, self.remote_path, self.local_path)
+ upload_data_equal = uploader.CloudStorageUploader(
+ 'cloud_storage_bucket',
+ 'config_folder/remote_path',
+ os.path.abspath(os.path.join('path', 'to', 'dependency')))
+ self.assertEqual(upload_data, upload_data)
+ self.assertEqual(upload_data, upload_data_exact)
+ self.assertEqual(upload_data_exact, upload_data)
+ self.assertEqual(upload_data, upload_data_equal)
+ self.assertEqual(upload_data_equal, upload_data)
+
+
+ def testCloudStorageUploaderInequality(self):
+ new_local_path = os.path.abspath(os.path.join('new', 'local', 'path'))
+ self.fs.CreateFile(new_local_path)
+ new_bucket = 'new_bucket'
+ new_remote_path = 'new_remote/path'
+
+ upload_data = uploader.CloudStorageUploader(
+ self.bucket, self.remote_path, self.local_path)
+ upload_data_all_different = uploader.CloudStorageUploader(
+ new_bucket, new_remote_path, new_local_path)
+ upload_data_different_bucket = uploader.CloudStorageUploader(
+ new_bucket, self.remote_path, self.local_path)
+ upload_data_different_remote_path = uploader.CloudStorageUploader(
+ self.bucket, new_remote_path, self.local_path)
+ upload_data_different_local_path = uploader.CloudStorageUploader(
+ self.bucket, self.remote_path, new_local_path)
+
+ self.assertNotEqual(upload_data, 'a string!')
+ self.assertNotEqual(upload_data, 0)
+ self.assertNotEqual(upload_data, 2354)
+ self.assertNotEqual(upload_data, None)
+ self.assertNotEqual(upload_data, upload_data_all_different)
+ self.assertNotEqual(upload_data_all_different, upload_data)
+ self.assertNotEqual(upload_data, upload_data_different_bucket)
+ self.assertNotEqual(upload_data_different_bucket, upload_data)
+ self.assertNotEqual(upload_data, upload_data_different_remote_path)
+ self.assertNotEqual(upload_data_different_remote_path, upload_data)
+ self.assertNotEqual(upload_data, upload_data_different_local_path)
+ self.assertNotEqual(upload_data_different_local_path, upload_data)
+
+ #TODO: write unittests for upload and rollback
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/pylintrc b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/pylintrc
new file mode 100644
index 0000000..4541fb8
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/dependency_manager/pylintrc
@@ -0,0 +1,68 @@
+[MESSAGES CONTROL]
+
+# Disable the message, report, category or checker with the given id(s).
+# TODO: Shrink this list to as small as possible.
+disable=
+ design,
+ similarities,
+
+ fixme,
+ locally-disabled,
+ locally-enabled,
+ missing-docstring,
+ no-member,
+ no-self-use,
+ protected-access,
+ star-args,
+
+
+[REPORTS]
+
+# Don't write out full reports, just messages.
+reports=no
+
+
+[BASIC]
+
+# Regular expression which should only match correct function names.
+function-rgx=^(?:(?P<exempt>setUp|tearDown|setUpModule|tearDownModule)|(?P<camel_case>_?[A-Z][a-zA-Z0-9]*))$
+
+# Regular expression which should only match correct method names.
+method-rgx=^(?:(?P<exempt>_[a-z0-9_]+__|get|post|runTest|setUp|tearDown|setUpTestCase|tearDownTestCase|setupSelf|tearDownClass|setUpClass)|(?P<camel_case>(_{0,2}|test|assert)[A-Z][a-zA-Z0-9_]*))$
+
+# Regular expression which should only match correct argument names.
+argument-rgx=^[a-z][a-z0-9_]*$
+
+# Regular expression which should only match correct variable names.
+variable-rgx=^[a-z][a-z0-9_]*$
+
+# Good variable names which should always be accepted, separated by a comma.
+good-names=main,_
+
+# List of builtins function names that should not be used, separated by a comma.
+bad-functions=apply,input,reduce
+
+
+[VARIABLES]
+
+# Tells wether we should check for unused import in __init__ files.
+init-import=no
+
+# A regular expression matching names used for dummy variables (i.e. not used).
+dummy-variables-rgx=^\*{0,2}(_$|unused_)
+
+
+[TYPECHECK]
+
+# Tells wether missing members accessed in mixin class should be ignored. A
+# mixin class is detected if its name ends with "mixin" (case insensitive).
+ignore-mixin-members=yes
+
+
+[FORMAT]
+
+# Maximum number of lines in a module.
+max-module-lines=2000
+
+# We use two spaces for indents, instead of the usual four spaces or tab.
+indent-string=' '
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/PRESUBMIT.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/PRESUBMIT.py
new file mode 100644
index 0000000..289a5c6
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/PRESUBMIT.py
@@ -0,0 +1,81 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Presubmit script for devil.
+
+See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts for
+details on the presubmit API built into depot_tools.
+"""
+
+
+def _RunPylint(input_api, output_api):
+ return input_api.RunTests(input_api.canned_checks.RunPylint(
+ input_api, output_api, pylintrc='pylintrc'))
+
+
+def _RunUnitTests(input_api, output_api):
+ def J(*dirs):
+ """Returns a path relative to presubmit directory."""
+ return input_api.os_path.join(
+ input_api.PresubmitLocalPath(), 'devil', *dirs)
+
+ test_env = dict(input_api.environ)
+ test_env.update({
+ 'PYTHONDONTWRITEBYTECODE': '1',
+ 'PYTHONPATH': ':'.join([J(), J('..')]),
+ })
+
+ message_type = (output_api.PresubmitError if input_api.is_committing
+ else output_api.PresubmitPromptWarning)
+
+ return input_api.RunTests([
+ input_api.Command(
+ name='devil/bin/run_py_tests',
+ cmd=[
+ input_api.os_path.join(
+ input_api.PresubmitLocalPath(), 'bin', 'run_py_tests')],
+ kwargs={'env': test_env},
+ message=message_type)])
+
+
+def _EnsureNoPylibUse(input_api, output_api):
+ def other_python_files(f):
+ this_presubmit_file = input_api.os_path.join(
+ input_api.PresubmitLocalPath(), 'PRESUBMIT.py')
+ return (f.LocalPath().endswith('.py')
+ and not f.AbsoluteLocalPath() == this_presubmit_file)
+
+ changed_files = input_api.AffectedSourceFiles(other_python_files)
+ import_error_re = input_api.re.compile(
+ r'(from pylib.* import)|(import pylib)')
+
+ errors = []
+ for f in changed_files:
+ errors.extend(
+ '%s:%d' % (f.LocalPath(), line_number)
+ for line_number, line_text in f.ChangedContents()
+ if import_error_re.search(line_text))
+
+ if errors:
+ return [output_api.PresubmitError(
+ 'pylib modules should not be imported from devil modules.',
+ items=errors)]
+ return []
+
+
+def CommonChecks(input_api, output_api):
+ output = []
+ output += _RunPylint(input_api, output_api)
+ output += _RunUnitTests(input_api, output_api)
+ output += _EnsureNoPylibUse(input_api, output_api)
+ return output
+
+
+def CheckChangeOnUpload(input_api, output_api):
+ return CommonChecks(input_api, output_api)
+
+
+def CheckChangeOnCommit(input_api, output_api):
+ return CommonChecks(input_api, output_api)
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/README.md b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/README.md
new file mode 100644
index 0000000..852ac37
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/README.md
@@ -0,0 +1,37 @@
+<!-- Copyright 2015 The Chromium Authors. All rights reserved.
+ Use of this source code is governed by a BSD-style license that can be
+ found in the LICENSE file.
+-->
+## devil
+
+😈
+
+devil is a library used by the Chromium developers to interact with Android
+devices. It currently supports SDK level 16 and above.
+
+## Interfaces
+
+devil provides python APIs:
+ - [`devil.android.adb_wrapper`](docs/adb_wrapper.md) provides a thin wrapper
+ around the adb binary. Most functions and methods have direct analogues on
+ the adb command-line.
+ - [`devil.android.device_utils`](docs/device_utils.md) provides higher-level
+ functionality built on top of `adb_wrapper`. **This is the primary
+ mechanism through which chromium's scripts interact with devices.**
+
+## Utilities
+
+devil also provides command-line utilities:
+ - [`devil/utils/markdown.py`](docs/markdown.md) generated markdown
+ documentation for python modules.
+
+## Constraints and Caveats
+
+devil is used with python 2.7. Its compatibility with python 3 has not been
+tested, and neither achieving nor maintaining said compatibility is currently
+a priority.
+
+## Contributing
+
+Please see the [contributor's guide](https://github.com/catapult-project/catapult/blob/master/CONTRIBUTING.md).
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/__init__.py
new file mode 100644
index 0000000..7de59c9
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/__init__.py
@@ -0,0 +1,7 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import logging
+
+logging.getLogger('devil').addHandler(logging.NullHandler())
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/__init__.py
new file mode 100644
index 0000000..50b23df
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/__init__.py
@@ -0,0 +1,3 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/apk_helper.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/apk_helper.py
new file mode 100644
index 0000000..1a9b8c5
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/apk_helper.py
@@ -0,0 +1,164 @@
+# Copyright (c) 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Module containing utilities for apk packages."""
+
+import itertools
+import re
+
+from devil import base_error
+from devil.android.sdk import aapt
+
+
+_MANIFEST_ATTRIBUTE_RE = re.compile(
+ r'\s*A: ([^\(\)= ]*)(?:\([^\(\)= ]*\))?='
+ r'(?:"(.*)" \(Raw: .*\)|\(type.*?\)(.*))$')
+_MANIFEST_ELEMENT_RE = re.compile(r'\s*(?:E|N): (\S*) .*$')
+
+
+def GetPackageName(apk_path):
+ """Returns the package name of the apk."""
+ return ApkHelper(apk_path).GetPackageName()
+
+
+# TODO(jbudorick): Deprecate and remove this function once callers have been
+# converted to ApkHelper.GetInstrumentationName
+def GetInstrumentationName(apk_path):
+ """Returns the name of the Instrumentation in the apk."""
+ return ApkHelper(apk_path).GetInstrumentationName()
+
+
+def ToHelper(path_or_helper):
+ """Creates an ApkHelper unless one is already given."""
+ if isinstance(path_or_helper, basestring):
+ return ApkHelper(path_or_helper)
+ return path_or_helper
+
+
+def _ParseManifestFromApk(apk_path):
+ aapt_output = aapt.Dump('xmltree', apk_path, 'AndroidManifest.xml')
+
+ parsed_manifest = {}
+ node_stack = [parsed_manifest]
+ indent = ' '
+
+ for line in aapt_output[1:]:
+ if len(line) == 0:
+ continue
+
+ indent_depth = 0
+ while line[(len(indent) * indent_depth):].startswith(indent):
+ indent_depth += 1
+
+ node_stack = node_stack[:indent_depth]
+ node = node_stack[-1]
+
+ m = _MANIFEST_ELEMENT_RE.match(line[len(indent) * indent_depth:])
+ if m:
+ manifest_key = m.group(1)
+ if manifest_key in node:
+ node[manifest_key] += [{}]
+ else:
+ node[manifest_key] = [{}]
+ node_stack += [node[manifest_key][-1]]
+ continue
+
+ m = _MANIFEST_ATTRIBUTE_RE.match(line[len(indent) * indent_depth:])
+ if m:
+ manifest_key = m.group(1)
+ if manifest_key in node:
+ raise base_error.BaseError(
+ "A single attribute should have one key and one value")
+ else:
+ node[manifest_key] = m.group(2) or m.group(3)
+ continue
+
+ return parsed_manifest
+
+
+class ApkHelper(object):
+
+ def __init__(self, path):
+ self._apk_path = path
+ self._manifest = None
+
+ @property
+ def path(self):
+ return self._apk_path
+
+ def GetActivityName(self):
+ """Returns the name of the Activity in the apk."""
+ manifest_info = self._GetManifest()
+ try:
+ activity = (
+ manifest_info['manifest'][0]['application'][0]['activity'][0]
+ ['android:name'])
+ except KeyError:
+ return None
+ if '.' not in activity:
+ activity = '%s.%s' % (self.GetPackageName(), activity)
+ elif activity.startswith('.'):
+ activity = '%s%s' % (self.GetPackageName(), activity)
+ return activity
+
+ def GetInstrumentationName(
+ self, default='android.test.InstrumentationTestRunner'):
+ """Returns the name of the Instrumentation in the apk."""
+ all_instrumentations = self.GetAllInstrumentations(default=default)
+ if len(all_instrumentations) != 1:
+ raise base_error.BaseError(
+ 'There is more than one instrumentation. Expected one.')
+ else:
+ return all_instrumentations[0]['android:name']
+
+ def GetAllInstrumentations(
+ self, default='android.test.InstrumentationTestRunner'):
+ """Returns a list of all Instrumentations in the apk."""
+ try:
+ return self._GetManifest()['manifest'][0]['instrumentation']
+ except KeyError:
+ return [{'android:name': default}]
+
+ def GetPackageName(self):
+ """Returns the package name of the apk."""
+ manifest_info = self._GetManifest()
+ try:
+ return manifest_info['manifest'][0]['package']
+ except KeyError:
+ raise Exception('Failed to determine package name of %s' % self._apk_path)
+
+ def GetPermissions(self):
+ manifest_info = self._GetManifest()
+ try:
+ return [p['android:name'] for
+ p in manifest_info['manifest'][0]['uses-permission']]
+ except KeyError:
+ return []
+
+ def GetSplitName(self):
+ """Returns the name of the split of the apk."""
+ manifest_info = self._GetManifest()
+ try:
+ return manifest_info['manifest'][0]['split']
+ except KeyError:
+ return None
+
+ def HasIsolatedProcesses(self):
+ """Returns whether any services exist that use isolatedProcess=true."""
+ manifest_info = self._GetManifest()
+ try:
+ applications = manifest_info['manifest'][0].get('application', [])
+ services = itertools.chain(
+ *(application.get('service', []) for application in applications))
+ return any(
+ int(s.get('android:isolatedProcess', '0'), 0)
+ for s in services)
+ except KeyError:
+ return False
+
+ def _GetManifest(self):
+ if not self._manifest:
+ self._manifest = _ParseManifestFromApk(self._apk_path)
+ return self._manifest
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/apk_helper_test.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/apk_helper_test.py
new file mode 100644
index 0000000..f7d077d
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/apk_helper_test.py
@@ -0,0 +1,169 @@
+#! /usr/bin/env python
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from devil import base_error
+from devil import devil_env
+from devil.android import apk_helper
+from devil.utils import mock_calls
+
+with devil_env.SysPath(devil_env.PYMOCK_PATH):
+ import mock # pylint: disable=import-error
+
+
+_MANIFEST_DUMP = """N: android=http://schemas.android.com/apk/res/android
+ E: manifest (line=1)
+ A: package="org.chromium.abc" (Raw: "org.chromium.abc")
+ A: split="random_split" (Raw: "random_split")
+ E: uses-permission (line=2)
+ A: android:name(0x01010003)="android.permission.INTERNET" (Raw: "android.permission.INTERNET")
+ E: uses-permission (line=3)
+ A: android:name(0x01010003)="android.permission.READ_EXTERNAL_STORAGE" (Raw: "android.permission.READ_EXTERNAL_STORAGE")
+ E: uses-permission (line=4)
+ A: android:name(0x01010003)="android.permission.ACCESS_FINE_LOCATION" (Raw: "android.permission.ACCESS_FINE_LOCATION")
+ E: application (line=5)
+ E: activity (line=6)
+ A: android:name(0x01010003)="org.chromium.ActivityName" (Raw: "org.chromium.ActivityName")
+ A: android:exported(0x01010010)=(type 0x12)0xffffffff
+ E: service (line=7)
+ A: android:name(0x01010001)="org.chromium.RandomService" (Raw: "org.chromium.RandomService")
+ A: android:isolatedProcess(0x01010888)=(type 0x12)0xffffffff
+ E: instrumentation (line=8)
+ A: android:label(0x01010001)="abc" (Raw: "abc")
+ A: android:name(0x01010003)="org.chromium.RandomJUnit4TestRunner" (Raw: "org.chromium.RandomJUnit4TestRunner")
+ A: android:targetPackage(0x01010021)="org.chromium.random_package" (Raw:"org.chromium.random_pacakge")
+ A: junit4=(type 0x12)0xffffffff (Raw: "true")
+ E: instrumentation (line=9)
+ A: android:label(0x01010001)="abc" (Raw: "abc")
+ A: android:name(0x01010003)="org.chromium.RandomTestRunner" (Raw: "org.chromium.RandomTestRunner")
+ A: android:targetPackage(0x01010021)="org.chromium.random_package" (Raw:"org.chromium.random_pacakge")
+"""
+
+_NO_ISOLATED_SERVICES = """N: android=http://schemas.android.com/apk/res/android
+ E: manifest (line=1)
+ A: package="org.chromium.abc" (Raw: "org.chromium.abc")
+ E: application (line=5)
+ E: activity (line=6)
+ A: android:name(0x01010003)="org.chromium.ActivityName" (Raw: "org.chromium.ActivityName")
+ A: android:exported(0x01010010)=(type 0x12)0xffffffff
+ E: service (line=7)
+ A: android:name(0x01010001)="org.chromium.RandomService" (Raw: "org.chromium.RandomService")
+"""
+
+_NO_SERVICES = """N: android=http://schemas.android.com/apk/res/android
+ E: manifest (line=1)
+ A: package="org.chromium.abc" (Raw: "org.chromium.abc")
+ E: application (line=5)
+ E: activity (line=6)
+ A: android:name(0x01010003)="org.chromium.ActivityName" (Raw: "org.chromium.ActivityName")
+ A: android:exported(0x01010010)=(type 0x12)0xffffffff
+"""
+
+_NO_APPLICATION = """N: android=http://schemas.android.com/apk/res/android
+ E: manifest (line=1)
+ A: package="org.chromium.abc" (Raw: "org.chromium.abc")
+"""
+
+_SINGLE_INSTRUMENTATION_MANIFEST_DUMP = """N: android=http://schemas.android.com/apk/res/android
+ E: manifest (line=1)
+ A: package="org.chromium.xyz" (Raw: "org.chromium.xyz")
+ E: instrumentation (line=8)
+ A: android:label(0x01010001)="xyz" (Raw: "xyz")
+ A: android:name(0x01010003)="org.chromium.RandomTestRunner" (Raw: "org.chromium.RandomTestRunner")
+ A: android:targetPackage(0x01010021)="org.chromium.random_package" (Raw:"org.chromium.random_pacakge")
+"""
+
+_SINGLE_J4_INSTRUMENTATION_MANIFEST_DUMP = """N: android=http://schemas.android.com/apk/res/android
+ E: manifest (line=1)
+ A: package="org.chromium.xyz" (Raw: "org.chromium.xyz")
+ E: instrumentation (line=8)
+ A: android:label(0x01010001)="xyz" (Raw: "xyz")
+ A: android:name(0x01010003)="org.chromium.RandomJ4TestRunner" (Raw: "org.chromium.RandomJ4TestRunner")
+ A: android:targetPackage(0x01010021)="org.chromium.random_package" (Raw:"org.chromium.random_pacakge")
+ A: junit4=(type 0x12)0xffffffff (Raw: "true")
+"""
+
+
+def _MockAaptDump(manifest_dump):
+ return mock.patch(
+ 'devil.android.sdk.aapt.Dump',
+ mock.Mock(side_effect=None, return_value=manifest_dump.split('\n')))
+
+class ApkHelperTest(mock_calls.TestCase):
+
+ def testGetInstrumentationName(self):
+ with _MockAaptDump(_MANIFEST_DUMP):
+ helper = apk_helper.ApkHelper("")
+ with self.assertRaises(base_error.BaseError):
+ helper.GetInstrumentationName()
+
+ def testGetActivityName(self):
+ with _MockAaptDump(_MANIFEST_DUMP):
+ helper = apk_helper.ApkHelper("")
+ self.assertEquals(
+ helper.GetActivityName(), 'org.chromium.ActivityName')
+
+ def testGetAllInstrumentations(self):
+ with _MockAaptDump(_MANIFEST_DUMP):
+ helper = apk_helper.ApkHelper("")
+ all_instrumentations = helper.GetAllInstrumentations()
+ self.assertEquals(len(all_instrumentations), 2)
+ self.assertEquals(all_instrumentations[0]['android:name'],
+ 'org.chromium.RandomJUnit4TestRunner')
+ self.assertEquals(all_instrumentations[1]['android:name'],
+ 'org.chromium.RandomTestRunner')
+
+ def testGetPackageName(self):
+ with _MockAaptDump(_MANIFEST_DUMP):
+ helper = apk_helper.ApkHelper("")
+ self.assertEquals(helper.GetPackageName(), 'org.chromium.abc')
+
+ def testGetPermssions(self):
+ with _MockAaptDump(_MANIFEST_DUMP):
+ helper = apk_helper.ApkHelper("")
+ all_permissions = helper.GetPermissions()
+ self.assertEquals(len(all_permissions), 3)
+ self.assertTrue('android.permission.INTERNET' in all_permissions)
+ self.assertTrue(
+ 'android.permission.READ_EXTERNAL_STORAGE' in all_permissions)
+ self.assertTrue(
+ 'android.permission.ACCESS_FINE_LOCATION' in all_permissions)
+
+ def testGetSplitName(self):
+ with _MockAaptDump(_MANIFEST_DUMP):
+ helper = apk_helper.ApkHelper("")
+ self.assertEquals(helper.GetSplitName(), 'random_split')
+
+ def testHasIsolatedProcesses_noApplication(self):
+ with _MockAaptDump(_NO_APPLICATION):
+ helper = apk_helper.ApkHelper("")
+ self.assertFalse(helper.HasIsolatedProcesses())
+
+ def testHasIsolatedProcesses_noServices(self):
+ with _MockAaptDump(_NO_SERVICES):
+ helper = apk_helper.ApkHelper("")
+ self.assertFalse(helper.HasIsolatedProcesses())
+
+ def testHasIsolatedProcesses_oneNotIsolatedProcess(self):
+ with _MockAaptDump(_NO_ISOLATED_SERVICES):
+ helper = apk_helper.ApkHelper("")
+ self.assertFalse(helper.HasIsolatedProcesses())
+
+ def testHasIsolatedProcesses_oneIsolatedProcess(self):
+ with _MockAaptDump(_MANIFEST_DUMP):
+ helper = apk_helper.ApkHelper("")
+ self.assertTrue(helper.HasIsolatedProcesses())
+
+ def testGetSingleInstrumentationName(self):
+ with _MockAaptDump(_SINGLE_INSTRUMENTATION_MANIFEST_DUMP):
+ helper = apk_helper.ApkHelper("")
+ self.assertEquals('org.chromium.RandomTestRunner',
+ helper.GetInstrumentationName())
+
+ def testGetSingleJUnit4InstrumentationName(self):
+ with _MockAaptDump(_SINGLE_J4_INSTRUMENTATION_MANIFEST_DUMP):
+ helper = apk_helper.ApkHelper("")
+ self.assertEquals('org.chromium.RandomJ4TestRunner',
+ helper.GetInstrumentationName())
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/app_ui.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/app_ui.py
new file mode 100644
index 0000000..2b04e8b
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/app_ui.py
@@ -0,0 +1,243 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Provides functionality to interact with UI elements of an Android app."""
+
+import collections
+import re
+from xml.etree import ElementTree as element_tree
+
+from devil.android import decorators
+from devil.android import device_temp_file
+from devil.utils import geometry
+from devil.utils import timeout_retry
+
+_DEFAULT_SHORT_TIMEOUT = 10
+_DEFAULT_SHORT_RETRIES = 3
+_DEFAULT_LONG_TIMEOUT = 30
+_DEFAULT_LONG_RETRIES = 0
+
+# Parse rectangle bounds given as: '[left,top][right,bottom]'.
+_RE_BOUNDS = re.compile(
+ r'\[(?P<left>\d+),(?P<top>\d+)\]\[(?P<right>\d+),(?P<bottom>\d+)\]')
+
+
+class _UiNode(object):
+
+ def __init__(self, device, xml_node, package=None):
+ """Object to interact with a UI node from an xml snapshot.
+
+ Note: there is usually no need to call this constructor directly. Instead,
+ use an AppUi object (below) to grab an xml screenshot from a device and
+ find nodes in it.
+
+ Args:
+ device: A device_utils.DeviceUtils instance.
+ xml_node: An ElementTree instance of the node to interact with.
+ package: An optional package name for the app owning this node.
+ """
+ self._device = device
+ self._xml_node = xml_node
+ self._package = package
+
+ def _GetAttribute(self, key):
+ """Get the value of an attribute of this node."""
+ return self._xml_node.attrib.get(key)
+
+ @property
+ def bounds(self):
+ """Get a rectangle with the bounds of this UI node.
+
+ Returns:
+ A geometry.Rectangle instance.
+ """
+ d = _RE_BOUNDS.match(self._GetAttribute('bounds')).groupdict()
+ return geometry.Rectangle.FromDict({k: int(v) for k, v in d.iteritems()})
+
+ def Tap(self, point=None, dp_units=False):
+ """Send a tap event to the UI node.
+
+ Args:
+ point: An optional geometry.Point instance indicating the location to
+ tap, relative to the bounds of the UI node, i.e. (0, 0) taps the
+ top-left corner. If ommited, the center of the node is tapped.
+ dp_units: If True, indicates that the coordinates of the point are given
+ in device-independent pixels; otherwise they are assumed to be "real"
+ pixels. This option has no effect when the point is ommited.
+ """
+ if point is None:
+ point = self.bounds.center
+ else:
+ if dp_units:
+ point = (float(self._device.pixel_density) / 160) * point
+ point += self.bounds.top_left
+
+ x, y = (str(int(v)) for v in point)
+ self._device.RunShellCommand(['input', 'tap', x, y], check_return=True)
+
+ def Dump(self):
+ """Get a brief summary of the child nodes that can be found on this node.
+
+ Returns:
+ A list of lines that can be logged or otherwise printed.
+ """
+ summary = collections.defaultdict(set)
+ for node in self._xml_node.iter():
+ package = node.get('package') or '(no package)'
+ label = node.get('resource-id') or '(no id)'
+ text = node.get('text')
+ if text:
+ label = '%s[%r]' % (label, text)
+ summary[package].add(label)
+ lines = []
+ for package, labels in sorted(summary.iteritems()):
+ lines.append('- %s:' % package)
+ for label in sorted(labels):
+ lines.append(' - %s' % label)
+ return lines
+
+ def __getitem__(self, key):
+ """Retrieve a child of this node by its index.
+
+ Args:
+ key: An integer with the index of the child to retrieve.
+ Returns:
+ A UI node instance of the selected child.
+ Raises:
+ IndexError if the index is out of range.
+ """
+ return type(self)(self._device, self._xml_node[key], package=self._package)
+
+ def _Find(self, **kwargs):
+ """Find the first descendant node that matches a given criteria.
+
+ Note: clients would usually call AppUi.GetUiNode or AppUi.WaitForUiNode
+ instead.
+
+ For example:
+
+ app = app_ui.AppUi(device, package='org.my.app')
+ app.GetUiNode(resource_id='some_element', text='hello')
+
+ would retrieve the first matching node with both of the xml attributes:
+
+ resource-id='org.my.app:id/some_element'
+ text='hello'
+
+ As the example shows, if given and needed, the value of the resource_id key
+ is auto-completed with the package name specified in the AppUi constructor.
+
+ Args:
+ Arguments are specified as key-value pairs, where keys correnspond to
+ attribute names in xml nodes (replacing any '-' with '_' to make them
+ valid identifiers). At least one argument must be supplied, and arguments
+ with a None value are ignored.
+ Returns:
+ A UI node instance of the first descendant node that matches ALL the
+ given key-value criteria; or None if no such node is found.
+ Raises:
+ TypeError if no search arguments are provided.
+ """
+ matches_criteria = self._NodeMatcher(kwargs)
+ for node in self._xml_node.iter():
+ if matches_criteria(node):
+ return type(self)(self._device, node, package=self._package)
+ return None
+
+ def _NodeMatcher(self, kwargs):
+ # Auto-complete resource-id's using the package name if available.
+ resource_id = kwargs.get('resource_id')
+ if (resource_id is not None
+ and self._package is not None
+ and ':id/' not in resource_id):
+ kwargs['resource_id'] = '%s:id/%s' % (self._package, resource_id)
+
+ criteria = [(k.replace('_', '-'), v)
+ for k, v in kwargs.iteritems()
+ if v is not None]
+ if not criteria:
+ raise TypeError('At least one search criteria should be specified')
+ return lambda node: all(node.get(k) == v for k, v in criteria)
+
+
+class AppUi(object):
+ # timeout and retry arguments appear unused, but are handled by decorator.
+ # pylint: disable=unused-argument
+
+ def __init__(self, device, package=None):
+ """Object to interact with the UI of an Android app.
+
+ Args:
+ device: A device_utils.DeviceUtils instance.
+ package: An optional package name for the app.
+ """
+ self._device = device
+ self._package = package
+
+ @property
+ def package(self):
+ return self._package
+
+ @decorators.WithTimeoutAndRetriesDefaults(_DEFAULT_SHORT_TIMEOUT,
+ _DEFAULT_SHORT_RETRIES)
+ def _GetRootUiNode(self, timeout=None, retries=None):
+ """Get a node pointing to the root of the UI nodes on screen.
+
+ Note: This is currently implemented via adb calls to uiatomator and it
+ is *slow*, ~2 secs per call. Do not rely on low-level implementation
+ details that may change in the future.
+
+ TODO(crbug.com/567217): Swap to a more efficient implementation.
+
+ Args:
+ timeout: A number of seconds to wait for the uiautomator dump.
+ retries: Number of times to retry if the adb command fails.
+ Returns:
+ A UI node instance pointing to the root of the xml screenshot.
+ """
+ with device_temp_file.DeviceTempFile(self._device.adb) as dtemp:
+ self._device.RunShellCommand(['uiautomator', 'dump', dtemp.name],
+ check_return=True)
+ xml_node = element_tree.fromstring(
+ self._device.ReadFile(dtemp.name, force_pull=True))
+ return _UiNode(self._device, xml_node, package=self._package)
+
+ def ScreenDump(self):
+ """Get a brief summary of the nodes that can be found on the screen.
+
+ Returns:
+ A list of lines that can be logged or otherwise printed.
+ """
+ return self._GetRootUiNode().Dump()
+
+ def GetUiNode(self, **kwargs):
+ """Get the first node found matching a specified criteria.
+
+ Args:
+ See _UiNode._Find.
+ Returns:
+ A UI node instance of the node if found, otherwise None.
+ """
+ # pylint: disable=protected-access
+ return self._GetRootUiNode()._Find(**kwargs)
+
+ @decorators.WithTimeoutAndRetriesDefaults(_DEFAULT_LONG_TIMEOUT,
+ _DEFAULT_LONG_RETRIES)
+ def WaitForUiNode(self, timeout=None, retries=None, **kwargs):
+ """Wait for a node matching a given criteria to appear on the screen.
+
+ Args:
+ timeout: A number of seconds to wait for the matching node to appear.
+ retries: Number of times to retry in case of adb command errors.
+ For other args, to specify the search criteria, see _UiNode._Find.
+ Returns:
+ The UI node instance found.
+ Raises:
+ device_errors.CommandTimeoutError if the node is not found before the
+ timeout.
+ """
+ def node_found():
+ return self.GetUiNode(**kwargs)
+
+ return timeout_retry.WaitFor(node_found)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/app_ui_test.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/app_ui_test.py
new file mode 100644
index 0000000..3472985
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/app_ui_test.py
@@ -0,0 +1,191 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Unit tests for the app_ui module."""
+
+import unittest
+from xml.etree import ElementTree as element_tree
+
+from devil import devil_env
+from devil.android import app_ui
+from devil.android import device_errors
+from devil.utils import geometry
+
+with devil_env.SysPath(devil_env.PYMOCK_PATH):
+ import mock # pylint: disable=import-error
+
+
+MOCK_XML_LOADING = '''
+<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
+<hierarchy rotation="0">
+ <node bounds="[0,50][1536,178]" content-desc="Loading"
+ resource-id="com.example.app:id/spinner"/>
+</hierarchy>
+'''.strip()
+
+
+MOCK_XML_LOADED = '''
+<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
+<hierarchy rotation="0">
+ <node bounds="[0,50][1536,178]" content-desc=""
+ resource-id="com.example.app:id/toolbar">
+ <node bounds="[0,58][112,170]" content-desc="Open navigation drawer"/>
+ <node bounds="[121,50][1536,178]"
+ resource-id="com.example.app:id/actionbar_custom_view">
+ <node bounds="[121,50][1424,178]"
+ resource-id="com.example.app:id/actionbar_title" text="Primary"/>
+ <node bounds="[1424,50][1536,178]" content-desc="Search"
+ resource-id="com.example.app:id/actionbar_search_button"/>
+ </node>
+ </node>
+ <node bounds="[0,178][576,1952]" resource-id="com.example.app:id/drawer">
+ <node bounds="[0,178][144,1952]"
+ resource-id="com.example.app:id/mini_drawer">
+ <node bounds="[40,254][104,318]" resource-id="com.example.app:id/avatar"/>
+ <node bounds="[16,354][128,466]" content-desc="Primary"
+ resource-id="com.example.app:id/image_view"/>
+ <node bounds="[16,466][128,578]" content-desc="Social"
+ resource-id="com.example.app:id/image_view"/>
+ <node bounds="[16,578][128,690]" content-desc="Promotions"
+ resource-id="com.example.app:id/image_view"/>
+ </node>
+ </node>
+</hierarchy>
+'''.strip()
+
+
+class UiAppTest(unittest.TestCase):
+
+ def setUp(self):
+ self.device = mock.Mock()
+ self.device.pixel_density = 320 # Each dp pixel is 2 real pixels.
+ self.app = app_ui.AppUi(self.device, package='com.example.app')
+ self._setMockXmlScreenshots([MOCK_XML_LOADED])
+
+ def _setMockXmlScreenshots(self, xml_docs):
+ """Mock self.app._GetRootUiNode to load nodes from some test xml_docs.
+
+ Each time the method is called it will return a UI node for each string
+ given in |xml_docs|, or rise a time out error when the list is exhausted.
+ """
+ # pylint: disable=protected-access
+ def get_mock_root_ui_node(value):
+ if isinstance(value, Exception):
+ raise value
+ return app_ui._UiNode(
+ self.device, element_tree.fromstring(value), self.app.package)
+
+ xml_docs.append(device_errors.CommandTimeoutError('Timed out!'))
+
+ self.app._GetRootUiNode = mock.Mock(
+ side_effect=(get_mock_root_ui_node(doc) for doc in xml_docs))
+
+ def assertNodeHasAttribs(self, node, attr):
+ # pylint: disable=protected-access
+ for key, value in attr.iteritems():
+ self.assertEquals(node._GetAttribute(key), value)
+
+ def assertTappedOnceAt(self, x, y):
+ self.device.RunShellCommand.assert_called_once_with(
+ ['input', 'tap', str(x), str(y)], check_return=True)
+
+ def testFind_byText(self):
+ node = self.app.GetUiNode(text='Primary')
+ self.assertNodeHasAttribs(node, {
+ 'text': 'Primary',
+ 'content-desc': None,
+ 'resource-id': 'com.example.app:id/actionbar_title',
+ })
+ self.assertEquals(node.bounds, geometry.Rectangle([121, 50], [1424, 178]))
+
+ def testFind_byContentDesc(self):
+ node = self.app.GetUiNode(content_desc='Social')
+ self.assertNodeHasAttribs(node, {
+ 'text': None,
+ 'content-desc': 'Social',
+ 'resource-id': 'com.example.app:id/image_view',
+ })
+ self.assertEquals(node.bounds, geometry.Rectangle([16, 466], [128, 578]))
+
+ def testFind_byResourceId_autocompleted(self):
+ node = self.app.GetUiNode(resource_id='image_view')
+ self.assertNodeHasAttribs(node, {
+ 'content-desc': 'Primary',
+ 'resource-id': 'com.example.app:id/image_view',
+ })
+
+ def testFind_byResourceId_absolute(self):
+ node = self.app.GetUiNode(resource_id='com.example.app:id/image_view')
+ self.assertNodeHasAttribs(node, {
+ 'content-desc': 'Primary',
+ 'resource-id': 'com.example.app:id/image_view',
+ })
+
+ def testFind_byMultiple(self):
+ node = self.app.GetUiNode(resource_id='image_view',
+ content_desc='Promotions')
+ self.assertNodeHasAttribs(node, {
+ 'content-desc': 'Promotions',
+ 'resource-id': 'com.example.app:id/image_view',
+ })
+ self.assertEquals(node.bounds, geometry.Rectangle([16, 578], [128, 690]))
+
+ def testFind_notFound(self):
+ node = self.app.GetUiNode(resource_id='does_not_exist')
+ self.assertIsNone(node)
+
+ def testFind_noArgsGiven(self):
+ # Same exception given by Python for a function call with not enough args.
+ with self.assertRaises(TypeError):
+ self.app.GetUiNode()
+
+ def testGetChildren(self):
+ node = self.app.GetUiNode(resource_id='mini_drawer')
+ self.assertNodeHasAttribs(
+ node[0], {'resource-id': 'com.example.app:id/avatar'})
+ self.assertNodeHasAttribs(node[1], {'content-desc': 'Primary'})
+ self.assertNodeHasAttribs(node[2], {'content-desc': 'Social'})
+ self.assertNodeHasAttribs(node[3], {'content-desc': 'Promotions'})
+ with self.assertRaises(IndexError):
+ # pylint: disable=pointless-statement
+ node[4]
+
+ def testTap_center(self):
+ node = self.app.GetUiNode(content_desc='Open navigation drawer')
+ node.Tap()
+ self.assertTappedOnceAt(56, 114)
+
+ def testTap_topleft(self):
+ node = self.app.GetUiNode(content_desc='Open navigation drawer')
+ node.Tap(geometry.Point(0, 0))
+ self.assertTappedOnceAt(0, 58)
+
+ def testTap_withOffset(self):
+ node = self.app.GetUiNode(content_desc='Open navigation drawer')
+ node.Tap(geometry.Point(10, 20))
+ self.assertTappedOnceAt(10, 78)
+
+ def testTap_withOffsetInDp(self):
+ node = self.app.GetUiNode(content_desc='Open navigation drawer')
+ node.Tap(geometry.Point(10, 20), dp_units=True)
+ self.assertTappedOnceAt(20, 98)
+
+ def testTap_dpUnitsIgnored(self):
+ node = self.app.GetUiNode(content_desc='Open navigation drawer')
+ node.Tap(dp_units=True)
+ self.assertTappedOnceAt(56, 114) # Still taps at center.
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testWaitForUiNode_found(self):
+ self._setMockXmlScreenshots(
+ [MOCK_XML_LOADING, MOCK_XML_LOADING, MOCK_XML_LOADED])
+ node = self.app.WaitForUiNode(resource_id='actionbar_title')
+ self.assertNodeHasAttribs(node, {'text': 'Primary'})
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testWaitForUiNode_notFound(self):
+ self._setMockXmlScreenshots(
+ [MOCK_XML_LOADING, MOCK_XML_LOADING, MOCK_XML_LOADING])
+ with self.assertRaises(device_errors.CommandTimeoutError):
+ self.app.WaitForUiNode(resource_id='actionbar_title')
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/battery_utils.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/battery_utils.py
new file mode 100644
index 0000000..068c187
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/battery_utils.py
@@ -0,0 +1,711 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Provides a variety of device interactions with power.
+"""
+# pylint: disable=unused-argument
+
+import collections
+import contextlib
+import csv
+import logging
+
+from devil.android import decorators
+from devil.android import device_errors
+from devil.android import device_utils
+from devil.android.sdk import version_codes
+from devil.utils import timeout_retry
+
+logger = logging.getLogger(__name__)
+
+_DEFAULT_TIMEOUT = 30
+_DEFAULT_RETRIES = 3
+
+
+_DEVICE_PROFILES = [
+ {
+ 'name': ['Nexus 4'],
+ 'enable_command': (
+ 'echo 0 > /sys/module/pm8921_charger/parameters/disabled && '
+ 'dumpsys battery reset'),
+ 'disable_command': (
+ 'echo 1 > /sys/module/pm8921_charger/parameters/disabled && '
+ 'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
+ 'charge_counter': None,
+ 'voltage': None,
+ 'current': None,
+ },
+ {
+ 'name': ['Nexus 5'],
+ # Nexus 5
+ # Setting the HIZ bit of the bq24192 causes the charger to actually ignore
+ # energy coming from USB. Setting the power_supply offline just updates the
+ # Android system to reflect that.
+ 'enable_command': (
+ 'echo 0x4A > /sys/kernel/debug/bq24192/INPUT_SRC_CONT && '
+ 'chmod 644 /sys/class/power_supply/usb/online && '
+ 'echo 1 > /sys/class/power_supply/usb/online && '
+ 'dumpsys battery reset'),
+ 'disable_command': (
+ 'echo 0xCA > /sys/kernel/debug/bq24192/INPUT_SRC_CONT && '
+ 'chmod 644 /sys/class/power_supply/usb/online && '
+ 'echo 0 > /sys/class/power_supply/usb/online && '
+ 'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
+ 'charge_counter': None,
+ 'voltage': None,
+ 'current': None,
+ },
+ {
+ 'name': ['Nexus 6'],
+ 'enable_command': (
+ 'echo 1 > /sys/class/power_supply/battery/charging_enabled && '
+ 'dumpsys battery reset'),
+ 'disable_command': (
+ 'echo 0 > /sys/class/power_supply/battery/charging_enabled && '
+ 'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
+ 'charge_counter': (
+ '/sys/class/power_supply/max170xx_battery/charge_counter_ext'),
+ 'voltage': '/sys/class/power_supply/max170xx_battery/voltage_now',
+ 'current': '/sys/class/power_supply/max170xx_battery/current_now',
+ },
+ {
+ 'name': ['Nexus 9'],
+ 'enable_command': (
+ 'echo Disconnected > '
+ '/sys/bus/i2c/drivers/bq2419x/0-006b/input_cable_state && '
+ 'dumpsys battery reset'),
+ 'disable_command': (
+ 'echo Connected > '
+ '/sys/bus/i2c/drivers/bq2419x/0-006b/input_cable_state && '
+ 'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
+ 'charge_counter': '/sys/class/power_supply/battery/charge_counter_ext',
+ 'voltage': '/sys/class/power_supply/battery/voltage_now',
+ 'current': '/sys/class/power_supply/battery/current_now',
+ },
+ {
+ 'name': ['Nexus 10'],
+ 'enable_command': None,
+ 'disable_command': None,
+ 'charge_counter': None,
+ 'voltage': '/sys/class/power_supply/ds2784-fuelgauge/voltage_now',
+ 'current': '/sys/class/power_supply/ds2784-fuelgauge/current_now',
+
+ },
+ {
+ 'name': ['Nexus 5X'],
+ 'enable_command': (
+ 'echo 1 > /sys/class/power_supply/battery/charging_enabled && '
+ 'dumpsys battery reset'),
+ 'disable_command': (
+ 'echo 0 > /sys/class/power_supply/battery/charging_enabled && '
+ 'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
+ 'charge_counter': None,
+ 'voltage': None,
+ 'current': None,
+ },
+ { # Galaxy s5
+ 'name': ['SM-G900H'],
+ 'enable_command': (
+ 'chmod 644 /sys/class/power_supply/battery/test_mode && '
+ 'chmod 644 /sys/class/power_supply/sec-charger/current_now && '
+ 'echo 0 > /sys/class/power_supply/battery/test_mode && '
+ 'echo 9999 > /sys/class/power_supply/sec-charger/current_now &&'
+ 'dumpsys battery reset'),
+ 'disable_command': (
+ 'chmod 644 /sys/class/power_supply/battery/test_mode && '
+ 'chmod 644 /sys/class/power_supply/sec-charger/current_now && '
+ 'echo 1 > /sys/class/power_supply/battery/test_mode && '
+ 'echo 0 > /sys/class/power_supply/sec-charger/current_now && '
+ 'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
+ 'charge_counter': None,
+ 'voltage': '/sys/class/power_supply/sec-fuelgauge/voltage_now',
+ 'current': '/sys/class/power_supply/sec-charger/current_now',
+ },
+ { # Galaxy s6, Galaxy s6, Galaxy s6 edge
+ 'name': ['SM-G920F', 'SM-G920V', 'SM-G925V'],
+ 'enable_command': (
+ 'chmod 644 /sys/class/power_supply/battery/test_mode && '
+ 'chmod 644 /sys/class/power_supply/max77843-charger/current_now && '
+ 'echo 0 > /sys/class/power_supply/battery/test_mode && '
+ 'echo 9999 > /sys/class/power_supply/max77843-charger/current_now &&'
+ 'dumpsys battery reset'),
+ 'disable_command': (
+ 'chmod 644 /sys/class/power_supply/battery/test_mode && '
+ 'chmod 644 /sys/class/power_supply/max77843-charger/current_now && '
+ 'echo 1 > /sys/class/power_supply/battery/test_mode && '
+ 'echo 0 > /sys/class/power_supply/max77843-charger/current_now && '
+ 'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
+ 'charge_counter': None,
+ 'voltage': '/sys/class/power_supply/max77843-fuelgauge/voltage_now',
+ 'current': '/sys/class/power_supply/max77843-charger/current_now',
+ },
+ { # Cherry Mobile One
+ 'name': ['W6210 (4560MMX_b fingerprint)'],
+ 'enable_command': (
+ 'echo "0 0" > /proc/mtk_battery_cmd/current_cmd && '
+ 'dumpsys battery reset'),
+ 'disable_command': (
+ 'echo "0 1" > /proc/mtk_battery_cmd/current_cmd && '
+ 'dumpsys battery set ac 0 && dumpsys battery set usb 0'),
+ 'charge_counter': None,
+ 'voltage': None,
+ 'current': None,
+},
+]
+
+# The list of useful dumpsys columns.
+# Index of the column containing the format version.
+_DUMP_VERSION_INDEX = 0
+# Index of the column containing the type of the row.
+_ROW_TYPE_INDEX = 3
+# Index of the column containing the uid.
+_PACKAGE_UID_INDEX = 4
+# Index of the column containing the application package.
+_PACKAGE_NAME_INDEX = 5
+# The column containing the uid of the power data.
+_PWI_UID_INDEX = 1
+# The column containing the type of consumption. Only consumption since last
+# charge are of interest here.
+_PWI_AGGREGATION_INDEX = 2
+_PWS_AGGREGATION_INDEX = _PWI_AGGREGATION_INDEX
+# The column containing the amount of power used, in mah.
+_PWI_POWER_CONSUMPTION_INDEX = 5
+_PWS_POWER_CONSUMPTION_INDEX = _PWI_POWER_CONSUMPTION_INDEX
+
+_MAX_CHARGE_ERROR = 20
+
+
+class BatteryUtils(object):
+
+ def __init__(self, device, default_timeout=_DEFAULT_TIMEOUT,
+ default_retries=_DEFAULT_RETRIES):
+ """BatteryUtils constructor.
+
+ Args:
+ device: A DeviceUtils instance.
+ default_timeout: An integer containing the default number of seconds to
+ wait for an operation to complete if no explicit value
+ is provided.
+ default_retries: An integer containing the default number or times an
+ operation should be retried on failure if no explicit
+ value is provided.
+ Raises:
+ TypeError: If it is not passed a DeviceUtils instance.
+ """
+ if not isinstance(device, device_utils.DeviceUtils):
+ raise TypeError('Must be initialized with DeviceUtils object.')
+ self._device = device
+ self._cache = device.GetClientCache(self.__class__.__name__)
+ self._default_timeout = default_timeout
+ self._default_retries = default_retries
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def SupportsFuelGauge(self, timeout=None, retries=None):
+ """Detect if fuel gauge chip is present.
+
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ True if known fuel gauge files are present.
+ False otherwise.
+ """
+ self._DiscoverDeviceProfile()
+ return (self._cache['profile']['enable_command'] != None
+ and self._cache['profile']['charge_counter'] != None)
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def GetFuelGaugeChargeCounter(self, timeout=None, retries=None):
+ """Get value of charge_counter on fuel gauge chip.
+
+ Device must have charging disabled for this, not just battery updates
+ disabled. The only device that this currently works with is the nexus 5.
+
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ value of charge_counter for fuel gauge chip in units of nAh.
+
+ Raises:
+ device_errors.CommandFailedError: If fuel gauge chip not found.
+ """
+ if self.SupportsFuelGauge():
+ return int(self._device.ReadFile(
+ self._cache['profile']['charge_counter']))
+ raise device_errors.CommandFailedError(
+ 'Unable to find fuel gauge.')
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def GetNetworkData(self, package, timeout=None, retries=None):
+ """Get network data for specific package.
+
+ Args:
+ package: package name you want network data for.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ Tuple of (sent_data, recieved_data)
+ None if no network data found
+ """
+ # If device_utils clears cache, cache['uids'] doesn't exist
+ if 'uids' not in self._cache:
+ self._cache['uids'] = {}
+ if package not in self._cache['uids']:
+ self.GetPowerData()
+ if package not in self._cache['uids']:
+ logger.warning('No UID found for %s. Can\'t get network data.',
+ package)
+ return None
+
+ network_data_path = '/proc/uid_stat/%s/' % self._cache['uids'][package]
+ try:
+ send_data = int(self._device.ReadFile(network_data_path + 'tcp_snd'))
+ # If ReadFile throws exception, it means no network data usage file for
+ # package has been recorded. Return 0 sent and 0 received.
+ except device_errors.AdbShellCommandFailedError:
+ logger.warning('No sent data found for package %s', package)
+ send_data = 0
+ try:
+ recv_data = int(self._device.ReadFile(network_data_path + 'tcp_rcv'))
+ except device_errors.AdbShellCommandFailedError:
+ logger.warning('No received data found for package %s', package)
+ recv_data = 0
+ return (send_data, recv_data)
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def GetPowerData(self, timeout=None, retries=None):
+ """Get power data for device.
+
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ Dict containing system power, and a per-package power dict keyed on
+ package names.
+ {
+ 'system_total': 23.1,
+ 'per_package' : {
+ package_name: {
+ 'uid': uid,
+ 'data': [1,2,3]
+ },
+ }
+ }
+ """
+ if 'uids' not in self._cache:
+ self._cache['uids'] = {}
+ dumpsys_output = self._device.RunShellCommand(
+ ['dumpsys', 'batterystats', '-c'],
+ check_return=True, large_output=True)
+ csvreader = csv.reader(dumpsys_output)
+ pwi_entries = collections.defaultdict(list)
+ system_total = None
+ for entry in csvreader:
+ if entry[_DUMP_VERSION_INDEX] not in ['8', '9']:
+ # Wrong dumpsys version.
+ raise device_errors.DeviceVersionError(
+ 'Dumpsys version must be 8 or 9. "%s" found.'
+ % entry[_DUMP_VERSION_INDEX])
+ if _ROW_TYPE_INDEX < len(entry) and entry[_ROW_TYPE_INDEX] == 'uid':
+ current_package = entry[_PACKAGE_NAME_INDEX]
+ if (self._cache['uids'].get(current_package)
+ and self._cache['uids'].get(current_package)
+ != entry[_PACKAGE_UID_INDEX]):
+ raise device_errors.CommandFailedError(
+ 'Package %s found multiple times with different UIDs %s and %s'
+ % (current_package, self._cache['uids'][current_package],
+ entry[_PACKAGE_UID_INDEX]))
+ self._cache['uids'][current_package] = entry[_PACKAGE_UID_INDEX]
+ elif (_PWI_POWER_CONSUMPTION_INDEX < len(entry)
+ and entry[_ROW_TYPE_INDEX] == 'pwi'
+ and entry[_PWI_AGGREGATION_INDEX] == 'l'):
+ pwi_entries[entry[_PWI_UID_INDEX]].append(
+ float(entry[_PWI_POWER_CONSUMPTION_INDEX]))
+ elif (_PWS_POWER_CONSUMPTION_INDEX < len(entry)
+ and entry[_ROW_TYPE_INDEX] == 'pws'
+ and entry[_PWS_AGGREGATION_INDEX] == 'l'):
+ # This entry should only appear once.
+ assert system_total is None
+ system_total = float(entry[_PWS_POWER_CONSUMPTION_INDEX])
+
+ per_package = {p: {'uid': uid, 'data': pwi_entries[uid]}
+ for p, uid in self._cache['uids'].iteritems()}
+ return {'system_total': system_total, 'per_package': per_package}
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def GetBatteryInfo(self, timeout=None, retries=None):
+ """Gets battery info for the device.
+
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+ Returns:
+ A dict containing various battery information as reported by dumpsys
+ battery.
+ """
+ result = {}
+ # Skip the first line, which is just a header.
+ for line in self._device.RunShellCommand(
+ ['dumpsys', 'battery'], check_return=True)[1:]:
+ # If usb charging has been disabled, an extra line of header exists.
+ if 'UPDATES STOPPED' in line:
+ logger.warning('Dumpsys battery not receiving updates. '
+ 'Run dumpsys battery reset if this is in error.')
+ elif ':' not in line:
+ logger.warning('Unknown line found in dumpsys battery: "%s"', line)
+ else:
+ k, v = line.split(':', 1)
+ result[k.strip()] = v.strip()
+ return result
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def GetCharging(self, timeout=None, retries=None):
+ """Gets the charging state of the device.
+
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+ Returns:
+ True if the device is charging, false otherwise.
+ """
+ battery_info = self.GetBatteryInfo()
+ for k in ('AC powered', 'USB powered', 'Wireless powered'):
+ if (k in battery_info and
+ battery_info[k].lower() in ('true', '1', 'yes')):
+ return True
+ return False
+
+ # TODO(rnephew): Make private when all use cases can use the context manager.
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def DisableBatteryUpdates(self, timeout=None, retries=None):
+ """Resets battery data and makes device appear like it is not
+ charging so that it will collect power data since last charge.
+
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ device_errors.CommandFailedError: When resetting batterystats fails to
+ reset power values.
+ device_errors.DeviceVersionError: If device is not L or higher.
+ """
+ def battery_updates_disabled():
+ return self.GetCharging() is False
+
+ self._ClearPowerData()
+ self._device.RunShellCommand(['dumpsys', 'battery', 'set', 'ac', '0'],
+ check_return=True)
+ self._device.RunShellCommand(['dumpsys', 'battery', 'set', 'usb', '0'],
+ check_return=True)
+ timeout_retry.WaitFor(battery_updates_disabled, wait_period=1)
+
+ # TODO(rnephew): Make private when all use cases can use the context manager.
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def EnableBatteryUpdates(self, timeout=None, retries=None):
+ """Restarts device charging so that dumpsys no longer collects power data.
+
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ device_errors.DeviceVersionError: If device is not L or higher.
+ """
+ def battery_updates_enabled():
+ return (self.GetCharging()
+ or not bool('UPDATES STOPPED' in self._device.RunShellCommand(
+ ['dumpsys', 'battery'], check_return=True)))
+
+ self._device.RunShellCommand(['dumpsys', 'battery', 'reset'],
+ check_return=True)
+ timeout_retry.WaitFor(battery_updates_enabled, wait_period=1)
+
+ @contextlib.contextmanager
+ def BatteryMeasurement(self, timeout=None, retries=None):
+ """Context manager that enables battery data collection. It makes
+ the device appear to stop charging so that dumpsys will start collecting
+ power data since last charge. Once the with block is exited, charging is
+ resumed and power data since last charge is no longer collected.
+
+ Only for devices L and higher.
+
+ Example usage:
+ with BatteryMeasurement():
+ browser_actions()
+ get_power_data() # report usage within this block
+ after_measurements() # Anything that runs after power
+ # measurements are collected
+
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ device_errors.DeviceVersionError: If device is not L or higher.
+ """
+ if self._device.build_version_sdk < version_codes.LOLLIPOP:
+ raise device_errors.DeviceVersionError('Device must be L or higher.')
+ try:
+ self.DisableBatteryUpdates(timeout=timeout, retries=retries)
+ yield
+ finally:
+ self.EnableBatteryUpdates(timeout=timeout, retries=retries)
+
+ def _DischargeDevice(self, percent, wait_period=120):
+ """Disables charging and waits for device to discharge given amount
+
+ Args:
+ percent: level of charge to discharge.
+
+ Raises:
+ ValueError: If percent is not between 1 and 99.
+ """
+ battery_level = int(self.GetBatteryInfo().get('level'))
+ if not 0 < percent < 100:
+ raise ValueError('Discharge amount(%s) must be between 1 and 99'
+ % percent)
+ if battery_level is None:
+ logger.warning('Unable to find current battery level. Cannot discharge.')
+ return
+ # Do not discharge if it would make battery level too low.
+ if percent >= battery_level - 10:
+ logger.warning('Battery is too low or discharge amount requested is too '
+ 'high. Cannot discharge phone %s percent.', percent)
+ return
+
+ self._HardwareSetCharging(False)
+
+ def device_discharged():
+ self._HardwareSetCharging(True)
+ current_level = int(self.GetBatteryInfo().get('level'))
+ logger.info('current battery level: %s', current_level)
+ if battery_level - current_level >= percent:
+ return True
+ self._HardwareSetCharging(False)
+ return False
+
+ timeout_retry.WaitFor(device_discharged, wait_period=wait_period)
+
+ def ChargeDeviceToLevel(self, level, wait_period=60):
+ """Enables charging and waits for device to be charged to given level.
+
+ Args:
+ level: level of charge to wait for.
+ wait_period: time in seconds to wait between checking.
+ Raises:
+ device_errors.DeviceChargingError: If error while charging is detected.
+ """
+ self.SetCharging(True)
+ charge_status = {
+ 'charge_failure_count': 0,
+ 'last_charge_value': 0
+ }
+ def device_charged():
+ battery_level = self.GetBatteryInfo().get('level')
+ if battery_level is None:
+ logger.warning('Unable to find current battery level.')
+ battery_level = 100
+ else:
+ logger.info('current battery level: %s', battery_level)
+ battery_level = int(battery_level)
+
+ # Use > so that it will not reset if charge is going down.
+ if battery_level > charge_status['last_charge_value']:
+ charge_status['last_charge_value'] = battery_level
+ charge_status['charge_failure_count'] = 0
+ else:
+ charge_status['charge_failure_count'] += 1
+
+ if (not battery_level >= level
+ and charge_status['charge_failure_count'] >= _MAX_CHARGE_ERROR):
+ raise device_errors.DeviceChargingError(
+ 'Device not charging properly. Current level:%s Previous level:%s'
+ % (battery_level, charge_status['last_charge_value']))
+ return battery_level >= level
+
+ timeout_retry.WaitFor(device_charged, wait_period=wait_period)
+
+ def LetBatteryCoolToTemperature(self, target_temp, wait_period=180):
+ """Lets device sit to give battery time to cool down
+ Args:
+ temp: maximum temperature to allow in tenths of degrees c.
+ wait_period: time in seconds to wait between checking.
+ """
+ def cool_device():
+ temp = self.GetBatteryInfo().get('temperature')
+ if temp is None:
+ logger.warning('Unable to find current battery temperature.')
+ temp = 0
+ else:
+ logger.info('Current battery temperature: %s', temp)
+ if int(temp) <= target_temp:
+ return True
+ else:
+ if 'Nexus 5' in self._cache['profile']['name']:
+ self._DischargeDevice(1)
+ return False
+
+ self._DiscoverDeviceProfile()
+ self.EnableBatteryUpdates()
+ logger.info('Waiting for the device to cool down to %s (0.1 C)',
+ target_temp)
+ timeout_retry.WaitFor(cool_device, wait_period=wait_period)
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def SetCharging(self, enabled, timeout=None, retries=None):
+ """Enables or disables charging on the device.
+
+ Args:
+ enabled: A boolean indicating whether charging should be enabled or
+ disabled.
+ timeout: timeout in seconds
+ retries: number of retries
+ """
+ if self.GetCharging() == enabled:
+ logger.warning('Device charging already in expected state: %s', enabled)
+ return
+
+ self._DiscoverDeviceProfile()
+ if enabled:
+ if self._cache['profile']['enable_command']:
+ self._HardwareSetCharging(enabled)
+ else:
+ logger.info('Unable to enable charging via hardware. '
+ 'Falling back to software enabling.')
+ self.EnableBatteryUpdates()
+ else:
+ if self._cache['profile']['enable_command']:
+ self._ClearPowerData()
+ self._HardwareSetCharging(enabled)
+ else:
+ logger.info('Unable to disable charging via hardware. '
+ 'Falling back to software disabling.')
+ self.DisableBatteryUpdates()
+
+ def _HardwareSetCharging(self, enabled, timeout=None, retries=None):
+ """Enables or disables charging on the device.
+
+ Args:
+ enabled: A boolean indicating whether charging should be enabled or
+ disabled.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ device_errors.CommandFailedError: If method of disabling charging cannot
+ be determined.
+ """
+ self._DiscoverDeviceProfile()
+ if not self._cache['profile']['enable_command']:
+ raise device_errors.CommandFailedError(
+ 'Unable to find charging commands.')
+
+ command = (self._cache['profile']['enable_command'] if enabled
+ else self._cache['profile']['disable_command'])
+
+ def verify_charging():
+ return self.GetCharging() == enabled
+
+ self._device.RunShellCommand(
+ command, check_return=True, as_root=True, large_output=True)
+ timeout_retry.WaitFor(verify_charging, wait_period=1)
+
+ @contextlib.contextmanager
+ def PowerMeasurement(self, timeout=None, retries=None):
+ """Context manager that enables battery power collection.
+
+ Once the with block is exited, charging is resumed. Will attempt to disable
+ charging at the hardware level, and if that fails will fall back to software
+ disabling of battery updates.
+
+ Only for devices L and higher.
+
+ Example usage:
+ with PowerMeasurement():
+ browser_actions()
+ get_power_data() # report usage within this block
+ after_measurements() # Anything that runs after power
+ # measurements are collected
+
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+ """
+ try:
+ self.SetCharging(False, timeout=timeout, retries=retries)
+ yield
+ finally:
+ self.SetCharging(True, timeout=timeout, retries=retries)
+
+ def _ClearPowerData(self):
+ """Resets battery data and makes device appear like it is not
+ charging so that it will collect power data since last charge.
+
+ Returns:
+ True if power data cleared.
+ False if power data clearing is not supported (pre-L)
+
+ Raises:
+ device_errors.DeviceVersionError: If power clearing is supported,
+ but fails.
+ """
+ if self._device.build_version_sdk < version_codes.LOLLIPOP:
+ logger.warning('Dumpsys power data only available on 5.0 and above. '
+ 'Cannot clear power data.')
+ return False
+
+ self._device.RunShellCommand(
+ ['dumpsys', 'battery', 'set', 'usb', '1'], check_return=True)
+ self._device.RunShellCommand(
+ ['dumpsys', 'battery', 'set', 'ac', '1'], check_return=True)
+
+ def test_if_clear():
+ self._device.RunShellCommand(
+ ['dumpsys', 'batterystats', '--reset'], check_return=True)
+ battery_data = self._device.RunShellCommand(
+ ['dumpsys', 'batterystats', '--charged', '-c'],
+ check_return=True, large_output=True)
+ for line in battery_data:
+ l = line.split(',')
+ if (len(l) > _PWI_POWER_CONSUMPTION_INDEX
+ and l[_ROW_TYPE_INDEX] == 'pwi'
+ and float(l[_PWI_POWER_CONSUMPTION_INDEX]) != 0.0):
+ return False
+ return True
+
+ try:
+ timeout_retry.WaitFor(test_if_clear, wait_period=1)
+ return True
+ finally:
+ self._device.RunShellCommand(
+ ['dumpsys', 'battery', 'reset'], check_return=True)
+
+ def _DiscoverDeviceProfile(self):
+ """Checks and caches device information.
+
+ Returns:
+ True if profile is found, false otherwise.
+ """
+
+ if 'profile' in self._cache:
+ return True
+ for profile in _DEVICE_PROFILES:
+ if self._device.product_model in profile['name']:
+ self._cache['profile'] = profile
+ return True
+ self._cache['profile'] = {
+ 'name': [],
+ 'enable_command': None,
+ 'disable_command': None,
+ 'charge_counter': None,
+ 'voltage': None,
+ 'current': None,
+ }
+ return False
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/battery_utils_test.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/battery_utils_test.py
new file mode 100644
index 0000000..beaba3b
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/battery_utils_test.py
@@ -0,0 +1,694 @@
+#!/usr/bin/env python
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""
+Unit tests for the contents of battery_utils.py
+"""
+
+# pylint: disable=protected-access,unused-argument
+
+import logging
+import unittest
+
+from devil import devil_env
+from devil.android import battery_utils
+from devil.android import device_errors
+from devil.android import device_utils
+from devil.android import device_utils_test
+from devil.utils import mock_calls
+
+with devil_env.SysPath(devil_env.PYMOCK_PATH):
+ import mock # pylint: disable=import-error
+
+_DUMPSYS_OUTPUT = [
+ '9,0,i,uid,1000,test_package1',
+ '9,0,i,uid,1001,test_package2',
+ '9,1000,l,pwi,uid,1',
+ '9,1001,l,pwi,uid,2',
+ '9,0,l,pws,1728,2000,190,207',
+]
+
+
+class BatteryUtilsTest(mock_calls.TestCase):
+
+ _NEXUS_5 = {
+ 'name': 'Nexus 5',
+ 'witness_file': '/sys/kernel/debug/bq24192/INPUT_SRC_CONT',
+ 'enable_command': (
+ 'echo 0x4A > /sys/kernel/debug/bq24192/INPUT_SRC_CONT && '
+ 'echo 1 > /sys/class/power_supply/usb/online'),
+ 'disable_command': (
+ 'echo 0xCA > /sys/kernel/debug/bq24192/INPUT_SRC_CONT && '
+ 'chmod 644 /sys/class/power_supply/usb/online && '
+ 'echo 0 > /sys/class/power_supply/usb/online'),
+ 'charge_counter': None,
+ 'voltage': None,
+ 'current': None,
+ }
+
+ _NEXUS_6 = {
+ 'name': 'Nexus 6',
+ 'witness_file': None,
+ 'enable_command': None,
+ 'disable_command': None,
+ 'charge_counter': (
+ '/sys/class/power_supply/max170xx_battery/charge_counter_ext'),
+ 'voltage': '/sys/class/power_supply/max170xx_battery/voltage_now',
+ 'current': '/sys/class/power_supply/max170xx_battery/current_now',
+ }
+
+ _NEXUS_10 = {
+ 'name': 'Nexus 10',
+ 'witness_file': None,
+ 'enable_command': None,
+ 'disable_command': None,
+ 'charge_counter': (
+ '/sys/class/power_supply/ds2784-fuelgauge/charge_counter_ext'),
+ 'voltage': '/sys/class/power_supply/ds2784-fuelgauge/voltage_now',
+ 'current': '/sys/class/power_supply/ds2784-fuelgauge/current_now',
+ }
+
+ def ShellError(self, output=None, status=1):
+ def action(cmd, *args, **kwargs):
+ raise device_errors.AdbShellCommandFailedError(
+ cmd, output, status, str(self.device))
+ if output is None:
+ output = 'Permission denied\n'
+ return action
+
+ def setUp(self):
+ self.adb = device_utils_test._AdbWrapperMock('0123456789abcdef')
+ self.device = device_utils.DeviceUtils(
+ self.adb, default_timeout=10, default_retries=0)
+ self.watchMethodCalls(self.call.adb, ignore=['GetDeviceSerial'])
+ self.battery = battery_utils.BatteryUtils(
+ self.device, default_timeout=10, default_retries=0)
+
+
+class BatteryUtilsInitTest(unittest.TestCase):
+
+ def testInitWithDeviceUtil(self):
+ serial = '0fedcba987654321'
+ d = device_utils.DeviceUtils(serial)
+ b = battery_utils.BatteryUtils(d)
+ self.assertEqual(d, b._device)
+
+ def testInitWithMissing_fails(self):
+ with self.assertRaises(TypeError):
+ battery_utils.BatteryUtils(None)
+ with self.assertRaises(TypeError):
+ battery_utils.BatteryUtils('')
+
+
+class BatteryUtilsSetChargingTest(BatteryUtilsTest):
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testHardwareSetCharging_enabled(self):
+ self.battery._cache['profile'] = self._NEXUS_5
+ with self.assertCalls(
+ (self.call.device.RunShellCommand(
+ mock.ANY, check_return=True, as_root=True, large_output=True), []),
+ (self.call.battery.GetCharging(), False),
+ (self.call.battery.GetCharging(), True)):
+ self.battery._HardwareSetCharging(True)
+
+ def testHardwareSetCharging_alreadyEnabled(self):
+ self.battery._cache['profile'] = self._NEXUS_5
+ with self.assertCalls(
+ (self.call.device.RunShellCommand(
+ mock.ANY, check_return=True, as_root=True, large_output=True), []),
+ (self.call.battery.GetCharging(), True)):
+ self.battery._HardwareSetCharging(True)
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testHardwareSetCharging_disabled(self):
+ self.battery._cache['profile'] = self._NEXUS_5
+ with self.assertCalls(
+ (self.call.device.RunShellCommand(
+ mock.ANY, check_return=True, as_root=True, large_output=True), []),
+ (self.call.battery.GetCharging(), True),
+ (self.call.battery.GetCharging(), False)):
+ self.battery._HardwareSetCharging(False)
+
+
+class BatteryUtilsSetBatteryMeasurementTest(BatteryUtilsTest):
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testBatteryMeasurementWifi(self):
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=22):
+ with self.assertCalls(
+ (self.call.battery._ClearPowerData(), True),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True),
+ []),
+ (self.call.battery.GetCharging(), False),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'battery', 'reset'], check_return=True), []),
+ (self.call.battery.GetCharging(), False),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']),
+ (self.call.battery.GetCharging(), False),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'battery'], check_return=True), [])):
+ with self.battery.BatteryMeasurement():
+ pass
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testBatteryMeasurementUsb(self):
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=22):
+ with self.assertCalls(
+ (self.call.battery._ClearPowerData(), True),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True),
+ []),
+ (self.call.battery.GetCharging(), False),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'battery', 'reset'], check_return=True), []),
+ (self.call.battery.GetCharging(), False),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']),
+ (self.call.battery.GetCharging(), True)):
+ with self.battery.BatteryMeasurement():
+ pass
+
+
+class BatteryUtilsGetPowerData(BatteryUtilsTest):
+
+ def testGetPowerData(self):
+ with self.assertCalls(
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'batterystats', '-c'],
+ check_return=True, large_output=True),
+ _DUMPSYS_OUTPUT)):
+ data = self.battery.GetPowerData()
+ check = {
+ 'system_total': 2000.0,
+ 'per_package': {
+ 'test_package1': {'uid': '1000', 'data': [1.0]},
+ 'test_package2': {'uid': '1001', 'data': [2.0]}
+ }
+ }
+ self.assertEqual(data, check)
+
+ def testGetPowerData_packageCollisionSame(self):
+ self.battery._cache['uids'] = {'test_package1': '1000'}
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ ['dumpsys', 'batterystats', '-c'],
+ check_return=True, large_output=True),
+ _DUMPSYS_OUTPUT):
+ data = self.battery.GetPowerData()
+ check = {
+ 'system_total': 2000.0,
+ 'per_package': {
+ 'test_package1': {'uid': '1000', 'data': [1.0]},
+ 'test_package2': {'uid': '1001', 'data': [2.0]}
+ }
+ }
+ self.assertEqual(data, check)
+
+ def testGetPowerData_packageCollisionDifferent(self):
+ self.battery._cache['uids'] = {'test_package1': '1'}
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ ['dumpsys', 'batterystats', '-c'],
+ check_return=True, large_output=True),
+ _DUMPSYS_OUTPUT):
+ with self.assertRaises(device_errors.CommandFailedError):
+ self.battery.GetPowerData()
+
+ def testGetPowerData_cacheCleared(self):
+ with self.assertCalls(
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'batterystats', '-c'],
+ check_return=True, large_output=True),
+ _DUMPSYS_OUTPUT)):
+ self.battery._cache.clear()
+ data = self.battery.GetPowerData()
+ check = {
+ 'system_total': 2000.0,
+ 'per_package': {
+ 'test_package1': {'uid': '1000', 'data': [1.0]},
+ 'test_package2': {'uid': '1001', 'data': [2.0]}
+ }
+ }
+ self.assertEqual(data, check)
+
+
+class BatteryUtilsChargeDevice(BatteryUtilsTest):
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testChargeDeviceToLevel_pass(self):
+ with self.assertCalls(
+ (self.call.battery.SetCharging(True)),
+ (self.call.battery.GetBatteryInfo(), {'level': '50'}),
+ (self.call.battery.GetBatteryInfo(), {'level': '100'})):
+ self.battery.ChargeDeviceToLevel(95)
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testChargeDeviceToLevel_failureSame(self):
+ with self.assertCalls(
+ (self.call.battery.SetCharging(True)),
+ (self.call.battery.GetBatteryInfo(), {'level': '50'}),
+ (self.call.battery.GetBatteryInfo(), {'level': '50'}),
+
+ (self.call.battery.GetBatteryInfo(), {'level': '50'})):
+ with self.assertRaises(device_errors.DeviceChargingError):
+ old_max = battery_utils._MAX_CHARGE_ERROR
+ try:
+ battery_utils._MAX_CHARGE_ERROR = 2
+ self.battery.ChargeDeviceToLevel(95)
+ finally:
+ battery_utils._MAX_CHARGE_ERROR = old_max
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testChargeDeviceToLevel_failureDischarge(self):
+ with self.assertCalls(
+ (self.call.battery.SetCharging(True)),
+ (self.call.battery.GetBatteryInfo(), {'level': '50'}),
+ (self.call.battery.GetBatteryInfo(), {'level': '49'}),
+ (self.call.battery.GetBatteryInfo(), {'level': '48'})):
+ with self.assertRaises(device_errors.DeviceChargingError):
+ old_max = battery_utils._MAX_CHARGE_ERROR
+ try:
+ battery_utils._MAX_CHARGE_ERROR = 2
+ self.battery.ChargeDeviceToLevel(95)
+ finally:
+ battery_utils._MAX_CHARGE_ERROR = old_max
+
+
+class BatteryUtilsDischargeDevice(BatteryUtilsTest):
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testDischargeDevice_exact(self):
+ with self.assertCalls(
+ (self.call.battery.GetBatteryInfo(), {'level': '100'}),
+ (self.call.battery._HardwareSetCharging(False)),
+ (self.call.battery._HardwareSetCharging(True)),
+ (self.call.battery.GetBatteryInfo(), {'level': '99'})):
+ self.battery._DischargeDevice(1)
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testDischargeDevice_over(self):
+ with self.assertCalls(
+ (self.call.battery.GetBatteryInfo(), {'level': '100'}),
+ (self.call.battery._HardwareSetCharging(False)),
+ (self.call.battery._HardwareSetCharging(True)),
+ (self.call.battery.GetBatteryInfo(), {'level': '50'})):
+ self.battery._DischargeDevice(1)
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testDischargeDevice_takeslong(self):
+ with self.assertCalls(
+ (self.call.battery.GetBatteryInfo(), {'level': '100'}),
+ (self.call.battery._HardwareSetCharging(False)),
+ (self.call.battery._HardwareSetCharging(True)),
+ (self.call.battery.GetBatteryInfo(), {'level': '100'}),
+ (self.call.battery._HardwareSetCharging(False)),
+ (self.call.battery._HardwareSetCharging(True)),
+ (self.call.battery.GetBatteryInfo(), {'level': '99'}),
+ (self.call.battery._HardwareSetCharging(False)),
+ (self.call.battery._HardwareSetCharging(True)),
+ (self.call.battery.GetBatteryInfo(), {'level': '98'}),
+ (self.call.battery._HardwareSetCharging(False)),
+ (self.call.battery._HardwareSetCharging(True)),
+ (self.call.battery.GetBatteryInfo(), {'level': '97'})):
+ self.battery._DischargeDevice(3)
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testDischargeDevice_dischargeTooClose(self):
+ with self.assertCalls(
+ (self.call.battery.GetBatteryInfo(), {'level': '100'})):
+ self.battery._DischargeDevice(99)
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testDischargeDevice_percentageOutOfBounds(self):
+ with self.assertCalls(
+ (self.call.battery.GetBatteryInfo(), {'level': '100'})):
+ with self.assertRaises(ValueError):
+ self.battery._DischargeDevice(100)
+ with self.assertCalls(
+ (self.call.battery.GetBatteryInfo(), {'level': '100'})):
+ with self.assertRaises(ValueError):
+ self.battery._DischargeDevice(0)
+
+
+class BatteryUtilsGetBatteryInfoTest(BatteryUtilsTest):
+
+ def testGetBatteryInfo_normal(self):
+ with self.assertCalls(
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'battery'], check_return=True),
+ [
+ 'Current Battery Service state:',
+ ' AC powered: false',
+ ' USB powered: true',
+ ' level: 100',
+ ' temperature: 321',
+ ])):
+ self.assertEquals(
+ {
+ 'AC powered': 'false',
+ 'USB powered': 'true',
+ 'level': '100',
+ 'temperature': '321',
+ },
+ self.battery.GetBatteryInfo())
+
+ def testGetBatteryInfo_nothing(self):
+ with self.assertCalls(
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'battery'], check_return=True), [])):
+ self.assertEquals({}, self.battery.GetBatteryInfo())
+
+
+class BatteryUtilsGetChargingTest(BatteryUtilsTest):
+
+ def testGetCharging_usb(self):
+ with self.assertCall(
+ self.call.battery.GetBatteryInfo(), {'USB powered': 'true'}):
+ self.assertTrue(self.battery.GetCharging())
+
+ def testGetCharging_usbFalse(self):
+ with self.assertCall(
+ self.call.battery.GetBatteryInfo(), {'USB powered': 'false'}):
+ self.assertFalse(self.battery.GetCharging())
+
+ def testGetCharging_ac(self):
+ with self.assertCall(
+ self.call.battery.GetBatteryInfo(), {'AC powered': 'true'}):
+ self.assertTrue(self.battery.GetCharging())
+
+ def testGetCharging_wireless(self):
+ with self.assertCall(
+ self.call.battery.GetBatteryInfo(), {'Wireless powered': 'true'}):
+ self.assertTrue(self.battery.GetCharging())
+
+ def testGetCharging_unknown(self):
+ with self.assertCall(
+ self.call.battery.GetBatteryInfo(), {'level': '42'}):
+ self.assertFalse(self.battery.GetCharging())
+
+
+class BatteryUtilsGetNetworkDataTest(BatteryUtilsTest):
+
+ def testGetNetworkData_noDataUsage(self):
+ with self.assertCalls(
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'batterystats', '-c'],
+ check_return=True, large_output=True),
+ _DUMPSYS_OUTPUT),
+ (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_snd'),
+ self.ShellError()),
+ (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_rcv'),
+ self.ShellError())):
+ self.assertEquals(self.battery.GetNetworkData('test_package1'), (0, 0))
+
+ def testGetNetworkData_badPackage(self):
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ ['dumpsys', 'batterystats', '-c'],
+ check_return=True, large_output=True),
+ _DUMPSYS_OUTPUT):
+ self.assertEqual(self.battery.GetNetworkData('asdf'), None)
+
+ def testGetNetworkData_packageNotCached(self):
+ with self.assertCalls(
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'batterystats', '-c'],
+ check_return=True, large_output=True),
+ _DUMPSYS_OUTPUT),
+ (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_snd'), 1),
+ (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_rcv'), 2)):
+ self.assertEqual(self.battery.GetNetworkData('test_package1'), (1, 2))
+
+ def testGetNetworkData_packageCached(self):
+ self.battery._cache['uids'] = {'test_package1': '1000'}
+ with self.assertCalls(
+ (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_snd'), 1),
+ (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_rcv'), 2)):
+ self.assertEqual(self.battery.GetNetworkData('test_package1'), (1, 2))
+
+ def testGetNetworkData_clearedCache(self):
+ with self.assertCalls(
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'batterystats', '-c'],
+ check_return=True, large_output=True),
+ _DUMPSYS_OUTPUT),
+ (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_snd'), 1),
+ (self.call.device.ReadFile('/proc/uid_stat/1000/tcp_rcv'), 2)):
+ self.battery._cache.clear()
+ self.assertEqual(self.battery.GetNetworkData('test_package1'), (1, 2))
+
+
+class BatteryUtilsLetBatteryCoolToTemperatureTest(BatteryUtilsTest):
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testLetBatteryCoolToTemperature_startUnder(self):
+ self.battery._cache['profile'] = self._NEXUS_6
+ with self.assertCalls(
+ (self.call.battery.EnableBatteryUpdates(), []),
+ (self.call.battery.GetBatteryInfo(), {'temperature': '500'})):
+ self.battery.LetBatteryCoolToTemperature(600)
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testLetBatteryCoolToTemperature_startOver(self):
+ self.battery._cache['profile'] = self._NEXUS_6
+ with self.assertCalls(
+ (self.call.battery.EnableBatteryUpdates(), []),
+ (self.call.battery.GetBatteryInfo(), {'temperature': '500'}),
+ (self.call.battery.GetBatteryInfo(), {'temperature': '400'})):
+ self.battery.LetBatteryCoolToTemperature(400)
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testLetBatteryCoolToTemperature_nexus5Hot(self):
+ self.battery._cache['profile'] = self._NEXUS_5
+ with self.assertCalls(
+ (self.call.battery.EnableBatteryUpdates(), []),
+ (self.call.battery.GetBatteryInfo(), {'temperature': '500'}),
+ (self.call.battery._DischargeDevice(1), []),
+ (self.call.battery.GetBatteryInfo(), {'temperature': '400'})):
+ self.battery.LetBatteryCoolToTemperature(400)
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testLetBatteryCoolToTemperature_nexus5Cool(self):
+ self.battery._cache['profile'] = self._NEXUS_5
+ with self.assertCalls(
+ (self.call.battery.EnableBatteryUpdates(), []),
+ (self.call.battery.GetBatteryInfo(), {'temperature': '400'})):
+ self.battery.LetBatteryCoolToTemperature(400)
+
+
+class BatteryUtilsSupportsFuelGaugeTest(BatteryUtilsTest):
+
+ def testSupportsFuelGauge_false(self):
+ self.battery._cache['profile'] = self._NEXUS_5
+ self.assertFalse(self.battery.SupportsFuelGauge())
+
+ def testSupportsFuelGauge_trueMax(self):
+ self.battery._cache['profile'] = self._NEXUS_6
+ # TODO(rnephew): Change this to assertTrue when we have support for
+ # disabling hardware charging on nexus 6.
+ self.assertFalse(self.battery.SupportsFuelGauge())
+
+ def testSupportsFuelGauge_trueDS(self):
+ self.battery._cache['profile'] = self._NEXUS_10
+ # TODO(rnephew): Change this to assertTrue when we have support for
+ # disabling hardware charging on nexus 10.
+ self.assertFalse(self.battery.SupportsFuelGauge())
+
+
+class BatteryUtilsGetFuelGaugeChargeCounterTest(BatteryUtilsTest):
+
+ def testGetFuelGaugeChargeCounter_noFuelGauge(self):
+ self.battery._cache['profile'] = self._NEXUS_5
+ with self.assertRaises(device_errors.CommandFailedError):
+ self.battery.GetFuelGaugeChargeCounter()
+
+ def testGetFuelGaugeChargeCounter_fuelGaugePresent(self):
+ self.battery._cache['profile'] = self._NEXUS_6
+ with self.assertCalls(
+ (self.call.battery.SupportsFuelGauge(), True),
+ (self.call.device.ReadFile(mock.ANY), '123')):
+ self.assertEqual(self.battery.GetFuelGaugeChargeCounter(), 123)
+
+
+class BatteryUtilsSetCharging(BatteryUtilsTest):
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testSetCharging_softwareSetTrue(self):
+ self.battery._cache['profile'] = self._NEXUS_6
+ with self.assertCalls(
+ (self.call.battery.GetCharging(), False),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'battery', 'reset'], check_return=True), []),
+ (self.call.battery.GetCharging(), False),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']),
+ (self.call.battery.GetCharging(), True)):
+ self.battery.SetCharging(True)
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testSetCharging_softwareSetFalse(self):
+ self.battery._cache['profile'] = self._NEXUS_6
+ with self.assertCalls(
+ (self.call.battery.GetCharging(), True),
+ (self.call.battery._ClearPowerData(), True),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True), []),
+ (self.call.battery.GetCharging(), False)):
+ self.battery.SetCharging(False)
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testSetCharging_hardwareSetTrue(self):
+ self.battery._cache['profile'] = self._NEXUS_5
+ with self.assertCalls(
+ (self.call.battery.GetCharging(), False),
+ (self.call.battery._HardwareSetCharging(True))):
+ self.battery.SetCharging(True)
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testSetCharging_hardwareSetFalse(self):
+ self.battery._cache['profile'] = self._NEXUS_5
+ with self.assertCalls(
+ (self.call.battery.GetCharging(), True),
+ (self.call.battery._ClearPowerData(), True),
+ (self.call.battery._HardwareSetCharging(False))):
+ self.battery.SetCharging(False)
+
+ def testSetCharging_expectedStateAlreadyTrue(self):
+ with self.assertCalls((self.call.battery.GetCharging(), True)):
+ self.battery.SetCharging(True)
+
+ def testSetCharging_expectedStateAlreadyFalse(self):
+ with self.assertCalls((self.call.battery.GetCharging(), False)):
+ self.battery.SetCharging(False)
+
+
+class BatteryUtilsPowerMeasurement(BatteryUtilsTest):
+
+ def testPowerMeasurement_hardware(self):
+ self.battery._cache['profile'] = self._NEXUS_5
+ with self.assertCalls(
+ (self.call.battery.GetCharging(), True),
+ (self.call.battery._ClearPowerData(), True),
+ (self.call.battery._HardwareSetCharging(False)),
+ (self.call.battery.GetCharging(), False),
+ (self.call.battery._HardwareSetCharging(True))):
+ with self.battery.PowerMeasurement():
+ pass
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testPowerMeasurement_software(self):
+ self.battery._cache['profile'] = self._NEXUS_6
+ with self.assertCalls(
+ (self.call.battery.GetCharging(), True),
+ (self.call.battery._ClearPowerData(), True),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'battery', 'set', 'ac', '0'], check_return=True), []),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'battery', 'set', 'usb', '0'], check_return=True), []),
+ (self.call.battery.GetCharging(), False),
+ (self.call.battery.GetCharging(), False),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'battery', 'reset'], check_return=True), []),
+ (self.call.battery.GetCharging(), False),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'battery'], check_return=True), ['UPDATES STOPPED']),
+ (self.call.battery.GetCharging(), True)):
+ with self.battery.PowerMeasurement():
+ pass
+
+
+class BatteryUtilsDiscoverDeviceProfile(BatteryUtilsTest):
+
+ def testDiscoverDeviceProfile_known(self):
+ with self.patch_call(self.call.device.product_model,
+ return_value='Nexus 4'):
+ self.battery._DiscoverDeviceProfile()
+ self.assertListEqual(self.battery._cache['profile']['name'], ["Nexus 4"])
+
+ def testDiscoverDeviceProfile_unknown(self):
+ with self.patch_call(self.call.device.product_model,
+ return_value='Other'):
+ self.battery._DiscoverDeviceProfile()
+ self.assertListEqual(self.battery._cache['profile']['name'], [])
+
+
+class BatteryUtilsClearPowerData(BatteryUtilsTest):
+
+ def testClearPowerData_preL(self):
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=20):
+ self.assertFalse(self.battery._ClearPowerData())
+
+ def testClearPowerData_clearedL(self):
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=22):
+ with self.assertCalls(
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'battery', 'set', 'usb', '1'], check_return=True),
+ []),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'battery', 'set', 'ac', '1'], check_return=True), []),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'batterystats', '--reset'], check_return=True), []),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'batterystats', '--charged', '-c'],
+ check_return=True, large_output=True), []),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'battery', 'reset'], check_return=True), [])):
+ self.assertTrue(self.battery._ClearPowerData())
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testClearPowerData_notClearedL(self):
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=22):
+ with self.assertCalls(
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'battery', 'set', 'usb', '1'], check_return=True),
+ []),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'battery', 'set', 'ac', '1'], check_return=True), []),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'batterystats', '--reset'], check_return=True), []),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'batterystats', '--charged', '-c'],
+ check_return=True, large_output=True),
+ ['9,1000,l,pwi,uid,0.0327']),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'batterystats', '--reset'], check_return=True), []),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'batterystats', '--charged', '-c'],
+ check_return=True, large_output=True),
+ ['9,1000,l,pwi,uid,0.0327']),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'batterystats', '--reset'], check_return=True), []),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'batterystats', '--charged', '-c'],
+ check_return=True, large_output=True),
+ ['9,1000,l,pwi,uid,0.0327']),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'batterystats', '--reset'], check_return=True), []),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'batterystats', '--charged', '-c'],
+ check_return=True, large_output=True),
+ ['9,1000,l,pwi,uid,0.0']),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'battery', 'reset'], check_return=True), [])):
+ self.battery._ClearPowerData()
+
+
+if __name__ == '__main__':
+ logging.getLogger().setLevel(logging.DEBUG)
+ unittest.main(verbosity=2)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/constants/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/constants/__init__.py
new file mode 100644
index 0000000..50b23df
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/constants/__init__.py
@@ -0,0 +1,3 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/constants/chrome.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/constants/chrome.py
new file mode 100644
index 0000000..dca04bd
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/constants/chrome.py
@@ -0,0 +1,57 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import collections
+
+PackageInfo = collections.namedtuple(
+ 'PackageInfo',
+ ['package', 'activity', 'cmdline_file', 'devtools_socket'])
+
+PACKAGE_INFO = {
+ 'chrome_document': PackageInfo(
+ 'com.google.android.apps.chrome.document',
+ 'com.google.android.apps.chrome.document.ChromeLauncherActivity',
+ 'chrome-command-line',
+ 'chrome_devtools_remote'),
+ 'chrome': PackageInfo(
+ 'com.google.android.apps.chrome',
+ 'com.google.android.apps.chrome.Main',
+ 'chrome-command-line',
+ 'chrome_devtools_remote'),
+ 'chrome_beta': PackageInfo(
+ 'com.chrome.beta',
+ 'com.google.android.apps.chrome.Main',
+ 'chrome-command-line',
+ 'chrome_devtools_remote'),
+ 'chrome_stable': PackageInfo(
+ 'com.android.chrome',
+ 'com.google.android.apps.chrome.Main',
+ 'chrome-command-line',
+ 'chrome_devtools_remote'),
+ 'chrome_dev': PackageInfo(
+ 'com.chrome.dev',
+ 'com.google.android.apps.chrome.Main',
+ 'chrome-command-line',
+ 'chrome_devtools_remote'),
+ 'chrome_canary': PackageInfo(
+ 'com.chrome.canary',
+ 'com.google.android.apps.chrome.Main',
+ 'chrome-command-line',
+ 'chrome_devtools_remote'),
+ 'chrome_work': PackageInfo(
+ 'com.chrome.work',
+ 'com.google.android.apps.chrome.Main',
+ 'chrome-command-line',
+ 'chrome_devtools_remote'),
+ 'chromium': PackageInfo(
+ 'org.chromium.chrome',
+ 'com.google.android.apps.chrome.Main',
+ 'chrome-command-line',
+ 'chrome_devtools_remote'),
+ 'content_shell': PackageInfo(
+ 'org.chromium.content_shell_apk',
+ '.ContentShellActivity',
+ 'content-shell-command-line',
+ 'content_shell_devtools_remote'),
+}
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/constants/file_system.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/constants/file_system.py
new file mode 100644
index 0000000..bffec61
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/constants/file_system.py
@@ -0,0 +1,5 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+TEST_EXECUTABLE_DIR = '/data/local/tmp'
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/decorators.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/decorators.py
new file mode 100644
index 0000000..3844b49
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/decorators.py
@@ -0,0 +1,176 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""
+Function/method decorators that provide timeout and retry logic.
+"""
+
+import functools
+import itertools
+import sys
+
+from devil.android import device_errors
+from devil.utils import cmd_helper
+from devil.utils import reraiser_thread
+from devil.utils import timeout_retry
+
+DEFAULT_TIMEOUT_ATTR = '_default_timeout'
+DEFAULT_RETRIES_ATTR = '_default_retries'
+
+
+def _TimeoutRetryWrapper(
+ f, timeout_func, retries_func, retry_if_func=timeout_retry.AlwaysRetry,
+ pass_values=False):
+ """ Wraps a funcion with timeout and retry handling logic.
+
+ Args:
+ f: The function to wrap.
+ timeout_func: A callable that returns the timeout value.
+ retries_func: A callable that returns the retries value.
+ pass_values: If True, passes the values returned by |timeout_func| and
+ |retries_func| to the wrapped function as 'timeout' and
+ 'retries' kwargs, respectively.
+ Returns:
+ The wrapped function.
+ """
+ @functools.wraps(f)
+ def timeout_retry_wrapper(*args, **kwargs):
+ timeout = timeout_func(*args, **kwargs)
+ retries = retries_func(*args, **kwargs)
+ if pass_values:
+ kwargs['timeout'] = timeout
+ kwargs['retries'] = retries
+
+ @functools.wraps(f)
+ def impl():
+ return f(*args, **kwargs)
+ try:
+ if timeout_retry.CurrentTimeoutThreadGroup():
+ # Don't wrap if there's already an outer timeout thread.
+ return impl()
+ else:
+ desc = '%s(%s)' % (f.__name__, ', '.join(itertools.chain(
+ (str(a) for a in args),
+ ('%s=%s' % (k, str(v)) for k, v in kwargs.iteritems()))))
+ return timeout_retry.Run(impl, timeout, retries, desc=desc,
+ retry_if_func=retry_if_func)
+ except reraiser_thread.TimeoutError as e:
+ raise device_errors.CommandTimeoutError(str(e)), None, (
+ sys.exc_info()[2])
+ except cmd_helper.TimeoutError as e:
+ raise device_errors.CommandTimeoutError(str(e)), None, (
+ sys.exc_info()[2])
+ return timeout_retry_wrapper
+
+
+def WithTimeoutAndRetries(f):
+ """A decorator that handles timeouts and retries.
+
+ 'timeout' and 'retries' kwargs must be passed to the function.
+
+ Args:
+ f: The function to decorate.
+ Returns:
+ The decorated function.
+ """
+ get_timeout = lambda *a, **kw: kw['timeout']
+ get_retries = lambda *a, **kw: kw['retries']
+ return _TimeoutRetryWrapper(f, get_timeout, get_retries)
+
+
+def WithTimeoutAndConditionalRetries(retry_if_func):
+ """Returns a decorator that handles timeouts and, in some cases, retries.
+
+ 'timeout' and 'retries' kwargs must be passed to the function.
+
+ Args:
+ retry_if_func: A unary callable that takes an exception and returns
+ whether failures should be retried.
+ Returns:
+ The actual decorator.
+ """
+ def decorator(f):
+ get_timeout = lambda *a, **kw: kw['timeout']
+ get_retries = lambda *a, **kw: kw['retries']
+ return _TimeoutRetryWrapper(
+ f, get_timeout, get_retries, retry_if_func=retry_if_func)
+ return decorator
+
+
+def WithExplicitTimeoutAndRetries(timeout, retries):
+ """Returns a decorator that handles timeouts and retries.
+
+ The provided |timeout| and |retries| values are always used.
+
+ Args:
+ timeout: The number of seconds to wait for the decorated function to
+ return. Always used.
+ retries: The number of times the decorated function should be retried on
+ failure. Always used.
+ Returns:
+ The actual decorator.
+ """
+ def decorator(f):
+ get_timeout = lambda *a, **kw: timeout
+ get_retries = lambda *a, **kw: retries
+ return _TimeoutRetryWrapper(f, get_timeout, get_retries)
+ return decorator
+
+
+def WithTimeoutAndRetriesDefaults(default_timeout, default_retries):
+ """Returns a decorator that handles timeouts and retries.
+
+ The provided |default_timeout| and |default_retries| values are used only
+ if timeout and retries values are not provided.
+
+ Args:
+ default_timeout: The number of seconds to wait for the decorated function
+ to return. Only used if a 'timeout' kwarg is not passed
+ to the decorated function.
+ default_retries: The number of times the decorated function should be
+ retried on failure. Only used if a 'retries' kwarg is not
+ passed to the decorated function.
+ Returns:
+ The actual decorator.
+ """
+ def decorator(f):
+ get_timeout = lambda *a, **kw: kw.get('timeout', default_timeout)
+ get_retries = lambda *a, **kw: kw.get('retries', default_retries)
+ return _TimeoutRetryWrapper(f, get_timeout, get_retries, pass_values=True)
+ return decorator
+
+
+def WithTimeoutAndRetriesFromInstance(
+ default_timeout_name=DEFAULT_TIMEOUT_ATTR,
+ default_retries_name=DEFAULT_RETRIES_ATTR,
+ min_default_timeout=None):
+ """Returns a decorator that handles timeouts and retries.
+
+ The provided |default_timeout_name| and |default_retries_name| are used to
+ get the default timeout value and the default retries value from the object
+ instance if timeout and retries values are not provided.
+
+ Note that this should only be used to decorate methods, not functions.
+
+ Args:
+ default_timeout_name: The name of the default timeout attribute of the
+ instance.
+ default_retries_name: The name of the default retries attribute of the
+ instance.
+ min_timeout: Miniumum timeout to be used when using instance timeout.
+ Returns:
+ The actual decorator.
+ """
+ def decorator(f):
+ def get_timeout(inst, *_args, **kwargs):
+ ret = getattr(inst, default_timeout_name)
+ if min_default_timeout is not None:
+ ret = max(min_default_timeout, ret)
+ return kwargs.get('timeout', ret)
+
+ def get_retries(inst, *_args, **kwargs):
+ return kwargs.get('retries', getattr(inst, default_retries_name))
+ return _TimeoutRetryWrapper(f, get_timeout, get_retries, pass_values=True)
+ return decorator
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/decorators_test.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/decorators_test.py
new file mode 100644
index 0000000..f60953e
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/decorators_test.py
@@ -0,0 +1,332 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""
+Unit tests for decorators.py.
+"""
+
+# pylint: disable=W0613
+
+import time
+import traceback
+import unittest
+
+from devil.android import decorators
+from devil.android import device_errors
+from devil.utils import reraiser_thread
+
+_DEFAULT_TIMEOUT = 30
+_DEFAULT_RETRIES = 3
+
+
+class DecoratorsTest(unittest.TestCase):
+ _decorated_function_called_count = 0
+
+ def testFunctionDecoratorDoesTimeouts(self):
+ """Tests that the base decorator handles the timeout logic."""
+ DecoratorsTest._decorated_function_called_count = 0
+
+ @decorators.WithTimeoutAndRetries
+ def alwaysTimesOut(timeout=None, retries=None):
+ DecoratorsTest._decorated_function_called_count += 1
+ time.sleep(100)
+
+ start_time = time.time()
+ with self.assertRaises(device_errors.CommandTimeoutError):
+ alwaysTimesOut(timeout=1, retries=0)
+ elapsed_time = time.time() - start_time
+ self.assertTrue(elapsed_time >= 1)
+ self.assertEquals(1, DecoratorsTest._decorated_function_called_count)
+
+ def testFunctionDecoratorDoesRetries(self):
+ """Tests that the base decorator handles the retries logic."""
+ DecoratorsTest._decorated_function_called_count = 0
+
+ @decorators.WithTimeoutAndRetries
+ def alwaysRaisesCommandFailedError(timeout=None, retries=None):
+ DecoratorsTest._decorated_function_called_count += 1
+ raise device_errors.CommandFailedError('testCommand failed')
+
+ with self.assertRaises(device_errors.CommandFailedError):
+ alwaysRaisesCommandFailedError(timeout=30, retries=10)
+ self.assertEquals(11, DecoratorsTest._decorated_function_called_count)
+
+ def testFunctionDecoratorRequiresParams(self):
+ """Tests that the base decorator requires timeout and retries params."""
+ @decorators.WithTimeoutAndRetries
+ def requiresExplicitTimeoutAndRetries(timeout=None, retries=None):
+ return (timeout, retries)
+
+ with self.assertRaises(KeyError):
+ requiresExplicitTimeoutAndRetries()
+ with self.assertRaises(KeyError):
+ requiresExplicitTimeoutAndRetries(timeout=10)
+ with self.assertRaises(KeyError):
+ requiresExplicitTimeoutAndRetries(retries=0)
+ expected_timeout = 10
+ expected_retries = 1
+ (actual_timeout, actual_retries) = (
+ requiresExplicitTimeoutAndRetries(timeout=expected_timeout,
+ retries=expected_retries))
+ self.assertEquals(expected_timeout, actual_timeout)
+ self.assertEquals(expected_retries, actual_retries)
+
+ def testFunctionDecoratorTranslatesReraiserExceptions(self):
+ """Tests that the explicit decorator translates reraiser exceptions."""
+ @decorators.WithTimeoutAndRetries
+ def alwaysRaisesProvidedException(exception, timeout=None, retries=None):
+ raise exception
+
+ exception_desc = 'Reraiser thread timeout error'
+ with self.assertRaises(device_errors.CommandTimeoutError) as e:
+ alwaysRaisesProvidedException(
+ reraiser_thread.TimeoutError(exception_desc),
+ timeout=10, retries=1)
+ self.assertEquals(exception_desc, str(e.exception))
+
+ def testConditionalRetriesDecoratorRetries(self):
+ def do_not_retry_no_adb_error(exc):
+ return not isinstance(exc, device_errors.NoAdbError)
+
+ actual_tries = [0]
+
+ @decorators.WithTimeoutAndConditionalRetries(do_not_retry_no_adb_error)
+ def alwaysRaisesCommandFailedError(timeout=None, retries=None):
+ actual_tries[0] += 1
+ raise device_errors.CommandFailedError('Command failed :(')
+
+ with self.assertRaises(device_errors.CommandFailedError):
+ alwaysRaisesCommandFailedError(timeout=10, retries=10)
+ self.assertEquals(11, actual_tries[0])
+
+ def testConditionalRetriesDecoratorDoesntRetry(self):
+ def do_not_retry_no_adb_error(exc):
+ return not isinstance(exc, device_errors.NoAdbError)
+
+ actual_tries = [0]
+
+ @decorators.WithTimeoutAndConditionalRetries(do_not_retry_no_adb_error)
+ def alwaysRaisesNoAdbError(timeout=None, retries=None):
+ actual_tries[0] += 1
+ raise device_errors.NoAdbError()
+
+ with self.assertRaises(device_errors.NoAdbError):
+ alwaysRaisesNoAdbError(timeout=10, retries=10)
+ self.assertEquals(1, actual_tries[0])
+
+ def testDefaultsFunctionDecoratorDoesTimeouts(self):
+ """Tests that the defaults decorator handles timeout logic."""
+ DecoratorsTest._decorated_function_called_count = 0
+
+ @decorators.WithTimeoutAndRetriesDefaults(1, 0)
+ def alwaysTimesOut(timeout=None, retries=None):
+ DecoratorsTest._decorated_function_called_count += 1
+ time.sleep(100)
+
+ start_time = time.time()
+ with self.assertRaises(device_errors.CommandTimeoutError):
+ alwaysTimesOut()
+ elapsed_time = time.time() - start_time
+ self.assertTrue(elapsed_time >= 1)
+ self.assertEquals(1, DecoratorsTest._decorated_function_called_count)
+
+ DecoratorsTest._decorated_function_called_count = 0
+ with self.assertRaises(device_errors.CommandTimeoutError):
+ alwaysTimesOut(timeout=2)
+ elapsed_time = time.time() - start_time
+ self.assertTrue(elapsed_time >= 2)
+ self.assertEquals(1, DecoratorsTest._decorated_function_called_count)
+
+ def testDefaultsFunctionDecoratorDoesRetries(self):
+ """Tests that the defaults decorator handles retries logic."""
+ DecoratorsTest._decorated_function_called_count = 0
+
+ @decorators.WithTimeoutAndRetriesDefaults(30, 10)
+ def alwaysRaisesCommandFailedError(timeout=None, retries=None):
+ DecoratorsTest._decorated_function_called_count += 1
+ raise device_errors.CommandFailedError('testCommand failed')
+
+ with self.assertRaises(device_errors.CommandFailedError):
+ alwaysRaisesCommandFailedError()
+ self.assertEquals(11, DecoratorsTest._decorated_function_called_count)
+
+ DecoratorsTest._decorated_function_called_count = 0
+ with self.assertRaises(device_errors.CommandFailedError):
+ alwaysRaisesCommandFailedError(retries=5)
+ self.assertEquals(6, DecoratorsTest._decorated_function_called_count)
+
+ def testDefaultsFunctionDecoratorPassesValues(self):
+ """Tests that the defaults decorator passes timeout and retries kwargs."""
+ @decorators.WithTimeoutAndRetriesDefaults(30, 10)
+ def alwaysReturnsTimeouts(timeout=None, retries=None):
+ return timeout
+
+ self.assertEquals(30, alwaysReturnsTimeouts())
+ self.assertEquals(120, alwaysReturnsTimeouts(timeout=120))
+
+ @decorators.WithTimeoutAndRetriesDefaults(30, 10)
+ def alwaysReturnsRetries(timeout=None, retries=None):
+ return retries
+
+ self.assertEquals(10, alwaysReturnsRetries())
+ self.assertEquals(1, alwaysReturnsRetries(retries=1))
+
+ def testDefaultsFunctionDecoratorTranslatesReraiserExceptions(self):
+ """Tests that the explicit decorator translates reraiser exceptions."""
+ @decorators.WithTimeoutAndRetriesDefaults(30, 10)
+ def alwaysRaisesProvidedException(exception, timeout=None, retries=None):
+ raise exception
+
+ exception_desc = 'Reraiser thread timeout error'
+ with self.assertRaises(device_errors.CommandTimeoutError) as e:
+ alwaysRaisesProvidedException(
+ reraiser_thread.TimeoutError(exception_desc))
+ self.assertEquals(exception_desc, str(e.exception))
+
+ def testExplicitFunctionDecoratorDoesTimeouts(self):
+ """Tests that the explicit decorator handles timeout logic."""
+ DecoratorsTest._decorated_function_called_count = 0
+
+ @decorators.WithExplicitTimeoutAndRetries(1, 0)
+ def alwaysTimesOut():
+ DecoratorsTest._decorated_function_called_count += 1
+ time.sleep(100)
+
+ start_time = time.time()
+ with self.assertRaises(device_errors.CommandTimeoutError):
+ alwaysTimesOut()
+ elapsed_time = time.time() - start_time
+ self.assertTrue(elapsed_time >= 1)
+ self.assertEquals(1, DecoratorsTest._decorated_function_called_count)
+
+ def testExplicitFunctionDecoratorDoesRetries(self):
+ """Tests that the explicit decorator handles retries logic."""
+ DecoratorsTest._decorated_function_called_count = 0
+
+ @decorators.WithExplicitTimeoutAndRetries(30, 10)
+ def alwaysRaisesCommandFailedError():
+ DecoratorsTest._decorated_function_called_count += 1
+ raise device_errors.CommandFailedError('testCommand failed')
+
+ with self.assertRaises(device_errors.CommandFailedError):
+ alwaysRaisesCommandFailedError()
+ self.assertEquals(11, DecoratorsTest._decorated_function_called_count)
+
+ def testExplicitDecoratorTranslatesReraiserExceptions(self):
+ """Tests that the explicit decorator translates reraiser exceptions."""
+ @decorators.WithExplicitTimeoutAndRetries(30, 10)
+ def alwaysRaisesProvidedException(exception):
+ raise exception
+
+ exception_desc = 'Reraiser thread timeout error'
+ with self.assertRaises(device_errors.CommandTimeoutError) as e:
+ alwaysRaisesProvidedException(
+ reraiser_thread.TimeoutError(exception_desc))
+ self.assertEquals(exception_desc, str(e.exception))
+
+ class _MethodDecoratorTestObject(object):
+ """An object suitable for testing the method decorator."""
+
+ def __init__(self, test_case, default_timeout=_DEFAULT_TIMEOUT,
+ default_retries=_DEFAULT_RETRIES):
+ self._test_case = test_case
+ self.default_timeout = default_timeout
+ self.default_retries = default_retries
+ self.function_call_counters = {
+ 'alwaysRaisesCommandFailedError': 0,
+ 'alwaysTimesOut': 0,
+ 'requiresExplicitTimeoutAndRetries': 0,
+ }
+
+ @decorators.WithTimeoutAndRetriesFromInstance(
+ 'default_timeout', 'default_retries')
+ def alwaysTimesOut(self, timeout=None, retries=None):
+ self.function_call_counters['alwaysTimesOut'] += 1
+ time.sleep(100)
+ self._test_case.assertFalse(True, msg='Failed to time out?')
+
+ @decorators.WithTimeoutAndRetriesFromInstance(
+ 'default_timeout', 'default_retries')
+ def alwaysRaisesCommandFailedError(self, timeout=None, retries=None):
+ self.function_call_counters['alwaysRaisesCommandFailedError'] += 1
+ raise device_errors.CommandFailedError('testCommand failed')
+
+ # pylint: disable=no-self-use
+
+ @decorators.WithTimeoutAndRetriesFromInstance(
+ 'default_timeout', 'default_retries')
+ def alwaysReturnsTimeout(self, timeout=None, retries=None):
+ return timeout
+
+ @decorators.WithTimeoutAndRetriesFromInstance(
+ 'default_timeout', 'default_retries', min_default_timeout=100)
+ def alwaysReturnsTimeoutWithMin(self, timeout=None, retries=None):
+ return timeout
+
+ @decorators.WithTimeoutAndRetriesFromInstance(
+ 'default_timeout', 'default_retries')
+ def alwaysReturnsRetries(self, timeout=None, retries=None):
+ return retries
+
+ @decorators.WithTimeoutAndRetriesFromInstance(
+ 'default_timeout', 'default_retries')
+ def alwaysRaisesProvidedException(self, exception, timeout=None,
+ retries=None):
+ raise exception
+
+ # pylint: enable=no-self-use
+
+ def testMethodDecoratorDoesTimeout(self):
+ """Tests that the method decorator handles timeout logic."""
+ test_obj = self._MethodDecoratorTestObject(self)
+ start_time = time.time()
+ with self.assertRaises(device_errors.CommandTimeoutError):
+ try:
+ test_obj.alwaysTimesOut(timeout=1, retries=0)
+ except:
+ traceback.print_exc()
+ raise
+ elapsed_time = time.time() - start_time
+ self.assertTrue(elapsed_time >= 1)
+ self.assertEquals(1, test_obj.function_call_counters['alwaysTimesOut'])
+
+ def testMethodDecoratorDoesRetries(self):
+ """Tests that the method decorator handles retries logic."""
+ test_obj = self._MethodDecoratorTestObject(self)
+ with self.assertRaises(device_errors.CommandFailedError):
+ try:
+ test_obj.alwaysRaisesCommandFailedError(retries=10)
+ except:
+ traceback.print_exc()
+ raise
+ self.assertEquals(
+ 11, test_obj.function_call_counters['alwaysRaisesCommandFailedError'])
+
+ def testMethodDecoratorPassesValues(self):
+ """Tests that the method decorator passes timeout and retries kwargs."""
+ test_obj = self._MethodDecoratorTestObject(
+ self, default_timeout=42, default_retries=31)
+ self.assertEquals(42, test_obj.alwaysReturnsTimeout())
+ self.assertEquals(41, test_obj.alwaysReturnsTimeout(timeout=41))
+ self.assertEquals(31, test_obj.alwaysReturnsRetries())
+ self.assertEquals(32, test_obj.alwaysReturnsRetries(retries=32))
+
+ def testMethodDecoratorUsesMiniumumTimeout(self):
+ test_obj = self._MethodDecoratorTestObject(
+ self, default_timeout=42, default_retries=31)
+ self.assertEquals(100, test_obj.alwaysReturnsTimeoutWithMin())
+ self.assertEquals(41, test_obj.alwaysReturnsTimeoutWithMin(timeout=41))
+
+ def testMethodDecoratorTranslatesReraiserExceptions(self):
+ test_obj = self._MethodDecoratorTestObject(self)
+
+ exception_desc = 'Reraiser thread timeout error'
+ with self.assertRaises(device_errors.CommandTimeoutError) as e:
+ test_obj.alwaysRaisesProvidedException(
+ reraiser_thread.TimeoutError(exception_desc))
+ self.assertEquals(exception_desc, str(e.exception))
+
+if __name__ == '__main__':
+ unittest.main(verbosity=2)
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_blacklist.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_blacklist.py
new file mode 100644
index 0000000..010e996
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_blacklist.py
@@ -0,0 +1,80 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import json
+import logging
+import os
+import threading
+import time
+
+logger = logging.getLogger(__name__)
+
+
+class Blacklist(object):
+
+ def __init__(self, path):
+ self._blacklist_lock = threading.RLock()
+ self._path = path
+
+ def Read(self):
+ """Reads the blacklist from the blacklist file.
+
+ Returns:
+ A dict containing bad devices.
+ """
+ with self._blacklist_lock:
+ blacklist = dict()
+ if not os.path.exists(self._path):
+ return blacklist
+
+ try:
+ with open(self._path, 'r') as f:
+ blacklist = json.load(f)
+ except (IOError, ValueError) as e:
+ logger.warning('Unable to read blacklist: %s', str(e))
+ os.remove(self._path)
+
+ if not isinstance(blacklist, dict):
+ logger.warning('Ignoring %s: %s (a dict was expected instead)',
+ self._path, blacklist)
+ blacklist = dict()
+
+ return blacklist
+
+ def Write(self, blacklist):
+ """Writes the provided blacklist to the blacklist file.
+
+ Args:
+ blacklist: list of bad devices to write to the blacklist file.
+ """
+ with self._blacklist_lock:
+ with open(self._path, 'w') as f:
+ json.dump(blacklist, f)
+
+ def Extend(self, devices, reason='unknown'):
+ """Adds devices to blacklist file.
+
+ Args:
+ devices: list of bad devices to be added to the blacklist file.
+ reason: string specifying the reason for blacklist (eg: 'unauthorized')
+ """
+ timestamp = time.time()
+ event_info = {
+ 'timestamp': timestamp,
+ 'reason': reason,
+ }
+ device_dicts = {device: event_info for device in devices}
+ logger.info('Adding %s to blacklist %s for reason: %s',
+ ','.join(devices), self._path, reason)
+ with self._blacklist_lock:
+ blacklist = self.Read()
+ blacklist.update(device_dicts)
+ self.Write(blacklist)
+
+ def Reset(self):
+ """Erases the blacklist file if it exists."""
+ logger.info('Resetting blacklist %s', self._path)
+ with self._blacklist_lock:
+ if os.path.exists(self._path):
+ os.remove(self._path)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_blacklist_test.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_blacklist_test.py
new file mode 100644
index 0000000..bc44da5
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_blacklist_test.py
@@ -0,0 +1,38 @@
+#! /usr/bin/env python
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import tempfile
+import unittest
+
+from devil.android import device_blacklist
+
+
+class DeviceBlacklistTest(unittest.TestCase):
+
+ def testBlacklistFileDoesNotExist(self):
+ with tempfile.NamedTemporaryFile() as blacklist_file:
+ # Allow the temporary file to be deleted.
+ pass
+
+ test_blacklist = device_blacklist.Blacklist(blacklist_file.name)
+ self.assertEquals({}, test_blacklist.Read())
+
+ def testBlacklistFileIsEmpty(self):
+ try:
+ with tempfile.NamedTemporaryFile(delete=False) as blacklist_file:
+ # Allow the temporary file to be closed.
+ pass
+
+ test_blacklist = device_blacklist.Blacklist(blacklist_file.name)
+ self.assertEquals({}, test_blacklist.Read())
+
+ finally:
+ if os.path.exists(blacklist_file.name):
+ os.remove(blacklist_file.name)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_errors.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_errors.py
new file mode 100644
index 0000000..57f3615
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_errors.py
@@ -0,0 +1,196 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""
+Exception classes raised by AdbWrapper and DeviceUtils.
+
+The class hierarchy for device exceptions is:
+
+ base_error.BaseError
+ +-- CommandFailedError
+ | +-- AdbCommandFailedError
+ | | +-- AdbShellCommandFailedError
+ | +-- FastbootCommandFailedError
+ | +-- DeviceVersionError
+ | +-- DeviceChargingError
+ +-- CommandTimeoutError
+ +-- DeviceUnreachableError
+ +-- NoDevicesError
+ +-- MultipleDevicesError
+ +-- NoAdbError
+
+"""
+
+from devil import base_error
+from devil.utils import cmd_helper
+from devil.utils import parallelizer
+
+
+class CommandFailedError(base_error.BaseError):
+ """Exception for command failures."""
+
+ def __init__(self, message, device_serial=None):
+ device_leader = '(device: %s)' % device_serial
+ if device_serial is not None and not message.startswith(device_leader):
+ message = '%s %s' % (device_leader, message)
+ self.device_serial = device_serial
+ super(CommandFailedError, self).__init__(message)
+
+ def __eq__(self, other):
+ return (super(CommandFailedError, self).__eq__(other)
+ and self.device_serial == other.device_serial)
+
+ def __ne__(self, other):
+ return not self == other
+
+
+class _BaseCommandFailedError(CommandFailedError):
+ """Base Exception for adb and fastboot command failures."""
+
+ def __init__(self, args, output, status=None, device_serial=None,
+ message=None):
+ self.args = args
+ self.output = output
+ self.status = status
+ if not message:
+ adb_cmd = ' '.join(cmd_helper.SingleQuote(arg) for arg in self.args)
+ message = ['adb %s: failed ' % adb_cmd]
+ if status:
+ message.append('with exit status %s ' % self.status)
+ if output:
+ message.append('and output:\n')
+ message.extend('- %s\n' % line for line in output.splitlines())
+ else:
+ message.append('and no output.')
+ message = ''.join(message)
+ super(_BaseCommandFailedError, self).__init__(message, device_serial)
+
+ def __eq__(self, other):
+ return (super(_BaseCommandFailedError, self).__eq__(other)
+ and self.args == other.args
+ and self.output == other.output
+ and self.status == other.status)
+
+ def __ne__(self, other):
+ return not self == other
+
+ def __reduce__(self):
+ """Support pickling."""
+ result = [None, None, None, None, None]
+ super_result = super(_BaseCommandFailedError, self).__reduce__()
+ for i in range(len(super_result)):
+ result[i] = super_result[i]
+
+ # Update the args used to reconstruct this exception.
+ result[1] = (
+ self.args, self.output, self.status, self.device_serial, self.message)
+ return tuple(result)
+
+
+class AdbCommandFailedError(_BaseCommandFailedError):
+ """Exception for adb command failures."""
+
+ def __init__(self, args, output, status=None, device_serial=None,
+ message=None):
+ super(AdbCommandFailedError, self).__init__(
+ args, output, status=status, message=message,
+ device_serial=device_serial)
+
+
+class FastbootCommandFailedError(_BaseCommandFailedError):
+ """Exception for fastboot command failures."""
+
+ def __init__(self, args, output, status=None, device_serial=None,
+ message=None):
+ super(FastbootCommandFailedError, self).__init__(
+ args, output, status=status, message=message,
+ device_serial=device_serial)
+
+
+class DeviceVersionError(CommandFailedError):
+ """Exception for device version failures."""
+
+ def __init__(self, message, device_serial=None):
+ super(DeviceVersionError, self).__init__(message, device_serial)
+
+
+class AdbShellCommandFailedError(AdbCommandFailedError):
+ """Exception for shell command failures run via adb."""
+
+ def __init__(self, command, output, status, device_serial=None):
+ self.command = command
+ message = ['shell command run via adb failed on the device:\n',
+ ' command: %s\n' % command]
+ message.append(' exit status: %s\n' % status)
+ if output:
+ message.append(' output:\n')
+ if isinstance(output, basestring):
+ output_lines = output.splitlines()
+ else:
+ output_lines = output
+ message.extend(' - %s\n' % line for line in output_lines)
+ else:
+ message.append(" output: ''\n")
+ message = ''.join(message)
+ super(AdbShellCommandFailedError, self).__init__(
+ ['shell', command], output, status, device_serial, message)
+
+ def __reduce__(self):
+ """Support pickling."""
+ result = [None, None, None, None, None]
+ super_result = super(AdbShellCommandFailedError, self).__reduce__()
+ for i in range(len(super_result)):
+ result[i] = super_result[i]
+
+ # Update the args used to reconstruct this exception.
+ result[1] = (self.command, self.output, self.status, self.device_serial)
+ return tuple(result)
+
+
+class CommandTimeoutError(base_error.BaseError):
+ """Exception for command timeouts."""
+ pass
+
+
+class DeviceUnreachableError(base_error.BaseError):
+ """Exception for device unreachable failures."""
+ pass
+
+
+class NoDevicesError(base_error.BaseError):
+ """Exception for having no devices attached."""
+
+ def __init__(self, msg=None):
+ super(NoDevicesError, self).__init__(
+ msg or 'No devices attached.', is_infra_error=True)
+
+
+class MultipleDevicesError(base_error.BaseError):
+ """Exception for having multiple attached devices without selecting one."""
+
+ def __init__(self, devices):
+ parallel_devices = parallelizer.Parallelizer(devices)
+ descriptions = parallel_devices.pMap(
+ lambda d: d.build_description).pGet(None)
+ msg = ('More than one device available. Use -d/--device to select a device '
+ 'by serial.\n\nAvailable devices:\n')
+ for d, desc in zip(devices, descriptions):
+ msg += ' %s (%s)\n' % (d, desc)
+
+ super(MultipleDevicesError, self).__init__(msg, is_infra_error=True)
+
+
+class NoAdbError(base_error.BaseError):
+ """Exception for being unable to find ADB."""
+
+ def __init__(self, msg=None):
+ super(NoAdbError, self).__init__(
+ msg or 'Unable to find adb.', is_infra_error=True)
+
+
+class DeviceChargingError(CommandFailedError):
+ """Exception for device charging errors."""
+
+ def __init__(self, message, device_serial=None):
+ super(DeviceChargingError, self).__init__(message, device_serial)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_errors_test.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_errors_test.py
new file mode 100644
index 0000000..68a4f16
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_errors_test.py
@@ -0,0 +1,72 @@
+#! /usr/bin/env python
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import pickle
+import sys
+import unittest
+
+from devil.android import device_errors
+
+
+class DeviceErrorsTest(unittest.TestCase):
+
+ def assertIsPicklable(self, original):
+ pickled = pickle.dumps(original)
+ reconstructed = pickle.loads(pickled)
+ self.assertEquals(original, reconstructed)
+
+ def testPicklable_AdbCommandFailedError(self):
+ original = device_errors.AdbCommandFailedError(
+ ['these', 'are', 'adb', 'args'], 'adb failure output', status=':(',
+ device_serial='0123456789abcdef')
+ self.assertIsPicklable(original)
+
+ def testPicklable_AdbShellCommandFailedError(self):
+ original = device_errors.AdbShellCommandFailedError(
+ 'foo', 'erroneous foo output', '1', device_serial='0123456789abcdef')
+ self.assertIsPicklable(original)
+
+ def testPicklable_CommandFailedError(self):
+ original = device_errors.CommandFailedError(
+ 'sample command failed')
+ self.assertIsPicklable(original)
+
+ def testPicklable_CommandTimeoutError(self):
+ original = device_errors.CommandTimeoutError(
+ 'My fake command timed out :(')
+ self.assertIsPicklable(original)
+
+ def testPicklable_DeviceChargingError(self):
+ original = device_errors.DeviceChargingError(
+ 'Fake device failed to charge')
+ self.assertIsPicklable(original)
+
+ def testPicklable_DeviceUnreachableError(self):
+ original = device_errors.DeviceUnreachableError
+ self.assertIsPicklable(original)
+
+ def testPicklable_FastbootCommandFailedError(self):
+ original = device_errors.FastbootCommandFailedError(
+ ['these', 'are', 'fastboot', 'args'], 'fastboot failure output',
+ status=':(', device_serial='0123456789abcdef')
+ self.assertIsPicklable(original)
+
+ def testPicklable_MultipleDevicesError(self):
+ # TODO(jbudorick): Implement this after implementing a stable DeviceUtils
+ # fake. https://github.com/catapult-project/catapult/issues/3145
+ pass
+
+ def testPicklable_NoAdbError(self):
+ original = device_errors.NoAdbError()
+ self.assertIsPicklable(original)
+
+ def testPicklable_NoDevicesError(self):
+ original = device_errors.NoDevicesError()
+ self.assertIsPicklable(original)
+
+
+
+if __name__ == '__main__':
+ sys.exit(unittest.main())
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_list.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_list.py
new file mode 100644
index 0000000..0fbb0f1
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_list.py
@@ -0,0 +1,52 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""A module to keep track of devices across builds."""
+
+import json
+import logging
+import os
+
+logger = logging.getLogger(__name__)
+
+
+def GetPersistentDeviceList(file_name):
+ """Returns a list of devices.
+
+ Args:
+ file_name: the file name containing a list of devices.
+
+ Returns: List of device serial numbers that were on the bot.
+ """
+ if not os.path.isfile(file_name):
+ logger.warning("Device file %s doesn't exist.", file_name)
+ return []
+
+ try:
+ with open(file_name) as f:
+ devices = json.load(f)
+ if not isinstance(devices, list) or not all(isinstance(d, basestring)
+ for d in devices):
+ logger.warning('Unrecognized device file format: %s', devices)
+ return []
+ return [d for d in devices if d != '(error)']
+ except ValueError:
+ logger.exception(
+ 'Error reading device file %s. Falling back to old format.', file_name)
+
+ # TODO(bpastene) Remove support for old unstructured file format.
+ with open(file_name) as f:
+ return [d for d in f.read().splitlines() if d != '(error)']
+
+
+def WritePersistentDeviceList(file_name, device_list):
+ path = os.path.dirname(file_name)
+ assert isinstance(device_list, list)
+ # If there is a problem with ADB "(error)" can be added to the device list.
+ # These should be removed before saving.
+ device_list = [d for d in device_list if d != '(error)']
+ if not os.path.exists(path):
+ os.makedirs(path)
+ with open(file_name, 'w') as f:
+ json.dump(device_list, f)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_signal.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_signal.py
new file mode 100644
index 0000000..2cec46d
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_signal.py
@@ -0,0 +1,41 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Defines constants for signals that should be supported on devices.
+
+Note: Obtained by running `kill -l` on a user device.
+"""
+
+
+SIGHUP = 1 # Hangup
+SIGINT = 2 # Interrupt
+SIGQUIT = 3 # Quit
+SIGILL = 4 # Illegal instruction
+SIGTRAP = 5 # Trap
+SIGABRT = 6 # Aborted
+SIGBUS = 7 # Bus error
+SIGFPE = 8 # Floating point exception
+SIGKILL = 9 # Killed
+SIGUSR1 = 10 # User signal 1
+SIGSEGV = 11 # Segmentation fault
+SIGUSR2 = 12 # User signal 2
+SIGPIPE = 13 # Broken pipe
+SIGALRM = 14 # Alarm clock
+SIGTERM = 15 # Terminated
+SIGSTKFLT = 16 # Stack fault
+SIGCHLD = 17 # Child exited
+SIGCONT = 18 # Continue
+SIGSTOP = 19 # Stopped (signal)
+SIGTSTP = 20 # Stopped
+SIGTTIN = 21 # Stopped (tty input)
+SIGTTOU = 22 # Stopped (tty output)
+SIGURG = 23 # Urgent I/O condition
+SIGXCPU = 24 # CPU time limit exceeded
+SIGXFSZ = 25 # File size limit exceeded
+SIGVTALRM = 26 # Virtual timer expired
+SIGPROF = 27 # Profiling timer expired
+SIGWINCH = 28 # Window size changed
+SIGIO = 29 # I/O possible
+SIGPWR = 30 # Power failure
+SIGSYS = 31 # Bad system call
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_temp_file.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_temp_file.py
new file mode 100644
index 0000000..4d0c7ad
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_temp_file.py
@@ -0,0 +1,63 @@
+# Copyright 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""A temp file that automatically gets pushed and deleted from a device."""
+
+# pylint: disable=W0622
+
+import posixpath
+import random
+import threading
+
+from devil.android import device_errors
+from devil.utils import cmd_helper
+
+
+class DeviceTempFile(object):
+
+ def __init__(self, adb, suffix='', prefix='temp_file', dir='/data/local/tmp'):
+ """Find an unused temporary file path on the device.
+
+ When this object is closed, the file will be deleted on the device.
+
+ Args:
+ adb: An instance of AdbWrapper
+ suffix: The suffix of the name of the temp file.
+ prefix: The prefix of the name of the temp file.
+ dir: The directory on the device where to place the temp file.
+ Raises:
+ ValueError if any of suffix, prefix, or dir are None.
+ """
+ if None in (dir, prefix, suffix):
+ m = 'Provided None path component. (dir: %s, prefix: %s, suffix: %s)' % (
+ dir, prefix, suffix)
+ raise ValueError(m)
+
+ self._adb = adb
+ # Python's random module use 52-bit numbers according to its docs.
+ random_hex = hex(random.randint(0, 2 ** 52))[2:]
+ self.name = posixpath.join(dir, '%s-%s%s' % (prefix, random_hex, suffix))
+ self.name_quoted = cmd_helper.SingleQuote(self.name)
+
+ def close(self):
+ """Deletes the temporary file from the device."""
+ # ignore exception if the file is already gone.
+ def delete_temporary_file():
+ try:
+ self._adb.Shell('rm -f %s' % self.name_quoted, expect_status=None)
+ except device_errors.AdbCommandFailedError:
+ # file does not exist on Android version without 'rm -f' support (ICS)
+ pass
+
+ # It shouldn't matter when the temp file gets deleted, so do so
+ # asynchronously.
+ threading.Thread(
+ target=delete_temporary_file,
+ name='delete_temporary_file(%s)' % self._adb.GetDeviceSerial()).start()
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, type, value, traceback):
+ self.close()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_test_case.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_test_case.py
new file mode 100644
index 0000000..1148b54
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_test_case.py
@@ -0,0 +1,54 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import threading
+import unittest
+
+from devil.android import device_errors
+from devil.android import device_utils
+
+_devices_lock = threading.Lock()
+_devices_condition = threading.Condition(_devices_lock)
+_devices = set()
+
+
+def PrepareDevices(*_args):
+
+ raw_devices = device_utils.DeviceUtils.HealthyDevices()
+ live_devices = []
+ for d in raw_devices:
+ try:
+ d.WaitUntilFullyBooted(timeout=5, retries=0)
+ live_devices.append(str(d))
+ except (device_errors.CommandFailedError,
+ device_errors.CommandTimeoutError,
+ device_errors.DeviceUnreachableError):
+ pass
+ with _devices_lock:
+ _devices.update(set(live_devices))
+
+ if not _devices:
+ raise Exception('No live devices attached.')
+
+
+class DeviceTestCase(unittest.TestCase):
+
+ def __init__(self, *args, **kwargs):
+ super(DeviceTestCase, self).__init__(*args, **kwargs)
+ self.serial = None
+
+ #override
+ def setUp(self):
+ super(DeviceTestCase, self).setUp()
+ with _devices_lock:
+ while not _devices:
+ _devices_condition.wait(5)
+ self.serial = _devices.pop()
+
+ #override
+ def tearDown(self):
+ super(DeviceTestCase, self).tearDown()
+ with _devices_lock:
+ _devices.add(self.serial)
+ _devices_condition.notify()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_utils.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_utils.py
new file mode 100644
index 0000000..51f7194
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_utils.py
@@ -0,0 +1,2654 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Provides a variety of device interactions based on adb.
+
+Eventually, this will be based on adb_wrapper.
+"""
+# pylint: disable=unused-argument
+
+import calendar
+import collections
+import itertools
+import json
+import logging
+import multiprocessing
+import os
+import posixpath
+import pprint
+import re
+import shutil
+import stat
+import tempfile
+import time
+import threading
+import uuid
+import zipfile
+
+from devil import base_error
+from devil import devil_env
+from devil.utils import cmd_helper
+from devil.android import apk_helper
+from devil.android import device_signal
+from devil.android import decorators
+from devil.android import device_errors
+from devil.android import device_temp_file
+from devil.android import install_commands
+from devil.android import logcat_monitor
+from devil.android import md5sum
+from devil.android.constants import chrome
+from devil.android.sdk import adb_wrapper
+from devil.android.sdk import intent
+from devil.android.sdk import keyevent
+from devil.android.sdk import split_select
+from devil.android.sdk import version_codes
+from devil.utils import host_utils
+from devil.utils import parallelizer
+from devil.utils import reraiser_thread
+from devil.utils import timeout_retry
+from devil.utils import zip_utils
+
+logger = logging.getLogger(__name__)
+
+_DEFAULT_TIMEOUT = 30
+_DEFAULT_RETRIES = 3
+
+# A sentinel object for default values
+# TODO(jbudorick,perezju): revisit how default values are handled by
+# the timeout_retry decorators.
+DEFAULT = object()
+
+_RESTART_ADBD_SCRIPT = """
+ trap '' HUP
+ trap '' TERM
+ trap '' PIPE
+ function restart() {
+ stop adbd
+ start adbd
+ }
+ restart &
+"""
+
+# Not all permissions can be set.
+_PERMISSIONS_BLACKLIST = [
+ 'android.permission.ACCESS_LOCATION_EXTRA_COMMANDS',
+ 'android.permission.ACCESS_MOCK_LOCATION',
+ 'android.permission.ACCESS_NETWORK_STATE',
+ 'android.permission.ACCESS_NOTIFICATION_POLICY',
+ 'android.permission.ACCESS_WIFI_STATE',
+ 'android.permission.AUTHENTICATE_ACCOUNTS',
+ 'android.permission.BLUETOOTH',
+ 'android.permission.BLUETOOTH_ADMIN',
+ 'android.permission.BROADCAST_STICKY',
+ 'android.permission.CHANGE_NETWORK_STATE',
+ 'android.permission.CHANGE_WIFI_MULTICAST_STATE',
+ 'android.permission.CHANGE_WIFI_STATE',
+ 'android.permission.DISABLE_KEYGUARD',
+ 'android.permission.DOWNLOAD_WITHOUT_NOTIFICATION',
+ 'android.permission.EXPAND_STATUS_BAR',
+ 'android.permission.GET_PACKAGE_SIZE',
+ 'android.permission.INSTALL_SHORTCUT',
+ 'android.permission.INTERNET',
+ 'android.permission.KILL_BACKGROUND_PROCESSES',
+ 'android.permission.MANAGE_ACCOUNTS',
+ 'android.permission.MODIFY_AUDIO_SETTINGS',
+ 'android.permission.NFC',
+ 'android.permission.READ_SYNC_SETTINGS',
+ 'android.permission.READ_SYNC_STATS',
+ 'android.permission.RECEIVE_BOOT_COMPLETED',
+ 'android.permission.RECORD_VIDEO',
+ 'android.permission.REORDER_TASKS',
+ 'android.permission.REQUEST_INSTALL_PACKAGES',
+ 'android.permission.RUN_INSTRUMENTATION',
+ 'android.permission.SET_ALARM',
+ 'android.permission.SET_TIME_ZONE',
+ 'android.permission.SET_WALLPAPER',
+ 'android.permission.SET_WALLPAPER_HINTS',
+ 'android.permission.TRANSMIT_IR',
+ 'android.permission.USE_CREDENTIALS',
+ 'android.permission.USE_FINGERPRINT',
+ 'android.permission.VIBRATE',
+ 'android.permission.WAKE_LOCK',
+ 'android.permission.WRITE_SYNC_SETTINGS',
+ 'com.android.browser.permission.READ_HISTORY_BOOKMARKS',
+ 'com.android.browser.permission.WRITE_HISTORY_BOOKMARKS',
+ 'com.android.launcher.permission.INSTALL_SHORTCUT',
+ 'com.chrome.permission.DEVICE_EXTRAS',
+ 'com.google.android.apps.now.CURRENT_ACCOUNT_ACCESS',
+ 'com.google.android.c2dm.permission.RECEIVE',
+ 'com.google.android.providers.gsf.permission.READ_GSERVICES',
+ 'com.sec.enterprise.knox.MDM_CONTENT_PROVIDER',
+]
+for package_info in chrome.PACKAGE_INFO.itervalues():
+ _PERMISSIONS_BLACKLIST.extend([
+ '%s.permission.C2D_MESSAGE' % package_info.package,
+ '%s.permission.READ_WRITE_BOOKMARK_FOLDERS' % package_info.package,
+ '%s.TOS_ACKED' % package_info.package])
+
+_CURRENT_FOCUS_CRASH_RE = re.compile(
+ r'\s*mCurrentFocus.*Application (Error|Not Responding): (\S+)}')
+
+_GETPROP_RE = re.compile(r'\[(.*?)\]: \[(.*?)\]')
+
+# Regex to parse the long (-l) output of 'ls' command, c.f.
+# https://github.com/landley/toybox/blob/master/toys/posix/ls.c#L446
+_LONG_LS_OUTPUT_RE = re.compile(
+ r'(?P<st_mode>[\w-]{10})\s+' # File permissions
+ r'(?:(?P<st_nlink>\d+)\s+)?' # Number of links (optional)
+ r'(?P<st_owner>\w+)\s+' # Name of owner
+ r'(?P<st_group>\w+)\s+' # Group of owner
+ r'(?:' # Either ...
+ r'(?P<st_rdev_major>\d+),\s+' # Device major, and
+ r'(?P<st_rdev_minor>\d+)\s+' # Device minor
+ r'|' # .. or
+ r'(?P<st_size>\d+)\s+' # Size in bytes
+ r')?' # .. or nothing
+ r'(?P<st_mtime>\d{4}-\d\d-\d\d \d\d:\d\d)\s+' # Modification date/time
+ r'(?P<filename>.+?)' # File name
+ r'(?: -> (?P<symbolic_link_to>.+))?' # Symbolic link (optional)
+ r'$' # End of string
+)
+_LS_DATE_FORMAT = '%Y-%m-%d %H:%M'
+_FILE_MODE_RE = re.compile(r'[dbclps-](?:[r-][w-][xSs-]){2}[r-][w-][xTt-]$')
+_FILE_MODE_KIND = {
+ 'd': stat.S_IFDIR, 'b': stat.S_IFBLK, 'c': stat.S_IFCHR,
+ 'l': stat.S_IFLNK, 'p': stat.S_IFIFO, 's': stat.S_IFSOCK,
+ '-': stat.S_IFREG}
+_FILE_MODE_PERMS = [
+ stat.S_IRUSR, stat.S_IWUSR, stat.S_IXUSR,
+ stat.S_IRGRP, stat.S_IWGRP, stat.S_IXGRP,
+ stat.S_IROTH, stat.S_IWOTH, stat.S_IXOTH,
+]
+_FILE_MODE_SPECIAL = [
+ ('s', stat.S_ISUID),
+ ('s', stat.S_ISGID),
+ ('t', stat.S_ISVTX),
+]
+_SELINUX_MODE = {
+ 'enforcing': True,
+ 'permissive': False,
+ 'disabled': None
+}
+# Some devices require different logic for checking if root is necessary
+_SPECIAL_ROOT_DEVICE_LIST = [
+ 'marlin',
+ 'sailfish',
+]
+
+
+@decorators.WithExplicitTimeoutAndRetries(
+ _DEFAULT_TIMEOUT, _DEFAULT_RETRIES)
+def GetAVDs():
+ """Returns a list of Android Virtual Devices.
+
+ Returns:
+ A list containing the configured AVDs.
+ """
+ lines = cmd_helper.GetCmdOutput([
+ os.path.join(devil_env.config.LocalPath('android_sdk'),
+ 'tools', 'android'),
+ 'list', 'avd']).splitlines()
+ avds = []
+ for line in lines:
+ if 'Name:' not in line:
+ continue
+ key, value = (s.strip() for s in line.split(':', 1))
+ if key == 'Name':
+ avds.append(value)
+ return avds
+
+
+@decorators.WithExplicitTimeoutAndRetries(
+ _DEFAULT_TIMEOUT, _DEFAULT_RETRIES)
+def RestartServer():
+ """Restarts the adb server.
+
+ Raises:
+ CommandFailedError if we fail to kill or restart the server.
+ """
+ def adb_killed():
+ return not adb_wrapper.AdbWrapper.IsServerOnline()
+
+ def adb_started():
+ return adb_wrapper.AdbWrapper.IsServerOnline()
+
+ adb_wrapper.AdbWrapper.KillServer()
+ if not timeout_retry.WaitFor(adb_killed, wait_period=1, max_tries=5):
+ # TODO(perezju): raise an exception after fixng http://crbug.com/442319
+ logger.warning('Failed to kill adb server')
+ adb_wrapper.AdbWrapper.StartServer()
+ if not timeout_retry.WaitFor(adb_started, wait_period=1, max_tries=5):
+ raise device_errors.CommandFailedError('Failed to start adb server')
+
+
+def _ParseModeString(mode_str):
+ """Parse a mode string, e.g. 'drwxrwxrwx', into a st_mode value.
+
+ Effectively the reverse of |mode_to_string| in, e.g.:
+ https://github.com/landley/toybox/blob/master/lib/lib.c#L896
+ """
+ if not _FILE_MODE_RE.match(mode_str):
+ raise ValueError('Unexpected file mode %r', mode_str)
+ mode = _FILE_MODE_KIND[mode_str[0]]
+ for c, flag in zip(mode_str[1:], _FILE_MODE_PERMS):
+ if c != '-' and c.islower():
+ mode |= flag
+ for c, (t, flag) in zip(mode_str[3::3], _FILE_MODE_SPECIAL):
+ if c.lower() == t:
+ mode |= flag
+ return mode
+
+
+def _GetTimeStamp():
+ """Return a basic ISO 8601 time stamp with the current local time."""
+ return time.strftime('%Y%m%dT%H%M%S', time.localtime())
+
+
+def _JoinLines(lines):
+ # makes sure that the last line is also terminated, and is more memory
+ # efficient than first appending an end-line to each line and then joining
+ # all of them together.
+ return ''.join(s for line in lines for s in (line, '\n'))
+
+
+def _CreateAdbWrapper(device):
+ if isinstance(device, adb_wrapper.AdbWrapper):
+ return device
+ else:
+ return adb_wrapper.AdbWrapper(device)
+
+
+def _FormatPartialOutputError(output):
+ lines = output.splitlines() if isinstance(output, basestring) else output
+ message = ['Partial output found:']
+ if len(lines) > 11:
+ message.extend('- %s' % line for line in lines[:5])
+ message.extend('<snip>')
+ message.extend('- %s' % line for line in lines[-5:])
+ else:
+ message.extend('- %s' % line for line in lines)
+ return '\n'.join(message)
+
+
+class DeviceUtils(object):
+
+ _MAX_ADB_COMMAND_LENGTH = 512
+ _MAX_ADB_OUTPUT_LENGTH = 32768
+ _LAUNCHER_FOCUSED_RE = re.compile(
+ r'\s*mCurrentFocus.*(Launcher|launcher).*')
+ _VALID_SHELL_VARIABLE = re.compile('^[a-zA-Z_][a-zA-Z0-9_]*$')
+
+ LOCAL_PROPERTIES_PATH = posixpath.join('/', 'data', 'local.prop')
+
+ # Property in /data/local.prop that controls Java assertions.
+ JAVA_ASSERT_PROPERTY = 'dalvik.vm.enableassertions'
+
+ def __init__(self, device, enable_device_files_cache=False,
+ default_timeout=_DEFAULT_TIMEOUT,
+ default_retries=_DEFAULT_RETRIES):
+ """DeviceUtils constructor.
+
+ Args:
+ device: Either a device serial, an existing AdbWrapper instance, or an
+ an existing AndroidCommands instance.
+ enable_device_files_cache: For PushChangedFiles(), cache checksums of
+ pushed files rather than recomputing them on a subsequent call.
+ default_timeout: An integer containing the default number of seconds to
+ wait for an operation to complete if no explicit value is provided.
+ default_retries: An integer containing the default number or times an
+ operation should be retried on failure if no explicit value is provided.
+ """
+ self.adb = None
+ if isinstance(device, basestring):
+ self.adb = _CreateAdbWrapper(device)
+ elif isinstance(device, adb_wrapper.AdbWrapper):
+ self.adb = device
+ else:
+ raise ValueError('Unsupported device value: %r' % device)
+ self._commands_installed = None
+ self._default_timeout = default_timeout
+ self._default_retries = default_retries
+ self._enable_device_files_cache = enable_device_files_cache
+ self._cache = {}
+ self._client_caches = {}
+ self._cache_lock = threading.RLock()
+ assert hasattr(self, decorators.DEFAULT_TIMEOUT_ATTR)
+ assert hasattr(self, decorators.DEFAULT_RETRIES_ATTR)
+
+ self._ClearCache()
+
+ @property
+ def serial(self):
+ """Returns the device serial."""
+ return self.adb.GetDeviceSerial()
+
+ def __eq__(self, other):
+ """Checks whether |other| refers to the same device as |self|.
+
+ Args:
+ other: The object to compare to. This can be a basestring, an instance
+ of adb_wrapper.AdbWrapper, or an instance of DeviceUtils.
+ Returns:
+ Whether |other| refers to the same device as |self|.
+ """
+ return self.serial == str(other)
+
+ def __lt__(self, other):
+ """Compares two instances of DeviceUtils.
+
+ This merely compares their serial numbers.
+
+ Args:
+ other: The instance of DeviceUtils to compare to.
+ Returns:
+ Whether |self| is less than |other|.
+ """
+ return self.serial < other.serial
+
+ def __str__(self):
+ """Returns the device serial."""
+ return self.serial
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def IsOnline(self, timeout=None, retries=None):
+ """Checks whether the device is online.
+
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ True if the device is online, False otherwise.
+
+ Raises:
+ CommandTimeoutError on timeout.
+ """
+ try:
+ return self.adb.GetState() == 'device'
+ except base_error.BaseError as exc:
+ logger.info('Failed to get state: %s', exc)
+ return False
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def HasRoot(self, timeout=None, retries=None):
+ """Checks whether or not adbd has root privileges.
+
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ True if adbd has root privileges, False otherwise.
+
+ Raises:
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+ """
+ try:
+ if self.product_name in _SPECIAL_ROOT_DEVICE_LIST:
+ return self.GetProp('service.adb.root') == '1'
+ self.RunShellCommand(['ls', '/root'], check_return=True)
+ return True
+ except device_errors.AdbCommandFailedError:
+ return False
+
+ def NeedsSU(self, timeout=DEFAULT, retries=DEFAULT):
+ """Checks whether 'su' is needed to access protected resources.
+
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ True if 'su' is available on the device and is needed to to access
+ protected resources; False otherwise if either 'su' is not available
+ (e.g. because the device has a user build), or not needed (because adbd
+ already has root privileges).
+
+ Raises:
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+ """
+ if 'needs_su' not in self._cache:
+ cmd = '%s && ! ls /root' % self._Su('ls /root')
+ if self.product_name in _SPECIAL_ROOT_DEVICE_LIST:
+ if self.HasRoot():
+ self._cache['needs_su'] = False
+ return False
+ cmd = 'which which && which su'
+ try:
+ self.RunShellCommand(cmd, shell=True, check_return=True,
+ timeout=self._default_timeout if timeout is DEFAULT else timeout,
+ retries=self._default_retries if retries is DEFAULT else retries)
+ self._cache['needs_su'] = True
+ except device_errors.AdbCommandFailedError:
+ self._cache['needs_su'] = False
+ return self._cache['needs_su']
+
+
+ def _Su(self, command):
+ if self.build_version_sdk >= version_codes.MARSHMALLOW:
+ return 'su 0 %s' % command
+ return 'su -c %s' % command
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def EnableRoot(self, timeout=None, retries=None):
+ """Restarts adbd with root privileges.
+
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandFailedError if root could not be enabled.
+ CommandTimeoutError on timeout.
+ """
+ if 'needs_su' in self._cache:
+ del self._cache['needs_su']
+
+ try:
+ self.adb.Root()
+ except device_errors.AdbCommandFailedError:
+ if self.IsUserBuild():
+ raise device_errors.CommandFailedError(
+ 'Unable to root device with user build.', str(self))
+ else:
+ raise # Failed probably due to some other reason.
+
+ def device_online_with_root():
+ try:
+ self.adb.WaitForDevice()
+ return self.GetProp('service.adb.root', cache=False) == '1'
+ except (device_errors.AdbCommandFailedError,
+ device_errors.DeviceUnreachableError):
+ return False
+
+ timeout_retry.WaitFor(device_online_with_root, wait_period=1)
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def IsUserBuild(self, timeout=None, retries=None):
+ """Checks whether or not the device is running a user build.
+
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ True if the device is running a user build, False otherwise (i.e. if
+ it's running a userdebug build).
+
+ Raises:
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+ """
+ return self.build_type == 'user'
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def GetExternalStoragePath(self, timeout=None, retries=None):
+ """Get the device's path to its SD card.
+
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ The device's path to its SD card.
+
+ Raises:
+ CommandFailedError if the external storage path could not be determined.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+ """
+ self._EnsureCacheInitialized()
+ if not self._cache['external_storage']:
+ raise device_errors.CommandFailedError('$EXTERNAL_STORAGE is not set',
+ str(self))
+ return self._cache['external_storage']
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def GetApplicationPaths(self, package, timeout=None, retries=None):
+ """Get the paths of the installed apks on the device for the given package.
+
+ Args:
+ package: Name of the package.
+
+ Returns:
+ List of paths to the apks on the device for the given package.
+ """
+ return self._GetApplicationPathsInternal(package)
+
+ def _GetApplicationPathsInternal(self, package, skip_cache=False):
+ cached_result = self._cache['package_apk_paths'].get(package)
+ if cached_result is not None and not skip_cache:
+ if package in self._cache['package_apk_paths_to_verify']:
+ self._cache['package_apk_paths_to_verify'].remove(package)
+ # Don't verify an app that is not thought to be installed. We are
+ # concerned only with apps we think are installed having been
+ # uninstalled manually.
+ if cached_result and not self.PathExists(cached_result):
+ cached_result = None
+ self._cache['package_apk_checksums'].pop(package, 0)
+ if cached_result is not None:
+ return list(cached_result)
+ # 'pm path' is liable to incorrectly exit with a nonzero number starting
+ # in Lollipop.
+ # TODO(jbudorick): Check if this is fixed as new Android versions are
+ # released to put an upper bound on this.
+ should_check_return = (self.build_version_sdk < version_codes.LOLLIPOP)
+ output = self.RunShellCommand(
+ ['pm', 'path', package], check_return=should_check_return)
+ apks = []
+ for line in output:
+ if not line.startswith('package:'):
+ continue
+ apks.append(line[len('package:'):])
+ if not apks and output:
+ raise device_errors.CommandFailedError(
+ 'pm path returned: %r' % '\n'.join(output), str(self))
+ self._cache['package_apk_paths'][package] = list(apks)
+ return apks
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def GetApplicationVersion(self, package, timeout=None, retries=None):
+ """Get the version name of a package installed on the device.
+
+ Args:
+ package: Name of the package.
+
+ Returns:
+ A string with the version name or None if the package is not found
+ on the device.
+ """
+ output = self.RunShellCommand(
+ ['dumpsys', 'package', package], check_return=True)
+ if not output:
+ return None
+ for line in output:
+ line = line.strip()
+ if line.startswith('versionName='):
+ return line[len('versionName='):]
+ raise device_errors.CommandFailedError(
+ 'Version name for %s not found on dumpsys output' % package, str(self))
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def GetApplicationDataDirectory(self, package, timeout=None, retries=None):
+ """Get the data directory on the device for the given package.
+
+ Args:
+ package: Name of the package.
+
+ Returns:
+ The package's data directory.
+ Raises:
+ CommandFailedError if the package's data directory can't be found,
+ whether because it's not installed or otherwise.
+ """
+ output = self._RunPipedShellCommand(
+ 'pm dump %s | grep dataDir=' % cmd_helper.SingleQuote(package))
+ for line in output:
+ _, _, dataDir = line.partition('dataDir=')
+ if dataDir:
+ return dataDir
+ raise device_errors.CommandFailedError(
+ 'Could not find data directory for %s', package)
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def WaitUntilFullyBooted(self, wifi=False, timeout=None, retries=None):
+ """Wait for the device to fully boot.
+
+ This means waiting for the device to boot, the package manager to be
+ available, and the SD card to be ready. It can optionally mean waiting
+ for wifi to come up, too.
+
+ Args:
+ wifi: A boolean indicating if we should wait for wifi to come up or not.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandFailedError on failure.
+ CommandTimeoutError if one of the component waits times out.
+ DeviceUnreachableError if the device becomes unresponsive.
+ """
+ def sd_card_ready():
+ try:
+ self.RunShellCommand(['test', '-d', self.GetExternalStoragePath()],
+ check_return=True)
+ return True
+ except device_errors.AdbCommandFailedError:
+ return False
+
+ def pm_ready():
+ try:
+ return self._GetApplicationPathsInternal('android', skip_cache=True)
+ except device_errors.CommandFailedError:
+ return False
+
+ def boot_completed():
+ try:
+ return self.GetProp('sys.boot_completed', cache=False) == '1'
+ except device_errors.CommandFailedError:
+ return False
+
+ def wifi_enabled():
+ return 'Wi-Fi is enabled' in self.RunShellCommand(['dumpsys', 'wifi'],
+ check_return=False)
+
+ self.adb.WaitForDevice()
+ timeout_retry.WaitFor(sd_card_ready)
+ timeout_retry.WaitFor(pm_ready)
+ timeout_retry.WaitFor(boot_completed)
+ if wifi:
+ timeout_retry.WaitFor(wifi_enabled)
+
+ REBOOT_DEFAULT_TIMEOUT = 10 * _DEFAULT_TIMEOUT
+
+ @decorators.WithTimeoutAndRetriesFromInstance(
+ min_default_timeout=REBOOT_DEFAULT_TIMEOUT)
+ def Reboot(self, block=True, wifi=False, timeout=None, retries=None):
+ """Reboot the device.
+
+ Args:
+ block: A boolean indicating if we should wait for the reboot to complete.
+ wifi: A boolean indicating if we should wait for wifi to be enabled after
+ the reboot. The option has no effect unless |block| is also True.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+ """
+ def device_offline():
+ return not self.IsOnline()
+
+ self.adb.Reboot()
+ self._ClearCache()
+ timeout_retry.WaitFor(device_offline, wait_period=1)
+ if block:
+ self.WaitUntilFullyBooted(wifi=wifi)
+
+ INSTALL_DEFAULT_TIMEOUT = 4 * _DEFAULT_TIMEOUT
+
+ @decorators.WithTimeoutAndRetriesFromInstance(
+ min_default_timeout=INSTALL_DEFAULT_TIMEOUT)
+ def Install(self, apk, allow_downgrade=False, reinstall=False,
+ permissions=None, timeout=None, retries=None):
+ """Install an APK.
+
+ Noop if an identical APK is already installed.
+
+ Args:
+ apk: An ApkHelper instance or string containing the path to the APK.
+ allow_downgrade: A boolean indicating if we should allow downgrades.
+ reinstall: A boolean indicating if we should keep any existing app data.
+ permissions: Set of permissions to set. If not set, finds permissions with
+ apk helper. To set no permissions, pass [].
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandFailedError if the installation fails.
+ CommandTimeoutError if the installation times out.
+ DeviceUnreachableError on missing device.
+ """
+ self._InstallInternal(apk, None, allow_downgrade=allow_downgrade,
+ reinstall=reinstall, permissions=permissions)
+
+ @decorators.WithTimeoutAndRetriesFromInstance(
+ min_default_timeout=INSTALL_DEFAULT_TIMEOUT)
+ def InstallSplitApk(self, base_apk, split_apks, allow_downgrade=False,
+ reinstall=False, allow_cached_props=False,
+ permissions=None, timeout=None, retries=None):
+ """Install a split APK.
+
+ Noop if all of the APK splits are already installed.
+
+ Args:
+ base_apk: An ApkHelper instance or string containing the path to the base
+ APK.
+ split_apks: A list of strings of paths of all of the APK splits.
+ allow_downgrade: A boolean indicating if we should allow downgrades.
+ reinstall: A boolean indicating if we should keep any existing app data.
+ allow_cached_props: Whether to use cached values for device properties.
+ permissions: Set of permissions to set. If not set, finds permissions with
+ apk helper. To set no permissions, pass [].
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandFailedError if the installation fails.
+ CommandTimeoutError if the installation times out.
+ DeviceUnreachableError on missing device.
+ DeviceVersionError if device SDK is less than Android L.
+ """
+ self._InstallInternal(base_apk, split_apks, reinstall=reinstall,
+ allow_cached_props=allow_cached_props,
+ permissions=permissions,
+ allow_downgrade=allow_downgrade)
+
+ def _InstallInternal(self, base_apk, split_apks, allow_downgrade=False,
+ reinstall=False, allow_cached_props=False,
+ permissions=None):
+ if split_apks:
+ self._CheckSdkLevel(version_codes.LOLLIPOP)
+
+ base_apk = apk_helper.ToHelper(base_apk)
+
+ all_apks = [base_apk.path]
+ if split_apks:
+ all_apks += split_select.SelectSplits(
+ self, base_apk.path, split_apks, allow_cached_props=allow_cached_props)
+ if len(all_apks) == 1:
+ logger.warning('split-select did not select any from %s', split_apks)
+
+ missing_apks = [apk for apk in all_apks if not os.path.exists(apk)]
+ if missing_apks:
+ raise device_errors.CommandFailedError(
+ 'Attempted to install non-existent apks: %s'
+ % pprint.pformat(missing_apks))
+
+ package_name = base_apk.GetPackageName()
+ device_apk_paths = self._GetApplicationPathsInternal(package_name)
+
+ apks_to_install = None
+ host_checksums = None
+ if not device_apk_paths:
+ apks_to_install = all_apks
+ elif len(device_apk_paths) > 1 and not split_apks:
+ logger.warning(
+ 'Installing non-split APK when split APK was previously installed')
+ apks_to_install = all_apks
+ elif len(device_apk_paths) == 1 and split_apks:
+ logger.warning(
+ 'Installing split APK when non-split APK was previously installed')
+ apks_to_install = all_apks
+ else:
+ try:
+ apks_to_install, host_checksums = (
+ self._ComputeStaleApks(package_name, all_apks))
+ except EnvironmentError as e:
+ logger.warning('Error calculating md5: %s', e)
+ apks_to_install, host_checksums = all_apks, None
+ if apks_to_install and not reinstall:
+ self.Uninstall(package_name)
+ apks_to_install = all_apks
+
+ if apks_to_install:
+ # Assume that we won't know the resulting device state.
+ self._cache['package_apk_paths'].pop(package_name, 0)
+ self._cache['package_apk_checksums'].pop(package_name, 0)
+ if split_apks:
+ partial = package_name if len(apks_to_install) < len(all_apks) else None
+ self.adb.InstallMultiple(
+ apks_to_install, partial=partial, reinstall=reinstall,
+ allow_downgrade=allow_downgrade)
+ else:
+ self.adb.Install(
+ base_apk.path, reinstall=reinstall, allow_downgrade=allow_downgrade)
+ if (permissions is None
+ and self.build_version_sdk >= version_codes.MARSHMALLOW):
+ permissions = base_apk.GetPermissions()
+ self.GrantPermissions(package_name, permissions)
+ # Upon success, we know the device checksums, but not their paths.
+ if host_checksums is not None:
+ self._cache['package_apk_checksums'][package_name] = host_checksums
+ else:
+ # Running adb install terminates running instances of the app, so to be
+ # consistent, we explicitly terminate it when skipping the install.
+ self.ForceStop(package_name)
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def Uninstall(self, package_name, keep_data=False, timeout=None,
+ retries=None):
+ """Remove the app |package_name| from the device.
+
+ This is a no-op if the app is not already installed.
+
+ Args:
+ package_name: The package to uninstall.
+ keep_data: (optional) Whether to keep the data and cache directories.
+ timeout: Timeout in seconds.
+ retries: Number of retries.
+
+ Raises:
+ CommandFailedError if the uninstallation fails.
+ CommandTimeoutError if the uninstallation times out.
+ DeviceUnreachableError on missing device.
+ """
+ installed = self._GetApplicationPathsInternal(package_name)
+ if not installed:
+ return
+ try:
+ self.adb.Uninstall(package_name, keep_data)
+ self._cache['package_apk_paths'][package_name] = []
+ self._cache['package_apk_checksums'][package_name] = set()
+ except:
+ # Clear cache since we can't be sure of the state.
+ self._cache['package_apk_paths'].pop(package_name, 0)
+ self._cache['package_apk_checksums'].pop(package_name, 0)
+ raise
+
+ def _CheckSdkLevel(self, required_sdk_level):
+ """Raises an exception if the device does not have the required SDK level.
+ """
+ if self.build_version_sdk < required_sdk_level:
+ raise device_errors.DeviceVersionError(
+ ('Requires SDK level %s, device is SDK level %s' %
+ (required_sdk_level, self.build_version_sdk)),
+ device_serial=self.serial)
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def RunShellCommand(self, cmd, shell=False, check_return=False, cwd=None,
+ env=None, run_as=None, as_root=False, single_line=False,
+ large_output=False, raw_output=False, timeout=None,
+ retries=None):
+ """Run an ADB shell command.
+
+ The command to run |cmd| should be a sequence of program arguments
+ (preferred) or a single string with a shell script to run.
+
+ When |cmd| is a sequence, it is assumed to contain the name of the command
+ to run followed by its arguments. In this case, arguments are passed to the
+ command exactly as given, preventing any further processing by the shell.
+ This allows callers to easily pass arguments with spaces or special
+ characters without having to worry about quoting rules. Whenever possible,
+ it is recomended to pass |cmd| as a sequence.
+
+ When |cmd| is passed as a single string, |shell| should be set to True.
+ The command will be interpreted and run by the shell on the device,
+ allowing the use of shell features such as pipes, wildcards, or variables.
+ Failing to set shell=True will issue a warning, but this will be changed
+ to a hard failure in the future (see: catapult:#3242).
+
+ This behaviour is consistent with that of command runners in cmd_helper as
+ well as Python's own subprocess.Popen.
+
+ TODO(perezju) Change the default of |check_return| to True when callers
+ have switched to the new behaviour.
+
+ Args:
+ cmd: A sequence containing the command to run and its arguments, or a
+ string with a shell script to run (should also set shell=True).
+ shell: A boolean indicating whether shell features may be used in |cmd|.
+ check_return: A boolean indicating whether or not the return code should
+ be checked.
+ cwd: The device directory in which the command should be run.
+ env: The environment variables with which the command should be run.
+ run_as: A string containing the package as which the command should be
+ run.
+ as_root: A boolean indicating whether the shell command should be run
+ with root privileges.
+ single_line: A boolean indicating if only a single line of output is
+ expected.
+ large_output: Uses a work-around for large shell command output. Without
+ this large output will be truncated.
+ raw_output: Whether to only return the raw output
+ (no splitting into lines).
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ If single_line is False, the output of the command as a list of lines,
+ otherwise, a string with the unique line of output emmited by the command
+ (with the optional newline at the end stripped).
+
+ Raises:
+ AdbCommandFailedError if check_return is True and the exit code of
+ the command run on the device is non-zero.
+ CommandFailedError if single_line is True but the output contains two or
+ more lines.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+ """
+ def env_quote(key, value):
+ if not DeviceUtils._VALID_SHELL_VARIABLE.match(key):
+ raise KeyError('Invalid shell variable name %r' % key)
+ # using double quotes here to allow interpolation of shell variables
+ return '%s=%s' % (key, cmd_helper.DoubleQuote(value))
+
+ def run(cmd):
+ return self.adb.Shell(cmd)
+
+ def handle_check_return(cmd):
+ try:
+ return run(cmd)
+ except device_errors.AdbCommandFailedError as exc:
+ if check_return:
+ raise
+ else:
+ return exc.output
+
+ def handle_large_command(cmd):
+ if len(cmd) < self._MAX_ADB_COMMAND_LENGTH:
+ return handle_check_return(cmd)
+ else:
+ with device_temp_file.DeviceTempFile(self.adb, suffix='.sh') as script:
+ self._WriteFileWithPush(script.name, cmd)
+ logger.info('Large shell command will be run from file: %s ...',
+ cmd[:self._MAX_ADB_COMMAND_LENGTH])
+ return handle_check_return('sh %s' % script.name_quoted)
+
+ def handle_large_output(cmd, large_output_mode):
+ if large_output_mode:
+ with device_temp_file.DeviceTempFile(self.adb) as large_output_file:
+ cmd = '( %s )>%s' % (cmd, large_output_file.name)
+ logger.debug('Large output mode enabled. Will write output to '
+ 'device and read results from file.')
+ handle_large_command(cmd)
+ return self.ReadFile(large_output_file.name, force_pull=True)
+ else:
+ try:
+ return handle_large_command(cmd)
+ except device_errors.AdbCommandFailedError as exc:
+ if exc.status is None:
+ logger.error(_FormatPartialOutputError(exc.output))
+ logger.warning('Attempting to run in large_output mode.')
+ logger.warning('Use RunShellCommand(..., large_output=True) for '
+ 'shell commands that expect a lot of output.')
+ return handle_large_output(cmd, True)
+ else:
+ raise
+
+ if isinstance(cmd, basestring):
+ if not shell:
+ logging.warning(
+ 'The command to run should preferably be passed as a sequence of'
+ ' args. If shell features are needed (pipes, wildcards, variables)'
+ ' clients should explicitly set shell=True.')
+ else:
+ cmd = ' '.join(cmd_helper.SingleQuote(s) for s in cmd)
+ if env:
+ env = ' '.join(env_quote(k, v) for k, v in env.iteritems())
+ cmd = '%s %s' % (env, cmd)
+ if cwd:
+ cmd = 'cd %s && %s' % (cmd_helper.SingleQuote(cwd), cmd)
+ if run_as:
+ cmd = 'run-as %s sh -c %s' % (cmd_helper.SingleQuote(run_as),
+ cmd_helper.SingleQuote(cmd))
+ if as_root and self.NeedsSU():
+ # "su -c sh -c" allows using shell features in |cmd|
+ cmd = self._Su('sh -c %s' % cmd_helper.SingleQuote(cmd))
+
+ output = handle_large_output(cmd, large_output)
+
+ if raw_output:
+ return output
+
+ output = output.splitlines()
+ if single_line:
+ if not output:
+ return ''
+ elif len(output) == 1:
+ return output[0]
+ else:
+ msg = 'one line of output was expected, but got: %s'
+ raise device_errors.CommandFailedError(msg % output, str(self))
+ else:
+ return output
+
+ def _RunPipedShellCommand(self, script, **kwargs):
+ PIPESTATUS_LEADER = 'PIPESTATUS: '
+
+ script += '; echo "%s${PIPESTATUS[@]}"' % PIPESTATUS_LEADER
+ kwargs.update(shell=True, check_return=True)
+ output = self.RunShellCommand(script, **kwargs)
+ pipestatus_line = output[-1]
+
+ if not pipestatus_line.startswith(PIPESTATUS_LEADER):
+ logger.error('Pipe exit statuses of shell script missing.')
+ raise device_errors.AdbShellCommandFailedError(
+ script, output, status=None,
+ device_serial=self.serial)
+
+ output = output[:-1]
+ statuses = [
+ int(s) for s in pipestatus_line[len(PIPESTATUS_LEADER):].split()]
+ if any(statuses):
+ raise device_errors.AdbShellCommandFailedError(
+ script, output, status=statuses,
+ device_serial=self.serial)
+ return output
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def KillAll(self, process_name, exact=False, signum=device_signal.SIGKILL,
+ as_root=False, blocking=False, quiet=False,
+ timeout=None, retries=None):
+ """Kill all processes with the given name on the device.
+
+ Args:
+ process_name: A string containing the name of the process to kill.
+ exact: A boolean indicating whether to kill all processes matching
+ the string |process_name| exactly, or all of those which contain
+ |process_name| as a substring. Defaults to False.
+ signum: An integer containing the signal number to send to kill. Defaults
+ to SIGKILL (9).
+ as_root: A boolean indicating whether the kill should be executed with
+ root privileges.
+ blocking: A boolean indicating whether we should wait until all processes
+ with the given |process_name| are dead.
+ quiet: A boolean indicating whether to ignore the fact that no processes
+ to kill were found.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ The number of processes attempted to kill.
+
+ Raises:
+ CommandFailedError if no process was killed and |quiet| is False.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+ """
+ procs_pids = self.GetPids(process_name)
+ if exact:
+ procs_pids = {process_name: procs_pids.get(process_name, [])}
+ pids = set(itertools.chain(*procs_pids.values()))
+ if not pids:
+ if quiet:
+ return 0
+ else:
+ raise device_errors.CommandFailedError(
+ 'No process "%s"' % process_name, str(self))
+
+ logger.info(
+ 'KillAll(%r, ...) attempting to kill the following:', process_name)
+ for name, ids in procs_pids.iteritems():
+ for i in ids:
+ logger.info(' %05s %s', str(i), name)
+
+ cmd = ['kill', '-%d' % signum] + sorted(pids)
+ self.RunShellCommand(cmd, as_root=as_root, check_return=True)
+
+ def all_pids_killed():
+ procs_pids_remain = self.GetPids(process_name)
+ return not pids.intersection(itertools.chain(*procs_pids_remain.values()))
+
+ if blocking:
+ timeout_retry.WaitFor(all_pids_killed, wait_period=0.1)
+
+ return len(pids)
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def StartActivity(self, intent_obj, blocking=False, trace_file_name=None,
+ force_stop=False, timeout=None, retries=None):
+ """Start package's activity on the device.
+
+ Args:
+ intent_obj: An Intent object to send.
+ blocking: A boolean indicating whether we should wait for the activity to
+ finish launching.
+ trace_file_name: If present, a string that both indicates that we want to
+ profile the activity and contains the path to which the
+ trace should be saved.
+ force_stop: A boolean indicating whether we should stop the activity
+ before starting it.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandFailedError if the activity could not be started.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+ """
+ cmd = ['am', 'start']
+ if blocking:
+ cmd.append('-W')
+ if trace_file_name:
+ cmd.extend(['--start-profiler', trace_file_name])
+ if force_stop:
+ cmd.append('-S')
+ cmd.extend(intent_obj.am_args)
+ for line in self.RunShellCommand(cmd, check_return=True):
+ if line.startswith('Error:'):
+ raise device_errors.CommandFailedError(line, str(self))
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def StartInstrumentation(self, component, finish=True, raw=False,
+ extras=None, timeout=None, retries=None):
+ if extras is None:
+ extras = {}
+
+ cmd = ['am', 'instrument']
+ if finish:
+ cmd.append('-w')
+ if raw:
+ cmd.append('-r')
+ for k, v in extras.iteritems():
+ cmd.extend(['-e', str(k), str(v)])
+ cmd.append(component)
+
+ # Store the package name in a shell variable to help the command stay under
+ # the _MAX_ADB_COMMAND_LENGTH limit.
+ package = component.split('/')[0]
+ shell_snippet = 'p=%s;%s' % (package,
+ cmd_helper.ShrinkToSnippet(cmd, 'p', package))
+ return self.RunShellCommand(shell_snippet, shell=True, check_return=True,
+ large_output=True)
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def BroadcastIntent(self, intent_obj, timeout=None, retries=None):
+ """Send a broadcast intent.
+
+ Args:
+ intent: An Intent to broadcast.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+ """
+ cmd = ['am', 'broadcast'] + intent_obj.am_args
+ self.RunShellCommand(cmd, check_return=True)
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def GoHome(self, timeout=None, retries=None):
+ """Return to the home screen and obtain launcher focus.
+
+ This command launches the home screen and attempts to obtain
+ launcher focus until the timeout is reached.
+
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+ """
+ def is_launcher_focused():
+ output = self.RunShellCommand(['dumpsys', 'window', 'windows'],
+ check_return=True, large_output=True)
+ return any(self._LAUNCHER_FOCUSED_RE.match(l) for l in output)
+
+ def dismiss_popups():
+ # There is a dialog present; attempt to get rid of it.
+ # Not all dialogs can be dismissed with back.
+ self.SendKeyEvent(keyevent.KEYCODE_ENTER)
+ self.SendKeyEvent(keyevent.KEYCODE_BACK)
+ return is_launcher_focused()
+
+ # If Home is already focused, return early to avoid unnecessary work.
+ if is_launcher_focused():
+ return
+
+ self.StartActivity(
+ intent.Intent(action='android.intent.action.MAIN',
+ category='android.intent.category.HOME'),
+ blocking=True)
+
+ if not is_launcher_focused():
+ timeout_retry.WaitFor(dismiss_popups, wait_period=1)
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def ForceStop(self, package, timeout=None, retries=None):
+ """Close the application.
+
+ Args:
+ package: A string containing the name of the package to stop.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+ """
+ if self.GetPids(package):
+ self.RunShellCommand(['am', 'force-stop', package], check_return=True)
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def ClearApplicationState(
+ self, package, permissions=None, timeout=None, retries=None):
+ """Clear all state for the given package.
+
+ Args:
+ package: A string containing the name of the package to stop.
+ permissions: List of permissions to set after clearing data.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+ """
+ # Check that the package exists before clearing it for android builds below
+ # JB MR2. Necessary because calling pm clear on a package that doesn't exist
+ # may never return.
+ if ((self.build_version_sdk >= version_codes.JELLY_BEAN_MR2)
+ or self._GetApplicationPathsInternal(package)):
+ self.RunShellCommand(['pm', 'clear', package], check_return=True)
+ self.GrantPermissions(package, permissions)
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def SendKeyEvent(self, keycode, timeout=None, retries=None):
+ """Sends a keycode to the device.
+
+ See the devil.android.sdk.keyevent module for suitable keycode values.
+
+ Args:
+ keycode: A integer keycode to send to the device.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+ """
+ self.RunShellCommand(['input', 'keyevent', format(keycode, 'd')],
+ check_return=True)
+
+ PUSH_CHANGED_FILES_DEFAULT_TIMEOUT = 10 * _DEFAULT_TIMEOUT
+
+ @decorators.WithTimeoutAndRetriesFromInstance(
+ min_default_timeout=PUSH_CHANGED_FILES_DEFAULT_TIMEOUT)
+ def PushChangedFiles(self, host_device_tuples, timeout=None,
+ retries=None, delete_device_stale=False):
+ """Push files to the device, skipping files that don't need updating.
+
+ When a directory is pushed, it is traversed recursively on the host and
+ all files in it are pushed to the device as needed.
+ Additionally, if delete_device_stale option is True,
+ files that exist on the device but don't exist on the host are deleted.
+
+ Args:
+ host_device_tuples: A list of (host_path, device_path) tuples, where
+ |host_path| is an absolute path of a file or directory on the host
+ that should be minimially pushed to the device, and |device_path| is
+ an absolute path of the destination on the device.
+ timeout: timeout in seconds
+ retries: number of retries
+ delete_device_stale: option to delete stale files on device
+
+ Raises:
+ CommandFailedError on failure.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+ """
+
+ all_changed_files = []
+ all_stale_files = []
+ missing_dirs = []
+ cache_commit_funcs = []
+ for h, d in host_device_tuples:
+ assert os.path.isabs(h) and posixpath.isabs(d)
+ h = os.path.realpath(h)
+ changed_files, up_to_date_files, stale_files, cache_commit_func = (
+ self._GetChangedAndStaleFiles(h, d, delete_device_stale))
+ all_changed_files += changed_files
+ all_stale_files += stale_files
+ cache_commit_funcs.append(cache_commit_func)
+ if changed_files and not up_to_date_files and not stale_files:
+ if os.path.isdir(h):
+ missing_dirs.append(d)
+ else:
+ missing_dirs.append(posixpath.dirname(d))
+
+ if delete_device_stale and all_stale_files:
+ self.RunShellCommand(['rm', '-f'] + all_stale_files, check_return=True)
+
+ if all_changed_files:
+ if missing_dirs:
+ self.RunShellCommand(['mkdir', '-p'] + missing_dirs, check_return=True)
+ self._PushFilesImpl(host_device_tuples, all_changed_files)
+ for func in cache_commit_funcs:
+ func()
+
+ def _GetChangedAndStaleFiles(self, host_path, device_path, track_stale=False):
+ """Get files to push and delete
+
+ Args:
+ host_path: an absolute path of a file or directory on the host
+ device_path: an absolute path of a file or directory on the device
+ track_stale: whether to bother looking for stale files (slower)
+
+ Returns:
+ a four-element tuple
+ 1st element: a list of (host_files_path, device_files_path) tuples to push
+ 2nd element: a list of host_files_path that are up-to-date
+ 3rd element: a list of stale files under device_path, or [] when
+ track_stale == False
+ 4th element: a cache commit function.
+ """
+ try:
+ # Length calculations below assume no trailing /.
+ host_path = host_path.rstrip('/')
+ device_path = device_path.rstrip('/')
+
+ specific_device_paths = [device_path]
+ ignore_other_files = not track_stale and os.path.isdir(host_path)
+ if ignore_other_files:
+ specific_device_paths = []
+ for root, _, filenames in os.walk(host_path):
+ relative_dir = root[len(host_path) + 1:]
+ specific_device_paths.extend(
+ posixpath.join(device_path, relative_dir, f) for f in filenames)
+
+ def calculate_host_checksums():
+ return md5sum.CalculateHostMd5Sums([host_path])
+
+ def calculate_device_checksums():
+ if self._enable_device_files_cache:
+ cache_entry = self._cache['device_path_checksums'].get(device_path)
+ if cache_entry and cache_entry[0] == ignore_other_files:
+ return dict(cache_entry[1])
+
+ sums = md5sum.CalculateDeviceMd5Sums(specific_device_paths, self)
+
+ cache_entry = [ignore_other_files, sums]
+ self._cache['device_path_checksums'][device_path] = cache_entry
+ return dict(sums)
+
+ host_checksums, device_checksums = reraiser_thread.RunAsync((
+ calculate_host_checksums,
+ calculate_device_checksums))
+ except EnvironmentError as e:
+ logger.warning('Error calculating md5: %s', e)
+ return ([(host_path, device_path)], [], [], lambda: 0)
+
+ to_push = []
+ up_to_date = []
+ to_delete = []
+ if os.path.isfile(host_path):
+ host_checksum = host_checksums.get(host_path)
+ device_checksum = device_checksums.get(device_path)
+ if host_checksum == device_checksum:
+ up_to_date.append(host_path)
+ else:
+ to_push.append((host_path, device_path))
+ else:
+ for host_abs_path, host_checksum in host_checksums.iteritems():
+ device_abs_path = posixpath.join(
+ device_path, os.path.relpath(host_abs_path, host_path))
+ device_checksum = device_checksums.pop(device_abs_path, None)
+ if device_checksum == host_checksum:
+ up_to_date.append(host_abs_path)
+ else:
+ to_push.append((host_abs_path, device_abs_path))
+ to_delete = device_checksums.keys()
+
+ def cache_commit_func():
+ new_sums = {posixpath.join(device_path, path[len(host_path) + 1:]): val
+ for path, val in host_checksums.iteritems()}
+ cache_entry = [ignore_other_files, new_sums]
+ self._cache['device_path_checksums'][device_path] = cache_entry
+
+ return (to_push, up_to_date, to_delete, cache_commit_func)
+
+ def _ComputeDeviceChecksumsForApks(self, package_name):
+ ret = self._cache['package_apk_checksums'].get(package_name)
+ if ret is None:
+ device_paths = self._GetApplicationPathsInternal(package_name)
+ file_to_checksums = md5sum.CalculateDeviceMd5Sums(device_paths, self)
+ ret = set(file_to_checksums.values())
+ self._cache['package_apk_checksums'][package_name] = ret
+ return ret
+
+ def _ComputeStaleApks(self, package_name, host_apk_paths):
+ def calculate_host_checksums():
+ return md5sum.CalculateHostMd5Sums(host_apk_paths)
+
+ def calculate_device_checksums():
+ return self._ComputeDeviceChecksumsForApks(package_name)
+
+ host_checksums, device_checksums = reraiser_thread.RunAsync((
+ calculate_host_checksums, calculate_device_checksums))
+ stale_apks = [k for (k, v) in host_checksums.iteritems()
+ if v not in device_checksums]
+ return stale_apks, set(host_checksums.values())
+
+ def _PushFilesImpl(self, host_device_tuples, files):
+ if not files:
+ return
+
+ size = sum(host_utils.GetRecursiveDiskUsage(h) for h, _ in files)
+ file_count = len(files)
+ dir_size = sum(host_utils.GetRecursiveDiskUsage(h)
+ for h, _ in host_device_tuples)
+ dir_file_count = 0
+ for h, _ in host_device_tuples:
+ if os.path.isdir(h):
+ dir_file_count += sum(len(f) for _r, _d, f in os.walk(h))
+ else:
+ dir_file_count += 1
+
+ push_duration = self._ApproximateDuration(
+ file_count, file_count, size, False)
+ dir_push_duration = self._ApproximateDuration(
+ len(host_device_tuples), dir_file_count, dir_size, False)
+ zip_duration = self._ApproximateDuration(1, 1, size, True)
+
+ if (dir_push_duration < push_duration and dir_push_duration < zip_duration
+ # TODO(jbudorick): Resume directory pushing once clients have switched
+ # to 1.0.36-compatible syntax.
+ and False):
+ self._PushChangedFilesIndividually(host_device_tuples)
+ elif push_duration < zip_duration:
+ self._PushChangedFilesIndividually(files)
+ elif self._commands_installed is False:
+ # Already tried and failed to install unzip command.
+ self._PushChangedFilesIndividually(files)
+ elif not self._PushChangedFilesZipped(
+ files, [d for _, d in host_device_tuples]):
+ self._PushChangedFilesIndividually(files)
+
+ def _MaybeInstallCommands(self):
+ if self._commands_installed is None:
+ try:
+ if not install_commands.Installed(self):
+ install_commands.InstallCommands(self)
+ self._commands_installed = True
+ except device_errors.CommandFailedError as e:
+ logger.warning('unzip not available: %s', str(e))
+ self._commands_installed = False
+ return self._commands_installed
+
+ @staticmethod
+ def _ApproximateDuration(adb_calls, file_count, byte_count, is_zipping):
+ # We approximate the time to push a set of files to a device as:
+ # t = c1 * a + c2 * f + c3 + b / c4 + b / (c5 * c6), where
+ # t: total time (sec)
+ # c1: adb call time delay (sec)
+ # a: number of times adb is called (unitless)
+ # c2: push time delay (sec)
+ # f: number of files pushed via adb (unitless)
+ # c3: zip time delay (sec)
+ # c4: zip rate (bytes/sec)
+ # b: total number of bytes (bytes)
+ # c5: transfer rate (bytes/sec)
+ # c6: compression ratio (unitless)
+
+ # All of these are approximations.
+ ADB_CALL_PENALTY = 0.1 # seconds
+ ADB_PUSH_PENALTY = 0.01 # seconds
+ ZIP_PENALTY = 2.0 # seconds
+ ZIP_RATE = 10000000.0 # bytes / second
+ TRANSFER_RATE = 2000000.0 # bytes / second
+ COMPRESSION_RATIO = 2.0 # unitless
+
+ adb_call_time = ADB_CALL_PENALTY * adb_calls
+ adb_push_setup_time = ADB_PUSH_PENALTY * file_count
+ if is_zipping:
+ zip_time = ZIP_PENALTY + byte_count / ZIP_RATE
+ transfer_time = byte_count / (TRANSFER_RATE * COMPRESSION_RATIO)
+ else:
+ zip_time = 0
+ transfer_time = byte_count / TRANSFER_RATE
+ return adb_call_time + adb_push_setup_time + zip_time + transfer_time
+
+ def _PushChangedFilesIndividually(self, files):
+ for h, d in files:
+ self.adb.Push(h, d)
+
+ def _PushChangedFilesZipped(self, files, dirs):
+ with tempfile.NamedTemporaryFile(suffix='.zip') as zip_file:
+ zip_proc = multiprocessing.Process(
+ target=DeviceUtils._CreateDeviceZip,
+ args=(zip_file.name, files))
+ zip_proc.start()
+ try:
+ # While it's zipping, ensure the unzip command exists on the device.
+ if not self._MaybeInstallCommands():
+ zip_proc.terminate()
+ return False
+
+ # Warm up NeedsSU cache while we're still zipping.
+ self.NeedsSU()
+ with device_temp_file.DeviceTempFile(
+ self.adb, suffix='.zip') as device_temp:
+ zip_proc.join()
+ self.adb.Push(zip_file.name, device_temp.name)
+ quoted_dirs = ' '.join(cmd_helper.SingleQuote(d) for d in dirs)
+ self.RunShellCommand(
+ 'unzip %s&&chmod -R 777 %s' % (device_temp.name, quoted_dirs),
+ shell=True, as_root=True,
+ env={'PATH': '%s:$PATH' % install_commands.BIN_DIR},
+ check_return=True)
+ finally:
+ if zip_proc.is_alive():
+ zip_proc.terminate()
+ return True
+
+ @staticmethod
+ def _CreateDeviceZip(zip_path, host_device_tuples):
+ with zipfile.ZipFile(zip_path, 'w') as zip_file:
+ for host_path, device_path in host_device_tuples:
+ zip_utils.WriteToZipFile(zip_file, host_path, device_path)
+
+ # TODO(nednguyen): remove this and migrate the callsite to PathExists().
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def FileExists(self, device_path, timeout=None, retries=None):
+ """Checks whether the given file exists on the device.
+
+ Arguments are the same as PathExists.
+ """
+ return self.PathExists(device_path, timeout=timeout, retries=retries)
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def PathExists(self, device_paths, as_root=False, timeout=None, retries=None):
+ """Checks whether the given path(s) exists on the device.
+
+ Args:
+ device_path: A string containing the absolute path to the file on the
+ device, or an iterable of paths to check.
+ as_root: Whether root permissions should be use to check for the existence
+ of the given path(s).
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ True if the all given paths exist on the device, False otherwise.
+
+ Raises:
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+ """
+ paths = device_paths
+ if isinstance(paths, basestring):
+ paths = (paths,)
+ if not paths:
+ return True
+ cmd = ['test', '-e', paths[0]]
+ for p in paths[1:]:
+ cmd.extend(['-a', '-e', p])
+ try:
+ self.RunShellCommand(cmd, as_root=as_root, check_return=True,
+ timeout=timeout, retries=retries)
+ return True
+ except device_errors.CommandFailedError:
+ return False
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def RemovePath(self, device_path, force=False, recursive=False,
+ as_root=False, timeout=None, retries=None):
+ """Removes the given path(s) from the device.
+
+ Args:
+ device_path: A string containing the absolute path to the file on the
+ device, or an iterable of paths to check.
+ force: Whether to remove the path(s) with force (-f).
+ recursive: Whether to remove any directories in the path(s) recursively.
+ as_root: Whether root permissions should be use to remove the given
+ path(s).
+ timeout: timeout in seconds
+ retries: number of retries
+ """
+ args = ['rm']
+ if force:
+ args.append('-f')
+ if recursive:
+ args.append('-r')
+ if isinstance(device_path, basestring):
+ args.append(device_path)
+ else:
+ args.extend(device_path)
+ self.RunShellCommand(args, as_root=as_root, check_return=True)
+
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def PullFile(self, device_path, host_path, timeout=None, retries=None):
+ """Pull a file from the device.
+
+ Args:
+ device_path: A string containing the absolute path of the file to pull
+ from the device.
+ host_path: A string containing the absolute path of the destination on
+ the host.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandFailedError on failure.
+ CommandTimeoutError on timeout.
+ """
+ # Create the base dir if it doesn't exist already
+ dirname = os.path.dirname(host_path)
+ if dirname and not os.path.exists(dirname):
+ os.makedirs(dirname)
+ self.adb.Pull(device_path, host_path)
+
+ def _ReadFileWithPull(self, device_path):
+ try:
+ d = tempfile.mkdtemp()
+ host_temp_path = os.path.join(d, 'tmp_ReadFileWithPull')
+ self.adb.Pull(device_path, host_temp_path)
+ with open(host_temp_path, 'r') as host_temp:
+ return host_temp.read()
+ finally:
+ if os.path.exists(d):
+ shutil.rmtree(d)
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def ReadFile(self, device_path, as_root=False, force_pull=False,
+ timeout=None, retries=None):
+ """Reads the contents of a file from the device.
+
+ Args:
+ device_path: A string containing the absolute path of the file to read
+ from the device.
+ as_root: A boolean indicating whether the read should be executed with
+ root privileges.
+ force_pull: A boolean indicating whether to force the operation to be
+ performed by pulling a file from the device. The default is, when the
+ contents are short, to retrieve the contents using cat instead.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ The contents of |device_path| as a string. Contents are intepreted using
+ universal newlines, so the caller will see them encoded as '\n'. Also,
+ all lines will be terminated.
+
+ Raises:
+ AdbCommandFailedError if the file can't be read.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+ """
+ def get_size(path):
+ return self.FileSize(path, as_root=as_root)
+
+ if (not force_pull
+ and 0 < get_size(device_path) <= self._MAX_ADB_OUTPUT_LENGTH):
+ return _JoinLines(self.RunShellCommand(
+ ['cat', device_path], as_root=as_root, check_return=True))
+ elif as_root and self.NeedsSU():
+ with device_temp_file.DeviceTempFile(self.adb) as device_temp:
+ cmd = 'SRC=%s DEST=%s;cp "$SRC" "$DEST" && chmod 666 "$DEST"' % (
+ cmd_helper.SingleQuote(device_path),
+ cmd_helper.SingleQuote(device_temp.name))
+ self.RunShellCommand(cmd, shell=True, as_root=True, check_return=True)
+ return self._ReadFileWithPull(device_temp.name)
+ else:
+ return self._ReadFileWithPull(device_path)
+
+ def _WriteFileWithPush(self, device_path, contents):
+ with tempfile.NamedTemporaryFile() as host_temp:
+ host_temp.write(contents)
+ host_temp.flush()
+ self.adb.Push(host_temp.name, device_path)
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def WriteFile(self, device_path, contents, as_root=False, force_push=False,
+ timeout=None, retries=None):
+ """Writes |contents| to a file on the device.
+
+ Args:
+ device_path: A string containing the absolute path to the file to write
+ on the device.
+ contents: A string containing the data to write to the device.
+ as_root: A boolean indicating whether the write should be executed with
+ root privileges (if available).
+ force_push: A boolean indicating whether to force the operation to be
+ performed by pushing a file to the device. The default is, when the
+ contents are short, to pass the contents using a shell script instead.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandFailedError if the file could not be written on the device.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+ """
+ if not force_push and len(contents) < self._MAX_ADB_COMMAND_LENGTH:
+ # If the contents are small, for efficieny we write the contents with
+ # a shell command rather than pushing a file.
+ cmd = 'echo -n %s > %s' % (cmd_helper.SingleQuote(contents),
+ cmd_helper.SingleQuote(device_path))
+ self.RunShellCommand(cmd, shell=True, as_root=as_root, check_return=True)
+ elif as_root and self.NeedsSU():
+ # Adb does not allow to "push with su", so we first push to a temp file
+ # on a safe location, and then copy it to the desired location with su.
+ with device_temp_file.DeviceTempFile(self.adb) as device_temp:
+ self._WriteFileWithPush(device_temp.name, contents)
+ # Here we need 'cp' rather than 'mv' because the temp and
+ # destination files might be on different file systems (e.g.
+ # on internal storage and an external sd card).
+ self.RunShellCommand(['cp', device_temp.name, device_path],
+ as_root=True, check_return=True)
+ else:
+ # If root is not needed, we can push directly to the desired location.
+ self._WriteFileWithPush(device_path, contents)
+
+ def _ParseLongLsOutput(self, device_path, as_root=False, **kwargs):
+ """Run and scrape the output of 'ls -a -l' on a device directory."""
+ device_path = posixpath.join(device_path, '') # Force trailing '/'.
+ output = self.RunShellCommand(
+ ['ls', '-a', '-l', device_path], as_root=as_root,
+ check_return=True, env={'TZ': 'utc'}, **kwargs)
+ if output and output[0].startswith('total '):
+ output.pop(0) # pylint: disable=maybe-no-member
+
+ entries = []
+ for line in output:
+ m = _LONG_LS_OUTPUT_RE.match(line)
+ if m:
+ if m.group('filename') not in ['.', '..']:
+ entries.append(m.groupdict())
+ else:
+ logger.info('Skipping: %s', line)
+
+ return entries
+
+ def ListDirectory(self, device_path, as_root=False, **kwargs):
+ """List all files on a device directory.
+
+ Mirroring os.listdir (and most client expectations) the resulting list
+ does not include the special entries '.' and '..' even if they are present
+ in the directory.
+
+ Args:
+ device_path: A string containing the path of the directory on the device
+ to list.
+ as_root: A boolean indicating whether the to use root privileges to list
+ the directory contents.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ A list of filenames for all entries contained in the directory.
+
+ Raises:
+ AdbCommandFailedError if |device_path| does not specify a valid and
+ accessible directory in the device.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+ """
+ entries = self._ParseLongLsOutput(device_path, as_root=as_root, **kwargs)
+ return [d['filename'] for d in entries]
+
+ def StatDirectory(self, device_path, as_root=False, **kwargs):
+ """List file and stat info for all entries on a device directory.
+
+ Implementation notes: this is currently implemented by parsing the output
+ of 'ls -a -l' on the device. Whether possible and convenient, we attempt to
+ make parsing strict and return values mirroring those of the standard |os|
+ and |stat| Python modules.
+
+ Mirroring os.listdir (and most client expectations) the resulting list
+ does not include the special entries '.' and '..' even if they are present
+ in the directory.
+
+ Args:
+ device_path: A string containing the path of the directory on the device
+ to list.
+ as_root: A boolean indicating whether the to use root privileges to list
+ the directory contents.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ A list of dictionaries, each containing the following keys:
+ filename: A string with the file name.
+ st_mode: File permissions, use the stat module to interpret these.
+ st_nlink: Number of hard links (may be missing).
+ st_owner: A string with the user name of the owner.
+ st_group: A string with the group name of the owner.
+ st_rdev_pair: Device type as (major, minior) (only if inode device).
+ st_size: Size of file, in bytes (may be missing for non-regular files).
+ st_mtime: Time of most recent modification, in seconds since epoch
+ (although resolution is in minutes).
+ symbolic_link_to: If entry is a symbolic link, path where it points to;
+ missing otherwise.
+
+ Raises:
+ AdbCommandFailedError if |device_path| does not specify a valid and
+ accessible directory in the device.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+ """
+ entries = self._ParseLongLsOutput(device_path, as_root=as_root, **kwargs)
+ for d in entries:
+ for key, value in d.items():
+ if value is None:
+ del d[key] # Remove missing fields.
+ d['st_mode'] = _ParseModeString(d['st_mode'])
+ d['st_mtime'] = calendar.timegm(
+ time.strptime(d['st_mtime'], _LS_DATE_FORMAT))
+ for key in ['st_nlink', 'st_size', 'st_rdev_major', 'st_rdev_minor']:
+ if key in d:
+ d[key] = int(d[key])
+ if 'st_rdev_major' in d and 'st_rdev_minor' in d:
+ d['st_rdev_pair'] = (d.pop('st_rdev_major'), d.pop('st_rdev_minor'))
+ return entries
+
+ def StatPath(self, device_path, as_root=False, **kwargs):
+ """Get the stat attributes of a file or directory on the device.
+
+ Args:
+ device_path: A string containing the path of a file or directory from
+ which to get attributes.
+ as_root: A boolean indicating whether the to use root privileges to
+ access the file information.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ A dictionary with the stat info collected; see StatDirectory for details.
+
+ Raises:
+ CommandFailedError if device_path cannot be found on the device.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+ """
+ dirname, filename = posixpath.split(posixpath.normpath(device_path))
+ for entry in self.StatDirectory(dirname, as_root=as_root, **kwargs):
+ if entry['filename'] == filename:
+ return entry
+ raise device_errors.CommandFailedError(
+ 'Cannot find file or directory: %r' % device_path, str(self))
+
+ def FileSize(self, device_path, as_root=False, **kwargs):
+ """Get the size of a file on the device.
+
+ Note: This is implemented by parsing the output of the 'ls' command on
+ the device. On some Android versions, when passing a directory or special
+ file, the size is *not* reported and this function will throw an exception.
+
+ Args:
+ device_path: A string containing the path of a file on the device.
+ as_root: A boolean indicating whether the to use root privileges to
+ access the file information.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ The size of the file in bytes.
+
+ Raises:
+ CommandFailedError if device_path cannot be found on the device, or
+ its size cannot be determited for some reason.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+ """
+ entry = self.StatPath(device_path, as_root=as_root, **kwargs)
+ try:
+ return entry['st_size']
+ except KeyError:
+ raise device_errors.CommandFailedError(
+ 'Could not determine the size of: %s' % device_path, str(self))
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def SetJavaAsserts(self, enabled, timeout=None, retries=None):
+ """Enables or disables Java asserts.
+
+ Args:
+ enabled: A boolean indicating whether Java asserts should be enabled
+ or disabled.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ True if the device-side property changed and a restart is required as a
+ result, False otherwise.
+
+ Raises:
+ CommandTimeoutError on timeout.
+ """
+ def find_property(lines, property_name):
+ for index, line in enumerate(lines):
+ if line.strip() == '':
+ continue
+ key_value = tuple(s.strip() for s in line.split('=', 1))
+ if len(key_value) != 2:
+ continue
+ key, value = key_value
+ if key == property_name:
+ return index, value
+ return None, ''
+
+ new_value = 'all' if enabled else ''
+
+ # First ensure the desired property is persisted.
+ try:
+ properties = self.ReadFile(self.LOCAL_PROPERTIES_PATH).splitlines()
+ except device_errors.CommandFailedError:
+ properties = []
+ index, value = find_property(properties, self.JAVA_ASSERT_PROPERTY)
+ if new_value != value:
+ if new_value:
+ new_line = '%s=%s' % (self.JAVA_ASSERT_PROPERTY, new_value)
+ if index is None:
+ properties.append(new_line)
+ else:
+ properties[index] = new_line
+ else:
+ assert index is not None # since new_value == '' and new_value != value
+ properties.pop(index)
+ self.WriteFile(self.LOCAL_PROPERTIES_PATH, _JoinLines(properties))
+
+ # Next, check the current runtime value is what we need, and
+ # if not, set it and report that a reboot is required.
+ value = self.GetProp(self.JAVA_ASSERT_PROPERTY)
+ if new_value != value:
+ self.SetProp(self.JAVA_ASSERT_PROPERTY, new_value)
+ return True
+ else:
+ return False
+
+ def GetLanguage(self, cache=False):
+ """Returns the language setting on the device.
+ Args:
+ cache: Whether to use cached properties when available.
+ """
+ return self.GetProp('persist.sys.language', cache=cache)
+
+ def GetCountry(self, cache=False):
+ """Returns the country setting on the device.
+
+ Args:
+ cache: Whether to use cached properties when available.
+ """
+ return self.GetProp('persist.sys.country', cache=cache)
+
+ @property
+ def screen_density(self):
+ """Returns the screen density of the device."""
+ DPI_TO_DENSITY = {
+ 120: 'ldpi',
+ 160: 'mdpi',
+ 240: 'hdpi',
+ 320: 'xhdpi',
+ 480: 'xxhdpi',
+ 640: 'xxxhdpi',
+ }
+ return DPI_TO_DENSITY.get(self.pixel_density, 'tvdpi')
+
+ @property
+ def pixel_density(self):
+ return int(self.GetProp('ro.sf.lcd_density', cache=True))
+
+ @property
+ def build_description(self):
+ """Returns the build description of the system.
+
+ For example:
+ nakasi-user 4.4.4 KTU84P 1227136 release-keys
+ """
+ return self.GetProp('ro.build.description', cache=True)
+
+ @property
+ def build_fingerprint(self):
+ """Returns the build fingerprint of the system.
+
+ For example:
+ google/nakasi/grouper:4.4.4/KTU84P/1227136:user/release-keys
+ """
+ return self.GetProp('ro.build.fingerprint', cache=True)
+
+ @property
+ def build_id(self):
+ """Returns the build ID of the system (e.g. 'KTU84P')."""
+ return self.GetProp('ro.build.id', cache=True)
+
+ @property
+ def build_product(self):
+ """Returns the build product of the system (e.g. 'grouper')."""
+ return self.GetProp('ro.build.product', cache=True)
+
+ @property
+ def build_type(self):
+ """Returns the build type of the system (e.g. 'user')."""
+ return self.GetProp('ro.build.type', cache=True)
+
+ @property
+ def build_version_sdk(self):
+ """Returns the build version sdk of the system as a number (e.g. 19).
+
+ For version code numbers see:
+ http://developer.android.com/reference/android/os/Build.VERSION_CODES.html
+
+ For named constants see devil.android.sdk.version_codes
+
+ Raises:
+ CommandFailedError if the build version sdk is not a number.
+ """
+ value = self.GetProp('ro.build.version.sdk', cache=True)
+ try:
+ return int(value)
+ except ValueError:
+ raise device_errors.CommandFailedError(
+ 'Invalid build version sdk: %r' % value)
+
+ @property
+ def product_cpu_abi(self):
+ """Returns the product cpu abi of the device (e.g. 'armeabi-v7a')."""
+ return self.GetProp('ro.product.cpu.abi', cache=True)
+
+ @property
+ def product_model(self):
+ """Returns the name of the product model (e.g. 'Nexus 7')."""
+ return self.GetProp('ro.product.model', cache=True)
+
+ @property
+ def product_name(self):
+ """Returns the product name of the device (e.g. 'nakasi')."""
+ return self.GetProp('ro.product.name', cache=True)
+
+ @property
+ def product_board(self):
+ """Returns the product board name of the device (e.g. 'shamu')."""
+ return self.GetProp('ro.product.board', cache=True)
+
+ def _EnsureCacheInitialized(self):
+ """Populates cache token, runs getprop and fetches $EXTERNAL_STORAGE."""
+ if self._cache['token']:
+ return
+ with self._cache_lock:
+ if self._cache['token']:
+ return
+ # Change the token every time to ensure that it will match only the
+ # previously dumped cache.
+ token = str(uuid.uuid1())
+ cmd = (
+ 'c=/data/local/tmp/cache_token;'
+ 'echo $EXTERNAL_STORAGE;'
+ 'cat $c 2>/dev/null||echo;'
+ 'echo "%s">$c &&' % token +
+ 'getprop'
+ )
+ output = self.RunShellCommand(
+ cmd, shell=True, check_return=True, large_output=True)
+ # Error-checking for this existing is done in GetExternalStoragePath().
+ self._cache['external_storage'] = output[0]
+ self._cache['prev_token'] = output[1]
+ output = output[2:]
+
+ prop_cache = self._cache['getprop']
+ prop_cache.clear()
+ for key, value in _GETPROP_RE.findall(''.join(output)):
+ prop_cache[key] = value
+ self._cache['token'] = token
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def GetProp(self, property_name, cache=False, timeout=None, retries=None):
+ """Gets a property from the device.
+
+ Args:
+ property_name: A string containing the name of the property to get from
+ the device.
+ cache: Whether to use cached properties when available.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ The value of the device's |property_name| property.
+
+ Raises:
+ CommandTimeoutError on timeout.
+ """
+ assert isinstance(property_name, basestring), (
+ "property_name is not a string: %r" % property_name)
+
+ if cache:
+ # It takes ~120ms to query a single property, and ~130ms to query all
+ # properties. So, when caching we always query all properties.
+ self._EnsureCacheInitialized()
+ else:
+ # timeout and retries are handled down at run shell, because we don't
+ # want to apply them in the other branch when reading from the cache
+ value = self.RunShellCommand(
+ ['getprop', property_name], single_line=True, check_return=True,
+ timeout=timeout, retries=retries)
+ self._cache['getprop'][property_name] = value
+ # Non-existent properties are treated as empty strings by getprop.
+ return self._cache['getprop'].get(property_name, '')
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def SetProp(self, property_name, value, check=False, timeout=None,
+ retries=None):
+ """Sets a property on the device.
+
+ Args:
+ property_name: A string containing the name of the property to set on
+ the device.
+ value: A string containing the value to set to the property on the
+ device.
+ check: A boolean indicating whether to check that the property was
+ successfully set on the device.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandFailedError if check is true and the property was not correctly
+ set on the device (e.g. because it is not rooted).
+ CommandTimeoutError on timeout.
+ """
+ assert isinstance(property_name, basestring), (
+ "property_name is not a string: %r" % property_name)
+ assert isinstance(value, basestring), "value is not a string: %r" % value
+
+ self.RunShellCommand(['setprop', property_name, value], check_return=True)
+ prop_cache = self._cache['getprop']
+ if property_name in prop_cache:
+ del prop_cache[property_name]
+ # TODO(perezju) remove the option and make the check mandatory, but using a
+ # single shell script to both set- and getprop.
+ if check and value != self.GetProp(property_name, cache=False):
+ raise device_errors.CommandFailedError(
+ 'Unable to set property %r on the device to %r'
+ % (property_name, value), str(self))
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def GetABI(self, timeout=None, retries=None):
+ """Gets the device main ABI.
+
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ The device's main ABI name.
+
+ Raises:
+ CommandTimeoutError on timeout.
+ """
+ return self.GetProp('ro.product.cpu.abi', cache=True)
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def GetPids(self, process_name=None, timeout=None, retries=None):
+ """Returns the PIDs of processes containing the given name as substring.
+
+ Note that the |process_name| is often the package name.
+
+ Args:
+ process_name: A string containing the process name to get the PIDs for.
+ If missing returns PIDs for all processes.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ A dict mapping process name to a list of PIDs for each process that
+ contained the provided |process_name|.
+
+ Raises:
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+ """
+ procs_pids = collections.defaultdict(list)
+ try:
+ ps_cmd = 'ps'
+ # ps behavior was changed in Android above N, http://crbug.com/686716
+ if (self.build_version_sdk >= version_codes.NOUGAT_MR1
+ and self.build_id[0] > 'N'):
+ ps_cmd = 'ps -e'
+ if process_name:
+ ps_output = self._RunPipedShellCommand(
+ '%s | grep -F %s' % (ps_cmd, cmd_helper.SingleQuote(process_name)))
+ else:
+ ps_output = self.RunShellCommand(
+ ps_cmd.split(), check_return=True, large_output=True)
+ except device_errors.AdbShellCommandFailedError as e:
+ if e.status and isinstance(e.status, list) and not e.status[0]:
+ # If ps succeeded but grep failed, there were no processes with the
+ # given name.
+ return procs_pids
+ else:
+ raise
+
+ process_name = process_name or ''
+ for line in ps_output:
+ try:
+ ps_data = line.split()
+ pid, process = ps_data[1], ps_data[-1]
+ if process_name in process and pid != 'PID':
+ procs_pids[process].append(pid)
+ except IndexError:
+ pass
+ return procs_pids
+
+ def GetApplicationPids(self, process_name, at_most_one=False, **kwargs):
+ """Returns the PID or PIDs of a given process name.
+
+ Note that the |process_name|, often the package name, must match exactly.
+
+ Args:
+ process_name: A string containing the process name to get the PIDs for.
+ at_most_one: A boolean indicating that at most one PID is expected to
+ be found.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ A list of the PIDs for the named process. If at_most_one=True returns
+ the single PID found or None otherwise.
+
+ Raises:
+ CommandFailedError if at_most_one=True and more than one PID is found
+ for the named process.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+ """
+ pids = self.GetPids(process_name, **kwargs).get(process_name, [])
+ if at_most_one:
+ if len(pids) > 1:
+ raise device_errors.CommandFailedError(
+ 'Expected a single process but found PIDs: %s.' % ', '.join(pids),
+ device_serial=str(self))
+ return pids[0] if pids else None
+ else:
+ return pids
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def GetEnforce(self, timeout=None, retries=None):
+ """Get the current mode of SELinux.
+
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ True (enforcing), False (permissive), or None (disabled).
+
+ Raises:
+ CommandFailedError on failure.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+ """
+ output = self.RunShellCommand(
+ ['getenforce'], check_return=True, single_line=True).lower()
+ if output not in _SELINUX_MODE:
+ raise device_errors.CommandFailedError(
+ 'Unexpected getenforce output: %s' % output)
+ return _SELINUX_MODE[output]
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def SetEnforce(self, enabled, timeout=None, retries=None):
+ """Modify the mode SELinux is running in.
+
+ Args:
+ enabled: a boolean indicating whether to put SELinux in encorcing mode
+ (if True), or permissive mode (otherwise).
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandFailedError on failure.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+ """
+ self.RunShellCommand(
+ ['setenforce', '1' if int(enabled) else '0'], as_root=True,
+ check_return=True)
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def TakeScreenshot(self, host_path=None, timeout=None, retries=None):
+ """Takes a screenshot of the device.
+
+ Args:
+ host_path: A string containing the path on the host to save the
+ screenshot to. If None, a file name in the current
+ directory will be generated.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ The name of the file on the host to which the screenshot was saved.
+
+ Raises:
+ CommandFailedError on failure.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+ """
+ if not host_path:
+ host_path = os.path.abspath('screenshot-%s-%s.png' % (
+ self.serial, _GetTimeStamp()))
+ with device_temp_file.DeviceTempFile(self.adb, suffix='.png') as device_tmp:
+ self.RunShellCommand(['/system/bin/screencap', '-p', device_tmp.name],
+ check_return=True)
+ self.PullFile(device_tmp.name, host_path)
+ return host_path
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def GetMemoryUsageForPid(self, pid, timeout=None, retries=None):
+ """Gets the memory usage for the given PID.
+
+ Args:
+ pid: PID of the process.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ A dict containing memory usage statistics for the PID. May include:
+ Size, Rss, Pss, Shared_Clean, Shared_Dirty, Private_Clean,
+ Private_Dirty, VmHWM
+
+ Raises:
+ CommandTimeoutError on timeout.
+ """
+ result = collections.defaultdict(int)
+
+ try:
+ result.update(self._GetMemoryUsageForPidFromSmaps(pid))
+ except device_errors.CommandFailedError:
+ logger.exception('Error getting memory usage from smaps')
+
+ try:
+ result.update(self._GetMemoryUsageForPidFromStatus(pid))
+ except device_errors.CommandFailedError:
+ logger.exception('Error getting memory usage from status')
+
+ return result
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def DismissCrashDialogIfNeeded(self, timeout=None, retries=None):
+ """Dismiss the error/ANR dialog if present.
+
+ Returns: Name of the crashed package if a dialog is focused,
+ None otherwise.
+ """
+ def _FindFocusedWindow():
+ match = None
+ # TODO(jbudorick): Try to grep the output on the device instead of using
+ # large_output if/when DeviceUtils exposes a public interface for piped
+ # shell command handling.
+ for line in self.RunShellCommand(['dumpsys', 'window', 'windows'],
+ check_return=True, large_output=True):
+ match = re.match(_CURRENT_FOCUS_CRASH_RE, line)
+ if match:
+ break
+ return match
+
+ match = _FindFocusedWindow()
+ if not match:
+ return None
+ package = match.group(2)
+ logger.warning('Trying to dismiss %s dialog for %s', *match.groups())
+ self.SendKeyEvent(keyevent.KEYCODE_DPAD_RIGHT)
+ self.SendKeyEvent(keyevent.KEYCODE_DPAD_RIGHT)
+ self.SendKeyEvent(keyevent.KEYCODE_ENTER)
+ match = _FindFocusedWindow()
+ if match:
+ logger.error('Still showing a %s dialog for %s', *match.groups())
+ return package
+
+ def _GetMemoryUsageForPidFromSmaps(self, pid):
+ SMAPS_COLUMNS = (
+ 'Size', 'Rss', 'Pss', 'Shared_Clean', 'Shared_Dirty', 'Private_Clean',
+ 'Private_Dirty')
+
+ showmap_out = self._RunPipedShellCommand(
+ 'showmap %d | grep TOTAL' % int(pid), as_root=True)
+
+ split_totals = showmap_out[-1].split()
+ if (not split_totals
+ or len(split_totals) != 9
+ or split_totals[-1] != 'TOTAL'):
+ raise device_errors.CommandFailedError(
+ 'Invalid output from showmap: %s' % '\n'.join(showmap_out))
+
+ return dict(itertools.izip(SMAPS_COLUMNS, (int(n) for n in split_totals)))
+
+ def _GetMemoryUsageForPidFromStatus(self, pid):
+ for line in self.ReadFile(
+ '/proc/%s/status' % str(pid), as_root=True).splitlines():
+ if line.startswith('VmHWM:'):
+ return {'VmHWM': int(line.split()[1])}
+ raise device_errors.CommandFailedError(
+ 'Could not find memory peak value for pid %s', str(pid))
+
+ def GetLogcatMonitor(self, *args, **kwargs):
+ """Returns a new LogcatMonitor associated with this device.
+
+ Parameters passed to this function are passed directly to
+ |logcat_monitor.LogcatMonitor| and are documented there.
+ """
+ return logcat_monitor.LogcatMonitor(self.adb, *args, **kwargs)
+
+ def GetClientCache(self, client_name):
+ """Returns client cache."""
+ if client_name not in self._client_caches:
+ self._client_caches[client_name] = {}
+ return self._client_caches[client_name]
+
+ def _ClearCache(self):
+ """Clears all caches."""
+ for client in self._client_caches:
+ self._client_caches[client].clear()
+ self._cache = {
+ # Map of packageId -> list of on-device .apk paths
+ 'package_apk_paths': {},
+ # Set of packageId that were loaded from LoadCacheData and not yet
+ # verified.
+ 'package_apk_paths_to_verify': set(),
+ # Map of packageId -> set of on-device .apk checksums
+ 'package_apk_checksums': {},
+ # Map of property_name -> value
+ 'getprop': {},
+ # Map of device_path -> [ignore_other_files, map of path->checksum]
+ 'device_path_checksums': {},
+ # Location of sdcard ($EXTERNAL_STORAGE).
+ 'external_storage': None,
+ # Token used to detect when LoadCacheData is stale.
+ 'token': None,
+ 'prev_token': None,
+ }
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def LoadCacheData(self, data, timeout=None, retries=None):
+ """Initializes the cache from data created using DumpCacheData.
+
+ The cache is used only if its token matches the one found on the device.
+ This prevents a stale cache from being used (which can happen when sharing
+ devices).
+
+ Args:
+ data: A previously serialized cache (string).
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ Whether the cache was loaded.
+ """
+ obj = json.loads(data)
+ self._EnsureCacheInitialized()
+ given_token = obj.get('token')
+ if not given_token or self._cache['prev_token'] != given_token:
+ logger.warning('Stale cache detected. Not using it.')
+ return False
+
+ self._cache['package_apk_paths'] = obj.get('package_apk_paths', {})
+ # When using a cache across script invokations, verify that apps have
+ # not been uninstalled.
+ self._cache['package_apk_paths_to_verify'] = set(
+ self._cache['package_apk_paths'].iterkeys())
+
+ package_apk_checksums = obj.get('package_apk_checksums', {})
+ for k, v in package_apk_checksums.iteritems():
+ package_apk_checksums[k] = set(v)
+ self._cache['package_apk_checksums'] = package_apk_checksums
+ device_path_checksums = obj.get('device_path_checksums', {})
+ self._cache['device_path_checksums'] = device_path_checksums
+ return True
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def DumpCacheData(self, timeout=None, retries=None):
+ """Dumps the current cache state to a string.
+
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ A serialized cache as a string.
+ """
+ self._EnsureCacheInitialized()
+ obj = {}
+ obj['token'] = self._cache['token']
+ obj['package_apk_paths'] = self._cache['package_apk_paths']
+ obj['package_apk_checksums'] = self._cache['package_apk_checksums']
+ # JSON can't handle sets.
+ for k, v in obj['package_apk_checksums'].iteritems():
+ obj['package_apk_checksums'][k] = list(v)
+ obj['device_path_checksums'] = self._cache['device_path_checksums']
+ return json.dumps(obj, separators=(',', ':'))
+
+ @classmethod
+ def parallel(cls, devices, async=False):
+ """Creates a Parallelizer to operate over the provided list of devices.
+
+ Args:
+ devices: A list of either DeviceUtils instances or objects from
+ from which DeviceUtils instances can be constructed. If None,
+ all attached devices will be used.
+ async: If true, returns a Parallelizer that runs operations
+ asynchronously.
+
+ Returns:
+ A Parallelizer operating over |devices|.
+ """
+ devices = [d if isinstance(d, cls) else cls(d) for d in devices]
+ if async:
+ return parallelizer.Parallelizer(devices)
+ else:
+ return parallelizer.SyncParallelizer(devices)
+
+ @classmethod
+ def HealthyDevices(cls, blacklist=None, device_arg='default', **kwargs):
+ """Returns a list of DeviceUtils instances.
+
+ Returns a list of DeviceUtils instances that are attached, not blacklisted,
+ and optionally filtered by --device flags or ANDROID_SERIAL environment
+ variable.
+
+ Args:
+ blacklist: A DeviceBlacklist instance (optional). Device serials in this
+ blacklist will never be returned, but a warning will be logged if they
+ otherwise would have been.
+ device_arg: The value of the --device flag. This can be:
+ 'default' -> Same as [], but returns an empty list rather than raise a
+ NoDevicesError.
+ [] -> Returns all devices, unless $ANDROID_SERIAL is set.
+ None -> Use $ANDROID_SERIAL if set, otherwise looks for a single
+ attached device. Raises an exception if multiple devices are
+ attached.
+ 'serial' -> Returns an instance for the given serial, if not
+ blacklisted.
+ ['A', 'B', ...] -> Returns instances for the subset that is not
+ blacklisted.
+ A device serial, or a list of device serials (optional).
+
+ Returns:
+ A list of DeviceUtils instances.
+
+ Raises:
+ NoDevicesError: Raised when no non-blacklisted devices exist and
+ device_arg is passed.
+ MultipleDevicesError: Raise when multiple devices exist, but |device_arg|
+ is None.
+ """
+ allow_no_devices = False
+ if device_arg == 'default':
+ allow_no_devices = True
+ device_arg = ()
+
+ select_multiple = True
+ if not (isinstance(device_arg, tuple) or isinstance(device_arg, list)):
+ select_multiple = False
+ if device_arg:
+ device_arg = (device_arg,)
+
+ blacklisted_devices = blacklist.Read() if blacklist else []
+
+ # adb looks for ANDROID_SERIAL, so support it as well.
+ android_serial = os.environ.get('ANDROID_SERIAL')
+ if not device_arg and android_serial:
+ device_arg = (android_serial,)
+
+ def blacklisted(serial):
+ if serial in blacklisted_devices:
+ logger.warning('Device %s is blacklisted.', serial)
+ return True
+ return False
+
+ if device_arg:
+ devices = [cls(x, **kwargs) for x in device_arg if not blacklisted(x)]
+ else:
+ devices = []
+ for adb in adb_wrapper.AdbWrapper.Devices():
+ if not blacklisted(adb.GetDeviceSerial()):
+ devices.append(cls(_CreateAdbWrapper(adb), **kwargs))
+
+ if len(devices) == 0 and not allow_no_devices:
+ raise device_errors.NoDevicesError()
+ if len(devices) > 1 and not select_multiple:
+ raise device_errors.MultipleDevicesError(devices)
+ return sorted(devices)
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def RestartAdbd(self, timeout=None, retries=None):
+ logger.info('Restarting adbd on device.')
+ with device_temp_file.DeviceTempFile(self.adb, suffix='.sh') as script:
+ self.WriteFile(script.name, _RESTART_ADBD_SCRIPT)
+ self.RunShellCommand(
+ ['source', script.name], check_return=True, as_root=True)
+ self.adb.WaitForDevice()
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def GrantPermissions(self, package, permissions, timeout=None, retries=None):
+ # Permissions only need to be set on M and above because of the changes to
+ # the permission model.
+ if not permissions or self.build_version_sdk < version_codes.MARSHMALLOW:
+ return
+ logger.info('Setting permissions for %s.', package)
+ permissions = [p for p in permissions if p not in _PERMISSIONS_BLACKLIST]
+ if ('android.permission.WRITE_EXTERNAL_STORAGE' in permissions
+ and 'android.permission.READ_EXTERNAL_STORAGE' not in permissions):
+ permissions.append('android.permission.READ_EXTERNAL_STORAGE')
+ cmd = '&&'.join('pm grant %s %s' % (package, p) for p in permissions)
+ if cmd:
+ output = self.RunShellCommand(cmd, shell=True, check_return=True)
+ if output:
+ logger.warning('Possible problem when granting permissions. Blacklist '
+ 'may need to be updated.')
+ for line in output:
+ logger.warning(' %s', line)
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def IsScreenOn(self, timeout=None, retries=None):
+ """Determines if screen is on.
+
+ Dumpsys input_method exposes screen on/off state. Below is an explination of
+ the states.
+
+ Pre-L:
+ On: mScreenOn=true
+ Off: mScreenOn=false
+ L+:
+ On: mInteractive=true
+ Off: mInteractive=false
+
+ Returns:
+ True if screen is on, false if it is off.
+
+ Raises:
+ device_errors.CommandFailedError: If screen state cannot be found.
+ """
+ if self.build_version_sdk < version_codes.LOLLIPOP:
+ input_check = 'mScreenOn'
+ check_value = 'mScreenOn=true'
+ else:
+ input_check = 'mInteractive'
+ check_value = 'mInteractive=true'
+ dumpsys_out = self._RunPipedShellCommand(
+ 'dumpsys input_method | grep %s' % input_check)
+ if not dumpsys_out:
+ raise device_errors.CommandFailedError(
+ 'Unable to detect screen state', str(self))
+ return check_value in dumpsys_out[0]
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def SetScreen(self, on, timeout=None, retries=None):
+ """Turns screen on and off.
+
+ Args:
+ on: bool to decide state to switch to. True = on False = off.
+ """
+ def screen_test():
+ return self.IsScreenOn() == on
+
+ if screen_test():
+ logger.info('Screen already in expected state.')
+ return
+ self.SendKeyEvent(keyevent.KEYCODE_POWER)
+ timeout_retry.WaitFor(screen_test, wait_period=1)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_utils_devicetest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_utils_devicetest.py
new file mode 100644
index 0000000..932e278
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_utils_devicetest.py
@@ -0,0 +1,238 @@
+#!/usr/bin/env python
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""
+Unit tests for the contents of device_utils.py (mostly DeviceUtils).
+The test will invoke real devices
+"""
+
+import os
+import posixpath
+import sys
+import tempfile
+import unittest
+
+if __name__ == '__main__':
+ sys.path.append(
+ os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', )))
+
+from devil.android import device_test_case
+from devil.android import device_utils
+from devil.android.sdk import adb_wrapper
+from devil.utils import cmd_helper
+
+_OLD_CONTENTS = "foo"
+_NEW_CONTENTS = "bar"
+_DEVICE_DIR = "/data/local/tmp/device_utils_test"
+_SUB_DIR = "sub"
+_SUB_DIR1 = "sub1"
+_SUB_DIR2 = "sub2"
+
+
+class DeviceUtilsPushDeleteFilesTest(device_test_case.DeviceTestCase):
+
+ def setUp(self):
+ super(DeviceUtilsPushDeleteFilesTest, self).setUp()
+ self.adb = adb_wrapper.AdbWrapper(self.serial)
+ self.adb.WaitForDevice()
+ self.device = device_utils.DeviceUtils(
+ self.adb, default_timeout=10, default_retries=0)
+
+ @staticmethod
+ def _MakeTempFile(contents):
+ """Make a temporary file with the given contents.
+
+ Args:
+ contents: string to write to the temporary file.
+
+ Returns:
+ the tuple contains the absolute path to the file and the file name
+ """
+ fi, path = tempfile.mkstemp(text=True)
+ with os.fdopen(fi, 'w') as f:
+ f.write(contents)
+ file_name = os.path.basename(path)
+ return (path, file_name)
+
+ @staticmethod
+ def _MakeTempFileGivenDir(directory, contents):
+ """Make a temporary file under the given directory
+ with the given contents
+
+ Args:
+ directory: the temp directory to create the file
+ contents: string to write to the temp file
+
+ Returns:
+ the list contains the absolute path to the file and the file name
+ """
+ fi, path = tempfile.mkstemp(dir=directory, text=True)
+ with os.fdopen(fi, 'w') as f:
+ f.write(contents)
+ file_name = os.path.basename(path)
+ return (path, file_name)
+
+ @staticmethod
+ def _ChangeTempFile(path, contents):
+ with os.open(path, 'w') as f:
+ f.write(contents)
+
+ @staticmethod
+ def _DeleteTempFile(path):
+ os.remove(path)
+
+ def testPushChangedFiles_noFileChange(self):
+ (host_file_path, file_name) = self._MakeTempFile(_OLD_CONTENTS)
+ device_file_path = "%s/%s" % (_DEVICE_DIR, file_name)
+ self.adb.Push(host_file_path, device_file_path)
+ self.device.PushChangedFiles([(host_file_path, device_file_path)])
+ result = self.device.RunShellCommand(
+ ['cat', device_file_path], check_return=True, single_line=True)
+ self.assertEqual(_OLD_CONTENTS, result)
+
+ cmd_helper.RunCmd(['rm', host_file_path])
+ self.device.RemovePath(_DEVICE_DIR, recursive=True, force=True)
+
+ def testPushChangedFiles_singleFileChange(self):
+ (host_file_path, file_name) = self._MakeTempFile(_OLD_CONTENTS)
+ device_file_path = "%s/%s" % (_DEVICE_DIR, file_name)
+ self.adb.Push(host_file_path, device_file_path)
+
+ with open(host_file_path, 'w') as f:
+ f.write(_NEW_CONTENTS)
+ self.device.PushChangedFiles([(host_file_path, device_file_path)])
+ result = self.device.RunShellCommand(
+ ['cat', device_file_path], check_return=True, single_line=True)
+ self.assertEqual(_NEW_CONTENTS, result)
+
+ cmd_helper.RunCmd(['rm', host_file_path])
+ self.device.RemovePath(_DEVICE_DIR, recursive=True, force=True)
+
+ def testDeleteFiles(self):
+ host_tmp_dir = tempfile.mkdtemp()
+ (host_file_path, file_name) = self._MakeTempFileGivenDir(
+ host_tmp_dir, _OLD_CONTENTS)
+
+ device_file_path = "%s/%s" % (_DEVICE_DIR, file_name)
+ self.adb.Push(host_file_path, device_file_path)
+
+ cmd_helper.RunCmd(['rm', host_file_path])
+ self.device.PushChangedFiles([(host_tmp_dir, _DEVICE_DIR)],
+ delete_device_stale=True)
+ filenames = self.device.ListDirectory(_DEVICE_DIR)
+ self.assertEqual([], filenames)
+
+ cmd_helper.RunCmd(['rm', '-rf', host_tmp_dir])
+ self.device.RemovePath(_DEVICE_DIR, recursive=True, force=True)
+
+ def testPushAndDeleteFiles_noSubDir(self):
+ host_tmp_dir = tempfile.mkdtemp()
+ (host_file_path1, file_name1) = self._MakeTempFileGivenDir(
+ host_tmp_dir, _OLD_CONTENTS)
+ (host_file_path2, file_name2) = self._MakeTempFileGivenDir(
+ host_tmp_dir, _OLD_CONTENTS)
+
+ device_file_path1 = "%s/%s" % (_DEVICE_DIR, file_name1)
+ device_file_path2 = "%s/%s" % (_DEVICE_DIR, file_name2)
+ self.adb.Push(host_file_path1, device_file_path1)
+ self.adb.Push(host_file_path2, device_file_path2)
+
+ with open(host_file_path1, 'w') as f:
+ f.write(_NEW_CONTENTS)
+ cmd_helper.RunCmd(['rm', host_file_path2])
+
+ self.device.PushChangedFiles([(host_tmp_dir, _DEVICE_DIR)],
+ delete_device_stale=True)
+ result = self.device.RunShellCommand(
+ ['cat', device_file_path1], check_return=True, single_line=True)
+ self.assertEqual(_NEW_CONTENTS, result)
+
+ filenames = self.device.ListDirectory(_DEVICE_DIR)
+ self.assertEqual([file_name1], filenames)
+
+ cmd_helper.RunCmd(['rm', '-rf', host_tmp_dir])
+ self.device.RemovePath(_DEVICE_DIR, recursive=True, force=True)
+
+ def testPushAndDeleteFiles_SubDir(self):
+ host_tmp_dir = tempfile.mkdtemp()
+ host_sub_dir1 = "%s/%s" % (host_tmp_dir, _SUB_DIR1)
+ host_sub_dir2 = "%s/%s/%s" % (host_tmp_dir, _SUB_DIR, _SUB_DIR2)
+ cmd_helper.RunCmd(['mkdir', '-p', host_sub_dir1])
+ cmd_helper.RunCmd(['mkdir', '-p', host_sub_dir2])
+
+ (host_file_path1, file_name1) = self._MakeTempFileGivenDir(
+ host_tmp_dir, _OLD_CONTENTS)
+ (host_file_path2, file_name2) = self._MakeTempFileGivenDir(
+ host_tmp_dir, _OLD_CONTENTS)
+ (host_file_path3, file_name3) = self._MakeTempFileGivenDir(
+ host_sub_dir1, _OLD_CONTENTS)
+ (host_file_path4, file_name4) = self._MakeTempFileGivenDir(
+ host_sub_dir2, _OLD_CONTENTS)
+
+ device_file_path1 = "%s/%s" % (_DEVICE_DIR, file_name1)
+ device_file_path2 = "%s/%s" % (_DEVICE_DIR, file_name2)
+ device_file_path3 = "%s/%s/%s" % (_DEVICE_DIR, _SUB_DIR1, file_name3)
+ device_file_path4 = "%s/%s/%s/%s" % (_DEVICE_DIR, _SUB_DIR,
+ _SUB_DIR2, file_name4)
+
+ self.adb.Push(host_file_path1, device_file_path1)
+ self.adb.Push(host_file_path2, device_file_path2)
+ self.adb.Push(host_file_path3, device_file_path3)
+ self.adb.Push(host_file_path4, device_file_path4)
+
+ with open(host_file_path1, 'w') as f:
+ f.write(_NEW_CONTENTS)
+ cmd_helper.RunCmd(['rm', host_file_path2])
+ cmd_helper.RunCmd(['rm', host_file_path4])
+
+ self.device.PushChangedFiles([(host_tmp_dir, _DEVICE_DIR)],
+ delete_device_stale=True)
+ result = self.device.RunShellCommand(
+ ['cat', device_file_path1], check_return=True, single_line=True)
+ self.assertEqual(_NEW_CONTENTS, result)
+
+ filenames = self.device.ListDirectory(_DEVICE_DIR)
+ self.assertIn(file_name1, filenames)
+ self.assertIn(_SUB_DIR1, filenames)
+ self.assertIn(_SUB_DIR, filenames)
+ self.assertEqual(3, len(filenames))
+
+ result = self.device.RunShellCommand(
+ ['cat', device_file_path3], check_return=True, single_line=True)
+ self.assertEqual(_OLD_CONTENTS, result)
+
+ filenames = self.device.ListDirectory(
+ posixpath.join(_DEVICE_DIR, _SUB_DIR, _SUB_DIR2))
+ self.assertEqual([], filenames)
+
+ cmd_helper.RunCmd(['rm', '-rf', host_tmp_dir])
+ self.device.RemovePath(_DEVICE_DIR, recursive=True, force=True)
+
+ def testRestartAdbd(self):
+ def get_adbd_pid():
+ # TODO(catapult:#3215): Migrate to device.GetPids().
+ ps_output = self.device.RunShellCommand(['ps'], check_return=True)
+ for ps_line in ps_output:
+ if 'adbd' in ps_line:
+ return ps_line.split()[1]
+ self.fail('Unable to find adbd')
+
+ old_adbd_pid = get_adbd_pid()
+ self.device.RestartAdbd()
+ new_adbd_pid = get_adbd_pid()
+ self.assertNotEqual(old_adbd_pid, new_adbd_pid)
+
+ def testEnableRoot(self):
+ self.device.SetProp('service.adb.root', '0')
+ self.device.RestartAdbd()
+ self.assertFalse(self.device.HasRoot())
+ self.assertIn(self.device.GetProp('service.adb.root'), ('', '0'))
+ self.device.EnableRoot()
+ self.assertTrue(self.device.HasRoot())
+ self.assertEquals(self.device.GetProp('service.adb.root'), '1')
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_utils_test.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_utils_test.py
new file mode 100644
index 0000000..ebd3c62
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/device_utils_test.py
@@ -0,0 +1,2908 @@
+#!/usr/bin/env python
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""
+Unit tests for the contents of device_utils.py (mostly DeviceUtils).
+"""
+
+# pylint: disable=protected-access
+# pylint: disable=unused-argument
+
+import json
+import logging
+import os
+import stat
+import unittest
+
+from devil import devil_env
+from devil.android import device_errors
+from devil.android import device_signal
+from devil.android import device_utils
+from devil.android.sdk import adb_wrapper
+from devil.android.sdk import intent
+from devil.android.sdk import keyevent
+from devil.android.sdk import version_codes
+from devil.utils import cmd_helper
+from devil.utils import mock_calls
+
+with devil_env.SysPath(devil_env.PYMOCK_PATH):
+ import mock # pylint: disable=import-error
+
+
+class AnyStringWith(object):
+ def __init__(self, value):
+ self._value = value
+
+ def __eq__(self, other):
+ return self._value in other
+
+ def __repr__(self):
+ return '<AnyStringWith: %s>' % self._value
+
+
+class _MockApkHelper(object):
+
+ def __init__(self, path, package_name, perms=None):
+ self.path = path
+ self.package_name = package_name
+ self.perms = perms
+
+ def GetPackageName(self):
+ return self.package_name
+
+ def GetPermissions(self):
+ return self.perms
+
+
+class _MockMultipleDevicesError(Exception):
+ pass
+
+
+class DeviceUtilsInitTest(unittest.TestCase):
+
+ def testInitWithStr(self):
+ serial_as_str = str('0123456789abcdef')
+ d = device_utils.DeviceUtils('0123456789abcdef')
+ self.assertEqual(serial_as_str, d.adb.GetDeviceSerial())
+
+ def testInitWithUnicode(self):
+ serial_as_unicode = unicode('fedcba9876543210')
+ d = device_utils.DeviceUtils(serial_as_unicode)
+ self.assertEqual(serial_as_unicode, d.adb.GetDeviceSerial())
+
+ def testInitWithAdbWrapper(self):
+ serial = '123456789abcdef0'
+ a = adb_wrapper.AdbWrapper(serial)
+ d = device_utils.DeviceUtils(a)
+ self.assertEqual(serial, d.adb.GetDeviceSerial())
+
+ def testInitWithMissing_fails(self):
+ with self.assertRaises(ValueError):
+ device_utils.DeviceUtils(None)
+ with self.assertRaises(ValueError):
+ device_utils.DeviceUtils('')
+
+
+class DeviceUtilsGetAVDsTest(mock_calls.TestCase):
+
+ def testGetAVDs(self):
+ mocked_attrs = {
+ 'android_sdk': '/my/sdk/path'
+ }
+ with mock.patch('devil.devil_env._Environment.LocalPath',
+ mock.Mock(side_effect=lambda a: mocked_attrs[a])):
+ with self.assertCall(
+ mock.call.devil.utils.cmd_helper.GetCmdOutput(
+ [mock.ANY, 'list', 'avd']),
+ 'Available Android Virtual Devices:\n'
+ ' Name: my_android5.0\n'
+ ' Path: /some/path/to/.android/avd/my_android5.0.avd\n'
+ ' Target: Android 5.0 (API level 21)\n'
+ ' Tag/ABI: default/x86\n'
+ ' Skin: WVGA800\n'):
+ self.assertEquals(['my_android5.0'], device_utils.GetAVDs())
+
+
+class DeviceUtilsRestartServerTest(mock_calls.TestCase):
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testRestartServer_succeeds(self):
+ with self.assertCalls(
+ mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.KillServer(),
+ (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutput(
+ ['pgrep', 'adb']),
+ (1, '')),
+ mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.StartServer(),
+ (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutput(
+ ['pgrep', 'adb']),
+ (1, '')),
+ (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutput(
+ ['pgrep', 'adb']),
+ (0, '123\n'))):
+ device_utils.RestartServer()
+
+
+class MockTempFile(object):
+
+ def __init__(self, name='/tmp/some/file'):
+ self.file = mock.MagicMock(spec=file)
+ self.file.name = name
+ self.file.name_quoted = cmd_helper.SingleQuote(name)
+
+ def __enter__(self):
+ return self.file
+
+ def __exit__(self, exc_type, exc_val, exc_tb):
+ pass
+
+ @property
+ def name(self):
+ return self.file.name
+
+
+class _PatchedFunction(object):
+
+ def __init__(self, patched=None, mocked=None):
+ self.patched = patched
+ self.mocked = mocked
+
+
+def _AdbWrapperMock(test_serial, is_ready=True):
+ adb = mock.Mock(spec=adb_wrapper.AdbWrapper)
+ adb.__str__ = mock.Mock(return_value=test_serial)
+ adb.GetDeviceSerial.return_value = test_serial
+ adb.is_ready = is_ready
+ return adb
+
+
+class DeviceUtilsTest(mock_calls.TestCase):
+
+ def setUp(self):
+ self.adb = _AdbWrapperMock('0123456789abcdef')
+ self.device = device_utils.DeviceUtils(
+ self.adb, default_timeout=10, default_retries=0)
+ self.watchMethodCalls(self.call.adb, ignore=['GetDeviceSerial'])
+
+ def AdbCommandError(self, args=None, output=None, status=None, msg=None):
+ if args is None:
+ args = ['[unspecified]']
+ return mock.Mock(side_effect=device_errors.AdbCommandFailedError(
+ args, output, status, msg, str(self.device)))
+
+ def CommandError(self, msg=None):
+ if msg is None:
+ msg = 'Command failed'
+ return mock.Mock(side_effect=device_errors.CommandFailedError(
+ msg, str(self.device)))
+
+ def ShellError(self, output=None, status=1):
+ def action(cmd, *args, **kwargs):
+ raise device_errors.AdbShellCommandFailedError(
+ cmd, output, status, str(self.device))
+ if output is None:
+ output = 'Permission denied\n'
+ return action
+
+ def TimeoutError(self, msg=None):
+ if msg is None:
+ msg = 'Operation timed out'
+ return mock.Mock(side_effect=device_errors.CommandTimeoutError(
+ msg, str(self.device)))
+
+ def EnsureCacheInitialized(self, props=None, sdcard='/sdcard'):
+ props = props or []
+ ret = [sdcard, 'TOKEN'] + props
+ return (self.call.device.RunShellCommand(
+ AnyStringWith('getprop'),
+ shell=True, check_return=True, large_output=True), ret)
+
+
+class DeviceUtilsEqTest(DeviceUtilsTest):
+
+ def testEq_equal_deviceUtils(self):
+ other = device_utils.DeviceUtils(_AdbWrapperMock('0123456789abcdef'))
+ self.assertTrue(self.device == other)
+ self.assertTrue(other == self.device)
+
+ def testEq_equal_adbWrapper(self):
+ other = adb_wrapper.AdbWrapper('0123456789abcdef')
+ self.assertTrue(self.device == other)
+ self.assertTrue(other == self.device)
+
+ def testEq_equal_string(self):
+ other = '0123456789abcdef'
+ self.assertTrue(self.device == other)
+ self.assertTrue(other == self.device)
+
+ def testEq_devicesNotEqual(self):
+ other = device_utils.DeviceUtils(_AdbWrapperMock('0123456789abcdee'))
+ self.assertFalse(self.device == other)
+ self.assertFalse(other == self.device)
+
+ def testEq_identity(self):
+ self.assertTrue(self.device == self.device)
+
+ def testEq_serialInList(self):
+ devices = [self.device]
+ self.assertTrue('0123456789abcdef' in devices)
+
+
+class DeviceUtilsLtTest(DeviceUtilsTest):
+
+ def testLt_lessThan(self):
+ other = device_utils.DeviceUtils(_AdbWrapperMock('ffffffffffffffff'))
+ self.assertTrue(self.device < other)
+ self.assertTrue(other > self.device)
+
+ def testLt_greaterThan_lhs(self):
+ other = device_utils.DeviceUtils(_AdbWrapperMock('0000000000000000'))
+ self.assertFalse(self.device < other)
+ self.assertFalse(other > self.device)
+
+ def testLt_equal(self):
+ other = device_utils.DeviceUtils(_AdbWrapperMock('0123456789abcdef'))
+ self.assertFalse(self.device < other)
+ self.assertFalse(other > self.device)
+
+ def testLt_sorted(self):
+ devices = [
+ device_utils.DeviceUtils(_AdbWrapperMock('ffffffffffffffff')),
+ device_utils.DeviceUtils(_AdbWrapperMock('0000000000000000')),
+ ]
+ sorted_devices = sorted(devices)
+ self.assertEquals('0000000000000000',
+ sorted_devices[0].adb.GetDeviceSerial())
+ self.assertEquals('ffffffffffffffff',
+ sorted_devices[1].adb.GetDeviceSerial())
+
+
+class DeviceUtilsStrTest(DeviceUtilsTest):
+
+ def testStr_returnsSerial(self):
+ with self.assertCalls(
+ (self.call.adb.GetDeviceSerial(), '0123456789abcdef')):
+ self.assertEqual('0123456789abcdef', str(self.device))
+
+
+class DeviceUtilsIsOnlineTest(DeviceUtilsTest):
+
+ def testIsOnline_true(self):
+ with self.assertCall(self.call.adb.GetState(), 'device'):
+ self.assertTrue(self.device.IsOnline())
+
+ def testIsOnline_false(self):
+ with self.assertCall(self.call.adb.GetState(), 'offline'):
+ self.assertFalse(self.device.IsOnline())
+
+ def testIsOnline_error(self):
+ with self.assertCall(self.call.adb.GetState(), self.CommandError()):
+ self.assertFalse(self.device.IsOnline())
+
+
+class DeviceUtilsHasRootTest(DeviceUtilsTest):
+
+ def testHasRoot_true(self):
+ with self.patch_call(self.call.device.product_name,
+ return_value='notasailfish'), (
+ self.assertCall(self.call.adb.Shell('ls /root'), 'foo\n')):
+ self.assertTrue(self.device.HasRoot())
+
+ def testhasRootSpecial_true(self):
+ with self.patch_call(self.call.device.product_name,
+ return_value='sailfish'), (
+ self.assertCall(self.call.adb.Shell('getprop service.adb.root'),
+ '1\n')):
+ self.assertTrue(self.device.HasRoot())
+
+ def testHasRoot_false(self):
+ with self.patch_call(self.call.device.product_name,
+ return_value='notasailfish'), (
+ self.assertCall(self.call.adb.Shell('ls /root'),
+ self.ShellError())):
+ self.assertFalse(self.device.HasRoot())
+
+ def testHasRootSpecial_false(self):
+ with self.patch_call(self.call.device.product_name,
+ return_value='sailfish'), (
+ self.assertCall(self.call.adb.Shell('getprop service.adb.root'),
+ '\n')):
+ self.assertFalse(self.device.HasRoot())
+
+
+class DeviceUtilsEnableRootTest(DeviceUtilsTest):
+
+ def testEnableRoot_succeeds(self):
+ with self.assertCalls(
+ self.call.adb.Root(),
+ self.call.adb.WaitForDevice(),
+ (self.call.device.GetProp('service.adb.root', cache=False), '1')):
+ self.device.EnableRoot()
+
+ def testEnableRoot_userBuild(self):
+ with self.assertCalls(
+ (self.call.adb.Root(), self.AdbCommandError()),
+ (self.call.device.IsUserBuild(), True)):
+ with self.assertRaises(device_errors.CommandFailedError):
+ self.device.EnableRoot()
+
+ def testEnableRoot_rootFails(self):
+ with self.assertCalls(
+ (self.call.adb.Root(), self.AdbCommandError()),
+ (self.call.device.IsUserBuild(), False)):
+ with self.assertRaises(device_errors.AdbCommandFailedError):
+ self.device.EnableRoot()
+
+
+class DeviceUtilsIsUserBuildTest(DeviceUtilsTest):
+
+ def testIsUserBuild_yes(self):
+ with self.assertCall(
+ self.call.device.GetProp('ro.build.type', cache=True), 'user'):
+ self.assertTrue(self.device.IsUserBuild())
+
+ def testIsUserBuild_no(self):
+ with self.assertCall(
+ self.call.device.GetProp('ro.build.type', cache=True), 'userdebug'):
+ self.assertFalse(self.device.IsUserBuild())
+
+
+class DeviceUtilsGetExternalStoragePathTest(DeviceUtilsTest):
+
+ def testGetExternalStoragePath_succeeds(self):
+ with self.assertCalls(
+ self.EnsureCacheInitialized(sdcard='/fake/storage/path')):
+ self.assertEquals('/fake/storage/path',
+ self.device.GetExternalStoragePath())
+
+ def testGetExternalStoragePath_fails(self):
+ with self.assertCalls(
+ self.EnsureCacheInitialized(sdcard='')):
+ with self.assertRaises(device_errors.CommandFailedError):
+ self.device.GetExternalStoragePath()
+
+
+class DeviceUtilsGetApplicationPathsInternalTest(DeviceUtilsTest):
+
+ def testGetApplicationPathsInternal_exists(self):
+ with self.assertCalls(
+ (self.call.device.GetProp('ro.build.version.sdk', cache=True), '19'),
+ (self.call.device.RunShellCommand(
+ ['pm', 'path', 'android'], check_return=True),
+ ['package:/path/to/android.apk'])):
+ self.assertEquals(['/path/to/android.apk'],
+ self.device._GetApplicationPathsInternal('android'))
+
+ def testGetApplicationPathsInternal_notExists(self):
+ with self.assertCalls(
+ (self.call.device.GetProp('ro.build.version.sdk', cache=True), '19'),
+ (self.call.device.RunShellCommand(
+ ['pm', 'path', 'not.installed.app'], check_return=True),
+ '')):
+ self.assertEquals([],
+ self.device._GetApplicationPathsInternal('not.installed.app'))
+
+ def testGetApplicationPathsInternal_garbageFirstLine(self):
+ with self.assertCalls(
+ (self.call.device.GetProp('ro.build.version.sdk', cache=True), '19'),
+ (self.call.device.RunShellCommand(
+ ['pm', 'path', 'android'], check_return=True),
+ ['garbage first line'])):
+ with self.assertRaises(device_errors.CommandFailedError):
+ self.device._GetApplicationPathsInternal('android')
+
+ def testGetApplicationPathsInternal_fails(self):
+ with self.assertCalls(
+ (self.call.device.GetProp('ro.build.version.sdk', cache=True), '19'),
+ (self.call.device.RunShellCommand(
+ ['pm', 'path', 'android'], check_return=True),
+ self.CommandError('ERROR. Is package manager running?\n'))):
+ with self.assertRaises(device_errors.CommandFailedError):
+ self.device._GetApplicationPathsInternal('android')
+
+
+class DeviceUtils_GetApplicationVersionTest(DeviceUtilsTest):
+
+ def test_GetApplicationVersion_exists(self):
+ with self.assertCalls(
+ (self.call.adb.Shell('dumpsys package com.android.chrome'),
+ 'Packages:\n'
+ ' Package [com.android.chrome] (3901ecfb):\n'
+ ' userId=1234 gids=[123, 456, 789]\n'
+ ' pkg=Package{1fecf634 com.android.chrome}\n'
+ ' versionName=45.0.1234.7\n')):
+ self.assertEquals('45.0.1234.7',
+ self.device.GetApplicationVersion('com.android.chrome'))
+
+ def test_GetApplicationVersion_notExists(self):
+ with self.assertCalls(
+ (self.call.adb.Shell('dumpsys package com.android.chrome'), '')):
+ self.assertEquals(None,
+ self.device.GetApplicationVersion('com.android.chrome'))
+
+ def test_GetApplicationVersion_fails(self):
+ with self.assertCalls(
+ (self.call.adb.Shell('dumpsys package com.android.chrome'),
+ 'Packages:\n'
+ ' Package [com.android.chrome] (3901ecfb):\n'
+ ' userId=1234 gids=[123, 456, 789]\n'
+ ' pkg=Package{1fecf634 com.android.chrome}\n')):
+ with self.assertRaises(device_errors.CommandFailedError):
+ self.device.GetApplicationVersion('com.android.chrome')
+
+
+class DeviceUtilsGetApplicationDataDirectoryTest(DeviceUtilsTest):
+
+ def testGetApplicationDataDirectory_exists(self):
+ with self.assertCall(
+ self.call.device._RunPipedShellCommand(
+ 'pm dump foo.bar.baz | grep dataDir='),
+ ['dataDir=/data/data/foo.bar.baz']):
+ self.assertEquals(
+ '/data/data/foo.bar.baz',
+ self.device.GetApplicationDataDirectory('foo.bar.baz'))
+
+ def testGetApplicationDataDirectory_notExists(self):
+ with self.assertCall(
+ self.call.device._RunPipedShellCommand(
+ 'pm dump foo.bar.baz | grep dataDir='),
+ self.ShellError()):
+ with self.assertRaises(device_errors.CommandFailedError):
+ self.device.GetApplicationDataDirectory('foo.bar.baz')
+
+
+@mock.patch('time.sleep', mock.Mock())
+class DeviceUtilsWaitUntilFullyBootedTest(DeviceUtilsTest):
+
+ def testWaitUntilFullyBooted_succeedsNoWifi(self):
+ with self.assertCalls(
+ self.call.adb.WaitForDevice(),
+ # sd_card_ready
+ (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
+ (self.call.adb.Shell('test -d /fake/storage/path'), ''),
+ # pm_ready
+ (self.call.device._GetApplicationPathsInternal('android',
+ skip_cache=True),
+ ['package:/some/fake/path']),
+ # boot_completed
+ (self.call.device.GetProp('sys.boot_completed', cache=False), '1')):
+ self.device.WaitUntilFullyBooted(wifi=False)
+
+ def testWaitUntilFullyBooted_succeedsWithWifi(self):
+ with self.assertCalls(
+ self.call.adb.WaitForDevice(),
+ # sd_card_ready
+ (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
+ (self.call.adb.Shell('test -d /fake/storage/path'), ''),
+ # pm_ready
+ (self.call.device._GetApplicationPathsInternal('android',
+ skip_cache=True),
+ ['package:/some/fake/path']),
+ # boot_completed
+ (self.call.device.GetProp('sys.boot_completed', cache=False), '1'),
+ # wifi_enabled
+ (self.call.adb.Shell('dumpsys wifi'),
+ 'stuff\nWi-Fi is enabled\nmore stuff\n')):
+ self.device.WaitUntilFullyBooted(wifi=True)
+
+ def testWaitUntilFullyBooted_deviceNotInitiallyAvailable(self):
+ with self.assertCalls(
+ self.call.adb.WaitForDevice(),
+ # sd_card_ready
+ (self.call.device.GetExternalStoragePath(), self.AdbCommandError()),
+ # sd_card_ready
+ (self.call.device.GetExternalStoragePath(), self.AdbCommandError()),
+ # sd_card_ready
+ (self.call.device.GetExternalStoragePath(), self.AdbCommandError()),
+ # sd_card_ready
+ (self.call.device.GetExternalStoragePath(), self.AdbCommandError()),
+ # sd_card_ready
+ (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
+ (self.call.adb.Shell('test -d /fake/storage/path'), ''),
+ # pm_ready
+ (self.call.device._GetApplicationPathsInternal('android',
+ skip_cache=True),
+ ['package:/some/fake/path']),
+ # boot_completed
+ (self.call.device.GetProp('sys.boot_completed', cache=False), '1')):
+ self.device.WaitUntilFullyBooted(wifi=False)
+
+ def testWaitUntilFullyBooted_deviceBrieflyOffline(self):
+ with self.assertCalls(
+ self.call.adb.WaitForDevice(),
+ # sd_card_ready
+ (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
+ (self.call.adb.Shell('test -d /fake/storage/path'), ''),
+ # pm_ready
+ (self.call.device._GetApplicationPathsInternal('android',
+ skip_cache=True),
+ ['package:/some/fake/path']),
+ # boot_completed
+ (self.call.device.GetProp('sys.boot_completed', cache=False),
+ self.AdbCommandError()),
+ # boot_completed
+ (self.call.device.GetProp('sys.boot_completed', cache=False), '1')):
+ self.device.WaitUntilFullyBooted(wifi=False)
+
+ def testWaitUntilFullyBooted_sdCardReadyFails_noPath(self):
+ with self.assertCalls(
+ self.call.adb.WaitForDevice(),
+ # sd_card_ready
+ (self.call.device.GetExternalStoragePath(), self.CommandError())):
+ with self.assertRaises(device_errors.CommandFailedError):
+ self.device.WaitUntilFullyBooted(wifi=False)
+
+ def testWaitUntilFullyBooted_sdCardReadyFails_notExists(self):
+ with self.assertCalls(
+ self.call.adb.WaitForDevice(),
+ # sd_card_ready
+ (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
+ (self.call.adb.Shell('test -d /fake/storage/path'), self.ShellError()),
+ # sd_card_ready
+ (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
+ (self.call.adb.Shell('test -d /fake/storage/path'), self.ShellError()),
+ # sd_card_ready
+ (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
+ (self.call.adb.Shell('test -d /fake/storage/path'),
+ self.TimeoutError())):
+ with self.assertRaises(device_errors.CommandTimeoutError):
+ self.device.WaitUntilFullyBooted(wifi=False)
+
+ def testWaitUntilFullyBooted_devicePmFails(self):
+ with self.assertCalls(
+ self.call.adb.WaitForDevice(),
+ # sd_card_ready
+ (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
+ (self.call.adb.Shell('test -d /fake/storage/path'), ''),
+ # pm_ready
+ (self.call.device._GetApplicationPathsInternal('android',
+ skip_cache=True),
+ self.CommandError()),
+ # pm_ready
+ (self.call.device._GetApplicationPathsInternal('android',
+ skip_cache=True),
+ self.CommandError()),
+ # pm_ready
+ (self.call.device._GetApplicationPathsInternal('android',
+ skip_cache=True),
+ self.TimeoutError())):
+ with self.assertRaises(device_errors.CommandTimeoutError):
+ self.device.WaitUntilFullyBooted(wifi=False)
+
+ def testWaitUntilFullyBooted_bootFails(self):
+ with self.assertCalls(
+ self.call.adb.WaitForDevice(),
+ # sd_card_ready
+ (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
+ (self.call.adb.Shell('test -d /fake/storage/path'), ''),
+ # pm_ready
+ (self.call.device._GetApplicationPathsInternal('android',
+ skip_cache=True),
+ ['package:/some/fake/path']),
+ # boot_completed
+ (self.call.device.GetProp('sys.boot_completed', cache=False), '0'),
+ # boot_completed
+ (self.call.device.GetProp('sys.boot_completed', cache=False), '0'),
+ # boot_completed
+ (self.call.device.GetProp('sys.boot_completed', cache=False),
+ self.TimeoutError())):
+ with self.assertRaises(device_errors.CommandTimeoutError):
+ self.device.WaitUntilFullyBooted(wifi=False)
+
+ def testWaitUntilFullyBooted_wifiFails(self):
+ with self.assertCalls(
+ self.call.adb.WaitForDevice(),
+ # sd_card_ready
+ (self.call.device.GetExternalStoragePath(), '/fake/storage/path'),
+ (self.call.adb.Shell('test -d /fake/storage/path'), ''),
+ # pm_ready
+ (self.call.device._GetApplicationPathsInternal('android',
+ skip_cache=True),
+ ['package:/some/fake/path']),
+ # boot_completed
+ (self.call.device.GetProp('sys.boot_completed', cache=False), '1'),
+ # wifi_enabled
+ (self.call.adb.Shell('dumpsys wifi'), 'stuff\nmore stuff\n'),
+ # wifi_enabled
+ (self.call.adb.Shell('dumpsys wifi'), 'stuff\nmore stuff\n'),
+ # wifi_enabled
+ (self.call.adb.Shell('dumpsys wifi'), self.TimeoutError())):
+ with self.assertRaises(device_errors.CommandTimeoutError):
+ self.device.WaitUntilFullyBooted(wifi=True)
+
+
+@mock.patch('time.sleep', mock.Mock())
+class DeviceUtilsRebootTest(DeviceUtilsTest):
+
+ def testReboot_nonBlocking(self):
+ with self.assertCalls(
+ self.call.adb.Reboot(),
+ (self.call.device.IsOnline(), True),
+ (self.call.device.IsOnline(), False)):
+ self.device.Reboot(block=False)
+
+ def testReboot_blocking(self):
+ with self.assertCalls(
+ self.call.adb.Reboot(),
+ (self.call.device.IsOnline(), True),
+ (self.call.device.IsOnline(), False),
+ self.call.device.WaitUntilFullyBooted(wifi=False)):
+ self.device.Reboot(block=True)
+
+ def testReboot_blockUntilWifi(self):
+ with self.assertCalls(
+ self.call.adb.Reboot(),
+ (self.call.device.IsOnline(), True),
+ (self.call.device.IsOnline(), False),
+ self.call.device.WaitUntilFullyBooted(wifi=True)):
+ self.device.Reboot(block=True, wifi=True)
+
+
+class DeviceUtilsInstallTest(DeviceUtilsTest):
+
+ mock_apk = _MockApkHelper('/fake/test/app.apk', 'test.package', ['p1'])
+
+ def testInstall_noPriorInstall(self):
+ with self.patch_call(self.call.device.build_version_sdk, return_value=23):
+ with self.assertCalls(
+ (mock.call.os.path.exists('/fake/test/app.apk'), True),
+ (self.call.device._GetApplicationPathsInternal('test.package'), []),
+ self.call.adb.Install('/fake/test/app.apk', reinstall=False,
+ allow_downgrade=False),
+ (self.call.device.GrantPermissions('test.package', ['p1']), [])):
+ self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0)
+
+ def testInstall_permissionsPreM(self):
+ with self.patch_call(self.call.device.build_version_sdk, return_value=20):
+ with self.assertCalls(
+ (mock.call.os.path.exists('/fake/test/app.apk'), True),
+ (self.call.device._GetApplicationPathsInternal('test.package'), []),
+ (self.call.adb.Install('/fake/test/app.apk', reinstall=False,
+ allow_downgrade=False))):
+ self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0)
+
+ def testInstall_findPermissions(self):
+ with self.patch_call(self.call.device.build_version_sdk, return_value=23):
+ with self.assertCalls(
+ (mock.call.os.path.exists('/fake/test/app.apk'), True),
+ (self.call.device._GetApplicationPathsInternal('test.package'), []),
+ (self.call.adb.Install('/fake/test/app.apk', reinstall=False,
+ allow_downgrade=False)),
+ (self.call.device.GrantPermissions('test.package', ['p1']), [])):
+ self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0)
+
+ def testInstall_passPermissions(self):
+ with self.assertCalls(
+ (mock.call.os.path.exists('/fake/test/app.apk'), True),
+ (self.call.device._GetApplicationPathsInternal('test.package'), []),
+ (self.call.adb.Install('/fake/test/app.apk', reinstall=False,
+ allow_downgrade=False)),
+ (self.call.device.GrantPermissions('test.package', ['p1', 'p2']), [])):
+ self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0,
+ permissions=['p1', 'p2'])
+
+ def testInstall_differentPriorInstall(self):
+ with self.assertCalls(
+ (mock.call.os.path.exists('/fake/test/app.apk'), True),
+ (self.call.device._GetApplicationPathsInternal('test.package'),
+ ['/fake/data/app/test.package.apk']),
+ (self.call.device._ComputeStaleApks('test.package',
+ ['/fake/test/app.apk']),
+ (['/fake/test/app.apk'], None)),
+ self.call.device.Uninstall('test.package'),
+ self.call.adb.Install('/fake/test/app.apk', reinstall=False,
+ allow_downgrade=False)):
+ self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0,
+ permissions=[])
+
+ def testInstall_differentPriorInstall_reinstall(self):
+ with self.assertCalls(
+ (mock.call.os.path.exists('/fake/test/app.apk'), True),
+ (self.call.device._GetApplicationPathsInternal('test.package'),
+ ['/fake/data/app/test.package.apk']),
+ (self.call.device._ComputeStaleApks('test.package',
+ ['/fake/test/app.apk']),
+ (['/fake/test/app.apk'], None)),
+ self.call.adb.Install('/fake/test/app.apk', reinstall=True,
+ allow_downgrade=False)):
+ self.device.Install(DeviceUtilsInstallTest.mock_apk,
+ reinstall=True, retries=0, permissions=[])
+
+ def testInstall_identicalPriorInstall_reinstall(self):
+ with self.assertCalls(
+ (mock.call.os.path.exists('/fake/test/app.apk'), True),
+ (self.call.device._GetApplicationPathsInternal('test.package'),
+ ['/fake/data/app/test.package.apk']),
+ (self.call.device._ComputeStaleApks('test.package',
+ ['/fake/test/app.apk']),
+ ([], None)),
+ (self.call.device.ForceStop('test.package'))):
+ self.device.Install(DeviceUtilsInstallTest.mock_apk,
+ reinstall=True, retries=0, permissions=[])
+
+ def testInstall_missingApk(self):
+ with self.assertCalls(
+ (mock.call.os.path.exists('/fake/test/app.apk'), False)):
+ with self.assertRaises(device_errors.CommandFailedError):
+ self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0)
+
+ def testInstall_fails(self):
+ with self.assertCalls(
+ (mock.call.os.path.exists('/fake/test/app.apk'), True),
+ (self.call.device._GetApplicationPathsInternal('test.package'), []),
+ (self.call.adb.Install('/fake/test/app.apk', reinstall=False,
+ allow_downgrade=False),
+ self.CommandError('Failure\r\n'))):
+ with self.assertRaises(device_errors.CommandFailedError):
+ self.device.Install(DeviceUtilsInstallTest.mock_apk, retries=0)
+
+ def testInstall_downgrade(self):
+ with self.assertCalls(
+ (mock.call.os.path.exists('/fake/test/app.apk'), True),
+ (self.call.device._GetApplicationPathsInternal('test.package'),
+ ['/fake/data/app/test.package.apk']),
+ (self.call.device._ComputeStaleApks('test.package',
+ ['/fake/test/app.apk']),
+ (['/fake/test/app.apk'], None)),
+ self.call.adb.Install('/fake/test/app.apk', reinstall=True,
+ allow_downgrade=True)):
+ self.device.Install(DeviceUtilsInstallTest.mock_apk,
+ reinstall=True, retries=0, permissions=[], allow_downgrade=True)
+
+
+class DeviceUtilsInstallSplitApkTest(DeviceUtilsTest):
+
+ mock_apk = _MockApkHelper('base.apk', 'test.package', ['p1'])
+
+ def testInstallSplitApk_noPriorInstall(self):
+ with self.assertCalls(
+ (self.call.device._CheckSdkLevel(21)),
+ (mock.call.devil.android.sdk.split_select.SelectSplits(
+ self.device, 'base.apk',
+ ['split1.apk', 'split2.apk', 'split3.apk'],
+ allow_cached_props=False),
+ ['split2.apk']),
+ (mock.call.os.path.exists('base.apk'), True),
+ (mock.call.os.path.exists('split2.apk'), True),
+ (self.call.device._GetApplicationPathsInternal('test.package'), []),
+ (self.call.adb.InstallMultiple(
+ ['base.apk', 'split2.apk'], partial=None, reinstall=False,
+ allow_downgrade=False))):
+ self.device.InstallSplitApk(DeviceUtilsInstallSplitApkTest.mock_apk,
+ ['split1.apk', 'split2.apk', 'split3.apk'], permissions=[], retries=0)
+
+ def testInstallSplitApk_partialInstall(self):
+ with self.assertCalls(
+ (self.call.device._CheckSdkLevel(21)),
+ (mock.call.devil.android.sdk.split_select.SelectSplits(
+ self.device, 'base.apk',
+ ['split1.apk', 'split2.apk', 'split3.apk'],
+ allow_cached_props=False),
+ ['split2.apk']),
+ (mock.call.os.path.exists('base.apk'), True),
+ (mock.call.os.path.exists('split2.apk'), True),
+ (self.call.device._GetApplicationPathsInternal('test.package'),
+ ['base-on-device.apk', 'split2-on-device.apk']),
+ (self.call.device._ComputeStaleApks('test.package',
+ ['base.apk', 'split2.apk']),
+ (['split2.apk'], None)),
+ (self.call.adb.InstallMultiple(
+ ['split2.apk'], partial='test.package', reinstall=True,
+ allow_downgrade=False))):
+ self.device.InstallSplitApk(DeviceUtilsInstallSplitApkTest.mock_apk,
+ ['split1.apk', 'split2.apk', 'split3.apk'],
+ reinstall=True, permissions=[], retries=0)
+
+ def testInstallSplitApk_downgrade(self):
+ with self.assertCalls(
+ (self.call.device._CheckSdkLevel(21)),
+ (mock.call.devil.android.sdk.split_select.SelectSplits(
+ self.device, 'base.apk',
+ ['split1.apk', 'split2.apk', 'split3.apk'],
+ allow_cached_props=False),
+ ['split2.apk']),
+ (mock.call.os.path.exists('base.apk'), True),
+ (mock.call.os.path.exists('split2.apk'), True),
+ (self.call.device._GetApplicationPathsInternal('test.package'),
+ ['base-on-device.apk', 'split2-on-device.apk']),
+ (self.call.device._ComputeStaleApks('test.package',
+ ['base.apk', 'split2.apk']),
+ (['split2.apk'], None)),
+ (self.call.adb.InstallMultiple(
+ ['split2.apk'], partial='test.package', reinstall=True,
+ allow_downgrade=True))):
+ self.device.InstallSplitApk(DeviceUtilsInstallSplitApkTest.mock_apk,
+ ['split1.apk', 'split2.apk', 'split3.apk'],
+ reinstall=True, permissions=[], retries=0,
+ allow_downgrade=True)
+
+ def testInstallSplitApk_missingSplit(self):
+ with self.assertCalls(
+ (self.call.device._CheckSdkLevel(21)),
+ (mock.call.devil.android.sdk.split_select.SelectSplits(
+ self.device, 'base.apk',
+ ['split1.apk', 'split2.apk', 'split3.apk'],
+ allow_cached_props=False),
+ ['split2.apk']),
+ (mock.call.os.path.exists('base.apk'), True),
+ (mock.call.os.path.exists('split2.apk'), False)):
+ with self.assertRaises(device_errors.CommandFailedError):
+ self.device.InstallSplitApk(DeviceUtilsInstallSplitApkTest.mock_apk,
+ ['split1.apk', 'split2.apk', 'split3.apk'], permissions=[],
+ retries=0)
+
+
+class DeviceUtilsUninstallTest(DeviceUtilsTest):
+
+ def testUninstall_callsThrough(self):
+ with self.assertCalls(
+ (self.call.device._GetApplicationPathsInternal('test.package'),
+ ['/path.apk']),
+ self.call.adb.Uninstall('test.package', True)):
+ self.device.Uninstall('test.package', True)
+
+ def testUninstall_noop(self):
+ with self.assertCalls(
+ (self.call.device._GetApplicationPathsInternal('test.package'), [])):
+ self.device.Uninstall('test.package', True)
+
+
+class DeviceUtilsSuTest(DeviceUtilsTest):
+
+ def testSu_preM(self):
+ with self.patch_call(
+ self.call.device.build_version_sdk,
+ return_value=version_codes.LOLLIPOP_MR1):
+ self.assertEquals('su -c foo', self.device._Su('foo'))
+
+ def testSu_mAndAbove(self):
+ with self.patch_call(
+ self.call.device.build_version_sdk,
+ return_value=version_codes.MARSHMALLOW):
+ self.assertEquals('su 0 foo', self.device._Su('foo'))
+
+
+class DeviceUtilsRunShellCommandTest(DeviceUtilsTest):
+
+ def setUp(self):
+ super(DeviceUtilsRunShellCommandTest, self).setUp()
+ self.device.NeedsSU = mock.Mock(return_value=False)
+
+ def testRunShellCommand_commandAsList(self):
+ with self.assertCall(self.call.adb.Shell('pm list packages'), ''):
+ self.device.RunShellCommand(
+ ['pm', 'list', 'packages'], check_return=True)
+
+ def testRunShellCommand_commandAsListQuoted(self):
+ with self.assertCall(self.call.adb.Shell("echo 'hello world' '$10'"), ''):
+ self.device.RunShellCommand(
+ ['echo', 'hello world', '$10'], check_return=True)
+
+ def testRunShellCommand_commandAsString(self):
+ with self.assertCall(self.call.adb.Shell('echo "$VAR"'), ''):
+ self.device.RunShellCommand(
+ 'echo "$VAR"', shell=True, check_return=True)
+
+ def testNewRunShellImpl_withEnv(self):
+ with self.assertCall(
+ self.call.adb.Shell('VAR=some_string echo "$VAR"'), ''):
+ self.device.RunShellCommand(
+ 'echo "$VAR"', shell=True, check_return=True,
+ env={'VAR': 'some_string'})
+
+ def testNewRunShellImpl_withEnvQuoted(self):
+ with self.assertCall(
+ self.call.adb.Shell('PATH="$PATH:/other/path" run_this'), ''):
+ self.device.RunShellCommand(
+ ['run_this'], check_return=True, env={'PATH': '$PATH:/other/path'})
+
+ def testNewRunShellImpl_withEnv_failure(self):
+ with self.assertRaises(KeyError):
+ self.device.RunShellCommand(
+ ['some_cmd'], check_return=True, env={'INVALID NAME': 'value'})
+
+ def testNewRunShellImpl_withCwd(self):
+ with self.assertCall(self.call.adb.Shell('cd /some/test/path && ls'), ''):
+ self.device.RunShellCommand(
+ ['ls'], check_return=True, cwd='/some/test/path')
+
+ def testNewRunShellImpl_withCwdQuoted(self):
+ with self.assertCall(
+ self.call.adb.Shell("cd '/some test/path with/spaces' && ls"), ''):
+ self.device.RunShellCommand(
+ ['ls'], check_return=True, cwd='/some test/path with/spaces')
+
+ def testRunShellCommand_withHugeCmd(self):
+ payload = 'hi! ' * 1024
+ expected_cmd = "echo '%s'" % payload
+ with self.assertCalls(
+ (mock.call.devil.android.device_temp_file.DeviceTempFile(
+ self.adb, suffix='.sh'), MockTempFile('/sdcard/temp-123.sh')),
+ self.call.device._WriteFileWithPush('/sdcard/temp-123.sh', expected_cmd),
+ (self.call.adb.Shell('sh /sdcard/temp-123.sh'), payload + '\n')):
+ self.assertEquals(
+ [payload],
+ self.device.RunShellCommand(['echo', payload], check_return=True))
+
+ def testRunShellCommand_withHugeCmdAndSu(self):
+ payload = 'hi! ' * 1024
+ expected_cmd_without_su = """sh -c 'echo '"'"'%s'"'"''""" % payload
+ expected_cmd = 'su -c %s' % expected_cmd_without_su
+ with self.assertCalls(
+ (self.call.device.NeedsSU(), True),
+ (self.call.device._Su(expected_cmd_without_su), expected_cmd),
+ (mock.call.devil.android.device_temp_file.DeviceTempFile(
+ self.adb, suffix='.sh'), MockTempFile('/sdcard/temp-123.sh')),
+ self.call.device._WriteFileWithPush('/sdcard/temp-123.sh', expected_cmd),
+ (self.call.adb.Shell('sh /sdcard/temp-123.sh'), payload + '\n')):
+ self.assertEquals(
+ [payload],
+ self.device.RunShellCommand(
+ ['echo', payload], check_return=True, as_root=True))
+
+ def testRunShellCommand_withSu(self):
+ expected_cmd_without_su = "sh -c 'setprop service.adb.root 0'"
+ expected_cmd = 'su -c %s' % expected_cmd_without_su
+ with self.assertCalls(
+ (self.call.device.NeedsSU(), True),
+ (self.call.device._Su(expected_cmd_without_su), expected_cmd),
+ (self.call.adb.Shell(expected_cmd), '')):
+ self.device.RunShellCommand(
+ ['setprop', 'service.adb.root', '0'],
+ check_return=True, as_root=True)
+
+ def testRunShellCommand_withRunAs(self):
+ expected_cmd_without_run_as = "sh -c 'mkdir -p files'"
+ expected_cmd = (
+ 'run-as org.devil.test_package %s' % expected_cmd_without_run_as)
+ with self.assertCall(self.call.adb.Shell(expected_cmd), ''):
+ self.device.RunShellCommand(
+ ['mkdir', '-p', 'files'],
+ check_return=True, run_as='org.devil.test_package')
+
+ def testRunShellCommand_withRunAsAndSu(self):
+ expected_cmd_with_nothing = "sh -c 'mkdir -p files'"
+ expected_cmd_with_run_as = (
+ 'run-as org.devil.test_package %s' % expected_cmd_with_nothing)
+ expected_cmd_without_su = (
+ 'sh -c %s' % cmd_helper.SingleQuote(expected_cmd_with_run_as))
+ expected_cmd = 'su -c %s' % expected_cmd_without_su
+ with self.assertCalls(
+ (self.call.device.NeedsSU(), True),
+ (self.call.device._Su(expected_cmd_without_su), expected_cmd),
+ (self.call.adb.Shell(expected_cmd), '')):
+ self.device.RunShellCommand(
+ ['mkdir', '-p', 'files'],
+ check_return=True, run_as='org.devil.test_package',
+ as_root=True)
+
+ def testRunShellCommand_manyLines(self):
+ cmd = 'ls /some/path'
+ with self.assertCall(self.call.adb.Shell(cmd), 'file1\nfile2\nfile3\n'):
+ self.assertEquals(
+ ['file1', 'file2', 'file3'],
+ self.device.RunShellCommand(cmd.split(), check_return=True))
+
+ def testRunShellCommand_manyLinesRawOutput(self):
+ cmd = 'ls /some/path'
+ with self.assertCall(self.call.adb.Shell(cmd), '\rfile1\nfile2\r\nfile3\n'):
+ self.assertEquals(
+ '\rfile1\nfile2\r\nfile3\n',
+ self.device.RunShellCommand(
+ cmd.split(), check_return=True, raw_output=True))
+
+ def testRunShellCommand_singleLine_success(self):
+ cmd = 'echo $VALUE'
+ with self.assertCall(self.call.adb.Shell(cmd), 'some value\n'):
+ self.assertEquals(
+ 'some value',
+ self.device.RunShellCommand(
+ cmd, shell=True, check_return=True, single_line=True))
+
+ def testRunShellCommand_singleLine_successEmptyLine(self):
+ cmd = 'echo $VALUE'
+ with self.assertCall(self.call.adb.Shell(cmd), '\n'):
+ self.assertEquals(
+ '',
+ self.device.RunShellCommand(
+ cmd, shell=True, check_return=True, single_line=True))
+
+ def testRunShellCommand_singleLine_successWithoutEndLine(self):
+ cmd = 'echo -n $VALUE'
+ with self.assertCall(self.call.adb.Shell(cmd), 'some value'):
+ self.assertEquals(
+ 'some value',
+ self.device.RunShellCommand(
+ cmd, shell=True, check_return=True, single_line=True))
+
+ def testRunShellCommand_singleLine_successNoOutput(self):
+ cmd = 'echo -n $VALUE'
+ with self.assertCall(self.call.adb.Shell(cmd), ''):
+ self.assertEquals(
+ '',
+ self.device.RunShellCommand(
+ cmd, shell=True, check_return=True, single_line=True))
+
+ def testRunShellCommand_singleLine_failTooManyLines(self):
+ cmd = 'echo $VALUE'
+ with self.assertCall(self.call.adb.Shell(cmd),
+ 'some value\nanother value\n'):
+ with self.assertRaises(device_errors.CommandFailedError):
+ self.device.RunShellCommand(
+ cmd, shell=True, check_return=True, single_line=True)
+
+ def testRunShellCommand_checkReturn_success(self):
+ cmd = 'echo $ANDROID_DATA'
+ output = '/data\n'
+ with self.assertCall(self.call.adb.Shell(cmd), output):
+ self.assertEquals(
+ [output.rstrip()],
+ self.device.RunShellCommand(cmd, shell=True, check_return=True))
+
+ def testRunShellCommand_checkReturn_failure(self):
+ cmd = 'ls /root'
+ output = 'opendir failed, Permission denied\n'
+ with self.assertCall(self.call.adb.Shell(cmd), self.ShellError(output)):
+ with self.assertRaises(device_errors.AdbCommandFailedError):
+ self.device.RunShellCommand(cmd.split(), check_return=True)
+
+ def testRunShellCommand_checkReturn_disabled(self):
+ cmd = 'ls /root'
+ output = 'opendir failed, Permission denied\n'
+ with self.assertCall(self.call.adb.Shell(cmd), self.ShellError(output)):
+ self.assertEquals(
+ [output.rstrip()],
+ self.device.RunShellCommand(cmd.split(), check_return=False))
+
+ def testRunShellCommand_largeOutput_enabled(self):
+ cmd = 'echo $VALUE'
+ temp_file = MockTempFile('/sdcard/temp-123')
+ cmd_redirect = '( %s )>%s' % (cmd, temp_file.name)
+ with self.assertCalls(
+ (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb),
+ temp_file),
+ (self.call.adb.Shell(cmd_redirect)),
+ (self.call.device.ReadFile(temp_file.name, force_pull=True),
+ 'something')):
+ self.assertEquals(
+ ['something'],
+ self.device.RunShellCommand(
+ cmd, shell=True, large_output=True, check_return=True))
+
+ def testRunShellCommand_largeOutput_disabledNoTrigger(self):
+ cmd = 'something'
+ with self.assertCall(self.call.adb.Shell(cmd), self.ShellError('')):
+ with self.assertRaises(device_errors.AdbCommandFailedError):
+ self.device.RunShellCommand([cmd], check_return=True)
+
+ def testRunShellCommand_largeOutput_disabledTrigger(self):
+ cmd = 'echo $VALUE'
+ temp_file = MockTempFile('/sdcard/temp-123')
+ cmd_redirect = '( %s )>%s' % (cmd, temp_file.name)
+ with self.assertCalls(
+ (self.call.adb.Shell(cmd), self.ShellError('', None)),
+ (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb),
+ temp_file),
+ (self.call.adb.Shell(cmd_redirect)),
+ (self.call.device.ReadFile(mock.ANY, force_pull=True),
+ 'something')):
+ self.assertEquals(
+ ['something'],
+ self.device.RunShellCommand(cmd, shell=True, check_return=True))
+
+
+class DeviceUtilsRunPipedShellCommandTest(DeviceUtilsTest):
+
+ def testRunPipedShellCommand_success(self):
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ 'ps | grep foo; echo "PIPESTATUS: ${PIPESTATUS[@]}"',
+ shell=True, check_return=True),
+ ['This line contains foo', 'PIPESTATUS: 0 0']):
+ self.assertEquals(['This line contains foo'],
+ self.device._RunPipedShellCommand('ps | grep foo'))
+
+ def testRunPipedShellCommand_firstCommandFails(self):
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ 'ps | grep foo; echo "PIPESTATUS: ${PIPESTATUS[@]}"',
+ shell=True, check_return=True),
+ ['PIPESTATUS: 1 0']):
+ with self.assertRaises(device_errors.AdbShellCommandFailedError) as ec:
+ self.device._RunPipedShellCommand('ps | grep foo')
+ self.assertEquals([1, 0], ec.exception.status)
+
+ def testRunPipedShellCommand_secondCommandFails(self):
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ 'ps | grep foo; echo "PIPESTATUS: ${PIPESTATUS[@]}"',
+ shell=True, check_return=True),
+ ['PIPESTATUS: 0 1']):
+ with self.assertRaises(device_errors.AdbShellCommandFailedError) as ec:
+ self.device._RunPipedShellCommand('ps | grep foo')
+ self.assertEquals([0, 1], ec.exception.status)
+
+ def testRunPipedShellCommand_outputCutOff(self):
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ 'ps | grep foo; echo "PIPESTATUS: ${PIPESTATUS[@]}"',
+ shell=True, check_return=True),
+ ['foo.bar'] * 256 + ['foo.ba']):
+ with self.assertRaises(device_errors.AdbShellCommandFailedError) as ec:
+ self.device._RunPipedShellCommand('ps | grep foo')
+ self.assertIs(None, ec.exception.status)
+
+
+@mock.patch('time.sleep', mock.Mock())
+class DeviceUtilsKillAllTest(DeviceUtilsTest):
+
+ def testKillAll_noMatchingProcessesFailure(self):
+ with self.assertCall(self.call.device.GetPids('test_process'), {}):
+ with self.assertRaises(device_errors.CommandFailedError):
+ self.device.KillAll('test_process')
+
+ def testKillAll_noMatchingProcessesQuiet(self):
+ with self.assertCall(self.call.device.GetPids('test_process'), {}):
+ self.assertEqual(0, self.device.KillAll('test_process', quiet=True))
+
+ def testKillAll_nonblocking(self):
+ with self.assertCalls(
+ (self.call.device.GetPids('some.process'),
+ {'some.process': ['1234'], 'some.processing.thing': ['5678']}),
+ (self.call.adb.Shell('kill -9 1234 5678'), '')):
+ self.assertEquals(
+ 2, self.device.KillAll('some.process', blocking=False))
+
+ def testKillAll_blocking(self):
+ with self.assertCalls(
+ (self.call.device.GetPids('some.process'),
+ {'some.process': ['1234'], 'some.processing.thing': ['5678']}),
+ (self.call.adb.Shell('kill -9 1234 5678'), ''),
+ (self.call.device.GetPids('some.process'),
+ {'some.processing.thing': ['5678']}),
+ (self.call.device.GetPids('some.process'),
+ {'some.process': ['1111']})): # Other instance with different pid.
+ self.assertEquals(
+ 2, self.device.KillAll('some.process', blocking=True))
+
+ def testKillAll_exactNonblocking(self):
+ with self.assertCalls(
+ (self.call.device.GetPids('some.process'),
+ {'some.process': ['1234'], 'some.processing.thing': ['5678']}),
+ (self.call.adb.Shell('kill -9 1234'), '')):
+ self.assertEquals(
+ 1, self.device.KillAll('some.process', exact=True, blocking=False))
+
+ def testKillAll_exactBlocking(self):
+ with self.assertCalls(
+ (self.call.device.GetPids('some.process'),
+ {'some.process': ['1234'], 'some.processing.thing': ['5678']}),
+ (self.call.adb.Shell('kill -9 1234'), ''),
+ (self.call.device.GetPids('some.process'),
+ {'some.process': ['1234'], 'some.processing.thing': ['5678']}),
+ (self.call.device.GetPids('some.process'),
+ {'some.processing.thing': ['5678']})):
+ self.assertEquals(
+ 1, self.device.KillAll('some.process', exact=True, blocking=True))
+
+ def testKillAll_root(self):
+ with self.assertCalls(
+ (self.call.device.GetPids('some.process'), {'some.process': ['1234']}),
+ (self.call.device.NeedsSU(), True),
+ (self.call.device._Su("sh -c 'kill -9 1234'"),
+ "su -c sh -c 'kill -9 1234'"),
+ (self.call.adb.Shell("su -c sh -c 'kill -9 1234'"), '')):
+ self.assertEquals(
+ 1, self.device.KillAll('some.process', as_root=True))
+
+ def testKillAll_sigterm(self):
+ with self.assertCalls(
+ (self.call.device.GetPids('some.process'),
+ {'some.process': ['1234']}),
+ (self.call.adb.Shell('kill -15 1234'), '')):
+ self.assertEquals(
+ 1, self.device.KillAll('some.process', signum=device_signal.SIGTERM))
+
+ def testKillAll_multipleInstances(self):
+ with self.assertCalls(
+ (self.call.device.GetPids('some.process'),
+ {'some.process': ['1234', '4567']}),
+ (self.call.adb.Shell('kill -15 1234 4567'), '')):
+ self.assertEquals(
+ 2, self.device.KillAll('some.process', signum=device_signal.SIGTERM))
+
+
+class DeviceUtilsStartActivityTest(DeviceUtilsTest):
+
+ def testStartActivity_actionOnly(self):
+ test_intent = intent.Intent(action='android.intent.action.VIEW')
+ with self.assertCall(
+ self.call.adb.Shell('am start '
+ '-a android.intent.action.VIEW'),
+ 'Starting: Intent { act=android.intent.action.VIEW }'):
+ self.device.StartActivity(test_intent)
+
+ def testStartActivity_success(self):
+ test_intent = intent.Intent(action='android.intent.action.VIEW',
+ package='test.package',
+ activity='.Main')
+ with self.assertCall(
+ self.call.adb.Shell('am start '
+ '-a android.intent.action.VIEW '
+ '-n test.package/.Main'),
+ 'Starting: Intent { act=android.intent.action.VIEW }'):
+ self.device.StartActivity(test_intent)
+
+ def testStartActivity_failure(self):
+ test_intent = intent.Intent(action='android.intent.action.VIEW',
+ package='test.package',
+ activity='.Main')
+ with self.assertCall(
+ self.call.adb.Shell('am start '
+ '-a android.intent.action.VIEW '
+ '-n test.package/.Main'),
+ 'Error: Failed to start test activity'):
+ with self.assertRaises(device_errors.CommandFailedError):
+ self.device.StartActivity(test_intent)
+
+ def testStartActivity_blocking(self):
+ test_intent = intent.Intent(action='android.intent.action.VIEW',
+ package='test.package',
+ activity='.Main')
+ with self.assertCall(
+ self.call.adb.Shell('am start '
+ '-W '
+ '-a android.intent.action.VIEW '
+ '-n test.package/.Main'),
+ 'Starting: Intent { act=android.intent.action.VIEW }'):
+ self.device.StartActivity(test_intent, blocking=True)
+
+ def testStartActivity_withCategory(self):
+ test_intent = intent.Intent(action='android.intent.action.VIEW',
+ package='test.package',
+ activity='.Main',
+ category='android.intent.category.HOME')
+ with self.assertCall(
+ self.call.adb.Shell('am start '
+ '-a android.intent.action.VIEW '
+ '-c android.intent.category.HOME '
+ '-n test.package/.Main'),
+ 'Starting: Intent { act=android.intent.action.VIEW }'):
+ self.device.StartActivity(test_intent)
+
+ def testStartActivity_withMultipleCategories(self):
+ test_intent = intent.Intent(action='android.intent.action.VIEW',
+ package='test.package',
+ activity='.Main',
+ category=['android.intent.category.HOME',
+ 'android.intent.category.BROWSABLE'])
+ with self.assertCall(
+ self.call.adb.Shell('am start '
+ '-a android.intent.action.VIEW '
+ '-c android.intent.category.HOME '
+ '-c android.intent.category.BROWSABLE '
+ '-n test.package/.Main'),
+ 'Starting: Intent { act=android.intent.action.VIEW }'):
+ self.device.StartActivity(test_intent)
+
+ def testStartActivity_withData(self):
+ test_intent = intent.Intent(action='android.intent.action.VIEW',
+ package='test.package',
+ activity='.Main',
+ data='http://www.google.com/')
+ with self.assertCall(
+ self.call.adb.Shell('am start '
+ '-a android.intent.action.VIEW '
+ '-d http://www.google.com/ '
+ '-n test.package/.Main'),
+ 'Starting: Intent { act=android.intent.action.VIEW }'):
+ self.device.StartActivity(test_intent)
+
+ def testStartActivity_withStringExtra(self):
+ test_intent = intent.Intent(action='android.intent.action.VIEW',
+ package='test.package',
+ activity='.Main',
+ extras={'foo': 'test'})
+ with self.assertCall(
+ self.call.adb.Shell('am start '
+ '-a android.intent.action.VIEW '
+ '-n test.package/.Main '
+ '--es foo test'),
+ 'Starting: Intent { act=android.intent.action.VIEW }'):
+ self.device.StartActivity(test_intent)
+
+ def testStartActivity_withBoolExtra(self):
+ test_intent = intent.Intent(action='android.intent.action.VIEW',
+ package='test.package',
+ activity='.Main',
+ extras={'foo': True})
+ with self.assertCall(
+ self.call.adb.Shell('am start '
+ '-a android.intent.action.VIEW '
+ '-n test.package/.Main '
+ '--ez foo True'),
+ 'Starting: Intent { act=android.intent.action.VIEW }'):
+ self.device.StartActivity(test_intent)
+
+ def testStartActivity_withIntExtra(self):
+ test_intent = intent.Intent(action='android.intent.action.VIEW',
+ package='test.package',
+ activity='.Main',
+ extras={'foo': 123})
+ with self.assertCall(
+ self.call.adb.Shell('am start '
+ '-a android.intent.action.VIEW '
+ '-n test.package/.Main '
+ '--ei foo 123'),
+ 'Starting: Intent { act=android.intent.action.VIEW }'):
+ self.device.StartActivity(test_intent)
+
+ def testStartActivity_withTraceFile(self):
+ test_intent = intent.Intent(action='android.intent.action.VIEW',
+ package='test.package',
+ activity='.Main')
+ with self.assertCall(
+ self.call.adb.Shell('am start '
+ '--start-profiler test_trace_file.out '
+ '-a android.intent.action.VIEW '
+ '-n test.package/.Main'),
+ 'Starting: Intent { act=android.intent.action.VIEW }'):
+ self.device.StartActivity(test_intent,
+ trace_file_name='test_trace_file.out')
+
+ def testStartActivity_withForceStop(self):
+ test_intent = intent.Intent(action='android.intent.action.VIEW',
+ package='test.package',
+ activity='.Main')
+ with self.assertCall(
+ self.call.adb.Shell('am start '
+ '-S '
+ '-a android.intent.action.VIEW '
+ '-n test.package/.Main'),
+ 'Starting: Intent { act=android.intent.action.VIEW }'):
+ self.device.StartActivity(test_intent, force_stop=True)
+
+ def testStartActivity_withFlags(self):
+ test_intent = intent.Intent(action='android.intent.action.VIEW',
+ package='test.package',
+ activity='.Main',
+ flags=[
+ intent.FLAG_ACTIVITY_NEW_TASK,
+ intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
+ ])
+ with self.assertCall(
+ self.call.adb.Shell('am start '
+ '-a android.intent.action.VIEW '
+ '-n test.package/.Main '
+ '-f 0x10200000'),
+ 'Starting: Intent { act=android.intent.action.VIEW }'):
+ self.device.StartActivity(test_intent)
+
+
+class DeviceUtilsStartInstrumentationTest(DeviceUtilsTest):
+
+ def testStartInstrumentation_nothing(self):
+ with self.assertCalls(
+ self.call.device.RunShellCommand(
+ 'p=test.package;am instrument "$p"/.TestInstrumentation',
+ shell=True, check_return=True, large_output=True)):
+ self.device.StartInstrumentation(
+ 'test.package/.TestInstrumentation',
+ finish=False, raw=False, extras=None)
+
+ def testStartInstrumentation_finish(self):
+ with self.assertCalls(
+ (self.call.device.RunShellCommand(
+ 'p=test.package;am instrument -w "$p"/.TestInstrumentation',
+ shell=True, check_return=True, large_output=True),
+ ['OK (1 test)'])):
+ output = self.device.StartInstrumentation(
+ 'test.package/.TestInstrumentation',
+ finish=True, raw=False, extras=None)
+ self.assertEquals(['OK (1 test)'], output)
+
+ def testStartInstrumentation_raw(self):
+ with self.assertCalls(
+ self.call.device.RunShellCommand(
+ 'p=test.package;am instrument -r "$p"/.TestInstrumentation',
+ shell=True, check_return=True, large_output=True)):
+ self.device.StartInstrumentation(
+ 'test.package/.TestInstrumentation',
+ finish=False, raw=True, extras=None)
+
+ def testStartInstrumentation_extras(self):
+ with self.assertCalls(
+ self.call.device.RunShellCommand(
+ 'p=test.package;am instrument -e "$p".foo Foo -e bar \'Val \'"$p" '
+ '"$p"/.TestInstrumentation',
+ shell=True, check_return=True, large_output=True)):
+ self.device.StartInstrumentation(
+ 'test.package/.TestInstrumentation',
+ finish=False, raw=False, extras={'test.package.foo': 'Foo',
+ 'bar': 'Val test.package'})
+
+
+class DeviceUtilsBroadcastIntentTest(DeviceUtilsTest):
+
+ def testBroadcastIntent_noExtras(self):
+ test_intent = intent.Intent(action='test.package.with.an.INTENT')
+ with self.assertCall(
+ self.call.adb.Shell('am broadcast -a test.package.with.an.INTENT'),
+ 'Broadcasting: Intent { act=test.package.with.an.INTENT } '):
+ self.device.BroadcastIntent(test_intent)
+
+ def testBroadcastIntent_withExtra(self):
+ test_intent = intent.Intent(action='test.package.with.an.INTENT',
+ extras={'foo': 'bar value'})
+ with self.assertCall(
+ self.call.adb.Shell(
+ "am broadcast -a test.package.with.an.INTENT --es foo 'bar value'"),
+ 'Broadcasting: Intent { act=test.package.with.an.INTENT } '):
+ self.device.BroadcastIntent(test_intent)
+
+ def testBroadcastIntent_withExtra_noValue(self):
+ test_intent = intent.Intent(action='test.package.with.an.INTENT',
+ extras={'foo': None})
+ with self.assertCall(
+ self.call.adb.Shell(
+ 'am broadcast -a test.package.with.an.INTENT --esn foo'),
+ 'Broadcasting: Intent { act=test.package.with.an.INTENT } '):
+ self.device.BroadcastIntent(test_intent)
+
+
+class DeviceUtilsGoHomeTest(DeviceUtilsTest):
+
+ def testGoHome_popupsExist(self):
+ with self.assertCalls(
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'window', 'windows'], check_return=True,
+ large_output=True), []),
+ (self.call.device.RunShellCommand(
+ ['am', 'start', '-W', '-a', 'android.intent.action.MAIN',
+ '-c', 'android.intent.category.HOME'], check_return=True),
+ 'Starting: Intent { act=android.intent.action.MAIN }\r\n'''),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'window', 'windows'], check_return=True,
+ large_output=True), []),
+ (self.call.device.RunShellCommand(
+ ['input', 'keyevent', '66'], check_return=True)),
+ (self.call.device.RunShellCommand(
+ ['input', 'keyevent', '4'], check_return=True)),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'window', 'windows'], check_return=True,
+ large_output=True),
+ ['mCurrentFocus Launcher'])):
+ self.device.GoHome()
+
+ def testGoHome_willRetry(self):
+ with self.assertCalls(
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'window', 'windows'], check_return=True,
+ large_output=True), []),
+ (self.call.device.RunShellCommand(
+ ['am', 'start', '-W', '-a', 'android.intent.action.MAIN',
+ '-c', 'android.intent.category.HOME'], check_return=True),
+ 'Starting: Intent { act=android.intent.action.MAIN }\r\n'''),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'window', 'windows'], check_return=True,
+ large_output=True), []),
+ (self.call.device.RunShellCommand(
+ ['input', 'keyevent', '66'], check_return=True,)),
+ (self.call.device.RunShellCommand(
+ ['input', 'keyevent', '4'], check_return=True)),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'window', 'windows'], check_return=True,
+ large_output=True), []),
+ (self.call.device.RunShellCommand(
+ ['input', 'keyevent', '66'], check_return=True)),
+ (self.call.device.RunShellCommand(
+ ['input', 'keyevent', '4'], check_return=True)),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'window', 'windows'], check_return=True,
+ large_output=True),
+ self.TimeoutError())):
+ with self.assertRaises(device_errors.CommandTimeoutError):
+ self.device.GoHome()
+
+ def testGoHome_alreadyFocused(self):
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ ['dumpsys', 'window', 'windows'], check_return=True,
+ large_output=True),
+ ['mCurrentFocus Launcher']):
+ self.device.GoHome()
+
+ def testGoHome_alreadyFocusedAlternateCase(self):
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ ['dumpsys', 'window', 'windows'], check_return=True,
+ large_output=True),
+ [' mCurrentFocus .launcher/.']):
+ self.device.GoHome()
+
+ def testGoHome_obtainsFocusAfterGoingHome(self):
+ with self.assertCalls(
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'window', 'windows'], check_return=True,
+ large_output=True), []),
+ (self.call.device.RunShellCommand(
+ ['am', 'start', '-W', '-a', 'android.intent.action.MAIN',
+ '-c', 'android.intent.category.HOME'], check_return=True),
+ 'Starting: Intent { act=android.intent.action.MAIN }\r\n'''),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'window', 'windows'], check_return=True,
+ large_output=True),
+ ['mCurrentFocus Launcher'])):
+ self.device.GoHome()
+
+
+class DeviceUtilsForceStopTest(DeviceUtilsTest):
+
+ def testForceStop(self):
+ with self.assertCalls(
+ (self.call.device.GetPids('test.package'), {'test.package': [1111]}),
+ (self.call.device.RunShellCommand(
+ ['am', 'force-stop', 'test.package'],
+ check_return=True),
+ ['Success'])):
+ self.device.ForceStop('test.package')
+
+ def testForceStop_NoProcessFound(self):
+ with self.assertCall(
+ self.call.device.GetPids('test.package'), {}):
+ self.device.ForceStop('test.package')
+
+
+class DeviceUtilsClearApplicationStateTest(DeviceUtilsTest):
+
+ def testClearApplicationState_setPermissions(self):
+ with self.assertCalls(
+ (self.call.device.GetProp('ro.build.version.sdk', cache=True), '17'),
+ (self.call.device._GetApplicationPathsInternal('this.package.exists'),
+ ['/data/app/this.package.exists.apk']),
+ (self.call.device.RunShellCommand(
+ ['pm', 'clear', 'this.package.exists'],
+ check_return=True),
+ ['Success']),
+ (self.call.device.GrantPermissions(
+ 'this.package.exists', ['p1']), [])):
+ self.device.ClearApplicationState(
+ 'this.package.exists', permissions=['p1'])
+
+ def testClearApplicationState_packageDoesntExist(self):
+ with self.assertCalls(
+ (self.call.device.GetProp('ro.build.version.sdk', cache=True), '11'),
+ (self.call.device._GetApplicationPathsInternal('does.not.exist'),
+ [])):
+ self.device.ClearApplicationState('does.not.exist')
+
+ def testClearApplicationState_packageDoesntExistOnAndroidJBMR2OrAbove(self):
+ with self.assertCalls(
+ (self.call.device.GetProp('ro.build.version.sdk', cache=True), '18'),
+ (self.call.device.RunShellCommand(
+ ['pm', 'clear', 'this.package.does.not.exist'],
+ check_return=True),
+ ['Failed'])):
+ self.device.ClearApplicationState('this.package.does.not.exist')
+
+ def testClearApplicationState_packageExists(self):
+ with self.assertCalls(
+ (self.call.device.GetProp('ro.build.version.sdk', cache=True), '17'),
+ (self.call.device._GetApplicationPathsInternal('this.package.exists'),
+ ['/data/app/this.package.exists.apk']),
+ (self.call.device.RunShellCommand(
+ ['pm', 'clear', 'this.package.exists'],
+ check_return=True),
+ ['Success'])):
+ self.device.ClearApplicationState('this.package.exists')
+
+ def testClearApplicationState_packageExistsOnAndroidJBMR2OrAbove(self):
+ with self.assertCalls(
+ (self.call.device.GetProp('ro.build.version.sdk', cache=True), '18'),
+ (self.call.device.RunShellCommand(
+ ['pm', 'clear', 'this.package.exists'],
+ check_return=True),
+ ['Success'])):
+ self.device.ClearApplicationState('this.package.exists')
+
+
+class DeviceUtilsSendKeyEventTest(DeviceUtilsTest):
+
+ def testSendKeyEvent(self):
+ with self.assertCall(self.call.adb.Shell('input keyevent 66'), ''):
+ self.device.SendKeyEvent(66)
+
+
+class DeviceUtilsPushChangedFilesIndividuallyTest(DeviceUtilsTest):
+
+ def testPushChangedFilesIndividually_empty(self):
+ test_files = []
+ with self.assertCalls():
+ self.device._PushChangedFilesIndividually(test_files)
+
+ def testPushChangedFilesIndividually_single(self):
+ test_files = [('/test/host/path', '/test/device/path')]
+ with self.assertCalls(self.call.adb.Push(*test_files[0])):
+ self.device._PushChangedFilesIndividually(test_files)
+
+ def testPushChangedFilesIndividually_multiple(self):
+ test_files = [
+ ('/test/host/path/file1', '/test/device/path/file1'),
+ ('/test/host/path/file2', '/test/device/path/file2')]
+ with self.assertCalls(
+ self.call.adb.Push(*test_files[0]),
+ self.call.adb.Push(*test_files[1])):
+ self.device._PushChangedFilesIndividually(test_files)
+
+
+class DeviceUtilsPushChangedFilesZippedTest(DeviceUtilsTest):
+
+ def testPushChangedFilesZipped_noUnzipCommand(self):
+ test_files = [('/test/host/path/file1', '/test/device/path/file1')]
+ mock_zip_temp = mock.mock_open()
+ mock_zip_temp.return_value.name = '/test/temp/file/tmp.zip'
+ with self.assertCalls(
+ (mock.call.tempfile.NamedTemporaryFile(suffix='.zip'), mock_zip_temp),
+ (mock.call.multiprocessing.Process(
+ target=device_utils.DeviceUtils._CreateDeviceZip,
+ args=('/test/temp/file/tmp.zip', test_files)), mock.Mock()),
+ (self.call.device._MaybeInstallCommands(), False)):
+ self.assertFalse(self.device._PushChangedFilesZipped(test_files,
+ ['/test/dir']))
+
+ def _testPushChangedFilesZipped_spec(self, test_files):
+ mock_zip_temp = mock.mock_open()
+ mock_zip_temp.return_value.name = '/test/temp/file/tmp.zip'
+ with self.assertCalls(
+ (mock.call.tempfile.NamedTemporaryFile(suffix='.zip'), mock_zip_temp),
+ (mock.call.multiprocessing.Process(
+ target=device_utils.DeviceUtils._CreateDeviceZip,
+ args=('/test/temp/file/tmp.zip', test_files)), mock.Mock()),
+ (self.call.device._MaybeInstallCommands(), True),
+ (self.call.device.NeedsSU(), True),
+ (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb,
+ suffix='.zip'),
+ MockTempFile('/test/sdcard/foo123.zip')),
+ self.call.adb.Push(
+ '/test/temp/file/tmp.zip', '/test/sdcard/foo123.zip'),
+ self.call.device.RunShellCommand(
+ 'unzip /test/sdcard/foo123.zip&&chmod -R 777 /test/dir',
+ shell=True, as_root=True,
+ env={'PATH': '/data/local/tmp/bin:$PATH'},
+ check_return=True)):
+ self.assertTrue(self.device._PushChangedFilesZipped(test_files,
+ ['/test/dir']))
+
+ def testPushChangedFilesZipped_single(self):
+ self._testPushChangedFilesZipped_spec(
+ [('/test/host/path/file1', '/test/device/path/file1')])
+
+ def testPushChangedFilesZipped_multiple(self):
+ self._testPushChangedFilesZipped_spec(
+ [('/test/host/path/file1', '/test/device/path/file1'),
+ ('/test/host/path/file2', '/test/device/path/file2')])
+
+
+class DeviceUtilsPathExistsTest(DeviceUtilsTest):
+
+ def testPathExists_pathExists(self):
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ ['test', '-e', '/path/file exists'],
+ as_root=False, check_return=True, timeout=10, retries=0),
+ []):
+ self.assertTrue(self.device.PathExists('/path/file exists'))
+
+ def testPathExists_multiplePathExists(self):
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ ['test', '-e', '/path 1', '-a', '-e', '/path2'],
+ as_root=False, check_return=True, timeout=10, retries=0),
+ []):
+ self.assertTrue(self.device.PathExists(('/path 1', '/path2')))
+
+ def testPathExists_pathDoesntExist(self):
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ ['test', '-e', '/path/file.not.exists'],
+ as_root=False, check_return=True, timeout=10, retries=0),
+ self.ShellError()):
+ self.assertFalse(self.device.PathExists('/path/file.not.exists'))
+
+ def testPathExists_asRoot(self):
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ ['test', '-e', '/root/path/exists'],
+ as_root=True, check_return=True, timeout=10, retries=0),
+ self.ShellError()):
+ self.assertFalse(
+ self.device.PathExists('/root/path/exists', as_root=True))
+
+ def testFileExists_pathDoesntExist(self):
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ ['test', '-e', '/path/file.not.exists'],
+ as_root=False, check_return=True, timeout=10, retries=0),
+ self.ShellError()):
+ self.assertFalse(self.device.FileExists('/path/file.not.exists'))
+
+
+class DeviceUtilsRemovePathTest(DeviceUtilsTest):
+
+ def testRemovePath_regular(self):
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ ['rm', 'some file'], as_root=False, check_return=True),
+ []):
+ self.device.RemovePath('some file')
+
+ def testRemovePath_withForce(self):
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ ['rm', '-f', 'some file'], as_root=False, check_return=True),
+ []):
+ self.device.RemovePath('some file', force=True)
+
+ def testRemovePath_recursively(self):
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ ['rm', '-r', '/remove/this/dir'], as_root=False, check_return=True),
+ []):
+ self.device.RemovePath('/remove/this/dir', recursive=True)
+
+ def testRemovePath_withRoot(self):
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ ['rm', 'some file'], as_root=True, check_return=True),
+ []):
+ self.device.RemovePath('some file', as_root=True)
+
+ def testRemovePath_manyPaths(self):
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ ['rm', 'eeny', 'meeny', 'miny', 'moe'],
+ as_root=False, check_return=True),
+ []):
+ self.device.RemovePath(['eeny', 'meeny', 'miny', 'moe'])
+
+
+class DeviceUtilsPullFileTest(DeviceUtilsTest):
+
+ def testPullFile_existsOnDevice(self):
+ with mock.patch('os.path.exists', return_value=True):
+ with self.assertCall(
+ self.call.adb.Pull('/data/app/test.file.exists',
+ '/test/file/host/path')):
+ self.device.PullFile('/data/app/test.file.exists',
+ '/test/file/host/path')
+
+ def testPullFile_doesntExistOnDevice(self):
+ with mock.patch('os.path.exists', return_value=True):
+ with self.assertCall(
+ self.call.adb.Pull('/data/app/test.file.does.not.exist',
+ '/test/file/host/path'),
+ self.CommandError('remote object does not exist')):
+ with self.assertRaises(device_errors.CommandFailedError):
+ self.device.PullFile('/data/app/test.file.does.not.exist',
+ '/test/file/host/path')
+
+
+class DeviceUtilsReadFileTest(DeviceUtilsTest):
+
+ def testReadFileWithPull_success(self):
+ tmp_host_dir = '/tmp/dir/on.host/'
+ tmp_host = MockTempFile('/tmp/dir/on.host/tmp_ReadFileWithPull')
+ tmp_host.file.read.return_value = 'some interesting contents'
+ with self.assertCalls(
+ (mock.call.tempfile.mkdtemp(), tmp_host_dir),
+ (self.call.adb.Pull('/path/to/device/file', mock.ANY)),
+ (mock.call.__builtin__.open(mock.ANY, 'r'), tmp_host),
+ (mock.call.os.path.exists(tmp_host_dir), True),
+ (mock.call.shutil.rmtree(tmp_host_dir), None)):
+ self.assertEquals('some interesting contents',
+ self.device._ReadFileWithPull('/path/to/device/file'))
+ tmp_host.file.read.assert_called_once_with()
+
+ def testReadFileWithPull_rejected(self):
+ tmp_host_dir = '/tmp/dir/on.host/'
+ with self.assertCalls(
+ (mock.call.tempfile.mkdtemp(), tmp_host_dir),
+ (self.call.adb.Pull('/path/to/device/file', mock.ANY),
+ self.CommandError()),
+ (mock.call.os.path.exists(tmp_host_dir), True),
+ (mock.call.shutil.rmtree(tmp_host_dir), None)):
+ with self.assertRaises(device_errors.CommandFailedError):
+ self.device._ReadFileWithPull('/path/to/device/file')
+
+ def testReadFile_exists(self):
+ with self.assertCalls(
+ (self.call.device.FileSize('/read/this/test/file', as_root=False), 256),
+ (self.call.device.RunShellCommand(
+ ['cat', '/read/this/test/file'],
+ as_root=False, check_return=True),
+ ['this is a test file'])):
+ self.assertEqual('this is a test file\n',
+ self.device.ReadFile('/read/this/test/file'))
+
+ def testReadFile_exists2(self):
+ # Same as testReadFile_exists, but uses Android N ls output.
+ with self.assertCalls(
+ (self.call.device.FileSize('/read/this/test/file', as_root=False), 256),
+ (self.call.device.RunShellCommand(
+ ['cat', '/read/this/test/file'],
+ as_root=False, check_return=True),
+ ['this is a test file'])):
+ self.assertEqual('this is a test file\n',
+ self.device.ReadFile('/read/this/test/file'))
+
+ def testReadFile_doesNotExist(self):
+ with self.assertCall(
+ self.call.device.FileSize('/this/file/does.not.exist', as_root=False),
+ self.CommandError('File does not exist')):
+ with self.assertRaises(device_errors.CommandFailedError):
+ self.device.ReadFile('/this/file/does.not.exist')
+
+ def testReadFile_zeroSize(self):
+ with self.assertCalls(
+ (self.call.device.FileSize('/this/file/has/zero/size', as_root=False),
+ 0),
+ (self.call.device._ReadFileWithPull('/this/file/has/zero/size'),
+ 'but it has contents\n')):
+ self.assertEqual('but it has contents\n',
+ self.device.ReadFile('/this/file/has/zero/size'))
+
+ def testReadFile_withSU(self):
+ with self.assertCalls(
+ (self.call.device.FileSize(
+ '/this/file/can.be.read.with.su', as_root=True), 256),
+ (self.call.device.RunShellCommand(
+ ['cat', '/this/file/can.be.read.with.su'],
+ as_root=True, check_return=True),
+ ['this is a test file', 'read with su'])):
+ self.assertEqual(
+ 'this is a test file\nread with su\n',
+ self.device.ReadFile('/this/file/can.be.read.with.su',
+ as_root=True))
+
+ def testReadFile_withPull(self):
+ contents = 'a' * 123456
+ with self.assertCalls(
+ (self.call.device.FileSize('/read/this/big/test/file', as_root=False),
+ 123456),
+ (self.call.device._ReadFileWithPull('/read/this/big/test/file'),
+ contents)):
+ self.assertEqual(
+ contents, self.device.ReadFile('/read/this/big/test/file'))
+
+ def testReadFile_withPullAndSU(self):
+ contents = 'b' * 123456
+ with self.assertCalls(
+ (self.call.device.FileSize(
+ '/this/big/file/can.be.read.with.su', as_root=True), 123456),
+ (self.call.device.NeedsSU(), True),
+ (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb),
+ MockTempFile('/sdcard/tmp/on.device')),
+ self.call.device.RunShellCommand(
+ 'SRC=/this/big/file/can.be.read.with.su DEST=/sdcard/tmp/on.device;'
+ 'cp "$SRC" "$DEST" && chmod 666 "$DEST"',
+ shell=True, as_root=True, check_return=True),
+ (self.call.device._ReadFileWithPull('/sdcard/tmp/on.device'),
+ contents)):
+ self.assertEqual(
+ contents,
+ self.device.ReadFile('/this/big/file/can.be.read.with.su',
+ as_root=True))
+
+ def testReadFile_forcePull(self):
+ contents = 'a' * 123456
+ with self.assertCall(
+ self.call.device._ReadFileWithPull('/read/this/big/test/file'),
+ contents):
+ self.assertEqual(
+ contents,
+ self.device.ReadFile('/read/this/big/test/file', force_pull=True))
+
+
+class DeviceUtilsWriteFileTest(DeviceUtilsTest):
+
+ def testWriteFileWithPush_success(self):
+ tmp_host = MockTempFile('/tmp/file/on.host')
+ contents = 'some interesting contents'
+ with self.assertCalls(
+ (mock.call.tempfile.NamedTemporaryFile(), tmp_host),
+ self.call.adb.Push('/tmp/file/on.host', '/path/to/device/file')):
+ self.device._WriteFileWithPush('/path/to/device/file', contents)
+ tmp_host.file.write.assert_called_once_with(contents)
+
+ def testWriteFileWithPush_rejected(self):
+ tmp_host = MockTempFile('/tmp/file/on.host')
+ contents = 'some interesting contents'
+ with self.assertCalls(
+ (mock.call.tempfile.NamedTemporaryFile(), tmp_host),
+ (self.call.adb.Push('/tmp/file/on.host', '/path/to/device/file'),
+ self.CommandError())):
+ with self.assertRaises(device_errors.CommandFailedError):
+ self.device._WriteFileWithPush('/path/to/device/file', contents)
+
+ def testWriteFile_withPush(self):
+ contents = 'some large contents ' * 26 # 20 * 26 = 520 chars
+ with self.assertCalls(
+ self.call.device._WriteFileWithPush('/path/to/device/file', contents)):
+ self.device.WriteFile('/path/to/device/file', contents)
+
+ def testWriteFile_withPushForced(self):
+ contents = 'tiny contents'
+ with self.assertCalls(
+ self.call.device._WriteFileWithPush('/path/to/device/file', contents)):
+ self.device.WriteFile('/path/to/device/file', contents, force_push=True)
+
+ def testWriteFile_withPushAndSU(self):
+ contents = 'some large contents ' * 26 # 20 * 26 = 520 chars
+ with self.assertCalls(
+ (self.call.device.NeedsSU(), True),
+ (mock.call.devil.android.device_temp_file.DeviceTempFile(self.adb),
+ MockTempFile('/sdcard/tmp/on.device')),
+ self.call.device._WriteFileWithPush('/sdcard/tmp/on.device', contents),
+ self.call.device.RunShellCommand(
+ ['cp', '/sdcard/tmp/on.device', '/path/to/device/file'],
+ as_root=True, check_return=True)):
+ self.device.WriteFile('/path/to/device/file', contents, as_root=True)
+
+ def testWriteFile_withEcho(self):
+ with self.assertCall(self.call.adb.Shell(
+ "echo -n the.contents > /test/file/to.write"), ''):
+ self.device.WriteFile('/test/file/to.write', 'the.contents')
+
+ def testWriteFile_withEchoAndQuotes(self):
+ with self.assertCall(self.call.adb.Shell(
+ "echo -n 'the contents' > '/test/file/to write'"), ''):
+ self.device.WriteFile('/test/file/to write', 'the contents')
+
+ def testWriteFile_withEchoAndSU(self):
+ expected_cmd_without_su = "sh -c 'echo -n contents > /test/file'"
+ expected_cmd = 'su -c %s' % expected_cmd_without_su
+ with self.assertCalls(
+ (self.call.device.NeedsSU(), True),
+ (self.call.device._Su(expected_cmd_without_su), expected_cmd),
+ (self.call.adb.Shell(expected_cmd),
+ '')):
+ self.device.WriteFile('/test/file', 'contents', as_root=True)
+
+
+class DeviceUtilsStatDirectoryTest(DeviceUtilsTest):
+ # Note: Also tests ListDirectory in testStatDirectory_fileList.
+
+ EXAMPLE_LS_OUTPUT = [
+ 'total 12345',
+ 'drwxr-xr-x 19 root root 0 1970-04-06 18:03 .',
+ 'drwxr-xr-x 19 root root 0 1970-04-06 18:03 ..',
+ 'drwxr-xr-x 6 root root 1970-01-01 00:00 some_dir',
+ '-rw-r--r-- 1 root root 723 1971-01-01 07:04 some_file',
+ '-rw-r----- 1 root root 327 2009-02-13 23:30 My Music File',
+ # Older Android versions do not print st_nlink
+ 'lrwxrwxrwx root root 1970-01-01 00:00 lnk -> /some/path',
+ 'srwxrwx--- system system 2016-05-31 17:25 a_socket1',
+ 'drwxrwxrwt system misc 1970-11-23 02:25 tmp',
+ 'drwxr-s--- system shell 1970-11-23 02:24 my_cmd',
+ 'cr--r----- root system 10, 183 1971-01-01 07:04 random',
+ 'brw------- root root 7, 0 1971-01-01 07:04 block_dev',
+ '-rwS------ root shell 157404 2015-04-13 15:44 silly',
+ ]
+
+ FILENAMES = [
+ 'some_dir', 'some_file', 'My Music File', 'lnk', 'a_socket1',
+ 'tmp', 'my_cmd', 'random', 'block_dev', 'silly']
+
+ def getStatEntries(self, path_given='/', path_listed='/'):
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ ['ls', '-a', '-l', path_listed],
+ check_return=True, as_root=False, env={'TZ': 'utc'}),
+ self.EXAMPLE_LS_OUTPUT):
+ entries = self.device.StatDirectory(path_given)
+ return {f['filename']: f for f in entries}
+
+ def getListEntries(self):
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ ['ls', '-a', '-l', '/'],
+ check_return=True, as_root=False, env={'TZ': 'utc'}),
+ self.EXAMPLE_LS_OUTPUT):
+ return self.device.ListDirectory('/')
+
+ def testStatDirectory_forceTrailingSlash(self):
+ self.getStatEntries(path_given='/foo/bar/', path_listed='/foo/bar/')
+ self.getStatEntries(path_given='/foo/bar', path_listed='/foo/bar/')
+
+ def testStatDirectory_fileList(self):
+ self.assertItemsEqual(self.getStatEntries().keys(), self.FILENAMES)
+ self.assertItemsEqual(self.getListEntries(), self.FILENAMES)
+
+ def testStatDirectory_fileModes(self):
+ expected_modes = (
+ ('some_dir', stat.S_ISDIR),
+ ('some_file', stat.S_ISREG),
+ ('lnk', stat.S_ISLNK),
+ ('a_socket1', stat.S_ISSOCK),
+ ('block_dev', stat.S_ISBLK),
+ ('random', stat.S_ISCHR),
+ )
+ entries = self.getStatEntries()
+ for filename, check in expected_modes:
+ self.assertTrue(check(entries[filename]['st_mode']))
+
+ def testStatDirectory_filePermissions(self):
+ should_have = (
+ ('some_file', stat.S_IWUSR), # Owner can write.
+ ('tmp', stat.S_IXOTH), # Others can execute.
+ ('tmp', stat.S_ISVTX), # Has sticky bit.
+ ('my_cmd', stat.S_ISGID), # Has set-group-ID bit.
+ ('silly', stat.S_ISUID), # Has set UID bit.
+ )
+ should_not_have = (
+ ('some_file', stat.S_IWOTH), # Others can't write.
+ ('block_dev', stat.S_IRGRP), # Group can't read.
+ ('silly', stat.S_IXUSR), # Owner can't execute.
+ )
+ entries = self.getStatEntries()
+ for filename, bit in should_have:
+ self.assertTrue(entries[filename]['st_mode'] & bit)
+ for filename, bit in should_not_have:
+ self.assertFalse(entries[filename]['st_mode'] & bit)
+
+ def testStatDirectory_numHardLinks(self):
+ entries = self.getStatEntries()
+ self.assertEqual(entries['some_dir']['st_nlink'], 6)
+ self.assertEqual(entries['some_file']['st_nlink'], 1)
+ self.assertFalse('st_nlink' in entries['tmp'])
+
+ def testStatDirectory_fileOwners(self):
+ entries = self.getStatEntries()
+ self.assertEqual(entries['some_dir']['st_owner'], 'root')
+ self.assertEqual(entries['my_cmd']['st_owner'], 'system')
+ self.assertEqual(entries['my_cmd']['st_group'], 'shell')
+ self.assertEqual(entries['tmp']['st_group'], 'misc')
+
+ def testStatDirectory_fileSize(self):
+ entries = self.getStatEntries()
+ self.assertEqual(entries['some_file']['st_size'], 723)
+ self.assertEqual(entries['My Music File']['st_size'], 327)
+ # Sizes are sometimes not reported for non-regular files, don't try to
+ # guess the size in those cases.
+ self.assertFalse('st_size' in entries['some_dir'])
+
+ def testStatDirectory_fileDateTime(self):
+ entries = self.getStatEntries()
+ self.assertEqual(entries['some_dir']['st_mtime'], 0) # Epoch!
+ self.assertEqual(entries['My Music File']['st_mtime'], 1234567800)
+
+ def testStatDirectory_deviceType(self):
+ entries = self.getStatEntries()
+ self.assertEqual(entries['random']['st_rdev_pair'], (10, 183))
+ self.assertEqual(entries['block_dev']['st_rdev_pair'], (7, 0))
+
+ def testStatDirectory_symbolicLinks(self):
+ entries = self.getStatEntries()
+ self.assertEqual(entries['lnk']['symbolic_link_to'], '/some/path')
+ for d in entries.itervalues():
+ self.assertEqual('symbolic_link_to' in d, stat.S_ISLNK(d['st_mode']))
+
+
+class DeviceUtilsStatPathTest(DeviceUtilsTest):
+
+ EXAMPLE_DIRECTORY = [
+ {'filename': 'foo.txt', 'st_size': 123, 'st_time': 456},
+ {'filename': 'some_dir', 'st_time': 0}
+ ]
+ INDEX = {e['filename']: e for e in EXAMPLE_DIRECTORY}
+
+ def testStatPath_file(self):
+ with self.assertCall(
+ self.call.device.StatDirectory('/data/local/tmp', as_root=False),
+ self.EXAMPLE_DIRECTORY):
+ self.assertEquals(self.INDEX['foo.txt'],
+ self.device.StatPath('/data/local/tmp/foo.txt'))
+
+ def testStatPath_directory(self):
+ with self.assertCall(
+ self.call.device.StatDirectory('/data/local/tmp', as_root=False),
+ self.EXAMPLE_DIRECTORY):
+ self.assertEquals(self.INDEX['some_dir'],
+ self.device.StatPath('/data/local/tmp/some_dir'))
+
+ def testStatPath_directoryWithTrailingSlash(self):
+ with self.assertCall(
+ self.call.device.StatDirectory('/data/local/tmp', as_root=False),
+ self.EXAMPLE_DIRECTORY):
+ self.assertEquals(self.INDEX['some_dir'],
+ self.device.StatPath('/data/local/tmp/some_dir/'))
+
+ def testStatPath_doesNotExist(self):
+ with self.assertCall(
+ self.call.device.StatDirectory('/data/local/tmp', as_root=False),
+ self.EXAMPLE_DIRECTORY):
+ with self.assertRaises(device_errors.CommandFailedError):
+ self.device.StatPath('/data/local/tmp/does.not.exist.txt')
+
+
+class DeviceUtilsFileSizeTest(DeviceUtilsTest):
+
+ EXAMPLE_DIRECTORY = [
+ {'filename': 'foo.txt', 'st_size': 123, 'st_mtime': 456},
+ {'filename': 'some_dir', 'st_mtime': 0}
+ ]
+
+ def testFileSize_file(self):
+ with self.assertCall(
+ self.call.device.StatDirectory('/data/local/tmp', as_root=False),
+ self.EXAMPLE_DIRECTORY):
+ self.assertEquals(123,
+ self.device.FileSize('/data/local/tmp/foo.txt'))
+
+ def testFileSize_doesNotExist(self):
+ with self.assertCall(
+ self.call.device.StatDirectory('/data/local/tmp', as_root=False),
+ self.EXAMPLE_DIRECTORY):
+ with self.assertRaises(device_errors.CommandFailedError):
+ self.device.FileSize('/data/local/tmp/does.not.exist.txt')
+
+ def testFileSize_directoryWithNoSize(self):
+ with self.assertCall(
+ self.call.device.StatDirectory('/data/local/tmp', as_root=False),
+ self.EXAMPLE_DIRECTORY):
+ with self.assertRaises(device_errors.CommandFailedError):
+ self.device.FileSize('/data/local/tmp/some_dir')
+
+
+class DeviceUtilsSetJavaAssertsTest(DeviceUtilsTest):
+
+ def testSetJavaAsserts_enable(self):
+ with self.assertCalls(
+ (self.call.device.ReadFile(self.device.LOCAL_PROPERTIES_PATH),
+ 'some.example.prop=with an example value\n'
+ 'some.other.prop=value_ok\n'),
+ self.call.device.WriteFile(
+ self.device.LOCAL_PROPERTIES_PATH,
+ 'some.example.prop=with an example value\n'
+ 'some.other.prop=value_ok\n'
+ 'dalvik.vm.enableassertions=all\n'),
+ (self.call.device.GetProp('dalvik.vm.enableassertions'), ''),
+ self.call.device.SetProp('dalvik.vm.enableassertions', 'all')):
+ self.assertTrue(self.device.SetJavaAsserts(True))
+
+ def testSetJavaAsserts_disable(self):
+ with self.assertCalls(
+ (self.call.device.ReadFile(self.device.LOCAL_PROPERTIES_PATH),
+ 'some.example.prop=with an example value\n'
+ 'dalvik.vm.enableassertions=all\n'
+ 'some.other.prop=value_ok\n'),
+ self.call.device.WriteFile(
+ self.device.LOCAL_PROPERTIES_PATH,
+ 'some.example.prop=with an example value\n'
+ 'some.other.prop=value_ok\n'),
+ (self.call.device.GetProp('dalvik.vm.enableassertions'), 'all'),
+ self.call.device.SetProp('dalvik.vm.enableassertions', '')):
+ self.assertTrue(self.device.SetJavaAsserts(False))
+
+ def testSetJavaAsserts_alreadyEnabled(self):
+ with self.assertCalls(
+ (self.call.device.ReadFile(self.device.LOCAL_PROPERTIES_PATH),
+ 'some.example.prop=with an example value\n'
+ 'dalvik.vm.enableassertions=all\n'
+ 'some.other.prop=value_ok\n'),
+ (self.call.device.GetProp('dalvik.vm.enableassertions'), 'all')):
+ self.assertFalse(self.device.SetJavaAsserts(True))
+
+ def testSetJavaAsserts_malformedLocalProp(self):
+ with self.assertCalls(
+ (self.call.device.ReadFile(self.device.LOCAL_PROPERTIES_PATH),
+ 'some.example.prop=with an example value\n'
+ 'malformed_property\n'
+ 'dalvik.vm.enableassertions=all\n'
+ 'some.other.prop=value_ok\n'),
+ (self.call.device.GetProp('dalvik.vm.enableassertions'), 'all')):
+ self.assertFalse(self.device.SetJavaAsserts(True))
+
+
+class DeviceUtilsEnsureCacheInitializedTest(DeviceUtilsTest):
+
+ def testEnsureCacheInitialized_noCache_success(self):
+ self.assertIsNone(self.device._cache['token'])
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ AnyStringWith('getprop'),
+ shell=True, check_return=True, large_output=True),
+ ['/sdcard', 'TOKEN']):
+ self.device._EnsureCacheInitialized()
+ self.assertIsNotNone(self.device._cache['token'])
+
+ def testEnsureCacheInitialized_noCache_failure(self):
+ self.assertIsNone(self.device._cache['token'])
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ AnyStringWith('getprop'),
+ shell=True, check_return=True, large_output=True),
+ self.TimeoutError()):
+ with self.assertRaises(device_errors.CommandTimeoutError):
+ self.device._EnsureCacheInitialized()
+ self.assertIsNone(self.device._cache['token'])
+
+ def testEnsureCacheInitialized_cache(self):
+ self.device._cache['token'] = 'TOKEN'
+ with self.assertCalls():
+ self.device._EnsureCacheInitialized()
+ self.assertIsNotNone(self.device._cache['token'])
+
+
+class DeviceUtilsGetPropTest(DeviceUtilsTest):
+
+ def testGetProp_exists(self):
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ ['getprop', 'test.property'], check_return=True, single_line=True,
+ timeout=self.device._default_timeout,
+ retries=self.device._default_retries),
+ 'property_value'):
+ self.assertEqual('property_value',
+ self.device.GetProp('test.property'))
+
+ def testGetProp_doesNotExist(self):
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ ['getprop', 'property.does.not.exist'],
+ check_return=True, single_line=True,
+ timeout=self.device._default_timeout,
+ retries=self.device._default_retries),
+ ''):
+ self.assertEqual('', self.device.GetProp('property.does.not.exist'))
+
+ def testGetProp_cachedRoProp(self):
+ with self.assertCalls(
+ self.EnsureCacheInitialized(props=['[ro.build.type]: [userdebug]'])):
+ self.assertEqual('userdebug',
+ self.device.GetProp('ro.build.type', cache=True))
+ self.assertEqual('userdebug',
+ self.device.GetProp('ro.build.type', cache=True))
+
+
+class DeviceUtilsSetPropTest(DeviceUtilsTest):
+
+ def testSetProp(self):
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ ['setprop', 'test.property', 'test value'], check_return=True)):
+ self.device.SetProp('test.property', 'test value')
+
+ def testSetProp_check_succeeds(self):
+ with self.assertCalls(
+ (self.call.device.RunShellCommand(
+ ['setprop', 'test.property', 'new_value'], check_return=True)),
+ (self.call.device.GetProp('test.property', cache=False), 'new_value')):
+ self.device.SetProp('test.property', 'new_value', check=True)
+
+ def testSetProp_check_fails(self):
+ with self.assertCalls(
+ (self.call.device.RunShellCommand(
+ ['setprop', 'test.property', 'new_value'], check_return=True)),
+ (self.call.device.GetProp('test.property', cache=False), 'old_value')):
+ with self.assertRaises(device_errors.CommandFailedError):
+ self.device.SetProp('test.property', 'new_value', check=True)
+
+
+class DeviceUtilsGetPidsTest(DeviceUtilsTest):
+ def setUp(self):
+ super(DeviceUtilsGetPidsTest, self).setUp()
+ self.sample_output = [
+ 'USER PID PPID VSIZE RSS WCHAN PC NAME',
+ 'user 1001 100 1024 1024 ffffffff 00000000 one.match',
+ 'user 1002 100 1024 1024 ffffffff 00000000 two.match',
+ 'user 1003 100 1024 1024 ffffffff 00000000 three.match',
+ 'user 1234 100 1024 1024 ffffffff 00000000 my$process',
+ 'user 1000 100 1024 1024 ffffffff 00000000 foo',
+ 'user 1236 100 1024 1024 ffffffff 00000000 foo',
+ ]
+
+ def _grepOutput(self, substring):
+ return [line for line in self.sample_output if substring in line]
+
+ def testGetPids_sdkGreaterThanNougatMR1(self):
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=(version_codes.NOUGAT_MR1 + 1)):
+ with self.patch_call(self.call.device.build_id,
+ return_value='ZZZ99Z'):
+ with self.assertCall(
+ self.call.device._RunPipedShellCommand(
+ 'ps -e | grep -F example.process'), []):
+ self.device.GetPids('example.process')
+
+ def testGetPids_noMatches(self):
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=version_codes.LOLLIPOP):
+ with self.assertCall(
+ self.call.device._RunPipedShellCommand('ps | grep -F does.not.match'),
+ self._grepOutput('does.not.match')):
+ self.assertEqual({}, self.device.GetPids('does.not.match'))
+
+ def testGetPids_oneMatch(self):
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=version_codes.LOLLIPOP):
+ with self.assertCall(
+ self.call.device._RunPipedShellCommand('ps | grep -F one.match'),
+ self._grepOutput('one.match')):
+ self.assertEqual(
+ {'one.match': ['1001']},
+ self.device.GetPids('one.match'))
+
+ def testGetPids_multipleMatches(self):
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=version_codes.LOLLIPOP):
+ with self.assertCall(
+ self.call.device._RunPipedShellCommand('ps | grep -F match'),
+ self._grepOutput('match')):
+ self.assertEqual(
+ {'one.match': ['1001'],
+ 'two.match': ['1002'],
+ 'three.match': ['1003']},
+ self.device.GetPids('match'))
+
+ def testGetPids_quotable(self):
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=version_codes.LOLLIPOP):
+ with self.assertCall(
+ self.call.device._RunPipedShellCommand("ps | grep -F 'my$process'"),
+ self._grepOutput('my$process')):
+ self.assertEqual(
+ {'my$process': ['1234']}, self.device.GetPids('my$process'))
+
+ def testGetPids_multipleInstances(self):
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=version_codes.LOLLIPOP):
+ with self.assertCall(
+ self.call.device._RunPipedShellCommand('ps | grep -F foo'),
+ self._grepOutput('foo')):
+ self.assertEqual(
+ {'foo': ['1000', '1236']},
+ self.device.GetPids('foo'))
+
+ def testGetPids_allProcesses(self):
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=version_codes.LOLLIPOP):
+ with self.assertCall(
+ self.call.device.RunShellCommand(
+ ['ps'], check_return=True, large_output=True),
+ self.sample_output):
+ self.assertEqual(
+ {'one.match': ['1001'],
+ 'two.match': ['1002'],
+ 'three.match': ['1003'],
+ 'my$process': ['1234'],
+ 'foo': ['1000', '1236']},
+ self.device.GetPids())
+
+ def testGetApplicationPids_notFound(self):
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=version_codes.LOLLIPOP):
+ with self.assertCall(
+ self.call.device._RunPipedShellCommand('ps | grep -F match'),
+ self._grepOutput('match')):
+ # No PIDs found, process name should be exact match.
+ self.assertEqual([], self.device.GetApplicationPids('match'))
+
+ def testGetApplicationPids_foundOne(self):
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=version_codes.LOLLIPOP):
+ with self.assertCall(
+ self.call.device._RunPipedShellCommand('ps | grep -F one.match'),
+ self._grepOutput('one.match')):
+ self.assertEqual(['1001'], self.device.GetApplicationPids('one.match'))
+
+ def testGetApplicationPids_foundMany(self):
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=version_codes.LOLLIPOP):
+ with self.assertCall(
+ self.call.device._RunPipedShellCommand('ps | grep -F foo'),
+ self._grepOutput('foo')):
+ self.assertEqual(
+ ['1000', '1236'],
+ self.device.GetApplicationPids('foo'))
+
+ def testGetApplicationPids_atMostOneNotFound(self):
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=version_codes.LOLLIPOP):
+ with self.assertCall(
+ self.call.device._RunPipedShellCommand('ps | grep -F match'),
+ self._grepOutput('match')):
+ # No PIDs found, process name should be exact match.
+ self.assertEqual(
+ None,
+ self.device.GetApplicationPids('match', at_most_one=True))
+
+ def testGetApplicationPids_atMostOneFound(self):
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=version_codes.LOLLIPOP):
+ with self.assertCall(
+ self.call.device._RunPipedShellCommand('ps | grep -F one.match'),
+ self._grepOutput('one.match')):
+ self.assertEqual(
+ '1001',
+ self.device.GetApplicationPids('one.match', at_most_one=True))
+
+ def testGetApplicationPids_atMostOneFoundTooMany(self):
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=version_codes.LOLLIPOP):
+ with self.assertRaises(device_errors.CommandFailedError):
+ with self.assertCall(
+ self.call.device._RunPipedShellCommand('ps | grep -F foo'),
+ self._grepOutput('foo')):
+ self.device.GetApplicationPids('foo', at_most_one=True)
+
+
+class DeviceUtilsGetSetEnforce(DeviceUtilsTest):
+
+ def testGetEnforce_Enforcing(self):
+ with self.assertCall(self.call.adb.Shell('getenforce'), 'Enforcing'):
+ self.assertEqual(True, self.device.GetEnforce())
+
+ def testGetEnforce_Permissive(self):
+ with self.assertCall(self.call.adb.Shell('getenforce'), 'Permissive'):
+ self.assertEqual(False, self.device.GetEnforce())
+
+ def testGetEnforce_Disabled(self):
+ with self.assertCall(self.call.adb.Shell('getenforce'), 'Disabled'):
+ self.assertEqual(None, self.device.GetEnforce())
+
+ def testSetEnforce_Enforcing(self):
+ with self.assertCalls(
+ (self.call.device.NeedsSU(), False),
+ (self.call.adb.Shell('setenforce 1'), '')):
+ self.device.SetEnforce(enabled=True)
+
+ def testSetEnforce_Permissive(self):
+ with self.assertCalls(
+ (self.call.device.NeedsSU(), False),
+ (self.call.adb.Shell('setenforce 0'), '')):
+ self.device.SetEnforce(enabled=False)
+
+ def testSetEnforce_EnforcingWithInt(self):
+ with self.assertCalls(
+ (self.call.device.NeedsSU(), False),
+ (self.call.adb.Shell('setenforce 1'), '')):
+ self.device.SetEnforce(enabled=1)
+
+ def testSetEnforce_PermissiveWithInt(self):
+ with self.assertCalls(
+ (self.call.device.NeedsSU(), False),
+ (self.call.adb.Shell('setenforce 0'), '')):
+ self.device.SetEnforce(enabled=0)
+
+ def testSetEnforce_EnforcingWithStr(self):
+ with self.assertCalls(
+ (self.call.device.NeedsSU(), False),
+ (self.call.adb.Shell('setenforce 1'), '')):
+ self.device.SetEnforce(enabled='1')
+
+ def testSetEnforce_PermissiveWithStr(self):
+ with self.assertCalls(
+ (self.call.device.NeedsSU(), False),
+ (self.call.adb.Shell('setenforce 0'), '')):
+ self.device.SetEnforce(enabled='0') # Not recommended but it works!
+
+
+class DeviceUtilsTakeScreenshotTest(DeviceUtilsTest):
+
+ def testTakeScreenshot_fileNameProvided(self):
+ with self.assertCalls(
+ (mock.call.devil.android.device_temp_file.DeviceTempFile(
+ self.adb, suffix='.png'),
+ MockTempFile('/tmp/path/temp-123.png')),
+ (self.call.adb.Shell('/system/bin/screencap -p /tmp/path/temp-123.png'),
+ ''),
+ self.call.device.PullFile('/tmp/path/temp-123.png',
+ '/test/host/screenshot.png')):
+ self.device.TakeScreenshot('/test/host/screenshot.png')
+
+
+class DeviceUtilsGetMemoryUsageForPidTest(DeviceUtilsTest):
+
+ def setUp(self):
+ super(DeviceUtilsGetMemoryUsageForPidTest, self).setUp()
+
+ def testGetMemoryUsageForPid_validPid(self):
+ with self.assertCalls(
+ (self.call.device._RunPipedShellCommand(
+ 'showmap 1234 | grep TOTAL', as_root=True),
+ ['100 101 102 103 104 105 106 107 TOTAL']),
+ (self.call.device.ReadFile('/proc/1234/status', as_root=True),
+ 'VmHWM: 1024 kB\n')):
+ self.assertEqual(
+ {
+ 'Size': 100,
+ 'Rss': 101,
+ 'Pss': 102,
+ 'Shared_Clean': 103,
+ 'Shared_Dirty': 104,
+ 'Private_Clean': 105,
+ 'Private_Dirty': 106,
+ 'VmHWM': 1024
+ },
+ self.device.GetMemoryUsageForPid(1234))
+
+ def testGetMemoryUsageForPid_noSmaps(self):
+ with self.assertCalls(
+ (self.call.device._RunPipedShellCommand(
+ 'showmap 4321 | grep TOTAL', as_root=True),
+ ['cannot open /proc/4321/smaps: No such file or directory']),
+ (self.call.device.ReadFile('/proc/4321/status', as_root=True),
+ 'VmHWM: 1024 kb\n')):
+ self.assertEquals({'VmHWM': 1024}, self.device.GetMemoryUsageForPid(4321))
+
+ def testGetMemoryUsageForPid_noStatus(self):
+ with self.assertCalls(
+ (self.call.device._RunPipedShellCommand(
+ 'showmap 4321 | grep TOTAL', as_root=True),
+ ['100 101 102 103 104 105 106 107 TOTAL']),
+ (self.call.device.ReadFile('/proc/4321/status', as_root=True),
+ self.CommandError())):
+ self.assertEquals(
+ {
+ 'Size': 100,
+ 'Rss': 101,
+ 'Pss': 102,
+ 'Shared_Clean': 103,
+ 'Shared_Dirty': 104,
+ 'Private_Clean': 105,
+ 'Private_Dirty': 106,
+ },
+ self.device.GetMemoryUsageForPid(4321))
+
+
+class DeviceUtilsDismissCrashDialogIfNeededTest(DeviceUtilsTest):
+
+ def testDismissCrashDialogIfNeeded_crashedPageckageNotFound(self):
+ sample_dumpsys_output = '''
+WINDOW MANAGER WINDOWS (dumpsys window windows)
+ Window #11 Window{f8b647a u0 SearchPanel}:
+ mDisplayId=0 mSession=Session{8 94:122} mClient=android.os.BinderProxy@1ba5
+ mOwnerUid=100 mShowToOwnerOnly=false package=com.android.systemui appop=NONE
+ mAttrs=WM.LayoutParams{(0,0)(fillxfill) gr=#53 sim=#31 ty=2024 fl=100
+ Requested w=1080 h=1920 mLayoutSeq=426
+ mBaseLayer=211000 mSubLayer=0 mAnimLayer=211000+0=211000 mLastLayer=211000
+'''
+ with self.assertCalls(
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'window', 'windows'], check_return=True,
+ large_output=True), sample_dumpsys_output.split('\n'))):
+ package_name = self.device.DismissCrashDialogIfNeeded()
+ self.assertIsNone(package_name)
+
+ def testDismissCrashDialogIfNeeded_crashedPageckageFound(self):
+ sample_dumpsys_output = '''
+WINDOW MANAGER WINDOWS (dumpsys window windows)
+ Window #11 Window{f8b647a u0 SearchPanel}:
+ mDisplayId=0 mSession=Session{8 94:122} mClient=android.os.BinderProxy@1ba5
+ mOwnerUid=102 mShowToOwnerOnly=false package=com.android.systemui appop=NONE
+ mAttrs=WM.LayoutParams{(0,0)(fillxfill) gr=#53 sim=#31 ty=2024 fl=100
+ Requested w=1080 h=1920 mLayoutSeq=426
+ mBaseLayer=211000 mSubLayer=0 mAnimLayer=211000+0=211000 mLastLayer=211000
+ mHasPermanentDpad=false
+ mCurrentFocus=Window{3a27740f u0 Application Error: com.android.chrome}
+ mFocusedApp=AppWindowToken{470af6f token=Token{272ec24e ActivityRecord{t894}}}
+'''
+ with self.assertCalls(
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'window', 'windows'], check_return=True,
+ large_output=True), sample_dumpsys_output.split('\n')),
+ (self.call.device.RunShellCommand(
+ ['input', 'keyevent', '22'], check_return=True)),
+ (self.call.device.RunShellCommand(
+ ['input', 'keyevent', '22'], check_return=True)),
+ (self.call.device.RunShellCommand(
+ ['input', 'keyevent', '66'], check_return=True)),
+ (self.call.device.RunShellCommand(
+ ['dumpsys', 'window', 'windows'], check_return=True,
+ large_output=True), [])):
+ package_name = self.device.DismissCrashDialogIfNeeded()
+ self.assertEqual(package_name, 'com.android.chrome')
+
+
+class DeviceUtilsClientCache(DeviceUtilsTest):
+
+ def testClientCache_twoCaches(self):
+ self.device._cache['test'] = 0
+ client_cache_one = self.device.GetClientCache('ClientOne')
+ client_cache_one['test'] = 1
+ client_cache_two = self.device.GetClientCache('ClientTwo')
+ client_cache_two['test'] = 2
+ self.assertEqual(self.device._cache['test'], 0)
+ self.assertEqual(client_cache_one, {'test': 1})
+ self.assertEqual(client_cache_two, {'test': 2})
+ self.device._ClearCache()
+ self.assertTrue('test' not in self.device._cache)
+ self.assertEqual(client_cache_one, {})
+ self.assertEqual(client_cache_two, {})
+
+ def testClientCache_multipleInstances(self):
+ client_cache_one = self.device.GetClientCache('ClientOne')
+ client_cache_one['test'] = 1
+ client_cache_two = self.device.GetClientCache('ClientOne')
+ self.assertEqual(client_cache_one, {'test': 1})
+ self.assertEqual(client_cache_two, {'test': 1})
+ self.device._ClearCache()
+ self.assertEqual(client_cache_one, {})
+ self.assertEqual(client_cache_two, {})
+
+
+class DeviceUtilsHealthyDevicesTest(mock_calls.TestCase):
+
+ def testHealthyDevices_emptyBlacklist_defaultDeviceArg(self):
+ test_serials = ['0123456789abcdef', 'fedcba9876543210']
+ with self.assertCalls(
+ (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
+ [_AdbWrapperMock(s) for s in test_serials])):
+ blacklist = mock.NonCallableMock(**{'Read.return_value': []})
+ devices = device_utils.DeviceUtils.HealthyDevices(blacklist)
+ for serial, device in zip(test_serials, devices):
+ self.assertTrue(isinstance(device, device_utils.DeviceUtils))
+ self.assertEquals(serial, device.adb.GetDeviceSerial())
+
+ def testHealthyDevices_blacklist_defaultDeviceArg(self):
+ test_serials = ['0123456789abcdef', 'fedcba9876543210']
+ with self.assertCalls(
+ (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
+ [_AdbWrapperMock(s) for s in test_serials])):
+ blacklist = mock.NonCallableMock(
+ **{'Read.return_value': ['fedcba9876543210']})
+ devices = device_utils.DeviceUtils.HealthyDevices(blacklist)
+ self.assertEquals(1, len(devices))
+ self.assertTrue(isinstance(devices[0], device_utils.DeviceUtils))
+ self.assertEquals('0123456789abcdef', devices[0].adb.GetDeviceSerial())
+
+ def testHealthyDevices_noneDeviceArg_multiple_attached(self):
+ test_serials = ['0123456789abcdef', 'fedcba9876543210']
+ with self.assertCalls(
+ (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
+ [_AdbWrapperMock(s) for s in test_serials]),
+ (mock.call.devil.android.device_errors.MultipleDevicesError(mock.ANY),
+ _MockMultipleDevicesError())):
+ with self.assertRaises(_MockMultipleDevicesError):
+ device_utils.DeviceUtils.HealthyDevices(device_arg=None)
+
+ def testHealthyDevices_noneDeviceArg_one_attached(self):
+ test_serials = ['0123456789abcdef']
+ with self.assertCalls(
+ (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
+ [_AdbWrapperMock(s) for s in test_serials])):
+ devices = device_utils.DeviceUtils.HealthyDevices(device_arg=None)
+ self.assertEquals(1, len(devices))
+
+ def testHealthyDevices_noneDeviceArg_no_attached(self):
+ test_serials = []
+ with self.assertCalls(
+ (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
+ [_AdbWrapperMock(s) for s in test_serials])):
+ with self.assertRaises(device_errors.NoDevicesError):
+ device_utils.DeviceUtils.HealthyDevices(device_arg=None)
+
+ def testHealthyDevices_noneDeviceArg_multiple_attached_ANDROID_SERIAL(self):
+ try:
+ os.environ['ANDROID_SERIAL'] = '0123456789abcdef'
+ with self.assertCalls(): # Should skip adb devices when device is known.
+ device_utils.DeviceUtils.HealthyDevices(device_arg=None)
+ finally:
+ del os.environ['ANDROID_SERIAL']
+
+ def testHealthyDevices_stringDeviceArg(self):
+ with self.assertCalls(): # Should skip adb devices when device is known.
+ devices = device_utils.DeviceUtils.HealthyDevices(
+ device_arg='0123456789abcdef')
+ self.assertEquals(1, len(devices))
+
+ def testHealthyDevices_EmptyListDeviceArg_multiple_attached(self):
+ test_serials = ['0123456789abcdef', 'fedcba9876543210']
+ with self.assertCalls(
+ (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
+ [_AdbWrapperMock(s) for s in test_serials])):
+ devices = device_utils.DeviceUtils.HealthyDevices(device_arg=())
+ self.assertEquals(2, len(devices))
+
+ def testHealthyDevices_EmptyListDeviceArg_ANDROID_SERIAL(self):
+ try:
+ os.environ['ANDROID_SERIAL'] = '0123456789abcdef'
+ with self.assertCalls(): # Should skip adb devices when device is known.
+ devices = device_utils.DeviceUtils.HealthyDevices(device_arg=())
+ finally:
+ del os.environ['ANDROID_SERIAL']
+ self.assertEquals(1, len(devices))
+
+ def testHealthyDevices_EmptyListDeviceArg_no_attached(self):
+ test_serials = []
+ with self.assertCalls(
+ (mock.call.devil.android.sdk.adb_wrapper.AdbWrapper.Devices(),
+ [_AdbWrapperMock(s) for s in test_serials])):
+ with self.assertRaises(device_errors.NoDevicesError):
+ device_utils.DeviceUtils.HealthyDevices(device_arg=[])
+
+ def testHealthyDevices_ListDeviceArg(self):
+ device_arg = ['0123456789abcdef', 'fedcba9876543210']
+ try:
+ os.environ['ANDROID_SERIAL'] = 'should-not-apply'
+ with self.assertCalls(): # Should skip adb devices when device is known.
+ devices = device_utils.DeviceUtils.HealthyDevices(device_arg=device_arg)
+ finally:
+ del os.environ['ANDROID_SERIAL']
+ self.assertEquals(2, len(devices))
+
+
+class DeviceUtilsRestartAdbdTest(DeviceUtilsTest):
+
+ def testAdbdRestart(self):
+ mock_temp_file = '/sdcard/temp-123.sh'
+ with self.assertCalls(
+ (mock.call.devil.android.device_temp_file.DeviceTempFile(
+ self.adb, suffix='.sh'), MockTempFile(mock_temp_file)),
+ self.call.device.WriteFile(mock.ANY, mock.ANY),
+ (self.call.device.RunShellCommand(
+ ['source', mock_temp_file], check_return=True, as_root=True)),
+ self.call.adb.WaitForDevice()):
+ self.device.RestartAdbd()
+
+
+class DeviceUtilsGrantPermissionsTest(DeviceUtilsTest):
+
+ def testGrantPermissions_none(self):
+ self.device.GrantPermissions('package', [])
+
+ def testGrantPermissions_underM(self):
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=version_codes.LOLLIPOP):
+ self.device.GrantPermissions('package', ['p1'])
+
+ def testGrantPermissions_one(self):
+ permissions_cmd = 'pm grant package p1'
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=version_codes.MARSHMALLOW):
+ with self.assertCalls(
+ (self.call.device.RunShellCommand(
+ permissions_cmd, shell=True, check_return=True), [])):
+ self.device.GrantPermissions('package', ['p1'])
+
+ def testGrantPermissions_multiple(self):
+ permissions_cmd = 'pm grant package p1&&pm grant package p2'
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=version_codes.MARSHMALLOW):
+ with self.assertCalls(
+ (self.call.device.RunShellCommand(
+ permissions_cmd, shell=True, check_return=True), [])):
+ self.device.GrantPermissions('package', ['p1', 'p2'])
+
+ def testGrantPermissions_WriteExtrnalStorage(self):
+ permissions_cmd = (
+ 'pm grant package android.permission.WRITE_EXTERNAL_STORAGE&&'
+ 'pm grant package android.permission.READ_EXTERNAL_STORAGE')
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=version_codes.MARSHMALLOW):
+ with self.assertCalls(
+ (self.call.device.RunShellCommand(
+ permissions_cmd, shell=True, check_return=True), [])):
+ self.device.GrantPermissions(
+ 'package', ['android.permission.WRITE_EXTERNAL_STORAGE'])
+
+ def testGrantPermissions_BlackList(self):
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=version_codes.MARSHMALLOW):
+ self.device.GrantPermissions(
+ 'package', ['android.permission.ACCESS_MOCK_LOCATION'])
+
+
+class DeviecUtilsIsScreenOn(DeviceUtilsTest):
+
+ _L_SCREEN_ON = ['test=test mInteractive=true']
+ _K_SCREEN_ON = ['test=test mScreenOn=true']
+ _L_SCREEN_OFF = ['mInteractive=false']
+ _K_SCREEN_OFF = ['mScreenOn=false']
+
+ def testIsScreenOn_onPreL(self):
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=version_codes.KITKAT):
+ with self.assertCalls(
+ (self.call.device._RunPipedShellCommand(
+ 'dumpsys input_method | grep mScreenOn'), self._K_SCREEN_ON)):
+ self.assertTrue(self.device.IsScreenOn())
+
+ def testIsScreenOn_onL(self):
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=version_codes.LOLLIPOP):
+ with self.assertCalls(
+ (self.call.device._RunPipedShellCommand(
+ 'dumpsys input_method | grep mInteractive'), self._L_SCREEN_ON)):
+ self.assertTrue(self.device.IsScreenOn())
+
+ def testIsScreenOn_offPreL(self):
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=version_codes.KITKAT):
+ with self.assertCalls(
+ (self.call.device._RunPipedShellCommand(
+ 'dumpsys input_method | grep mScreenOn'), self._K_SCREEN_OFF)):
+ self.assertFalse(self.device.IsScreenOn())
+
+ def testIsScreenOn_offL(self):
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=version_codes.LOLLIPOP):
+ with self.assertCalls(
+ (self.call.device._RunPipedShellCommand(
+ 'dumpsys input_method | grep mInteractive'), self._L_SCREEN_OFF)):
+ self.assertFalse(self.device.IsScreenOn())
+
+ def testIsScreenOn_noOutput(self):
+ with self.patch_call(self.call.device.build_version_sdk,
+ return_value=version_codes.LOLLIPOP):
+ with self.assertCalls(
+ (self.call.device._RunPipedShellCommand(
+ 'dumpsys input_method | grep mInteractive'), [])):
+ with self.assertRaises(device_errors.CommandFailedError):
+ self.device.IsScreenOn()
+
+
+class DeviecUtilsSetScreen(DeviceUtilsTest):
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testSetScren_alreadySet(self):
+ with self.assertCalls(
+ (self.call.device.IsScreenOn(), False)):
+ self.device.SetScreen(False)
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testSetScreen_on(self):
+ with self.assertCalls(
+ (self.call.device.IsScreenOn(), False),
+ (self.call.device.SendKeyEvent(keyevent.KEYCODE_POWER), None),
+ (self.call.device.IsScreenOn(), True)):
+ self.device.SetScreen(True)
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testSetScreen_off(self):
+ with self.assertCalls(
+ (self.call.device.IsScreenOn(), True),
+ (self.call.device.SendKeyEvent(keyevent.KEYCODE_POWER), None),
+ (self.call.device.IsScreenOn(), False)):
+ self.device.SetScreen(False)
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testSetScreen_slow(self):
+ with self.assertCalls(
+ (self.call.device.IsScreenOn(), True),
+ (self.call.device.SendKeyEvent(keyevent.KEYCODE_POWER), None),
+ (self.call.device.IsScreenOn(), True),
+ (self.call.device.IsScreenOn(), True),
+ (self.call.device.IsScreenOn(), False)):
+ self.device.SetScreen(False)
+
+class DeviecUtilsLoadCacheData(DeviceUtilsTest):
+
+ def testTokenMissing(self):
+ with self.assertCalls(
+ self.EnsureCacheInitialized()):
+ self.assertFalse(self.device.LoadCacheData('{}'))
+
+ def testTokenStale(self):
+ with self.assertCalls(
+ self.EnsureCacheInitialized()):
+ self.assertFalse(self.device.LoadCacheData('{"token":"foo"}'))
+
+ def testTokenMatches(self):
+ with self.assertCalls(
+ self.EnsureCacheInitialized()):
+ self.assertTrue(self.device.LoadCacheData('{"token":"TOKEN"}'))
+
+ def testDumpThenLoad(self):
+ with self.assertCalls(
+ self.EnsureCacheInitialized()):
+ data = json.loads(self.device.DumpCacheData())
+ data['token'] = 'TOKEN'
+ self.assertTrue(self.device.LoadCacheData(json.dumps(data)))
+
+
+if __name__ == '__main__':
+ logging.getLogger().setLevel(logging.DEBUG)
+ unittest.main(verbosity=2)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/fastboot_utils.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/fastboot_utils.py
new file mode 100644
index 0000000..3bd3ee8
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/fastboot_utils.py
@@ -0,0 +1,256 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Provides a variety of device interactions based on fastboot."""
+# pylint: disable=unused-argument
+
+import collections
+import contextlib
+import fnmatch
+import logging
+import os
+import re
+
+from devil.android import decorators
+from devil.android import device_errors
+from devil.android.sdk import fastboot
+from devil.utils import timeout_retry
+
+logger = logging.getLogger(__name__)
+
+_DEFAULT_TIMEOUT = 30
+_DEFAULT_RETRIES = 3
+_FASTBOOT_REBOOT_TIMEOUT = 10 * _DEFAULT_TIMEOUT
+_KNOWN_PARTITIONS = collections.OrderedDict([
+ ('bootloader', {'image': 'bootloader*.img', 'restart': True}),
+ ('radio', {'image': 'radio*.img', 'restart': True}),
+ ('boot', {'image': 'boot.img'}),
+ ('recovery', {'image': 'recovery.img'}),
+ ('system', {'image': 'system.img'}),
+ ('userdata', {'image': 'userdata.img', 'wipe_only': True}),
+ ('cache', {'image': 'cache.img', 'wipe_only': True}),
+ ('vendor', {'image': 'vendor*.img', 'optional': True}),
+ ])
+ALL_PARTITIONS = _KNOWN_PARTITIONS.keys()
+
+
+def _FindAndVerifyPartitionsAndImages(partitions, directory):
+ """Validate partitions and images.
+
+ Validate all partition names and partition directories. Cannot stop mid
+ flash so its important to validate everything first.
+
+ Args:
+ Partitions: partitions to be tested.
+ directory: directory containing the images.
+
+ Returns:
+ Dictionary with exact partition, image name mapping.
+ """
+
+ files = os.listdir(directory)
+ return_dict = collections.OrderedDict()
+
+ def find_file(pattern):
+ for filename in files:
+ if fnmatch.fnmatch(filename, pattern):
+ return os.path.join(directory, filename)
+ return None
+ for partition in partitions:
+ partition_info = _KNOWN_PARTITIONS[partition]
+ image_file = find_file(partition_info['image'])
+ if image_file:
+ return_dict[partition] = image_file
+ elif not partition_info.get('optional'):
+ raise device_errors.FastbootCommandFailedError(
+ 'Failed to flash device. Could not find image for %s.',
+ partition_info['image'])
+ return return_dict
+
+
+class FastbootUtils(object):
+
+ _FASTBOOT_WAIT_TIME = 1
+ _BOARD_VERIFICATION_FILE = 'android-info.txt'
+
+ def __init__(self, device, fastbooter=None, default_timeout=_DEFAULT_TIMEOUT,
+ default_retries=_DEFAULT_RETRIES):
+ """FastbootUtils constructor.
+
+ Example Usage to flash a device:
+ fastboot = fastboot_utils.FastbootUtils(device)
+ fastboot.FlashDevice('/path/to/build/directory')
+
+ Args:
+ device: A DeviceUtils instance.
+ fastbooter: Optional fastboot object. If none is passed, one will
+ be created.
+ default_timeout: An integer containing the default number of seconds to
+ wait for an operation to complete if no explicit value is provided.
+ default_retries: An integer containing the default number or times an
+ operation should be retried on failure if no explicit value is provided.
+ """
+ self._device = device
+ self._board = device.product_board
+ self._serial = str(device)
+ self._default_timeout = default_timeout
+ self._default_retries = default_retries
+ if fastbooter:
+ self.fastboot = fastbooter
+ else:
+ self.fastboot = fastboot.Fastboot(self._serial)
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def WaitForFastbootMode(self, timeout=None, retries=None):
+ """Wait for device to boot into fastboot mode.
+
+ This waits for the device serial to show up in fastboot devices output.
+ """
+ def fastboot_mode():
+ return self._serial in self.fastboot.Devices()
+
+ timeout_retry.WaitFor(fastboot_mode, wait_period=self._FASTBOOT_WAIT_TIME)
+
+ @decorators.WithTimeoutAndRetriesFromInstance(
+ min_default_timeout=_FASTBOOT_REBOOT_TIMEOUT)
+ def EnableFastbootMode(self, timeout=None, retries=None):
+ """Reboots phone into fastboot mode.
+
+ Roots phone if needed, then reboots phone into fastboot mode and waits.
+ """
+ self._device.EnableRoot()
+ self._device.adb.Reboot(to_bootloader=True)
+ self.WaitForFastbootMode()
+
+ @decorators.WithTimeoutAndRetriesFromInstance(
+ min_default_timeout=_FASTBOOT_REBOOT_TIMEOUT)
+ def Reboot(
+ self, bootloader=False, wait_for_reboot=True, timeout=None, retries=None):
+ """Reboots out of fastboot mode.
+
+ It reboots the phone either back into fastboot, or to a regular boot. It
+ then blocks until the device is ready.
+
+ Args:
+ bootloader: If set to True, reboots back into bootloader.
+ """
+ if bootloader:
+ self.fastboot.RebootBootloader()
+ self.WaitForFastbootMode()
+ else:
+ self.fastboot.Reboot()
+ if wait_for_reboot:
+ self._device.WaitUntilFullyBooted(timeout=_FASTBOOT_REBOOT_TIMEOUT)
+
+ def _VerifyBoard(self, directory):
+ """Validate as best as possible that the android build matches the device.
+
+ Goes through build files and checks if the board name is mentioned in the
+ |self._BOARD_VERIFICATION_FILE| or in the build archive.
+
+ Args:
+ directory: directory where build files are located.
+ """
+ files = os.listdir(directory)
+ board_regex = re.compile(r'require board=(\w+)')
+ if self._BOARD_VERIFICATION_FILE in files:
+ with open(os.path.join(directory, self._BOARD_VERIFICATION_FILE)) as f:
+ for line in f:
+ m = board_regex.match(line)
+ if m:
+ board_name = m.group(1)
+ if board_name == self._board:
+ return True
+ elif board_name:
+ return False
+ else:
+ logger.warning('No board type found in %s.',
+ self._BOARD_VERIFICATION_FILE)
+ else:
+ logger.warning('%s not found. Unable to use it to verify device.',
+ self._BOARD_VERIFICATION_FILE)
+
+ zip_regex = re.compile(r'.*%s.*\.zip' % re.escape(self._board))
+ for f in files:
+ if zip_regex.match(f):
+ return True
+
+ return False
+
+ def _FlashPartitions(self, partitions, directory, wipe=False, force=False):
+ """Flashes all given partiitons with all given images.
+
+ Args:
+ partitions: List of partitions to flash.
+ directory: Directory where all partitions can be found.
+ wipe: If set to true, will automatically detect if cache and userdata
+ partitions are sent, and if so ignore them.
+ force: boolean to decide to ignore board name safety checks.
+
+ Raises:
+ device_errors.CommandFailedError(): If image cannot be found or if bad
+ partition name is give.
+ """
+ if not self._VerifyBoard(directory):
+ if force:
+ logger.warning('Could not verify build is meant to be installed on '
+ 'the current device type, but force flag is set. '
+ 'Flashing device. Possibly dangerous operation.')
+ else:
+ raise device_errors.CommandFailedError(
+ 'Could not verify build is meant to be installed on the current '
+ 'device type. Run again with force=True to force flashing with an '
+ 'unverified board.')
+
+ flash_image_files = _FindAndVerifyPartitionsAndImages(partitions, directory)
+ partitions = flash_image_files.keys()
+ for partition in partitions:
+ if _KNOWN_PARTITIONS[partition].get('wipe_only') and not wipe:
+ logger.info(
+ 'Not flashing in wipe mode. Skipping partition %s.', partition)
+ else:
+ logger.info(
+ 'Flashing %s with %s', partition, flash_image_files[partition])
+ self.fastboot.Flash(partition, flash_image_files[partition])
+ if _KNOWN_PARTITIONS[partition].get('restart', False):
+ self.Reboot(bootloader=True)
+
+ @contextlib.contextmanager
+ def FastbootMode(self, wait_for_reboot=True, timeout=None, retries=None):
+ """Context manager that enables fastboot mode, and reboots after.
+
+ Example usage:
+ with FastbootMode():
+ Flash Device
+ # Anything that runs after flashing.
+ """
+ self.EnableFastbootMode()
+ self.fastboot.SetOemOffModeCharge(False)
+ try:
+ yield self
+ finally:
+ self.fastboot.SetOemOffModeCharge(True)
+ self.Reboot(wait_for_reboot=wait_for_reboot)
+
+ def FlashDevice(self, directory, partitions=None, wipe=False):
+ """Flash device with build in |directory|.
+
+ Directory must contain bootloader, radio, boot, recovery, system, userdata,
+ and cache .img files from an android build. This is a dangerous operation so
+ use with care.
+
+ Args:
+ fastboot: A FastbootUtils instance.
+ directory: Directory with build files.
+ wipe: Wipes cache and userdata if set to true.
+ partitions: List of partitions to flash. Defaults to all.
+ """
+ if partitions is None:
+ partitions = ALL_PARTITIONS
+ # If a device is wiped, then it will no longer have adb keys so it cannot be
+ # communicated with to verify that it is rebooted. It is up to the user of
+ # this script to ensure that the adb keys are set on the device after using
+ # this to wipe a device.
+ with self.FastbootMode(wait_for_reboot=not wipe):
+ self._FlashPartitions(partitions, directory, wipe=wipe)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/fastboot_utils_test.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/fastboot_utils_test.py
new file mode 100644
index 0000000..0562974
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/fastboot_utils_test.py
@@ -0,0 +1,375 @@
+#!/usr/bin/env python
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""
+Unit tests for the contents of fastboot_utils.py
+"""
+
+# pylint: disable=protected-access,unused-argument
+
+import collections
+import io
+import logging
+import unittest
+
+from devil import devil_env
+from devil.android import device_errors
+from devil.android import device_utils
+from devil.android import fastboot_utils
+from devil.android.sdk import fastboot
+from devil.utils import mock_calls
+
+with devil_env.SysPath(devil_env.PYMOCK_PATH):
+ import mock # pylint: disable=import-error
+
+_BOARD = 'board_type'
+_SERIAL = '0123456789abcdef'
+_PARTITIONS = [
+ 'bootloader', 'radio', 'boot', 'recovery', 'system', 'userdata', 'cache']
+_IMAGES = collections.OrderedDict([
+ ('bootloader', 'bootloader.img'),
+ ('radio', 'radio.img'),
+ ('boot', 'boot.img'),
+ ('recovery', 'recovery.img'),
+ ('system', 'system.img'),
+ ('userdata', 'userdata.img'),
+ ('cache', 'cache.img')
+])
+_VALID_FILES = [_BOARD + '.zip', 'android-info.txt']
+_INVALID_FILES = ['test.zip', 'android-info.txt']
+
+
+class MockFile(object):
+
+ def __init__(self, name='/tmp/some/file'):
+ self.file = mock.MagicMock(spec=file)
+ self.file.name = name
+
+ def __enter__(self):
+ return self.file
+
+ def __exit__(self, exc_type, exc_val, exc_tb):
+ pass
+
+ @property
+ def name(self):
+ return self.file.name
+
+
+def _FastbootWrapperMock(test_serial):
+ fastbooter = mock.Mock(spec=fastboot.Fastboot)
+ fastbooter.__str__ = mock.Mock(return_value=test_serial)
+ fastbooter.Devices.return_value = [test_serial]
+ return fastbooter
+
+
+def _DeviceUtilsMock(test_serial):
+ device = mock.Mock(spec=device_utils.DeviceUtils)
+ device.__str__ = mock.Mock(return_value=test_serial)
+ device.product_board = mock.Mock(return_value=_BOARD)
+ device.adb = mock.Mock()
+ return device
+
+
+class FastbootUtilsTest(mock_calls.TestCase):
+
+ def setUp(self):
+ self.device_utils_mock = _DeviceUtilsMock(_SERIAL)
+ self.fastboot_wrapper = _FastbootWrapperMock(_SERIAL)
+ self.fastboot = fastboot_utils.FastbootUtils(
+ self.device_utils_mock, fastbooter=self.fastboot_wrapper,
+ default_timeout=2, default_retries=0)
+ self.fastboot._board = _BOARD
+
+
+class FastbootUtilsInitTest(FastbootUtilsTest):
+
+ def testInitWithDeviceUtil(self):
+ f = fastboot_utils.FastbootUtils(self.device_utils_mock)
+ self.assertEqual(str(self.device_utils_mock), str(f._device))
+
+ def testInitWithMissing_fails(self):
+ with self.assertRaises(AttributeError):
+ fastboot_utils.FastbootUtils(None)
+ with self.assertRaises(AttributeError):
+ fastboot_utils.FastbootUtils('')
+
+ def testPartitionOrdering(self):
+ parts = ['bootloader', 'radio', 'boot', 'recovery', 'system', 'userdata',
+ 'cache', 'vendor']
+ self.assertListEqual(fastboot_utils.ALL_PARTITIONS, parts)
+
+
+class FastbootUtilsWaitForFastbootMode(FastbootUtilsTest):
+
+ # If this test fails by timing out after 1 second.
+ @mock.patch('time.sleep', mock.Mock())
+ def testWaitForFastbootMode(self):
+ self.fastboot.WaitForFastbootMode()
+
+
+class FastbootUtilsEnableFastbootMode(FastbootUtilsTest):
+
+ def testEnableFastbootMode(self):
+ with self.assertCalls(
+ self.call.fastboot._device.EnableRoot(),
+ self.call.fastboot._device.adb.Reboot(to_bootloader=True),
+ self.call.fastboot.WaitForFastbootMode()):
+ self.fastboot.EnableFastbootMode()
+
+
+class FastbootUtilsReboot(FastbootUtilsTest):
+
+ def testReboot_bootloader(self):
+ with self.assertCalls(
+ self.call.fastboot.fastboot.RebootBootloader(),
+ self.call.fastboot.WaitForFastbootMode()):
+ self.fastboot.Reboot(bootloader=True)
+
+ def testReboot_normal(self):
+ with self.assertCalls(
+ self.call.fastboot.fastboot.Reboot(),
+ self.call.fastboot._device.WaitUntilFullyBooted(timeout=mock.ANY)):
+ self.fastboot.Reboot()
+
+
+class FastbootUtilsFlashPartitions(FastbootUtilsTest):
+
+ def testFlashPartitions_wipe(self):
+ with self.assertCalls(
+ (self.call.fastboot._VerifyBoard('test'), True),
+ (mock.call.devil.android.fastboot_utils.
+ _FindAndVerifyPartitionsAndImages(_PARTITIONS, 'test'), _IMAGES),
+ (self.call.fastboot.fastboot.Flash('bootloader', 'bootloader.img')),
+ (self.call.fastboot.Reboot(bootloader=True)),
+ (self.call.fastboot.fastboot.Flash('radio', 'radio.img')),
+ (self.call.fastboot.Reboot(bootloader=True)),
+ (self.call.fastboot.fastboot.Flash('boot', 'boot.img')),
+ (self.call.fastboot.fastboot.Flash('recovery', 'recovery.img')),
+ (self.call.fastboot.fastboot.Flash('system', 'system.img')),
+ (self.call.fastboot.fastboot.Flash('userdata', 'userdata.img')),
+ (self.call.fastboot.fastboot.Flash('cache', 'cache.img'))):
+ self.fastboot._FlashPartitions(_PARTITIONS, 'test', wipe=True)
+
+ def testFlashPartitions_noWipe(self):
+ with self.assertCalls(
+ (self.call.fastboot._VerifyBoard('test'), True),
+ (mock.call.devil.android.fastboot_utils.
+ _FindAndVerifyPartitionsAndImages(_PARTITIONS, 'test'), _IMAGES),
+ (self.call.fastboot.fastboot.Flash('bootloader', 'bootloader.img')),
+ (self.call.fastboot.Reboot(bootloader=True)),
+ (self.call.fastboot.fastboot.Flash('radio', 'radio.img')),
+ (self.call.fastboot.Reboot(bootloader=True)),
+ (self.call.fastboot.fastboot.Flash('boot', 'boot.img')),
+ (self.call.fastboot.fastboot.Flash('recovery', 'recovery.img')),
+ (self.call.fastboot.fastboot.Flash('system', 'system.img'))):
+ self.fastboot._FlashPartitions(_PARTITIONS, 'test')
+
+
+class FastbootUtilsFastbootMode(FastbootUtilsTest):
+
+ def testFastbootMode_goodWait(self):
+ with self.assertCalls(
+ self.call.fastboot.EnableFastbootMode(),
+ self.call.fastboot.fastboot.SetOemOffModeCharge(False),
+ self.call.fastboot.fastboot.SetOemOffModeCharge(True),
+ self.call.fastboot.Reboot(wait_for_reboot=True)):
+ with self.fastboot.FastbootMode() as fbm:
+ self.assertEqual(self.fastboot, fbm)
+
+ def testFastbootMode_goodNoWait(self):
+ with self.assertCalls(
+ self.call.fastboot.EnableFastbootMode(),
+ self.call.fastboot.fastboot.SetOemOffModeCharge(False),
+ self.call.fastboot.fastboot.SetOemOffModeCharge(True),
+ self.call.fastboot.Reboot(wait_for_reboot=False)):
+ with self.fastboot.FastbootMode(wait_for_reboot=False) as fbm:
+ self.assertEqual(self.fastboot, fbm)
+
+ def testFastbootMode_exception(self):
+ with self.assertCalls(
+ self.call.fastboot.EnableFastbootMode(),
+ self.call.fastboot.fastboot.SetOemOffModeCharge(False),
+ self.call.fastboot.fastboot.SetOemOffModeCharge(True),
+ self.call.fastboot.Reboot(wait_for_reboot=True)):
+ with self.assertRaises(NotImplementedError):
+ with self.fastboot.FastbootMode() as fbm:
+ self.assertEqual(self.fastboot, fbm)
+ raise NotImplementedError
+
+ def testFastbootMode_exceptionInEnableFastboot(self):
+ self.fastboot.EnableFastbootMode = mock.Mock()
+ self.fastboot.EnableFastbootMode.side_effect = NotImplementedError
+ with self.assertRaises(NotImplementedError):
+ with self.fastboot.FastbootMode():
+ pass
+
+
+class FastbootUtilsVerifyBoard(FastbootUtilsTest):
+
+ def testVerifyBoard_bothValid(self):
+ mock_file = io.StringIO(u'require board=%s\n' % _BOARD)
+ with mock.patch('__builtin__.open', return_value=mock_file, create=True):
+ with mock.patch('os.listdir', return_value=_VALID_FILES):
+ self.assertTrue(self.fastboot._VerifyBoard('test'))
+
+ def testVerifyBoard_BothNotValid(self):
+ mock_file = io.StringIO(u'abc')
+ with mock.patch('__builtin__.open', return_value=mock_file, create=True):
+ with mock.patch('os.listdir', return_value=_INVALID_FILES):
+ self.assertFalse(self.assertFalse(self.fastboot._VerifyBoard('test')))
+
+ def testVerifyBoard_FileNotFoundZipValid(self):
+ with mock.patch('os.listdir', return_value=[_BOARD + '.zip']):
+ self.assertTrue(self.fastboot._VerifyBoard('test'))
+
+ def testVerifyBoard_ZipNotFoundFileValid(self):
+ mock_file = io.StringIO(u'require board=%s\n' % _BOARD)
+ with mock.patch('__builtin__.open', return_value=mock_file, create=True):
+ with mock.patch('os.listdir', return_value=['android-info.txt']):
+ self.assertTrue(self.fastboot._VerifyBoard('test'))
+
+ def testVerifyBoard_zipNotValidFileIs(self):
+ mock_file = io.StringIO(u'require board=%s\n' % _BOARD)
+ with mock.patch('__builtin__.open', return_value=mock_file, create=True):
+ with mock.patch('os.listdir', return_value=_INVALID_FILES):
+ self.assertTrue(self.fastboot._VerifyBoard('test'))
+
+ def testVerifyBoard_fileNotValidZipIs(self):
+ mock_file = io.StringIO(u'require board=WrongBoard')
+ with mock.patch('__builtin__.open', return_value=mock_file, create=True):
+ with mock.patch('os.listdir', return_value=_VALID_FILES):
+ self.assertFalse(self.fastboot._VerifyBoard('test'))
+
+ def testVerifyBoard_noBoardInFileValidZip(self):
+ mock_file = io.StringIO(u'Regex wont match')
+ with mock.patch('__builtin__.open', return_value=mock_file, create=True):
+ with mock.patch('os.listdir', return_value=_VALID_FILES):
+ self.assertTrue(self.fastboot._VerifyBoard('test'))
+
+ def testVerifyBoard_noBoardInFileInvalidZip(self):
+ mock_file = io.StringIO(u'Regex wont match')
+ with mock.patch('__builtin__.open', return_value=mock_file, create=True):
+ with mock.patch('os.listdir', return_value=_INVALID_FILES):
+ self.assertFalse(self.fastboot._VerifyBoard('test'))
+
+
+class FastbootUtilsFindAndVerifyPartitionsAndImages(FastbootUtilsTest):
+
+ def testFindAndVerifyPartitionsAndImages_validNoVendor(self):
+ PARTITIONS = [
+ 'bootloader', 'radio', 'boot', 'recovery', 'system', 'userdata',
+ 'cache', 'vendor'
+ ]
+ files = [
+ 'bootloader-test-.img',
+ 'radio123.img',
+ 'boot.img',
+ 'recovery.img',
+ 'system.img',
+ 'userdata.img',
+ 'cache.img'
+ ]
+ img_check = collections.OrderedDict([
+ ('bootloader', 'test/bootloader-test-.img'),
+ ('radio', 'test/radio123.img'),
+ ('boot', 'test/boot.img'),
+ ('recovery', 'test/recovery.img'),
+ ('system', 'test/system.img'),
+ ('userdata', 'test/userdata.img'),
+ ('cache', 'test/cache.img'),
+ ])
+ parts_check = [
+ 'bootloader', 'radio', 'boot', 'recovery', 'system', 'userdata',
+ 'cache'
+ ]
+ with mock.patch('os.listdir', return_value=files):
+ imgs = fastboot_utils._FindAndVerifyPartitionsAndImages(
+ PARTITIONS, 'test')
+ parts = imgs.keys()
+ self.assertDictEqual(imgs, img_check)
+ self.assertListEqual(parts, parts_check)
+
+ def testFindAndVerifyPartitionsAndImages_validVendor(self):
+ PARTITIONS = [
+ 'bootloader', 'radio', 'boot', 'recovery', 'system', 'userdata',
+ 'cache', 'vendor'
+ ]
+ files = [
+ 'bootloader-test-.img',
+ 'radio123.img',
+ 'boot.img',
+ 'recovery.img',
+ 'system.img',
+ 'userdata.img',
+ 'cache.img',
+ 'vendor.img'
+ ]
+ img_check = {
+ 'bootloader': 'test/bootloader-test-.img',
+ 'radio': 'test/radio123.img',
+ 'boot': 'test/boot.img',
+ 'recovery': 'test/recovery.img',
+ 'system': 'test/system.img',
+ 'userdata': 'test/userdata.img',
+ 'cache': 'test/cache.img',
+ 'vendor': 'test/vendor.img',
+ }
+ parts_check = [
+ 'bootloader', 'radio', 'boot', 'recovery', 'system', 'userdata',
+ 'cache', 'vendor'
+ ]
+
+ with mock.patch('os.listdir', return_value=files):
+ imgs = fastboot_utils._FindAndVerifyPartitionsAndImages(
+ PARTITIONS, 'test')
+ parts = imgs.keys()
+ self.assertDictEqual(imgs, img_check)
+ self.assertListEqual(parts, parts_check)
+
+ def testFindAndVerifyPartitionsAndImages_badPartition(self):
+ with mock.patch('os.listdir', return_value=['test']):
+ with self.assertRaises(KeyError):
+ fastboot_utils._FindAndVerifyPartitionsAndImages(['test'], 'test')
+
+ def testFindAndVerifyPartitionsAndImages_noFile(self):
+ with mock.patch('os.listdir', return_value=['test']):
+ with self.assertRaises(device_errors.FastbootCommandFailedError):
+ fastboot_utils._FindAndVerifyPartitionsAndImages(['cache'], 'test')
+
+
+class FastbootUtilsFlashDevice(FastbootUtilsTest):
+
+ def testFlashDevice_wipe(self):
+ with self.assertCalls(
+ self.call.fastboot.EnableFastbootMode(),
+ self.call.fastboot.fastboot.SetOemOffModeCharge(False),
+ self.call.fastboot._FlashPartitions(mock.ANY, 'test', wipe=True),
+ self.call.fastboot.fastboot.SetOemOffModeCharge(True),
+ self.call.fastboot.Reboot(wait_for_reboot=False)):
+ self.fastboot.FlashDevice('test', wipe=True)
+
+ def testFlashDevice_noWipe(self):
+ with self.assertCalls(
+ self.call.fastboot.EnableFastbootMode(),
+ self.call.fastboot.fastboot.SetOemOffModeCharge(False),
+ self.call.fastboot._FlashPartitions(mock.ANY, 'test', wipe=False),
+ self.call.fastboot.fastboot.SetOemOffModeCharge(True),
+ self.call.fastboot.Reboot(wait_for_reboot=True)):
+ self.fastboot.FlashDevice('test', wipe=False)
+
+ def testFlashDevice_partitions(self):
+ with self.assertCalls(
+ self.call.fastboot.EnableFastbootMode(),
+ self.call.fastboot.fastboot.SetOemOffModeCharge(False),
+ self.call.fastboot._FlashPartitions(['boot'], 'test', wipe=False),
+ self.call.fastboot.fastboot.SetOemOffModeCharge(True),
+ self.call.fastboot.Reboot(wait_for_reboot=True)):
+ self.fastboot.FlashDevice('test', partitions=['boot'], wipe=False)
+
+
+if __name__ == '__main__':
+ logging.getLogger().setLevel(logging.DEBUG)
+ unittest.main(verbosity=2)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/flag_changer.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/flag_changer.py
new file mode 100644
index 0000000..b2ee8b1
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/flag_changer.py
@@ -0,0 +1,300 @@
+# Copyright (c) 2012 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import contextlib
+import logging
+import posixpath
+import re
+
+from devil.android.sdk import version_codes
+
+
+logger = logging.getLogger(__name__)
+
+
+_CMDLINE_DIR = '/data/local/tmp'
+_CMDLINE_DIR_LEGACY = '/data/local'
+_RE_NEEDS_QUOTING = re.compile(r'[^\w-]') # Not in: alphanumeric or hyphens.
+_QUOTES = '"\'' # Either a single or a double quote.
+_ESCAPE = '\\' # A backslash.
+
+
+@contextlib.contextmanager
+def CustomCommandLineFlags(device, cmdline_name, flags):
+ """Context manager to change Chrome's command line temporarily.
+
+ Example:
+
+ with flag_changer.TemporaryCommandLineFlags(device, name, flags):
+ # Launching Chrome will use the provided flags.
+
+ # Previous set of flags on the device is now restored.
+
+ Args:
+ device: A DeviceUtils instance.
+ cmdline_name: Name of the command line file where to store flags.
+ flags: A sequence of command line flags to set.
+ """
+ # On Android N and above, we need to temporarily set SELinux to permissive
+ # so that Chrome is allowed to read the command line file.
+ # TODO(crbug.com/699082): Remove when a solution to avoid this is implemented.
+ needs_permissive = (
+ device.build_version_sdk >= version_codes.NOUGAT and
+ device.GetEnforce())
+ if needs_permissive:
+ device.SetEnforce(enabled=False)
+ try:
+ changer = FlagChanger(device, cmdline_name)
+ try:
+ changer.ReplaceFlags(flags)
+ yield
+ finally:
+ changer.Restore()
+ finally:
+ if needs_permissive:
+ device.SetEnforce(enabled=True)
+
+
+class FlagChanger(object):
+ """Changes the flags Chrome runs with.
+
+ Flags can be temporarily set for a particular set of unit tests. These
+ tests should call Restore() to revert the flags to their original state
+ once the tests have completed.
+ """
+
+ def __init__(self, device, cmdline_file):
+ """Initializes the FlagChanger and records the original arguments.
+
+ Args:
+ device: A DeviceUtils instance.
+ cmdline_file: Name of the command line file where to store flags.
+ """
+ self._device = device
+
+ if posixpath.sep in cmdline_file:
+ raise ValueError(
+ 'cmdline_file should be a file name only, do not include path'
+ ' separators in: %s' % cmdline_file)
+ self._cmdline_path = posixpath.join(_CMDLINE_DIR, cmdline_file)
+
+ cmdline_path_legacy = posixpath.join(_CMDLINE_DIR_LEGACY, cmdline_file)
+ if self._device.PathExists(cmdline_path_legacy):
+ logging.warning(
+ 'Removing legacy command line file %r.', cmdline_path_legacy)
+ self._device.RemovePath(cmdline_path_legacy, as_root=True)
+
+ self._state_stack = [None] # Actual state is set by GetCurrentFlags().
+ self.GetCurrentFlags()
+
+ def GetCurrentFlags(self):
+ """Read the current flags currently stored in the device.
+
+ Also updates the internal state of the flag_changer.
+
+ Returns:
+ A list of flags.
+ """
+ if self._device.PathExists(self._cmdline_path):
+ command_line = self._device.ReadFile(self._cmdline_path).strip()
+ else:
+ command_line = ''
+ flags = _ParseFlags(command_line)
+
+ # Store the flags as a set to facilitate adding and removing flags.
+ self._state_stack[-1] = set(flags)
+ return flags
+
+ def ReplaceFlags(self, flags):
+ """Replaces the flags in the command line with the ones provided.
+ Saves the current flags state on the stack, so a call to Restore will
+ change the state back to the one preceeding the call to ReplaceFlags.
+
+ Args:
+ flags: A sequence of command line flags to set, eg. ['--single-process'].
+ Note: this should include flags only, not the name of a command
+ to run (ie. there is no need to start the sequence with 'chrome').
+
+ Returns:
+ A list with the flags now stored on the device.
+ """
+ new_flags = set(flags)
+ self._state_stack.append(new_flags)
+ return self._UpdateCommandLineFile()
+
+ def AddFlags(self, flags):
+ """Appends flags to the command line if they aren't already there.
+ Saves the current flags state on the stack, so a call to Restore will
+ change the state back to the one preceeding the call to AddFlags.
+
+ Args:
+ flags: A sequence of flags to add on, eg. ['--single-process'].
+
+ Returns:
+ A list with the flags now stored on the device.
+ """
+ return self.PushFlags(add=flags)
+
+ def RemoveFlags(self, flags):
+ """Removes flags from the command line, if they exist.
+ Saves the current flags state on the stack, so a call to Restore will
+ change the state back to the one preceeding the call to RemoveFlags.
+
+ Note that calling RemoveFlags after AddFlags will result in having
+ two nested states.
+
+ Args:
+ flags: A sequence of flags to remove, eg. ['--single-process']. Note
+ that we expect a complete match when removing flags; if you want
+ to remove a switch with a value, you must use the exact string
+ used to add it in the first place.
+
+ Returns:
+ A list with the flags now stored on the device.
+ """
+ return self.PushFlags(remove=flags)
+
+ def PushFlags(self, add=None, remove=None):
+ """Appends and removes flags to/from the command line if they aren't already
+ there. Saves the current flags state on the stack, so a call to Restore
+ will change the state back to the one preceeding the call to PushFlags.
+
+ Args:
+ add: A list of flags to add on, eg. ['--single-process'].
+ remove: A list of flags to remove, eg. ['--single-process']. Note that we
+ expect a complete match when removing flags; if you want to remove
+ a switch with a value, you must use the exact string used to add
+ it in the first place.
+
+ Returns:
+ A list with the flags now stored on the device.
+ """
+ new_flags = self._state_stack[-1].copy()
+ if add:
+ new_flags.update(add)
+ if remove:
+ new_flags.difference_update(remove)
+ return self.ReplaceFlags(new_flags)
+
+ def Restore(self):
+ """Restores the flags to their state prior to the last AddFlags or
+ RemoveFlags call.
+
+ Returns:
+ A list with the flags now stored on the device.
+ """
+ # The initial state must always remain on the stack.
+ assert len(self._state_stack) > 1, (
+ "Mismatch between calls to Add/RemoveFlags and Restore")
+ self._state_stack.pop()
+ return self._UpdateCommandLineFile()
+
+ def _UpdateCommandLineFile(self):
+ """Writes out the command line to the file, or removes it if empty.
+
+ Returns:
+ A list with the flags now stored on the device.
+ """
+ command_line = _SerializeFlags(self._state_stack[-1])
+ if command_line is not None:
+ self._device.WriteFile(self._cmdline_path, command_line)
+ else:
+ self._device.RemovePath(self._cmdline_path, force=True)
+
+ current_flags = self.GetCurrentFlags()
+ logger.info('Flags now set on the device: %s', current_flags)
+ return current_flags
+
+
+def _ParseFlags(line):
+ """Parse the string containing the command line into a list of flags.
+
+ It's a direct port of CommandLine.java::tokenizeQuotedArguments.
+
+ The first token is assumed to be the (unused) program name and stripped off
+ from the list of flags.
+
+ Args:
+ line: A string containing the entire command line. The first token is
+ assumed to be the program name.
+
+ Returns:
+ A list of flags, with quoting removed.
+ """
+ flags = []
+ current_quote = None
+ current_flag = None
+
+ for c in line:
+ # Detect start or end of quote block.
+ if (current_quote is None and c in _QUOTES) or c == current_quote:
+ if current_flag is not None and current_flag[-1] == _ESCAPE:
+ # Last char was a backslash; pop it, and treat c as a literal.
+ current_flag = current_flag[:-1] + c
+ else:
+ current_quote = c if current_quote is None else None
+ elif current_quote is None and c.isspace():
+ if current_flag is not None:
+ flags.append(current_flag)
+ current_flag = None
+ else:
+ if current_flag is None:
+ current_flag = ''
+ current_flag += c
+
+ if current_flag is not None:
+ if current_quote is not None:
+ logger.warning('Unterminated quoted argument: ' + current_flag)
+ flags.append(current_flag)
+
+ # Return everything but the program name.
+ return flags[1:]
+
+
+def _SerializeFlags(flags):
+ """Serialize a sequence of flags into a command line string.
+
+ Args:
+ flags: A sequence of strings with individual flags.
+
+ Returns:
+ A line with the command line contents to save; or None if the sequence of
+ flags is empty.
+ """
+ if flags:
+ # The first command line argument doesn't matter as we are not actually
+ # launching the chrome executable using this command line.
+ args = ['_']
+ args.extend(_QuoteFlag(f) for f in flags)
+ return ' '.join(args)
+ else:
+ return None
+
+
+def _QuoteFlag(flag):
+ """Validate and quote a single flag.
+
+ Args:
+ A string with the flag to quote.
+
+ Returns:
+ A string with the flag quoted so that it can be parsed by the algorithm
+ in _ParseFlags; or None if the flag does not appear to be valid.
+ """
+ if '=' in flag:
+ key, value = flag.split('=', 1)
+ else:
+ key, value = flag, None
+
+ if not flag or _RE_NEEDS_QUOTING.search(key):
+ # Probably not a valid flag, but quote the whole thing so it can be
+ # parsed back correctly.
+ return '"%s"' % flag.replace('"', r'\"')
+
+ if value is None:
+ return key
+
+ if _RE_NEEDS_QUOTING.search(value):
+ value = '"%s"' % value.replace('"', r'\"')
+ return '='.join([key, value])
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/flag_changer_devicetest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/flag_changer_devicetest.py
new file mode 100644
index 0000000..b75504b
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/flag_changer_devicetest.py
@@ -0,0 +1,88 @@
+#!/usr/bin/env python
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+"""
+Unit tests for the contents of flag_changer.py.
+The test will invoke real devices
+"""
+
+import os
+import posixpath
+import sys
+import unittest
+
+if __name__ == '__main__':
+ sys.path.append(
+ os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', )))
+
+from devil.android import device_test_case
+from devil.android import device_utils
+from devil.android import flag_changer
+from devil.android.sdk import adb_wrapper
+
+
+_CMDLINE_FILE = 'dummy-command-line'
+
+
+class FlagChangerTest(device_test_case.DeviceTestCase):
+
+ def setUp(self):
+ super(FlagChangerTest, self).setUp()
+ self.adb = adb_wrapper.AdbWrapper(self.serial)
+ self.adb.WaitForDevice()
+ self.device = device_utils.DeviceUtils(
+ self.adb, default_timeout=10, default_retries=0)
+ # pylint: disable=protected-access
+ self.cmdline_path = posixpath.join(flag_changer._CMDLINE_DIR, _CMDLINE_FILE)
+ self.cmdline_path_legacy = posixpath.join(
+ flag_changer._CMDLINE_DIR_LEGACY, _CMDLINE_FILE)
+
+ def tearDown(self):
+ super(FlagChangerTest, self).tearDown()
+ self.device.RemovePath(
+ [self.cmdline_path, self.cmdline_path_legacy], force=True, as_root=True)
+
+ def testFlagChanger_restoreFlags(self):
+ if not self.device.HasRoot():
+ self.skipTest('Test needs a rooted device')
+
+ # Write some custom chrome command line flags.
+ self.device.WriteFile(
+ self.cmdline_path, 'chrome --some --old --flags')
+
+ # Write some more flags on a command line file in the legacy location.
+ self.device.WriteFile(
+ self.cmdline_path_legacy, 'some --stray --flags', as_root=True)
+ self.assertTrue(self.device.PathExists(self.cmdline_path_legacy))
+
+ changer = flag_changer.FlagChanger(self.device, _CMDLINE_FILE)
+
+ # Legacy command line file is removed, ensuring Chrome picks up the
+ # right file.
+ self.assertFalse(self.device.PathExists(self.cmdline_path_legacy))
+
+ # Write some new files, and check they are set.
+ new_flags = ['--my', '--new', '--flags=with special value']
+ self.assertItemsEqual(
+ changer.ReplaceFlags(new_flags),
+ new_flags)
+
+ # Restore and go back to the old flags.
+ self.assertItemsEqual(
+ changer.Restore(),
+ ['--some', '--old', '--flags'])
+
+ def testFlagChanger_removeFlags(self):
+ self.device.RemovePath(self.cmdline_path, force=True)
+ self.assertFalse(self.device.PathExists(self.cmdline_path))
+
+ with flag_changer.CustomCommandLineFlags(
+ self.device, _CMDLINE_FILE, ['--some', '--flags']):
+ self.assertTrue(self.device.PathExists(self.cmdline_path))
+
+ self.assertFalse(self.device.PathExists(self.cmdline_path))
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/flag_changer_test.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/flag_changer_test.py
new file mode 100644
index 0000000..5342cf4
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/flag_changer_test.py
@@ -0,0 +1,135 @@
+#!/usr/bin/env python
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import posixpath
+import unittest
+
+from devil.android import flag_changer
+
+
+_CMDLINE_FILE = 'chrome-command-line'
+
+
+class _FakeDevice(object):
+ def __init__(self):
+ self.build_type = 'user'
+ self.has_root = True
+ self.file_system = {}
+
+ def HasRoot(self):
+ return self.has_root
+
+ def PathExists(self, filepath):
+ return filepath in self.file_system
+
+ def RemovePath(self, path, **_kwargs):
+ self.file_system.pop(path)
+
+ def WriteFile(self, path, contents, **_kwargs):
+ self.file_system[path] = contents
+
+ def ReadFile(self, path, **_kwargs):
+ return self.file_system[path]
+
+
+class FlagChangerTest(unittest.TestCase):
+ def setUp(self):
+ self.device = _FakeDevice()
+ # pylint: disable=protected-access
+ self.cmdline_path = posixpath.join(flag_changer._CMDLINE_DIR, _CMDLINE_FILE)
+ self.cmdline_path_legacy = posixpath.join(
+ flag_changer._CMDLINE_DIR_LEGACY, _CMDLINE_FILE)
+
+ def testFlagChanger_removeLegacyCmdLine(self):
+ self.device.WriteFile(self.cmdline_path_legacy, 'chrome --old --stuff')
+ self.assertTrue(self.device.PathExists(self.cmdline_path_legacy))
+
+ changer = flag_changer.FlagChanger(self.device, 'chrome-command-line')
+ self.assertEquals(
+ changer._cmdline_path, # pylint: disable=protected-access
+ self.cmdline_path)
+ self.assertFalse(self.device.PathExists(self.cmdline_path_legacy))
+
+ def testFlagChanger_mustBeFileName(self):
+ with self.assertRaises(ValueError):
+ flag_changer.FlagChanger(self.device, '/data/local/chrome-command-line')
+
+
+class ParseSerializeFlagsTest(unittest.TestCase):
+ def _testQuoteFlag(self, flag, expected_quoted_flag):
+ # Start with an unquoted flag, check that it's quoted as expected.
+ # pylint: disable=protected-access
+ quoted_flag = flag_changer._QuoteFlag(flag)
+ self.assertEqual(quoted_flag, expected_quoted_flag)
+ # Check that it survives a round-trip.
+ parsed_flags = flag_changer._ParseFlags('_ %s' % quoted_flag)
+ self.assertEqual(len(parsed_flags), 1)
+ self.assertEqual(flag, parsed_flags[0])
+
+ def testQuoteFlag_simple(self):
+ self._testQuoteFlag('--simple-flag', '--simple-flag')
+
+ def testQuoteFlag_withSimpleValue(self):
+ self._testQuoteFlag('--key=value', '--key=value')
+
+ def testQuoteFlag_withQuotedValue1(self):
+ self._testQuoteFlag('--key=valueA valueB', '--key="valueA valueB"')
+
+ def testQuoteFlag_withQuotedValue2(self):
+ self._testQuoteFlag(
+ '--key=this "should" work', r'--key="this \"should\" work"')
+
+ def testQuoteFlag_withQuotedValue3(self):
+ self._testQuoteFlag(
+ "--key=this is 'fine' too", '''--key="this is 'fine' too"''')
+
+ def testQuoteFlag_withQuotedValue4(self):
+ self._testQuoteFlag(
+ "--key='I really want to keep these quotes'",
+ '''--key="'I really want to keep these quotes'"''')
+
+ def testQuoteFlag_withQuotedValue5(self):
+ self._testQuoteFlag(
+ "--this is a strange=flag", '"--this is a strange=flag"')
+
+ def testQuoteFlag_withEmptyValue(self):
+ self._testQuoteFlag('--some-flag=', '--some-flag=')
+
+ def _testParseCmdLine(self, command_line, expected_flags):
+ # Start with a command line, check that flags are parsed as expected.
+ # pylint: disable=protected-access
+ flags = flag_changer._ParseFlags(command_line)
+ self.assertItemsEqual(flags, expected_flags)
+
+ # Check that flags survive a round-trip.
+ # Note: Although new_command_line and command_line may not match, they
+ # should describe the same set of flags.
+ new_command_line = flag_changer._SerializeFlags(flags)
+ new_flags = flag_changer._ParseFlags(new_command_line)
+ self.assertItemsEqual(new_flags, expected_flags)
+
+ def testParseCmdLine_simple(self):
+ self._testParseCmdLine(
+ 'chrome --foo --bar="a b" --baz=true --fine="ok"',
+ ['--foo', '--bar=a b', '--baz=true', '--fine=ok'])
+
+ def testParseCmdLine_withFancyQuotes(self):
+ self._testParseCmdLine(
+ r'''_ --foo="this 'is' ok"
+ --bar='this \'is\' too'
+ --baz="this \'is\' tricky"
+ ''',
+ ["--foo=this 'is' ok",
+ "--bar=this 'is' too",
+ r"--baz=this \'is\' tricky"])
+
+ def testParseCmdLine_withUnterminatedQuote(self):
+ self._testParseCmdLine(
+ '_ --foo --bar="I forgot something',
+ ['--foo', '--bar=I forgot something'])
+
+
+if __name__ == '__main__':
+ unittest.main(verbosity=2)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/forwarder.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/forwarder.py
new file mode 100644
index 0000000..76c56ec
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/forwarder.py
@@ -0,0 +1,467 @@
+# Copyright (c) 2012 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# pylint: disable=W0212
+
+import fcntl
+import logging
+import os
+import psutil
+
+from devil import base_error
+from devil import devil_env
+from devil.android import device_errors
+from devil.android.constants import file_system
+from devil.android.sdk import adb_wrapper
+from devil.android.valgrind_tools import base_tool
+from devil.utils import cmd_helper
+
+logger = logging.getLogger(__name__)
+
+# If passed as the device port, this will tell the forwarder to allocate
+# a dynamic port on the device. The actual port can then be retrieved with
+# Forwarder.DevicePortForHostPort.
+DYNAMIC_DEVICE_PORT = 0
+
+
+def _GetProcessStartTime(pid):
+ return psutil.Process(pid).create_time
+
+
+def _LogMapFailureDiagnostics(device):
+ # The host forwarder daemon logs to /tmp/host_forwarder_log, so print the end
+ # of that.
+ try:
+ with open('/tmp/host_forwarder_log') as host_forwarder_log:
+ logger.info('Last 50 lines of the host forwarder daemon log:')
+ for line in host_forwarder_log.read().splitlines()[-50:]:
+ logger.info(' %s', line)
+ except Exception: # pylint: disable=broad-except
+ # Grabbing the host forwarder log is best-effort. Ignore all errors.
+ logger.warning('Failed to get the contents of host_forwarder_log.')
+
+ # The device forwarder daemon logs to the logcat, so print the end of that.
+ try:
+ logger.info('Last 50 lines of logcat:')
+ for logcat_line in device.adb.Logcat(dump=True)[-50:]:
+ logger.info(' %s', logcat_line)
+ except (device_errors.CommandFailedError,
+ device_errors.DeviceUnreachableError):
+ # Grabbing the device forwarder log is also best-effort. Ignore all errors.
+ logger.warning('Failed to get the contents of the logcat.')
+
+ # Log alive device forwarders.
+ try:
+ ps_out = device.RunShellCommand(['ps'], check_return=True)
+ logger.info('Currently running device_forwarders:')
+ for line in ps_out:
+ if 'device_forwarder' in line:
+ logger.info(' %s', line)
+ except (device_errors.CommandFailedError,
+ device_errors.DeviceUnreachableError):
+ logger.warning('Failed to list currently running device_forwarder '
+ 'instances.')
+
+
+class _FileLock(object):
+ """With statement-aware implementation of a file lock.
+
+ File locks are needed for cross-process synchronization when the
+ multiprocessing Python module is used.
+ """
+
+ def __init__(self, path):
+ self._fd = -1
+ self._path = path
+
+ def __enter__(self):
+ self._fd = os.open(self._path, os.O_RDONLY | os.O_CREAT)
+ if self._fd < 0:
+ raise Exception('Could not open file %s for reading' % self._path)
+ fcntl.flock(self._fd, fcntl.LOCK_EX)
+
+ def __exit__(self, _exception_type, _exception_value, traceback):
+ fcntl.flock(self._fd, fcntl.LOCK_UN)
+ os.close(self._fd)
+
+
+class HostForwarderError(base_error.BaseError):
+ """Exception for failures involving host_forwarder."""
+
+ def __init__(self, message):
+ super(HostForwarderError, self).__init__(message)
+
+
+class Forwarder(object):
+ """Thread-safe class to manage port forwards from the device to the host."""
+
+ _DEVICE_FORWARDER_FOLDER = (file_system.TEST_EXECUTABLE_DIR +
+ '/forwarder/')
+ _DEVICE_FORWARDER_PATH = (file_system.TEST_EXECUTABLE_DIR +
+ '/forwarder/device_forwarder')
+ _LOCK_PATH = '/tmp/chrome.forwarder.lock'
+ # Defined in host_forwarder_main.cc
+ _HOST_FORWARDER_LOG = '/tmp/host_forwarder_log'
+
+ _TIMEOUT = 60 # seconds
+
+ _instance = None
+
+ @staticmethod
+ def Map(port_pairs, device, tool=None):
+ """Runs the forwarder.
+
+ Args:
+ port_pairs: A list of tuples (device_port, host_port) to forward. Note
+ that you can specify 0 as a device_port, in which case a
+ port will by dynamically assigned on the device. You can
+ get the number of the assigned port using the
+ DevicePortForHostPort method.
+ device: A DeviceUtils instance.
+ tool: Tool class to use to get wrapper, if necessary, for executing the
+ forwarder (see valgrind_tools.py).
+
+ Raises:
+ Exception on failure to forward the port.
+ """
+ if not tool:
+ tool = base_tool.BaseTool()
+ with _FileLock(Forwarder._LOCK_PATH):
+ instance = Forwarder._GetInstanceLocked(tool)
+ instance._InitDeviceLocked(device, tool)
+
+ device_serial = str(device)
+ map_arg_lists = [
+ ['--adb=' + adb_wrapper.AdbWrapper.GetAdbPath(),
+ '--serial-id=' + device_serial,
+ '--map', str(device_port), str(host_port)]
+ for device_port, host_port in port_pairs]
+ logger.info('Forwarding using commands: %s', map_arg_lists)
+
+ for map_arg_list in map_arg_lists:
+ try:
+ map_cmd = [instance._host_forwarder_path] + map_arg_list
+ (exit_code, output) = cmd_helper.GetCmdStatusAndOutputWithTimeout(
+ map_cmd, Forwarder._TIMEOUT)
+ except cmd_helper.TimeoutError as e:
+ raise HostForwarderError(
+ '`%s` timed out:\n%s' % (' '.join(map_cmd), e.output))
+ except OSError as e:
+ if e.errno == 2:
+ raise HostForwarderError(
+ 'Unable to start host forwarder. '
+ 'Make sure you have built host_forwarder.')
+ else: raise
+ if exit_code != 0:
+ try:
+ instance._KillDeviceLocked(device, tool)
+ except (device_errors.CommandFailedError,
+ device_errors.DeviceUnreachableError):
+ # We don't want the failure to kill the device forwarder to
+ # supersede the original failure to map.
+ logging.warning(
+ 'Failed to kill the device forwarder after map failure: %s',
+ str(e))
+ _LogMapFailureDiagnostics(device)
+ formatted_output = ('\n'.join(output) if isinstance(output, list)
+ else output)
+ raise HostForwarderError(
+ '`%s` exited with %d:\n%s' % (
+ ' '.join(map_cmd),
+ exit_code,
+ formatted_output))
+ tokens = output.split(':')
+ if len(tokens) != 2:
+ raise HostForwarderError(
+ 'Unexpected host forwarder output "%s", '
+ 'expected "device_port:host_port"' % output)
+ device_port = int(tokens[0])
+ host_port = int(tokens[1])
+ serial_with_port = (device_serial, device_port)
+ instance._device_to_host_port_map[serial_with_port] = host_port
+ instance._host_to_device_port_map[host_port] = serial_with_port
+ logger.info('Forwarding device port: %d to host port: %d.',
+ device_port, host_port)
+
+ @staticmethod
+ def UnmapDevicePort(device_port, device):
+ """Unmaps a previously forwarded device port.
+
+ Args:
+ device: A DeviceUtils instance.
+ device_port: A previously forwarded port (through Map()).
+ """
+ with _FileLock(Forwarder._LOCK_PATH):
+ Forwarder._UnmapDevicePortLocked(device_port, device)
+
+ @staticmethod
+ def UnmapAllDevicePorts(device):
+ """Unmaps all the previously forwarded ports for the provided device.
+
+ Args:
+ device: A DeviceUtils instance.
+ port_pairs: A list of tuples (device_port, host_port) to unmap.
+ """
+ with _FileLock(Forwarder._LOCK_PATH):
+ instance = Forwarder._GetInstanceLocked(None)
+ unmap_all_cmd = [
+ instance._host_forwarder_path,
+ '--adb=%s' % adb_wrapper.AdbWrapper.GetAdbPath(),
+ '--serial-id=%s' % device.serial,
+ '--unmap-all'
+ ]
+ try:
+ exit_code, output = cmd_helper.GetCmdStatusAndOutputWithTimeout(
+ unmap_all_cmd, Forwarder._TIMEOUT)
+ except cmd_helper.TimeoutError as e:
+ raise HostForwarderError(
+ '`%s` timed out:\n%s' % (' '.join(unmap_all_cmd), e.output))
+ if exit_code != 0:
+ error_msg = [
+ '`%s` exited with %d' % (' '.join(unmap_all_cmd), exit_code)]
+ if isinstance(output, list):
+ error_msg += output
+ else:
+ error_msg += [output]
+ raise HostForwarderError('\n'.join(error_msg))
+
+ # Clean out any entries from the device & host map.
+ device_map = instance._device_to_host_port_map
+ host_map = instance._host_to_device_port_map
+ for device_serial_and_port, host_port in device_map.items():
+ device_serial = device_serial_and_port[0]
+ if device_serial == device.serial:
+ del device_map[device_serial_and_port]
+ del host_map[host_port]
+
+ # Kill the device forwarder.
+ tool = base_tool.BaseTool()
+ instance._KillDeviceLocked(device, tool)
+
+ @staticmethod
+ def DevicePortForHostPort(host_port):
+ """Returns the device port that corresponds to a given host port."""
+ with _FileLock(Forwarder._LOCK_PATH):
+ serial_and_port = Forwarder._GetInstanceLocked(
+ None)._host_to_device_port_map.get(host_port)
+ return serial_and_port[1] if serial_and_port else None
+
+ @staticmethod
+ def RemoveHostLog():
+ if os.path.exists(Forwarder._HOST_FORWARDER_LOG):
+ os.unlink(Forwarder._HOST_FORWARDER_LOG)
+
+ @staticmethod
+ def GetHostLog():
+ if not os.path.exists(Forwarder._HOST_FORWARDER_LOG):
+ return ''
+ with file(Forwarder._HOST_FORWARDER_LOG, 'r') as f:
+ return f.read()
+
+ @staticmethod
+ def _GetInstanceLocked(tool):
+ """Returns the singleton instance.
+
+ Note that the global lock must be acquired before calling this method.
+
+ Args:
+ tool: Tool class to use to get wrapper, if necessary, for executing the
+ forwarder (see valgrind_tools.py).
+ """
+ if not Forwarder._instance:
+ Forwarder._instance = Forwarder(tool)
+ return Forwarder._instance
+
+ def __init__(self, tool):
+ """Constructs a new instance of Forwarder.
+
+ Note that Forwarder is a singleton therefore this constructor should be
+ called only once.
+
+ Args:
+ tool: Tool class to use to get wrapper, if necessary, for executing the
+ forwarder (see valgrind_tools.py).
+ """
+ assert not Forwarder._instance
+ self._tool = tool
+ self._initialized_devices = set()
+ self._device_to_host_port_map = dict()
+ self._host_to_device_port_map = dict()
+ self._host_forwarder_path = devil_env.config.FetchPath('forwarder_host')
+ assert os.path.exists(self._host_forwarder_path), 'Please build forwarder2'
+ self._InitHostLocked()
+
+ @staticmethod
+ def _UnmapDevicePortLocked(device_port, device):
+ """Internal method used by UnmapDevicePort().
+
+ Note that the global lock must be acquired before calling this method.
+ """
+ instance = Forwarder._GetInstanceLocked(None)
+ serial = str(device)
+ serial_with_port = (serial, device_port)
+ if not serial_with_port in instance._device_to_host_port_map:
+ logger.error('Trying to unmap non-forwarded port %d', device_port)
+ return
+
+ host_port = instance._device_to_host_port_map[serial_with_port]
+ del instance._device_to_host_port_map[serial_with_port]
+ del instance._host_to_device_port_map[host_port]
+
+ unmap_cmd = [
+ instance._host_forwarder_path,
+ '--adb=%s' % adb_wrapper.AdbWrapper.GetAdbPath(),
+ '--serial-id=%s' % serial,
+ '--unmap', str(device_port)
+ ]
+ try:
+ (exit_code, output) = cmd_helper.GetCmdStatusAndOutputWithTimeout(
+ unmap_cmd, Forwarder._TIMEOUT)
+ except cmd_helper.TimeoutError as e:
+ raise HostForwarderError(
+ '`%s` timed out:\n%s' % (' '.join(unmap_cmd), e.output))
+ if exit_code != 0:
+ logger.error(
+ '`%s` exited with %d:\n%s',
+ ' '.join(unmap_cmd),
+ exit_code,
+ '\n'.join(output) if isinstance(output, list) else output)
+
+ @staticmethod
+ def _GetPidForLock():
+ """Returns the PID used for host_forwarder initialization.
+
+ The PID of the "sharder" is used to handle multiprocessing. The "sharder"
+ is the initial process that forks that is the parent process.
+ """
+ return os.getpgrp()
+
+ def _InitHostLocked(self):
+ """Initializes the host forwarder daemon.
+
+ Note that the global lock must be acquired before calling this method. This
+ method kills any existing host_forwarder process that could be stale.
+ """
+ # See if the host_forwarder daemon was already initialized by a concurrent
+ # process or thread (in case multi-process sharding is not used).
+ pid_for_lock = Forwarder._GetPidForLock()
+ fd = os.open(Forwarder._LOCK_PATH, os.O_RDWR | os.O_CREAT)
+ with os.fdopen(fd, 'r+') as pid_file:
+ pid_with_start_time = pid_file.readline()
+ if pid_with_start_time:
+ (pid, process_start_time) = pid_with_start_time.split(':')
+ if pid == str(pid_for_lock):
+ if process_start_time == str(_GetProcessStartTime(pid_for_lock)):
+ return
+ self._KillHostLocked()
+ pid_file.seek(0)
+ pid_file.write(
+ '%s:%s' % (pid_for_lock, str(_GetProcessStartTime(pid_for_lock))))
+ pid_file.truncate()
+
+ def _InitDeviceLocked(self, device, tool):
+ """Initializes the device_forwarder daemon for a specific device (once).
+
+ Note that the global lock must be acquired before calling this method. This
+ method kills any existing device_forwarder daemon on the device that could
+ be stale, pushes the latest version of the daemon (to the device) and starts
+ it.
+
+ Args:
+ device: A DeviceUtils instance.
+ tool: Tool class to use to get wrapper, if necessary, for executing the
+ forwarder (see valgrind_tools.py).
+ """
+ device_serial = str(device)
+ if device_serial in self._initialized_devices:
+ return
+ try:
+ self._KillDeviceLocked(device, tool)
+ except device_errors.CommandFailedError:
+ logger.warning('Failed to kill device forwarder. Rebooting.')
+ device.Reboot()
+ forwarder_device_path_on_host = devil_env.config.FetchPath(
+ 'forwarder_device', device=device)
+ forwarder_device_path_on_device = (
+ Forwarder._DEVICE_FORWARDER_FOLDER
+ if os.path.isdir(forwarder_device_path_on_host)
+ else Forwarder._DEVICE_FORWARDER_PATH)
+ device.PushChangedFiles([(
+ forwarder_device_path_on_host,
+ forwarder_device_path_on_device)])
+
+ cmd = [Forwarder._DEVICE_FORWARDER_PATH]
+ wrapper = tool.GetUtilWrapper()
+ if wrapper:
+ cmd.insert(0, wrapper)
+ device.RunShellCommand(
+ cmd, env={'LD_LIBRARY_PATH': Forwarder._DEVICE_FORWARDER_FOLDER},
+ check_return=True)
+ self._initialized_devices.add(device_serial)
+
+ @staticmethod
+ def KillHost():
+ """Kills the forwarder process running on the host."""
+ with _FileLock(Forwarder._LOCK_PATH):
+ Forwarder._GetInstanceLocked(None)._KillHostLocked()
+
+ def _KillHostLocked(self):
+ """Kills the forwarder process running on the host.
+
+ Note that the global lock must be acquired before calling this method.
+ """
+ logger.info('Killing host_forwarder.')
+ try:
+ kill_cmd = [self._host_forwarder_path, '--kill-server']
+ (exit_code, _o) = cmd_helper.GetCmdStatusAndOutputWithTimeout(
+ kill_cmd, Forwarder._TIMEOUT)
+ if exit_code != 0:
+ kill_cmd = ['pkill', '-9', 'host_forwarder']
+ (exit_code, output) = cmd_helper.GetCmdStatusAndOutputWithTimeout(
+ kill_cmd, Forwarder._TIMEOUT)
+ if exit_code != 0:
+ raise HostForwarderError(
+ '%s exited with %d:\n%s' % (
+ self._host_forwarder_path,
+ exit_code,
+ '\n'.join(output) if isinstance(output, list) else output))
+ except cmd_helper.TimeoutError as e:
+ raise HostForwarderError(
+ '`%s` timed out:\n%s' % (' '.join(kill_cmd), e.output))
+
+ @staticmethod
+ def KillDevice(device, tool=None):
+ """Kills the forwarder process running on the device.
+
+ Args:
+ device: Instance of DeviceUtils for talking to the device.
+ tool: Wrapper tool (e.g. valgrind) that can be used to execute the device
+ forwarder (see valgrind_tools.py).
+ """
+ with _FileLock(Forwarder._LOCK_PATH):
+ Forwarder._GetInstanceLocked(None)._KillDeviceLocked(
+ device, tool or base_tool.BaseTool())
+
+ def _KillDeviceLocked(self, device, tool):
+ """Kills the forwarder process running on the device.
+
+ Note that the global lock must be acquired before calling this method.
+
+ Args:
+ device: Instance of DeviceUtils for talking to the device.
+ tool: Wrapper tool (e.g. valgrind) that can be used to execute the device
+ forwarder (see valgrind_tools.py).
+ """
+ logger.info('Killing device_forwarder.')
+ self._initialized_devices.discard(device.serial)
+ if not device.FileExists(Forwarder._DEVICE_FORWARDER_PATH):
+ return
+
+ cmd = [Forwarder._DEVICE_FORWARDER_PATH, '--kill-server']
+ wrapper = tool.GetUtilWrapper()
+ if wrapper:
+ cmd.insert(0, wrapper)
+ device.RunShellCommand(
+ cmd, env={'LD_LIBRARY_PATH': Forwarder._DEVICE_FORWARDER_FOLDER},
+ check_return=True)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/install_commands.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/install_commands.py
new file mode 100644
index 0000000..c8da869
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/install_commands.py
@@ -0,0 +1,57 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import posixpath
+
+from devil import devil_env
+from devil.android import device_errors
+from devil.android.constants import file_system
+
+BIN_DIR = '%s/bin' % file_system.TEST_EXECUTABLE_DIR
+_FRAMEWORK_DIR = '%s/framework' % file_system.TEST_EXECUTABLE_DIR
+
+_COMMANDS = {
+ 'unzip': 'org.chromium.android.commands.unzip.Unzip',
+}
+
+_SHELL_COMMAND_FORMAT = (
+"""#!/system/bin/sh
+base=%s
+export CLASSPATH=$base/framework/chromium_commands.jar
+exec app_process $base/bin %s $@
+""")
+
+
+def Installed(device):
+ paths = [posixpath.join(BIN_DIR, c) for c in _COMMANDS]
+ paths.append(posixpath.join(_FRAMEWORK_DIR, 'chromium_commands.jar'))
+ return device.PathExists(paths)
+
+
+def InstallCommands(device):
+ if device.IsUserBuild():
+ raise device_errors.CommandFailedError(
+ 'chromium_commands currently requires a userdebug build.',
+ device_serial=device.adb.GetDeviceSerial())
+
+ chromium_commands_jar_path = devil_env.config.FetchPath('chromium_commands')
+ if not os.path.exists(chromium_commands_jar_path):
+ raise device_errors.CommandFailedError(
+ '%s not found. Please build chromium_commands.'
+ % chromium_commands_jar_path)
+
+ device.RunShellCommand(
+ ['mkdir', '-p', BIN_DIR, _FRAMEWORK_DIR], check_return=True)
+ for command, main_class in _COMMANDS.iteritems():
+ shell_command = _SHELL_COMMAND_FORMAT % (
+ file_system.TEST_EXECUTABLE_DIR, main_class)
+ shell_file = '%s/%s' % (BIN_DIR, command)
+ device.WriteFile(shell_file, shell_command)
+ device.RunShellCommand(
+ ['chmod', '755', shell_file], check_return=True)
+
+ device.adb.Push(
+ chromium_commands_jar_path,
+ '%s/chromium_commands.jar' % _FRAMEWORK_DIR)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/logcat_monitor.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/logcat_monitor.py
new file mode 100644
index 0000000..0aece87
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/logcat_monitor.py
@@ -0,0 +1,255 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# pylint: disable=unused-argument
+
+import errno
+import logging
+import os
+import re
+import shutil
+import tempfile
+import threading
+import time
+
+from devil.android import decorators
+from devil.android import device_errors
+from devil.android.sdk import adb_wrapper
+from devil.utils import reraiser_thread
+
+logger = logging.getLogger(__name__)
+
+
+class LogcatMonitor(object):
+
+ _RECORD_ITER_TIMEOUT = 2.0
+ _RECORD_THREAD_JOIN_WAIT = 5.0
+ _WAIT_TIME = 0.2
+ _THREADTIME_RE_FORMAT = (
+ r'(?P<date>\S*) +(?P<time>\S*) +(?P<proc_id>%s) +(?P<thread_id>%s) +'
+ r'(?P<log_level>%s) +(?P<component>%s) *: +(?P<message>%s)$')
+
+ def __init__(self, adb, clear=True, filter_specs=None, output_file=None):
+ """Create a LogcatMonitor instance.
+
+ Args:
+ adb: An instance of adb_wrapper.AdbWrapper.
+ clear: If True, clear the logcat when monitoring starts.
+ filter_specs: An optional list of '<tag>[:priority]' strings.
+ output_file: File path to save recorded logcat.
+ """
+ if isinstance(adb, adb_wrapper.AdbWrapper):
+ self._adb = adb
+ else:
+ raise ValueError('Unsupported type passed for argument "device"')
+ self._clear = clear
+ self._filter_specs = filter_specs
+ self._output_file = output_file
+ self._record_file = None
+ self._record_file_lock = threading.Lock()
+ self._record_thread = None
+ self._stop_recording_event = threading.Event()
+
+ @property
+ def output_file(self):
+ return self._output_file
+
+ @decorators.WithTimeoutAndRetriesDefaults(10, 0)
+ def WaitFor(self, success_regex, failure_regex=None, timeout=None,
+ retries=None):
+ """Wait for a matching logcat line or until a timeout occurs.
+
+ This will attempt to match lines in the logcat against both |success_regex|
+ and |failure_regex| (if provided). Note that this calls re.search on each
+ logcat line, not re.match, so the provided regular expressions don't have
+ to match an entire line.
+
+ Args:
+ success_regex: The regular expression to search for.
+ failure_regex: An optional regular expression that, if hit, causes this
+ to stop looking for a match. Can be None.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ A match object if |success_regex| matches a part of a logcat line, or
+ None if |failure_regex| matches a part of a logcat line.
+ Raises:
+ CommandFailedError on logcat failure (NOT on a |failure_regex| match).
+ CommandTimeoutError if no logcat line matching either |success_regex| or
+ |failure_regex| is found in |timeout| seconds.
+ DeviceUnreachableError if the device becomes unreachable.
+ LogcatMonitorCommandError when calling |WaitFor| while not recording
+ logcat.
+ """
+ if self._record_thread is None:
+ raise LogcatMonitorCommandError(
+ 'Must be recording logcat when calling |WaitFor|',
+ device_serial=str(self._adb))
+ if isinstance(success_regex, basestring):
+ success_regex = re.compile(success_regex)
+ if isinstance(failure_regex, basestring):
+ failure_regex = re.compile(failure_regex)
+
+ logger.debug('Waiting %d seconds for "%s"', timeout, success_regex.pattern)
+
+ # NOTE This will continue looping until:
+ # - success_regex matches a line, in which case the match object is
+ # returned.
+ # - failure_regex matches a line, in which case None is returned
+ # - the timeout is hit, in which case a CommandTimeoutError is raised.
+ with open(self._record_file.name, 'r') as f:
+ while True:
+ line = f.readline()
+ if line:
+ m = success_regex.search(line)
+ if m:
+ return m
+ if failure_regex and failure_regex.search(line):
+ return None
+ else:
+ time.sleep(self._WAIT_TIME)
+
+ def FindAll(self, message_regex, proc_id=None, thread_id=None, log_level=None,
+ component=None):
+ """Finds all lines in the logcat that match the provided constraints.
+
+ Args:
+ message_regex: The regular expression that the <message> section must
+ match.
+ proc_id: The process ID to match. If None, matches any process ID.
+ thread_id: The thread ID to match. If None, matches any thread ID.
+ log_level: The log level to match. If None, matches any log level.
+ component: The component to match. If None, matches any component.
+
+ Raises:
+ LogcatMonitorCommandError when calling |FindAll| before recording logcat.
+
+ Yields:
+ A match object for each matching line in the logcat. The match object
+ will always contain, in addition to groups defined in |message_regex|,
+ the following named groups: 'date', 'time', 'proc_id', 'thread_id',
+ 'log_level', 'component', and 'message'.
+ """
+ if self._record_file is None:
+ raise LogcatMonitorCommandError(
+ 'Must have recorded or be recording a logcat to call |FindAll|',
+ device_serial=str(self._adb))
+ if proc_id is None:
+ proc_id = r'\d+'
+ if thread_id is None:
+ thread_id = r'\d+'
+ if log_level is None:
+ log_level = r'[VDIWEF]'
+ if component is None:
+ component = r'[^\s:]+'
+ # pylint: disable=protected-access
+ threadtime_re = re.compile(
+ type(self)._THREADTIME_RE_FORMAT % (
+ proc_id, thread_id, log_level, component, message_regex))
+
+ with open(self._record_file.name, 'r') as f:
+ for line in f:
+ m = re.match(threadtime_re, line)
+ if m:
+ yield m
+
+ def _StartRecording(self):
+ """Starts recording logcat to file.
+
+ Function spawns a thread that records logcat to file and will not die
+ until |StopRecording| is called.
+ """
+ def record_to_file():
+ # Write the log with line buffering so the consumer sees each individual
+ # line.
+ for data in self._adb.Logcat(filter_specs=self._filter_specs,
+ logcat_format='threadtime',
+ iter_timeout=self._RECORD_ITER_TIMEOUT):
+ if self._stop_recording_event.isSet():
+ return
+
+ if data is None:
+ # Logcat can yield None if the iter_timeout is hit.
+ continue
+
+ with self._record_file_lock:
+ if self._record_file and not self._record_file.closed:
+ self._record_file.write(data + '\n')
+
+ self._stop_recording_event.clear()
+ if not self._record_thread:
+ self._record_thread = reraiser_thread.ReraiserThread(record_to_file)
+ self._record_thread.start()
+
+ def _StopRecording(self):
+ """Finish recording logcat."""
+ if self._record_thread:
+ self._stop_recording_event.set()
+ self._record_thread.join(timeout=self._RECORD_THREAD_JOIN_WAIT)
+ self._record_thread.ReraiseIfException()
+ self._record_thread = None
+
+ def Start(self):
+ """Starts the logcat monitor.
+
+ Clears the logcat if |clear| was set in |__init__|.
+ """
+ if self._clear:
+ self._adb.Logcat(clear=True)
+ if not self._record_file:
+ self._record_file = tempfile.NamedTemporaryFile(mode='a', bufsize=1)
+ self._StartRecording()
+
+ def Stop(self):
+ """Stops the logcat monitor.
+
+ Stops recording the logcat. Copies currently recorded logcat to
+ |self._output_file|.
+ """
+ self._StopRecording()
+ with self._record_file_lock:
+ if self._record_file and self._output_file:
+ try:
+ os.makedirs(os.path.dirname(self._output_file))
+ except OSError as e:
+ if e.errno != errno.EEXIST:
+ raise
+ shutil.copy(self._record_file.name, self._output_file)
+
+ def Close(self):
+ """Closes logcat recording file.
+
+ Should be called when finished using the logcat monitor.
+ """
+ with self._record_file_lock:
+ if self._record_file:
+ self._record_file.close()
+ self._record_file = None
+
+ def __enter__(self):
+ """Starts the logcat monitor."""
+ self.Start()
+ return self
+
+ def __exit__(self, exc_type, exc_val, exc_tb):
+ """Stops the logcat monitor."""
+ self.Stop()
+
+ def __del__(self):
+ """Closes logcat recording file in case |Close| was never called."""
+ with self._record_file_lock:
+ if self._record_file:
+ logger.warning(
+ 'Need to call |Close| on the logcat monitor when done!')
+ self._record_file.close()
+
+ @property
+ def adb(self):
+ return self._adb
+
+
+class LogcatMonitorCommandError(device_errors.CommandFailedError):
+ """Exception for errors with logcat monitor commands."""
+ pass
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/logcat_monitor_test.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/logcat_monitor_test.py
new file mode 100644
index 0000000..8fb4d74
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/logcat_monitor_test.py
@@ -0,0 +1,230 @@
+#!/usr/bin/env python
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# pylint: disable=protected-access
+
+import itertools
+import threading
+import unittest
+
+from devil import devil_env
+from devil.android import logcat_monitor
+from devil.android.sdk import adb_wrapper
+
+with devil_env.SysPath(devil_env.PYMOCK_PATH):
+ import mock # pylint: disable=import-error
+
+
+def _CreateTestLog(raw_logcat=None):
+ test_adb = adb_wrapper.AdbWrapper('0123456789abcdef')
+ test_adb.Logcat = mock.Mock(return_value=(l for l in raw_logcat))
+ test_log = logcat_monitor.LogcatMonitor(test_adb, clear=False)
+ return test_log
+
+
+class LogcatMonitorTest(unittest.TestCase):
+
+ _TEST_THREADTIME_LOGCAT_DATA = [
+ '01-01 01:02:03.456 7890 0987 V LogcatMonitorTest: '
+ 'verbose logcat monitor test message 1',
+ '01-01 01:02:03.457 8901 1098 D LogcatMonitorTest: '
+ 'debug logcat monitor test message 2',
+ '01-01 01:02:03.458 9012 2109 I LogcatMonitorTest: '
+ 'info logcat monitor test message 3',
+ '01-01 01:02:03.459 0123 3210 W LogcatMonitorTest: '
+ 'warning logcat monitor test message 4',
+ '01-01 01:02:03.460 1234 4321 E LogcatMonitorTest: '
+ 'error logcat monitor test message 5',
+ '01-01 01:02:03.461 2345 5432 F LogcatMonitorTest: '
+ 'fatal logcat monitor test message 6',
+ '01-01 01:02:03.462 3456 6543 D LogcatMonitorTest: '
+ 'last line'
+ ]
+
+ def assertIterEqual(self, expected_iter, actual_iter):
+ for expected, actual in itertools.izip_longest(expected_iter, actual_iter):
+ self.assertIsNotNone(
+ expected,
+ msg='actual has unexpected elements starting with %s' % str(actual))
+ self.assertIsNotNone(
+ actual,
+ msg='actual is missing elements starting with %s' % str(expected))
+ self.assertEqual(actual.group('proc_id'), expected[0])
+ self.assertEqual(actual.group('thread_id'), expected[1])
+ self.assertEqual(actual.group('log_level'), expected[2])
+ self.assertEqual(actual.group('component'), expected[3])
+ self.assertEqual(actual.group('message'), expected[4])
+
+ with self.assertRaises(StopIteration):
+ next(actual_iter)
+ with self.assertRaises(StopIteration):
+ next(expected_iter)
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testWaitFor_success(self):
+ test_log = _CreateTestLog(
+ raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
+ test_log.Start()
+ actual_match = test_log.WaitFor(r'.*(fatal|error) logcat monitor.*', None)
+ self.assertTrue(actual_match)
+ self.assertEqual(
+ '01-01 01:02:03.460 1234 4321 E LogcatMonitorTest: '
+ 'error logcat monitor test message 5',
+ actual_match.group(0))
+ self.assertEqual('error', actual_match.group(1))
+ test_log.Stop()
+ test_log.Close()
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testWaitFor_failure(self):
+ test_log = _CreateTestLog(
+ raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
+ test_log.Start()
+ actual_match = test_log.WaitFor(
+ r'.*My Success Regex.*', r'.*(fatal|error) logcat monitor.*')
+ self.assertIsNone(actual_match)
+ test_log.Stop()
+ test_log.Close()
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testWaitFor_buffering(self):
+ # Simulate an adb log stream which does not complete until the test tells it
+ # to. This checks that the log matcher can receive individual lines from the
+ # log reader thread even if adb is not producing enough output to fill an
+ # entire file io buffer.
+ finished_lock = threading.Lock()
+ finished_lock.acquire()
+
+ def LogGenerator():
+ for line in type(self)._TEST_THREADTIME_LOGCAT_DATA:
+ yield line
+ finished_lock.acquire()
+
+ test_adb = adb_wrapper.AdbWrapper('0123456789abcdef')
+ test_adb.Logcat = mock.Mock(return_value=LogGenerator())
+ test_log = logcat_monitor.LogcatMonitor(test_adb, clear=False)
+ test_log.Start()
+
+ actual_match = test_log.WaitFor(r'.*last line.*', None)
+ finished_lock.release()
+ self.assertTrue(actual_match)
+ test_log.Stop()
+ test_log.Close()
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testFindAll_defaults(self):
+ test_log = _CreateTestLog(
+ raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
+ test_log.Start()
+ test_log.WaitFor(r'.*last line.*', None)
+ test_log.Stop()
+ expected_results = [
+ ('7890', '0987', 'V', 'LogcatMonitorTest',
+ 'verbose logcat monitor test message 1'),
+ ('8901', '1098', 'D', 'LogcatMonitorTest',
+ 'debug logcat monitor test message 2'),
+ ('9012', '2109', 'I', 'LogcatMonitorTest',
+ 'info logcat monitor test message 3'),
+ ('0123', '3210', 'W', 'LogcatMonitorTest',
+ 'warning logcat monitor test message 4'),
+ ('1234', '4321', 'E', 'LogcatMonitorTest',
+ 'error logcat monitor test message 5'),
+ ('2345', '5432', 'F', 'LogcatMonitorTest',
+ 'fatal logcat monitor test message 6')]
+ actual_results = test_log.FindAll(r'\S* logcat monitor test message \d')
+ self.assertIterEqual(iter(expected_results), actual_results)
+ test_log.Close()
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testFindAll_defaults_miss(self):
+ test_log = _CreateTestLog(
+ raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
+ test_log.Start()
+ test_log.WaitFor(r'.*last line.*', None)
+ test_log.Stop()
+ expected_results = []
+ actual_results = test_log.FindAll(r'\S* nothing should match this \d')
+ self.assertIterEqual(iter(expected_results), actual_results)
+ test_log.Close()
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testFindAll_filterProcId(self):
+ test_log = _CreateTestLog(
+ raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
+ test_log.Start()
+ test_log.WaitFor(r'.*last line.*', None)
+ test_log.Stop()
+ actual_results = test_log.FindAll(
+ r'\S* logcat monitor test message \d', proc_id=1234)
+ expected_results = [
+ ('1234', '4321', 'E', 'LogcatMonitorTest',
+ 'error logcat monitor test message 5')]
+ self.assertIterEqual(iter(expected_results), actual_results)
+ test_log.Close()
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testFindAll_filterThreadId(self):
+ test_log = _CreateTestLog(
+ raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
+ test_log.Start()
+ test_log.WaitFor(r'.*last line.*', None)
+ test_log.Stop()
+ actual_results = test_log.FindAll(
+ r'\S* logcat monitor test message \d', thread_id=2109)
+ expected_results = [
+ ('9012', '2109', 'I', 'LogcatMonitorTest',
+ 'info logcat monitor test message 3')]
+ self.assertIterEqual(iter(expected_results), actual_results)
+ test_log.Close()
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testFindAll_filterLogLevel(self):
+ test_log = _CreateTestLog(
+ raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
+ test_log.Start()
+ test_log.WaitFor(r'.*last line.*', None)
+ test_log.Stop()
+ actual_results = test_log.FindAll(
+ r'\S* logcat monitor test message \d', log_level=r'[DW]')
+ expected_results = [
+ ('8901', '1098', 'D', 'LogcatMonitorTest',
+ 'debug logcat monitor test message 2'),
+ ('0123', '3210', 'W', 'LogcatMonitorTest',
+ 'warning logcat monitor test message 4')
+ ]
+ self.assertIterEqual(iter(expected_results), actual_results)
+ test_log.Close()
+
+ @mock.patch('time.sleep', mock.Mock())
+ def testFindAll_filterComponent(self):
+ test_log = _CreateTestLog(
+ raw_logcat=type(self)._TEST_THREADTIME_LOGCAT_DATA)
+ test_log.Start()
+ test_log.WaitFor(r'.*last line.*', None)
+ test_log.Stop()
+ actual_results = test_log.FindAll(r'.*', component='LogcatMonitorTest')
+ expected_results = [
+ ('7890', '0987', 'V', 'LogcatMonitorTest',
+ 'verbose logcat monitor test message 1'),
+ ('8901', '1098', 'D', 'LogcatMonitorTest',
+ 'debug logcat monitor test message 2'),
+ ('9012', '2109', 'I', 'LogcatMonitorTest',
+ 'info logcat monitor test message 3'),
+ ('0123', '3210', 'W', 'LogcatMonitorTest',
+ 'warning logcat monitor test message 4'),
+ ('1234', '4321', 'E', 'LogcatMonitorTest',
+ 'error logcat monitor test message 5'),
+ ('2345', '5432', 'F', 'LogcatMonitorTest',
+ 'fatal logcat monitor test message 6'),
+ ('3456', '6543', 'D', 'LogcatMonitorTest',
+ 'last line')
+ ]
+ self.assertIterEqual(iter(expected_results), actual_results)
+ test_log.Close()
+
+
+if __name__ == '__main__':
+ unittest.main(verbosity=2)
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/md5sum.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/md5sum.py
new file mode 100644
index 0000000..6dece9e
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/md5sum.py
@@ -0,0 +1,120 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import posixpath
+import re
+
+from devil import devil_env
+from devil.android import device_errors
+from devil.utils import cmd_helper
+
+MD5SUM_DEVICE_LIB_PATH = '/data/local/tmp/md5sum'
+MD5SUM_DEVICE_BIN_PATH = MD5SUM_DEVICE_LIB_PATH + '/md5sum_bin'
+
+_STARTS_WITH_CHECKSUM_RE = re.compile(r'^\s*[0-9a-fA-F]{32}\s+')
+
+
+def CalculateHostMd5Sums(paths):
+ """Calculates the MD5 sum value for all items in |paths|.
+
+ Directories are traversed recursively and the MD5 sum of each file found is
+ reported in the result.
+
+ Args:
+ paths: A list of host paths to md5sum.
+ Returns:
+ A dict mapping file paths to their respective md5sum checksums.
+ """
+ if isinstance(paths, basestring):
+ paths = [paths]
+
+ md5sum_bin_host_path = devil_env.config.FetchPath('md5sum_host')
+ if not os.path.exists(md5sum_bin_host_path):
+ raise IOError('File not built: %s' % md5sum_bin_host_path)
+ out = cmd_helper.GetCmdOutput(
+ [md5sum_bin_host_path] + [os.path.realpath(p) for p in paths])
+
+ return _ParseMd5SumOutput(out.splitlines())
+
+
+def CalculateDeviceMd5Sums(paths, device):
+ """Calculates the MD5 sum value for all items in |paths|.
+
+ Directories are traversed recursively and the MD5 sum of each file found is
+ reported in the result.
+
+ Args:
+ paths: A list of device paths to md5sum.
+ Returns:
+ A dict mapping file paths to their respective md5sum checksums.
+ """
+ if not paths:
+ return {}
+
+ if isinstance(paths, basestring):
+ paths = [paths]
+ # Allow generators
+ paths = list(paths)
+
+ md5sum_dist_path = devil_env.config.FetchPath('md5sum_device', device=device)
+
+ if os.path.isdir(md5sum_dist_path):
+ md5sum_dist_bin_path = os.path.join(md5sum_dist_path, 'md5sum_bin')
+ else:
+ md5sum_dist_bin_path = md5sum_dist_path
+
+ if not os.path.exists(md5sum_dist_path):
+ raise IOError('File not built: %s' % md5sum_dist_path)
+ md5sum_file_size = os.path.getsize(md5sum_dist_bin_path)
+
+ # For better performance, make the script as small as possible to try and
+ # avoid needing to write to an intermediary file (which RunShellCommand will
+ # do if necessary).
+ md5sum_script = 'a=%s;' % MD5SUM_DEVICE_BIN_PATH
+ # Check if the binary is missing or has changed (using its file size as an
+ # indicator), and trigger a (re-)push via the exit code.
+ md5sum_script += '! [[ $(ls -l $a) = *%d* ]]&&exit 2;' % md5sum_file_size
+ # Make sure it can find libbase.so
+ md5sum_script += 'export LD_LIBRARY_PATH=%s;' % MD5SUM_DEVICE_LIB_PATH
+ if len(paths) > 1:
+ prefix = posixpath.commonprefix(paths)
+ if len(prefix) > 4:
+ md5sum_script += 'p="%s";' % prefix
+ paths = ['$p"%s"' % p[len(prefix):] for p in paths]
+
+ md5sum_script += ';'.join('$a %s' % p for p in paths)
+ # Don't fail the script if the last md5sum fails (due to file not found)
+ # Note: ":" is equivalent to "true".
+ md5sum_script += ';:'
+ try:
+ out = device.RunShellCommand(md5sum_script, shell=True, check_return=True)
+ except device_errors.AdbShellCommandFailedError as e:
+ # Push the binary only if it is found to not exist
+ # (faster than checking up-front).
+ if e.status == 2:
+ # If files were previously pushed as root (adbd running as root), trying
+ # to re-push as non-root causes the push command to report success, but
+ # actually fail. So, wipe the directory first.
+ device.RunShellCommand(['rm', '-rf', MD5SUM_DEVICE_LIB_PATH],
+ as_root=True, check_return=True)
+ if os.path.isdir(md5sum_dist_path):
+ device.adb.Push(md5sum_dist_path, MD5SUM_DEVICE_LIB_PATH)
+ else:
+ mkdir_cmd = 'a=%s;[[ -e $a ]] || mkdir $a' % MD5SUM_DEVICE_LIB_PATH
+ device.RunShellCommand(mkdir_cmd, shell=True, check_return=True)
+ device.adb.Push(md5sum_dist_bin_path, MD5SUM_DEVICE_BIN_PATH)
+
+ out = device.RunShellCommand(md5sum_script, shell=True, check_return=True)
+ else:
+ raise
+
+ return _ParseMd5SumOutput(out)
+
+
+def _ParseMd5SumOutput(out):
+ hash_and_path = (l.split(None, 1) for l in out
+ if l and _STARTS_WITH_CHECKSUM_RE.match(l))
+ return dict((p, h) for h, p in hash_and_path)
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/md5sum_test.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/md5sum_test.py
new file mode 100644
index 0000000..c9b4954
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/md5sum_test.py
@@ -0,0 +1,237 @@
+#!/usr/bin/env python
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import unittest
+
+from devil import devil_env
+from devil.android import device_errors
+from devil.android import md5sum
+
+with devil_env.SysPath(devil_env.PYMOCK_PATH):
+ import mock # pylint: disable=import-error
+
+TEST_OUT_DIR = os.path.join('test', 'out', 'directory')
+HOST_MD5_EXECUTABLE = os.path.join(TEST_OUT_DIR, 'md5sum_bin_host')
+MD5_DIST = os.path.join(TEST_OUT_DIR, 'md5sum_dist')
+
+
+class Md5SumTest(unittest.TestCase):
+
+ def setUp(self):
+ mocked_attrs = {
+ 'md5sum_host': HOST_MD5_EXECUTABLE,
+ 'md5sum_device': MD5_DIST,
+ }
+ self._patchers = [
+ mock.patch('devil.devil_env._Environment.FetchPath',
+ mock.Mock(side_effect=lambda a, device=None: mocked_attrs[a])),
+ mock.patch('os.path.exists',
+ new=mock.Mock(return_value=True)),
+ ]
+ for p in self._patchers:
+ p.start()
+
+ def tearDown(self):
+ for p in self._patchers:
+ p.stop()
+
+ def testCalculateHostMd5Sums_singlePath(self):
+ test_path = '/test/host/file.dat'
+ mock_get_cmd_output = mock.Mock(
+ return_value='0123456789abcdeffedcba9876543210 /test/host/file.dat')
+ with mock.patch('devil.utils.cmd_helper.GetCmdOutput',
+ new=mock_get_cmd_output):
+ out = md5sum.CalculateHostMd5Sums(test_path)
+ self.assertEquals(1, len(out))
+ self.assertTrue('/test/host/file.dat' in out)
+ self.assertEquals('0123456789abcdeffedcba9876543210',
+ out['/test/host/file.dat'])
+ mock_get_cmd_output.assert_called_once_with(
+ [HOST_MD5_EXECUTABLE, '/test/host/file.dat'])
+
+ def testCalculateHostMd5Sums_list(self):
+ test_paths = ['/test/host/file0.dat', '/test/host/file1.dat']
+ mock_get_cmd_output = mock.Mock(
+ return_value='0123456789abcdeffedcba9876543210 /test/host/file0.dat\n'
+ '123456789abcdef00fedcba987654321 /test/host/file1.dat\n')
+ with mock.patch('devil.utils.cmd_helper.GetCmdOutput',
+ new=mock_get_cmd_output):
+ out = md5sum.CalculateHostMd5Sums(test_paths)
+ self.assertEquals(2, len(out))
+ self.assertTrue('/test/host/file0.dat' in out)
+ self.assertEquals('0123456789abcdeffedcba9876543210',
+ out['/test/host/file0.dat'])
+ self.assertTrue('/test/host/file1.dat' in out)
+ self.assertEquals('123456789abcdef00fedcba987654321',
+ out['/test/host/file1.dat'])
+ mock_get_cmd_output.assert_called_once_with(
+ [HOST_MD5_EXECUTABLE, '/test/host/file0.dat',
+ '/test/host/file1.dat'])
+
+ def testCalculateHostMd5Sums_generator(self):
+ test_paths = ('/test/host/' + p for p in ['file0.dat', 'file1.dat'])
+ mock_get_cmd_output = mock.Mock(
+ return_value='0123456789abcdeffedcba9876543210 /test/host/file0.dat\n'
+ '123456789abcdef00fedcba987654321 /test/host/file1.dat\n')
+ with mock.patch('devil.utils.cmd_helper.GetCmdOutput',
+ new=mock_get_cmd_output):
+ out = md5sum.CalculateHostMd5Sums(test_paths)
+ self.assertEquals(2, len(out))
+ self.assertTrue('/test/host/file0.dat' in out)
+ self.assertEquals('0123456789abcdeffedcba9876543210',
+ out['/test/host/file0.dat'])
+ self.assertTrue('/test/host/file1.dat' in out)
+ self.assertEquals('123456789abcdef00fedcba987654321',
+ out['/test/host/file1.dat'])
+ mock_get_cmd_output.assert_called_once_with(
+ [HOST_MD5_EXECUTABLE, '/test/host/file0.dat', '/test/host/file1.dat'])
+
+ def testCalculateDeviceMd5Sums_noPaths(self):
+ device = mock.NonCallableMock()
+ device.RunShellCommand = mock.Mock(side_effect=Exception())
+
+ out = md5sum.CalculateDeviceMd5Sums([], device)
+ self.assertEquals(0, len(out))
+
+ def testCalculateDeviceMd5Sums_singlePath(self):
+ test_path = '/storage/emulated/legacy/test/file.dat'
+
+ device = mock.NonCallableMock()
+ device_md5sum_output = [
+ '0123456789abcdeffedcba9876543210 '
+ '/storage/emulated/legacy/test/file.dat',
+ ]
+ device.RunShellCommand = mock.Mock(return_value=device_md5sum_output)
+
+ with mock.patch('os.path.getsize', return_value=1337):
+ out = md5sum.CalculateDeviceMd5Sums(test_path, device)
+ self.assertEquals(1, len(out))
+ self.assertTrue('/storage/emulated/legacy/test/file.dat' in out)
+ self.assertEquals('0123456789abcdeffedcba9876543210',
+ out['/storage/emulated/legacy/test/file.dat'])
+ self.assertEquals(1, len(device.RunShellCommand.call_args_list))
+
+ def testCalculateDeviceMd5Sums_list(self):
+ test_path = ['/storage/emulated/legacy/test/file0.dat',
+ '/storage/emulated/legacy/test/file1.dat']
+ device = mock.NonCallableMock()
+ device_md5sum_output = [
+ '0123456789abcdeffedcba9876543210 '
+ '/storage/emulated/legacy/test/file0.dat',
+ '123456789abcdef00fedcba987654321 '
+ '/storage/emulated/legacy/test/file1.dat',
+ ]
+ device.RunShellCommand = mock.Mock(return_value=device_md5sum_output)
+
+ with mock.patch('os.path.getsize', return_value=1337):
+ out = md5sum.CalculateDeviceMd5Sums(test_path, device)
+ self.assertEquals(2, len(out))
+ self.assertTrue('/storage/emulated/legacy/test/file0.dat' in out)
+ self.assertEquals('0123456789abcdeffedcba9876543210',
+ out['/storage/emulated/legacy/test/file0.dat'])
+ self.assertTrue('/storage/emulated/legacy/test/file1.dat' in out)
+ self.assertEquals('123456789abcdef00fedcba987654321',
+ out['/storage/emulated/legacy/test/file1.dat'])
+ self.assertEquals(1, len(device.RunShellCommand.call_args_list))
+
+ def testCalculateDeviceMd5Sums_generator(self):
+ test_path = ('/storage/emulated/legacy/test/file%d.dat' % n
+ for n in xrange(0, 2))
+
+ device = mock.NonCallableMock()
+ device_md5sum_output = [
+ '0123456789abcdeffedcba9876543210 '
+ '/storage/emulated/legacy/test/file0.dat',
+ '123456789abcdef00fedcba987654321 '
+ '/storage/emulated/legacy/test/file1.dat',
+ ]
+ device.RunShellCommand = mock.Mock(return_value=device_md5sum_output)
+
+ with mock.patch('os.path.getsize', return_value=1337):
+ out = md5sum.CalculateDeviceMd5Sums(test_path, device)
+ self.assertEquals(2, len(out))
+ self.assertTrue('/storage/emulated/legacy/test/file0.dat' in out)
+ self.assertEquals('0123456789abcdeffedcba9876543210',
+ out['/storage/emulated/legacy/test/file0.dat'])
+ self.assertTrue('/storage/emulated/legacy/test/file1.dat' in out)
+ self.assertEquals('123456789abcdef00fedcba987654321',
+ out['/storage/emulated/legacy/test/file1.dat'])
+ self.assertEquals(1, len(device.RunShellCommand.call_args_list))
+
+ def testCalculateDeviceMd5Sums_singlePath_linkerWarning(self):
+ # See crbug/479966
+ test_path = '/storage/emulated/legacy/test/file.dat'
+
+ device = mock.NonCallableMock()
+ device_md5sum_output = [
+ 'WARNING: linker: /data/local/tmp/md5sum/md5sum_bin: '
+ 'unused DT entry: type 0x1d arg 0x15db',
+ 'THIS_IS_NOT_A_VALID_CHECKSUM_ZZZ some random text',
+ '0123456789abcdeffedcba9876543210 '
+ '/storage/emulated/legacy/test/file.dat',
+ ]
+ device.RunShellCommand = mock.Mock(return_value=device_md5sum_output)
+
+ with mock.patch('os.path.getsize', return_value=1337):
+ out = md5sum.CalculateDeviceMd5Sums(test_path, device)
+ self.assertEquals(1, len(out))
+ self.assertTrue('/storage/emulated/legacy/test/file.dat' in out)
+ self.assertEquals('0123456789abcdeffedcba9876543210',
+ out['/storage/emulated/legacy/test/file.dat'])
+ self.assertEquals(1, len(device.RunShellCommand.call_args_list))
+
+ def testCalculateDeviceMd5Sums_list_fileMissing(self):
+ test_path = ['/storage/emulated/legacy/test/file0.dat',
+ '/storage/emulated/legacy/test/file1.dat']
+ device = mock.NonCallableMock()
+ device_md5sum_output = [
+ '0123456789abcdeffedcba9876543210 '
+ '/storage/emulated/legacy/test/file0.dat',
+ '[0819/203513:ERROR:md5sum.cc(25)] Could not open file asdf',
+ '',
+ ]
+ device.RunShellCommand = mock.Mock(return_value=device_md5sum_output)
+
+ with mock.patch('os.path.getsize', return_value=1337):
+ out = md5sum.CalculateDeviceMd5Sums(test_path, device)
+ self.assertEquals(1, len(out))
+ self.assertTrue('/storage/emulated/legacy/test/file0.dat' in out)
+ self.assertEquals('0123456789abcdeffedcba9876543210',
+ out['/storage/emulated/legacy/test/file0.dat'])
+ self.assertEquals(1, len(device.RunShellCommand.call_args_list))
+
+ def testCalculateDeviceMd5Sums_requiresBinary(self):
+ test_path = '/storage/emulated/legacy/test/file.dat'
+
+ device = mock.NonCallableMock()
+ device.adb = mock.NonCallableMock()
+ device.adb.Push = mock.Mock()
+ device_md5sum_output = [
+ 'WARNING: linker: /data/local/tmp/md5sum/md5sum_bin: '
+ 'unused DT entry: type 0x1d arg 0x15db',
+ 'THIS_IS_NOT_A_VALID_CHECKSUM_ZZZ some random text',
+ '0123456789abcdeffedcba9876543210 '
+ '/storage/emulated/legacy/test/file.dat',
+ ]
+ error = device_errors.AdbShellCommandFailedError('cmd', 'out', 2)
+ device.RunShellCommand = mock.Mock(
+ side_effect=(error, '', device_md5sum_output))
+
+ with mock.patch('os.path.isdir', return_value=True), (
+ mock.patch('os.path.getsize', return_value=1337)):
+ out = md5sum.CalculateDeviceMd5Sums(test_path, device)
+ self.assertEquals(1, len(out))
+ self.assertTrue('/storage/emulated/legacy/test/file.dat' in out)
+ self.assertEquals('0123456789abcdeffedcba9876543210',
+ out['/storage/emulated/legacy/test/file.dat'])
+ self.assertEquals(3, len(device.RunShellCommand.call_args_list))
+ device.adb.Push.assert_called_once_with(
+ 'test/out/directory/md5sum_dist', '/data/local/tmp/md5sum')
+
+
+if __name__ == '__main__':
+ unittest.main(verbosity=2)
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/perf/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/perf/__init__.py
new file mode 100644
index 0000000..50b23df
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/perf/__init__.py
@@ -0,0 +1,3 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/perf/cache_control.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/perf/cache_control.py
new file mode 100644
index 0000000..27782b5
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/perf/cache_control.py
@@ -0,0 +1,15 @@
+# Copyright 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+class CacheControl(object):
+ _DROP_CACHES = '/proc/sys/vm/drop_caches'
+
+ def __init__(self, device):
+ self._device = device
+
+ def DropRamCaches(self):
+ """Drops the filesystem ram caches for performance testing."""
+ self._device.RunShellCommand(['sync'], check_return=True, as_root=True)
+ self._device.WriteFile(CacheControl._DROP_CACHES, '3', as_root=True)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/perf/perf_control.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/perf/perf_control.py
new file mode 100644
index 0000000..06a5db6
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/perf/perf_control.py
@@ -0,0 +1,210 @@
+# Copyright 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import atexit
+import logging
+import re
+
+from devil.android import device_errors
+
+logger = logging.getLogger(__name__)
+
+
+class PerfControl(object):
+ """Provides methods for setting the performance mode of a device."""
+
+ _AVAILABLE_GOVERNORS_REL_PATH = 'cpufreq/scaling_available_governors'
+ _CPU_FILE_PATTERN = re.compile(r'^cpu\d+$')
+ _CPU_PATH = '/sys/devices/system/cpu'
+ _KERNEL_MAX = '/sys/devices/system/cpu/kernel_max'
+
+ def __init__(self, device):
+ self._device = device
+ self._cpu_files = [
+ filename
+ for filename in self._device.ListDirectory(self._CPU_PATH, as_root=True)
+ if self._CPU_FILE_PATTERN.match(filename)]
+ assert self._cpu_files, 'Failed to detect CPUs.'
+ self._cpu_file_list = ' '.join(self._cpu_files)
+ logger.info('CPUs found: %s', self._cpu_file_list)
+
+ self._have_mpdecision = self._device.FileExists('/system/bin/mpdecision')
+
+ raw = self._ReadEachCpuFile(self._AVAILABLE_GOVERNORS_REL_PATH)
+ self._available_governors = [
+ (cpu, raw_governors.strip().split() if not exit_code else None)
+ for cpu, raw_governors, exit_code in raw]
+
+ def SetHighPerfMode(self):
+ """Sets the highest stable performance mode for the device."""
+ try:
+ self._device.EnableRoot()
+ except device_errors.CommandFailedError:
+ message = 'Need root for performance mode. Results may be NOISY!!'
+ logger.warning(message)
+ # Add an additional warning at exit, such that it's clear that any results
+ # may be different/noisy (due to the lack of intended performance mode).
+ atexit.register(logger.warning, message)
+ return
+
+ product_model = self._device.product_model
+ # TODO(epenner): Enable on all devices (http://crbug.com/383566)
+ if 'Nexus 4' == product_model:
+ self._ForceAllCpusOnline(True)
+ if not self._AllCpusAreOnline():
+ logger.warning('Failed to force CPUs online. Results may be NOISY!')
+ self.SetScalingGovernor('performance')
+ elif 'Nexus 5' == product_model:
+ self._ForceAllCpusOnline(True)
+ if not self._AllCpusAreOnline():
+ logger.warning('Failed to force CPUs online. Results may be NOISY!')
+ self.SetScalingGovernor('performance')
+ self._SetScalingMaxFreq(1190400)
+ self._SetMaxGpuClock(200000000)
+ else:
+ self.SetScalingGovernor('performance')
+
+ def SetPerfProfilingMode(self):
+ """Enables all cores for reliable perf profiling."""
+ self._ForceAllCpusOnline(True)
+ self.SetScalingGovernor('performance')
+ if not self._AllCpusAreOnline():
+ if not self._device.HasRoot():
+ raise RuntimeError('Need root to force CPUs online.')
+ raise RuntimeError('Failed to force CPUs online.')
+
+ def SetDefaultPerfMode(self):
+ """Sets the performance mode for the device to its default mode."""
+ if not self._device.HasRoot():
+ return
+ product_model = self._device.product_model
+ if 'Nexus 5' == product_model:
+ if self._AllCpusAreOnline():
+ self._SetScalingMaxFreq(2265600)
+ self._SetMaxGpuClock(450000000)
+
+ governor_mode = {
+ 'GT-I9300': 'pegasusq',
+ 'Galaxy Nexus': 'interactive',
+ 'Nexus 4': 'ondemand',
+ 'Nexus 5': 'ondemand',
+ 'Nexus 7': 'interactive',
+ 'Nexus 10': 'interactive'
+ }.get(product_model, 'ondemand')
+ self.SetScalingGovernor(governor_mode)
+ self._ForceAllCpusOnline(False)
+
+ def GetCpuInfo(self):
+ online = (output.rstrip() == '1' and status == 0
+ for (_, output, status) in self._ForEachCpu('cat "$CPU/online"'))
+ governor = (output.rstrip() if status == 0 else None
+ for (_, output, status)
+ in self._ForEachCpu('cat "$CPU/cpufreq/scaling_governor"'))
+ return zip(self._cpu_files, online, governor)
+
+ def _ForEachCpu(self, cmd):
+ script = '; '.join([
+ 'for CPU in %s' % self._cpu_file_list,
+ 'do %s' % cmd,
+ 'echo -n "%~%$?%~%"',
+ 'done'
+ ])
+ output = self._device.RunShellCommand(
+ script, cwd=self._CPU_PATH, check_return=True, as_root=True, shell=True)
+ output = '\n'.join(output).split('%~%')
+ return zip(self._cpu_files, output[0::2], (int(c) for c in output[1::2]))
+
+ def _WriteEachCpuFile(self, path, value):
+ self._ConditionallyWriteEachCpuFile(path, value, condition='true')
+
+ def _ConditionallyWriteEachCpuFile(self, path, value, condition):
+ template = (
+ '{condition} && test -e "$CPU/{path}" && echo {value} > "$CPU/{path}"')
+ results = self._ForEachCpu(
+ template.format(path=path, value=value, condition=condition))
+ cpus = ' '.join(cpu for (cpu, _, status) in results if status == 0)
+ if cpus:
+ logger.info('Successfully set %s to %r on: %s', path, value, cpus)
+ else:
+ logger.warning('Failed to set %s to %r on any cpus', path, value)
+
+ def _ReadEachCpuFile(self, path):
+ return self._ForEachCpu(
+ 'cat "$CPU/{path}"'.format(path=path))
+
+ def SetScalingGovernor(self, value):
+ """Sets the scaling governor to the given value on all possible CPUs.
+
+ This does not attempt to set a governor to a value not reported as available
+ on the corresponding CPU.
+
+ Args:
+ value: [string] The new governor value.
+ """
+ condition = 'test -e "{path}" && grep -q {value} {path}'.format(
+ path=('${CPU}/%s' % self._AVAILABLE_GOVERNORS_REL_PATH),
+ value=value)
+ self._ConditionallyWriteEachCpuFile(
+ 'cpufreq/scaling_governor', value, condition)
+
+ def GetScalingGovernor(self):
+ """Gets the currently set governor for each CPU.
+
+ Returns:
+ An iterable of 2-tuples, each containing the cpu and the current
+ governor.
+ """
+ raw = self._ReadEachCpuFile('cpufreq/scaling_governor')
+ return [
+ (cpu, raw_governor.strip() if not exit_code else None)
+ for cpu, raw_governor, exit_code in raw]
+
+ def ListAvailableGovernors(self):
+ """Returns the list of available governors for each CPU.
+
+ Returns:
+ An iterable of 2-tuples, each containing the cpu and a list of available
+ governors for that cpu.
+ """
+ return self._available_governors
+
+ def _SetScalingMaxFreq(self, value):
+ self._WriteEachCpuFile('cpufreq/scaling_max_freq', '%d' % value)
+
+ def _SetMaxGpuClock(self, value):
+ self._device.WriteFile('/sys/class/kgsl/kgsl-3d0/max_gpuclk',
+ str(value),
+ as_root=True)
+
+ def _AllCpusAreOnline(self):
+ results = self._ForEachCpu('cat "$CPU/online"')
+ # TODO(epenner): Investigate why file may be missing
+ # (http://crbug.com/397118)
+ return all(output.rstrip() == '1' and status == 0
+ for (cpu, output, status) in results
+ if cpu != 'cpu0')
+
+ def _ForceAllCpusOnline(self, force_online):
+ """Enable all CPUs on a device.
+
+ Some vendors (or only Qualcomm?) hot-plug their CPUs, which can add noise
+ to measurements:
+ - In perf, samples are only taken for the CPUs that are online when the
+ measurement is started.
+ - The scaling governor can't be set for an offline CPU and frequency scaling
+ on newly enabled CPUs adds noise to both perf and tracing measurements.
+
+ It appears Qualcomm is the only vendor that hot-plugs CPUs, and on Qualcomm
+ this is done by "mpdecision".
+
+ """
+ if self._have_mpdecision:
+ cmd = ['stop', 'mpdecision'] if force_online else ['start', 'mpdecision']
+ self._device.RunShellCommand(cmd, check_return=True, as_root=True)
+
+ if not self._have_mpdecision and not self._AllCpusAreOnline():
+ logger.warning('Unexpected cpu hot plugging detected.')
+
+ if force_online:
+ self._ForEachCpu('echo 1 > "$CPU/online"')
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/perf/perf_control_devicetest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/perf/perf_control_devicetest.py
new file mode 100644
index 0000000..b645803
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/perf/perf_control_devicetest.py
@@ -0,0 +1,38 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+# pylint: disable=W0212
+
+import os
+import sys
+import unittest
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
+
+from devil.android import device_test_case
+from devil.android import device_utils
+from devil.android.perf import perf_control
+
+
+class TestPerfControl(device_test_case.DeviceTestCase):
+
+ def setUp(self):
+ super(TestPerfControl, self).setUp()
+ if not os.getenv('BUILDTYPE'):
+ os.environ['BUILDTYPE'] = 'Debug'
+ self._device = device_utils.DeviceUtils(self.serial)
+
+ def testHighPerfMode(self):
+ perf = perf_control.PerfControl(self._device)
+ try:
+ perf.SetPerfProfilingMode()
+ cpu_info = perf.GetCpuInfo()
+ self.assertEquals(len(perf._cpu_files), len(cpu_info))
+ for _, online, governor in cpu_info:
+ self.assertTrue(online)
+ self.assertEquals('performance', governor)
+ finally:
+ perf.SetDefaultPerfMode()
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/perf/surface_stats_collector.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/perf/surface_stats_collector.py
new file mode 100644
index 0000000..25079f3
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/perf/surface_stats_collector.py
@@ -0,0 +1,186 @@
+# Copyright 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import Queue
+import threading
+
+
+# Log marker containing SurfaceTexture timestamps.
+_SURFACE_TEXTURE_TIMESTAMPS_MESSAGE = 'SurfaceTexture update timestamps'
+_SURFACE_TEXTURE_TIMESTAMP_RE = r'\d+'
+
+
+class SurfaceStatsCollector(object):
+ """Collects surface stats for a SurfaceView from the output of SurfaceFlinger.
+
+ Args:
+ device: A DeviceUtils instance.
+ """
+
+ def __init__(self, device):
+ self._device = device
+ self._collector_thread = None
+ self._surface_before = None
+ self._get_data_event = None
+ self._data_queue = None
+ self._stop_event = None
+ self._warn_about_empty_data = True
+
+ def DisableWarningAboutEmptyData(self):
+ self._warn_about_empty_data = False
+
+ def Start(self):
+ assert not self._collector_thread
+
+ if self._ClearSurfaceFlingerLatencyData():
+ self._get_data_event = threading.Event()
+ self._stop_event = threading.Event()
+ self._data_queue = Queue.Queue()
+ self._collector_thread = threading.Thread(target=self._CollectorThread)
+ self._collector_thread.start()
+ else:
+ raise Exception('SurfaceFlinger not supported on this device.')
+
+ def Stop(self):
+ assert self._collector_thread
+ (refresh_period, timestamps) = self._GetDataFromThread()
+ if self._collector_thread:
+ self._stop_event.set()
+ self._collector_thread.join()
+ self._collector_thread = None
+ return (refresh_period, timestamps)
+
+ def _CollectorThread(self):
+ last_timestamp = 0
+ timestamps = []
+ retries = 0
+
+ while not self._stop_event.is_set():
+ self._get_data_event.wait(1)
+ try:
+ refresh_period, new_timestamps = self._GetSurfaceFlingerFrameData()
+ if refresh_period is None or timestamps is None:
+ retries += 1
+ if retries < 3:
+ continue
+ if last_timestamp:
+ # Some data has already been collected, but either the app
+ # was closed or there's no new data. Signal the main thread and
+ # wait.
+ self._data_queue.put((None, None))
+ self._stop_event.wait()
+ break
+ raise Exception('Unable to get surface flinger latency data')
+
+ timestamps += [timestamp for timestamp in new_timestamps
+ if timestamp > last_timestamp]
+ if len(timestamps):
+ last_timestamp = timestamps[-1]
+
+ if self._get_data_event.is_set():
+ self._get_data_event.clear()
+ self._data_queue.put((refresh_period, timestamps))
+ timestamps = []
+ except Exception as e:
+ # On any error, before aborting, put the exception into _data_queue to
+ # prevent the main thread from waiting at _data_queue.get() infinitely.
+ self._data_queue.put(e)
+ raise
+
+ def _GetDataFromThread(self):
+ self._get_data_event.set()
+ ret = self._data_queue.get()
+ if isinstance(ret, Exception):
+ raise ret
+ return ret
+
+ def _ClearSurfaceFlingerLatencyData(self):
+ """Clears the SurfaceFlinger latency data.
+
+ Returns:
+ True if SurfaceFlinger latency is supported by the device, otherwise
+ False.
+ """
+ # The command returns nothing if it is supported, otherwise returns many
+ # lines of result just like 'dumpsys SurfaceFlinger'.
+ results = self._device.RunShellCommand(
+ ['dumpsys', 'SurfaceFlinger', '--latency-clear', 'SurfaceView'],
+ check_return=True)
+ return not len(results)
+
+ def GetSurfaceFlingerPid(self):
+ pids_dict = self._device.GetPids('surfaceflinger')
+ if not pids_dict:
+ raise Exception('Unable to get surface flinger process id')
+ # TODO(cataput:#3378): Do more strict checks in GetPids when possible.
+ # For now it just returns the first pid found of some matching process.
+ return pids_dict.popitem()[1][0]
+
+ def _GetSurfaceFlingerFrameData(self):
+ """Returns collected SurfaceFlinger frame timing data.
+
+ Returns:
+ A tuple containing:
+ - The display's nominal refresh period in milliseconds.
+ - A list of timestamps signifying frame presentation times in
+ milliseconds.
+ The return value may be (None, None) if there was no data collected (for
+ example, if the app was closed before the collector thread has finished).
+ """
+ # adb shell dumpsys SurfaceFlinger --latency <window name>
+ # prints some information about the last 128 frames displayed in
+ # that window.
+ # The data returned looks like this:
+ # 16954612
+ # 7657467895508 7657482691352 7657493499756
+ # 7657484466553 7657499645964 7657511077881
+ # 7657500793457 7657516600576 7657527404785
+ # (...)
+ #
+ # The first line is the refresh period (here 16.95 ms), it is followed
+ # by 128 lines w/ 3 timestamps in nanosecond each:
+ # A) when the app started to draw
+ # B) the vsync immediately preceding SF submitting the frame to the h/w
+ # C) timestamp immediately after SF submitted that frame to the h/w
+ #
+ # The difference between the 1st and 3rd timestamp is the frame-latency.
+ # An interesting data is when the frame latency crosses a refresh period
+ # boundary, this can be calculated this way:
+ #
+ # ceil((C - A) / refresh-period)
+ #
+ # (each time the number above changes, we have a "jank").
+ # If this happens a lot during an animation, the animation appears
+ # janky, even if it runs at 60 fps in average.
+ #
+ # We use the special "SurfaceView" window name because the statistics for
+ # the activity's main window are not updated when the main web content is
+ # composited into a SurfaceView.
+ results = self._device.RunShellCommand(
+ ['dumpsys', 'SurfaceFlinger', '--latency', 'SurfaceView'],
+ check_return=True)
+ if not len(results):
+ return (None, None)
+
+ timestamps = []
+ nanoseconds_per_millisecond = 1e6
+ refresh_period = long(results[0]) / nanoseconds_per_millisecond
+
+ # If a fence associated with a frame is still pending when we query the
+ # latency data, SurfaceFlinger gives the frame a timestamp of INT64_MAX.
+ # Since we only care about completed frames, we will ignore any timestamps
+ # with this value.
+ pending_fence_timestamp = (1 << 63) - 1
+
+ for line in results[1:]:
+ fields = line.split()
+ if len(fields) != 3:
+ continue
+ timestamp = long(fields[1])
+ if timestamp == pending_fence_timestamp:
+ continue
+ timestamp /= nanoseconds_per_millisecond
+ timestamps.append(timestamp)
+
+ return (refresh_period, timestamps)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/perf/thermal_throttle.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/perf/thermal_throttle.py
new file mode 100644
index 0000000..546a92e
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/perf/thermal_throttle.py
@@ -0,0 +1,135 @@
+# Copyright 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import logging
+
+logger = logging.getLogger(__name__)
+
+
+class OmapThrottlingDetector(object):
+ """Class to detect and track thermal throttling on an OMAP 4."""
+ OMAP_TEMP_FILE = ('/sys/devices/platform/omap/omap_temp_sensor.0/'
+ 'temperature')
+
+ @staticmethod
+ def IsSupported(device):
+ return device.FileExists(OmapThrottlingDetector.OMAP_TEMP_FILE)
+
+ def __init__(self, device):
+ self._device = device
+
+ @staticmethod
+ def BecameThrottled(log_line):
+ return 'omap_thermal_throttle' in log_line
+
+ @staticmethod
+ def BecameUnthrottled(log_line):
+ return 'omap_thermal_unthrottle' in log_line
+
+ @staticmethod
+ def GetThrottlingTemperature(log_line):
+ if 'throttle_delayed_work_fn' in log_line:
+ return float([s for s in log_line.split() if s.isdigit()][0]) / 1000.0
+
+ def GetCurrentTemperature(self):
+ tempdata = self._device.ReadFile(OmapThrottlingDetector.OMAP_TEMP_FILE)
+ return float(tempdata) / 1000.0
+
+
+class ExynosThrottlingDetector(object):
+ """Class to detect and track thermal throttling on an Exynos 5."""
+ @staticmethod
+ def IsSupported(device):
+ return device.FileExists('/sys/bus/exynos5-core')
+
+ def __init__(self, device):
+ pass
+
+ @staticmethod
+ def BecameThrottled(log_line):
+ return 'exynos_tmu: Throttling interrupt' in log_line
+
+ @staticmethod
+ def BecameUnthrottled(log_line):
+ return 'exynos_thermal_unthrottle: not throttling' in log_line
+
+ @staticmethod
+ def GetThrottlingTemperature(_log_line):
+ return None
+
+ @staticmethod
+ def GetCurrentTemperature():
+ return None
+
+
+class ThermalThrottle(object):
+ """Class to detect and track thermal throttling.
+
+ Usage:
+ Wait for IsThrottled() to be False before running test
+ After running test call HasBeenThrottled() to find out if the
+ test run was affected by thermal throttling.
+ """
+
+ def __init__(self, device):
+ self._device = device
+ self._throttled = False
+ self._detector = None
+ if OmapThrottlingDetector.IsSupported(device):
+ self._detector = OmapThrottlingDetector(device)
+ elif ExynosThrottlingDetector.IsSupported(device):
+ self._detector = ExynosThrottlingDetector(device)
+
+ def HasBeenThrottled(self):
+ """True if there has been any throttling since the last call to
+ HasBeenThrottled or IsThrottled.
+ """
+ return self._ReadLog()
+
+ def IsThrottled(self):
+ """True if currently throttled."""
+ self._ReadLog()
+ return self._throttled
+
+ def _ReadLog(self):
+ if not self._detector:
+ return False
+ has_been_throttled = False
+ serial_number = str(self._device)
+ log = self._device.RunShellCommand(
+ ['dmesg', '-c'], large_output=True, check_return=True)
+ degree_symbol = unichr(0x00B0)
+ for line in log:
+ if self._detector.BecameThrottled(line):
+ if not self._throttled:
+ logger.warning('>>> Device %s thermally throttled', serial_number)
+ self._throttled = True
+ has_been_throttled = True
+ elif self._detector.BecameUnthrottled(line):
+ if self._throttled:
+ logger.warning('>>> Device %s thermally unthrottled', serial_number)
+ self._throttled = False
+ has_been_throttled = True
+ temperature = self._detector.GetThrottlingTemperature(line)
+ if temperature is not None:
+ logger.info(u'Device %s thermally throttled at %3.1f%sC',
+ serial_number, temperature, degree_symbol)
+
+ if logger.isEnabledFor(logging.DEBUG):
+ # Print current temperature of CPU SoC.
+ temperature = self._detector.GetCurrentTemperature()
+ if temperature is not None:
+ logger.debug(u'Current SoC temperature of %s = %3.1f%sC',
+ serial_number, temperature, degree_symbol)
+
+ # Print temperature of battery, to give a system temperature
+ dumpsys_log = self._device.RunShellCommand(
+ ['dumpsys', 'battery'], check_return=True)
+ for line in dumpsys_log:
+ if 'temperature' in line:
+ btemp = float([s for s in line.split() if s.isdigit()][0]) / 10.0
+ logger.debug(u'Current battery temperature of %s = %3.1f%sC',
+ serial_number, btemp, degree_symbol)
+
+ return has_been_throttled
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/ports.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/ports.py
new file mode 100644
index 0000000..1d4e5f2
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/ports.py
@@ -0,0 +1,178 @@
+# Copyright (c) 2012 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Functions that deal with local and device ports."""
+
+import contextlib
+import fcntl
+import httplib
+import logging
+import os
+import socket
+import traceback
+
+logger = logging.getLogger(__name__)
+
+# The net test server is started from port 10201.
+_TEST_SERVER_PORT_FIRST = 10201
+_TEST_SERVER_PORT_LAST = 30000
+# A file to record next valid port of test server.
+_TEST_SERVER_PORT_FILE = '/tmp/test_server_port'
+_TEST_SERVER_PORT_LOCKFILE = '/tmp/test_server_port.lock'
+
+
+# The following two methods are used to allocate the port source for various
+# types of test servers. Because some net-related tests can be run on shards at
+# same time, it's important to have a mechanism to allocate the port
+# process-safe. In here, we implement the safe port allocation by leveraging
+# flock.
+def ResetTestServerPortAllocation():
+ """Resets the port allocation to start from TEST_SERVER_PORT_FIRST.
+
+ Returns:
+ Returns True if reset successes. Otherwise returns False.
+ """
+ try:
+ with open(_TEST_SERVER_PORT_FILE, 'w') as fp:
+ fp.write('%d' % _TEST_SERVER_PORT_FIRST)
+ return True
+ except Exception: # pylint: disable=broad-except
+ logger.exception('Error while resetting port allocation')
+ return False
+
+
+def AllocateTestServerPort():
+ """Allocates a port incrementally.
+
+ Returns:
+ Returns a valid port which should be in between TEST_SERVER_PORT_FIRST and
+ TEST_SERVER_PORT_LAST. Returning 0 means no more valid port can be used.
+ """
+ port = 0
+ ports_tried = []
+ try:
+ fp_lock = open(_TEST_SERVER_PORT_LOCKFILE, 'w')
+ fcntl.flock(fp_lock, fcntl.LOCK_EX)
+ # Get current valid port and calculate next valid port.
+ if not os.path.exists(_TEST_SERVER_PORT_FILE):
+ ResetTestServerPortAllocation()
+ with open(_TEST_SERVER_PORT_FILE, 'r+') as fp:
+ port = int(fp.read())
+ ports_tried.append(port)
+ while not IsHostPortAvailable(port):
+ port += 1
+ ports_tried.append(port)
+ if (port > _TEST_SERVER_PORT_LAST or
+ port < _TEST_SERVER_PORT_FIRST):
+ port = 0
+ else:
+ fp.seek(0, os.SEEK_SET)
+ fp.write('%d' % (port + 1))
+ except Exception: # pylint: disable=broad-except
+ logger.exception('Error while allocating port')
+ finally:
+ if fp_lock:
+ fcntl.flock(fp_lock, fcntl.LOCK_UN)
+ fp_lock.close()
+ if port:
+ logger.info('Allocate port %d for test server.', port)
+ else:
+ logger.error('Could not allocate port for test server. '
+ 'List of ports tried: %s', str(ports_tried))
+ return port
+
+
+def IsHostPortAvailable(host_port):
+ """Checks whether the specified host port is available.
+
+ Args:
+ host_port: Port on host to check.
+
+ Returns:
+ True if the port on host is available, otherwise returns False.
+ """
+ s = socket.socket()
+ try:
+ s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+ s.bind(('', host_port))
+ s.close()
+ return True
+ except socket.error:
+ return False
+
+
+def IsDevicePortUsed(device, device_port, state=''):
+ """Checks whether the specified device port is used or not.
+
+ Args:
+ device: A DeviceUtils instance.
+ device_port: Port on device we want to check.
+ state: String of the specified state. Default is empty string, which
+ means any state.
+
+ Returns:
+ True if the port on device is already used, otherwise returns False.
+ """
+ base_urls = ('127.0.0.1:%d' % device_port, 'localhost:%d' % device_port)
+ netstat_results = device.RunShellCommand(
+ ['netstat', '-a'], check_return=True, large_output=True)
+ for single_connect in netstat_results:
+ # Column 3 is the local address which we want to check with.
+ connect_results = single_connect.split()
+ if connect_results[0] != 'tcp':
+ continue
+ if len(connect_results) < 6:
+ raise Exception('Unexpected format while parsing netstat line: ' +
+ single_connect)
+ is_state_match = connect_results[5] == state if state else True
+ if connect_results[3] in base_urls and is_state_match:
+ return True
+ return False
+
+
+def IsHttpServerConnectable(host, port, tries=3, command='GET', path='/',
+ expected_read='', timeout=2):
+ """Checks whether the specified http server is ready to serve request or not.
+
+ Args:
+ host: Host name of the HTTP server.
+ port: Port number of the HTTP server.
+ tries: How many times we want to test the connection. The default value is
+ 3.
+ command: The http command we use to connect to HTTP server. The default
+ command is 'GET'.
+ path: The path we use when connecting to HTTP server. The default path is
+ '/'.
+ expected_read: The content we expect to read from the response. The default
+ value is ''.
+ timeout: Timeout (in seconds) for each http connection. The default is 2s.
+
+ Returns:
+ Tuple of (connect status, client error). connect status is a boolean value
+ to indicate whether the server is connectable. client_error is the error
+ message the server returns when connect status is false.
+ """
+ assert tries >= 1
+ for i in xrange(0, tries):
+ client_error = None
+ try:
+ with contextlib.closing(httplib.HTTPConnection(
+ host, port, timeout=timeout)) as http:
+ # Output some debug information when we have tried more than 2 times.
+ http.set_debuglevel(i >= 2)
+ http.request(command, path)
+ r = http.getresponse()
+ content = r.read()
+ if r.status == 200 and r.reason == 'OK' and content == expected_read:
+ return (True, '')
+ client_error = ('Bad response: %s %s version %s\n ' %
+ (r.status, r.reason, r.version) +
+ '\n '.join([': '.join(h) for h in r.getheaders()]))
+ except (httplib.HTTPException, socket.error) as e:
+ # Probably too quick connecting: try again.
+ exception_error_msgs = traceback.format_exception_only(type(e), e)
+ if exception_error_msgs:
+ client_error = ''.join(exception_error_msgs)
+ # Only returns last client_error.
+ return (False, client_error or 'Timeout')
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/__init__.py
new file mode 100644
index 0000000..f95d3b2
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/__init__.py
@@ -0,0 +1,6 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# This package is intended for modules that are very tightly coupled to
+# tools or APIs from the Android SDK.
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/aapt.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/aapt.py
new file mode 100644
index 0000000..7ae3a93
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/aapt.py
@@ -0,0 +1,43 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""This module wraps the Android Asset Packaging Tool."""
+
+from devil.android.sdk import build_tools
+from devil.utils import cmd_helper
+from devil.utils import lazy
+
+
+_aapt_path = lazy.WeakConstant(lambda: build_tools.GetPath('aapt'))
+
+
+def _RunAaptCmd(args):
+ """Runs an aapt command.
+
+ Args:
+ args: A list of arguments for aapt.
+
+ Returns:
+ The output of the command.
+ """
+ cmd = [_aapt_path.read()] + args
+ status, output = cmd_helper.GetCmdStatusAndOutput(cmd)
+ if status != 0:
+ raise Exception('Failed running aapt command: "%s" with output "%s".' %
+ (' '.join(cmd), output))
+ return output
+
+
+def Dump(what, apk, assets=None):
+ """Returns the output of the aapt dump command.
+
+ Args:
+ what: What you want to dump.
+ apk: Path to apk you want to dump information for.
+ assets: List of assets in apk you want to dump information for.
+ """
+ assets = assets or []
+ if isinstance(assets, basestring):
+ assets = [assets]
+ return _RunAaptCmd(['dump', what, apk] + assets).splitlines()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/adb_compatibility_devicetest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/adb_compatibility_devicetest.py
new file mode 100644
index 0000000..cbe2a1b
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/adb_compatibility_devicetest.py
@@ -0,0 +1,230 @@
+#!/usr/bin/env python
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import contextlib
+import os
+import posixpath
+import random
+import signal
+import sys
+import unittest
+
+_CATAPULT_BASE_DIR = os.path.abspath(os.path.join(
+ os.path.dirname(__file__), '..', '..', '..', '..'))
+
+sys.path.append(os.path.join(_CATAPULT_BASE_DIR, 'devil'))
+from devil import devil_env
+from devil.android import device_errors
+from devil.android import device_test_case
+from devil.android.sdk import adb_wrapper
+from devil.utils import cmd_helper
+from devil.utils import timeout_retry
+
+
+_TEST_DATA_DIR = os.path.abspath(os.path.join(
+ os.path.dirname(__file__), 'test', 'data'))
+
+
+def _hostAdbPids():
+ ps_status, ps_output = cmd_helper.GetCmdStatusAndOutput(
+ ['pgrep', '-l', 'adb'])
+ if ps_status != 0:
+ return []
+
+ pids_and_names = (line.split() for line in ps_output.splitlines())
+ return [int(pid) for pid, name in pids_and_names
+ if name == 'adb']
+
+
+class AdbCompatibilityTest(device_test_case.DeviceTestCase):
+
+ @classmethod
+ def setUpClass(cls):
+ custom_adb_path = os.environ.get('ADB_PATH')
+ custom_deps = {
+ 'config_type': 'BaseConfig',
+ 'dependencies': {},
+ }
+ if custom_adb_path:
+ custom_deps['dependencies']['adb'] = {
+ 'file_info': {
+ devil_env.GetPlatform(): {
+ 'local_paths': [custom_adb_path],
+ },
+ },
+ }
+ devil_env.config.Initialize(configs=[custom_deps])
+
+ def testStartServer(self):
+ # Manually kill off any instances of adb.
+ adb_pids = _hostAdbPids()
+ for p in adb_pids:
+ os.kill(p, signal.SIGKILL)
+
+ self.assertIsNotNone(
+ timeout_retry.WaitFor(
+ lambda: not _hostAdbPids(), wait_period=0.1, max_tries=10))
+
+ # start the adb server
+ start_server_status, _ = cmd_helper.GetCmdStatusAndOutput(
+ [adb_wrapper.AdbWrapper.GetAdbPath(), 'start-server'])
+
+ # verify that the server is now online
+ self.assertEquals(0, start_server_status)
+ self.assertIsNotNone(
+ timeout_retry.WaitFor(
+ lambda: bool(_hostAdbPids()), wait_period=0.1, max_tries=10))
+
+ def testKillServer(self):
+ adb_pids = _hostAdbPids()
+ if not adb_pids:
+ adb_wrapper.AdbWrapper.StartServer()
+
+ adb_pids = _hostAdbPids()
+ self.assertGreaterEqual(len(adb_pids), 1)
+
+ kill_server_status, _ = cmd_helper.GetCmdStatusAndOutput(
+ [adb_wrapper.AdbWrapper.GetAdbPath(), 'kill-server'])
+ self.assertEqual(0, kill_server_status)
+
+ adb_pids = _hostAdbPids()
+ self.assertEqual(0, len(adb_pids))
+
+ def testDevices(self):
+ devices = adb_wrapper.AdbWrapper.Devices()
+ self.assertNotEqual(0, len(devices), 'No devices found.')
+
+ def getTestInstance(self):
+ """Creates a real AdbWrapper instance for testing."""
+ return adb_wrapper.AdbWrapper(self.serial)
+
+ def testShell(self):
+ under_test = self.getTestInstance()
+ shell_ls_result = under_test.Shell('ls')
+ self.assertIsInstance(shell_ls_result, str)
+ self.assertTrue(bool(shell_ls_result))
+
+ def testShell_failed(self):
+ under_test = self.getTestInstance()
+ with self.assertRaises(device_errors.AdbShellCommandFailedError):
+ under_test.Shell('ls /foo/bar/baz')
+
+ def testShell_externalStorageDefined(self):
+ under_test = self.getTestInstance()
+ external_storage = under_test.Shell('echo $EXTERNAL_STORAGE')
+ self.assertIsInstance(external_storage, str)
+ self.assertTrue(posixpath.isabs(external_storage))
+
+ @contextlib.contextmanager
+ def getTestPushDestination(self, under_test):
+ """Creates a temporary directory suitable for pushing to."""
+ external_storage = under_test.Shell('echo $EXTERNAL_STORAGE').strip()
+ if not external_storage:
+ self.skipTest('External storage not available.')
+ while True:
+ random_hex = hex(random.randint(0, 2 ** 52))[2:]
+ name = 'tmp_push_test%s' % random_hex
+ path = posixpath.join(external_storage, name)
+ try:
+ under_test.Shell('ls %s' % path)
+ except device_errors.AdbShellCommandFailedError:
+ break
+ under_test.Shell('mkdir %s' % path)
+ try:
+ yield path
+ finally:
+ under_test.Shell('rm -rf %s' % path)
+
+ def testPush_fileToFile(self):
+ under_test = self.getTestInstance()
+ with self.getTestPushDestination(under_test) as push_target_directory:
+ src = os.path.join(_TEST_DATA_DIR, 'push_file.txt')
+ dest = posixpath.join(push_target_directory, 'push_file.txt')
+ with self.assertRaises(device_errors.AdbShellCommandFailedError):
+ under_test.Shell('ls %s' % dest)
+ under_test.Push(src, dest)
+ self.assertEquals(dest, under_test.Shell('ls %s' % dest).strip())
+
+ def testPush_fileToDirectory(self):
+ under_test = self.getTestInstance()
+ with self.getTestPushDestination(under_test) as push_target_directory:
+ src = os.path.join(_TEST_DATA_DIR, 'push_file.txt')
+ dest = push_target_directory
+ resulting_file = posixpath.join(dest, 'push_file.txt')
+ with self.assertRaises(device_errors.AdbShellCommandFailedError):
+ under_test.Shell('ls %s' % resulting_file)
+ under_test.Push(src, dest)
+ self.assertEquals(
+ resulting_file,
+ under_test.Shell('ls %s' % resulting_file).strip())
+
+ def testPush_directoryToDirectory(self):
+ under_test = self.getTestInstance()
+ with self.getTestPushDestination(under_test) as push_target_directory:
+ src = os.path.join(_TEST_DATA_DIR, 'push_directory')
+ dest = posixpath.join(push_target_directory, 'push_directory')
+ with self.assertRaises(device_errors.AdbShellCommandFailedError):
+ under_test.Shell('ls %s' % dest)
+ under_test.Push(src, dest)
+ self.assertEquals(
+ sorted(os.listdir(src)),
+ sorted(under_test.Shell('ls %s' % dest).strip().split()))
+
+ def testPush_directoryToExistingDirectory(self):
+ under_test = self.getTestInstance()
+ with self.getTestPushDestination(under_test) as push_target_directory:
+ src = os.path.join(_TEST_DATA_DIR, 'push_directory')
+ dest = push_target_directory
+ resulting_directory = posixpath.join(dest, 'push_directory')
+ with self.assertRaises(device_errors.AdbShellCommandFailedError):
+ under_test.Shell('ls %s' % resulting_directory)
+ under_test.Shell('mkdir %s' % resulting_directory)
+ under_test.Push(src, dest)
+ self.assertEquals(
+ sorted(os.listdir(src)),
+ sorted(under_test.Shell('ls %s' % resulting_directory).split()))
+
+ # TODO(jbudorick): Implement tests for the following:
+ # taskset -c
+ # devices [-l]
+ # pull
+ # shell
+ # ls
+ # logcat [-c] [-d] [-v] [-b]
+ # forward [--remove] [--list]
+ # jdwp
+ # install [-l] [-r] [-s] [-d]
+ # install-multiple [-l] [-r] [-s] [-d] [-p]
+ # uninstall [-k]
+ # backup -f [-apk] [-shared] [-nosystem] [-all]
+ # restore
+ # wait-for-device
+ # get-state (BROKEN IN THE M SDK)
+ # get-devpath
+ # remount
+ # reboot
+ # reboot-bootloader
+ # root
+ # emu
+
+ @classmethod
+ def tearDownClass(cls):
+ print
+ print
+ print 'tested %s' % adb_wrapper.AdbWrapper.GetAdbPath()
+ print ' %s' % adb_wrapper.AdbWrapper.Version()
+ print 'connected devices:'
+ try:
+ for d in adb_wrapper.AdbWrapper.Devices():
+ print ' %s' % d
+ except device_errors.AdbCommandFailedError:
+ print ' <failed to list devices>'
+ raise
+ finally:
+ print
+
+
+if __name__ == '__main__':
+ sys.exit(unittest.main())
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/adb_wrapper.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/adb_wrapper.py
new file mode 100644
index 0000000..e2ca013
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/adb_wrapper.py
@@ -0,0 +1,923 @@
+# Copyright 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""This module wraps Android's adb tool.
+
+This is a thin wrapper around the adb interface. Any additional complexity
+should be delegated to a higher level (ex. DeviceUtils).
+"""
+
+import collections
+import distutils.version
+import errno
+import logging
+import os
+import posixpath
+import re
+import subprocess
+
+from devil import devil_env
+from devil.android import decorators
+from devil.android import device_errors
+from devil.utils import cmd_helper
+from devil.utils import lazy
+from devil.utils import timeout_retry
+
+with devil_env.SysPath(devil_env.DEPENDENCY_MANAGER_PATH):
+ import dependency_manager # pylint: disable=import-error
+
+logger = logging.getLogger(__name__)
+
+
+ADB_KEYS_FILE = '/data/misc/adb/adb_keys'
+
+DEFAULT_TIMEOUT = 30
+DEFAULT_RETRIES = 2
+
+_ADB_VERSION_RE = re.compile(r'Android Debug Bridge version (\d+\.\d+\.\d+)')
+_EMULATOR_RE = re.compile(r'^emulator-[0-9]+$')
+_DEVICE_NOT_FOUND_RE = re.compile(r"error: device '(?P<serial>.+)' not found")
+_READY_STATE = 'device'
+_VERITY_DISABLE_RE = re.compile(r'Verity (already )?disabled')
+_VERITY_ENABLE_RE = re.compile(r'Verity (already )?enabled')
+
+
+def VerifyLocalFileExists(path):
+ """Verifies a local file exists.
+
+ Args:
+ path: Path to the local file.
+
+ Raises:
+ IOError: If the file doesn't exist.
+ """
+ if not os.path.exists(path):
+ raise IOError(errno.ENOENT, os.strerror(errno.ENOENT), path)
+
+
+def _FindAdb():
+ try:
+ return devil_env.config.LocalPath('adb')
+ except dependency_manager.NoPathFoundError:
+ pass
+
+ try:
+ return os.path.join(devil_env.config.LocalPath('android_sdk'),
+ 'platform-tools', 'adb')
+ except dependency_manager.NoPathFoundError:
+ pass
+
+ try:
+ return devil_env.config.FetchPath('adb')
+ except dependency_manager.NoPathFoundError:
+ raise device_errors.NoAdbError()
+
+
+def _GetVersion():
+ # pylint: disable=protected-access
+ raw_version = AdbWrapper._RunAdbCmd(['version'], timeout=2, retries=0)
+ for l in raw_version.splitlines():
+ m = _ADB_VERSION_RE.search(l)
+ if m:
+ return m.group(1)
+ return None
+
+
+def _ShouldRetryAdbCmd(exc):
+ return not isinstance(exc, device_errors.NoAdbError)
+
+
+DeviceStat = collections.namedtuple('DeviceStat',
+ ['st_mode', 'st_size', 'st_time'])
+
+
+def _IsExtraneousLine(line, send_cmd):
+ """Determine if a line read from stdout in persistent shell is extraneous.
+
+ The results output to stdout by the persistent shell process
+ (in PersistentShell below) often include "extraneous" lines that are
+ not part of the output of the shell command. These "extraneous" lines
+ do not always appear and are of two forms: shell prompt lines and lines
+ that just duplicate what the input command was. This function
+ detects these extraneous lines. Since all these lines have the
+ original command in them, that is what it detects ror.
+
+ Args:
+ line: Output line to check.
+ send_cmd: Command that was sent to adb persistent shell.
+ """
+ return send_cmd.rstrip() in line
+
+
+class AdbWrapper(object):
+ """A wrapper around a local Android Debug Bridge executable."""
+
+ _adb_path = lazy.WeakConstant(_FindAdb)
+ _adb_version = lazy.WeakConstant(_GetVersion)
+
+ def __init__(self, device_serial):
+ """Initializes the AdbWrapper.
+
+ Args:
+ device_serial: The device serial number as a string.
+ """
+ if not device_serial:
+ raise ValueError('A device serial must be specified')
+ self._device_serial = str(device_serial)
+
+ class PersistentShell(object):
+ '''Class to use persistent shell for ADB.
+
+ This class allows a persistent ADB shell to be created, where multiple
+ commands can be passed into it. This avoids the overhead of starting
+ up a new ADB shell for each command.
+
+ Example of use:
+ with PersistentShell('123456789') as pshell:
+ pshell.RunCommand('which ls')
+ pshell.RunCommand('echo TEST', close=True)
+ '''
+ def __init__(self, serial):
+ """Initialization function:
+
+ Args:
+ serial: Serial number of device.
+ """
+ self._cmd = [AdbWrapper.GetAdbPath(), '-s', serial, 'shell']
+ self._process = None
+
+ def __enter__(self):
+ self.Start()
+ self.WaitForReady()
+ return self
+
+ def __exit__(self, exc_type, exc_value, tb):
+ self.Stop()
+
+ def Start(self):
+ """Start the shell."""
+ if self._process is not None:
+ raise RuntimeError('Persistent shell already running.')
+ self._process = subprocess.Popen(self._cmd,
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE,
+ shell=False)
+
+ def WaitForReady(self):
+ """Wait for the shell to be ready after starting.
+
+ Sends an echo command, then waits until it gets a response.
+ """
+ self._process.stdin.write('echo\n')
+ output_line = self._process.stdout.readline()
+ while output_line.rstrip() != '':
+ output_line = self._process.stdout.readline()
+
+ def RunCommand(self, command, close=False):
+ """Runs an ADB command and returns the output.
+
+ Note that there can be approximately 40 ms of additional latency
+ between sending the command and receiving the results if close=False
+ due to the use of Nagle's algorithm in the TCP socket between the
+ adb server and client. To avoid this extra latency, set close=True.
+
+ Args:
+ command: Command to send.
+ Returns:
+ The command output, given as a list of lines, and the exit code
+ """
+
+ if close:
+ def run_cmd(cmd):
+ send_cmd = '( %s ); echo $?; exit;\n' % cmd.rstrip()
+ (output, _) = self._process.communicate(send_cmd)
+ self._process = None
+ for x in output.splitlines():
+ yield x
+
+ else:
+ def run_cmd(cmd):
+ send_cmd = '( %s ); echo DONE:$?;\n' % cmd.rstrip()
+ self._process.stdin.write(send_cmd)
+ while True:
+ output_line = self._process.stdout.readline().rstrip()
+ if output_line[:5] == 'DONE:':
+ yield output_line[5:]
+ break
+ yield output_line
+
+ result = [line for line in run_cmd(command)
+ if not _IsExtraneousLine(line, command)]
+
+ return (result[:-1], int(result[-1]))
+
+ def Stop(self):
+ """Stops the ADB process if it is still running."""
+ if self._process is not None:
+ self._process.stdin.write('exit\n')
+ self._process = None
+
+ @classmethod
+ def GetAdbPath(cls):
+ return cls._adb_path.read()
+
+ @classmethod
+ def Version(cls):
+ return cls._adb_version.read()
+
+ @classmethod
+ def _BuildAdbCmd(cls, args, device_serial, cpu_affinity=None):
+ if cpu_affinity is not None:
+ cmd = ['taskset', '-c', str(cpu_affinity)]
+ else:
+ cmd = []
+ cmd.append(cls.GetAdbPath())
+ if device_serial is not None:
+ cmd.extend(['-s', device_serial])
+ cmd.extend(args)
+ return cmd
+
+ # pylint: disable=unused-argument
+ @classmethod
+ @decorators.WithTimeoutAndConditionalRetries(_ShouldRetryAdbCmd)
+ def _RunAdbCmd(cls, args, timeout=None, retries=None, device_serial=None,
+ check_error=True, cpu_affinity=None):
+ # pylint: disable=no-member
+ try:
+ status, output = cmd_helper.GetCmdStatusAndOutputWithTimeout(
+ cls._BuildAdbCmd(args, device_serial, cpu_affinity=cpu_affinity),
+ timeout_retry.CurrentTimeoutThreadGroup().GetRemainingTime())
+ except OSError as e:
+ if e.errno in (errno.ENOENT, errno.ENOEXEC):
+ raise device_errors.NoAdbError(msg=str(e))
+ else:
+ raise
+
+ # Best effort to catch errors from adb; unfortunately adb is very
+ # inconsistent with error reporting so many command failures present
+ # differently.
+ if status != 0 or (check_error and output.startswith('error:')):
+ m = _DEVICE_NOT_FOUND_RE.match(output)
+ if m is not None and m.group('serial') == device_serial:
+ raise device_errors.DeviceUnreachableError(device_serial)
+ else:
+ raise device_errors.AdbCommandFailedError(
+ args, output, status, device_serial)
+
+ return output
+ # pylint: enable=unused-argument
+
+ def _RunDeviceAdbCmd(self, args, timeout, retries, check_error=True):
+ """Runs an adb command on the device associated with this object.
+
+ Args:
+ args: A list of arguments to adb.
+ timeout: Timeout in seconds.
+ retries: Number of retries.
+ check_error: Check that the command doesn't return an error message. This
+ does NOT check the exit status of shell commands.
+
+ Returns:
+ The output of the command.
+ """
+ return self._RunAdbCmd(args, timeout=timeout, retries=retries,
+ device_serial=self._device_serial,
+ check_error=check_error)
+
+ def _IterRunDeviceAdbCmd(self, args, iter_timeout, timeout):
+ """Runs an adb command and returns an iterator over its output lines.
+
+ Args:
+ args: A list of arguments to adb.
+ iter_timeout: Timeout for each iteration in seconds.
+ timeout: Timeout for the entire command in seconds.
+
+ Yields:
+ The output of the command line by line.
+ """
+ return cmd_helper.IterCmdOutputLines(
+ self._BuildAdbCmd(args, self._device_serial),
+ iter_timeout=iter_timeout,
+ timeout=timeout)
+
+ def __eq__(self, other):
+ """Consider instances equal if they refer to the same device.
+
+ Args:
+ other: The instance to compare equality with.
+
+ Returns:
+ True if the instances are considered equal, false otherwise.
+ """
+ return self._device_serial == str(other)
+
+ def __str__(self):
+ """The string representation of an instance.
+
+ Returns:
+ The device serial number as a string.
+ """
+ return self._device_serial
+
+ def __repr__(self):
+ return '%s(\'%s\')' % (self.__class__.__name__, self)
+
+ # pylint: disable=unused-argument
+ @classmethod
+ def IsServerOnline(cls):
+ status, output = cmd_helper.GetCmdStatusAndOutput(['pgrep', 'adb'])
+ output = [int(x) for x in output.split()]
+ logger.info('PIDs for adb found: %r', output)
+ return status == 0
+ # pylint: enable=unused-argument
+
+ @classmethod
+ def KillServer(cls, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
+ cls._RunAdbCmd(['kill-server'], timeout=timeout, retries=retries)
+
+ @classmethod
+ def StartServer(cls, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
+ # CPU affinity is used to reduce adb instability http://crbug.com/268450
+ cls._RunAdbCmd(['start-server'], timeout=timeout, retries=retries,
+ cpu_affinity=0)
+
+ @classmethod
+ def GetDevices(cls, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
+ """DEPRECATED. Refer to Devices(...) below."""
+ # TODO(jbudorick): Remove this function once no more clients are using it.
+ return cls.Devices(timeout=timeout, retries=retries)
+
+ @classmethod
+ def Devices(cls, desired_state=_READY_STATE, long_list=False,
+ timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
+ """Get the list of active attached devices.
+
+ Args:
+ desired_state: If not None, limit the devices returned to only those
+ in the given state.
+ long_list: Whether to use the long listing format.
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+
+ Yields:
+ AdbWrapper instances.
+ """
+ lines = cls._RawDevices(long_list=long_list, timeout=timeout,
+ retries=retries)
+ if long_list:
+ return [
+ [AdbWrapper(line[0])] + line[1:]
+ for line in lines
+ if (len(line) >= 2 and (not desired_state or line[1] == desired_state))
+ ]
+ else:
+ return [
+ AdbWrapper(line[0])
+ for line in lines
+ if (len(line) == 2 and (not desired_state or line[1] == desired_state))
+ ]
+
+ @classmethod
+ def _RawDevices(cls, long_list=False, timeout=DEFAULT_TIMEOUT,
+ retries=DEFAULT_RETRIES):
+ cmd = ['devices']
+ if long_list:
+ cmd.append('-l')
+ output = cls._RunAdbCmd(cmd, timeout=timeout, retries=retries)
+ return [line.split() for line in output.splitlines()[1:]]
+
+ def GetDeviceSerial(self):
+ """Gets the device serial number associated with this object.
+
+ Returns:
+ Device serial number as a string.
+ """
+ return self._device_serial
+
+ def Push(self, local, remote, timeout=60 * 5, retries=DEFAULT_RETRIES):
+ """Pushes a file from the host to the device.
+
+ Args:
+ local: Path on the host filesystem.
+ remote: Path on the device filesystem.
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+ """
+ VerifyLocalFileExists(local)
+
+ if (distutils.version.LooseVersion(self.Version()) <
+ distutils.version.LooseVersion('1.0.36')):
+
+ # Different versions of adb handle pushing a directory to an existing
+ # directory differently.
+
+ # In the version packaged with the M SDK, 1.0.32, the following push:
+ # foo/bar -> /sdcard/foo/bar
+ # where bar is an existing directory both on the host and the device
+ # results in the contents of bar/ on the host being pushed to bar/ on
+ # the device, i.e.
+ # foo/bar/A -> /sdcard/foo/bar/A
+ # foo/bar/B -> /sdcard/foo/bar/B
+ # ... etc.
+
+ # In the version packaged with the N SDK, 1.0.36, the same push under
+ # the same conditions results in a second bar/ directory being created
+ # underneath the first bar/ directory on the device, i.e.
+ # foo/bar/A -> /sdcard/foo/bar/bar/A
+ # foo/bar/B -> /sdcard/foo/bar/bar/B
+ # ... etc.
+
+ # In order to provide a consistent interface to clients, we check whether
+ # the target is an existing directory on the device and, if so, modifies
+ # the target passed to adb to emulate the behavior on 1.0.36 and above.
+
+ # Note that this behavior may have started before 1.0.36; that's simply
+ # the earliest version we've confirmed thus far.
+
+ try:
+ self.Shell('test -d %s' % remote, timeout=timeout, retries=retries)
+ remote = posixpath.join(remote, posixpath.basename(local))
+ except device_errors.AdbShellCommandFailedError:
+ # The target directory doesn't exist on the device, so we can use it
+ # without modification.
+ pass
+
+ self._RunDeviceAdbCmd(['push', local, remote], timeout, retries)
+
+ def Pull(self, remote, local, timeout=60 * 5, retries=DEFAULT_RETRIES):
+ """Pulls a file from the device to the host.
+
+ Args:
+ remote: Path on the device filesystem.
+ local: Path on the host filesystem.
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+ """
+ cmd = ['pull', remote, local]
+ self._RunDeviceAdbCmd(cmd, timeout, retries)
+ try:
+ VerifyLocalFileExists(local)
+ except IOError:
+ raise device_errors.AdbCommandFailedError(
+ cmd,
+ 'File pulled from the device did not arrive on the host: %s' % local,
+ device_serial=str(self))
+
+ def Shell(self, command, expect_status=0, timeout=DEFAULT_TIMEOUT,
+ retries=DEFAULT_RETRIES):
+ """Runs a shell command on the device.
+
+ Args:
+ command: A string with the shell command to run.
+ expect_status: (optional) Check that the command's exit status matches
+ this value. Default is 0. If set to None the test is skipped.
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+
+ Returns:
+ The output of the shell command as a string.
+
+ Raises:
+ device_errors.AdbCommandFailedError: If the exit status doesn't match
+ |expect_status|.
+ """
+ if expect_status is None:
+ args = ['shell', command]
+ else:
+ args = ['shell', '( %s );echo %%$?' % command.rstrip()]
+ output = self._RunDeviceAdbCmd(args, timeout, retries, check_error=False)
+ if expect_status is not None:
+ output_end = output.rfind('%')
+ if output_end < 0:
+ # causes the status string to become empty and raise a ValueError
+ output_end = len(output)
+
+ try:
+ status = int(output[output_end + 1:])
+ except ValueError:
+ logger.warning('exit status of shell command %r missing.', command)
+ raise device_errors.AdbShellCommandFailedError(
+ command, output, status=None, device_serial=self._device_serial)
+ output = output[:output_end]
+ if status != expect_status:
+ raise device_errors.AdbShellCommandFailedError(
+ command, output, status=status, device_serial=self._device_serial)
+ return output
+
+ def IterShell(self, command, timeout):
+ """Runs a shell command and returns an iterator over its output lines.
+
+ Args:
+ command: A string with the shell command to run.
+ timeout: Timeout in seconds.
+
+ Yields:
+ The output of the command line by line.
+ """
+ args = ['shell', command]
+ return cmd_helper.IterCmdOutputLines(
+ self._BuildAdbCmd(args, self._device_serial), timeout=timeout)
+
+ def Ls(self, path, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
+ """List the contents of a directory on the device.
+
+ Args:
+ path: Path on the device filesystem.
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+
+ Returns:
+ A list of pairs (filename, stat) for each file found in the directory,
+ where the stat object has the properties: st_mode, st_size, and st_time.
+
+ Raises:
+ AdbCommandFailedError if |path| does not specify a valid and accessible
+ directory in the device, or the output of "adb ls" command is less
+ than four columns
+ """
+ def ParseLine(line, cmd):
+ cols = line.split(None, 3)
+ if len(cols) < 4:
+ raise device_errors.AdbCommandFailedError(
+ cmd, line, "the output should be 4 columns, but is only %d columns"
+ % len(cols), device_serial=self._device_serial)
+ filename = cols.pop()
+ stat = DeviceStat(*[int(num, base=16) for num in cols])
+ return (filename, stat)
+
+ cmd = ['ls', path]
+ lines = self._RunDeviceAdbCmd(
+ cmd, timeout=timeout, retries=retries).splitlines()
+ if lines:
+ return [ParseLine(line, cmd) for line in lines]
+ else:
+ raise device_errors.AdbCommandFailedError(
+ cmd, 'path does not specify an accessible directory in the device',
+ device_serial=self._device_serial)
+
+ def Logcat(self, clear=False, dump=False, filter_specs=None,
+ logcat_format=None, ring_buffer=None, iter_timeout=None,
+ timeout=None, retries=DEFAULT_RETRIES):
+ """Get an iterable over the logcat output.
+
+ Args:
+ clear: If true, clear the logcat.
+ dump: If true, dump the current logcat contents.
+ filter_specs: If set, a list of specs to filter the logcat.
+ logcat_format: If set, the format in which the logcat should be output.
+ Options include "brief", "process", "tag", "thread", "raw", "time",
+ "threadtime", and "long"
+ ring_buffer: If set, a list of alternate ring buffers to request.
+ Options include "main", "system", "radio", "events", "crash" or "all".
+ The default is equivalent to ["main", "system", "crash"].
+ iter_timeout: If set and neither clear nor dump is set, the number of
+ seconds to wait between iterations. If no line is found before the
+ given number of seconds elapses, the iterable will yield None.
+ timeout: (optional) If set, timeout per try in seconds. If clear or dump
+ is set, defaults to DEFAULT_TIMEOUT.
+ retries: (optional) If clear or dump is set, the number of retries to
+ attempt. Otherwise, does nothing.
+
+ Yields:
+ logcat output line by line.
+ """
+ cmd = ['logcat']
+ use_iter = True
+ if clear:
+ cmd.append('-c')
+ use_iter = False
+ if dump:
+ cmd.append('-d')
+ use_iter = False
+ if logcat_format:
+ cmd.extend(['-v', logcat_format])
+ if ring_buffer:
+ for buffer_name in ring_buffer:
+ cmd.extend(['-b', buffer_name])
+ if filter_specs:
+ cmd.extend(filter_specs)
+
+ if use_iter:
+ return self._IterRunDeviceAdbCmd(cmd, iter_timeout, timeout)
+ else:
+ timeout = timeout if timeout is not None else DEFAULT_TIMEOUT
+ return self._RunDeviceAdbCmd(cmd, timeout, retries).splitlines()
+
+ def Forward(self, local, remote, allow_rebind=False,
+ timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
+ """Forward socket connections from the local socket to the remote socket.
+
+ Sockets are specified by one of:
+ tcp:<port>
+ localabstract:<unix domain socket name>
+ localreserved:<unix domain socket name>
+ localfilesystem:<unix domain socket name>
+ dev:<character device name>
+ jdwp:<process pid> (remote only)
+
+ Args:
+ local: The host socket.
+ remote: The device socket.
+ allow_rebind: A boolean indicating whether adb may rebind a local socket;
+ otherwise, the default, an exception is raised if the local socket is
+ already being forwarded.
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+ """
+ cmd = ['forward']
+ if not allow_rebind:
+ cmd.append('--no-rebind')
+ cmd.extend([str(local), str(remote)])
+ output = self._RunDeviceAdbCmd(cmd, timeout, retries).strip()
+ if output:
+ logger.warning('Unexpected output from "adb forward": %s', output)
+
+ def ForwardRemove(self, local, timeout=DEFAULT_TIMEOUT,
+ retries=DEFAULT_RETRIES):
+ """Remove a forward socket connection.
+
+ Args:
+ local: The host socket.
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+ """
+ self._RunDeviceAdbCmd(['forward', '--remove', str(local)], timeout,
+ retries)
+
+ def ForwardList(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
+ """List all currently forwarded socket connections.
+
+ Args:
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+ Returns:
+ The output of adb forward --list as a string.
+ """
+ if (distutils.version.LooseVersion(self.Version()) >=
+ distutils.version.LooseVersion('1.0.36')):
+ # Starting in 1.0.36, this can occasionally fail with a protocol fault.
+ # As this interrupts all connections with all devices, we instead just
+ # return an empty list. This may give clients an inaccurate result, but
+ # that's usually better than crashing the adb server.
+
+ # TODO(jbudorick): Determine an appropriate upper version bound for this
+ # once b/31811775 is fixed.
+ return ''
+
+ return self._RunDeviceAdbCmd(['forward', '--list'], timeout, retries)
+
+ def JDWP(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
+ """List of PIDs of processes hosting a JDWP transport.
+
+ Args:
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+
+ Returns:
+ A list of PIDs as strings.
+ """
+ return [a.strip() for a in
+ self._RunDeviceAdbCmd(['jdwp'], timeout, retries).split('\n')]
+
+ def Install(self, apk_path, forward_lock=False, allow_downgrade=False,
+ reinstall=False, sd_card=False, timeout=60 * 2,
+ retries=DEFAULT_RETRIES):
+ """Install an apk on the device.
+
+ Args:
+ apk_path: Host path to the APK file.
+ forward_lock: (optional) If set forward-locks the app.
+ allow_downgrade: (optional) If set, allows for downgrades.
+ reinstall: (optional) If set reinstalls the app, keeping its data.
+ sd_card: (optional) If set installs on the SD card.
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+ """
+ VerifyLocalFileExists(apk_path)
+ cmd = ['install']
+ if forward_lock:
+ cmd.append('-l')
+ if reinstall:
+ cmd.append('-r')
+ if sd_card:
+ cmd.append('-s')
+ if allow_downgrade:
+ cmd.append('-d')
+ cmd.append(apk_path)
+ output = self._RunDeviceAdbCmd(cmd, timeout, retries)
+ if 'Success' not in output:
+ raise device_errors.AdbCommandFailedError(
+ cmd, output, device_serial=self._device_serial)
+
+ def InstallMultiple(self, apk_paths, forward_lock=False, reinstall=False,
+ sd_card=False, allow_downgrade=False, partial=False,
+ timeout=60 * 2, retries=DEFAULT_RETRIES):
+ """Install an apk with splits on the device.
+
+ Args:
+ apk_paths: Host path to the APK file.
+ forward_lock: (optional) If set forward-locks the app.
+ reinstall: (optional) If set reinstalls the app, keeping its data.
+ sd_card: (optional) If set installs on the SD card.
+ allow_downgrade: (optional) Allow versionCode downgrade.
+ partial: (optional) Package ID if apk_paths doesn't include all .apks.
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+ """
+ for path in apk_paths:
+ VerifyLocalFileExists(path)
+ cmd = ['install-multiple']
+ if forward_lock:
+ cmd.append('-l')
+ if reinstall:
+ cmd.append('-r')
+ if sd_card:
+ cmd.append('-s')
+ if allow_downgrade:
+ cmd.append('-d')
+ if partial:
+ cmd.extend(('-p', partial))
+ cmd.extend(apk_paths)
+ output = self._RunDeviceAdbCmd(cmd, timeout, retries)
+ if 'Success' not in output:
+ raise device_errors.AdbCommandFailedError(
+ cmd, output, device_serial=self._device_serial)
+
+ def Uninstall(self, package, keep_data=False, timeout=DEFAULT_TIMEOUT,
+ retries=DEFAULT_RETRIES):
+ """Remove the app |package| from the device.
+
+ Args:
+ package: The package to uninstall.
+ keep_data: (optional) If set keep the data and cache directories.
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+ """
+ cmd = ['uninstall']
+ if keep_data:
+ cmd.append('-k')
+ cmd.append(package)
+ output = self._RunDeviceAdbCmd(cmd, timeout, retries)
+ if 'Failure' in output or 'Exception' in output:
+ raise device_errors.AdbCommandFailedError(
+ cmd, output, device_serial=self._device_serial)
+
+ def Backup(self, path, packages=None, apk=False, shared=False,
+ nosystem=True, include_all=False, timeout=DEFAULT_TIMEOUT,
+ retries=DEFAULT_RETRIES):
+ """Write an archive of the device's data to |path|.
+
+ Args:
+ path: Local path to store the backup file.
+ packages: List of to packages to be backed up.
+ apk: (optional) If set include the .apk files in the archive.
+ shared: (optional) If set buckup the device's SD card.
+ nosystem: (optional) If set exclude system applications.
+ include_all: (optional) If set back up all installed applications and
+ |packages| is optional.
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+ """
+ cmd = ['backup', '-f', path]
+ if apk:
+ cmd.append('-apk')
+ if shared:
+ cmd.append('-shared')
+ if nosystem:
+ cmd.append('-nosystem')
+ if include_all:
+ cmd.append('-all')
+ if packages:
+ cmd.extend(packages)
+ assert bool(packages) ^ bool(include_all), (
+ 'Provide \'packages\' or set \'include_all\' but not both.')
+ ret = self._RunDeviceAdbCmd(cmd, timeout, retries)
+ VerifyLocalFileExists(path)
+ return ret
+
+ def Restore(self, path, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
+ """Restore device contents from the backup archive.
+
+ Args:
+ path: Host path to the backup archive.
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+ """
+ VerifyLocalFileExists(path)
+ self._RunDeviceAdbCmd(['restore'] + [path], timeout, retries)
+
+ def WaitForDevice(self, timeout=60 * 5, retries=DEFAULT_RETRIES):
+ """Block until the device is online.
+
+ Args:
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+ """
+ self._RunDeviceAdbCmd(['wait-for-device'], timeout, retries)
+
+ def GetState(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
+ """Get device state.
+
+ Args:
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+
+ Returns:
+ One of 'offline', 'bootloader', or 'device'.
+ """
+ # TODO(jbudorick): Revert to using get-state once it doesn't cause a
+ # a protocol fault.
+ # return self._RunDeviceAdbCmd(['get-state'], timeout, retries).strip()
+
+ lines = self._RawDevices(timeout=timeout, retries=retries)
+ for line in lines:
+ if len(line) >= 2 and line[0] == self._device_serial:
+ return line[1]
+ return 'offline'
+
+ def GetDevPath(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
+ """Gets the device path.
+
+ Args:
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+
+ Returns:
+ The device path (e.g. usb:3-4)
+ """
+ return self._RunDeviceAdbCmd(['get-devpath'], timeout, retries)
+
+ def Remount(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
+ """Remounts the /system partition on the device read-write."""
+ self._RunDeviceAdbCmd(['remount'], timeout, retries)
+
+ def Reboot(self, to_bootloader=False, timeout=60 * 5,
+ retries=DEFAULT_RETRIES):
+ """Reboots the device.
+
+ Args:
+ to_bootloader: (optional) If set reboots to the bootloader.
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+ """
+ if to_bootloader:
+ cmd = ['reboot-bootloader']
+ else:
+ cmd = ['reboot']
+ self._RunDeviceAdbCmd(cmd, timeout, retries)
+
+ def Root(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
+ """Restarts the adbd daemon with root permissions, if possible.
+
+ Args:
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+ """
+ output = self._RunDeviceAdbCmd(['root'], timeout, retries)
+ if 'cannot' in output:
+ raise device_errors.AdbCommandFailedError(
+ ['root'], output, device_serial=self._device_serial)
+
+ def Emu(self, cmd, timeout=DEFAULT_TIMEOUT,
+ retries=DEFAULT_RETRIES):
+ """Runs an emulator console command.
+
+ See http://developer.android.com/tools/devices/emulator.html#console
+
+ Args:
+ cmd: The command to run on the emulator console.
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+
+ Returns:
+ The output of the emulator console command.
+ """
+ if isinstance(cmd, basestring):
+ cmd = [cmd]
+ return self._RunDeviceAdbCmd(['emu'] + cmd, timeout, retries)
+
+ def DisableVerity(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
+ """Disable Marshmallow's Verity security feature"""
+ output = self._RunDeviceAdbCmd(['disable-verity'], timeout, retries)
+ if output and not _VERITY_DISABLE_RE.search(output):
+ raise device_errors.AdbCommandFailedError(
+ ['disable-verity'], output, device_serial=self._device_serial)
+
+ def EnableVerity(self, timeout=DEFAULT_TIMEOUT, retries=DEFAULT_RETRIES):
+ """Enable Marshmallow's Verity security feature"""
+ output = self._RunDeviceAdbCmd(['enable-verity'], timeout, retries)
+ if output and not _VERITY_ENABLE_RE.search(output):
+ raise device_errors.AdbCommandFailedError(
+ ['enable-verity'], output, device_serial=self._device_serial)
+
+ @property
+ def is_emulator(self):
+ return _EMULATOR_RE.match(self._device_serial)
+
+ @property
+ def is_ready(self):
+ try:
+ return self.GetState() == _READY_STATE
+ except device_errors.CommandFailedError:
+ return False
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/adb_wrapper_devicetest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/adb_wrapper_devicetest.py
new file mode 100644
index 0000000..b0ccb24
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/adb_wrapper_devicetest.py
@@ -0,0 +1,122 @@
+#!/usr/bin/env python
+
+# Copyright 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Tests for the AdbWrapper class."""
+
+import os
+import tempfile
+import time
+import unittest
+
+from devil.android import device_test_case
+from devil.android import device_errors
+from devil.android.sdk import adb_wrapper
+
+
+class TestAdbWrapper(device_test_case.DeviceTestCase):
+
+ def setUp(self):
+ super(TestAdbWrapper, self).setUp()
+ self._adb = adb_wrapper.AdbWrapper(self.serial)
+ self._adb.WaitForDevice()
+
+ @staticmethod
+ def _MakeTempFile(contents):
+ """Make a temporary file with the given contents.
+
+ Args:
+ contents: string to write to the temporary file.
+
+ Returns:
+ The absolute path to the file.
+ """
+ fi, path = tempfile.mkstemp()
+ with os.fdopen(fi, 'wb') as f:
+ f.write(contents)
+ return path
+
+ def testDeviceUnreachable(self):
+ with self.assertRaises(device_errors.DeviceUnreachableError):
+ bad_adb = adb_wrapper.AdbWrapper('device_gone')
+ bad_adb.Shell('echo test')
+
+ def testShell(self):
+ output = self._adb.Shell('echo test', expect_status=0)
+ self.assertEqual(output.strip(), 'test')
+ output = self._adb.Shell('echo test')
+ self.assertEqual(output.strip(), 'test')
+ with self.assertRaises(device_errors.AdbCommandFailedError):
+ self._adb.Shell('echo test', expect_status=1)
+
+ def testPersistentShell(self):
+ # We need to access the device serial number here in order
+ # to create the persistent shell.
+ serial = self._adb.GetDeviceSerial() # pylint: disable=protected-access
+ with self._adb.PersistentShell(serial) as pshell:
+ (res1, code1) = pshell.RunCommand('echo TEST')
+ (res2, code2) = pshell.RunCommand('echo TEST2')
+ self.assertEqual(len(res1), 1)
+ self.assertEqual(res1[0], 'TEST')
+ self.assertEqual(res2[-1], 'TEST2')
+ self.assertEqual(code1, 0)
+ self.assertEqual(code2, 0)
+
+ def testPushLsPull(self):
+ path = self._MakeTempFile('foo')
+ device_path = '/data/local/tmp/testfile.txt'
+ local_tmpdir = os.path.dirname(path)
+ self._adb.Push(path, device_path)
+ files = dict(self._adb.Ls('/data/local/tmp'))
+ self.assertTrue('testfile.txt' in files)
+ self.assertEquals(3, files['testfile.txt'].st_size)
+ self.assertEqual(self._adb.Shell('cat %s' % device_path), 'foo')
+ self._adb.Pull(device_path, local_tmpdir)
+ with open(os.path.join(local_tmpdir, 'testfile.txt'), 'r') as f:
+ self.assertEqual(f.read(), 'foo')
+
+ def testInstall(self):
+ path = self._MakeTempFile('foo')
+ with self.assertRaises(device_errors.AdbCommandFailedError):
+ self._adb.Install(path)
+
+ def testForward(self):
+ with self.assertRaises(device_errors.AdbCommandFailedError):
+ self._adb.Forward(0, 0)
+
+ def testUninstall(self):
+ with self.assertRaises(device_errors.AdbCommandFailedError):
+ self._adb.Uninstall('some.nonexistant.package')
+
+ def testRebootWaitForDevice(self):
+ self._adb.Reboot()
+ print 'waiting for device to reboot...'
+ while self._adb.GetState() == 'device':
+ time.sleep(1)
+ self._adb.WaitForDevice()
+ self.assertEqual(self._adb.GetState(), 'device')
+ print 'waiting for package manager...'
+ while True:
+ try:
+ android_path = self._adb.Shell('pm path android')
+ except device_errors.AdbShellCommandFailedError:
+ android_path = None
+ if android_path and 'package:' in android_path:
+ break
+ time.sleep(1)
+
+ def testRootRemount(self):
+ self._adb.Root()
+ while True:
+ try:
+ self._adb.Shell('start')
+ break
+ except device_errors.DeviceUnreachableError:
+ time.sleep(1)
+ self._adb.Remount()
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/adb_wrapper_test.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/adb_wrapper_test.py
new file mode 100644
index 0000000..ef08661
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/adb_wrapper_test.py
@@ -0,0 +1,59 @@
+#!/usr/bin/env python
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""
+Unit tests for some APIs with conditional logic in adb_wrapper.py
+"""
+
+import unittest
+
+from devil import devil_env
+from devil.android import device_errors
+from devil.android.sdk import adb_wrapper
+
+with devil_env.SysPath(devil_env.PYMOCK_PATH):
+ import mock # pylint: disable=import-error
+
+
+class AdbWrapperTest(unittest.TestCase):
+ def setUp(self):
+ self.adb = adb_wrapper.AdbWrapper('ABC12345678')
+
+ def _MockRunDeviceAdbCmd(self, return_value):
+ return mock.patch.object(
+ self.adb,
+ '_RunDeviceAdbCmd',
+ mock.Mock(side_effect=None, return_value=return_value))
+
+ def testDisableVerityWhenDisabled(self):
+ with self._MockRunDeviceAdbCmd('Verity already disabled on /system'):
+ self.adb.DisableVerity()
+
+ def testDisableVerityWhenEnabled(self):
+ with self._MockRunDeviceAdbCmd(
+ 'Verity disabled on /system\nNow reboot your device for settings to '
+ 'take effect'):
+ self.adb.DisableVerity()
+
+ def testEnableVerityWhenEnabled(self):
+ with self._MockRunDeviceAdbCmd('Verity already enabled on /system'):
+ self.adb.EnableVerity()
+
+ def testEnableVerityWhenDisabled(self):
+ with self._MockRunDeviceAdbCmd(
+ 'Verity enabled on /system\nNow reboot your device for settings to '
+ 'take effect'):
+ self.adb.EnableVerity()
+
+ def testFailEnableVerity(self):
+ with self._MockRunDeviceAdbCmd('error: closed'):
+ self.assertRaises(
+ device_errors.AdbCommandFailedError, self.adb.EnableVerity)
+
+ def testFailDisableVerity(self):
+ with self._MockRunDeviceAdbCmd('error: closed'):
+ self.assertRaises(
+ device_errors.AdbCommandFailedError, self.adb.DisableVerity)
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/build_tools.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/build_tools.py
new file mode 100644
index 0000000..99083d9
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/build_tools.py
@@ -0,0 +1,51 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+
+from devil import devil_env
+from devil.utils import lazy
+
+with devil_env.SysPath(devil_env.DEPENDENCY_MANAGER_PATH):
+ import dependency_manager # pylint: disable=import-error
+
+
+def GetPath(build_tool):
+ try:
+ return devil_env.config.LocalPath(build_tool)
+ except dependency_manager.NoPathFoundError:
+ pass
+
+ try:
+ return _PathInLocalSdk(build_tool)
+ except dependency_manager.NoPathFoundError:
+ pass
+
+ return devil_env.config.FetchPath(build_tool)
+
+
+def _PathInLocalSdk(build_tool):
+ build_tools_path = _build_tools_path.read()
+ return (os.path.join(build_tools_path, build_tool) if build_tools_path
+ else None)
+
+
+def _FindBuildTools():
+ android_sdk_path = devil_env.config.LocalPath('android_sdk')
+ if not android_sdk_path:
+ return None
+
+ build_tools_contents = os.listdir(
+ os.path.join(android_sdk_path, 'build-tools'))
+
+ if not build_tools_contents:
+ return None
+ else:
+ if len(build_tools_contents) > 1:
+ build_tools_contents.sort()
+ return os.path.join(android_sdk_path, 'build-tools',
+ build_tools_contents[-1])
+
+
+_build_tools_path = lazy.WeakConstant(_FindBuildTools)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/dexdump.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/dexdump.py
new file mode 100644
index 0000000..992366e
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/dexdump.py
@@ -0,0 +1,31 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from devil.android.sdk import build_tools
+from devil.utils import cmd_helper
+from devil.utils import lazy
+
+
+_dexdump_path = lazy.WeakConstant(lambda: build_tools.GetPath('dexdump'))
+
+
+def DexDump(dexfiles, file_summary=False):
+ """A wrapper around the Android SDK's dexdump tool.
+
+ Args:
+ dexfiles: The dexfile or list of dex files to dump.
+ file_summary: Display summary information from the file header. (-f)
+
+ Returns:
+ An iterable over the output lines.
+ """
+ # TODO(jbudorick): Add support for more options as necessary.
+ if isinstance(dexfiles, basestring):
+ dexfiles = [dexfiles]
+ args = [_dexdump_path.read()] + dexfiles
+ if file_summary:
+ args.append('-f')
+
+ return cmd_helper.IterCmdOutputLines(args)
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/fastboot.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/fastboot.py
new file mode 100644
index 0000000..d7f9f62
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/fastboot.py
@@ -0,0 +1,98 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""This module wraps Android's fastboot tool.
+
+This is a thin wrapper around the fastboot interface. Any additional complexity
+should be delegated to a higher level (ex. FastbootUtils).
+"""
+# pylint: disable=unused-argument
+
+from devil import devil_env
+from devil.android import decorators
+from devil.android import device_errors
+from devil.utils import cmd_helper
+from devil.utils import lazy
+
+_DEFAULT_TIMEOUT = 30
+_DEFAULT_RETRIES = 3
+_FLASH_TIMEOUT = _DEFAULT_TIMEOUT * 10
+
+
+class Fastboot(object):
+
+ _fastboot_path = lazy.WeakConstant(
+ lambda: devil_env.config.FetchPath('fastboot'))
+
+ def __init__(self, device_serial, default_timeout=_DEFAULT_TIMEOUT,
+ default_retries=_DEFAULT_RETRIES):
+ """Initializes the FastbootWrapper.
+
+ Args:
+ device_serial: The device serial number as a string.
+ """
+ if not device_serial:
+ raise ValueError('A device serial must be specified')
+ self._device_serial = str(device_serial)
+ self._default_timeout = default_timeout
+ self._default_retries = default_retries
+
+ def _RunFastbootCommand(self, cmd):
+ """Run a command line command using the fastboot android tool.
+
+ Args:
+ cmd: Command to run. Must be list of args, the first one being the command
+
+ Returns:
+ output of command.
+
+ Raises:
+ TypeError: If cmd is not of type list.
+ """
+ if type(cmd) == list:
+ cmd = [self._fastboot_path.read(), '-s', self._device_serial] + cmd
+ else:
+ raise TypeError(
+ 'Command for _RunFastbootCommand must be a list.')
+ status, output = cmd_helper.GetCmdStatusAndOutput(cmd)
+ if int(status) != 0:
+ raise device_errors.FastbootCommandFailedError(
+ cmd, output, status, self._device_serial)
+ return output
+
+ @decorators.WithTimeoutAndRetriesDefaults(_FLASH_TIMEOUT, 0)
+ def Flash(self, partition, image, timeout=None, retries=None):
+ """Flash partition with img.
+
+ Args:
+ partition: Partition to be flashed.
+ image: location of image to flash with.
+ """
+ self._RunFastbootCommand(['flash', partition, image])
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def Devices(self, timeout=None, retries=None):
+ """Outputs list of devices in fastboot mode."""
+ output = self._RunFastbootCommand(['devices'])
+ return [line.split()[0] for line in output.splitlines()]
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def RebootBootloader(self, timeout=None, retries=None):
+ """Reboot from fastboot, into fastboot."""
+ self._RunFastbootCommand(['reboot-bootloader'])
+
+ @decorators.WithTimeoutAndRetriesDefaults(_FLASH_TIMEOUT, 0)
+ def Reboot(self, timeout=None, retries=None):
+ """Reboot from fastboot to normal usage"""
+ self._RunFastbootCommand(['reboot'])
+
+ @decorators.WithTimeoutAndRetriesFromInstance()
+ def SetOemOffModeCharge(self, value, timeout=None, retries=None):
+ """Sets off mode charging
+
+ Args:
+ value: boolean value to set off-mode-charging on or off.
+ """
+ self._RunFastbootCommand(
+ ['oem', 'off-mode-charge', str(int(value))])
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/gce_adb_wrapper.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/gce_adb_wrapper.py
new file mode 100644
index 0000000..71600f4
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/gce_adb_wrapper.py
@@ -0,0 +1,154 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Provides a work around for various adb commands on android gce instances.
+
+Some adb commands don't work well when the device is a cloud vm, namely
+'push' and 'pull'. With gce instances, moving files through adb can be
+painfully slow and hit timeouts, so the methods here just use scp instead.
+"""
+# pylint: disable=unused-argument
+
+import logging
+import os
+import subprocess
+
+from devil.android import device_errors
+from devil.android.sdk import adb_wrapper
+from devil.utils import cmd_helper
+
+logger = logging.getLogger(__name__)
+
+
+class GceAdbWrapper(adb_wrapper.AdbWrapper):
+
+ def __init__(self, device_serial):
+ super(GceAdbWrapper, self).__init__(device_serial)
+ self._Connect()
+ self.Root()
+ self._instance_ip = self.Shell('getprop net.gce.ip').strip()
+
+ def _Connect(self, timeout=adb_wrapper.DEFAULT_TIMEOUT,
+ retries=adb_wrapper.DEFAULT_RETRIES):
+ """Connects ADB to the android gce instance."""
+ cmd = ['connect', self._device_serial]
+ output = self._RunAdbCmd(cmd, timeout=timeout, retries=retries)
+ if 'unable to connect' in output:
+ raise device_errors.AdbCommandFailedError(cmd, output)
+ self.WaitForDevice()
+
+ # override
+ def Root(self, **kwargs):
+ super(GceAdbWrapper, self).Root()
+ self._Connect()
+
+ # override
+ def Push(self, local, remote, **kwargs):
+ """Pushes an object from the host to the gce instance.
+
+ Args:
+ local: Path on the host filesystem.
+ remote: Path on the instance filesystem.
+ """
+ adb_wrapper.VerifyLocalFileExists(local)
+ if os.path.isdir(local):
+ self.Shell('mkdir -p %s' % cmd_helper.SingleQuote(remote))
+
+ # When the object to be pushed is a directory, adb merges the source dir
+ # with the destination dir. So if local is a dir, just scp its contents.
+ for f in os.listdir(local):
+ self._PushObject(os.path.join(local, f), os.path.join(remote, f))
+ self.Shell('chmod 777 %s' %
+ cmd_helper.SingleQuote(os.path.join(remote, f)))
+ else:
+ parent_dir = remote[0:remote.rfind('/')]
+ if parent_dir:
+ self.Shell('mkdir -p %s' % cmd_helper.SingleQuote(parent_dir))
+ self._PushObject(local, remote)
+ self.Shell('chmod 777 %s' % cmd_helper.SingleQuote(remote))
+
+ def _PushObject(self, local, remote):
+ """Copies an object from the host to the gce instance using scp.
+
+ Args:
+ local: Path on the host filesystem.
+ remote: Path on the instance filesystem.
+ """
+ cmd = [
+ 'scp',
+ '-r',
+ '-o', 'UserKnownHostsFile=/dev/null',
+ '-o', 'StrictHostKeyChecking=no',
+ local,
+ 'root@%s:%s' % (self._instance_ip, remote)
+ ]
+ status, _ = cmd_helper.GetCmdStatusAndOutput(cmd)
+ if status:
+ raise device_errors.AdbCommandFailedError(
+ cmd, 'File not reachable on host: %s' % local,
+ device_serial=str(self))
+
+ # override
+ def Pull(self, remote, local, **kwargs):
+ """Pulls a file from the gce instance to the host.
+
+ Args:
+ remote: Path on the instance filesystem.
+ local: Path on the host filesystem.
+ """
+ cmd = [
+ 'scp',
+ '-p',
+ '-r',
+ '-o', 'UserKnownHostsFile=/dev/null',
+ '-o', 'StrictHostKeyChecking=no',
+ 'root@%s:%s' % (self._instance_ip, remote),
+ local,
+ ]
+ status, _ = cmd_helper.GetCmdStatusAndOutput(cmd)
+ if status:
+ raise device_errors.AdbCommandFailedError(
+ cmd, 'File not reachable on host: %s' % local,
+ device_serial=str(self))
+
+ try:
+ adb_wrapper.VerifyLocalFileExists(local)
+ except (subprocess.CalledProcessError, IOError):
+ logger.exception('Error when pulling files from android instance.')
+ raise device_errors.AdbCommandFailedError(
+ cmd, 'File not reachable on host: %s' % local,
+ device_serial=str(self))
+
+ # override
+ def Install(self, apk_path, forward_lock=False, reinstall=False,
+ sd_card=False, **kwargs):
+ """Installs an apk on the gce instance
+
+ Args:
+ apk_path: Host path to the APK file.
+ forward_lock: (optional) If set forward-locks the app.
+ reinstall: (optional) If set reinstalls the app, keeping its data.
+ sd_card: (optional) If set installs on the SD card.
+ """
+ adb_wrapper.VerifyLocalFileExists(apk_path)
+ cmd = ['install']
+ if forward_lock:
+ cmd.append('-l')
+ if reinstall:
+ cmd.append('-r')
+ if sd_card:
+ cmd.append('-s')
+ self.Push(apk_path, '/data/local/tmp/tmp.apk')
+ cmd = ['pm'] + cmd
+ cmd.append('/data/local/tmp/tmp.apk')
+ output = self.Shell(' '.join(cmd))
+ self.Shell('rm /data/local/tmp/tmp.apk')
+ if 'Success' not in output:
+ raise device_errors.AdbCommandFailedError(
+ cmd, output, device_serial=self._device_serial)
+
+ # override
+ @property
+ def is_emulator(self):
+ return True
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/intent.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/intent.py
new file mode 100644
index 0000000..cdefb46
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/intent.py
@@ -0,0 +1,129 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Manages intents and associated information.
+
+This is generally intended to be used with functions that calls Android's
+Am command.
+"""
+
+# Some common flag constants that can be used to construct intents.
+# Full list: http://developer.android.com/reference/android/content/Intent.html
+FLAG_ACTIVITY_CLEAR_TASK = 0x00008000
+FLAG_ACTIVITY_CLEAR_TOP = 0x04000000
+FLAG_ACTIVITY_NEW_TASK = 0x10000000
+FLAG_ACTIVITY_REORDER_TO_FRONT = 0x00020000
+FLAG_ACTIVITY_RESET_TASK_IF_NEEDED = 0x00200000
+
+
+def _bitwise_or(flags):
+ result = 0
+ for flag in flags:
+ result |= flag
+ return result
+
+
+class Intent(object):
+
+ def __init__(self, action='android.intent.action.VIEW', activity=None,
+ category=None, component=None, data=None, extras=None,
+ flags=None, package=None):
+ """Creates an Intent.
+
+ Args:
+ action: A string containing the action.
+ activity: A string that, with |package|, can be used to specify the
+ component.
+ category: A string or list containing any categories.
+ component: A string that specifies the component to send the intent to.
+ data: A string containing a data URI.
+ extras: A dict containing extra parameters to be passed along with the
+ intent.
+ flags: A sequence of flag constants to be passed with the intent.
+ package: A string that, with activity, can be used to specify the
+ component.
+ """
+ self._action = action
+ self._activity = activity
+ if isinstance(category, list) or category is None:
+ self._category = category
+ else:
+ self._category = [category]
+ self._component = component
+ self._data = data
+ self._extras = extras
+ self._flags = '0x%0.8x' % _bitwise_or(flags) if flags else None
+ self._package = package
+
+ if self._component and '/' in component:
+ self._package, self._activity = component.split('/', 1)
+ elif self._package and self._activity:
+ self._component = '%s/%s' % (package, activity)
+
+ @property
+ def action(self):
+ return self._action
+
+ @property
+ def activity(self):
+ return self._activity
+
+ @property
+ def category(self):
+ return self._category
+
+ @property
+ def component(self):
+ return self._component
+
+ @property
+ def data(self):
+ return self._data
+
+ @property
+ def extras(self):
+ return self._extras
+
+ @property
+ def flags(self):
+ return self._flags
+
+ @property
+ def package(self):
+ return self._package
+
+ @property
+ def am_args(self):
+ """Returns the intent as a list of arguments for the activity manager.
+
+ For details refer to the specification at:
+ - http://developer.android.com/tools/help/adb.html#IntentSpec
+ """
+ args = []
+ if self.action:
+ args.extend(['-a', self.action])
+ if self.data:
+ args.extend(['-d', self.data])
+ if self.category:
+ args.extend(arg for cat in self.category for arg in ('-c', cat))
+ if self.component:
+ args.extend(['-n', self.component])
+ if self.flags:
+ args.extend(['-f', self.flags])
+ if self.extras:
+ for key, value in self.extras.iteritems():
+ if value is None:
+ args.extend(['--esn', key])
+ elif isinstance(value, str):
+ args.extend(['--es', key, value])
+ elif isinstance(value, bool):
+ args.extend(['--ez', key, str(value)])
+ elif isinstance(value, int):
+ args.extend(['--ei', key, str(value)])
+ elif isinstance(value, float):
+ args.extend(['--ef', key, str(value)])
+ else:
+ raise NotImplementedError(
+ 'Intent does not know how to pass %s extras' % type(value))
+ return args
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/keyevent.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/keyevent.py
new file mode 100644
index 0000000..657dc96
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/keyevent.py
@@ -0,0 +1,63 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Android KeyEvent constants.
+
+http://developer.android.com/reference/android/view/KeyEvent.html
+"""
+
+KEYCODE_BACK = 4
+
+KEYCODE_0 = 7
+KEYCODE_1 = 8
+KEYCODE_2 = 9
+KEYCODE_3 = 10
+KEYCODE_4 = 11
+KEYCODE_5 = 12
+KEYCODE_6 = 13
+KEYCODE_7 = 14
+KEYCODE_8 = 15
+KEYCODE_9 = 16
+
+KEYCODE_DPAD_RIGHT = 22
+
+KEYCODE_POWER = 26
+
+KEYCODE_A = 29
+KEYCODE_B = 30
+KEYCODE_C = 31
+KEYCODE_D = 32
+KEYCODE_E = 33
+KEYCODE_F = 34
+KEYCODE_G = 35
+KEYCODE_H = 36
+KEYCODE_I = 37
+KEYCODE_J = 38
+KEYCODE_K = 39
+KEYCODE_L = 40
+KEYCODE_M = 41
+KEYCODE_N = 42
+KEYCODE_O = 43
+KEYCODE_P = 44
+KEYCODE_Q = 45
+KEYCODE_R = 46
+KEYCODE_S = 47
+KEYCODE_T = 48
+KEYCODE_U = 49
+KEYCODE_V = 50
+KEYCODE_W = 51
+KEYCODE_X = 52
+KEYCODE_Y = 53
+KEYCODE_Z = 54
+
+KEYCODE_PERIOD = 56
+
+KEYCODE_SPACE = 62
+
+KEYCODE_ENTER = 66
+KEYCODE_DEL = 67
+
+KEYCODE_MENU = 82
+
+KEYCODE_APP_SWITCH = 187
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/shared_prefs.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/shared_prefs.py
new file mode 100644
index 0000000..2fa2e6a
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/shared_prefs.py
@@ -0,0 +1,420 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Helper object to read and modify Shared Preferences from Android apps.
+
+See e.g.:
+ http://developer.android.com/reference/android/content/SharedPreferences.html
+"""
+
+import logging
+import posixpath
+
+from devil.android import device_errors
+from devil.android.sdk import version_codes
+from xml.etree import ElementTree
+
+logger = logging.getLogger(__name__)
+
+
+_XML_DECLARATION = "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
+
+
+class BasePref(object):
+ """Base class for getting/setting the value of a specific preference type.
+
+ Should not be instantiated directly. The SharedPrefs collection will
+ instantiate the appropriate subclasses, which directly manipulate the
+ underlying xml document, to parse and serialize values according to their
+ type.
+
+ Args:
+ elem: An xml ElementTree object holding the preference data.
+
+ Properties:
+ tag_name: A string with the tag that must be used for this preference type.
+ """
+ tag_name = None
+
+ def __init__(self, elem):
+ if elem.tag != type(self).tag_name:
+ raise TypeError('Property %r has type %r, but trying to access as %r' %
+ (elem.get('name'), elem.tag, type(self).tag_name))
+ self._elem = elem
+
+ def __str__(self):
+ """Get the underlying xml element as a string."""
+ return ElementTree.tostring(self._elem)
+
+ def get(self):
+ """Get the value of this preference."""
+ return self._elem.get('value')
+
+ def set(self, value):
+ """Set from a value casted as a string."""
+ self._elem.set('value', str(value))
+
+ @property
+ def has_value(self):
+ """Check whether the element has a value."""
+ return self._elem.get('value') is not None
+
+
+class BooleanPref(BasePref):
+ """Class for getting/setting a preference with a boolean value.
+
+ The underlying xml element has the form, e.g.:
+ <boolean name="featureEnabled" value="false" />
+ """
+ tag_name = 'boolean'
+ VALUES = {'true': True, 'false': False}
+
+ def get(self):
+ """Get the value as a Python bool."""
+ return type(self).VALUES[super(BooleanPref, self).get()]
+
+ def set(self, value):
+ """Set from a value casted as a bool."""
+ super(BooleanPref, self).set('true' if value else 'false')
+
+
+class FloatPref(BasePref):
+ """Class for getting/setting a preference with a float value.
+
+ The underlying xml element has the form, e.g.:
+ <float name="someMetric" value="4.7" />
+ """
+ tag_name = 'float'
+
+ def get(self):
+ """Get the value as a Python float."""
+ return float(super(FloatPref, self).get())
+
+
+class IntPref(BasePref):
+ """Class for getting/setting a preference with an int value.
+
+ The underlying xml element has the form, e.g.:
+ <int name="aCounter" value="1234" />
+ """
+ tag_name = 'int'
+
+ def get(self):
+ """Get the value as a Python int."""
+ return int(super(IntPref, self).get())
+
+
+class LongPref(IntPref):
+ """Class for getting/setting a preference with a long value.
+
+ The underlying xml element has the form, e.g.:
+ <long name="aLongCounter" value="1234" />
+
+ We use the same implementation from IntPref.
+ """
+ tag_name = 'long'
+
+
+class StringPref(BasePref):
+ """Class for getting/setting a preference with a string value.
+
+ The underlying xml element has the form, e.g.:
+ <string name="someHashValue">249b3e5af13d4db2</string>
+ """
+ tag_name = 'string'
+
+ def get(self):
+ """Get the value as a Python string."""
+ return self._elem.text
+
+ def set(self, value):
+ """Set from a value casted as a string."""
+ self._elem.text = str(value)
+
+
+class StringSetPref(StringPref):
+ """Class for getting/setting a preference with a set of string values.
+
+ The underlying xml element has the form, e.g.:
+ <set name="managed_apps">
+ <string>com.mine.app1</string>
+ <string>com.mine.app2</string>
+ <string>com.mine.app3</string>
+ </set>
+ """
+ tag_name = 'set'
+
+ def get(self):
+ """Get a list with the string values contained."""
+ value = []
+ for child in self._elem:
+ assert child.tag == 'string'
+ value.append(child.text)
+ return value
+
+ def set(self, value):
+ """Set from a sequence of values, each casted as a string."""
+ for child in list(self._elem):
+ self._elem.remove(child)
+ for item in value:
+ ElementTree.SubElement(self._elem, 'string').text = str(item)
+
+
+_PREF_TYPES = {c.tag_name: c for c in [BooleanPref, FloatPref, IntPref,
+ LongPref, StringPref, StringSetPref]}
+
+
+class SharedPrefs(object):
+
+ def __init__(self, device, package, filename):
+ """Helper object to read and update "Shared Prefs" of Android apps.
+
+ Such files typically look like, e.g.:
+
+ <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
+ <map>
+ <int name="databaseVersion" value="107" />
+ <boolean name="featureEnabled" value="false" />
+ <string name="someHashValue">249b3e5af13d4db2</string>
+ </map>
+
+ Example usage:
+
+ prefs = shared_prefs.SharedPrefs(device, 'com.my.app', 'my_prefs.xml')
+ prefs.Load()
+ prefs.GetString('someHashValue') # => '249b3e5af13d4db2'
+ prefs.SetInt('databaseVersion', 42)
+ prefs.Remove('featureEnabled')
+ prefs.Commit()
+
+ The object may also be used as a context manager to automatically load and
+ commit, respectively, upon entering and leaving the context.
+
+ Args:
+ device: A DeviceUtils object.
+ package: A string with the package name of the app that owns the shared
+ preferences file.
+ filename: A string with the name of the preferences file to read/write.
+ """
+ self._device = device
+ self._xml = None
+ self._package = package
+ self._filename = filename
+ self._path = '/data/data/%s/shared_prefs/%s' % (package, filename)
+ self._changed = False
+
+ def __repr__(self):
+ """Get a useful printable representation of the object."""
+ return '<{cls} file {filename} for {package} on {device}>'.format(
+ cls=type(self).__name__, filename=self.filename, package=self.package,
+ device=str(self._device))
+
+ def __str__(self):
+ """Get the underlying xml document as a string."""
+ return _XML_DECLARATION + ElementTree.tostring(self.xml)
+
+ @property
+ def package(self):
+ """Get the package name of the app that owns the shared preferences."""
+ return self._package
+
+ @property
+ def filename(self):
+ """Get the filename of the shared preferences file."""
+ return self._filename
+
+ @property
+ def path(self):
+ """Get the full path to the shared preferences file on the device."""
+ return self._path
+
+ @property
+ def changed(self):
+ """True if properties have changed and a commit would be needed."""
+ return self._changed
+
+ @property
+ def xml(self):
+ """Get the underlying xml document as an ElementTree object."""
+ if self._xml is None:
+ self._xml = ElementTree.Element('map')
+ return self._xml
+
+ def Load(self):
+ """Load the shared preferences file from the device.
+
+ A empty xml document, which may be modified and saved on |commit|, is
+ created if the file does not already exist.
+ """
+ if self._device.FileExists(self.path):
+ self._xml = ElementTree.fromstring(
+ self._device.ReadFile(self.path, as_root=True))
+ assert self._xml.tag == 'map'
+ else:
+ self._xml = None
+ self._changed = False
+
+ def Clear(self):
+ """Clear all of the preferences contained in this object."""
+ if self._xml is not None and len(self): # only clear if not already empty
+ self._xml = None
+ self._changed = True
+
+ def Commit(self):
+ """Save the current set of preferences to the device.
+
+ Only actually saves if some preferences have been modified.
+ """
+ if not self.changed:
+ return
+ self._device.RunShellCommand(
+ ['mkdir', '-p', posixpath.dirname(self.path)],
+ as_root=True, check_return=True)
+ self._device.WriteFile(self.path, str(self), as_root=True)
+ # Creating the directory/file can cause issues with SELinux if they did
+ # not already exist. As a workaround, apply the package's security context
+ # to the shared_prefs directory, which mimics the behavior of a file
+ # created by the app itself
+ if self._device.build_version_sdk >= version_codes.MARSHMALLOW:
+ security_context = self._GetSecurityContext(self.package)
+ if security_context == None:
+ raise device_errors.CommandFailedError(
+ 'Failed to get security context for %s' % self.package)
+ self._device.RunShellCommand(
+ ['chcon', '-R', security_context,
+ '/data/data/%s/shared_prefs' % self.package],
+ as_root=True, check_return=True)
+ self._device.KillAll(self.package, exact=True, as_root=True, quiet=True)
+ self._changed = False
+
+ def __len__(self):
+ """Get the number of preferences in this collection."""
+ return len(self.xml)
+
+ def PropertyType(self, key):
+ """Get the type (i.e. tag name) of a property in the collection."""
+ return self._GetChild(key).tag
+
+ def HasProperty(self, key):
+ try:
+ self._GetChild(key)
+ return True
+ except KeyError:
+ return False
+
+ def GetBoolean(self, key):
+ """Get a boolean property."""
+ return BooleanPref(self._GetChild(key)).get()
+
+ def SetBoolean(self, key, value):
+ """Set a boolean property."""
+ self._SetPrefValue(key, value, BooleanPref)
+
+ def GetFloat(self, key):
+ """Get a float property."""
+ return FloatPref(self._GetChild(key)).get()
+
+ def SetFloat(self, key, value):
+ """Set a float property."""
+ self._SetPrefValue(key, value, FloatPref)
+
+ def GetInt(self, key):
+ """Get an int property."""
+ return IntPref(self._GetChild(key)).get()
+
+ def SetInt(self, key, value):
+ """Set an int property."""
+ self._SetPrefValue(key, value, IntPref)
+
+ def GetLong(self, key):
+ """Get a long property."""
+ return LongPref(self._GetChild(key)).get()
+
+ def SetLong(self, key, value):
+ """Set a long property."""
+ self._SetPrefValue(key, value, LongPref)
+
+ def GetString(self, key):
+ """Get a string property."""
+ return StringPref(self._GetChild(key)).get()
+
+ def SetString(self, key, value):
+ """Set a string property."""
+ self._SetPrefValue(key, value, StringPref)
+
+ def GetStringSet(self, key):
+ """Get a string set property."""
+ return StringSetPref(self._GetChild(key)).get()
+
+ def SetStringSet(self, key, value):
+ """Set a string set property."""
+ self._SetPrefValue(key, value, StringSetPref)
+
+ def Remove(self, key):
+ """Remove a preference from the collection."""
+ self.xml.remove(self._GetChild(key))
+
+ def AsDict(self):
+ """Return the properties and their values as a dictionary."""
+ d = {}
+ for child in self.xml:
+ pref = _PREF_TYPES[child.tag](child)
+ d[child.get('name')] = pref.get()
+ return d
+
+ def __enter__(self):
+ """Load preferences file from the device when entering a context."""
+ self.Load()
+ return self
+
+ def __exit__(self, exc_type, _exc_value, _traceback):
+ """Save preferences file to the device when leaving a context."""
+ if not exc_type:
+ self.Commit()
+
+ def _GetChild(self, key):
+ """Get the underlying xml node that holds the property of a given key.
+
+ Raises:
+ KeyError when the key is not found in the collection.
+ """
+ for child in self.xml:
+ if child.get('name') == key:
+ return child
+ raise KeyError(key)
+
+ def _SetPrefValue(self, key, value, pref_cls):
+ """Set the value of a property.
+
+ Args:
+ key: The key of the property to set.
+ value: The new value of the property.
+ pref_cls: A subclass of BasePref used to access the property.
+
+ Raises:
+ TypeError when the key already exists but with a different type.
+ """
+ try:
+ pref = pref_cls(self._GetChild(key))
+ old_value = pref.get()
+ except KeyError:
+ pref = pref_cls(ElementTree.SubElement(
+ self.xml, pref_cls.tag_name, {'name': key}))
+ old_value = None
+ if old_value != value:
+ pref.set(value)
+ self._changed = True
+ logger.info('Setting property: %s', pref)
+
+ def _GetSecurityContext(self, package):
+ for line in self._device.RunShellCommand(['ls', '-Z', '/data/data/'],
+ as_root=True, check_return=True):
+ split_line = line.split()
+ # ls -Z output differs between Android versions, but the package is
+ # always last and the context always starts with "u:object"
+ if split_line[-1] == package:
+ for column in split_line:
+ if column.startswith('u:object'):
+ return column
+ return None
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/shared_prefs_test.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/shared_prefs_test.py
new file mode 100644
index 0000000..4c31c56
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/shared_prefs_test.py
@@ -0,0 +1,171 @@
+#!/usr/bin/env python
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""
+Unit tests for the contents of shared_prefs.py (mostly SharedPrefs).
+"""
+
+import logging
+import unittest
+
+from devil import devil_env
+from devil.android import device_utils
+from devil.android.sdk import shared_prefs
+from devil.android.sdk import version_codes
+
+with devil_env.SysPath(devil_env.PYMOCK_PATH):
+ import mock # pylint: disable=import-error
+
+
+def MockDeviceWithFiles(files=None):
+ if files is None:
+ files = {}
+
+ def file_exists(path):
+ return path in files
+
+ def write_file(path, contents, **_kwargs):
+ files[path] = contents
+
+ def read_file(path, **_kwargs):
+ return files[path]
+
+ device = mock.MagicMock(spec=device_utils.DeviceUtils)
+ device.FileExists = mock.Mock(side_effect=file_exists)
+ device.WriteFile = mock.Mock(side_effect=write_file)
+ device.ReadFile = mock.Mock(side_effect=read_file)
+ return device
+
+
+class SharedPrefsTest(unittest.TestCase):
+
+ def setUp(self):
+ self.device = MockDeviceWithFiles({
+ '/data/data/com.some.package/shared_prefs/prefs.xml':
+ "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
+ '<map>\n'
+ ' <int name="databaseVersion" value="107" />\n'
+ ' <boolean name="featureEnabled" value="false" />\n'
+ ' <string name="someHashValue">249b3e5af13d4db2</string>\n'
+ '</map>'})
+ self.expected_data = {'databaseVersion': 107,
+ 'featureEnabled': False,
+ 'someHashValue': '249b3e5af13d4db2'}
+
+ def testPropertyLifetime(self):
+ prefs = shared_prefs.SharedPrefs(
+ self.device, 'com.some.package', 'prefs.xml')
+ self.assertEquals(len(prefs), 0) # collection is empty before loading
+ prefs.SetInt('myValue', 444)
+ self.assertEquals(len(prefs), 1)
+ self.assertEquals(prefs.GetInt('myValue'), 444)
+ self.assertTrue(prefs.HasProperty('myValue'))
+ prefs.Remove('myValue')
+ self.assertEquals(len(prefs), 0)
+ self.assertFalse(prefs.HasProperty('myValue'))
+ with self.assertRaises(KeyError):
+ prefs.GetInt('myValue')
+
+ def testPropertyType(self):
+ prefs = shared_prefs.SharedPrefs(
+ self.device, 'com.some.package', 'prefs.xml')
+ prefs.SetInt('myValue', 444)
+ self.assertEquals(prefs.PropertyType('myValue'), 'int')
+ with self.assertRaises(TypeError):
+ prefs.GetString('myValue')
+ with self.assertRaises(TypeError):
+ prefs.SetString('myValue', 'hello')
+
+ def testLoad(self):
+ prefs = shared_prefs.SharedPrefs(
+ self.device, 'com.some.package', 'prefs.xml')
+ self.assertEquals(len(prefs), 0) # collection is empty before loading
+ prefs.Load()
+ self.assertEquals(len(prefs), len(self.expected_data))
+ self.assertEquals(prefs.AsDict(), self.expected_data)
+ self.assertFalse(prefs.changed)
+
+ def testClear(self):
+ prefs = shared_prefs.SharedPrefs(
+ self.device, 'com.some.package', 'prefs.xml')
+ prefs.Load()
+ self.assertEquals(prefs.AsDict(), self.expected_data)
+ self.assertFalse(prefs.changed)
+ prefs.Clear()
+ self.assertEquals(len(prefs), 0) # collection is empty now
+ self.assertTrue(prefs.changed)
+
+ def testCommit(self):
+ type(self.device).build_version_sdk = mock.PropertyMock(
+ return_value=version_codes.LOLLIPOP_MR1)
+ prefs = shared_prefs.SharedPrefs(
+ self.device, 'com.some.package', 'other_prefs.xml')
+ self.assertFalse(self.device.FileExists(prefs.path)) # file does not exist
+ prefs.Load()
+ self.assertEquals(len(prefs), 0) # file did not exist, collection is empty
+ prefs.SetInt('magicNumber', 42)
+ prefs.SetFloat('myMetric', 3.14)
+ prefs.SetLong('bigNumner', 6000000000)
+ prefs.SetStringSet('apps', ['gmail', 'chrome', 'music'])
+ self.assertFalse(self.device.FileExists(prefs.path)) # still does not exist
+ self.assertTrue(prefs.changed)
+ prefs.Commit()
+ self.assertTrue(self.device.FileExists(prefs.path)) # should exist now
+ self.device.KillAll.assert_called_once_with(prefs.package, exact=True,
+ as_root=True, quiet=True)
+ self.assertFalse(prefs.changed)
+
+ prefs = shared_prefs.SharedPrefs(
+ self.device, 'com.some.package', 'other_prefs.xml')
+ self.assertEquals(len(prefs), 0) # collection is empty before loading
+ prefs.Load()
+ self.assertEquals(prefs.AsDict(), {
+ 'magicNumber': 42,
+ 'myMetric': 3.14,
+ 'bigNumner': 6000000000,
+ 'apps': ['gmail', 'chrome', 'music']}) # data survived roundtrip
+
+ def testAsContextManager_onlyReads(self):
+ with shared_prefs.SharedPrefs(
+ self.device, 'com.some.package', 'prefs.xml') as prefs:
+ self.assertEquals(prefs.AsDict(), self.expected_data) # loaded and ready
+ self.assertEquals(self.device.WriteFile.call_args_list, []) # did not write
+
+ def testAsContextManager_readAndWrite(self):
+ type(self.device).build_version_sdk = mock.PropertyMock(
+ return_value=version_codes.LOLLIPOP_MR1)
+ with shared_prefs.SharedPrefs(
+ self.device, 'com.some.package', 'prefs.xml') as prefs:
+ prefs.SetBoolean('featureEnabled', True)
+ prefs.Remove('someHashValue')
+ prefs.SetString('newString', 'hello')
+
+ self.assertTrue(self.device.WriteFile.called) # did write
+ with shared_prefs.SharedPrefs(
+ self.device, 'com.some.package', 'prefs.xml') as prefs:
+ # changes persisted
+ self.assertTrue(prefs.GetBoolean('featureEnabled'))
+ self.assertFalse(prefs.HasProperty('someHashValue'))
+ self.assertEquals(prefs.GetString('newString'), 'hello')
+ self.assertTrue(prefs.HasProperty('databaseVersion')) # still there
+
+ def testAsContextManager_commitAborted(self):
+ with self.assertRaises(TypeError):
+ with shared_prefs.SharedPrefs(
+ self.device, 'com.some.package', 'prefs.xml') as prefs:
+ prefs.SetBoolean('featureEnabled', True)
+ prefs.Remove('someHashValue')
+ prefs.SetString('newString', 'hello')
+ prefs.SetInt('newString', 123) # oops!
+
+ self.assertEquals(self.device.WriteFile.call_args_list, []) # did not write
+ with shared_prefs.SharedPrefs(
+ self.device, 'com.some.package', 'prefs.xml') as prefs:
+ # contents were not modified
+ self.assertEquals(prefs.AsDict(), self.expected_data)
+
+if __name__ == '__main__':
+ logging.getLogger().setLevel(logging.DEBUG)
+ unittest.main(verbosity=2)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/split_select.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/split_select.py
new file mode 100644
index 0000000..6c3d231
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/split_select.py
@@ -0,0 +1,63 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""This module wraps Android's split-select tool."""
+
+from devil.android.sdk import build_tools
+from devil.utils import cmd_helper
+from devil.utils import lazy
+
+
+_split_select_path = lazy.WeakConstant(
+ lambda: build_tools.GetPath('split-select'))
+
+
+def _RunSplitSelectCmd(args):
+ """Runs a split-select command.
+
+ Args:
+ args: A list of arguments for split-select.
+
+ Returns:
+ The output of the command.
+ """
+ cmd = [_split_select_path.read()] + args
+ status, output = cmd_helper.GetCmdStatusAndOutput(cmd)
+ if status != 0:
+ raise Exception('Failed running command "%s" with output "%s".' %
+ (' '.join(cmd), output))
+ return output
+
+
+def _SplitConfig(device, allow_cached_props=False):
+ """Returns a config specifying which APK splits are required by the device.
+
+ Args:
+ device: A DeviceUtils object.
+ allow_cached_props: Whether to use cached values for device properties.
+ """
+ return ('%s-r%s-%s:%s' %
+ (device.GetLanguage(cache=allow_cached_props),
+ device.GetCountry(cache=allow_cached_props),
+ device.screen_density,
+ device.product_cpu_abi))
+
+
+def SelectSplits(device, base_apk, split_apks, allow_cached_props=False):
+ """Determines which APK splits the device requires.
+
+ Args:
+ device: A DeviceUtils object.
+ base_apk: The path of the base APK.
+ split_apks: A list of paths of APK splits.
+ allow_cached_props: Whether to use cached values for device properties.
+
+ Returns:
+ The list of APK splits that the device requires.
+ """
+ config = _SplitConfig(device, allow_cached_props=allow_cached_props)
+ args = ['--target', config, '--base', base_apk]
+ for split in split_apks:
+ args.extend(['--split', split])
+ return _RunSplitSelectCmd(args).splitlines()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/test/data/push_directory/push_directory_contents.txt b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/test/data/push_directory/push_directory_contents.txt
new file mode 100644
index 0000000..573df2e
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/test/data/push_directory/push_directory_contents.txt
@@ -0,0 +1 @@
+Goodnight, moon.
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/test/data/push_file.txt b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/test/data/push_file.txt
new file mode 100644
index 0000000..af5626b
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/test/data/push_file.txt
@@ -0,0 +1 @@
+Hello, world!
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/version_codes.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/version_codes.py
new file mode 100644
index 0000000..3f03cba
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/sdk/version_codes.py
@@ -0,0 +1,20 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Android SDK version codes.
+
+http://developer.android.com/reference/android/os/Build.VERSION_CODES.html
+"""
+
+JELLY_BEAN = 16
+JELLY_BEAN_MR1 = 17
+JELLY_BEAN_MR2 = 18
+KITKAT = 19
+KITKAT_WATCH = 20
+LOLLIPOP = 21
+LOLLIPOP_MR1 = 22
+MARSHMALLOW = 23
+NOUGAT = 24
+NOUGAT_MR1 = 25
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/settings.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/settings.py
new file mode 100644
index 0000000..d053d2a
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/settings.py
@@ -0,0 +1,283 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import logging
+
+logger = logging.getLogger(__name__)
+
+_LOCK_SCREEN_SETTINGS_PATH = '/data/system/locksettings.db'
+_ALTERNATE_LOCK_SCREEN_SETTINGS_PATH = (
+ '/data/data/com.android.providers.settings/databases/settings.db')
+PASSWORD_QUALITY_UNSPECIFIED = '0'
+_COMPATIBLE_BUILD_TYPES = ['userdebug', 'eng']
+
+
+ENABLE_LOCATION_SETTINGS = [
+ # Note that setting these in this order is required in order for all of
+ # them to take and stick through a reboot.
+ ('com.google.settings/partner', [
+ ('use_location_for_services', 1),
+ ]),
+ ('settings/secure', [
+ # Ensure Geolocation is enabled and allowed for tests.
+ ('location_providers_allowed', 'gps,network'),
+ ]),
+ ('com.google.settings/partner', [
+ ('network_location_opt_in', 1),
+ ])
+]
+
+DISABLE_LOCATION_SETTINGS = [
+ ('com.google.settings/partner', [
+ ('use_location_for_services', 0),
+ ]),
+ ('settings/secure', [
+ # Ensure Geolocation is disabled.
+ ('location_providers_allowed', ''),
+ ]),
+]
+
+ENABLE_MOCK_LOCATION_SETTINGS = [
+ ('settings/secure', [
+ ('mock_location', 1),
+ ]),
+]
+
+DISABLE_MOCK_LOCATION_SETTINGS = [
+ ('settings/secure', [
+ ('mock_location', 0),
+ ]),
+]
+
+DETERMINISTIC_DEVICE_SETTINGS = [
+ ('settings/global', [
+ ('assisted_gps_enabled', 0),
+
+ # Disable "auto time" and "auto time zone" to avoid network-provided time
+ # to overwrite the device's datetime and timezone synchronized from host
+ # when running tests later. See b/6569849.
+ ('auto_time', 0),
+ ('auto_time_zone', 0),
+
+ ('development_settings_enabled', 1),
+
+ # Flag for allowing ActivityManagerService to send ACTION_APP_ERROR intents
+ # on application crashes and ANRs. If this is disabled, the crash/ANR dialog
+ # will never display the "Report" button.
+ # Type: int ( 0 = disallow, 1 = allow )
+ ('send_action_app_error', 0),
+
+ ('stay_on_while_plugged_in', 3),
+
+ ('verifier_verify_adb_installs', 0),
+ ]),
+ ('settings/secure', [
+ ('allowed_geolocation_origins',
+ 'http://www.google.co.uk http://www.google.com'),
+
+ # Ensure that we never get random dialogs like "Unfortunately the process
+ # android.process.acore has stopped", which steal the focus, and make our
+ # automation fail (because the dialog steals the focus then mistakenly
+ # receives the injected user input events).
+ ('anr_show_background', 0),
+
+ ('lockscreen.disabled', 1),
+
+ ('screensaver_enabled', 0),
+
+ ('skip_first_use_hints', 1),
+ ]),
+ ('settings/system', [
+ # Don't want devices to accidentally rotate the screen as that could
+ # affect performance measurements.
+ ('accelerometer_rotation', 0),
+
+ ('lockscreen.disabled', 1),
+
+ # Turn down brightness and disable auto-adjust so that devices run cooler.
+ ('screen_brightness', 5),
+ ('screen_brightness_mode', 0),
+
+ ('user_rotation', 0),
+ ]),
+]
+
+NETWORK_DISABLED_SETTINGS = [
+ ('settings/global', [
+ ('airplane_mode_on', 1),
+ ('wifi_on', 0),
+ ]),
+]
+
+
+class ContentSettings(dict):
+
+ """A dict interface to interact with device content settings.
+
+ System properties are key/value pairs as exposed by adb shell content.
+ """
+
+ def __init__(self, table, device):
+ super(ContentSettings, self).__init__()
+ self._table = table
+ self._device = device
+
+ @staticmethod
+ def _GetTypeBinding(value):
+ if isinstance(value, bool):
+ return 'b'
+ if isinstance(value, float):
+ return 'f'
+ if isinstance(value, int):
+ return 'i'
+ if isinstance(value, long):
+ return 'l'
+ if isinstance(value, str):
+ return 's'
+ raise ValueError('Unsupported type %s' % type(value))
+
+ def iteritems(self):
+ for row in self._device.RunShellCommand(
+ ['content', 'query', '--uri', 'content://%s' % self._table],
+ check_return=True, as_root=True):
+ key, value = _ParseContentRow(row)
+ if not key:
+ continue
+ yield key, value
+
+ def __getitem__(self, key):
+ query_row = self._device.RunShellCommand(
+ ['content', 'query', '--uri', 'content://%s' % self._table,
+ '--where', "name='%s'" % key],
+ check_return=True, as_root=True, single_line=True)
+ parsed_key, parsed_value = _ParseContentRow(query_row)
+ if parsed_key is None:
+ raise KeyError('key=%s not found' % key)
+ if parsed_key != key:
+ raise KeyError('Expected key=%s, but got key=%s' % (key, parsed_key))
+ return parsed_value
+
+ def __setitem__(self, key, value):
+ if key in self:
+ self._device.RunShellCommand(
+ ['content', 'update', '--uri', 'content://%s' % self._table,
+ '--bind', 'value:%s:%s' % (self._GetTypeBinding(value), value),
+ '--where', "name='%s'" % key],
+ check_return=True, as_root=True)
+ else:
+ self._device.RunShellCommand(
+ ['content', 'insert', '--uri', 'content://%s' % self._table,
+ '--bind', 'name:%s:%s' % (self._GetTypeBinding(key), key),
+ '--bind', 'value:%s:%s' % (self._GetTypeBinding(value), value)],
+ check_return=True, as_root=True)
+
+ def __delitem__(self, key):
+ self._device.RunShellCommand(
+ ['content', 'delete', '--uri', 'content://%s' % self._table,
+ '--bind', 'name:%s:%s' % (self._GetTypeBinding(key), key)],
+ check_return=True, as_root=True)
+
+
+def ConfigureContentSettings(device, desired_settings):
+ """Configures device content setings from a list.
+
+ Many settings are documented at:
+ http://developer.android.com/reference/android/provider/Settings.Global.html
+ http://developer.android.com/reference/android/provider/Settings.Secure.html
+ http://developer.android.com/reference/android/provider/Settings.System.html
+
+ Many others are undocumented.
+
+ Args:
+ device: A DeviceUtils instance for the device to configure.
+ desired_settings: A list of (table, [(key: value), ...]) for all
+ settings to configure.
+ """
+ for table, key_value in desired_settings:
+ settings = ContentSettings(table, device)
+ for key, value in key_value:
+ settings[key] = value
+ logger.info('\n%s %s', table, (80 - len(table)) * '-')
+ for key, value in sorted(settings.iteritems()):
+ logger.info('\t%s: %s', key, value)
+
+
+def SetLockScreenSettings(device):
+ """Sets lock screen settings on the device.
+
+ On certain device/Android configurations we need to disable the lock screen in
+ a different database. Additionally, the password type must be set to
+ DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED.
+ Lock screen settings are stored in sqlite on the device in:
+ /data/system/locksettings.db
+
+ IMPORTANT: The first column is used as a primary key so that all rows with the
+ same value for that column are removed from the table prior to inserting the
+ new values.
+
+ Args:
+ device: A DeviceUtils instance for the device to configure.
+
+ Raises:
+ Exception if the setting was not properly set.
+ """
+ if device.build_type not in _COMPATIBLE_BUILD_TYPES:
+ logger.warning('Unable to disable lockscreen on %s builds.',
+ device.build_type)
+ return
+
+ def get_lock_settings(table):
+ return [(table, 'lockscreen.disabled', '1'),
+ (table, 'lockscreen.password_type', PASSWORD_QUALITY_UNSPECIFIED),
+ (table, 'lockscreen.password_type_alternate',
+ PASSWORD_QUALITY_UNSPECIFIED)]
+
+ if device.FileExists(_LOCK_SCREEN_SETTINGS_PATH):
+ db = _LOCK_SCREEN_SETTINGS_PATH
+ locksettings = get_lock_settings('locksettings')
+ columns = ['name', 'user', 'value']
+ generate_values = lambda k, v: [k, '0', v]
+ elif device.FileExists(_ALTERNATE_LOCK_SCREEN_SETTINGS_PATH):
+ db = _ALTERNATE_LOCK_SCREEN_SETTINGS_PATH
+ locksettings = get_lock_settings('secure') + get_lock_settings('system')
+ columns = ['name', 'value']
+ generate_values = lambda k, v: [k, v]
+ else:
+ logger.warning('Unable to find database file to set lock screen settings.')
+ return
+
+ for table, key, value in locksettings:
+ # Set the lockscreen setting for default user '0'
+ values = generate_values(key, value)
+
+ cmd = """begin transaction;
+delete from '%(table)s' where %(primary_key)s='%(primary_value)s';
+insert into '%(table)s' (%(columns)s) values (%(values)s);
+commit transaction;""" % {
+ 'table': table,
+ 'primary_key': columns[0],
+ 'primary_value': values[0],
+ 'columns': ', '.join(columns),
+ 'values': ', '.join(["'%s'" % value for value in values])
+ }
+ output_msg = device.RunShellCommand(
+ ['sqlite3', db, cmd], check_return=True, as_root=True)
+ if output_msg:
+ logger.info(' '.join(output_msg))
+
+
+def _ParseContentRow(row):
+ """Parse key, value entries from a row string."""
+ # Example row:
+ # 'Row: 0 _id=13, name=logging_id2, value=-1fccbaa546705b05'
+ fields = row.split(', ')
+ key = None
+ value = ''
+ for field in fields:
+ k, _, v = field.partition('=')
+ if k == 'name':
+ key = v
+ elif k == 'value':
+ value = v
+ return key, value
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/__init__.py
new file mode 100644
index 0000000..50b23df
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/__init__.py
@@ -0,0 +1,3 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/adb_run_shell_cmd.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/adb_run_shell_cmd.py
new file mode 100644
index 0000000..77b67e8
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/adb_run_shell_cmd.py
@@ -0,0 +1,61 @@
+#!/usr/bin/env python
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import argparse
+import json
+import os
+import sys
+
+if __name__ == '__main__':
+ sys.path.append(
+ os.path.abspath(os.path.join(os.path.dirname(__file__),
+ '..', '..', '..')))
+
+from devil.android import device_blacklist
+from devil.android import device_utils
+from devil.utils import run_tests_helper
+
+
+def main():
+ parser = argparse.ArgumentParser(
+ 'Run an adb shell command on selected devices')
+ parser.add_argument('cmd', help='Adb shell command to run.', nargs="+")
+ parser.add_argument('-d', '--device', action='append', dest='devices',
+ default=[],
+ help='Device to run cmd on. Runs on all devices if not '
+ 'specified. Set multiple times for multiple devices')
+ parser.add_argument('-v', '--verbose', default=0, action='count',
+ help='Verbose level (multiple times for more)')
+ parser.add_argument('--blacklist-file', help='Device blacklist file.')
+ parser.add_argument('--as-root', action='store_true', help='Run as root.')
+ parser.add_argument('--json-output',
+ help='File to dump json output to.')
+ args = parser.parse_args()
+ run_tests_helper.SetLogLevel(args.verbose)
+
+ args.blacklist_file = device_blacklist.Blacklist(
+ args.blacklist_file) if args.blacklist_file else None
+ devices = device_utils.DeviceUtils.HealthyDevices(
+ blacklist=args.blacklist_file, device_arg=args.devices)
+
+ p_out = (device_utils.DeviceUtils.parallel(devices).RunShellCommand(
+ args.cmd, large_output=True, as_root=args.as_root, check_return=True)
+ .pGet(None))
+
+ data = {}
+ for device, output in zip(devices, p_out):
+ for line in output:
+ print '%s: %s' % (device, line)
+ data[str(device)] = output
+
+ if args.json_output:
+ with open(args.json_output, 'w') as f:
+ json.dump(data, f)
+
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/cpufreq.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/cpufreq.py
new file mode 100644
index 0000000..97deaf0
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/cpufreq.py
@@ -0,0 +1,87 @@
+#! /usr/bin/env python
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""A script to manipulate device CPU frequency."""
+
+import argparse
+import os
+import pprint
+import sys
+
+if __name__ == '__main__':
+ sys.path.append(
+ os.path.abspath(os.path.join(os.path.dirname(__file__),
+ '..', '..', '..')))
+
+from devil import devil_env
+from devil.android import device_utils
+from devil.android.perf import perf_control
+from devil.utils import run_tests_helper
+
+
+def SetScalingGovernor(device, args):
+ p = perf_control.PerfControl(device)
+ p.SetScalingGovernor(args.governor)
+
+
+def GetScalingGovernor(device, _args):
+ p = perf_control.PerfControl(device)
+ for cpu, governor in p.GetScalingGovernor():
+ print '%s %s: %s' % (str(device), cpu, governor)
+
+
+def ListAvailableGovernors(device, _args):
+ p = perf_control.PerfControl(device)
+ for cpu, governors in p.ListAvailableGovernors():
+ print '%s %s: %s' % (str(device), cpu, pprint.pformat(governors))
+
+
+def main(raw_args):
+ parser = argparse.ArgumentParser()
+ parser.add_argument(
+ '--adb-path',
+ help='ADB binary path.')
+ parser.add_argument(
+ '--device', dest='devices', action='append', default=[],
+ help='Devices for which the governor should be set. Defaults to all.')
+ parser.add_argument(
+ '-v', '--verbose', action='count',
+ help='Log more.')
+
+ subparsers = parser.add_subparsers()
+
+ set_governor = subparsers.add_parser('set-governor')
+ set_governor.add_argument(
+ 'governor',
+ help='Desired CPU governor.')
+ set_governor.set_defaults(func=SetScalingGovernor)
+
+ get_governor = subparsers.add_parser('get-governor')
+ get_governor.set_defaults(func=GetScalingGovernor)
+
+ list_governors = subparsers.add_parser('list-governors')
+ list_governors.set_defaults(func=ListAvailableGovernors)
+
+ args = parser.parse_args(raw_args)
+
+ run_tests_helper.SetLogLevel(args.verbose)
+
+ devil_dynamic_config = devil_env.EmptyConfig()
+ if args.adb_path:
+ devil_dynamic_config['dependencies'].update(
+ devil_env.LocalConfigItem(
+ 'adb', devil_env.GetPlatform(), args.adb_path))
+ devil_env.config.Initialize(configs=[devil_dynamic_config])
+
+ devices = device_utils.DeviceUtils.HealthyDevices(device_arg=args.devices)
+
+ parallel_devices = device_utils.DeviceUtils.parallel(devices)
+ parallel_devices.pMap(args.func, args)
+
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv[1:]))
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/device_monitor.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/device_monitor.py
new file mode 100644
index 0000000..d0f7521
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/device_monitor.py
@@ -0,0 +1,232 @@
+#!/usr/bin/env python
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Launches a daemon to monitor android device temperatures & status.
+
+This script will repeatedly poll the given devices for their temperatures and
+status every 60 seconds and dump the stats to file on the host.
+"""
+
+import argparse
+import collections
+import json
+import logging
+import logging.handlers
+import os
+import re
+import socket
+import sys
+import time
+
+if __name__ == '__main__':
+ sys.path.append(
+ os.path.abspath(os.path.join(os.path.dirname(__file__),
+ '..', '..', '..')))
+
+from devil import devil_env
+from devil.android import battery_utils
+from devil.android import device_blacklist
+from devil.android import device_errors
+from devil.android import device_utils
+
+
+# Various names of sensors used to measure cpu temp
+CPU_TEMP_SENSORS = [
+ # most nexus devices
+ 'tsens_tz_sensor0',
+ # android one
+ 'mtktscpu',
+ # nexus 9
+ 'CPU-therm',
+]
+
+DEVICE_FILE_VERSION = 1
+DEVICE_FILE = os.path.join(
+ os.path.expanduser('~'), '.android',
+ '%s__android_device_status.json' % socket.gethostname().split('.')[0])
+
+MEM_INFO_REGEX = re.compile(r'.*?\:\s*(\d+)\s*kB') # ex: 'MemTotal: 185735 kB'
+
+
+def get_device_status_unsafe(device):
+ """Polls the given device for various info.
+
+ Returns: A dict of the following format:
+ {
+ 'battery': {
+ 'level': 100,
+ 'temperature': 123
+ },
+ 'build': {
+ 'build.id': 'ABC12D',
+ 'product.device': 'chickenofthesea'
+ },
+ 'mem': {
+ 'avail': 1000000,
+ 'total': 1234567,
+ },
+ 'processes': 123,
+ 'state': 'good',
+ 'temp': {
+ 'some_sensor': 30
+ },
+ 'uptime': 1234.56,
+ }
+ """
+ status = collections.defaultdict(dict)
+
+ # Battery
+ battery = battery_utils.BatteryUtils(device)
+ battery_info = battery.GetBatteryInfo()
+ try:
+ level = int(battery_info.get('level'))
+ except (KeyError, TypeError, ValueError):
+ level = None
+ if level and level >= 0 and level <= 100:
+ status['battery']['level'] = level
+ try:
+ temperature = int(battery_info.get('temperature'))
+ except (KeyError, TypeError, ValueError):
+ temperature = None
+ if temperature:
+ status['battery']['temperature'] = temperature
+
+ # Build
+ status['build']['build.id'] = device.build_id
+ status['build']['product.device'] = device.build_product
+
+ # Memory
+ mem_info = ''
+ try:
+ mem_info = device.ReadFile('/proc/meminfo')
+ except device_errors.AdbShellCommandFailedError:
+ logging.exception('Unable to read /proc/meminfo')
+ for line in mem_info.splitlines():
+ match = MEM_INFO_REGEX.match(line)
+ if match:
+ try:
+ value = int(match.group(1))
+ except ValueError:
+ continue
+ key = line.split(':')[0].strip()
+ if 'MemTotal' == key:
+ status['mem']['total'] = value
+ elif 'MemFree' == key:
+ status['mem']['free'] = value
+
+ # Process
+ try:
+ # TODO(catapult:#3215): Migrate to device.GetPids()
+ lines = device.RunShellCommand(['ps'], check_return=True)
+ status['processes'] = len(lines) - 1 # Ignore the header row.
+ except device_errors.AdbShellCommandFailedError:
+ logging.exception('Unable to count process list.')
+
+ # CPU Temps
+ # Find a thermal sensor that matches one in CPU_TEMP_SENSORS and read its
+ # temperature.
+ files = []
+ try:
+ files = device.RunShellCommand(
+ 'grep -lE "%s" /sys/class/thermal/thermal_zone*/type' % '|'.join(
+ CPU_TEMP_SENSORS), shell=True, check_return=True)
+ except device_errors.AdbShellCommandFailedError:
+ logging.exception('Unable to list thermal sensors.')
+ for f in files:
+ try:
+ sensor_name = device.ReadFile(f).strip()
+ temp = float(device.ReadFile(f[:-4] + 'temp').strip()) # s/type^/temp
+ status['temp'][sensor_name] = temp
+ except (device_errors.AdbShellCommandFailedError, ValueError):
+ logging.exception('Unable to read thermal sensor %s', f)
+
+ # Uptime
+ try:
+ uptimes = device.ReadFile('/proc/uptime').split()
+ status['uptime'] = float(uptimes[0]) # Take the first field (actual uptime)
+ except (device_errors.AdbShellCommandFailedError, ValueError):
+ logging.exception('Unable to read /proc/uptime')
+
+ status['state'] = 'available'
+ return status
+
+
+def get_device_status(device):
+ try:
+ status = get_device_status_unsafe(device)
+ except device_errors.DeviceUnreachableError:
+ status = {'state': 'offline'}
+ return status
+
+
+def get_all_status(blacklist):
+ status_dict = {
+ 'version': DEVICE_FILE_VERSION,
+ 'devices': {},
+ }
+
+ healthy_devices = device_utils.DeviceUtils.HealthyDevices(blacklist)
+ parallel_devices = device_utils.DeviceUtils.parallel(healthy_devices)
+ results = parallel_devices.pMap(get_device_status).pGet(None)
+
+ status_dict['devices'] = {
+ device.serial: result for device, result in zip(healthy_devices, results)
+ }
+
+ if blacklist:
+ for device, reason in blacklist.Read().iteritems():
+ status_dict['devices'][device] = {
+ 'state': reason.get('reason', 'blacklisted')}
+
+ status_dict['timestamp'] = time.time()
+ return status_dict
+
+
+def main(argv):
+ """Launches the device monitor.
+
+ Polls the devices for their battery and cpu temperatures and scans the
+ blacklist file every 60 seconds and dumps the data to DEVICE_FILE.
+ """
+
+ parser = argparse.ArgumentParser(
+ description='Launches the device monitor.')
+ parser.add_argument('--adb-path', help='Path to adb binary.')
+ parser.add_argument('--blacklist-file', help='Path to device blacklist file.')
+ args = parser.parse_args(argv)
+
+ logger = logging.getLogger()
+ logger.setLevel(logging.DEBUG)
+ handler = logging.handlers.RotatingFileHandler(
+ '/tmp/device_monitor.log', maxBytes=10 * 1024 * 1024, backupCount=5)
+ fmt = logging.Formatter('%(asctime)s %(levelname)s %(message)s',
+ datefmt='%y%m%d %H:%M:%S')
+ handler.setFormatter(fmt)
+ logger.addHandler(handler)
+
+ devil_dynamic_config = devil_env.EmptyConfig()
+ if args.adb_path:
+ devil_dynamic_config['dependencies'].update(
+ devil_env.LocalConfigItem(
+ 'adb', devil_env.GetPlatform(), args.adb_path))
+
+ devil_env.config.Initialize(configs=[devil_dynamic_config])
+
+ blacklist = (device_blacklist.Blacklist(args.blacklist_file)
+ if args.blacklist_file else None)
+
+ logging.info('Device monitor running with pid %d, adb: %s, blacklist: %s',
+ os.getpid(), args.adb_path, args.blacklist_file)
+ while True:
+ start = time.time()
+ status_dict = get_all_status(blacklist)
+ with open(DEVICE_FILE, 'wb') as f:
+ json.dump(status_dict, f, indent=2, sort_keys=True)
+ logging.info('Got status of all devices in %.2fs.', time.time() - start)
+ time.sleep(60)
+
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv[1:]))
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/device_monitor_test.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/device_monitor_test.py
new file mode 100644
index 0000000..e39e324
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/device_monitor_test.py
@@ -0,0 +1,168 @@
+#!/usr/bin/env python
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import sys
+import unittest
+
+if __name__ == '__main__':
+ sys.path.append(
+ os.path.abspath(os.path.join(os.path.dirname(__file__),
+ '..', '..', '..')))
+
+from devil import devil_env
+from devil.android import device_errors
+from devil.android import device_utils
+from devil.android.tools import device_monitor
+
+with devil_env.SysPath(devil_env.PYMOCK_PATH):
+ import mock # pylint: disable=import-error
+
+
+class DeviceMonitorTest(unittest.TestCase):
+
+ def setUp(self):
+ self.device = mock.Mock(spec=device_utils.DeviceUtils,
+ serial='device_cereal', build_id='abc123', build_product='clownfish')
+ self.file_contents = {
+ '/proc/meminfo': """
+ MemTotal: 1234567 kB
+ MemFree: 1000000 kB
+ MemUsed: 234567 kB
+ """,
+ '/sys/class/thermal/thermal_zone0/type': 'CPU-therm',
+ '/sys/class/thermal/thermal_zone0/temp': '30',
+ '/proc/uptime': '12345 99999',
+ }
+ self.device.ReadFile = mock.MagicMock(
+ side_effect=lambda file_name: self.file_contents[file_name])
+
+ self.cmd_outputs = {
+ 'ps': ['headers', 'p1', 'p2', 'p3', 'p4', 'p5'],
+ 'grep': ['/sys/class/thermal/thermal_zone0/type'],
+ }
+
+ def mock_run_shell(cmd, **_kwargs):
+ args = cmd.split() if isinstance(cmd, basestring) else cmd
+ try:
+ return self.cmd_outputs[args[0]]
+ except KeyError:
+ raise device_errors.AdbShellCommandFailedError(cmd, None, None)
+
+ self.device.RunShellCommand = mock.MagicMock(side_effect=mock_run_shell)
+
+ self.battery = mock.Mock()
+ self.battery.GetBatteryInfo = mock.MagicMock(
+ return_value={'level': '80', 'temperature': '123'})
+
+ self.expected_status = {
+ 'device_cereal': {
+ 'processes': 5,
+ 'temp': {
+ 'CPU-therm': 30.0
+ },
+ 'battery': {
+ 'temperature': 123,
+ 'level': 80
+ },
+ 'uptime': 12345.0,
+ 'mem': {
+ 'total': 1234567,
+ 'free': 1000000
+ },
+ 'build': {
+ 'build.id': 'abc123',
+ 'product.device': 'clownfish',
+ },
+ 'state': 'available',
+ }
+ }
+
+ @mock.patch('devil.android.battery_utils.BatteryUtils')
+ @mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices')
+ def test_getStats(self, get_devices, get_battery):
+ get_devices.return_value = [self.device]
+ get_battery.return_value = self.battery
+
+ status = device_monitor.get_all_status(None)
+ self.assertEquals(self.expected_status, status['devices'])
+
+ @mock.patch('devil.android.battery_utils.BatteryUtils')
+ @mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices')
+ def test_getStatsNoBattery(self, get_devices, get_battery):
+ get_devices.return_value = [self.device]
+ get_battery.return_value = self.battery
+ broken_battery_info = mock.Mock()
+ broken_battery_info.GetBatteryInfo = mock.MagicMock(
+ return_value={'level': '-1', 'temperature': 'not_a_number'})
+ get_battery.return_value = broken_battery_info
+
+ # Should be same status dict but without battery stats.
+ expected_status_no_battery = self.expected_status.copy()
+ expected_status_no_battery['device_cereal'].pop('battery')
+
+ status = device_monitor.get_all_status(None)
+ self.assertEquals(expected_status_no_battery, status['devices'])
+
+ @mock.patch('devil.android.battery_utils.BatteryUtils')
+ @mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices')
+ def test_getStatsNoPs(self, get_devices, get_battery):
+ get_devices.return_value = [self.device]
+ get_battery.return_value = self.battery
+ del self.cmd_outputs['ps'] # Throw exception on run shell ps command.
+
+ # Should be same status dict but without process stats.
+ expected_status_no_ps = self.expected_status.copy()
+ expected_status_no_ps['device_cereal'].pop('processes')
+
+ status = device_monitor.get_all_status(None)
+ self.assertEquals(expected_status_no_ps, status['devices'])
+
+ @mock.patch('devil.android.battery_utils.BatteryUtils')
+ @mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices')
+ def test_getStatsNoSensors(self, get_devices, get_battery):
+ get_devices.return_value = [self.device]
+ get_battery.return_value = self.battery
+ del self.cmd_outputs['grep'] # Throw exception on run shell grep command.
+
+ # Should be same status dict but without temp stats.
+ expected_status_no_temp = self.expected_status.copy()
+ expected_status_no_temp['device_cereal'].pop('temp')
+
+ status = device_monitor.get_all_status(None)
+ self.assertEquals(expected_status_no_temp, status['devices'])
+
+ @mock.patch('devil.android.battery_utils.BatteryUtils')
+ @mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices')
+ def test_getStatsWithBlacklist(self, get_devices, get_battery):
+ get_devices.return_value = [self.device]
+ get_battery.return_value = self.battery
+ blacklist = mock.Mock()
+ blacklist.Read = mock.MagicMock(
+ return_value={'bad_device': {'reason': 'offline'}})
+
+ # Should be same status dict but with extra blacklisted device.
+ expected_status = self.expected_status.copy()
+ expected_status['bad_device'] = {'state': 'offline'}
+
+ status = device_monitor.get_all_status(blacklist)
+ self.assertEquals(expected_status, status['devices'])
+
+ @mock.patch('devil.android.battery_utils.BatteryUtils')
+ @mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices')
+ def test_brokenTempValue(self, get_devices, get_battery):
+ self.file_contents['/sys/class/thermal/thermal_zone0/temp'] = 'n0t a numb3r'
+ get_devices.return_value = [self.device]
+ get_battery.return_value = self.battery
+
+ expected_status_no_temp = self.expected_status.copy()
+ expected_status_no_temp['device_cereal'].pop('temp')
+
+ status = device_monitor.get_all_status(None)
+ self.assertEquals(self.expected_status, status['devices'])
+
+
+if __name__ == '__main__':
+ sys.exit(unittest.main())
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/device_recovery.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/device_recovery.py
new file mode 100644
index 0000000..80c78d2
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/device_recovery.py
@@ -0,0 +1,211 @@
+#!/usr/bin/env python
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""A script to recover devices in a known bad state."""
+
+import argparse
+import logging
+import os
+import psutil
+import signal
+import sys
+
+if __name__ == '__main__':
+ sys.path.append(
+ os.path.abspath(os.path.join(os.path.dirname(__file__),
+ '..', '..', '..')))
+from devil import devil_env
+from devil.android import device_blacklist
+from devil.android import device_errors
+from devil.android import device_utils
+from devil.android.tools import device_status
+from devil.utils import lsusb
+# TODO(jbudorick): Resolve this after experimenting w/ disabling the USB reset.
+from devil.utils import reset_usb # pylint: disable=unused-import
+from devil.utils import run_tests_helper
+
+logger = logging.getLogger(__name__)
+
+
+def KillAllAdb():
+ def get_all_adb():
+ for p in psutil.process_iter():
+ try:
+ if 'adb' in p.name:
+ yield p
+ except (psutil.NoSuchProcess, psutil.AccessDenied):
+ pass
+
+ for sig in [signal.SIGTERM, signal.SIGQUIT, signal.SIGKILL]:
+ for p in get_all_adb():
+ try:
+ logger.info('kill %d %d (%s [%s])', sig, p.pid, p.name,
+ ' '.join(p.cmdline))
+ p.send_signal(sig)
+ except (psutil.NoSuchProcess, psutil.AccessDenied):
+ pass
+ for p in get_all_adb():
+ try:
+ logger.error('Unable to kill %d (%s [%s])', p.pid, p.name,
+ ' '.join(p.cmdline))
+ except (psutil.NoSuchProcess, psutil.AccessDenied):
+ pass
+
+
+def RecoverDevice(device, blacklist, should_reboot=lambda device: True):
+ if device_status.IsBlacklisted(device.adb.GetDeviceSerial(),
+ blacklist):
+ logger.debug('%s is blacklisted, skipping recovery.', str(device))
+ return
+
+ if should_reboot(device):
+ try:
+ device.WaitUntilFullyBooted(retries=0)
+ except (device_errors.CommandTimeoutError,
+ device_errors.CommandFailedError,
+ device_errors.DeviceUnreachableError):
+ logger.exception('Failure while waiting for %s. '
+ 'Attempting to recover.', str(device))
+ try:
+ try:
+ device.Reboot(block=False, timeout=5, retries=0)
+ except device_errors.CommandTimeoutError:
+ logger.warning('Timed out while attempting to reboot %s normally.'
+ 'Attempting alternative reboot.', str(device))
+ # The device drops offline before we can grab the exit code, so
+ # we don't check for status.
+ try:
+ device.adb.Root()
+ finally:
+ # We are already in a failure mode, attempt to reboot regardless of
+ # what device.adb.Root() returns. If the sysrq reboot fails an
+ # exception willbe thrown at that level.
+ device.adb.Shell('echo b > /proc/sysrq-trigger', expect_status=None,
+ timeout=5, retries=0)
+ except (device_errors.CommandFailedError,
+ device_errors.DeviceUnreachableError):
+ logger.exception('Failed to reboot %s.', str(device))
+ if blacklist:
+ blacklist.Extend([device.adb.GetDeviceSerial()],
+ reason='reboot_failure')
+ except device_errors.CommandTimeoutError:
+ logger.exception('Timed out while rebooting %s.', str(device))
+ if blacklist:
+ blacklist.Extend([device.adb.GetDeviceSerial()],
+ reason='reboot_timeout')
+
+ try:
+ device.WaitUntilFullyBooted(
+ retries=0, timeout=device.REBOOT_DEFAULT_TIMEOUT)
+ except (device_errors.CommandFailedError,
+ device_errors.DeviceUnreachableError):
+ logger.exception('Failure while waiting for %s.', str(device))
+ if blacklist:
+ blacklist.Extend([device.adb.GetDeviceSerial()],
+ reason='reboot_failure')
+ except device_errors.CommandTimeoutError:
+ logger.exception('Timed out while waiting for %s.', str(device))
+ if blacklist:
+ blacklist.Extend([device.adb.GetDeviceSerial()],
+ reason='reboot_timeout')
+
+
+def RecoverDevices(devices, blacklist, enable_usb_reset=False):
+ """Attempts to recover any inoperable devices in the provided list.
+
+ Args:
+ devices: The list of devices to attempt to recover.
+ blacklist: The current device blacklist, which will be used then
+ reset.
+ """
+
+ statuses = device_status.DeviceStatus(devices, blacklist)
+
+ should_restart_usb = set(
+ status['serial'] for status in statuses
+ if (not status['usb_status']
+ or status['adb_status'] in ('offline', 'missing')))
+ should_restart_adb = should_restart_usb.union(set(
+ status['serial'] for status in statuses
+ if status['adb_status'] == 'unauthorized'))
+ should_reboot_device = should_restart_adb.union(set(
+ status['serial'] for status in statuses
+ if status['blacklisted']))
+
+ logger.debug('Should restart USB for:')
+ for d in should_restart_usb:
+ logger.debug(' %s', d)
+ logger.debug('Should restart ADB for:')
+ for d in should_restart_adb:
+ logger.debug(' %s', d)
+ logger.debug('Should reboot:')
+ for d in should_reboot_device:
+ logger.debug(' %s', d)
+
+ if blacklist:
+ blacklist.Reset()
+
+ if should_restart_adb:
+ KillAllAdb()
+ for serial in should_restart_usb:
+ try:
+ # TODO(crbug.com/642194): Resetting may be causing more harm
+ # (specifically, kernel panics) than it does good.
+ if enable_usb_reset:
+ reset_usb.reset_android_usb(serial)
+ else:
+ logger.warning('USB reset disabled for %s (crbug.com/642914)',
+ serial)
+ except IOError:
+ logger.exception('Unable to reset USB for %s.', serial)
+ if blacklist:
+ blacklist.Extend([serial], reason='USB failure')
+ except device_errors.DeviceUnreachableError:
+ logger.exception('Unable to reset USB for %s.', serial)
+ if blacklist:
+ blacklist.Extend([serial], reason='offline')
+
+ device_utils.DeviceUtils.parallel(devices).pMap(
+ RecoverDevice, blacklist,
+ should_reboot=lambda device: device.serial in should_reboot_device)
+
+
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument('--adb-path',
+ help='Absolute path to the adb binary to use.')
+ parser.add_argument('--blacklist-file', help='Device blacklist JSON file.')
+ parser.add_argument('--known-devices-file', action='append', default=[],
+ dest='known_devices_files',
+ help='Path to known device lists.')
+ parser.add_argument('--enable-usb-reset', action='store_true',
+ help='Reset USB if necessary.')
+ parser.add_argument('-v', '--verbose', action='count', default=1,
+ help='Log more information.')
+
+ args = parser.parse_args()
+ run_tests_helper.SetLogLevel(args.verbose)
+
+ devil_dynamic_config = devil_env.EmptyConfig()
+ if args.adb_path:
+ devil_dynamic_config['dependencies'].update(
+ devil_env.LocalConfigItem(
+ 'adb', devil_env.GetPlatform(), args.adb_path))
+ devil_env.config.Initialize(configs=[devil_dynamic_config])
+
+ blacklist = (device_blacklist.Blacklist(args.blacklist_file)
+ if args.blacklist_file
+ else None)
+
+ expected_devices = device_status.GetExpectedDevices(args.known_devices_files)
+ usb_devices = set(lsusb.get_android_devices())
+ devices = [device_utils.DeviceUtils(s)
+ for s in expected_devices.union(usb_devices)]
+
+ RecoverDevices(devices, blacklist, enable_usb_reset=args.enable_usb_reset)
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/device_status.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/device_status.py
new file mode 100644
index 0000000..159c6c5
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/device_status.py
@@ -0,0 +1,316 @@
+#!/usr/bin/env python
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""A script to keep track of devices across builds and report state."""
+
+import argparse
+import json
+import logging
+import os
+import re
+import sys
+
+if __name__ == '__main__':
+ sys.path.append(
+ os.path.abspath(os.path.join(os.path.dirname(__file__),
+ '..', '..', '..')))
+from devil import devil_env
+from devil.android import battery_utils
+from devil.android import device_blacklist
+from devil.android import device_errors
+from devil.android import device_list
+from devil.android import device_utils
+from devil.android.sdk import adb_wrapper
+from devil.constants import exit_codes
+from devil.utils import lsusb
+from devil.utils import run_tests_helper
+
+logger = logging.getLogger(__name__)
+
+_RE_DEVICE_ID = re.compile(r'Device ID = (\d+)')
+
+
+def IsBlacklisted(serial, blacklist):
+ return blacklist and serial in blacklist.Read()
+
+
+def _BatteryStatus(device, blacklist):
+ battery_info = {}
+ try:
+ battery = battery_utils.BatteryUtils(device)
+ battery_info = battery.GetBatteryInfo(timeout=5)
+ battery_level = int(battery_info.get('level', 100))
+
+ if battery_level < 15:
+ logger.error('Critically low battery level (%d)', battery_level)
+ battery = battery_utils.BatteryUtils(device)
+ if not battery.GetCharging():
+ battery.SetCharging(True)
+ if blacklist:
+ blacklist.Extend([device.adb.GetDeviceSerial()], reason='low_battery')
+
+ except (device_errors.CommandFailedError,
+ device_errors.DeviceUnreachableError):
+ logger.exception('Failed to get battery information for %s',
+ str(device))
+
+ return battery_info
+
+
+def _IMEISlice(device):
+ imei_slice = ''
+ try:
+ for l in device.RunShellCommand(['dumpsys', 'iphonesubinfo'],
+ check_return=True, timeout=5):
+ m = _RE_DEVICE_ID.match(l)
+ if m:
+ imei_slice = m.group(1)[-6:]
+ except (device_errors.CommandFailedError,
+ device_errors.DeviceUnreachableError):
+ logger.exception('Failed to get IMEI slice for %s', str(device))
+
+ return imei_slice
+
+
+def DeviceStatus(devices, blacklist):
+ """Generates status information for the given devices.
+
+ Args:
+ devices: The devices to generate status for.
+ blacklist: The current device blacklist.
+ Returns:
+ A dict of the following form:
+ {
+ '<serial>': {
+ 'serial': '<serial>',
+ 'adb_status': str,
+ 'usb_status': bool,
+ 'blacklisted': bool,
+ # only if the device is connected and not blacklisted
+ 'type': ro.build.product,
+ 'build': ro.build.id,
+ 'build_detail': ro.build.fingerprint,
+ 'battery': {
+ ...
+ },
+ 'imei_slice': str,
+ 'wifi_ip': str,
+ },
+ ...
+ }
+ """
+ adb_devices = {
+ a[0].GetDeviceSerial(): a
+ for a in adb_wrapper.AdbWrapper.Devices(desired_state=None, long_list=True)
+ }
+ usb_devices = set(lsusb.get_android_devices())
+
+ def blacklisting_device_status(device):
+ serial = device.adb.GetDeviceSerial()
+ adb_status = (
+ adb_devices[serial][1] if serial in adb_devices
+ else 'missing')
+ usb_status = bool(serial in usb_devices)
+
+ device_status = {
+ 'serial': serial,
+ 'adb_status': adb_status,
+ 'usb_status': usb_status,
+ }
+
+ if not IsBlacklisted(serial, blacklist):
+ if adb_status == 'device':
+ try:
+ build_product = device.build_product
+ build_id = device.build_id
+ build_fingerprint = device.build_fingerprint
+ build_description = device.build_description
+ wifi_ip = device.GetProp('dhcp.wlan0.ipaddress')
+ battery_info = _BatteryStatus(device, blacklist)
+ imei_slice = _IMEISlice(device)
+
+ if (device.product_name == 'mantaray' and
+ battery_info.get('AC powered', None) != 'true'):
+ logger.error('Mantaray device not connected to AC power.')
+
+ device_status.update({
+ 'ro.build.product': build_product,
+ 'ro.build.id': build_id,
+ 'ro.build.fingerprint': build_fingerprint,
+ 'ro.build.description': build_description,
+ 'battery': battery_info,
+ 'imei_slice': imei_slice,
+ 'wifi_ip': wifi_ip,
+ })
+
+ except (device_errors.CommandFailedError,
+ device_errors.DeviceUnreachableError):
+ logger.exception('Failure while getting device status for %s.',
+ str(device))
+ if blacklist:
+ blacklist.Extend([serial], reason='status_check_failure')
+
+ except device_errors.CommandTimeoutError:
+ logger.exception('Timeout while getting device status for %s.',
+ str(device))
+ if blacklist:
+ blacklist.Extend([serial], reason='status_check_timeout')
+
+ elif blacklist:
+ blacklist.Extend([serial],
+ reason=adb_status if usb_status else 'offline')
+
+ device_status['blacklisted'] = IsBlacklisted(serial, blacklist)
+
+ return device_status
+
+ parallel_devices = device_utils.DeviceUtils.parallel(devices)
+ statuses = parallel_devices.pMap(blacklisting_device_status).pGet(None)
+ return statuses
+
+
+def _LogStatuses(statuses):
+ # Log the state of all devices.
+ for status in statuses:
+ logger.info(status['serial'])
+ adb_status = status.get('adb_status')
+ blacklisted = status.get('blacklisted')
+ logger.info(' USB status: %s',
+ 'online' if status.get('usb_status') else 'offline')
+ logger.info(' ADB status: %s', adb_status)
+ logger.info(' Blacklisted: %s', str(blacklisted))
+ if adb_status == 'device' and not blacklisted:
+ logger.info(' Device type: %s', status.get('ro.build.product'))
+ logger.info(' OS build: %s', status.get('ro.build.id'))
+ logger.info(' OS build fingerprint: %s',
+ status.get('ro.build.fingerprint'))
+ logger.info(' Battery state:')
+ for k, v in status.get('battery', {}).iteritems():
+ logger.info(' %s: %s', k, v)
+ logger.info(' IMEI slice: %s', status.get('imei_slice'))
+ logger.info(' WiFi IP: %s', status.get('wifi_ip'))
+
+
+def _WriteBuildbotFile(file_path, statuses):
+ buildbot_path, _ = os.path.split(file_path)
+ if os.path.exists(buildbot_path):
+ with open(file_path, 'w') as f:
+ for status in statuses:
+ try:
+ if status['adb_status'] == 'device':
+ f.write('{serial} {adb_status} {build_product} {build_id} '
+ '{temperature:.1f}C {level}%\n'.format(
+ serial=status['serial'],
+ adb_status=status['adb_status'],
+ build_product=status['type'],
+ build_id=status['build'],
+ temperature=float(status['battery']['temperature']) / 10,
+ level=status['battery']['level']
+ ))
+ elif status.get('usb_status', False):
+ f.write('{serial} {adb_status}\n'.format(
+ serial=status['serial'],
+ adb_status=status['adb_status']
+ ))
+ else:
+ f.write('{serial} offline\n'.format(
+ serial=status['serial']
+ ))
+ except Exception: # pylint: disable=broad-except
+ pass
+
+
+def GetExpectedDevices(known_devices_files):
+ expected_devices = set()
+ try:
+ for path in known_devices_files:
+ if os.path.exists(path):
+ expected_devices.update(device_list.GetPersistentDeviceList(path))
+ else:
+ logger.warning('Could not find known devices file: %s', path)
+ except IOError:
+ logger.warning('Problem reading %s, skipping.', path)
+
+ logger.info('Expected devices:')
+ for device in expected_devices:
+ logger.info(' %s', device)
+ return expected_devices
+
+
+def AddArguments(parser):
+ parser.add_argument('--json-output',
+ help='Output JSON information into a specified file.')
+ parser.add_argument('--adb-path',
+ help='Absolute path to the adb binary to use.')
+ parser.add_argument('--blacklist-file', help='Device blacklist JSON file.')
+ parser.add_argument('--known-devices-file', action='append', default=[],
+ dest='known_devices_files',
+ help='Path to known device lists.')
+ parser.add_argument('--buildbot-path', '-b',
+ default='/home/chrome-bot/.adb_device_info',
+ help='Absolute path to buildbot file location')
+ parser.add_argument('-v', '--verbose', action='count', default=1,
+ help='Log more information.')
+ parser.add_argument('-w', '--overwrite-known-devices-files',
+ action='store_true',
+ help='If set, overwrites known devices files wiht new '
+ 'values.')
+
+def main():
+ parser = argparse.ArgumentParser()
+ AddArguments(parser)
+ args = parser.parse_args()
+
+ run_tests_helper.SetLogLevel(args.verbose)
+
+ devil_dynamic_config = devil_env.EmptyConfig()
+
+ if args.adb_path:
+ devil_dynamic_config['dependencies'].update(
+ devil_env.LocalConfigItem(
+ 'adb', devil_env.GetPlatform(), args.adb_path))
+ devil_env.config.Initialize(configs=[devil_dynamic_config])
+
+ blacklist = (device_blacklist.Blacklist(args.blacklist_file)
+ if args.blacklist_file
+ else None)
+
+ expected_devices = GetExpectedDevices(args.known_devices_files)
+ usb_devices = set(lsusb.get_android_devices())
+ devices = [device_utils.DeviceUtils(s)
+ for s in expected_devices.union(usb_devices)]
+
+ statuses = DeviceStatus(devices, blacklist)
+
+ # Log the state of all devices.
+ _LogStatuses(statuses)
+
+ # Update the last devices file(s).
+ if args.overwrite_known_devices_files:
+ for path in args.known_devices_files:
+ device_list.WritePersistentDeviceList(
+ path, [status['serial'] for status in statuses])
+
+ # Write device info to file for buildbot info display.
+ _WriteBuildbotFile(args.buildbot_path, statuses)
+
+ # Dump the device statuses to JSON.
+ if args.json_output:
+ with open(args.json_output, 'wb') as f:
+ f.write(json.dumps(
+ statuses, indent=4, sort_keys=True, separators=(',', ': ')))
+
+ live_devices = [status['serial'] for status in statuses
+ if (status['adb_status'] == 'device'
+ and not IsBlacklisted(status['serial'], blacklist))]
+
+ # If all devices failed, or if there are no devices, it's an infra error.
+ if not live_devices:
+ logger.error('No available devices.')
+ return 0 if live_devices else exit_codes.INFRA
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/flash_device.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/flash_device.py
new file mode 100644
index 0000000..d13c1df
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/flash_device.py
@@ -0,0 +1,70 @@
+#!/usr/bin/env python
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import argparse
+import logging
+import os
+import sys
+
+if __name__ == '__main__':
+ sys.path.append(os.path.abspath(os.path.join(
+ os.path.dirname(__file__), '..', '..', '..')))
+from devil.android import device_blacklist
+from devil.android import device_utils
+from devil.android import fastboot_utils
+from devil.android.tools import script_common
+from devil.constants import exit_codes
+from devil.utils import run_tests_helper
+
+logger = logging.getLogger(__name__)
+
+
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument('build_path', help='Path to android build.')
+ parser.add_argument('-d', '--device', dest='devices', action='append',
+ help='Device(s) to flash.')
+ parser.add_argument('-v', '--verbose', default=0, action='count',
+ help='Verbose level (multiple times for more)')
+ parser.add_argument('-w', '--wipe', action='store_true',
+ help='If set, wipes user data')
+ parser.add_argument('--blacklist-file', help='Device blacklist file.')
+ args = parser.parse_args()
+ run_tests_helper.SetLogLevel(args.verbose)
+
+ if args.blacklist_file:
+ blacklist = device_blacklist.Blacklist(args.blacklist_file).Read()
+ if blacklist:
+ logger.critical('Device(s) in blacklist, not flashing devices:')
+ for key in blacklist:
+ logger.critical(' %s', key)
+ return exit_codes.INFRA
+
+ flashed_devices = []
+ failed_devices = []
+
+ def flash(device):
+ fastboot = fastboot_utils.FastbootUtils(device)
+ try:
+ fastboot.FlashDevice(args.build_path, wipe=args.wipe)
+ flashed_devices.append(device)
+ except Exception: # pylint: disable=broad-except
+ logger.exception('Device %s failed to flash.', str(device))
+ failed_devices.append(device)
+
+ devices = script_common.GetDevices(args.devices, args.blacklist_file)
+ device_utils.DeviceUtils.parallel(devices).pMap(flash)
+
+ if flashed_devices:
+ logger.info('The following devices were flashed:')
+ logger.info(' %s', ' '.join(str(d) for d in flashed_devices))
+ if failed_devices:
+ logger.critical('The following devices failed to flash:')
+ logger.critical(' %s', ' '.join(str(d) for d in failed_devices))
+ return exit_codes.INFRA
+ return 0
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/keyboard.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/keyboard.py
new file mode 100644
index 0000000..31daf59
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/keyboard.py
@@ -0,0 +1,129 @@
+#!/usr/bin/env python
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Use your keyboard as your phone's keyboard. Experimental."""
+
+import argparse
+import copy
+import os
+import sys
+import termios
+import tty
+
+if __name__ == '__main__':
+ sys.path.append(
+ os.path.abspath(os.path.join(os.path.dirname(__file__),
+ '..', '..', '..')))
+from devil import base_error
+from devil.android.sdk import keyevent
+from devil.android.tools import script_common
+from devil.utils import run_tests_helper
+
+
+_KEY_MAPPING = {
+ '\x08': keyevent.KEYCODE_DEL,
+ '\x0a': keyevent.KEYCODE_ENTER,
+ ' ': keyevent.KEYCODE_SPACE,
+ '.': keyevent.KEYCODE_PERIOD,
+ '0': keyevent.KEYCODE_0,
+ '1': keyevent.KEYCODE_1,
+ '2': keyevent.KEYCODE_2,
+ '3': keyevent.KEYCODE_3,
+ '4': keyevent.KEYCODE_4,
+ '5': keyevent.KEYCODE_5,
+ '6': keyevent.KEYCODE_6,
+ '7': keyevent.KEYCODE_7,
+ '8': keyevent.KEYCODE_8,
+ '9': keyevent.KEYCODE_9,
+ 'a': keyevent.KEYCODE_A,
+ 'b': keyevent.KEYCODE_B,
+ 'c': keyevent.KEYCODE_C,
+ 'd': keyevent.KEYCODE_D,
+ 'e': keyevent.KEYCODE_E,
+ 'f': keyevent.KEYCODE_F,
+ 'g': keyevent.KEYCODE_G,
+ 'h': keyevent.KEYCODE_H,
+ 'i': keyevent.KEYCODE_I,
+ 'j': keyevent.KEYCODE_J,
+ 'k': keyevent.KEYCODE_K,
+ 'l': keyevent.KEYCODE_L,
+ 'm': keyevent.KEYCODE_M,
+ 'n': keyevent.KEYCODE_N,
+ 'o': keyevent.KEYCODE_O,
+ 'p': keyevent.KEYCODE_P,
+ 'q': keyevent.KEYCODE_Q,
+ 'r': keyevent.KEYCODE_R,
+ 's': keyevent.KEYCODE_S,
+ 't': keyevent.KEYCODE_T,
+ 'u': keyevent.KEYCODE_U,
+ 'v': keyevent.KEYCODE_V,
+ 'w': keyevent.KEYCODE_W,
+ 'x': keyevent.KEYCODE_X,
+ 'y': keyevent.KEYCODE_Y,
+ 'z': keyevent.KEYCODE_Z,
+ '\x7f': keyevent.KEYCODE_DEL,
+}
+
+
+def Keyboard(device, stream_itr):
+ try:
+ for c in stream_itr:
+ k = _KEY_MAPPING.get(c)
+ if k:
+ device.SendKeyEvent(k)
+ else:
+ print
+ print '(No mapping for character 0x%x)' % ord(c)
+ except KeyboardInterrupt:
+ pass
+
+
+def AddArguments(parser):
+ parser.add_argument('-d', '--device', action='append', dest='devices',
+ metavar='DEVICE', help='device serial')
+ parser.add_argument('-v', '--verbose', action='count', help='print more')
+
+
+class MultipleDevicesError(base_error.BaseError):
+ def __init__(self, devices):
+ super(MultipleDevicesError, self).__init__(
+ 'More than one device found: %s' % ', '.join(str(d) for d in devices))
+
+
+def main(raw_args):
+ parser = argparse.ArgumentParser(
+ description="Use your keyboard as your phone's keyboard.")
+ AddArguments(parser)
+ args = parser.parse_args(raw_args)
+
+ run_tests_helper.SetLogLevel(args.verbose)
+
+ devices = script_common.GetDevices(args.devices, None)
+ if len(devices) > 1:
+ raise MultipleDevicesError(devices)
+
+ def next_char():
+ while True:
+ yield sys.stdin.read(1)
+
+ try:
+ fd = sys.stdin.fileno()
+
+ # See man 3 termios for more info on what this is doing.
+ old_attrs = termios.tcgetattr(fd)
+ new_attrs = copy.deepcopy(old_attrs)
+ new_attrs[tty.LFLAG] = new_attrs[tty.LFLAG] & ~(termios.ICANON)
+ new_attrs[tty.CC][tty.VMIN] = 1
+ new_attrs[tty.CC][tty.VTIME] = 0
+ termios.tcsetattr(fd, termios.TCSAFLUSH, new_attrs)
+
+ Keyboard(devices[0], next_char())
+ finally:
+ termios.tcsetattr(fd, termios.TCSAFLUSH, old_attrs)
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv[1:]))
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/provision_devices.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/provision_devices.py
new file mode 100644
index 0000000..9359f11
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/provision_devices.py
@@ -0,0 +1,663 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Provisions Android devices with settings required for bots.
+
+Usage:
+ ./provision_devices.py [-d <device serial number>]
+"""
+
+import argparse
+import datetime
+import json
+import logging
+import os
+import posixpath
+import re
+import sys
+import time
+
+# Import _strptime before threaded code. datetime.datetime.strptime is
+# threadsafe except for the initial import of the _strptime module.
+# See crbug.com/584730 and https://bugs.python.org/issue7980.
+import _strptime # pylint: disable=unused-import
+
+if __name__ == '__main__':
+ sys.path.append(
+ os.path.abspath(os.path.join(os.path.dirname(__file__),
+ '..', '..', '..')))
+
+from devil import devil_env
+from devil.android import battery_utils
+from devil.android import device_blacklist
+from devil.android import device_errors
+from devil.android import device_temp_file
+from devil.android import device_utils
+from devil.android import settings
+from devil.android.sdk import adb_wrapper
+from devil.android.sdk import intent
+from devil.android.sdk import keyevent
+from devil.android.sdk import version_codes
+from devil.android.tools import script_common
+from devil.constants import exit_codes
+from devil.utils import run_tests_helper
+from devil.utils import timeout_retry
+
+logger = logging.getLogger(__name__)
+
+_SYSTEM_APP_DIRECTORIES = ['/system/app/', '/system/priv-app/']
+_SYSTEM_WEBVIEW_NAMES = ['webview', 'WebViewGoogle']
+_CHROME_PACKAGE_REGEX = re.compile('.*chrom.*')
+_TOMBSTONE_REGEX = re.compile('tombstone.*')
+
+
+class _DEFAULT_TIMEOUTS(object):
+ # L can take a while to reboot after a wipe.
+ LOLLIPOP = 600
+ PRE_LOLLIPOP = 180
+
+ HELP_TEXT = '{}s on L, {}s on pre-L'.format(LOLLIPOP, PRE_LOLLIPOP)
+
+
+class ProvisionStep(object):
+
+ def __init__(self, cmd, reboot=False):
+ self.cmd = cmd
+ self.reboot = reboot
+
+
+def ProvisionDevices(
+ devices,
+ blacklist_file,
+ adb_key_files=None,
+ disable_location=False,
+ disable_mock_location=False,
+ disable_network=False,
+ disable_system_chrome=False,
+ emulators=False,
+ enable_java_debug=False,
+ max_battery_temp=None,
+ min_battery_level=None,
+ output_device_blacklist=None,
+ reboot_timeout=None,
+ remove_system_webview=False,
+ system_app_remove_list=None,
+ system_package_remove_list=None,
+ wipe=True):
+ blacklist = (device_blacklist.Blacklist(blacklist_file)
+ if blacklist_file
+ else None)
+ system_app_remove_list = system_app_remove_list or []
+ system_package_remove_list = system_package_remove_list or []
+ try:
+ devices = script_common.GetDevices(devices, blacklist)
+ except device_errors.NoDevicesError:
+ logging.error('No available devices to provision.')
+ if blacklist:
+ logging.error('Local device blacklist: %s', blacklist.Read())
+ raise
+ devices = [d for d in devices
+ if not emulators or d.adb.is_emulator]
+ parallel_devices = device_utils.DeviceUtils.parallel(devices)
+
+ steps = []
+ if wipe:
+ steps += [ProvisionStep(lambda d: Wipe(d, adb_key_files), reboot=True)]
+ steps += [ProvisionStep(
+ lambda d: SetProperties(d, enable_java_debug, disable_location,
+ disable_mock_location),
+ reboot=not emulators)]
+
+ if disable_network:
+ steps.append(ProvisionStep(DisableNetwork))
+
+ if disable_system_chrome:
+ steps.append(ProvisionStep(DisableSystemChrome))
+
+ if max_battery_temp:
+ steps.append(ProvisionStep(
+ lambda d: WaitForBatteryTemperature(d, max_battery_temp)))
+
+ if min_battery_level:
+ steps.append(ProvisionStep(
+ lambda d: WaitForCharge(d, min_battery_level)))
+
+ if remove_system_webview:
+ system_app_remove_list.extend(_SYSTEM_WEBVIEW_NAMES)
+
+ if system_app_remove_list or system_package_remove_list:
+ steps.append(ProvisionStep(
+ lambda d: RemoveSystemApps(
+ d, system_app_remove_list, system_package_remove_list)))
+
+ steps.append(ProvisionStep(SetDate))
+ steps.append(ProvisionStep(CheckExternalStorage))
+
+ parallel_devices.pMap(ProvisionDevice, steps, blacklist, reboot_timeout)
+
+ blacklisted_devices = blacklist.Read() if blacklist else []
+ if output_device_blacklist:
+ with open(output_device_blacklist, 'w') as f:
+ json.dump(blacklisted_devices, f)
+ if all(d in blacklisted_devices for d in devices):
+ raise device_errors.NoDevicesError
+ return 0
+
+
+def ProvisionDevice(device, steps, blacklist, reboot_timeout=None):
+ try:
+ if not reboot_timeout:
+ if device.build_version_sdk >= version_codes.LOLLIPOP:
+ reboot_timeout = _DEFAULT_TIMEOUTS.LOLLIPOP
+ else:
+ reboot_timeout = _DEFAULT_TIMEOUTS.PRE_LOLLIPOP
+
+ for step in steps:
+ try:
+ device.WaitUntilFullyBooted(timeout=reboot_timeout, retries=0)
+ except device_errors.CommandTimeoutError:
+ logger.error('Device did not finish booting. Will try to reboot.')
+ device.Reboot(timeout=reboot_timeout)
+ step.cmd(device)
+ if step.reboot:
+ device.Reboot(False, retries=0)
+ device.adb.WaitForDevice()
+
+ except device_errors.CommandTimeoutError:
+ logger.exception('Timed out waiting for device %s. Adding to blacklist.',
+ str(device))
+ if blacklist:
+ blacklist.Extend([str(device)], reason='provision_timeout')
+
+ except (device_errors.CommandFailedError,
+ device_errors.DeviceUnreachableError):
+ logger.exception('Failed to provision device %s. Adding to blacklist.',
+ str(device))
+ if blacklist:
+ blacklist.Extend([str(device)], reason='provision_failure')
+
+
+def Wipe(device, adb_key_files=None):
+ if (device.IsUserBuild() or
+ device.build_version_sdk >= version_codes.MARSHMALLOW):
+ WipeChromeData(device)
+
+ package = 'com.google.android.gms'
+ if device.GetApplicationPaths(package):
+ version_name = device.GetApplicationVersion(package)
+ logger.info('Version name for %s is %s', package, version_name)
+ else:
+ logger.info('Package %s is not installed', package)
+ else:
+ WipeDevice(device, adb_key_files)
+
+
+def WipeChromeData(device):
+ """Wipes chrome specific data from device
+
+ (1) uninstall any app whose name matches *chrom*, except
+ com.android.chrome, which is the chrome stable package. Doing so also
+ removes the corresponding dirs under /data/data/ and /data/app/
+ (2) remove any dir under /data/app-lib/ whose name matches *chrom*
+ (3) remove any files under /data/tombstones/ whose name matches "tombstone*"
+ (4) remove /data/local.prop if there is any
+ (5) remove /data/local/chrome-command-line if there is any
+ (6) remove anything under /data/local/.config/ if the dir exists
+ (this is telemetry related)
+ (7) remove anything under /data/local/tmp/
+
+ Arguments:
+ device: the device to wipe
+ """
+ try:
+ if device.IsUserBuild():
+ _UninstallIfMatch(device, _CHROME_PACKAGE_REGEX)
+ device.RunShellCommand('rm -rf %s/*' % device.GetExternalStoragePath(),
+ shell=True, check_return=True)
+ device.RunShellCommand('rm -rf /data/local/tmp/*',
+ shell=True, check_return=True)
+ else:
+ device.EnableRoot()
+ _UninstallIfMatch(device, _CHROME_PACKAGE_REGEX)
+ _WipeUnderDirIfMatch(device, '/data/app-lib/', _CHROME_PACKAGE_REGEX)
+ _WipeUnderDirIfMatch(device, '/data/tombstones/', _TOMBSTONE_REGEX)
+
+ _WipeFileOrDir(device, '/data/local.prop')
+ _WipeFileOrDir(device, '/data/local/chrome-command-line')
+ _WipeFileOrDir(device, '/data/local/.config/')
+ _WipeFileOrDir(device, '/data/local/tmp/')
+ device.RunShellCommand('rm -rf %s/*' % device.GetExternalStoragePath(),
+ shell=True, check_return=True)
+ except device_errors.CommandFailedError:
+ logger.exception('Possible failure while wiping the device. '
+ 'Attempting to continue.')
+
+
+def _UninstallIfMatch(device, pattern):
+ installed_packages = device.RunShellCommand(
+ ['pm', 'list', 'packages'], check_return=True)
+ installed_system_packages = [
+ pkg.split(':')[1] for pkg in device.RunShellCommand(
+ ['pm', 'list', 'packages', '-s'], check_return=True)]
+ for package_output in installed_packages:
+ package = package_output.split(":")[1]
+ if pattern.match(package) and package not in installed_system_packages:
+ device.Uninstall(package)
+
+
+def _WipeUnderDirIfMatch(device, path, pattern):
+ for filename in device.ListDirectory(path):
+ if pattern.match(filename):
+ _WipeFileOrDir(device, posixpath.join(path, filename))
+
+
+def _WipeFileOrDir(device, path):
+ if device.PathExists(path):
+ device.RunShellCommand(['rm', '-rf', path], check_return=True)
+
+
+def WipeDevice(device, adb_key_files):
+ """Wipes data from device, keeping only the adb_keys for authorization.
+
+ After wiping data on a device that has been authorized, adb can still
+ communicate with the device, but after reboot the device will need to be
+ re-authorized because the adb keys file is stored in /data/misc/adb/.
+ Thus, adb_keys file is rewritten so the device does not need to be
+ re-authorized.
+
+ Arguments:
+ device: the device to wipe
+ """
+ try:
+ device.EnableRoot()
+ device_authorized = device.FileExists(adb_wrapper.ADB_KEYS_FILE)
+ if device_authorized:
+ adb_keys = device.ReadFile(adb_wrapper.ADB_KEYS_FILE,
+ as_root=True).splitlines()
+ device.RunShellCommand(['wipe', 'data'],
+ as_root=True, check_return=True)
+ device.adb.WaitForDevice()
+
+ if device_authorized:
+ adb_keys_set = set(adb_keys)
+ for adb_key_file in adb_key_files or []:
+ try:
+ with open(adb_key_file, 'r') as f:
+ adb_public_keys = f.readlines()
+ adb_keys_set.update(adb_public_keys)
+ except IOError:
+ logger.warning('Unable to find adb keys file %s.', adb_key_file)
+ _WriteAdbKeysFile(device, '\n'.join(adb_keys_set))
+ except device_errors.CommandFailedError:
+ logger.exception('Possible failure while wiping the device. '
+ 'Attempting to continue.')
+
+
+def _WriteAdbKeysFile(device, adb_keys_string):
+ dir_path = posixpath.dirname(adb_wrapper.ADB_KEYS_FILE)
+ device.RunShellCommand(['mkdir', '-p', dir_path],
+ as_root=True, check_return=True)
+ device.RunShellCommand(['restorecon', dir_path],
+ as_root=True, check_return=True)
+ device.WriteFile(adb_wrapper.ADB_KEYS_FILE, adb_keys_string, as_root=True)
+ device.RunShellCommand(['restorecon', adb_wrapper.ADB_KEYS_FILE],
+ as_root=True, check_return=True)
+
+
+def SetProperties(device, enable_java_debug, disable_location,
+ disable_mock_location):
+ try:
+ device.EnableRoot()
+ except device_errors.CommandFailedError as e:
+ logger.warning(str(e))
+
+ if not device.IsUserBuild():
+ _ConfigureLocalProperties(device, enable_java_debug)
+ else:
+ logger.warning('Cannot configure properties in user builds.')
+ settings.ConfigureContentSettings(
+ device, settings.DETERMINISTIC_DEVICE_SETTINGS)
+ if disable_location:
+ settings.ConfigureContentSettings(
+ device, settings.DISABLE_LOCATION_SETTINGS)
+ else:
+ settings.ConfigureContentSettings(
+ device, settings.ENABLE_LOCATION_SETTINGS)
+
+ if disable_mock_location:
+ settings.ConfigureContentSettings(
+ device, settings.DISABLE_MOCK_LOCATION_SETTINGS)
+ else:
+ settings.ConfigureContentSettings(
+ device, settings.ENABLE_MOCK_LOCATION_SETTINGS)
+
+ settings.SetLockScreenSettings(device)
+
+ # Some device types can momentarily disappear after setting properties.
+ device.adb.WaitForDevice()
+
+
+def DisableNetwork(device):
+ settings.ConfigureContentSettings(
+ device, settings.NETWORK_DISABLED_SETTINGS)
+ if device.build_version_sdk >= version_codes.MARSHMALLOW:
+ # Ensure that NFC is also switched off.
+ device.RunShellCommand(['svc', 'nfc', 'disable'],
+ as_root=True, check_return=True)
+
+
+def DisableSystemChrome(device):
+ # The system chrome version on the device interferes with some tests.
+ device.RunShellCommand(['pm', 'disable', 'com.android.chrome'],
+ as_root=True, check_return=True)
+
+
+def _FindSystemPackagePaths(device, system_package_list):
+ found_paths = []
+ for system_package in system_package_list:
+ found_paths.extend(device.GetApplicationPaths(system_package))
+ return [p for p in found_paths if p.startswith('/system/')]
+
+
+def _FindSystemAppPaths(device, system_app_list):
+ found_paths = []
+ for system_app in system_app_list:
+ for directory in _SYSTEM_APP_DIRECTORIES:
+ path = os.path.join(directory, system_app)
+ if device.PathExists(path):
+ found_paths.append(path)
+ return found_paths
+
+
+def RemoveSystemApps(
+ device, system_app_remove_list, system_package_remove_list):
+ """Attempts to remove the provided system apps from the given device.
+
+ Arguments:
+ device: The device to remove the system apps from.
+ system_app_remove_list: A list of app names to remove, e.g.
+ ['WebViewGoogle', 'GoogleVrCore']
+ system_package_remove_list: A list of app packages to remove, e.g.
+ ['com.google.android.webview']
+ """
+ device.EnableRoot()
+ if device.HasRoot():
+ system_app_paths = (
+ _FindSystemAppPaths(device, system_app_remove_list) +
+ _FindSystemPackagePaths(device, system_package_remove_list))
+ if system_app_paths:
+ # Disable Marshmallow's Verity security feature
+ if device.build_version_sdk >= version_codes.MARSHMALLOW:
+ logger.info('Disabling Verity on %s', device.serial)
+ device.adb.DisableVerity()
+ device.Reboot()
+ device.WaitUntilFullyBooted()
+ device.EnableRoot()
+
+ device.adb.Remount()
+ device.RunShellCommand(['stop'], check_return=True)
+ device.RemovePath(system_app_paths, force=True, recursive=True)
+ device.RunShellCommand(['start'], check_return=True)
+ else:
+ raise device_errors.CommandFailedError(
+ 'Failed to remove system apps from non-rooted device', str(device))
+
+
+def _ConfigureLocalProperties(device, java_debug=True):
+ """Set standard readonly testing device properties prior to reboot."""
+ local_props = [
+ 'persist.sys.usb.config=adb',
+ 'ro.monkey=1',
+ 'ro.test_harness=1',
+ 'ro.audio.silent=1',
+ 'ro.setupwizard.mode=DISABLED',
+ ]
+ if java_debug:
+ local_props.append(
+ '%s=all' % device_utils.DeviceUtils.JAVA_ASSERT_PROPERTY)
+ local_props.append('debug.checkjni=1')
+ try:
+ device.WriteFile(
+ device.LOCAL_PROPERTIES_PATH,
+ '\n'.join(local_props), as_root=True)
+ # Android will not respect the local props file if it is world writable.
+ device.RunShellCommand(
+ ['chmod', '644', device.LOCAL_PROPERTIES_PATH],
+ as_root=True, check_return=True)
+ except device_errors.CommandFailedError:
+ logger.exception('Failed to configure local properties.')
+
+
+def FinishProvisioning(device):
+ # The lockscreen can't be disabled on user builds, so send a keyevent
+ # to unlock it.
+ if device.IsUserBuild():
+ device.SendKeyEvent(keyevent.KEYCODE_MENU)
+
+
+def WaitForCharge(device, min_battery_level):
+ battery = battery_utils.BatteryUtils(device)
+ try:
+ battery.ChargeDeviceToLevel(min_battery_level)
+ except device_errors.DeviceChargingError:
+ device.Reboot()
+ battery.ChargeDeviceToLevel(min_battery_level)
+
+
+def WaitForBatteryTemperature(device, max_battery_temp):
+ try:
+ battery = battery_utils.BatteryUtils(device)
+ battery.LetBatteryCoolToTemperature(max_battery_temp)
+ except device_errors.CommandFailedError:
+ logger.exception('Unable to let battery cool to specified temperature.')
+
+
+def SetDate(device):
+ def _set_and_verify_date():
+ if device.build_version_sdk >= version_codes.MARSHMALLOW:
+ date_format = '%m%d%H%M%Y.%S'
+ set_date_command = ['date', '-u']
+ get_date_command = ['date', '-u']
+ else:
+ date_format = '%Y%m%d.%H%M%S'
+ set_date_command = ['date', '-s']
+ get_date_command = ['date']
+
+ # TODO(jbudorick): This is wrong on pre-M devices -- get/set are
+ # dealing in local time, but we're setting based on GMT.
+ strgmtime = time.strftime(date_format, time.gmtime())
+ set_date_command.append(strgmtime)
+ device.RunShellCommand(set_date_command, as_root=True, check_return=True)
+
+ get_date_command.append('+"%Y%m%d.%H%M%S"')
+ device_time = device.RunShellCommand(
+ get_date_command, check_return=True,
+ as_root=True, single_line=True).replace('"', '')
+ device_time = datetime.datetime.strptime(device_time, "%Y%m%d.%H%M%S")
+ correct_time = datetime.datetime.strptime(strgmtime, date_format)
+ tdelta = (correct_time - device_time).seconds
+ if tdelta <= 1:
+ logger.info('Date/time successfully set on %s', device)
+ return True
+ else:
+ logger.error('Date mismatch. Device: %s Correct: %s',
+ device_time.isoformat(), correct_time.isoformat())
+ return False
+
+ # Sometimes the date is not set correctly on the devices. Retry on failure.
+ if device.IsUserBuild():
+ # TODO(bpastene): Figure out how to set the date & time on user builds.
+ pass
+ else:
+ if not timeout_retry.WaitFor(
+ _set_and_verify_date, wait_period=1, max_tries=2):
+ raise device_errors.CommandFailedError(
+ 'Failed to set date & time.', device_serial=str(device))
+ device.EnableRoot()
+ # The following intent can take a bit to complete when ran shortly after
+ # device boot-up.
+ device.BroadcastIntent(
+ intent.Intent(action='android.intent.action.TIME_SET'),
+ timeout=180)
+
+
+def LogDeviceProperties(device):
+ props = device.RunShellCommand(['getprop'], check_return=True)
+ for prop in props:
+ logger.info(' %s', prop)
+
+
+def CheckExternalStorage(device):
+ """Checks that storage is writable and if not makes it writable.
+
+ Arguments:
+ device: The device to check.
+ """
+ try:
+ with device_temp_file.DeviceTempFile(
+ device.adb, suffix='.sh', dir=device.GetExternalStoragePath()) as f:
+ device.WriteFile(f.name, 'test')
+ except device_errors.CommandFailedError:
+ logger.info('External storage not writable. Remounting / as RW')
+ device.RunShellCommand(['mount', '-o', 'remount,rw', '/'],
+ check_return=True, as_root=True)
+ device.EnableRoot()
+ with device_temp_file.DeviceTempFile(
+ device.adb, suffix='.sh', dir=device.GetExternalStoragePath()) as f:
+ device.WriteFile(f.name, 'test')
+
+
+def main(raw_args):
+ # Recommended options on perf bots:
+ # --disable-network
+ # TODO(tonyg): We eventually want network on. However, currently radios
+ # can cause perfbots to drain faster than they charge.
+ # --min-battery-level 95
+ # Some perf bots run benchmarks with USB charging disabled which leads
+ # to gradual draining of the battery. We must wait for a full charge
+ # before starting a run in order to keep the devices online.
+
+ parser = argparse.ArgumentParser(
+ description='Provision Android devices with settings required for bots.')
+ parser.add_argument(
+ '--adb-key-files', type=str, nargs='+',
+ help='list of adb keys to push to device')
+ parser.add_argument(
+ '--adb-path',
+ help='Absolute path to the adb binary to use.')
+ parser.add_argument('--blacklist-file', help='Device blacklist JSON file.')
+ parser.add_argument(
+ '-d', '--device', metavar='SERIAL', action='append', dest='devices',
+ help='the serial number of the device to be provisioned '
+ '(the default is to provision all devices attached)')
+ parser.add_argument(
+ '--disable-location', action='store_true',
+ help='disable Google location services on devices')
+ parser.add_argument(
+ '--disable-mock-location', action='store_true', default=False,
+ help='Set ALLOW_MOCK_LOCATION to false')
+ parser.add_argument(
+ '--disable-network', action='store_true',
+ help='disable network access on devices')
+ parser.add_argument(
+ '--disable-java-debug', action='store_false',
+ dest='enable_java_debug', default=True,
+ help='disable Java property asserts and JNI checking')
+ parser.add_argument(
+ '--disable-system-chrome', action='store_true',
+ help='DEPRECATED: use --remove-system-packages com.android.google '
+ 'Disable the system chrome from devices.')
+ parser.add_argument(
+ '--emulators', action='store_true',
+ help='provision only emulators and ignore usb devices '
+ '(this will not wipe emulators)')
+ parser.add_argument(
+ '--max-battery-temp', type=int, metavar='NUM',
+ help='Wait for the battery to have this temp or lower.')
+ parser.add_argument(
+ '--min-battery-level', type=int, metavar='NUM',
+ help='wait for the device to reach this minimum battery'
+ ' level before trying to continue')
+ parser.add_argument(
+ '--output-device-blacklist',
+ help='Json file to output the device blacklist.')
+ parser.add_argument(
+ '--reboot-timeout', metavar='SECS', type=int,
+ help='when wiping the device, max number of seconds to'
+ ' wait after each reboot '
+ '(default: %s)' % _DEFAULT_TIMEOUTS.HELP_TEXT)
+ parser.add_argument(
+ '--remove-system-apps', nargs='*', dest='system_app_remove_list',
+ help='DEPRECATED: use --remove-system-packages instead. '
+ 'The names of system apps to remove. ')
+ parser.add_argument(
+ '--remove-system-packages', nargs='*', dest='system_package_remove_list',
+ help='The names of system packages to remove.')
+ parser.add_argument(
+ '--remove-system-webview', action='store_true',
+ help='DEPRECATED: use --remove-system-packages '
+ 'com.google.android.webview com.android.webview '
+ 'Remove the system webview from devices.')
+ parser.add_argument(
+ '--skip-wipe', action='store_true', default=False,
+ help='do not wipe device data during provisioning')
+ parser.add_argument(
+ '-v', '--verbose', action='count', default=1,
+ help='Log more information.')
+
+ # No-op arguments for compatibility with build/android/provision_devices.py.
+ # TODO(jbudorick): Remove these once all callers have stopped using them.
+ parser.add_argument(
+ '--chrome-specific-wipe', action='store_true',
+ help=argparse.SUPPRESS)
+ parser.add_argument(
+ '--phase', action='append',
+ help=argparse.SUPPRESS)
+ parser.add_argument(
+ '-r', '--auto-reconnect', action='store_true',
+ help=argparse.SUPPRESS)
+ parser.add_argument(
+ '-t', '--target',
+ help=argparse.SUPPRESS)
+
+ args = parser.parse_args(raw_args)
+
+ run_tests_helper.SetLogLevel(args.verbose)
+
+ devil_dynamic_config = devil_env.EmptyConfig()
+ if args.adb_path:
+ devil_dynamic_config['dependencies'].update(
+ devil_env.LocalConfigItem(
+ 'adb', devil_env.GetPlatform(), args.adb_path))
+
+ devil_env.config.Initialize(configs=[devil_dynamic_config])
+
+ try:
+ return ProvisionDevices(
+ args.devices,
+ args.blacklist_file,
+ adb_key_files=args.adb_key_files,
+ disable_location=args.disable_location,
+ disable_mock_location=args.disable_mock_location,
+ disable_network=args.disable_network,
+ disable_system_chrome=args.disable_system_chrome,
+ emulators=args.emulators,
+ enable_java_debug=args.enable_java_debug,
+ max_battery_temp=args.max_battery_temp,
+ min_battery_level=args.min_battery_level,
+ output_device_blacklist=args.output_device_blacklist,
+ reboot_timeout=args.reboot_timeout,
+ remove_system_webview=args.remove_system_webview,
+ system_app_remove_list=args.system_app_remove_list,
+ system_package_remove_list=args.system_package_remove_list,
+ wipe=not args.skip_wipe and not args.emulators)
+ except (device_errors.DeviceUnreachableError, device_errors.NoDevicesError):
+ logging.exception('Unable to provision local devices.')
+ return exit_codes.INFRA
+
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv[1:]))
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/screenshot.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/screenshot.py
new file mode 100644
index 0000000..a264c4f
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/screenshot.py
@@ -0,0 +1,59 @@
+#!/usr/bin/env python
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Takes a screenshot from an Android device."""
+
+import argparse
+import logging
+import os
+import sys
+
+if __name__ == '__main__':
+ sys.path.append(os.path.abspath(os.path.join(
+ os.path.dirname(__file__), '..', '..', '..')))
+from devil.android import device_utils
+from devil.android.tools import script_common
+
+logger = logging.getLogger(__name__)
+
+
+def main():
+ # Parse options.
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument('-d', '--device', dest='devices', action='append',
+ help='Serial number of Android device to use.')
+ parser.add_argument('--blacklist-file', help='Device blacklist JSON file.')
+ parser.add_argument('-f', '--file', metavar='FILE',
+ help='Save result to file instead of generating a '
+ 'timestamped file name.')
+ parser.add_argument('-v', '--verbose', action='store_true',
+ help='Verbose logging.')
+ parser.add_argument('host_file', nargs='?',
+ help='File to which the screenshot will be saved.')
+
+ args = parser.parse_args()
+
+ host_file = args.host_file or args.file
+
+ if args.verbose:
+ logging.getLogger().setLevel(logging.DEBUG)
+
+ devices = script_common.GetDevices(args.devices, args.blacklist_file)
+
+ def screenshot(device):
+ f = None
+ if host_file:
+ root, ext = os.path.splitext(host_file)
+ f = '%s_%s%s' % (root, str(device), ext)
+ f = device.TakeScreenshot(f)
+ print 'Screenshot for device %s written to %s' % (
+ str(device), os.path.abspath(f))
+
+ device_utils.DeviceUtils.parallel(devices).pMap(screenshot)
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/script_common.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/script_common.py
new file mode 100644
index 0000000..f91ad5e
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/script_common.py
@@ -0,0 +1,29 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from devil.android import device_blacklist
+from devil.android import device_errors
+from devil.android import device_utils
+
+
+def GetDevices(requested_devices, blacklist_file):
+ if not isinstance(blacklist_file, device_blacklist.Blacklist):
+ blacklist_file = (device_blacklist.Blacklist(blacklist_file)
+ if blacklist_file
+ else None)
+
+ devices = device_utils.DeviceUtils.HealthyDevices(blacklist_file)
+ if not devices:
+ raise device_errors.NoDevicesError()
+ elif requested_devices:
+ requested = set(requested_devices)
+ available = set(str(d) for d in devices)
+ missing = requested.difference(available)
+ if missing:
+ raise device_errors.DeviceUnreachableError(next(iter(missing)))
+ return sorted(device_utils.DeviceUtils(d)
+ for d in available.intersection(requested))
+ else:
+ return devices
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/script_common_test.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/script_common_test.py
new file mode 100644
index 0000000..a226764
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/script_common_test.py
@@ -0,0 +1,58 @@
+#!/usr/bin/env python
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+import sys
+import unittest
+
+from devil import devil_env
+from devil.android import device_errors
+from devil.android import device_utils
+from devil.android.tools import script_common
+
+with devil_env.SysPath(devil_env.PYMOCK_PATH):
+ import mock # pylint: disable=import-error
+
+
+class ScriptCommonTest(unittest.TestCase):
+
+ def testGetDevices_noSpecs(self):
+ devices = [
+ device_utils.DeviceUtils('123'),
+ device_utils.DeviceUtils('456'),
+ ]
+ with mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices',
+ return_value=devices):
+ self.assertEquals(
+ devices,
+ script_common.GetDevices(None, None))
+
+ def testGetDevices_withDevices(self):
+ devices = [
+ device_utils.DeviceUtils('123'),
+ device_utils.DeviceUtils('456'),
+ ]
+ with mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices',
+ return_value=devices):
+ self.assertEquals(
+ [device_utils.DeviceUtils('456')],
+ script_common.GetDevices(['456'], None))
+
+ def testGetDevices_missingDevice(self):
+ with mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices',
+ return_value=[device_utils.DeviceUtils('123')]):
+ with self.assertRaises(device_errors.DeviceUnreachableError):
+ script_common.GetDevices(['456'], None)
+
+ def testGetDevices_noDevices(self):
+ with mock.patch('devil.android.device_utils.DeviceUtils.HealthyDevices',
+ return_value=[]):
+ with self.assertRaises(device_errors.NoDevicesError):
+ script_common.GetDevices(None, None)
+
+
+if __name__ == '__main__':
+ sys.exit(unittest.main())
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/video_recorder.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/video_recorder.py
new file mode 100644
index 0000000..a91e649
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/video_recorder.py
@@ -0,0 +1,175 @@
+#!/usr/bin/env python
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Captures a video from an Android device."""
+
+import argparse
+import logging
+import os
+import threading
+import time
+import sys
+
+if __name__ == '__main__':
+ sys.path.append(os.path.abspath(os.path.join(
+ os.path.dirname(__file__), '..', '..', '..')))
+from devil.android import device_signal
+from devil.android import device_utils
+from devil.android.tools import script_common
+from devil.utils import cmd_helper
+from devil.utils import reraiser_thread
+from devil.utils import timeout_retry
+
+logger = logging.getLogger(__name__)
+
+
+class VideoRecorder(object):
+ """Records a screen capture video from an Android Device (KitKat or newer)."""
+
+ def __init__(self, device, megabits_per_second=4, size=None,
+ rotate=False):
+ """Creates a VideoRecorder instance.
+
+ Args:
+ device: DeviceUtils instance.
+ host_file: Path to the video file to store on the host.
+ megabits_per_second: Video bitrate in megabits per second. Allowed range
+ from 0.1 to 100 mbps.
+ size: Video frame size tuple (width, height) or None to use the device
+ default.
+ rotate: If True, the video will be rotated 90 degrees.
+ """
+ self._bit_rate = megabits_per_second * 1000 * 1000
+ self._device = device
+ self._device_file = (
+ '%s/screen-recording.mp4' % device.GetExternalStoragePath())
+ self._recorder_thread = None
+ self._rotate = rotate
+ self._size = size
+ self._started = threading.Event()
+
+ def __enter__(self):
+ self.Start()
+
+ def Start(self, timeout=None):
+ """Start recording video."""
+ def screenrecord_started():
+ return bool(self._device.GetPids('screenrecord'))
+
+ if screenrecord_started():
+ raise Exception("Can't run multiple concurrent video captures.")
+
+ self._started.clear()
+ self._recorder_thread = reraiser_thread.ReraiserThread(self._Record)
+ self._recorder_thread.start()
+ timeout_retry.WaitFor(
+ screenrecord_started, wait_period=1, max_tries=timeout)
+ self._started.wait(timeout)
+
+ def _Record(self):
+ cmd = ['screenrecord', '--verbose', '--bit-rate', str(self._bit_rate)]
+ if self._rotate:
+ cmd += ['--rotate']
+ if self._size:
+ cmd += ['--size', '%dx%d' % self._size]
+ cmd += [self._device_file]
+ for line in self._device.adb.IterShell(
+ ' '.join(cmd_helper.SingleQuote(i) for i in cmd), None):
+ if line.startswith('Content area is '):
+ self._started.set()
+
+ def __exit__(self, _exc_type, _exc_value, _traceback):
+ self.Stop()
+
+ def Stop(self):
+ """Stop recording video."""
+ if not self._device.KillAll('screenrecord', signum=device_signal.SIGINT,
+ quiet=True):
+ logger.warning('Nothing to kill: screenrecord was not running')
+ self._recorder_thread.join()
+
+ def Pull(self, host_file=None):
+ """Pull resulting video file from the device.
+
+ Args:
+ host_file: Path to the video file to store on the host.
+ Returns:
+ Output video file name on the host.
+ """
+ # TODO(jbudorick): Merge filename generation with the logic for doing so in
+ # DeviceUtils.
+ host_file_name = (
+ host_file
+ or 'screen-recording-%s-%s.mp4' % (
+ str(self._device),
+ time.strftime('%Y%m%dT%H%M%S', time.localtime())))
+ host_file_name = os.path.abspath(host_file_name)
+ self._device.PullFile(self._device_file, host_file_name)
+ self._device.RemovePath(self._device_file, force=True)
+ return host_file_name
+
+
+def main():
+ # Parse options.
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument('-d', '--device', dest='devices', action='append',
+ help='Serial number of Android device to use.')
+ parser.add_argument('--blacklist-file', help='Device blacklist JSON file.')
+ parser.add_argument('-f', '--file', metavar='FILE',
+ help='Save result to file instead of generating a '
+ 'timestamped file name.')
+ parser.add_argument('-v', '--verbose', action='store_true',
+ help='Verbose logging.')
+ parser.add_argument('-b', '--bitrate', default=4, type=float,
+ help='Bitrate in megabits/s, from 0.1 to 100 mbps, '
+ '%default mbps by default.')
+ parser.add_argument('-r', '--rotate', action='store_true',
+ help='Rotate video by 90 degrees.')
+ parser.add_argument('-s', '--size', metavar='WIDTHxHEIGHT',
+ help='Frame size to use instead of the device '
+ 'screen size.')
+ parser.add_argument('host_file', nargs='?',
+ help='File to which the video capture will be written.')
+
+ args = parser.parse_args()
+
+ host_file = args.host_file or args.file
+
+ if args.verbose:
+ logging.getLogger().setLevel(logging.DEBUG)
+
+ size = (tuple(int(i) for i in args.size.split('x'))
+ if args.size
+ else None)
+
+ def record_video(device, stop_recording):
+ recorder = VideoRecorder(
+ device, megabits_per_second=args.bitrate, size=size, rotate=args.rotate)
+ with recorder:
+ stop_recording.wait()
+
+ f = None
+ if host_file:
+ root, ext = os.path.splitext(host_file)
+ f = '%s_%s%s' % (root, str(device), ext)
+ f = recorder.Pull(f)
+ print 'Video written to %s' % os.path.abspath(f)
+
+ parallel_devices = device_utils.DeviceUtils.parallel(
+ script_common.GetDevices(args.devices, args.blacklist_file),
+ async=True)
+ stop_recording = threading.Event()
+ running_recording = parallel_devices.pMap(record_video, stop_recording)
+ print 'Recording. Press Enter to stop.',
+ sys.stdout.flush()
+ raw_input()
+ stop_recording.set()
+
+ running_recording.pGet(None)
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/wait_for_devices.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/wait_for_devices.py
new file mode 100644
index 0000000..4bde2cd
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/tools/wait_for_devices.py
@@ -0,0 +1,50 @@
+#!/usr/bin/env python
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Waits for the given devices to be available."""
+
+import argparse
+import os
+import sys
+
+if __name__ == '__main__':
+ sys.path.append(
+ os.path.abspath(os.path.join(os.path.dirname(__file__),
+ '..', '..', '..')))
+
+from devil import devil_env
+from devil.android import device_utils
+from devil.utils import run_tests_helper
+
+
+def main(raw_args):
+ parser = argparse.ArgumentParser()
+ parser.add_argument('-v', '--verbose', action='count', help='Log more.')
+ parser.add_argument('-t', '--timeout', default=30, type=int,
+ help='Seconds to wait for the devices.')
+ parser.add_argument('--adb-path', help='ADB binary to use.')
+ parser.add_argument('device_serials', nargs='*', metavar='SERIAL',
+ help='Serials of the devices to wait for.')
+
+ args = parser.parse_args(raw_args)
+
+ run_tests_helper.SetLogLevel(args.verbose)
+
+ devil_dynamic_config = devil_env.EmptyConfig()
+ if args.adb_path:
+ devil_dynamic_config['dependencies'].update(
+ devil_env.LocalConfigItem(
+ 'adb', devil_env.GetPlatform(), args.adb_path))
+ devil_env.config.Initialize(configs=[devil_dynamic_config])
+
+ devices = device_utils.DeviceUtils.HealthyDevices(
+ device_arg=args.device_serials)
+ parallel_devices = device_utils.DeviceUtils.parallel(devices)
+ parallel_devices.WaitUntilFullyBooted(timeout=args.timeout)
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv[1:]))
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/valgrind_tools/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/valgrind_tools/__init__.py
new file mode 100644
index 0000000..0182d4c
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/valgrind_tools/__init__.py
@@ -0,0 +1,21 @@
+# Copyright (c) 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+"""
+Classes in this package define additional actions that need to be taken to run a
+test under some kind of runtime error detection tool.
+
+The interface is intended to be used as follows.
+
+1. For tests that simply run a native process (i.e. no activity is spawned):
+
+Call tool.CopyFiles(device).
+Prepend test command line with tool.GetTestWrapper().
+
+2. For tests that spawn an activity:
+
+Call tool.CopyFiles(device).
+Call tool.SetupEnvironment().
+Run the test as usual.
+Call tool.CleanUpEnvironment().
+"""
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/valgrind_tools/base_tool.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/valgrind_tools/base_tool.py
new file mode 100644
index 0000000..2e6e9af
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/android/valgrind_tools/base_tool.py
@@ -0,0 +1,53 @@
+# Copyright (c) 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+class BaseTool(object):
+ """A tool that does nothing."""
+ # pylint: disable=R0201
+
+ def __init__(self):
+ """Does nothing."""
+ pass
+
+ def GetTestWrapper(self):
+ """Returns a string that is to be prepended to the test command line."""
+ return ''
+
+ def GetUtilWrapper(self):
+ """Returns the wrapper name for the utilities.
+
+ Returns:
+ A string that is to be prepended to the command line of utility
+ processes (forwarder, etc.).
+ """
+ return ''
+
+ @classmethod
+ def CopyFiles(cls, device):
+ """Copies tool-specific files to the device, create directories, etc."""
+ pass
+
+ def SetupEnvironment(self):
+ """Sets up the system environment for a test.
+
+ This is a good place to set system properties.
+ """
+ pass
+
+ def CleanUpEnvironment(self):
+ """Cleans up environment."""
+ pass
+
+ def GetTimeoutScale(self):
+ """Returns a multiplier that should be applied to timeout values."""
+ return 1.0
+
+ def NeedsDebugInfo(self):
+ """Whether this tool requires debug info.
+
+ Returns:
+ True if this tool can not work with stripped binaries.
+ """
+ return False
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/base_error.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/base_error.py
new file mode 100644
index 0000000..4b89661
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/base_error.py
@@ -0,0 +1,24 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+class BaseError(Exception):
+ """Base error for all test runner errors."""
+
+ def __init__(self, message, is_infra_error=False):
+ super(BaseError, self).__init__(message)
+ self._is_infra_error = is_infra_error
+
+ def __eq__(self, other):
+ return (self.message == other.message
+ and self.is_infra_error == other.is_infra_error)
+
+ def __ne__(self, other):
+ return not self == other
+
+ @property
+ def is_infra_error(self):
+ """Property to indicate if error was caused by an infrastructure issue."""
+ return self._is_infra_error
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/constants/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/constants/__init__.py
new file mode 100644
index 0000000..50b23df
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/constants/__init__.py
@@ -0,0 +1,3 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/constants/exit_codes.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/constants/exit_codes.py
new file mode 100644
index 0000000..aaeca4a
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/constants/exit_codes.py
@@ -0,0 +1,9 @@
+# Copyright (c) 2012 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Common exit codes used by devil."""
+
+ERROR = 1
+INFRA = 87
+WARNING = 88
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/devil_dependencies.json b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/devil_dependencies.json
new file mode 100644
index 0000000..bed6fe1
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/devil_dependencies.json
@@ -0,0 +1,127 @@
+{
+ "config_type": "BaseConfig",
+ "dependencies": {
+ "aapt": {
+ "cloud_storage_base_folder": "binary_dependencies",
+ "cloud_storage_bucket": "chromium-telemetry",
+ "file_info": {
+ "linux2_x86_64": {
+ "cloud_storage_hash": "16ba3180141a2489d7ec99b39fd6e3434a9a373f",
+ "download_path": "../bin/deps/linux2/x86_64/bin/aapt"
+ }
+ }
+ },
+ "adb": {
+ "cloud_storage_base_folder": "binary_dependencies",
+ "cloud_storage_bucket": "chromium-telemetry",
+ "file_info": {
+ "linux2_x86_64": {
+ "cloud_storage_hash": "8bd43e3930f6eec643d5dc64cab9e5bb4ddf4909",
+ "download_path": "../bin/deps/linux2/x86_64/bin/adb"
+ }
+ }
+ },
+ "android_build_tools_libc++": {
+ "cloud_storage_base_folder": "binary_dependencies",
+ "cloud_storage_bucket": "chromium-telemetry",
+ "file_info": {
+ "linux2_x86_64": {
+ "cloud_storage_hash": "91cdce1e3bd81b2ac1fd380013896d0e2cdb40a0",
+ "download_path": "../bin/deps/linux2/x86_64/lib/libc++.so"
+ }
+ }
+ },
+ "chromium_commands": {
+ "cloud_storage_base_folder": "binary_dependencies",
+ "cloud_storage_bucket": "chromium-telemetry",
+ "file_info": {
+ "linux2_x86_64": {
+ "cloud_storage_hash": "4e22f641e4757309510e8d9f933f5aa504574ab6",
+ "download_path": "../bin/deps/linux2/x86_64/lib.java/chromium_commands.dex.jar"
+ }
+ }
+ },
+ "dexdump": {
+ "cloud_storage_base_folder": "binary_dependencies",
+ "cloud_storage_bucket": "chromium-telemetry",
+ "file_info": {
+ "linux2_x86_64": {
+ "cloud_storage_hash": "acfb10f7a868baf9bcf446a2d9f8ed6b5d52c3c6",
+ "download_path": "../bin/deps/linux2/x86_64/bin/dexdump"
+ }
+ }
+ },
+ "fastboot": {
+ "cloud_storage_base_folder": "binary_dependencies",
+ "cloud_storage_bucket": "chromium-telemetry",
+ "file_info": {
+ "linux2_x86_64": {
+ "cloud_storage_hash": "db9728166f182800eb9d09e9f036d56e105e8235",
+ "download_path": "../bin/deps/linux2/x86_64/bin/fastboot"
+ }
+ }
+ },
+ "forwarder_device": {
+ "cloud_storage_base_folder": "binary_dependencies",
+ "cloud_storage_bucket": "chromium-telemetry",
+ "file_info": {
+ "android_arm64-v8a": {
+ "cloud_storage_hash": "f222268d8442979240d1b18de00911a49e548daa",
+ "download_path": "../bin/deps/android/arm64-v8a/bin/forwarder_device"
+ },
+ "android_armeabi-v7a": {
+ "cloud_storage_hash": "c15267bf01c26eb0aea4f61c780bbba460c5c981",
+ "download_path": "../bin/deps/android/armeabi-v7a/bin/forwarder_device"
+ }
+ }
+ },
+ "forwarder_host": {
+ "cloud_storage_base_folder": "binary_dependencies",
+ "cloud_storage_bucket": "chromium-telemetry",
+ "file_info": {
+ "linux2_x86_64": {
+ "cloud_storage_hash": "8fe69994b670f028484eed475dbffc838c8a57f7",
+ "download_path": "../bin/deps/linux2/x86_64/forwarder_host"
+ }
+ }
+ },
+ "md5sum_device": {
+ "cloud_storage_base_folder": "binary_dependencies",
+ "cloud_storage_bucket": "chromium-telemetry",
+ "file_info": {
+ "android_arm64-v8a": {
+ "cloud_storage_hash": "4e7d2dedd9c6321fdc152b06869e09a3c5817904",
+ "download_path": "../bin/deps/android/arm64-v8a/bin/md5sum_device"
+ },
+ "android_armeabi-v7a": {
+ "cloud_storage_hash": "39fd90af0f8828202b687f7128393759181c5e2e",
+ "download_path": "../bin/deps/android/armeabi-v7a/bin/md5sum_device"
+ },
+ "android_x86": {
+ "cloud_storage_hash": "d5cf42ab5986a69c31c0177b0df499d6bf708df6",
+ "download_path": "../bin/deps/android/x86/bin/md5sum_device"
+ }
+ }
+ },
+ "md5sum_host": {
+ "cloud_storage_base_folder": "binary_dependencies",
+ "cloud_storage_bucket": "chromium-telemetry",
+ "file_info": {
+ "linux2_x86_64": {
+ "cloud_storage_hash": "4db5bd5e9bea8880d8bf2caa59d0efb0acc19f74",
+ "download_path": "../bin/deps/linux2/x86_64/bin/md5sum_host"
+ }
+ }
+ },
+ "split-select": {
+ "cloud_storage_base_folder": "binary_dependencies",
+ "cloud_storage_bucket": "chromium-telemetry",
+ "file_info": {
+ "linux2_x86_64": {
+ "cloud_storage_hash": "abb9753a8d3efeea4144e328933931729e01571c",
+ "download_path": "../bin/deps/linux2/x86_64/bin/split-select"
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/devil_env.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/devil_env.py
new file mode 100644
index 0000000..aa4fe1e
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/devil_env.py
@@ -0,0 +1,194 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import contextlib
+import json
+import logging
+import os
+import platform
+import sys
+import tempfile
+import threading
+
+CATAPULT_ROOT_PATH = os.path.abspath(os.path.join(
+ os.path.dirname(__file__), '..', '..'))
+DEPENDENCY_MANAGER_PATH = os.path.join(
+ CATAPULT_ROOT_PATH, 'dependency_manager')
+PYMOCK_PATH = os.path.join(
+ CATAPULT_ROOT_PATH, 'third_party', 'mock')
+
+
+@contextlib.contextmanager
+def SysPath(path):
+ sys.path.append(path)
+ yield
+ if sys.path[-1] != path:
+ sys.path.remove(path)
+ else:
+ sys.path.pop()
+
+with SysPath(DEPENDENCY_MANAGER_PATH):
+ import dependency_manager # pylint: disable=import-error
+
+_ANDROID_BUILD_TOOLS = {'aapt', 'dexdump', 'split-select'}
+
+_DEVIL_DEFAULT_CONFIG = os.path.abspath(os.path.join(
+ os.path.dirname(__file__), 'devil_dependencies.json'))
+
+_LEGACY_ENVIRONMENT_VARIABLES = {
+ 'ADB_PATH': {
+ 'dependency_name': 'adb',
+ 'platform': 'linux2_x86_64',
+ },
+ 'ANDROID_SDK_ROOT': {
+ 'dependency_name': 'android_sdk',
+ 'platform': 'linux2_x86_64',
+ },
+}
+
+
+def EmptyConfig():
+ return {
+ 'config_type': 'BaseConfig',
+ 'dependencies': {}
+ }
+
+
+def LocalConfigItem(dependency_name, dependency_platform, dependency_path):
+ if isinstance(dependency_path, basestring):
+ dependency_path = [dependency_path]
+ return {
+ dependency_name: {
+ 'file_info': {
+ dependency_platform: {
+ 'local_paths': dependency_path
+ },
+ },
+ },
+ }
+
+
+def _GetEnvironmentVariableConfig():
+ env_config = EmptyConfig()
+ path_config = (
+ (os.environ.get(k), v)
+ for k, v in _LEGACY_ENVIRONMENT_VARIABLES.iteritems())
+ path_config = ((p, c) for p, c in path_config if p)
+ for p, c in path_config:
+ env_config['dependencies'].update(
+ LocalConfigItem(c['dependency_name'], c['platform'], p))
+ return env_config
+
+
+class _Environment(object):
+
+ def __init__(self):
+ self._dm_init_lock = threading.Lock()
+ self._dm = None
+ self._logging_init_lock = threading.Lock()
+ self._logging_initialized = False
+
+ def Initialize(self, configs=None, config_files=None):
+ """Initialize devil's environment from configuration files.
+
+ This uses all configurations provided via |configs| and |config_files|
+ to determine the locations of devil's dependencies. Configurations should
+ all take the form described by py_utils.dependency_manager.BaseConfig.
+ If no configurations are provided, a default one will be used if available.
+
+ Args:
+ configs: An optional list of dict configurations.
+ config_files: An optional list of files to load
+ """
+
+ # Make sure we only initialize self._dm once.
+ with self._dm_init_lock:
+ if self._dm is None:
+ if configs is None:
+ configs = []
+
+ env_config = _GetEnvironmentVariableConfig()
+ if env_config:
+ configs.insert(0, env_config)
+ self._InitializeRecursive(
+ configs=configs,
+ config_files=config_files)
+ assert self._dm is not None, 'Failed to create dependency manager.'
+
+ def _InitializeRecursive(self, configs=None, config_files=None):
+ # This recurses through configs to create temporary files for each and
+ # take advantage of context managers to appropriately close those files.
+ # TODO(jbudorick): Remove this recursion if/when dependency_manager
+ # supports loading configurations directly from a dict.
+ if configs:
+ with tempfile.NamedTemporaryFile(delete=False) as next_config_file:
+ try:
+ next_config_file.write(json.dumps(configs[0]))
+ next_config_file.close()
+ self._InitializeRecursive(
+ configs=configs[1:],
+ config_files=[next_config_file.name] + (config_files or []))
+ finally:
+ if os.path.exists(next_config_file.name):
+ os.remove(next_config_file.name)
+ else:
+ config_files = config_files or []
+ if 'DEVIL_ENV_CONFIG' in os.environ:
+ config_files.append(os.environ.get('DEVIL_ENV_CONFIG'))
+ config_files.append(_DEVIL_DEFAULT_CONFIG)
+
+ self._dm = dependency_manager.DependencyManager(
+ [dependency_manager.BaseConfig(c) for c in config_files])
+
+ def InitializeLogging(self, log_level, formatter=None, handler=None):
+ if self._logging_initialized:
+ return
+
+ with self._logging_init_lock:
+ if self._logging_initialized:
+ return
+
+ formatter = formatter or logging.Formatter(
+ '%(threadName)-4s %(message)s')
+ handler = handler or logging.StreamHandler(sys.stdout)
+ handler.setFormatter(formatter)
+
+ devil_logger = logging.getLogger('devil')
+ devil_logger.setLevel(log_level)
+ devil_logger.propagate = False
+ devil_logger.addHandler(handler)
+
+ import py_utils.cloud_storage
+ lock_logger = py_utils.cloud_storage.logger
+ lock_logger.setLevel(log_level)
+ lock_logger.propagate = False
+ lock_logger.addHandler(handler)
+
+ self._logging_initialized = True
+
+ def FetchPath(self, dependency, arch=None, device=None):
+ if self._dm is None:
+ self.Initialize()
+ if dependency in _ANDROID_BUILD_TOOLS:
+ self.FetchPath('android_build_tools_libc++', arch=arch, device=device)
+ return self._dm.FetchPath(dependency, GetPlatform(arch, device))
+
+ def LocalPath(self, dependency, arch=None, device=None):
+ if self._dm is None:
+ self.Initialize()
+ return self._dm.LocalPath(dependency, GetPlatform(arch, device))
+
+ def PrefetchPaths(self, dependencies=None, arch=None, device=None):
+ return self._dm.PrefetchPaths(
+ GetPlatform(arch, device), dependencies=dependencies)
+
+
+def GetPlatform(arch=None, device=None):
+ if arch or device:
+ return 'android_%s' % (arch or device.product_cpu_abi)
+ return '%s_%s' % (sys.platform, platform.machine())
+
+
+config = _Environment()
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/devil_env_test.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/devil_env_test.py
new file mode 100644
index 0000000..e78221a
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/devil_env_test.py
@@ -0,0 +1,63 @@
+#!/usr/bin/env python
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# pylint: disable=protected-access
+
+import logging
+import sys
+import unittest
+
+from devil import devil_env
+
+_sys_path_before = list(sys.path)
+with devil_env.SysPath(devil_env.PYMOCK_PATH):
+ _sys_path_with_pymock = list(sys.path)
+ import mock # pylint: disable=import-error
+_sys_path_after = list(sys.path)
+
+
+class DevilEnvTest(unittest.TestCase):
+
+ def testSysPath(self):
+ self.assertEquals(_sys_path_before, _sys_path_after)
+ self.assertEquals(
+ _sys_path_before + [devil_env.PYMOCK_PATH],
+ _sys_path_with_pymock)
+
+ def testGetEnvironmentVariableConfig_configType(self):
+ with mock.patch('os.environ.get',
+ mock.Mock(side_effect=lambda _env_var: None)):
+ env_config = devil_env._GetEnvironmentVariableConfig()
+ self.assertEquals('BaseConfig', env_config.get('config_type'))
+
+ def testGetEnvironmentVariableConfig_noEnv(self):
+ with mock.patch('os.environ.get',
+ mock.Mock(side_effect=lambda _env_var: None)):
+ env_config = devil_env._GetEnvironmentVariableConfig()
+ self.assertEquals({}, env_config.get('dependencies'))
+
+ def testGetEnvironmentVariableConfig_adbPath(self):
+ def mock_environment(env_var):
+ return '/my/fake/adb/path' if env_var == 'ADB_PATH' else None
+
+ with mock.patch('os.environ.get',
+ mock.Mock(side_effect=mock_environment)):
+ env_config = devil_env._GetEnvironmentVariableConfig()
+ self.assertEquals(
+ {
+ 'adb': {
+ 'file_info': {
+ 'linux2_x86_64': {
+ 'local_paths': ['/my/fake/adb/path'],
+ },
+ },
+ },
+ },
+ env_config.get('dependencies'))
+
+
+if __name__ == '__main__':
+ logging.getLogger().setLevel(logging.DEBUG)
+ unittest.main(verbosity=2)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/__init__.py
new file mode 100644
index 0000000..ff84988
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/__init__.py
@@ -0,0 +1,23 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import sys
+
+def _JoinPath(*path_parts):
+ return os.path.abspath(os.path.join(*path_parts))
+
+
+def _AddDirToPythonPath(*path_parts):
+ path = _JoinPath(*path_parts)
+ if os.path.isdir(path) and path not in sys.path:
+ # Some call sites that use Telemetry assume that sys.path[0] is the
+ # directory containing the script, so we add these extra paths to right
+ # after sys.path[0].
+ sys.path.insert(1, path)
+
+_CATAPULT_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)),
+ os.path.pardir, os.path.pardir, os.path.pardir)
+
+_AddDirToPythonPath(_CATAPULT_DIR, 'common', 'battor')
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/battor_device_mapping.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/battor_device_mapping.py
new file mode 100644
index 0000000..8cabb83
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/battor_device_mapping.py
@@ -0,0 +1,309 @@
+#!/usr/bin/python
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+'''
+This script provides tools to map BattOrs to phones.
+
+Phones are identified by the following string:
+
+"Phone serial number" - Serial number of the phone. This can be
+obtained via 'adb devices' or 'usb-devices', and is not expected
+to change for a given phone.
+
+BattOrs are identified by the following two strings:
+
+"BattOr serial number" - Serial number of the BattOr. This can be
+obtained via 'usb-devices', and is not expected to change for
+a given BattOr.
+
+"BattOr path" - The path of the form '/dev/ttyUSB*' that is used
+to communicate with the BattOr (the battor_agent binary takes
+this BattOr path as a parameter). The BattOr path is frequently
+reassigned by the OS, most often when the device is disconnected
+and then reconnected. Thus, the BattOr path cannot be expected
+to be stable.
+
+In a typical application, the user will require the BattOr path
+for the BattOr that is plugged into a given phone. For instance,
+the user will be running tracing on a particular phone, and will
+need to know which BattOr path to use to communicate with the BattOr
+to get the corresponding power trace.
+
+Getting this mapping requires two steps: (1) determining the
+mapping between phone serial numbers and BattOr serial numbers, and
+(2) getting the BattOr path corresponding to a given BattOr serial
+number.
+
+For step (1), we generate a JSON file giving this mapping. This
+JSON file consists of a list of items of the following form:
+[{'phone': <phone serial 1>, 'battor': <battor serial 1>},
+{'phone': <phone serial 2>, 'battor': <battor serial 2>}, ...]
+
+The default way to generate this JSON file is using the function
+GenerateSerialMapFile, which generates a mapping based on assuming
+that the system has two identical USB hubs connected to it, and
+the phone plugged into physical port number 1 on one hub corresponds
+to the BattOr plugged into physical port number 1 on the other hub,
+and similarly with physical port numbers 2, 3, etc. This generates
+the map file based on the structure at the time GenerateSerialMapFile called.
+Note that after the map file is generated, port numbers are no longer used;
+the user could move around the devices in the ports without affecting
+which phone goes with which BattOr. (Thus, if the user wanted to update the
+mapping to match the new port connections, the user would have to
+re-generate this file.)
+
+The script update_mapping.py will do this updating from the command line.
+
+If the user wanted to specify a custom mapping, the user could instead
+create the JSON file manually. (In this case, hubs would not be necessary
+and the physical ports connected would be irrelevant.)
+
+Step (2) is conducted through the function GetBattOrPathFromPhoneSerial,
+which takes a serial number mapping generated via step (1) and a phone
+serial number, then gets the corresponding BattOr serial number from the
+map and determines its BattOr path (e.g. /dev/ttyUSB0). Since BattOr paths
+can change if devices are connected and disconnected (even if connected
+or disconnected via the same port) this function should be called to
+determine the BattOr path every time before connecting to the BattOr.
+
+Note that if there is only one BattOr connected to the system, then
+GetBattOrPathFromPhoneSerial will always return that BattOr and will ignore
+the mapping file. Thus, if the user never has more than one BattOr connected
+to the system, the user will not need to generate mapping files.
+'''
+
+
+import json
+import collections
+
+from battor import battor_error
+from devil.utils import find_usb_devices
+from devil.utils import usb_hubs
+
+
+def GetBattOrList(device_tree_map):
+ return [x for x in find_usb_devices.GetTTYList()
+ if IsBattOr(x, device_tree_map)]
+
+
+def IsBattOr(tty_string, device_tree_map):
+ (bus, device) = find_usb_devices.GetBusDeviceFromTTY(tty_string)
+ node = device_tree_map[bus].FindDeviceNumber(device)
+ return '0403:6001' in node.desc
+
+
+def GetBattOrSerialNumbers(device_tree_map):
+ for x in find_usb_devices.GetTTYList():
+ if IsBattOr(x, device_tree_map):
+ (bus, device) = find_usb_devices.GetBusDeviceFromTTY(x)
+ devnode = device_tree_map[bus].FindDeviceNumber(device)
+ yield devnode.serial
+
+
+def ReadSerialMapFile(filename):
+ """Reads JSON file giving phone-to-battor serial number map.
+
+ Parses a JSON file consisting of a list of items of the following form:
+ [{'phone': <phone serial 1>, 'battor': <battor serial 1>},
+ {'phone': <phone serial 2>, 'battor': <battor serial 2>}, ...]
+
+ indicating which phone serial numbers should be matched with
+ which BattOr serial numbers. Returns dictionary of the form:
+
+ {<phone serial 1>: <BattOr serial 1>,
+ <phone serial 2>: <BattOr serial 2>}
+
+ Args:
+ filename: Name of file to read.
+ """
+ result = {}
+ with open(filename, 'r') as infile:
+ in_dict = json.load(infile)
+ for x in in_dict:
+ result[x['phone']] = x['battor']
+ return result
+
+def WriteSerialMapFile(filename, serial_map):
+ """Writes a map of phone serial numbers to BattOr serial numbers to file.
+
+ Writes a JSON file consisting of a list of items of the following form:
+ [{'phone': <phone serial 1>, 'battor': <battor serial 1>},
+ {'phone': <phone serial 2>, 'battor': <battor serial 2>}, ...]
+
+ indicating which phone serial numbers should be matched with
+ which BattOr serial numbers. Mapping is based on the physical port numbers
+ of the hubs that the BattOrs and phones are connected to.
+
+ Args:
+ filename: Name of file to write.
+ serial_map: Serial map {phone: battor}
+ """
+ result = []
+ for (phone, battor) in serial_map.iteritems():
+ result.append({'phone': phone, 'battor': battor})
+ with open(filename, 'w') as outfile:
+ json.dump(result, outfile)
+
+def GenerateSerialMap(hub_types=None):
+ """Generates a map of phone serial numbers to BattOr serial numbers.
+
+ Generates a dict of:
+ {<phone serial 1>: <battor serial 1>,
+ <phone serial 2>: <battor serial 2>}
+ indicating which phone serial numbers should be matched with
+ which BattOr serial numbers. Mapping is based on the physical port numbers
+ of the hubs that the BattOrs and phones are connected to.
+
+ Args:
+ hub_types: List of hub types to check for. If not specified, checks
+ for all defined hub types. (see usb_hubs.py for details)
+ """
+ if hub_types:
+ hub_types = [usb_hubs.GetHubType(x) for x in hub_types]
+ else:
+ hub_types = usb_hubs.ALL_HUBS
+
+ devtree = find_usb_devices.GetBusNumberToDeviceTreeMap()
+
+ # List of serial numbers in the system that represent BattOrs.
+ battor_serials = list(GetBattOrSerialNumbers(devtree))
+
+ # If there's only one BattOr in the system, then a serial number ma
+ # is not necessary.
+ if len(battor_serials) == 1:
+ return {}
+
+ # List of dictionaries, one for each hub, that maps the physical
+ # port number to the serial number of that hub. For instance, in a 2
+ # hub system, this could return [{1:'ab', 2:'cd'}, {1:'jkl', 2:'xyz'}]
+ # where 'ab' and 'cd' are the phone serial numbers and 'jkl' and 'xyz'
+ # are the BattOr serial numbers.
+ port_to_serial = find_usb_devices.GetAllPhysicalPortToSerialMaps(
+ hub_types, device_tree_map=devtree)
+
+ class serials(object):
+ def __init__(self):
+ self.phone = None
+ self.battor = None
+
+ # Map of {physical port number: [phone serial #, BattOr serial #]. This
+ # map is populated by executing the code below. For instance, in the above
+ # example, after the code below is executed, port_to_devices would equal
+ # {1: ['ab', 'jkl'], 2: ['cd', 'xyz']}
+ port_to_devices = collections.defaultdict(serials)
+ for hub in port_to_serial:
+ for (port, serial) in hub.iteritems():
+ if serial in battor_serials:
+ if port_to_devices[port].battor is not None:
+ raise battor_error.BattOrError('Multiple BattOrs on same port number')
+ else:
+ port_to_devices[port].battor = serial
+ else:
+ if port_to_devices[port].phone is not None:
+ raise battor_error.BattOrError('Multiple phones on same port number')
+ else:
+ port_to_devices[port].phone = serial
+
+ # Turn the port_to_devices map into a map of the form
+ # {phone serial number: BattOr serial number}.
+ result = {}
+ for pair in port_to_devices.values():
+ if pair.phone is None:
+ continue
+ if pair.battor is None:
+ raise battor_error.BattOrError(
+ 'Phone detected with no corresponding BattOr')
+ result[pair.phone] = pair.battor
+ return result
+
+def GenerateSerialMapFile(filename, hub_types=None):
+ """Generates a serial map file and writes it."""
+ WriteSerialMapFile(filename, GenerateSerialMap(hub_types))
+
+def _PhoneToPathMap(serial, serial_map, devtree):
+ """Maps phone serial number to TTY path, assuming serial map is provided."""
+ try:
+ battor_serial = serial_map[serial]
+ except KeyError:
+ raise battor_error.BattOrError('Serial number not found in serial map.')
+ for tree in devtree.values():
+ for node in tree.AllNodes():
+ if isinstance(node, find_usb_devices.USBDeviceNode):
+ if node.serial == battor_serial:
+ bus_device_to_tty = find_usb_devices.GetBusDeviceToTTYMap()
+ bus_device = (node.bus_num, node.device_num)
+ try:
+ return bus_device_to_tty[bus_device]
+ except KeyError:
+ raise battor_error.BattOrError(
+ 'Device with given serial number not a BattOr '
+ '(does not have TTY path)')
+
+
+def GetBattOrPathFromPhoneSerial(serial, serial_map=None,
+ serial_map_file=None):
+ """Gets the TTY path (e.g. '/dev/ttyUSB0') to communicate with the BattOr.
+
+ (1) If serial_map is given, it is treated as a dictionary mapping
+ phone serial numbers to BattOr serial numbers. This function will get the
+ TTY path for the given BattOr serial number.
+
+ (2) If serial_map_file is given, it is treated as the name of a
+ phone-to-BattOr mapping file (generated with GenerateSerialMapFile)
+ and this will be loaded and used as the dict to map port numbers to
+ BattOr serial numbers.
+
+ You can only give one of serial_map and serial_map_file.
+
+ Args:
+ serial: Serial number of phone connected on the same physical port that
+ the BattOr is connected to.
+ serial_map: Map of phone serial numbers to BattOr serial numbers, given
+ as a dictionary.
+ serial_map_file: Map of phone serial numbers to BattOr serial numbers,
+ given as a file.
+ hub_types: List of hub types to check for. Used only if serial_map_file
+ is None.
+
+ Returns:
+ Device string used to communicate with device.
+
+ Raises:
+ ValueError: If serial number is not given.
+ BattOrError: If BattOr not found or unexpected USB topology.
+ """
+ # If there's only one BattOr connected to the system, just use that one.
+ # This allows for use on, e.g., a developer's workstation with no hubs.
+ devtree = find_usb_devices.GetBusNumberToDeviceTreeMap()
+ all_battors = GetBattOrList(devtree)
+ if len(all_battors) == 1:
+ return '/dev/' + all_battors[0]
+
+ if not serial:
+ raise battor_error.BattOrError(
+ 'Two or more BattOrs connected, no serial provided')
+
+ if serial_map and serial_map_file:
+ raise ValueError('Cannot specify both serial_map and serial_map_file')
+
+ if serial_map_file:
+ serial_map = ReadSerialMapFile(serial_map_file)
+
+ tty_string = _PhoneToPathMap(serial, serial_map, devtree)
+
+ if not tty_string:
+ raise battor_error.BattOrError(
+ 'No device with given serial number detected.')
+
+ if IsBattOr(tty_string, devtree):
+ return '/dev/' + tty_string
+ else:
+ raise battor_error.BattOrError(
+ 'Device with given serial number is not a BattOr.')
+
+if __name__ == '__main__':
+ # Main function for testing purposes
+ print GenerateSerialMap()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/cmd_helper.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/cmd_helper.py
new file mode 100644
index 0000000..0b6ccd9
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/cmd_helper.py
@@ -0,0 +1,451 @@
+# Copyright (c) 2012 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""A wrapper for subprocess to make calling shell commands easier."""
+
+import logging
+import os
+import pipes
+import select
+import signal
+import string
+import StringIO
+import subprocess
+import sys
+import time
+
+
+logger = logging.getLogger(__name__)
+
+_SafeShellChars = frozenset(string.ascii_letters + string.digits + '@%_-+=:,./')
+
+
+def SingleQuote(s):
+ """Return an shell-escaped version of the string using single quotes.
+
+ Reliably quote a string which may contain unsafe characters (e.g. space,
+ quote, or other special characters such as '$').
+
+ The returned value can be used in a shell command line as one token that gets
+ to be interpreted literally.
+
+ Args:
+ s: The string to quote.
+
+ Return:
+ The string quoted using single quotes.
+ """
+ return pipes.quote(s)
+
+
+def DoubleQuote(s):
+ """Return an shell-escaped version of the string using double quotes.
+
+ Reliably quote a string which may contain unsafe characters (e.g. space
+ or quote characters), while retaining some shell features such as variable
+ interpolation.
+
+ The returned value can be used in a shell command line as one token that gets
+ to be further interpreted by the shell.
+
+ The set of characters that retain their special meaning may depend on the
+ shell implementation. This set usually includes: '$', '`', '\', '!', '*',
+ and '@'.
+
+ Args:
+ s: The string to quote.
+
+ Return:
+ The string quoted using double quotes.
+ """
+ if not s:
+ return '""'
+ elif all(c in _SafeShellChars for c in s):
+ return s
+ else:
+ return '"' + s.replace('"', '\\"') + '"'
+
+
+def ShrinkToSnippet(cmd_parts, var_name, var_value):
+ """Constructs a shell snippet for a command using a variable to shrink it.
+
+ Takes into account all quoting that needs to happen.
+
+ Args:
+ cmd_parts: A list of command arguments.
+ var_name: The variable that holds var_value.
+ var_value: The string to replace in cmd_parts with $var_name
+
+ Returns:
+ A shell snippet that does not include setting the variable.
+ """
+ def shrink(value):
+ parts = (x and SingleQuote(x) for x in value.split(var_value))
+ with_substitutions = ('"$%s"' % var_name).join(parts)
+ return with_substitutions or "''"
+
+ return ' '.join(shrink(part) for part in cmd_parts)
+
+
+def Popen(args, stdout=None, stderr=None, shell=None, cwd=None, env=None):
+ # preexec_fn isn't supported on windows.
+ if sys.platform == 'win32':
+ close_fds = (stdout is None and stderr is None)
+ preexec_fn = None
+ else:
+ close_fds = True
+ preexec_fn = lambda: signal.signal(signal.SIGPIPE, signal.SIG_DFL)
+
+ return subprocess.Popen(
+ args=args, cwd=cwd, stdout=stdout, stderr=stderr,
+ shell=shell, close_fds=close_fds, env=env, preexec_fn=preexec_fn)
+
+
+def Call(args, stdout=None, stderr=None, shell=None, cwd=None, env=None):
+ pipe = Popen(args, stdout=stdout, stderr=stderr, shell=shell, cwd=cwd,
+ env=env)
+ pipe.communicate()
+ return pipe.wait()
+
+
+def RunCmd(args, cwd=None):
+ """Opens a subprocess to execute a program and returns its return value.
+
+ Args:
+ args: A string or a sequence of program arguments. The program to execute is
+ the string or the first item in the args sequence.
+ cwd: If not None, the subprocess's current directory will be changed to
+ |cwd| before it's executed.
+
+ Returns:
+ Return code from the command execution.
+ """
+ logger.info(str(args) + ' ' + (cwd or ''))
+ return Call(args, cwd=cwd)
+
+
+def GetCmdOutput(args, cwd=None, shell=False):
+ """Open a subprocess to execute a program and returns its output.
+
+ Args:
+ args: A string or a sequence of program arguments. The program to execute is
+ the string or the first item in the args sequence.
+ cwd: If not None, the subprocess's current directory will be changed to
+ |cwd| before it's executed.
+ shell: Whether to execute args as a shell command.
+
+ Returns:
+ Captures and returns the command's stdout.
+ Prints the command's stderr to logger (which defaults to stdout).
+ """
+ (_, output) = GetCmdStatusAndOutput(args, cwd, shell)
+ return output
+
+
+def _ValidateAndLogCommand(args, cwd, shell):
+ if isinstance(args, basestring):
+ if not shell:
+ raise Exception('string args must be run with shell=True')
+ else:
+ if shell:
+ raise Exception('array args must be run with shell=False')
+ args = ' '.join(SingleQuote(c) for c in args)
+ if cwd is None:
+ cwd = ''
+ else:
+ cwd = ':' + cwd
+ logger.info('[host]%s> %s', cwd, args)
+ return args
+
+
+def GetCmdStatusAndOutput(args, cwd=None, shell=False):
+ """Executes a subprocess and returns its exit code and output.
+
+ Args:
+ args: A string or a sequence of program arguments. The program to execute is
+ the string or the first item in the args sequence.
+ cwd: If not None, the subprocess's current directory will be changed to
+ |cwd| before it's executed.
+ shell: Whether to execute args as a shell command. Must be True if args
+ is a string and False if args is a sequence.
+
+ Returns:
+ The 2-tuple (exit code, output).
+ """
+ status, stdout, stderr = GetCmdStatusOutputAndError(
+ args, cwd=cwd, shell=shell)
+
+ if stderr:
+ logger.critical('STDERR: %s', stderr)
+ logger.debug('STDOUT: %s%s', stdout[:4096].rstrip(),
+ '<truncated>' if len(stdout) > 4096 else '')
+ return (status, stdout)
+
+
+def GetCmdStatusOutputAndError(args, cwd=None, shell=False):
+ """Executes a subprocess and returns its exit code, output, and errors.
+
+ Args:
+ args: A string or a sequence of program arguments. The program to execute is
+ the string or the first item in the args sequence.
+ cwd: If not None, the subprocess's current directory will be changed to
+ |cwd| before it's executed.
+ shell: Whether to execute args as a shell command. Must be True if args
+ is a string and False if args is a sequence.
+
+ Returns:
+ The 2-tuple (exit code, output).
+ """
+ _ValidateAndLogCommand(args, cwd, shell)
+ pipe = Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
+ shell=shell, cwd=cwd)
+ stdout, stderr = pipe.communicate()
+ return (pipe.returncode, stdout, stderr)
+
+
+class TimeoutError(Exception):
+ """Module-specific timeout exception."""
+
+ def __init__(self, output=None):
+ super(TimeoutError, self).__init__()
+ self._output = output
+
+ @property
+ def output(self):
+ return self._output
+
+
+def _IterProcessStdoutFcntl(
+ process, iter_timeout=None, timeout=None, buffer_size=4096,
+ poll_interval=1):
+ """An fcntl-based implementation of _IterProcessStdout."""
+ import fcntl
+ try:
+ # Enable non-blocking reads from the child's stdout.
+ child_fd = process.stdout.fileno()
+ fl = fcntl.fcntl(child_fd, fcntl.F_GETFL)
+ fcntl.fcntl(child_fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)
+
+ end_time = (time.time() + timeout) if timeout else None
+ iter_end_time = (time.time() + iter_timeout) if iter_timeout else None
+
+ while True:
+ if end_time and time.time() > end_time:
+ raise TimeoutError()
+ if iter_end_time and time.time() > iter_end_time:
+ yield None
+ iter_end_time = time.time() + iter_timeout
+
+ if iter_end_time:
+ iter_aware_poll_interval = min(
+ poll_interval,
+ max(0, iter_end_time - time.time()))
+ else:
+ iter_aware_poll_interval = poll_interval
+
+ read_fds, _, _ = select.select(
+ [child_fd], [], [], iter_aware_poll_interval)
+ if child_fd in read_fds:
+ data = os.read(child_fd, buffer_size)
+ if not data:
+ break
+ yield data
+ if process.poll() is not None:
+ break
+ finally:
+ try:
+ if process.returncode is None:
+ # Make sure the process doesn't stick around if we fail with an
+ # exception.
+ process.kill()
+ except OSError:
+ pass
+ process.wait()
+
+
+def _IterProcessStdoutQueue(
+ process, iter_timeout=None, timeout=None, buffer_size=4096,
+ poll_interval=1):
+ """A Queue.Queue-based implementation of _IterProcessStdout.
+
+ TODO(jbudorick): Evaluate whether this is a suitable replacement for
+ _IterProcessStdoutFcntl on all platforms.
+ """
+ # pylint: disable=unused-argument
+ import Queue
+ import threading
+
+ stdout_queue = Queue.Queue()
+
+ def read_process_stdout():
+ # TODO(jbudorick): Pick an appropriate read size here.
+ while True:
+ try:
+ output_chunk = os.read(process.stdout.fileno(), buffer_size)
+ except IOError:
+ break
+ stdout_queue.put(output_chunk, True)
+ if not output_chunk and process.poll() is not None:
+ break
+
+ reader_thread = threading.Thread(target=read_process_stdout)
+ reader_thread.start()
+
+ end_time = (time.time() + timeout) if timeout else None
+
+ try:
+ while True:
+ if end_time and time.time() > end_time:
+ raise TimeoutError()
+ try:
+ s = stdout_queue.get(True, iter_timeout)
+ if not s:
+ break
+ yield s
+ except Queue.Empty:
+ yield None
+ finally:
+ try:
+ if process.returncode is None:
+ # Make sure the process doesn't stick around if we fail with an
+ # exception.
+ process.kill()
+ except OSError:
+ pass
+ process.wait()
+ reader_thread.join()
+
+
+_IterProcessStdout = (
+ _IterProcessStdoutQueue
+ if sys.platform == 'win32'
+ else _IterProcessStdoutFcntl)
+"""Iterate over a process's stdout.
+
+This is intentionally not public.
+
+Args:
+ process: The process in question.
+ iter_timeout: An optional length of time, in seconds, to wait in
+ between each iteration. If no output is received in the given
+ time, this generator will yield None.
+ timeout: An optional length of time, in seconds, during which
+ the process must finish. If it fails to do so, a TimeoutError
+ will be raised.
+ buffer_size: The maximum number of bytes to read (and thus yield) at once.
+ poll_interval: The length of time to wait in calls to `select.select`.
+ If iter_timeout is set, the remaining length of time in the iteration
+ may take precedence.
+Raises:
+ TimeoutError: if timeout is set and the process does not complete.
+Yields:
+ basestrings of data or None.
+"""
+
+
+def GetCmdStatusAndOutputWithTimeout(args, timeout, cwd=None, shell=False,
+ logfile=None):
+ """Executes a subprocess with a timeout.
+
+ Args:
+ args: List of arguments to the program, the program to execute is the first
+ element.
+ timeout: the timeout in seconds or None to wait forever.
+ cwd: If not None, the subprocess's current directory will be changed to
+ |cwd| before it's executed.
+ shell: Whether to execute args as a shell command. Must be True if args
+ is a string and False if args is a sequence.
+ logfile: Optional file-like object that will receive output from the
+ command as it is running.
+
+ Returns:
+ The 2-tuple (exit code, output).
+ Raises:
+ TimeoutError on timeout.
+ """
+ _ValidateAndLogCommand(args, cwd, shell)
+ output = StringIO.StringIO()
+ process = Popen(args, cwd=cwd, shell=shell, stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT)
+ try:
+ for data in _IterProcessStdout(process, timeout=timeout):
+ if logfile:
+ logfile.write(data)
+ output.write(data)
+ except TimeoutError:
+ raise TimeoutError(output.getvalue())
+
+ str_output = output.getvalue()
+ logger.debug('STDOUT+STDERR: %s%s', str_output[:4096].rstrip(),
+ '<truncated>' if len(str_output) > 4096 else '')
+ return process.returncode, str_output
+
+
+def IterCmdOutputLines(args, iter_timeout=None, timeout=None, cwd=None,
+ shell=False, check_status=True):
+ """Executes a subprocess and continuously yields lines from its output.
+
+ Args:
+ args: List of arguments to the program, the program to execute is the first
+ element.
+ iter_timeout: Timeout for each iteration, in seconds.
+ timeout: Timeout for the entire command, in seconds.
+ cwd: If not None, the subprocess's current directory will be changed to
+ |cwd| before it's executed.
+ shell: Whether to execute args as a shell command. Must be True if args
+ is a string and False if args is a sequence.
+ check_status: A boolean indicating whether to check the exit status of the
+ process after all output has been read.
+ Yields:
+ The output of the subprocess, line by line.
+
+ Raises:
+ CalledProcessError if check_status is True and the process exited with a
+ non-zero exit status.
+ """
+ cmd = _ValidateAndLogCommand(args, cwd, shell)
+ process = Popen(args, cwd=cwd, shell=shell, stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT)
+ return _IterCmdOutputLines(
+ process, cmd, iter_timeout=iter_timeout, timeout=timeout,
+ check_status=check_status)
+
+def _IterCmdOutputLines(process, cmd, iter_timeout=None, timeout=None,
+ check_status=True):
+ buffer_output = ''
+
+ iter_end = None
+ cur_iter_timeout = None
+ if iter_timeout:
+ iter_end = time.time() + iter_timeout
+ cur_iter_timeout = iter_timeout
+
+ for data in _IterProcessStdout(process, iter_timeout=cur_iter_timeout,
+ timeout=timeout):
+ if iter_timeout:
+ # Check whether the current iteration has timed out.
+ cur_iter_timeout = iter_end - time.time()
+ if data is None or cur_iter_timeout < 0:
+ yield None
+ iter_end = time.time() + iter_timeout
+ continue
+ else:
+ assert data is not None, (
+ 'Iteration received no data despite no iter_timeout being set. '
+ 'cmd: %s' % cmd)
+
+ # Construct lines to yield from raw data.
+ buffer_output += data
+ has_incomplete_line = buffer_output[-1] not in '\r\n'
+ lines = buffer_output.splitlines()
+ buffer_output = lines.pop() if has_incomplete_line else ''
+ for line in lines:
+ yield line
+ if iter_timeout:
+ iter_end = time.time() + iter_timeout
+
+ if buffer_output:
+ yield buffer_output
+ if check_status and process.returncode:
+ raise subprocess.CalledProcessError(process.returncode, cmd)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/cmd_helper_test.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/cmd_helper_test.py
new file mode 100644
index 0000000..b7fc8ee
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/cmd_helper_test.py
@@ -0,0 +1,264 @@
+#!/usr/bin/env python
+# Copyright 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Tests for the cmd_helper module."""
+
+import unittest
+import subprocess
+import sys
+import time
+
+from devil import devil_env
+from devil.utils import cmd_helper
+
+with devil_env.SysPath(devil_env.PYMOCK_PATH):
+ import mock # pylint: disable=import-error
+
+
+class CmdHelperSingleQuoteTest(unittest.TestCase):
+
+ def testSingleQuote_basic(self):
+ self.assertEquals('hello',
+ cmd_helper.SingleQuote('hello'))
+
+ def testSingleQuote_withSpaces(self):
+ self.assertEquals("'hello world'",
+ cmd_helper.SingleQuote('hello world'))
+
+ def testSingleQuote_withUnsafeChars(self):
+ self.assertEquals("""'hello'"'"'; rm -rf /'""",
+ cmd_helper.SingleQuote("hello'; rm -rf /"))
+
+ def testSingleQuote_dontExpand(self):
+ test_string = 'hello $TEST_VAR'
+ cmd = 'TEST_VAR=world; echo %s' % cmd_helper.SingleQuote(test_string)
+ self.assertEquals(test_string,
+ cmd_helper.GetCmdOutput(cmd, shell=True).rstrip())
+
+
+class CmdHelperDoubleQuoteTest(unittest.TestCase):
+
+ def testDoubleQuote_basic(self):
+ self.assertEquals('hello',
+ cmd_helper.DoubleQuote('hello'))
+
+ def testDoubleQuote_withSpaces(self):
+ self.assertEquals('"hello world"',
+ cmd_helper.DoubleQuote('hello world'))
+
+ def testDoubleQuote_withUnsafeChars(self):
+ self.assertEquals('''"hello\\"; rm -rf /"''',
+ cmd_helper.DoubleQuote('hello"; rm -rf /'))
+
+ def testSingleQuote_doExpand(self):
+ test_string = 'hello $TEST_VAR'
+ cmd = 'TEST_VAR=world; echo %s' % cmd_helper.DoubleQuote(test_string)
+ self.assertEquals('hello world',
+ cmd_helper.GetCmdOutput(cmd, shell=True).rstrip())
+
+
+class CmdHelperShinkToSnippetTest(unittest.TestCase):
+
+ def testShrinkToSnippet_noArgs(self):
+ self.assertEquals('foo',
+ cmd_helper.ShrinkToSnippet(['foo'], 'a', 'bar'))
+ self.assertEquals("'foo foo'",
+ cmd_helper.ShrinkToSnippet(['foo foo'], 'a', 'bar'))
+ self.assertEquals('"$a"\' bar\'',
+ cmd_helper.ShrinkToSnippet(['foo bar'], 'a', 'foo'))
+ self.assertEquals('\'foo \'"$a"',
+ cmd_helper.ShrinkToSnippet(['foo bar'], 'a', 'bar'))
+ self.assertEquals('foo"$a"',
+ cmd_helper.ShrinkToSnippet(['foobar'], 'a', 'bar'))
+
+ def testShrinkToSnippet_singleArg(self):
+ self.assertEquals("foo ''",
+ cmd_helper.ShrinkToSnippet(['foo', ''], 'a', 'bar'))
+ self.assertEquals("foo foo",
+ cmd_helper.ShrinkToSnippet(['foo', 'foo'], 'a', 'bar'))
+ self.assertEquals('"$a" "$a"',
+ cmd_helper.ShrinkToSnippet(['foo', 'foo'], 'a', 'foo'))
+ self.assertEquals('foo "$a""$a"',
+ cmd_helper.ShrinkToSnippet(['foo', 'barbar'], 'a', 'bar'))
+ self.assertEquals('foo "$a"\' \'"$a"',
+ cmd_helper.ShrinkToSnippet(['foo', 'bar bar'], 'a', 'bar'))
+ self.assertEquals('foo "$a""$a"\' \'',
+ cmd_helper.ShrinkToSnippet(['foo', 'barbar '], 'a', 'bar'))
+ self.assertEquals('foo \' \'"$a""$a"\' \'',
+ cmd_helper.ShrinkToSnippet(['foo', ' barbar '], 'a', 'bar'))
+
+
+_DEFAULT = 'DEFAULT'
+
+
+class _ProcessOutputEvent(object):
+
+ def __init__(self, select_fds=_DEFAULT, read_contents=None, ts=_DEFAULT):
+ self.select_fds = select_fds
+ self.read_contents = read_contents
+ self.ts = ts
+
+
+class _MockProcess(object):
+
+ def __init__(self, output_sequence=None, return_value=0):
+
+ # Arbitrary.
+ fake_stdout_fileno = 25
+
+ self.mock_proc = mock.MagicMock(spec=subprocess.Popen)
+ self.mock_proc.stdout = mock.MagicMock()
+ self.mock_proc.stdout.fileno = mock.MagicMock(
+ return_value=fake_stdout_fileno)
+ self.mock_proc.returncode = None
+
+ self._return_value = return_value
+
+ # This links the behavior of os.read, select.select, time.time, and
+ # <process>.poll. The output sequence can be thought of as a list of
+ # return values for select.select with corresponding return values for
+ # the other calls at any time between that select call and the following
+ # one. We iterate through the sequence only on calls to select.select.
+ #
+ # os.read is a special case, though, where we only return a given chunk
+ # of data *once* after a given call to select.
+
+ if not output_sequence:
+ output_sequence = []
+
+ # Use an leading element to make the iteration logic work.
+ initial_seq_element = _ProcessOutputEvent(
+ _DEFAULT, '',
+ output_sequence[0].ts if output_sequence else _DEFAULT)
+ output_sequence.insert(0, initial_seq_element)
+
+ for o in output_sequence:
+ if o.select_fds == _DEFAULT:
+ if o.read_contents is None:
+ o.select_fds = []
+ else:
+ o.select_fds = [fake_stdout_fileno]
+ if o.ts == _DEFAULT:
+ o.ts = time.time()
+ self._output_sequence = output_sequence
+
+ self._output_seq_index = 0
+ self._read_flags = [False] * len(output_sequence)
+
+ def read_side_effect(*_args, **_kwargs):
+ if self._read_flags[self._output_seq_index]:
+ return None
+ self._read_flags[self._output_seq_index] = True
+ return self._output_sequence[self._output_seq_index].read_contents
+
+ def select_side_effect(*_args, **_kwargs):
+ if self._output_seq_index is None:
+ self._output_seq_index = 0
+ else:
+ self._output_seq_index += 1
+ return (self._output_sequence[self._output_seq_index].select_fds,
+ None, None)
+
+ def time_side_effect(*_args, **_kwargs):
+ return self._output_sequence[self._output_seq_index].ts
+
+ def poll_side_effect(*_args, **_kwargs):
+ if self._output_seq_index >= len(self._output_sequence) - 1:
+ self.mock_proc.returncode = self._return_value
+ return self.mock_proc.returncode
+
+ mock_read = mock.MagicMock(side_effect=read_side_effect)
+ mock_select = mock.MagicMock(side_effect=select_side_effect)
+ mock_time = mock.MagicMock(side_effect=time_side_effect)
+ self.mock_proc.poll = mock.MagicMock(side_effect=poll_side_effect)
+
+ # Set up but *do not start* the mocks.
+ self._mocks = [
+ mock.patch('os.read', new=mock_read),
+ mock.patch('select.select', new=mock_select),
+ mock.patch('time.time', new=mock_time),
+ ]
+ if sys.platform != 'win32':
+ self._mocks.append(mock.patch('fcntl.fcntl'))
+
+ def __enter__(self):
+ for m in self._mocks:
+ m.__enter__()
+ return self.mock_proc
+
+ def __exit__(self, exc_type, exc_val, exc_tb):
+ for m in reversed(self._mocks):
+ m.__exit__(exc_type, exc_val, exc_tb)
+
+
+class CmdHelperIterCmdOutputLinesTest(unittest.TestCase):
+ """Test IterCmdOutputLines with some calls to the unix 'seq' command."""
+
+ # This calls _IterCmdOutputLines rather than IterCmdOutputLines s.t. it
+ # can mock the process.
+ # pylint: disable=protected-access
+
+ _SIMPLE_OUTPUT_SEQUENCE = [
+ _ProcessOutputEvent(read_contents='1\n2\n'),
+ ]
+
+ def testIterCmdOutputLines_success(self):
+ with _MockProcess(
+ output_sequence=self._SIMPLE_OUTPUT_SEQUENCE) as mock_proc:
+ for num, line in enumerate(
+ cmd_helper._IterCmdOutputLines(mock_proc, 'mock_proc'), 1):
+ self.assertEquals(num, int(line))
+
+ def testIterCmdOutputLines_exitStatusFail(self):
+ with self.assertRaises(subprocess.CalledProcessError):
+ with _MockProcess(output_sequence=self._SIMPLE_OUTPUT_SEQUENCE,
+ return_value=1) as mock_proc:
+ for num, line in enumerate(
+ cmd_helper._IterCmdOutputLines(mock_proc, 'mock_proc'), 1):
+ self.assertEquals(num, int(line))
+ # after reading all the output we get an exit status of 1
+
+ def testIterCmdOutputLines_exitStatusIgnored(self):
+ with _MockProcess(output_sequence=self._SIMPLE_OUTPUT_SEQUENCE,
+ return_value=1) as mock_proc:
+ for num, line in enumerate(
+ cmd_helper._IterCmdOutputLines(
+ mock_proc, 'mock_proc', check_status=False),
+ 1):
+ self.assertEquals(num, int(line))
+
+ def testIterCmdOutputLines_exitStatusSkipped(self):
+ with _MockProcess(output_sequence=self._SIMPLE_OUTPUT_SEQUENCE,
+ return_value=1) as mock_proc:
+ for num, line in enumerate(
+ cmd_helper._IterCmdOutputLines(mock_proc, 'mock_proc'), 1):
+ self.assertEquals(num, int(line))
+ # no exception will be raised because we don't attempt to read past
+ # the end of the output and, thus, the status never gets checked
+ if num == 2:
+ break
+
+ def testIterCmdOutputLines_delay(self):
+ output_sequence = [
+ _ProcessOutputEvent(read_contents='1\n2\n', ts=1),
+ _ProcessOutputEvent(read_contents=None, ts=2),
+ _ProcessOutputEvent(read_contents='Awake', ts=10),
+ ]
+ with _MockProcess(output_sequence=output_sequence) as mock_proc:
+ for num, line in enumerate(
+ cmd_helper._IterCmdOutputLines(mock_proc, 'mock_proc',
+ iter_timeout=5), 1):
+ if num <= 2:
+ self.assertEquals(num, int(line))
+ elif num == 3:
+ self.assertEquals(None, line)
+ elif num == 4:
+ self.assertEquals('Awake', line)
+ else:
+ self.fail()
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/file_utils.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/file_utils.py
new file mode 100644
index 0000000..dc5a9ef
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/file_utils.py
@@ -0,0 +1,31 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+
+
+def MergeFiles(dest_file, source_files):
+ """Merge list of files into single destination file.
+
+ Args:
+ dest_file: File to be written to.
+ source_files: List of files to be merged. Will be merged in the order they
+ appear in the list.
+ """
+ if not os.path.exists(os.path.dirname(dest_file)):
+ os.makedirs(os.path.dirname(dest_file))
+ try:
+ with open(dest_file, 'w') as dest_f:
+ for source_file in source_files:
+ with open(source_file, 'r') as source_f:
+ dest_f.write(source_f.read())
+ except Exception as e: # pylint: disable=broad-except
+ # Something went wrong when creating dest_file. Cleaning up.
+ try:
+ os.remove(dest_file)
+ except OSError:
+ pass
+ raise e
+
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/find_usb_devices.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/find_usb_devices.py
new file mode 100644
index 0000000..28a2eb8
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/find_usb_devices.py
@@ -0,0 +1,538 @@
+#!/usr/bin/python
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import argparse
+import os
+import re
+import sys
+
+if __name__ == '__main__':
+ sys.path.append(
+ os.path.abspath(os.path.join(os.path.dirname(__file__),
+ '..', '..')))
+
+from devil.utils import cmd_helper
+from devil.utils import usb_hubs
+from devil.utils import lsusb
+
+# Note: In the documentation below, "virtual port" refers to the port number
+# as observed by the system (e.g. by usb-devices) and "physical port" refers
+# to the physical numerical label on the physical port e.g. on a USB hub.
+# The mapping between virtual and physical ports is not always the identity
+# (e.g. the port labeled "1" on a USB hub does not always show up as "port 1"
+# when you plug something into it) but, as far as we are aware, the mapping
+# between virtual and physical ports is always the same for a given
+# model of USB hub. When "port number" is referenced without specifying, it
+# means the virtual port number.
+
+
+# Wrapper functions for system commands to get output. These are in wrapper
+# functions so that they can be more easily mocked-out for tests.
+def _GetParsedLSUSBOutput():
+ return lsusb.lsusb()
+
+
+def _GetUSBDevicesOutput():
+ return cmd_helper.GetCmdOutput(['usb-devices'])
+
+
+def _GetTtyUSBInfo(tty_string):
+ cmd = ['udevadm', 'info', '--name=/dev/' + tty_string, '--attribute-walk']
+ return cmd_helper.GetCmdOutput(cmd)
+
+
+def _GetCommList():
+ return cmd_helper.GetCmdOutput('ls /dev', shell=True)
+
+
+def GetTTYList():
+ return [x for x in _GetCommList().splitlines() if 'ttyUSB' in x]
+
+
+# Class to identify nodes in the USB topology. USB topology is organized as
+# a tree.
+class USBNode(object):
+ def __init__(self):
+ self._port_to_node = {}
+
+ @property
+ def desc(self):
+ raise NotImplementedError
+
+ @property
+ def info(self):
+ raise NotImplementedError
+
+ @property
+ def device_num(self):
+ raise NotImplementedError
+
+ @property
+ def bus_num(self):
+ raise NotImplementedError
+
+ def HasPort(self, port):
+ """Determines if this device has a device connected to the given port."""
+ return port in self._port_to_node
+
+ def PortToDevice(self, port):
+ """Gets the device connected to the given port on this device."""
+ return self._port_to_node[port]
+
+ def Display(self, port_chain='', info=False):
+ """Displays information about this node and its descendants.
+
+ Output format is, e.g. 1:3:3:Device 42 (ID 1234:5678 Some Device)
+ meaning that from the bus, if you look at the device connected
+ to port 1, then the device connected to port 3 of that,
+ then the device connected to port 3 of that, you get the device
+ assigned device number 42, which is Some Device. Note that device
+ numbers will be reassigned whenever a connected device is powercycled
+ or reinserted, but port numbers stay the same as long as the device
+ is reinserted back into the same physical port.
+
+ Args:
+ port_chain: [string] Chain of ports from bus to this node (e.g. '2:4:')
+ info: [bool] Whether to display detailed info as well.
+ """
+ raise NotImplementedError
+
+ def AddChild(self, port, device):
+ """Adds child to the device tree.
+
+ Args:
+ port: [int] Port number of the device.
+ device: [USBDeviceNode] Device to add.
+
+ Raises:
+ ValueError: If device already has a child at the given port.
+ """
+ if self.HasPort(port):
+ raise ValueError('Duplicate port number')
+ else:
+ self._port_to_node[port] = device
+
+ def AllNodes(self):
+ """Generator that yields this node and all of its descendants.
+
+ Yields:
+ [USBNode] First this node, then each of its descendants (recursively)
+ """
+ yield self
+ for child_node in self._port_to_node.values():
+ for descendant_node in child_node.AllNodes():
+ yield descendant_node
+
+ def FindDeviceNumber(self, findnum):
+ """Find device with given number in tree
+
+ Searches the portion of the device tree rooted at this node for
+ a device with the given device number.
+
+ Args:
+ findnum: [int] Device number to search for.
+
+ Returns:
+ [USBDeviceNode] Node that is found.
+ """
+ for node in self.AllNodes():
+ if node.device_num == findnum:
+ return node
+ return None
+
+
+class USBDeviceNode(USBNode):
+ def __init__(self, bus_num=0, device_num=0, serial=None, info=None):
+ """Class that represents a device in USB tree.
+
+ Args:
+ bus_num: [int] Bus number that this node is attached to.
+ device_num: [int] Device number of this device (or 0, if this is a bus)
+ serial: [string] Serial number.
+ info: [dict] Map giving detailed device info.
+ """
+ super(USBDeviceNode, self).__init__()
+ self._bus_num = bus_num
+ self._device_num = device_num
+ self._serial = serial
+ self._info = {} if info is None else info
+
+ #override
+ @property
+ def desc(self):
+ return self._info.get('desc')
+
+ #override
+ @property
+ def info(self):
+ return self._info
+
+ #override
+ @property
+ def device_num(self):
+ return self._device_num
+
+ #override
+ @property
+ def bus_num(self):
+ return self._bus_num
+
+ @property
+ def serial(self):
+ return self._serial
+
+ @serial.setter
+ def serial(self, serial):
+ self._serial = serial
+
+ #override
+ def Display(self, port_chain='', info=False):
+ print '%s Device %d (%s)' % (port_chain, self.device_num, self.desc)
+ if info:
+ print self.info
+ for (port, device) in self._port_to_node.iteritems():
+ device.Display('%s%d:' % (port_chain, port), info=info)
+
+
+class USBBusNode(USBNode):
+ def __init__(self, bus_num=0):
+ """Class that represents a node (either a bus or device) in USB tree.
+
+ Args:
+ is_bus: [bool] If true, node is bus; if not, node is device.
+ bus_num: [int] Bus number that this node is attached to.
+ device_num: [int] Device number of this device (or 0, if this is a bus)
+ desc: [string] Short description of device.
+ serial: [string] Serial number.
+ info: [dict] Map giving detailed device info.
+ port_to_dev: [dict(int:USBDeviceNode)]
+ Maps port # to device connected to port.
+ """
+ super(USBBusNode, self).__init__()
+ self._bus_num = bus_num
+
+ #override
+ @property
+ def desc(self):
+ return 'BUS %d' % self._bus_num
+
+ #override
+ @property
+ def info(self):
+ return {}
+
+ #override
+ @property
+ def device_num(self):
+ return -1
+
+ #override
+ @property
+ def bus_num(self):
+ return self._bus_num
+
+ #override
+ def Display(self, port_chain='', info=False):
+ print "=== %s ===" % self.desc
+ for (port, device) in self._port_to_node.iteritems():
+ device.Display('%s%d:' % (port_chain, port), info=info)
+
+
+_T_LINE_REGEX = re.compile(r'T: Bus=(?P<bus>\d{2}) Lev=(?P<lev>\d{2}) '
+ r'Prnt=(?P<prnt>\d{2,3}) Port=(?P<port>\d{2}) '
+ r'Cnt=(?P<cnt>\d{2}) Dev#=(?P<dev>.{3}) .*')
+
+_S_LINE_REGEX = re.compile(r'S: SerialNumber=(?P<serial>.*)')
+_LSUSB_BUS_DEVICE_RE = re.compile(r'^Bus (\d{3}) Device (\d{3}): (.*)')
+
+
+def GetBusNumberToDeviceTreeMap(fast=True):
+ """Gets devices currently attached.
+
+ Args:
+ fast [bool]: whether to do it fast (only get description, not
+ the whole dictionary, from lsusb)
+
+ Returns:
+ map of {bus number: bus object}
+ where the bus object has all the devices attached to it in a tree.
+ """
+ if fast:
+ info_map = {}
+ for line in lsusb.raw_lsusb().splitlines():
+ match = _LSUSB_BUS_DEVICE_RE.match(line)
+ if match:
+ info_map[(int(match.group(1)), int(match.group(2)))] = (
+ {'desc':match.group(3)})
+ else:
+ info_map = {((int(line['bus']), int(line['device']))): line
+ for line in _GetParsedLSUSBOutput()}
+
+
+ tree = {}
+ bus_num = -1
+ for line in _GetUSBDevicesOutput().splitlines():
+ match = _T_LINE_REGEX.match(line)
+ if match:
+ bus_num = int(match.group('bus'))
+ parent_num = int(match.group('prnt'))
+ # usb-devices starts counting ports from 0, so add 1
+ port_num = int(match.group('port')) + 1
+ device_num = int(match.group('dev'))
+
+ # create new bus if necessary
+ if bus_num not in tree:
+ tree[bus_num] = USBBusNode(bus_num=bus_num)
+
+ # create the new device
+ new_device = USBDeviceNode(bus_num=bus_num,
+ device_num=device_num,
+ info=info_map.get((bus_num, device_num),
+ {'desc': 'NOT AVAILABLE'}))
+
+ # add device to bus
+ if parent_num != 0:
+ tree[bus_num].FindDeviceNumber(parent_num).AddChild(
+ port_num, new_device)
+ else:
+ tree[bus_num].AddChild(port_num, new_device)
+
+ match = _S_LINE_REGEX.match(line)
+ if match:
+ if bus_num == -1:
+ raise ValueError('S line appears before T line in input file')
+ # put the serial number in the device
+ tree[bus_num].FindDeviceNumber(device_num).serial = match.group('serial')
+
+ return tree
+
+
+def GetHubsOnBus(bus, hub_types):
+ """Scans for all hubs on a bus of given hub types.
+
+ Args:
+ bus: [USBNode] Bus object.
+ hub_types: [iterable(usb_hubs.HubType)] Possible types of hubs.
+
+ Yields:
+ Sequence of tuples representing (hub, type of hub)
+ """
+ for device in bus.AllNodes():
+ for hub_type in hub_types:
+ if hub_type.IsType(device):
+ yield (device, hub_type)
+
+
+def GetPhysicalPortToNodeMap(hub, hub_type):
+ """Gets physical-port:node mapping for a given hub.
+ Args:
+ hub: [USBNode] Hub to get map for.
+ hub_type: [usb_hubs.HubType] Which type of hub it is.
+
+ Returns:
+ Dict of {physical port: node}
+ """
+ port_device = hub_type.GetPhysicalPortToNodeTuples(hub)
+ return {port: device for (port, device) in port_device}
+
+
+def GetPhysicalPortToBusDeviceMap(hub, hub_type):
+ """Gets physical-port:(bus#, device#) mapping for a given hub.
+ Args:
+ hub: [USBNode] Hub to get map for.
+ hub_type: [usb_hubs.HubType] Which type of hub it is.
+
+ Returns:
+ Dict of {physical port: (bus number, device number)}
+ """
+ port_device = hub_type.GetPhysicalPortToNodeTuples(hub)
+ return {port: (device.bus_num, device.device_num)
+ for (port, device) in port_device}
+
+
+def GetPhysicalPortToSerialMap(hub, hub_type):
+ """Gets physical-port:serial# mapping for a given hub.
+
+ Args:
+ hub: [USBNode] Hub to get map for.
+ hub_type: [usb_hubs.HubType] Which type of hub it is.
+
+ Returns:
+ Dict of {physical port: serial number)}
+ """
+ port_device = hub_type.GetPhysicalPortToNodeTuples(hub)
+ return {port: device.serial
+ for (port, device) in port_device
+ if device.serial}
+
+
+def GetPhysicalPortToTTYMap(device, hub_type):
+ """Gets physical-port:tty-string mapping for a given hub.
+ Args:
+ hub: [USBNode] Hub to get map for.
+ hub_type: [usb_hubs.HubType] Which type of hub it is.
+
+ Returns:
+ Dict of {physical port: tty-string)}
+ """
+ port_device = hub_type.GetPhysicalPortToNodeTuples(device)
+ bus_device_to_tty = GetBusDeviceToTTYMap()
+ return {port: bus_device_to_tty[(device.bus_num, device.device_num)]
+ for (port, device) in port_device
+ if (device.bus_num, device.device_num) in bus_device_to_tty}
+
+
+def CollectHubMaps(hub_types, map_func, device_tree_map=None, fast=False):
+ """Runs a function on all hubs in the system and collects their output.
+
+ Args:
+ hub_types: [usb_hubs.HubType] List of possible hub types.
+ map_func: [string] Function to run on each hub.
+ device_tree: Previously constructed device tree map, if any.
+ fast: Whether to construct device tree fast, if not already provided
+
+ Yields:
+ Sequence of dicts of {physical port: device} where the type of
+ device depends on the ident keyword. Each dict is a separate hub.
+ """
+ if device_tree_map is None:
+ device_tree_map = GetBusNumberToDeviceTreeMap(fast=fast)
+ for bus in device_tree_map.values():
+ for (hub, hub_type) in GetHubsOnBus(bus, hub_types):
+ yield map_func(hub, hub_type)
+
+
+def GetAllPhysicalPortToNodeMaps(hub_types, **kwargs):
+ return CollectHubMaps(hub_types, GetPhysicalPortToNodeMap, **kwargs)
+
+
+def GetAllPhysicalPortToBusDeviceMaps(hub_types, **kwargs):
+ return CollectHubMaps(hub_types, GetPhysicalPortToBusDeviceMap, **kwargs)
+
+
+def GetAllPhysicalPortToSerialMaps(hub_types, **kwargs):
+ return CollectHubMaps(hub_types, GetPhysicalPortToSerialMap, **kwargs)
+
+
+def GetAllPhysicalPortToTTYMaps(hub_types, **kwargs):
+ return CollectHubMaps(hub_types, GetPhysicalPortToTTYMap, **kwargs)
+
+
+_BUS_NUM_REGEX = re.compile(r'.*ATTRS{busnum}=="(\d*)".*')
+_DEVICE_NUM_REGEX = re.compile(r'.*ATTRS{devnum}=="(\d*)".*')
+
+
+def GetBusDeviceFromTTY(tty_string):
+ """Gets bus and device number connected to a ttyUSB port.
+
+ Args:
+ tty_string: [String] Identifier for ttyUSB (e.g. 'ttyUSB0')
+
+ Returns:
+ Tuple (bus, device) giving device connected to that ttyUSB.
+
+ Raises:
+ ValueError: If bus and device information could not be found.
+ """
+ bus_num = None
+ device_num = None
+ # Expected output of GetCmdOutput should be something like:
+ # looking at device /devices/something/.../.../...
+ # KERNELS="ttyUSB0"
+ # SUBSYSTEMS=...
+ # DRIVERS=...
+ # ATTRS{foo}=...
+ # ATTRS{bar}=...
+ # ...
+ for line in _GetTtyUSBInfo(tty_string).splitlines():
+ bus_match = _BUS_NUM_REGEX.match(line)
+ device_match = _DEVICE_NUM_REGEX.match(line)
+ if bus_match and bus_num == None:
+ bus_num = int(bus_match.group(1))
+ if device_match and device_num == None:
+ device_num = int(device_match.group(1))
+ if bus_num is None or device_num is None:
+ raise ValueError('Info not found')
+ return (bus_num, device_num)
+
+
+def GetBusDeviceToTTYMap():
+ """Gets all mappings from (bus, device) to ttyUSB string.
+
+ Gets mapping from (bus, device) to ttyUSB string (e.g. 'ttyUSB0'),
+ for all ttyUSB strings currently active.
+
+ Returns:
+ [dict] Dict that maps (bus, device) to ttyUSB string
+ """
+ result = {}
+ for tty in GetTTYList():
+ result[GetBusDeviceFromTTY(tty)] = tty
+ return result
+
+
+# This dictionary described the mapping between physical and
+# virtual ports on a Plugable 7-Port Hub (model USB2-HUB7BC).
+# Keys are the virtual ports, values are the physical port.
+# The entry 4:{1:4, 2:3, 3:2, 4:1} indicates that virtual port
+# 4 connects to another 'virtual' hub that itself has the
+# virtual-to-physical port mapping {1:4, 2:3, 3:2, 4:1}.
+
+
+def TestUSBTopologyScript():
+ """Test display and hub identification."""
+ # Identification criteria for Plugable 7-Port Hub
+ print '==== USB TOPOLOGY SCRIPT TEST ===='
+
+ # Display devices
+ print '==== DEVICE DISPLAY ===='
+ device_trees = GetBusNumberToDeviceTreeMap()
+ for device_tree in device_trees.values():
+ device_tree.Display()
+ print
+
+ # Display TTY information about devices plugged into hubs.
+ print '==== TTY INFORMATION ===='
+ for port_map in GetAllPhysicalPortToTTYMaps(
+ usb_hubs.ALL_HUBS, device_tree_map=device_trees):
+ print port_map
+ print
+
+ # Display serial number information about devices plugged into hubs.
+ print '==== SERIAL NUMBER INFORMATION ===='
+ for port_map in GetAllPhysicalPortToSerialMaps(
+ usb_hubs.ALL_HUBS, device_tree_map=device_trees):
+ print port_map
+
+
+ return 0
+
+
+def parse_options(argv):
+ """Parses and checks the command-line options.
+
+ Returns:
+ A tuple containing the options structure and a list of categories to
+ be traced.
+ """
+ USAGE = '''./find_usb_devices [--help]
+ This script shows the mapping between USB devices and port numbers.
+ Clients are not intended to call this script from the command line.
+ Clients are intended to call the functions in this script directly.
+ For instance, GetAllPhysicalPortToSerialMaps(...)
+ Running this script with --help will display this message.
+ Running this script without --help will display information about
+ devices attached, TTY mapping, and serial number mapping,
+ for testing purposes. See design document for API documentation.
+ '''
+ parser = argparse.ArgumentParser(usage=USAGE)
+ return parser.parse_args(argv[1:])
+
+def main():
+ parse_options(sys.argv)
+ TestUSBTopologyScript()
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/find_usb_devices_test.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/find_usb_devices_test.py
new file mode 100644
index 0000000..e8b00c8
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/find_usb_devices_test.py
@@ -0,0 +1,379 @@
+#!/usr/bin/env python
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# pylint: disable=protected-access
+
+"""
+Unit tests for the contents of find_usb_devices.py.
+
+Device tree for these tests is as follows:
+Bus 001:
+1: Device 011 "foo"
+2: Device 012 "bar"
+3: Device 013 "baz"
+
+Bus 002:
+1: Device 011 "quux"
+2: Device 020 "My Test HUB" #hub 1
+2:1: Device 021 "battor_p7_h1_t0" #physical port 7 on hub 1, on ttyUSB0
+2:3: Device 022 "battor_p5_h1_t1" #physical port 5 on hub 1, on ttyUSB1
+2:4: Device 023 "My Test Internal HUB" #internal section of hub 1
+2:4:2: Device 024 "battor_p3_h1_t2" #physical port 3 on hub 1, on ttyUSB2
+2:4:3: Device 026 "Not a Battery Monitor" #physical port 1 on hub 1, on ttyUSB3
+2:4:4: Device 025 "battor_p1_h1_t3" #physical port 1 on hub 1, on ttyUSB3
+3: Device 100 "My Test HUB" #hub 2
+3:4: Device 101 "My Test Internal HUB" #internal section of hub 2
+3:4:4: Device 102 "battor_p1_h2_t4" #physical port 1 on hub 2, on ttyusb4
+"""
+
+import logging
+import os
+import unittest
+
+from devil import devil_env
+from devil.utils import battor_device_mapping
+from devil.utils import find_usb_devices
+from devil.utils import lsusb
+from devil.utils import usb_hubs
+
+with devil_env.SysPath(devil_env.PYMOCK_PATH):
+ import mock # pylint: disable=import-error
+
+# Output of lsusb.lsusb().
+# We just test that the dictionary is working by creating an
+# "ID number" equal to (bus_num*1000)+device_num and seeing if
+# it is picked up correctly. Also we test the description
+
+DEVLIST = [(1, 11, 'foo'),
+ (1, 12, 'bar'),
+ (1, 13, 'baz'),
+ (2, 11, 'quux'),
+ (2, 20, 'My Test HUB'),
+ (2, 21, 'ID 0403:6001 battor_p7_h1_t0'),
+ (2, 22, 'ID 0403:6001 battor_p5_h1_t1'),
+ (2, 23, 'My Test Internal HUB'),
+ (2, 24, 'ID 0403:6001 battor_p3_h1_t2'),
+ (2, 25, 'ID 0403:6001 battor_p1_h1_t3'),
+ (2, 26, 'Not a Battery Monitor'),
+ (2, 100, 'My Test HUB'),
+ (2, 101, 'My Test Internal HUB'),
+ (2, 102, 'ID 0403:6001 battor_p1_h1_t4')]
+
+LSUSB_OUTPUT = [
+ {'bus': b, 'device': d, 'desc': t, 'id': (1000*b)+d}
+ for (b, d, t) in DEVLIST]
+
+
+# Note: "Lev", "Cnt", "Spd", and "MxCh" are not used by parser,
+# so we just leave them as zeros here. Also note that the port
+# numbers reported here start at 0, so they're 1 less than the
+# port numbers reported elsewhere.
+USB_DEVICES_OUTPUT = '''
+T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 11 Spd=000 MxCh=00
+S: SerialNumber=FooSerial
+T: Bus=01 Lev=00 Prnt=00 Port=01 Cnt=00 Dev#= 12 Spd=000 MxCh=00
+S: SerialNumber=BarSerial
+T: Bus=01 Lev=00 Prnt=00 Port=02 Cnt=00 Dev#= 13 Spd=000 MxCh=00
+S: SerialNumber=BazSerial
+
+T: Bus=02 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 11 Spd=000 MxCh=00
+
+T: Bus=02 Lev=00 Prnt=00 Port=01 Cnt=00 Dev#= 20 Spd=000 MxCh=00
+T: Bus=02 Lev=00 Prnt=20 Port=00 Cnt=00 Dev#= 21 Spd=000 MxCh=00
+S: SerialNumber=BattOr0
+T: Bus=02 Lev=00 Prnt=20 Port=02 Cnt=00 Dev#= 22 Spd=000 MxCh=00
+S: SerialNumber=BattOr1
+T: Bus=02 Lev=00 Prnt=20 Port=03 Cnt=00 Dev#= 23 Spd=000 MxCh=00
+T: Bus=02 Lev=00 Prnt=23 Port=01 Cnt=00 Dev#= 24 Spd=000 MxCh=00
+S: SerialNumber=BattOr2
+T: Bus=02 Lev=00 Prnt=23 Port=03 Cnt=00 Dev#= 25 Spd=000 MxCh=00
+S: SerialNumber=BattOr3
+T: Bus=02 Lev=00 Prnt=23 Port=02 Cnt=00 Dev#= 26 Spd=000 MxCh=00
+
+T: Bus=02 Lev=00 Prnt=00 Port=02 Cnt=00 Dev#=100 Spd=000 MxCh=00
+T: Bus=02 Lev=00 Prnt=100 Port=03 Cnt=00 Dev#=101 Spd=000 MxCh=00
+T: Bus=02 Lev=00 Prnt=101 Port=03 Cnt=00 Dev#=102 Spd=000 MxCh=00
+'''
+
+RAW_LSUSB_OUTPUT = '''
+Bus 001 Device 011: FAST foo
+Bus 001 Device 012: FAST bar
+Bus 001 Device 013: baz
+Bus 002 Device 011: quux
+Bus 002 Device 020: My Test HUB
+Bus 002 Device 021: ID 0403:6001 battor_p7_h1_t0
+Bus 002 Device 022: ID 0403:6001 battor_p5_h1_t1
+Bus 002 Device 023: My Test Internal HUB
+Bus 002 Device 024: ID 0403:6001 battor_p3_h1_t2
+Bus 002 Device 025: ID 0403:6001 battor_p1_h1_t3
+Bus 002 Device 026: Not a Battery Monitor
+Bus 002 Device 100: My Test HUB
+Bus 002 Device 101: My Test Internal HUB
+Bus 002 Device 102: ID 0403:6001 battor_p1_h1_t4
+'''
+
+LIST_TTY_OUTPUT = '''
+ttyUSB0
+Something-else-0
+ttyUSB1
+ttyUSB2
+Something-else-1
+ttyUSB3
+ttyUSB4
+Something-else-2
+ttyUSB5
+'''
+
+# Note: The real output will have multiple lines with
+# ATTRS{busnum} and ATTRS{devnum}, but only the first
+# one counts. Thus the test output duplicates this.
+UDEVADM_USBTTY0_OUTPUT = '''
+ATTRS{busnum}=="2"
+ATTRS{devnum}=="21"
+ATTRS{busnum}=="0"
+ATTRS{devnum}=="0"
+'''
+
+UDEVADM_USBTTY1_OUTPUT = '''
+ATTRS{busnum}=="2"
+ATTRS{devnum}=="22"
+ATTRS{busnum}=="0"
+ATTRS{devnum}=="0"
+'''
+
+UDEVADM_USBTTY2_OUTPUT = '''
+ATTRS{busnum}=="2"
+ATTRS{devnum}=="24"
+ATTRS{busnum}=="0"
+ATTRS{devnum}=="0"
+'''
+
+UDEVADM_USBTTY3_OUTPUT = '''
+ATTRS{busnum}=="2"
+ATTRS{devnum}=="25"
+ATTRS{busnum}=="0"
+ATTRS{devnum}=="0"
+'''
+
+UDEVADM_USBTTY4_OUTPUT = '''
+ATTRS{busnum}=="2"
+ATTRS{devnum}=="102"
+ATTRS{busnum}=="0"
+ATTRS{devnum}=="0"
+'''
+
+UDEVADM_USBTTY5_OUTPUT = '''
+ATTRS{busnum}=="2"
+ATTRS{devnum}=="26"
+ATTRS{busnum}=="0"
+ATTRS{devnum}=="0"
+'''
+
+UDEVADM_OUTPUT_DICT = {
+ 'ttyUSB0': UDEVADM_USBTTY0_OUTPUT,
+ 'ttyUSB1': UDEVADM_USBTTY1_OUTPUT,
+ 'ttyUSB2': UDEVADM_USBTTY2_OUTPUT,
+ 'ttyUSB3': UDEVADM_USBTTY3_OUTPUT,
+ 'ttyUSB4': UDEVADM_USBTTY4_OUTPUT,
+ 'ttyUSB5': UDEVADM_USBTTY5_OUTPUT}
+
+# Identification criteria for Plugable 7-Port Hub
+def isTestHub(node):
+ """Check if a node is a Plugable 7-Port Hub
+ (Model USB2-HUB7BC)
+ The topology of this device is a 4-port hub,
+ with another 4-port hub connected on port 4.
+ """
+ if not isinstance(node, find_usb_devices.USBDeviceNode):
+ return False
+ if 'Test HUB' not in node.desc:
+ return False
+ if not node.HasPort(4):
+ return False
+ return 'Test Internal HUB' in node.PortToDevice(4).desc
+
+TEST_HUB = usb_hubs.HubType(isTestHub,
+ {1:7,
+ 2:6,
+ 3:5,
+ 4:{1:4, 2:3, 3:2, 4:1}})
+
+class USBScriptTest(unittest.TestCase):
+ def setUp(self):
+ find_usb_devices._GetTtyUSBInfo = mock.Mock(
+ side_effect=lambda x: UDEVADM_OUTPUT_DICT[x])
+ find_usb_devices._GetParsedLSUSBOutput = mock.Mock(
+ return_value=LSUSB_OUTPUT)
+ find_usb_devices._GetUSBDevicesOutput = mock.Mock(
+ return_value=USB_DEVICES_OUTPUT)
+ find_usb_devices._GetCommList = mock.Mock(
+ return_value=LIST_TTY_OUTPUT)
+ lsusb.raw_lsusb = mock.Mock(
+ return_value=RAW_LSUSB_OUTPUT)
+
+ def testIsBattOr(self):
+ bd = find_usb_devices.GetBusNumberToDeviceTreeMap()
+ self.assertTrue(battor_device_mapping.IsBattOr('ttyUSB3', bd))
+ self.assertFalse(battor_device_mapping.IsBattOr('ttyUSB5', bd))
+
+ def testGetBattOrs(self):
+ bd = find_usb_devices.GetBusNumberToDeviceTreeMap()
+ self.assertEquals(battor_device_mapping.GetBattOrList(bd),
+ ['ttyUSB0', 'ttyUSB1', 'ttyUSB2',
+ 'ttyUSB3', 'ttyUSB4'])
+
+ def testGetTTYDevices(self):
+ pp = find_usb_devices.GetAllPhysicalPortToTTYMaps([TEST_HUB])
+ result = list(pp)
+ self.assertEquals(result[0], {7:'ttyUSB0',
+ 5:'ttyUSB1',
+ 3:'ttyUSB2',
+ 2:'ttyUSB5',
+ 1:'ttyUSB3'})
+ self.assertEquals(result[1], {1:'ttyUSB4'})
+
+ def testGetPortDeviceMapping(self):
+ pp = find_usb_devices.GetAllPhysicalPortToBusDeviceMaps([TEST_HUB])
+ result = list(pp)
+ self.assertEquals(result[0], {7:(2, 21),
+ 5:(2, 22),
+ 3:(2, 24),
+ 2:(2, 26),
+ 1:(2, 25)})
+ self.assertEquals(result[1], {1:(2, 102)})
+
+ def testGetSerialMapping(self):
+ pp = find_usb_devices.GetAllPhysicalPortToSerialMaps([TEST_HUB])
+ result = list(pp)
+ self.assertEquals(result[0], {7:'BattOr0',
+ 5:'BattOr1',
+ 3:'BattOr2',
+ 1:'BattOr3'})
+ self.assertEquals(result[1], {})
+
+ def testFastDeviceDescriptions(self):
+ bd = find_usb_devices.GetBusNumberToDeviceTreeMap()
+ dev_foo = bd[1].FindDeviceNumber(11)
+ dev_bar = bd[1].FindDeviceNumber(12)
+ dev_battor_p7_h1_t0 = bd[2].FindDeviceNumber(21)
+ self.assertEquals(dev_foo.desc, 'FAST foo')
+ self.assertEquals(dev_bar.desc, 'FAST bar')
+ self.assertEquals(dev_battor_p7_h1_t0.desc,
+ 'ID 0403:6001 battor_p7_h1_t0')
+
+ def testDeviceDescriptions(self):
+ bd = find_usb_devices.GetBusNumberToDeviceTreeMap(fast=False)
+ dev_foo = bd[1].FindDeviceNumber(11)
+ dev_bar = bd[1].FindDeviceNumber(12)
+ dev_battor_p7_h1_t0 = bd[2].FindDeviceNumber(21)
+ self.assertEquals(dev_foo.desc, 'foo')
+ self.assertEquals(dev_bar.desc, 'bar')
+ self.assertEquals(dev_battor_p7_h1_t0.desc,
+ 'ID 0403:6001 battor_p7_h1_t0')
+
+ def testDeviceInformation(self):
+ bd = find_usb_devices.GetBusNumberToDeviceTreeMap(fast=False)
+ dev_foo = bd[1].FindDeviceNumber(11)
+ dev_bar = bd[1].FindDeviceNumber(12)
+ dev_battor_p7_h1_t0 = bd[2].FindDeviceNumber(21)
+ self.assertEquals(dev_foo.info['id'], 1011)
+ self.assertEquals(dev_bar.info['id'], 1012)
+ self.assertEquals(dev_battor_p7_h1_t0.info['id'], 2021)
+
+ def testSerialNumber(self):
+ bd = find_usb_devices.GetBusNumberToDeviceTreeMap(fast=False)
+ dev_foo = bd[1].FindDeviceNumber(11)
+ dev_bar = bd[1].FindDeviceNumber(12)
+ dev_battor_p7_h1_t0 = bd[2].FindDeviceNumber(21)
+ self.assertEquals(dev_foo.serial, 'FooSerial')
+ self.assertEquals(dev_bar.serial, 'BarSerial')
+ self.assertEquals(dev_battor_p7_h1_t0.serial, 'BattOr0')
+
+ def testBattOrDictMapping(self):
+ map_dict = {'Phone1':'BattOr1', 'Phone2':'BattOr2', 'Phone3':'BattOr3'}
+ a1 = battor_device_mapping.GetBattOrPathFromPhoneSerial(
+ 'Phone1', serial_map=map_dict)
+ a2 = battor_device_mapping.GetBattOrPathFromPhoneSerial(
+ 'Phone2', serial_map=map_dict)
+ a3 = battor_device_mapping.GetBattOrPathFromPhoneSerial(
+ 'Phone3', serial_map=map_dict)
+ self.assertEquals(a1, '/dev/ttyUSB1')
+ self.assertEquals(a2, '/dev/ttyUSB2')
+ self.assertEquals(a3, '/dev/ttyUSB3')
+
+ def testBattOrDictFromFileMapping(self):
+ try:
+ map_dict = {'Phone1':'BattOr1', 'Phone2':'BattOr2', 'Phone3':'BattOr3'}
+ curr_dir = os.path.dirname(os.path.realpath(__file__))
+ filename = os.path.join(curr_dir, 'test', 'data', 'test_write_map.json')
+ battor_device_mapping.WriteSerialMapFile(filename, map_dict)
+ a1 = battor_device_mapping.GetBattOrPathFromPhoneSerial(
+ 'Phone1', serial_map_file=filename)
+ a2 = battor_device_mapping.GetBattOrPathFromPhoneSerial(
+ 'Phone2', serial_map_file=filename)
+ a3 = battor_device_mapping.GetBattOrPathFromPhoneSerial(
+ 'Phone3', serial_map_file=filename)
+ finally:
+ os.remove(filename)
+ self.assertEquals(a1, '/dev/ttyUSB1')
+ self.assertEquals(a2, '/dev/ttyUSB2')
+ self.assertEquals(a3, '/dev/ttyUSB3')
+
+ def testReadSerialMapFile(self):
+ curr_dir = os.path.dirname(os.path.realpath(__file__))
+ map_dict = battor_device_mapping.ReadSerialMapFile(
+ os.path.join(curr_dir, 'test', 'data', 'test_serial_map.json'))
+ self.assertEquals(len(map_dict.keys()), 3)
+ self.assertEquals(map_dict['Phone1'], 'BattOr1')
+ self.assertEquals(map_dict['Phone2'], 'BattOr2')
+ self.assertEquals(map_dict['Phone3'], 'BattOr3')
+
+original_PPTSM = find_usb_devices.GetAllPhysicalPortToSerialMaps
+original_PPTTM = find_usb_devices.GetAllPhysicalPortToTTYMaps
+original_GBL = battor_device_mapping.GetBattOrList
+original_GBNDM = find_usb_devices.GetBusNumberToDeviceTreeMap
+original_IB = battor_device_mapping.IsBattOr
+original_GBSM = battor_device_mapping.GetBattOrSerialNumbers
+
+def setup_battor_test(serial, tty, battor, bser=None):
+ serial_mapper = mock.Mock(return_value=serial)
+ tty_mapper = mock.Mock(return_value=tty)
+ battor_lister = mock.Mock(return_value=battor)
+ devtree = mock.Mock(return_value=None)
+ is_battor = mock.Mock(side_effect=lambda x, y: x in battor)
+ battor_serials = mock.Mock(return_value=bser)
+ find_usb_devices.GetAllPhysicalPortToSerialMaps = serial_mapper
+ find_usb_devices.GetAllPhysicalPortToTTYMaps = tty_mapper
+ battor_device_mapping.GetBattOrList = battor_lister
+ find_usb_devices.GetBusNumberToDeviceTreeMap = devtree
+ battor_device_mapping.IsBattOr = is_battor
+ battor_device_mapping.GetBattOrSerialNumbers = battor_serials
+
+class BattOrMappingTest(unittest.TestCase):
+ def tearDown(self):
+ find_usb_devices.GetAllPhysicalPortToSerialMaps = original_PPTSM
+ find_usb_devices.GetAllPhysicalPortToTTYMaps = original_PPTTM
+ battor_device_mapping.GetBattOrList = original_GBL
+ find_usb_devices.GetBusNumberToDeviceTreeMap = original_GBNDM
+ battor_device_mapping.IsBattOr = original_IB
+ battor_device_mapping.GetBattOrSerialNumbers = original_GBSM
+
+ def test_generate_serial_map(self):
+ setup_battor_test([{1:'Phn1', 2:'Phn2', 3:'Phn3'},
+ {1:'Bat1', 2:'Bat2', 3:'Bat3'}],
+ [{},
+ {1:'ttyUSB0', 2:'ttyUSB1', 3:'ttyUSB2'}],
+ ['ttyUSB0', 'ttyUSB1', 'ttyUSB2'],
+ ['Bat1', 'Bat2', 'Bat3'])
+ result = battor_device_mapping.GenerateSerialMap()
+ self.assertEqual(len(result), 3)
+ self.assertEqual(result['Phn1'], 'Bat1')
+ self.assertEqual(result['Phn2'], 'Bat2')
+ self.assertEqual(result['Phn3'], 'Bat3')
+
+
+if __name__ == "__main__":
+ logging.getLogger().setLevel(logging.DEBUG)
+ unittest.main(verbosity=2)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/geometry.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/geometry.py
new file mode 100644
index 0000000..da21770
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/geometry.py
@@ -0,0 +1,75 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Objects for convenient manipulation of points and other surface areas."""
+
+import collections
+
+
+class Point(collections.namedtuple('Point', ['x', 'y'])):
+ """Object to represent an (x, y) point on a surface.
+
+ Args:
+ x, y: Two numeric coordinates that define the point.
+ """
+ __slots__ = ()
+
+ def __str__(self):
+ """Get a useful string representation of the object."""
+ return '(%s, %s)' % (self.x, self.y)
+
+ def __add__(self, other):
+ """Sum of two points, e.g. p + q."""
+ if isinstance(other, Point):
+ return Point(self.x + other.x, self.y + other.y)
+ else:
+ return NotImplemented
+
+ def __mul__(self, factor):
+ """Multiplication on the right is not implemented."""
+ # This overrides the default behaviour of a tuple multiplied by a constant
+ # on the right, which does not make sense for a Point.
+ return NotImplemented
+
+ def __rmul__(self, factor):
+ """Multiply a point by a scalar factor on the left, e.g. 2 * p."""
+ return Point(factor * self.x, factor * self.y)
+
+
+class Rectangle(
+ collections.namedtuple('Rectangle', ['top_left', 'bottom_right'])):
+ """Object to represent a rectangle on a surface.
+
+ Args:
+ top_left: A pair of (left, top) coordinates. Might be given as a Point
+ or as a two-element sequence (list, tuple, etc.).
+ bottom_right: A pair (right, bottom) coordinates.
+ """
+ __slots__ = ()
+
+ def __new__(cls, top_left, bottom_right):
+ if not isinstance(top_left, Point):
+ top_left = Point(*top_left)
+ if not isinstance(bottom_right, Point):
+ bottom_right = Point(*bottom_right)
+ return super(Rectangle, cls).__new__(cls, top_left, bottom_right)
+
+ def __str__(self):
+ """Get a useful string representation of the object."""
+ return '[%s, %s]' % (self.top_left, self.bottom_right)
+
+ @property
+ def center(self):
+ """Get the point at the center of the rectangle."""
+ return 0.5 * (self.top_left + self.bottom_right)
+
+ @classmethod
+ def FromDict(cls, d):
+ """Create a rectangle object from a dictionary.
+
+ Args:
+ d: A dictionary (or mapping) of the form, e.g., {'top': 0, 'left': 0,
+ 'bottom': 1, 'right': 1}.
+ """
+ return cls(Point(d['left'], d['top']), Point(d['right'], d['bottom']))
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/geometry_test.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/geometry_test.py
new file mode 100644
index 0000000..af69442
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/geometry_test.py
@@ -0,0 +1,61 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Tests for the geometry module."""
+
+import unittest
+
+from devil.utils import geometry as g
+
+
+class PointTest(unittest.TestCase):
+
+ def testStr(self):
+ p = g.Point(1, 2)
+ self.assertEquals(str(p), '(1, 2)')
+
+ def testAdd(self):
+ p = g.Point(1, 2)
+ q = g.Point(3, 4)
+ r = g.Point(4, 6)
+ self.assertEquals(p + q, r)
+
+ def testAdd_TypeErrorWithInvalidOperands(self):
+ # pylint: disable=pointless-statement
+ p = g.Point(1, 2)
+ with self.assertRaises(TypeError):
+ p + 4 # Can't add point and scalar.
+ with self.assertRaises(TypeError):
+ 4 + p # Can't add scalar and point.
+
+ def testMult(self):
+ p = g.Point(1, 2)
+ r = g.Point(2, 4)
+ self.assertEquals(2 * p, r) # Multiply by scalar on the left.
+
+ def testMult_TypeErrorWithInvalidOperands(self):
+ # pylint: disable=pointless-statement
+ p = g.Point(1, 2)
+ q = g.Point(2, 4)
+ with self.assertRaises(TypeError):
+ p * q # Can't multiply points.
+ with self.assertRaises(TypeError):
+ p * 4 # Can't multiply by a scalar on the right.
+
+
+class RectangleTest(unittest.TestCase):
+
+ def testStr(self):
+ r = g.Rectangle(g.Point(0, 1), g.Point(2, 3))
+ self.assertEquals(str(r), '[(0, 1), (2, 3)]')
+
+ def testCenter(self):
+ r = g.Rectangle(g.Point(0, 1), g.Point(2, 3))
+ c = g.Point(1, 2)
+ self.assertEquals(r.center, c)
+
+ def testFromJson(self):
+ r1 = g.Rectangle(g.Point(0, 1), g.Point(2, 3))
+ r2 = g.Rectangle.FromDict({'top': 1, 'left': 0, 'bottom': 3, 'right': 2})
+ self.assertEquals(r1, r2)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/host_utils.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/host_utils.py
new file mode 100644
index 0000000..580721f
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/host_utils.py
@@ -0,0 +1,16 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+
+
+def GetRecursiveDiskUsage(path):
+ """Returns the disk usage in bytes of |path|. Similar to `du -sb |path|`."""
+ running_size = os.path.getsize(path)
+ if os.path.isdir(path):
+ for root, dirs, files in os.walk(path):
+ running_size += sum([os.path.getsize(os.path.join(root, f))
+ for f in files + dirs])
+ return running_size
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/lazy/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/lazy/__init__.py
new file mode 100644
index 0000000..3cc56c0
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/lazy/__init__.py
@@ -0,0 +1,5 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from devil.utils.lazy.weak_constant import WeakConstant
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/lazy/weak_constant.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/lazy/weak_constant.py
new file mode 100644
index 0000000..3558f29
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/lazy/weak_constant.py
@@ -0,0 +1,29 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import threading
+
+
+class WeakConstant(object):
+ """A thread-safe, lazily initialized object.
+
+ This does not support modification after initialization. The intended
+ constant nature of the object is not enforced, though, hence the "weak".
+ """
+
+ def __init__(self, initializer):
+ self._initialized = False
+ self._initializer = initializer
+ self._lock = threading.Lock()
+ self._val = None
+
+ def read(self):
+ """Get the object, creating it if necessary."""
+ if self._initialized:
+ return self._val
+ with self._lock:
+ if not self._initialized:
+ self._val = self._initializer()
+ self._initialized = True
+ return self._val
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/lsusb.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/lsusb.py
new file mode 100644
index 0000000..6cbf256
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/lsusb.py
@@ -0,0 +1,174 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import logging
+import re
+
+from devil.utils import cmd_helper
+
+logger = logging.getLogger(__name__)
+
+_COULDNT_OPEN_ERROR_RE = re.compile(r'Couldn\'t open device.*')
+_INDENTATION_RE = re.compile(r'^( *)')
+_LSUSB_BUS_DEVICE_RE = re.compile(r'^Bus (\d{3}) Device (\d{3}): (.*)')
+_LSUSB_ENTRY_RE = re.compile(r'^ *([^ ]+) +([^ ]+) *([^ ].*)?$')
+_LSUSB_GROUP_RE = re.compile(r'^ *([^ ]+.*):$')
+
+
+def _lsusbv_on_device(bus_id, dev_id):
+ """Calls lsusb -v on device."""
+ _, raw_output = cmd_helper.GetCmdStatusAndOutputWithTimeout(
+ ['lsusb', '-v', '-s', '%s:%s' % (bus_id, dev_id)], timeout=10)
+
+ device = {'bus': bus_id, 'device': dev_id}
+ depth_stack = [device]
+
+ # This builds a nested dict -- a tree, basically -- that corresponds
+ # to the lsusb output. It looks first for a line containing
+ #
+ # "Bus <bus number> Device <device number>: ..."
+ #
+ # and uses that to create the root node. It then parses all remaining
+ # lines as a tree, with the indentation level determining the
+ # depth of the new node.
+ #
+ # This expects two kinds of lines:
+ # - "groups", which take the form
+ # "<Group name>:"
+ # and typically have children, and
+ # - "entries", which take the form
+ # "<entry name> <entry value> <possible entry description>"
+ # and typically do not have children (but can).
+ #
+ # This maintains a stack containing all current ancestor nodes in
+ # order to add new nodes to the proper place in the tree.
+ # The stack is added to when a new node is parsed. Nodes are removed
+ # from the stack when they are either at the same indentation level as
+ # or a deeper indentation level than the current line.
+ #
+ # e.g. the following lsusb output:
+ #
+ # Bus 123 Device 456: School bus
+ # Device Descriptor:
+ # bDeviceClass 5 Actual School Bus
+ # Configuration Descriptor:
+ # bLength 20 Rows
+ #
+ # would produce the following dict:
+ #
+ # {
+ # 'bus': 123,
+ # 'device': 456,
+ # 'desc': 'School bus',
+ # 'Device Descriptor': {
+ # 'bDeviceClass': {
+ # '_value': '5',
+ # '_desc': 'Actual School Bus',
+ # },
+ # 'Configuration Descriptor': {
+ # 'bLength': {
+ # '_value': '20',
+ # '_desc': 'Rows',
+ # },
+ # },
+ # }
+ # }
+ for line in raw_output.splitlines():
+ # Ignore blank lines.
+ if not line:
+ continue
+ # Filter out error mesage about opening device.
+ if _COULDNT_OPEN_ERROR_RE.match(line):
+ continue
+ # Find start of device information.
+ m = _LSUSB_BUS_DEVICE_RE.match(line)
+ if m:
+ if m.group(1) != bus_id:
+ logger.warning(
+ 'Expected bus_id value: %r, seen %r', bus_id, m.group(1))
+ if m.group(2) != dev_id:
+ logger.warning(
+ 'Expected dev_id value: %r, seen %r', dev_id, m.group(2))
+ device['desc'] = m.group(3)
+ continue
+
+ # Skip any lines that aren't indented, as they're not part of the
+ # device descriptor.
+ indent_match = _INDENTATION_RE.match(line)
+ if not indent_match:
+ continue
+
+ # Determine the indentation depth.
+ depth = 1 + len(indent_match.group(1)) / 2
+ if depth > len(depth_stack):
+ logger.error(
+ 'lsusb parsing error: unexpected indentation: "%s"', line)
+ continue
+
+ # Pop everything off the depth stack that isn't a parent of
+ # this element.
+ while depth < len(depth_stack):
+ depth_stack.pop()
+
+ cur = depth_stack[-1]
+
+ m = _LSUSB_GROUP_RE.match(line)
+ if m:
+ new_group = {}
+ cur[m.group(1)] = new_group
+ depth_stack.append(new_group)
+ continue
+
+ m = _LSUSB_ENTRY_RE.match(line)
+ if m:
+ new_entry = {
+ '_value': m.group(2),
+ '_desc': m.group(3),
+ }
+ cur[m.group(1)] = new_entry
+ depth_stack.append(new_entry)
+ continue
+
+ logger.error('lsusb parsing error: unrecognized line: "%s"', line)
+
+ return device
+
+def lsusb():
+ """Call lsusb and return the parsed output."""
+ _, lsusb_list_output = cmd_helper.GetCmdStatusAndOutputWithTimeout(
+ ['lsusb'], timeout=10)
+ devices = []
+ for line in lsusb_list_output.splitlines():
+ m = _LSUSB_BUS_DEVICE_RE.match(line)
+ if m:
+ bus_num = m.group(1)
+ dev_num = m.group(2)
+ try:
+ devices.append(_lsusbv_on_device(bus_num, dev_num))
+ except cmd_helper.TimeoutError:
+ # Will be blacklisted if it is in expected device file, but times out.
+ logger.info('lsusb -v %s:%s timed out.', bus_num, dev_num)
+ return devices
+
+def raw_lsusb():
+ return cmd_helper.GetCmdOutput(['lsusb'])
+
+def get_lsusb_serial(device):
+ try:
+ return device['Device Descriptor']['iSerial']['_desc']
+ except KeyError:
+ return None
+
+def _is_android_device(device):
+ try:
+ # Hubs are not android devices.
+ if device['Device Descriptor']['bDeviceClass']['_value'] == '9':
+ return False
+ except KeyError:
+ pass
+ return get_lsusb_serial(device) is not None
+
+def get_android_devices():
+ android_devices = (d for d in lsusb() if _is_android_device(d))
+ return [get_lsusb_serial(d) for d in android_devices]
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/lsusb_test.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/lsusb_test.py
new file mode 100644
index 0000000..f381e72
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/lsusb_test.py
@@ -0,0 +1,250 @@
+#!/usr/bin/env python
+# Copyright 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Tests for the cmd_helper module."""
+
+import unittest
+
+from devil import devil_env
+from devil.utils import lsusb
+from devil.utils import mock_calls
+
+with devil_env.SysPath(devil_env.PYMOCK_PATH):
+ import mock # pylint: disable=import-error
+
+RAW_OUTPUT = """
+Bus 003 Device 007: ID 18d1:4ee2 Google Inc. Nexus 4 (debug)
+Device Descriptor:
+ bLength 18
+ bDescriptorType 1
+ bcdUSB 2.00
+ bDeviceClass 0 (Defined at Interface level)
+ bDeviceSubClass 0
+ bDeviceProtocol 0
+ bMaxPacketSize0 64
+ idVendor 0x18d1 Google Inc.
+ idProduct 0x4ee2 Nexus 4 (debug)
+ bcdDevice 2.28
+ iManufacturer 1 LGE
+ iProduct 2 Nexus 4
+ iSerial 3 01d2450ea194a93b
+ bNumConfigurations 1
+ Configuration Descriptor:
+ bLength 9
+ bDescriptorType 2
+ wTotalLength 62
+ bNumInterfaces 2
+ bConfigurationValue 1
+ iConfiguration 0
+ bmAttributes 0x80
+ (Bus Powered)
+ MaxPower 500mA
+ Interface Descriptor:
+ bLength 9
+ bDescriptorType 4
+ bInterfaceNumber 0
+ bAlternateSetting 0
+ bNumEndpoints 3
+ bInterfaceClass 255 Vendor Specific Class
+ bInterfaceSubClass 255 Vendor Specific Subclass
+ bInterfaceProtocol 0
+ iInterface 4 MTP
+ Endpoint Descriptor:
+ bLength 7
+ bDescriptorType 5
+ bEndpointAddress 0x81 EP 1 IN
+ bmAttributes 2
+ Transfer Type Bulk
+ Synch Type None
+ Usage Type Data
+ wMaxPacketSize 0x0040 1x 64 bytes
+ bInterval 0
+ Endpoint Descriptor:
+ bLength 7
+ bDescriptorType 5
+ bEndpointAddress 0x01 EP 1 OUT
+ bmAttributes 2
+ Transfer Type Bulk
+ Synch Type None
+ Usage Type Data
+ wMaxPacketSize 0x0040 1x 64 bytes
+ bInterval 0
+ Endpoint Descriptor:
+ bLength 7
+ bDescriptorType 5
+ bEndpointAddress 0x82 EP 2 IN
+ bmAttributes 3
+ Transfer Type Interrupt
+ Synch Type None
+ Usage Type Data
+ wMaxPacketSize 0x001c 1x 28 bytes
+ bInterval 6
+ Interface Descriptor:
+ bLength 9
+ bDescriptorType 4
+ bInterfaceNumber 1
+ bAlternateSetting 0
+ bNumEndpoints 2
+ bInterfaceClass 255 Vendor Specific Class
+ bInterfaceSubClass 66
+ bInterfaceProtocol 1
+ iInterface 0
+ Endpoint Descriptor:
+ bLength 7
+ bDescriptorType 5
+ bEndpointAddress 0x83 EP 3 IN
+ bmAttributes 2
+ Transfer Type Bulk
+ Synch Type None
+ Usage Type Data
+ wMaxPacketSize 0x0040 1x 64 bytes
+ bInterval 0
+ Endpoint Descriptor:
+ bLength 7
+ bDescriptorType 5
+ bEndpointAddress 0x02 EP 2 OUT
+ bmAttributes 2
+ Transfer Type Bulk
+ Synch Type None
+ Usage Type Data
+ wMaxPacketSize 0x0040 1x 64 bytes
+ bInterval 0
+Device Qualifier (for other device speed):
+ bLength 10
+ bDescriptorType 6
+ bcdUSB 2.00
+ bDeviceClass 0 (Defined at Interface level)
+ bDeviceSubClass 0
+ bDeviceProtocol 0
+ bMaxPacketSize0 64
+ bNumConfigurations 1
+Device Status: 0x0000
+ (Bus Powered)
+"""
+DEVICE_LIST = 'Bus 003 Device 007: ID 18d1:4ee2 Google Inc. Nexus 4 (debug)'
+
+EXPECTED_RESULT = {
+ 'device': '007',
+ 'bus': '003',
+ 'desc': 'ID 18d1:4ee2 Google Inc. Nexus 4 (debug)',
+ 'Device': {
+ '_value': 'Status:',
+ '_desc': '0x0000',
+ '(Bus': {
+ '_value': 'Powered)',
+ '_desc': None
+ }
+ },
+ 'Device Descriptor': {
+ 'bLength': {'_value': '18', '_desc': None},
+ 'bcdDevice': {'_value': '2.28', '_desc': None},
+ 'bDeviceSubClass': {'_value': '0', '_desc': None},
+ 'idVendor': {'_value': '0x18d1', '_desc': 'Google Inc.'},
+ 'bcdUSB': {'_value': '2.00', '_desc': None},
+ 'bDeviceProtocol': {'_value': '0', '_desc': None},
+ 'bDescriptorType': {'_value': '1', '_desc': None},
+ 'Configuration Descriptor': {
+ 'bLength': {'_value': '9', '_desc': None},
+ 'wTotalLength': {'_value': '62', '_desc': None},
+ 'bConfigurationValue': {'_value': '1', '_desc': None},
+ 'Interface Descriptor': {
+ 'bLength': {'_value': '9', '_desc': None},
+ 'bAlternateSetting': {'_value': '0', '_desc': None},
+ 'bInterfaceNumber': {'_value': '1', '_desc': None},
+ 'bNumEndpoints': {'_value': '2', '_desc': None},
+ 'bDescriptorType': {'_value': '4', '_desc': None},
+ 'bInterfaceSubClass': {'_value': '66', '_desc': None},
+ 'bInterfaceClass': {
+ '_value': '255',
+ '_desc': 'Vendor Specific Class'
+ },
+ 'bInterfaceProtocol': {'_value': '1', '_desc': None},
+ 'Endpoint Descriptor': {
+ 'bLength': {'_value': '7', '_desc': None},
+ 'bEndpointAddress': {'_value': '0x02', '_desc': 'EP 2 OUT'},
+ 'bInterval': {'_value': '0', '_desc': None},
+ 'bDescriptorType': {'_value': '5', '_desc': None},
+ 'bmAttributes': {
+ '_value': '2',
+ 'Transfer': {'_value': 'Type', '_desc': 'Bulk'},
+ 'Usage': {'_value': 'Type', '_desc': 'Data'},
+ '_desc': None,
+ 'Synch': {'_value': 'Type', '_desc': 'None'}
+ },
+ 'wMaxPacketSize': {
+ '_value': '0x0040',
+ '_desc': '1x 64 bytes'
+ }
+ },
+ 'iInterface': {'_value': '0', '_desc': None}
+ },
+ 'bDescriptorType': {'_value': '2', '_desc': None},
+ 'iConfiguration': {'_value': '0', '_desc': None},
+ 'bmAttributes': {
+ '_value': '0x80',
+ '_desc': None,
+ '(Bus': {'_value': 'Powered)', '_desc': None}
+ },
+ 'bNumInterfaces': {'_value': '2', '_desc': None},
+ 'MaxPower': {'_value': '500mA', '_desc': None}
+ },
+ 'iSerial': {'_value': '3', '_desc': '01d2450ea194a93b'},
+ 'idProduct': {'_value': '0x4ee2', '_desc': 'Nexus 4 (debug)'},
+ 'iManufacturer': {'_value': '1', '_desc': 'LGE'},
+ 'bDeviceClass': {
+ '_value': '0',
+ '_desc': '(Defined at Interface level)'
+ },
+ 'iProduct': {'_value': '2', '_desc': 'Nexus 4'},
+ 'bMaxPacketSize0': {'_value': '64', '_desc': None},
+ 'bNumConfigurations': {'_value': '1', '_desc': None}
+ },
+ 'Device Qualifier (for other device speed)': {
+ 'bLength': {'_value': '10', '_desc': None},
+ 'bNumConfigurations': {'_value': '1', '_desc': None},
+ 'bDeviceSubClass': {'_value': '0', '_desc': None},
+ 'bcdUSB': {'_value': '2.00', '_desc': None},
+ 'bDeviceProtocol': {'_value': '0', '_desc': None},
+ 'bDescriptorType': {'_value': '6', '_desc': None},
+ 'bDeviceClass': {
+ '_value': '0',
+ '_desc': '(Defined at Interface level)'
+ },
+ 'bMaxPacketSize0': {'_value': '64', '_desc': None}
+ }
+}
+
+
+class LsusbTest(mock_calls.TestCase):
+ """Test Lsusb parsing."""
+
+ def testLsusb(self):
+ with self.assertCalls(
+ (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
+ ['lsusb'], timeout=10), (None, DEVICE_LIST)),
+ (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
+ ['lsusb', '-v', '-s', '003:007'], timeout=10), (None, RAW_OUTPUT))):
+ self.assertDictEqual(lsusb.lsusb().pop(), EXPECTED_RESULT)
+
+ def testGetSerial(self):
+ with self.assertCalls(
+ (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
+ ['lsusb'], timeout=10), (None, DEVICE_LIST)),
+ (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
+ ['lsusb', '-v', '-s', '003:007'], timeout=10), (None, RAW_OUTPUT))):
+ self.assertEqual(lsusb.get_android_devices(), ['01d2450ea194a93b'])
+
+ def testGetLsusbSerial(self):
+ with self.assertCalls(
+ (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
+ ['lsusb'], timeout=10), (None, DEVICE_LIST)),
+ (mock.call.devil.utils.cmd_helper.GetCmdStatusAndOutputWithTimeout(
+ ['lsusb', '-v', '-s', '003:007'], timeout=10), (None, RAW_OUTPUT))):
+ out = lsusb.lsusb().pop()
+ self.assertEqual(lsusb.get_lsusb_serial(out), '01d2450ea194a93b')
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/markdown.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/markdown.py
new file mode 100644
index 0000000..54e7ed5
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/markdown.py
@@ -0,0 +1,320 @@
+#! /usr/bin/env python
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import argparse
+import imp
+import os
+import re
+import sys
+import textwrap
+import types
+
+# A markdown code block template: https://goo.gl/9EsyRi
+_CODE_BLOCK_FORMAT = '''```{language}
+{code}
+```
+'''
+
+_DEVIL_ROOT = os.path.abspath(os.path.join(
+ os.path.dirname(__file__), '..', '..'))
+
+
+def md_bold(raw_text):
+ """Returns markdown-formatted bold text."""
+ return '**%s**' % md_escape(raw_text, characters='*')
+
+
+def md_code(raw_text, language):
+ """Returns a markdown-formatted code block in the given language."""
+ return _CODE_BLOCK_FORMAT.format(
+ language=language or '',
+ code=md_escape(raw_text, characters='`'))
+
+
+def md_escape(raw_text, characters='*_'):
+ """Escapes * and _."""
+ def escape_char(m):
+ return '\\%s' % m.group(0)
+ pattern = '[%s]' % re.escape(characters)
+ return re.sub(pattern, escape_char, raw_text)
+
+
+def md_heading(raw_text, level):
+ """Returns markdown-formatted heading."""
+ adjusted_level = min(max(level, 0), 6)
+ return '%s%s%s' % (
+ '#' * adjusted_level, ' ' if adjusted_level > 0 else '', raw_text)
+
+
+def md_inline_code(raw_text):
+ """Returns markdown-formatted inline code."""
+ return '`%s`' % md_escape(raw_text, characters='`')
+
+
+def md_italic(raw_text):
+ """Returns markdown-formatted italic text."""
+ return '*%s*' % md_escape(raw_text, characters='*')
+
+
+def md_link(link_text, link_target):
+ """returns a markdown-formatted link."""
+ return '[%s](%s)' % (
+ md_escape(link_text, characters=']'),
+ md_escape(link_target, characters=')'))
+
+
+class MarkdownHelpFormatter(argparse.HelpFormatter):
+ """A really bare-bones argparse help formatter that generates valid markdown.
+
+ This will generate something like:
+
+ usage
+
+ # **section heading**:
+
+ ## **--argument-one**
+
+ ```
+ argument-one help text
+ ```
+
+ """
+
+ #override
+ def _format_usage(self, usage, actions, groups, prefix):
+ usage_text = super(MarkdownHelpFormatter, self)._format_usage(
+ usage, actions, groups, prefix)
+ return md_code(usage_text, language=None)
+
+ #override
+ def format_help(self):
+ self._root_section.heading = md_heading(self._prog, level=1)
+ return super(MarkdownHelpFormatter, self).format_help()
+
+ #override
+ def start_section(self, heading):
+ super(MarkdownHelpFormatter, self).start_section(
+ md_heading(heading, level=2))
+
+ #override
+ def _format_action(self, action):
+ lines = []
+ action_header = self._format_action_invocation(action)
+ lines.append(md_heading(action_header, level=3))
+ if action.help:
+ lines.append(md_code(self._expand_help(action), language=None))
+ lines.extend(['', ''])
+ return '\n'.join(lines)
+
+
+class MarkdownHelpAction(argparse.Action):
+ def __init__(self, option_strings,
+ dest=argparse.SUPPRESS, default=argparse.SUPPRESS,
+ **kwargs):
+ super(MarkdownHelpAction, self).__init__(
+ option_strings=option_strings,
+ dest=dest,
+ default=default,
+ nargs=0,
+ **kwargs)
+
+ def __call__(self, parser, namespace, values, option_string=None):
+ parser.formatter_class = MarkdownHelpFormatter
+ parser.print_help()
+ parser.exit()
+
+
+def add_md_help_argument(parser):
+ """Adds --md-help to the given argparse.ArgumentParser.
+
+ Running a script with --md-help will print the help text for that script
+ as valid markdown.
+
+ Args:
+ parser: The ArgumentParser to which --md-help should be added.
+ """
+ parser.add_argument('--md-help', action=MarkdownHelpAction,
+ help='print Markdown-formatted help text and exit.')
+
+
+def load_module_from_path(module_path):
+ """Load a module given only the path name.
+
+ Also loads package modules as necessary.
+
+ Args:
+ module_path: An absolute path to a python module.
+ Returns:
+ The module object for the given path.
+ """
+ module_names = [os.path.splitext(os.path.basename(module_path))[0]]
+ d = os.path.dirname(module_path)
+
+ while os.path.exists(os.path.join(d, '__init__.py')):
+ module_names.append(os.path.basename(d))
+ d = os.path.dirname(d)
+
+ d = [d]
+
+ module = None
+ full_module_name = ''
+ for package_name in reversed(module_names):
+ if module:
+ d = module.__path__
+ full_module_name += '.'
+ r = imp.find_module(package_name, d)
+ full_module_name += package_name
+ module = imp.load_module(full_module_name, *r)
+ return module
+
+
+def md_module(module_obj, module_path=None, module_link=None):
+ """Write markdown documentation for a class.
+
+ Documents public classes and functions.
+
+ Args:
+ class_obj: a types.TypeType object for the class that should be
+ documented.
+ Returns:
+ A list of markdown-formatted lines.
+ """
+ def should_doc(name):
+ return (type(module_obj.__dict__[name]) != types.ModuleType
+ and not name.startswith('_'))
+
+ stuff_to_doc = sorted(
+ obj for name, obj in module_obj.__dict__.iteritems()
+ if should_doc(name))
+
+ classes_to_doc = []
+ functions_to_doc = []
+
+ for s in stuff_to_doc:
+ if type(s) == types.TypeType:
+ classes_to_doc.append(s)
+ elif type(s) == types.FunctionType:
+ functions_to_doc.append(s)
+
+ command = ['devil/utils/markdown.py']
+ if module_link:
+ command.extend(['--module-link', module_link])
+ if module_path:
+ command.append(os.path.relpath(module_path, _DEVIL_ROOT))
+
+ heading_text = module_obj.__name__
+ if module_link:
+ heading_text = md_link(heading_text, module_link)
+
+ content = [
+ md_heading(heading_text, level=1),
+ '',
+ md_italic('This page was autogenerated by %s'
+ % md_inline_code(' '.join(command))),
+ '',
+ ]
+
+ for c in classes_to_doc:
+ content += md_class(c)
+ for f in functions_to_doc:
+ content += md_function(f)
+
+ print '\n'.join(content)
+
+ return 0
+
+
+def md_class(class_obj):
+ """Write markdown documentation for a class.
+
+ Documents public methods. Does not currently document subclasses.
+
+ Args:
+ class_obj: a types.TypeType object for the class that should be
+ documented.
+ Returns:
+ A list of markdown-formatted lines.
+ """
+ content = [md_heading(md_escape(class_obj.__name__), level=2)]
+ content.append('')
+ if class_obj.__doc__:
+ content.extend(md_docstring(class_obj.__doc__))
+
+ def should_doc(name, obj):
+ return (type(obj) == types.FunctionType
+ and (name.startswith('__') or not name.startswith('_')))
+
+ methods_to_doc = sorted(
+ obj for name, obj in class_obj.__dict__.iteritems()
+ if should_doc(name, obj))
+
+ for m in methods_to_doc:
+ content.extend(md_function(m, class_obj=class_obj))
+
+ return content
+
+
+def md_docstring(docstring):
+ """Write a markdown-formatted docstring.
+
+ Returns:
+ A list of markdown-formatted lines.
+ """
+ content = []
+ lines = textwrap.dedent(docstring).splitlines()
+ content.append(md_escape(lines[0]))
+ lines = lines[1:]
+ while lines and (not lines[0] or lines[0].isspace()):
+ lines = lines[1:]
+
+ if not all(l.isspace() for l in lines):
+ content.append(md_code('\n'.join(lines), language=None))
+ content.append('')
+ return content
+
+
+def md_function(func_obj, class_obj=None):
+ """Write markdown documentation for a function.
+
+ Args:
+ func_obj: a types.FunctionType object for the function that should be
+ documented.
+ Returns:
+ A list of markdown-formatted lines.
+ """
+ if class_obj:
+ heading_text = '%s.%s' % (class_obj.__name__, func_obj.__name__)
+ else:
+ heading_text = func_obj.__name__
+ content = [md_heading(md_escape(heading_text), level=3)]
+ content.append('')
+
+ if func_obj.__doc__:
+ content.extend(md_docstring(func_obj.__doc__))
+
+ return content
+
+
+def main(raw_args):
+ """Write markdown documentation for the module at the provided path.
+
+ Args:
+ raw_args: the raw command-line args. Usually sys.argv[1:].
+ Returns:
+ An integer exit code. 0 for success, non-zero for failure.
+ """
+ parser = argparse.ArgumentParser()
+ parser.add_argument('--module-link')
+ parser.add_argument('module_path', type=os.path.realpath)
+ args = parser.parse_args(raw_args)
+
+ return md_module(
+ load_module_from_path(args.module_path),
+ module_link=args.module_link)
+
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv[1:]))
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/markdown_test.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/markdown_test.py
new file mode 100644
index 0000000..323776c
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/markdown_test.py
@@ -0,0 +1,121 @@
+#! /usr/bin/env python
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import sys
+import textwrap
+import unittest
+
+if __name__ == '__main__':
+ sys.path.append(
+ os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')))
+
+from devil.utils import markdown
+
+
+class MarkdownTest(unittest.TestCase):
+
+ def testBold(self):
+ raw = 'foo'
+ self.assertEquals('**foo**', markdown.md_bold(raw))
+
+ def testBoldContainsStars(self):
+ raw = '*foo*'
+ self.assertEquals('**\\*foo\\***', markdown.md_bold(raw))
+
+ def testCode(self):
+ raw = textwrap.dedent("""\
+ class MarkdownTest(unittest.TestCase):
+ def testCode(self):
+ pass""")
+
+ expected = textwrap.dedent("""\
+ ```python
+ class MarkdownTest(unittest.TestCase):
+ def testCode(self):
+ pass
+ ```
+ """)
+ actual = markdown.md_code(raw, language='python')
+ self.assertEquals(expected, actual)
+
+ def testCodeContainsTicks(self):
+ raw = textwrap.dedent("""\
+ This is sample markdown.
+ ```c
+ // This is a sample code block.
+ int main(int argc, char** argv) {
+ return 0;
+ }
+ ```""")
+
+ expected = textwrap.dedent("""\
+ ```
+ This is sample markdown.
+ \\`\\`\\`c
+ // This is a sample code block.
+ int main(int argc, char** argv) {
+ return 0;
+ }
+ \\`\\`\\`
+ ```
+ """)
+ actual = markdown.md_code(raw, language=None)
+ self.assertEquals(expected, actual)
+
+ def testEscape(self):
+ raw = 'text_with_underscores *and stars*'
+ expected = 'text\\_with\\_underscores \\*and stars\\*'
+ actual = markdown.md_escape(raw)
+ self.assertEquals(expected, actual)
+
+ def testHeading1(self):
+ raw = 'Heading 1'
+ self.assertEquals('# Heading 1', markdown.md_heading(raw, level=1))
+
+ def testHeading5(self):
+ raw = 'Heading 5'
+ self.assertEquals('##### Heading 5', markdown.md_heading(raw, level=5))
+
+ def testHeading10(self):
+ raw = 'Heading 10'
+ self.assertEquals('###### Heading 10', markdown.md_heading(raw, level=10))
+
+ def testInlineCode(self):
+ raw = 'devil.utils.markdown_test'
+ self.assertEquals(
+ '`devil.utils.markdown_test`', markdown.md_inline_code(raw))
+
+ def testInlineCodeContainsTicks(self):
+ raw = 'this contains `backticks`'
+ self.assertEquals(
+ '`this contains \\`backticks\\``', markdown.md_inline_code(raw))
+
+ def testItalic(self):
+ raw = 'bar'
+ self.assertEquals('*bar*', markdown.md_italic(raw))
+
+ def testItalicContainsStars(self):
+ raw = '*bar*'
+ self.assertEquals('*\\*bar\\**', markdown.md_italic(raw))
+
+ def testLink(self):
+ link_text = 'Devil home'
+ link_target = (
+ 'https://github.com/catapult-project/catapult/tree/master/devil')
+ expected = (
+ '[Devil home]'
+ '(https://github.com/catapult-project/catapult/tree/master/devil)')
+ self.assertEquals(expected, markdown.md_link(link_text, link_target))
+
+ def testLinkTextContainsBracket(self):
+ link_text = 'foo [] bar'
+ link_target = 'https://www.google.com'
+ expected = '[foo [\\] bar](https://www.google.com)'
+ self.assertEquals(expected, markdown.md_link(link_text, link_target))
+
+
+if __name__ == '__main__':
+ unittest.main(verbosity=2)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/mock_calls.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/mock_calls.py
new file mode 100644
index 0000000..5ae951e
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/mock_calls.py
@@ -0,0 +1,180 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""
+A test facility to assert call sequences while mocking their behavior.
+"""
+
+import unittest
+
+from devil import devil_env
+
+with devil_env.SysPath(devil_env.PYMOCK_PATH):
+ import mock # pylint: disable=import-error
+
+
+class TestCase(unittest.TestCase):
+ """Adds assertCalls to TestCase objects."""
+ class _AssertCalls(object):
+
+ def __init__(self, test_case, expected_calls, watched):
+ def call_action(pair):
+ if isinstance(pair, type(mock.call)):
+ return (pair, None)
+ else:
+ return pair
+
+ def do_check(call):
+ def side_effect(*args, **kwargs):
+ received_call = call(*args, **kwargs)
+ self._test_case.assertTrue(
+ self._expected_calls,
+ msg=('Unexpected call: %s' % str(received_call)))
+ expected_call, action = self._expected_calls.pop(0)
+ self._test_case.assertTrue(
+ received_call == expected_call,
+ msg=('Expected call mismatch:\n'
+ ' expected: %s\n'
+ ' received: %s\n'
+ % (str(expected_call), str(received_call))))
+ if callable(action):
+ return action(*args, **kwargs)
+ else:
+ return action
+ return side_effect
+
+ self._test_case = test_case
+ self._expected_calls = [call_action(pair) for pair in expected_calls]
+ watched = watched.copy() # do not pollute the caller's dict
+ watched.update((call.parent.name, call.parent)
+ for call, _ in self._expected_calls)
+ self._patched = [test_case.patch_call(call, side_effect=do_check(call))
+ for call in watched.itervalues()]
+
+ def __enter__(self):
+ for patch in self._patched:
+ patch.__enter__()
+ return self
+
+ def __exit__(self, exc_type, exc_val, exc_tb):
+ for patch in self._patched:
+ patch.__exit__(exc_type, exc_val, exc_tb)
+ if exc_type is None:
+ missing = ''.join(' expected: %s\n' % str(call)
+ for call, _ in self._expected_calls)
+ self._test_case.assertFalse(
+ missing,
+ msg='Expected calls not found:\n' + missing)
+
+ def __init__(self, *args, **kwargs):
+ super(TestCase, self).__init__(*args, **kwargs)
+ self.call = mock.call.self
+ self._watched = {}
+
+ def call_target(self, call):
+ """Resolve a self.call instance to the target it represents.
+
+ Args:
+ call: a self.call instance, e.g. self.call.adb.Shell
+
+ Returns:
+ The target object represented by the call, e.g. self.adb.Shell
+
+ Raises:
+ ValueError if the path of the call does not start with "self", i.e. the
+ target of the call is external to the self object.
+ AttributeError if the path of the call does not specify a valid
+ chain of attributes (without any calls) starting from "self".
+ """
+ path = call.name.split('.')
+ if path.pop(0) != 'self':
+ raise ValueError("Target %r outside of 'self' object" % call.name)
+ target = self
+ for attr in path:
+ target = getattr(target, attr)
+ return target
+
+ def patch_call(self, call, **kwargs):
+ """Patch the target of a mock.call instance.
+
+ Args:
+ call: a mock.call instance identifying a target to patch
+ Extra keyword arguments are processed by mock.patch
+
+ Returns:
+ A context manager to mock/unmock the target of the call
+ """
+ if call.name.startswith('self.'):
+ target = self.call_target(call.parent)
+ _, attribute = call.name.rsplit('.', 1)
+ if (hasattr(type(target), attribute)
+ and isinstance(getattr(type(target), attribute), property)):
+ return mock.patch.object(
+ type(target), attribute, new_callable=mock.PropertyMock, **kwargs)
+ else:
+ return mock.patch.object(target, attribute, **kwargs)
+ else:
+ return mock.patch(call.name, **kwargs)
+
+ def watchCalls(self, calls):
+ """Add calls to the set of watched calls.
+
+ Args:
+ calls: a sequence of mock.call instances identifying targets to watch
+ """
+ self._watched.update((call.name, call) for call in calls)
+
+ def watchMethodCalls(self, call, ignore=None):
+ """Watch all public methods of the target identified by a self.call.
+
+ Args:
+ call: a self.call instance indetifying an object
+ ignore: a list of public methods to ignore when watching for calls
+ """
+ target = self.call_target(call)
+ if ignore is None:
+ ignore = []
+ self.watchCalls(getattr(call, method)
+ for method in dir(target.__class__)
+ if not method.startswith('_') and not method in ignore)
+
+ def clearWatched(self):
+ """Clear the set of watched calls."""
+ self._watched = {}
+
+ def assertCalls(self, *calls):
+ """A context manager to assert that a sequence of calls is made.
+
+ During the assertion, a number of functions and methods will be "watched",
+ and any calls made to them is expected to appear---in the exact same order,
+ and with the exact same arguments---as specified by the argument |calls|.
+
+ By default, the targets of all expected calls are watched. Further targets
+ to watch may be added using watchCalls and watchMethodCalls.
+
+ Optionaly, each call may be accompanied by an action. If the action is a
+ (non-callable) value, this value will be used as the return value given to
+ the caller when the matching call is found. Alternatively, if the action is
+ a callable, the action will be then called with the same arguments as the
+ intercepted call, so that it can provide a return value or perform other
+ side effects. If the action is missing, a return value of None is assumed.
+
+ Note that mock.Mock objects are often convenient to use as a callable
+ action, e.g. to raise exceptions or return other objects which are
+ themselves callable.
+
+ Args:
+ calls: each argument is either a pair (expected_call, action) or just an
+ expected_call, where expected_call is a mock.call instance.
+
+ Raises:
+ AssertionError if the watched targets do not receive the exact sequence
+ of calls specified. Missing calls, extra calls, and calls with
+ mismatching arguments, all cause the assertion to fail.
+ """
+ return self._AssertCalls(self, calls, self._watched)
+
+ def assertCall(self, call, action=None):
+ return self.assertCalls((call, action))
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/mock_calls_test.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/mock_calls_test.py
new file mode 100644
index 0000000..8eb4fc9
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/mock_calls_test.py
@@ -0,0 +1,173 @@
+#!/usr/bin/env python
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""
+Unit tests for the contents of mock_calls.py.
+"""
+
+import logging
+import os
+import unittest
+
+from devil import devil_env
+from devil.android.sdk import version_codes
+from devil.utils import mock_calls
+
+with devil_env.SysPath(devil_env.PYMOCK_PATH):
+ import mock # pylint: disable=import-error
+
+
+class _DummyAdb(object):
+
+ def __str__(self):
+ return '0123456789abcdef'
+
+ def Push(self, host_path, device_path):
+ logging.debug('(device %s) pushing %r to %r', self, host_path, device_path)
+
+ def IsOnline(self):
+ logging.debug('(device %s) checking device online', self)
+ return True
+
+ def Shell(self, cmd):
+ logging.debug('(device %s) running command %r', self, cmd)
+ return "nice output\n"
+
+ def Reboot(self):
+ logging.debug('(device %s) rebooted!', self)
+
+ @property
+ def build_version_sdk(self):
+ logging.debug('(device %s) getting build_version_sdk', self)
+ return version_codes.LOLLIPOP
+
+
+class TestCaseWithAssertCallsTest(mock_calls.TestCase):
+
+ def setUp(self):
+ self.adb = _DummyAdb()
+
+ def ShellError(self):
+ def action(cmd):
+ raise ValueError('(device %s) command %r is not nice' % (self.adb, cmd))
+ return action
+
+ def get_answer(self):
+ logging.debug("called 'get_answer' of %r object", self)
+ return 42
+
+ def echo(self, thing):
+ logging.debug("called 'echo' of %r object", self)
+ return thing
+
+ def testCallTarget_succeds(self):
+ self.assertEquals(self.adb.Shell,
+ self.call_target(self.call.adb.Shell))
+
+ def testCallTarget_failsExternal(self):
+ with self.assertRaises(ValueError):
+ self.call_target(mock.call.sys.getcwd)
+
+ def testCallTarget_failsUnknownAttribute(self):
+ with self.assertRaises(AttributeError):
+ self.call_target(self.call.adb.Run)
+
+ def testCallTarget_failsIntermediateCalls(self):
+ with self.assertRaises(AttributeError):
+ self.call_target(self.call.adb.RunShell('cmd').append)
+
+ def testPatchCall_method(self):
+ self.assertEquals(42, self.get_answer())
+ with self.patch_call(self.call.get_answer, return_value=123):
+ self.assertEquals(123, self.get_answer())
+ self.assertEquals(42, self.get_answer())
+
+ def testPatchCall_attribute_method(self):
+ with self.patch_call(self.call.adb.Shell, return_value='hello'):
+ self.assertEquals('hello', self.adb.Shell('echo hello'))
+
+ def testPatchCall_global(self):
+ with self.patch_call(mock.call.os.getcwd, return_value='/some/path'):
+ self.assertEquals('/some/path', os.getcwd())
+
+ def testPatchCall_withSideEffect(self):
+ with self.patch_call(self.call.adb.Shell, side_effect=ValueError):
+ with self.assertRaises(ValueError):
+ self.adb.Shell('echo hello')
+
+ def testPatchCall_property(self):
+ self.assertEquals(version_codes.LOLLIPOP, self.adb.build_version_sdk)
+ with self.patch_call(
+ self.call.adb.build_version_sdk,
+ return_value=version_codes.KITKAT):
+ self.assertEquals(version_codes.KITKAT, self.adb.build_version_sdk)
+ self.assertEquals(version_codes.LOLLIPOP, self.adb.build_version_sdk)
+
+ def testAssertCalls_succeeds_simple(self):
+ self.assertEquals(42, self.get_answer())
+ with self.assertCall(self.call.get_answer(), 123):
+ self.assertEquals(123, self.get_answer())
+ self.assertEquals(42, self.get_answer())
+
+ def testAssertCalls_succeeds_multiple(self):
+ with self.assertCalls(
+ (mock.call.os.getcwd(), '/some/path'),
+ (self.call.echo('hello'), 'hello'),
+ (self.call.get_answer(), 11),
+ self.call.adb.Push('this_file', 'that_file'),
+ (self.call.get_answer(), 12)):
+ self.assertEquals(os.getcwd(), '/some/path')
+ self.assertEquals('hello', self.echo('hello'))
+ self.assertEquals(11, self.get_answer())
+ self.adb.Push('this_file', 'that_file')
+ self.assertEquals(12, self.get_answer())
+
+ def testAsserCalls_succeeds_withAction(self):
+ with self.assertCall(
+ self.call.adb.Shell('echo hello'), self.ShellError()):
+ with self.assertRaises(ValueError):
+ self.adb.Shell('echo hello')
+
+ def testAssertCalls_fails_tooManyCalls(self):
+ with self.assertRaises(AssertionError):
+ with self.assertCalls(self.call.adb.IsOnline()):
+ self.adb.IsOnline()
+ self.adb.IsOnline()
+
+ def testAssertCalls_fails_tooFewCalls(self):
+ with self.assertRaises(AssertionError):
+ with self.assertCalls(self.call.adb.IsOnline()):
+ pass
+
+ def testAssertCalls_succeeds_extraCalls(self):
+ # we are not watching Reboot, so the assertion succeeds
+ with self.assertCalls(self.call.adb.IsOnline()):
+ self.adb.IsOnline()
+ self.adb.Reboot()
+
+ def testAssertCalls_fails_extraCalls(self):
+ self.watchCalls([self.call.adb.Reboot])
+ # this time we are also watching Reboot, so the assertion fails
+ with self.assertRaises(AssertionError):
+ with self.assertCalls(self.call.adb.IsOnline()):
+ self.adb.IsOnline()
+ self.adb.Reboot()
+
+ def testAssertCalls_succeeds_NoCalls(self):
+ self.watchMethodCalls(self.call.adb) # we are watching all adb methods
+ with self.assertCalls():
+ pass
+
+ def testAssertCalls_fails_NoCalls(self):
+ self.watchMethodCalls(self.call.adb)
+ with self.assertRaises(AssertionError):
+ with self.assertCalls():
+ self.adb.IsOnline()
+
+
+if __name__ == '__main__':
+ logging.getLogger().setLevel(logging.DEBUG)
+ unittest.main(verbosity=2)
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/parallelizer.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/parallelizer.py
new file mode 100644
index 0000000..3599525
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/parallelizer.py
@@ -0,0 +1,238 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+""" Wrapper that allows method execution in parallel.
+
+This class wraps a list of objects of the same type, emulates their
+interface, and executes any functions called on the objects in parallel
+in ReraiserThreads.
+
+This means that, given a list of objects:
+
+ class Foo:
+ def __init__(self):
+ self.baz = Baz()
+
+ def bar(self, my_param):
+ // do something
+
+ list_of_foos = [Foo(1), Foo(2), Foo(3)]
+
+we can take a sequential operation on that list of objects:
+
+ for f in list_of_foos:
+ f.bar('Hello')
+
+and run it in parallel across all of the objects:
+
+ Parallelizer(list_of_foos).bar('Hello')
+
+It can also handle (non-method) attributes of objects, so that this:
+
+ for f in list_of_foos:
+ f.baz.myBazMethod()
+
+can be run in parallel with:
+
+ Parallelizer(list_of_foos).baz.myBazMethod()
+
+Because it emulates the interface of the wrapped objects, a Parallelizer
+can be passed to a method or function that takes objects of that type:
+
+ def DoesSomethingWithFoo(the_foo):
+ the_foo.bar('Hello')
+ the_foo.bar('world')
+ the_foo.baz.myBazMethod
+
+ DoesSomethingWithFoo(Parallelizer(list_of_foos))
+
+Note that this class spins up a thread for each object. Using this class
+to parallelize operations that are already fast will incur a net performance
+penalty.
+
+"""
+# pylint: disable=protected-access
+
+from devil.utils import reraiser_thread
+from devil.utils import watchdog_timer
+
+_DEFAULT_TIMEOUT = 30
+_DEFAULT_RETRIES = 3
+
+
+class Parallelizer(object):
+ """Allows parallel execution of method calls across a group of objects."""
+
+ def __init__(self, objs):
+ self._orig_objs = objs
+ self._objs = objs
+
+ def __getattr__(self, name):
+ """Emulate getting the |name| attribute of |self|.
+
+ Args:
+ name: The name of the attribute to retrieve.
+ Returns:
+ A Parallelizer emulating the |name| attribute of |self|.
+ """
+ self.pGet(None)
+
+ r = type(self)(self._orig_objs)
+ r._objs = [getattr(o, name) for o in self._objs]
+ return r
+
+ def __getitem__(self, index):
+ """Emulate getting the value of |self| at |index|.
+
+ Returns:
+ A Parallelizer emulating the value of |self| at |index|.
+ """
+ self.pGet(None)
+
+ r = type(self)(self._orig_objs)
+ r._objs = [o[index] for o in self._objs]
+ return r
+
+ def __call__(self, *args, **kwargs):
+ """Emulate calling |self| with |args| and |kwargs|.
+
+ Note that this call is asynchronous. Call pFinish on the return value to
+ block until the call finishes.
+
+ Returns:
+ A Parallelizer wrapping the ReraiserThreadGroup running the call in
+ parallel.
+ Raises:
+ AttributeError if the wrapped objects aren't callable.
+ """
+ self.pGet(None)
+
+ for o in self._objs:
+ if not callable(o):
+ raise AttributeError("'%s' is not callable" % o.__name__)
+
+ r = type(self)(self._orig_objs)
+ r._objs = reraiser_thread.ReraiserThreadGroup(
+ [reraiser_thread.ReraiserThread(
+ o, args=args, kwargs=kwargs,
+ name='%s.%s' % (str(d), o.__name__))
+ for d, o in zip(self._orig_objs, self._objs)])
+ r._objs.StartAll() # pylint: disable=W0212
+ return r
+
+ def pFinish(self, timeout):
+ """Finish any outstanding asynchronous operations.
+
+ Args:
+ timeout: The maximum number of seconds to wait for an individual
+ result to return, or None to wait forever.
+ Returns:
+ self, now emulating the return values.
+ """
+ self._assertNoShadow('pFinish')
+ if isinstance(self._objs, reraiser_thread.ReraiserThreadGroup):
+ self._objs.JoinAll()
+ self._objs = self._objs.GetAllReturnValues(
+ watchdog_timer.WatchdogTimer(timeout))
+ return self
+
+ def pGet(self, timeout):
+ """Get the current wrapped objects.
+
+ Args:
+ timeout: Same as |pFinish|.
+ Returns:
+ A list of the results, in order of the provided devices.
+ Raises:
+ Any exception raised by any of the called functions.
+ """
+ self._assertNoShadow('pGet')
+ self.pFinish(timeout)
+ return self._objs
+
+ def pMap(self, f, *args, **kwargs):
+ """Map a function across the current wrapped objects in parallel.
+
+ This calls f(o, *args, **kwargs) for each o in the set of wrapped objects.
+
+ Note that this call is asynchronous. Call pFinish on the return value to
+ block until the call finishes.
+
+ Args:
+ f: The function to call.
+ args: The positional args to pass to f.
+ kwargs: The keyword args to pass to f.
+ Returns:
+ A Parallelizer wrapping the ReraiserThreadGroup running the map in
+ parallel.
+ """
+ self._assertNoShadow('pMap')
+ r = type(self)(self._orig_objs)
+ r._objs = reraiser_thread.ReraiserThreadGroup(
+ [reraiser_thread.ReraiserThread(
+ f, args=tuple([o] + list(args)), kwargs=kwargs,
+ name='%s(%s)' % (f.__name__, d))
+ for d, o in zip(self._orig_objs, self._objs)])
+ r._objs.StartAll() # pylint: disable=W0212
+ return r
+
+ def _assertNoShadow(self, attr_name):
+ """Ensures that |attr_name| isn't shadowing part of the wrapped obejcts.
+
+ If the wrapped objects _do_ have an |attr_name| attribute, it will be
+ inaccessible to clients.
+
+ Args:
+ attr_name: The attribute to check.
+ Raises:
+ AssertionError if the wrapped objects have an attribute named 'attr_name'
+ or '_assertNoShadow'.
+ """
+ if isinstance(self._objs, reraiser_thread.ReraiserThreadGroup):
+ assert not hasattr(self._objs, '_assertNoShadow')
+ assert not hasattr(self._objs, attr_name)
+ else:
+ assert not any(hasattr(o, '_assertNoShadow') for o in self._objs)
+ assert not any(hasattr(o, attr_name) for o in self._objs)
+
+
+class SyncParallelizer(Parallelizer):
+ """A Parallelizer that blocks on function calls."""
+
+ # override
+ def __call__(self, *args, **kwargs):
+ """Emulate calling |self| with |args| and |kwargs|.
+
+ Note that this call is synchronous.
+
+ Returns:
+ A Parallelizer emulating the value returned from calling |self| with
+ |args| and |kwargs|.
+ Raises:
+ AttributeError if the wrapped objects aren't callable.
+ """
+ r = super(SyncParallelizer, self).__call__(*args, **kwargs)
+ r.pFinish(None)
+ return r
+
+ # override
+ def pMap(self, f, *args, **kwargs):
+ """Map a function across the current wrapped objects in parallel.
+
+ This calls f(o, *args, **kwargs) for each o in the set of wrapped objects.
+
+ Note that this call is synchronous.
+
+ Args:
+ f: The function to call.
+ args: The positional args to pass to f.
+ kwargs: The keyword args to pass to f.
+ Returns:
+ A Parallelizer wrapping the ReraiserThreadGroup running the map in
+ parallel.
+ """
+ r = super(SyncParallelizer, self).pMap(f, *args, **kwargs)
+ r.pFinish(None)
+ return r
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/parallelizer_test.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/parallelizer_test.py
new file mode 100644
index 0000000..32ff7ec
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/parallelizer_test.py
@@ -0,0 +1,162 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Unit tests for the contents of parallelizer.py."""
+
+# pylint: disable=W0212
+# pylint: disable=W0613
+
+import os
+import tempfile
+import time
+import unittest
+
+from devil.utils import parallelizer
+
+
+class ParallelizerTestObject(object):
+ """Class used to test parallelizer.Parallelizer."""
+
+ parallel = parallelizer.Parallelizer
+
+ def __init__(self, thing, completion_file_name=None):
+ self._thing = thing
+ self._completion_file_name = completion_file_name
+ self.helper = ParallelizerTestObjectHelper(thing)
+
+ @staticmethod
+ def doReturn(what):
+ return what
+
+ @classmethod
+ def doRaise(cls, what):
+ raise what
+
+ def doSetTheThing(self, new_thing):
+ self._thing = new_thing
+
+ def doReturnTheThing(self):
+ return self._thing
+
+ def doRaiseTheThing(self):
+ raise self._thing
+
+ def doRaiseIfExceptionElseSleepFor(self, sleep_duration):
+ if isinstance(self._thing, Exception):
+ raise self._thing
+ time.sleep(sleep_duration)
+ self._write_completion_file()
+ return self._thing
+
+ def _write_completion_file(self):
+ if self._completion_file_name and len(self._completion_file_name):
+ with open(self._completion_file_name, 'w+b') as completion_file:
+ completion_file.write('complete')
+
+ def __getitem__(self, index):
+ return self._thing[index]
+
+ def __str__(self):
+ return type(self).__name__
+
+
+class ParallelizerTestObjectHelper(object):
+
+ def __init__(self, thing):
+ self._thing = thing
+
+ def doReturnStringThing(self):
+ return str(self._thing)
+
+
+class ParallelizerTest(unittest.TestCase):
+
+ def testInitEmptyList(self):
+ r = parallelizer.Parallelizer([]).replace('a', 'b').pGet(0.1)
+ self.assertEquals([], r)
+
+ def testMethodCall(self):
+ test_data = ['abc_foo', 'def_foo', 'ghi_foo']
+ expected = ['abc_bar', 'def_bar', 'ghi_bar']
+ r = parallelizer.Parallelizer(test_data).replace('_foo', '_bar').pGet(0.1)
+ self.assertEquals(expected, r)
+
+ def testMutate(self):
+ devices = [ParallelizerTestObject(True) for _ in xrange(0, 10)]
+ self.assertTrue(all(d.doReturnTheThing() for d in devices))
+ ParallelizerTestObject.parallel(devices).doSetTheThing(False).pFinish(1)
+ self.assertTrue(not any(d.doReturnTheThing() for d in devices))
+
+ def testAllReturn(self):
+ devices = [ParallelizerTestObject(True) for _ in xrange(0, 10)]
+ results = ParallelizerTestObject.parallel(
+ devices).doReturnTheThing().pGet(1)
+ self.assertTrue(isinstance(results, list))
+ self.assertEquals(10, len(results))
+ self.assertTrue(all(results))
+
+ def testAllRaise(self):
+ devices = [ParallelizerTestObject(Exception('thing %d' % i))
+ for i in xrange(0, 10)]
+ p = ParallelizerTestObject.parallel(devices).doRaiseTheThing()
+ with self.assertRaises(Exception):
+ p.pGet(1)
+
+ def testOneFailOthersComplete(self):
+ parallel_device_count = 10
+ exception_index = 7
+ exception_msg = 'thing %d' % exception_index
+
+ try:
+ completion_files = [tempfile.NamedTemporaryFile(delete=False)
+ for _ in xrange(0, parallel_device_count)]
+ devices = [
+ ParallelizerTestObject(
+ i if i != exception_index else Exception(exception_msg),
+ completion_files[i].name)
+ for i in xrange(0, parallel_device_count)]
+ for f in completion_files:
+ f.close()
+ p = ParallelizerTestObject.parallel(devices)
+ with self.assertRaises(Exception) as e:
+ p.doRaiseIfExceptionElseSleepFor(2).pGet(3)
+ self.assertTrue(exception_msg in str(e.exception))
+ for i in xrange(0, parallel_device_count):
+ with open(completion_files[i].name) as f:
+ if i == exception_index:
+ self.assertEquals('', f.read())
+ else:
+ self.assertEquals('complete', f.read())
+ finally:
+ for f in completion_files:
+ os.remove(f.name)
+
+ def testReusable(self):
+ devices = [ParallelizerTestObject(True) for _ in xrange(0, 10)]
+ p = ParallelizerTestObject.parallel(devices)
+ results = p.doReturn(True).pGet(1)
+ self.assertTrue(all(results))
+ results = p.doReturn(True).pGet(1)
+ self.assertTrue(all(results))
+ with self.assertRaises(Exception):
+ results = p.doRaise(Exception('reusableTest')).pGet(1)
+
+ def testContained(self):
+ devices = [ParallelizerTestObject(i) for i in xrange(0, 10)]
+ results = (ParallelizerTestObject.parallel(devices).helper
+ .doReturnStringThing().pGet(1))
+ self.assertTrue(isinstance(results, list))
+ self.assertEquals(10, len(results))
+ for i in xrange(0, 10):
+ self.assertEquals(str(i), results[i])
+
+ def testGetItem(self):
+ devices = [ParallelizerTestObject(range(i, i + 10)) for i in xrange(0, 10)]
+ results = ParallelizerTestObject.parallel(devices)[9].pGet(1)
+ self.assertEquals(range(9, 19), results)
+
+
+if __name__ == '__main__':
+ unittest.main(verbosity=2)
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/reraiser_thread.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/reraiser_thread.py
new file mode 100644
index 0000000..56d95f3
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/reraiser_thread.py
@@ -0,0 +1,228 @@
+# Copyright 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Thread and ThreadGroup that reraise exceptions on the main thread."""
+# pylint: disable=W0212
+
+import logging
+import sys
+import threading
+import time
+import traceback
+
+from devil.utils import watchdog_timer
+
+
+class TimeoutError(Exception):
+ """Module-specific timeout exception."""
+ pass
+
+
+def LogThreadStack(thread, error_log_func=logging.critical):
+ """Log the stack for the given thread.
+
+ Args:
+ thread: a threading.Thread instance.
+ error_log_func: Logging function when logging errors.
+ """
+ stack = sys._current_frames()[thread.ident]
+ error_log_func('*' * 80)
+ error_log_func('Stack dump for thread %r', thread.name)
+ error_log_func('*' * 80)
+ for filename, lineno, name, line in traceback.extract_stack(stack):
+ error_log_func('File: "%s", line %d, in %s', filename, lineno, name)
+ if line:
+ error_log_func(' %s', line.strip())
+ error_log_func('*' * 80)
+
+
+class ReraiserThread(threading.Thread):
+ """Thread class that can reraise exceptions."""
+
+ def __init__(self, func, args=None, kwargs=None, name=None):
+ """Initialize thread.
+
+ Args:
+ func: callable to call on a new thread.
+ args: list of positional arguments for callable, defaults to empty.
+ kwargs: dictionary of keyword arguments for callable, defaults to empty.
+ name: thread name, defaults to Thread-N.
+ """
+ if not name and func.__name__ != '<lambda>':
+ name = func.__name__
+ super(ReraiserThread, self).__init__(name=name)
+ if not args:
+ args = []
+ if not kwargs:
+ kwargs = {}
+ self.daemon = True
+ self._func = func
+ self._args = args
+ self._kwargs = kwargs
+ self._ret = None
+ self._exc_info = None
+ self._thread_group = None
+
+ def ReraiseIfException(self):
+ """Reraise exception if an exception was raised in the thread."""
+ if self._exc_info:
+ raise self._exc_info[0], self._exc_info[1], self._exc_info[2]
+
+ def GetReturnValue(self):
+ """Reraise exception if present, otherwise get the return value."""
+ self.ReraiseIfException()
+ return self._ret
+
+ # override
+ def run(self):
+ """Overrides Thread.run() to add support for reraising exceptions."""
+ try:
+ self._ret = self._func(*self._args, **self._kwargs)
+ except: # pylint: disable=W0702
+ self._exc_info = sys.exc_info()
+
+
+class ReraiserThreadGroup(object):
+ """A group of ReraiserThread objects."""
+
+ def __init__(self, threads=None):
+ """Initialize thread group.
+
+ Args:
+ threads: a list of ReraiserThread objects; defaults to empty.
+ """
+ self._threads = []
+ # Set when a thread from one group has called JoinAll on another. It is used
+ # to detect when a there is a TimeoutRetryThread active that links to the
+ # current thread.
+ self.blocked_parent_thread_group = None
+ if threads:
+ for thread in threads:
+ self.Add(thread)
+
+ def Add(self, thread):
+ """Add a thread to the group.
+
+ Args:
+ thread: a ReraiserThread object.
+ """
+ assert thread._thread_group is None
+ thread._thread_group = self
+ self._threads.append(thread)
+
+ def StartAll(self, will_block=False):
+ """Start all threads.
+
+ Args:
+ will_block: Whether the calling thread will subsequently block on this
+ thread group. Causes the active ReraiserThreadGroup (if there is one)
+ to be marked as blocking on this thread group.
+ """
+ if will_block:
+ # Multiple threads blocking on the same outer thread should not happen in
+ # practice.
+ assert not self.blocked_parent_thread_group
+ self.blocked_parent_thread_group = CurrentThreadGroup()
+ for thread in self._threads:
+ thread.start()
+
+ def _JoinAll(self, watcher=None, timeout=None):
+ """Join all threads without stack dumps.
+
+ Reraises exceptions raised by the child threads and supports breaking
+ immediately on exceptions raised on the main thread.
+
+ Args:
+ watcher: Watchdog object providing the thread timeout. If none is
+ provided, the thread will never be timed out.
+ timeout: An optional number of seconds to wait before timing out the join
+ operation. This will not time out the threads.
+ """
+ if watcher is None:
+ watcher = watchdog_timer.WatchdogTimer(None)
+ alive_threads = self._threads[:]
+ end_time = (time.time() + timeout) if timeout else None
+ try:
+ while alive_threads and (end_time is None or end_time > time.time()):
+ for thread in alive_threads[:]:
+ if watcher.IsTimedOut():
+ raise TimeoutError('Timed out waiting for %d of %d threads.' %
+ (len(alive_threads), len(self._threads)))
+ # Allow the main thread to periodically check for interrupts.
+ thread.join(0.1)
+ if not thread.isAlive():
+ alive_threads.remove(thread)
+ # All threads are allowed to complete before reraising exceptions.
+ for thread in self._threads:
+ thread.ReraiseIfException()
+ finally:
+ self.blocked_parent_thread_group = None
+
+ def IsAlive(self):
+ """Check whether any of the threads are still alive.
+
+ Returns:
+ Whether any of the threads are still alive.
+ """
+ return any(t.isAlive() for t in self._threads)
+
+ def JoinAll(self, watcher=None, timeout=None,
+ error_log_func=logging.critical):
+ """Join all threads.
+
+ Reraises exceptions raised by the child threads and supports breaking
+ immediately on exceptions raised on the main thread. Unfinished threads'
+ stacks will be logged on watchdog timeout.
+
+ Args:
+ watcher: Watchdog object providing the thread timeout. If none is
+ provided, the thread will never be timed out.
+ timeout: An optional number of seconds to wait before timing out the join
+ operation. This will not time out the threads.
+ error_log_func: Logging function when logging errors.
+ """
+ try:
+ self._JoinAll(watcher, timeout)
+ except TimeoutError:
+ error_log_func('Timed out. Dumping threads.')
+ for thread in (t for t in self._threads if t.isAlive()):
+ LogThreadStack(thread, error_log_func=error_log_func)
+ raise
+
+ def GetAllReturnValues(self, watcher=None):
+ """Get all return values, joining all threads if necessary.
+
+ Args:
+ watcher: same as in |JoinAll|. Only used if threads are alive.
+ """
+ if any([t.isAlive() for t in self._threads]):
+ self.JoinAll(watcher)
+ return [t.GetReturnValue() for t in self._threads]
+
+
+def CurrentThreadGroup():
+ """Returns the ReraiserThreadGroup that owns the running thread.
+
+ Returns:
+ The current thread group, otherwise None.
+ """
+ current_thread = threading.current_thread()
+ if isinstance(current_thread, ReraiserThread):
+ return current_thread._thread_group # pylint: disable=no-member
+ return None
+
+
+def RunAsync(funcs, watcher=None):
+ """Executes the given functions in parallel and returns their results.
+
+ Args:
+ funcs: List of functions to perform on their own threads.
+ watcher: Watchdog object providing timeout, by default waits forever.
+
+ Returns:
+ A list of return values in the order of the given functions.
+ """
+ thread_group = ReraiserThreadGroup(ReraiserThread(f) for f in funcs)
+ thread_group.StartAll(will_block=True)
+ return thread_group.GetAllReturnValues(watcher=watcher)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/reraiser_thread_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/reraiser_thread_unittest.py
new file mode 100644
index 0000000..e3c4e6b
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/reraiser_thread_unittest.py
@@ -0,0 +1,117 @@
+# Copyright 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Unittests for reraiser_thread.py."""
+
+import threading
+import unittest
+
+from devil.utils import reraiser_thread
+from devil.utils import watchdog_timer
+
+
+class TestException(Exception):
+ pass
+
+
+class TestReraiserThread(unittest.TestCase):
+ """Tests for reraiser_thread.ReraiserThread."""
+
+ def testNominal(self):
+ result = [None, None]
+
+ def f(a, b=None):
+ result[0] = a
+ result[1] = b
+
+ thread = reraiser_thread.ReraiserThread(f, [1], {'b': 2})
+ thread.start()
+ thread.join()
+ self.assertEqual(result[0], 1)
+ self.assertEqual(result[1], 2)
+
+ def testRaise(self):
+ def f():
+ raise TestException
+
+ thread = reraiser_thread.ReraiserThread(f)
+ thread.start()
+ thread.join()
+ with self.assertRaises(TestException):
+ thread.ReraiseIfException()
+
+
+class TestReraiserThreadGroup(unittest.TestCase):
+ """Tests for reraiser_thread.ReraiserThreadGroup."""
+
+ def testInit(self):
+ ran = [False] * 5
+
+ def f(i):
+ ran[i] = True
+
+ group = reraiser_thread.ReraiserThreadGroup(
+ [reraiser_thread.ReraiserThread(f, args=[i]) for i in range(5)])
+ group.StartAll()
+ group.JoinAll()
+ for v in ran:
+ self.assertTrue(v)
+
+ def testAdd(self):
+ ran = [False] * 5
+
+ def f(i):
+ ran[i] = True
+
+ group = reraiser_thread.ReraiserThreadGroup()
+ for i in xrange(5):
+ group.Add(reraiser_thread.ReraiserThread(f, args=[i]))
+ group.StartAll()
+ group.JoinAll()
+ for v in ran:
+ self.assertTrue(v)
+
+ def testJoinRaise(self):
+ def f():
+ raise TestException
+ group = reraiser_thread.ReraiserThreadGroup(
+ [reraiser_thread.ReraiserThread(f) for _ in xrange(5)])
+ group.StartAll()
+ with self.assertRaises(TestException):
+ group.JoinAll()
+
+ def testJoinTimeout(self):
+ def f():
+ pass
+ event = threading.Event()
+
+ def g():
+ event.wait()
+ group = reraiser_thread.ReraiserThreadGroup(
+ [reraiser_thread.ReraiserThread(g),
+ reraiser_thread.ReraiserThread(f)])
+ group.StartAll()
+ with self.assertRaises(reraiser_thread.TimeoutError):
+ group.JoinAll(watchdog_timer.WatchdogTimer(0.01))
+ event.set()
+
+
+class TestRunAsync(unittest.TestCase):
+ """Tests for reraiser_thread.RunAsync."""
+
+ def testNoArgs(self):
+ results = reraiser_thread.RunAsync([])
+ self.assertEqual([], results)
+
+ def testOneArg(self):
+ results = reraiser_thread.RunAsync([lambda: 1])
+ self.assertEqual([1], results)
+
+ def testTwoArgs(self):
+ a, b = reraiser_thread.RunAsync((lambda: 1, lambda: 2))
+ self.assertEqual(1, a)
+ self.assertEqual(2, b)
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/reset_usb.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/reset_usb.py
new file mode 100644
index 0000000..0335227
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/reset_usb.py
@@ -0,0 +1,111 @@
+#!/usr/bin/env python
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import argparse
+import fcntl
+import logging
+import os
+import re
+import sys
+
+if __name__ == '__main__':
+ sys.path.append(
+ os.path.abspath(os.path.join(os.path.dirname(__file__),
+ '..', '..')))
+
+from devil.android import device_errors
+from devil.utils import lsusb
+from devil.utils import run_tests_helper
+
+logger = logging.getLogger(__name__)
+
+_INDENTATION_RE = re.compile(r'^( *)')
+_LSUSB_BUS_DEVICE_RE = re.compile(r'^Bus (\d{3}) Device (\d{3}):')
+_LSUSB_ENTRY_RE = re.compile(r'^ *([^ ]+) +([^ ]+) *([^ ].*)?$')
+_LSUSB_GROUP_RE = re.compile(r'^ *([^ ]+.*):$')
+
+_USBDEVFS_RESET = ord('U') << 8 | 20
+
+
+def reset_usb(bus, device):
+ """Reset the USB device with the given bus and device."""
+ usb_file_path = '/dev/bus/usb/%03d/%03d' % (bus, device)
+ with open(usb_file_path, 'w') as usb_file:
+ logger.debug('fcntl.ioctl(%s, %d)', usb_file_path, _USBDEVFS_RESET)
+ fcntl.ioctl(usb_file, _USBDEVFS_RESET)
+
+
+def reset_android_usb(serial):
+ """Reset the USB device for the given Android device."""
+ lsusb_info = lsusb.lsusb()
+
+ bus = None
+ device = None
+ for device_info in lsusb_info:
+ device_serial = lsusb.get_lsusb_serial(device_info)
+ if device_serial == serial:
+ bus = int(device_info.get('bus'))
+ device = int(device_info.get('device'))
+
+ if bus and device:
+ reset_usb(bus, device)
+ else:
+ raise device_errors.DeviceUnreachableError(
+ 'Unable to determine bus(%s) or device(%s) for device %s'
+ % (bus, device, serial))
+
+
+def reset_all_android_devices():
+ """Reset all USB devices that look like an Android device."""
+ _reset_all_matching(lambda i: bool(lsusb.get_lsusb_serial(i)))
+
+
+def _reset_all_matching(condition):
+ lsusb_info = lsusb.lsusb()
+ for device_info in lsusb_info:
+ if int(device_info.get('device')) != 1 and condition(device_info):
+ bus = int(device_info.get('bus'))
+ device = int(device_info.get('device'))
+ try:
+ reset_usb(bus, device)
+ serial = lsusb.get_lsusb_serial(device_info)
+ if serial:
+ logger.info(
+ 'Reset USB device (bus: %03d, device: %03d, serial: %s)',
+ bus, device, serial)
+ else:
+ logger.info(
+ 'Reset USB device (bus: %03d, device: %03d)',
+ bus, device)
+ except IOError:
+ logger.error(
+ 'Failed to reset USB device (bus: %03d, device: %03d)',
+ bus, device)
+
+
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument('-v', '--verbose', action='count')
+ parser.add_argument('-s', '--serial')
+ parser.add_argument('--bus', type=int)
+ parser.add_argument('--device', type=int)
+ args = parser.parse_args()
+
+ run_tests_helper.SetLogLevel(args.verbose)
+
+ if args.serial:
+ reset_android_usb(args.serial)
+ elif args.bus and args.device:
+ reset_usb(args.bus, args.device)
+ else:
+ parser.error('Unable to determine target. '
+ 'Specify --serial or BOTH --bus and --device.')
+
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main())
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/run_tests_helper.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/run_tests_helper.py
new file mode 100644
index 0000000..7df2da6
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/run_tests_helper.py
@@ -0,0 +1,44 @@
+# Copyright (c) 2012 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Helper functions common to native, java and host-driven test runners."""
+
+import logging
+import sys
+import time
+
+
+class CustomFormatter(logging.Formatter):
+ """Custom log formatter."""
+
+ # override
+ def __init__(self, fmt='%(threadName)-4s %(message)s'):
+ # Can't use super() because in older Python versions logging.Formatter does
+ # not inherit from object.
+ logging.Formatter.__init__(self, fmt=fmt)
+ self._creation_time = time.time()
+
+ # override
+ def format(self, record):
+ # Can't use super() because in older Python versions logging.Formatter does
+ # not inherit from object.
+ msg = logging.Formatter.format(self, record)
+ if 'MainThread' in msg[:19]:
+ msg = msg.replace('MainThread', 'Main', 1)
+ timediff = time.time() - self._creation_time
+ return '%s %8.3fs %s' % (record.levelname[0], timediff, msg)
+
+
+def SetLogLevel(verbose_count):
+ """Sets log level as |verbose_count|."""
+ log_level = logging.WARNING # Default.
+ if verbose_count == 1:
+ log_level = logging.INFO
+ elif verbose_count >= 2:
+ log_level = logging.DEBUG
+ logger = logging.getLogger()
+ logger.setLevel(log_level)
+ custom_handler = logging.StreamHandler(sys.stdout)
+ custom_handler.setFormatter(CustomFormatter())
+ logging.getLogger().addHandler(custom_handler)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/signal_handler.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/signal_handler.py
new file mode 100644
index 0000000..1230f8d
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/signal_handler.py
@@ -0,0 +1,48 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import contextlib
+import signal
+
+
+@contextlib.contextmanager
+def SignalHandler(signalnum, handler):
+ """Sets the signal handler for the given signal in the wrapped context.
+
+ Args:
+ signum: The signal for which a handler should be added.
+ additional_handler: The handler to add.
+ """
+ existing_handler = signal.getsignal(signalnum)
+
+ try:
+ signal.signal(signalnum, handler)
+ yield
+ finally:
+ signal.signal(signalnum, existing_handler)
+
+
+@contextlib.contextmanager
+def AddSignalHandler(signalnum, additional_handler):
+ """Adds a signal handler for the given signal in the wrapped context.
+
+ This runs the new handler after any existing handler rather than
+ replacing the existing handler.
+
+ Args:
+ signum: The signal for which a handler should be added.
+ additional_handler: The handler to add.
+ """
+ existing_handler = signal.getsignal(signalnum)
+
+ def handler(signum, frame):
+ if callable(existing_handler):
+ existing_handler(signum, frame)
+ additional_handler(signum, frame)
+
+ try:
+ signal.signal(signalnum, handler)
+ yield
+ finally:
+ signal.signal(signalnum, existing_handler)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/test/data/test_serial_map.json b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/test/data/test_serial_map.json
new file mode 100644
index 0000000..f068281
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/test/data/test_serial_map.json
@@ -0,0 +1 @@
+[{"phone": "Phone1", "battor": "BattOr1"}, {"phone": "Phone2", "battor": "BattOr2"}, {"phone": "Phone3", "battor": "BattOr3"}]
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/timeout_retry.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/timeout_retry.py
new file mode 100644
index 0000000..d230462
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/timeout_retry.py
@@ -0,0 +1,175 @@
+# Copyright 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""A utility to run functions with timeouts and retries."""
+# pylint: disable=W0702
+
+import logging
+import threading
+import time
+
+from devil.utils import reraiser_thread
+from devil.utils import watchdog_timer
+
+logger = logging.getLogger(__name__)
+
+
+class TimeoutRetryThreadGroup(reraiser_thread.ReraiserThreadGroup):
+
+ def __init__(self, timeout, threads=None):
+ super(TimeoutRetryThreadGroup, self).__init__(threads)
+ self._watcher = watchdog_timer.WatchdogTimer(timeout)
+
+ def GetWatcher(self):
+ """Returns the watchdog keeping track of this thread's time."""
+ return self._watcher
+
+ def GetElapsedTime(self):
+ return self._watcher.GetElapsed()
+
+ def GetRemainingTime(self, required=0, msg=None):
+ """Get the remaining time before the thread times out.
+
+ Useful to send as the |timeout| parameter of async IO operations.
+
+ Args:
+ required: minimum amount of time that will be required to complete, e.g.,
+ some sleep or IO operation.
+ msg: error message to show if timing out.
+
+ Returns:
+ The number of seconds remaining before the thread times out, or None
+ if the thread never times out.
+
+ Raises:
+ reraiser_thread.TimeoutError if the remaining time is less than the
+ required time.
+ """
+ remaining = self._watcher.GetRemaining()
+ if remaining is not None and remaining < required:
+ if msg is None:
+ msg = 'Timeout expired'
+ if remaining > 0:
+ msg += (', wait of %.1f secs required but only %.1f secs left'
+ % (required, remaining))
+ raise reraiser_thread.TimeoutError(msg)
+ return remaining
+
+
+def CurrentTimeoutThreadGroup():
+ """Returns the thread group that owns or is blocked on the active thread.
+
+ Returns:
+ Returns None if no TimeoutRetryThreadGroup is tracking the current thread.
+ """
+ thread_group = reraiser_thread.CurrentThreadGroup()
+ while thread_group:
+ if isinstance(thread_group, TimeoutRetryThreadGroup):
+ return thread_group
+ thread_group = thread_group.blocked_parent_thread_group
+ return None
+
+
+def WaitFor(condition, wait_period=5, max_tries=None):
+ """Wait for a condition to become true.
+
+ Repeatedly call the function condition(), with no arguments, until it returns
+ a true value.
+
+ If called within a TimeoutRetryThreadGroup, it cooperates nicely with it.
+
+ Args:
+ condition: function with the condition to check
+ wait_period: number of seconds to wait before retrying to check the
+ condition
+ max_tries: maximum number of checks to make, the default tries forever
+ or until the TimeoutRetryThreadGroup expires.
+
+ Returns:
+ The true value returned by the condition, or None if the condition was
+ not met after max_tries.
+
+ Raises:
+ reraiser_thread.TimeoutError: if the current thread is a
+ TimeoutRetryThreadGroup and the timeout expires.
+ """
+ condition_name = condition.__name__
+ timeout_thread_group = CurrentTimeoutThreadGroup()
+ while max_tries is None or max_tries > 0:
+ result = condition()
+ if max_tries is not None:
+ max_tries -= 1
+ msg = ['condition', repr(condition_name), 'met' if result else 'not met']
+ if timeout_thread_group:
+ # pylint: disable=no-member
+ msg.append('(%.1fs)' % timeout_thread_group.GetElapsedTime())
+ logger.info(' '.join(msg))
+ if result:
+ return result
+ if timeout_thread_group:
+ # pylint: disable=no-member
+ timeout_thread_group.GetRemainingTime(wait_period,
+ msg='Timed out waiting for %r' % condition_name)
+ time.sleep(wait_period)
+ return None
+
+
+def AlwaysRetry(_exception):
+ return True
+
+
+def Run(func, timeout, retries, args=None, kwargs=None, desc=None,
+ error_log_func=logging.critical, retry_if_func=AlwaysRetry):
+ """Runs the passed function in a separate thread with timeouts and retries.
+
+ Args:
+ func: the function to be wrapped.
+ timeout: the timeout in seconds for each try.
+ retries: the number of retries.
+ args: list of positional args to pass to |func|.
+ kwargs: dictionary of keyword args to pass to |func|.
+ desc: An optional description of |func| used in logging. If omitted,
+ |func.__name__| will be used.
+ error_log_func: Logging function when logging errors.
+ retry_if_func: Unary callable that takes an exception and returns
+ whether |func| should be retried. Defaults to always retrying.
+
+ Returns:
+ The return value of func(*args, **kwargs).
+ """
+ if not args:
+ args = []
+ if not kwargs:
+ kwargs = {}
+ if not desc:
+ desc = func.__name__
+
+ num_try = 1
+ while True:
+ thread_name = 'TimeoutThread-%d-for-%s' % (num_try,
+ threading.current_thread().name)
+ child_thread = reraiser_thread.ReraiserThread(lambda: func(*args, **kwargs),
+ name=thread_name)
+ try:
+ thread_group = TimeoutRetryThreadGroup(timeout, threads=[child_thread])
+ thread_group.StartAll(will_block=True)
+ while True:
+ thread_group.JoinAll(watcher=thread_group.GetWatcher(), timeout=60,
+ error_log_func=error_log_func)
+ if thread_group.IsAlive():
+ logger.info('Still working on %s', desc)
+ else:
+ return thread_group.GetAllReturnValues()[0]
+ except reraiser_thread.TimeoutError as e:
+ # Timeouts already get their stacks logged.
+ if num_try > retries or not retry_if_func(e):
+ raise
+ # Do not catch KeyboardInterrupt.
+ except Exception as e: # pylint: disable=broad-except
+ if num_try > retries or not retry_if_func(e):
+ raise
+ error_log_func(
+ '(%s) Exception on %s, attempt %d of %d: %r',
+ thread_name, desc, num_try, retries + 1, e)
+ num_try += 1
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/timeout_retry_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/timeout_retry_unittest.py
new file mode 100644
index 0000000..0eeb31a
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/timeout_retry_unittest.py
@@ -0,0 +1,79 @@
+#!/usr/bin/python
+# Copyright 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Unittests for timeout_and_retry.py."""
+
+import logging
+import time
+import unittest
+
+from devil.utils import reraiser_thread
+from devil.utils import timeout_retry
+
+
+_DEFAULT_TIMEOUT = .1
+
+
+class TestException(Exception):
+ pass
+
+
+def _CountTries(tries):
+ tries[0] += 1
+ raise TestException
+
+
+class TestRun(unittest.TestCase):
+ """Tests for timeout_retry.Run."""
+
+ def testRun(self):
+ self.assertTrue(timeout_retry.Run(
+ lambda x: x, 30, 3, [True], {}))
+
+ def testTimeout(self):
+ tries = [0]
+
+ def _sleep():
+ tries[0] += 1
+ time.sleep(1)
+
+ self.assertRaises(
+ reraiser_thread.TimeoutError, timeout_retry.Run, _sleep, .01, 1,
+ error_log_func=logging.debug)
+ self.assertEqual(tries[0], 2)
+
+ def testRetries(self):
+ tries = [0]
+ self.assertRaises(
+ TestException, timeout_retry.Run, lambda: _CountTries(tries),
+ _DEFAULT_TIMEOUT, 3, error_log_func=logging.debug)
+ self.assertEqual(tries[0], 4)
+
+ def testNoRetries(self):
+ tries = [0]
+ self.assertRaises(
+ TestException, timeout_retry.Run, lambda: _CountTries(tries),
+ _DEFAULT_TIMEOUT, 0, error_log_func=logging.debug)
+ self.assertEqual(tries[0], 1)
+
+ def testReturnValue(self):
+ self.assertTrue(timeout_retry.Run(lambda: True, _DEFAULT_TIMEOUT, 3))
+
+ def testCurrentTimeoutThreadGroup(self):
+ def InnerFunc():
+ current_thread_group = timeout_retry.CurrentTimeoutThreadGroup()
+ self.assertIsNotNone(current_thread_group)
+
+ def InnerInnerFunc():
+ self.assertEqual(current_thread_group,
+ timeout_retry.CurrentTimeoutThreadGroup())
+ return True
+ return reraiser_thread.RunAsync((InnerInnerFunc,))[0]
+
+ self.assertTrue(timeout_retry.Run(InnerFunc, _DEFAULT_TIMEOUT, 3))
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/update_mapping.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/update_mapping.py
new file mode 100644
index 0000000..6666b9b
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/update_mapping.py
@@ -0,0 +1,47 @@
+#!/usr/bin/env python
+
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import argparse
+import sys
+
+from devil.utils import battor_device_mapping
+
+def parse_options():
+ """Parses and checks the command-line options.
+
+ Returns:
+ A tuple containing the options structure.
+ """
+ usage = 'Usage: ./update_mapping.py [options]'
+ desc = ('Example: ./update_mapping.py -o mapping.json.\n'
+ 'This script generates and stores a file that gives the\n'
+ 'mapping between phone serial numbers and BattOr serial numbers\n'
+ 'Mapping is based on which physical ports on the USB hubs the\n'
+ 'devices are plugged in to. For instance, if there are two hubs,\n'
+ 'the phone connected to port N on the first hub is mapped to the\n'
+ 'BattOr connected to port N on the second hub, for each N.')
+ parser = argparse.ArgumentParser(usage=usage, description=desc)
+ parser.add_argument('-o', '--output', dest='out_file',
+ default='mapping.json', type=str,
+ action='store', help='mapping file name')
+ parser.add_argument('-u', '--hub', dest='hub_types',
+ action='append', choices=['plugable_7port',
+ 'plugable_7port_usb3_part2',
+ 'plugable_7port_usb3_part3'],
+ help='USB hub types.')
+ options = parser.parse_args()
+ if not options.hub_types:
+ options.hub_types = ['plugable_7port', 'plugable_7port_usb3_part2',
+ 'plugable_7port_usb3_part3']
+ return options
+
+def main():
+ options = parse_options()
+ battor_device_mapping.GenerateSerialMapFile(options.out_file,
+ options.hub_types)
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/usb_hubs.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/usb_hubs.py
new file mode 100644
index 0000000..b718694
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/usb_hubs.py
@@ -0,0 +1,184 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+PLUGABLE_7PORT_LAYOUT = {1:7,
+ 2:6,
+ 3:5,
+ 4:{1:4, 2:3, 3:2, 4:1}}
+
+PLUGABLE_7PORT_USB3_LAYOUT = {1:{1:1, 2:2, 3:3, 4:4},
+ 2:5,
+ 3:6,
+ 4:7}
+
+KEEDOX_LAYOUT = {1:1,
+ 2:2,
+ 3:3,
+ 4:{1:4, 2:5, 3:6, 4:7}}
+
+VIA_LAYOUT = {1:1,
+ 2:2,
+ 3:3,
+ 4:{1:4, 2:5, 3:6, 4:7}}
+
+class HubType(object):
+ def __init__(self, id_func, port_mapping):
+ """Defines a type of hub.
+
+ Args:
+ id_func: [USBNode -> bool] is a function that can be run on a node
+ to determine if the node represents this type of hub.
+ port_mapping: [dict(int:(int|dict))] maps virtual to physical port
+ numbers. For instance, {3:1, 1:2, 2:3} means that virtual port 3
+ corresponds to physical port 1, virtual port 1 corresponds to physical
+ port 2, and virtual port 2 corresponds to physical port 3. In the
+ case of hubs with "internal" topology, this is represented by nested
+ maps. For instance, {1:{1:1,2:2},2:{1:3,2:4}} means, e.g. that the
+ device plugged into physical port 3 will show up as being connected
+ to port 1, on a device which is connected to port 2 on the hub.
+ """
+ self._id_func = id_func
+ # v2p = "virtual to physical" ports
+ self._v2p_port = port_mapping
+
+ def IsType(self, node):
+ """Determines if the given Node is a hub of this type.
+
+ Args:
+ node: [USBNode] Node to check.
+ """
+ return self._id_func(node)
+
+ def GetPhysicalPortToNodeTuples(self, node):
+ """Gets devices connected to the physical ports on a hub of this type.
+
+ Args:
+ node: [USBNode] Node representing a hub of this type.
+
+ Yields:
+ A series of (int, USBNode) tuples giving a physical port
+ and the USBNode connected to it.
+
+ Raises:
+ ValueError: If the given node isn't a hub of this type.
+ """
+ if self.IsType(node):
+ for res in self._GppHelper(node, self._v2p_port):
+ yield res
+ else:
+ raise ValueError('Node must be a hub of this type')
+
+ def _GppHelper(self, node, mapping):
+ """Helper function for GetPhysicalPortToNodeMap.
+
+ Gets devices connected to physical ports, based on device tree
+ rooted at the given node and the mapping between virtual and physical
+ ports.
+
+ Args:
+ node: [USBNode] Root of tree to search for devices.
+ mapping: [dict] Mapping between virtual and physical ports.
+
+ Yields:
+ A series of (int, USBNode) tuples giving a physical port
+ and the Node connected to it.
+ """
+ for (virtual, physical) in mapping.iteritems():
+ if node.HasPort(virtual):
+ if isinstance(physical, dict):
+ for res in self._GppHelper(node.PortToDevice(virtual), physical):
+ yield res
+ else:
+ yield (physical, node.PortToDevice(virtual))
+
+def _is_plugable_7port_hub(node):
+ """Check if a node is a Plugable 7-Port Hub
+ (Model USB2-HUB7BC)
+ The topology of this device is a 4-port hub,
+ with another 4-port hub connected on port 4.
+ """
+ if '1a40:0101' not in node.desc:
+ return False
+ if not node.HasPort(4):
+ return False
+ return '1a40:0101' in node.PortToDevice(4).desc
+
+# Plugable 7-Port USB-3 Hubs show up twice in the USB devices list; they have
+# two different "branches", one which has USB2 devices and one which has
+# USB3 devices. The "part2" is the "USB-2" branch of the hub, the
+# "part3" is the "USB-3" branch of the hub.
+
+def _is_plugable_7port_usb3_part2_hub(node):
+ """Check if a node is the "USB2 branch" of
+ a Plugable 7-Port USB-3 Hub (Model USB3-HUB7BC)
+ The topology of this device is a 4-port hub,
+ with another 4-port hub connected on port 1.
+ """
+ if '2109:2811' not in node.desc:
+ return False
+ if not node.HasPort(1):
+ return False
+ return '2109:2811' in node.PortToDevice(1).desc
+
+def _is_plugable_7port_usb3_part3_hub(node):
+ """Check if a node is the "USB3 branch" of
+ a Plugable 7-Port USB-3 Hub (Model USB3-HUB7BC)
+ The topology of this device is a 4-port hub,
+ with another 4-port hub connected on port 1.
+ """
+ if '2109:8110' not in node.desc:
+ return False
+ if not node.HasPort(1):
+ return False
+ return '2109:8110' in node.PortToDevice(1).desc
+
+def _is_keedox_hub(node):
+ """Check if a node is a Keedox hub.
+ The topology of this device is a 4-port hub,
+ with another 4-port hub connected on port 4.
+ """
+ if '0bda:5411' not in node.desc:
+ return False
+ if not node.HasPort(4):
+ return False
+ return '0bda:5411' in node.PortToDevice(4).desc
+
+def _is_via_hub(node):
+ """Check if a node is a Via Labs hub.
+ The topology of this device is a 4-port hub,
+ with another 4-port hub connected on port 4.
+ """
+ if '2109:2812' not in node.desc:
+ return False
+ if not node.HasPort(4):
+ return False
+ return '2109:2812' in node.PortToDevice(4).desc
+
+
+PLUGABLE_7PORT = HubType(_is_plugable_7port_hub, PLUGABLE_7PORT_LAYOUT)
+PLUGABLE_7PORT_USB3_PART2 = HubType(_is_plugable_7port_usb3_part2_hub,
+ PLUGABLE_7PORT_USB3_LAYOUT)
+PLUGABLE_7PORT_USB3_PART3 = HubType(_is_plugable_7port_usb3_part3_hub,
+ PLUGABLE_7PORT_USB3_LAYOUT)
+KEEDOX = HubType(_is_keedox_hub, KEEDOX_LAYOUT)
+VIA = HubType(_is_via_hub, VIA_LAYOUT)
+
+ALL_HUBS = [PLUGABLE_7PORT,
+ PLUGABLE_7PORT_USB3_PART2,
+ PLUGABLE_7PORT_USB3_PART3,
+ KEEDOX,
+ VIA]
+
+def GetHubType(type_name):
+ if type_name == 'plugable_7port':
+ return PLUGABLE_7PORT
+ elif type_name == 'plugable_7port_usb3_part2':
+ return PLUGABLE_7PORT_USB3_PART2
+ elif type_name == 'plugable_7port_usb3_part3':
+ return PLUGABLE_7PORT_USB3_PART3
+ elif type_name == 'keedox':
+ return KEEDOX
+ elif type_name == 'via':
+ return VIA
+ raise ValueError('Invalid hub type')
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/watchdog_timer.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/watchdog_timer.py
new file mode 100644
index 0000000..2f4c464
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/watchdog_timer.py
@@ -0,0 +1,47 @@
+# Copyright 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""WatchdogTimer timeout objects."""
+
+import time
+
+
+class WatchdogTimer(object):
+ """A resetable timeout-based watchdog.
+
+ This object is threadsafe.
+ """
+
+ def __init__(self, timeout):
+ """Initializes the watchdog.
+
+ Args:
+ timeout: The timeout in seconds. If timeout is None it will never timeout.
+ """
+ self._start_time = time.time()
+ self._timeout = timeout
+
+ def Reset(self):
+ """Resets the timeout countdown."""
+ self._start_time = time.time()
+
+ def GetElapsed(self):
+ """Returns the elapsed time of the watchdog."""
+ return time.time() - self._start_time
+
+ def GetRemaining(self):
+ """Returns the remaining time of the watchdog."""
+ if self._timeout:
+ return self._timeout - self.GetElapsed()
+ else:
+ return None
+
+ def IsTimedOut(self):
+ """Whether the watchdog has timed out.
+
+ Returns:
+ True if the watchdog has timed out, False otherwise.
+ """
+ remaining = self.GetRemaining()
+ return remaining is not None and remaining < 0
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/zip_utils.py b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/zip_utils.py
new file mode 100644
index 0000000..eaa6a2d
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/devil/utils/zip_utils.py
@@ -0,0 +1,33 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import logging
+import os
+import zipfile
+
+logger = logging.getLogger(__name__)
+
+
+def WriteToZipFile(zip_file, path, arc_path):
+ """Recursively write |path| to |zip_file| as |arc_path|.
+
+ zip_file: An open instance of zipfile.ZipFile.
+ path: An absolute path to the file or directory to be zipped.
+ arc_path: A relative path within the zip file to which the file or directory
+ located at |path| should be written.
+ """
+ if os.path.isdir(path):
+ for dir_path, _, file_names in os.walk(path):
+ dir_arc_path = os.path.join(arc_path, os.path.relpath(dir_path, path))
+ logger.debug('dir: %s -> %s', dir_path, dir_arc_path)
+ zip_file.write(dir_path, dir_arc_path, zipfile.ZIP_STORED)
+ for f in file_names:
+ file_path = os.path.join(dir_path, f)
+ file_arc_path = os.path.join(dir_arc_path, f)
+ logger.debug('file: %s -> %s', file_path, file_arc_path)
+ zip_file.write(file_path, file_arc_path, zipfile.ZIP_DEFLATED)
+ else:
+ logger.debug('file: %s -> %s', path, arc_path)
+ zip_file.write(path, arc_path, zipfile.ZIP_DEFLATED)
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/docs/adb_wrapper.md b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/docs/adb_wrapper.md
new file mode 100644
index 0000000..a8dc3b0
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/docs/adb_wrapper.md
@@ -0,0 +1,388 @@
+# [devil.android.sdk.adb_wrapper](https://github.com/catapult-project/catapult/blob/master/devil/devil/android/sdk/adb_wrapper.py)
+
+*This page was autogenerated by `devil/utils/markdown.py --module-link https://github.com/catapult-project/catapult/blob/master/devil/devil/android/sdk/adb_wrapper.py`*
+
+## DeviceStat
+
+DeviceStat(st\_mode, st\_size, st\_time)
+### DeviceStat.\_\_repr\_\_
+
+Return a nicely formatted representation string
+### DeviceStat.\_\_getnewargs\_\_
+
+Return self as a plain tuple. Used by copy and pickle.
+### DeviceStat.\_\_getstate\_\_
+
+Exclude the OrderedDict from pickling
+## AdbWrapper
+
+A wrapper around a local Android Debug Bridge executable.
+### AdbWrapper.GetDeviceSerial
+
+Gets the device serial number associated with this object.
+```
+ Returns:
+ Device serial number as a string.
+```
+
+
+### AdbWrapper.Push
+
+Pushes a file from the host to the device.
+```
+ Args:
+ local: Path on the host filesystem.
+ remote: Path on the device filesystem.
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+```
+
+
+### AdbWrapper.Pull
+
+Pulls a file from the device to the host.
+```
+ Args:
+ remote: Path on the device filesystem.
+ local: Path on the host filesystem.
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+```
+
+
+### AdbWrapper.Shell
+
+Runs a shell command on the device.
+```
+ Args:
+ command: A string with the shell command to run.
+ expect_status: (optional) Check that the command's exit status matches
+ this value. Default is 0. If set to None the test is skipped.
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+
+ Returns:
+ The output of the shell command as a string.
+
+ Raises:
+ device_errors.AdbCommandFailedError: If the exit status doesn't match
+ |expect_status|.
+```
+
+
+### AdbWrapper.IterShell
+
+Runs a shell command and returns an iterator over its output lines.
+```
+ Args:
+ command: A string with the shell command to run.
+ timeout: Timeout in seconds.
+
+ Yields:
+ The output of the command line by line.
+```
+
+
+### AdbWrapper.Ls
+
+List the contents of a directory on the device.
+```
+ Args:
+ path: Path on the device filesystem.
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+
+ Returns:
+ A list of pairs (filename, stat) for each file found in the directory,
+ where the stat object has the properties: st_mode, st_size, and st_time.
+
+ Raises:
+ AdbCommandFailedError if |path| does not specify a valid and accessible
+ directory in the device, or the output of "adb ls" command is less
+ than four columns
+```
+
+
+### AdbWrapper.Logcat
+
+Get an iterable over the logcat output.
+```
+ Args:
+ clear: If true, clear the logcat.
+ dump: If true, dump the current logcat contents.
+ filter_specs: If set, a list of specs to filter the logcat.
+ logcat_format: If set, the format in which the logcat should be output.
+ Options include "brief", "process", "tag", "thread", "raw", "time",
+ "threadtime", and "long"
+ ring_buffer: If set, a list of alternate ring buffers to request.
+ Options include "main", "system", "radio", "events", "crash" or "all".
+ The default is equivalent to ["main", "system", "crash"].
+ iter_timeout: If set and neither clear nor dump is set, the number of
+ seconds to wait between iterations. If no line is found before the
+ given number of seconds elapses, the iterable will yield None.
+ timeout: (optional) If set, timeout per try in seconds. If clear or dump
+ is set, defaults to DEFAULT_TIMEOUT.
+ retries: (optional) If clear or dump is set, the number of retries to
+ attempt. Otherwise, does nothing.
+
+ Yields:
+ logcat output line by line.
+```
+
+
+### AdbWrapper.Forward
+
+Forward socket connections from the local socket to the remote socket.
+```
+ Sockets are specified by one of:
+ tcp:<port>
+ localabstract:<unix domain socket name>
+ localreserved:<unix domain socket name>
+ localfilesystem:<unix domain socket name>
+ dev:<character device name>
+ jdwp:<process pid> (remote only)
+
+ Args:
+ local: The host socket.
+ remote: The device socket.
+ allow_rebind: A boolean indicating whether adb may rebind a local socket;
+ otherwise, the default, an exception is raised if the local socket is
+ already being forwarded.
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+```
+
+
+### AdbWrapper.ForwardRemove
+
+Remove a forward socket connection.
+```
+ Args:
+ local: The host socket.
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+```
+
+
+### AdbWrapper.ForwardList
+
+List all currently forwarded socket connections.
+```
+ Args:
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+ Returns:
+ The output of adb forward --list as a string.
+```
+
+
+### AdbWrapper.JDWP
+
+List of PIDs of processes hosting a JDWP transport.
+```
+ Args:
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+
+ Returns:
+ A list of PIDs as strings.
+```
+
+
+### AdbWrapper.Install
+
+Install an apk on the device.
+```
+ Args:
+ apk_path: Host path to the APK file.
+ forward_lock: (optional) If set forward-locks the app.
+ allow_downgrade: (optional) If set, allows for downgrades.
+ reinstall: (optional) If set reinstalls the app, keeping its data.
+ sd_card: (optional) If set installs on the SD card.
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+```
+
+
+### AdbWrapper.InstallMultiple
+
+Install an apk with splits on the device.
+```
+ Args:
+ apk_paths: Host path to the APK file.
+ forward_lock: (optional) If set forward-locks the app.
+ reinstall: (optional) If set reinstalls the app, keeping its data.
+ sd_card: (optional) If set installs on the SD card.
+ allow_downgrade: (optional) Allow versionCode downgrade.
+ partial: (optional) Package ID if apk_paths doesn't include all .apks.
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+```
+
+
+### AdbWrapper.Uninstall
+
+Remove the app |package| from the device.
+```
+ Args:
+ package: The package to uninstall.
+ keep_data: (optional) If set keep the data and cache directories.
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+```
+
+
+### AdbWrapper.Backup
+
+Write an archive of the device's data to |path|.
+```
+ Args:
+ path: Local path to store the backup file.
+ packages: List of to packages to be backed up.
+ apk: (optional) If set include the .apk files in the archive.
+ shared: (optional) If set buckup the device's SD card.
+ nosystem: (optional) If set exclude system applications.
+ include_all: (optional) If set back up all installed applications and
+ |packages| is optional.
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+```
+
+
+### AdbWrapper.Restore
+
+Restore device contents from the backup archive.
+```
+ Args:
+ path: Host path to the backup archive.
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+```
+
+
+### AdbWrapper.WaitForDevice
+
+Block until the device is online.
+```
+ Args:
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+```
+
+
+### AdbWrapper.GetState
+
+Get device state.
+```
+ Args:
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+
+ Returns:
+ One of 'offline', 'bootloader', or 'device'.
+```
+
+
+### AdbWrapper.GetDevPath
+
+Gets the device path.
+```
+ Args:
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+
+ Returns:
+ The device path (e.g. usb:3-4)
+```
+
+
+### AdbWrapper.Remount
+
+Remounts the /system partition on the device read-write.
+### AdbWrapper.Reboot
+
+Reboots the device.
+```
+ Args:
+ to_bootloader: (optional) If set reboots to the bootloader.
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+```
+
+
+### AdbWrapper.Root
+
+Restarts the adbd daemon with root permissions, if possible.
+```
+ Args:
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+```
+
+
+### AdbWrapper.Emu
+
+Runs an emulator console command.
+```
+ See http://developer.android.com/tools/devices/emulator.html#console
+
+ Args:
+ cmd: The command to run on the emulator console.
+ timeout: (optional) Timeout per try in seconds.
+ retries: (optional) Number of retries to attempt.
+
+ Returns:
+ The output of the emulator console command.
+```
+
+
+### AdbWrapper.DisableVerity
+
+Disable Marshmallow's Verity security feature
+### AdbWrapper.EnableVerity
+
+Enable Marshmallow's Verity security feature
+### AdbWrapper.\_\_init\_\_
+
+Initializes the AdbWrapper.
+```
+ Args:
+ device_serial: The device serial number as a string.
+```
+
+
+### AdbWrapper.\_\_eq\_\_
+
+Consider instances equal if they refer to the same device.
+```
+ Args:
+ other: The instance to compare equality with.
+
+ Returns:
+ True if the instances are considered equal, false otherwise.
+```
+
+
+### AdbWrapper.\_\_str\_\_
+
+The string representation of an instance.
+```
+ Returns:
+ The device serial number as a string.
+```
+
+
+### AdbWrapper.\_\_repr\_\_
+
+### VerifyLocalFileExists
+
+Verifies a local file exists.
+```
+ Args:
+ path: Path to the local file.
+
+ Raises:
+ IOError: If the file doesn't exist.
+```
+
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/docs/device_blacklist.md b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/docs/device_blacklist.md
new file mode 100644
index 0000000..c6eed51
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/docs/device_blacklist.md
@@ -0,0 +1,59 @@
+<!-- Copyright 2016 The Chromium Authors. All rights reserved.
+ Use of this source code is governed by a BSD-style license that can be
+ found in the LICENSE file.
+-->
+
+# Devil: Device Blacklist
+
+## What is it?
+
+The device blacklist is a per-run list of devices detected to be in a known bad
+state along with the reason they are suspected of being in a bad state (offline,
+not responding, etc). It is stored as a json file. This gets reset every run
+during the device recovery step (currently part of `bb_device_status_check`).
+
+## Bots
+
+On bots, this is normally found at `//out/bad_devices.json`. If you are having
+problems with blacklisted devices locally even though a device is in a good
+state, you can safely delete this file.
+
+# Tools for interacting with device black list.
+
+You can interact with the device blacklist via [devil.android.device\_blacklist](https://cs.chromium.org/chromium/src/third_party/catapult/devil/devil/android/device_blacklist.py).
+This allows for any interaction you would need with a device blacklist:
+
+ - Reading
+ - Writing
+ - Extending
+ - Resetting
+
+An example usecase of this is:
+```python
+from devil.android import device_blacklist
+
+blacklist = device_blacklist.Blacklist(blacklist_path)
+blacklisted_devices = blacklist.Read()
+for device in blacklisted_devices:
+ print 'Device %s is blacklisted' % device
+blacklist.Reset()
+new_blacklist = {'device_id1': {'timestamp': ts, 'reason': reason}}
+blacklist.Write(new_blacklist)
+blacklist.Extend([device_2, device_3], reason='Reason for blacklisting')
+```
+
+
+## Where it is used.
+
+The blacklist file path is passed directly to the following scripts in chromium:
+
+ - [test\_runner.py](https://cs.chromium.org/chromium/src/build/android/test_runner.py)
+ - [provision\_devices.py](https://cs.chromium.org/chromium/src/build/android/provision_devices.py)
+ - [bb\_device\_status\_check.py](https://cs.chromium.org/chromium/src/build/android/buildbot/bb_device_status_check.py)
+
+The blacklist is also used in the following scripts:
+
+ - [device\_status.py](https://cs.chromium.org/chromium/src/third_party/catapult/devil/devil/android/tools/device_status.py)
+ - [device\_recovery.py](https://cs.chromium.org/chromium/src/third_party/catapult/devil/devil/android/tools/device_recovery.py)
+
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/docs/device_utils.md b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/docs/device_utils.md
new file mode 100644
index 0000000..b281b26
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/docs/device_utils.md
@@ -0,0 +1,1041 @@
+# [devil.android.device_utils](https://github.com/catapult-project/catapult/blob/master/devil/devil/android/device_utils.py)
+
+*This page was autogenerated by `devil/utils/markdown.py --module-link https://github.com/catapult-project/catapult/blob/master/devil/devil/android/device_utils.py`*
+
+## DeviceUtils
+
+### DeviceUtils.\_\_init\_\_
+
+DeviceUtils constructor.
+```
+ Args:
+ device: Either a device serial, an existing AdbWrapper instance, or an
+ an existing AndroidCommands instance.
+ enable_device_files_cache: For PushChangedFiles(), cache checksums of
+ pushed files rather than recomputing them on a subsequent call.
+ default_timeout: An integer containing the default number of seconds to
+ wait for an operation to complete if no explicit value is provided.
+ default_retries: An integer containing the default number or times an
+ operation should be retried on failure if no explicit value is provided.
+```
+
+
+### DeviceUtils.\_\_eq\_\_
+
+Checks whether |other| refers to the same device as |self|.
+```
+ Args:
+ other: The object to compare to. This can be a basestring, an instance
+ of adb_wrapper.AdbWrapper, or an instance of DeviceUtils.
+ Returns:
+ Whether |other| refers to the same device as |self|.
+```
+
+
+### DeviceUtils.\_\_lt\_\_
+
+Compares two instances of DeviceUtils.
+```
+ This merely compares their serial numbers.
+
+ Args:
+ other: The instance of DeviceUtils to compare to.
+ Returns:
+ Whether |self| is less than |other|.
+```
+
+
+### DeviceUtils.\_\_str\_\_
+
+Returns the device serial.
+### DeviceUtils.NeedsSU
+
+Checks whether 'su' is needed to access protected resources.
+```
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ True if 'su' is available on the device and is needed to to access
+ protected resources; False otherwise if either 'su' is not available
+ (e.g. because the device has a user build), or not needed (because adbd
+ already has root privileges).
+
+ Raises:
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+```
+
+
+### DeviceUtils.IsOnline
+
+Checks whether the device is online.
+```
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ True if the device is online, False otherwise.
+
+ Raises:
+ CommandTimeoutError on timeout.
+```
+
+
+### DeviceUtils.HasRoot
+
+Checks whether or not adbd has root privileges.
+```
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ True if adbd has root privileges, False otherwise.
+
+ Raises:
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+```
+
+
+### DeviceUtils.EnableRoot
+
+Restarts adbd with root privileges.
+```
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandFailedError if root could not be enabled.
+ CommandTimeoutError on timeout.
+```
+
+
+### DeviceUtils.IsUserBuild
+
+Checks whether or not the device is running a user build.
+```
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ True if the device is running a user build, False otherwise (i.e. if
+ it's running a userdebug build).
+
+ Raises:
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+```
+
+
+### DeviceUtils.GetExternalStoragePath
+
+Get the device's path to its SD card.
+```
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ The device's path to its SD card.
+
+ Raises:
+ CommandFailedError if the external storage path could not be determined.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+```
+
+
+### DeviceUtils.GetApplicationPaths
+
+Get the paths of the installed apks on the device for the given package.
+```
+ Args:
+ package: Name of the package.
+
+ Returns:
+ List of paths to the apks on the device for the given package.
+```
+
+
+### DeviceUtils.GetApplicationVersion
+
+Get the version name of a package installed on the device.
+```
+ Args:
+ package: Name of the package.
+
+ Returns:
+ A string with the version name or None if the package is not found
+ on the device.
+```
+
+
+### DeviceUtils.GetApplicationDataDirectory
+
+Get the data directory on the device for the given package.
+```
+ Args:
+ package: Name of the package.
+
+ Returns:
+ The package's data directory.
+ Raises:
+ CommandFailedError if the package's data directory can't be found,
+ whether because it's not installed or otherwise.
+```
+
+
+### DeviceUtils.WaitUntilFullyBooted
+
+Wait for the device to fully boot.
+```
+ This means waiting for the device to boot, the package manager to be
+ available, and the SD card to be ready. It can optionally mean waiting
+ for wifi to come up, too.
+
+ Args:
+ wifi: A boolean indicating if we should wait for wifi to come up or not.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandFailedError on failure.
+ CommandTimeoutError if one of the component waits times out.
+ DeviceUnreachableError if the device becomes unresponsive.
+```
+
+
+### DeviceUtils.Reboot
+
+Reboot the device.
+```
+ Args:
+ block: A boolean indicating if we should wait for the reboot to complete.
+ wifi: A boolean indicating if we should wait for wifi to be enabled after
+ the reboot. The option has no effect unless |block| is also True.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+```
+
+
+### DeviceUtils.Install
+
+Install an APK.
+```
+ Noop if an identical APK is already installed.
+
+ Args:
+ apk: An ApkHelper instance or string containing the path to the APK.
+ allow_downgrade: A boolean indicating if we should allow downgrades.
+ reinstall: A boolean indicating if we should keep any existing app data.
+ permissions: Set of permissions to set. If not set, finds permissions with
+ apk helper. To set no permissions, pass [].
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandFailedError if the installation fails.
+ CommandTimeoutError if the installation times out.
+ DeviceUnreachableError on missing device.
+```
+
+
+### DeviceUtils.InstallSplitApk
+
+Install a split APK.
+```
+ Noop if all of the APK splits are already installed.
+
+ Args:
+ base_apk: An ApkHelper instance or string containing the path to the base
+ APK.
+ split_apks: A list of strings of paths of all of the APK splits.
+ allow_downgrade: A boolean indicating if we should allow downgrades.
+ reinstall: A boolean indicating if we should keep any existing app data.
+ allow_cached_props: Whether to use cached values for device properties.
+ permissions: Set of permissions to set. If not set, finds permissions with
+ apk helper. To set no permissions, pass [].
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandFailedError if the installation fails.
+ CommandTimeoutError if the installation times out.
+ DeviceUnreachableError on missing device.
+ DeviceVersionError if device SDK is less than Android L.
+```
+
+
+### DeviceUtils.Uninstall
+
+Remove the app |package\_name| from the device.
+```
+ This is a no-op if the app is not already installed.
+
+ Args:
+ package_name: The package to uninstall.
+ keep_data: (optional) Whether to keep the data and cache directories.
+ timeout: Timeout in seconds.
+ retries: Number of retries.
+
+ Raises:
+ CommandFailedError if the uninstallation fails.
+ CommandTimeoutError if the uninstallation times out.
+ DeviceUnreachableError on missing device.
+```
+
+
+### DeviceUtils.RunShellCommand
+
+Run an ADB shell command.
+```
+ The command to run |cmd| should be a sequence of program arguments or else
+ a single string.
+
+ When |cmd| is a sequence, it is assumed to contain the name of the command
+ to run followed by its arguments. In this case, arguments are passed to the
+ command exactly as given, without any further processing by the shell. This
+ allows to easily pass arguments containing spaces or special characters
+ without having to worry about getting quoting right. Whenever possible, it
+ is recomended to pass |cmd| as a sequence.
+
+ When |cmd| is given as a string, it will be interpreted and run by the
+ shell on the device.
+
+ This behaviour is consistent with that of command runners in cmd_helper as
+ well as Python's own subprocess.Popen.
+
+ TODO(perezju) Change the default of |check_return| to True when callers
+ have switched to the new behaviour.
+
+ Args:
+ cmd: A string with the full command to run on the device, or a sequence
+ containing the command and its arguments.
+ check_return: A boolean indicating whether or not the return code should
+ be checked.
+ cwd: The device directory in which the command should be run.
+ env: The environment variables with which the command should be run.
+ run_as: A string containing the package as which the command should be
+ run.
+ as_root: A boolean indicating whether the shell command should be run
+ with root privileges.
+ single_line: A boolean indicating if only a single line of output is
+ expected.
+ large_output: Uses a work-around for large shell command output. Without
+ this large output will be truncated.
+ raw_output: Whether to only return the raw output
+ (no splitting into lines).
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ If single_line is False, the output of the command as a list of lines,
+ otherwise, a string with the unique line of output emmited by the command
+ (with the optional newline at the end stripped).
+
+ Raises:
+ AdbCommandFailedError if check_return is True and the exit code of
+ the command run on the device is non-zero.
+ CommandFailedError if single_line is True but the output contains two or
+ more lines.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+```
+
+
+### DeviceUtils.KillAll
+
+Kill all processes with the given name on the device.
+```
+ Args:
+ process_name: A string containing the name of the process to kill.
+ exact: A boolean indicating whether to kill all processes matching
+ the string |process_name| exactly, or all of those which contain
+ |process_name| as a substring. Defaults to False.
+ signum: An integer containing the signal number to send to kill. Defaults
+ to SIGKILL (9).
+ as_root: A boolean indicating whether the kill should be executed with
+ root privileges.
+ blocking: A boolean indicating whether we should wait until all processes
+ with the given |process_name| are dead.
+ quiet: A boolean indicating whether to ignore the fact that no processes
+ to kill were found.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ The number of processes attempted to kill.
+
+ Raises:
+ CommandFailedError if no process was killed and |quiet| is False.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+```
+
+
+### DeviceUtils.StartActivity
+
+Start package's activity on the device.
+```
+ Args:
+ intent_obj: An Intent object to send.
+ blocking: A boolean indicating whether we should wait for the activity to
+ finish launching.
+ trace_file_name: If present, a string that both indicates that we want to
+ profile the activity and contains the path to which the
+ trace should be saved.
+ force_stop: A boolean indicating whether we should stop the activity
+ before starting it.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandFailedError if the activity could not be started.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+```
+
+
+### DeviceUtils.StartInstrumentation
+
+### DeviceUtils.BroadcastIntent
+
+Send a broadcast intent.
+```
+ Args:
+ intent: An Intent to broadcast.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+```
+
+
+### DeviceUtils.GoHome
+
+Return to the home screen and obtain launcher focus.
+```
+ This command launches the home screen and attempts to obtain
+ launcher focus until the timeout is reached.
+
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+```
+
+
+### DeviceUtils.ForceStop
+
+Close the application.
+```
+ Args:
+ package: A string containing the name of the package to stop.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+```
+
+
+### DeviceUtils.ClearApplicationState
+
+Clear all state for the given package.
+```
+ Args:
+ package: A string containing the name of the package to stop.
+ permissions: List of permissions to set after clearing data.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+```
+
+
+### DeviceUtils.SendKeyEvent
+
+Sends a keycode to the device.
+```
+ See the devil.android.sdk.keyevent module for suitable keycode values.
+
+ Args:
+ keycode: A integer keycode to send to the device.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+```
+
+
+### DeviceUtils.PushChangedFiles
+
+Push files to the device, skipping files that don't need updating.
+```
+ When a directory is pushed, it is traversed recursively on the host and
+ all files in it are pushed to the device as needed.
+ Additionally, if delete_device_stale option is True,
+ files that exist on the device but don't exist on the host are deleted.
+
+ Args:
+ host_device_tuples: A list of (host_path, device_path) tuples, where
+ |host_path| is an absolute path of a file or directory on the host
+ that should be minimially pushed to the device, and |device_path| is
+ an absolute path of the destination on the device.
+ timeout: timeout in seconds
+ retries: number of retries
+ delete_device_stale: option to delete stale files on device
+
+ Raises:
+ CommandFailedError on failure.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+```
+
+
+### DeviceUtils.FileExists
+
+Checks whether the given file exists on the device.
+```
+ Arguments are the same as PathExists.
+```
+
+
+### DeviceUtils.PathExists
+
+Checks whether the given path(s) exists on the device.
+```
+ Args:
+ device_path: A string containing the absolute path to the file on the
+ device, or an iterable of paths to check.
+ as_root: Whether root permissions should be use to check for the existence
+ of the given path(s).
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ True if the all given paths exist on the device, False otherwise.
+
+ Raises:
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+```
+
+
+### DeviceUtils.RemovePath
+
+Removes the given path(s) from the device.
+```
+ Args:
+ device_path: A string containing the absolute path to the file on the
+ device, or an iterable of paths to check.
+ force: Whether to remove the path(s) with force (-f).
+ recursive: Whether to remove any directories in the path(s) recursively.
+ as_root: Whether root permissions should be use to remove the given
+ path(s).
+ timeout: timeout in seconds
+ retries: number of retries
+```
+
+
+### DeviceUtils.PullFile
+
+Pull a file from the device.
+```
+ Args:
+ device_path: A string containing the absolute path of the file to pull
+ from the device.
+ host_path: A string containing the absolute path of the destination on
+ the host.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandFailedError on failure.
+ CommandTimeoutError on timeout.
+```
+
+
+### DeviceUtils.ReadFile
+
+Reads the contents of a file from the device.
+```
+ Args:
+ device_path: A string containing the absolute path of the file to read
+ from the device.
+ as_root: A boolean indicating whether the read should be executed with
+ root privileges.
+ force_pull: A boolean indicating whether to force the operation to be
+ performed by pulling a file from the device. The default is, when the
+ contents are short, to retrieve the contents using cat instead.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ The contents of |device_path| as a string. Contents are intepreted using
+ universal newlines, so the caller will see them encoded as '
+'. Also,
+ all lines will be terminated.
+
+ Raises:
+ AdbCommandFailedError if the file can't be read.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+```
+
+
+### DeviceUtils.WriteFile
+
+Writes |contents| to a file on the device.
+```
+ Args:
+ device_path: A string containing the absolute path to the file to write
+ on the device.
+ contents: A string containing the data to write to the device.
+ as_root: A boolean indicating whether the write should be executed with
+ root privileges (if available).
+ force_push: A boolean indicating whether to force the operation to be
+ performed by pushing a file to the device. The default is, when the
+ contents are short, to pass the contents using a shell script instead.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandFailedError if the file could not be written on the device.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+```
+
+
+### DeviceUtils.ListDirectory
+
+List all files on a device directory.
+```
+ Mirroring os.listdir (and most client expectations) the resulting list
+ does not include the special entries '.' and '..' even if they are present
+ in the directory.
+
+ Args:
+ device_path: A string containing the path of the directory on the device
+ to list.
+ as_root: A boolean indicating whether the to use root privileges to list
+ the directory contents.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ A list of filenames for all entries contained in the directory.
+
+ Raises:
+ AdbCommandFailedError if |device_path| does not specify a valid and
+ accessible directory in the device.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+```
+
+
+### DeviceUtils.StatDirectory
+
+List file and stat info for all entries on a device directory.
+```
+ Implementation notes: this is currently implemented by parsing the output
+ of 'ls -a -l' on the device. Whether possible and convenient, we attempt to
+ make parsing strict and return values mirroring those of the standard |os|
+ and |stat| Python modules.
+
+ Mirroring os.listdir (and most client expectations) the resulting list
+ does not include the special entries '.' and '..' even if they are present
+ in the directory.
+
+ Args:
+ device_path: A string containing the path of the directory on the device
+ to list.
+ as_root: A boolean indicating whether the to use root privileges to list
+ the directory contents.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ A list of dictionaries, each containing the following keys:
+ filename: A string with the file name.
+ st_mode: File permissions, use the stat module to interpret these.
+ st_nlink: Number of hard links (may be missing).
+ st_owner: A string with the user name of the owner.
+ st_group: A string with the group name of the owner.
+ st_rdev_pair: Device type as (major, minior) (only if inode device).
+ st_size: Size of file, in bytes (may be missing for non-regular files).
+ st_mtime: Time of most recent modification, in seconds since epoch
+ (although resolution is in minutes).
+ symbolic_link_to: If entry is a symbolic link, path where it points to;
+ missing otherwise.
+
+ Raises:
+ AdbCommandFailedError if |device_path| does not specify a valid and
+ accessible directory in the device.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+```
+
+
+### DeviceUtils.StatPath
+
+Get the stat attributes of a file or directory on the device.
+```
+ Args:
+ device_path: A string containing the path of a file or directory from
+ which to get attributes.
+ as_root: A boolean indicating whether the to use root privileges to
+ access the file information.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ A dictionary with the stat info collected; see StatDirectory for details.
+
+ Raises:
+ CommandFailedError if device_path cannot be found on the device.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+```
+
+
+### DeviceUtils.FileSize
+
+Get the size of a file on the device.
+```
+ Note: This is implemented by parsing the output of the 'ls' command on
+ the device. On some Android versions, when passing a directory or special
+ file, the size is *not* reported and this function will throw an exception.
+
+ Args:
+ device_path: A string containing the path of a file on the device.
+ as_root: A boolean indicating whether the to use root privileges to
+ access the file information.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ The size of the file in bytes.
+
+ Raises:
+ CommandFailedError if device_path cannot be found on the device, or
+ its size cannot be determited for some reason.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+```
+
+
+### DeviceUtils.GetLanguage
+
+Returns the language setting on the device.
+```
+ Args:
+ cache: Whether to use cached properties when available.
+```
+
+
+### DeviceUtils.SetJavaAsserts
+
+Enables or disables Java asserts.
+```
+ Args:
+ enabled: A boolean indicating whether Java asserts should be enabled
+ or disabled.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ True if the device-side property changed and a restart is required as a
+ result, False otherwise.
+
+ Raises:
+ CommandTimeoutError on timeout.
+```
+
+
+### DeviceUtils.GetCountry
+
+Returns the country setting on the device.
+```
+ Args:
+ cache: Whether to use cached properties when available.
+```
+
+
+### DeviceUtils.GetProp
+
+Gets a property from the device.
+```
+ Args:
+ property_name: A string containing the name of the property to get from
+ the device.
+ cache: Whether to use cached properties when available.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ The value of the device's |property_name| property.
+
+ Raises:
+ CommandTimeoutError on timeout.
+```
+
+
+### DeviceUtils.SetProp
+
+Sets a property on the device.
+```
+ Args:
+ property_name: A string containing the name of the property to set on
+ the device.
+ value: A string containing the value to set to the property on the
+ device.
+ check: A boolean indicating whether to check that the property was
+ successfully set on the device.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandFailedError if check is true and the property was not correctly
+ set on the device (e.g. because it is not rooted).
+ CommandTimeoutError on timeout.
+```
+
+
+### DeviceUtils.GetABI
+
+Gets the device main ABI.
+```
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ The device's main ABI name.
+
+ Raises:
+ CommandTimeoutError on timeout.
+```
+
+
+### DeviceUtils.GetPids
+
+Returns the PIDs of processes with the given name.
+```
+ Note that the |process_name| is often the package name.
+
+ Args:
+ process_name: A string containing the process name to get the PIDs for.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ A dict mapping process name to a list of PIDs for each process that
+ contained the provided |process_name|.
+
+ Raises:
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+```
+
+
+### DeviceUtils.GetEnforce
+
+Get the current mode of SELinux.
+```
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ True (enforcing), False (permissive), or None (disabled).
+
+ Raises:
+ CommandFailedError on failure.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+```
+
+
+### DeviceUtils.SetEnforce
+
+Modify the mode SELinux is running in.
+```
+ Args:
+ enabled: a boolean indicating whether to put SELinux in encorcing mode
+ (if True), or permissive mode (otherwise).
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Raises:
+ CommandFailedError on failure.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+```
+
+
+### DeviceUtils.TakeScreenshot
+
+Takes a screenshot of the device.
+```
+ Args:
+ host_path: A string containing the path on the host to save the
+ screenshot to. If None, a file name in the current
+ directory will be generated.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ The name of the file on the host to which the screenshot was saved.
+
+ Raises:
+ CommandFailedError on failure.
+ CommandTimeoutError on timeout.
+ DeviceUnreachableError on missing device.
+```
+
+
+### DeviceUtils.GetMemoryUsageForPid
+
+Gets the memory usage for the given PID.
+```
+ Args:
+ pid: PID of the process.
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ A dict containing memory usage statistics for the PID. May include:
+ Size, Rss, Pss, Shared_Clean, Shared_Dirty, Private_Clean,
+ Private_Dirty, VmHWM
+
+ Raises:
+ CommandTimeoutError on timeout.
+```
+
+
+### DeviceUtils.DismissCrashDialogIfNeeded
+
+Dismiss the error/ANR dialog if present.
+```
+ Returns: Name of the crashed package if a dialog is focused,
+ None otherwise.
+```
+
+
+### DeviceUtils.GetLogcatMonitor
+
+Returns a new LogcatMonitor associated with this device.
+```
+ Parameters passed to this function are passed directly to
+ |logcat_monitor.LogcatMonitor| and are documented there.
+```
+
+
+### DeviceUtils.GetClientCache
+
+Returns client cache.
+### DeviceUtils.LoadCacheData
+
+Initializes the cache from data created using DumpCacheData.
+```
+ The cache is used only if its token matches the one found on the device.
+ This prevents a stale cache from being used (which can happen when sharing
+ devices).
+
+ Args:
+ data: A previously serialized cache (string).
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ Whether the cache was loaded.
+```
+
+
+### DeviceUtils.DumpCacheData
+
+Dumps the current cache state to a string.
+```
+ Args:
+ timeout: timeout in seconds
+ retries: number of retries
+
+ Returns:
+ A serialized cache as a string.
+```
+
+
+### DeviceUtils.RestartAdbd
+
+### DeviceUtils.GrantPermissions
+
+### DeviceUtils.IsScreenOn
+
+Determines if screen is on.
+```
+ Dumpsys input_method exposes screen on/off state. Below is an explination of
+ the states.
+
+ Pre-L:
+ On: mScreenOn=true
+ Off: mScreenOn=false
+ L+:
+ On: mInteractive=true
+ Off: mInteractive=false
+
+ Returns:
+ True if screen is on, false if it is off.
+
+ Raises:
+ device_errors.CommandFailedError: If screen state cannot be found.
+```
+
+
+### DeviceUtils.SetScreen
+
+Turns screen on and off.
+```
+ Args:
+ on: bool to decide state to switch to. True = on False = off.
+```
+
+
+### GetAVDs
+
+Returns a list of Android Virtual Devices.
+```
+ Returns:
+ A list containing the configured AVDs.
+```
+
+
+### RestartServer
+
+Restarts the adb server.
+```
+ Raises:
+ CommandFailedError if we fail to kill or restart the server.
+```
+
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/docs/markdown.md b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/docs/markdown.md
new file mode 100644
index 0000000..957dba7
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/docs/markdown.md
@@ -0,0 +1,139 @@
+# [devil.utils.markdown](https://github.com/catapult-project/catapult/blob/master/devil/devil/utils/markdown.py)
+
+*This page was autogenerated by `devil/utils/markdown.py --module-link https://github.com/catapult-project/catapult/blob/master/devil/devil/utils/markdown.py`*
+
+## MarkdownHelpAction
+
+### MarkdownHelpAction.\_\_init\_\_
+
+### MarkdownHelpAction.\_\_call\_\_
+
+## MarkdownHelpFormatter
+
+A really bare-bones argparse help formatter that generates valid markdown.
+```
+ This will generate something like:
+
+ usage
+
+ # **section heading**:
+
+ ## **--argument-one**
+
+ \`\`\`
+ argument-one help text
+ \`\`\`
+
+```
+
+
+### MarkdownHelpFormatter.format\_help
+
+### MarkdownHelpFormatter.start\_section
+
+### md\_bold
+
+Returns markdown-formatted bold text.
+### md\_code
+
+Returns a markdown-formatted code block in the given language.
+### md\_escape
+
+Escapes \* and \_.
+### md\_heading
+
+Returns markdown-formatted heading.
+### md\_inline\_code
+
+Returns markdown-formatted inline code.
+### md\_italic
+
+Returns markdown-formatted italic text.
+### md\_link
+
+returns a markdown-formatted link.
+### add\_md\_help\_argument
+
+Adds --md-help to the given argparse.ArgumentParser.
+```
+ Running a script with --md-help will print the help text for that script
+ as valid markdown.
+
+ Args:
+ parser: The ArgumentParser to which --md-help should be added.
+```
+
+
+### load\_module\_from\_path
+
+Load a module given only the path name.
+```
+ Also loads package modules as necessary.
+
+ Args:
+ module_path: An absolute path to a python module.
+ Returns:
+ The module object for the given path.
+```
+
+
+### md\_module
+
+Write markdown documentation for a class.
+```
+ Documents public classes and functions.
+
+ Args:
+ class_obj: a types.TypeType object for the class that should be
+ documented.
+ Returns:
+ A list of markdown-formatted lines.
+```
+
+
+### md\_class
+
+Write markdown documentation for a class.
+```
+ Documents public methods. Does not currently document subclasses.
+
+ Args:
+ class_obj: a types.TypeType object for the class that should be
+ documented.
+ Returns:
+ A list of markdown-formatted lines.
+```
+
+
+### md\_docstring
+
+Write a markdown-formatted docstring.
+```
+ Returns:
+ A list of markdown-formatted lines.
+```
+
+
+### md\_function
+
+Write markdown documentation for a function.
+```
+ Args:
+ func_obj: a types.FunctionType object for the function that should be
+ documented.
+ Returns:
+ A list of markdown-formatted lines.
+```
+
+
+### main
+
+Write markdown documentation for the module at the provided path.
+```
+ Args:
+ raw_args: the raw command-line args. Usually sys.argv[1:].
+ Returns:
+ An integer exit code. 0 for success, non-zero for failure.
+```
+
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/docs/persistent_device_list.md b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/docs/persistent_device_list.md
new file mode 100644
index 0000000..d08d9a9
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/docs/persistent_device_list.md
@@ -0,0 +1,41 @@
+<!-- Copyright 2016 The Chromium Authors. All rights reserved.
+ Use of this source code is governed by a BSD-style license that can be
+ found in the LICENSE file.
+-->
+
+# Devil: Persistent Device List
+
+## What is it?
+
+A persistent device list that stores all expected devices between builds. It
+is used by the perf test runner in order to properly shard tests by device
+affinity. This is important because the same performance test can yield
+meaningfully different results when run on different devices.
+
+## Bots
+
+The list is usually located at one of these locations:
+
+ - `/b/build/site_config/.known_devices`.
+ - `~/.android`.
+
+Look at recipes listed below in order to find more up to date location.
+
+## Local Runs
+
+The persistent device list is unnecessary for local runs. It is only used on the
+bots that upload data to the perf dashboard.
+
+## Where it is used
+
+The persistent device list is used in performance test recipes via
+[api.chromium\_tests.steps.DynamicPerfTests](https://cs.chromium.org/chromium/build/scripts/slave/recipe_modules/chromium_tests/steps.py?q=DynamicPerfTests).
+For example, the [android/perf](https://cs.chromium.org/chromium/build/scripts/slave/recipes/android/perf.py) recipe uses it like this:
+
+```python
+dynamic_perf_tests = api.chromium_tests.steps.DynamicPerfTests(
+ builder['perf_id'], 'android', None,
+ known_devices_file=builder.get('known_devices_file', None))
+dynamic_perf_tests.run(api, None)
+```
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/devil/pylintrc b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/pylintrc
new file mode 100644
index 0000000..7e024a2
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/devil/pylintrc
@@ -0,0 +1,68 @@
+[MESSAGES CONTROL]
+
+# Disable the message, report, category or checker with the given id(s).
+# TODO: Shrink this list to as small as possible.
+disable=
+ design,
+ similarities,
+
+ bad-continuation,
+ fixme,
+ import-error,
+ invalid-name,
+ locally-disabled,
+ locally-enabled,
+ missing-docstring,
+ star-args,
+
+
+[REPORTS]
+
+# Don't write out full reports, just messages.
+reports=no
+
+
+[BASIC]
+
+# Regular expression which should only match correct function names.
+function-rgx=^(?:(?P<exempt>setUp|tearDown|setUpModule|tearDownModule)|(?P<camel_case>_?[A-Z][a-zA-Z0-9]*))$
+
+# Regular expression which should only match correct method names.
+method-rgx=^(?:(?P<exempt>_[a-z0-9_]+__|get|post|runTest|setUp|tearDown|setUpTestCase|tearDownTestCase|setupSelf|tearDownClass|setUpClass)|(?P<camel_case>(_{0,2}|test|assert)[A-Z][a-zA-Z0-9_]*))$
+
+# Regular expression which should only match correct argument names.
+argument-rgx=^[a-z][a-z0-9_]*$
+
+# Regular expression which should only match correct variable names.
+variable-rgx=^[a-z][a-z0-9_]*$
+
+# Good variable names which should always be accepted, separated by a comma.
+good-names=main,_
+
+# List of builtins function names that should not be used, separated by a comma.
+bad-functions=apply,input,reduce
+
+
+[VARIABLES]
+
+# Tells wether we should check for unused import in __init__ files.
+init-import=no
+
+# A regular expression matching names used for dummy variables (i.e. not used).
+dummy-variables-rgx=^_.*$|dummy
+
+
+[TYPECHECK]
+
+# Tells wether missing members accessed in mixin class should be ignored. A
+# mixin class is detected if its name ends with "mixin" (case insensitive).
+ignore-mixin-members=yes
+
+
+[FORMAT]
+
+# Maximum number of lines in a module.
+max-module-lines=10000
+
+# We use two spaces for indents, instead of the usual four spaces or tab.
+indent-string=' '
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/PRESUBMIT.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/PRESUBMIT.py
new file mode 100644
index 0000000..1234a8d
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/PRESUBMIT.py
@@ -0,0 +1,36 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+def CheckChangeOnUpload(input_api, output_api):
+ return _CommonChecks(input_api, output_api)
+
+
+def CheckChangeOnCommit(input_api, output_api):
+ return _CommonChecks(input_api, output_api)
+
+
+def _CommonChecks(input_api, output_api):
+ results = []
+ results += input_api.RunTests(input_api.canned_checks.GetPylint(
+ input_api, output_api, extra_paths_list=_GetPathsToPrepend(input_api),
+ pylintrc='pylintrc'))
+ return results
+
+
+def _GetPathsToPrepend(input_api):
+ project_dir = input_api.PresubmitLocalPath()
+ catapult_dir = input_api.os_path.join(project_dir, '..')
+ return [
+ project_dir,
+
+ input_api.os_path.join(catapult_dir, 'common', 'battor'),
+ input_api.os_path.join(catapult_dir, 'common', 'py_trace_event'),
+ input_api.os_path.join(catapult_dir, 'common', 'py_utils'),
+ input_api.os_path.join(catapult_dir, 'devil'),
+ input_api.os_path.join(catapult_dir, 'telemetry'),
+ input_api.os_path.join(catapult_dir, 'third_party', 'mock'),
+ input_api.os_path.join(catapult_dir, 'tracing'),
+
+ ]
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/README.md b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/README.md
new file mode 100644
index 0000000..3ca9249
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/README.md
@@ -0,0 +1,10 @@
+<!-- Copyright 2015 The Chromium Authors. All rights reserved.
+ Use of this source code is governed by a BSD-style license that can be
+ found in the LICENSE file.
+-->
+Systrace
+========
+
+Systrace provides command-line tools to analyze the performance of your
+application. It currently includes
+[Android Systrace](http://developer.android.com/tools/help/systrace.html).
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/README.md b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/README.md
new file mode 100644
index 0000000..b5fd651
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/README.md
@@ -0,0 +1,29 @@
+<!-- Copyright 2017 The Chromium Authors. All rights reserved.
+ Use of this source code is governed by a BSD-style license that can be
+ found in the LICENSE file.
+-->
+atrace_helper is an optional binary which can be pushed onto the device running
+systrace in order to enrich the traces with further details (memory, I/O, etc).
+
+Which problem is it solving?
+---------------------------
+Some nice-to-have details are not present in the systrace, specifically:
+ - Memory snapshots of running processes (PSS/RSS).
+ - Periodic snapshotting of processes and thread names.
+ - File paths for filesystem events (today they report only inode numbers).
+
+How is it solving it?
+---------------------
+atrace_helper is a small userspace binary which is meant to be pushed on the
+device and run together with atrace by a dedicated tracing agent. When stopped,
+the helper produces a JSON file which contains all the relevant details
+(see --help). The JSON file is consumed by the TraceViewer importers and the
+extra details are merged into the final model.
+
+Build instructions
+------------------
+Building the binary requires the Android NDK to be installed. See
+[Android NDK page](https://developer.android.com/ndk).
+Once installed the binary can be just built as follows:
+`$(NDK_HOME)/ndk-build`
+The binary will be built in `libs/armeabi-v7a/`
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/Application.mk b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/Application.mk
new file mode 100644
index 0000000..cc2eb67
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/Application.mk
@@ -0,0 +1,7 @@
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+APP_ABI := armeabi-v7a
+APP_PLATFORM := android-21
+APP_STL := c++_static
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/file_utils.cc b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/file_utils.cc
new file mode 100644
index 0000000..9ebec2d
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/file_utils.cc
@@ -0,0 +1,96 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "file_utils.h"
+
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+namespace {
+
+bool IsNumeric(const char* str) {
+ if (!str[0])
+ return false;
+ for (const char* c = str; *c; c++) {
+ if (!isdigit(*c))
+ return false;
+ }
+ return true;
+}
+
+} // namespace
+
+namespace file_utils {
+
+void ForEachPidInProcPath(const char* proc_path,
+ std::function<void(int)> predicate) {
+ DIR* root_dir = opendir(proc_path);
+ ScopedDir autoclose(root_dir);
+ struct dirent* child_dir;
+ while ((child_dir = readdir(root_dir))) {
+ if (child_dir->d_type != DT_DIR || !IsNumeric(child_dir->d_name))
+ continue;
+ predicate(atoi(child_dir->d_name));
+ }
+}
+
+ssize_t ReadFile(const char* path, char* buf, size_t length) {
+ buf[0] = '\0';
+ int fd = open(path, O_RDONLY);
+ if (fd < 0 && errno == ENOENT)
+ return -1;
+ ScopedFD autoclose(fd);
+ size_t tot_read = 0;
+ do {
+ ssize_t rsize = read(fd, buf + tot_read, length - tot_read);
+ if (rsize == 0)
+ break;
+ if (rsize == -1 && errno == EINTR)
+ continue;
+ else if (rsize < 0)
+ return -1;
+ tot_read += static_cast<size_t>(rsize);
+ } while (tot_read < length);
+ buf[tot_read < length ? tot_read : length - 1] = '\0';
+ return tot_read;
+}
+
+bool ReadFileTrimmed(const char* path, char* buf, size_t length) {
+ ssize_t rsize = ReadFile(path, buf, length);
+ if (rsize < 0)
+ return false;
+ for (ssize_t i = 0; i < rsize; i++) {
+ const char c = buf[i];
+ if (c == '\0' || c == '\r' || c == '\n') {
+ buf[i] = '\0';
+ break;
+ }
+ buf[i] = isprint(c) ? c : '?';
+ }
+ return true;
+}
+
+ssize_t ReadProcFile(int pid, const char* proc_file, char* buf, size_t length) {
+ char proc_path[128];
+ snprintf(proc_path, sizeof(proc_path), "/proc/%d/%s", pid, proc_file);
+ return ReadFile(proc_path, buf, length);
+}
+
+// Reads a single-line proc file, stripping out any \0, \r, \n and replacing
+// non-printable charcters with '?'.
+bool ReadProcFileTrimmed(int pid,
+ const char* proc_file,
+ char* buf,
+ size_t length) {
+ char proc_path[128];
+ snprintf(proc_path, sizeof(proc_path), "/proc/%d/%s", pid, proc_file);
+ return ReadFileTrimmed(proc_path, buf, length);
+}
+
+} // namespace file_utils
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/file_utils.h b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/file_utils.h
new file mode 100644
index 0000000..c6a5527
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/file_utils.h
@@ -0,0 +1,53 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef FILE_UTILS_H_
+#define FILE_UTILS_H_
+
+#include <dirent.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <functional>
+#include <map>
+#include <memory>
+
+#include "logging.h"
+
+namespace file_utils {
+
+// RAII classes for auto-releasing fd/dirs.
+template <typename RESOURCE_TYPE, int (*CLOSE_FN)(RESOURCE_TYPE)>
+struct ScopedResource {
+ explicit ScopedResource(RESOURCE_TYPE r) : r_(r) { CHECK(r); }
+ ~ScopedResource() { CLOSE_FN(r_); }
+ RESOURCE_TYPE r_;
+};
+
+using ScopedFD = ScopedResource<int, close>;
+using ScopedDir = ScopedResource<DIR*, closedir>;
+
+// Invokes predicate(pid) for each folder in |proc_path|/[0-9]+ which has
+// a numeric name (typically pids and tids).
+void ForEachPidInProcPath(const char* proc_path,
+ std::function<void(int)> predicate);
+
+// Reads the contents of |path| fully into |buf| up to |length| chars.
+// |buf| is guaranteed to be null terminated.
+ssize_t ReadFile(const char* path, char* buf, size_t length);
+
+// Reads a single-line file, stripping out any \0, \r, \n and replacing
+// non-printable charcters with '?'. |buf| is guaranteed to be null terminated.
+bool ReadFileTrimmed(int pid, const char* proc_file, char* buf, size_t length);
+
+// Convenience wrappers for /proc/|pid|/|proc_file| paths.
+ssize_t ReadProcFile(int pid, const char* proc_file, char* buf, size_t length);
+bool ReadProcFileTrimmed(int pid,
+ const char* proc_file,
+ char* buf,
+ size_t length);
+
+} // namespace file_utils
+
+#endif // FILE_UTILS_H_
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/logging.h b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/logging.h
new file mode 100644
index 0000000..7e130eb
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/logging.h
@@ -0,0 +1,28 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef LOGGING_H_
+#define LOGGING_H_
+
+#include <android/log.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define CHECK_ARGS(COND, ERR) \
+ "FAILED CHECK(%s) @ %s:%d (errno: %s)\n", #COND, __FILE__, __LINE__, \
+ strerror(ERR)
+
+#define CHECK(x) \
+ do { \
+ if (!(x)) { \
+ const int e = errno; \
+ __android_log_print(ANDROID_LOG_FATAL, "atrace_helper", \
+ CHECK_ARGS(x, e)); \
+ fprintf(stderr, "\n" CHECK_ARGS(x, e)); \
+ fflush(stderr); \
+ abort(); \
+ } \
+ } while (0)
+
+#endif // LOGGING_H_
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/main.cc b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/main.cc
new file mode 100644
index 0000000..e6f1fe1
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/main.cc
@@ -0,0 +1,198 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <dirent.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/time.h>
+#include <sys/timerfd.h>
+#include <sys/types.h>
+
+#include <limits>
+#include <memory>
+
+#include "file_utils.h"
+#include "logging.h"
+#include "process_info.h"
+
+namespace {
+
+using ProcessMap = std::map<int, std::unique_ptr<ProcessInfo>>;
+
+int g_timer;
+
+std::unique_ptr<ProcessMap> CollectStatsForAllProcs(bool full_mem_stats) {
+ std::unique_ptr<ProcessMap> procs(new ProcessMap());
+ file_utils::ForEachPidInProcPath("/proc", [&procs, full_mem_stats](int pid) {
+ if (!ProcessInfo::IsProcess(pid))
+ return;
+ CHECK(procs->count(pid) == 0);
+ std::unique_ptr<ProcessInfo> pinfo(new ProcessInfo(pid));
+ if (!(pinfo->ReadProcessName() && pinfo->ReadThreadNames() &&
+ pinfo->ReadOOMStats() && pinfo->ReadPageFaultsAndCPUTimeStats()))
+ return;
+
+ if (full_mem_stats) {
+ if (!pinfo->memory()->ReadFullStats())
+ return;
+ } else {
+ if (!pinfo->memory()->ReadLightStats())
+ return;
+ }
+ (*procs)[pid] = std::move(pinfo);
+ });
+ return procs;
+}
+
+void SerializeSnapshot(const ProcessMap& procs,
+ FILE* stream,
+ bool full_mem_stats) {
+ struct timespec ts = {};
+ CHECK(clock_gettime(CLOCK_MONOTONIC_COARSE, &ts) == 0);
+ fprintf(stream, "{\n");
+ fprintf(stream, " \"ts\": %lu,\n",
+ (ts.tv_sec * 1000 + ts.tv_nsec / 1000000ul));
+ fprintf(stream, " \"processes\": [\n");
+ for (auto it = procs.begin(); it != procs.end();) {
+ int pid = it->first;
+ const ProcessInfo& pinfo = *it->second;
+ fprintf(stream, " {\"pid\": %d, \"name\": \"%s\", \"exe\": \"%s\"", pid,
+ pinfo.name(), pinfo.exe());
+ fprintf(stream, ", \"threads\": [");
+ for (auto t = pinfo.threads()->begin(); t != pinfo.threads()->end();) {
+ fprintf(stream, "{\"tid\": %d, \"name\":\"%s\"", t->first,
+ t->second->name);
+ t++;
+ fprintf(stream, t != pinfo.threads()->end() ? "}, " : "}");
+ }
+ fprintf(stream, "]");
+
+ const ProcessMemoryStats* mem_info = pinfo.memory();
+ fprintf(stream, ", \"mem\": {\"vm\": %llu, \"rss\": %llu",
+ mem_info->virt_kb(), mem_info->rss_kb());
+ if (full_mem_stats) {
+ fprintf(stream,
+ ", \"pss\": %llu, \"swp\": %llu, \"pc\": %llu, \"pd\": %llu, "
+ "\"sc\": %llu, \"sd\": %llu",
+ mem_info->rss_kb(), mem_info->swapped_kb(),
+ mem_info->private_clean_kb(), mem_info->private_dirty_kb(),
+ mem_info->shared_clean_kb(), mem_info->shared_dirty_kb());
+ }
+ fprintf(stream, "}");
+
+ fprintf(stream,
+ ", \"oom\": {\"adj\": %d, \"score_adj\": %d, \"score\": %d}",
+ pinfo.oom_adj(), pinfo.oom_score_adj(), pinfo.oom_score());
+ fprintf(stream,
+ ", \"stat\": {\"minflt\": %lu, \"majflt\": %lu, "
+ "\"utime\": %lu, \"stime\": %lu }",
+ pinfo.minflt(), pinfo.majflt(), pinfo.utime(), pinfo.stime());
+ fprintf(stream, "}");
+ it++;
+ fprintf(stream, it != procs.end() ? ",\n" : "\n");
+ }
+ fprintf(stream, " ]\n");
+ fprintf(stream, "}\n");
+}
+
+} // namespace
+
+int main(int argc, char** argv) {
+ bool background = false;
+ int dump_interval_ms = 5000;
+ char out_file[PATH_MAX] = {};
+ bool dump_to_file = false;
+ bool full_mem_stats = false;
+ int count = std::numeric_limits<int>::max();
+ int opt;
+ while ((opt = getopt(argc, argv, "bmt:o:c:")) != -1) {
+ switch (opt) {
+ case 'b':
+ background = true;
+ break;
+ case 'm':
+ full_mem_stats = true;
+ break;
+ case 't':
+ dump_interval_ms = atoi(optarg);
+ CHECK(dump_interval_ms > 0);
+ break;
+ case 'c':
+ count = atoi(optarg);
+ CHECK(count > 0);
+ break;
+ case 'o':
+ strncpy(out_file, optarg, sizeof(out_file));
+ dump_to_file = true;
+ break;
+ default:
+ fprintf(stderr,
+ "Usage: %s [-b] [-t dump_interval_ms] [-c dumps_count] "
+ "[-o out.json]\n",
+ argv[0]);
+ exit(EXIT_FAILURE);
+ }
+ }
+
+ if (geteuid()) {
+ fprintf(stderr, "Must run as root\n");
+ exit(EXIT_FAILURE);
+ }
+
+ FILE* out_stream = stdout;
+ char tmp_file[PATH_MAX];
+ if (dump_to_file) {
+ unlink(out_file);
+ sprintf(tmp_file, "%s.tmp", out_file);
+ out_stream = fopen(tmp_file, "w");
+ CHECK(out_stream);
+ }
+
+ if (background) {
+ if (!dump_to_file) {
+ fprintf(stderr, "-b requires -o for output dump path\n");
+ exit(EXIT_FAILURE);
+ }
+ printf("Continuing in background. kill -TERM to terminate the daemon.\n");
+ CHECK(daemon(0 /* nochdir */, 0 /* noclose */) == 0);
+ }
+
+ g_timer = timerfd_create(CLOCK_MONOTONIC, 0);
+ CHECK(g_timer >= 0);
+ struct itimerspec ts = {};
+ ts.it_value.tv_nsec = 1; // Get the first snapshot immediately.
+ ts.it_interval.tv_nsec = (dump_interval_ms % 1000) * 1000000ul;
+ ts.it_interval.tv_sec = dump_interval_ms / 1000;
+ CHECK(timerfd_settime(g_timer, 0, &ts, nullptr) == 0);
+
+ // Closing the g_timer fd on SIGINT/SIGTERM will cause the read() below to
+ // unblock and fail with EBADF, hence allowing the loop below to finalize
+ // the file and exit.
+ auto on_exit = [](int) { close(g_timer); };
+ signal(SIGINT, on_exit);
+ signal(SIGTERM, on_exit);
+
+ fprintf(out_stream, "{\"snapshots\": [\n");
+ bool is_first_snapshot = true;
+ for (; count > 0; count--) {
+ uint64_t missed = 0;
+ int res = read(g_timer, &missed, sizeof(missed));
+ if (res < 0 && errno == EBADF)
+ break; // Received SIGINT/SIGTERM signal.
+ CHECK(res > 0);
+ if (!is_first_snapshot)
+ fprintf(out_stream, ",");
+ is_first_snapshot = false;
+
+ std::unique_ptr<ProcessMap> procs = CollectStatsForAllProcs(full_mem_stats);
+ SerializeSnapshot(*procs, out_stream, full_mem_stats);
+ fflush(out_stream);
+ }
+ fprintf(out_stream, "]}\n");
+ fclose(out_stream);
+ if (dump_to_file)
+ rename(tmp_file, out_file);
+}
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/process_info.cc b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/process_info.cc
new file mode 100644
index 0000000..172217b
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/process_info.cc
@@ -0,0 +1,102 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "process_info.h"
+
+#include <ctype.h>
+#include <dirent.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+
+#include "file_utils.h"
+#include "logging.h"
+
+ProcessInfo::ProcessInfo(int pid) : memory_(pid), pid_(pid) {}
+
+bool ProcessInfo::IsProcess(int pid) {
+ char buf[256];
+ ssize_t rsize = file_utils::ReadProcFile(pid, "status", buf, sizeof(buf));
+ if (rsize <= 0)
+ return false;
+ const char kTgid[] = "\nTgid:";
+ const char* tgid_line = strstr(buf, kTgid);
+ CHECK(tgid_line);
+ int tgid = 0;
+ if (sscanf(tgid_line + strlen(kTgid), "%d", &tgid) != 1)
+ CHECK(false);
+ return tgid == pid;
+}
+
+bool ProcessInfo::ReadProcessName() {
+ if (!file_utils::ReadProcFileTrimmed(pid_, "cmdline", name_, sizeof(name_)))
+ return false;
+
+ // Fallback on "comm" for kernel threads.
+ if (strlen(name_) == 0) {
+ if (!file_utils::ReadProcFileTrimmed(pid_, "comm", name_, sizeof(name_)))
+ return false;
+ }
+
+ // Get also the exe path, to distinguish system vs java apps and bitness.
+ char exe_path[64];
+ sprintf(exe_path, "/proc/%d/exe", pid_);
+ exe_[0] = '\0';
+ ssize_t res = readlink(exe_path, exe_, sizeof(exe_) - 1);
+ if (res >= 0)
+ exe_[res] = '\0';
+
+ return true;
+}
+
+bool ProcessInfo::ReadThreadNames() {
+ char tasks_path[64];
+ sprintf(tasks_path, "/proc/%d/task", pid_);
+ CHECK(threads_.empty());
+ ThreadInfoMap* threads = &threads_;
+ const int pid = pid_;
+ file_utils::ForEachPidInProcPath(tasks_path, [pid, threads](int tid) {
+ char comm[64];
+ std::unique_ptr<ThreadInfo> thread_info(new ThreadInfo());
+ sprintf(comm, "task/%d/comm", tid);
+ if (!file_utils::ReadProcFileTrimmed(pid, comm, thread_info->name,
+ sizeof(thread_info->name))) {
+ return;
+ }
+ (*threads)[tid] = std::move(thread_info);
+ });
+ return true;
+}
+
+bool ProcessInfo::ReadOOMStats() {
+ char buf[512];
+ if (file_utils::ReadProcFileTrimmed(pid_, "oom_adj", buf, sizeof(buf)))
+ oom_adj_ = atoi(buf);
+ else
+ return false;
+
+ if (file_utils::ReadProcFileTrimmed(pid_, "oom_score", buf, sizeof(buf)))
+ oom_score_ = atoi(buf);
+ else
+ return false;
+
+ if (file_utils::ReadProcFileTrimmed(pid_, "oom_score_adj", buf, sizeof(buf)))
+ oom_score_adj_ = atoi(buf);
+ else
+ return false;
+
+ return true;
+}
+
+bool ProcessInfo::ReadPageFaultsAndCPUTimeStats() {
+ char buf[512];
+ if (!file_utils::ReadProcFileTrimmed(pid_, "stat", buf, sizeof(buf)))
+ return false;
+ int ret = sscanf(buf,
+ "%*d (%*[^)]) %*c %*d %*d %*d %*d %*d %*u %lu %*lu "
+ "%lu %*lu %lu %lu %*ld %*ld %*ld %*ld %*ld %*ld %llu",
+ &minflt_, &majflt_, &utime_, &stime_, &start_time_);
+ CHECK(ret == 5);
+ return true;
+}
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/process_info.h b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/process_info.h
new file mode 100644
index 0000000..ff05b33
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/process_info.h
@@ -0,0 +1,71 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef PROCESS_INFO_H_
+#define PROCESS_INFO_H_
+
+#include <map>
+#include <memory>
+
+#include "process_memory_stats.h"
+
+// Reads various process stats and details from /proc/pid/.
+class ProcessInfo {
+ public:
+ struct ThreadInfo {
+ char name[128] = {};
+ };
+ using ThreadInfoMap = std::map<int, std::unique_ptr<ThreadInfo>>;
+
+ // Returns true if |pid| is a process (|pid| == TGID), false if it's just a
+ // thread of another process, or if |pid| doesn't exist at all.
+ static bool IsProcess(int pid);
+
+ explicit ProcessInfo(int pid);
+
+ bool ReadProcessName();
+ bool ReadThreadNames();
+ bool ReadOOMStats();
+ bool ReadPageFaultsAndCPUTimeStats();
+
+ ProcessMemoryStats* memory() { return &memory_; }
+ const ProcessMemoryStats* memory() const { return &memory_; }
+ const ThreadInfoMap* threads() const { return &threads_; }
+ const char* name() const { return name_; }
+ const char* exe() const { return exe_; }
+
+ int oom_adj() const { return oom_adj_; }
+ int oom_score_adj() const { return oom_score_adj_; }
+ int oom_score() const { return oom_score_; }
+
+ unsigned long minflt() const { return minflt_; }
+ unsigned long majflt() const { return majflt_; }
+ unsigned long utime() const { return utime_; }
+ unsigned long stime() const { return stime_; }
+ unsigned long long start_time() const { return start_time_; }
+
+ private:
+ ProcessInfo(const ProcessInfo&) = delete;
+ void operator=(const ProcessInfo&) = delete;
+
+ ProcessMemoryStats memory_;
+
+ ThreadInfoMap threads_;
+ char name_[128] = {};
+ char exe_[128] = {};
+
+ int oom_adj_ = 0;
+ int oom_score_adj_ = 0;
+ int oom_score_ = 0;
+
+ unsigned long minflt_ = 0;
+ unsigned long majflt_ = 0;
+ unsigned long utime_ = 0; // CPU time in user mode.
+ unsigned long stime_ = 0; // CPU time in kernel mode.
+ unsigned long long start_time_ = 0; // CPU time in kernel mode.
+
+ const int pid_;
+};
+
+#endif // PROCESS_INFO_H_
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/process_memory_stats.cc b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/process_memory_stats.cc
new file mode 100644
index 0000000..516abea
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/process_memory_stats.cc
@@ -0,0 +1,132 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "process_memory_stats.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <memory>
+
+#include "file_utils.h"
+#include "logging.h"
+
+namespace {
+const int kKbPerPage = 4;
+
+// Takes a C string buffer and chunks it into lines without creating any
+// copies. It modifies the original buffer, by replacing \n with \0.
+class LineReader {
+ public:
+ LineReader(char* buf, size_t size) : ptr_(buf), end_(buf + size) {}
+
+ const char* NextLine() {
+ if (ptr_ >= end_)
+ return nullptr;
+ const char* cur = ptr_;
+ char* next = strchr(ptr_, '\n');
+ if (next) {
+ *next = '\0';
+ ptr_ = next + 1;
+ } else {
+ ptr_ = end_;
+ }
+ return cur;
+ }
+
+ private:
+ char* ptr_;
+ char* end_;
+};
+
+bool ReadSmapsMetric(const char* line, const char* metric, uint64_t* res) {
+ if (strncmp(line, metric, strlen(metric)))
+ return false;
+ line = strchr(line, ':');
+ if (!line)
+ return false;
+ *res = strtoull(line + 1, nullptr, 10);
+ return true;
+}
+
+} // namespace
+
+ProcessMemoryStats::ProcessMemoryStats(int pid) : pid_(pid) {}
+
+bool ProcessMemoryStats::ReadLightStats() {
+ char buf[64];
+ if (file_utils::ReadProcFile(pid_, "statm", buf, sizeof(buf)) <= 0)
+ return false;
+ uint32_t vm_size_pages;
+ uint32_t rss_pages;
+ int res = sscanf(buf, "%u %u", &vm_size_pages, &rss_pages);
+ CHECK(res == 2);
+ rss_kb_ = rss_pages * kKbPerPage;
+ virt_kb_ = vm_size_pages * kKbPerPage;
+ return true;
+}
+
+bool ProcessMemoryStats::ReadFullStats() {
+ const size_t kBufSize = 32u * 1024 * 1024;
+ std::unique_ptr<char[]> buf(new char[kBufSize]);
+ ssize_t rsize = file_utils::ReadProcFile(pid_, "smaps", &buf[0], kBufSize);
+ if (rsize <= 0)
+ return false;
+ MmapInfo* last_mmap_entry = nullptr;
+ std::unique_ptr<MmapInfo> new_mmap(new MmapInfo());
+ CHECK(mmaps_.empty());
+ CHECK(rss_kb_ == 0);
+
+ // Iterate over all lines in /proc/PID/smaps.
+ LineReader rd(&buf[0], rsize);
+ for (const char* line = rd.NextLine(); line; line = rd.NextLine()) {
+ // Check if the current line is the beginning of a new mmaps entry, e.g.:
+ // be7f7000-be818000 rw-p 00000000 00:00 0 [stack]
+ // Note that the mapped file name ([stack]) is optional and won't be
+ // present
+ // on anonymous memory maps (hence res >= 3 below).
+ int res = sscanf(
+ line, "%llx-%llx %4s %*llx %*[:0-9a-f] %*[0-9a-f]%*[ \t]%128[^\n]",
+ &new_mmap->start_addr, &new_mmap->end_addr, new_mmap->prot_flags,
+ new_mmap->mapped_file);
+ if (res >= 3) {
+ last_mmap_entry = new_mmap.get();
+ CHECK(new_mmap->end_addr >= new_mmap->start_addr);
+ new_mmap->virt_kb = (new_mmap->end_addr - new_mmap->start_addr) / 1024;
+ if (res == 3)
+ new_mmap->mapped_file[0] = '\0';
+ virt_kb_ += new_mmap->virt_kb;
+ mmaps_[new_mmap->start_addr] = std::move(new_mmap);
+ new_mmap.reset(new MmapInfo());
+ } else {
+ // The current line is a metrics line within a mmap entry, e.g.:
+ // Size: 4 kB
+ uint64_t size = 0;
+ CHECK(last_mmap_entry);
+ if (ReadSmapsMetric(line, "Rss:", &size)) {
+ last_mmap_entry->rss_kb = size;
+ rss_kb_ += size;
+ } else if (ReadSmapsMetric(line, "Pss:", &size)) {
+ last_mmap_entry->pss_kb = size;
+ pss_kb_ += size;
+ } else if (ReadSmapsMetric(line, "Swap:", &size)) {
+ last_mmap_entry->swapped_kb = size;
+ swapped_kb_ += size;
+ } else if (ReadSmapsMetric(line, "Shared_Clean:", &size)) {
+ last_mmap_entry->shared_clean_kb = size;
+ shared_clean_kb_ += size;
+ } else if (ReadSmapsMetric(line, "Shared_Dirty:", &size)) {
+ last_mmap_entry->shared_dirty_kb = size;
+ shared_dirty_kb_ += size;
+ } else if (ReadSmapsMetric(line, "Private_Clean:", &size)) {
+ last_mmap_entry->private_clean_kb = size;
+ private_clean_kb_ += size;
+ } else if (ReadSmapsMetric(line, "Private_Dirty:", &size)) {
+ last_mmap_entry->private_dirty_kb = size;
+ private_dirty_kb_ += size;
+ }
+ }
+ }
+ return true;
+}
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/process_memory_stats.h b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/process_memory_stats.h
new file mode 100644
index 0000000..180c41c
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/atrace_helper/jni/process_memory_stats.h
@@ -0,0 +1,68 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef PROCESS_MEMORY_STATS_H_
+#define PROCESS_MEMORY_STATS_H_
+
+#include <stdint.h>
+
+#include <map>
+#include <memory>
+
+// Reads process memory stats from /proc/pid/{statm,smaps}.
+class ProcessMemoryStats {
+ public:
+ struct MmapInfo {
+ char mapped_file[128] = {};
+ char prot_flags[5] = {};
+ uint64_t start_addr = 0;
+ uint64_t end_addr = 0;
+ uint64_t virt_kb = 0;
+ uint64_t pss_kb = 0; // Proportional Set Size.
+ uint64_t rss_kb = 0; // Resident Set Size.
+ uint64_t private_clean_kb = 0;
+ uint64_t private_dirty_kb = 0;
+ uint64_t shared_clean_kb = 0;
+ uint64_t shared_dirty_kb = 0;
+ uint64_t swapped_kb = 0;
+ };
+
+ explicit ProcessMemoryStats(int pid);
+
+ bool ReadLightStats();
+ bool ReadFullStats();
+
+ // Available after ReadLightStats().
+ uint64_t virt_kb() const { return virt_kb_; }
+ uint64_t rss_kb() const { return rss_kb_; }
+
+ // Available after ReadFullStats().
+ uint64_t private_clean_kb() const { return private_clean_kb_; }
+ uint64_t private_dirty_kb() const { return private_dirty_kb_; }
+ uint64_t shared_clean_kb() const { return shared_clean_kb_; }
+ uint64_t shared_dirty_kb() const { return shared_dirty_kb_; }
+ uint64_t swapped_kb() const { return swapped_kb_; }
+
+ private:
+ ProcessMemoryStats(const ProcessMemoryStats&) = delete;
+ void operator=(const ProcessMemoryStats&) = delete;
+
+ const int pid_;
+
+ // Light stats.
+ uint64_t virt_kb_ = 0;
+ uint64_t rss_kb_ = 0;
+
+ // Full stats.
+ uint64_t pss_kb_ = 0;
+ uint64_t private_clean_kb_ = 0;
+ uint64_t private_dirty_kb_ = 0;
+ uint64_t shared_clean_kb_ = 0;
+ uint64_t shared_dirty_kb_ = 0;
+ uint64_t swapped_kb_ = 0;
+
+ std::map<uintptr_t, std::unique_ptr<MmapInfo>> mmaps_;
+};
+
+#endif // PROCESS_MEMORY_STATS_H_
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/__init__.py
new file mode 100644
index 0000000..8257681
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/__init__.py
@@ -0,0 +1,13 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import sys
+
+
+_CATAPULT_DIR = os.path.join(
+ os.path.dirname(os.path.abspath(__file__)), '..', '..')
+sys.path.append(os.path.join(_CATAPULT_DIR, 'devil'))
+sys.path.append(os.path.join(_CATAPULT_DIR, 'systrace'))
+sys.path.append(os.path.join(_CATAPULT_DIR, 'common', 'py_utils'))
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/chrome_startup_tracing_agent.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/chrome_startup_tracing_agent.py
new file mode 100644
index 0000000..a133a46
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/chrome_startup_tracing_agent.py
@@ -0,0 +1,123 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import optparse
+import os
+import py_utils
+import re
+
+from devil.android import flag_changer
+from devil.android.perf import cache_control
+from devil.android.sdk import intent
+
+from systrace import trace_result
+from systrace import tracing_agents
+
+
+class ChromeStartupTracingAgent(tracing_agents.TracingAgent):
+ def __init__(self, device, package_info, cold, url):
+ tracing_agents.TracingAgent.__init__(self)
+ self._device = device
+ self._package_info = package_info
+ self._cold = cold
+ self._logcat_monitor = self._device.GetLogcatMonitor()
+ self._url = url
+ self._trace_file = None
+ self._trace_finish_re = re.compile(r' Completed startup tracing to (.*)')
+ self._flag_changer = flag_changer.FlagChanger(
+ self._device, self._package_info.cmdline_file)
+
+ def __repr__(self):
+ return 'Browser Startup Trace'
+
+ def _SetupTracing(self):
+ # TODO(lizeb): Figure out how to clean up the command-line file when
+ # _TearDownTracing() is not executed in StopTracing().
+ self._flag_changer.AddFlags(['--trace-startup'])
+ self._device.ForceStop(self._package_info.package)
+ if self._cold:
+ self._device.EnableRoot()
+ cache_control.CacheControl(self._device).DropRamCaches()
+ launch_intent = None
+ if self._url == '':
+ launch_intent = intent.Intent(
+ action='android.intent.action.MAIN',
+ package=self._package_info.package,
+ activity=self._package_info.activity)
+ else:
+ launch_intent = intent.Intent(
+ package=self._package_info.package,
+ activity=self._package_info.activity,
+ data=self._url,
+ extras={'create_new_tab': True})
+ self._device.StartActivity(launch_intent, blocking=True)
+
+ def _TearDownTracing(self):
+ self._flag_changer.Restore()
+
+ @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
+ def StartAgentTracing(self, config, timeout=None):
+ self._SetupTracing()
+ self._logcat_monitor.Start()
+ return True
+
+ @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
+ def StopAgentTracing(self, timeout=None):
+ try:
+ self._trace_file = self._logcat_monitor.WaitFor(
+ self._trace_finish_re).group(1)
+ finally:
+ self._TearDownTracing()
+ return True
+
+ @py_utils.Timeout(tracing_agents.GET_RESULTS_TIMEOUT)
+ def GetResults(self, timeout=None):
+ with open(self._PullTrace(), 'r') as f:
+ trace_data = f.read()
+ return trace_result.TraceResult('traceEvents', trace_data)
+
+ def _PullTrace(self):
+ trace_file = self._trace_file.replace('/storage/emulated/0/', '/sdcard/')
+ host_file = os.path.join(os.path.curdir, os.path.basename(trace_file))
+ self._device.PullFile(trace_file, host_file)
+ return host_file
+
+ def SupportsExplicitClockSync(self):
+ return False
+
+ def RecordClockSyncMarker(self, sync_id, did_record_sync_marker_callback):
+ # pylint: disable=unused-argument
+ assert self.SupportsExplicitClockSync(), ('Clock sync marker cannot be '
+ 'recorded since explicit clock sync is not supported.')
+
+
+class ChromeStartupConfig(tracing_agents.TracingConfig):
+ def __init__(self, device, package_info, cold, url, chrome_categories):
+ tracing_agents.TracingConfig.__init__(self)
+ self.device = device
+ self.package_info = package_info
+ self.cold = cold
+ self.url = url
+ self.chrome_categories = chrome_categories
+
+
+def try_create_agent(config):
+ return ChromeStartupTracingAgent(config.device, config.package_info,
+ config.cold, config.url)
+
+def add_options(parser):
+ options = optparse.OptionGroup(parser, 'Chrome startup tracing')
+ options.add_option('--url', help='URL to visit on startup. Default: '
+ 'https://www.google.com. An empty URL launches Chrome '
+ 'with a MAIN action instead of VIEW.',
+ default='https://www.google.com', metavar='URL')
+ options.add_option('--cold', help='Flush the OS page cache before starting '
+ 'the browser. Note that this require a device with root '
+ 'access.', default=False, action='store_true')
+ return options
+
+def get_config(options):
+ return ChromeStartupConfig(options.device, options.package_info,
+ options.cold, options.url,
+ options.chrome_categories)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/chrome_startup_tracing_agent_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/chrome_startup_tracing_agent_unittest.py
new file mode 100644
index 0000000..289e52d
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/chrome_startup_tracing_agent_unittest.py
@@ -0,0 +1,28 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import json
+
+from profile_chrome import chrome_startup_tracing_agent
+from systrace import decorators
+from systrace.tracing_agents import agents_unittest
+
+
+class ChromeAgentTest(agents_unittest.BaseAgentTest):
+ # TODO(washingtonp): This test seems to fail on the version of Android
+ # currently on the Trybot servers (KTU84P), although it works on Android M.
+ # Either upgrade the version of Android on the Trybot servers or determine
+ # if there is a way to run this agent on Android KTU84P.
+ @decorators.Disabled
+ def testTracing(self):
+ agent = chrome_startup_tracing_agent.ChromeStartupTracingAgent(
+ self.device, self.package_info, False, 'https://www.google.com')
+
+ try:
+ agent.StartAgentTracing(None)
+ finally:
+ agent.StopAgentTracing()
+
+ result = agent.GetResults()
+ json.loads(result.raw_data)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/chrome_tracing_agent.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/chrome_tracing_agent.py
new file mode 100644
index 0000000..1e8895b
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/chrome_tracing_agent.py
@@ -0,0 +1,214 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import json
+import optparse
+import os
+import py_utils
+import re
+
+from devil.android import device_errors
+from devil.android.sdk import intent
+from systrace import trace_result
+from systrace import tracing_agents
+
+
+DEFAULT_CHROME_CATEGORIES = '_DEFAULT_CHROME_CATEGORIES'
+_HEAP_PROFILE_MMAP_PROPERTY = 'heapprof.mmap'
+
+
+class ChromeTracingAgent(tracing_agents.TracingAgent):
+ def __init__(self, device, package_info, ring_buffer, trace_memory=False):
+ tracing_agents.TracingAgent.__init__(self)
+ self._device = device
+ self._package_info = package_info
+ self._ring_buffer = ring_buffer
+ self._logcat_monitor = self._device.GetLogcatMonitor()
+ self._trace_file = None
+ self._trace_memory = trace_memory
+ self._is_tracing = False
+ self._trace_start_re = \
+ re.compile(r'Logging performance trace to file')
+ self._trace_finish_re = \
+ re.compile(r'Profiler finished[.] Results are in (.*)[.]')
+ self._categories = None
+
+ def __repr__(self):
+ return 'chrome trace'
+
+ @staticmethod
+ def GetCategories(device, package_info):
+ with device.GetLogcatMonitor() as logmon:
+ device.BroadcastIntent(intent.Intent(
+ action='%s.GPU_PROFILER_LIST_CATEGORIES' % package_info.package))
+ try:
+ json_category_list = logmon.WaitFor(
+ re.compile(r'{"traceCategoriesList(.*)'), timeout=5).group(0)
+ except device_errors.CommandTimeoutError:
+ raise RuntimeError('Performance trace category list marker not found. '
+ 'Is the correct version of the browser running?')
+
+ record_categories = set()
+ disabled_by_default_categories = set()
+ json_data = json.loads(json_category_list)['traceCategoriesList']
+ for item in json_data:
+ for category in item.split(','):
+ if category.startswith('disabled-by-default'):
+ disabled_by_default_categories.add(category)
+ else:
+ record_categories.add(category)
+
+ return list(record_categories), list(disabled_by_default_categories)
+
+ @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
+ def StartAgentTracing(self, config, timeout=None):
+ self._categories = _ComputeChromeCategories(config)
+ self._logcat_monitor.Start()
+ start_extras = {'categories': ','.join(self._categories)}
+ if self._ring_buffer:
+ start_extras['continuous'] = None
+ self._device.BroadcastIntent(intent.Intent(
+ action='%s.GPU_PROFILER_START' % self._package_info.package,
+ extras=start_extras))
+
+ if self._trace_memory:
+ self._device.EnableRoot()
+ self._device.SetProp(_HEAP_PROFILE_MMAP_PROPERTY, 1)
+
+ # Chrome logs two different messages related to tracing:
+ #
+ # 1. "Logging performance trace to file"
+ # 2. "Profiler finished. Results are in [...]"
+ #
+ # The first one is printed when tracing starts and the second one indicates
+ # that the trace file is ready to be pulled.
+ try:
+ self._logcat_monitor.WaitFor(self._trace_start_re, timeout=5)
+ self._is_tracing = True
+ except device_errors.CommandTimeoutError:
+ raise RuntimeError(
+ 'Trace start marker not found. Possible causes: 1) Is the correct '
+ 'version of the browser running? 2) Is the browser already launched?')
+ return True
+
+ @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
+ def StopAgentTracing(self, timeout=None):
+ if self._is_tracing:
+ self._device.BroadcastIntent(intent.Intent(
+ action='%s.GPU_PROFILER_STOP' % self._package_info.package))
+ self._trace_file = self._logcat_monitor.WaitFor(
+ self._trace_finish_re, timeout=120).group(1)
+ self._is_tracing = False
+ if self._trace_memory:
+ self._device.SetProp(_HEAP_PROFILE_MMAP_PROPERTY, 0)
+ return True
+
+ @py_utils.Timeout(tracing_agents.GET_RESULTS_TIMEOUT)
+ def GetResults(self, timeout=None):
+ with open(self._PullTrace(), 'r') as f:
+ trace_data = f.read()
+ return trace_result.TraceResult('traceEvents', trace_data)
+
+ def _PullTrace(self):
+ trace_file = self._trace_file.replace('/storage/emulated/0/', '/sdcard/')
+ host_file = os.path.join(os.path.curdir, os.path.basename(trace_file))
+ try:
+ self._device.PullFile(trace_file, host_file)
+ except device_errors.AdbCommandFailedError:
+ raise RuntimeError(
+ 'Cannot pull the trace file. Have you granted Storage permission to '
+ 'the browser? (Android Settings -> Apps -> [the browser app] -> '
+ 'Permissions -> Storage)')
+ return host_file
+
+ def SupportsExplicitClockSync(self):
+ return False
+
+ def RecordClockSyncMarker(self, sync_id, did_record_sync_marker_callback):
+ # pylint: disable=unused-argument
+ assert self.SupportsExplicitClockSync(), ('Clock sync marker cannot be '
+ 'recorded since explicit clock sync is not supported.')
+
+
+class ChromeConfig(tracing_agents.TracingConfig):
+ def __init__(self, chrome_categories, trace_cc, trace_frame_viewer,
+ trace_ubercompositor, trace_gpu, trace_flow, trace_memory,
+ trace_scheduler, ring_buffer, device, package_info):
+ tracing_agents.TracingConfig.__init__(self)
+ self.chrome_categories = chrome_categories
+ self.trace_cc = trace_cc
+ self.trace_frame_viewer = trace_frame_viewer
+ self.trace_ubercompositor = trace_ubercompositor
+ self.trace_gpu = trace_gpu
+ self.trace_flow = trace_flow
+ self.trace_memory = trace_memory
+ self.trace_scheduler = trace_scheduler
+ self.ring_buffer = ring_buffer
+ self.device = device
+ self.package_info = package_info
+
+
+def try_create_agent(config):
+ if config.chrome_categories:
+ return ChromeTracingAgent(config.device, config.package_info,
+ config.ring_buffer, config.trace_memory)
+ return None
+
+def add_options(parser):
+ chrome_opts = optparse.OptionGroup(parser, 'Chrome tracing options')
+ chrome_opts.add_option('-c', '--categories', help='Select Chrome tracing '
+ 'categories with comma-delimited wildcards, '
+ 'e.g., "*", "cat1*,-cat1a". Omit this option to trace '
+ 'Chrome\'s default categories. Chrome tracing can be '
+ 'disabled with "--categories=\'\'". Use "list" to '
+ 'see the available categories.',
+ metavar='CHROME_CATEGORIES', dest='chrome_categories')
+ chrome_opts.add_option('--trace-cc',
+ help='Deprecated, use --trace-frame-viewer.',
+ action='store_true')
+ chrome_opts.add_option('--trace-frame-viewer',
+ help='Enable enough trace categories for '
+ 'compositor frame viewing.', action='store_true')
+ chrome_opts.add_option('--trace-ubercompositor',
+ help='Enable enough trace categories for '
+ 'ubercompositor frame data.', action='store_true')
+ chrome_opts.add_option('--trace-gpu', help='Enable extra trace categories '
+ 'for GPU data.', action='store_true')
+ chrome_opts.add_option('--trace-flow', help='Enable extra trace categories '
+ 'for IPC message flows.', action='store_true')
+ chrome_opts.add_option('--trace-memory', help='Enable extra trace categories '
+ 'for memory profile. (tcmalloc required)',
+ action='store_true')
+ chrome_opts.add_option('--trace-scheduler', help='Enable extra trace '
+ 'categories for scheduler state',
+ action='store_true')
+ return chrome_opts
+
+def get_config(options):
+ return ChromeConfig(options.chrome_categories, options.trace_cc,
+ options.trace_frame_viewer, options.trace_ubercompositor,
+ options.trace_gpu, options.trace_flow,
+ options.trace_memory, options.trace_scheduler,
+ options.ring_buffer, options.device,
+ options.package_info)
+
+def _ComputeChromeCategories(config):
+ categories = []
+ if config.trace_frame_viewer:
+ categories.append('disabled-by-default-cc.debug')
+ if config.trace_ubercompositor:
+ categories.append('disabled-by-default-cc.debug*')
+ if config.trace_gpu:
+ categories.append('disabled-by-default-gpu.debug*')
+ if config.trace_flow:
+ categories.append('disabled-by-default-toplevel.flow')
+ if config.trace_memory:
+ categories.append('disabled-by-default-memory')
+ if config.trace_scheduler:
+ categories.append('disabled-by-default-blink.scheduler')
+ categories.append('disabled-by-default-cc.debug.scheduler')
+ categories.append('disabled-by-default-renderer.scheduler')
+ if config.chrome_categories:
+ categories += config.chrome_categories.split(',')
+ return categories
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/chrome_tracing_agent_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/chrome_tracing_agent_unittest.py
new file mode 100644
index 0000000..25c701a
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/chrome_tracing_agent_unittest.py
@@ -0,0 +1,51 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import json
+
+from profile_chrome import chrome_tracing_agent
+from systrace import decorators
+from systrace.tracing_agents import agents_unittest
+
+
+class ChromeAgentTest(agents_unittest.BaseAgentTest):
+ # TODO(washingtonp): This test seems to fail on the version of Android
+ # currently on the Trybot servers (KTU84P), although it works on Android M.
+ # Either upgrade the version of Android on the Trybot servers or determine
+ # if there is a way to run this agent on Android KTU84P.
+ @decorators.Disabled
+ def testGetCategories(self):
+ curr_browser = self.GetChromeProcessID()
+ if curr_browser == None:
+ self.StartBrowser()
+
+ categories = \
+ chrome_tracing_agent.ChromeTracingAgent.GetCategories(
+ self.device, self.package_info)
+
+ self.assertEquals(len(categories), 2)
+ self.assertTrue(categories[0])
+ self.assertTrue(categories[1])
+
+ # TODO(washingtonp): This test is pretty flaky on the version of Android
+ # currently on the Trybot servers (KTU84P), although it works on Android M.
+ # Either upgrade the version of Android on the Trybot servers or determine
+ # if there is a way to run this agent on Android KTU84P.
+ @decorators.Disabled
+ def testTracing(self):
+ curr_browser = self.GetChromeProcessID()
+ if curr_browser == None:
+ self.StartBrowser()
+
+ categories = '*'
+ ring_buffer = False
+ agent = chrome_tracing_agent.ChromeTracingAgent(self.device,
+ self.package_info,
+ ring_buffer)
+ agent.StartAgentTracing(chrome_tracing_agent.ChromeConfig(categories, None,
+ None, None, None, None, None, None, ring_buffer, self.device,
+ self.package_info))
+ agent.StopAgentTracing()
+ result = agent.GetResults()
+ json.loads(result.raw_data)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/ddms_tracing_agent.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/ddms_tracing_agent.py
new file mode 100644
index 0000000..9d041b9
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/ddms_tracing_agent.py
@@ -0,0 +1,97 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import optparse
+import os
+import py_utils
+import re
+
+from profile_chrome import util
+from systrace import trace_result
+from systrace import tracing_agents
+
+
+_DDMS_SAMPLING_FREQUENCY_US = 100
+
+
+class DdmsAgent(tracing_agents.TracingAgent):
+ def __init__(self, device, package_info):
+ tracing_agents.TracingAgent.__init__(self)
+ self._device = device
+ self._package = package_info.package
+ self._output_file = None
+ self._supports_sampling = self._SupportsSampling()
+
+ def __repr__(self):
+ return 'ddms profile'
+
+ def _SupportsSampling(self):
+ for line in self._device.RunShellCommand(
+ ['am', '--help'], check_return=True):
+ if re.match(r'.*am profile start.*--sampling', line):
+ return True
+ return False
+
+ @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
+ def StartAgentTracing(self, config, timeout=None):
+ self._output_file = (
+ '/data/local/tmp/ddms-profile-%s' % util.GetTraceTimestamp())
+ cmd = ['am', 'profile', 'start']
+ if self._supports_sampling:
+ cmd.extend(['--sampling', str(_DDMS_SAMPLING_FREQUENCY_US)])
+ cmd.extend([self._package, self._output_file])
+ self._device.RunShellCommand(cmd, check_return=True)
+ return True
+
+ @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
+ def StopAgentTracing(self, timeout=None):
+ self._device.RunShellCommand(
+ ['am', 'profile', 'stop', self._package], check_return=True)
+ return True
+
+ @py_utils.Timeout(tracing_agents.GET_RESULTS_TIMEOUT)
+ def GetResults(self, timeout=None):
+ with open(self._PullTrace(), 'r') as f:
+ trace_data = f.read()
+ return trace_result.TraceResult('ddms', trace_data)
+
+ def _PullTrace(self):
+ if not self._output_file:
+ return None
+
+ host_file = os.path.join(
+ os.path.curdir, os.path.basename(self._output_file))
+ self._device.PullFile(self._output_file, host_file)
+ return host_file
+
+ def SupportsExplicitClockSync(self):
+ return False
+
+ def RecordClockSyncMarker(self, sync_id, did_record_sync_marker_callback):
+ # pylint: disable=unused-argument
+ assert self.SupportsExplicitClockSync(), ('Clock sync marker cannot be '
+ 'recorded since explicit clock sync is not supported.')
+
+
+class DdmsConfig(tracing_agents.TracingConfig):
+ def __init__(self, device, package_info, ddms):
+ tracing_agents.TracingConfig.__init__(self)
+ self.device = device
+ self.package_info = package_info
+ self.ddms = ddms
+
+
+def try_create_agent(config):
+ if config.ddms:
+ return DdmsAgent(config.device, config.package_info)
+ return None
+
+def add_options(parser):
+ options = optparse.OptionGroup(parser, 'Java tracing')
+ options.add_option('--ddms', help='Trace Java execution using DDMS '
+ 'sampling.', action='store_true')
+ return options
+
+def get_config(options):
+ return DdmsConfig(options.device, options.package_info, options.ddms)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/ddms_tracing_agent_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/ddms_tracing_agent_unittest.py
new file mode 100644
index 0000000..c7269bb
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/ddms_tracing_agent_unittest.py
@@ -0,0 +1,24 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from profile_chrome import ddms_tracing_agent
+from systrace import decorators
+from systrace.tracing_agents import agents_unittest
+
+
+class DdmsAgentTest(agents_unittest.BaseAgentTest):
+ # TODO(washingtonp): The DDMS test is flaky on the Tryserver, but it
+ # consistently passes on Android M. Need to figure out why the result data
+ # does not start with '*version' and why the test is flaky.
+ @decorators.Disabled
+ def testTracing(self):
+ agent = ddms_tracing_agent.DdmsAgent(self.device, self.package_info)
+
+ try:
+ agent.StartAgentTracing(None)
+ finally:
+ agent.StopAgentTracing()
+
+ result = agent.GetResults()
+ self.assertTrue(result.raw_data.startswith('*version'))
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/fake_agent_1.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/fake_agent_1.py
new file mode 100644
index 0000000..62889f4
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/fake_agent_1.py
@@ -0,0 +1,69 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import optparse
+import tempfile
+
+from systrace import trace_result
+from systrace import tracing_agents
+
+
+class FakeAgent(object):
+ def __init__(self, contents='fake-contents'):
+ self.contents = contents
+ self.stopped = False
+ self.filename = None
+ self.config = None
+ self.timeout = None
+
+ def StartAgentTracing(self, config, timeout=None):
+ self.config = config
+ self.timeout = timeout
+ return True
+
+ # pylint: disable=unused-argument
+ def StopAgentTracing(self, timeout=None):
+ self.stopped = True
+ return True
+
+ # pylint: disable=unused-argument
+ def GetResults(self, timeout=None):
+ trace_data = open(self._PullTrace()).read()
+ return trace_result.TraceResult('fakeData', trace_data)
+
+ def _PullTrace(self):
+ with tempfile.NamedTemporaryFile(delete=False) as f:
+ self.filename = f.name
+ f.write(self.contents)
+ return f.name
+
+ # pylint: disable=no-self-use
+ def SupportsExplicitClockSync(self):
+ return False
+
+ # pylint: disable=unused-argument, no-self-use
+ def RecordClockSyncMarker(self, sync_id, did_record_sync_marker_callback):
+ print ('Clock sync marker cannot be recorded since explicit clock sync '
+ 'is not supported.')
+
+ def __repr__(self):
+ return 'faketrace'
+
+
+class FakeConfig(tracing_agents.TracingConfig):
+ def __init__(self):
+ tracing_agents.TracingConfig.__init__(self)
+
+
+# pylint: disable=unused-argument
+def try_create_agent(config):
+ return FakeAgent()
+
+def add_options(parser):
+ options = optparse.OptionGroup(parser, 'Fake options.')
+ return options
+
+# pylint: disable=unused-argument
+def get_config(options):
+ return FakeConfig()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/fake_agent_2.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/fake_agent_2.py
new file mode 100644
index 0000000..477b6c7
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/fake_agent_2.py
@@ -0,0 +1,68 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import optparse
+import tempfile
+
+from systrace import trace_result
+from systrace import tracing_agents
+
+
+class FakeAgent2(object):
+ def __init__(self, contents='fake-contents'):
+ self.contents = contents
+ self.stopped = False
+ self.config = None
+ self.filename = None
+
+ # pylint: disable=unused-argument
+ def StartAgentTracing(self, config, timeout=None):
+ self.config = config
+ return True
+
+ # pylint: disable=unused-argument
+ def StopAgentTracing(self, timeout=None):
+ self.stopped = True
+ return True
+
+ # pylint: disable=unused-argument
+ def GetResults(self, timeout=None):
+ trace_data = open(self._PullTrace()).read()
+ return trace_result.TraceResult('fakeDataTwo', trace_data)
+
+ def _PullTrace(self):
+ with tempfile.NamedTemporaryFile(delete=False) as f:
+ self.filename = f.name
+ f.write(self.contents)
+ return f.name
+
+ # pylint: disable=no-self-use
+ def SupportsExplicitClockSync(self):
+ return False
+
+ # pylint: disable=unused-argument, no-self-use
+ def RecordClockSyncMarker(self, sync_id, did_record_sync_marker_callback):
+ print ('Clock sync marker cannot be recorded since explicit clock sync '
+ 'is not supported.')
+
+ def __repr__(self):
+ return 'faketracetwo'
+
+
+class FakeConfig(tracing_agents.TracingConfig):
+ def __init__(self):
+ tracing_agents.TracingConfig.__init__(self)
+
+
+# pylint: disable=unused-argument
+def try_create_agent(config):
+ return FakeAgent2()
+
+def add_options(parser):
+ options = optparse.OptionGroup(parser, 'Fake options.')
+ return options
+
+# pylint: disable=unused-argument
+def get_config(options):
+ return FakeConfig()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/flags.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/flags.py
new file mode 100644
index 0000000..c951123
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/flags.py
@@ -0,0 +1,16 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import optparse
+
+
+def OutputOptions(parser):
+ output_options = optparse.OptionGroup(parser, 'Output options')
+ output_options.add_option('-o', '--output', dest='output_file',
+ help='Save trace output to file.')
+ output_options.add_option('--json', help='Save trace as raw JSON instead of '
+ 'HTML.', dest='write_json')
+ output_options.add_option('--view', help='Open resulting trace file in a '
+ 'browser.', action='store_true')
+ return output_options
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/main.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/main.py
new file mode 100644
index 0000000..6cd815c
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/main.py
@@ -0,0 +1,160 @@
+#!/usr/bin/env python
+#
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import logging
+import optparse
+import os
+import sys
+import webbrowser
+
+from profile_chrome import chrome_tracing_agent
+from profile_chrome import ddms_tracing_agent
+from profile_chrome import flags
+from profile_chrome import perf_tracing_agent
+from profile_chrome import profiler
+from profile_chrome import ui
+from systrace import util
+from systrace.tracing_agents import atrace_agent
+
+from devil.android import device_utils
+from devil.android.sdk import adb_wrapper
+
+
+_PROFILE_CHROME_AGENT_MODULES = [chrome_tracing_agent, ddms_tracing_agent,
+ perf_tracing_agent, atrace_agent]
+
+
+def _CreateOptionParser():
+ parser = optparse.OptionParser(description='Record about://tracing profiles '
+ 'from Android browsers. See http://dev.'
+ 'chromium.org/developers/how-tos/trace-event-'
+ 'profiling-tool for detailed instructions for '
+ 'profiling.', conflict_handler='resolve')
+
+ parser = util.get_main_options(parser)
+
+ timed_options = optparse.OptionGroup(parser, 'Timed tracing')
+ timed_options.add_option('-t', '--time', help='Profile for N seconds and '
+ 'download the resulting trace.', metavar='N',
+ type='float', dest='trace_time')
+ parser.add_option_group(timed_options)
+
+ cont_options = optparse.OptionGroup(parser, 'Continuous tracing')
+ cont_options.add_option('--continuous', help='Profile continuously until '
+ 'stopped.', action='store_true')
+ cont_options.add_option('--ring-buffer', help='Use the trace buffer as a '
+ 'ring buffer and save its contents when stopping '
+ 'instead of appending events into one long trace.',
+ action='store_true')
+ parser.add_option_group(cont_options)
+
+ parser.add_option_group(flags.OutputOptions(parser))
+
+ browsers = sorted(util.get_supported_browsers().keys())
+ parser.add_option('-b', '--browser', help='Select among installed browsers. '
+ 'One of ' + ', '.join(browsers) + ', "stable" is used by '
+ 'default.', type='choice', choices=browsers,
+ default='stable')
+ parser.add_option('-v', '--verbose', help='Verbose logging.',
+ action='store_true')
+ parser.add_option('-z', '--compress', help='Compress the resulting trace '
+ 'with gzip. ', action='store_true')
+
+ # Add options from profile_chrome agents.
+ for module in _PROFILE_CHROME_AGENT_MODULES:
+ parser.add_option_group(module.add_options(parser))
+
+ return parser
+
+
+def main():
+ parser = _CreateOptionParser()
+ options, _args = parser.parse_args() # pylint: disable=unused-variable
+ if options.trace_cc:
+ parser.error("""--trace-cc is deprecated.
+
+For basic jank busting uses, use --trace-frame-viewer
+For detailed study of ubercompositor, pass --trace-ubercompositor.
+
+When in doubt, just try out --trace-frame-viewer.
+""")
+
+ logging.basicConfig()
+
+ if options.verbose:
+ logging.getLogger().setLevel(logging.DEBUG)
+
+ if not options.device_serial_number:
+ devices = [a.GetDeviceSerial() for a in adb_wrapper.AdbWrapper.Devices()]
+ if len(devices) == 0:
+ raise RuntimeError('No ADB devices connected.')
+ elif len(devices) >= 2:
+ raise RuntimeError('Multiple devices connected, serial number required')
+ options.device_serial_number = devices[0]
+ device = device_utils.DeviceUtils.HealthyDevices(device_arg=
+ options.device_serial_number)[0]
+ package_info = util.get_supported_browsers()[options.browser]
+
+ options.device = device
+ options.package_info = package_info
+
+ # Include Chrome categories by default in profile_chrome.
+ if not options.chrome_categories:
+ options.chrome_categories = chrome_tracing_agent.DEFAULT_CHROME_CATEGORIES
+
+ if options.chrome_categories in ['list', 'help']:
+ ui.PrintMessage('Collecting record categories list...', eol='')
+ record_categories = []
+ disabled_by_default_categories = []
+ record_categories, disabled_by_default_categories = \
+ chrome_tracing_agent.ChromeTracingAgent.GetCategories(
+ device, package_info)
+
+ ui.PrintMessage('done')
+ ui.PrintMessage('Record Categories:')
+ ui.PrintMessage('\n'.join('\t%s' % item \
+ for item in sorted(record_categories)))
+
+ ui.PrintMessage('\nDisabled by Default Categories:')
+ ui.PrintMessage('\n'.join('\t%s' % item \
+ for item in sorted(disabled_by_default_categories)))
+
+ return 0
+
+ if options.atrace_categories in ['list', 'help']:
+ atrace_agent.list_categories(atrace_agent.get_config(options))
+ print '\n'
+ return 0
+
+ if (perf_tracing_agent.PerfProfilerAgent.IsSupported() and
+ options.perf_categories in ['list', 'help']):
+ ui.PrintMessage('\n'.join(
+ perf_tracing_agent.PerfProfilerAgent.GetCategories(device)))
+ return 0
+
+ if not options.trace_time and not options.continuous:
+ ui.PrintMessage('Time interval or continuous tracing should be specified.')
+ return 1
+
+ if (options.chrome_categories and options.atrace_categories and
+ 'webview' in options.atrace_categories):
+ logging.warning('Using the "webview" category in atrace together with '
+ 'Chrome tracing results in duplicate trace events.')
+
+ if options.output_file:
+ options.output_file = os.path.expanduser(options.output_file)
+ result = profiler.CaptureProfile(
+ options,
+ options.trace_time if not options.continuous else 0,
+ _PROFILE_CHROME_AGENT_MODULES,
+ output=options.output_file,
+ compress=options.compress,
+ write_json=options.write_json)
+ if options.view:
+ if sys.platform == 'darwin':
+ os.system('/usr/bin/open %s' % os.path.abspath(result))
+ else:
+ webbrowser.open(result)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/perf_tracing_agent.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/perf_tracing_agent.py
new file mode 100644
index 0000000..65831df
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/perf_tracing_agent.py
@@ -0,0 +1,253 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import logging
+import optparse
+import os
+import py_utils
+import signal
+import subprocess
+import sys
+import tempfile
+
+from devil.android import device_temp_file
+from devil.android.perf import perf_control
+
+from profile_chrome import ui
+from systrace import trace_result
+from systrace import tracing_agents
+
+_CATAPULT_DIR = os.path.join(
+ os.path.dirname(os.path.abspath(__file__)), '..', '..')
+sys.path.append(os.path.join(_CATAPULT_DIR, 'telemetry'))
+try:
+ # pylint: disable=F0401
+ from telemetry.internal.platform.profiler import android_profiling_helper
+ from telemetry.internal.util import binary_manager
+except ImportError:
+ android_profiling_helper = None
+ binary_manager = None
+
+
+_PERF_OPTIONS = [
+ # Sample across all processes and CPUs to so that the current CPU gets
+ # recorded to each sample.
+ '--all-cpus',
+ # In perf 3.13 --call-graph requires an argument, so use the -g short-hand
+ # which does not.
+ '-g',
+ # Increase priority to avoid dropping samples. Requires root.
+ '--realtime', '80',
+ # Record raw samples to get CPU information.
+ '--raw-samples',
+ # Increase sampling frequency for better coverage.
+ '--freq', '2000',
+]
+
+
+class _PerfProfiler(object):
+ def __init__(self, device, perf_binary, categories):
+ self._device = device
+ self._output_file = device_temp_file.DeviceTempFile(
+ self._device.adb, prefix='perf_output')
+ self._log_file = tempfile.TemporaryFile()
+
+ # TODO(jbudorick) Look at providing a way to unhandroll this once the
+ # adb rewrite has fully landed.
+ device_param = (['-s', str(self._device)] if str(self._device) else [])
+ cmd = ['adb'] + device_param + \
+ ['shell', perf_binary, 'record',
+ '--output', self._output_file.name] + _PERF_OPTIONS
+ if categories:
+ cmd += ['--event', ','.join(categories)]
+ self._perf_control = perf_control.PerfControl(self._device)
+ self._perf_control.SetPerfProfilingMode()
+ self._perf_process = subprocess.Popen(cmd,
+ stdout=self._log_file,
+ stderr=subprocess.STDOUT)
+
+ def SignalAndWait(self):
+ self._device.KillAll('perf', signum=signal.SIGINT)
+ self._perf_process.wait()
+ self._perf_control.SetDefaultPerfMode()
+
+ def _FailWithLog(self, msg):
+ self._log_file.seek(0)
+ log = self._log_file.read()
+ raise RuntimeError('%s. Log output:\n%s' % (msg, log))
+
+ def PullResult(self, output_path):
+ if not self._device.FileExists(self._output_file.name):
+ self._FailWithLog('Perf recorded no data')
+
+ perf_profile = os.path.join(output_path,
+ os.path.basename(self._output_file.name))
+ self._device.PullFile(self._output_file.name, perf_profile)
+ if not os.stat(perf_profile).st_size:
+ os.remove(perf_profile)
+ self._FailWithLog('Perf recorded a zero-sized file')
+
+ self._log_file.close()
+ self._output_file.close()
+ return perf_profile
+
+
+class PerfProfilerAgent(tracing_agents.TracingAgent):
+ def __init__(self, device):
+ tracing_agents.TracingAgent.__init__(self)
+ self._device = device
+ self._perf_binary = self._PrepareDevice(device)
+ self._perf_instance = None
+ self._categories = None
+
+ def __repr__(self):
+ return 'perf profile'
+
+ @staticmethod
+ def IsSupported():
+ return bool(android_profiling_helper)
+
+ @staticmethod
+ def _PrepareDevice(device):
+ if not 'BUILDTYPE' in os.environ:
+ os.environ['BUILDTYPE'] = 'Release'
+ if binary_manager.NeedsInit():
+ binary_manager.InitDependencyManager(None)
+ return android_profiling_helper.PrepareDeviceForPerf(device)
+
+ @classmethod
+ def GetCategories(cls, device):
+ perf_binary = cls._PrepareDevice(device)
+ # Perf binary returns non-zero exit status on "list" command.
+ return device.RunShellCommand([perf_binary, 'list'], check_return=False)
+
+ @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
+ def StartAgentTracing(self, config, timeout=None):
+ self._categories = _ComputePerfCategories(config)
+ self._perf_instance = _PerfProfiler(self._device,
+ self._perf_binary,
+ self._categories)
+ return True
+
+ @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
+ def StopAgentTracing(self, timeout=None):
+ if not self._perf_instance:
+ return
+ self._perf_instance.SignalAndWait()
+ return True
+
+ @py_utils.Timeout(tracing_agents.GET_RESULTS_TIMEOUT)
+ def GetResults(self, timeout=None):
+ with open(self._PullTrace(), 'r') as f:
+ trace_data = f.read()
+ return trace_result.TraceResult('perf', trace_data)
+
+ @staticmethod
+ def _GetInteractivePerfCommand(perfhost_path, perf_profile, symfs_dir,
+ required_libs, kallsyms):
+ cmd = '%s report -n -i %s --symfs %s --kallsyms %s' % (
+ os.path.relpath(perfhost_path, '.'), perf_profile, symfs_dir, kallsyms)
+ for lib in required_libs:
+ lib = os.path.join(symfs_dir, lib[1:])
+ if not os.path.exists(lib):
+ continue
+ objdump_path = android_profiling_helper.GetToolchainBinaryPath(
+ lib, 'objdump')
+ if objdump_path:
+ cmd += ' --objdump %s' % os.path.relpath(objdump_path, '.')
+ break
+ return cmd
+
+ def _PullTrace(self):
+ symfs_dir = os.path.join(tempfile.gettempdir(),
+ os.path.expandvars('$USER-perf-symfs'))
+ if not os.path.exists(symfs_dir):
+ os.makedirs(symfs_dir)
+ required_libs = set()
+
+ # Download the recorded perf profile.
+ perf_profile = self._perf_instance.PullResult(symfs_dir)
+ required_libs = \
+ android_profiling_helper.GetRequiredLibrariesForPerfProfile(
+ perf_profile)
+ if not required_libs:
+ logging.warning('No libraries required by perf trace. Most likely there '
+ 'are no samples in the trace.')
+
+ # Build a symfs with all the necessary libraries.
+ kallsyms = android_profiling_helper.CreateSymFs(self._device,
+ symfs_dir,
+ required_libs,
+ use_symlinks=False)
+ perfhost_path = binary_manager.FetchPath(
+ android_profiling_helper.GetPerfhostName(), 'x86_64', 'linux')
+
+ ui.PrintMessage('\nNote: to view the profile in perf, run:')
+ ui.PrintMessage(' ' + self._GetInteractivePerfCommand(perfhost_path,
+ perf_profile, symfs_dir, required_libs, kallsyms))
+
+ # Convert the perf profile into JSON.
+ perf_script_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),
+ 'third_party', 'perf_to_tracing.py')
+ json_file_name = os.path.basename(perf_profile)
+ with open(os.devnull, 'w') as dev_null, \
+ open(json_file_name, 'w') as json_file:
+ cmd = [perfhost_path, 'script', '-s', perf_script_path, '-i',
+ perf_profile, '--symfs', symfs_dir, '--kallsyms', kallsyms]
+ if subprocess.call(cmd, stdout=json_file, stderr=dev_null):
+ logging.warning('Perf data to JSON conversion failed. The result will '
+ 'not contain any perf samples. You can still view the '
+ 'perf data manually as shown above.')
+ return None
+
+ return json_file_name
+
+ def SupportsExplicitClockSync(self):
+ return False
+
+ def RecordClockSyncMarker(self, sync_id, did_record_sync_marker_callback):
+ # pylint: disable=unused-argument
+ assert self.SupportsExplicitClockSync(), ('Clock sync marker cannot be '
+ 'recorded since explicit clock sync is not supported.')
+
+def _OptionalValueCallback(default_value):
+ def callback(option, _, __, parser): # pylint: disable=unused-argument
+ value = default_value
+ if parser.rargs and not parser.rargs[0].startswith('-'):
+ value = parser.rargs.pop(0)
+ setattr(parser.values, option.dest, value)
+ return callback
+
+
+class PerfConfig(tracing_agents.TracingConfig):
+ def __init__(self, perf_categories, device):
+ tracing_agents.TracingConfig.__init__(self)
+ self.perf_categories = perf_categories
+ self.device = device
+
+
+def try_create_agent(config):
+ if config.perf_categories:
+ return PerfProfilerAgent(config.device)
+ return None
+
+def add_options(parser):
+ options = optparse.OptionGroup(parser, 'Perf profiling options')
+ options.add_option('-p', '--perf', help='Capture a perf profile with '
+ 'the chosen comma-delimited event categories. '
+ 'Samples CPU cycles by default. Use "list" to see '
+ 'the available sample types.', action='callback',
+ default='', callback=_OptionalValueCallback('cycles'),
+ metavar='PERF_CATEGORIES', dest='perf_categories')
+ return options
+
+def get_config(options):
+ return PerfConfig(options.perf_categories, options.device)
+
+def _ComputePerfCategories(config):
+ if not PerfProfilerAgent.IsSupported():
+ return []
+ if not config.perf_categories:
+ return []
+ return config.perf_categories.split(',')
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/perf_tracing_agent_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/perf_tracing_agent_unittest.py
new file mode 100644
index 0000000..d8ebe3a
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/perf_tracing_agent_unittest.py
@@ -0,0 +1,39 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import json
+
+from profile_chrome import perf_tracing_agent
+from profile_chrome import ui
+from systrace import decorators
+from systrace.tracing_agents import agents_unittest
+
+
+class PerfProfilerAgentTest(agents_unittest.BaseAgentTest):
+ @decorators.ClientOnlyTest
+ def testGetCategories(self):
+ if not perf_tracing_agent.PerfProfilerAgent.IsSupported():
+ return
+ categories = \
+ perf_tracing_agent.PerfProfilerAgent.GetCategories(self.device)
+ assert 'cycles' in ' '.join(categories)
+
+ # TODO(washingtonp): Try enabling this test for the SimpleperfProfilerAgent,
+ # which will be added later.
+ @decorators.Disabled
+ def testTracing(self):
+ if not perf_tracing_agent.PerfProfilerAgent.IsSupported():
+ return
+ ui.EnableTestMode()
+ categories = 'cycles'
+ agent = perf_tracing_agent.PerfProfilerAgent(self.device)
+
+ try:
+ agent.StartAgentTracing(perf_tracing_agent.PerfConfig(categories,
+ self.device))
+ finally:
+ agent.StopAgentTracing()
+
+ result = agent.GetResults()
+ json.loads(result.raw_data)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/profiler.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/profiler.py
new file mode 100644
index 0000000..1a4009c
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/profiler.py
@@ -0,0 +1,108 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import time
+
+from profile_chrome import chrome_startup_tracing_agent
+from profile_chrome import chrome_tracing_agent
+from profile_chrome import ui
+from profile_chrome import util
+from systrace import output_generator
+from systrace import tracing_controller
+
+
+def _GetResults(trace_results, controller, output, compress, write_json,
+ interval):
+ ui.PrintMessage('Downloading...')
+
+ # Wait for the trace file to get written.
+ time.sleep(1)
+
+ for agent in controller.get_child_agents:
+ if isinstance(agent, chrome_tracing_agent.ChromeTracingAgent):
+ time.sleep(interval / 4)
+
+ # Ignore the systraceController because it will not contain any results,
+ # instead being in charge of collecting results.
+ trace_results = [x for x in controller.all_results if not (x.source_name ==
+ 'systraceController')]
+
+ if not trace_results:
+ ui.PrintMessage('No results')
+ return ''
+
+ result = None
+ trace_results = output_generator.MergeTraceResultsIfNeeded(trace_results)
+ if not write_json:
+ ui.PrintMessage('Writing trace HTML...')
+ html_file = trace_results[0].source_name + '.html'
+ result = output_generator.GenerateHTMLOutput(trace_results, html_file)
+ ui.PrintMessage('\nWrote file://%s' % result)
+ elif compress and len(trace_results) == 1:
+ result = output or trace_results[0].source_name + '.gz'
+ util.WriteDataToCompressedFile(trace_results[0].raw_data, result)
+ elif len(trace_results) > 1:
+ result = (output or 'chrome-combined-trace-%s.zip' %
+ util.GetTraceTimestamp())
+ util.ArchiveData(trace_results, result)
+ elif output:
+ result = output
+ with open(result, 'wb') as f:
+ f.write(trace_results[0].raw_data)
+ else:
+ result = trace_results[0].source_name
+ with open(result, 'wb') as f:
+ f.write(trace_results[0].raw_data)
+
+ return result
+
+
+def CaptureProfile(options, interval, modules, output=None,
+ compress=False, write_json=False):
+ """Records a profiling trace saves the result to a file.
+
+ Args:
+ options: Command line options.
+ interval: Time interval to capture in seconds. An interval of None (or 0)
+ continues tracing until stopped by the user.
+ modules: The list of modules to initialize the tracing controller with.
+ output: Output file name or None to use an automatically generated name.
+ compress: If True, the result will be compressed either with gzip or zip
+ depending on the number of captured subtraces.
+ write_json: If True, prefer JSON output over HTML.
+
+ Returns:
+ Path to saved profile.
+ """
+ agents_with_config = tracing_controller.CreateAgentsWithConfig(options,
+ modules)
+ if chrome_startup_tracing_agent in modules:
+ controller_config = tracing_controller.GetChromeStartupControllerConfig(
+ options)
+ else:
+ controller_config = tracing_controller.GetControllerConfig(options)
+ controller = tracing_controller.TracingController(agents_with_config,
+ controller_config)
+ try:
+ result = controller.StartTracing()
+ trace_type = controller.GetTraceType()
+ if not result:
+ ui.PrintMessage('Trace starting failed.')
+ if interval:
+ ui.PrintMessage(('Capturing %d-second %s. Press Enter to stop early...' %
+ (interval, trace_type)), eol='')
+ ui.WaitForEnter(interval)
+ else:
+ ui.PrintMessage('Capturing %s. Press Enter to stop...' % trace_type,
+ eol='')
+ raw_input()
+
+ ui.PrintMessage('Stopping...')
+ all_results = controller.StopTracing()
+ finally:
+ if interval:
+ ui.PrintMessage('done')
+
+ return _GetResults(all_results, controller, output, compress, write_json,
+ interval)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/profiler_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/profiler_unittest.py
new file mode 100644
index 0000000..9b35753
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/profiler_unittest.py
@@ -0,0 +1,58 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import unittest
+import zipfile
+
+from profile_chrome import profiler
+from profile_chrome import ui
+from profile_chrome import fake_agent_1
+from profile_chrome import fake_agent_2
+from systrace import decorators
+from systrace import tracing_controller
+
+
+class ProfilerTest(unittest.TestCase):
+ def setUp(self):
+ ui.EnableTestMode()
+ self._tracing_options = tracing_controller.TracingControllerConfig(None,
+ None, None, None, None, None, None, None, None)
+
+ @decorators.ClientOnlyTest
+ def testCaptureBasicProfile(self):
+ result = profiler.CaptureProfile(self._tracing_options, 1, [fake_agent_1])
+
+ try:
+ self.assertTrue(os.path.exists(result))
+ self.assertTrue(result.endswith('.html'))
+ finally:
+ if os.path.exists(result):
+ os.remove(result)
+
+ @decorators.ClientOnlyTest
+ def testCaptureJsonProfile(self):
+ result = profiler.CaptureProfile(self._tracing_options, 1,
+ [fake_agent_2], write_json=True)
+
+ try:
+ self.assertFalse(result.endswith('.html'))
+ with open(result) as f:
+ self.assertEquals(f.read(), 'fake-contents')
+ finally:
+ if os.path.exists(result):
+ os.remove(result)
+
+ @decorators.ClientOnlyTest
+ def testCaptureMultipleProfiles(self):
+ result = profiler.CaptureProfile(self._tracing_options, 1,
+ [fake_agent_1, fake_agent_2],
+ write_json=True)
+
+ try:
+ self.assertTrue(result.endswith('.zip'))
+ self.assertTrue(zipfile.is_zipfile(result))
+ finally:
+ if os.path.exists(result):
+ os.remove(result)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/run_tests b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/run_tests
new file mode 100644
index 0000000..6ae1854
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/run_tests
@@ -0,0 +1,3 @@
+#!/bin/sh
+cd $(dirname $0)/../
+exec python -m unittest discover profile_chrome '*_unittest.py' $@
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/third_party/COPYING b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/third_party/COPYING
new file mode 100644
index 0000000..d159169
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/third_party/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/third_party/README.chromium b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/third_party/README.chromium
new file mode 100644
index 0000000..5f58a65
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/third_party/README.chromium
@@ -0,0 +1,15 @@
+Name: Perf to JSON conversion script
+Short Name: perf_to_json
+URL: http://www.chromium.org
+Version: 0
+Date: 21.7.2014
+Revision: 0
+License: GPL
+License File: NOT_SHIPPED
+Security Critical: No
+
+Description:
+Script for converting perf script events into tracing JSON.
+
+Local Modifications:
+None.
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/third_party/perf_to_tracing.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/third_party/perf_to_tracing.py
new file mode 100644
index 0000000..280937a
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/third_party/perf_to_tracing.py
@@ -0,0 +1,248 @@
+# Script for converting perf script events into tracing JSON.
+#
+# Generated by perf script -g python
+# Licensed under the terms of the GNU GPL License version 2
+
+import json
+import os
+import sys
+
+from collections import deque
+
+
+# Categorize DSOs by component.
+dso_to_comp = {
+ 'libdvm.so': 'Java',
+ 'libart.so': 'Java',
+ 'libjavacore.so': 'Java',
+ 'libandroid_runtime.so': 'Android',
+ 'libgui.so': 'Android',
+ 'libui.so': 'Android',
+ 'libbinder.so': 'Android',
+ 'libmemalloc.so': 'Android',
+ 'libcrypto.so': 'Android',
+ 'libcutils.so':'Android',
+ 'libutils.so': 'Android',
+ '[kernel.kallsyms]': 'Kernel',
+ 'libc.so': 'Standard Lib',
+ 'libstdc++.so': 'Standard Lib',
+ 'libm.so':'Standard Lib',
+ 'libGLESv2_adreno.so': 'GPU Driver',
+ 'libGLESv2_adreno200.so': 'GPU Driver',
+ 'libq3dtools_adreno200.so': 'GPU Driver',
+ 'libEGL_adreno.so': 'GPU Driver',
+ 'libEGL_adreno200.so': 'GPU Driver',
+ 'libEGL.so': 'GPU Driver',
+ 'libgsl.so': 'GPU Driver',
+ 'libGLESv2.so': 'GPU Driver',
+ 'libsc-a3xx.so': 'GPU Driver',
+ 'libadreno_utils.so': 'GPU Driver',
+ 'eglsubAndroid.so': 'GPU Driver',
+ 'gralloc.msm8960.so': 'GPU Driver',
+ 'libadreno_utils': 'GPU Driver',
+ 'libGLES_mali.so': 'GPU Driver',
+ 'libchromeview.so': 'Chrome',
+ '[unknown]': '<unknown>',
+ '[UNKNOWN]': '<unknown>',
+}
+
+
+def FilterSymbolModule(module):
+ m = dso_to_comp.get(module, None)
+ if m:
+ return m
+ if module.find('libchrome.') == 0:
+ return 'Chrome'
+ if module.find('dalvik') >= 0 or module.find('@') >= 0:
+ return 'Java'
+ return module
+
+
+def FilterSymbolName(module, orign_module, name):
+ if module == 'Java':
+ return name
+ elif module == 'GPU Driver':
+ return name
+ if name == '':
+ return orign_module + ':unknown'
+ if name[0].isdigit() or name == '(nil)':
+ return orign_module + ':unknown'
+ return name
+
+
+class StackFrameNode:
+ def __init__(self, stack_id, name, category):
+ self.stack_id = stack_id
+ self.parent_id = 0
+ self.children = {}
+ self.category = category
+ self.name = name
+ self.samples = []
+ self.total_weight = 0.0
+ self.have_total_weight = False
+ self.parent = None
+
+ def ToDict(self, out_dict):
+ if self.stack_id:
+ node_dict = {}
+ node_dict['name'] = self.name
+ node_dict['category'] = self.category
+ if self.parent_id:
+ node_dict['parent'] = self.parent_id
+
+ out_dict[self.stack_id] = node_dict
+
+ for child in self.children.values():
+ child.ToDict(out_dict)
+ return out_dict
+
+ def GetTotalWeight(self):
+ if self.have_total_weight:
+ return self.total_weight
+ else:
+ # Sum up self samples weight, and children's total weights.
+ for s in self.samples:
+ self.total_weight += s.weight
+ for c in self.children.values():
+ self.total_weight += c.GetTotalWeight()
+ self.have_total_weight = True
+ return self.total_weight
+
+
+class PerfSample:
+ def __init__(self, stack_id, ts, cpu, tid, weight, samp_type, comm):
+ self.stack_id = stack_id
+ self.ts = ts
+ self.cpu = cpu
+ self.tid = tid
+ self.weight = weight
+ self.type = samp_type
+ self.comm = comm
+
+ def ToDict(self):
+ ret = {}
+ ret['ts'] = self.ts / 1000.0 # Timestamp in microseconds
+ ret['tid'] = self.tid # Thread id
+ ret['cpu'] = self.cpu # Sampled CPU
+ ret['weight'] = self.weight # Sample weight
+ ret['name'] = self.type # Sample type
+ ret['comm'] = self.comm # Sample type
+ assert self.stack_id != 0
+ if self.stack_id:
+ ret['sf'] = self.stack_id # Stack frame id
+ return ret
+
+
+samples = []
+root_chain = StackFrameNode(0, 'root', '[unknown]')
+next_stack_id = 1
+tot_period = 0
+saved_period = 0
+
+
+def process_event(param_dict):
+ global next_stack_id
+ global saved_period
+ global tot_period
+
+ samp_comm = param_dict['comm']
+ samp_tid = param_dict['tid']
+ samp_cpu = param_dict['cpu']
+ samp_ts = param_dict['time']
+ samp_period = param_dict['period']
+ samp_type = param_dict['ev_name']
+ tot_period += samp_period
+
+ # Parse call chain.
+ seen_syms = set()
+ chain = deque()
+ for cs in param_dict['cs']:
+ cs_name = cs[0]
+ cs_dso = os.path.basename(cs[1])
+ cs_category = FilterSymbolModule(cs_dso)
+ cs_name = FilterSymbolName(cs_category, cs_dso, cs_name)
+
+ if cs_category != '<unknown>' or len(chain) == 0:
+ sym = (cs_name, cs_category)
+ if sym in seen_syms:
+ while chain[0] != sym:
+ seen_syms.remove(chain[0])
+ chain.popleft()
+ else:
+ seen_syms.add(sym)
+ chain.appendleft(sym)
+
+ # Discard garbage stacktrace before __pthread_start()
+ if cs_name == '__pthread_start(void*)':
+ break
+
+ # Done reading call chain. Add to stack frame tree.
+ stack_frame = root_chain
+ for call in chain:
+ if call in stack_frame.children:
+ stack_frame = stack_frame.children[call]
+ else:
+ new_node = StackFrameNode(next_stack_id, call[0], call[1])
+ next_stack_id += 1
+ new_node.parent_id = stack_frame.stack_id
+ stack_frame.children[call] = new_node
+ stack_frame = new_node
+
+ # Save sample.
+ sample = PerfSample(stack_frame.stack_id,
+ samp_ts,
+ samp_cpu,
+ samp_tid,
+ samp_period,
+ samp_type,
+ samp_comm)
+ samples.append(sample)
+ stack_frame.samples.append(sample)
+ saved_period += samp_period
+
+
+def trace_begin():
+ pass
+
+
+def trace_end():
+ # Return siblings of a call tree node.
+ def GetNodeSiblings(node):
+ if not node:
+ return []
+ if not node.parent:
+ return []
+ return node.parent.children.values()
+
+ # Try to reduce misplaced stack leaves by moving them up into sibling nodes.
+ def FixCallTree(node, parent):
+ # Get siblings of node's parent.
+ node.parent = parent
+ parent_siblings = GetNodeSiblings(parent)
+
+ # If parent's sibling has same node name, has no children and small weight,
+ # transplant sibling's samples into the current node.
+ for sibling in parent_siblings:
+ if sibling.name == node.name and \
+ len(sibling.children) == 0 and \
+ sibling.GetTotalWeight() <= node.GetTotalWeight() * 0.15:
+
+ # Transplant samples from sibling to current node.
+ for samp in sibling.samples:
+ samp.stack_id = node.stack_id
+ node.samples.append(samp)
+ sibling.samples = []
+ break
+
+ # Recurse child nodes.
+ for c in node.children.values():
+ FixCallTree(c, node)
+
+ FixCallTree(root_chain, None)
+
+ trace_dict = {}
+ trace_dict['samples'] = [s.ToDict() for s in samples]
+ trace_dict['stackFrames'] = root_chain.ToDict({})
+ trace_dict['traceEvents'] = []
+
+ json.dump(trace_dict, sys.stdout, indent=1)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/ui.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/ui.py
new file mode 100644
index 0000000..30ebd9b
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/ui.py
@@ -0,0 +1,27 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import logging
+import select
+import sys
+
+
+def PrintMessage(heading, eol='\n'):
+ sys.stdout.write('%s%s' % (heading, eol))
+ sys.stdout.flush()
+
+
+def WaitForEnter(timeout):
+ select.select([sys.stdin], [], [], timeout)
+
+
+def EnableTestMode():
+ def NoOp(*_, **__): # pylint: disable=unused-argument
+ pass
+ # pylint: disable=W0601
+ global PrintMessage
+ global WaitForEnter
+ PrintMessage = NoOp
+ WaitForEnter = NoOp
+ logging.getLogger().disabled = True
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/util.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/util.py
new file mode 100644
index 0000000..f5cb5bf
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/profile_chrome/util.py
@@ -0,0 +1,35 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import gzip
+import os
+import time
+import zipfile
+
+
+def ArchiveFiles(host_files, output):
+ with zipfile.ZipFile(output, 'w', zipfile.ZIP_DEFLATED) as z:
+ for host_file in host_files:
+ z.write(host_file)
+ os.unlink(host_file)
+
+def CompressFile(host_file, output):
+ with gzip.open(output, 'wb') as out, open(host_file, 'rb') as input_file:
+ out.write(input_file.read())
+ os.unlink(host_file)
+
+def ArchiveData(trace_results, output):
+ with zipfile.ZipFile(output, 'w', zipfile.ZIP_DEFLATED) as z:
+ for result in trace_results:
+ trace_file = result.source_name + GetTraceTimestamp()
+ WriteDataToCompressedFile(result.raw_data, trace_file)
+ z.write(trace_file)
+ os.unlink(trace_file)
+
+def WriteDataToCompressedFile(data, output):
+ with gzip.open(output, 'wb') as out:
+ out.write(data)
+
+def GetTraceTimestamp():
+ return time.strftime('%Y-%m-%d-%H%M%S', time.localtime())
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/pylintrc b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/pylintrc
new file mode 100644
index 0000000..eb051e6
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/pylintrc
@@ -0,0 +1,67 @@
+[MESSAGES CONTROL]
+
+# Disable the message, report, category or checker with the given id(s).
+# TODO: Shrink this list to as small as possible.
+disable=
+ design,
+ similarities,
+
+ abstract-class-not-used,
+ bad-builtin,
+ bad-continuation,
+ eval-used,
+ fixme,
+ invalid-name,
+ locally-disabled,
+ missing-docstring,
+ protected-access,
+ star-args,
+
+
+[REPORTS]
+
+# Don't write out full reports, just messages.
+reports=no
+
+
+[BASIC]
+
+# Regular expression which should only match correct function names.
+function-rgx=^(?:(?P<exempt>setUp|tearDown|setUpModule|tearDownModule)|(?P<camel_case>_?[A-Z][a-zA-Z0-9]*))$
+
+# Regular expression which should only match correct method names.
+method-rgx=^(?:(?P<exempt>_[a-z0-9_]+__|get|post|runTest|setUp|tearDown|setUpTestCase|tearDownTestCase|setupSelf|tearDownClass|setUpClass)|(?P<camel_case>(_{0,2}|test|assert)[A-Z][a-zA-Z0-9_]*))$
+
+# Regular expression which should only match correct argument names.
+argument-rgx=^[a-z][a-z0-9_]*$
+
+# Regular expression which should only match correct variable names.
+variable-rgx=^[a-z][a-z0-9_]*$
+
+# Good variable names which should always be accepted, separated by a comma.
+good-names=main,_
+
+# List of builtins function names that should not be used, separated by a comma.
+bad-functions=apply,input,reduce
+
+
+[VARIABLES]
+
+# Tells wether we should check for unused import in __init__ files.
+init-import=no
+
+# A regular expression matching names used for dummy variables (i.e. not used).
+dummy-variables-rgx=^\*{0,2}(_$|unused_)
+
+
+[TYPECHECK]
+
+# Tells wether missing members accessed in mixin class should be ignored. A
+# mixin class is detected if its name ends with "mixin" (case insensitive).
+ignore-mixin-members=yes
+
+
+[FORMAT]
+
+# We use two spaces for indents, instead of the usual four spaces or tab.
+indent-string=' '
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/AUTHORS b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/AUTHORS
new file mode 100644
index 0000000..5a7ed82
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/AUTHORS
@@ -0,0 +1,12 @@
+# Names should be added to this file with this pattern:
+#
+# For individuals:
+# Name <email address>
+#
+# For organizations:
+# Organization <fnmatch pattern>
+#
+# See python fnmatch module documentation for more information.
+
+The Chromium Authors <*@chromium.org>
+Google Inc. <*@google.com>
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/LICENSE b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/LICENSE
new file mode 100644
index 0000000..8dc3504
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/LICENSE
@@ -0,0 +1,27 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/README.md b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/README.md
new file mode 100644
index 0000000..0e103a5
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/README.md
@@ -0,0 +1,16 @@
+<!-- Copyright 2015 The Chromium Authors. All rights reserved.
+ Use of this source code is governed by a BSD-style license that can be
+ found in the LICENSE file.
+-->
+Systrace
+========
+
+Systrace relies on
+[Trace-Viewer](https://github.com/catapult-project/catapult/blob/master/tracing/README.md)
+to visualize the traces. The development of Trace-Viewer and Systrace is
+decoupled by the systrace_trace_viewer.html file.
+* The update_systrace_trace_viewer.py script generates
+systrace_trace_viewer.html based on the Trace-Viewer code.
+* Systrace visualizes the trace result based on systrace_trace_viewer.html.
+* Systrace will auto update systrace_trace_viewer.html if
+update_systrace_trace_viewer.py exists.
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/__init__.py
new file mode 100644
index 0000000..831f774
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/__init__.py
@@ -0,0 +1,28 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+import os
+import sys
+
+def _JoinPath(*path_parts):
+ return os.path.abspath(os.path.join(*path_parts))
+
+
+def _AddDirToPythonPath(*path_parts):
+ path = _JoinPath(*path_parts)
+ if os.path.isdir(path) and path not in sys.path:
+ # Some call sites that use Telemetry assume that sys.path[0] is the
+ # directory containing the script, so we add these extra paths to right
+ # after sys.path[0].
+ sys.path.insert(1, path)
+
+_CATAPULT_DIR = os.path.join(
+ os.path.dirname(os.path.abspath(__file__)), os.path.pardir, os.path.pardir)
+
+_AddDirToPythonPath(_CATAPULT_DIR, 'common', 'battor')
+_AddDirToPythonPath(_CATAPULT_DIR, 'common', 'py_utils')
+_AddDirToPythonPath(_CATAPULT_DIR, 'common', 'py_trace_event')
+_AddDirToPythonPath(_CATAPULT_DIR, 'common', 'py_trace_event', 'py_trace_event')
+_AddDirToPythonPath(_CATAPULT_DIR, 'devil')
+_AddDirToPythonPath(_CATAPULT_DIR, 'systrace')
+_AddDirToPythonPath(_CATAPULT_DIR, 'tracing')
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/decorators.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/decorators.py
new file mode 100644
index 0000000..8545eaa
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/decorators.py
@@ -0,0 +1,41 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+def HostOnlyTest(func):
+ """Decorator for running unit tests only on the host device.
+
+ This will disable unit tests from running on Android devices.
+ """
+ return _SkipTestDecoratorHelper(func, ['android'])
+
+
+def ClientOnlyTest(func):
+ """Decorator for running unit tests only on client devices (Android).
+ """
+ return _SkipTestDecoratorHelper(func, ['win', 'linux', 'mac'])
+
+
+def Disabled(func):
+ """Decorator for not running a unit test on any Trybot platform.
+ """
+ return _SkipTestDecoratorHelper(func, ['win', 'linux', 'mac', 'android'])
+
+
+def LinuxMacTest(func):
+ return _SkipTestDecoratorHelper(func, ['win', 'android'])
+
+
+def _SkipTestDecoratorHelper(func, disabled_strings):
+ if not hasattr(func, '_disabled_strings'):
+ setattr(func, '_disabled_strings', set(disabled_strings))
+ return func
+
+
+def ShouldSkip(test, device):
+ """Returns whether the test should be skipped and the reason for it."""
+ if hasattr(test, '_disabled_strings'):
+ disabled_devices = getattr(test, '_disabled_strings')
+ return device in disabled_devices
+ return False
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/monitor_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/monitor_unittest.py
new file mode 100644
index 0000000..65d63e1
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/monitor_unittest.py
@@ -0,0 +1,52 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import unittest
+
+from systrace import decorators
+from systrace import update_systrace_trace_viewer
+
+SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
+STABLE_VIEWER_PATH = os.path.join(SCRIPT_DIR, 'systrace_trace_viewer.html')
+
+# Tests presence and content of static HTML files used not only for Python
+# systrace capture, but also Java-based capture in the android SDK tools.
+#
+# NOTE: changes to this file should typically be accompanied by changes to the
+# Android SDK's method of systrace capture.
+class MonitorTest(unittest.TestCase):
+
+ @decorators.HostOnlyTest
+ def test_systrace_trace_viewer(self):
+ self.assertEqual(STABLE_VIEWER_PATH,
+ update_systrace_trace_viewer.SYSTRACE_TRACE_VIEWER_HTML_FILE)
+
+ update_systrace_trace_viewer.update(force_update=True)
+
+ with open(STABLE_VIEWER_PATH) as f:
+ content = f.read().strip()
+
+ # expect big html file
+ self.assertGreater(5 * 1024 * 1024, len(content))
+ self.assertEqual('<', content[0])
+ os.remove(f.name)
+
+
+ @decorators.HostOnlyTest
+ def test_prefix(self):
+ with open(os.path.join(SCRIPT_DIR, 'prefix.html')) as f:
+ content = f.read().strip()
+
+ self.assertTrue("<html>" in content)
+ self.assertTrue("<title>Android System Trace</title>" in content)
+ self.assertTrue("{{SYSTRACE_TRACE_VIEWER_HTML}}" in content)
+
+
+ @decorators.HostOnlyTest
+ def test_suffix(self):
+ with open(os.path.join(SCRIPT_DIR, 'suffix.html')) as f:
+ content = f.read().strip()
+
+ self.assertTrue("</html>" in content)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/output_generator.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/output_generator.py
new file mode 100644
index 0000000..553d5d4
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/output_generator.py
@@ -0,0 +1,189 @@
+#!/usr/bin/env python
+
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import base64
+import gzip
+import json
+import os
+import StringIO
+
+from systrace import tracing_controller
+from systrace import trace_result
+from tracing.trace_data import trace_data
+
+
+# TODO(alexandermont): Current version of trace viewer does not support
+# the controller tracing agent output. Thus we use this variable to
+# suppress this tracing agent's output. This should be removed once
+# trace viewer is working again.
+OUTPUT_CONTROLLER_TRACE_ = False
+CONTROLLER_TRACE_DATA_KEY = 'controllerTraceDataKey'
+_SYSTRACE_TO_TRACE_DATA_NAME_MAPPING = {
+ 'androidProcessDump': trace_data.ANDROID_PROCESS_DATA_PART,
+ 'systemTraceEvents': trace_data.ATRACE_PART,
+ 'powerTraceAsString': trace_data.BATTOR_TRACE_PART,
+ 'systraceController': trace_data.TELEMETRY_PART,
+ 'traceEvents': trace_data.CHROME_TRACE_PART,
+ 'waltTrace': trace_data.WALT_TRACE_PART,
+}
+_SYSTRACE_HEADER = 'Systrace'
+
+
+def NewGenerateHTMLOutput(trace_results, output_file_name):
+ trace_data_builder = trace_data.TraceDataBuilder()
+ for trace in trace_results:
+ trace_data_part = _SYSTRACE_TO_TRACE_DATA_NAME_MAPPING.get(
+ trace.source_name)
+ trace_data_builder.AddTraceFor(trace_data_part, trace.raw_data)
+ trace_data_builder.AsData().Serialize(output_file_name, _SYSTRACE_HEADER)
+
+
+def GenerateHTMLOutput(trace_results, output_file_name):
+ """Write the results of systrace to an HTML file.
+
+ Args:
+ trace_results: A list of TraceResults.
+ output_file_name: The name of the HTML file that the trace viewer
+ results should be written to.
+ """
+ def _ReadAsset(src_dir, filename):
+ return open(os.path.join(src_dir, filename)).read()
+
+ # TODO(rnephew): The tracing output formatter is able to handle a single
+ # systrace trace just as well as it handles multiple traces. The obvious thing
+ # to do here would be to use it all for all systrace output: however, we want
+ # to continue using the legacy way of formatting systrace output when a single
+ # systrace and the tracing controller trace are present in order to match the
+ # Java verison of systrace. Java systrace is expected to be deleted at a later
+ # date. We should consolidate this logic when that happens.
+
+ if len(trace_results) > 3:
+ NewGenerateHTMLOutput(trace_results, output_file_name)
+ return os.path.abspath(output_file_name)
+
+ systrace_dir = os.path.abspath(os.path.dirname(__file__))
+
+ try:
+ from systrace import update_systrace_trace_viewer
+ except ImportError:
+ pass
+ else:
+ update_systrace_trace_viewer.update()
+
+ trace_viewer_html = _ReadAsset(systrace_dir, 'systrace_trace_viewer.html')
+
+ # Open the file in binary mode to prevent python from changing the
+ # line endings, then write the prefix.
+ systrace_dir = os.path.abspath(os.path.dirname(__file__))
+ html_prefix = _ReadAsset(systrace_dir, 'prefix.html')
+ html_suffix = _ReadAsset(systrace_dir, 'suffix.html')
+ trace_viewer_html = _ReadAsset(systrace_dir,
+ 'systrace_trace_viewer.html')
+
+ # Open the file in binary mode to prevent python from changing the
+ # line endings, then write the prefix.
+ html_file = open(output_file_name, 'wb')
+ html_file.write(html_prefix.replace('{{SYSTRACE_TRACE_VIEWER_HTML}}',
+ trace_viewer_html))
+
+ # Write the trace data itself. There is a separate section of the form
+ # <script class="trace-data" type="application/text"> ... </script>
+ # for each tracing agent (including the controller tracing agent).
+ html_file.write('<!-- BEGIN TRACE -->\n')
+ for result in trace_results:
+ html_file.write(' <script class="trace-data" type="application/text">\n')
+ html_file.write(_ConvertToHtmlString(result.raw_data))
+ html_file.write(' </script>\n')
+ html_file.write('<!-- END TRACE -->\n')
+
+ # Write the suffix and finish.
+ html_file.write(html_suffix)
+ html_file.close()
+
+ final_path = os.path.abspath(output_file_name)
+ return final_path
+
+def _ConvertToHtmlString(result):
+ """Convert a trace result to the format to be output into HTML.
+
+ If the trace result is a dictionary or list, JSON-encode it.
+ If the trace result is a string, leave it unchanged.
+ """
+ if isinstance(result, dict) or isinstance(result, list):
+ return json.dumps(result)
+ elif isinstance(result, str):
+ return result
+ else:
+ raise ValueError('Invalid trace result format for HTML output')
+
+def GenerateJSONOutput(trace_results, output_file_name):
+ """Write the results of systrace to a JSON file.
+
+ Args:
+ trace_results: A list of TraceResults.
+ output_file_name: The name of the JSON file that the trace viewer
+ results should be written to.
+ """
+ results = _ConvertTraceListToDictionary(trace_results)
+ results[CONTROLLER_TRACE_DATA_KEY] = (
+ tracing_controller.TRACE_DATA_CONTROLLER_NAME)
+ with open(output_file_name, 'w') as json_file:
+ json.dump(results, json_file)
+ final_path = os.path.abspath(output_file_name)
+ return final_path
+
+def MergeTraceResultsIfNeeded(trace_results):
+ """Merge a list of trace data, if possible. This function can take any list
+ of trace data, but it will only merge the JSON data (since that's all
+ we can merge).
+
+ Args:
+ trace_results: A list of TraceResults containing trace data.
+ """
+ if len(trace_results) <= 1:
+ return trace_results
+ merge_candidates = []
+ for result in trace_results:
+ # Try to detect a JSON file cheaply since that's all we can merge.
+ if result.raw_data[0] != '{':
+ continue
+ try:
+ json_data = json.loads(result.raw_data)
+ except ValueError:
+ continue
+ merge_candidates.append(trace_result.TraceResult(result.source_name,
+ json_data))
+
+ if len(merge_candidates) <= 1:
+ return trace_results
+
+ other_results = [r for r in trace_results
+ if not r.source_name in
+ [c.source_name for c in merge_candidates]]
+
+ merged_data = merge_candidates[0].raw_data
+
+ for candidate in merge_candidates[1:]:
+ json_data = candidate.raw_data
+ for key, value in json_data.items():
+ if not str(key) in merged_data or not merged_data[str(key)]:
+ merged_data[str(key)] = value
+
+ return ([trace_result.TraceResult('merged-data', json.dumps(merged_data))]
+ + other_results)
+
+def _EncodeTraceData(trace_string):
+ compressed_trace = StringIO.StringIO()
+ with gzip.GzipFile(fileobj=compressed_trace, mode='w') as f:
+ f.write(trace_string)
+ b64_content = base64.b64encode(compressed_trace.getvalue())
+ return b64_content
+
+def _ConvertTraceListToDictionary(trace_list):
+ trace_dict = {}
+ for trace in trace_list:
+ trace_dict[trace.source_name] = trace.raw_data
+ return trace_dict
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/output_generator_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/output_generator_unittest.py
new file mode 100644
index 0000000..58e11ac
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/output_generator_unittest.py
@@ -0,0 +1,123 @@
+#!/usr/bin/env python
+
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import hashlib
+import json
+import os
+import unittest
+
+from systrace import decorators
+from systrace import output_generator
+from systrace import trace_result
+from systrace import update_systrace_trace_viewer
+from systrace import util
+from tracing.trace_data import trace_data as trace_data_module
+
+
+TEST_DIR = os.path.join(os.path.dirname(__file__), 'test_data')
+ATRACE_DATA = os.path.join(TEST_DIR, 'atrace_data')
+BATTOR_DATA = os.path.join(TEST_DIR, 'battor_test_data.txt')
+COMBINED_PROFILE_CHROME_DATA = os.path.join(
+ TEST_DIR, 'profile-chrome_systrace_perf_chrome_data')
+
+
+class OutputGeneratorTest(unittest.TestCase):
+
+ @decorators.HostOnlyTest
+ def testJsonTraceMerging(self):
+ update_systrace_trace_viewer.update(force_update=True)
+ self.assertTrue(os.path.exists(
+ update_systrace_trace_viewer.SYSTRACE_TRACE_VIEWER_HTML_FILE))
+ t1 = "{'traceEvents': [{'ts': 123, 'ph': 'b'}]}"
+ t2 = "{'traceEvents': [], 'stackFrames': ['blah']}"
+ results = [trace_result.TraceResult('a', t1),
+ trace_result.TraceResult('b', t2)]
+
+ merged_results = output_generator.MergeTraceResultsIfNeeded(results)
+ for r in merged_results:
+ if r.source_name == 'a':
+ self.assertEquals(r.raw_data, t1)
+ elif r.source_name == 'b':
+ self.assertEquals(r.raw_data, t2)
+ self.assertEquals(len(merged_results), len(results))
+ os.remove(update_systrace_trace_viewer.SYSTRACE_TRACE_VIEWER_HTML_FILE)
+
+ @decorators.HostOnlyTest
+ def testHtmlOutputGenerationFormatsSingleTrace(self):
+ update_systrace_trace_viewer.update(force_update=True)
+ self.assertTrue(os.path.exists(
+ update_systrace_trace_viewer.SYSTRACE_TRACE_VIEWER_HTML_FILE))
+ with open(ATRACE_DATA) as f:
+ atrace_data = f.read().replace(" ", "").strip()
+ trace_results = [trace_result.TraceResult('systemTraceEvents',
+ atrace_data)]
+ output_file_name = util.generate_random_filename_for_test()
+ final_path = output_generator.GenerateHTMLOutput(trace_results,
+ output_file_name)
+ with open(output_file_name, 'r') as f:
+ output_generator.GenerateHTMLOutput(trace_results, f.name)
+ html_output = f.read()
+ trace_data = (html_output.split(
+ '<script class="trace-data" type="application/text">')[1].split(
+ '</script>'))[0].replace(" ", "").strip()
+ os.remove(final_path)
+
+ # Ensure the trace data written in HTML is located within the
+ # correct place in the HTML document and that the data is not
+ # malformed.
+ self.assertEquals(trace_data, atrace_data)
+ os.remove(update_systrace_trace_viewer.SYSTRACE_TRACE_VIEWER_HTML_FILE)
+
+ @decorators.HostOnlyTest
+ def testHtmlOutputGenerationFormatsMultipleTraces(self):
+ trace_results = []
+ trace_data_builder = trace_data_module.TraceDataBuilder()
+
+ with open(BATTOR_DATA) as fp:
+ battor_data = fp.read()
+ trace_results.append(
+ trace_result.TraceResult('powerTraceAsString', battor_data))
+ trace_data_builder.AddTraceFor(
+ trace_data_module.BATTOR_TRACE_PART, battor_data)
+
+ with open(ATRACE_DATA) as fp:
+ atrace_data = fp.read()
+ trace_results.append(
+ trace_result.TraceResult('systemTraceEvents', atrace_data))
+ trace_data_builder.AddTraceFor(trace_data_module.ATRACE_PART, atrace_data)
+
+
+ with open(COMBINED_PROFILE_CHROME_DATA) as fp:
+ chrome_data = fp.read()
+ trace_results.append(
+ trace_result.TraceResult('traceEvents', json.loads(chrome_data)))
+ trace_data_builder.AddTraceFor(
+ trace_data_module.CHROME_TRACE_PART, json.loads(chrome_data))
+
+ trace_results.append(
+ trace_result.TraceResult('systraceController', str({})))
+ trace_data_builder.AddTraceFor(trace_data_module.TELEMETRY_PART, {})
+
+ try:
+ data_builder_out = util.generate_random_filename_for_test()
+ output_generator_out = util.generate_random_filename_for_test()
+ output_generator.GenerateHTMLOutput(trace_results, output_generator_out)
+ trace_data_builder.AsData().Serialize(data_builder_out, 'Systrace')
+
+ output_generator_md5sum = hashlib.md5(
+ open(output_generator_out, 'rb').read()).hexdigest()
+ data_builder_md5sum = hashlib.md5(
+ open(data_builder_out, 'rb').read()).hexdigest()
+
+ self.assertEqual(output_generator_md5sum, data_builder_md5sum)
+ finally:
+ def del_if_exist(path):
+ try:
+ os.remove(path)
+ except IOError:
+ pass
+ del_if_exist(output_generator_out)
+ del_if_exist(data_builder_out)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/prefix.html b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/prefix.html
new file mode 100644
index 0000000..828eef0
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/prefix.html
@@ -0,0 +1,70 @@
+<!DOCTYPE html>
+<html>
+<head i18n-values="dir:textdirection;">
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta charset="utf-8"/>
+<title>Android System Trace</title>
+<style>
+ html,
+ body {
+ height: 100%;
+ }
+
+ body {
+ -webkit-flex-direction: column;
+ display: -webkit-flex;
+ margin: 0;
+ padding: 0;
+ }
+
+ body > tr-ui-timeline-view {
+ -webkit-flex: 1 1 auto;
+ min-height: 0;
+ }
+ body > tr-ui-timeline-view:focus {
+ outline: none;
+ }
+</style>
+{{SYSTRACE_TRACE_VIEWER_HTML}}
+</head>
+<body>
+ <tr-ui-timeline-view>
+ <track-view-container id='track_view_container'></track-view-container>
+ </tr-ui-timeline-view>
+
+ <script>
+ 'use strict';
+ var timelineViewEl;
+
+ function onLoad() {
+ timelineViewEl = document.querySelector('tr-ui-timeline-view');
+ timelineViewEl.globalMode = true;
+
+ var traceDataEls = document.body.querySelectorAll('.trace-data');
+ var traces = [];
+ for (var i = 0; i < traceDataEls.length; i++) {
+ var traceText = traceDataEls[i].textContent;
+ // Remove the leading newline.
+ traceText = traceText.substring(1);
+ traces.push(traceText);
+ }
+
+ var m = new tr.Model();
+ var i = new tr.importer.Import(m);
+ var p = i.importTracesWithProgressDialog(traces);
+ p.then(
+ function() {
+ timelineViewEl.model = m;
+ timelineViewEl.updateDocumentFavicon();
+ timelineViewEl.globalMode = true;
+ timelineViewEl.viewTitle = 'Android System Trace';
+ },
+ function(err) {
+ var overlay = new tr.ui.b.Overlay();
+ overlay.textContent = tr.b.normalizeException(err).message;
+ overlay.title = 'Import error';
+ overlay.visible = true;
+ });
+ }
+ window.addEventListener('load', onLoad);
+ </script>
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/run_systrace.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/run_systrace.py
new file mode 100644
index 0000000..78673bd
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/run_systrace.py
@@ -0,0 +1,199 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2011 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Android system-wide tracing utility.
+
+This is a tool for capturing a trace that includes data from both userland and
+the kernel. It creates an HTML file for visualizing the trace.
+"""
+
+# Make sure we're using a new enough version of Python.
+# The flags= parameter of re.sub() is new in Python 2.7. And Systrace does not
+# support Python 3 yet.
+
+import sys
+
+version = sys.version_info[:2]
+if version != (2, 7):
+ sys.stderr.write('This script does not support Python %d.%d. '
+ 'Please use Python 2.7.\n' % version)
+ sys.exit(1)
+
+
+import optparse
+import os
+import time
+
+_SYSTRACE_DIR = os.path.abspath(
+ os.path.join(os.path.dirname(__file__), os.path.pardir))
+_CATAPULT_DIR = os.path.join(
+ os.path.dirname(os.path.abspath(__file__)), os.path.pardir, os.path.pardir)
+_DEVIL_DIR = os.path.join(_CATAPULT_DIR, 'devil')
+if _DEVIL_DIR not in sys.path:
+ sys.path.insert(0, _DEVIL_DIR)
+if _SYSTRACE_DIR not in sys.path:
+ sys.path.insert(0, _SYSTRACE_DIR)
+
+from devil import devil_env
+from devil.android.sdk import adb_wrapper
+from systrace import systrace_runner
+from systrace import util
+from systrace.tracing_agents import atrace_agent
+from systrace.tracing_agents import atrace_from_file_agent
+from systrace.tracing_agents import battor_trace_agent
+from systrace.tracing_agents import ftrace_agent
+from systrace.tracing_agents import walt_agent
+
+
+ALL_MODULES = [atrace_agent, atrace_from_file_agent,
+ battor_trace_agent, ftrace_agent, walt_agent]
+
+
+def parse_options(argv):
+ """Parses and checks the command-line options.
+
+ Returns:
+ A tuple containing the options structure and a list of categories to
+ be traced.
+ """
+ usage = 'Usage: %prog [options] [category1 [category2 ...]]'
+ desc = 'Example: %prog -b 32768 -t 15 gfx input view sched freq'
+ parser = optparse.OptionParser(usage=usage, description=desc,
+ conflict_handler='resolve')
+ parser = util.get_main_options(parser)
+
+ parser.add_option('-l', '--list-categories', dest='list_categories',
+ default=False, action='store_true',
+ help='list the available categories and exit')
+
+ # Add the other agent parsing options to the parser. For Systrace on the
+ # command line, all agents are added. For Android, only the compatible agents
+ # will be added.
+ for module in ALL_MODULES:
+ option_group = module.add_options(parser)
+ if option_group:
+ parser.add_option_group(option_group)
+
+ options, categories = parser.parse_args(argv[1:])
+
+ if options.output_file is None:
+ options.output_file = 'trace.json' if options.write_json else 'trace.html'
+
+ if options.link_assets or options.asset_dir != 'trace-viewer':
+ parser.error('--link-assets and --asset-dir are deprecated.')
+
+ if options.trace_time and options.trace_time < 0:
+ parser.error('the trace time must be a non-negative number')
+
+ if (options.trace_buf_size is not None) and (options.trace_buf_size <= 0):
+ parser.error('the trace buffer size must be a positive number')
+
+ return (options, categories)
+
+def find_adb():
+ """Finds adb on the path.
+
+ This method is provided to avoid the issue of diskutils.spawn's
+ find_executable which first searches the current directory before
+ searching $PATH. That behavior results in issues where systrace.py
+ uses a different adb than the one in the path.
+ """
+ paths = os.environ['PATH'].split(os.pathsep)
+ executable = 'adb'
+ if sys.platform == 'win32':
+ executable = executable + '.exe'
+ for p in paths:
+ f = os.path.join(p, executable)
+ if os.path.isfile(f):
+ return f
+ return None
+
+def initialize_devil():
+ """Initialize devil to use adb from $PATH"""
+ adb_path = find_adb()
+ if adb_path is None:
+ print >> sys.stderr, "Unable to find adb, is it in your path?"
+ sys.exit(1)
+ devil_dynamic_config = {
+ 'config_type': 'BaseConfig',
+ 'dependencies': {
+ 'adb': {
+ 'file_info': {
+ devil_env.GetPlatform(): {
+ 'local_paths': [os.path.abspath(adb_path)]
+ }
+ }
+ }
+ }
+ }
+ devil_env.config.Initialize(configs=[devil_dynamic_config])
+
+
+def main_impl(arguments):
+ # Parse the command line options.
+ options, categories = parse_options(arguments)
+
+ # Override --atrace-categories and --ftrace-categories flags if command-line
+ # categories are provided.
+ if categories:
+ if options.target == 'android':
+ options.atrace_categories = categories
+ elif options.target == 'linux':
+ options.ftrace_categories = categories
+ else:
+ raise RuntimeError('Categories are only valid for atrace/ftrace. Target '
+ 'platform must be either Android or Linux.')
+
+ # Include atrace categories by default in Systrace.
+ if options.target == 'android' and not options.atrace_categories:
+ options.atrace_categories = atrace_agent.DEFAULT_CATEGORIES
+
+ if options.target == 'android' and not options.from_file:
+ initialize_devil()
+ if not options.device_serial_number:
+ devices = [a.GetDeviceSerial() for a in adb_wrapper.AdbWrapper.Devices()]
+ if len(devices) == 0:
+ raise RuntimeError('No ADB devices connected.')
+ elif len(devices) >= 2:
+ raise RuntimeError('Multiple devices connected, serial number required')
+ options.device_serial_number = devices[0]
+
+ # If list_categories is selected, just print the list of categories.
+ # In this case, use of the tracing controller is not necessary.
+ if options.list_categories:
+ if options.target == 'android':
+ atrace_agent.list_categories(options)
+ elif options.target == 'linux':
+ ftrace_agent.list_categories(options)
+ return
+
+ # Set up the systrace runner and start tracing.
+ controller = systrace_runner.SystraceRunner(
+ os.path.dirname(os.path.abspath(__file__)), options)
+ controller.StartTracing()
+
+ # Wait for the given number of seconds or until the user presses enter.
+ # pylint: disable=superfluous-parens
+ # (need the parens so no syntax error if trying to load with Python 3)
+ if options.from_file is not None:
+ print('Reading results from file.')
+ elif options.trace_time:
+ print('Starting tracing (%d seconds)' % options.trace_time)
+ time.sleep(options.trace_time)
+ else:
+ raw_input('Starting tracing (stop with enter)')
+
+ # Stop tracing and collect the output.
+ print('Tracing completed. Collecting output...')
+ controller.StopTracing()
+ print('Outputting Systrace results...')
+ controller.OutputSystraceResults(write_json=options.write_json)
+
+def main():
+ main_impl(sys.argv)
+
+if __name__ == '__main__' and __package__ is None:
+ main()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/suffix.html b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/suffix.html
new file mode 100644
index 0000000..308b1d0
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/suffix.html
@@ -0,0 +1,2 @@
+</body>
+</html>
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/systrace_runner.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/systrace_runner.py
new file mode 100644
index 0000000..d8b9883
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/systrace_runner.py
@@ -0,0 +1,70 @@
+#!/usr/bin/env python
+
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+'''Implementation of tracing controller for systrace. This class creates the
+necessary tracing agents for systrace, runs them, and outputs the results
+as an HTML or JSON file.'''
+
+from systrace import output_generator
+from systrace import tracing_controller
+from systrace.tracing_agents import android_process_data_agent
+from systrace.tracing_agents import atrace_agent
+from systrace.tracing_agents import atrace_from_file_agent
+from systrace.tracing_agents import battor_trace_agent
+from systrace.tracing_agents import ftrace_agent
+from systrace.tracing_agents import walt_agent
+
+AGENT_MODULES = [android_process_data_agent, atrace_agent,
+ atrace_from_file_agent, battor_trace_agent,
+ ftrace_agent, walt_agent]
+
+class SystraceRunner(object):
+ def __init__(self, script_dir, options):
+ """Constructor.
+
+ Args:
+ script_dir: Directory containing the trace viewer script
+ (systrace_trace_viewer.html)
+ options: Object containing command line options.
+ """
+ # Parse command line arguments and create agents.
+ self._script_dir = script_dir
+ self._out_filename = options.output_file
+ agents_with_config = tracing_controller.CreateAgentsWithConfig(
+ options, AGENT_MODULES)
+ controller_config = tracing_controller.GetControllerConfig(options)
+
+ # Set up tracing controller.
+ self._tracing_controller = tracing_controller.TracingController(
+ agents_with_config, controller_config)
+
+ def StartTracing(self):
+ self._tracing_controller.StartTracing()
+
+ def StopTracing(self):
+ self._tracing_controller.StopTracing()
+
+ def OutputSystraceResults(self, write_json=False):
+ """Output the results of systrace to a file.
+
+ If output is necessary, then write the results of systrace to either (a)
+ a standalone HTML file, or (b) a json file which can be read by the
+ trace viewer.
+
+ Args:
+ write_json: Whether to output to a json file (if false, use HTML file)
+ """
+ print 'Tracing complete, writing results'
+ if write_json:
+ result = output_generator.GenerateJSONOutput(
+ self._tracing_controller.all_results,
+ self._out_filename)
+ else:
+ result = output_generator.GenerateHTMLOutput(
+ self._tracing_controller.all_results,
+ self._out_filename)
+ print '\nWrote trace %s file: file://%s\n' % (('JSON' if write_json
+ else 'HTML'), result)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/systrace_trace_viewer.html b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/systrace_trace_viewer.html
new file mode 100644
index 0000000..2b042be
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/systrace_trace_viewer.html
@@ -0,0 +1,9630 @@
+<template id="overlay-template">
+ <style>
+ overlay-mask {
+ left: 0;
+ padding: 8px;
+ position: absolute;
+ top: 0;
+ z-index: 1000;
+ font-family: sans-serif;
+ -webkit-justify-content: center;
+ background: rgba(0, 0, 0, 0.8);
+ display: -webkit-flex;
+ height: 100%;
+ left: 0;
+ position: fixed;
+ top: 0;
+ width: 100%;
+ }
+ overlay-mask:focus {
+ outline: none;
+ }
+ overlay-vertical-centering-container {
+ -webkit-justify-content: center;
+ -webkit-flex-direction: column;
+ display: -webkit-flex;
+ }
+ overlay-frame {
+ z-index: 1100;
+ background: rgb(255, 255, 255);
+ border: 1px solid #ccc;
+ margin: 75px;
+ display: -webkit-flex;
+ -webkit-flex-direction: column;
+ min-height: 0;
+ }
+ title-bar {
+ -webkit-align-items: center;
+ -webkit-flex-direction: row;
+ border-bottom: 1px solid #ccc;
+ background-color: #ddd;
+ display: -webkit-flex;
+ padding: 5px;
+ -webkit-flex: 0 0 auto;
+ }
+ title {
+ display: inline;
+ font-weight: bold;
+ -webkit-box-flex: 1;
+ -webkit-flex: 1 1 auto;
+ }
+ close-button {
+ -webkit-align-self: flex-end;
+ border: 1px solid #eee;
+ background-color: #999;
+ font-size: 10pt;
+ font-weight: bold;
+ padding: 2px;
+ text-align: center;
+ width: 16px;
+ }
+ close-button:hover {
+ background-color: #ddd;
+ border-color: black;
+ cursor: pointer;
+ }
+ overlay-content {
+ display: -webkit-flex;
+ -webkit-flex: 1 1 auto;
+ -webkit-flex-direction: column;
+ overflow-y: auto;
+ padding: 10px;
+ min-width: 300px;
+ min-height: 0;
+ }
+ button-bar {
+ -webkit-align-items: baseline;
+ border-top: 1px solid #ccc;
+ display: -webkit-flex;
+ -webkit-flex: 0 0 auto;
+ -webkit-flex-direction: row-reverse;
+ padding: 4px;
+ }
+ </style>
+
+ <overlay-mask>
+ <overlay-vertical-centering-container>
+ <overlay-frame>
+ <title-bar>
+ <title></title>
+ <close-button>✕</close-button>
+ </title-bar>
+ <overlay-content>
+ <content></content>
+ </overlay-content>
+ <button-bar></button-bar>
+ </overlay-frame>
+ </overlay-vertical-centering-container>
+ </overlay-mask>
+</template><style>
+* /deep/ .labeled-checkbox {
+ display: flex;
+ white-space: nowrap;
+}
+</style><dom-module id="tr-ui-a-analysis-link">
+ <template>
+ <style>
+ :host {
+ display: inline;
+ cursor: pointer;
+ cursor: pointer;
+ white-space: nowrap;
+ }
+ a {
+ text-decoration: underline;
+ }
+ </style>
+ <a href="{{href}}" on-click="onClicked_" on-mouseenter="onMouseEnter_" on-mouseleave="onMouseLeave_"><content></content></a>
+
+ </template>
+</dom-module><dom-module id="tr-ui-b-table">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ flex-direction: column;
+ }
+
+ table {
+ flex: 1 1 auto;
+ align-self: stretch;
+ border-collapse: separate;
+ border-spacing: 0;
+ border-width: 0;
+ -webkit-user-select: initial;
+ }
+
+ tr > td {
+ padding: 2px 4px 2px 4px;
+ vertical-align: top;
+ }
+
+ table > tbody:focus {
+ outline: none;
+ }
+ table > tbody:focus[selection-mode="row"] > tr[selected],
+ table > tbody:focus[selection-mode="cell"] > tr > td[selected],
+ table > tbody:focus > tr.empty-row > td {
+ outline: 1px dotted #666666;
+ outline-offset: -1px;
+ }
+
+ button.toggle-button {
+ height: 15px;
+ line-height: 60%;
+ vertical-align: middle;
+ width: 100%;
+ }
+
+ button > * {
+ height: 15px;
+ vertical-align: middle;
+ }
+
+ td.button-column {
+ width: 30px;
+ }
+
+ table > thead > tr > td.sensitive:hover {
+ background-color: #fcfcfc;
+ }
+
+ table > thead > tr > td {
+ font-weight: bold;
+ text-align: left;
+
+ background-color: #eee;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+
+ border-top: 1px solid #ffffff;
+ border-bottom: 1px solid #aaa;
+ }
+
+ table > tfoot {
+ background-color: #eee;
+ font-weight: bold;
+ }
+
+ /* Light row and cell highlight. */
+ table > tbody[row-highlight-style="light"] > tr[selected],
+ table > tbody[cell-highlight-style="light"] > tr > td[selected] {
+ background-color: rgb(213, 236, 229); /* light turquoise */
+ }
+ table > tbody[row-highlight-style="light"] >
+ tr:not(.empty-row):not([selected]):hover,
+ table > tbody[cell-highlight-style="light"] >
+ tr:not(.empty-row):not([selected]) > td:hover {
+ background-color: #f6f6f6; /* light grey */
+ }
+
+ /* Dark row and cell highlight. */
+ table > tbody[row-highlight-style="dark"] > tr[selected],
+ table > tbody[cell-highlight-style="dark"] > tr > td[selected] {
+ background-color: rgb(103, 199, 165); /* turquoise */
+ }
+ table > tbody[row-highlight-style="dark"] >
+ tr:not(.empty-row):not([selected]):hover,
+ table > tbody[cell-highlight-style="dark"] >
+ tr:not(.empty-row):not([selected]) > td:hover {
+ background-color: #e6e6e6; /* grey */
+ }
+ table > tbody[row-highlight-style="dark"] > tr:hover[selected],
+ table > tbody[cell-highlight-style="dark"] > tr[selected] > td:hover {
+ background-color: rgb(171, 217, 202); /* semi-light turquoise */
+ }
+
+ table > colgroup > col[selected] {
+ background-color: #e6e6e6; /* grey */
+ }
+
+ table > tbody > tr.empty-row > td {
+ color: #666;
+ font-style: italic;
+ text-align: center;
+ }
+
+ table > tbody.has-footer > tr:last-child > td {
+ border-bottom: 1px solid #aaa;
+ }
+
+ table > tfoot > tr:first-child > td {
+ border-top: 1px solid #ffffff;
+ }
+
+ :host([zebra]) table tbody tr:nth-child(even) {
+ background-color: #f4f4f4;
+ }
+
+ expand-button {
+ -webkit-user-select: none;
+ cursor: pointer;
+ margin-right: 3px;
+ font-size: smaller;
+ height: 1rem;
+ }
+
+ expand-button.button-expanded {
+ transform: rotate(90deg);
+ }
+ </style>
+ <table>
+ <colgroup id="cols">
+ </colgroup>
+ <thead id="head">
+ </thead>
+ <tbody id="body">
+ </tbody>
+ <tfoot id="foot">
+ </tfoot>
+ </table>
+ </template>
+</dom-module><dom-module id="tr-ui-b-table-header-cell">
+ <template>
+ <style>
+ :host {
+ -webkit-user-select: none;
+ display: flex;
+ }
+
+ span {
+ flex: 0 1 auto;
+ }
+
+ #side {
+ -webkit-user-select: none;
+ flex: 0 0 auto;
+ padding-left: 2px;
+ padding-right: 2px;
+ vertical-align: top;
+ font-size: 15px;
+ font-family: sans-serif;
+ line-height: 85%;
+ margin-left: 5px;
+ }
+
+ #side.disabled {
+ color: rgb(140, 140, 140);
+ }
+
+ #title:empty, #side:empty {
+ display: none;
+ }
+ </style>
+
+ <span id="title"></span>
+ <span id="side"></span>
+ </template>
+</dom-module><dom-module id="tr-v-ui-scalar-context-controller">
+ <template></template>
+</dom-module><dom-module id="tr-v-ui-scalar-span">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-end;
+ position: relative;
+ /* Limit the sparkline's negative z-index to the span only. */
+ isolation: isolate;
+ }
+
+ :host(.left-align) {
+ justify-content: flex-start;
+ }
+
+ :host(.inline) {
+ display: inline-flex;
+ }
+
+ #sparkline {
+ width: 0%;
+ position: absolute;
+ bottom: 0;
+ display: none;
+ height: 100%;
+ background-color: hsla(216, 100%, 94.5%, .75);
+ border-color: hsl(216, 100%, 89%);
+ box-sizing: border-box;
+ z-index: -1;
+ }
+ #sparkline.positive {
+ border-right-style: solid;
+ /* The border width must be kept in sync with buildSparklineStyle_(). */
+ border-right-width: 1px;
+ }
+ #sparkline:not(.positive) {
+ border-left-style: solid;
+ /* The border width must be kept in sync with buildSparklineStyle_(). */
+ border-left-width: 1px;
+ }
+ #sparkline.better {
+ background-color: hsla(115, 100%, 93%, .75);
+ border-color: hsl(118, 60%, 80%);
+ }
+ #sparkline.worse {
+ background-color: hsla(0, 100%, 88%, .75);
+ border-color: hsl(0, 100%, 80%);
+ }
+
+ #content, #significance, #warning {
+ flex-grow: 0;
+ }
+ #content.better {
+ color: green;
+ }
+ #content.worse {
+ color: red;
+ }
+
+ #significance svg {
+ margin-left: 4px;
+ display: none;
+ height: 1em;
+ vertical-align: text-top;
+ stroke-width: 4;
+ fill: rgba(0, 0, 0, 0);
+ }
+ #significance #insignificant {
+ stroke: black;
+ }
+ #significance #significantly_better {
+ stroke: green;
+ }
+ #significance #significantly_worse {
+ stroke: red;
+ }
+
+ #warning {
+ display: none;
+ margin-left: 4px;
+ height: 1em;
+ vertical-align: text-top;
+ stroke-width: 0;
+ }
+ #warning path {
+ fill: rgb(255, 185, 185);
+ }
+ #warning rect {
+ fill: red;
+ }
+ </style>
+
+ <span id="sparkline"></span>
+
+ <span id="content"></span>
+
+ <span id="significance">
+
+ <svg id="insignificant" viewBox="0 0 128 128">
+ <circle cx="64" cy="64" r="60"></circle>
+ <circle cx="44" cy="44" r="4"></circle>
+ <circle cx="84" cy="44" r="4"></circle>
+ <line x1="36" x2="92" y1="80" y2="80"></line>
+ </svg>
+
+
+ <svg id="significantly_better" viewBox="0 0 128 128">
+ <circle cx="64" cy="64" r="60"></circle>
+ <circle cx="44" cy="44" r="4"></circle>
+ <circle cx="84" cy="44" r="4"></circle>
+ <path d="M 28 64 Q 64 128 100 64"></path>
+ </svg>
+
+
+ <svg id="significantly_worse" viewBox="0 0 128 128">
+ <circle cx="64" cy="64" r="60"></circle>
+ <circle cx="44" cy="44" r="4"></circle>
+ <circle cx="84" cy="44" r="4"></circle>
+ <path d="M 36 96 Q 64 48 92 96"></path>
+ </svg>
+ </span>
+
+ <svg id="warning" viewBox="0 0 128 128">
+ <path d="M 64 0 L 128 128 L 0 128 L 64 0"></path>
+ <rect height="84" width="8" x="60" y="0"></rect>
+ <rect height="24" width="8" x="60" y="100"></rect>
+ </svg>
+ </template>
+</dom-module><dom-module id="tr-ui-a-generic-object-view">
+ <template>
+ <style>
+ :host {
+ display: block;
+ font-family: monospace;
+ }
+ </style>
+ <div id="content">
+ </div>
+ </template>
+</dom-module><dom-module id="tr-ui-a-generic-object-view-with-label">
+ <template>
+ <style>
+ :host {
+ display: block;
+ }
+ </style>
+ </template>
+</dom-module><dom-module id="tr-ui-b-drag-handle">
+ <template>
+ <style>
+ :host {
+ -webkit-user-select: none;
+ box-sizing: border-box;
+ display: block;
+ }
+
+ :host(.horizontal-drag-handle) {
+ background-image: -webkit-gradient(linear,
+ 0 0, 0 100%,
+ from(#E5E5E5),
+ to(#D1D1D1));
+ border-bottom: 1px solid #8e8e8e;
+ border-top: 1px solid white;
+ cursor: ns-resize;
+ flex: 0 0 auto;
+ height: 7px;
+ position: relative;
+ }
+
+ :host(.vertical-drag-handle) {
+ background-image: -webkit-gradient(linear,
+ 0 0, 100% 0,
+ from(#E5E5E5),
+ to(#D1D1D1));
+ border-left: 1px solid white;
+ border-right: 1px solid #8e8e8e;
+ cursor: ew-resize;
+ flex: 0 0 auto;
+ position: relative;
+ width: 7px;
+ }
+ </style>
+ <div></div>
+ </template>
+</dom-module><dom-module id="tv-ui-b-hotkey-controller">
+ <template>
+ <div></div>
+ </template>
+</dom-module><dom-module id="tr-ui-b-info-bar">
+ <template>
+ <style>
+ :host {
+ align-items: center;
+ flex: 0 0 auto;
+ background-color: rgb(252, 235, 162);
+ border-bottom: 1px solid #A3A3A3;
+ border-left: 1px solid white;
+ border-right: 1px solid #A3A3A3;
+ border-top: 1px solid white;
+ display: flex;
+ height: 26px;
+ padding: 0 3px 0 3px;
+ }
+
+ :host([hidden]) {
+ display: none !important;
+ }
+
+ #message { flex: 1 1 auto; }
+ </style>
+
+ <span id="message"></span>
+ <span id="buttons"></span>
+ </template>
+</dom-module><style>
+* /deep/ .x-list-view{-webkit-user-select:none;display:block}* /deep/ .x-list-view:focus{outline:none}* /deep/ .x-list-view *{-webkit-user-select:none}* /deep/ .x-list-view>.list-item{padding:2px 4px 2px 4px}* /deep/ .x-list-view:focus>.list-item[selected]{background-color:rgb(171,217,202);outline:1px dotted rgba(0,0,0,0.1);outline-offset:0}* /deep/ .x-list-view>.list-item[selected]{background-color:rgb(103,199,165)}
+</style><dom-module id="tr-ui-b-mouse-mode-icon">
+ <template>
+ <style>
+ :host {
+ display: block;
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAChCAYAAACbBNzvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABV0RVh0Q3JlYXRpb24gVGltZQA3LzE2LzEzRNEKUwAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAA9aSURBVHic7V1rTFvl//+UrgUmZWMpbLa6cLErwpYxkqLGkjAG88WSbmumGUllvlmAJctMRtybvlHrLXiJUekMIZuYSCL5gS+EuLIXGEGjqCsllCEW6xQECgzWG7S05/+C/zkp9LTn0gsL6ych9JzznOdzPj19Luf5PN/nCN59913ixRdfRFdXFxLx/2GDgCAIYmpqCoWFhUjE/4cNae+99x4AIFH/Hzak7nDqDu+wOyyw2WzEdl9EMpG23ReQbKQE73Q8coJ3bfcFWK1W/Pbbb/D7/UhLi/37DwaDEIvFKC8vR0lJSdjxbRVstVoxPDyMxx9/HAUFBcjMzIRAIOCdXzAYhNvtht1ux/DwMACEid5WwSMjI3jyySdRXFwMsVgMoVAYk2CCIJCZmYns7GyMjo5iZGQkPoKXl5exd+9e3hdGIhgMIj8/H5mZmRCJRIyCyQ5NJBAEgUAgAKFQiIKCAiwsLISl4VxoHA4H+vv74Xa7uZ4aBqFQiOzsbIhEIojFYojFYohEItq/8fFxXLlyBUtLSxHThOaxZ88eCIXC2AWPj48DAH799deYBaelpUEoFLL6++qrrwAAH3zwAav0YrGYthLkJHh6ehpzc3MAgPn5eUxPT8csWiAQMJbboaEhmM1mAIDFYsHQ0BDvPDkJtlgsYdt+v59LFrxw/fr1sG2Xy8UrL06C6+vrw7bFYjEvYi747rvvwrYlEgmvvDjV0g6HI+p2ohBP3qh32OFwoLe3l1VGvb29sNvtvC8kFCMjI9DpdKzS6nQ6mEwm1nnTPg/7/X6MjY1hcnKS/VX+P/bu3YuysjLk5uYypv36669x8uRJZGRkQCQSwev1oqOjAz09PZx5CwsLcenSJRw+fBh+vx+rq6swmUx46aWXNqWjvcMDAwO8xAIbnZKBgQFeNXhzczMvscBGp6S5uRk//vhj1HS0grVaLYqLi3kRy+Vy1NXVRe0RRcKNGzeg0Wh48apUKnR1daG6ujpqOtpKy+VyQa1Wo6SkBLdv38aFCxeoY5988gn1+fLly9TnL774ApWVlXjiiSfgdDqxtrbG+aJ9Ph/0ej3OnDkDvV6PW7duUceOHDlCfR4dHaU+v/DCC7h27RrUajWcTidWV1ejctAKJggCKysryMzMhE6nw+zsLO3Joft1Oh0ePHiApaUlduqi8BYVFaGvr48Vb19fHyfeqM2Sz+dj3QTEs4lKJC+njsfWJoptkxUrtjZRbJssOnASXFtbG3U7UXjrrbeibnMBJ8FZWVkoKysDABQUFCArK4s3MRcoFArqrlZXV0OhUPDOi5Ngn8+Hw4cPQyqV4tlnn4XP5+NNTIIgmH0An8+HV155BUqlEq+++ior3kAgQLuf84jH2toajh8/jvX1da6n0sLj8SAjI4MxHUEQ+PTTT1nlSRAEHjx4QHtsW8e0RCIR7HY79uzZE/GOcEUgEEAgEMDff/8NkUgUdnxbBR85cgRmsxkCgQD5+fkRh2XYIhAI4P79+5iamoLD4cCxY8fC0myr4KeeegoCgQBWqxVzc3NIS0uLedQyGAxi165dKC8vR1FRUVialHu405ESvNPxyAlOuYfJRMo9fFjdw3iBq3vIBDbu4bYK3uoextKtJEH2yWNyD8nyEG8wuYcffvgha3cxru6h3W5Hf39/QoyzaE6fyWRCQ0MDZ+MsLu7h8vIyent7sby8zIk8VkxNTUGn08Fms8UlP04Nn9/vR39/f9w8JLZwu91obGzk5CFFAq+Wfnh4mDKok4mWlha0trbGlAfvrs3k5CQGBgaSYoiHoqenB1evXk2OIb4VDocDJpMp6eXaYrGgsbGRV7mOufPq8XgwMDCQ9HI9NzeHq1evci7XvDseUqkUWq0W6enpCAaDcDqd8Hq9fLNjDaVSiRs3bkAikfDi5XSHxWIxampqAAALCwsYGhrC7Ows5ufnEypWIpHAYDAAACYmJnD9+nXevJwEnzp1CjKZDBUVFQCAsbGxpJTfjz76CFVVVWhqagIAdHR08G6XWQuuqanB7t274fV6UVpaiuzsbAAbTzyJhMFggEKhgNfrRX19PWQyGQDAaDTyyo+V4JqaGshkMsricLlcOH78OICNCWp8p0cwwWAwoKqqahPvG2+8AWDji+7u7uacJyvBMpksrKxkZWVR0yLGxsY4E7NBVVVVGK9CoaCmRXR0dHDOk5VguorB5/OhoqICYrE4YZ2PSLxXrlyBRCLhNcE1pufh1dVVXLx4EWlpaRGnJzCBjXtId87g4GBU3ri5h1uJ5+fnY8mCtXvIhTflHoYg5R4mEyn3MAl45KyWlOCdjkdOcMo9TCZS7mHKPeSGhLmH5LBOrAGXXN1DcliHrgdFgsk95CzYbrfDbDbD7/ejrKwstpmtNO5hJJhMJrS2tsLtdqOpqQlarTZi2mjuIWvBfr8fZrN50/iz2WzG9PQ0nn/+edonEzZgij10uVwwGo2bxp+NRiOGhobw+uuv005hjtk9JENz6AbbyWCuRESp2Ww2NDc30w62WywW6HQ6zoOIrO5wbm4uzp8/j5WVFXR2dm46VldXh3379mF5eTku86dDUVxcjK6uLthstrClqrq6unDo0CHOvKwE+/1+LC4uUqG0oZiYmIhaicQCkvfu3bthxwYGBnhVmpy6NnSD7kxxQvEA3Zo+fIsQJ8F040j379/nRcwFdF4037FwToLphkUXFxd5EXMB3chkUgQ7nc6wfT6fL+Gm+H///Re2z+Vy8TLFGSut/v5+RsPsm2++AbDR84pXLFNDQwPjelxnz54FsBFK+/nnn7PKl/EOa7VaVmHvYrE4au+HK27evMkq7F0ikeDmzZus82UU7HK5qG8yGs6ePct73gUdfD4f2tvbGdO1t7dzaocZBRMEAaFQSBnhdKipqYFQKORlm0TjzcvLo4xwOhgMBuTl5XHiZVVp+f1+yGQy2iDq4uJiyGSyhFRcfr8fVVVVtEHUGo0GVVVVnHlZ19JerxdqtRpSqZTaJ5VKoVarEzrdwev1Qq/XQ6lUUvuUSiX0ej0vXk7N0srKCjQaDbXmjUajwcrKCmfSULD5Oa6srKCtrQ0SiQQSiQRtbW2MvHFzD0MrsXhUUmzdw9BKjKmSiqt7SBBE3Conru4hOa8kWqBnyj3cgl0EQcQ0cMYWW3kIgkiKe7iVV2C1Won09PSYxLCB1+tFZmYmtb22tobt4E1LBimATaQAkiKWjveR85ZSgnc6Uu5hMpFyD1PuITekYg/ZxB52dXXFTMo2n1D38NSpU7zjDEP/yHzisnJpIsBm5dJ45rntgpONuITTJirctqWlJabjdGAUvNUEp0NouxcvtLa2MgZhmUwmzqKjCrbb7aw9HC5pmWAymVivb2kymTgFe0RslrbeNTa1rtlshkgkQn5+PusL2Iqtd42NdWM0GpGVlYWTJ08ypo14h/nGI8Uax8Q3XJbteREFV1ZW8iLmex6Ja9euJfS8iD9puVyOmpoa3L59G8DmVUq3glzNlAzoimVgvrq6GmlpadDr9QA2r1K6FeRqpmRAFxveiIK9Xi8VZ/jLL78whulUVFTELJbkJeMMjUYjI29TUxNrsQBDX5qMM4w0qE2iuLgYpaWlcXMPyThDphWMNRoN6uvrOfGyskvVanXUNGq1Oq5WKclL/qwjQa/Xc+Zl1dNi8nFi9ZeSyZvqS0erjbmAbT6kT7X1lQp8QeYTyasKE8w3aJJvPh6PBwRBYGZmJi68MzMzqdjDUDx67mEsFxwrUrGHSUCqWdrpSAne6dix7uFzzz1HW0s/FO7h/v37UVBQgMceeyxm99DlcsFut2NwcBACgSDsnTHb7h4ePHgQxcXFcTPTMjIyIJFIcOfOHfz+++8Pl2DSPSTftxQv93DXrl0oKirCnTt3wtIwFhq62aputxtms5maCR8pHROEQiEkEgntew/X1tbC3mu4tLSE9vZ2nD9/njZd6Pn79u3jHoo3OTmJsbExnDlzBsDGWLXdbqcNoent7YVCocChQ4dYh+VFij3s7u5GR0cH9YWaTCbcunVr0yMkmfbChQvQarXQarVUWF4wGER6ejp7wdPT0zCbzfB4PJv2R7NT/H4/rFYrJicnUVZWxnowPtTpGxoagtFoDAsIi2anuN1ufPnll+ju7salS5dw4sQJKk+64hH2FTgcDgwPD4eJZQu/3w+bzcZ5JSSLxYL333+fNvqNDdxuN3p6ehjPDxMsl8tjjkw5ceIENfOVLVQqFd58882YeA0GA7WiWiSECfb5fPjpp58AbKyBx/bCpVIp6urqAADff/895wf6tbU1fPbZZwCAjz/+mPHCSSiVSsr3eueddxh5aWtpMrwuJyeH9cuczp07R5UZvktO/fnnnwCAY8eOoa+vj9U5nZ2d1CsH2fhaUZulwcFB1kGNi4uLjK/gYwuDwcCJ9+2332add9RmyW63w+12Q6FQIC8vD5cvX8bCwgI19VcqlcJms8HhcGBycjJuSz6aTCbMzs5Cq9Xi6NGjGB0dxcTEBJxOJyQSCZRKJUZGRjAyMoL//e9/jBFsoaAVLJfLKZvD4XBQ37ZEItlUph0OB238gVwu5ySQhEqlopo+i8VCtbsymWxTmb579y6t46BSqRg5aAXX1tbi22+/DZvY5XQ6aQMuQyGVSlFbW8trgb6WlhY0NDRgYmJi0/6ZmRnGYVylUomWlhbGeGbaMuzxeKDRaKhVDdkgOzsblZWVOHfuHO82fH19HW1tbWhqamL9ul2ZTIbXXnsNnZ2drN7yFfFFjy6XC6WlpVCpVFhaWsK///5LVfnz8/PIy8sDAOzevRu5ubnIycmBx+OJKZ6YIAj4fD7U19ejsbERf/zxB4aHhykrdHx8HE8//TQAYP/+/VAqlVAoFJx4I1ZapGiyrBw4cAD37t2DXC7HgQMHAGx0QXNycrC+vh63VR5Cecnw3J6eHqhUKpSXlwPY6OI+88wzALiHxnN6PPz555/D9h08eJATIR/Qzd9gE/FKh9SYFlvI5XKqPMUCrlFuKpUKp0+fZkwXDAZp93MSLBaLUVJSgqNHjyIjIwNerzfmOR0ul4sx9lAikeD06dN4+eWXIZVKGXnj5h5evHgRXq8XHo+Hd9MTCpFIhHv37iEnJydqp/+HH36A1+uFy+VirKTi6h7Gug7tVpDuIUEQKCwsjOge/vPPP6zyCwQCWF5exl9//YX5+Xla93DbzTSbzQar1Yr19fW4uoclJSUp9xB4BJullOCdjkdO8P8BGCQ0hnF1DxUAAAAASUVORK5CYII=);
+ width: 27px;
+ height: 30px;
+ }
+ :host.active {
+ cursor: auto;
+ }
+ </style>
+ </template>
+</dom-module><dom-module id="tr-ui-b-mouse-mode-selector">
+ <template>
+ <style>
+ :host {
+
+ -webkit-user-drag: element;
+ -webkit-user-select: none;
+
+ background: #DDD;
+ border: 1px solid #BBB;
+ border-radius: 4px;
+ box-shadow: 0 1px 2px rgba(0,0,0,0.2);
+ left: calc(100% - 120px);
+ position: absolute;
+ top: 100px;
+ user-select: none;
+ width: 29px;
+ z-index: 20;
+ }
+
+ .drag-handle {
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAChCAYAAACbBNzvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABV0RVh0Q3JlYXRpb24gVGltZQA3LzE2LzEzRNEKUwAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAA9aSURBVHic7V1rTFvl//+UrgUmZWMpbLa6cLErwpYxkqLGkjAG88WSbmumGUllvlmAJctMRtybvlHrLXiJUekMIZuYSCL5gS+EuLIXGEGjqCsllCEW6xQECgzWG7S05/+C/zkp9LTn0gsL6ych9JzznOdzPj19Luf5PN/nCN59913ixRdfRFdXFxLx/2GDgCAIYmpqCoWFhUjE/4cNae+99x4AIFH/Hzak7nDqDu+wOyyw2WzEdl9EMpG23ReQbKQE73Q8coJ3bfcFWK1W/Pbbb/D7/UhLi/37DwaDEIvFKC8vR0lJSdjxbRVstVoxPDyMxx9/HAUFBcjMzIRAIOCdXzAYhNvtht1ux/DwMACEid5WwSMjI3jyySdRXFwMsVgMoVAYk2CCIJCZmYns7GyMjo5iZGQkPoKXl5exd+9e3hdGIhgMIj8/H5mZmRCJRIyCyQ5NJBAEgUAgAKFQiIKCAiwsLISl4VxoHA4H+vv74Xa7uZ4aBqFQiOzsbIhEIojFYojFYohEItq/8fFxXLlyBUtLSxHThOaxZ88eCIXC2AWPj48DAH799deYBaelpUEoFLL6++qrrwAAH3zwAav0YrGYthLkJHh6ehpzc3MAgPn5eUxPT8csWiAQMJbboaEhmM1mAIDFYsHQ0BDvPDkJtlgsYdt+v59LFrxw/fr1sG2Xy8UrL06C6+vrw7bFYjEvYi747rvvwrYlEgmvvDjV0g6HI+p2ohBP3qh32OFwoLe3l1VGvb29sNvtvC8kFCMjI9DpdKzS6nQ6mEwm1nnTPg/7/X6MjY1hcnKS/VX+P/bu3YuysjLk5uYypv36669x8uRJZGRkQCQSwev1oqOjAz09PZx5CwsLcenSJRw+fBh+vx+rq6swmUx46aWXNqWjvcMDAwO8xAIbnZKBgQFeNXhzczMvscBGp6S5uRk//vhj1HS0grVaLYqLi3kRy+Vy1NXVRe0RRcKNGzeg0Wh48apUKnR1daG6ujpqOtpKy+VyQa1Wo6SkBLdv38aFCxeoY5988gn1+fLly9TnL774ApWVlXjiiSfgdDqxtrbG+aJ9Ph/0ej3OnDkDvV6PW7duUceOHDlCfR4dHaU+v/DCC7h27RrUajWcTidWV1ejctAKJggCKysryMzMhE6nw+zsLO3Joft1Oh0ePHiApaUlduqi8BYVFaGvr48Vb19fHyfeqM2Sz+dj3QTEs4lKJC+njsfWJoptkxUrtjZRbJssOnASXFtbG3U7UXjrrbeibnMBJ8FZWVkoKysDABQUFCArK4s3MRcoFArqrlZXV0OhUPDOi5Ngn8+Hw4cPQyqV4tlnn4XP5+NNTIIgmH0An8+HV155BUqlEq+++ior3kAgQLuf84jH2toajh8/jvX1da6n0sLj8SAjI4MxHUEQ+PTTT1nlSRAEHjx4QHtsW8e0RCIR7HY79uzZE/GOcEUgEEAgEMDff/8NkUgUdnxbBR85cgRmsxkCgQD5+fkRh2XYIhAI4P79+5iamoLD4cCxY8fC0myr4KeeegoCgQBWqxVzc3NIS0uLedQyGAxi165dKC8vR1FRUVialHu405ESvNPxyAlOuYfJRMo9fFjdw3iBq3vIBDbu4bYK3uoextKtJEH2yWNyD8nyEG8wuYcffvgha3cxru6h3W5Hf39/QoyzaE6fyWRCQ0MDZ+MsLu7h8vIyent7sby8zIk8VkxNTUGn08Fms8UlP04Nn9/vR39/f9w8JLZwu91obGzk5CFFAq+Wfnh4mDKok4mWlha0trbGlAfvrs3k5CQGBgaSYoiHoqenB1evXk2OIb4VDocDJpMp6eXaYrGgsbGRV7mOufPq8XgwMDCQ9HI9NzeHq1evci7XvDseUqkUWq0W6enpCAaDcDqd8Hq9fLNjDaVSiRs3bkAikfDi5XSHxWIxampqAAALCwsYGhrC7Ows5ufnEypWIpHAYDAAACYmJnD9+nXevJwEnzp1CjKZDBUVFQCAsbGxpJTfjz76CFVVVWhqagIAdHR08G6XWQuuqanB7t274fV6UVpaiuzsbAAbTzyJhMFggEKhgNfrRX19PWQyGQDAaDTyyo+V4JqaGshkMsricLlcOH78OICNCWp8p0cwwWAwoKqqahPvG2+8AWDji+7u7uacJyvBMpksrKxkZWVR0yLGxsY4E7NBVVVVGK9CoaCmRXR0dHDOk5VguorB5/OhoqICYrE4YZ2PSLxXrlyBRCLhNcE1pufh1dVVXLx4EWlpaRGnJzCBjXtId87g4GBU3ri5h1uJ5+fnY8mCtXvIhTflHoYg5R4mEyn3MAl45KyWlOCdjkdOcMo9TCZS7mHKPeSGhLmH5LBOrAGXXN1DcliHrgdFgsk95CzYbrfDbDbD7/ejrKwstpmtNO5hJJhMJrS2tsLtdqOpqQlarTZi2mjuIWvBfr8fZrN50/iz2WzG9PQ0nn/+edonEzZgij10uVwwGo2bxp+NRiOGhobw+uuv005hjtk9JENz6AbbyWCuRESp2Ww2NDc30w62WywW6HQ6zoOIrO5wbm4uzp8/j5WVFXR2dm46VldXh3379mF5eTku86dDUVxcjK6uLthstrClqrq6unDo0CHOvKwE+/1+LC4uUqG0oZiYmIhaicQCkvfu3bthxwYGBnhVmpy6NnSD7kxxQvEA3Zo+fIsQJ8F040j379/nRcwFdF4037FwToLphkUXFxd5EXMB3chkUgQ7nc6wfT6fL+Gm+H///Re2z+Vy8TLFGSut/v5+RsPsm2++AbDR84pXLFNDQwPjelxnz54FsBFK+/nnn7PKl/EOa7VaVmHvYrE4au+HK27evMkq7F0ikeDmzZus82UU7HK5qG8yGs6ePct73gUdfD4f2tvbGdO1t7dzaocZBRMEAaFQSBnhdKipqYFQKORlm0TjzcvLo4xwOhgMBuTl5XHiZVVp+f1+yGQy2iDq4uJiyGSyhFRcfr8fVVVVtEHUGo0GVVVVnHlZ19JerxdqtRpSqZTaJ5VKoVarEzrdwev1Qq/XQ6lUUvuUSiX0ej0vXk7N0srKCjQaDbXmjUajwcrKCmfSULD5Oa6srKCtrQ0SiQQSiQRtbW2MvHFzD0MrsXhUUmzdw9BKjKmSiqt7SBBE3Conru4hOa8kWqBnyj3cgl0EQcQ0cMYWW3kIgkiKe7iVV2C1Won09PSYxLCB1+tFZmYmtb22tobt4E1LBimATaQAkiKWjveR85ZSgnc6Uu5hMpFyD1PuITekYg/ZxB52dXXFTMo2n1D38NSpU7zjDEP/yHzisnJpIsBm5dJ45rntgpONuITTJirctqWlJabjdGAUvNUEp0NouxcvtLa2MgZhmUwmzqKjCrbb7aw9HC5pmWAymVivb2kymTgFe0RslrbeNTa1rtlshkgkQn5+PusL2Iqtd42NdWM0GpGVlYWTJ08ypo14h/nGI8Uax8Q3XJbteREFV1ZW8iLmex6Ja9euJfS8iD9puVyOmpoa3L59G8DmVUq3glzNlAzoimVgvrq6GmlpadDr9QA2r1K6FeRqpmRAFxveiIK9Xi8VZ/jLL78whulUVFTELJbkJeMMjUYjI29TUxNrsQBDX5qMM4w0qE2iuLgYpaWlcXMPyThDphWMNRoN6uvrOfGyskvVanXUNGq1Oq5WKclL/qwjQa/Xc+Zl1dNi8nFi9ZeSyZvqS0erjbmAbT6kT7X1lQp8QeYTyasKE8w3aJJvPh6PBwRBYGZmJi68MzMzqdjDUDx67mEsFxwrUrGHSUCqWdrpSAne6dix7uFzzz1HW0s/FO7h/v37UVBQgMceeyxm99DlcsFut2NwcBACgSDsnTHb7h4ePHgQxcXFcTPTMjIyIJFIcOfOHfz+++8Pl2DSPSTftxQv93DXrl0oKirCnTt3wtIwFhq62aputxtms5maCR8pHROEQiEkEgntew/X1tbC3mu4tLSE9vZ2nD9/njZd6Pn79u3jHoo3OTmJsbExnDlzBsDGWLXdbqcNoent7YVCocChQ4dYh+VFij3s7u5GR0cH9YWaTCbcunVr0yMkmfbChQvQarXQarVUWF4wGER6ejp7wdPT0zCbzfB4PJv2R7NT/H4/rFYrJicnUVZWxnowPtTpGxoagtFoDAsIi2anuN1ufPnll+ju7salS5dw4sQJKk+64hH2FTgcDgwPD4eJZQu/3w+bzcZ5JSSLxYL333+fNvqNDdxuN3p6ehjPDxMsl8tjjkw5ceIENfOVLVQqFd58882YeA0GA7WiWiSECfb5fPjpp58AbKyBx/bCpVIp6urqAADff/895wf6tbU1fPbZZwCAjz/+mPHCSSiVSsr3eueddxh5aWtpMrwuJyeH9cuczp07R5UZvktO/fnnnwCAY8eOoa+vj9U5nZ2d1CsH2fhaUZulwcFB1kGNi4uLjK/gYwuDwcCJ9+2332add9RmyW63w+12Q6FQIC8vD5cvX8bCwgI19VcqlcJms8HhcGBycjJuSz6aTCbMzs5Cq9Xi6NGjGB0dxcTEBJxOJyQSCZRKJUZGRjAyMoL//e9/jBFsoaAVLJfLKZvD4XBQ37ZEItlUph0OB238gVwu5ySQhEqlopo+i8VCtbsymWxTmb579y6t46BSqRg5aAXX1tbi22+/DZvY5XQ6aQMuQyGVSlFbW8trgb6WlhY0NDRgYmJi0/6ZmRnGYVylUomWlhbGeGbaMuzxeKDRaKhVDdkgOzsblZWVOHfuHO82fH19HW1tbWhqamL9ul2ZTIbXXnsNnZ2drN7yFfFFjy6XC6WlpVCpVFhaWsK///5LVfnz8/PIy8sDAOzevRu5ubnIycmBx+OJKZ6YIAj4fD7U19ejsbERf/zxB4aHhykrdHx8HE8//TQAYP/+/VAqlVAoFJx4I1ZapGiyrBw4cAD37t2DXC7HgQMHAGx0QXNycrC+vh63VR5Cecnw3J6eHqhUKpSXlwPY6OI+88wzALiHxnN6PPz555/D9h08eJATIR/Qzd9gE/FKh9SYFlvI5XKqPMUCrlFuKpUKp0+fZkwXDAZp93MSLBaLUVJSgqNHjyIjIwNerzfmOR0ul4sx9lAikeD06dN4+eWXIZVKGXnj5h5evHgRXq8XHo+Hd9MTCpFIhHv37iEnJydqp/+HH36A1+uFy+VirKTi6h7Gug7tVpDuIUEQKCwsjOge/vPPP6zyCwQCWF5exl9//YX5+Xla93DbzTSbzQar1Yr19fW4uoclJSUp9xB4BJullOCdjkdO8P8BGCQ0hnF1DxUAAAAASUVORK5CYII=) 2px 3px no-repeat;
+ background-repeat: no-repeat;
+ border-bottom: 1px solid #BCBCBC;
+ cursor: move;
+ display: block;
+ height: 13px;
+ width: 27px;
+ }
+
+ .tool-button {
+ background-position: center center;
+ background-repeat: no-repeat;
+ border-bottom: 1px solid #BCBCBC;
+ border-top: 1px solid #F1F1F1;
+ cursor: pointer;
+ }
+
+ .buttons > .tool-button:last-child {
+ border-bottom: none;
+ }
+
+ </style>
+ <div class="drag-handle"></div>
+ <div class="buttons">
+ </div>
+ </template>
+</dom-module><dom-module id="tr-ui-e-chrome-cc-display-item-list-item">
+ <template>
+ <style>
+ :host {
+ border-bottom: 1px solid #555;
+ display: block;
+ font-size: 12px;
+ padding: 3px 5px;
+ }
+
+ :host(:hover) {
+ background-color: #f0f0f0;
+ cursor: pointer;
+ }
+
+ .header {
+ font-weight: bold;
+ margin: 2px 0;
+ }
+
+ .header > .extra {
+ background-color: #777;
+ border-radius: 4px;
+ color: white;
+ margin: 0 6px;
+ text-decoration: none;
+ padding: 2px 4px;
+ }
+
+ .raw-details {
+ white-space: pre-wrap;
+ }
+
+ .details > dl {
+ margin: 0;
+ }
+
+ :host(:not([selected])) .details {
+ display: none;
+ }
+ </style>
+ <div class="header">
+ {{name}}
+ <template if="{{_computeIf(richDetails)}}" is="dom-if">
+ <a class="extra" download="drawing.skp" href$="{{_computeHref(richDetails)}}" on-click="{{stopPropagation}}">SKP</a>
+ </template>
+ </div>
+ <div class="details">
+ <template if="{{rawDetails}}">
+ <div class="raw-details">{{rawDetails}}</div>
+ </template>
+ <template bind="{{richDetails}}" if="{{richDetails}}" is="dom-if">
+ <dl>
+ <template bind="{{cullRect}}" if="{{cullRect}}" is="dom-if">
+ <dt>Cull rect</dt>
+ <dd>{{x}},{{y}} {{width}}×{{height}}</dd>
+ </template>
+ <template bind="{{visualRect}}" if="{{visualRect}}" is="dom-if">
+ <dt>Visual rect</dt>
+ <dd>{{x}},{{y}} {{width}}×{{height}}</dd>
+ </template>
+ </dl>
+ </template>
+ </div>
+ </template>
+
+</dom-module><style>
+* * /deep/ tr-ui-e-chrome-cc-picture-ops-list-view{-webkit-flex-direction:column;border-top:1px solid grey;display:-webkit-flex}* /deep/ tr-ui-e-chrome-cc-picture-ops-list-view>.x-list-view{-webkit-flex:1 1 auto;overflow:auto}* /deep/ tr-ui-e-chrome-cc-picture-ops-list-view>.x-list-view .list-item{border-bottom:1px solid #555;font-size:small;font-weight:bold;padding-bottom:5px;padding-left:5px}* /deep/ tr-ui-e-chrome-cc-picture-ops-list-view>.x-list-view .list-item:hover{background-color:#f0f0f0;cursor:pointer}* /deep/ tr-ui-e-chrome-cc-picture-ops-list-view>.x-list-view .list-item>*{color:#777;font-size:x-small;font-weight:normal;margin-left:1em;max-width:300px}* /deep/ tr-ui-e-chrome-cc-picture-ops-list-view>.x-list-view .list-item>.elementInfo{color:purple;font-size:small;font-weight:bold}* /deep/ tr-ui-e-chrome-cc-picture-ops-list-view>.x-list-view .list-item>.time{color:rgb(136,0,0)}* /deep/ tr-ui-e-chrome-cc-picture-ops-list-view .x-list-view:focus>.list-item[beforeSelection]{background-color:rgb(171,217,202);outline:1px dotted rgba(0,0,0,0.1);outline-offset:0}* /deep/ tr-ui-e-chrome-cc-picture-ops-list-view .x-list-view>.list-item[beforeSelection]{background-color:rgb(103,199,165)}
+</style><template id="tr-ui-e-chrome-cc-display-item-debugger-template">
+ <style>
+ * /deep/ tr-ui-e-chrome-cc-display-item-debugger {
+ -webkit-flex: 1 1 auto;
+ display: -webkit-flex;
+ }
+
+ * /deep/ tr-ui-e-chrome-cc-display-item-debugger > left-panel {
+ -webkit-flex-direction: column;
+ display: -webkit-flex;
+ min-width: 300px;
+ overflow-y: auto;
+ }
+
+ * /deep/ tr-ui-e-chrome-cc-display-item-debugger > left-panel >
+ display-item-info {
+ -webkit-flex: 1 1 auto;
+ padding-top: 2px;
+ }
+
+ * /deep/ tr-ui-e-chrome-cc-display-item-debugger > left-panel >
+ display-item-info .title {
+ font-weight: bold;
+ margin-left: 5px;
+ margin-right: 5px;
+ }
+
+ * /deep/ tr-ui-e-chrome-cc-display-item-debugger > left-panel >
+ display-item-info .export {
+ margin: 5px;
+ }
+
+ * /deep/ tr-ui-e-chrome-cc-display-item-debugger > tr-ui-b-drag-handle {
+ -webkit-flex: 0 0 auto;
+ }
+
+ * /deep/ tr-ui-e-chrome-cc-display-item-debugger > right-panel {
+ -webkit-flex: 1 1 auto;
+ display: -webkit-flex;
+ }
+
+ * /deep/ tr-ui-e-chrome-cc-display-item-debugger > left-panel >
+ display-item-info > header {
+ border-bottom: 1px solid #555;
+ }
+
+ /*************************************************/
+
+ * /deep/ tr-ui-e-chrome-cc-display-item-debugger > right-panel >
+ tr-ui-e-chrome-cc-picture-ops-list-view.hasPictureOps {
+ display: block;
+ }
+
+ * /deep/ tr-ui-e-chrome-cc-display-item-debugger > right-panel >
+ tr-ui-b-drag-handle.hasPictureOps {
+ display: block;
+ }
+
+ * /deep/ tr-ui-e-chrome-cc-display-item-debugger > right-panel >
+ tr-ui-e-chrome-cc-picture-ops-list-view {
+ display: none;
+ overflow-y: auto;
+ }
+
+ * /deep/ tr-ui-e-chrome-cc-display-item-debugger > right-panel >
+ tr-ui-b-drag-handle {
+ display: none;
+ }
+
+ * /deep/ tr-ui-e-chrome-cc-display-item-debugger raster-area {
+ -webkit-flex: 1 1 auto;
+ background-color: #ddd;
+ min-height: 200px;
+ min-width: 200px;
+ overflow-y: auto;
+ padding-left: 5px;
+ }
+ </style>
+
+ <left-panel>
+ <display-item-info>
+ <header>
+ <span class="title">Display Item List</span>
+ <span class="size"></span>
+ <div class="export">
+ <input class="dlfilename" type="text" value="displayitemlist.json"/>
+ <button class="dlexport">Export display item list</button>
+ </div>
+ <div class="export">
+ <input class="skpfilename" type="text" value="skpicture.skp"/>
+ <button class="skpexport">Export list as SkPicture</button>
+ </div>
+ </header>
+ </display-item-info>
+ </left-panel>
+ <right-panel>
+ <raster-area><canvas></canvas></raster-area>
+ </right-panel>
+</template><style>
+* /deep/ .tr-ui-e-chrome-cc-display-item-list-view{-webkit-flex:1 1 auto!important;display:-webkit-flex}
+</style><style>
+* /deep/ tr-ui-e-chrome-cc-layer-picker{-webkit-flex-direction:column;display:-webkit-flex}* /deep/ tr-ui-e-chrome-cc-layer-picker>top-controls{-webkit-flex:0 0 auto;background-image:-webkit-gradient(linear,0 0,100% 0,from(#E5E5E5),to(#D1D1D1));border-bottom:1px solid #8e8e8e;border-top:1px solid white;display:inline;font-size:14px;padding-left:2px}* /deep/ tr-ui-e-chrome-cc-layer-picker>top-controls input[type='checkbox']{vertical-align:-2px}* /deep/ tr-ui-e-chrome-cc-layer-picker>.x-list-view{-webkit-flex:1 1 auto;font-family:monospace;overflow:auto}* /deep/ tr-ui-e-chrome-cc-layer-picker>tr-ui-a-generic-object-view{-webkit-flex:0 0 auto;height:200px;overflow:auto}* /deep/ tr-ui-e-chrome-cc-layer-picker>tr-ui-a-generic-object-view *{-webkit-user-select:text!important;cursor:text}
+</style><style>
+* /deep/ quad-stack-view {
+ display: block;
+ float: left;
+ height: 100%;
+ overflow: hidden;
+ position: relative; /* For the absolute positioned mouse-mode-selector */
+ width: 100%;
+}
+
+* /deep/ quad-stack-view > #header {
+ position: absolute;
+ font-size: 70%;
+ top: 10px;
+ left: 10px;
+ width: 800px;
+}
+* /deep/ quad-stack-view > #stacking-distance-slider {
+ position: absolute;
+ font-size: 70%;
+ top: 10px;
+ right: 10px;
+}
+
+* /deep/ quad-stack-view > #chrome-left {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMcAAABICAYAAABC4+HLAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAB3RJTUUH3QcNFyMmV/Pm9QAAIABJREFUeNrtvXmwXdd13vlbe9/7BgzEQAIcQAIEQYKjSAokLVlOW5Fk2nLKmqx0J2Wp0k652h13uiy5XYqdwU7sSnckpZ1yV3U75apU4kos27Elu9NlyRXZjiiRomSTIiWZs0hwHsABJIY33rPX6j/W2ueed3DvAyDKKoGFW0UCeO/ec/fZZ+29v7XWt74lAIuLi7tXV1f/raq+zcy2AogIZsbpvrqfMzNE5IS/1/fVn5sZKaUTrtX9/v7nT+fn9e/1e052X/3r1THWa3R/37+miKCq7c+mjW/a+F/P57vj6/45bayn+wzXs4n+794Q9nP8+PHdS0tL31LVmfpGVQU4YSInGUb/YfZvpn+zp/LQu4Y27X31d933nurkq+qaa08yotO55npG0v2O+r1/XZ9fb2FMWoD9Oe5+pju//e+fdP3u83+j2I+89NJLn11dXf1bdSCTJnnSSpz2+/VWZ/8m+w+g/zD616yT2P9733BOZ5f4dhbCevPQHet63zVtV3y9n1/v/k9nZ562SNY7Gd5o9iPPP//8qxVKrQdL+hOy3qqdNEnTjv1JA+vuRpMGvd7kn8oCqded9B2THuJ6u/Kk7+vuiNOgQH8OX+/np813/376O/CkU2EavDwVWPiGsp9nn33WJt3ItF2ne2xOe2jTHuTJMOS0He1UcG33791JmWQYkzB6dyfp7tynsktPG8/Jdv2TGcLpfH7Sc5m0EKZBsPV+tp4PMe39bwj7efrpp229G5u2O3WPplN1cE/XQZsENybtnNN2pv4x3N1Fpu2S/SO6j6fXgz6n4gRPGmMfR7/ez/cXd/1798Tsfr4PMU52Oq4Hp95I9jPor7ZJ+G7STlEnvN7gesfXpB2tH5lZzynrO07Txtb92aQTY9rv+3i1v4jqv5umOSEq0r9O3/iqEUx6MPXnqjpxrk73812oMQmP968zyUj68zPp+U1bxG80+5GnnnrKpkVxTiWUuN4q7+96/YFXp6pvANN8hD7MmRbF6O7200KR9ed9CDbpSF4v6jIJtnQjQdPGOylK9p34/HowaFL0Z73IUNex7Z5Gk3bkN6L9yBNPPGHdY3fayu3uSP0dqH62uyP0w4XrDWo957gPEfqf78e4p4U8+0Y86R6711pvAUyL3vTvd9ou238Q/Xn4dj4/Cd6d7BlMC532534S9OnO8xvVfuTxxx+39RJlk/DtpAGc6k6hquScp+7EkyIn0+LV60Ufpu2q05zN/sOYFIfvP8CT5VEmGWN/h5w0zm/38+sl7/r3drLntt58rzdXbyT7kccee8z6O2b3JnLO6zpjk47nkyVg1pu07muas9b3CaZh4f5uPMn4Sikn7Jj9RTEJMnQfVHdck4x3Wt5i0qL6dj8/6WQ5GcSYBiEn+STrhT/fqPYzmJYxrRcopax5eH18Oi38WI2ulLImYTPNMavv716z/93rRXUmOZXVgZ5kePX7+hPeN5xJTmx3MdXf9zHyM888w8LCwgn30IUQ0xzWSYvhVD4/LarTzpWBpOl+zqRQ9lqjE2DCtbH2x9MW3XA45JxzzmHnzp0njYp9r9jPoH75Gkekc8SZ2ZpjrH/Ez8wMSSmHMY4YjZp2MDnniVGT/sPvRhxmZ2fJOWHmxj0ajU7AtvV6k4727gSklMg5M4jdq6iyuro69bv799fNptYF0X3vJKjz8MMPMz+/gWuvuYatW7eScgIEwTADEwEUAZDkBgtuYONlCCJgAuZ/N5QkCcP8avFzUH8fsZgNEoJJLAakc+2TjENi90RQjGSCJm1/hwlmgmRFFIwEYoiNxyPxvYZ07gVKUzh8+DD333cfRZXLLrvsBLxfjbl76pyO/ZRS1thq325O137k4YcftvUSOf1Ufdco/uwLX+LOv7ibZ194EYBdF+zkB956C+98+99ARE64ue6XqyqDwaDdGZqm4Qtf/DK3f+UveO7QS2uu944f/IH2WpNwdp2U/oT8+W23c8dX7+K5GN9FF+zkb7zlZt71jh9cswNPw8uTsPU0h19VeeSRR7j55lvYumUzK6MCpqTs9p2AAiRLmChWBBIIiqZEMkVUMAQTJZtQSCCKkDE0/h+7twkKpCSYxrhVMTGyCYogohRLCGvHoYD0xyGKScIUpC5AVSQl/0ACaxeCkJJhakDCTJEEiKAmDMx8XSdAY6lZQjHmZoa89NLL3Pv1r3PVVVeesDH3T+FTtZ/uguhu8v3o36naj4ggjzzyiPXhwtRjOf6+tLjEP//4r3HOuRfw5psPsOeSXQA8+dQz3Pu1ezl2+BC//I9+jvn5uXWjDfW1uLjIr37y19m8/fzJ13vlBf75L/48c3Oza3aWadSP5eUVfuUT/2bd6/3yL/xvbNgwv2Y3qbtOF0J2MfN6ka7nnnuOvZfuZcfO8xitKnloFBXEBHGLc4MTQwVEDeIkyAqa/Pdh9z5vaqgkUuz8akYGVATEHOYYiCSUQtJqkCDJsJJIvXFYNRIzLGWQQqqLEiOhqKS6gnzhqJ9cJplsiiXBSnfBJF957TEoJBKYYskwFUSgWCKnBkmZp59+mpdfepmdO3eu2USn+V/r2c/JWAX9CN/J7KdNiD744IO2nqM0Cff+01/9P7js6gP8d29/C5detJNtmzYC8OrxBZ547kVu/+JfcPDBe/iXv/xPkCnkvHalm/HPTvV6v/SP25vs3mB3fKurI37pX36cfdesf73HHriH//2X/3Fr/NOSTZMyzn0n0sx47LHH+JEf+REWFhd8pzcliRtyBVbFYlcTN0bfpoWEYiaxENTtjOQwByOZ7+r+b/zacY5YICvH/iDmBurjmzQOKMlIWkPThpohkuN0iwWI+YrNGkdeQswwcbhlWEAzw8wXazZDJfsYMP84ghXzxSHip5rB/IY5/sv/+0dc96Y3rdmA2uz0YDA1EHIqDNv1KDAVvk2yn64vOujHlqdlJ+vv/+wLX2JuywVcfOkeXj2ywGtHn0C1Hov+uUsu3cNzzz/Hf7vtdm5959snRknq6wtfvOOUr/fnX7yDH37n29fccBdG5Zy57fYvs2HrqV7vdm59x9vXJeqtx6WqD+T555/nyiv3s7y8TMLhSgLMElkURx+KENi+7uzi0EgtIUCi+OmSwIpjmYTSAIN6uiSDkkAKQgp/IgON+yaGnxIBz/rjcPckj30LU5I5rCsJsiYsafgjCbXEUIwiiqq4e1J9FjVfNCioYMlPC/eJIFuisTiN0oBkhllBcmJlaYnL9+/n0KFD7Nixg5xza6hPP/00S0tLzM7Mho/lfpGicW/hyyCQAv75Nuw+UOwi/o7WmXLfClhYOMaWLVvZtWtXG7TpRibrMx/0V1j34XcdT4DBYMA933yQnRdeymhUOHZsCZFEqrurORRZHRV2XrCLr33jft596zsZjUbtiuzGqQeDAXd//T52Xrj3lK53zzce4G/d+k6WlpfXOF5jSAhf+8YD7DjF8d3zjQf50VvfRdM0LYzqv/pHcH9napqGF154gb/59rdz7PhxTPCdNSliisYuK5rjIRsWPyeJQyGhWhyNCEn9sbrPIGRJmBRfeCb+kEXQwDZG49AFIYmh4kvmhHGYISTEGl9YBimPoZypvx8VJA3R5IurMcdrSTrjLuGjGJCNpJnGlCwWp6CRMLIoMCBhFJPYIAxNxjVXX83v//7vs337dnLONE1DzpmXX36Zt73tB1g8fhwzh3OIObyrp60IWp9XNlBfRtkCPqWIM9T5x+GhDIQN8/O88srLfPWrX+WWW245IeLVPvvubt49biZRMTDj6MISGzdt9i81YTjIzM/OMjc7w3AwANwp27hpM0cWln0iOt9RowruSAlHFpZP43pLJxAB68lnZuSUOXJa41tCIuQ7jYBWf9fnP5kZo9GIlZUVLrzwQpaXVzxihGHJEE1ucdlIkgOwKMncj5Ds0SjfZd2R9re7AeWkGOFUhuOrrd+jFDPMEkJ1XGPhxdY+cRzZARPJfR9Jiqm/P2wONKHJwJRs6jt0Su5nWHJfQj2IYBQIp14xBkI47OE/BVyUFI6/KCk5zJOSGY1W2bFjB03TrOGtzQyHNKNRnTGQghWjWInxGI0phvtyNOZg0GAU86hmlMYw9c9qMYyCjgpHjx9ndmYD3//Wt3LPPfdM9FtUlYGqUko5IbzVdUi7WHw4M8vc3CxzczNsmnejq6HSphSWVlYBWF2ZY2Z2tt2tuwuw/ruUwszs6V2vuxi6TlYd48zM6V+vC8/qYqgnZT861Y+dP/bYo/zoj/4Yo3o8u1PgoVRJiPqJBRkRo6C+oxchSaGIxC5uJHEfwDdqN3xTg+wRKXd2EyRIBppjy/fLY02CWCzTxuHX91MAEfdPNJESqBopFcwyJurAqg3jWpx6DqkExVIiNwIDQa1BAWRAQiE5XExJ/URCyQgFIZlB9rk8cOAAt912G/v3728jiMOZGVQDEShoSUhuEM2U5CecFHWIGbAzlwZJghRDs0AJ2FVdu2wUMxI+XyqFpjF27drF0aNH2bRpU7txt455fcjVuCrE6Ds6DkdW2bF9C1lg49wsG+ZmOWfjHNu3bGL7lk1s2TjPpvlZNszOkMTYsW0LWvSEHbhraDu2nfr1ztu6haa3uLqn0qhpOO+0rncOTWcy+vmMesLVxVgXdimFpmligWbmZgZtLN8vFmFZbbBGHfdSwo9whxot8ZAdMydzTG9aUDGKGlZ8QaiGU6wGVtDSUChIY6j6gqOBTHPScZj5qVHUoAg0DaYlIIWhlj2qFUhBDUwLNH4tMCgKZqRSGMwO+PM//VOGgznPe2jDYGbIvfd8g5mZAapCMcEEv6cK8RpFLLFp06Z2Lqvt7dmzh4cfeRBTQ1E04GXBEG187pLSqNKYbyBm0IQda6MoDUbB1DwQUvyE1tJgKFqM1dJw6Z5Lefzxx1vb7B4EqbtSJjmmXYjVNIXrr7mCI68dZmaQmJ8dsu2cTezYtpkd2zaz9ZyNzM8OmRlkjr52mBuu2c/qaHRCZGcMSxpuuGb/qV/v2isYxfW6GdFqtE3TcMNpjq8mGbs+xyRSX520GhMvpfDC889z7XXXsdKsYMV8t7fA3ChYJmWgGKkIlh3SWeQEwJDkp0UJKKIioGNXW9R3PnKKEK+E32BYDlxvUMTQzEnHIREQSCQaMSRn9+dlvKOmMUr3aFRKcco43JIUicWU+G+3fYHf/c+/x6c+9R+ZGQ6ZmZ3jtz/1Kf7PX/vX3HPvvTHaQsYgKUnFo9C5oBirKytcdeVVvPjii+1zEBGOHTvGxk0bfXGabyxGQ1GHmaYB4YqRLDYIIXyw4vDQ/HoJQ61BTHyPKeZ3aMbxhQXm5+dPSDCaGamPt7pQZRJL8qYbrmP56KscPnwYEZgZJAbZ/5sZZMA4fPgVlo++yoEbrqXCtq4Bdv2bm9/8JpaPvXZq17v+2hNgTXcxN03DzQeuP+Xx3XLg+hNoGN1Togsxu4umnijPv/AC+6/YTxlZZIo1YJIf5yLmBpeFMhCwEg67J8QkVacyRe66eLg1aRtcUVFSgmzFsx3uWSKSkWIUibiSpcD1648DMU/ggTvP6r5PskhrmEMfRFEJKBcZfJPkjq4nQTA13vk338mHfuJDfOXOr/J7v/t7/M7v/A53fvlOfuqnfoqbbjhA8di1/2nZr5kU0YQlhz7XvukannrqqTW2snXrVpYXFrBmBH5+OBnA/CRxP0NJVjySZoo2DrLcbhu0eDTORONnxde3FUQLqoVmtMreS/fwzDPPnOBe5J/+6Z/+F/1dvZ9V7BqHiHDDtVdy51f/ktVRw9ZzNpMkMRo1HD16jAce/hbPPv0k/+N//941Wcr1CoNuvO4q7vjKetd7gr/3t98zkXJ8QpTJjBuuu5IvTxnf/Q9/i+effpIPf/DHJiqO9EPX/Yhd9UuWl5fZMD/ProsupJhDBEniOzaCWMakuNMsjp0znhzTSv0wRbL4yYCQyWgliJhTMzKZRty3cNhDJNgMY0ACz66H333ScRSHVSnCrZbdfzFpc4okFLHsvkEkBE0E6YSPfXxQrHDF/suZnZ3jttu+wHPPPcv73vdefuiHfpiVZrlNbLYJy4Hfm9uSn4jaFF47coScUuvnbd26lccOPsa27eehxXd/JO7LQAZgJRZ84+epZM8JeYwtIaKIRZpGxXNFLTvMIuye2LRxE48++ig7d+5c48/KPffcY5O4+11nvOsj1N/Pz2/ggYe/xaNPPUcTGHc4GLBvz0Vcc8U+VlZXpkrgTCrPrNf71pPPnnC9a6+8gqWlxTUOUx1T/VmfGbphw0buf+gRHn3yudavaMe3/3JWVpZPYOXW+6vX7CYcu9GUpmm47777+OAHP+h4NxYlSdr8gOGOY45TwCpIsRQwxkjqxi7iECCJY3MBj91L8viXKSlFrN7iG6SyrOp1OaVxEAlB1EPFyTzSVCkjmgSp2XGNPALBO2kMy0JW8YhW8VNpODvLp//g03zjG/diCDfeeAN/+8c/yOrqClgOLpZgA8NGKU6vOI0QhMzK8iL/9fOf58orr2QwGJBz5v777+etb/l+jh096rAzCNApbhMqRItTRVKHGBmcF6CYkSUjWlr+pNNrIodiwlNPP8WuXbvWJKoHXew+GAwYjUYnxPS78d9q3EtLi+zfdym3HLiBuVlP1qyurPLakSMsryxPrNfuhnL7hLKFhePs33cpN9/4Jubm58BgeWWFI0eOsLBwfM3i7BrytLrlhYXjXL1/H993043MzsyAwMrKKseOHWNxcWEq6a3PzO0nSFWV0WjE7OwsMzOzLC8teagTQ5w8FVljZ8B6bD/Ig2YkUaz4I1Tx06Sh+E4cxuIZcHdAU8Ak0+T2ihtWzYSj1NThScfhYM4dbne6fVcV8bCx5zpicanvvO2qix+bepSrFMgizM7O8h8/9Z/46p1f4f0f+HEA/ugP/5CVpRU+/KEPsTxa8XAxhpRUM6C+IFViDgqbNp3Tnso153HhhRfyyuGXyGmGOjtJxfliqYbFPX+hpiQKWIoNB1CFQYrTsqGIRLTKT+xk0ChA4Yr9+3ng/vvZu3dvaw+D7mmxsrLCYDBY44TWf3eNsJsPeeWVV9aVdekvvm7Uql88tLq6yksvvzy1sH+aSkh9NU3T+k0iwuLiIouLi+0J2K8zmERP7+Z2qvPdz3EcOnSI6667jtXVZTQZ0pgf81KZrNWgAuNWrlJSSolEWPL9WqWGOt2eJSlaguJhvusnEc/yV0ygRkkpiH+QRSnCScfhnCl1smM44BVIdVnBnnFOEfpMiBVUnMxYeWFZ3FP6/z77x9x5x528//0f4F3vfAdigpbCZ/7wM1yyezdveetbnL8lCbNC5cAUJ7d4SFoSS6Nlrrnmap555ll27tzJcDjk3HPP5eDBg1x2+RU0qytgQol5dNaDopactoLFCVyQLKhCSua+hQTzWD33YwKpcUaA/8ztbBRRs/bk6OPsLkTRoHj3C/Yn1Rv0/ZJJBSarq6troEr3c/XPmvnuQ7FJmfu+sMAkI+/WpPQTndMURGqCr8/6rD8/dOgQ73nPezh27HhEYzzk6Md6pX8bFbAIhonDJKhoxWLXTwFp1NdPY8EgFzT8Dv+AOwbOrjWPgKXKbfLo1CmNo15HPHFmUhgTVQh+lOOWLM641aCFWEtbj+cgyo/+yLvZtnUb3//Wt7G6OkIwfviHb2Xnzgu48c3Xs7K86idNzTGUoLlLxUdOiMwI1159NX/5l3exbdu29jkuLi4yPzvL8dUVSoNDtDjJLKBRI0YmkqXOcEQSFI2cShKkLowSSUlLkU+CZMbi4iLnbt/O8vIyMzMzbkt33nmnTaqK6lZx1aOuX7vcx+yTanq7MKpbfNR1quvu3F8wfQp5d7ev4+v6Al3o0/eX1hMHm1aLPEl8YWFhgZWVZd7+gz/IatOEPzDwya8bdXLoQwnqglR6OBFNcqhDOLbq22dEIiM513iUR8woyZ32XJ3sFDukuPtSKhnxFMbRJgZjx0ymIIM2CWkBO6xS4FNk7cVQC1jia6UNh1rOfgKotgnLFGOWDkFRTZyuUmodSaX1BNoYCF+548vMDGeYn59nZmYGVeXwK4fZef4FqFkEH2owISElnil+X77Ak/PQLBYzYNKQbNDys2rEziJQkFDO2bKVu+6+i71797q9dxNp/d247yfUnMC00Gw3kdNNltXPTitb7VZ91YRQn6zY/96+L1TDq30nvY6l+2fNldSxdU/Mfji3C+1WVlZ45JFHeOtb3sZodTWIbL4raTAKa8UFxTlOTlfxZJRU34DkcXuLRG6p4VdAszu+QZZTBSkOY6zu/MUJWaYRTTuNcfhxlaIOQ+Ik8ARhqZBNPOyMJFLkFDTGX0wpJUCYiI+ztaHY7ASsGRuemS+iZCCqEbiKMKv6ovRxKbccuIWDBw+2lBIR4YVDLzAzHJLQCF1bhzZSPKnZEjiDvqLmi5sCyfMeJpU640466uPT5Pe4PFohDTLD4dARQ3e3rYbdzRB3F0mfqj0pD9CFL12sXiM+1ZDrd9WfdSejv+C6pMWukXezmv3/uhCpe63uoqvjrYuq6WHOetp1v3N+fp65+TnMMpTShjOt3QE9ROvYPI5/83oKlRL1FIrzNSRyAJXFamBNLexzjJ78mqq+YFJxACZ4dvB0xqFBFycpUMhmlBw0k6CxWnJDdlqKnwR+gezcrmD+WkR+tN1/jUJARRM/tSg+1mSU8K80KCGkgiEeoFAfkqkyt2kD8/PzLVlVVbn22mu57YtfYLUUNm7cgBYfmgUb2BduHJfFKBRnAqRIXBZnKIuCNMWTirFo0eKUEwEdGcuLy2MbuP32260LfU6m0zRNm3Q9XdZazDIajRgOh+2C6Auk9X2e9dQpJtU+96HSYDA4IYk5TVh4Te1w+Br9U+PFF1/kyquuYu/eS50KkiQoHtLmCHJEhGosnRrPD6IgOaIl5rAJ8YSYJoWSUSnk5Bwqq5gjJUyLR4tybhm8vkA4rXFIMmiEkqSlswseyclSTxL3XzyRCGLF5QaiZLZSw2t+JuHObaJuAuo8KLF6i/V/Dgu1pk+C1hEOcRLP8D/1zFM89NBDnH/++QyHQy91Hgx44IEHKKUwPz9PaZq4txpVq5WINZIXLoJGwZa4RyZtrNzvQVGSed3LzOwsKQm7du0aEw+7jmyfaDiJRtENuU2Td+z/vMvd6i6++u8uhOpHlyoEqousr3LXvYd+sq7eU9c3miSjWRdJ9WO6i7DuYIcOHeLHP/B+ji0skSWyA6kWKKU2x13LUn3HcuydUoSjgk6NJqwUkNziYMtK1hTwSONKvggk+WJJgbFNGswyScopj6MN+yZjkEAbQwYNlMwwfKKSPN8S9u9JNcmIRj1HkByliEfGRoKm5KzxONMkxpCjTEDw7L1FWUESpWgIX2SLkoKoGMzC/iuu4Mtf/jI7duxobWJ5eZnLLrusjXh2Swb69tO3iYpQuqWw1fftRkyHw+GaIM2gL0ZQv7juntN0nLoZ9a5D3GXdttTfyHr2F0QdcH8xdk+P6kt0F0w3RNyv0OtH37rXn8TA7YsorK6unlBPXEphYWGByy+7jMWlZa+YK8kd5sDqKejfRkNmgBaPubvwgNKUQYxRIZnvxil2VC3+WREnFOILysSDrKoCNAgShU/J687l9MeRygCNYqriTA7PyquzcX0z953fiIRMtnEJbQ7elnrQQHMhaaIBp8cHLPOKkUqV0VYvQsy8ZiVqQ8Tpu2OonmBlZYX9+/dz5MgRtmzZsqaMtm8bw+FwzabaZ23X1+zs7Bok008kT5JYSl0j74ZtR6PRGojV3fFreLOLxfs+S5f+XXfe6mtMKputi6DrVPfpIX1fon5n15/o+g2T9GHrOJaXl9fkbUoprTJJHWddwE3T8MQTT/COH3oXpSmRqnP6tyexvKRUUMQG7luY1GgqiSF5UDynkSzwdZSamkQxj4dXsyWyQE7uvFrUwWrKEIVPOqgV36c/Do3TS6VGsiLWr2PlkAxYKo5zaiYcozHncGlAGEsgJUUdObhn4ZAmp2Acx2JHpBO50tZvMrE2ny1RHKXA277/bRw8eHCNXX237Sd1C4e6cKceMd2sdI3ydJ31SYXsdYDd1djdyfuwqgt3BoPBCSJjNRFZrzccDtes+vWUUvqJwvr+4XC4Jsxcd4+6+6SUGI1GHD16lAcffJD/4e/8HZaPL3nVWXCSPLTpLB1LbqopZGsQT4aliB5pyaTAtwWQQfAhtJCDqaqRlCtBabBhwnKJIiOLTDfQSOQrTn8czsNIHhUL6J0HOGwzJxUWEZJKsDIEy4ZJ9ipDrUojGg67JwuCKxwejuc1LIfJB8YXEY9WRZGXImQN1i+GpuSnWTGWV5b48Ic/zNfvvZejR4+uQTffLfuR27/0pdhCiAL6MUmM4J7Uyq5WmiU0kmqEo2oj1Z9JyLVU3GqRFfU5Cp+ge52uDx+7UJ3kVgFJWPO++pska+Vqqq+FdcbT+S4i4tJqRdXQUCSU3JeTljM1HA64+qorWS4N2VJ8jQYBLpMoQUWHAUKDix9U+ptj/cBI4nymAEvxQBwe+XXjHlJBtdIQ05hwh6JZSPo6xtFm68f3i4IFnZycQhBhnJF3H1yD4hIlsCpjxq6M6+NpqTIhAySKFKfiD5K11A93xI0qFlRTqV42HLkhEyQJDz74wASxD9pn1SGutQteqM+acRBhLBI2wZ7Hw2+t6/lDh2woQhG8drkaazUUBI00ewpqDClR1EXGqiZRq2IR0jE5HM+avZWITzsTMqInEb2oC0BDoCxJ8IoiopCCy+OsS6c1iPiR7xFFI6dQvqhiCjHlLfwQN6Lx/Xssp5iQrBpK5JJbdqrXSYiF1kegDM8ZBDkvplIl5igHLSMoH9XZFIOSa2WdeXVbZGpdWMfxuVRHH39fLFvPVai87nH4JsDaZ6WG5SBFVl6X1PmHsV5QhEQcCZcsAAAWiUlEQVTN/3S+VfIipBosE0FLzWRnf1Z4Vtp9J/WAXcpRvBVUrprIi/vGxpG2yOWf5FkJRdx+Bh6DeN32nCRKFyV2No1Yd12ViguMpZRiB/AEVor4u0VM2+LYN/Hj2LO6cXhGFVjoVDjetnqsBMUnDuVURS1IpOw7TqP12K8Lw5Nm7vA5dUDVs8MSnl8hwpKhzKfqIgWu3RScHgtjSw4l6s6SgtWKuhqHU9OkzbYWMyx1ggPm7FZJyZ1UBIsyToschguG+HcXxZN+kdmuQVdNJRJw1jlVtS2W+k6MQ8W8bDcMMhWjSfgmY8Vza6o+P8Hd0wjFWlQG1mNc8OfqGWev2WgipKzqBuf+T4kyFB9f0TzOktdEqLoWlpl4HQaN86LsVJ+VeaTvO2jPg6B6erRDIIdR13oD/02s+uQTSJvrdfwpUTBjA2sTR9IINlCkyWiuzM/sD0DMSS0mTkqzhKbiANpo2aClEXLc2LhYP7Kfgb/rSSvWtMk2y7G7hbSHVUigtcjIKMUX60iEQQOWa/DU0BIs2ahRdqLOd2aOihZee+UwRYsbQ3a2qmbIxb1hC1U3oQ1ZjRm7GnkFEXKLIYmEn4zRRYp6kXofFYIEydHLB4OK0RmHf5eChOYVY2q81edWhdrCc3B4GBC3as3Fs0rFoaDXllQYowEVfcMiiJh10Yt2TqzkTGE/GeS7OkeDFD5CSfFnOFxSAjRKwKIUxklGvC4TGRSk8aIXk8bLO1NyxuQgao6roYaRWlSEWZhiIlFaAw+tpMANKeHx8Ip5Ww5NPDj1YnpPPDmFuoqMWRz1VfAMgvgnhpVwxIrn5Er2IqEkvjMnySjFT6SUnX/0HZij44tHWVkdccnu3Zx9fe+/Btr4DuvUBW1hjiTfL1IpNAKDyNiqFefN+Kbv8Wp1LaVKoSdi89Iq7/lRlc0jKJqsfW9JNi7cJ3mMPRwlrUzTtoYldokorjZxcKniO4e6DIWvfMVLSXODufU7wcE8yVZq2FDHO3xj1SeSVr0jWUE1ofL65shILC6tsG/fZW3M/ezre/uVkBJVZo5HCacxyDruuJkTzqzSHrK4WFqFKWLkyOWk6kTWLHllZhYP3UXZekRliFj4uHorBSFMzOPdFllaB8w4F0Y8sqJVXdzEaxnCaTXxMkpxBVn/uqSh9FcimuEOutQQRUrOdkU8vBo+kNcCvP45SiI0zejswjiTFodLODaUCJ21YbzgpKSICnn9rbSliCYRprOE5OTOoLg2kJHIUQYq2aMKOVVpRtpoeKoymVLpy0FbSA66UjinxRLJ7RfLGUWcyyMOzCLC6pg4uUaTmKDZa4fropFU2miNk3BaXgdSwqlLige1amVdcvr2654j9zfOvs4gWEVxVW2rNc2iHg7P7qiJiDujppTqtBSw1CDmcXRWidqA8LOtuAYTTlOQKOUZkwIrv8ZFugbqWqzSOulxZBQNOU+HLSkcNi3GAEHzyIPDGkxRF0cKCqpiKaT7i7rwWBX6ipNINbtoQHJGJjmFbEsVFNOWkWq8zjkadRzDs68zBVa5wQ2DgpAkObOsRFSiCsdJxdgZyKHm4OFbBhG4SZW373FzHUR7lKBGWIT2UieLOtTIaUQtmvsblT7txDUlkzRXIqUnk5LnHyQWBknIqDvFklxVQ2sCLBYdCcmGWnJJTvFQoRYhDYKBKhGxyQRPKLVhz29njlxMwDVaObs2zjBYFUmdxqzF3yI1l5DaTKSiaEkgrhhHEmaGmc2bNjM7mHF4o5HOi2qvXEJu3/DC/uAQEU53FokkWxDGUtVX9TLHpDkUx+tWPBYTm8kDl6jJngjy/GotAfUQclRTen11VMah47BdUUgpBJ6DFaCUEAwzJGVmN8yxYdM8m+Y3QM7Vg4kkkTE7nJ06R5VHZHEAnV0bZxysiqysefioiDCIWmQstbyYZMllKkMndX5mA//3b/w//MnnPsett97K//qz/wuriwbZd+IaXUo11m8pdFIjc12MJJGbiOIUzFzvtR1P01bOEUS9lDOPPPQQr7z6Kju2n8cVV1zuSStxaUxyiCfXa5iHgEuQ5VxCMORhUE/IVapQUGFTSqwsL/E7v/uf+eY3v86RI0eYGQ65/PLLee973su1N1xPWVnh2OICn/+jz/P+D3wgAgedOTJXRS8mDCIjXSkjZ19nCqyKrKMUT+J5mt4CK9MamAZRKhnMzczyG//2N3jowQe56aab+PrX7yUxJCWLCJLDnMoZwlwNIqc4naQySR1Mlcp5CQl8SSn8F2lT+W5YnpRqSmHvnktJOfHoY4+ShkFYyzkSSNYqjbcyXuKEEq1Z+6iuz4RAcpw6szNz/Pmf/lf+3k/+JN969GG2bd/Gvn37uPiSSzh+fIGPf/IT/Itf+iWOHDvGRz/yc+Q8OHGOYuJUPNTbWGkTY2dfZ9DiKADFG5aIppYe4KJi2qrsIQ2iwuzcLP/+t/4D9993H9u2bUO1cPPNN6Ml5F5qWNZLgl260Wruo6qMp7arllrxgFHtHyFgxeVUUggwN5W8KL7INm3eiKJs2LQRBQ5+63FyErSx4PxUiFfpGR4CdqFwRTUFT6j4Yo6SycEg8cd//F/49Gf+kBuuvx5B2LZ1G9deey2X7N5N0YZ9+/axuLTEz/7sz7Jnz+4WgnbnyKNmrhiokS23s7DqzINViaalbZQcNGXR0AbKThxIgllhbm6WT/32b3P3XXezY8cOzIwtW7byD3/mH7K4shzdiYxG8IRfKzwfLMiiYeAaxfnFI0ollMilbY4HRaNqLXnmXDJWCkVgzyWX8sSTjzOcmWPzhs0cOX6EJ558kt2790TysJCCJtBUVTypQoBGyRp98ELmrHgTl8OHD/MHf/Bp9u3bx2g04qMf/Qh7du9meWWZLENKafh3/+Hf8/xzz3HFFVcE6zeoJDFHLvDhVBlVF1FGcoSlzxrcmeVz2ABSoYTSRAlYoCl7D4eggc8Mh3zmM3/A7bffwfnnnw/Azp07+djHPkajDefMDUNhI1rwBllNVVlcWvRdNFid3quCwP7aGo5ZioYr3gekcnA8cqWklMMHSly+7woee+IgOQ3YumULh189zLPPPsPFF+9qWxRr66iH6oc60SxriBCrO82ShJQGfPozf8TevXs5duwYv/iLv8imTedw7PhxhEQjixxfXOa+b/4V5+04b1xGGwVHqXK7teZSSnTZqnUTejaSe+YtDu82mkU6HYEyYh5gFVNSHvC5P/kTPv/5P+Oiiy5sDeOhhx7i3e9+d0igyLgntYybtm/cuJFf/79+nXM2nxPKEwnJ2tJKUu0BIerZZIWmKdx11x1ITuOWXLjgGSHfLyS2bN3Cls3nUFTZunUbrx0+zPPPvsCFF1zoY8rR6kqcqGgaogiR6fYwrUfWBnOzPPLwg2zffi6X7buM7du2szJaDSq28OLLr/LRj3yEiy++mKNHj3p8S4RmtQkWLeHZV3GxqvAXGFNbZvnZ15myOEwsIq+1j0EmpdKqSKDG7Pw8n/7MZ9izZ8+a6r9zzz2X8847b90vKKXhi1/8Eu99z4+5+28lEhgS7EpXscgpuzyKKK+8dIiLd+9hkMQ1YtMIs2FIygS1pOo6hR9hZLZu386hFw6x6+JdjJrGe3lHEZEnxx37ayTzarPHJmU2JGNpyWVZLrrgQlaa1SBOehRr1wUX8NnPfg60RPbeN4Dl0QrLxxfbXuKo530oNm4qGYIHdhZXnWGLwxVhnJEq4lDDosREjZShrK5y1VVXsbS0dNpfsLo6YveuXWhxDySJdy8ySSRV1LIr1WlpT565jZs5fuwIaWbW9Y0sk5JGHsPFYES974KKMDDH+0X9NGmaEs0nvejHlFbqsu19h4euNdiBRYW5uVnX2F1aIqsXz2jxSpOl0SrLr7ziaRJlXAVnRm6VA6tgW/FkYuuE51pOefZ1Ri0OCrkMKGmsnySB2ZNAo0JZXuEjH/kon/zkJ9bUY59//vlcffVV3tpM2sLTtrZPzNiydQs33ngTy6tLkSj0uolkng/IOHFPa2mjGlu3biJnf2+tx0gdSYFg/XPs+AJZ1DsUkVhZXuDSSy9DKYg5M9ijYt4FqaiQcnFNpWxYyd5ZVYSiDeeffz5NU7j77rv50E98iIWlBVqhm5JdtsYysxtmKKPG+wCKK3VX9JSTM38tNFqrOksKn+fs68x5ydPPPF116sPochSF+C5emyFIRGQ+8YmPt7W8zz77HH//7/8kb37zAe+akw1TbwxZBbUV7yCkVW81HOycDG0kmh5KW8stVVM1VUHxCO9aFMvgnKnXXn2Nlw4dYtu554IVFldX2Lt7D6Vx/ydngvIuURIqQYyM8leSJzsju52ScMcdt/OlL93O4uIiBw68mb/7d3+C5ZXlqGly3+uVl17iV37lV7nxxhv4n/7B/8xoZTWKZizyi937SO6UR4vjFw49z00HbjprdWdKnsOakFUxjQ6exYnehdDmHtdooIWPfexjlJDc2bXrIn7zN3+Tv/rmN5zuPYrrFHXcrRaG6Ht+MYNSEFXKyHMSpp4LMNShkXmyT83afm+VKFi1/I6+eoRnn3uGrdu3oRiLSyvsufgSmlGlo9decNCkWn9hjKJGo4QAcqNOFUmmFFPe8a53ISJs3ryZ2277Iv/q4/+Kl156iY0bNoHC5z77x/yjX/gFzr/gfP7irr9kNg+pnQHaA7VoKwEKhjVB3bez2fEz7uR48qknLJNbdQ9LtaC4qkDUckZvmSXJM9Sf/OQnWxmUgwcP8lu/9VssLi4g5CASWtCVkq+TWmgURfFAiHpVXaZg9YpHtCza9bbyjeIwaSYP+NrXv8auCy6ClFg8vsieS/d4F9bIp2RxkWLNtLXX0Zpi3M8uKPBaO8DEybi0uMSv/ZtfY252luXlZR5//HEWFhYYDAZccsklbN++nYWFBd73vvdx0803U7Q5YY6INsaVGZ+Sy8+8+PwhDhw4cNbqzqSTo2BRqFOiFtuL8FMIFFA0+jQ03p8tZX7+536e5RWP7uw4b4d/Pqjpg2gmoqqIGk2IhlkqFINGjSZOBFXvEJpKQa2BQqhIBPtcFGu8GaIUb86+aX4TBeP48aPs3rMbbUY0USCF+omgRKticzHjohpL1JeHJqUpTl+36HmtpmyY38A/+6f/hAsvuojRaMT+/fu5+aabuf6GG5ifn2eQB/zMz/wDvu+W76OUZuIcWaijazFUCqWRXlHX2dcZcXI88eTjZpJoJYTa5iJjwYFKwo7MhwscZKGMCnd/7S7edMONbJyb94hTkii2DwVwAaxBZNCWt0rkARSviZBilARZw1hTLcgfh4UsKvEkpPEXFo6zcdNm12K1VjmrrfKr2lOefmg1WECdS+b6JjZuqFgpLHhgYn7DPMeOH+eRRx7m6NGjzM7NcsnFl7D3sr0cO7rg2XCxqXOU1JuqJFwsLQ0yh154nptuOutznDmL44knDPHqORt4Ew/VHPUXIeyg4pSLUK3TkHMPcaiqTeFwJVH14d2g1ZyqHmL1Xq0aelUaurBZooVCrdgLmJNrfTmtTlGKL9boA6HiDUwkh8SPiod9XUCD1EQ31VSbqsQCiSYsYhJtvdplBGY0SRhaFc2JTqbqQoGCYqc4RzUhmtOAF188C6vOLFhFzYr7jq5BIdeooZBUQg3PXD+1lOiyGBhe3dFurGqQatvpE6JKLjXeQ6HVEKoOdpwQxXMY3qXHG40UDGk80lTEe+URkvtaqScWPSrCnyBgVJXsMUtobtqGj973O8iUNCGr0zj3KciNqr7gBhqkkLZ3hYXBW0uzP5U5MhOn47SaT2dfZ8zi0Ej21cahRLzes9niESh1yEEJdZCIHCW1tr2UiF+H6Nmg0RWxrbQTV6zTKmxEkPQ6X1xlHNUKAwnZzuR1TqUEEz3V0m9DdeCD01Atz3jVYTSalOLYvwRd3YoLOlSVESxakdnIGzhqRJWiM5IFrUXR1z1HVb3x7OsMSgIGEhmTG6L/AsGXkoznMGosn+QVdC01PYWyRwqZ+mjxS9u1xHddBMvFdYdLaRuyCDky8jXWFO1QrLiUTklRo+Rqikkt1MktZEejM1UIK9RbkFQV1r1iRC17UZVEaxcpURUYcEqhiPsz0nj0rKr6IfK650gH5ezaONNODqnE1xAIIKIsVVXDosmIR1b94edsnUIoGxtRLm1OoVXwVWtVDnNTF03VeM1eUpqsbdjYRKKvsg0zDmUkKSKlI1Zcuw+NW+VWX8ePIRdSbheLjFwNBD8NBiWa1BOOe/gG5rMShUoBM78Dc+Slv+msxZ1RPkfoQbmYQY3qgI4E1QYzx+Zq3uAU9SyzVawfjd2LetMUxXtEW/SK8B50OT4T6iMaHY5QShVIEPH6h+TizVWlRIMoWFTRIjTi/kkJyCYWbFtTirijXlXNVUucHrX/t2vrWiNOlykuueNhZ1opTO/zEi20NNqhvc450qawYX4Df3XffWsoOGdf38PRqscOPmYpFG1ShlSyc5kyUQvurXSlNBGFicBU1F20WlPquk2VLlLFvzUUsVPrRIdvUCKqU6nudY83acNg1tK9MySvIHRIpeTk6iWErGfkMaM/orcPQ1rdbvdtShrXkVeyjCilqrkXVzqR6NtXhcorn+t1z1HxnNIrr77KyspS9LUIXtkayFUZPbV1g7WdWaPXfCsKYViwVySawXTeYIzJjq3av7Tq7bWPNxEKr+OQWrIs2p6I1umjN+011oSvrSfCyOrvpBaGhSp7R4e3+px0tXbbga+9le/WHMljjx70pHg4qSqCyMhLSU1c87XqzVpoCIbUjSuXgKYQcDbI4vKZskauvmrcgmhGJSRzglflSt/RtsBcMsc0t4TDksbibN4ZKSrwxJCiHnatRVFt96DIrkdttySX1K+ZE4v0dTXmFCdUFonmMcEOiJyMiLbq79+xOZJOo4ToAe6+j7WLX6r5mDe7SUGt8QaQHgk0Fd94skb9irR+XKp6KTIOr0t0lR1InKhrxkGba5LiRNRstZeGz1OTooePpjVtjMfPKuar6kNXKqq6ovugfVZEi4BoU2AaWsUhB0vQ1uJ5EJWX3605annVIkKREp1Ds3cBjRZZIeCHiIuU1V3FzBscinn72kQJ/K2RSIwFIJVHFUVNRNutCN820SvDdbAij5E1yIdGrhQMIWTjSyvCTU7MRqjUhZ4tdi6NZF9oZsVNSLZxf47sLYNTZMyl+hrRMyKpRueMyHN8p+coKqBU1GnuGCWVttNq7R8jql6LbnGaRu9AojamCm1HcUtUZDZutBqSQeoVj2hBtbgGcJETx4GXAljxZ+bs6WjtXIxRSLYq6gvDAqKGwkpSIoEM0gQnwSo1SZgp3tO8RBsJgnemMVduG+NnpbUeJ/Fdn6OBVme0hmKJTp9tljlk4iWq8qLfRirxuTJuQqPRJqgemVrPqugYlELbqf62WHSASuIdf1o2cNDMq9+SQqbexp2anKBo0fsiGMSR3EvW0ERfDRkYTSPef1oEHakLrJVEoYE09Aw+CVd/tKCwZ3IqSBn4Qygh+fnXNEeSBt8T4zj7rMZzNPjKV75KbbLT9idogVhIeNZjrdvaqsrsmESuo9Mjq6NCMq61DvwvXdzr35GihUBtKmNRm60hNh05OMfHMZQkqdN2rYtvg9LRJiSqhm0kO10BoZUBSiYtDBtLhNSuFFVwOnlo+K9xjhLfG+M4+6zGc/T/A8/G/snZpSWJAAAAAElFTkSuQmCC);
+ display: none;
+}
+
+* /deep/ quad-stack-view > #chrome-mid {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAABICAYAAADRa1RpAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAB3RJTUUH3QcNFycE5v9iFQAAAQtJREFUOMvtkjGSWzEMQx/0eYrM3v8k3vgqycalSwlI8Ufyl3OBFMtGIgUCIEd6PB6RBEASqvfONSrJXrDNbNkQ8ywA2y/SmayW+ZIESTsiyQsxo40xmMS2aUmYbheHpCVd0+UqJGGMsey3mUyldoUvlY3D9rIN0K7Wbe/WbZ+y1yWtaVtrp3VJzAEX6ZVjc2p7b2mtnYhNdl6m05rwtfV/ltx7XypJTpXeO7Y5juOlchzHaWxyrJmuhLapqgIJONv05+srThBgiQpBTSRwGOr3rwccgWHUhJ7P5/YNlbd/2XiL78L/WajP240AQUihfnx84EDJjCHKHjTAbkimQDgBjAJ1/3kHAgEk/gL71AHEWVXPGQAAAABJRU5ErkJggg==);
+ display: none;
+}
+
+* /deep/ quad-stack-view > #chrome-right {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAABICAYAAACaw4eEAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAB3RJTUUH3QcNFyghKmOqnQAADE1JREFUaN6dmsuyZsdRhb/M2uf07bREYDykPeIleAMibNx92i9BgEPBgyB5xlvgtgI8VDNBI41xhGkpQowERgqw3H0ue1cuBlm1T/3Vu4XNiWj9l12XrMyVK1fWL/v6668lCXdHEt/1Z2YnnyUhCTPbX8dn45pmRkR81z7/XUr59Pz8/K8ePnz47/bVV19pnDhu0t+Pmx0Z+Pv8zWv1/eZnZ2dntw8ePPizZXw4bj5/P3vq6G/eePZiX9fd9/Xng6/reg78/dInzxPG9+/auH83GjEbPUahj6m1Hoa6v1/X9c+XPrlP7INqrfuru7+10WzUkUHvOtTojPF1mPdHSzdqPPXo5vm046bdq0fhGr+bvXZk6OgAM2OZBx7hZD7hnCzbtp149Wid0YOjx+eE6t8tMzb659Ebkg5PPY8ZvXpEQWNCzck2M4H3BWeM1Fr31/6+GziPmTefM3tcYzQoIt4a3+cso2EzhsYTzAAdw9M9M3rviPv683dl/Oi9pdZKKeVk4piVRyDu1NI3mCtARFBKeWeGbtt2yHV9HXdnGUMyGjSfZq4K42ajYbPXx836XjO+jsj3rawcFx5dPgK8bzJ6eGbzI8yO3j4yaMToiWF98fl0c4bNSXBEJ/Ozd1HSEY8BLGOIxlONeCqlnHyWtGNoxteRMX38uP44fkyyPnfpp58zqy/s7jsGj0rOEcvPVaMD/sj4I/zWWllmMB/VviOwHumv+dkRGc9EOtOUu6fHZteOGBtDN/+NeJwPNRsxl54RU3PIO4x827a3wNwfdr45kib92WhAf9+fHem1I7FZa31rr+WIr45kzrjZsixvZWHHYcfqXFHGctM9ta7ridcigmVZWNf1DvyllN2wkatmHIxCby7kYzbPOD2qFCN39efrut55rE8YM3I+8VENHPFVa2VZlkOSdXe2bTuhmHdl+W5ox8T8YCbD/l2t9YQqRiNGjx8l1JEamVXKri56doyTuzfGhWd+OyLJjsNRlo+eHaX63Iy8ldnjQn3hbmA/yagGusfG7JwrxZytcxMyjpnH77VyPEEP65iVs5tntp4ldp8zlrG+x8z2Y9L1f91Jy+zeccGZn0Zv9nFHTH500BGbM6HOojMiWEZQf1cN7Aut68qyLCdeGFN+xuRYJ7tXu5fetU9EZCiPOp8xm8bTzLqpe2jkoDnzxjCOa8/VZByzzG7t8gQ4eT+GdO4Be0kZDTgq5kea/0g0RgS+rushNkbg93o6aqeejUeNR/fcUWmaqWLbtn39MdGWGcRHUrcb17E1jhszq3tvxNCsJuaE6VGZMbeMKTrL6LGelVL2k41jx6zuRbknSS9BI7WMdDRTxLi3z+VkDl3/7vb29oS3xhoZESdZOm4whrW/7/NHT83UtNze3u6c1I06Ozs7wdjc7PaQzsV8JNSOp7k97IDvtDPDYTdsvts6Pz8/MXCsm2PD2g/Tm+Vx0bHZHTNvjMyRyh2pajk/P0cIZEAHLLgXQLg5ckDCAFsKCwtIeHHAQGAmSnEkMAyZMBkin4lc3jBEM4a7MZgo7mBGhLD/+M1/qiCqDJflIjICYbknjlEtQEl81cBDYIaUi3aDwoEQ7mABuFMjcHOMQHLMRLSDhhlFQk4+k9IhLggZBREeVLN+NNwNCAhRwjGMimGyPJlA3owyIwiKEltWjTBHNchIGpLleIS5ITNKQHVDYRiBGUQI/83X/0XUyorhm2EKAsvT1IqFgwusgglCWARV3SuGmdNchwgiRHWQagcHIqCNJ7whJ6AI20AeUJ3A0ilP/vQJ33zzDdvNDbWkO91oAwphrah7wVGG1cHMqSHkggiwDJthmAcgjIIVg5rfWc1h2AZ7AgBLpMElMpQCUyOSX/3rr/j+9/+EGoEQTgKxKnDADRROmCiWySJBeILbMCxENVhwBISCnldm4EBEeiQRk1AJs/Y5ER2q7BX03v17SQnumDeXRqXgDaSA1cSdIExQDM+UgtoArTyMIjABJUPt4S2hRHEIgbdstV5LI4OusDvDMgMNqw3sHqi0HPcMotyRNqp5ArnmRrkLuBm4kHmjDAeEDMICk2PFMwomqjI2xYSHsJIUUnxoeBO7rdQUJ2qeJk8SLfdLGtgWCouEVzFUG7NXMAXVG1YqyDdMhSDgFuTpabUEiUguUw3AiAafbhoR4EtmpJknKArgytMaBHBmIozEIQ41M1dK7ySGEvxQ8NoI1w2WFh0XlsUaFYilJ5zhpuGKwBxXeygIqxlrE6Ih1wKPgi8L799/QGcJo4M5o9oYDfcKUZJmEFdX12zrikh2xwwrQA2KOeqETRlCGaKaUFXLpjQwy5Elu4dzflb4uw8/5MXP/wEsE6ORVX8hbVRzTVcN4ic/ec4HH3zA7XaTC1sQtZUXAm98Z7I7uvjii8+5ePw4pUiwu7TXuogM3cX7j/jhX/yIJz948gf/NPjll1/yy1/+E//z299RCGrL+AxI8krQfhk5Ab+6LmrGyDA1dvfkqOvXNzy7fMonn7w8umjafabmsDuowPPnz3nz5joLiN9VCwIqJDGHweixV59/weNHF4itZSMJbGq61kg3h3N2fs7D9x7jIdTwIzw3tCxrZo560U5U8frNFdu6URWJS8RmRukto3smv07uxwJrMa9uLDJCG1ZKI87AWJBvhEOsG9WEhSVcWBtu1A615da2kboiPaRW4hSRcBGEClhg0cTDycWdJR1XgUdkrN2hRqslGapydo+fffgRL37+Ir1opzrrJHZDAiB49vySv/3gp9zcRiqLCpsrjSLrnpQ27KH8/ItXPHz4PtRbRMoTajrBw6Hk4o8vLvjhj/6SH/w/wf/xx//I629/u9fPjkxLIZfVwmLwWBhQqUqgU1NZlCrkQVRwGW9urrl89pRPXr78gw27vHzO9dVVI2cIOYVIGHkrYXVDUQaPvXrFo4tHbFV7dnkjzGT+5BjXwnK/cPHovcRLI9hME3ZeM2+HtRwQAVdXb1ivr6ldzfYC3sSnPFAUZHW+HE7WtqamZL07avrcnYgKKtR6m/VKQTR9n0JQjZj7KqD2LCLY2h4quqsKNUWA5BQPatjAY1hTpuAO2iqlGLV1EQJ8C87vnfOzjz7ixS8+5vf93y+sFeZnl5f89K//htttw1bAW5d05rAK90awjOD//BUPHtynblmInXStyUHJR3jw3sV7/PjpU548eXJArvZ/gv/Fx7/g9bfftug4NfVKa7byd8pN9ZT5I9rFSM/wSPFXrOn5Tby5vubp0x/z8uU/t1Jx5/H9v3b3/q4YGJfPLrl+c0Pde8lgEWxN0znG1jG6e+zfXnHvwQNETdmMINqlSEeZJ1Dvn93j4uJiL+6jv8TQO9L6lya9f/fta26228wodVwZboFU2gLbqbqglZLarzTbdpvBEhWxNJI1bq5uuV6/SRCHt35AyAwPo5aKZzlIHRb5SqTR1nRSnitQtC4phNlyqvlTppRUlmZEQJizhCErbYSa57J8SNkLRm3s7RV54AHymjK9cYjUyg+wqV8XRCtfdzea+IZiFIoSsFKBEm1SE26SpXZCeDh7g9P64R4SrU2ZkC1btea5TMDsqCJ5UfUuZwO1BlnZ6tkgrWWWqjOgqhJmsLWa2dowsKZK0nuKlMWokWWBoBIeiJpZF6CqhtnMdHSHW6PdZLfijjISu2HX11dEjURrTza3BtymzaLV5NZwEGQYW4ekaLdCkXSDRCkidr2n/XKGUlOKjxc6oXZN0H4ZefXrVxQ3atTsjD1lkJpIDNEwlSCRZ53rp4zViNiQtqwEStHT1YoUOaclSY1MmmjXCelNz2Q1T5L/7LPPYDEePXqYNa0ENHnd7xeKKUFiAO2HBM97DZMoS1prMmQLrqCE8uZHIgVDNAFpFEW7BnGKWQtnYJ6GOmL54+99D0JEzfT1alRzikHtda+1/4nsxk/VqQZmlXXzJMUiqFu7nrJMe8v2LhteteuAvEcrVqk1m+Owdn9h7ZYSE6WAIrkjPCVIFua8s0jhWHfhZ5YZZ6rZNxoplZp3clg2uUSKAcmwYpgqUs1iFI5Z4rr3mliq3IVqVDbwM9CGkao1rN1IR6F4xepCEFht1wAhIKjRNH0Dv6ym5lHrEQw8JSlUtapghHJ+qiK13OyZ6yyf/sunSYqyVuPavVVq3bvSgrKxcKVGU7/s1U5ovXz1W5v9ftPVet68cbSehRo65ZNfUuB/AWHLchVUWJtFAAAAAElFTkSuQmCC);
+ display: none;
+}
+</style><template id="quad-stack-view-template">
+ <div id="header"></div>
+ <input id="stacking-distance-slider" max="400" min="1" step="1" type="range"/>
+
+ <canvas id="canvas"></canvas>
+ <img id="chrome-left"/>
+ <img id="chrome-mid"/>
+ <img id="chrome-right"/>
+</template><style>
+* /deep/ tr-ui-e-chrome-cc-layer-tree-quad-stack-view {
+ position: relative;
+}
+
+* /deep/ tr-ui-e-chrome-cc-layer-tree-quad-stack-view > top-controls {
+ -webkit-flex: 0 0 auto;
+ background-image: -webkit-gradient(linear,
+ 0 0, 100% 0,
+ from(#E5E5E5),
+ to(#D1D1D1));
+ border-bottom: 1px solid #8e8e8e;
+ border-top: 1px solid white;
+ display: flex;
+ flex-flow: row wrap;
+ flex-direction: row;
+ font-size: 14px;
+ padding-left: 2px;
+ overflow: hidden;
+}
+
+* /deep/ tr-ui-e-chrome-cc-layer-tree-quad-stack-view >
+ top-controls input[type='checkbox'] {
+ vertical-align: -2px;
+}
+
+* /deep/ tr-ui-e-chrome-cc-layer-tree-quad-stack-view > .what-rasterized {
+ color: -webkit-link;
+ cursor: pointer;
+ text-decoration: underline;
+ position: absolute;
+ bottom: 10px;
+ left: 10px;
+}
+
+* /deep/ tr-ui-e-chrome-cc-layer-tree-quad-stack-view > #input-event {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAMnwAADJ8BPja39wAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAyNSURBVHic7Z1PTCPXHcc/4wWWVbJN2cJSLVqiQJuGpoIGEVWReoBNIlIF5RCRSysOK9EbksUeOHLIIQcULbLEEYk7oqduD6gSRoqUEyK7dCOabOHghCiAE/JntQtesHt4fuM3z2+MZzy2x8ZfaTTjN+Px4/fh9/7Pb6xMJkND4VGk2hloyKkGkJCpASRkagAJmRpAQqYGkJCpASRkaqp2BvzKsizf3w1z38sKc+ZUaQCuAFeB57P7q4AF/Kxsj4GnLrfL+6PDYofQAskCaAJ6gJeB6+QAFOvZpwgwPwOHwCNgN5uu/+H252raJHRALMu6ggDwCtALNAf8E88QUL5AAHqSTVcNUTU4oQBiWVYzMIiA0E3lGhtp4CsEnPtACgFDGqXiYKoKxLKsCPAaMIwojlzV1tZGV1cXHR0ddHR00N7ebh93dHQAcHh4aG/JZNI+3tvb4+jo6LzsPAY+QYA5Ix9KBsoPpmpALMt6BXgTaHe7pre3l5GREUZGRujv7/fdsspkMmxtbRGPx4nH4+zs7BS6/HtgHfgvOW9xeE05bVZxIJZldQNvATf1c5FIhMHBQYaHh7l16xbd3d1lyUMikWBtbY319XU2NzdJp9Omy74B1oAEAoa8yIZTDttVDIhlWZeB94Dfm86Pjo4SjUbLBsFNiUSCWCzG6uqq2yVfAv9CNKHTlNlbKgLEsqxrwF+BX+nnhoaGuHPnDv39/WXPRyFtbW1x9+5dNjY2TKePgBXgOwQUFUyg3lJ2IJZl9QAfAK1qek9PD9PT04yMjJT1970qHo8zPz/P7u6ufuoE+CewQw6Kw2OCsGVZgViW9SdgFNGLBqC1tZWZmRnGx8eJRMI5lJZOp1lZWWFubo7j42P1VAZR4W8gWmJn5KBAAEVYWYBkm7PvIvoWtjo7O1lYWKCvry/w3yyHtre3mZqaYn9/Xz/1EPg3ot+iQslQIpTAgWRh/A0x5GFrYGCAWCxGe7trKzeUSiaTRKNRHjx4oJ/6CvgHoigLDEo5yox30WCMjY2xtLRUczAA2tvbWVpaYmxsTD91E3gbMbTTBFxCFM0WYPntMwXqIdk64x3lM9FolMnJycB+o5paXFwkFovplfcniDrlNLvJXr4vTwnMQ7KtqVE1rZ5gAExOThKNRvXkPyMGQaWXlOQpgQDJ9jM+QGlNjY2N1RUMqcnJSb34shClwnVE8aVCAY9QSi6ysj3wv6N0+gYGBlhaWqKlpaWke4dVqVSK27dv6xX9j8AyYpDyGaL4svsqxdo5CA95DwVGZ2cnsVisbmEAtLS0EIvF6OzsVJNfQIzRlVTJlwQkO1Boj021traysLBQk60pr2pvb2dhYYHWVscAxEuI1pcKJYIHKKV6yFvqh5mZmZrp9AWhvr4+ZmZm9OQ3MAMpSr6BZOcz7CH0np4exsfH/d6uZjU+Pk5Pj6PbdR34LT69xBeQbG/8TTVteno6tGNT5VQkEmF6elpPfh24TK7VFaFIKH4t+BrKTN/Q0FDoRm0rqZGREYaGhtSkXyDqVs9Fl2cg2QUJw2ranTt3vN6m7mSwwR8R68dULzm31eXHQwZRFiSMjo5WfXIpDOrv72d01DFQcQXoQ3hI0V7iB8gr9pcjEdNQwoVVNBrV69EXcanccfEST0Cyi9jsSe/BwcGKz4GHWd3d3QwOOqaAOoDnMFfuRnn1kJfV7wwPD3v8ev1Ls4mF+Ac2FVsW5C8aLxpI9ou/U9Nu3brlOcP1LoNNbuJej+R5ihcPaQJ+Iz/09vY2iiuDuru76e3tVZN+jeiTyFHggsWWFyA9KAufL3K/4zxptrkE3MClYkcDUxQQU3HVAOIug226yHlIXvNXrUe8eEiHPGhra2v0PQqov7+ftrY2NekFzEVWSXWI3Rns6uoq6ZGyepdlWXR1dalJrRTwEFVegFyVB3L5f0Pu0mzUirC1CsPoJcUCuYLyGFkDyPnSbBQhB8VUZNm99nOBZC+8qqZdhBnBUmWw0RXMQHx5iOPpprB5yMbGBp999lm1s+GQwUZXKFBUSRULxOEhYQNy//59Hj58WO1sOOQCpGAfBOoESBhVwENMm61in/cOXRt3f3+f09NTAH766SdaWlrY29sDoLm5mevXr1cze25y9QypYoH8rH44PDwsIU/B6KOPPrLzcXBwQCQS4dNPPwXgxo0bfPzxx9XMnslGJ7h7hkX2GZOaBRKLxezjxcVFLl++zMTERBVz5JTBRseGy3zXIaEDEna5eAgENIX7WP2QTCaL/NrFlcFG0kMKLvIttsh6ilg83ATh85D3338/dGNrmo3SiAXYuvLgeImX9Rj4peHHqq5r165VOwt50mx0gjkqhJT92cvgol2P7O3thSa+VBiVyWTsJnhWsv4wBrZR5QWIjfzo6IitrS0vebxQ2tra0oPdPCbfQ4ze4gXII/VDPB73k9cLIYNtDnACUJ9td8gLkF2UiqkBxF2abc6AJOboD3lQzgWi1BWnCCgA7OzskEgk/Oa5bpVIJPTwT9+RCymoe4jvIkt+8Qs1cW1tzVem61kGm8jiKk1+gIE8eV25+Ihc3CjW19c9fr3+pdkkgwCiwsiL+oDyUKhXIE8QISUA2NzcbBRbihKJBJubm2rSD4h4KLLuOMMQRUiVn9XvdrGVTqcdg3wXXbFYTI9Op3qHuqlQHCoKSNadJNH7KGNbq6urjT4Jou+hRaVLIUoTE4zA6hD5Q5+oCXfv3vVxm/qSwQY7iG6C9BAZByWv6auOevgBIr3ke5mwsbFxofsl8XhcDw34BPgaYXg1KI0p6JlDRQPRiq0zRGQ1W/Pz827RPeta6XSa+fl5Pfl/5LxC3QrCAP9P4WYQcW2/kQm7u7usrKz4vF3tamVlRY/P+CPwLTlvcANiDN/kCYjiJXLv6AXNzc2xvb3t5ZY1re3tbebm5vRk2Vc7JReExgTDqFI8JIMIMvylTDw+PmZqaupCzCgmk0mmpqb0IJkHiLpV9Ypn5MA4oJimMDwD0eqSDCLIsD3WvL+/TzQaJZVKeb11zSiVShGNRvXgmE+Az8kVU8+UrSjvgNKCz8jxmaeIIMNyEoYHDx4wOztbwq3DrdnZWT1W1imi5XmCE0YKlyLLbYLPFxDlZhLKd4ggw/aJe/fusbi46Of2odbi4iL37t1TkzLAfxAzqmc4PcPkIQVVqofIfRrREVpXL4jFYnUFRQbB1PQIMZsqYaSUraiWlaqSQvxlV3rIFd2XEIsm/gL8Qb1ubGyMDz/8sGajzKVSKWZnZ3XPANHs/xxh+BSiyDrObifkirCiiisIDogK5TIwjvY6ijoMpHwEbCJAPCMHQIWhxl4sKmxsEEEwwQmlCQHlbeBV9do6CjX+DbBNDobqHSYYRQfCLDnimKEZfJbN0CpiENLOxf7+PhMTEywvL4d6mCWdTrO8vMzExIQOI4Pod31OPowTzHWHpz80kMjWyqpB6SXSU5oRQYbfARwVSA2+ruIU0ZrSK/ATnEBky8oxqlusnQMLNa4VXRa5Sr4JEYdwDPG8tkM18kKXJ+TmgWQ/Q3qDDsNTJa4r6NjvkA/lEsJTnkdEMX3J9N0Qv/LoAFFEyRaTbFFJGPK4ZBhQntdVgDuUZkTr6w2E1zgUspeC/YjoY3yPczgkZdhk568kGFC+F7qAE4qsU2S90owIpfo6ImCkUVV6bd4TxHzGtzgnmNThEN0rHK0pSngFUtleeeQCRa1XmhHN41eBAcRDka6qwIslU4jRhq/Jn8tQh0HUitttWtb3YvRyv4MKck8MyUeCZRGmeosMGPkiIshNpR72yCCW6hwgFiTI1pE0tDS6abDQ87BIMarEW9rAGUFNNot1MHL/HCIs3k1E8K9LAWfpDDEYepDd5Lopdc5b9Qx9r14nx/EgABhQASCQ109RizAdjApH9vhvIOJNvYCIFyJjhhSjNLlm6WMEgCS5tbbqAjbTlKsKwwTCHmCtmfcY2j/khCL3auwPNXyRGqOwifzQRq2IYk7dwDl8cYwwpjoqrRrSDYYKpdCaqpLrC5Oq8S5c+xCzx+hwTJtbEBdT3aMbUBpVXWvrtsnz+op1CNArVFXlbdEu3mICowJS9+cBsR/Exx2IaQG0af1tHggI1itUVft96vahsi/kOabPxQCRe93IaW3TAVQMhFRVgdiZMIORexOgQiDkXv3DdAObPMYIgAqBkAoFECmtJ+4Gp9Ax2rEORe51w+sQ7OOK17FhAqLKBY567AbBTSY4rsfVsktogagqACfvUpd0tz/SkR4GW9QEEFVBhtAI499ec0DqXf8H8f4X10jf2YAAAAAASUVORK5CYII=);
+ display: none;
+}
+</style><template id="tr-ui-e-chrome-cc-layer-tree-quad-stack-view-template">
+ <img id="input-event"/>
+</template><style>
+* /deep/ tr-ui-e-chrome-cc-layer-view{-webkit-flex-direction:column;display:-webkit-flex;left:0;position:relative;top:0}* /deep/ tr-ui-e-chrome-cc-layer-view>tr-ui-e-chrome-cc-layer-tree-quad-stack-view{-webkit-flex:1 1 100%;-webkit-flex-direction:column;min-height:0;display:-webkit-flex;width:100%}* /deep/tr-ui-e-chrome-cc- layer-view>tr-ui-e-chrome-cc-layer-view-analysis{height:150px;overflow-y:auto}* /deep/ tr-ui-e-chrome-cc-layer-view>tr-ui-e-chrome-cc-layer-view-analysis *{-webkit-user-select:text}
+</style><style>
+* /deep/ .tr-ui-e-chrome-cc-lthi-s-view{-webkit-flex:1 1 auto!important;-webkit-flex-direction:row;display:-webkit-flex}* /deep/ .tr-ui-e-chrome-cc-lthi-s-view>tr-ui-e-chrome-cc-layer-picker{-webkit-flex:1 1 auto}* /deep/ .tr-ui-e-chrome-cc-lthi-s-view>tr-ui-b-drag-handle{-webkit-flex:0 0 auto}
+</style><style>
+* /deep/ tr-ui-e-chrome-cc-picture-ops-chart-summary-view{-webkit-flex:0 0 auto;font-size:0;margin:0;min-height:200px;min-width:200px;overflow:hidden;padding:0}* /deep/ tr-ui-e-chrome-cc-picture-ops-chart-summary-view.hidden{display:none}
+</style><style>
+* /deep/ tr-ui-e-chrome-cc-picture-ops-chart-view{display:block;height:180px;margin:0;padding:0;position:relative}* /deep/ tr-ui-e-chrome-cc-picture-ops-chart-view>.use-percentile-scale{left:0;position:absolute;top:0}
+</style><template id="tr-ui-e-chrome-cc-picture-debugger-template">
+ <style>
+ * /deep/ tr-ui-e-chrome-cc-picture-debugger {
+ -webkit-flex: 1 1 auto;
+ -webkit-flex-direction: row;
+ display: -webkit-flex;
+ }
+
+ * /deep/ tr-ui-e-chrome-cc-picture-debugger > tr-ui-a-generic-object-view {
+ -webkit-flex-direction: column;
+ display: -webkit-flex;
+ width: 400px;
+ }
+
+ * /deep/ tr-ui-e-chrome-cc-picture-debugger > left-panel {
+ -webkit-flex-direction: column;
+ display: -webkit-flex;
+ min-width: 300px;
+ }
+
+ * /deep/ tr-ui-e-chrome-cc-picture-debugger > left-panel > picture-info {
+ -webkit-flex: 0 0 auto;
+ padding-top: 2px;
+ }
+
+ * /deep/ tr-ui-e-chrome-cc-picture-debugger > left-panel >
+ picture-info .title {
+ font-weight: bold;
+ margin-left: 5px;
+ margin-right: 5px;
+ }
+
+ * /deep/ tr-ui-e-chrome-cc-picture-debugger > tr-ui-b-drag-handle {
+ -webkit-flex: 0 0 auto;
+ }
+
+ * /deep/ tr-ui-e-chrome-cc-picture-debugger .filename {
+ -webkit-user-select: text;
+ margin-left: 5px;
+ }
+
+ * /deep/ tr-ui-e-chrome-cc-picture-debugger > right-panel {
+ -webkit-flex: 1 1 auto;
+ -webkit-flex-direction: column;
+ display: -webkit-flex;
+ }
+
+ * /deep/ tr-ui-e-chrome-cc-picture-debugger > right-panel >
+ tr-ui-e-chrome-cc-picture-ops-chart-view {
+ min-height: 150px;
+ min-width : 0;
+ overflow-x: auto;
+ overflow-y: hidden;
+ }
+
+ /*************************************************/
+
+ * /deep/ tr-ui-e-chrome-cc-picture-debugger raster-area {
+ background-color: #ddd;
+ min-height: 200px;
+ min-width: 200px;
+ overflow-y: auto;
+ padding-left: 5px;
+ }
+ </style>
+
+ <left-panel>
+ <picture-info>
+ <div>
+ <span class="title">Skia Picture</span>
+ <span class="size"></span>
+ </div>
+ <div>
+ <input class="filename" type="text" value="skpicture.skp"/>
+ <button class="export">Export</button>
+ </div>
+ </picture-info>
+ </left-panel>
+ <right-panel>
+ <tr-ui-e-chrome-cc-picture-ops-chart-view>
+ </tr-ui-e-chrome-cc-picture-ops-chart-view>
+ <raster-area><canvas></canvas></raster-area>
+ </right-panel>
+</template><style>
+* /deep/ .tr-ui-e-chrome-cc-picture-snapshot-view{-webkit-flex:0 1 auto!important;display:-webkit-flex}
+</style><dom-module id="tr-ui-a-stack-frame">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ font-size: 12px;
+ }
+ </style>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-ui-a-single-event-sub-view">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ flex: 0 1;
+ flex-direction: column;
+ }
+ #table {
+ flex: 0 1 auto;
+ align-self: stretch;
+ font-size: 12px;
+ }
+ </style>
+ <tr-ui-b-table id="table">
+ </tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-ui-e-chrome-cc-raster-task-view">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ flex-direction: column;
+ }
+ #heading {
+ flex: 0 0 auto;
+ }
+ tr-ui-b-table {
+ font-size: 12px;
+ }
+ </style>
+
+ <div id="heading">
+ Rasterization costs in
+ <tr-ui-a-analysis-link id="link"></tr-ui-a-analysis-link>
+ </div>
+ <tr-ui-b-table id="content"></tr-ui-b-table>
+ </template>
+</dom-module><style>
+.tr-ui-e-chrome-gpu-state-snapshot-view{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAAZiS0dEAEwATABMYqp3KAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB90JCQsBMCH7ZqYAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAUElEQVRYw+3WwQkAIAiF4Vc0hTO5/wiuURvYIcQOv1cRPhDlDXffSsrMsrYiQi/zU80FAACAVX3nt3lWAABA/x+ovnPyAAAA5AHyAAAA3wMOd34Xd+lsglgAAAAASUVORK5CYII=);display:-webkit-flex;overflow:auto}.tr-ui-e-chrome-gpu-state-snapshot-view img{display:block;margin:16px auto 16px auto}
+</style><dom-module id="tr-ui-a-layout-tree-sub-view">
+ <template>
+ <style>
+ tr-ui-b-table {
+ font-size: 12px;
+ }
+ </style>
+ <div id="content"></div>
+ </template>
+</dom-module><dom-module id="tr-ui-e-s-frame-data-side-panel">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ width: 600px;
+ flex-direction: column;
+ }
+ table-container {
+ display: flex;
+ overflow: auto;
+ font-size: 12px;
+ }
+ </style>
+ <div>
+ Organize by:
+ <select id="select">
+ <option value="none">None</option>
+ <option value="tree">Frame Tree</option>
+ </select>
+ </div>
+ <table-container>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </table-container>
+ </template>
+</dom-module><dom-module id="tr-ui-b-chart-legend-key">
+ <template>
+ <style>
+ #checkbox {
+ margin: 0;
+ visibility: hidden;
+ vertical-align: text-top;
+ }
+ #label, #link {
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ display: inline-block;
+ }
+ </style>
+
+ <input checked="" id="checkbox" type="checkbox"/>
+ <tr-ui-a-analysis-link id="link"></tr-ui-a-analysis-link>
+ <label id="label"></label>
+ </template>
+</dom-module><style>
+ * /deep/ .chart-base {
+ -webkit-user-select: none;
+ cursor: default;
+ }
+
+ * /deep/ .chart-base .axis path,
+ * /deep/ .chart-base .axis line {
+ fill: none;
+ shape-rendering: crispEdges;
+ stroke: #000;
+ }
+</style><template id="chart-base-template">
+ <svg>
+ <g id="chart-area" xmlns="http://www.w3.org/2000/svg">
+ <g class="x axis"></g>
+ <g class="y axis"></g>
+ <text id="title"></text>
+ </g>
+ </svg>
+</template><style>
+ * /deep/ .chart-base-2d.updating-brushing-state #brushes > * {
+ fill: rgb(103, 199, 165)
+ }
+
+ * /deep/ .chart-base-2d #brushes {
+ fill: rgb(213, 236, 229)
+ }
+</style><dom-module id="tr-ui-e-s-input-latency-side-panel">
+ <template>
+ <style>
+ :host {
+ flex-direction: column;
+ display: flex;
+ }
+ toolbar {
+ flex: 0 0 auto;
+ border-bottom: 1px solid black;
+ display: flex;
+ }
+ result-area {
+ flex: 1 1 auto;
+ display: block;
+ min-height: 0;
+ overflow-y: auto;
+ }
+ </style>
+
+ <toolbar id="toolbar"></toolbar>
+ <result-area id="result_area"></result-area>
+ </template>
+</dom-module><dom-module id="tr-ui-b-heading">
+ <template>
+ <style>
+ :host {
+ background-color: rgb(243, 245, 247);
+ border-right: 1px solid #8e8e8e;
+ display: block;
+ height: 100%;
+ margin: 0;
+ padding: 0 5px 0 0;
+ }
+
+ heading {
+ display: block;
+ overflow-x: hidden;
+ text-align: left;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+
+ #arrow {
+ -webkit-flex: 0 0 auto;
+ font-family: sans-serif;
+ margin-left: 5px;
+ margin-right: 5px;
+ width: 8px;
+ }
+
+ #link, #heading_content {
+ display: none;
+ }
+ </style>
+ <heading id="heading" on-click="onHeadingDivClicked_">
+ <span id="arrow"></span>
+ <span id="heading_content"></span>
+ <tr-ui-a-analysis-link id="link"></tr-ui-a-analysis-link>
+ </heading>
+ </template>
+</dom-module><style>
+.track-button{background-color:rgba(255,255,255,0.5);border:1px solid rgba(0,0,0,0.1);color:rgba(0,0,0,0.2);font-size:10px;height:12px;text-align:center;width:12px}.track-button:hover{background-color:rgba(255,255,255,1.0);border:1px solid rgba(0,0,0,0.5);box-shadow:0 0 .05em rgba(0,0,0,0.4);color:rgba(0,0,0,1)}.track-close-button{left:2px;position:absolute;top:2px}.track-collapse-button{left:3px;position:absolute;top:2px}
+</style><style>
+.object-instance-track{height:18px}
+</style><style>
+.tr-ui-e-system-stats-instance-track{height:500px}.tr-ui-e-system-stats-instance-track ul{list-style:none;list-style-position:outside;margin:0;overflow:hidden}
+</style><style>
+.tr-ui-e-system-stats-snapshot-view .subhead{font-size:small;padding-bottom:10px}.tr-ui-e-system-stats-snapshot-view ul{background-position:0 5px;background-repeat:no-repeat;cursor:pointer;font-family:monospace;list-style:none;margin:0;padding-left:15px}.tr-ui-e-system-stats-snapshot-view li{background-position:0 5px;background-repeat:no-repeat;cursor:pointer;list-style:none;margin:0;padding-left:15px}
+</style><dom-module id="tr-ui-e-v8-gc-objects-stats-table">
+ <template>
+ <style>
+ tr-ui-b-table {
+ flex: 0 0 auto;
+ align-self: stretch;
+ margin-top: 1em;
+ font-size: 12px;
+ }
+ .diff {
+ display: inline-block;
+ margin-top: 1em;
+ margin-left: 0.8em;
+ }
+ </style>
+ <div class="diff" id="diffOption">
+ Diff
+ </div>
+ <tr-ui-b-table id="diffTable"></tr-ui-b-table>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-ui-e-multi-v8-gc-stats-thread-slice-sub-view">
+ <template>
+ <style>
+ </style>
+ <tr-ui-e-v8-gc-objects-stats-table id="gcObjectsStats">
+ </tr-ui-e-v8-gc-objects-stats-table>
+ </template>
+</dom-module><dom-module id="tr-ui-e-v8-ic-stats-table">
+ <template>
+ <style>
+ tr-ui-b-table {
+ flex: 0 0 auto;
+ align-self: stretch;
+ margin-top: 1em;
+ font-size: 12px;
+ }
+ #total {
+ margin-top: 1em;
+ margin-left: 0.8em;
+ }
+ #groupOption {
+ display: inline-block;
+ margin-top: 1em;
+ margin-left: 0.8em;
+ }
+ </style>
+ <div style="padding-right: 200px">
+ <div style="float:right; border-style: solid; border-width: 1px; padding:20px">
+ 0 uninitialized<br/>
+ . premonomorphic<br/>
+ 1 monomorphic<br/>
+ ^ recompute handler<br/>
+ P polymorphic<br/>
+ N megamorphic<br/>
+ G generic
+ </div>
+ </div>
+ <div id="total">
+ </div>
+ <div id="groupOption">
+ Group Key
+ </div>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-ui-e-multi-v8-ic-stats-thread-slice-sub-view">
+ <template>
+ <tr-ui-e-v8-ic-stats-table id="table">
+ </tr-ui-e-v8-ic-stats-table>
+ </template>
+</dom-module><dom-module id="tr-ui-e-v8-runtime-call-stats-table">
+ <template>
+ <style>
+ #table {
+ flex: 0 0 auto;
+ align-self: stretch;
+ margin-top: 1em;
+ font-size: 12px;
+ }
+ </style>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-ui-e-multi-v8-thread-slice-sub-view">
+ <template>
+ <tr-ui-a-multi-thread-slice-sub-view id="content"></tr-ui-a-multi-thread-slice-sub-view>
+ <tr-ui-e-v8-runtime-call-stats-table id="runtimeCallStats"></tr-ui-e-v8-runtime-call-stats-table>
+ </template>
+</dom-module><dom-module id="tr-ui-e-single-v8-gc-stats-thread-slice-sub-view">
+ <template>
+ <tr-ui-a-single-event-sub-view id="content"></tr-ui-a-single-event-sub-view>
+ <tr-ui-e-v8-gc-objects-stats-table id="gcObjectsStats"></tr-ui-e-v8-gc-objects-stats-table>
+ </template>
+</dom-module><dom-module id="tr-ui-e-single-v8-ic-stats-thread-slice-sub-view">
+ <template>
+ <tr-ui-e-v8-ic-stats-table id="table">
+ </tr-ui-e-v8-ic-stats-table>
+ </template>
+</dom-module><dom-module id="tr-ui-e-single-v8-thread-slice-sub-view">
+ <template>
+ <tr-ui-a-single-thread-slice-sub-view id="content"></tr-ui-a-single-thread-slice-sub-view>
+ <tr-ui-e-v8-runtime-call-stats-table id="runtimeCallStats"></tr-ui-e-v8-runtime-call-stats-table>
+ </template>
+</dom-module><dom-module id="tr-ui-a-alert-sub-view">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ flex-direction: column;
+ }
+ #table {
+ flex: 1 1 auto;
+ align-self: stretch;
+ font-size: 12px;
+ }
+ </style>
+ <tr-ui-b-table id="table">
+ </tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-ui-b-tab-view">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ flex-direction: column;
+ }
+
+ #selection_description, #tabs {
+ font-size: 12px;
+ }
+
+ #selection_description {
+ display: inline-block;
+ font-weight: bold;
+ margin: 9px 0px 4px 20px;
+ }
+
+ #tabs {
+ flex: 0 0 auto;
+ border-top: 1px solid #8e8e8e;
+ border-bottom: 1px solid #8e8e8e;
+ background-color: #ececec;
+ overflow: hidden;
+ margin: 0;
+ }
+
+ #tabs input[type=radio] {
+ display: none;
+ }
+
+ #tabs tab label {
+ cursor: pointer;
+ display: inline-block;
+ border: 1px solid #ececec;
+ margin: 5px 0px 0px 15px;
+ padding: 3px 10px 3px 10px;
+ }
+
+ #tabs tab label span {
+ font-weight: bold;
+ }
+
+ #tabs:focus input[type=radio]:checked ~ label {
+ outline: dotted 1px #8e8e8e;
+ outline-offset: -2px;
+ }
+
+ #tabs input[type=radio]:checked ~ label {
+ background-color: white;
+ border: 1px solid #8e8e8e;
+ border-bottom: 1px solid white;
+ }
+
+ #subView {
+ flex: 1 1 auto;
+ overflow: auto;
+ }
+ </style>
+ <div hidden="[[tabsHidden]]" id="tabs">
+ <label id="selection_description">[[label_]]</label>
+ <template is="dom-repeat" items="[[subViews_]]">
+ <tab>
+ <input checked="[[isChecked_(item)]]" id$="[[computeRadioId_(item)]]" name="tabs" on-change="onTabChanged_" type="radio"/>
+ <label for$="[[computeRadioId_(item)]]">
+ <template if="[[item.tabIcon]]" is="dom-if">
+ <span style$="[[item.tabIcon.style]]">[[item.tabIcon.text]]</span>
+ </template>
+ [[item.tabLabel]]
+ </label>
+ </tab>
+ </template>
+ </div>
+ <div id="subView"></div>
+ <content>
+ </content>
+ </template>
+</dom-module><dom-module id="tr-ui-a-memory-dump-heap-details-breakdown-view">
+ <template>
+ <tr-ui-b-tab-view id="tabs"></tr-ui-b-tab-view>
+ </template>
+</dom-module><dom-module id="tr-ui-a-memory-dump-heap-details-breakdown-view-tab">
+ <template>
+ <tr-v-ui-scalar-context-controller></tr-v-ui-scalar-context-controller>
+ <tr-ui-b-info-bar hidden="" id="info"></tr-ui-b-info-bar>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-ui-a-memory-dump-heap-details-path-view">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ flex-direction: column;
+ }
+ </style>
+ <tr-v-ui-scalar-context-controller></tr-v-ui-scalar-context-controller>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-ui-a-memory-dump-heap-details-pane">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ flex-direction: column;
+ }
+
+ #header {
+ flex: 0 0 auto;
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+
+ background-color: #eee;
+ border-bottom: 1px solid #8e8e8e;
+ border-top: 1px solid white;
+ }
+
+ #label {
+ flex: 1 1 auto;
+ padding: 8px;
+ font-size: 15px;
+ font-weight: bold;
+ }
+
+ #view_mode_container {
+ display: none;
+ flex: 0 0 auto;
+ padding: 5px;
+ font-size: 15px;
+ }
+
+ #contents {
+ flex: 1 0 auto;
+ align-self: stretch;
+ font-size: 12px;
+ }
+
+ #info_text {
+ padding: 8px;
+ color: #666;
+ font-style: italic;
+ text-align: center;
+ }
+
+ #split_view {
+ display: none; /* Hide until memory allocator dumps are set. */
+ flex: 1 0 auto;
+ align-self: stretch;
+ flex-direction: row;
+ }
+
+ #path_view {
+ width: 50%;
+ }
+
+ #breakdown_view {
+ flex: 1 1 auto;
+ width: 0;
+ }
+
+ #path_view, #breakdown_view {
+ overflow-x: auto; /* Show scrollbar if necessary. */
+ }
+ </style>
+ <div id="header">
+ <div id="label">Heap details</div>
+ <div id="view_mode_container">
+ <span>View mode:</span>
+
+ </div>
+ </div>
+ <div id="contents">
+ <tr-ui-b-info-bar hidden="" id="info_bar">
+ </tr-ui-b-info-bar>
+
+ <div id="info_text">No heap dump selected</div>
+
+ <div id="split_view">
+ <tr-ui-a-memory-dump-heap-details-path-view id="path_view">
+ </tr-ui-a-memory-dump-heap-details-path-view>
+ <tr-ui-b-drag-handle id="drag_handle"></tr-ui-b-drag-handle>
+ <tr-ui-a-memory-dump-heap-details-breakdown-view id="breakdown_view">
+ </tr-ui-a-memory-dump-heap-details-breakdown-view>
+ </div>
+ </div>
+ </template>
+</dom-module><dom-module id="tr-ui-a-memory-dump-allocator-details-pane">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ flex-direction: column;
+ }
+
+ #label {
+ flex: 0 0 auto;
+ padding: 8px;
+
+ background-color: #eee;
+ border-bottom: 1px solid #8e8e8e;
+ border-top: 1px solid white;
+
+ font-size: 15px;
+ font-weight: bold;
+ }
+
+ #contents {
+ flex: 1 0 auto;
+ align-self: stretch;
+ font-size: 12px;
+ }
+
+ #info_text {
+ padding: 8px;
+ color: #666;
+ font-style: italic;
+ text-align: center;
+ }
+
+ #table {
+ display: none; /* Hide until memory allocator dumps are set. */
+ flex: 1 0 auto;
+ align-self: stretch;
+ font-size: 12px;
+ }
+ </style>
+ <div id="label">Component details</div>
+ <div id="contents">
+ <div id="info_text">No memory allocator dump selected</div>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </div>
+ </template>
+</dom-module><dom-module id="tr-ui-a-memory-dump-vm-regions-details-pane">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ flex-direction: column;
+ }
+
+ #label {
+ flex: 0 0 auto;
+ padding: 8px;
+
+ background-color: #eee;
+ border-bottom: 1px solid #8e8e8e;
+ border-top: 1px solid white;
+
+ font-size: 15px;
+ font-weight: bold;
+ }
+
+ #contents {
+ flex: 1 0 auto;
+ align-self: stretch;
+ font-size: 12px;
+ }
+
+ #info_text {
+ padding: 8px;
+ color: #666;
+ font-style: italic;
+ text-align: center;
+ }
+
+ #table {
+ display: none; /* Hide until memory dumps are set. */
+ flex: 1 0 auto;
+ align-self: stretch;
+ font-size: 12px;
+ }
+ </style>
+ <div id="label">Memory maps</div>
+ <div id="contents">
+ <div id="info_text">No memory maps selected</div>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </div>
+ </template>
+</dom-module><dom-module id="tr-ui-b-color-legend">
+ <template>
+ <style>
+ :host {
+ display: inline-block;
+ }
+
+ #square {
+ font-size: 150%; /* Make the square bigger. */
+ line-height: 0%; /* Prevent the square from increasing legend height. */
+ }
+ </style>
+ <span id="square"></span>
+ <span id="label"></span>
+ </template>
+</dom-module><dom-module id="tr-ui-b-view-specific-brushing-state">
+ <template></template>
+</dom-module><dom-module id="tr-ui-a-memory-dump-overview-pane">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ flex-direction: column;
+ }
+
+ #label {
+ flex: 0 0 auto;
+ padding: 8px;
+
+ background-color: #eee;
+ border-bottom: 1px solid #8e8e8e;
+ border-top: 1px solid white;
+
+ font-size: 15px;
+ font-weight: bold;
+ }
+
+ #label a {
+ font-weight: normal;
+ float: right;
+ }
+
+ #contents {
+ flex: 1 0 auto;
+ align-self: stretch;
+ font-size: 12px;
+ overflow: auto;
+ }
+
+ #info_text {
+ padding: 8px;
+ color: #666;
+ font-style: italic;
+ text-align: center;
+ }
+
+ #table {
+ display: none; /* Hide until memory dumps are set. */
+ flex: 1 0 auto;
+ align-self: stretch;
+ font-size: 12px;
+ }
+ </style>
+ <tr-ui-b-view-specific-brushing-state id="state" view-id="analysis.memory_dump_overview_pane">
+ </tr-ui-b-view-specific-brushing-state>
+ <div id="label">Overview <a href="https://chromium.googlesource.com/chromium/src/+/master/docs/memory-infra">Help</a></div>
+ <div id="contents">
+ <div id="info_text">No memory memory dumps selected</div>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </div>
+ </template>
+</dom-module><dom-module id="tr-ui-a-memory-dump-header-pane">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+
+ background-color: #d0d0d0;
+ border-bottom: 1px solid #8e8e8e;
+ border-top: 1px solid white;
+ }
+
+ #label {
+ flex: 1 1 auto;
+ padding: 6px;
+ font-size: 15px;
+ }
+
+ #aggregation_mode_container {
+ display: none;
+ flex: 0 0 auto;
+ padding: 5px;
+ font-size: 15px;
+ }
+ </style>
+
+ <div id="label"></div>
+ <div id="aggregation_mode_container">
+ <span>Metric aggregation:</span>
+
+ </div>
+ </template>
+</dom-module><dom-module id="tr-ui-a-stacked-pane-view">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ flex-direction: column;
+ }
+
+ #pane_container > * {
+ flex: 0 0 auto;
+ }
+ </style>
+ <div id="pane_container">
+ </div>
+ </template>
+</dom-module><dom-module id="tr-ui-a-container-memory-dump-sub-view">
+ <template>
+ <style>
+ tr-ui-b-table {
+ font-size: 12px;
+ }
+ </style>
+ <div id="content"></div>
+ </template>
+</dom-module><dom-module id="tr-ui-a-counter-sample-sub-view">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ flex-direction: column;
+ }
+ tr-ui-b-table {
+ font-size: 12px;
+ }
+ </style>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-ui-a-multi-event-summary-table">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ }
+ #table {
+ flex: 1 1 auto;
+ align-self: stretch;
+ font-size: 12px;
+ }
+ </style>
+ <tr-ui-b-table id="table">
+ </tr-ui-b-table>
+
+ </template>
+</dom-module><dom-module id="tr-ui-a-selection-summary-table">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ }
+ #table {
+ flex: 1 1 auto;
+ align-self: stretch;
+ font-size: 12px;
+ }
+ </style>
+ <tr-ui-b-table id="table">
+ </tr-ui-b-table>
+
+ </template>
+</dom-module><dom-module id="tr-ui-b-radio-picker">
+ <template>
+ <style>
+ :host([vertical]) #container {
+ flex-direction: column;
+ }
+ :host(:not[vertical]) #container {
+ flex-direction: row;
+ }
+ #container {
+ display: flex;
+ }
+ #container > div {
+ padding-left: 1em;
+ padding-bottom: 0.5em;
+ }
+ </style>
+ <div id="container"></div>
+ </template>
+</dom-module><dom-module id="tr-v-ui-breakdown-span">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ flex-direction: column;
+ }
+ #table_container {
+ display: flex;
+ flex: 0 0 auto;
+ }
+ #table {
+ max-height: 150px;
+ overflow-y: auto;
+ }
+ </style>
+
+ <div id="empty">(empty)</div>
+ <div id="table_container">
+ <div id="container"></div>
+ <span>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </span>
+ </div>
+ </template>
+</dom-module><dom-module id="tr-v-ui-buildbot-info-span">
+ <template>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-v-ui-collected-related-event-set-span">
+
+</dom-module><dom-module id="tr-v-ui-device-info-span">
+ <template>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-v-ui-generic-diagnostic-span">
+ <template>
+ <tr-ui-a-generic-object-view id="generic"></tr-ui-a-generic-object-view>
+ </template>
+
+
+</dom-module><dom-module id="tr-v-ui-merged-buildbot-info-span">
+ <template>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-v-ui-merged-device-info-span">
+ <template>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-v-ui-merged-revision-info-span">
+ <template>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-v-ui-merged-telemetry-info-span">
+ <template>
+ <style>
+ #hide, #table {
+ display: none;
+ }
+ </style>
+ <button id="show" on-click="onShow_">Show</button>
+ <button id="hide" on-click="onHide_">Hide</button>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-v-ui-related-event-set-span">
+
+</dom-module><dom-module id="tr-v-ui-related-histogram-map-span">
+ <template>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-v-ui-related-histogram-set-span">
+
+</dom-module><dom-module id="tr-v-ui-revision-info-span">
+ <template>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-v-ui-scalar-diagnostic-span">
+ <template>
+ <tr-v-ui-scalar-span id="scalar"></tr-v-ui-scalar-span>
+ </template>
+
+
+</dom-module><dom-module id="tr-v-ui-telemetry-info-span">
+ <template>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-v-ui-unmergeable-diagnostic-set-span">
+
+</dom-module><dom-module id="tr-v-ui-diagnostic-map-table">
+ <template>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </template>
+
+
+</dom-module><dom-module name="tr-v-ui-scalar-map-table">
+ <template>
+ <style>
+ </style>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-v-ui-histogram-span">
+ <template>
+ <style>
+ #container {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ }
+ #chart {
+ flex-grow: 1;
+ display: none;
+ }
+ #drag_handle, #sample_diagnostics_container {
+ display: none;
+ }
+ #chart svg {
+ display: block;
+ }
+ </style>
+
+ <div id="container">
+ <div id="chart"></div>
+ <div id="stats_container">
+ <tr-v-ui-scalar-map-table id="stats"></tr-v-ui-scalar-map-table>
+ </div>
+ </div>
+ <tr-ui-b-drag-handle id="drag_handle"></tr-ui-b-drag-handle>
+
+ <tr-v-ui-diagnostic-map-table id="histogram_diagnostics"></tr-v-ui-diagnostic-map-table>
+
+ <div id="sample_diagnostics_container">
+ <div id="merge_sample_diagnostics_container">
+ <input checked="" id="merge_sample_diagnostics" on-change="updateDiagnostics_" type="checkbox"/>
+ <label for="merge_sample_diagnostics">Merge Sample Diagnostics</label>
+ </div>
+ <tr-v-ui-diagnostic-map-table id="sample_diagnostics"></tr-v-ui-diagnostic-map-table>
+ </div>
+ </template>
+</dom-module><dom-module id="tr-ui-a-multi-event-sub-view">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ overflow: auto;
+ }
+ #content {
+ display: flex;
+ flex-direction: column;
+ flex: 0 1 auto;
+ align-self: stretch;
+ }
+ #content > * {
+ flex: 0 0 auto;
+ align-self: stretch;
+ }
+ #histogramContainer {
+ display: flex;
+ }
+
+ tr-ui-a-multi-event-summary-table {
+ border-bottom: 1px solid #aaa;
+ }
+
+ tr-ui-a-selection-summary-table {
+ margin-top: 1.25em;
+ border-top: 1px solid #aaa;
+ background-color: #eee;
+ font-weight: bold;
+ margin-bottom: 1.25em;
+ border-bottom: 1px solid #aaa;
+ }
+ </style>
+ <div id="content">
+ <tr-ui-a-multi-event-summary-table id="eventSummaryTable">
+ </tr-ui-a-multi-event-summary-table>
+ <tr-ui-a-selection-summary-table id="selectionSummaryTable">
+ </tr-ui-a-selection-summary-table>
+ <tr-ui-b-radio-picker id="radioPicker">
+ </tr-ui-b-radio-picker>
+ <div id="histogramContainer">
+ <tr-v-ui-histogram-span id="histogramSpan">
+ </tr-v-ui-histogram-span>
+ </div>
+ </div>
+ </template>
+</dom-module><dom-module id="tr-ui-a-related-events">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ flex-direction: column;
+ }
+ #table {
+ flex: 1 1 auto;
+ align-self: stretch;
+ font-size: 12px;
+ }
+ </style>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-ui-a-multi-async-slice-sub-view">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ }
+ #container {
+ display: flex;
+ flex: 1 1 auto;
+ }
+ #events {
+ margin-left: 8px;
+ flex: 0 1 200px;
+ }
+ </style>
+ <div id="container">
+ <tr-ui-a-multi-event-sub-view id="content"></tr-ui-a-multi-event-sub-view>
+ <div id="events">
+ <tr-ui-a-related-events id="relatedEvents"></tr-ui-a-related-events>
+ </div>
+ </div>
+ </template>
+</dom-module><dom-module id="tr-ui-a-multi-cpu-slice-sub-view">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ }
+ #content {
+ flex: 1 1 auto;
+ }
+ </style>
+ <tr-ui-a-multi-event-sub-view id="content"></tr-ui-a-multi-event-sub-view>
+ </template>
+</dom-module><dom-module id="tr-ui-a-multi-flow-event-sub-view">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ }
+ </style>
+ <tr-ui-a-multi-event-sub-view id="content"></tr-ui-a-multi-event-sub-view>
+ </template>
+</dom-module><dom-module id="tr-ui-a-multi-instant-event-sub-view">
+ <template>
+ <style>
+ :host {
+ display: block;
+ }
+ </style>
+ <div id="content"></div>
+ </template>
+</dom-module><dom-module id="tr-ui-a-multi-object-sub-view">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ font-size: 12px;
+ }
+ </style>
+ <tr-ui-b-table id="content"></tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-ui-a-frame-power-usage-chart">
+ <template>
+ <div id="content"></div>
+ </template>
+</dom-module><dom-module id="tr-ui-a-power-sample-summary-table">
+ <template>
+ <style>
+ tr-ui-b-table {
+ font-size: 12px;
+ }
+ </style>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-ui-a-multi-power-sample-sub-view">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ flex-direction: row;
+ }
+ #tables {
+ display: flex;
+ flex-direction: column;
+ width: 50%;
+ }
+ #chart {
+ width: 50%;
+ }
+ </style>
+ <div id="tables">
+ <tr-ui-a-power-sample-summary-table id="summaryTable">
+ </tr-ui-a-power-sample-summary-table>
+ </div>
+ <tr-ui-a-frame-power-usage-chart id="chart">
+ </tr-ui-a-frame-power-usage-chart>
+ </template>
+</dom-module><dom-module id="tr-ui-a-multi-sample-sub-view">
+ <template>
+ <style>
+ :host { display: block; }
+ #control {
+ background-color: #e6e6e6;
+ background-image: -webkit-gradient(linear, 0 0, 0 100%,
+ from(#E5E5E5), to(#D1D1D1));
+ flex: 0 0 auto;
+ overflow-x: auto;
+ }
+ #control::-webkit-scrollbar { height: 0px; }
+ #control {
+ font-size: 12px;
+ display: flex;
+ flex-direction: row;
+ align-items: stretch;
+ margin: 1px;
+ margin-right: 2px;
+ }
+ tr-ui-b-table {
+ font-size: 12px;
+ }
+ </style>
+ <div id="control">
+ Sample View Option
+ </div>
+ <tr-ui-b-table id="table">
+ </tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-ui-a-multi-thread-slice-sub-view">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ }
+ #content {
+ display: flex;
+ flex: 1 1 auto;
+ }
+ #content > tr-ui-a-related-events {
+ margin-left: 8px;
+ flex: 0 1 200px;
+ }
+ </style>
+ <div id="content"></div>
+ </template>
+</dom-module><dom-module id="tr-ui-a-multi-thread-time-slice-sub-view">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ }
+ #content {
+ flex: 1 1 auto;
+ }
+ </style>
+ <tr-ui-a-multi-event-sub-view id="content"></tr-ui-a-multi-event-sub-view>
+ </template>
+</dom-module><dom-module id="tr-ui-a-user-expectation-related-samples-table">
+ <template>
+ <style>
+ #table {
+ flex: 1 1 auto;
+ align-self: stretch;
+ font-size: 12px;
+ }
+ </style>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-ui-a-multi-user-expectation-sub-view">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ flex: 1 1 auto;
+ }
+ #events {
+ margin-left: 8px;
+ flex: 0 1 200px;
+ }
+ </style>
+ <tr-ui-a-multi-event-sub-view id="realView"></tr-ui-a-multi-event-sub-view>
+ <div id="events">
+ <tr-ui-a-user-expectation-related-samples-table id="relatedSamples"></tr-ui-a-user-expectation-related-samples-table>
+ </div>
+ </template>
+</dom-module><dom-module id="tr-ui-a-single-async-slice-sub-view">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ flex-direction: row;
+ }
+ #events {
+ display:flex;
+ flex-direction: column;
+ }
+ </style>
+ <tr-ui-a-single-event-sub-view id="content"></tr-ui-a-single-event-sub-view>
+ <div id="events">
+ <tr-ui-a-related-events id="relatedEvents"></tr-ui-a-related-events>
+ </div>
+ </template>
+</dom-module><dom-module id="tr-ui-a-single-cpu-slice-sub-view">
+ <template>
+ <style>
+ table {
+ border-collapse: collapse;
+ border-width: 0;
+ margin-bottom: 25px;
+ width: 100%;
+ }
+
+ table tr > td:first-child {
+ padding-left: 2px;
+ }
+
+ table tr > td {
+ padding: 2px 4px 2px 4px;
+ vertical-align: text-top;
+ width: 150px;
+ }
+
+ table td td {
+ padding: 0 0 0 0;
+ width: auto;
+ }
+ tr {
+ vertical-align: top;
+ }
+
+ tr:nth-child(2n+0) {
+ background-color: #e2e2e2;
+ }
+ </style>
+ <table>
+ <tbody><tr>
+ <td>Running process:</td><td id="process-name"></td>
+ </tr>
+ <tr>
+ <td>Running thread:</td><td id="thread-name"></td>
+ </tr>
+ <tr>
+ <td>Start:</td>
+ <td>
+ <tr-v-ui-scalar-span id="start">
+ </tr-v-ui-scalar-span>
+ </td>
+ </tr>
+ <tr>
+ <td>Duration:</td>
+ <td>
+ <tr-v-ui-scalar-span id="duration">
+ </tr-v-ui-scalar-span>
+ </td>
+ </tr>
+ <tr>
+ <td>Active slices:</td><td id="running-thread"></td>
+ </tr>
+ <tr>
+ <td>Args:</td>
+ <td>
+ <tr-ui-a-generic-object-view id="args">
+ </tr-ui-a-generic-object-view>
+ </td>
+ </tr>
+ </tbody></table>
+ </template>
+</dom-module><dom-module id="tr-ui-a-single-flow-event-sub-view">
+ <template>
+ <style>
+ :host {
+ display: block;
+ }
+ </style>
+ <tr-ui-a-single-event-sub-view id="singleEventSubView">
+ </tr-ui-a-single-event-sub-view>
+ </template>
+</dom-module><dom-module id="tr-ui-a-single-frame-sub-view">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ flex-direction: column;
+ }
+ #asv {
+ flex: 0 0 auto;
+ align-self: stretch;
+ }
+ </style>
+ <tr-ui-a-alert-sub-view id="asv">
+ </tr-ui-a-alert-sub-view>
+ </template>
+</dom-module><dom-module id="tr-ui-a-single-instant-event-sub-view">
+ <template>
+ <style>
+ :host {
+ display: block;
+ }
+ </style>
+ <div id="content"></div>
+ </template>
+</dom-module><dom-module id="tr-ui-a-single-object-instance-sub-view">
+ <template>
+ <style>
+ :host {
+ display: block;
+ }
+
+ #snapshots > * {
+ display: block;
+ }
+
+ :host {
+ overflow: auto;
+ display: block;
+ }
+
+ * {
+ -webkit-user-select: text;
+ }
+
+ .title {
+ border-bottom: 1px solid rgb(128, 128, 128);
+ font-size: 110%;
+ font-weight: bold;
+ }
+
+ td, th {
+ font-family: monospace;
+ vertical-align: top;
+ }
+ </style>
+ <div id="content"></div>
+ </template>
+</dom-module><dom-module id="tr-ui-a-single-object-snapshot-sub-view">
+ <template>
+ <style>
+ #args {
+ white-space: pre;
+ }
+
+ :host {
+ overflow: auto;
+ display: flex;
+ }
+
+ ::content * {
+ -webkit-user-select: text;
+ }
+
+ ::content .title {
+ border-bottom: 1px solid rgb(128, 128, 128);
+ font-size: 110%;
+ font-weight: bold;
+ }
+
+ ::content td, th {
+ font-family: monospace;
+ vertical-align: top;
+ }
+ </style>
+ <content></content>
+ </template>
+</dom-module><dom-module id="tr-ui-a-power-sample-table">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ font-size: 12px;
+ }
+ </style>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-ui-a-single-power-sample-sub-view">
+ <template>
+ <style>
+ :host { display: block; }
+ </style>
+ <tr-ui-a-power-sample-table id="samplesTable">
+ </tr-ui-a-power-sample-table>
+ </template>
+</dom-module><dom-module id="tr-ui-a-single-sample-sub-view">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ font-size: 12px;
+ }
+ </style>
+ <tr-ui-b-table id="content"></tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-ui-a-single-thread-slice-sub-view">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ flex-direction: row;
+ }
+ #events {
+ display: flex;
+ flex-direction: column;
+ }
+
+ </style>
+ <tr-ui-a-single-event-sub-view id="content"></tr-ui-a-single-event-sub-view>
+ <div id="events">
+ <tr-ui-a-related-events id="relatedEvents">
+ </tr-ui-a-related-events>
+ </div>
+ </template>
+</dom-module><dom-module id="tr-ui-a-single-thread-time-slice-sub-view">
+ <template>
+ <style>
+ table {
+ border-collapse: collapse;
+ border-width: 0;
+ margin-bottom: 25px;
+ width: 100%;
+ }
+
+ table tr > td:first-child {
+ padding-left: 2px;
+ }
+
+ table tr > td {
+ padding: 2px 4px 2px 4px;
+ vertical-align: text-top;
+ width: 150px;
+ }
+
+ table td td {
+ padding: 0 0 0 0;
+ width: auto;
+ }
+ tr {
+ vertical-align: top;
+ }
+
+ tr:nth-child(2n+0) {
+ background-color: #e2e2e2;
+ }
+ </style>
+ <table>
+ <tbody><tr>
+ <td>Running process:</td><td id="process-name"></td>
+ </tr>
+ <tr>
+ <td>Running thread:</td><td id="thread-name"></td>
+ </tr>
+ <tr>
+ <td>State:</td>
+ <td><b><span id="state"></span></b></td>
+ </tr>
+ <tr>
+ <td>Start:</td>
+ <td>
+ <tr-v-ui-scalar-span id="start">
+ </tr-v-ui-scalar-span>
+ </td>
+ </tr>
+ <tr>
+ <td>Duration:</td>
+ <td>
+ <tr-v-ui-scalar-span id="duration">
+ </tr-v-ui-scalar-span>
+ </td>
+ </tr>
+
+ <tr>
+ <td>On CPU:</td><td id="on-cpu"></td>
+ </tr>
+
+ <tr>
+ <td>Running instead:</td><td id="running-instead"></td>
+ </tr>
+
+ <tr>
+ <td>Args:</td><td id="args"></td>
+ </tr>
+ </tbody></table>
+ </template>
+</dom-module><dom-module id="tr-ui-a-single-user-expectation-sub-view">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ flex-direction: row;
+ }
+ #events {
+ display: flex;
+ flex-direction: column;
+ }
+ </style>
+ <tr-ui-a-single-event-sub-view id="realView"></tr-ui-a-single-event-sub-view>
+ <div id="events">
+ <tr-ui-a-user-expectation-related-samples-table id="relatedSamples"></tr-ui-a-user-expectation-related-samples-table>
+ </div>
+ </template>
+</dom-module><dom-module id="tr-ui-a-analysis-view">
+ <template>
+ <style>
+ :host {
+ background-color: white;
+ display: flex;
+ flex-direction: column;
+ height: 275px;
+ overflow: auto;
+ }
+
+ :host(.tall-mode) {
+ height: 525px;
+ }
+ </style>
+ <content></content>
+ </template>
+</dom-module><dom-module id="tr-ui-b-dropdown">
+ <template>
+ <style>
+ :host {
+ position: relative;
+ display: flex;
+ }
+ #outer {
+ display: flex;
+ flex: 0 0 auto;
+ padding: 1px 4px 1px 4px;
+ -webkit-user-select: none;
+ cursor: default;
+ }
+
+ #state {
+ display: flex;
+ flex: 0 0 auto;
+ margin-left: 2px;
+ margin-right: 0px;
+ flex: 0 0 auto;
+ }
+
+ #icon {
+ display: flex;
+ flex: 0 0 auto;
+ flex: 0 0 auto;
+ }
+ dialog {
+ position: absolute;
+ padding: 0;
+ border: 0;
+ margin: 0;
+ }
+ dialog::backdrop {
+ background: rgba(0,0,0,.05);
+ }
+
+ #dialog-frame {
+ background-color: #fff;
+ display: flex;
+ flex-direction: column;
+ flex: 1 1 auto;
+ padding: 6px;
+ border: 1px solid black;
+ -webkit-user-select: none;
+ cursor: default;
+ }
+ </style>
+ <tr-ui-b-toolbar-button id="outer" on-click="onOuterClick_" on-keydown="onOuterKeyDown_">
+ <div id="icon">⚙</div>
+ <div id="state">▾</div>
+ </tr-ui-b-toolbar-button>
+ <dialog id="dialog" on-cancel="onDialogCancel_" on-click="onDialogClick_">
+ <div id="dialog-frame">
+ <content></content>
+ </div>
+ </dialog>
+ </template>
+</dom-module><dom-module id="tr-ui-b-info-bar-group">
+ <template>
+ <style>
+ :host {
+ flex: 0 0 auto;
+ flex-direction: column;
+ display: flex;
+ }
+ </style>
+ <div id="messages"></div>
+ </template>
+</dom-module><dom-module id="tr-ui-b-toolbar-button">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ background-color: #f8f8f8;
+ border: 1px solid rgba(0, 0, 0, 0.5);
+ color: rgba(0,0,0,0.8);
+ justify-content: center;
+ align-self: stretch;
+ min-width: 23px;
+ }
+
+ :host(:hover) {
+ background-color: rgba(255, 255, 255, 1.0);
+ border-color: rgba(0, 0, 0, 0.8);
+ box-shadow: 0 0 .05em rgba(0, 0, 0, 0.4);
+ color: rgba(0, 0, 0, 1);
+ }
+
+ #aligner {
+ display: flex;
+ flex: 0 0 auto;
+ align-self: center;
+ }
+ </style>
+ <div id="aligner">
+ <content></content>
+ </div>
+ </template>
+</dom-module><style>
+.drawing-container{-webkit-box-flex:1;display:inline;overflow:auto;overflow-x:hidden;position:relative}.drawing-container-canvas{-webkit-box-flex:1;display:block;pointer-events:none;position:absolute;top:0}
+</style><style>
+.letter-dot-track {
+ height: 18px;
+}
+</style><style>
+.chart-track {
+ height: 30px;
+ position: relative;
+}
+</style><style>
+.cpu-usage-track {
+ height: 90px;
+}
+</style><style>
+.power-series-track {
+ height: 90px;
+}
+</style><style>
+.spacing-track{height:4px}
+</style><style>
+.rect-track{height:18px}
+</style><style>
+.thread-track{-webkit-box-orient:vertical;display:-webkit-box;position:relative}
+</style><style>
+.process-track-header{-webkit-flex:0 0 auto;background-image:-webkit-gradient(linear,0 0,100% 0,from(#E5E5E5),to(#D1D1D1));border-bottom:1px solid #8e8e8e;border-top:1px solid white;font-size:75%}.process-track-name:before{content:'\25B8';padding:0 5px}.process-track-base.expanded .process-track-name:before{content:'\25BE'}
+</style><style>
+.model-track {
+ -webkit-box-flex: 1;
+}
+</style><style>
+.x-axis-track {
+ height: 12px;
+}
+
+.x-axis-track.tall-mode {
+ height: 30px;
+}
+</style><dom-module id="tr-ui-timeline-track-view">
+ <template>
+ <style>
+ :host {
+ -webkit-box-orient: vertical;
+ display: -webkit-box;
+ position: relative;
+ }
+
+ :host ::content * {
+ -webkit-user-select: none;
+ cursor: default;
+ }
+
+ #drag_box {
+ background-color: rgba(0, 0, 255, 0.25);
+ border: 1px solid rgb(0, 0, 96);
+ font-size: 75%;
+ position: fixed;
+ }
+
+ #hint_text {
+ position: absolute;
+ bottom: 6px;
+ right: 6px;
+ font-size: 8pt;
+ }
+ </style>
+ <content></content>
+
+ <div id="drag_box"></div>
+ <div id="hint_text"></div>
+
+ <tv-ui-b-hotkey-controller id="hotkey_controller">
+ </tv-ui-b-hotkey-controller>
+ </template>
+</dom-module><dom-module id="tr-ui-find-control">
+ <template>
+ <style>
+ :host {
+ -webkit-user-select: none;
+ display: -webkit-flex;
+ position: relative;
+ }
+ input {
+ -webkit-user-select: auto;
+ background-color: #f8f8f8;
+ border: 1px solid rgba(0, 0, 0, 0.5);
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+ width: 170px;
+ }
+ input:focus {
+ background-color: white;
+ }
+ tr-ui-b-toolbar-button {
+ border-left: none;
+ margin: 0;
+ }
+ #hitCount {
+ left: 0;
+ opacity: 0.25;
+ pointer-events: none;
+ position: absolute;
+ text-align: right;
+ top: 2px;
+ width: 167px;
+ z-index: 1;
+ }
+ #spinner {
+ visibility: hidden;
+ width: 8px;
+ height: 8px;
+ left: 154px;
+ pointer-events: none;
+ position: absolute;
+ top: 4px;
+ z-index: 1;
+
+ border: 2px solid transparent;
+ border-bottom: 2px solid rgba(0, 0, 0, 0.5);
+ border-right: 2px solid rgba(0, 0, 0, 0.5);
+ border-radius: 50%;
+ }
+ @keyframes spin { 100% { transform: rotate(360deg); } }
+ </style>
+
+ <input id="filter" on-blur="filterBlur" on-focus="filterFocus" on-input="filterTextChanged" on-keydown="filterKeyDown" on-mouseup="filterMouseUp" type="text"/>
+ <div id="spinner"></div>
+ <tr-ui-b-toolbar-button on-click="findPrevious">
+ ←
+ </tr-ui-b-toolbar-button>
+ <tr-ui-b-toolbar-button on-click="findNext">
+ →
+ </tr-ui-b-toolbar-button>
+ <div id="hitCount">0 of 0</div>
+ </template>
+</dom-module><dom-module id="tr-ui-scripting-control">
+ <template>
+ <style>
+ :host {
+ flex: 1 1 auto;
+ }
+ .root {
+ font-family: monospace;
+ cursor: text;
+
+ padding: 2px;
+ margin: 2px;
+ border: 1px solid rgba(0, 0, 0, 0.5);
+ background: white;
+
+ height: 100px;
+ overflow-y: auto;
+
+ transition-property: opacity, height, padding, margin;
+ transition-duration: .2s;
+ transition-timing-function: ease-out;
+ }
+ .hidden {
+ margin-top: 0px;
+ margin-bottom: 0px;
+ padding-top: 0px;
+ padding-bottom: 0px;
+ height: 0px;
+ opacity: 0;
+ }
+ .focused {
+ outline: auto 5px -webkit-focus-ring-color;
+ }
+ #history {
+ -webkit-user-select: text;
+ color: #777;
+ }
+ #promptContainer {
+ display: flex;
+ }
+ #promptMark {
+ width: 1em;
+ color: #468;
+ }
+ #prompt {
+ flex: 1;
+ width: 100%;
+ border: none !important;
+ background-color: inherit !important;
+ font: inherit !important;
+ text-overflow: clip !important;
+ text-decoration: none !important;
+ }
+ #prompt:focus {
+ outline: none;
+ }
+ </style>
+
+ <div class="root hidden" id="root" on-focus="onConsoleFocus" tabindex="0">
+ <div id="history"></div>
+ <div id="promptContainer">
+ <span id="promptMark">&gt;</span>
+ <input id="prompt" on-blur="onConsoleBlur" on-keydown="promptKeyDown" on-keypress="promptKeyPress" type="text"/>
+ </div>
+ </div>
+ </template>
+</dom-module><dom-module id="tr-ui-side-panel-container">
+ <template>
+ <style>
+ :host {
+ align-items: stretch;
+ display: -webkit-flex;
+ background-color: white;
+ }
+
+ :host([expanded]) > #side_panel_drag_handle,
+ :host([expanded]) > active-panel-container {
+ -webkit-flex: 1 1 auto;
+ border-left: 1px solid black;
+ display: -webkit-flex;
+ }
+
+ :host(:not([expanded])) > #side_panel_drag_handle,
+ :host(:not([expanded])) > active-panel-container {
+ display: none;
+ }
+
+ active-panel-container {
+ display: flex;
+ }
+
+ tab-strip {
+ -webkit-flex: 0 0 auto;
+ -webkit-flex-direction: column;
+ -webkit-user-select: none;
+ background-color: rgb(236, 236, 236);
+ border-left: 1px solid black;
+ cursor: default;
+ display: -webkit-flex;
+ min-width: 18px; /* workaround for flexbox and writing-mode mixing bug */
+ padding: 10px 0 10px 0;
+ font-size: 12px;
+ }
+
+ tab-strip > tab-strip-label {
+ -webkit-writing-mode: vertical-rl;
+ display: inline;
+ margin-right: 1px;
+ min-height: 20px;
+ padding: 15px 3px 15px 1px;
+ }
+
+ tab-strip >
+ tab-strip-label:not([enabled]) {
+ color: rgb(128, 128, 128);
+ }
+
+ tab-strip > tab-strip-label[selected] {
+ background-color: white;
+ border: 1px solid rgb(163, 163, 163);
+ border-left: none;
+ padding: 14px 2px 14px 1px;
+ }
+
+ #active_panel_container {
+ overflow: auto;
+ }
+ </style>
+
+ <tr-ui-b-drag-handle id="side_panel_drag_handle"></tr-ui-b-drag-handle>
+ <active-panel-container id="active_panel_container">
+ </active-panel-container>
+ <tab-strip id="tab_strip"></tab-strip>
+ </template>
+</dom-module><dom-module id="tr-ui-timeline-view-help-overlay">
+ <template>
+ <style>
+ :host {
+ -webkit-flex: 1 1 auto;
+ -webkit-flex-direction: row;
+ display: -webkit-flex;
+ width: 700px;
+ }
+ .column {
+ width: 50%;
+ }
+ h2 {
+ font-size: 1.2em;
+ margin: 0;
+ margin-top: 5px;
+ text-align: center;
+ }
+ h3 {
+ margin: 0;
+ margin-left: 126px;
+ margin-top: 10px;
+ }
+ .pair {
+ -webkit-flex: 1 1 auto;
+ -webkit-flex-direction: row;
+ display: -webkit-flex;
+ }
+ .command {
+ font-family: monospace;
+ margin-right: 5px;
+ text-align: right;
+ width: 150px;
+ }
+ .action {
+ font-size: 0.9em;
+ text-align: left;
+ width: 200px;
+ }
+ tr-ui-b-mouse-mode-icon {
+ border: 1px solid #888;
+ border-radius: 3px;
+ box-shadow: inset 0 0 2px rgba(0,0,0,0.3);
+ display: inline-block;
+ margin-right: 1px;
+ position: relative;
+ top: 4px;
+ }
+ .mouse-mode-icon.pan-mode {
+ background-position: -1px -11px;
+ }
+ .mouse-mode-icon.select-mode {
+ background-position: -1px -41px;
+ }
+ .mouse-mode-icon.zoom-mode {
+ background-position: -1px -71px;
+ }
+ .mouse-mode-icon.timing-mode {
+ background-position: -1px -101px;
+ }
+ </style>
+ <div class="column left">
+ <h2>Navigation</h2>
+ <div class="pair">
+ <div class="command">w/s</div>
+ <div class="action">Zoom in/out (+shift: faster)</div>
+ </div>
+
+ <div class="pair">
+ <div class="command">a/d</div>
+ <div class="action">Pan left/right (+shift: faster)</div>
+ </div>
+
+ <div class="pair">
+ <div class="command">→/shift-TAB</div>
+ <div class="action">Select previous event</div>
+ </div>
+
+ <div class="pair">
+ <div class="command">←/TAB</div>
+ <div class="action">Select next event</div>
+ </div>
+
+ <h2>Mouse Controls</h2>
+ <div class="pair">
+ <div class="command">click</div>
+ <div class="action">Select event</div>
+ </div>
+ <div class="pair">
+ <div class="command">alt-mousewheel</div>
+ <div class="action">Zoom in/out</div>
+ </div>
+
+ <h3>
+ <tr-ui-b-mouse-mode-icon mode-name="SELECTION"></tr-ui-b-mouse-mode-icon>
+ Select mode
+ </h3>
+ <div class="pair">
+ <div class="command">drag</div>
+ <div class="action">Box select</div>
+ </div>
+
+ <div class="pair">
+ <div class="command"><span class="mod"></span>-click/drag</div>
+ <div class="action">Add events to the current selection</div>
+ </div>
+
+ <div class="pair">
+ <div class="command">double click</div>
+ <div class="action">Select all events with same title</div>
+ </div>
+
+ <h3>
+ <tr-ui-b-mouse-mode-icon mode-name="PANSCAN"></tr-ui-b-mouse-mode-icon>
+ Pan mode
+ </h3>
+ <div class="pair">
+ <div class="command">drag</div>
+ <div class="action">Pan the view</div>
+ </div>
+
+ <h3>
+ <tr-ui-b-mouse-mode-icon mode-name="ZOOM"></tr-ui-b-mouse-mode-icon>
+ Zoom mode
+ </h3>
+ <div class="pair">
+ <div class="command">drag</div>
+ <div class="action">Zoom in/out by dragging up/down</div>
+ </div>
+
+ <h3>
+ <tr-ui-b-mouse-mode-icon mode-name="TIMING"></tr-ui-b-mouse-mode-icon>
+ Timing mode
+ </h3>
+ <div class="pair">
+ <div class="command">drag</div>
+ <div class="action">Create or move markers</div>
+ </div>
+
+ <div class="pair">
+ <div class="command">double click</div>
+ <div class="action">Set marker range to slice</div>
+ </div>
+ </div>
+
+ <div class="column right">
+ <h2>General</h2>
+ <div class="pair">
+ <div class="command">1-4</div>
+ <div class="action">Switch mouse mode</div>
+ </div>
+
+ <div class="pair">
+ <div class="command">shift</div>
+ <div class="action">Hold for temporary select</div>
+ </div>
+
+ <div class="pair">
+ <div class="command">space</div>
+ <div class="action">Hold for temporary pan</div>
+ </div>
+
+ <div class="pair">
+ <div class="command">/</div>
+ <div class="action">Search</div>
+ </div>
+
+ <div class="pair">
+ <div class="command">enter</div>
+ <div class="action">Step through search results</div>
+ </div>
+
+ <div class="pair">
+ <div class="command">f</div>
+ <div class="action">Zoom into selection</div>
+ </div>
+
+ <div class="pair">
+ <div class="command">z/0</div>
+ <div class="action">Reset zoom and pan</div>
+ </div>
+
+ <div class="pair">
+ <div class="command">g/G</div>
+ <div class="action">Toggle 60hz grid</div>
+ </div>
+
+ <div class="pair">
+ <div class="command">v</div>
+ <div class="action">Highlight VSync</div>
+ </div>
+
+ <div class="pair">
+ <div class="command">h</div>
+ <div class="action">Toggle low/high details</div>
+ </div>
+
+ <div class="pair">
+ <div class="command">m</div>
+ <div class="action">Mark current selection</div>
+ </div>
+
+ <div class="pair">
+ <div class="command">p</div>
+ <div class="action">Select power samples over current selection interval</div>
+ </div>
+
+ <div class="pair">
+ <div class="command">`</div>
+ <div class="action">Show or hide the scripting console</div>
+ </div>
+
+ <div class="pair">
+ <div class="command">?</div>
+ <div class="action">Show help</div>
+ </div>
+ </div>
+ </template>
+</dom-module><dom-module id="tr-ui-timeline-view-metadata-overlay">
+ <template>
+ <style>
+ :host {
+ width: 700px;
+
+ overflow: auto;
+ }
+ </style>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-ui-timeline-view">
+ <template>
+ <style>
+ :host {
+ flex-direction: column;
+ cursor: default;
+ display: flex;
+ font-family: sans-serif;
+ padding: 0;
+ }
+
+ #control {
+ background-color: #e6e6e6;
+ background-image: -webkit-gradient(linear, 0 0, 0 100%,
+ from(#E5E5E5), to(#D1D1D1));
+ flex: 0 0 auto;
+ overflow-x: auto;
+ }
+
+ #control::-webkit-scrollbar { height: 0px; }
+
+ #control > #bar {
+ font-size: 12px;
+ display: flex;
+ flex-direction: row;
+ margin: 1px;
+ }
+
+ #control > #bar > #title {
+ display: flex;
+ align-items: center;
+ padding-left: 8px;
+ padding-right: 8px;
+ flex: 1 1 auto;
+ }
+
+ #control > #bar > #left_controls,
+ #control > #bar > #right_controls {
+ display: flex;
+ flex-direction: row;
+ align-items: stretch;
+ }
+
+ #control > #bar > #left_controls > * { margin-right: 2px; }
+ #control > #bar > #right_controls > * { margin-left: 2px; }
+ #control > #collapsing_controls { display: flex; }
+
+ middle-container {
+ flex: 1 1 auto;
+ flex-direction: row;
+ border-bottom: 1px solid #8e8e8e;
+ display: flex;
+ min-height: 0;
+ }
+
+ middle-container ::content track-view-container {
+ flex: 1 1 auto;
+ display: flex;
+ min-height: 0;
+ min-width: 0;
+ overflow-x: hidden;
+ }
+
+ middle-container ::content track-view-container > * { flex: 1 1 auto; }
+ middle-container > x-timeline-view-side-panel-container { flex: 0 0 auto; }
+ tr-ui-b-drag-handle { flex: 0 0 auto; }
+ tr-ui-a-analysis-view { flex: 0 0 auto; }
+ </style>
+
+ <tv-ui-b-hotkey-controller id="hkc"></tv-ui-b-hotkey-controller>
+ <div id="control">
+ <div id="bar">
+ <div id="left_controls"></div>
+ <div id="title">^_^</div>
+ <div id="right_controls">
+ <tr-ui-b-toolbar-button id="view_metadata_button">
+ M
+ </tr-ui-b-toolbar-button>
+ <tr-ui-b-dropdown id="view_options_dropdown"></tr-ui-b-dropdown>
+ <tr-ui-find-control id="view_find_control"></tr-ui-find-control>
+ <tr-ui-b-toolbar-button id="view_console_button">
+ »
+ </tr-ui-b-toolbar-button>
+ <tr-ui-b-toolbar-button id="view_help_button">
+ ?
+ </tr-ui-b-toolbar-button>
+ </div>
+ </div>
+ <div id="collapsing_controls"></div>
+ <tr-ui-b-info-bar-group id="import-warnings">
+ </tr-ui-b-info-bar-group>
+ </div>
+ <middle-container>
+ <content></content>
+
+ <tr-ui-side-panel-container id="side_panel_container">
+ </tr-ui-side-panel-container>
+ </middle-container>
+ <tr-ui-b-drag-handle id="drag_handle"></tr-ui-b-drag-handle>
+ <tr-ui-a-analysis-view id="analysis"></tr-ui-a-analysis-view>
+
+ <tr-v-ui-preferred-display-unit id="display_unit">
+ </tr-v-ui-preferred-display-unit>
+ </template>
+</dom-module><dom-module id="tr-ui-b-grouping-table">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ }
+ #table {
+ flex: 1 1 auto;
+ font-size: 12px;
+ }
+ </style>
+ <tr-ui-b-table id="table"></tr-ui-b-table>
+ </template>
+</dom-module><dom-module id="tr-ui-b-grouping-table-groupby-picker">
+ <template>
+ <style>
+ #container {
+ display: flex;
+ }
+ #container *:not(:first-child) {
+ padding-left: 3px;
+ border-left: 1px solid black;
+ margin-left: 3px;
+ }
+ </style>
+
+ <div id="container"></div>
+ </template>
+</dom-module><dom-module id="tr-ui-b-grouping-table-groupby-picker-group">
+ <template>
+ <style>
+ :host {
+ white-space: nowrap;
+ }
+ #left, #right {
+ user-select: none;
+ cursor: pointer;
+ }
+ </style>
+
+ <span id="left" on-click="moveLeft_">◀</span>
+ <input id="enabled" on-change="onEnableChanged_" type="checkbox"/>
+ <label for="enabled" id="label"></label>
+ <span id="right" on-click="moveRight_">▶</span>
+ </template>
+</dom-module><dom-module id="tr-ui-sp-file-size-stats-side-panel">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ flex-direction: column;
+ }
+ toolbar {
+ align-items: center;
+ background-color: rgb(236, 236, 236);
+ border-bottom: 1px solid #8e8e8e;
+ display: flex;
+ flex-direction: row;
+ flex-direction: row;
+ flex: 0 0 auto;
+ font-size: 12px;
+ padding: 0 10px 0 10px;
+ }
+ table-container {
+ display: flex;
+ min-height: 0px;
+ overflow-y: auto;
+ }
+ </style>
+
+ <toolbar>
+ <span><b>Group by:</b></span>
+ <tr-ui-b-grouping-table-groupby-picker id="picker">
+ </tr-ui-b-grouping-table-groupby-picker>
+ </toolbar>
+ <table-container>
+ <tr-ui-b-grouping-table id="table"></tr-ui-b-grouping-table>
+ </table-container>
+ </template>
+</dom-module><dom-module id="tr-v-ui-histogram-set-controls">
+ <template>
+ <style>
+ :host {
+ display: block;
+ }
+
+ #help, #feedback {
+ display: none;
+ margin-left: 20px;
+ }
+
+ #search {
+ max-width: 20em;
+ margin-right: 20px;
+ }
+
+ #controls {
+ white-space: nowrap;
+ }
+
+ #show_overview, #hide_overview {
+ height: 1em;
+ margin-right: 20px;
+ }
+
+ #show_overview {
+ stroke: blue;
+ stroke-width: 16;
+ }
+
+ #show_overview:hover {
+ background: blue;
+ stroke: white;
+ }
+
+ #hide_overview {
+ display: none;
+ stroke-width: 18;
+ stroke: black;
+ }
+
+ #hide_overview:hover {
+ background: black;
+ stroke: white;
+ }
+
+ #reference_display_label {
+ display: none;
+ margin-right: 20px;
+ }
+
+ #statistic {
+ display: none;
+ margin-right: 20px;
+ }
+
+ #download_csv {
+ margin-right: 20px;
+ }
+ </style>
+
+ <div id="controls">
+ <input id="search" placeholder="Find Histogram name" value="{{searchQuery::keyup}}"/>
+
+ <svg id="show_overview" on-click="toggleOverviewLineCharts_" viewBox="0 0 128 128">
+ <line x1="19" x2="49" y1="109" y2="49"></line>
+ <line x1="49" x2="79" y1="49" y2="79"></line>
+ <line x1="79" x2="109" y1="79" y2="19"></line>
+ </svg>
+ <svg id="hide_overview" on-click="toggleOverviewLineCharts_" viewBox="0 0 128 128">
+ <line x1="28" x2="100" y1="28" y2="100"></line>
+ <line x1="28" x2="100" y1="100" y2="28"></line>
+ </svg>
+
+ <select id="reference_display_label" value="{{referenceDisplayLabel::change}}">
+ <option value="">Select a reference column</option>
+ </select>
+
+ <select id="statistic" value="{{displayStatisticName::change}}">
+ </select>
+
+ <button id="download_csv" on-click="downloadCSV_">⬇ CSV</button>
+
+ <input checked="{{showAll::change}}" id="show_all" title="When unchecked, less important histograms are hidden." type="checkbox"/>
+ <label for="show_all" title="When unchecked, less important histograms are hidden.">Show all</label>
+
+ <a id="help">Help</a>
+ <a id="feedback">Feedback</a>
+ </div>
+
+ <tr-ui-b-grouping-table-groupby-picker id="picker">
+ </tr-ui-b-grouping-table-groupby-picker>
+ </template>
+</dom-module><dom-module id="tr-v-ui-histogram-set-table-cell">
+ <template>
+ <style>
+ #histogram_container {
+ display: flex;
+ flex-direction: row;
+ }
+
+ #missing, #empty, #unmergeable, #scalar {
+ flex-grow: 1;
+ }
+
+ #open_histogram, #close_histogram, #open_histogram svg, #close_histogram svg {
+ height: 1em;
+ }
+
+ #open_histogram svg {
+ margin-left: 4px;
+ stroke-width: 0;
+ stroke: blue;
+ fill: blue;
+ }
+ :host(:hover) #open_histogram svg {
+ background: blue;
+ stroke: white;
+ fill: white;
+ }
+
+ #scalar {
+ flex-grow: 1;
+ white-space: nowrap;
+ }
+
+ #histogram {
+ flex-grow: 1;
+ }
+
+ #close_histogram svg line {
+ stroke-width: 18;
+ stroke: black;
+ }
+ #close_histogram:hover svg {
+ background: black;
+ }
+ #close_histogram:hover svg line {
+ stroke: white;
+ }
+
+ #overview_container {
+ display: none;
+ }
+ </style>
+
+ <div id="histogram_container">
+ <span id="missing">(missing)</span>
+ <span id="empty">(empty)</span>
+ <span id="unmergeable">(unmergeable)</span>
+
+ <tr-v-ui-scalar-span id="scalar" on-click="openHistogram_"></tr-v-ui-scalar-span>
+
+ <span id="open_histogram" on-click="openHistogram_">
+ <svg viewBox="0 0 128 128">
+ <rect height="16" width="32" x="16" y="24"></rect>
+ <rect height="16" width="96" x="16" y="56"></rect>
+ <rect height="16" width="64" x="16" y="88"></rect>
+ </svg>
+ </span>
+
+ <span id="histogram"></span>
+
+ <span id="close_histogram" on-click="closeHistogram_">
+ <svg viewBox="0 0 128 128">
+ <line x1="28" x2="100" y1="28" y2="100"></line>
+ <line x1="28" x2="100" y1="100" y2="28"></line>
+ </svg>
+ </span>
+ </div>
+
+ <div id="overview_container">
+ </div>
+ </template>
+</dom-module><dom-module id="tr-v-ui-histogram-set-table-name-cell">
+ <template>
+ <style>
+ #name_container {
+ display: flex;
+ }
+
+ #name {
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ }
+
+ #show_overview, #hide_overview, #show_overview svg, #hide_overview svg {
+ height: 1em;
+ margin-left: 5px;
+ }
+
+ #show_overview svg {
+ stroke: blue;
+ stroke-width: 16;
+ }
+
+ #show_overview:hover svg {
+ background: blue;
+ stroke: white;
+ }
+
+ #hide_overview {
+ display: none;
+ }
+
+ #hide_overview svg {
+ stroke-width: 18;
+ stroke: black;
+ }
+
+ #hide_overview:hover svg {
+ background: black;
+ stroke: white;
+ }
+
+ #open_histograms, #close_histograms, #open_histograms svg, #close_histograms svg {
+ height: 1em;
+ }
+
+ #close_histograms {
+ display: none;
+ }
+
+ #open_histograms svg {
+ margin-left: 4px;
+ stroke-width: 0;
+ stroke: blue;
+ fill: blue;
+ }
+ #open_histograms:hover svg {
+ background: blue;
+ stroke: white;
+ fill: white;
+ }
+
+ #close_histograms line {
+ stroke-width: 18;
+ stroke: black;
+ }
+ #close_histograms:hover {
+ background: black;
+ }
+ #close_histograms:hover line {
+ stroke: white;
+ }
+
+ #overview_container {
+ display: none;
+ }
+ </style>
+
+ <div id="name_container">
+ <span id="name"></span>
+
+ <span id="show_overview" on-click="showOverview_">
+ <svg viewBox="0 0 128 128">
+ <line x1="19" x2="49" y1="109" y2="49"></line>
+ <line x1="49" x2="79" y1="49" y2="79"></line>
+ <line x1="79" x2="109" y1="79" y2="19"></line>
+ </svg>
+ </span>
+
+ <span id="hide_overview" on-click="hideOverview_">
+ <svg viewBox="0 0 128 128">
+ <line x1="28" x2="100" y1="28" y2="100"></line>
+ <line x1="28" x2="100" y1="100" y2="28"></line>
+ </svg>
+ </span>
+
+ <span id="open_histograms" on-click="openHistograms_">
+ <svg viewBox="0 0 128 128">
+ <rect height="16" width="32" x="16" y="24"></rect>
+ <rect height="16" width="96" x="16" y="56"></rect>
+ <rect height="16" width="64" x="16" y="88"></rect>
+ </svg>
+ </span>
+
+ <span id="close_histograms" on-click="closeHistograms_">
+ <svg viewBox="0 0 128 128">
+ <line x1="28" x2="100" y1="28" y2="100"></line>
+ <line x1="28" x2="100" y1="100" y2="28"></line>
+ </svg>
+ </span>
+ </div>
+
+ <div id="overview_container">
+ </div>
+ </template>
+</dom-module><dom-module id="tr-v-ui-histogram-set-table">
+ <template>
+ <style>
+ :host {
+ min-height: 0px;
+ overflow: auto;
+ }
+ #table {
+ margin-top: 5px;
+ }
+ </style>
+
+ <tr-ui-b-table id="table">
+ </tr-ui-b-table></template>
+</dom-module><dom-module id="tr-v-ui-histogram-set-view">
+ <template>
+ <style>
+ :host {
+ font-family: sans-serif;
+ }
+
+ #zero {
+ color: red;
+ /* histogram-set-table is used by both metrics-side-panel and results2.html.
+ * This font-size rule has no effect in results2.html, but improves
+ * legibility in the metrics-side-panel, which sets font-size in order to
+ * make this table denser.
+ */
+ font-size: initial;
+ }
+
+ #container {
+ display: none;
+ }
+ </style>
+
+ <div id="zero">zero Histograms</div>
+
+ <div id="container">
+ <tr-v-ui-histogram-set-controls id="controls">
+ </tr-v-ui-histogram-set-controls>
+
+ <tr-v-ui-histogram-set-table id="table"></tr-v-ui-histogram-set-table>
+ </div>
+ </template>
+</dom-module><dom-module id="tr-ui-sp-metrics-side-panel">
+ <template>
+ <style>
+ :host {
+ display: flex;
+ flex-direction: column;
+ }
+ div#error {
+ color: red;
+ }
+ #results {
+ font-size: 12px;
+ }
+ </style>
+
+ <top-left-controls id="top_left_controls"></top-left-controls>
+
+ <tr-v-ui-histogram-set-view id="results"></tr-v-ui-histogram-set-view>
+
+ <div id="error"></div>
+ </template>
+</dom-module><dom-module id="tr-ui-e-s-alerts-side-panel">
+ <template>
+ <style>
+ :host {
+ display: block;
+ width: 250px;
+ }
+ #content {
+ flex-direction: column;
+ display: flex;
+ }
+ tr-ui-b-table {
+ font-size: 12px;
+ }
+ </style>
+
+ <div id="content">
+ <toolbar id="toolbar"></toolbar>
+ <result-area id="result_area"></result-area>
+ </div>
+ </template>
+</dom-module><script>
+
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/* WARNING: This file is auto generated.
+ *
+ * Do not edit directly.
+ */
+
+'use strict';if(window.Polymer){throw new Error('Cannot proceed. Polymer already present.');}
+window.Polymer={};window.Polymer.dom='shadow';(function(){function resolve(){document.body.removeAttribute('unresolved');}
+if(window.WebComponents){addEventListener('WebComponentsReady',resolve);}else{if(document.readyState==='interactive'||document.readyState==='complete'){resolve();}else{addEventListener('DOMContentLoaded',resolve);}}}());window.Polymer={Settings:function(){var settings=window.Polymer||{};if(!settings.noUrlSettings){var parts=location.search.slice(1).split('&');for(var i=0,o;i<parts.length&&(o=parts[i]);i++){o=o.split('=');o[0]&&(settings[o[0]]=o[1]||true);}}
+settings.wantShadow=settings.dom==='shadow';settings.hasShadow=Boolean(Element.prototype.createShadowRoot);settings.nativeShadow=settings.hasShadow&&!window.ShadowDOMPolyfill;settings.useShadow=settings.wantShadow&&settings.hasShadow;settings.hasNativeImports=Boolean('import'in document.createElement('link'));settings.useNativeImports=settings.hasNativeImports;settings.useNativeCustomElements=!window.CustomElements||window.CustomElements.useNative;settings.useNativeShadow=settings.useShadow&&settings.nativeShadow;settings.usePolyfillProto=!settings.useNativeCustomElements&&!Object.__proto__;settings.hasNativeCSSProperties=!navigator.userAgent.match('AppleWebKit/601')&&window.CSS&&CSS.supports&&CSS.supports('box-shadow','0 0 0 var(--foo)');settings.useNativeCSSProperties=settings.hasNativeCSSProperties&&settings.lazyRegister&&settings.useNativeCSSProperties;settings.isIE=navigator.userAgent.match('Trident');return settings;}()};(function(){var userPolymer=window.Polymer;window.Polymer=function(prototype){if(typeof prototype==='function'){prototype=prototype.prototype;}
+if(!prototype){prototype={};}
+prototype=desugar(prototype);var customCtor=prototype===prototype.constructor.prototype?prototype.constructor:null;var options={prototype:prototype};if(prototype.extends){options.extends=prototype.extends;}
+Polymer.telemetry._registrate(prototype);var ctor=document.registerElement(prototype.is,options);return customCtor||ctor;};var desugar=function(prototype){var base=Polymer.Base;if(prototype.extends){base=Polymer.Base._getExtendedPrototype(prototype.extends);}
+prototype=Polymer.Base.chainObject(prototype,base);prototype.registerCallback();return prototype;};if(userPolymer){for(var i in userPolymer){Polymer[i]=userPolymer[i];}}
+Polymer.Class=function(prototype){if(!prototype.factoryImpl){prototype.factoryImpl=function(){};}
+return desugar(prototype).constructor;};}());Polymer.telemetry={registrations:[],_regLog:function(prototype){console.log('['+prototype.is+']: registered');},_registrate:function(prototype){this.registrations.push(prototype);Polymer.log&&this._regLog(prototype);},dumpRegistrations:function(){this.registrations.forEach(this._regLog);}};Object.defineProperty(window,'currentImport',{enumerable:true,configurable:true,get:function(){return(document._currentScript||document.currentScript||{}).ownerDocument;}});Polymer.RenderStatus={_ready:false,_callbacks:[],whenReady:function(cb){if(this._ready){cb();}else{this._callbacks.push(cb);}},_makeReady:function(){this._ready=true;for(var i=0;i<this._callbacks.length;i++){this._callbacks[i]();}
+this._callbacks=[];},_catchFirstRender:function(){requestAnimationFrame(function(){Polymer.RenderStatus._makeReady();});},_afterNextRenderQueue:[],_waitingNextRender:false,afterNextRender:function(element,fn,args){this._watchNextRender();this._afterNextRenderQueue.push([element,fn,args]);},hasRendered:function(){return this._ready;},_watchNextRender:function(){if(!this._waitingNextRender){this._waitingNextRender=true;var fn=function(){Polymer.RenderStatus._flushNextRender();};if(!this._ready){this.whenReady(fn);}else{requestAnimationFrame(fn);}}},_flushNextRender:function(){var self=this;setTimeout(function(){self._flushRenderCallbacks(self._afterNextRenderQueue);self._afterNextRenderQueue=[];self._waitingNextRender=false;});},_flushRenderCallbacks:function(callbacks){for(var i=0,h;i<callbacks.length;i++){h=callbacks[i];h[1].apply(h[0],h[2]||Polymer.nar);}}};if(window.HTMLImports){HTMLImports.whenReady(function(){Polymer.RenderStatus._catchFirstRender();});}else{Polymer.RenderStatus._catchFirstRender();}
+Polymer.ImportStatus=Polymer.RenderStatus;Polymer.ImportStatus.whenLoaded=Polymer.ImportStatus.whenReady;(function(){'use strict';var settings=Polymer.Settings;Polymer.Base={__isPolymerInstance__:true,_addFeature:function(feature){this.mixin(this,feature);},registerCallback:function(){if(settings.lazyRegister==='max'){if(this.beforeRegister){this.beforeRegister();}}else{this._desugarBehaviors();for(var i=0,b;i<this.behaviors.length;i++){b=this.behaviors[i];if(b.beforeRegister){b.beforeRegister.call(this);}}
+if(this.beforeRegister){this.beforeRegister();}}
+this._registerFeatures();if(!settings.lazyRegister){this.ensureRegisterFinished();}},createdCallback:function(){if(settings.disableUpgradeEnabled){if(this.hasAttribute('disable-upgrade')){this._propertySetter=disableUpgradePropertySetter;this._configValue=null;this.__data__={};return;}else{this.__hasInitialized=true;}}
+this.__initialize();},__initialize:function(){if(!this.__hasRegisterFinished){this._ensureRegisterFinished(this.__proto__);}
+Polymer.telemetry.instanceCount++;this.root=this;for(var i=0,b;i<this.behaviors.length;i++){b=this.behaviors[i];if(b.created){b.created.call(this);}}
+if(this.created){this.created();}
+this._initFeatures();},ensureRegisterFinished:function(){this._ensureRegisterFinished(this);},_ensureRegisterFinished:function(proto){if(proto.__hasRegisterFinished!==proto.is||!proto.is){if(settings.lazyRegister==='max'){proto._desugarBehaviors();for(var i=0,b;i<proto.behaviors.length;i++){b=proto.behaviors[i];if(b.beforeRegister){b.beforeRegister.call(proto);}}}
+proto.__hasRegisterFinished=proto.is;if(proto._finishRegisterFeatures){proto._finishRegisterFeatures();}
+for(var j=0,pb;j<proto.behaviors.length;j++){pb=proto.behaviors[j];if(pb.registered){pb.registered.call(proto);}}
+if(proto.registered){proto.registered();}
+if(settings.usePolyfillProto&&proto!==this){proto.extend(this,proto);}}},attachedCallback:function(){var self=this;Polymer.RenderStatus.whenReady(function(){self.isAttached=true;for(var i=0,b;i<self.behaviors.length;i++){b=self.behaviors[i];if(b.attached){b.attached.call(self);}}
+if(self.attached){self.attached();}});},detachedCallback:function(){var self=this;Polymer.RenderStatus.whenReady(function(){self.isAttached=false;for(var i=0,b;i<self.behaviors.length;i++){b=self.behaviors[i];if(b.detached){b.detached.call(self);}}
+if(self.detached){self.detached();}});},attributeChangedCallback:function(name,oldValue,newValue){this._attributeChangedImpl(name);for(var i=0,b;i<this.behaviors.length;i++){b=this.behaviors[i];if(b.attributeChanged){b.attributeChanged.call(this,name,oldValue,newValue);}}
+if(this.attributeChanged){this.attributeChanged(name,oldValue,newValue);}},_attributeChangedImpl:function(name){this._setAttributeToProperty(this,name);},extend:function(target,source){if(target&&source){var n$=Object.getOwnPropertyNames(source);for(var i=0,n;i<n$.length&&(n=n$[i]);i++){this.copyOwnProperty(n,source,target);}}
+return target||source;},mixin:function(target,source){for(var i in source){target[i]=source[i];}
+return target;},copyOwnProperty:function(name,source,target){var pd=Object.getOwnPropertyDescriptor(source,name);if(pd){Object.defineProperty(target,name,pd);}},_logger:function(level,args){if(args.length===1&&Array.isArray(args[0])){args=args[0];}
+switch(level){case'log':case'warn':case'error':console[level].apply(console,args);break;}},_log:function(){var args=Array.prototype.slice.call(arguments,0);this._logger('log',args);},_warn:function(){var args=Array.prototype.slice.call(arguments,0);this._logger('warn',args);},_error:function(){var args=Array.prototype.slice.call(arguments,0);this._logger('error',args);},_logf:function(){return this._logPrefix.concat(this.is).concat(Array.prototype.slice.call(arguments,0));}};Polymer.Base._logPrefix=function(){var color=window.chrome&&!/edge/i.test(navigator.userAgent)||/firefox/i.test(navigator.userAgent);return color?['%c[%s::%s]:','font-weight: bold; background-color:#EEEE00;']:['[%s::%s]:'];}();Polymer.Base.chainObject=function(object,inherited){if(object&&inherited&&object!==inherited){if(!Object.__proto__){object=Polymer.Base.extend(Object.create(inherited),object);}
+object.__proto__=inherited;}
+return object;};Polymer.Base=Polymer.Base.chainObject(Polymer.Base,HTMLElement.prototype);Polymer.BaseDescriptors={};var disableUpgradePropertySetter;if(settings.disableUpgradeEnabled){disableUpgradePropertySetter=function(property,value){this.__data__[property]=value;};var origAttributeChangedCallback=Polymer.Base.attributeChangedCallback;Polymer.Base.attributeChangedCallback=function(name,oldValue,newValue){if(!this.__hasInitialized&&name==='disable-upgrade'){this.__hasInitialized=true;this._propertySetter=Polymer.Bind._modelApi._propertySetter;this._configValue=Polymer.Base._configValue;this.__initialize();}
+origAttributeChangedCallback.call(this,name,oldValue,newValue);};}
+if(window.CustomElements){Polymer.instanceof=CustomElements.instanceof;}else{Polymer.instanceof=function(obj,ctor){return obj instanceof ctor;};}
+Polymer.isInstance=function(obj){return Boolean(obj&&obj.__isPolymerInstance__);};Polymer.telemetry.instanceCount=0;}());(function(){var modules={};var lcModules={};var findModule=function(id){return modules[id]||lcModules[id.toLowerCase()];};var DomModule=function(){return document.createElement('dom-module');};DomModule.prototype=Object.create(HTMLElement.prototype);Polymer.Base.mixin(DomModule.prototype,{createdCallback:function(){this.register();},register:function(id){id=id||this.id||this.getAttribute('name')||this.getAttribute('is');if(id){this.id=id;modules[id]=this;lcModules[id.toLowerCase()]=this;}},import:function(id,selector){if(id){var m=findModule(id);if(!m){forceDomModulesUpgrade();m=findModule(id);}
+if(m&&selector){m=m.querySelector(selector);}
+return m;}}});Object.defineProperty(DomModule.prototype,'constructor',{value:DomModule,configurable:true,writable:true});var cePolyfill=window.CustomElements&&!CustomElements.useNative;document.registerElement('dom-module',DomModule);function forceDomModulesUpgrade(){if(cePolyfill){var script=document._currentScript||document.currentScript;var doc=script&&script.ownerDocument||document;var modules=doc.querySelectorAll('dom-module');for(var i=modules.length-1,m;i>=0&&(m=modules[i]);i--){if(m.__upgraded__){return;}else{CustomElements.upgrade(m);}}}}}());Polymer.Base._addFeature({_prepIs:function(){if(!this.is){var module=(document._currentScript||document.currentScript).parentNode;if(module.localName==='dom-module'){var id=module.id||module.getAttribute('name')||module.getAttribute('is');this.is=id;}}
+if(this.is){this.is=this.is.toLowerCase();}}});Polymer.Base._addFeature({behaviors:[],_desugarBehaviors:function(){if(this.behaviors.length){this.behaviors=this._desugarSomeBehaviors(this.behaviors);}},_desugarSomeBehaviors:function(behaviors){var behaviorSet=[];behaviors=this._flattenBehaviorsList(behaviors);for(var i=behaviors.length-1;i>=0;i--){var b=behaviors[i];if(behaviorSet.indexOf(b)===-1){this._mixinBehavior(b);behaviorSet.unshift(b);}}
+return behaviorSet;},_flattenBehaviorsList:function(behaviors){var flat=[];for(var i=0;i<behaviors.length;i++){var b=behaviors[i];if(b instanceof Array){flat=flat.concat(this._flattenBehaviorsList(b));}else if(b){flat.push(b);}else{this._warn(this._logf('_flattenBehaviorsList','behavior is null, check for missing or 404 import'));}}
+return flat;},_mixinBehavior:function(b){var n$=Object.getOwnPropertyNames(b);var useAssignment=b._noAccessors;for(var i=0,n;i<n$.length&&(n=n$[i]);i++){if(!Polymer.Base._behaviorProperties[n]&&!this.hasOwnProperty(n)){if(useAssignment){this[n]=b[n];}else{this.copyOwnProperty(n,b,this);}}}},_prepBehaviors:function(){this._prepFlattenedBehaviors(this.behaviors);},_prepFlattenedBehaviors:function(behaviors){for(var i=0,l=behaviors.length;i<l;i++){this._prepBehavior(behaviors[i]);}
+this._prepBehavior(this);},_marshalBehaviors:function(){for(var i=0;i<this.behaviors.length;i++){this._marshalBehavior(this.behaviors[i]);}
+this._marshalBehavior(this);}});Polymer.Base._behaviorProperties={hostAttributes:true,beforeRegister:true,registered:true,properties:true,observers:true,listeners:true,created:true,attached:true,detached:true,attributeChanged:true,ready:true,_noAccessors:true};Polymer.Base._addFeature({_getExtendedPrototype:function(tag){return this._getExtendedNativePrototype(tag);},_nativePrototypes:{},_getExtendedNativePrototype:function(tag){var p=this._nativePrototypes[tag];if(!p){p=Object.create(this.getNativePrototype(tag));var p$=Object.getOwnPropertyNames(Polymer.Base);for(var i=0,n;i<p$.length&&(n=p$[i]);i++){if(!Polymer.BaseDescriptors[n]){p[n]=Polymer.Base[n];}}
+Object.defineProperties(p,Polymer.BaseDescriptors);this._nativePrototypes[tag]=p;}
+return p;},getNativePrototype:function(tag){return Object.getPrototypeOf(document.createElement(tag));}});Polymer.Base._addFeature({_prepConstructor:function(){this._factoryArgs=this.extends?[this.extends,this.is]:[this.is];var ctor=function(){return this._factory(arguments);};if(this.hasOwnProperty('extends')){ctor.extends=this.extends;}
+Object.defineProperty(this,'constructor',{value:ctor,writable:true,configurable:true});ctor.prototype=this;},_factory:function(args){var elt=document.createElement.apply(document,this._factoryArgs);if(this.factoryImpl){this.factoryImpl.apply(elt,args);}
+return elt;}});Polymer.nob=Object.create(null);Polymer.Base._addFeature({getPropertyInfo:function(property){var info=this._getPropertyInfo(property,this.properties);if(!info){for(var i=0;i<this.behaviors.length;i++){info=this._getPropertyInfo(property,this.behaviors[i].properties);if(info){return info;}}}
+return info||Polymer.nob;},_getPropertyInfo:function(property,properties){var p=properties&&properties[property];if(typeof p==='function'){p=properties[property]={type:p};}
+if(p){p.defined=true;}
+return p;},_prepPropertyInfo:function(){this._propertyInfo={};for(var i=0;i<this.behaviors.length;i++){this._addPropertyInfo(this._propertyInfo,this.behaviors[i].properties);}
+this._addPropertyInfo(this._propertyInfo,this.properties);this._addPropertyInfo(this._propertyInfo,this._propertyEffects);},_addPropertyInfo:function(target,source){if(source){var t,s;for(var i in source){t=target[i];s=source[i];if(i[0]==='_'&&!s.readOnly){continue;}
+if(!target[i]){target[i]={type:typeof s==='function'?s:s.type,readOnly:s.readOnly,attribute:Polymer.CaseMap.camelToDashCase(i)};}else{if(!t.type){t.type=s.type;}
+if(!t.readOnly){t.readOnly=s.readOnly;}}}}}});(function(){var propertiesDesc={configurable:true,writable:true,enumerable:true,value:{}};Polymer.BaseDescriptors.properties=propertiesDesc;Object.defineProperty(Polymer.Base,'properties',propertiesDesc);}());Polymer.CaseMap={_caseMap:{},_rx:{dashToCamel:/-[a-z]/g,camelToDash:/([A-Z])/g},dashToCamelCase:function(dash){return this._caseMap[dash]||(this._caseMap[dash]=dash.indexOf('-')<0?dash:dash.replace(this._rx.dashToCamel,function(m){return m[1].toUpperCase();}));},camelToDashCase:function(camel){return this._caseMap[camel]||(this._caseMap[camel]=camel.replace(this._rx.camelToDash,'-$1').toLowerCase());}};Polymer.Base._addFeature({_addHostAttributes:function(attributes){if(!this._aggregatedAttributes){this._aggregatedAttributes={};}
+if(attributes){this.mixin(this._aggregatedAttributes,attributes);}},_marshalHostAttributes:function(){if(this._aggregatedAttributes){this._applyAttributes(this,this._aggregatedAttributes);}},_applyAttributes:function(node,attr$){for(var n in attr$){if(!this.hasAttribute(n)&&n!=='class'){var v=attr$[n];this.serializeValueToAttribute(v,n,this);}}},_marshalAttributes:function(){this._takeAttributesToModel(this);},_takeAttributesToModel:function(model){if(this.hasAttributes()){for(var i in this._propertyInfo){var info=this._propertyInfo[i];if(this.hasAttribute(info.attribute)){this._setAttributeToProperty(model,info.attribute,i,info);}}}},_setAttributeToProperty:function(model,attribute,property,info){if(!this._serializing){property=property||Polymer.CaseMap.dashToCamelCase(attribute);info=info||this._propertyInfo&&this._propertyInfo[property];if(info&&!info.readOnly){var v=this.getAttribute(attribute);model[property]=this.deserialize(v,info.type);}}},_serializing:false,reflectPropertyToAttribute:function(property,attribute,value){this._serializing=true;value=value===undefined?this[property]:value;this.serializeValueToAttribute(value,attribute||Polymer.CaseMap.camelToDashCase(property));this._serializing=false;},serializeValueToAttribute:function(value,attribute,node){var str=this.serialize(value);node=node||this;if(str===undefined){node.removeAttribute(attribute);}else{node.setAttribute(attribute,str);}},deserialize:function(value,type){switch(type){case Number:value=Number(value);break;case Boolean:value=value!=null;break;case Object:try{value=JSON.parse(value);}catch(x){}
+break;case Array:try{value=JSON.parse(value);}catch(x){value=null;console.warn('Polymer::Attributes: couldn`t decode Array as JSON');}
+break;case Date:value=new Date(value);break;case String:default:break;}
+return value;},serialize:function(value){switch(typeof value){case'boolean':return value?'':undefined;case'object':if(value instanceof Date){return value.toString();}else if(value){try{return JSON.stringify(value);}catch(x){return'';}}
+default:return value!=null?value:undefined;}}});Polymer.version="1.8.1";Polymer.Base._addFeature({_registerFeatures:function(){this._prepIs();this._prepBehaviors();this._prepConstructor();this._prepPropertyInfo();},_prepBehavior:function(b){this._addHostAttributes(b.hostAttributes);},_marshalBehavior:function(b){},_initFeatures:function(){this._marshalHostAttributes();this._marshalBehaviors();}});Polymer.Base._addFeature({_prepTemplate:function(){if(this._template===undefined){this._template=Polymer.DomModule.import(this.is,'template');}
+if(this._template&&this._template.hasAttribute('is')){this._warn(this._logf('_prepTemplate','top-level Polymer template '+'must not be a type-extension, found',this._template,'Move inside simple <template>.'));}
+if(this._template&&!this._template.content&&window.HTMLTemplateElement&&HTMLTemplateElement.decorate){HTMLTemplateElement.decorate(this._template);}},_stampTemplate:function(){if(this._template){this.root=this.instanceTemplate(this._template);}},instanceTemplate:function(template){var dom=document.importNode(template._content||template.content,true);return dom;}});(function(){var baseAttachedCallback=Polymer.Base.attachedCallback;Polymer.Base._addFeature({_hostStack:[],ready:function(){},_registerHost:function(host){this.dataHost=host=host||Polymer.Base._hostStack[Polymer.Base._hostStack.length-1];if(host&&host._clients){host._clients.push(this);}
+this._clients=null;this._clientsReadied=false;},_beginHosting:function(){Polymer.Base._hostStack.push(this);if(!this._clients){this._clients=[];}},_endHosting:function(){Polymer.Base._hostStack.pop();},_tryReady:function(){this._readied=false;if(this._canReady()){this._ready();}},_canReady:function(){return!this.dataHost||this.dataHost._clientsReadied;},_ready:function(){this._beforeClientsReady();if(this._template){this._setupRoot();this._readyClients();}
+this._clientsReadied=true;this._clients=null;this._afterClientsReady();this._readySelf();},_readyClients:function(){this._beginDistribute();var c$=this._clients;if(c$){for(var i=0,l=c$.length,c;i<l&&(c=c$[i]);i++){c._ready();}}
+this._finishDistribute();},_readySelf:function(){for(var i=0,b;i<this.behaviors.length;i++){b=this.behaviors[i];if(b.ready){b.ready.call(this);}}
+if(this.ready){this.ready();}
+this._readied=true;if(this._attachedPending){this._attachedPending=false;this.attachedCallback();}},_beforeClientsReady:function(){},_afterClientsReady:function(){},_beforeAttached:function(){},attachedCallback:function(){if(this._readied){this._beforeAttached();baseAttachedCallback.call(this);}else{this._attachedPending=true;}}});}());Polymer.ArraySplice=function(){function newSplice(index,removed,addedCount){return{index:index,removed:removed,addedCount:addedCount};}
+var EDIT_LEAVE=0;var EDIT_UPDATE=1;var EDIT_ADD=2;var EDIT_DELETE=3;function ArraySplice(){}
+ArraySplice.prototype={calcEditDistances:function(current,currentStart,currentEnd,old,oldStart,oldEnd){var rowCount=oldEnd-oldStart+1;var columnCount=currentEnd-currentStart+1;var distances=new Array(rowCount);for(var i=0;i<rowCount;i++){distances[i]=new Array(columnCount);distances[i][0]=i;}
+for(var j=0;j<columnCount;j++)
+distances[0][j]=j;for(i=1;i<rowCount;i++){for(j=1;j<columnCount;j++){if(this.equals(current[currentStart+j-1],old[oldStart+i-1]))
+distances[i][j]=distances[i-1][j-1];else{var north=distances[i-1][j]+1;var west=distances[i][j-1]+1;distances[i][j]=north<west?north:west;}}}
+return distances;},spliceOperationsFromEditDistances:function(distances){var i=distances.length-1;var j=distances[0].length-1;var current=distances[i][j];var edits=[];while(i>0||j>0){if(i==0){edits.push(EDIT_ADD);j--;continue;}
+if(j==0){edits.push(EDIT_DELETE);i--;continue;}
+var northWest=distances[i-1][j-1];var west=distances[i-1][j];var north=distances[i][j-1];var min;if(west<north)
+min=west<northWest?west:northWest;else
+min=north<northWest?north:northWest;if(min==northWest){if(northWest==current){edits.push(EDIT_LEAVE);}else{edits.push(EDIT_UPDATE);current=northWest;}
+i--;j--;}else if(min==west){edits.push(EDIT_DELETE);i--;current=west;}else{edits.push(EDIT_ADD);j--;current=north;}}
+edits.reverse();return edits;},calcSplices:function(current,currentStart,currentEnd,old,oldStart,oldEnd){var prefixCount=0;var suffixCount=0;var minLength=Math.min(currentEnd-currentStart,oldEnd-oldStart);if(currentStart==0&&oldStart==0)
+prefixCount=this.sharedPrefix(current,old,minLength);if(currentEnd==current.length&&oldEnd==old.length)
+suffixCount=this.sharedSuffix(current,old,minLength-prefixCount);currentStart+=prefixCount;oldStart+=prefixCount;currentEnd-=suffixCount;oldEnd-=suffixCount;if(currentEnd-currentStart==0&&oldEnd-oldStart==0)
+return[];if(currentStart==currentEnd){var splice=newSplice(currentStart,[],0);while(oldStart<oldEnd)
+splice.removed.push(old[oldStart++]);return[splice];}else if(oldStart==oldEnd)
+return[newSplice(currentStart,[],currentEnd-currentStart)];var ops=this.spliceOperationsFromEditDistances(this.calcEditDistances(current,currentStart,currentEnd,old,oldStart,oldEnd));splice=undefined;var splices=[];var index=currentStart;var oldIndex=oldStart;for(var i=0;i<ops.length;i++){switch(ops[i]){case EDIT_LEAVE:if(splice){splices.push(splice);splice=undefined;}
+index++;oldIndex++;break;case EDIT_UPDATE:if(!splice)
+splice=newSplice(index,[],0);splice.addedCount++;index++;splice.removed.push(old[oldIndex]);oldIndex++;break;case EDIT_ADD:if(!splice)
+splice=newSplice(index,[],0);splice.addedCount++;index++;break;case EDIT_DELETE:if(!splice)
+splice=newSplice(index,[],0);splice.removed.push(old[oldIndex]);oldIndex++;break;}}
+if(splice){splices.push(splice);}
+return splices;},sharedPrefix:function(current,old,searchLength){for(var i=0;i<searchLength;i++)
+if(!this.equals(current[i],old[i]))
+return i;return searchLength;},sharedSuffix:function(current,old,searchLength){var index1=current.length;var index2=old.length;var count=0;while(count<searchLength&&this.equals(current[--index1],old[--index2]))
+count++;return count;},calculateSplices:function(current,previous){return this.calcSplices(current,0,current.length,previous,0,previous.length);},equals:function(currentValue,previousValue){return currentValue===previousValue;}};return new ArraySplice();}();Polymer.domInnerHTML=function(){var escapeAttrRegExp=/[&\u00A0"]/g;var escapeDataRegExp=/[&\u00A0<>]/g;function escapeReplace(c){switch(c){case'&':return'&amp;';case'<':return'&lt;';case'>':return'&gt;';case'"':return'&quot;';case'\xA0':return'&nbsp;';}}
+function escapeAttr(s){return s.replace(escapeAttrRegExp,escapeReplace);}
+function escapeData(s){return s.replace(escapeDataRegExp,escapeReplace);}
+function makeSet(arr){var set={};for(var i=0;i<arr.length;i++){set[arr[i]]=true;}
+return set;}
+var voidElements=makeSet(['area','base','br','col','command','embed','hr','img','input','keygen','link','meta','param','source','track','wbr']);var plaintextParents=makeSet(['style','script','xmp','iframe','noembed','noframes','plaintext','noscript']);function getOuterHTML(node,parentNode,composed){switch(node.nodeType){case Node.ELEMENT_NODE:var tagName=node.localName;var s='<'+tagName;var attrs=node.attributes;for(var i=0,attr;attr=attrs[i];i++){s+=' '+attr.name+'="'+escapeAttr(attr.value)+'"';}
+s+='>';if(voidElements[tagName]){return s;}
+return s+getInnerHTML(node,composed)+'</'+tagName+'>';case Node.TEXT_NODE:var data=node.data;if(parentNode&&plaintextParents[parentNode.localName]){return data;}
+return escapeData(data);case Node.COMMENT_NODE:return'<!--'+node.data+'-->';default:console.error(node);throw new Error('not implemented');}}
+function getInnerHTML(node,composed){if(node instanceof HTMLTemplateElement)
+node=node.content;var s='';var c$=Polymer.dom(node).childNodes;for(var i=0,l=c$.length,child;i<l&&(child=c$[i]);i++){s+=getOuterHTML(child,node,composed);}
+return s;}
+return{getInnerHTML:getInnerHTML};}();(function(){'use strict';var nativeInsertBefore=Element.prototype.insertBefore;var nativeAppendChild=Element.prototype.appendChild;var nativeRemoveChild=Element.prototype.removeChild;Polymer.TreeApi={arrayCopyChildNodes:function(parent){var copy=[],i=0;for(var n=parent.firstChild;n;n=n.nextSibling){copy[i++]=n;}
+return copy;},arrayCopyChildren:function(parent){var copy=[],i=0;for(var n=parent.firstElementChild;n;n=n.nextElementSibling){copy[i++]=n;}
+return copy;},arrayCopy:function(a$){var l=a$.length;var copy=new Array(l);for(var i=0;i<l;i++){copy[i]=a$[i];}
+return copy;}};Polymer.TreeApi.Logical={hasParentNode:function(node){return Boolean(node.__dom&&node.__dom.parentNode);},hasChildNodes:function(node){return Boolean(node.__dom&&node.__dom.childNodes!==undefined);},getChildNodes:function(node){return this.hasChildNodes(node)?this._getChildNodes(node):node.childNodes;},_getChildNodes:function(node){if(!node.__dom.childNodes){node.__dom.childNodes=[];for(var n=node.__dom.firstChild;n;n=n.__dom.nextSibling){node.__dom.childNodes.push(n);}}
+return node.__dom.childNodes;},getParentNode:function(node){return node.__dom&&node.__dom.parentNode!==undefined?node.__dom.parentNode:node.parentNode;},getFirstChild:function(node){return node.__dom&&node.__dom.firstChild!==undefined?node.__dom.firstChild:node.firstChild;},getLastChild:function(node){return node.__dom&&node.__dom.lastChild!==undefined?node.__dom.lastChild:node.lastChild;},getNextSibling:function(node){return node.__dom&&node.__dom.nextSibling!==undefined?node.__dom.nextSibling:node.nextSibling;},getPreviousSibling:function(node){return node.__dom&&node.__dom.previousSibling!==undefined?node.__dom.previousSibling:node.previousSibling;},getFirstElementChild:function(node){return node.__dom&&node.__dom.firstChild!==undefined?this._getFirstElementChild(node):node.firstElementChild;},_getFirstElementChild:function(node){var n=node.__dom.firstChild;while(n&&n.nodeType!==Node.ELEMENT_NODE){n=n.__dom.nextSibling;}
+return n;},getLastElementChild:function(node){return node.__dom&&node.__dom.lastChild!==undefined?this._getLastElementChild(node):node.lastElementChild;},_getLastElementChild:function(node){var n=node.__dom.lastChild;while(n&&n.nodeType!==Node.ELEMENT_NODE){n=n.__dom.previousSibling;}
+return n;},getNextElementSibling:function(node){return node.__dom&&node.__dom.nextSibling!==undefined?this._getNextElementSibling(node):node.nextElementSibling;},_getNextElementSibling:function(node){var n=node.__dom.nextSibling;while(n&&n.nodeType!==Node.ELEMENT_NODE){n=n.__dom.nextSibling;}
+return n;},getPreviousElementSibling:function(node){return node.__dom&&node.__dom.previousSibling!==undefined?this._getPreviousElementSibling(node):node.previousElementSibling;},_getPreviousElementSibling:function(node){var n=node.__dom.previousSibling;while(n&&n.nodeType!==Node.ELEMENT_NODE){n=n.__dom.previousSibling;}
+return n;},saveChildNodes:function(node){if(!this.hasChildNodes(node)){node.__dom=node.__dom||{};node.__dom.firstChild=node.firstChild;node.__dom.lastChild=node.lastChild;node.__dom.childNodes=[];for(var n=node.firstChild;n;n=n.nextSibling){n.__dom=n.__dom||{};n.__dom.parentNode=node;node.__dom.childNodes.push(n);n.__dom.nextSibling=n.nextSibling;n.__dom.previousSibling=n.previousSibling;}}},recordInsertBefore:function(node,container,ref_node){container.__dom.childNodes=null;if(node.nodeType===Node.DOCUMENT_FRAGMENT_NODE){for(var n=node.firstChild;n;n=n.nextSibling){this._linkNode(n,container,ref_node);}}else{this._linkNode(node,container,ref_node);}},_linkNode:function(node,container,ref_node){node.__dom=node.__dom||{};container.__dom=container.__dom||{};if(ref_node){ref_node.__dom=ref_node.__dom||{};}
+node.__dom.previousSibling=ref_node?ref_node.__dom.previousSibling:container.__dom.lastChild;if(node.__dom.previousSibling){node.__dom.previousSibling.__dom.nextSibling=node;}
+node.__dom.nextSibling=ref_node||null;if(node.__dom.nextSibling){node.__dom.nextSibling.__dom.previousSibling=node;}
+node.__dom.parentNode=container;if(ref_node){if(ref_node===container.__dom.firstChild){container.__dom.firstChild=node;}}else{container.__dom.lastChild=node;if(!container.__dom.firstChild){container.__dom.firstChild=node;}}
+container.__dom.childNodes=null;},recordRemoveChild:function(node,container){node.__dom=node.__dom||{};container.__dom=container.__dom||{};if(node===container.__dom.firstChild){container.__dom.firstChild=node.__dom.nextSibling;}
+if(node===container.__dom.lastChild){container.__dom.lastChild=node.__dom.previousSibling;}
+var p=node.__dom.previousSibling;var n=node.__dom.nextSibling;if(p){p.__dom.nextSibling=n;}
+if(n){n.__dom.previousSibling=p;}
+node.__dom.parentNode=node.__dom.previousSibling=node.__dom.nextSibling=undefined;container.__dom.childNodes=null;}};Polymer.TreeApi.Composed={getChildNodes:function(node){return Polymer.TreeApi.arrayCopyChildNodes(node);},getParentNode:function(node){return node.parentNode;},clearChildNodes:function(node){node.textContent='';},insertBefore:function(parentNode,newChild,refChild){return nativeInsertBefore.call(parentNode,newChild,refChild||null);},appendChild:function(parentNode,newChild){return nativeAppendChild.call(parentNode,newChild);},removeChild:function(parentNode,node){return nativeRemoveChild.call(parentNode,node);}};}());Polymer.DomApi=function(){'use strict';var Settings=Polymer.Settings;var TreeApi=Polymer.TreeApi;var DomApi=function(node){this.node=needsToWrap?DomApi.wrap(node):node;};var needsToWrap=Settings.hasShadow&&!Settings.nativeShadow;DomApi.wrap=window.wrap?window.wrap:function(node){return node;};DomApi.prototype={flush:function(){Polymer.dom.flush();},deepContains:function(node){if(this.node.contains(node)){return true;}
+var n=node;var doc=node.ownerDocument;while(n&&n!==doc&&n!==this.node){n=Polymer.dom(n).parentNode||n.host;}
+return n===this.node;},queryDistributedElements:function(selector){var c$=this.getEffectiveChildNodes();var list=[];for(var i=0,l=c$.length,c;i<l&&(c=c$[i]);i++){if(c.nodeType===Node.ELEMENT_NODE&&DomApi.matchesSelector.call(c,selector)){list.push(c);}}
+return list;},getEffectiveChildNodes:function(){var list=[];var c$=this.childNodes;for(var i=0,l=c$.length,c;i<l&&(c=c$[i]);i++){if(c.localName===CONTENT){var d$=dom(c).getDistributedNodes();for(var j=0;j<d$.length;j++){list.push(d$[j]);}}else{list.push(c);}}
+return list;},observeNodes:function(callback){if(callback){if(!this.observer){this.observer=this.node.localName===CONTENT?new DomApi.DistributedNodesObserver(this):new DomApi.EffectiveNodesObserver(this);}
+return this.observer.addListener(callback);}},unobserveNodes:function(handle){if(this.observer){this.observer.removeListener(handle);}},notifyObserver:function(){if(this.observer){this.observer.notify();}},_query:function(matcher,node,halter){node=node||this.node;var list=[];this._queryElements(TreeApi.Logical.getChildNodes(node),matcher,halter,list);return list;},_queryElements:function(elements,matcher,halter,list){for(var i=0,l=elements.length,c;i<l&&(c=elements[i]);i++){if(c.nodeType===Node.ELEMENT_NODE){if(this._queryElement(c,matcher,halter,list)){return true;}}}},_queryElement:function(node,matcher,halter,list){var result=matcher(node);if(result){list.push(node);}
+if(halter&&halter(result)){return result;}
+this._queryElements(TreeApi.Logical.getChildNodes(node),matcher,halter,list);}};var CONTENT=DomApi.CONTENT='content';var dom=DomApi.factory=function(node){node=node||document;if(!node.__domApi){node.__domApi=new DomApi.ctor(node);}
+return node.__domApi;};DomApi.hasApi=function(node){return Boolean(node.__domApi);};DomApi.ctor=DomApi;Polymer.dom=function(obj,patch){if(obj instanceof Event){return Polymer.EventApi.factory(obj);}else{return DomApi.factory(obj,patch);}};var p=Element.prototype;DomApi.matchesSelector=p.matches||p.matchesSelector||p.mozMatchesSelector||p.msMatchesSelector||p.oMatchesSelector||p.webkitMatchesSelector;return DomApi;}();(function(){'use strict';var Settings=Polymer.Settings;var DomApi=Polymer.DomApi;var dom=DomApi.factory;var TreeApi=Polymer.TreeApi;var getInnerHTML=Polymer.domInnerHTML.getInnerHTML;var CONTENT=DomApi.CONTENT;if(Settings.useShadow){return;}
+var nativeCloneNode=Element.prototype.cloneNode;var nativeImportNode=Document.prototype.importNode;Polymer.Base.mixin(DomApi.prototype,{_lazyDistribute:function(host){if(host.shadyRoot&&host.shadyRoot._distributionClean){host.shadyRoot._distributionClean=false;Polymer.dom.addDebouncer(host.debounce('_distribute',host._distributeContent));}},appendChild:function(node){return this.insertBefore(node);},insertBefore:function(node,ref_node){if(ref_node&&TreeApi.Logical.getParentNode(ref_node)!==this.node){throw Error('The ref_node to be inserted before is not a child '+'of this node');}
+if(node.nodeType!==Node.DOCUMENT_FRAGMENT_NODE){var parent=TreeApi.Logical.getParentNode(node);if(parent){if(DomApi.hasApi(parent)){dom(parent).notifyObserver();}
+this._removeNode(node);}else{this._removeOwnerShadyRoot(node);}}
+if(!this._addNode(node,ref_node)){if(ref_node){ref_node=ref_node.localName===CONTENT?this._firstComposedNode(ref_node):ref_node;}
+var container=this.node._isShadyRoot?this.node.host:this.node;if(ref_node){TreeApi.Composed.insertBefore(container,node,ref_node);}else{TreeApi.Composed.appendChild(container,node);}}
+this.notifyObserver();return node;},_addNode:function(node,ref_node){var root=this.getOwnerRoot();if(root){var ipAdded=this._maybeAddInsertionPoint(node,this.node);if(!root._invalidInsertionPoints){root._invalidInsertionPoints=ipAdded;}
+this._addNodeToHost(root.host,node);}
+if(TreeApi.Logical.hasChildNodes(this.node)){TreeApi.Logical.recordInsertBefore(node,this.node,ref_node);}
+var handled=this._maybeDistribute(node)||this.node.shadyRoot;if(handled){if(node.nodeType===Node.DOCUMENT_FRAGMENT_NODE){while(node.firstChild){TreeApi.Composed.removeChild(node,node.firstChild);}}else{var parent=TreeApi.Composed.getParentNode(node);if(parent){TreeApi.Composed.removeChild(parent,node);}}}
+return handled;},removeChild:function(node){if(TreeApi.Logical.getParentNode(node)!==this.node){throw Error('The node to be removed is not a child of this node: '+node);}
+if(!this._removeNode(node)){var container=this.node._isShadyRoot?this.node.host:this.node;var parent=TreeApi.Composed.getParentNode(node);if(container===parent){TreeApi.Composed.removeChild(container,node);}}
+this.notifyObserver();return node;},_removeNode:function(node){var logicalParent=TreeApi.Logical.hasParentNode(node)&&TreeApi.Logical.getParentNode(node);var distributed;var root=this._ownerShadyRootForNode(node);if(logicalParent){distributed=dom(node)._maybeDistributeParent();TreeApi.Logical.recordRemoveChild(node,logicalParent);if(root&&this._removeDistributedChildren(root,node)){root._invalidInsertionPoints=true;this._lazyDistribute(root.host);}}
+this._removeOwnerShadyRoot(node);if(root){this._removeNodeFromHost(root.host,node);}
+return distributed;},replaceChild:function(node,ref_node){this.insertBefore(node,ref_node);this.removeChild(ref_node);return node;},_hasCachedOwnerRoot:function(node){return Boolean(node._ownerShadyRoot!==undefined);},getOwnerRoot:function(){return this._ownerShadyRootForNode(this.node);},_ownerShadyRootForNode:function(node){if(!node){return;}
+var root=node._ownerShadyRoot;if(root===undefined){if(node._isShadyRoot){root=node;}else{var parent=TreeApi.Logical.getParentNode(node);if(parent){root=parent._isShadyRoot?parent:this._ownerShadyRootForNode(parent);}else{root=null;}}
+if(root||document.documentElement.contains(node)){node._ownerShadyRoot=root;}}
+return root;},_maybeDistribute:function(node){var fragContent=node.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&!node.__noContent&&dom(node).querySelector(CONTENT);var wrappedContent=fragContent&&TreeApi.Logical.getParentNode(fragContent).nodeType!==Node.DOCUMENT_FRAGMENT_NODE;var hasContent=fragContent||node.localName===CONTENT;if(hasContent){var root=this.getOwnerRoot();if(root){this._lazyDistribute(root.host);}}
+var needsDist=this._nodeNeedsDistribution(this.node);if(needsDist){this._lazyDistribute(this.node);}
+return needsDist||hasContent&&!wrappedContent;},_maybeAddInsertionPoint:function(node,parent){var added;if(node.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&!node.__noContent){var c$=dom(node).querySelectorAll(CONTENT);for(var i=0,n,np,na;i<c$.length&&(n=c$[i]);i++){np=TreeApi.Logical.getParentNode(n);if(np===node){np=parent;}
+na=this._maybeAddInsertionPoint(n,np);added=added||na;}}else if(node.localName===CONTENT){TreeApi.Logical.saveChildNodes(parent);TreeApi.Logical.saveChildNodes(node);added=true;}
+return added;},_updateInsertionPoints:function(host){var i$=host.shadyRoot._insertionPoints=dom(host.shadyRoot).querySelectorAll(CONTENT);for(var i=0,c;i<i$.length;i++){c=i$[i];TreeApi.Logical.saveChildNodes(c);TreeApi.Logical.saveChildNodes(TreeApi.Logical.getParentNode(c));}},_nodeNeedsDistribution:function(node){return node&&node.shadyRoot&&DomApi.hasInsertionPoint(node.shadyRoot);},_addNodeToHost:function(host,node){if(host._elementAdd){host._elementAdd(node);}},_removeNodeFromHost:function(host,node){if(host._elementRemove){host._elementRemove(node);}},_removeDistributedChildren:function(root,container){var hostNeedsDist;var ip$=root._insertionPoints;for(var i=0;i<ip$.length;i++){var content=ip$[i];if(this._contains(container,content)){var dc$=dom(content).getDistributedNodes();for(var j=0;j<dc$.length;j++){hostNeedsDist=true;var node=dc$[j];var parent=TreeApi.Composed.getParentNode(node);if(parent){TreeApi.Composed.removeChild(parent,node);}}}}
+return hostNeedsDist;},_contains:function(container,node){while(node){if(node==container){return true;}
+node=TreeApi.Logical.getParentNode(node);}},_removeOwnerShadyRoot:function(node){if(this._hasCachedOwnerRoot(node)){var c$=TreeApi.Logical.getChildNodes(node);for(var i=0,l=c$.length,n;i<l&&(n=c$[i]);i++){this._removeOwnerShadyRoot(n);}}
+node._ownerShadyRoot=undefined;},_firstComposedNode:function(content){var n$=dom(content).getDistributedNodes();for(var i=0,l=n$.length,n,p$;i<l&&(n=n$[i]);i++){p$=dom(n).getDestinationInsertionPoints();if(p$[p$.length-1]===content){return n;}}},querySelector:function(selector){var result=this._query(function(n){return DomApi.matchesSelector.call(n,selector);},this.node,function(n){return Boolean(n);})[0];return result||null;},querySelectorAll:function(selector){return this._query(function(n){return DomApi.matchesSelector.call(n,selector);},this.node);},getDestinationInsertionPoints:function(){return this.node._destinationInsertionPoints||[];},getDistributedNodes:function(){return this.node._distributedNodes||[];},_clear:function(){while(this.childNodes.length){this.removeChild(this.childNodes[0]);}},setAttribute:function(name,value){this.node.setAttribute(name,value);this._maybeDistributeParent();},removeAttribute:function(name){this.node.removeAttribute(name);this._maybeDistributeParent();},_maybeDistributeParent:function(){if(this._nodeNeedsDistribution(this.parentNode)){this._lazyDistribute(this.parentNode);return true;}},cloneNode:function(deep){var n=nativeCloneNode.call(this.node,false);if(deep){var c$=this.childNodes;var d=dom(n);for(var i=0,nc;i<c$.length;i++){nc=dom(c$[i]).cloneNode(true);d.appendChild(nc);}}
+return n;},importNode:function(externalNode,deep){var doc=this.node instanceof Document?this.node:this.node.ownerDocument;var n=nativeImportNode.call(doc,externalNode,false);if(deep){var c$=TreeApi.Logical.getChildNodes(externalNode);var d=dom(n);for(var i=0,nc;i<c$.length;i++){nc=dom(doc).importNode(c$[i],true);d.appendChild(nc);}}
+return n;},_getComposedInnerHTML:function(){return getInnerHTML(this.node,true);}});Object.defineProperties(DomApi.prototype,{activeElement:{get:function(){var active=document.activeElement;if(!active){return null;}
+var isShadyRoot=!!this.node._isShadyRoot;if(this.node!==document){if(!isShadyRoot){return null;}
+if(this.node.host===active||!this.node.host.contains(active)){return null;}}
+var activeRoot=dom(active).getOwnerRoot();while(activeRoot&&activeRoot!==this.node){active=activeRoot.host;activeRoot=dom(active).getOwnerRoot();}
+if(this.node===document){return activeRoot?null:active;}else{return activeRoot===this.node?active:null;}},configurable:true},childNodes:{get:function(){var c$=TreeApi.Logical.getChildNodes(this.node);return Array.isArray(c$)?c$:TreeApi.arrayCopyChildNodes(this.node);},configurable:true},children:{get:function(){if(TreeApi.Logical.hasChildNodes(this.node)){return Array.prototype.filter.call(this.childNodes,function(n){return n.nodeType===Node.ELEMENT_NODE;});}else{return TreeApi.arrayCopyChildren(this.node);}},configurable:true},parentNode:{get:function(){return TreeApi.Logical.getParentNode(this.node);},configurable:true},firstChild:{get:function(){return TreeApi.Logical.getFirstChild(this.node);},configurable:true},lastChild:{get:function(){return TreeApi.Logical.getLastChild(this.node);},configurable:true},nextSibling:{get:function(){return TreeApi.Logical.getNextSibling(this.node);},configurable:true},previousSibling:{get:function(){return TreeApi.Logical.getPreviousSibling(this.node);},configurable:true},firstElementChild:{get:function(){return TreeApi.Logical.getFirstElementChild(this.node);},configurable:true},lastElementChild:{get:function(){return TreeApi.Logical.getLastElementChild(this.node);},configurable:true},nextElementSibling:{get:function(){return TreeApi.Logical.getNextElementSibling(this.node);},configurable:true},previousElementSibling:{get:function(){return TreeApi.Logical.getPreviousElementSibling(this.node);},configurable:true},textContent:{get:function(){var nt=this.node.nodeType;if(nt===Node.TEXT_NODE||nt===Node.COMMENT_NODE){return this.node.textContent;}else{var tc=[];for(var i=0,cn=this.childNodes,c;c=cn[i];i++){if(c.nodeType!==Node.COMMENT_NODE){tc.push(c.textContent);}}
+return tc.join('');}},set:function(text){var nt=this.node.nodeType;if(nt===Node.TEXT_NODE||nt===Node.COMMENT_NODE){this.node.textContent=text;}else{this._clear();if(text){this.appendChild(document.createTextNode(text));}}},configurable:true},innerHTML:{get:function(){var nt=this.node.nodeType;if(nt===Node.TEXT_NODE||nt===Node.COMMENT_NODE){return null;}else{return getInnerHTML(this.node);}},set:function(text){var nt=this.node.nodeType;if(nt!==Node.TEXT_NODE||nt!==Node.COMMENT_NODE){this._clear();var d=document.createElement('div');d.innerHTML=text;var c$=TreeApi.arrayCopyChildNodes(d);for(var i=0;i<c$.length;i++){this.appendChild(c$[i]);}}},configurable:true}});DomApi.hasInsertionPoint=function(root){return Boolean(root&&root._insertionPoints.length);};}());(function(){'use strict';var Settings=Polymer.Settings;var TreeApi=Polymer.TreeApi;var DomApi=Polymer.DomApi;if(!Settings.useShadow){return;}
+Polymer.Base.mixin(DomApi.prototype,{querySelectorAll:function(selector){return TreeApi.arrayCopy(this.node.querySelectorAll(selector));},getOwnerRoot:function(){var n=this.node;while(n){if(n.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&n.host){return n;}
+n=n.parentNode;}},importNode:function(externalNode,deep){var doc=this.node instanceof Document?this.node:this.node.ownerDocument;return doc.importNode(externalNode,deep);},getDestinationInsertionPoints:function(){var n$=this.node.getDestinationInsertionPoints&&this.node.getDestinationInsertionPoints();return n$?TreeApi.arrayCopy(n$):[];},getDistributedNodes:function(){var n$=this.node.getDistributedNodes&&this.node.getDistributedNodes();return n$?TreeApi.arrayCopy(n$):[];}});Object.defineProperties(DomApi.prototype,{activeElement:{get:function(){var node=DomApi.wrap(this.node);var activeElement=node.activeElement;return node.contains(activeElement)?activeElement:null;},configurable:true},childNodes:{get:function(){return TreeApi.arrayCopyChildNodes(this.node);},configurable:true},children:{get:function(){return TreeApi.arrayCopyChildren(this.node);},configurable:true},textContent:{get:function(){return this.node.textContent;},set:function(value){return this.node.textContent=value;},configurable:true},innerHTML:{get:function(){return this.node.innerHTML;},set:function(value){return this.node.innerHTML=value;},configurable:true}});var forwardMethods=function(m$){for(var i=0;i<m$.length;i++){forwardMethod(m$[i]);}};var forwardMethod=function(method){DomApi.prototype[method]=function(){return this.node[method].apply(this.node,arguments);};};forwardMethods(['cloneNode','appendChild','insertBefore','removeChild','replaceChild','setAttribute','removeAttribute','querySelector']);var forwardProperties=function(f$){for(var i=0;i<f$.length;i++){forwardProperty(f$[i]);}};var forwardProperty=function(name){Object.defineProperty(DomApi.prototype,name,{get:function(){return this.node[name];},configurable:true});};forwardProperties(['parentNode','firstChild','lastChild','nextSibling','previousSibling','firstElementChild','lastElementChild','nextElementSibling','previousElementSibling']);}());Polymer.Base.mixin(Polymer.dom,{_flushGuard:0,_FLUSH_MAX:100,_needsTakeRecords:!Polymer.Settings.useNativeCustomElements,_debouncers:[],_staticFlushList:[],_finishDebouncer:null,flush:function(){this._flushGuard=0;this._prepareFlush();while(this._debouncers.length&&this._flushGuard<this._FLUSH_MAX){while(this._debouncers.length){this._debouncers.shift().complete();}
+if(this._finishDebouncer){this._finishDebouncer.complete();}
+this._prepareFlush();this._flushGuard++;}
+if(this._flushGuard>=this._FLUSH_MAX){console.warn('Polymer.dom.flush aborted. Flush may not be complete.');}},_prepareFlush:function(){if(this._needsTakeRecords){CustomElements.takeRecords();}
+for(var i=0;i<this._staticFlushList.length;i++){this._staticFlushList[i]();}},addStaticFlush:function(fn){this._staticFlushList.push(fn);},removeStaticFlush:function(fn){var i=this._staticFlushList.indexOf(fn);if(i>=0){this._staticFlushList.splice(i,1);}},addDebouncer:function(debouncer){this._debouncers.push(debouncer);this._finishDebouncer=Polymer.Debounce(this._finishDebouncer,this._finishFlush);},_finishFlush:function(){Polymer.dom._debouncers=[];}});Polymer.EventApi=function(){'use strict';var DomApi=Polymer.DomApi.ctor;var Settings=Polymer.Settings;DomApi.Event=function(event){this.event=event;};if(Settings.useShadow){DomApi.Event.prototype={get rootTarget(){return this.event.path[0];},get localTarget(){return this.event.target;},get path(){var path=this.event.path;if(!Array.isArray(path)){path=Array.prototype.slice.call(path);}
+return path;}};}else{DomApi.Event.prototype={get rootTarget(){return this.event.target;},get localTarget(){var current=this.event.currentTarget;var currentRoot=current&&Polymer.dom(current).getOwnerRoot();var p$=this.path;for(var i=0;i<p$.length;i++){if(Polymer.dom(p$[i]).getOwnerRoot()===currentRoot){return p$[i];}}},get path(){if(!this.event._path){var path=[];var current=this.rootTarget;while(current){path.push(current);var insertionPoints=Polymer.dom(current).getDestinationInsertionPoints();if(insertionPoints.length){for(var i=0;i<insertionPoints.length-1;i++){path.push(insertionPoints[i]);}
+current=insertionPoints[insertionPoints.length-1];}else{current=Polymer.dom(current).parentNode||current.host;}}
+path.push(window);this.event._path=path;}
+return this.event._path;}};}
+var factory=function(event){if(!event.__eventApi){event.__eventApi=new DomApi.Event(event);}
+return event.__eventApi;};return{factory:factory};}();(function(){'use strict';var DomApi=Polymer.DomApi.ctor;var useShadow=Polymer.Settings.useShadow;Object.defineProperty(DomApi.prototype,'classList',{get:function(){if(!this._classList){this._classList=new DomApi.ClassList(this);}
+return this._classList;},configurable:true});DomApi.ClassList=function(host){this.domApi=host;this.node=host.node;};DomApi.ClassList.prototype={add:function(){this.node.classList.add.apply(this.node.classList,arguments);this._distributeParent();},remove:function(){this.node.classList.remove.apply(this.node.classList,arguments);this._distributeParent();},toggle:function(){this.node.classList.toggle.apply(this.node.classList,arguments);this._distributeParent();},_distributeParent:function(){if(!useShadow){this.domApi._maybeDistributeParent();}},contains:function(){return this.node.classList.contains.apply(this.node.classList,arguments);}};}());(function(){'use strict';var DomApi=Polymer.DomApi.ctor;var Settings=Polymer.Settings;DomApi.EffectiveNodesObserver=function(domApi){this.domApi=domApi;this.node=this.domApi.node;this._listeners=[];};DomApi.EffectiveNodesObserver.prototype={addListener:function(callback){if(!this._isSetup){this._setup();this._isSetup=true;}
+var listener={fn:callback,_nodes:[]};this._listeners.push(listener);this._scheduleNotify();return listener;},removeListener:function(handle){var i=this._listeners.indexOf(handle);if(i>=0){this._listeners.splice(i,1);handle._nodes=[];}
+if(!this._hasListeners()){this._cleanup();this._isSetup=false;}},_setup:function(){this._observeContentElements(this.domApi.childNodes);},_cleanup:function(){this._unobserveContentElements(this.domApi.childNodes);},_hasListeners:function(){return Boolean(this._listeners.length);},_scheduleNotify:function(){if(this._debouncer){this._debouncer.stop();}
+this._debouncer=Polymer.Debounce(this._debouncer,this._notify);this._debouncer.context=this;Polymer.dom.addDebouncer(this._debouncer);},notify:function(){if(this._hasListeners()){this._scheduleNotify();}},_notify:function(){this._beforeCallListeners();this._callListeners();},_beforeCallListeners:function(){this._updateContentElements();},_updateContentElements:function(){this._observeContentElements(this.domApi.childNodes);},_observeContentElements:function(elements){for(var i=0,n;i<elements.length&&(n=elements[i]);i++){if(this._isContent(n)){n.__observeNodesMap=n.__observeNodesMap||new WeakMap();if(!n.__observeNodesMap.has(this)){n.__observeNodesMap.set(this,this._observeContent(n));}}}},_observeContent:function(content){var self=this;var h=Polymer.dom(content).observeNodes(function(){self._scheduleNotify();});h._avoidChangeCalculation=true;return h;},_unobserveContentElements:function(elements){for(var i=0,n,h;i<elements.length&&(n=elements[i]);i++){if(this._isContent(n)){h=n.__observeNodesMap.get(this);if(h){Polymer.dom(n).unobserveNodes(h);n.__observeNodesMap.delete(this);}}}},_isContent:function(node){return node.localName==='content';},_callListeners:function(){var o$=this._listeners;var nodes=this._getEffectiveNodes();for(var i=0,o;i<o$.length&&(o=o$[i]);i++){var info=this._generateListenerInfo(o,nodes);if(info||o._alwaysNotify){this._callListener(o,info);}}},_getEffectiveNodes:function(){return this.domApi.getEffectiveChildNodes();},_generateListenerInfo:function(listener,newNodes){if(listener._avoidChangeCalculation){return true;}
+var oldNodes=listener._nodes;var info={target:this.node,addedNodes:[],removedNodes:[]};var splices=Polymer.ArraySplice.calculateSplices(newNodes,oldNodes);for(var i=0,s;i<splices.length&&(s=splices[i]);i++){for(var j=0,n;j<s.removed.length&&(n=s.removed[j]);j++){info.removedNodes.push(n);}}
+for(i=0,s;i<splices.length&&(s=splices[i]);i++){for(j=s.index;j<s.index+s.addedCount;j++){info.addedNodes.push(newNodes[j]);}}
+listener._nodes=newNodes;if(info.addedNodes.length||info.removedNodes.length){return info;}},_callListener:function(listener,info){return listener.fn.call(this.node,info);},enableShadowAttributeTracking:function(){}};if(Settings.useShadow){var baseSetup=DomApi.EffectiveNodesObserver.prototype._setup;var baseCleanup=DomApi.EffectiveNodesObserver.prototype._cleanup;Polymer.Base.mixin(DomApi.EffectiveNodesObserver.prototype,{_setup:function(){if(!this._observer){var self=this;this._mutationHandler=function(mxns){if(mxns&&mxns.length){self._scheduleNotify();}};this._observer=new MutationObserver(this._mutationHandler);this._boundFlush=function(){self._flush();};Polymer.dom.addStaticFlush(this._boundFlush);this._observer.observe(this.node,{childList:true});}
+baseSetup.call(this);},_cleanup:function(){this._observer.disconnect();this._observer=null;this._mutationHandler=null;Polymer.dom.removeStaticFlush(this._boundFlush);baseCleanup.call(this);},_flush:function(){if(this._observer){this._mutationHandler(this._observer.takeRecords());}},enableShadowAttributeTracking:function(){if(this._observer){this._makeContentListenersAlwaysNotify();this._observer.disconnect();this._observer.observe(this.node,{childList:true,attributes:true,subtree:true});var root=this.domApi.getOwnerRoot();var host=root&&root.host;if(host&&Polymer.dom(host).observer){Polymer.dom(host).observer.enableShadowAttributeTracking();}}},_makeContentListenersAlwaysNotify:function(){for(var i=0,h;i<this._listeners.length;i++){h=this._listeners[i];h._alwaysNotify=h._isContentListener;}}});}}());(function(){'use strict';var DomApi=Polymer.DomApi.ctor;var Settings=Polymer.Settings;DomApi.DistributedNodesObserver=function(domApi){DomApi.EffectiveNodesObserver.call(this,domApi);};DomApi.DistributedNodesObserver.prototype=Object.create(DomApi.EffectiveNodesObserver.prototype);Polymer.Base.mixin(DomApi.DistributedNodesObserver.prototype,{_setup:function(){},_cleanup:function(){},_beforeCallListeners:function(){},_getEffectiveNodes:function(){return this.domApi.getDistributedNodes();}});if(Settings.useShadow){Polymer.Base.mixin(DomApi.DistributedNodesObserver.prototype,{_setup:function(){if(!this._observer){var root=this.domApi.getOwnerRoot();var host=root&&root.host;if(host){var self=this;this._observer=Polymer.dom(host).observeNodes(function(){self._scheduleNotify();});this._observer._isContentListener=true;if(this._hasAttrSelect()){Polymer.dom(host).observer.enableShadowAttributeTracking();}}}},_hasAttrSelect:function(){var select=this.node.getAttribute('select');return select&&select.match(/[[.]+/);},_cleanup:function(){var root=this.domApi.getOwnerRoot();var host=root&&root.host;if(host){Polymer.dom(host).unobserveNodes(this._observer);}
+this._observer=null;}});}}());(function(){var DomApi=Polymer.DomApi;var TreeApi=Polymer.TreeApi;Polymer.Base._addFeature({_prepShady:function(){this._useContent=this._useContent||Boolean(this._template);},_setupShady:function(){this.shadyRoot=null;if(!this.__domApi){this.__domApi=null;}
+if(!this.__dom){this.__dom=null;}
+if(!this._ownerShadyRoot){this._ownerShadyRoot=undefined;}},_poolContent:function(){if(this._useContent){TreeApi.Logical.saveChildNodes(this);}},_setupRoot:function(){if(this._useContent){this._createLocalRoot();if(!this.dataHost){upgradeLogicalChildren(TreeApi.Logical.getChildNodes(this));}}},_createLocalRoot:function(){this.shadyRoot=this.root;this.shadyRoot._distributionClean=false;this.shadyRoot._hasDistributed=false;this.shadyRoot._isShadyRoot=true;this.shadyRoot._dirtyRoots=[];var i$=this.shadyRoot._insertionPoints=!this._notes||this._notes._hasContent?this.shadyRoot.querySelectorAll('content'):[];TreeApi.Logical.saveChildNodes(this.shadyRoot);for(var i=0,c;i<i$.length;i++){c=i$[i];TreeApi.Logical.saveChildNodes(c);TreeApi.Logical.saveChildNodes(c.parentNode);}
+this.shadyRoot.host=this;},distributeContent:function(updateInsertionPoints){if(this.shadyRoot){this.shadyRoot._invalidInsertionPoints=this.shadyRoot._invalidInsertionPoints||updateInsertionPoints;var host=getTopDistributingHost(this);Polymer.dom(this)._lazyDistribute(host);}},_distributeContent:function(){if(this._useContent&&!this.shadyRoot._distributionClean){if(this.shadyRoot._invalidInsertionPoints){Polymer.dom(this)._updateInsertionPoints(this);this.shadyRoot._invalidInsertionPoints=false;}
+this._beginDistribute();this._distributeDirtyRoots();this._finishDistribute();}},_beginDistribute:function(){if(this._useContent&&DomApi.hasInsertionPoint(this.shadyRoot)){this._resetDistribution();this._distributePool(this.shadyRoot,this._collectPool());}},_distributeDirtyRoots:function(){var c$=this.shadyRoot._dirtyRoots;for(var i=0,l=c$.length,c;i<l&&(c=c$[i]);i++){c._distributeContent();}
+this.shadyRoot._dirtyRoots=[];},_finishDistribute:function(){if(this._useContent){this.shadyRoot._distributionClean=true;if(DomApi.hasInsertionPoint(this.shadyRoot)){this._composeTree();notifyContentObservers(this.shadyRoot);}else{if(!this.shadyRoot._hasDistributed){TreeApi.Composed.clearChildNodes(this);this.appendChild(this.shadyRoot);}else{var children=this._composeNode(this);this._updateChildNodes(this,children);}}
+if(!this.shadyRoot._hasDistributed){notifyInitialDistribution(this);}
+this.shadyRoot._hasDistributed=true;}},elementMatches:function(selector,node){node=node||this;return DomApi.matchesSelector.call(node,selector);},_resetDistribution:function(){var children=TreeApi.Logical.getChildNodes(this);for(var i=0;i<children.length;i++){var child=children[i];if(child._destinationInsertionPoints){child._destinationInsertionPoints=undefined;}
+if(isInsertionPoint(child)){clearDistributedDestinationInsertionPoints(child);}}
+var root=this.shadyRoot;var p$=root._insertionPoints;for(var j=0;j<p$.length;j++){p$[j]._distributedNodes=[];}},_collectPool:function(){var pool=[];var children=TreeApi.Logical.getChildNodes(this);for(var i=0;i<children.length;i++){var child=children[i];if(isInsertionPoint(child)){pool.push.apply(pool,child._distributedNodes);}else{pool.push(child);}}
+return pool;},_distributePool:function(node,pool){var p$=node._insertionPoints;for(var i=0,l=p$.length,p;i<l&&(p=p$[i]);i++){this._distributeInsertionPoint(p,pool);maybeRedistributeParent(p,this);}},_distributeInsertionPoint:function(content,pool){var anyDistributed=false;for(var i=0,l=pool.length,node;i<l;i++){node=pool[i];if(!node){continue;}
+if(this._matchesContentSelect(node,content)){distributeNodeInto(node,content);pool[i]=undefined;anyDistributed=true;}}
+if(!anyDistributed){var children=TreeApi.Logical.getChildNodes(content);for(var j=0;j<children.length;j++){distributeNodeInto(children[j],content);}}},_composeTree:function(){this._updateChildNodes(this,this._composeNode(this));var p$=this.shadyRoot._insertionPoints;for(var i=0,l=p$.length,p,parent;i<l&&(p=p$[i]);i++){parent=TreeApi.Logical.getParentNode(p);if(!parent._useContent&&parent!==this&&parent!==this.shadyRoot){this._updateChildNodes(parent,this._composeNode(parent));}}},_composeNode:function(node){var children=[];var c$=TreeApi.Logical.getChildNodes(node.shadyRoot||node);for(var i=0;i<c$.length;i++){var child=c$[i];if(isInsertionPoint(child)){var distributedNodes=child._distributedNodes;for(var j=0;j<distributedNodes.length;j++){var distributedNode=distributedNodes[j];if(isFinalDestination(child,distributedNode)){children.push(distributedNode);}}}else{children.push(child);}}
+return children;},_updateChildNodes:function(container,children){var composed=TreeApi.Composed.getChildNodes(container);var splices=Polymer.ArraySplice.calculateSplices(children,composed);for(var i=0,d=0,s;i<splices.length&&(s=splices[i]);i++){for(var j=0,n;j<s.removed.length&&(n=s.removed[j]);j++){if(TreeApi.Composed.getParentNode(n)===container){TreeApi.Composed.removeChild(container,n);}
+composed.splice(s.index+d,1);}
+d-=s.addedCount;}
+for(var i=0,s,next;i<splices.length&&(s=splices[i]);i++){next=composed[s.index];for(j=s.index,n;j<s.index+s.addedCount;j++){n=children[j];TreeApi.Composed.insertBefore(container,n,next);composed.splice(j,0,n);}}},_matchesContentSelect:function(node,contentElement){var select=contentElement.getAttribute('select');if(!select){return true;}
+select=select.trim();if(!select){return true;}
+if(!(node instanceof Element)){return false;}
+var validSelectors=/^(:not\()?[*.#[a-zA-Z_|]/;if(!validSelectors.test(select)){return false;}
+return this.elementMatches(select,node);},_elementAdd:function(){},_elementRemove:function(){}});var domHostDesc={get:function(){var root=Polymer.dom(this).getOwnerRoot();return root&&root.host;},configurable:true};Object.defineProperty(Polymer.Base,'domHost',domHostDesc);Polymer.BaseDescriptors.domHost=domHostDesc;function distributeNodeInto(child,insertionPoint){insertionPoint._distributedNodes.push(child);var points=child._destinationInsertionPoints;if(!points){child._destinationInsertionPoints=[insertionPoint];}else{points.push(insertionPoint);}}
+function clearDistributedDestinationInsertionPoints(content){var e$=content._distributedNodes;if(e$){for(var i=0;i<e$.length;i++){var d=e$[i]._destinationInsertionPoints;if(d){d.splice(d.indexOf(content)+1,d.length);}}}}
+function maybeRedistributeParent(content,host){var parent=TreeApi.Logical.getParentNode(content);if(parent&&parent.shadyRoot&&DomApi.hasInsertionPoint(parent.shadyRoot)&&parent.shadyRoot._distributionClean){parent.shadyRoot._distributionClean=false;host.shadyRoot._dirtyRoots.push(parent);}}
+function isFinalDestination(insertionPoint,node){var points=node._destinationInsertionPoints;return points&&points[points.length-1]===insertionPoint;}
+function isInsertionPoint(node){return node.localName=='content';}
+function getTopDistributingHost(host){while(host&&hostNeedsRedistribution(host)){host=host.domHost;}
+return host;}
+function hostNeedsRedistribution(host){var c$=TreeApi.Logical.getChildNodes(host);for(var i=0,c;i<c$.length;i++){c=c$[i];if(c.localName&&c.localName==='content'){return host.domHost;}}}
+function notifyContentObservers(root){for(var i=0,c;i<root._insertionPoints.length;i++){c=root._insertionPoints[i];if(DomApi.hasApi(c)){Polymer.dom(c).notifyObserver();}}}
+function notifyInitialDistribution(host){if(DomApi.hasApi(host)){Polymer.dom(host).notifyObserver();}}
+var needsUpgrade=window.CustomElements&&!CustomElements.useNative;function upgradeLogicalChildren(children){if(needsUpgrade&&children){for(var i=0;i<children.length;i++){CustomElements.upgrade(children[i]);}}}}());if(Polymer.Settings.useShadow){Polymer.Base._addFeature({_poolContent:function(){},_beginDistribute:function(){},distributeContent:function(){},_distributeContent:function(){},_finishDistribute:function(){},_createLocalRoot:function(){this.createShadowRoot();this.shadowRoot.appendChild(this.root);this.root=this.shadowRoot;}});}Polymer.Async={_currVal:0,_lastVal:0,_callbacks:[],_twiddleContent:0,_twiddle:document.createTextNode(''),run:function(callback,waitTime){if(waitTime>0){return~setTimeout(callback,waitTime);}else{this._twiddle.textContent=this._twiddleContent++;this._callbacks.push(callback);return this._currVal++;}},cancel:function(handle){if(handle<0){clearTimeout(~handle);}else{var idx=handle-this._lastVal;if(idx>=0){if(!this._callbacks[idx]){throw'invalid async handle: '+handle;}
+this._callbacks[idx]=null;}}},_atEndOfMicrotask:function(){var len=this._callbacks.length;for(var i=0;i<len;i++){var cb=this._callbacks[i];if(cb){try{cb();}catch(e){i++;this._callbacks.splice(0,i);this._lastVal+=i;this._twiddle.textContent=this._twiddleContent++;throw e;}}}
+this._callbacks.splice(0,len);this._lastVal+=len;}};new window.MutationObserver(function(){Polymer.Async._atEndOfMicrotask();}).observe(Polymer.Async._twiddle,{characterData:true});Polymer.Debounce=function(){var Async=Polymer.Async;var Debouncer=function(context){this.context=context;var self=this;this.boundComplete=function(){self.complete();};};Debouncer.prototype={go:function(callback,wait){var h;this.finish=function(){Async.cancel(h);};h=Async.run(this.boundComplete,wait);this.callback=callback;},stop:function(){if(this.finish){this.finish();this.finish=null;this.callback=null;}},complete:function(){if(this.finish){var callback=this.callback;this.stop();callback.call(this.context);}}};function debounce(debouncer,callback,wait){if(debouncer){debouncer.stop();}else{debouncer=new Debouncer(this);}
+debouncer.go(callback,wait);return debouncer;}
+return debounce;}();Polymer.Base._addFeature({_setupDebouncers:function(){this._debouncers={};},debounce:function(jobName,callback,wait){return this._debouncers[jobName]=Polymer.Debounce.call(this,this._debouncers[jobName],callback,wait);},isDebouncerActive:function(jobName){var debouncer=this._debouncers[jobName];return!!(debouncer&&debouncer.finish);},flushDebouncer:function(jobName){var debouncer=this._debouncers[jobName];if(debouncer){debouncer.complete();}},cancelDebouncer:function(jobName){var debouncer=this._debouncers[jobName];if(debouncer){debouncer.stop();}}});Polymer.DomModule=document.createElement('dom-module');Polymer.Base._addFeature({_registerFeatures:function(){this._prepIs();this._prepBehaviors();this._prepConstructor();this._prepTemplate();this._prepShady();this._prepPropertyInfo();},_prepBehavior:function(b){this._addHostAttributes(b.hostAttributes);},_initFeatures:function(){this._registerHost();if(this._template){this._poolContent();this._beginHosting();this._stampTemplate();this._endHosting();}
+this._marshalHostAttributes();this._setupDebouncers();this._marshalBehaviors();this._tryReady();},_marshalBehavior:function(b){}});(function(){Polymer.nar=[];var disableUpgradeEnabled=Polymer.Settings.disableUpgradeEnabled;Polymer.Annotations={parseAnnotations:function(template,stripWhiteSpace){var list=[];var content=template._content||template.content;this._parseNodeAnnotations(content,list,stripWhiteSpace||template.hasAttribute('strip-whitespace'));return list;},_parseNodeAnnotations:function(node,list,stripWhiteSpace){return node.nodeType===Node.TEXT_NODE?this._parseTextNodeAnnotation(node,list):this._parseElementAnnotations(node,list,stripWhiteSpace);},_bindingRegex:function(){var IDENT='(?:'+'[a-zA-Z_$][\\w.:$\\-*]*'+')';var NUMBER='(?:'+'[-+]?[0-9]*\\.?[0-9]+(?:[eE][-+]?[0-9]+)?'+')';var SQUOTE_STRING='(?:'+'\'(?:[^\'\\\\]|\\\\.)*\''+')';var DQUOTE_STRING='(?:'+'"(?:[^"\\\\]|\\\\.)*"'+')';var STRING='(?:'+SQUOTE_STRING+'|'+DQUOTE_STRING+')';var ARGUMENT='(?:'+IDENT+'|'+NUMBER+'|'+STRING+'\\s*'+')';var ARGUMENTS='(?:'+ARGUMENT+'(?:,\\s*'+ARGUMENT+')*'+')';var ARGUMENT_LIST='(?:'+'\\(\\s*'+'(?:'+ARGUMENTS+'?'+')'+'\\)\\s*'+')';var BINDING='('+IDENT+'\\s*'+ARGUMENT_LIST+'?'+')';var OPEN_BRACKET='(\\[\\[|{{)'+'\\s*';var CLOSE_BRACKET='(?:]]|}})';var NEGATE='(?:(!)\\s*)?';var EXPRESSION=OPEN_BRACKET+NEGATE+BINDING+CLOSE_BRACKET;return new RegExp(EXPRESSION,'g');}(),_parseBindings:function(text){var re=this._bindingRegex;var parts=[];var lastIndex=0;var m;while((m=re.exec(text))!==null){if(m.index>lastIndex){parts.push({literal:text.slice(lastIndex,m.index)});}
+var mode=m[1][0];var negate=Boolean(m[2]);var value=m[3].trim();var customEvent,notifyEvent,colon;if(mode=='{'&&(colon=value.indexOf('::'))>0){notifyEvent=value.substring(colon+2);value=value.substring(0,colon);customEvent=true;}
+parts.push({compoundIndex:parts.length,value:value,mode:mode,negate:negate,event:notifyEvent,customEvent:customEvent});lastIndex=re.lastIndex;}
+if(lastIndex&&lastIndex<text.length){var literal=text.substring(lastIndex);if(literal){parts.push({literal:literal});}}
+if(parts.length){return parts;}},_literalFromParts:function(parts){var s='';for(var i=0;i<parts.length;i++){var literal=parts[i].literal;s+=literal||'';}
+return s;},_parseTextNodeAnnotation:function(node,list){var parts=this._parseBindings(node.textContent);if(parts){node.textContent=this._literalFromParts(parts)||' ';var annote={bindings:[{kind:'text',name:'textContent',parts:parts,isCompound:parts.length!==1}]};list.push(annote);return annote;}},_parseElementAnnotations:function(element,list,stripWhiteSpace){var annote={bindings:[],events:[]};if(element.localName==='content'){list._hasContent=true;}
+this._parseChildNodesAnnotations(element,annote,list,stripWhiteSpace);if(element.attributes){this._parseNodeAttributeAnnotations(element,annote,list);if(this.prepElement){this.prepElement(element);}}
+if(annote.bindings.length||annote.events.length||annote.id){list.push(annote);}
+return annote;},_parseChildNodesAnnotations:function(root,annote,list,stripWhiteSpace){if(root.firstChild){var node=root.firstChild;var i=0;while(node){var next=node.nextSibling;if(node.localName==='template'&&!node.hasAttribute('preserve-content')){this._parseTemplate(node,i,list,annote,stripWhiteSpace);}
+if(node.localName=='slot'){node=this._replaceSlotWithContent(node);}
+if(node.nodeType===Node.TEXT_NODE){var n=next;while(n&&n.nodeType===Node.TEXT_NODE){node.textContent+=n.textContent;next=n.nextSibling;root.removeChild(n);n=next;}
+if(stripWhiteSpace&&!node.textContent.trim()){root.removeChild(node);i--;}}
+if(node.parentNode){var childAnnotation=this._parseNodeAnnotations(node,list,stripWhiteSpace);if(childAnnotation){childAnnotation.parent=annote;childAnnotation.index=i;}}
+node=next;i++;}}},_replaceSlotWithContent:function(slot){var content=slot.ownerDocument.createElement('content');while(slot.firstChild){content.appendChild(slot.firstChild);}
+var attrs=slot.attributes;for(var i=0;i<attrs.length;i++){var attr=attrs[i];content.setAttribute(attr.name,attr.value);}
+var name=slot.getAttribute('name');if(name){content.setAttribute('select','[slot=\''+name+'\']');}
+slot.parentNode.replaceChild(content,slot);return content;},_parseTemplate:function(node,index,list,parent,stripWhiteSpace){var content=document.createDocumentFragment();content._notes=this.parseAnnotations(node,stripWhiteSpace);content.appendChild(node.content);list.push({bindings:Polymer.nar,events:Polymer.nar,templateContent:content,parent:parent,index:index});},_parseNodeAttributeAnnotations:function(node,annotation){var attrs=Array.prototype.slice.call(node.attributes);for(var i=attrs.length-1,a;a=attrs[i];i--){var n=a.name;var v=a.value;var b;if(n.slice(0,3)==='on-'){node.removeAttribute(n);annotation.events.push({name:n.slice(3),value:v});}else if(b=this._parseNodeAttributeAnnotation(node,n,v)){annotation.bindings.push(b);}else if(n==='id'){annotation.id=v;}}},_parseNodeAttributeAnnotation:function(node,name,value){var parts=this._parseBindings(value);if(parts){var origName=name;var kind='property';if(name[name.length-1]=='$'){name=name.slice(0,-1);kind='attribute';}
+var literal=this._literalFromParts(parts);if(literal&&kind=='attribute'){node.setAttribute(name,literal);}
+if(node.localName==='input'&&origName==='value'){node.setAttribute(origName,'');}
+if(disableUpgradeEnabled&&origName==='disable-upgrade$'){node.setAttribute(name,'');}
+node.removeAttribute(origName);var propertyName=Polymer.CaseMap.dashToCamelCase(name);if(kind==='property'){name=propertyName;}
+return{kind:kind,name:name,propertyName:propertyName,parts:parts,literal:literal,isCompound:parts.length!==1};}},findAnnotatedNode:function(root,annote){var parent=annote.parent&&Polymer.Annotations.findAnnotatedNode(root,annote.parent);if(parent){for(var n=parent.firstChild,i=0;n;n=n.nextSibling){if(annote.index===i++){return n;}}}else{return root;}}};}());(function(){function resolveCss(cssText,ownerDocument){return cssText.replace(CSS_URL_RX,function(m,pre,url,post){return pre+'\''+resolve(url.replace(/["']/g,''),ownerDocument)+'\''+post;});}
+function resolveAttrs(element,ownerDocument){for(var name in URL_ATTRS){var a$=URL_ATTRS[name];for(var i=0,l=a$.length,a,at,v;i<l&&(a=a$[i]);i++){if(name==='*'||element.localName===name){at=element.attributes[a];v=at&&at.value;if(v&&v.search(BINDING_RX)<0){at.value=a==='style'?resolveCss(v,ownerDocument):resolve(v,ownerDocument);}}}}}
+function resolve(url,ownerDocument){if(url&&ABS_URL.test(url)){return url;}
+var resolver=getUrlResolver(ownerDocument);resolver.href=url;return resolver.href||url;}
+var tempDoc;var tempDocBase;function resolveUrl(url,baseUri){if(!tempDoc){tempDoc=document.implementation.createHTMLDocument('temp');tempDocBase=tempDoc.createElement('base');tempDoc.head.appendChild(tempDocBase);}
+tempDocBase.href=baseUri;return resolve(url,tempDoc);}
+function getUrlResolver(ownerDocument){return ownerDocument.body.__urlResolver||(ownerDocument.body.__urlResolver=ownerDocument.createElement('a'));}
+var CSS_URL_RX=/(url\()([^)]*)(\))/g;var URL_ATTRS={'*':['href','src','style','url'],form:['action']};var ABS_URL=/(^\/)|(^#)|(^[\w-\d]*:)/;var BINDING_RX=/\{\{|\[\[/;Polymer.ResolveUrl={resolveCss:resolveCss,resolveAttrs:resolveAttrs,resolveUrl:resolveUrl};}());Polymer.Path={root:function(path){var dotIndex=path.indexOf('.');if(dotIndex===-1){return path;}
+return path.slice(0,dotIndex);},isDeep:function(path){return path.indexOf('.')!==-1;},isAncestor:function(base,path){return base.indexOf(path+'.')===0;},isDescendant:function(base,path){return path.indexOf(base+'.')===0;},translate:function(base,newBase,path){return newBase+path.slice(base.length);},matches:function(base,wildcard,path){return base===path||this.isAncestor(base,path)||Boolean(wildcard)&&this.isDescendant(base,path);}};Polymer.Base._addFeature({_prepAnnotations:function(){if(!this._template){this._notes=[];}else{var self=this;Polymer.Annotations.prepElement=function(element){self._prepElement(element);};if(this._template._content&&this._template._content._notes){this._notes=this._template._content._notes;}else{this._notes=Polymer.Annotations.parseAnnotations(this._template);this._processAnnotations(this._notes);}
+Polymer.Annotations.prepElement=null;}},_processAnnotations:function(notes){for(var i=0;i<notes.length;i++){var note=notes[i];for(var j=0;j<note.bindings.length;j++){var b=note.bindings[j];for(var k=0;k<b.parts.length;k++){var p=b.parts[k];if(!p.literal){var signature=this._parseMethod(p.value);if(signature){p.signature=signature;}else{p.model=Polymer.Path.root(p.value);}}}}
+if(note.templateContent){this._processAnnotations(note.templateContent._notes);var pp=note.templateContent._parentProps=this._discoverTemplateParentProps(note.templateContent._notes);var bindings=[];for(var prop in pp){var name='_parent_'+prop;bindings.push({index:note.index,kind:'property',name:name,propertyName:name,parts:[{mode:'{',model:prop,value:prop}]});}
+note.bindings=note.bindings.concat(bindings);}}},_discoverTemplateParentProps:function(notes){var pp={};for(var i=0,n;i<notes.length&&(n=notes[i]);i++){for(var j=0,b$=n.bindings,b;j<b$.length&&(b=b$[j]);j++){for(var k=0,p$=b.parts,p;k<p$.length&&(p=p$[k]);k++){if(p.signature){var args=p.signature.args;for(var kk=0;kk<args.length;kk++){var model=args[kk].model;if(model){pp[model]=true;}}
+if(p.signature.dynamicFn){pp[p.signature.method]=true;}}else{if(p.model){pp[p.model]=true;}}}}
+if(n.templateContent){var tpp=n.templateContent._parentProps;Polymer.Base.mixin(pp,tpp);}}
+return pp;},_prepElement:function(element){Polymer.ResolveUrl.resolveAttrs(element,this._template.ownerDocument);},_findAnnotatedNode:Polymer.Annotations.findAnnotatedNode,_marshalAnnotationReferences:function(){if(this._template){this._marshalIdNodes();this._marshalAnnotatedNodes();this._marshalAnnotatedListeners();}},_configureAnnotationReferences:function(){var notes=this._notes;var nodes=this._nodes;for(var i=0;i<notes.length;i++){var note=notes[i];var node=nodes[i];this._configureTemplateContent(note,node);this._configureCompoundBindings(note,node);}},_configureTemplateContent:function(note,node){if(note.templateContent){node._content=note.templateContent;}},_configureCompoundBindings:function(note,node){var bindings=note.bindings;for(var i=0;i<bindings.length;i++){var binding=bindings[i];if(binding.isCompound){var storage=node.__compoundStorage__||(node.__compoundStorage__={});var parts=binding.parts;var literals=new Array(parts.length);for(var j=0;j<parts.length;j++){literals[j]=parts[j].literal;}
+var name=binding.name;storage[name]=literals;if(binding.literal&&binding.kind=='property'){if(node._configValue){node._configValue(name,binding.literal);}else{node[name]=binding.literal;}}}}},_marshalIdNodes:function(){this.$={};for(var i=0,l=this._notes.length,a;i<l&&(a=this._notes[i]);i++){if(a.id){this.$[a.id]=this._findAnnotatedNode(this.root,a);}}},_marshalAnnotatedNodes:function(){if(this._notes&&this._notes.length){var r=new Array(this._notes.length);for(var i=0;i<this._notes.length;i++){r[i]=this._findAnnotatedNode(this.root,this._notes[i]);}
+this._nodes=r;}},_marshalAnnotatedListeners:function(){for(var i=0,l=this._notes.length,a;i<l&&(a=this._notes[i]);i++){if(a.events&&a.events.length){var node=this._findAnnotatedNode(this.root,a);for(var j=0,e$=a.events,e;j<e$.length&&(e=e$[j]);j++){this.listen(node,e.name,e.value);}}}}});Polymer.Base._addFeature({listeners:{},_listenListeners:function(listeners){var node,name,eventName;for(eventName in listeners){if(eventName.indexOf('.')<0){node=this;name=eventName;}else{name=eventName.split('.');node=this.$[name[0]];name=name[1];}
+this.listen(node,name,listeners[eventName]);}},listen:function(node,eventName,methodName){var handler=this._recallEventHandler(this,eventName,node,methodName);if(!handler){handler=this._createEventHandler(node,eventName,methodName);}
+if(handler._listening){return;}
+this._listen(node,eventName,handler);handler._listening=true;},_boundListenerKey:function(eventName,methodName){return eventName+':'+methodName;},_recordEventHandler:function(host,eventName,target,methodName,handler){var hbl=host.__boundListeners;if(!hbl){hbl=host.__boundListeners=new WeakMap();}
+var bl=hbl.get(target);if(!bl){bl={};if(!Polymer.Settings.isIE||target!=window){hbl.set(target,bl);}}
+var key=this._boundListenerKey(eventName,methodName);bl[key]=handler;},_recallEventHandler:function(host,eventName,target,methodName){var hbl=host.__boundListeners;if(!hbl){return;}
+var bl=hbl.get(target);if(!bl){return;}
+var key=this._boundListenerKey(eventName,methodName);return bl[key];},_createEventHandler:function(node,eventName,methodName){var host=this;var handler=function(e){if(host[methodName]){host[methodName](e,e.detail);}else{host._warn(host._logf('_createEventHandler','listener method `'+methodName+'` not defined'));}};handler._listening=false;this._recordEventHandler(host,eventName,node,methodName,handler);return handler;},unlisten:function(node,eventName,methodName){var handler=this._recallEventHandler(this,eventName,node,methodName);if(handler){this._unlisten(node,eventName,handler);handler._listening=false;}},_listen:function(node,eventName,handler){node.addEventListener(eventName,handler);},_unlisten:function(node,eventName,handler){node.removeEventListener(eventName,handler);}});(function(){'use strict';var wrap=Polymer.DomApi.wrap;var HAS_NATIVE_TA=typeof document.head.style.touchAction==='string';var GESTURE_KEY='__polymerGestures';var HANDLED_OBJ='__polymerGesturesHandled';var TOUCH_ACTION='__polymerGesturesTouchAction';var TAP_DISTANCE=25;var TRACK_DISTANCE=5;var TRACK_LENGTH=2;var MOUSE_TIMEOUT=2500;var MOUSE_EVENTS=['mousedown','mousemove','mouseup','click'];var MOUSE_WHICH_TO_BUTTONS=[0,1,4,2];var MOUSE_HAS_BUTTONS=function(){try{return new MouseEvent('test',{buttons:1}).buttons===1;}catch(e){return false;}}();var SUPPORTS_PASSIVE=false;(function(){try{var opts=Object.defineProperty({},'passive',{get:function(){SUPPORTS_PASSIVE=true;}});window.addEventListener('test',null,opts);window.removeEventListener('test',null,opts);}catch(e){}}());var IS_TOUCH_ONLY=navigator.userAgent.match(/iP(?:[oa]d|hone)|Android/);var mouseCanceller=function(mouseEvent){var sc=mouseEvent.sourceCapabilities;if(sc&&!sc.firesTouchEvents){return;}
+mouseEvent[HANDLED_OBJ]={skip:true};if(mouseEvent.type==='click'){var path=Polymer.dom(mouseEvent).path;for(var i=0;i<path.length;i++){if(path[i]===POINTERSTATE.mouse.target){return;}}
+mouseEvent.preventDefault();mouseEvent.stopPropagation();}};function setupTeardownMouseCanceller(setup){var events=IS_TOUCH_ONLY?['click']:MOUSE_EVENTS;for(var i=0,en;i<events.length;i++){en=events[i];if(setup){document.addEventListener(en,mouseCanceller,true);}else{document.removeEventListener(en,mouseCanceller,true);}}}
+function ignoreMouse(ev){if(!POINTERSTATE.mouse.mouseIgnoreJob){setupTeardownMouseCanceller(true);}
+var unset=function(){setupTeardownMouseCanceller();POINTERSTATE.mouse.target=null;POINTERSTATE.mouse.mouseIgnoreJob=null;};POINTERSTATE.mouse.target=Polymer.dom(ev).rootTarget;POINTERSTATE.mouse.mouseIgnoreJob=Polymer.Debounce(POINTERSTATE.mouse.mouseIgnoreJob,unset,MOUSE_TIMEOUT);}
+function hasLeftMouseButton(ev){var type=ev.type;if(MOUSE_EVENTS.indexOf(type)===-1){return false;}
+if(type==='mousemove'){var buttons=ev.buttons===undefined?1:ev.buttons;if(ev instanceof window.MouseEvent&&!MOUSE_HAS_BUTTONS){buttons=MOUSE_WHICH_TO_BUTTONS[ev.which]||0;}
+return Boolean(buttons&1);}else{var button=ev.button===undefined?0:ev.button;return button===0;}}
+function isSyntheticClick(ev){if(ev.type==='click'){if(ev.detail===0){return true;}
+var t=Gestures.findOriginalTarget(ev);var bcr=t.getBoundingClientRect();var x=ev.pageX,y=ev.pageY;return!(x>=bcr.left&&x<=bcr.right&&(y>=bcr.top&&y<=bcr.bottom));}
+return false;}
+var POINTERSTATE={mouse:{target:null,mouseIgnoreJob:null},touch:{x:0,y:0,id:-1,scrollDecided:false}};function firstTouchAction(ev){var path=Polymer.dom(ev).path;var ta='auto';for(var i=0,n;i<path.length;i++){n=path[i];if(n[TOUCH_ACTION]){ta=n[TOUCH_ACTION];break;}}
+return ta;}
+function trackDocument(stateObj,movefn,upfn){stateObj.movefn=movefn;stateObj.upfn=upfn;document.addEventListener('mousemove',movefn);document.addEventListener('mouseup',upfn);}
+function untrackDocument(stateObj){document.removeEventListener('mousemove',stateObj.movefn);document.removeEventListener('mouseup',stateObj.upfn);stateObj.movefn=null;stateObj.upfn=null;}
+document.addEventListener('touchend',ignoreMouse,SUPPORTS_PASSIVE?{passive:true}:false);var Gestures={gestures:{},recognizers:[],deepTargetFind:function(x,y){var node=document.elementFromPoint(x,y);var next=node;while(next&&next.shadowRoot){next=next.shadowRoot.elementFromPoint(x,y);if(next){node=next;}}
+return node;},findOriginalTarget:function(ev){if(ev.path){return ev.path[0];}
+return ev.target;},handleNative:function(ev){var handled;var type=ev.type;var node=wrap(ev.currentTarget);var gobj=node[GESTURE_KEY];if(!gobj){return;}
+var gs=gobj[type];if(!gs){return;}
+if(!ev[HANDLED_OBJ]){ev[HANDLED_OBJ]={};if(type.slice(0,5)==='touch'){var t=ev.changedTouches[0];if(type==='touchstart'){if(ev.touches.length===1){POINTERSTATE.touch.id=t.identifier;}}
+if(POINTERSTATE.touch.id!==t.identifier){return;}
+if(!HAS_NATIVE_TA){if(type==='touchstart'||type==='touchmove'){Gestures.handleTouchAction(ev);}}}}
+handled=ev[HANDLED_OBJ];if(handled.skip){return;}
+var recognizers=Gestures.recognizers;for(var i=0,r;i<recognizers.length;i++){r=recognizers[i];if(gs[r.name]&&!handled[r.name]){if(r.flow&&r.flow.start.indexOf(ev.type)>-1&&r.reset){r.reset();}}}
+for(i=0,r;i<recognizers.length;i++){r=recognizers[i];if(gs[r.name]&&!handled[r.name]){handled[r.name]=true;r[type](ev);}}},handleTouchAction:function(ev){var t=ev.changedTouches[0];var type=ev.type;if(type==='touchstart'){POINTERSTATE.touch.x=t.clientX;POINTERSTATE.touch.y=t.clientY;POINTERSTATE.touch.scrollDecided=false;}else if(type==='touchmove'){if(POINTERSTATE.touch.scrollDecided){return;}
+POINTERSTATE.touch.scrollDecided=true;var ta=firstTouchAction(ev);var prevent=false;var dx=Math.abs(POINTERSTATE.touch.x-t.clientX);var dy=Math.abs(POINTERSTATE.touch.y-t.clientY);if(!ev.cancelable){}else if(ta==='none'){prevent=true;}else if(ta==='pan-x'){prevent=dy>dx;}else if(ta==='pan-y'){prevent=dx>dy;}
+if(prevent){ev.preventDefault();}else{Gestures.prevent('track');}}},add:function(node,evType,handler){node=wrap(node);var recognizer=this.gestures[evType];var deps=recognizer.deps;var name=recognizer.name;var gobj=node[GESTURE_KEY];if(!gobj){node[GESTURE_KEY]=gobj={};}
+for(var i=0,dep,gd;i<deps.length;i++){dep=deps[i];if(IS_TOUCH_ONLY&&MOUSE_EVENTS.indexOf(dep)>-1&&dep!=='click'){continue;}
+gd=gobj[dep];if(!gd){gobj[dep]=gd={_count:0};}
+if(gd._count===0){node.addEventListener(dep,this.handleNative);}
+gd[name]=(gd[name]||0)+1;gd._count=(gd._count||0)+1;}
+node.addEventListener(evType,handler);if(recognizer.touchAction){this.setTouchAction(node,recognizer.touchAction);}},remove:function(node,evType,handler){node=wrap(node);var recognizer=this.gestures[evType];var deps=recognizer.deps;var name=recognizer.name;var gobj=node[GESTURE_KEY];if(gobj){for(var i=0,dep,gd;i<deps.length;i++){dep=deps[i];gd=gobj[dep];if(gd&&gd[name]){gd[name]=(gd[name]||1)-1;gd._count=(gd._count||1)-1;if(gd._count===0){node.removeEventListener(dep,this.handleNative);}}}}
+node.removeEventListener(evType,handler);},register:function(recog){this.recognizers.push(recog);for(var i=0;i<recog.emits.length;i++){this.gestures[recog.emits[i]]=recog;}},findRecognizerByEvent:function(evName){for(var i=0,r;i<this.recognizers.length;i++){r=this.recognizers[i];for(var j=0,n;j<r.emits.length;j++){n=r.emits[j];if(n===evName){return r;}}}
+return null;},setTouchAction:function(node,value){if(HAS_NATIVE_TA){node.style.touchAction=value;}
+node[TOUCH_ACTION]=value;},fire:function(target,type,detail){var ev=Polymer.Base.fire(type,detail,{node:target,bubbles:true,cancelable:true});if(ev.defaultPrevented){var preventer=detail.preventer||detail.sourceEvent;if(preventer&&preventer.preventDefault){preventer.preventDefault();}}},prevent:function(evName){var recognizer=this.findRecognizerByEvent(evName);if(recognizer.info){recognizer.info.prevent=true;}},resetMouseCanceller:function(){if(POINTERSTATE.mouse.mouseIgnoreJob){POINTERSTATE.mouse.mouseIgnoreJob.complete();}}};Gestures.register({name:'downup',deps:['mousedown','touchstart','touchend'],flow:{start:['mousedown','touchstart'],end:['mouseup','touchend']},emits:['down','up'],info:{movefn:null,upfn:null},reset:function(){untrackDocument(this.info);},mousedown:function(e){if(!hasLeftMouseButton(e)){return;}
+var t=Gestures.findOriginalTarget(e);var self=this;var movefn=function movefn(e){if(!hasLeftMouseButton(e)){self.fire('up',t,e);untrackDocument(self.info);}};var upfn=function upfn(e){if(hasLeftMouseButton(e)){self.fire('up',t,e);}
+untrackDocument(self.info);};trackDocument(this.info,movefn,upfn);this.fire('down',t,e);},touchstart:function(e){this.fire('down',Gestures.findOriginalTarget(e),e.changedTouches[0],e);},touchend:function(e){this.fire('up',Gestures.findOriginalTarget(e),e.changedTouches[0],e);},fire:function(type,target,event,preventer){Gestures.fire(target,type,{x:event.clientX,y:event.clientY,sourceEvent:event,preventer:preventer,prevent:function(e){return Gestures.prevent(e);}});}});Gestures.register({name:'track',touchAction:'none',deps:['mousedown','touchstart','touchmove','touchend'],flow:{start:['mousedown','touchstart'],end:['mouseup','touchend']},emits:['track'],info:{x:0,y:0,state:'start',started:false,moves:[],addMove:function(move){if(this.moves.length>TRACK_LENGTH){this.moves.shift();}
+this.moves.push(move);},movefn:null,upfn:null,prevent:false},reset:function(){this.info.state='start';this.info.started=false;this.info.moves=[];this.info.x=0;this.info.y=0;this.info.prevent=false;untrackDocument(this.info);},hasMovedEnough:function(x,y){if(this.info.prevent){return false;}
+if(this.info.started){return true;}
+var dx=Math.abs(this.info.x-x);var dy=Math.abs(this.info.y-y);return dx>=TRACK_DISTANCE||dy>=TRACK_DISTANCE;},mousedown:function(e){if(!hasLeftMouseButton(e)){return;}
+var t=Gestures.findOriginalTarget(e);var self=this;var movefn=function movefn(e){var x=e.clientX,y=e.clientY;if(self.hasMovedEnough(x,y)){self.info.state=self.info.started?e.type==='mouseup'?'end':'track':'start';if(self.info.state==='start'){Gestures.prevent('tap');}
+self.info.addMove({x:x,y:y});if(!hasLeftMouseButton(e)){self.info.state='end';untrackDocument(self.info);}
+self.fire(t,e);self.info.started=true;}};var upfn=function upfn(e){if(self.info.started){movefn(e);}
+untrackDocument(self.info);};trackDocument(this.info,movefn,upfn);this.info.x=e.clientX;this.info.y=e.clientY;},touchstart:function(e){var ct=e.changedTouches[0];this.info.x=ct.clientX;this.info.y=ct.clientY;},touchmove:function(e){var t=Gestures.findOriginalTarget(e);var ct=e.changedTouches[0];var x=ct.clientX,y=ct.clientY;if(this.hasMovedEnough(x,y)){if(this.info.state==='start'){Gestures.prevent('tap');}
+this.info.addMove({x:x,y:y});this.fire(t,ct);this.info.state='track';this.info.started=true;}},touchend:function(e){var t=Gestures.findOriginalTarget(e);var ct=e.changedTouches[0];if(this.info.started){this.info.state='end';this.info.addMove({x:ct.clientX,y:ct.clientY});this.fire(t,ct,e);}},fire:function(target,touch,preventer){var secondlast=this.info.moves[this.info.moves.length-2];var lastmove=this.info.moves[this.info.moves.length-1];var dx=lastmove.x-this.info.x;var dy=lastmove.y-this.info.y;var ddx,ddy=0;if(secondlast){ddx=lastmove.x-secondlast.x;ddy=lastmove.y-secondlast.y;}
+return Gestures.fire(target,'track',{state:this.info.state,x:touch.clientX,y:touch.clientY,dx:dx,dy:dy,ddx:ddx,ddy:ddy,sourceEvent:touch,preventer:preventer,hover:function(){return Gestures.deepTargetFind(touch.clientX,touch.clientY);}});}});Gestures.register({name:'tap',deps:['mousedown','click','touchstart','touchend'],flow:{start:['mousedown','touchstart'],end:['click','touchend']},emits:['tap'],info:{x:NaN,y:NaN,prevent:false},reset:function(){this.info.x=NaN;this.info.y=NaN;this.info.prevent=false;},save:function(e){this.info.x=e.clientX;this.info.y=e.clientY;},mousedown:function(e){if(hasLeftMouseButton(e)){this.save(e);}},click:function(e){if(hasLeftMouseButton(e)){this.forward(e);}},touchstart:function(e){this.save(e.changedTouches[0],e);},touchend:function(e){this.forward(e.changedTouches[0],e);},forward:function(e,preventer){var dx=Math.abs(e.clientX-this.info.x);var dy=Math.abs(e.clientY-this.info.y);var t=Gestures.findOriginalTarget(e);if(isNaN(dx)||isNaN(dy)||dx<=TAP_DISTANCE&&dy<=TAP_DISTANCE||isSyntheticClick(e)){if(!this.info.prevent){Gestures.fire(t,'tap',{x:e.clientX,y:e.clientY,sourceEvent:e,preventer:preventer});}}}});var DIRECTION_MAP={x:'pan-x',y:'pan-y',none:'none',all:'auto'};Polymer.Base._addFeature({_setupGestures:function(){this.__polymerGestures=null;},_listen:function(node,eventName,handler){if(Gestures.gestures[eventName]){Gestures.add(node,eventName,handler);}else{node.addEventListener(eventName,handler);}},_unlisten:function(node,eventName,handler){if(Gestures.gestures[eventName]){Gestures.remove(node,eventName,handler);}else{node.removeEventListener(eventName,handler);}},setScrollDirection:function(direction,node){node=node||this;Gestures.setTouchAction(node,DIRECTION_MAP[direction]||'auto');}});Polymer.Gestures=Gestures;}());(function(){'use strict';Polymer.Base._addFeature({$$:function(slctr){return Polymer.dom(this.root).querySelector(slctr);},toggleClass:function(name,bool,node){node=node||this;if(arguments.length==1){bool=!node.classList.contains(name);}
+if(bool){Polymer.dom(node).classList.add(name);}else{Polymer.dom(node).classList.remove(name);}},toggleAttribute:function(name,bool,node){node=node||this;if(arguments.length==1){bool=!node.hasAttribute(name);}
+if(bool){Polymer.dom(node).setAttribute(name,'');}else{Polymer.dom(node).removeAttribute(name);}},classFollows:function(name,toElement,fromElement){if(fromElement){Polymer.dom(fromElement).classList.remove(name);}
+if(toElement){Polymer.dom(toElement).classList.add(name);}},attributeFollows:function(name,toElement,fromElement){if(fromElement){Polymer.dom(fromElement).removeAttribute(name);}
+if(toElement){Polymer.dom(toElement).setAttribute(name,'');}},getEffectiveChildNodes:function(){return Polymer.dom(this).getEffectiveChildNodes();},getEffectiveChildren:function(){var list=Polymer.dom(this).getEffectiveChildNodes();return list.filter(function(n){return n.nodeType===Node.ELEMENT_NODE;});},getEffectiveTextContent:function(){var cn=this.getEffectiveChildNodes();var tc=[];for(var i=0,c;c=cn[i];i++){if(c.nodeType!==Node.COMMENT_NODE){tc.push(Polymer.dom(c).textContent);}}
+return tc.join('');},queryEffectiveChildren:function(slctr){var e$=Polymer.dom(this).queryDistributedElements(slctr);return e$&&e$[0];},queryAllEffectiveChildren:function(slctr){return Polymer.dom(this).queryDistributedElements(slctr);},getContentChildNodes:function(slctr){var content=Polymer.dom(this.root).querySelector(slctr||'content');return content?Polymer.dom(content).getDistributedNodes():[];},getContentChildren:function(slctr){return this.getContentChildNodes(slctr).filter(function(n){return n.nodeType===Node.ELEMENT_NODE;});},fire:function(type,detail,options){options=options||Polymer.nob;var node=options.node||this;detail=detail===null||detail===undefined?{}:detail;var bubbles=options.bubbles===undefined?true:options.bubbles;var cancelable=Boolean(options.cancelable);var useCache=options._useCache;var event=this._getEvent(type,bubbles,cancelable,useCache);event.detail=detail;if(useCache){this.__eventCache[type]=null;}
+node.dispatchEvent(event);if(useCache){this.__eventCache[type]=event;}
+return event;},__eventCache:{},_getEvent:function(type,bubbles,cancelable,useCache){var event=useCache&&this.__eventCache[type];if(!event||(event.bubbles!=bubbles||event.cancelable!=cancelable)){event=new Event(type,{bubbles:Boolean(bubbles),cancelable:cancelable});}
+return event;},async:function(callback,waitTime){var self=this;return Polymer.Async.run(function(){callback.call(self);},waitTime);},cancelAsync:function(handle){Polymer.Async.cancel(handle);},arrayDelete:function(path,item){var index;if(Array.isArray(path)){index=path.indexOf(item);if(index>=0){return path.splice(index,1);}}else{var arr=this._get(path);index=arr.indexOf(item);if(index>=0){return this.splice(path,index,1);}}},transform:function(transform,node){node=node||this;node.style.webkitTransform=transform;node.style.transform=transform;},translate3d:function(x,y,z,node){node=node||this;this.transform('translate3d('+x+','+y+','+z+')',node);},importHref:function(href,onload,onerror,optAsync){var link=document.createElement('link');link.rel='import';link.href=href;var list=Polymer.Base.importHref.imported=Polymer.Base.importHref.imported||{};var cached=list[link.href];var imprt=cached||link;var self=this;var loadListener=function(e){e.target.__firedLoad=true;e.target.removeEventListener('load',loadListener);e.target.removeEventListener('error',errorListener);return onload.call(self,e);};var errorListener=function(e){e.target.__firedError=true;e.target.removeEventListener('load',loadListener);e.target.removeEventListener('error',errorListener);return onerror.call(self,e);};if(onload){imprt.addEventListener('load',loadListener);}
+if(onerror){imprt.addEventListener('error',errorListener);}
+if(cached){if(cached.__firedLoad){cached.dispatchEvent(new Event('load'));}
+if(cached.__firedError){cached.dispatchEvent(new Event('error'));}}else{list[link.href]=link;optAsync=Boolean(optAsync);if(optAsync){link.setAttribute('async','');}
+document.head.appendChild(link);}
+return imprt;},create:function(tag,props){var elt=document.createElement(tag);if(props){for(var n in props){elt[n]=props[n];}}
+return elt;},isLightDescendant:function(node){return this!==node&&this.contains(node)&&Polymer.dom(this).getOwnerRoot()===Polymer.dom(node).getOwnerRoot();},isLocalDescendant:function(node){return this.root===Polymer.dom(node).getOwnerRoot();}});if(!Polymer.Settings.useNativeCustomElements){var importHref=Polymer.Base.importHref;Polymer.Base.importHref=function(href,onload,onerror,optAsync){CustomElements.ready=false;var loadFn=function(e){CustomElements.upgradeDocumentTree(document);CustomElements.ready=true;if(onload){return onload.call(this,e);}};return importHref.call(this,href,loadFn,onerror,optAsync);};}}());Polymer.Bind={prepareModel:function(model){Polymer.Base.mixin(model,this._modelApi);},_modelApi:{_notifyChange:function(source,event,value){value=value===undefined?this[source]:value;event=event||Polymer.CaseMap.camelToDashCase(source)+'-changed';this.fire(event,{value:value},{bubbles:false,cancelable:false,_useCache:Polymer.Settings.eventDataCache||!Polymer.Settings.isIE});},_propertySetter:function(property,value,effects,fromAbove){var old=this.__data__[property];if(old!==value&&(old===old||value===value)){this.__data__[property]=value;if(typeof value=='object'){this._clearPath(property);}
+if(this._propertyChanged){this._propertyChanged(property,value,old);}
+if(effects){this._effectEffects(property,value,effects,old,fromAbove);}}
+return old;},__setProperty:function(property,value,quiet,node){node=node||this;var effects=node._propertyEffects&&node._propertyEffects[property];if(effects){node._propertySetter(property,value,effects,quiet);}else if(node[property]!==value){node[property]=value;}},_effectEffects:function(property,value,effects,old,fromAbove){for(var i=0,l=effects.length,fx;i<l&&(fx=effects[i]);i++){fx.fn.call(this,property,this[property],fx.effect,old,fromAbove);}},_clearPath:function(path){for(var prop in this.__data__){if(Polymer.Path.isDescendant(path,prop)){this.__data__[prop]=undefined;}}}},ensurePropertyEffects:function(model,property){if(!model._propertyEffects){model._propertyEffects={};}
+var fx=model._propertyEffects[property];if(!fx){fx=model._propertyEffects[property]=[];}
+return fx;},addPropertyEffect:function(model,property,kind,effect){var fx=this.ensurePropertyEffects(model,property);var propEffect={kind:kind,effect:effect,fn:Polymer.Bind['_'+kind+'Effect']};fx.push(propEffect);return propEffect;},createBindings:function(model){var fx$=model._propertyEffects;if(fx$){for(var n in fx$){var fx=fx$[n];fx.sort(this._sortPropertyEffects);this._createAccessors(model,n,fx);}}},_sortPropertyEffects:function(){var EFFECT_ORDER={'compute':0,'annotation':1,'annotatedComputation':2,'reflect':3,'notify':4,'observer':5,'complexObserver':6,'function':7};return function(a,b){return EFFECT_ORDER[a.kind]-EFFECT_ORDER[b.kind];};}(),_createAccessors:function(model,property,effects){var defun={get:function(){return this.__data__[property];}};var setter=function(value){this._propertySetter(property,value,effects);};var info=model.getPropertyInfo&&model.getPropertyInfo(property);if(info&&info.readOnly){if(!info.computed){model['_set'+this.upper(property)]=setter;}}else{defun.set=setter;}
+Object.defineProperty(model,property,defun);},upper:function(name){return name[0].toUpperCase()+name.substring(1);},_addAnnotatedListener:function(model,index,property,path,event,negated){if(!model._bindListeners){model._bindListeners=[];}
+var fn=this._notedListenerFactory(property,path,Polymer.Path.isDeep(path),negated);var eventName=event||Polymer.CaseMap.camelToDashCase(property)+'-changed';model._bindListeners.push({index:index,property:property,path:path,changedFn:fn,event:eventName});},_isEventBogus:function(e,target){return e.path&&e.path[0]!==target;},_notedListenerFactory:function(property,path,isStructured,negated){return function(target,value,targetPath){if(targetPath){var newPath=Polymer.Path.translate(property,path,targetPath);this._notifyPath(newPath,value);}else{value=target[property];if(negated){value=!value;}
+if(!isStructured){this[path]=value;}else{if(this.__data__[path]!=value){this.set(path,value);}}}};},prepareInstance:function(inst){inst.__data__=Object.create(null);},setupBindListeners:function(inst){var b$=inst._bindListeners;for(var i=0,l=b$.length,info;i<l&&(info=b$[i]);i++){var node=inst._nodes[info.index];this._addNotifyListener(node,inst,info.event,info.changedFn);}},_addNotifyListener:function(element,context,event,changedFn){element.addEventListener(event,function(e){return context._notifyListener(changedFn,e);});}};Polymer.Base.mixin(Polymer.Bind,{_shouldAddListener:function(effect){return effect.name&&effect.kind!='attribute'&&effect.kind!='text'&&!effect.isCompound&&effect.parts[0].mode==='{';},_annotationEffect:function(source,value,effect){if(source!=effect.value){value=this._get(effect.value);this.__data__[effect.value]=value;}
+this._applyEffectValue(effect,value);},_reflectEffect:function(source,value,effect){this.reflectPropertyToAttribute(source,effect.attribute,value);},_notifyEffect:function(source,value,effect,old,fromAbove){if(!fromAbove){this._notifyChange(source,effect.event,value);}},_functionEffect:function(source,value,fn,old,fromAbove){fn.call(this,source,value,old,fromAbove);},_observerEffect:function(source,value,effect,old){var fn=this[effect.method];if(fn){fn.call(this,value,old);}else{this._warn(this._logf('_observerEffect','observer method `'+effect.method+'` not defined'));}},_complexObserverEffect:function(source,value,effect){var fn=this[effect.method];if(fn){var args=Polymer.Bind._marshalArgs(this.__data__,effect,source,value);if(args){fn.apply(this,args);}}else if(effect.dynamicFn){}else{this._warn(this._logf('_complexObserverEffect','observer method `'+effect.method+'` not defined'));}},_computeEffect:function(source,value,effect){var fn=this[effect.method];if(fn){var args=Polymer.Bind._marshalArgs(this.__data__,effect,source,value);if(args){var computedvalue=fn.apply(this,args);this.__setProperty(effect.name,computedvalue);}}else if(effect.dynamicFn){}else{this._warn(this._logf('_computeEffect','compute method `'+effect.method+'` not defined'));}},_annotatedComputationEffect:function(source,value,effect){var computedHost=this._rootDataHost||this;var fn=computedHost[effect.method];if(fn){var args=Polymer.Bind._marshalArgs(this.__data__,effect,source,value);if(args){var computedvalue=fn.apply(computedHost,args);this._applyEffectValue(effect,computedvalue);}}else if(effect.dynamicFn){}else{computedHost._warn(computedHost._logf('_annotatedComputationEffect','compute method `'+effect.method+'` not defined'));}},_marshalArgs:function(model,effect,path,value){var values=[];var args=effect.args;var bailoutEarly=args.length>1||effect.dynamicFn;for(var i=0,l=args.length;i<l;i++){var arg=args[i];var name=arg.name;var v;if(arg.literal){v=arg.value;}else if(path===name){v=value;}else{v=model[name];if(v===undefined&&arg.structured){v=Polymer.Base._get(name,model);}}
+if(bailoutEarly&&v===undefined){return;}
+if(arg.wildcard){var matches=Polymer.Path.isAncestor(path,name);values[i]={path:matches?path:name,value:matches?value:v,base:v};}else{values[i]=v;}}
+return values;}});Polymer.Base._addFeature({_addPropertyEffect:function(property,kind,effect){var prop=Polymer.Bind.addPropertyEffect(this,property,kind,effect);prop.pathFn=this['_'+prop.kind+'PathEffect'];},_prepEffects:function(){Polymer.Bind.prepareModel(this);this._addAnnotationEffects(this._notes);},_prepBindings:function(){Polymer.Bind.createBindings(this);},_addPropertyEffects:function(properties){if(properties){for(var p in properties){var prop=properties[p];if(prop.observer){this._addObserverEffect(p,prop.observer);}
+if(prop.computed){prop.readOnly=true;this._addComputedEffect(p,prop.computed);}
+if(prop.notify){this._addPropertyEffect(p,'notify',{event:Polymer.CaseMap.camelToDashCase(p)+'-changed'});}
+if(prop.reflectToAttribute){var attr=Polymer.CaseMap.camelToDashCase(p);if(attr[0]==='-'){this._warn(this._logf('_addPropertyEffects','Property '+p+' cannot be reflected to attribute '+attr+' because "-" is not a valid starting attribute name. Use a lowercase first letter for the property instead.'));}else{this._addPropertyEffect(p,'reflect',{attribute:attr});}}
+if(prop.readOnly){Polymer.Bind.ensurePropertyEffects(this,p);}}}},_addComputedEffect:function(name,expression){var sig=this._parseMethod(expression);var dynamicFn=sig.dynamicFn;for(var i=0,arg;i<sig.args.length&&(arg=sig.args[i]);i++){this._addPropertyEffect(arg.model,'compute',{method:sig.method,args:sig.args,trigger:arg,name:name,dynamicFn:dynamicFn});}
+if(dynamicFn){this._addPropertyEffect(sig.method,'compute',{method:sig.method,args:sig.args,trigger:null,name:name,dynamicFn:dynamicFn});}},_addObserverEffect:function(property,observer){this._addPropertyEffect(property,'observer',{method:observer,property:property});},_addComplexObserverEffects:function(observers){if(observers){for(var i=0,o;i<observers.length&&(o=observers[i]);i++){this._addComplexObserverEffect(o);}}},_addComplexObserverEffect:function(observer){var sig=this._parseMethod(observer);if(!sig){throw new Error('Malformed observer expression \''+observer+'\'');}
+var dynamicFn=sig.dynamicFn;for(var i=0,arg;i<sig.args.length&&(arg=sig.args[i]);i++){this._addPropertyEffect(arg.model,'complexObserver',{method:sig.method,args:sig.args,trigger:arg,dynamicFn:dynamicFn});}
+if(dynamicFn){this._addPropertyEffect(sig.method,'complexObserver',{method:sig.method,args:sig.args,trigger:null,dynamicFn:dynamicFn});}},_addAnnotationEffects:function(notes){for(var i=0,note;i<notes.length&&(note=notes[i]);i++){var b$=note.bindings;for(var j=0,binding;j<b$.length&&(binding=b$[j]);j++){this._addAnnotationEffect(binding,i);}}},_addAnnotationEffect:function(note,index){if(Polymer.Bind._shouldAddListener(note)){Polymer.Bind._addAnnotatedListener(this,index,note.name,note.parts[0].value,note.parts[0].event,note.parts[0].negate);}
+for(var i=0;i<note.parts.length;i++){var part=note.parts[i];if(part.signature){this._addAnnotatedComputationEffect(note,part,index);}else if(!part.literal){if(note.kind==='attribute'&&note.name[0]==='-'){this._warn(this._logf('_addAnnotationEffect','Cannot set attribute '+note.name+' because "-" is not a valid attribute starting character'));}else{this._addPropertyEffect(part.model,'annotation',{kind:note.kind,index:index,name:note.name,propertyName:note.propertyName,value:part.value,isCompound:note.isCompound,compoundIndex:part.compoundIndex,event:part.event,customEvent:part.customEvent,negate:part.negate});}}}},_addAnnotatedComputationEffect:function(note,part,index){var sig=part.signature;if(sig.static){this.__addAnnotatedComputationEffect('__static__',index,note,part,null);}else{for(var i=0,arg;i<sig.args.length&&(arg=sig.args[i]);i++){if(!arg.literal){this.__addAnnotatedComputationEffect(arg.model,index,note,part,arg);}}
+if(sig.dynamicFn){this.__addAnnotatedComputationEffect(sig.method,index,note,part,null);}}},__addAnnotatedComputationEffect:function(property,index,note,part,trigger){this._addPropertyEffect(property,'annotatedComputation',{index:index,isCompound:note.isCompound,compoundIndex:part.compoundIndex,kind:note.kind,name:note.name,negate:part.negate,method:part.signature.method,args:part.signature.args,trigger:trigger,dynamicFn:part.signature.dynamicFn});},_parseMethod:function(expression){var m=expression.match(/([^\s]+?)\(([\s\S]*)\)/);if(m){var sig={method:m[1],static:true};if(this.getPropertyInfo(sig.method)!==Polymer.nob){sig.static=false;sig.dynamicFn=true;}
+if(m[2].trim()){var args=m[2].replace(/\\,/g,'&comma;').split(',');return this._parseArgs(args,sig);}else{sig.args=Polymer.nar;return sig;}}},_parseArgs:function(argList,sig){sig.args=argList.map(function(rawArg){var arg=this._parseArg(rawArg);if(!arg.literal){sig.static=false;}
+return arg;},this);return sig;},_parseArg:function(rawArg){var arg=rawArg.trim().replace(/&comma;/g,',').replace(/\\(.)/g,'$1');var a={name:arg};var fc=arg[0];if(fc==='-'){fc=arg[1];}
+if(fc>='0'&&fc<='9'){fc='#';}
+switch(fc){case'\'':case'"':a.value=arg.slice(1,-1);a.literal=true;break;case'#':a.value=Number(arg);a.literal=true;break;}
+if(!a.literal){a.model=Polymer.Path.root(arg);a.structured=Polymer.Path.isDeep(arg);if(a.structured){a.wildcard=arg.slice(-2)=='.*';if(a.wildcard){a.name=arg.slice(0,-2);}}}
+return a;},_marshalInstanceEffects:function(){Polymer.Bind.prepareInstance(this);if(this._bindListeners){Polymer.Bind.setupBindListeners(this);}},_applyEffectValue:function(info,value){var node=this._nodes[info.index];var property=info.name;value=this._computeFinalAnnotationValue(node,property,value,info);if(info.kind=='attribute'){this.serializeValueToAttribute(value,property,node);}else{var pinfo=node._propertyInfo&&node._propertyInfo[property];if(pinfo&&pinfo.readOnly){return;}
+this.__setProperty(property,value,Polymer.Settings.suppressBindingNotifications,node);}},_computeFinalAnnotationValue:function(node,property,value,info){if(info.negate){value=!value;}
+if(info.isCompound){var storage=node.__compoundStorage__[property];storage[info.compoundIndex]=value;value=storage.join('');}
+if(info.kind!=='attribute'){if(property==='className'){value=this._scopeElementClass(node,value);}
+if(property==='textContent'||node.localName=='input'&&property=='value'){value=value==undefined?'':value;}}
+return value;},_executeStaticEffects:function(){if(this._propertyEffects&&this._propertyEffects.__static__){this._effectEffects('__static__',null,this._propertyEffects.__static__);}}});(function(){var usePolyfillProto=Polymer.Settings.usePolyfillProto;var avoidInstanceProperties=Boolean(Object.getOwnPropertyDescriptor(document.documentElement,'properties'));Polymer.Base._addFeature({_setupConfigure:function(initialConfig){this._config={};this._handlers=[];this._aboveConfig=null;if(initialConfig){for(var i in initialConfig){if(initialConfig[i]!==undefined){this._config[i]=initialConfig[i];}}}},_marshalAttributes:function(){this._takeAttributesToModel(this._config);},_attributeChangedImpl:function(name){var model=this._clientsReadied?this:this._config;this._setAttributeToProperty(model,name);},_configValue:function(name,value){var info=this._propertyInfo[name];if(!info||!info.readOnly){this._config[name]=value;}},_beforeClientsReady:function(){this._configure();},_configure:function(){this._configureAnnotationReferences();this._configureInstanceProperties();this._aboveConfig=this.mixin({},this._config);var config={};for(var i=0;i<this.behaviors.length;i++){this._configureProperties(this.behaviors[i].properties,config);}
+this._configureProperties(avoidInstanceProperties?this.__proto__.properties:this.properties,config);this.mixin(config,this._aboveConfig);this._config=config;if(this._clients&&this._clients.length){this._distributeConfig(this._config);}},_configureInstanceProperties:function(){for(var i in this._propertyEffects){if(!usePolyfillProto&&this.hasOwnProperty(i)){this._configValue(i,this[i]);delete this[i];}}},_configureProperties:function(properties,config){for(var i in properties){var c=properties[i];if(c.value!==undefined){var value=c.value;if(typeof value=='function'){value=value.call(this,this._config);}
+config[i]=value;}}},_distributeConfig:function(config){var fx$=this._propertyEffects;if(fx$){for(var p in config){var fx=fx$[p];if(fx){for(var i=0,l=fx.length,x;i<l&&(x=fx[i]);i++){if(x.kind==='annotation'){var node=this._nodes[x.effect.index];var name=x.effect.propertyName;var isAttr=x.effect.kind=='attribute';var hasEffect=node._propertyEffects&&node._propertyEffects[name];if(node._configValue&&(hasEffect||!isAttr)){var value=p===x.effect.value?config[p]:this._get(x.effect.value,config);value=this._computeFinalAnnotationValue(node,name,value,x.effect);if(isAttr){value=node.deserialize(this.serialize(value),node._propertyInfo[name].type);}
+node._configValue(name,value);}}}}}}},_afterClientsReady:function(){this._executeStaticEffects();this._applyConfig(this._config,this._aboveConfig);this._flushHandlers();},_applyConfig:function(config,aboveConfig){for(var n in config){if(this[n]===undefined){this.__setProperty(n,config[n],n in aboveConfig);}}},_notifyListener:function(fn,e){if(!Polymer.Bind._isEventBogus(e,e.target)){var value,path;if(e.detail){value=e.detail.value;path=e.detail.path;}
+if(!this._clientsReadied){this._queueHandler([fn,e.target,value,path]);}else{return fn.call(this,e.target,value,path);}}},_queueHandler:function(args){this._handlers.push(args);},_flushHandlers:function(){var h$=this._handlers;for(var i=0,l=h$.length,h;i<l&&(h=h$[i]);i++){h[0].call(this,h[1],h[2],h[3]);}
+this._handlers=[];}});}());(function(){'use strict';var Path=Polymer.Path;Polymer.Base._addFeature({notifyPath:function(path,value,fromAbove){var info={};var v=this._get(path,this,info);if(arguments.length===1){value=v;}
+if(info.path){this._notifyPath(info.path,value,fromAbove);}},_notifyPath:function(path,value,fromAbove){var old=this._propertySetter(path,value);if(old!==value&&(old===old||value===value)){this._pathEffector(path,value);if(!fromAbove){this._notifyPathUp(path,value);}
+return true;}},_getPathParts:function(path){if(Array.isArray(path)){var parts=[];for(var i=0;i<path.length;i++){var args=path[i].toString().split('.');for(var j=0;j<args.length;j++){parts.push(args[j]);}}
+return parts;}else{return path.toString().split('.');}},set:function(path,value,root){var prop=root||this;var parts=this._getPathParts(path);var array;var last=parts[parts.length-1];if(parts.length>1){for(var i=0;i<parts.length-1;i++){var part=parts[i];if(array&&part[0]=='#'){prop=Polymer.Collection.get(array).getItem(part);}else{prop=prop[part];if(array&&parseInt(part,10)==part){parts[i]=Polymer.Collection.get(array).getKey(prop);}}
+if(!prop){return;}
+array=Array.isArray(prop)?prop:null;}
+if(array){var coll=Polymer.Collection.get(array);var old,key;if(last[0]=='#'){key=last;old=coll.getItem(key);last=array.indexOf(old);coll.setItem(key,value);}else if(parseInt(last,10)==last){old=prop[last];key=coll.getKey(old);parts[i]=key;coll.setItem(key,value);}}
+prop[last]=value;if(!root){this._notifyPath(parts.join('.'),value);}}else{prop[path]=value;}},get:function(path,root){return this._get(path,root);},_get:function(path,root,info){var prop=root||this;var parts=this._getPathParts(path);var array;for(var i=0;i<parts.length;i++){if(!prop){return;}
+var part=parts[i];if(array&&part[0]=='#'){prop=Polymer.Collection.get(array).getItem(part);}else{prop=prop[part];if(info&&array&&parseInt(part,10)==part){parts[i]=Polymer.Collection.get(array).getKey(prop);}}
+array=Array.isArray(prop)?prop:null;}
+if(info){info.path=parts.join('.');}
+return prop;},_pathEffector:function(path,value){var model=Path.root(path);var fx$=this._propertyEffects&&this._propertyEffects[model];if(fx$){for(var i=0,fx;i<fx$.length&&(fx=fx$[i]);i++){var fxFn=fx.pathFn;if(fxFn){fxFn.call(this,path,value,fx.effect);}}}
+if(this._boundPaths){this._notifyBoundPaths(path,value);}},_annotationPathEffect:function(path,value,effect){if(Path.matches(effect.value,false,path)){Polymer.Bind._annotationEffect.call(this,path,value,effect);}else if(!effect.negate&&Path.isDescendant(effect.value,path)){var node=this._nodes[effect.index];if(node&&node._notifyPath){var newPath=Path.translate(effect.value,effect.name,path);node._notifyPath(newPath,value,true);}}},_complexObserverPathEffect:function(path,value,effect){if(Path.matches(effect.trigger.name,effect.trigger.wildcard,path)){Polymer.Bind._complexObserverEffect.call(this,path,value,effect);}},_computePathEffect:function(path,value,effect){if(Path.matches(effect.trigger.name,effect.trigger.wildcard,path)){Polymer.Bind._computeEffect.call(this,path,value,effect);}},_annotatedComputationPathEffect:function(path,value,effect){if(Path.matches(effect.trigger.name,effect.trigger.wildcard,path)){Polymer.Bind._annotatedComputationEffect.call(this,path,value,effect);}},linkPaths:function(to,from){this._boundPaths=this._boundPaths||{};if(from){this._boundPaths[to]=from;}else{this.unlinkPaths(to);}},unlinkPaths:function(path){if(this._boundPaths){delete this._boundPaths[path];}},_notifyBoundPaths:function(path,value){for(var a in this._boundPaths){var b=this._boundPaths[a];if(Path.isDescendant(a,path)){this._notifyPath(Path.translate(a,b,path),value);}else if(Path.isDescendant(b,path)){this._notifyPath(Path.translate(b,a,path),value);}}},_notifyPathUp:function(path,value){var rootName=Path.root(path);var dashCaseName=Polymer.CaseMap.camelToDashCase(rootName);var eventName=dashCaseName+this._EVENT_CHANGED;this.fire(eventName,{path:path,value:value},{bubbles:false,_useCache:Polymer.Settings.eventDataCache||!Polymer.Settings.isIE});},_EVENT_CHANGED:'-changed',notifySplices:function(path,splices){var info={};var array=this._get(path,this,info);this._notifySplices(array,info.path,splices);},_notifySplices:function(array,path,splices){var change={keySplices:Polymer.Collection.applySplices(array,splices),indexSplices:splices};var splicesPath=path+'.splices';this._notifyPath(splicesPath,change);this._notifyPath(path+'.length',array.length);this.__data__[splicesPath]={keySplices:null,indexSplices:null};},_notifySplice:function(array,path,index,added,removed){this._notifySplices(array,path,[{index:index,addedCount:added,removed:removed,object:array,type:'splice'}]);},push:function(path){var info={};var array=this._get(path,this,info);var args=Array.prototype.slice.call(arguments,1);var len=array.length;var ret=array.push.apply(array,args);if(args.length){this._notifySplice(array,info.path,len,args.length,[]);}
+return ret;},pop:function(path){var info={};var array=this._get(path,this,info);var hadLength=Boolean(array.length);var args=Array.prototype.slice.call(arguments,1);var ret=array.pop.apply(array,args);if(hadLength){this._notifySplice(array,info.path,array.length,0,[ret]);}
+return ret;},splice:function(path,start){var info={};var array=this._get(path,this,info);if(start<0){start=array.length-Math.floor(-start);}else{start=Math.floor(start);}
+if(!start){start=0;}
+var args=Array.prototype.slice.call(arguments,1);var ret=array.splice.apply(array,args);var addedCount=Math.max(args.length-2,0);if(addedCount||ret.length){this._notifySplice(array,info.path,start,addedCount,ret);}
+return ret;},shift:function(path){var info={};var array=this._get(path,this,info);var hadLength=Boolean(array.length);var args=Array.prototype.slice.call(arguments,1);var ret=array.shift.apply(array,args);if(hadLength){this._notifySplice(array,info.path,0,0,[ret]);}
+return ret;},unshift:function(path){var info={};var array=this._get(path,this,info);var args=Array.prototype.slice.call(arguments,1);var ret=array.unshift.apply(array,args);if(args.length){this._notifySplice(array,info.path,0,args.length,[]);}
+return ret;},prepareModelNotifyPath:function(model){this.mixin(model,{fire:Polymer.Base.fire,_getEvent:Polymer.Base._getEvent,__eventCache:Polymer.Base.__eventCache,notifyPath:Polymer.Base.notifyPath,_get:Polymer.Base._get,_EVENT_CHANGED:Polymer.Base._EVENT_CHANGED,_notifyPath:Polymer.Base._notifyPath,_notifyPathUp:Polymer.Base._notifyPathUp,_pathEffector:Polymer.Base._pathEffector,_annotationPathEffect:Polymer.Base._annotationPathEffect,_complexObserverPathEffect:Polymer.Base._complexObserverPathEffect,_annotatedComputationPathEffect:Polymer.Base._annotatedComputationPathEffect,_computePathEffect:Polymer.Base._computePathEffect,_notifyBoundPaths:Polymer.Base._notifyBoundPaths,_getPathParts:Polymer.Base._getPathParts});}});}());Polymer.Base._addFeature({resolveUrl:function(url){var module=Polymer.DomModule.import(this.is);var root='';if(module){var assetPath=module.getAttribute('assetpath')||'';root=Polymer.ResolveUrl.resolveUrl(assetPath,module.ownerDocument.baseURI);}
+return Polymer.ResolveUrl.resolveUrl(url,root);}});Polymer.CssParse=function(){return{parse:function(text){text=this._clean(text);return this._parseCss(this._lex(text),text);},_clean:function(cssText){return cssText.replace(this._rx.comments,'').replace(this._rx.port,'');},_lex:function(text){var root={start:0,end:text.length};var n=root;for(var i=0,l=text.length;i<l;i++){switch(text[i]){case this.OPEN_BRACE:if(!n.rules){n.rules=[];}
+var p=n;var previous=p.rules[p.rules.length-1];n={start:i+1,parent:p,previous:previous};p.rules.push(n);break;case this.CLOSE_BRACE:n.end=i+1;n=n.parent||root;break;}}
+return root;},_parseCss:function(node,text){var t=text.substring(node.start,node.end-1);node.parsedCssText=node.cssText=t.trim();if(node.parent){var ss=node.previous?node.previous.end:node.parent.start;t=text.substring(ss,node.start-1);t=this._expandUnicodeEscapes(t);t=t.replace(this._rx.multipleSpaces,' ');t=t.substring(t.lastIndexOf(';')+1);var s=node.parsedSelector=node.selector=t.trim();node.atRule=s.indexOf(this.AT_START)===0;if(node.atRule){if(s.indexOf(this.MEDIA_START)===0){node.type=this.types.MEDIA_RULE;}else if(s.match(this._rx.keyframesRule)){node.type=this.types.KEYFRAMES_RULE;node.keyframesName=node.selector.split(this._rx.multipleSpaces).pop();}}else{if(s.indexOf(this.VAR_START)===0){node.type=this.types.MIXIN_RULE;}else{node.type=this.types.STYLE_RULE;}}}
+var r$=node.rules;if(r$){for(var i=0,l=r$.length,r;i<l&&(r=r$[i]);i++){this._parseCss(r,text);}}
+return node;},_expandUnicodeEscapes:function(s){return s.replace(/\\([0-9a-f]{1,6})\s/gi,function(){var code=arguments[1],repeat=6-code.length;while(repeat--){code='0'+code;}
+return'\\'+code;});},stringify:function(node,preserveProperties,text){text=text||'';var cssText='';if(node.cssText||node.rules){var r$=node.rules;if(r$&&!this._hasMixinRules(r$)){for(var i=0,l=r$.length,r;i<l&&(r=r$[i]);i++){cssText=this.stringify(r,preserveProperties,cssText);}}else{cssText=preserveProperties?node.cssText:this.removeCustomProps(node.cssText);cssText=cssText.trim();if(cssText){cssText=' '+cssText+'\n';}}}
+if(cssText){if(node.selector){text+=node.selector+' '+this.OPEN_BRACE+'\n';}
+text+=cssText;if(node.selector){text+=this.CLOSE_BRACE+'\n\n';}}
+return text;},_hasMixinRules:function(rules){return rules[0].selector.indexOf(this.VAR_START)===0;},removeCustomProps:function(cssText){cssText=this.removeCustomPropAssignment(cssText);return this.removeCustomPropApply(cssText);},removeCustomPropAssignment:function(cssText){return cssText.replace(this._rx.customProp,'').replace(this._rx.mixinProp,'');},removeCustomPropApply:function(cssText){return cssText.replace(this._rx.mixinApply,'').replace(this._rx.varApply,'');},types:{STYLE_RULE:1,KEYFRAMES_RULE:7,MEDIA_RULE:4,MIXIN_RULE:1000},OPEN_BRACE:'{',CLOSE_BRACE:'}',_rx:{comments:/\/\*[^*]*\*+([^\/*][^*]*\*+)*\//gim,port:/@import[^;]*;/gim,customProp:/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\n]|$)/gim,mixinProp:/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\n]|$)?/gim,mixinApply:/@apply\s*\(?[^);]*\)?\s*(?:[;\n]|$)?/gim,varApply:/[^;:]*?:[^;]*?var\([^;]*\)(?:[;\n]|$)?/gim,keyframesRule:/^@[^\s]*keyframes/,multipleSpaces:/\s+/g},VAR_START:'--',MEDIA_START:'@media',AT_START:'@'};}();Polymer.StyleUtil=function(){var settings=Polymer.Settings;return{NATIVE_VARIABLES:Polymer.Settings.useNativeCSSProperties,MODULE_STYLES_SELECTOR:'style, link[rel=import][type~=css], template',INCLUDE_ATTR:'include',toCssText:function(rules,callback){if(typeof rules==='string'){rules=this.parser.parse(rules);}
+if(callback){this.forEachRule(rules,callback);}
+return this.parser.stringify(rules,this.NATIVE_VARIABLES);},forRulesInStyles:function(styles,styleRuleCallback,keyframesRuleCallback){if(styles){for(var i=0,l=styles.length,s;i<l&&(s=styles[i]);i++){this.forEachRuleInStyle(s,styleRuleCallback,keyframesRuleCallback);}}},forActiveRulesInStyles:function(styles,styleRuleCallback,keyframesRuleCallback){if(styles){for(var i=0,l=styles.length,s;i<l&&(s=styles[i]);i++){this.forEachRuleInStyle(s,styleRuleCallback,keyframesRuleCallback,true);}}},rulesForStyle:function(style){if(!style.__cssRules&&style.textContent){style.__cssRules=this.parser.parse(style.textContent);}
+return style.__cssRules;},isKeyframesSelector:function(rule){return rule.parent&&rule.parent.type===this.ruleTypes.KEYFRAMES_RULE;},forEachRuleInStyle:function(style,styleRuleCallback,keyframesRuleCallback,onlyActiveRules){var rules=this.rulesForStyle(style);var styleCallback,keyframeCallback;if(styleRuleCallback){styleCallback=function(rule){styleRuleCallback(rule,style);};}
+if(keyframesRuleCallback){keyframeCallback=function(rule){keyframesRuleCallback(rule,style);};}
+this.forEachRule(rules,styleCallback,keyframeCallback,onlyActiveRules);},forEachRule:function(node,styleRuleCallback,keyframesRuleCallback,onlyActiveRules){if(!node){return;}
+var skipRules=false;if(onlyActiveRules){if(node.type===this.ruleTypes.MEDIA_RULE){var matchMedia=node.selector.match(this.rx.MEDIA_MATCH);if(matchMedia){if(!window.matchMedia(matchMedia[1]).matches){skipRules=true;}}}}
+if(node.type===this.ruleTypes.STYLE_RULE){styleRuleCallback(node);}else if(keyframesRuleCallback&&node.type===this.ruleTypes.KEYFRAMES_RULE){keyframesRuleCallback(node);}else if(node.type===this.ruleTypes.MIXIN_RULE){skipRules=true;}
+var r$=node.rules;if(r$&&!skipRules){for(var i=0,l=r$.length,r;i<l&&(r=r$[i]);i++){this.forEachRule(r,styleRuleCallback,keyframesRuleCallback,onlyActiveRules);}}},applyCss:function(cssText,moniker,target,contextNode){var style=this.createScopeStyle(cssText,moniker);return this.applyStyle(style,target,contextNode);},applyStyle:function(style,target,contextNode){target=target||document.head;var after=contextNode&&contextNode.nextSibling||target.firstChild;this.__lastHeadApplyNode=style;return target.insertBefore(style,after);},createScopeStyle:function(cssText,moniker){var style=document.createElement('style');if(moniker){style.setAttribute('scope',moniker);}
+style.textContent=cssText;return style;},__lastHeadApplyNode:null,applyStylePlaceHolder:function(moniker){var placeHolder=document.createComment(' Shady DOM styles for '+moniker+' ');var after=this.__lastHeadApplyNode?this.__lastHeadApplyNode.nextSibling:null;var scope=document.head;scope.insertBefore(placeHolder,after||scope.firstChild);this.__lastHeadApplyNode=placeHolder;return placeHolder;},cssFromModules:function(moduleIds,warnIfNotFound){var modules=moduleIds.trim().split(' ');var cssText='';for(var i=0;i<modules.length;i++){cssText+=this.cssFromModule(modules[i],warnIfNotFound);}
+return cssText;},cssFromModule:function(moduleId,warnIfNotFound){var m=Polymer.DomModule.import(moduleId);if(m&&!m._cssText){m._cssText=this.cssFromElement(m);}
+if(!m&&warnIfNotFound){console.warn('Could not find style data in module named',moduleId);}
+return m&&m._cssText||'';},cssFromElement:function(element){var cssText='';var content=element.content||element;var e$=Polymer.TreeApi.arrayCopy(content.querySelectorAll(this.MODULE_STYLES_SELECTOR));for(var i=0,e;i<e$.length;i++){e=e$[i];if(e.localName==='template'){if(!e.hasAttribute('preserve-content')){cssText+=this.cssFromElement(e);}}else{if(e.localName==='style'){var include=e.getAttribute(this.INCLUDE_ATTR);if(include){cssText+=this.cssFromModules(include,true);}
+e=e.__appliedElement||e;e.parentNode.removeChild(e);cssText+=this.resolveCss(e.textContent,element.ownerDocument);}else if(e.import&&e.import.body){cssText+=this.resolveCss(e.import.body.textContent,e.import);}}}
+return cssText;},styleIncludesToTemplate:function(targetTemplate){var styles=targetTemplate.content.querySelectorAll('style[include]');for(var i=0,s;i<styles.length;i++){s=styles[i];s.parentNode.insertBefore(this._includesToFragment(s.getAttribute('include')),s);}},_includesToFragment:function(styleIncludes){var includeArray=styleIncludes.trim().split(' ');var frag=document.createDocumentFragment();for(var i=0;i<includeArray.length;i++){var t=Polymer.DomModule.import(includeArray[i],'template');if(t){this._addStylesToFragment(frag,t.content);}}
+return frag;},_addStylesToFragment:function(frag,source){var s$=source.querySelectorAll('style');for(var i=0,s;i<s$.length;i++){s=s$[i];var include=s.getAttribute('include');if(include){frag.appendChild(this._includesToFragment(include));}
+if(s.textContent){frag.appendChild(s.cloneNode(true));}}},isTargetedBuild:function(buildType){return settings.useNativeShadow?buildType==='shadow':buildType==='shady';},cssBuildTypeForModule:function(module){var dm=Polymer.DomModule.import(module);if(dm){return this.getCssBuildType(dm);}},getCssBuildType:function(element){return element.getAttribute('css-build');},_findMatchingParen:function(text,start){var level=0;for(var i=start,l=text.length;i<l;i++){switch(text[i]){case'(':level++;break;case')':if(--level===0){return i;}
+break;}}
+return-1;},processVariableAndFallback:function(str,callback){var start=str.indexOf('var(');if(start===-1){return callback(str,'','','');}
+var end=this._findMatchingParen(str,start+3);var inner=str.substring(start+4,end);var prefix=str.substring(0,start);var suffix=this.processVariableAndFallback(str.substring(end+1),callback);var comma=inner.indexOf(',');if(comma===-1){return callback(prefix,inner.trim(),'',suffix);}
+var value=inner.substring(0,comma).trim();var fallback=inner.substring(comma+1).trim();return callback(prefix,value,fallback,suffix);},rx:{VAR_ASSIGN:/(?:^|[;\s{]\s*)(--[\w-]*?)\s*:\s*(?:([^;{]*)|{([^}]*)})(?:(?=[;\s}])|$)/gi,MIXIN_MATCH:/(?:^|\W+)@apply\s*\(?([^);\n]*)\)?/gi,VAR_CONSUMED:/(--[\w-]+)\s*([:,;)]|$)/gi,ANIMATION_MATCH:/(animation\s*:)|(animation-name\s*:)/,MEDIA_MATCH:/@media[^(]*(\([^)]*\))/,IS_VAR:/^--/,BRACKETED:/\{[^}]*\}/g,HOST_PREFIX:'(?:^|[^.#[:])',HOST_SUFFIX:'($|[.:[\\s>+~])'},resolveCss:Polymer.ResolveUrl.resolveCss,parser:Polymer.CssParse,ruleTypes:Polymer.CssParse.types};}();Polymer.StyleTransformer=function(){var styleUtil=Polymer.StyleUtil;var settings=Polymer.Settings;var api={dom:function(node,scope,useAttr,shouldRemoveScope){this._transformDom(node,scope||'',useAttr,shouldRemoveScope);},_transformDom:function(node,selector,useAttr,shouldRemoveScope){if(node.setAttribute){this.element(node,selector,useAttr,shouldRemoveScope);}
+var c$=Polymer.dom(node).childNodes;for(var i=0;i<c$.length;i++){this._transformDom(c$[i],selector,useAttr,shouldRemoveScope);}},element:function(element,scope,useAttr,shouldRemoveScope){if(useAttr){if(shouldRemoveScope){element.removeAttribute(SCOPE_NAME);}else{element.setAttribute(SCOPE_NAME,scope);}}else{if(scope){if(element.classList){if(shouldRemoveScope){element.classList.remove(SCOPE_NAME);element.classList.remove(scope);}else{element.classList.add(SCOPE_NAME);element.classList.add(scope);}}else if(element.getAttribute){var c=element.getAttribute(CLASS);if(shouldRemoveScope){if(c){element.setAttribute(CLASS,c.replace(SCOPE_NAME,'').replace(scope,''));}}else{element.setAttribute(CLASS,(c?c+' ':'')+SCOPE_NAME+' '+scope);}}}}},elementStyles:function(element,callback){var styles=element._styles;var cssText='';var cssBuildType=element.__cssBuild;var passthrough=settings.useNativeShadow||cssBuildType==='shady';var cb;if(passthrough){var self=this;cb=function(rule){rule.selector=self._slottedToContent(rule.selector);rule.selector=rule.selector.replace(ROOT,':host > *');if(callback){callback(rule);}};}
+for(var i=0,l=styles.length,s;i<l&&(s=styles[i]);i++){var rules=styleUtil.rulesForStyle(s);cssText+=passthrough?styleUtil.toCssText(rules,cb):this.css(rules,element.is,element.extends,callback,element._scopeCssViaAttr)+'\n\n';}
+return cssText.trim();},css:function(rules,scope,ext,callback,useAttr){var hostScope=this._calcHostScope(scope,ext);scope=this._calcElementScope(scope,useAttr);var self=this;return styleUtil.toCssText(rules,function(rule){if(!rule.isScoped){self.rule(rule,scope,hostScope);rule.isScoped=true;}
+if(callback){callback(rule,scope,hostScope);}});},_calcElementScope:function(scope,useAttr){if(scope){return useAttr?CSS_ATTR_PREFIX+scope+CSS_ATTR_SUFFIX:CSS_CLASS_PREFIX+scope;}else{return'';}},_calcHostScope:function(scope,ext){return ext?'[is='+scope+']':scope;},rule:function(rule,scope,hostScope){this._transformRule(rule,this._transformComplexSelector,scope,hostScope);},_transformRule:function(rule,transformer,scope,hostScope){rule.selector=rule.transformedSelector=this._transformRuleCss(rule,transformer,scope,hostScope);},_transformRuleCss:function(rule,transformer,scope,hostScope){var p$=rule.selector.split(COMPLEX_SELECTOR_SEP);if(!styleUtil.isKeyframesSelector(rule)){for(var i=0,l=p$.length,p;i<l&&(p=p$[i]);i++){p$[i]=transformer.call(this,p,scope,hostScope);}}
+return p$.join(COMPLEX_SELECTOR_SEP);},_transformComplexSelector:function(selector,scope,hostScope){var stop=false;var hostContext=false;var self=this;selector=selector.trim();selector=this._slottedToContent(selector);selector=selector.replace(ROOT,':host > *');selector=selector.replace(CONTENT_START,HOST+' $1');selector=selector.replace(SIMPLE_SELECTOR_SEP,function(m,c,s){if(!stop){var info=self._transformCompoundSelector(s,c,scope,hostScope);stop=stop||info.stop;hostContext=hostContext||info.hostContext;c=info.combinator;s=info.value;}else{s=s.replace(SCOPE_JUMP,' ');}
+return c+s;});if(hostContext){selector=selector.replace(HOST_CONTEXT_PAREN,function(m,pre,paren,post){return pre+paren+' '+hostScope+post+COMPLEX_SELECTOR_SEP+' '+pre+hostScope+paren+post;});}
+return selector;},_transformCompoundSelector:function(selector,combinator,scope,hostScope){var jumpIndex=selector.search(SCOPE_JUMP);var hostContext=false;if(selector.indexOf(HOST_CONTEXT)>=0){hostContext=true;}else if(selector.indexOf(HOST)>=0){selector=this._transformHostSelector(selector,hostScope);}else if(jumpIndex!==0){selector=scope?this._transformSimpleSelector(selector,scope):selector;}
+if(selector.indexOf(CONTENT)>=0){combinator='';}
+var stop;if(jumpIndex>=0){selector=selector.replace(SCOPE_JUMP,' ');stop=true;}
+return{value:selector,combinator:combinator,stop:stop,hostContext:hostContext};},_transformSimpleSelector:function(selector,scope){var p$=selector.split(PSEUDO_PREFIX);p$[0]+=scope;return p$.join(PSEUDO_PREFIX);},_transformHostSelector:function(selector,hostScope){var m=selector.match(HOST_PAREN);var paren=m&&m[2].trim()||'';if(paren){if(!paren[0].match(SIMPLE_SELECTOR_PREFIX)){var typeSelector=paren.split(SIMPLE_SELECTOR_PREFIX)[0];if(typeSelector===hostScope){return paren;}else{return SELECTOR_NO_MATCH;}}else{return selector.replace(HOST_PAREN,function(m,host,paren){return hostScope+paren;});}}else{return selector.replace(HOST,hostScope);}},documentRule:function(rule){rule.selector=rule.parsedSelector;this.normalizeRootSelector(rule);if(!settings.useNativeShadow){this._transformRule(rule,this._transformDocumentSelector);}},normalizeRootSelector:function(rule){rule.selector=rule.selector.replace(ROOT,'html');},_transformDocumentSelector:function(selector){return selector.match(SCOPE_JUMP)?this._transformComplexSelector(selector,SCOPE_DOC_SELECTOR):this._transformSimpleSelector(selector.trim(),SCOPE_DOC_SELECTOR);},_slottedToContent:function(cssText){return cssText.replace(SLOTTED_PAREN,CONTENT+'> $1');},SCOPE_NAME:'style-scope'};var SCOPE_NAME=api.SCOPE_NAME;var SCOPE_DOC_SELECTOR=':not(['+SCOPE_NAME+'])'+':not(.'+SCOPE_NAME+')';var COMPLEX_SELECTOR_SEP=',';var SIMPLE_SELECTOR_SEP=/(^|[\s>+~]+)((?:\[.+?\]|[^\s>+~=\[])+)/g;var SIMPLE_SELECTOR_PREFIX=/[[.:#*]/;var HOST=':host';var ROOT=':root';var HOST_PAREN=/(:host)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/;var HOST_CONTEXT=':host-context';var HOST_CONTEXT_PAREN=/(.*)(?::host-context)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))(.*)/;var CONTENT='::content';var SCOPE_JUMP=/::content|::shadow|\/deep\//;var CSS_CLASS_PREFIX='.';var CSS_ATTR_PREFIX='['+SCOPE_NAME+'~=';var CSS_ATTR_SUFFIX=']';var PSEUDO_PREFIX=':';var CLASS='class';var CONTENT_START=new RegExp('^('+CONTENT+')');var SELECTOR_NO_MATCH='should_not_match';var SLOTTED_PAREN=/(?:::slotted)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/g;return api;}();Polymer.StyleExtends=function(){var styleUtil=Polymer.StyleUtil;return{hasExtends:function(cssText){return Boolean(cssText.match(this.rx.EXTEND));},transform:function(style){var rules=styleUtil.rulesForStyle(style);var self=this;styleUtil.forEachRule(rules,function(rule){self._mapRuleOntoParent(rule);if(rule.parent){var m;while(m=self.rx.EXTEND.exec(rule.cssText)){var extend=m[1];var extendor=self._findExtendor(extend,rule);if(extendor){self._extendRule(rule,extendor);}}}
+rule.cssText=rule.cssText.replace(self.rx.EXTEND,'');});return styleUtil.toCssText(rules,function(rule){if(rule.selector.match(self.rx.STRIP)){rule.cssText='';}},true);},_mapRuleOntoParent:function(rule){if(rule.parent){var map=rule.parent.map||(rule.parent.map={});var parts=rule.selector.split(',');for(var i=0,p;i<parts.length;i++){p=parts[i];map[p.trim()]=rule;}
+return map;}},_findExtendor:function(extend,rule){return rule.parent&&rule.parent.map&&rule.parent.map[extend]||this._findExtendor(extend,rule.parent);},_extendRule:function(target,source){if(target.parent!==source.parent){this._cloneAndAddRuleToParent(source,target.parent);}
+target.extends=target.extends||[];target.extends.push(source);source.selector=source.selector.replace(this.rx.STRIP,'');source.selector=(source.selector&&source.selector+',\n')+target.selector;if(source.extends){source.extends.forEach(function(e){this._extendRule(target,e);},this);}},_cloneAndAddRuleToParent:function(rule,parent){rule=Object.create(rule);rule.parent=parent;if(rule.extends){rule.extends=rule.extends.slice();}
+parent.rules.push(rule);},rx:{EXTEND:/@extends\(([^)]*)\)\s*?;/gim,STRIP:/%[^,]*$/}};}();Polymer.ApplyShim=function(){'use strict';var styleUtil=Polymer.StyleUtil;var MIXIN_MATCH=styleUtil.rx.MIXIN_MATCH;var VAR_ASSIGN=styleUtil.rx.VAR_ASSIGN;var BAD_VAR=/var\(\s*(--[^,]*),\s*(--[^)]*)\)/g;var APPLY_NAME_CLEAN=/;\s*/m;var INITIAL_INHERIT=/^\s*(initial)|(inherit)\s*$/;var MIXIN_VAR_SEP='_-_';var mixinMap={};function mapSet(name,props){name=name.trim();mixinMap[name]={properties:props,dependants:{}};}
+function mapGet(name){name=name.trim();return mixinMap[name];}
+function replaceInitialOrInherit(property,value){var match=INITIAL_INHERIT.exec(value);if(match){if(match[1]){value=ApplyShim._getInitialValueForProperty(property);}else{value='apply-shim-inherit';}}
+return value;}
+function cssTextToMap(text){var props=text.split(';');var property,value;var out={};for(var i=0,p,sp;i<props.length;i++){p=props[i];if(p){sp=p.split(':');if(sp.length>1){property=sp[0].trim();value=replaceInitialOrInherit(property,sp.slice(1).join(':'));out[property]=value;}}}
+return out;}
+function invalidateMixinEntry(mixinEntry){var currentProto=ApplyShim.__currentElementProto;var currentElementName=currentProto&&currentProto.is;for(var elementName in mixinEntry.dependants){if(elementName!==currentElementName){mixinEntry.dependants[elementName].__applyShimInvalid=true;}}}
+function produceCssProperties(matchText,propertyName,valueProperty,valueMixin){if(valueProperty){styleUtil.processVariableAndFallback(valueProperty,function(prefix,value){if(value&&mapGet(value)){valueMixin='@apply '+value+';';}});}
+if(!valueMixin){return matchText;}
+var mixinAsProperties=consumeCssProperties(valueMixin);var prefix=matchText.slice(0,matchText.indexOf('--'));var mixinValues=cssTextToMap(mixinAsProperties);var combinedProps=mixinValues;var mixinEntry=mapGet(propertyName);var oldProps=mixinEntry&&mixinEntry.properties;if(oldProps){combinedProps=Object.create(oldProps);combinedProps=Polymer.Base.mixin(combinedProps,mixinValues);}else{mapSet(propertyName,combinedProps);}
+var out=[];var p,v;var needToInvalidate=false;for(p in combinedProps){v=mixinValues[p];if(v===undefined){v='initial';}
+if(oldProps&&!(p in oldProps)){needToInvalidate=true;}
+out.push(propertyName+MIXIN_VAR_SEP+p+': '+v);}
+if(needToInvalidate){invalidateMixinEntry(mixinEntry);}
+if(mixinEntry){mixinEntry.properties=combinedProps;}
+if(valueProperty){prefix=matchText+';'+prefix;}
+return prefix+out.join('; ')+';';}
+function fixVars(matchText,varA,varB){return'var('+varA+','+'var('+varB+'))';}
+function atApplyToCssProperties(mixinName,fallbacks){mixinName=mixinName.replace(APPLY_NAME_CLEAN,'');var vars=[];var mixinEntry=mapGet(mixinName);if(!mixinEntry){mapSet(mixinName,{});mixinEntry=mapGet(mixinName);}
+if(mixinEntry){var currentProto=ApplyShim.__currentElementProto;if(currentProto){mixinEntry.dependants[currentProto.is]=currentProto;}
+var p,parts,f;for(p in mixinEntry.properties){f=fallbacks&&fallbacks[p];parts=[p,': var(',mixinName,MIXIN_VAR_SEP,p];if(f){parts.push(',',f);}
+parts.push(')');vars.push(parts.join(''));}}
+return vars.join('; ');}
+function consumeCssProperties(text){var m;while(m=MIXIN_MATCH.exec(text)){var matchText=m[0];var mixinName=m[1];var idx=m.index;var applyPos=idx+matchText.indexOf('@apply');var afterApplyPos=idx+matchText.length;var textBeforeApply=text.slice(0,applyPos);var textAfterApply=text.slice(afterApplyPos);var defaults=cssTextToMap(textBeforeApply);var replacement=atApplyToCssProperties(mixinName,defaults);text=[textBeforeApply,replacement,textAfterApply].join('');MIXIN_MATCH.lastIndex=idx+replacement.length;}
+return text;}
+var ApplyShim={_measureElement:null,_map:mixinMap,_separator:MIXIN_VAR_SEP,transform:function(styles,elementProto){this.__currentElementProto=elementProto;styleUtil.forRulesInStyles(styles,this._boundFindDefinitions);styleUtil.forRulesInStyles(styles,this._boundFindApplications);if(elementProto){elementProto.__applyShimInvalid=false;}
+this.__currentElementProto=null;},_findDefinitions:function(rule){var cssText=rule.parsedCssText;cssText=cssText.replace(BAD_VAR,fixVars);cssText=cssText.replace(VAR_ASSIGN,produceCssProperties);rule.cssText=cssText;if(rule.selector===':root'){rule.selector=':host > *';}},_findApplications:function(rule){rule.cssText=consumeCssProperties(rule.cssText);},transformRule:function(rule){this._findDefinitions(rule);this._findApplications(rule);},_getInitialValueForProperty:function(property){if(!this._measureElement){this._measureElement=document.createElement('meta');this._measureElement.style.all='initial';document.head.appendChild(this._measureElement);}
+return window.getComputedStyle(this._measureElement).getPropertyValue(property);}};ApplyShim._boundTransformRule=ApplyShim.transformRule.bind(ApplyShim);ApplyShim._boundFindDefinitions=ApplyShim._findDefinitions.bind(ApplyShim);ApplyShim._boundFindApplications=ApplyShim._findApplications.bind(ApplyShim);return ApplyShim;}();(function(){var prepElement=Polymer.Base._prepElement;var nativeShadow=Polymer.Settings.useNativeShadow;var styleUtil=Polymer.StyleUtil;var styleTransformer=Polymer.StyleTransformer;var styleExtends=Polymer.StyleExtends;var applyShim=Polymer.ApplyShim;var settings=Polymer.Settings;Polymer.Base._addFeature({_prepElement:function(element){if(this._encapsulateStyle&&this.__cssBuild!=='shady'){styleTransformer.element(element,this.is,this._scopeCssViaAttr);}
+prepElement.call(this,element);},_prepStyles:function(){if(this._encapsulateStyle===undefined){this._encapsulateStyle=!nativeShadow;}
+if(!nativeShadow){this._scopeStyle=styleUtil.applyStylePlaceHolder(this.is);}
+this.__cssBuild=styleUtil.cssBuildTypeForModule(this.is);},_prepShimStyles:function(){if(this._template){var hasTargetedCssBuild=styleUtil.isTargetedBuild(this.__cssBuild);if(settings.useNativeCSSProperties&&this.__cssBuild==='shadow'&&hasTargetedCssBuild){if(settings.preserveStyleIncludes){styleUtil.styleIncludesToTemplate(this._template);}
+return;}
+this._styles=this._styles||this._collectStyles();if(settings.useNativeCSSProperties&&!this.__cssBuild){applyShim.transform(this._styles,this);}
+var cssText=settings.useNativeCSSProperties&&hasTargetedCssBuild?this._styles.length&&this._styles[0].textContent.trim():styleTransformer.elementStyles(this);this._prepStyleProperties();if(!this._needsStyleProperties()&&cssText){styleUtil.applyCss(cssText,this.is,nativeShadow?this._template.content:null,this._scopeStyle);}}else{this._styles=[];}},_collectStyles:function(){var styles=[];var cssText='',m$=this.styleModules;if(m$){for(var i=0,l=m$.length,m;i<l&&(m=m$[i]);i++){cssText+=styleUtil.cssFromModule(m);}}
+cssText+=styleUtil.cssFromModule(this.is);var p=this._template&&this._template.parentNode;if(this._template&&(!p||p.id.toLowerCase()!==this.is)){cssText+=styleUtil.cssFromElement(this._template);}
+if(cssText){var style=document.createElement('style');style.textContent=cssText;if(styleExtends.hasExtends(style.textContent)){cssText=styleExtends.transform(style);}
+styles.push(style);}
+return styles;},_elementAdd:function(node){if(this._encapsulateStyle){if(node.__styleScoped){node.__styleScoped=false;}else{styleTransformer.dom(node,this.is,this._scopeCssViaAttr);}}},_elementRemove:function(node){if(this._encapsulateStyle){styleTransformer.dom(node,this.is,this._scopeCssViaAttr,true);}},scopeSubtree:function(container,shouldObserve){if(nativeShadow){return;}
+var self=this;var scopify=function(node){if(node.nodeType===Node.ELEMENT_NODE){var className=node.getAttribute('class');node.setAttribute('class',self._scopeElementClass(node,className));var n$=node.querySelectorAll('*');for(var i=0,n;i<n$.length&&(n=n$[i]);i++){className=n.getAttribute('class');n.setAttribute('class',self._scopeElementClass(n,className));}}};scopify(container);if(shouldObserve){var mo=new MutationObserver(function(mxns){for(var i=0,m;i<mxns.length&&(m=mxns[i]);i++){if(m.addedNodes){for(var j=0;j<m.addedNodes.length;j++){scopify(m.addedNodes[j]);}}}});mo.observe(container,{childList:true,subtree:true});return mo;}}});}());Polymer.StyleProperties=function(){'use strict';var matchesSelector=Polymer.DomApi.matchesSelector;var styleUtil=Polymer.StyleUtil;var styleTransformer=Polymer.StyleTransformer;var IS_IE=navigator.userAgent.match('Trident');var settings=Polymer.Settings;return{decorateStyles:function(styles,scope){var self=this,props={},keyframes=[],ruleIndex=0;var scopeSelector=styleTransformer._calcHostScope(scope.is,scope.extends);styleUtil.forRulesInStyles(styles,function(rule,style){self.decorateRule(rule);rule.index=ruleIndex++;self.whenHostOrRootRule(scope,rule,style,function(info){if(rule.parent.type===styleUtil.ruleTypes.MEDIA_RULE){scope.__notStyleScopeCacheable=true;}
+if(info.isHost){var hostContextOrFunction=info.selector.split(' ').some(function(s){return s.indexOf(scopeSelector)===0&&s.length!==scopeSelector.length;});scope.__notStyleScopeCacheable=scope.__notStyleScopeCacheable||hostContextOrFunction;}});self.collectPropertiesInCssText(rule.propertyInfo.cssText,props);},function onKeyframesRule(rule){keyframes.push(rule);});styles._keyframes=keyframes;var names=[];for(var i in props){names.push(i);}
+return names;},decorateRule:function(rule){if(rule.propertyInfo){return rule.propertyInfo;}
+var info={},properties={};var hasProperties=this.collectProperties(rule,properties);if(hasProperties){info.properties=properties;rule.rules=null;}
+info.cssText=this.collectCssText(rule);rule.propertyInfo=info;return info;},collectProperties:function(rule,properties){var info=rule.propertyInfo;if(info){if(info.properties){Polymer.Base.mixin(properties,info.properties);return true;}}else{var m,rx=this.rx.VAR_ASSIGN;var cssText=rule.parsedCssText;var value;var any;while(m=rx.exec(cssText)){value=(m[2]||m[3]).trim();if(value!=='inherit'){properties[m[1].trim()]=value;}
+any=true;}
+return any;}},collectCssText:function(rule){return this.collectConsumingCssText(rule.parsedCssText);},collectConsumingCssText:function(cssText){return cssText.replace(this.rx.BRACKETED,'').replace(this.rx.VAR_ASSIGN,'');},collectPropertiesInCssText:function(cssText,props){var m;while(m=this.rx.VAR_CONSUMED.exec(cssText)){var name=m[1];if(m[2]!==':'){props[name]=true;}}},reify:function(props){var names=Object.getOwnPropertyNames(props);for(var i=0,n;i<names.length;i++){n=names[i];props[n]=this.valueForProperty(props[n],props);}},valueForProperty:function(property,props){if(property){if(property.indexOf(';')>=0){property=this.valueForProperties(property,props);}else{var self=this;var fn=function(prefix,value,fallback,suffix){var propertyValue=self.valueForProperty(props[value],props);if(!propertyValue||propertyValue==='initial'){propertyValue=self.valueForProperty(props[fallback]||fallback,props)||fallback;}else if(propertyValue==='apply-shim-inherit'){propertyValue='inherit';}
+return prefix+(propertyValue||'')+suffix;};property=styleUtil.processVariableAndFallback(property,fn);}}
+return property&&property.trim()||'';},valueForProperties:function(property,props){var parts=property.split(';');for(var i=0,p,m;i<parts.length;i++){if(p=parts[i]){this.rx.MIXIN_MATCH.lastIndex=0;m=this.rx.MIXIN_MATCH.exec(p);if(m){p=this.valueForProperty(props[m[1]],props);}else{var colon=p.indexOf(':');if(colon!==-1){var pp=p.substring(colon);pp=pp.trim();pp=this.valueForProperty(pp,props)||pp;p=p.substring(0,colon)+pp;}}
+parts[i]=p&&p.lastIndexOf(';')===p.length-1?p.slice(0,-1):p||'';}}
+return parts.join(';');},applyProperties:function(rule,props){var output='';if(!rule.propertyInfo){this.decorateRule(rule);}
+if(rule.propertyInfo.cssText){output=this.valueForProperties(rule.propertyInfo.cssText,props);}
+rule.cssText=output;},applyKeyframeTransforms:function(rule,keyframeTransforms){var input=rule.cssText;var output=rule.cssText;if(rule.hasAnimations==null){rule.hasAnimations=this.rx.ANIMATION_MATCH.test(input);}
+if(rule.hasAnimations){var transform;if(rule.keyframeNamesToTransform==null){rule.keyframeNamesToTransform=[];for(var keyframe in keyframeTransforms){transform=keyframeTransforms[keyframe];output=transform(input);if(input!==output){input=output;rule.keyframeNamesToTransform.push(keyframe);}}}else{for(var i=0;i<rule.keyframeNamesToTransform.length;++i){transform=keyframeTransforms[rule.keyframeNamesToTransform[i]];input=transform(input);}
+output=input;}}
+rule.cssText=output;},propertyDataFromStyles:function(styles,element){var props={},self=this;var o=[];styleUtil.forActiveRulesInStyles(styles,function(rule){if(!rule.propertyInfo){self.decorateRule(rule);}
+var selectorToMatch=rule.transformedSelector||rule.parsedSelector;if(element&&rule.propertyInfo.properties&&selectorToMatch){if(matchesSelector.call(element,selectorToMatch)){self.collectProperties(rule,props);addToBitMask(rule.index,o);}}});return{properties:props,key:o};},_rootSelector:/:root|:host\s*>\s*\*/,_checkRoot:function(hostScope,selector){return Boolean(selector.match(this._rootSelector))||hostScope==='html'&&selector.indexOf('html')>-1;},whenHostOrRootRule:function(scope,rule,style,callback){if(!rule.propertyInfo){self.decorateRule(rule);}
+if(!rule.propertyInfo.properties){return;}
+var hostScope=scope.is?styleTransformer._calcHostScope(scope.is,scope.extends):'html';var parsedSelector=rule.parsedSelector;var isRoot=this._checkRoot(hostScope,parsedSelector);var isHost=!isRoot&&parsedSelector.indexOf(':host')===0;var cssBuild=scope.__cssBuild||style.__cssBuild;if(cssBuild==='shady'){isRoot=parsedSelector===hostScope+' > *.'+hostScope||parsedSelector.indexOf('html')>-1;isHost=!isRoot&&parsedSelector.indexOf(hostScope)===0;}
+if(!isRoot&&!isHost){return;}
+var selectorToMatch=hostScope;if(isHost){if(settings.useNativeShadow&&!rule.transformedSelector){rule.transformedSelector=styleTransformer._transformRuleCss(rule,styleTransformer._transformComplexSelector,scope.is,hostScope);}
+selectorToMatch=rule.transformedSelector||rule.parsedSelector;}
+if(isRoot&&hostScope==='html'){selectorToMatch=rule.transformedSelector||rule.parsedSelector;}
+callback({selector:selectorToMatch,isHost:isHost,isRoot:isRoot});},hostAndRootPropertiesForScope:function(scope){var hostProps={},rootProps={},self=this;styleUtil.forActiveRulesInStyles(scope._styles,function(rule,style){self.whenHostOrRootRule(scope,rule,style,function(info){var element=scope._element||scope;if(matchesSelector.call(element,info.selector)){if(info.isHost){self.collectProperties(rule,hostProps);}else{self.collectProperties(rule,rootProps);}}});});return{rootProps:rootProps,hostProps:hostProps};},transformStyles:function(element,properties,scopeSelector){var self=this;var hostSelector=styleTransformer._calcHostScope(element.is,element.extends);var rxHostSelector=element.extends?'\\'+hostSelector.slice(0,-1)+'\\]':hostSelector;var hostRx=new RegExp(this.rx.HOST_PREFIX+rxHostSelector+this.rx.HOST_SUFFIX);var keyframeTransforms=this._elementKeyframeTransforms(element,scopeSelector);return styleTransformer.elementStyles(element,function(rule){self.applyProperties(rule,properties);if(!settings.useNativeShadow&&!Polymer.StyleUtil.isKeyframesSelector(rule)&&rule.cssText){self.applyKeyframeTransforms(rule,keyframeTransforms);self._scopeSelector(rule,hostRx,hostSelector,element._scopeCssViaAttr,scopeSelector);}});},_elementKeyframeTransforms:function(element,scopeSelector){var keyframesRules=element._styles._keyframes;var keyframeTransforms={};if(!settings.useNativeShadow&&keyframesRules){for(var i=0,keyframesRule=keyframesRules[i];i<keyframesRules.length;keyframesRule=keyframesRules[++i]){this._scopeKeyframes(keyframesRule,scopeSelector);keyframeTransforms[keyframesRule.keyframesName]=this._keyframesRuleTransformer(keyframesRule);}}
+return keyframeTransforms;},_keyframesRuleTransformer:function(keyframesRule){return function(cssText){return cssText.replace(keyframesRule.keyframesNameRx,keyframesRule.transformedKeyframesName);};},_scopeKeyframes:function(rule,scopeId){rule.keyframesNameRx=new RegExp(rule.keyframesName,'g');rule.transformedKeyframesName=rule.keyframesName+'-'+scopeId;rule.transformedSelector=rule.transformedSelector||rule.selector;rule.selector=rule.transformedSelector.replace(rule.keyframesName,rule.transformedKeyframesName);},_scopeSelector:function(rule,hostRx,hostSelector,viaAttr,scopeId){rule.transformedSelector=rule.transformedSelector||rule.selector;var selector=rule.transformedSelector;var scope=viaAttr?'['+styleTransformer.SCOPE_NAME+'~='+scopeId+']':'.'+scopeId;var parts=selector.split(',');for(var i=0,l=parts.length,p;i<l&&(p=parts[i]);i++){parts[i]=p.match(hostRx)?p.replace(hostSelector,scope):scope+' '+p;}
+rule.selector=parts.join(',');},applyElementScopeSelector:function(element,selector,old,viaAttr){var c=viaAttr?element.getAttribute(styleTransformer.SCOPE_NAME):element.getAttribute('class')||'';var v=old?c.replace(old,selector):(c?c+' ':'')+this.XSCOPE_NAME+' '+selector;if(c!==v){if(viaAttr){element.setAttribute(styleTransformer.SCOPE_NAME,v);}else{element.setAttribute('class',v);}}},applyElementStyle:function(element,properties,selector,style){var cssText=style?style.textContent||'':this.transformStyles(element,properties,selector);var s=element._customStyle;if(s&&!settings.useNativeShadow&&s!==style){s._useCount--;if(s._useCount<=0&&s.parentNode){s.parentNode.removeChild(s);}}
+if(settings.useNativeShadow){if(element._customStyle){element._customStyle.textContent=cssText;style=element._customStyle;}else if(cssText){style=styleUtil.applyCss(cssText,selector,element.root,element._scopeStyle);}}else{if(!style){if(cssText){style=styleUtil.applyCss(cssText,selector,null,element._scopeStyle);}}else if(!style.parentNode){if(IS_IE&&cssText.indexOf('@media')>-1){style.textContent=cssText;}
+styleUtil.applyStyle(style,null,element._scopeStyle);}}
+if(style){style._useCount=style._useCount||0;if(element._customStyle!=style){style._useCount++;}
+element._customStyle=style;}
+return style;},mixinCustomStyle:function(props,customStyle){var v;for(var i in customStyle){v=customStyle[i];if(v||v===0){props[i]=v;}}},updateNativeStyleProperties:function(element,properties){var oldPropertyNames=element.__customStyleProperties;if(oldPropertyNames){for(var i=0;i<oldPropertyNames.length;i++){element.style.removeProperty(oldPropertyNames[i]);}}
+var propertyNames=[];for(var p in properties){if(properties[p]!==null){element.style.setProperty(p,properties[p]);propertyNames.push(p);}}
+element.__customStyleProperties=propertyNames;},rx:styleUtil.rx,XSCOPE_NAME:'x-scope'};function addToBitMask(n,bits){var o=parseInt(n/32);var v=1<<n%32;bits[o]=(bits[o]||0)|v;}}();(function(){Polymer.StyleCache=function(){this.cache={};};Polymer.StyleCache.prototype={MAX:100,store:function(is,data,keyValues,keyStyles){data.keyValues=keyValues;data.styles=keyStyles;var s$=this.cache[is]=this.cache[is]||[];s$.push(data);if(s$.length>this.MAX){s$.shift();}},retrieve:function(is,keyValues,keyStyles){var cache=this.cache[is];if(cache){for(var i=cache.length-1,data;i>=0;i--){data=cache[i];if(keyStyles===data.styles&&this._objectsEqual(keyValues,data.keyValues)){return data;}}}},clear:function(){this.cache={};},_objectsEqual:function(target,source){var t,s;for(var i in target){t=target[i],s=source[i];if(!(typeof t==='object'&&t?this._objectsStrictlyEqual(t,s):t===s)){return false;}}
+if(Array.isArray(target)){return target.length===source.length;}
+return true;},_objectsStrictlyEqual:function(target,source){return this._objectsEqual(target,source)&&this._objectsEqual(source,target);}};}());Polymer.StyleDefaults=function(){var styleProperties=Polymer.StyleProperties;var StyleCache=Polymer.StyleCache;var nativeVariables=Polymer.Settings.useNativeCSSProperties;var api={_styles:[],_properties:null,customStyle:{},_styleCache:new StyleCache(),_element:Polymer.DomApi.wrap(document.documentElement),addStyle:function(style){this._styles.push(style);this._properties=null;},get _styleProperties(){if(!this._properties){styleProperties.decorateStyles(this._styles,this);this._styles._scopeStyleProperties=null;this._properties=styleProperties.hostAndRootPropertiesForScope(this).rootProps;styleProperties.mixinCustomStyle(this._properties,this.customStyle);styleProperties.reify(this._properties);}
+return this._properties;},hasStyleProperties:function(){return Boolean(this._properties);},_needsStyleProperties:function(){},_computeStyleProperties:function(){return this._styleProperties;},updateStyles:function(properties){this._properties=null;if(properties){Polymer.Base.mixin(this.customStyle,properties);}
+this._styleCache.clear();for(var i=0,s;i<this._styles.length;i++){s=this._styles[i];s=s.__importElement||s;s._apply();}
+if(nativeVariables){styleProperties.updateNativeStyleProperties(document.documentElement,this.customStyle);}}};return api;}();(function(){'use strict';var serializeValueToAttribute=Polymer.Base.serializeValueToAttribute;var propertyUtils=Polymer.StyleProperties;var styleTransformer=Polymer.StyleTransformer;var styleDefaults=Polymer.StyleDefaults;var nativeShadow=Polymer.Settings.useNativeShadow;var nativeVariables=Polymer.Settings.useNativeCSSProperties;Polymer.Base._addFeature({_prepStyleProperties:function(){if(!nativeVariables){this._ownStylePropertyNames=this._styles&&this._styles.length?propertyUtils.decorateStyles(this._styles,this):null;}},customStyle:null,getComputedStyleValue:function(property){if(!nativeVariables&&!this._styleProperties){this._computeStyleProperties();}
+return!nativeVariables&&this._styleProperties&&this._styleProperties[property]||getComputedStyle(this).getPropertyValue(property);},_setupStyleProperties:function(){this.customStyle={};this._styleCache=null;this._styleProperties=null;this._scopeSelector=null;this._ownStyleProperties=null;this._customStyle=null;},_needsStyleProperties:function(){return Boolean(!nativeVariables&&this._ownStylePropertyNames&&this._ownStylePropertyNames.length);},_validateApplyShim:function(){if(this.__applyShimInvalid){Polymer.ApplyShim.transform(this._styles,this.__proto__);var cssText=styleTransformer.elementStyles(this);if(nativeShadow){var templateStyle=this._template.content.querySelector('style');if(templateStyle){templateStyle.textContent=cssText;}}else{var shadyStyle=this._scopeStyle&&this._scopeStyle.nextSibling;if(shadyStyle){shadyStyle.textContent=cssText;}}}},_beforeAttached:function(){if((!this._scopeSelector||this.__stylePropertiesInvalid)&&this._needsStyleProperties()){this.__stylePropertiesInvalid=false;this._updateStyleProperties();}},_findStyleHost:function(){var e=this,root;while(root=Polymer.dom(e).getOwnerRoot()){if(Polymer.isInstance(root.host)){return root.host;}
+e=root.host;}
+return styleDefaults;},_updateStyleProperties:function(){var info,scope=this._findStyleHost();if(!scope._styleProperties){scope._computeStyleProperties();}
+if(!scope._styleCache){scope._styleCache=new Polymer.StyleCache();}
+var scopeData=propertyUtils.propertyDataFromStyles(scope._styles,this);var scopeCacheable=!this.__notStyleScopeCacheable;if(scopeCacheable){scopeData.key.customStyle=this.customStyle;info=scope._styleCache.retrieve(this.is,scopeData.key,this._styles);}
+var scopeCached=Boolean(info);if(scopeCached){this._styleProperties=info._styleProperties;}else{this._computeStyleProperties(scopeData.properties);}
+this._computeOwnStyleProperties();if(!scopeCached){info=styleCache.retrieve(this.is,this._ownStyleProperties,this._styles);}
+var globalCached=Boolean(info)&&!scopeCached;var style=this._applyStyleProperties(info);if(!scopeCached){style=style&&nativeShadow?style.cloneNode(true):style;info={style:style,_scopeSelector:this._scopeSelector,_styleProperties:this._styleProperties};if(scopeCacheable){scopeData.key.customStyle={};this.mixin(scopeData.key.customStyle,this.customStyle);scope._styleCache.store(this.is,info,scopeData.key,this._styles);}
+if(!globalCached){styleCache.store(this.is,Object.create(info),this._ownStyleProperties,this._styles);}}},_computeStyleProperties:function(scopeProps){var scope=this._findStyleHost();if(!scope._styleProperties){scope._computeStyleProperties();}
+var props=Object.create(scope._styleProperties);var hostAndRootProps=propertyUtils.hostAndRootPropertiesForScope(this);this.mixin(props,hostAndRootProps.hostProps);scopeProps=scopeProps||propertyUtils.propertyDataFromStyles(scope._styles,this).properties;this.mixin(props,scopeProps);this.mixin(props,hostAndRootProps.rootProps);propertyUtils.mixinCustomStyle(props,this.customStyle);propertyUtils.reify(props);this._styleProperties=props;},_computeOwnStyleProperties:function(){var props={};for(var i=0,n;i<this._ownStylePropertyNames.length;i++){n=this._ownStylePropertyNames[i];props[n]=this._styleProperties[n];}
+this._ownStyleProperties=props;},_scopeCount:0,_applyStyleProperties:function(info){var oldScopeSelector=this._scopeSelector;this._scopeSelector=info?info._scopeSelector:this.is+'-'+this.__proto__._scopeCount++;var style=propertyUtils.applyElementStyle(this,this._styleProperties,this._scopeSelector,info&&info.style);if(!nativeShadow){propertyUtils.applyElementScopeSelector(this,this._scopeSelector,oldScopeSelector,this._scopeCssViaAttr);}
+return style;},serializeValueToAttribute:function(value,attribute,node){node=node||this;if(attribute==='class'&&!nativeShadow){var host=node===this?this.domHost||this.dataHost:this;if(host){value=host._scopeElementClass(node,value);}}
+node=this.shadyRoot&&this.shadyRoot._hasDistributed?Polymer.dom(node):node;serializeValueToAttribute.call(this,value,attribute,node);},_scopeElementClass:function(element,selector){if(!nativeShadow&&!this._scopeCssViaAttr){selector=(selector?selector+' ':'')+SCOPE_NAME+' '+this.is+(element._scopeSelector?' '+XSCOPE_NAME+' '+element._scopeSelector:'');}
+return selector;},updateStyles:function(properties){if(properties){this.mixin(this.customStyle,properties);}
+if(nativeVariables){propertyUtils.updateNativeStyleProperties(this,this.customStyle);}else{if(this.isAttached){if(this._needsStyleProperties()){this._updateStyleProperties();}else{this._styleProperties=null;}}else{this.__stylePropertiesInvalid=true;}
+if(this._styleCache){this._styleCache.clear();}
+this._updateRootStyles();}},_updateRootStyles:function(root){root=root||this.root;var c$=Polymer.dom(root)._query(function(e){return e.shadyRoot||e.shadowRoot;});for(var i=0,l=c$.length,c;i<l&&(c=c$[i]);i++){if(c.updateStyles){c.updateStyles();}}}});Polymer.updateStyles=function(properties){styleDefaults.updateStyles(properties);Polymer.Base._updateRootStyles(document);};var styleCache=new Polymer.StyleCache();Polymer.customStyleCache=styleCache;var SCOPE_NAME=styleTransformer.SCOPE_NAME;var XSCOPE_NAME=propertyUtils.XSCOPE_NAME;}());Polymer.Base._addFeature({_registerFeatures:function(){this._prepIs();if(this.factoryImpl){this._prepConstructor();}
+this._prepStyles();},_finishRegisterFeatures:function(){this._prepTemplate();this._prepShimStyles();this._prepAnnotations();this._prepEffects();this._prepBehaviors();this._prepPropertyInfo();this._prepBindings();this._prepShady();},_prepBehavior:function(b){this._addPropertyEffects(b.properties);this._addComplexObserverEffects(b.observers);this._addHostAttributes(b.hostAttributes);},_initFeatures:function(){this._setupGestures();this._setupConfigure(this.__data__);this._setupStyleProperties();this._setupDebouncers();this._setupShady();this._registerHost();if(this._template){this._validateApplyShim();this._poolContent();this._beginHosting();this._stampTemplate();this._endHosting();this._marshalAnnotationReferences();}
+this._marshalInstanceEffects();this._marshalBehaviors();this._marshalHostAttributes();this._marshalAttributes();this._tryReady();},_marshalBehavior:function(b){if(b.listeners){this._listenListeners(b.listeners);}}});(function(){var propertyUtils=Polymer.StyleProperties;var styleUtil=Polymer.StyleUtil;var cssParse=Polymer.CssParse;var styleDefaults=Polymer.StyleDefaults;var styleTransformer=Polymer.StyleTransformer;var applyShim=Polymer.ApplyShim;var debounce=Polymer.Debounce;var settings=Polymer.Settings;var updateDebouncer;Polymer({is:'custom-style',extends:'style',_template:null,properties:{include:String},ready:function(){this.__appliedElement=this.__appliedElement||this;this.__cssBuild=styleUtil.getCssBuildType(this);if(this.__appliedElement!==this){this.__appliedElement.__cssBuild=this.__cssBuild;}
+this._tryApply();},attached:function(){this._tryApply();},_tryApply:function(){if(!this._appliesToDocument){if(this.parentNode&&this.parentNode.localName!=='dom-module'){this._appliesToDocument=true;var e=this.__appliedElement;if(!settings.useNativeCSSProperties){this.__needsUpdateStyles=styleDefaults.hasStyleProperties();styleDefaults.addStyle(e);}
+if(e.textContent||this.include){this._apply(true);}else{var self=this;var observer=new MutationObserver(function(){observer.disconnect();self._apply(true);});observer.observe(e,{childList:true});}}}},_updateStyles:function(){Polymer.updateStyles();},_apply:function(initialApply){var e=this.__appliedElement;if(this.include){e.textContent=styleUtil.cssFromModules(this.include,true)+e.textContent;}
+if(!e.textContent){return;}
+var buildType=this.__cssBuild;var targetedBuild=styleUtil.isTargetedBuild(buildType);if(settings.useNativeCSSProperties&&targetedBuild){return;}
+var styleRules=styleUtil.rulesForStyle(e);if(!targetedBuild){styleUtil.forEachRule(styleRules,function(rule){styleTransformer.documentRule(rule);});if(settings.useNativeCSSProperties&&!buildType){applyShim.transform([e]);}}
+if(settings.useNativeCSSProperties){e.textContent=styleUtil.toCssText(styleRules);}else{var self=this;var fn=function fn(){self._flushCustomProperties();};if(initialApply){Polymer.RenderStatus.whenReady(fn);}else{fn();}}},_flushCustomProperties:function(){if(this.__needsUpdateStyles){this.__needsUpdateStyles=false;updateDebouncer=debounce(updateDebouncer,this._updateStyles);}else{this._applyCustomProperties();}},_applyCustomProperties:function(){var element=this.__appliedElement;this._computeStyleProperties();var props=this._styleProperties;var rules=styleUtil.rulesForStyle(element);if(!rules){return;}
+element.textContent=styleUtil.toCssText(rules,function(rule){var css=rule.cssText=rule.parsedCssText;if(rule.propertyInfo&&rule.propertyInfo.cssText){css=cssParse.removeCustomPropAssignment(css);rule.cssText=propertyUtils.valueForProperties(css,props);}});}});}());Polymer.Templatizer={properties:{__hideTemplateChildren__:{observer:'_showHideChildren'}},_instanceProps:Polymer.nob,_parentPropPrefix:'_parent_',templatize:function(template){this._templatized=template;if(!template._content){template._content=template.content;}
+if(template._content._ctor){this.ctor=template._content._ctor;this._prepParentProperties(this.ctor.prototype,template);return;}
+var archetype=Object.create(Polymer.Base);this._customPrepAnnotations(archetype,template);this._prepParentProperties(archetype,template);archetype._prepEffects();this._customPrepEffects(archetype);archetype._prepBehaviors();archetype._prepPropertyInfo();archetype._prepBindings();archetype._notifyPathUp=this._notifyPathUpImpl;archetype._scopeElementClass=this._scopeElementClassImpl;archetype.listen=this._listenImpl;archetype._showHideChildren=this._showHideChildrenImpl;archetype.__setPropertyOrig=this.__setProperty;archetype.__setProperty=this.__setPropertyImpl;var _constructor=this._constructorImpl;var ctor=function TemplateInstance(model,host){_constructor.call(this,model,host);};ctor.prototype=archetype;archetype.constructor=ctor;template._content._ctor=ctor;this.ctor=ctor;},_getRootDataHost:function(){return this.dataHost&&this.dataHost._rootDataHost||this.dataHost;},_showHideChildrenImpl:function(hide){var c=this._children;for(var i=0;i<c.length;i++){var n=c[i];if(Boolean(hide)!=Boolean(n.__hideTemplateChildren__)){if(n.nodeType===Node.TEXT_NODE){if(hide){n.__polymerTextContent__=n.textContent;n.textContent='';}else{n.textContent=n.__polymerTextContent__;}}else if(n.style){if(hide){n.__polymerDisplay__=n.style.display;n.style.display='none';}else{n.style.display=n.__polymerDisplay__;}}}
+n.__hideTemplateChildren__=hide;}},__setPropertyImpl:function(property,value,fromAbove,node){if(node&&node.__hideTemplateChildren__&&property=='textContent'){property='__polymerTextContent__';}
+this.__setPropertyOrig(property,value,fromAbove,node);},_debounceTemplate:function(fn){Polymer.dom.addDebouncer(this.debounce('_debounceTemplate',fn));},_flushTemplates:function(){Polymer.dom.flush();},_customPrepEffects:function(archetype){var parentProps=archetype._parentProps;for(var prop in parentProps){archetype._addPropertyEffect(prop,'function',this._createHostPropEffector(prop));}
+for(prop in this._instanceProps){archetype._addPropertyEffect(prop,'function',this._createInstancePropEffector(prop));}},_customPrepAnnotations:function(archetype,template){archetype._template=template;var c=template._content;if(!c._notes){var rootDataHost=archetype._rootDataHost;if(rootDataHost){Polymer.Annotations.prepElement=function(){rootDataHost._prepElement();};}
+c._notes=Polymer.Annotations.parseAnnotations(template);Polymer.Annotations.prepElement=null;this._processAnnotations(c._notes);}
+archetype._notes=c._notes;archetype._parentProps=c._parentProps;},_prepParentProperties:function(archetype,template){var parentProps=this._parentProps=archetype._parentProps;if(this._forwardParentProp&&parentProps){var proto=archetype._parentPropProto;var prop;if(!proto){for(prop in this._instanceProps){delete parentProps[prop];}
+proto=archetype._parentPropProto=Object.create(null);if(template!=this){Polymer.Bind.prepareModel(proto);Polymer.Base.prepareModelNotifyPath(proto);}
+for(prop in parentProps){var parentProp=this._parentPropPrefix+prop;var effects=[{kind:'function',effect:this._createForwardPropEffector(prop),fn:Polymer.Bind._functionEffect},{kind:'notify',fn:Polymer.Bind._notifyEffect,effect:{event:Polymer.CaseMap.camelToDashCase(parentProp)+'-changed'}}];proto._propertyEffects=proto._propertyEffects||{};proto._propertyEffects[parentProp]=effects;Polymer.Bind._createAccessors(proto,parentProp,effects);}}
+var self=this;if(template!=this){Polymer.Bind.prepareInstance(template);template._forwardParentProp=function(source,value){self._forwardParentProp(source,value);};}
+this._extendTemplate(template,proto);template._pathEffector=function(path,value,fromAbove){return self._pathEffectorImpl(path,value,fromAbove);};}},_createForwardPropEffector:function(prop){return function(source,value){this._forwardParentProp(prop,value);};},_createHostPropEffector:function(prop){var prefix=this._parentPropPrefix;return function(source,value){this.dataHost._templatized[prefix+prop]=value;};},_createInstancePropEffector:function(prop){return function(source,value,old,fromAbove){if(!fromAbove){this.dataHost._forwardInstanceProp(this,prop,value);}};},_extendTemplate:function(template,proto){var n$=Object.getOwnPropertyNames(proto);if(proto._propertySetter){template._propertySetter=proto._propertySetter;}
+for(var i=0,n;i<n$.length&&(n=n$[i]);i++){var val=template[n];if(val&&n=='_propertyEffects'){var pe=Polymer.Base.mixin({},val);template._propertyEffects=Polymer.Base.mixin(pe,proto._propertyEffects);}else{var pd=Object.getOwnPropertyDescriptor(proto,n);Object.defineProperty(template,n,pd);if(val!==undefined){template._propertySetter(n,val);}}}},_showHideChildren:function(hidden){},_forwardInstancePath:function(inst,path,value){},_forwardInstanceProp:function(inst,prop,value){},_notifyPathUpImpl:function(path,value){var dataHost=this.dataHost;var root=Polymer.Path.root(path);dataHost._forwardInstancePath.call(dataHost,this,path,value);if(root in dataHost._parentProps){dataHost._templatized._notifyPath(dataHost._parentPropPrefix+path,value);}},_pathEffectorImpl:function(path,value,fromAbove){if(this._forwardParentPath){if(path.indexOf(this._parentPropPrefix)===0){var subPath=path.substring(this._parentPropPrefix.length);var model=Polymer.Path.root(subPath);if(model in this._parentProps){this._forwardParentPath(subPath,value);}}}
+Polymer.Base._pathEffector.call(this._templatized,path,value,fromAbove);},_constructorImpl:function(model,host){this._rootDataHost=host._getRootDataHost();this._setupConfigure(model);this._registerHost(host);this._beginHosting();this.root=this.instanceTemplate(this._template);this.root.__noContent=!this._notes._hasContent;this.root.__styleScoped=true;this._endHosting();this._marshalAnnotatedNodes();this._marshalInstanceEffects();this._marshalAnnotatedListeners();var children=[];for(var n=this.root.firstChild;n;n=n.nextSibling){children.push(n);n._templateInstance=this;}
+this._children=children;if(host.__hideTemplateChildren__){this._showHideChildren(true);}
+this._tryReady();},_listenImpl:function(node,eventName,methodName){var model=this;var host=this._rootDataHost;var handler=host._createEventHandler(node,eventName,methodName);var decorated=function(e){e.model=model;handler(e);};host._listen(node,eventName,decorated);},_scopeElementClassImpl:function(node,value){var host=this._rootDataHost;if(host){return host._scopeElementClass(node,value);}
+return value;},stamp:function(model){model=model||{};if(this._parentProps){var templatized=this._templatized;for(var prop in this._parentProps){if(model[prop]===undefined){model[prop]=templatized[this._parentPropPrefix+prop];}}}
+return new this.ctor(model,this);},modelForElement:function(el){var model;while(el){if(model=el._templateInstance){if(model.dataHost!=this){el=model.dataHost;}else{return model;}}else{el=el.parentNode;}}}};Polymer({is:'dom-template',extends:'template',_template:null,behaviors:[Polymer.Templatizer],ready:function(){this.templatize(this);}});Polymer._collections=new WeakMap();Polymer.Collection=function(userArray){Polymer._collections.set(userArray,this);this.userArray=userArray;this.store=userArray.slice();this.initMap();};Polymer.Collection.prototype={constructor:Polymer.Collection,initMap:function(){var omap=this.omap=new WeakMap();var pmap=this.pmap={};var s=this.store;for(var i=0;i<s.length;i++){var item=s[i];if(item&&typeof item=='object'){omap.set(item,i);}else{pmap[item]=i;}}},add:function(item){var key=this.store.push(item)-1;if(item&&typeof item=='object'){this.omap.set(item,key);}else{this.pmap[item]=key;}
+return'#'+key;},removeKey:function(key){if(key=this._parseKey(key)){this._removeFromMap(this.store[key]);delete this.store[key];}},_removeFromMap:function(item){if(item&&typeof item=='object'){this.omap.delete(item);}else{delete this.pmap[item];}},remove:function(item){var key=this.getKey(item);this.removeKey(key);return key;},getKey:function(item){var key;if(item&&typeof item=='object'){key=this.omap.get(item);}else{key=this.pmap[item];}
+if(key!=undefined){return'#'+key;}},getKeys:function(){return Object.keys(this.store).map(function(key){return'#'+key;});},_parseKey:function(key){if(key&&key[0]=='#'){return key.slice(1);}},setItem:function(key,item){if(key=this._parseKey(key)){var old=this.store[key];if(old){this._removeFromMap(old);}
+if(item&&typeof item=='object'){this.omap.set(item,key);}else{this.pmap[item]=key;}
+this.store[key]=item;}},getItem:function(key){if(key=this._parseKey(key)){return this.store[key];}},getItems:function(){var items=[],store=this.store;for(var key in store){items.push(store[key]);}
+return items;},_applySplices:function(splices){var keyMap={},key;for(var i=0,s;i<splices.length&&(s=splices[i]);i++){s.addedKeys=[];for(var j=0;j<s.removed.length;j++){key=this.getKey(s.removed[j]);keyMap[key]=keyMap[key]?null:-1;}
+for(j=0;j<s.addedCount;j++){var item=this.userArray[s.index+j];key=this.getKey(item);key=key===undefined?this.add(item):key;keyMap[key]=keyMap[key]?null:1;s.addedKeys.push(key);}}
+var removed=[];var added=[];for(key in keyMap){if(keyMap[key]<0){this.removeKey(key);removed.push(key);}
+if(keyMap[key]>0){added.push(key);}}
+return[{removed:removed,added:added}];}};Polymer.Collection.get=function(userArray){return Polymer._collections.get(userArray)||new Polymer.Collection(userArray);};Polymer.Collection.applySplices=function(userArray,splices){var coll=Polymer._collections.get(userArray);return coll?coll._applySplices(splices):null;};Polymer({is:'dom-repeat',extends:'template',_template:null,properties:{items:{type:Array},as:{type:String,value:'item'},indexAs:{type:String,value:'index'},sort:{type:Function,observer:'_sortChanged'},filter:{type:Function,observer:'_filterChanged'},observe:{type:String,observer:'_observeChanged'},delay:Number,renderedItemCount:{type:Number,notify:!Polymer.Settings.suppressTemplateNotifications,readOnly:true},initialCount:{type:Number,observer:'_initializeChunking'},targetFramerate:{type:Number,value:20},notifyDomChange:{type:Boolean},_targetFrameTime:{type:Number,computed:'_computeFrameTime(targetFramerate)'}},behaviors:[Polymer.Templatizer],observers:['_itemsChanged(items.*)'],created:function(){this._instances=[];this._pool=[];this._limit=Infinity;var self=this;this._boundRenderChunk=function(){self._renderChunk();};},detached:function(){this.__isDetached=true;for(var i=0;i<this._instances.length;i++){this._detachInstance(i);}},attached:function(){if(this.__isDetached){this.__isDetached=false;var parent=Polymer.dom(Polymer.dom(this).parentNode);for(var i=0;i<this._instances.length;i++){this._attachInstance(i,parent);}}},ready:function(){this._instanceProps={__key__:true};this._instanceProps[this.as]=true;this._instanceProps[this.indexAs]=true;if(!this.ctor){this.templatize(this);}},_sortChanged:function(sort){var dataHost=this._getRootDataHost();this._sortFn=sort&&(typeof sort=='function'?sort:function(){return dataHost[sort].apply(dataHost,arguments);});this._needFullRefresh=true;if(this.items){this._debounceTemplate(this._render);}},_filterChanged:function(filter){var dataHost=this._getRootDataHost();this._filterFn=filter&&(typeof filter=='function'?filter:function(){return dataHost[filter].apply(dataHost,arguments);});this._needFullRefresh=true;if(this.items){this._debounceTemplate(this._render);}},_computeFrameTime:function(rate){return Math.ceil(1000/rate);},_initializeChunking:function(){if(this.initialCount){this._limit=this.initialCount;this._chunkCount=this.initialCount;this._lastChunkTime=performance.now();}},_tryRenderChunk:function(){if(this.items&&this._limit<this.items.length){this.debounce('renderChunk',this._requestRenderChunk);}},_requestRenderChunk:function(){requestAnimationFrame(this._boundRenderChunk);},_renderChunk:function(){var currChunkTime=performance.now();var ratio=this._targetFrameTime/(currChunkTime-this._lastChunkTime);this._chunkCount=Math.round(this._chunkCount*ratio)||1;this._limit+=this._chunkCount;this._lastChunkTime=currChunkTime;this._debounceTemplate(this._render);},_observeChanged:function(){this._observePaths=this.observe&&this.observe.replace('.*','.').split(' ');},_itemsChanged:function(change){if(change.path=='items'){if(Array.isArray(this.items)){this.collection=Polymer.Collection.get(this.items);}else if(!this.items){this.collection=null;}else{this._error(this._logf('dom-repeat','expected array for `items`,'+' found',this.items));}
+this._keySplices=[];this._indexSplices=[];this._needFullRefresh=true;this._initializeChunking();this._debounceTemplate(this._render);}else if(change.path=='items.splices'){this._keySplices=this._keySplices.concat(change.value.keySplices);this._indexSplices=this._indexSplices.concat(change.value.indexSplices);this._debounceTemplate(this._render);}else{var subpath=change.path.slice(6);this._forwardItemPath(subpath,change.value);this._checkObservedPaths(subpath);}},_checkObservedPaths:function(path){if(this._observePaths){path=path.substring(path.indexOf('.')+1);var paths=this._observePaths;for(var i=0;i<paths.length;i++){if(path.indexOf(paths[i])===0){this._needFullRefresh=true;if(this.delay){this.debounce('render',this._render,this.delay);}else{this._debounceTemplate(this._render);}
+return;}}}},render:function(){this._needFullRefresh=true;this._debounceTemplate(this._render);this._flushTemplates();},_render:function(){if(this._needFullRefresh){this._applyFullRefresh();this._needFullRefresh=false;}else if(this._keySplices.length){if(this._sortFn){this._applySplicesUserSort(this._keySplices);}else{if(this._filterFn){this._applyFullRefresh();}else{this._applySplicesArrayOrder(this._indexSplices);}}}else{}
+this._keySplices=[];this._indexSplices=[];var keyToIdx=this._keyToInstIdx={};for(var i=this._instances.length-1;i>=0;i--){var inst=this._instances[i];if(inst.isPlaceholder&&i<this._limit){inst=this._insertInstance(i,inst.__key__);}else if(!inst.isPlaceholder&&i>=this._limit){inst=this._downgradeInstance(i,inst.__key__);}
+keyToIdx[inst.__key__]=i;if(!inst.isPlaceholder){inst.__setProperty(this.indexAs,i,true);}}
+this._pool.length=0;this._setRenderedItemCount(this._instances.length);if(!Polymer.Settings.suppressTemplateNotifications||this.notifyDomChange){this.fire('dom-change');}
+this._tryRenderChunk();},_applyFullRefresh:function(){var c=this.collection;var keys;if(this._sortFn){keys=c?c.getKeys():[];}else{keys=[];var items=this.items;if(items){for(var i=0;i<items.length;i++){keys.push(c.getKey(items[i]));}}}
+var self=this;if(this._filterFn){keys=keys.filter(function(a){return self._filterFn(c.getItem(a));});}
+if(this._sortFn){keys.sort(function(a,b){return self._sortFn(c.getItem(a),c.getItem(b));});}
+for(i=0;i<keys.length;i++){var key=keys[i];var inst=this._instances[i];if(inst){inst.__key__=key;if(!inst.isPlaceholder&&i<this._limit){inst.__setProperty(this.as,c.getItem(key),true);}}else if(i<this._limit){this._insertInstance(i,key);}else{this._insertPlaceholder(i,key);}}
+for(var j=this._instances.length-1;j>=i;j--){this._detachAndRemoveInstance(j);}},_numericSort:function(a,b){return a-b;},_applySplicesUserSort:function(splices){var c=this.collection;var keyMap={};var key;for(var i=0,s;i<splices.length&&(s=splices[i]);i++){for(var j=0;j<s.removed.length;j++){key=s.removed[j];keyMap[key]=keyMap[key]?null:-1;}
+for(j=0;j<s.added.length;j++){key=s.added[j];keyMap[key]=keyMap[key]?null:1;}}
+var removedIdxs=[];var addedKeys=[];for(key in keyMap){if(keyMap[key]===-1){removedIdxs.push(this._keyToInstIdx[key]);}
+if(keyMap[key]===1){addedKeys.push(key);}}
+if(removedIdxs.length){removedIdxs.sort(this._numericSort);for(i=removedIdxs.length-1;i>=0;i--){var idx=removedIdxs[i];if(idx!==undefined){this._detachAndRemoveInstance(idx);}}}
+var self=this;if(addedKeys.length){if(this._filterFn){addedKeys=addedKeys.filter(function(a){return self._filterFn(c.getItem(a));});}
+addedKeys.sort(function(a,b){return self._sortFn(c.getItem(a),c.getItem(b));});var start=0;for(i=0;i<addedKeys.length;i++){start=this._insertRowUserSort(start,addedKeys[i]);}}},_insertRowUserSort:function(start,key){var c=this.collection;var item=c.getItem(key);var end=this._instances.length-1;var idx=-1;while(start<=end){var mid=start+end>>1;var midKey=this._instances[mid].__key__;var cmp=this._sortFn(c.getItem(midKey),item);if(cmp<0){start=mid+1;}else if(cmp>0){end=mid-1;}else{idx=mid;break;}}
+if(idx<0){idx=end+1;}
+this._insertPlaceholder(idx,key);return idx;},_applySplicesArrayOrder:function(splices){for(var i=0,s;i<splices.length&&(s=splices[i]);i++){for(var j=0;j<s.removed.length;j++){this._detachAndRemoveInstance(s.index);}
+for(j=0;j<s.addedKeys.length;j++){this._insertPlaceholder(s.index+j,s.addedKeys[j]);}}},_detachInstance:function(idx){var inst=this._instances[idx];if(!inst.isPlaceholder){for(var i=0;i<inst._children.length;i++){var el=inst._children[i];Polymer.dom(inst.root).appendChild(el);}
+return inst;}},_attachInstance:function(idx,parent){var inst=this._instances[idx];if(!inst.isPlaceholder){parent.insertBefore(inst.root,this);}},_detachAndRemoveInstance:function(idx){var inst=this._detachInstance(idx);if(inst){this._pool.push(inst);}
+this._instances.splice(idx,1);},_insertPlaceholder:function(idx,key){this._instances.splice(idx,0,{isPlaceholder:true,__key__:key});},_stampInstance:function(idx,key){var model={__key__:key};model[this.as]=this.collection.getItem(key);model[this.indexAs]=idx;return this.stamp(model);},_insertInstance:function(idx,key){var inst=this._pool.pop();if(inst){inst.__setProperty(this.as,this.collection.getItem(key),true);inst.__setProperty('__key__',key,true);}else{inst=this._stampInstance(idx,key);}
+var beforeRow=this._instances[idx+1];var beforeNode=beforeRow&&!beforeRow.isPlaceholder?beforeRow._children[0]:this;var parentNode=Polymer.dom(this).parentNode;Polymer.dom(parentNode).insertBefore(inst.root,beforeNode);this._instances[idx]=inst;return inst;},_downgradeInstance:function(idx,key){var inst=this._detachInstance(idx);if(inst){this._pool.push(inst);}
+inst={isPlaceholder:true,__key__:key};this._instances[idx]=inst;return inst;},_showHideChildren:function(hidden){for(var i=0;i<this._instances.length;i++){if(!this._instances[i].isPlaceholder)
+this._instances[i]._showHideChildren(hidden);}},_forwardInstanceProp:function(inst,prop,value){if(prop==this.as){var idx;if(this._sortFn||this._filterFn){idx=this.items.indexOf(this.collection.getItem(inst.__key__));}else{idx=inst[this.indexAs];}
+this.set('items.'+idx,value);}},_forwardInstancePath:function(inst,path,value){if(path.indexOf(this.as+'.')===0){this._notifyPath('items.'+inst.__key__+'.'+path.slice(this.as.length+1),value);}},_forwardParentProp:function(prop,value){var i$=this._instances;for(var i=0,inst;i<i$.length&&(inst=i$[i]);i++){if(!inst.isPlaceholder){inst.__setProperty(prop,value,true);}}},_forwardParentPath:function(path,value){var i$=this._instances;for(var i=0,inst;i<i$.length&&(inst=i$[i]);i++){if(!inst.isPlaceholder){inst._notifyPath(path,value,true);}}},_forwardItemPath:function(path,value){if(this._keyToInstIdx){var dot=path.indexOf('.');var key=path.substring(0,dot<0?path.length:dot);var idx=this._keyToInstIdx[key];var inst=this._instances[idx];if(inst&&!inst.isPlaceholder){if(dot>=0){path=this.as+'.'+path.substring(dot+1);inst._notifyPath(path,value,true);}else{inst.__setProperty(this.as,value,true);}}}},itemForElement:function(el){var instance=this.modelForElement(el);return instance&&instance[this.as];},keyForElement:function(el){var instance=this.modelForElement(el);return instance&&instance.__key__;},indexForElement:function(el){var instance=this.modelForElement(el);return instance&&instance[this.indexAs];}});Polymer({is:'array-selector',_template:null,properties:{items:{type:Array,observer:'clearSelection'},multi:{type:Boolean,value:false,observer:'clearSelection'},selected:{type:Object,notify:true},selectedItem:{type:Object,notify:true},toggle:{type:Boolean,value:false}},clearSelection:function(){if(Array.isArray(this.selected)){for(var i=0;i<this.selected.length;i++){this.unlinkPaths('selected.'+i);}}else{this.unlinkPaths('selected');this.unlinkPaths('selectedItem');}
+if(this.multi){if(!this.selected||this.selected.length){this.selected=[];this._selectedColl=Polymer.Collection.get(this.selected);}}else{this.selected=null;this._selectedColl=null;}
+this.selectedItem=null;},isSelected:function(item){if(this.multi){return this._selectedColl.getKey(item)!==undefined;}else{return this.selected==item;}},deselect:function(item){if(this.multi){if(this.isSelected(item)){var skey=this._selectedColl.getKey(item);this.arrayDelete('selected',item);this.unlinkPaths('selected.'+skey);}}else{this.selected=null;this.selectedItem=null;this.unlinkPaths('selected');this.unlinkPaths('selectedItem');}},select:function(item){var icol=Polymer.Collection.get(this.items);var key=icol.getKey(item);if(this.multi){if(this.isSelected(item)){if(this.toggle){this.deselect(item);}}else{this.push('selected',item);var skey=this._selectedColl.getKey(item);this.linkPaths('selected.'+skey,'items.'+key);}}else{if(this.toggle&&item==this.selected){this.deselect();}else{this.selected=item;this.selectedItem=item;this.linkPaths('selected','items.'+key);this.linkPaths('selectedItem','items.'+key);}}}});Polymer({is:'dom-if',extends:'template',_template:null,properties:{'if':{type:Boolean,value:false,observer:'_queueRender'},restamp:{type:Boolean,value:false,observer:'_queueRender'},notifyDomChange:{type:Boolean}},behaviors:[Polymer.Templatizer],_queueRender:function(){this._debounceTemplate(this._render);},detached:function(){if(!this.parentNode||this.parentNode.nodeType==Node.DOCUMENT_FRAGMENT_NODE&&(!Polymer.Settings.hasShadow||!(this.parentNode instanceof ShadowRoot))){this._teardownInstance();}},attached:function(){if(this.if&&this.ctor){this.async(this._ensureInstance);}},render:function(){this._flushTemplates();},_render:function(){if(this.if){if(!this.ctor){this.templatize(this);}
+this._ensureInstance();this._showHideChildren();}else if(this.restamp){this._teardownInstance();}
+if(!this.restamp&&this._instance){this._showHideChildren();}
+if(this.if!=this._lastIf){if(!Polymer.Settings.suppressTemplateNotifications||this.notifyDomChange){this.fire('dom-change');}
+this._lastIf=this.if;}},_ensureInstance:function(){var parentNode=Polymer.dom(this).parentNode;if(parentNode){var parent=Polymer.dom(parentNode);if(!this._instance){this._instance=this.stamp();var root=this._instance.root;parent.insertBefore(root,this);}else{var c$=this._instance._children;if(c$&&c$.length){var lastChild=Polymer.dom(this).previousSibling;if(lastChild!==c$[c$.length-1]){for(var i=0,n;i<c$.length&&(n=c$[i]);i++){parent.insertBefore(n,this);}}}}}},_teardownInstance:function(){if(this._instance){var c$=this._instance._children;if(c$&&c$.length){var parent=Polymer.dom(Polymer.dom(c$[0]).parentNode);for(var i=0,n;i<c$.length&&(n=c$[i]);i++){parent.removeChild(n);}}
+this._instance=null;}},_showHideChildren:function(){var hidden=this.__hideTemplateChildren__||!this.if;if(this._instance){this._instance._showHideChildren(hidden);}},_forwardParentProp:function(prop,value){if(this._instance){this._instance.__setProperty(prop,value,true);}},_forwardParentPath:function(path,value){if(this._instance){this._instance._notifyPath(path,value,true);}}});Polymer({is:'dom-bind',properties:{notifyDomChange:{type:Boolean}},extends:'template',_template:null,created:function(){var self=this;Polymer.RenderStatus.whenReady(function(){if(document.readyState=='loading'){document.addEventListener('DOMContentLoaded',function(){self._markImportsReady();});}else{self._markImportsReady();}});},_ensureReady:function(){if(!this._readied){this._readySelf();}},_markImportsReady:function(){this._importsReady=true;this._ensureReady();},_registerFeatures:function(){this._prepConstructor();},_insertChildren:function(){var parentDom=Polymer.dom(Polymer.dom(this).parentNode);parentDom.insertBefore(this.root,this);},_removeChildren:function(){if(this._children){for(var i=0;i<this._children.length;i++){this.root.appendChild(this._children[i]);}}},_initFeatures:function(){},_scopeElementClass:function(element,selector){if(this.dataHost){return this.dataHost._scopeElementClass(element,selector);}else{return selector;}},_configureInstanceProperties:function(){},_prepConfigure:function(){var config={};for(var prop in this._propertyEffects){config[prop]=this[prop];}
+var setupConfigure=this._setupConfigure;this._setupConfigure=function(){setupConfigure.call(this,config);};},attached:function(){if(this._importsReady){this.render();}},detached:function(){this._removeChildren();},render:function(){this._ensureReady();if(!this._children){this._template=this;this._prepAnnotations();this._prepEffects();this._prepBehaviors();this._prepConfigure();this._prepBindings();this._prepPropertyInfo();Polymer.Base._initFeatures.call(this);this._children=Polymer.TreeApi.arrayCopyChildNodes(this.root);}
+this._insertChildren();if(!Polymer.Settings.suppressTemplateNotifications||this.notifyDomChange){this.fire('dom-change');}}});'use strict';if(!Polymer.Settings.useNativeShadow){tr.b.showPanic('Polymer error','base only works in shadow mode');}'use strict';const global=this.window||this.global;this.tr=(function(){if(global.tr)return global.tr;function exportPath(name){const parts=name.split('.');let cur=global;for(let part;parts.length&&(part=parts.shift());){if(part in cur){cur=cur[part];}else{cur=cur[part]={};}}
+return cur;}
+function isExported(name){const parts=name.split('.');let cur=global;for(let part;parts.length&&(part=parts.shift());){if(part in cur){cur=cur[part];}else{return false;}}
+return true;}
+function isDefined(name){const parts=name.split('.');let curObject=global;for(let i=0;i<parts.length;i++){const partName=parts[i];const nextObject=curObject[partName];if(nextObject===undefined)return false;curObject=nextObject;}
+return true;}
+let panicElement=undefined;const rawPanicMessages=[];function showPanicElementIfNeeded(){if(panicElement)return;const panicOverlay=document.createElement('div');panicOverlay.style.backgroundColor='white';panicOverlay.style.border='3px solid red';panicOverlay.style.boxSizing='border-box';panicOverlay.style.color='black';panicOverlay.style.display='-webkit-flex';panicOverlay.style.height='100%';panicOverlay.style.left=0;panicOverlay.style.padding='8px';panicOverlay.style.position='fixed';panicOverlay.style.top=0;panicOverlay.style.webkitFlexDirection='column';panicOverlay.style.width='100%';panicElement=document.createElement('div');panicElement.style.webkitFlex='1 1 auto';panicElement.style.overflow='auto';panicOverlay.appendChild(panicElement);if(!document.body){setTimeout(function(){document.body.appendChild(panicOverlay);},150);}else{document.body.appendChild(panicOverlay);}}
+function showPanic(panicTitle,panicDetails){if(tr.isHeadless){if(panicDetails instanceof Error)throw panicDetails;throw new Error('Panic: '+panicTitle+':\n'+panicDetails);}
+if(panicDetails instanceof Error){panicDetails=panicDetails.stack;}
+showPanicElementIfNeeded();const panicMessageEl=document.createElement('div');panicMessageEl.innerHTML='<h2 id="message"></h2>'+'<pre id="details"></pre>';panicMessageEl.querySelector('#message').textContent=panicTitle;panicMessageEl.querySelector('#details').textContent=panicDetails;panicElement.appendChild(panicMessageEl);rawPanicMessages.push({title:panicTitle,details:panicDetails});}
+function hasPanic(){return rawPanicMessages.length!==0;}
+function getPanicText(){return rawPanicMessages.map(function(msg){return msg.title;}).join(', ');}
+function exportTo(namespace,fn){const obj=exportPath(namespace);const exports=fn();for(const propertyName in exports){const propertyDescriptor=Object.getOwnPropertyDescriptor(exports,propertyName);if(propertyDescriptor){Object.defineProperty(obj,propertyName,propertyDescriptor);}}}
+function initialize(){if(global.isVinn){tr.isVinn=true;}else if(global.process&&global.process.versions.node){tr.isNode=true;}else{tr.isVinn=false;tr.isNode=false;tr.doc=document;tr.isMac=/Mac/.test(navigator.platform);tr.isWindows=/Win/.test(navigator.platform);tr.isChromeOS=/CrOS/.test(navigator.userAgent);tr.isLinux=/Linux/.test(navigator.userAgent);}
+tr.isHeadless=tr.isVinn||tr.isNode;}
+return{initialize,exportTo,isExported,isDefined,showPanic,hasPanic,getPanicText,};})();tr.initialize();'use strict';tr.exportTo('tr.b',function(){function EventTarget(){}
+EventTarget.decorate=function(target){for(const k in EventTarget.prototype){if(k==='decorate')continue;const v=EventTarget.prototype[k];if(typeof v!=='function')continue;target[k]=v;}};EventTarget.prototype={addEventListener(type,handler){if(!this.listeners_){this.listeners_=Object.create(null);}
+if(!(type in this.listeners_)){this.listeners_[type]=[handler];}else{const handlers=this.listeners_[type];if(handlers.indexOf(handler)<0){handlers.push(handler);}}},removeEventListener(type,handler){if(!this.listeners_)return;if(type in this.listeners_){const handlers=this.listeners_[type];const index=handlers.indexOf(handler);if(index>=0){if(handlers.length===1){delete this.listeners_[type];}else{handlers.splice(index,1);}}}},dispatchEvent(event){if(!this.listeners_)return true;event.__defineGetter__('target',()=>this);const realPreventDefault=event.preventDefault;event.preventDefault=function(){realPreventDefault.call(this);this.rawReturnValue=false;};const type=event.type;let prevented=0;if(type in this.listeners_){const handlers=this.listeners_[type].concat();for(let i=0,handler;handler=handlers[i];i++){if(handler.handleEvent){prevented|=handler.handleEvent.call(handler,event)===false;}else{prevented|=handler.call(this,event)===false;}}}
+return!prevented&&event.rawReturnValue;},async dispatchAsync(event){if(!this.listeners_)return true;const listeners=this.listeners_[event.type];if(listeners===undefined)return;await Promise.all(listeners.slice().map(listener=>{if(listener.handleEvent){return listener.handleEvent.call(listener,event);}
+return listener.call(this,event);}));},hasEventListener(type){return(this.listeners_!==undefined&&this.listeners_[type]!==undefined);}};return{EventTarget,};});'use strict';tr.exportTo('tr.b',function(){function RegisteredTypeInfo(constructor,metadata){this.constructor=constructor;this.metadata=metadata;}
+const BASIC_REGISTRY_MODE='BASIC_REGISTRY_MODE';const TYPE_BASED_REGISTRY_MODE='TYPE_BASED_REGISTRY_MODE';const ALL_MODES={BASIC_REGISTRY_MODE:true,TYPE_BASED_REGISTRY_MODE:true};function ExtensionRegistryOptions(mode){if(mode===undefined){throw new Error('Mode is required');}
+if(!ALL_MODES[mode]){throw new Error('Not a mode.');}
+this.mode_=mode;this.defaultMetadata_={};this.defaultConstructor_=undefined;this.defaultTypeInfo_=undefined;this.frozen_=false;}
+ExtensionRegistryOptions.prototype={freeze(){if(this.frozen_){throw new Error('Frozen');}
+this.frozen_=true;},get mode(){return this.mode_;},get defaultMetadata(){return this.defaultMetadata_;},set defaultMetadata(defaultMetadata){if(this.frozen_){throw new Error('Frozen');}
+this.defaultMetadata_=defaultMetadata;this.defaultTypeInfo_=undefined;},get defaultConstructor(){return this.defaultConstructor_;},set defaultConstructor(defaultConstructor){if(this.frozen_){throw new Error('Frozen');}
+this.defaultConstructor_=defaultConstructor;this.defaultTypeInfo_=undefined;},get defaultTypeInfo(){if(this.defaultTypeInfo_===undefined&&this.defaultConstructor_){this.defaultTypeInfo_=new RegisteredTypeInfo(this.defaultConstructor,this.defaultMetadata);}
+return this.defaultTypeInfo_;},validateConstructor(constructor){if(!this.mandatoryBaseClass)return;let curProto=constructor.prototype.__proto__;let ok=false;while(curProto){if(curProto===this.mandatoryBaseClass.prototype){ok=true;break;}
+curProto=curProto.__proto__;}
+if(!ok){throw new Error(constructor+'must be subclass of '+registry);}}};return{BASIC_REGISTRY_MODE,TYPE_BASED_REGISTRY_MODE,ExtensionRegistryOptions,RegisteredTypeInfo,};});'use strict';tr.exportTo('tr.b',function(){let Event;if(tr.isHeadless){function HeadlessEvent(type,opt_bubbles,opt_preventable){this.type=type;this.bubbles=(opt_bubbles!==undefined?!!opt_bubbles:false);this.cancelable=(opt_preventable!==undefined?!!opt_preventable:false);this.defaultPrevented=false;this.cancelBubble=false;}
+HeadlessEvent.prototype={preventDefault(){this.defaultPrevented=true;},stopPropagation(){this.cancelBubble=true;}};Event=HeadlessEvent;}else{function TrEvent(type,opt_bubbles,opt_preventable){const e=tr.doc.createEvent('Event');e.initEvent(type,!!opt_bubbles,!!opt_preventable);e.__proto__=global.Event.prototype;return e;}
+TrEvent.prototype={__proto__:global.Event.prototype};Event=TrEvent;}
+function dispatchSimpleEvent(target,type,opt_bubbles,opt_cancelable,opt_fields){const e=new tr.b.Event(type,opt_bubbles,opt_cancelable);Object.assign(e,opt_fields);return target.dispatchEvent(e);}
+async function dispatchSimpleEventAsync(target,type,opt_fields){const e=new tr.b.Event(type,false,false);Object.assign(e,opt_fields);return await target.dispatchAsync(e);}
+return{Event,dispatchSimpleEvent,dispatchSimpleEventAsync,};});'use strict';tr.exportTo('tr.b',function(){const RegisteredTypeInfo=tr.b.RegisteredTypeInfo;const ExtensionRegistryOptions=tr.b.ExtensionRegistryOptions;function decorateBasicExtensionRegistry(registry,extensionRegistryOptions){const savedStateStack=[];registry.registeredTypeInfos_=[];registry.register=function(constructor,opt_metadata){if(registry.findIndexOfRegisteredConstructor(constructor)!==undefined){throw new Error('Handler already registered for '+constructor);}
+extensionRegistryOptions.validateConstructor(constructor);const metadata={};for(const k in extensionRegistryOptions.defaultMetadata){metadata[k]=extensionRegistryOptions.defaultMetadata[k];}
+if(opt_metadata){for(const k in opt_metadata){metadata[k]=opt_metadata[k];}}
+const typeInfo=new RegisteredTypeInfo(constructor,metadata);let e=new tr.b.Event('will-register');e.typeInfo=typeInfo;registry.dispatchEvent(e);registry.registeredTypeInfos_.push(typeInfo);e=new tr.b.Event('registry-changed');registry.dispatchEvent(e);};registry.pushCleanStateBeforeTest=function(){savedStateStack.push(registry.registeredTypeInfos_);registry.registeredTypeInfos_=[];const e=new tr.b.Event('registry-changed');registry.dispatchEvent(e);};registry.popCleanStateAfterTest=function(){registry.registeredTypeInfos_=savedStateStack[0];savedStateStack.splice(0,1);const e=new tr.b.Event('registry-changed');registry.dispatchEvent(e);};registry.findIndexOfRegisteredConstructor=function(constructor){for(let i=0;i<registry.registeredTypeInfos_.length;i++){if(registry.registeredTypeInfos_[i].constructor===constructor){return i;}}
+return undefined;};registry.unregister=function(constructor){const foundIndex=registry.findIndexOfRegisteredConstructor(constructor);if(foundIndex===undefined){throw new Error(constructor+' not registered');}
+registry.registeredTypeInfos_.splice(foundIndex,1);const e=new tr.b.Event('registry-changed');registry.dispatchEvent(e);};registry.getAllRegisteredTypeInfos=function(){return registry.registeredTypeInfos_;};registry.findTypeInfo=function(constructor){const foundIndex=this.findIndexOfRegisteredConstructor(constructor);if(foundIndex!==undefined){return this.registeredTypeInfos_[foundIndex];}
+return undefined;};registry.findTypeInfoMatching=function(predicate,opt_this){opt_this=opt_this?opt_this:undefined;for(let i=0;i<registry.registeredTypeInfos_.length;++i){const typeInfo=registry.registeredTypeInfos_[i];if(predicate.call(opt_this,typeInfo)){return typeInfo;}}
+return extensionRegistryOptions.defaultTypeInfo;};registry.findTypeInfoWithName=function(name){if(typeof(name)!=='string'){throw new Error('Name is not a string.');}
+const typeInfo=registry.findTypeInfoMatching(function(ti){return ti.constructor.name===name;});if(typeInfo)return typeInfo;return undefined;};}
+return{_decorateBasicExtensionRegistry:decorateBasicExtensionRegistry};});'use strict';tr.exportTo('tr.b',function(){const categoryPartsFor={};function getCategoryParts(category){let parts=categoryPartsFor[category];if(parts!==undefined)return parts;parts=category.split(',');categoryPartsFor[category]=parts;return parts;}
+return{getCategoryParts,};});'use strict';tr.exportTo('tr.b',function(){const getCategoryParts=tr.b.getCategoryParts;const RegisteredTypeInfo=tr.b.RegisteredTypeInfo;const ExtensionRegistryOptions=tr.b.ExtensionRegistryOptions;function decorateTypeBasedExtensionRegistry(registry,extensionRegistryOptions){const savedStateStack=[];registry.registeredTypeInfos_=[];registry.categoryPartToTypeInfoMap_=new Map();registry.typeNameToTypeInfoMap_=new Map();registry.register=function(constructor,metadata){extensionRegistryOptions.validateConstructor(constructor);const typeInfo=new RegisteredTypeInfo(constructor,metadata||extensionRegistryOptions.defaultMetadata);typeInfo.typeNames=[];typeInfo.categoryParts=[];if(metadata&&metadata.typeName){typeInfo.typeNames.push(metadata.typeName);}
+if(metadata&&metadata.typeNames){typeInfo.typeNames.push.apply(typeInfo.typeNames,metadata.typeNames);}
+if(metadata&&metadata.categoryParts){typeInfo.categoryParts.push.apply(typeInfo.categoryParts,metadata.categoryParts);}
+if(typeInfo.typeNames.length===0&&typeInfo.categoryParts.length===0){throw new Error('typeName or typeNames must be provided');}
+typeInfo.typeNames.forEach(function(typeName){if(registry.typeNameToTypeInfoMap_.has(typeName)){throw new Error('typeName '+typeName+' already registered');}});typeInfo.categoryParts.forEach(function(categoryPart){if(registry.categoryPartToTypeInfoMap_.has(categoryPart)){throw new Error('categoryPart '+categoryPart+' already registered');}});let e=new tr.b.Event('will-register');e.typeInfo=typeInfo;registry.dispatchEvent(e);typeInfo.typeNames.forEach(function(typeName){registry.typeNameToTypeInfoMap_.set(typeName,typeInfo);});typeInfo.categoryParts.forEach(function(categoryPart){registry.categoryPartToTypeInfoMap_.set(categoryPart,typeInfo);});registry.registeredTypeInfos_.push(typeInfo);e=new tr.b.Event('registry-changed');registry.dispatchEvent(e);};registry.pushCleanStateBeforeTest=function(){savedStateStack.push({registeredTypeInfos:registry.registeredTypeInfos_,typeNameToTypeInfoMap:registry.typeNameToTypeInfoMap_,categoryPartToTypeInfoMap:registry.categoryPartToTypeInfoMap_});registry.registeredTypeInfos_=[];registry.typeNameToTypeInfoMap_=new Map();registry.categoryPartToTypeInfoMap_=new Map();const e=new tr.b.Event('registry-changed');registry.dispatchEvent(e);};registry.popCleanStateAfterTest=function(){const state=savedStateStack[0];savedStateStack.splice(0,1);registry.registeredTypeInfos_=state.registeredTypeInfos;registry.typeNameToTypeInfoMap_=state.typeNameToTypeInfoMap;registry.categoryPartToTypeInfoMap_=state.categoryPartToTypeInfoMap;const e=new tr.b.Event('registry-changed');registry.dispatchEvent(e);};registry.unregister=function(constructor){let typeInfoIndex=-1;for(let i=0;i<registry.registeredTypeInfos_.length;i++){if(registry.registeredTypeInfos_[i].constructor===constructor){typeInfoIndex=i;break;}}
+if(typeInfoIndex===-1){throw new Error(constructor+' not registered');}
+const typeInfo=registry.registeredTypeInfos_[typeInfoIndex];registry.registeredTypeInfos_.splice(typeInfoIndex,1);typeInfo.typeNames.forEach(function(typeName){registry.typeNameToTypeInfoMap_.delete(typeName);});typeInfo.categoryParts.forEach(function(categoryPart){registry.categoryPartToTypeInfoMap_.delete(categoryPart);});const e=new tr.b.Event('registry-changed');registry.dispatchEvent(e);};registry.getTypeInfo=function(category,typeName){if(category){const categoryParts=getCategoryParts(category);for(let i=0;i<categoryParts.length;i++){const categoryPart=categoryParts[i];const typeInfo=registry.categoryPartToTypeInfoMap_.get(categoryPart);if(typeInfo!==undefined)return typeInfo;}}
+const typeInfo=registry.typeNameToTypeInfoMap_.get(typeName);if(typeInfo!==undefined)return typeInfo;return extensionRegistryOptions.defaultTypeInfo;};registry.getConstructor=function(category,typeName){const typeInfo=registry.getTypeInfo(category,typeName);if(typeInfo)return typeInfo.constructor;return undefined;};}
+return{_decorateTypeBasedExtensionRegistry:decorateTypeBasedExtensionRegistry};});'use strict';tr.exportTo('tr.b',function(){function asArray(x){const values=[];if(x[Symbol.iterator]){for(const value of x){values.push(value);}}else{for(let i=0;i<x.length;i++){values.push(x[i]);}}
+return values;}
+function getOnlyElement(iterable){const iterator=iterable[Symbol.iterator]();const firstIteration=iterator.next();if(firstIteration.done){throw new Error('getOnlyElement was passed an empty iterable.');}
+const secondIteration=iterator.next();if(!secondIteration.done){throw new Error('getOnlyElement was passed an iterable with multiple elements.');}
+return firstIteration.value;}
+function getFirstElement(iterable){const iterator=iterable[Symbol.iterator]();const result=iterator.next();if(result.done){throw new Error('getFirstElement was passed an empty iterable.');}
+return result.value;}
+function compareArrays(x,y,elementCmp){const minLength=Math.min(x.length,y.length);let i;for(i=0;i<minLength;i++){const tmp=elementCmp(x[i],y[i]);if(tmp)return tmp;}
+if(x.length===y.length)return 0;if(x[i]===undefined)return-1;return 1;}
+function comparePossiblyUndefinedValues(x,y,cmp,opt_this){if(x!==undefined&&y!==undefined){return cmp.call(opt_this,x,y);}
+if(x!==undefined)return-1;if(y!==undefined)return 1;return 0;}
+function concatenateObjects(){const result={};for(let i=0;i<arguments.length;i++){const object=arguments[i];for(const j in object){result[j]=object[j];}}
+return result;}
+function dictionaryContainsValue(dict,value){for(const key in dict){if(dict[key]===value){return true;}}
+return false;}
+function groupIntoMap(ary,callback,opt_this,opt_arrayConstructor){const arrayConstructor=opt_arrayConstructor||Array;const results=new Map();for(const element of ary){const key=callback.call(opt_this,element);let items=results.get(key);if(items===undefined){items=new arrayConstructor();results.set(key,items);}
+items.push(element);}
+return results;}
+function mapItems(dict,fn,opt_this){opt_this=opt_this||this;const result={};const keys=Object.keys(dict);for(let i=0;i<keys.length;i++){const key=keys[i];result[key]=fn.call(opt_this,key,dict[key]);}
+return result;}
+function filterItems(dict,predicate,opt_this){opt_this=opt_this||this;const result={};const keys=Object.keys(dict);for(let i=0;i<keys.length;i++){const key=keys[i];const value=dict[key];if(predicate.call(opt_this,key,value)){result[key]=value;}}
+return result;}
+function inPlaceFilter(array,predicate,opt_this){opt_this=opt_this||this;let nextPosition=0;for(let i=0;i<array.length;i++){if(!predicate.call(opt_this,array[i],i))continue;if(nextPosition<i){array[nextPosition]=array[i];}
+nextPosition++;}
+if(nextPosition<array.length){array.length=nextPosition;}}
+function iterObjectFieldsRecursively(object,func){if(!(object instanceof Object))return;if(object instanceof Array){for(let i=0;i<object.length;i++){func(object,i,object[i]);iterObjectFieldsRecursively(object[i],func);}
+return;}
+for(const key in object){const value=object[key];func(object,key,value);iterObjectFieldsRecursively(value,func);}}
+function invertArrayOfDicts(array,opt_dictGetter,opt_this){opt_this=opt_this||this;const result={};for(let i=0;i<array.length;i++){const item=array[i];if(item===undefined)continue;const dict=opt_dictGetter?opt_dictGetter.call(opt_this,item):item;if(dict===undefined)continue;for(const key in dict){let valueList=result[key];if(valueList===undefined){result[key]=valueList=new Array(array.length);}
+valueList[i]=dict[key];}}
+return result;}
+function arrayToDict(array,valueToKeyFn,opt_this){opt_this=opt_this||this;const result={};const length=array.length;for(let i=0;i<length;i++){const value=array[i];const key=valueToKeyFn.call(opt_this,value);result[key]=value;}
+return result;}
+function identity(d){return d;}
+function findFirstIndexInArray(ary,opt_func,opt_this){const func=opt_func||identity;for(let i=0;i<ary.length;i++){if(func.call(opt_this,ary[i],i))return i;}
+return-1;}
+function findFirstInArray(ary,opt_func,opt_this){const i=findFirstIndexInArray(ary,opt_func,opt_func);if(i===-1)return undefined;return ary[i];}
+function findFirstKeyInDictMatching(dict,opt_func,opt_this){const func=opt_func||identity;for(const key in dict){if(func.call(opt_this,key,dict[key])){return key;}}
+return undefined;}
+function mapValues(map){const values=[];for(const value of map.values()){values.push(value);}
+return values;}
+function setsEqual(a,b){if(!(a instanceof Set)||!(b instanceof Set))return false;if(a.size!==b.size)return false;for(const x of a){if(!b.has(x))return false;}
+return true;}
+return{asArray,concatenateObjects,compareArrays,comparePossiblyUndefinedValues,dictionaryContainsValue,getOnlyElement,getFirstElement,groupIntoMap,mapItems,filterItems,inPlaceFilter,iterObjectFieldsRecursively,invertArrayOfDicts,arrayToDict,identity,findFirstIndexInArray,findFirstInArray,findFirstKeyInDictMatching,mapValues,setsEqual,};});'use strict';tr.exportTo('tr.b',function(){function decorateExtensionRegistry(registry,registryOptions){if(registry.register){throw new Error('Already has registry');}
+registryOptions.freeze();if(registryOptions.mode===tr.b.BASIC_REGISTRY_MODE){tr.b._decorateBasicExtensionRegistry(registry,registryOptions);}else if(registryOptions.mode===tr.b.TYPE_BASED_REGISTRY_MODE){tr.b._decorateTypeBasedExtensionRegistry(registry,registryOptions);}else{throw new Error('Unrecognized mode');}
+if(registry.addEventListener===undefined){tr.b.EventTarget.decorate(registry);}}
+return{decorateExtensionRegistry,};});'use strict';tr.exportTo('tr.importer',function(){function Importer(){}
+Importer.prototype={__proto__:Object.prototype,get importerName(){return'Importer';},isTraceDataContainer(){return false;},extractSubtraces(){return[];},importClockSyncMarkers(){},importEvents(){},importSampleData(){},finalizeImport(){}};const options=new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE);options.defaultMetadata={};options.mandatoryBaseClass=Importer;tr.b.decorateExtensionRegistry(Importer,options);Importer.findImporterFor=function(eventData){const typeInfo=Importer.findTypeInfoMatching(function(ti){return ti.constructor.canImport(eventData);});if(typeInfo){return typeInfo.constructor;}
+return undefined;};return{Importer,};});'use strict';tr.exportTo('tr.e.importer.gcloud_trace',function(){function GcloudTraceImporter(model,eventData){this.importPriority=2;this.eventData_=eventData;}
+GcloudTraceImporter.canImport=function(eventData){if(typeof(eventData)!=='string'&&!(eventData instanceof String)){return false;}
+const normalizedEventData=eventData.slice(0,20).replace(/\s/g,'');if(normalizedEventData.length<14)return false;return normalizedEventData.slice(0,14)==='{"projectId":"';};GcloudTraceImporter.prototype={__proto__:tr.importer.Importer.prototype,get importerName(){return'GcloudTraceImporter';},extractSubtraces(){const traceEvents=this.createEventsForTrace();return traceEvents?[traceEvents]:[];},createEventsForTrace(){const events=[];const trace=JSON.parse(this.eventData_);const spanLength=trace.spans.length;for(let i=0;i<spanLength;i++){events.push(this.createEventForSpan(trace.traceId,trace.spans[i]));}
+return{'traceEvents':events};},createEventForSpan(traceId,span){let newArgs={};if(span.labels){newArgs=JSON.parse(JSON.stringify(span.labels));}
+newArgs['Span ID']=span.spanId;newArgs['Start Time']=span.startTime;newArgs['End Time']=span.endTime;if(span.parentSpanId){newArgs['Parent Span ID']=span.parentSpanId;}
+return{name:span.name,args:newArgs,pid:traceId,ts:Date.parse(span.startTime)*1000,dur:(Date.parse(span.endTime)-Date.parse(span.startTime))*1000,cat:'tracespan',tid:traceId,ph:'X'};}};tr.importer.Importer.register(GcloudTraceImporter);return{GcloudTraceImporter,};});'use strict';tr.exportTo('tr.b.math',function(){function convertEventsToRanges(events){return events.map(function(event){return tr.b.math.Range.fromExplicitRange(event.start,event.end);});}
+function mergeRanges(inRanges,mergeThreshold,mergeFunction){const remainingEvents=inRanges.slice();remainingEvents.sort(function(x,y){return x.min-y.min;});if(remainingEvents.length<=1){const merged=[];if(remainingEvents.length===1){merged.push(mergeFunction(remainingEvents));}
+return merged;}
+const mergedEvents=[];let currentMergeBuffer=[];let rightEdge;function beginMerging(){currentMergeBuffer.push(remainingEvents[0]);remainingEvents.splice(0,1);rightEdge=currentMergeBuffer[0].max;}
+function flushCurrentMergeBuffer(){if(currentMergeBuffer.length===0)return;mergedEvents.push(mergeFunction(currentMergeBuffer));currentMergeBuffer=[];if(remainingEvents.length!==0)beginMerging();}
+beginMerging();while(remainingEvents.length){const currentEvent=remainingEvents[0];const distanceFromRightEdge=currentEvent.min-rightEdge;if(distanceFromRightEdge<mergeThreshold){rightEdge=Math.max(rightEdge,currentEvent.max);remainingEvents.splice(0,1);currentMergeBuffer.push(currentEvent);continue;}
+flushCurrentMergeBuffer();}
+flushCurrentMergeBuffer();return mergedEvents;}
+function findEmptyRangesBetweenRanges(inRanges,opt_totalRange){if(opt_totalRange&&opt_totalRange.isEmpty)opt_totalRange=undefined;const emptyRanges=[];if(!inRanges.length){if(opt_totalRange)emptyRanges.push(opt_totalRange);return emptyRanges;}
+inRanges=inRanges.slice();inRanges.sort(function(x,y){return x.min-y.min;});if(opt_totalRange&&(opt_totalRange.min<inRanges[0].min)){emptyRanges.push(tr.b.math.Range.fromExplicitRange(opt_totalRange.min,inRanges[0].min));}
+inRanges.forEach(function(range,index){for(let otherIndex=0;otherIndex<inRanges.length;++otherIndex){if(index===otherIndex)continue;const other=inRanges[otherIndex];if(other.min>range.max){emptyRanges.push(tr.b.math.Range.fromExplicitRange(range.max,other.min));return;}
+if(other.max>range.max){return;}}
+if(opt_totalRange&&(range.max<opt_totalRange.max)){emptyRanges.push(tr.b.math.Range.fromExplicitRange(range.max,opt_totalRange.max));}});return emptyRanges;}
+return{convertEventsToRanges,findEmptyRangesBetweenRanges,mergeRanges,};});!function(t,n){if("object"==typeof exports&&"object"==typeof module)module.exports=n();else if("function"==typeof define&&define.amd)define(n);else{var r=n();for(var a in r)("object"==typeof exports?exports:t)[a]=r[a]}}(this,function(){return function(t){function n(a){if(r[a])return r[a].exports;var e=r[a]={exports:{},id:a,loaded:!1};return t[a].call(e.exports,e,e.exports,n),e.loaded=!0,e.exports}var r={};return n.m=t,n.c=r,n.p="",n(0)}([function(t,n,r){n.glMatrix=r(1),n.mat2=r(2),n.mat2d=r(3),n.mat3=r(4),n.mat4=r(5),n.quat=r(6),n.vec2=r(9),n.vec3=r(7),n.vec4=r(8)},function(t,n,r){var a={};a.EPSILON=1e-6,a.ARRAY_TYPE="undefined"!=typeof Float32Array?Float32Array:Array,a.RANDOM=Math.random,a.setMatrixArrayType=function(t){GLMAT_ARRAY_TYPE=t};var e=Math.PI/180;a.toRadian=function(t){return t*e},t.exports=a},function(t,n,r){var a=r(1),e={};e.create=function(){var t=new a.ARRAY_TYPE(4);return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t},e.clone=function(t){var n=new a.ARRAY_TYPE(4);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n},e.copy=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t},e.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t},e.transpose=function(t,n){if(t===n){var r=n[1];t[1]=n[2],t[2]=r}else t[0]=n[0],t[1]=n[2],t[2]=n[1],t[3]=n[3];return t},e.invert=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=r*u-e*a;return o?(o=1/o,t[0]=u*o,t[1]=-a*o,t[2]=-e*o,t[3]=r*o,t):null},e.adjoint=function(t,n){var r=n[0];return t[0]=n[3],t[1]=-n[1],t[2]=-n[2],t[3]=r,t},e.determinant=function(t){return t[0]*t[3]-t[2]*t[1]},e.multiply=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=r[0],c=r[1],f=r[2],s=r[3];return t[0]=a*i+u*c,t[1]=e*i+o*c,t[2]=a*f+u*s,t[3]=e*f+o*s,t},e.mul=e.multiply,e.rotate=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=Math.sin(r),c=Math.cos(r);return t[0]=a*c+u*i,t[1]=e*c+o*i,t[2]=a*-i+u*c,t[3]=e*-i+o*c,t},e.scale=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=r[0],c=r[1];return t[0]=a*i,t[1]=e*i,t[2]=u*c,t[3]=o*c,t},e.fromRotation=function(t,n){var r=Math.sin(n),a=Math.cos(n);return t[0]=a,t[1]=r,t[2]=-r,t[3]=a,t},e.fromScaling=function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=n[1],t},e.str=function(t){return"mat2("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},e.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2))},e.LDU=function(t,n,r,a){return t[2]=a[2]/a[0],r[0]=a[0],r[1]=a[1],r[3]=a[3]-t[2]*r[1],[t,n,r]},t.exports=e},function(t,n,r){var a=r(1),e={};e.create=function(){var t=new a.ARRAY_TYPE(6);return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},e.clone=function(t){var n=new a.ARRAY_TYPE(6);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n},e.copy=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t},e.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},e.invert=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=n[4],i=n[5],c=r*u-a*e;return c?(c=1/c,t[0]=u*c,t[1]=-a*c,t[2]=-e*c,t[3]=r*c,t[4]=(e*i-u*o)*c,t[5]=(a*o-r*i)*c,t):null},e.determinant=function(t){return t[0]*t[3]-t[1]*t[2]},e.multiply=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=n[4],c=n[5],f=r[0],s=r[1],h=r[2],M=r[3],l=r[4],v=r[5];return t[0]=a*f+u*s,t[1]=e*f+o*s,t[2]=a*h+u*M,t[3]=e*h+o*M,t[4]=a*l+u*v+i,t[5]=e*l+o*v+c,t},e.mul=e.multiply,e.rotate=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=n[4],c=n[5],f=Math.sin(r),s=Math.cos(r);return t[0]=a*s+u*f,t[1]=e*s+o*f,t[2]=a*-f+u*s,t[3]=e*-f+o*s,t[4]=i,t[5]=c,t},e.scale=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=n[4],c=n[5],f=r[0],s=r[1];return t[0]=a*f,t[1]=e*f,t[2]=u*s,t[3]=o*s,t[4]=i,t[5]=c,t},e.translate=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=n[4],c=n[5],f=r[0],s=r[1];return t[0]=a,t[1]=e,t[2]=u,t[3]=o,t[4]=a*f+u*s+i,t[5]=e*f+o*s+c,t},e.fromRotation=function(t,n){var r=Math.sin(n),a=Math.cos(n);return t[0]=a,t[1]=r,t[2]=-r,t[3]=a,t[4]=0,t[5]=0,t},e.fromScaling=function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=n[1],t[4]=0,t[5]=0,t},e.fromTranslation=function(t,n){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=n[0],t[5]=n[1],t},e.str=function(t){return"mat2d("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+")"},e.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2)+Math.pow(t[4],2)+Math.pow(t[5],2)+1)},t.exports=e},function(t,n,r){var a=r(1),e={};e.create=function(){var t=new a.ARRAY_TYPE(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},e.fromMat4=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[4],t[4]=n[5],t[5]=n[6],t[6]=n[8],t[7]=n[9],t[8]=n[10],t},e.clone=function(t){var n=new a.ARRAY_TYPE(9);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n[8]=t[8],n},e.copy=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t},e.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},e.transpose=function(t,n){if(t===n){var r=n[1],a=n[2],e=n[5];t[1]=n[3],t[2]=n[6],t[3]=r,t[5]=n[7],t[6]=a,t[7]=e}else t[0]=n[0],t[1]=n[3],t[2]=n[6],t[3]=n[1],t[4]=n[4],t[5]=n[7],t[6]=n[2],t[7]=n[5],t[8]=n[8];return t},e.invert=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=n[4],i=n[5],c=n[6],f=n[7],s=n[8],h=s*o-i*f,M=-s*u+i*c,l=f*u-o*c,v=r*h+a*M+e*l;return v?(v=1/v,t[0]=h*v,t[1]=(-s*a+e*f)*v,t[2]=(i*a-e*o)*v,t[3]=M*v,t[4]=(s*r-e*c)*v,t[5]=(-i*r+e*u)*v,t[6]=l*v,t[7]=(-f*r+a*c)*v,t[8]=(o*r-a*u)*v,t):null},e.adjoint=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=n[4],i=n[5],c=n[6],f=n[7],s=n[8];return t[0]=o*s-i*f,t[1]=e*f-a*s,t[2]=a*i-e*o,t[3]=i*c-u*s,t[4]=r*s-e*c,t[5]=e*u-r*i,t[6]=u*f-o*c,t[7]=a*c-r*f,t[8]=r*o-a*u,t},e.determinant=function(t){var n=t[0],r=t[1],a=t[2],e=t[3],u=t[4],o=t[5],i=t[6],c=t[7],f=t[8];return n*(f*u-o*c)+r*(-f*e+o*i)+a*(c*e-u*i)},e.multiply=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=n[4],c=n[5],f=n[6],s=n[7],h=n[8],M=r[0],l=r[1],v=r[2],m=r[3],p=r[4],d=r[5],A=r[6],R=r[7],w=r[8];return t[0]=M*a+l*o+v*f,t[1]=M*e+l*i+v*s,t[2]=M*u+l*c+v*h,t[3]=m*a+p*o+d*f,t[4]=m*e+p*i+d*s,t[5]=m*u+p*c+d*h,t[6]=A*a+R*o+w*f,t[7]=A*e+R*i+w*s,t[8]=A*u+R*c+w*h,t},e.mul=e.multiply,e.translate=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=n[4],c=n[5],f=n[6],s=n[7],h=n[8],M=r[0],l=r[1];return t[0]=a,t[1]=e,t[2]=u,t[3]=o,t[4]=i,t[5]=c,t[6]=M*a+l*o+f,t[7]=M*e+l*i+s,t[8]=M*u+l*c+h,t},e.rotate=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=n[4],c=n[5],f=n[6],s=n[7],h=n[8],M=Math.sin(r),l=Math.cos(r);return t[0]=l*a+M*o,t[1]=l*e+M*i,t[2]=l*u+M*c,t[3]=l*o-M*a,t[4]=l*i-M*e,t[5]=l*c-M*u,t[6]=f,t[7]=s,t[8]=h,t},e.scale=function(t,n,r){var a=r[0],e=r[1];return t[0]=a*n[0],t[1]=a*n[1],t[2]=a*n[2],t[3]=e*n[3],t[4]=e*n[4],t[5]=e*n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t},e.fromTranslation=function(t,n){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=n[0],t[7]=n[1],t[8]=1,t},e.fromRotation=function(t,n){var r=Math.sin(n),a=Math.cos(n);return t[0]=a,t[1]=r,t[2]=0,t[3]=-r,t[4]=a,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},e.fromScaling=function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=0,t[4]=n[1],t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},e.fromMat2d=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=0,t[3]=n[2],t[4]=n[3],t[5]=0,t[6]=n[4],t[7]=n[5],t[8]=1,t},e.fromQuat=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=r+r,i=a+a,c=e+e,f=r*o,s=a*o,h=a*i,M=e*o,l=e*i,v=e*c,m=u*o,p=u*i,d=u*c;return t[0]=1-h-v,t[3]=s-d,t[6]=M+p,t[1]=s+d,t[4]=1-f-v,t[7]=l-m,t[2]=M-p,t[5]=l+m,t[8]=1-f-h,t},e.normalFromMat4=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=n[4],i=n[5],c=n[6],f=n[7],s=n[8],h=n[9],M=n[10],l=n[11],v=n[12],m=n[13],p=n[14],d=n[15],A=r*i-a*o,R=r*c-e*o,w=r*f-u*o,q=a*c-e*i,Y=a*f-u*i,g=e*f-u*c,y=s*m-h*v,x=s*p-M*v,P=s*d-l*v,E=h*p-M*m,T=h*d-l*m,b=M*d-l*p,D=A*b-R*T+w*E+q*P-Y*x+g*y;return D?(D=1/D,t[0]=(i*b-c*T+f*E)*D,t[1]=(c*P-o*b-f*x)*D,t[2]=(o*T-i*P+f*y)*D,t[3]=(e*T-a*b-u*E)*D,t[4]=(r*b-e*P+u*x)*D,t[5]=(a*P-r*T-u*y)*D,t[6]=(m*g-p*Y+d*q)*D,t[7]=(p*w-v*g-d*R)*D,t[8]=(v*Y-m*w+d*A)*D,t):null},e.str=function(t){return"mat3("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+", "+t[8]+")"},e.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2)+Math.pow(t[4],2)+Math.pow(t[5],2)+Math.pow(t[6],2)+Math.pow(t[7],2)+Math.pow(t[8],2))},t.exports=e},function(t,n,r){var a=r(1),e={};e.create=function(){var t=new a.ARRAY_TYPE(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},e.clone=function(t){var n=new a.ARRAY_TYPE(16);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n[8]=t[8],n[9]=t[9],n[10]=t[10],n[11]=t[11],n[12]=t[12],n[13]=t[13],n[14]=t[14],n[15]=t[15],n},e.copy=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t[9]=n[9],t[10]=n[10],t[11]=n[11],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],t},e.identity=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},e.transpose=function(t,n){if(t===n){var r=n[1],a=n[2],e=n[3],u=n[6],o=n[7],i=n[11];t[1]=n[4],t[2]=n[8],t[3]=n[12],t[4]=r,t[6]=n[9],t[7]=n[13],t[8]=a,t[9]=u,t[11]=n[14],t[12]=e,t[13]=o,t[14]=i}else t[0]=n[0],t[1]=n[4],t[2]=n[8],t[3]=n[12],t[4]=n[1],t[5]=n[5],t[6]=n[9],t[7]=n[13],t[8]=n[2],t[9]=n[6],t[10]=n[10],t[11]=n[14],t[12]=n[3],t[13]=n[7],t[14]=n[11],t[15]=n[15];return t},e.invert=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=n[4],i=n[5],c=n[6],f=n[7],s=n[8],h=n[9],M=n[10],l=n[11],v=n[12],m=n[13],p=n[14],d=n[15],A=r*i-a*o,R=r*c-e*o,w=r*f-u*o,q=a*c-e*i,Y=a*f-u*i,g=e*f-u*c,y=s*m-h*v,x=s*p-M*v,P=s*d-l*v,E=h*p-M*m,T=h*d-l*m,b=M*d-l*p,D=A*b-R*T+w*E+q*P-Y*x+g*y;return D?(D=1/D,t[0]=(i*b-c*T+f*E)*D,t[1]=(e*T-a*b-u*E)*D,t[2]=(m*g-p*Y+d*q)*D,t[3]=(M*Y-h*g-l*q)*D,t[4]=(c*P-o*b-f*x)*D,t[5]=(r*b-e*P+u*x)*D,t[6]=(p*w-v*g-d*R)*D,t[7]=(s*g-M*w+l*R)*D,t[8]=(o*T-i*P+f*y)*D,t[9]=(a*P-r*T-u*y)*D,t[10]=(v*Y-m*w+d*A)*D,t[11]=(h*w-s*Y-l*A)*D,t[12]=(i*x-o*E-c*y)*D,t[13]=(r*E-a*x+e*y)*D,t[14]=(m*R-v*q-p*A)*D,t[15]=(s*q-h*R+M*A)*D,t):null},e.adjoint=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=n[4],i=n[5],c=n[6],f=n[7],s=n[8],h=n[9],M=n[10],l=n[11],v=n[12],m=n[13],p=n[14],d=n[15];return t[0]=i*(M*d-l*p)-h*(c*d-f*p)+m*(c*l-f*M),t[1]=-(a*(M*d-l*p)-h*(e*d-u*p)+m*(e*l-u*M)),t[2]=a*(c*d-f*p)-i*(e*d-u*p)+m*(e*f-u*c),t[3]=-(a*(c*l-f*M)-i*(e*l-u*M)+h*(e*f-u*c)),t[4]=-(o*(M*d-l*p)-s*(c*d-f*p)+v*(c*l-f*M)),t[5]=r*(M*d-l*p)-s*(e*d-u*p)+v*(e*l-u*M),t[6]=-(r*(c*d-f*p)-o*(e*d-u*p)+v*(e*f-u*c)),t[7]=r*(c*l-f*M)-o*(e*l-u*M)+s*(e*f-u*c),t[8]=o*(h*d-l*m)-s*(i*d-f*m)+v*(i*l-f*h),t[9]=-(r*(h*d-l*m)-s*(a*d-u*m)+v*(a*l-u*h)),t[10]=r*(i*d-f*m)-o*(a*d-u*m)+v*(a*f-u*i),t[11]=-(r*(i*l-f*h)-o*(a*l-u*h)+s*(a*f-u*i)),t[12]=-(o*(h*p-M*m)-s*(i*p-c*m)+v*(i*M-c*h)),t[13]=r*(h*p-M*m)-s*(a*p-e*m)+v*(a*M-e*h),t[14]=-(r*(i*p-c*m)-o*(a*p-e*m)+v*(a*c-e*i)),t[15]=r*(i*M-c*h)-o*(a*M-e*h)+s*(a*c-e*i),t},e.determinant=function(t){var n=t[0],r=t[1],a=t[2],e=t[3],u=t[4],o=t[5],i=t[6],c=t[7],f=t[8],s=t[9],h=t[10],M=t[11],l=t[12],v=t[13],m=t[14],p=t[15],d=n*o-r*u,A=n*i-a*u,R=n*c-e*u,w=r*i-a*o,q=r*c-e*o,Y=a*c-e*i,g=f*v-s*l,y=f*m-h*l,x=f*p-M*l,P=s*m-h*v,E=s*p-M*v,T=h*p-M*m;return d*T-A*E+R*P+w*x-q*y+Y*g},e.multiply=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=n[4],c=n[5],f=n[6],s=n[7],h=n[8],M=n[9],l=n[10],v=n[11],m=n[12],p=n[13],d=n[14],A=n[15],R=r[0],w=r[1],q=r[2],Y=r[3];return t[0]=R*a+w*i+q*h+Y*m,t[1]=R*e+w*c+q*M+Y*p,t[2]=R*u+w*f+q*l+Y*d,t[3]=R*o+w*s+q*v+Y*A,R=r[4],w=r[5],q=r[6],Y=r[7],t[4]=R*a+w*i+q*h+Y*m,t[5]=R*e+w*c+q*M+Y*p,t[6]=R*u+w*f+q*l+Y*d,t[7]=R*o+w*s+q*v+Y*A,R=r[8],w=r[9],q=r[10],Y=r[11],t[8]=R*a+w*i+q*h+Y*m,t[9]=R*e+w*c+q*M+Y*p,t[10]=R*u+w*f+q*l+Y*d,t[11]=R*o+w*s+q*v+Y*A,R=r[12],w=r[13],q=r[14],Y=r[15],t[12]=R*a+w*i+q*h+Y*m,t[13]=R*e+w*c+q*M+Y*p,t[14]=R*u+w*f+q*l+Y*d,t[15]=R*o+w*s+q*v+Y*A,t},e.mul=e.multiply,e.translate=function(t,n,r){var a,e,u,o,i,c,f,s,h,M,l,v,m=r[0],p=r[1],d=r[2];return n===t?(t[12]=n[0]*m+n[4]*p+n[8]*d+n[12],t[13]=n[1]*m+n[5]*p+n[9]*d+n[13],t[14]=n[2]*m+n[6]*p+n[10]*d+n[14],t[15]=n[3]*m+n[7]*p+n[11]*d+n[15]):(a=n[0],e=n[1],u=n[2],o=n[3],i=n[4],c=n[5],f=n[6],s=n[7],h=n[8],M=n[9],l=n[10],v=n[11],t[0]=a,t[1]=e,t[2]=u,t[3]=o,t[4]=i,t[5]=c,t[6]=f,t[7]=s,t[8]=h,t[9]=M,t[10]=l,t[11]=v,t[12]=a*m+i*p+h*d+n[12],t[13]=e*m+c*p+M*d+n[13],t[14]=u*m+f*p+l*d+n[14],t[15]=o*m+s*p+v*d+n[15]),t},e.scale=function(t,n,r){var a=r[0],e=r[1],u=r[2];return t[0]=n[0]*a,t[1]=n[1]*a,t[2]=n[2]*a,t[3]=n[3]*a,t[4]=n[4]*e,t[5]=n[5]*e,t[6]=n[6]*e,t[7]=n[7]*e,t[8]=n[8]*u,t[9]=n[9]*u,t[10]=n[10]*u,t[11]=n[11]*u,t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],t},e.rotate=function(t,n,r,e){var u,o,i,c,f,s,h,M,l,v,m,p,d,A,R,w,q,Y,g,y,x,P,E,T,b=e[0],D=e[1],L=e[2],_=Math.sqrt(b*b+D*D+L*L);return Math.abs(_)<a.EPSILON?null:(_=1/_,b*=_,D*=_,L*=_,u=Math.sin(r),o=Math.cos(r),i=1-o,c=n[0],f=n[1],s=n[2],h=n[3],M=n[4],l=n[5],v=n[6],m=n[7],p=n[8],d=n[9],A=n[10],R=n[11],w=b*b*i+o,q=D*b*i+L*u,Y=L*b*i-D*u,g=b*D*i-L*u,y=D*D*i+o,x=L*D*i+b*u,P=b*L*i+D*u,E=D*L*i-b*u,T=L*L*i+o,t[0]=c*w+M*q+p*Y,t[1]=f*w+l*q+d*Y,t[2]=s*w+v*q+A*Y,t[3]=h*w+m*q+R*Y,t[4]=c*g+M*y+p*x,t[5]=f*g+l*y+d*x,t[6]=s*g+v*y+A*x,t[7]=h*g+m*y+R*x,t[8]=c*P+M*E+p*T,t[9]=f*P+l*E+d*T,t[10]=s*P+v*E+A*T,t[11]=h*P+m*E+R*T,n!==t&&(t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15]),t)},e.rotateX=function(t,n,r){var a=Math.sin(r),e=Math.cos(r),u=n[4],o=n[5],i=n[6],c=n[7],f=n[8],s=n[9],h=n[10],M=n[11];return n!==t&&(t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15]),t[4]=u*e+f*a,t[5]=o*e+s*a,t[6]=i*e+h*a,t[7]=c*e+M*a,t[8]=f*e-u*a,t[9]=s*e-o*a,t[10]=h*e-i*a,t[11]=M*e-c*a,t},e.rotateY=function(t,n,r){var a=Math.sin(r),e=Math.cos(r),u=n[0],o=n[1],i=n[2],c=n[3],f=n[8],s=n[9],h=n[10],M=n[11];return n!==t&&(t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15]),t[0]=u*e-f*a,t[1]=o*e-s*a,t[2]=i*e-h*a,t[3]=c*e-M*a,t[8]=u*a+f*e,t[9]=o*a+s*e,t[10]=i*a+h*e,t[11]=c*a+M*e,t},e.rotateZ=function(t,n,r){var a=Math.sin(r),e=Math.cos(r),u=n[0],o=n[1],i=n[2],c=n[3],f=n[4],s=n[5],h=n[6],M=n[7];return n!==t&&(t[8]=n[8],t[9]=n[9],t[10]=n[10],t[11]=n[11],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15]),t[0]=u*e+f*a,t[1]=o*e+s*a,t[2]=i*e+h*a,t[3]=c*e+M*a,t[4]=f*e-u*a,t[5]=s*e-o*a,t[6]=h*e-i*a,t[7]=M*e-c*a,t},e.fromTranslation=function(t,n){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=n[0],t[13]=n[1],t[14]=n[2],t[15]=1,t},e.fromScaling=function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=n[1],t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=n[2],t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},e.fromRotation=function(t,n,r){var e,u,o,i=r[0],c=r[1],f=r[2],s=Math.sqrt(i*i+c*c+f*f);return Math.abs(s)<a.EPSILON?null:(s=1/s,i*=s,c*=s,f*=s,e=Math.sin(n),u=Math.cos(n),o=1-u,t[0]=i*i*o+u,t[1]=c*i*o+f*e,t[2]=f*i*o-c*e,t[3]=0,t[4]=i*c*o-f*e,t[5]=c*c*o+u,t[6]=f*c*o+i*e,t[7]=0,t[8]=i*f*o+c*e,t[9]=c*f*o-i*e,t[10]=f*f*o+u,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t)},e.fromXRotation=function(t,n){var r=Math.sin(n),a=Math.cos(n);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=a,t[6]=r,t[7]=0,t[8]=0,t[9]=-r,t[10]=a,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},e.fromYRotation=function(t,n){var r=Math.sin(n),a=Math.cos(n);return t[0]=a,t[1]=0,t[2]=-r,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=r,t[9]=0,t[10]=a,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},e.fromZRotation=function(t,n){var r=Math.sin(n),a=Math.cos(n);return t[0]=a,t[1]=r,t[2]=0,t[3]=0,t[4]=-r,t[5]=a,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},e.fromRotationTranslation=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=a+a,c=e+e,f=u+u,s=a*i,h=a*c,M=a*f,l=e*c,v=e*f,m=u*f,p=o*i,d=o*c,A=o*f;return t[0]=1-(l+m),t[1]=h+A,t[2]=M-d,t[3]=0,t[4]=h-A,t[5]=1-(s+m),t[6]=v+p,t[7]=0,t[8]=M+d,t[9]=v-p,t[10]=1-(s+l),t[11]=0,t[12]=r[0],t[13]=r[1],t[14]=r[2],t[15]=1,t},e.fromRotationTranslationScale=function(t,n,r,a){var e=n[0],u=n[1],o=n[2],i=n[3],c=e+e,f=u+u,s=o+o,h=e*c,M=e*f,l=e*s,v=u*f,m=u*s,p=o*s,d=i*c,A=i*f,R=i*s,w=a[0],q=a[1],Y=a[2];return t[0]=(1-(v+p))*w,t[1]=(M+R)*w,t[2]=(l-A)*w,t[3]=0,t[4]=(M-R)*q,t[5]=(1-(h+p))*q,t[6]=(m+d)*q,t[7]=0,t[8]=(l+A)*Y,t[9]=(m-d)*Y,t[10]=(1-(h+v))*Y,t[11]=0,t[12]=r[0],t[13]=r[1],t[14]=r[2],t[15]=1,t},e.fromRotationTranslationScaleOrigin=function(t,n,r,a,e){var u=n[0],o=n[1],i=n[2],c=n[3],f=u+u,s=o+o,h=i+i,M=u*f,l=u*s,v=u*h,m=o*s,p=o*h,d=i*h,A=c*f,R=c*s,w=c*h,q=a[0],Y=a[1],g=a[2],y=e[0],x=e[1],P=e[2];return t[0]=(1-(m+d))*q,t[1]=(l+w)*q,t[2]=(v-R)*q,t[3]=0,t[4]=(l-w)*Y,t[5]=(1-(M+d))*Y,t[6]=(p+A)*Y,t[7]=0,t[8]=(v+R)*g,t[9]=(p-A)*g,t[10]=(1-(M+m))*g,t[11]=0,t[12]=r[0]+y-(t[0]*y+t[4]*x+t[8]*P),t[13]=r[1]+x-(t[1]*y+t[5]*x+t[9]*P),t[14]=r[2]+P-(t[2]*y+t[6]*x+t[10]*P),t[15]=1,t},e.fromQuat=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=r+r,i=a+a,c=e+e,f=r*o,s=a*o,h=a*i,M=e*o,l=e*i,v=e*c,m=u*o,p=u*i,d=u*c;return t[0]=1-h-v,t[1]=s+d,t[2]=M-p,t[3]=0,t[4]=s-d,t[5]=1-f-v,t[6]=l+m,t[7]=0,t[8]=M+p,t[9]=l-m,t[10]=1-f-h,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},e.frustum=function(t,n,r,a,e,u,o){var i=1/(r-n),c=1/(e-a),f=1/(u-o);return t[0]=2*u*i,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=2*u*c,t[6]=0,t[7]=0,t[8]=(r+n)*i,t[9]=(e+a)*c,t[10]=(o+u)*f,t[11]=-1,t[12]=0,t[13]=0,t[14]=o*u*2*f,t[15]=0,t},e.perspective=function(t,n,r,a,e){var u=1/Math.tan(n/2),o=1/(a-e);return t[0]=u/r,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=u,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=(e+a)*o,t[11]=-1,t[12]=0,t[13]=0,t[14]=2*e*a*o,t[15]=0,t},e.perspectiveFromFieldOfView=function(t,n,r,a){var e=Math.tan(n.upDegrees*Math.PI/180),u=Math.tan(n.downDegrees*Math.PI/180),o=Math.tan(n.leftDegrees*Math.PI/180),i=Math.tan(n.rightDegrees*Math.PI/180),c=2/(o+i),f=2/(e+u);return t[0]=c,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=f,t[6]=0,t[7]=0,t[8]=-((o-i)*c*.5),t[9]=(e-u)*f*.5,t[10]=a/(r-a),t[11]=-1,t[12]=0,t[13]=0,t[14]=a*r/(r-a),t[15]=0,t},e.ortho=function(t,n,r,a,e,u,o){var i=1/(n-r),c=1/(a-e),f=1/(u-o);return t[0]=-2*i,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*c,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*f,t[11]=0,t[12]=(n+r)*i,t[13]=(e+a)*c,t[14]=(o+u)*f,t[15]=1,t},e.lookAt=function(t,n,r,u){var o,i,c,f,s,h,M,l,v,m,p=n[0],d=n[1],A=n[2],R=u[0],w=u[1],q=u[2],Y=r[0],g=r[1],y=r[2];return Math.abs(p-Y)<a.EPSILON&&Math.abs(d-g)<a.EPSILON&&Math.abs(A-y)<a.EPSILON?e.identity(t):(M=p-Y,l=d-g,v=A-y,m=1/Math.sqrt(M*M+l*l+v*v),M*=m,l*=m,v*=m,o=w*v-q*l,i=q*M-R*v,c=R*l-w*M,m=Math.sqrt(o*o+i*i+c*c),m?(m=1/m,o*=m,i*=m,c*=m):(o=0,i=0,c=0),f=l*c-v*i,s=v*o-M*c,h=M*i-l*o,m=Math.sqrt(f*f+s*s+h*h),m?(m=1/m,f*=m,s*=m,h*=m):(f=0,s=0,h=0),t[0]=o,t[1]=f,t[2]=M,t[3]=0,t[4]=i,t[5]=s,t[6]=l,t[7]=0,t[8]=c,t[9]=h,t[10]=v,t[11]=0,t[12]=-(o*p+i*d+c*A),t[13]=-(f*p+s*d+h*A),t[14]=-(M*p+l*d+v*A),t[15]=1,t)},e.str=function(t){return"mat4("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+", "+t[8]+", "+t[9]+", "+t[10]+", "+t[11]+", "+t[12]+", "+t[13]+", "+t[14]+", "+t[15]+")"},e.frob=function(t){return Math.sqrt(Math.pow(t[0],2)+Math.pow(t[1],2)+Math.pow(t[2],2)+Math.pow(t[3],2)+Math.pow(t[4],2)+Math.pow(t[5],2)+Math.pow(t[6],2)+Math.pow(t[7],2)+Math.pow(t[8],2)+Math.pow(t[9],2)+Math.pow(t[10],2)+Math.pow(t[11],2)+Math.pow(t[12],2)+Math.pow(t[13],2)+Math.pow(t[14],2)+Math.pow(t[15],2))},t.exports=e},function(t,n,r){var a=r(1),e=r(4),u=r(7),o=r(8),i={};i.create=function(){var t=new a.ARRAY_TYPE(4);return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t},i.rotationTo=function(){var t=u.create(),n=u.fromValues(1,0,0),r=u.fromValues(0,1,0);return function(a,e,o){var c=u.dot(e,o);return-.999999>c?(u.cross(t,n,e),u.length(t)<1e-6&&u.cross(t,r,e),u.normalize(t,t),i.setAxisAngle(a,t,Math.PI),a):c>.999999?(a[0]=0,a[1]=0,a[2]=0,a[3]=1,a):(u.cross(t,e,o),a[0]=t[0],a[1]=t[1],a[2]=t[2],a[3]=1+c,i.normalize(a,a))}}(),i.setAxes=function(){var t=e.create();return function(n,r,a,e){return t[0]=a[0],t[3]=a[1],t[6]=a[2],t[1]=e[0],t[4]=e[1],t[7]=e[2],t[2]=-r[0],t[5]=-r[1],t[8]=-r[2],i.normalize(n,i.fromMat3(n,t))}}(),i.clone=o.clone,i.fromValues=o.fromValues,i.copy=o.copy,i.set=o.set,i.identity=function(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t},i.setAxisAngle=function(t,n,r){r=.5*r;var a=Math.sin(r);return t[0]=a*n[0],t[1]=a*n[1],t[2]=a*n[2],t[3]=Math.cos(r),t},i.add=o.add,i.multiply=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3],i=r[0],c=r[1],f=r[2],s=r[3];return t[0]=a*s+o*i+e*f-u*c,t[1]=e*s+o*c+u*i-a*f,t[2]=u*s+o*f+a*c-e*i,t[3]=o*s-a*i-e*c-u*f,t},i.mul=i.multiply,i.scale=o.scale,i.rotateX=function(t,n,r){r*=.5;var a=n[0],e=n[1],u=n[2],o=n[3],i=Math.sin(r),c=Math.cos(r);return t[0]=a*c+o*i,t[1]=e*c+u*i,t[2]=u*c-e*i,t[3]=o*c-a*i,t},i.rotateY=function(t,n,r){r*=.5;var a=n[0],e=n[1],u=n[2],o=n[3],i=Math.sin(r),c=Math.cos(r);return t[0]=a*c-u*i,t[1]=e*c+o*i,t[2]=u*c+a*i,t[3]=o*c-e*i,t},i.rotateZ=function(t,n,r){r*=.5;var a=n[0],e=n[1],u=n[2],o=n[3],i=Math.sin(r),c=Math.cos(r);return t[0]=a*c+e*i,t[1]=e*c-a*i,t[2]=u*c+o*i,t[3]=o*c-u*i,t},i.calculateW=function(t,n){var r=n[0],a=n[1],e=n[2];return t[0]=r,t[1]=a,t[2]=e,t[3]=Math.sqrt(Math.abs(1-r*r-a*a-e*e)),t},i.dot=o.dot,i.lerp=o.lerp,i.slerp=function(t,n,r,a){var e,u,o,i,c,f=n[0],s=n[1],h=n[2],M=n[3],l=r[0],v=r[1],m=r[2],p=r[3];return u=f*l+s*v+h*m+M*p,0>u&&(u=-u,l=-l,v=-v,m=-m,p=-p),1-u>1e-6?(e=Math.acos(u),o=Math.sin(e),i=Math.sin((1-a)*e)/o,c=Math.sin(a*e)/o):(i=1-a,c=a),t[0]=i*f+c*l,t[1]=i*s+c*v,t[2]=i*h+c*m,t[3]=i*M+c*p,t},i.sqlerp=function(){var t=i.create(),n=i.create();return function(r,a,e,u,o,c){return i.slerp(t,a,o,c),i.slerp(n,e,u,c),i.slerp(r,t,n,2*c*(1-c)),r}}(),i.invert=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=r*r+a*a+e*e+u*u,i=o?1/o:0;return t[0]=-r*i,t[1]=-a*i,t[2]=-e*i,t[3]=u*i,t},i.conjugate=function(t,n){return t[0]=-n[0],t[1]=-n[1],t[2]=-n[2],t[3]=n[3],t},i.length=o.length,i.len=i.length,i.squaredLength=o.squaredLength,i.sqrLen=i.squaredLength,i.normalize=o.normalize,i.fromMat3=function(t,n){var r,a=n[0]+n[4]+n[8];if(a>0)r=Math.sqrt(a+1),t[3]=.5*r,r=.5/r,t[0]=(n[5]-n[7])*r,t[1]=(n[6]-n[2])*r,t[2]=(n[1]-n[3])*r;else{var e=0;n[4]>n[0]&&(e=1),n[8]>n[3*e+e]&&(e=2);var u=(e+1)%3,o=(e+2)%3;r=Math.sqrt(n[3*e+e]-n[3*u+u]-n[3*o+o]+1),t[e]=.5*r,r=.5/r,t[3]=(n[3*u+o]-n[3*o+u])*r,t[u]=(n[3*u+e]+n[3*e+u])*r,t[o]=(n[3*o+e]+n[3*e+o])*r}return t},i.str=function(t){return"quat("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},t.exports=i},function(t,n,r){var a=r(1),e={};e.create=function(){var t=new a.ARRAY_TYPE(3);return t[0]=0,t[1]=0,t[2]=0,t},e.clone=function(t){var n=new a.ARRAY_TYPE(3);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n},e.fromValues=function(t,n,r){var e=new a.ARRAY_TYPE(3);return e[0]=t,e[1]=n,e[2]=r,e},e.copy=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t},e.set=function(t,n,r,a){return t[0]=n,t[1]=r,t[2]=a,t},e.add=function(t,n,r){return t[0]=n[0]+r[0],t[1]=n[1]+r[1],t[2]=n[2]+r[2],t},e.subtract=function(t,n,r){return t[0]=n[0]-r[0],t[1]=n[1]-r[1],t[2]=n[2]-r[2],t},e.sub=e.subtract,e.multiply=function(t,n,r){return t[0]=n[0]*r[0],t[1]=n[1]*r[1],t[2]=n[2]*r[2],t},e.mul=e.multiply,e.divide=function(t,n,r){return t[0]=n[0]/r[0],t[1]=n[1]/r[1],t[2]=n[2]/r[2],t},e.div=e.divide,e.min=function(t,n,r){return t[0]=Math.min(n[0],r[0]),t[1]=Math.min(n[1],r[1]),t[2]=Math.min(n[2],r[2]),t},e.max=function(t,n,r){return t[0]=Math.max(n[0],r[0]),t[1]=Math.max(n[1],r[1]),t[2]=Math.max(n[2],r[2]),t},e.scale=function(t,n,r){return t[0]=n[0]*r,t[1]=n[1]*r,t[2]=n[2]*r,t},e.scaleAndAdd=function(t,n,r,a){return t[0]=n[0]+r[0]*a,t[1]=n[1]+r[1]*a,t[2]=n[2]+r[2]*a,t},e.distance=function(t,n){var r=n[0]-t[0],a=n[1]-t[1],e=n[2]-t[2];return Math.sqrt(r*r+a*a+e*e)},e.dist=e.distance,e.squaredDistance=function(t,n){var r=n[0]-t[0],a=n[1]-t[1],e=n[2]-t[2];return r*r+a*a+e*e},e.sqrDist=e.squaredDistance,e.length=function(t){var n=t[0],r=t[1],a=t[2];return Math.sqrt(n*n+r*r+a*a)},e.len=e.length,e.squaredLength=function(t){var n=t[0],r=t[1],a=t[2];return n*n+r*r+a*a},e.sqrLen=e.squaredLength,e.negate=function(t,n){return t[0]=-n[0],t[1]=-n[1],t[2]=-n[2],t},e.inverse=function(t,n){return t[0]=1/n[0],t[1]=1/n[1],t[2]=1/n[2],t},e.normalize=function(t,n){var r=n[0],a=n[1],e=n[2],u=r*r+a*a+e*e;return u>0&&(u=1/Math.sqrt(u),t[0]=n[0]*u,t[1]=n[1]*u,t[2]=n[2]*u),t},e.dot=function(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]},e.cross=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=r[0],i=r[1],c=r[2];return t[0]=e*c-u*i,t[1]=u*o-a*c,t[2]=a*i-e*o,t},e.lerp=function(t,n,r,a){var e=n[0],u=n[1],o=n[2];return t[0]=e+a*(r[0]-e),t[1]=u+a*(r[1]-u),t[2]=o+a*(r[2]-o),t},e.hermite=function(t,n,r,a,e,u){var o=u*u,i=o*(2*u-3)+1,c=o*(u-2)+u,f=o*(u-1),s=o*(3-2*u);return t[0]=n[0]*i+r[0]*c+a[0]*f+e[0]*s,t[1]=n[1]*i+r[1]*c+a[1]*f+e[1]*s,t[2]=n[2]*i+r[2]*c+a[2]*f+e[2]*s,t},e.bezier=function(t,n,r,a,e,u){var o=1-u,i=o*o,c=u*u,f=i*o,s=3*u*i,h=3*c*o,M=c*u;return t[0]=n[0]*f+r[0]*s+a[0]*h+e[0]*M,t[1]=n[1]*f+r[1]*s+a[1]*h+e[1]*M,t[2]=n[2]*f+r[2]*s+a[2]*h+e[2]*M,t},e.random=function(t,n){n=n||1;var r=2*a.RANDOM()*Math.PI,e=2*a.RANDOM()-1,u=Math.sqrt(1-e*e)*n;return t[0]=Math.cos(r)*u,t[1]=Math.sin(r)*u,t[2]=e*n,t},e.transformMat4=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=r[3]*a+r[7]*e+r[11]*u+r[15];return o=o||1,t[0]=(r[0]*a+r[4]*e+r[8]*u+r[12])/o,t[1]=(r[1]*a+r[5]*e+r[9]*u+r[13])/o,t[2]=(r[2]*a+r[6]*e+r[10]*u+r[14])/o,t},e.transformMat3=function(t,n,r){var a=n[0],e=n[1],u=n[2];return t[0]=a*r[0]+e*r[3]+u*r[6],t[1]=a*r[1]+e*r[4]+u*r[7],t[2]=a*r[2]+e*r[5]+u*r[8],t},e.transformQuat=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=r[0],i=r[1],c=r[2],f=r[3],s=f*a+i*u-c*e,h=f*e+c*a-o*u,M=f*u+o*e-i*a,l=-o*a-i*e-c*u;return t[0]=s*f+l*-o+h*-c-M*-i,t[1]=h*f+l*-i+M*-o-s*-c,t[2]=M*f+l*-c+s*-i-h*-o,t},e.rotateX=function(t,n,r,a){var e=[],u=[];return e[0]=n[0]-r[0],e[1]=n[1]-r[1],e[2]=n[2]-r[2],u[0]=e[0],u[1]=e[1]*Math.cos(a)-e[2]*Math.sin(a),u[2]=e[1]*Math.sin(a)+e[2]*Math.cos(a),t[0]=u[0]+r[0],t[1]=u[1]+r[1],t[2]=u[2]+r[2],t},e.rotateY=function(t,n,r,a){var e=[],u=[];return e[0]=n[0]-r[0],e[1]=n[1]-r[1],e[2]=n[2]-r[2],u[0]=e[2]*Math.sin(a)+e[0]*Math.cos(a),u[1]=e[1],u[2]=e[2]*Math.cos(a)-e[0]*Math.sin(a),t[0]=u[0]+r[0],t[1]=u[1]+r[1],t[2]=u[2]+r[2],t},e.rotateZ=function(t,n,r,a){var e=[],u=[];return e[0]=n[0]-r[0],e[1]=n[1]-r[1],e[2]=n[2]-r[2],u[0]=e[0]*Math.cos(a)-e[1]*Math.sin(a),u[1]=e[0]*Math.sin(a)+e[1]*Math.cos(a),u[2]=e[2],t[0]=u[0]+r[0],t[1]=u[1]+r[1],t[2]=u[2]+r[2],t},e.forEach=function(){var t=e.create();return function(n,r,a,e,u,o){var i,c;for(r||(r=3),a||(a=0),c=e?Math.min(e*r+a,n.length):n.length,i=a;c>i;i+=r)t[0]=n[i],t[1]=n[i+1],t[2]=n[i+2],u(t,t,o),n[i]=t[0],n[i+1]=t[1],n[i+2]=t[2];return n}}(),e.angle=function(t,n){var r=e.fromValues(t[0],t[1],t[2]),a=e.fromValues(n[0],n[1],n[2]);e.normalize(r,r),e.normalize(a,a);var u=e.dot(r,a);return u>1?0:Math.acos(u)},e.str=function(t){return"vec3("+t[0]+", "+t[1]+", "+t[2]+")"},t.exports=e},function(t,n,r){var a=r(1),e={};e.create=function(){var t=new a.ARRAY_TYPE(4);return t[0]=0,t[1]=0,t[2]=0,t[3]=0,t},e.clone=function(t){var n=new a.ARRAY_TYPE(4);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n},e.fromValues=function(t,n,r,e){var u=new a.ARRAY_TYPE(4);return u[0]=t,u[1]=n,u[2]=r,u[3]=e,u},e.copy=function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t},e.set=function(t,n,r,a,e){return t[0]=n,t[1]=r,t[2]=a,t[3]=e,t},e.add=function(t,n,r){return t[0]=n[0]+r[0],t[1]=n[1]+r[1],t[2]=n[2]+r[2],t[3]=n[3]+r[3],t},e.subtract=function(t,n,r){return t[0]=n[0]-r[0],t[1]=n[1]-r[1],t[2]=n[2]-r[2],t[3]=n[3]-r[3],t},e.sub=e.subtract,e.multiply=function(t,n,r){return t[0]=n[0]*r[0],t[1]=n[1]*r[1],t[2]=n[2]*r[2],t[3]=n[3]*r[3],t},e.mul=e.multiply,e.divide=function(t,n,r){return t[0]=n[0]/r[0],t[1]=n[1]/r[1],t[2]=n[2]/r[2],t[3]=n[3]/r[3],t},e.div=e.divide,e.min=function(t,n,r){return t[0]=Math.min(n[0],r[0]),t[1]=Math.min(n[1],r[1]),t[2]=Math.min(n[2],r[2]),t[3]=Math.min(n[3],r[3]),t},e.max=function(t,n,r){return t[0]=Math.max(n[0],r[0]),t[1]=Math.max(n[1],r[1]),t[2]=Math.max(n[2],r[2]),t[3]=Math.max(n[3],r[3]),t},e.scale=function(t,n,r){return t[0]=n[0]*r,t[1]=n[1]*r,t[2]=n[2]*r,t[3]=n[3]*r,t},e.scaleAndAdd=function(t,n,r,a){return t[0]=n[0]+r[0]*a,t[1]=n[1]+r[1]*a,t[2]=n[2]+r[2]*a,t[3]=n[3]+r[3]*a,t},e.distance=function(t,n){var r=n[0]-t[0],a=n[1]-t[1],e=n[2]-t[2],u=n[3]-t[3];return Math.sqrt(r*r+a*a+e*e+u*u)},e.dist=e.distance,e.squaredDistance=function(t,n){var r=n[0]-t[0],a=n[1]-t[1],e=n[2]-t[2],u=n[3]-t[3];return r*r+a*a+e*e+u*u},e.sqrDist=e.squaredDistance,e.length=function(t){var n=t[0],r=t[1],a=t[2],e=t[3];return Math.sqrt(n*n+r*r+a*a+e*e)},e.len=e.length,e.squaredLength=function(t){var n=t[0],r=t[1],a=t[2],e=t[3];return n*n+r*r+a*a+e*e},e.sqrLen=e.squaredLength,e.negate=function(t,n){return t[0]=-n[0],t[1]=-n[1],t[2]=-n[2],t[3]=-n[3],t},e.inverse=function(t,n){return t[0]=1/n[0],t[1]=1/n[1],t[2]=1/n[2],t[3]=1/n[3],t},e.normalize=function(t,n){var r=n[0],a=n[1],e=n[2],u=n[3],o=r*r+a*a+e*e+u*u;return o>0&&(o=1/Math.sqrt(o),t[0]=r*o,t[1]=a*o,t[2]=e*o,t[3]=u*o),t},e.dot=function(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]+t[3]*n[3]},e.lerp=function(t,n,r,a){var e=n[0],u=n[1],o=n[2],i=n[3];return t[0]=e+a*(r[0]-e),t[1]=u+a*(r[1]-u),t[2]=o+a*(r[2]-o),t[3]=i+a*(r[3]-i),t},e.random=function(t,n){return n=n||1,t[0]=a.RANDOM(),t[1]=a.RANDOM(),t[2]=a.RANDOM(),t[3]=a.RANDOM(),e.normalize(t,t),e.scale(t,t,n),t},e.transformMat4=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=n[3];return t[0]=r[0]*a+r[4]*e+r[8]*u+r[12]*o,t[1]=r[1]*a+r[5]*e+r[9]*u+r[13]*o,t[2]=r[2]*a+r[6]*e+r[10]*u+r[14]*o,t[3]=r[3]*a+r[7]*e+r[11]*u+r[15]*o,t},e.transformQuat=function(t,n,r){var a=n[0],e=n[1],u=n[2],o=r[0],i=r[1],c=r[2],f=r[3],s=f*a+i*u-c*e,h=f*e+c*a-o*u,M=f*u+o*e-i*a,l=-o*a-i*e-c*u;return t[0]=s*f+l*-o+h*-c-M*-i,t[1]=h*f+l*-i+M*-o-s*-c,t[2]=M*f+l*-c+s*-i-h*-o,t[3]=n[3],t},e.forEach=function(){var t=e.create();return function(n,r,a,e,u,o){var i,c;for(r||(r=4),a||(a=0),c=e?Math.min(e*r+a,n.length):n.length,i=a;c>i;i+=r)t[0]=n[i],t[1]=n[i+1],t[2]=n[i+2],t[3]=n[i+3],u(t,t,o),n[i]=t[0],n[i+1]=t[1],n[i+2]=t[2],n[i+3]=t[3];return n}}(),e.str=function(t){return"vec4("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},t.exports=e},function(t,n,r){var a=r(1),e={};e.create=function(){var t=new a.ARRAY_TYPE(2);return t[0]=0,t[1]=0,t},e.clone=function(t){var n=new a.ARRAY_TYPE(2);return n[0]=t[0],n[1]=t[1],n},e.fromValues=function(t,n){var r=new a.ARRAY_TYPE(2);return r[0]=t,r[1]=n,r},e.copy=function(t,n){return t[0]=n[0],t[1]=n[1],t},e.set=function(t,n,r){return t[0]=n,t[1]=r,t},e.add=function(t,n,r){return t[0]=n[0]+r[0],t[1]=n[1]+r[1],t},e.subtract=function(t,n,r){return t[0]=n[0]-r[0],t[1]=n[1]-r[1],t},e.sub=e.subtract,e.multiply=function(t,n,r){return t[0]=n[0]*r[0],t[1]=n[1]*r[1],t},e.mul=e.multiply,e.divide=function(t,n,r){return t[0]=n[0]/r[0],t[1]=n[1]/r[1],t},e.div=e.divide,e.min=function(t,n,r){return t[0]=Math.min(n[0],r[0]),t[1]=Math.min(n[1],r[1]),t},e.max=function(t,n,r){return t[0]=Math.max(n[0],r[0]),t[1]=Math.max(n[1],r[1]),t},e.scale=function(t,n,r){return t[0]=n[0]*r,t[1]=n[1]*r,t},e.scaleAndAdd=function(t,n,r,a){return t[0]=n[0]+r[0]*a,t[1]=n[1]+r[1]*a,t},e.distance=function(t,n){var r=n[0]-t[0],a=n[1]-t[1];return Math.sqrt(r*r+a*a)},e.dist=e.distance,e.squaredDistance=function(t,n){var r=n[0]-t[0],a=n[1]-t[1];return r*r+a*a},e.sqrDist=e.squaredDistance,e.length=function(t){var n=t[0],r=t[1];return Math.sqrt(n*n+r*r)},e.len=e.length,e.squaredLength=function(t){var n=t[0],r=t[1];return n*n+r*r},e.sqrLen=e.squaredLength,e.negate=function(t,n){return t[0]=-n[0],t[1]=-n[1],t},e.inverse=function(t,n){return t[0]=1/n[0],t[1]=1/n[1],t},e.normalize=function(t,n){var r=n[0],a=n[1],e=r*r+a*a;return e>0&&(e=1/Math.sqrt(e),t[0]=n[0]*e,t[1]=n[1]*e),t},e.dot=function(t,n){return t[0]*n[0]+t[1]*n[1]},e.cross=function(t,n,r){var a=n[0]*r[1]-n[1]*r[0];return t[0]=t[1]=0,t[2]=a,t},e.lerp=function(t,n,r,a){var e=n[0],u=n[1];return t[0]=e+a*(r[0]-e),t[1]=u+a*(r[1]-u),t},e.random=function(t,n){n=n||1;var r=2*a.RANDOM()*Math.PI;return t[0]=Math.cos(r)*n,t[1]=Math.sin(r)*n,t},e.transformMat2=function(t,n,r){var a=n[0],e=n[1];return t[0]=r[0]*a+r[2]*e,t[1]=r[1]*a+r[3]*e,t},e.transformMat2d=function(t,n,r){var a=n[0],e=n[1];return t[0]=r[0]*a+r[2]*e+r[4],t[1]=r[1]*a+r[3]*e+r[5],t},e.transformMat3=function(t,n,r){var a=n[0],e=n[1];return t[0]=r[0]*a+r[3]*e+r[6],t[1]=r[1]*a+r[4]*e+r[7],t},e.transformMat4=function(t,n,r){var a=n[0],e=n[1];return t[0]=r[0]*a+r[4]*e+r[12],t[1]=r[1]*a+r[5]*e+r[13],t},e.forEach=function(){var t=e.create();return function(n,r,a,e,u,o){var i,c;for(r||(r=2),a||(a=0),c=e?Math.min(e*r+a,n.length):n.length,i=a;c>i;i+=r)t[0]=n[i],t[1]=n[i+1],u(t,t,o),n[i]=t[0],n[i+1]=t[1];return n}}(),e.str=function(t){return"vec2("+t[0]+", "+t[1]+")"},t.exports=e}])});'use strict';(function(global){if(tr.isNode){const glMatrixAbsPath=HTMLImportsLoader.hrefToAbsolutePath('/gl-matrix-min.js');const glMatrixModule=require(glMatrixAbsPath);for(const exportName in glMatrixModule){global[exportName]=glMatrixModule[exportName];}}})(this);'use strict';tr.exportTo('tr.b.math',function(){const PREFERRED_NUMBER_SERIES_MULTIPLIERS=[1,2,5,10];function approximately(x,y,delta){if(delta===undefined)delta=1e-9;return Math.abs(x-y)<delta;}
+function clamp(x,lo,hi){return Math.min(Math.max(x,lo),hi);}
+function lerp(percentage,lo,hi){const range=hi-lo;return lo+percentage*range;}
+function normalize(value,lo,hi){return(value-lo)/(hi-lo);}
+function deg2rad(deg){return(Math.PI*deg)/180.0;}
+function erf(x){const sign=(x>=0)?1:-1;x=Math.abs(x);const a1=0.254829592;const a2=-0.284496736;const a3=1.421413741;const a4=-1.453152027;const a5=1.061405429;const p=0.3275911;const t=1.0/(1.0+p*x);const y=1.0-(((((a5*t+a4)*t)+a3)*t+a2)*t+a1)*t*Math.exp(-x*x);return sign*y;}
+const tmpVec2=vec2.create();const tmpVec2b=vec2.create();const tmpVec4=vec4.create();const tmpMat2d=mat2d.create();vec2.createFromArray=function(arr){if(arr.length!==2)throw new Error('Should be length 2');const v=vec2.create();vec2.set(v,arr[0],arr[1]);return v;};vec2.createXY=function(x,y){const v=vec2.create();vec2.set(v,x,y);return v;};vec2.toString=function(a){return'['+a[0]+', '+a[1]+']';};vec2.addTwoScaledUnitVectors=function(out,u1,scale1,u2,scale2){vec2.scale(tmpVec2,u1,scale1);vec2.scale(tmpVec2b,u2,scale2);vec2.add(out,tmpVec2,tmpVec2b);};vec2.interpolatePiecewiseFunction=function(points,x){if(x<points[0][0])return points[0][1];for(let i=1;i<points.length;++i){if(x<points[i][0]){const percent=normalize(x,points[i-1][0],points[i][0]);return lerp(percent,points[i-1][1],points[i][1]);}}
+return points[points.length-1][1];};vec3.createXYZ=function(x,y,z){const v=vec3.create();vec3.set(v,x,y,z);return v;};vec3.toString=function(a){return'vec3('+a[0]+', '+a[1]+', '+a[2]+')';};mat2d.translateXY=function(out,x,y){vec2.set(tmpVec2,x,y);mat2d.translate(out,out,tmpVec2);};mat2d.scaleXY=function(out,x,y){vec2.set(tmpVec2,x,y);mat2d.scale(out,out,tmpVec2);};vec4.unitize=function(out,a){out[0]=a[0]/a[3];out[1]=a[1]/a[3];out[2]=a[2]/a[3];out[3]=1;return out;};vec2.copyFromVec4=function(out,a){vec4.unitize(tmpVec4,a);vec2.copy(out,tmpVec4);};function logOrLog10(x,base){if(base===10)return Math.log10(x);return Math.log(x)/Math.log(base);}
+function lesserPower(x,opt_base){const base=opt_base||10;return Math.pow(base,Math.floor(logOrLog10(x,base)));}
+function greaterPower(x,opt_base){const base=opt_base||10;return Math.pow(base,Math.ceil(logOrLog10(x,base)));}
+function lesserWholeNumber(x){if(x===0)return 0;const pow10=(x<0)?-lesserPower(-x):lesserPower(x);return pow10*Math.floor(x/pow10);}
+function greaterWholeNumber(x){if(x===0)return 0;const pow10=(x<0)?-lesserPower(-x):lesserPower(x);return pow10*Math.ceil(x/pow10);}
+function preferredNumberLargerThanMin(min){const absMin=Math.abs(min);const conservativeGuess=tr.b.math.lesserPower(absMin);let minPreferedNumber=undefined;for(const multiplier of PREFERRED_NUMBER_SERIES_MULTIPLIERS){const tightenedGuess=conservativeGuess*multiplier;if(tightenedGuess>=absMin){minPreferedNumber=tightenedGuess;break;}}
+if(minPreferedNumber===undefined){throw new Error('Could not compute preferred number for '+min);}
+if(min<0)minPreferedNumber*=-1;return minPreferedNumber;}
+return{approximately,clamp,lerp,normalize,deg2rad,erf,lesserPower,greaterPower,lesserWholeNumber,greaterWholeNumber,preferredNumberLargerThanMin,};});'use strict';tr.exportTo('tr.b.math',function(){function Range(){this.isEmpty_=true;this.min_=undefined;this.max_=undefined;}
+Range.prototype={__proto__:Object.prototype,clone(){if(this.isEmpty)return new Range();return Range.fromExplicitRange(this.min_,this.max_);},reset(){this.isEmpty_=true;this.min_=undefined;this.max_=undefined;},get isEmpty(){return this.isEmpty_;},addRange(range){if(range.isEmpty)return;this.addValue(range.min);this.addValue(range.max);},addValue(value){if(this.isEmpty_){this.max_=value;this.min_=value;this.isEmpty_=false;return;}
+this.max_=Math.max(this.max_,value);this.min_=Math.min(this.min_,value);},set min(min){this.isEmpty_=false;this.min_=min;},get min(){if(this.isEmpty_)return undefined;return this.min_;},get max(){if(this.isEmpty_)return undefined;return this.max_;},set max(max){this.isEmpty_=false;this.max_=max;},get range(){if(this.isEmpty_)return undefined;return this.max_-this.min_;},get center(){return(this.min_+this.max_)*0.5;},get duration(){if(this.isEmpty_)return 0;return this.max_-this.min_;},enclosingPowers(opt_base){if(this.isEmpty)return new Range();return Range.fromExplicitRange(tr.b.math.lesserPower(this.min_,opt_base),tr.b.math.greaterPower(this.max_,opt_base));},normalize(x){return tr.b.math.normalize(x,this.min,this.max);},lerp(x){return tr.b.math.lerp(x,this.min,this.max);},clamp(x){return tr.b.math.clamp(x,this.min,this.max);},equals(that){if(this.isEmpty&&that.isEmpty)return true;if(this.isEmpty!==that.isEmpty)return false;return(tr.b.math.approximately(this.min,that.min)&&tr.b.math.approximately(this.max,that.max));},containsExplicitRangeInclusive(min,max){if(this.isEmpty)return false;return this.min_<=min&&max<=this.max_;},containsExplicitRangeExclusive(min,max){if(this.isEmpty)return false;return this.min_<min&&max<this.max_;},intersectsExplicitRangeInclusive(min,max){if(this.isEmpty)return false;return this.min_<=max&&min<=this.max_;},intersectsExplicitRangeExclusive(min,max){if(this.isEmpty)return false;return this.min_<max&&min<this.max_;},containsRangeInclusive(range){if(range.isEmpty)return false;return this.containsExplicitRangeInclusive(range.min_,range.max_);},containsRangeExclusive(range){if(range.isEmpty)return false;return this.containsExplicitRangeExclusive(range.min_,range.max_);},intersectsRangeInclusive(range){if(range.isEmpty)return false;return this.intersectsExplicitRangeInclusive(range.min_,range.max_);},intersectsRangeExclusive(range){if(range.isEmpty)return false;return this.intersectsExplicitRangeExclusive(range.min_,range.max_);},findExplicitIntersectionDuration(min,max){min=Math.max(this.min,min);max=Math.min(this.max,max);if(max<min)return 0;return max-min;},findIntersection(range){if(this.isEmpty||range.isEmpty)return new Range();const min=Math.max(this.min,range.min);const max=Math.min(this.max,range.max);if(max<min)return new Range();return Range.fromExplicitRange(min,max);},toJSON(){if(this.isEmpty_)return{isEmpty:true};return{isEmpty:false,max:this.max,min:this.min};},filterArray(array,opt_keyFunc,opt_this){if(this.isEmpty_)return[];function binSearch(test){let i0=0;let i1=array.length;while(i0<i1){const i=Math.trunc((i0+i1)/2);if(test(i)){i1=i;}else{i0=i+1;}}
+return i1;}
+const keyFunc=opt_keyFunc||tr.b.identity;function getValue(index){return keyFunc.call(opt_this,array[index]);}
+const first=binSearch(function(i){return this.min_===undefined||this.min_<=getValue(i);}.bind(this));const last=binSearch(function(i){return this.max_!==undefined&&this.max_<getValue(i);}.bind(this));return array.slice(first,last);}};Range.fromDict=function(d){if(d.isEmpty===true)return new Range();if(d.isEmpty===false){const range=new Range();range.min=d.min;range.max=d.max;return range;}
+throw new Error('Not a range');};Range.fromExplicitRange=function(min,max){const range=new Range();range.min=min;range.max=max;return range;};Range.compareByMinTimes=function(a,b){if(!a.isEmpty&&!b.isEmpty)return a.min_-b.min_;if(a.isEmpty&&!b.isEmpty)return-1;if(!a.isEmpty&&b.isEmpty)return 1;return 0;};Range.findDifference=function(rangeA,rangeB){if(!rangeA||rangeA.duration<0||!rangeB||rangeB.duration<0){throw new Error(`Couldn't subtract ranges`);}
+const resultRanges=[];if(rangeA.isEmpty)return resultRanges;if(rangeB.isEmpty)return[rangeA.clone()];const intersection=rangeA.findIntersection(rangeB);if(intersection.isEmpty){return[rangeA.clone()];}
+if(rangeA.duration===0&&rangeB.duration===0){if(intersection.empty)return[rangeA.clone()];else if(intersection.duration===0)return resultRanges;throw new Error(`Two points' intersection can only be a point or empty`);}
+const leftRange=tr.b.math.Range.fromExplicitRange(rangeA.min,intersection.min);if(leftRange.duration>0){resultRanges.push(leftRange);}
+const rightRange=tr.b.math.Range.fromExplicitRange(intersection.max,rangeA.max);if(rightRange.duration>0){resultRanges.push(rightRange);}
+return resultRanges;};Range.PERCENT_RANGE=Range.fromExplicitRange(0,1);Object.freeze(Range.PERCENT_RANGE);return{Range,};});'use strict';(function(exports){var rank={standard:function(array,key){array=array.sort(function(a,b){var x=a[key];var y=b[key];return((x<y)?-1:((x>y)?1:0));});for(var i=1;i<array.length+1;i++){array[i-1]['rank']=i;}
+return array;},fractional:function(array,key){array=this.standard(array,key);var pos=0;while(pos<array.length){var sum=0;var i=0;for(i=0;array[pos+i+1]&&(array[pos+i][key]===array[pos+i+1][key]);i++){sum+=array[pos+i]['rank'];}
+sum+=array[pos+i]['rank'];var endPos=pos+i+1;for(pos;pos<endPos;pos++){array[pos]['rank']=sum/(i+1);}
+pos=endPos;}
+return array;},rank:function(x,y){var nx=x.length,ny=y.length,combined=[],ranked;while(nx--){combined.push({set:'x',val:x[nx]});}
+while(ny--){combined.push({set:'y',val:y[ny]});}
+ranked=this.fractional(combined,'val');return ranked}};var erf=function erf(x){var cof=[-1.3026537197817094,6.4196979235649026e-1,1.9476473204185836e-2,-9.561514786808631e-3,-9.46595344482036e-4,3.66839497852761e-4,4.2523324806907e-5,-2.0278578112534e-5,-1.624290004647e-6,1.303655835580e-6,1.5626441722e-8,-8.5238095915e-8,6.529054439e-9,5.059343495e-9,-9.91364156e-10,-2.27365122e-10,9.6467911e-11,2.394038e-12,-6.886027e-12,8.94487e-13,3.13092e-13,-1.12708e-13,3.81e-16,7.106e-15,-1.523e-15,-9.4e-17,1.21e-16,-2.8e-17];var j=cof.length-1;var isneg=false;var d=0;var dd=0;var t,ty,tmp,res;if(x<0){x=-x;isneg=true;}
+t=2/(2+x);ty=4*t-2;for(;j>0;j--){tmp=d;d=ty*d-dd+cof[j];dd=tmp;}
+res=t*Math.exp(-x*x+0.5*(cof[0]+ty*d)-dd);return isneg?res-1:1-res;};var dnorm=function(x,mean,std){return 0.5*(1+erf((x-mean)/Math.sqrt(2*std*std)));}
+var statistic=function(x,y){var ranked=rank.rank(x,y),nr=ranked.length,nx=x.length,ny=y.length,ranksums={x:0,y:0},i=0,t=0,nt=1,tcf,ux,uy;while(i<nr){if(i>0){if(ranked[i].val==ranked[i-1].val){nt++;}else{if(nt>1){t+=Math.pow(nt,3)-nt
+nt=1;}}}
+ranksums[ranked[i].set]+=ranked[i].rank
+i++;}
+tcf=1-(t/(Math.pow(nr,3)-nr))
+ux=nx*ny+(nx*(nx+1)/2)-ranksums.x;uy=nx*ny-ux;return{tcf:tcf,ux:ux,uy:uy,big:Math.max(ux,uy),small:Math.min(ux,uy)}}
+exports.test=function(x,y,alt,corr){alt=typeof alt!=='undefined'?alt:'two-sided';corr=typeof corr!=='undefined'?corr:true;var nx=x.length,ny=y.length,f=1,u,mu,std,z,p;u=statistic(x,y);if(corr){mu=(nx*ny/2)+0.5;}else{mu=nx*ny/2;}
+std=Math.sqrt(u.tcf*nx*ny*(nx+ny+1)/12);if(alt=='less'){z=(u.ux-mu)/std;}else if(alt=='greater'){z=(u.uy-mu)/std;}else if(alt=='two-sided'){z=Math.abs((u.big-mu)/std);}else{console.log('Unknown alternative argument');}
+if(alt=='two-sided'){f=2;}
+p=dnorm(-z,0,1)*f;return{U:u.small,p:p};}})(typeof exports==='undefined'?this['mannwhitneyu']={}:exports);'use strict';(function(global){if(tr.isNode){const mwuAbsPath=HTMLImportsLoader.hrefToAbsolutePath('/mannwhitneyu.js');const mwuModule=require(mwuAbsPath);for(const exportName in mwuModule){global[exportName]=mwuModule[exportName];}}})(this);'use strict';tr.exportTo('tr.b.math',function(){const identity=x=>x;const Statistics={};Statistics.divideIfPossibleOrZero=function(numerator,denominator){if(denominator===0)return 0;return numerator/denominator;};Statistics.sum=function(ary,opt_func,opt_this){const func=opt_func||identity;let ret=0;let i=0;for(const elt of ary){ret+=func.call(opt_this,elt,i++);}
+return ret;};Statistics.mean=function(ary,opt_func,opt_this){const func=opt_func||identity;let sum=0;let i=0;for(const elt of ary){sum+=func.call(opt_this,elt,i++);}
+if(i===0)return undefined;return sum/i;};Statistics.geometricMean=function(ary,opt_func,opt_this){const func=opt_func||identity;let i=0;let logsum=0;for(const elt of ary){const x=func.call(opt_this,elt,i++);if(x<=0)return 0;logsum+=Math.log(Math.abs(x));}
+if(i===0)return 1;return Math.exp(logsum/i);};Statistics.weightedMean=function(ary,weightCallback,opt_valueCallback,opt_this){const valueCallback=opt_valueCallback||identity;let numerator=0;let denominator=0;let i=-1;for(const elt of ary){i++;const value=valueCallback.call(opt_this,elt,i);if(value===undefined)continue;const weight=weightCallback.call(opt_this,elt,i,value);numerator+=weight*value;denominator+=weight;}
+if(denominator===0)return undefined;return numerator/denominator;};Statistics.variance=function(ary,opt_func,opt_this){if(ary.length===0)return undefined;if(ary.length===1)return 0;const func=opt_func||identity;const mean=Statistics.mean(ary,func,opt_this);const sumOfSquaredDistances=Statistics.sum(ary,function(d,i){const v=func.call(this,d,i)-mean;return v*v;},opt_this);return sumOfSquaredDistances/(ary.length-1);};Statistics.stddev=function(ary,opt_func,opt_this){if(ary.length===0)return undefined;return Math.sqrt(Statistics.variance(ary,opt_func,opt_this));};Statistics.max=function(ary,opt_func,opt_this){const func=opt_func||identity;let ret=-Infinity;let i=0;for(const elt of ary){ret=Math.max(ret,func.call(opt_this,elt,i++));}
+return ret;};Statistics.min=function(ary,opt_func,opt_this){const func=opt_func||identity;let ret=Infinity;let i=0;for(const elt of ary){ret=Math.min(ret,func.call(opt_this,elt,i++));}
+return ret;};Statistics.range=function(ary,opt_func,opt_this){const func=opt_func||identity;const ret=new tr.b.math.Range();let i=0;for(const elt of ary){ret.addValue(func.call(opt_this,elt,i++));}
+return ret;};Statistics.percentile=function(ary,percent,opt_func,opt_this){if(!(percent>=0&&percent<=1)){throw new Error('percent must be [0,1]');}
+const func=opt_func||identity;const tmp=new Array(ary.length);let i=0;for(const elt of ary){tmp[i]=func.call(opt_this,elt,i++);}
+tmp.sort((a,b)=>a-b);const idx=Math.floor((ary.length-1)*percent);return tmp[idx];};Statistics.normalizeSamples=function(samples){if(samples.length===0){return{normalized_samples:samples,scale:1.0};}
+samples=samples.slice().sort(function(a,b){return a-b;});const low=Math.min.apply(null,samples);const high=Math.max.apply(null,samples);const newLow=0.5/samples.length;const newHigh=(samples.length-0.5)/samples.length;if(high-low===0.0){samples=Array.apply(null,new Array(samples.length)).map(function(){return 0.5;});return{normalized_samples:samples,scale:1.0};}
+const scale=(newHigh-newLow)/(high-low);for(let i=0;i<samples.length;i++){samples[i]=(samples[i]-low)*scale+newLow;}
+return{normalized_samples:samples,scale};};Statistics.discrepancy=function(samples,opt_locationCount){if(samples.length===0)return 0.0;let maxLocalDiscrepancy=0;const invSampleCount=1.0/samples.length;const locations=[];const countLess=[];const countLessEqual=[];if(opt_locationCount!==undefined){let sampleIndex=0;for(let i=0;i<opt_locationCount;i++){const location=i/(opt_locationCount-1);locations.push(location);while(sampleIndex<samples.length&&samples[sampleIndex]<location){sampleIndex+=1;}
+countLess.push(sampleIndex);while(sampleIndex<samples.length&&samples[sampleIndex]<=location){sampleIndex+=1;}
+countLessEqual.push(sampleIndex);}}else{if(samples[0]>0.0){locations.push(0.0);countLess.push(0);countLessEqual.push(0);}
+for(let i=0;i<samples.length;i++){locations.push(samples[i]);countLess.push(i);countLessEqual.push(i+1);}
+if(samples[-1]<1.0){locations.push(1.0);countLess.push(samples.length);countLessEqual.push(samples.length);}}
+let maxDiff=0;let minDiff=0;for(let i=1;i<locations.length;i++){const length=locations[i]-locations[i-1];const countClosed=countLessEqual[i]-countLess[i-1];const countOpen=countLess[i]-countLessEqual[i-1];const countClosedIncrement=countLessEqual[i]-countLessEqual[i-1];const countOpenIncrement=countLess[i]-countLess[i-1];maxDiff=Math.max(countClosedIncrement*invSampleCount-length+maxDiff,countClosed*invSampleCount-length);minDiff=Math.min(countOpenIncrement*invSampleCount-length+minDiff,countOpen*invSampleCount-length);maxLocalDiscrepancy=Math.max(maxDiff,-minDiff,maxLocalDiscrepancy);}
+return maxLocalDiscrepancy;};Statistics.timestampsDiscrepancy=function(timestamps,opt_absolute,opt_locationCount){if(timestamps.length===0)return 0.0;if(opt_absolute===undefined)opt_absolute=true;if(Array.isArray(timestamps[0])){const rangeDiscrepancies=timestamps.map(function(r){return Statistics.timestampsDiscrepancy(r);});return Math.max.apply(null,rangeDiscrepancies);}
+const s=Statistics.normalizeSamples(timestamps);const samples=s.normalized_samples;const sampleScale=s.scale;let discrepancy=Statistics.discrepancy(samples,opt_locationCount);const invSampleCount=1.0/samples.length;if(opt_absolute===true){discrepancy/=sampleScale;}else{discrepancy=tr.b.math.clamp((discrepancy-invSampleCount)/(1.0-invSampleCount),0.0,1.0);}
+return discrepancy;};Statistics.durationsDiscrepancy=function(durations,opt_absolute,opt_locationCount){if(durations.length===0)return 0.0;const timestamps=durations.reduce(function(prev,curr,index,array){prev.push(prev[prev.length-1]+curr);return prev;},[0]);return Statistics.timestampsDiscrepancy(timestamps,opt_absolute,opt_locationCount);};Statistics.uniformlySampleArray=function(samples,count){if(samples.length<=count){return samples;}
+while(samples.length>count){const i=parseInt(Math.random()*samples.length);samples.splice(i,1);}
+return samples;};Statistics.uniformlySampleStream=function(samples,streamLength,newElement,numSamples){if(streamLength<=numSamples){if(samples.length>=streamLength){samples[streamLength-1]=newElement;}else{samples.push(newElement);}
+return;}
+const probToKeep=numSamples/streamLength;if(Math.random()>probToKeep)return;const index=Math.floor(Math.random()*numSamples);samples[index]=newElement;};Statistics.mergeSampledStreams=function(samplesA,streamLengthA,samplesB,streamLengthB,numSamples){if(streamLengthB<numSamples){const nbElements=Math.min(streamLengthB,samplesB.length);for(let i=0;i<nbElements;++i){Statistics.uniformlySampleStream(samplesA,streamLengthA+i+1,samplesB[i],numSamples);}
+return;}
+if(streamLengthA<numSamples){const nbElements=Math.min(streamLengthA,samplesA.length);const tempSamples=samplesB.slice();for(let i=0;i<nbElements;++i){Statistics.uniformlySampleStream(tempSamples,streamLengthB+i+1,samplesA[i],numSamples);}
+for(let i=0;i<tempSamples.length;++i){samplesA[i]=tempSamples[i];}
+return;}
+const nbElements=Math.min(numSamples,samplesB.length);const probOfSwapping=streamLengthB/(streamLengthA+streamLengthB);for(let i=0;i<nbElements;++i){if(Math.random()<probOfSwapping){samplesA[i]=samplesB[i];}}};function Distribution(){}
+Distribution.prototype={computeDensity(x){throw Error('Not implemented');},computePercentile(x){throw Error('Not implemented');},computeComplementaryPercentile(x){return 1-this.computePercentile(x);},get mean(){throw Error('Not implemented');},get mode(){throw Error('Not implemented');},get median(){throw Error('Not implemented');},get standardDeviation(){throw Error('Not implemented');},get variance(){throw Error('Not implemented');}};Statistics.UniformDistribution=function(opt_range){if(!opt_range)opt_range=tr.b.math.Range.fromExplicitRange(0,1);this.range=opt_range;};Statistics.UniformDistribution.prototype={__proto__:Distribution.prototype,computeDensity(x){return 1/this.range.range;},computePercentile(x){return tr.b.math.normalize(x,this.range.min,this.range.max);},get mean(){return this.range.center;},get mode(){return undefined;},get median(){return this.mean;},get standardDeviation(){return Math.sqrt(this.variance);},get variance(){return Math.pow(this.range.range,2)/12;}};Statistics.NormalDistribution=function(opt_mean,opt_variance){this.mean_=opt_mean||0;this.variance_=opt_variance||1;this.standardDeviation_=Math.sqrt(this.variance_);};Statistics.NormalDistribution.prototype={__proto__:Distribution.prototype,computeDensity(x){const scale=(1.0/(this.standardDeviation*Math.sqrt(2.0*Math.PI)));const exponent=-Math.pow(x-this.mean,2)/(2.0*this.variance);return scale*Math.exp(exponent);},computePercentile(x){const standardizedX=((x-this.mean)/Math.sqrt(2.0*this.variance));return(1.0+tr.b.math.erf(standardizedX))/2.0;},get mean(){return this.mean_;},get median(){return this.mean;},get mode(){return this.mean;},get standardDeviation(){return this.standardDeviation_;},get variance(){return this.variance_;}};Statistics.LogNormalDistribution=function(opt_location,opt_shape){this.normalDistribution_=new Statistics.NormalDistribution(opt_location,Math.pow(opt_shape||1,2));};Statistics.LogNormalDistribution.prototype={__proto__:Statistics.NormalDistribution.prototype,computeDensity(x){return this.normalDistribution_.computeDensity(Math.log(x))/x;},computePercentile(x){return this.normalDistribution_.computePercentile(Math.log(x));},get mean(){return Math.exp(this.normalDistribution_.mean+
+(this.normalDistribution_.variance/2));},get variance(){const nm=this.normalDistribution_.mean;const nv=this.normalDistribution_.variance;return(Math.exp(2*(nm+nv))-
+Math.exp(2*nm+nv));},get standardDeviation(){return Math.sqrt(this.variance);},get median(){return Math.exp(this.normalDistribution_.mean);},get mode(){return Math.exp(this.normalDistribution_.mean-
+this.normalDistribution_.variance);}};Statistics.LogNormalDistribution.fromMedianAndDiminishingReturns=function(median,diminishingReturns){diminishingReturns=Math.log(diminishingReturns/median);const shape=Math.sqrt(1-3*diminishingReturns-
+Math.sqrt(Math.pow(diminishingReturns-3,2)-8))/2;const location=Math.log(median);return new Statistics.LogNormalDistribution(location,shape);};Statistics.DEFAULT_ALPHA=0.01;Statistics.MAX_SUGGESTED_SAMPLE_SIZE=20;Statistics.Significance={SIGNIFICANT:'REJECT',INSIGNIFICANT:'FAIL_TO_REJECT',NEED_MORE_DATA:'NEED_MORE_DATA',DONT_CARE:'DONT_CARE',};Statistics.mwu=function(a,b,opt_alpha,opt_reqSampleSize){const result=mannwhitneyu.test(a,b);const alpha=opt_alpha||Statistics.DEFAULT_ALPHA;if(result.p<alpha){result.significance=Statistics.Significance.SIGNIFICANT;}else if(opt_reqSampleSize&&(a.length<opt_reqSampleSize||b.length<opt_reqSampleSize)){result.significance=Statistics.Significance.NEED_MORE_DATA;}else{result.significance=Statistics.Significance.INSIGNIFICANT;}
+return result;};return{Statistics,};});'use strict';const GREEK_SMALL_LETTER_MU=String.fromCharCode(956);tr.exportTo('tr.b',function(){const SECONDS_IN_A_MINUTE=60;const SECONDS_IN_AN_HOUR=SECONDS_IN_A_MINUTE*60;const SECONDS_IN_A_DAY=SECONDS_IN_AN_HOUR*24;const SECONDS_IN_A_WEEK=SECONDS_IN_A_DAY*7;const SECONDS_IN_A_YEAR=SECONDS_IN_A_DAY*365.2422;const SECONDS_IN_A_MONTH=SECONDS_IN_A_YEAR/12;const UnitPrefixScale={};const UnitScale={};function defineUnitPrefixScale(name,prefixes){if(UnitPrefixScale[name]!==undefined){throw new Error('Unit prefix scale \''+name+'\' already exists');}
+if(prefixes.AUTO!==undefined){throw new Error('The \'AUTO\' unit prefix is not supported for unit'+'prefix scales and cannot be added to scale \''+name+'\'');}
+UnitPrefixScale[name]=prefixes;}
+UnitScale.defineUnitScale=function(name,unitScale){if(UnitScale[name]!==undefined){throw new Error('Unit scale \''+name+'\' already exists');}
+if(unitScale.AUTO!==undefined){throw new Error('\'AUTO\' unit scale will be added automatically '+'for unit scale \''+name+'\'');}
+unitScale.AUTO=Object.values(unitScale);unitScale.AUTO.sort((a,b)=>a.value-b.value);if(name)UnitScale[name]=unitScale;return unitScale;};UnitScale.defineUnitScaleFromPrefixScale=function(baseSymbol,baseName,prefixScale,opt_scaleName){if(baseSymbol===undefined){throw new Error('Cannot create UnitScale with undefined baseSymbol.');}
+if(!baseName){throw new Error('Cannot create UnitScale without a baseName.');}
+if(!prefixScale){throw new Error('Cannot create UnitScale without a prefix scale.');}
+const unitScale={};for(const curPrefix of Object.keys(prefixScale)){const curScale=prefixScale[curPrefix];if(curScale.symbol===undefined||!curScale.value){throw new Error(`Cannot convert PrefixScale with malformed prefix ${curScale}.`);}
+const name=curPrefix==='NONE'?baseName:`${curPrefix}_${baseName}`;unitScale[name]={value:curScale.value,symbol:curScale.symbol+baseSymbol,baseSymbol};}
+return UnitScale.defineUnitScale(opt_scaleName,unitScale);};function convertUnit(value,fromScale,toScale){if(value===undefined)return undefined;const fromScaleBase=fromScale.baseSymbol;const toScaleBase=toScale.baseSymbol;if(fromScaleBase!==undefined&&toScaleBase!==undefined&&fromScaleBase!==toScaleBase){throw new Error('Cannot convert between units with different base symbols.');}
+return value*(fromScale.value/toScale.value);}
+defineUnitPrefixScale('BINARY',{NONE:{value:Math.pow(1024,0),symbol:''},KIBI:{value:Math.pow(1024,1),symbol:'Ki'},MEBI:{value:Math.pow(1024,2),symbol:'Mi'},GIBI:{value:Math.pow(1024,3),symbol:'Gi'},TEBI:{value:Math.pow(1024,4),symbol:'Ti'}});defineUnitPrefixScale('METRIC',{NANO:{value:1e-9,symbol:'n'},MICRO:{value:1e-6,symbol:GREEK_SMALL_LETTER_MU},MILLI:{value:1e-3,symbol:'m'},NONE:{value:1,symbol:''},KILO:{value:1e3,symbol:'k'},MEGA:{value:1e6,symbol:'M'},GIGA:{value:1e9,symbol:'G'}});UnitScale.defineUnitScale('TIME',{NANO_SEC:{value:1e-9,symbol:'ns',baseSymbol:'s'},MICRO_SEC:{value:1e-6,symbol:GREEK_SMALL_LETTER_MU+'s',baseSymbol:'s'},MILLI_SEC:{value:1e-3,symbol:'ms',baseSymbol:'s'},SEC:{value:1,symbol:'s',baseSymbol:'s'},MINUTE:{value:SECONDS_IN_A_MINUTE,symbol:'min',baseSymbol:'s'},HOUR:{value:SECONDS_IN_AN_HOUR,symbol:'hr',baseSymbol:'s'},DAY:{value:SECONDS_IN_A_DAY,symbol:'days',baseSymbol:'s'},WEEK:{value:SECONDS_IN_A_WEEK,symbol:'weeks',baseSymbol:'s'},MONTH:{value:SECONDS_IN_A_MONTH,symbol:'months',baseSymbol:'s'},YEAR:{value:SECONDS_IN_A_YEAR,symbol:'years',baseSymbol:'s'}});UnitScale.defineUnitScaleFromPrefixScale('B','BYTE',UnitPrefixScale.BINARY,'MEMORY');return{UnitPrefixScale,UnitScale,convertUnit,};});'use strict';tr.exportTo('tr.b',function(){const msDisplayMode={scale:1e-3,suffix:'ms',roundedLess(a,b){return Math.round(a*1000)<Math.round(b*1000);},formatSpec:{unitScale:[tr.b.UnitScale.TIME.MILLI_SEC],minimumFractionDigits:3,}};const nsDisplayMode={scale:1e-9,suffix:'ns',roundedLess(a,b){return Math.round(a*1000000)<Math.round(b*1000000);},formatSpec:{unitScale:[tr.b.UnitScale.TIME.NANO_SEC],maximumFractionDigits:0}};const TimeDisplayModes={ns:nsDisplayMode,ms:msDisplayMode};return{TimeDisplayModes,};});'use strict';tr.exportTo('tr.b',function(){function iterateElementDeeplyImpl(element,cb,thisArg,includeElement){if(includeElement&&cb.call(thisArg,element))return true;if(element.root&&element.root!==element&&iterateElementDeeplyImpl(element.root,cb,thisArg,false)){return true;}
+const children=Polymer.dom(element).children;for(let i=0;i<children.length;i++){if(iterateElementDeeplyImpl(children[i],cb,thisArg,true)){return true;}}
+return false;}
+function iterateElementDeeply(element,cb,thisArg){iterateElementDeeplyImpl(element,cb,thisArg,false);}
+function findDeepElementMatchingPredicate(element,predicate){let foundElement=undefined;function matches(element){const match=predicate(element);if(!match){return false;}
+foundElement=element;return true;}
+iterateElementDeeply(element,matches);return foundElement;}
+function findDeepElementsMatchingPredicate(element,predicate){const foundElements=[];function matches(element){const match=predicate(element);if(match){foundElements.push(element);}
+return false;}
+iterateElementDeeply(element,matches);return foundElements;}
+function findDeepElementMatching(element,selector){return findDeepElementMatchingPredicate(element,function(element){return element.matches(selector);});}
+function findDeepElementsMatching(element,selector){return findDeepElementsMatchingPredicate(element,function(element){return element.matches(selector);});}
+function findDeepElementWithTextContent(element,re){return findDeepElementMatchingPredicate(element,function(element){if(element.children.length!==0)return false;return re.test(Polymer.dom(element).textContent);});}
+return{iterateElementDeeply,findDeepElementMatching,findDeepElementsMatching,findDeepElementMatchingPredicate,findDeepElementsMatchingPredicate,findDeepElementWithTextContent,};});'use strict';tr.exportTo('tr.b',function(){const TimeDisplayModes=tr.b.TimeDisplayModes;const PLUS_MINUS_SIGN=String.fromCharCode(177);const CACHED_FORMATTERS={};function getNumberFormatter(minSpec,maxSpec,minCtx,maxCtx){const key=minSpec+'-'+maxSpec+'-'+minCtx+'-'+maxCtx;let formatter=CACHED_FORMATTERS[key];if(formatter===undefined){let minimumFractionDigits=minCtx!==undefined?minCtx:minSpec;let maximumFractionDigits=maxCtx!==undefined?maxCtx:maxSpec;if(minimumFractionDigits>maximumFractionDigits){if(minCtx!==undefined&&maxCtx===undefined){maximumFractionDigits=minimumFractionDigits;}else if(minCtx===undefined&&maxCtx!==undefined){minimumFractionDigits=maximumFractionDigits;}}
+formatter=new Intl.NumberFormat(undefined,{minimumFractionDigits,maximumFractionDigits,});CACHED_FORMATTERS[key]=formatter;}
+return formatter;}
+function max(a,b){if(a===undefined)return b;if(b===undefined)return a;return a.scale>b.scale?a:b;}
+const ImprovementDirection={DONT_CARE:0,BIGGER_IS_BETTER:1,SMALLER_IS_BETTER:2};function Unit(unitName,jsonName,scaleBaseUnit,isDelta,improvementDirection,formatSpec){this.unitName=unitName;this.jsonName=jsonName;this.scaleBaseUnit=scaleBaseUnit;this.isDelta=isDelta;this.improvementDirection=improvementDirection;this.formatSpec_=formatSpec;this.baseUnit=undefined;this.correspondingDeltaUnit=undefined;}
+Unit.prototype={asJSON(){return this.jsonName;},getUnitScale_(opt_context){let formatSpec=this.formatSpec_;let formatSpecWasFunction=false;if(typeof formatSpec==='function'){formatSpecWasFunction=true;formatSpec=formatSpec();}
+const context=opt_context||{};let scale=undefined;if(context.unitScale){scale=context.unitScale;}else if(context.unitPrefix){const symbol=formatSpec.baseSymbol?formatSpec.baseSymbol:this.scaleBaseUnit.baseSymbol;scale=tr.b.UnitScale.defineUnitScaleFromPrefixScale(symbol,symbol,[context.unitPrefix]).AUTO;}else{scale=formatSpec.unitScale;if(!scale){scale=[{value:1,symbol:formatSpec.baseSymbol||'',baseSymbol:formatSpec.baseSymbol||''}];if(!formatSpecWasFunction)formatSpec.unitScale=scale;}}
+if(!(scale instanceof Array)){throw new Error('Unit has a malformed unit scale.');}
+return scale;},get unitString(){const scale=this.getUnitScale_();if(!scale){throw new Error('A UnitScale could not be found for Unit '+this.unitName);}
+return scale[0].baseSymbol||scale[0].symbol;},format(value,opt_context){let signString='';if(value<0){signString='-';value=-value;}else if(this.isDelta){signString=value===0?PLUS_MINUS_SIGN:'+';}
+const context=opt_context||{};const scale=this.getUnitScale_(context);let deltaValue=context.deltaValue===undefined?value:context.deltaValue;deltaValue=Math.abs(deltaValue)*this.scaleBaseUnit.value;let i=0;while(i<scale.length-1&&deltaValue/scale[i+1].value>=1){i++;}
+const selectedSubUnit=scale[i];let formatSpec=this.formatSpec_;if(typeof formatSpec==='function')formatSpec=formatSpec();let unitString='';if(selectedSubUnit.symbol){if(!formatSpec.avoidSpacePrecedingUnit)unitString=' ';unitString+=selectedSubUnit.symbol;}
+value=tr.b.convertUnit(value,this.scaleBaseUnit,selectedSubUnit);const numberString=getNumberFormatter(formatSpec.minimumFractionDigits,formatSpec.maximumFractionDigits,context.minimumFractionDigits,context.maximumFractionDigits).format(value);return signString+numberString+unitString;}};Unit.reset=function(){Unit.currentTimeDisplayMode=TimeDisplayModes.ms;};Unit.timestampFromUs=function(us){return tr.b.convertUnit(us,tr.b.UnitPrefixScale.METRIC.MICRO,tr.b.UnitPrefixScale.METRIC.MILLI);};Object.defineProperty(Unit,'currentTimeDisplayMode',{get(){return Unit.currentTimeDisplayMode_;},set(value){if(Unit.currentTimeDisplayMode_===value)return;Unit.currentTimeDisplayMode_=value;Unit.dispatchEvent(new tr.b.Event('display-mode-changed'));}});Unit.didPreferredTimeDisplayUnitChange=function(){let largest=undefined;const els=tr.b.findDeepElementsMatching(document.body,'tr-v-ui-preferred-display-unit');els.forEach(function(el){largest=max(largest,el.preferredTimeDisplayMode);});Unit.currentTimeDisplayMode=largest===undefined?TimeDisplayModes.ms:largest;};Unit.byName={};Unit.byJSONName={};Unit.fromJSON=function(object){const u=Unit.byJSONName[object];if(u){return u;}
+throw new Error('Unrecognized unit');};Unit.define=function(params){const definedUnits=[];for(const improvementDirection of Object.values(ImprovementDirection)){const regularUnit=Unit.defineUnitVariant_(params,false,improvementDirection);const deltaUnit=Unit.defineUnitVariant_(params,true,improvementDirection);regularUnit.correspondingDeltaUnit=deltaUnit;deltaUnit.correspondingDeltaUnit=deltaUnit;definedUnits.push(regularUnit,deltaUnit);}
+const baseUnit=Unit.byName[params.baseUnitName];definedUnits.forEach(u=>u.baseUnit=baseUnit);};Unit.nameSuffixForImprovementDirection=function(improvementDirection){switch(improvementDirection){case ImprovementDirection.DONT_CARE:return'';case ImprovementDirection.BIGGER_IS_BETTER:return'_biggerIsBetter';case ImprovementDirection.SMALLER_IS_BETTER:return'_smallerIsBetter';default:throw new Error('Unknown improvement direction: '+improvementDirection);}};Unit.defineUnitVariant_=function(params,isDelta,improvementDirection){let nameSuffix=isDelta?'Delta':'';nameSuffix+=Unit.nameSuffixForImprovementDirection(improvementDirection);const unitName=params.baseUnitName+nameSuffix;const jsonName=params.baseJsonName+nameSuffix;if(Unit.byName[unitName]!==undefined){throw new Error('Unit \''+unitName+'\' already exists');}
+if(Unit.byJSONName[jsonName]!==undefined){throw new Error('JSON unit \''+jsonName+'\' alread exists');}
+let scaleBaseUnit=params.scaleBaseUnit;if(!scaleBaseUnit){let formatSpec=params.formatSpec;if(typeof formatSpec==='function')formatSpec=formatSpec();const baseSymbol=formatSpec.unitScale?formatSpec.unitScale[0].baseSymbol:(formatSpec.baseSymbol||'');scaleBaseUnit={value:1,symbol:baseSymbol,baseSymbol};}
+const unit=new Unit(unitName,jsonName,scaleBaseUnit,isDelta,improvementDirection,params.formatSpec);Unit.byName[unitName]=unit;Unit.byJSONName[jsonName]=unit;return unit;};tr.b.EventTarget.decorate(Unit);Unit.reset();Unit.define({baseUnitName:'timeInMsAutoFormat',baseJsonName:'msBestFitFormat',scaleBaseUnit:tr.b.UnitScale.TIME.MILLI_SEC,formatSpec:{unitScale:tr.b.UnitScale.TIME.AUTO,minimumFractionDigits:0,maximumFractionDigits:3}});Unit.define({baseUnitName:'timeDurationInMs',baseJsonName:'ms',scaleBaseUnit:tr.b.UnitScale.TIME.MILLI_SEC,formatSpec(){return Unit.currentTimeDisplayMode_.formatSpec;}});Unit.define({baseUnitName:'timeStampInMs',baseJsonName:'tsMs',scaleBaseUnit:tr.b.UnitScale.TIME.MILLI_SEC,formatSpec(){return Unit.currentTimeDisplayMode_.formatSpec;}});Unit.define({baseUnitName:'normalizedPercentage',baseJsonName:'n%',formatSpec:{unitScale:[{value:0.01,symbol:'%'}],avoidSpacePrecedingUnit:true,minimumFractionDigits:3,maximumFractionDigits:3}});Unit.define({baseUnitName:'sizeInBytes',baseJsonName:'sizeInBytes',formatSpec:{unitScale:tr.b.UnitScale.MEMORY.AUTO,minimumFractionDigits:1,maximumFractionDigits:1}});Unit.define({baseUnitName:'energyInJoules',baseJsonName:'J',formatSpec:{baseSymbol:'J',minimumFractionDigits:3}});Unit.define({baseUnitName:'powerInWatts',baseJsonName:'W',formatSpec:{baseSymbol:'W',minimumFractionDigits:3}});Unit.define({baseUnitName:'unitlessNumber',baseJsonName:'unitless',formatSpec:{minimumFractionDigits:3,maximumFractionDigits:3}});Unit.define({baseUnitName:'count',baseJsonName:'count',formatSpec:{minimumFractionDigits:0,maximumFractionDigits:0}});Unit.define({baseUnitName:'sigma',baseJsonName:'sigma',formatSpec:{baseSymbol:String.fromCharCode(963),minimumFractionDigits:1,maximumFractionDigits:1}});return{ImprovementDirection,Unit,};});'use strict';tr.exportTo('tr.b',function(){class Scalar{constructor(unit,value){if(!(unit instanceof tr.b.Unit)){throw new Error('Expected Unit');}
+if(!(typeof(value)==='number')){throw new Error('Expected value to be number');}
+this.unit=unit;this.value=value;}
+asDict(){return{unit:this.unit.asJSON(),value:tr.b.numberToJson(this.value),};}
+toString(){return this.unit.format(this.value);}
+static fromDict(d){return new Scalar(tr.b.Unit.fromJSON(d.unit),tr.b.numberFromJson(d.value));}}
+return{Scalar,};});'use strict';tr.exportTo('tr.c',function(){function Auditor(model){this.model_=model;}
+Auditor.prototype={__proto__:Object.prototype,get model(){return this.model_;},runAnnotate(){},installUserFriendlyCategoryDriverIfNeeded(){},runAudit(){}};const options=new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE);options.defaultMetadata={};options.mandatoryBaseClass=Auditor;tr.b.decorateExtensionRegistry(Auditor,options);return{Auditor,};});'use strict';tr.exportTo('tr.b',function(){function clamp01(value){return Math.max(0,Math.min(1,value));}
+function Color(opt_r,opt_g,opt_b,opt_a){this.r=Math.floor(opt_r)||0;this.g=Math.floor(opt_g)||0;this.b=Math.floor(opt_b)||0;this.a=opt_a;}
+Color.fromString=function(str){let tmp;let values;if(str.substr(0,4)==='rgb('){tmp=str.substr(4,str.length-5);values=tmp.split(',').map(function(v){return v.replace(/^\s+/,'','g');});if(values.length!==3){throw new Error('Malformatted rgb-expression');}
+return new Color(parseInt(values[0]),parseInt(values[1]),parseInt(values[2]));}
+if(str.substr(0,5)==='rgba('){tmp=str.substr(5,str.length-6);values=tmp.split(',').map(function(v){return v.replace(/^\s+/,'','g');});if(values.length!==4){throw new Error('Malformatted rgb-expression');}
+return new Color(parseInt(values[0]),parseInt(values[1]),parseInt(values[2]),parseFloat(values[3]));}
+if(str[0]==='#'&&str.length===7){return new Color(parseInt(str.substr(1,2),16),parseInt(str.substr(3,2),16),parseInt(str.substr(5,2),16));}
+throw new Error('Unrecognized string format.');};Color.lerp=function(a,b,percent){if(a.a!==undefined&&b.a!==undefined){return Color.lerpRGBA(a,b,percent);}
+return Color.lerpRGB(a,b,percent);};Color.lerpRGB=function(a,b,percent){return new Color(((b.r-a.r)*percent)+a.r,((b.g-a.g)*percent)+a.g,((b.b-a.b)*percent)+a.b);};Color.lerpRGBA=function(a,b,percent){return new Color(((b.r-a.r)*percent)+a.r,((b.g-a.g)*percent)+a.g,((b.b-a.b)*percent)+a.b,((b.a-a.a)*percent)+a.a);};Color.fromDict=function(dict){return new Color(dict.r,dict.g,dict.b,dict.a);};Color.fromHSLExplicit=function(h,s,l,a){let r;let g;let b;function hue2rgb(p,q,t){if(t<0)t+=1;if(t>1)t-=1;if(t<1/6)return p+(q-p)*6*t;if(t<1/2)return q;if(t<2/3)return p+(q-p)*(2/3-t)*6;return p;}
+if(s===0){r=g=b=l;}else{const q=l<0.5?l*(1+s):l+s-l*s;const p=2*l-q;r=hue2rgb(p,q,h+1/3);g=hue2rgb(p,q,h);b=hue2rgb(p,q,h-1/3);}
+return new Color(Math.floor(r*255),Math.floor(g*255),Math.floor(b*255),a);};Color.fromHSL=function(hsl){return Color.fromHSLExplicit(hsl.h,hsl.s,hsl.l,hsl.a);};Color.prototype={clone(){const c=new Color();c.r=this.r;c.g=this.g;c.b=this.b;c.a=this.a;return c;},blendOver(bgColor){const oneMinusThisAlpha=1-this.a;const outA=this.a+bgColor.a*oneMinusThisAlpha;const bgBlend=(bgColor.a*oneMinusThisAlpha)/bgColor.a;return new Color(this.r*this.a+bgColor.r*bgBlend,this.g*this.a+bgColor.g*bgBlend,this.b*this.a+bgColor.b*bgBlend,outA);},brighten(opt_k){const k=opt_k||0.45;return new Color(Math.min(255,this.r+Math.floor(this.r*k)),Math.min(255,this.g+Math.floor(this.g*k)),Math.min(255,this.b+Math.floor(this.b*k)),this.a);},lighten(k,opt_maxL){const maxL=opt_maxL!==undefined?opt_maxL:1.0;const hsl=this.toHSL();hsl.l=Math.min(hsl.l+k,maxL);return Color.fromHSL(hsl);},darken(opt_k){let k;if(opt_k!==undefined){k=opt_k;}else{k=0.45;}
+return new Color(Math.min(255,this.r-Math.floor(this.r*k)),Math.min(255,this.g-Math.floor(this.g*k)),Math.min(255,this.b-Math.floor(this.b*k)),this.a);},desaturate(opt_desaturateFactor){let desaturateFactor;if(opt_desaturateFactor!==undefined){desaturateFactor=opt_desaturateFactor;}else{desaturateFactor=1;}
+const hsl=this.toHSL();hsl.s=clamp01(hsl.s*(1-desaturateFactor));return Color.fromHSL(hsl);},withAlpha(a){return new Color(this.r,this.g,this.b,a);},toString(){if(this.a!==undefined){return'rgba('+
+this.r+','+this.g+','+
+this.b+','+this.a+')';}
+return'rgb('+this.r+','+this.g+','+this.b+')';},toHSL(){const r=this.r/255;const g=this.g/255;const b=this.b/255;const max=Math.max(r,g,b);const min=Math.min(r,g,b);let h;let s;const l=(max+min)/2;if(min===max){h=0;s=0;}else{const delta=max-min;if(l>0.5){s=delta/(2-max-min);}else{s=delta/(max+min);}
+if(r===max){h=(g-b)/delta;if(g<b)h+=6;}else if(g===max){h=2+((b-r)/delta);}else{h=4+((r-g)/delta);}
+h/=6;}
+return{h,s,l,a:this.a};},toStringWithAlphaOverride(alpha){return'rgba('+
+this.r+','+this.g+','+
+this.b+','+alpha+')';}};return{Color,};});'use strict';tr.exportTo('tr.b',function(){const generalPurposeColors=[new tr.b.Color(122,98,135),new tr.b.Color(150,83,105),new tr.b.Color(44,56,189),new tr.b.Color(99,86,147),new tr.b.Color(104,129,107),new tr.b.Color(130,178,55),new tr.b.Color(87,109,147),new tr.b.Color(111,145,88),new tr.b.Color(81,152,131),new tr.b.Color(142,91,111),new tr.b.Color(81,163,70),new tr.b.Color(148,94,86),new tr.b.Color(144,89,118),new tr.b.Color(83,150,97),new tr.b.Color(105,94,139),new tr.b.Color(89,144,122),new tr.b.Color(105,119,128),new tr.b.Color(96,128,137),new tr.b.Color(145,88,145),new tr.b.Color(88,145,144),new tr.b.Color(90,100,143),new tr.b.Color(121,97,136),new tr.b.Color(111,160,73),new tr.b.Color(112,91,142),new tr.b.Color(86,147,86),new tr.b.Color(63,100,170),new tr.b.Color(81,152,107),new tr.b.Color(60,164,173),new tr.b.Color(143,72,161),new tr.b.Color(159,74,86)];const reservedColorsByName={thread_state_uninterruptible:new tr.b.Color(182,125,143),thread_state_iowait:new tr.b.Color(255,140,0),thread_state_running:new tr.b.Color(126,200,148),thread_state_runnable:new tr.b.Color(133,160,210),thread_state_sleeping:new tr.b.Color(240,240,240),thread_state_unknown:new tr.b.Color(199,155,125),background_memory_dump:new tr.b.Color(0,180,180),light_memory_dump:new tr.b.Color(0,0,180),detailed_memory_dump:new tr.b.Color(180,0,180),vsync_highlight_color:new tr.b.Color(0,0,255),generic_work:new tr.b.Color(125,125,125),good:new tr.b.Color(0,125,0),bad:new tr.b.Color(180,125,0),terrible:new tr.b.Color(180,0,0),black:new tr.b.Color(0,0,0),grey:new tr.b.Color(221,221,221),white:new tr.b.Color(255,255,255),yellow:new tr.b.Color(255,255,0),olive:new tr.b.Color(100,100,0),rail_response:new tr.b.Color(67,135,253),rail_animation:new tr.b.Color(244,74,63),rail_idle:new tr.b.Color(238,142,0),rail_load:new tr.b.Color(13,168,97),startup:new tr.b.Color(230,230,0),heap_dump_stack_frame:new tr.b.Color(128,128,128),heap_dump_object_type:new tr.b.Color(0,0,255),heap_dump_child_node_arrow:new tr.b.Color(204,102,0),cq_build_running:new tr.b.Color(255,255,119),cq_build_passed:new tr.b.Color(153,238,102),cq_build_failed:new tr.b.Color(238,136,136),cq_build_abandoned:new tr.b.Color(187,187,187),cq_build_attempt_runnig:new tr.b.Color(222,222,75),cq_build_attempt_passed:new tr.b.Color(103,218,35),cq_build_attempt_failed:new tr.b.Color(197,81,81)};const numGeneralPurposeColorIds=generalPurposeColors.length;const numReservedColorIds=Object.keys(reservedColorsByName).length;const numColorsPerVariant=numGeneralPurposeColorIds+numReservedColorIds;function ColorScheme(){}
+const paletteBase=[];paletteBase.push.apply(paletteBase,generalPurposeColors);paletteBase.push.apply(paletteBase,Object.values(reservedColorsByName));ColorScheme.colors=[];ColorScheme.properties={};ColorScheme.properties={numColorsPerVariant,};function pushVariant(func){const variantColors=paletteBase.map(func);ColorScheme.colors.push.apply(ColorScheme.colors,variantColors);}
+pushVariant(function(c){return c;});ColorScheme.properties.brightenedOffsets=[];ColorScheme.properties.brightenedOffsets.push(ColorScheme.colors.length);pushVariant(function(c){return c.lighten(0.3,0.8);});ColorScheme.properties.brightenedOffsets.push(ColorScheme.colors.length);pushVariant(function(c){return c.lighten(0.48,0.85);});ColorScheme.properties.brightenedOffsets.push(ColorScheme.colors.length);pushVariant(function(c){return c.lighten(0.65,0.9);});ColorScheme.properties.dimmedOffsets=[];ColorScheme.properties.dimmedOffsets.push(ColorScheme.colors.length);pushVariant(function(c){return c.desaturate();});ColorScheme.properties.dimmedOffsets.push(ColorScheme.colors.length);pushVariant(function(c){return c.desaturate(0.5);});ColorScheme.properties.dimmedOffsets.push(ColorScheme.colors.length);pushVariant(function(c){return c.desaturate(0.3);});ColorScheme.colorsAsStrings=ColorScheme.colors.map(function(c){return c.toString();});const reservedColorNameToIdMap=(function(){const m=new Map();let i=generalPurposeColors.length;for(const key of Object.keys(reservedColorsByName)){m.set(key,i++);}
+return m;})();ColorScheme.getColorIdForReservedName=function(name){const id=reservedColorNameToIdMap.get(name);if(id===undefined){throw new Error('Unrecognized color '+name);}
+return id;};ColorScheme.getColorForReservedNameAsString=function(reservedName){const id=ColorScheme.getColorIdForReservedName(reservedName);return ColorScheme.colorsAsStrings[id];};ColorScheme.getStringHash=function(name){let hash=0;for(let i=0;i<name.length;++i){hash=(hash+37*hash+11*name.charCodeAt(i))%0xFFFFFFFF;}
+return hash;};const stringColorIdCache=new Map();ColorScheme.getColorIdForGeneralPurposeString=function(string){if(stringColorIdCache.get(string)===undefined){const hash=ColorScheme.getStringHash(string);stringColorIdCache.set(string,hash%numGeneralPurposeColorIds);}
+return stringColorIdCache.get(string);};ColorScheme.getAnotherColorId=function(colorId,n){return(colorId+n)%numColorsPerVariant;};ColorScheme.getVariantColorId=function(colorId,offset){return colorId+offset;};return{ColorScheme,};});'use strict';tr.exportTo('tr.model',function(){const ColorScheme=tr.b.ColorScheme;function EventInfo(title,description,docLinks){this.title=title;this.description=description;this.docLinks=docLinks;this.colorId=ColorScheme.getColorIdForGeneralPurposeString(title);}
+return{EventInfo,};});'use strict';tr.exportTo('tr.b',function(){let nextGUID=1;const UUID4_PATTERN='xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';const GUID={allocateSimple(){return nextGUID++;},getLastSimpleGuid(){return nextGUID-1;},allocateUUID4(){return UUID4_PATTERN.replace(/[xy]/g,function(c){let r=parseInt(Math.random()*16);if(c==='y')r=(r&3)+8;return r.toString(16);});}};return{GUID,};});'use strict';tr.exportTo('tr.model',function(){function EventRegistry(){}
+const options=new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE);tr.b.decorateExtensionRegistry(EventRegistry,options);EventRegistry.addEventListener('will-register',function(e){const metadata=e.typeInfo.metadata;if(metadata.name===undefined){throw new Error('Registered events must provide name metadata');}
+if(metadata.pluralName===undefined){throw new Error('Registered events must provide pluralName metadata');}
+if(metadata.subTypes===undefined){metadata.subTypes={};const options=new tr.b.ExtensionRegistryOptions(tr.b.TYPE_BASED_REGISTRY_MODE);options.mandatoryBaseClass=e.typeInfo.constructor;options.defaultConstructor=e.typeInfo.constructor;tr.b.decorateExtensionRegistry(metadata.subTypes,options);}else{if(!metadata.subTypes.register){throw new Error('metadata.subTypes must be an extension registry.');}}
+e.typeInfo.constructor.subTypes=metadata.subTypes;});let eventsByTypeName=undefined;EventRegistry.getEventTypeInfoByTypeName=function(typeName){if(eventsByTypeName===undefined){eventsByTypeName={};EventRegistry.getAllRegisteredTypeInfos().forEach(function(typeInfo){eventsByTypeName[typeInfo.metadata.name]=typeInfo;});}
+return eventsByTypeName[typeName];};EventRegistry.addEventListener('registry-changed',function(){eventsByTypeName=undefined;});function convertCamelCaseToTitleCase(name){let result=name.replace(/[A-Z]/g,' $&');result=result.charAt(0).toUpperCase()+result.slice(1);return result;}
+EventRegistry.getUserFriendlySingularName=function(typeName){const typeInfo=EventRegistry.getEventTypeInfoByTypeName(typeName);const str=typeInfo.metadata.name;return convertCamelCaseToTitleCase(str);};EventRegistry.getUserFriendlyPluralName=function(typeName){const typeInfo=EventRegistry.getEventTypeInfoByTypeName(typeName);const str=typeInfo.metadata.pluralName;return convertCamelCaseToTitleCase(str);};return{EventRegistry,};});'use strict';tr.exportTo('tr.model',function(){const EventRegistry=tr.model.EventRegistry;const RequestSelectionChangeEvent=tr.b.Event.bind(undefined,'requestSelectionChange',true,false);function EventSet(opt_events){this.bounds_=new tr.b.math.Range();this.events_=new Set();this.guid_=tr.b.GUID.allocateSimple();if(opt_events){if(opt_events instanceof Array){for(const event of opt_events){this.push(event);}}else if(opt_events instanceof EventSet){this.addEventSet(opt_events);}else{this.push(opt_events);}}}
+EventSet.prototype={__proto__:Object.prototype,get bounds(){return this.bounds_;},get duration(){if(this.bounds_.isEmpty)return 0;return this.bounds_.max-this.bounds_.min;},get length(){return this.events_.size;},get guid(){return this.guid_;},*[Symbol.iterator](){for(const event of this.events_){yield event;}},clear(){this.bounds_=new tr.b.math.Range();this.events_.clear();},push(...events){let numPushed;for(const event of events){if(event.guid===undefined){throw new Error('Event must have a GUID');}
+if(!this.events_.has(event)){this.events_.add(event);if(event.addBoundsToRange){if(this.bounds_!==undefined){event.addBoundsToRange(this.bounds_);}}}
+numPushed++;}
+return numPushed;},contains(event){if(this.events_.has(event))return event;return undefined;},addEventSet(eventSet){for(const event of eventSet){this.push(event);}},intersectionIsEmpty(otherEventSet){return!this.some(event=>otherEventSet.contains(event));},equals(that){if(this.length!==that.length)return false;return this.every(event=>that.contains(event));},sortEvents(compare){const ary=this.toArray();ary.sort(compare);this.clear();for(const event of ary){this.push(event);}},getEventsOrganizedByBaseType(opt_pruneEmpty){const allTypeInfos=EventRegistry.getAllRegisteredTypeInfos();const events=this.getEventsOrganizedByCallback(function(event){let maxEventIndex=-1;let maxEventTypeInfo=undefined;allTypeInfos.forEach(function(eventTypeInfo,eventIndex){if(!(event instanceof eventTypeInfo.constructor))return;if(eventIndex>maxEventIndex){maxEventIndex=eventIndex;maxEventTypeInfo=eventTypeInfo;}});if(maxEventIndex===-1){throw new Error(`Unrecognized event type: ${event.constructor.name}`);}
+return maxEventTypeInfo.metadata.name;});if(!opt_pruneEmpty){allTypeInfos.forEach(function(eventTypeInfo){if(events[eventTypeInfo.metadata.name]===undefined){events[eventTypeInfo.metadata.name]=new EventSet();}});}
+return events;},getEventsOrganizedByTitle(){return this.getEventsOrganizedByCallback(function(event){if(event.title===undefined){throw new Error('An event didn\'t have a title!');}
+return event.title;});},getEventsOrganizedByCallback(cb,opt_this){const groupedEvents=tr.b.groupIntoMap(this,cb,opt_this||this);const groupedEventsDict={};for(const[k,events]of groupedEvents){groupedEventsDict[k]=new EventSet(events);}
+return groupedEventsDict;},enumEventsOfType(type,func){for(const event of this){if(event instanceof type){func(event);}}},get userFriendlyName(){if(this.length===0){throw new Error('Empty event set');}
+const eventsByBaseType=this.getEventsOrganizedByBaseType(true);const eventTypeName=Object.keys(eventsByBaseType)[0];if(this.length===1){const tmp=EventRegistry.getUserFriendlySingularName(eventTypeName);return tr.b.getOnlyElement(this.events_).userFriendlyName;}
+const numEventTypes=Object.keys(eventsByBaseType).length;if(numEventTypes!==1){return this.length+' events of various types';}
+const tmp=EventRegistry.getUserFriendlyPluralName(eventTypeName);return this.length+' '+tmp;},filter(fn,opt_this){const res=new EventSet();for(const event of this){if(fn.call(opt_this,event)){res.push(event);}}
+return res;},toArray(){const ary=[];for(const event of this){ary.push(event);}
+return ary;},forEach(fn,opt_this){for(const event of this){fn.call(opt_this,event);}},map(fn,opt_this){const res=[];for(const event of this){res.push(fn.call(opt_this,event));}
+return res;},every(fn,opt_this){for(const event of this){if(!fn.call(opt_this,event)){return false;}}
+return true;},some(fn,opt_this){for(const event of this){if(fn.call(opt_this,event)){return true;}}
+return false;},asDict(){const stableIds=[];for(const event of this){stableIds.push(event.stableId);}
+return{'events':stableIds};},asSet(){return this.events_;}};EventSet.IMMUTABLE_EMPTY_SET=(function(){const s=new EventSet();s.push=function(){throw new Error('Cannot push to an immutable event set');};s.addEventSet=function(){throw new Error('Cannot add to an immutable event set');};Object.freeze(s);return s;})();return{EventSet,RequestSelectionChangeEvent,};});'use strict';tr.exportTo('tr.model',function(){const ColorScheme=tr.b.ColorScheme;const SelectionState={NONE:0,SELECTED:ColorScheme.properties.brightenedOffsets[0],HIGHLIGHTED:ColorScheme.properties.brightenedOffsets[1],DIMMED:ColorScheme.properties.dimmedOffsets[0],BRIGHTENED0:ColorScheme.properties.brightenedOffsets[0],BRIGHTENED1:ColorScheme.properties.brightenedOffsets[1],BRIGHTENED2:ColorScheme.properties.brightenedOffsets[2],DIMMED0:ColorScheme.properties.dimmedOffsets[0],DIMMED1:ColorScheme.properties.dimmedOffsets[1],DIMMED2:ColorScheme.properties.dimmedOffsets[2]};const brighteningLevels=[SelectionState.NONE,SelectionState.BRIGHTENED0,SelectionState.BRIGHTENED1,SelectionState.BRIGHTENED2];SelectionState.getFromBrighteningLevel=function(level){return brighteningLevels[level];};const dimmingLevels=[SelectionState.DIMMED0,SelectionState.DIMMED1,SelectionState.DIMMED2];SelectionState.getFromDimmingLevel=function(level){return dimmingLevels[level];};return{SelectionState,};});'use strict';tr.exportTo('tr.model',function(){const SelectionState=tr.model.SelectionState;function SelectableItem(modelItem){this.modelItem_=modelItem;}
+SelectableItem.prototype={get modelItem(){return this.modelItem_;},get selected(){return this.selectionState===SelectionState.SELECTED;},addToSelection(selection){const modelItem=this.modelItem_;if(!modelItem)return;selection.push(modelItem);},addToTrackMap(eventToTrackMap,track){const modelItem=this.modelItem_;if(!modelItem)return;eventToTrackMap.addEvent(modelItem,track);}};return{SelectableItem,};});'use strict';tr.exportTo('tr.model',function(){const SelectableItem=tr.model.SelectableItem;const SelectionState=tr.model.SelectionState;const IMMUTABLE_EMPTY_SET=tr.model.EventSet.IMMUTABLE_EMPTY_SET;function Event(){SelectableItem.call(this,this);this.guid_=tr.b.GUID.allocateSimple();this.selectionState=SelectionState.NONE;this.info=undefined;}
+Event.prototype={__proto__:SelectableItem.prototype,get guid(){return this.guid_;},get stableId(){return undefined;},get range(){const range=new tr.b.math.Range();this.addBoundsToRange(range);return range;},associatedAlerts:IMMUTABLE_EMPTY_SET,addAssociatedAlert(alert){if(this.associatedAlerts===IMMUTABLE_EMPTY_SET){this.associatedAlerts=new tr.model.EventSet();}
+this.associatedAlerts.push(alert);},addBoundsToRange(range){}};return{Event,};});'use strict';tr.exportTo('tr.model',function(){function TimedEvent(start){tr.model.Event.call(this);this.start=start;this.duration=0;this.cpuStart=undefined;this.cpuDuration=undefined;this.contexts=Object.freeze([]);}
+TimedEvent.prototype={__proto__:tr.model.Event.prototype,get end(){return this.start+this.duration;},addBoundsToRange(range){range.addValue(this.start);range.addValue(this.end);},bounds(that,opt_precisionUnit){if(opt_precisionUnit===undefined){opt_precisionUnit=tr.b.TimeDisplayModes.ms;}
+const startsBefore=opt_precisionUnit.roundedLess(that.start,this.start);const endsAfter=opt_precisionUnit.roundedLess(this.end,that.end);return!startsBefore&&!endsAfter;}};return{TimedEvent,};});'use strict';tr.exportTo('tr.model',function(){function Alert(info,start,opt_associatedEvents,opt_args){tr.model.TimedEvent.call(this,start);this.info=info;this.args=opt_args||{};this.associatedEvents=new tr.model.EventSet(opt_associatedEvents);this.associatedEvents.forEach(function(event){event.addAssociatedAlert(this);},this);}
+Alert.prototype={__proto__:tr.model.TimedEvent.prototype,get title(){return this.info.title;},get colorId(){return this.info.colorId;},get userFriendlyName(){return'Alert '+this.title+' at '+
+tr.b.Unit.byName.timeStampInMs.format(this.start);}};tr.model.EventRegistry.register(Alert,{name:'alert',pluralName:'alerts'});return{Alert,};});'use strict';tr.exportTo('tr.model',function(){const ColorScheme=tr.b.ColorScheme;const Statistics=tr.b.math.Statistics;const FRAME_PERF_CLASS={GOOD:'good',BAD:'bad',TERRIBLE:'terrible',NEUTRAL:'generic_work'};function Frame(associatedEvents,threadTimeRanges,opt_args){tr.model.Event.call(this);this.threadTimeRanges=threadTimeRanges;this.associatedEvents=new tr.model.EventSet(associatedEvents);this.args=opt_args||{};this.title='Frame';this.start=Statistics.min(threadTimeRanges,function(x){return x.start;});this.end=Statistics.max(threadTimeRanges,function(x){return x.end;});this.totalDuration=Statistics.sum(threadTimeRanges,function(x){return x.end-x.start;});this.perfClass=FRAME_PERF_CLASS.NEUTRAL;}
+Frame.prototype={__proto__:tr.model.Event.prototype,set perfClass(perfClass){this.colorId=ColorScheme.getColorIdForReservedName(perfClass);this.perfClass_=perfClass;},get perfClass(){return this.perfClass_;},shiftTimestampsForward(amount){this.start+=amount;this.end+=amount;for(let i=0;i<this.threadTimeRanges.length;i++){this.threadTimeRanges[i].start+=amount;this.threadTimeRanges[i].end+=amount;}},addBoundsToRange(range){range.addValue(this.start);range.addValue(this.end);}};tr.model.EventRegistry.register(Frame,{name:'frame',pluralName:'frames'});return{Frame,FRAME_PERF_CLASS,};});'use strict';tr.exportTo('tr.b.math',function(){function findLowIndexInSortedArray(ary,mapFn,loVal){if(ary.length===0)return 1;let low=0;let high=ary.length-1;let i;let comparison;let hitPos=-1;while(low<=high){i=Math.floor((low+high)/2);comparison=mapFn(ary[i])-loVal;if(comparison<0){low=i+1;continue;}else if(comparison>0){high=i-1;continue;}else{hitPos=i;high=i-1;}}
+return hitPos!==-1?hitPos:low;}
+function findHighIndexInSortedArray(ary,mapFn,loVal,hiVal){let lo=loVal||0;let hi=hiVal!==undefined?hiVal:ary.length;while(lo<hi){const mid=(lo+hi)>>1;if(mapFn(ary[mid])>=0){lo=mid+1;}else{hi=mid;}}
+return hi;}
+function findIndexInSortedIntervals(ary,mapLoFn,mapWidthFn,loVal){const first=findLowIndexInSortedArray(ary,mapLoFn,loVal);if(first===0){if(loVal>=mapLoFn(ary[0])&&loVal<mapLoFn(ary[0])+mapWidthFn(ary[0],0)){return 0;}
+return-1;}
+if(first<ary.length){if(loVal>=mapLoFn(ary[first])&&loVal<mapLoFn(ary[first])+mapWidthFn(ary[first],first)){return first;}
+if(loVal>=mapLoFn(ary[first-1])&&loVal<mapLoFn(ary[first-1])+
+mapWidthFn(ary[first-1],first-1)){return first-1;}
+return ary.length;}
+if(first===ary.length){if(loVal>=mapLoFn(ary[first-1])&&loVal<mapLoFn(ary[first-1])+
+mapWidthFn(ary[first-1],first-1)){return first-1;}
+return ary.length;}
+return ary.length;}
+function findIndexInSortedClosedIntervals(ary,mapLoFn,mapHiFn,val){const i=findLowIndexInSortedArray(ary,mapLoFn,val);if(i===0){if(val>=mapLoFn(ary[0],0)&&val<=mapHiFn(ary[0],0)){return 0;}
+return-1;}
+if(i<ary.length){if(val>=mapLoFn(ary[i-1],i-1)&&val<=mapHiFn(ary[i-1],i-1)){return i-1;}
+if(val>=mapLoFn(ary[i],i)&&val<=mapHiFn(ary[i],i)){return i;}
+return ary.length;}
+if(i===ary.length){if(val>=mapLoFn(ary[i-1],i-1)&&val<=mapHiFn(ary[i-1],i-1)){return i-1;}
+return ary.length;}
+return ary.length;}
+function iterateOverIntersectingIntervals(ary,mapLoFn,mapWidthFn,loVal,hiVal,cb){if(ary.length===0)return;if(loVal>hiVal)return;let i=findLowIndexInSortedArray(ary,mapLoFn,loVal);if(i===-1){return;}
+if(i>0){const hi=mapLoFn(ary[i-1])+mapWidthFn(ary[i-1],i-1);if(hi>=loVal){cb(ary[i-1],i-1);}}
+if(i===ary.length){return;}
+for(let n=ary.length;i<n;i++){const lo=mapLoFn(ary[i]);if(lo>=hiVal)break;cb(ary[i],i);}}
+function getIntersectingIntervals(ary,mapLoFn,mapWidthFn,loVal,hiVal){const tmp=[];iterateOverIntersectingIntervals(ary,mapLoFn,mapWidthFn,loVal,hiVal,function(d){tmp.push(d);});return tmp;}
+function findClosestElementInSortedArray(ary,mapFn,val,maxDiff){if(ary.length===0)return null;let aftIdx=findLowIndexInSortedArray(ary,mapFn,val);const befIdx=aftIdx>0?aftIdx-1:0;if(aftIdx===ary.length)aftIdx-=1;const befDiff=Math.abs(val-mapFn(ary[befIdx]));const aftDiff=Math.abs(val-mapFn(ary[aftIdx]));if(befDiff>maxDiff&&aftDiff>maxDiff)return null;const idx=befDiff<aftDiff?befIdx:aftIdx;return ary[idx];}
+function findClosestIntervalInSortedIntervals(ary,mapLoFn,mapHiFn,val,maxDiff){if(ary.length===0)return null;let idx=findLowIndexInSortedArray(ary,mapLoFn,val);if(idx>0)idx-=1;const hiInt=ary[idx];let loInt=hiInt;if(val>mapHiFn(hiInt)&&idx+1<ary.length){loInt=ary[idx+1];}
+const loDiff=Math.abs(val-mapLoFn(loInt));const hiDiff=Math.abs(val-mapHiFn(hiInt));if(loDiff>maxDiff&&hiDiff>maxDiff)return null;if(loDiff<hiDiff)return loInt;return hiInt;}
+return{findLowIndexInSortedArray,findHighIndexInSortedArray,findIndexInSortedIntervals,findIndexInSortedClosedIntervals,iterateOverIntersectingIntervals,getIntersectingIntervals,findClosestElementInSortedArray,findClosestIntervalInSortedIntervals,};});'use strict';tr.exportTo('tr.model.helpers',function(){const Frame=tr.model.Frame;const Statistics=tr.b.math.Statistics;const UI_DRAW_TYPE={NONE:'none',LEGACY:'legacy',MARSHMALLOW:'marshmallow'};const UI_THREAD_DRAW_NAMES={'performTraversals':UI_DRAW_TYPE.LEGACY,'Choreographer#doFrame':UI_DRAW_TYPE.MARSHMALLOW};const RENDER_THREAD_DRAW_NAME='DrawFrame';const RENDER_THREAD_INDEP_DRAW_NAME='doFrame';const RENDER_THREAD_QUEUE_NAME='queueBuffer';const RENDER_THREAD_SWAP_NAME='eglSwapBuffers';const THREAD_SYNC_NAME='syncFrameState';function getSlicesForThreadTimeRanges(threadTimeRanges){const ret=[];threadTimeRanges.forEach(function(threadTimeRange){const slices=[];threadTimeRange.thread.sliceGroup.iterSlicesInTimeRange(function(slice){slices.push(slice);},threadTimeRange.start,threadTimeRange.end);ret.push.apply(ret,slices);});return ret;}
+function makeFrame(threadTimeRanges,surfaceFlinger){const args={};if(surfaceFlinger&&surfaceFlinger.hasVsyncs){const start=Statistics.min(threadTimeRanges,function(threadTimeRanges){return threadTimeRanges.start;});args.deadline=surfaceFlinger.getFrameDeadline(start);args.frameKickoff=surfaceFlinger.getFrameKickoff(start);}
+const events=getSlicesForThreadTimeRanges(threadTimeRanges);return new Frame(events,threadTimeRanges,args);}
+function findOverlappingDrawFrame(renderThread,uiDrawSlice){if(!renderThread)return undefined;let overlappingDrawFrame;const slices=tr.b.math.iterateOverIntersectingIntervals(renderThread.sliceGroup.slices,function(range){return range.start;},function(range){return range.end;},uiDrawSlice.start,uiDrawSlice.end,function(rtDrawSlice){if(rtDrawSlice.title===RENDER_THREAD_DRAW_NAME){const rtSyncSlice=rtDrawSlice.findDescendentSlice(THREAD_SYNC_NAME);if(rtSyncSlice&&rtSyncSlice.start>=uiDrawSlice.start&&rtSyncSlice.end<=uiDrawSlice.end){overlappingDrawFrame=rtDrawSlice;}}});return overlappingDrawFrame;}
+function getPreTraversalWorkRanges(uiThread){if(!uiThread)return[];const preFrameEvents=[];uiThread.sliceGroup.slices.forEach(function(slice){if(slice.title==='obtainView'||slice.title==='setupListItem'||slice.title==='deliverInputEvent'||slice.title==='RV Scroll'){preFrameEvents.push(slice);}});uiThread.asyncSliceGroup.slices.forEach(function(slice){if(slice.title==='deliverInputEvent'){preFrameEvents.push(slice);}});return tr.b.math.mergeRanges(tr.b.math.convertEventsToRanges(preFrameEvents),3,function(events){return{start:events[0].min,end:events[events.length-1].max};});}
+function getFrameStartTime(traversalStart,preTraversalWorkRanges){const preTraversalWorkRange=tr.b.math.findClosestIntervalInSortedIntervals(preTraversalWorkRanges,function(range){return range.start;},function(range){return range.end;},traversalStart,3);if(preTraversalWorkRange){return preTraversalWorkRange.start;}
+return traversalStart;}
+function getRtFrameEndTime(rtDrawSlice){const rtQueueSlice=rtDrawSlice.findDescendentSlice(RENDER_THREAD_QUEUE_NAME);if(rtQueueSlice){return rtQueueSlice.end;}
+const rtSwapSlice=rtDrawSlice.findDescendentSlice(RENDER_THREAD_SWAP_NAME);if(rtSwapSlice){return rtSwapSlice.end;}
+return rtDrawSlice.end;}
+function getUiThreadDrivenFrames(app){if(!app.uiThread)return[];let preTraversalWorkRanges=[];if(app.uiDrawType===UI_DRAW_TYPE.LEGACY){preTraversalWorkRanges=getPreTraversalWorkRanges(app.uiThread);}
+const frames=[];app.uiThread.sliceGroup.slices.forEach(function(slice){if(!(slice.title in UI_THREAD_DRAW_NAMES)){return;}
+const threadTimeRanges=[];const uiThreadTimeRange={thread:app.uiThread,start:getFrameStartTime(slice.start,preTraversalWorkRanges),end:slice.end};threadTimeRanges.push(uiThreadTimeRange);const rtDrawSlice=findOverlappingDrawFrame(app.renderThread,slice);if(rtDrawSlice){const rtSyncSlice=rtDrawSlice.findDescendentSlice(THREAD_SYNC_NAME);if(rtSyncSlice){uiThreadTimeRange.end=Math.min(uiThreadTimeRange.end,rtSyncSlice.start);}
+threadTimeRanges.push({thread:app.renderThread,start:rtDrawSlice.start,end:getRtFrameEndTime(rtDrawSlice)});}
+frames.push(makeFrame(threadTimeRanges,app.surfaceFlinger));});return frames;}
+function getRenderThreadDrivenFrames(app){if(!app.renderThread)return[];const frames=[];app.renderThread.sliceGroup.getSlicesOfName(RENDER_THREAD_INDEP_DRAW_NAME).forEach(function(slice){const threadTimeRanges=[{thread:app.renderThread,start:slice.start,end:slice.end}];frames.push(makeFrame(threadTimeRanges,app.surfaceFlinger));});return frames;}
+function getUiDrawType(uiThread){if(!uiThread){return UI_DRAW_TYPE.NONE;}
+const slices=uiThread.sliceGroup.slices;for(let i=0;i<slices.length;i++){if(slices[i].title in UI_THREAD_DRAW_NAMES){return UI_THREAD_DRAW_NAMES[slices[i].title];}}
+return UI_DRAW_TYPE.NONE;}
+function getInputSamples(process){let samples=undefined;for(const counterName in process.counters){if(/^android\.aq\:pending/.test(counterName)&&process.counters[counterName].numSeries===1){samples=process.counters[counterName].series[0].samples;break;}}
+if(!samples)return[];const inputSamples=[];let lastValue=0;samples.forEach(function(sample){if(sample.value>lastValue){inputSamples.push(sample);}
+lastValue=sample.value;});return inputSamples;}
+function getAnimationAsyncSlices(uiThread){if(!uiThread)return[];const slices=[];for(const slice of uiThread.asyncSliceGroup.getDescendantEvents()){if(/^animator\:/.test(slice.title)){slices.push(slice);}}
+return slices;}
+function AndroidApp(process,uiThread,renderThread,surfaceFlinger,uiDrawType){this.process=process;this.uiThread=uiThread;this.renderThread=renderThread;this.surfaceFlinger=surfaceFlinger;this.uiDrawType=uiDrawType;this.frames_=undefined;this.inputs_=undefined;}
+AndroidApp.createForProcessIfPossible=function(process,surfaceFlinger){let uiThread=process.getThread(process.pid);const uiDrawType=getUiDrawType(uiThread);if(uiDrawType===UI_DRAW_TYPE.NONE){uiThread=undefined;}
+const renderThreads=process.findAllThreadsNamed('RenderThread');const renderThread=(renderThreads.length===1?renderThreads[0]:undefined);if(uiThread||renderThread){return new AndroidApp(process,uiThread,renderThread,surfaceFlinger,uiDrawType);}};AndroidApp.prototype={getFrames(){if(!this.frames_){const uiFrames=getUiThreadDrivenFrames(this);const rtFrames=getRenderThreadDrivenFrames(this);this.frames_=uiFrames.concat(rtFrames);this.frames_.sort(function(a,b){a.end-b.end;});}
+return this.frames_;},getInputSamples(){if(!this.inputs_){this.inputs_=getInputSamples(this.process);}
+return this.inputs_;},getAnimationAsyncSlices(){if(!this.animations_){this.animations_=getAnimationAsyncSlices(this.uiThread);}
+return this.animations_;}};return{AndroidApp,};});'use strict';tr.exportTo('tr.model.helpers',function(){const findLowIndexInSortedArray=tr.b.math.findLowIndexInSortedArray;const VSYNC_SF_NAME='android.VSYNC-sf';const VSYNC_APP_NAME='android.VSYNC-app';const VSYNC_FALLBACK_NAME='android.VSYNC';const TIMESTAMP_FUDGE_MS=0.01;function getVsyncTimestamps(process,counterName){let vsync=process.counters[counterName];if(!vsync){vsync=process.counters[VSYNC_FALLBACK_NAME];}
+if(vsync&&vsync.numSeries===1&&vsync.numSamples>1){return vsync.series[0].timestamps;}
+return undefined;}
+function AndroidSurfaceFlinger(process,thread){this.process=process;this.thread=thread;this.appVsync_=undefined;this.sfVsync_=undefined;this.appVsyncTimestamps_=getVsyncTimestamps(process,VSYNC_APP_NAME);this.sfVsyncTimestamps_=getVsyncTimestamps(process,VSYNC_SF_NAME);this.deadlineDelayMs_=this.appVsyncTimestamps_!==this.sfVsyncTimestamps_?5:TIMESTAMP_FUDGE_MS;}
+AndroidSurfaceFlinger.createForProcessIfPossible=function(process){const mainThread=process.getThread(process.pid);if(mainThread&&mainThread.name&&/surfaceflinger/.test(mainThread.name)){return new AndroidSurfaceFlinger(process,mainThread);}
+const primaryThreads=process.findAllThreadsNamed('SurfaceFlinger');if(primaryThreads.length===1){return new AndroidSurfaceFlinger(process,primaryThreads[0]);}
+return undefined;};AndroidSurfaceFlinger.prototype={get hasVsyncs(){return!!this.appVsyncTimestamps_&&!!this.sfVsyncTimestamps_;},getFrameKickoff(timestamp){if(!this.hasVsyncs){throw new Error('cannot query vsync info without vsyncs');}
+const firstGreaterIndex=findLowIndexInSortedArray(this.appVsyncTimestamps_,function(x){return x;},timestamp+TIMESTAMP_FUDGE_MS);if(firstGreaterIndex<1)return undefined;return this.appVsyncTimestamps_[firstGreaterIndex-1];},getFrameDeadline(timestamp){if(!this.hasVsyncs){throw new Error('cannot query vsync info without vsyncs');}
+const firstGreaterIndex=findLowIndexInSortedArray(this.sfVsyncTimestamps_,function(x){return x;},timestamp+this.deadlineDelayMs_);if(firstGreaterIndex>=this.sfVsyncTimestamps_.length){return undefined;}
+return this.sfVsyncTimestamps_[firstGreaterIndex];}};return{AndroidSurfaceFlinger,};});'use strict';tr.exportTo('tr.model.helpers',function(){const AndroidApp=tr.model.helpers.AndroidApp;const AndroidSurfaceFlinger=tr.model.helpers.AndroidSurfaceFlinger;const IMPORTANT_SURFACE_FLINGER_SLICES={'doComposition':true,'updateTexImage':true,'postFramebuffer':true};const IMPORTANT_UI_THREAD_SLICES={'Choreographer#doFrame':true,'performTraversals':true,'deliverInputEvent':true};const IMPORTANT_RENDER_THREAD_SLICES={'doFrame':true};function iterateImportantThreadSlices(thread,important,callback){if(!thread)return;thread.sliceGroup.slices.forEach(function(slice){if(slice.title in important){callback(slice);}});}
+function AndroidModelHelper(model){this.model=model;this.apps=[];this.surfaceFlinger=undefined;const processes=model.getAllProcesses();for(let i=0;i<processes.length&&!this.surfaceFlinger;i++){this.surfaceFlinger=AndroidSurfaceFlinger.createForProcessIfPossible(processes[i]);}
+model.getAllProcesses().forEach(function(process){const app=AndroidApp.createForProcessIfPossible(process,this.surfaceFlinger);if(app){this.apps.push(app);}},this);}
+AndroidModelHelper.guid=tr.b.GUID.allocateSimple();AndroidModelHelper.supportsModel=function(model){return true;};AndroidModelHelper.prototype={iterateImportantSlices(callback){if(this.surfaceFlinger){iterateImportantThreadSlices(this.surfaceFlinger.thread,IMPORTANT_SURFACE_FLINGER_SLICES,callback);}
+this.apps.forEach(function(app){iterateImportantThreadSlices(app.uiThread,IMPORTANT_UI_THREAD_SLICES,callback);iterateImportantThreadSlices(app.renderThread,IMPORTANT_RENDER_THREAD_SLICES,callback);});}};return{AndroidModelHelper,};});'use strict';tr.exportTo('tr.model',function(){function Slice(category,title,colorId,start,args,opt_duration,opt_cpuStart,opt_cpuDuration,opt_argsStripped,opt_bindId){if(new.target){throw new Error('Can\'t instantiate pure virtual class Slice');}
+tr.model.TimedEvent.call(this,start);this.category=category||'';this.title=title;this.colorId=colorId;this.args=args;this.startStackFrame=undefined;this.endStackFrame=undefined;this.didNotFinish=false;this.inFlowEvents=[];this.outFlowEvents=[];this.subSlices=[];this.selfTime=undefined;this.cpuSelfTime=undefined;this.important=false;this.parentContainer=undefined;this.argsStripped=false;this.bind_id_=opt_bindId;this.parentSlice=undefined;this.isTopLevel=false;if(opt_duration!==undefined){this.duration=opt_duration;}
+if(opt_cpuStart!==undefined){this.cpuStart=opt_cpuStart;}
+if(opt_cpuDuration!==undefined){this.cpuDuration=opt_cpuDuration;}
+if(opt_argsStripped!==undefined){this.argsStripped=true;}}
+Slice.prototype={__proto__:tr.model.TimedEvent.prototype,get analysisTypeName(){return this.title;},get userFriendlyName(){return'Slice '+this.title+' at '+
+tr.b.Unit.byName.timeStampInMs.format(this.start);},get stableId(){const parentSliceGroup=this.parentContainer.sliceGroup;return parentSliceGroup.stableId+'.'+
+parentSliceGroup.slices.indexOf(this);},get bindId(){return this.bind_id_;},findDescendentSlice(targetTitle){if(!this.subSlices){return undefined;}
+for(let i=0;i<this.subSlices.length;i++){if(this.subSlices[i].title===targetTitle){return this.subSlices[i];}
+const slice=this.subSlices[i].findDescendentSlice(targetTitle);if(slice)return slice;}
+return undefined;},get mostTopLevelSlice(){if(!this.parentSlice)return this;return this.parentSlice.mostTopLevelSlice;},getProcess(){const thread=this.parentContainer;if(thread&&thread.getProcess){return thread.getProcess();}
+return undefined;},get model(){const process=this.getProcess();if(process!==undefined){return this.getProcess().model;}
+return undefined;},*findTopmostSlicesRelativeToThisSlice(eventPredicate){if(eventPredicate(this)){yield this;return;}
+for(const s of this.subSlices){yield*s.findTopmostSlicesRelativeToThisSlice(eventPredicate);}},iterateAllSubsequentSlices(callback,opt_this){const parentStack=[];let started=false;const topmostSlice=this.mostTopLevelSlice;parentStack.push(topmostSlice);while(parentStack.length!==0){const curSlice=parentStack.pop();if(started){callback.call(opt_this,curSlice);}else{started=(curSlice.guid===this.guid);}
+for(let i=curSlice.subSlices.length-1;i>=0;i--){parentStack.push(curSlice.subSlices[i]);}}},get subsequentSlices(){const res=[];this.iterateAllSubsequentSlices(function(subseqSlice){res.push(subseqSlice);});return res;},*enumerateAllAncestors(){let curSlice=this.parentSlice;while(curSlice){yield curSlice;curSlice=curSlice.parentSlice;}},get ancestorSlices(){return Array.from(this.enumerateAllAncestors());},iterateEntireHierarchy(callback,opt_this){const mostTopLevelSlice=this.mostTopLevelSlice;callback.call(opt_this,mostTopLevelSlice);mostTopLevelSlice.iterateAllSubsequentSlices(callback,opt_this);},get entireHierarchy(){const res=[];this.iterateEntireHierarchy(function(slice){res.push(slice);});return res;},get ancestorAndSubsequentSlices(){const res=[];res.push(this);for(const aSlice of this.enumerateAllAncestors()){res.push(aSlice);}
+this.iterateAllSubsequentSlices(function(sSlice){res.push(sSlice);});return res;},*enumerateAllDescendents(){for(const slice of this.subSlices){yield slice;}
+for(const slice of this.subSlices){yield*slice.enumerateAllDescendents();}},get descendentSlices(){const res=[];for(const slice of this.enumerateAllDescendents()){res.push(slice);}
+return res;}};return{Slice,};});'use strict';tr.exportTo('tr.model',function(){const Slice=tr.model.Slice;const SCHEDULING_STATE={DEBUG:'Debug',EXIT_DEAD:'Exit Dead',RUNNABLE:'Runnable',RUNNING:'Running',SLEEPING:'Sleeping',STOPPED:'Stopped',TASK_DEAD:'Task Dead',UNINTR_SLEEP:'Uninterruptible Sleep',UNINTR_SLEEP_WAKE_KILL:'Uninterruptible Sleep | WakeKill',UNINTR_SLEEP_WAKING:'Uninterruptible Sleep | Waking',UNINTR_SLEEP_IO:'Uninterruptible Sleep - Block I/O',UNINTR_SLEEP_WAKE_KILL_IO:'Uninterruptible Sleep | WakeKill - Block I/O',UNINTR_SLEEP_WAKING_IO:'Uninterruptible Sleep | Waking - Block I/O',UNKNOWN:'UNKNOWN',WAKE_KILL:'Wakekill',WAKING:'Waking',ZOMBIE:'Zombie'};function ThreadTimeSlice(thread,schedulingState,cat,start,args,opt_duration){Slice.call(this,cat,schedulingState,this.getColorForState_(schedulingState),start,args,opt_duration);this.thread=thread;this.schedulingState=schedulingState;this.cpuOnWhichThreadWasRunning=undefined;}
+ThreadTimeSlice.prototype={__proto__:Slice.prototype,getColorForState_(state){const getColorIdForReservedName=tr.b.ColorScheme.getColorIdForReservedName;switch(state){case SCHEDULING_STATE.RUNNABLE:return getColorIdForReservedName('thread_state_runnable');case SCHEDULING_STATE.RUNNING:return getColorIdForReservedName('thread_state_running');case SCHEDULING_STATE.SLEEPING:return getColorIdForReservedName('thread_state_sleeping');case SCHEDULING_STATE.DEBUG:case SCHEDULING_STATE.EXIT_DEAD:case SCHEDULING_STATE.STOPPED:case SCHEDULING_STATE.TASK_DEAD:case SCHEDULING_STATE.UNINTR_SLEEP:case SCHEDULING_STATE.UNINTR_SLEEP_WAKE_KILL:case SCHEDULING_STATE.UNINTR_SLEEP_WAKING:case SCHEDULING_STATE.UNKNOWN:case SCHEDULING_STATE.WAKE_KILL:case SCHEDULING_STATE.WAKING:case SCHEDULING_STATE.ZOMBIE:return getColorIdForReservedName('thread_state_uninterruptible');case SCHEDULING_STATE.UNINTR_SLEEP_IO:case SCHEDULING_STATE.UNINTR_SLEEP_WAKE_KILL_IO:case SCHEDULING_STATE.UNINTR_SLEEP_WAKING_IO:return getColorIdForReservedName('thread_state_iowait');default:return getColorIdForReservedName('thread_state_unknown');}},get analysisTypeName(){return'tr.ui.analysis.ThreadTimeSlice';},getAssociatedCpuSlice(){if(!this.cpuOnWhichThreadWasRunning)return undefined;const cpuSlices=this.cpuOnWhichThreadWasRunning.slices;for(let i=0;i<cpuSlices.length;i++){const cpuSlice=cpuSlices[i];if(cpuSlice.start!==this.start)continue;if(cpuSlice.duration!==this.duration)continue;return cpuSlice;}
+return undefined;},getCpuSliceThatTookCpu(){if(this.cpuOnWhichThreadWasRunning)return undefined;let curIndex=this.thread.indexOfTimeSlice(this);let cpuSliceWhenLastRunning;while(curIndex>=0){const curSlice=this.thread.timeSlices[curIndex];if(!curSlice.cpuOnWhichThreadWasRunning){curIndex--;continue;}
+cpuSliceWhenLastRunning=curSlice.getAssociatedCpuSlice();break;}
+if(!cpuSliceWhenLastRunning)return undefined;const cpu=cpuSliceWhenLastRunning.cpu;const indexOfSliceOnCpuWhenLastRunning=cpu.indexOf(cpuSliceWhenLastRunning);const nextRunningSlice=cpu.slices[indexOfSliceOnCpuWhenLastRunning+1];if(!nextRunningSlice)return undefined;if(Math.abs(nextRunningSlice.start-cpuSliceWhenLastRunning.end)<0.00001){return nextRunningSlice;}
+return undefined;}};tr.model.EventRegistry.register(ThreadTimeSlice,{name:'threadTimeSlice',pluralName:'threadTimeSlices'});return{ThreadTimeSlice,SCHEDULING_STATE,};});'use strict';tr.exportTo('tr.model',function(){const CompoundEventSelectionState={NOT_SELECTED:0,EVENT_SELECTED:0x1,SOME_ASSOCIATED_EVENTS_SELECTED:0x2,ALL_ASSOCIATED_EVENTS_SELECTED:0x4,EVENT_AND_SOME_ASSOCIATED_SELECTED:0x1|0x2,EVENT_AND_ALL_ASSOCIATED_SELECTED:0x1|0x4};return{CompoundEventSelectionState,};});'use strict';tr.exportTo('tr.model.um',function(){const CompoundEventSelectionState=tr.model.CompoundEventSelectionState;function UserExpectation(parentModel,initiatorType,start,duration){tr.model.TimedEvent.call(this,start);this.associatedEvents=new tr.model.EventSet();this.duration=duration;this.initiatorType_=initiatorType;this.parentModel=parentModel;this.typeInfo_=undefined;this.sourceEvents=new tr.model.EventSet();}
+const INITIATOR_TYPE={KEYBOARD:'Keyboard',MOUSE:'Mouse',MOUSE_WHEEL:'MouseWheel',TAP:'Tap',PINCH:'Pinch',FLING:'Fling',TOUCH:'Touch',SCROLL:'Scroll',CSS:'CSS',WEBGL:'WebGL',VIDEO:'Video'};UserExpectation.prototype={__proto__:tr.model.TimedEvent.prototype,computeCompoundEvenSelectionState(selection){let cess=CompoundEventSelectionState.NOT_SELECTED;if(selection.contains(this)){cess|=CompoundEventSelectionState.EVENT_SELECTED;}
+if(this.associatedEvents.intersectionIsEmpty(selection)){return cess;}
+const allContained=this.associatedEvents.every(function(event){return selection.contains(event);});if(allContained){cess|=CompoundEventSelectionState.ALL_ASSOCIATED_EVENTS_SELECTED;}else{cess|=CompoundEventSelectionState.SOME_ASSOCIATED_EVENTS_SELECTED;}
+return cess;},get associatedSamples(){const samples=new tr.model.EventSet();this.associatedEvents.forEach(function(event){if(event instanceof tr.model.ThreadSlice){samples.addEventSet(event.overlappingSamples);}});return samples;},get userFriendlyName(){return this.title+' User Expectation at '+
+tr.b.Unit.byName.timeStampInMs.format(this.start);},get stableId(){return('UserExpectation.'+this.guid);},get typeInfo(){if(!this.typeInfo_){this.typeInfo_=UserExpectation.subTypes.findTypeInfo(this.constructor);}
+if(!this.typeInfo_){throw new Error('Unregistered UserExpectation');}
+return this.typeInfo_;},get colorId(){return this.typeInfo.metadata.colorId;},get stageTitle(){return this.typeInfo.metadata.stageTitle;},get initiatorType(){return this.initiatorType_;},get title(){if(!this.initiatorType){return this.stageTitle;}
+return this.initiatorType+' '+this.stageTitle;},get totalCpuMs(){let cpuMs=0;this.associatedEvents.forEach(function(event){if(event.cpuSelfTime){cpuMs+=event.cpuSelfTime;}});return cpuMs;}};const subTypes={};const options=new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE);tr.b.decorateExtensionRegistry(subTypes,options);subTypes.addEventListener('will-register',function(e){const metadata=e.typeInfo.metadata;if(metadata.stageTitle===undefined){throw new Error('Registered UserExpectations must provide '+'stageTitle');}
+if(metadata.colorId===undefined){throw new Error('Registered UserExpectations must provide '+'colorId');}});tr.model.EventRegistry.register(UserExpectation,{name:'userExpectation',pluralName:'userExpectations',subTypes});return{UserExpectation,INITIATOR_TYPE,};});'use strict';tr.exportTo('tr.model.um',function(){function ResponseExpectation(parentModel,initiatorTitle,start,duration,opt_isAnimationBegin){tr.model.um.UserExpectation.call(this,parentModel,initiatorTitle,start,duration);this.isAnimationBegin=opt_isAnimationBegin||false;}
+ResponseExpectation.prototype={__proto__:tr.model.um.UserExpectation.prototype,constructor:ResponseExpectation};tr.model.um.UserExpectation.subTypes.register(ResponseExpectation,{stageTitle:'Response',colorId:tr.b.ColorScheme.getColorIdForReservedName('rail_response')});return{ResponseExpectation,};});'use strict';tr.exportTo('tr.e.audits',function(){const SCHEDULING_STATE=tr.model.SCHEDULING_STATE;const Auditor=tr.c.Auditor;const AndroidModelHelper=tr.model.helpers.AndroidModelHelper;const ColorScheme=tr.b.ColorScheme;const Statistics=tr.b.math.Statistics;const FRAME_PERF_CLASS=tr.model.FRAME_PERF_CLASS;const Alert=tr.model.Alert;const EventInfo=tr.model.EventInfo;const Scalar=tr.b.Scalar;const timeDurationInMs=tr.b.Unit.byName.timeDurationInMs;const EXPECTED_FRAME_TIME_MS=16.67;function getStart(e){return e.start;}
+function getDuration(e){return e.duration;}
+function getCpuDuration(e){return(e.cpuDuration!==undefined)?e.cpuDuration:e.duration;}
+function frameIsActivityStart(frame){return frame.associatedEvents.any(x=>x.title==='activityStart');}
+function frameMissedDeadline(frame){return frame.args.deadline&&frame.args.deadline<frame.end;}
+function DocLinkBuilder(){this.docLinks=[];}
+DocLinkBuilder.prototype={addAppVideo(name,videoId){this.docLinks.push({label:'Video Link',textContent:('Android Performance Patterns: '+name),href:'https://www.youtube.com/watch?list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE&v='+videoId});return this;},addDacRef(name,link){this.docLinks.push({label:'Doc Link',textContent:(name+' documentation'),href:'https://developer.android.com/reference/'+link});return this;},build(){return this.docLinks;}};function AndroidAuditor(model){Auditor.call(this,model);const helper=model.getOrCreateHelper(AndroidModelHelper);if(helper.apps.length||helper.surfaceFlinger){this.helper=helper;}}
+AndroidAuditor.viewAlphaAlertInfo_=new EventInfo('Inefficient View alpha usage','Setting an alpha between 0 and 1 has significant performance costs, if one of the fast alpha paths is not used.',new DocLinkBuilder().addAppVideo('Hidden Cost of Transparency','wIy8g8yNhNk').addDacRef('View#setAlpha()','android/view/View.html#setAlpha(float)').build());AndroidAuditor.saveLayerAlertInfo_=new EventInfo('Expensive rendering with Canvas#saveLayer()','Canvas#saveLayer() incurs extremely high rendering cost. They disrupt the rendering pipeline when drawn, forcing a flush of drawing content. Instead use View hardware layers, or static Bitmaps. This enables the offscreen buffers to be reused in between frames, and avoids the disruptive render target switch.',new DocLinkBuilder().addAppVideo('Hidden Cost of Transparency','wIy8g8yNhNk').addDacRef('Canvas#saveLayerAlpha()','android/graphics/Canvas.html#saveLayerAlpha(android.graphics.RectF, int, int)').build());AndroidAuditor.getSaveLayerAlerts_=function(frame){const badAlphaRegEx=/^(.+) alpha caused (unclipped )?saveLayer (\d+)x(\d+)$/;const saveLayerRegEx=/^(unclipped )?saveLayer (\d+)x(\d+)$/;const ret=[];const events=[];frame.associatedEvents.forEach(function(slice){const match=badAlphaRegEx.exec(slice.title);if(match){const args={'view name':match[1],'width':parseInt(match[3]),'height':parseInt(match[4])};ret.push(new Alert(AndroidAuditor.viewAlphaAlertInfo_,slice.start,[slice],args));}else if(saveLayerRegEx.test(slice.title)){events.push(slice);}},this);if(events.length>ret.length){const unclippedSeen=Statistics.sum(events,function(slice){return saveLayerRegEx.exec(slice.title)[1]?1:0;});const clippedSeen=events.length-unclippedSeen;const earliestStart=Statistics.min(events,function(slice){return slice.start;});const args={'Unclipped saveLayer count (especially bad!)':unclippedSeen,'Clipped saveLayer count':clippedSeen};events.push(frame);ret.push(new Alert(AndroidAuditor.saveLayerAlertInfo_,earliestStart,events,args));}
+return ret;};AndroidAuditor.pathAlertInfo_=new EventInfo('Path texture churn','Paths are drawn with a mask texture, so when a path is modified / newly drawn, that texture must be generated and uploaded to the GPU. Ensure that you cache paths between frames and do not unnecessarily call Path#reset(). You can cut down on this cost by sharing Path object instances between drawables/views.');AndroidAuditor.getPathAlert_=function(frame){const uploadRegEx=/^Generate Path Texture$/;const events=frame.associatedEvents.filter(function(event){return event.title==='Generate Path Texture';});const start=Statistics.min(events,getStart);const duration=Statistics.sum(events,getDuration);if(duration<3)return undefined;events.push(frame);return new Alert(AndroidAuditor.pathAlertInfo_,start,events,{'Time spent':new Scalar(timeDurationInMs,duration)});};AndroidAuditor.uploadAlertInfo_=new EventInfo('Expensive Bitmap uploads','Bitmaps that have been modified / newly drawn must be uploaded to the GPU. Since this is expensive if the total number of pixels uploaded is large, reduce the amount of Bitmap churn in this animation/context, per frame.');AndroidAuditor.getUploadAlert_=function(frame){const uploadRegEx=/^Upload (\d+)x(\d+) Texture$/;const events=[];let start=Number.POSITIVE_INFINITY;let duration=0;let pixelsUploaded=0;frame.associatedEvents.forEach(function(event){const match=uploadRegEx.exec(event.title);if(match){events.push(event);start=Math.min(start,event.start);duration+=event.duration;pixelsUploaded+=parseInt(match[1])*parseInt(match[2]);}});if(events.length===0||duration<3)return undefined;const mPixels=(pixelsUploaded/1000000).toFixed(2)+' million';const args={'Pixels uploaded':mPixels,'Time spent':new Scalar(timeDurationInMs,duration)};events.push(frame);return new Alert(AndroidAuditor.uploadAlertInfo_,start,events,args);};AndroidAuditor.ListViewInflateAlertInfo_=new EventInfo('Inflation during ListView recycling','ListView item recycling involved inflating views. Ensure your Adapter#getView() recycles the incoming View, instead of constructing a new one.');AndroidAuditor.ListViewBindAlertInfo_=new EventInfo('Inefficient ListView recycling/rebinding','ListView recycling taking too much time per frame. Ensure your Adapter#getView() binds data efficiently.');AndroidAuditor.getListViewAlert_=function(frame){const events=frame.associatedEvents.filter(function(event){return event.title==='obtainView'||event.title==='setupListItem';});const duration=Statistics.sum(events,getCpuDuration);if(events.length===0||duration<3)return undefined;let hasInflation=false;for(const event of events){if(event.findDescendentSlice('inflate')){hasInflation=true;}}
+const start=Statistics.min(events,getStart);const args={'Time spent':new Scalar(timeDurationInMs,duration)};args['ListView items '+(hasInflation?'inflated':'rebound')]=events.length/2;const eventInfo=hasInflation?AndroidAuditor.ListViewInflateAlertInfo_:AndroidAuditor.ListViewBindAlertInfo_;events.push(frame);return new Alert(eventInfo,start,events,args);};AndroidAuditor.measureLayoutAlertInfo_=new EventInfo('Expensive measure/layout pass','Measure/Layout took a significant time, contributing to jank. Avoid triggering layout during animations.',new DocLinkBuilder().addAppVideo('Invalidations, Layouts, and Performance','we6poP0kw6E').build());AndroidAuditor.getMeasureLayoutAlert_=function(frame){const events=frame.associatedEvents.filter(function(event){return event.title==='measure'||event.title==='layout';});const duration=Statistics.sum(events,getCpuDuration);if(events.length===0||duration<3)return undefined;const start=Statistics.min(events,getStart);events.push(frame);return new Alert(AndroidAuditor.measureLayoutAlertInfo_,start,events,{'Time spent':new Scalar(timeDurationInMs,duration)});};AndroidAuditor.viewDrawAlertInfo_=new EventInfo('Long View#draw()','Recording the drawing commands of invalidated Views took a long time. Avoid significant work in View or Drawable custom drawing, especially allocations or drawing to Bitmaps.',new DocLinkBuilder().addAppVideo('Invalidations, Layouts, and Performance','we6poP0kw6E').addAppVideo('Avoiding Allocations in onDraw()','HAK5acHQ53E').build());AndroidAuditor.getViewDrawAlert_=function(frame){let slice=undefined;for(const event of frame.associatedEvents){if(event.title==='getDisplayList'||event.title==='Record View#draw()'){slice=event;break;}}
+if(!slice||getCpuDuration(slice)<3)return undefined;return new Alert(AndroidAuditor.viewDrawAlertInfo_,slice.start,[slice,frame],{'Time spent':new Scalar(timeDurationInMs,getCpuDuration(slice))});};AndroidAuditor.blockingGcAlertInfo_=new EventInfo('Blocking Garbage Collection','Blocking GCs are caused by object churn, and made worse by having large numbers of objects in the heap. Avoid allocating objects during animations/scrolling, and recycle Bitmaps to avoid triggering garbage collection.',new DocLinkBuilder().addAppVideo('Garbage Collection in Android','pzfzz50W5Uo').addAppVideo('Avoiding Allocations in onDraw()','HAK5acHQ53E').build());AndroidAuditor.getBlockingGcAlert_=function(frame){const events=frame.associatedEvents.filter(function(event){return event.title==='DVM Suspend'||event.title==='GC: Wait For Concurrent';});const blockedDuration=Statistics.sum(events,getDuration);if(blockedDuration<3)return undefined;const start=Statistics.min(events,getStart);events.push(frame);return new Alert(AndroidAuditor.blockingGcAlertInfo_,start,events,{'Blocked duration':new Scalar(timeDurationInMs,blockedDuration)});};AndroidAuditor.lockContentionAlertInfo_=new EventInfo('Lock contention','UI thread lock contention is caused when another thread holds a lock that the UI thread is trying to use. UI thread progress is blocked until the lock is released. Inspect locking done within the UI thread, and ensure critical sections are short.');AndroidAuditor.getLockContentionAlert_=function(frame){const events=frame.associatedEvents.filter(function(event){return/^Lock Contention on /.test(event.title);});const blockedDuration=Statistics.sum(events,getDuration);if(blockedDuration<1)return undefined;const start=Statistics.min(events,getStart);events.push(frame);return new Alert(AndroidAuditor.lockContentionAlertInfo_,start,events,{'Blocked duration':new Scalar(timeDurationInMs,blockedDuration)});};AndroidAuditor.schedulingAlertInfo_=new EventInfo('Scheduling delay','Work to produce this frame was descheduled for several milliseconds, contributing to jank. Ensure that code on the UI thread doesn\'t block on work being done on other threads, and that background threads (doing e.g. network or bitmap loading) are running at android.os.Process#THREAD_PRIORITY_BACKGROUND or lower so they are less likely to interrupt the UI thread. These background threads should show up with a priority number of 130 or higher in the scheduling section under the Kernel process.');AndroidAuditor.getSchedulingAlert_=function(frame){let totalDuration=0;const totalStats={};for(const ttr of frame.threadTimeRanges){const stats=ttr.thread.getSchedulingStatsForRange(ttr.start,ttr.end);for(const[key,value]of Object.entries(stats)){if(!(key in totalStats)){totalStats[key]=0;}
+totalStats[key]+=value;totalDuration+=value;}}
+if(!(SCHEDULING_STATE.RUNNING in totalStats)||totalDuration===0||totalDuration-totalStats[SCHEDULING_STATE.RUNNING]<3){return;}
+const args={};for(const[key,value]of Object.entries(totalStats)){let newKey=key;if(key===SCHEDULING_STATE.RUNNABLE){newKey='Not scheduled, but runnable';}else if(key===SCHEDULING_STATE.UNINTR_SLEEP){newKey='Blocking I/O delay';}
+args[newKey]=new Scalar(timeDurationInMs,value);}
+return new Alert(AndroidAuditor.schedulingAlertInfo_,frame.start,[frame],args);};AndroidAuditor.prototype={__proto__:Auditor.prototype,renameAndSort_(){this.model.kernel.important=false;this.model.getAllProcesses().forEach(function(process){if(this.helper.surfaceFlinger&&process===this.helper.surfaceFlinger.process){if(!process.name){process.name='SurfaceFlinger';}
+process.sortIndex=Number.NEGATIVE_INFINITY;process.important=false;return;}
+const uiThread=process.getThread(process.pid);if(!process.name&&uiThread&&uiThread.name){if(/^ndroid\./.test(uiThread.name)){uiThread.name='a'+uiThread.name;}
+process.name=uiThread.name;uiThread.name='UI Thread';}
+process.sortIndex=0;for(const tid in process.threads){process.sortIndex-=process.threads[tid].sliceGroup.slices.length;}},this);this.model.getAllThreads().forEach(function(thread){if(thread.tid===thread.parent.pid){thread.sortIndex=-3;}
+if(thread.name==='RenderThread'){thread.sortIndex=-2;}
+if(/^hwuiTask/.test(thread.name)){thread.sortIndex=-1;}});},pushFramesAndJudgeJank_(){let badFramesObserved=0;let framesObserved=0;const surfaceFlinger=this.helper.surfaceFlinger;this.helper.apps.forEach(function(app){app.process.frames=app.getFrames();app.process.frames.forEach(function(frame){if(frame.totalDuration>EXPECTED_FRAME_TIME_MS*2){badFramesObserved+=2;frame.perfClass=FRAME_PERF_CLASS.TERRIBLE;}else if(frame.totalDuration>EXPECTED_FRAME_TIME_MS||frameMissedDeadline(frame)){badFramesObserved++;frame.perfClass=FRAME_PERF_CLASS.BAD;}else{frame.perfClass=FRAME_PERF_CLASS.GOOD;}});framesObserved+=app.process.frames.length;});if(framesObserved){const portionBad=badFramesObserved/framesObserved;if(portionBad>0.3){this.model.faviconHue='red';}else if(portionBad>0.05){this.model.faviconHue='yellow';}else{this.model.faviconHue='green';}}},pushEventInfo_(){const appAnnotator=new AppAnnotator();this.helper.apps.forEach(function(app){if(app.uiThread){appAnnotator.applyEventInfos(app.uiThread.sliceGroup);}
+if(app.renderThread){appAnnotator.applyEventInfos(app.renderThread.sliceGroup);}});},runAnnotate(){if(!this.helper)return;this.renameAndSort_();this.pushFramesAndJudgeJank_();this.pushEventInfo_();this.helper.iterateImportantSlices(function(slice){slice.important=true;});},runAudit(){if(!this.helper)return;const alerts=this.model.alerts;this.helper.apps.forEach(function(app){app.getFrames().forEach(function(frame){alerts.push.apply(alerts,AndroidAuditor.getSaveLayerAlerts_(frame));if(frame.perfClass===FRAME_PERF_CLASS.NEUTRAL||frame.perfClass===FRAME_PERF_CLASS.GOOD){return;}
+let alert=AndroidAuditor.getPathAlert_(frame);if(alert)alerts.push(alert);alert=AndroidAuditor.getUploadAlert_(frame);if(alert)alerts.push(alert);alert=AndroidAuditor.getListViewAlert_(frame);if(alert)alerts.push(alert);alert=AndroidAuditor.getMeasureLayoutAlert_(frame);if(alert)alerts.push(alert);alert=AndroidAuditor.getViewDrawAlert_(frame);if(alert)alerts.push(alert);alert=AndroidAuditor.getBlockingGcAlert_(frame);if(alert)alerts.push(alert);alert=AndroidAuditor.getLockContentionAlert_(frame);if(alert)alerts.push(alert);alert=AndroidAuditor.getSchedulingAlert_(frame);if(alert)alerts.push(alert);});},this);this.addRenderingInteractionRecords();this.addInputInteractionRecords();},addRenderingInteractionRecords(){const events=[];this.helper.apps.forEach(function(app){events.push.apply(events,app.getAnimationAsyncSlices());events.push.apply(events,app.getFrames());});const mergerFunction=function(events){const ir=new tr.model.um.ResponseExpectation(this.model,'Rendering',events[0].min,events[events.length-1].max-events[0].min);this.model.userModel.expectations.push(ir);}.bind(this);tr.b.math.mergeRanges(tr.b.math.convertEventsToRanges(events),30,mergerFunction);},addInputInteractionRecords(){const inputSamples=[];this.helper.apps.forEach(function(app){inputSamples.push.apply(inputSamples,app.getInputSamples());});const mergerFunction=function(events){const ir=new tr.model.um.ResponseExpectation(this.model,'Input',events[0].min,events[events.length-1].max-events[0].min);this.model.userModel.expectations.push(ir);}.bind(this);const inputRanges=inputSamples.map(function(sample){return tr.b.math.Range.fromExplicitRange(sample.timestamp,sample.timestamp);});tr.b.math.mergeRanges(inputRanges,30,mergerFunction);}};Auditor.register(AndroidAuditor);function AppAnnotator(){this.titleInfoLookup=new Map();this.titleParentLookup=new Map();this.build_();}
+AppAnnotator.prototype={build_(){const registerEventInfo=function(dict){this.titleInfoLookup.set(dict.title,new EventInfo(dict.title,dict.description,dict.docLinks));if(dict.parents){this.titleParentLookup.set(dict.title,dict.parents);}}.bind(this);registerEventInfo({title:'inflate',description:'Constructing a View hierarchy from pre-processed XML via LayoutInflater#layout. This includes constructing all of the View objects in the hierarchy, and applying styled attributes.'});registerEventInfo({title:'obtainView',description:'Adapter#getView() called to bind content to a recycled View that is being presented.'});registerEventInfo({title:'setupListItem',description:'Attached a newly-bound, recycled View to its parent ListView.'});registerEventInfo({title:'setupGridItem',description:'Attached a newly-bound, recycled View to its parent GridView.'});const choreographerLinks=new DocLinkBuilder().addDacRef('Choreographer','android/view/Choreographer.html').build();registerEventInfo({title:'Choreographer#doFrame',docLinks:choreographerLinks,description:'Choreographer executes frame callbacks for inputs, animations, and rendering traversals. When this work is done, a frame will be presented to the user.'});registerEventInfo({title:'input',parents:['Choreographer#doFrame'],docLinks:choreographerLinks,description:'Input callbacks are processed. This generally encompasses dispatching input to Views, as well as any work the Views do to process this input/gesture.'});registerEventInfo({title:'animation',parents:['Choreographer#doFrame'],docLinks:choreographerLinks,description:'Animation callbacks are processed. This is generally minimal work, as animations determine progress for the frame, and push new state to animated objects (such as setting View properties).'});registerEventInfo({title:'traversals',parents:['Choreographer#doFrame'],docLinks:choreographerLinks,description:'Primary draw traversals. This is the primary traversal of the View hierarchy, including layout and draw passes.'});const traversalParents=['Choreographer#doFrame','performTraversals'];const layoutLinks=new DocLinkBuilder().addDacRef('View#Layout','android/view/View.html#Layout').build();registerEventInfo({title:'performTraversals',description:'A drawing traversal of the View hierarchy, comprised of all layout and drawing needed to produce the frame.'});registerEventInfo({title:'measure',parents:traversalParents,docLinks:layoutLinks,description:'First of two phases in view hierarchy layout. Views are asked to size themselves according to constraints supplied by their parent. Some ViewGroups may measure a child more than once to help satisfy their own constraints. Nesting ViewGroups that measure children more than once can lead to excessive and repeated work.'});registerEventInfo({title:'layout',parents:traversalParents,docLinks:layoutLinks,description:'Second of two phases in view hierarchy layout, repositioning content and child Views into their new locations.'});const drawString='Draw pass over the View hierarchy. Every invalidated View will have its drawing commands recorded. On Android versions prior to Lollipop, this would also include the issuing of draw commands to the GPU. Starting with Lollipop, it only includes the recording of commands, and syncing that information to the RenderThread.';registerEventInfo({title:'draw',parents:traversalParents,description:drawString});const recordString='Every invalidated View\'s drawing commands are recorded. Each will have View#draw() called, and is passed a Canvas that will record and store its drawing commands until it is next invalidated/rerecorded.';registerEventInfo({title:'getDisplayList',parents:['draw'],description:recordString});registerEventInfo({title:'Record View#draw()',parents:['draw'],description:recordString});registerEventInfo({title:'drawDisplayList',parents:['draw'],description:'Execution of recorded draw commands to generate a frame. This represents the actual formation and issuing of drawing commands to the GPU. On Android L and higher devices, this work is done on a dedicated RenderThread, instead of on the UI Thread.'});registerEventInfo({title:'DrawFrame',description:'RenderThread portion of the standard UI/RenderThread split frame. This represents the actual formation and issuing of drawing commands to the GPU.'});registerEventInfo({title:'doFrame',description:'RenderThread animation frame. Represents drawing work done by the RenderThread on a frame where the UI thread did not produce new drawing content.'});registerEventInfo({title:'syncFrameState',description:'Sync stage between the UI thread and the RenderThread, where the UI thread hands off a frame (including information about modified Views). Time in this method primarily consists of uploading modified Bitmaps to the GPU. After this sync is completed, the UI thread is unblocked, and the RenderThread starts to render the frame.'});registerEventInfo({title:'flush drawing commands',description:'Issuing the now complete drawing commands to the GPU.'});registerEventInfo({title:'eglSwapBuffers',description:'Complete GPU rendering of the frame.'});registerEventInfo({title:'RV Scroll',description:'RecyclerView is calculating a scroll. If there are too many of these in Systrace, some Views inside RecyclerView might be causing it. Try to avoid using EditText, focusable views or handle them with care.'});registerEventInfo({title:'RV OnLayout',description:'OnLayout has been called by the View system. If this shows up too many times in Systrace, make sure the children of RecyclerView do not update themselves directly. This will cause a full re-layout but when it happens via the Adapter notifyItemChanged, RecyclerView can avoid full layout calculation.'});registerEventInfo({title:'RV FullInvalidate',description:'NotifyDataSetChanged or equal has been called. If this is taking a long time, try sending granular notify adapter changes instead of just calling notifyDataSetChanged or setAdapter / swapAdapter. Adding stable ids to your adapter might help.'});registerEventInfo({title:'RV PartialInvalidate',description:'RecyclerView is rebinding a View. If this is taking a lot of time, consider optimizing your layout or make sure you are not doing extra operations in onBindViewHolder call.'});registerEventInfo({title:'RV OnBindView',description:'RecyclerView is rebinding a View. If this is taking a lot of time, consider optimizing your layout or make sure you are not doing extra operations in onBindViewHolder call.'});registerEventInfo({title:'RV CreateView',description:'RecyclerView is creating a new View. If too many of these are present: 1) There might be a problem in Recycling (e.g. custom Animations that set transient state and prevent recycling or ItemAnimator not implementing the contract properly. See Adapter#onFailedToRecycleView(ViewHolder). 2) There may be too many item view types. Try merging them. 3) There might be too many itemChange animations and not enough space in RecyclerPool. Try increasing your pool size and item cache size.'});registerEventInfo({title:'eglSwapBuffers',description:'The CPU has finished producing drawing commands, and is flushing drawing work to the GPU, and posting that buffer to the consumer (which is often SurfaceFlinger window composition). Once this is completed, the GPU can produce the frame content without any involvement from the CPU.'});},applyEventInfosRecursive_(parentNames,slice){const checkExpectedParentNames=function(expectedParentNames){if(!expectedParentNames)return true;return expectedParentNames.some(function(name){return parentNames.has(name);});};if(this.titleInfoLookup.has(slice.title)){if(checkExpectedParentNames(this.titleParentLookup.get(slice.title))){slice.info=this.titleInfoLookup.get(slice.title);}}
+if(slice.subSlices.length>0){if(!parentNames.has(slice.title)){parentNames.set(slice.title,0);}
+parentNames.set(slice.title,parentNames.get(slice.title)+1);slice.subSlices.forEach(function(subSlice){this.applyEventInfosRecursive_(parentNames,subSlice);},this);parentNames.set(slice.title,parentNames.get(slice.title)-1);if(parentNames.get(slice.title)===0){delete parentNames[slice.title];}}},applyEventInfos(sliceGroup){sliceGroup.topLevelSlices.forEach(function(slice){this.applyEventInfosRecursive_(new Map(),slice);},this);}};return{AndroidAuditor,};});'use strict';tr.exportTo('tr.model',function(){function ObjectSnapshot(objectInstance,ts,args){tr.model.Event.call(this);this.objectInstance=objectInstance;this.ts=ts;this.args=args;}
+ObjectSnapshot.prototype={__proto__:tr.model.Event.prototype,preInitialize(){},initialize(){},referencedAt(item,object,field){},addBoundsToRange(range){range.addValue(this.ts);},get userFriendlyName(){return'Snapshot of '+
+this.objectInstance.typeName+' '+
+this.objectInstance.id+' @ '+
+tr.b.Unit.byName.timeStampInMs.format(this.ts);}};tr.model.EventRegistry.register(ObjectSnapshot,{name:'objectSnapshot',pluralName:'objectSnapshots'});return{ObjectSnapshot,};});'use strict';tr.exportTo('tr.model',function(){const ObjectSnapshot=tr.model.ObjectSnapshot;function ObjectInstance(parent,scopedId,category,name,creationTs,opt_baseTypeName){tr.model.Event.call(this);this.parent=parent;this.scopedId=scopedId;this.category=category;this.baseTypeName=opt_baseTypeName?opt_baseTypeName:name;this.name=name;this.creationTs=creationTs;this.creationTsWasExplicit=false;this.deletionTs=Number.MAX_VALUE;this.deletionTsWasExplicit=false;this.colorId=0;this.bounds=new tr.b.math.Range();this.snapshots=[];this.hasImplicitSnapshots=false;}
+ObjectInstance.prototype={__proto__:tr.model.Event.prototype,get typeName(){return this.name;},addBoundsToRange(range){range.addRange(this.bounds);},addSnapshot(ts,args,opt_name,opt_baseTypeName){if(ts<this.creationTs){throw new Error('Snapshots must be >= instance.creationTs');}
+if(ts>=this.deletionTs){throw new Error('Snapshots cannot be added after '+'an objects deletion timestamp.');}
+let lastSnapshot;if(this.snapshots.length>0){lastSnapshot=this.snapshots[this.snapshots.length-1];if(lastSnapshot.ts===ts){throw new Error('Snapshots already exists at this time!');}
+if(ts<lastSnapshot.ts){throw new Error('Snapshots must be added in increasing timestamp order');}}
+if(opt_name&&(this.name!==opt_name)){if(!opt_baseTypeName){throw new Error('Must provide base type name for name update');}
+if(this.baseTypeName!==opt_baseTypeName){throw new Error('Cannot update type name: base types dont match');}
+this.name=opt_name;}
+const snapshotConstructor=tr.model.ObjectSnapshot.subTypes.getConstructor(this.category,this.name);const snapshot=new snapshotConstructor(this,ts,args);this.snapshots.push(snapshot);return snapshot;},wasDeleted(ts){let lastSnapshot;if(this.snapshots.length>0){lastSnapshot=this.snapshots[this.snapshots.length-1];if(lastSnapshot.ts>ts){throw new Error('Instance cannot be deleted at ts='+
+ts+'. A snapshot exists that is older.');}}
+this.deletionTs=ts;this.deletionTsWasExplicit=true;},preInitialize(){for(let i=0;i<this.snapshots.length;i++){this.snapshots[i].preInitialize();}},initialize(){for(let i=0;i<this.snapshots.length;i++){this.snapshots[i].initialize();}},isAliveAt(ts){if(ts<this.creationTs&&this.creationTsWasExplicit){return false;}
+if(ts>this.deletionTs){return false;}
+return true;},getSnapshotAt(ts){if(ts<this.creationTs){if(this.creationTsWasExplicit){throw new Error('ts must be within lifetime of this instance');}
+return this.snapshots[0];}
+if(ts>this.deletionTs){throw new Error('ts must be within lifetime of this instance');}
+const snapshots=this.snapshots;const i=tr.b.math.findIndexInSortedIntervals(snapshots,function(snapshot){return snapshot.ts;},function(snapshot,i){if(i===snapshots.length-1){return snapshots[i].objectInstance.deletionTs;}
+return snapshots[i+1].ts-snapshots[i].ts;},ts);if(i<0){return this.snapshots[0];}
+if(i>=this.snapshots.length){return this.snapshots[this.snapshots.length-1];}
+return this.snapshots[i];},updateBounds(){this.bounds.reset();this.bounds.addValue(this.creationTs);if(this.deletionTs!==Number.MAX_VALUE){this.bounds.addValue(this.deletionTs);}else if(this.snapshots.length>0){this.bounds.addValue(this.snapshots[this.snapshots.length-1].ts);}},shiftTimestampsForward(amount){this.creationTs+=amount;if(this.deletionTs!==Number.MAX_VALUE){this.deletionTs+=amount;}
+this.snapshots.forEach(function(snapshot){snapshot.ts+=amount;});},get userFriendlyName(){return this.typeName+' object '+this.scopedId;}};tr.model.EventRegistry.register(ObjectInstance,{name:'objectInstance',pluralName:'objectInstances'});return{ObjectInstance,};});'use strict';tr.exportTo('tr.e.chrome',function(){const ObjectSnapshot=tr.model.ObjectSnapshot;const ObjectInstance=tr.model.ObjectInstance;function BlameContextSnapshot(){ObjectSnapshot.apply(this,arguments);}
+BlameContextSnapshot.prototype={__proto__:ObjectSnapshot.prototype,get parentContext(){if(this.args.parent instanceof BlameContextSnapshot){return this.args.parent;}
+return undefined;},get userFriendlyName(){return'BlameContext';}};function BlameContextInstance(){ObjectInstance.apply(this,arguments);}
+BlameContextInstance.prototype={__proto__:ObjectInstance.prototype,get blameContextType(){throw new Error('Not implemented');}};return{BlameContextSnapshot,BlameContextInstance,};});'use strict';tr.exportTo('tr.e.chrome',function(){const BlameContextSnapshot=tr.e.chrome.BlameContextSnapshot;const BlameContextInstance=tr.e.chrome.BlameContextInstance;function FrameTreeNodeSnapshot(){BlameContextSnapshot.apply(this,arguments);}
+FrameTreeNodeSnapshot.prototype={__proto__:BlameContextSnapshot.prototype,get renderFrame(){if(this.args.renderFrame instanceof tr.e.chrome.RenderFrameSnapshot){return this.args.renderFrame;}
+return undefined;},get url(){return this.args.url;},get userFriendlyName(){return'FrameTreeNode';}};tr.model.ObjectSnapshot.subTypes.register(FrameTreeNodeSnapshot,{typeName:'FrameTreeNode'});function FrameTreeNodeInstance(){BlameContextInstance.apply(this,arguments);}
+FrameTreeNodeInstance.prototype={__proto__:BlameContextInstance.prototype,get blameContextType(){return'Frame';}};tr.model.ObjectInstance.subTypes.register(FrameTreeNodeInstance,{typeName:'FrameTreeNode'});return{FrameTreeNodeSnapshot,FrameTreeNodeInstance,};});'use strict';tr.exportTo('tr.e.chrome',function(){const BlameContextSnapshot=tr.e.chrome.BlameContextSnapshot;const BlameContextInstance=tr.e.chrome.BlameContextInstance;function RenderFrameSnapshot(){BlameContextSnapshot.apply(this,arguments);}
+RenderFrameSnapshot.prototype={__proto__:BlameContextSnapshot.prototype,referencedAt(item,object,field){if(item instanceof tr.e.chrome.FrameTreeNodeSnapshot&&object===item.args&&field==='renderFrame'){this.args.frameTreeNode=item;}},get frameTreeNode(){if(this.args.frameTreeNode instanceof
+tr.e.chrome.FrameTreeNodeSnapshot){return this.args.frameTreeNode;}
+return undefined;},get url(){if(this.frameTreeNode){return this.frameTreeNode.url;}
+return undefined;},get userFriendlyName(){return'RenderFrame';}};tr.model.ObjectSnapshot.subTypes.register(RenderFrameSnapshot,{typeName:'RenderFrame'});function RenderFrameInstance(){BlameContextInstance.apply(this,arguments);}
+RenderFrameInstance.prototype={__proto__:BlameContextInstance.prototype,get blameContextType(){return'Frame';}};tr.model.ObjectInstance.subTypes.register(RenderFrameInstance,{typeName:'RenderFrame'});return{RenderFrameSnapshot,RenderFrameInstance,};});'use strict';tr.exportTo('tr.e.chrome',function(){const BlameContextSnapshot=tr.e.chrome.BlameContextSnapshot;const BlameContextInstance=tr.e.chrome.BlameContextInstance;function TopLevelSnapshot(){BlameContextSnapshot.apply(this,arguments);}
+TopLevelSnapshot.prototype={__proto__:BlameContextSnapshot.prototype,get userFriendlyName(){return'TopLevel';}};tr.model.ObjectSnapshot.subTypes.register(TopLevelSnapshot,{typeName:'TopLevel'});function TopLevelInstance(){BlameContextInstance.apply(this,arguments);}
+TopLevelInstance.prototype={__proto__:BlameContextInstance.prototype,get blameContextType(){return'TopLevel';}};tr.model.ObjectInstance.subTypes.register(TopLevelInstance,{typeName:'TopLevel'});return{TopLevelSnapshot,TopLevelInstance,};});'use strict';tr.exportTo('tr.model',function(){function AsyncSlice(category,title,colorId,start,args,duration,opt_isTopLevel,opt_cpuStart,opt_cpuDuration,opt_argsStripped){tr.model.TimedEvent.call(this,start);this.category=category||'';this.originalTitle=title;this.title=title;this.colorId=colorId;this.args=args;this.startStackFrame=undefined;this.endStackFrame=undefined;this.didNotFinish=false;this.important=false;this.subSlices=[];this.parentContainer_=undefined;this.id=undefined;this.startThread=undefined;this.endThread=undefined;this.cpuStart=undefined;this.cpuDuration=undefined;this.argsStripped=false;this.startStackFrame=undefined;this.endStackFrame=undefined;this.duration=duration;this.isTopLevel=(opt_isTopLevel===true);if(opt_cpuStart!==undefined){this.cpuStart=opt_cpuStart;}
+if(opt_cpuDuration!==undefined){this.cpuDuration=opt_cpuDuration;}
+if(opt_argsStripped!==undefined){this.argsStripped=opt_argsStripped;}}
+AsyncSlice.prototype={__proto__:tr.model.TimedEvent.prototype,get analysisTypeName(){return this.title;},get parentContainer(){return this.parentContainer_;},set parentContainer(parentContainer){this.parentContainer_=parentContainer;for(let i=0;i<this.subSlices.length;i++){const subSlice=this.subSlices[i];if(subSlice.parentContainer===undefined){subSlice.parentContainer=parentContainer;}}},get viewSubGroupTitle(){return this.title;},get userFriendlyName(){return'Async slice '+this.title+' at '+
+tr.b.Unit.byName.timeStampInMs.format(this.start);},get stableId(){const parentAsyncSliceGroup=this.parentContainer.asyncSliceGroup;return parentAsyncSliceGroup.stableId+'.'+
+parentAsyncSliceGroup.slices.indexOf(this);},*findTopmostSlicesRelativeToThisSlice(eventPredicate,opt_this){if(eventPredicate(this)){yield this;return;}
+for(const s of this.subSlices){yield*s.findTopmostSlicesRelativeToThisSlice(eventPredicate);}},findDescendentSlice(targetTitle){if(!this.subSlices)return undefined;for(let i=0;i<this.subSlices.length;i++){if(this.subSlices[i].title===targetTitle){return this.subSlices[i];}
+const slice=this.subSlices[i].findDescendentSlice(targetTitle);if(slice)return slice;}
+return undefined;},*enumerateAllDescendents(){for(const slice of this.subSlices){yield slice;}
+for(const slice of this.subSlices){yield*slice.enumerateAllDescendents();}},compareTo(that){return this.title.localeCompare(that.title);}};tr.model.EventRegistry.register(AsyncSlice,{name:'asyncSlice',pluralName:'asyncSlices'});return{AsyncSlice,};});'use strict';tr.exportTo('tr.model.helpers',function(){const MAIN_FRAMETIME_TYPE='main_frametime_type';const IMPL_FRAMETIME_TYPE='impl_frametime_type';const MAIN_RENDERING_STATS='BenchmarkInstrumentation::MainThreadRenderingStats';const IMPL_RENDERING_STATS='BenchmarkInstrumentation::ImplThreadRenderingStats';function getSlicesIntersectingRange(rangeOfInterest,slices){const slicesInFilterRange=[];for(let i=0;i<slices.length;i++){const slice=slices[i];if(rangeOfInterest.intersectsExplicitRangeInclusive(slice.start,slice.end)){slicesInFilterRange.push(slice);}}
+return slicesInFilterRange;}
+function ChromeProcessHelper(modelHelper,process){this.modelHelper=modelHelper;this.process=process;this.telemetryInternalRanges_=undefined;}
+ChromeProcessHelper.prototype={get pid(){return this.process.pid;},isTelemetryInternalEvent(slice){if(this.telemetryInternalRanges_===undefined){this.findTelemetryInternalRanges_();}
+for(const range of this.telemetryInternalRanges_){if(range.containsExplicitRangeInclusive(slice.start,slice.end)){return true;}}
+return false;},findTelemetryInternalRanges_(){this.telemetryInternalRanges_=[];let start=0;for(const thread of Object.values(this.process.threads)){for(const slice of thread.asyncSliceGroup.getDescendantEvents()){if(/^telemetry\.internal\.[^.]*\.start$/.test(slice.title)){start=slice.start;}else if(/^telemetry\.internal\.[^.]*\.end$/.test(slice.title)&&start!==undefined){this.telemetryInternalRanges_.push(tr.b.math.Range.fromExplicitRange(start,slice.end));start=undefined;}}}},getFrameEventsInRange(frametimeType,range){const titleToGet=(frametimeType===MAIN_FRAMETIME_TYPE?MAIN_RENDERING_STATS:IMPL_RENDERING_STATS);const frameEvents=[];for(const event of this.process.getDescendantEvents()){if(event.title===titleToGet){if(range.intersectsExplicitRangeInclusive(event.start,event.end)){frameEvents.push(event);}}}
+frameEvents.sort(function(a,b){return a.start-b.start;});return frameEvents;}};function getFrametimeDataFromEvents(frameEvents){const frametimeData=[];for(let i=1;i<frameEvents.length;i++){const diff=frameEvents[i].start-frameEvents[i-1].start;frametimeData.push({'x':frameEvents[i].start,'frametime':diff});}
+return frametimeData;}
+return{ChromeProcessHelper,MAIN_FRAMETIME_TYPE,IMPL_FRAMETIME_TYPE,MAIN_RENDERING_STATS,IMPL_RENDERING_STATS,getSlicesIntersectingRange,getFrametimeDataFromEvents,};});'use strict';tr.exportTo('tr.model.helpers',function(){function ChromeBrowserHelper(modelHelper,process){tr.model.helpers.ChromeProcessHelper.call(this,modelHelper,process);this.mainThread_=process.findAtMostOneThreadNamed('CrBrowserMain');if(!process.name){process.name=ChromeBrowserHelper.PROCESS_NAME;}}
+ChromeBrowserHelper.PROCESS_NAME='Browser';ChromeBrowserHelper.isBrowserProcess=function(process){return!!process.findAtMostOneThreadNamed('CrBrowserMain');};ChromeBrowserHelper.prototype={__proto__:tr.model.helpers.ChromeProcessHelper.prototype,get browserName(){const hasInProcessRendererThread=this.process.findAllThreadsNamed('Chrome_InProcRendererThread').length>0;return hasInProcessRendererThread?'webview':'chrome';},get mainThread(){return this.mainThread_;},get rendererHelpers(){return this.modelHelper.rendererHelpers;},getLoadingEventsInRange(rangeOfInterest){return this.getAllAsyncSlicesMatching(function(slice){return slice.title.indexOf('WebContentsImpl Loading')===0&&rangeOfInterest.intersectsExplicitRangeInclusive(slice.start,slice.end);});},getCommitProvisionalLoadEventsInRange(rangeOfInterest){return this.getAllAsyncSlicesMatching(function(slice){return slice.title==='RenderFrameImpl::didCommitProvisionalLoad'&&rangeOfInterest.intersectsExplicitRangeInclusive(slice.start,slice.end);});},get hasLatencyEvents(){let hasLatency=false;for(const thread of this.modelHelper.model.getAllThreads()){for(const event of thread.getDescendantEvents()){if(!event.isTopLevel)continue;if(!(event instanceof tr.e.cc.InputLatencyAsyncSlice)){continue;}
+hasLatency=true;}}
+return hasLatency;},getLatencyEventsInRange(rangeOfInterest){return this.getAllAsyncSlicesMatching(function(slice){return(slice.title.indexOf('InputLatency')===0)&&rangeOfInterest.intersectsExplicitRangeInclusive(slice.start,slice.end);});},getAllAsyncSlicesMatching(pred,opt_this){const events=[];this.iterAllThreads(function(thread){for(const slice of thread.getDescendantEvents()){if(pred.call(opt_this,slice)){events.push(slice);}}});return events;},iterAllThreads(func,opt_this){for(const thread of Object.values(this.process.threads)){func.call(opt_this,thread);}
+for(const rendererHelper of Object.values(this.rendererHelpers)){const rendererProcess=rendererHelper.process;for(const thread of Object.values(rendererProcess.threads)){func.call(opt_this,thread);}}}};return{ChromeBrowserHelper,};});'use strict';tr.exportTo('tr.model.helpers',function(){function ChromeGpuHelper(modelHelper,process){tr.model.helpers.ChromeProcessHelper.call(this,modelHelper,process);if(!process.name){process.name=ChromeGpuHelper.PROCESS_NAME;}}
+ChromeGpuHelper.PROCESS_NAME='GPU Process';ChromeGpuHelper.isGpuProcess=function(process){if(process.findAtMostOneThreadNamed('CrBrowserMain')||process.findAtMostOneThreadNamed('CrRendererMain')){return false;}
+return process.findAllThreadsNamed('CrGpuMain').length>0;};ChromeGpuHelper.prototype={__proto__:tr.model.helpers.ChromeProcessHelper.prototype};return{ChromeGpuHelper,};});'use strict';tr.exportTo('tr.b',function(){function SinebowColorGenerator(opt_a,opt_brightness){this.a_=(opt_a===undefined)?1:opt_a;this.brightness_=(opt_brightness===undefined)?1:opt_brightness;this.colorIndex_=0;this.keyToColor={};}
+SinebowColorGenerator.prototype={colorForKey(key){if(!this.keyToColor[key]){this.keyToColor[key]=this.nextColor();}
+return this.keyToColor[key];},nextColor(){const components=SinebowColorGenerator.nthColor(this.colorIndex_++);return tr.b.Color.fromString(SinebowColorGenerator.calculateColor(components[0],components[1],components[2],this.a_,this.brightness_));}};SinebowColorGenerator.PHI=(1+Math.sqrt(5))/2;SinebowColorGenerator.sinebow_=function(h){h+=0.5;h=-h;let r=Math.sin(Math.PI*h);let g=Math.sin(Math.PI*(h+1/3));let b=Math.sin(Math.PI*(h+2/3));r*=r;g*=g;b*=b;const y=2*(0.2989*r+0.5870*g+0.1140*b);r/=y;g/=y;b/=y;return[256*r,256*g,256*b];};SinebowColorGenerator.nthColor=function(n){return SinebowColorGenerator.sinebow_(n*this.PHI);};SinebowColorGenerator.calculateColor=function(r,g,b,a,brightness){if(brightness<=1){r*=brightness;g*=brightness;b*=brightness;}else{r=tr.b.math.lerp(tr.b.math.normalize(brightness,1,2),r,255);g=tr.b.math.lerp(tr.b.math.normalize(brightness,1,2),g,255);b=tr.b.math.lerp(tr.b.math.normalize(brightness,1,2),b,255);}
+r=Math.round(r);g=Math.round(g);b=Math.round(b);return'rgba('+r+','+g+','+b+', '+a+')';};return{SinebowColorGenerator,};});'use strict';tr.exportTo('tr.e.chrome',function(){const SAME_AS_PARENT='same-as-parent';const TITLES_FOR_USER_FRIENDLY_CATEGORY={composite:['CompositingInputsUpdater::update','ThreadProxy::SetNeedsUpdateLayers','LayerTreeHost::UpdateLayers::CalcDrawProps','UpdateLayerTree'],gc:['minorGC','majorGC','MajorGC','MinorGC','V8.GCScavenger','V8.GCIncrementalMarking','V8.GCIdleNotification','V8.GCContext','V8.GCCompactor','V8GCController::traceDOMWrappers'],iframe_creation:['WebLocalFrameImpl::createChildframe'],imageDecode:['Decode Image','ImageFrameGenerator::decode','ImageFrameGenerator::decodeAndScale'],input:['HitTest','ScrollableArea::scrollPositionChanged','EventHandler::handleMouseMoveEvent'],layout:['FrameView::invalidateTree','FrameView::layout','FrameView::performLayout','FrameView::performPostLayoutTasks','FrameView::performPreLayoutTasks','Layer::updateLayerPositionsAfterLayout','Layout','LayoutView::hitTest','ResourceLoadPriorityOptimizer::updateAllImageResourcePriorities','WebViewImpl::layout'],parseHTML:['ParseHTML','HTMLDocumentParser::didReceiveParsedChunkFromBackgroundParser','HTMLDocumentParser::processParsedChunkFromBackgroundParser','HTMLDocumentParser::processTokenizedChunkFromBackgroundParser',],raster:['DisplayListRasterSource::PerformSolidColorAnalysis','Picture::Raster','RasterBufferImpl::Playback','RasterTask','RasterizerTaskImpl::RunOnWorkerThread','SkCanvas::drawImageRect()','SkCanvas::drawPicture()','SkCanvas::drawTextBlob()','TileTaskWorkerPool::PlaybackToMemory'],record:['ContentLayerDelegate::paintContents','DeprecatedPaintLayerCompositor::updateIfNeededRecursive','DeprecatedPaintLayerCompositor::updateLayerPositionsAfterLayout','Paint','Picture::Record','PictureLayer::Update','RenderLayer::updateLayerPositionsAfterLayout'],style:['CSSParserImpl::parseStyleSheet.parse','CSSParserImpl::parseStyleSheet.tokenize','Document::updateStyle','Document::updateStyleInvalidationIfNeeded','ParseAuthorStyleSheet','RuleSet::addRulesFromSheet','StyleElement::processStyleSheet','StyleEngine::createResolver','StyleSheetContents::parseAuthorStyleSheet','UpdateLayoutTree'],script_parse_and_compile:['v8.parseOnBackground','V8.ScriptCompiler'],script_execute:['V8.Execute','WindowProxy::initialize'],resource_loading:['ResourceFetcher::requestResource','ResourceDispatcher::OnReceivedData','ResourceDispatcher::OnRequestComplete','ResourceDispatcher::OnReceivedResponse','Resource::appendData'],renderer_misc:['DecodeFont','ThreadState::completeSweep'],v8_runtime:[],[SAME_AS_PARENT]:['SyncChannel::Send']};const COLOR_FOR_USER_FRIENDLY_CATEGORY=new tr.b.SinebowColorGenerator();const USER_FRIENDLY_CATEGORY_FOR_TITLE=new Map();for(const category in TITLES_FOR_USER_FRIENDLY_CATEGORY){TITLES_FOR_USER_FRIENDLY_CATEGORY[category].forEach(function(title){USER_FRIENDLY_CATEGORY_FOR_TITLE.set(title,category);});}
+const USER_FRIENDLY_CATEGORY_FOR_EVENT_CATEGORY={netlog:'net',overhead:'overhead',startup:'startup',gpu:'gpu'};function ChromeUserFriendlyCategoryDriver(){}
+ChromeUserFriendlyCategoryDriver.fromEvent=function(event){let userFriendlyCategory=USER_FRIENDLY_CATEGORY_FOR_TITLE.get(event.title);if(userFriendlyCategory){if(userFriendlyCategory===SAME_AS_PARENT){if(event.parentSlice){return ChromeUserFriendlyCategoryDriver.fromEvent(event.parentSlice);}}else{return userFriendlyCategory;}}
+const eventCategoryParts=tr.b.getCategoryParts(event.category);for(let i=0;i<eventCategoryParts.length;++i){const eventCategory=eventCategoryParts[i];userFriendlyCategory=USER_FRIENDLY_CATEGORY_FOR_EVENT_CATEGORY[eventCategory];if(userFriendlyCategory){return userFriendlyCategory;}}
+return'other';};ChromeUserFriendlyCategoryDriver.getColor=function(ufc){return COLOR_FOR_USER_FRIENDLY_CATEGORY.colorForKey(ufc);};ChromeUserFriendlyCategoryDriver.ALL_TITLES=['other'];for(const category in TITLES_FOR_USER_FRIENDLY_CATEGORY){if(category===SAME_AS_PARENT)continue;ChromeUserFriendlyCategoryDriver.ALL_TITLES.push(category);}
+for(const category of Object.values(USER_FRIENDLY_CATEGORY_FOR_EVENT_CATEGORY)){ChromeUserFriendlyCategoryDriver.ALL_TITLES.push(category);}
+ChromeUserFriendlyCategoryDriver.ALL_TITLES.sort();for(const category of ChromeUserFriendlyCategoryDriver.ALL_TITLES){ChromeUserFriendlyCategoryDriver.getColor(category);}
+return{ChromeUserFriendlyCategoryDriver,};});'use strict';tr.exportTo('tr.model.helpers',function(){const NET_CATEGORIES=new Set(['net','netlog','disabled-by-default-netlog','disabled-by-default-network']);class ChromeThreadHelper{constructor(thread){this.thread=thread;}
+getNetworkEvents(){const networkEvents=[];for(const slice of this.thread.asyncSliceGroup.slices){const categories=tr.b.getCategoryParts(slice.category);const isNetEvent=category=>NET_CATEGORIES.has(category);if(categories.filter(isNetEvent).length===0)continue;networkEvents.push(slice);}
+return networkEvents;}}
+return{ChromeThreadHelper,};});'use strict';tr.exportTo('tr.model.helpers',function(){const ChromeThreadHelper=tr.model.helpers.ChromeThreadHelper;function ChromeRendererHelper(modelHelper,process){tr.model.helpers.ChromeProcessHelper.call(this,modelHelper,process);this.mainThread_=process.findAtMostOneThreadNamed('CrRendererMain')||process.findAtMostOneThreadNamed('Chrome_InProcRendererThread');this.compositorThread_=process.findAtMostOneThreadNamed('Compositor');this.rasterWorkerThreads_=process.findAllThreadsMatching(function(t){if(t.name===undefined)return false;if(t.name.indexOf('CompositorTileWorker')===0)return true;if(t.name.indexOf('CompositorRasterWorker')===0)return true;return false;});if(!process.name){process.name=ChromeRendererHelper.PROCESS_NAME;}}
+ChromeRendererHelper.PROCESS_NAME='Renderer';ChromeRendererHelper.isRenderProcess=function(process){if(process.findAtMostOneThreadNamed('CrRendererMain'))return true;if(process.findAtMostOneThreadNamed('Compositor'))return true;return false;};ChromeRendererHelper.isTracingProcess=function(process){return process.labels!==undefined&&process.labels.length===1&&process.labels[0]==='chrome://tracing';};ChromeRendererHelper.prototype={__proto__:tr.model.helpers.ChromeProcessHelper.prototype,get mainThread(){return this.mainThread_;},get compositorThread(){return this.compositorThread_;},get rasterWorkerThreads(){return this.rasterWorkerThreads_;},get isChromeTracingUI(){return ChromeRendererHelper.isTracingProcess(this.process);},};return{ChromeRendererHelper,};});'use strict';tr.exportTo('tr.model.helpers',function(){function findChromeBrowserProcesses(model){return model.getAllProcesses(tr.model.helpers.ChromeBrowserHelper.isBrowserProcess);}
+function findChromeRenderProcesses(model){return model.getAllProcesses(tr.model.helpers.ChromeRendererHelper.isRenderProcess);}
+function findChromeGpuProcess(model){const gpuProcesses=model.getAllProcesses(tr.model.helpers.ChromeGpuHelper.isGpuProcess);if(gpuProcesses.length!==1)return undefined;return gpuProcesses[0];}
+function ChromeModelHelper(model){this.model_=model;const browserProcesses=findChromeBrowserProcesses(model);this.browserHelpers_=browserProcesses.map(p=>new tr.model.helpers.ChromeBrowserHelper(this,p));const gpuProcess=findChromeGpuProcess(model);if(gpuProcess){this.gpuHelper_=new tr.model.helpers.ChromeGpuHelper(this,gpuProcess);}else{this.gpuHelper_=undefined;}
+const rendererProcesses_=findChromeRenderProcesses(model);this.rendererHelpers_={};rendererProcesses_.forEach(function(renderProcess){const rendererHelper=new tr.model.helpers.ChromeRendererHelper(this,renderProcess);this.rendererHelpers_[rendererHelper.pid]=rendererHelper;},this);this.chromeBounds_=undefined;}
+ChromeModelHelper.guid=tr.b.GUID.allocateSimple();ChromeModelHelper.supportsModel=function(model){if(findChromeBrowserProcesses(model).length)return true;if(findChromeRenderProcesses(model).length)return true;return false;};ChromeModelHelper.prototype={get pid(){throw new Error('woah');},get process(){throw new Error('woah');},get model(){return this.model_;},get browserProcess(){if(this.browserHelper===undefined)return undefined;return this.browserHelper.process;},get browserHelper(){return this.browserHelpers_[0];},get browserHelpers(){return this.browserHelpers_;},get gpuHelper(){return this.gpuHelper_;},get rendererHelpers(){return this.rendererHelpers_;},get rendererWithLargestPid(){let largestPid=-1;for(const pid in this.rendererHelpers){const rendererHelper=this.rendererHelpers[pid];if(rendererHelper.isChromeTracingUI)continue;if(pid>largestPid)largestPid=pid;}
+if(largestPid===-1)return undefined;return this.rendererHelpers[largestPid];},get chromeBounds(){if(!this.chromeBounds_){this.chromeBounds_=new tr.b.math.Range();for(const browserHelper of
+Object.values(this.browserHelpers)){this.chromeBounds_.addRange(browserHelper.process.bounds);}}
+if(this.chromeBounds_.isEmpty){return undefined;}
+return this.chromeBounds_;}};return{ChromeModelHelper,};});'use strict';tr.exportTo('tr.e.cc',function(){const AsyncSlice=tr.model.AsyncSlice;const EventSet=tr.model.EventSet;const UI_COMP_NAME='INPUT_EVENT_LATENCY_UI_COMPONENT';const ORIGINAL_COMP_NAME='INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT';const BEGIN_COMP_NAME='INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT';const END_COMP_NAME='INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT';const MAIN_RENDERER_THREAD_NAME='CrRendererMain';const COMPOSITOR_THREAD_NAME='Compositor';const POSTTASK_FLOW_EVENT='disabled-by-default-toplevel.flow';const IPC_FLOW_EVENT='disabled-by-default-ipc.flow';const INPUT_EVENT_TYPE_NAMES={CHAR:'Char',CLICK:'GestureClick',CONTEXT_MENU:'ContextMenu',FLING_CANCEL:'GestureFlingCancel',FLING_START:'GestureFlingStart',KEY_DOWN:'KeyDown',KEY_DOWN_RAW:'RawKeyDown',KEY_UP:'KeyUp',LATENCY_SCROLL_UPDATE:'ScrollUpdate',MOUSE_DOWN:'MouseDown',MOUSE_ENTER:'MouseEnter',MOUSE_LEAVE:'MouseLeave',MOUSE_MOVE:'MouseMove',MOUSE_UP:'MouseUp',MOUSE_WHEEL:'MouseWheel',PINCH_BEGIN:'GesturePinchBegin',PINCH_END:'GesturePinchEnd',PINCH_UPDATE:'GesturePinchUpdate',SCROLL_BEGIN:'GestureScrollBegin',SCROLL_END:'GestureScrollEnd',SCROLL_UPDATE:'GestureScrollUpdate',SCROLL_UPDATE_RENDERER:'ScrollUpdate',SHOW_PRESS:'GestureShowPress',TAP:'GestureTap',TAP_CANCEL:'GestureTapCancel',TAP_DOWN:'GestureTapDown',TOUCH_CANCEL:'TouchCancel',TOUCH_END:'TouchEnd',TOUCH_MOVE:'TouchMove',TOUCH_START:'TouchStart',UNKNOWN:'UNKNOWN'};function InputLatencyAsyncSlice(){AsyncSlice.apply(this,arguments);this.associatedEvents_=new EventSet();this.typeName_=undefined;if(!this.isLegacyEvent){this.determineModernTypeName_();}}
+InputLatencyAsyncSlice.prototype={__proto__:AsyncSlice.prototype,get isLegacyEvent(){return this.title==='InputLatency';},get typeName(){if(!this.typeName_){this.determineLegacyTypeName_();}
+return this.typeName_;},checkTypeName_(){if(!this.typeName_){throw new Error('Unable to determine typeName');}
+let found=false;for(const typeName in INPUT_EVENT_TYPE_NAMES){if(this.typeName===INPUT_EVENT_TYPE_NAMES[typeName]){found=true;break;}}
+if(!found){this.typeName_=INPUT_EVENT_TYPE_NAMES.UNKNOWN;}},determineModernTypeName_(){const lastColonIndex=this.title.lastIndexOf(':');if(lastColonIndex<0)return;const characterAfterLastColonIndex=lastColonIndex+1;this.typeName_=this.title.slice(characterAfterLastColonIndex);this.checkTypeName_();},determineLegacyTypeName_(){for(const subSlice of this.enumerateAllDescendents()){const subSliceIsAInputLatencyAsyncSlice=(subSlice instanceof InputLatencyAsyncSlice);if(!subSliceIsAInputLatencyAsyncSlice)continue;if(!subSlice.typeName)continue;if(this.typeName_&&subSlice.typeName_){const subSliceHasDifferentTypeName=(this.typeName_!==subSlice.typeName_);if(subSliceHasDifferentTypeName){throw new Error('InputLatencyAsyncSlice.determineLegacyTypeName_() '+' found multiple typeNames');}}
+this.typeName_=subSlice.typeName_;}
+if(!this.typeName_){throw new Error('InputLatencyAsyncSlice.determineLegacyTypeName_() failed');}
+this.checkTypeName_();},getRendererHelper(sourceSlices){const traceModel=this.startThread.parent.model;const modelHelper=traceModel.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);if(!modelHelper)return undefined;let mainThread=undefined;let compositorThread=undefined;for(const i in sourceSlices){if(sourceSlices[i].parentContainer.name===MAIN_RENDERER_THREAD_NAME){mainThread=sourceSlices[i].parentContainer;}else if(sourceSlices[i].parentContainer.name===COMPOSITOR_THREAD_NAME){compositorThread=sourceSlices[i].parentContainer;}
+if(mainThread&&compositorThread)break;}
+const rendererHelpers=modelHelper.rendererHelpers;const pids=Object.keys(rendererHelpers);for(let i=0;i<pids.length;i++){const pid=pids[i];const rendererHelper=rendererHelpers[pid];if(rendererHelper.mainThread===mainThread||rendererHelper.compositorThread===compositorThread){return rendererHelper;}}
+return undefined;},addEntireSliceHierarchy(slice){this.associatedEvents_.push(slice);slice.iterateAllSubsequentSlices(function(subsequentSlice){this.associatedEvents_.push(subsequentSlice);},this);},addDirectlyAssociatedEvents(flowEvents){const slices=[];flowEvents.forEach(function(flowEvent){this.associatedEvents_.push(flowEvent);const newSource=flowEvent.startSlice.mostTopLevelSlice;if(slices.indexOf(newSource)===-1){slices.push(newSource);}},this);const lastFlowEvent=flowEvents[flowEvents.length-1];const lastSource=lastFlowEvent.endSlice.mostTopLevelSlice;if(slices.indexOf(lastSource)===-1){slices.push(lastSource);}
+return slices;},addScrollUpdateEvents(rendererHelper){if(!rendererHelper||!rendererHelper.compositorThread){return;}
+const compositorThread=rendererHelper.compositorThread;const gestureScrollUpdateStart=this.start;const gestureScrollUpdateEnd=this.end;const allCompositorAsyncSlices=compositorThread.asyncSliceGroup.slices;for(const i in allCompositorAsyncSlices){const slice=allCompositorAsyncSlices[i];if(slice.title!=='Latency::ScrollUpdate')continue;const parentId=slice.args.data.INPUT_EVENT_LATENCY_FORWARD_SCROLL_UPDATE_TO_MAIN_COMPONENT.sequence_number;if(parentId===undefined){if(slice.start<gestureScrollUpdateStart||slice.start>=gestureScrollUpdateEnd){continue;}}else{if(parseInt(parentId)!==parseInt(this.id)){continue;}}
+slice.associatedEvents.forEach(function(event){this.associatedEvents_.push(event);},this);break;}},belongToOtherInputs(slice,flowEvents){let fromOtherInputs=false;slice.iterateEntireHierarchy(function(subsequentSlice){if(fromOtherInputs)return;subsequentSlice.inFlowEvents.forEach(function(inflow){if(fromOtherInputs)return;if(inflow.category.indexOf('input')>-1){if(flowEvents.indexOf(inflow)===-1){fromOtherInputs=true;}}},this);},this);return fromOtherInputs;},triggerOtherInputs(event,flowEvents){if(event.outFlowEvents===undefined||event.outFlowEvents.length===0){return false;}
+const flow=event.outFlowEvents[0];if(flow.category!==POSTTASK_FLOW_EVENT||!flow.endSlice){return false;}
+const endSlice=flow.endSlice;if(this.belongToOtherInputs(endSlice.mostTopLevelSlice,flowEvents)){return true;}
+return false;},followSubsequentSlices(event,queue,visited,flowEvents){let stopFollowing=false;let inputAck=false;event.iterateAllSubsequentSlices(function(slice){if(stopFollowing)return;if(slice.title==='TaskQueueManager::RunTask')return;if(slice.title==='ThreadProxy::ScheduledActionSendBeginMainFrame'){return;}
+if(slice.title==='Scheduler::ScheduleBeginImplFrameDeadline'){if(this.triggerOtherInputs(slice,flowEvents))return;}
+if(slice.title==='CompositorImpl::PostComposite'){if(this.triggerOtherInputs(slice,flowEvents))return;}
+if(slice.title==='InputRouterImpl::ProcessInputEventAck'){inputAck=true;}
+if(inputAck&&slice.title==='InputRouterImpl::FilterAndSendWebInputEvent'){stopFollowing=true;}
+this.followCurrentSlice(slice,queue,visited);},this);},followCurrentSlice(event,queue,visited){event.outFlowEvents.forEach(function(outflow){if((outflow.category===POSTTASK_FLOW_EVENT||outflow.category===IPC_FLOW_EVENT)&&outflow.endSlice){this.associatedEvents_.push(outflow);const nextEvent=outflow.endSlice.mostTopLevelSlice;if(!visited.contains(nextEvent)){visited.push(nextEvent);queue.push(nextEvent);}}},this);},backtraceFromDraw(beginImplFrame,visited){const pendingEventQueue=[];pendingEventQueue.push(beginImplFrame.mostTopLevelSlice);while(pendingEventQueue.length!==0){const event=pendingEventQueue.pop();this.addEntireSliceHierarchy(event);event.inFlowEvents.forEach(function(inflow){if(inflow.category===POSTTASK_FLOW_EVENT&&inflow.startSlice){const nextEvent=inflow.startSlice.mostTopLevelSlice;if(!visited.contains(nextEvent)){visited.push(nextEvent);pendingEventQueue.push(nextEvent);}}},this);}},sortRasterizerSlices(rasterWorkerThreads,sortedRasterizerSlices){rasterWorkerThreads.forEach(function(rasterizer){Array.prototype.push.apply(sortedRasterizerSlices,rasterizer.sliceGroup.slices);},this);sortedRasterizerSlices.sort(function(a,b){if(a.start!==b.start){return a.start-b.start;}
+return a.guid-b.guid;});},addRasterizationEvents(prepareTiles,rendererHelper,visited,flowEvents,sortedRasterizerSlices){if(!prepareTiles.args.prepare_tiles_id)return;if(!rendererHelper||!rendererHelper.rasterWorkerThreads){return;}
+const rasterWorkerThreads=rendererHelper.rasterWorkerThreads;const prepareTileId=prepareTiles.args.prepare_tiles_id;const pendingEventQueue=[];if(sortedRasterizerSlices.length===0){this.sortRasterizerSlices(rasterWorkerThreads,sortedRasterizerSlices);}
+let numFinishedTasks=0;const RASTER_TASK_TITLE='RasterizerTaskImpl::RunOnWorkerThread';const IMAGEDECODE_TASK_TITLE='ImageDecodeTaskImpl::RunOnWorkerThread';const FINISHED_TASK_TITLE='TaskSetFinishedTaskImpl::RunOnWorkerThread';for(let i=0;i<sortedRasterizerSlices.length;i++){const task=sortedRasterizerSlices[i];if(task.title===RASTER_TASK_TITLE||task.title===IMAGEDECODE_TASK_TITLE){if(task.args.source_prepare_tiles_id===prepareTileId){this.addEntireSliceHierarchy(task.mostTopLevelSlice);}}else if(task.title===FINISHED_TASK_TITLE){if(task.start>prepareTiles.start){pendingEventQueue.push(task.mostTopLevelSlice);if(++numFinishedTasks===3)break;}}}
+while(pendingEventQueue.length!==0){const event=pendingEventQueue.pop();this.addEntireSliceHierarchy(event);this.followSubsequentSlices(event,pendingEventQueue,visited,flowEvents);}},addOtherCausallyRelatedEvents(rendererHelper,sourceSlices,flowEvents,sortedRasterizerSlices){const pendingEventQueue=[];const visitedEvents=new EventSet();let beginImplFrame=undefined;let prepareTiles=undefined;sortedRasterizerSlices=[];sourceSlices.forEach(function(sourceSlice){if(!visitedEvents.contains(sourceSlice)){visitedEvents.push(sourceSlice);pendingEventQueue.push(sourceSlice);}},this);while(pendingEventQueue.length!==0){const event=pendingEventQueue.pop();this.addEntireSliceHierarchy(event);this.followCurrentSlice(event,pendingEventQueue,visitedEvents);this.followSubsequentSlices(event,pendingEventQueue,visitedEvents,flowEvents);const COMPOSITOR_PREPARE_TILES='TileManager::PrepareTiles';prepareTiles=event.findDescendentSlice(COMPOSITOR_PREPARE_TILES);if(prepareTiles){this.addRasterizationEvents(prepareTiles,rendererHelper,visitedEvents,flowEvents,sortedRasterizerSlices);}
+const COMPOSITOR_ON_BIFD='Scheduler::OnBeginImplFrameDeadline';beginImplFrame=event.findDescendentSlice(COMPOSITOR_ON_BIFD);if(beginImplFrame){this.backtraceFromDraw(beginImplFrame,visitedEvents);}}
+const INPUT_GSU='InputLatency::GestureScrollUpdate';if(this.title===INPUT_GSU){this.addScrollUpdateEvents(rendererHelper);}},get associatedEvents(){if(this.associatedEvents_.length!==0){return this.associatedEvents_;}
+const modelIndices=this.startThread.parent.model.modelIndices;const flowEvents=modelIndices.getFlowEventsWithId(this.id);if(flowEvents.length===0){return this.associatedEvents_;}
+const sourceSlices=this.addDirectlyAssociatedEvents(flowEvents);const rendererHelper=this.getRendererHelper(sourceSlices);this.addOtherCausallyRelatedEvents(rendererHelper,sourceSlices,flowEvents);return this.associatedEvents_;},get inputLatency(){if(!('data'in this.args))return undefined;const data=this.args.data;if(!(END_COMP_NAME in data))return undefined;let latency=0;const endTime=data[END_COMP_NAME].time;if(ORIGINAL_COMP_NAME in data){latency=endTime-data[ORIGINAL_COMP_NAME].time;}else if(UI_COMP_NAME in data){latency=endTime-data[UI_COMP_NAME].time;}else if(BEGIN_COMP_NAME in data){latency=endTime-data[BEGIN_COMP_NAME].time;}else{throw new Error('No valid begin latency component');}
+return latency;}};const eventTypeNames=['Char','ContextMenu','GestureClick','GestureFlingCancel','GestureFlingStart','GestureScrollBegin','GestureScrollEnd','GestureScrollUpdate','GestureShowPress','GestureTap','GestureTapCancel','GestureTapDown','GesturePinchBegin','GesturePinchEnd','GesturePinchUpdate','KeyDown','KeyUp','MouseDown','MouseEnter','MouseLeave','MouseMove','MouseUp','MouseWheel','RawKeyDown','ScrollUpdate','TouchCancel','TouchEnd','TouchMove','TouchStart'];const allTypeNames=['InputLatency'];eventTypeNames.forEach(function(eventTypeName){allTypeNames.push('InputLatency:'+eventTypeName);allTypeNames.push('InputLatency::'+eventTypeName);});AsyncSlice.subTypes.register(InputLatencyAsyncSlice,{typeNames:allTypeNames,categoryParts:['latencyInfo']});return{InputLatencyAsyncSlice,INPUT_EVENT_TYPE_NAMES,};});'use strict';tr.exportTo('tr.model',function(){return{BROWSER_PROCESS_PID_REF:-1,OBJECT_DEFAULT_SCOPE:'ptr',LOCAL_ID_PHASES:new Set(['N','D','O','(',')'])};});'use strict';tr.exportTo('tr.e.audits',function(){const Auditor=tr.c.Auditor;function ChromeAuditor(model){Auditor.call(this,model);const modelHelper=this.model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);if(modelHelper&&modelHelper.browserHelper){this.modelHelper=modelHelper;}else{this.modelHelper=undefined;}}
+ChromeAuditor.prototype={__proto__:Auditor.prototype,runAnnotate(){if(!this.modelHelper)return;for(const pid in this.modelHelper.rendererHelpers){const rendererHelper=this.modelHelper.rendererHelpers[pid];if(rendererHelper.isChromeTracingUI){rendererHelper.process.important=false;}}},installUserFriendlyCategoryDriverIfNeeded(){this.model.addUserFriendlyCategoryDriver(tr.e.chrome.ChromeUserFriendlyCategoryDriver);},runAudit(){if(!this.modelHelper)return;this.model.replacePIDRefsInPatchups(tr.model.BROWSER_PROCESS_PID_REF,this.modelHelper.browserProcess.pid);this.model.applyObjectRefPatchups();}};Auditor.register(ChromeAuditor);return{ChromeAuditor,};});'use strict';tr.exportTo('tr.e.chrome',function(){const KNOWN_PROPERTIES={absX:1,absY:1,address:1,anonymous:1,childNeeds:1,children:1,classNames:1,col:1,colSpan:1,float:1,height:1,htmlId:1,name:1,posChildNeeds:1,positioned:1,positionedMovement:1,relX:1,relY:1,relativePositioned:1,row:1,rowSpan:1,selfNeeds:1,stickyPositioned:1,tag:1,width:1};function LayoutObject(snapshot,args){this.snapshot_=snapshot;this.id_=args.address;this.name_=args.name;this.childLayoutObjects_=[];this.otherProperties_={};this.tag_=args.tag;this.relativeRect_=tr.b.math.Rect.fromXYWH(args.relX,args.relY,args.width,args.height);this.absoluteRect_=tr.b.math.Rect.fromXYWH(args.absX,args.absY,args.width,args.height);this.isFloat_=args.float;this.isStickyPositioned_=args.stickyPositioned;this.isPositioned_=args.positioned;this.isRelativePositioned_=args.relativePositioned;this.isAnonymous_=args.anonymous;this.htmlId_=args.htmlId;this.classNames_=args.classNames;this.needsLayoutReasons_=[];if(args.selfNeeds){this.needsLayoutReasons_.push('self');}
+if(args.childNeeds){this.needsLayoutReasons_.push('child');}
+if(args.posChildNeeds){this.needsLayoutReasons_.push('positionedChild');}
+if(args.positionedMovement){this.needsLayoutReasons_.push('positionedMovement');}
+this.tableRow_=args.row;this.tableCol_=args.col;this.tableRowSpan_=args.rowSpan;this.tableColSpan_=args.colSpan;if(args.children){args.children.forEach(function(child){this.childLayoutObjects_.push(new LayoutObject(snapshot,child));}.bind(this));}
+for(const property in args){if(!KNOWN_PROPERTIES[property]){this.otherProperties_[property]=args[property];}}}
+LayoutObject.prototype={get snapshot(){return this.snapshot_;},get id(){return this.id_;},get name(){return this.name_;},get tag(){return this.tag_;},get relativeRect(){return this.relativeRect_;},get absoluteRect(){return this.absoluteRect_;},get isPositioned(){return this.isPositioned_;},get isFloat(){return this.isFloat_;},get isStickyPositioned(){return this.isStickyPositioned_;},get isRelativePositioned(){return this.isRelativePositioned_;},get isAnonymous(){return this.isAnonymous_;},get tableRow(){return this.tableRow_;},get tableCol(){return this.tableCol_;},get tableRowSpan(){return this.tableRowSpan_;},get tableColSpan(){return this.tableColSpan_;},get htmlId(){return this.htmlId_;},get classNames(){return this.classNames_;},get needsLayoutReasons(){return this.needsLayoutReasons_;},get hasChildLayoutObjects(){return this.childLayoutObjects_.length>0;},get childLayoutObjects(){return this.childLayoutObjects_;},traverseTree(cb,opt_this){cb.call(opt_this,this);if(!this.hasChildLayoutObjects)return;this.childLayoutObjects.forEach(function(child){child.traverseTree(cb,opt_this);});},get otherPropertyNames(){const names=[];for(const name in this.otherProperties_){names.push(name);}
+return names;},getProperty(name){return this.otherProperties_[name];},get previousSnapshotLayoutObject(){if(!this.snapshot.previousSnapshot)return undefined;return this.snapshot.previousSnapshot.getLayoutObjectById(this.id);},get nextSnapshotLayoutObject(){if(!this.snapshot.nextSnapshot)return undefined;return this.snapshot.nextSnapshot.getLayoutObjectById(this.id);}};return{LayoutObject,};});'use strict';tr.exportTo('tr.e.chrome',function(){const ObjectSnapshot=tr.model.ObjectSnapshot;const ObjectInstance=tr.model.ObjectInstance;function LayoutTreeInstance(){ObjectInstance.apply(this,arguments);}
+LayoutTreeInstance.prototype={__proto__:ObjectInstance.prototype,};ObjectInstance.subTypes.register(LayoutTreeInstance,{typeName:'LayoutTree'});function LayoutTreeSnapshot(){ObjectSnapshot.apply(this,arguments);this.rootLayoutObject=new tr.e.chrome.LayoutObject(this,this.args);}
+LayoutTreeSnapshot.prototype={__proto__:ObjectSnapshot.prototype,};ObjectSnapshot.subTypes.register(LayoutTreeSnapshot,{typeName:'LayoutTree'});return{LayoutTreeInstance,LayoutTreeSnapshot,};});'use strict';tr.exportTo('tr.model',function(){function EventContainer(){this.guid_=tr.b.GUID.allocateSimple();this.important=true;this.bounds_=new tr.b.math.Range();}
+EventContainer.prototype={get guid(){return this.guid_;},get stableId(){throw new Error('Not implemented');},get bounds(){return this.bounds_;},updateBounds(){throw new Error('Not implemented');},shiftTimestampsForward(amount){throw new Error('Not implemented');},*childEvents(){},*getDescendantEvents(){yield*this.childEvents();for(const container of this.childEventContainers()){yield*container.getDescendantEvents();}},*childEventContainers(){},*getDescendantEventContainers(){yield this;for(const container of this.childEventContainers()){yield*container.getDescendantEventContainers();}},*findTopmostSlicesInThisContainer(eventPredicate,opt_this){},*findTopmostSlices(eventPredicate){for(const ec of this.getDescendantEventContainers()){yield*ec.findTopmostSlicesInThisContainer(eventPredicate);}},*findTopmostSlicesNamed(name){yield*this.findTopmostSlices(e=>e.title===name);}};return{EventContainer,};});'use strict';tr.exportTo('tr.model',function(){const Event=tr.model.Event;const EventRegistry=tr.model.EventRegistry;class ResourceUsageSample extends Event{constructor(series,start,usage){super();this.series_=series;this.start_=start;this.usage_=usage;}
+get series(){return this.series_;}
+get start(){return this.start_;}
+set start(value){this.start_=value;}
+get usage(){return this.usage_;}
+set usage(value){this.usage_=value;}
+addBoundsToRange(range){range.addValue(this.start);}}
+EventRegistry.register(ResourceUsageSample,{name:'resourceUsageSample',pluralName:'resourceUsageSamples'});return{ResourceUsageSample,};});'use strict';tr.exportTo('tr.model',function(){const ResourceUsageSample=tr.model.ResourceUsageSample;class ResourceUsageSeries extends tr.model.EventContainer{constructor(device){super();this.device_=device;this.samples_=[];}
+get device(){return this.device_;}
+get samples(){return this.samples_;}
+get stableId(){return this.device_.stableId+'.ResourceUsageSeries';}
+addUsageSample(ts,val){const sample=new ResourceUsageSample(this,ts,val);this.samples_.push(sample);return sample;}
+computeResourceTimeConsumedInMs(start,end){const measurementRange=tr.b.math.Range.fromExplicitRange(start,end);let resourceTimeInMs=0;let startIndex=tr.b.math.findLowIndexInSortedArray(this.samples,x=>x.start,start)-1;const endIndex=tr.b.math.findLowIndexInSortedArray(this.samples,x=>x.start,end);if(startIndex<0)startIndex=0;for(let i=startIndex;i<endIndex;i++){const sample=this.samples[i];const nextSample=this.samples[i+1];const sampleRange=new tr.b.math.Range();sampleRange.addValue(sample.start);sampleRange.addValue(nextSample?nextSample.start:sample.start);const intersectionRangeInMs=measurementRange.findIntersection(sampleRange);resourceTimeInMs+=intersectionRangeInMs.duration*sample.usage;}
+return resourceTimeInMs;}
+getSamplesWithinRange(start,end){const startIndex=tr.b.math.findLowIndexInSortedArray(this.samples,x=>x.start,start);const endIndex=tr.b.math.findLowIndexInSortedArray(this.samples,x=>x.start,end);return this.samples.slice(startIndex,endIndex);}
+shiftTimestampsForward(amount){for(let i=0;i<this.samples_.length;++i){this.samples_[i].start+=amount;}}
+updateBounds(){this.bounds.reset();if(this.samples_.length===0)return;this.bounds.addValue(this.samples_[0].start);this.bounds.addValue(this.samples_[this.samples_.length-1].start);}*childEvents(){yield*this.samples_;}}
+return{ResourceUsageSeries,};});'use strict';tr.exportTo('tr.e.audits',function(){class CpuUsageAuditor extends tr.c.Auditor{constructor(model){super();this.model_=model;}
+runAnnotate(){this.model_.device.cpuUsageSeries=this.computeCpuUsageSeries_(this.model_.bounds.min,this.model_.bounds.max,this.computeCpuUsage_());}
+computeBinSize_(start,end){const MIN_BIN_SIZE_MS=1.0;const MAX_NUM_BINS=100000;const interval=end-start;let binSize=MIN_BIN_SIZE_MS;while(binSize*MAX_NUM_BINS<interval)binSize*=2;return binSize;}
+computeCpuUsageSeries_(start,end,usageRecords){const series=new tr.model.ResourceUsageSeries();if(start===undefined)return series;const binSize=this.computeBinSize_(start,end);const numBins=Math.ceil((end-start)/binSize);const arr=new Array(numBins).fill(0);for(const record of usageRecords){const firstIndex=Math.ceil((record.start-start)/binSize);const lastIndex=Math.floor((record.end-start)/binSize);for(let i=firstIndex;i<=lastIndex;i++)arr[i]+=record.usage;}
+for(let i=0;i<numBins;i++){series.addUsageSample(start+(i*binSize),arr[i]);}
+return series;}
+computeCpuUsage_(){const model=this.model_;const result=[];for(const pid in model.processes){for(const e of model.processes[pid].getDescendantEvents()){if(!(e instanceof tr.model.ThreadSlice)||e.duration===0||e.cpuDuration===undefined){continue;}
+if(e.selfTime===0||e.selfTime===undefined||e.cpuSelfTime===undefined){continue;}
+const usage=tr.b.math.clamp(e.cpuSelfTime/e.selfTime,0,1);let lastTime=e.start;for(const subslice of e.subSlices){result.push({usage,start:lastTime,end:subslice.start});lastTime=subslice.end;}
+result.push({usage,start:lastTime,end:e.end});}}
+return result;}}
+tr.c.Auditor.register(CpuUsageAuditor);return{CpuUsageAuditor};});'use strict';tr.exportTo('tr.b',function(){function Base64(){}
+function b64ToUint6(nChr){if(nChr>64&&nChr<91)return nChr-65;if(nChr>96&&nChr<123)return nChr-71;if(nChr>47&&nChr<58)return nChr+4;if(nChr===43)return 62;if(nChr===47)return 63;return 0;}
+Base64.getDecodedBufferLength=function(input){return input.length*3+1>>2;};Base64.EncodeArrayBufferToString=function(input){let binary='';const bytes=new Uint8Array(input);const len=bytes.byteLength;for(let i=0;i<len;i++){binary+=String.fromCharCode(bytes[i]);}
+return btoa(binary);};Base64.DecodeToTypedArray=function(input,output){const nInLen=input.length;const nOutLen=nInLen*3+1>>2;let nMod3=0;let nMod4=0;let nUint24=0;let nOutIdx=0;if(nOutLen>output.byteLength){throw new Error('Output buffer too small to decode.');}
+for(let nInIdx=0;nInIdx<nInLen;nInIdx++){nMod4=nInIdx&3;nUint24|=b64ToUint6(input.charCodeAt(nInIdx))<<18-6*nMod4;if(nMod4===3||nInLen-nInIdx===1){for(nMod3=0;nMod3<3&&nOutIdx<nOutLen;nMod3++,nOutIdx++){output.setUint8(nOutIdx,nUint24>>>(16>>>nMod3&24)&255);}
+nUint24=0;}}
+return nOutIdx-1;};Base64.btoa=function(input){return btoa(input);};Base64.atob=function(input){return atob(input);};return{Base64,};});'use strict';tr.exportTo('tr.e.importer.etw',function(){function Parser(importer){this.importer=importer;this.model=importer.model;}
+Parser.prototype={__proto__:Object.prototype};const options=new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE);options.mandatoryBaseClass=Parser;tr.b.decorateExtensionRegistry(Parser,options);return{Parser,};});'use strict';tr.exportTo('tr.e.importer.etw',function(){const Parser=tr.e.importer.etw.Parser;const guid='68FDD900-4A3E-11D1-84F4-0000F80464E3';const kEventTraceHeaderOpcode=0;function EventTraceParser(importer){Parser.call(this,importer);importer.registerEventHandler(guid,kEventTraceHeaderOpcode,EventTraceParser.prototype.decodeHeader.bind(this));}
+EventTraceParser.prototype={__proto__:Parser.prototype,decodeFields(header,decoder){if(header.version!==2){throw new Error('Incompatible EventTrace event version.');}
+const bufferSize=decoder.decodeUInt32();const version=decoder.decodeUInt32();const providerVersion=decoder.decodeUInt32();const numberOfProcessors=decoder.decodeUInt32();const endTime=decoder.decodeUInt64ToString();const timerResolution=decoder.decodeUInt32();const maxFileSize=decoder.decodeUInt32();const logFileMode=decoder.decodeUInt32();const buffersWritten=decoder.decodeUInt32();const startBuffers=decoder.decodeUInt32();const pointerSize=decoder.decodeUInt32();const eventsLost=decoder.decodeUInt32();const cpuSpeed=decoder.decodeUInt32();const loggerName=decoder.decodeUInteger(header.is64);const logFileName=decoder.decodeUInteger(header.is64);const timeZoneInformation=decoder.decodeTimeZoneInformation();const padding=decoder.decodeUInt32();const bootTime=decoder.decodeUInt64ToString();const perfFreq=decoder.decodeUInt64ToString();const startTime=decoder.decodeUInt64ToString();const reservedFlags=decoder.decodeUInt32();const buffersLost=decoder.decodeUInt32();const sessionNameString=decoder.decodeW16String();const logFileNameString=decoder.decodeW16String();return{bufferSize,version,providerVersion,numberOfProcessors,endTime,timerResolution,maxFileSize,logFileMode,buffersWritten,startBuffers,pointerSize,eventsLost,cpuSpeed,loggerName,logFileName,timeZoneInformation,bootTime,perfFreq,startTime,reservedFlags,buffersLost,sessionNameString,logFileNameString};},decodeHeader(header,decoder){const fields=this.decodeFields(header,decoder);return true;}};Parser.register(EventTraceParser);return{EventTraceParser,};});'use strict';tr.exportTo('tr.e.importer.etw',function(){const Parser=tr.e.importer.etw.Parser;const guid='3D6FA8D0-FE05-11D0-9DDA-00C04FD7BA7C';const kProcessStartOpcode=1;const kProcessEndOpcode=2;const kProcessDCStartOpcode=3;const kProcessDCEndOpcode=4;const kProcessDefunctOpcode=39;function ProcessParser(importer){Parser.call(this,importer);importer.registerEventHandler(guid,kProcessStartOpcode,ProcessParser.prototype.decodeStart.bind(this));importer.registerEventHandler(guid,kProcessEndOpcode,ProcessParser.prototype.decodeEnd.bind(this));importer.registerEventHandler(guid,kProcessDCStartOpcode,ProcessParser.prototype.decodeDCStart.bind(this));importer.registerEventHandler(guid,kProcessDCEndOpcode,ProcessParser.prototype.decodeDCEnd.bind(this));importer.registerEventHandler(guid,kProcessDefunctOpcode,ProcessParser.prototype.decodeDefunct.bind(this));}
+ProcessParser.prototype={__proto__:Parser.prototype,decodeFields(header,decoder){if(header.version>5){throw new Error('Incompatible Process event version.');}
+let pageDirectoryBase;if(header.version===1){pageDirectoryBase=decoder.decodeUInteger(header.is64);}
+let uniqueProcessKey;if(header.version>=2){uniqueProcessKey=decoder.decodeUInteger(header.is64);}
+const processId=decoder.decodeUInt32();const parentId=decoder.decodeUInt32();let sessionId;let exitStatus;if(header.version>=1){sessionId=decoder.decodeUInt32();exitStatus=decoder.decodeInt32();}
+let directoryTableBase;if(header.version>=3){directoryTableBase=decoder.decodeUInteger(header.is64);}
+let flags;if(header.version>=4){flags=decoder.decodeUInt32();}
+const userSID=decoder.decodeSID(header.is64);let imageFileName;if(header.version>=1){imageFileName=decoder.decodeString();}
+let commandLine;if(header.version>=2){commandLine=decoder.decodeW16String();}
+let packageFullName;let applicationId;if(header.version>=4){packageFullName=decoder.decodeW16String();applicationId=decoder.decodeW16String();}
+let exitTime;if(header.version===5&&header.opcode===kProcessDefunctOpcode){exitTime=decoder.decodeUInt64ToString();}
+return{pageDirectoryBase,uniqueProcessKey,processId,parentId,sessionId,exitStatus,directoryTableBase,flags,userSID,imageFileName,commandLine,packageFullName,applicationId,exitTime};},decodeStart(header,decoder){const fields=this.decodeFields(header,decoder);const process=this.model.getOrCreateProcess(fields.processId);if(process.hasOwnProperty('has_ended')){throw new Error('Process clash detected.');}
+process.name=fields.imageFileName;return true;},decodeEnd(header,decoder){const fields=this.decodeFields(header,decoder);const process=this.model.getOrCreateProcess(fields.processId);process.has_ended=true;return true;},decodeDCStart(header,decoder){const fields=this.decodeFields(header,decoder);const process=this.model.getOrCreateProcess(fields.processId);if(process.hasOwnProperty('has_ended')){throw new Error('Process clash detected.');}
+process.name=fields.imageFileName;return true;},decodeDCEnd(header,decoder){const fields=this.decodeFields(header,decoder);const process=this.model.getOrCreateProcess(fields.processId);process.has_ended=true;return true;},decodeDefunct(header,decoder){const fields=this.decodeFields(header,decoder);return true;}};Parser.register(ProcessParser);return{ProcessParser,};});'use strict';tr.exportTo('tr.e.importer.etw',function(){const Parser=tr.e.importer.etw.Parser;const guid='3D6FA8D1-FE05-11D0-9DDA-00C04FD7BA7C';const kThreadStartOpcode=1;const kThreadEndOpcode=2;const kThreadDCStartOpcode=3;const kThreadDCEndOpcode=4;const kThreadCSwitchOpcode=36;function ThreadParser(importer){Parser.call(this,importer);importer.registerEventHandler(guid,kThreadStartOpcode,ThreadParser.prototype.decodeStart.bind(this));importer.registerEventHandler(guid,kThreadEndOpcode,ThreadParser.prototype.decodeEnd.bind(this));importer.registerEventHandler(guid,kThreadDCStartOpcode,ThreadParser.prototype.decodeDCStart.bind(this));importer.registerEventHandler(guid,kThreadDCEndOpcode,ThreadParser.prototype.decodeDCEnd.bind(this));importer.registerEventHandler(guid,kThreadCSwitchOpcode,ThreadParser.prototype.decodeCSwitch.bind(this));}
+ThreadParser.prototype={__proto__:Parser.prototype,decodeFields(header,decoder){if(header.version>3){throw new Error('Incompatible Thread event version.');}
+const processId=decoder.decodeUInt32();const threadId=decoder.decodeUInt32();let stackBase;let stackLimit;let userStackBase;let userStackLimit;let affinity;let startAddr;let win32StartAddr;let tebBase;let subProcessTag;let basePriority;let pagePriority;let ioPriority;let threadFlags;let waitMode;if(header.version===1){if(header.opcode===kThreadStartOpcode||header.opcode===kThreadDCStartOpcode){stackBase=decoder.decodeUInteger(header.is64);stackLimit=decoder.decodeUInteger(header.is64);userStackBase=decoder.decodeUInteger(header.is64);userStackLimit=decoder.decodeUInteger(header.is64);startAddr=decoder.decodeUInteger(header.is64);win32StartAddr=decoder.decodeUInteger(header.is64);waitMode=decoder.decodeInt8();decoder.skip(3);}}else{stackBase=decoder.decodeUInteger(header.is64);stackLimit=decoder.decodeUInteger(header.is64);userStackBase=decoder.decodeUInteger(header.is64);userStackLimit=decoder.decodeUInteger(header.is64);if(header.version===2){startAddr=decoder.decodeUInteger(header.is64);}else{affinity=decoder.decodeUInteger(header.is64);}
+win32StartAddr=decoder.decodeUInteger(header.is64);tebBase=decoder.decodeUInteger(header.is64);subProcessTag=decoder.decodeUInt32();if(header.version===3){basePriority=decoder.decodeUInt8();pagePriority=decoder.decodeUInt8();ioPriority=decoder.decodeUInt8();threadFlags=decoder.decodeUInt8();}}
+return{processId,threadId,stackBase,stackLimit,userStackBase,userStackLimit,affinity,startAddr,win32StartAddr,tebBase,subProcessTag,waitMode,basePriority,pagePriority,ioPriority,threadFlags};},decodeCSwitchFields(header,decoder){if(header.version!==2){throw new Error('Incompatible Thread event version.');}
+const newThreadId=decoder.decodeUInt32();const oldThreadId=decoder.decodeUInt32();const newThreadPriority=decoder.decodeInt8();const oldThreadPriority=decoder.decodeInt8();const previousCState=decoder.decodeUInt8();const spareByte=decoder.decodeInt8();const oldThreadWaitReason=decoder.decodeInt8();const oldThreadWaitMode=decoder.decodeInt8();const oldThreadState=decoder.decodeInt8();const oldThreadWaitIdealProcessor=decoder.decodeInt8();const newThreadWaitTime=decoder.decodeUInt32();const reserved=decoder.decodeUInt32();return{newThreadId,oldThreadId,newThreadPriority,oldThreadPriority,previousCState,spareByte,oldThreadWaitReason,oldThreadWaitMode,oldThreadState,oldThreadWaitIdealProcessor,newThreadWaitTime,reserved};},decodeStart(header,decoder){const fields=this.decodeFields(header,decoder);this.importer.createThreadIfNeeded(fields.processId,fields.threadId);return true;},decodeEnd(header,decoder){const fields=this.decodeFields(header,decoder);this.importer.removeThreadIfPresent(fields.threadId);return true;},decodeDCStart(header,decoder){const fields=this.decodeFields(header,decoder);this.importer.createThreadIfNeeded(fields.processId,fields.threadId);return true;},decodeDCEnd(header,decoder){const fields=this.decodeFields(header,decoder);this.importer.removeThreadIfPresent(fields.threadId);return true;},decodeCSwitch(header,decoder){const fields=this.decodeCSwitchFields(header,decoder);const cpu=this.importer.getOrCreateCpu(header.cpu);const newThread=this.importer.getThreadFromWindowsTid(fields.newThreadId);let newThreadName;if(newThread&&newThread.userFriendlyName){newThreadName=newThread.userFriendlyName;}else{const newProcessId=this.importer.getPidFromWindowsTid(fields.newThreadId);const newProcess=this.model.getProcess(newProcessId);let newProcessName;if(newProcess){newProcessName=newProcess.name;}else{newProcessName='Unknown process';}
+newThreadName=newProcessName+' (tid '+fields.newThreadId+')';}
+cpu.switchActiveThread(header.timestamp,{},fields.newThreadId,newThreadName,fields);return true;}};Parser.register(ThreadParser);return{ThreadParser,};});'use strict';tr.exportTo('tr.b',function(){function max(a,b){if(a===undefined)return b;if(b===undefined)return a;return Math.max(a,b);}
+function IntervalTree(beginPositionCb,endPositionCb){this.beginPositionCb_=beginPositionCb;this.endPositionCb_=endPositionCb;this.root_=undefined;this.size_=0;}
+IntervalTree.prototype={insert(datum){const startPosition=this.beginPositionCb_(datum);const endPosition=this.endPositionCb_(datum);const node=new IntervalTreeNode(datum,startPosition,endPosition);this.size_++;this.root_=this.insertNode_(this.root_,node);this.root_.colour=Colour.BLACK;return datum;},insertNode_(root,node){if(root===undefined)return node;if(root.leftNode&&root.leftNode.isRed&&root.rightNode&&root.rightNode.isRed){this.flipNodeColour_(root);}
+if(node.key<root.key){root.leftNode=this.insertNode_(root.leftNode,node);}else if(node.key===root.key){root.merge(node);}else{root.rightNode=this.insertNode_(root.rightNode,node);}
+if(root.rightNode&&root.rightNode.isRed&&(root.leftNode===undefined||!root.leftNode.isRed)){root=this.rotateLeft_(root);}
+if(root.leftNode&&root.leftNode.isRed&&root.leftNode.leftNode&&root.leftNode.leftNode.isRed){root=this.rotateRight_(root);}
+return root;},rotateRight_(node){const sibling=node.leftNode;node.leftNode=sibling.rightNode;sibling.rightNode=node;sibling.colour=node.colour;node.colour=Colour.RED;return sibling;},rotateLeft_(node){const sibling=node.rightNode;node.rightNode=sibling.leftNode;sibling.leftNode=node;sibling.colour=node.colour;node.colour=Colour.RED;return sibling;},flipNodeColour_(node){node.colour=this.flipColour_(node.colour);node.leftNode.colour=this.flipColour_(node.leftNode.colour);node.rightNode.colour=this.flipColour_(node.rightNode.colour);},flipColour_(colour){return colour===Colour.RED?Colour.BLACK:Colour.RED;},updateHighValues(){this.updateHighValues_(this.root_);},updateHighValues_(node){if(node===undefined)return undefined;node.maxHighLeft=this.updateHighValues_(node.leftNode);node.maxHighRight=this.updateHighValues_(node.rightNode);return max(max(node.maxHighLeft,node.highValue),node.maxHighRight);},validateFindArguments_(queryLow,queryHigh){if(queryLow===undefined||queryHigh===undefined){throw new Error('queryLow and queryHigh must be defined');}
+if((typeof queryLow!=='number')||(typeof queryHigh!=='number')){throw new Error('queryLow and queryHigh must be numbers');}},findIntersection(queryLow,queryHigh){this.validateFindArguments_(queryLow,queryHigh);if(this.root_===undefined)return[];const ret=[];this.root_.appendIntersectionsInto_(ret,queryLow,queryHigh);return ret;},get size(){return this.size_;},get root(){return this.root_;},dump_(){if(this.root_===undefined)return[];return this.root_.dump();}};const Colour={RED:'red',BLACK:'black'};function IntervalTreeNode(datum,lowValue,highValue){this.lowValue_=lowValue;this.data_=[{datum,high:highValue,low:lowValue}];this.colour_=Colour.RED;this.parentNode_=undefined;this.leftNode_=undefined;this.rightNode_=undefined;this.maxHighLeft_=undefined;this.maxHighRight_=undefined;}
+IntervalTreeNode.prototype={appendIntersectionsInto_(ret,queryLow,queryHigh){if(this.lowValue_>=queryHigh){if(!this.leftNode_)return;return this.leftNode_.appendIntersectionsInto_(ret,queryLow,queryHigh);}
+if(this.maxHighLeft_>queryLow){this.leftNode_.appendIntersectionsInto_(ret,queryLow,queryHigh);}
+if(this.highValue>queryLow){for(let i=(this.data.length-1);i>=0;--i){if(this.data[i].high<queryLow)break;ret.push(this.data[i].datum);}}
+if(this.rightNode_){this.rightNode_.appendIntersectionsInto_(ret,queryLow,queryHigh);}},get colour(){return this.colour_;},set colour(colour){this.colour_=colour;},get key(){return this.lowValue_;},get lowValue(){return this.lowValue_;},get highValue(){return this.data_[this.data_.length-1].high;},set leftNode(left){this.leftNode_=left;},get leftNode(){return this.leftNode_;},get hasLeftNode(){return this.leftNode_!==undefined;},set rightNode(right){this.rightNode_=right;},get rightNode(){return this.rightNode_;},get hasRightNode(){return this.rightNode_!==undefined;},set parentNode(parent){this.parentNode_=parent;},get parentNode(){return this.parentNode_;},get isRootNode(){return this.parentNode_===undefined;},set maxHighLeft(high){this.maxHighLeft_=high;},get maxHighLeft(){return this.maxHighLeft_;},set maxHighRight(high){this.maxHighRight_=high;},get maxHighRight(){return this.maxHighRight_;},get data(){return this.data_;},get isRed(){return this.colour_===Colour.RED;},merge(node){for(let i=0;i<node.data.length;i++){this.data_.push(node.data[i]);}
+this.data_.sort(function(a,b){return a.high-b.high;});},dump(){const ret={};if(this.leftNode_){ret.left=this.leftNode_.dump();}
+ret.data=this.data_.map(function(d){return[d.low,d.high];});if(this.rightNode_){ret.right=this.rightNode_.dump();}
+return ret;}};return{IntervalTree,};});'use strict';tr.exportTo('tr.b.math',function(){const tmpVec2s=[];for(let i=0;i<8;i++){tmpVec2s[i]=vec2.create();}
+const tmpVec2a=vec4.create();const tmpVec4a=vec4.create();const tmpVec4b=vec4.create();const tmpMat4=mat4.create();const tmpMat4b=mat4.create();const p00=vec2.createXY(0,0);const p10=vec2.createXY(1,0);const p01=vec2.createXY(0,1);const p11=vec2.createXY(1,1);const lerpingVecA=vec2.create();const lerpingVecB=vec2.create();function lerpVec2(out,a,b,amt){vec2.scale(lerpingVecA,a,amt);vec2.scale(lerpingVecB,b,1-amt);vec2.add(out,lerpingVecA,lerpingVecB);vec2.normalize(out,out);return out;}
+function Quad(){this.p1=vec2.create();this.p2=vec2.create();this.p3=vec2.create();this.p4=vec2.create();}
+Quad.fromXYWH=function(x,y,w,h){const q=new Quad();vec2.set(q.p1,x,y);vec2.set(q.p2,x+w,y);vec2.set(q.p3,x+w,y+h);vec2.set(q.p4,x,y+h);return q;};Quad.fromRect=function(r){return new Quad.fromXYWH(r.x,r.y,r.width,r.height);};Quad.from4Vecs=function(p1,p2,p3,p4){const q=new Quad();vec2.set(q.p1,p1[0],p1[1]);vec2.set(q.p2,p2[0],p2[1]);vec2.set(q.p3,p3[0],p3[1]);vec2.set(q.p4,p4[0],p4[1]);return q;};Quad.from8Array=function(arr){if(arr.length!==8){throw new Error('Array must be 8 long');}
+const q=new Quad();q.p1[0]=arr[0];q.p1[1]=arr[1];q.p2[0]=arr[2];q.p2[1]=arr[3];q.p3[0]=arr[4];q.p3[1]=arr[5];q.p4[0]=arr[6];q.p4[1]=arr[7];return q;};Quad.prototype={pointInside(point){return pointInImplicitQuad(point,this.p1,this.p2,this.p3,this.p4);},boundingRect(){const x0=Math.min(this.p1[0],this.p2[0],this.p3[0],this.p4[0]);const y0=Math.min(this.p1[1],this.p2[1],this.p3[1],this.p4[1]);const x1=Math.max(this.p1[0],this.p2[0],this.p3[0],this.p4[0]);const y1=Math.max(this.p1[1],this.p2[1],this.p3[1],this.p4[1]);return new tr.b.math.Rect.fromXYWH(x0,y0,x1-x0,y1-y0);},clone(){const q=new Quad();vec2.copy(q.p1,this.p1);vec2.copy(q.p2,this.p2);vec2.copy(q.p3,this.p3);vec2.copy(q.p4,this.p4);return q;},scale(s){const q=new Quad();this.scaleFast(q,s);return q;},scaleFast(dstQuad,s){vec2.copy(dstQuad.p1,this.p1,s);vec2.copy(dstQuad.p2,this.p2,s);vec2.copy(dstQuad.p3,this.p3,s);vec2.copy(dstQuad.p3,this.p3,s);},isRectangle(){const bounds=this.boundingRect();return(bounds.x===this.p1[0]&&bounds.y===this.p1[1]&&bounds.width===this.p2[0]-this.p1[0]&&bounds.y===this.p2[1]&&bounds.width===this.p3[0]-this.p1[0]&&bounds.height===this.p3[1]-this.p2[1]&&bounds.x===this.p4[0]&&bounds.height===this.p4[1]-this.p2[1]);},projectUnitRect(rect){const q=new Quad();this.projectUnitRectFast(q,rect);return q;},projectUnitRectFast(dstQuad,rect){const v12=tmpVec2s[0];const v14=tmpVec2s[1];const v23=tmpVec2s[2];const v43=tmpVec2s[3];vec2.sub(v12,this.p2,this.p1);const l12=vec2.length(v12);vec2.scale(v12,v12,1/l12);vec2.sub(v14,this.p4,this.p1);const l14=vec2.length(v14);vec2.scale(v14,v14,1/l14);vec2.sub(v23,this.p3,this.p2);const l23=vec2.length(v23);vec2.scale(v23,v23,1/l23);vec2.sub(v43,this.p3,this.p4);const l43=vec2.length(v43);vec2.scale(v43,v43,1/l43);const b12=tmpVec2s[0];const b14=tmpVec2s[1];const b23=tmpVec2s[2];const b43=tmpVec2s[3];lerpVec2(b12,v12,v43,rect.y);lerpVec2(b43,v12,v43,1-rect.bottom);lerpVec2(b14,v14,v23,rect.x);lerpVec2(b23,v14,v23,1-rect.right);vec2.addTwoScaledUnitVectors(tmpVec2a,b12,l12*rect.x,b14,l14*rect.y);vec2.add(dstQuad.p1,this.p1,tmpVec2a);vec2.addTwoScaledUnitVectors(tmpVec2a,b12,l12*-(1.0-rect.right),b23,l23*rect.y);vec2.add(dstQuad.p2,this.p2,tmpVec2a);vec2.addTwoScaledUnitVectors(tmpVec2a,b43,l43*-(1.0-rect.right),b23,l23*-(1.0-rect.bottom));vec2.add(dstQuad.p3,this.p3,tmpVec2a);vec2.addTwoScaledUnitVectors(tmpVec2a,b43,l43*rect.left,b14,l14*-(1.0-rect.bottom));vec2.add(dstQuad.p4,this.p4,tmpVec2a);},toString(){return'Quad('+
+vec2.toString(this.p1)+', '+
+vec2.toString(this.p2)+', '+
+vec2.toString(this.p3)+', '+
+vec2.toString(this.p4)+')';}};function sign(p1,p2,p3){return(p1[0]-p3[0])*(p2[1]-p3[1])-
+(p2[0]-p3[0])*(p1[1]-p3[1]);}
+function pointInTriangle2(pt,p1,p2,p3){const b1=sign(pt,p1,p2)<0.0;const b2=sign(pt,p2,p3)<0.0;const b3=sign(pt,p3,p1)<0.0;return((b1===b2)&&(b2===b3));}
+function pointInImplicitQuad(point,p1,p2,p3,p4){return pointInTriangle2(point,p1,p2,p3)||pointInTriangle2(point,p1,p3,p4);}
+return{pointInTriangle2,pointInImplicitQuad,Quad,};});'use strict';tr.exportTo('tr.b',function(){function addSingletonGetter(ctor){ctor.getInstance=function(){return ctor.instance_||(ctor.instance_=new ctor());};}
+function deepCopy(value){if(!(value instanceof Object)){if(value===undefined||value===null)return value;if(typeof value==='string')return value.substring();if(typeof value==='boolean')return value;if(typeof value==='number')return value;throw new Error('Unrecognized: '+typeof value);}
+const object=value;if(object instanceof Array){const res=new Array(object.length);for(let i=0;i<object.length;i++){res[i]=deepCopy(object[i]);}
+return res;}
+if(object.__proto__!==Object.prototype){throw new Error('Can only clone simple types');}
+const res={};for(const key in object){res[key]=deepCopy(object[key]);}
+return res;}
+function normalizeException(e){if(e===undefined||e===null){return{typeName:'UndefinedError',message:'Unknown: null or undefined exception',stack:'Unknown'};}
+if(typeof(e)==='string'){return{typeName:'StringError',message:e,stack:[e]};}
+let typeName;if(e.name){typeName=e.name;}else if(e.constructor){if(e.constructor.name){typeName=e.constructor.name;}else{typeName='AnonymousError';}}else{typeName='ErrorWithNoConstructor';}
+const msg=e.message?e.message:'Unknown';return{typeName,message:msg,stack:e.stack?e.stack:[msg]};}
+function stackTraceAsString(){return new Error().stack+'';}
+function stackTrace(){let stack=stackTraceAsString();stack=stack.split('\n');return stack.slice(2);}
+function getUsingPath(path,fromDict){const parts=path.split('.');let cur=fromDict;for(let part;parts.length&&(part=parts.shift());){if(!parts.length){return cur[part];}else if(part in cur){cur=cur[part];}else{return undefined;}}
+return undefined;}
+function formatDate(date){return date.toISOString().replace('T',' ').slice(0,19);}
+function numberToJson(n){if(isNaN(n))return'NaN';if(n===Infinity)return'Infinity';if(n===-Infinity)return'-Infinity';return n;}
+function numberFromJson(n){if(n==='NaN'||n===null)return NaN;if(n==='Infinity')return Infinity;if(n==='-Infinity')return-Infinity;return n;}
+function runLengthEncoding(ary){const encodedArray=[];for(const element of ary){if(encodedArray.length===0||encodedArray[encodedArray.length-1].value!==element){encodedArray.push({value:element,count:1,});}else{encodedArray[encodedArray.length-1].count+=1;}}
+return encodedArray;}
+return{addSingletonGetter,deepCopy,normalizeException,stackTrace,stackTraceAsString,formatDate,numberToJson,numberFromJson,getUsingPath,runLengthEncoding,};});'use strict';tr.exportTo('tr.b',function(){const ESTIMATED_IDLE_PERIOD_LENGTH_MILLISECONDS=10;const REQUEST_IDLE_CALLBACK_TIMEOUT_MILLISECONDS=100;const recordRAFStacks=false;let pendingPreAFs=[];let pendingRAFs=[];const pendingIdleCallbacks=[];let currentRAFDispatchList=undefined;let rafScheduled=false;let idleWorkScheduled=false;function scheduleRAF(){if(rafScheduled)return;rafScheduled=true;if(tr.isHeadless){Promise.resolve().then(function(){processRequests(false,0);},function(e){throw e;});}else{if(window.requestAnimationFrame){window.requestAnimationFrame(processRequests.bind(this,false));}else{const delta=Date.now()-window.performance.now();window.webkitRequestAnimationFrame(function(domTimeStamp){processRequests(false,domTimeStamp-delta);});}}}
+function nativeRequestIdleCallbackSupported(){return!tr.isHeadless&&window.requestIdleCallback;}
+function scheduleIdleWork(){if(idleWorkScheduled)return;if(!nativeRequestIdleCallbackSupported()){scheduleRAF();return;}
+idleWorkScheduled=true;window.requestIdleCallback(function(deadline,didTimeout){processIdleWork(false,deadline);},{timeout:REQUEST_IDLE_CALLBACK_TIMEOUT_MILLISECONDS});}
+function onAnimationFrameError(e,opt_stack){console.log(e.stack);if(tr.isHeadless)throw e;if(opt_stack)console.log(opt_stack);if(e.message){console.error(e.message,e.stack);}else{console.error(e);}}
+function runTask(task,frameBeginTime){try{task.callback.call(task.context,frameBeginTime);}catch(e){tr.b.onAnimationFrameError(e,task.stack);}}
+function processRequests(forceAllTasksToRun,frameBeginTime){rafScheduled=false;const currentPreAFs=pendingPreAFs;currentRAFDispatchList=pendingRAFs;pendingPreAFs=[];pendingRAFs=[];const hasRAFTasks=currentPreAFs.length||currentRAFDispatchList.length;for(let i=0;i<currentPreAFs.length;i++){runTask(currentPreAFs[i],frameBeginTime);}
+while(currentRAFDispatchList.length>0){runTask(currentRAFDispatchList.shift(),frameBeginTime);}
+currentRAFDispatchList=undefined;if((!hasRAFTasks&&!nativeRequestIdleCallbackSupported())||forceAllTasksToRun){const rafCompletionDeadline=frameBeginTime+ESTIMATED_IDLE_PERIOD_LENGTH_MILLISECONDS;processIdleWork(forceAllTasksToRun,{timeRemaining(){return rafCompletionDeadline-window.performance.now();}});}
+if(pendingIdleCallbacks.length>0)scheduleIdleWork();}
+function processIdleWork(forceAllTasksToRun,deadline){idleWorkScheduled=false;while(pendingIdleCallbacks.length>0){runTask(pendingIdleCallbacks.shift());if(!forceAllTasksToRun&&(tr.isHeadless||deadline.timeRemaining()<=0)){break;}}
+if(pendingIdleCallbacks.length>0)scheduleIdleWork();}
+function getStack_(){if(!recordRAFStacks)return'';const stackLines=tr.b.stackTrace();stackLines.shift();return stackLines.join('\n');}
+function requestPreAnimationFrame(callback,opt_this){pendingPreAFs.push({callback,context:opt_this||global,stack:getStack_()});scheduleRAF();}
+function requestAnimationFrameInThisFrameIfPossible(callback,opt_this){if(!currentRAFDispatchList){requestAnimationFrame(callback,opt_this);return;}
+currentRAFDispatchList.push({callback,context:opt_this||global,stack:getStack_()});return;}
+function requestAnimationFrame(callback,opt_this){pendingRAFs.push({callback,context:opt_this||global,stack:getStack_()});scheduleRAF();}
+function animationFrame(){return new Promise(resolve=>requestAnimationFrame(resolve));}
+function requestIdleCallback(callback,opt_this){pendingIdleCallbacks.push({callback,context:opt_this||global,stack:getStack_()});scheduleIdleWork();}
+function forcePendingRAFTasksToRun(frameBeginTime){if(!rafScheduled)return;processRequests(false,frameBeginTime);}
+function forceAllPendingTasksToRunForTest(){if(!rafScheduled&&!idleWorkScheduled)return;processRequests(true,0);}
+function timeout(ms){return new Promise(resolve=>window.setTimeout(resolve,ms));}
+function idle(){return new Promise(resolve=>requestIdleCallback(resolve));}
+return{animationFrame,forceAllPendingTasksToRunForTest,forcePendingRAFTasksToRun,idle,onAnimationFrameError,requestAnimationFrame,requestAnimationFrameInThisFrameIfPossible,requestIdleCallback,requestPreAnimationFrame,timeout,};});'use strict';tr.exportTo('tr.b',function(){class Mark{constructor(groupName,functionName){if(tr.isHeadless)return;this.groupName_=groupName;this.functionName_=functionName;const guid=tr.b.GUID.allocateSimple();this.measureName_=`${groupName} ${functionName}`;this.startMarkName_=`${this.measureName} ${guid} start`;this.endMarkName_=`${this.measureName} ${guid} end`;window.performance.mark(this.startMarkName_);}
+get groupName(){return this.groupName_;}
+get functionName(){return this.functionName_;}
+get measureName(){return this.measureName_;}
+get startMark(){return tr.b.getOnlyElement(window.performance.getEntriesByName(this.startMarkName_));}
+get endMark(){return tr.b.getOnlyElement(window.performance.getEntriesByName(this.endMarkName_));}
+get durationMs(){return this.endMark.startTime-this.startMark.startTime;}
+end(){if(tr.isHeadless)return;window.performance.mark(this.endMarkName_);window.performance.measure(this.measureName_,this.startMarkName_,this.endMarkName_);if(!(window.ga instanceof Function))return;ga('send',{hitType:'event',eventCategory:this.groupName,eventAction:this.functionName,eventValue:this.durationMs,});}}
+class Timing{static mark(groupName,functionName){return new Mark(groupName,functionName);}
+static instant(groupName,functionName,opt_value){const valueString=opt_value===undefined?'':' '+opt_value;console.timeStamp(`${groupName} ${functionName}${valueString}`);if(!(window.ga instanceof Function))return;ga('send',{hitType:'event',eventCategory:groupName,eventAction:functionName,eventValue:opt_value,});}}
+return{Timing,};});'use strict';tr.exportTo('tr.b',function(){const Timing=tr.b.Timing;function Task(runCb,thisArg){if(runCb!==undefined&&thisArg===undefined&&runCb.prototype!==undefined){throw new Error('Almost certainly you meant to pass a bound callback '+'or thisArg.');}
+this.runCb_=runCb;this.thisArg_=thisArg;this.afterTask_=undefined;this.subTasks_=[];this.updatesUi_=false;}
+Task.prototype={get name(){return this.runCb_.name;},set updatesUi(value){this.updatesUi_=value;},subTask(cb,thisArg){if(cb instanceof Task){this.subTasks_.push(cb);}else{this.subTasks_.push(new Task(cb,thisArg));}
+return this.subTasks_[this.subTasks_.length-1];},run(){if(this.runCb_!==undefined)this.runCb_.call(this.thisArg_,this);const subTasks=this.subTasks_;this.subTasks_=undefined;if(!subTasks.length)return this.afterTask_;for(let i=1;i<subTasks.length;i++){subTasks[i-1].afterTask_=subTasks[i];}
+subTasks[subTasks.length-1].afterTask_=this.afterTask_;return subTasks[0];},after(cb,thisArg){if(this.afterTask_){throw new Error('Has an after task already');}
+if(cb instanceof Task){this.afterTask_=cb;}else{this.afterTask_=new Task(cb,thisArg);}
+return this.afterTask_;},enqueue(cb,thisArg){if(!this.afterTask_)return this.after(cb,thisArg);return this.afterTask_.enqueue(cb,thisArg);}};Task.RunSynchronously=function(task){let curTask=task;while(curTask){curTask=curTask.run();}};Task.RunWhenIdle=function(task){return new Promise(function(resolve,reject){let curTask=task;function runAnother(){try{curTask=curTask.run();}catch(e){reject(e);return;}
+if(curTask){if(curTask.updatesUi_){tr.b.requestAnimationFrameInThisFrameIfPossible(runAnother);}else{tr.b.requestIdleCallback(runAnother);}
+return;}
+resolve();}
+tr.b.requestIdleCallback(runAnother);});};return{Task,};});'use strict';tr.exportTo('tr.c',function(){function makeCaseInsensitiveRegex(pattern){pattern=pattern.replace(/[.*+?^${}()|[\]\\]/g,'\\$&');return new RegExp(pattern,'i');}
+function Filter(){}
+Filter.prototype={__proto__:Object.prototype,matchCounter(counter){return true;},matchCpu(cpu){return true;},matchProcess(process){return true;},matchSlice(slice){return true;},matchThread(thread){return true;}};function TitleOrCategoryFilter(text){Filter.call(this);this.regex_=makeCaseInsensitiveRegex(text);if(!text.length){throw new Error('Filter text is empty.');}}
+TitleOrCategoryFilter.prototype={__proto__:Filter.prototype,matchSlice(slice){if(slice.title===undefined&&slice.category===undefined){return false;}
+return this.regex_.test(slice.title)||(!!slice.category&&this.regex_.test(slice.category));}};function ExactTitleFilter(text){Filter.call(this);this.text_=text;if(!text.length){throw new Error('Filter text is empty.');}}
+ExactTitleFilter.prototype={__proto__:Filter.prototype,matchSlice(slice){return slice.title===this.text_;}};function FullTextFilter(text){Filter.call(this);this.regex_=makeCaseInsensitiveRegex(text);this.titleOrCategoryFilter_=new TitleOrCategoryFilter(text);}
+FullTextFilter.prototype={__proto__:Filter.prototype,matchObject_(obj){for(const key in obj){if(!obj.hasOwnProperty(key))continue;if(this.regex_.test(key))return true;if(this.regex_.test(obj[key]))return true;}
+return false;},matchSlice(slice){if(this.titleOrCategoryFilter_.matchSlice(slice))return true;return this.matchObject_(slice.args);}};return{Filter,TitleOrCategoryFilter,ExactTitleFilter,FullTextFilter,};});'use strict';tr.exportTo('tr.model',function(){const ClockDomainId={BATTOR:'BATTOR',UNKNOWN_CHROME_LEGACY:'UNKNOWN_CHROME_LEGACY',LINUX_CLOCK_MONOTONIC:'LINUX_CLOCK_MONOTONIC',LINUX_FTRACE_GLOBAL:'LINUX_FTRACE_GLOBAL',MAC_MACH_ABSOLUTE_TIME:'MAC_MACH_ABSOLUTE_TIME',WIN_ROLLOVER_PROTECTED_TIME_GET_TIME:'WIN_ROLLOVER_PROTECTED_TIME_GET_TIME',WIN_QPC:'WIN_QPC',SYSTRACE:'SYSTRACE',TELEMETRY:'TELEMETRY'};const POSSIBLE_CHROME_CLOCK_DOMAINS=new Set([ClockDomainId.UNKNOWN_CHROME_LEGACY,ClockDomainId.LINUX_CLOCK_MONOTONIC,ClockDomainId.MAC_MACH_ABSOLUTE_TIME,ClockDomainId.WIN_ROLLOVER_PROTECTED_TIME_GET_TIME,ClockDomainId.WIN_QPC]);const BATTOR_FAST_SYNC_THRESHOLD_MS=3;function ClockSyncManager(){this.domainsSeen_=new Set();this.markersBySyncId_=new Map();this.transformerMapByDomainId_={};}
+ClockSyncManager.prototype={addClockSyncMarker(domainId,syncId,startTs,opt_endTs){this.onDomainSeen_(domainId);if(Object.values(ClockDomainId).indexOf(domainId)<0){throw new Error('"'+domainId+'" is not in the list of known '+'clock domain IDs.');}
+if(this.modelDomainId_){throw new Error('Cannot add new clock sync markers after getting '+'a model time transformer.');}
+const marker=new ClockSyncMarker(domainId,startTs,opt_endTs);if(!this.markersBySyncId_.has(syncId)){this.markersBySyncId_.set(syncId,[marker]);return;}
+const markers=this.markersBySyncId_.get(syncId);if(markers.length===2){throw new Error('Clock sync with ID "'+syncId+'" is already '+'complete - cannot add a third clock sync marker to it.');}
+if(markers[0].domainId===domainId){throw new Error('A clock domain cannot sync with itself.');}
+markers.push(marker);this.onSyncCompleted_(markers[0],marker);},get markersBySyncId(){return this.markersBySyncId_;},get domainsSeen(){return this.domainsSeen_;},getModelTimeTransformer(domainId){this.onDomainSeen_(domainId);if(!this.modelDomainId_){this.selectModelDomainId_();}
+return this.getTimeTransformerRaw_(domainId,this.modelDomainId_).fn;},getTimeTransformerError(fromDomainId,toDomainId){this.onDomainSeen_(fromDomainId);this.onDomainSeen_(toDomainId);return this.getTimeTransformerRaw_(fromDomainId,toDomainId).error;},getTimeTransformerRaw_(fromDomainId,toDomainId){const transformer=this.getTransformerBetween_(fromDomainId,toDomainId);if(!transformer){throw new Error('No clock sync markers exist pairing clock domain "'+
+fromDomainId+'" '+'with target clock domain "'+
+toDomainId+'".');}
+return transformer;},getTransformerBetween_(fromDomainId,toDomainId){const visitedDomainIds=new Set();const queue=[{domainId:fromDomainId,transformer:Transformer.IDENTITY}];while(queue.length>0){queue.sort((domain1,domain2)=>domain1.transformer.error-domain2.transformer.error);const current=queue.shift();if(current.domainId===toDomainId){return current.transformer;}
+if(visitedDomainIds.has(current.domainId)){continue;}
+visitedDomainIds.add(current.domainId);const outgoingTransformers=this.transformerMapByDomainId_[current.domainId];if(!outgoingTransformers)continue;for(const outgoingDomainId in outgoingTransformers){const toNextDomainTransformer=outgoingTransformers[outgoingDomainId];const toCurrentDomainTransformer=current.transformer;queue.push({domainId:outgoingDomainId,transformer:Transformer.compose(toNextDomainTransformer,toCurrentDomainTransformer)});}}
+return undefined;},selectModelDomainId_(){this.ensureAllDomainsAreConnected_();for(const chromeDomainId of POSSIBLE_CHROME_CLOCK_DOMAINS){if(this.domainsSeen_.has(chromeDomainId)){this.modelDomainId_=chromeDomainId;return;}}
+const domainsSeenArray=Array.from(this.domainsSeen_);domainsSeenArray.sort();this.modelDomainId_=domainsSeenArray[0];},ensureAllDomainsAreConnected_(){let firstDomainId=undefined;for(const domainId of this.domainsSeen_){if(!firstDomainId){firstDomainId=domainId;continue;}
+if(!this.getTransformerBetween_(firstDomainId,domainId)){throw new Error('Unable to select a master clock domain because no '+'path can be found from "'+firstDomainId+'" to "'+domainId+'".');}}
+return true;},onDomainSeen_(domainId){if(domainId===ClockDomainId.UNKNOWN_CHROME_LEGACY&&!this.domainsSeen_.has(ClockDomainId.UNKNOWN_CHROME_LEGACY)){for(const chromeDomainId of POSSIBLE_CHROME_CLOCK_DOMAINS){if(chromeDomainId===ClockDomainId.UNKNOWN_CHROME_LEGACY){continue;}
+this.collapseDomains_(ClockDomainId.UNKNOWN_CHROME_LEGACY,chromeDomainId);}}
+this.domainsSeen_.add(domainId);},onSyncCompleted_(marker1,marker2){const forwardTransformer=Transformer.fromMarkers(marker1,marker2);const backwardTransformer=Transformer.fromMarkers(marker2,marker1);const existingTransformer=this.getOrCreateTransformerMap_(marker1.domainId)[marker2.domainId];if(!existingTransformer||forwardTransformer.error<existingTransformer.error){this.getOrCreateTransformerMap_(marker1.domainId)[marker2.domainId]=forwardTransformer;this.getOrCreateTransformerMap_(marker2.domainId)[marker1.domainId]=backwardTransformer;}},collapseDomains_(domain1Id,domain2Id){this.getOrCreateTransformerMap_(domain1Id)[domain2Id]=this.getOrCreateTransformerMap_(domain2Id)[domain1Id]=Transformer.IDENTITY;},getOrCreateTransformerMap_(domainId){if(!this.transformerMapByDomainId_[domainId]){this.transformerMapByDomainId_[domainId]={};}
+return this.transformerMapByDomainId_[domainId];},computeDotGraph(){let dotString='graph {\n';const domainsSeen=[...this.domainsSeen_].sort();for(const domainId of domainsSeen){dotString+=` ${domainId}[shape=box]\n`;}
+const markersBySyncIdEntries=[...this.markersBySyncId_.entries()].sort(([syncId1,markers1],[syncId2,markers2])=>syncId1.localeCompare(syncId2));for(const[syncId,markers]of markersBySyncIdEntries){const sortedMarkers=markers.sort((a,b)=>a.domainId.localeCompare(b.domainId));for(const m of markers){dotString+=` "${syncId}" -- ${m.domainId} `;dotString+=`[label="[${m.startTs}, ${m.endTs}]"]\n`;}}
+dotString+='}';return dotString;}};function ClockSyncMarker(domainId,startTs,opt_endTs){this.domainId=domainId;this.startTs=startTs;this.endTs=opt_endTs===undefined?startTs:opt_endTs;}
+ClockSyncMarker.prototype={get duration(){return this.endTs-this.startTs;},get ts(){return this.startTs+this.duration/2;}};function Transformer(fn,error){this.fn=fn;this.error=error;}
+Transformer.IDENTITY=new Transformer(tr.b.identity,0);Transformer.compose=function(aToB,bToC){return new Transformer((ts)=>bToC.fn(aToB.fn(ts)),aToB.error+bToC.error);};Transformer.fromMarkers=function(fromMarker,toMarker){let fromTs=fromMarker.ts;let toTs=toMarker.ts;if(fromMarker.domainId===ClockDomainId.BATTOR&&toMarker.duration>BATTOR_FAST_SYNC_THRESHOLD_MS){toTs=toMarker.startTs;}else if(toMarker.domainId===ClockDomainId.BATTOR&&fromMarker.duration>BATTOR_FAST_SYNC_THRESHOLD_MS){fromTs=fromMarker.startTs;}
+const tsShift=toTs-fromTs;return new Transformer((ts)=>ts+tsShift,fromMarker.duration+toMarker.duration);};return{ClockDomainId,ClockSyncManager,};});'use strict';tr.exportTo('tr.model',function(){function CounterSample(series,timestamp,value){tr.model.Event.call(this);this.series_=series;this.timestamp_=timestamp;this.value_=value;}
+CounterSample.groupByTimestamp=function(samples){const samplesByTimestamp=tr.b.groupIntoMap(samples,s=>s.timestamp);const timestamps=Array.from(samplesByTimestamp.keys());timestamps.sort();const groups=[];for(const ts of timestamps){const group=samplesByTimestamp.get(ts);group.sort((x,y)=>x.series.seriesIndex-y.series.seriesIndex);groups.push(group);}
+return groups;};CounterSample.prototype={__proto__:tr.model.Event.prototype,get series(){return this.series_;},get timestamp(){return this.timestamp_;},get value(){return this.value_;},set timestamp(timestamp){this.timestamp_=timestamp;},addBoundsToRange(range){range.addValue(this.timestamp);},getSampleIndex(){return tr.b.math.findLowIndexInSortedArray(this.series.timestamps,function(x){return x;},this.timestamp_);},get userFriendlyName(){return'Counter sample from '+this.series_.title+' at '+
+tr.b.Unit.byName.timeStampInMs.format(this.timestamp);}};tr.model.EventRegistry.register(CounterSample,{name:'counterSample',pluralName:'counterSamples'});return{CounterSample,};});'use strict';tr.exportTo('tr.model',function(){const CounterSample=tr.model.CounterSample;function CounterSeries(name,color){tr.model.EventContainer.call(this);this.name_=name;this.color_=color;this.timestamps_=[];this.samples_=[];this.counter=undefined;this.seriesIndex=undefined;}
+CounterSeries.prototype={__proto__:tr.model.EventContainer.prototype,get length(){return this.timestamps_.length;},get name(){return this.name_;},get color(){return this.color_;},get samples(){return this.samples_;},get timestamps(){return this.timestamps_;},getSample(idx){return this.samples_[idx];},getTimestamp(idx){return this.timestamps_[idx];},addCounterSample(ts,val){const sample=new CounterSample(this,ts,val);this.addSample(sample);return sample;},addSample(sample){this.timestamps_.push(sample.timestamp);this.samples_.push(sample);},getStatistics(sampleIndices){let sum=0;let min=Number.MAX_VALUE;let max=-Number.MAX_VALUE;for(let i=0;i<sampleIndices.length;++i){const sample=this.getSample(sampleIndices[i]).value;sum+=sample;min=Math.min(sample,min);max=Math.max(sample,max);}
+return{min,max,avg:(sum/sampleIndices.length),start:this.getSample(sampleIndices[0]).value,end:this.getSample(sampleIndices.length-1).value};},shiftTimestampsForward(amount){for(let i=0;i<this.timestamps_.length;++i){this.timestamps_[i]+=amount;this.samples_[i].timestamp=this.timestamps_[i];}},*childEvents(){yield*this.samples_;},*childEventContainers(){}};return{CounterSeries,};});'use strict';tr.exportTo('tr.model',function(){function Counter(parent,id,category,name){tr.model.EventContainer.call(this);this.parent_=parent;this.id_=id;this.category_=category||'';this.name_=name;this.series_=[];this.totals=[];}
+Counter.prototype={__proto__:tr.model.EventContainer.prototype,get parent(){return this.parent_;},get id(){return this.id_;},get category(){return this.category_;},get name(){return this.name_;},*childEvents(){},*childEventContainers(){yield*this.series;},set timestamps(arg){throw new Error('Bad counter API. No cookie.');},set seriesNames(arg){throw new Error('Bad counter API. No cookie.');},set seriesColors(arg){throw new Error('Bad counter API. No cookie.');},set samples(arg){throw new Error('Bad counter API. No cookie.');},addSeries(series){series.counter=this;series.seriesIndex=this.series_.length;this.series_.push(series);return series;},getSeries(idx){return this.series_[idx];},get series(){return this.series_;},get numSeries(){return this.series_.length;},get numSamples(){if(this.series_.length===0)return 0;return this.series_[0].length;},get timestamps(){if(this.series_.length===0)return[];return this.series_[0].timestamps;},getSampleStatistics(sampleIndices){sampleIndices.sort();const ret=[];this.series_.forEach(function(series){ret.push(series.getStatistics(sampleIndices));});return ret;},shiftTimestampsForward(amount){for(let i=0;i<this.series_.length;++i){this.series_[i].shiftTimestampsForward(amount);}},updateBounds(){this.totals=[];this.maxTotal=0;this.bounds.reset();if(this.series_.length===0)return;const firstSeries=this.series_[0];const lastSeries=this.series_[this.series_.length-1];this.bounds.addValue(firstSeries.getTimestamp(0));this.bounds.addValue(lastSeries.getTimestamp(lastSeries.length-1));const numSeries=this.numSeries;this.maxTotal=-Infinity;for(let i=0;i<firstSeries.length;++i){let total=0;this.series_.forEach(function(series){total+=series.getSample(i).value;this.totals.push(total);}.bind(this));this.maxTotal=Math.max(total,this.maxTotal);}}};Counter.compare=function(x,y){let tmp=x.parent.compareTo(y.parent);if(tmp!==0)return tmp;tmp=x.name.localeCompare(y.name);if(tmp===0)return x.tid-y.tid;return tmp;};return{Counter,};});'use strict';tr.exportTo('tr.model',function(){const Slice=tr.model.Slice;function CpuSlice(cat,title,colorId,start,args,opt_duration){Slice.apply(this,arguments);this.threadThatWasRunning=undefined;this.cpu=undefined;}
+CpuSlice.prototype={__proto__:Slice.prototype,get analysisTypeName(){return'tr.ui.analysis.CpuSlice';},getAssociatedTimeslice(){if(!this.threadThatWasRunning){return undefined;}
+const timeSlices=this.threadThatWasRunning.timeSlices;for(let i=0;i<timeSlices.length;i++){const timeSlice=timeSlices[i];if(timeSlice.start!==this.start){continue;}
+if(timeSlice.duration!==this.duration){continue;}
+return timeSlice;}
+return undefined;}};tr.model.EventRegistry.register(CpuSlice,{name:'cpuSlice',pluralName:'cpuSlices'});return{CpuSlice,};});'use strict';tr.exportTo('tr.model',function(){function TimeToObjectInstanceMap(createObjectInstanceFunction,parent,scopedId){this.createObjectInstanceFunction_=createObjectInstanceFunction;this.parent=parent;this.scopedId=scopedId;this.instances=[];}
+TimeToObjectInstanceMap.prototype={idWasCreated(category,name,ts){if(this.instances.length===0){this.instances.push(this.createObjectInstanceFunction_(this.parent,this.scopedId,category,name,ts));this.instances[0].creationTsWasExplicit=true;return this.instances[0];}
+let lastInstance=this.instances[this.instances.length-1];if(ts<lastInstance.deletionTs){throw new Error('Mutation of the TimeToObjectInstanceMap must be '+'done in ascending timestamp order.');}
+lastInstance=this.createObjectInstanceFunction_(this.parent,this.scopedId,category,name,ts);lastInstance.creationTsWasExplicit=true;this.instances.push(lastInstance);return lastInstance;},addSnapshot(category,name,ts,args,opt_baseTypeName){if(this.instances.length===0){this.instances.push(this.createObjectInstanceFunction_(this.parent,this.scopedId,category,name,ts,opt_baseTypeName));}
+const i=tr.b.math.findIndexInSortedIntervals(this.instances,function(inst){return inst.creationTs;},function(inst){return inst.deletionTs-inst.creationTs;},ts);let instance;if(i<0){instance=this.instances[0];if(ts>instance.deletionTs||instance.creationTsWasExplicit){throw new Error('At the provided timestamp, no instance was still alive');}
+if(instance.snapshots.length!==0){throw new Error('Cannot shift creationTs forward, '+'snapshots have been added. First snap was at ts='+
+instance.snapshots[0].ts+' and creationTs was '+
+instance.creationTs);}
+instance.creationTs=ts;}else if(i>=this.instances.length){instance=this.instances[this.instances.length-1];if(ts>=instance.deletionTs){instance=this.createObjectInstanceFunction_(this.parent,this.scopedId,category,name,ts,opt_baseTypeName);this.instances.push(instance);}else{let lastValidIndex;for(let i=this.instances.length-1;i>=0;i--){const tmp=this.instances[i];if(ts>=tmp.deletionTs)break;if(tmp.creationTsWasExplicit===false&&tmp.snapshots.length===0){lastValidIndex=i;}}
+if(lastValidIndex===undefined){throw new Error('Cannot add snapshot. No instance was alive that was mutable.');}
+instance=this.instances[lastValidIndex];instance.creationTs=ts;}}else{instance=this.instances[i];}
+return instance.addSnapshot(ts,args,name,opt_baseTypeName);},get lastInstance(){if(this.instances.length===0)return undefined;return this.instances[this.instances.length-1];},idWasDeleted(category,name,ts){if(this.instances.length===0){this.instances.push(this.createObjectInstanceFunction_(this.parent,this.scopedId,category,name,ts));}
+let lastInstance=this.instances[this.instances.length-1];if(ts<lastInstance.creationTs){throw new Error('Cannot delete an id before it was created');}
+if(lastInstance.deletionTs===Number.MAX_VALUE){lastInstance.wasDeleted(ts);return lastInstance;}
+if(ts<lastInstance.deletionTs){throw new Error('id was already deleted earlier.');}
+lastInstance=this.createObjectInstanceFunction_(this.parent,this.scopedId,category,name,ts);this.instances.push(lastInstance);lastInstance.wasDeleted(ts);return lastInstance;},getInstanceAt(ts){const i=tr.b.math.findIndexInSortedIntervals(this.instances,function(inst){return inst.creationTs;},function(inst){return inst.deletionTs-inst.creationTs;},ts);if(i<0){if(this.instances[0].creationTsWasExplicit){return undefined;}
+return this.instances[0];}else if(i>=this.instances.length){return undefined;}
+return this.instances[i];}};return{TimeToObjectInstanceMap,};});'use strict';tr.exportTo('tr.model',function(){const ObjectInstance=tr.model.ObjectInstance;const ObjectSnapshot=tr.model.ObjectSnapshot;function ObjectCollection(parent){tr.model.EventContainer.call(this);this.parent=parent;this.instanceMapsByScopedId_={};this.instancesByTypeName_={};this.createObjectInstance_=this.createObjectInstance_.bind(this);}
+ObjectCollection.prototype={__proto__:tr.model.EventContainer.prototype,*childEvents(){for(const instance of this.getAllObjectInstances()){yield instance;yield*instance.snapshots;}},createObjectInstance_(parent,scopedId,category,name,creationTs,opt_baseTypeName){const constructor=tr.model.ObjectInstance.subTypes.getConstructor(category,name);const instance=new constructor(parent,scopedId,category,name,creationTs,opt_baseTypeName);const typeName=instance.typeName;let instancesOfTypeName=this.instancesByTypeName_[typeName];if(!instancesOfTypeName){instancesOfTypeName=[];this.instancesByTypeName_[typeName]=instancesOfTypeName;}
+instancesOfTypeName.push(instance);return instance;},getOrCreateInstanceMap_(scopedId){let dict;if(scopedId.scope in this.instanceMapsByScopedId_){dict=this.instanceMapsByScopedId_[scopedId.scope];}else{dict={};this.instanceMapsByScopedId_[scopedId.scope]=dict;}
+let instanceMap=dict[scopedId.id];if(instanceMap)return instanceMap;instanceMap=new tr.model.TimeToObjectInstanceMap(this.createObjectInstance_,this.parent,scopedId);dict[scopedId.id]=instanceMap;return instanceMap;},idWasCreated(scopedId,category,name,ts){const instanceMap=this.getOrCreateInstanceMap_(scopedId);return instanceMap.idWasCreated(category,name,ts);},addSnapshot(scopedId,category,name,ts,args,opt_baseTypeName){const instanceMap=this.getOrCreateInstanceMap_(scopedId);const snapshot=instanceMap.addSnapshot(category,name,ts,args,opt_baseTypeName);if(snapshot.objectInstance.category!==category){const msg='Added snapshot name='+name+' with cat='+category+' impossible. It instance was created/snapshotted with cat='+
+snapshot.objectInstance.category+' name='+
+snapshot.objectInstance.name;throw new Error(msg);}
+if(opt_baseTypeName&&snapshot.objectInstance.baseTypeName!==opt_baseTypeName){throw new Error('Could not add snapshot with baseTypeName='+
+opt_baseTypeName+'. It '+'was previously created with name='+
+snapshot.objectInstance.baseTypeName);}
+if(snapshot.objectInstance.name!==name){throw new Error('Could not add snapshot with name='+name+'. It '+'was previously created with name='+
+snapshot.objectInstance.name);}
+return snapshot;},idWasDeleted(scopedId,category,name,ts){const instanceMap=this.getOrCreateInstanceMap_(scopedId);const deletedInstance=instanceMap.idWasDeleted(category,name,ts);if(!deletedInstance)return;if(deletedInstance.category!==category){const msg='Deleting object '+deletedInstance.name+' with a different category '+'than when it was created. It previous had cat='+
+deletedInstance.category+' but the delete command '+'had cat='+category;throw new Error(msg);}
+if(deletedInstance.baseTypeName!==name){throw new Error('Deletion requested for name='+
+name+' could not proceed: '+'An existing object with baseTypeName='+
+deletedInstance.baseTypeName+' existed.');}},autoDeleteObjects(maxTimestamp){for(const imapById of Object.values(this.instanceMapsByScopedId_)){for(const i2imap of Object.values(imapById)){const lastInstance=i2imap.lastInstance;if(lastInstance.deletionTs!==Number.MAX_VALUE)continue;i2imap.idWasDeleted(lastInstance.category,lastInstance.name,maxTimestamp);lastInstance.deletionTsWasExplicit=false;}}},getObjectInstanceAt(scopedId,ts){let instanceMap;if(scopedId.scope in this.instanceMapsByScopedId_){instanceMap=this.instanceMapsByScopedId_[scopedId.scope][scopedId.id];}
+if(!instanceMap)return undefined;return instanceMap.getInstanceAt(ts);},getSnapshotAt(scopedId,ts){const instance=this.getObjectInstanceAt(scopedId,ts);if(!instance)return undefined;return instance.getSnapshotAt(ts);},iterObjectInstances(iter,opt_this){opt_this=opt_this||this;for(const imapById of Object.values(this.instanceMapsByScopedId_)){for(const i2imap of Object.values(imapById)){i2imap.instances.forEach(iter,opt_this);}}},getAllObjectInstances(){const instances=[];this.iterObjectInstances(function(i){instances.push(i);});return instances;},getAllInstancesNamed(name){return this.instancesByTypeName_[name];},getAllInstancesByTypeName(){return this.instancesByTypeName_;},preInitializeAllObjects(){this.iterObjectInstances(function(instance){instance.preInitialize();});},initializeAllObjects(){this.iterObjectInstances(function(instance){instance.initialize();});},initializeInstances(){this.iterObjectInstances(function(instance){instance.initialize();});},updateBounds(){this.bounds.reset();this.iterObjectInstances(function(instance){instance.updateBounds();this.bounds.addRange(instance.bounds);},this);},shiftTimestampsForward(amount){this.iterObjectInstances(function(instance){instance.shiftTimestampsForward(amount);});},addCategoriesToDict(categoriesDict){this.iterObjectInstances(function(instance){categoriesDict[instance.category]=true;});}};return{ObjectCollection,};});'use strict';tr.exportTo('tr.model',function(){function AsyncSliceGroup(parentContainer,opt_name){tr.model.EventContainer.call(this);this.parentContainer_=parentContainer;this.slices=[];this.name_=opt_name;this.viewSubGroups_=undefined;}
+AsyncSliceGroup.prototype={__proto__:tr.model.EventContainer.prototype,get parentContainer(){return this.parentContainer_;},get model(){return this.parentContainer_.parent.model;},get stableId(){return this.parentContainer_.stableId+'.AsyncSliceGroup';},getSettingsKey(){if(!this.name_)return undefined;const parentKey=this.parentContainer_.getSettingsKey();if(!parentKey)return undefined;return parentKey+'.'+this.name_;},push(slice){slice.parentContainer=this.parentContainer;this.slices.push(slice);return slice;},get length(){return this.slices.length;},shiftTimestampsForward(amount){for(let sI=0;sI<this.slices.length;sI++){const slice=this.slices[sI];slice.start=(slice.start+amount);const shiftSubSlices=function(subSlices){if(subSlices===undefined||subSlices.length===0)return;for(let sJ=0;sJ<subSlices.length;sJ++){subSlices[sJ].start+=amount;shiftSubSlices(subSlices[sJ].subSlices);}};shiftSubSlices(slice.subSlices);}},updateBounds(){this.bounds.reset();for(let i=0;i<this.slices.length;i++){this.bounds.addValue(this.slices[i].start);this.bounds.addValue(this.slices[i].end);}},get viewSubGroups(){if(this.viewSubGroups_===undefined){let prefix='';if(this.name!==undefined){prefix=this.name+'.';}else{prefix='';}
+const subGroupsByTitle={};for(let i=0;i<this.slices.length;++i){const slice=this.slices[i];const subGroupTitle=slice.viewSubGroupTitle;if(!subGroupsByTitle[subGroupTitle]){subGroupsByTitle[subGroupTitle]=new AsyncSliceGroup(this.parentContainer_,prefix+subGroupTitle);}
+subGroupsByTitle[subGroupTitle].push(slice);}
+this.viewSubGroups_=Object.values(subGroupsByTitle);this.viewSubGroups_.sort(function(a,b){return a.slices[0].compareTo(b.slices[0]);});}
+return this.viewSubGroups_;},*findTopmostSlicesInThisContainer(eventPredicate,opt_this){for(const slice of this.slices){if(slice.isTopLevel){yield*slice.findTopmostSlicesRelativeToThisSlice(eventPredicate,opt_this);}}},*childEvents(){for(const slice of this.slices){yield slice;if(slice.subSlices){yield*slice.subSlices;}}},*childEventContainers(){}};return{AsyncSliceGroup,};});'use strict';tr.exportTo('tr.model',function(){const Slice=tr.model.Slice;function ThreadSlice(cat,title,colorId,start,args,opt_duration,opt_cpuStart,opt_cpuDuration,opt_argsStripped,opt_bindId){Slice.call(this,cat,title,colorId,start,args,opt_duration,opt_cpuStart,opt_cpuDuration,opt_argsStripped,opt_bindId);this.subSlices=[];}
+ThreadSlice.prototype={__proto__:Slice.prototype,get overlappingSamples(){const samples=new tr.model.EventSet();if(!this.parentContainer||!this.parentContainer.samples){return samples;}
+this.parentContainer.samples.forEach(function(sample){if(this.start<=sample.start&&sample.start<=this.end){samples.push(sample);}},this);return samples;}};tr.model.EventRegistry.register(ThreadSlice,{name:'slice',pluralName:'slices'});return{ThreadSlice,};});'use strict';tr.exportTo('tr.model',function(){const ColorScheme=tr.b.ColorScheme;const ThreadSlice=tr.model.ThreadSlice;function getSliceLo(s){return s.start;}
+function getSliceHi(s){return s.end;}
+function SliceGroup(parentContainer,opt_sliceConstructor,opt_name){tr.model.EventContainer.call(this);this.parentContainer_=parentContainer;const sliceConstructor=opt_sliceConstructor||ThreadSlice;this.sliceConstructor=sliceConstructor;this.sliceConstructorSubTypes=this.sliceConstructor.subTypes;if(!this.sliceConstructorSubTypes){throw new Error('opt_sliceConstructor must have a subtype registry.');}
+this.openPartialSlices_=[];this.slices=[];this.topLevelSlices=[];this.haveTopLevelSlicesBeenBuilt=false;this.name_=opt_name;if(this.model===undefined){throw new Error('SliceGroup must have model defined.');}}
+SliceGroup.prototype={__proto__:tr.model.EventContainer.prototype,get parentContainer(){return this.parentContainer_;},get model(){return this.parentContainer_.model;},get stableId(){return this.parentContainer_.stableId+'.SliceGroup';},getSettingsKey(){if(!this.name_)return undefined;const parentKey=this.parentContainer_.getSettingsKey();if(!parentKey)return undefined;return parentKey+'.'+this.name;},get length(){return this.slices.length;},pushSlice(slice){this.haveTopLevelSlicesBeenBuilt=false;slice.parentContainer=this.parentContainer_;this.slices.push(slice);return slice;},pushSlices(slices){this.haveTopLevelSlicesBeenBuilt=false;slices.forEach(function(slice){slice.parentContainer=this.parentContainer_;this.slices.push(slice);},this);},beginSlice(category,title,ts,opt_args,opt_tts,opt_argsStripped,opt_colorId){if(this.openPartialSlices_.length){const prevSlice=this.openPartialSlices_[this.openPartialSlices_.length-1];if(ts<prevSlice.start){throw new Error('Slices must be added in increasing timestamp order');}}
+const colorId=opt_colorId||ColorScheme.getColorIdForGeneralPurposeString(title);const sliceConstructorSubTypes=this.sliceConstructorSubTypes;const sliceType=sliceConstructorSubTypes.getConstructor(category,title);const slice=new sliceType(category,title,colorId,ts,opt_args?opt_args:{},null,opt_tts,undefined,opt_argsStripped);this.openPartialSlices_.push(slice);slice.didNotFinish=true;this.pushSlice(slice);return slice;},isTimestampValidForBeginOrEnd(ts){if(!this.openPartialSlices_.length)return true;const top=this.openPartialSlices_[this.openPartialSlices_.length-1];return ts>=top.start;},get openSliceCount(){return this.openPartialSlices_.length;},get mostRecentlyOpenedPartialSlice(){if(!this.openPartialSlices_.length)return undefined;return this.openPartialSlices_[this.openPartialSlices_.length-1];},endSlice(ts,opt_tts,opt_colorId){if(!this.openSliceCount){throw new Error('endSlice called without an open slice');}
+const slice=this.openPartialSlices_[this.openSliceCount-1];this.openPartialSlices_.splice(this.openSliceCount-1,1);if(ts<slice.start){throw new Error('Slice '+slice.title+' end time is before its start.');}
+slice.duration=ts-slice.start;slice.didNotFinish=false;slice.colorId=opt_colorId||slice.colorId;if(opt_tts&&slice.cpuStart!==undefined){slice.cpuDuration=opt_tts-slice.cpuStart;}
+return slice;},pushCompleteSlice(category,title,ts,duration,tts,cpuDuration,opt_args,opt_argsStripped,opt_colorId,opt_bindId){const colorId=opt_colorId||ColorScheme.getColorIdForGeneralPurposeString(title);const sliceConstructorSubTypes=this.sliceConstructorSubTypes;const sliceType=sliceConstructorSubTypes.getConstructor(category,title);const slice=new sliceType(category,title,colorId,ts,opt_args?opt_args:{},duration,tts,cpuDuration,opt_argsStripped,opt_bindId);if(duration===undefined){slice.didNotFinish=true;}
+this.pushSlice(slice);return slice;},autoCloseOpenSlices(){this.updateBounds();const maxTimestamp=this.bounds.max;for(let sI=0;sI<this.slices.length;sI++){const slice=this.slices[sI];if(slice.didNotFinish){slice.duration=maxTimestamp-slice.start;}}
+this.openPartialSlices_=[];},shiftTimestampsForward(amount){for(let sI=0;sI<this.slices.length;sI++){const slice=this.slices[sI];slice.start=(slice.start+amount);}},updateBounds(){this.bounds.reset();for(let i=0;i<this.slices.length;i++){this.bounds.addValue(this.slices[i].start);this.bounds.addValue(this.slices[i].end);}},copySlice(slice){const sliceConstructorSubTypes=this.sliceConstructorSubTypes;const sliceType=sliceConstructorSubTypes.getConstructor(slice.category,slice.title);const newSlice=new sliceType(slice.category,slice.title,slice.colorId,slice.start,slice.args,slice.duration,slice.cpuStart,slice.cpuDuration);newSlice.didNotFinish=slice.didNotFinish;return newSlice;},*findTopmostSlicesInThisContainer(eventPredicate,opt_this){if(!this.haveTopLevelSlicesBeenBuilt){throw new Error('Nope');}
+for(const s of this.topLevelSlices){yield*s.findTopmostSlicesRelativeToThisSlice(eventPredicate);}},*childEvents(){yield*this.slices;},*childEventContainers(){},getSlicesOfName(title){const slices=[];for(let i=0;i<this.slices.length;i++){if(this.slices[i].title===title){slices.push(this.slices[i]);}}
+return slices;},iterSlicesInTimeRange(callback,start,end){const ret=[];tr.b.math.iterateOverIntersectingIntervals(this.topLevelSlices,function(s){return s.start;},function(s){return s.duration;},start,end,function(topLevelSlice){callback(topLevelSlice);for(const slice of topLevelSlice.enumerateAllDescendents()){callback(slice);}});return ret;},findFirstSlice(){if(!this.haveTopLevelSlicesBeenBuilt){throw new Error('Nope');}
+if(0===this.slices.length)return undefined;return this.slices[0];},findSliceAtTs(ts){if(!this.haveTopLevelSlicesBeenBuilt)throw new Error('Nope');let i=tr.b.math.findIndexInSortedClosedIntervals(this.topLevelSlices,getSliceLo,getSliceHi,ts);if(i===-1||i===this.topLevelSlices.length){return undefined;}
+let curSlice=this.topLevelSlices[i];while(true){i=tr.b.math.findIndexInSortedClosedIntervals(curSlice.subSlices,getSliceLo,getSliceHi,ts);if(i===-1||i===curSlice.subSlices.length){return curSlice;}
+curSlice=curSlice.subSlices[i];}},findNextSliceAfter(ts,refGuid){let i=tr.b.math.findLowIndexInSortedArray(this.slices,getSliceLo,ts);if(i===this.slices.length){return undefined;}
+for(;i<this.slices.length;i++){const slice=this.slices[i];if(slice.start>ts)return slice;if(slice.guid<=refGuid)continue;return slice;}
+return undefined;},hasCpuDuration_(){if(this.slices.some(function(slice){return slice.cpuDuration!==undefined;}))return true;return false;},createSubSlices(){this.haveTopLevelSlicesBeenBuilt=true;this.createSubSlicesImpl_();if(!this.hasCpuDuration_()&&this.parentContainer.timeSlices){this.addCpuTimeToSubslices_(this.parentContainer.timeSlices);}
+this.slices.forEach(function(slice){let selfTime=slice.duration;for(let i=0;i<slice.subSlices.length;i++){selfTime-=slice.subSlices[i].duration;}
+slice.selfTime=selfTime;if(slice.cpuDuration===undefined)return;let cpuSelfTime=slice.cpuDuration;for(let i=0;i<slice.subSlices.length;i++){if(slice.subSlices[i].cpuDuration!==undefined){cpuSelfTime-=slice.subSlices[i].cpuDuration;}}
+slice.cpuSelfTime=cpuSelfTime;});},createSubSlicesImpl_(){const precisionUnit=this.model.intrinsicTimeUnit;function addSliceIfBounds(parent,child){if(parent.bounds(child,precisionUnit)){child.parentSlice=parent;if(parent.subSlices===undefined){parent.subSlices=[];}
+parent.subSlices.push(child);return true;}
+return false;}
+if(!this.slices.length)return;const ops=[];for(let i=0;i<this.slices.length;i++){if(this.slices[i].subSlices){this.slices[i].subSlices.splice(0,this.slices[i].subSlices.length);}
+ops.push(i);}
+const originalSlices=this.slices;ops.sort(function(ix,iy){const x=originalSlices[ix];const y=originalSlices[iy];if(x.start!==y.start){return x.start-y.start;}
+return ix-iy;});const slices=new Array(this.slices.length);for(let i=0;i<ops.length;i++){slices[i]=originalSlices[ops[i]];}
+let rootSlice=slices[0];this.topLevelSlices=[];this.topLevelSlices.push(rootSlice);rootSlice.isTopLevel=true;for(let i=1;i<slices.length;i++){const slice=slices[i];while(rootSlice!==undefined&&(!addSliceIfBounds(rootSlice,slice))){rootSlice=rootSlice.parentSlice;}
+if(rootSlice===undefined){this.topLevelSlices.push(slice);slice.isTopLevel=true;}
+rootSlice=slice;}
+this.slices=slices;},addCpuTimeToSubslices_(timeSlices){const SCHEDULING_STATE=tr.model.SCHEDULING_STATE;let sliceIdx=0;timeSlices.forEach(function(timeSlice){if(timeSlice.schedulingState===SCHEDULING_STATE.RUNNING){while(sliceIdx<this.topLevelSlices.length){if(this.addCpuTimeToSubslice_(this.topLevelSlices[sliceIdx],timeSlice)){sliceIdx++;}else{break;}}}},this);},addCpuTimeToSubslice_(slice,timeSlice){if(slice.start>timeSlice.end||slice.end<timeSlice.start){return slice.end<=timeSlice.end;}
+let duration=timeSlice.duration;if(slice.start>timeSlice.start){duration-=slice.start-timeSlice.start;}
+if(timeSlice.end>slice.end){duration-=timeSlice.end-slice.end;}
+if(slice.cpuDuration){slice.cpuDuration+=duration;}else{slice.cpuDuration=duration;}
+for(let i=0;i<slice.subSlices.length;i++){this.addCpuTimeToSubslice_(slice.subSlices[i],timeSlice);}
+return slice.end<=timeSlice.end;}};SliceGroup.merge=function(groupA,groupB){if(groupA.openPartialSlices_.length>0){throw new Error('groupA has open partial slices');}
+if(groupB.openPartialSlices_.length>0){throw new Error('groupB has open partial slices');}
+if(groupA.parentContainer!==groupB.parentContainer){throw new Error('Different parent threads. Cannot merge');}
+if(groupA.sliceConstructor!==groupB.sliceConstructor){throw new Error('Different slice constructors. Cannot merge');}
+const result=new SliceGroup(groupA.parentContainer,groupA.sliceConstructor,groupA.name_);const slicesA=groupA.slices;const slicesB=groupB.slices;let idxA=0;let idxB=0;const openA=[];const openB=[];const splitOpenSlices=function(when){for(let i=0;i<openB.length;i++){const oldSlice=openB[i];const oldEnd=oldSlice.end;if(when<oldSlice.start||oldEnd<when){throw new Error('slice should not be split');}
+const newSlice=result.copySlice(oldSlice);newSlice.start=when;newSlice.duration=oldEnd-when;if(newSlice.title.indexOf(' (cont.)')===-1){newSlice.title+=' (cont.)';}
+oldSlice.duration=when-oldSlice.start;openB[i]=newSlice;result.pushSlice(newSlice);}};const closeOpenSlices=function(upTo){while(openA.length>0||openB.length>0){const nextA=openA[openA.length-1];const nextB=openB[openB.length-1];const endA=nextA&&nextA.end;const endB=nextB&&nextB.end;if((endA===undefined||endA>upTo)&&(endB===undefined||endB>upTo)){return;}
+if(endB===undefined||endA<endB){splitOpenSlices(endA);openA.pop();}else{openB.pop();}}};while(idxA<slicesA.length||idxB<slicesB.length){const sA=slicesA[idxA];const sB=slicesB[idxB];let nextSlice;let isFromB;if(sA===undefined||(sB!==undefined&&sA.start>sB.start)){nextSlice=result.copySlice(sB);isFromB=true;idxB++;}else{nextSlice=result.copySlice(sA);isFromB=false;idxA++;}
+closeOpenSlices(nextSlice.start);result.pushSlice(nextSlice);if(isFromB){openB.push(nextSlice);}else{splitOpenSlices(nextSlice.start);openA.push(nextSlice);}}
+closeOpenSlices();return result;};return{SliceGroup,};});'use strict';tr.exportTo('tr.model',function(){const AsyncSlice=tr.model.AsyncSlice;const AsyncSliceGroup=tr.model.AsyncSliceGroup;const SliceGroup=tr.model.SliceGroup;const ThreadSlice=tr.model.ThreadSlice;const ThreadTimeSlice=tr.model.ThreadTimeSlice;function Thread(parent,tid){if(!parent){throw new Error('Parent must be provided.');}
+tr.model.EventContainer.call(this);this.parent=parent;this.sortIndex=0;this.tid=tid;this.name=undefined;this.samples_=undefined;this.sliceGroup=new SliceGroup(this,ThreadSlice,'slices');this.timeSlices=undefined;this.kernelSliceGroup=new SliceGroup(this,ThreadSlice,'kernel-slices');this.asyncSliceGroup=new AsyncSliceGroup(this,'async-slices');}
+Thread.prototype={__proto__:tr.model.EventContainer.prototype,get model(){return this.parent.model;},get stableId(){return this.parent.stableId+'.'+this.tid;},compareTo(that){return Thread.compare(this,that);},*childEventContainers(){if(this.sliceGroup.length){yield this.sliceGroup;}
+if(this.kernelSliceGroup.length){yield this.kernelSliceGroup;}
+if(this.asyncSliceGroup.length){yield this.asyncSliceGroup;}},*childEvents(){if(this.timeSlices){yield*this.timeSlices;}},iterateAllPersistableObjects(cb){cb(this);if(this.sliceGroup.length){cb(this.sliceGroup);}
+this.asyncSliceGroup.viewSubGroups.forEach(cb);},shiftTimestampsForward(amount){this.sliceGroup.shiftTimestampsForward(amount);if(this.timeSlices){for(let i=0;i<this.timeSlices.length;i++){const slice=this.timeSlices[i];slice.start+=amount;}}
+this.kernelSliceGroup.shiftTimestampsForward(amount);this.asyncSliceGroup.shiftTimestampsForward(amount);},get isEmpty(){if(this.sliceGroup.length)return false;if(this.sliceGroup.openSliceCount)return false;if(this.timeSlices&&this.timeSlices.length)return false;if(this.kernelSliceGroup.length)return false;if(this.asyncSliceGroup.length)return false;if(this.samples_.length)return false;return true;},updateBounds(){this.bounds.reset();this.sliceGroup.updateBounds();this.bounds.addRange(this.sliceGroup.bounds);this.kernelSliceGroup.updateBounds();this.bounds.addRange(this.kernelSliceGroup.bounds);this.asyncSliceGroup.updateBounds();this.bounds.addRange(this.asyncSliceGroup.bounds);if(this.timeSlices&&this.timeSlices.length){this.bounds.addValue(this.timeSlices[0].start);this.bounds.addValue(this.timeSlices[this.timeSlices.length-1].end);}
+if(this.samples_&&this.samples_.length){this.bounds.addValue(this.samples_[0].start);this.bounds.addValue(this.samples_[this.samples_.length-1].end);}},addCategoriesToDict(categoriesDict){for(let i=0;i<this.sliceGroup.length;i++){categoriesDict[this.sliceGroup.slices[i].category]=true;}
+for(let i=0;i<this.kernelSliceGroup.length;i++){categoriesDict[this.kernelSliceGroup.slices[i].category]=true;}
+for(let i=0;i<this.asyncSliceGroup.length;i++){categoriesDict[this.asyncSliceGroup.slices[i].category]=true;}
+if(this.samples_){for(let i=0;i<this.samples_.length;i++){categoriesDict[this.samples_[i].category]=true;}}},autoCloseOpenSlices(){this.sliceGroup.autoCloseOpenSlices();this.kernelSliceGroup.autoCloseOpenSlices();},mergeKernelWithUserland(){if(this.kernelSliceGroup.length>0){const newSlices=SliceGroup.merge(this.sliceGroup,this.kernelSliceGroup);this.sliceGroup.slices=newSlices.slices;this.kernelSliceGroup=new SliceGroup(this);this.updateBounds();}},createSubSlices(){this.sliceGroup.createSubSlices();this.samples_=this.parent.model.samples.filter(sample=>sample.thread===this);},get userFriendlyName(){return this.name||this.tid;},get userFriendlyDetails(){return'tid: '+this.tid+
+(this.name?', name: '+this.name:'');},getSettingsKey(){if(!this.name)return undefined;const parentKey=this.parent.getSettingsKey();if(!parentKey)return undefined;return parentKey+'.'+this.name;},getProcess(){return this.parent;},indexOfTimeSlice(timeSlice){const i=tr.b.math.findLowIndexInSortedArray(this.timeSlices,function(slice){return slice.start;},timeSlice.start);if(this.timeSlices[i]!==timeSlice)return undefined;return i;},getCpuStatsForRange(range){const stats={};stats.total=0;if(!this.timeSlices)return stats;function addStatsForSlice(threadTimeSlice){const freqRange=tr.b.math.Range.fromExplicitRange(threadTimeSlice.start,threadTimeSlice.end);const intersection=freqRange.findIntersection(range);if(threadTimeSlice.schedulingState===tr.model.SCHEDULING_STATE.RUNNING){const cpu=threadTimeSlice.cpuOnWhichThreadWasRunning;if(!(cpu.cpuNumber in stats)){stats[cpu.cpuNumber]=0;}
+stats[cpu.cpuNumber]+=intersection.duration;stats.total+=intersection.duration;}}
+tr.b.math.iterateOverIntersectingIntervals(this.timeSlices,function(x){return x.start;},function(x){return x.end;},range.min,range.max,addStatsForSlice);return stats;},getSchedulingStatsForRange(start,end){const stats={};if(!this.timeSlices)return stats;function addStatsForSlice(threadTimeSlice){const overlapStart=Math.max(threadTimeSlice.start,start);const overlapEnd=Math.min(threadTimeSlice.end,end);const schedulingState=threadTimeSlice.schedulingState;if(!(schedulingState in stats))stats[schedulingState]=0;stats[schedulingState]+=overlapEnd-overlapStart;}
+tr.b.math.iterateOverIntersectingIntervals(this.timeSlices,function(x){return x.start;},function(x){return x.end;},start,end,addStatsForSlice);return stats;},get samples(){return this.samples_;},get type(){const re=/^[^0-9|\/]+/;const matches=re.exec(this.name);if(matches&&matches[0])return matches[0];throw new Error('Could not determine thread type for thread name '+
+this.name);}};Thread.compare=function(x,y){let tmp=x.parent.compareTo(y.parent);if(tmp)return tmp;tmp=x.sortIndex-y.sortIndex;if(tmp)return tmp;tmp=tr.b.comparePossiblyUndefinedValues(x.name,y.name,function(x,y){return x.localeCompare(y);});if(tmp)return tmp;return x.tid-y.tid;};return{Thread,};});'use strict';tr.exportTo('tr.model',function(){const Thread=tr.model.Thread;const Counter=tr.model.Counter;function ProcessBase(model){if(!model){throw new Error('Must provide a model');}
+tr.model.EventContainer.call(this);this.model=model;this.threads={};this.counters={};this.objects=new tr.model.ObjectCollection(this);this.sortIndex=0;}
+ProcessBase.compare=function(x,y){return x.sortIndex-y.sortIndex;};ProcessBase.prototype={__proto__:tr.model.EventContainer.prototype,get stableId(){throw new Error('Not implemented');},*childEventContainers(){yield*Object.values(this.threads);yield*Object.values(this.counters);yield this.objects;},iterateAllPersistableObjects(cb){cb(this);for(const tid in this.threads){this.threads[tid].iterateAllPersistableObjects(cb);}},get numThreads(){let n=0;for(const p in this.threads){n++;}
+return n;},shiftTimestampsForward(amount){for(const child of this.childEventContainers()){child.shiftTimestampsForward(amount);}},autoCloseOpenSlices(){for(const tid in this.threads){const thread=this.threads[tid];thread.autoCloseOpenSlices();}},autoDeleteObjects(maxTimestamp){this.objects.autoDeleteObjects(maxTimestamp);},preInitializeObjects(){this.objects.preInitializeAllObjects();},initializeObjects(){this.objects.initializeAllObjects();},mergeKernelWithUserland(){for(const tid in this.threads){const thread=this.threads[tid];thread.mergeKernelWithUserland();}},updateBounds(){this.bounds.reset();for(const tid in this.threads){this.threads[tid].updateBounds();this.bounds.addRange(this.threads[tid].bounds);}
+for(const id in this.counters){this.counters[id].updateBounds();this.bounds.addRange(this.counters[id].bounds);}
+this.objects.updateBounds();this.bounds.addRange(this.objects.bounds);},addCategoriesToDict(categoriesDict){for(const tid in this.threads){this.threads[tid].addCategoriesToDict(categoriesDict);}
+for(const id in this.counters){categoriesDict[this.counters[id].category]=true;}
+this.objects.addCategoriesToDict(categoriesDict);},findAllThreadsMatching(predicate,opt_this){const threads=[];for(const tid in this.threads){const thread=this.threads[tid];if(predicate.call(opt_this,thread)){threads.push(thread);}}
+return threads;},findAllThreadsNamed(name){const threads=this.findAllThreadsMatching(function(thread){if(!thread.name)return false;return thread.name===name;});return threads;},findAtMostOneThreadNamed(name){const threads=this.findAllThreadsNamed(name);if(threads.length===0)return undefined;if(threads.length>1){throw new Error('Expected no more than one '+name);}
+return threads[0];},pruneEmptyContainers(){const threadsToKeep={};for(const tid in this.threads){const thread=this.threads[tid];if(!thread.isEmpty){threadsToKeep[tid]=thread;}}
+this.threads=threadsToKeep;},getThread(tid){return this.threads[tid];},getOrCreateThread(tid){if(!this.threads[tid]){this.threads[tid]=new Thread(this,tid);}
+return this.threads[tid];},getOrCreateCounter(cat,name){const id=cat+'.'+name;if(!this.counters[id]){this.counters[id]=new Counter(this,id,cat,name);}
+return this.counters[id];},getSettingsKey(){throw new Error('Not implemented');},createSubSlices(){for(const tid in this.threads){this.threads[tid].createSubSlices();}}};return{ProcessBase,};});'use strict';tr.exportTo('tr.model',function(){const ColorScheme=tr.b.ColorScheme;const Counter=tr.model.Counter;const CpuSlice=tr.model.CpuSlice;function Cpu(kernel,number){if(kernel===undefined||number===undefined){throw new Error('Missing arguments');}
+this.kernel=kernel;this.cpuNumber=number;this.slices=[];this.counters={};this.bounds_=new tr.b.math.Range();this.samples_=undefined;this.lastActiveTimestamp_=undefined;this.lastActiveThread_=undefined;this.lastActiveName_=undefined;this.lastActiveArgs_=undefined;}
+Cpu.prototype={__proto__:tr.model.EventContainer.prototype,get samples(){return this.samples_;},get userFriendlyName(){return'CPU '+this.cpuNumber;},*findTopmostSlicesInThisContainer(eventPredicate,opt_this){for(const s of this.slices){yield*s.findTopmostSlicesRelativeToThisSlice(eventPredicate,opt_this);}},*childEvents(){yield*this.slices;if(this.samples_){yield*this.samples_;}},*childEventContainers(){yield*Object.values(this.counters);},getOrCreateCounter(cat,name){const id=cat+'.'+name;if(!this.counters[id]){this.counters[id]=new Counter(this,id,cat,name);}
+return this.counters[id];},getCounter(cat,name){const id=cat+'.'+name;if(!this.counters[id]){return undefined;}
+return this.counters[id];},shiftTimestampsForward(amount){for(let sI=0;sI<this.slices.length;sI++){this.slices[sI].start=(this.slices[sI].start+amount);}
+for(const id in this.counters){this.counters[id].shiftTimestampsForward(amount);}},updateBounds(){this.bounds_.reset();if(this.slices.length){this.bounds_.addValue(this.slices[0].start);this.bounds_.addValue(this.slices[this.slices.length-1].end);}
+for(const id in this.counters){this.counters[id].updateBounds();this.bounds_.addRange(this.counters[id].bounds);}
+if(this.samples_&&this.samples_.length){this.bounds_.addValue(this.samples_[0].start);this.bounds_.addValue(this.samples_[this.samples_.length-1].end);}},createSubSlices(){this.samples_=this.kernel.model.samples.filter(function(sample){return sample.cpu===this;},this);},addCategoriesToDict(categoriesDict){for(let i=0;i<this.slices.length;i++){categoriesDict[this.slices[i].category]=true;}
+for(const id in this.counters){categoriesDict[this.counters[id].category]=true;}
+for(let i=0;i<this.samples_.length;i++){categoriesDict[this.samples_[i].category]=true;}},indexOf(cpuSlice){const i=tr.b.math.findLowIndexInSortedArray(this.slices,function(slice){return slice.start;},cpuSlice.start);if(this.slices[i]!==cpuSlice)return undefined;return i;},closeActiveThread(endTimestamp,args){if(this.lastActiveThread_===undefined||this.lastActiveThread_===0){return;}
+if(endTimestamp<this.lastActiveTimestamp_){throw new Error('The end timestamp of a thread running on CPU '+
+this.cpuNumber+' is before its start timestamp.');}
+for(const key in args){this.lastActiveArgs_[key]=args[key];}
+const duration=endTimestamp-this.lastActiveTimestamp_;const slice=new tr.model.CpuSlice('',this.lastActiveName_,ColorScheme.getColorIdForGeneralPurposeString(this.lastActiveName_),this.lastActiveTimestamp_,this.lastActiveArgs_,duration);slice.cpu=this;this.slices.push(slice);this.lastActiveTimestamp_=undefined;this.lastActiveThread_=undefined;this.lastActiveName_=undefined;this.lastActiveArgs_=undefined;},switchActiveThread(timestamp,oldThreadArgs,newThreadId,newThreadName,newThreadArgs){this.closeActiveThread(timestamp,oldThreadArgs);this.lastActiveTimestamp_=timestamp;this.lastActiveThread_=newThreadId;this.lastActiveName_=newThreadName;this.lastActiveArgs_=newThreadArgs;},getFreqStatsForRange(range){const stats={};function addStatsForFreq(freqSample,index){const freqEnd=(index<freqSample.series_.length-1)?freqSample.series_.samples_[index+1].timestamp:range.max;const freqRange=tr.b.math.Range.fromExplicitRange(freqSample.timestamp,freqEnd);const intersection=freqRange.findIntersection(range);if(!(freqSample.value in stats)){stats[freqSample.value]=0;}
+stats[freqSample.value]+=intersection.duration;}
+const freqCounter=this.getCounter('','Clock Frequency');if(freqCounter!==undefined){const freqSeries=freqCounter.getSeries(0);if(!freqSeries)return;tr.b.math.iterateOverIntersectingIntervals(freqSeries.samples_,function(x){return x.timestamp;},function(x,index){if(index<freqSeries.length-1){return freqSeries.samples_[index+1].timestamp;}
+return range.max;},range.min,range.max,addStatsForFreq);}
+return stats;}};Cpu.compare=function(x,y){return x.cpuNumber-y.cpuNumber;};return{Cpu,};});'use strict';tr.exportTo('tr.model',function(){const Event=tr.model.Event;const EventRegistry=tr.model.EventRegistry;function PowerSample(series,start,powerInW){Event.call(this);this.series_=series;this.start_=parseFloat(start);this.powerInW_=parseFloat(powerInW);}
+PowerSample.prototype={__proto__:Event.prototype,get series(){return this.series_;},get start(){return this.start_;},set start(value){this.start_=value;},get powerInW(){return this.powerInW_;},set powerInW(value){this.powerInW_=value;},addBoundsToRange(range){range.addValue(this.start);}};EventRegistry.register(PowerSample,{name:'powerSample',pluralName:'powerSamples'});return{PowerSample,};});'use strict';tr.exportTo('tr.model',function(){const PowerSample=tr.model.PowerSample;function PowerSeries(device){tr.model.EventContainer.call(this);this.device_=device;this.samples_=[];}
+PowerSeries.prototype={__proto__:tr.model.EventContainer.prototype,get device(){return this.device_;},get samples(){return this.samples_;},get stableId(){return this.device_.stableId+'.PowerSeries';},addPowerSample(ts,val){const sample=new PowerSample(this,ts,val);this.samples_.push(sample);return sample;},getEnergyConsumedInJ(start,end){const measurementRange=tr.b.math.Range.fromExplicitRange(start,end);let energyConsumedInJ=0;let startIndex=tr.b.math.findLowIndexInSortedArray(this.samples,x=>x.start,start)-1;const endIndex=tr.b.math.findLowIndexInSortedArray(this.samples,x=>x.start,end);if(startIndex<0){startIndex=0;}
+for(let i=startIndex;i<endIndex;i++){const sample=this.samples[i];const nextSample=this.samples[i+1];const sampleRange=new tr.b.math.Range();sampleRange.addValue(sample.start);sampleRange.addValue(nextSample?nextSample.start:sample.start);const intersectionRangeInMs=measurementRange.findIntersection(sampleRange);const durationInS=tr.b.convertUnit(intersectionRangeInMs.duration,tr.b.UnitPrefixScale.METRIC.MILLI,tr.b.UnitPrefixScale.METRIC.NONE);energyConsumedInJ+=durationInS*sample.powerInW;}
+return energyConsumedInJ;},getSamplesWithinRange(start,end){const startIndex=tr.b.math.findLowIndexInSortedArray(this.samples,x=>x.start,start);const endIndex=tr.b.math.findLowIndexInSortedArray(this.samples,x=>x.start,end);return this.samples.slice(startIndex,endIndex);},shiftTimestampsForward(amount){for(let i=0;i<this.samples_.length;++i){this.samples_[i].start+=amount;}},updateBounds(){this.bounds.reset();if(this.samples_.length===0)return;this.bounds.addValue(this.samples_[0].start);this.bounds.addValue(this.samples_[this.samples_.length-1].start);},*childEvents(){yield*this.samples_;},};return{PowerSeries,};});'use strict';tr.exportTo('tr.model',function(){function Device(model){if(!model){throw new Error('Must provide a model.');}
+tr.model.EventContainer.call(this);this.powerSeries_=undefined;this.cpuUsageSeries_=undefined;this.vSyncTimestamps_=[];}
+Device.compare=function(x,y){return x.guid-y.guid;};Device.prototype={__proto__:tr.model.EventContainer.prototype,compareTo(that){return Device.compare(this,that);},get userFriendlyName(){return'Device';},get userFriendlyDetails(){return'Device';},get stableId(){return'Device';},getSettingsKey(){return'device';},get powerSeries(){return this.powerSeries_;},set powerSeries(powerSeries){this.powerSeries_=powerSeries;},get cpuUsageSeries(){return this.cpuUsageSeries_;},set cpuUsageSeries(cpuUsageSeries){this.cpuUsageSeries_=cpuUsageSeries;},get vSyncTimestamps(){return this.vSyncTimestamps_;},set vSyncTimestamps(value){this.vSyncTimestamps_=value;},updateBounds(){this.bounds.reset();for(const child of this.childEventContainers()){child.updateBounds();this.bounds.addRange(child.bounds);}},shiftTimestampsForward(amount){for(const child of this.childEventContainers()){child.shiftTimestampsForward(amount);}
+for(let i=0;i<this.vSyncTimestamps_.length;i++){this.vSyncTimestamps_[i]+=amount;}},addCategoriesToDict(categoriesDict){},*childEventContainers(){if(this.powerSeries_){yield this.powerSeries_;}
+if(this.cpuUsageSeries_){yield this.cpuUsageSeries_;}}};return{Device,};});'use strict';tr.exportTo('tr.model',function(){function FlowEvent(category,id,title,colorId,start,args,opt_duration){tr.model.TimedEvent.call(this,start);this.category=category||'';this.title=title;this.colorId=colorId;this.start=start;this.args=args;this.id=id;this.startSlice=undefined;this.endSlice=undefined;this.startStackFrame=undefined;this.endStackFrame=undefined;if(opt_duration!==undefined){this.duration=opt_duration;}}
+FlowEvent.prototype={__proto__:tr.model.TimedEvent.prototype,get userFriendlyName(){return'Flow event named '+this.title+' at '+
+tr.b.Unit.byName.timeStampInMs.format(this.timestamp);}};tr.model.EventRegistry.register(FlowEvent,{name:'flowEvent',pluralName:'flowEvents'});return{FlowEvent,};});'use strict';tr.exportTo('tr.model',function(){function ContainerMemoryDump(start){tr.model.TimedEvent.call(this,start);this.levelOfDetail=undefined;this.memoryAllocatorDumps_=undefined;this.memoryAllocatorDumpsByFullName_=undefined;}
+ContainerMemoryDump.LevelOfDetail={BACKGROUND:0,LIGHT:1,DETAILED:2};ContainerMemoryDump.prototype={__proto__:tr.model.TimedEvent.prototype,shiftTimestampsForward(amount){this.start+=amount;},get memoryAllocatorDumps(){return this.memoryAllocatorDumps_;},set memoryAllocatorDumps(memoryAllocatorDumps){this.memoryAllocatorDumps_=memoryAllocatorDumps;this.forceRebuildingMemoryAllocatorDumpByFullNameIndex();},getMemoryAllocatorDumpByFullName(fullName){if(this.memoryAllocatorDumps_===undefined)return undefined;if(this.memoryAllocatorDumpsByFullName_===undefined){const index={};function addDumpsToIndex(dumps){dumps.forEach(function(dump){index[dump.fullName]=dump;addDumpsToIndex(dump.children);});}
+addDumpsToIndex(this.memoryAllocatorDumps_);this.memoryAllocatorDumpsByFullName_=index;}
+return this.memoryAllocatorDumpsByFullName_[fullName];},forceRebuildingMemoryAllocatorDumpByFullNameIndex(){this.memoryAllocatorDumpsByFullName_=undefined;},iterateRootAllocatorDumps(fn,opt_this){if(this.memoryAllocatorDumps===undefined)return;this.memoryAllocatorDumps.forEach(fn,opt_this||this);}};return{ContainerMemoryDump,};});'use strict';tr.exportTo('tr.model',function(){function MemoryAllocatorDump(containerMemoryDump,fullName,opt_guid){this.fullName=fullName;this.parent=undefined;this.children=[];this.numerics={};this.diagnostics={};this.containerMemoryDump=containerMemoryDump;this.owns=undefined;this.ownedBy=[];this.ownedBySiblingSizes=new Map();this.retains=[];this.retainedBy=[];this.weak=false;this.infos=[];this.guid=opt_guid;}
+MemoryAllocatorDump.SIZE_NUMERIC_NAME='size';MemoryAllocatorDump.EFFECTIVE_SIZE_NUMERIC_NAME='effective_size';MemoryAllocatorDump.RESIDENT_SIZE_NUMERIC_NAME='resident_size';MemoryAllocatorDump.DISPLAYED_SIZE_NUMERIC_NAME=MemoryAllocatorDump.EFFECTIVE_SIZE_NUMERIC_NAME;MemoryAllocatorDump.prototype={get name(){return this.fullName.substring(this.fullName.lastIndexOf('/')+1);},get quantifiedName(){return'\''+this.fullName+'\' in '+
+this.containerMemoryDump.containerName;},getDescendantDumpByFullName(fullName){return this.containerMemoryDump.getMemoryAllocatorDumpByFullName(this.fullName+'/'+fullName);},isDescendantOf(otherDump){if(this===otherDump)return true;if(this.parent===undefined)return false;return this.parent.isDescendantOf(otherDump);},addNumeric(name,numeric){if(!(numeric instanceof tr.b.Scalar)){throw new Error('Numeric value must be an instance of Scalar.');}
+if(name in this.numerics){throw new Error('Duplicate numeric name: '+name+'.');}
+this.numerics[name]=numeric;},addDiagnostic(name,text){if(typeof text!=='string'){throw new Error('Diagnostic text must be a string.');}
+if(name in this.diagnostics){throw new Error('Duplicate diagnostic name: '+name+'.');}
+this.diagnostics[name]=text;},aggregateNumericsRecursively(opt_model){const numericNames=new Set();this.children.forEach(function(child){child.aggregateNumericsRecursively(opt_model);for(const[item,value]of Object.entries(child.numerics)){numericNames.add(item,value);}},this);numericNames.forEach(function(numericName){if(numericName===MemoryAllocatorDump.SIZE_NUMERIC_NAME||numericName===MemoryAllocatorDump.EFFECTIVE_SIZE_NUMERIC_NAME||this.numerics[numericName]!==undefined){return;}
+this.numerics[numericName]=MemoryAllocatorDump.aggregateNumerics(this.children.map(function(child){return child.numerics[numericName];}),opt_model);},this);}};MemoryAllocatorDump.aggregateNumerics=function(numerics,opt_model){let shouldLogWarning=!!opt_model;let aggregatedUnit=undefined;let aggregatedValue=0;numerics.forEach(function(numeric){if(numeric===undefined)return;const unit=numeric.unit;if(aggregatedUnit===undefined){aggregatedUnit=unit;}else if(aggregatedUnit!==unit){if(shouldLogWarning){opt_model.importWarning({type:'numeric_parse_error',message:'Multiple units provided for numeric: \''+
+aggregatedUnit.unitName+'\' and \''+unit.unitName+'\'.'});shouldLogWarning=false;}
+aggregatedUnit=tr.b.Unit.byName.unitlessNumber_smallerIsBetter;}
+aggregatedValue+=numeric.value;},this);if(aggregatedUnit===undefined)return undefined;return new tr.b.Scalar(aggregatedUnit,aggregatedValue);};function MemoryAllocatorDumpLink(source,target,opt_importance){this.source=source;this.target=target;this.importance=opt_importance;this.size=undefined;}
+const MemoryAllocatorDumpInfoType={PROVIDED_SIZE_LESS_THAN_AGGREGATED_CHILDREN:0,PROVIDED_SIZE_LESS_THAN_LARGEST_OWNER:1};return{MemoryAllocatorDump,MemoryAllocatorDumpLink,MemoryAllocatorDumpInfoType,};});'use strict';tr.exportTo('tr.model',function(){function GlobalMemoryDump(model,start){tr.model.ContainerMemoryDump.call(this,start);this.model=model;this.processMemoryDumps={};}
+const SIZE_NUMERIC_NAME=tr.model.MemoryAllocatorDump.SIZE_NUMERIC_NAME;const EFFECTIVE_SIZE_NUMERIC_NAME=tr.model.MemoryAllocatorDump.EFFECTIVE_SIZE_NUMERIC_NAME;const MemoryAllocatorDumpInfoType=tr.model.MemoryAllocatorDumpInfoType;const PROVIDED_SIZE_LESS_THAN_AGGREGATED_CHILDREN=MemoryAllocatorDumpInfoType.PROVIDED_SIZE_LESS_THAN_AGGREGATED_CHILDREN;const PROVIDED_SIZE_LESS_THAN_LARGEST_OWNER=MemoryAllocatorDumpInfoType.PROVIDED_SIZE_LESS_THAN_LARGEST_OWNER;function getSize(dump){const numeric=dump.numerics[SIZE_NUMERIC_NAME];if(numeric===undefined)return 0;return numeric.value;}
+function hasSize(dump){return dump.numerics[SIZE_NUMERIC_NAME]!==undefined;}
+function optional(value,defaultValue){if(value===undefined)return defaultValue;return value;}
+GlobalMemoryDump.prototype={__proto__:tr.model.ContainerMemoryDump.prototype,get userFriendlyName(){return'Global memory dump at '+
+tr.b.Unit.byName.timeStampInMs.format(this.start);},get containerName(){return'global space';},finalizeGraph(){this.removeWeakDumps();this.setUpTracingOverheadOwnership();this.aggregateNumerics();this.calculateSizes();this.calculateEffectiveSizes();this.discountTracingOverheadFromVmRegions();this.forceRebuildingMemoryAllocatorDumpByFullNameIndices();},removeWeakDumps(){this.traverseAllocatorDumpsInDepthFirstPreOrder(function(dump){if(dump.weak)return;if((dump.owns!==undefined&&dump.owns.target.weak)||(dump.parent!==undefined&&dump.parent.weak)){dump.weak=true;}});function removeWeakDumpsFromListRecursively(dumps){tr.b.inPlaceFilter(dumps,function(dump){if(dump.weak){return false;}
+removeWeakDumpsFromListRecursively(dump.children);tr.b.inPlaceFilter(dump.ownedBy,function(ownershipLink){return!ownershipLink.source.weak;});return true;});}
+this.iterateContainerDumps(function(containerDump){const memoryAllocatorDumps=containerDump.memoryAllocatorDumps;if(memoryAllocatorDumps!==undefined){removeWeakDumpsFromListRecursively(memoryAllocatorDumps);}});},calculateSizes(){this.traverseAllocatorDumpsInDepthFirstPostOrder(this.calculateMemoryAllocatorDumpSize_.bind(this));},calculateMemoryAllocatorDumpSize_(dump){let shouldDefineSize=false;function getDependencySize(dependencyDump){const numeric=dependencyDump.numerics[SIZE_NUMERIC_NAME];if(numeric===undefined)return 0;shouldDefineSize=true;return numeric.value;}
+const sizeNumeric=dump.numerics[SIZE_NUMERIC_NAME];let size=0;let checkDependencySizeIsConsistent=function(){};if(sizeNumeric!==undefined){size=sizeNumeric.value;shouldDefineSize=true;if(sizeNumeric.unit!==tr.b.Unit.byName.sizeInBytes_smallerIsBetter){this.model.importWarning({type:'memory_dump_parse_error',message:'Invalid unit of \'size\' numeric of memory allocator '+'dump '+dump.quantifiedName+': '+
+sizeNumeric.unit.unitName+'.'});}
+checkDependencySizeIsConsistent=function(dependencySize,dependencyInfoType,dependencyName){if(size>=dependencySize)return;this.model.importWarning({type:'memory_dump_parse_error',message:'Size provided by memory allocator dump \''+
+dump.fullName+'\''+
+tr.b.Unit.byName.sizeInBytes.format(size)+') is less than '+dependencyName+' ('+
+tr.b.Unit.byName.sizeInBytes.format(dependencySize)+').'});dump.infos.push({type:dependencyInfoType,providedSize:size,dependencySize});}.bind(this);}
+let aggregatedChildrenSize=0;const allOverlaps={};dump.children.forEach(function(childDump){function aggregateDescendantDump(descendantDump){const ownedDumpLink=descendantDump.owns;if(ownedDumpLink!==undefined&&ownedDumpLink.target.isDescendantOf(dump)){let ownedChildDump=ownedDumpLink.target;while(ownedChildDump.parent!==dump){ownedChildDump=ownedChildDump.parent;}
+if(childDump!==ownedChildDump){const ownedBySiblingSize=getDependencySize(descendantDump);if(ownedBySiblingSize>0){const previousTotalOwnedBySiblingSize=ownedChildDump.ownedBySiblingSizes.get(childDump)||0;const updatedTotalOwnedBySiblingSize=previousTotalOwnedBySiblingSize+ownedBySiblingSize;ownedChildDump.ownedBySiblingSizes.set(childDump,updatedTotalOwnedBySiblingSize);}}
+return;}
+if(descendantDump.children.length===0){aggregatedChildrenSize+=getDependencySize(descendantDump);return;}
+descendantDump.children.forEach(aggregateDescendantDump);}
+aggregateDescendantDump(childDump);});checkDependencySizeIsConsistent(aggregatedChildrenSize,PROVIDED_SIZE_LESS_THAN_AGGREGATED_CHILDREN,'the aggregated size of its children');let largestOwnerSize=0;dump.ownedBy.forEach(function(ownershipLink){const owner=ownershipLink.source;const ownerSize=getDependencySize(owner);largestOwnerSize=Math.max(largestOwnerSize,ownerSize);});checkDependencySizeIsConsistent(largestOwnerSize,PROVIDED_SIZE_LESS_THAN_LARGEST_OWNER,'the size of its largest owner');if(!shouldDefineSize){delete dump.numerics[SIZE_NUMERIC_NAME];return;}
+size=Math.max(size,aggregatedChildrenSize,largestOwnerSize);dump.numerics[SIZE_NUMERIC_NAME]=new tr.b.Scalar(tr.b.Unit.byName.sizeInBytes_smallerIsBetter,size);if(aggregatedChildrenSize<size&&dump.children!==undefined&&dump.children.length>0){const virtualChild=new tr.model.MemoryAllocatorDump(dump.containerMemoryDump,dump.fullName+'/<unspecified>');virtualChild.parent=dump;dump.children.unshift(virtualChild);virtualChild.numerics[SIZE_NUMERIC_NAME]=new tr.b.Scalar(tr.b.Unit.byName.sizeInBytes_smallerIsBetter,size-aggregatedChildrenSize);}},calculateEffectiveSizes(){this.traverseAllocatorDumpsInDepthFirstPostOrder(this.calculateDumpSubSizes_.bind(this));this.traverseAllocatorDumpsInDepthFirstPostOrder(this.calculateDumpOwnershipCoefficient_.bind(this));this.traverseAllocatorDumpsInDepthFirstPreOrder(this.calculateDumpCumulativeOwnershipCoefficient_.bind(this));this.traverseAllocatorDumpsInDepthFirstPostOrder(this.calculateDumpEffectiveSize_.bind(this));},calculateDumpSubSizes_(dump){if(!hasSize(dump))return;if(dump.children===undefined||dump.children.length===0){const size=getSize(dump);dump.notOwningSubSize_=size;dump.notOwnedSubSize_=size;return;}
+let notOwningSubSize=0;dump.children.forEach(function(childDump){if(childDump.owns!==undefined)return;notOwningSubSize+=optional(childDump.notOwningSubSize_,0);});dump.notOwningSubSize_=notOwningSubSize;let notOwnedSubSize=0;dump.children.forEach(function(childDump){if(childDump.ownedBy.length===0){notOwnedSubSize+=optional(childDump.notOwnedSubSize_,0);return;}
+let largestChildOwnerSize=0;childDump.ownedBy.forEach(function(ownershipLink){largestChildOwnerSize=Math.max(largestChildOwnerSize,getSize(ownershipLink.source));});notOwnedSubSize+=getSize(childDump)-largestChildOwnerSize;});dump.notOwnedSubSize_=notOwnedSubSize;},calculateDumpOwnershipCoefficient_(dump){if(!hasSize(dump))return;if(dump.ownedBy.length===0)return;const owners=dump.ownedBy.map(function(ownershipLink){return{dump:ownershipLink.source,importance:optional(ownershipLink.importance,0),notOwningSubSize:optional(ownershipLink.source.notOwningSubSize_,0)};});owners.sort(function(a,b){if(a.importance===b.importance){return a.notOwningSubSize-b.notOwningSubSize;}
+return b.importance-a.importance;});let currentImportanceStartPos=0;let alreadyAttributedSubSize=0;while(currentImportanceStartPos<owners.length){const currentImportance=owners[currentImportanceStartPos].importance;let nextImportanceStartPos=currentImportanceStartPos+1;while(nextImportanceStartPos<owners.length&&owners[nextImportanceStartPos].importance===currentImportance){nextImportanceStartPos++;}
+let attributedNotOwningSubSize=0;for(let pos=currentImportanceStartPos;pos<nextImportanceStartPos;pos++){const owner=owners[pos];const notOwningSubSize=owner.notOwningSubSize;if(notOwningSubSize>alreadyAttributedSubSize){attributedNotOwningSubSize+=(notOwningSubSize-alreadyAttributedSubSize)/(nextImportanceStartPos-pos);alreadyAttributedSubSize=notOwningSubSize;}
+let owningCoefficient=0;if(notOwningSubSize!==0){owningCoefficient=attributedNotOwningSubSize/notOwningSubSize;}
+owner.dump.owningCoefficient_=owningCoefficient;}
+currentImportanceStartPos=nextImportanceStartPos;}
+const notOwnedSubSize=optional(dump.notOwnedSubSize_,0);const remainderSubSize=notOwnedSubSize-alreadyAttributedSubSize;let ownedCoefficient=0;if(notOwnedSubSize!==0){ownedCoefficient=remainderSubSize/notOwnedSubSize;}
+dump.ownedCoefficient_=ownedCoefficient;},calculateDumpCumulativeOwnershipCoefficient_(dump){if(!hasSize(dump))return;let cumulativeOwnedCoefficient=optional(dump.ownedCoefficient_,1);const parent=dump.parent;if(dump.parent!==undefined){cumulativeOwnedCoefficient*=dump.parent.cumulativeOwnedCoefficient_;}
+dump.cumulativeOwnedCoefficient_=cumulativeOwnedCoefficient;let cumulativeOwningCoefficient;if(dump.owns!==undefined){cumulativeOwningCoefficient=dump.owningCoefficient_*dump.owns.target.cumulativeOwningCoefficient_;}else if(dump.parent!==undefined){cumulativeOwningCoefficient=dump.parent.cumulativeOwningCoefficient_;}else{cumulativeOwningCoefficient=1;}
+dump.cumulativeOwningCoefficient_=cumulativeOwningCoefficient;},calculateDumpEffectiveSize_(dump){if(!hasSize(dump)){delete dump.numerics[EFFECTIVE_SIZE_NUMERIC_NAME];return;}
+let effectiveSize;if(dump.children===undefined||dump.children.length===0){effectiveSize=getSize(dump)*dump.cumulativeOwningCoefficient_*dump.cumulativeOwnedCoefficient_;}else{effectiveSize=0;dump.children.forEach(function(childDump){if(!hasSize(childDump))return;effectiveSize+=childDump.numerics[EFFECTIVE_SIZE_NUMERIC_NAME].value;});}
+dump.numerics[EFFECTIVE_SIZE_NUMERIC_NAME]=new tr.b.Scalar(tr.b.Unit.byName.sizeInBytes_smallerIsBetter,effectiveSize);},aggregateNumerics(){this.iterateRootAllocatorDumps(function(dump){dump.aggregateNumericsRecursively(this.model);});this.iterateRootAllocatorDumps(this.propagateNumericsAndDiagnosticsRecursively);for(const processMemoryDump of Object.values(this.processMemoryDumps)){processMemoryDump.iterateRootAllocatorDumps(function(dump){dump.aggregateNumericsRecursively(this.model);},this);}},propagateNumericsAndDiagnosticsRecursively(globalAllocatorDump){['numerics','diagnostics'].forEach(function(field){for(const[name,value]of
+Object.entries(globalAllocatorDump[field])){globalAllocatorDump.ownedBy.forEach(function(ownershipLink){const processAllocatorDump=ownershipLink.source;if(processAllocatorDump[field][name]!==undefined){return;}
+processAllocatorDump[field][name]=value;});}});globalAllocatorDump.children.forEach(this.propagateNumericsAndDiagnosticsRecursively,this);},setUpTracingOverheadOwnership(){for(const dump of Object.values(this.processMemoryDumps)){dump.setUpTracingOverheadOwnership(this.model);}},discountTracingOverheadFromVmRegions(){for(const dump of Object.values(this.processMemoryDumps)){dump.discountTracingOverheadFromVmRegions(this.model);}},forceRebuildingMemoryAllocatorDumpByFullNameIndices(){this.iterateContainerDumps(function(containerDump){containerDump.forceRebuildingMemoryAllocatorDumpByFullNameIndex();});},iterateContainerDumps(fn){fn.call(this,this);for(const processDump of Object.values(this.processMemoryDumps)){fn.call(this,processDump);}},iterateAllRootAllocatorDumps(fn){this.iterateContainerDumps(function(containerDump){containerDump.iterateRootAllocatorDumps(fn,this);});},traverseAllocatorDumpsInDepthFirstPostOrder(fn){const visitedDumps=new WeakSet();const openDumps=new WeakSet();function visit(dump){if(visitedDumps.has(dump))return;if(openDumps.has(dump)){throw new Error(dump.userFriendlyName+' contains a cycle');}
+openDumps.add(dump);dump.ownedBy.forEach(function(ownershipLink){visit.call(this,ownershipLink.source);},this);dump.children.forEach(visit,this);fn.call(this,dump);visitedDumps.add(dump);openDumps.delete(dump);}
+this.iterateAllRootAllocatorDumps(visit);},traverseAllocatorDumpsInDepthFirstPreOrder(fn){const visitedDumps=new WeakSet();function visit(dump){if(visitedDumps.has(dump))return;if(dump.owns!==undefined&&!visitedDumps.has(dump.owns.target)){return;}
+if(dump.parent!==undefined&&!visitedDumps.has(dump.parent)){return;}
+fn.call(this,dump);visitedDumps.add(dump);dump.ownedBy.forEach(function(ownershipLink){visit.call(this,ownershipLink.source);},this);dump.children.forEach(visit,this);}
+this.iterateAllRootAllocatorDumps(visit);}};tr.model.EventRegistry.register(GlobalMemoryDump,{name:'globalMemoryDump',pluralName:'globalMemoryDumps'});return{GlobalMemoryDump,};});'use strict';tr.exportTo('tr.model',function(){const InstantEventType={GLOBAL:1,PROCESS:2};function InstantEvent(category,title,colorId,start,args){tr.model.TimedEvent.call(this,start);this.category=category||'';this.title=title;this.colorId=colorId;this.args=args;this.type=undefined;}
+InstantEvent.prototype={__proto__:tr.model.TimedEvent.prototype};function GlobalInstantEvent(category,title,colorId,start,args){InstantEvent.apply(this,arguments);this.type=InstantEventType.GLOBAL;}
+GlobalInstantEvent.prototype={__proto__:InstantEvent.prototype,get userFriendlyName(){return'Global instant event '+this.title+' @ '+
+tr.b.Unit.byName.timeStampInMs.format(start);}};function ProcessInstantEvent(category,title,colorId,start,args){InstantEvent.apply(this,arguments);this.type=InstantEventType.PROCESS;}
+ProcessInstantEvent.prototype={__proto__:InstantEvent.prototype,get userFriendlyName(){return'Process-level instant event '+this.title+' @ '+
+tr.b.Unit.byName.timeStampInMs.format(start);}};tr.model.EventRegistry.register(InstantEvent,{name:'instantEvent',pluralName:'instantEvents'});return{GlobalInstantEvent,ProcessInstantEvent,InstantEventType,InstantEvent,};});'use strict';tr.exportTo('tr.model',function(){const Cpu=tr.model.Cpu;const ProcessBase=tr.model.ProcessBase;function Kernel(model){ProcessBase.call(this,model);this.cpus={};this.softwareMeasuredCpuCount_=undefined;}
+Kernel.compare=function(x,y){return 0;};Kernel.prototype={__proto__:ProcessBase.prototype,compareTo(that){return Kernel.compare(this,that);},get userFriendlyName(){return'Kernel';},get userFriendlyDetails(){return'Kernel';},get stableId(){return'Kernel';},getOrCreateCpu(cpuNumber){if(!this.cpus[cpuNumber]){this.cpus[cpuNumber]=new Cpu(this,cpuNumber);}
+return this.cpus[cpuNumber];},get softwareMeasuredCpuCount(){return this.softwareMeasuredCpuCount_;},set softwareMeasuredCpuCount(softwareMeasuredCpuCount){if(this.softwareMeasuredCpuCount_!==undefined&&this.softwareMeasuredCpuCount_!==softwareMeasuredCpuCount){throw new Error('Cannot change the softwareMeasuredCpuCount once it is set');}
+this.softwareMeasuredCpuCount_=softwareMeasuredCpuCount;},get bestGuessAtCpuCount(){const realCpuCount=Object.keys(this.cpus).length;if(realCpuCount!==0){return realCpuCount;}
+return this.softwareMeasuredCpuCount;},updateBounds(){ProcessBase.prototype.updateBounds.call(this);for(const cpuNumber in this.cpus){const cpu=this.cpus[cpuNumber];cpu.updateBounds();this.bounds.addRange(cpu.bounds);}},createSubSlices(){ProcessBase.prototype.createSubSlices.call(this);for(const cpuNumber in this.cpus){const cpu=this.cpus[cpuNumber];cpu.createSubSlices();}},addCategoriesToDict(categoriesDict){ProcessBase.prototype.addCategoriesToDict.call(this,categoriesDict);for(const cpuNumber in this.cpus){this.cpus[cpuNumber].addCategoriesToDict(categoriesDict);}},getSettingsKey(){return'kernel';},*childEventContainers(){yield*ProcessBase.prototype.childEventContainers.call(this);yield*Object.values(this.cpus);},};return{Kernel,};});'use strict';tr.exportTo('tr.model',function(){function ModelIndices(model){this.flowEventsById_={};model.flowEvents.forEach(function(fe){if(fe.id!==undefined){if(!this.flowEventsById_.hasOwnProperty(fe.id)){this.flowEventsById_[fe.id]=[];}
+this.flowEventsById_[fe.id].push(fe);}},this);}
+ModelIndices.prototype={addEventWithId(id,event){if(!this.flowEventsById_.hasOwnProperty(id)){this.flowEventsById_[id]=[];}
+this.flowEventsById_[id].push(event);},getFlowEventsWithId(id){if(!this.flowEventsById_.hasOwnProperty(id)){return[];}
+return this.flowEventsById_[id];}};return{ModelIndices,};});'use strict';tr.exportTo('tr.model',function(){function ModelStats(){this.traceEventCountsByKey_=new Map();this.allTraceEventStats_=[];this.traceEventStatsInTimeIntervals_=new Map();this.allTraceEventStatsInTimeIntervals_=[];this.hasEventSizesinBytes_=false;this.traceImportDurationMs_=undefined;}
+ModelStats.prototype={TIME_INTERVAL_SIZE_IN_MS:100,willProcessBasicTraceEvent(phase,category,title,ts,opt_eventSizeinBytes){const key=phase+'/'+category+'/'+title;let eventStats=this.traceEventCountsByKey_.get(key);if(eventStats===undefined){eventStats={phase,category,title,numEvents:0,totalEventSizeinBytes:0};this.traceEventCountsByKey_.set(key,eventStats);this.allTraceEventStats_.push(eventStats);}
+eventStats.numEvents++;const timeIntervalKey=Math.floor(tr.b.Unit.timestampFromUs(ts)/this.TIME_INTERVAL_SIZE_IN_MS);let eventStatsByTimeInverval=this.traceEventStatsInTimeIntervals_.get(timeIntervalKey);if(eventStatsByTimeInverval===undefined){eventStatsByTimeInverval={timeInterval:timeIntervalKey,numEvents:0,totalEventSizeinBytes:0};this.traceEventStatsInTimeIntervals_.set(timeIntervalKey,eventStatsByTimeInverval);this.allTraceEventStatsInTimeIntervals_.push(eventStatsByTimeInverval);}
+eventStatsByTimeInverval.numEvents++;if(opt_eventSizeinBytes!==undefined){this.hasEventSizesinBytes_=true;eventStats.totalEventSizeinBytes+=opt_eventSizeinBytes;eventStatsByTimeInverval.totalEventSizeinBytes+=opt_eventSizeinBytes;}},get allTraceEventStats(){return this.allTraceEventStats_;},get allTraceEventStatsInTimeIntervals(){return this.allTraceEventStatsInTimeIntervals_;},get hasEventSizesinBytes(){return this.hasEventSizesinBytes_;},get traceImportDurationMs(){return this.traceImportDurationMs_;},set traceImportDurationMs(traceImportDurationMs){this.traceImportDurationMs_=traceImportDurationMs;}};return{ModelStats,};});'use strict';tr.exportTo('tr.model',function(){function VMRegion(startAddress,sizeInBytes,protectionFlags,mappedFile,byteStats){this.startAddress=startAddress;this.sizeInBytes=sizeInBytes;this.protectionFlags=protectionFlags;this.mappedFile=mappedFile||'';this.byteStats=byteStats||{};}
+VMRegion.PROTECTION_FLAG_READ=4;VMRegion.PROTECTION_FLAG_WRITE=2;VMRegion.PROTECTION_FLAG_EXECUTE=1;VMRegion.PROTECTION_FLAG_MAYSHARE=128;VMRegion.prototype={get uniqueIdWithinProcess(){return this.mappedFile+'#'+this.startAddress;},get protectionFlagsToString(){if(this.protectionFlags===undefined)return undefined;return((this.protectionFlags&VMRegion.PROTECTION_FLAG_READ?'r':'-')+
+(this.protectionFlags&VMRegion.PROTECTION_FLAG_WRITE?'w':'-')+
+(this.protectionFlags&VMRegion.PROTECTION_FLAG_EXECUTE?'x':'-')+
+(this.protectionFlags&VMRegion.PROTECTION_FLAG_MAYSHARE?'s':'p'));}};VMRegion.fromDict=function(dict){return new VMRegion(dict.startAddress,dict.sizeInBytes,dict.protectionFlags,dict.mappedFile,dict.byteStats);};function VMRegionClassificationNode(opt_rule){this.rule_=opt_rule||VMRegionClassificationNode.CLASSIFICATION_RULES;this.hasRegions=false;this.sizeInBytes=undefined;this.byteStats={};this.children_=undefined;this.regions_=[];}
+VMRegionClassificationNode.CLASSIFICATION_RULES={name:'Total',children:[{name:'Android',file:/^\/dev\/ashmem(?!\/libc malloc)/,children:[{name:'Java runtime',file:/^\/dev\/ashmem\/dalvik-/,children:[{name:'Spaces',file:/\/dalvik-(alloc|main|large object|non moving|zygote) space/,children:[{name:'Normal',file:/\/dalvik-(alloc|main)/},{name:'Large',file:/\/dalvik-large object/},{name:'Zygote',file:/\/dalvik-zygote/},{name:'Non-moving',file:/\/dalvik-non moving/}]},{name:'Linear Alloc',file:/\/dalvik-LinearAlloc/},{name:'Indirect Reference Table',file:/\/dalvik-indirect.ref/},{name:'Cache',file:/\/dalvik-jit-code-cache/},{name:'Accounting'}]},{name:'Cursor',file:/\/CursorWindow/},{name:'Ashmem'}]},{name:'Native heap',file:/^((\[heap\])|(\[anon:)|(\/dev\/ashmem\/libc malloc)|(\[discounted tracing overhead\])|$)/},{name:'Stack',file:/^\[stack/},{name:'Files',file:/\.((((jar)|(apk)|(ttf)|(odex)|(oat)|(art))$)|(dex)|(so))/,children:[{name:'so',file:/\.so/},{name:'jar',file:/\.jar$/},{name:'apk',file:/\.apk$/},{name:'ttf',file:/\.ttf$/},{name:'dex',file:/\.((dex)|(odex$))/},{name:'oat',file:/\.oat$/},{name:'art',file:/\.art$/}]},{name:'Devices',file:/(^\/dev\/)|(anon_inode:dmabuf)/,children:[{name:'GPU',file:/\/((nv)|(mali)|(kgsl))/},{name:'DMA',file:/anon_inode:dmabuf/}]}]};VMRegionClassificationNode.OTHER_RULE={name:'Other'};VMRegionClassificationNode.fromRegions=function(regions,opt_rules){const tree=new VMRegionClassificationNode(opt_rules);tree.regions_=regions;for(let i=0;i<regions.length;i++){tree.addStatsFromRegion_(regions[i]);}
+return tree;};VMRegionClassificationNode.prototype={get title(){return this.rule_.name;},get children(){if(this.isLeafNode){return undefined;}
+if(this.children_===undefined){this.buildTree_();}
+return this.children_;},get regions(){if(!this.isLeafNode){return undefined;}
+return this.regions_;},get allRegionsForTesting(){if(this.regions_!==undefined){if(this.children_!==undefined){throw new Error('Internal error: a VM region classification node '+'cannot have both regions and children');}
+return this.regions_;}
+let regions=[];this.children_.forEach(function(childNode){regions=regions.concat(childNode.allRegionsForTesting);});return regions;},get isLeafNode(){const children=this.rule_.children;return children===undefined||children.length===0;},addRegion(region){this.addRegionRecursively_(region,true);},someRegion(fn,opt_this){if(this.regions_!==undefined){return this.regions_.some(fn,opt_this);}
+return this.children_.some(function(childNode){return childNode.someRegion(fn,opt_this);});},addRegionRecursively_(region,addStatsToThisNode){if(addStatsToThisNode){this.addStatsFromRegion_(region);}
+if(this.regions_!==undefined){if(this.children_!==undefined){throw new Error('Internal error: a VM region classification node '+'cannot have both regions and children');}
+this.regions_.push(region);return;}
+function regionRowMatchesChildNide(child){const fileRegExp=child.rule_.file;if(fileRegExp===undefined)return true;return fileRegExp.test(region.mappedFile);}
+let matchedChild=tr.b.findFirstInArray(this.children_,regionRowMatchesChildNide);if(matchedChild===undefined){if(this.children_.length!==this.rule_.children.length){throw new Error('Internal error');}
+matchedChild=new VMRegionClassificationNode(VMRegionClassificationNode.OTHER_RULE);this.children_.push(matchedChild);}
+matchedChild.addRegionRecursively_(region,true);},buildTree_(){const cachedRegions=this.regions_;this.regions_=undefined;this.buildChildNodesRecursively_();for(let i=0;i<cachedRegions.length;i++){this.addRegionRecursively_(cachedRegions[i],false);}},buildChildNodesRecursively_(){if(this.children_!==undefined){throw new Error('Internal error: Classification node already has children');}
+if(this.regions_!==undefined&&this.regions_.length!==0){throw new Error('Internal error: Classification node should have no regions');}
+if(this.isLeafNode){return;}
+this.regions_=undefined;this.children_=this.rule_.children.map(function(childRule){const child=new VMRegionClassificationNode(childRule);child.buildChildNodesRecursively_();return child;});},addStatsFromRegion_(region){this.hasRegions=true;const regionSizeInBytes=region.sizeInBytes;if(regionSizeInBytes!==undefined){this.sizeInBytes=(this.sizeInBytes||0)+regionSizeInBytes;}
+const thisByteStats=this.byteStats;const regionByteStats=region.byteStats;for(const byteStatName in regionByteStats){const regionByteStatValue=regionByteStats[byteStatName];if(regionByteStatValue===undefined)continue;thisByteStats[byteStatName]=(thisByteStats[byteStatName]||0)+regionByteStatValue;}}};return{VMRegion,VMRegionClassificationNode,};});'use strict';tr.exportTo('tr.model',function(){const DISCOUNTED_ALLOCATOR_NAMES=['winheap','malloc'];const TRACING_OVERHEAD_PATH=['allocated_objects','tracing_overhead'];const SIZE_NUMERIC_NAME=tr.model.MemoryAllocatorDump.SIZE_NUMERIC_NAME;const RESIDENT_SIZE_NUMERIC_NAME=tr.model.MemoryAllocatorDump.RESIDENT_SIZE_NUMERIC_NAME;function getSizeNumericValue(dump,sizeNumericName){const sizeNumeric=dump.numerics[sizeNumericName];if(sizeNumeric===undefined)return 0;return sizeNumeric.value;}
+function ProcessMemoryDump(globalMemoryDump,process,start){tr.model.ContainerMemoryDump.call(this,start);this.process=process;this.globalMemoryDump=globalMemoryDump;this.totals=undefined;this.vmRegions=undefined;this.heapDumps=undefined;this.tracingOverheadOwnershipSetUp_=false;this.tracingOverheadDiscountedFromVmRegions_=false;}
+ProcessMemoryDump.prototype={__proto__:tr.model.ContainerMemoryDump.prototype,get userFriendlyName(){return'Process memory dump at '+
+tr.b.Unit.byName.timeStampInMs.format(this.start);},get containerName(){return this.process.userFriendlyName;},get processMemoryDumps(){const dumps={};dumps[this.process.pid]=this;return dumps;},get hasOwnVmRegions(){return this.vmRegions!==undefined;},setUpTracingOverheadOwnership(opt_model){if(this.tracingOverheadOwnershipSetUp_)return;this.tracingOverheadOwnershipSetUp_=true;const tracingDump=this.getMemoryAllocatorDumpByFullName('tracing');if(tracingDump===undefined||tracingDump.owns!==undefined){return;}
+if(tracingDump.owns!==undefined)return;const hasDiscountedFromAllocatorDumps=DISCOUNTED_ALLOCATOR_NAMES.some(function(allocatorName){const allocatorDump=this.getMemoryAllocatorDumpByFullName(allocatorName);if(allocatorDump===undefined){return false;}
+let nextPathIndex=0;let currentDump=allocatorDump;let currentFullName=allocatorName;for(;nextPathIndex<TRACING_OVERHEAD_PATH.length;nextPathIndex++){const childFullName=currentFullName+'/'+
+TRACING_OVERHEAD_PATH[nextPathIndex];const childDump=this.getMemoryAllocatorDumpByFullName(childFullName);if(childDump===undefined)break;currentDump=childDump;currentFullName=childFullName;}
+for(;nextPathIndex<TRACING_OVERHEAD_PATH.length;nextPathIndex++){const childFullName=currentFullName+'/'+
+TRACING_OVERHEAD_PATH[nextPathIndex];const childDump=new tr.model.MemoryAllocatorDump(currentDump.containerMemoryDump,childFullName);childDump.parent=currentDump;currentDump.children.push(childDump);currentFullName=childFullName;currentDump=childDump;}
+const ownershipLink=new tr.model.MemoryAllocatorDumpLink(tracingDump,currentDump);tracingDump.owns=ownershipLink;currentDump.ownedBy.push(ownershipLink);return true;},this);if(hasDiscountedFromAllocatorDumps){this.forceRebuildingMemoryAllocatorDumpByFullNameIndex();}},discountTracingOverheadFromVmRegions(opt_model){if(this.tracingOverheadDiscountedFromVmRegions_)return;this.tracingOverheadDiscountedFromVmRegions_=true;const tracingDump=this.getMemoryAllocatorDumpByFullName('tracing');if(tracingDump===undefined)return;const discountedSize=getSizeNumericValue(tracingDump,SIZE_NUMERIC_NAME);const discountedResidentSize=getSizeNumericValue(tracingDump,RESIDENT_SIZE_NUMERIC_NAME);if(discountedSize<=0&&discountedResidentSize<=0)return;if(this.totals!==undefined){if(this.totals.residentBytes!==undefined){this.totals.residentBytes-=discountedResidentSize;}
+if(this.totals.peakResidentBytes!==undefined){this.totals.peakResidentBytes-=discountedResidentSize;}}
+if(this.vmRegions!==undefined){const hasSizeInBytes=this.vmRegions.sizeInBytes!==undefined;const hasPrivateDirtyResident=this.vmRegions.byteStats.privateDirtyResident!==undefined;const hasProportionalResident=this.vmRegions.byteStats.proportionalResident!==undefined;if((hasSizeInBytes&&discountedSize>0)||((hasPrivateDirtyResident||hasProportionalResident)&&discountedResidentSize>0)){const byteStats={};if(hasPrivateDirtyResident){byteStats.privateDirtyResident=-discountedResidentSize;}
+if(hasProportionalResident){byteStats.proportionalResident=-discountedResidentSize;}
+this.vmRegions.addRegion(tr.model.VMRegion.fromDict({mappedFile:'[discounted tracing overhead]',sizeInBytes:hasSizeInBytes?-discountedSize:undefined,byteStats}));}}}};ProcessMemoryDump.hookUpMostRecentVmRegionsLinks=function(processDumps){let mostRecentVmRegions=undefined;processDumps.forEach(function(processDump){if(processDump.vmRegions!==undefined){mostRecentVmRegions=processDump.vmRegions;}
+processDump.mostRecentVmRegions=mostRecentVmRegions;});};tr.model.EventRegistry.register(ProcessMemoryDump,{name:'processMemoryDump',pluralName:'processMemoryDumps'});return{ProcessMemoryDump,};});'use strict';tr.exportTo('tr.model',function(){const ProcessBase=tr.model.ProcessBase;const ProcessInstantEvent=tr.model.ProcessInstantEvent;const Frame=tr.model.Frame;const ProcessMemoryDump=tr.model.ProcessMemoryDump;function Process(model,pid){if(model===undefined){throw new Error('model must be provided');}
+if(pid===undefined){throw new Error('pid must be provided');}
+tr.model.ProcessBase.call(this,model);this.pid=pid;this.name=undefined;this.labels=[];this.uptime_seconds=0;this.instantEvents=[];this.memoryDumps=[];this.frames=[];this.activities=[];}
+Process.compare=function(x,y){let tmp=tr.model.ProcessBase.compare(x,y);if(tmp)return tmp;tmp=tr.b.comparePossiblyUndefinedValues(x.name,y.name,function(x,y){return x.localeCompare(y);});if(tmp)return tmp;tmp=tr.b.compareArrays(x.labels,y.labels,function(x,y){return x.localeCompare(y);});if(tmp)return tmp;return x.pid-y.pid;};Process.prototype={__proto__:tr.model.ProcessBase.prototype,get stableId(){return this.pid;},compareTo(that){return Process.compare(this,that);},*childEvents(){yield*ProcessBase.prototype.childEvents.call(this);yield*this.instantEvents;yield*this.frames;yield*this.memoryDumps;},addLabelIfNeeded(labelName){for(let i=0;i<this.labels.length;i++){if(this.labels[i]===labelName)return;}
+this.labels.push(labelName);},get userFriendlyName(){let res;if(this.name){res=this.name+' (pid '+this.pid+')';}else{res='Process '+this.pid;}
+if(this.labels.length){res+=': '+this.labels.join(', ');}
+if(this.uptime_seconds){res+=', uptime:'+this.uptime_seconds+'s';}
+return res;},get userFriendlyDetails(){if(this.name){return this.name+' (pid '+this.pid+')';}
+return'pid: '+this.pid;},getSettingsKey(){if(!this.name)return undefined;if(!this.labels.length)return'processes.'+this.name;return'processes.'+this.name+'.'+this.labels.join('.');},shiftTimestampsForward(amount){for(let i=0;i<this.instantEvents.length;i++){this.instantEvents[i].start+=amount;}
+for(let i=0;i<this.frames.length;i++){this.frames[i].shiftTimestampsForward(amount);}
+for(let i=0;i<this.memoryDumps.length;i++){this.memoryDumps[i].shiftTimestampsForward(amount);}
+for(let i=0;i<this.activities.length;i++){this.activities[i].shiftTimestampsForward(amount);}
+tr.model.ProcessBase.prototype.shiftTimestampsForward.apply(this,arguments);},updateBounds(){tr.model.ProcessBase.prototype.updateBounds.apply(this);for(let i=0;i<this.frames.length;i++){this.frames[i].addBoundsToRange(this.bounds);}
+for(let i=0;i<this.memoryDumps.length;i++){this.memoryDumps[i].addBoundsToRange(this.bounds);}
+for(let i=0;i<this.activities.length;i++){this.activities[i].addBoundsToRange(this.bounds);}},sortMemoryDumps(){this.memoryDumps.sort(function(x,y){return x.start-y.start;});tr.model.ProcessMemoryDump.hookUpMostRecentVmRegionsLinks(this.memoryDumps);}};return{Process,};});'use strict';tr.exportTo('tr.model',function(){function Sample(start,title,leafNode,thread,opt_cpu,opt_weight,opt_args){tr.model.TimedEvent.call(this,start);this.start_=start;this.title_=title;this.leafNode_=leafNode;this.thread_=thread;this.colorId_=leafNode.colorId;this.cpu_=opt_cpu;this.weight_=opt_weight;this.args=opt_args||{};}
+Sample.prototype={__proto__:tr.model.TimedEvent.prototype,get title(){return this.title_;},get colorId(){return this.colorId_;},get thread(){return this.thread_;},get leafNode(){return this.leafNode_;},get userFriendlyName(){return'Sample at '+
+tr.b.Unit.byName.timeStampInMs.format(this.start);},get userFriendlyStack(){return this.leafNode_.userFriendlyStack;},getNodesAsArray(){const nodes=[];let node=this.leafNode_;while(node!==undefined){nodes.push(node);node=node.parentNode;}
+return nodes;},get cpu(){return this.cpu_;},get weight(){return this.weight_;},};tr.model.EventRegistry.register(Sample,{name:'Sample',pluralName:'Samples'});return{Sample,};});'use strict';tr.exportTo('tr.model',function(){function StackFrame(parentFrame,id,title,colorId,opt_sourceInfo){if(id===undefined){throw new Error('id must be given');}
+this.parentFrame_=parentFrame;this.id=id;this.title_=title;this.colorId=colorId;this.children=[];this.sourceInfo_=opt_sourceInfo;if(this.parentFrame_){this.parentFrame_.addChild(this);}}
+StackFrame.prototype={get parentFrame(){return this.parentFrame_;},get title(){if(this.sourceInfo_){const src=this.sourceInfo_.toString();return this.title_+(src===''?'':' '+src);}
+return this.title_;},get domain(){let result='unknown';if(this.sourceInfo_&&this.sourceInfo_.domain){result=this.sourceInfo_.domain;}
+if(result==='unknown'&&this.parentFrame){result=this.parentFrame.domain;}
+return result;},get sourceInfo(){return this.sourceInfo_;},set parentFrame(parentFrame){if(this.parentFrame_){Polymer.dom(this.parentFrame_).removeChild(this);}
+this.parentFrame_=parentFrame;if(this.parentFrame_){this.parentFrame_.addChild(this);}},addChild(child){this.children.push(child);},removeChild(child){const i=this.children.indexOf(child.id);if(i===-1){throw new Error('omg');}
+this.children.splice(i,1);},removeAllChildren(){for(let i=0;i<this.children.length;i++){this.children[i].parentFrame_=undefined;}
+this.children.splice(0,this.children.length);},get stackTrace(){const stack=[this];let cur=this.parentFrame;while(cur){stack.push(cur);cur=cur.parentFrame;}
+return stack;},getUserFriendlyStackTrace(){return this.stackTrace.map(function(x){return x.title;});}};return{StackFrame,};});'use strict';tr.exportTo('tr.model.um',function(){class Segment extends tr.model.TimedEvent{constructor(start,duration){super(start);this.duration=duration;this.expectations_=[];}
+get expectations(){return this.expectations_;}
+clone(){const clone=new Segment(this.start,this.duration);clone.expectations.push(...this.expectations);return clone;}
+addSegment(other){this.duration+=other.duration;this.expectations.push(...other.expectations);}}
+return{Segment,};});'use strict';tr.exportTo('tr.model.um',function(){class UserModel extends tr.model.EventContainer{constructor(parentModel){super();this.parentModel_=parentModel;this.expectations_=new tr.model.EventSet();this.segments_=[];}
+get stableId(){return'UserModel';}
+get parentModel(){return this.parentModel_;}
+sortExpectations(){this.expectations_.sortEvents((x,y)=>(x.start-y.start));}
+get expectations(){return this.expectations_;}
+shiftTimestampsForward(amount){}
+addCategoriesToDict(categoriesDict){}
+get segments(){return this.segments_;}*childEvents(){yield*this.expectations;}*childEventContainers(){}
+updateBounds(){this.bounds.reset();for(const expectation of this.expectations){expectation.addBoundsToRange(this.bounds);}}
+resegment(getKeyForSegment){const newSegments=[];let prevKey=undefined;let prevSegment=undefined;for(let i=0;i<this.segments.length;++i){const segment=this.segments[i];const key=getKeyForSegment(segment,i);if(prevSegment!==undefined&&key===prevKey){prevSegment.addSegment(segment);}else{prevSegment=segment.clone();newSegments.push(prevSegment);}
+prevKey=key;}
+return newSegments;}}
+return{UserModel,};});'use strict';tr.exportTo('tr',function(){const Process=tr.model.Process;const Device=tr.model.Device;const Kernel=tr.model.Kernel;const GlobalMemoryDump=tr.model.GlobalMemoryDump;const GlobalInstantEvent=tr.model.GlobalInstantEvent;const FlowEvent=tr.model.FlowEvent;const Alert=tr.model.Alert;const Sample=tr.model.Sample;function Model(){tr.model.EventContainer.call(this);tr.b.EventTarget.decorate(this);this.timestampShiftToZeroAmount_=0;this.faviconHue='blue';this.device=new Device(this);this.kernel=new Kernel(this);this.processes={};this.metadata=[];this.categories=[];this.instantEvents=[];this.flowEvents=[];this.clockSyncManager=new tr.model.ClockSyncManager();this.intrinsicTimeUnit_=undefined;this.stackFrames={};this.samples=[];this.alerts=[];this.userModel=new tr.model.um.UserModel(this);this.flowIntervalTree=new tr.b.IntervalTree((f)=>f.start,(f)=>f.end);this.globalMemoryDumps=[];this.userFriendlyCategoryDrivers_=[];this.annotationsByGuid_={};this.modelIndices=undefined;this.stats=new tr.model.ModelStats();this.importWarnings_=[];this.reportedImportWarnings_={};this.isTimeHighResolution_=true;this.patchupsToApply_=[];this.doesHelperGUIDSupportThisModel_={};this.helpersByConstructorGUID_={};this.eventsByStableId_=undefined;}
+Model.prototype={__proto__:tr.model.EventContainer.prototype,getEventByStableId(stableId){if(this.eventsByStableId_===undefined){this.eventsByStableId_={};for(const event of this.getDescendantEvents()){this.eventsByStableId_[event.stableId]=event;}}
+return this.eventsByStableId_[stableId];},getOrCreateHelper(constructor){if(!constructor.guid){throw new Error('Helper constructors must have GUIDs');}
+if(this.helpersByConstructorGUID_[constructor.guid]===undefined){if(this.doesHelperGUIDSupportThisModel_[constructor.guid]===undefined){this.doesHelperGUIDSupportThisModel_[constructor.guid]=constructor.supportsModel(this);}
+if(!this.doesHelperGUIDSupportThisModel_[constructor.guid]){return undefined;}
+this.helpersByConstructorGUID_[constructor.guid]=new constructor(this);}
+return this.helpersByConstructorGUID_[constructor.guid];},*childEvents(){yield*this.globalMemoryDumps;yield*this.instantEvents;yield*this.flowEvents;yield*this.alerts;yield*this.samples;},*childEventContainers(){yield this.userModel;yield this.device;yield this.kernel;yield*Object.values(this.processes);},iterateAllPersistableObjects(callback){this.kernel.iterateAllPersistableObjects(callback);for(const pid in this.processes){this.processes[pid].iterateAllPersistableObjects(callback);}},updateBounds(){this.bounds.reset();const bounds=this.bounds;for(const ec of this.childEventContainers()){ec.updateBounds();bounds.addRange(ec.bounds);}
+for(const event of this.childEvents()){event.addBoundsToRange(bounds);}},shiftWorldToZero(){const shiftAmount=-this.bounds.min;this.timestampShiftToZeroAmount_=shiftAmount;for(const ec of this.childEventContainers()){ec.shiftTimestampsForward(shiftAmount);}
+for(const event of this.childEvents()){event.start+=shiftAmount;}
+this.updateBounds();},convertTimestampToModelTime(sourceClockDomainName,ts){if(sourceClockDomainName!=='traceEventClock'){throw new Error('Only traceEventClock is supported.');}
+return tr.b.Unit.timestampFromUs(ts)+
+this.timestampShiftToZeroAmount_;},get numProcesses(){let n=0;for(const p in this.processes){n++;}
+return n;},getProcess(pid){return this.processes[pid];},getOrCreateProcess(pid){if(!this.processes[pid]){this.processes[pid]=new Process(this,pid);}
+return this.processes[pid];},addStackFrame(stackFrame){if(this.stackFrames[stackFrame.id]){throw new Error('Stack frame already exists');}
+this.stackFrames[stackFrame.id]=stackFrame;return stackFrame;},updateCategories_(){const categoriesDict={};this.userModel.addCategoriesToDict(categoriesDict);this.device.addCategoriesToDict(categoriesDict);this.kernel.addCategoriesToDict(categoriesDict);for(const pid in this.processes){this.processes[pid].addCategoriesToDict(categoriesDict);}
+this.categories=[];for(const category in categoriesDict){if(category!==''){this.categories.push(category);}}},getAllThreads(){const threads=[];for(const tid in this.kernel.threads){threads.push(process.threads[tid]);}
+for(const pid in this.processes){const process=this.processes[pid];for(const tid in process.threads){threads.push(process.threads[tid]);}}
+return threads;},getAllProcesses(opt_predicate){const processes=[];for(const pid in this.processes){const process=this.processes[pid];if(opt_predicate===undefined||opt_predicate(process)){processes.push(process);}}
+return processes;},getAllCounters(){const counters=[];counters.push.apply(counters,Object.values(this.device.counters||{}));counters.push.apply(counters,Object.values(this.kernel.counters||{}));for(const pid in this.processes){const process=this.processes[pid];for(const tid in process.counters){counters.push(process.counters[tid]);}}
+return counters;},getAnnotationByGUID(guid){return this.annotationsByGuid_[guid];},addAnnotation(annotation){if(!annotation.guid){throw new Error('Annotation with undefined guid given');}
+this.annotationsByGuid_[annotation.guid]=annotation;tr.b.dispatchSimpleEvent(this,'annotationChange');},removeAnnotation(annotation){this.annotationsByGuid_[annotation.guid].onRemove();delete this.annotationsByGuid_[annotation.guid];tr.b.dispatchSimpleEvent(this,'annotationChange');},getAllAnnotations(){return Object.values(this.annotationsByGuid_);},addUserFriendlyCategoryDriver(ufcd){this.userFriendlyCategoryDrivers_.push(ufcd);},getUserFriendlyCategoryFromEvent(event){for(let i=0;i<this.userFriendlyCategoryDrivers_.length;i++){const ufc=this.userFriendlyCategoryDrivers_[i].fromEvent(event);if(ufc!==undefined)return ufc;}
+return undefined;},findAllThreadsNamed(name){const namedThreads=[];namedThreads.push.apply(namedThreads,this.kernel.findAllThreadsNamed(name));for(const pid in this.processes){namedThreads.push.apply(namedThreads,this.processes[pid].findAllThreadsNamed(name));}
+return namedThreads;},get importOptions(){return this.importOptions_;},set importOptions(options){this.importOptions_=options;},get intrinsicTimeUnit(){if(this.intrinsicTimeUnit_===undefined){return tr.b.TimeDisplayModes.ms;}
+return this.intrinsicTimeUnit_;},set intrinsicTimeUnit(value){if(this.intrinsicTimeUnit_===value)return;if(this.intrinsicTimeUnit_!==undefined){throw new Error('Intrinsic time unit already set');}
+this.intrinsicTimeUnit_=value;},get isTimeHighResolution(){return this.isTimeHighResolution_;},set isTimeHighResolution(value){this.isTimeHighResolution_=value;},get canonicalUrl(){return this.canonicalUrl_;},set canonicalUrl(value){if(this.canonicalUrl_===value)return;if(this.canonicalUrl_!==undefined){throw new Error('canonicalUrl already set');}
+this.canonicalUrl_=value;},importWarning(data){data.showToUser=!!data.showToUser;this.importWarnings_.push(data);if(this.reportedImportWarnings_[data.type]===true)return;this.reportedImportWarnings_[data.type]=true;},get hasImportWarnings(){return(this.importWarnings_.length>0);},get importWarnings(){return this.importWarnings_;},get importWarningsThatShouldBeShownToUser(){return this.importWarnings_.filter(function(warning){return warning.showToUser;});},autoCloseOpenSlices(){this.samples.sort(function(x,y){return x.start-y.start;});this.updateBounds();this.kernel.autoCloseOpenSlices();for(const pid in this.processes){this.processes[pid].autoCloseOpenSlices();}},createSubSlices(){this.kernel.createSubSlices();for(const pid in this.processes){this.processes[pid].createSubSlices();}},preInitializeObjects(){for(const pid in this.processes){this.processes[pid].preInitializeObjects();}},initializeObjects(){for(const pid in this.processes){this.processes[pid].initializeObjects();}},pruneEmptyContainers(){this.kernel.pruneEmptyContainers();for(const pid in this.processes){this.processes[pid].pruneEmptyContainers();}},mergeKernelWithUserland(){for(const pid in this.processes){this.processes[pid].mergeKernelWithUserland();}},computeWorldBounds(shiftWorldToZero){this.updateBounds();this.updateCategories_();if(shiftWorldToZero){this.shiftWorldToZero();}},buildFlowEventIntervalTree(){for(let i=0;i<this.flowEvents.length;++i){const flowEvent=this.flowEvents[i];this.flowIntervalTree.insert(flowEvent);}
+this.flowIntervalTree.updateHighValues();},cleanupUndeletedObjects(){for(const pid in this.processes){this.processes[pid].autoDeleteObjects(this.bounds.max);}},sortMemoryDumps(){this.globalMemoryDumps.sort(function(x,y){return x.start-y.start;});for(const pid in this.processes){this.processes[pid].sortMemoryDumps();}},finalizeMemoryGraphs(){this.globalMemoryDumps.forEach(function(dump){dump.finalizeGraph();});},buildEventIndices(){this.modelIndices=new tr.model.ModelIndices(this);},sortAlerts(){this.alerts.sort(function(x,y){return x.start-y.start;});},applyObjectRefPatchups(){const unresolved=[];this.patchupsToApply_.forEach(function(patchup){if(patchup.pidRef in this.processes){const snapshot=this.processes[patchup.pidRef].objects.getSnapshotAt(patchup.scopedId,patchup.ts);if(snapshot){patchup.object[patchup.field]=snapshot;snapshot.referencedAt(patchup.item,patchup.object,patchup.field);return;}}
+unresolved.push(patchup);},this);this.patchupsToApply_=unresolved;},replacePIDRefsInPatchups(oldPidRef,newPidRef){this.patchupsToApply_.forEach(function(patchup){if(patchup.pidRef===oldPidRef){patchup.pidRef=newPidRef;}});},joinRefs(){this.joinObjectRefs_();this.applyObjectRefPatchups();},joinObjectRefs_(){for(const[pid,process]of Object.entries(this.processes)){this.joinObjectRefsForProcess_(pid,process);}},joinObjectRefsForProcess_(pid,process){for(const thread of Object.values(process.threads)){thread.asyncSliceGroup.slices.forEach(function(item){this.searchItemForIDRefs_(pid,'start',item);},this);thread.sliceGroup.slices.forEach(function(item){this.searchItemForIDRefs_(pid,'start',item);},this);}
+process.objects.iterObjectInstances(function(instance){instance.snapshots.forEach(function(item){this.searchItemForIDRefs_(pid,'ts',item);},this);},this);},searchItemForIDRefs_(pid,itemTimestampField,item){if(!item.args&&!item.contexts)return;const patchupsToApply=this.patchupsToApply_;function handleField(object,fieldName,fieldValue){if(!fieldValue||(!fieldValue.id_ref&&!fieldValue.idRef)){return;}
+const scope=fieldValue.scope||tr.model.OBJECT_DEFAULT_SCOPE;const idRef=fieldValue.id_ref||fieldValue.idRef;const scopedId=new tr.model.ScopedId(scope,idRef);const pidRef=fieldValue.pid_ref||fieldValue.pidRef||pid;const ts=item[itemTimestampField];patchupsToApply.push({item,object,field:fieldName,pidRef,scopedId,ts});}
+function iterObjectFieldsRecursively(object){if(!(object instanceof Object))return;if((object instanceof tr.model.ObjectSnapshot)||(object instanceof Float32Array)||(object instanceof tr.b.math.Quad)){return;}
+if(object instanceof Array){for(let i=0;i<object.length;i++){handleField(object,i,object[i]);iterObjectFieldsRecursively(object[i]);}
+return;}
+for(const key in object){const value=object[key];handleField(object,key,value);iterObjectFieldsRecursively(value);}}
+iterObjectFieldsRecursively(item.args);iterObjectFieldsRecursively(item.contexts);}};return{Model,};});'use strict';tr.exportTo('tr.e.importer.etw',function(){const kThreadGuid='3D6FA8D1-FE05-11D0-9DDA-00C04FD7BA7C';const kThreadDCStartOpcode=3;function Decoder(){this.payload_=new DataView(new ArrayBuffer(256));}
+Decoder.prototype={__proto__:Object.prototype,reset(base64Payload){const decodedSize=tr.b.Base64.getDecodedBufferLength(base64Payload);if(decodedSize>this.payload_.byteLength){this.payload_=new DataView(new ArrayBuffer(decodedSize));}
+tr.b.Base64.DecodeToTypedArray(base64Payload,this.payload_);this.position_=0;},skip(length){this.position_+=length;},decodeUInt8(){const result=this.payload_.getUint8(this.position_,true);this.position_+=1;return result;},decodeUInt16(){const result=this.payload_.getUint16(this.position_,true);this.position_+=2;return result;},decodeUInt32(){const result=this.payload_.getUint32(this.position_,true);this.position_+=4;return result;},decodeUInt64ToString(){const low=this.decodeUInt32();const high=this.decodeUInt32();const lowStr=('0000000'+low.toString(16)).substr(-8);const highStr=('0000000'+high.toString(16)).substr(-8);const result=highStr+lowStr;return result;},decodeInt8(){const result=this.payload_.getInt8(this.position_,true);this.position_+=1;return result;},decodeInt16(){const result=this.payload_.getInt16(this.position_,true);this.position_+=2;return result;},decodeInt32(){const result=this.payload_.getInt32(this.position_,true);this.position_+=4;return result;},decodeInt64ToString(){return this.decodeUInt64ToString();},decodeUInteger(is64){if(is64){return this.decodeUInt64ToString();}
+return this.decodeUInt32();},decodeString(){let str='';while(true){const c=this.decodeUInt8();if(!c)return str;str=str+String.fromCharCode(c);}},decodeW16String(){let str='';while(true){const c=this.decodeUInt16();if(!c)return str;str=str+String.fromCharCode(c);}},decodeFixedW16String(length){const oldPosition=this.position_;let str='';for(let i=0;i<length;i++){const c=this.decodeUInt16();if(!c)break;str=str+String.fromCharCode(c);}
+this.position_=oldPosition+2*length;return str;},decodeBytes(length){const bytes=[];for(let i=0;i<length;++i){const c=this.decodeUInt8();bytes.push(c);}
+return bytes;},decodeSID(is64){const pSid=this.decodeUInteger(is64);const attributes=this.decodeUInt32();if(is64){this.decodeUInt32();}
+const revision=this.decodeUInt8();const subAuthorityCount=this.decodeUInt8();this.decodeUInt16();this.decodeUInt32();if(revision!==1){throw new Error('Invalid SID revision: could not decode the SID structure.');}
+const sid=this.decodeBytes(4*subAuthorityCount);return{pSid,attributes,sid};},decodeSystemTime(){const wYear=this.decodeInt16();const wMonth=this.decodeInt16();const wDayOfWeek=this.decodeInt16();const wDay=this.decodeInt16();const wHour=this.decodeInt16();const wMinute=this.decodeInt16();const wSecond=this.decodeInt16();const wMilliseconds=this.decodeInt16();return{wYear,wMonth,wDayOfWeek,wDay,wHour,wMinute,wSecond,wMilliseconds};},decodeTimeZoneInformation(){const bias=this.decodeUInt32();const standardName=this.decodeFixedW16String(32);const standardDate=this.decodeSystemTime();const standardBias=this.decodeUInt32();const daylightName=this.decodeFixedW16String(32);const daylightDate=this.decodeSystemTime();const daylightBias=this.decodeUInt32();return{bias,standardName,standardDate,standardBias,daylightName,daylightDate,daylightBias};}};function EtwImporter(model,events){this.importPriority=3;this.model_=model;this.events_=events;this.handlers_={};this.decoder_=new Decoder();this.walltime_=undefined;this.ticks_=undefined;this.is64bit_=undefined;this.tidsToPid_={};const allTypeInfos=tr.e.importer.etw.Parser.getAllRegisteredTypeInfos();this.parsers_=allTypeInfos.map(function(typeInfo){return new typeInfo.constructor(this);},this);}
+EtwImporter.canImport=function(events){if(!events.hasOwnProperty('name')||!events.hasOwnProperty('content')||events.name!=='ETW'){return false;}
+return true;};EtwImporter.prototype={__proto__:tr.importer.Importer.prototype,get importerName(){return'EtwImporter';},get model(){return this.model_;},createThreadIfNeeded(pid,tid){this.tidsToPid_[tid]=pid;},removeThreadIfPresent(tid){this.tidsToPid_[tid]=undefined;},getPidFromWindowsTid(tid){if(tid===0)return 0;const pid=this.tidsToPid_[tid];if(pid===undefined){return 0;}
+return pid;},getThreadFromWindowsTid(tid){const pid=this.getPidFromWindowsTid(tid);const process=this.model_.getProcess(pid);if(!process)return undefined;return process.getThread(tid);},getOrCreateCpu(cpuNumber){const cpu=this.model_.kernel.getOrCreateCpu(cpuNumber);return cpu;},importEvents(){this.events_.content.forEach(this.parseInfo.bind(this));if(this.walltime_===undefined||this.ticks_===undefined){throw Error('Cannot find clock sync information in the system trace.');}
+if(this.is64bit_===undefined){throw Error('Cannot determine pointer size of the system trace.');}
+this.events_.content.forEach(this.parseEvent.bind(this));},importTimestamp(timestamp){const ts=parseInt(timestamp,16);return(ts-this.walltime_+this.ticks_)/1000.;},parseInfo(event){if(event.hasOwnProperty('guid')&&event.hasOwnProperty('walltime')&&event.hasOwnProperty('tick')&&event.guid==='ClockSync'){this.walltime_=parseInt(event.walltime,16);this.ticks_=parseInt(event.tick,16);}
+if(this.is64bit_===undefined&&event.hasOwnProperty('guid')&&event.hasOwnProperty('op')&&event.hasOwnProperty('ver')&&event.hasOwnProperty('payload')&&event.guid===kThreadGuid&&event.op===kThreadDCStartOpcode){const decodedSize=tr.b.Base64.getDecodedBufferLength(event.payload);if(event.ver===1){if(decodedSize>=52){this.is64bit_=true;}else{this.is64bit_=false;}}else if(event.ver===2){if(decodedSize>=64){this.is64bit_=true;}else{this.is64bit_=false;}}else if(event.ver===3){if(decodedSize>=60){this.is64bit_=true;}else{this.is64bit_=false;}}}
+return true;},parseEvent(event){if(!event.hasOwnProperty('guid')||!event.hasOwnProperty('op')||!event.hasOwnProperty('ver')||!event.hasOwnProperty('cpu')||!event.hasOwnProperty('ts')||!event.hasOwnProperty('payload')){return false;}
+const timestamp=this.importTimestamp(event.ts);const header={guid:event.guid,opcode:event.op,version:event.ver,cpu:event.cpu,timestamp,is64:this.is64bit_};const decoder=this.decoder_;decoder.reset(event.payload);const handler=this.getEventHandler(header.guid,header.opcode);if(!handler)return false;if(!handler(header,decoder)){this.model_.importWarning({type:'parse_error',message:'Malformed '+header.guid+' event ('+event.payload+')'});return false;}
+return true;},registerEventHandler(guid,opcode,handler){if(this.handlers_[guid]===undefined){this.handlers_[guid]=[];}
+this.handlers_[guid][opcode]=handler;},getEventHandler(guid,opcode){if(this.handlers_[guid]===undefined){return undefined;}
+return this.handlers_[guid][opcode];}};tr.importer.Importer.register(EtwImporter);return{EtwImporter,};});'use strict';tr.exportTo('tr.b',function(){class TraceStream{static get HEADER_SIZE(){return Math.pow(2,10);}
+static get CHUNK_SIZE(){return Math.pow(2,20);}
+get isBinary(){throw new Error('Not implemented');}
+get hasData(){throw new Error('Not implemented');}
+get header(){throw new Error('Not implemented');}
+readUntilDelimiter(delim){throw new Error('Not implemented');}
+readNumBytes(opt_size){throw new Error('Not implemented');}
+rewind(){throw new Error('Not implemented');}
+substream(offset,opt_length,opt_headerSize){throw new Error('Not implemented');}}
+return{TraceStream,};});'use strict';tr.exportTo('tr.b',function(){const MAX_FUNCTION_ARGS_COUNT=Math.pow(2,15)-1;class InMemoryTraceStream extends tr.b.TraceStream{constructor(buffer,isBinary,opt_headerSize){super();if(!buffer instanceof Uint8Array){throw new Error('buffer should be a Uint8Array');}
+const headerSize=opt_headerSize||tr.b.TraceStream.HEADER_SIZE;this.data_=buffer;this.isBinary_=isBinary;this.header_=InMemoryTraceStream.uint8ArrayToString_(this.data_.subarray(0,headerSize));this.cursor_=0;}
+get isBinary(){return this.isBinary_;}
+get hasData(){return this.cursor_<this.data_.length;}
+get header(){return this.header_;}
+get data(){return this.data_;}
+toString(){this.rewind();return this.readNumBytes(Number.MAX_VALUE);}
+readUntilDelimiter(delim){if(delim.length!==1){throw new Error('delim must be exactly one character');}
+const offset=this.data_.indexOf(delim.charCodeAt(0),this.cursor_)+1;return this.readToOffset_(offset>0?Math.min(offset,this.data_.length):this.data_.length);}
+readNumBytes(opt_size){if(opt_size!==undefined&&opt_size<=0){throw new Error(`readNumBytes expects a positive size (${opt_size} given)`);}
+const size=opt_size||tr.b.TraceStream.CHUNK_SIZE;const offset=Math.min(this.cursor_+size,this.data_.length);return this.readToOffset_(offset);}
+rewind(){this.cursor_=0;}
+substream(startOffset,opt_endOffset,opt_headerSize){return new InMemoryTraceStream(this.data_.subarray(startOffset,opt_endOffset),this.isBinary_,opt_headerSize);}
+readToOffset_(offset){const out=InMemoryTraceStream.uint8ArrayToString_(this.data_.subarray(this.cursor_,offset));this.cursor_=offset;return out;}
+static uint8ArrayToString_(arr){const c=[];for(let i=0;i<arr.length;i+=MAX_FUNCTION_ARGS_COUNT){c.push(String.fromCharCode(...arr.subarray(i,i+MAX_FUNCTION_ARGS_COUNT)));}
+return c.join('');}}
+return{InMemoryTraceStream,};});!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;"undefined"!=typeof window?b=window:"undefined"!=typeof global?b=global:"undefined"!=typeof self&&(b=self),b.JSZip=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);throw new Error("Cannot find module '"+g+"'")}var j=c[g]={exports:{}};b[g][0].call(j.exports,function(a){var c=b[g][1][a];return e(c?c:a)},j,j.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){"use strict";var d="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";c.encode=function(a){for(var b,c,e,f,g,h,i,j="",k=0;k<a.length;)b=a.charCodeAt(k++),c=a.charCodeAt(k++),e=a.charCodeAt(k++),f=b>>2,g=(3&b)<<4|c>>4,h=(15&c)<<2|e>>6,i=63&e,isNaN(c)?h=i=64:isNaN(e)&&(i=64),j=j+d.charAt(f)+d.charAt(g)+d.charAt(h)+d.charAt(i);return j},c.decode=function(a){var b,c,e,f,g,h,i,j="",k=0;for(a=a.replace(/[^A-Za-z0-9\+\/\=]/g,"");k<a.length;)f=d.indexOf(a.charAt(k++)),g=d.indexOf(a.charAt(k++)),h=d.indexOf(a.charAt(k++)),i=d.indexOf(a.charAt(k++)),b=f<<2|g>>4,c=(15&g)<<4|h>>2,e=(3&h)<<6|i,j+=String.fromCharCode(b),64!=h&&(j+=String.fromCharCode(c)),64!=i&&(j+=String.fromCharCode(e));return j}},{}],2:[function(a,b){"use strict";function c(){this.compressedSize=0,this.uncompressedSize=0,this.crc32=0,this.compressionMethod=null,this.compressedContent=null}c.prototype={getContent:function(){return null},getCompressedContent:function(){return null}},b.exports=c},{}],3:[function(a,b,c){"use strict";c.STORE={magic:"\x00\x00",compress:function(a){return a},uncompress:function(a){return a},compressInputType:null,uncompressInputType:null},c.DEFLATE=a("./flate")},{"./flate":8}],4:[function(a,b){"use strict";var c=a("./utils"),d=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];b.exports=function(a,b){if("undefined"==typeof a||!a.length)return 0;var e="string"!==c.getTypeOf(a);"undefined"==typeof b&&(b=0);var f=0,g=0,h=0;b=-1^b;for(var i=0,j=a.length;j>i;i++)h=e?a[i]:a.charCodeAt(i),g=255&(b^h),f=d[g],b=b>>>8^f;return-1^b}},{"./utils":21}],5:[function(a,b){"use strict";function c(){this.data=null,this.length=0,this.index=0}var d=a("./utils");c.prototype={checkOffset:function(a){this.checkIndex(this.index+a)},checkIndex:function(a){if(this.length<a||0>a)throw new Error("End of data reached (data length = "+this.length+", asked index = "+a+"). Corrupted zip ?")},setIndex:function(a){this.checkIndex(a),this.index=a},skip:function(a){this.setIndex(this.index+a)},byteAt:function(){},readInt:function(a){var b,c=0;for(this.checkOffset(a),b=this.index+a-1;b>=this.index;b--)c=(c<<8)+this.byteAt(b);return this.index+=a,c},readString:function(a){return d.transformTo("string",this.readData(a))},readData:function(){},lastIndexOfSignature:function(){},readDate:function(){var a=this.readInt(4);return new Date((a>>25&127)+1980,(a>>21&15)-1,a>>16&31,a>>11&31,a>>5&63,(31&a)<<1)}},b.exports=c},{"./utils":21}],6:[function(a,b,c){"use strict";c.base64=!1,c.binary=!1,c.dir=!1,c.createFolders=!1,c.date=null,c.compression=null,c.comment=null},{}],7:[function(a,b,c){"use strict";var d=a("./utils");c.string2binary=function(a){return d.string2binary(a)},c.string2Uint8Array=function(a){return d.transformTo("uint8array",a)},c.uint8Array2String=function(a){return d.transformTo("string",a)},c.string2Blob=function(a){var b=d.transformTo("arraybuffer",a);return d.arrayBuffer2Blob(b)},c.arrayBuffer2Blob=function(a){return d.arrayBuffer2Blob(a)},c.transformTo=function(a,b){return d.transformTo(a,b)},c.getTypeOf=function(a){return d.getTypeOf(a)},c.checkSupport=function(a){return d.checkSupport(a)},c.MAX_VALUE_16BITS=d.MAX_VALUE_16BITS,c.MAX_VALUE_32BITS=d.MAX_VALUE_32BITS,c.pretty=function(a){return d.pretty(a)},c.findCompression=function(a){return d.findCompression(a)},c.isRegExp=function(a){return d.isRegExp(a)}},{"./utils":21}],8:[function(a,b,c){"use strict";var d="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,e=a("pako");c.uncompressInputType=d?"uint8array":"array",c.compressInputType=d?"uint8array":"array",c.magic="\b\x00",c.compress=function(a){return e.deflateRaw(a)},c.uncompress=function(a){return e.inflateRaw(a)}},{pako:24}],9:[function(a,b){"use strict";function c(a,b){return this instanceof c?(this.files={},this.comment=null,this.root="",a&&this.load(a,b),void(this.clone=function(){var a=new c;for(var b in this)"function"!=typeof this[b]&&(a[b]=this[b]);return a})):new c(a,b)}var d=a("./base64");c.prototype=a("./object"),c.prototype.load=a("./load"),c.support=a("./support"),c.defaults=a("./defaults"),c.utils=a("./deprecatedPublicUtils"),c.base64={encode:function(a){return d.encode(a)},decode:function(a){return d.decode(a)}},c.compressions=a("./compressions"),b.exports=c},{"./base64":1,"./compressions":3,"./defaults":6,"./deprecatedPublicUtils":7,"./load":10,"./object":13,"./support":17}],10:[function(a,b){"use strict";var c=a("./base64"),d=a("./zipEntries");b.exports=function(a,b){var e,f,g,h;for(b=b||{},b.base64&&(a=c.decode(a)),f=new d(a,b),e=f.files,g=0;g<e.length;g++)h=e[g],this.file(h.fileName,h.decompressed,{binary:!0,optimizedBinaryString:!0,date:h.date,dir:h.dir,comment:h.fileComment.length?h.fileComment:null,createFolders:b.createFolders});return f.zipComment.length&&(this.comment=f.zipComment),this}},{"./base64":1,"./zipEntries":22}],11:[function(a,b){(function(a){"use strict";b.exports=function(b,c){return new a(b,c)},b.exports.test=function(b){return a.isBuffer(b)}}).call(this,"undefined"!=typeof Buffer?Buffer:void 0)},{}],12:[function(a,b){"use strict";function c(a){this.data=a,this.length=this.data.length,this.index=0}var d=a("./uint8ArrayReader");c.prototype=new d,c.prototype.readData=function(a){this.checkOffset(a);var b=this.data.slice(this.index,this.index+a);return this.index+=a,b},b.exports=c},{"./uint8ArrayReader":18}],13:[function(a,b){"use strict";var c=a("./support"),d=a("./utils"),e=a("./crc32"),f=a("./signature"),g=a("./defaults"),h=a("./base64"),i=a("./compressions"),j=a("./compressedObject"),k=a("./nodeBuffer"),l=a("./utf8"),m=a("./stringWriter"),n=a("./uint8ArrayWriter"),o=function(a){if(a._data instanceof j&&(a._data=a._data.getContent(),a.options.binary=!0,a.options.base64=!1,"uint8array"===d.getTypeOf(a._data))){var b=a._data;a._data=new Uint8Array(b.length),0!==b.length&&a._data.set(b,0)}return a._data},p=function(a){var b=o(a),e=d.getTypeOf(b);return"string"===e?!a.options.binary&&c.nodebuffer?k(b,"utf-8"):a.asBinary():b},q=function(a){var b=o(this);return null===b||"undefined"==typeof b?"":(this.options.base64&&(b=h.decode(b)),b=a&&this.options.binary?A.utf8decode(b):d.transformTo("string",b),a||this.options.binary||(b=d.transformTo("string",A.utf8encode(b))),b)},r=function(a,b,c){this.name=a,this.dir=c.dir,this.date=c.date,this.comment=c.comment,this._data=b,this.options=c,this._initialMetadata={dir:c.dir,date:c.date}};r.prototype={asText:function(){return q.call(this,!0)},asBinary:function(){return q.call(this,!1)},asNodeBuffer:function(){var a=p(this);return d.transformTo("nodebuffer",a)},asUint8Array:function(){var a=p(this);return d.transformTo("uint8array",a)},asArrayBuffer:function(){return this.asUint8Array().buffer}};var s=function(a,b){var c,d="";for(c=0;b>c;c++)d+=String.fromCharCode(255&a),a>>>=8;return d},t=function(){var a,b,c={};for(a=0;a<arguments.length;a++)for(b in arguments[a])arguments[a].hasOwnProperty(b)&&"undefined"==typeof c[b]&&(c[b]=arguments[a][b]);return c},u=function(a){return a=a||{},a.base64!==!0||null!==a.binary&&void 0!==a.binary||(a.binary=!0),a=t(a,g),a.date=a.date||new Date,null!==a.compression&&(a.compression=a.compression.toUpperCase()),a},v=function(a,b,c){var e,f=d.getTypeOf(b);if(c=u(c),c.createFolders&&(e=w(a))&&x.call(this,e,!0),c.dir||null===b||"undefined"==typeof b)c.base64=!1,c.binary=!1,b=null;else if("string"===f)c.binary&&!c.base64&&c.optimizedBinaryString!==!0&&(b=d.string2binary(b));else{if(c.base64=!1,c.binary=!0,!(f||b instanceof j))throw new Error("The data of '"+a+"' is in an unsupported format !");"arraybuffer"===f&&(b=d.transformTo("uint8array",b))}var g=new r(a,b,c);return this.files[a]=g,g},w=function(a){"/"==a.slice(-1)&&(a=a.substring(0,a.length-1));var b=a.lastIndexOf("/");return b>0?a.substring(0,b):""},x=function(a,b){return"/"!=a.slice(-1)&&(a+="/"),b="undefined"!=typeof b?b:!1,this.files[a]||v.call(this,a,null,{dir:!0,createFolders:b}),this.files[a]},y=function(a,b){var c,f=new j;return a._data instanceof j?(f.uncompressedSize=a._data.uncompressedSize,f.crc32=a._data.crc32,0===f.uncompressedSize||a.dir?(b=i.STORE,f.compressedContent="",f.crc32=0):a._data.compressionMethod===b.magic?f.compressedContent=a._data.getCompressedContent():(c=a._data.getContent(),f.compressedContent=b.compress(d.transformTo(b.compressInputType,c)))):(c=p(a),(!c||0===c.length||a.dir)&&(b=i.STORE,c=""),f.uncompressedSize=c.length,f.crc32=e(c),f.compressedContent=b.compress(d.transformTo(b.compressInputType,c))),f.compressedSize=f.compressedContent.length,f.compressionMethod=b.magic,f},z=function(a,b,c,g){var h,i,j,k,m=(c.compressedContent,d.transformTo("string",l.utf8encode(b.name))),n=b.comment||"",o=d.transformTo("string",l.utf8encode(n)),p=m.length!==b.name.length,q=o.length!==n.length,r=b.options,t="",u="",v="";j=b._initialMetadata.dir!==b.dir?b.dir:r.dir,k=b._initialMetadata.date!==b.date?b.date:r.date,h=k.getHours(),h<<=6,h|=k.getMinutes(),h<<=5,h|=k.getSeconds()/2,i=k.getFullYear()-1980,i<<=4,i|=k.getMonth()+1,i<<=5,i|=k.getDate(),p&&(u=s(1,1)+s(e(m),4)+m,t+="up"+s(u.length,2)+u),q&&(v=s(1,1)+s(this.crc32(o),4)+o,t+="uc"+s(v.length,2)+v);var w="";w+="\n\x00",w+=p||q?"\x00\b":"\x00\x00",w+=c.compressionMethod,w+=s(h,2),w+=s(i,2),w+=s(c.crc32,4),w+=s(c.compressedSize,4),w+=s(c.uncompressedSize,4),w+=s(m.length,2),w+=s(t.length,2);var x=f.LOCAL_FILE_HEADER+w+m+t,y=f.CENTRAL_FILE_HEADER+"\x00"+w+s(o.length,2)+"\x00\x00\x00\x00"+(j===!0?"\x00\x00\x00":"\x00\x00\x00\x00")+s(g,4)+m+t+o;return{fileRecord:x,dirRecord:y,compressedObject:c}},A={load:function(){throw new Error("Load method is not defined. Is the file jszip-load.js included ?")},filter:function(a){var b,c,d,e,f=[];for(b in this.files)this.files.hasOwnProperty(b)&&(d=this.files[b],e=new r(d.name,d._data,t(d.options)),c=b.slice(this.root.length,b.length),b.slice(0,this.root.length)===this.root&&a(c,e)&&f.push(e));return f},file:function(a,b,c){if(1===arguments.length){if(d.isRegExp(a)){var e=a;return this.filter(function(a,b){return!b.dir&&e.test(a)})}return this.filter(function(b,c){return!c.dir&&b===a})[0]||null}return a=this.root+a,v.call(this,a,b,c),this},folder:function(a){if(!a)return this;if(d.isRegExp(a))return this.filter(function(b,c){return c.dir&&a.test(b)});var b=this.root+a,c=x.call(this,b),e=this.clone();return e.root=c.name,e},remove:function(a){a=this.root+a;var b=this.files[a];if(b||("/"!=a.slice(-1)&&(a+="/"),b=this.files[a]),b&&!b.dir)delete this.files[a];else for(var c=this.filter(function(b,c){return c.name.slice(0,a.length)===a}),d=0;d<c.length;d++)delete this.files[c[d].name];return this},generate:function(a){a=t(a||{},{base64:!0,compression:"STORE",type:"base64",comment:null}),d.checkSupport(a.type);var b,c,e=[],g=0,j=0,k=d.transformTo("string",this.utf8encode(a.comment||this.comment||""));for(var l in this.files)if(this.files.hasOwnProperty(l)){var o=this.files[l],p=o.options.compression||a.compression.toUpperCase(),q=i[p];if(!q)throw new Error(p+" is not a valid compression method !");var r=y.call(this,o,q),u=z.call(this,l,o,r,g);g+=u.fileRecord.length+r.compressedSize,j+=u.dirRecord.length,e.push(u)}var v="";v=f.CENTRAL_DIRECTORY_END+"\x00\x00\x00\x00"+s(e.length,2)+s(e.length,2)+s(j,4)+s(g,4)+s(k.length,2)+k;var w=a.type.toLowerCase();for(b="uint8array"===w||"arraybuffer"===w||"blob"===w||"nodebuffer"===w?new n(g+j+v.length):new m(g+j+v.length),c=0;c<e.length;c++)b.append(e[c].fileRecord),b.append(e[c].compressedObject.compressedContent);for(c=0;c<e.length;c++)b.append(e[c].dirRecord);b.append(v);var x=b.finalize();switch(a.type.toLowerCase()){case"uint8array":case"arraybuffer":case"nodebuffer":return d.transformTo(a.type.toLowerCase(),x);case"blob":return d.arrayBuffer2Blob(d.transformTo("arraybuffer",x));case"base64":return a.base64?h.encode(x):x;default:return x}},crc32:function(a,b){return e(a,b)},utf8encode:function(a){return d.transformTo("string",l.utf8encode(a))},utf8decode:function(a){return l.utf8decode(a)}};b.exports=A},{"./base64":1,"./compressedObject":2,"./compressions":3,"./crc32":4,"./defaults":6,"./nodeBuffer":11,"./signature":14,"./stringWriter":16,"./support":17,"./uint8ArrayWriter":19,"./utf8":20,"./utils":21}],14:[function(a,b,c){"use strict";c.LOCAL_FILE_HEADER="PK",c.CENTRAL_FILE_HEADER="PK",c.CENTRAL_DIRECTORY_END="PK",c.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK",c.ZIP64_CENTRAL_DIRECTORY_END="PK",c.DATA_DESCRIPTOR="PK\b"},{}],15:[function(a,b){"use strict";function c(a,b){this.data=a,b||(this.data=e.string2binary(this.data)),this.length=this.data.length,this.index=0}var d=a("./dataReader"),e=a("./utils");c.prototype=new d,c.prototype.byteAt=function(a){return this.data.charCodeAt(a)},c.prototype.lastIndexOfSignature=function(a){return this.data.lastIndexOf(a)},c.prototype.readData=function(a){this.checkOffset(a);var b=this.data.slice(this.index,this.index+a);return this.index+=a,b},b.exports=c},{"./dataReader":5,"./utils":21}],16:[function(a,b){"use strict";var c=a("./utils"),d=function(){this.data=[]};d.prototype={append:function(a){a=c.transformTo("string",a),this.data.push(a)},finalize:function(){return this.data.join("")}},b.exports=d},{"./utils":21}],17:[function(a,b,c){(function(a){"use strict";if(c.base64=!0,c.array=!0,c.string=!0,c.arraybuffer="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof Uint8Array,c.nodebuffer="undefined"!=typeof a,c.uint8array="undefined"!=typeof Uint8Array,"undefined"==typeof ArrayBuffer)c.blob=!1;else{var b=new ArrayBuffer(0);try{c.blob=0===new Blob([b],{type:"application/zip"}).size}catch(d){try{var e=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder,f=new e;f.append(b),c.blob=0===f.getBlob("application/zip").size}catch(d){c.blob=!1}}}}).call(this,"undefined"!=typeof Buffer?Buffer:void 0)},{}],18:[function(a,b){"use strict";function c(a){a&&(this.data=a,this.length=this.data.length,this.index=0)}var d=a("./dataReader");c.prototype=new d,c.prototype.byteAt=function(a){return this.data[a]},c.prototype.lastIndexOfSignature=function(a){for(var b=a.charCodeAt(0),c=a.charCodeAt(1),d=a.charCodeAt(2),e=a.charCodeAt(3),f=this.length-4;f>=0;--f)if(this.data[f]===b&&this.data[f+1]===c&&this.data[f+2]===d&&this.data[f+3]===e)return f;return-1},c.prototype.readData=function(a){if(this.checkOffset(a),0===a)return new Uint8Array(0);var b=this.data.subarray(this.index,this.index+a);return this.index+=a,b},b.exports=c},{"./dataReader":5}],19:[function(a,b){"use strict";var c=a("./utils"),d=function(a){this.data=new Uint8Array(a),this.index=0};d.prototype={append:function(a){0!==a.length&&(a=c.transformTo("uint8array",a),this.data.set(a,this.index),this.index+=a.length)},finalize:function(){return this.data}},b.exports=d},{"./utils":21}],20:[function(a,b,c){"use strict";for(var d=a("./utils"),e=a("./support"),f=a("./nodeBuffer"),g=new Array(256),h=0;256>h;h++)g[h]=h>=252?6:h>=248?5:h>=240?4:h>=224?3:h>=192?2:1;g[254]=g[254]=1;var i=function(a){var b,c,d,f,g,h=a.length,i=0;for(f=0;h>f;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),i+=128>c?1:2048>c?2:65536>c?3:4;for(b=e.uint8array?new Uint8Array(i):new Array(i),g=0,f=0;i>g;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),128>c?b[g++]=c:2048>c?(b[g++]=192|c>>>6,b[g++]=128|63&c):65536>c?(b[g++]=224|c>>>12,b[g++]=128|c>>>6&63,b[g++]=128|63&c):(b[g++]=240|c>>>18,b[g++]=128|c>>>12&63,b[g++]=128|c>>>6&63,b[g++]=128|63&c);return b},j=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128===(192&a[c]);)c--;return 0>c?b:0===c?b:c+g[a[c]]>b?c:b},k=function(a){var b,c,e,f,h=a.length,i=new Array(2*h);for(c=0,b=0;h>b;)if(e=a[b++],128>e)i[c++]=e;else if(f=g[e],f>4)i[c++]=65533,b+=f-1;else{for(e&=2===f?31:3===f?15:7;f>1&&h>b;)e=e<<6|63&a[b++],f--;f>1?i[c++]=65533:65536>e?i[c++]=e:(e-=65536,i[c++]=55296|e>>10&1023,i[c++]=56320|1023&e)}return i.length!==c&&(i.subarray?i=i.subarray(0,c):i.length=c),d.applyFromCharCode(i)};c.utf8encode=function(a){return e.nodebuffer?f(a,"utf-8"):i(a)},c.utf8decode=function(a){if(e.nodebuffer)return d.transformTo("nodebuffer",a).toString("utf-8");a=d.transformTo(e.uint8array?"uint8array":"array",a);for(var b=[],c=0,f=a.length,g=65536;f>c;){var h=j(a,Math.min(c+g,f));b.push(e.uint8array?k(a.subarray(c,h)):k(a.slice(c,h))),c=h}return b.join("")}},{"./nodeBuffer":11,"./support":17,"./utils":21}],21:[function(a,b,c){"use strict";function d(a){return a}function e(a,b){for(var c=0;c<a.length;++c)b[c]=255&a.charCodeAt(c);return b}function f(a){var b=65536,d=[],e=a.length,f=c.getTypeOf(a),g=0,h=!0;try{switch(f){case"uint8array":String.fromCharCode.apply(null,new Uint8Array(0));break;case"nodebuffer":String.fromCharCode.apply(null,j(0))}}catch(i){h=!1}if(!h){for(var k="",l=0;l<a.length;l++)k+=String.fromCharCode(a[l]);return k}for(;e>g&&b>1;)try{d.push("array"===f||"nodebuffer"===f?String.fromCharCode.apply(null,a.slice(g,Math.min(g+b,e))):String.fromCharCode.apply(null,a.subarray(g,Math.min(g+b,e)))),g+=b}catch(i){b=Math.floor(b/2)}return d.join("")}function g(a,b){for(var c=0;c<a.length;c++)b[c]=a[c];return b}var h=a("./support"),i=a("./compressions"),j=a("./nodeBuffer");c.string2binary=function(a){for(var b="",c=0;c<a.length;c++)b+=String.fromCharCode(255&a.charCodeAt(c));return b},c.arrayBuffer2Blob=function(a){c.checkSupport("blob");try{return new Blob([a],{type:"application/zip"})}catch(b){try{var d=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder,e=new d;return e.append(a),e.getBlob("application/zip")}catch(b){throw new Error("Bug : can't construct the Blob.")}}},c.applyFromCharCode=f;var k={};k.string={string:d,array:function(a){return e(a,new Array(a.length))},arraybuffer:function(a){return k.string.uint8array(a).buffer},uint8array:function(a){return e(a,new Uint8Array(a.length))},nodebuffer:function(a){return e(a,j(a.length))}},k.array={string:f,array:d,arraybuffer:function(a){return new Uint8Array(a).buffer},uint8array:function(a){return new Uint8Array(a)},nodebuffer:function(a){return j(a)}},k.arraybuffer={string:function(a){return f(new Uint8Array(a))},array:function(a){return g(new Uint8Array(a),new Array(a.byteLength))},arraybuffer:d,uint8array:function(a){return new Uint8Array(a)},nodebuffer:function(a){return j(new Uint8Array(a))}},k.uint8array={string:f,array:function(a){return g(a,new Array(a.length))},arraybuffer:function(a){return a.buffer},uint8array:d,nodebuffer:function(a){return j(a)}},k.nodebuffer={string:f,array:function(a){return g(a,new Array(a.length))},arraybuffer:function(a){return k.nodebuffer.uint8array(a).buffer},uint8array:function(a){return g(a,new Uint8Array(a.length))},nodebuffer:d},c.transformTo=function(a,b){if(b||(b=""),!a)return b;c.checkSupport(a);var d=c.getTypeOf(b),e=k[d][a](b);return e},c.getTypeOf=function(a){return"string"==typeof a?"string":"[object Array]"===Object.prototype.toString.call(a)?"array":h.nodebuffer&&j.test(a)?"nodebuffer":h.uint8array&&a instanceof Uint8Array?"uint8array":h.arraybuffer&&a instanceof ArrayBuffer?"arraybuffer":void 0},c.checkSupport=function(a){var b=h[a.toLowerCase()];if(!b)throw new Error(a+" is not supported by this browser")},c.MAX_VALUE_16BITS=65535,c.MAX_VALUE_32BITS=-1,c.pretty=function(a){var b,c,d="";for(c=0;c<(a||"").length;c++)b=a.charCodeAt(c),d+="\\x"+(16>b?"0":"")+b.toString(16).toUpperCase();return d},c.findCompression=function(a){for(var b in i)if(i.hasOwnProperty(b)&&i[b].magic===a)return i[b];return null},c.isRegExp=function(a){return"[object RegExp]"===Object.prototype.toString.call(a)}},{"./compressions":3,"./nodeBuffer":11,"./support":17}],22:[function(a,b){"use strict";function c(a,b){this.files=[],this.loadOptions=b,a&&this.load(a)}var d=a("./stringReader"),e=a("./nodeBufferReader"),f=a("./uint8ArrayReader"),g=a("./utils"),h=a("./signature"),i=a("./zipEntry"),j=a("./support"),k=a("./object");c.prototype={checkSignature:function(a){var b=this.reader.readString(4);if(b!==a)throw new Error("Corrupted zip or bug : unexpected signature ("+g.pretty(b)+", expected "+g.pretty(a)+")")},readBlockEndOfCentral:function(){this.diskNumber=this.reader.readInt(2),this.diskWithCentralDirStart=this.reader.readInt(2),this.centralDirRecordsOnThisDisk=this.reader.readInt(2),this.centralDirRecords=this.reader.readInt(2),this.centralDirSize=this.reader.readInt(4),this.centralDirOffset=this.reader.readInt(4),this.zipCommentLength=this.reader.readInt(2),this.zipComment=this.reader.readString(this.zipCommentLength),this.zipComment=k.utf8decode(this.zipComment)},readBlockZip64EndOfCentral:function(){this.zip64EndOfCentralSize=this.reader.readInt(8),this.versionMadeBy=this.reader.readString(2),this.versionNeeded=this.reader.readInt(2),this.diskNumber=this.reader.readInt(4),this.diskWithCentralDirStart=this.reader.readInt(4),this.centralDirRecordsOnThisDisk=this.reader.readInt(8),this.centralDirRecords=this.reader.readInt(8),this.centralDirSize=this.reader.readInt(8),this.centralDirOffset=this.reader.readInt(8),this.zip64ExtensibleData={};for(var a,b,c,d=this.zip64EndOfCentralSize-44,e=0;d>e;)a=this.reader.readInt(2),b=this.reader.readInt(4),c=this.reader.readString(b),this.zip64ExtensibleData[a]={id:a,length:b,value:c}},readBlockZip64EndOfCentralLocator:function(){if(this.diskWithZip64CentralDirStart=this.reader.readInt(4),this.relativeOffsetEndOfZip64CentralDir=this.reader.readInt(8),this.disksCount=this.reader.readInt(4),this.disksCount>1)throw new Error("Multi-volumes zip are not supported")},readLocalFiles:function(){var a,b;for(a=0;a<this.files.length;a++)b=this.files[a],this.reader.setIndex(b.localHeaderOffset),this.checkSignature(h.LOCAL_FILE_HEADER),b.readLocalPart(this.reader),b.handleUTF8()},readCentralDir:function(){var a;for(this.reader.setIndex(this.centralDirOffset);this.reader.readString(4)===h.CENTRAL_FILE_HEADER;)a=new i({zip64:this.zip64},this.loadOptions),a.readCentralPart(this.reader),this.files.push(a)},readEndOfCentral:function(){var a=this.reader.lastIndexOfSignature(h.CENTRAL_DIRECTORY_END);if(-1===a)throw new Error("Corrupted zip : can't find end of central directory");if(this.reader.setIndex(a),this.checkSignature(h.CENTRAL_DIRECTORY_END),this.readBlockEndOfCentral(),this.diskNumber===g.MAX_VALUE_16BITS||this.diskWithCentralDirStart===g.MAX_VALUE_16BITS||this.centralDirRecordsOnThisDisk===g.MAX_VALUE_16BITS||this.centralDirRecords===g.MAX_VALUE_16BITS||this.centralDirSize===g.MAX_VALUE_32BITS||this.centralDirOffset===g.MAX_VALUE_32BITS){if(this.zip64=!0,a=this.reader.lastIndexOfSignature(h.ZIP64_CENTRAL_DIRECTORY_LOCATOR),-1===a)throw new Error("Corrupted zip : can't find the ZIP64 end of central directory locator");this.reader.setIndex(a),this.checkSignature(h.ZIP64_CENTRAL_DIRECTORY_LOCATOR),this.readBlockZip64EndOfCentralLocator(),this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir),this.checkSignature(h.ZIP64_CENTRAL_DIRECTORY_END),this.readBlockZip64EndOfCentral()}},prepareReader:function(a){var b=g.getTypeOf(a);this.reader="string"!==b||j.uint8array?"nodebuffer"===b?new e(a):new f(g.transformTo("uint8array",a)):new d(a,this.loadOptions.optimizedBinaryString)},load:function(a){this.prepareReader(a),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}},b.exports=c},{"./nodeBufferReader":12,"./object":13,"./signature":14,"./stringReader":15,"./support":17,"./uint8ArrayReader":18,"./utils":21,"./zipEntry":23}],23:[function(a,b){"use strict";function c(a,b){this.options=a,this.loadOptions=b}var d=a("./stringReader"),e=a("./utils"),f=a("./compressedObject"),g=a("./object");c.prototype={isEncrypted:function(){return 1===(1&this.bitFlag)},useUTF8:function(){return 2048===(2048&this.bitFlag)},prepareCompressedContent:function(a,b,c){return function(){var d=a.index;a.setIndex(b);var e=a.readData(c);return a.setIndex(d),e}},prepareContent:function(a,b,c,d,f){return function(){var a=e.transformTo(d.uncompressInputType,this.getCompressedContent()),b=d.uncompress(a);if(b.length!==f)throw new Error("Bug : uncompressed data size mismatch");return b}},readLocalPart:function(a){var b,c;if(a.skip(22),this.fileNameLength=a.readInt(2),c=a.readInt(2),this.fileName=a.readString(this.fileNameLength),a.skip(c),-1==this.compressedSize||-1==this.uncompressedSize)throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory (compressedSize == -1 || uncompressedSize == -1)");if(b=e.findCompression(this.compressionMethod),null===b)throw new Error("Corrupted zip : compression "+e.pretty(this.compressionMethod)+" unknown (inner file : "+this.fileName+")");if(this.decompressed=new f,this.decompressed.compressedSize=this.compressedSize,this.decompressed.uncompressedSize=this.uncompressedSize,this.decompressed.crc32=this.crc32,this.decompressed.compressionMethod=this.compressionMethod,this.decompressed.getCompressedContent=this.prepareCompressedContent(a,a.index,this.compressedSize,b),this.decompressed.getContent=this.prepareContent(a,a.index,this.compressedSize,b,this.uncompressedSize),this.loadOptions.checkCRC32&&(this.decompressed=e.transformTo("string",this.decompressed.getContent()),g.crc32(this.decompressed)!==this.crc32))throw new Error("Corrupted zip : CRC32 mismatch")},readCentralPart:function(a){if(this.versionMadeBy=a.readString(2),this.versionNeeded=a.readInt(2),this.bitFlag=a.readInt(2),this.compressionMethod=a.readString(2),this.date=a.readDate(),this.crc32=a.readInt(4),this.compressedSize=a.readInt(4),this.uncompressedSize=a.readInt(4),this.fileNameLength=a.readInt(2),this.extraFieldsLength=a.readInt(2),this.fileCommentLength=a.readInt(2),this.diskNumberStart=a.readInt(2),this.internalFileAttributes=a.readInt(2),this.externalFileAttributes=a.readInt(4),this.localHeaderOffset=a.readInt(4),this.isEncrypted())throw new Error("Encrypted zip are not supported");this.fileName=a.readString(this.fileNameLength),this.readExtraFields(a),this.parseZIP64ExtraField(a),this.fileComment=a.readString(this.fileCommentLength),this.dir=16&this.externalFileAttributes?!0:!1},parseZIP64ExtraField:function(){if(this.extraFields[1]){var a=new d(this.extraFields[1].value);this.uncompressedSize===e.MAX_VALUE_32BITS&&(this.uncompressedSize=a.readInt(8)),this.compressedSize===e.MAX_VALUE_32BITS&&(this.compressedSize=a.readInt(8)),this.localHeaderOffset===e.MAX_VALUE_32BITS&&(this.localHeaderOffset=a.readInt(8)),this.diskNumberStart===e.MAX_VALUE_32BITS&&(this.diskNumberStart=a.readInt(4))}},readExtraFields:function(a){var b,c,d,e=a.index;for(this.extraFields=this.extraFields||{};a.index<e+this.extraFieldsLength;)b=a.readInt(2),c=a.readInt(2),d=a.readString(c),this.extraFields[b]={id:b,length:c,value:d}},handleUTF8:function(){if(this.useUTF8())this.fileName=g.utf8decode(this.fileName),this.fileComment=g.utf8decode(this.fileComment);else{var a=this.findExtraFieldUnicodePath();null!==a&&(this.fileName=a);var b=this.findExtraFieldUnicodeComment();null!==b&&(this.fileComment=b)}},findExtraFieldUnicodePath:function(){var a=this.extraFields[28789];if(a){var b=new d(a.value);return 1!==b.readInt(1)?null:g.crc32(this.fileName)!==b.readInt(4)?null:g.utf8decode(b.readString(a.length-5))}return null},findExtraFieldUnicodeComment:function(){var a=this.extraFields[25461];if(a){var b=new d(a.value);return 1!==b.readInt(1)?null:g.crc32(this.fileComment)!==b.readInt(4)?null:g.utf8decode(b.readString(a.length-5))}return null}},b.exports=c},{"./compressedObject":2,"./object":13,"./stringReader":15,"./utils":21}],24:[function(a,b){"use strict";var c=a("./lib/utils/common").assign,d=a("./lib/deflate"),e=a("./lib/inflate"),f=a("./lib/zlib/constants"),g={};c(g,d,e,f),b.exports=g},{"./lib/deflate":25,"./lib/inflate":26,"./lib/utils/common":27,"./lib/zlib/constants":30}],25:[function(a,b,c){"use strict";function d(a,b){var c=new s(b);if(c.push(a,!0),c.err)throw c.msg;return c.result}function e(a,b){return b=b||{},b.raw=!0,d(a,b)}function f(a,b){return b=b||{},b.gzip=!0,d(a,b)}var g=a("./zlib/deflate.js"),h=a("./utils/common"),i=a("./utils/strings"),j=a("./zlib/messages"),k=a("./zlib/zstream"),l=0,m=4,n=0,o=1,p=-1,q=0,r=8,s=function(a){this.options=h.assign({level:p,method:r,chunkSize:16384,windowBits:15,memLevel:8,strategy:q,to:""},a||{});var b=this.options;b.raw&&b.windowBits>0?b.windowBits=-b.windowBits:b.gzip&&b.windowBits>0&&b.windowBits<16&&(b.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new k,this.strm.avail_out=0;var c=g.deflateInit2(this.strm,b.level,b.method,b.windowBits,b.memLevel,b.strategy);if(c!==n)throw new Error(j[c]);b.header&&g.deflateSetHeader(this.strm,b.header)};s.prototype.push=function(a,b){var c,d,e=this.strm,f=this.options.chunkSize;if(this.ended)return!1;d=b===~~b?b:b===!0?m:l,e.input="string"==typeof a?i.string2buf(a):a,e.next_in=0,e.avail_in=e.input.length;do{if(0===e.avail_out&&(e.output=new h.Buf8(f),e.next_out=0,e.avail_out=f),c=g.deflate(e,d),c!==o&&c!==n)return this.onEnd(c),this.ended=!0,!1;(0===e.avail_out||0===e.avail_in&&d===m)&&this.onData("string"===this.options.to?i.buf2binstring(h.shrinkBuf(e.output,e.next_out)):h.shrinkBuf(e.output,e.next_out))}while((e.avail_in>0||0===e.avail_out)&&c!==o);return d===m?(c=g.deflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===n):!0},s.prototype.onData=function(a){this.chunks.push(a)},s.prototype.onEnd=function(a){a===n&&(this.result="string"===this.options.to?this.chunks.join(""):h.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Deflate=s,c.deflate=d,c.deflateRaw=e,c.gzip=f},{"./utils/common":27,"./utils/strings":28,"./zlib/deflate.js":32,"./zlib/messages":37,"./zlib/zstream":39}],26:[function(a,b,c){"use strict";function d(a,b){var c=new m(b);if(c.push(a,!0),c.err)throw c.msg;return c.result}function e(a,b){return b=b||{},b.raw=!0,d(a,b)}var f=a("./zlib/inflate.js"),g=a("./utils/common"),h=a("./utils/strings"),i=a("./zlib/constants"),j=a("./zlib/messages"),k=a("./zlib/zstream"),l=a("./zlib/gzheader"),m=function(a){this.options=g.assign({chunkSize:16384,windowBits:0,to:""},a||{});var b=this.options;b.raw&&b.windowBits>=0&&b.windowBits<16&&(b.windowBits=-b.windowBits,0===b.windowBits&&(b.windowBits=-15)),!(b.windowBits>=0&&b.windowBits<16)||a&&a.windowBits||(b.windowBits+=32),b.windowBits>15&&b.windowBits<48&&0===(15&b.windowBits)&&(b.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new k,this.strm.avail_out=0;var c=f.inflateInit2(this.strm,b.windowBits);if(c!==i.Z_OK)throw new Error(j[c]);this.header=new l,f.inflateGetHeader(this.strm,this.header)};m.prototype.push=function(a,b){var c,d,e,j,k,l=this.strm,m=this.options.chunkSize;if(this.ended)return!1;d=b===~~b?b:b===!0?i.Z_FINISH:i.Z_NO_FLUSH,l.input="string"==typeof a?h.binstring2buf(a):a,l.next_in=0,l.avail_in=l.input.length;do{if(0===l.avail_out&&(l.output=new g.Buf8(m),l.next_out=0,l.avail_out=m),c=f.inflate(l,i.Z_NO_FLUSH),c!==i.Z_STREAM_END&&c!==i.Z_OK)return this.onEnd(c),this.ended=!0,!1;l.next_out&&(0===l.avail_out||c===i.Z_STREAM_END||0===l.avail_in&&d===i.Z_FINISH)&&("string"===this.options.to?(e=h.utf8border(l.output,l.next_out),j=l.next_out-e,k=h.buf2string(l.output,e),l.next_out=j,l.avail_out=m-j,j&&g.arraySet(l.output,l.output,e,j,0),this.onData(k)):this.onData(g.shrinkBuf(l.output,l.next_out)))}while(l.avail_in>0&&c!==i.Z_STREAM_END);return c===i.Z_STREAM_END&&(d=i.Z_FINISH),d===i.Z_FINISH?(c=f.inflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===i.Z_OK):!0},m.prototype.onData=function(a){this.chunks.push(a)},m.prototype.onEnd=function(a){a===i.Z_OK&&(this.result="string"===this.options.to?this.chunks.join(""):g.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Inflate=m,c.inflate=d,c.inflateRaw=e,c.ungzip=d},{"./utils/common":27,"./utils/strings":28,"./zlib/constants":30,"./zlib/gzheader":33,"./zlib/inflate.js":35,"./zlib/messages":37,"./zlib/zstream":39}],27:[function(a,b,c){"use strict";var d="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;c.assign=function(a){for(var b=Array.prototype.slice.call(arguments,1);b.length;){var c=b.shift();if(c){if("object"!=typeof c)throw new TypeError(c+"must be non-object");for(var d in c)c.hasOwnProperty(d)&&(a[d]=c[d])}}return a},c.shrinkBuf=function(a,b){return a.length===b?a:a.subarray?a.subarray(0,b):(a.length=b,a)};var e={arraySet:function(a,b,c,d,e){if(b.subarray&&a.subarray)return void a.set(b.subarray(c,c+d),e);for(var f=0;d>f;f++)a[e+f]=b[c+f]},flattenChunks:function(a){var b,c,d,e,f,g;for(d=0,b=0,c=a.length;c>b;b++)d+=a[b].length;for(g=new Uint8Array(d),e=0,b=0,c=a.length;c>b;b++)f=a[b],g.set(f,e),e+=f.length;return g}},f={arraySet:function(a,b,c,d,e){for(var f=0;d>f;f++)a[e+f]=b[c+f]},flattenChunks:function(a){return[].concat.apply([],a)}};c.setTyped=function(a){a?(c.Buf8=Uint8Array,c.Buf16=Uint16Array,c.Buf32=Int32Array,c.assign(c,e)):(c.Buf8=Array,c.Buf16=Array,c.Buf32=Array,c.assign(c,f))},c.setTyped(d)},{}],28:[function(a,b,c){"use strict";function d(a,b){if(65537>b&&(a.subarray&&g||!a.subarray&&f))return String.fromCharCode.apply(null,e.shrinkBuf(a,b));for(var c="",d=0;b>d;d++)c+=String.fromCharCode(a[d]);return c}var e=a("./common"),f=!0,g=!0;try{String.fromCharCode.apply(null,[0])}catch(h){f=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(h){g=!1}for(var i=new e.Buf8(256),j=0;256>j;j++)i[j]=j>=252?6:j>=248?5:j>=240?4:j>=224?3:j>=192?2:1;i[254]=i[254]=1,c.string2buf=function(a){var b,c,d,f,g,h=a.length,i=0;for(f=0;h>f;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),i+=128>c?1:2048>c?2:65536>c?3:4;for(b=new e.Buf8(i),g=0,f=0;i>g;f++)c=a.charCodeAt(f),55296===(64512&c)&&h>f+1&&(d=a.charCodeAt(f+1),56320===(64512&d)&&(c=65536+(c-55296<<10)+(d-56320),f++)),128>c?b[g++]=c:2048>c?(b[g++]=192|c>>>6,b[g++]=128|63&c):65536>c?(b[g++]=224|c>>>12,b[g++]=128|c>>>6&63,b[g++]=128|63&c):(b[g++]=240|c>>>18,b[g++]=128|c>>>12&63,b[g++]=128|c>>>6&63,b[g++]=128|63&c);return b},c.buf2binstring=function(a){return d(a,a.length)},c.binstring2buf=function(a){for(var b=new e.Buf8(a.length),c=0,d=b.length;d>c;c++)b[c]=a.charCodeAt(c);return b},c.buf2string=function(a,b){var c,e,f,g,h=b||a.length,j=new Array(2*h);for(e=0,c=0;h>c;)if(f=a[c++],128>f)j[e++]=f;else if(g=i[f],g>4)j[e++]=65533,c+=g-1;else{for(f&=2===g?31:3===g?15:7;g>1&&h>c;)f=f<<6|63&a[c++],g--;g>1?j[e++]=65533:65536>f?j[e++]=f:(f-=65536,j[e++]=55296|f>>10&1023,j[e++]=56320|1023&f)}return d(j,e)},c.utf8border=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128===(192&a[c]);)c--;return 0>c?b:0===c?b:c+i[a[c]]>b?c:b}},{"./common":27}],29:[function(a,b){"use strict";function c(a,b,c,d){for(var e=65535&a|0,f=a>>>16&65535|0,g=0;0!==c;){g=c>2e3?2e3:c,c-=g;do e=e+b[d++]|0,f=f+e|0;while(--g);e%=65521,f%=65521}return e|f<<16|0}b.exports=c},{}],30:[function(a,b){b.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],31:[function(a,b){"use strict";function c(){for(var a,b=[],c=0;256>c;c++){a=c;for(var d=0;8>d;d++)a=1&a?3988292384^a>>>1:a>>>1;b[c]=a}return b}function d(a,b,c,d){var f=e,g=d+c;a=-1^a;for(var h=d;g>h;h++)a=a>>>8^f[255&(a^b[h])];return-1^a}var e=c();b.exports=d},{}],32:[function(a,b,c){"use strict";function d(a,b){return a.msg=G[b],b}function e(a){return(a<<1)-(a>4?9:0)}function f(a){for(var b=a.length;--b>=0;)a[b]=0}function g(a){var b=a.state,c=b.pending;c>a.avail_out&&(c=a.avail_out),0!==c&&(C.arraySet(a.output,b.pending_buf,b.pending_out,c,a.next_out),a.next_out+=c,b.pending_out+=c,a.total_out+=c,a.avail_out-=c,b.pending-=c,0===b.pending&&(b.pending_out=0))}function h(a,b){D._tr_flush_block(a,a.block_start>=0?a.block_start:-1,a.strstart-a.block_start,b),a.block_start=a.strstart,g(a.strm)}function i(a,b){a.pending_buf[a.pending++]=b}function j(a,b){a.pending_buf[a.pending++]=b>>>8&255,a.pending_buf[a.pending++]=255&b}function k(a,b,c,d){var e=a.avail_in;return e>d&&(e=d),0===e?0:(a.avail_in-=e,C.arraySet(b,a.input,a.next_in,e,c),1===a.state.wrap?a.adler=E(a.adler,b,e,c):2===a.state.wrap&&(a.adler=F(a.adler,b,e,c)),a.next_in+=e,a.total_in+=e,e)}function l(a,b){var c,d,e=a.max_chain_length,f=a.strstart,g=a.prev_length,h=a.nice_match,i=a.strstart>a.w_size-jb?a.strstart-(a.w_size-jb):0,j=a.window,k=a.w_mask,l=a.prev,m=a.strstart+ib,n=j[f+g-1],o=j[f+g];a.prev_length>=a.good_match&&(e>>=2),h>a.lookahead&&(h=a.lookahead);do if(c=b,j[c+g]===o&&j[c+g-1]===n&&j[c]===j[f]&&j[++c]===j[f+1]){f+=2,c++;do;while(j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&m>f);if(d=ib-(m-f),f=m-ib,d>g){if(a.match_start=b,g=d,d>=h)break;n=j[f+g-1],o=j[f+g]}}while((b=l[b&k])>i&&0!==--e);return g<=a.lookahead?g:a.lookahead}function m(a){var b,c,d,e,f,g=a.w_size;do{if(e=a.window_size-a.lookahead-a.strstart,a.strstart>=g+(g-jb)){C.arraySet(a.window,a.window,g,g,0),a.match_start-=g,a.strstart-=g,a.block_start-=g,c=a.hash_size,b=c;do d=a.head[--b],a.head[b]=d>=g?d-g:0;while(--c);c=g,b=c;do d=a.prev[--b],a.prev[b]=d>=g?d-g:0;while(--c);e+=g}if(0===a.strm.avail_in)break;if(c=k(a.strm,a.window,a.strstart+a.lookahead,e),a.lookahead+=c,a.lookahead+a.insert>=hb)for(f=a.strstart-a.insert,a.ins_h=a.window[f],a.ins_h=(a.ins_h<<a.hash_shift^a.window[f+1])&a.hash_mask;a.insert&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[f+hb-1])&a.hash_mask,a.prev[f&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=f,f++,a.insert--,!(a.lookahead+a.insert<hb)););}while(a.lookahead<jb&&0!==a.strm.avail_in)}function n(a,b){var c=65535;for(c>a.pending_buf_size-5&&(c=a.pending_buf_size-5);;){if(a.lookahead<=1){if(m(a),0===a.lookahead&&b===H)return sb;if(0===a.lookahead)break}a.strstart+=a.lookahead,a.lookahead=0;var d=a.block_start+c;if((0===a.strstart||a.strstart>=d)&&(a.lookahead=a.strstart-d,a.strstart=d,h(a,!1),0===a.strm.avail_out))return sb;if(a.strstart-a.block_start>=a.w_size-jb&&(h(a,!1),0===a.strm.avail_out))return sb}return a.insert=0,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.strstart>a.block_start&&(h(a,!1),0===a.strm.avail_out)?sb:sb}function o(a,b){for(var c,d;;){if(a.lookahead<jb){if(m(a),a.lookahead<jb&&b===H)return sb;if(0===a.lookahead)break}if(c=0,a.lookahead>=hb&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+hb-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=a.strstart),0!==c&&a.strstart-c<=a.w_size-jb&&(a.match_length=l(a,c)),a.match_length>=hb)if(d=D._tr_tally(a,a.strstart-a.match_start,a.match_length-hb),a.lookahead-=a.match_length,a.match_length<=a.max_lazy_match&&a.lookahead>=hb){a.match_length--;do a.strstart++,a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+hb-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=a.strstart;while(0!==--a.match_length);a.strstart++}else a.strstart+=a.match_length,a.match_length=0,a.ins_h=a.window[a.strstart],a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+1])&a.hash_mask;else d=D._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++;if(d&&(h(a,!1),0===a.strm.avail_out))return sb}return a.insert=a.strstart<hb-1?a.strstart:hb-1,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?sb:tb}function p(a,b){for(var c,d,e;;){if(a.lookahead<jb){if(m(a),a.lookahead<jb&&b===H)return sb;if(0===a.lookahead)break}if(c=0,a.lookahead>=hb&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+hb-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=a.strstart),a.prev_length=a.match_length,a.prev_match=a.match_start,a.match_length=hb-1,0!==c&&a.prev_length<a.max_lazy_match&&a.strstart-c<=a.w_size-jb&&(a.match_length=l(a,c),a.match_length<=5&&(a.strategy===S||a.match_length===hb&&a.strstart-a.match_start>4096)&&(a.match_length=hb-1)),a.prev_length>=hb&&a.match_length<=a.prev_length){e=a.strstart+a.lookahead-hb,d=D._tr_tally(a,a.strstart-1-a.prev_match,a.prev_length-hb),a.lookahead-=a.prev_length-1,a.prev_length-=2;do++a.strstart<=e&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+hb-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=a.strstart);while(0!==--a.prev_length);if(a.match_available=0,a.match_length=hb-1,a.strstart++,d&&(h(a,!1),0===a.strm.avail_out))return sb}else if(a.match_available){if(d=D._tr_tally(a,0,a.window[a.strstart-1]),d&&h(a,!1),a.strstart++,a.lookahead--,0===a.strm.avail_out)return sb}else a.match_available=1,a.strstart++,a.lookahead--}return a.match_available&&(d=D._tr_tally(a,0,a.window[a.strstart-1]),a.match_available=0),a.insert=a.strstart<hb-1?a.strstart:hb-1,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?sb:tb}function q(a,b){for(var c,d,e,f,g=a.window;;){if(a.lookahead<=ib){if(m(a),a.lookahead<=ib&&b===H)return sb;if(0===a.lookahead)break}if(a.match_length=0,a.lookahead>=hb&&a.strstart>0&&(e=a.strstart-1,d=g[e],d===g[++e]&&d===g[++e]&&d===g[++e])){f=a.strstart+ib;do;while(d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&f>e);a.match_length=ib-(f-e),a.match_length>a.lookahead&&(a.match_length=a.lookahead)}if(a.match_length>=hb?(c=D._tr_tally(a,1,a.match_length-hb),a.lookahead-=a.match_length,a.strstart+=a.match_length,a.match_length=0):(c=D._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++),c&&(h(a,!1),0===a.strm.avail_out))return sb}return a.insert=0,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?sb:tb}function r(a,b){for(var c;;){if(0===a.lookahead&&(m(a),0===a.lookahead)){if(b===H)return sb;break}if(a.match_length=0,c=D._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++,c&&(h(a,!1),0===a.strm.avail_out))return sb}return a.insert=0,b===K?(h(a,!0),0===a.strm.avail_out?ub:vb):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?sb:tb}function s(a){a.window_size=2*a.w_size,f(a.head),a.max_lazy_match=B[a.level].max_lazy,a.good_match=B[a.level].good_length,a.nice_match=B[a.level].nice_length,a.max_chain_length=B[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=hb-1,a.match_available=0,a.ins_h=0}function t(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=Y,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new C.Buf16(2*fb),this.dyn_dtree=new C.Buf16(2*(2*db+1)),this.bl_tree=new C.Buf16(2*(2*eb+1)),f(this.dyn_ltree),f(this.dyn_dtree),f(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new C.Buf16(gb+1),this.heap=new C.Buf16(2*cb+1),f(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new C.Buf16(2*cb+1),f(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function u(a){var b;return a&&a.state?(a.total_in=a.total_out=0,a.data_type=X,b=a.state,b.pending=0,b.pending_out=0,b.wrap<0&&(b.wrap=-b.wrap),b.status=b.wrap?lb:qb,a.adler=2===b.wrap?0:1,b.last_flush=H,D._tr_init(b),M):d(a,O)}function v(a){var b=u(a);return b===M&&s(a.state),b}function w(a,b){return a&&a.state?2!==a.state.wrap?O:(a.state.gzhead=b,M):O}function x(a,b,c,e,f,g){if(!a)return O;var h=1;if(b===R&&(b=6),0>e?(h=0,e=-e):e>15&&(h=2,e-=16),1>f||f>Z||c!==Y||8>e||e>15||0>b||b>9||0>g||g>V)return d(a,O);8===e&&(e=9);var i=new t;return a.state=i,i.strm=a,i.wrap=h,i.gzhead=null,i.w_bits=e,i.w_size=1<<i.w_bits,i.w_mask=i.w_size-1,i.hash_bits=f+7,i.hash_size=1<<i.hash_bits,i.hash_mask=i.hash_size-1,i.hash_shift=~~((i.hash_bits+hb-1)/hb),i.window=new C.Buf8(2*i.w_size),i.head=new C.Buf16(i.hash_size),i.prev=new C.Buf16(i.w_size),i.lit_bufsize=1<<f+6,i.pending_buf_size=4*i.lit_bufsize,i.pending_buf=new C.Buf8(i.pending_buf_size),i.d_buf=i.lit_bufsize>>1,i.l_buf=3*i.lit_bufsize,i.level=b,i.strategy=g,i.method=c,v(a)}function y(a,b){return x(a,b,Y,$,_,W)}function z(a,b){var c,h,k,l;if(!a||!a.state||b>L||0>b)return a?d(a,O):O;if(h=a.state,!a.output||!a.input&&0!==a.avail_in||h.status===rb&&b!==K)return d(a,0===a.avail_out?Q:O);if(h.strm=a,c=h.last_flush,h.last_flush=b,h.status===lb)if(2===h.wrap)a.adler=0,i(h,31),i(h,139),i(h,8),h.gzhead?(i(h,(h.gzhead.text?1:0)+(h.gzhead.hcrc?2:0)+(h.gzhead.extra?4:0)+(h.gzhead.name?8:0)+(h.gzhead.comment?16:0)),i(h,255&h.gzhead.time),i(h,h.gzhead.time>>8&255),i(h,h.gzhead.time>>16&255),i(h,h.gzhead.time>>24&255),i(h,9===h.level?2:h.strategy>=T||h.level<2?4:0),i(h,255&h.gzhead.os),h.gzhead.extra&&h.gzhead.extra.length&&(i(h,255&h.gzhead.extra.length),i(h,h.gzhead.extra.length>>8&255)),h.gzhead.hcrc&&(a.adler=F(a.adler,h.pending_buf,h.pending,0)),h.gzindex=0,h.status=mb):(i(h,0),i(h,0),i(h,0),i(h,0),i(h,0),i(h,9===h.level?2:h.strategy>=T||h.level<2?4:0),i(h,wb),h.status=qb);else{var m=Y+(h.w_bits-8<<4)<<8,n=-1;n=h.strategy>=T||h.level<2?0:h.level<6?1:6===h.level?2:3,m|=n<<6,0!==h.strstart&&(m|=kb),m+=31-m%31,h.status=qb,j(h,m),0!==h.strstart&&(j(h,a.adler>>>16),j(h,65535&a.adler)),a.adler=1}if(h.status===mb)if(h.gzhead.extra){for(k=h.pending;h.gzindex<(65535&h.gzhead.extra.length)&&(h.pending!==h.pending_buf_size||(h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending!==h.pending_buf_size));)i(h,255&h.gzhead.extra[h.gzindex]),h.gzindex++;h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),h.gzindex===h.gzhead.extra.length&&(h.gzindex=0,h.status=nb)}else h.status=nb;if(h.status===nb)if(h.gzhead.name){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindex<h.gzhead.name.length?255&h.gzhead.name.charCodeAt(h.gzindex++):0,i(h,l)}while(0!==l);h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.gzindex=0,h.status=ob)}else h.status=ob;if(h.status===ob)if(h.gzhead.comment){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindex<h.gzhead.comment.length?255&h.gzhead.comment.charCodeAt(h.gzindex++):0,i(h,l)}while(0!==l);h.gzhead.hcrc&&h.pending>k&&(a.adler=F(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.status=pb)}else h.status=pb;if(h.status===pb&&(h.gzhead.hcrc?(h.pending+2>h.pending_buf_size&&g(a),h.pending+2<=h.pending_buf_size&&(i(h,255&a.adler),i(h,a.adler>>8&255),a.adler=0,h.status=qb)):h.status=qb),0!==h.pending){if(g(a),0===a.avail_out)return h.last_flush=-1,M}else if(0===a.avail_in&&e(b)<=e(c)&&b!==K)return d(a,Q);if(h.status===rb&&0!==a.avail_in)return d(a,Q);if(0!==a.avail_in||0!==h.lookahead||b!==H&&h.status!==rb){var o=h.strategy===T?r(h,b):h.strategy===U?q(h,b):B[h.level].func(h,b);if((o===ub||o===vb)&&(h.status=rb),o===sb||o===ub)return 0===a.avail_out&&(h.last_flush=-1),M;if(o===tb&&(b===I?D._tr_align(h):b!==L&&(D._tr_stored_block(h,0,0,!1),b===J&&(f(h.head),0===h.lookahead&&(h.strstart=0,h.block_start=0,h.insert=0))),g(a),0===a.avail_out))return h.last_flush=-1,M}return b!==K?M:h.wrap<=0?N:(2===h.wrap?(i(h,255&a.adler),i(h,a.adler>>8&255),i(h,a.adler>>16&255),i(h,a.adler>>24&255),i(h,255&a.total_in),i(h,a.total_in>>8&255),i(h,a.total_in>>16&255),i(h,a.total_in>>24&255)):(j(h,a.adler>>>16),j(h,65535&a.adler)),g(a),h.wrap>0&&(h.wrap=-h.wrap),0!==h.pending?M:N)}function A(a){var b;return a&&a.state?(b=a.state.status,b!==lb&&b!==mb&&b!==nb&&b!==ob&&b!==pb&&b!==qb&&b!==rb?d(a,O):(a.state=null,b===qb?d(a,P):M)):O}var B,C=a("../utils/common"),D=a("./trees"),E=a("./adler32"),F=a("./crc32"),G=a("./messages"),H=0,I=1,J=3,K=4,L=5,M=0,N=1,O=-2,P=-3,Q=-5,R=-1,S=1,T=2,U=3,V=4,W=0,X=2,Y=8,Z=9,$=15,_=8,ab=29,bb=256,cb=bb+1+ab,db=30,eb=19,fb=2*cb+1,gb=15,hb=3,ib=258,jb=ib+hb+1,kb=32,lb=42,mb=69,nb=73,ob=91,pb=103,qb=113,rb=666,sb=1,tb=2,ub=3,vb=4,wb=3,xb=function(a,b,c,d,e){this.good_length=a,this.max_lazy=b,this.nice_length=c,this.max_chain=d,this.func=e};B=[new xb(0,0,0,0,n),new xb(4,4,8,4,o),new xb(4,5,16,8,o),new xb(4,6,32,32,o),new xb(4,4,16,16,p),new xb(8,16,32,32,p),new xb(8,16,128,128,p),new xb(8,32,128,256,p),new xb(32,128,258,1024,p),new xb(32,258,258,4096,p)],c.deflateInit=y,c.deflateInit2=x,c.deflateReset=v,c.deflateResetKeep=u,c.deflateSetHeader=w,c.deflate=z,c.deflateEnd=A,c.deflateInfo="pako deflate (from Nodeca project)"},{"../utils/common":27,"./adler32":29,"./crc32":31,"./messages":37,"./trees":38}],33:[function(a,b){"use strict";function c(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}b.exports=c},{}],34:[function(a,b){"use strict";var c=30,d=12;b.exports=function(a,b){var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C;e=a.state,f=a.next_in,B=a.input,g=f+(a.avail_in-5),h=a.next_out,C=a.output,i=h-(b-a.avail_out),j=h+(a.avail_out-257),k=e.dmax,l=e.wsize,m=e.whave,n=e.wnext,o=e.window,p=e.hold,q=e.bits,r=e.lencode,s=e.distcode,t=(1<<e.lenbits)-1,u=(1<<e.distbits)-1;a:do{15>q&&(p+=B[f++]<<q,q+=8,p+=B[f++]<<q,q+=8),v=r[p&t];b:for(;;){if(w=v>>>24,p>>>=w,q-=w,w=v>>>16&255,0===w)C[h++]=65535&v;else{if(!(16&w)){if(0===(64&w)){v=r[(65535&v)+(p&(1<<w)-1)];continue b}if(32&w){e.mode=d;break a}a.msg="invalid literal/length code",e.mode=c;break a}x=65535&v,w&=15,w&&(w>q&&(p+=B[f++]<<q,q+=8),x+=p&(1<<w)-1,p>>>=w,q-=w),15>q&&(p+=B[f++]<<q,q+=8,p+=B[f++]<<q,q+=8),v=s[p&u];c:for(;;){if(w=v>>>24,p>>>=w,q-=w,w=v>>>16&255,!(16&w)){if(0===(64&w)){v=s[(65535&v)+(p&(1<<w)-1)];continue c}a.msg="invalid distance code",e.mode=c;break a}if(y=65535&v,w&=15,w>q&&(p+=B[f++]<<q,q+=8,w>q&&(p+=B[f++]<<q,q+=8)),y+=p&(1<<w)-1,y>k){a.msg="invalid distance too far back",e.mode=c;break a}if(p>>>=w,q-=w,w=h-i,y>w){if(w=y-w,w>m&&e.sane){a.msg="invalid distance too far back",e.mode=c;break a}if(z=0,A=o,0===n){if(z+=l-w,x>w){x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}}else if(w>n){if(z+=l+n-w,w-=n,x>w){x-=w;do C[h++]=o[z++];while(--w);if(z=0,x>n){w=n,x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}}}else if(z+=n-w,x>w){x-=w;do C[h++]=o[z++];while(--w);z=h-y,A=C}for(;x>2;)C[h++]=A[z++],C[h++]=A[z++],C[h++]=A[z++],x-=3;x&&(C[h++]=A[z++],x>1&&(C[h++]=A[z++]))}else{z=h-y;do C[h++]=C[z++],C[h++]=C[z++],C[h++]=C[z++],x-=3;while(x>2);x&&(C[h++]=C[z++],x>1&&(C[h++]=C[z++]))}break}}break}}while(g>f&&j>h);x=q>>3,f-=x,q-=x<<3,p&=(1<<q)-1,a.next_in=f,a.next_out=h,a.avail_in=g>f?5+(g-f):5-(f-g),a.avail_out=j>h?257+(j-h):257-(h-j),e.hold=p,e.bits=q}},{}],35:[function(a,b,c){"use strict";function d(a){return(a>>>24&255)+(a>>>8&65280)+((65280&a)<<8)+((255&a)<<24)}function e(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new r.Buf16(320),this.work=new r.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function f(a){var b;return a&&a.state?(b=a.state,a.total_in=a.total_out=b.total=0,a.msg="",b.wrap&&(a.adler=1&b.wrap),b.mode=K,b.last=0,b.havedict=0,b.dmax=32768,b.head=null,b.hold=0,b.bits=0,b.lencode=b.lendyn=new r.Buf32(ob),b.distcode=b.distdyn=new r.Buf32(pb),b.sane=1,b.back=-1,C):F}function g(a){var b;return a&&a.state?(b=a.state,b.wsize=0,b.whave=0,b.wnext=0,f(a)):F}function h(a,b){var c,d;return a&&a.state?(d=a.state,0>b?(c=0,b=-b):(c=(b>>4)+1,48>b&&(b&=15)),b&&(8>b||b>15)?F:(null!==d.window&&d.wbits!==b&&(d.window=null),d.wrap=c,d.wbits=b,g(a))):F}function i(a,b){var c,d;return a?(d=new e,a.state=d,d.window=null,c=h(a,b),c!==C&&(a.state=null),c):F}function j(a){return i(a,rb)}function k(a){if(sb){var b;for(p=new r.Buf32(512),q=new r.Buf32(32),b=0;144>b;)a.lens[b++]=8;for(;256>b;)a.lens[b++]=9;for(;280>b;)a.lens[b++]=7;for(;288>b;)a.lens[b++]=8;for(v(x,a.lens,0,288,p,0,a.work,{bits:9}),b=0;32>b;)a.lens[b++]=5;v(y,a.lens,0,32,q,0,a.work,{bits:5}),sb=!1}a.lencode=p,a.lenbits=9,a.distcode=q,a.distbits=5}function l(a,b,c,d){var e,f=a.state;return null===f.window&&(f.wsize=1<<f.wbits,f.wnext=0,f.whave=0,f.window=new r.Buf8(f.wsize)),d>=f.wsize?(r.arraySet(f.window,b,c-f.wsize,f.wsize,0),f.wnext=0,f.whave=f.wsize):(e=f.wsize-f.wnext,e>d&&(e=d),r.arraySet(f.window,b,c-d,e,f.wnext),d-=e,d?(r.arraySet(f.window,b,c-d,d,0),f.wnext=d,f.whave=f.wsize):(f.wnext+=e,f.wnext===f.wsize&&(f.wnext=0),f.whave<f.wsize&&(f.whave+=e))),0}function m(a,b){var c,e,f,g,h,i,j,m,n,o,p,q,ob,pb,qb,rb,sb,tb,ub,vb,wb,xb,yb,zb,Ab=0,Bb=new r.Buf8(4),Cb=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];if(!a||!a.state||!a.output||!a.input&&0!==a.avail_in)return F;c=a.state,c.mode===V&&(c.mode=W),h=a.next_out,f=a.output,j=a.avail_out,g=a.next_in,e=a.input,i=a.avail_in,m=c.hold,n=c.bits,o=i,p=j,xb=C;a:for(;;)switch(c.mode){case K:if(0===c.wrap){c.mode=W;break}for(;16>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(2&c.wrap&&35615===m){c.check=0,Bb[0]=255&m,Bb[1]=m>>>8&255,c.check=t(c.check,Bb,2,0),m=0,n=0,c.mode=L;break}if(c.flags=0,c.head&&(c.head.done=!1),!(1&c.wrap)||(((255&m)<<8)+(m>>8))%31){a.msg="incorrect header check",c.mode=lb;break}if((15&m)!==J){a.msg="unknown compression method",c.mode=lb;break}if(m>>>=4,n-=4,wb=(15&m)+8,0===c.wbits)c.wbits=wb;else if(wb>c.wbits){a.msg="invalid window size",c.mode=lb;break}c.dmax=1<<wb,a.adler=c.check=1,c.mode=512&m?T:V,m=0,n=0;break;case L:for(;16>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(c.flags=m,(255&c.flags)!==J){a.msg="unknown compression method",c.mode=lb;break}if(57344&c.flags){a.msg="unknown header flags set",c.mode=lb;break}c.head&&(c.head.text=m>>8&1),512&c.flags&&(Bb[0]=255&m,Bb[1]=m>>>8&255,c.check=t(c.check,Bb,2,0)),m=0,n=0,c.mode=M;case M:for(;32>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.head&&(c.head.time=m),512&c.flags&&(Bb[0]=255&m,Bb[1]=m>>>8&255,Bb[2]=m>>>16&255,Bb[3]=m>>>24&255,c.check=t(c.check,Bb,4,0)),m=0,n=0,c.mode=N;case N:for(;16>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.head&&(c.head.xflags=255&m,c.head.os=m>>8),512&c.flags&&(Bb[0]=255&m,Bb[1]=m>>>8&255,c.check=t(c.check,Bb,2,0)),m=0,n=0,c.mode=O;case O:if(1024&c.flags){for(;16>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.length=m,c.head&&(c.head.extra_len=m),512&c.flags&&(Bb[0]=255&m,Bb[1]=m>>>8&255,c.check=t(c.check,Bb,2,0)),m=0,n=0}else c.head&&(c.head.extra=null);c.mode=P;case P:if(1024&c.flags&&(q=c.length,q>i&&(q=i),q&&(c.head&&(wb=c.head.extra_len-c.length,c.head.extra||(c.head.extra=new Array(c.head.extra_len)),r.arraySet(c.head.extra,e,g,q,wb)),512&c.flags&&(c.check=t(c.check,e,q,g)),i-=q,g+=q,c.length-=q),c.length))break a;c.length=0,c.mode=Q;case Q:if(2048&c.flags){if(0===i)break a;q=0;do wb=e[g+q++],c.head&&wb&&c.length<65536&&(c.head.name+=String.fromCharCode(wb));while(wb&&i>q);if(512&c.flags&&(c.check=t(c.check,e,q,g)),i-=q,g+=q,wb)break a}else c.head&&(c.head.name=null);c.length=0,c.mode=R;case R:if(4096&c.flags){if(0===i)break a;q=0;do wb=e[g+q++],c.head&&wb&&c.length<65536&&(c.head.comment+=String.fromCharCode(wb));while(wb&&i>q);if(512&c.flags&&(c.check=t(c.check,e,q,g)),i-=q,g+=q,wb)break a}else c.head&&(c.head.comment=null);c.mode=S;case S:if(512&c.flags){for(;16>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(m!==(65535&c.check)){a.msg="header crc mismatch",c.mode=lb;break}m=0,n=0}c.head&&(c.head.hcrc=c.flags>>9&1,c.head.done=!0),a.adler=c.check=0,c.mode=V;break;case T:for(;32>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}a.adler=c.check=d(m),m=0,n=0,c.mode=U;case U:if(0===c.havedict)return a.next_out=h,a.avail_out=j,a.next_in=g,a.avail_in=i,c.hold=m,c.bits=n,E;a.adler=c.check=1,c.mode=V;case V:if(b===A||b===B)break a;case W:if(c.last){m>>>=7&n,n-=7&n,c.mode=ib;break}for(;3>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}switch(c.last=1&m,m>>>=1,n-=1,3&m){case 0:c.mode=X;break;case 1:if(k(c),c.mode=bb,b===B){m>>>=2,n-=2;break a}break;case 2:c.mode=$;break;case 3:a.msg="invalid block type",c.mode=lb}m>>>=2,n-=2;break;case X:for(m>>>=7&n,n-=7&n;32>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if((65535&m)!==(m>>>16^65535)){a.msg="invalid stored block lengths",c.mode=lb;break}if(c.length=65535&m,m=0,n=0,c.mode=Y,b===B)break a;case Y:c.mode=Z;case Z:if(q=c.length){if(q>i&&(q=i),q>j&&(q=j),0===q)break a;r.arraySet(f,e,g,q,h),i-=q,g+=q,j-=q,h+=q,c.length-=q;break}c.mode=V;break;case $:for(;14>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(c.nlen=(31&m)+257,m>>>=5,n-=5,c.ndist=(31&m)+1,m>>>=5,n-=5,c.ncode=(15&m)+4,m>>>=4,n-=4,c.nlen>286||c.ndist>30){a.msg="too many length or distance symbols",c.mode=lb;break}c.have=0,c.mode=_;case _:for(;c.have<c.ncode;){for(;3>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.lens[Cb[c.have++]]=7&m,m>>>=3,n-=3}for(;c.have<19;)c.lens[Cb[c.have++]]=0;if(c.lencode=c.lendyn,c.lenbits=7,yb={bits:c.lenbits},xb=v(w,c.lens,0,19,c.lencode,0,c.work,yb),c.lenbits=yb.bits,xb){a.msg="invalid code lengths set",c.mode=lb;break}c.have=0,c.mode=ab;case ab:for(;c.have<c.nlen+c.ndist;){for(;Ab=c.lencode[m&(1<<c.lenbits)-1],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=qb);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(16>sb)m>>>=qb,n-=qb,c.lens[c.have++]=sb;else{if(16===sb){for(zb=qb+2;zb>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(m>>>=qb,n-=qb,0===c.have){a.msg="invalid bit length repeat",c.mode=lb;break}wb=c.lens[c.have-1],q=3+(3&m),m>>>=2,n-=2}else if(17===sb){for(zb=qb+3;zb>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=qb,n-=qb,wb=0,q=3+(7&m),m>>>=3,n-=3}else{for(zb=qb+7;zb>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=qb,n-=qb,wb=0,q=11+(127&m),m>>>=7,n-=7}if(c.have+q>c.nlen+c.ndist){a.msg="invalid bit length repeat",c.mode=lb;break}for(;q--;)c.lens[c.have++]=wb}}if(c.mode===lb)break;if(0===c.lens[256]){a.msg="invalid code -- missing end-of-block",c.mode=lb;break}if(c.lenbits=9,yb={bits:c.lenbits},xb=v(x,c.lens,0,c.nlen,c.lencode,0,c.work,yb),c.lenbits=yb.bits,xb){a.msg="invalid literal/lengths set",c.mode=lb;break}if(c.distbits=6,c.distcode=c.distdyn,yb={bits:c.distbits},xb=v(y,c.lens,c.nlen,c.ndist,c.distcode,0,c.work,yb),c.distbits=yb.bits,xb){a.msg="invalid distances set",c.mode=lb;break}if(c.mode=bb,b===B)break a;case bb:c.mode=cb;case cb:if(i>=6&&j>=258){a.next_out=h,a.avail_out=j,a.next_in=g,a.avail_in=i,c.hold=m,c.bits=n,u(a,p),h=a.next_out,f=a.output,j=a.avail_out,g=a.next_in,e=a.input,i=a.avail_in,m=c.hold,n=c.bits,c.mode===V&&(c.back=-1);break}for(c.back=0;Ab=c.lencode[m&(1<<c.lenbits)-1],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=qb);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(rb&&0===(240&rb)){for(tb=qb,ub=rb,vb=sb;Ab=c.lencode[vb+((m&(1<<tb+ub)-1)>>tb)],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=tb+qb);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=tb,n-=tb,c.back+=tb}if(m>>>=qb,n-=qb,c.back+=qb,c.length=sb,0===rb){c.mode=hb;break}if(32&rb){c.back=-1,c.mode=V;break}if(64&rb){a.msg="invalid literal/length code",c.mode=lb;break}c.extra=15&rb,c.mode=db;case db:if(c.extra){for(zb=c.extra;zb>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.length+=m&(1<<c.extra)-1,m>>>=c.extra,n-=c.extra,c.back+=c.extra}c.was=c.length,c.mode=eb;case eb:for(;Ab=c.distcode[m&(1<<c.distbits)-1],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=qb);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(0===(240&rb)){for(tb=qb,ub=rb,vb=sb;Ab=c.distcode[vb+((m&(1<<tb+ub)-1)>>tb)],qb=Ab>>>24,rb=Ab>>>16&255,sb=65535&Ab,!(n>=tb+qb);){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}m>>>=tb,n-=tb,c.back+=tb}if(m>>>=qb,n-=qb,c.back+=qb,64&rb){a.msg="invalid distance code",c.mode=lb;break}c.offset=sb,c.extra=15&rb,c.mode=fb;case fb:if(c.extra){for(zb=c.extra;zb>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}c.offset+=m&(1<<c.extra)-1,m>>>=c.extra,n-=c.extra,c.back+=c.extra}if(c.offset>c.dmax){a.msg="invalid distance too far back",c.mode=lb;break}c.mode=gb;case gb:if(0===j)break a;if(q=p-j,c.offset>q){if(q=c.offset-q,q>c.whave&&c.sane){a.msg="invalid distance too far back",c.mode=lb;break}q>c.wnext?(q-=c.wnext,ob=c.wsize-q):ob=c.wnext-q,q>c.length&&(q=c.length),pb=c.window}else pb=f,ob=h-c.offset,q=c.length;q>j&&(q=j),j-=q,c.length-=q;do f[h++]=pb[ob++];while(--q);0===c.length&&(c.mode=cb);break;case hb:if(0===j)break a;f[h++]=c.length,j--,c.mode=cb;break;case ib:if(c.wrap){for(;32>n;){if(0===i)break a;i--,m|=e[g++]<<n,n+=8}if(p-=j,a.total_out+=p,c.total+=p,p&&(a.adler=c.check=c.flags?t(c.check,f,p,h-p):s(c.check,f,p,h-p)),p=j,(c.flags?m:d(m))!==c.check){a.msg="incorrect data check",c.mode=lb;break}m=0,n=0}c.mode=jb;case jb:if(c.wrap&&c.flags){for(;32>n;){if(0===i)break a;i--,m+=e[g++]<<n,n+=8}if(m!==(4294967295&c.total)){a.msg="incorrect length check",c.mode=lb;break}m=0,n=0}c.mode=kb;case kb:xb=D;break a;case lb:xb=G;break a;case mb:return H;case nb:default:return F}return a.next_out=h,a.avail_out=j,a.next_in=g,a.avail_in=i,c.hold=m,c.bits=n,(c.wsize||p!==a.avail_out&&c.mode<lb&&(c.mode<ib||b!==z))&&l(a,a.output,a.next_out,p-a.avail_out)?(c.mode=mb,H):(o-=a.avail_in,p-=a.avail_out,a.total_in+=o,a.total_out+=p,c.total+=p,c.wrap&&p&&(a.adler=c.check=c.flags?t(c.check,f,p,a.next_out-p):s(c.check,f,p,a.next_out-p)),a.data_type=c.bits+(c.last?64:0)+(c.mode===V?128:0)+(c.mode===bb||c.mode===Y?256:0),(0===o&&0===p||b===z)&&xb===C&&(xb=I),xb)}function n(a){if(!a||!a.state)return F;var b=a.state;return b.window&&(b.window=null),a.state=null,C}function o(a,b){var c;return a&&a.state?(c=a.state,0===(2&c.wrap)?F:(c.head=b,b.done=!1,C)):F}var p,q,r=a("../utils/common"),s=a("./adler32"),t=a("./crc32"),u=a("./inffast"),v=a("./inftrees"),w=0,x=1,y=2,z=4,A=5,B=6,C=0,D=1,E=2,F=-2,G=-3,H=-4,I=-5,J=8,K=1,L=2,M=3,N=4,O=5,P=6,Q=7,R=8,S=9,T=10,U=11,V=12,W=13,X=14,Y=15,Z=16,$=17,_=18,ab=19,bb=20,cb=21,db=22,eb=23,fb=24,gb=25,hb=26,ib=27,jb=28,kb=29,lb=30,mb=31,nb=32,ob=852,pb=592,qb=15,rb=qb,sb=!0;c.inflateReset=g,c.inflateReset2=h,c.inflateResetKeep=f,c.inflateInit=j,c.inflateInit2=i,c.inflate=m,c.inflateEnd=n,c.inflateGetHeader=o,c.inflateInfo="pako inflate (from Nodeca project)"},{"../utils/common":27,"./adler32":29,"./crc32":31,"./inffast":34,"./inftrees":36}],36:[function(a,b){"use strict";var c=a("../utils/common"),d=15,e=852,f=592,g=0,h=1,i=2,j=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],k=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],l=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],m=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];b.exports=function(a,b,n,o,p,q,r,s){var t,u,v,w,x,y,z,A,B,C=s.bits,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=null,O=0,P=new c.Buf16(d+1),Q=new c.Buf16(d+1),R=null,S=0;for(D=0;d>=D;D++)P[D]=0;for(E=0;o>E;E++)P[b[n+E]]++;for(H=C,G=d;G>=1&&0===P[G];G--);if(H>G&&(H=G),0===G)return p[q++]=20971520,p[q++]=20971520,s.bits=1,0;for(F=1;G>F&&0===P[F];F++);for(F>H&&(H=F),K=1,D=1;d>=D;D++)if(K<<=1,K-=P[D],0>K)return-1;if(K>0&&(a===g||1!==G))return-1;for(Q[1]=0,D=1;d>D;D++)Q[D+1]=Q[D]+P[D];for(E=0;o>E;E++)0!==b[n+E]&&(r[Q[b[n+E]]++]=E);if(a===g?(N=R=r,y=19):a===h?(N=j,O-=257,R=k,S-=257,y=256):(N=l,R=m,y=-1),M=0,E=0,D=F,x=q,I=H,J=0,v=-1,L=1<<H,w=L-1,a===h&&L>e||a===i&&L>f)return 1;for(var T=0;;){T++,z=D-J,r[E]<y?(A=0,B=r[E]):r[E]>y?(A=R[S+r[E]],B=N[O+r[E]]):(A=96,B=0),t=1<<D-J,u=1<<I,F=u;do u-=t,p[x+(M>>J)+u]=z<<24|A<<16|B|0;while(0!==u);for(t=1<<D-1;M&t;)t>>=1;if(0!==t?(M&=t-1,M+=t):M=0,E++,0===--P[D]){if(D===G)break;D=b[n+r[E]]}if(D>H&&(M&w)!==v){for(0===J&&(J=H),x+=F,I=D-J,K=1<<I;G>I+J&&(K-=P[I+J],!(0>=K));)I++,K<<=1;if(L+=1<<I,a===h&&L>e||a===i&&L>f)return 1;v=M&w,p[v]=H<<24|I<<16|x-q|0}}return 0!==M&&(p[x+M]=D-J<<24|64<<16|0),s.bits=H,0}},{"../utils/common":27}],37:[function(a,b){"use strict";b.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},{}],38:[function(a,b,c){"use strict";function d(a){for(var b=a.length;--b>=0;)a[b]=0}function e(a){return 256>a?gb[a]:gb[256+(a>>>7)]}function f(a,b){a.pending_buf[a.pending++]=255&b,a.pending_buf[a.pending++]=b>>>8&255}function g(a,b,c){a.bi_valid>V-c?(a.bi_buf|=b<<a.bi_valid&65535,f(a,a.bi_buf),a.bi_buf=b>>V-a.bi_valid,a.bi_valid+=c-V):(a.bi_buf|=b<<a.bi_valid&65535,a.bi_valid+=c)}function h(a,b,c){g(a,c[2*b],c[2*b+1])}function i(a,b){var c=0;do c|=1&a,a>>>=1,c<<=1;while(--b>0);return c>>>1}function j(a){16===a.bi_valid?(f(a,a.bi_buf),a.bi_buf=0,a.bi_valid=0):a.bi_valid>=8&&(a.pending_buf[a.pending++]=255&a.bi_buf,a.bi_buf>>=8,a.bi_valid-=8)}function k(a,b){var c,d,e,f,g,h,i=b.dyn_tree,j=b.max_code,k=b.stat_desc.static_tree,l=b.stat_desc.has_stree,m=b.stat_desc.extra_bits,n=b.stat_desc.extra_base,o=b.stat_desc.max_length,p=0;for(f=0;U>=f;f++)a.bl_count[f]=0;for(i[2*a.heap[a.heap_max]+1]=0,c=a.heap_max+1;T>c;c++)d=a.heap[c],f=i[2*i[2*d+1]+1]+1,f>o&&(f=o,p++),i[2*d+1]=f,d>j||(a.bl_count[f]++,g=0,d>=n&&(g=m[d-n]),h=i[2*d],a.opt_len+=h*(f+g),l&&(a.static_len+=h*(k[2*d+1]+g)));if(0!==p){do{for(f=o-1;0===a.bl_count[f];)f--;a.bl_count[f]--,a.bl_count[f+1]+=2,a.bl_count[o]--,p-=2}while(p>0);for(f=o;0!==f;f--)for(d=a.bl_count[f];0!==d;)e=a.heap[--c],e>j||(i[2*e+1]!==f&&(a.opt_len+=(f-i[2*e+1])*i[2*e],i[2*e+1]=f),d--)}}function l(a,b,c){var d,e,f=new Array(U+1),g=0;for(d=1;U>=d;d++)f[d]=g=g+c[d-1]<<1;for(e=0;b>=e;e++){var h=a[2*e+1];0!==h&&(a[2*e]=i(f[h]++,h))}}function m(){var a,b,c,d,e,f=new Array(U+1);for(c=0,d=0;O-1>d;d++)for(ib[d]=c,a=0;a<1<<_[d];a++)hb[c++]=d;for(hb[c-1]=d,e=0,d=0;16>d;d++)for(jb[d]=e,a=0;a<1<<ab[d];a++)gb[e++]=d;for(e>>=7;R>d;d++)for(jb[d]=e<<7,a=0;a<1<<ab[d]-7;a++)gb[256+e++]=d;for(b=0;U>=b;b++)f[b]=0;for(a=0;143>=a;)eb[2*a+1]=8,a++,f[8]++;for(;255>=a;)eb[2*a+1]=9,a++,f[9]++;for(;279>=a;)eb[2*a+1]=7,a++,f[7]++;for(;287>=a;)eb[2*a+1]=8,a++,f[8]++;for(l(eb,Q+1,f),a=0;R>a;a++)fb[2*a+1]=5,fb[2*a]=i(a,5);kb=new nb(eb,_,P+1,Q,U),lb=new nb(fb,ab,0,R,U),mb=new nb(new Array(0),bb,0,S,W)}function n(a){var b;for(b=0;Q>b;b++)a.dyn_ltree[2*b]=0;for(b=0;R>b;b++)a.dyn_dtree[2*b]=0;for(b=0;S>b;b++)a.bl_tree[2*b]=0;a.dyn_ltree[2*X]=1,a.opt_len=a.static_len=0,a.last_lit=a.matches=0}function o(a){a.bi_valid>8?f(a,a.bi_buf):a.bi_valid>0&&(a.pending_buf[a.pending++]=a.bi_buf),a.bi_buf=0,a.bi_valid=0}function p(a,b,c,d){o(a),d&&(f(a,c),f(a,~c)),E.arraySet(a.pending_buf,a.window,b,c,a.pending),a.pending+=c}function q(a,b,c,d){var e=2*b,f=2*c;return a[e]<a[f]||a[e]===a[f]&&d[b]<=d[c]}function r(a,b,c){for(var d=a.heap[c],e=c<<1;e<=a.heap_len&&(e<a.heap_len&&q(b,a.heap[e+1],a.heap[e],a.depth)&&e++,!q(b,d,a.heap[e],a.depth));)a.heap[c]=a.heap[e],c=e,e<<=1;a.heap[c]=d}function s(a,b,c){var d,f,i,j,k=0;if(0!==a.last_lit)do d=a.pending_buf[a.d_buf+2*k]<<8|a.pending_buf[a.d_buf+2*k+1],f=a.pending_buf[a.l_buf+k],k++,0===d?h(a,f,b):(i=hb[f],h(a,i+P+1,b),j=_[i],0!==j&&(f-=ib[i],g(a,f,j)),d--,i=e(d),h(a,i,c),j=ab[i],0!==j&&(d-=jb[i],g(a,d,j)));while(k<a.last_lit);h(a,X,b)}function t(a,b){var c,d,e,f=b.dyn_tree,g=b.stat_desc.static_tree,h=b.stat_desc.has_stree,i=b.stat_desc.elems,j=-1;for(a.heap_len=0,a.heap_max=T,c=0;i>c;c++)0!==f[2*c]?(a.heap[++a.heap_len]=j=c,a.depth[c]=0):f[2*c+1]=0;for(;a.heap_len<2;)e=a.heap[++a.heap_len]=2>j?++j:0,f[2*e]=1,a.depth[e]=0,a.opt_len--,h&&(a.static_len-=g[2*e+1]);for(b.max_code=j,c=a.heap_len>>1;c>=1;c--)r(a,f,c);e=i;do c=a.heap[1],a.heap[1]=a.heap[a.heap_len--],r(a,f,1),d=a.heap[1],a.heap[--a.heap_max]=c,a.heap[--a.heap_max]=d,f[2*e]=f[2*c]+f[2*d],a.depth[e]=(a.depth[c]>=a.depth[d]?a.depth[c]:a.depth[d])+1,f[2*c+1]=f[2*d+1]=e,a.heap[1]=e++,r(a,f,1);while(a.heap_len>=2);a.heap[--a.heap_max]=a.heap[1],k(a,b),l(f,j,a.bl_count)}function u(a,b,c){var d,e,f=-1,g=b[1],h=0,i=7,j=4;for(0===g&&(i=138,j=3),b[2*(c+1)+1]=65535,d=0;c>=d;d++)e=g,g=b[2*(d+1)+1],++h<i&&e===g||(j>h?a.bl_tree[2*e]+=h:0!==e?(e!==f&&a.bl_tree[2*e]++,a.bl_tree[2*Y]++):10>=h?a.bl_tree[2*Z]++:a.bl_tree[2*$]++,h=0,f=e,0===g?(i=138,j=3):e===g?(i=6,j=3):(i=7,j=4))}function v(a,b,c){var d,e,f=-1,i=b[1],j=0,k=7,l=4;for(0===i&&(k=138,l=3),d=0;c>=d;d++)if(e=i,i=b[2*(d+1)+1],!(++j<k&&e===i)){if(l>j){do h(a,e,a.bl_tree);while(0!==--j)}else 0!==e?(e!==f&&(h(a,e,a.bl_tree),j--),h(a,Y,a.bl_tree),g(a,j-3,2)):10>=j?(h(a,Z,a.bl_tree),g(a,j-3,3)):(h(a,$,a.bl_tree),g(a,j-11,7));j=0,f=e,0===i?(k=138,l=3):e===i?(k=6,l=3):(k=7,l=4)}}function w(a){var b;for(u(a,a.dyn_ltree,a.l_desc.max_code),u(a,a.dyn_dtree,a.d_desc.max_code),t(a,a.bl_desc),b=S-1;b>=3&&0===a.bl_tree[2*cb[b]+1];b--);return a.opt_len+=3*(b+1)+5+5+4,b}function x(a,b,c,d){var e;for(g(a,b-257,5),g(a,c-1,5),g(a,d-4,4),e=0;d>e;e++)g(a,a.bl_tree[2*cb[e]+1],3);v(a,a.dyn_ltree,b-1),v(a,a.dyn_dtree,c-1)}function y(a){var b,c=4093624447;for(b=0;31>=b;b++,c>>>=1)if(1&c&&0!==a.dyn_ltree[2*b])return G;if(0!==a.dyn_ltree[18]||0!==a.dyn_ltree[20]||0!==a.dyn_ltree[26])return H;for(b=32;P>b;b++)if(0!==a.dyn_ltree[2*b])return H;return G}function z(a){pb||(m(),pb=!0),a.l_desc=new ob(a.dyn_ltree,kb),a.d_desc=new ob(a.dyn_dtree,lb),a.bl_desc=new ob(a.bl_tree,mb),a.bi_buf=0,a.bi_valid=0,n(a)}function A(a,b,c,d){g(a,(J<<1)+(d?1:0),3),p(a,b,c,!0)}function B(a){g(a,K<<1,3),h(a,X,eb),j(a)}function C(a,b,c,d){var e,f,h=0;a.level>0?(a.strm.data_type===I&&(a.strm.data_type=y(a)),t(a,a.l_desc),t(a,a.d_desc),h=w(a),e=a.opt_len+3+7>>>3,f=a.static_len+3+7>>>3,e>=f&&(e=f)):e=f=c+5,e>=c+4&&-1!==b?A(a,b,c,d):a.strategy===F||f===e?(g(a,(K<<1)+(d?1:0),3),s(a,eb,fb)):(g(a,(L<<1)+(d?1:0),3),x(a,a.l_desc.max_code+1,a.d_desc.max_code+1,h+1),s(a,a.dyn_ltree,a.dyn_dtree)),n(a),d&&o(a)}function D(a,b,c){return a.pending_buf[a.d_buf+2*a.last_lit]=b>>>8&255,a.pending_buf[a.d_buf+2*a.last_lit+1]=255&b,a.pending_buf[a.l_buf+a.last_lit]=255&c,a.last_lit++,0===b?a.dyn_ltree[2*c]++:(a.matches++,b--,a.dyn_ltree[2*(hb[c]+P+1)]++,a.dyn_dtree[2*e(b)]++),a.last_lit===a.lit_bufsize-1}var E=a("../utils/common"),F=4,G=0,H=1,I=2,J=0,K=1,L=2,M=3,N=258,O=29,P=256,Q=P+1+O,R=30,S=19,T=2*Q+1,U=15,V=16,W=7,X=256,Y=16,Z=17,$=18,_=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],ab=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],bb=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],cb=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],db=512,eb=new Array(2*(Q+2));d(eb);var fb=new Array(2*R);d(fb);var gb=new Array(db);d(gb);var hb=new Array(N-M+1);d(hb);var ib=new Array(O);d(ib);var jb=new Array(R);d(jb);var kb,lb,mb,nb=function(a,b,c,d,e){this.static_tree=a,this.extra_bits=b,this.extra_base=c,this.elems=d,this.max_length=e,this.has_stree=a&&a.length},ob=function(a,b){this.dyn_tree=a,this.max_code=0,this.stat_desc=b},pb=!1;c._tr_init=z,c._tr_stored_block=A,c._tr_flush_block=C,c._tr_tally=D,c._tr_align=B},{"../utils/common":27}],39:[function(a,b){"use strict";function c(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}b.exports=c},{}]},{},[9])(9)});'use strict';if(tr.isVinn){global.window={};}'use strict';if(tr.isVinn){global.JSZip=global.window.JSZip;global.window=undefined;}else if(tr.isNode){const jsZipAbsPath=HTMLImportsLoader.hrefToAbsolutePath('/jszip.min.js');const jsZipModule=require(jsZipAbsPath);global.JSZip=jsZipModule;}'use strict';tr.exportTo('tr.e.importer',function(){const GZIP_MEMBER_HEADER_ID_SIZE=3;const GZIP_HEADER_ID1=0x1f;const GZIP_HEADER_ID2=0x8b;const GZIP_DEFLATE_COMPRESSION=8;function GzipImporter(model,eventData){this.inflateAsTraceStream=false;if(typeof(eventData)==='string'||eventData instanceof String){eventData=JSZip.utils.transformTo('uint8array',eventData);}else if(eventData instanceof ArrayBuffer){eventData=new Uint8Array(eventData);}else if(eventData instanceof tr.b.InMemoryTraceStream){eventData=eventData.data;this.inflateAsTraceStream_=true;}else{throw new Error('Unknown gzip data format');}
+this.model_=model;this.gzipData_=eventData;}
+GzipImporter.canImport=function(eventData){if(eventData instanceof tr.b.InMemoryTraceStream){eventData=eventData.header;}
+let header;if(eventData instanceof ArrayBuffer){header=new Uint8Array(eventData.slice(0,GZIP_MEMBER_HEADER_ID_SIZE));}else if(typeof(eventData)==='string'||eventData instanceof String){header=eventData.substring(0,GZIP_MEMBER_HEADER_ID_SIZE);header=JSZip.utils.transformTo('uint8array',header);}else{return false;}
+return header[0]===GZIP_HEADER_ID1&&header[1]===GZIP_HEADER_ID2&&header[2]===GZIP_DEFLATE_COMPRESSION;};GzipImporter.inflateGzipData_=function(data){let position=0;function getByte(){if(position>=data.length){throw new Error('Unexpected end of gzip data');}
+return data[position++];}
+function getWord(){const low=getByte();const high=getByte();return(high<<8)+low;}
+function skipBytes(amount){position+=amount;}
+function skipZeroTerminatedString(){while(getByte()!==0){}}
+const id1=getByte();const id2=getByte();if(id1!==GZIP_HEADER_ID1||id2!==GZIP_HEADER_ID2){throw new Error('Not gzip data');}
+const compressionMethod=getByte();if(compressionMethod!==GZIP_DEFLATE_COMPRESSION){throw new Error('Unsupported compression method: '+compressionMethod);}
+const flags=getByte();const haveHeaderCrc=flags&(1<<1);const haveExtraFields=flags&(1<<2);const haveFileName=flags&(1<<3);const haveComment=flags&(1<<4);skipBytes(4+1+1);if(haveExtraFields){const bytesToSkip=getWord();skipBytes(bytesToSkip);}
+if(haveFileName)skipZeroTerminatedString();if(haveComment)skipZeroTerminatedString();if(haveHeaderCrc)getWord();const inflatedData=JSZip.compressions.DEFLATE.uncompress(data.subarray(position));if(this.inflateAsTraceStream_){return GzipImporter.transformToStream(inflatedData);}
+let string;try{string=GzipImporter.transformToString(inflatedData);}catch(err){return GzipImporter.transformToStream(inflatedData);}
+if(inflatedData.length>0&&string.length===0){throw new RangeError('Inflated gzip data too long to fit into a string'+' ('+inflatedData.length+').');}
+return string;};GzipImporter.transformToStream=function(data){const type=JSZip.utils.getTypeOf(data);if(type==='uint8array')return new tr.b.InMemoryTraceStream(data,false);throw new Error(`Cannot transform ${type} to TraceStream.`);};GzipImporter.transformToString=function(data){if(typeof TextDecoder==='undefined'){return JSZip.utils.transformTo('string',data);}
+const type=JSZip.utils.getTypeOf(data);if(type==='string')return data;if(type==='array'){data=new Uint8Array(data);}
+const decoder=new TextDecoder('utf-8');return decoder.decode(data);};GzipImporter.prototype={__proto__:tr.importer.Importer.prototype,get importerName(){return'GzipImporter';},isTraceDataContainer(){return true;},extractSubtraces(){const eventData=GzipImporter.inflateGzipData_(this.gzipData_);return eventData?[eventData]:[];}};tr.importer.Importer.register(GzipImporter);return{GzipImporter,};});'use strict';tr.exportTo('tr.importer',function(){class SimpleLineReader{constructor(text){this.data_=text instanceof tr.b.TraceStream?text:text.split('\n');this.curLine_=0;this.readLastLine_=false;this.savedLines_=undefined;}*[Symbol.iterator](){let lastLine=undefined;while(this.hasData_){if(this.readLastLine_){this.curLine_++;this.readLastLine_=false;}else if(this.data_ instanceof tr.b.TraceStream){this.curLine_++;const line=this.data_.readUntilDelimiter('\n');lastLine=line.endsWith('\n')?line.slice(0,-1):line;}else{this.curLine_++;lastLine=this.data_[this.curLine_-1];}
+yield lastLine;}}
+get curLineNumber(){return this.curLine_;}
+get hasData_(){if(this.data_ instanceof tr.b.TraceStream)return this.data_.hasData;return this.curLine_<this.data_.length;}
+advanceToLineMatching(regex){for(const line of this){if(this.savedLines_!==undefined)this.savedLines_.push(line);if(regex.test(line)){this.goBack_();return true;}}
+return false;}
+goBack_(){if(this.readLastLine_){throw new Error('There should be at least one nextLine call between '+'any two goBack calls.');}
+if(this.curLine_===0){throw new Error('There should be at least one nextLine call before '+'the first goBack call.');}
+this.readLastLine_=true;this.curLine_--;}
+beginSavingLines(){this.savedLines_=[];}
+endSavingLinesAndGetResult(){const tmp=this.savedLines_;this.savedLines_=undefined;return tmp;}}
+return{SimpleLineReader,};});'use strict';tr.exportTo('tr.e.importer',function(){function Trace2HTMLImporter(model,events){this.importPriority=0;}
+Trace2HTMLImporter.subtraces_=[];function _extractEventsFromHTML(text){Trace2HTMLImporter.subtraces_=[];const r=new tr.importer.SimpleLineReader(text);while(true){if(!r.advanceToLineMatching(new RegExp('^<\s*script id="viewer-data" '+'type="(application\/json|text\/plain)">$'))){break;}
+r.beginSavingLines();if(!r.advanceToLineMatching(/^<\/\s*script>$/))return;let rawEvents=r.endSavingLinesAndGetResult();rawEvents=rawEvents.slice(1,rawEvents.length-1);const data64=rawEvents.join('\n');const buffer=new ArrayBuffer(tr.b.Base64.getDecodedBufferLength(data64));const len=tr.b.Base64.DecodeToTypedArray(data64,new DataView(buffer));Trace2HTMLImporter.subtraces_.push(buffer.slice(0,len));}}
+function _canImportFromHTML(text){if(!/^<!DOCTYPE html>/.test(text))return false;_extractEventsFromHTML(text);if(Trace2HTMLImporter.subtraces_.length===0)return false;return true;}
+Trace2HTMLImporter.canImport=function(events){if(events instanceof tr.b.TraceStream)return false;return _canImportFromHTML(events);};Trace2HTMLImporter.prototype={__proto__:tr.importer.Importer.prototype,get importerName(){return'Trace2HTMLImporter';},isTraceDataContainer(){return true;},extractSubtraces(){return Trace2HTMLImporter.subtraces_;},importEvents(){}};tr.importer.Importer.register(Trace2HTMLImporter);return{Trace2HTMLImporter,};});'use strict';tr.exportTo('tr.e.importer.v8',function(){function SplayTree(){}
+SplayTree.prototype.root_=null;SplayTree.prototype.isEmpty=function(){return!this.root_;};SplayTree.prototype.insert=function(key,value){if(this.isEmpty()){this.root_=new SplayTree.Node(key,value);return;}
+this.splay_(key);if(this.root_.key===key){return;}
+const node=new SplayTree.Node(key,value);if(key>this.root_.key){node.left=this.root_;node.right=this.root_.right;this.root_.right=null;}else{node.right=this.root_;node.left=this.root_.left;this.root_.left=null;}
+this.root_=node;};SplayTree.prototype.remove=function(key){if(this.isEmpty()){throw Error('Key not found: '+key);}
+this.splay_(key);if(this.root_.key!==key){throw Error('Key not found: '+key);}
+const removed=this.root_;if(!this.root_.left){this.root_=this.root_.right;}else{const right=this.root_.right;this.root_=this.root_.left;this.splay_(key);this.root_.right=right;}
+return removed;};SplayTree.prototype.find=function(key){if(this.isEmpty())return null;this.splay_(key);return this.root_.key===key?this.root_:null;};SplayTree.prototype.findMin=function(){if(this.isEmpty())return null;let current=this.root_;while(current.left){current=current.left;}
+return current;};SplayTree.prototype.findMax=function(opt_startNode){if(this.isEmpty())return null;let current=opt_startNode||this.root_;while(current.right){current=current.right;}
+return current;};SplayTree.prototype.findGreatestLessThan=function(key){if(this.isEmpty())return null;this.splay_(key);if(this.root_.key<=key){return this.root_;}
+if(this.root_.left){return this.findMax(this.root_.left);}
+return null;};SplayTree.prototype.exportKeysAndValues=function(){const result=[];this.traverse_(function(node){result.push([node.key,node.value]);});return result;};SplayTree.prototype.exportValues=function(){const result=[];this.traverse_(function(node){result.push(node.value);});return result;};SplayTree.prototype.splay_=function(key){if(this.isEmpty())return;const dummy=new SplayTree.Node(null,null);let left=dummy;let right=dummy;let current=this.root_;while(true){if(key<current.key){if(!current.left){break;}
+if(key<current.left.key){const tmp=current.left;current.left=tmp.right;tmp.right=current;current=tmp;if(!current.left){break;}}
+right.left=current;right=current;current=current.left;}else if(key>current.key){if(!current.right){break;}
+if(key>current.right.key){const tmp=current.right;current.right=tmp.left;tmp.left=current;current=tmp;if(!current.right){break;}}
+left.right=current;left=current;current=current.right;}else{break;}}
+left.right=current.left;right.left=current.right;current.left=dummy.right;current.right=dummy.left;this.root_=current;};SplayTree.prototype.traverse_=function(f){const nodesToVisit=[this.root_];while(nodesToVisit.length>0){const node=nodesToVisit.shift();if(node===null)continue;f(node);nodesToVisit.push(node.left);nodesToVisit.push(node.right);}};SplayTree.Node=function(key,value){this.key=key;this.value=value;};SplayTree.Node.prototype.left=null;SplayTree.Node.prototype.right=null;return{SplayTree,};});'use strict';tr.exportTo('tr.e.importer.v8',function(){function CodeMap(){this.dynamics_=new tr.e.importer.v8.SplayTree();this.dynamicsNameGen_=new tr.e.importer.v8.CodeMap.NameGenerator();this.statics_=new tr.e.importer.v8.SplayTree();this.libraries_=new tr.e.importer.v8.SplayTree();this.pages_=[];}
+CodeMap.PAGE_ALIGNMENT=12;CodeMap.PAGE_SIZE=1<<CodeMap.PAGE_ALIGNMENT;CodeMap.prototype.addCode=function(start,codeEntry){this.deleteAllCoveredNodes_(this.dynamics_,start,start+codeEntry.size);this.dynamics_.insert(start,codeEntry);};CodeMap.prototype.moveCode=function(from,to){const removedNode=this.dynamics_.remove(from);this.deleteAllCoveredNodes_(this.dynamics_,to,to+removedNode.value.size);this.dynamics_.insert(to,removedNode.value);};CodeMap.prototype.deleteCode=function(start){const removedNode=this.dynamics_.remove(start);};CodeMap.prototype.addLibrary=function(start,codeEntry){this.markPages_(start,start+codeEntry.size);this.libraries_.insert(start,codeEntry);};CodeMap.prototype.addStaticCode=function(start,codeEntry){this.statics_.insert(start,codeEntry);};CodeMap.prototype.markPages_=function(start,end){for(let addr=start;addr<=end;addr+=CodeMap.PAGE_SIZE){this.pages_[addr>>>CodeMap.PAGE_ALIGNMENT]=1;}};CodeMap.prototype.deleteAllCoveredNodes_=function(tree,start,end){const toDelete=[];let addr=end-1;while(addr>=start){const node=tree.findGreatestLessThan(addr);if(!node)break;const start2=node.key;const end2=start2+node.value.size;if(start2<end&&start<end2)toDelete.push(start2);addr=start2-1;}
+for(let i=0,l=toDelete.length;i<l;++i)tree.remove(toDelete[i]);};CodeMap.prototype.isAddressBelongsTo_=function(addr,node){return addr>=node.key&&addr<(node.key+node.value.size);};CodeMap.prototype.findInTree_=function(tree,addr){const node=tree.findGreatestLessThan(addr);return node&&this.isAddressBelongsTo_(addr,node)?node.value:null;};CodeMap.prototype.findEntryInLibraries=function(addr){const pageAddr=addr>>>CodeMap.PAGE_ALIGNMENT;if(pageAddr in this.pages_){return this.findInTree_(this.libraries_,addr);}
+return undefined;};CodeMap.prototype.findEntry=function(addr){const pageAddr=addr>>>CodeMap.PAGE_ALIGNMENT;if(pageAddr in this.pages_){return this.findInTree_(this.statics_,addr)||this.findInTree_(this.libraries_,addr);}
+const min=this.dynamics_.findMin();const max=this.dynamics_.findMax();if(max!==null&&addr<(max.key+max.value.size)&&addr>=min.key){const dynaEntry=this.findInTree_(this.dynamics_,addr);if(dynaEntry===null)return null;if(!dynaEntry.nameUpdated_){dynaEntry.name=this.dynamicsNameGen_.getName(dynaEntry.name);dynaEntry.nameUpdated_=true;}
+return dynaEntry;}
+return null;};CodeMap.prototype.findDynamicEntryByStartAddress=function(addr){const node=this.dynamics_.find(addr);return node?node.value:null;};CodeMap.prototype.getAllDynamicEntries=function(){return this.dynamics_.exportValues();};CodeMap.prototype.getAllDynamicEntriesWithAddresses=function(){return this.dynamics_.exportKeysAndValues();};CodeMap.prototype.getAllStaticEntries=function(){return this.statics_.exportValues();};CodeMap.prototype.getAllLibrariesEntries=function(){return this.libraries_.exportValues();};CodeMap.CodeState={COMPILED:0,OPTIMIZABLE:1,OPTIMIZED:2};CodeMap.CodeEntry=function(size,opt_name,opt_type){this.id=tr.b.GUID.allocateSimple();this.size=size;this.name_=opt_name||'';this.type=opt_type||'';this.nameUpdated_=false;};CodeMap.CodeEntry.prototype={__proto__:Object.prototype,get name(){return this.name_;},set name(value){this.name_=value;},toString(){this.name_+': '+this.size.toString(16);}};CodeMap.CodeEntry.TYPE={SHARED_LIB:'SHARED_LIB',CPP:'CPP'};CodeMap.DynamicFuncCodeEntry=function(size,type,func,state){CodeMap.CodeEntry.call(this,size,'',type);this.func=func;this.state=state;};CodeMap.DynamicFuncCodeEntry.STATE_PREFIX=['','~','*'];CodeMap.DynamicFuncCodeEntry.prototype={__proto__:CodeMap.CodeEntry.prototype,get name(){return CodeMap.DynamicFuncCodeEntry.STATE_PREFIX[this.state]+
+this.func.name;},set name(value){this.name_=value;},getRawName(){return this.func.getName();},isJSFunction(){return true;},toString(){return this.type+': '+this.name+': '+this.size.toString(16);}};CodeMap.FunctionEntry=function(name){CodeMap.CodeEntry.call(this,0,name);};CodeMap.FunctionEntry.prototype={__proto__:CodeMap.CodeEntry.prototype,get name(){let name=this.name_;if(name.length===0){name='<anonymous>';}else if(name.charAt(0)===' '){name='<anonymous>'+name;}
+return name;},set name(value){this.name_=value;}};CodeMap.NameGenerator=function(){this.knownNames_={};};CodeMap.NameGenerator.prototype.getName=function(name){if(!(name in this.knownNames_)){this.knownNames_[name]=0;return name;}
+const count=++this.knownNames_[name];return name+' {'+count+'}';};return{CodeMap,};});'use strict';tr.exportTo('tr.e.importer.v8',function(){function CsvParser(){}
+CsvParser.CSV_FIELD_RE_=/^"((?:[^"]|"")*)"|([^,]*)/;CsvParser.DOUBLE_QUOTE_RE_=/""/g;CsvParser.prototype.parseLine=function(line){const fieldRe=CsvParser.CSV_FIELD_RE_;const doubleQuoteRe=CsvParser.DOUBLE_QUOTE_RE_;let pos=0;const endPos=line.length;const fields=[];if(endPos>0){do{const fieldMatch=fieldRe.exec(line.substr(pos));if(typeof fieldMatch[1]==='string'){const field=fieldMatch[1];pos+=field.length+3;fields.push(field.replace(doubleQuoteRe,'"'));}else{const field=fieldMatch[2];pos+=field.length+1;fields.push(field);}}while(pos<=endPos);}
+return fields;};function LogReader(dispatchTable){this.dispatchTable_=dispatchTable;this.lineNum_=0;this.csvParser_=new CsvParser();}
+LogReader.prototype.printError=function(str){};LogReader.prototype.processLogChunk=function(chunk){this.processLog_(chunk.split('\n'));};LogReader.prototype.processLogLine=function(line){this.processLog_([line]);};LogReader.prototype.processStack=function(pc,func,stack){const fullStack=func?[pc,func]:[pc];let prevFrame=pc;for(let i=0,n=stack.length;i<n;++i){const frame=stack[i];const firstChar=frame.charAt(0);if(firstChar==='+'||firstChar==='-'){prevFrame+=parseInt(frame,16);fullStack.push(prevFrame);}else if(firstChar!=='o'){fullStack.push(parseInt(frame,16));}}
+return fullStack;};LogReader.prototype.skipDispatch=function(dispatch){return false;};LogReader.prototype.dispatchLogRow_=function(fields){const command=fields[0];if(!(command in this.dispatchTable_))return;const dispatch=this.dispatchTable_[command];if(dispatch===null||this.skipDispatch(dispatch)){return;}
+const parsedFields=[];for(let i=0;i<dispatch.parsers.length;++i){const parser=dispatch.parsers[i];if(parser===null){parsedFields.push(fields[1+i]);}else if(typeof parser==='function'){parsedFields.push(parser(fields[1+i]));}else{parsedFields.push(fields.slice(1+i));break;}}
+dispatch.processor.apply(this,parsedFields);};LogReader.prototype.processLog_=function(lines){for(let i=0,n=lines.length;i<n;++i,++this.lineNum_){const line=lines[i];if(!line){continue;}
+try{const fields=this.csvParser_.parseLine(line);this.dispatchLogRow_(fields);}catch(e){this.printError('line '+(this.lineNum_+1)+': '+
+(e.message||e));}}};return{LogReader,};});'use strict';tr.exportTo('tr.model',function(){function ProfileNode(id,title,parentNode){this.id_=id;this.title_=title;this.parentNode_=parentNode;this.colorId_=-1;this.userFriendlyStack_=[];}
+ProfileNode.prototype={__proto__:Object.prototype,get title(){return this.title_;},get parentNode(){return this.parentNode_;},set parentNode(value){this.parentNode_=value;},get id(){return this.id_;},get colorId(){return this.colorId_;},set colorId(value){this.colorId_=value;},get userFriendlyName(){return this.title_;},get userFriendlyStack(){if(this.userFriendlyStack_.length===0){this.userFriendlyStack_=[this.userFriendlyName];if(this.parentNode_!==undefined){this.userFriendlyStack_=this.userFriendlyStack_.concat(this.parentNode_.userFriendlyStack);}}
+return this.userFriendlyStack_;},get sampleTitle(){throw new Error('Not implemented.');}};tr.model.EventRegistry.register(ProfileNode,{name:'Node',pluralName:'Nodes'});return{ProfileNode,};});'use strict';tr.exportTo('tr.e.v8',function(){const ProfileNode=tr.model.ProfileNode;function V8CpuProfileNode(id,callFrame,parentNode){ProfileNode.call(this,id,callFrame.functionName,parentNode);this.callFrame_=tr.b.deepCopy(callFrame);this.deoptReason_='';this.colorId_=tr.b.ColorScheme.getColorIdForGeneralPurposeString(callFrame.functionName);}
+V8CpuProfileNode.prototype={__proto__:ProfileNode.prototype,get functionName(){return this.callFrame_.functionName;},get scriptId(){return this.callFrame_.scriptId;},get url(){if(!this.callFrame_.url){return'unknown';}
+let url=this.callFrame_.url;if(this.callFrame_.lineNumber===undefined){return url;}
+url=url+':'+this.callFrame_.lineNumber;if(this.callFrame_.columnNumber===undefined){return url;}
+url=url+':'+this.callFrame_.columnNumber;return url;},get deoptReason(){return this.deoptReason_;},set deoptReason(value){this.deoptReason_=value;},get userFriendlyName(){const name=this.functionName+' url: '+this.url;return!this.deoptReason_?name:name+' Deoptimized reason: '+this.deoptReason_;},get sampleTitle(){return'V8 Sample';}};V8CpuProfileNode.constructFromObject=function(profileTree,node){const nodeId=node.id;if(nodeId===1){return undefined;}
+const parentNode=profileTree.getNode(node.parent);const profileNode=new V8CpuProfileNode(nodeId,node.callFrame,parentNode);if(node.deoptReason!==undefined){profileNode.deoptReason=node.deoptReason;}
+return profileNode;};ProfileNode.subTypes.register(V8CpuProfileNode,{typeName:'cpuProfile',name:'v8 cpu profile node',pluralName:'v8 cpu profile nodes'});ProfileNode.subTypes.register(V8CpuProfileNode,{typeName:'legacySample',name:'v8 cpu profile node',pluralName:'v8 cpu profile nodes'});return{ProfileNode,};});'use strict';tr.exportTo('tr.model',function(){function ProfileTree(){this.startTime_=undefined;this.endTime_=undefined;this.tree_=new Map();this.pid_=-1;this.tid_=-1;}
+ProfileTree.prototype={__proto__:Object.prototype,get pid(){return this.pid_;},set pid(value){this.pid_=value;},get tid(){return this.tid_;},set tid(value){this.tid_=value;},get tree(){return this.tree_;},get startTime(){return this.startTime_;},set startTime(value){this.startTime_=value;this.endTime_=value;},get endTime(){return this.endTime_;},set endTime(value){this.endTime_=value;},add(node){if(this.tree_.has(node.id)){throw new Error('Conflict id in the profile tree.');}
+this.tree_.set(node.id,node);return node;},getNode(nodeId){return this.tree_.get(nodeId);}};return{ProfileTree,};});'use strict';tr.exportTo('tr.e.importer.v8',function(){const CodeEntry=tr.e.importer.v8.CodeMap.CodeEntry;const CodeMap=tr.e.importer.v8.CodeMap;const ColorScheme=tr.b.ColorScheme;const DynamicFuncCodeEntry=tr.e.importer.v8.CodeMap.DynamicFuncCodeEntry;const FunctionEntry=tr.e.importer.v8.CodeMap.FunctionEntry;const ProfileNodeType=tr.model.ProfileNode.subTypes.getConstructor(undefined,'legacySample');function V8LogImporter(model,eventData){this.importPriority=3;this.model_=model;this.logData_=eventData;this.code_map_=new CodeMap();this.v8_timer_thread_=undefined;this.v8_thread_=undefined;this.profileTree_=new tr.model.ProfileTree();this.profileTree_.add(new ProfileNodeType(-1,{url:'',functionName:'unknown'}));this.v8_stack_timeline_=[];}
+const kV8BinarySuffixes=['/d8','/libv8.so'];const TimerEventDefaultArgs={'V8.Execute':{pause:false,no_execution:false},'V8.External':{pause:false,no_execution:true},'V8.CompileFullCode':{pause:true,no_execution:true},'V8.RecompileSynchronous':{pause:true,no_execution:true},'V8.RecompileParallel':{pause:false,no_execution:false},'V8.CompileEval':{pause:true,no_execution:true},'V8.Parse':{pause:true,no_execution:true},'V8.PreParse':{pause:true,no_execution:true},'V8.ParseLazy':{pause:true,no_execution:true},'V8.GCScavenger':{pause:true,no_execution:true},'V8.GCCompactor':{pause:true,no_execution:true},'V8.GCContext':{pause:true,no_execution:true}};V8LogImporter.canImport=function(eventData){if(typeof(eventData)!=='string'&&!(eventData instanceof String)){return false;}
+return eventData.substring(0,11)==='v8-version,'||eventData.substring(0,12)==='timer-event,'||eventData.substring(0,5)==='tick,'||eventData.substring(0,15)==='shared-library,'||eventData.substring(0,9)==='profiler,'||eventData.substring(0,14)==='code-creation,';};V8LogImporter.prototype={__proto__:tr.importer.Importer.prototype,get importerName(){return'V8LogImporter';},processTimerEvent_(name,startInUs,lengthInUs){const args=TimerEventDefaultArgs[name];if(args===undefined)return;const startInMs=tr.b.convertUnit(startInUs,tr.b.UnitPrefixScale.METRIC.MICRO,tr.b.UnitPrefixScale.METRIC.MILLI);const lengthInMs=tr.b.convertUnit(lengthInUs,tr.b.UnitPrefixScale.METRIC.MICRO,tr.b.UnitPrefixScale.METRIC.MILLI);const colorId=ColorScheme.getColorIdForGeneralPurposeString(name);const slice=new tr.model.ThreadSlice('v8',name,colorId,startInMs,args,lengthInMs);this.v8_timer_thread_.sliceGroup.pushSlice(slice);},processTimerEventStart_(name,startInUs){const args=TimerEventDefaultArgs[name];if(args===undefined)return;const startInMs=tr.b.convertUnit(startInUs,tr.b.UnitPrefixScale.METRIC.MICRO,tr.b.UnitPrefixScale.METRIC.MILLI);this.v8_timer_thread_.sliceGroup.beginSlice('v8',name,startInMs,args);},processTimerEventEnd_(name,endInUs){const endInMs=tr.b.convertUnit(endInUs,tr.b.UnitPrefixScale.METRIC.MICRO,tr.b.UnitPrefixScale.METRIC.MILLI);this.v8_timer_thread_.sliceGroup.endSlice(endInMs);},processCodeCreateEvent_(type,kind,address,size,name,maybeFunc){function parseState(s){switch(s){case'':return CodeMap.CodeState.COMPILED;case'~':return CodeMap.CodeState.OPTIMIZABLE;case'*':return CodeMap.CodeState.OPTIMIZED;}
+throw new Error('unknown code state: '+s);}
+if(maybeFunc.length){const funcAddr=parseInt(maybeFunc[0]);const state=parseState(maybeFunc[1]);let func=this.code_map_.findDynamicEntryByStartAddress(funcAddr);if(!func){func=new FunctionEntry(name);func.kind=kind;this.code_map_.addCode(funcAddr,func);}else if(func.name!==name){func.name=name;}
+let entry=this.code_map_.findDynamicEntryByStartAddress(address);if(entry){if(entry.size===size&&entry.func===func){entry.state=state;}}else{entry=new DynamicFuncCodeEntry(size,type,func,state);entry.kind=kind;this.code_map_.addCode(address,entry);}}else{const codeEntry=new CodeEntry(size,name);codeEntry.kind=kind;this.code_map_.addCode(address,codeEntry);}},processCodeMoveEvent_(from,to){this.code_map_.moveCode(from,to);},processCodeDeleteEvent_(address){this.code_map_.deleteCode(address);},processSharedLibrary_(name,start,end){const codeEntry=new CodeEntry(end-start,name,CodeEntry.TYPE.SHARED_LIB);codeEntry.kind=-3;for(let i=0;i<kV8BinarySuffixes.length;i++){const suffix=kV8BinarySuffixes[i];if(name.indexOf(suffix,name.length-suffix.length)>=0){codeEntry.kind=-1;break;}}
+this.code_map_.addLibrary(start,codeEntry);},processCppSymbol_(address,size,name){const codeEntry=new CodeEntry(size,name,CodeEntry.TYPE.CPP);codeEntry.kind=-1;this.code_map_.addStaticCode(address,codeEntry);},processTickEvent_(pc,startInUs,isExternalCallback,tosOrExternalCallback,vmstate,stack){const startInMs=tr.b.convertUnit(startInUs,tr.b.UnitPrefixScale.METRIC.MICRO,tr.b.UnitPrefixScale.METRIC.MILLI);function findChildWithEntryID(stackFrame,entryID){for(let i=0;i<stackFrame.children.length;i++){if(stackFrame.children[i].entryID===entryID){return stackFrame.children[i];}}
+return undefined;}
+function processStack(pc,func,stack){const fullStack=func?[pc,func]:[pc];let prevFrame=pc;for(let i=0,n=stack.length;i<n;++i){const frame=stack[i];const firstChar=frame.charAt(0);if(firstChar==='+'||firstChar==='-'){prevFrame+=parseInt(frame,16);fullStack.push(prevFrame);}else if(firstChar!=='o'){fullStack.push(parseInt(frame,16));}}
+return fullStack;}
+if(isExternalCallback){pc=tosOrExternalCallback;tosOrExternalCallback=0;}else if(tosOrExternalCallback){const funcEntry=this.code_map_.findEntry(tosOrExternalCallback);if(!funcEntry||!funcEntry.isJSFunction||!funcEntry.isJSFunction()){tosOrExternalCallback=0;}}
+let processedStack=processStack(pc,tosOrExternalCallback,stack);let node=undefined;let lastNode=undefined;processedStack=processedStack.reverse();for(let i=0,n=processedStack.length;i<n;i++){const frame=processedStack[i];if(!frame)break;const entry=this.code_map_.findEntry(frame);if(!entry&&i!==0){continue;}
+let sourceInfo=undefined;if(entry&&entry.type===CodeEntry.TYPE.CPP){const libEntry=this.code_map_.findEntryInLibraries(frame);if(libEntry){sourceInfo={file:libEntry.name};}}
+const entryId=entry?entry.id:-1;node=this.profileTree_.getNode(entryId);if(node===undefined){node=this.profileTree_.add(new ProfileNodeType(entryId,{functionName:entry.name,url:sourceInfo?sourceInfo.file:'',lineNumber:sourceInfo?sourceInfo.line:undefined,columnNumber:sourceInfo?sourceInfo.column:undefined,scriptId:sourceInfo?sourceInfo.scriptId:undefined},lastNode));}
+lastNode=node;}
+this.model_.samples.push(new tr.model.Sample(startInMs,'V8 PC',node,this.v8_thread_,undefined,1));},processDistortion_(distortionInPicoseconds){},processPlotRange_(start,end){},processV8Version_(major,minor,build,patch,candidate){},importEvents(){const logreader=new tr.e.importer.v8.LogReader({'timer-event':{parsers:[null,parseInt,parseInt],processor:this.processTimerEvent_.bind(this)},'shared-library':{parsers:[null,parseInt,parseInt],processor:this.processSharedLibrary_.bind(this)},'timer-event-start':{parsers:[null,parseInt],processor:this.processTimerEventStart_.bind(this)},'timer-event-end':{parsers:[null,parseInt],processor:this.processTimerEventEnd_.bind(this)},'code-creation':{parsers:[null,parseInt,parseInt,parseInt,null,'var-args'],processor:this.processCodeCreateEvent_.bind(this)},'code-move':{parsers:[parseInt,parseInt],processor:this.processCodeMoveEvent_.bind(this)},'code-delete':{parsers:[parseInt],processor:this.processCodeDeleteEvent_.bind(this)},'cpp':{parsers:[parseInt,parseInt,null],processor:this.processCppSymbol_.bind(this)},'tick':{parsers:[parseInt,parseInt,parseInt,parseInt,parseInt,'var-args'],processor:this.processTickEvent_.bind(this)},'distortion':{parsers:[parseInt],processor:this.processDistortion_.bind(this)},'plot-range':{parsers:[parseInt,parseInt],processor:this.processPlotRange_.bind(this)},'v8-version':{parsers:[parseInt,parseInt,parseInt,parseInt,parseInt],processor:this.processV8Version_.bind(this)}});this.v8_timer_thread_=this.model_.getOrCreateProcess(-32).getOrCreateThread(1);this.v8_timer_thread_.name='V8 Timers';this.v8_thread_=this.model_.getOrCreateProcess(-32).getOrCreateThread(2);this.v8_thread_.name='V8';const lines=this.logData_.split('\n');for(let i=0;i<lines.length;i++){logreader.processLogLine(lines[i]);}
+function addSlices(slices,thread){for(let i=0;i<slices.length;i++){const duration=slices[i].end-slices[i].start;const slice=new tr.model.ThreadSlice('v8',slices[i].name,ColorScheme.getColorIdForGeneralPurposeString(slices[i].name),slices[i].start,{},duration);thread.sliceGroup.pushSlice(slice);addSlices(slices[i].children,thread);}}
+addSlices(this.v8_stack_timeline_,this.v8_thread_);}};tr.importer.Importer.register(V8LogImporter);return{V8LogImporter,};});'use strict';tr.exportTo('tr.e.importer',function(){function ZipImporter(model,eventData){if(eventData instanceof ArrayBuffer){eventData=new Uint8Array(eventData);}
+this.model_=model;this.eventData_=eventData;}
+ZipImporter.canImport=function(eventData){let header;if(eventData instanceof ArrayBuffer){header=new Uint8Array(eventData.slice(0,2));}else if(typeof(eventData)==='string'||eventData instanceof String){header=[eventData.charCodeAt(0),eventData.charCodeAt(1)];}else{return false;}
+return header[0]==='P'.charCodeAt(0)&&header[1]==='K'.charCodeAt(0);};ZipImporter.prototype={__proto__:tr.importer.Importer.prototype,get importerName(){return'ZipImporter';},isTraceDataContainer(){return true;},extractSubtraces(){const zip=new JSZip(this.eventData_);const subtraces=[];for(const idx in zip.files){subtraces.push(zip.files[idx].asBinary());}
+return subtraces;}};tr.importer.Importer.register(ZipImporter);return{ZipImporter,};});'use strict';tr.exportTo('tr.model',function(){function HeapEntry(heapDump,leafStackFrame,objectTypeName,size,count,valuesAreTotals){this.heapDump=heapDump;this.leafStackFrame=leafStackFrame;this.objectTypeName=objectTypeName;this.size=size;this.count=count;this.valuesAreTotals=valuesAreTotals;}
+function HeapDump(processMemoryDump,allocatorName,isComplete){this.processMemoryDump=processMemoryDump;this.allocatorName=allocatorName;this.isComplete=isComplete;this.entries=[];}
+HeapDump.prototype={addEntry(leafStackFrame,objectTypeName,size,count,opt_valuesAreTotals){if(opt_valuesAreTotals===undefined)opt_valuesAreTotals=true;const valuesAreTotals=opt_valuesAreTotals;const entry=new HeapEntry(this,leafStackFrame,objectTypeName,size,count,valuesAreTotals);this.entries.push(entry);return entry;}};return{HeapEntry,HeapDump,};});'use strict';tr.exportTo('tr.e.importer',function(){function HeapDumpTraceEventImporter(heapProfileExpander,stackFrames,processMemoryDump,idPrefix,model){this.expander=heapProfileExpander;this.stackFrames=stackFrames;this.processMemoryDump=processMemoryDump;this.idPrefix=idPrefix;this.model=model;}
+HeapDumpTraceEventImporter.prototype={getLeafStackFrame(stackFrameId){if(stackFrameId==='')return undefined;const parentId=this.idPrefix+stackFrameId;const id=parentId+':self';if(!this.stackFrames[id]){const parentStackFrame=this.stackFrames[parentId];const stackFrame=new tr.model.StackFrame(parentStackFrame,id,'<self>',undefined);this.model.addStackFrame(stackFrame);}
+return this.stackFrames[id];},parseEntry(entry,heapDump){const size=entry.size;const count=entry.count;const leafStackFrame=this.getLeafStackFrame(entry.node.id);const objectTypeName=entry.type.name;const valuesAreTotals=false;if(objectTypeName===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Missing object type name (ID '+typeId+')',});}
+heapDump.addEntry(leafStackFrame,objectTypeName,size,count,valuesAreTotals);},parse(){const heapDumps={};const inflated=this.expander.inflated;for(const[allocatorName,entries]of Object.entries(inflated)){const heapDump=new tr.model.HeapDump(this.processMemoryDump,allocatorName);for(const entry of entries){this.parseEntry(entry,heapDump);}
+heapDump.isComplete=true;heapDumps[allocatorName]=heapDump;}
+return heapDumps;},};return{HeapDumpTraceEventImporter,};});'use strict';tr.exportTo('tr.e.importer',function(){function LegacyHeapDumpTraceEventImporter(model,processMemoryDump,processObjectTypeNameMap,idPrefix,dumpId,rawHeapDumps){this.model_=model;this.processObjectTypeNameMap_=processObjectTypeNameMap;this.idPrefix_=idPrefix;this.processMemoryDump_=processMemoryDump;this.pid_=this.processMemoryDump_.process.pid;this.dumpId_=dumpId;this.rawHeapDumps_=rawHeapDumps;}
+LegacyHeapDumpTraceEventImporter.prototype={parseRawHeapDump(rawHeapDump,allocatorName){const model=this.model_;const processMemoryDump=this.processMemoryDump_;const heapDump=new tr.model.HeapDump(processMemoryDump,allocatorName);const entries=rawHeapDump.entries;if(entries===undefined||entries.length===0){this.model_.importWarning({type:'memory_dump_parse_error',message:'No heap entries in a '+allocatorName+' heap dump for PID='+this.pid_+' and dump ID='+this.dumpId_+'.'});return undefined;}
+const isOldFormat=entries[0].bt===undefined;if(!isOldFormat&&this.processObjectTypeNameMap_===undefined){return undefined;}
+for(let i=0;i<entries.length;i++){const entry=entries[i];const size=parseInt(entry.size,16);const leafStackFrameIndex=entry.bt;let leafStackFrame;if(isOldFormat){if(leafStackFrameIndex===undefined){leafStackFrame=undefined;}else{let leafStackFrameId=this.idPrefix_+leafStackFrameIndex;if(leafStackFrameIndex===''){leafStackFrame=undefined;}else{leafStackFrame=model.stackFrames[leafStackFrameId];if(leafStackFrame===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Missing leaf stack frame (ID '+
+leafStackFrameId+') of heap entry '+i+' (size '+
+size+') in a '+allocatorName+' heap dump for PID='+this.pid_+'.'});continue;}}
+leafStackFrameId+=':self';if(model.stackFrames[leafStackFrameId]!==undefined){leafStackFrame=model.stackFrames[leafStackFrameId];}else{leafStackFrame=new tr.model.StackFrame(leafStackFrame,leafStackFrameId,'<self>',undefined);model.addStackFrame(leafStackFrame);}}}else{if(leafStackFrameIndex===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Missing stack frame ID of heap entry '+i+' (size '+size+') in a '+allocatorName+' heap dump for PID='+this.pid_+'.'});continue;}
+const leafStackFrameId=this.idPrefix_+leafStackFrameIndex;if(leafStackFrameIndex===''){leafStackFrame=undefined;}else{leafStackFrame=model.stackFrames[leafStackFrameId];if(leafStackFrame===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Missing leaf stack frame (ID '+leafStackFrameId+') of heap entry '+i+' (size '+size+') in a '+
+allocatorName+' heap dump for PID='+this.pid_+'.'});continue;}}}
+const objectTypeId=entry.type;let objectTypeName;if(objectTypeId===undefined){objectTypeName=undefined;}else if(this.processObjectTypeNameMap_===undefined){continue;}else{objectTypeName=this.processObjectTypeNameMap_[objectTypeId];if(objectTypeName===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Missing object type name (ID '+objectTypeId+') of heap entry '+i+' (size '+size+') in a '+
+allocatorName+' heap dump for PID='+this.pid_+'.'});continue;}}
+const count=entry.count===undefined?undefined:parseInt(entry.count,16);heapDump.addEntry(leafStackFrame,objectTypeName,size,count);}
+return heapDump;},parse(){const heapDumps={};for(const allocatorName in this.rawHeapDumps_){const rawHeapDump=this.rawHeapDumps_[allocatorName];const heapDump=this.parseRawHeapDump(rawHeapDump,allocatorName);if(heapDump!==undefined&&heapDump.entries.length>0){heapDumps[allocatorName]=heapDump;}}
+return heapDumps;},};return{LegacyHeapDumpTraceEventImporter,};});(function(window,Object,Array,Error,JSON,undefined){var partialComplete=varArgs(function(fn,args){var numBoundArgs=args.length;return varArgs(function(callArgs){for(var i=0;i<callArgs.length;i++){args[numBoundArgs+i]=callArgs[i];}
+args.length=numBoundArgs+callArgs.length;return fn.apply(this,args);});}),compose=varArgs(function(fns){var fnsList=arrayAsList(fns);function next(params,curFn){return[apply(params,curFn)];}
+return varArgs(function(startParams){return foldR(next,startParams,fnsList)[0];});});function compose2(f1,f2){return function(){return f1.call(this,f2.apply(this,arguments));}}
+function attr(key){return function(o){return o[key];};}
+var lazyUnion=varArgs(function(fns){return varArgs(function(params){var maybeValue;for(var i=0;i<len(fns);i++){maybeValue=apply(params,fns[i]);if(maybeValue){return maybeValue;}}});});function apply(args,fn){return fn.apply(undefined,args);}
+function varArgs(fn){var numberOfFixedArguments=fn.length-1,slice=Array.prototype.slice;if(numberOfFixedArguments==0){return function(){return fn.call(this,slice.call(arguments));}}else if(numberOfFixedArguments==1){return function(){return fn.call(this,arguments[0],slice.call(arguments,1));}}
+var argsHolder=Array(fn.length);return function(){for(var i=0;i<numberOfFixedArguments;i++){argsHolder[i]=arguments[i];}
+argsHolder[numberOfFixedArguments]=slice.call(arguments,numberOfFixedArguments);return fn.apply(this,argsHolder);}}
+function flip(fn){return function(a,b){return fn(b,a);}}
+function lazyIntersection(fn1,fn2){return function(param){return fn1(param)&&fn2(param);};}
+function noop(){}
+function always(){return true}
+function functor(val){return function(){return val;}}
+function isOfType(T,maybeSomething){return maybeSomething&&maybeSomething.constructor===T;}
+var len=attr('length'),isString=partialComplete(isOfType,String);function defined(value){return value!==undefined;}
+function hasAllProperties(fieldList,o){return(o instanceof Object)&&all(function(field){return(field in o);},fieldList);}
+function cons(x,xs){return[x,xs];}
+var emptyList=null,head=attr(0),tail=attr(1);function arrayAsList(inputArray){return reverseList(inputArray.reduce(flip(cons),emptyList));}
+var list=varArgs(arrayAsList);function listAsArray(list){return foldR(function(arraySoFar,listItem){arraySoFar.unshift(listItem);return arraySoFar;},[],list);}
+function map(fn,list){return list?cons(fn(head(list)),map(fn,tail(list))):emptyList;}
+function foldR(fn,startValue,list){return list?fn(foldR(fn,startValue,tail(list)),head(list)):startValue;}
+function foldR1(fn,list){return tail(list)?fn(foldR1(fn,tail(list)),head(list)):head(list);}
+function without(list,test,removedFn){return withoutInner(list,removedFn||noop);function withoutInner(subList,removedFn){return subList?(test(head(subList))?(removedFn(head(subList)),tail(subList)):cons(head(subList),withoutInner(tail(subList),removedFn))):emptyList;}}
+function all(fn,list){return!list||(fn(head(list))&&all(fn,tail(list)));}
+function applyEach(fnList,args){if(fnList){head(fnList).apply(null,args);applyEach(tail(fnList),args);}}
+function reverseList(list){function reverseInner(list,reversedAlready){if(!list){return reversedAlready;}
+return reverseInner(tail(list),cons(head(list),reversedAlready))}
+return reverseInner(list,emptyList);}
+function first(test,list){return list&&(test(head(list))?head(list):first(test,tail(list)));}
+function clarinet(eventBus){"use strict";var
+emitSaxKey=eventBus(SAX_KEY).emit,emitValueOpen=eventBus(SAX_VALUE_OPEN).emit,emitValueClose=eventBus(SAX_VALUE_CLOSE).emit,emitFail=eventBus(FAIL_EVENT).emit,MAX_BUFFER_LENGTH=64*1024,stringTokenPattern=/[\\"\n]/g,_n=0,BEGIN=_n++,VALUE=_n++,OPEN_OBJECT=_n++,CLOSE_OBJECT=_n++,OPEN_ARRAY=_n++,CLOSE_ARRAY=_n++,STRING=_n++,OPEN_KEY=_n++,CLOSE_KEY=_n++,TRUE=_n++,TRUE2=_n++,TRUE3=_n++,FALSE=_n++,FALSE2=_n++,FALSE3=_n++,FALSE4=_n++,NULL=_n++,NULL2=_n++,NULL3=_n++,NUMBER_DECIMAL_POINT=_n++,NUMBER_DIGIT=_n,bufferCheckPosition=MAX_BUFFER_LENGTH,latestError,c,p,textNode=undefined,numberNode="",slashed=false,closed=false,state=BEGIN,stack=[],unicodeS=null,unicodeI=0,depth=0,position=0,column=0,line=1;function checkBufferLength(){var maxActual=0;if(textNode!==undefined&&textNode.length>MAX_BUFFER_LENGTH){emitError("Max buffer length exceeded: textNode");maxActual=Math.max(maxActual,textNode.length);}
+if(numberNode.length>MAX_BUFFER_LENGTH){emitError("Max buffer length exceeded: numberNode");maxActual=Math.max(maxActual,numberNode.length);}
+bufferCheckPosition=(MAX_BUFFER_LENGTH-maxActual)
++position;}
+eventBus(STREAM_DATA).on(handleData);eventBus(STREAM_END).on(handleStreamEnd);function emitError(errorString){if(textNode!==undefined){emitValueOpen(textNode);emitValueClose();textNode=undefined;}
+latestError=Error(errorString+"\nLn: "+line+"\nCol: "+column+"\nChr: "+c);emitFail(errorReport(undefined,undefined,latestError));}
+function handleStreamEnd(){if(state==BEGIN){emitValueOpen({});emitValueClose();closed=true;return;}
+if(state!==VALUE||depth!==0)
+emitError("Unexpected end");if(textNode!==undefined){emitValueOpen(textNode);emitValueClose();textNode=undefined;}
+closed=true;}
+function whitespace(c){return c=='\r'||c=='\n'||c==' '||c=='\t';}
+function handleData(chunk){if(latestError)
+return;if(closed){return emitError("Cannot write after close");}
+var i=0;c=chunk[0];while(c){p=c;c=chunk[i++];if(!c)break;position++;if(c=="\n"){line++;column=0;}else column++;switch(state){case BEGIN:if(c==="{")state=OPEN_OBJECT;else if(c==="[")state=OPEN_ARRAY;else if(!whitespace(c))
+return emitError("Non-whitespace before {[.");continue;case OPEN_KEY:case OPEN_OBJECT:if(whitespace(c))continue;if(state===OPEN_KEY)stack.push(CLOSE_KEY);else{if(c==='}'){emitValueOpen({});emitValueClose();state=stack.pop()||VALUE;continue;}else stack.push(CLOSE_OBJECT);}
+if(c==='"')
+state=STRING;else
+return emitError("Malformed object key should start with \" ");continue;case CLOSE_KEY:case CLOSE_OBJECT:if(whitespace(c))continue;if(c===':'){if(state===CLOSE_OBJECT){stack.push(CLOSE_OBJECT);if(textNode!==undefined){emitValueOpen({});emitSaxKey(textNode);textNode=undefined;}
+depth++;}else{if(textNode!==undefined){emitSaxKey(textNode);textNode=undefined;}}
+state=VALUE;}else if(c==='}'){if(textNode!==undefined){emitValueOpen(textNode);emitValueClose();textNode=undefined;}
+emitValueClose();depth--;state=stack.pop()||VALUE;}else if(c===','){if(state===CLOSE_OBJECT)
+stack.push(CLOSE_OBJECT);if(textNode!==undefined){emitValueOpen(textNode);emitValueClose();textNode=undefined;}
+state=OPEN_KEY;}else
+return emitError('Bad object');continue;case OPEN_ARRAY:case VALUE:if(whitespace(c))continue;if(state===OPEN_ARRAY){emitValueOpen([]);depth++;state=VALUE;if(c===']'){emitValueClose();depth--;state=stack.pop()||VALUE;continue;}else{stack.push(CLOSE_ARRAY);}}
+if(c==='"')state=STRING;else if(c==='{')state=OPEN_OBJECT;else if(c==='[')state=OPEN_ARRAY;else if(c==='t')state=TRUE;else if(c==='f')state=FALSE;else if(c==='n')state=NULL;else if(c==='-'){numberNode+=c;}else if(c==='0'){numberNode+=c;state=NUMBER_DIGIT;}else if('123456789'.indexOf(c)!==-1){numberNode+=c;state=NUMBER_DIGIT;}else
+return emitError("Bad value");continue;case CLOSE_ARRAY:if(c===','){stack.push(CLOSE_ARRAY);if(textNode!==undefined){emitValueOpen(textNode);emitValueClose();textNode=undefined;}
+state=VALUE;}else if(c===']'){if(textNode!==undefined){emitValueOpen(textNode);emitValueClose();textNode=undefined;}
+emitValueClose();depth--;state=stack.pop()||VALUE;}else if(whitespace(c))
+continue;else
+return emitError('Bad array');continue;case STRING:if(textNode===undefined){textNode="";}
+var starti=i-1;STRING_BIGLOOP:while(true){while(unicodeI>0){unicodeS+=c;c=chunk.charAt(i++);if(unicodeI===4){textNode+=String.fromCharCode(parseInt(unicodeS,16));unicodeI=0;starti=i-1;}else{unicodeI++;}
+if(!c)break STRING_BIGLOOP;}
+if(c==='"'&&!slashed){state=stack.pop()||VALUE;textNode+=chunk.substring(starti,i-1);break;}
+if(c==='\\'&&!slashed){slashed=true;textNode+=chunk.substring(starti,i-1);c=chunk.charAt(i++);if(!c)break;}
+if(slashed){slashed=false;if(c==='n'){textNode+='\n';}
+else if(c==='r'){textNode+='\r';}
+else if(c==='t'){textNode+='\t';}
+else if(c==='f'){textNode+='\f';}
+else if(c==='b'){textNode+='\b';}
+else if(c==='u'){unicodeI=1;unicodeS='';}else{textNode+=c;}
+c=chunk.charAt(i++);starti=i-1;if(!c)break;else continue;}
+stringTokenPattern.lastIndex=i;var reResult=stringTokenPattern.exec(chunk);if(!reResult){i=chunk.length+1;textNode+=chunk.substring(starti,i-1);break;}
+i=reResult.index+1;c=chunk.charAt(reResult.index);if(!c){textNode+=chunk.substring(starti,i-1);break;}}
+continue;case TRUE:if(!c)continue;if(c==='r')state=TRUE2;else
+return emitError('Invalid true started with t'+c);continue;case TRUE2:if(!c)continue;if(c==='u')state=TRUE3;else
+return emitError('Invalid true started with tr'+c);continue;case TRUE3:if(!c)continue;if(c==='e'){emitValueOpen(true);emitValueClose();state=stack.pop()||VALUE;}else
+return emitError('Invalid true started with tru'+c);continue;case FALSE:if(!c)continue;if(c==='a')state=FALSE2;else
+return emitError('Invalid false started with f'+c);continue;case FALSE2:if(!c)continue;if(c==='l')state=FALSE3;else
+return emitError('Invalid false started with fa'+c);continue;case FALSE3:if(!c)continue;if(c==='s')state=FALSE4;else
+return emitError('Invalid false started with fal'+c);continue;case FALSE4:if(!c)continue;if(c==='e'){emitValueOpen(false);emitValueClose();state=stack.pop()||VALUE;}else
+return emitError('Invalid false started with fals'+c);continue;case NULL:if(!c)continue;if(c==='u')state=NULL2;else
+return emitError('Invalid null started with n'+c);continue;case NULL2:if(!c)continue;if(c==='l')state=NULL3;else
+return emitError('Invalid null started with nu'+c);continue;case NULL3:if(!c)continue;if(c==='l'){emitValueOpen(null);emitValueClose();state=stack.pop()||VALUE;}else
+return emitError('Invalid null started with nul'+c);continue;case NUMBER_DECIMAL_POINT:if(c==='.'){numberNode+=c;state=NUMBER_DIGIT;}else
+return emitError('Leading zero not followed by .');continue;case NUMBER_DIGIT:if('0123456789'.indexOf(c)!==-1)numberNode+=c;else if(c==='.'){if(numberNode.indexOf('.')!==-1)
+return emitError('Invalid number has two dots');numberNode+=c;}else if(c==='e'||c==='E'){if(numberNode.indexOf('e')!==-1||numberNode.indexOf('E')!==-1)
+return emitError('Invalid number has two exponential');numberNode+=c;}else if(c==="+"||c==="-"){if(!(p==='e'||p==='E'))
+return emitError('Invalid symbol in number');numberNode+=c;}else{if(numberNode){emitValueOpen(parseFloat(numberNode));emitValueClose();numberNode="";}
+i--;state=stack.pop()||VALUE;}
+continue;default:return emitError("Unknown state: "+state);}}
+if(position>=bufferCheckPosition)
+checkBufferLength();}}
+function ascentManager(oboeBus,handlers){"use strict";var listenerId={},ascent;function stateAfter(handler){return function(param){ascent=handler(ascent,param);}}
+for(var eventName in handlers){oboeBus(eventName).on(stateAfter(handlers[eventName]),listenerId);}
+oboeBus(NODE_SWAP).on(function(newNode){var oldHead=head(ascent),key=keyOf(oldHead),ancestors=tail(ascent),parentNode;if(ancestors){parentNode=nodeOf(head(ancestors));parentNode[key]=newNode;}});oboeBus(NODE_DROP).on(function(){var oldHead=head(ascent),key=keyOf(oldHead),ancestors=tail(ascent),parentNode;if(ancestors){parentNode=nodeOf(head(ancestors));delete parentNode[key];}});oboeBus(ABORTING).on(function(){for(var eventName in handlers){oboeBus(eventName).un(listenerId);}});}
+function parseResponseHeaders(headerStr){var headers={};headerStr&&headerStr.split('\u000d\u000a').forEach(function(headerPair){var index=headerPair.indexOf('\u003a\u0020');headers[headerPair.substring(0,index)]=headerPair.substring(index+2);});return headers;}
+function isCrossOrigin(pageLocation,ajaxHost){function defaultPort(protocol){return{'http:':80,'https:':443}[protocol];}
+function portOf(location){return location.port||defaultPort(location.protocol||pageLocation.protocol);}
+return!!((ajaxHost.protocol&&(ajaxHost.protocol!=pageLocation.protocol))||(ajaxHost.host&&(ajaxHost.host!=pageLocation.host))||(ajaxHost.host&&(portOf(ajaxHost)!=portOf(pageLocation))));}
+function parseUrlOrigin(url){var URL_HOST_PATTERN=/(\w+:)?(?:\/\/)([\w.-]+)?(?::(\d+))?\/?/,urlHostMatch=URL_HOST_PATTERN.exec(url)||[];return{protocol:urlHostMatch[1]||'',host:urlHostMatch[2]||'',port:urlHostMatch[3]||''};}
+function httpTransport(){return new XMLHttpRequest();}
+function streamingHttp(oboeBus,xhr,method,url,data,headers,withCredentials){"use strict";var emitStreamData=oboeBus(STREAM_DATA).emit,emitFail=oboeBus(FAIL_EVENT).emit,numberOfCharsAlreadyGivenToCallback=0,stillToSendStartEvent=true;oboeBus(ABORTING).on(function(){xhr.onreadystatechange=null;xhr.abort();});function handleProgress(){var textSoFar=xhr.responseText,newText=textSoFar.substr(numberOfCharsAlreadyGivenToCallback);if(newText){emitStreamData(newText);}
+numberOfCharsAlreadyGivenToCallback=len(textSoFar);}
+if('onprogress'in xhr){xhr.onprogress=handleProgress;}
+xhr.onreadystatechange=function(){function sendStartIfNotAlready(){try{stillToSendStartEvent&&oboeBus(HTTP_START).emit(xhr.status,parseResponseHeaders(xhr.getAllResponseHeaders()));stillToSendStartEvent=false;}catch(e){}}
+switch(xhr.readyState){case 2:case 3:return sendStartIfNotAlready();case 4:sendStartIfNotAlready();var successful=String(xhr.status)[0]==2;if(successful){handleProgress();oboeBus(STREAM_END).emit();}else{emitFail(errorReport(xhr.status,xhr.responseText));}}};try{xhr.open(method,url,true);for(var headerName in headers){xhr.setRequestHeader(headerName,headers[headerName]);}
+if(!isCrossOrigin(window.location,parseUrlOrigin(url))){xhr.setRequestHeader('X-Requested-With','XMLHttpRequest');}
+xhr.withCredentials=withCredentials;xhr.send(data);}catch(e){window.setTimeout(partialComplete(emitFail,errorReport(undefined,undefined,e)),0);}}
+var jsonPathSyntax=(function(){var
+regexDescriptor=function regexDescriptor(regex){return regex.exec.bind(regex);},jsonPathClause=varArgs(function(componentRegexes){componentRegexes.unshift(/^/);return regexDescriptor(RegExp(componentRegexes.map(attr('source')).join('')));}),possiblyCapturing=/(\$?)/,namedNode=/([\w-_]+|\*)/,namePlaceholder=/()/,nodeInArrayNotation=/\["([^"]+)"\]/,numberedNodeInArrayNotation=/\[(\d+|\*)\]/,fieldList=/{([\w ]*?)}/,optionalFieldList=/(?:{([\w ]*?)})?/
+,jsonPathNamedNodeInObjectNotation=jsonPathClause(possiblyCapturing,namedNode,optionalFieldList),jsonPathNamedNodeInArrayNotation=jsonPathClause(possiblyCapturing,nodeInArrayNotation,optionalFieldList),jsonPathNumberedNodeInArrayNotation=jsonPathClause(possiblyCapturing,numberedNodeInArrayNotation,optionalFieldList),jsonPathPureDuckTyping=jsonPathClause(possiblyCapturing,namePlaceholder,fieldList),jsonPathDoubleDot=jsonPathClause(/\.\./),jsonPathDot=jsonPathClause(/\./),jsonPathBang=jsonPathClause(possiblyCapturing,/!/),emptyString=jsonPathClause(/$/);return function(fn){return fn(lazyUnion(jsonPathNamedNodeInObjectNotation,jsonPathNamedNodeInArrayNotation,jsonPathNumberedNodeInArrayNotation,jsonPathPureDuckTyping),jsonPathDoubleDot,jsonPathDot,jsonPathBang,emptyString);};}());function namedNode(key,node){return{key:key,node:node};}
+var keyOf=attr('key');var nodeOf=attr('node');var ROOT_PATH={};function incrementalContentBuilder(oboeBus){var emitNodeOpened=oboeBus(NODE_OPENED).emit,emitNodeClosed=oboeBus(NODE_CLOSED).emit,emitRootOpened=oboeBus(ROOT_PATH_FOUND).emit,emitRootClosed=oboeBus(ROOT_NODE_FOUND).emit;function arrayIndicesAreKeys(possiblyInconsistentAscent,newDeepestNode){var parentNode=nodeOf(head(possiblyInconsistentAscent));return isOfType(Array,parentNode)?keyFound(possiblyInconsistentAscent,len(parentNode),newDeepestNode):possiblyInconsistentAscent;}
+function nodeOpened(ascent,newDeepestNode){if(!ascent){emitRootOpened(newDeepestNode);return keyFound(ascent,ROOT_PATH,newDeepestNode);}
+var arrayConsistentAscent=arrayIndicesAreKeys(ascent,newDeepestNode),ancestorBranches=tail(arrayConsistentAscent),previouslyUnmappedName=keyOf(head(arrayConsistentAscent));appendBuiltContent(ancestorBranches,previouslyUnmappedName,newDeepestNode);return cons(namedNode(previouslyUnmappedName,newDeepestNode),ancestorBranches);}
+function appendBuiltContent(ancestorBranches,key,node){nodeOf(head(ancestorBranches))[key]=node;}
+function keyFound(ascent,newDeepestName,maybeNewDeepestNode){if(ascent){appendBuiltContent(ascent,newDeepestName,maybeNewDeepestNode);}
+var ascentWithNewPath=cons(namedNode(newDeepestName,maybeNewDeepestNode),ascent);emitNodeOpened(ascentWithNewPath);return ascentWithNewPath;}
+function nodeClosed(ascent){emitNodeClosed(ascent);return tail(ascent)||emitRootClosed(nodeOf(head(ascent)));}
+var contentBuilderHandlers={};contentBuilderHandlers[SAX_VALUE_OPEN]=nodeOpened;contentBuilderHandlers[SAX_VALUE_CLOSE]=nodeClosed;contentBuilderHandlers[SAX_KEY]=keyFound;return contentBuilderHandlers;}
+var jsonPathCompiler=jsonPathSyntax(function(pathNodeSyntax,doubleDotSyntax,dotSyntax,bangSyntax,emptySyntax){var CAPTURING_INDEX=1;var NAME_INDEX=2;var FIELD_LIST_INDEX=3;var headKey=compose2(keyOf,head),headNode=compose2(nodeOf,head);function nameClause(previousExpr,detection){var name=detection[NAME_INDEX],matchesName=(!name||name=='*')?always:function(ascent){return headKey(ascent)==name};return lazyIntersection(matchesName,previousExpr);}
+function duckTypeClause(previousExpr,detection){var fieldListStr=detection[FIELD_LIST_INDEX];if(!fieldListStr)
+return previousExpr;var hasAllrequiredFields=partialComplete(hasAllProperties,arrayAsList(fieldListStr.split(/\W+/))),isMatch=compose2(hasAllrequiredFields,headNode);return lazyIntersection(isMatch,previousExpr);}
+function capture(previousExpr,detection){var capturing=!!detection[CAPTURING_INDEX];if(!capturing)
+return previousExpr;return lazyIntersection(previousExpr,head);}
+function skip1(previousExpr){if(previousExpr==always){return always;}
+function notAtRoot(ascent){return headKey(ascent)!=ROOT_PATH;}
+return lazyIntersection(notAtRoot,compose2(previousExpr,tail));}
+function skipMany(previousExpr){if(previousExpr==always){return always;}
+var
+terminalCaseWhenArrivingAtRoot=rootExpr(),terminalCaseWhenPreviousExpressionIsSatisfied=previousExpr,recursiveCase=skip1(function(ascent){return cases(ascent);}),cases=lazyUnion(terminalCaseWhenArrivingAtRoot,terminalCaseWhenPreviousExpressionIsSatisfied,recursiveCase);return cases;}
+function rootExpr(){return function(ascent){return headKey(ascent)==ROOT_PATH;};}
+function statementExpr(lastClause){return function(ascent){var exprMatch=lastClause(ascent);return exprMatch===true?head(ascent):exprMatch;};}
+function expressionsReader(exprs,parserGeneratedSoFar,detection){return foldR(function(parserGeneratedSoFar,expr){return expr(parserGeneratedSoFar,detection);},parserGeneratedSoFar,exprs);}
+function generateClauseReaderIfTokenFound(tokenDetector,clauseEvaluatorGenerators,jsonPath,parserGeneratedSoFar,onSuccess){var detected=tokenDetector(jsonPath);if(detected){var compiledParser=expressionsReader(clauseEvaluatorGenerators,parserGeneratedSoFar,detected),remainingUnparsedJsonPath=jsonPath.substr(len(detected[0]));return onSuccess(remainingUnparsedJsonPath,compiledParser);}}
+function clauseMatcher(tokenDetector,exprs){return partialComplete(generateClauseReaderIfTokenFound,tokenDetector,exprs);}
+var clauseForJsonPath=lazyUnion(clauseMatcher(pathNodeSyntax,list(capture,duckTypeClause,nameClause,skip1)),clauseMatcher(doubleDotSyntax,list(skipMany)),clauseMatcher(dotSyntax,list()),clauseMatcher(bangSyntax,list(capture,rootExpr)),clauseMatcher(emptySyntax,list(statementExpr)),function(jsonPath){throw Error('"'+jsonPath+'" could not be tokenised')});function returnFoundParser(_remainingJsonPath,compiledParser){return compiledParser}
+function compileJsonPathToFunction(uncompiledJsonPath,parserGeneratedSoFar){var onFind=uncompiledJsonPath?compileJsonPathToFunction:returnFoundParser;return clauseForJsonPath(uncompiledJsonPath,parserGeneratedSoFar,onFind);}
+return function(jsonPath){try{return compileJsonPathToFunction(jsonPath,always);}catch(e){throw Error('Could not compile "'+jsonPath+'" because '+e.message);}}});function singleEventPubSub(eventType,newListener,removeListener){var listenerTupleList,listenerList;function hasId(id){return function(tuple){return tuple.id==id;};}
+return{on:function(listener,listenerId){var tuple={listener:listener,id:listenerId||listener};if(newListener){newListener.emit(eventType,listener,tuple.id);}
+listenerTupleList=cons(tuple,listenerTupleList);listenerList=cons(listener,listenerList);return this;},emit:function(){applyEach(listenerList,arguments);},un:function(listenerId){var removed;listenerTupleList=without(listenerTupleList,hasId(listenerId),function(tuple){removed=tuple;});if(removed){listenerList=without(listenerList,function(listener){return listener==removed.listener;});if(removeListener){removeListener.emit(eventType,removed.listener,removed.id);}}},listeners:function(){return listenerList;},hasListener:function(listenerId){var test=listenerId?hasId(listenerId):always;return defined(first(test,listenerTupleList));}};}
+function pubSub(){var singles={},newListener=newSingle('newListener'),removeListener=newSingle('removeListener');function newSingle(eventName){return singles[eventName]=singleEventPubSub(eventName,newListener,removeListener);}
+function pubSubInstance(eventName){return singles[eventName]||newSingle(eventName);}
+['emit','on','un'].forEach(function(methodName){pubSubInstance[methodName]=varArgs(function(eventName,parameters){apply(parameters,pubSubInstance(eventName)[methodName]);});});return pubSubInstance;}
+var
+_S=1,NODE_OPENED=_S++,NODE_CLOSED=_S++,NODE_SWAP=_S++,NODE_DROP=_S++,FAIL_EVENT='fail',ROOT_NODE_FOUND=_S++,ROOT_PATH_FOUND=_S++,HTTP_START='start',STREAM_DATA='data',STREAM_END='end',ABORTING=_S++,SAX_KEY=_S++,SAX_VALUE_OPEN=_S++,SAX_VALUE_CLOSE=_S++;function errorReport(statusCode,body,error){try{var jsonBody=JSON.parse(body);}catch(e){}
+return{statusCode:statusCode,body:body,jsonBody:jsonBody,thrown:error};}
+function patternAdapter(oboeBus,jsonPathCompiler){var predicateEventMap={node:oboeBus(NODE_CLOSED),path:oboeBus(NODE_OPENED)};function emitMatchingNode(emitMatch,node,ascent){var descent=reverseList(ascent);emitMatch(node,listAsArray(tail(map(keyOf,descent))),listAsArray(map(nodeOf,descent)));}
+function addUnderlyingListener(fullEventName,predicateEvent,compiledJsonPath){var emitMatch=oboeBus(fullEventName).emit;predicateEvent.on(function(ascent){var maybeMatchingMapping=compiledJsonPath(ascent);if(maybeMatchingMapping!==false){emitMatchingNode(emitMatch,nodeOf(maybeMatchingMapping),ascent);}},fullEventName);oboeBus('removeListener').on(function(removedEventName){if(removedEventName==fullEventName){if(!oboeBus(removedEventName).listeners()){predicateEvent.un(fullEventName);}}});}
+oboeBus('newListener').on(function(fullEventName){var match=/(node|path):(.*)/.exec(fullEventName);if(match){var predicateEvent=predicateEventMap[match[1]];if(!predicateEvent.hasListener(fullEventName)){addUnderlyingListener(fullEventName,predicateEvent,jsonPathCompiler(match[2]));}}})}
+function instanceApi(oboeBus,contentSource){var oboeApi,fullyQualifiedNamePattern=/^(node|path):./,rootNodeFinishedEvent=oboeBus(ROOT_NODE_FOUND),emitNodeDrop=oboeBus(NODE_DROP).emit,emitNodeSwap=oboeBus(NODE_SWAP).emit,addListener=varArgs(function(eventId,parameters){if(oboeApi[eventId]){apply(parameters,oboeApi[eventId]);}else{var event=oboeBus(eventId),listener=parameters[0];if(fullyQualifiedNamePattern.test(eventId)){addForgettableCallback(event,listener);}else{event.on(listener);}}
+return oboeApi;}),removeListener=function(eventId,p2,p3){if(eventId=='done'){rootNodeFinishedEvent.un(p2);}else if(eventId=='node'||eventId=='path'){oboeBus.un(eventId+':'+p2,p3);}else{var listener=p2;oboeBus(eventId).un(listener);}
+return oboeApi;};function addProtectedCallback(eventName,callback){oboeBus(eventName).on(protectedCallback(callback),callback);return oboeApi;}
+function addForgettableCallback(event,callback,listenerId){listenerId=listenerId||callback;var safeCallback=protectedCallback(callback);event.on(function(){var discard=false;oboeApi.forget=function(){discard=true;};apply(arguments,safeCallback);delete oboeApi.forget;if(discard){event.un(listenerId);}},listenerId);return oboeApi;}
+function protectedCallback(callback){return function(){try{return callback.apply(oboeApi,arguments);}catch(e){setTimeout(function(){throw new Error(e.message);});}}}
+function fullyQualifiedPatternMatchEvent(type,pattern){return oboeBus(type+':'+pattern);}
+function wrapCallbackToSwapNodeIfSomethingReturned(callback){return function(){var returnValueFromCallback=callback.apply(this,arguments);if(defined(returnValueFromCallback)){if(returnValueFromCallback==oboe.drop){emitNodeDrop();}else{emitNodeSwap(returnValueFromCallback);}}}}
+function addSingleNodeOrPathListener(eventId,pattern,callback){var effectiveCallback;if(eventId=='node'){effectiveCallback=wrapCallbackToSwapNodeIfSomethingReturned(callback);}else{effectiveCallback=callback;}
+addForgettableCallback(fullyQualifiedPatternMatchEvent(eventId,pattern),effectiveCallback,callback);}
+function addMultipleNodeOrPathListeners(eventId,listenerMap){for(var pattern in listenerMap){addSingleNodeOrPathListener(eventId,pattern,listenerMap[pattern]);}}
+function addNodeOrPathListenerApi(eventId,jsonPathOrListenerMap,callback){if(isString(jsonPathOrListenerMap)){addSingleNodeOrPathListener(eventId,jsonPathOrListenerMap,callback);}else{addMultipleNodeOrPathListeners(eventId,jsonPathOrListenerMap);}
+return oboeApi;}
+oboeBus(ROOT_PATH_FOUND).on(function(rootNode){oboeApi.root=functor(rootNode);});oboeBus(HTTP_START).on(function(_statusCode,headers){oboeApi.header=function(name){return name?headers[name]:headers;}});return oboeApi={on:addListener,addListener:addListener,removeListener:removeListener,emit:oboeBus.emit,node:partialComplete(addNodeOrPathListenerApi,'node'),path:partialComplete(addNodeOrPathListenerApi,'path'),done:partialComplete(addForgettableCallback,rootNodeFinishedEvent),start:partialComplete(addProtectedCallback,HTTP_START),fail:oboeBus(FAIL_EVENT).on,abort:oboeBus(ABORTING).emit,write:oboeBus(STREAM_DATA).emit,finish:oboeBus(STREAM_END).emit,header:noop,root:noop,source:contentSource};}
+function wire(httpMethodName,contentSource,body,headers,withCredentials){var oboeBus=pubSub();if(contentSource){streamingHttp(oboeBus,httpTransport(),httpMethodName,contentSource,body,headers,withCredentials);}
+clarinet(oboeBus);ascentManager(oboeBus,incrementalContentBuilder(oboeBus));patternAdapter(oboeBus,jsonPathCompiler);return instanceApi(oboeBus,contentSource);}
+function applyDefaults(passthrough,url,httpMethodName,body,headers,withCredentials,cached){headers=headers?JSON.parse(JSON.stringify(headers)):{};if(body){if(!isString(body)){body=JSON.stringify(body);headers['Content-Type']=headers['Content-Type']||'application/json';}}else{body=null;}
+function modifiedUrl(baseUrl,cached){if(cached===false){if(baseUrl.indexOf('?')==-1){baseUrl+='?';}else{baseUrl+='&';}
+baseUrl+='_='+new Date().getTime();}
+return baseUrl;}
+return passthrough(httpMethodName||'GET',modifiedUrl(url,cached),body,headers,withCredentials||false);}
+function oboe(arg1){var nodeStreamMethodNames=list('resume','pause','pipe'),isStream=partialComplete(hasAllProperties,nodeStreamMethodNames);if(arg1){if(isStream(arg1)||isString(arg1)){return applyDefaults(wire,arg1);}else{return applyDefaults(wire,arg1.url,arg1.method,arg1.body,arg1.headers,arg1.withCredentials,arg1.cached);}}else{return wire();}}
+oboe.drop=function(){return oboe.drop;};if(typeof define==="function"&&define.amd){define("oboe",[],function(){return oboe;});}else if(typeof exports==='object'){module.exports=oboe;}else{window.oboe=oboe;}})((function(){try{return window;}catch(e){return self;}}()),Object,Array,Error,JSON);'use strict';if(tr.isHeadless){global.window={};}'use strict';if(tr.isVinn){global.oboe=global.window.oboe;global.window=undefined;}else if(tr.isNode){global.window=undefined;const path=HTMLImportsLoader.hrefToAbsolutePath('/oboe/dist/oboe-node.js');global.oboe=require(path);}'use strict';tr.exportTo('tr.e.importer',function(){const STRING_ID_SUFFIX='_sid';const PLURAL_STRING_ID_SUFFIX='_sids';function isStringReference(s){return s.endsWith(STRING_ID_SUFFIX)||s.endsWith(PLURAL_STRING_ID_SUFFIX);}
+function getStringReferenceName(name){if(name.endsWith(PLURAL_STRING_ID_SUFFIX)){return name.slice(0,-PLURAL_STRING_ID_SUFFIX.length);}
+return name.slice(0,-STRING_ID_SUFFIX.length);}
+function deferenceStrings(idToString,o){const clone=Object.assign({},o);for(const[key,value]of Object.entries(clone)){if(isStringReference(key)){const name=getStringReferenceName(key);clone[name]=idToString(value);}}
+return clone;}
+function singularize(word){if(word.endsWith('s')){return word.slice(0,-1);}
+return word;}
+function getMetadataPairs(dataJson){const isMetadata=v=>typeof v!=='object'||Array.isArray(v);const pairs=Object.entries(dataJson);const metadataPairs=pairs.filter(([_,v])=>isMetadata(v));return metadataPairs;}
+function getGroupPairs(dataJson){const pairs=Object.entries(dataJson);const nonMapPairs=pairs.filter(([k,_])=>k!=='maps');const groupPairs=nonMapPairs.filter(([_,v])=>typeof v==='object');return groupPairs;}
+function createMap(mapJson){const map=new Map();for(const entry of mapJson){if(entry.id===undefined){throw new Error('Missing required key "id" in streaming event.');}
+map.set(entry.id,entry);}
+return map;}
+function createMaps(mapsJson){const maps=new Map();for(const[name,mapJson]of Object.entries(mapsJson)){maps.set(name,createMap(mapJson));}
+return maps;}
+function createGroup(groupJson,opt_startTime){const entries=[];const n=Object.values(groupJson)[0].length;for(let i=0;i<n;i++){const entry={};for(const name in groupJson){entry[name]=groupJson[name][i];}
+entries.push(entry);}
+const timeDelta=groupJson.timeDelta;if(opt_startTime===undefined&&timeDelta!==undefined){throw new Error('Missing required key "startTime" in streaming event.');}
+if(opt_startTime){let delta=0;for(const entry of entries){delta+=entry.timeDelta?entry.timeDelta:0;entry.time=opt_startTime+delta;}}
+return entries;}
+function createGroups(groupsJson,opt_startTime){const groups=new Map();for(const[name,groupJson]of Object.entries(groupsJson)){groups.set(name,createGroup(groupJson,opt_startTime));}
+return groups;}
+function createMetadata(metadataPairs){const metadata=new Map();for(const[name,value]of metadataPairs){metadata.set(name,value);}
+if(metadata.get('version')===undefined){throw new Error('Missing required key "version" in streaming event.');}
+return metadata;}
+class ProfilingDictionaryReader{constructor(opt_metadata,opt_maps,opt_groups,opt_parent){this.metadata=opt_metadata||new Map();this.maps=opt_maps||new Map();this.groups=opt_groups||new Map();this.parent_=opt_parent||undefined;this.inflated_=undefined;this.raw_=undefined;this.boundGetString_=this.getString.bind(this);this.deferenceStrings_=o=>deferenceStrings(this.boundGetString_,o);}
+static empty(){return new ProfilingDictionaryReader();}
+get parent(){return this.parent_;}
+get raw(){if(this.raw_)return this.raw_;this.raw_={};for(const[name,group]of this.groups.entries()){this.raw_[name]=group;}
+return this.raw_;}
+get inflated(){if(this.inflated_)return this.inflated_;this.inflated_={};for(const[name,group]of this.groups.entries()){this.inflated_[name]=this.inflateGroup(group);}
+return this.inflated_;}
+getNewMap(name){return this.maps.get(name)||new Map();}
+getMapValue(mapName,id){let value=this.getNewMap(mapName).get(id);if(value===undefined&&this.parent){value=this.parent.getMapValue(mapName,id);}
+return value;}
+getString(id){const value=this.getMapValue('strings',id);if(value===undefined)return undefined;return value.string;}
+hasMap(name){if(this.maps.has(name))return true;if(this.parent===undefined)return false;return this.parent.hasMap(name);}
+inflateGroup(group){return group.map(this.inflateEntry.bind(this));}
+inflateEntry(entry){const inflatedEntry={};for(const[name,value]of Object.entries(entry)){let inflatedValue;if(this.hasMap(name)){const id=value;inflatedValue=this.deferenceStrings_(this.getMapValue(name,id));}else{inflatedValue=value;}
+inflatedEntry[singularize(name)]=inflatedValue;}
+return this.deferenceStrings_(inflatedEntry);}
+expandData(data){const mapsJson=data.maps||{};const groupsJson=data.allocators||{};const metadataPairs=getMetadataPairs(data);const metadata=createMetadata(metadataPairs);const opt_startTime=metadata.get('startTime');const maps=createMaps(mapsJson);const groups=createGroups(groupsJson,opt_startTime);return new ProfilingDictionaryReader(metadata,maps,groups,this);}
+expandEvent(event){return this.expandData(event.args.data);}}
+return{ProfilingDictionaryReader,singularize,deferenceStringsForTest:deferenceStrings,};});'use strict';tr.exportTo('tr.model.source_info',function(){function SourceInfo(file,opt_line,opt_column){this.file_=file;this.line_=opt_line||-1;this.column_=opt_column||-1;}
+SourceInfo.prototype={get file(){return this.file_;},get line(){return this.line_;},get column(){return this.column_;},get domain(){if(!this.file_)return undefined;const domain=this.file_.match(/(.*:\/\/[^:\/]*)/i);return domain?domain[1]:undefined;},toString(){let str='';if(this.file_){str+=this.file_;}
+if(this.line_>0){str+=':'+this.line_;}
+if(this.column_>0){str+=':'+this.column_;}
+return str;}};return{SourceInfo,};});'use strict';tr.exportTo('tr.model.source_info',function(){function JSSourceInfo(file,line,column,isNative,scriptId,state){tr.model.source_info.SourceInfo.call(this,file,line,column);this.isNative_=isNative;this.scriptId_=scriptId;this.state_=state;}
+JSSourceInfo.prototype={__proto__:tr.model.source_info.SourceInfo.prototype,get state(){return this.state_;},get isNative(){return this.isNative_;},get scriptId(){return this.scriptId_;},toString(){const str=this.isNative_?'[native v8] ':'';return str+
+tr.model.source_info.SourceInfo.prototype.toString.call(this);}};const JSSourceState={COMPILED:'compiled',OPTIMIZABLE:'optimizable',OPTIMIZED:'optimized',UNKNOWN:'unknown',};return{JSSourceInfo,JSSourceState,};});'use strict';tr.exportTo('tr.e.importer',function(){function TraceCodeEntry(address,size,name,scriptId){this.id_=tr.b.GUID.allocateSimple();this.address_=address;this.size_=size;const rePrefix=/^(\w*:)?([*~]?)(.*)$/m;const tokens=rePrefix.exec(name);const prefix=tokens[1];let state=tokens[2];const body=tokens[3];if(state==='*'){state=tr.model.source_info.JSSourceState.OPTIMIZED;}else if(state==='~'){state=tr.model.source_info.JSSourceState.OPTIMIZABLE;}else if(state===''){state=tr.model.source_info.JSSourceState.COMPILED;}else{state=tr.model.source_info.JSSourceState.UNKNOWN;}
+let rawName;let rawUrl;if(prefix==='Script:'){rawName='';rawUrl=body;}else{const spacePos=body.lastIndexOf(' ');rawName=spacePos!==-1?body.substr(0,spacePos):body;rawUrl=spacePos!==-1?body.substr(spacePos+1):'';}
+function splitLineAndColumn(url){const lineColumnRegEx=/(?::(\d+))?(?::(\d+))?$/;const lineColumnMatch=lineColumnRegEx.exec(url);let lineNumber;let columnNumber;if(typeof(lineColumnMatch[1])==='string'){lineNumber=parseInt(lineColumnMatch[1],10);lineNumber=isNaN(lineNumber)?undefined:lineNumber-1;}
+if(typeof(lineColumnMatch[2])==='string'){columnNumber=parseInt(lineColumnMatch[2],10);columnNumber=isNaN(columnNumber)?undefined:columnNumber-1;}
+return{url:url.substring(0,url.length-lineColumnMatch[0].length),lineNumber,columnNumber};}
+const nativeSuffix=' native';const isNative=rawName.endsWith(nativeSuffix);this.name_=isNative?rawName.slice(0,-nativeSuffix.length):rawName;const urlData=splitLineAndColumn(rawUrl);const url=urlData.url||'';const line=urlData.lineNumber||0;const column=urlData.columnNumber||0;this.sourceInfo_=new tr.model.source_info.JSSourceInfo(url,line,column,isNative,scriptId,state);}
+TraceCodeEntry.prototype={get id(){return this.id_;},get sourceInfo(){return this.sourceInfo_;},get name(){return this.name_;},set address(address){this.address_=address;},get address(){return this.address_;},set size(size){this.size_=size;},get size(){return this.size_;}};return{TraceCodeEntry,};});'use strict';tr.exportTo('tr.e.importer',function(){function TraceCodeMap(){this.banks_=new Map();}
+TraceCodeMap.prototype={addEntry(addressHex,size,name,scriptId){const entry=new tr.e.importer.TraceCodeEntry(this.getAddress_(addressHex),size,name,scriptId);this.addEntry_(addressHex,entry);},moveEntry(oldAddressHex,newAddressHex,size){const entry=this.getBank_(oldAddressHex).removeEntry(this.getAddress_(oldAddressHex));if(!entry)return;entry.address=this.getAddress_(newAddressHex);entry.size=size;this.addEntry_(newAddressHex,entry);},lookupEntry(addressHex){return this.getBank_(addressHex).lookupEntry(this.getAddress_(addressHex));},addEntry_(addressHex,entry){this.getBank_(addressHex).addEntry(entry);},getAddress_(addressHex){const bankSizeHexDigits=13;addressHex=addressHex.slice(2);return parseInt(addressHex.slice(-bankSizeHexDigits),16);},getBank_(addressHex){addressHex=addressHex.slice(2);const bankSizeHexDigits=13;const maxHexDigits=16;const bankName=addressHex.slice(-maxHexDigits,-bankSizeHexDigits);let bank=this.banks_.get(bankName);if(!bank){bank=new TraceCodeBank();this.banks_.set(bankName,bank);}
+return bank;}};function TraceCodeBank(){this.entries_=[];}
+TraceCodeBank.prototype={removeEntry(address){if(this.entries_.length===0)return undefined;const index=tr.b.math.findLowIndexInSortedArray(this.entries_,function(entry){return entry.address;},address);const entry=this.entries_[index];if(!entry||entry.address!==address)return undefined;this.entries_.splice(index,1);return entry;},lookupEntry(address){const index=tr.b.math.findHighIndexInSortedArray(this.entries_,function(e){return address-e.address;})-1;const entry=this.entries_[index];return entry&&address<entry.address+entry.size?entry:undefined;},addEntry(newEntry){if(this.entries_.length===0){this.entries_.push(newEntry);}
+const endAddress=newEntry.address+newEntry.size;const lastIndex=tr.b.math.findLowIndexInSortedArray(this.entries_,function(entry){return entry.address;},endAddress);let index;for(index=lastIndex-1;index>=0;--index){const entry=this.entries_[index];const entryEndAddress=entry.address+entry.size;if(entryEndAddress<=newEntry.address)break;}
+++index;this.entries_.splice(index,lastIndex-index,newEntry);}};return{TraceCodeMap,};});'use strict';tr.exportTo('tr.importer',function(){function ContextProcessor(model){this.model_=model;this.activeContexts_=[];this.stackPerType_={};this.contextCache_={};this.contextSetCache_={};this.cachedEntryForActiveContexts_=undefined;this.seenSnapshots_={};}
+ContextProcessor.prototype={enterContext(contextType,scopedId){const newActiveContexts=[this.getOrCreateContext_(contextType,scopedId),];for(const oldContext of this.activeContexts_){if(oldContext.type===contextType){this.pushContext_(oldContext);}else{newActiveContexts.push(oldContext);}}
+this.activeContexts_=newActiveContexts;this.cachedEntryForActiveContexts_=undefined;},leaveContext(contextType,scopedId){this.leaveContextImpl_(context=>context.type===contextType&&context.snapshot.scope===scopedId.scope&&context.snapshot.idRef===scopedId.id);},destroyContext(scopedId){for(const stack of Object.values(this.stackPerType_)){let newLength=0;for(let i=0;i<stack.length;++i){if(stack[i].snapshot.scope!==scopedId.scope||stack[i].snapshot.idRef!==scopedId.id){stack[newLength++]=stack[i];}}
+stack.length=newLength;}
+this.leaveContextImpl_(context=>context.snapshot.scope===scopedId.scope&&context.snapshot.idRef===scopedId.id);},leaveContextImpl_(predicate){const newActiveContexts=[];for(const oldContext of this.activeContexts_){if(predicate(oldContext)){const previousContext=this.popContext_(oldContext.type);if(previousContext){newActiveContexts.push(previousContext);}}else{newActiveContexts.push(oldContext);}}
+this.activeContexts_=newActiveContexts;this.cachedEntryForActiveContexts_=undefined;},getOrCreateContext_(contextType,scopedId){const context={type:contextType,snapshot:{scope:scopedId.scope,idRef:scopedId.id}};const key=this.getContextKey_(context);if(key in this.contextCache_){return this.contextCache_[key];}
+this.contextCache_[key]=context;const snapshotKey=this.getSnapshotKey_(scopedId);this.seenSnapshots_[snapshotKey]=true;return context;},pushContext_(context){if(!(context.type in this.stackPerType_)){this.stackPerType_[context.type]=[];}
+this.stackPerType_[context.type].push(context);},popContext_(contextType){if(!(contextType in this.stackPerType_)){return undefined;}
+return this.stackPerType_[contextType].pop();},getContextKey_(context){return[context.type,context.snapshot.scope,context.snapshot.idRef].join('\x00');},getSnapshotKey_(scopedId){return[scopedId.scope,scopedId.idRef].join('\x00');},get activeContexts(){if(this.cachedEntryForActiveContexts_===undefined){let key=[];for(const context of this.activeContexts_){key.push(this.getContextKey_(context));}
+key.sort();key=key.join('\x00');if(key in this.contextSetCache_){this.cachedEntryForActiveContexts_=this.contextSetCache_[key];}else{this.activeContexts_.sort(function(a,b){const keyA=this.getContextKey_(a);const keyB=this.getContextKey_(b);if(keyA<keyB){return-1;}
+if(keyA>keyB){return 1;}
+return 0;}.bind(this));this.contextSetCache_[key]=Object.freeze(this.activeContexts_);this.cachedEntryForActiveContexts_=this.contextSetCache_[key];}}
+return this.cachedEntryForActiveContexts_;},invalidateContextCacheForSnapshot(scopedId){const snapshotKey=this.getSnapshotKey_(scopedId);if(!(snapshotKey in this.seenSnapshots_))return;this.contextCache_={};this.contextSetCache_={};this.cachedEntryForActiveContexts_=undefined;this.activeContexts_=this.activeContexts_.map(function(context){if(context.snapshot.scope!==scopedId.scope||context.snapshot.idRef!==scopedId.id){return context;}
+return{type:context.type,snapshot:{scope:context.snapshot.scope,idRef:context.snapshot.idRef}};});this.seenSnapshots_={};},};return{ContextProcessor,};});'use strict';tr.exportTo('tr.model',function(){function Annotation(){this.guid_=tr.b.GUID.allocateSimple();this.view_=undefined;}
+Annotation.fromDictIfPossible=function(args){if(args.typeName===undefined){throw new Error('Missing typeName argument');}
+const typeInfo=Annotation.findTypeInfoMatching(function(typeInfo){return typeInfo.metadata.typeName===args.typeName;});if(typeInfo===undefined)return undefined;return typeInfo.constructor.fromDict(args);};Annotation.fromDict=function(){throw new Error('Not implemented');};Annotation.prototype={get guid(){return this.guid_;},onRemove(){},toDict(){throw new Error('Not implemented');},getOrCreateView(viewport){if(!this.view_){this.view_=this.createView_(viewport);}
+return this.view_;},createView_(){throw new Error('Not implemented');}};const options=new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE);tr.b.decorateExtensionRegistry(Annotation,options);Annotation.addEventListener('will-register',function(e){if(!e.typeInfo.constructor.hasOwnProperty('fromDict')){throw new Error('Must have fromDict method');}
+if(!e.typeInfo.metadata.typeName){throw new Error('Registered Annotations must provide typeName');}});return{Annotation,};});'use strict';tr.exportTo('tr.model',function(){function YComponent(stableId,yPercentOffset){this.stableId=stableId;this.yPercentOffset=yPercentOffset;}
+YComponent.prototype={toDict(){return{stableId:this.stableId,yPercentOffset:this.yPercentOffset};}};function Location(xWorld,yComponents){this.xWorld_=xWorld;this.yComponents_=yComponents;}
+Location.fromViewCoordinates=function(viewport,viewX,viewY){const dt=viewport.currentDisplayTransform;const xWorld=dt.xViewToWorld(viewX);const yComponents=[];let elem=document.elementFromPoint(viewX+viewport.modelTrackContainer.canvas.offsetLeft,viewY+viewport.modelTrackContainer.canvas.offsetTop);while(elem instanceof tr.ui.tracks.Track){if(elem.eventContainer){const boundRect=elem.getBoundingClientRect();const yPercentOffset=(viewY-boundRect.top)/boundRect.height;yComponents.push(new YComponent(elem.eventContainer.stableId,yPercentOffset));}
+elem=elem.parentElement;}
+if(yComponents.length===0)return;return new Location(xWorld,yComponents);};Location.fromStableIdAndTimestamp=function(viewport,stableId,ts){const xWorld=ts;const yComponents=[];const containerToTrack=viewport.containerToTrackMap;let elem=containerToTrack.getTrackByStableId(stableId);if(!elem)return;const firstY=elem.getBoundingClientRect().top;while(elem instanceof tr.ui.tracks.Track){if(elem.eventContainer){const boundRect=elem.getBoundingClientRect();const yPercentOffset=(firstY-boundRect.top)/boundRect.height;yComponents.push(new YComponent(elem.eventContainer.stableId,yPercentOffset));}
+elem=elem.parentElement;}
+if(yComponents.length===0)return;return new Location(xWorld,yComponents);};Location.prototype={get xWorld(){return this.xWorld_;},getContainingTrack(viewport){const containerToTrack=viewport.containerToTrackMap;for(const i in this.yComponents_){const yComponent=this.yComponents_[i];const track=containerToTrack.getTrackByStableId(yComponent.stableId);if(track!==undefined)return track;}},toViewCoordinates(viewport){const dt=viewport.currentDisplayTransform;const containerToTrack=viewport.containerToTrackMap;const viewX=dt.xWorldToView(this.xWorld_);let viewY=-1;for(const index in this.yComponents_){const yComponent=this.yComponents_[index];const track=containerToTrack.getTrackByStableId(yComponent.stableId);if(track!==undefined){const boundRect=track.getBoundingClientRect();viewY=yComponent.yPercentOffset*boundRect.height+boundRect.top;break;}}
+return{viewX,viewY};},toDict(){return{xWorld:this.xWorld_,yComponents:this.yComponents_};}};return{Location,};});'use strict';tr.exportTo('tr.ui.annotations',function(){function AnnotationView(viewport,annotation){}
+AnnotationView.prototype={draw(ctx){throw new Error('Not implemented');}};return{AnnotationView,};});'use strict';tr.exportTo('tr.ui.annotations',function(){function RectAnnotationView(viewport,annotation){this.viewport_=viewport;this.annotation_=annotation;}
+RectAnnotationView.prototype={__proto__:tr.ui.annotations.AnnotationView.prototype,draw(ctx){const dt=this.viewport_.currentDisplayTransform;const startCoords=this.annotation_.startLocation.toViewCoordinates(this.viewport_);const endCoords=this.annotation_.endLocation.toViewCoordinates(this.viewport_);let startY=startCoords.viewY-ctx.canvas.getBoundingClientRect().top;const sizeY=endCoords.viewY-startCoords.viewY;if(startY+sizeY<0){startY=sizeY;}else if(startY<0){startY=0;}
+ctx.fillStyle=this.annotation_.fillStyle;ctx.fillRect(startCoords.viewX,startY,endCoords.viewX-startCoords.viewX,sizeY);}};return{RectAnnotationView,};});'use strict';tr.exportTo('tr.model',function(){function RectAnnotation(start,end){tr.model.Annotation.apply(this,arguments);this.startLocation_=start;this.endLocation_=end;this.fillStyle='rgba(255, 180, 0, 0.3)';}
+RectAnnotation.fromDict=function(dict){const args=dict.args;const startLoc=new tr.model.Location(args.start.xWorld,args.start.yComponents);const endLoc=new tr.model.Location(args.end.xWorld,args.end.yComponents);return new tr.model.RectAnnotation(startLoc,endLoc);};RectAnnotation.prototype={__proto__:tr.model.Annotation.prototype,get startLocation(){return this.startLocation_;},get endLocation(){return this.endLocation_;},toDict(){return{typeName:'rect',args:{start:this.startLocation.toDict(),end:this.endLocation.toDict()}};},createView_(viewport){return new tr.ui.annotations.RectAnnotationView(viewport,this);}};tr.model.Annotation.register(RectAnnotation,{typeName:'rect'});return{RectAnnotation,};});'use strict';tr.exportTo('tr.ui.annotations',function(){function CommentBoxAnnotationView(viewport,annotation){this.viewport_=viewport;this.annotation_=annotation;this.textArea_=undefined;this.styleWidth=250;this.styleHeight=50;this.fontSize=10;this.rightOffset=50;this.topOffset=25;}
+CommentBoxAnnotationView.prototype={__proto__:tr.ui.annotations.AnnotationView.prototype,removeTextArea(){Polymer.dom(Polymer.dom(this.textArea_).parentNode).removeChild(this.textArea_);},draw(ctx){const coords=this.annotation_.location.toViewCoordinates(this.viewport_);if(coords.viewX<0){if(this.textArea_){this.textArea_.style.visibility='hidden';}
+return;}
+if(!this.textArea_){this.textArea_=document.createElement('textarea');this.textArea_.style.position='absolute';this.textArea_.readOnly=true;this.textArea_.value=this.annotation_.text;this.textArea_.style.zIndex=1;Polymer.dom(Polymer.dom(ctx.canvas).parentNode).appendChild(this.textArea_);}
+this.textArea_.style.width=this.styleWidth+'px';this.textArea_.style.height=this.styleHeight+'px';this.textArea_.style.fontSize=this.fontSize+'px';this.textArea_.style.visibility='visible';this.textArea_.style.left=coords.viewX+ctx.canvas.getBoundingClientRect().left+
+this.rightOffset+'px';this.textArea_.style.top=coords.viewY-ctx.canvas.getBoundingClientRect().top-
+this.topOffset+'px';ctx.strokeStyle='rgb(0, 0, 0)';ctx.lineWidth=2;ctx.beginPath();tr.ui.b.drawLine(ctx,coords.viewX,coords.viewY-ctx.canvas.getBoundingClientRect().top,coords.viewX+this.rightOffset,coords.viewY-this.topOffset-
+ctx.canvas.getBoundingClientRect().top);ctx.stroke();}};return{CommentBoxAnnotationView,};});'use strict';tr.exportTo('tr.model',function(){function CommentBoxAnnotation(location,text){tr.model.Annotation.apply(this,arguments);this.location=location;this.text=text;}
+CommentBoxAnnotation.fromDict=function(dict){const args=dict.args;const location=new tr.model.Location(args.location.xWorld,args.location.yComponents);return new tr.model.CommentBoxAnnotation(location,args.text);};CommentBoxAnnotation.prototype={__proto__:tr.model.Annotation.prototype,onRemove(){this.view_.removeTextArea();},toDict(){return{typeName:'comment_box',args:{text:this.text,location:this.location.toDict()}};},createView_(viewport){return new tr.ui.annotations.CommentBoxAnnotationView(viewport,this);}};tr.model.Annotation.register(CommentBoxAnnotation,{typeName:'comment_box'});return{CommentBoxAnnotation,};});'use strict';tr.exportTo('tr.model',function(){function ScopedId(scope,id,pid){if(scope===undefined){throw new Error('Scope should be defined. Use \''+
+tr.model.OBJECT_DEFAULT_SCOPE+'\' as the default scope.');}
+this.scope=scope;this.id=id;this.pid=pid;}
+ScopedId.prototype={toString(){const pidStr=this.pid===undefined?'':'pid: '+this.pid+', ';return'{'+pidStr+'scope: '+this.scope+', id: '+this.id+'}';},toStringWithDelimiter(delim){return(this.pid===undefined?'':this.pid)+delim+
+this.scope+delim+this.id;}};return{ScopedId,};});'use strict';tr.exportTo('tr.ui.annotations',function(){function XMarkerAnnotationView(viewport,annotation){this.viewport_=viewport;this.annotation_=annotation;}
+XMarkerAnnotationView.prototype={__proto__:tr.ui.annotations.AnnotationView.prototype,draw(ctx){const dt=this.viewport_.currentDisplayTransform;const viewX=dt.xWorldToView(this.annotation_.timestamp);ctx.beginPath();tr.ui.b.drawLine(ctx,viewX,0,viewX,ctx.canvas.height);ctx.strokeStyle=this.annotation_.strokeStyle;ctx.stroke();}};return{XMarkerAnnotationView,};});'use strict';tr.exportTo('tr.model',function(){function XMarkerAnnotation(timestamp){tr.model.Annotation.apply(this,arguments);this.timestamp=timestamp;this.strokeStyle='rgba(0, 0, 255, 0.5)';}
+XMarkerAnnotation.fromDict=function(dict){return new XMarkerAnnotation(dict.args.timestamp);};XMarkerAnnotation.prototype={__proto__:tr.model.Annotation.prototype,toDict(){return{typeName:'xmarker',args:{timestamp:this.timestamp}};},createView_(viewport){return new tr.ui.annotations.XMarkerAnnotationView(viewport,this);}};tr.model.Annotation.register(XMarkerAnnotation,{typeName:'xmarker'});return{XMarkerAnnotation,};});'use strict';tr.exportTo('tr.e.importer',function(){const Base64=tr.b.Base64;const deepCopy=tr.b.deepCopy;const ColorScheme=tr.b.ColorScheme;const HeapDumpTraceEventImporter=tr.e.importer.HeapDumpTraceEventImporter;const LegacyHeapDumpTraceEventImporter=tr.e.importer.LegacyHeapDumpTraceEventImporter;const StreamingEventExpander=tr.e.importer.StreamingEventExpander;const ProfilingDictionaryReader=tr.e.importer.ProfilingDictionaryReader;function getEventColor(event,opt_customName){if(event.cname){return ColorScheme.getColorIdForReservedName(event.cname);}else if(opt_customName||event.name){return ColorScheme.getColorIdForGeneralPurposeString(opt_customName||event.name);}}
+function isLegacyChromeClockSyncEvent(event){return event.name!==undefined&&event.name.startsWith(LEGACY_CHROME_CLOCK_SYNC_EVENT_NAME_PREFIX)&&((event.ph==='S')||(event.ph==='F'));}
+const PRODUCER='producer';const CONSUMER='consumer';const STEP='step';const BACKGROUND=tr.model.ContainerMemoryDump.LevelOfDetail.BACKGROUND;const LIGHT=tr.model.ContainerMemoryDump.LevelOfDetail.LIGHT;const DETAILED=tr.model.ContainerMemoryDump.LevelOfDetail.DETAILED;const MEMORY_DUMP_LEVEL_OF_DETAIL_ORDER=[undefined,BACKGROUND,LIGHT,DETAILED];const GLOBAL_MEMORY_ALLOCATOR_DUMP_PREFIX='global/';const LEGACY_CHROME_CLOCK_SYNC_EVENT_NAME_PREFIX='ClockSyncEvent.';const BYTE_STAT_NAME_MAP={'pc':'privateCleanResident','pd':'privateDirtyResident','sc':'sharedCleanResident','sd':'sharedDirtyResident','pss':'proportionalResident','sw':'swapped'};const WEAK_MEMORY_ALLOCATOR_DUMP_FLAG=1<<0;const OBJECT_TYPE_NAME_PATTERNS=[{prefix:'const char *WTF::getStringWithTypeName() [T = ',suffix:']'},{prefix:'const char* WTF::getStringWithTypeName() [with T = ',suffix:']'},{prefix:'const char *__cdecl WTF::getStringWithTypeName<',suffix:'>(void)'}];const SUBTRACE_FIELDS=new Set(['powerTraceAsString','systemTraceEvents',]);const NON_METADATA_FIELDS=new Set(['displayTimeUnit','samples','stackFrames','traceAnnotations','traceEvents',...SUBTRACE_FIELDS]);function TraceEventImporter(model,eventData){this.hasEvents_=undefined;this.importPriority=1;this.model_=model;this.events_=undefined;this.sampleEvents_=undefined;this.stackFrameEvents_=undefined;this.stackFrameTree_=new tr.model.ProfileTree();this.subtraces_=[];this.eventsWereFromString_=false;this.softwareMeasuredCpuCount_=undefined;this.allAsyncEvents_=[];this.allFlowEvents_=[];this.allObjectEvents_=[];this.contextProcessorPerThread={};this.traceEventSampleStackFramesByName_={};this.v8ProcessCodeMaps_={};this.v8ProcessRootStackFrame_={};this.v8SamplingData_=[];this.profileTrees_=new Map();this.profileInfo_=new Map();this.legacyChromeClockSyncStartEvent_=undefined;this.legacyChromeClockSyncFinishEvent_=undefined;this.allMemoryDumpEvents_={};this.heapProfileExpander=new ProfilingDictionaryReader();this.objectTypeNameMap_={};this.clockDomainId_=tr.model.ClockDomainId.UNKNOWN_CHROME_LEGACY;this.toModelTime_=undefined;if(typeof(eventData)==='string'||eventData instanceof String){eventData=eventData.trim();if(eventData[0]==='['){eventData=eventData.replace(/\s*,\s*$/,'');if(eventData[eventData.length-1]!==']'){eventData=eventData+']';}}
+this.events_=JSON.parse(eventData);this.eventsWereFromString_=true;}else{this.events_=eventData;}
+if(this.events_.traceEvents){const container=this.events_;this.events_=this.events_.traceEvents;for(const subtraceField of SUBTRACE_FIELDS){if(container[subtraceField]){this.storeSubtrace_(container[subtraceField]);}}
+this.storeSamples_(container.samples);this.storeStackFrames_(container.stackFrames);this.storeDisplayTimeUnit_(container.displayTimeUnit);this.storeTraceAnnotations_(container.traceAnnotations);this.storeMetadata_(container);}else if(this.events_ instanceof tr.b.TraceStream){const parser=oboe().node('{cat ph}',function(e){return oboe.drop;}).node('!.powerTraceAsString',this.storeSubtrace_.bind(this)).node('!.systemTraceEvents',this.storeSubtrace_.bind(this)).node('!.samples',this.storeSamples_.bind(this)).node('!.stackFrames',this.storeStackFrames_.bind(this)).node('!.displayTimeUnit',this.storeDisplayTimeUnit_.bind(this)).node('!.traceAnnotations',this.storeTraceAnnotations_.bind(this)).done(this.storeMetadata_.bind(this));this.events_.rewind();while(this.events_.hasData){parser.write(this.events_.readNumBytes());}
+parser.finish();}}
+TraceEventImporter.canImport=function(eventData){if(eventData instanceof tr.b.TraceStream){if(eventData.isBinary)return false;eventData=eventData.header;}
+if(typeof(eventData)==='string'||eventData instanceof String){eventData=eventData.trim();return eventData[0]==='{'||eventData[0]==='[';}
+if(eventData instanceof Array&&eventData.length&&eventData[0].ph){return true;}
+if(eventData.traceEvents){if(eventData.traceEvents instanceof Array){if(eventData.traceEvents.length&&eventData.traceEvents[0].ph){return true;}
+if(eventData.samples&&eventData.samples.length&&eventData.stackFrames!==undefined){return true;}}}
+return false;};TraceEventImporter.scopedIdForEvent_=function(event){const scope=event.scope||tr.model.OBJECT_DEFAULT_SCOPE;let pid=undefined;if(event.id!==undefined){if(event.id2!==undefined){throw new Error('Event has both id and id2');}
+pid=tr.model.LOCAL_ID_PHASES.has(event.ph)?event.pid:undefined;return new tr.model.ScopedId(scope,event.id,pid);}else if(event.id2!==undefined){if(event.id2.global!==undefined){return new tr.model.ScopedId(scope,event.id2.global);}else if(event.id2.local!==undefined){return new tr.model.ScopedId(scope,event.id2.local,event.pid);}
+throw new Error('Event that uses id2 must have either a global or local ID');}
+return undefined;};TraceEventImporter.prototype={__proto__:tr.importer.Importer.prototype,get importerName(){return'TraceEventImporter';},extractSubtraces(){const subtraces=this.subtraces_;this.subtraces_=[];return subtraces;},deepCopyIfNeeded_(obj){if(obj===undefined)obj={};if(this.eventsWereFromString_)return obj;return deepCopy(obj);},deepCopyAlways_(obj){if(obj===undefined)obj={};return deepCopy(obj);},processAsyncEvent(event){const thread=this.model_.getOrCreateProcess(event.pid).getOrCreateThread(event.tid);this.allAsyncEvents_.push({sequenceNumber:this.allAsyncEvents_.length,event,thread});},processFlowEvent(event,opt_slice){const thread=this.model_.getOrCreateProcess(event.pid).getOrCreateThread(event.tid);this.allFlowEvents_.push({refGuid:tr.b.GUID.getLastSimpleGuid(),sequenceNumber:this.allFlowEvents_.length,event,slice:opt_slice,thread});},processCounterEvent(event){let ctrName;if(event.id!==undefined){ctrName=event.name+'['+event.id+']';}else{ctrName=event.name;}
+const ctr=this.model_.getOrCreateProcess(event.pid).getOrCreateCounter(event.cat,ctrName);const reservedColorId=event.cname?getEventColor(event):undefined;if(ctr.numSeries===0){for(const seriesName in event.args){const colorId=reservedColorId||getEventColor(event,ctr.name+'.'+seriesName);ctr.addSeries(new tr.model.CounterSeries(seriesName,colorId));}
+if(ctr.numSeries===0){this.model_.importWarning({type:'counter_parse_error',message:'Expected counter '+event.name+' to have at least one argument to use as a value.'});delete ctr.parent.counters[ctr.name];return;}}
+const ts=this.toModelTimeFromUs_(event.ts);ctr.series.forEach(function(series){const val=event.args[series.name]?event.args[series.name]:0;series.addCounterSample(ts,val);});},processObjectEvent(event){const thread=this.model_.getOrCreateProcess(event.pid).getOrCreateThread(event.tid);this.allObjectEvents_.push({sequenceNumber:this.allObjectEvents_.length,event,thread});if(thread.guid in this.contextProcessorPerThread){const processor=this.contextProcessorPerThread[thread.guid];const scopedId=TraceEventImporter.scopedIdForEvent_(event);if(event.ph==='D'){processor.destroyContext(scopedId);}
+processor.invalidateContextCacheForSnapshot(scopedId);}},processContextEvent(event){const thread=this.model_.getOrCreateProcess(event.pid).getOrCreateThread(event.tid);if(!(thread.guid in this.contextProcessorPerThread)){this.contextProcessorPerThread[thread.guid]=new tr.importer.ContextProcessor(this.model_);}
+const scopedId=TraceEventImporter.scopedIdForEvent_(event);const contextType=event.name;const processor=this.contextProcessorPerThread[thread.guid];if(event.ph==='('){processor.enterContext(contextType,scopedId);}else if(event.ph===')'){processor.leaveContext(contextType,scopedId);}else{this.model_.importWarning({type:'unknown_context_phase',message:'Unknown context event phase: '+event.ph+'.'});}},setContextsFromThread_(thread,slice){if(thread.guid in this.contextProcessorPerThread){slice.contexts=this.contextProcessorPerThread[thread.guid].activeContexts;}},processDurationEvent(event){const thread=this.model_.getOrCreateProcess(event.pid).getOrCreateThread(event.tid);const ts=this.toModelTimeFromUs_(event.ts);if(!thread.sliceGroup.isTimestampValidForBeginOrEnd(ts)){this.model_.importWarning({type:'duration_parse_error',message:'Timestamps are moving backward.'});return;}
+if(event.ph==='B'){const slice=thread.sliceGroup.beginSlice(event.cat,event.name,this.toModelTimeFromUs_(event.ts),this.deepCopyIfNeeded_(event.args),this.toModelTimeFromUs_(event.tts),event.argsStripped,getEventColor(event));slice.startStackFrame=this.getStackFrameForEvent_(event);this.setContextsFromThread_(thread,slice);}else if(event.ph==='I'||event.ph==='i'||event.ph==='R'){if(event.s!==undefined&&event.s!=='t'){throw new Error('This should never happen');}
+thread.sliceGroup.beginSlice(event.cat,event.name,this.toModelTimeFromUs_(event.ts),this.deepCopyIfNeeded_(event.args),this.toModelTimeFromUs_(event.tts),event.argsStripped,getEventColor(event));const slice=thread.sliceGroup.endSlice(this.toModelTimeFromUs_(event.ts),this.toModelTimeFromUs_(event.tts));slice.startStackFrame=this.getStackFrameForEvent_(event);slice.endStackFrame=undefined;}else{if(!thread.sliceGroup.openSliceCount){this.model_.importWarning({type:'duration_parse_error',message:'E phase event without a matching B phase event.'});return;}
+const slice=thread.sliceGroup.endSlice(this.toModelTimeFromUs_(event.ts),this.toModelTimeFromUs_(event.tts),getEventColor(event));if(event.name&&slice.title!==event.name){this.model_.importWarning({type:'title_match_error',message:'Titles do not match. Title is '+
+slice.title+' in openSlice, and is '+
+event.name+' in endSlice'});}
+slice.endStackFrame=this.getStackFrameForEvent_(event);this.mergeArgsInto_(slice.args,event.args,slice.title);}},mergeArgsInto_(dstArgs,srcArgs,eventName){for(const arg in srcArgs){if(dstArgs[arg]!==undefined){this.model_.importWarning({type:'arg_merge_error',message:'Different phases of '+eventName+' provided values for argument '+arg+'.'+' The last provided value will be used.'});}
+dstArgs[arg]=this.deepCopyIfNeeded_(srcArgs[arg]);}},processCompleteEvent(event){if(event.cat!==undefined&&event.cat.indexOf('trace_event_overhead')>-1){return undefined;}
+const thread=this.model_.getOrCreateProcess(event.pid).getOrCreateThread(event.tid);if(event.flow_out){if(event.flow_in){event.flowPhase=STEP;}else{event.flowPhase=PRODUCER;}}else if(event.flow_in){event.flowPhase=CONSUMER;}
+const slice=thread.sliceGroup.pushCompleteSlice(event.cat,event.name,this.toModelTimeFromUs_(event.ts),this.maybeToModelTimeFromUs_(event.dur),this.maybeToModelTimeFromUs_(event.tts),this.maybeToModelTimeFromUs_(event.tdur),this.deepCopyIfNeeded_(event.args),event.argsStripped,getEventColor(event),event.bind_id);slice.startStackFrame=this.getStackFrameForEvent_(event);slice.endStackFrame=this.getStackFrameForEvent_(event,true);this.setContextsFromThread_(thread,slice);return slice;},processJitCodeEvent(event){if(this.v8ProcessCodeMaps_[event.pid]===undefined){this.v8ProcessCodeMaps_[event.pid]=new tr.e.importer.TraceCodeMap();}
+const map=this.v8ProcessCodeMaps_[event.pid];const data=event.args.data;if(event.name==='JitCodeMoved'){map.moveEntry(data.code_start,data.new_code_start,data.code_len);}else{map.addEntry(data.code_start,data.code_len,data.name,data.script_id);}},processMetadataEvent(event){if(event.name==='JitCodeAdded'||event.name==='JitCodeMoved'){this.v8SamplingData_.push(event);return;}
+if(event.argsStripped)return;if(event.name==='process_name'){const process=this.model_.getOrCreateProcess(event.pid);process.name=event.args.name;}else if(event.name==='process_labels'){const process=this.model_.getOrCreateProcess(event.pid);const labels=event.args.labels.split(',');for(let i=0;i<labels.length;i++){process.addLabelIfNeeded(labels[i]);}}else if(event.name==='process_uptime_seconds'){const process=this.model_.getOrCreateProcess(event.pid);process.uptime_seconds=event.args.uptime;}else if(event.name==='process_sort_index'){const process=this.model_.getOrCreateProcess(event.pid);process.sortIndex=event.args.sort_index;}else if(event.name==='thread_name'){const thread=this.model_.getOrCreateProcess(event.pid).getOrCreateThread(event.tid);thread.name=event.args.name;}else if(event.name==='thread_sort_index'){const thread=this.model_.getOrCreateProcess(event.pid).getOrCreateThread(event.tid);thread.sortIndex=event.args.sort_index;}else if(event.name==='num_cpus'){let n=event.args.number;if(this.softwareMeasuredCpuCount_!==undefined){n=Math.max(n,this.softwareMeasuredCpuCount_);}
+this.softwareMeasuredCpuCount_=n;}else if(event.name==='stackFrames'){const stackFrames=event.args.stackFrames;if(stackFrames===undefined){this.model_.importWarning({type:'metadata_parse_error',message:'No stack frames found in a \''+event.name+'\' metadata event'});}else{this.importStackFrames_(stackFrames,'p'+event.pid+':');}}else if(event.name==='typeNames'){const objectTypeNameMap=event.args.typeNames;if(objectTypeNameMap===undefined){this.model_.importWarning({type:'metadata_parse_error',message:'No mapping from object type IDs to names found in a \''+
+event.name+'\' metadata event'});}else{this.importObjectTypeNameMap_(objectTypeNameMap,event.pid);}}else if(event.name==='TraceConfig'){this.model_.metadata.push({name:'TraceConfig',value:event.args.value});}else{this.model_.importWarning({type:'metadata_parse_error',message:'Unrecognized metadata name: '+event.name});}},processInstantEvent(event){if(event.name==='JitCodeAdded'||event.name==='JitCodeMoved'){this.v8SamplingData_.push(event);return;}
+if(event.s==='t'||event.s===undefined){this.processDurationEvent(event);return;}
+let constructor;switch(event.s){case'g':constructor=tr.model.GlobalInstantEvent;break;case'p':constructor=tr.model.ProcessInstantEvent;break;default:this.model_.importWarning({type:'instant_parse_error',message:'I phase event with unknown "s" field value.'});return;}
+const instantEvent=new constructor(event.cat,event.name,getEventColor(event),this.toModelTimeFromUs_(event.ts),this.deepCopyIfNeeded_(event.args));switch(instantEvent.type){case tr.model.InstantEventType.GLOBAL:this.model_.instantEvents.push(instantEvent);break;case tr.model.InstantEventType.PROCESS:{const process=this.model_.getOrCreateProcess(event.pid);process.instantEvents.push(instantEvent);break;}
+default:throw new Error('Unknown instant event type: '+event.s);}},getOrCreateProfileTree_(sampleType,id){if(!this.profileTrees_.has(sampleType)){this.profileTrees_.set(sampleType,new Map());}
+const profileTreeMap=this.profileTrees_.get(sampleType);if(profileTreeMap.has(id)){return profileTreeMap.get(id);}
+const profileTree=new tr.model.ProfileTree();profileTreeMap.set(id,profileTree);const info=this.profileInfo_.get(id);if(info!==undefined){profileTree.startTime=info.startTime;profileTree.pid=info.pid;profileTree.tid=info.tid;}
+return profileTree;},processSample(event){if(event.args===undefined||event.args.data===undefined){return;}
+if(event.id===undefined){throw new Error('No event ID in sample');}
+const data=event.args.data;if(data.startTime!==undefined){this.profileInfo_.set(event.id,{startTime:data.startTime,pid:event.pid,tid:event.tid});}
+const timeDeltas=data.timeDeltas;for(const sampleType in data){if(sampleType==='timeDeltas'||sampleType==='startTime'){continue;}
+if(data[sampleType].samples&&timeDeltas&&data[sampleType].samples.length!==timeDeltas.length){throw new Error('samples and timeDeltas array should have same length');}
+const profileTree=this.getOrCreateProfileTree_(sampleType,event.id);const nodes=data[sampleType].nodes;const samples=data[sampleType].samples;if(nodes!==undefined){for(const node of nodes){const ProfileNodeType=tr.model.ProfileNode.subTypes.getConstructor(undefined,sampleType);const profileNode=ProfileNodeType.constructFromObject(profileTree,node);if(profileNode===undefined){continue;}
+profileTree.add(profileNode);}}
+if(samples!==undefined){const thread=this.model_.getOrCreateProcess(profileTree.pid).getOrCreateThread(profileTree.tid);for(let i=0,len=samples.length;i<len;++i){const node=profileTree.getNode(samples[i]);profileTree.endTime+=timeDeltas[i];const start=this.toModelTimeFromUs_(profileTree.endTime);this.model_.samples.push(new tr.model.Sample(start,node.sampleTitle,node,thread));}}}},processLegacyV8Sample(event){const data=event.args.data;const sampleType='legacySample';const ProfileNodeType=tr.model.ProfileNode.subTypes.getConstructor(undefined,sampleType);if(data.vm_state==='js'&&!data.stack.length)return;const profileTree=this.getOrCreateProfileTree_(sampleType,event.pid);if(profileTree.getNode(-1)===undefined){profileTree.add(new ProfileNodeType(-1,{url:'',scriptId:-1,functionName:'unknown'},undefined));}
+let node=undefined;if(data.stack.length>0&&this.v8ProcessCodeMaps_[event.pid]){const map=this.v8ProcessCodeMaps_[event.pid];data.stack.reverse();let parentNode=undefined;for(let i=0;i<data.stack.length;i++){const entry=map.lookupEntry(data.stack[i]);if(entry===undefined){node=profileTree.getNode(-1);}else{node=profileTree.getNode(entry.id);if(node===undefined){const sourceInfo=entry.sourceInfo;node=new ProfileNodeType(entry.id,{functionName:entry.name,url:entry.sourceInfo.file,lineNumber:sourceInfo.line!==-1?sourceInfo.line:undefined,columnNumber:sourceInfo.column!==-1?sourceInfo.column:undefined,scriptid:entry.sourceInfo.scriptId},parentNode);profileTree.add(node);}}
+parentNode=node;}}else{node=profileTree.getNode(data.vm_state);if(node===undefined){node=new ProfileNodeType(data.vm_state,{url:'',functionName:data.vm_state},undefined);profileTree.add(node);}}
+const thread=this.model_.getOrCreateProcess(event.pid).getOrCreateThread(event.tid);this.model_.samples.push(new tr.model.Sample(this.toModelTimeFromUs_(event.ts),node.sampleTitle,node,thread));},processTraceSampleEvent(event){if(event.name==='V8Sample'||event.name.startsWith('Profile')){this.v8SamplingData_.push(event);return;}
+let node=this.stackFrameTree_.getNode(event.name);if(node===undefined&&event.sf!==undefined){node=this.stackFrameTree_.getNode('g'+event.sf);}
+if(node===undefined){let id=event.name;if(event.sf){id='g'+event.sf;}
+const ProfileNodeType=tr.model.ProfileNode.subTypes.getConstructor(undefined,'legacySample');node=this.stackFrameTree_.add(new ProfileNodeType(id,{functionName:event.name},undefined));}
+const thread=this.model_.getOrCreateProcess(event.pid).getOrCreateThread(event.tid);const sample=new tr.model.Sample(this.toModelTimeFromUs_(event.ts),'Trace Event Sample',node,thread,undefined,1,this.deepCopyIfNeeded_(event.args));this.setContextsFromThread_(thread,sample);this.model_.samples.push(sample);},processMemoryDumpEvent(event){if(event.ph!=='v'){throw new Error('Invalid memory dump event phase "'+event.ph+'".');}
+const dumpId=event.id;if(dumpId===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Memory dump event (phase \''+event.ph+'\') without a dump ID.'});return;}
+const pid=event.pid;if(pid===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Memory dump event (phase\''+event.ph+'\', dump ID \''+
+dumpId+'\') without a PID.'});return;}
+const allEvents=this.allMemoryDumpEvents_;let dumpIdEvents=allEvents[dumpId];if(dumpIdEvents===undefined){allEvents[dumpId]=dumpIdEvents={};}
+let processEvents=dumpIdEvents[pid];if(processEvents===undefined){dumpIdEvents[pid]=processEvents=[];}
+processEvents.push(event);},processClockSyncEvent(event){if(event.ph!=='c'){throw new Error('Invalid clock sync event phase "'+event.ph+'".');}
+const syncId=event.args.sync_id;if(syncId===undefined){this.model_.importWarning({type:'clock_sync_parse_error',message:'Clock sync at time '+event.ts+' without an ID.'});return;}
+if(event.args&&event.args.issue_ts!==undefined){this.model_.clockSyncManager.addClockSyncMarker(this.clockDomainId_,syncId,tr.b.Unit.timestampFromUs(event.args.issue_ts),tr.b.Unit.timestampFromUs(event.ts));}else{this.model_.clockSyncManager.addClockSyncMarker(this.clockDomainId_,syncId,tr.b.Unit.timestampFromUs(event.ts));}},processLegacyChromeClockSyncEvent(event){if(event.ph==='S'){this.legacyChromeClockSyncStartEvent_=event;}else if(event.ph==='F'){this.legacyChromeClockSyncFinishEvent_=event;}
+if(this.legacyChromeClockSyncStartEvent_===undefined||this.legacyChromeClockSyncFinishEvent_===undefined){return;}
+const startSyncId=this.legacyChromeClockSyncStartEvent_.name.substring(LEGACY_CHROME_CLOCK_SYNC_EVENT_NAME_PREFIX.length);const finishSyncId=this.legacyChromeClockSyncFinishEvent_.name.substring(LEGACY_CHROME_CLOCK_SYNC_EVENT_NAME_PREFIX.length);if(startSyncId!==finishSyncId){throw new Error('Inconsistent clock sync ID of legacy Chrome clock sync events');}
+this.model_.clockSyncManager.addClockSyncMarker(this.clockDomainId_,startSyncId,tr.b.Unit.timestampFromUs(this.legacyChromeClockSyncStartEvent_.ts),tr.b.Unit.timestampFromUs(this.legacyChromeClockSyncFinishEvent_.ts));},processV8Events(){this.v8SamplingData_.sort(function(a,b){if(a.ts!==b.ts)return a.ts-b.ts;if(a.ph==='M'||a.ph==='I'){return-1;}else if(b.ph==='M'||b.ph==='I'){return 1;}
+return 0;});const length=this.v8SamplingData_.length;for(let i=0;i<length;++i){const event=this.v8SamplingData_[i];if(event.ph==='M'||event.ph==='I'){this.processJitCodeEvent(event);}else if(event.ph==='P'){if(event.name.startsWith('Profile')){this.processSample(event);}else{this.processLegacyV8Sample(event);}}}},importClockSyncMarkers(){if(this.events_ instanceof tr.b.TraceStream){const parser=oboe().node('{cat ph}',this.importClockSyncMarker_.bind(this));this.events_.rewind();while(this.events_.hasData){parser.write(this.events_.readNumBytes());}
+parser.finish();}else{for(let i=0;i<this.events_.length;i++){this.importClockSyncMarker_(this.events_[i]);}}},importClockSyncMarker_(event){const isLegacyChromeClockSync=isLegacyChromeClockSyncEvent(event);if(event.ph!=='c'&&!isLegacyChromeClockSync)return;const eventSizeInBytes=this.model_.importOptions.trackDetailedModelStats?JSON.stringify(event).length:undefined;this.model_.stats.willProcessBasicTraceEvent('clock_sync',event.cat,event.name,event.ts,eventSizeInBytes);if(isLegacyChromeClockSync){this.processLegacyChromeClockSyncEvent(event);}else{this.processClockSyncEvent(event);}},importEvents(){this.hasEvents_=false;if(this.stackFrameEvents_){this.importStackFrames_(this.stackFrameEvents_,'g');}
+if(this.traceAnnotations_)this.importAnnotations_();if(this.events_ instanceof tr.b.TraceStream){const parser=oboe().node('{cat ph}',this.processEvent_.bind(this));this.events_.rewind();while(this.events_.hasData){parser.write(this.events_.readNumBytes());}
+parser.finish();}else{for(let eI=0;eI<this.events_.length;eI++){this.processEvent_(this.events_[eI]);}}
+this.processV8Events();for(const frame of Object.values(this.v8ProcessRootStackFrame_)){frame.removeAllChildren();}},storeSubtrace_(subtrace){this.subtraces_.push(subtrace);return oboe.drop;},storeSamples_(samples){this.sampleEvents_=samples;return oboe.drop;},storeStackFrames_(stackFrames){this.stackFrameEvents_=stackFrames;return oboe.drop;},storeDisplayTimeUnit_(unitName){if(!unitName)return;const unit=tr.b.TimeDisplayModes[unitName];if(unit===undefined){throw new Error('Unit '+unitName+' is not supported.');}
+this.model_.intrinsicTimeUnit=unit;return oboe.drop;},storeTraceAnnotations_(traceAnnotations){this.traceAnnotations_=traceAnnotations;return oboe.drop;},storeMetadata_(container){for(const fieldName of Object.keys(container)){if(NON_METADATA_FIELDS.has(fieldName))continue;this.model_.metadata.push({name:fieldName,value:container[fieldName]});if(fieldName!=='metadata')continue;const metadata=container[fieldName];if(metadata['highres-ticks']){this.model_.isTimeHighResolution=metadata['highres-ticks'];}
+if(metadata['clock-domain']){this.clockDomainId_=metadata['clock-domain'];}}
+return oboe.drop;},processEvent_(event){this.hasEvents_=true;const importOptions=this.model_.importOptions;const trackDetailedModelStats=importOptions.trackDetailedModelStats;const modelStats=this.model_.stats;if(event.args==='__stripped__'){event.argsStripped=true;event.args=undefined;}
+let eventSizeInBytes=undefined;if(trackDetailedModelStats){eventSizeInBytes=JSON.stringify(event).length;}
+switch(event.ph){case'B':case'E':modelStats.willProcessBasicTraceEvent('begin_end (non-compact)',event.cat,event.name,event.ts,eventSizeInBytes);this.processDurationEvent(event);break;case'X':{modelStats.willProcessBasicTraceEvent('begin_end (compact)',event.cat,event.name,event.ts,eventSizeInBytes);const slice=this.processCompleteEvent(event);if(slice!==undefined&&event.bind_id!==undefined){this.processFlowEvent(event,slice);}
+break;}
+case'b':case'e':case'n':case'S':case'F':case'T':case'p':modelStats.willProcessBasicTraceEvent('async',event.cat,event.name,event.ts,eventSizeInBytes);this.processAsyncEvent(event);break;case'I':case'i':case'R':modelStats.willProcessBasicTraceEvent('instant',event.cat,event.name,event.ts,eventSizeInBytes);this.processInstantEvent(event);break;case'P':modelStats.willProcessBasicTraceEvent('samples',event.cat,event.name,event.ts,eventSizeInBytes);this.processTraceSampleEvent(event);break;case'C':modelStats.willProcessBasicTraceEvent('counters',event.cat,event.name,event.ts,eventSizeInBytes);this.processCounterEvent(event);break;case'M':modelStats.willProcessBasicTraceEvent('metadata',event.cat,event.name,event.ts,eventSizeInBytes);this.processMetadataEvent(event);break;case'N':case'D':case'O':modelStats.willProcessBasicTraceEvent('objects',event.cat,event.name,event.ts,eventSizeInBytes);this.processObjectEvent(event);break;case's':case't':case'f':modelStats.willProcessBasicTraceEvent('flows',event.cat,event.name,event.ts,eventSizeInBytes);this.processFlowEvent(event);break;case'v':modelStats.willProcessBasicTraceEvent('memory_dumps',event.cat,event.name,event.ts,eventSizeInBytes);this.processMemoryDumpEvent(event);break;case'(':case')':this.processContextEvent(event);break;case'c':break;default:modelStats.willProcessBasicTraceEvent('unknown',event.cat,event.name,event.ts,eventSizeInBytes);this.model_.importWarning({type:'parse_error',message:'Unrecognized event phase: '+
+event.ph+' ('+event.name+')'});}
+return oboe.drop;},importStackFrames_(rawStackFrames,idPrefix){const model=this.model_;for(const id in rawStackFrames){const rawStackFrame=rawStackFrames[id];const fullId=idPrefix+id;const textForColor=rawStackFrame.category?rawStackFrame.category:rawStackFrame.name;const stackFrame=new tr.model.StackFrame(undefined,fullId,rawStackFrame.name,ColorScheme.getColorIdForGeneralPurposeString(textForColor));model.addStackFrame(stackFrame);}
+for(const id in rawStackFrames){const fullId=idPrefix+id;const stackFrame=model.stackFrames[fullId];if(stackFrame===undefined){throw new Error('Internal error');}
+const rawStackFrame=rawStackFrames[id];const parentId=rawStackFrame.parent;let parentStackFrame;if(parentId===undefined){parentStackFrame=undefined;}else{const parentFullId=idPrefix+parentId;parentStackFrame=model.stackFrames[parentFullId];if(parentStackFrame===undefined){this.model_.importWarning({type:'metadata_parse_error',message:'Missing parent frame with ID '+parentFullId+' for stack frame \''+stackFrame.name+'\' (ID '+fullId+').'});}}
+stackFrame.parentFrame=parentStackFrame;}
+const ProfileNodeType=tr.model.ProfileNode.subTypes.getConstructor(undefined,'legacySample');if(idPrefix==='g'){for(const id in rawStackFrames){const rawStackFrame=rawStackFrames[id];const textForColor=rawStackFrame.category?rawStackFrame.category:rawStackFrame.name;const node=this.stackFrameTree_.add(new ProfileNodeType('g'+id,{functionName:rawStackFrame.name},undefined));node.colorId=ColorScheme.getColorIdForGeneralPurposeString(textForColor);node.parentId=rawStackFrame.parent;}
+for(const id in rawStackFrames){const node=this.stackFrameTree_.getNode('g'+id);const parentId=node.parentId;let parentNode=undefined;if(parentId!==undefined){parentNode=this.stackFrameTree_.getNode('g'+parentId);if(parentNode===undefined){this.model_.importWarning({type:'metadata_parse_error',message:'Missing parent frame with ID '+parentId+' for stack frame \''+node.name+'\' (ID '+node.id+').'});}
+node.parentNode=parentNode;}}}},importObjectTypeNameMap_(rawObjectTypeNameMap,pid){if(pid in this.objectTypeNameMap_){this.model_.importWarning({type:'metadata_parse_error',message:'Mapping from object type IDs to names provided for pid='+
+pid+' multiple times.'});return;}
+let objectTypeNamePrefix=undefined;let objectTypeNameSuffix=undefined;const objectTypeNameMap={};for(const objectTypeId in rawObjectTypeNameMap){const rawObjectTypeName=rawObjectTypeNameMap[objectTypeId];if(objectTypeNamePrefix===undefined){for(let i=0;i<OBJECT_TYPE_NAME_PATTERNS.length;i++){const pattern=OBJECT_TYPE_NAME_PATTERNS[i];if(rawObjectTypeName.startsWith(pattern.prefix)&&rawObjectTypeName.endsWith(pattern.suffix)){objectTypeNamePrefix=pattern.prefix;objectTypeNameSuffix=pattern.suffix;break;}}}
+if(objectTypeNamePrefix!==undefined&&rawObjectTypeName.startsWith(objectTypeNamePrefix)&&rawObjectTypeName.endsWith(objectTypeNameSuffix)){objectTypeNameMap[objectTypeId]=rawObjectTypeName.substring(objectTypeNamePrefix.length,rawObjectTypeName.length-objectTypeNameSuffix.length);}else{objectTypeNameMap[objectTypeId]=rawObjectTypeName;}}
+this.objectTypeNameMap_[pid]=objectTypeNameMap;},importAnnotations_(){for(const id in this.traceAnnotations_){const annotation=tr.model.Annotation.fromDictIfPossible(this.traceAnnotations_[id]);if(!annotation){this.model_.importWarning({type:'annotation_warning',message:'Unrecognized traceAnnotation typeName \"'+
+this.traceAnnotations_[id].typeName+'\"'});continue;}
+this.model_.addAnnotation(annotation);}},finalizeImport(){if(this.softwareMeasuredCpuCount_!==undefined){this.model_.kernel.softwareMeasuredCpuCount=this.softwareMeasuredCpuCount_;}
+this.createAsyncSlices_();this.createFlowSlices_();this.createExplicitObjects_();this.createImplicitObjects_();this.createMemoryDumps_();},getStackFrameForEvent_(event,opt_lookForEndEvent){let sf;let stack;if(opt_lookForEndEvent){sf=event.esf;stack=event.estack;}else{sf=event.sf;stack=event.stack;}
+if(stack!==undefined&&sf!==undefined){this.model_.importWarning({type:'stack_frame_and_stack_error',message:'Event at '+event.ts+' cannot have both a stack and a stackframe.'});return undefined;}
+if(stack!==undefined){return this.model_.resolveStackToStackFrame_(event.pid,stack);}
+if(sf===undefined)return undefined;const stackFrame=this.model_.stackFrames['g'+sf];if(stackFrame===undefined){this.model_.importWarning({type:'sample_import_error',message:'No frame for '+sf});return;}
+return stackFrame;},resolveStackToStackFrame_(pid,stack){return undefined;},importSampleData(){if(!this.sampleEvents_)return;const m=this.model_;const events=this.sampleEvents_;if(this.hasEvents_===undefined){throw new Error('importEvents is not run before importSampleData');}else if(!this.hasEvents_){for(let i=0;i<events.length;i++){const event=events[i];m.getOrCreateProcess(event.tid).getOrCreateThread(event.tid);}}
+const threadsByTid={};m.getAllThreads().forEach(function(t){threadsByTid[t.tid]=t;});for(let i=0;i<events.length;i++){const event=events[i];const thread=threadsByTid[event.tid];if(thread===undefined){m.importWarning({type:'sample_import_error',message:'Thread '+events.tid+'not found'});continue;}
+let cpu;if(event.cpu!==undefined){cpu=m.kernel.getOrCreateCpu(event.cpu);}
+const leafNode=this.stackFrameTree_.getNode('g'+event.sf);const sample=new tr.model.Sample(this.toModelTimeFromUs_(event.ts),event.name,leafNode,thread,cpu,event.weight);m.samples.push(sample);}},createAsyncSlices_(){if(this.allAsyncEvents_.length===0)return;this.allAsyncEvents_.sort(function(x,y){const d=x.event.ts-y.event.ts;if(d!==0)return d;return x.sequenceNumber-y.sequenceNumber;});const legacyEvents=[];const nestableAsyncEventsByKey={};const nestableMeasureAsyncEventsByKey={};for(let i=0;i<this.allAsyncEvents_.length;i++){const asyncEventState=this.allAsyncEvents_[i];const event=asyncEventState.event;if(event.ph==='S'||event.ph==='F'||event.ph==='T'||event.ph==='p'){legacyEvents.push(asyncEventState);continue;}
+if(event.cat===undefined){this.model_.importWarning({type:'async_slice_parse_error',message:'Nestable async events (ph: b, e, or n) require a '+'cat parameter.'});continue;}
+if(event.name===undefined){this.model_.importWarning({type:'async_slice_parse_error',message:'Nestable async events (ph: b, e, or n) require a '+'name parameter.'});continue;}
+const id=TraceEventImporter.scopedIdForEvent_(event);if(id===undefined){this.model_.importWarning({type:'async_slice_parse_error',message:'Nestable async events (ph: b, e, or n) require an '+'id parameter.'});continue;}
+if(event.cat==='blink.user_timing'){const matched=/([^\/:]+):([^\/:]+)\/?(.*)/.exec(event.name);if(matched!==null){const key=matched[1]+':'+event.cat;event.args=JSON.parse(Base64.atob(matched[3])||'{}');if(nestableMeasureAsyncEventsByKey[key]===undefined){nestableMeasureAsyncEventsByKey[key]=[];}
+nestableMeasureAsyncEventsByKey[key].push(asyncEventState);continue;}}
+const key=event.cat+':'+id.toStringWithDelimiter(':');if(nestableAsyncEventsByKey[key]===undefined){nestableAsyncEventsByKey[key]=[];}
+nestableAsyncEventsByKey[key].push(asyncEventState);}
+this.createLegacyAsyncSlices_(legacyEvents);this.createNestableAsyncSlices_(nestableMeasureAsyncEventsByKey);this.createNestableAsyncSlices_(nestableAsyncEventsByKey);},createLegacyAsyncSlices_(legacyEvents){if(legacyEvents.length===0)return;legacyEvents.sort(function(x,y){const d=x.event.ts-y.event.ts;if(d!==0)return d;return x.sequenceNumber-y.sequenceNumber;});const asyncEventStatesByNameThenID={};for(let i=0;i<legacyEvents.length;i++){const asyncEventState=legacyEvents[i];const event=asyncEventState.event;const name=event.name;if(name===undefined){this.model_.importWarning({type:'async_slice_parse_error',message:'Async events (ph: S, T, p, or F) require a name '+' parameter.'});continue;}
+const id=TraceEventImporter.scopedIdForEvent_(event);if(id===undefined){this.model_.importWarning({type:'async_slice_parse_error',message:'Async events (ph: S, T, p, or F) require an id parameter.'});continue;}
+const key=id.toStringWithDelimiter(':');if(event.ph==='S'){if(asyncEventStatesByNameThenID[name]===undefined){asyncEventStatesByNameThenID[name]={};}
+if(asyncEventStatesByNameThenID[name][key]){this.model_.importWarning({type:'async_slice_parse_error',message:'At '+event.ts+', a slice of the same id '+id+' was alrady open.'});continue;}
+asyncEventStatesByNameThenID[name][key]=[];asyncEventStatesByNameThenID[name][key].push(asyncEventState);}else{if(asyncEventStatesByNameThenID[name]===undefined){this.model_.importWarning({type:'async_slice_parse_error',message:'At '+event.ts+', no slice named '+name+' was open.'});continue;}
+if(asyncEventStatesByNameThenID[name][key]===undefined){this.model_.importWarning({type:'async_slice_parse_error',message:'At '+event.ts+', no slice named '+name+' with id='+id+' was open.'});continue;}
+const events=asyncEventStatesByNameThenID[name][key];events.push(asyncEventState);if(event.ph==='F'){const asyncSliceConstructor=tr.model.AsyncSlice.subTypes.getConstructor(events[0].event.cat,name);const slice=new asyncSliceConstructor(events[0].event.cat,name,getEventColor(events[0].event),this.toModelTimeFromUs_(events[0].event.ts),tr.b.concatenateObjects(events[0].event.args,events[events.length-1].event.args),this.toModelTimeFromUs_(event.ts-events[0].event.ts),true,undefined,undefined,events[0].event.argsStripped);slice.startThread=events[0].thread;slice.endThread=asyncEventState.thread;slice.id=key;const stepType=events[1].event.ph;let isValid=true;for(let j=1;j<events.length-1;++j){if(events[j].event.ph==='T'||events[j].event.ph==='p'){isValid=this.assertStepTypeMatches_(stepType,events[j]);if(!isValid)break;}
+if(events[j].event.ph==='S'){this.model_.importWarning({type:'async_slice_parse_error',message:'At '+events[j].event.ts+', a slice named '+
+name+' with id='+id+' had a step before the start event.'});continue;}
+if(events[j].event.ph==='F'){this.model_.importWarning({type:'async_slice_parse_error',message:'At '+events[j].event.ts+', a slice named '+
+name+' with id='+id+' had a step after the finish event.'});continue;}
+const startIndex=j+(stepType==='T'?0:-1);const endIndex=startIndex+1;let subName=name;if(!events[j].event.argsStripped&&(events[j].event.ph==='T'||events[j].event.ph==='p')){subName=subName+':'+events[j].event.args.step;}
+const asyncSliceConstructor=tr.model.AsyncSlice.subTypes.getConstructor(events[0].event.cat,subName);const subSlice=new asyncSliceConstructor(events[0].event.cat,subName,getEventColor(event,subName+j),this.toModelTimeFromUs_(events[startIndex].event.ts),this.deepCopyIfNeeded_(events[j].event.args),this.toModelTimeFromUs_(events[endIndex].event.ts-events[startIndex].event.ts),undefined,undefined,events[startIndex].event.argsStripped);subSlice.startThread=events[startIndex].thread;subSlice.endThread=events[endIndex].thread;subSlice.id=key;slice.subSlices.push(subSlice);}
+if(isValid){slice.startThread.asyncSliceGroup.push(slice);}
+delete asyncEventStatesByNameThenID[name][key];}}}},createNestableAsyncSlices_(nestableEventsByKey){for(const key in nestableEventsByKey){const eventStateEntries=nestableEventsByKey[key];const parentStack=[];for(let i=0;i<eventStateEntries.length;++i){const eventStateEntry=eventStateEntries[i];if(eventStateEntry.event.ph==='e'){let parentIndex=-1;for(let k=parentStack.length-1;k>=0;--k){if(parentStack[k].event.name===eventStateEntry.event.name){parentIndex=k;break;}}
+if(parentIndex===-1){eventStateEntry.finished=false;}else{parentStack[parentIndex].end=eventStateEntry;while(parentIndex<parentStack.length){parentStack.pop();}}}
+if(parentStack.length>0){eventStateEntry.parentEntry=parentStack[parentStack.length-1];}
+if(eventStateEntry.event.ph==='b'){parentStack.push(eventStateEntry);}}
+const topLevelSlices=[];for(let i=0;i<eventStateEntries.length;++i){const eventStateEntry=eventStateEntries[i];if(eventStateEntry.event.ph==='e'&&eventStateEntry.finished===undefined){continue;}
+let startState=undefined;let endState=undefined;let sliceArgs=eventStateEntry.event.args||{};let sliceError=undefined;const id=TraceEventImporter.scopedIdForEvent_(eventStateEntry.event);if(eventStateEntry.event.ph==='n'){startState=eventStateEntry;endState=eventStateEntry;}else if(eventStateEntry.event.ph==='b'){if(eventStateEntry.end===undefined){eventStateEntry.end=eventStateEntries[eventStateEntries.length-1];sliceError='Slice has no matching END. End time has been adjusted.';this.model_.importWarning({type:'async_slice_parse_error',message:'Nestable async BEGIN event at '+
+eventStateEntry.event.ts+' with name='+
+eventStateEntry.event.name+' and id='+id+' was unmatched.'});}else{function concatenateArguments(args1,args2){if(args1.params===undefined||args2.params===undefined){return tr.b.concatenateObjects(args1,args2);}
+const args3={};args3.params=tr.b.concatenateObjects(args1.params,args2.params);return tr.b.concatenateObjects(args1,args2,args3);}
+const endArgs=eventStateEntry.end.event.args||{};sliceArgs=concatenateArguments(sliceArgs,endArgs);}
+startState=eventStateEntry;endState=eventStateEntry.end;}else{sliceError='Slice has no matching BEGIN. Start time has been adjusted.';this.model_.importWarning({type:'async_slice_parse_error',message:'Nestable async END event at '+
+eventStateEntry.event.ts+' with name='+
+eventStateEntry.event.name+' and id='+id+' was unmatched.'});startState=eventStateEntries[0];endState=eventStateEntry;}
+const isTopLevel=(eventStateEntry.parentEntry===undefined);const asyncSliceConstructor=tr.model.AsyncSlice.subTypes.getConstructor(eventStateEntry.event.cat,eventStateEntry.event.name);let threadStart=undefined;let threadDuration=undefined;if(startState.event.tts&&startState.event.use_async_tts){threadStart=this.toModelTimeFromUs_(startState.event.tts);if(endState.event.tts){const threadEnd=this.toModelTimeFromUs_(endState.event.tts);threadDuration=threadEnd-threadStart;}}
+const slice=new asyncSliceConstructor(eventStateEntry.event.cat,eventStateEntry.event.name,getEventColor(endState.event),this.toModelTimeFromUs_(startState.event.ts),sliceArgs,this.toModelTimeFromUs_(endState.event.ts-startState.event.ts),isTopLevel,threadStart,threadDuration,startState.event.argsStripped);slice.startThread=startState.thread;slice.endThread=endState.thread;slice.startStackFrame=this.getStackFrameForEvent_(startState.event);slice.endStackFrame=this.getStackFrameForEvent_(endState.event);slice.id=key;if(sliceError!==undefined){slice.error=sliceError;}
+eventStateEntry.slice=slice;if(isTopLevel){topLevelSlices.push(slice);}else if(eventStateEntry.parentEntry.slice!==undefined){eventStateEntry.parentEntry.slice.subSlices.push(slice);}}
+for(let si=0;si<topLevelSlices.length;si++){topLevelSlices[si].startThread.asyncSliceGroup.push(topLevelSlices[si]);}}},assertStepTypeMatches_(stepType,event){if(stepType!==event.event.ph){this.model_.importWarning({type:'async_slice_parse_error',message:'At '+event.event.ts+', a slice named '+
+event.event.name+' with id='+
+TraceEventImporter.scopedIdForEvent_(event.event)+' had both begin and end steps, which is not allowed.'});return false;}
+return true;},validateFlowEvent_(event){if(event.name===undefined){this.model_.importWarning({type:'flow_slice_parse_error',message:'Flow events (ph: s, t or f) require a name parameter.'});return false;}
+if(event.ph==='s'||event.ph==='f'||event.ph==='t'){if(event.id===undefined){this.model_.importWarning({type:'flow_slice_parse_error',message:'Flow events (ph: s, t or f) require an id parameter.'});return false;}
+return true;}
+if(event.bind_id){if(event.flow_in===undefined&&event.flow_out===undefined){this.model_.importWarning({type:'flow_slice_parse_error',message:'Flow producer or consumer require flow_in or flow_out.'});return false;}
+return true;}
+return false;},createFlowSlices_(){if(this.allFlowEvents_.length===0)return;const createFlowEvent=function(thread,event,opt_slice){let startSlice;let flowId;let flowStartTs;if(event.bind_id){startSlice=opt_slice;flowId=event.bind_id;flowStartTs=this.toModelTimeFromUs_(event.ts+event.dur);}else{const ts=this.toModelTimeFromUs_(event.ts);startSlice=thread.sliceGroup.findSliceAtTs(ts);if(startSlice===undefined)return undefined;flowId=event.id;flowStartTs=ts;}
+const flowEvent=new tr.model.FlowEvent(event.cat,flowId,event.name,getEventColor(event),flowStartTs,this.deepCopyAlways_(event.args));flowEvent.startSlice=startSlice;flowEvent.startStackFrame=this.getStackFrameForEvent_(event);flowEvent.endStackFrame=undefined;startSlice.outFlowEvents.push(flowEvent);return flowEvent;}.bind(this);const finishFlowEventWith=function(flowEvent,thread,event,refGuid,bindToParent,opt_slice){let endSlice;if(event.bind_id){endSlice=opt_slice;}else{const ts=this.toModelTimeFromUs_(event.ts);if(bindToParent){endSlice=thread.sliceGroup.findSliceAtTs(ts);}else{endSlice=thread.sliceGroup.findNextSliceAfter(ts,refGuid);}
+if(endSlice===undefined)return false;}
+endSlice.inFlowEvents.push(flowEvent);flowEvent.endSlice=endSlice;flowEvent.duration=this.toModelTimeFromUs_(event.ts)-flowEvent.start;flowEvent.endStackFrame=this.getStackFrameForEvent_(event);this.mergeArgsInto_(flowEvent.args,event.args,flowEvent.title);return true;}.bind(this);const processFlowConsumer=function(flowIdToEvent,sliceGuidToEvent,event,slice){let flowEvent=flowIdToEvent[event.bind_id];if(flowEvent===undefined){this.model_.importWarning({type:'flow_slice_ordering_error',message:'Flow consumer '+event.bind_id+' does not have '+'a flow producer'});return false;}else if(flowEvent.endSlice){const flowProducer=flowEvent.startSlice;flowEvent=createFlowEvent(undefined,sliceGuidToEvent[flowProducer.guid],flowProducer);}
+const refGuid=undefined;const ok=finishFlowEventWith(flowEvent,undefined,event,refGuid,undefined,slice);if(ok){this.model_.flowEvents.push(flowEvent);}else{this.model_.importWarning({type:'flow_slice_end_error',message:'Flow consumer '+event.bind_id+' does not end '+'at an actual slice, so cannot be created.'});return false;}
+return true;}.bind(this);const processFlowProducer=function(flowIdToEvent,flowStatus,event,slice){if(flowIdToEvent[event.bind_id]&&flowStatus[event.bind_id]){this.model_.importWarning({type:'flow_slice_start_error',message:'Flow producer '+event.bind_id+' already seen'});return false;}
+const flowEvent=createFlowEvent(undefined,event,slice);if(!flowEvent){this.model_.importWarning({type:'flow_slice_start_error',message:'Flow producer '+event.bind_id+' does not start'+'a flow'});return false;}
+flowIdToEvent[event.bind_id]=flowEvent;}.bind(this);this.allFlowEvents_.sort(function(x,y){const d=x.event.ts-y.event.ts;if(d!==0)return d;return x.sequenceNumber-y.sequenceNumber;});const flowIdToEvent={};const sliceGuidToEvent={};const flowStatus={};for(let i=0;i<this.allFlowEvents_.length;++i){const data=this.allFlowEvents_[i];const refGuid=data.refGuid;const event=data.event;const thread=data.thread;if(!this.validateFlowEvent_(event))continue;if(event.bind_id){const slice=data.slice;sliceGuidToEvent[slice.guid]=event;if(event.flowPhase===PRODUCER){if(!processFlowProducer(flowIdToEvent,flowStatus,event,slice)){continue;}
+flowStatus[event.bind_id]=true;}else{if(!processFlowConsumer(flowIdToEvent,sliceGuidToEvent,event,slice)){continue;}
+flowStatus[event.bind_id]=false;if(event.flowPhase===STEP){if(!processFlowProducer(flowIdToEvent,flowStatus,event,slice)){continue;}
+flowStatus[event.bind_id]=true;}}
+continue;}
+let flowEvent;if(event.ph==='s'){if(flowIdToEvent[event.id]){this.model_.importWarning({type:'flow_slice_start_error',message:'event id '+event.id+' already seen when '+'encountering start of flow event.'});continue;}
+flowEvent=createFlowEvent(thread,event);if(!flowEvent){this.model_.importWarning({type:'flow_slice_start_error',message:'event id '+event.id+' does not start '+'at an actual slice, so cannot be created.'});continue;}
+flowIdToEvent[event.id]=flowEvent;}else if(event.ph==='t'||event.ph==='f'){flowEvent=flowIdToEvent[event.id];if(flowEvent===undefined){this.model_.importWarning({type:'flow_slice_ordering_error',message:'Found flow phase '+event.ph+' for id: '+event.id+' but no flow start found.'});continue;}
+let bindToParent=event.ph==='t';if(event.ph==='f'){if(event.bp===undefined){if(event.cat.indexOf('input')>-1){bindToParent=true;}else if(event.cat.indexOf('ipc.flow')>-1){bindToParent=true;}}else{if(event.bp!=='e'){this.model_.importWarning({type:'flow_slice_bind_point_error',message:'Flow event with invalid binding point (event.bp).'});continue;}
+bindToParent=true;}}
+const ok=finishFlowEventWith(flowEvent,thread,event,refGuid,bindToParent);if(ok){this.model_.flowEvents.push(flowEvent);}else{this.model_.importWarning({type:'flow_slice_end_error',message:'event id '+event.id+' does not end '+'at an actual slice, so cannot be created.'});}
+flowIdToEvent[event.id]=undefined;if(ok&&event.ph==='t'){flowEvent=createFlowEvent(thread,event);flowIdToEvent[event.id]=flowEvent;}}}},createExplicitObjects_(){if(this.allObjectEvents_.length===0)return;const processEvent=function(objectEventState){const event=objectEventState.event;const scopedId=TraceEventImporter.scopedIdForEvent_(event);const thread=objectEventState.thread;if(event.name===undefined){this.model_.importWarning({type:'object_parse_error',message:'While processing '+JSON.stringify(event)+': '+'Object events require an name parameter.'});}
+if(scopedId===undefined||scopedId.id===undefined){this.model_.importWarning({type:'object_parse_error',message:'While processing '+JSON.stringify(event)+': '+'Object events require an id parameter.'});}
+const process=thread.parent;const ts=this.toModelTimeFromUs_(event.ts);let instance;if(event.ph==='N'){try{instance=process.objects.idWasCreated(scopedId,event.cat,event.name,ts);}catch(e){this.model_.importWarning({type:'object_parse_error',message:'While processing create of '+
+scopedId+' at ts='+ts+': '+e});return;}}else if(event.ph==='O'){if(event.args.snapshot===undefined){this.model_.importWarning({type:'object_parse_error',message:'While processing '+scopedId+' at ts='+ts+': '+'Snapshots must have args: {snapshot: ...}'});return;}
+let snapshot;try{const args=this.deepCopyIfNeeded_(event.args.snapshot);let cat;if(args.cat){cat=args.cat;delete args.cat;}else{cat=event.cat;}
+let baseTypename;if(args.base_type){baseTypename=args.base_type;delete args.base_type;}else{baseTypename=undefined;}
+snapshot=process.objects.addSnapshot(scopedId,cat,event.name,ts,args,baseTypename);snapshot.snapshottedOnThread=thread;}catch(e){this.model_.importWarning({type:'object_parse_error',message:'While processing snapshot of '+
+scopedId+' at ts='+ts+': '+e});return;}
+instance=snapshot.objectInstance;}else if(event.ph==='D'){try{process.objects.idWasDeleted(scopedId,event.cat,event.name,ts);const instanceMap=process.objects.getOrCreateInstanceMap_(scopedId);instance=instanceMap.lastInstance;}catch(e){this.model_.importWarning({type:'object_parse_error',message:'While processing delete of '+
+scopedId+' at ts='+ts+': '+e});return;}}
+if(instance){instance.colorId=getEventColor(event,instance.typeName);}}.bind(this);this.allObjectEvents_.sort(function(x,y){const d=x.event.ts-y.event.ts;if(d!==0)return d;return x.sequenceNumber-y.sequenceNumber;});const allObjectEvents=this.allObjectEvents_;for(let i=0;i<allObjectEvents.length;i++){const objectEventState=allObjectEvents[i];try{processEvent.call(this,objectEventState);}catch(e){this.model_.importWarning({type:'object_parse_error',message:e.message});}}},createImplicitObjects_(){for(const proc of Object.values(this.model_.processes)){this.createImplicitObjectsForProcess_(proc);}},createImplicitObjectsForProcess_(process){function processField(referencingObject,referencingObjectFieldName,referencingObjectFieldValue,containingSnapshot){if(!referencingObjectFieldValue)return;if(referencingObjectFieldValue instanceof
+tr.model.ObjectSnapshot){return null;}
+if(referencingObjectFieldValue.id===undefined)return;const implicitSnapshot=referencingObjectFieldValue;const rawId=implicitSnapshot.id;const m=/(.+)\/(.+)/.exec(rawId);if(!m){throw new Error('Implicit snapshots must have names.');}
+delete implicitSnapshot.id;const name=m[1];const id=m[2];let res;let cat;if(implicitSnapshot.cat!==undefined){cat=implicitSnapshot.cat;}else{cat=containingSnapshot.objectInstance.category;}
+let baseTypename;if(implicitSnapshot.base_type){baseTypename=implicitSnapshot.base_type;}else{baseTypename=undefined;}
+const scope=containingSnapshot.objectInstance.scopedId.scope;try{res=process.objects.addSnapshot(new tr.model.ScopedId(scope,id),cat,name,containingSnapshot.ts,implicitSnapshot,baseTypename);}catch(e){this.model_.importWarning({type:'object_snapshot_parse_error',message:'While processing implicit snapshot of '+
+rawId+' at ts='+containingSnapshot.ts+': '+e});return;}
+res.objectInstance.hasImplicitSnapshots=true;res.containingSnapshot=containingSnapshot;res.snapshottedOnThread=containingSnapshot.snapshottedOnThread;referencingObject[referencingObjectFieldName]=res;if(!(res instanceof tr.model.ObjectSnapshot)){throw new Error('Created object must be instanceof snapshot');}
+return res.args;}
+function iterObject(object,func,containingSnapshot,thisArg){if(!(object instanceof Object))return;if(object instanceof Array){for(let i=0;i<object.length;i++){const res=func.call(thisArg,object,i,object[i],containingSnapshot);if(res===null)continue;if(res){iterObject(res,func,containingSnapshot,thisArg);}else{iterObject(object[i],func,containingSnapshot,thisArg);}}
+return;}
+for(const key in object){const res=func.call(thisArg,object,key,object[key],containingSnapshot);if(res===null)continue;if(res){iterObject(res,func,containingSnapshot,thisArg);}else{iterObject(object[key],func,containingSnapshot,thisArg);}}}
+process.objects.iterObjectInstances(function(instance){instance.snapshots.forEach(function(snapshot){if(snapshot.args.id!==undefined){throw new Error('args cannot have an id field inside it');}
+iterObject(snapshot.args,processField,snapshot,this);},this);},this);},createMemoryDumps_(){for(const dumpId in this.allMemoryDumpEvents_){this.createGlobalMemoryDump_(this.allMemoryDumpEvents_[dumpId],dumpId);}},createGlobalMemoryDump_(dumpIdEvents,dumpId){const globalRange=new tr.b.math.Range();for(const pid in dumpIdEvents){const processEvents=dumpIdEvents[pid];for(let i=0;i<processEvents.length;i++){globalRange.addValue(this.toModelTimeFromUs_(processEvents[i].ts));}}
+if(globalRange.isEmpty){throw new Error('Internal error: Global memory dump without events');}
+const globalMemoryDump=new tr.model.GlobalMemoryDump(this.model_,globalRange.min);globalMemoryDump.duration=globalRange.range;this.model_.globalMemoryDumps.push(globalMemoryDump);const globalMemoryAllocatorDumpsByFullName={};const levelsOfDetail={};const allMemoryAllocatorDumpsByGuid={};for(const pid in dumpIdEvents){this.createProcessMemoryDump_(globalMemoryDump,globalMemoryAllocatorDumpsByFullName,levelsOfDetail,allMemoryAllocatorDumpsByGuid,dumpIdEvents[pid],pid,dumpId);}
+globalMemoryDump.levelOfDetail=levelsOfDetail.global;globalMemoryDump.memoryAllocatorDumps=this.inferMemoryAllocatorDumpTree_(globalMemoryAllocatorDumpsByFullName);this.parseMemoryDumpAllocatorEdges_(allMemoryAllocatorDumpsByGuid,dumpIdEvents,dumpId);},createProcessMemoryDump_(globalMemoryDump,globalMemoryAllocatorDumpsByFullName,levelsOfDetail,allMemoryAllocatorDumpsByGuid,processEvents,pid,dumpId){const processRange=new tr.b.math.Range();for(let i=0;i<processEvents.length;i++){processRange.addValue(this.toModelTimeFromUs_(processEvents[i].ts));}
+if(processRange.isEmpty){throw new Error('Internal error: Process memory dump without events');}
+const process=this.model_.getOrCreateProcess(pid);const processMemoryDump=new tr.model.ProcessMemoryDump(globalMemoryDump,process,processRange.min);processMemoryDump.duration=processRange.range;process.memoryDumps.push(processMemoryDump);globalMemoryDump.processMemoryDumps[pid]=processMemoryDump;const processMemoryAllocatorDumpsByFullName={};for(let i=0;i<processEvents.length;i++){const processEvent=processEvents[i];const dumps=processEvent.args.dumps;if(dumps===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'\'dumps\' field not found in a process memory dump'+' event for PID='+pid+' and dump ID='+dumpId+'.'});continue;}
+this.parseMemoryDumpTotals_(processMemoryDump,dumps,pid,dumpId);this.parseMemoryDumpVmRegions_(processMemoryDump,dumps,pid,dumpId);this.parseMemoryDumpHeapDumps_(processMemoryDump,dumps,pid,dumpId);this.parseMemoryDumpLevelOfDetail_(levelsOfDetail,dumps,pid,dumpId);this.parseMemoryDumpAllocatorDumps_(processMemoryDump,globalMemoryDump,processMemoryAllocatorDumpsByFullName,globalMemoryAllocatorDumpsByFullName,allMemoryAllocatorDumpsByGuid,dumps,pid,dumpId);}
+if(levelsOfDetail.process===undefined){levelsOfDetail.process=processMemoryDump.vmRegions?DETAILED:LIGHT;}
+if(!this.updateMemoryDumpLevelOfDetail_(levelsOfDetail,'global',levelsOfDetail.process)){this.model_.importWarning({type:'memory_dump_parse_error',message:'diffent levels of detail provided for global memory'+' dump (dump ID='+dumpId+').'});}
+processMemoryDump.levelOfDetail=levelsOfDetail.process;delete levelsOfDetail.process;processMemoryDump.memoryAllocatorDumps=this.inferMemoryAllocatorDumpTree_(processMemoryAllocatorDumpsByFullName);},parseMemoryDumpTotals_(processMemoryDump,dumps,pid,dumpId){const rawTotals=dumps.process_totals;if(rawTotals===undefined)return;if(processMemoryDump.totals!==undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Process totals provided multiple times for'+' process memory dump for PID='+pid+' and dump ID='+dumpId+'.'});return;}
+const totals={};let platformSpecificTotals=undefined;for(const rawTotalName in rawTotals){const rawTotalValue=rawTotals[rawTotalName];if(rawTotalValue===undefined)continue;if(rawTotalName==='resident_set_bytes'){totals.residentBytes=parseInt(rawTotalValue,16);continue;}
+if(rawTotalName==='peak_resident_set_bytes'){totals.peakResidentBytes=parseInt(rawTotalValue,16);continue;}
+if(rawTotalName==='is_peak_rss_resetable'){totals.arePeakResidentBytesResettable=!!rawTotalValue;continue;}
+if(platformSpecificTotals===undefined){platformSpecificTotals={};totals.platformSpecific=platformSpecificTotals;}
+platformSpecificTotals[rawTotalName]=parseInt(rawTotalValue,16);}
+if(totals.peakResidentBytes===undefined&&totals.arePeakResidentBytesResettable!==undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Optional field peak_resident_set_bytes found'+' but is_peak_rss_resetable not found in'+' process memory dump for PID='+pid+' and dump ID='+dumpId+'.'});}
+if(totals.arePeakResidentBytesResettable!==undefined&&totals.peakResidentBytes===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Optional field is_peak_rss_resetable found'+' but peak_resident_set_bytes not found in'+' process memory dump for PID='+pid+' and dump ID='+dumpId+'.'});}
+processMemoryDump.totals=totals;},parseMemoryDumpVmRegions_(processMemoryDump,dumps,pid,dumpId){const rawProcessMmaps=dumps.process_mmaps;if(rawProcessMmaps===undefined)return;const rawVmRegions=rawProcessMmaps.vm_regions;if(rawVmRegions===undefined)return;if(processMemoryDump.vmRegions!==undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'VM regions provided multiple times for'+' process memory dump for PID='+pid+' and dump ID='+dumpId+'.'});return;}
+const vmRegions=new Array(rawVmRegions.length);for(let i=0;i<rawVmRegions.length;i++){const rawVmRegion=rawVmRegions[i];const byteStats={};const rawByteStats=rawVmRegion.bs;for(const rawByteStatName in rawByteStats){const rawByteStatValue=rawByteStats[rawByteStatName];if(rawByteStatValue===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Byte stat \''+rawByteStatName+'\' of VM region '+
+i+' ('+rawVmRegion.mf+') in process memory dump for '+'PID='+pid+' and dump ID='+dumpId+' does not have a value.'});continue;}
+const byteStatName=BYTE_STAT_NAME_MAP[rawByteStatName];if(byteStatName===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Unknown byte stat name \''+rawByteStatName+'\' ('+
+rawByteStatValue+') of VM region '+i+' ('+
+rawVmRegion.mf+') in process memory dump for PID='+pid+' and dump ID='+dumpId+'.'});continue;}
+byteStats[byteStatName]=parseInt(rawByteStatValue,16);if(byteStatName==='proportionalResident'&&byteStats[byteStatName]===0){byteStats[byteStatName]=undefined;}}
+vmRegions[i]=new tr.model.VMRegion(parseInt(rawVmRegion.sa,16),parseInt(rawVmRegion.sz,16),rawVmRegion.pf,rawVmRegion.mf,byteStats);}
+processMemoryDump.vmRegions=tr.model.VMRegionClassificationNode.fromRegions(vmRegions);},parseMemoryDumpHeapDumps_(processMemoryDump,dumps,pid,dumpId){const idPrefix='p'+pid+':';let importer;if(dumps.heaps){const processTypeMap=this.objectTypeNameMap_[pid];if(processTypeMap===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Missing mapping from object type IDs to names.'});}
+importer=new LegacyHeapDumpTraceEventImporter(this.model_,processMemoryDump,processTypeMap,idPrefix,dumpId,dumps.heaps);}else if(dumps.heaps_v2){const data=dumps.heaps_v2;this.heapProfileExpander=this.heapProfileExpander.expandData(data);this.addNewStackFramesFromExpander_(this.heapProfileExpander,idPrefix);importer=new HeapDumpTraceEventImporter(this.heapProfileExpander,this.model_.stackFrames,processMemoryDump,idPrefix,this.model_);}
+if(!importer)return;const heapDumps=importer.parse();if(!heapDumps)return;if(processMemoryDump.heapDumps!==undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Heap dumps provided multiple times for'+' process memory dump for PID='+pid+' and dump ID='+dumpId+'.'});return;}
+if(Object.keys(heapDumps).length>0){processMemoryDump.heapDumps=heapDumps;}},addNewStackFramesFromExpander_(expander,idPrefix){const nodeMap=expander.getNewMap('nodes');const newStackFrames={};for(const[id,stackFrame]of nodeMap.entries()){if(!this.model_.stackFrames[idPrefix+id]){newStackFrames[id]={id,name:expander.getString(stackFrame.name_sid),};if(stackFrame.parent)newStackFrames[id].parent=stackFrame.parent;}}
+this.importStackFrames_(newStackFrames,idPrefix);},parseMemoryDumpLevelOfDetail_(levelsOfDetail,dumps,pid,dumpId){const rawLevelOfDetail=dumps.level_of_detail;let level;switch(rawLevelOfDetail){case'background':level=BACKGROUND;break;case'light':level=LIGHT;break;case'detailed':level=DETAILED;break;case undefined:level=undefined;break;default:this.model_.importWarning({type:'memory_dump_parse_error',message:'unknown raw level of detail \''+rawLevelOfDetail+'\' of process memory dump for PID='+pid+' and dump ID='+dumpId+'.'});return;}
+if(!this.updateMemoryDumpLevelOfDetail_(levelsOfDetail,'process',level)){this.model_.importWarning({type:'memory_dump_parse_error',message:'diffent levels of detail provided for process memory'+' dump for PID='+pid+' (dump ID='+dumpId+').'});}},updateMemoryDumpLevelOfDetail_(levelsOfDetail,scope,level){if(!(scope in levelsOfDetail)||level===levelsOfDetail[scope]){levelsOfDetail[scope]=level;return true;}
+if(MEMORY_DUMP_LEVEL_OF_DETAIL_ORDER.indexOf(level)>MEMORY_DUMP_LEVEL_OF_DETAIL_ORDER.indexOf(levelsOfDetail[scope])){levelsOfDetail[scope]=level;}
+return false;},parseMemoryDumpAllocatorDumps_(processMemoryDump,globalMemoryDump,processMemoryAllocatorDumpsByFullName,globalMemoryAllocatorDumpsByFullName,allMemoryAllocatorDumpsByGuid,dumps,pid,dumpId){const rawAllocatorDumps=dumps.allocators;if(rawAllocatorDumps===undefined)return;for(let fullName in rawAllocatorDumps){const rawAllocatorDump=rawAllocatorDumps[fullName];const guid=rawAllocatorDump.guid;if(guid===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Memory allocator dump '+fullName+' for PID='+pid+' and dump ID='+dumpId+' does not have a GUID.'});}
+const flags=rawAllocatorDump.flags||0;const isWeakDump=!!(flags&WEAK_MEMORY_ALLOCATOR_DUMP_FLAG);let containerMemoryDump;let dstIndex;if(fullName.startsWith(GLOBAL_MEMORY_ALLOCATOR_DUMP_PREFIX)){fullName=fullName.substring(GLOBAL_MEMORY_ALLOCATOR_DUMP_PREFIX.length);containerMemoryDump=globalMemoryDump;dstIndex=globalMemoryAllocatorDumpsByFullName;}else{containerMemoryDump=processMemoryDump;dstIndex=processMemoryAllocatorDumpsByFullName;}
+let allocatorDump=allMemoryAllocatorDumpsByGuid[guid];if(allocatorDump===undefined){if(fullName in dstIndex){this.model_.importWarning({type:'memory_dump_parse_error',message:'Multiple GUIDs provided for'+' memory allocator dump '+fullName+': '+
+dstIndex[fullName].guid+', '+guid+' (ignored) for'+' PID='+pid+' and dump ID='+dumpId+'.'});continue;}
+allocatorDump=new tr.model.MemoryAllocatorDump(containerMemoryDump,fullName,guid);allocatorDump.weak=isWeakDump;dstIndex[fullName]=allocatorDump;if(guid!==undefined){allMemoryAllocatorDumpsByGuid[guid]=allocatorDump;}}else{if(allocatorDump.containerMemoryDump!==containerMemoryDump){this.model_.importWarning({type:'memory_dump_parse_error',message:'Memory allocator dump '+fullName+' (GUID='+guid+') for PID='+pid+' and dump ID='+
+dumpId+' dumped in different contexts.'});continue;}
+if(allocatorDump.fullName!==fullName){this.model_.importWarning({type:'memory_dump_parse_error',message:'Memory allocator dump with GUID='+guid+' for PID='+
+pid+' and dump ID='+dumpId+' has multiple names: '+
+allocatorDump.fullName+', '+fullName+' (ignored).'});continue;}
+if(!isWeakDump){allocatorDump.weak=false;}}
+let attributes=rawAllocatorDump.attrs;if(attributes===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Memory allocator dump '+fullName+' (GUID='+guid+') for PID='+pid+' and dump ID='+dumpId+' does not have attributes.'});attributes={};}
+for(const attrName in attributes){const attrArgs=attributes[attrName];const attrType=attrArgs.type;const attrValue=attrArgs.value;switch(attrType){case'scalar':{if(attrName in allocatorDump.numerics){this.model_.importWarning({type:'memory_dump_parse_error',message:'Multiple values provided for scalar attribute '+
+attrName+' of memory allocator dump '+fullName+' (GUID='+guid+') for PID='+pid+' and dump ID='+
+dumpId+'.'});break;}
+const unit=attrArgs.units==='bytes'?tr.b.Unit.byName.sizeInBytes_smallerIsBetter:tr.b.Unit.byName.unitlessNumber_smallerIsBetter;const value=parseInt(attrValue,16);allocatorDump.addNumeric(attrName,new tr.b.Scalar(unit,value));break;}
+case'string':if(attrName in allocatorDump.diagnostics){this.model_.importWarning({type:'memory_dump_parse_error',message:'Multiple values provided for string attribute '+
+attrName+' of memory allocator dump '+fullName+' (GUID='+guid+') for PID='+pid+' and dump ID='+
+dumpId+'.'});break;}
+allocatorDump.addDiagnostic(attrName,attrValue);break;default:this.model_.importWarning({type:'memory_dump_parse_error',message:'Unknown type provided for attribute '+attrName+' of memory allocator dump '+fullName+' (GUID='+guid+') for PID='+pid+' and dump ID='+dumpId+': '+
+attrType});break;}}}},inferMemoryAllocatorDumpTree_(memoryAllocatorDumpsByFullName){const rootAllocatorDumps=[];const fullNames=Object.keys(memoryAllocatorDumpsByFullName);fullNames.sort();for(let i=0;i<fullNames.length;i++){let fullName=fullNames[i];let allocatorDump=memoryAllocatorDumpsByFullName[fullName];while(true){const lastSlashIndex=fullName.lastIndexOf('/');if(lastSlashIndex===-1){rootAllocatorDumps.push(allocatorDump);break;}
+const parentFullName=fullName.substring(0,lastSlashIndex);let parentAllocatorDump=memoryAllocatorDumpsByFullName[parentFullName];let parentAlreadyExisted=true;if(parentAllocatorDump===undefined){parentAlreadyExisted=false;parentAllocatorDump=new tr.model.MemoryAllocatorDump(allocatorDump.containerMemoryDump,parentFullName);if(allocatorDump.weak!==false){parentAllocatorDump.weak=undefined;}
+memoryAllocatorDumpsByFullName[parentFullName]=parentAllocatorDump;}
+allocatorDump.parent=parentAllocatorDump;parentAllocatorDump.children.push(allocatorDump);if(parentAlreadyExisted){if(!allocatorDump.weak){while(parentAllocatorDump!==undefined&&parentAllocatorDump.weak===undefined){parentAllocatorDump.weak=false;parentAllocatorDump=parentAllocatorDump.parent;}}
+break;}
+fullName=parentFullName;allocatorDump=parentAllocatorDump;}}
+for(const fullName in memoryAllocatorDumpsByFullName){const allocatorDump=memoryAllocatorDumpsByFullName[fullName];if(allocatorDump.weak===undefined){allocatorDump.weak=true;}}
+return rootAllocatorDumps;},parseMemoryDumpAllocatorEdges_(allMemoryAllocatorDumpsByGuid,dumpIdEvents,dumpId){for(const pid in dumpIdEvents){const processEvents=dumpIdEvents[pid];for(let i=0;i<processEvents.length;i++){const processEvent=processEvents[i];const dumps=processEvent.args.dumps;if(dumps===undefined)continue;const rawEdges=dumps.allocators_graph;if(rawEdges===undefined)continue;for(let j=0;j<rawEdges.length;j++){const rawEdge=rawEdges[j];const sourceGuid=rawEdge.source;const sourceDump=allMemoryAllocatorDumpsByGuid[sourceGuid];if(sourceDump===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Edge for PID='+pid+' and dump ID='+dumpId+' is missing source memory allocator dump (GUID='+
+sourceGuid+').'});continue;}
+const targetGuid=rawEdge.target;const targetDump=allMemoryAllocatorDumpsByGuid[targetGuid];if(targetDump===undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Edge for PID='+pid+' and dump ID='+dumpId+' is missing target memory allocator dump (GUID='+
+targetGuid+').'});continue;}
+const importance=rawEdge.importance;const edge=new tr.model.MemoryAllocatorDumpLink(sourceDump,targetDump,importance);switch(rawEdge.type){case'ownership':if(sourceDump.owns!==undefined){this.model_.importWarning({type:'memory_dump_parse_error',message:'Memory allocator dump '+sourceDump.fullName+' (GUID='+sourceGuid+') already owns a memory'+' allocator dump ('+
+sourceDump.owns.target.fullName+').'});}else{sourceDump.owns=edge;targetDump.ownedBy.push(edge);}
+break;case'retention':sourceDump.retains.push(edge);targetDump.retainedBy.push(edge);break;default:this.model_.importWarning({type:'memory_dump_parse_error',message:'Invalid edge type: '+rawEdge.type+' (PID='+pid+', dump ID='+dumpId+', source='+sourceGuid+', target='+targetGuid+', importance='+importance+').'});}}}}},toModelTimeFromUs_(ts){if(!this.toModelTime_){this.toModelTime_=this.model_.clockSyncManager.getModelTimeTransformer(this.clockDomainId_);}
+return this.toModelTime_(tr.b.Unit.timestampFromUs(ts));},maybeToModelTimeFromUs_(ts){if(ts===undefined){return undefined;}
+return this.toModelTimeFromUs_(ts);}};tr.importer.Importer.register(TraceEventImporter);return{TraceEventImporter,};});'use strict';tr.exportTo('tr.e.measure',function(){const AsyncSlice=tr.model.AsyncSlice;function MeasureAsyncSlice(){this.groupTitle_='Ungrouped Measure';const matched=/([^\/:]+):([^\/:]+)\/?(.*)/.exec(arguments[1]);if(matched!==null){arguments[1]=matched[2];this.groupTitle_=matched[1];}
+AsyncSlice.apply(this,arguments);}
+MeasureAsyncSlice.prototype={__proto__:AsyncSlice.prototype,get viewSubGroupTitle(){return this.groupTitle_;},get title(){return this.title_;},set title(title){this.title_=title;}};AsyncSlice.subTypes.register(MeasureAsyncSlice,{categoryParts:['blink.user_timing']});return{MeasureAsyncSlice,};});'use strict';tr.exportTo('tr.e.net',function(){const AsyncSlice=tr.model.AsyncSlice;function NetAsyncSlice(){AsyncSlice.apply(this,arguments);this.url_=undefined;this.byteCount_=undefined;this.isTitleComputed_=false;this.isUrlComputed_=false;}
+NetAsyncSlice.prototype={__proto__:AsyncSlice.prototype,get viewSubGroupTitle(){return'NetLog';},get title(){if(this.isTitleComputed_||!this.isTopLevel){return this.title_;}
+if(this.url!==undefined&&this.url.length>0){this.title_=this.url;}else if(this.args!==undefined&&this.args.source_type!==undefined){this.title_=this.args.source_type;}
+this.isTitleComputed_=true;return this.title_;},set title(title){this.title_=title;},get url(){if(this.isUrlComputed_){return this.url_;}
+if(this.args!==undefined&&this.args.params!==undefined&&this.args.params.url!==undefined){this.url_=this.args.params.url;}else if(this.subSlices!==undefined&&this.subSlices.length>0){for(let i=0;i<this.subSlices.length&&!this.url_;i++){if(this.subSlices[i].url!==undefined){this.url_=this.subSlices[i].url;}}}
+this.isUrlComputed_=true;return this.url_;},get byteCount(){if(this.byteCount_!==undefined){return this.byteCount_;}
+this.byteCount_=0;if((this.originalTitle==='URL_REQUEST_JOB_FILTERED_BYTES_READ'||this.originalTitle==='URL_REQUEST_JOB_BYTES_READ')&&this.args!==undefined&&this.args.params!==undefined&&this.args.params.byte_count!==undefined){this.byteCount_=this.args.params.byte_count;}
+for(let i=0;i<this.subSlices.length;i++){this.byteCount_+=this.subSlices[i].byteCount;}
+return this.byteCount_;}};AsyncSlice.subTypes.register(NetAsyncSlice,{categoryParts:['netlog','disabled-by-default-netlog']});return{NetAsyncSlice,};});'use strict';tr.exportTo('tr.model',function(){const ColorScheme=tr.b.ColorScheme;function Activity(name,category,range,args){tr.model.TimedEvent.call(this,range.min);this.title=name;this.category=category;this.colorId=ColorScheme.getColorIdForGeneralPurposeString(name);this.duration=range.duration;this.args=args;this.name=name;}
+Activity.prototype={__proto__:tr.model.TimedEvent.prototype,shiftTimestampsForward(amount){this.start+=amount;},addBoundsToRange(range){range.addValue(this.start);range.addValue(this.end);}};return{Activity,};});'use strict';tr.exportTo('tr.e.importer.android',function(){const Importer=tr.importer.Importer;const ACTIVITY_STATE={NONE:'none',CREATED:'created',STARTED:'started',RESUMED:'resumed',PAUSED:'paused',STOPPED:'stopped',DESTROYED:'destroyed'};const activityMap={};function EventLogImporter(model,events){this.model_=model;this.events_=events;this.importPriority=3;}
+const eventLogActivityRE=new RegExp('(\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}.\\d+)'+'\\s+(\\d+)\\s+(\\d+)\\s+([A-Z])\\s*'+'(am_\\w+)\\s*:(.*)');const amCreateRE=new RegExp('\s*\\[.*,.*,.*,(.*),.*,.*,.*,.*\\]');const amFocusedRE=new RegExp('\s*\\[\\d+,(.*)\\]');const amProcStartRE=new RegExp('\s*\\[\\d+,\\d+,\\d+,.*,activity,(.*)\\]');const amOnResumeRE=new RegExp('\s*\\[\\d+,(.*)\\]');const amOnPauseRE=new RegExp('\s*\\[\\d+,(.*)\\]');const amLaunchTimeRE=new RegExp('\s*\\[\\d+,\\d+,(.*),(\\d+),(\\d+)');const amDestroyRE=new RegExp('\s*\\[\\d+,\\d+,\\d+,(.*)\\]');EventLogImporter.canImport=function(events){if(!(typeof(events)==='string'||events instanceof String)){return false;}
+if(/^<!DOCTYPE html>/.test(events))return false;return eventLogActivityRE.test(events);};EventLogImporter.prototype={__proto__:Importer.prototype,get importerName(){return'EventLogImporter';},get model(){return this.model_;},getFullActivityName(component){const componentSplit=component.split('/');if(componentSplit[1].startsWith('.')){return componentSplit[0]+componentSplit[1];}
+return componentSplit[1];},getProcName(component){const componentSplit=component.split('/');return componentSplit[0];},findOrCreateActivity(activityName){if(activityName in activityMap){return activityMap[activityName];}
+const activity={state:ACTIVITY_STATE.NONE,name:activityName};activityMap[activityName]=activity;return activity;},deleteActivity(activityName){delete activityMap[activityName];},handleCreateActivity(ts,activityName){const activity=this.findOrCreateActivity(activityName);activity.state=ACTIVITY_STATE.CREATED;activity.createdTs=ts;},handleFocusActivity(ts,procName,activityName){const activity=this.findOrCreateActivity(activityName);activity.lastFocusedTs=ts;},handleProcStartForActivity(ts,activityName){const activity=this.findOrCreateActivity(activityName);activity.procStartTs=ts;},handleOnResumeCalled(ts,pid,activityName){const activity=this.findOrCreateActivity(activityName);activity.state=ACTIVITY_STATE.RESUMED;activity.lastResumeTs=ts;activity.pid=pid;},handleOnPauseCalled(ts,activityName){const activity=this.findOrCreateActivity(activityName);activity.state=ACTIVITY_STATE.PAUSED;activity.lastPauseTs=ts;if(ts>this.model_.bounds.min&&ts<this.model_.bounds.max){this.addActivityToProcess(activity);}},handleLaunchTime(ts,activityName,launchTime){const activity=this.findOrCreateActivity(activityName);activity.launchTime=launchTime;},handleDestroyActivity(ts,activityName){this.deleteActivity(activityName);},addActivityToProcess(activity){if(activity.pid===undefined)return;const process=this.model_.getOrCreateProcess(activity.pid);const range=tr.b.math.Range.fromExplicitRange(Math.max(this.model_.bounds.min,activity.lastResumeTs),activity.lastPauseTs);const newActivity=new tr.model.Activity(activity.name,'Android Activity',range,{created:activity.createdTs,procstart:activity.procStartTs,lastfocus:activity.lastFocusedTs});process.activities.push(newActivity);},parseAmLine_(line){let match=eventLogActivityRE.exec(line);if(!match)return;const firstRealtimeTs=this.model_.bounds.min-
+this.model_.realtime_to_monotonic_offset_ms;const year=new Date(firstRealtimeTs).getFullYear();const ts=match[1].substring(0,5)+'-'+year+' '+
+match[1].substring(5,match[1].length);const monotonicTs=Date.parse(ts)+
+this.model_.realtime_to_monotonic_offset_ms;const pid=match[2];const action=match[5];const data=match[6];if(action==='am_create_activity'){match=amCreateRE.exec(data);if(match&&match.length>=2){this.handleCreateActivity(monotonicTs,this.getFullActivityName(match[1]));}}else if(action==='am_focused_activity'){match=amFocusedRE.exec(data);if(match&&match.length>=2){this.handleFocusActivity(monotonicTs,this.getProcName(match[1]),this.getFullActivityName(match[1]));}}else if(action==='am_proc_start'){match=amProcStartRE.exec(data);if(match&&match.length>=2){this.handleProcStartForActivity(monotonicTs,this.getFullActivityName(match[1]));}}else if(action==='am_on_resume_called'){match=amOnResumeRE.exec(data);if(match&&match.length>=2){this.handleOnResumeCalled(monotonicTs,pid,match[1]);}}else if(action==='am_on_paused_called'){match=amOnPauseRE.exec(data);if(match&&match.length>=2){this.handleOnPauseCalled(monotonicTs,match[1]);}}else if(action==='am_activity_launch_time'){match=amLaunchTimeRE.exec(data);this.handleLaunchTime(monotonicTs,this.getFullActivityName(match[1]),match[2]);}else if(action==='am_destroy_activity'){match=amDestroyRE.exec(data);if(match&&match.length===2){this.handleDestroyActivity(monotonicTs,this.getFullActivityName(match[1]));}}},importEvents(){if(isNaN(this.model_.realtime_to_monotonic_offset_ms)){this.model_.importWarning({type:'eveng_log_clock_sync',message:'Need a trace_event_clock_sync to map realtime to import.'});return;}
+this.model_.updateBounds();const lines=this.events_.split('\n');lines.forEach(this.parseAmLine_,this);for(const activityName in activityMap){const activity=activityMap[activityName];if(activity.state===ACTIVITY_STATE.RESUMED){activity.lastPauseTs=this.model_.bounds.max;this.addActivityToProcess(activity);}}}};Importer.register(EventLogImporter);return{EventLogImporter,};});'use strict';tr.exportTo('tr.e.importer.android.process_data',function(){const Importer=tr.importer.Importer;const PROCESS_DUMP_HEADER='PROCESS DUMP';function ProcessDataImporter(model,processData){this.model_=model;this.processDataLines=processData.split('\n');this.importPriority=3;}
+ProcessDataImporter.canImport=function(events){if(!(typeof(events)==='string'||events instanceof String)){return false;}
+if(events.split('\n')[0]===PROCESS_DUMP_HEADER){return true;}
+return false;};ProcessDataImporter.prototype={__proto__:Importer.prototype,get importerName(){return'ProcessDataImporter';},get model(){return this.model_;},parseEventData(data){const allDumpedProcesses={};let parseProcesses=false;let parseThreads=false;let legacy=false;for(let i=1;i<data.length;i++){const cols=data[i].split(/\s+/);if(cols[0].startsWith('USER')){if(parseProcesses){parseProcesses=false;parseThreads=true;}else{parseThreads=false;parseProcesses=true;}
+const colCount=cols.length;if(parseProcesses&&colCount===9){legacy=false;}else if(parseProcesses&&colCount===8){legacy=true;}
+continue;}
+if(parseProcesses){const pid=Number(cols[1]);if(allDumpedProcesses[pid]===undefined){allDumpedProcesses[pid]={};}
+allDumpedProcesses[pid]={'name':cols[8],pid,'comm':cols[9]};continue;}
+if(parseThreads){let pid;let tid;let name;if(legacy){pid=Number(cols[1]);if(allDumpedProcesses[pid]!==undefined){tid=pid;}else{tid=pid;pid=Number(cols[2]);}
+name=cols.slice(8).join(' ');}else{pid=Number(cols[1]);tid=Number(cols[2]);name=cols.slice(3).join(' ');}
+if(allDumpedProcesses[pid]===undefined)continue;if(allDumpedProcesses[pid].threads===undefined){allDumpedProcesses[pid].threads={};}
+allDumpedProcesses[pid].threads[tid]={tid,name};continue;}}
+return allDumpedProcesses;},importEvents(){const allDumpedProcesses=this.parseEventData(this.processDataLines);const modelProcesses=this.model_.getAllProcesses();for(let i=0;i<modelProcesses.length;i++){const modelProcess=modelProcesses[i];const pid=modelProcess.pid;const dumpedProcess=allDumpedProcesses[pid];if(dumpedProcess===undefined){continue;}
+modelProcess.name=dumpedProcess.name;const processDumpThreads=dumpedProcess.threads;if(processDumpThreads!==undefined){for(const tid in modelProcess.threads){const modelThread=modelProcess.threads[tid];if(Number(pid)===Number(tid)){modelThread.name='UI thread';}else if(modelThread.name==='<...>'){if(processDumpThreads[tid]!==undefined){modelThread.name=processDumpThreads[tid].name;}}}}}}};Importer.register(ProcessDataImporter);return{ProcessDataImporter,};});'use strict';tr.exportTo('tr.e.importer.battor',function(){function BattorImporter(model,events){this.importPriority=3;this.model_=model;this.samples_=[];this.syncTimestampsById_=new Map();this.parseTrace_(events);}
+const battorDataLineRE=new RegExp('^(-?\\d+\\.\\d+)\\s+(-?\\d+\\.\\d+)\\s+(-?\\d+\\.\\d+)'+'(?:\\s+<(\\S+)>)?$');const battorHeaderLineRE=/^# BattOr/;BattorImporter.canImport=function(events){if(!(typeof(events)==='string'||events instanceof String)){return false;}
+return battorHeaderLineRE.test(events);};BattorImporter.prototype={__proto__:tr.importer.Importer.prototype,get importerName(){return'BattorImporter';},get model(){return this.model_;},importClockSyncMarkers(){for(const[syncId,ts]of this.syncTimestampsById_){this.model_.clockSyncManager.addClockSyncMarker(tr.model.ClockDomainId.BATTOR,syncId,ts);}},importEvents(){if(this.model_.device.powerSeries){this.model_.importWarning({type:'import_error',message:'Power counter exists, can not import BattOr power trace.'});return;}
+const modelTimeTransformer=this.model_.clockSyncManager.getModelTimeTransformer(tr.model.ClockDomainId.BATTOR);const powerSeries=this.model_.device.powerSeries=new tr.model.PowerSeries(this.model_.device);for(let i=0;i<this.samples_.length;i++){const sample=this.samples_[i];powerSeries.addPowerSample(modelTimeTransformer(sample.ts),sample.powerInW);}},parseTrace_(trace){const lines=trace.split('\n');for(let line of lines){line=line.trim();if(line.length===0)continue;if(line.startsWith('#'))continue;const groups=battorDataLineRE.exec(line);if(!groups){this.model_.importWarning({type:'parse_error',message:'Unrecognized line in BattOr trace: '+line});continue;}
+const ts=parseFloat(groups[1]);const voltageInV=tr.b.convertUnit(parseFloat(groups[2]),tr.b.UnitPrefixScale.METRIC.MILLI,tr.b.UnitPrefixScale.METRIC.NONE);const currentInA=tr.b.convertUnit(parseFloat(groups[3]),tr.b.UnitPrefixScale.METRIC.MILLI,tr.b.UnitPrefixScale.METRIC.NONE);const syncId=groups[4];if(syncId){this.syncTimestampsById_.set(syncId,ts);}
+if(voltageInV<0||currentInA<0){this.model_.importWarning({type:'parse_error',message:'The following line in the BattOr trace has a negative '+'voltage or current, neither of which are allowed: '+line+'. A common cause of this is that the device is charging '+'while the trace is being recorded.'});continue;}
+this.samples_.push(new Sample(ts,voltageInV,currentInA));}}};function Sample(ts,voltageInV,currentInA){this.ts=ts;this.voltageInV=voltageInV;this.currentInA=currentInA;}
+Sample.prototype={get powerInW(){return this.voltageInV*this.currentInA;}};tr.importer.Importer.register(BattorImporter);return{BattorImporter,};});'use strict';tr.exportTo('tr.e.importer.ddms',function(){const kPid=0;const kCategory='java';const kMethodLutEndMarker='\n*end\n';const kThreadsStart='\n*threads\n';const kMethodsStart='\n*methods\n';const kTraceMethodEnter=0x00;const kTraceMethodExit=0x01;const kTraceUnroll=0x02;const kTraceMethodActionMask=0x03;const kTraceHeaderLength=32;const kTraceMagicValue=0x574f4c53;const kTraceVersionSingleClock=2;const kTraceVersionDualClock=3;const kTraceRecordSizeSingleClock=10;const kTraceRecordSizeDualClock=14;function Reader(stringPayload){this.position_=0;this.data_=JSZip.utils.transformTo('uint8array',stringPayload);}
+Reader.prototype={__proto__:Object.prototype,uint8(){const result=this.data_[this.position_];this.position_+=1;return result;},uint16(){let result=0;result+=this.uint8();result+=this.uint8()<<8;return result;},uint32(){let result=0;result+=this.uint8();result+=this.uint8()<<8;result+=this.uint8()<<16;result+=this.uint8()<<24;return result;},uint64(){const low=this.uint32();const high=this.uint32();const lowStr=('0000000'+low.toString(16)).substr(-8);const highStr=('0000000'+high.toString(16)).substr(-8);const result=highStr+lowStr;return result;},seekTo(position){this.position_=position;},hasMore(){return this.position_<this.data_.length;}};function DdmsImporter(model,data){this.importPriority=3;this.model_=model;this.data_=data;}
+DdmsImporter.canImport=function(data){if(typeof(data)==='string'||data instanceof String){const header=data.slice(0,1000);return header.startsWith('*version\n')&&header.indexOf('\nvm=')>=0&&header.indexOf(kThreadsStart)>=0;}
+return false;};DdmsImporter.prototype={__proto__:tr.importer.Importer.prototype,get importerName(){return'DdmsImporter';},get model(){return this.model_;},importEvents(){const divider=this.data_.indexOf(kMethodLutEndMarker)+
+kMethodLutEndMarker.length;this.metadata_=this.data_.slice(0,divider);this.methods_={};this.parseThreads();this.parseMethods();const traceReader=new Reader(this.data_.slice(divider));const magic=traceReader.uint32();if(magic!==kTraceMagicValue){throw Error('Failed to match magic value');}
+this.version_=traceReader.uint16();if(this.version_!==kTraceVersionDualClock){throw Error('Unknown version');}
+const dataOffest=traceReader.uint16();const startDateTime=traceReader.uint64();const recordSize=traceReader.uint16();traceReader.seekTo(dataOffest);while(traceReader.hasMore()){this.parseTraceEntry(traceReader);}},parseTraceEntry(reader){const tid=reader.uint16();const methodPacked=reader.uint32();const cpuSinceStart=reader.uint32();const wallClockSinceStart=reader.uint32();let method=methodPacked&~kTraceMethodActionMask;const action=methodPacked&kTraceMethodActionMask;const thread=this.getTid(tid);method=this.getMethodName(method);if(action===kTraceMethodEnter){thread.sliceGroup.beginSlice(kCategory,method,wallClockSinceStart,undefined,cpuSinceStart);}else if(thread.sliceGroup.openSliceCount){thread.sliceGroup.endSlice(wallClockSinceStart,cpuSinceStart);}},parseThreads(){let threads=this.metadata_.slice(this.metadata_.indexOf(kThreadsStart)+
+kThreadsStart.length);threads=threads.slice(0,threads.indexOf('\n*'));threads=threads.split('\n');threads.forEach(this.parseThread.bind(this));},parseThread(threadLine){const tid=threadLine.slice(0,threadLine.indexOf('\t'));const thread=this.getTid(parseInt(tid));thread.name=threadLine.slice(threadLine.indexOf('\t')+1);},getTid(tid){return this.model_.getOrCreateProcess(kPid).getOrCreateThread(tid);},parseMethods(){let methods=this.metadata_.slice(this.metadata_.indexOf(kMethodsStart)+
+kMethodsStart.length);methods=methods.slice(0,methods.indexOf('\n*'));methods=methods.split('\n');methods.forEach(this.parseMethod.bind(this));},parseMethod(methodLine){const data=methodLine.split('\t');const methodId=parseInt(data[0]);const methodName=data[1]+'.'+data[2]+data[3];this.addMethod(methodId,methodName);},addMethod(methodId,methodName){this.methods_[methodId]=methodName;},getMethodName(methodId){return this.methods_[methodId];}};tr.importer.Importer.register(DdmsImporter);return{DdmsImporter,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){function Parser(importer){this.importer=importer;this.model=importer.model;}
+Parser.prototype={__proto__:Object.prototype};const options=new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE);options.mandatoryBaseClass=Parser;tr.b.decorateExtensionRegistry(Parser,options);return{Parser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function AndroidParser(importer){Parser.call(this,importer);importer.registerEventHandler('tracing_mark_write:android',AndroidParser.prototype.traceMarkWriteAndroidEvent.bind(this));importer.registerEventHandler('0:android',AndroidParser.prototype.traceMarkWriteAndroidEvent.bind(this));this.model_=importer.model_;this.ppids_={};}
+function parseArgs(argsString){const args={};if(argsString){const argsArray=argsString.split(';');for(let i=0;i<argsArray.length;++i){const parts=argsArray[i].split('=');if(parts[0]){args[parts.shift()]=parts.join('=');}}}
+return args;}
+AndroidParser.prototype={__proto__:Parser.prototype,openAsyncSlice(thread,category,name,cookie,ts,args){const asyncSliceConstructor=tr.model.AsyncSlice.subTypes.getConstructor(category,name);const slice=new asyncSliceConstructor(category,name,ColorScheme.getColorIdForGeneralPurposeString(name),ts,args);const key=category+':'+name+':'+cookie;slice.id=cookie;slice.startThread=thread;if(!this.openAsyncSlices){this.openAsyncSlices={};}
+this.openAsyncSlices[key]=slice;},closeAsyncSlice(thread,category,name,cookie,ts,args){if(!this.openAsyncSlices){return;}
+const key=category+':'+name+':'+cookie;const slice=this.openAsyncSlices[key];if(!slice){return;}
+for(const arg in args){if(slice.args[arg]!==undefined){this.model_.importWarning({type:'parse_error',message:'Both the S and F events of '+slice.title+' provided values for argument '+arg+'.'+' The value of the F event will be used.'});}
+slice.args[arg]=args[arg];}
+slice.endThread=thread;slice.duration=ts-slice.start;slice.startThread.asyncSliceGroup.push(slice);delete this.openAsyncSlices[key];},traceMarkWriteAndroidEvent(eventName,cpuNumber,pid,ts,eventBase){const eventData=eventBase.details.split('|');switch(eventData[0]){case'B':{const ppid=parseInt(eventData[1]);const title=eventData[2];const args=parseArgs(eventData[3]);let category=eventData[4];if(category===undefined)category='android';const thread=this.model_.getOrCreateProcess(ppid).getOrCreateThread(pid);thread.name=eventBase.threadName;if(!thread.sliceGroup.isTimestampValidForBeginOrEnd(ts)){this.model_.importWarning({type:'parse_error',message:'Timestamps are moving backward.'});return false;}
+this.ppids_[pid]=ppid;thread.sliceGroup.beginSlice(category,title,ts,args);break;}
+case'E':{const ppid=this.ppids_[pid];if(ppid===undefined){break;}
+const thread=this.model_.getOrCreateProcess(ppid).getOrCreateThread(pid);if(!thread.sliceGroup.openSliceCount){break;}
+const slice=thread.sliceGroup.endSlice(ts);const args=parseArgs(eventData[3]);for(const arg in args){if(slice.args[arg]!==undefined){this.model_.importWarning({type:'parse_error',message:'Both the B and E events of '+slice.title+' provided values for argument '+arg+'.'+' The value of the E event will be used.'});}
+slice.args[arg]=args[arg];}
+break;}
+case'C':{const ppid=parseInt(eventData[1]);const name=eventData[2];const value=parseInt(eventData[3]);let category=eventData[4];if(category===undefined)category='android';const ctr=this.model_.getOrCreateProcess(ppid).getOrCreateCounter(category,name);if(ctr.numSeries===0){ctr.addSeries(new tr.model.CounterSeries(value,ColorScheme.getColorIdForGeneralPurposeString(ctr.name+'.'+'value')));}
+ctr.series.forEach(function(series){series.addCounterSample(ts,value);});break;}
+case'S':{const ppid=parseInt(eventData[1]);const name=eventData[2];const cookie=parseInt(eventData[3]);const args=parseArgs(eventData[4]);let category=eventData[5];if(category===undefined)category='android';const thread=this.model_.getOrCreateProcess(ppid).getOrCreateThread(pid);thread.name=eventBase.threadName;this.ppids_[pid]=ppid;this.openAsyncSlice(thread,category,name,cookie,ts,args);break;}
+case'F':{const ppid=parseInt(eventData[1]);const name=eventData[2];const cookie=parseInt(eventData[3]);const args=parseArgs(eventData[4]);let category=eventData[5];if(category===undefined)category='android';const thread=this.model_.getOrCreateProcess(ppid).getOrCreateThread(pid);thread.name=eventBase.threadName;this.ppids_[pid]=ppid;this.closeAsyncSlice(thread,category,name,cookie,ts,args);break;}
+default:return false;}
+return true;}};Parser.register(AndroidParser);return{AndroidParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;const binderTransRE=new RegExp('transaction=(\\d+) dest_node=(\\d+) '+'dest_proc=(\\d+) dest_thread=(\\d+) '+'reply=(\\d+) flags=(0x[0-9a-fA-F]+) '+'code=(0x[0-9a-fA-F]+)');const binderTransReceivedRE=/transaction=(\d+)/;function isBinderThread(name){return(name.indexOf('Binder')>-1);}
+const TF_ONE_WAY=0x01;const TF_ROOT_OBJECT=0x04;const TF_STATUS_CODE=0x08;const TF_ACCEPT_FDS=0x10;const NO_FLAGS=0;function binderFlagsToHuman(num){const flag=parseInt(num,16);let str='';if(flag&TF_ONE_WAY){str+='this is a one-way call: async, no return; ';}
+if(flag&TF_ROOT_OBJECT){str+='contents are the components root object; ';}
+if(flag&TF_STATUS_CODE){str+='contents are a 32-bit status code; ';}
+if(flag&TF_ACCEPT_FDS){str+='allow replies with file descriptors; ';}
+if(flag===NO_FLAGS){str+='No Flags Set';}
+return str;}
+function isReplyToOrigin(calling,called){return(called.dest_proc===calling.calling_pid||called.dest_thread===calling.calling_pid);}
+function binderCodeToHuman(code){return'Java Layer Dependent';}
+function doInternalSlice(trans,slice,ts){if(slice.subSlices.length!==0){slice.subSlices[0].start=ts;return slice.subSlices[0];}
+const kthread=trans.calling_kthread.thread;const internalSlice=kthread.sliceGroup.pushCompleteSlice('binder',slice.title,ts,.001,0,0,slice.args);internalSlice.title=slice.title;internalSlice.id=slice.id;internalSlice.colorId=slice.colorId;slice.subSlices.push(internalSlice);return internalSlice;}
+function generateBinderArgsForSlice(trans,cThreadName){return{'Transaction Id':trans.transaction_key,'Destination Node':trans.dest_node,'Destination Process':trans.dest_proc,'Destination Thread':trans.dest_thread,'Destination Name':cThreadName,'Reply transaction?':trans.is_reply_transaction,'Flags':trans.flags+' '+
+binderFlagsToHuman(trans.flags),'Code':trans.code+' '+
+binderCodeToHuman(trans.code),'Calling PID':trans.calling_pid,'Calling tgid':trans.calling_kthread.thread.parent.pid};}
+function BinderTransaction(events,callingPid,callingTs,callingKthread){this.transaction_key=parseInt(events[1]);this.dest_node=parseInt(events[2]);this.dest_proc=parseInt(events[3]);this.dest_thread=parseInt(events[4]);this.is_reply_transaction=parseInt(events[5])===1?true:false;this.expect_reply=((this.is_reply_transaction===false)&&(parseInt(events[6],16)&TF_ONE_WAY)===0);this.flags=events[6];this.code=events[7];this.calling_pid=callingPid;this.calling_ts=callingTs;this.calling_kthread=callingKthread;}
+function BinderParser(importer){Parser.call(this,importer);importer.registerEventHandler('binder_locked',BinderParser.prototype.binderLocked.bind(this));importer.registerEventHandler('binder_unlock',BinderParser.prototype.binderUnlock.bind(this));importer.registerEventHandler('binder_lock',BinderParser.prototype.binderLock.bind(this));importer.registerEventHandler('binder_transaction',BinderParser.prototype.binderTransaction.bind(this));importer.registerEventHandler('binder_transaction_received',BinderParser.prototype.binderTransactionReceived.bind(this));this.model_=importer.model;this.kthreadlookup={};this.importer_=importer;this.transWaitingRecv={};this.syncTransWaitingCompletion={};this.recursiveSyncTransWaitingCompletion_ByPID={};this.receivedTransWaitingConversion={};}
+BinderParser.prototype={__proto__:Parser.prototype,binderLock(eventName,cpuNumber,pid,ts,eventBase){const tgid=parseInt(eventBase.tgid);if(isNaN(tgid))return false;this.doNameMappings(pid,tgid,eventName.threadName);const kthread=this.importer_.getOrCreateBinderKernelThread(eventBase.threadName,tgid,pid);kthread.binderAttemptLockTS=ts;kthread.binderOpenTsA=ts;return true;},binderLocked(eventName,cpuNumber,pid,ts,eventBase){const tgid=parseInt(eventBase.tgid);if(isNaN(tgid))return false;const binderThread=isBinderThread(eventBase.threadName);const name=eventBase.threadName;const kthread=this.importer_.getOrCreateBinderKernelThread(eventBase.threadName,tgid,pid);this.doNameMappings(pid,tgid,name);const rthread=kthread.thread;kthread.binderLockAquiredTS=ts;if(kthread.binderAttemptLockTS===undefined)return false;const args=this.generateArgsForSlice(tgid,pid,name,kthread);rthread.sliceGroup.pushCompleteSlice('binder','binder lock waiting',kthread.binderAttemptLockTS,ts-kthread.binderAttemptLockTS,0,0,args);kthread.binderAttemptLockTS=undefined;return true;},binderUnlock(eventName,cpuNumber,pid,ts,eventBase){const tgid=parseInt(eventBase.tgid);if(isNaN(tgid))return false;const kthread=this.importer_.getOrCreateBinderKernelThread(eventBase.threadName,tgid,pid);if(kthread.binderLockAquiredTS===undefined)return false;const args=this.generateArgsForSlice(tgid,pid,eventBase.threadName,kthread);kthread.thread.sliceGroup.pushCompleteSlice('binder','binder lock held',kthread.binderLockAquiredTS,ts-kthread.binderLockAquiredTS,0,0,args);kthread.binderLockAquiredTS=undefined;return true;},binderTransaction(eventName,cpuNumber,pid,ts,eventBase){const event=binderTransRE.exec(eventBase.details);if(event===undefined)return false;const tgid=parseInt(eventBase.tgid);if(isNaN(tgid))return false;this.doNameMappings(pid,tgid,eventBase.threadName);const kthread=this.importer_.getOrCreateBinderKernelThread(eventBase.threadName,tgid,pid);const trans=new BinderTransaction(event,pid,ts,kthread);const args=generateBinderArgsForSlice(trans,eventBase.threadName);const priorReceive=this.getPriorReceiveOnPID(pid);if(priorReceive!==false){return this.modelPriorReceive(priorReceive,ts,pid,tgid,kthread,trans,args,event);}
+const recursiveTrans=this.getRecursiveTransactionNeedingCompletion(pid);if(recursiveTrans!==false){return this.modelRecursiveTransactions(recursiveTrans,ts,pid,kthread,trans,args);}
+const slice=kthread.thread.sliceGroup.pushCompleteSlice('binder','',ts,.03,0,0,args);slice.colorId=ColorScheme.getColorIdForGeneralPurposeString(ts.toString());trans.slice=slice;if(trans.expect_reply){slice.title='binder transaction';}else{slice.title='binder transaction async';}
+this.addTransactionWaitingForRecv(trans.transaction_key,trans);return true;},binderTransactionReceived(eventName,cpuNumber,pid,ts,eventBase){const event=binderTransReceivedRE.exec(eventBase.details);if(event===undefined)return false;const tgid=parseInt(eventBase.tgid);if(isNaN(tgid))return false;const transactionkey=parseInt(event[1]);const kthread=this.importer_.getOrCreateBinderKernelThread(eventBase.threadName,tgid,pid);const syncComplete=this.getSyncTransNeedsCompletion(transactionkey);if(syncComplete!==false){const syncTrans=syncComplete[0];const syncSlice=syncTrans.slice;const responseTrans=syncComplete[1];const responseSlice=responseTrans.slice;syncSlice.duration=ts-syncSlice.start;const syncInternal=doInternalSlice(syncTrans,syncSlice,ts);const responseTs=responseSlice.start+responseSlice.duration;const responseInternal=doInternalSlice(responseTrans,responseSlice,responseTs);if(responseSlice.outFlowEvents.length===0||syncSlice.inFlowEvents.length===0){const flow=this.generateFlow(responseInternal,syncInternal,responseTrans,syncTrans);syncSlice.inFlowEvents.push(flow);responseSlice.outFlowEvents.push(flow);this.model_.flowEvents.push(flow);}
+for(let i=1;i<syncSlice.inFlowEvents.length;i++){syncSlice.inFlowEvents[i].duration=ts-syncSlice.inFlowEvents[i].start;}
+return true;}
+const trForRecv=this.getTransactionWaitingForRecv(transactionkey);if(trForRecv!==false){if(!trForRecv.expect_reply){const args=generateBinderArgsForSlice(trForRecv,eventBase.threadName);const slice=kthread.thread.sliceGroup.pushCompleteSlice('binder','binder Async recv',ts,.03,0,0,args);const fakeEvent=[0,0,0,0,0,0,0];const fakeTrans=new BinderTransaction(fakeEvent,pid,ts,kthread);const flow=this.generateFlow(trForRecv.slice,slice,trForRecv,fakeTrans);this.model_.flowEvents.push(flow);trForRecv.slice.title='binder transaction async';trForRecv.slice.duration=.03;return true;}
+trForRecv.slice.title='binder transaction';this.setCurrentReceiveOnPID(pid,[ts,trForRecv]);return true;}
+return false;},modelRecursiveTransactions(recursiveTrans,ts,pid,kthread,trans,args){const recursiveSlice=recursiveTrans[1].slice;const origSlice=recursiveTrans[0].slice;recursiveSlice.duration=ts-recursiveSlice.start;trans.slice=recursiveSlice;if(trans.is_reply_transaction){origSlice.duration=ts-origSlice.start;this.addSyncTransNeedingCompletion(trans.transaction_key,recursiveTrans);if(isReplyToOrigin(recursiveTrans[0],trans)){this.removeRecursiveTransaction(pid);}}else{const slice=kthread.thread.sliceGroup.pushCompleteSlice('binder','',ts,.03,0,0,args);trans.slice=slice;this.addTransactionWaitingForRecv(trans.transaction_key,trans);}
+return true;},modelPriorReceive(priorReceive,ts,pid,tgid,kthread,trans,args,event){const calleeSlice=priorReceive[1].slice;const calleeTrans=priorReceive[1];const recvTs=priorReceive[0];let slice=kthread.thread.sliceGroup.pushCompleteSlice('binder','',recvTs,ts-recvTs,0,0,args);const flow=this.generateFlow(calleeSlice,slice,calleeTrans,trans);this.model_.flowEvents.push(flow);trans.slice=slice;if(trans.is_reply_transaction){slice.title='binder reply';this.addSyncTransNeedingCompletion(trans.transaction_key,[calleeTrans,trans]);}else{slice.title='binder reply';const trans1=new BinderTransaction(event,pid,ts,kthread);slice=kthread.thread.sliceGroup.pushCompleteSlice('binder','binder transaction',recvTs,(ts-recvTs),0,0,args);if(!trans.expect_reply){slice.title='binder transaction async';slice.duration=.03;}else{}
+trans1.slice=slice;this.addRecursiveSyncTransNeedingCompletion(pid,[calleeTrans,trans]);this.addTransactionWaitingForRecv(trans.transaction_key,trans1);}
+return true;},getRecursiveTransactionNeedingCompletion(pid){if(this.recursiveSyncTransWaitingCompletion_ByPID[pid]===undefined){return false;}
+const len=this.recursiveSyncTransWaitingCompletion_ByPID[pid].length;if(len===0)return false;return this.recursiveSyncTransWaitingCompletion_ByPID[pid][len-1];},addRecursiveSyncTransNeedingCompletion(pid,tuple){if(this.recursiveSyncTransWaitingCompletion_ByPID[pid]===undefined){this.recursiveSyncTransWaitingCompletion_ByPID[pid]=[];}
+this.recursiveSyncTransWaitingCompletion_ByPID[pid].push(tuple);},removeRecursiveTransaction(pid){const len=this.recursiveSyncTransWaitingCompletion_ByPID[pid].length;if(len===0){delete this.recursiveSyncTransWaitingCompletion_ByPID[pid];return;}
+this.recursiveSyncTransWaitingCompletion_ByPID[pid].splice(len-1,1);},setCurrentReceiveOnPID(pid,tuple){if(this.receivedTransWaitingConversion[pid]===undefined){this.receivedTransWaitingConversion[pid]=[];}
+this.receivedTransWaitingConversion[pid].push(tuple);},getPriorReceiveOnPID(pid){if(this.receivedTransWaitingConversion[pid]===undefined){return false;}
+const len=this.receivedTransWaitingConversion[pid].length;if(len===0)return false;return this.receivedTransWaitingConversion[pid].splice(len-1,1)[0];},addSyncTransNeedingCompletion(transactionkey,tuple){const dict=this.syncTransWaitingCompletion;dict[transactionkey]=tuple;},getSyncTransNeedsCompletion(transactionkey){const ret=this.syncTransWaitingCompletion[transactionkey];if(ret===undefined)return false;delete this.syncTransWaitingCompletion[transactionkey];return ret;},getTransactionWaitingForRecv(transactionkey){const ret=this.transWaitingRecv[transactionkey];if(ret===undefined)return false;delete this.transWaitingRecv[transactionkey];return ret;},addTransactionWaitingForRecv(transactionkey,transaction){this.transWaitingRecv[transactionkey]=transaction;},generateFlow(from,to,fromTrans,toTrans){const title='Transaction from : '+
+this.pid2name(fromTrans.calling_pid)+' From PID: '+fromTrans.calling_pid+' to pid: '+
+toTrans.calling_pid+' Thread Name: '+this.pid2name(toTrans.calling_pid);const ts=from.start;const flow=new tr.model.FlowEvent('binder','binder',title,1,ts,[]);flow.startSlice=from;flow.endSlice=to;flow.start=from.start;flow.duration=to.start-ts;from.outFlowEvents.push(flow);to.inFlowEvents.push(flow);return flow;},generateArgsForSlice(tgid,pid,name,kthread){return{'Thread Name':name,pid,'gid':tgid};},pid2name(pid){return this.kthreadlookup[pid];},doNameMappings(pid,tgid,name){this.registerPidName(pid,name);this.registerPidName(tgid,name);},registerPidName(pid,name){if(this.pid2name(pid)===undefined){this.kthreadlookup[pid]=name;}}};Parser.register(BinderParser);return{BinderParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function BusParser(importer){Parser.call(this,importer);importer.registerEventHandler('memory_bus_usage',BusParser.prototype.traceMarkWriteBusEvent.bind(this));this.model_=importer.model_;this.ppids_={};}
+BusParser.prototype={__proto__:Parser.prototype,traceMarkWriteBusEvent(eventName,cpuNumber,pid,ts,eventBase,threadName){const re=new RegExp('bus=(\\S+) rw_bytes=(\\d+) r_bytes=(\\d+) '+'w_bytes=(\\d+) cycles=(\\d+) ns=(\\d+)');const event=re.exec(eventBase.details);const name=event[1];const rwBytes=parseInt(event[2]);const rBytes=parseInt(event[3]);const wBytes=parseInt(event[4]);const cycles=parseInt(event[5]);const ns=parseInt(event[6]);const sec=tr.b.convertUnit(ns,tr.b.UnitPrefixScale.METRIC.NANO,tr.b.UnitPrefixScale.METRIC.NONE);const readBandwidthInBps=rBytes/sec;const readBandwidthInMiBps=tr.b.convertUnit(readBandwidthInBps,tr.b.UnitPrefixScale.BINARY.NONE,tr.b.UnitPrefixScale.BINARY.MEBI);const writeBandwidthInBps=wBytes/sec;const writeBandwidthInMiBps=tr.b.convertUnit(writeBandwidthInBps,tr.b.UnitPrefixScale.BINARY.NONE,tr.b.UnitPrefixScale.BINARY.MEBI);let ctr=this.model_.kernel.getOrCreateCounter(null,'bus '+name+' read');if(ctr.numSeries===0){ctr.addSeries(new tr.model.CounterSeries('value',ColorScheme.getColorIdForGeneralPurposeString(ctr.name+'.'+'value')));}
+ctr.series.forEach(function(series){series.addCounterSample(ts,readBandwidthInMiBps);});ctr=this.model_.kernel.getOrCreateCounter(null,'bus '+name+' write');if(ctr.numSeries===0){ctr.addSeries(new tr.model.CounterSeries('value',ColorScheme.getColorIdForGeneralPurposeString(ctr.name+'.'+'value')));}
+ctr.series.forEach(function(series){series.addCounterSample(ts,writeBandwidthInMiBps);});return true;}};Parser.register(BusParser);return{BusParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function ClockParser(importer){Parser.call(this,importer);importer.registerEventHandler('clock_set_rate',ClockParser.prototype.traceMarkWriteClockEvent.bind(this));this.model_=importer.model_;this.ppids_={};}
+ClockParser.prototype={__proto__:Parser.prototype,traceMarkWriteClockEvent(eventName,cpuNumber,pid,ts,eventBase,threadName){const event=/(\S+) state=(\d+) cpu_id=(\d+)/.exec(eventBase.details);const name=event[1];const rate=parseInt(event[2]);const ctr=this.model_.kernel.getOrCreateCounter(null,name);if(ctr.numSeries===0){ctr.addSeries(new tr.model.CounterSeries('value',ColorScheme.getColorIdForGeneralPurposeString(ctr.name+'.'+'value')));}
+ctr.series.forEach(function(series){series.addCounterSample(ts,rate);});return true;}};Parser.register(ClockParser);return{ClockParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function CpufreqParser(importer){Parser.call(this,importer);importer.registerEventHandler('cpufreq_interactive_up',CpufreqParser.prototype.cpufreqUpDownEvent.bind(this));importer.registerEventHandler('cpufreq_interactive_down',CpufreqParser.prototype.cpufreqUpDownEvent.bind(this));importer.registerEventHandler('cpufreq_interactive_already',CpufreqParser.prototype.cpufreqTargetEvent.bind(this));importer.registerEventHandler('cpufreq_interactive_notyet',CpufreqParser.prototype.cpufreqTargetEvent.bind(this));importer.registerEventHandler('cpufreq_interactive_setspeed',CpufreqParser.prototype.cpufreqTargetEvent.bind(this));importer.registerEventHandler('cpufreq_interactive_target',CpufreqParser.prototype.cpufreqTargetEvent.bind(this));importer.registerEventHandler('cpufreq_interactive_boost',CpufreqParser.prototype.cpufreqBoostUnboostEvent.bind(this));importer.registerEventHandler('cpufreq_interactive_unboost',CpufreqParser.prototype.cpufreqBoostUnboostEvent.bind(this));}
+function splitData(input){const data={};const args=input.split(/\s+/);const len=args.length;for(let i=0;i<len;i++){const item=args[i].split('=');data[item[0]]=parseInt(item[1]);}
+return data;}
+CpufreqParser.prototype={__proto__:Parser.prototype,cpufreqSlice(ts,eventName,cpu,args){const kthread=this.importer.getOrCreatePseudoThread('cpufreq');kthread.openSlice=eventName;const slice=new tr.model.ThreadSlice('',kthread.openSlice,ColorScheme.getColorIdForGeneralPurposeString(kthread.openSlice),ts,args,0);kthread.thread.sliceGroup.pushSlice(slice);},cpufreqBoostSlice(ts,eventName,args){const kthread=this.importer.getOrCreatePseudoThread('cpufreq_boost');kthread.openSlice=eventName;const slice=new tr.model.ThreadSlice('',kthread.openSlice,ColorScheme.getColorIdForGeneralPurposeString(kthread.openSlice),ts,args,0);kthread.thread.sliceGroup.pushSlice(slice);},cpufreqUpDownEvent(eventName,cpuNumber,pid,ts,eventBase){const data=splitData(eventBase.details);this.cpufreqSlice(ts,eventName,data.cpu,data);return true;},cpufreqTargetEvent(eventName,cpuNumber,pid,ts,eventBase){const data=splitData(eventBase.details);this.cpufreqSlice(ts,eventName,data.cpu,data);return true;},cpufreqBoostUnboostEvent(eventName,cpuNumber,pid,ts,eventBase){this.cpufreqBoostSlice(ts,eventName,{type:eventBase.details});return true;}};Parser.register(CpufreqParser);return{CpufreqParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function DiskParser(importer){Parser.call(this,importer);importer.registerEventHandler('f2fs_write_begin',DiskParser.prototype.f2fsWriteBeginEvent.bind(this));importer.registerEventHandler('f2fs_write_end',DiskParser.prototype.f2fsWriteEndEvent.bind(this));importer.registerEventHandler('f2fs_sync_file_enter',DiskParser.prototype.f2fsSyncFileEnterEvent.bind(this));importer.registerEventHandler('f2fs_sync_file_exit',DiskParser.prototype.f2fsSyncFileExitEvent.bind(this));importer.registerEventHandler('ext4_sync_file_enter',DiskParser.prototype.ext4SyncFileEnterEvent.bind(this));importer.registerEventHandler('ext4_sync_file_exit',DiskParser.prototype.ext4SyncFileExitEvent.bind(this));importer.registerEventHandler('ext4_da_write_begin',DiskParser.prototype.ext4WriteBeginEvent.bind(this));importer.registerEventHandler('ext4_da_write_end',DiskParser.prototype.ext4WriteEndEvent.bind(this));importer.registerEventHandler('block_rq_issue',DiskParser.prototype.blockRqIssueEvent.bind(this));importer.registerEventHandler('block_rq_complete',DiskParser.prototype.blockRqCompleteEvent.bind(this));}
+DiskParser.prototype={__proto__:Parser.prototype,openAsyncSlice(ts,category,threadName,pid,key,name){const kthread=this.importer.getOrCreateKernelThread(category+':'+threadName,pid);const asyncSliceConstructor=tr.model.AsyncSlice.subTypes.getConstructor(category,name);const slice=new asyncSliceConstructor(category,name,ColorScheme.getColorIdForGeneralPurposeString(name),ts);slice.startThread=kthread.thread;if(!kthread.openAsyncSlices){kthread.openAsyncSlices={};}
+kthread.openAsyncSlices[key]=slice;},closeAsyncSlice(ts,category,threadName,pid,key,args){const kthread=this.importer.getOrCreateKernelThread(category+':'+threadName,pid);if(kthread.openAsyncSlices){const slice=kthread.openAsyncSlices[key];if(slice){slice.duration=ts-slice.start;slice.args=args;slice.endThread=kthread.thread;slice.subSlices=[new tr.model.AsyncSlice(category,slice.title,slice.colorId,slice.start,slice.args,slice.duration)];kthread.thread.asyncSliceGroup.push(slice);delete kthread.openAsyncSlices[key];}}},f2fsWriteBeginEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/dev = \((\d+,\d+)\), ino = (\d+), pos = (\d+), len = (\d+), flags = (\d+)/.exec(eventBase.details);if(!event)return false;const device=event[1];const inode=parseInt(event[2]);const pos=parseInt(event[3]);const len=parseInt(event[4]);const key=device+'-'+inode+'-'+pos+'-'+len;this.openAsyncSlice(ts,'f2fs',eventBase.threadName,eventBase.pid,key,'f2fs_write');return true;},f2fsWriteEndEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/dev = \((\d+,\d+)\), ino = (\d+), pos = (\d+), len = (\d+), copied = (\d+)/.exec(eventBase.details);if(!event)return false;const device=event[1];const inode=parseInt(event[2]);const pos=parseInt(event[3]);const len=parseInt(event[4]);const error=parseInt(event[5])!==len;const key=device+'-'+inode+'-'+pos+'-'+len;this.closeAsyncSlice(ts,'f2fs',eventBase.threadName,eventBase.pid,key,{device,inode,error});return true;},ext4WriteBeginEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/dev (\d+,\d+) ino (\d+) pos (\d+) len (\d+) flags (\d+)/.exec(eventBase.details);if(!event)return false;const device=event[1];const inode=parseInt(event[2]);const pos=parseInt(event[3]);const len=parseInt(event[4]);const key=device+'-'+inode+'-'+pos+'-'+len;this.openAsyncSlice(ts,'ext4',eventBase.threadName,eventBase.pid,key,'ext4_write');return true;},ext4WriteEndEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/dev (\d+,\d+) ino (\d+) pos (\d+) len (\d+) copied (\d+)/.exec(eventBase.details);if(!event)return false;const device=event[1];const inode=parseInt(event[2]);const pos=parseInt(event[3]);const len=parseInt(event[4]);const error=parseInt(event[5])!==len;const key=device+'-'+inode+'-'+pos+'-'+len;this.closeAsyncSlice(ts,'ext4',eventBase.threadName,eventBase.pid,key,{device,inode,error});return true;},f2fsSyncFileEnterEvent(eventName,cpuNumber,pid,ts,eventBase){const event=new RegExp('dev = \\((\\d+,\\d+)\\), ino = (\\d+), pino = (\\d+), i_mode = (\\S+), '+'i_size = (\\d+), i_nlink = (\\d+), i_blocks = (\\d+), i_advise = (\\d+)').exec(eventBase.details);if(!event)return false;const device=event[1];const inode=parseInt(event[2]);const key=device+'-'+inode;this.openAsyncSlice(ts,'f2fs',eventBase.threadName,eventBase.pid,key,'fsync');return true;},f2fsSyncFileExitEvent(eventName,cpuNumber,pid,ts,eventBase){const event=new RegExp('dev = \\((\\d+,\\d+)\\), ino = (\\d+), checkpoint is (\\S+), '+'datasync = (\\d+), ret = (\\d+)').exec(eventBase.details.replace('not needed','not_needed'));if(!event)return false;const device=event[1];const inode=parseInt(event[2]);const error=parseInt(event[5]);const key=device+'-'+inode;this.closeAsyncSlice(ts,'f2fs',eventBase.threadName,eventBase.pid,key,{device,inode,error});return true;},ext4SyncFileEnterEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/dev (\d+,\d+) ino (\d+) parent (\d+) datasync (\d+)/.exec(eventBase.details);if(!event)return false;const device=event[1];const inode=parseInt(event[2]);const datasync=(event[4]==='1')||(event[4]===1);const key=device+'-'+inode;const action=datasync?'fdatasync':'fsync';this.openAsyncSlice(ts,'ext4',eventBase.threadName,eventBase.pid,key,action);return true;},ext4SyncFileExitEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/dev (\d+,\d+) ino (\d+) ret (\d+)/.exec(eventBase.details);if(!event)return false;const device=event[1];const inode=parseInt(event[2]);const error=parseInt(event[3]);const key=device+'-'+inode;this.closeAsyncSlice(ts,'ext4',eventBase.threadName,eventBase.pid,key,{device,inode,error});return true;},blockRqIssueEvent(eventName,cpuNumber,pid,ts,eventBase){const event=new RegExp('(\\d+,\\d+) (F)?([DWRN])(F)?(A)?(S)?(M)? '+'\\d+ \\(.*\\) (\\d+) \\+ (\\d+) \\[.*\\]').exec(eventBase.details);if(!event)return false;let action;switch(event[3]){case'D':action='discard';break;case'W':action='write';break;case'R':action='read';break;case'N':action='none';break;default:action='unknown';break;}
+if(event[2]){action+=' flush';}
+if(event[4]==='F'){action+=' fua';}
+if(event[5]==='A'){action+=' ahead';}
+if(event[6]==='S'){action+=' sync';}
+if(event[7]==='M'){action+=' meta';}
+const device=event[1];const sector=parseInt(event[8]);const numSectors=parseInt(event[9]);const key=device+'-'+sector+'-'+numSectors;this.openAsyncSlice(ts,'block',eventBase.threadName,eventBase.pid,key,action);return true;},blockRqCompleteEvent(eventName,cpuNumber,pid,ts,eventBase){const event=new RegExp('(\\d+,\\d+) (F)?([DWRN])(F)?(A)?(S)?(M)? '+'\\(.*\\) (\\d+) \\+ (\\d+) \\[(.*)\\]').exec(eventBase.details);if(!event)return false;const device=event[1];const sector=parseInt(event[8]);const numSectors=parseInt(event[9]);const error=parseInt(event[10]);const key=device+'-'+sector+'-'+numSectors;this.closeAsyncSlice(ts,'block',eventBase.threadName,eventBase.pid,key,{device,sector,numSectors,error});return true;}};Parser.register(DiskParser);return{DiskParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function DrmParser(importer){Parser.call(this,importer);importer.registerEventHandler('drm_vblank_event',DrmParser.prototype.vblankEvent.bind(this));}
+DrmParser.prototype={__proto__:Parser.prototype,drmVblankSlice(ts,eventName,args){const kthread=this.importer.getOrCreatePseudoThread('drm_vblank');kthread.openSlice=eventName;const slice=new tr.model.ThreadSlice('',kthread.openSlice,ColorScheme.getColorIdForGeneralPurposeString(kthread.openSlice),ts,args,0);kthread.thread.sliceGroup.pushSlice(slice);},vblankEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/crtc=(\d+), seq=(\d+)/.exec(eventBase.details);if(!event)return false;const crtc=parseInt(event[1]);const seq=parseInt(event[2]);this.drmVblankSlice(ts,'vblank:'+crtc,{crtc,seq});return true;}};Parser.register(DrmParser);return{DrmParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function ExynosParser(importer){Parser.call(this,importer);importer.registerEventHandler('exynos_busfreq_target_int',ExynosParser.prototype.busfreqTargetIntEvent.bind(this));importer.registerEventHandler('exynos_busfreq_target_mif',ExynosParser.prototype.busfreqTargetMifEvent.bind(this));importer.registerEventHandler('exynos_page_flip_state',ExynosParser.prototype.pageFlipStateEvent.bind(this));}
+ExynosParser.prototype={__proto__:Parser.prototype,exynosBusfreqSample(name,ts,frequency){const targetCpu=this.importer.getOrCreateCpu(0);const counter=targetCpu.getOrCreateCounter('',name);if(counter.numSeries===0){counter.addSeries(new tr.model.CounterSeries('frequency',ColorScheme.getColorIdForGeneralPurposeString(counter.name+'.'+'frequency')));}
+counter.series.forEach(function(series){series.addCounterSample(ts,frequency);});},busfreqTargetIntEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/frequency=(\d+)/.exec(eventBase.details);if(!event)return false;this.exynosBusfreqSample('INT Frequency',ts,parseInt(event[1]));return true;},busfreqTargetMifEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/frequency=(\d+)/.exec(eventBase.details);if(!event)return false;this.exynosBusfreqSample('MIF Frequency',ts,parseInt(event[1]));return true;},exynosPageFlipStateOpenSlice(ts,pipe,fb,state){const kthread=this.importer.getOrCreatePseudoThread('exynos_flip_state (pipe:'+pipe+', fb:'+fb+')');kthread.openSliceTS=ts;kthread.openSlice=state;},exynosPageFlipStateCloseSlice(ts,pipe,fb,args){const kthread=this.importer.getOrCreatePseudoThread('exynos_flip_state (pipe:'+pipe+', fb:'+fb+')');if(kthread.openSlice){const slice=new tr.model.ThreadSlice('',kthread.openSlice,ColorScheme.getColorIdForGeneralPurposeString(kthread.openSlice),kthread.openSliceTS,args,ts-kthread.openSliceTS);kthread.thread.sliceGroup.pushSlice(slice);}
+kthread.openSlice=undefined;},pageFlipStateEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/pipe=(\d+), fb=(\d+), state=(.*)/.exec(eventBase.details);if(!event)return false;const pipe=parseInt(event[1]);const fb=parseInt(event[2]);const state=event[3];this.exynosPageFlipStateCloseSlice(ts,pipe,fb,{pipe,fb});if(state!=='flipped'){this.exynosPageFlipStateOpenSlice(ts,pipe,fb,state);}
+return true;}};Parser.register(ExynosParser);return{ExynosParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const Parser=tr.e.importer.linux_perf.Parser;function GestureParser(importer){Parser.call(this,importer);importer.registerEventHandler('tracing_mark_write:log',GestureParser.prototype.logEvent.bind(this));importer.registerEventHandler('tracing_mark_write:SyncInterpret',GestureParser.prototype.syncEvent.bind(this));importer.registerEventHandler('tracing_mark_write:HandleTimer',GestureParser.prototype.timerEvent.bind(this));}
+GestureParser.prototype={__proto__:Parser.prototype,gestureOpenSlice(title,ts,opt_args){const thread=this.importer.getOrCreatePseudoThread('gesture').thread;thread.sliceGroup.beginSlice('touchpad_gesture',title,ts,opt_args);},gestureCloseSlice(title,ts){const thread=this.importer.getOrCreatePseudoThread('gesture').thread;if(thread.sliceGroup.openSliceCount){const slice=thread.sliceGroup.mostRecentlyOpenedPartialSlice;if(slice.title!==title){this.importer.model.importWarning({type:'title_match_error',message:'Titles do not match. Title is '+
+slice.title+' in openSlice, and is '+
+title+' in endSlice'});}else{thread.sliceGroup.endSlice(ts);}}},logEvent(eventName,cpuNumber,pid,ts,eventBase){const innerEvent=/^\s*(\w+):\s*(\w+)$/.exec(eventBase.details);switch(innerEvent[1]){case'start':this.gestureOpenSlice('GestureLog',ts,{name:innerEvent[2]});break;case'end':this.gestureCloseSlice('GestureLog',ts);}
+return true;},syncEvent(eventName,cpuNumber,pid,ts,eventBase){const innerEvent=/^\s*(\w+):\s*(\w+)$/.exec(eventBase.details);switch(innerEvent[1]){case'start':this.gestureOpenSlice('SyncInterpret',ts,{interpreter:innerEvent[2]});break;case'end':this.gestureCloseSlice('SyncInterpret',ts);}
+return true;},timerEvent(eventName,cpuNumber,pid,ts,eventBase){const innerEvent=/^\s*(\w+):\s*(\w+)$/.exec(eventBase.details);switch(innerEvent[1]){case'start':this.gestureOpenSlice('HandleTimer',ts,{interpreter:innerEvent[2]});break;case'end':this.gestureCloseSlice('HandleTimer',ts);}
+return true;}};Parser.register(GestureParser);return{GestureParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function I2cParser(importer){Parser.call(this,importer);importer.registerEventHandler('i2c_write',I2cParser.prototype.i2cWriteEvent.bind(this));importer.registerEventHandler('i2c_read',I2cParser.prototype.i2cReadEvent.bind(this));importer.registerEventHandler('i2c_reply',I2cParser.prototype.i2cReplyEvent.bind(this));importer.registerEventHandler('i2c_result',I2cParser.prototype.i2cResultEvent.bind(this));}
+const i2cWriteReplyRE=new RegExp('i2c-(\\d+) #(\\d+) a=([\\da-fA-F]+) f=([\\da-fA-F]+) l=(\\d+) '+'(\\[[\\da-fA-F\\-]+\\])');const i2cReadRE=/i2c-(\d+) #(\d+) a=([\da-fA-F]+) f=([\da-fA-F]+) l=(\d+)/;const i2cResultRE=/i2c-(\d+) n=(\d+) ret=(\d+)/;I2cParser.prototype={__proto__:Parser.prototype,i2cWriteEvent(eventName,cpuNumber,pid,ts,eventBase){const event=i2cWriteReplyRE.exec(eventBase.details);if(!event)return false;const adapterNumber=parseInt(event[1]);const messageNumber=event[2];const address=event[3];const flags=event[4];const dataLength=event[5];const data=event[6];const thread=this.importer.getOrCreatePseudoThread('i2c adapter '+adapterNumber);pushLastSliceIfNeeded(thread,event[1],ts);thread.lastEntryTitle='i2c write';thread.lastEntryTs=ts;thread.lastEntryArgs={'Message number':messageNumber,'Address':address,'Flags':flags,'Data Length':dataLength,'Data':data};return true;},i2cReadEvent(eventName,cpuNumber,pid,ts,eventBase){const event=i2cReadRE.exec(eventBase.details);if(!event)return false;const adapterNumber=parseInt(event[1]);const messageNumber=event[2];const address=event[3];const flags=event[4];const dataLength=event[5];const thread=this.importer.getOrCreatePseudoThread('i2c adapter '+adapterNumber);pushLastSliceIfNeeded(thread,event[1],ts);thread.lastEntryTitle='i2c read';thread.lastEntryTs=ts;thread.lastEntryArgs={'Message number':messageNumber,'Address':address,'Flags':flags,'Data Length':dataLength};return true;},i2cReplyEvent(eventName,cpuNumber,pid,ts,eventBase){const event=i2cWriteReplyRE.exec(eventBase.details);if(!event)return false;const adapterNumber=parseInt(event[1]);const messageNumber=event[2];const address=event[3];const flags=event[4];const dataLength=event[5];const data=event[6];const thread=this.importer.getOrCreatePseudoThread('i2c adapter '+adapterNumber);pushLastSliceIfNeeded(thread,event[1],ts);thread.lastEntryTitle='i2c reply';thread.lastEntryTs=ts;thread.lastEntryArgs={'Message number':messageNumber,'Address':address,'Flags':flags,'Data Length':dataLength,'Data':data};return true;},i2cResultEvent(eventName,cpuNumber,pid,ts,eventBase){const event=i2cResultRE.exec(eventBase.details);if(!event)return false;const adapterNumber=parseInt(event[1]);const numMessages=event[2];const ret=event[3];const thread=this.importer.getOrCreatePseudoThread('i2c adapter '+adapterNumber);const args=thread.lastEntryArgs;if(args!==undefined){args['Number of messages']=numMessages;args.Return=ret;}
+pushLastSliceIfNeeded(thread,event[1],ts);thread.lastEntryTitle=undefined;thread.lastEntryTs=undefined;thread.lastEntryArgs=undefined;return true;},};function pushLastSliceIfNeeded(thread,id,currentTs){if(thread.lastEntryTs!==undefined){const duration=currentTs-thread.lastEntryTs;const slice=new tr.model.ThreadSlice('',thread.lastEntryTitle,ColorScheme.getColorIdForGeneralPurposeString(id),thread.lastEntryTs,thread.lastEntryArgs,duration);thread.thread.sliceGroup.pushSlice(slice);}}
+Parser.register(I2cParser);return{I2cParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function I915Parser(importer){Parser.call(this,importer);importer.registerEventHandler('i915_gem_object_create',I915Parser.prototype.gemObjectCreateEvent.bind(this));importer.registerEventHandler('i915_gem_object_bind',I915Parser.prototype.gemObjectBindEvent.bind(this));importer.registerEventHandler('i915_gem_object_unbind',I915Parser.prototype.gemObjectBindEvent.bind(this));importer.registerEventHandler('i915_gem_object_change_domain',I915Parser.prototype.gemObjectChangeDomainEvent.bind(this));importer.registerEventHandler('i915_gem_object_pread',I915Parser.prototype.gemObjectPreadWriteEvent.bind(this));importer.registerEventHandler('i915_gem_object_pwrite',I915Parser.prototype.gemObjectPreadWriteEvent.bind(this));importer.registerEventHandler('i915_gem_object_fault',I915Parser.prototype.gemObjectFaultEvent.bind(this));importer.registerEventHandler('i915_gem_object_clflush',I915Parser.prototype.gemObjectDestroyEvent.bind(this));importer.registerEventHandler('i915_gem_object_destroy',I915Parser.prototype.gemObjectDestroyEvent.bind(this));importer.registerEventHandler('i915_gem_ring_dispatch',I915Parser.prototype.gemRingDispatchEvent.bind(this));importer.registerEventHandler('i915_gem_ring_flush',I915Parser.prototype.gemRingFlushEvent.bind(this));importer.registerEventHandler('i915_gem_request',I915Parser.prototype.gemRequestEvent.bind(this));importer.registerEventHandler('i915_gem_request_add',I915Parser.prototype.gemRequestEvent.bind(this));importer.registerEventHandler('i915_gem_request_complete',I915Parser.prototype.gemRequestEvent.bind(this));importer.registerEventHandler('i915_gem_request_retire',I915Parser.prototype.gemRequestEvent.bind(this));importer.registerEventHandler('i915_gem_request_wait_begin',I915Parser.prototype.gemRequestEvent.bind(this));importer.registerEventHandler('i915_gem_request_wait_end',I915Parser.prototype.gemRequestEvent.bind(this));importer.registerEventHandler('i915_gem_ring_wait_begin',I915Parser.prototype.gemRingWaitEvent.bind(this));importer.registerEventHandler('i915_gem_ring_wait_end',I915Parser.prototype.gemRingWaitEvent.bind(this));importer.registerEventHandler('i915_reg_rw',I915Parser.prototype.regRWEvent.bind(this));importer.registerEventHandler('i915_flip_request',I915Parser.prototype.flipEvent.bind(this));importer.registerEventHandler('i915_flip_complete',I915Parser.prototype.flipEvent.bind(this));importer.registerEventHandler('intel_gpu_freq_change',I915Parser.prototype.gpuFrequency.bind(this));}
+I915Parser.prototype={__proto__:Parser.prototype,i915FlipOpenSlice(ts,obj,plane){const kthread=this.importer.getOrCreatePseudoThread('i915_flip');kthread.openSliceTS=ts;kthread.openSlice='flip:'+obj+'/'+plane;},i915FlipCloseSlice(ts,args){const kthread=this.importer.getOrCreatePseudoThread('i915_flip');if(kthread.openSlice){const slice=new tr.model.ThreadSlice('',kthread.openSlice,ColorScheme.getColorIdForGeneralPurposeString(kthread.openSlice),kthread.openSliceTS,args,ts-kthread.openSliceTS);kthread.thread.sliceGroup.pushSlice(slice);}
+kthread.openSlice=undefined;},i915GemObjectSlice(ts,eventName,obj,args){const kthread=this.importer.getOrCreatePseudoThread('i915_gem');kthread.openSlice=eventName+':'+obj;const slice=new tr.model.ThreadSlice('',kthread.openSlice,ColorScheme.getColorIdForGeneralPurposeString(kthread.openSlice),ts,args,0);kthread.thread.sliceGroup.pushSlice(slice);},i915GemRingSlice(ts,eventName,dev,ring,args){const kthread=this.importer.getOrCreatePseudoThread('i915_gem_ring');kthread.openSlice=eventName+':'+dev+'.'+ring;const slice=new tr.model.ThreadSlice('',kthread.openSlice,ColorScheme.getColorIdForGeneralPurposeString(kthread.openSlice),ts,args,0);kthread.thread.sliceGroup.pushSlice(slice);},i915RegSlice(ts,eventName,reg,args){const kthread=this.importer.getOrCreatePseudoThread('i915_reg');kthread.openSlice=eventName+':'+reg;const slice=new tr.model.ThreadSlice('',kthread.openSlice,ColorScheme.getColorIdForGeneralPurposeString(kthread.openSlice),ts,args,0);kthread.thread.sliceGroup.pushSlice(slice);},i915FreqChangeSlice(ts,eventName,args){const kthread=this.importer.getOrCreatePseudoThread('i915_gpu_freq');kthread.openSlice=eventName;const slice=new tr.model.ThreadSlice('',kthread.openSlice,ColorScheme.getColorIdForGeneralPurposeString(kthread.openSlice),ts,args,0);kthread.thread.sliceGroup.pushSlice(slice);},gemObjectCreateEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/obj=(\w+), size=(\d+)/.exec(eventBase.details);if(!event)return false;const obj=event[1];const size=parseInt(event[2]);this.i915GemObjectSlice(ts,eventName,obj,{obj,size});return true;},gemObjectBindEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/obj=(\w+), offset=(\w+), size=(\d+)/.exec(eventBase.details);if(!event)return false;const obj=event[1];const offset=event[2];const size=parseInt(event[3]);this.i915ObjectGemSlice(ts,eventName+':'+obj,{obj,offset,size});return true;},gemObjectChangeDomainEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/obj=(\w+), read=(\w+=>\w+), write=(\w+=>\w+)/.exec(eventBase.details);if(!event)return false;const obj=event[1];const read=event[2];const write=event[3];this.i915GemObjectSlice(ts,eventName,obj,{obj,read,write});return true;},gemObjectPreadWriteEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/obj=(\w+), offset=(\d+), len=(\d+)/.exec(eventBase.details);if(!event)return false;const obj=event[1];const offset=parseInt(event[2]);const len=parseInt(event[3]);this.i915GemObjectSlice(ts,eventName,obj,{obj,offset,len});return true;},gemObjectFaultEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/obj=(\w+), (\w+) index=(\d+)/.exec(eventBase.details);if(!event)return false;const obj=event[1];const type=event[2];const index=parseInt(event[3]);this.i915GemObjectSlice(ts,eventName,obj,{obj,type,index});return true;},gemObjectDestroyEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/obj=(\w+)/.exec(eventBase.details);if(!event)return false;const obj=event[1];this.i915GemObjectSlice(ts,eventName,obj,{obj});return true;},gemRingDispatchEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/dev=(\d+), ring=(\d+), seqno=(\d+)/.exec(eventBase.details);if(!event)return false;const dev=parseInt(event[1]);const ring=parseInt(event[2]);const seqno=parseInt(event[3]);this.i915GemRingSlice(ts,eventName,dev,ring,{dev,ring,seqno});return true;},gemRingFlushEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/dev=(\d+), ring=(\w+), invalidate=(\w+), flush=(\w+)/.exec(eventBase.details);if(!event)return false;const dev=parseInt(event[1]);const ring=parseInt(event[2]);const invalidate=event[3];const flush=event[4];this.i915GemRingSlice(ts,eventName,dev,ring,{dev,ring,invalidate,flush});return true;},gemRequestEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/dev=(\d+), ring=(\d+), seqno=(\d+)/.exec(eventBase.details);if(!event)return false;const dev=parseInt(event[1]);const ring=parseInt(event[2]);const seqno=parseInt(event[3]);this.i915GemRingSlice(ts,eventName,dev,ring,{dev,ring,seqno});return true;},gemRingWaitEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/dev=(\d+), ring=(\d+)/.exec(eventBase.details);if(!event)return false;const dev=parseInt(event[1]);const ring=parseInt(event[2]);this.i915GemRingSlice(ts,eventName,dev,ring,{dev,ring});return true;},regRWEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/(\w+) reg=(\w+), len=(\d+), val=(\(\w+, \w+\))/.exec(eventBase.details);if(!event)return false;const rw=event[1];const reg=event[2];const len=event[3];const data=event[3];this.i915RegSlice(ts,rw,reg,{rw,reg,len,data});return true;},flipEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/plane=(\d+), obj=(\w+)/.exec(eventBase.details);if(!event)return false;const plane=parseInt(event[1]);const obj=event[2];if(eventName==='i915_flip_request'){this.i915FlipOpenSlice(ts,obj,plane);}else{this.i915FlipCloseSlice(ts,{obj,plane});}
+return true;},gpuFrequency(eventName,cpuNumver,pid,ts,eventBase){const event=/new_freq=(\d+)/.exec(eventBase.details);if(!event)return false;const freq=parseInt(event[1]);this.i915FreqChangeSlice(ts,eventName,{freq});return true;}};Parser.register(I915Parser);return{I915Parser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function IrqParser(importer){Parser.call(this,importer);importer.registerEventHandler('irq_handler_entry',IrqParser.prototype.irqHandlerEntryEvent.bind(this));importer.registerEventHandler('irq_handler_exit',IrqParser.prototype.irqHandlerExitEvent.bind(this));importer.registerEventHandler('softirq_raise',IrqParser.prototype.softirqRaiseEvent.bind(this));importer.registerEventHandler('softirq_entry',IrqParser.prototype.softirqEntryEvent.bind(this));importer.registerEventHandler('softirq_exit',IrqParser.prototype.softirqExitEvent.bind(this));importer.registerEventHandler('ipi_entry',IrqParser.prototype.ipiEntryEvent.bind(this));importer.registerEventHandler('ipi_exit',IrqParser.prototype.ipiExitEvent.bind(this));}
+const irqHandlerEntryRE=/irq=(\d+) name=(.+)/;const irqHandlerExitRE=/irq=(\d+) ret=(.+)/;const softirqRE=/vec=(\d+) \[action=(.+)\]/;const ipiHandlerExitRE=/\((.+)\)/;IrqParser.prototype={__proto__:Parser.prototype,irqHandlerEntryEvent(eventName,cpuNumber,pid,ts,eventBase){const event=irqHandlerEntryRE.exec(eventBase.details);if(!event)return false;const irq=parseInt(event[1]);const name=event[2];const thread=this.importer.getOrCreatePseudoThread('irqs cpu '+cpuNumber);thread.lastEntryTs=ts;thread.irqName=name;return true;},irqHandlerExitEvent(eventName,cpuNumber,pid,ts,eventBase){const event=irqHandlerExitRE.exec(eventBase.details);if(!event)return false;const irq=parseInt(event[1]);const ret=event[2];const thread=this.importer.getOrCreatePseudoThread('irqs cpu '+cpuNumber);if(thread.lastEntryTs!==undefined){const duration=ts-thread.lastEntryTs;const slice=new tr.model.ThreadSlice('','IRQ ('+thread.irqName+')',ColorScheme.getColorIdForGeneralPurposeString(event[1]),thread.lastEntryTs,{ret},duration);thread.thread.sliceGroup.pushSlice(slice);}
+thread.lastEntryTs=undefined;thread.irqName=undefined;return true;},softirqRaiseEvent(eventName,cpuNumber,pid,ts,eventBase){return true;},softirqEntryEvent(eventName,cpuNumber,pid,ts,eventBase){const event=softirqRE.exec(eventBase.details);if(!event)return false;const action=event[2];const thread=this.importer.getOrCreatePseudoThread('softirq cpu '+cpuNumber);thread.lastEntryTs=ts;return true;},softirqExitEvent(eventName,cpuNumber,pid,ts,eventBase){const event=softirqRE.exec(eventBase.details);if(!event)return false;const vec=parseInt(event[1]);const action=event[2];const thread=this.importer.getOrCreatePseudoThread('softirq cpu '+cpuNumber);if(thread.lastEntryTs!==undefined){const duration=ts-thread.lastEntryTs;const slice=new tr.model.ThreadSlice('',action,ColorScheme.getColorIdForGeneralPurposeString(event[1]),thread.lastEntryTs,{vec},duration);thread.thread.sliceGroup.pushSlice(slice);}
+thread.lastEntryTs=undefined;return true;},ipiEntryEvent(eventName,cpuNumber,pid,ts,eventBase){const thread=this.importer.getOrCreatePseudoThread('irqs cpu '+cpuNumber);thread.lastEntryTs=ts;return true;},ipiExitEvent(eventName,cpuNumber,pid,ts,eventBase){const event=ipiHandlerExitRE.exec(eventBase.details);if(!event)return false;const ipiName=event[1];const thread=this.importer.getOrCreatePseudoThread('irqs cpu '+cpuNumber);if(thread.lastEntryTs!==undefined){const duration=ts-thread.lastEntryTs;const slice=new tr.model.ThreadSlice('','IPI ('+ipiName+')',ColorScheme.getColorIdForGeneralPurposeString(ipiName),thread.lastEntryTs,{},duration);thread.thread.sliceGroup.pushSlice(slice);}
+thread.lastEntryTs=undefined;return true;}};Parser.register(IrqParser);return{IrqParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const LinuxPerfParser=tr.e.importer.linux_perf.Parser;function KernelFuncParser(importer){LinuxPerfParser.call(this,importer);importer.registerEventHandler('graph_ent',KernelFuncParser.prototype.traceKernelFuncEnterEvent.bind(this));importer.registerEventHandler('graph_ret',KernelFuncParser.prototype.traceKernelFuncReturnEvent.bind(this));this.model_=importer.model_;this.ppids_={};}
+const TestExports={};const funcEnterRE=new RegExp('func=(.+)');TestExports.funcEnterRE=funcEnterRE;KernelFuncParser.prototype={__proto__:LinuxPerfParser.prototype,traceKernelFuncEnterEvent(eventName,cpuNumber,pid,ts,eventBase){const eventData=funcEnterRE.exec(eventBase.details);if(!eventData)return false;if(eventBase.tgid===undefined){return false;}
+const tgid=parseInt(eventBase.tgid);const name=eventData[1];const thread=this.model_.getOrCreateProcess(tgid).getOrCreateThread(pid);thread.name=eventBase.threadName;const slices=thread.kernelSliceGroup;if(!slices.isTimestampValidForBeginOrEnd(ts)){this.model_.importWarning({type:'parse_error',message:'Timestamps are moving backward.'});return false;}
+const slice=slices.beginSlice(null,name,ts,{});return true;},traceKernelFuncReturnEvent(eventName,cpuNumber,pid,ts,eventBase){if(eventBase.tgid===undefined){return false;}
+const tgid=parseInt(eventBase.tgid);const thread=this.model_.getOrCreateProcess(tgid).getOrCreateThread(pid);thread.name=eventBase.threadName;const slices=thread.kernelSliceGroup;if(!slices.isTimestampValidForBeginOrEnd(ts)){this.model_.importWarning({type:'parse_error',message:'Timestamps are moving backward.'});return false;}
+if(slices.openSliceCount>0){slices.endSlice(ts);}
+return true;}};LinuxPerfParser.register(KernelFuncParser);return{KernelFuncParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function MaliParser(importer){Parser.call(this,importer);importer.registerEventHandler('mali_dvfs_event',MaliParser.prototype.dvfsEventEvent.bind(this));importer.registerEventHandler('mali_dvfs_set_clock',MaliParser.prototype.dvfsSetClockEvent.bind(this));importer.registerEventHandler('mali_dvfs_set_voltage',MaliParser.prototype.dvfsSetVoltageEvent.bind(this));this.addJMCounter('mali_hwc_MESSAGES_SENT','Messages Sent');this.addJMCounter('mali_hwc_MESSAGES_RECEIVED','Messages Received');this.addJMCycles('mali_hwc_GPU_ACTIVE','GPU Active');this.addJMCycles('mali_hwc_IRQ_ACTIVE','IRQ Active');for(let i=0;i<7;i++){const jobStr='JS'+i;const jobHWCStr='mali_hwc_'+jobStr;this.addJMCounter(jobHWCStr+'_JOBS',jobStr+' Jobs');this.addJMCounter(jobHWCStr+'_TASKS',jobStr+' Tasks');this.addJMCycles(jobHWCStr+'_ACTIVE',jobStr+' Active');this.addJMCycles(jobHWCStr+'_WAIT_READ',jobStr+' Wait Read');this.addJMCycles(jobHWCStr+'_WAIT_ISSUE',jobStr+' Wait Issue');this.addJMCycles(jobHWCStr+'_WAIT_DEPEND',jobStr+' Wait Depend');this.addJMCycles(jobHWCStr+'_WAIT_FINISH',jobStr+' Wait Finish');}
+this.addTilerCounter('mali_hwc_TRIANGLES','Triangles');this.addTilerCounter('mali_hwc_QUADS','Quads');this.addTilerCounter('mali_hwc_POLYGONS','Polygons');this.addTilerCounter('mali_hwc_POINTS','Points');this.addTilerCounter('mali_hwc_LINES','Lines');this.addTilerCounter('mali_hwc_VCACHE_HIT','VCache Hit');this.addTilerCounter('mali_hwc_VCACHE_MISS','VCache Miss');this.addTilerCounter('mali_hwc_FRONT_FACING','Front Facing');this.addTilerCounter('mali_hwc_BACK_FACING','Back Facing');this.addTilerCounter('mali_hwc_PRIM_VISIBLE','Prim Visible');this.addTilerCounter('mali_hwc_PRIM_CULLED','Prim Culled');this.addTilerCounter('mali_hwc_PRIM_CLIPPED','Prim Clipped');this.addTilerCounter('mali_hwc_WRBUF_HIT','Wrbuf Hit');this.addTilerCounter('mali_hwc_WRBUF_MISS','Wrbuf Miss');this.addTilerCounter('mali_hwc_WRBUF_LINE','Wrbuf Line');this.addTilerCounter('mali_hwc_WRBUF_PARTIAL','Wrbuf Partial');this.addTilerCounter('mali_hwc_WRBUF_STALL','Wrbuf Stall');this.addTilerCycles('mali_hwc_ACTIVE','Tiler Active');this.addTilerCycles('mali_hwc_INDEX_WAIT','Index Wait');this.addTilerCycles('mali_hwc_INDEX_RANGE_WAIT','Index Range Wait');this.addTilerCycles('mali_hwc_VERTEX_WAIT','Vertex Wait');this.addTilerCycles('mali_hwc_PCACHE_WAIT','Pcache Wait');this.addTilerCycles('mali_hwc_WRBUF_WAIT','Wrbuf Wait');this.addTilerCycles('mali_hwc_BUS_READ','Bus Read');this.addTilerCycles('mali_hwc_BUS_WRITE','Bus Write');this.addTilerCycles('mali_hwc_TILER_UTLB_STALL','Tiler UTLB Stall');this.addTilerCycles('mali_hwc_TILER_UTLB_HIT','Tiler UTLB Hit');this.addFragCycles('mali_hwc_FRAG_ACTIVE','Active');this.addFragCounter('mali_hwc_FRAG_PRIMATIVES','Primitives');this.addFragCounter('mali_hwc_FRAG_PRIMATIVES_DROPPED','Primitives Dropped');this.addFragCycles('mali_hwc_FRAG_CYCLE_DESC','Descriptor Processing');this.addFragCycles('mali_hwc_FRAG_CYCLES_PLR','PLR Processing??');this.addFragCycles('mali_hwc_FRAG_CYCLES_VERT','Vertex Processing');this.addFragCycles('mali_hwc_FRAG_CYCLES_TRISETUP','Triangle Setup');this.addFragCycles('mali_hwc_FRAG_CYCLES_RAST','Rasterization???');this.addFragCounter('mali_hwc_FRAG_THREADS','Threads');this.addFragCounter('mali_hwc_FRAG_DUMMY_THREADS','Dummy Threads');this.addFragCounter('mali_hwc_FRAG_QUADS_RAST','Quads Rast');this.addFragCounter('mali_hwc_FRAG_QUADS_EZS_TEST','Quads EZS Test');this.addFragCounter('mali_hwc_FRAG_QUADS_EZS_KILLED','Quads EZS Killed');this.addFragCounter('mali_hwc_FRAG_QUADS_LZS_TEST','Quads LZS Test');this.addFragCounter('mali_hwc_FRAG_QUADS_LZS_KILLED','Quads LZS Killed');this.addFragCycles('mali_hwc_FRAG_CYCLE_NO_TILE','No Tiles');this.addFragCounter('mali_hwc_FRAG_NUM_TILES','Tiles');this.addFragCounter('mali_hwc_FRAG_TRANS_ELIM','Transactions Eliminated');this.addComputeCycles('mali_hwc_COMPUTE_ACTIVE','Active');this.addComputeCounter('mali_hwc_COMPUTE_TASKS','Tasks');this.addComputeCounter('mali_hwc_COMPUTE_THREADS','Threads Started');this.addComputeCycles('mali_hwc_COMPUTE_CYCLES_DESC','Waiting for Descriptors');this.addTripipeCycles('mali_hwc_TRIPIPE_ACTIVE','Active');this.addArithCounter('mali_hwc_ARITH_WORDS','Instructions (/Pipes)');this.addArithCycles('mali_hwc_ARITH_CYCLES_REG','Reg scheduling stalls (/Pipes)');this.addArithCycles('mali_hwc_ARITH_CYCLES_L0','L0 cache miss stalls (/Pipes)');this.addArithCounter('mali_hwc_ARITH_FRAG_DEPEND','Frag dep check failures (/Pipes)');this.addLSCounter('mali_hwc_LS_WORDS','Instruction Words Completed');this.addLSCounter('mali_hwc_LS_ISSUES','Full Pipeline Issues');this.addLSCounter('mali_hwc_LS_RESTARTS','Restarts (unpairable insts)');this.addLSCounter('mali_hwc_LS_REISSUES_MISS','Pipeline reissue (cache miss/uTLB)');this.addLSCounter('mali_hwc_LS_REISSUES_VD','Pipeline reissue (varying data)');this.addLSCounter('mali_hwc_LS_REISSUE_ATTRIB_MISS','Pipeline reissue (attribute cache miss)');this.addLSCounter('mali_hwc_LS_REISSUE_NO_WB','Writeback not used');this.addTexCounter('mali_hwc_TEX_WORDS','Words');this.addTexCounter('mali_hwc_TEX_BUBBLES','Bubbles');this.addTexCounter('mali_hwc_TEX_WORDS_L0','Words L0');this.addTexCounter('mali_hwc_TEX_WORDS_DESC','Words Desc');this.addTexCounter('mali_hwc_TEX_THREADS','Threads');this.addTexCounter('mali_hwc_TEX_RECIRC_FMISS','Recirc due to Full Miss');this.addTexCounter('mali_hwc_TEX_RECIRC_DESC','Recirc due to Desc Miss');this.addTexCounter('mali_hwc_TEX_RECIRC_MULTI','Recirc due to Multipass');this.addTexCounter('mali_hwc_TEX_RECIRC_PMISS','Recirc due to Partial Cache Miss');this.addTexCounter('mali_hwc_TEX_RECIRC_CONF','Recirc due to Cache Conflict');this.addLSCCounter('mali_hwc_LSC_READ_HITS','Read Hits');this.addLSCCounter('mali_hwc_LSC_READ_MISSES','Read Misses');this.addLSCCounter('mali_hwc_LSC_WRITE_HITS','Write Hits');this.addLSCCounter('mali_hwc_LSC_WRITE_MISSES','Write Misses');this.addLSCCounter('mali_hwc_LSC_ATOMIC_HITS','Atomic Hits');this.addLSCCounter('mali_hwc_LSC_ATOMIC_MISSES','Atomic Misses');this.addLSCCounter('mali_hwc_LSC_LINE_FETCHES','Line Fetches');this.addLSCCounter('mali_hwc_LSC_DIRTY_LINE','Dirty Lines');this.addLSCCounter('mali_hwc_LSC_SNOOPS','Snoops');this.addAXICounter('mali_hwc_AXI_TLB_STALL','Address channel stall');this.addAXICounter('mali_hwc_AXI_TLB_MISS','Cache Miss');this.addAXICounter('mali_hwc_AXI_TLB_TRANSACTION','Transactions');this.addAXICounter('mali_hwc_LS_TLB_MISS','LS Cache Miss');this.addAXICounter('mali_hwc_LS_TLB_HIT','LS Cache Hit');this.addAXICounter('mali_hwc_AXI_BEATS_READ','Read Beats');this.addAXICounter('mali_hwc_AXI_BEATS_WRITE','Write Beats');this.addMMUCounter('mali_hwc_MMU_TABLE_WALK','Page Table Walks');this.addMMUCounter('mali_hwc_MMU_REPLAY_MISS','Cache Miss from Replay Buffer');this.addMMUCounter('mali_hwc_MMU_REPLAY_FULL','Replay Buffer Full');this.addMMUCounter('mali_hwc_MMU_NEW_MISS','Cache Miss on New Request');this.addMMUCounter('mali_hwc_MMU_HIT','Cache Hit');this.addMMUCycles('mali_hwc_UTLB_STALL','UTLB Stalled');this.addMMUCycles('mali_hwc_UTLB_REPLAY_MISS','UTLB Replay Miss');this.addMMUCycles('mali_hwc_UTLB_REPLAY_FULL','UTLB Replay Full');this.addMMUCycles('mali_hwc_UTLB_NEW_MISS','UTLB New Miss');this.addMMUCycles('mali_hwc_UTLB_HIT','UTLB Hit');this.addL2Counter('mali_hwc_L2_READ_BEATS','Read Beats');this.addL2Counter('mali_hwc_L2_WRITE_BEATS','Write Beats');this.addL2Counter('mali_hwc_L2_ANY_LOOKUP','Any Lookup');this.addL2Counter('mali_hwc_L2_READ_LOOKUP','Read Lookup');this.addL2Counter('mali_hwc_L2_SREAD_LOOKUP','Shareable Read Lookup');this.addL2Counter('mali_hwc_L2_READ_REPLAY','Read Replayed');this.addL2Counter('mali_hwc_L2_READ_SNOOP','Read Snoop');this.addL2Counter('mali_hwc_L2_READ_HIT','Read Cache Hit');this.addL2Counter('mali_hwc_L2_CLEAN_MISS','CleanUnique Miss');this.addL2Counter('mali_hwc_L2_WRITE_LOOKUP','Write Lookup');this.addL2Counter('mali_hwc_L2_SWRITE_LOOKUP','Shareable Write Lookup');this.addL2Counter('mali_hwc_L2_WRITE_REPLAY','Write Replayed');this.addL2Counter('mali_hwc_L2_WRITE_SNOOP','Write Snoop');this.addL2Counter('mali_hwc_L2_WRITE_HIT','Write Cache Hit');this.addL2Counter('mali_hwc_L2_EXT_READ_FULL','ExtRD with BIU Full');this.addL2Counter('mali_hwc_L2_EXT_READ_HALF','ExtRD with BIU >1/2 Full');this.addL2Counter('mali_hwc_L2_EXT_WRITE_FULL','ExtWR with BIU Full');this.addL2Counter('mali_hwc_L2_EXT_WRITE_HALF','ExtWR with BIU >1/2 Full');this.addL2Counter('mali_hwc_L2_EXT_READ','External Read (ExtRD)');this.addL2Counter('mali_hwc_L2_EXT_READ_LINE','ExtRD (linefill)');this.addL2Counter('mali_hwc_L2_EXT_WRITE','External Write (ExtWR)');this.addL2Counter('mali_hwc_L2_EXT_WRITE_LINE','ExtWR (linefill)');this.addL2Counter('mali_hwc_L2_EXT_WRITE_SMALL','ExtWR (burst size <64B)');this.addL2Counter('mali_hwc_L2_EXT_BARRIER','External Barrier');this.addL2Counter('mali_hwc_L2_EXT_AR_STALL','Address Read stalls');this.addL2Counter('mali_hwc_L2_EXT_R_BUF_FULL','Response Buffer full stalls');this.addL2Counter('mali_hwc_L2_EXT_RD_BUF_FULL','Read Data Buffer full stalls');this.addL2Counter('mali_hwc_L2_EXT_R_RAW','RAW hazard stalls');this.addL2Counter('mali_hwc_L2_EXT_W_STALL','Write Data stalls');this.addL2Counter('mali_hwc_L2_EXT_W_BUF_FULL','Write Data Buffer full');this.addL2Counter('mali_hwc_L2_EXT_R_W_HAZARD','WAW or WAR hazard stalls');this.addL2Counter('mali_hwc_L2_TAG_HAZARD','Tag hazard replays');this.addL2Cycles('mali_hwc_L2_SNOOP_FULL','Snoop buffer full');this.addL2Cycles('mali_hwc_L2_REPLAY_FULL','Replay buffer full');importer.registerEventHandler('tracing_mark_write:mali_driver',MaliParser.prototype.maliDDKEvent.bind(this));this.model_=importer.model_;}
+MaliParser.prototype={__proto__:Parser.prototype,maliDDKOpenSlice(pid,tid,ts,func,blockinfo){const thread=this.importer.model_.getOrCreateProcess(pid).getOrCreateThread(tid);const funcArgs=/^([\w\d_]*)(?:\(\))?:?\s*(.*)$/.exec(func);thread.sliceGroup.beginSlice('gpu-driver',funcArgs[1],ts,{'args':funcArgs[2],blockinfo});},maliDDKCloseSlice(pid,tid,ts,args,blockinfo){const thread=this.importer.model_.getOrCreateProcess(pid).getOrCreateThread(tid);if(!thread.sliceGroup.openSliceCount){return;}
+thread.sliceGroup.endSlice(ts);},autoDetectLineRE(line){const lineREWithThread=/^\s*\(([\w\-]*)\)\s*(\w+):\s*([\w\\\/\.\-]*@\d*):?\s*(.*)$/;if(lineREWithThread.test(line)){return lineREWithThread;}
+const lineRENoThread=/^s*()(\w+):\s*([\w\\\/.\-]*):?\s*(.*)$/;if(lineRENoThread.test(line)){return lineRENoThread;}
+return null;},lineRE:null,maliDDKEvent(eventName,cpuNumber,pid,ts,eventBase){if(this.lineRE===null){this.lineRE=this.autoDetectLineRE(eventBase.details);if(this.lineRE===null)return false;}
+const maliEvent=this.lineRE.exec(eventBase.details);const tid=(maliEvent[1]===''?'mali':maliEvent[1]);switch(maliEvent[2]){case'cros_trace_print_enter':this.maliDDKOpenSlice(pid,tid,ts,maliEvent[4],maliEvent[3]);break;case'cros_trace_print_exit':this.maliDDKCloseSlice(pid,tid,ts,[],maliEvent[3]);}
+return true;},dvfsSample(counterName,seriesName,ts,s){const value=parseInt(s);const counter=this.model_.kernel.getOrCreateCounter('DVFS',counterName);if(counter.numSeries===0){counter.addSeries(new tr.model.CounterSeries(seriesName,ColorScheme.getColorIdForGeneralPurposeString(counter.name)));}
+counter.series.forEach(function(series){series.addCounterSample(ts,value);});},dvfsEventEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/utilization=(\d+)/.exec(eventBase.details);if(!event)return false;this.dvfsSample('DVFS Utilization','utilization',ts,event[1]);return true;},dvfsSetClockEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/frequency=(\d+)/.exec(eventBase.details);if(!event)return false;this.dvfsSample('DVFS Frequency','frequency',ts,event[1]);return true;},dvfsSetVoltageEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/voltage=(\d+)/.exec(eventBase.details);if(!event)return false;this.dvfsSample('DVFS Voltage','voltage',ts,event[1]);return true;},hwcSample(cat,counterName,seriesName,ts,eventBase){const event=/val=(\d+)/.exec(eventBase.details);if(!event)return false;const value=parseInt(event[1]);const counter=this.model_.kernel.getOrCreateCounter(cat,counterName);if(counter.numSeries===0){counter.addSeries(new tr.model.CounterSeries(seriesName,ColorScheme.getColorIdForGeneralPurposeString(counter.name)));}
+counter.series.forEach(function(series){series.addCounterSample(ts,value);});return true;},jmSample(ctrName,seriesName,ts,eventBase){return this.hwcSample('mali:jm','JM: '+ctrName,seriesName,ts,eventBase);},addJMCounter(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.jmSample(hwcTitle,'count',ts,eventBase);}
+this.importer.registerEventHandler(hwcEventName,handler.bind(this));},addJMCycles(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.jmSample(hwcTitle,'cycles',ts,eventBase);}
+this.importer.registerEventHandler(hwcEventName,handler.bind(this));},tilerSample(ctrName,seriesName,ts,eventBase){return this.hwcSample('mali:tiler','Tiler: '+ctrName,seriesName,ts,eventBase);},addTilerCounter(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.tilerSample(hwcTitle,'count',ts,eventBase);}
+this.importer.registerEventHandler(hwcEventName,handler.bind(this));},addTilerCycles(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.tilerSample(hwcTitle,'cycles',ts,eventBase);}
+this.importer.registerEventHandler(hwcEventName,handler.bind(this));},fragSample(ctrName,seriesName,ts,eventBase){return this.hwcSample('mali:fragment','Fragment: '+ctrName,seriesName,ts,eventBase);},addFragCounter(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.fragSample(hwcTitle,'count',ts,eventBase);}
+this.importer.registerEventHandler(hwcEventName,handler.bind(this));},addFragCycles(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.fragSample(hwcTitle,'cycles',ts,eventBase);}
+this.importer.registerEventHandler(hwcEventName,handler.bind(this));},computeSample(ctrName,seriesName,ts,eventBase){return this.hwcSample('mali:compute','Compute: '+ctrName,seriesName,ts,eventBase);},addComputeCounter(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.computeSample(hwcTitle,'count',ts,eventBase);}
+this.importer.registerEventHandler(hwcEventName,handler.bind(this));},addComputeCycles(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.computeSample(hwcTitle,'cycles',ts,eventBase);}
+this.importer.registerEventHandler(hwcEventName,handler.bind(this));},addTripipeCycles(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.hwcSample('mali:shader','Tripipe: '+hwcTitle,'cycles',ts,eventBase);}
+this.importer.registerEventHandler(hwcEventName,handler.bind(this));},arithSample(ctrName,seriesName,ts,eventBase){return this.hwcSample('mali:arith','Arith: '+ctrName,seriesName,ts,eventBase);},addArithCounter(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.arithSample(hwcTitle,'count',ts,eventBase);}
+this.importer.registerEventHandler(hwcEventName,handler.bind(this));},addArithCycles(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.arithSample(hwcTitle,'cycles',ts,eventBase);}
+this.importer.registerEventHandler(hwcEventName,handler.bind(this));},addLSCounter(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.hwcSample('mali:ls','LS: '+hwcTitle,'count',ts,eventBase);}
+this.importer.registerEventHandler(hwcEventName,handler.bind(this));},textureSample(ctrName,seriesName,ts,eventBase){return this.hwcSample('mali:texture','Texture: '+ctrName,seriesName,ts,eventBase);},addTexCounter(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.textureSample(hwcTitle,'count',ts,eventBase);}
+this.importer.registerEventHandler(hwcEventName,handler.bind(this));},addLSCCounter(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.hwcSample('mali:lsc','LSC: '+hwcTitle,'count',ts,eventBase);}
+this.importer.registerEventHandler(hwcEventName,handler.bind(this));},addAXICounter(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.hwcSample('mali:axi','AXI: '+hwcTitle,'count',ts,eventBase);}
+this.importer.registerEventHandler(hwcEventName,handler.bind(this));},mmuSample(ctrName,seriesName,ts,eventBase){return this.hwcSample('mali:mmu','MMU: '+ctrName,seriesName,ts,eventBase);},addMMUCounter(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.mmuSample(hwcTitle,'count',ts,eventBase);}
+this.importer.registerEventHandler(hwcEventName,handler.bind(this));},addMMUCycles(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.mmuSample(hwcTitle,'cycles',ts,eventBase);}
+this.importer.registerEventHandler(hwcEventName,handler.bind(this));},l2Sample(ctrName,seriesName,ts,eventBase){return this.hwcSample('mali:l2','L2: '+ctrName,seriesName,ts,eventBase);},addL2Counter(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.l2Sample(hwcTitle,'count',ts,eventBase);}
+this.importer.registerEventHandler(hwcEventName,handler.bind(this));},addL2Cycles(hwcEventName,hwcTitle){function handler(eventName,cpuNumber,pid,ts,eventBase){return this.l2Sample(hwcTitle,'cycles',ts,eventBase);}
+this.importer.registerEventHandler(hwcEventName,handler.bind(this));}};Parser.register(MaliParser);return{MaliParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const Parser=tr.e.importer.linux_perf.Parser;function MemReclaimParser(importer){Parser.call(this,importer);importer.registerEventHandler('mm_vmscan_kswapd_wake',MemReclaimParser.prototype.kswapdWake.bind(this));importer.registerEventHandler('mm_vmscan_kswapd_sleep',MemReclaimParser.prototype.kswapdSleep.bind(this));importer.registerEventHandler('mm_vmscan_direct_reclaim_begin',MemReclaimParser.prototype.reclaimBegin.bind(this));importer.registerEventHandler('mm_vmscan_direct_reclaim_end',MemReclaimParser.prototype.reclaimEnd.bind(this));}
+const kswapdWakeRE=/nid=(\d+) order=(\d+)/;const kswapdSleepRE=/nid=(\d+)/;const reclaimBeginRE=/order=(\d+) may_writepage=\d+ gfp_flags=(.+)/;const reclaimEndRE=/nr_reclaimed=(\d+)/;MemReclaimParser.prototype={__proto__:Parser.prototype,kswapdWake(eventName,cpuNumber,pid,ts,eventBase){const event=kswapdWakeRE.exec(eventBase.details);if(!event)return false;const tgid=parseInt(eventBase.tgid);const nid=parseInt(event[1]);const order=parseInt(event[2]);const kthread=this.importer.getOrCreateKernelThread(eventBase.threadName,tgid,pid);if(kthread.openSliceTS){if(order>kthread.order){kthread.order=order;}}else{kthread.openSliceTS=ts;kthread.order=order;}
+return true;},kswapdSleep(eventName,cpuNumber,pid,ts,eventBase){const tgid=parseInt(eventBase.tgid);const kthread=this.importer.getOrCreateKernelThread(eventBase.threadName,tgid,pid);if(kthread.openSliceTS){kthread.thread.sliceGroup.pushCompleteSlice('memreclaim',eventBase.threadName,kthread.openSliceTS,ts-kthread.openSliceTS,0,0,{order:kthread.order});}
+kthread.openSliceTS=undefined;kthread.order=undefined;return true;},reclaimBegin(eventName,cpuNumber,pid,ts,eventBase){const event=reclaimBeginRE.exec(eventBase.details);if(!event)return false;const order=parseInt(event[1]);const gfp=event[2];const tgid=parseInt(eventBase.tgid);const kthread=this.importer.getOrCreateKernelThread(eventBase.threadName,tgid,pid);kthread.openSliceTS=ts;kthread.order=order;kthread.gfp=gfp;return true;},reclaimEnd(eventName,cpuNumber,pid,ts,eventBase){const event=reclaimEndRE.exec(eventBase.details);if(!event)return false;const nrReclaimed=parseInt(event[1]);const tgid=parseInt(eventBase.tgid);const kthread=this.importer.getOrCreateKernelThread(eventBase.threadName,tgid,pid);if(kthread.openSliceTS!==undefined){kthread.thread.sliceGroup.pushCompleteSlice('memreclaim','direct reclaim',kthread.openSliceTS,ts-kthread.openSliceTS,0,0,{order:kthread.order,gfp:kthread.gfp,nr_reclaimed:nrReclaimed});}
+kthread.openSliceTS=undefined;kthread.order=undefined;kthread.gfp=undefined;return true;}};Parser.register(MemReclaimParser);return{MemReclaimParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function PowerParser(importer){Parser.call(this,importer);importer.registerEventHandler('power_start',PowerParser.prototype.powerStartEvent.bind(this));importer.registerEventHandler('power_frequency',PowerParser.prototype.powerFrequencyEvent.bind(this));importer.registerEventHandler('cpu_frequency',PowerParser.prototype.cpuFrequencyEvent.bind(this));importer.registerEventHandler('cpu_frequency_limits',PowerParser.prototype.cpuFrequencyLimitsEvent.bind(this));importer.registerEventHandler('cpu_idle',PowerParser.prototype.cpuIdleEvent.bind(this));}
+PowerParser.prototype={__proto__:Parser.prototype,cpuStateSlice(ts,targetCpuNumber,eventType,cpuState){const targetCpu=this.importer.getOrCreateCpu(targetCpuNumber);if(eventType!=='1'){this.importer.model.importWarning({type:'parse_error',message:'Don\'t understand power_start events of '+'type '+eventType});return;}
+const powerCounter=targetCpu.getOrCreateCounter('','C-State');if(powerCounter.numSeries===0){powerCounter.addSeries(new tr.model.CounterSeries('state',ColorScheme.getColorIdForGeneralPurposeString(powerCounter.name+'.'+'state')));}
+powerCounter.series.forEach(function(series){series.addCounterSample(ts,cpuState);});},cpuIdleSlice(ts,targetCpuNumber,cpuState){const targetCpu=this.importer.getOrCreateCpu(targetCpuNumber);const powerCounter=targetCpu.getOrCreateCounter('','C-State');if(powerCounter.numSeries===0){powerCounter.addSeries(new tr.model.CounterSeries('state',ColorScheme.getColorIdForGeneralPurposeString(powerCounter.name)));}
+const val=(cpuState!==4294967295?cpuState+1:0);powerCounter.series.forEach(function(series){series.addCounterSample(ts,val);});},cpuFrequencySlice(ts,targetCpuNumber,powerState){const targetCpu=this.importer.getOrCreateCpu(targetCpuNumber);const powerCounter=targetCpu.getOrCreateCounter('','Clock Frequency');if(powerCounter.numSeries===0){powerCounter.addSeries(new tr.model.CounterSeries('state',ColorScheme.getColorIdForGeneralPurposeString(powerCounter.name+'.'+'state')));}
+powerCounter.series.forEach(function(series){series.addCounterSample(ts,powerState);});},cpuFrequencyLimitsSlice(ts,targetCpuNumber,minFreq,maxFreq){const targetCpu=this.importer.getOrCreateCpu(targetCpuNumber);const powerCounter=targetCpu.getOrCreateCounter('','Clock Frequency Limits');if(powerCounter.numSeries===0){powerCounter.addSeries(new tr.model.CounterSeries('Min Frequency',ColorScheme.getColorIdForGeneralPurposeString(powerCounter.name+'.'+'Min Frequency')));powerCounter.addSeries(new tr.model.CounterSeries('Max Frequency',ColorScheme.getColorIdForGeneralPurposeString(powerCounter.name+'.'+'Max Frequency')));}
+powerCounter.series.forEach(function(series){if(series.name==='Min Frequency'){series.addCounterSample(ts,minFreq);}
+if(series.name==='Max Frequency'){series.addCounterSample(ts,maxFreq);}});},powerStartEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/type=(\d+) state=(\d) cpu_id=(\d+)/.exec(eventBase.details);if(!event)return false;const targetCpuNumber=parseInt(event[3]);const cpuState=parseInt(event[2]);this.cpuStateSlice(ts,targetCpuNumber,event[1],cpuState);return true;},powerFrequencyEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/type=(\d+) state=(\d+) cpu_id=(\d+)/.exec(eventBase.details);if(!event)return false;const targetCpuNumber=parseInt(event[3]);const powerState=parseInt(event[2]);this.cpuFrequencySlice(ts,targetCpuNumber,powerState);return true;},cpuFrequencyEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/state=(\d+) cpu_id=(\d+)/.exec(eventBase.details);if(!event)return false;const targetCpuNumber=parseInt(event[2]);const powerState=parseInt(event[1]);this.cpuFrequencySlice(ts,targetCpuNumber,powerState);return true;},cpuFrequencyLimitsEvent(eventName,cpu,pid,ts,eventBase){const event=/min=(\d+) max=(\d+) cpu_id=(\d+)/.exec(eventBase.details);if(!event)return false;const targetCpuNumber=parseInt(event[3]);const minFreq=parseInt(event[1]);const maxFreq=parseInt(event[2]);this.cpuFrequencyLimitsSlice(ts,targetCpuNumber,minFreq,maxFreq);return true;},cpuIdleEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/state=(\d+) cpu_id=(\d+)/.exec(eventBase.details);if(!event)return false;const targetCpuNumber=parseInt(event[2]);const cpuState=parseInt(event[1]);this.cpuIdleSlice(ts,targetCpuNumber,cpuState);return true;}};Parser.register(PowerParser);return{PowerParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function RegulatorParser(importer){Parser.call(this,importer);importer.registerEventHandler('regulator_enable',RegulatorParser.prototype.regulatorEnableEvent.bind(this));importer.registerEventHandler('regulator_enable_delay',RegulatorParser.prototype.regulatorEnableDelayEvent.bind(this));importer.registerEventHandler('regulator_enable_complete',RegulatorParser.prototype.regulatorEnableCompleteEvent.bind(this));importer.registerEventHandler('regulator_disable',RegulatorParser.prototype.regulatorDisableEvent.bind(this));importer.registerEventHandler('regulator_disable_complete',RegulatorParser.prototype.regulatorDisableCompleteEvent.bind(this));importer.registerEventHandler('regulator_set_voltage',RegulatorParser.prototype.regulatorSetVoltageEvent.bind(this));importer.registerEventHandler('regulator_set_voltage_complete',RegulatorParser.prototype.regulatorSetVoltageCompleteEvent.bind(this));this.model_=importer.model_;}
+const regulatorEnableRE=/name=(.+)/;const regulatorDisableRE=/name=(.+)/;const regulatorSetVoltageCompleteRE=/name=(\S+), val=(\d+)/;RegulatorParser.prototype={__proto__:Parser.prototype,getCtr_(ctrName,valueName){const ctr=this.model_.kernel.getOrCreateCounter(null,'vreg '+ctrName+' '+valueName);if(ctr.series[0]===undefined){ctr.addSeries(new tr.model.CounterSeries(valueName,ColorScheme.getColorIdForGeneralPurposeString(ctrName+'.'+valueName)));}
+return ctr;},regulatorEnableEvent(eventName,cpuNum,pid,ts,eventBase){const event=regulatorEnableRE.exec(eventBase.details);if(!event)return false;const name=event[1];const ctr=this.getCtr_(name,'enabled');ctr.series[0].addCounterSample(ts,1);return true;},regulatorEnableDelayEvent(eventName,cpuNum,pid,ts,eventBase){return true;},regulatorEnableCompleteEvent(eventName,cpuNum,pid,ts,eventBase){return true;},regulatorDisableEvent(eventName,cpuNum,pid,ts,eventBase){const event=regulatorDisableRE.exec(eventBase.details);if(!event)return false;const name=event[1];const ctr=this.getCtr_(name,'enabled');ctr.series[0].addCounterSample(ts,0);return true;},regulatorDisableCompleteEvent(eventName,cpuNum,pid,ts,eventBase){return true;},regulatorSetVoltageEvent(eventName,cpuNum,pid,ts,eventBase){return true;},regulatorSetVoltageCompleteEvent(eventName,cpuNum,pid,ts,eventBase){const event=regulatorSetVoltageCompleteRE.exec(eventBase.details);if(!event)return false;const name=event[1];const voltage=parseInt(event[2]);const ctr=this.getCtr_(name,'voltage');ctr.series[0].addCounterSample(ts,voltage);return true;}};Parser.register(RegulatorParser);return{RegulatorParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const Parser=tr.e.importer.linux_perf.Parser;function SchedParser(importer){Parser.call(this,importer);importer.registerEventHandler('sched_switch',SchedParser.prototype.schedSwitchEvent.bind(this));importer.registerEventHandler('sched_wakeup',SchedParser.prototype.schedWakeupEvent.bind(this));importer.registerEventHandler('sched_blocked_reason',SchedParser.prototype.schedBlockedEvent.bind(this));importer.registerEventHandler('sched_cpu_hotplug',SchedParser.prototype.schedCpuHotplugEvent.bind(this));}
+const TestExports={};const schedSwitchRE=new RegExp('prev_comm=(.+) prev_pid=(\\d+) prev_prio=(\\d+) '+'prev_state=(\\S\\+?|\\S\\|\\S) ==> '+'next_comm=(.+) next_pid=(\\d+) next_prio=(\\d+)');const schedBlockedRE=new RegExp('pid=(\\d+) iowait=(\\d) caller=(.+)');TestExports.schedSwitchRE=schedSwitchRE;const schedWakeupRE=/comm=(.+) pid=(\d+) prio=(\d+)(?: success=\d+)? target_cpu=(\d+)/;TestExports.schedWakeupRE=schedWakeupRE;SchedParser.prototype={__proto__:Parser.prototype,schedSwitchEvent(eventName,cpuNumber,pid,ts,eventBase){const event=schedSwitchRE.exec(eventBase.details);if(!event)return false;const prevState=event[4];const nextComm=event[5];const nextPid=parseInt(event[6]);const nextPrio=parseInt(event[7]);if(eventBase.tgid!==undefined){const tgid=parseInt(eventBase.tgid);const process=this.importer.model_.getOrCreateProcess(tgid);if(!process.getThread(pid)){const thread=process.getOrCreateThread(pid);thread.name=eventBase.threadName;}}
+const nextThread=this.importer.threadsByLinuxPid[nextPid];let nextName;if(nextThread){nextName=nextThread.userFriendlyName;}else{nextName=nextComm;}
+const cpu=this.importer.getOrCreateCpu(cpuNumber);cpu.switchActiveThread(ts,{stateWhenDescheduled:prevState},nextPid,nextName,{comm:nextComm,tid:nextPid,prio:nextPrio});return true;},schedWakeupEvent(eventName,cpuNumber,pid,ts,eventBase){const event=schedWakeupRE.exec(eventBase.details);if(!event)return false;const fromPid=pid;const comm=event[1];pid=parseInt(event[2]);const prio=parseInt(event[3]);this.importer.markPidRunnable(ts,pid,comm,prio,fromPid);return true;},schedCpuHotplugEvent(eventName,cpuNumber,pid,ts,eventBase){const event=/cpu (\d+) (.+) error=(\d+)/.exec(eventBase.details);if(!event)return false;cpuNumber=event[1];const state=event[2];const targetCpu=this.importer.getOrCreateCpu(cpuNumber);const powerCounter=targetCpu.getOrCreateCounter('','Cpu Hotplug');if(powerCounter.numSeries===0){powerCounter.addSeries(new tr.model.CounterSeries('State',tr.b.ColorScheme.getColorIdForGeneralPurposeString(powerCounter.name+'.'+'State')));}
+powerCounter.series.forEach(function(series){if(series.name==='State'){series.addCounterSample(ts,state.localeCompare('offline')?0:1);}});return true;},schedBlockedEvent(eventName,cpuNumber,pid,ts,eventBase){const event=schedBlockedRE.exec(eventBase.details);if(!event)return false;pid=parseInt(event[1]);const iowait=parseInt(event[2]);const caller=event[3];this.importer.addPidBlockedReason(ts,pid,iowait,caller);return true;}};Parser.register(SchedParser);return{SchedParser,_SchedParserTestExports:TestExports};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function SyncParser(importer){Parser.call(this,importer);importer.registerEventHandler('sync_timeline',SyncParser.prototype.timelineEvent.bind(this));importer.registerEventHandler('sync_wait',SyncParser.prototype.syncWaitEvent.bind(this));importer.registerEventHandler('sync_pt',SyncParser.prototype.syncPtEvent.bind(this));this.model_=importer.model_;}
+const syncTimelineRE=/name=(\S+) value=(\S*)/;const syncWaitRE=/(\S+) name=(\S+) state=(\d+)/;const syncPtRE=/name=(\S+) value=(\S*)/;SyncParser.prototype={__proto__:Parser.prototype,timelineEvent(eventName,cpuNumber,pid,ts,eventBase){const event=syncTimelineRE.exec(eventBase.details);if(!event)return false;const thread=this.importer.getOrCreatePseudoThread(event[1]);if(thread.lastActiveTs!==undefined){const duration=ts-thread.lastActiveTs;let value=thread.lastActiveValue;if(value===undefined)value=' ';const slice=new tr.model.ThreadSlice('',value,ColorScheme.getColorIdForGeneralPurposeString(value),thread.lastActiveTs,{},duration);thread.thread.sliceGroup.pushSlice(slice);}
+thread.lastActiveTs=ts;thread.lastActiveValue=event[2];return true;},syncWaitEvent(eventName,cpuNumber,pid,ts,eventBase){const event=syncWaitRE.exec(eventBase.details);if(!event)return false;if(eventBase.tgid===undefined){return false;}
+const tgid=parseInt(eventBase.tgid);const thread=this.model_.getOrCreateProcess(tgid).getOrCreateThread(pid);thread.name=eventBase.threadName;const slices=thread.kernelSliceGroup;if(!slices.isTimestampValidForBeginOrEnd(ts)){this.model_.importWarning({type:'parse_error',message:'Timestamps are moving backward.'});return false;}
+const name='fence_wait("'+event[2]+'")';if(event[1]==='begin'){const slice=slices.beginSlice(null,name,ts,{'Start state':event[3]});}else if(event[1]==='end'){if(slices.openSliceCount>0){slices.endSlice(ts);}}else{return false;}
+return true;},syncPtEvent(eventName,cpuNumber,pid,ts,eventBase){return!!syncPtRE.exec(eventBase.details);}};Parser.register(SyncParser);return{SyncParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const ColorScheme=tr.b.ColorScheme;const Parser=tr.e.importer.linux_perf.Parser;function WorkqueueParser(importer){Parser.call(this,importer);importer.registerEventHandler('workqueue_execute_start',WorkqueueParser.prototype.executeStartEvent.bind(this));importer.registerEventHandler('workqueue_execute_end',WorkqueueParser.prototype.executeEndEvent.bind(this));importer.registerEventHandler('workqueue_queue_work',WorkqueueParser.prototype.executeQueueWork.bind(this));importer.registerEventHandler('workqueue_activate_work',WorkqueueParser.prototype.executeActivateWork.bind(this));}
+const workqueueExecuteStartRE=/work struct (.+): function (\S+)/;const workqueueExecuteEndRE=/work struct (.+)/;WorkqueueParser.prototype={__proto__:Parser.prototype,executeStartEvent(eventName,cpuNumber,pid,ts,eventBase){const event=workqueueExecuteStartRE.exec(eventBase.details);if(!event)return false;const kthread=this.importer.getOrCreateKernelThread(eventBase.threadName,pid,pid);kthread.openSliceTS=ts;kthread.openSlice=event[2];return true;},executeEndEvent(eventName,cpuNumber,pid,ts,eventBase){const event=workqueueExecuteEndRE.exec(eventBase.details);if(!event)return false;const kthread=this.importer.getOrCreateKernelThread(eventBase.threadName,pid,pid);if(kthread.openSlice){const slice=new tr.model.ThreadSlice('',kthread.openSlice,ColorScheme.getColorIdForGeneralPurposeString(kthread.openSlice),kthread.openSliceTS,{},ts-kthread.openSliceTS);kthread.thread.sliceGroup.pushSlice(slice);}
+kthread.openSlice=undefined;return true;},executeQueueWork(eventName,cpuNumber,pid,ts,eventBase){return true;},executeActivateWork(eventName,cpuNumber,pid,ts,eventBase){return true;}};Parser.register(WorkqueueParser);return{WorkqueueParser,};});'use strict';tr.exportTo('tr.e.importer.linux_perf',function(){const MONOTONIC_TO_FTRACE_GLOBAL_SYNC_ID='linux_clock_monotonic_to_ftrace_global';function FTraceImporter(model,events){this.importPriority=2;this.model_=model;this.events_=events;this.wakeups_=[];this.blockedReasons_=[];this.kernelThreadStates_={};this.buildMapFromLinuxPidsToThreads_();this.lines_=[];this.pseudoThreadCounter=1;this.parsers_=[];this.eventHandlers_={};this.haveClockSyncedMonotonicToGlobal_=false;this.clockDomainId_=tr.model.ClockDomainId.LINUX_FTRACE_GLOBAL;}
+const TestExports={};const lineREWithTGID=new RegExp('^\\s*(.+)-(\\d+)\\s+\\(\\s*(\\d+|-+)\\)\\s\\[(\\d+)\\]'+'\\s+[dX.][Nnp.][Hhs.][0-9a-f.]'+'\\s+(\\d+\\.\\d+):\\s+(\\S+):\\s(.*)$');const lineParserWithTGID=function(line){const groups=lineREWithTGID.exec(line);if(!groups)return groups;let tgid=groups[3];if(tgid[0]==='-')tgid=undefined;return{threadName:groups[1],pid:groups[2],tgid,cpuNumber:groups[4],timestamp:groups[5],eventName:groups[6],details:groups[7]};};TestExports.lineParserWithTGID=lineParserWithTGID;const lineREWithIRQInfo=new RegExp('^\\s*(.+)-(\\d+)\\s+\\[(\\d+)\\]'+'\\s+[dX.][Nnp.][Hhs.][0-9a-f.]'+'\\s+(\\d+\\.\\d+):\\s+(\\S+):\\s(.*)$');const lineParserWithIRQInfo=function(line){const groups=lineREWithIRQInfo.exec(line);if(!groups)return groups;return{threadName:groups[1],pid:groups[2],cpuNumber:groups[3],timestamp:groups[4],eventName:groups[5],details:groups[6]};};TestExports.lineParserWithIRQInfo=lineParserWithIRQInfo;const lineREWithLegacyFmt=/^\s*(.+)-(\d+)\s+\[(\d+)\]\s*(\d+\.\d+):\s+(\S+):\s(.*)$/;const lineParserWithLegacyFmt=function(line){const groups=lineREWithLegacyFmt.exec(line);if(!groups){return groups;}
+return{threadName:groups[1],pid:groups[2],cpuNumber:groups[3],timestamp:groups[4],eventName:groups[5],details:groups[6]};};TestExports.lineParserWithLegacyFmt=lineParserWithLegacyFmt;const traceEventClockSyncRE=/trace_event_clock_sync: parent_ts=(\d+\.?\d*)/;TestExports.traceEventClockSyncRE=traceEventClockSyncRE;const realTimeClockSyncRE=/trace_event_clock_sync: realtime_ts=(\d+)/;const genericClockSyncRE=/trace_event_clock_sync: name=([\w\-]+)/;const pseudoKernelPID=0;function autoDetectLineParser(line){if(line[0]==='{')return false;if(lineREWithTGID.test(line))return lineParserWithTGID;if(lineREWithIRQInfo.test(line))return lineParserWithIRQInfo;if(lineREWithLegacyFmt.test(line))return lineParserWithLegacyFmt;return undefined;}
+TestExports.autoDetectLineParser=autoDetectLineParser;FTraceImporter.canImport=function(events){if(events instanceof tr.b.TraceStream)events=events.header;if(!(typeof(events)==='string'||events instanceof String)){return false;}
+if(FTraceImporter._extractEventsFromSystraceHTML(events,false).ok){return true;}
+if(FTraceImporter._extractEventsFromSystraceMultiHTML(events,false).ok){return true;}
+if(/^# tracer:/.test(events))return true;const lineBreakIndex=events.indexOf('\n');if(lineBreakIndex>-1)events=events.substring(0,lineBreakIndex);if(autoDetectLineParser(events))return true;return false;};FTraceImporter._extractEventsFromSystraceHTML=function(incomingEvents,produceResult){const failure={ok:false};if(produceResult===undefined)produceResult=true;const header=incomingEvents instanceof tr.b.TraceStream?incomingEvents.header:incomingEvents;if(!/^<!DOCTYPE html>/.test(header))return failure;const r=new tr.importer.SimpleLineReader(incomingEvents);if(!r.advanceToLineMatching(/^ <script>$/))return failure;if(!r.advanceToLineMatching(/^ var linuxPerfData = "\\$/))return failure;const eventsBeginAtLine=r.curLineNumber+1;r.beginSavingLines();if(!r.advanceToLineMatching(/^ <\/script>$/))return failure;let rawEvents=r.endSavingLinesAndGetResult();rawEvents=rawEvents.slice(1,rawEvents.length-1);if(!r.advanceToLineMatching(/^<\/body>$/))return failure;if(!r.advanceToLineMatching(/^<\/html>$/))return failure;function endsWith(str,suffix){return str.indexOf(suffix,str.length-suffix.length)!==-1;}
+function stripSuffix(str,suffix){if(!endsWith(str,suffix))return str;return str.substring(str,str.length-suffix.length);}
+let events=[];if(produceResult){for(let i=0;i<rawEvents.length;i++){let event=rawEvents[i];event=stripSuffix(event,'\\n\\');events.push(event);}}else{events=[rawEvents[rawEvents.length-1]];}
+const oldLastEvent=events[events.length-1];const newLastEvent=stripSuffix(oldLastEvent,'\\n";');if(newLastEvent===oldLastEvent)return failure;events[events.length-1]=newLastEvent;return{ok:true,lines:produceResult?events:undefined,eventsBeginAtLine};};FTraceImporter._extractEventsFromSystraceMultiHTML=function(incomingEvents,produceResult){const failure={ok:false};if(produceResult===undefined)produceResult=true;const header=incomingEvents instanceof tr.b.TraceStream?incomingEvents.header:incomingEvents;if(!(new RegExp('^<!DOCTYPE HTML>','i').test(header)))return failure;const r=new tr.importer.SimpleLineReader(incomingEvents);let events=[];let eventsBeginAtLine;while(!/^# tracer:/.test(events)){if(!r.advanceToLineMatching(/^ <script class="trace-data" type="application\/text">$/)){return failure;}
+eventsBeginAtLine=r.curLineNumber+1;r.beginSavingLines();if(!r.advanceToLineMatching(/^ <\/script>$/))return failure;events=r.endSavingLinesAndGetResult();events=events.slice(1,events.length-1);}
+if(!r.advanceToLineMatching(/^<\/body>$/))return failure;if(!r.advanceToLineMatching(/^<\/html>$/))return failure;return{ok:true,lines:produceResult?events:undefined,eventsBeginAtLine,};};FTraceImporter.prototype={__proto__:tr.importer.Importer.prototype,get importerName(){return'FTraceImporter';},get model(){return this.model_;},importClockSyncMarkers(){this.lazyInit_();this.forEachLine_(function(text,eventBase,cpuNumber,pid,ts){const eventName=eventBase.eventName;if(eventName!=='tracing_mark_write'&&eventName!=='0')return;if(traceEventClockSyncRE.exec(eventBase.details)||genericClockSyncRE.exec(eventBase.details)){this.traceClockSyncEvent_(eventName,cpuNumber,pid,ts,eventBase);}else if(realTimeClockSyncRE.exec(eventBase.details)){const match=realTimeClockSyncRE.exec(eventBase.details);this.model_.realtime_to_monotonic_offset_ms=ts-match[1];}}.bind(this));},importEvents(){const modelTimeTransformer=this.model_.clockSyncManager.getModelTimeTransformer(this.clockDomainId_);this.importCpuData_(modelTimeTransformer);this.buildMapFromLinuxPidsToThreads_();this.buildPerThreadCpuSlicesFromCpuState_();},registerEventHandler(eventName,handler){this.eventHandlers_[eventName]=handler;},getOrCreateCpu(cpuNumber){return this.model_.kernel.getOrCreateCpu(cpuNumber);},getOrCreateKernelThread(kernelThreadName,pid,tid){if(!this.kernelThreadStates_[kernelThreadName]){const thread=this.model_.getOrCreateProcess(pid).getOrCreateThread(tid);thread.name=kernelThreadName;this.kernelThreadStates_[kernelThreadName]={pid,thread,openSlice:undefined,openSliceTS:undefined};this.threadsByLinuxPid[pid]=thread;}
+return this.kernelThreadStates_[kernelThreadName];},getOrCreateBinderKernelThread(kernelThreadName,pid,tid){const key=kernelThreadName+pid+tid;if(!this.kernelThreadStates_[key]){const thread=this.model_.getOrCreateProcess(pid).getOrCreateThread(tid);thread.name=kernelThreadName;this.kernelThreadStates_[key]={pid,thread,openSlice:undefined,openSliceTS:undefined};this.threadsByLinuxPid[pid]=thread;}
+return this.kernelThreadStates_[key];},getOrCreatePseudoThread(threadName){let thread=this.kernelThreadStates_[threadName];if(!thread){thread=this.getOrCreateKernelThread(threadName,pseudoKernelPID,this.pseudoThreadCounter);this.pseudoThreadCounter++;}
+return thread;},markPidRunnable(ts,pid,comm,prio,fromPid){this.wakeups_.push({ts,tid:pid,fromTid:fromPid});},addPidBlockedReason(ts,pid,iowait,caller){this.blockedReasons_.push({ts,tid:pid,iowait,caller});},buildMapFromLinuxPidsToThreads_(){this.threadsByLinuxPid={};this.model_.getAllThreads().forEach(function(thread){this.threadsByLinuxPid[thread.tid]=thread;}.bind(this));},buildPerThreadCpuSlicesFromCpuState_(){const SCHEDULING_STATE=tr.model.SCHEDULING_STATE;for(const cpuNumber in this.model_.kernel.cpus){const cpu=this.model_.kernel.cpus[cpuNumber];for(let i=0;i<cpu.slices.length;i++){const cpuSlice=cpu.slices[i];const thread=this.threadsByLinuxPid[cpuSlice.args.tid];if(!thread)continue;cpuSlice.threadThatWasRunning=thread;if(!thread.tempCpuSlices){thread.tempCpuSlices=[];}
+thread.tempCpuSlices.push(cpuSlice);}}
+for(const i in this.wakeups_){const wakeup=this.wakeups_[i];const thread=this.threadsByLinuxPid[wakeup.tid];if(!thread)continue;thread.tempWakeups=thread.tempWakeups||[];thread.tempWakeups.push(wakeup);}
+for(const i in this.blockedReasons_){const reason=this.blockedReasons_[i];const thread=this.threadsByLinuxPid[reason.tid];if(!thread)continue;thread.tempBlockedReasons=thread.tempBlockedReasons||[];thread.tempBlockedReasons.push(reason);}
+this.model_.getAllThreads().forEach(function(thread){if(thread.tempCpuSlices===undefined)return;const origSlices=thread.tempCpuSlices;delete thread.tempCpuSlices;origSlices.sort(function(x,y){return x.start-y.start;});const wakeups=thread.tempWakeups||[];delete thread.tempWakeups;wakeups.sort(function(x,y){return x.ts-y.ts;});const reasons=thread.tempBlockedReasons||[];delete thread.tempBlockedReasons;reasons.sort(function(x,y){return x.ts-y.ts;});const slices=[];if(origSlices.length){const slice=origSlices[0];if(wakeups.length&&wakeups[0].ts<slice.start){const wakeup=wakeups.shift();const wakeupDuration=slice.start-wakeup.ts;const args={'wakeup from tid':wakeup.fromTid};slices.push(new tr.model.ThreadTimeSlice(thread,SCHEDULING_STATE.RUNNABLE,'',wakeup.ts,args,wakeupDuration));}
+const runningSlice=new tr.model.ThreadTimeSlice(thread,SCHEDULING_STATE.RUNNING,'',slice.start,{},slice.duration);runningSlice.cpuOnWhichThreadWasRunning=slice.cpu;slices.push(runningSlice);}
+let wakeup=undefined;for(let i=1;i<origSlices.length;i++){const prevSlice=origSlices[i-1];const nextSlice=origSlices[i];let midDuration=nextSlice.start-prevSlice.end;while(wakeups.length&&wakeups[0].ts<nextSlice.start){const w=wakeups.shift();if(wakeup===undefined&&w.ts>prevSlice.end){wakeup=w;}}
+let blockedReason=undefined;while(reasons.length&&reasons[0].ts<prevSlice.end){const r=reasons.shift();}
+if(wakeup!==undefined&&reasons.length&&reasons[0].ts<wakeup.ts){blockedReason=reasons.shift();}
+const pushSleep=function(state){if(wakeup!==undefined){midDuration=wakeup.ts-prevSlice.end;}
+if(blockedReason!==undefined){const args={'kernel callsite when blocked:':blockedReason.caller};if(blockedReason.iowait){switch(state){case SCHEDULING_STATE.UNINTR_SLEEP:state=SCHEDULING_STATE.UNINTR_SLEEP_IO;break;case SCHEDULING_STATE.UNINTR_SLEEP_WAKE_KILL:state=SCHEDULING_STATE.UNINTR_SLEEP_WAKE_KILL_IO;break;case SCHEDULING_STATE.UNINTR_SLEEP_WAKING:state=SCHEDULING_STATE.UNINTR_SLEEP_WAKE_KILL_IO;break;default:}}
+slices.push(new tr.model.ThreadTimeSlice(thread,state,'',prevSlice.end,args,midDuration));}else{slices.push(new tr.model.ThreadTimeSlice(thread,state,'',prevSlice.end,{},midDuration));}
+if(wakeup!==undefined){const wakeupDuration=nextSlice.start-wakeup.ts;const args={'wakeup from tid':wakeup.fromTid};slices.push(new tr.model.ThreadTimeSlice(thread,SCHEDULING_STATE.RUNNABLE,'',wakeup.ts,args,wakeupDuration));wakeup=undefined;}};if(prevSlice.args.stateWhenDescheduled==='S'){pushSleep(SCHEDULING_STATE.SLEEPING);}else if(prevSlice.args.stateWhenDescheduled==='R'||prevSlice.args.stateWhenDescheduled==='R+'){slices.push(new tr.model.ThreadTimeSlice(thread,SCHEDULING_STATE.RUNNABLE,'',prevSlice.end,{},midDuration));}else if(prevSlice.args.stateWhenDescheduled==='D'){pushSleep(SCHEDULING_STATE.UNINTR_SLEEP);}else if(prevSlice.args.stateWhenDescheduled==='T'){slices.push(new tr.model.ThreadTimeSlice(thread,SCHEDULING_STATE.STOPPED,'',prevSlice.end,{},midDuration));}else if(prevSlice.args.stateWhenDescheduled==='t'){slices.push(new tr.model.ThreadTimeSlice(thread,SCHEDULING_STATE.DEBUG,'',prevSlice.end,{},midDuration));}else if(prevSlice.args.stateWhenDescheduled==='Z'){slices.push(new tr.model.ThreadTimeSlice(thread,SCHEDULING_STATE.ZOMBIE,'',prevSlice.end,{},midDuration));}else if(prevSlice.args.stateWhenDescheduled==='X'){slices.push(new tr.model.ThreadTimeSlice(thread,SCHEDULING_STATE.EXIT_DEAD,'',prevSlice.end,{},midDuration));}else if(prevSlice.args.stateWhenDescheduled==='x'){slices.push(new tr.model.ThreadTimeSlice(thread,SCHEDULING_STATE.TASK_DEAD,'',prevSlice.end,{},midDuration));}else if(prevSlice.args.stateWhenDescheduled==='K'){slices.push(new tr.model.ThreadTimeSlice(thread,SCHEDULING_STATE.WAKE_KILL,'',prevSlice.end,{},midDuration));}else if(prevSlice.args.stateWhenDescheduled==='W'){slices.push(new tr.model.ThreadTimeSlice(thread,SCHEDULING_STATE.WAKING,'',prevSlice.end,{},midDuration));}else if(prevSlice.args.stateWhenDescheduled==='D|K'){pushSleep(SCHEDULING_STATE.UNINTR_SLEEP_WAKE_KILL);}else if(prevSlice.args.stateWhenDescheduled==='D|W'){pushSleep(SCHEDULING_STATE.UNINTR_SLEEP_WAKING);}else{slices.push(new tr.model.ThreadTimeSlice(thread,SCHEDULING_STATE.UNKNOWN,'',prevSlice.end,{},midDuration));this.model_.importWarning({type:'parse_error',message:'Unrecognized sleep state: '+
+prevSlice.args.stateWhenDescheduled});}
+const runningSlice=new tr.model.ThreadTimeSlice(thread,SCHEDULING_STATE.RUNNING,'',nextSlice.start,{},nextSlice.duration);runningSlice.cpuOnWhichThreadWasRunning=prevSlice.cpu;slices.push(runningSlice);}
+thread.timeSlices=slices;},this);},createParsers_(){const allTypeInfos=tr.e.importer.linux_perf.Parser.getAllRegisteredTypeInfos();const parsers=allTypeInfos.map(function(typeInfo){return new typeInfo.constructor(this);},this);return parsers;},registerDefaultHandlers_(){this.registerEventHandler('tracing_mark_write',FTraceImporter.prototype.traceMarkingWriteEvent_.bind(this));this.registerEventHandler('0',FTraceImporter.prototype.traceMarkingWriteEvent_.bind(this));this.registerEventHandler('tracing_mark_write:trace_event_clock_sync',function(){return true;});this.registerEventHandler('0:trace_event_clock_sync',function(){return true;});},traceClockSyncEvent_(eventName,cpuNumber,pid,ts,eventBase){let event=/name=(\w+?)\s(.+)/.exec(eventBase.details);if(event){const name=event[1];const pieces=event[2].split(' ');const args={perfTs:ts};for(let i=0;i<pieces.length;i++){const parts=pieces[i].split('=');if(parts.length!==2){throw new Error('omgbbq');}
+args[parts[0]]=parts[1];}
+this.model_.clockSyncManager.addClockSyncMarker(this.clockDomainId_,name,ts);return true;}
+event=/name=([\w\-]+)/.exec(eventBase.details);if(event){this.model_.clockSyncManager.addClockSyncMarker(this.clockDomainId_,event[1],ts);return true;}
+event=/parent_ts=(\d+\.?\d*)/.exec(eventBase.details);if(!event)return false;let monotonicTs=event[1]*1000;if(monotonicTs===0)monotonicTs=ts;if(this.haveClockSyncedMonotonicToGlobal_){return true;}
+this.model_.clockSyncManager.addClockSyncMarker(this.clockDomainId_,MONOTONIC_TO_FTRACE_GLOBAL_SYNC_ID,ts);this.model_.clockSyncManager.addClockSyncMarker(tr.model.ClockDomainId.LINUX_CLOCK_MONOTONIC,MONOTONIC_TO_FTRACE_GLOBAL_SYNC_ID,monotonicTs);this.haveClockSyncedMonotonicToGlobal_=true;return true;},traceMarkingWriteEvent_(eventName,cpuNumber,pid,ts,eventBase,threadName){eventBase.details=eventBase.details.replace(/\\n.*$/,'');const event=/^\s*(\w+):\s*(.*)$/.exec(eventBase.details);if(!event){const tag=eventBase.details.substring(0,2);if(tag==='B|'||tag==='E'||tag==='E|'||tag==='X|'||tag==='C|'||tag==='S|'||tag==='F|'){eventBase.subEventName='android';}else{return false;}}else{eventBase.subEventName=event[1];eventBase.details=event[2];}
+const writeEventName=eventName+':'+eventBase.subEventName;const handler=this.eventHandlers_[writeEventName];if(!handler){this.model_.importWarning({type:'parse_error',message:'Unknown trace_marking_write event '+writeEventName});return true;}
+return handler(writeEventName,cpuNumber,pid,ts,eventBase,threadName);},importCpuData_(modelTimeTransformer){this.forEachLine_(function(text,eventBase,cpuNumber,pid,ts){const eventName=eventBase.eventName;const handler=this.eventHandlers_[eventName];if(!handler){this.model_.importWarning({type:'parse_error',message:'Unknown event '+eventName+' ('+text+')'});return;}
+ts=modelTimeTransformer(ts);if(!handler(eventName,cpuNumber,pid,ts,eventBase)){this.model_.importWarning({type:'parse_error',message:'Malformed '+eventName+' event ('+text+')'});}}.bind(this));},parseLines_(){let extractResult=FTraceImporter._extractEventsFromSystraceHTML(this.events_,true);if(!extractResult.ok){extractResult=FTraceImporter._extractEventsFromSystraceMultiHTML(this.events_,true);}
+let lineParser=undefined;if(extractResult.ok){for(const line of extractResult.lines){lineParser=this.parseLine_(line,lineParser);}}else{const r=new tr.importer.SimpleLineReader(this.events_);for(const line of r){lineParser=this.parseLine_(line,lineParser);}}},parseLine_(line,lineParser){line=line.trim();if(line.length===0)return lineParser;if(/^#/.test(line)){const clockType=/^# clock_type=([A-Z_]+)$/.exec(line);if(clockType){this.clockDomainId_=clockType[1];}
+return lineParser;}
+if(!lineParser){lineParser=autoDetectLineParser(line);if(!lineParser){this.model_.importWarning({type:'parse_error',message:'Cannot parse line: '+line});return lineParser;}}
+const eventBase=lineParser(line);if(!eventBase){this.model_.importWarning({type:'parse_error',message:'Unrecognized line: '+line});return lineParser;}
+this.lines_.push([line,eventBase,parseInt(eventBase.cpuNumber),parseInt(eventBase.pid),parseFloat(eventBase.timestamp)*1000]);return lineParser;},forEachLine_(handler){for(let i=0;i<this.lines_.length;++i){const line=this.lines_[i];handler.apply(this,line);}},lazyInit_(){this.parsers_=this.createParsers_();this.registerDefaultHandlers_();this.parseLines_();}};tr.importer.Importer.register(FTraceImporter);return{FTraceImporter,_FTraceImporterTestExports:TestExports};});'use strict';function filterDuplicateTimestamps(timestamps){const dedupedTimestamps=[];let lastTs=0;for(const ts of timestamps){if(ts-lastTs>=1){dedupedTimestamps.push(ts);lastTs=ts;}}
+return dedupedTimestamps;}
+tr.exportTo('tr.e.audits',function(){const VSYNC_COUNTER_PRECISIONS={'android.VSYNC-app':15,'android.VSYNC':15};const VSYNC_SLICE_PRECISIONS={'RenderWidgetHostViewAndroid::OnVSync':5,'VSYNC':10,'vblank':10,'DisplayLinkMac::GetVSyncParameters':5};const BEGIN_FRAME_SLICE_PRECISION={'DisplayScheduler::BeginFrame':10};function VSyncAuditor(model){tr.c.Auditor.call(this,model);}
+VSyncAuditor.prototype={__proto__:tr.c.Auditor.prototype,runAnnotate(){this.model.device.vSyncTimestamps=this.findVSyncTimestamps(this.model);},findVSyncTimestamps(model){let times=[];let maxPrecision=Number.NEGATIVE_INFINITY;let maxTitle=undefined;function useInstead(title,precisions){const precision=precisions[title];if(precision===undefined)return false;if(title===maxTitle)return true;if(precision<=maxPrecision){if(precision===maxPrecision){model.importWarning({type:'VSyncAuditor',message:'Encountered two different VSync events ('+
+maxTitle+', '+title+') with the same precision, '+'ignoring the newer one ('+title+')',showToUser:false,});}
+return false;}
+maxPrecision=precision;maxTitle=title;times=[];return true;}
+for(const pid in model.processes){const process=model.processes[pid];for(const cid in process.counters){if(useInstead(cid,VSYNC_COUNTER_PRECISIONS)){const counter=process.counters[cid];for(let i=0;i<counter.series.length;i++){const series=counter.series[i];Array.prototype.push.apply(times,series.timestamps);}}}
+for(const tid in process.threads){const thread=process.threads[tid];for(let i=0;i<thread.sliceGroup.slices.length;i++){const slice=thread.sliceGroup.slices[i];if(useInstead(slice.title,VSYNC_SLICE_PRECISIONS)){times.push(slice.start);}else if(useInstead(slice.title,BEGIN_FRAME_SLICE_PRECISION)&&slice.args.args&&slice.args.args.frame_time_us){times.push(slice.args.args.frame_time_us/1000.0);}}}}
+times.sort(function(x,y){return x-y;});return filterDuplicateTimestamps(times);}};tr.c.Auditor.register(VSyncAuditor);return{VSyncAuditor,};});'use strict';tr.exportTo('tr.importer',function(){function EmptyImporter(events){this.importPriority=0;}
+EmptyImporter.canImport=function(eventData){if(eventData instanceof Array&&eventData.length===0){return true;}
+if(typeof(eventData)==='string'||eventData instanceof String){return eventData.length===0;}
+return false;};EmptyImporter.prototype={__proto__:tr.importer.Importer.prototype,get importerName(){return'EmptyImporter';}};tr.importer.Importer.register(EmptyImporter);return{EmptyImporter,};});'use strict';tr.exportTo('tr.model.um',function(){function AnimationExpectation(parentModel,initiatorTitle,start,duration){tr.model.um.UserExpectation.call(this,parentModel,initiatorTitle,start,duration);this.frameEvents_=undefined;}
+AnimationExpectation.prototype={__proto__:tr.model.um.UserExpectation.prototype,constructor:AnimationExpectation,get frameEvents(){if(this.frameEvents_){return this.frameEvents_;}
+this.frameEvents_=new tr.model.EventSet();this.associatedEvents.forEach(function(event){if(event.title===tr.model.helpers.IMPL_RENDERING_STATS){this.frameEvents_.push(event);}},this);return this.frameEvents_;}};tr.model.um.UserExpectation.subTypes.register(AnimationExpectation,{stageTitle:'Animation',colorId:tr.b.ColorScheme.getColorIdForReservedName('rail_animation')});return{AnimationExpectation,};});'use strict';tr.exportTo('tr.importer',function(){function ProtoExpectation(type,initiatorType){this.type=type;this.initiatorType=initiatorType;this.start=Infinity;this.end=-Infinity;this.associatedEvents=new tr.model.EventSet();this.isAnimationBegin=false;}
+ProtoExpectation.RESPONSE_TYPE='r';ProtoExpectation.ANIMATION_TYPE='a';ProtoExpectation.IGNORED_TYPE='ignored';const INITIATOR_HIERARCHY=[tr.model.um.INITIATOR_TYPE.PINCH,tr.model.um.INITIATOR_TYPE.FLING,tr.model.um.INITIATOR_TYPE.MOUSE_WHEEL,tr.model.um.INITIATOR_TYPE.SCROLL,tr.model.um.INITIATOR_TYPE.VIDEO,tr.model.um.INITIATOR_TYPE.WEBGL,tr.model.um.INITIATOR_TYPE.CSS,tr.model.um.INITIATOR_TYPE.MOUSE,tr.model.um.INITIATOR_TYPE.KEYBOARD,tr.model.um.INITIATOR_TYPE.TAP,tr.model.um.INITIATOR_TYPE.TOUCH];function combineInitiatorTypes(title1,title2){for(const item of INITIATOR_HIERARCHY){if(title1===item||title2===item)return item;}
+throw new Error('Invalid titles in combineInitiatorTypes');}
+ProtoExpectation.prototype={get isValid(){return this.end>this.start;},containsTypeNames(typeNames){return this.associatedEvents.some(x=>typeNames.indexOf(x.typeName)>=0);},containsSliceTitle(title){return this.associatedEvents.some(x=>title===x.title);},createInteractionRecord(model){if(this.type!==ProtoExpectation.IGNORED_TYPE&&!this.isValid){model.importWarning({type:'ProtoExpectation',message:'Please file a bug with this trace. '+this.debug(),showToUser:true});return undefined;}
+const duration=this.end-this.start;let ir=undefined;switch(this.type){case ProtoExpectation.RESPONSE_TYPE:ir=new tr.model.um.ResponseExpectation(model,this.initiatorType,this.start,duration,this.isAnimationBegin);break;case ProtoExpectation.ANIMATION_TYPE:ir=new tr.model.um.AnimationExpectation(model,this.initiatorType,this.start,duration);break;}
+if(!ir)return undefined;ir.sourceEvents.addEventSet(this.associatedEvents);function pushAssociatedEvents(event){ir.associatedEvents.push(event);if(event.associatedEvents){ir.associatedEvents.addEventSet(event.associatedEvents);}}
+this.associatedEvents.forEach(function(event){pushAssociatedEvents(event);if(event.subSlices){event.subSlices.forEach(pushAssociatedEvents);}});return ir;},merge(other){this.initiatorType=combineInitiatorTypes(this.initiatorType,other.initiatorType);this.associatedEvents.addEventSet(other.associatedEvents);this.start=Math.min(this.start,other.start);this.end=Math.max(this.end,other.end);if(other.isAnimationBegin){this.isAnimationBegin=true;}},pushEvent(event){this.start=Math.min(this.start,event.start);this.end=Math.max(this.end,event.end);this.associatedEvents.push(event);},containsTimestampInclusive(timestamp){return(this.start<=timestamp)&&(timestamp<=this.end);},intersects(other){return(other.start<this.end)&&(other.end>this.start);},isNear(event,threshold){return(this.end+threshold)>event.start;},debug(){let debugString=this.type+'(';debugString+=parseInt(this.start)+' ';debugString+=parseInt(this.end);this.associatedEvents.forEach(function(event){debugString+=' '+event.typeName;});return debugString+')';}};return{ProtoExpectation,};});'use strict';tr.exportTo('tr.importer',function(){const ProtoExpectation=tr.importer.ProtoExpectation;const INITIATOR_TYPE=tr.model.um.INITIATOR_TYPE;const INPUT_TYPE=tr.e.cc.INPUT_EVENT_TYPE_NAMES;const KEYBOARD_TYPE_NAMES=[INPUT_TYPE.CHAR,INPUT_TYPE.KEY_DOWN_RAW,INPUT_TYPE.KEY_DOWN,INPUT_TYPE.KEY_UP];const MOUSE_RESPONSE_TYPE_NAMES=[INPUT_TYPE.CLICK,INPUT_TYPE.CONTEXT_MENU];const MOUSE_WHEEL_TYPE_NAMES=[INPUT_TYPE.MOUSE_WHEEL];const MOUSE_DRAG_TYPE_NAMES=[INPUT_TYPE.MOUSE_DOWN,INPUT_TYPE.MOUSE_MOVE,INPUT_TYPE.MOUSE_UP];const TAP_TYPE_NAMES=[INPUT_TYPE.TAP,INPUT_TYPE.TAP_CANCEL,INPUT_TYPE.TAP_DOWN];const PINCH_TYPE_NAMES=[INPUT_TYPE.PINCH_BEGIN,INPUT_TYPE.PINCH_END,INPUT_TYPE.PINCH_UPDATE];const FLING_TYPE_NAMES=[INPUT_TYPE.FLING_CANCEL,INPUT_TYPE.FLING_START];const TOUCH_TYPE_NAMES=[INPUT_TYPE.TOUCH_END,INPUT_TYPE.TOUCH_MOVE,INPUT_TYPE.TOUCH_START];const SCROLL_TYPE_NAMES=[INPUT_TYPE.SCROLL_BEGIN,INPUT_TYPE.SCROLL_END,INPUT_TYPE.SCROLL_UPDATE];const ALL_HANDLED_TYPE_NAMES=[].concat(KEYBOARD_TYPE_NAMES,MOUSE_RESPONSE_TYPE_NAMES,MOUSE_WHEEL_TYPE_NAMES,MOUSE_DRAG_TYPE_NAMES,PINCH_TYPE_NAMES,TAP_TYPE_NAMES,FLING_TYPE_NAMES,TOUCH_TYPE_NAMES,SCROLL_TYPE_NAMES);const RENDERER_FLING_TITLE='InputHandlerProxy::HandleGestureFling::started';const PLAYBACK_EVENT_TITLE='VideoPlayback';const CSS_ANIMATION_TITLE='Animation';const INPUT_MERGE_THRESHOLD_MS=200;const ANIMATION_MERGE_THRESHOLD_MS=32;const MOUSE_WHEEL_THRESHOLD_MS=40;const MOUSE_MOVE_THRESHOLD_MS=40;function compareEvents(x,y){if(x.start!==y.start){return x.start-y.start;}
+if(x.end!==y.end){return x.end-y.end;}
+if(x.guid&&y.guid){return x.guid-y.guid;}
+return 0;}
+function forEventTypesIn(events,typeNames,cb,opt_this){events.forEach(function(event){if(typeNames.indexOf(event.typeName)>=0){cb.call(opt_this,event);}});}
+function causedFrame(event){return event.associatedEvents.some(x=>x.title===tr.model.helpers.IMPL_RENDERING_STATS);}
+function getSortedFrameEventsByProcess(modelHelper){const frameEventsByPid={};for(const[pid,rendererHelper]of
+Object.entries(modelHelper.rendererHelpers)){frameEventsByPid[pid]=rendererHelper.getFrameEventsInRange(tr.model.helpers.IMPL_FRAMETIME_TYPE,modelHelper.model.bounds);}
+return frameEventsByPid;}
+function getSortedInputEvents(modelHelper){const inputEvents=[];const browserProcess=modelHelper.browserHelper.process;const mainThread=browserProcess.findAtMostOneThreadNamed('CrBrowserMain');for(const slice of mainThread.asyncSliceGroup.getDescendantEvents()){if(!slice.isTopLevel)continue;if(!(slice instanceof tr.e.cc.InputLatencyAsyncSlice))continue;if(isNaN(slice.start)||isNaN(slice.duration)||isNaN(slice.end)){continue;}
+inputEvents.push(slice);}
+return inputEvents.sort(compareEvents);}
+function findProtoExpectations(modelHelper,sortedInputEvents){const protoExpectations=[];const handlers=[handleKeyboardEvents,handleMouseResponseEvents,handleMouseWheelEvents,handleMouseDragEvents,handleTapResponseEvents,handlePinchEvents,handleFlingEvents,handleTouchEvents,handleScrollEvents,handleCSSAnimations,handleWebGLAnimations,handleVideoAnimations];handlers.forEach(function(handler){protoExpectations.push.apply(protoExpectations,handler(modelHelper,sortedInputEvents));});protoExpectations.sort(compareEvents);return protoExpectations;}
+function handleKeyboardEvents(modelHelper,sortedInputEvents){const protoExpectations=[];forEventTypesIn(sortedInputEvents,KEYBOARD_TYPE_NAMES,function(event){const pe=new ProtoExpectation(ProtoExpectation.RESPONSE_TYPE,INITIATOR_TYPE.KEYBOARD);pe.pushEvent(event);protoExpectations.push(pe);});return protoExpectations;}
+function handleMouseResponseEvents(modelHelper,sortedInputEvents){const protoExpectations=[];forEventTypesIn(sortedInputEvents,MOUSE_RESPONSE_TYPE_NAMES,function(event){const pe=new ProtoExpectation(ProtoExpectation.RESPONSE_TYPE,INITIATOR_TYPE.MOUSE);pe.pushEvent(event);protoExpectations.push(pe);});return protoExpectations;}
+function handleMouseWheelEvents(modelHelper,sortedInputEvents){const protoExpectations=[];let currentPE=undefined;let prevEvent_=undefined;forEventTypesIn(sortedInputEvents,MOUSE_WHEEL_TYPE_NAMES,function(event){const prevEvent=prevEvent_;prevEvent_=event;if(currentPE&&(prevEvent.start+MOUSE_WHEEL_THRESHOLD_MS)>=event.start){if(currentPE.type===ProtoExpectation.ANIMATION_TYPE){currentPE.pushEvent(event);}else{currentPE=new ProtoExpectation(ProtoExpectation.ANIMATION_TYPE,INITIATOR_TYPE.MOUSE_WHEEL);currentPE.pushEvent(event);protoExpectations.push(currentPE);}
+return;}
+currentPE=new ProtoExpectation(ProtoExpectation.RESPONSE_TYPE,INITIATOR_TYPE.MOUSE_WHEEL);currentPE.pushEvent(event);protoExpectations.push(currentPE);});return protoExpectations;}
+function handleMouseDragEvents(modelHelper,sortedInputEvents){const protoExpectations=[];let currentPE=undefined;let mouseDownEvent=undefined;forEventTypesIn(sortedInputEvents,MOUSE_DRAG_TYPE_NAMES,function(event){switch(event.typeName){case INPUT_TYPE.MOUSE_DOWN:if(causedFrame(event)){const pe=new ProtoExpectation(ProtoExpectation.RESPONSE_TYPE,INITIATOR_TYPE.MOUSE);pe.pushEvent(event);protoExpectations.push(pe);}else{mouseDownEvent=event;}
+break;case INPUT_TYPE.MOUSE_MOVE:if(!causedFrame(event)){const pe=new ProtoExpectation(ProtoExpectation.IGNORED_TYPE);pe.pushEvent(event);protoExpectations.push(pe);}else if(!currentPE||!currentPE.isNear(event,MOUSE_MOVE_THRESHOLD_MS)){currentPE=new ProtoExpectation(ProtoExpectation.RESPONSE_TYPE,INITIATOR_TYPE.MOUSE);currentPE.pushEvent(event);if(mouseDownEvent){currentPE.associatedEvents.push(mouseDownEvent);mouseDownEvent=undefined;}
+protoExpectations.push(currentPE);}else{if(currentPE.type===ProtoExpectation.ANIMATION_TYPE){currentPE.pushEvent(event);}else{currentPE=new ProtoExpectation(ProtoExpectation.ANIMATION_TYPE,INITIATOR_TYPE.MOUSE);currentPE.pushEvent(event);protoExpectations.push(currentPE);}}
+break;case INPUT_TYPE.MOUSE_UP:if(!mouseDownEvent){const pe=new ProtoExpectation(causedFrame(event)?ProtoExpectation.RESPONSE_TYPE:ProtoExpectation.IGNORED_TYPE,INITIATOR_TYPE.MOUSE);pe.pushEvent(event);protoExpectations.push(pe);break;}
+if(currentPE){currentPE.pushEvent(event);}else{currentPE=new ProtoExpectation(ProtoExpectation.RESPONSE_TYPE,INITIATOR_TYPE.MOUSE);if(mouseDownEvent){currentPE.associatedEvents.push(mouseDownEvent);}
+currentPE.pushEvent(event);protoExpectations.push(currentPE);}
+mouseDownEvent=undefined;currentPE=undefined;break;}});if(mouseDownEvent){currentPE=new ProtoExpectation(ProtoExpectation.IGNORED_TYPE);currentPE.pushEvent(mouseDownEvent);protoExpectations.push(currentPE);}
+return protoExpectations;}
+function handleTapResponseEvents(modelHelper,sortedInputEvents){const protoExpectations=[];let currentPE=undefined;forEventTypesIn(sortedInputEvents,TAP_TYPE_NAMES,function(event){switch(event.typeName){case INPUT_TYPE.TAP_DOWN:currentPE=new ProtoExpectation(ProtoExpectation.RESPONSE_TYPE,INITIATOR_TYPE.TAP);currentPE.pushEvent(event);protoExpectations.push(currentPE);break;case INPUT_TYPE.TAP:if(currentPE){currentPE.pushEvent(event);}else{currentPE=new ProtoExpectation(ProtoExpectation.RESPONSE_TYPE,INITIATOR_TYPE.TAP);currentPE.pushEvent(event);protoExpectations.push(currentPE);}
+currentPE=undefined;break;case INPUT_TYPE.TAP_CANCEL:if(!currentPE){const pe=new ProtoExpectation(ProtoExpectation.IGNORED_TYPE);pe.pushEvent(event);protoExpectations.push(pe);break;}
+if(currentPE.isNear(event,INPUT_MERGE_THRESHOLD_MS)){currentPE.pushEvent(event);}else{currentPE=new ProtoExpectation(ProtoExpectation.RESPONSE_TYPE,INITIATOR_TYPE.TAP);currentPE.pushEvent(event);protoExpectations.push(currentPE);}
+currentPE=undefined;break;}});return protoExpectations;}
+function handlePinchEvents(modelHelper,sortedInputEvents){const protoExpectations=[];let currentPE=undefined;let sawFirstUpdate=false;const modelBounds=modelHelper.model.bounds;forEventTypesIn(sortedInputEvents,PINCH_TYPE_NAMES,function(event){switch(event.typeName){case INPUT_TYPE.PINCH_BEGIN:if(currentPE&&currentPE.isNear(event,INPUT_MERGE_THRESHOLD_MS)){currentPE.pushEvent(event);break;}
+currentPE=new ProtoExpectation(ProtoExpectation.RESPONSE_TYPE,INITIATOR_TYPE.PINCH);currentPE.pushEvent(event);currentPE.isAnimationBegin=true;protoExpectations.push(currentPE);sawFirstUpdate=false;break;case INPUT_TYPE.PINCH_UPDATE:if(!currentPE||((currentPE.type===ProtoExpectation.RESPONSE_TYPE)&&sawFirstUpdate)||!currentPE.isNear(event,INPUT_MERGE_THRESHOLD_MS)){currentPE=new ProtoExpectation(ProtoExpectation.ANIMATION_TYPE,INITIATOR_TYPE.PINCH);currentPE.pushEvent(event);protoExpectations.push(currentPE);}else{currentPE.pushEvent(event);sawFirstUpdate=true;}
+break;case INPUT_TYPE.PINCH_END:if(currentPE){currentPE.pushEvent(event);}else{const pe=new ProtoExpectation(ProtoExpectation.IGNORED_TYPE);pe.pushEvent(event);protoExpectations.push(pe);}
+currentPE=undefined;break;}});return protoExpectations;}
+function handleFlingEvents(modelHelper,sortedInputEvents){const protoExpectations=[];let currentPE=undefined;function isRendererFling(event){return event.title===RENDERER_FLING_TITLE;}
+const browserHelper=modelHelper.browserHelper;const flingEvents=browserHelper.getAllAsyncSlicesMatching(isRendererFling);forEventTypesIn(sortedInputEvents,FLING_TYPE_NAMES,function(event){flingEvents.push(event);});flingEvents.sort(compareEvents);flingEvents.forEach(function(event){if(event.title===RENDERER_FLING_TITLE){if(currentPE){currentPE.pushEvent(event);}else{currentPE=new ProtoExpectation(ProtoExpectation.ANIMATION_TYPE,INITIATOR_TYPE.FLING);currentPE.pushEvent(event);protoExpectations.push(currentPE);}
+return;}
+switch(event.typeName){case INPUT_TYPE.FLING_START:if(currentPE){modelHelper.model.importWarning({type:'UserModelBuilder',message:'Please file a bug with this trace: FlingStart',showToUser:true});currentPE.pushEvent(event);}else{currentPE=new ProtoExpectation(ProtoExpectation.ANIMATION_TYPE,INITIATOR_TYPE.FLING);currentPE.pushEvent(event);currentPE.end=0;protoExpectations.push(currentPE);}
+break;case INPUT_TYPE.FLING_CANCEL:if(currentPE){currentPE.pushEvent(event);currentPE.end=event.start;currentPE=undefined;}else{const pe=new ProtoExpectation(ProtoExpectation.IGNORED_TYPE);pe.pushEvent(event);protoExpectations.push(pe);}
+break;}});if(currentPE&&!currentPE.end){currentPE.end=modelHelper.model.bounds.max;}
+return protoExpectations;}
+function handleTouchEvents(modelHelper,sortedInputEvents){const protoExpectations=[];let currentPE=undefined;let sawFirstMove=false;forEventTypesIn(sortedInputEvents,TOUCH_TYPE_NAMES,function(event){switch(event.typeName){case INPUT_TYPE.TOUCH_START:if(currentPE){currentPE.pushEvent(event);}else{currentPE=new ProtoExpectation(ProtoExpectation.RESPONSE_TYPE,INITIATOR_TYPE.TOUCH);currentPE.pushEvent(event);currentPE.isAnimationBegin=true;protoExpectations.push(currentPE);sawFirstMove=false;}
+break;case INPUT_TYPE.TOUCH_MOVE:if(!currentPE){currentPE=new ProtoExpectation(ProtoExpectation.ANIMATION_TYPE,INITIATOR_TYPE.TOUCH);currentPE.pushEvent(event);protoExpectations.push(currentPE);break;}
+if((sawFirstMove&&(currentPE.type===ProtoExpectation.RESPONSE_TYPE))||!currentPE.isNear(event,INPUT_MERGE_THRESHOLD_MS)){const prevEnd=currentPE.end;currentPE=new ProtoExpectation(ProtoExpectation.ANIMATION_TYPE,INITIATOR_TYPE.TOUCH);currentPE.pushEvent(event);currentPE.start=prevEnd;protoExpectations.push(currentPE);}else{currentPE.pushEvent(event);sawFirstMove=true;}
+break;case INPUT_TYPE.TOUCH_END:if(!currentPE){const pe=new ProtoExpectation(ProtoExpectation.IGNORED_TYPE);pe.pushEvent(event);protoExpectations.push(pe);break;}
+if(currentPE.isNear(event,INPUT_MERGE_THRESHOLD_MS)){currentPE.pushEvent(event);}else{const pe=new ProtoExpectation(ProtoExpectation.IGNORED_TYPE);pe.pushEvent(event);protoExpectations.push(pe);}
+currentPE=undefined;break;}});return protoExpectations;}
+function handleScrollEvents(modelHelper,sortedInputEvents){const protoExpectations=[];let currentPE=undefined;let sawFirstUpdate=false;forEventTypesIn(sortedInputEvents,SCROLL_TYPE_NAMES,function(event){switch(event.typeName){case INPUT_TYPE.SCROLL_BEGIN:currentPE=new ProtoExpectation(ProtoExpectation.RESPONSE_TYPE,INITIATOR_TYPE.SCROLL);currentPE.pushEvent(event);currentPE.isAnimationBegin=true;protoExpectations.push(currentPE);sawFirstUpdate=false;break;case INPUT_TYPE.SCROLL_UPDATE:if(currentPE){if(currentPE.isNear(event,INPUT_MERGE_THRESHOLD_MS)&&((currentPE.type===ProtoExpectation.ANIMATION_TYPE)||!sawFirstUpdate)){currentPE.pushEvent(event);sawFirstUpdate=true;}else{currentPE=new ProtoExpectation(ProtoExpectation.ANIMATION_TYPE,INITIATOR_TYPE.SCROLL);currentPE.pushEvent(event);protoExpectations.push(currentPE);}}else{currentPE=new ProtoExpectation(ProtoExpectation.ANIMATION_TYPE,INITIATOR_TYPE.SCROLL);currentPE.pushEvent(event);protoExpectations.push(currentPE);}
+break;case INPUT_TYPE.SCROLL_END:if(!currentPE){modelHelper.model.importWarning({type:'UserModelBuilder',message:'Please file a bug with this trace: ScrollEnd',showToUser:true});const pe=new ProtoExpectation(ProtoExpectation.IGNORED_TYPE);pe.pushEvent(event);protoExpectations.push(pe);break;}
+currentPE.pushEvent(event);break;}});return protoExpectations;}
+function handleVideoAnimations(modelHelper,sortedInputEvents){const events=[];for(const pid in modelHelper.rendererHelpers){for(const tid in modelHelper.rendererHelpers[pid].process.threads){for(const asyncSlice of
+modelHelper.rendererHelpers[pid].process.threads[tid].asyncSliceGroup.slices){if(asyncSlice.title===PLAYBACK_EVENT_TITLE){events.push(asyncSlice);}}}}
+events.sort(tr.importer.compareEvents);const protoExpectations=[];for(const event of events){const currentPE=new ProtoExpectation(ProtoExpectation.ANIMATION_TYPE,INITIATOR_TYPE.VIDEO);currentPE.start=event.start;currentPE.end=event.end;currentPE.pushEvent(event);protoExpectations.push(currentPE);}
+return protoExpectations;}
+function handleCSSAnimations(modelHelper,sortedInputEvents){const animationEvents=modelHelper.browserHelper.getAllAsyncSlicesMatching(function(event){return((event.title===CSS_ANIMATION_TITLE)&&event.isTopLevel&&(event.duration>0));});const animationRanges=[];function pushAnimationRange(start,end,animation){const range=tr.b.math.Range.fromExplicitRange(start,end);range.animation=animation;animationRanges.push(range);}
+animationEvents.forEach(function(animation){if(animation.subSlices.length===0){pushAnimationRange(animation.start,animation.end,animation);}else{let start=undefined;animation.subSlices.forEach(function(sub){if((sub.args.data.state==='running')&&(start===undefined)){start=sub.start;}else if((sub.args.data.state==='paused')||(sub.args.data.state==='idle')||(sub.args.data.state==='finished')){if(start===undefined){start=modelHelper.model.bounds.min;}
+pushAnimationRange(start,sub.start,animation);start=undefined;}});if(start!==undefined){pushAnimationRange(start,animation.end,animation);}}});return animationRanges.map(function(range){const protoExpectation=new ProtoExpectation(ProtoExpectation.ANIMATION_TYPE,INITIATOR_TYPE.CSS);protoExpectation.start=range.min;protoExpectation.end=range.max;protoExpectation.associatedEvents.push(range.animation);return protoExpectation;});}
+function findWebGLEvents(modelHelper,mailboxEvents,animationEvents){for(const event of modelHelper.model.getDescendantEvents()){if(event.title==='DrawingBuffer::prepareMailbox'){mailboxEvents.push(event);}else if(event.title==='PageAnimator::serviceScriptedAnimations'){animationEvents.push(event);}}}
+function findMailboxEventsNearAnimationEvents(mailboxEvents,animationEvents){if(animationEvents.length===0)return[];mailboxEvents.sort(compareEvents);animationEvents.sort(compareEvents);const animationIterator=animationEvents[Symbol.iterator]();let animationEvent=animationIterator.next().value;const filteredEvents=[];for(const event of mailboxEvents){while(animationEvent&&(animationEvent.start<(event.start-ANIMATION_MERGE_THRESHOLD_MS))){animationEvent=animationIterator.next().value;}
+if(!animationEvent)break;if(animationEvent.start<(event.start+ANIMATION_MERGE_THRESHOLD_MS)){filteredEvents.push(event);}}
+return filteredEvents;}
+function createProtoExpectationsFromMailboxEvents(mailboxEvents){const protoExpectations=[];let currentPE=undefined;for(const event of mailboxEvents){if(currentPE===undefined||!currentPE.isNear(event,ANIMATION_MERGE_THRESHOLD_MS)){currentPE=new ProtoExpectation(ProtoExpectation.ANIMATION_TYPE,INITIATOR_TYPE.WEBGL);currentPE.pushEvent(event);protoExpectations.push(currentPE);}else{currentPE.pushEvent(event);}}
+return protoExpectations;}
+function handleWebGLAnimations(modelHelper,sortedInputEvents){const prepareMailboxEvents=[];const scriptedAnimationEvents=[];findWebGLEvents(modelHelper,prepareMailboxEvents,scriptedAnimationEvents);const webGLMailboxEvents=findMailboxEventsNearAnimationEvents(prepareMailboxEvents,scriptedAnimationEvents);return createProtoExpectationsFromMailboxEvents(webGLMailboxEvents);}
+function postProcessProtoExpectations(modelHelper,protoExpectations){protoExpectations=findFrameEventsForAnimations(modelHelper,protoExpectations);protoExpectations=mergeIntersectingResponses(protoExpectations);protoExpectations=mergeIntersectingAnimations(protoExpectations);protoExpectations=fixResponseAnimationStarts(protoExpectations);protoExpectations=fixTapResponseTouchAnimations(protoExpectations);return protoExpectations;}
+function mergeIntersectingResponses(protoExpectations){const newPEs=[];while(protoExpectations.length){const pe=protoExpectations.shift();newPEs.push(pe);if(pe.type!==ProtoExpectation.RESPONSE_TYPE)continue;for(let i=0;i<protoExpectations.length;++i){const otherPE=protoExpectations[i];if(otherPE.type!==pe.type)continue;if(!otherPE.intersects(pe))continue;const typeNames=pe.associatedEvents.map(function(event){return event.typeName;});if(otherPE.containsTypeNames(typeNames))continue;pe.merge(otherPE);protoExpectations.splice(i,1);--i;}}
+return newPEs;}
+function mergeIntersectingAnimations(protoExpectations){const newPEs=[];while(protoExpectations.length){const pe=protoExpectations.shift();newPEs.push(pe);if(pe.type!==ProtoExpectation.ANIMATION_TYPE)continue;const isCSS=pe.initiatorType===INITIATOR_TYPE.CSS;const isFling=pe.containsTypeNames([INPUT_TYPE.FLING_START]);const isVideo=pe.initiatorType===INITIATOR_TYPE.VIDEO;for(let i=0;i<protoExpectations.length;++i){const otherPE=protoExpectations[i];if(otherPE.type!==pe.type)continue;if((isCSS&&otherPE.initiatorType!==INITIATOR_TYPE.CSS)||isFling!==otherPE.containsTypeNames([INPUT_TYPE.FLING_START])||isVideo&&otherPE.initiatorType!==INITIATOR_TYPE.VIDEO){continue;}
+if(isCSS){if(!pe.isNear(otherPE,ANIMATION_MERGE_THRESHOLD_MS)){continue;}}else if(!otherPE.intersects(pe)){continue;}
+pe.merge(otherPE);protoExpectations.splice(i,1);--i;}}
+return newPEs;}
+function fixResponseAnimationStarts(protoExpectations){protoExpectations.forEach(function(ape){if(ape.type!==ProtoExpectation.ANIMATION_TYPE){return;}
+protoExpectations.forEach(function(rpe){if(rpe.type!==ProtoExpectation.RESPONSE_TYPE){return;}
+if(!ape.containsTimestampInclusive(rpe.end)){return;}
+if(ape.containsTimestampInclusive(rpe.start)){return;}
+ape.start=rpe.end;});});return protoExpectations;}
+function fixTapResponseTouchAnimations(protoExpectations){function isTapResponse(pe){return(pe.type===ProtoExpectation.RESPONSE_TYPE)&&pe.containsTypeNames([INPUT_TYPE.TAP]);}
+function isTouchAnimation(pe){return(pe.type===ProtoExpectation.ANIMATION_TYPE)&&pe.containsTypeNames([INPUT_TYPE.TOUCH_MOVE])&&!pe.containsTypeNames([INPUT_TYPE.SCROLL_UPDATE,INPUT_TYPE.PINCH_UPDATE]);}
+const newPEs=[];while(protoExpectations.length){const pe=protoExpectations.shift();newPEs.push(pe);const peIsTapResponse=isTapResponse(pe);const peIsTouchAnimation=isTouchAnimation(pe);if(!peIsTapResponse&&!peIsTouchAnimation){continue;}
+for(let i=0;i<protoExpectations.length;++i){const otherPE=protoExpectations[i];if(!otherPE.intersects(pe))continue;if(peIsTapResponse&&!isTouchAnimation(otherPE))continue;if(peIsTouchAnimation&&!isTapResponse(otherPE))continue;pe.type=ProtoExpectation.RESPONSE_TYPE;pe.merge(otherPE);protoExpectations.splice(i,1);--i;}}
+return newPEs;}
+function findFrameEventsForAnimations(modelHelper,protoExpectations){const newPEs=[];const frameEventsByPid=getSortedFrameEventsByProcess(modelHelper);for(const pe of protoExpectations){if(pe.type!==ProtoExpectation.ANIMATION_TYPE){newPEs.push(pe);continue;}
+const frameEvents=[];for(const pid of Object.keys(modelHelper.rendererHelpers)){const range=tr.b.math.Range.fromExplicitRange(pe.start,pe.end);frameEvents.push.apply(frameEvents,range.filterArray(frameEventsByPid[pid],e=>e.start));}
+if(frameEvents.length===0&&!(pe.initiatorType===INITIATOR_TYPE.WEBGL)){pe.type=ProtoExpectation.IGNORED_TYPE;newPEs.push(pe);continue;}
+pe.associatedEvents.addEventSet(frameEvents);newPEs.push(pe);}
+return newPEs;}
+function checkAllInputEventsHandled(modelHelper,sortedInputEvents,protoExpectations){const handledEvents=[];protoExpectations.forEach(function(protoExpectation){protoExpectation.associatedEvents.forEach(function(event){if((event.title===CSS_ANIMATION_TITLE)&&(event.subSlices.length>0)){return;}
+if((handledEvents.indexOf(event)>=0)&&(event.title!==tr.model.helpers.IMPL_RENDERING_STATS)){modelHelper.model.importWarning({type:'UserModelBuilder',message:'Please file a bug with this trace: '+`double-handled event: ${event.typeName} @ ${event.start}`,showToUser:true});return;}
+handledEvents.push(event);});});sortedInputEvents.forEach(function(event){if(handledEvents.indexOf(event)<0){modelHelper.model.importWarning({type:'UserModelBuilder',message:'Please file a bug with this trace: '+`double-handled event: ${event.typeName} @ ${event.start}`,showToUser:true});}});}
+function findInputExpectations(modelHelper){const sortedInputEvents=getSortedInputEvents(modelHelper);let protoExpectations=findProtoExpectations(modelHelper,sortedInputEvents);protoExpectations=postProcessProtoExpectations(modelHelper,protoExpectations);checkAllInputEventsHandled(modelHelper,sortedInputEvents,protoExpectations);const expectations=[];protoExpectations.forEach(function(protoExpectation){const ir=protoExpectation.createInteractionRecord(modelHelper.model);if(ir){expectations.push(ir);}});return expectations;}
+return{findInputExpectations,compareEvents,CSS_ANIMATION_TITLE,};});'use strict';tr.exportTo('tr.model.um',function(){const LOAD_SUBTYPE_NAMES={SUCCESSFUL:'Successful',FAILED:'Failed',};const DOES_LOAD_SUBTYPE_NAME_EXIST={};for(const key in LOAD_SUBTYPE_NAMES){DOES_LOAD_SUBTYPE_NAME_EXIST[LOAD_SUBTYPE_NAMES[key]]=true;}
+function LoadExpectation(parentModel,initiatorTitle,start,duration){if(!DOES_LOAD_SUBTYPE_NAME_EXIST[initiatorTitle]){throw new Error(initiatorTitle+' is not in LOAD_SUBTYPE_NAMES');}
+tr.model.um.UserExpectation.call(this,parentModel,initiatorTitle,start,duration);this.renderProcess=undefined;this.renderMainThread=undefined;this.routingId=undefined;this.parentRoutingId=undefined;this.loadFinishedEvent=undefined;}
+LoadExpectation.prototype={__proto__:tr.model.um.UserExpectation.prototype,constructor:LoadExpectation};tr.model.um.UserExpectation.subTypes.register(LoadExpectation,{stageTitle:'Load',colorId:tr.b.ColorScheme.getColorIdForReservedName('rail_load')});return{LOAD_SUBTYPE_NAMES,LoadExpectation,};});'use strict';tr.exportTo('tr.importer',function(){const NAVIGATION_START='NavigationTiming navigationStart';const FIRST_CONTENTFUL_PAINT_TITLE='firstContentfulPaint';function findLoadExpectations(modelHelper){const events=[];for(const event of modelHelper.model.getDescendantEvents()){if((event.title===NAVIGATION_START)||(event.title===FIRST_CONTENTFUL_PAINT_TITLE)){events.push(event);}}
+events.sort(tr.importer.compareEvents);const loads=[];let startEvent=undefined;for(const event of events){if(event.title===NAVIGATION_START){startEvent=event;}else if(event.title===FIRST_CONTENTFUL_PAINT_TITLE){if(startEvent){loads.push(new tr.model.um.LoadExpectation(modelHelper.model,tr.model.um.LOAD_SUBTYPE_NAMES.SUCCESSFUL,startEvent.start,event.start-startEvent.start));startEvent=undefined;}}}
+if(startEvent){loads.push(new tr.model.um.LoadExpectation(modelHelper.model,tr.model.um.LOAD_SUBTYPE_NAMES.SUCCESSFUL,startEvent.start,modelHelper.model.bounds.max-startEvent.start));}
+return loads;}
+return{findLoadExpectations,};});'use strict';tr.exportTo('tr.model.um',function(){function StartupExpectation(parentModel,start,duration){tr.model.um.UserExpectation.call(this,parentModel,'',start,duration);}
+StartupExpectation.prototype={__proto__:tr.model.um.UserExpectation.prototype,constructor:StartupExpectation};tr.model.um.UserExpectation.subTypes.register(StartupExpectation,{stageTitle:'Startup',colorId:tr.b.ColorScheme.getColorIdForReservedName('startup')});return{StartupExpectation,};});'use strict';tr.exportTo('tr.importer',function(){function getAllFrameEvents(modelHelper){const frameEvents=[];frameEvents.push.apply(frameEvents,modelHelper.browserHelper.getFrameEventsInRange(tr.model.helpers.IMPL_FRAMETIME_TYPE,modelHelper.model.bounds));for(const renderer of Object.values(modelHelper.rendererHelpers)){frameEvents.push.apply(frameEvents,renderer.getFrameEventsInRange(tr.model.helpers.IMPL_FRAMETIME_TYPE,modelHelper.model.bounds));}
+return frameEvents.sort(tr.importer.compareEvents);}
+function getStartupEvents(modelHelper){function isStartupSlice(slice){return slice.title==='BrowserMainLoop::CreateThreads';}
+const events=modelHelper.browserHelper.getAllAsyncSlicesMatching(isStartupSlice);const deduper=new tr.model.EventSet();events.forEach(function(event){const sliceGroup=event.parentContainer.sliceGroup;const slice=sliceGroup&&sliceGroup.findFirstSlice();if(slice){deduper.push(slice);}});return deduper.toArray();}
+function findStartupExpectations(modelHelper){const openingEvents=getStartupEvents(modelHelper);const closingEvents=getAllFrameEvents(modelHelper);const startups=[];openingEvents.forEach(function(openingEvent){closingEvents.forEach(function(closingEvent){if(openingEvent.closingEvent)return;if(closingEvent.openingEvent)return;if(closingEvent.start<=openingEvent.start)return;if(openingEvent.parentContainer.parent.pid!==closingEvent.parentContainer.parent.pid){return;}
+openingEvent.closingEvent=closingEvent;closingEvent.openingEvent=openingEvent;const se=new tr.model.um.StartupExpectation(modelHelper.model,openingEvent.start,closingEvent.end-openingEvent.start);se.associatedEvents.push(openingEvent);se.associatedEvents.push(closingEvent);startups.push(se);});});return startups;}
+return{findStartupExpectations,};});'use strict';tr.exportTo('tr.model',function(){function getAssociatedEvents(irs){const allAssociatedEvents=new tr.model.EventSet();irs.forEach(function(ir){ir.associatedEvents.forEach(function(event){if(event instanceof tr.model.FlowEvent)return;allAssociatedEvents.push(event);});});return allAssociatedEvents;}
+function getUnassociatedEvents(model,associatedEvents){const unassociatedEvents=new tr.model.EventSet();for(const proc of model.getAllProcesses()){for(const thread of Object.values(proc.threads)){for(const event of thread.sliceGroup.getDescendantEvents()){if(!associatedEvents.contains(event)){unassociatedEvents.push(event);}}}}
+return unassociatedEvents;}
+function getTotalCpuDuration(events){let cpuMs=0;events.forEach(function(event){if(event.cpuSelfTime){cpuMs+=event.cpuSelfTime;}});return cpuMs;}
+function getIRCoverageFromModel(model){const associatedEvents=getAssociatedEvents(model.userModel.expectations);if(!associatedEvents.length)return undefined;const unassociatedEvents=getUnassociatedEvents(model,associatedEvents);const associatedCpuMs=getTotalCpuDuration(associatedEvents);const unassociatedCpuMs=getTotalCpuDuration(unassociatedEvents);const totalEventCount=associatedEvents.length+unassociatedEvents.length;const totalCpuMs=associatedCpuMs+unassociatedCpuMs;let coveredEventsCpuTimeRatio=undefined;if(totalCpuMs!==0){coveredEventsCpuTimeRatio=associatedCpuMs/totalCpuMs;}
+return{associatedEventsCount:associatedEvents.length,unassociatedEventsCount:unassociatedEvents.length,associatedEventsCpuTimeMs:associatedCpuMs,unassociatedEventsCpuTimeMs:unassociatedCpuMs,coveredEventsCountRatio:associatedEvents.length/totalEventCount,coveredEventsCpuTimeRatio};}
+return{getIRCoverageFromModel,getAssociatedEvents,getUnassociatedEvents,};});'use strict';tr.exportTo('tr.model.um',function(){function IdleExpectation(parentModel,start,duration){const initiatorTitle='';tr.model.um.UserExpectation.call(this,parentModel,initiatorTitle,start,duration);}
+IdleExpectation.prototype={__proto__:tr.model.um.UserExpectation.prototype,constructor:IdleExpectation};tr.model.um.UserExpectation.subTypes.register(IdleExpectation,{stageTitle:'Idle',colorId:tr.b.ColorScheme.getColorIdForReservedName('rail_idle')});return{IdleExpectation,};});'use strict';tr.exportTo('tr.importer',function(){const INSIGNIFICANT_MS=1;class UserModelBuilder{constructor(model){this.model=model;this.modelHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);}
+static supportsModelHelper(modelHelper){return modelHelper.browserHelper!==undefined;}
+buildUserModel(){if(!this.modelHelper||!this.modelHelper.browserHelper)return;try{for(const ue of this.findUserExpectations()){this.model.userModel.expectations.push(ue);}
+this.model.userModel.segments.push(...this.findSegments());}catch(error){this.model.importWarning({type:'UserModelBuilder',message:error,showToUser:true});}}
+findSegments(){let timestamps=new Set();for(const expectation of this.model.userModel.expectations){timestamps.add(expectation.start);timestamps.add(expectation.end);}
+timestamps=[...timestamps];timestamps.sort((x,y)=>x-y);const segments=[];for(let i=0;i<timestamps.length-1;++i){const segment=new tr.model.um.Segment(timestamps[i],timestamps[i+1]-timestamps[i]);segments.push(segment);const segmentRange=tr.b.math.Range.fromExplicitRange(segment.start,segment.end);for(const expectation of this.model.userModel.expectations){const expectationRange=tr.b.math.Range.fromExplicitRange(expectation.start,expectation.end);if(segmentRange.intersectsRangeExclusive(expectationRange)){segment.expectations.push(expectation);}}}
+return segments;}
+findUserExpectations(){const expectations=[];expectations.push.apply(expectations,tr.importer.findStartupExpectations(this.modelHelper));expectations.push.apply(expectations,tr.importer.findLoadExpectations(this.modelHelper));expectations.push.apply(expectations,tr.importer.findInputExpectations(this.modelHelper));expectations.push.apply(expectations,this.findIdleExpectations(expectations));this.collectUnassociatedEvents_(expectations);return expectations;}
+collectUnassociatedEvents_(expectations){const vacuumUEs=[];for(const expectation of expectations){if(expectation instanceof tr.model.um.IdleExpectation||expectation instanceof tr.model.um.LoadExpectation||expectation instanceof tr.model.um.StartupExpectation){vacuumUEs.push(expectation);}}
+if(vacuumUEs.length===0)return;const allAssociatedEvents=tr.model.getAssociatedEvents(expectations);const unassociatedEvents=tr.model.getUnassociatedEvents(this.model,allAssociatedEvents);for(const event of unassociatedEvents){if(!(event instanceof tr.model.ThreadSlice))continue;if(!event.isTopLevel)continue;for(let index=0;index<vacuumUEs.length;++index){const expectation=vacuumUEs[index];if((event.start>=expectation.start)&&(event.start<expectation.end)){expectation.associatedEvents.addEventSet(event.entireHierarchy);break;}}}}
+findIdleExpectations(otherUEs){if(this.model.bounds.isEmpty)return;const emptyRanges=tr.b.math.findEmptyRangesBetweenRanges(tr.b.math.convertEventsToRanges(otherUEs),this.model.bounds);const expectations=[];const model=this.model;for(const range of emptyRanges){if(range.max<(range.min+INSIGNIFICANT_MS))continue;expectations.push(new tr.model.um.IdleExpectation(model,range.min,range.max-range.min));}
+return expectations;}}
+function createCustomizeModelLinesFromModel(model){const modelLines=[];modelLines.push(' audits.addEvent(model.browserMain,');modelLines.push(' {title: \'model start\', start: 0, end: 1});');const typeNames={};for(const typeName in tr.e.cc.INPUT_EVENT_TYPE_NAMES){typeNames[tr.e.cc.INPUT_EVENT_TYPE_NAMES[typeName]]=typeName;}
+let modelEvents=new tr.model.EventSet();for(const ue of model.userModel.expectations){modelEvents.addEventSet(ue.sourceEvents);}
+modelEvents=modelEvents.toArray();modelEvents.sort(tr.importer.compareEvents);for(const event of modelEvents){const startAndEnd='start: '+parseInt(event.start)+', '+'end: '+parseInt(event.end)+'});';if(event instanceof tr.e.cc.InputLatencyAsyncSlice){modelLines.push(' audits.addInputEvent(model, INPUT_TYPE.'+
+typeNames[event.typeName]+',');}else if(event.title==='RenderFrameImpl::didCommitProvisionalLoad'){modelLines.push(' audits.addCommitLoadEvent(model,');}else if(event.title==='InputHandlerProxy::HandleGestureFling::started'){modelLines.push(' audits.addFlingAnimationEvent(model,');}else if(event.title===tr.model.helpers.IMPL_RENDERING_STATS){modelLines.push(' audits.addFrameEvent(model,');}else if(event.title===tr.importer.CSS_ANIMATION_TITLE){modelLines.push(' audits.addEvent(model.rendererMain, {');modelLines.push(' title: \'Animation\', '+startAndEnd);return;}else{throw new Error('You must extend createCustomizeModelLinesFromModel()'+'to support this event:\n'+event.title+'\n');}
+modelLines.push(' {'+startAndEnd);}
+modelLines.push(' audits.addEvent(model.browserMain,');modelLines.push(' {'+'title: \'model end\', '+'start: '+(parseInt(model.bounds.max)-1)+', '+'end: '+parseInt(model.bounds.max)+'});');return modelLines;}
+function createExpectedUELinesFromModel(model){const expectedLines=[];const ueCount=model.userModel.expectations.length;for(let index=0;index<ueCount;++index){const expectation=model.userModel.expectations[index];let ueString=' {';ueString+='title: \''+expectation.title+'\', ';ueString+='start: '+parseInt(expectation.start)+', ';ueString+='end: '+parseInt(expectation.end)+', ';ueString+='eventCount: '+expectation.sourceEvents.length;ueString+='}';if(index<(ueCount-1))ueString+=',';expectedLines.push(ueString);}
+return expectedLines;}
+function createUEFinderTestCaseStringFromModel(model){const filename=window.location.hash.substr(1);let testName=filename.substr(filename.lastIndexOf('/')+1);testName=testName.substr(0,testName.indexOf('.'));try{const testLines=[];testLines.push(' /*');testLines.push(' This test was generated from');testLines.push(' '+filename+'');testLines.push(' */');testLines.push(' test(\''+testName+'\', function() {');testLines.push(' const verifier = new UserExpectationVerifier();');testLines.push(' verifier.customizeModelCallback = function(model) {');testLines.push.apply(testLines,createCustomizeModelLinesFromModel(model));testLines.push(' };');testLines.push(' verifier.expectedUEs = [');testLines.push.apply(testLines,createExpectedUELinesFromModel(model));testLines.push(' ];');testLines.push(' verifier.verify();');testLines.push(' });');return testLines.join('\n');}catch(error){return error;}}
+return{UserModelBuilder,createUEFinderTestCaseStringFromModel,};});'use strict';tr.exportTo('tr.ui.b',function(){function decorate(source,constr){let elements;if(typeof source==='string'){elements=Polymer.dom(tr.doc).querySelectorAll(source);}else{elements=[source];}
+for(let i=0,el;el=elements[i];i++){if(!(el instanceof constr)){constr.decorate(el);}}}
+function define(className,opt_parentConstructor,opt_tagNS){if(typeof className==='function'){throw new Error('Passing functions as className is deprecated. Please '+'use (className, opt_parentConstructor) to subclass');}
+className=className.toLowerCase();if(opt_parentConstructor&&!opt_parentConstructor.tagName){throw new Error('opt_parentConstructor was not '+'created by tr.ui.b.define');}
+let tagName=className;let tagNS=undefined;if(opt_parentConstructor){if(opt_tagNS){throw new Error('Must not specify tagNS if parentConstructor is given');}
+let parent=opt_parentConstructor;while(parent&&parent.tagName){tagName=parent.tagName;tagNS=parent.tagNS;parent=parent.parentConstructor;}}else{tagNS=opt_tagNS;}
+function f(){if(opt_parentConstructor&&f.prototype.__proto__!==opt_parentConstructor.prototype){throw new Error(className+' prototye\'s __proto__ field is messed up. '+'It MUST be the prototype of '+opt_parentConstructor.tagName);}
+let el;if(tagNS===undefined){el=tr.doc.createElement(tagName);}else{el=tr.doc.createElementNS(tagNS,tagName);}
+f.decorate.call(this,el,arguments);return el;}
+f.decorate=function(el){el.__proto__=f.prototype;el.decorate.apply(el,arguments[1]);el.constructor=f;};f.className=className;f.tagName=tagName;f.tagNS=tagNS;f.parentConstructor=(opt_parentConstructor?opt_parentConstructor:undefined);f.toString=function(){if(!f.parentConstructor){return f.tagName;}
+return f.parentConstructor.toString()+'::'+f.className;};return f;}
+function elementIsChildOf(el,potentialParent){if(el===potentialParent)return false;let cur=el;while(Polymer.dom(cur).parentNode){if(cur===potentialParent)return true;cur=Polymer.dom(cur).parentNode;}
+return false;}
+return{decorate,define,elementIsChildOf,};});'use strict';tr.exportTo('tr.b.math',function(){function Rect(){this.x=0;this.y=0;this.width=0;this.height=0;}
+Rect.fromXYWH=function(x,y,w,h){const rect=new Rect();rect.x=x;rect.y=y;rect.width=w;rect.height=h;return rect;};Rect.fromArray=function(ary){if(ary.length!==4){throw new Error('ary.length must be 4');}
+const rect=new Rect();rect.x=ary[0];rect.y=ary[1];rect.width=ary[2];rect.height=ary[3];return rect;};Rect.prototype={__proto__:Object.prototype,get left(){return this.x;},get top(){return this.y;},get right(){return this.x+this.width;},get bottom(){return this.y+this.height;},toString(){return'Rect('+this.x+', '+this.y+', '+
+this.width+', '+this.height+')';},toArray(){return[this.x,this.y,this.width,this.height];},clone(){const rect=new Rect();rect.x=this.x;rect.y=this.y;rect.width=this.width;rect.height=this.height;return rect;},enlarge(pad){const rect=new Rect();this.enlargeFast(rect,pad);return rect;},enlargeFast(out,pad){out.x=this.x-pad;out.y=this.y-pad;out.width=this.width+2*pad;out.height=this.height+2*pad;return out;},size(){return{width:this.width,height:this.height};},scale(s){const rect=new Rect();this.scaleFast(rect,s);return rect;},scaleSize(s){return Rect.fromXYWH(this.x,this.y,this.width*s,this.height*s);},scaleFast(out,s){out.x=this.x*s;out.y=this.y*s;out.width=this.width*s;out.height=this.height*s;return out;},translate(v){const rect=new Rect();this.translateFast(rect,v);return rect;},translateFast(out,v){out.x=this.x+v[0];out.y=this.x+v[1];out.width=this.width;out.height=this.height;return out;},asUVRectInside(containingRect){const rect=new Rect();rect.x=(this.x-containingRect.x)/containingRect.width;rect.y=(this.y-containingRect.y)/containingRect.height;rect.width=this.width/containingRect.width;rect.height=this.height/containingRect.height;return rect;},intersects(that){let ok=true;ok&=this.x<that.right;ok&=this.right>that.x;ok&=this.y<that.bottom;ok&=this.bottom>that.y;return ok;},equalTo(rect){return rect&&(this.x===rect.x)&&(this.y===rect.y)&&(this.width===rect.width)&&(this.height===rect.height);}};return{Rect,};});'use strict';tr.exportTo('tr.ui.b',function(){function instantiateTemplate(selector,doc){doc=doc||document;const el=Polymer.dom(doc).querySelector(selector);if(!el){throw new Error('Element not found');}
+return doc.importNode(el.content,true);}
+function windowRectForElement(element){const position=[element.offsetLeft,element.offsetTop];const size=[element.offsetWidth,element.offsetHeight];let node=element.offsetParent;while(node){position[0]+=node.offsetLeft;position[1]+=node.offsetTop;node=node.offsetParent;}
+return tr.b.math.Rect.fromXYWH(position[0],position[1],size[0],size[1]);}
+function scrollIntoViewIfNeeded(el){const pr=el.parentElement.getBoundingClientRect();const cr=el.getBoundingClientRect();if(cr.top<pr.top){el.scrollIntoView(true);}else if(cr.bottom>pr.bottom){el.scrollIntoView(false);}}
+function extractUrlString(url){let extracted=url.replace(/url\((.*)\)/,'$1');extracted=extracted.replace(/\"(.*)\"/,'$1');return extracted;}
+function toThreeDigitLocaleString(value){return value.toLocaleString(undefined,{minimumFractionDigits:3,maximumFractionDigits:3});}
+function isUnknownElementName(name){return document.createElement(name)instanceof HTMLUnknownElement;}
+return{isUnknownElementName,toThreeDigitLocaleString,instantiateTemplate,windowRectForElement,scrollIntoViewIfNeeded,extractUrlString,};});'use strict';tr.exportTo('tr.ui.b',function(){if(tr.isHeadless)return{};const THIS_DOC=document.currentScript.ownerDocument;const Overlay=tr.ui.b.define('overlay');Overlay.prototype={__proto__:HTMLDivElement.prototype,decorate(){Polymer.dom(this).classList.add('overlay');this.parentEl_=this.ownerDocument.body;this.visible_=false;this.userCanClose_=true;this.onKeyDown_=this.onKeyDown_.bind(this);this.onClick_=this.onClick_.bind(this);this.onFocusIn_=this.onFocusIn_.bind(this);this.onDocumentClick_=this.onDocumentClick_.bind(this);this.onClose_=this.onClose_.bind(this);this.addEventListener('visible-change',tr.ui.b.Overlay.prototype.onVisibleChange_.bind(this),true);const createShadowRoot=this.createShadowRoot||this.webkitCreateShadowRoot;this.shadow_=createShadowRoot.call(this);Polymer.dom(this.shadow_).appendChild(tr.ui.b.instantiateTemplate('#overlay-template',THIS_DOC));this.closeBtn_=Polymer.dom(this.shadow_).querySelector('close-button');this.closeBtn_.addEventListener('click',this.onClose_);Polymer.dom(this.shadow_).querySelector('overlay-frame').addEventListener('click',this.onClick_);this.observer_=new WebKitMutationObserver(this.didButtonBarMutate_.bind(this));this.observer_.observe(Polymer.dom(this.shadow_).querySelector('button-bar'),{childList:true});Object.defineProperty(this,'title',{get(){return Polymer.dom(Polymer.dom(this.shadow_).querySelector('title')).textContent;},set(title){Polymer.dom(Polymer.dom(this.shadow_).querySelector('title')).textContent=title;}});},set userCanClose(userCanClose){this.userCanClose_=userCanClose;this.closeBtn_.style.display=userCanClose?'block':'none';},get buttons(){return Polymer.dom(this.shadow_).querySelector('button-bar');},get visible(){return this.visible_;},set visible(newValue){if(this.visible_===newValue)return;this.visible_=newValue;const e=new tr.b.Event('visible-change');this.dispatchEvent(e);},onVisibleChange_(){this.visible_?this.show_():this.hide_();},show_(){Polymer.dom(this.parentEl_).appendChild(this);if(this.userCanClose_){this.addEventListener('keydown',this.onKeyDown_.bind(this));this.addEventListener('click',this.onDocumentClick_.bind(this));this.closeBtn_.addEventListener('click',this.onClose_);}
+this.parentEl_.addEventListener('focusin',this.onFocusIn_);this.tabIndex=0;const elList=Polymer.dom(this).querySelectorAll('button, input, list, select, a');if(elList.length>0){if(elList[0]===this.closeBtn_){if(elList.length>1)return elList[1].focus();}else{return elList[0].focus();}}
+this.focus();},hide_(){Polymer.dom(this.parentEl_).removeChild(this);this.parentEl_.removeEventListener('focusin',this.onFocusIn_);if(this.closeBtn_){this.closeBtn_.removeEventListener('click',this.onClose_);}
+document.removeEventListener('keydown',this.onKeyDown_);document.removeEventListener('click',this.onDocumentClick_);},onClose_(e){this.visible=false;if((e.type!=='keydown')||(e.type==='keydown'&&e.keyCode===27)){e.stopPropagation();}
+e.preventDefault();tr.b.dispatchSimpleEvent(this,'closeclick');},onFocusIn_(e){if(e.target===this)return;tr.b.timeout(0).then(()=>this.focus());e.preventDefault();e.stopPropagation();},didButtonBarMutate_(e){const hasButtons=this.buttons.children.length>0;if(hasButtons){Polymer.dom(this.shadow_).querySelector('button-bar').style.display=undefined;}else{Polymer.dom(this.shadow_).querySelector('button-bar').style.display='none';}},onKeyDown_(e){if(e.keyCode===9&&e.shiftKey&&e.target===this){e.preventDefault();return;}
+if(e.keyCode!==27)return;this.onClose_(e);},onClick_(e){e.stopPropagation();},onDocumentClick_(e){if(!this.userCanClose_)return;this.onClose_(e);}};Overlay.showError=function(msg,opt_err){const o=new Overlay();o.title='Error';Polymer.dom(o).textContent=msg;if(opt_err){const e=tr.b.normalizeException(opt_err);const stackDiv=document.createElement('pre');Polymer.dom(stackDiv).textContent=e.stack;stackDiv.style.paddingLeft='8px';stackDiv.style.margin=0;Polymer.dom(o).appendChild(stackDiv);}
+const b=document.createElement('button');Polymer.dom(b).textContent='OK';b.addEventListener('click',function(){o.visible=false;});Polymer.dom(o.buttons).appendChild(b);o.visible=true;return o;};return{Overlay,};});'use strict';tr.exportTo('tr.importer',function(){const Timing=tr.b.Timing;function ImportOptions(){this.shiftWorldToZero=true;this.pruneEmptyContainers=true;this.showImportWarnings=true;this.trackDetailedModelStats=false;this.customizeModelCallback=undefined;const auditorTypes=tr.c.Auditor.getAllRegisteredTypeInfos();this.auditorConstructors=auditorTypes.map(function(typeInfo){return typeInfo.constructor;});}
+function Import(model,opt_options){if(model===undefined){throw new Error('Must provide model to import into.');}
+this.importing_=false;this.importOptions_=opt_options||new ImportOptions();this.model_=model;this.model_.importOptions=this.importOptions_;}
+Import.prototype={__proto__:Object.prototype,importTraces(traces){const progressMeter={update(msg){}};tr.b.Task.RunSynchronously(this.createImportTracesTask(progressMeter,traces));},importTracesWithProgressDialog(traces){if(tr.isHeadless){throw new Error('Cannot use this method in headless mode.');}
+const overlay=tr.ui.b.Overlay();overlay.title='Importing...';overlay.userCanClose=false;overlay.msgEl=document.createElement('div');Polymer.dom(overlay).appendChild(overlay.msgEl);overlay.msgEl.style.margin='20px';overlay.update=function(msg){Polymer.dom(this.msgEl).textContent=msg;};overlay.visible=true;const promise=tr.b.Task.RunWhenIdle(this.createImportTracesTask(overlay,traces));promise.then(function(){overlay.visible=false;},function(err){overlay.visible=false;});return promise;},createImportTracesTask(progressMeter,traces){const importStartTimeMs=performance.now();if(this.importing_){throw new Error('Already importing.');}
+this.importing_=true;const importTask=new tr.b.Task(function prepareImport(){progressMeter.update('I will now import your traces for you...');},this);let lastTask=importTask;const importers=[];function addImportStage(title,callback){lastTask=lastTask.after(()=>progressMeter.update(title));lastTask.updatesUi=true;lastTask=lastTask.after(callback);}
+function addStageForEachImporter(title,callback){lastTask=lastTask.after((task)=>{importers.forEach((importer,index)=>{const uiSubTask=task.subTask(()=>{progressMeter.update(`${title} ${index + 1} of ${importers.length}`);});uiSubTask.updatesUi=true;task.subTask(()=>callback(importer));});});}
+addImportStage('Creating importers...',()=>{traces=traces.slice(0);progressMeter.update('Creating importers...');for(let i=0;i<traces.length;++i){importers.push(this.createImporter_(traces[i]));}
+for(let i=0;i<importers.length;i++){const subtraces=importers[i].extractSubtraces();for(let j=0;j<subtraces.length;j++){try{traces.push(subtraces[j]);importers.push(this.createImporter_(subtraces[j]));}catch(error){this.model_.importWarning({type:error.name,message:error.message,showToUser:true,});continue;}}}
+if(traces.length&&!this.hasEventDataDecoder_(importers)){throw new Error('Could not find an importer for the provided eventData.');}
+importers.sort(function(x,y){return x.importPriority-y.importPriority;});});addStageForEachImporter('Importing clock sync markers',importer=>importer.importClockSyncMarkers());addStageForEachImporter('Importing',importer=>importer.importEvents());if(this.importOptions_.customizeModelCallback){addImportStage('Customizing',()=>{this.importOptions_.customizeModelCallback(this.model_);});}
+addStageForEachImporter('Importing sample data',importer=>importer.importSampleData());addImportStage('Autoclosing open slices...',()=>{this.model_.autoCloseOpenSlices();this.model_.createSubSlices();});addStageForEachImporter('Finalizing import',importer=>importer.finalizeImport());addImportStage('Initializing objects (step 1/2)...',()=>this.model_.preInitializeObjects());if(this.importOptions_.pruneEmptyContainers){addImportStage('Pruning empty containers...',()=>this.model_.pruneEmptyContainers());}
+addImportStage('Merging kernel with userland...',()=>this.model_.mergeKernelWithUserland());let auditors=[];addImportStage('Adding arbitrary data to model...',()=>{auditors=this.importOptions_.auditorConstructors.map(auditorConstructor=>new auditorConstructor(this.model_));auditors.forEach((auditor)=>{auditor.runAnnotate();auditor.installUserFriendlyCategoryDriverIfNeeded();});});addImportStage('Computing final world bounds...',()=>{this.model_.computeWorldBounds(this.importOptions_.shiftWorldToZero);});addImportStage('Building flow event map...',()=>this.model_.buildFlowEventIntervalTree());addImportStage('Joining object refs...',()=>this.model_.joinRefs());addImportStage('Cleaning up undeleted objects...',()=>this.model_.cleanupUndeletedObjects());addImportStage('Sorting memory dumps...',()=>this.model_.sortMemoryDumps());addImportStage('Finalizing memory dump graphs...',()=>this.model_.finalizeMemoryGraphs());addImportStage('Initializing objects (step 2/2)...',()=>this.model_.initializeObjects());addImportStage('Building event indices...',()=>this.model_.buildEventIndices());addImportStage('Building UserModel...',()=>{const userModelBuilder=new tr.importer.UserModelBuilder(this.model_);userModelBuilder.buildUserModel();});addImportStage('Sorting user expectations...',()=>this.model_.userModel.sortExpectations());addImportStage('Running auditors...',()=>{auditors.forEach(auditor=>auditor.runAudit());});addImportStage('Updating alerts...',()=>this.model_.sortAlerts());addImportStage('Update bounds...',()=>this.model_.updateBounds());addImportStage('Looking for warnings...',()=>{if(!this.model_.isTimeHighResolution){this.model_.importWarning({type:'low_resolution_timer',message:'Trace time is low resolution, trace may be unusable.',showToUser:true});}});lastTask.after(()=>{this.importing_=false;this.model_.stats.traceImportDurationMs=performance.now()-importStartTimeMs;});return importTask;},createImporter_(eventData){const importerConstructor=tr.importer.Importer.findImporterFor(eventData);if(!importerConstructor){throw new Error('Couldn\'t create an importer for the provided '+'eventData.');}
+return new importerConstructor(this.model_,eventData);},hasEventDataDecoder_(importers){for(let i=0;i<importers.length;++i){if(!importers[i].isTraceDataContainer())return true;}
+return false;}};return{ImportOptions,Import,};});'use strict';tr.exportTo('tr.e.v8',function(){const ThreadSlice=tr.model.ThreadSlice;function V8GCStatsThreadSlice(){ThreadSlice.apply(this,arguments);this.liveObjects_=JSON.parse(this.args.live);delete this.args.live;this.deadObjects_=JSON.parse(this.args.dead);delete this.args.dead;}
+V8GCStatsThreadSlice.prototype={__proto__:ThreadSlice.prototype,get liveObjects(){return this.liveObjects_;},get deadObjects(){return this.deadObjects_;}};ThreadSlice.subTypes.register(V8GCStatsThreadSlice,{categoryParts:['disabled-by-default-v8.gc_stats'],name:'v8 gc stats slice',pluralName:'v8 gc stats slices'});return{V8GCStatsThreadSlice,};});'use strict';tr.exportTo('tr.e.v8',function(){const ThreadSlice=tr.model.ThreadSlice;function V8ICStatsThreadSlice(){ThreadSlice.apply(this,arguments);this.icStats_=undefined;if(this.args['ic-stats']){this.icStats_=this.args['ic-stats'].data;delete this.args['ic-stats'];}}
+V8ICStatsThreadSlice.prototype={__proto__:ThreadSlice.prototype,get icStats(){return this.icStats_;}};ThreadSlice.subTypes.register(V8ICStatsThreadSlice,{categoryParts:['disabled-by-default-v8.ic_stats'],name:'v8 ic stats slice',pluralName:'v8 ic stats slices'});return{V8ICStatsThreadSlice,};});'use strict';tr.exportTo('tr.e.v8',function(){const ThreadSlice=tr.model.ThreadSlice;function V8ThreadSlice(){ThreadSlice.apply(this,arguments);this.runtimeCallStats_=undefined;}
+V8ThreadSlice.prototype={__proto__:ThreadSlice.prototype,get runtimeCallStats(){if('runtime-call-stats'in this.args){this.runtimeCallStats_=this.args['runtime-call-stats'];delete this.args['runtime-call-stats'];}
+return this.runtimeCallStats_;}};ThreadSlice.subTypes.register(V8ThreadSlice,{categoryParts:['v8','disabled-by-default-v8.runtime_stats'],name:'v8 slice',pluralName:'v8 slices'});return{V8ThreadSlice,};});'use strict';tr.exportTo('tr.e.cc',function(){function PictureAsImageData(picture,errorOrImageData){this.picture_=picture;if(errorOrImageData instanceof ImageData){this.error_=undefined;this.imageData_=errorOrImageData;}else{this.error_=errorOrImageData;this.imageData_=undefined;}}
+PictureAsImageData.Pending=function(picture){return new PictureAsImageData(picture,undefined);};PictureAsImageData.prototype={get picture(){return this.picture_;},get error(){return this.error_;},get imageData(){return this.imageData_;},isPending(){return this.error_===undefined&&this.imageData_===undefined;},asCanvas(){if(!this.imageData_)return;const canvas=document.createElement('canvas');const ctx=canvas.getContext('2d');canvas.width=this.imageData_.width;canvas.height=this.imageData_.height;ctx.putImageData(this.imageData_,0,0);return canvas;}};return{PictureAsImageData,};});'use strict';tr.exportTo('tr.e.cc',function(){const convertedNameCache={};function convertNameToJSConvention(name){if(name in convertedNameCache){return convertedNameCache[name];}
+if(name[0]==='_'||name[name.length-1]==='_'){convertedNameCache[name]=name;return name;}
+const words=name.split('_');if(words.length===1){convertedNameCache[name]=words[0];return words[0];}
+for(let i=1;i<words.length;i++){words[i]=words[i][0].toUpperCase()+words[i].substring(1);}
+convertedNameCache[name]=words.join('');return convertedNameCache[name];}
+function convertObjectFieldNamesToJSConventions(object){tr.b.iterObjectFieldsRecursively(object,function(object,fieldName,fieldValue){delete object[fieldName];object[newFieldName]=fieldValue;return newFieldName;});}
+function convertQuadSuffixedTypesToQuads(object){tr.b.iterObjectFieldsRecursively(object,function(object,fieldName,fieldValue){});}
+function convertObject(object){convertObjectFieldNamesToJSConventions(object);convertQuadSuffixedTypesToQuads(object);}
+function moveRequiredFieldsFromArgsToToplevel(object,fields){for(let i=0;i<fields.length;i++){const key=fields[i];if(object.args[key]===undefined){throw Error('Expected field '+key+' not found in args');}
+if(object[key]!==undefined){throw Error('Field '+key+' already in object');}
+object[key]=object.args[key];delete object.args[key];}}
+function moveOptionalFieldsFromArgsToToplevel(object,fields){for(let i=0;i<fields.length;i++){const key=fields[i];if(object.args[key]===undefined)continue;if(object[key]!==undefined){throw Error('Field '+key+' already in object');}
+object[key]=object.args[key];delete object.args[key];}}
+function preInitializeObject(object){preInitializeObjectInner(object.args,false);}
+function preInitializeObjectInner(object,hasRecursed){if(!(object instanceof Object))return;if(object instanceof Array){for(let i=0;i<object.length;i++){preInitializeObjectInner(object[i],true);}
+return;}
+if(hasRecursed&&(object instanceof tr.model.ObjectSnapshot||object instanceof tr.model.ObjectInstance)){return;}
+for(let key in object){const newKey=convertNameToJSConvention(key);if(newKey!==key){const value=object[key];delete object[key];object[newKey]=value;key=newKey;}
+if(/Quad$/.test(key)&&!(object[key]instanceof tr.b.math.Quad)){let q;try{q=tr.b.math.Quad.from8Array(object[key]);}catch(e){}
+object[key]=q;continue;}
+if(/Rect$/.test(key)&&!(object[key]instanceof tr.b.math.Rect)){let r;try{r=tr.b.math.Rect.fromArray(object[key]);}catch(e){}
+object[key]=r;}
+preInitializeObjectInner(object[key],true);}}
+return{preInitializeObject,convertNameToJSConvention,moveRequiredFieldsFromArgsToToplevel,moveOptionalFieldsFromArgsToToplevel,};});'use strict';tr.exportTo('tr.e.cc',function(){const ObjectSnapshot=tr.model.ObjectSnapshot;const PictureCount=0;const OPS_TIMING_ITERATIONS=3;function Picture(skp64,layerRect){this.skp64_=skp64;this.layerRect_=layerRect;this.guid_=tr.b.GUID.allocateSimple();}
+Picture.prototype={get canSave(){return true;},get layerRect(){return this.layerRect_;},get guid(){return this.guid_;},getBase64SkpData(){return this.skp64_;},getOps(){if(!PictureSnapshot.CanGetOps()){console.error(PictureSnapshot.HowToEnablePictureDebugging());return undefined;}
+const ops=window.chrome.skiaBenchmarking.getOps({skp64:this.skp64_,params:{layer_rect:this.layerRect_.toArray()}});if(!ops){console.error('Failed to get picture ops.');}
+return ops;},getOpTimings(){if(!PictureSnapshot.CanGetOpTimings()){console.error(PictureSnapshot.HowToEnablePictureDebugging());return undefined;}
+const opTimings=window.chrome.skiaBenchmarking.getOpTimings({skp64:this.skp64_,params:{layer_rect:this.layerRect_.toArray()}});if(!opTimings){console.error('Failed to get picture op timings.');}
+return opTimings;},tagOpsWithTimings(ops){const opTimings=[];for(let iteration=0;iteration<OPS_TIMING_ITERATIONS;iteration++){opTimings[iteration]=this.getOpTimings();if(!opTimings[iteration]||!opTimings[iteration].cmd_times){return ops;}
+if(opTimings[iteration].cmd_times.length!==ops.length){return ops;}}
+for(let opIndex=0;opIndex<ops.length;opIndex++){let min=Number.MAX_VALUE;for(let i=0;i<OPS_TIMING_ITERATIONS;i++){min=Math.min(min,opTimings[i].cmd_times[opIndex]);}
+ops[opIndex].cmd_time=min;}
+return ops;},rasterize(params,rasterCompleteCallback){if(!PictureSnapshot.CanRasterize()||!PictureSnapshot.CanGetOps()){rasterCompleteCallback(new tr.e.cc.PictureAsImageData(this,tr.e.cc.PictureSnapshot.HowToEnablePictureDebugging()));return;}
+const raster=window.chrome.skiaBenchmarking.rasterize({skp64:this.skp64_,params:{layer_rect:this.layerRect_.toArray()}},{stop:params.stopIndex===undefined?-1:params.stopIndex,overdraw:!!params.showOverdraw,params:{}});if(raster){const canvas=document.createElement('canvas');const ctx=canvas.getContext('2d');canvas.width=raster.width;canvas.height=raster.height;const imageData=ctx.createImageData(raster.width,raster.height);imageData.data.set(new Uint8ClampedArray(raster.data));rasterCompleteCallback(new tr.e.cc.PictureAsImageData(this,imageData));}else{const error='Failed to rasterize picture. '+'Your recording may be from an old Chrome version. '+'The SkPicture format is not backward compatible.';rasterCompleteCallback(new tr.e.cc.PictureAsImageData(this,error));}}};function LayeredPicture(pictures){this.guid_=tr.b.GUID.allocateSimple();this.pictures_=pictures;this.layerRect_=undefined;}
+LayeredPicture.prototype={__proto__:Picture.prototype,get canSave(){return false;},get typeName(){return'cc::LayeredPicture';},get layerRect(){if(this.layerRect_!==undefined){return this.layerRect_;}
+this.layerRect_={x:0,y:0,width:0,height:0};for(let i=0;i<this.pictures_.length;++i){const rect=this.pictures_[i].layerRect;this.layerRect_.x=Math.min(this.layerRect_.x,rect.x);this.layerRect_.y=Math.min(this.layerRect_.y,rect.y);this.layerRect_.width=Math.max(this.layerRect_.width,rect.x+rect.width);this.layerRect_.height=Math.max(this.layerRect_.height,rect.y+rect.height);}
+return this.layerRect_;},get guid(){return this.guid_;},getBase64SkpData(){throw new Error('Not available with a LayeredPicture.');},getOps(){let ops=[];for(let i=0;i<this.pictures_.length;++i){ops=ops.concat(this.pictures_[i].getOps());}
+return ops;},getOpTimings(){const opTimings=this.pictures_[0].getOpTimings();for(let i=1;i<this.pictures_.length;++i){const timings=this.pictures_[i].getOpTimings();opTimings.cmd_times=opTimings.cmd_times.concat(timings.cmd_times);opTimings.total_time+=timings.total_time;}
+return opTimings;},tagOpsWithTimings(ops){const opTimings=[];for(let iteration=0;iteration<OPS_TIMING_ITERATIONS;iteration++){opTimings[iteration]=this.getOpTimings();if(!opTimings[iteration]||!opTimings[iteration].cmd_times){return ops;}}
+for(let opIndex=0;opIndex<ops.length;opIndex++){let min=Number.MAX_VALUE;for(let i=0;i<OPS_TIMING_ITERATIONS;i++){min=Math.min(min,opTimings[i].cmd_times[opIndex]);}
+ops[opIndex].cmd_time=min;}
+return ops;},rasterize(params,rasterCompleteCallback){this.picturesAsImageData_=[];const rasterCallback=function(pictureAsImageData){this.picturesAsImageData_.push(pictureAsImageData);if(this.picturesAsImageData_.length!==this.pictures_.length){return;}
+const canvas=document.createElement('canvas');const ctx=canvas.getContext('2d');canvas.width=this.layerRect.width;canvas.height=this.layerRect.height;for(let i=0;i<this.picturesAsImageData_.length;++i){ctx.putImageData(this.picturesAsImageData_[i].imageData,this.pictures_[i].layerRect.x,this.pictures_[i].layerRect.y);}
+this.picturesAsImageData_=[];rasterCompleteCallback(new tr.e.cc.PictureAsImageData(this,ctx.getImageData(this.layerRect.x,this.layerRect.y,this.layerRect.width,this.layerRect.height)));}.bind(this);for(let i=0;i<this.pictures_.length;++i){this.pictures_[i].rasterize(params,rasterCallback);}}};function PictureSnapshot(){ObjectSnapshot.apply(this,arguments);}
+PictureSnapshot.HasSkiaBenchmarking=function(){return tr.isExported('chrome.skiaBenchmarking');};PictureSnapshot.CanRasterize=function(){if(!PictureSnapshot.HasSkiaBenchmarking()){return false;}
+if(!window.chrome.skiaBenchmarking.rasterize){return false;}
+return true;};PictureSnapshot.CanGetOps=function(){if(!PictureSnapshot.HasSkiaBenchmarking()){return false;}
+if(!window.chrome.skiaBenchmarking.getOps){return false;}
+return true;};PictureSnapshot.CanGetOpTimings=function(){if(!PictureSnapshot.HasSkiaBenchmarking()){return false;}
+if(!window.chrome.skiaBenchmarking.getOpTimings){return false;}
+return true;};PictureSnapshot.CanGetInfo=function(){if(!PictureSnapshot.HasSkiaBenchmarking()){return false;}
+if(!window.chrome.skiaBenchmarking.getInfo){return false;}
+return true;};PictureSnapshot.HowToEnablePictureDebugging=function(){if(tr.isHeadless){return'Pictures only work in chrome';}
+const usualReason=['For pictures to show up, you need to have Chrome running with ','--enable-skia-benchmarking. Please restart chrome with this flag ','and try again.'].join('');if(!tr.isExported('global.chrome.skiaBenchmarking')){return usualReason;}
+if(!global.chrome.skiaBenchmarking.rasterize){return'Your chrome is old';}
+if(!global.chrome.skiaBenchmarking.getOps){return'Your chrome is old: skiaBenchmarking.getOps not found';}
+if(!global.chrome.skiaBenchmarking.getOpTimings){return'Your chrome is old: skiaBenchmarking.getOpTimings not found';}
+if(!global.chrome.skiaBenchmarking.getInfo){return'Your chrome is old: skiaBenchmarking.getInfo not found';}
+return'Rasterizing is on';};PictureSnapshot.prototype={__proto__:ObjectSnapshot.prototype,preInitialize(){tr.e.cc.preInitializeObject(this);this.rasterResult_=undefined;},initialize(){if(this.args.alias){this.args=this.args.alias.args;}
+if(!this.args.params.layerRect){throw new Error('Missing layer rect');}
+this.layerRect_=this.args.params.layerRect;this.picture_=new Picture(this.args.skp64,this.args.params.layerRect);},set picture(picture){this.picture_=picture;},get canSave(){return this.picture_.canSave;},get layerRect(){return this.layerRect_?this.layerRect_:this.picture_.layerRect;},get guid(){return this.picture_.guid;},getBase64SkpData(){return this.picture_.getBase64SkpData();},getOps(){return this.picture_.getOps();},getOpTimings(){return this.picture_.getOpTimings();},tagOpsWithTimings(ops){return this.picture_.tagOpsWithTimings(ops);},rasterize(params,rasterCompleteCallback){this.picture_.rasterize(params,rasterCompleteCallback);}};ObjectSnapshot.subTypes.register(PictureSnapshot,{typeNames:['cc::Picture']});return{PictureSnapshot,Picture,LayeredPicture,};});'use strict';tr.exportTo('tr.e.cc',function(){const ObjectSnapshot=tr.model.ObjectSnapshot;function DisplayItemList(skp64,layerRect){tr.e.cc.Picture.apply(this,arguments);}
+DisplayItemList.prototype={__proto__:tr.e.cc.Picture.prototype};function DisplayItemListSnapshot(){tr.e.cc.PictureSnapshot.apply(this,arguments);}
+DisplayItemListSnapshot.prototype={__proto__:tr.e.cc.PictureSnapshot.prototype,initialize(){tr.e.cc.PictureSnapshot.prototype.initialize.call(this);this.displayItems_=this.args.params.items;},get items(){return this.displayItems_;}};ObjectSnapshot.subTypes.register(DisplayItemListSnapshot,{typeNames:['cc::DisplayItemList']});return{DisplayItemListSnapshot,DisplayItemList,};});'use strict';tr.exportTo('tr.b.math',function(){function BBox2(){this.isEmpty_=true;this.min_=undefined;this.max_=undefined;}
+BBox2.prototype={__proto__:Object.prototype,reset(){this.isEmpty_=true;this.min_=undefined;this.max_=undefined;},get isEmpty(){return this.isEmpty_;},addBBox2(bbox2){if(bbox2.isEmpty)return;this.addVec2(bbox2.min_);this.addVec2(bbox2.max_);},clone(){const bbox=new BBox2();bbox.addBBox2(this);return bbox;},addXY(x,y){if(this.isEmpty_){this.max_=vec2.create();this.min_=vec2.create();vec2.set(this.max_,x,y);vec2.set(this.min_,x,y);this.isEmpty_=false;return;}
+this.max_[0]=Math.max(this.max_[0],x);this.max_[1]=Math.max(this.max_[1],y);this.min_[0]=Math.min(this.min_[0],x);this.min_[1]=Math.min(this.min_[1],y);},addVec2(value){if(this.isEmpty_){this.max_=vec2.create();this.min_=vec2.create();vec2.set(this.max_,value[0],value[1]);vec2.set(this.min_,value[0],value[1]);this.isEmpty_=false;return;}
+this.max_[0]=Math.max(this.max_[0],value[0]);this.max_[1]=Math.max(this.max_[1],value[1]);this.min_[0]=Math.min(this.min_[0],value[0]);this.min_[1]=Math.min(this.min_[1],value[1]);},addQuad(quad){this.addVec2(quad.p1);this.addVec2(quad.p2);this.addVec2(quad.p3);this.addVec2(quad.p4);},get minVec2(){if(this.isEmpty_)return undefined;return this.min_;},get maxVec2(){if(this.isEmpty_)return undefined;return this.max_;},get sizeAsVec2(){if(this.isEmpty_){throw new Error('Empty BBox2 has no size');}
+const size=vec2.create();vec2.subtract(size,this.max_,this.min_);return size;},get size(){if(this.isEmpty_){throw new Error('Empty BBox2 has no size');}
+return{width:this.max_[0]-this.min_[0],height:this.max_[1]-this.min_[1]};},get width(){if(this.isEmpty_){throw new Error('Empty BBox2 has no width');}
+return this.max_[0]-this.min_[0];},get height(){if(this.isEmpty_){throw new Error('Empty BBox2 has no width');}
+return this.max_[1]-this.min_[1];},toString(){if(this.isEmpty_)return'empty';return'min=('+this.min_[0]+','+this.min_[1]+') '+'max=('+this.max_[0]+','+this.max_[1]+')';},asRect(){return tr.b.math.Rect.fromXYWH(this.min_[0],this.min_[1],this.max_[0]-this.min_[0],this.max_[1]-this.min_[1]);}};return{BBox2,};});'use strict';tr.exportTo('tr.e.cc',function(){const constants={};constants.ACTIVE_TREE=0;constants.PENDING_TREE=1;constants.HIGH_PRIORITY_BIN=0;constants.LOW_PRIORITY_BIN=1;constants.SEND_BEGIN_FRAME_EVENT='ThreadProxy::ScheduledActionSendBeginMainFrame';constants.BEGIN_MAIN_FRAME_EVENT='ThreadProxy::BeginMainFrame';return{constants};});'use strict';tr.exportTo('tr.e.cc',function(){function Region(){this.rects=[];}
+Region.fromArray=function(array){if(array.length%4!==0){throw new Error('Array must consist be a multiple of 4 in length');}
+const r=new Region();for(let i=0;i<array.length;i+=4){r.rects.push(tr.b.math.Rect.fromXYWH(array[i],array[i+1],array[i+2],array[i+3]));}
+return r;};Region.fromArrayOrUndefined=function(array){if(array===undefined)return new Region();return Region.fromArray(array);};Region.prototype={__proto__:Region.prototype,rectIntersects(r){for(let i=0;i<this.rects.length;i++){if(this.rects[i].intersects(r))return true;}
+return false;},addRect(r){this.rects.push(r);}};return{Region,};});'use strict';tr.exportTo('tr.e.cc',function(){function TileCoverageRect(rect,tile){this.geometryRect=rect;this.tile=tile;}
+return{TileCoverageRect,};});'use strict';tr.exportTo('tr.e.cc',function(){const constants=tr.e.cc.constants;const ObjectSnapshot=tr.model.ObjectSnapshot;function LayerImplSnapshot(){ObjectSnapshot.apply(this,arguments);}
+LayerImplSnapshot.prototype={__proto__:ObjectSnapshot.prototype,preInitialize(){tr.e.cc.preInitializeObject(this);this.layerTreeImpl_=undefined;this.parentLayer=undefined;},initialize(){this.invalidation=new tr.e.cc.Region();this.annotatedInvalidation=new tr.e.cc.Region();this.unrecordedRegion=new tr.e.cc.Region();this.pictures=[];tr.e.cc.moveRequiredFieldsFromArgsToToplevel(this,['layerId','layerQuad']);tr.e.cc.moveOptionalFieldsFromArgsToToplevel(this,['children','maskLayer','replicaLayer','idealContentsScale','geometryContentsScale','layoutRects','usingGpuRasterization']);this.gpuMemoryUsageInBytes=this.args.gpuMemoryUsage;this.bounds=tr.b.math.Rect.fromXYWH(0,0,this.args.bounds.width,this.args.bounds.height);if(this.args.animationBounds){this.animationBoundsRect=tr.b.math.Rect.fromXYWH(this.args.animationBounds[0],this.args.animationBounds[1],this.args.animationBounds[3],this.args.animationBounds[4]);}
+if(this.children){for(let i=0;i<this.children.length;i++){this.children[i].parentLayer=this;}}
+if(this.maskLayer){this.maskLayer.parentLayer=this;}
+if(this.replicaLayer){this.replicaLayer.parentLayer=this;}
+if(!this.geometryContentsScale){this.geometryContentsScale=1.0;}
+if(!this.idealContentsScale){this.idealContentsScale=1.0;}
+this.touchEventHandlerRegion=tr.e.cc.Region.fromArrayOrUndefined(this.args.touchEventHandlerRegion);this.wheelEventHandlerRegion=tr.e.cc.Region.fromArrayOrUndefined(this.args.wheelEventHandlerRegion);this.nonFastScrollableRegion=tr.e.cc.Region.fromArrayOrUndefined(this.args.nonFastScrollableRegion);},get layerTreeImpl(){if(this.layerTreeImpl_){return this.layerTreeImpl_;}
+if(this.parentLayer){return this.parentLayer.layerTreeImpl;}
+return undefined;},set layerTreeImpl(layerTreeImpl){this.layerTreeImpl_=layerTreeImpl;},get activeLayer(){if(this.layerTreeImpl.whichTree===constants.ACTIVE_TREE){return this;}
+const activeTree=this.layerTreeImpl.layerTreeHostImpl.activeTree;return activeTree.findLayerWithId(this.layerId);},get pendingLayer(){if(this.layerTreeImpl.whichTree===constants.PENDING_TREE){return this;}
+const pendingTree=this.layerTreeImpl.layerTreeHostImpl.pendingTree;return pendingTree.findLayerWithId(this.layerId);}};function PictureLayerImplSnapshot(){LayerImplSnapshot.apply(this,arguments);}
+PictureLayerImplSnapshot.prototype={__proto__:LayerImplSnapshot.prototype,initialize(){LayerImplSnapshot.prototype.initialize.call(this);if(this.args.invalidation){this.invalidation=tr.e.cc.Region.fromArray(this.args.invalidation);delete this.args.invalidation;}
+if(this.args.annotatedInvalidationRects){this.annotatedInvalidation=new tr.e.cc.Region();for(let i=0;i<this.args.annotatedInvalidationRects.length;++i){const annotatedRect=this.args.annotatedInvalidationRects[i];const rect=annotatedRect.geometryRect;rect.reason=annotatedRect.reason;this.annotatedInvalidation.addRect(rect);}
+delete this.args.annotatedInvalidationRects;}
+if(this.args.unrecordedRegion){this.unrecordedRegion=tr.e.cc.Region.fromArray(this.args.unrecordedRegion);delete this.args.unrecordedRegion;}
+if(this.args.pictures){this.pictures=this.args.pictures;this.pictures.sort(function(a,b){return a.ts-b.ts;});}
+this.tileCoverageRects=[];if(this.args.coverageTiles){for(let i=0;i<this.args.coverageTiles.length;++i){const rect=this.args.coverageTiles[i].geometryRect.scale(this.idealContentsScale);const tile=this.args.coverageTiles[i].tile;this.tileCoverageRects.push(new tr.e.cc.TileCoverageRect(rect,tile));}
+delete this.args.coverageTiles;}}};ObjectSnapshot.subTypes.register(PictureLayerImplSnapshot,{typeName:'cc::PictureLayerImpl'});ObjectSnapshot.subTypes.register(LayerImplSnapshot,{typeNames:['cc::LayerImpl','cc::DelegatedRendererLayerImpl','cc::HeadsUpDisplayLayerImpl','cc::IOSurfaceLayerImpl','cc::NinePatchLayerImpl','cc::PictureImageLayerImpl','cc::ScrollbarLayerImpl','cc::SolidColorLayerImpl','cc::SolidColorScrollbarLayerImpl','cc::SurfaceLayerImpl','cc::TextureLayerImpl','cc::TiledLayerImpl','cc::VideoLayerImpl','cc::PaintedScrollbarLayerImpl','ClankPatchLayer','TabBorderLayer','CounterLayer']});return{LayerImplSnapshot,PictureLayerImplSnapshot,};});'use strict';tr.exportTo('tr.e.cc',function(){const constants=tr.e.cc.constants;const ObjectSnapshot=tr.model.ObjectSnapshot;function LayerTreeImplSnapshot(){ObjectSnapshot.apply(this,arguments);}
+LayerTreeImplSnapshot.prototype={__proto__:ObjectSnapshot.prototype,preInitialize(){tr.e.cc.preInitializeObject(this);this.layerTreeHostImpl=undefined;this.whichTree=undefined;this.sourceFrameNumber=undefined;},initialize(){tr.e.cc.moveRequiredFieldsFromArgsToToplevel(this,['renderSurfaceLayerList']);tr.e.cc.moveOptionalFieldsFromArgsToToplevel(this,['rootLayer','layers']);if(this.args.sourceFrameNumber){this.sourceFrameNumber=this.args.sourceFrameNumber;}
+if(this.rootLayer){this.rootLayer.layerTreeImpl=this;}else{for(let i=0;i<this.layers.length;i++){this.layers[i].layerTreeImpl=this;}}
+if(this.args.swapPromiseTraceIds&&this.args.swapPromiseTraceIds.length){this.tracedInputLatencies=[];const ownProcess=this.objectInstance.parent;const modelHelper=ownProcess.model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);if(modelHelper){this._initializeTracedInputLatencies(modelHelper);}}},_initializeTracedInputLatencies(modelHelper){const latencyEvents=modelHelper.browserHelper.getLatencyEventsInRange(modelHelper.model.bounds);latencyEvents.forEach(function(event){for(let i=0;i<this.args.swapPromiseTraceIds.length;i++){if(!event.args.data||!event.args.data.trace_id){continue;}
+if(parseInt(event.args.data.trace_id)===this.args.swapPromiseTraceIds[i]){this.tracedInputLatencies.push(event);}}},this);},get hasSourceFrameBeenDrawnBefore(){if(this.whichTree===tr.e.cc.constants.PENDING_TREE){return false;}
+if(this.sourceFrameNumber===undefined)return;const thisLTHI=this.layerTreeHostImpl;const thisLTHIIndex=thisLTHI.objectInstance.snapshots.indexOf(thisLTHI);const prevLTHIIndex=thisLTHIIndex-1;if(prevLTHIIndex<0||prevLTHIIndex>=thisLTHI.objectInstance.snapshots.length){return false;}
+const prevLTHI=thisLTHI.objectInstance.snapshots[prevLTHIIndex];if(!prevLTHI.activeTree)return false;if(prevLTHI.activeTree.sourceFrameNumber===undefined)return;return prevLTHI.activeTree.sourceFrameNumber===this.sourceFrameNumber;},get otherTree(){const other=this.whichTree===constants.ACTIVE_TREE?constants.PENDING_TREE:constants.ACTIVE_TREE;return this.layerTreeHostImpl.getTree(other);},get gpuMemoryUsageInBytes(){let totalBytes=0;this.iterLayers(function(layer){if(layer.gpuMemoryUsageInBytes!==undefined){totalBytes+=layer.gpuMemoryUsageInBytes;}});return totalBytes;},iterLayers(func,thisArg){const visitedLayers={};function visitLayer(layer,depth,isMask,isReplica){if(visitedLayers[layer.layerId])return;visitedLayers[layer.layerId]=true;func.call(thisArg,layer,depth,isMask,isReplica);if(layer.children){for(let i=0;i<layer.children.length;i++){visitLayer(layer.children[i],depth+1);}}
+if(layer.maskLayer){visitLayer(layer.maskLayer,depth+1,true,false);}
+if(layer.replicaLayer){visitLayer(layer.replicaLayer,depth+1,false,true);}}
+if(this.rootLayer){visitLayer(this.rootLayer,0,false,false);}else{for(let i=0;i<this.layers.length;i++){visitLayer(this.layers[i],0,false,false);}}},findLayerWithId(id){let foundLayer=undefined;function visitLayer(layer){if(layer.layerId===id){foundLayer=layer;}}
+this.iterLayers(visitLayer);return foundLayer;}};ObjectSnapshot.subTypes.register(LayerTreeImplSnapshot,{typeName:'cc::LayerTreeImpl'});return{LayerTreeImplSnapshot,};});'use strict';tr.exportTo('tr.e.cc',function(){const constants=tr.e.cc.constants;const ObjectSnapshot=tr.model.ObjectSnapshot;const ObjectInstance=tr.model.ObjectInstance;function LayerTreeHostImplSnapshot(){ObjectSnapshot.apply(this,arguments);}
+LayerTreeHostImplSnapshot.prototype={__proto__:ObjectSnapshot.prototype,preInitialize(){tr.e.cc.preInitializeObject(this);},initialize(){tr.e.cc.moveRequiredFieldsFromArgsToToplevel(this,['deviceViewportSize','activeTree']);tr.e.cc.moveOptionalFieldsFromArgsToToplevel(this,['pendingTree']);if(this.args.activeTiles!==undefined){this.activeTiles=this.args.activeTiles;delete this.args.activeTiles;}else if(this.args.tiles!==undefined){this.activeTiles=this.args.tiles;delete this.args.tiles;}
+if(!this.activeTiles){this.activeTiles=[];}
+this.activeTree.layerTreeHostImpl=this;this.activeTree.whichTree=constants.ACTIVE_TREE;if(this.pendingTree){this.pendingTree.layerTreeHostImpl=this;this.pendingTree.whichTree=constants.PENDING_TREE;}},getContentsScaleNames(){const scales={};for(let i=0;i<this.activeTiles.length;++i){const tile=this.activeTiles[i];scales[tile.contentsScale]=tile.resolution;}
+return scales;},getTree(whichTree){if(whichTree===constants.ACTIVE_TREE){return this.activeTree;}
+if(whichTree===constants.PENDING_TREE){return this.pendingTree;}
+throw new Exception('Unknown tree type + '+whichTree);},get tilesHaveGpuMemoryUsageInfo(){if(this.tilesHaveGpuMemoryUsageInfo_!==undefined){return this.tilesHaveGpuMemoryUsageInfo_;}
+for(let i=0;i<this.activeTiles.length;i++){if(this.activeTiles[i].gpuMemoryUsageInBytes===undefined){continue;}
+this.tilesHaveGpuMemoryUsageInfo_=true;return true;}
+this.tilesHaveGpuMemoryUsageInfo_=false;return false;},get gpuMemoryUsageInBytes(){if(!this.tilesHaveGpuMemoryUsageInfo)return;let usage=0;for(let i=0;i<this.activeTiles.length;i++){const u=this.activeTiles[i].gpuMemoryUsageInBytes;if(u!==undefined)usage+=u;}
+return usage;},get userFriendlyName(){let frameNumber;if(!this.activeTree){frameNumber=this.objectInstance.snapshots.indexOf(this);}else{if(this.activeTree.sourceFrameNumber===undefined){frameNumber=this.objectInstance.snapshots.indexOf(this);}else{frameNumber=this.activeTree.sourceFrameNumber;}}
+return'cc::LayerTreeHostImpl frame '+frameNumber;}};ObjectSnapshot.subTypes.register(LayerTreeHostImplSnapshot,{typeName:'cc::LayerTreeHostImpl'});function LayerTreeHostImplInstance(){ObjectInstance.apply(this,arguments);this.allLayersBBox_=undefined;}
+LayerTreeHostImplInstance.prototype={__proto__:ObjectInstance.prototype,get allContentsScales(){if(this.allContentsScales_){return this.allContentsScales_;}
+const scales={};for(const tileID in this.allTileHistories_){const tileHistory=this.allTileHistories_[tileID];scales[tileHistory.contentsScale]=true;}
+this.allContentsScales_=Object.keys(scales);return this.allContentsScales_;},get allLayersBBox(){if(this.allLayersBBox_){return this.allLayersBBox_;}
+const bbox=new tr.b.math.BBox2();function handleTree(tree){tree.renderSurfaceLayerList.forEach(function(layer){bbox.addQuad(layer.layerQuad);});}
+this.snapshots.forEach(function(lthi){handleTree(lthi.activeTree);if(lthi.pendingTree){handleTree(lthi.pendingTree);}});this.allLayersBBox_=bbox;return this.allLayersBBox_;}};ObjectInstance.subTypes.register(LayerTreeHostImplInstance,{typeName:'cc::LayerTreeHostImpl'});return{LayerTreeHostImplSnapshot,LayerTreeHostImplInstance,};});'use strict';tr.exportTo('tr.e.cc',function(){const tileTypes={highRes:'highRes',lowRes:'lowRes',extraHighRes:'extraHighRes',extraLowRes:'extraLowRes',missing:'missing',culled:'culled',solidColor:'solidColor',picture:'picture',directPicture:'directPicture',unknown:'unknown'};const tileBorder={highRes:{color:'rgba(80, 200, 200, 0.7)',width:1},lowRes:{color:'rgba(212, 83, 192, 0.7)',width:2},extraHighRes:{color:'rgba(239, 231, 20, 0.7)',width:2},extraLowRes:{color:'rgba(93, 186, 18, 0.7)',width:2},missing:{color:'rgba(255, 0, 0, 0.7)',width:1},culled:{color:'rgba(160, 100, 0, 0.8)',width:1},solidColor:{color:'rgba(128, 128, 128, 0.7)',width:1},picture:{color:'rgba(64, 64, 64, 0.7)',width:1},directPicture:{color:'rgba(127, 255, 0, 1.0)',width:1},unknown:{color:'rgba(0, 0, 0, 1.0)',width:2}};return{tileTypes,tileBorder};});'use strict';tr.exportTo('tr.e.cc',function(){const ObjectSnapshot=tr.model.ObjectSnapshot;function TileSnapshot(){ObjectSnapshot.apply(this,arguments);}
+TileSnapshot.prototype={__proto__:ObjectSnapshot.prototype,preInitialize(){tr.e.cc.preInitializeObject(this);},initialize(){tr.e.cc.moveOptionalFieldsFromArgsToToplevel(this,['layerId','contentsScale','contentRect']);if(this.args.managedState){this.resolution=this.args.managedState.resolution;this.isSolidColor=this.args.managedState.isSolidColor;this.isUsingGpuMemory=this.args.managedState.isUsingGpuMemory;this.hasResource=this.args.managedState.hasResource;this.scheduledPriority=this.args.scheduledPriority;this.gpuMemoryUsageInBytes=this.args.gpuMemoryUsage;}else{this.resolution=this.args.resolution;this.isSolidColor=this.args.drawInfo.isSolidColor;this.isUsingGpuMemory=this.args.isUsingGpuMemory;this.hasResource=this.args.hasResource;this.scheduledPriority=this.args.scheduledPriority;this.gpuMemoryUsageInBytes=this.args.gpuMemoryUsage;}
+if(this.contentRect){this.layerRect=this.contentRect.scale(1.0/this.contentsScale);}
+if(this.isSolidColor){this.type_=tr.e.cc.tileTypes.solidColor;}else if(!this.hasResource){this.type_=tr.e.cc.tileTypes.missing;}else if(this.resolution==='HIGH_RESOLUTION'){this.type_=tr.e.cc.tileTypes.highRes;}else if(this.resolution==='LOW_RESOLUTION'){this.type_=tr.e.cc.tileTypes.lowRes;}else{this.type_=tr.e.cc.tileTypes.unknown;}},getTypeForLayer(layer){let type=this.type_;if(type===tr.e.cc.tileTypes.unknown){if(this.contentsScale<layer.idealContentsScale){type=tr.e.cc.tileTypes.extraLowRes;}else if(this.contentsScale>layer.idealContentsScale){type=tr.e.cc.tileTypes.extraHighRes;}}
+return type;}};ObjectSnapshot.subTypes.register(TileSnapshot,{typeName:'cc::Tile'});return{TileSnapshot,};});'use strict';tr.exportTo('tr.ui.b',function(){const Location=tr.model.Location;function UIState(location,scaleX){this.location_=location;this.scaleX_=scaleX;}
+UIState.fromUserFriendlyString=function(model,viewport,stateString){const navByFinderPattern=/^(-?\d+(\.\d+)?)@(.+)x(\d+(\.\d+)?)$/g;const match=navByFinderPattern.exec(stateString);if(!match)return;const timestamp=parseFloat(match[1]);const stableId=match[3];const scaleX=parseFloat(match[4]);if(scaleX<=0){throw new Error('Invalid ScaleX value in UI State string.');}
+if(!viewport.containerToTrackMap.getTrackByStableId(stableId)){throw new Error('Invalid StableID given in UI State String.');}
+const loc=tr.model.Location.fromStableIdAndTimestamp(viewport,stableId,timestamp);return new UIState(loc,scaleX);};UIState.prototype={get location(){return this.location_;},get scaleX(){return this.scaleX_;},toUserFriendlyString(viewport){const timestamp=this.location_.xWorld;const stableId=this.location_.getContainingTrack(viewport).eventContainer.stableId;const scaleX=this.scaleX_;return timestamp.toFixed(5)+'@'+stableId+'x'+scaleX.toFixed(5);},toDict(){return{location:this.location_.toDict(),scaleX:this.scaleX_};}};return{UIState,};});'use strict';tr.exportTo('tr.ui.b',function(){const EventSet=tr.model.EventSet;const SelectionState=tr.model.SelectionState;function BrushingState(){this.guid_=tr.b.GUID.allocateSimple();this.selection_=new EventSet();this.findMatches_=new EventSet();this.analysisViewRelatedEvents_=new EventSet();this.analysisLinkHoveredEvents_=new EventSet();this.appliedToModel_=undefined;this.viewSpecificBrushingStates_={};}
+BrushingState.prototype={get guid(){return this.guid_;},clone(){const that=new BrushingState();that.selection_=this.selection_;that.findMatches_=this.findMatches_;that.analysisViewRelatedEvents_=this.analysisViewRelatedEvents_;that.analysisLinkHoveredEvents_=this.analysisLinkHoveredEvents_;that.viewSpecificBrushingStates_=this.viewSpecificBrushingStates_;return that;},equals(that){if(!this.selection_.equals(that.selection_)){return false;}
+if(!this.findMatches_.equals(that.findMatches_)){return false;}
+if(!this.analysisViewRelatedEvents_.equals(that.analysisViewRelatedEvents_)){return false;}
+if(!this.analysisLinkHoveredEvents_.equals(that.analysisLinkHoveredEvents_)){return false;}
+return true;},get selectionOfInterest(){if(this.selection_.length){return this.selection_;}
+if(this.highlight_.length){return this.highlight_;}
+if(this.analysisViewRelatedEvents_.length){return this.analysisViewRelatedEvents_;}
+if(this.analysisLinkHoveredEvents_.length){return this.analysisLinkHoveredEvents_;}
+return this.selection_;},get selection(){return this.selection_;},set selection(selection){if(this.appliedToModel_){throw new Error('Cannot mutate this state right now');}
+if(selection===undefined){selection=new EventSet();}
+this.selection_=selection;},get findMatches(){return this.findMatches_;},set findMatches(findMatches){if(this.appliedToModel_){throw new Error('Cannot mutate this state right now');}
+if(findMatches===undefined){findMatches=new EventSet();}
+this.findMatches_=findMatches;},get analysisViewRelatedEvents(){return this.analysisViewRelatedEvents_;},set analysisViewRelatedEvents(analysisViewRelatedEvents){if(this.appliedToModel_){throw new Error('Cannot mutate this state right now');}
+if(analysisViewRelatedEvents===undefined){analysisViewRelatedEvents=new EventSet();}
+this.analysisViewRelatedEvents_=analysisViewRelatedEvents;},get analysisLinkHoveredEvents(){return this.analysisLinkHoveredEvents_;},set analysisLinkHoveredEvents(analysisLinkHoveredEvents){if(this.appliedToModel_){throw new Error('Cannot mutate this state right now');}
+if(analysisLinkHoveredEvents===undefined){analysisLinkHoveredEvents=new EventSet();}
+this.analysisLinkHoveredEvents_=analysisLinkHoveredEvents;},get isAppliedToModel(){return this.appliedToModel_!==undefined;},get viewSpecificBrushingStates(){return this.viewSpecificBrushingStates_;},set viewSpecificBrushingStates(viewSpecificBrushingStates){this.viewSpecificBrushingStates_=viewSpecificBrushingStates;},get dimmedEvents_(){const dimmedEvents=new EventSet();dimmedEvents.addEventSet(this.findMatches);dimmedEvents.addEventSet(this.analysisViewRelatedEvents_);return dimmedEvents;},get brightenedEvents_(){const brightenedEvents=new EventSet();brightenedEvents.addEventSet(this.selection_);brightenedEvents.addEventSet(this.analysisLinkHoveredEvents_);return brightenedEvents;},applyToEventSelectionStates(model){this.appliedToModel_=model;const dimmedEvents=this.dimmedEvents_;if(model){const newDefaultState=(dimmedEvents.length?SelectionState.DIMMED0:SelectionState.NONE);const currentDefaultState=tr.b.getFirstElement(model.getDescendantEvents()).selectionState;if(currentDefaultState!==newDefaultState){for(const e of model.getDescendantEvents()){e.selectionState=newDefaultState;}}}
+let score;for(const e of dimmedEvents){score=0;if(this.findMatches_.contains(e)){score++;}
+if(this.analysisViewRelatedEvents_.contains(e)){score++;}
+e.selectionState=SelectionState.getFromDimmingLevel(score);}
+for(const e of this.brightenedEvents_){score=0;if(this.selection_.contains(e)){score++;}
+if(this.analysisLinkHoveredEvents_.contains(e)){score++;}
+e.selectionState=SelectionState.getFromBrighteningLevel(score);}},transferModelOwnershipToClone(that){if(!this.appliedToModel_){throw new Error('Not applied');}
+that.appliedToModel_=this.appliedToModel_;this.appliedToModel_=undefined;},unapplyFromEventSelectionStates(){if(!this.appliedToModel_){throw new Error('Not applied');}
+const model=this.appliedToModel_;this.appliedToModel_=undefined;const dimmedEvents=this.dimmedEvents_;const defaultState=(dimmedEvents.length?SelectionState.DIMMED0:SelectionState.NONE);for(const e of this.brightenedEvents_){e.selectionState=defaultState;}
+for(const e of dimmedEvents){e.selectionState=defaultState;}
+return defaultState;}};return{BrushingState,};});'use strict';tr.exportTo('tr.ui.b',function(){function Animation(){}
+Animation.prototype={canTakeOverFor(existingAnimation){throw new Error('Not implemented');},takeOverFor(existingAnimation,newStartTimestamp,target){throw new Error('Not implemented');},start(timestamp,target){throw new Error('Not implemented');},didStopEarly(timestamp,target,willBeTakenOverByAnotherAnimation){},tick(timestamp,target){throw new Error('Not implemented');}};return{Animation,};});'use strict';tr.exportTo('tr.ui.b',function(){function AnimationController(){tr.b.EventTarget.call(this);this.target_=undefined;this.activeAnimation_=undefined;this.tickScheduled_=false;}
+AnimationController.prototype={__proto__:tr.b.EventTarget.prototype,get target(){return this.target_;},set target(target){if(this.activeAnimation_){throw new Error('Cannot change target while animation is running.');}
+if(target.cloneAnimationState===undefined||typeof target.cloneAnimationState!=='function'){throw new Error('target must have a cloneAnimationState function');}
+this.target_=target;},get activeAnimation(){return this.activeAnimation_;},get hasActiveAnimation(){return!!this.activeAnimation_;},queueAnimation(animation,opt_now){if(this.target_===undefined){throw new Error('Cannot queue animations without a target');}
+let now;if(opt_now!==undefined){now=opt_now;}else{now=window.performance.now();}
+if(this.activeAnimation_){const done=this.activeAnimation_.tick(now,this.target_);if(done){this.activeAnimation_=undefined;}}
+if(this.activeAnimation_){if(animation.canTakeOverFor(this.activeAnimation_)){this.activeAnimation_.didStopEarly(now,this.target_,true);animation.takeOverFor(this.activeAnimation_,now,this.target_);}else{this.activeAnimation_.didStopEarly(now,this.target_,false);}}
+this.activeAnimation_=animation;this.activeAnimation_.start(now,this.target_);if(this.tickScheduled_)return;this.tickScheduled_=true;tr.b.requestAnimationFrame(this.tickActiveAnimation_,this);},cancelActiveAnimation(opt_now){if(!this.activeAnimation_)return;let now;if(opt_now!==undefined){now=opt_now;}else{now=window.performance.now();}
+this.activeAnimation_.didStopEarly(now,this.target_,false);this.activeAnimation_=undefined;},tickActiveAnimation_(frameBeginTime){this.tickScheduled_=false;if(!this.activeAnimation_)return;if(this.target_===undefined){this.activeAnimation_.didStopEarly(frameBeginTime,this.target_,false);return;}
+const oldTargetState=this.target_.cloneAnimationState();const done=this.activeAnimation_.tick(frameBeginTime,this.target_);if(done){this.activeAnimation_=undefined;}
+if(this.activeAnimation_){this.tickScheduled_=true;tr.b.requestAnimationFrame(this.tickActiveAnimation_,this);}
+if(oldTargetState){const e=new tr.b.Event('didtick');e.oldTargetState=oldTargetState;this.dispatchEvent(e,false,false);}}};return{AnimationController,};});'use strict';tr.exportTo('tr.b',function(){function Settings(){return Settings;}
+if(tr.b.unittest&&tr.b.unittest.TestRunner){tr.b.unittest.TestRunner.addEventListener('tr-unittest-will-run',function(){if(tr.isHeadless){Settings.setAlternativeStorageInstance(new HeadlessStorage());}else{Settings.setAlternativeStorageInstance(global.sessionStorage);global.sessionStorage.clear();}});}
+function SessionSettings(){return SessionSettings;}
+function AddStaticStorageFunctionsToClass_(inputClass,storage){inputClass.storage_=storage;inputClass.get=function(key,opt_default,opt_namespace){key=inputClass.namespace_(key,opt_namespace);const rawVal=inputClass.storage_.getItem(key);if(rawVal===null||rawVal===undefined){return opt_default;}
+try{return JSON.parse(rawVal).value;}catch(e){inputClass.storage_.removeItem(key);return opt_default;}};inputClass.set=function(key,value,opt_namespace){if(value===undefined){throw new Error('Settings.set: value must not be undefined');}
+const v=JSON.stringify({value});inputClass.storage_.setItem(inputClass.namespace_(key,opt_namespace),v);};inputClass.keys=function(opt_namespace){const result=[];opt_namespace=opt_namespace||'';for(let i=0;i<inputClass.storage_.length;i++){const key=inputClass.storage_.key(i);if(inputClass.isnamespaced_(key,opt_namespace)){result.push(inputClass.unnamespace_(key,opt_namespace));}}
+return result;};inputClass.isnamespaced_=function(key,opt_namespace){return key.indexOf(inputClass.normalize_(opt_namespace))===0;};inputClass.namespace_=function(key,opt_namespace){return inputClass.normalize_(opt_namespace)+key;};inputClass.unnamespace_=function(key,opt_namespace){return key.replace(inputClass.normalize_(opt_namespace),'');};inputClass.normalize_=function(opt_namespace){return inputClass.NAMESPACE+(opt_namespace?opt_namespace+'.':'');};inputClass.setAlternativeStorageInstance=function(instance){inputClass.storage_=instance;};inputClass.getAlternativeStorageInstance=function(){if(!tr.isHeadless&&inputClass.storage_===localStorage){return undefined;}
+return inputClass.storage_;};inputClass.NAMESPACE='trace-viewer';}
+function HeadlessStorage(){this.length=0;this.hasItem_={};this.items_={};this.itemsAsArray_=undefined;}
+HeadlessStorage.prototype={key(index){return this.itemsAsArray[index];},get itemsAsArray(){if(this.itemsAsArray_!==undefined){return this.itemsAsArray_;}
+const itemsAsArray=[];for(const k in this.items_){itemsAsArray.push(k);}
+this.itemsAsArray_=itemsAsArray;return this.itemsAsArray_;},getItem(key){if(!this.hasItem_[key]){return null;}
+return this.items_[key];},removeItem(key){if(!this.hasItem_[key]){return;}
+const value=this.items_[key];delete this.hasItem_[key];delete this.items_[key];this.length--;this.itemsAsArray_=undefined;return value;},setItem(key,value){if(this.hasItem_[key]){this.items_[key]=value;return;}
+this.items_[key]=value;this.hasItem_[key]=true;this.length++;this.itemsAsArray_=undefined;return value;}};if(tr.isHeadless){AddStaticStorageFunctionsToClass_(Settings,new HeadlessStorage());AddStaticStorageFunctionsToClass_(SessionSettings,new HeadlessStorage());}else{AddStaticStorageFunctionsToClass_(Settings,localStorage);AddStaticStorageFunctionsToClass_(SessionSettings,sessionStorage);}
+return{Settings,SessionSettings,};});'use strict';tr.exportTo('tr.ui.b',function(){function createSpan(opt_dictionary){let ownerDocument=document;if(opt_dictionary&&opt_dictionary.ownerDocument){ownerDocument=opt_dictionary.ownerDocument;}
+const spanEl=ownerDocument.createElement('span');if(opt_dictionary){if(opt_dictionary.className){spanEl.className=opt_dictionary.className;}
+if(opt_dictionary.textContent){Polymer.dom(spanEl).textContent=opt_dictionary.textContent;}
+if(opt_dictionary.tooltip){spanEl.title=opt_dictionary.tooltip;}
+if(opt_dictionary.parent){Polymer.dom(opt_dictionary.parent).appendChild(spanEl);}
+if(opt_dictionary.bold){spanEl.style.fontWeight='bold';}
+if(opt_dictionary.italic){spanEl.style.fontStyle='italic';}
+if(opt_dictionary.marginLeft){spanEl.style.marginLeft=opt_dictionary.marginLeft;}
+if(opt_dictionary.marginRight){spanEl.style.marginRight=opt_dictionary.marginRight;}
+if(opt_dictionary.backgroundColor){spanEl.style.backgroundColor=opt_dictionary.backgroundColor;}
+if(opt_dictionary.color){spanEl.style.color=opt_dictionary.color;}}
+return spanEl;}
+function createLink(opt_args){let ownerDocument=document;if(opt_args&&opt_args.ownerDocument){ownerDocument=opt_args.ownerDocument;}
+const linkEl=ownerDocument.createElement('a');if(opt_args){if(opt_args.href)linkEl.href=opt_args.href;if(opt_args.tooltip)linkEl.title=opt_args.tooltip;if(opt_args.color)linkEl.style.color=opt_args.color;if(opt_args.bold)linkEl.style.fontWeight='bold';if(opt_args.italic)linkEl.style.fontStyle='italic';if(opt_args.className)linkEl.className=opt_args.className;if(opt_args.parent)Polymer.dom(opt_args.parent).appendChild(linkEl);if(opt_args.marginLeft)linkEl.style.marginLeft=opt_args.marginLeft;if(opt_args.marginRight)linkEl.style.marginRight=opt_args.marginRight;if(opt_args.backgroundColor){linkEl.style.backgroundColor=opt_args.backgroundColor;}
+if(opt_args.textContent){Polymer.dom(linkEl).textContent=opt_args.textContent;}}
+return linkEl;}
+function createDiv(opt_dictionary){const divEl=document.createElement('div');if(opt_dictionary){if(opt_dictionary.className){divEl.className=opt_dictionary.className;}
+if(opt_dictionary.parent){Polymer.dom(opt_dictionary.parent).appendChild(divEl);}
+if(opt_dictionary.textContent){Polymer.dom(divEl).textContent=opt_dictionary.textContent;}
+if(opt_dictionary.maxWidth){divEl.style.maxWidth=opt_dictionary.maxWidth;}}
+return divEl;}
+function createScopedStyle(styleContent){const styleEl=document.createElement('style');styleEl.scoped=true;Polymer.dom(styleEl).innerHTML=styleContent;return styleEl;}
+function valuesEqual(a,b){if(a instanceof Array&&b instanceof Array){return a.length===b.length&&JSON.stringify(a)===JSON.stringify(b);}
+return a===b;}
+function createSelector(targetEl,targetElProperty,settingsKey,defaultValue,items,opt_namespace){let defaultValueIndex;for(let i=0;i<items.length;i++){const item=items[i];if(valuesEqual(item.value,defaultValue)){defaultValueIndex=i;break;}}
+if(defaultValueIndex===undefined){throw new Error('defaultValue must be in the items list');}
+const selectorEl=document.createElement('select');selectorEl.addEventListener('change',onChange);for(let i=0;i<items.length;i++){const item=items[i];const optionEl=document.createElement('option');Polymer.dom(optionEl).textContent=item.label;optionEl.targetPropertyValue=item.value;optionEl.item=item;Polymer.dom(selectorEl).appendChild(optionEl);}
+function onChange(e){const value=selectorEl.selectedOptions[0].targetPropertyValue;tr.b.Settings.set(settingsKey,value,opt_namespace);targetEl[targetElProperty]=value;}
+const oldSetter=targetEl.__lookupSetter__('selectedIndex');selectorEl.__defineGetter__('selectedValue',function(v){return selectorEl.children[selectorEl.selectedIndex].targetPropertyValue;});selectorEl.__defineGetter__('selectedItem',function(v){return selectorEl.children[selectorEl.selectedIndex].item;});selectorEl.__defineSetter__('selectedValue',function(v){for(let i=0;i<selectorEl.children.length;i++){const value=selectorEl.children[i].targetPropertyValue;if(valuesEqual(value,v)){const changed=selectorEl.selectedIndex!==i;if(changed){selectorEl.selectedIndex=i;onChange();}
+return;}}
+throw new Error('Not a valid value');});const initialValue=tr.b.Settings.get(settingsKey,defaultValue,opt_namespace);let didSet=false;for(let i=0;i<selectorEl.children.length;i++){if(valuesEqual(selectorEl.children[i].targetPropertyValue,initialValue)){didSet=true;targetEl[targetElProperty]=initialValue;selectorEl.selectedIndex=i;break;}}
+if(!didSet){selectorEl.selectedIndex=defaultValueIndex;targetEl[targetElProperty]=defaultValue;}
+return selectorEl;}
+function createEditCategorySpan(optionGroupEl,targetEl){const spanEl=createSpan({className:'edit-categories'});Polymer.dom(spanEl).textContent='Edit categories';Polymer.dom(spanEl).classList.add('labeled-option');spanEl.addEventListener('click',function(){targetEl.onClickEditCategories();});return spanEl;}
+function createOptionGroup(targetEl,targetElProperty,settingsKey,defaultValue,items){function onChange(){let value=[];if(this.value.length){value=this.value.split(',');}
+tr.b.Settings.set(settingsKey,value);targetEl[targetElProperty]=value;}
+const optionGroupEl=createSpan({className:'labeled-option-group'});const initialValue=tr.b.Settings.get(settingsKey,defaultValue);for(let i=0;i<items.length;++i){const item=items[i];const id='category-preset-'+item.label.replace(/ /g,'-');const radioEl=document.createElement('input');radioEl.type='radio';Polymer.dom(radioEl).setAttribute('id',id);Polymer.dom(radioEl).setAttribute('name','category-presets-group');Polymer.dom(radioEl).setAttribute('value',item.value);radioEl.addEventListener('change',onChange.bind(radioEl,targetEl,targetElProperty,settingsKey));if(valuesEqual(initialValue,item.value)){radioEl.checked=true;}
+const labelEl=document.createElement('label');Polymer.dom(labelEl).textContent=item.label;Polymer.dom(labelEl).setAttribute('for',id);const spanEl=createSpan({className:'labeled-option'});Polymer.dom(spanEl).appendChild(radioEl);Polymer.dom(spanEl).appendChild(labelEl);spanEl.__defineSetter__('checked',function(opt_bool){const changed=radioEl.checked!==(!!opt_bool);if(!changed)return;radioEl.checked=!!opt_bool;onChange();});spanEl.__defineGetter__('checked',function(){return radioEl.checked;});Polymer.dom(optionGroupEl).appendChild(spanEl);}
+Polymer.dom(optionGroupEl).appendChild(createEditCategorySpan(optionGroupEl,targetEl));if(!initialValue.length){Polymer.dom(optionGroupEl).classList.add('categories-expanded');}
+targetEl[targetElProperty]=initialValue;return optionGroupEl;}
+let nextCheckboxId=1;function createCheckBox(targetEl,targetElProperty,settingsKey,defaultValue,label,opt_changeCb){const buttonEl=document.createElement('input');buttonEl.type='checkbox';let initialValue=defaultValue;if(settingsKey!==undefined){initialValue=tr.b.Settings.get(settingsKey,defaultValue);buttonEl.checked=!!initialValue;}
+if(targetEl){targetEl[targetElProperty]=initialValue;}
+function onChange(){if(settingsKey!==undefined){tr.b.Settings.set(settingsKey,buttonEl.checked);}
+if(targetEl){targetEl[targetElProperty]=buttonEl.checked;}
+if(opt_changeCb){opt_changeCb.call();}}
+buttonEl.addEventListener('change',onChange);const id='#checkbox-'+nextCheckboxId++;const spanEl=createSpan({className:'labeled-checkbox'});Polymer.dom(buttonEl).setAttribute('id',id);const labelEl=document.createElement('label');Polymer.dom(labelEl).textContent=label;Polymer.dom(labelEl).setAttribute('for',id);Polymer.dom(spanEl).appendChild(buttonEl);Polymer.dom(spanEl).appendChild(labelEl);spanEl.__defineSetter__('checked',function(opt_bool){const changed=buttonEl.checked!==(!!opt_bool);if(!changed)return;buttonEl.checked=!!opt_bool;onChange();});spanEl.__defineGetter__('checked',function(){return buttonEl.checked;});return spanEl;}
+function createButton(label,opt_callback,opt_this){const buttonEl=document.createElement('input');buttonEl.type='button';buttonEl.value=label;function onClick(){opt_callback.call(opt_this||buttonEl);}
+if(opt_callback){buttonEl.addEventListener('click',onClick);}
+return buttonEl;}
+function createTextInput(targetEl,targetElProperty,settingsKey,defaultValue){const initialValue=tr.b.Settings.get(settingsKey,defaultValue);const el=document.createElement('input');el.type='text';function onChange(e){tr.b.Settings.set(settingsKey,el.value);targetEl[targetElProperty]=el.value;}
+el.addEventListener('input',onChange);el.value=initialValue;targetEl[targetElProperty]=initialValue;return el;}
+function isElementAttachedToDocument(el){let cur=el;while(Polymer.dom(cur).parentNode){cur=Polymer.dom(cur).parentNode;}
+return(cur===el.ownerDocument||cur.nodeName==='#document-fragment');}
+function asHTMLOrTextNode(value,opt_ownerDocument){if(value instanceof Node){return value;}
+const ownerDocument=opt_ownerDocument||document;return ownerDocument.createTextNode(value);}
+return{createSpan,createLink,createDiv,createScopedStyle,createSelector,createOptionGroup,createCheckBox,createButton,createTextInput,isElementAttachedToDocument,asHTMLOrTextNode,};});'use strict';tr.exportTo('tr.ui.b',function(){const elidedTitleCacheDict=new Map();const elidedTitleCache=new ElidedTitleCache();function ElidedTitleCache(){this.textWidthMap=new Map();}
+ElidedTitleCache.prototype={get(ctx,pixWidth,title,width,sliceDuration){let elidedDict=elidedTitleCacheDict.get(title);if(!elidedDict){elidedDict=new Map();elidedTitleCacheDict.set(title,elidedDict);}
+let elidedDictForPixWidth=elidedDict.get(pixWidth);if(!elidedDictForPixWidth){elidedDict.set(pixWidth,new Map());elidedDictForPixWidth=elidedDict.get(pixWidth);}
+let stringWidthPair=elidedDictForPixWidth.get(sliceDuration);if(stringWidthPair===undefined){let newtitle=title;let elided=false;while(this.labelWidthWorld(ctx,newtitle,pixWidth)>sliceDuration){if(newtitle.length*0.75<1)break;newtitle=newtitle.substring(0,newtitle.length*0.75);elided=true;}
+if(elided&&newtitle.length>3){newtitle=newtitle.substring(0,newtitle.length-3)+'...';}
+stringWidthPair=new ElidedStringWidthPair(newtitle,this.labelWidth(ctx,newtitle));elidedDictForPixWidth.set(sliceDuration,stringWidthPair);}
+return stringWidthPair;},quickMeasureText_(ctx,text){let w=this.textWidthMap.get(text);if(!w){w=ctx.measureText(text).width;this.textWidthMap.set(text,w);}
+return w;},labelWidth(ctx,title){return this.quickMeasureText_(ctx,title)+2;},labelWidthWorld(ctx,title,pixWidth){return this.labelWidth(ctx,title)*pixWidth;}};function ElidedStringWidthPair(string,width){this.string=string;this.width=width;}
+return{ElidedTitleCache,};});'use strict';tr.exportTo('tr.ui.b',function(){const ColorScheme=tr.b.ColorScheme;const colors=ColorScheme.colors;const colorsAsStrings=ColorScheme.colorsAsStrings;const SelectionState=tr.model.SelectionState;const EventPresenter={getSelectableItemColorAsString(item){const offset=this.getColorIdOffset_(item);const colorId=ColorScheme.getVariantColorId(item.colorId,offset);return colorsAsStrings[colorId];},getColorIdOffset_(event){return event.selectionState;},getTextColor(event){if(event.selectionState===SelectionState.DIMMED){return'rgb(60,60,60)';}
+return'rgb(0,0,0)';},getSliceColorId(slice){const offset=this.getColorIdOffset_(slice);return ColorScheme.getVariantColorId(slice.colorId,offset);},getSliceAlpha(slice,async){let alpha=1;if(async){alpha*=0.3;}
+return alpha;},getInstantSliceColor(instant){const offset=this.getColorIdOffset_(instant);const colorId=ColorScheme.getVariantColorId(instant.colorId,offset);return colors[colorId].toStringWithAlphaOverride(1.0);},getObjectInstanceColor(instance){const offset=this.getColorIdOffset_(instance);const colorId=ColorScheme.getVariantColorId(instance.colorId,offset);return colors[colorId].toStringWithAlphaOverride(0.25);},getObjectSnapshotColor(snapshot){const offset=this.getColorIdOffset_(snapshot);let colorId=snapshot.objectInstance.colorId;colorId=ColorScheme.getVariantColorId(colorId,offset);return colors[colorId];},getCounterSeriesColor(colorId,selectionState,opt_alphaMultiplier){const event={selectionState};const offset=this.getColorIdOffset_(event);const c=colors[ColorScheme.getVariantColorId(colorId,offset)];return c.toStringWithAlphaOverride(opt_alphaMultiplier!==undefined?opt_alphaMultiplier:1.0);},getBarSnapshotColor(snapshot,offset){const snapshotOffset=this.getColorIdOffset_(snapshot);let colorId=snapshot.objectInstance.colorId;colorId=ColorScheme.getAnotherColorId(colorId,offset);colorId=ColorScheme.getVariantColorId(colorId,snapshotOffset);return colors[colorId].toStringWithAlphaOverride(1.0);}};return{EventPresenter,};});'use strict';tr.exportTo('tr.ui.b',function(){const elidedTitleCache=new tr.ui.b.ElidedTitleCache();const ColorScheme=tr.b.ColorScheme;const colorsAsStrings=ColorScheme.colorsAsStrings;const EventPresenter=tr.ui.b.EventPresenter;const blackColorId=ColorScheme.getColorIdForReservedName('black');const THIN_SLICE_HEIGHT=4;const SLICE_WAITING_WIDTH_DRAW_THRESHOLD=3;const SLICE_ACTIVE_WIDTH_DRAW_THRESHOLD=1;const SHOULD_ELIDE_TEXT=true;function drawLine(ctx,x1,y1,x2,y2){ctx.moveTo(x1,y1);ctx.lineTo(x2,y2);}
+function drawTriangle(ctx,x1,y1,x2,y2,x3,y3){ctx.beginPath();ctx.moveTo(x1,y1);ctx.lineTo(x2,y2);ctx.lineTo(x3,y3);ctx.closePath();}
+function drawArrow(ctx,x1,y1,x2,y2,arrowLength,arrowWidth){const dx=x2-x1;const dy=y2-y1;const len=Math.sqrt(dx*dx+dy*dy);const perc=(len-arrowLength)/len;const bx=x1+perc*dx;const by=y1+perc*dy;const ux=dx/len;const uy=dy/len;const ax=uy*arrowWidth;const ay=-ux*arrowWidth;ctx.beginPath();drawLine(ctx,x1,y1,x2,y2);ctx.stroke();drawTriangle(ctx,bx+ax,by+ay,x2,y2,bx-ax,by-ay);ctx.fill();}
+function drawSlices(ctx,dt,viewLWorld,viewRWorld,viewHeight,slices,async){const pixelRatio=window.devicePixelRatio||1;const pixWidth=dt.xViewVectorToWorld(1);const height=viewHeight*pixelRatio;let darkRectHeight=THIN_SLICE_HEIGHT*pixelRatio;if(height<darkRectHeight){darkRectHeight=0;}
+const lightRectHeight=height-darkRectHeight;ctx.save();dt.applyTransformToCanvas(ctx);const rect=new tr.ui.b.FastRectRenderer(ctx,2*pixWidth,2*pixWidth,colorsAsStrings);rect.setYandH(0,height);const lowSlice=tr.b.math.findLowIndexInSortedArray(slices,function(slice){return slice.start+slice.duration;},viewLWorld);let hadTopLevel=false;for(let i=lowSlice;i<slices.length;++i){const slice=slices[i];const x=slice.start;if(x>viewRWorld)break;let w=pixWidth;if(slice.duration>0){w=Math.max(slice.duration,0.000001);if(w<pixWidth){w=pixWidth;}}
+const colorId=EventPresenter.getSliceColorId(slice);const alpha=EventPresenter.getSliceAlpha(slice,async);const lightAlpha=alpha*0.70;if(async&&slice.isTopLevel){rect.setYandH(3,height-3);hadTopLevel=true;}else{rect.setYandH(0,height);}
+if(!slice.cpuDuration){rect.fillRect(x,w,colorId,alpha);continue;}
+let activeWidth=w*(slice.cpuDuration/slice.duration);let waitingWidth=w-activeWidth;if(activeWidth<SLICE_ACTIVE_WIDTH_DRAW_THRESHOLD*pixWidth){activeWidth=0;waitingWidth=w;}
+if(waitingWidth<SLICE_WAITING_WIDTH_DRAW_THRESHOLD*pixWidth){activeWidth=w;waitingWidth=0;}
+if(activeWidth>0){rect.fillRect(x,activeWidth,colorId,alpha);}
+if(waitingWidth>0){rect.setYandH(0,lightRectHeight);rect.fillRect(x+activeWidth-pixWidth,waitingWidth+pixWidth,colorId,lightAlpha);rect.setYandH(lightRectHeight,darkRectHeight);rect.fillRect(x+activeWidth-pixWidth,waitingWidth+pixWidth,colorId,alpha);rect.setYandH(0,height);}}
+rect.flush();if(async&&hadTopLevel){rect.setYandH(2,1);for(let i=lowSlice;i<slices.length;++i){const slice=slices[i];const x=slice.start;if(x>viewRWorld)break;if(!slice.isTopLevel)continue;let w=pixWidth;if(slice.duration>0){w=Math.max(slice.duration,0.000001);if(w<pixWidth){w=pixWidth;}}
+rect.fillRect(x,w,blackColorId,0.7);}
+rect.flush();}
+ctx.restore();}
+function drawInstantSlicesAsLines(ctx,dt,viewLWorld,viewRWorld,viewHeight,slices,lineWidthInPixels){const pixelRatio=window.devicePixelRatio||1;const height=viewHeight*pixelRatio;const pixWidth=dt.xViewVectorToWorld(1);ctx.save();ctx.lineWidth=pixWidth*lineWidthInPixels*pixelRatio;dt.applyTransformToCanvas(ctx);ctx.beginPath();const lowSlice=tr.b.math.findLowIndexInSortedArray(slices,function(slice){return slice.start;},viewLWorld);for(let i=lowSlice;i<slices.length;++i){const slice=slices[i];const x=slice.start;if(x>viewRWorld)break;ctx.strokeStyle=EventPresenter.getInstantSliceColor(slice);ctx.beginPath();ctx.moveTo(x,0);ctx.lineTo(x,height);ctx.stroke();}
+ctx.restore();}
+function drawLabels(ctx,dt,viewLWorld,viewRWorld,slices,async,fontSize,yOffset){const pixelRatio=window.devicePixelRatio||1;const pixWidth=dt.xViewVectorToWorld(1);ctx.save();ctx.textAlign='center';ctx.textBaseline='top';ctx.font=(fontSize*pixelRatio)+'px sans-serif';if(async){ctx.font='italic '+ctx.font;}
+const cY=yOffset*pixelRatio;const lowSlice=tr.b.math.findLowIndexInSortedArray(slices,function(slice){return slice.start+slice.duration;},viewLWorld);const quickDiscardThresshold=pixWidth*20;for(let i=lowSlice;i<slices.length;++i){const slice=slices[i];if(slice.start>viewRWorld)break;if(slice.duration<=quickDiscardThresshold)continue;const title=slice.title+
+(slice.didNotFinish?' (Did Not Finish)':'');let drawnTitle=title;let drawnWidth=elidedTitleCache.labelWidth(ctx,drawnTitle);const fullLabelWidth=elidedTitleCache.labelWidthWorld(ctx,drawnTitle,pixWidth);if(SHOULD_ELIDE_TEXT&&fullLabelWidth>slice.duration){const elidedValues=elidedTitleCache.get(ctx,pixWidth,drawnTitle,drawnWidth,slice.duration);drawnTitle=elidedValues.string;drawnWidth=elidedValues.width;}
+if(drawnWidth*pixWidth<slice.duration){ctx.fillStyle=EventPresenter.getTextColor(slice);const cX=dt.xWorldToView(slice.start+0.5*slice.duration);ctx.fillText(drawnTitle,cX,cY,drawnWidth);}}
+ctx.restore();}
+return{drawSlices,drawInstantSlicesAsLines,drawLabels,drawLine,drawTriangle,drawArrow,elidedTitleCache_:elidedTitleCache,THIN_SLICE_HEIGHT,};});'use strict';tr.exportTo('tr.ui',function(){function TimelineDisplayTransform(opt_that){if(opt_that){this.set(opt_that);return;}
+this.scaleX=1;this.panX=0;this.panY=0;}
+TimelineDisplayTransform.prototype={set(that){this.scaleX=that.scaleX;this.panX=that.panX;this.panY=that.panY;},clone(){return new TimelineDisplayTransform(this);},equals(that){let eq=true;if(that===undefined||that===null){return false;}
+eq&=this.panX===that.panX;eq&=this.panY===that.panY;eq&=this.scaleX===that.scaleX;return!!eq;},almostEquals(that){let eq=true;if(that===undefined||that===null){return false;}
+eq&=Math.abs(this.panX-that.panX)<0.001;eq&=Math.abs(this.panY-that.panY)<0.001;eq&=Math.abs(this.scaleX-that.scaleX)<0.001;return!!eq;},incrementPanXInViewUnits(xDeltaView){this.panX+=this.xViewVectorToWorld(xDeltaView);},xPanWorldPosToViewPos(worldX,viewX,viewWidth){if(typeof viewX==='string'){if(viewX==='left'){viewX=0;}else if(viewX==='center'){viewX=viewWidth/2;}else if(viewX==='right'){viewX=viewWidth-1;}else{throw new Error('viewX must be left|center|right or number.');}}
+this.panX=(viewX/this.scaleX)-worldX;},xPanWorldBoundsIntoView(worldMin,worldMax,viewWidth){if(this.xWorldToView(worldMin)<0){this.xPanWorldPosToViewPos(worldMin,'left',viewWidth);}else if(this.xWorldToView(worldMax)>viewWidth){this.xPanWorldPosToViewPos(worldMax,'right',viewWidth);}},xSetWorldBounds(worldMin,worldMax,viewWidth){const worldWidth=worldMax-worldMin;const scaleX=viewWidth/worldWidth;const panX=-worldMin;this.setPanAndScale(panX,scaleX);},setPanAndScale(p,s){this.scaleX=s;this.panX=p;},xWorldToView(x){return(x+this.panX)*this.scaleX;},xWorldVectorToView(x){return x*this.scaleX;},xViewToWorld(x){return(x/this.scaleX)-this.panX;},xViewVectorToWorld(x){return x/this.scaleX;},applyTransformToCanvas(ctx){ctx.transform(this.scaleX,0,0,1,this.panX*this.scaleX,0);}};return{TimelineDisplayTransform,};});'use strict';tr.exportTo('tr.ui',function(){function SnapIndicator(y,height){this.y=y;this.height=height;}
+function TimelineInterestRange(vp){this.viewport_=vp;this.range_=new tr.b.math.Range();this.leftSelected_=false;this.rightSelected_=false;this.leftSnapIndicator_=undefined;this.rightSnapIndicator_=undefined;}
+TimelineInterestRange.prototype={get isEmpty(){return this.range_.isEmpty;},reset(){this.range_.reset();this.leftSelected_=false;this.rightSelected_=false;this.leftSnapIndicator_=undefined;this.rightSnapIndicator_=undefined;this.viewport_.dispatchChangeEvent();},get min(){return this.range_.min;},set min(min){this.range_.min=min;this.viewport_.dispatchChangeEvent();},get max(){return this.range_.max;},set max(max){this.range_.max=max;this.viewport_.dispatchChangeEvent();},set(range){this.range_.reset();this.range_.addRange(range);this.viewport_.dispatchChangeEvent();},setMinAndMax(min,max){this.range_.min=min;this.range_.max=max;this.viewport_.dispatchChangeEvent();},get range(){return this.range_.range;},asRangeObject(){const range=new tr.b.math.Range();range.addRange(this.range_);return range;},get leftSelected(){return this.leftSelected_;},set leftSelected(leftSelected){if(this.leftSelected_===leftSelected)return;this.leftSelected_=leftSelected;this.viewport_.dispatchChangeEvent();},get rightSelected(){return this.rightSelected_;},set rightSelected(rightSelected){if(this.rightSelected_===rightSelected)return;this.rightSelected_=rightSelected;this.viewport_.dispatchChangeEvent();},get leftSnapIndicator(){return this.leftSnapIndicator_;},set leftSnapIndicator(leftSnapIndicator){this.leftSnapIndicator_=leftSnapIndicator;this.viewport_.dispatchChangeEvent();},get rightSnapIndicator(){return this.rightSnapIndicator_;},set rightSnapIndicator(rightSnapIndicator){this.rightSnapIndicator_=rightSnapIndicator;this.viewport_.dispatchChangeEvent();},draw(ctx,viewLWorld,viewRWorld){if(this.range_.isEmpty)return;const dt=this.viewport_.currentDisplayTransform;const markerLWorld=this.min;const markerRWorld=this.max;const markerLView=Math.round(dt.xWorldToView(markerLWorld));const markerRView=Math.round(dt.xWorldToView(markerRWorld));ctx.fillStyle='rgba(0, 0, 0, 0.2)';if(markerLWorld>viewLWorld){ctx.fillRect(dt.xWorldToView(viewLWorld),0,markerLView,ctx.canvas.height);}
+if(markerRWorld<viewRWorld){ctx.fillRect(markerRView,0,dt.xWorldToView(viewRWorld),ctx.canvas.height);}
+const pixelRatio=window.devicePixelRatio||1;ctx.lineWidth=Math.round(pixelRatio);if(this.range_.range>0){this.drawLine_(ctx,viewLWorld,viewRWorld,ctx.canvas.height,this.min,this.leftSelected_);this.drawLine_(ctx,viewLWorld,viewRWorld,ctx.canvas.height,this.max,this.rightSelected_);}else{this.drawLine_(ctx,viewLWorld,viewRWorld,ctx.canvas.height,this.min,this.leftSelected_||this.rightSelected_);}
+ctx.lineWidth=1;},drawLine_(ctx,viewLWorld,viewRWorld,height,ts,selected){if(ts<viewLWorld||ts>=viewRWorld)return;const dt=this.viewport_.currentDisplayTransform;const viewX=Math.round(dt.xWorldToView(ts));ctx.save();ctx.translate((Math.round(ctx.lineWidth)%2)/2,0);ctx.beginPath();tr.ui.b.drawLine(ctx,viewX,0,viewX,height);if(selected){ctx.strokeStyle='rgb(255, 0, 0)';}else{ctx.strokeStyle='rgb(0, 0, 0)';}
+ctx.stroke();ctx.restore();},drawIndicators(ctx,viewLWorld,viewRWorld){if(this.leftSnapIndicator_){this.drawIndicator_(ctx,viewLWorld,viewRWorld,this.range_.min,this.leftSnapIndicator_,this.leftSelected_);}
+if(this.rightSnapIndicator_){this.drawIndicator_(ctx,viewLWorld,viewRWorld,this.range_.max,this.rightSnapIndicator_,this.rightSelected_);}},drawIndicator_(ctx,viewLWorld,viewRWorld,xWorld,si,selected){const dt=this.viewport_.currentDisplayTransform;const viewX=Math.round(dt.xWorldToView(xWorld));ctx.save();ctx.translate((Math.round(ctx.lineWidth)%2)/2,0);const pixelRatio=window.devicePixelRatio||1;const viewY=si.y*devicePixelRatio;const viewHeight=si.height*devicePixelRatio;const arrowSize=4*pixelRatio;if(selected){ctx.fillStyle='rgb(255, 0, 0)';}else{ctx.fillStyle='rgb(0, 0, 0)';}
+tr.ui.b.drawTriangle(ctx,viewX-arrowSize*0.75,viewY,viewX+arrowSize*0.75,viewY,viewX,viewY+arrowSize);ctx.fill();tr.ui.b.drawTriangle(ctx,viewX-arrowSize*0.75,viewY+viewHeight,viewX+arrowSize*0.75,viewY+viewHeight,viewX,viewY+viewHeight-arrowSize);ctx.fill();ctx.restore();}};return{SnapIndicator,TimelineInterestRange,};});'use strict';tr.exportTo('tr.ui.tracks',function(){function ContainerToTrackMap(){this.stableIdToTrackMap_={};}
+ContainerToTrackMap.prototype={addContainer(container,track){if(!track){throw new Error('Must provide a track.');}
+this.stableIdToTrackMap_[container.stableId]=track;},clear(){this.stableIdToTrackMap_={};},getTrackByStableId(stableId){return this.stableIdToTrackMap_[stableId];}};return{ContainerToTrackMap,};});'use strict';tr.exportTo('tr.ui.tracks',function(){function EventToTrackMap(){}
+EventToTrackMap.prototype={addEvent(event,track){if(!track){throw new Error('Must provide a track.');}
+this[event.guid]=track;}};return{EventToTrackMap,};});'use strict';tr.exportTo('tr.ui',function(){const TimelineDisplayTransform=tr.ui.TimelineDisplayTransform;const TimelineInterestRange=tr.ui.TimelineInterestRange;const IDEAL_MAJOR_MARK_DISTANCE_PX=150;const MAJOR_MARK_ROUNDING_FACTOR=100000;class AnimationControllerProxy{constructor(target){this.target_=target;}
+get panX(){return this.target_.currentDisplayTransform_.panX;}
+set panX(panX){this.target_.currentDisplayTransform_.panX=panX;}
+get panY(){return this.target_.currentDisplayTransform_.panY;}
+set panY(panY){this.target_.currentDisplayTransform_.panY=panY;}
+get scaleX(){return this.target_.currentDisplayTransform_.scaleX;}
+set scaleX(scaleX){this.target_.currentDisplayTransform_.scaleX=scaleX;}
+cloneAnimationState(){return this.target_.currentDisplayTransform_.clone();}
+xPanWorldPosToViewPos(xWorld,xView){this.target_.currentDisplayTransform_.xPanWorldPosToViewPos(xWorld,xView,this.target_.modelTrackContainer_.canvas.clientWidth);}}
+function TimelineViewport(parentEl){this.parentEl_=parentEl;this.modelTrackContainer_=undefined;this.currentDisplayTransform_=new TimelineDisplayTransform();this.initAnimationController_();this.showFlowEvents_=false;this.highlightVSync_=false;this.highDetails_=false;this.gridTimebase_=0;this.gridStep_=1000/60;this.gridEnabled_=false;this.hasCalledSetupFunction_=false;this.onResize_=this.onResize_.bind(this);this.onModelTrackControllerScroll_=this.onModelTrackControllerScroll_.bind(this);this.timeMode_=TimelineViewport.TimeMode.TIME_IN_MS;this.majorMarkWorldPositions_=[];this.majorMarkUnit_=undefined;this.interestRange_=new TimelineInterestRange(this);this.eventToTrackMap_=new tr.ui.tracks.EventToTrackMap();this.containerToTrackMap=new tr.ui.tracks.ContainerToTrackMap();this.dispatchChangeEvent=this.dispatchChangeEvent.bind(this);}
+TimelineViewport.TimeMode={TIME_IN_MS:0,REVISIONS:1};TimelineViewport.prototype={__proto__:tr.b.EventTarget.prototype,get isAttachedToDocumentOrInTestMode(){if(this.parentEl_===undefined)return;return tr.ui.b.isElementAttachedToDocument(this.parentEl_);},onResize_(){this.dispatchChangeEvent();},dispatchChangeEvent(){tr.b.dispatchSimpleEvent(this,'change');},detach(){window.removeEventListener('resize',this.dispatchChangeEvent);},initAnimationController_(){this.dtAnimationController_=new tr.ui.b.AnimationController();this.dtAnimationController_.addEventListener('didtick',function(e){this.onCurentDisplayTransformChange_(e.oldTargetState);}.bind(this));this.dtAnimationController_.target=new AnimationControllerProxy(this);},get currentDisplayTransform(){return this.currentDisplayTransform_;},setDisplayTransformImmediately(displayTransform){this.dtAnimationController_.cancelActiveAnimation();const oldDisplayTransform=this.dtAnimationController_.target.cloneAnimationState();this.currentDisplayTransform_.set(displayTransform);this.onCurentDisplayTransformChange_(oldDisplayTransform);},queueDisplayTransformAnimation(animation){if(!(animation instanceof tr.ui.b.Animation)){throw new Error('animation must be instanceof tr.ui.b.Animation');}
+this.dtAnimationController_.queueAnimation(animation);},onCurentDisplayTransformChange_(oldDisplayTransform){if(this.modelTrackContainer_){this.currentDisplayTransform.panY=tr.b.math.clamp(this.currentDisplayTransform.panY,0,this.modelTrackContainer_.scrollHeight-
+this.modelTrackContainer_.clientHeight);}
+const changed=!this.currentDisplayTransform.equals(oldDisplayTransform);const yChanged=this.currentDisplayTransform.panY!==oldDisplayTransform.panY;if(yChanged){this.modelTrackContainer_.scrollTop=this.currentDisplayTransform.panY;}
+if(changed){this.dispatchChangeEvent();}},onModelTrackControllerScroll_(e){if(this.dtAnimationController_.activeAnimation&&this.dtAnimationController_.activeAnimation.affectsPanY){this.dtAnimationController_.cancelActiveAnimation();}
+const panY=this.modelTrackContainer_.scrollTop;this.currentDisplayTransform_.panY=panY;},get modelTrackContainer(){return this.modelTrackContainer_;},set modelTrackContainer(m){if(this.modelTrackContainer_){this.modelTrackContainer_.removeEventListener('scroll',this.onModelTrackControllerScroll_);}
+this.modelTrackContainer_=m;this.modelTrackContainer_.addEventListener('scroll',this.onModelTrackControllerScroll_);},get showFlowEvents(){return this.showFlowEvents_;},set showFlowEvents(showFlowEvents){this.showFlowEvents_=showFlowEvents;this.dispatchChangeEvent();},get highlightVSync(){return this.highlightVSync_;},set highlightVSync(highlightVSync){this.highlightVSync_=highlightVSync;this.dispatchChangeEvent();},get highDetails(){return this.highDetails_;},set highDetails(highDetails){this.highDetails_=highDetails;this.dispatchChangeEvent();},get gridEnabled(){return this.gridEnabled_;},set gridEnabled(enabled){if(this.gridEnabled_===enabled)return;this.gridEnabled_=enabled&&true;this.dispatchChangeEvent();},get gridTimebase(){return this.gridTimebase_;},set gridTimebase(timebase){if(this.gridTimebase_===timebase)return;this.gridTimebase_=timebase;this.dispatchChangeEvent();},get gridStep(){return this.gridStep_;},get interestRange(){return this.interestRange_;},get majorMarkWorldPositions(){return this.majorMarkWorldPositions_;},get majorMarkUnit(){switch(this.timeMode_){case TimelineViewport.TimeMode.TIME_IN_MS:return tr.b.Unit.byName.timeInMsAutoFormat;case TimelineViewport.TimeMode.REVISIONS:return tr.b.Unit.byName.count;default:throw new Error('Cannot get Unit for unsupported time mode '+this.timeMode_);}},get timeMode(){return this.timeMode_;},set timeMode(mode){this.timeMode_=mode;this.dispatchChangeEvent();},updateMajorMarkData(viewLWorld,viewRWorld){const pixelRatio=window.devicePixelRatio||1;const dt=this.currentDisplayTransform;const idealMajorMarkDistancePix=IDEAL_MAJOR_MARK_DISTANCE_PX*pixelRatio;const idealMajorMarkDistanceWorld=dt.xViewVectorToWorld(idealMajorMarkDistancePix);const majorMarkDistanceWorld=tr.b.math.preferredNumberLargerThanMin(idealMajorMarkDistanceWorld);const firstMajorMark=Math.floor(viewLWorld/majorMarkDistanceWorld)*majorMarkDistanceWorld;this.majorMarkWorldPositions_=[];for(let curX=firstMajorMark;curX<viewRWorld;curX+=majorMarkDistanceWorld){this.majorMarkWorldPositions_.push(Math.floor(MAJOR_MARK_ROUNDING_FACTOR*curX)/MAJOR_MARK_ROUNDING_FACTOR);}},drawMajorMarkLines(ctx){ctx.save();ctx.translate((Math.round(ctx.lineWidth)%2)/2,0);ctx.beginPath();for(const majorMark of this.majorMarkWorldPositions_){const x=this.currentDisplayTransform.xWorldToView(majorMark);tr.ui.b.drawLine(ctx,x,0,x,ctx.canvas.height);}
+ctx.strokeStyle='#ddd';ctx.stroke();ctx.restore();},drawGridLines(ctx,viewLWorld,viewRWorld){if(!this.gridEnabled)return;const dt=this.currentDisplayTransform;let x=this.gridTimebase;ctx.save();ctx.translate((Math.round(ctx.lineWidth)%2)/2,0);ctx.beginPath();while(x<viewRWorld){if(x>=viewLWorld){const vx=Math.floor(dt.xWorldToView(x));tr.ui.b.drawLine(ctx,vx,0,vx,ctx.canvas.height);}
+x+=this.gridStep;}
+ctx.strokeStyle='rgba(255, 0, 0, 0.25)';ctx.stroke();ctx.restore();},getShiftedSelection(selection,offset){const newSelection=new tr.model.EventSet();for(const event of selection){if(event instanceof tr.model.FlowEvent){if(offset>0){newSelection.push(event.endSlice);}else if(offset<0){newSelection.push(event.startSlice);}else{}
+continue;}
+const track=this.trackForEvent(event);track.addEventNearToProvidedEventToSelection(event,offset,newSelection);}
+if(newSelection.length===0)return undefined;return newSelection;},rebuildEventToTrackMap(){this.eventToTrackMap_=new tr.ui.tracks.EventToTrackMap();this.modelTrackContainer_.addEventsToTrackMap(this.eventToTrackMap_);},rebuildContainerToTrackMap(){this.containerToTrackMap.clear();this.modelTrackContainer_.addContainersToTrackMap(this.containerToTrackMap);},trackForEvent(event){return this.eventToTrackMap_[event.guid];}};return{TimelineViewport,};});'use strict';tr.exportTo('tr.c',function(){const BrushingState=tr.ui.b.BrushingState;const EventSet=tr.model.EventSet;const SelectionState=tr.model.SelectionState;const Viewport=tr.ui.TimelineViewport;function BrushingStateController(timelineView){tr.b.EventTarget.call(this);this.timelineView_=timelineView;this.currentBrushingState_=new BrushingState();this.onPopState_=this.onPopState_.bind(this);this.historyEnabled_=false;this.selections_={};}
+BrushingStateController.prototype={__proto__:tr.b.EventTarget.prototype,dispatchChangeEvent_(){const e=new tr.b.Event('change',false,false);this.dispatchEvent(e);},get model(){if(!this.timelineView_){return undefined;}
+return this.timelineView_.model;},get trackView(){if(!this.timelineView_){return undefined;}
+return this.timelineView_.trackView;},get viewport(){if(!this.timelineView_){return undefined;}
+if(!this.timelineView_.trackView){return undefined;}
+return this.timelineView_.trackView.viewport;},get historyEnabled(){return this.historyEnabled_;},set historyEnabled(historyEnabled){this.historyEnabled_=!!historyEnabled;if(historyEnabled){window.addEventListener('popstate',this.onPopState_);}else{window.removeEventListener('popstate',this.onPopState_);}},modelWillChange(){if(this.currentBrushingState_.isAppliedToModel){this.currentBrushingState_.unapplyFromEventSelectionStates();}},modelDidChange(){this.selections_={};this.currentBrushingState_=new BrushingState();this.currentBrushingState_.applyToEventSelectionStates(this.model);const e=new tr.b.Event('model-changed',false,false);this.dispatchEvent(e);this.dispatchChangeEvent_();},onUserInitiatedSelectionChange_(){const selection=this.selection;if(this.historyEnabled){this.selections_[selection.guid]=selection;const state={selection_guid:selection.guid};window.history.pushState(state,document.title);}},onPopState_(e){if(e.state===null)return;const selection=this.selections_[e.state.selection_guid];if(selection){const newState=this.currentBrushingState_.clone();newState.selection=selection;this.currentBrushingState=newState;}
+e.stopPropagation();},get selection(){return this.currentBrushingState_.selection;},get findMatches(){return this.currentBrushingState_.findMatches;},get selectionOfInterest(){return this.currentBrushingState_.selectionOfInterest;},get currentBrushingState(){return this.currentBrushingState_;},set currentBrushingState(newBrushingState){if(newBrushingState.isAppliedToModel){throw new Error('Cannot apply this state, it is applied');}
+const hasValueChanged=!this.currentBrushingState_.equals(newBrushingState);if(newBrushingState!==this.currentBrushingState_&&!hasValueChanged){if(this.currentBrushingState_.isAppliedToModel){this.currentBrushingState_.transferModelOwnershipToClone(newBrushingState);}
+this.currentBrushingState_=newBrushingState;return;}
+if(this.currentBrushingState_.isAppliedToModel){this.currentBrushingState_.unapplyFromEventSelectionStates();}
+this.currentBrushingState_=newBrushingState;this.currentBrushingState_.applyToEventSelectionStates(this.model);this.dispatchChangeEvent_();},addAllEventsMatchingFilterToSelectionAsTask(filter,selection){const timelineView=this.timelineView_.trackView;if(!timelineView){return new tr.b.Task();}
+return timelineView.addAllEventsMatchingFilterToSelectionAsTask(filter,selection);},findTextChangedTo(allPossibleMatches){const newBrushingState=this.currentBrushingState_.clone();newBrushingState.findMatches=allPossibleMatches;this.currentBrushingState=newBrushingState;},findFocusChangedTo(currentFocus){const newBrushingState=this.currentBrushingState_.clone();newBrushingState.selection=currentFocus;this.currentBrushingState=newBrushingState;this.onUserInitiatedSelectionChange_();},findTextCleared(){if(this.xNavStringMarker_!==undefined){this.model.removeAnnotation(this.xNavStringMarker_);this.xNavStringMarker_=undefined;}
+if(this.guideLineAnnotation_!==undefined){this.model.removeAnnotation(this.guideLineAnnotation_);this.guideLineAnnotation_=undefined;}
+const newBrushingState=this.currentBrushingState_.clone();newBrushingState.selection=new EventSet();newBrushingState.findMatches=new EventSet();this.currentBrushingState=newBrushingState;this.onUserInitiatedSelectionChange_();},uiStateFromString(string){return tr.ui.b.UIState.fromUserFriendlyString(this.model,this.viewport,string);},navToPosition(uiState,showNavLine){this.trackView.navToPosition(uiState,showNavLine);},changeSelectionFromTimeline(selection){const newBrushingState=this.currentBrushingState_.clone();newBrushingState.selection=selection;newBrushingState.findMatches=new EventSet();this.currentBrushingState=newBrushingState;this.onUserInitiatedSelectionChange_();},showScriptControlSelection(selection){const newBrushingState=this.currentBrushingState_.clone();newBrushingState.selection=selection;newBrushingState.findMatches=new EventSet();this.currentBrushingState=newBrushingState;},changeSelectionFromRequestSelectionChangeEvent(selection){const newBrushingState=this.currentBrushingState_.clone();newBrushingState.selection=selection;newBrushingState.findMatches=new EventSet();this.currentBrushingState=newBrushingState;this.onUserInitiatedSelectionChange_();},changeAnalysisViewRelatedEvents(eventSet){const newBrushingState=this.currentBrushingState_.clone();newBrushingState.analysisViewRelatedEvents=eventSet;this.currentBrushingState=newBrushingState;},changeAnalysisLinkHoveredEvents(eventSet){const newBrushingState=this.currentBrushingState_.clone();newBrushingState.analysisLinkHoveredEvents=eventSet;this.currentBrushingState=newBrushingState;},getViewSpecificBrushingState(viewId){return this.currentBrushingState.viewSpecificBrushingStates[viewId];},changeViewSpecificBrushingState(viewId,newState){const oldStates=this.currentBrushingState_.viewSpecificBrushingStates;const newStates={};for(const id in oldStates){newStates[id]=oldStates[id];}
+if(newState===undefined){delete newStates[viewId];}else{newStates[viewId]=newState;}
+const newBrushingState=this.currentBrushingState_.clone();newBrushingState.viewSpecificBrushingStates=newStates;this.currentBrushingState=newBrushingState;}};BrushingStateController.getControllerForElement=function(element){if(tr.isHeadless){throw new Error('Unsupported');}
+let currentElement=element;while(currentElement){if(currentElement.brushingStateController){return currentElement.brushingStateController;}
+if(currentElement.parentElement){currentElement=currentElement.parentElement;continue;}
+let currentNode=currentElement;while(Polymer.dom(currentNode).parentNode){currentNode=Polymer.dom(currentNode).parentNode;}
+currentElement=currentNode.host;}
+return undefined;};return{BrushingStateController,};});'use strict';Polymer({is:'tr-ui-a-analysis-link',properties:{href:{type:String}},listeners:{'click':'onClicked_','mouseenter':'onMouseEnter_','mouseleave':'onMouseLeave_'},ready(){this.selection_=undefined;},attached(){this.controller_=tr.c.BrushingStateController.getControllerForElement(this);},detached(){this.clearHighlight_();this.controller_=undefined;},set color(c){this.style.color=c;},get selection(){return this.selection_;},set selection(selection){this.selection_=selection;Polymer.dom(this).textContent=selection.userFriendlyName;},setSelectionAndContent(selection,opt_textContent){this.selection_=selection;if(opt_textContent){Polymer.dom(this).textContent=opt_textContent;}},getCurrentSelection_(){if(typeof this.selection_==='function'){return this.selection_();}
+return this.selection_;},setHighlight_(opt_eventSet){if(this.controller_){this.controller_.changeAnalysisLinkHoveredEvents(opt_eventSet);}},clearHighlight_(opt_eventSet){this.setHighlight_();},onClicked_(clickEvent){if(!this.selection_)return;clickEvent.stopPropagation();const event=new tr.model.RequestSelectionChangeEvent();event.selection=this.getCurrentSelection_();this.dispatchEvent(event);},onMouseEnter_(){this.setHighlight_(this.getCurrentSelection_());},onMouseLeave_(){this.clearHighlight_();}});'use strict';tr.exportTo('tr.ui.b',function(){const TableFormat={};TableFormat.SelectionMode={NONE:0,ROW:1,CELL:2};TableFormat.HighlightStyle={DEFAULT:0,NONE:1,LIGHT:2,DARK:3};TableFormat.ColumnAlignment={LEFT:0,RIGHT:1};return{TableFormat,};});'use strict';(function(){const RIGHT_ARROW=String.fromCharCode(0x25b6);const UNSORTED_ARROW=String.fromCharCode(0x25BF);const ASCENDING_ARROW=String.fromCharCode(0x25B4);const DESCENDING_ARROW=String.fromCharCode(0x25BE);const SelectionMode=tr.ui.b.TableFormat.SelectionMode;const HighlightStyle=tr.ui.b.TableFormat.HighlightStyle;const ColumnAlignment=tr.ui.b.TableFormat.ColumnAlignment;Polymer({is:'tr-ui-b-table',created(){this.selectionMode_=SelectionMode.NONE;this.rowHighlightStyle_=HighlightStyle.DEFAULT;this.cellHighlightStyle_=HighlightStyle.DEFAULT;this.selectedTableRowInfo_=undefined;this.selectedColumnIndex_=undefined;this.tableColumns_=[];this.tableRows_=[];this.tableRowsInfo_=new WeakMap();this.tableFooterRows_=[];this.tableFooterRowsInfo_=new WeakMap();this.sortColumnIndex_=undefined;this.sortDescending_=false;this.columnsWithExpandButtons_=[];this.headerCells_=[];this.showHeader_=true;this.emptyValue_=undefined;this.subRowsPropertyName_='subRows';this.customizeTableRowCallback_=undefined;this.defaultExpansionStateCallback_=undefined;this.userCanModifySortOrder_=true;this.computedFontSizePx_=undefined;},ready(){this.$.body.addEventListener('keydown',this.onKeyDown_.bind(this),true);this.$.body.addEventListener('focus',this.onFocus_.bind(this),true);},clear(){this.selectionMode_=SelectionMode.NONE;this.rowHighlightStyle_=HighlightStyle.DEFAULT;this.cellHighlightStyle_=HighlightStyle.DEFAULT;this.selectedTableRowInfo_=undefined;this.selectedColumnIndex_=undefined;Polymer.dom(this).textContent='';this.tableColumns_=[];this.tableRows_=[];this.tableRowsInfo_=new WeakMap();this.tableFooterRows_=[];this.tableFooterRowsInfo_=new WeakMap();this.sortColumnIndex_=undefined;this.sortDescending_=false;this.columnsWithExpandButtons_=[];this.headerCells_=[];this.showHeader_=true;this.emptyValue_=undefined;this.subRowsPropertyName_='subRows';this.defaultExpansionStateCallback_=undefined;this.userCanModifySortOrder_=true;},set zebra(zebra){if(zebra){this.setAttribute('zebra',true);}else{this.removeAttribute('zebra');}},get zebra(){return this.getAttribute('zebra');},get showHeader(){return this.showHeader_;},set showHeader(showHeader){this.showHeader_=showHeader;this.scheduleRebuildHeaders_();},set subRowsPropertyName(name){this.subRowsPropertyName_=name;},set defaultExpansionStateCallback(cb){this.defaultExpansionStateCallback_=cb;this.scheduleRebuildBody_();},set customizeTableRowCallback(cb){this.customizeTableRowCallback_=cb;this.scheduleRebuildBody_();},get emptyValue(){return this.emptyValue_;},set emptyValue(emptyValue){const previousEmptyValue=this.emptyValue_;this.emptyValue_=emptyValue;if(this.tableRows_.length===0&&emptyValue!==previousEmptyValue){this.scheduleRebuildBody_();}},set tableColumns(columns){let columnsWithExpandButtons=[];for(let i=0;i<columns.length;i++){if(columns[i].showExpandButtons){columnsWithExpandButtons.push(i);}}
+if(columnsWithExpandButtons.length===0){columnsWithExpandButtons=[0];}
+for(let i=0;i<columns.length;i++){const colInfo=columns[i];if(colInfo.width===undefined)continue;const hasExpandButton=columnsWithExpandButtons.includes(i);const w=colInfo.width;if(w){if(/\d+px/.test(w)){continue;}else if(/\d+%/.test(w)){if(hasExpandButton){throw new Error('Columns cannot be %-sized and host '+' an expand button');}}else{throw new Error('Unrecognized width string');}}}
+let sortIndex=undefined;const currentSortColumn=this.tableColumns[this.sortColumnIndex_];if(currentSortColumn){for(const[i,column]of columns.entries()){if(currentSortColumn.title===column.title){sortIndex=i;break;}}}
+this.tableColumns_=columns;this.headerCells_=[];this.columnsWithExpandButtons_=columnsWithExpandButtons;this.scheduleRebuildHeaders_();this.sortColumnIndex=sortIndex;this.tableRows=this.tableRows_;},get tableColumns(){return this.tableColumns_;},set tableRows(rows){this.selectedTableRowInfo_=undefined;this.selectedColumnIndex_=undefined;this.tableRows_=rows;this.tableRowsInfo_=new WeakMap();this.scheduleRebuildBody_();},get tableRows(){return this.tableRows_;},set footerRows(rows){this.tableFooterRows_=rows;this.tableFooterRowsInfo_=new WeakMap();this.scheduleRebuildFooter_();},get footerRows(){return this.tableFooterRows_;},get userCanModifySortOrder(){return this.userCanModifySortOrder_;},set userCanModifySortOrder(userCanModifySortOrder){const newUserCanModifySortOrder=!!userCanModifySortOrder;if(newUserCanModifySortOrder===this.userCanModifySortOrder_){return;}
+this.userCanModifySortOrder_=newUserCanModifySortOrder;this.scheduleRebuildHeaders_();},set sortColumnIndex(number){if(number===this.sortColumnIndex_)return;if(number!==undefined){if(this.tableColumns_.length<=number){throw new Error('Column number '+number+' is out of bounds.');}
+if(!this.tableColumns_[number].cmp){throw new Error('Column '+number+' does not have a comparator.');}}
+this.sortColumnIndex_=number;this.updateHeaderArrows_();this.scheduleRebuildBody_();this.dispatchSortingChangedEvent_();},get sortColumnIndex(){return this.sortColumnIndex_;},set sortDescending(value){const newValue=!!value;if(newValue!==this.sortDescending_){this.sortDescending_=newValue;this.updateHeaderArrows_();this.scheduleRebuildBody_();this.dispatchSortingChangedEvent_();}},get sortDescending(){return this.sortDescending_;},updateHeaderArrows_(){for(let i=0;i<this.headerCells_.length;i++){const headerCell=this.headerCells_[i];const isColumnCurrentlySorted=i===this.sortColumnIndex_;if(!this.tableColumns_[i].cmp||(!this.userCanModifySortOrder_&&!isColumnCurrentlySorted)){headerCell.sideContent='';continue;}
+if(!isColumnCurrentlySorted){headerCell.sideContent=UNSORTED_ARROW;headerCell.sideContentDisabled=false;continue;}
+headerCell.sideContent=this.sortDescending_?DESCENDING_ARROW:ASCENDING_ARROW;headerCell.sideContentDisabled=!this.userCanModifySortOrder_;}},generateHeaderColumns_(){const selectedTableColumnIndex=this.selectedTableColumnIndex;Polymer.dom(this.$.cols).textContent='';for(let i=0;i<this.tableColumns_.length;++i){const colElement=document.createElement('col');if(i===selectedTableColumnIndex){colElement.setAttribute('selected',true);}
+Polymer.dom(this.$.cols).appendChild(colElement);}
+this.headerCells_=[];Polymer.dom(this.$.head).textContent='';if(!this.showHeader_)return;const tr=this.appendNewElement_(this.$.head,'tr');for(let i=0;i<this.tableColumns_.length;i++){const td=this.appendNewElement_(tr,'td');const headerCell=document.createElement('tr-ui-b-table-header-cell');headerCell.column=this.tableColumns_[i];if(this.tableColumns_[i].cmp){const isColumnCurrentlySorted=i===this.sortColumnIndex_;if(isColumnCurrentlySorted){headerCell.sideContent=this.sortDescending_?DESCENDING_ARROW:ASCENDING_ARROW;if(!this.userCanModifySortOrder_){headerCell.sideContentDisabled=true;}}
+if(this.userCanModifySortOrder_){Polymer.dom(td).classList.add('sensitive');if(!isColumnCurrentlySorted){headerCell.sideContent=UNSORTED_ARROW;}
+headerCell.tapCallback=this.createSortCallback_(i);}}
+Polymer.dom(td).appendChild(headerCell);this.headerCells_.push(headerCell);}},applySizes_(){if(this.tableRows_.length===0&&!this.showHeader)return;let rowToRemoveSizing;let rowToSize;if(this.showHeader){rowToSize=Polymer.dom(this.$.head).children[0];rowToRemoveSizing=Polymer.dom(this.$.body).children[0];}else{rowToSize=Polymer.dom(this.$.body).children[0];rowToRemoveSizing=Polymer.dom(this.$.head).children[0];}
+for(let i=0;i<this.tableColumns_.length;i++){if(rowToRemoveSizing&&Polymer.dom(rowToRemoveSizing).children[i]){const tdToRemoveSizing=Polymer.dom(rowToRemoveSizing).children[i];tdToRemoveSizing.style.minWidth='';tdToRemoveSizing.style.width='';}
+const td=Polymer.dom(rowToSize).children[i];let delta;if(this.columnsWithExpandButtons_.includes(i)){td.style.paddingLeft=this.basicIndentation_+'px';delta=this.basicIndentation_+'px';}else{delta=undefined;}
+function calc(base,delta){if(delta){return'calc('+base+' - '+delta+')';}
+return base;}
+const w=this.tableColumns_[i].width;if(w){if(/\d+px/.test(w)){td.style.minWidth=calc(w,delta);}else if(/\d+%/.test(w)){td.style.width=w;}else{throw new Error('Unrecognized width string: '+w);}}}},createSortCallback_(columnNumber){return function(){if(!this.userCanModifySortOrder_)return;const previousIndex=this.sortColumnIndex;this.sortColumnIndex=columnNumber;if(previousIndex!==columnNumber){this.sortDescending=false;}else{this.sortDescending=!this.sortDescending;}}.bind(this);},generateTableRowNodes_(tableSection,userRows,rowInfoMap,indentation,lastAddedRow,parentRowInfo){if(this.sortColumnIndex_!==undefined&&tableSection===this.$.body){userRows=userRows.slice();userRows.sort(function(rowA,rowB){let c=this.tableColumns_[this.sortColumnIndex_].cmp(rowA,rowB);if(this.sortDescending_){c=-c;}
+return c;}.bind(this));}
+for(let i=0;i<userRows.length;i++){const userRow=userRows[i];const rowInfo=this.getOrCreateRowInfoFor_(rowInfoMap,userRow,parentRowInfo);const htmlNode=this.getHTMLNodeForRowInfo_(tableSection,rowInfo,rowInfoMap,indentation);if(lastAddedRow===undefined){Polymer.dom(tableSection).insertBefore(htmlNode,Polymer.dom(tableSection).firstChild);}else{const nextSiblingOfLastAdded=Polymer.dom(lastAddedRow).nextSibling;Polymer.dom(tableSection).insertBefore(htmlNode,nextSiblingOfLastAdded);}
+lastAddedRow=htmlNode;if(!rowInfo.isExpanded)continue;lastAddedRow=this.generateTableRowNodes_(tableSection,userRow[this.subRowsPropertyName_],rowInfoMap,indentation+1,lastAddedRow,rowInfo);}
+return lastAddedRow;},getOrCreateRowInfoFor_(rowInfoMap,userRow,parentRowInfo){let rowInfo=undefined;if(rowInfoMap.has(userRow)){rowInfo=rowInfoMap.get(userRow);}else{rowInfo={userRow,htmlNode:undefined,parentRowInfo};rowInfoMap.set(userRow,rowInfo);}
+rowInfo.isExpanded=this.getExpandedForUserRow_(userRow);return rowInfo;},customizeTableRow_(userRow,trElement){if(!this.customizeTableRowCallback_)return;this.customizeTableRowCallback_(userRow,trElement);},get basicIndentation_(){if(this.computedFontSizePx_===undefined){this.computedFontSizePx_=parseInt(getComputedStyle(this).fontSize)||16;}
+return this.computedFontSizePx_-2;},getHTMLNodeForRowInfo_(tableSection,rowInfo,rowInfoMap,indentation){if(rowInfo.htmlNode){this.customizeTableRow_(rowInfo.userRow,rowInfo.htmlNode);return rowInfo.htmlNode;}
+const INDENT_SPACE=indentation*16;const INDENT_SPACE_NO_BUTTON=indentation*16+this.basicIndentation_;const trElement=this.ownerDocument.createElement('tr');rowInfo.htmlNode=trElement;rowInfo.indentation=indentation;trElement.rowInfo=rowInfo;this.customizeTableRow_(rowInfo.userRow,trElement);const isBodyRow=tableSection===this.$.body;const isExpandableRow=rowInfo.userRow[this.subRowsPropertyName_]&&rowInfo.userRow[this.subRowsPropertyName_].length;for(let i=0;i<this.tableColumns_.length;){const td=this.appendNewElement_(trElement,'td');td.columnIndex=i;const column=this.tableColumns_[i];const value=column.value(rowInfo.userRow);const colSpan=column.colSpan?column.colSpan:1;td.style.colSpan=colSpan;switch(column.align){case undefined:case ColumnAlignment.LEFT:break;case ColumnAlignment.RIGHT:td.style.textAlign='right';break;default:throw new Error('Invalid alignment of column at index='+i+': '+column.align);}
+if(this.doesColumnIndexSupportSelection(i)){Polymer.dom(td).classList.add('supports-selection');}
+if(this.columnsWithExpandButtons_.includes(i)){if(rowInfo.userRow[this.subRowsPropertyName_]&&rowInfo.userRow[this.subRowsPropertyName_].length>0){td.style.paddingLeft=INDENT_SPACE+'px';td.style.display='flex';const expandButton=this.appendNewElement_(td,'expand-button');Polymer.dom(expandButton).textContent=RIGHT_ARROW;if(rowInfo.isExpanded){Polymer.dom(expandButton).classList.add('button-expanded');}}else{td.style.paddingLeft=INDENT_SPACE_NO_BUTTON+'px';}}
+if(value!==undefined){Polymer.dom(td).appendChild(tr.ui.b.asHTMLOrTextNode(value,this.ownerDocument));}
+td.addEventListener('click',function(i,clickEvent){clickEvent.preventDefault();if(!isBodyRow&&!isExpandableRow)return;clickEvent.stopPropagation();if(clickEvent.target.tagName==='EXPAND-BUTTON'){this.setExpandedForUserRow_(tableSection,rowInfoMap,rowInfo.userRow,!rowInfo.isExpanded);return;}
+if(isBodyRow&&this.selectionMode_!==SelectionMode.NONE){let shouldSelect=false;let shouldFocus=false;switch(this.selectionMode_){case SelectionMode.ROW:shouldSelect=this.selectedTableRowInfo_!==rowInfo;shouldFocus=true;break;case SelectionMode.CELL:if(this.doesColumnIndexSupportSelection(i)){shouldSelect=this.selectedTableRowInfo_!==rowInfo||this.selectedColumnIndex_!==i;shouldFocus=true;}
+break;default:throw new Error('Invalid selection mode '+
+this.selectionMode_);}
+if(shouldFocus){this.focus();}
+if(shouldSelect){this.didTableRowInfoGetClicked_(rowInfo,i);return;}}
+if(isExpandableRow){this.setExpandedForUserRow_(tableSection,rowInfoMap,rowInfo.userRow,!rowInfo.isExpanded);}}.bind(this,i));if(isBodyRow){td.addEventListener('dblclick',function(i,e){e.stopPropagation();this.dispatchStepIntoEvent_(rowInfo,i);}.bind(this,i));}
+i+=colSpan;}
+return rowInfo.htmlNode;},removeSubNodes_(tableSection,rowInfo,rowInfoMap){if(rowInfo.userRow[this.subRowsPropertyName_]===undefined)return;for(let i=0;i<rowInfo.userRow[this.subRowsPropertyName_].length;i++){const subRow=rowInfo.userRow[this.subRowsPropertyName_][i];const subRowInfo=rowInfoMap.get(subRow);if(!subRowInfo)continue;const subNode=subRowInfo.htmlNode;if(subNode&&Polymer.dom(subNode).parentNode===tableSection){Polymer.dom(tableSection).removeChild(subNode);this.removeSubNodes_(tableSection,subRowInfo,rowInfoMap);}}},scheduleRebuildHeaders_(){this.headerDirty_=true;this.scheduleRebuild_();},scheduleRebuildBody_(){this.bodyDirty_=true;this.scheduleRebuild_();},scheduleRebuildFooter_(){this.footerDirty_=true;this.scheduleRebuild_();},scheduleRebuild_(){if(this.rebuildPending_)return;this.rebuildPending_=true;setTimeout(function(){this.rebuildPending_=false;this.rebuild();}.bind(this),0);},rebuildIfNeeded_(){this.rebuild();},rebuild(){const wasBodyOrHeaderDirty=this.headerDirty_||this.bodyDirty_;if(this.headerDirty_){this.generateHeaderColumns_();this.headerDirty_=false;}
+if(this.bodyDirty_){Polymer.dom(this.$.body).textContent='';this.generateTableRowNodes_(this.$.body,this.tableRows_,this.tableRowsInfo_,0,undefined,undefined);if(this.tableRows_.length===0&&this.emptyValue_!==undefined){const trElement=this.ownerDocument.createElement('tr');Polymer.dom(this.$.body).appendChild(trElement);Polymer.dom(trElement).classList.add('empty-row');const td=this.ownerDocument.createElement('td');Polymer.dom(trElement).appendChild(td);td.colSpan=this.tableColumns_.length;const emptyValue=this.emptyValue_;Polymer.dom(td).appendChild(tr.ui.b.asHTMLOrTextNode(emptyValue,this.ownerDocument));}
+this.bodyDirty_=false;}
+if(wasBodyOrHeaderDirty)this.applySizes_();if(this.footerDirty_){Polymer.dom(this.$.foot).textContent='';this.generateTableRowNodes_(this.$.foot,this.tableFooterRows_,this.tableFooterRowsInfo_,0,undefined,undefined);if(this.tableFooterRowsInfo_.length){Polymer.dom(this.$.body).classList.add('has-footer');}else{Polymer.dom(this.$.body).classList.remove('has-footer');}
+this.footerDirty_=false;}},appendNewElement_(parent,tagName){const element=parent.ownerDocument.createElement(tagName);Polymer.dom(parent).appendChild(element);return element;},getExpandedForTableRow(userRow){this.rebuildIfNeeded_();const rowInfo=this.tableRowsInfo_.get(userRow);if(rowInfo===undefined){throw new Error('Row has not been seen, must expand its parents');}
+return rowInfo.isExpanded;},getExpandedForUserRow_(userRow){if(userRow[this.subRowsPropertyName_]===undefined){return false;}
+if(userRow[this.subRowsPropertyName_].length===0){return false;}
+if(userRow.isExpanded){return true;}
+if((userRow.isExpanded!==undefined)&&(userRow.isExpanded===false)){return false;}
+const rowInfo=this.tableRowsInfo_.get(userRow);if(rowInfo&&rowInfo.isExpanded){return true;}
+if(this.defaultExpansionStateCallback_===undefined){return false;}
+let parentUserRow=undefined;if(rowInfo&&rowInfo.parentRowInfo){parentUserRow=rowInfo.parentRowInfo.userRow;}
+return this.defaultExpansionStateCallback_(userRow,parentUserRow);},setExpandedForTableRow(userRow,expanded){this.rebuildIfNeeded_();const rowInfo=this.tableRowsInfo_.get(userRow);if(rowInfo===undefined){throw new Error('Row has not been seen, must expand its parents');}
+return this.setExpandedForUserRow_(this.$.body,this.tableRowsInfo_,userRow,expanded);},setExpandedForUserRow_(tableSection,rowInfoMap,userRow,expanded){this.rebuildIfNeeded_();const rowInfo=rowInfoMap.get(userRow);if(rowInfo===undefined){throw new Error('Row has not been seen, must expand its parents');}
+const wasExpanded=rowInfo.isExpanded;rowInfo.isExpanded=!!expanded;if(rowInfo.htmlNode===undefined)return;if(rowInfo.htmlNode.parentElement!==tableSection){return;}
+const expandButton=Polymer.dom(rowInfo.htmlNode).querySelector('expand-button');if(rowInfo.isExpanded){Polymer.dom(expandButton).classList.add('button-expanded');const lastAddedRow=rowInfo.htmlNode;if(rowInfo.userRow[this.subRowsPropertyName_]){this.generateTableRowNodes_(tableSection,rowInfo.userRow[this.subRowsPropertyName_],rowInfoMap,rowInfo.indentation+1,lastAddedRow,rowInfo);}}else{Polymer.dom(expandButton).classList.remove('button-expanded');this.removeSubNodes_(tableSection,rowInfo,rowInfoMap);}
+if(wasExpanded!==rowInfo.isExpanded){const e=new tr.b.Event('row-expanded-changed');e.row=rowInfo.userRow;this.dispatchEvent(e);}
+this.maybeUpdateSelectedRow_();},get selectionMode(){return this.selectionMode_;},set selectionMode(selectionMode){if(!tr.b.dictionaryContainsValue(SelectionMode,selectionMode)){throw new Error('Invalid selection mode '+selectionMode);}
+this.rebuildIfNeeded_();this.selectionMode_=selectionMode;this.didSelectionStateChange_();},get rowHighlightStyle(){return this.rowHighlightStyle_;},set rowHighlightStyle(rowHighlightStyle){if(!tr.b.dictionaryContainsValue(HighlightStyle,rowHighlightStyle)){throw new Error('Invalid row highlight style '+rowHighlightStyle);}
+this.rebuildIfNeeded_();this.rowHighlightStyle_=rowHighlightStyle;this.didSelectionStateChange_();},get resolvedRowHighlightStyle(){if(this.rowHighlightStyle_!==HighlightStyle.DEFAULT){return this.rowHighlightStyle_;}
+switch(this.selectionMode_){case SelectionMode.NONE:return HighlightStyle.NONE;case SelectionMode.ROW:return HighlightStyle.DARK;case SelectionMode.CELL:return HighlightStyle.LIGHT;default:throw new Error('Invalid selection mode '+selectionMode);}},get cellHighlightStyle(){return this.cellHighlightStyle_;},set cellHighlightStyle(cellHighlightStyle){if(!tr.b.dictionaryContainsValue(HighlightStyle,cellHighlightStyle)){throw new Error('Invalid cell highlight style '+cellHighlightStyle);}
+this.rebuildIfNeeded_();this.cellHighlightStyle_=cellHighlightStyle;this.didSelectionStateChange_();},get resolvedCellHighlightStyle(){if(this.cellHighlightStyle_!==HighlightStyle.DEFAULT){return this.cellHighlightStyle_;}
+switch(this.selectionMode_){case SelectionMode.NONE:case SelectionMode.ROW:return HighlightStyle.NONE;case SelectionMode.CELL:return HighlightStyle.DARK;default:throw new Error('Invalid selection mode '+selectionMode);}},setHighlightStyle_(highlightAttribute,resolvedHighlightStyle){switch(resolvedHighlightStyle){case HighlightStyle.NONE:Polymer.dom(this.$.body).removeAttribute(highlightAttribute);break;case HighlightStyle.LIGHT:Polymer.dom(this.$.body).setAttribute(highlightAttribute,'light');break;case HighlightStyle.DARK:Polymer.dom(this.$.body).setAttribute(highlightAttribute,'dark');break;default:throw new Error('Invalid resolved highlight style '+
+resolvedHighlightStyle);}},didSelectionStateChange_(){this.setHighlightStyle_('row-highlight-style',this.resolvedRowHighlightStyle);this.setHighlightStyle_('cell-highlight-style',this.resolvedCellHighlightStyle);this.removeSelectedState_();switch(this.selectionMode_){case SelectionMode.ROW:Polymer.dom(this.$.body).setAttribute('selection-mode','row');Polymer.dom(this.$.body).setAttribute('tabindex',0);this.selectedColumnIndex_=undefined;break;case SelectionMode.CELL:Polymer.dom(this.$.body).setAttribute('selection-mode','cell');Polymer.dom(this.$.body).setAttribute('tabindex',0);if(this.selectedTableRowInfo_&&this.selectedColumnIndex_===undefined){const i=this.getFirstSelectableColumnIndex_();if(i===-1){this.selectedTableRowInfo_=undefined;}else{this.selectedColumnIndex_=i;}}
+break;case SelectionMode.NONE:Polymer.dom(this.$.body).removeAttribute('selection-mode');Polymer.dom(this.$.body).removeAttribute('tabindex');this.$.body.blur();this.selectedTableRowInfo_=undefined;this.selectedColumnIndex_=undefined;break;default:throw new Error('Invalid selection mode '+this.selectionMode_);}
+this.maybeUpdateSelectedRow_();},maybeUpdateSelectedRow_(){if(this.selectedTableRowInfo_===undefined)return;function isVisible(rowInfo){if(!rowInfo.htmlNode)return false;return!!rowInfo.htmlNode.parentElement;}
+if(isVisible(this.selectedTableRowInfo_)){this.updateSelectedState_();return;}
+this.removeSelectedState_();let curRowInfo=this.selectedTableRowInfo_;while(curRowInfo&&!isVisible(curRowInfo)){curRowInfo=curRowInfo.parentRowInfo;}
+this.selectedTableRowInfo_=curRowInfo;if(this.selectedTableRowInfo_){this.updateSelectedState_();}else{this.selectedColumnIndex_=undefined;}},didTableRowInfoGetClicked_(rowInfo,columnIndex){switch(this.selectionMode_){case SelectionMode.NONE:return;case SelectionMode.CELL:if(!this.doesColumnIndexSupportSelection(columnIndex)){return;}
+if(this.selectedColumnIndex!==columnIndex){this.selectedColumnIndex=columnIndex;}
+case SelectionMode.ROW:if(this.selectedTableRowInfo_!==rowInfo){this.selectedTableRow=rowInfo.userRow;}}},dispatchStepIntoEvent_(rowInfo,columnIndex){const e=new tr.b.Event('step-into');e.tableRow=rowInfo.userRow;e.tableColumn=this.tableColumns_[columnIndex];e.columnIndex=columnIndex;this.dispatchEvent(e);},get selectedCell(){const row=this.selectedTableRow;const columnIndex=this.selectedColumnIndex;if(row===undefined||columnIndex===undefined||this.tableColumns_.length<=columnIndex){return undefined;}
+const column=this.tableColumns_[columnIndex];return{row,column,value:column.value(row)};},get selectedTableColumnIndex(){const cols=Polymer.dom(this.$.cols).children;for(let i=0;i<cols.length;++i){if(cols[i].getAttribute('selected')){return i;}}
+return undefined;},set selectedTableColumnIndex(selectedIndex){const cols=Polymer.dom(this.$.cols).children;for(let i=0;i<cols.length;++i){if(i===selectedIndex){cols[i].setAttribute('selected',true);}else{cols[i].removeAttribute('selected');}}},get selectedTableRow(){if(!this.selectedTableRowInfo_)return undefined;return this.selectedTableRowInfo_.userRow;},set selectedTableRow(userRow){this.rebuildIfNeeded_();if(this.selectionMode_===SelectionMode.NONE){throw new Error('Selection is off.');}
+let rowInfo;if(userRow===undefined){rowInfo=undefined;}else{rowInfo=this.tableRowsInfo_.get(userRow);if(!rowInfo){throw new Error('Row has not been seen, must expand its parents.');}}
+const e=this.prepareToChangeSelection_();if(!rowInfo){this.selectedColumnIndex_=undefined;}else{switch(this.selectionMode_){case SelectionMode.ROW:this.selectedColumnIndex_=undefined;break;case SelectionMode.CELL:if(this.selectedColumnIndex_===undefined){const i=this.getFirstSelectableColumnIndex_();if(i===-1){throw new Error('Cannot find a selectable column.');}
+this.selectedColumnIndex_=i;}
+break;default:throw new Error('Invalid selection mode '+this.selectionMode_);}}
+this.selectedTableRowInfo_=rowInfo;this.updateSelectedState_();this.dispatchEvent(e);},prepareToChangeSelection_(){const e=new tr.b.Event('selection-changed');const previousSelectedRowInfo=this.selectedTableRowInfo_;if(previousSelectedRowInfo){e.previousSelectedTableRow=previousSelectedRowInfo.userRow;}else{e.previousSelectedTableRow=undefined;}
+this.removeSelectedState_();return e;},removeSelectedState_(){this.setSelectedState_(false);},updateSelectedState_(){this.setSelectedState_(true);},setSelectedState_(select){if(this.selectedTableRowInfo_===undefined)return;const rowNode=this.selectedTableRowInfo_.htmlNode;if(select){Polymer.dom(rowNode).setAttribute('selected',true);}else{Polymer.dom(rowNode).removeAttribute('selected');}
+const cellNode=Polymer.dom(rowNode).children[this.selectedColumnIndex_];if(!cellNode)return;if(select){Polymer.dom(cellNode).setAttribute('selected',true);}else{Polymer.dom(cellNode).removeAttribute('selected');}},doesColumnIndexSupportSelection(columnIndex){const columnInfo=this.tableColumns_[columnIndex];const scs=columnInfo.supportsCellSelection;if(scs===false)return false;return true;},getFirstSelectableColumnIndex_(){for(let i=0;i<this.tableColumns_.length;i++){if(this.doesColumnIndexSupportSelection(i)){return i;}}
+return-1;},getSelectableNodeGivenTableRowNode_(htmlNode){switch(this.selectionMode_){case SelectionMode.ROW:return htmlNode;case SelectionMode.CELL:return Polymer.dom(htmlNode).children[this.selectedColumnIndex_];default:throw new Error('Invalid selection mode '+this.selectionMode_);}},get selectedColumnIndex(){if(this.selectionMode_!==SelectionMode.CELL){return undefined;}
+return this.selectedColumnIndex_;},set selectedColumnIndex(selectedColumnIndex){this.rebuildIfNeeded_();if(this.selectionMode_===SelectionMode.NONE){throw new Error('Selection is off.');}
+if(selectedColumnIndex<0||selectedColumnIndex>=this.tableColumns_.length){throw new Error('Invalid index');}
+if(!this.doesColumnIndexSupportSelection(selectedColumnIndex)){throw new Error('Selection is not supported on this column');}
+const e=this.prepareToChangeSelection_();if(this.selectedColumnIndex_===undefined){this.selectedTableRowInfo_=undefined;}else if(!this.selectedTableRowInfo_){if(this.tableRows_.length===0){throw new Error('No available row to be selected');}
+this.selectedTableRowInfo_=this.tableRowsInfo_.get(this.tableRows_[0]);}
+this.selectedColumnIndex_=selectedColumnIndex;this.updateSelectedState_();this.dispatchEvent(e);},onKeyDown_(e){if(this.selectionMode_===SelectionMode.NONE)return;const CODE_TO_COMMAND_NAMES={13:'ENTER',32:'SPACE',37:'ARROW_LEFT',38:'ARROW_UP',39:'ARROW_RIGHT',40:'ARROW_DOWN'};const cmdName=CODE_TO_COMMAND_NAMES[e.keyCode];if(cmdName===undefined)return;e.stopPropagation();e.preventDefault();this.performKeyCommand_(cmdName);},onFocus_(e){if(this.selectionMode_===SelectionMode.NONE||this.selectedTableRow||this.tableRows_.length===0){return;}
+if(this.selectionMode_===SelectionMode.CELL&&this.getFirstSelectableColumnIndex_()===-1){return;}
+this.selectedTableRow=this.tableRows_[0];},focus(){this.$.body.focus();this.onFocus_();},blur(){this.$.body.blur();},get isFocused(){return this.root.activeElement===this.$.body;},performKeyCommand_(cmdName){this.rebuildIfNeeded_();switch(cmdName){case'ARROW_UP':this.selectPreviousOrFirstRowIfPossible_();return;case'ARROW_DOWN':this.selectNextOrFirstRowIfPossible_();return;case'ARROW_RIGHT':switch(this.selectionMode_){case SelectionMode.NONE:return;case SelectionMode.ROW:this.expandRowAndSelectChildRowIfPossible_();return;case SelectionMode.CELL:this.selectNextSelectableCellToTheRightIfPossible_();return;default:throw new Error('Invalid selection mode '+this.selectionMode_);}
+case'ARROW_LEFT':switch(this.selectionMode_){case SelectionMode.NONE:return;case SelectionMode.ROW:this.collapseRowOrSelectParentRowIfPossible_();return;case SelectionMode.CELL:this.selectNextSelectableCellToTheLeftIfPossible_();return;default:throw new Error('Invalid selection mode '+this.selectionMode_);}
+case'SPACE':this.toggleRowExpansionStateIfPossible_();return;case'ENTER':this.stepIntoSelectionIfPossible_();return;default:throw new Error('Unrecognized command '+cmdName);}},selectPreviousOrFirstRowIfPossible_(){const prev=this.selectedTableRowInfo_?this.selectedTableRowInfo_.htmlNode.previousElementSibling:this.$.body.firstChild;if(!prev)return;if(this.selectionMode_===SelectionMode.CELL&&this.getFirstSelectableColumnIndex_()===-1){return;}
+tr.ui.b.scrollIntoViewIfNeeded(prev);this.selectedTableRow=prev.rowInfo.userRow;},selectNextOrFirstRowIfPossible_(){this.getFirstSelectableColumnIndex_;const next=this.selectedTableRowInfo_?this.selectedTableRowInfo_.htmlNode.nextElementSibling:this.$.body.firstChild;if(!next)return;if(this.selectionMode_===SelectionMode.CELL&&this.getFirstSelectableColumnIndex_()===-1){return;}
+tr.ui.b.scrollIntoViewIfNeeded(next);this.selectedTableRow=next.rowInfo.userRow;},expandRowAndSelectChildRowIfPossible_(){const selectedRowInfo=this.selectedTableRowInfo_;if(!selectedRowInfo||selectedRowInfo.userRow[this.subRowsPropertyName_]===undefined||selectedRowInfo.userRow[this.subRowsPropertyName_].length===0){return;}
+if(!selectedRowInfo.isExpanded){this.setExpandedForTableRow(selectedRowInfo.userRow,true);}
+this.selectedTableRow=selectedRowInfo.htmlNode.nextElementSibling.rowInfo.userRow;},collapseRowOrSelectParentRowIfPossible_(){const selectedRowInfo=this.selectedTableRowInfo_;if(!selectedRowInfo)return;if(selectedRowInfo.isExpanded){this.setExpandedForTableRow(selectedRowInfo.userRow,false);}else{const parentRowInfo=selectedRowInfo.parentRowInfo;if(parentRowInfo){this.selectedTableRow=parentRowInfo.userRow;}}},selectNextSelectableCellToTheRightIfPossible_(){if(!this.selectedTableRowInfo_||this.selectedColumnIndex_===undefined){return;}
+for(let i=this.selectedColumnIndex_+1;i<this.tableColumns_.length;i++){if(this.doesColumnIndexSupportSelection(i)){this.selectedColumnIndex=i;return;}}},selectNextSelectableCellToTheLeftIfPossible_(){if(!this.selectedTableRowInfo_||this.selectedColumnIndex_===undefined){return;}
+for(let i=this.selectedColumnIndex_-1;i>=0;i--){if(this.doesColumnIndexSupportSelection(i)){this.selectedColumnIndex=i;return;}}},toggleRowExpansionStateIfPossible_(){const selectedRowInfo=this.selectedTableRowInfo_;if(!selectedRowInfo||selectedRowInfo.userRow[this.subRowsPropertyName_]===undefined||selectedRowInfo.userRow[this.subRowsPropertyName_].length===0){return;}
+this.setExpandedForTableRow(selectedRowInfo.userRow,!selectedRowInfo.isExpanded);},stepIntoSelectionIfPossible_(){if(!this.selectedTableRowInfo_)return;this.dispatchStepIntoEvent_(this.selectedTableRowInfo_,this.selectedColumnIndex_);},dispatchSortingChangedEvent_(){const e=new tr.b.Event('sort-column-changed');e.sortColumnIndex=this.sortColumnIndex_;e.sortDescending=this.sortDescending_;this.dispatchEvent(e);}});})();'use strict';const ColumnAlignment=tr.ui.b.TableFormat.ColumnAlignment;Polymer({is:'tr-ui-b-table-header-cell',created(){this.tapCallback_=undefined;this.cellTitle_='';this.align_=undefined;this.selectable_=false;this.column_=undefined;},ready(){this.addEventListener('click',this.onTap_.bind(this));},set column(column){this.column_=column;this.align=column.align;this.cellTitle=column.title;},get column(){return this.column_;},set cellTitle(value){this.cellTitle_=value;const titleNode=tr.ui.b.asHTMLOrTextNode(this.cellTitle_,this.ownerDocument);this.$.title.innerText='';Polymer.dom(this.$.title).appendChild(titleNode);},get cellTitle(){return this.cellTitle_;},set align(align){switch(align){case undefined:case ColumnAlignment.LEFT:this.style.justifyContent='';break;case ColumnAlignment.RIGHT:this.style.justifyContent='flex-end';break;default:throw new Error('Invalid alignment of column (title=\''+
+this.cellTitle_+'\'): '+align);}
+this.align_=align;},get align(){return this.align_;},clearSideContent(){Polymer.dom(this.$.side).textContent='';},set sideContent(content){Polymer.dom(this.$.side).textContent=content;this.$.side.style.display=content?'inline':'none';},get sideContent(){return Polymer.dom(this.$.side).textContent;},set sideContentDisabled(sideContentDisabled){this.$.side.classList.toggle('disabled',sideContentDisabled);},get sideContentDisabled(){return this.$.side.classList.contains('disabled');},set tapCallback(callback){this.style.cursor='pointer';this.tapCallback_=callback;},get tapCallback(){return this.tapCallback_;},onTap_(){if(this.tapCallback_){this.tapCallback_();}}});'use strict';tr.exportTo('tr.b.math',function(){class RunningStatistics{constructor(){this.mean_=0;this.count_=0;this.max_=-Infinity;this.min_=Infinity;this.sum_=0;this.variance_=0;this.meanlogs_=0;}
+get count(){return this.count_;}
+get geometricMean(){if(this.meanlogs_===undefined)return 0;return Math.exp(this.meanlogs_);}
+get mean(){if(this.count_===0)return undefined;return this.mean_;}
+get max(){return this.max_;}
+get min(){return this.min_;}
+get sum(){return this.sum_;}
+get variance(){if(this.count_===0)return undefined;if(this.count_===1)return 0;return this.variance_/(this.count_-1);}
+get stddev(){if(this.count_===0)return undefined;return Math.sqrt(this.variance);}
+add(x){this.count_++;this.max_=Math.max(this.max_,x);this.min_=Math.min(this.min_,x);this.sum_+=x;if(x<=0){this.meanlogs_=undefined;}else if(this.meanlogs_!==undefined){this.meanlogs_+=(Math.log(Math.abs(x))-this.meanlogs_)/this.count;}
+if(this.count_===1){this.mean_=x;this.variance_=0;}else{const oldMean=this.mean_;const oldVariance=this.variance_;if(oldMean===Infinity||oldMean===-Infinity){this.mean_=this.sum_/this.count_;}else{this.mean_=oldMean+(x-oldMean)/this.count_;}
+this.variance_=oldVariance+(x-oldMean)*(x-this.mean_);}}
+merge(other){const result=new RunningStatistics();result.count_=this.count_+other.count_;result.sum_=this.sum_+other.sum_;result.min_=Math.min(this.min_,other.min_);result.max_=Math.max(this.max_,other.max_);if(result.count===0){result.mean_=0;result.variance_=0;result.meanlogs_=0;}else{result.mean_=result.sum/result.count;const deltaMean=(this.mean||0)-(other.mean||0);result.variance_=this.variance_+other.variance_+
+(this.count*other.count*deltaMean*deltaMean/result.count);if(this.meanlogs_===undefined||other.meanlogs_===undefined){result.meanlogs_=undefined;}else{result.meanlogs_=(this.count*this.meanlogs_+
+other.count*other.meanlogs_)/result.count;}}
+return result;}
+asDict(){if(!this.count){return[];}
+return[this.count_,this.max_,this.meanlogs_,this.mean_,this.min_,this.sum_,this.variance_,];}
+static fromDict(dict){const result=new RunningStatistics();if(dict.length!==7){return result;}
+[result.count_,result.max_,result.meanlogs_,result.mean_,result.min_,result.sum_,result.variance_,]=dict;return result;}}
+return{RunningStatistics,};});'use strict';tr.exportTo('tr.v.d',function(){class Diagnostic{constructor(){this.guid_=undefined;}
+clone(){return new this.constructor();}
+canAddDiagnostic(otherDiagnostic){return false;}
+addDiagnostic(otherDiagnostic){throw new Error('Abstract virtual method: subclasses must override '+'this method if they override canAddDiagnostic');}
+get guid(){if(this.guid_===undefined){this.guid_=tr.b.GUID.allocateUUID4();}
+return this.guid_;}
+set guid(guid){if(this.guid_!==undefined){throw new Error('Cannot reset guid');}
+this.guid_=guid;}
+asDictOrReference(){if(this.guid_!==undefined){return this.guid_;}
+return this.asDict();}
+asDict(){const result={type:this.constructor.name};if(this.guid_!==undefined){result.guid=this.guid_;}
+this.asDictInto_(result);return result;}
+asDictInto_(d){throw new Error('Abstract virtual method: subclasses must override '+'this method if they override canAddDiagnostic');}
+static fromDict(d){const typeInfo=Diagnostic.findTypeInfoWithName(d.type);if(!typeInfo){throw new Error('Unrecognized diagnostic type: '+d.type);}
+const diagnostic=typeInfo.constructor.fromDict(d);if(d.guid!==undefined)diagnostic.guid=d.guid;return diagnostic;}}
+const options=new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE);options.defaultMetadata={};options.mandatoryBaseClass=Diagnostic;tr.b.decorateExtensionRegistry(Diagnostic,options);Diagnostic.addEventListener('will-register',function(e){const constructor=e.typeInfo.constructor;if(!(constructor.fromDict instanceof Function)||(constructor.fromDict===Diagnostic.fromDict)||(constructor.fromDict.length!==1)){throw new Error('Diagnostics must define fromDict(d)');}});return{Diagnostic,};});'use strict';tr.exportTo('tr.v.d',function(){class Breakdown extends tr.v.d.Diagnostic{constructor(){super();this.values_=new Map();this.colorScheme=undefined;}
+clone(){const clone=new Breakdown();clone.colorScheme=this.colorScheme;clone.addDiagnostic(this);return clone;}
+canAddDiagnostic(otherDiagnostic){return((otherDiagnostic instanceof Breakdown)&&(otherDiagnostic.colorScheme===this.colorScheme));}
+addDiagnostic(otherDiagnostic){for(const[name,value]of otherDiagnostic){this.set(name,this.get(name)+value);}
+return this;}
+set(name,value){if(typeof name!=='string'||typeof value!=='number'){throw new Error('Breakdown maps from strings to numbers');}
+this.values_.set(name,value);}
+get(name){return this.values_.get(name)||0;}*[Symbol.iterator](){for(const pair of this.values_){yield pair;}}
+asDictInto_(d){d.values={};for(const[name,value]of this){d.values[name]=tr.b.numberToJson(value);}
+if(this.colorScheme){d.colorScheme=this.colorScheme;}}
+static fromDict(d){const breakdown=new Breakdown();for(const[name,value]of Object.entries(d.values)){breakdown.set(name,tr.b.numberFromJson(value));}
+if(d.colorScheme){breakdown.colorScheme=d.colorScheme;}
+return breakdown;}}
+tr.v.d.Diagnostic.register(Breakdown,{elementName:'tr-v-ui-breakdown-span'});return{Breakdown,};});'use strict';tr.exportTo('tr.v.d',function(){class BuildbotInfo extends tr.v.d.Diagnostic{constructor(info){super();this.displayMasterName_=info.displayMasterName||'';this.displayBotName_=info.displayBotName||'';this.buildbotMasterName_=info.buildbotMasterName||'';this.buildbotName_=info.buildbotName||'';this.buildNumber_=info.buildNumber||0;this.logUri_=info.logUri||'';}
+addToHistogram(hist){hist.diagnostics.set(BuildbotInfo.NAME,this);}
+clone(){const clone=new tr.v.d.MergedBuildbotInfo();clone.addDiagnostic(this);return clone;}
+asDictInto_(d){d.displayMasterName=this.displayMasterName;d.displayBotName=this.displayBotName;d.buildbotMasterName=this.buildbotMasterName;d.buildbotName=this.buildbotName;d.buildNumber=this.buildNumber;d.logUri=this.logUri;}
+get displayMasterName(){return this.displayMasterName_;}
+get displayBotName(){return this.displayBotName_;}
+get buildbotMasterName(){return this.buildbotMasterName_;}
+get buildbotName(){return this.buildbotName_;}
+get buildNumber(){return this.buildNumber_;}
+get logUri(){return this.logUri_;}
+static fromDict(d){return new BuildbotInfo(d);}
+static getFromHistogram(hist){return hist.diagnostics.get(BuildbotInfo.NAME);}
+static getField(hist,fieldName,defaultValue){const buildbot=BuildbotInfo.getFromHistogram(hist);if(!(buildbot instanceof tr.v.d.BuildbotInfo)||!buildbot[fieldName]){return defaultValue;}
+return buildbot[fieldName];}}
+BuildbotInfo.NAME='buildbot';tr.v.d.Diagnostic.register(BuildbotInfo,{elementName:'tr-v-ui-buildbot-info-span'});return{BuildbotInfo,};});'use strict';tr.exportTo('tr.v.d',function(){class Generic extends tr.v.d.Diagnostic{constructor(value){super();this.value=value;}
+clone(){const clone=new tr.v.d.CollectedGeneric();clone.addDiagnostic(this);return clone;}
+asDictInto_(d){d.value=this.value;}
+static fromDict(d){return new Generic(d.value);}}
+tr.v.d.Diagnostic.register(Generic,{elementName:'tr-v-ui-generic-diagnostic-span'});return{Generic,};});'use strict';tr.exportTo('tr.v.d',function(){class CollectedGeneric extends tr.v.d.Generic{constructor(){super([]);}
+canAddDiagnostic(otherDiagnostic){return otherDiagnostic instanceof tr.v.d.Generic;}
+addDiagnostic(otherDiagnostic){if(otherDiagnostic instanceof CollectedGeneric){this.value.push(...otherDiagnostic.value);}else{this.value.push(otherDiagnostic.value);}}}
+tr.v.d.Diagnostic.register(CollectedGeneric,{elementName:'tr-v-ui-generic-diagnostic-span'});return{CollectedGeneric,};});'use strict';tr.exportTo('tr.v.d',function(){class CollectedRelatedEventSet extends tr.v.d.Diagnostic{constructor(){super();this.eventSetsByCanonicalUrl_=new Map();}
+asDictInto_(d){d.events={};for(const[canonicalUrl,eventSet]of this){d.events[canonicalUrl]=[];for(const event of eventSet){d.events[canonicalUrl].push({stableId:event.stableId,title:event.title,start:event.start,duration:event.duration});}}}
+static fromDict(d){const result=new CollectedRelatedEventSet();for(const[canonicalUrl,events]of Object.entries(d.events)){result.eventSetsByCanonicalUrl_.set(canonicalUrl,events.map(e=>new tr.v.d.EventRef(e)));}
+return result;}
+get size(){return this.eventSetsByCanonicalUrl_.size;}
+get(canonicalUrl){return this.eventSetsByCanonicalUrl_.get(canonicalUrl);}*[Symbol.iterator](){for(const[canonicalUrl,eventSet]of this.eventSetsByCanonicalUrl_){yield[canonicalUrl,eventSet];}}
+canAddDiagnostic(otherDiagnostic){return otherDiagnostic instanceof tr.v.d.RelatedEventSet||otherDiagnostic instanceof tr.v.d.CollectedRelatedEventSet;}
+addEventSetForCanonicalUrl(canonicalUrl,events){let myEventSet=this.eventSetsByCanonicalUrl_.get(canonicalUrl);if(myEventSet===undefined){myEventSet=new Set();this.eventSetsByCanonicalUrl_.set(canonicalUrl,myEventSet);}
+for(const event of events){myEventSet.add(event);}}
+addDiagnostic(otherDiagnostic){if(otherDiagnostic instanceof tr.v.d.CollectedRelatedEventSet){for(const[canonicalUrl,otherEventSet]of otherDiagnostic){this.addEventSetForCanonicalUrl(canonicalUrl,otherEventSet);}
+return;}
+if(!otherDiagnostic.canonicalUrl)return;this.addEventSetForCanonicalUrl(otherDiagnostic.canonicalUrl,otherDiagnostic);}}
+tr.v.d.Diagnostic.register(CollectedRelatedEventSet,{elementName:'tr-v-ui-collected-related-event-set-span'});return{CollectedRelatedEventSet,};});'use strict';tr.exportTo('tr.v.d',function(){class DeviceInfo extends tr.v.d.Diagnostic{constructor(opt_info){super();const info=opt_info||{};this.chromeVersion_=info.chromeVersion||'';this.osName_=info.osName||'';this.osVersion_=info.osVersion||'';this.gpuInfo_=info.gpuInfo||undefined;this.arch_=info.arch||undefined;this.ram_=info.ram||0;}
+addToHistogram(hist){hist.diagnostics.set(DeviceInfo.NAME,this);}
+static getFromHistogram(hist){return hist.diagnostics.get(DeviceInfo.NAME);}
+clone(){const clone=new tr.v.d.MergedDeviceInfo();clone.addDiagnostic(this);return clone;}
+asDictInto_(d){d.chromeVersion=this.chromeVersion;d.osName=this.osName;d.osVersion=this.osVersion;d.gpuInfo=this.gpuInfo;d.arch=this.arch;d.ram=this.ram;}
+static fromDict(d){return new DeviceInfo(d);}
+get chromeVersion(){return this.chromeVersion_;}
+get osName(){return this.osName_;}
+get osVersion(){return this.osVersion_;}
+get gpuInfo(){return this.gpuInfo_;}
+get arch(){return this.arch_;}
+get ram(){return this.ram_;}}
+DeviceInfo.NAME='device';tr.v.d.Diagnostic.register(DeviceInfo,{elementName:'tr-v-ui-device-info-span'});return{DeviceInfo,};});'use strict';tr.exportTo('tr.v.d',function(){class DiagnosticRef{constructor(guid){this.guid=guid;}
+asDict(){return this.guid;}}
+return{DiagnosticRef,};});'use strict';tr.exportTo('tr.v.d',function(){class GroupingPath extends tr.v.d.Diagnostic{constructor(groupingPath){super();this.groupingPath_=groupingPath;}
+clone(){return new GroupingPath(Array.from(this.groupingPath_));}
+addToHistogram(hist){hist.diagnostics.set(GroupingPath.NAME,this);}
+static getFromHistogram(hist){return hist.diagnostics.get(GroupingPath.NAME);}
+equals(other){return 0===tr.b.compareArrays(this.groupingPath_,other.groupingPath_,(x,y)=>x.localeCompare(y));}
+asDictInto_(d){d.groupingPath=this.groupingPath_;}
+static fromDict(d){return new GroupingPath(d.groupingPath);}}
+GroupingPath.NAME='grouping path';tr.v.d.Diagnostic.register(GroupingPath);return{GroupingPath,};});'use strict';tr.exportTo('tr.v.d',function(){class MergedBuildbotInfo extends tr.v.d.Diagnostic{constructor(info){super();this.displayMasterNames_=new Set();this.displayBotNames_=new Set();this.buildbotMasterNames_=new Set();this.buildbotNames_=new Set();this.buildNumbers_=new Set();this.logUris_=new Set();}
+clone(){const clone=new MergedBuildbotInfo();clone.addDiagnostic(this);return clone;}
+addToHistogram(hist){hist.diagnostics.set(tr.v.d.BuildbotInfo.NAME,this);}
+equals(other){if(!(other instanceof MergedBuildbotInfo))return false;if(!tr.b.setsEqual(this.displayMasterNames,other.displayMasterNames)){return false;}
+if(!tr.b.setsEqual(this.displayBotNames,other.displayBotNames)){return false;}
+if(!tr.b.setsEqual(this.buildbotMasterNames,other.buildbotMasterNames)){return false;}
+if(!tr.b.setsEqual(this.buildbotNames,other.buildbotNames)){return false;}
+if(!tr.b.setsEqual(this.buildNumbers,other.buildNumbers))return false;if(!tr.b.setsEqual(this.logUris,other.logUris))return false;return true;}
+canAddDiagnostic(otherDiagnostic){return otherDiagnostic instanceof MergedBuildbotInfo||otherDiagnostic instanceof tr.v.d.BuildbotInfo;}
+addDiagnostic(otherDiagnostic){if(otherDiagnostic instanceof MergedBuildbotInfo){for(const name of otherDiagnostic.displayMasterNames){this.displayMasterNames.add(name);}
+for(const name of otherDiagnostic.displayBotNames){this.displayBotNames.add(name);}
+for(const name of otherDiagnostic.buildbotMasterNames){this.buildbotMasterNames.add(name);}
+for(const name of otherDiagnostic.buildbotNames){this.buildbotNames.add(name);}
+for(const name of otherDiagnostic.buildNumbers){this.buildNumbers.add(name);}
+for(const name of otherDiagnostic.logUris){this.logUris.add(name);}
+return this;}
+if(otherDiagnostic.displayMasterName){this.displayMasterNames.add(otherDiagnostic.displayMasterName);}
+if(otherDiagnostic.displayBotName){this.displayBotNames.add(otherDiagnostic.displayBotName);}
+if(otherDiagnostic.buildbotMasterName){this.buildbotMasterNames.add(otherDiagnostic.buildbotMasterName);}
+if(otherDiagnostic.buildbotName){this.buildbotNames.add(otherDiagnostic.buildbotName);}
+if(otherDiagnostic.buildNumber){this.buildNumbers.add(otherDiagnostic.buildNumber);}
+if(otherDiagnostic.logUri){this.logUris.add(otherDiagnostic.logUri);}
+return this;}
+asDictInto_(d){d.displayMasterNames=Array.from(this.displayMasterNames);d.displayBotNames=Array.from(this.displayBotNames);d.buildbotMasterNames=Array.from(this.buildbotMasterNames);d.buildbotNames=Array.from(this.buildbotNames);d.buildNumbers=Array.from(this.buildNumbers);d.logUris=Array.from(this.logUris);}
+get displayMasterNames(){return this.displayMasterNames_;}
+get displayBotNames(){return this.displayBotNames_;}
+get buildbotMasterNames(){return this.buildbotMasterNames_;}
+get buildbotNames(){return this.buildbotNames_;}
+get buildNumbers(){return this.buildNumbers_;}
+get logUris(){return this.logUris_;}
+static fromDict(d){const info=new MergedBuildbotInfo();for(const name of d.displayMasterNames){info.displayMasterNames.add(name);}
+for(const name of d.displayBotNames){info.displayBotNames.add(name);}
+for(const name of d.buildbotMasterNames){info.buildbotMasterNames.add(name);}
+for(const name of d.buildbotNames){info.buildbotNames.add(name);}
+for(const name of d.buildNumbers){info.buildNumbers.add(name);}
+for(const name of d.logUris){info.logUris.add(name);}
+return info;}}
+tr.v.d.Diagnostic.register(MergedBuildbotInfo,{elementName:'tr-v-ui-merged-buildbot-info-span'});return{MergedBuildbotInfo,};});'use strict';tr.exportTo('tr.v.d',function(){class MergedDeviceInfo extends tr.v.d.Diagnostic{constructor(){super();this.chromeVersions_=new Set();this.osNames_=new Set();this.osVersions_=new Set();}
+clone(){const clone=new tr.v.d.MergedDeviceInfo();clone.addDiagnostic(this);return clone;}
+addToHistogram(hist){hist.diagnostics.set(tr.v.d.DeviceInfo.NAME,this);}
+canAddDiagnostic(otherDiagnostic){return otherDiagnostic instanceof MergedDeviceInfo||otherDiagnostic instanceof tr.v.d.DeviceInfo;}
+addDiagnostic(otherDiagnostic){if(otherDiagnostic instanceof MergedDeviceInfo){for(const name of otherDiagnostic.osNames){this.osNames.add(name);}
+for(const name of otherDiagnostic.osVersions){this.osVersions.add(name);}
+for(const name of otherDiagnostic.chromeVersions){this.chromeVersions.add(name);}
+return this;}
+if(otherDiagnostic.osName){this.osNames.add(otherDiagnostic.osName);}
+if(otherDiagnostic.osVersion){this.osVersions.add(otherDiagnostic.osVersion);}
+if(otherDiagnostic.chromeVersion){this.chromeVersions.add(otherDiagnostic.chromeVersion);}
+return this;}
+equals(other){if(!(other instanceof MergedDeviceInfo))return false;if(!tr.b.setsEqual(this.chromeVersions,other.chromeVersions)){return false;}
+if(!tr.b.setsEqual(this.osVersions,other.osVersions))return false;if(!tr.b.setsEqual(this.osNames,other.osNames))return false;return true;}
+asDictInto_(d){d.chromeVersions=Array.from(this.chromeVersions);d.osNames=Array.from(this.osNames);d.osVersions=Array.from(this.osVersions);}
+static fromDict(d){const info=new MergedDeviceInfo();for(const chromeVersion of d.chromeVersions){info.chromeVersions.add(chromeVersion);}
+for(const osName of d.osNames){info.osNames.add(osName);}
+for(const osVersion of d.osVersions){info.osVersions.add(osVersion);}
+return info;}
+get chromeVersions(){return this.chromeVersions_;}
+get osNames(){return this.osNames_;}
+get osVersions(){return this.osVersions_;}}
+tr.v.d.Diagnostic.register(MergedDeviceInfo,{elementName:'tr-v-ui-merged-device-info-span'});return{MergedDeviceInfo,};});'use strict';tr.exportTo('tr.v.d',function(){const REPO_NAMES=['chromium','v8','catapult','angle','skia','webrtc'];class MergedRevisionInfo extends tr.v.d.Diagnostic{constructor(opt_info){super();const info=opt_info||{};this.chromiumCommitPositions_=new Set(info.chromiumCommitPositions||[]);this.v8CommitPositions_=new Set(info.v8CommitPositions||[]);this.chromium_=info.chromium||[];this.v8_=info.v8||[];this.catapult_=info.catapult||[];this.angle_=info.angle||[];this.skia_=info.skia||[];this.webrtc_=info.webrtc||[];}
+clone(){const clone=new MergedRevisionInfo();clone.addDiagnostic(this);return clone;}
+addToHistogram(hist){hist.diagnostics.set(tr.v.d.RevisionInfo.NAME,this);}
+canAddDiagnostic(otherDiagnostic,name,parentHist,otherParentHist){return otherDiagnostic instanceof tr.v.d.RevisionInfo||otherDiagnostic instanceof MergedRevisionInfo;}
+addDiagnostic(otherDiagnostic,name,parentHist,otherParentHist){if(otherDiagnostic instanceof MergedRevisionInfo){for(const pos of otherDiagnostic.chromiumCommitPositions){this.chromiumCommitPositions.add(pos);}
+for(const pos of otherDiagnostic.v8CommitPositions){this.v8CommitPositions.add(pos);}
+for(const repo of REPO_NAMES){for(const otherRevs of otherDiagnostic[repo]){let found=false;for(const revs of this[repo]){if(otherRevs[0]===revs[0]&&otherRevs[1]===revs[1]){found=true;break;}}
+if(!found){this[repo].push(otherRevs);}}}
+return this;}
+if(otherDiagnostic.chromiumCommitPosition!==undefined){this.chromiumCommitPositions.add(otherDiagnostic.chromiumCommitPosition);}
+if(otherDiagnostic.v8CommitPosition!==undefined){this.v8CommitPositions.add(otherDiagnostic.v8CommitPosition);}
+for(const repo of REPO_NAMES){const otherRevs=otherDiagnostic[repo];let found=false;for(const revs of this[repo]){if(otherRevs[0]===revs[0]&&otherRevs[1]===revs[1]){found=true;break;}}
+if(!found){this[repo].push(otherRevs);}}
+return this;}
+asDictInto_(d){d.chromiumCommitPositions=this.chromiumCommitPositions;d.v8CommitPositions=this.v8CommitPositions;d.chromium=this.chromium;d.v8=this.v8;d.catapult=this.catapult;d.angle=this.angle;d.skia=this.skia;d.webrtc=this.webrtc;}
+static fromDict(d){return new MergedRevisionInfo(d);}
+get chromiumCommitPositions(){return this.chromiumCommitPositions_;}
+get v8CommitPositions(){return this.v8CommitPositions_;}
+get chromium(){return this.chromium_;}
+get v8(){return this.v8_;}
+get catapult(){return this.catapult_;}
+get angle(){return this.angle_;}
+get skia(){return this.skia_;}
+get webrtc(){return this.webrtc_;}}
+tr.v.d.Diagnostic.register(MergedRevisionInfo,{elementName:'tr-v-ui-merged-revision-info-span'});return{MergedRevisionInfo,};});'use strict';tr.exportTo('tr.v.d',function(){class MergedTelemetryInfo extends tr.v.d.Diagnostic{constructor(){super();this.benchmarkNames_=new Set();this.benchmarkStartsMs_=new Set();this.labels_=new Set();this.legacyTIRLabels_=new Set();this.storyDisplayNames_=new Set();this.storyGroupingKeys_=new Map();this.storysetRepeatCounters_=new Set();}
+clone(){const clone=new tr.v.d.MergedTelemetryInfo();clone.addDiagnostic(this);return clone;}
+addToHistogram(hist){hist.diagnostics.set(tr.v.d.TelemetryInfo.NAME,this);}
+equals(other){if(!(other instanceof MergedTelemetryInfo))return false;if(!tr.b.setsEqual(this.benchmarkNames,other.benchmarkNames)){return false;}
+if(!tr.b.setsEqual(this.labels,other.labels))return false;if(!tr.b.setsEqual(this.storyDisplayNames,other.storyDisplayNames)){return false;}
+if(!tr.b.setsEqual(this.legacyTIRLabels,other.legacyTIRLabels)){return false;}
+if(!tr.b.setsEqual(this.storysetRepeatCounters,other.storysetRepeatCounters)){return false;}
+if(!tr.b.setsEqual(this.benchmarkStartsMs,other.benchmarkStartsMs)){return false;}
+if(!tr.b.setsEqual(new Set(this.storyGroupingKeys.keys()),new Set(other.storyGroupingKeys.keys()))){return false;}
+for(const[k,vs]of this.storyGroupingKeys){if(!tr.b.setsEqual(vs,other.storyGroupingKeys.get(k))){return false;}}
+return true;}
+canAddDiagnostic(otherDiagnostic){return otherDiagnostic instanceof MergedTelemetryInfo||otherDiagnostic instanceof tr.v.d.TelemetryInfo;}
+addDiagnostic(otherDiagnostic){if(otherDiagnostic instanceof MergedTelemetryInfo){for(const name of otherDiagnostic.benchmarkNames){this.benchmarkNames.add(name);}
+for(const t of otherDiagnostic.benchmarkStartsMs){this.benchmarkStartsMs.add(t);}
+for(const name of otherDiagnostic.labels){this.labels.add(name);}
+for(const name of otherDiagnostic.legacyTIRLabels){this.legacyTIRLabels.add(name);}
+for(const name of otherDiagnostic.storyDisplayNames){this.storyDisplayNames.add(name);}
+for(const name of otherDiagnostic.storysetRepeatCounters){this.storysetRepeatCounters.add(name);}
+for(const[name,value]of otherDiagnostic.storyGroupingKeys){if(this.storyGroupingKeys.has(name)){for(const subValue of value){this.storyGroupingKeys.get(name).add(subValue);}}else{this.storyGroupingKeys.set(name,new Set(value));}}
+return;}
+if(otherDiagnostic.benchmarkName){this.benchmarkNames.add(otherDiagnostic.benchmarkName);}
+if(otherDiagnostic.benchmarkStart!==undefined){this.benchmarkStartsMs.add(otherDiagnostic.benchmarkStart.getTime());}
+if(otherDiagnostic.label){this.labels.add(otherDiagnostic.label);}
+if(otherDiagnostic.legacyTIRLabel){this.legacyTIRLabels.add(otherDiagnostic.legacyTIRLabel);}
+if(otherDiagnostic.storyDisplayName){this.storyDisplayNames.add(otherDiagnostic.storyDisplayName);}
+for(const[name,value]of otherDiagnostic.storyGroupingKeys){if(this.storyGroupingKeys.has(name)){this.storyGroupingKeys.get(name).add(value);}else{this.storyGroupingKeys.set(name,new Set([value]));}}
+if(otherDiagnostic.storysetRepeatCounter!==undefined){this.storysetRepeatCounters.add(otherDiagnostic.storysetRepeatCounter);}}
+asDictInto_(d){if(this.benchmarkNames.size){d.benchmarkNames=Array.from(this.benchmarkNames);}
+if(this.benchmarkStartsMs.size){d.benchmarkStartsMs=Array.from(this.benchmarkStartsMs);}
+if(this.labels.size){d.labels=Array.from(this.labels);}
+if(this.legacyTIRLabels.size){d.legacyTIRLabels=this.legacyTIRLabels;}
+if(this.storyDisplayNames.size){d.storyDisplayNames=Array.from(this.storyDisplayNames);}
+if(this.storyGroupingKeys.size){d.storyGroupingKeys={};for(const[name,values]of this.storyGroupingKeys){d.storyGroupingKeys[name]=Array.from(values);}}
+if(this.storysetRepeatCounters.size){d.storysetRepeatCounters=Array.from(this.storysetRepeatCounters);}}
+static fromDict(d){const info=new MergedTelemetryInfo();for(const n of d.benchmarkNames||[]){info.benchmarkNames_.add(n);}
+for(const n of d.benchmarkStartsMs||[]){info.benchmarkStartsMs_.add(n);}
+for(const n of d.labels||[]){info.labels_.add(n);}
+for(const n of d.legacyTIRLabels||[]){info.legacyTIRLabels_.add(n);}
+for(const n of d.storyDisplayNames||[]){info.storyDisplayNames_.add(n);}
+for(const[name,values]of Object.entries(d.storyGroupingKeys||{})){info.storyGroupingKeys_.set(name,new Set(values));}
+for(const n of d.storysetRepeatCounters||[]){info.storysetRepeatCounters_.add(n);}
+return info;}
+get displayLabel(){if(this.labels.size){return Array.from(this.labels).join('\n');}
+return Array.from(this.benchmarkNames).concat(this.benchmarkStartStrings).join('\n');}
+get benchmarkNames(){return this.benchmarkNames_;}
+get labels(){return this.labels_;}
+get legacyTIRLabels(){return this.legacyTIRLabels_;}
+get storyGroupingKeys(){return this.storyGroupingKeys_;}
+get storyDisplayNames(){return this.storyDisplayNames_;}
+get storysetRepeatCounters(){return this.storysetRepeatCounters_;}
+get storysetRepeatCounterLabel(){return'storyset repeat '+Array.from(this.storysetRepeatCounters).join(',');}
+get benchmarkStartsMs(){return this.benchmarkStartsMs_;}
+get benchmarkStarts(){const startsMs=Array.from(this.benchmarkStartsMs);startsMs.sort((x,y)=>x-y);return startsMs.map(t=>new Date(t));}
+get benchmarkStartStrings(){return this.benchmarkStarts.map(tr.b.formatDate);}
+static getField(hist,fieldName,defaultValue){const telemetry=tr.v.d.TelemetryInfo.getFromHistogram(hist);if(!(telemetry instanceof tr.v.d.MergedTelemetryInfo)||!telemetry[fieldName]){return defaultValue;}
+return telemetry[fieldName];}
+static getStoryGroupingKeyLabel(hist,storyGroupingKey){const telemetry=tr.v.d.TelemetryInfo.getFromHistogram(hist);if(!(telemetry instanceof tr.v.d.MergedTelemetryInfo)){return storyGroupingKey+': undefined';}
+return storyGroupingKey+': '+
+telemetry.storyGroupingKeys[storyGroupingKey];}
+static makeStoryGroupingKeyLabelGetter(storyGroupingKey){return v=>MergedTelemetryInfo.getStoryGroupingKeyLabel(v,storyGroupingKey);}}
+tr.v.d.Diagnostic.register(MergedTelemetryInfo,{elementName:'tr-v-ui-merged-telemetry-info-span'});return{MergedTelemetryInfo,};});'use strict';tr.exportTo('tr.v.d.',function(){class Ownership extends tr.v.d.Diagnostic{constructor(emails,component){super();this.emails=emails||[];if(typeof(component)==='string'){this.component=component;}}
+asDictInto_(d){if(this.component!==undefined){d.component=this.component;}
+d.emails=this.emails;}
+clone(){return new Ownership(this.emails,this.component);}
+static fromDict(d){return new Ownership(d.emails,d.component);}}
+tr.v.d.Diagnostic.register(Ownership);return{Ownership,};});'use strict';tr.exportTo('tr.v.d',function(){class EventRef{constructor(event){this.stableId=event.stableId;this.title=event.title;this.start=event.start;this.duration=event.duration;this.end=this.start+this.duration;this.guid=tr.b.GUID.allocateSimple();}}
+return{EventRef,};});'use strict';tr.exportTo('tr.v.d',function(){class RelatedEventSet extends tr.v.d.Diagnostic{constructor(opt_events){super();this.eventsByStableId_=new Map();this.canonicalUrl_=undefined;if(opt_events){if(opt_events instanceof tr.model.EventSet||opt_events instanceof Array){for(const event of opt_events){this.add(event);}}else{this.add(opt_events);}}}
+clone(){const clone=new tr.v.d.CollectedRelatedEventSet();clone.addDiagnostic(this);return clone;}
+add(event){this.eventsByStableId_.set(event.stableId,event);}
+has(event){return this.eventsByStableId_.has(event.stableId);}
+get length(){return this.eventsByStableId_.size;}*[Symbol.iterator](){for(const event of this.eventsByStableId_.values()){yield event;}}
+get canonicalUrl(){return this.canonicalUrl_;}
+resolve(model,opt_required){for(const[stableId,value]of this.eventsByStableId_){if(!(value instanceof tr.v.d.EventRef))continue;const event=model.getEventByStableId(stableId);if(event instanceof tr.model.Event){this.eventsByStableId_.set(stableId,event);}else if(opt_required){throw new Error('Unable to find Event '+stableId);}}}
+asDictInto_(d){d.events=[];for(const event of this){d.events.push({stableId:event.stableId,title:event.title,start:event.start,duration:event.duration});}}
+static fromDict(d){return new RelatedEventSet(d.events.map(event=>new tr.v.d.EventRef(event)));}}
+tr.v.d.Diagnostic.register(RelatedEventSet,{elementName:'tr-v-ui-related-event-set-span'});return{RelatedEventSet,};});'use strict';tr.exportTo('tr.v.d',function(){function HistogramRef(guid){this.guid=guid;}
+return{HistogramRef};});'use strict';tr.exportTo('tr.v.d',function(){class RelatedHistogramMap extends tr.v.d.Diagnostic{constructor(){super();this.histogramsByName_=new Map();}
+canAddDiagnostic(otherDiagnostic){return otherDiagnostic instanceof RelatedHistogramMap;}
+addDiagnostic(otherDiagnostic){}
+mergeRelationships(otherDiagnostic,parentHist,otherParentHist){const parentGroupingPath=tr.v.d.GroupingPath.getFromHistogram(parentHist);for(const[name,otherRelatedHist]of otherDiagnostic){const mergedTo=otherRelatedHist.diagnostics.get(tr.v.d.MERGED_TO_DIAGNOSTIC_KEY);if(mergedTo===undefined)continue;for(const relatedHist of mergedTo){const relatedGroupingPath=tr.v.d.GroupingPath.getFromHistogram(relatedHist);if(relatedGroupingPath===undefined)continue;if(!parentGroupingPath.equals(relatedGroupingPath))continue;this.set(name,relatedHist);}}}
+get(name){return this.histogramsByName_.get(name);}
+set(name,hist){if(!(hist instanceof tr.v.Histogram)&&!(hist instanceof tr.v.d.HistogramRef)){throw new Error('Must be instanceof Histogram or HistogramRef: '+
+hist);}
+this.histogramsByName_.set(name,hist);}
+add(hist){this.set(hist.name,hist);}
+get length(){return this.histogramsByName_.size;}*[Symbol.iterator](){for(const pair of this.histogramsByName_){yield pair;}}
+resolve(histograms,opt_required){for(const[name,value]of this){if(!(value instanceof tr.v.d.HistogramRef))continue;const guid=value.guid;const hist=histograms.lookupHistogram(guid);if(hist instanceof tr.v.Histogram){this.histogramsByName_.set(name,hist);}else if(opt_required){throw new Error('Unable to find Histogram '+guid);}}}
+asDictInto_(d){d.values={};for(const[name,hist]of this){d.values[name]=hist.guid;}}
+static fromDict(d){const map=new RelatedHistogramMap();for(const[name,guid]of Object.entries(d.values)){map.set(name,new tr.v.d.HistogramRef(guid));}
+return map;}}
+tr.v.d.Diagnostic.register(RelatedHistogramMap,{elementName:'tr-v-ui-related-histogram-map-span'});return{RelatedHistogramMap,};});'use strict';tr.exportTo('tr.v.d',function(){const COLOR_SCHEME_CHROME_USER_FRIENDLY_CATEGORY_DRIVER='ChromeUserFriendlyCategory';class RelatedHistogramBreakdown extends tr.v.d.RelatedHistogramMap{constructor(){super();this.colorScheme=undefined;}
+clone(){const clone=new RelatedHistogramBreakdown();clone.colorScheme=this.colorScheme;return clone;}
+canAddDiagnostic(otherDiagnostic){return otherDiagnostic instanceof RelatedHistogramBreakdown&&otherDiagnostic.colorScheme===this.colorScheme;}
+set(name,hist){if(!(hist instanceof tr.v.d.HistogramRef)){if(!(hist instanceof tr.v.Histogram)){throw new Error('RelatedHistogramBreakdown can only contain Histograms');}
+if((this.length>0)&&(hist.unit!==tr.b.getFirstElement(this)[1].unit)){throw new Error('Units mismatch',tr.b.getFirstElement(this)[1].unit,hist.unit);}}
+tr.v.d.RelatedHistogramMap.prototype.set.call(this,name,hist);}
+asDictInto_(d){tr.v.d.RelatedHistogramMap.prototype.asDictInto_.call(this,d);if(this.colorScheme)d.colorScheme=this.colorScheme;}
+static fromDict(d){const diagnostic=new RelatedHistogramBreakdown();for(const[name,guid]of Object.entries(d.values)){diagnostic.set(name,new tr.v.d.HistogramRef(guid));}
+if(d.colorScheme)diagnostic.colorScheme=d.colorScheme;return diagnostic;}
+static buildFromEvents(histograms,namePrefix,events,categoryForEvent,unit,opt_sampleForEvent,opt_binBoundaries,opt_this){const sampleForEvent=opt_sampleForEvent||((event)=>event.cpuSelfTime);const diagnostic=new RelatedHistogramBreakdown();for(const event of events){const sample=sampleForEvent.call(opt_this,event);if(sample===undefined)continue;const eventCategory=categoryForEvent.call(opt_this,event);let hist=diagnostic.get(eventCategory);if(hist===undefined){hist=new tr.v.Histogram(namePrefix+eventCategory,unit,opt_binBoundaries);histograms.addHistogram(hist);diagnostic.set(eventCategory,hist);}
+hist.addSample(sample,{relatedEvents:new tr.v.d.RelatedEventSet([event])});}
+return diagnostic;}}
+tr.v.d.Diagnostic.register(RelatedHistogramBreakdown,{elementName:'tr-v-ui-breakdown-span'});return{COLOR_SCHEME_CHROME_USER_FRIENDLY_CATEGORY_DRIVER,RelatedHistogramBreakdown,};});'use strict';tr.exportTo('tr.v.d',function(){class RelatedHistogramSet extends tr.v.d.Diagnostic{constructor(opt_histograms){super();this.histogramsByGuid_=new Map();if(opt_histograms){for(const hist of opt_histograms){this.add(hist);}}}
+canAddDiagnostic(otherDiagnostic){return otherDiagnostic instanceof RelatedHistogramSet;}
+addDiagnostic(otherDiagnostic){}
+mergeRelationships(otherDiagnostic,parentHist,otherParentHist){const parentGroupingPath=tr.v.d.GroupingPath.getFromHistogram(parentHist);for(const otherRelatedHist of otherDiagnostic){const mergedTo=otherRelatedHist.diagnostics.get(tr.v.d.MERGED_TO_DIAGNOSTIC_KEY);if(mergedTo===undefined)continue;for(const relatedHist of mergedTo){if(this.has(relatedHist))continue;const relatedGroupingPath=tr.v.d.GroupingPath.getFromHistogram(relatedHist);if(relatedGroupingPath===undefined)continue;if(!parentGroupingPath.equals(relatedGroupingPath))continue;this.add(relatedHist);}}}
+add(hist){if(!(hist instanceof tr.v.Histogram)&&!(hist instanceof tr.v.d.HistogramRef)){throw new Error('Must be instanceof Histogram or HistogramRef: '+
+hist);}
+if(this.histogramsByGuid_.has(hist.guid)){throw new Error('Tried to add same hist twice');}
+this.histogramsByGuid_.set(hist.guid,hist);}
+has(hist){return this.histogramsByGuid_.has(hist.guid);}
+get length(){return this.histogramsByGuid_.size;}*[Symbol.iterator](){for(const[guid,hist]of this.histogramsByGuid_){yield hist;}}
+resolve(histograms,opt_required){for(const[guid,value]of this.histogramsByGuid_){if(!(value instanceof tr.v.d.HistogramRef))continue;const hist=histograms.lookupHistogram(guid);if(hist instanceof tr.v.Histogram){this.histogramsByGuid_.set(guid,hist);}else if(opt_required){throw new Error('Unable to find Histogram '+guid);}}}
+asDictInto_(d){d.guids=[];for(const hist of this){d.guids.push(hist.guid);}}
+static fromDict(d){return new RelatedHistogramSet(d.guids.map(guid=>new tr.v.d.HistogramRef(guid)));}}
+tr.v.d.Diagnostic.register(RelatedHistogramSet,{elementName:'tr-v-ui-related-histogram-set-span'});return{RelatedHistogramSet,};});'use strict';tr.exportTo('tr.v.d',function(){class RevisionInfo extends tr.v.d.Diagnostic{constructor(info){super();this.chromiumCommitPosition_=info.chromiumCommitPosition||undefined;this.v8CommitPosition_=info.v8CommitPosition||undefined;this.chromium_=info.chromium||[];this.v8_=info.v8||[];this.catapult_=info.catapult||[];this.angle_=info.angle||[];this.skia_=info.skia||[];this.webrtc_=info.webrtc||[];}
+addToHistogram(hist){hist.diagnostics.set(RevisionInfo.NAME,this);}
+clone(){const clone=new tr.v.d.MergedRevisionInfo();clone.addDiagnostic(this);return clone;}
+asDictInto_(d){d.chromiumCommitPosition=this.chromiumCommitPosition;d.v8CommitPosition=this.v8CommitPosition;d.chromium=this.chromium;d.v8=this.v8;d.catapult=this.catapult;d.angle=this.angle;d.skia=this.skia;d.webrtc=this.webrtc;}
+static fromDict(d){return new RevisionInfo(d);}
+get chromiumCommitPosition(){return this.chromiumCommitPosition_;}
+get v8CommitPosition(){return this.v8CommitPosition_;}
+get chromium(){return this.chromium_;}
+get v8(){return this.v8_;}
+get catapult(){return this.catapult_;}
+get angle(){return this.angle_;}
+get skia(){return this.skia_;}
+get webrtc(){return this.webrtc_;}}
+RevisionInfo.NAME='revisions';tr.v.d.Diagnostic.register(RevisionInfo,{elementName:'tr-v-ui-revision-info-span'});return{RevisionInfo,};});'use strict';tr.exportTo('tr.v.d',function(){class Scalar extends tr.v.d.Diagnostic{constructor(value){super();if(!(value instanceof tr.b.Scalar)){throw new Error('expected Scalar');}
+this.value=value;}
+clone(){return new Scalar(this.value);}
+asDictInto_(d){d.value=this.value.asDict();}
+static fromDict(d){return new Scalar(tr.b.Scalar.fromDict(d.value));}}
+tr.v.d.Diagnostic.register(Scalar,{elementName:'tr-v-ui-scalar-diagnostic-span'});return{Scalar,};});'use strict';tr.exportTo('tr.v.d',function(){class TagMap extends tr.v.d.Diagnostic{constructor(opt_info){super();this.tagsToStoryDisplayNames_=new Map();if(opt_info){for(const[tag,storyDisplayNames]of Object.entries(opt_info.tagsToStoryDisplayNames||{})){this.tagsToStoryDisplayNames.set(tag,new Set(storyDisplayNames));}}}
+clone(){const clone=new TagMap();clone.addDiagnostic(this);return clone;}
+addToHistogram(hist){hist.diagnostics.set(tr.v.d.TagMap.NAME,this);}
+equals(other){if(!(other instanceof TagMap))return false;const keys1=new Set(this.tagsToStoryDisplayNames.keys());const keys2=new Set(other.tagsToStoryDisplayNames.keys());if(!tr.b.setsEqual(keys1,keys2)){return false;}
+for(const key of keys1){if(!tr.b.setsEqual(this.tagsToStoryDisplayNames.get(key),other.tagsToStoryDisplayNames.get(key))){return false;}}
+return true;}
+canAddDiagnostic(otherDiagnostic){return otherDiagnostic instanceof TagMap;}
+addDiagnostic(otherDiagnostic){for(const[name,storyDisplayNames]of
+otherDiagnostic.tagsToStoryDisplayNames){if(!this.tagsToStoryDisplayNames.has(name)){this.tagsToStoryDisplayNames.set(name,new Set());}
+for(const t of storyDisplayNames){this.tagsToStoryDisplayNames.get(name).add(t);}}
+return this;}
+asDictInto_(d){d.tagsToStoryDisplayNames={};for(const[name,value]of this.tagsToStoryDisplayNames){d.tagsToStoryDisplayNames[name]=Array.from(value);}}
+get tagsToStoryDisplayNames(){return this.tagsToStoryDisplayNames_;}
+static fromDict(d){const info=new TagMap();for(const[name,values]of
+Object.entries(d.tagsToStoryDisplayNames||{})){info.tagsToStoryDisplayNames.set(name,new Set(values));}
+return info;}}
+TagMap.NAME='tagmap';tr.v.d.Diagnostic.register(TagMap);return{TagMap,};});'use strict';tr.exportTo('tr.v.d',function(){class TelemetryInfo extends tr.v.d.Diagnostic{constructor(opt_info){super();this.benchmarkName_='';this.benchmarkStart_=undefined;this.label_='';this.legacyTIRLabel_='';this.storyDisplayName_='';this.storyGroupingKeys_=new Map();this.storysetRepeatCounter_=undefined;this.canonicalUrl_='';if(opt_info){this.addInfo(opt_info);}}
+clone(){const clone=new tr.v.d.MergedTelemetryInfo();clone.addDiagnostic(this);return clone;}
+addInfo(info){if(info.benchmarkName){this.benchmarkName_=info.benchmarkName;}
+if(info.benchmarkStartMs!==undefined){this.benchmarkStart_=new Date(info.benchmarkStartMs);}
+if(info.label){this.label_=info.label;}
+if(info.storyDisplayName){this.storyDisplayName_=info.storyDisplayName;}
+for(const[name,value]of Object.entries(info.storyGroupingKeys||{})){this.storyGroupingKeys_.set(name,value);}
+if(info.storysetRepeatCounter!==undefined){this.storysetRepeatCounter_=info.storysetRepeatCounter;}
+if(info.legacyTIRLabel){this.legacyTIRLabel_=info.legacyTIRLabel;}
+if(info.canonicalUrl){this.canonicalUrl_=info.canonicalUrl;}}
+addToHistogram(hist){hist.diagnostics.set(TelemetryInfo.NAME,this);}
+static getFromHistogram(hist){return hist.diagnostics.get(TelemetryInfo.NAME)||hist.diagnostics.get('iteration');}
+asDictInto_(d){d.benchmarkName=this.benchmarkName;if(this.benchmarkStart){d.benchmarkStartMs=this.benchmarkStart.getTime();}
+d.label=this.label;d.storyDisplayName=this.storyDisplayName;if(this.storyGroupingKeys.size>0){d.storyGroupingKeys={};for(const[name,value]of this.storyGroupingKeys){d.storyGroupingKeys[name]=value;}}
+d.storysetRepeatCounter=this.storysetRepeatCounter;d.legacyTIRLabel=this.legacyTIRLabel;d.canonicalUrl=this.canonicalUrl;}
+static fromDict(d){const info=new TelemetryInfo();info.addInfo(d);return info;}
+get displayLabel(){if(this.label)return this.label;return this.benchmarkName+'\n'+this.benchmarkStartString;}
+get benchmarkName(){return this.benchmarkName_;}
+get label(){return this.label_;}
+get legacyTIRLabel(){return this.legacyTIRLabel_;}
+set legacyTIRLabel(tir){this.legacyTIRLabel_=tir;}
+get storyGroupingKeys(){return this.storyGroupingKeys_;}
+get storyDisplayName(){return this.storyDisplayName_;}
+get storysetRepeatCounter(){return this.storysetRepeatCounter_;}
+get storysetRepeatCounterLabel(){return'storyset repeat '+this.storysetRepeatCounter;}
+get canonicalUrl(){return this.canonicalUrl_;}
+get benchmarkStart(){return this.benchmarkStart_;}
+get benchmarkStartString(){if(this.benchmarkStart_===undefined)return'';return tr.b.formatDate(this.benchmarkStart);}
+static getField(hist,fieldName,defaultValue){const telemetry=tr.v.d.TelemetryInfo.getFromHistogram(hist);if(!(telemetry instanceof tr.v.d.TelemetryInfo)||!telemetry[fieldName]){return defaultValue;}
+return telemetry[fieldName];}
+static getStoryGroupingKeyLabel(hist,storyGroupingKey){const telemetry=tr.v.d.TelemetryInfo.getFromHistogram(hist);if(!(telemetry instanceof tr.v.d.TelemetryInfo)){return storyGroupingKey+': undefined';}
+return storyGroupingKey+': '+
+telemetry.storyGroupingKeys.get(storyGroupingKey);}
+static makeStoryGroupingKeyLabelGetter(storyGroupingKey){return v=>TelemetryInfo.getStoryGroupingKeyLabel(v,storyGroupingKey);}}
+TelemetryInfo.NAME='telemetry';tr.v.d.Diagnostic.register(TelemetryInfo,{elementName:'tr-v-ui-telemetry-info-span'});return{TelemetryInfo,};});'use strict';tr.exportTo('tr.v.d',function(){class UnmergeableDiagnosticSet extends tr.v.d.Diagnostic{constructor(diagnostics){super();this._diagnostics=diagnostics;}
+clone(){const clone=new tr.v.d.UnmergeableDiagnosticSet();clone.addDiagnostic(this);return clone;}
+canAddDiagnostic(otherDiagnostic){return true;}
+addDiagnostic(otherDiagnostic){if(otherDiagnostic instanceof UnmergeableDiagnosticSet){for(const subOtherDiagnostic of otherDiagnostic){const clone=subOtherDiagnostic.clone();this.addDiagnostic(clone);}
+return;}
+for(let i=0;i<this._diagnostics.length;++i){if(this._diagnostics[i].canAddDiagnostic(otherDiagnostic)){this._diagnostics[i].addDiagnostic(otherDiagnostic);return;}}
+const clone=otherDiagnostic.clone();this._diagnostics.push(clone);}
+mergeRelationships(otherDiagnostic,parentHist,otherParentHist){if(otherDiagnostic instanceof UnmergeableDiagnosticSet){for(const subDiagnostic of otherDiagnostic){this.mergeRelationships(subDiagnostic,parentHist,otherParentHist);}
+return;}
+for(const subDiagnostic of this){if(!(subDiagnostic instanceof tr.v.d.RelatedHistogramSet)&&!(subDiagnostic instanceof tr.v.d.RelatedHistogramMap)&&!(subDiagnostic instanceof tr.v.d.RelatedHistogramBreakdown)){continue;}
+subDiagnostic.mergeRelationships(otherDiagnostic,parentHist,otherParentHist);}}
+get length(){return this._diagnostics.length;}*[Symbol.iterator](){for(const diagnostic of this._diagnostics)yield diagnostic;}
+asDictInto_(d){d.diagnostics=this._diagnostics.map(d=>d.asDictOrReference());}
+static fromDict(d){return new UnmergeableDiagnosticSet(d.diagnostics.map(d=>((typeof d==='string')?new tr.v.d.DiagnosticRef(d):tr.v.d.Diagnostic.fromDict(d))));}}
+tr.v.d.Diagnostic.register(UnmergeableDiagnosticSet,{elementName:'tr-v-ui-unmergeable-diagnostic-set-span'});return{UnmergeableDiagnosticSet,};});'use strict';tr.exportTo('tr.v.d',function(){const MERGED_FROM_DIAGNOSTIC_KEY='merged from';const MERGED_TO_DIAGNOSTIC_KEY='merged to';class DiagnosticMap extends Map{set(name,diagnostic){if(typeof(name)!=='string'){throw new Error('name must be string, not '+name);}
+if(!(diagnostic instanceof tr.v.d.Diagnostic)&&!(diagnostic instanceof tr.v.d.DiagnosticRef)){throw new Error('Must be instanceof Diagnostic: '+diagnostic);}
+Map.prototype.set.call(this,name,diagnostic);}
+addDicts(dict){for(const[name,diagnosticDict]of Object.entries(dict)){if(typeof diagnosticDict==='string'){this.set(name,new tr.v.d.DiagnosticRef(diagnosticDict));}else{this.set(name,tr.v.d.Diagnostic.fromDict(diagnosticDict));}}}
+resolveSharedDiagnostics(histograms,opt_required){for(const[name,value]of this){if(!(value instanceof tr.v.d.DiagnosticRef)){continue;}
+const guid=value.guid;const diagnostic=histograms.lookupDiagnostic(guid);if(diagnostic instanceof tr.v.d.Diagnostic){this.set(name,diagnostic);}else if(opt_required){throw new Error('Unable to find shared Diagnostic '+guid);}}}
+asDict(){const dict={};for(const[name,diagnostic]of this){dict[name]=diagnostic.asDictOrReference();}
+return dict;}
+static fromDict(d){const diagnostics=new DiagnosticMap();diagnostics.addDicts(d);return diagnostics;}
+static fromObject(obj){const diagnostics=new DiagnosticMap();for(const[name,diagnostic]of Object.entries(obj)){diagnostics.set(name,diagnostic);}
+return diagnostics;}
+addDiagnostics(other){for(const[name,otherDiagnostic]of other){if(name===MERGED_FROM_DIAGNOSTIC_KEY||name===MERGED_TO_DIAGNOSTIC_KEY||name===tr.v.d.GroupingPath){continue;}
+const myDiagnostic=this.get(name);if(myDiagnostic!==undefined&&myDiagnostic.canAddDiagnostic(otherDiagnostic)){myDiagnostic.addDiagnostic(otherDiagnostic);continue;}
+const clone=otherDiagnostic.clone();if(myDiagnostic===undefined){this.set(name,clone);continue;}
+this.set(name,new tr.v.d.UnmergeableDiagnosticSet([myDiagnostic,clone]));}}
+mergeRelationships(parentHist){for(const[name,diagnostic]of this){if(!(diagnostic instanceof tr.v.d.RelatedHistogramSet)&&!(diagnostic instanceof tr.v.d.RelatedHistogramMap)&&!(diagnostic instanceof tr.v.d.RelatedHistogramBreakdown)&&!(diagnostic instanceof tr.v.d.UnmergeableDiagnosticSet)){continue;}
+for(const otherHist of this.get(MERGED_FROM_DIAGNOSTIC_KEY)){const otherDiagnostic=otherHist.diagnostics.get(name);if(!(otherDiagnostic instanceof tr.v.d.RelatedHistogramSet)&&!(otherDiagnostic instanceof tr.v.d.RelatedHistogramMap)&&!(otherDiagnostic instanceof tr.v.d.RelatedHistogramBreakdown)&&!(otherDiagnostic instanceof tr.v.d.UnmergeableDiagnosticSet)){continue;}
+diagnostic.mergeRelationships(otherDiagnostic,parentHist,otherHist);}}}}
+return{DiagnosticMap,MERGED_FROM_DIAGNOSTIC_KEY,MERGED_TO_DIAGNOSTIC_KEY,};});'use strict';tr.exportTo('tr.v',function(){const MAX_DIAGNOSTIC_MAPS=16;const DEFAULT_SAMPLE_VALUES_PER_BIN=10;const DEFAULT_REBINNED_COUNT=40;const DEFAULT_BOUNDARIES_FOR_UNIT=new Map();const DELTA=String.fromCharCode(916);const Z_SCORE_NAME='z-score';const P_VALUE_NAME='p-value';const U_STATISTIC_NAME='U';function percentToString(percent,opt_force3){if(percent<0||percent>1){throw new Error('percent must be in [0,1]');}
+if(percent===0)return'000';if(percent===1)return'100';let str=percent.toString();if(str[1]!=='.'){throw new Error('Unexpected percent');}
+str=str+'0'.repeat(Math.max(4-str.length,0));if(str.length>4){if(opt_force3){str=str.slice(0,4);}else{str=str.slice(0,4)+'_'+str.slice(4);}}
+return'0'+str.slice(2);}
+function percentFromString(s){return parseFloat(s[0]+'.'+s.substr(1).replace(/_/g,''));}
+class HistogramBin{constructor(range){this.range=range;this.count=0;this.diagnosticMaps=[];}
+addSample(value){this.count+=1;}
+addDiagnosticMap(diagnostics){tr.b.math.Statistics.uniformlySampleStream(this.diagnosticMaps,this.count,diagnostics,MAX_DIAGNOSTIC_MAPS);}
+addBin(other){if(!this.range.equals(other.range)){throw new Error('Merging incompatible Histogram bins.');}
+tr.b.math.Statistics.mergeSampledStreams(this.diagnosticMaps,this.count,other.diagnosticMaps,other.count,MAX_DIAGNOSTIC_MAPS);this.count+=other.count;}
+fromDict(dict){this.count=dict[0];if(dict.length>1){for(const map of dict[1]){this.diagnosticMaps.push(tr.v.d.DiagnosticMap.fromDict(map));}}}
+asDict(){if(!this.diagnosticMaps.length){return[this.count];}
+return[this.count,this.diagnosticMaps.map(d=>d.asDict())];}}
+const DEFAULT_SUMMARY_OPTIONS=new Map([['avg',true],['count',true],['geometricMean',false],['max',true],['min',true],['nans',false],['std',true],['sum',true],]);class Histogram{constructor(name,unit,opt_binBoundaries){let binBoundaries=opt_binBoundaries;if(!binBoundaries){const baseUnit=unit.baseUnit?unit.baseUnit:unit;binBoundaries=DEFAULT_BOUNDARIES_FOR_UNIT.get(baseUnit.unitName);}
+this.guid_=undefined;this.binBoundariesDict_=binBoundaries.asDict();this.allBins=binBoundaries.bins.slice();this.description='';this.diagnostics=new tr.v.d.DiagnosticMap();this.maxNumSampleValues_=this.defaultMaxNumSampleValues_;this.name_=name;this.nanDiagnosticMaps=[];this.numNans=0;this.running_=undefined;this.sampleValues_=[];this.shortName=undefined;this.summaryOptions=new Map(DEFAULT_SUMMARY_OPTIONS);this.summaryOptions.set('percentile',[]);this.summaryOptions.set('iprs',[]);this.unit=unit;}
+static create(name,unit,samples,opt_options){const options=opt_options||{};const hist=new Histogram(name,unit,options.binBoundaries);if(options.description)hist.description=options.description;if(options.shortName)hist.shortName=options.shortName;if(options.summaryOptions){let summaryOptions=options.summaryOptions;if(!(summaryOptions instanceof Map)){summaryOptions=Object.entries(summaryOptions);}
+for(const[name,value]of summaryOptions){hist.summaryOptions.set(name,value);}}
+if(options.diagnostics!==undefined){let diagnostics=options.diagnostics;if(!(diagnostics instanceof Map)){diagnostics=Object.entries(diagnostics);}
+for(const[name,diagnostic]of diagnostics){hist.diagnostics.set(name,diagnostic);}}
+if(!(samples instanceof Array))samples=[samples];for(const sample of samples){if(typeof sample==='object'){hist.addSample(sample.value,sample.diagnostics);}else{hist.addSample(sample);}}
+return hist;}
+get running(){return this.running_;}
+get maxNumSampleValues(){return this.maxNumSampleValues_;}
+set maxNumSampleValues(n){this.maxNumSampleValues_=n;tr.b.math.Statistics.uniformlySampleArray(this.sampleValues_,this.maxNumSampleValues_);}
+get name(){return this.name_;}
+get guid(){if(this.guid_===undefined){this.guid_=tr.b.GUID.allocateUUID4();}
+return this.guid_;}
+set guid(guid){if(this.guid_!==undefined){throw new Error('Cannot reset guid');}
+this.guid_=guid;}
+static fromDict(dict){const hist=new Histogram(dict.name,tr.b.Unit.fromJSON(dict.unit),HistogramBinBoundaries.fromDict(dict.binBoundaries));hist.guid=dict.guid;if(dict.shortName){hist.shortName=dict.shortName;}
+if(dict.description){hist.description=dict.description;}
+if(dict.diagnostics){hist.diagnostics.addDicts(dict.diagnostics);}
+if(dict.allBins){if(dict.allBins.length!==undefined){for(let i=0;i<dict.allBins.length;++i){hist.allBins[i]=new HistogramBin(hist.allBins[i].range);hist.allBins[i].fromDict(dict.allBins[i]);}}else{for(const[i,binDict]of Object.entries(dict.allBins)){hist.allBins[i]=new HistogramBin(hist.allBins[i].range);hist.allBins[i].fromDict(binDict);}}}
+if(dict.running){hist.running_=tr.b.math.RunningStatistics.fromDict(dict.running);}
+if(dict.summaryOptions){if(dict.summaryOptions.iprs){dict.summaryOptions.iprs=dict.summaryOptions.iprs.map(r=>tr.b.math.Range.fromExplicitRange(r[0],r[1]));}
+hist.customizeSummaryOptions(dict.summaryOptions);}
+if(dict.maxNumSampleValues!==undefined){hist.maxNumSampleValues=dict.maxNumSampleValues;}
+if(dict.sampleValues){hist.sampleValues_=dict.sampleValues;}
+if(dict.numNans){hist.numNans=dict.numNans;}
+if(dict.nanDiagnostics){for(const map of dict.nanDiagnostics){hist.nanDiagnosticMaps.push(tr.v.d.DiagnosticMap.fromDict(map));}}
+return hist;}
+get numValues(){return this.running_?this.running_.count:0;}
+get average(){return this.running_?this.running_.mean:undefined;}
+get standardDeviation(){return this.running_?this.running_.stddev:undefined;}
+get geometricMean(){return this.running_?this.running_.geometricMean:0;}
+get sum(){return this.running_?this.running_.sum:0;}
+get min(){return this.running_?this.running_.min:Infinity;}
+get max(){return this.running_?this.running_.max:-Infinity;}
+getDifferenceSignificance(other,opt_alpha){if(this.unit!==other.unit){throw new Error('Cannot compare Histograms with different units');}
+if(this.unit.improvementDirection===tr.b.ImprovementDirection.DONT_CARE){return tr.b.math.Statistics.Significance.DONT_CARE;}
+if(!(other instanceof Histogram)){throw new Error('Unable to compute a p-value');}
+const testResult=tr.b.math.Statistics.mwu(this.sampleValues,other.sampleValues,opt_alpha);return testResult.significance;}
+getApproximatePercentile(percent){if(percent<0||percent>1){throw new Error('percent must be in [0,1]');}
+if(this.numValues===0)return undefined;if(this.allBins.length===1){const sortedSampleValues=this.sampleValues.slice().sort((x,y)=>x-y);return sortedSampleValues[Math.floor((sortedSampleValues.length-1)*percent)];}
+let valuesToSkip=Math.floor((this.numValues-1)*percent);for(const bin of this.allBins){valuesToSkip-=bin.count;if(valuesToSkip>=0)continue;if(bin.range.min===-Number.MAX_VALUE){return bin.range.max;}
+if(bin.range.max===Number.MAX_VALUE){return bin.range.min;}
+return bin.range.center;}
+return this.allBins[this.allBins.length-1].range.min;}
+getBinIndexForValue(value){const i=tr.b.math.findHighIndexInSortedArray(this.allBins,b=>((value<b.range.max)?-1:1));if(0<=i&&i<this.allBins.length)return i;return this.allBins.length-1;}
+getBinForValue(value){return this.allBins[this.getBinIndexForValue(value)];}
+addSample(value,opt_diagnostics){if(opt_diagnostics&&!(opt_diagnostics instanceof tr.v.d.DiagnosticMap)){opt_diagnostics=tr.v.d.DiagnosticMap.fromObject(opt_diagnostics);}
+if(typeof(value)!=='number'||isNaN(value)){this.numNans++;if(opt_diagnostics){tr.b.math.Statistics.uniformlySampleStream(this.nanDiagnosticMaps,this.numNans,opt_diagnostics,MAX_DIAGNOSTIC_MAPS);}}else{if(this.running_===undefined){this.running_=new tr.b.math.RunningStatistics();}
+this.running_.add(value);const binIndex=this.getBinIndexForValue(value);let bin=this.allBins[binIndex];if(bin.count===0){bin=new HistogramBin(bin.range);this.allBins[binIndex]=bin;}
+bin.addSample(value);if(opt_diagnostics){bin.addDiagnosticMap(opt_diagnostics);}}
+tr.b.math.Statistics.uniformlySampleStream(this.sampleValues_,this.numValues+this.numNans,value,this.maxNumSampleValues);}
+sampleValuesInto(samples){for(const sampleValue of this.sampleValues){samples.push(sampleValue);}}
+canAddHistogram(other){if(this.unit!==other.unit){return false;}
+if(this.binBoundariesDict_===other.binBoundariesDict_){return true;}
+if(this.binBoundariesDict_.length!==other.binBoundariesDict_.length){return false;}
+for(let i=0;i<this.binBoundariesDict_.length;++i){const slice=this.binBoundariesDict_[i];const otherSlice=other.binBoundariesDict_[i];if(slice instanceof Array){if(!(otherSlice instanceof Array)){return false;}
+if(slice[0]!==otherSlice[0]||!tr.b.math.approximately(slice[1],otherSlice[1])||slice[2]!==otherSlice[2]){return false;}}else{if(otherSlice instanceof Array){return false;}
+if(!tr.b.math.approximately(slice,otherSlice)){return false;}}}
+return true;}
+addHistogram(other){if(!this.canAddHistogram(other)){throw new Error('Merging incompatible Histograms');}
+tr.b.math.Statistics.mergeSampledStreams(this.nanDiagnosticMaps,this.numNans,other.nanDiagnosticMaps,other.numNans,MAX_DIAGNOSTIC_MAPS);tr.b.math.Statistics.mergeSampledStreams(this.sampleValues,this.numValues+this.numNans,other.sampleValues,other.numValues+other.numNans,(this.maxNumSampleValues+other.maxNumSampleValues)/2);this.numNans+=other.numNans;if(other.running_!==undefined){if(this.running_===undefined){this.running_=new tr.b.math.RunningStatistics();}
+this.running_=this.running_.merge(other.running_);}
+for(let i=0;i<this.allBins.length;++i){let bin=this.allBins[i];if(bin.count===0){bin=new HistogramBin(bin.range);this.allBins[i]=bin;}
+bin.addBin(other.allBins[i]);}
+let mergedFrom=this.diagnostics.get(tr.v.d.MERGED_FROM_DIAGNOSTIC_KEY);if(!mergedFrom){mergedFrom=new tr.v.d.RelatedHistogramSet();this.diagnostics.set(tr.v.d.MERGED_FROM_DIAGNOSTIC_KEY,mergedFrom);}
+mergedFrom.add(other);let mergedTo=other.diagnostics.get(tr.v.d.MERGED_TO_DIAGNOSTIC_KEY);if(!mergedTo){mergedTo=new tr.v.d.RelatedHistogramSet();other.diagnostics.set(tr.v.d.MERGED_TO_DIAGNOSTIC_KEY,mergedTo);}
+mergedTo.add(this);this.diagnostics.addDiagnostics(other.diagnostics);for(const[stat,option]of other.summaryOptions){if(stat==='percentile'){const percentiles=this.summaryOptions.get(stat);for(const percent of option){if(!percentiles.includes(percent))percentiles.push(percent);}}else if(stat==='iprs'){const thisIprs=this.summaryOptions.get(stat);for(const ipr of option){let found=false;for(const thisIpr of thisIprs){found=ipr.equals(thisIpr);if(found)break;}
+if(!found)thisIprs.push(ipr);}}else if(option&&!this.summaryOptions.get(stat)){this.summaryOptions.set(stat,true);}}}
+customizeSummaryOptions(summaryOptions){for(const[key,value]of Object.entries(summaryOptions)){this.summaryOptions.set(key,value);}}
+getStatisticScalar(statName,opt_referenceHistogram,opt_mwu){if(statName==='avg'){if(this.running_===undefined)return undefined;return new tr.b.Scalar(this.unit,this.average);}
+if(statName==='std'){if(this.standardDeviation===undefined)return undefined;return new tr.b.Scalar(this.unit,this.standardDeviation);}
+if(statName==='geometricMean'){return new tr.b.Scalar(this.unit,this.geometricMean);}
+if(statName==='min'||statName==='max'||statName==='sum'){if(this.running_===undefined){this.running_=new tr.b.math.RunningStatistics();}
+return new tr.b.Scalar(this.unit,this.running_[statName]);}
+if(statName==='nans'){return new tr.b.Scalar(tr.b.Unit.byName.count_smallerIsBetter,this.numNans);}
+if(statName==='count'){return new tr.b.Scalar(tr.b.Unit.byName.count_smallerIsBetter,this.numValues);}
+if(statName.substr(0,4)==='pct_'){const percent=percentFromString(statName.substr(4));if(this.numValues===0)return undefined;const percentile=this.getApproximatePercentile(percent);return new tr.b.Scalar(this.unit,percentile);}
+if(statName.substr(0,4)==='ipr_'){let lower=percentFromString(statName.substr(4,3));let upper=percentFromString(statName.substr(8));if(lower>=upper){throw new Error('Invalid inter-percentile range: '+statName);}
+lower=this.getApproximatePercentile(lower);upper=this.getApproximatePercentile(upper);return new tr.b.Scalar(this.unit,upper-lower);}
+if(!this.canCompare(opt_referenceHistogram)){throw new Error('Cannot compute '+statName+' when histograms are not comparable');}
+const suffix=tr.b.Unit.nameSuffixForImprovementDirection(this.unit.improvementDirection);const deltaIndex=statName.indexOf(DELTA);if(deltaIndex>=0){const baseStatName=statName.substr(deltaIndex+1);const thisStat=this.getStatisticScalar(baseStatName);const otherStat=opt_referenceHistogram.getStatisticScalar(baseStatName);const deltaValue=thisStat.value-otherStat.value;if(statName[0]==='%'){return new tr.b.Scalar(tr.b.Unit.byName['normalizedPercentageDelta'+suffix],deltaValue/otherStat.value);}
+return new tr.b.Scalar(thisStat.unit.correspondingDeltaUnit,deltaValue);}
+if(statName===Z_SCORE_NAME){return new tr.b.Scalar(tr.b.Unit.byName['sigmaDelta'+suffix],(this.average-opt_referenceHistogram.average)/opt_referenceHistogram.standardDeviation);}
+const mwu=opt_mwu||tr.b.math.Statistics.mwu(this.sampleValues,opt_referenceHistogram.sampleValues);if(statName===P_VALUE_NAME){return new tr.b.Scalar(tr.b.Unit.byName.unitlessNumber,mwu.p);}
+if(statName===U_STATISTIC_NAME){return new tr.b.Scalar(tr.b.Unit.byName.unitlessNumber,mwu.U);}
+throw new Error('Unrecognized statistic name: '+statName);}
+get statisticsNames(){const statisticsNames=new Set();for(const[statName,option]of this.summaryOptions){if(statName==='percentile'){for(const pctile of option){statisticsNames.add('pct_'+tr.v.percentToString(pctile));}}else if(statName==='iprs'){for(const range of option){statisticsNames.add('ipr_'+tr.v.percentToString(range.min,true)+'_'+tr.v.percentToString(range.max,true));}}else if(option){statisticsNames.add(statName);}}
+return statisticsNames;}
+canCompare(other){return other instanceof Histogram&&this.unit===other.unit&&this.numValues>0&&other.numValues>0;}
+getAvailableStatisticName(statName,opt_referenceHist){if(this.canCompare(opt_referenceHist))return statName;if(statName===Z_SCORE_NAME||statName===P_VALUE_NAME||statName===U_STATISTIC_NAME){return'avg';}
+const deltaIndex=statName.indexOf(DELTA);if(deltaIndex<0)return statName;return statName.substr(deltaIndex+1);}
+static getDeltaStatisticsNames(statNames){const deltaNames=[];for(const statName of statNames){deltaNames.push(`${DELTA}${statName}`);deltaNames.push(`%${DELTA}${statName}`);}
+return deltaNames.concat([Z_SCORE_NAME,P_VALUE_NAME,U_STATISTIC_NAME]);}
+get statisticsScalars(){const results=new Map();for(const statName of this.statisticsNames){const scalar=this.getStatisticScalar(statName);if(scalar===undefined)continue;results.set(statName,scalar);}
+return results;}
+get sampleValues(){return this.sampleValues_;}
+clone(){const binBoundaries=HistogramBinBoundaries.fromDict(this.binBoundariesDict_);const hist=new Histogram(this.name,this.unit,binBoundaries);for(const[stat,option]of this.summaryOptions){if(stat==='percentile'||stat==='iprs'){hist.summaryOptions.set(stat,Array.from(option));}else{hist.summaryOptions.set(stat,option);}}
+hist.addHistogram(this);return hist;}
+rebin(newBoundaries){const rebinned=new tr.v.Histogram(this.name,this.unit,newBoundaries);rebinned.description=this.description;for(const sample of this.sampleValues){rebinned.addSample(sample);}
+rebinned.running_=this.running_;for(const[name,diagnostic]of this.diagnostics){rebinned.diagnostics.set(name,diagnostic);}
+for(const[stat,option]of this.summaryOptions){if(stat==='percentile'){rebinned.summaryOptions.set(stat,Array.from(option));}else{rebinned.summaryOptions.set(stat,option);}}
+return rebinned;}
+asDict(){const dict={};dict.name=this.name;dict.unit=this.unit.asJSON();dict.guid=this.guid;if(this.binBoundariesDict_!==undefined){dict.binBoundaries=this.binBoundariesDict_;}
+if(this.shortName){dict.shortName=this.shortName;}
+if(this.description){dict.description=this.description;}
+if(this.diagnostics.size){dict.diagnostics=this.diagnostics.asDict();}
+if(this.maxNumSampleValues!==this.defaultMaxNumSampleValues_){dict.maxNumSampleValues=this.maxNumSampleValues;}
+if(this.numNans){dict.numNans=this.numNans;}
+if(this.nanDiagnosticMaps.length){dict.nanDiagnostics=this.nanDiagnosticMaps.map(dm=>dm.asDict());}
+if(this.numValues){dict.sampleValues=this.sampleValues.slice();dict.running=this.running_.asDict();dict.allBins=this.allBinsAsDict_();}
+const summaryOptions={};let anyOverriddenSummaryOptions=false;for(const[name,value]of this.summaryOptions){let option;if(name==='percentile'){if(value.length===0)continue;option=Array.from(value);}else if(name==='iprs'){if(value.length===0)continue;option=value.map(r=>[r.min,r.max]);}else if(value===DEFAULT_SUMMARY_OPTIONS.get(name)){continue;}else{option=value;}
+summaryOptions[name]=option;anyOverriddenSummaryOptions=true;}
+if(anyOverriddenSummaryOptions){dict.summaryOptions=summaryOptions;}
+return dict;}
+allBinsAsDict_(){const numBins=this.allBins.length;let emptyBins=0;for(let i=0;i<numBins;++i){if(this.allBins[i].count===0){++emptyBins;}}
+if(emptyBins===numBins){return undefined;}
+if(emptyBins>(numBins/2)){const allBinsDict={};for(let i=0;i<numBins;++i){const bin=this.allBins[i];if(bin.count>0){allBinsDict[i]=bin.asDict();}}
+return allBinsDict;}
+const allBinsArray=[];for(let i=0;i<numBins;++i){allBinsArray.push(this.allBins[i].asDict());}
+return allBinsArray;}
+get defaultMaxNumSampleValues_(){return DEFAULT_SAMPLE_VALUES_PER_BIN*Math.max(this.allBins.length,DEFAULT_REBINNED_COUNT);}}
+Histogram.AVERAGE_ONLY_SUMMARY_OPTIONS={count:false,max:false,min:false,std:false,sum:false,};const HISTOGRAM_BIN_BOUNDARIES_CACHE=new Map();class HistogramBinBoundaries{static createLinear(min,max,numBins){return new HistogramBinBoundaries(min).addLinearBins(max,numBins);}
+static createExponential(min,max,numBins){return new HistogramBinBoundaries(min).addExponentialBins(max,numBins);}
+static createWithBoundaries(binBoundaries){const builder=new HistogramBinBoundaries(binBoundaries[0]);for(const boundary of binBoundaries.slice(1)){builder.addBinBoundary(boundary);}
+return builder;}
+constructor(minBinBoundary){this.builder_=[minBinBoundary];this.range_=new tr.b.math.Range();this.range_.addValue(minBinBoundary);this.binRanges_=undefined;this.bins_=undefined;}
+get range(){return this.range_;}
+asDict(){if(this.builder_.length===1&&this.builder_[0]===Number.MAX_VALUE){return undefined;}
+return this.builder_;}
+pushBuilderSlice_(slice){this.builder_.push(slice);this.builder_=this.builder_.slice();}
+static fromDict(dict){if(dict===undefined){return HistogramBinBoundaries.SINGULAR;}
+const cacheKey=JSON.stringify(dict);if(HISTOGRAM_BIN_BOUNDARIES_CACHE.has(cacheKey)){return HISTOGRAM_BIN_BOUNDARIES_CACHE.get(cacheKey);}
+const binBoundaries=new HistogramBinBoundaries(dict[0]);for(const slice of dict.slice(1)){if(!(slice instanceof Array)){binBoundaries.addBinBoundary(slice);continue;}
+switch(slice[0]){case HistogramBinBoundaries.SLICE_TYPE.LINEAR:binBoundaries.addLinearBins(slice[1],slice[2]);break;case HistogramBinBoundaries.SLICE_TYPE.EXPONENTIAL:binBoundaries.addExponentialBins(slice[1],slice[2]);break;default:throw new Error('Unrecognized HistogramBinBoundaries slice type');}}
+HISTOGRAM_BIN_BOUNDARIES_CACHE.set(cacheKey,binBoundaries);return binBoundaries;}
+get bins(){if(this.bins_===undefined){this.buildBins_();}
+return this.bins_;}
+buildBins_(){this.bins_=this.binRanges.map(r=>new HistogramBin(r));}
+get binRanges(){if(this.binRanges_===undefined){this.buildBinRanges_();}
+return this.binRanges_;}
+buildBinRanges_(){if(typeof this.builder_[0]!=='number'){throw new Error('Invalid start of builder_');}
+this.binRanges_=[];let prevBoundary=this.builder_[0];if(prevBoundary>-Number.MAX_VALUE){this.binRanges_.push(tr.b.math.Range.fromExplicitRange(-Number.MAX_VALUE,prevBoundary));}
+for(const slice of this.builder_.slice(1)){if(!(slice instanceof Array)){this.binRanges_.push(tr.b.math.Range.fromExplicitRange(prevBoundary,slice));prevBoundary=slice;continue;}
+const nextMaxBinBoundary=slice[1];const binCount=slice[2];const sliceMinBinBoundary=prevBoundary;switch(slice[0]){case HistogramBinBoundaries.SLICE_TYPE.LINEAR:{const binWidth=(nextMaxBinBoundary-prevBoundary)/binCount;for(let i=1;i<binCount;i++){const boundary=sliceMinBinBoundary+i*binWidth;this.binRanges_.push(tr.b.math.Range.fromExplicitRange(prevBoundary,boundary));prevBoundary=boundary;}
+break;}
+case HistogramBinBoundaries.SLICE_TYPE.EXPONENTIAL:{const binExponentWidth=Math.log(nextMaxBinBoundary/prevBoundary)/binCount;for(let i=1;i<binCount;i++){const boundary=sliceMinBinBoundary*Math.exp(i*binExponentWidth);this.binRanges_.push(tr.b.math.Range.fromExplicitRange(prevBoundary,boundary));prevBoundary=boundary;}
+break;}
+default:throw new Error('Unrecognized HistogramBinBoundaries slice type');}
+this.binRanges_.push(tr.b.math.Range.fromExplicitRange(prevBoundary,nextMaxBinBoundary));prevBoundary=nextMaxBinBoundary;}
+if(prevBoundary<Number.MAX_VALUE){this.binRanges_.push(tr.b.math.Range.fromExplicitRange(prevBoundary,Number.MAX_VALUE));}}
+addBinBoundary(nextMaxBinBoundary){if(nextMaxBinBoundary<=this.range.max){throw new Error('The added max bin boundary must be larger than '+'the current max boundary');}
+this.binRanges_=undefined;this.bins_=undefined;this.pushBuilderSlice_(nextMaxBinBoundary);this.range.addValue(nextMaxBinBoundary);return this;}
+addLinearBins(nextMaxBinBoundary,binCount){if(binCount<=0){throw new Error('Bin count must be positive');}
+if(nextMaxBinBoundary<=this.range.max){throw new Error('The new max bin boundary must be greater than '+'the previous max bin boundary');}
+this.binRanges_=undefined;this.bins_=undefined;this.pushBuilderSlice_([HistogramBinBoundaries.SLICE_TYPE.LINEAR,nextMaxBinBoundary,binCount]);this.range.addValue(nextMaxBinBoundary);return this;}
+addExponentialBins(nextMaxBinBoundary,binCount){if(binCount<=0){throw new Error('Bin count must be positive');}
+if(this.range.max<=0){throw new Error('Current max bin boundary must be positive');}
+if(this.range.max>=nextMaxBinBoundary){throw new Error('The last added max boundary must be greater than '+'the current max boundary boundary');}
+this.binRanges_=undefined;this.bins_=undefined;this.pushBuilderSlice_([HistogramBinBoundaries.SLICE_TYPE.EXPONENTIAL,nextMaxBinBoundary,binCount]);this.range.addValue(nextMaxBinBoundary);return this;}}
+HistogramBinBoundaries.SLICE_TYPE={LINEAR:0,EXPONENTIAL:1,};HistogramBinBoundaries.SINGULAR=new HistogramBinBoundaries(Number.MAX_VALUE);DEFAULT_BOUNDARIES_FOR_UNIT.set(tr.b.Unit.byName.timeDurationInMs.unitName,HistogramBinBoundaries.createExponential(1e-3,1e6,1e2));DEFAULT_BOUNDARIES_FOR_UNIT.set(tr.b.Unit.byName.timeStampInMs.unitName,HistogramBinBoundaries.createLinear(0,1e10,1e3));DEFAULT_BOUNDARIES_FOR_UNIT.set(tr.b.Unit.byName.normalizedPercentage.unitName,HistogramBinBoundaries.createLinear(0,1.0,20));DEFAULT_BOUNDARIES_FOR_UNIT.set(tr.b.Unit.byName.sizeInBytes.unitName,HistogramBinBoundaries.createExponential(1,1e12,1e2));DEFAULT_BOUNDARIES_FOR_UNIT.set(tr.b.Unit.byName.energyInJoules.unitName,HistogramBinBoundaries.createExponential(1e-3,1e3,50));DEFAULT_BOUNDARIES_FOR_UNIT.set(tr.b.Unit.byName.powerInWatts.unitName,HistogramBinBoundaries.createExponential(1e-3,1,50));DEFAULT_BOUNDARIES_FOR_UNIT.set(tr.b.Unit.byName.unitlessNumber.unitName,HistogramBinBoundaries.createExponential(1e-3,1e3,50));DEFAULT_BOUNDARIES_FOR_UNIT.set(tr.b.Unit.byName.count.unitName,HistogramBinBoundaries.createExponential(1,1e3,20));DEFAULT_BOUNDARIES_FOR_UNIT.set(tr.b.Unit.byName.sigma.unitName,HistogramBinBoundaries.createLinear(-5,5,50));return{DEFAULT_REBINNED_COUNT,DELTA,Histogram,HistogramBinBoundaries,P_VALUE_NAME,U_STATISTIC_NAME,Z_SCORE_NAME,percentFromString,percentToString,};});'use strict';tr.exportTo('tr.v.ui',function(){Polymer({is:'tr-v-ui-scalar-context-controller',created(){this.host_=undefined;this.groupToContext_=new Map();this.dirtyGroups_=new Set();},attached(){if(this.host_){throw new Error('Scalar context controller is already attached to a host');}
+const host=findParentOrHost(this);if(host.__scalarContextController){throw new Error('Multiple scalar context controllers attached to this host');}
+host.__scalarContextController=this;this.host_=host;},detached(){if(!this.host_){throw new Error('Scalar context controller is not attached to a host');}
+if(this.host_.__scalarContextController!==this){throw new Error('Scalar context controller is not attached to its host');}
+delete this.host_.__scalarContextController;this.host_=undefined;},getContext(group){return this.groupToContext_.get(group);},onScalarSpanAdded(group,span){let context=this.groupToContext_.get(group);if(context===undefined){context={spans:new Set(),range:new tr.b.math.Range()};this.groupToContext_.set(group,context);}
+if(context.spans.has(span)){throw new Error('Scalar span already registered with group: '+group);}
+context.spans.add(span);this.markGroupDirtyAndScheduleUpdate_(group);},onScalarSpanRemoved(group,span){const context=this.groupToContext_.get(group);if(!context.spans.has(span)){throw new Error('Scalar span not registered with group: '+group);}
+context.spans.delete(span);this.markGroupDirtyAndScheduleUpdate_(group);},onScalarSpanUpdated(group,span){const context=this.groupToContext_.get(group);if(!context.spans.has(span)){throw new Error('Scalar span not registered with group: '+group);}
+this.markGroupDirtyAndScheduleUpdate_(group);},markGroupDirtyAndScheduleUpdate_(group){const alreadyDirty=this.dirtyGroups_.size>0;this.dirtyGroups_.add(group);if(!alreadyDirty){tr.b.requestAnimationFrameInThisFrameIfPossible(this.updateContext,this);}},updateContext(){const groups=this.dirtyGroups_;if(groups.size===0)return;this.dirtyGroups_=new Set();for(const group of groups){this.updateGroup_(group);}
+const event=new tr.b.Event('context-updated');event.groups=groups;this.dispatchEvent(event);},updateGroup_(group){const context=this.groupToContext_.get(group);if(context.spans.size===0){this.groupToContext_.delete(group);return;}
+context.range.reset();for(const span of context.spans){context.range.addValue(span.value);}}});function getScalarContextControllerForElement(element){while(element){if(element.__scalarContextController){return element.__scalarContextController;}
+element=findParentOrHost(element);}
+return undefined;}
+function findParentOrHost(node){if(node.parentElement){return node.parentElement;}
+while(Polymer.dom(node).parentNode){node=Polymer.dom(node).parentNode;}
+return node.host;}
+return{getScalarContextControllerForElement,};});'use strict';tr.exportTo('tr.v.ui',function(){function createScalarSpan(value,opt_config){if(value===undefined)return'';const config=opt_config||{};const ownerDocument=config.ownerDocument||document;const span=ownerDocument.createElement('tr-v-ui-scalar-span');let numericValue;if(value instanceof tr.b.Scalar){span.value=value;numericValue=value.value;}else if(value instanceof tr.v.Histogram){numericValue=value.average;if(numericValue===undefined)return'';span.setValueAndUnit(numericValue,value.unit);}else{const unit=config.unit;if(unit===undefined){throw new Error('Unit must be provided in config when value is a number');}
+span.setValueAndUnit(value,unit);numericValue=value;}
+if(config.context){span.context=config.context;}
+if(config.customContextRange){span.customContextRange=config.customContextRange;}
+if(config.leftAlign){span.leftAlign=true;}
+if(config.inline){span.inline=true;}
+if(config.significance!==undefined){span.significance=config.significance;}
+if(config.contextGroup!==undefined){span.contextGroup=config.contextGroup;}
+return span;}
+return{createScalarSpan,};});'use strict';Polymer({is:'tr-v-ui-scalar-span',properties:{contextGroup:{type:String,reflectToAttribute:true,observer:'contextGroupChanged_'}},created(){this.value_=undefined;this.unit_=undefined;this.context_=undefined;this.warning_=undefined;this.significance_=tr.b.math.Statistics.Significance.DONT_CARE;this.shouldSearchForContextController_=false;this.lazyContextController_=undefined;this.onContextUpdated_=this.onContextUpdated_.bind(this);this.customContextRange_=undefined;},get significance(){return this.significance_;},set significance(s){this.significance_=s;this.updateContents_();},set contentTextDecoration(deco){this.$.content.style.textDecoration=deco;},get value(){return this.value_;},set value(value){if(value instanceof tr.b.Scalar){this.value_=value.value;this.unit_=value.unit;}else{this.value_=value;}
+this.updateContents_();if(this.hasContext_(this.contextGroup)){this.contextController_.onScalarSpanUpdated(this.contextGroup,this);}else{this.updateSparkline_();}},get contextController_(){if(this.shouldSearchForContextController_){this.lazyContextController_=tr.v.ui.getScalarContextControllerForElement(this);this.shouldSearchForContextController_=false;}
+return this.lazyContextController_;},hasContext_(contextGroup){return!!(contextGroup&&this.contextController_);},contextGroupChanged_(newContextGroup,oldContextGroup){this.detachFromContextControllerIfPossible_(oldContextGroup);if(!this.attachToContextControllerIfPossible_(newContextGroup)){this.onContextUpdated_();}},attachToContextControllerIfPossible_(contextGroup){if(!this.hasContext_(contextGroup))return false;this.contextController_.addEventListener('context-updated',this.onContextUpdated_);this.contextController_.onScalarSpanAdded(contextGroup,this);return true;},detachFromContextControllerIfPossible_(contextGroup){if(!this.hasContext_(contextGroup))return;this.contextController_.removeEventListener('context-updated',this.onContextUpdated_);this.contextController_.onScalarSpanRemoved(contextGroup,this);},attached(){tr.b.Unit.addEventListener('display-mode-changed',this.updateContents_.bind(this));this.shouldSearchForContextController_=true;this.attachToContextControllerIfPossible_(this.contextGroup);},detached(){tr.b.Unit.removeEventListener('display-mode-changed',this.updateContents_.bind(this));this.detachFromContextControllerIfPossible_(this.contextGroup);this.shouldSearchForContextController_=false;this.lazyContextController_=undefined;},onContextUpdated_(){this.updateSparkline_();},get context(){return this.context_;},set context(context){this.context_=context;this.updateContents_();},get unit(){return this.unit_;},set unit(unit){this.unit_=unit;this.updateContents_();this.updateSparkline_();},setValueAndUnit(value,unit){this.value_=value;this.unit_=unit;this.updateContents_();},get customContextRange(){return this.customContextRange_;},set customContextRange(customContextRange){this.customContextRange_=customContextRange;this.updateSparkline_();},get inline(){return Polymer.dom(this).classList.contains('inline');},set inline(inline){if(inline){Polymer.dom(this).classList.add('inline');}else{Polymer.dom(this).classList.remove('inline');}},get leftAlign(){return Polymer.dom(this).classList.contains('left-align');},set leftAlign(leftAlign){if(leftAlign){Polymer.dom(this).classList.add('left-align');}else{Polymer.dom(this).classList.remove('left-align');}},updateSparkline_(){Polymer.dom(this.$.sparkline).classList.remove('positive');Polymer.dom(this.$.sparkline).classList.remove('better');Polymer.dom(this.$.sparkline).classList.remove('worse');Polymer.dom(this.$.sparkline).classList.remove('same');this.$.sparkline.style.display='none';this.$.sparkline.style.left='0';this.$.sparkline.style.width='0';let range=this.customContextRange_;if(!range&&this.hasContext_(this.contextGroup)){const context=this.contextController_.getContext(this.contextGroup);if(context){range=context.range;}}
+if(!range||range.isEmpty)return;const leftPoint=Math.min(range.min,0);const rightPoint=Math.max(range.max,0);const pointDistance=rightPoint-leftPoint;if(pointDistance===0){return;}
+this.$.sparkline.style.display='block';let left;let width;if(this.value>0){width=Math.min(this.value,rightPoint);left=-leftPoint;Polymer.dom(this.$.sparkline).classList.add('positive');}else if(this.value<=0){width=-Math.max(this.value,leftPoint);left=(-leftPoint)-width;}
+this.$.sparkline.style.left=this.buildSparklineStyle_(left/pointDistance,false);this.$.sparkline.style.width=this.buildSparklineStyle_(width/pointDistance,true);const changeClass=this.changeClassName_;if(changeClass){Polymer.dom(this.$.sparkline).classList.add(changeClass);}},buildSparklineStyle_(ratio,isWidth){let position='calc('+ratio+' * (100% - 1px)';if(isWidth){position+=' + 1px';}
+position+=')';return position;},updateContents_(){Polymer.dom(this.$.content).textContent='';Polymer.dom(this.$.content).classList.remove('better');Polymer.dom(this.$.content).classList.remove('worse');Polymer.dom(this.$.content).classList.remove('same');this.$.insignificant.style.display='';this.$.significantly_better.style.display='';this.$.significantly_worse.style.display='';if(this.unit_===undefined)return;this.$.content.title='';Polymer.dom(this.$.content).textContent=this.unit_.format(this.value,this.context);this.updateDelta_();},updateDelta_(){let changeClass=this.changeClassName_;if(!changeClass){this.$.significance.style.display='none';return;}
+this.$.significance.style.display='inline';let title;switch(changeClass){case'better':title='improvement';break;case'worse':title='regression';break;case'same':title='no change';break;default:throw new Error('Unknown change class: '+changeClass);}
+Polymer.dom(this.$.content).classList.add(changeClass);switch(this.significance){case tr.b.math.Statistics.Significance.DONT_CARE:break;case tr.b.math.Statistics.Significance.INSIGNIFICANT:if(changeClass!=='same')title='insignificant '+title;this.$.insignificant.style.display='inline';changeClass='same';break;case tr.b.math.Statistics.Significance.SIGNIFICANT:if(changeClass==='same'){throw new Error('How can no change be significant?');}
+this.$['significantly_'+changeClass].style.display='inline';title='significant '+title;break;default:throw new Error('Unknown significance '+this.significance);}
+this.$.significance.title=title;this.$.content.title=title;},get changeClassName_(){if(!this.unit_||!this.unit_.isDelta)return undefined;switch(this.unit_.improvementDirection){case tr.b.ImprovementDirection.DONT_CARE:return undefined;case tr.b.ImprovementDirection.BIGGER_IS_BETTER:if(this.value===0)return'same';return this.value>0?'better':'worse';case tr.b.ImprovementDirection.SMALLER_IS_BETTER:if(this.value===0)return'same';return this.value<0?'better':'worse';default:throw new Error('Unknown improvement direction: '+
+this.unit_.improvementDirection);}},get warning(){return this.warning_;},set warning(warning){this.warning_=warning;const warningEl=this.$.warning;if(this.warning_){warningEl.title=warning;warningEl.style.display='inline';}else{warningEl.title='';warningEl.style.display='';}},get timestamp(){return this.value;},set timestamp(timestamp){if(timestamp instanceof tr.b.u.TimeStamp){this.value=timestamp;return;}
+this.setValueAndUnit(timestamp,tr.b.u.Units.timeStampInMs);},get duration(){return this.value;},set duration(duration){if(duration instanceof tr.b.u.TimeDuration){this.value=duration;return;}
+this.setValueAndUnit(duration,tr.b.u.Units.timeDurationInMs);}});'use strict';const URL_REGEX=/^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)$/;function isTable(object){if(!(object instanceof Array)||(object.length<2))return false;for(const colName in object[0]){if(typeof colName!=='string')return false;}
+for(let i=0;i<object.length;++i){if(!(object[i]instanceof Object))return false;for(const colName in object[i]){if(i&&(object[0][colName]===undefined))return false;const cellType=typeof object[i][colName];if(cellType!=='string'&&cellType!=='number')return false;}
+if(i){for(const colName in object[0]){if(object[i][colName]===undefined)return false;}}}
+return true;}
+Polymer({is:'tr-ui-a-generic-object-view',ready(){this.object_=undefined;},get object(){return this.object_;},set object(object){this.object_=object;this.updateContents_();},updateContents_(){Polymer.dom(this.$.content).textContent='';this.appendElementsForType_('',this.object_,0,0,5,'');},appendElementsForType_(label,object,indent,depth,maxDepth,suffix){if(depth>maxDepth){this.appendSimpleText_(label,indent,'<recursion limit reached>',suffix);return;}
+if(object===undefined){this.appendSimpleText_(label,indent,'undefined',suffix);return;}
+if(object===null){this.appendSimpleText_(label,indent,'null',suffix);return;}
+if(!(object instanceof Object)){const type=typeof object;if(type!=='string'){return this.appendSimpleText_(label,indent,object,suffix);}
+let objectReplaced=false;if((object[0]==='{'&&object[object.length-1]==='}')||(object[0]==='['&&object[object.length-1]===']')){try{object=JSON.parse(object);objectReplaced=true;}catch(e){}}
+if(!objectReplaced){if(object.includes('\n')){const lines=object.split('\n');lines.forEach(function(line,i){let text;let ioff;let ll;let ss;if(i===0){text='"'+line;ioff=0;ll=label;ss='';}else if(i<lines.length-1){text=line;ioff=1;ll='';ss='';}else{text=line+'"';ioff=1;ll='';ss=suffix;}
+const el=this.appendSimpleText_(ll,indent+ioff*label.length+ioff,text,ss);el.style.whiteSpace='pre';return el;},this);return;}
+if(object.match(URL_REGEX)){const link=document.createElement('a');link.href=object;link.textContent=object;this.appendElementWithLabel_(label,indent,link,suffix);return;}
+this.appendSimpleText_(label,indent,'"'+object+'"',suffix);return;}}
+if(object instanceof tr.model.ObjectSnapshot){const link=document.createElement('tr-ui-a-analysis-link');link.selection=new tr.model.EventSet(object);this.appendElementWithLabel_(label,indent,link,suffix);return;}
+if(object instanceof tr.model.ObjectInstance){const link=document.createElement('tr-ui-a-analysis-link');link.selection=new tr.model.EventSet(object);this.appendElementWithLabel_(label,indent,link,suffix);return;}
+if(object instanceof tr.b.math.Rect){this.appendSimpleText_(label,indent,object.toString(),suffix);return;}
+if(object instanceof tr.b.Scalar){const el=this.ownerDocument.createElement('tr-v-ui-scalar-span');el.value=object;el.inline=true;this.appendElementWithLabel_(label,indent,el,suffix);return;}
+if(object instanceof Array){this.appendElementsForArray_(label,object,indent,depth,maxDepth,suffix);return;}
+this.appendElementsForObject_(label,object,indent,depth,maxDepth,suffix);},appendElementsForArray_(label,object,indent,depth,maxDepth,suffix){if(object.length===0){this.appendSimpleText_(label,indent,'[]',suffix);return;}
+if(isTable(object)){const table=document.createElement('tr-ui-b-table');const columns=[];for(const colName of Object.keys(object[0])){let allStrings=true;let allNumbers=true;for(let i=0;i<object.length;++i){if(typeof(object[i][colName])!=='string'){allStrings=false;}
+if(typeof(object[i][colName])!=='number'){allNumbers=false;}
+if(!allStrings&&!allNumbers)break;}
+const column={title:colName};column.value=function(row){return row[colName];};if(allStrings){column.cmp=function(x,y){return x[colName].localeCompare(y[colName]);};}else if(allNumbers){column.cmp=function(x,y){return x[colName]-y[colName];};}
+columns.push(column);}
+table.tableColumns=columns;table.tableRows=object;this.appendElementWithLabel_(label,indent,table,suffix);table.rebuild();return;}
+this.appendElementsForType_(label+'[',object[0],indent,depth+1,maxDepth,object.length>1?',':']'+suffix);for(let i=1;i<object.length;i++){this.appendElementsForType_('',object[i],indent+label.length+1,depth+1,maxDepth,i<object.length-1?',':']'+suffix);}
+return;},appendElementsForObject_(label,object,indent,depth,maxDepth,suffix){const keys=Object.keys(object);if(keys.length===0){this.appendSimpleText_(label,indent,'{}',suffix);return;}
+this.appendElementsForType_(label+'{'+keys[0]+': ',object[keys[0]],indent,depth,maxDepth,keys.length>1?',':'}'+suffix);for(let i=1;i<keys.length;i++){this.appendElementsForType_(keys[i]+': ',object[keys[i]],indent+label.length+1,depth+1,maxDepth,i<keys.length-1?',':'}'+suffix);}},appendElementWithLabel_(label,indent,dataElement,suffix){const row=document.createElement('div');const indentSpan=document.createElement('span');indentSpan.style.whiteSpace='pre';for(let i=0;i<indent;i++){Polymer.dom(indentSpan).textContent+=' ';}
+Polymer.dom(row).appendChild(indentSpan);const labelSpan=document.createElement('span');Polymer.dom(labelSpan).textContent=label;Polymer.dom(row).appendChild(labelSpan);Polymer.dom(row).appendChild(dataElement);const suffixSpan=document.createElement('span');Polymer.dom(suffixSpan).textContent=suffix;Polymer.dom(row).appendChild(suffixSpan);row.dataElement=dataElement;Polymer.dom(this.$.content).appendChild(row);},appendSimpleText_(label,indent,text,suffix){const el=this.ownerDocument.createElement('span');Polymer.dom(el).textContent=text;this.appendElementWithLabel_(label,indent,el,suffix);return el;}});'use strict';Polymer({is:'tr-ui-a-generic-object-view-with-label',ready(){this.labelEl_=document.createElement('div');this.genericObjectView_=document.createElement('tr-ui-a-generic-object-view');Polymer.dom(this.root).appendChild(this.labelEl_);Polymer.dom(this.root).appendChild(this.genericObjectView_);},get label(){return Polymer.dom(this.labelEl_).textContent;},set label(label){Polymer.dom(this.labelEl_).textContent=label;},get object(){return this.genericObjectView_.object;},set object(object){this.genericObjectView_.object=object;}});'use strict';tr.exportTo('tr.ui.analysis',function(){const ObjectSnapshotView=tr.ui.b.define('object-snapshot-view');ObjectSnapshotView.prototype={__proto__:HTMLDivElement.prototype,decorate(){this.objectSnapshot_=undefined;},get requiresTallView(){return true;},set modelEvent(obj){this.objectSnapshot=obj;},get modelEvent(){return this.objectSnapshot;},get objectSnapshot(){return this.objectSnapshot_;},set objectSnapshot(i){this.objectSnapshot_=i;this.updateContents();},updateContents(){throw new Error('Not implemented');}};const options=new tr.b.ExtensionRegistryOptions(tr.b.TYPE_BASED_REGISTRY_MODE);options.mandatoryBaseClass=ObjectSnapshotView;options.defaultMetadata={showInstances:true,showInTrackView:true};tr.b.decorateExtensionRegistry(ObjectSnapshotView,options);return{ObjectSnapshotView,};});'use strict';Polymer({is:'tr-ui-b-drag-handle',created(){this.lastMousePos_=0;this.onMouseMove_=this.onMouseMove_.bind(this);this.onMouseUp_=this.onMouseUp_.bind(this);this.addEventListener('mousedown',this.onMouseDown_);this.target_=undefined;this.horizontal=true;this.observer_=new WebKitMutationObserver(this.didTargetMutate_.bind(this));this.targetSizesByModeKey_={};},get modeKey_(){return this.target_.className===''?'.':this.target_.className;},get target(){return this.target_;},set target(target){this.observer_.disconnect();this.target_=target;if(!this.target_)return;this.observer_.observe(this.target_,{attributes:true,attributeFilter:['class']});},get horizontal(){return this.horizontal_;},set horizontal(h){this.horizontal_=h;if(this.horizontal_){this.className='horizontal-drag-handle';}else{this.className='vertical-drag-handle';}},get vertical(){return!this.horizontal_;},set vertical(v){this.horizontal=!v;},forceMutationObserverFlush_(){const records=this.observer_.takeRecords();if(records.length){this.didTargetMutate_(records);}},didTargetMutate_(e){const modeSize=this.targetSizesByModeKey_[this.modeKey_];if(modeSize!==undefined){this.setTargetSize_(modeSize);return;}
+this.target_.style[this.targetStyleKey_]='';},get targetStyleKey_(){return this.horizontal_?'height':'width';},getTargetSize_(){const targetStyleKey=this.targetStyleKey_;if(!this.target_.style[targetStyleKey]){this.target_.style[targetStyleKey]=window.getComputedStyle(this.target_)[targetStyleKey];}
+const size=parseInt(this.target_.style[targetStyleKey]);this.targetSizesByModeKey_[this.modeKey_]=size;return size;},setTargetSize_(s){this.target_.style[this.targetStyleKey_]=s+'px';this.targetSizesByModeKey_[this.modeKey_]=s;tr.b.dispatchSimpleEvent(this,'drag-handle-resize',true,false);},applyDelta_(delta){const curSize=this.getTargetSize_();let newSize;if(this.target_===this.nextElementSibling){newSize=curSize+delta;}else{newSize=curSize-delta;}
+this.setTargetSize_(newSize);},onMouseMove_(e){const curMousePos=this.horizontal_?e.clientY:e.clientX;const delta=this.lastMousePos_-curMousePos;this.applyDelta_(delta);this.lastMousePos_=curMousePos;e.preventDefault();return true;},onMouseDown_(e){if(!this.target_)return;this.forceMutationObserverFlush_();this.lastMousePos_=this.horizontal_?e.clientY:e.clientX;document.addEventListener('mousemove',this.onMouseMove_);document.addEventListener('mouseup',this.onMouseUp_);e.preventDefault();return true;},onMouseUp_(e){document.removeEventListener('mousemove',this.onMouseMove_);document.removeEventListener('mouseup',this.onMouseUp_);e.preventDefault();}});'use strict';tr.exportTo('tr.ui.b',function(){function HotKey(dict){if(dict.eventType===undefined){throw new Error('eventType must be given');}
+if(dict.keyCode===undefined&&dict.keyCodes===undefined){throw new Error('keyCode or keyCodes must be given');}
+if(dict.keyCode!==undefined&&dict.keyCodes!==undefined){throw new Error('Only keyCode or keyCodes can be given');}
+if(dict.callback===undefined){throw new Error('callback must be given');}
+this.eventType_=dict.eventType;this.keyCodes_=[];if(dict.keyCode){this.pushKeyCode_(dict.keyCode);}else if(dict.keyCodes){dict.keyCodes.forEach(this.pushKeyCode_,this);}
+this.useCapture_=!!dict.useCapture;this.callback_=dict.callback;this.thisArg_=dict.thisArg!==undefined?dict.thisArg:undefined;this.helpText_=dict.helpText!==undefined?dict.helpText:undefined;}
+HotKey.prototype={get eventType(){return this.eventType_;},get keyCodes(){return this.keyCodes_;},get helpText(){return this.helpText_;},call(e){this.callback_.call(this.thisArg_,e);},pushKeyCode_(keyCode){this.keyCodes_.push(keyCode);}};return{HotKey,};});'use strict';Polymer({is:'tv-ui-b-hotkey-controller',created(){this.isAttached_=false;this.globalMode_=false;this.slavedToParentController_=undefined;this.curHost_=undefined;this.childControllers_=[];this.bubblingKeyDownHotKeys_={};this.capturingKeyDownHotKeys_={};this.bubblingKeyPressHotKeys_={};this.capturingKeyPressHotKeys_={};this.onBubblingKeyDown_=this.onKey_.bind(this,false);this.onCapturingKeyDown_=this.onKey_.bind(this,true);this.onBubblingKeyPress_=this.onKey_.bind(this,false);this.onCapturingKeyPress_=this.onKey_.bind(this,true);},attached(){this.isAttached_=true;const host=this.findHost_();if(host.__hotkeyController){throw new Error('Multiple hotkey controllers attached to this host');}
+host.__hotkeyController=this;this.curHost_=host;let parentElement;if(host.parentElement){parentElement=host.parentElement;}else{parentElement=Polymer.dom(host).parentNode.host;}
+const parentController=tr.b.getHotkeyControllerForElement(parentElement);if(parentController){this.slavedToParentController_=parentController;parentController.addChildController_(this);return;}
+host.addEventListener('keydown',this.onBubblingKeyDown_,false);host.addEventListener('keydown',this.onCapturingKeyDown_,true);host.addEventListener('keypress',this.onBubblingKeyPress_,false);host.addEventListener('keypress',this.onCapturingKeyPress_,true);},detached(){this.isAttached_=false;const host=this.curHost_;if(!host)return;delete host.__hotkeyController;this.curHost_=undefined;if(this.slavedToParentController_){this.slavedToParentController_.removeChildController_(this);this.slavedToParentController_=undefined;return;}
+host.removeEventListener('keydown',this.onBubblingKeyDown_,false);host.removeEventListener('keydown',this.onCapturingKeyDown_,true);host.removeEventListener('keypress',this.onBubblingKeyPress_,false);host.removeEventListener('keypress',this.onCapturingKeyPress_,true);},addChildController_(controller){const i=this.childControllers_.indexOf(controller);if(i!==-1){throw new Error('Controller already registered');}
+this.childControllers_.push(controller);},removeChildController_(controller){const i=this.childControllers_.indexOf(controller);if(i===-1){throw new Error('Controller not registered');}
+this.childControllers_.splice(i,1);return controller;},getKeyMapForEventType_(eventType,useCapture){if(eventType==='keydown'){if(!useCapture){return this.bubblingKeyDownHotKeys_;}
+return this.capturingKeyDownHotKeys_;}
+if(eventType==='keypress'){if(!useCapture){return this.bubblingKeyPressHotKeys_;}
+return this.capturingKeyPressHotKeys_;}
+throw new Error('Unsupported key event');},addHotKey(hotKey){if(!(hotKey instanceof tr.ui.b.HotKey)){throw new Error('hotKey must be a tr.ui.b.HotKey');}
+const keyMap=this.getKeyMapForEventType_(hotKey.eventType,hotKey.useCapture);for(let i=0;i<hotKey.keyCodes.length;i++){const keyCode=hotKey.keyCodes[i];if(keyMap[keyCode]){throw new Error('Key is already bound for keyCode='+keyCode);}}
+for(let i=0;i<hotKey.keyCodes.length;i++){const keyCode=hotKey.keyCodes[i];keyMap[keyCode]=hotKey;}
+return hotKey;},removeHotKey(hotKey){if(!(hotKey instanceof tr.ui.b.HotKey)){throw new Error('hotKey must be a tr.ui.b.HotKey');}
+const keyMap=this.getKeyMapForEventType_(hotKey.eventType,hotKey.useCapture);for(let i=0;i<hotKey.keyCodes.length;i++){const keyCode=hotKey.keyCodes[i];if(!keyMap[keyCode]){throw new Error('Key is not bound for keyCode='+keyCode);}
+keyMap[keyCode]=hotKey;}
+for(let i=0;i<hotKey.keyCodes.length;i++){const keyCode=hotKey.keyCodes[i];delete keyMap[keyCode];}
+return hotKey;},get globalMode(){return this.globalMode_;},set globalMode(globalMode){const wasAttached=this.isAttached_;if(wasAttached){this.detached();}
+this.globalMode_=!!globalMode;if(wasAttached){this.attached();}},get topmostConroller_(){if(this.slavedToParentController_){return this.slavedToParentController_.topmostConroller_;}
+return this;},childRequestsGeneralFocus(child){const topmost=this.topmostConroller_;if(topmost.curHost_){if(topmost.curHost_.hasAttribute('tabIndex')){topmost.curHost_.focus();}else{if(document.activeElement){document.activeElement.blur();}}}else{if(document.activeElement){document.activeElement.blur();}}},childRequestsBlur(child){child.blur();const topmost=this.topmostConroller_;if(topmost.curHost_){topmost.curHost_.focus();}},findHost_(){if(this.globalMode_)return document.body;if(this.parentElement)return this.parentElement;if(!Polymer.dom(this).parentNode)return this.host;let node=this.parentNode;while(Polymer.dom(node).parentNode)node=Polymer.dom(node).parentNode;return node.host;},appendMatchingHotKeysTo_(matchedHotKeys,useCapture,e){const localKeyMap=this.getKeyMapForEventType_(e.type,useCapture);const localHotKey=localKeyMap[e.keyCode];if(localHotKey){matchedHotKeys.push(localHotKey);}
+for(let i=0;i<this.childControllers_.length;i++){const controller=this.childControllers_[i];controller.appendMatchingHotKeysTo_(matchedHotKeys,useCapture,e);}},onKey_(useCapture,e){if(!useCapture&&e.path[0].tagName==='INPUT')return;let sortedControllers;const matchedHotKeys=[];this.appendMatchingHotKeysTo_(matchedHotKeys,useCapture,e);if(matchedHotKeys.length===0)return false;if(matchedHotKeys.length>1){throw new Error('More than one hotKey is currently unsupported');}
+const hotKey=matchedHotKeys[0];let prevented=0;prevented|=hotKey.call(e);return!prevented&&e.defaultPrevented;}});'use strict';tr.exportTo('tr.b',function(){function getHotkeyControllerForElement(refElement){let curElement=refElement;while(curElement){if(curElement.tagName==='tv-ui-b-hotkey-controller'){return curElement;}
+if(curElement.__hotkeyController){return curElement.__hotkeyController;}
+if(curElement.parentElement){curElement=curElement.parentElement;continue;}
+curElement=findHost(curElement);}
+return undefined;}
+function findHost(initialNode){let node=initialNode;while(Polymer.dom(node).parentNode){node=Polymer.dom(node).parentNode;}
+return node.host;}
+return{getHotkeyControllerForElement,};});'use strict';Polymer({is:'tr-ui-b-info-bar',ready(){this.messageEl_=this.$.message;this.buttonsEl_=this.$.buttons;this.message='';},get message(){return Polymer.dom(this.messageEl_).textContent;},set message(message){Polymer.dom(this.messageEl_).textContent=message;},get visible(){return!this.hidden;},set visible(visible){this.hidden=!visible;},removeAllButtons(){Polymer.dom(this.buttonsEl_).textContent='';},addButton(text,clickCallback){const button=document.createElement('button');Polymer.dom(button).textContent=text;button.addEventListener('click',clickCallback);Polymer.dom(this.buttonsEl_).appendChild(button);return button;}});'use strict';tr.exportTo('tr.ui.b',function(){const ContainerThatDecoratesItsChildren=tr.ui.b.define('div');ContainerThatDecoratesItsChildren.prototype={__proto__:HTMLDivElement.prototype,decorate(){this.observer_=new WebKitMutationObserver(this.didMutate_.bind(this));this.observer_.observe(this,{childList:true});Object.defineProperty(this,'textContent',{get:undefined,set:this.onSetTextContent_});},appendChild(x){HTMLDivElement.prototype.appendChild.call(this,x);this.didMutate_(this.observer_.takeRecords());},insertBefore(x,y){HTMLDivElement.prototype.insertBefore.call(this,x,y);this.didMutate_(this.observer_.takeRecords());},removeChild(x){HTMLDivElement.prototype.removeChild.call(this,x);this.didMutate_(this.observer_.takeRecords());},replaceChild(x,y){HTMLDivElement.prototype.replaceChild.call(this,x,y);this.didMutate_(this.observer_.takeRecords());},onSetTextContent_(textContent){if(textContent!==''){throw new Error('textContent can only be set to \'\'.');}
+this.clear();},clear(){while(Polymer.dom(this).lastChild){HTMLDivElement.prototype.removeChild.call(this,Polymer.dom(this).lastChild);}
+this.didMutate_(this.observer_.takeRecords());},didMutate_(records){this.beginDecorating_();for(let i=0;i<records.length;i++){const addedNodes=records[i].addedNodes;if(addedNodes){for(let j=0;j<addedNodes.length;j++){this.decorateChild_(addedNodes[j]);}}
+const removedNodes=records[i].removedNodes;if(removedNodes){for(let j=0;j<removedNodes.length;j++){this.undecorateChild_(removedNodes[j]);}}}
+this.doneDecoratingForNow_();},decorateChild_(child){throw new Error('Not implemented');},undecorateChild_(child){throw new Error('Not implemented');},beginDecorating_(){},doneDecoratingForNow_(){}};return{ContainerThatDecoratesItsChildren,};});'use strict';tr.exportTo('tr.ui.b',function(){const ListView=tr.ui.b.define('x-list-view',tr.ui.b.ContainerThatDecoratesItsChildren);ListView.prototype={__proto__:tr.ui.b.ContainerThatDecoratesItsChildren.prototype,decorate(){tr.ui.b.ContainerThatDecoratesItsChildren.prototype.decorate.call(this);Polymer.dom(this).classList.add('x-list-view');this.onItemClicked_=this.onItemClicked_.bind(this);this.onKeyDown_=this.onKeyDown_.bind(this);this.tabIndex=0;this.addEventListener('keydown',this.onKeyDown_);this.selectionChanged_=false;},decorateChild_(item){Polymer.dom(item).classList.add('list-item');item.addEventListener('click',this.onItemClicked_,true);Object.defineProperty(item,'selected',{configurable:true,get:()=>item.hasAttribute('selected'),set:value=>{const oldSelection=this.selectedElement;if(oldSelection&&oldSelection!==item&&value){Polymer.dom(this.selectedElement).removeAttribute('selected');}
+if(value){Polymer.dom(item).setAttribute('selected','selected');}else{Polymer.dom(item).removeAttribute('selected');}
+const newSelection=this.selectedElement;if(newSelection!==oldSelection){tr.b.dispatchSimpleEvent(this,'selection-changed',false);}},});},undecorateChild_(item){this.selectionChanged_|=item.selected;Polymer.dom(item).classList.remove('list-item');item.removeEventListener('click',this.onItemClicked_);delete item.selected;},beginDecorating_(){this.selectionChanged_=false;},doneDecoratingForNow_(){if(this.selectionChanged_){tr.b.dispatchSimpleEvent(this,'selection-changed',false);}},get selectedElement(){const el=Polymer.dom(this).querySelector('.list-item[selected]');if(!el)return undefined;return el;},set selectedElement(el){if(!el){if(this.selectedElement){this.selectedElement.selected=false;}
+return;}
+if(el.parentElement!==this){throw new Error('Can only select elements that are children of this list view');}
+el.selected=true;},getElementByIndex(index){return Polymer.dom(this).querySelector('.list-item:nth-child('+index+')');},clear(){const changed=this.selectedElement!==undefined;tr.ui.b.ContainerThatDecoratesItsChildren.prototype.clear.call(this);if(changed){tr.b.dispatchSimpleEvent(this,'selection-changed',false);}},onItemClicked_(e){const currentSelectedElement=this.selectedElement;if(currentSelectedElement){Polymer.dom(currentSelectedElement).removeAttribute('selected');}
+let element=e.target;while(element.parentElement!==this){element=element.parentElement;}
+if(element!==currentSelectedElement){Polymer.dom(element).setAttribute('selected','selected');}
+tr.b.dispatchSimpleEvent(this,'selection-changed',false);},onKeyDown_(e){if(this.selectedElement===undefined)return;if(e.keyCode===38){const prev=Polymer.dom(this.selectedElement).previousSibling;if(prev){prev.selected=true;tr.ui.b.scrollIntoViewIfNeeded(prev);e.preventDefault();return true;}}else if(e.keyCode===40){const next=Polymer.dom(this.selectedElement).nextSibling;if(next){next.selected=true;tr.ui.b.scrollIntoViewIfNeeded(next);e.preventDefault();return true;}}},addItem(textContent){const item=document.createElement('div');Polymer.dom(item).textContent=textContent;Polymer.dom(this).appendChild(item);return item;}};return{ListView,};});'use strict';tr.exportTo('tr.ui.b',function(){const MOUSE_SELECTOR_MODE={};MOUSE_SELECTOR_MODE.SELECTION=0x1;MOUSE_SELECTOR_MODE.PANSCAN=0x2;MOUSE_SELECTOR_MODE.ZOOM=0x4;MOUSE_SELECTOR_MODE.TIMING=0x8;MOUSE_SELECTOR_MODE.ROTATE=0x10;MOUSE_SELECTOR_MODE.ALL_MODES=0x1F;const MOUSE_SELECTOR_MODE_INFOS={};MOUSE_SELECTOR_MODE_INFOS[MOUSE_SELECTOR_MODE.PANSCAN]={mode:MOUSE_SELECTOR_MODE.PANSCAN,title:'pan',eventNames:{enter:'enterpan',begin:'beginpan',update:'updatepan',end:'endpan',exit:'exitpan'},activeBackgroundPosition:'-30px -10px',defaultBackgroundPosition:'0 -10px'};MOUSE_SELECTOR_MODE_INFOS[MOUSE_SELECTOR_MODE.SELECTION]={mode:MOUSE_SELECTOR_MODE.SELECTION,title:'selection',eventNames:{enter:'enterselection',begin:'beginselection',update:'updateselection',end:'endselection',exit:'exitselection'},activeBackgroundPosition:'-30px -40px',defaultBackgroundPosition:'0 -40px'};MOUSE_SELECTOR_MODE_INFOS[MOUSE_SELECTOR_MODE.ZOOM]={mode:MOUSE_SELECTOR_MODE.ZOOM,title:'zoom',eventNames:{enter:'enterzoom',begin:'beginzoom',update:'updatezoom',end:'endzoom',exit:'exitzoom'},activeBackgroundPosition:'-30px -70px',defaultBackgroundPosition:'0 -70px'};MOUSE_SELECTOR_MODE_INFOS[MOUSE_SELECTOR_MODE.TIMING]={mode:MOUSE_SELECTOR_MODE.TIMING,title:'timing',eventNames:{enter:'entertiming',begin:'begintiming',update:'updatetiming',end:'endtiming',exit:'exittiming'},activeBackgroundPosition:'-30px -100px',defaultBackgroundPosition:'0 -100px'};MOUSE_SELECTOR_MODE_INFOS[MOUSE_SELECTOR_MODE.ROTATE]={mode:MOUSE_SELECTOR_MODE.ROTATE,title:'rotate',eventNames:{enter:'enterrotate',begin:'beginrotate',update:'updaterotate',end:'endrotate',exit:'exitrotate'},activeBackgroundPosition:'-30px -130px',defaultBackgroundPosition:'0 -130px'};return{MOUSE_SELECTOR_MODE_INFOS,MOUSE_SELECTOR_MODE,};});'use strict';Polymer({is:'tr-ui-b-mouse-mode-icon',properties:{modeName:{type:String,reflectToAttribute:true,observer:'modeNameChanged'},},created(){this.active_=false;this.acceleratorKey_=undefined;},ready(){this.updateContents_();},get mode(){return tr.ui.b.MOUSE_SELECTOR_MODE[this.modeName];},set mode(mode){const modeInfo=tr.ui.b.MOUSE_SELECTOR_MODE_INFOS[mode];const modeName=tr.b.findFirstKeyInDictMatching(tr.ui.b.MOUSE_SELECTOR_MODE,function(modeName,candidateMode){return candidateMode===mode;});if(modeName===undefined){throw new Error('Unknown mode');}
+this.modeName=modeName;},modeNameChanged(){this.updateContents_();},get active(){return this.active_;},set active(active){this.active_=!!active;if(this.active_){Polymer.dom(this).classList.add('active');}else{Polymer.dom(this).classList.remove('active');}
+this.updateContents_();},get acceleratorKey(){return this.acceleratorKey_;},set acceleratorKey(acceleratorKey){this.acceleratorKey_=acceleratorKey;this.updateContents_();},updateContents_(){if(this.modeName===undefined)return;const mode=this.mode;if(mode===undefined){throw new Error('Invalid mode');}
+const modeInfo=tr.ui.b.MOUSE_SELECTOR_MODE_INFOS[mode];if(!modeInfo){throw new Error('Invalid mode');}
+let title=modeInfo.title;if(this.acceleratorKey_){title=title+' ('+this.acceleratorKey_+')';}
+this.title=title;let bp;if(this.active_){bp=modeInfo.activeBackgroundPosition;}else{bp=modeInfo.defaultBackgroundPosition;}
+this.style.backgroundPosition=bp;}});'use strict';tr.exportTo('tr.ui.b',function(){function MouseTracker(opt_targetElement){this.onMouseDown_=this.onMouseDown_.bind(this);this.onMouseMove_=this.onMouseMove_.bind(this);this.onMouseUp_=this.onMouseUp_.bind(this);this.targetElement=opt_targetElement;}
+MouseTracker.prototype={get targetElement(){return this.targetElement_;},set targetElement(targetElement){if(this.targetElement_){this.targetElement_.removeEventListener('mousedown',this.onMouseDown_);}
+this.targetElement_=targetElement;if(this.targetElement_){this.targetElement_.addEventListener('mousedown',this.onMouseDown_);}},onMouseDown_(e){if(e.button!==0)return true;e=this.remakeEvent_(e,'mouse-tracker-start');this.targetElement_.dispatchEvent(e);document.addEventListener('mousemove',this.onMouseMove_);document.addEventListener('mouseup',this.onMouseUp_);this.targetElement_.addEventListener('blur',this.onMouseUp_);this.savePreviousUserSelect_=document.body.style['-webkit-user-select'];document.body.style['-webkit-user-select']='none';e.preventDefault();return true;},onMouseMove_(e){e=this.remakeEvent_(e,'mouse-tracker-move');this.targetElement_.dispatchEvent(e);},onMouseUp_(e){document.removeEventListener('mousemove',this.onMouseMove_);document.removeEventListener('mouseup',this.onMouseUp_);this.targetElement_.removeEventListener('blur',this.onMouseUp_);document.body.style['-webkit-user-select']=this.savePreviousUserSelect_;e=this.remakeEvent_(e,'mouse-tracker-end');this.targetElement_.dispatchEvent(e);},remakeEvent_(e,newType){const remade=new tr.b.Event(newType,true,true);remade.x=e.x;remade.y=e.y;remade.offsetX=e.offsetX;remade.offsetY=e.offsetY;remade.clientX=e.clientX;remade.clientY=e.clientY;return remade;}};function trackMouseMovesUntilMouseUp(mouseMoveHandler,opt_mouseUpHandler,opt_keyUpHandler){function cleanupAndDispatchToMouseUp(e){document.removeEventListener('mousemove',mouseMoveHandler);if(opt_keyUpHandler){document.removeEventListener('keyup',opt_keyUpHandler);}
+document.removeEventListener('mouseup',cleanupAndDispatchToMouseUp);if(opt_mouseUpHandler){opt_mouseUpHandler(e);}}
+document.addEventListener('mousemove',mouseMoveHandler);if(opt_keyUpHandler){document.addEventListener('keyup',opt_keyUpHandler);}
+document.addEventListener('mouseup',cleanupAndDispatchToMouseUp);}
+return{MouseTracker,trackMouseMovesUntilMouseUp,};});'use strict';tr.exportTo('tr.ui.b',function(){const MOUSE_SELECTOR_MODE=tr.ui.b.MOUSE_SELECTOR_MODE;const MOUSE_SELECTOR_MODE_INFOS=tr.ui.b.MOUSE_SELECTOR_MODE_INFOS;const MIN_MOUSE_SELECTION_DISTANCE=4;const MODIFIER={SHIFT:0x1,SPACE:0x2,CMD_OR_CTRL:0x4};function isCmdOrCtrlPressed(event){if(tr.isMac)return event.metaKey;return event.ctrlKey;}
+Polymer({is:'tr-ui-b-mouse-mode-selector',created(){this.supportedModeMask_=MOUSE_SELECTOR_MODE.ALL_MODES;this.initialRelativeMouseDownPos_={x:0,y:0};this.defaultMode_=MOUSE_SELECTOR_MODE.PANSCAN;this.settingsKey_=undefined;this.mousePos_={x:0,y:0};this.mouseDownPos_={x:0,y:0};this.onMouseDown_=this.onMouseDown_.bind(this);this.onMouseMove_=this.onMouseMove_.bind(this);this.onMouseUp_=this.onMouseUp_.bind(this);this.onKeyDown_=this.onKeyDown_.bind(this);this.onKeyUp_=this.onKeyUp_.bind(this);this.mode_=undefined;this.modeToKeyCodeMap_={};this.modifierToModeMap_={};this.targetElement_=undefined;this.modeBeforeAlternativeModeActivated_=null;this.isInteracting_=false;this.isClick_=false;},ready(){this.buttonsEl_=Polymer.dom(this.root).querySelector('.buttons');this.dragHandleEl_=Polymer.dom(this.root).querySelector('.drag-handle');this.supportedModeMask=MOUSE_SELECTOR_MODE.ALL_MODES;this.dragHandleEl_.addEventListener('mousedown',this.onDragHandleMouseDown_.bind(this));this.buttonsEl_.addEventListener('mouseup',this.onButtonMouseUp_);this.buttonsEl_.addEventListener('mousedown',this.onButtonMouseDown_);this.buttonsEl_.addEventListener('click',this.onButtonPress_.bind(this));},attached(){document.addEventListener('keydown',this.onKeyDown_);document.addEventListener('keyup',this.onKeyUp_);},detached(){document.removeEventListener('keydown',this.onKeyDown_);document.removeEventListener('keyup',this.onKeyUp_);},get targetElement(){return this.targetElement_;},set targetElement(target){if(this.targetElement_){this.targetElement_.removeEventListener('mousedown',this.onMouseDown_);}
+this.targetElement_=target;if(this.targetElement_){this.targetElement_.addEventListener('mousedown',this.onMouseDown_);}},get defaultMode(){return this.defaultMode_;},set defaultMode(defaultMode){this.defaultMode_=defaultMode;},get settingsKey(){return this.settingsKey_;},set settingsKey(settingsKey){this.settingsKey_=settingsKey;if(!this.settingsKey_)return;let mode=tr.b.Settings.get(this.settingsKey_+'.mode',undefined);if(MOUSE_SELECTOR_MODE_INFOS[mode]===undefined){mode=undefined;}
+if((mode&this.supportedModeMask_)===0){mode=undefined;}
+if(!mode)mode=this.defaultMode_;this.mode=mode;const pos=tr.b.Settings.get(this.settingsKey_+'.pos',undefined);if(pos)this.pos=pos;},get supportedModeMask(){return this.supportedModeMask_;},set supportedModeMask(supportedModeMask){if(this.mode&&(supportedModeMask&this.mode)===0){throw new Error('supportedModeMask must include current mode.');}
+function createButtonForMode(mode){return button;}
+this.supportedModeMask_=supportedModeMask;Polymer.dom(this.buttonsEl_).textContent='';for(const modeName in MOUSE_SELECTOR_MODE){if(modeName==='ALL_MODES')continue;const mode=MOUSE_SELECTOR_MODE[modeName];if((this.supportedModeMask_&mode)===0)continue;const button=document.createElement('tr-ui-b-mouse-mode-icon');button.mode=mode;Polymer.dom(button).classList.add('tool-button');Polymer.dom(this.buttonsEl_).appendChild(button);}},getButtonForMode_(mode){for(let i=0;i<this.buttonsEl_.children.length;i++){const buttonEl=this.buttonsEl_.children[i];if(buttonEl.mode===mode){return buttonEl;}}
+return undefined;},get mode(){return this.currentMode_;},set mode(newMode){if(newMode!==undefined){if(typeof newMode!=='number'){throw new Error('Mode must be a number');}
+if((newMode&this.supportedModeMask_)===0){throw new Error('Cannot switch to this mode, it is not supported');}
+if(MOUSE_SELECTOR_MODE_INFOS[newMode]===undefined){throw new Error('Unrecognized mode');}}
+let modeInfo;if(this.currentMode_===newMode)return;if(this.currentMode_){const buttonEl=this.getButtonForMode_(this.currentMode_);if(buttonEl)buttonEl.active=false;if(this.isInteracting_){const mouseEvent=this.createEvent_(MOUSE_SELECTOR_MODE_INFOS[this.mode].eventNames.end);this.dispatchEvent(mouseEvent);}
+modeInfo=MOUSE_SELECTOR_MODE_INFOS[this.currentMode_];tr.b.dispatchSimpleEvent(this,modeInfo.eventNames.exit,true);}
+this.currentMode_=newMode;if(this.currentMode_){const buttonEl=this.getButtonForMode_(this.currentMode_);if(buttonEl)buttonEl.active=true;this.mouseDownPos_.x=this.mousePos_.x;this.mouseDownPos_.y=this.mousePos_.y;modeInfo=MOUSE_SELECTOR_MODE_INFOS[this.currentMode_];if(!this.isInAlternativeMode_){tr.b.dispatchSimpleEvent(this,modeInfo.eventNames.enter,true);}
+if(this.isInteracting_){const mouseEvent=this.createEvent_(MOUSE_SELECTOR_MODE_INFOS[this.mode].eventNames.begin);this.dispatchEvent(mouseEvent);}}
+if(this.settingsKey_&&!this.isInAlternativeMode_){tr.b.Settings.set(this.settingsKey_+'.mode',this.mode);}},setKeyCodeForMode(mode,keyCode){if((mode&this.supportedModeMask_)===0){throw new Error('Mode not supported');}
+this.modeToKeyCodeMap_[mode]=keyCode;if(!this.buttonsEl_)return;const buttonEl=this.getButtonForMode_(mode);if(buttonEl){buttonEl.acceleratorKey=String.fromCharCode(keyCode);}},setCurrentMousePosFromEvent_(e){this.mousePos_.x=e.clientX;this.mousePos_.y=e.clientY;},createEvent_(eventName,sourceEvent){const event=new tr.b.Event(eventName,true);event.clientX=this.mousePos_.x;event.clientY=this.mousePos_.y;event.deltaX=this.mousePos_.x-this.mouseDownPos_.x;event.deltaY=this.mousePos_.y-this.mouseDownPos_.y;event.mouseDownX=this.mouseDownPos_.x;event.mouseDownY=this.mouseDownPos_.y;event.didPreventDefault=false;event.preventDefault=function(){event.didPreventDefault=true;if(sourceEvent){sourceEvent.preventDefault();}};event.stopPropagation=function(){sourceEvent.stopPropagation();};event.stopImmediatePropagation=function(){throw new Error('Not implemented');};return event;},onMouseDown_(e){if(e.button!==0)return;this.setCurrentMousePosFromEvent_(e);const mouseEvent=this.createEvent_(MOUSE_SELECTOR_MODE_INFOS[this.mode].eventNames.begin,e);if(this.mode===MOUSE_SELECTOR_MODE.SELECTION){mouseEvent.appendSelection=isCmdOrCtrlPressed(e);}
+this.dispatchEvent(mouseEvent);this.isInteracting_=true;this.isClick_=true;tr.ui.b.trackMouseMovesUntilMouseUp(this.onMouseMove_,this.onMouseUp_);},onMouseMove_(e){this.setCurrentMousePosFromEvent_(e);const mouseEvent=this.createEvent_(MOUSE_SELECTOR_MODE_INFOS[this.mode].eventNames.update,e);this.dispatchEvent(mouseEvent);if(this.isInteracting_){this.checkIsClick_(e);}},onMouseUp_(e){if(e.button!==0)return;const mouseEvent=this.createEvent_(MOUSE_SELECTOR_MODE_INFOS[this.mode].eventNames.end,e);mouseEvent.isClick=this.isClick_;this.dispatchEvent(mouseEvent);if(this.isClick_&&!mouseEvent.didPreventDefault){this.dispatchClickEvents_(e);}
+this.isInteracting_=false;this.updateAlternativeModeState_(e);},onButtonMouseDown_(e){e.preventDefault();e.stopImmediatePropagation();},onButtonMouseUp_(e){e.preventDefault();e.stopImmediatePropagation();},onButtonPress_(e){this.modeBeforeAlternativeModeActivated_=undefined;this.mode=e.target.mode;e.preventDefault();},onKeyDown_(e){if(e.path[0].tagName==='INPUT')return;if(e.keyCode===' '.charCodeAt(0)){this.spacePressed_=true;}
+this.updateAlternativeModeState_(e);},onKeyUp_(e){if(e.path[0].tagName==='INPUT')return;if(e.keyCode===' '.charCodeAt(0)){this.spacePressed_=false;}
+let didHandleKey=false;for(const[modeStr,keyCode]of Object.entries(this.modeToKeyCodeMap_)){if(e.keyCode===keyCode){this.modeBeforeAlternativeModeActivated_=undefined;const mode=parseInt(modeStr);this.mode=mode;didHandleKey=true;}}
+if(didHandleKey){e.preventDefault();e.stopPropagation();return;}
+this.updateAlternativeModeState_(e);},updateAlternativeModeState_(e){const shiftPressed=e.shiftKey;const spacePressed=this.spacePressed_;const cmdOrCtrlPressed=isCmdOrCtrlPressed(e);const smm=this.supportedModeMask_;let newMode;let isNewModeAnAlternativeMode=false;if(shiftPressed&&(this.modifierToModeMap_[MODIFIER.SHIFT]&smm)!==0){newMode=this.modifierToModeMap_[MODIFIER.SHIFT];isNewModeAnAlternativeMode=true;}else if(spacePressed&&(this.modifierToModeMap_[MODIFIER.SPACE]&smm)!==0){newMode=this.modifierToModeMap_[MODIFIER.SPACE];isNewModeAnAlternativeMode=true;}else if(cmdOrCtrlPressed&&(this.modifierToModeMap_[MODIFIER.CMD_OR_CTRL]&smm)!==0){newMode=this.modifierToModeMap_[MODIFIER.CMD_OR_CTRL];isNewModeAnAlternativeMode=true;}else{if(this.isInAlternativeMode_){newMode=this.modeBeforeAlternativeModeActivated_;isNewModeAnAlternativeMode=false;}else{newMode=undefined;}}
+if(this.mode===newMode||newMode===undefined)return;if(isNewModeAnAlternativeMode){this.modeBeforeAlternativeModeActivated_=this.mode;}
+this.mode=newMode;},get isInAlternativeMode_(){return!!this.modeBeforeAlternativeModeActivated_;},setModifierForAlternateMode(mode,modifier){this.modifierToModeMap_[modifier]=mode;},get pos(){return{x:parseInt(this.style.left),y:parseInt(this.style.top)};},set pos(pos){pos=this.constrainPositionToBounds_(pos);this.style.left=pos.x+'px';this.style.top=pos.y+'px';if(this.settingsKey_){tr.b.Settings.set(this.settingsKey_+'.pos',this.pos);}},constrainPositionToBounds_(pos){const parent=this.offsetParent||document.body;const parentRect=tr.ui.b.windowRectForElement(parent);const top=0;const bottom=parentRect.height-this.offsetHeight;const left=0;const right=parentRect.width-this.offsetWidth;const res={};res.x=Math.max(pos.x,left);res.x=Math.min(res.x,right);res.y=Math.max(pos.y,top);res.y=Math.min(res.y,bottom);return res;},onDragHandleMouseDown_(e){e.preventDefault();e.stopImmediatePropagation();const mouseDownPos={x:e.clientX-this.offsetLeft,y:e.clientY-this.offsetTop};tr.ui.b.trackMouseMovesUntilMouseUp(function(e){const pos={};pos.x=e.clientX-mouseDownPos.x;pos.y=e.clientY-mouseDownPos.y;this.pos=pos;}.bind(this));},checkIsClick_(e){if(!this.isInteracting_||!this.isClick_)return;const deltaX=this.mousePos_.x-this.mouseDownPos_.x;const deltaY=this.mousePos_.y-this.mouseDownPos_.y;const minDist=MIN_MOUSE_SELECTION_DISTANCE;if(deltaX*deltaX+deltaY*deltaY>minDist*minDist){this.isClick_=false;}},dispatchClickEvents_(e){if(!this.isClick_)return;const modeInfo=MOUSE_SELECTOR_MODE_INFOS[MOUSE_SELECTOR_MODE.SELECTION];const eventNames=modeInfo.eventNames;let mouseEvent=this.createEvent_(eventNames.begin);mouseEvent.appendSelection=isCmdOrCtrlPressed(e);this.dispatchEvent(mouseEvent);mouseEvent=this.createEvent_(eventNames.end);this.dispatchEvent(mouseEvent);}});return{MIN_MOUSE_SELECTION_DISTANCE,MODIFIER,};});'use strict';(function(){const DETAILS_SPLIT_REGEX=/^(\S*)\s*([\S\s]*)$/;Polymer({is:'tr-ui-e-chrome-cc-display-item-list-item',created(){Polymer.dom(this).setAttribute('name','');Polymer.dom(this).setAttribute('rawDetails','');Polymer.dom(this).setAttribute('richDetails',undefined);Polymer.dom(this).setAttribute('data_',undefined);},get data(){return this.data_;},set data(data){this.data_=data;if(!data){this.name='DATA MISSING';this.rawDetails='';this.richDetails=undefined;}else if(typeof data==='string'){const match=data.match(DETAILS_SPLIT_REGEX);this.name=match[1];this.rawDetails=match[2];this.richDetails=undefined;}else{this.name=data.name;this.rawDetails='';this.richDetails=data;}},stopPropagation(e){e.stopPropagation();},_computeIf(richDetails){return richDetails&&richDetails.skp64;},_computeHref(richDetails){return'data:application/octet-stream;base64,'+richDetails.skp64;}});})();'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){function Selection(){this.selectionToSetIfClicked=undefined;}
+Selection.prototype={get specicifity(){throw new Error('Not implemented');},get associatedLayerId(){throw new Error('Not implemented');},get associatedRenderPassId(){throw new Error('Not implemented');},get highlightsByLayerId(){return{};},createAnalysis(){throw new Error('Not implemented');},findEquivalent(lthi){throw new Error('Not implemented');}};function RenderPassSelection(renderPass,renderPassId){if(!renderPass||(renderPassId===undefined)){throw new Error('Render pass (with id) is required');}
+this.renderPass_=renderPass;this.renderPassId_=renderPassId;}
+RenderPassSelection.prototype={__proto__:Selection.prototype,get specicifity(){return 1;},get associatedLayerId(){return undefined;},get associatedRenderPassId(){return this.renderPassId_;},get renderPass(){return this.renderPass_;},createAnalysis(){const dataView=document.createElement('tr-ui-a-generic-object-view-with-label');dataView.label='RenderPass '+this.renderPassId_;dataView.object=this.renderPass_.args;return dataView;},get title(){return this.renderPass_.objectInstance.typeName;}};function LayerSelection(layer){if(!layer){throw new Error('Layer is required');}
+this.layer_=layer;}
+LayerSelection.prototype={__proto__:Selection.prototype,get specicifity(){return 1;},get associatedLayerId(){return this.layer_.layerId;},get associatedRenderPassId(){return undefined;},get layer(){return this.layer_;},createAnalysis(){const dataView=document.createElement('tr-ui-a-generic-object-view-with-label');dataView.label='Layer '+this.layer_.layerId;if(this.layer_.usingGpuRasterization){dataView.label+=' (GPU-rasterized)';}
+dataView.object=this.layer_.args;return dataView;},get title(){return this.layer_.objectInstance.typeName;},findEquivalent(lthi){const layer=lthi.activeTree.findLayerWithId(this.layer_.layerId)||lthi.pendingTree.findLayerWithId(this.layer_.layerId);if(!layer)return undefined;return new LayerSelection(layer);}};function TileSelection(tile,opt_data){this.tile_=tile;this.data_=opt_data||{};}
+TileSelection.prototype={__proto__:Selection.prototype,get specicifity(){return 2;},get associatedLayerId(){return this.tile_.layerId;},get highlightsByLayerId(){const highlights={};highlights[this.tile_.layerId]=[{colorKey:this.tile_.objectInstance.typeName,rect:this.tile_.layerRect}];return highlights;},createAnalysis(){const analysis=document.createElement('tr-ui-a-generic-object-view-with-label');analysis.label='Tile '+this.tile_.objectInstance.id+' on layer '+
+this.tile_.layerId;if(this.data_){analysis.object={moreInfo:this.data_,tileArgs:this.tile_.args};}else{analysis.object=this.tile_.args;}
+return analysis;},findEquivalent(lthi){const tileInstance=this.tile_.tileInstance;if(lthi.ts<tileInstance.creationTs||lthi.ts>=tileInstance.deletionTs){return undefined;}
+const tileSnapshot=tileInstance.getSnapshotAt(lthi.ts);if(!tileSnapshot)return undefined;return new TileSelection(tileSnapshot);}};function LayerRectSelection(layer,rectType,rect,opt_data){this.layer_=layer;this.rectType_=rectType;this.rect_=rect;this.data_=opt_data!==undefined?opt_data:rect;}
+LayerRectSelection.prototype={__proto__:Selection.prototype,get specicifity(){return 2;},get associatedLayerId(){return this.layer_.layerId;},get highlightsByLayerId(){const highlights={};highlights[this.layer_.layerId]=[{colorKey:this.rectType_,rect:this.rect_}];return highlights;},createAnalysis(){const analysis=document.createElement('tr-ui-a-generic-object-view-with-label');analysis.label=this.rectType_+' on layer '+this.layer_.layerId;analysis.object=this.data_;return analysis;},findEquivalent(lthi){return undefined;}};function AnimationRectSelection(layer,rect){this.layer_=layer;this.rect_=rect;}
+AnimationRectSelection.prototype={__proto__:Selection.prototype,get specicifity(){return 0;},get associatedLayerId(){return this.layer_.layerId;},createAnalysis(){const analysis=document.createElement('tr-ui-a-generic-object-view-with-label');analysis.label='Animation Bounds of layer '+this.layer_.layerId;analysis.object=this.rect_;return analysis;}};return{Selection,RenderPassSelection,LayerSelection,TileSelection,LayerRectSelection,AnimationRectSelection,};});'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){const OPS_TIMING_ITERATIONS=3;const ANNOTATION='Comment';const BEGIN_ANNOTATION='BeginCommentGroup';const END_ANNOTATION='EndCommentGroup';const ANNOTATION_ID='ID: ';const ANNOTATION_CLASS='CLASS: ';const ANNOTATION_TAG='TAG: ';const constants=tr.e.cc.constants;const PictureOpsListView=tr.ui.b.define('tr-ui-e-chrome-cc-picture-ops-list-view');PictureOpsListView.prototype={__proto__:HTMLDivElement.prototype,decorate(){this.opsList_=new tr.ui.b.ListView();Polymer.dom(this).appendChild(this.opsList_);this.selectedOp_=undefined;this.selectedOpIndex_=undefined;this.opsList_.addEventListener('selection-changed',this.onSelectionChanged_.bind(this));this.picture_=undefined;},get picture(){return this.picture_;},set picture(picture){this.picture_=picture;this.updateContents_();},updateContents_(){this.opsList_.clear();if(!this.picture_)return;let ops=this.picture_.getOps();if(!ops)return;ops=this.picture_.tagOpsWithTimings(ops);ops=this.opsTaggedWithAnnotations_(ops);for(let i=0;i<ops.length;i++){const op=ops[i];const item=document.createElement('div');item.opIndex=op.opIndex;Polymer.dom(item).textContent=i+') '+op.cmd_string;if(op.elementInfo.tag||op.elementInfo.id||op.elementInfo.class){const elementInfo=document.createElement('span');Polymer.dom(elementInfo).classList.add('elementInfo');const tag=op.elementInfo.tag?op.elementInfo.tag:'unknown';const id=op.elementInfo.id?'id='+op.elementInfo.id:undefined;const className=op.elementInfo.class?'class='+
+op.elementInfo.class:undefined;Polymer.dom(elementInfo).textContent='<'+tag+(id?' ':'')+
+(id?id:'')+(className?' ':'')+
+(className?className:'')+'>';Polymer.dom(item).appendChild(elementInfo);}
+if(op.info.length>0){const infoItem=document.createElement('div');Polymer.dom(infoItem).textContent=JSON.stringify(op.info);Polymer.dom(item).appendChild(infoItem);}
+if(op.cmd_time&&op.cmd_time>=0.0001){const time=document.createElement('span');Polymer.dom(time).classList.add('time');const rounded=op.cmd_time.toFixed(4);Polymer.dom(time).textContent='('+rounded+'ms)';Polymer.dom(item).appendChild(time);}
+Polymer.dom(this.opsList_).appendChild(item);}},onSelectionChanged_(e){let beforeSelectedOp=true;if(this.opsList_.selectedElement===this.selectedOp_){this.opsList_.selectedElement=undefined;beforeSelectedOp=false;this.selectedOpIndex_=undefined;}
+this.selectedOp_=this.opsList_.selectedElement;const ops=this.opsList_.children;for(let i=0;i<ops.length;i++){const op=ops[i];if(op===this.selectedOp_){beforeSelectedOp=false;this.selectedOpIndex_=op.opIndex;}else if(beforeSelectedOp){Polymer.dom(op).setAttribute('beforeSelection','beforeSelection');}else{Polymer.dom(op).removeAttribute('beforeSelection');}}
+tr.b.dispatchSimpleEvent(this,'selection-changed',false);},get numOps(){return this.opsList_.children.length;},get selectedOpIndex(){return this.selectedOpIndex_;},set selectedOpIndex(s){this.selectedOpIndex_=s;if(s===undefined){this.opsList_.selectedElement=this.selectedOp_;this.onSelectionChanged_();}else{if(s<0)throw new Error('Invalid index');if(s>=this.numOps)throw new Error('Invalid index');this.opsList_.selectedElement=this.opsList_.getElementByIndex(s+1);tr.ui.b.scrollIntoViewIfNeeded(this.opsList_.selectedElement);}},opsTaggedWithAnnotations_(ops){const annotationGroups=[];const opsWithoutAnnotations=[];for(let opIndex=0;opIndex<ops.length;opIndex++){const op=ops[opIndex];op.opIndex=opIndex;switch(op.cmd_string){case BEGIN_ANNOTATION:annotationGroups.push([]);break;case END_ANNOTATION:annotationGroups.pop();break;case ANNOTATION:annotationGroups[annotationGroups.length-1].push(op);break;default:{const annotations=[];let elementInfo={};annotationGroups.forEach(function(annotationGroup){elementInfo={};annotationGroup.forEach(function(annotation){annotation.info.forEach(function(info){if(info.includes(ANNOTATION_TAG)){elementInfo.tag=info.substring(info.indexOf(ANNOTATION_TAG)+
+ANNOTATION_TAG.length).toLowerCase();}else if(info.includes(ANNOTATION_ID)){elementInfo.id=info.substring(info.indexOf(ANNOTATION_ID)+
+ANNOTATION_ID.length);}else if(info.includes(ANNOTATION_CLASS)){elementInfo.class=info.substring(info.indexOf(ANNOTATION_CLASS)+
+ANNOTATION_CLASS.length);}
+annotations.push(info);});});});op.annotations=annotations;op.elementInfo=elementInfo;opsWithoutAnnotations.push(op);}}}
+return opsWithoutAnnotations;}};return{PictureOpsListView,};});'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){const THIS_DOC=document.currentScript.ownerDocument;const DisplayItemDebugger=tr.ui.b.define('tr-ui-e-chrome-cc-display-item-debugger');DisplayItemDebugger.prototype={__proto__:HTMLDivElement.prototype,decorate(){const node=tr.ui.b.instantiateTemplate('#tr-ui-e-chrome-cc-display-item-debugger-template',THIS_DOC);Polymer.dom(this).appendChild(node);this.pictureAsImageData_=undefined;this.zoomScaleValue_=1;this.sizeInfo_=Polymer.dom(this).querySelector('.size');this.rasterArea_=Polymer.dom(this).querySelector('raster-area');this.rasterCanvas_=Polymer.dom(this.rasterArea_).querySelector('canvas');this.rasterCtx_=this.rasterCanvas_.getContext('2d');this.trackMouse_();this.displayItemInfo_=Polymer.dom(this).querySelector('display-item-info');this.displayItemInfo_.addEventListener('click',this.onDisplayItemInfoClick_.bind(this),false);this.displayItemListView_=new tr.ui.b.ListView();this.displayItemListView_.addEventListener('selection-changed',this.onDisplayItemListSelection_.bind(this));Polymer.dom(this.displayItemInfo_).appendChild(this.displayItemListView_);this.displayListFilename_=Polymer.dom(this).querySelector('.dlfilename');this.displayListExportButton_=Polymer.dom(this).querySelector('.dlexport');this.displayListExportButton_.addEventListener('click',this.onExportDisplayListClicked_.bind(this));this.skpFilename_=Polymer.dom(this).querySelector('.skpfilename');this.skpExportButton_=Polymer.dom(this).querySelector('.skpexport');this.skpExportButton_.addEventListener('click',this.onExportSkPictureClicked_.bind(this));const leftPanel=Polymer.dom(this).querySelector('left-panel');const middleDragHandle=document.createElement('tr-ui-b-drag-handle');middleDragHandle.horizontal=false;middleDragHandle.target=leftPanel;const rightPanel=Polymer.dom(this).querySelector('right-panel');this.infoBar_=document.createElement('tr-ui-b-info-bar');Polymer.dom(this.rasterArea_).insertBefore(this.infoBar_,this.rasterCanvas_);Polymer.dom(this).insertBefore(middleDragHandle,rightPanel);this.picture_=undefined;this.pictureOpsListView_=new tr.ui.e.chrome.cc.PictureOpsListView();Polymer.dom(rightPanel).insertBefore(this.pictureOpsListView_,this.rasterArea_);this.pictureOpsListDragHandle_=document.createElement('tr-ui-b-drag-handle');this.pictureOpsListDragHandle_.horizontal=false;this.pictureOpsListDragHandle_.target=this.pictureOpsListView_;Polymer.dom(rightPanel).insertBefore(this.pictureOpsListDragHandle_,this.rasterArea_);},get picture(){return this.picture_;},set displayItemList(displayItemList){this.displayItemList_=displayItemList;this.picture=this.displayItemList_;this.displayItemListView_.clear();this.displayItemList_.items.forEach(function(item){const listItem=document.createElement('tr-ui-e-chrome-cc-display-item-list-item');listItem.data=item;Polymer.dom(this.displayItemListView_).appendChild(listItem);}.bind(this));},set picture(picture){this.picture_=picture;const showOpsList=picture&&picture!==this.displayItemList_;this.updateDrawOpsList_(showOpsList);if(picture){const size=this.getRasterCanvasSize_();this.rasterCanvas_.width=size.width;this.rasterCanvas_.height=size.height;}
+const bounds=this.rasterArea_.getBoundingClientRect();const selectorBounds=this.mouseModeSelector_.getBoundingClientRect();this.mouseModeSelector_.pos={x:(bounds.right-selectorBounds.width-10),y:bounds.top};this.rasterize_();this.scheduleUpdateContents_();},getRasterCanvasSize_(){const style=window.getComputedStyle(this.rasterArea_);let width=parseInt(style.width);let height=parseInt(style.height);if(this.picture_){width=Math.max(width,this.picture_.layerRect.width);height=Math.max(height,this.picture_.layerRect.height);}
+return{width,height};},scheduleUpdateContents_(){if(this.updateContentsPending_)return;this.updateContentsPending_=true;tr.b.requestAnimationFrameInThisFrameIfPossible(this.updateContents_.bind(this));},updateContents_(){this.updateContentsPending_=false;if(this.picture_){Polymer.dom(this.sizeInfo_).textContent='('+
+this.picture_.layerRect.width+' x '+
+this.picture_.layerRect.height+')';}
+if(!this.pictureAsImageData_)return;this.infoBar_.visible=false;this.infoBar_.removeAllButtons();if(this.pictureAsImageData_.error){this.infoBar_.message='Cannot rasterize...';this.infoBar_.addButton('More info...',function(e){const overlay=new tr.ui.b.Overlay();Polymer.dom(overlay).textContent=this.pictureAsImageData_.error;overlay.visible=true;e.stopPropagation();return false;}.bind(this));this.infoBar_.visible=true;}
+this.drawPicture_();},drawPicture_(){const size=this.getRasterCanvasSize_();if(size.width!==this.rasterCanvas_.width){this.rasterCanvas_.width=size.width;}
+if(size.height!==this.rasterCanvas_.height){this.rasterCanvas_.height=size.height;}
+this.rasterCtx_.clearRect(0,0,size.width,size.height);if(!this.picture_||!this.pictureAsImageData_.imageData)return;const imgCanvas=this.pictureAsImageData_.asCanvas();const w=imgCanvas.width;const h=imgCanvas.height;this.rasterCtx_.drawImage(imgCanvas,0,0,w,h,0,0,w*this.zoomScaleValue_,h*this.zoomScaleValue_);},rasterize_(){if(this.picture_){this.picture_.rasterize({showOverdraw:false},this.onRasterComplete_.bind(this));}},onRasterComplete_(pictureAsImageData){this.pictureAsImageData_=pictureAsImageData;this.scheduleUpdateContents_();},onDisplayItemListSelection_(e){const selected=this.displayItemListView_.selectedElement;if(!selected){this.picture=this.displayItemList_;return;}
+const index=Array.prototype.indexOf.call(this.displayItemListView_.children,selected);const displayItem=this.displayItemList_.items[index];if(displayItem&&displayItem.skp64){this.picture=new tr.e.cc.Picture(displayItem.skp64,this.displayItemList_.layerRect);}else{this.picture=undefined;}},onDisplayItemInfoClick_(e){if(e&&e.target===this.displayItemInfo_){this.displayItemListView_.selectedElement=undefined;}},updateDrawOpsList_(showOpsList){if(showOpsList){this.pictureOpsListView_.picture=this.picture_;if(this.pictureOpsListView_.numOps>0){Polymer.dom(this.pictureOpsListView_).classList.add('hasPictureOps');Polymer.dom(this.pictureOpsListDragHandle_).classList.add('hasPictureOps');}}else{Polymer.dom(this.pictureOpsListView_).classList.remove('hasPictureOps');Polymer.dom(this.pictureOpsListDragHandle_).classList.remove('hasPictureOps');}},trackMouse_(){this.mouseModeSelector_=document.createElement('tr-ui-b-mouse-mode-selector');this.mouseModeSelector_.targetElement=this.rasterArea_;Polymer.dom(this.rasterArea_).appendChild(this.mouseModeSelector_);this.mouseModeSelector_.supportedModeMask=tr.ui.b.MOUSE_SELECTOR_MODE.ZOOM;this.mouseModeSelector_.mode=tr.ui.b.MOUSE_SELECTOR_MODE.ZOOM;this.mouseModeSelector_.defaultMode=tr.ui.b.MOUSE_SELECTOR_MODE.ZOOM;this.mouseModeSelector_.settingsKey='pictureDebugger.mouseModeSelector';this.mouseModeSelector_.addEventListener('beginzoom',this.onBeginZoom_.bind(this));this.mouseModeSelector_.addEventListener('updatezoom',this.onUpdateZoom_.bind(this));this.mouseModeSelector_.addEventListener('endzoom',this.onEndZoom_.bind(this));},onBeginZoom_(e){this.isZooming_=true;this.lastMouseViewPos_=this.extractRelativeMousePosition_(e);e.preventDefault();},onUpdateZoom_(e){if(!this.isZooming_)return;const currentMouseViewPos=this.extractRelativeMousePosition_(e);this.zoomScaleValue_+=((this.lastMouseViewPos_.y-currentMouseViewPos.y)*0.001);this.zoomScaleValue_=Math.max(this.zoomScaleValue_,0.1);this.drawPicture_();this.lastMouseViewPos_=currentMouseViewPos;},onEndZoom_(e){this.lastMouseViewPos_=undefined;this.isZooming_=false;e.preventDefault();},extractRelativeMousePosition_(e){return{x:e.clientX-this.rasterArea_.offsetLeft,y:e.clientY-this.rasterArea_.offsetTop};},saveFile_(filename,rawData){if(!rawData)return;const length=rawData.length;const arrayBuffer=new ArrayBuffer(length);const uint8Array=new Uint8Array(arrayBuffer);for(let c=0;c<length;c++){uint8Array[c]=rawData.charCodeAt(c);}
+const blob=new Blob([uint8Array],{type:'application/octet-binary'});const blobUrl=window.URL.createObjectURL(blob);const link=document.createElementNS('http://www.w3.org/1999/xhtml','a');link.href=blobUrl;link.download=filename;const event=document.createEvent('MouseEvents');event.initMouseEvent('click',true,false,window,0,0,0,0,0,false,false,false,false,0,null);link.dispatchEvent(event);},onExportDisplayListClicked_(){const rawData=JSON.stringify(this.displayItemList_.items);this.saveFile_(this.displayListFilename_.value,rawData);},onExportSkPictureClicked_(){const rawData=tr.b.Base64.atob(this.picture_.getBase64SkpData());this.saveFile_(this.skpFilename_.value,rawData);}};return{DisplayItemDebugger,};});'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){const DisplayItemSnapshotView=tr.ui.b.define('tr-ui-e-chrome-cc-display-item-list-view',tr.ui.analysis.ObjectSnapshotView);DisplayItemSnapshotView.prototype={__proto__:tr.ui.analysis.ObjectSnapshotView.prototype,decorate(){Polymer.dom(this).classList.add('tr-ui-e-chrome-cc-display-item-list-view');this.displayItemDebugger_=new tr.ui.e.chrome.cc.DisplayItemDebugger();Polymer.dom(this).appendChild(this.displayItemDebugger_);},updateContents(){if(this.objectSnapshot_&&this.displayItemDebugger_){this.displayItemDebugger_.displayItemList=this.objectSnapshot_;}}};tr.ui.analysis.ObjectSnapshotView.register(DisplayItemSnapshotView,{typeNames:['cc::DisplayItemList'],showInstances:false});return{DisplayItemSnapshotView,};});'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){const constants=tr.e.cc.constants;const RENDER_PASS_QUADS=Math.max(constants.ACTIVE_TREE,constants.PENDING_TREE)+1;const LayerPicker=tr.ui.b.define('tr-ui-e-chrome-cc-layer-picker');LayerPicker.prototype={__proto__:HTMLUnknownElement.prototype,decorate(){this.lthi_=undefined;this.controls_=document.createElement('top-controls');this.renderPassQuads_=false;this.itemList_=new tr.ui.b.ListView();Polymer.dom(this).appendChild(this.controls_);Polymer.dom(this).appendChild(this.itemList_);this.itemList_.addEventListener('selection-changed',this.onItemSelectionChanged_.bind(this));Polymer.dom(this.controls_).appendChild(tr.ui.b.createSelector(this,'whichTree','layerPicker.whichTree',constants.ACTIVE_TREE,[{label:'Active tree',value:constants.ACTIVE_TREE},{label:'Pending tree',value:constants.PENDING_TREE},{label:'Render pass quads',value:RENDER_PASS_QUADS}]));this.showPureTransformLayers_=false;const showPureTransformLayers=tr.ui.b.createCheckBox(this,'showPureTransformLayers','layerPicker.showPureTransformLayers',false,'Transform layers');Polymer.dom(showPureTransformLayers).classList.add('show-transform-layers');showPureTransformLayers.title='When checked, pure transform layers are shown';Polymer.dom(this.controls_).appendChild(showPureTransformLayers);},get lthiSnapshot(){return this.lthiSnapshot_;},set lthiSnapshot(lthiSnapshot){this.lthiSnapshot_=lthiSnapshot;this.updateContents_();},get whichTree(){return this.renderPassQuads_?constants.ACTIVE_TREE:this.whichTree_;},set whichTree(whichTree){this.whichTree_=whichTree;this.renderPassQuads_=(whichTree===RENDER_PASS_QUADS);this.updateContents_();tr.b.dispatchSimpleEvent(this,'selection-change',false);},get layerTreeImpl(){if(this.lthiSnapshot===undefined)return undefined;return this.lthiSnapshot.getTree(this.whichTree);},get isRenderPassQuads(){return this.renderPassQuads_;},get showPureTransformLayers(){return this.showPureTransformLayers_;},set showPureTransformLayers(show){if(this.showPureTransformLayers_===show)return;this.showPureTransformLayers_=show;this.updateContents_();},getRenderPassInfos_(){if(!this.lthiSnapshot_)return[];const renderPassInfo=[];if(!this.lthiSnapshot_.args.frame||!this.lthiSnapshot_.args.frame.renderPasses){return renderPassInfo;}
+const renderPasses=this.lthiSnapshot_.args.frame.renderPasses;for(let i=0;i<renderPasses.length;++i){const info={renderPass:renderPasses[i],depth:0,id:i,name:'cc::RenderPass'};renderPassInfo.push(info);}
+return renderPassInfo;},getLayerInfos_(){if(!this.lthiSnapshot_)return[];const tree=this.lthiSnapshot_.getTree(this.whichTree_);if(!tree)return[];const layerInfos=[];const showPureTransformLayers=this.showPureTransformLayers_;function isPureTransformLayer(layer){if(layer.args.compositingReasons&&layer.args.compositingReasons.length!==1&&layer.args.compositingReasons[0]!=='No reasons given'){return false;}
+if(layer.args.drawsContent)return false;return true;}
+const visitedLayers={};function visitLayer(layer,depth,isMask,isReplica){if(visitedLayers[layer.layerId])return;visitedLayers[layer.layerId]=true;const info={layer,depth};if(layer.args.drawsContent){info.name=layer.objectInstance.name;}else{info.name='cc::LayerImpl';}
+if(layer.usingGpuRasterization){info.name+=' (G)';}
+info.isMaskLayer=isMask;info.replicaLayer=isReplica;if(showPureTransformLayers||!isPureTransformLayer(layer)){layerInfos.push(info);}}
+tree.iterLayers(visitLayer);return layerInfos;},updateContents_(){if(this.renderPassQuads_){this.updateRenderPassContents_();}else{this.updateLayerContents_();}},updateRenderPassContents_(){this.itemList_.clear();let selectedRenderPassId;if(this.selection_&&this.selection_.associatedRenderPassId){selectedRenderPassId=this.selection_.associatedRenderPassId;}
+const renderPassInfos=this.getRenderPassInfos_();renderPassInfos.forEach(function(renderPassInfo){const renderPass=renderPassInfo.renderPass;const id=renderPassInfo.id;const item=this.createElementWithDepth_(renderPassInfo.depth);const labelEl=Polymer.dom(item).appendChild(tr.ui.b.createSpan());Polymer.dom(labelEl).textContent=renderPassInfo.name+' '+id;item.renderPass=renderPass;item.renderPassId=id;Polymer.dom(this.itemList_).appendChild(item);if(id===selectedRenderPassId){renderPass.selectionState=tr.model.SelectionState.SELECTED;}},this);},updateLayerContents_(){this.changingItemSelection_=true;try{this.itemList_.clear();let selectedLayerId;if(this.selection_&&this.selection_.associatedLayerId){selectedLayerId=this.selection_.associatedLayerId;}
+const layerInfos=this.getLayerInfos_();layerInfos.forEach(function(layerInfo){const layer=layerInfo.layer;const id=layer.layerId;const item=this.createElementWithDepth_(layerInfo.depth);const labelEl=Polymer.dom(item).appendChild(tr.ui.b.createSpan());Polymer.dom(labelEl).textContent=layerInfo.name+' '+id;const notesEl=Polymer.dom(item).appendChild(tr.ui.b.createSpan());if(layerInfo.isMaskLayer){Polymer.dom(notesEl).textContent+='(mask)';}
+if(layerInfo.isReplicaLayer){Polymer.dom(notesEl).textContent+='(replica)';}
+if((layer.gpuMemoryUsageInBytes!==undefined)&&(layer.gpuMemoryUsageInBytes>0)){const gpuUsageStr=tr.b.Unit.byName.sizeInBytes.format(layer.gpuMemoryUsageInBytes);Polymer.dom(notesEl).textContent+=' ('+gpuUsageStr+' MiB)';}
+item.layer=layer;Polymer.dom(this.itemList_).appendChild(item);if(layer.layerId===selectedLayerId){layer.selectionState=tr.model.SelectionState.SELECTED;item.selected=true;}},this);}finally{this.changingItemSelection_=false;}},createElementWithDepth_(depth){const item=document.createElement('div');const indentEl=Polymer.dom(item).appendChild(tr.ui.b.createSpan());indentEl.style.whiteSpace='pre';for(let i=0;i<depth;i++){Polymer.dom(indentEl).textContent=Polymer.dom(indentEl).textContent+' ';}
+return item;},onItemSelectionChanged_(e){if(this.changingItemSelection_)return;if(this.renderPassQuads_){this.onRenderPassSelected_(e);}else{this.onLayerSelected_(e);}
+tr.b.dispatchSimpleEvent(this,'selection-change',false);},onRenderPassSelected_(e){let selectedRenderPass;let selectedRenderPassId;if(this.itemList_.selectedElement){selectedRenderPass=this.itemList_.selectedElement.renderPass;selectedRenderPassId=this.itemList_.selectedElement.renderPassId;}
+if(selectedRenderPass){this.selection_=new tr.ui.e.chrome.cc.RenderPassSelection(selectedRenderPass,selectedRenderPassId);}else{this.selection_=undefined;}},onLayerSelected_(e){let selectedLayer;if(this.itemList_.selectedElement){selectedLayer=this.itemList_.selectedElement.layer;}
+if(selectedLayer){this.selection_=new tr.ui.e.chrome.cc.LayerSelection(selectedLayer);}else{this.selection_=undefined;}},get selection(){return this.selection_;},set selection(selection){if(this.selection_===selection)return;this.selection_=selection;this.updateContents_();}};return{LayerPicker,};});'use strict';tr.exportTo('tr.e.cc',function(){const ObjectSnapshot=tr.model.ObjectSnapshot;function RenderPassSnapshot(){ObjectSnapshot.apply(this,arguments);}
+RenderPassSnapshot.prototype={__proto__:ObjectSnapshot.prototype,preInitialize(){tr.e.cc.preInitializeObject(this);},initialize(){tr.e.cc.moveRequiredFieldsFromArgsToToplevel(this,['quadList']);}};ObjectSnapshot.subTypes.register(RenderPassSnapshot,{typeName:'cc::RenderPass'});return{RenderPassSnapshot,};});'use strict';tr.exportTo('tr.ui.b',function(){const deg2rad=tr.b.math.deg2rad;const constants={DEFAULT_SCALE:0.5,DEFAULT_EYE_DISTANCE:10000,MINIMUM_DISTANCE:1000,MAXIMUM_DISTANCE:100000,FOV:15,RESCALE_TIMEOUT_MS:200,MAXIMUM_TILT:80,SETTINGS_NAMESPACE:'tr.ui_camera'};const Camera=tr.ui.b.define('camera');Camera.prototype={__proto__:HTMLUnknownElement.prototype,decorate(eventSource){this.eventSource_=eventSource;this.eventSource_.addEventListener('beginpan',this.onPanBegin_.bind(this));this.eventSource_.addEventListener('updatepan',this.onPanUpdate_.bind(this));this.eventSource_.addEventListener('endpan',this.onPanEnd_.bind(this));this.eventSource_.addEventListener('beginzoom',this.onZoomBegin_.bind(this));this.eventSource_.addEventListener('updatezoom',this.onZoomUpdate_.bind(this));this.eventSource_.addEventListener('endzoom',this.onZoomEnd_.bind(this));this.eventSource_.addEventListener('beginrotate',this.onRotateBegin_.bind(this));this.eventSource_.addEventListener('updaterotate',this.onRotateUpdate_.bind(this));this.eventSource_.addEventListener('endrotate',this.onRotateEnd_.bind(this));this.eye_=[0,0,constants.DEFAULT_EYE_DISTANCE];this.gazeTarget_=[0,0,0];this.rotation_=[0,0];this.pixelRatio_=window.devicePixelRatio||1;},get modelViewMatrix(){const mvMatrix=mat4.create();mat4.lookAt(mvMatrix,this.eye_,this.gazeTarget_,[0,1,0]);return mvMatrix;},get projectionMatrix(){const rect=tr.ui.b.windowRectForElement(this.canvas_).scaleSize(this.pixelRatio_);const aspectRatio=rect.width/rect.height;const matrix=mat4.create();mat4.perspective(matrix,deg2rad(constants.FOV),aspectRatio,1,100000);return matrix;},set canvas(c){this.canvas_=c;},set deviceRect(rect){this.deviceRect_=rect;},get stackingDistanceDampening(){const gazeVector=[this.gazeTarget_[0]-this.eye_[0],this.gazeTarget_[1]-this.eye_[1],this.gazeTarget_[2]-this.eye_[2]];vec3.normalize(gazeVector,gazeVector);return 1+gazeVector[2];},loadCameraFromSettings(settings){this.eye_=settings.get('eye',this.eye_,constants.SETTINGS_NAMESPACE);this.gazeTarget_=settings.get('gaze_target',this.gazeTarget_,constants.SETTINGS_NAMESPACE);this.rotation_=settings.get('rotation',this.rotation_,constants.SETTINGS_NAMESPACE);this.dispatchRenderEvent_();},saveCameraToSettings(settings){settings.set('eye',this.eye_,constants.SETTINGS_NAMESPACE);settings.set('gaze_target',this.gazeTarget_,constants.SETTINGS_NAMESPACE);settings.set('rotation',this.rotation_,constants.SETTINGS_NAMESPACE);},resetCamera(){this.eye_=[0,0,constants.DEFAULT_EYE_DISTANCE];this.gazeTarget_=[0,0,0];this.rotation_=[0,0];const settings=tr.b.SessionSettings();const keys=settings.keys(constants.SETTINGS_NAMESPACE);if(keys.length!==0){this.loadCameraFromSettings(settings);return;}
+if(this.deviceRect_){const rect=tr.ui.b.windowRectForElement(this.canvas_).scaleSize(this.pixelRatio_);this.eye_[0]=this.deviceRect_.width/2;this.eye_[1]=this.deviceRect_.height/2;this.gazeTarget_[0]=this.deviceRect_.width/2;this.gazeTarget_[1]=this.deviceRect_.height/2;}
+this.saveCameraToSettings(settings);this.dispatchRenderEvent_();},updatePanByDelta(delta){const rect=tr.ui.b.windowRectForElement(this.canvas_).scaleSize(this.pixelRatio_);const eyeVector=[this.eye_[0]-this.gazeTarget_[0],this.eye_[1]-this.gazeTarget_[1],this.eye_[2]-this.gazeTarget_[2]];const length=vec3.length(eyeVector);vec3.normalize(eyeVector,eyeVector);const halfFov=constants.FOV/2;const multiplier=2.0*length*Math.tan(deg2rad(halfFov))/rect.height;const up=[0,1,0];const rotMatrix=mat4.create();mat4.rotate(rotMatrix,rotMatrix,deg2rad(this.rotation_[1]),[0,1,0]);mat4.rotate(rotMatrix,rotMatrix,deg2rad(this.rotation_[0]),[1,0,0]);vec3.transformMat4(up,up,rotMatrix);const right=[0,0,0];vec3.cross(right,eyeVector,up);vec3.normalize(right,right);for(let i=0;i<3;++i){this.gazeTarget_[i]+=delta[0]*multiplier*right[i]-delta[1]*multiplier*up[i];this.eye_[i]=this.gazeTarget_[i]+length*eyeVector[i];}
+if(Math.abs(this.gazeTarget_[2])>1e-6){const gazeVector=[-eyeVector[0],-eyeVector[1],-eyeVector[2]];const newLength=tr.b.math.clamp(-this.eye_[2]/gazeVector[2],constants.MINIMUM_DISTANCE,constants.MAXIMUM_DISTANCE);for(let i=0;i<3;++i){this.gazeTarget_[i]=this.eye_[i]+newLength*gazeVector[i];}}
+this.saveCameraToSettings(tr.b.SessionSettings());this.dispatchRenderEvent_();},updateZoomByDelta(delta){let deltaY=delta[1];deltaY=tr.b.math.clamp(deltaY,-50,50);let scale=1.0-deltaY/100.0;const eyeVector=[0,0,0];vec3.subtract(eyeVector,this.eye_,this.gazeTarget_);const length=vec3.length(eyeVector);if(length*scale<constants.MINIMUM_DISTANCE){scale=constants.MINIMUM_DISTANCE/length;}else if(length*scale>constants.MAXIMUM_DISTANCE){scale=constants.MAXIMUM_DISTANCE/length;}
+vec3.scale(eyeVector,eyeVector,scale);vec3.add(this.eye_,this.gazeTarget_,eyeVector);this.saveCameraToSettings(tr.b.SessionSettings());this.dispatchRenderEvent_();},updateRotateByDelta(delta){delta[0]*=0.5;delta[1]*=0.5;if(Math.abs(this.rotation_[0]+delta[1])>constants.MAXIMUM_TILT){return;}
+if(Math.abs(this.rotation_[1]-delta[0])>constants.MAXIMUM_TILT){return;}
+const eyeVector=[0,0,0,0];vec3.subtract(eyeVector,this.eye_,this.gazeTarget_);const rotMatrix=mat4.create();mat4.rotate(rotMatrix,rotMatrix,-deg2rad(this.rotation_[0]),[1,0,0]);mat4.rotate(rotMatrix,rotMatrix,-deg2rad(this.rotation_[1]),[0,1,0]);vec4.transformMat4(eyeVector,eyeVector,rotMatrix);this.rotation_[0]+=delta[1];this.rotation_[1]-=delta[0];mat4.identity(rotMatrix);mat4.rotate(rotMatrix,rotMatrix,deg2rad(this.rotation_[1]),[0,1,0]);mat4.rotate(rotMatrix,rotMatrix,deg2rad(this.rotation_[0]),[1,0,0]);vec4.transformMat4(eyeVector,eyeVector,rotMatrix);vec3.add(this.eye_,this.gazeTarget_,eyeVector);this.saveCameraToSettings(tr.b.SessionSettings());this.dispatchRenderEvent_();},onPanBegin_(e){this.panning_=true;this.lastMousePosition_=this.getMousePosition_(e);},onPanUpdate_(e){if(!this.panning_)return;const delta=this.getMouseDelta_(e,this.lastMousePosition_);this.lastMousePosition_=this.getMousePosition_(e);this.updatePanByDelta(delta);},onPanEnd_(e){this.panning_=false;},onZoomBegin_(e){this.zooming_=true;const p=this.getMousePosition_(e);this.lastMousePosition_=p;this.zoomPoint_=p;},onZoomUpdate_(e){if(!this.zooming_)return;const delta=this.getMouseDelta_(e,this.lastMousePosition_);this.lastMousePosition_=this.getMousePosition_(e);this.updateZoomByDelta(delta);},onZoomEnd_(e){this.zooming_=false;this.zoomPoint_=undefined;},onRotateBegin_(e){this.rotating_=true;this.lastMousePosition_=this.getMousePosition_(e);},onRotateUpdate_(e){if(!this.rotating_)return;const delta=this.getMouseDelta_(e,this.lastMousePosition_);this.lastMousePosition_=this.getMousePosition_(e);this.updateRotateByDelta(delta);},onRotateEnd_(e){this.rotating_=false;},getMousePosition_(e){const rect=tr.ui.b.windowRectForElement(this.canvas_);return[(e.clientX-rect.x)*this.pixelRatio_,(e.clientY-rect.y)*this.pixelRatio_];},getMouseDelta_(e,p){const newP=this.getMousePosition_(e);return[newP[0]-p[0],newP[1]-p[1]];},dispatchRenderEvent_(){tr.b.dispatchSimpleEvent(this,'renderrequired',false,false);}};return{Camera,};});'use strict';tr.exportTo('tr.ui.b',function(){const THIS_DOC=document.currentScript.ownerDocument;const constants={};constants.IMAGE_LOAD_RETRY_TIME_MS=500;constants.SUBDIVISION_MINIMUM=1;constants.SUBDIVISION_RECURSION_DEPTH=3;constants.SUBDIVISION_DEPTH_THRESHOLD=100;constants.FAR_PLANE_DISTANCE=10000;function drawTexturedTriangle(ctx,img,p0,p1,p2,t0,t1,t2){const tmpP0=[p0[0],p0[1]];const tmpP1=[p1[0],p1[1]];const tmpP2=[p2[0],p2[1]];const tmpT0=[t0[0],t0[1]];const tmpT1=[t1[0],t1[1]];const tmpT2=[t2[0],t2[1]];ctx.beginPath();ctx.moveTo(tmpP0[0],tmpP0[1]);ctx.lineTo(tmpP1[0],tmpP1[1]);ctx.lineTo(tmpP2[0],tmpP2[1]);ctx.closePath();tmpP1[0]-=tmpP0[0];tmpP1[1]-=tmpP0[1];tmpP2[0]-=tmpP0[0];tmpP2[1]-=tmpP0[1];tmpT1[0]-=tmpT0[0];tmpT1[1]-=tmpT0[1];tmpT2[0]-=tmpT0[0];tmpT2[1]-=tmpT0[1];const det=1/(tmpT1[0]*tmpT2[1]-tmpT2[0]*tmpT1[1]);const a=(tmpT2[1]*tmpP1[0]-tmpT1[1]*tmpP2[0])*det;const b=(tmpT2[1]*tmpP1[1]-tmpT1[1]*tmpP2[1])*det;const c=(tmpT1[0]*tmpP2[0]-tmpT2[0]*tmpP1[0])*det;const d=(tmpT1[0]*tmpP2[1]-tmpT2[0]*tmpP1[1])*det;const e=tmpP0[0]-a*tmpT0[0]-c*tmpT0[1];const f=tmpP0[1]-b*tmpT0[0]-d*tmpT0[1];ctx.save();ctx.transform(a,b,c,d,e,f);ctx.clip();ctx.drawImage(img,0,0);ctx.restore();}
+function drawTriangleSub(ctx,img,p0,p1,p2,t0,t1,t2,opt_recursionDepth){const depth=opt_recursionDepth||0;let subdivisionIndex=0;if(depth<constants.SUBDIVISION_MINIMUM){subdivisionIndex=7;}else if(depth<constants.SUBDIVISION_RECURSION_DEPTH){if(Math.abs(p0[2]-p1[2])>constants.SUBDIVISION_DEPTH_THRESHOLD){subdivisionIndex+=1;}
+if(Math.abs(p0[2]-p2[2])>constants.SUBDIVISION_DEPTH_THRESHOLD){subdivisionIndex+=2;}
+if(Math.abs(p1[2]-p2[2])>constants.SUBDIVISION_DEPTH_THRESHOLD){subdivisionIndex+=4;}}
+const p01=vec4.create();const p02=vec4.create();const p12=vec4.create();const t01=vec2.create();const t02=vec2.create();const t12=vec2.create();for(let i=0;i<2;++i){p0[i]*=p0[2];p1[i]*=p1[2];p2[i]*=p2[2];}
+for(let i=0;i<4;++i){p01[i]=(p0[i]+p1[i])/2;p02[i]=(p0[i]+p2[i])/2;p12[i]=(p1[i]+p2[i])/2;}
+for(let i=0;i<2;++i){p0[i]/=p0[2];p1[i]/=p1[2];p2[i]/=p2[2];p01[i]/=p01[2];p02[i]/=p02[2];p12[i]/=p12[2];}
+for(let i=0;i<2;++i){t01[i]=(t0[i]+t1[i])/2;t02[i]=(t0[i]+t2[i])/2;t12[i]=(t1[i]+t2[i])/2;}
+switch(subdivisionIndex){case 1:drawTriangleSub(ctx,img,p0,p01,p2,t0,t01,t2,depth+1);drawTriangleSub(ctx,img,p01,p1,p2,t01,t1,t2,depth+1);break;case 2:drawTriangleSub(ctx,img,p0,p1,p02,t0,t1,t02,depth+1);drawTriangleSub(ctx,img,p1,p02,p2,t1,t02,t2,depth+1);break;case 3:drawTriangleSub(ctx,img,p0,p01,p02,t0,t01,t02,depth+1);drawTriangleSub(ctx,img,p02,p01,p2,t02,t01,t2,depth+1);drawTriangleSub(ctx,img,p01,p1,p2,t01,t1,t2,depth+1);break;case 4:drawTriangleSub(ctx,img,p0,p12,p2,t0,t12,t2,depth+1);drawTriangleSub(ctx,img,p0,p1,p12,t0,t1,t12,depth+1);break;case 5:drawTriangleSub(ctx,img,p0,p01,p2,t0,t01,t2,depth+1);drawTriangleSub(ctx,img,p2,p01,p12,t2,t01,t12,depth+1);drawTriangleSub(ctx,img,p01,p1,p12,t01,t1,t12,depth+1);break;case 6:drawTriangleSub(ctx,img,p0,p12,p02,t0,t12,t02,depth+1);drawTriangleSub(ctx,img,p0,p1,p12,t0,t1,t12,depth+1);drawTriangleSub(ctx,img,p02,p12,p2,t02,t12,t2,depth+1);break;case 7:drawTriangleSub(ctx,img,p0,p01,p02,t0,t01,t02,depth+1);drawTriangleSub(ctx,img,p01,p12,p02,t01,t12,t02,depth+1);drawTriangleSub(ctx,img,p01,p1,p12,t01,t1,t12,depth+1);drawTriangleSub(ctx,img,p02,p12,p2,t02,t12,t2,depth+1);break;default:drawTexturedTriangle(ctx,img,p0,p1,p2,t0,t1,t2);break;}}
+const tmpVec4=vec4.create();function transform(transformed,point,matrix,viewport){vec4.set(tmpVec4,point[0],point[1],0,1);vec4.transformMat4(tmpVec4,tmpVec4,matrix);let w=tmpVec4[3];if(w<1e-6)w=1e-6;transformed[0]=((tmpVec4[0]/w)+1)*viewport.width/2;transformed[1]=((tmpVec4[1]/w)+1)*viewport.height/2;transformed[2]=w;}
+function drawProjectedQuadBackgroundToContext(quad,p1,p2,p3,p4,ctx,quadCanvas){if(quad.imageData){quadCanvas.width=quad.imageData.width;quadCanvas.height=quad.imageData.height;quadCanvas.getContext('2d').putImageData(quad.imageData,0,0);const quadBBox=new tr.b.math.BBox2();quadBBox.addQuad(quad);const iw=quadCanvas.width;const ih=quadCanvas.height;drawTriangleSub(ctx,quadCanvas,p1,p2,p4,[0,0],[iw,0],[0,ih]);drawTriangleSub(ctx,quadCanvas,p2,p3,p4,[iw,0],[iw,ih],[0,ih]);}
+if(quad.backgroundColor){ctx.fillStyle=quad.backgroundColor;ctx.beginPath();ctx.moveTo(p1[0],p1[1]);ctx.lineTo(p2[0],p2[1]);ctx.lineTo(p3[0],p3[1]);ctx.lineTo(p4[0],p4[1]);ctx.closePath();ctx.fill();}}
+function drawProjectedQuadOutlineToContext(quad,p1,p2,p3,p4,ctx,quadCanvas){ctx.beginPath();ctx.moveTo(p1[0],p1[1]);ctx.lineTo(p2[0],p2[1]);ctx.lineTo(p3[0],p3[1]);ctx.lineTo(p4[0],p4[1]);ctx.closePath();ctx.save();if(quad.borderColor){ctx.strokeStyle=quad.borderColor;}else{ctx.strokeStyle='rgb(128,128,128)';}
+if(quad.shadowOffset){ctx.shadowColor='rgb(0, 0, 0)';ctx.shadowOffsetX=quad.shadowOffset[0];ctx.shadowOffsetY=quad.shadowOffset[1];if(quad.shadowBlur){ctx.shadowBlur=quad.shadowBlur;}}
+if(quad.borderWidth){ctx.lineWidth=quad.borderWidth;}else{ctx.lineWidth=1;}
+ctx.stroke();ctx.restore();}
+function drawProjectedQuadSelectionOutlineToContext(quad,p1,p2,p3,p4,ctx,quadCanvas){if(!quad.upperBorderColor)return;ctx.lineWidth=8;ctx.strokeStyle=quad.upperBorderColor;ctx.beginPath();ctx.moveTo(p1[0],p1[1]);ctx.lineTo(p2[0],p2[1]);ctx.lineTo(p3[0],p3[1]);ctx.lineTo(p4[0],p4[1]);ctx.closePath();ctx.stroke();}
+function drawProjectedQuadToContext(passNumber,quad,p1,p2,p3,p4,ctx,quadCanvas){if(passNumber===0){drawProjectedQuadBackgroundToContext(quad,p1,p2,p3,p4,ctx,quadCanvas);}else if(passNumber===1){drawProjectedQuadOutlineToContext(quad,p1,p2,p3,p4,ctx,quadCanvas);}else if(passNumber===2){drawProjectedQuadSelectionOutlineToContext(quad,p1,p2,p3,p4,ctx,quadCanvas);}else{throw new Error('Invalid pass number');}}
+const tmpP1=vec3.create();const tmpP2=vec3.create();const tmpP3=vec3.create();const tmpP4=vec3.create();function transformAndProcessQuads(matrix,viewport,quads,numPasses,handleQuadFunc,opt_arg1,opt_arg2){for(let passNumber=0;passNumber<numPasses;passNumber++){for(let i=0;i<quads.length;i++){const quad=quads[i];transform(tmpP1,quad.p1,matrix,viewport);transform(tmpP2,quad.p2,matrix,viewport);transform(tmpP3,quad.p3,matrix,viewport);transform(tmpP4,quad.p4,matrix,viewport);handleQuadFunc(passNumber,quad,tmpP1,tmpP2,tmpP3,tmpP4,opt_arg1,opt_arg2);}}}
+const QuadStackView=tr.ui.b.define('quad-stack-view');QuadStackView.prototype={__proto__:HTMLDivElement.prototype,decorate(){this.className='quad-stack-view';const node=tr.ui.b.instantiateTemplate('#quad-stack-view-template',THIS_DOC);Polymer.dom(this).appendChild(node);this.updateHeaderVisibility_();this.canvas_=Polymer.dom(this).querySelector('#canvas');this.chromeImages_={left:Polymer.dom(this).querySelector('#chrome-left'),mid:Polymer.dom(this).querySelector('#chrome-mid'),right:Polymer.dom(this).querySelector('#chrome-right')};const stackingDistanceSlider=Polymer.dom(this).querySelector('#stacking-distance-slider');stackingDistanceSlider.value=tr.b.Settings.get('quadStackView.stackingDistance',45);stackingDistanceSlider.addEventListener('change',this.onStackingDistanceChange_.bind(this));stackingDistanceSlider.addEventListener('input',this.onStackingDistanceChange_.bind(this));this.trackMouse_();this.camera_=new tr.ui.b.Camera(this.mouseModeSelector_);this.camera_.addEventListener('renderrequired',this.onRenderRequired_.bind(this));this.cameraWasReset_=false;this.camera_.canvas=this.canvas_;this.viewportRect_=tr.b.math.Rect.fromXYWH(0,0,0,0);this.pixelRatio_=window.devicePixelRatio||1;},updateHeaderVisibility_(){if(this.headerText){Polymer.dom(this).querySelector('#header').style.display='';}else{Polymer.dom(this).querySelector('#header').style.display='none';}},get headerText(){return Polymer.dom(this).querySelector('#header').textContent;},set headerText(headerText){Polymer.dom(this).querySelector('#header').textContent=headerText;this.updateHeaderVisibility_();},onStackingDistanceChange_(e){tr.b.Settings.set('quadStackView.stackingDistance',this.stackingDistance);this.scheduleRender();e.stopPropagation();},get stackingDistance(){return Polymer.dom(this).querySelector('#stacking-distance-slider').value;},get mouseModeSelector(){return this.mouseModeSelector_;},get camera(){return this.camera_;},set quads(q){this.quads_=q;this.scheduleRender();},set deviceRect(rect){if(!rect||rect.equalTo(this.deviceRect_))return;this.deviceRect_=rect;this.camera_.deviceRect=rect;this.chromeQuad_=undefined;},resize(){if(!this.offsetParent)return true;const width=parseInt(window.getComputedStyle(this.offsetParent).width);const height=parseInt(window.getComputedStyle(this.offsetParent).height);const rect=tr.b.math.Rect.fromXYWH(0,0,width,height);if(rect.equalTo(this.viewportRect_))return false;this.viewportRect_=rect;this.style.width=width+'px';this.style.height=height+'px';this.canvas_.style.width=width+'px';this.canvas_.style.height=height+'px';this.canvas_.width=this.pixelRatio_*width;this.canvas_.height=this.pixelRatio_*height;if(!this.cameraWasReset_){this.camera_.resetCamera();this.cameraWasReset_=true;}
+return true;},readyToDraw(){if(!this.chromeImages_.left.src){let leftContent=window.getComputedStyle(this.chromeImages_.left).backgroundImage;leftContent=tr.ui.b.extractUrlString(leftContent);let midContent=window.getComputedStyle(this.chromeImages_.mid).backgroundImage;midContent=tr.ui.b.extractUrlString(midContent);let rightContent=window.getComputedStyle(this.chromeImages_.right).backgroundImage;rightContent=tr.ui.b.extractUrlString(rightContent);this.chromeImages_.left.src=leftContent;this.chromeImages_.mid.src=midContent;this.chromeImages_.right.src=rightContent;}
+return(this.chromeImages_.left.height>0)&&(this.chromeImages_.mid.height>0)&&(this.chromeImages_.right.height>0);},get chromeQuad(){if(this.chromeQuad_)return this.chromeQuad_;const chromeCanvas=document.createElement('canvas');const offsetY=this.chromeImages_.left.height;chromeCanvas.width=this.deviceRect_.width;chromeCanvas.height=this.deviceRect_.height+offsetY;const leftWidth=this.chromeImages_.left.width;const midWidth=this.chromeImages_.mid.width;const rightWidth=this.chromeImages_.right.width;const chromeCtx=chromeCanvas.getContext('2d');chromeCtx.drawImage(this.chromeImages_.left,0,0);chromeCtx.save();chromeCtx.translate(leftWidth,0);const s=(this.deviceRect_.width-leftWidth-rightWidth)/midWidth;chromeCtx.scale(s,1);chromeCtx.drawImage(this.chromeImages_.mid,0,0);chromeCtx.restore();chromeCtx.drawImage(this.chromeImages_.right,leftWidth+s*midWidth,0);const chromeRect=tr.b.math.Rect.fromXYWH(this.deviceRect_.x,this.deviceRect_.y-offsetY,this.deviceRect_.width,this.deviceRect_.height+offsetY);const chromeQuad=tr.b.math.Quad.fromRect(chromeRect);chromeQuad.stackingGroupId=this.maxStackingGroupId_+1;chromeQuad.imageData=chromeCtx.getImageData(0,0,chromeCanvas.width,chromeCanvas.height);chromeQuad.shadowOffset=[0,0];chromeQuad.shadowBlur=5;chromeQuad.borderWidth=3;this.chromeQuad_=chromeQuad;return this.chromeQuad_;},scheduleRender(){if(this.redrawScheduled_)return false;this.redrawScheduled_=true;tr.b.requestAnimationFrame(this.render,this);},onRenderRequired_(e){this.scheduleRender();},stackTransformAndProcessQuads_(numPasses,handleQuadFunc,includeChromeQuad,opt_arg1,opt_arg2){const mv=this.camera_.modelViewMatrix;const p=this.camera_.projectionMatrix;const viewport=tr.b.math.Rect.fromXYWH(0,0,this.canvas_.width,this.canvas_.height);const quadStacks=[];for(let i=0;i<this.quads_.length;++i){const quad=this.quads_[i];const stackingId=quad.stackingGroupId||0;while(stackingId>=quadStacks.length){quadStacks.push([]);}
+quadStacks[stackingId].push(quad);}
+const mvp=mat4.create();this.maxStackingGroupId_=quadStacks.length;const effectiveStackingDistance=this.stackingDistance*this.camera_.stackingDistanceDampening;mat4.multiply(mvp,p,mv);for(let i=0;i<quadStacks.length;++i){transformAndProcessQuads(mvp,viewport,quadStacks[i],numPasses,handleQuadFunc,opt_arg1,opt_arg2);mat4.translate(mv,mv,[0,0,effectiveStackingDistance]);mat4.multiply(mvp,p,mv);}
+if(includeChromeQuad&&this.deviceRect_){transformAndProcessQuads(mvp,viewport,[this.chromeQuad],numPasses,drawProjectedQuadToContext,opt_arg1,opt_arg2);}},render(){this.redrawScheduled_=false;if(!this.readyToDraw()){setTimeout(this.scheduleRender.bind(this),constants.IMAGE_LOAD_RETRY_TIME_MS);return;}
+if(!this.quads_)return;const canvasCtx=this.canvas_.getContext('2d');if(!this.resize()){canvasCtx.clearRect(0,0,this.canvas_.width,this.canvas_.height);}
+const quadCanvas=document.createElement('canvas');this.stackTransformAndProcessQuads_(3,drawProjectedQuadToContext,true,canvasCtx,quadCanvas);quadCanvas.width=0;},trackMouse_(){this.mouseModeSelector_=document.createElement('tr-ui-b-mouse-mode-selector');this.mouseModeSelector_.targetElement=this.canvas_;this.mouseModeSelector_.supportedModeMask=tr.ui.b.MOUSE_SELECTOR_MODE.SELECTION|tr.ui.b.MOUSE_SELECTOR_MODE.PANSCAN|tr.ui.b.MOUSE_SELECTOR_MODE.ZOOM|tr.ui.b.MOUSE_SELECTOR_MODE.ROTATE;this.mouseModeSelector_.mode=tr.ui.b.MOUSE_SELECTOR_MODE.PANSCAN;this.mouseModeSelector_.pos={x:0,y:100};Polymer.dom(this).appendChild(this.mouseModeSelector_);this.mouseModeSelector_.settingsKey='quadStackView.mouseModeSelector';this.mouseModeSelector_.setModifierForAlternateMode(tr.ui.b.MOUSE_SELECTOR_MODE.ROTATE,tr.ui.b.MODIFIER.SHIFT);this.mouseModeSelector_.setModifierForAlternateMode(tr.ui.b.MOUSE_SELECTOR_MODE.PANSCAN,tr.ui.b.MODIFIER.SPACE);this.mouseModeSelector_.setModifierForAlternateMode(tr.ui.b.MOUSE_SELECTOR_MODE.ZOOM,tr.ui.b.MODIFIER.CMD_OR_CTRL);this.mouseModeSelector_.addEventListener('updateselection',this.onSelectionUpdate_.bind(this));this.mouseModeSelector_.addEventListener('endselection',this.onSelectionUpdate_.bind(this));},extractRelativeMousePosition_(e){const br=this.canvas_.getBoundingClientRect();return[this.pixelRatio_*(e.clientX-this.canvas_.offsetLeft-br.left),this.pixelRatio_*(e.clientY-this.canvas_.offsetTop-br.top)];},onSelectionUpdate_(e){const mousePos=this.extractRelativeMousePosition_(e);const res=[];function handleQuad(passNumber,quad,p1,p2,p3,p4){if(tr.b.math.pointInImplicitQuad(mousePos,p1,p2,p3,p4)){res.push(quad);}}
+this.stackTransformAndProcessQuads_(1,handleQuad,false);e=new tr.b.Event('selectionchange');e.quads=res;this.dispatchEvent(e);}};return{QuadStackView,};});'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){const ColorScheme=tr.b.ColorScheme;const THIS_DOC=document.currentScript.ownerDocument;const TILE_HEATMAP_TYPE={};TILE_HEATMAP_TYPE.NONE='none';TILE_HEATMAP_TYPE.SCHEDULED_PRIORITY='scheduledPriority';TILE_HEATMAP_TYPE.USING_GPU_MEMORY='usingGpuMemory';const cc=tr.ui.e.chrome.cc;function createTileRectsSelectorBaseOptions(){return[{label:'None',value:'none'},{label:'Coverage Rects',value:'coverage'}];}
+const LayerTreeQuadStackView=tr.ui.b.define('tr-ui-e-chrome-cc-layer-tree-quad-stack-view');LayerTreeQuadStackView.prototype={__proto__:HTMLDivElement.prototype,decorate(){this.isRenderPassQuads_=false;this.pictureAsImageData_={};this.messages_=[];this.controls_=document.createElement('top-controls');this.infoBar_=document.createElement('tr-ui-b-info-bar');this.quadStackView_=new tr.ui.b.QuadStackView();this.quadStackView_.addEventListener('selectionchange',this.onQuadStackViewSelectionChange_.bind(this));this.extraHighlightsByLayerId_=undefined;this.inputEventImageData_=undefined;const m=tr.ui.b.MOUSE_SELECTOR_MODE;const mms=this.quadStackView_.mouseModeSelector;mms.settingsKey='tr.e.cc.layerTreeQuadStackView.mouseModeSelector';mms.setKeyCodeForMode(m.SELECTION,'Z'.charCodeAt(0));mms.setKeyCodeForMode(m.PANSCAN,'X'.charCodeAt(0));mms.setKeyCodeForMode(m.ZOOM,'C'.charCodeAt(0));mms.setKeyCodeForMode(m.ROTATE,'V'.charCodeAt(0));const node=tr.ui.b.instantiateTemplate('#tr-ui-e-chrome-cc-layer-tree-quad-stack-view-template',THIS_DOC);Polymer.dom(this).appendChild(node);Polymer.dom(this).appendChild(this.controls_);Polymer.dom(this).appendChild(this.infoBar_);Polymer.dom(this).appendChild(this.quadStackView_);this.tileRectsSelector_=tr.ui.b.createSelector(this,'howToShowTiles','layerView.howToShowTiles','none',createTileRectsSelectorBaseOptions());Polymer.dom(this.controls_).appendChild(this.tileRectsSelector_);const tileHeatmapText=tr.ui.b.createSpan({textContent:'Tile heatmap:'});Polymer.dom(this.controls_).appendChild(tileHeatmapText);const tileHeatmapSelector=tr.ui.b.createSelector(this,'tileHeatmapType','layerView.tileHeatmapType',TILE_HEATMAP_TYPE.NONE,[{label:'None',value:TILE_HEATMAP_TYPE.NONE},{label:'Scheduled Priority',value:TILE_HEATMAP_TYPE.SCHEDULED_PRIORITY},{label:'Is using GPU memory',value:TILE_HEATMAP_TYPE.USING_GPU_MEMORY}]);Polymer.dom(this.controls_).appendChild(tileHeatmapSelector);const showOtherLayersCheckbox=tr.ui.b.createCheckBox(this,'showOtherLayers','layerView.showOtherLayers',true,'Other layers/passes');showOtherLayersCheckbox.title='When checked, show all layers, selected or not.';Polymer.dom(this.controls_).appendChild(showOtherLayersCheckbox);const showInvalidationsCheckbox=tr.ui.b.createCheckBox(this,'showInvalidations','layerView.showInvalidations',true,'Invalidations');showInvalidationsCheckbox.title='When checked, compositing invalidations are highlighted in red';Polymer.dom(this.controls_).appendChild(showInvalidationsCheckbox);const showUnrecordedRegionCheckbox=tr.ui.b.createCheckBox(this,'showUnrecordedRegion','layerView.showUnrecordedRegion',true,'Unrecorded area');showUnrecordedRegionCheckbox.title='When checked, unrecorded areas are highlighted in yellow';Polymer.dom(this.controls_).appendChild(showUnrecordedRegionCheckbox);const showBottlenecksCheckbox=tr.ui.b.createCheckBox(this,'showBottlenecks','layerView.showBottlenecks',true,'Bottlenecks');showBottlenecksCheckbox.title='When checked, scroll bottlenecks are highlighted';Polymer.dom(this.controls_).appendChild(showBottlenecksCheckbox);const showLayoutRectsCheckbox=tr.ui.b.createCheckBox(this,'showLayoutRects','layerView.showLayoutRects',false,'Layout rects');showLayoutRectsCheckbox.title='When checked, shows rects for regions where layout happened';Polymer.dom(this.controls_).appendChild(showLayoutRectsCheckbox);const showContentsCheckbox=tr.ui.b.createCheckBox(this,'showContents','layerView.showContents',true,'Contents');showContentsCheckbox.title='When checked, show the rendered contents inside the layer outlines';Polymer.dom(this.controls_).appendChild(showContentsCheckbox);const showAnimationBoundsCheckbox=tr.ui.b.createCheckBox(this,'showAnimationBounds','layerView.showAnimationBounds',false,'Animation Bounds');showAnimationBoundsCheckbox.title='When checked, show a border around'+' a layer showing the extent of its animation.';Polymer.dom(this.controls_).appendChild(showAnimationBoundsCheckbox);const showInputEventsCheckbox=tr.ui.b.createCheckBox(this,'showInputEvents','layerView.showInputEvents',true,'Input events');showInputEventsCheckbox.title='When checked, input events are '+'displayed as circles.';Polymer.dom(this.controls_).appendChild(showInputEventsCheckbox);this.whatRasterizedLink_=document.createElement('a');Polymer.dom(this.whatRasterizedLink_).classList.add('what-rasterized');Polymer.dom(this.whatRasterizedLink_).textContent='What rasterized?';this.whatRasterizedLink_.addEventListener('click',this.onWhatRasterizedLinkClicked_.bind(this));Polymer.dom(this).appendChild(this.whatRasterizedLink_);},get layerTreeImpl(){return this.layerTreeImpl_;},set isRenderPassQuads(newValue){this.isRenderPassQuads_=newValue;},set layerTreeImpl(layerTreeImpl){if(this.layerTreeImpl_===layerTreeImpl)return;this.layerTreeImpl_=layerTreeImpl;this.selection=undefined;},get extraHighlightsByLayerId(){return this.extraHighlightsByLayerId_;},set extraHighlightsByLayerId(extraHighlightsByLayerId){this.extraHighlightsByLayerId_=extraHighlightsByLayerId;this.scheduleUpdateContents_();},get showOtherLayers(){return this.showOtherLayers_;},set showOtherLayers(show){this.showOtherLayers_=show;this.updateContents_();},get showAnimationBounds(){return this.showAnimationBounds_;},set showAnimationBounds(show){this.showAnimationBounds_=show;this.updateContents_();},get showInputEvents(){return this.showInputEvents_;},set showInputEvents(show){this.showInputEvents_=show;this.updateContents_();},get showContents(){return this.showContents_;},set showContents(show){this.showContents_=show;this.updateContents_();},get showInvalidations(){return this.showInvalidations_;},set showInvalidations(show){this.showInvalidations_=show;this.updateContents_();},get showUnrecordedRegion(){return this.showUnrecordedRegion_;},set showUnrecordedRegion(show){this.showUnrecordedRegion_=show;this.updateContents_();},get showBottlenecks(){return this.showBottlenecks_;},set showBottlenecks(show){this.showBottlenecks_=show;this.updateContents_();},get showLayoutRects(){return this.showLayoutRects_;},set showLayoutRects(show){this.showLayoutRects_=show;this.updateContents_();},get howToShowTiles(){return this.howToShowTiles_;},set howToShowTiles(val){if(val!=='none'&&val!=='coverage'&&isNaN(parseFloat(val))){throw new Error('howToShowTiles requires "none" or "coverage" or a number');}
+this.howToShowTiles_=val;this.updateContents_();},get tileHeatmapType(){return this.tileHeatmapType_;},set tileHeatmapType(val){this.tileHeatmapType_=val;this.updateContents_();},get selection(){return this.selection_;},set selection(selection){if(this.selection===selection)return;this.selection_=selection;tr.b.dispatchSimpleEvent(this,'selection-change');this.updateContents_();},regenerateContent(){this.updateTilesSelector_();this.updateContents_();},loadDataForImageElement_(image,callback){const imageContent=window.getComputedStyle(image).backgroundImage;image.src=tr.ui.b.extractUrlString(imageContent);image.onload=function(){const canvas=document.createElement('canvas');const ctx=canvas.getContext('2d');canvas.width=image.width;canvas.height=image.height;ctx.drawImage(image,0,0);const imageData=ctx.getImageData(0,0,canvas.width,canvas.height);callback(imageData);};},onQuadStackViewSelectionChange_(e){const selectableQuads=e.quads.filter(function(q){return q.selectionToSetIfClicked!==undefined;});if(selectableQuads.length===0){this.selection=undefined;return;}
+selectableQuads.sort(function(x,y){const z=x.stackingGroupId-y.stackingGroupId;if(z!==0)return z;return x.selectionToSetIfClicked.specicifity-
+y.selectionToSetIfClicked.specicifity;});const quadToSelect=selectableQuads[selectableQuads.length-1];this.selection=quadToSelect.selectionToSetIfClicked;},scheduleUpdateContents_(){if(this.updateContentsPending_)return;this.updateContentsPending_=true;tr.b.requestAnimationFrameInThisFrameIfPossible(this.updateContents_,this);},updateContents_(){if(!this.layerTreeImpl_){this.quadStackView_.headerText='No tree';this.quadStackView_.quads=[];return;}
+const status=this.computePictureLoadingStatus_();if(!status.picturesComplete)return;const lthi=this.layerTreeImpl_.layerTreeHostImpl;const lthiInstance=lthi.objectInstance;const worldViewportRect=tr.b.math.Rect.fromXYWH(0,0,lthi.deviceViewportSize.width,lthi.deviceViewportSize.height);this.quadStackView_.deviceRect=worldViewportRect;if(this.isRenderPassQuads_){this.quadStackView_.quads=this.generateRenderPassQuads();}else{this.quadStackView_.quads=this.generateLayerQuads();}
+this.updateWhatRasterizedLinkState_();let message='';if(lthi.tilesHaveGpuMemoryUsageInfo){const thisTreeUsageInBytes=this.layerTreeImpl_.gpuMemoryUsageInBytes;const otherTreeUsageInBytes=lthi.gpuMemoryUsageInBytes-
+thisTreeUsageInBytes;message+=tr.b.convertUnit(thisTreeUsageInBytes,tr.b.UnitPrefixScale.BINARY.NONE,tr.b.UnitPrefixScale.BINARY.MEBI).toFixed(1)+' MiB on this tree';if(otherTreeUsageInBytes){message+=', '+
+tr.b.convertUnit(otherTreeUsageInBytes,tr.b.UnitPrefixScale.BINARY.NONE,tr.b.UnitPrefixScale.BINARY.MEBI).toFixed(1)+' MiB on the other tree';}}else{if(this.layerTreeImpl_){const thisTreeUsageInBytes=this.layerTreeImpl_.gpuMemoryUsageInBytes;message+=tr.b.convertUnit(thisTreeUsageInBytes,tr.b.UnitPrefixScale.BINARY.NONE,tr.b.UnitPrefixScale.BINARY.MEBI).toFixed(1)+' MiB on this tree';if(this.layerTreeImpl_.otherTree){message+=', ??? MiB on other tree. ';}}}
+if(lthi.args.tileManagerBasicState){const tmgs=lthi.args.tileManagerBasicState.globalState;message+=' (softMax='+
+tr.b.convertUnit(tmgs.softMemoryLimitInBytes,tr.b.UnitPrefixScale.BINARY.NONE,tr.b.UnitPrefixScale.BINARY.MEBI).toFixed(1)+' MiB, hardMax='+
+tr.b.convertUnit(tmgs.hardMemoryLimitInBytes,tr.b.UnitPrefixScale.BINARY.NONE,tr.b.UnitPrefixScale.BINARY.MEBI).toFixed(1)+' MiB, '+
+tmgs.memoryLimitPolicy+')';}else{const thread=lthi.snapshottedOnThread;const didManageTilesSlices=thread.sliceGroup.slices.filter(s=>{if(s.category!=='tr.e.cc')return false;if(s.title!=='DidManage')return false;if(s.end>lthi.ts)return false;return true;});didManageTilesSlices.sort(function(x,y){return x.end-y.end;});if(didManageTilesSlices.length>0){const newest=didManageTilesSlices[didManageTilesSlices.length-1];const tmgs=newest.args.state.global_state;message+=' (softMax='+
+tr.b.convertUnit(tmgs.softMemoryLimitInBytes,tr.b.UnitPrefixScale.BINARY.NONE,tr.b.UnitPrefixScale.BINARY.MEBI).toFixed(1)+' MiB, hardMax='+
+tr.b.convertUnit(tmgs.hardMemoryLimitInBytes,tr.b.UnitPrefixScale.BINARY.NONE,tr.b.UnitPrefixScale.BINARY.MEBI).toFixed(1)+' MiB, '+
+tmgs.memoryLimitPolicy+')';}}
+if(this.layerTreeImpl_.otherTree){message+=' (Another tree exists)';}
+if(message.length){this.quadStackView_.headerText=message;}else{this.quadStackView_.headerText=undefined;}
+this.updateInfoBar_(status.messages);},updateTilesSelector_(){const data=createTileRectsSelectorBaseOptions();if(this.layerTreeImpl_){const lthi=this.layerTreeImpl_.layerTreeHostImpl;const scaleNames=lthi.getContentsScaleNames();for(const scale in scaleNames){data.push({label:'Scale '+scale+' ('+scaleNames[scale]+')',value:scale});}}
+const newSelector=tr.ui.b.createSelector(this,'howToShowTiles','layerView.howToShowTiles','none',data);this.controls_.replaceChild(newSelector,this.tileRectsSelector_);this.tileRectsSelector_=newSelector;},computePictureLoadingStatus_(){const layers=this.layers;const status={messages:[],picturesComplete:true};if(this.showContents){let hasPendingRasterizeImage=false;let firstPictureError=undefined;let hasMissingLayerRect=false;let hasUnresolvedPictureRef=false;for(let i=0;i<layers.length;i++){const layer=layers[i];for(let ir=0;ir<layer.pictures.length;++ir){const picture=layer.pictures[ir];if(picture.idRef){hasUnresolvedPictureRef=true;continue;}
+if(!picture.layerRect){hasMissingLayerRect=true;continue;}
+const pictureAsImageData=this.pictureAsImageData_[picture.guid];if(!pictureAsImageData){hasPendingRasterizeImage=true;this.pictureAsImageData_[picture.guid]=tr.e.cc.PictureAsImageData.Pending(this);picture.rasterize({stopIndex:undefined},function(pictureImageData){const picture_=pictureImageData.picture;this.pictureAsImageData_[picture_.guid]=pictureImageData;this.scheduleUpdateContents_();}.bind(this));continue;}
+if(pictureAsImageData.isPending()){hasPendingRasterizeImage=true;continue;}
+if(pictureAsImageData.error){if(!firstPictureError){firstPictureError=pictureAsImageData.error;}
+break;}}}
+if(hasPendingRasterizeImage){status.picturesComplete=false;}else{if(hasUnresolvedPictureRef){status.messages.push({header:'Missing picture',details:'Your trace didn\'t have pictures for every layer. '+'Old chrome versions had this problem'});}
+if(hasMissingLayerRect){status.messages.push({header:'Missing layer rect',details:'Your trace may be corrupt or from a very old '+'Chrome revision.'});}
+if(firstPictureError){status.messages.push({header:'Cannot rasterize',details:firstPictureError});}}}
+if(this.showInputEvents&&this.layerTreeImpl.tracedInputLatencies&&this.inputEventImageData_===undefined){const image=Polymer.dom(this).querySelector('#input-event');if(!image.src){this.loadDataForImageElement_(image,function(imageData){this.inputEventImageData_=imageData;this.updateContentsPending_=false;this.scheduleUpdateContents_();}.bind(this));}
+status.picturesComplete=false;}
+return status;},get selectedRenderPass(){if(this.selection){return this.selection.renderPass_;}},get selectedLayer(){if(this.selection){const selectedLayerId=this.selection.associatedLayerId;return this.layerTreeImpl_.findLayerWithId(selectedLayerId);}},get renderPasses(){let renderPasses=this.layerTreeImpl.layerTreeHostImpl.args.frame.renderPasses;if(!this.showOtherLayers){const selectedRenderPass=this.selectedRenderPass;if(selectedRenderPass){renderPasses=[selectedRenderPass];}}
+return renderPasses;},get layers(){let layers=this.layerTreeImpl.renderSurfaceLayerList;if(!this.showOtherLayers){const selectedLayer=this.selectedLayer;if(selectedLayer){layers=[selectedLayer];}}
+return layers;},appendImageQuads_(quads,layer,layerQuad){for(let ir=0;ir<layer.pictures.length;++ir){const picture=layer.pictures[ir];if(!picture.layerRect)continue;const unitRect=picture.layerRect.asUVRectInside(layer.bounds);const iq=layerQuad.projectUnitRect(unitRect);const pictureData=this.pictureAsImageData_[picture.guid];if(this.showContents&&pictureData&&pictureData.imageData){iq.imageData=pictureData.imageData;iq.borderColor='rgba(0,0,0,0)';}else{iq.imageData=undefined;}
+iq.stackingGroupId=layerQuad.stackingGroupId;quads.push(iq);}},appendAnimationQuads_(quads,layer,layerQuad){if(!layer.animationBoundsRect)return;const rect=layer.animationBoundsRect;const abq=tr.b.math.Quad.fromRect(rect);abq.backgroundColor='rgba(164,191,48,0.5)';abq.borderColor='rgba(205,255,0,0.75)';abq.borderWidth=3.0;abq.stackingGroupId=layerQuad.stackingGroupId;abq.selectionToSetIfClicked=new cc.AnimationRectSelection(layer,rect);quads.push(abq);},appendInvalidationQuads_(quads,layer,layerQuad){if(layer.layerTreeImpl.hasSourceFrameBeenDrawnBefore)return;for(let ir=0;ir<layer.annotatedInvalidation.rects.length;ir++){const rect=layer.annotatedInvalidation.rects[ir];const unitRect=rect.asUVRectInside(layer.bounds);const iq=layerQuad.projectUnitRect(unitRect);iq.backgroundColor='rgba(0, 255, 0, 0.1)';if(rect.reason==='renderer insertion'){iq.backgroundColor='rgba(0, 255, 128, 0.1)';}
+iq.borderColor='rgba(0, 255, 0, 1)';iq.stackingGroupId=layerQuad.stackingGroupId;iq.selectionToSetIfClicked=new cc.LayerRectSelection(layer,'Invalidation rect ('+rect.reason+')',rect,rect);quads.push(iq);}
+if(layer.annotatedInvalidation.rects.length===0){for(let ir=0;ir<layer.invalidation.rects.length;ir++){const rect=layer.invalidation.rects[ir];const unitRect=rect.asUVRectInside(layer.bounds);const iq=layerQuad.projectUnitRect(unitRect);iq.backgroundColor='rgba(0, 255, 0, 0.1)';iq.borderColor='rgba(0, 255, 0, 1)';iq.stackingGroupId=layerQuad.stackingGroupId;iq.selectionToSetIfClicked=new cc.LayerRectSelection(layer,'Invalidation rect',rect,rect);quads.push(iq);}}},appendUnrecordedRegionQuads_(quads,layer,layerQuad){for(let ir=0;ir<layer.unrecordedRegion.rects.length;ir++){const rect=layer.unrecordedRegion.rects[ir];const unitRect=rect.asUVRectInside(layer.bounds);const iq=layerQuad.projectUnitRect(unitRect);iq.backgroundColor='rgba(240, 230, 140, 0.3)';iq.borderColor='rgba(240, 230, 140, 1)';iq.stackingGroupId=layerQuad.stackingGroupId;iq.selectionToSetIfClicked=new cc.LayerRectSelection(layer,'Unrecorded area',rect,rect);quads.push(iq);}},appendBottleneckQuads_(quads,layer,layerQuad,stackingGroupId){function processRegion(region,label,borderColor){const backgroundColor=borderColor.clone();backgroundColor.a=0.4*(borderColor.a||1.0);if(!region||!region.rects)return;for(let ir=0;ir<region.rects.length;ir++){const rect=region.rects[ir];const unitRect=rect.asUVRectInside(layer.bounds);const iq=layerQuad.projectUnitRect(unitRect);iq.backgroundColor=backgroundColor.toString();iq.borderColor=borderColor.toString();iq.borderWidth=4.0;iq.stackingGroupId=stackingGroupId;iq.selectionToSetIfClicked=new cc.LayerRectSelection(layer,label,rect,rect);quads.push(iq);}}
+processRegion(layer.touchEventHandlerRegion,'Touch listener',tr.b.Color.fromString('rgb(228, 226, 27)'));processRegion(layer.wheelEventHandlerRegion,'Wheel listener',tr.b.Color.fromString('rgb(176, 205, 29)'));processRegion(layer.nonFastScrollableRegion,'Repaints on scroll',tr.b.Color.fromString('rgb(213, 134, 32)'));},appendTileCoverageRectQuads_(quads,layer,layerQuad,heatmapType){if(!layer.tileCoverageRects)return;const tiles=[];for(let ct=0;ct<layer.tileCoverageRects.length;++ct){const tile=layer.tileCoverageRects[ct].tile;if(tile!==undefined)tiles.push(tile);}
+const lthi=this.layerTreeImpl_.layerTreeHostImpl;const minMax=this.getMinMaxForHeatmap_(lthi.activeTiles,heatmapType);const heatmapResult=this.computeHeatmapColors_(tiles,minMax,heatmapType);let heatIndex=0;for(let ct=0;ct<layer.tileCoverageRects.length;++ct){let rect=layer.tileCoverageRects[ct].geometryRect;rect=rect.scale(1.0/layer.geometryContentsScale);const tile=layer.tileCoverageRects[ct].tile;const unitRect=rect.asUVRectInside(layer.bounds);const quad=layerQuad.projectUnitRect(unitRect);quad.backgroundColor='rgba(0, 0, 0, 0)';quad.stackingGroupId=layerQuad.stackingGroupId;let type=tr.e.cc.tileTypes.missing;if(tile){type=tile.getTypeForLayer(layer);quad.backgroundColor=heatmapResult[heatIndex].color;++heatIndex;}
+quad.borderColor=tr.e.cc.tileBorder[type].color;quad.borderWidth=tr.e.cc.tileBorder[type].width;let label;if(tile){label='coverageRect';}else{label='checkerboard coverageRect';}
+quad.selectionToSetIfClicked=new cc.LayerRectSelection(layer,label,rect,layer.tileCoverageRects[ct]);quads.push(quad);}},appendLayoutRectQuads_(quads,layer,layerQuad){if(!layer.layoutRects){return;}
+for(let ct=0;ct<layer.layoutRects.length;++ct){let rect=layer.layoutRects[ct].geometryRect;rect=rect.scale(1.0/layer.geometryContentsScale);const unitRect=rect.asUVRectInside(layer.bounds);const quad=layerQuad.projectUnitRect(unitRect);quad.backgroundColor='rgba(0, 0, 0, 0)';quad.stackingGroupId=layerQuad.stackingGroupId;quad.borderColor='rgba(0, 0, 200, 0.7)';quad.borderWidth=2;const label='Layout rect';quad.selectionToSetIfClicked=new cc.LayerRectSelection(layer,label,rect);quads.push(quad);}},getValueForHeatmap_(tile,heatmapType){if(heatmapType===TILE_HEATMAP_TYPE.SCHEDULED_PRIORITY){return tile.scheduledPriority===0?undefined:tile.scheduledPriority;}else if(heatmapType===TILE_HEATMAP_TYPE.USING_GPU_MEMORY){if(tile.isSolidColor)return 0.5;return tile.isUsingGpuMemory?0:1;}},getMinMaxForHeatmap_(tiles,heatmapType){const range=new tr.b.math.Range();if(heatmapType===TILE_HEATMAP_TYPE.USING_GPU_MEMORY){range.addValue(0);range.addValue(1);return range;}
+for(let i=0;i<tiles.length;++i){const value=this.getValueForHeatmap_(tiles[i],heatmapType);if(value===undefined)continue;range.addValue(value);}
+if(range.range===0){range.addValue(1);}
+return range;},computeHeatmapColors_(tiles,minMax,heatmapType){const min=minMax.min;const max=minMax.max;const color=function(value){let hue=120*(1-(value-min)/(max-min));if(hue<0)hue=0;return'hsla('+hue+', 100%, 50%, 0.5)';};const values=[];for(let i=0;i<tiles.length;++i){const tile=tiles[i];const value=this.getValueForHeatmap_(tile,heatmapType);const res={value,color:value!==undefined?color(value):undefined};values.push(res);}
+return values;},appendTilesWithScaleQuads_(quads,layer,layerQuad,scale,heatmapType){const lthi=this.layerTreeImpl_.layerTreeHostImpl;const tiles=[];for(let i=0;i<lthi.activeTiles.length;++i){const tile=lthi.activeTiles[i];if(Math.abs(tile.contentsScale-scale)>1e-6){continue;}
+if(layer.layerId!==tile.layerId)continue;tiles.push(tile);}
+const minMax=this.getMinMaxForHeatmap_(lthi.activeTiles,heatmapType);const heatmapResult=this.computeHeatmapColors_(tiles,minMax,heatmapType);for(let i=0;i<tiles.length;++i){const tile=tiles[i];const rect=tile.layerRect;if(!tile.layerRect)continue;const unitRect=rect.asUVRectInside(layer.bounds);const quad=layerQuad.projectUnitRect(unitRect);quad.backgroundColor='rgba(0, 0, 0, 0)';quad.stackingGroupId=layerQuad.stackingGroupId;const type=tile.getTypeForLayer(layer);quad.borderColor=tr.e.cc.tileBorder[type].color;quad.borderWidth=tr.e.cc.tileBorder[type].width;quad.backgroundColor=heatmapResult[i].color;const data={tileType:type};if(heatmapType!==TILE_HEATMAP_TYPE.NONE){data[heatmapType]=heatmapResult[i].value;}
+quad.selectionToSetIfClicked=new cc.TileSelection(tile,data);quads.push(quad);}},appendHighlightQuadsForLayer_(quads,layer,layerQuad,highlights){highlights.forEach(function(highlight){const rect=highlight.rect;const unitRect=rect.asUVRectInside(layer.bounds);const quad=layerQuad.projectUnitRect(unitRect);let colorId=ColorScheme.getColorIdForGeneralPurposeString(highlight.colorKey);const offset=ColorScheme.properties.brightenedOffsets[0];colorId=ColorScheme.getVariantColorId(colorId,offset);const color=ColorScheme.colors[colorId];const quadForDrawing=quad.clone();quadForDrawing.backgroundColor=color.withAlpha(0.5).toString();quadForDrawing.borderColor=color.withAlpha(1.0).darken().toString();quadForDrawing.stackingGroupId=layerQuad.stackingGroupId;quads.push(quadForDrawing);},this);},generateRenderPassQuads(){if(!this.layerTreeImpl.layerTreeHostImpl.args.frame)return[];const renderPasses=this.renderPasses;if(!renderPasses)return[];const quads=[];for(let i=0;i<renderPasses.length;++i){const quadList=renderPasses[i].quadList;for(let j=0;j<quadList.length;++j){const drawQuad=quadList[j];const quad=drawQuad.rectAsTargetSpaceQuad.clone();quad.borderColor='rgb(170, 204, 238)';quad.borderWidth=2;quad.stackingGroupId=i;quads.push(quad);}}
+return quads;},generateLayerQuads(){this.updateContentsPending_=false;const layers=this.layers;const quads=[];let nextStackingGroupId=0;const alreadyVisitedLayerIds={};let selectionHighlightsByLayerId;if(this.selection){selectionHighlightsByLayerId=this.selection.highlightsByLayerId;}else{selectionHighlightsByLayerId={};}
+const extraHighlightsByLayerId=this.extraHighlightsByLayerId||{};for(let i=1;i<=layers.length;i++){const layer=layers[layers.length-i];alreadyVisitedLayerIds[layer.layerId]=true;if(layer.objectInstance.name==='cc::NinePatchLayerImpl'){continue;}
+const layerQuad=layer.layerQuad.clone();if(layer.usingGpuRasterization){const pixelRatio=window.devicePixelRatio||1;layerQuad.borderWidth=2.0*pixelRatio;layerQuad.borderColor='rgba(154,205,50,0.75)';}else{layerQuad.borderColor='rgba(0,0,0,0.75)';}
+layerQuad.stackingGroupId=nextStackingGroupId++;layerQuad.selectionToSetIfClicked=new cc.LayerSelection(layer);layerQuad.layer=layer;if(this.showOtherLayers&&this.selectedLayer===layer){layerQuad.upperBorderColor='rgb(156,189,45)';}
+if(this.showAnimationBounds){this.appendAnimationQuads_(quads,layer,layerQuad);}
+this.appendImageQuads_(quads,layer,layerQuad);quads.push(layerQuad);if(this.showInvalidations){this.appendInvalidationQuads_(quads,layer,layerQuad);}
+if(this.showUnrecordedRegion){this.appendUnrecordedRegionQuads_(quads,layer,layerQuad);}
+if(this.showBottlenecks){this.appendBottleneckQuads_(quads,layer,layerQuad,layerQuad.stackingGroupId);}
+if(this.showLayoutRects){this.appendLayoutRectQuads_(quads,layer,layerQuad);}
+if(this.howToShowTiles==='coverage'){this.appendTileCoverageRectQuads_(quads,layer,layerQuad,this.tileHeatmapType);}else if(this.howToShowTiles!=='none'){this.appendTilesWithScaleQuads_(quads,layer,layerQuad,this.howToShowTiles,this.tileHeatmapType);}
+let highlights;highlights=extraHighlightsByLayerId[layer.layerId];if(highlights){this.appendHighlightQuadsForLayer_(quads,layer,layerQuad,highlights);}
+highlights=selectionHighlightsByLayerId[layer.layerId];if(highlights){this.appendHighlightQuadsForLayer_(quads,layer,layerQuad,highlights);}}
+this.layerTreeImpl.iterLayers(function(layer,depth,isMask,isReplica){if(!this.showOtherLayers&&this.selectedLayer!==layer)return;if(alreadyVisitedLayerIds[layer.layerId])return;const layerQuad=layer.layerQuad;const stackingGroupId=nextStackingGroupId++;if(this.showBottlenecks){this.appendBottleneckQuads_(quads,layer,layerQuad,stackingGroupId);}},this);const tracedInputLatencies=this.layerTreeImpl.tracedInputLatencies;if(this.showInputEvents&&tracedInputLatencies){for(let i=0;i<tracedInputLatencies.length;i++){const coordinatesArray=tracedInputLatencies[i].args.data.coordinates;for(let j=0;j<coordinatesArray.length;j++){const inputQuad=tr.b.math.Quad.fromXYWH(coordinatesArray[j].x-25,coordinatesArray[j].y-25,50,50);inputQuad.borderColor='rgba(0, 0, 0, 0)';inputQuad.imageData=this.inputEventImageData_;quads.push(inputQuad);}}}
+return quads;},updateInfoBar_(infoBarMessages){if(infoBarMessages.length){this.infoBar_.removeAllButtons();this.infoBar_.message='Some problems were encountered...';this.infoBar_.addButton('More info...',function(e){const overlay=new tr.ui.b.Overlay();Polymer.dom(overlay).textContent='';infoBarMessages.forEach(function(message){const title=document.createElement('h3');Polymer.dom(title).textContent=message.header;const details=document.createElement('div');Polymer.dom(details).textContent=message.details;Polymer.dom(overlay).appendChild(title);Polymer.dom(overlay).appendChild(details);});overlay.visible=true;e.stopPropagation();return false;});this.infoBar_.visible=true;}else{this.infoBar_.removeAllButtons();this.infoBar_.message='';this.infoBar_.visible=false;}},getWhatRasterized_(){const lthi=this.layerTreeImpl_.layerTreeHostImpl;const renderProcess=lthi.objectInstance.parent;const tasks=[];for(const event of renderProcess.getDescendantEvents()){if(!(event instanceof tr.model.Slice))continue;const tile=tr.e.cc.getTileFromRasterTaskSlice(event);if(tile===undefined)continue;if(tile.containingSnapshot===lthi){tasks.push(event);}}
+return tasks;},updateWhatRasterizedLinkState_(){const tasks=this.getWhatRasterized_();if(tasks.length){Polymer.dom(this.whatRasterizedLink_).textContent=tasks.length+' raster tasks';this.whatRasterizedLink_.style.display='';}else{Polymer.dom(this.whatRasterizedLink_).textContent='';this.whatRasterizedLink_.style.display='none';}},onWhatRasterizedLinkClicked_(){const tasks=this.getWhatRasterized_();const event=new tr.model.RequestSelectionChangeEvent();event.selection=new tr.model.EventSet(tasks);this.dispatchEvent(event);}};return{LayerTreeQuadStackView,};});'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){const constants=tr.e.cc.constants;const LayerView=tr.ui.b.define('tr-ui-e-chrome-cc-layer-view');LayerView.prototype={__proto__:HTMLDivElement.prototype,decorate(){this.layerTreeQuadStackView_=new tr.ui.e.chrome.cc.LayerTreeQuadStackView();this.dragBar_=document.createElement('tr-ui-b-drag-handle');this.analysisEl_=document.createElement('tr-ui-e-chrome-cc-layer-view-analysis');this.analysisEl_.addEventListener('requestSelectionChange',this.onRequestSelectionChangeFromAnalysisEl_.bind(this));this.dragBar_.target=this.analysisEl_;Polymer.dom(this).appendChild(this.layerTreeQuadStackView_);Polymer.dom(this).appendChild(this.dragBar_);Polymer.dom(this).appendChild(this.analysisEl_);this.layerTreeQuadStackView_.addEventListener('selection-change',function(){this.layerTreeQuadStackViewSelectionChanged_();}.bind(this));this.layerTreeQuadStackViewSelectionChanged_();},get layerTreeImpl(){return this.layerTreeQuadStackView_.layerTreeImpl;},set layerTreeImpl(newValue){return this.layerTreeQuadStackView_.layerTreeImpl=newValue;},set isRenderPassQuads(newValue){return this.layerTreeQuadStackView_.isRenderPassQuads=newValue;},get selection(){return this.layerTreeQuadStackView_.selection;},set selection(newValue){this.layerTreeQuadStackView_.selection=newValue;},regenerateContent(){this.layerTreeQuadStackView_.regenerateContent();},layerTreeQuadStackViewSelectionChanged_(){const selection=this.layerTreeQuadStackView_.selection;if(selection){this.dragBar_.style.display='';this.analysisEl_.style.display='';Polymer.dom(this.analysisEl_).textContent='';const layer=selection.layer;if(layer&&layer.args&&layer.args.pictures){Polymer.dom(this.analysisEl_).appendChild(this.createPictureBtn_(layer.args.pictures));}
+const analysis=selection.createAnalysis();Polymer.dom(this.analysisEl_).appendChild(analysis);}else{this.dragBar_.style.display='none';this.analysisEl_.style.display='none';const analysis=Polymer.dom(this.analysisEl_).firstChild;if(analysis){Polymer.dom(this.analysisEl_).removeChild(analysis);}
+this.layerTreeQuadStackView_.style.height=window.getComputedStyle(this).height;}
+tr.b.dispatchSimpleEvent(this,'selection-change');},createPictureBtn_(pictures){if(!(pictures instanceof Array)){pictures=[pictures];}
+const link=document.createElement('tr-ui-a-analysis-link');link.selection=function(){const layeredPicture=new tr.e.cc.LayeredPicture(pictures);const snapshot=new tr.e.cc.PictureSnapshot(layeredPicture);snapshot.picture=layeredPicture;const selection=new tr.model.EventSet();selection.push(snapshot);return selection;};Polymer.dom(link).textContent='View in Picture Debugger';return link;},onRequestSelectionChangeFromAnalysisEl_(e){if(!(e.selection instanceof tr.ui.e.chrome.cc.Selection)){return;}
+e.stopPropagation();this.selection=e.selection;},get extraHighlightsByLayerId(){return this.layerTreeQuadStackView_.extraHighlightsByLayerId;},set extraHighlightsByLayerId(extraHighlightsByLayerId){this.layerTreeQuadStackView_.extraHighlightsByLayerId=extraHighlightsByLayerId;}};return{LayerView,};});'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){const LayerTreeHostImplSnapshotView=tr.ui.b.define('tr-ui-e-chrome-cc-layer-tree-host-impl-snapshot-view',tr.ui.analysis.ObjectSnapshotView);LayerTreeHostImplSnapshotView.prototype={__proto__:tr.ui.analysis.ObjectSnapshotView.prototype,decorate(){Polymer.dom(this).classList.add('tr-ui-e-chrome-cc-lthi-s-view');this.selection_=undefined;this.layerPicker_=new tr.ui.e.chrome.cc.LayerPicker();this.layerPicker_.addEventListener('selection-change',this.onLayerPickerSelectionChanged_.bind(this));this.layerView_=new tr.ui.e.chrome.cc.LayerView();this.layerView_.addEventListener('selection-change',this.onLayerViewSelectionChanged_.bind(this));this.dragHandle_=document.createElement('tr-ui-b-drag-handle');this.dragHandle_.horizontal=false;this.dragHandle_.target=this.layerView_;Polymer.dom(this).appendChild(this.layerPicker_);Polymer.dom(this).appendChild(this.dragHandle_);Polymer.dom(this).appendChild(this.layerView_);this.onLayerViewSelectionChanged_();this.onLayerPickerSelectionChanged_();},get objectSnapshot(){return this.objectSnapshot_;},set objectSnapshot(objectSnapshot){this.objectSnapshot_=objectSnapshot;const lthi=this.objectSnapshot;let layerTreeImpl;if(lthi){layerTreeImpl=lthi.getTree(this.layerPicker_.whichTree);}
+this.layerPicker_.lthiSnapshot=lthi;this.layerView_.layerTreeImpl=layerTreeImpl;this.layerView_.regenerateContent();if(!this.selection_)return;this.selection=this.selection_.findEquivalent(lthi);},get selection(){return this.selection_;},set selection(selection){if(this.selection_===selection)return;this.selection_=selection;this.layerPicker_.selection=selection;this.layerView_.selection=selection;tr.b.dispatchSimpleEvent(this,'cc-selection-change');},onLayerPickerSelectionChanged_(){this.selection_=this.layerPicker_.selection;this.layerView_.selection=this.selection;this.layerView_.layerTreeImpl=this.layerPicker_.layerTreeImpl;this.layerView_.isRenderPassQuads=this.layerPicker_.isRenderPassQuads;this.layerView_.regenerateContent();tr.b.dispatchSimpleEvent(this,'cc-selection-change');},onLayerViewSelectionChanged_(){this.selection_=this.layerView_.selection;this.layerPicker_.selection=this.selection;tr.b.dispatchSimpleEvent(this,'cc-selection-change');},get extraHighlightsByLayerId(){return this.layerView_.extraHighlightsByLayerId;},set extraHighlightsByLayerId(extraHighlightsByLayerId){this.layerView_.extraHighlightsByLayerId=extraHighlightsByLayerId;}};tr.ui.analysis.ObjectSnapshotView.register(LayerTreeHostImplSnapshotView,{typeName:'cc::LayerTreeHostImpl'});return{LayerTreeHostImplSnapshotView,};});'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){const OPS_TIMING_ITERATIONS=3;const CHART_PADDING_LEFT=65;const CHART_PADDING_RIGHT=40;const AXIS_PADDING_LEFT=60;const AXIS_PADDING_RIGHT=35;const AXIS_PADDING_TOP=25;const AXIS_PADDING_BOTTOM=45;const AXIS_LABEL_PADDING=5;const AXIS_TICK_SIZE=10;const LABEL_PADDING=5;const LABEL_INTERLEAVE_OFFSET=15;const BAR_PADDING=5;const VERTICAL_TICKS=5;const HUE_CHAR_CODE_ADJUSTMENT=5.7;const PictureOpsChartSummaryView=tr.ui.b.define('tr-ui-e-chrome-cc-picture-ops-chart-summary-view');PictureOpsChartSummaryView.prototype={__proto__:HTMLDivElement.prototype,decorate(){this.picture_=undefined;this.pictureDataProcessed_=false;this.chartScale_=window.devicePixelRatio;this.chart_=document.createElement('canvas');this.chartCtx_=this.chart_.getContext('2d');Polymer.dom(this).appendChild(this.chart_);this.opsTimingData_=[];this.chartWidth_=0;this.chartHeight_=0;this.requiresRedraw_=true;this.currentBarMouseOverTarget_=null;this.chart_.addEventListener('mousemove',this.onMouseMove_.bind(this));},get requiresRedraw(){return this.requiresRedraw_;},set requiresRedraw(requiresRedraw){this.requiresRedraw_=requiresRedraw;},get picture(){return this.picture_;},set picture(picture){this.picture_=picture;this.pictureDataProcessed_=false;if(Polymer.dom(this).classList.contains('hidden'))return;this.processPictureData_();this.requiresRedraw=true;this.updateChartContents();},hide(){Polymer.dom(this).classList.add('hidden');},show(){Polymer.dom(this).classList.remove('hidden');if(this.pictureDataProcessed_)return;this.processPictureData_();this.requiresRedraw=true;this.updateChartContents();},onMouseMove_(e){const lastBarMouseOverTarget=this.currentBarMouseOverTarget_;this.currentBarMouseOverTarget_=null;const x=e.offsetX;const y=e.offsetY;const chartLeft=CHART_PADDING_LEFT;const chartRight=this.chartWidth_-CHART_PADDING_RIGHT;const chartTop=AXIS_PADDING_TOP;const chartBottom=this.chartHeight_-AXIS_PADDING_BOTTOM;const chartInnerWidth=chartRight-chartLeft;if(x>chartLeft&&x<chartRight&&y>chartTop&&y<chartBottom){this.currentBarMouseOverTarget_=Math.floor((x-chartLeft)/chartInnerWidth*this.opsTimingData_.length);this.currentBarMouseOverTarget_=tr.b.math.clamp(this.currentBarMouseOverTarget_,0,this.opsTimingData_.length-1);}
+if(this.currentBarMouseOverTarget_===lastBarMouseOverTarget)return;this.drawChartContents_();},updateChartContents(){if(this.requiresRedraw){this.updateChartDimensions_();}
+this.drawChartContents_();},updateChartDimensions_(){this.chartWidth_=this.offsetWidth;this.chartHeight_=this.offsetHeight;this.chart_.width=this.chartWidth_*this.chartScale_;this.chart_.height=this.chartHeight_*this.chartScale_;this.chart_.style.width=this.chartWidth_+'px';this.chart_.style.height=this.chartHeight_+'px';this.chartCtx_.scale(this.chartScale_,this.chartScale_);},processPictureData_(){this.resetOpsTimingData_();this.pictureDataProcessed_=true;if(!this.picture_)return;let ops=this.picture_.getOps();if(!ops)return;ops=this.picture_.tagOpsWithTimings(ops);if(ops[0].cmd_time===undefined)return;this.collapseOpsToTimingBuckets_(ops);},drawChartContents_(){this.clearChartContents_();if(this.opsTimingData_.length===0){this.showNoTimingDataMessage_();return;}
+this.drawChartAxes_();this.drawBars_();this.drawLineAtBottomOfChart_();if(this.currentBarMouseOverTarget_===null)return;this.drawTooltip_();},drawLineAtBottomOfChart_(){this.chartCtx_.strokeStyle='#AAA';this.chartCtx_.moveTo(0,this.chartHeight_-0.5);this.chartCtx_.lineTo(this.chartWidth_,this.chartHeight_-0.5);this.chartCtx_.stroke();},drawTooltip_(){const tooltipData=this.opsTimingData_[this.currentBarMouseOverTarget_];const tooltipTitle=tooltipData.cmd_string;const tooltipTime=tooltipData.cmd_time.toFixed(4);const tooltipWidth=110;const tooltipHeight=40;const chartInnerWidth=this.chartWidth_-CHART_PADDING_RIGHT-
+CHART_PADDING_LEFT;const barWidth=chartInnerWidth/this.opsTimingData_.length;const tooltipOffset=Math.round((tooltipWidth-barWidth)*0.5);const left=CHART_PADDING_LEFT+this.currentBarMouseOverTarget_*barWidth-tooltipOffset;const top=Math.round((this.chartHeight_-tooltipHeight)*0.5);this.chartCtx_.save();this.chartCtx_.shadowOffsetX=0;this.chartCtx_.shadowOffsetY=5;this.chartCtx_.shadowBlur=4;this.chartCtx_.shadowColor='rgba(0,0,0,0.4)';this.chartCtx_.strokeStyle='#888';this.chartCtx_.fillStyle='#EEE';this.chartCtx_.fillRect(left,top,tooltipWidth,tooltipHeight);this.chartCtx_.shadowColor='transparent';this.chartCtx_.translate(0.5,0.5);this.chartCtx_.strokeRect(left,top,tooltipWidth,tooltipHeight);this.chartCtx_.restore();this.chartCtx_.fillStyle='#222';this.chartCtx_.textBaseline='top';this.chartCtx_.font='800 12px Arial';this.chartCtx_.fillText(tooltipTitle,left+8,top+8);this.chartCtx_.fillStyle='#555';this.chartCtx_.textBaseline='top';this.chartCtx_.font='400 italic 10px Arial';this.chartCtx_.fillText('Total: '+tooltipTime+'ms',left+8,top+22);},drawBars_(){const len=this.opsTimingData_.length;const max=this.opsTimingData_[0].cmd_time;const min=this.opsTimingData_[len-1].cmd_time;const width=this.chartWidth_-CHART_PADDING_LEFT-CHART_PADDING_RIGHT;const height=this.chartHeight_-AXIS_PADDING_TOP-AXIS_PADDING_BOTTOM;const barWidth=Math.floor(width/len);let opData;let opTiming;let opHeight;let opLabel;let barLeft;for(let b=0;b<len;b++){opData=this.opsTimingData_[b];opTiming=opData.cmd_time/max;opHeight=Math.round(Math.max(1,opTiming*height));opLabel=opData.cmd_string;barLeft=CHART_PADDING_LEFT+b*barWidth;this.chartCtx_.fillStyle=this.getOpColor_(opLabel);this.chartCtx_.fillRect(barLeft+BAR_PADDING,AXIS_PADDING_TOP+
+height-opHeight,barWidth-2*BAR_PADDING,opHeight);}},getOpColor_(opName){const characters=opName.split('');const hue=characters.reduce(this.reduceNameToHue,0)%360;return'hsl('+hue+', 30%, 50%)';},reduceNameToHue(previousValue,currentValue,index,array){return Math.round(previousValue+currentValue.charCodeAt(0)*HUE_CHAR_CODE_ADJUSTMENT);},drawChartAxes_(){const len=this.opsTimingData_.length;const max=this.opsTimingData_[0].cmd_time;const min=this.opsTimingData_[len-1].cmd_time;const width=this.chartWidth_-AXIS_PADDING_LEFT-AXIS_PADDING_RIGHT;const height=this.chartHeight_-AXIS_PADDING_TOP-AXIS_PADDING_BOTTOM;const totalBarWidth=this.chartWidth_-CHART_PADDING_LEFT-
+CHART_PADDING_RIGHT;const barWidth=Math.floor(totalBarWidth/len);const tickYInterval=height/(VERTICAL_TICKS-1);let tickYPosition=0;const tickValInterval=(max-min)/(VERTICAL_TICKS-1);let tickVal=0;this.chartCtx_.fillStyle='#333';this.chartCtx_.strokeStyle='#777';this.chartCtx_.save();this.chartCtx_.translate(0.5,0.5);this.chartCtx_.save();this.chartCtx_.translate(AXIS_PADDING_LEFT,AXIS_PADDING_TOP);this.chartCtx_.moveTo(0,0);this.chartCtx_.lineTo(0,height);this.chartCtx_.lineTo(width,height);this.chartCtx_.font='10px Arial';this.chartCtx_.textAlign='right';this.chartCtx_.textBaseline='middle';for(let t=0;t<VERTICAL_TICKS;t++){tickYPosition=Math.round(t*tickYInterval);tickVal=(max-t*tickValInterval).toFixed(4);this.chartCtx_.moveTo(0,tickYPosition);this.chartCtx_.lineTo(-AXIS_TICK_SIZE,tickYPosition);this.chartCtx_.fillText(tickVal,-AXIS_TICK_SIZE-AXIS_LABEL_PADDING,tickYPosition);}
+this.chartCtx_.stroke();this.chartCtx_.restore();this.chartCtx_.save();this.chartCtx_.translate(CHART_PADDING_LEFT+Math.round(barWidth*0.5),AXIS_PADDING_TOP+height+LABEL_PADDING);this.chartCtx_.font='10px Arial';this.chartCtx_.textAlign='center';this.chartCtx_.textBaseline='top';let labelTickLeft;let labelTickBottom;for(let l=0;l<len;l++){labelTickLeft=Math.round(l*barWidth);labelTickBottom=l%2*LABEL_INTERLEAVE_OFFSET;this.chartCtx_.save();this.chartCtx_.moveTo(labelTickLeft,-LABEL_PADDING);this.chartCtx_.lineTo(labelTickLeft,labelTickBottom);this.chartCtx_.stroke();this.chartCtx_.restore();this.chartCtx_.fillText(this.opsTimingData_[l].cmd_string,labelTickLeft,labelTickBottom);}
+this.chartCtx_.restore();this.chartCtx_.restore();},clearChartContents_(){this.chartCtx_.clearRect(0,0,this.chartWidth_,this.chartHeight_);},showNoTimingDataMessage_(){this.chartCtx_.font='800 italic 14px Arial';this.chartCtx_.fillStyle='#333';this.chartCtx_.textAlign='center';this.chartCtx_.textBaseline='middle';this.chartCtx_.fillText('No timing data available.',this.chartWidth_*0.5,this.chartHeight_*0.5);},collapseOpsToTimingBuckets_(ops){const opsTimingDataIndexHash_={};const timingData=this.opsTimingData_;let op;let opIndex;for(let i=0;i<ops.length;i++){op=ops[i];if(op.cmd_time===undefined)continue;opIndex=opsTimingDataIndexHash_[op.cmd_string]||null;if(opIndex===null){timingData.push({cmd_time:0,cmd_string:op.cmd_string});opIndex=timingData.length-1;opsTimingDataIndexHash_[op.cmd_string]=opIndex;}
+timingData[opIndex].cmd_time+=op.cmd_time;}
+timingData.sort(this.sortTimingBucketsByOpTimeDescending_);this.collapseTimingBucketsToOther_(4);},collapseTimingBucketsToOther_(count){const timingData=this.opsTimingData_;const otherSource=timingData.splice(count,timingData.length-count);let otherDestination=null;if(!otherSource.length)return;timingData.push({cmd_time:0,cmd_string:'Other'});otherDestination=timingData[timingData.length-1];for(let i=0;i<otherSource.length;i++){otherDestination.cmd_time+=otherSource[i].cmd_time;}},sortTimingBucketsByOpTimeDescending_(a,b){return b.cmd_time-a.cmd_time;},resetOpsTimingData_(){this.opsTimingData_.length=0;}};return{PictureOpsChartSummaryView,};});'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){const BAR_PADDING=1;const BAR_WIDTH=5;const CHART_PADDING_LEFT=65;const CHART_PADDING_RIGHT=30;const CHART_PADDING_BOTTOM=35;const CHART_PADDING_TOP=20;const AXIS_PADDING_LEFT=55;const AXIS_PADDING_RIGHT=30;const AXIS_PADDING_BOTTOM=35;const AXIS_PADDING_TOP=20;const AXIS_TICK_SIZE=5;const AXIS_LABEL_PADDING=5;const VERTICAL_TICKS=5;const HUE_CHAR_CODE_ADJUSTMENT=5.7;const PictureOpsChartView=tr.ui.b.define('tr-ui-e-chrome-cc-picture-ops-chart-view');PictureOpsChartView.prototype={__proto__:HTMLDivElement.prototype,decorate(){this.picture_=undefined;this.pictureOps_=undefined;this.opCosts_=undefined;this.chartScale_=window.devicePixelRatio;this.chart_=document.createElement('canvas');this.chartCtx_=this.chart_.getContext('2d');Polymer.dom(this).appendChild(this.chart_);this.selectedOpIndex_=undefined;this.chartWidth_=0;this.chartHeight_=0;this.dimensionsHaveChanged_=true;this.currentBarMouseOverTarget_=undefined;this.ninetyFifthPercentileCost_=0;this.totalOpCost_=0;this.chart_.addEventListener('click',this.onClick_.bind(this));this.chart_.addEventListener('mousemove',this.onMouseMove_.bind(this));this.usePercentileScale_=false;this.usePercentileScaleCheckbox_=tr.ui.b.createCheckBox(this,'usePercentileScale','PictureOpsChartView.usePercentileScale',false,'Limit to 95%-ile');Polymer.dom(this.usePercentileScaleCheckbox_).classList.add('use-percentile-scale');Polymer.dom(this).appendChild(this.usePercentileScaleCheckbox_);},get dimensionsHaveChanged(){return this.dimensionsHaveChanged_;},set dimensionsHaveChanged(dimensionsHaveChanged){this.dimensionsHaveChanged_=dimensionsHaveChanged;},get usePercentileScale(){return this.usePercentileScale_;},set usePercentileScale(usePercentileScale){this.usePercentileScale_=usePercentileScale;this.drawChartContents_();},get numOps(){return this.opCosts_.length;},get selectedOpIndex(){return this.selectedOpIndex_;},set selectedOpIndex(selectedOpIndex){if(selectedOpIndex<0)throw new Error('Invalid index');if(selectedOpIndex>=this.numOps)throw new Error('Invalid index');this.selectedOpIndex_=selectedOpIndex;},get picture(){return this.picture_;},set picture(picture){this.picture_=picture;this.pictureOps_=picture.tagOpsWithTimings(picture.getOps());this.currentBarMouseOverTarget_=undefined;this.processPictureData_();this.dimensionsHaveChanged=true;},processPictureData_(){if(this.pictureOps_===undefined)return;let totalOpCost=0;this.opCosts_=this.pictureOps_.map(function(op){totalOpCost+=op.cmd_time;return op.cmd_time;});this.opCosts_.sort();const ninetyFifthPercentileCostIndex=Math.floor(this.opCosts_.length*0.95);this.ninetyFifthPercentileCost_=this.opCosts_[ninetyFifthPercentileCostIndex];this.maxCost_=this.opCosts_[this.opCosts_.length-1];this.totalOpCost_=totalOpCost;},extractBarIndex_(e){let index=undefined;if(this.pictureOps_===undefined||this.pictureOps_.length===0){return index;}
+const x=e.offsetX;const y=e.offsetY;const totalBarWidth=(BAR_WIDTH+BAR_PADDING)*this.pictureOps_.length;const chartLeft=CHART_PADDING_LEFT;const chartTop=0;const chartBottom=this.chartHeight_-CHART_PADDING_BOTTOM;const chartRight=chartLeft+totalBarWidth;if(x<chartLeft||x>chartRight||y<chartTop||y>chartBottom){return index;}
+index=Math.floor((x-chartLeft)/totalBarWidth*this.pictureOps_.length);index=tr.b.math.clamp(index,0,this.pictureOps_.length-1);return index;},onClick_(e){const barClicked=this.extractBarIndex_(e);if(barClicked===undefined)return;if(barClicked===this.selectedOpIndex){this.selectedOpIndex=undefined;}else{this.selectedOpIndex=barClicked;}
+e.preventDefault();tr.b.dispatchSimpleEvent(this,'selection-changed',false);},onMouseMove_(e){const lastBarMouseOverTarget=this.currentBarMouseOverTarget_;this.currentBarMouseOverTarget_=this.extractBarIndex_(e);if(this.currentBarMouseOverTarget_===lastBarMouseOverTarget){return;}
+this.drawChartContents_();},scrollSelectedItemIntoViewIfNecessary(){if(this.selectedOpIndex===undefined){return;}
+const width=this.offsetWidth;const left=this.scrollLeft;const right=left+width;const targetLeft=CHART_PADDING_LEFT+
+(BAR_WIDTH+BAR_PADDING)*this.selectedOpIndex;if(targetLeft>left&&targetLeft<right){return;}
+this.scrollLeft=(targetLeft-width*0.5);},updateChartContents(){if(this.dimensionsHaveChanged){this.updateChartDimensions_();}
+this.drawChartContents_();},updateChartDimensions_(){if(!this.pictureOps_)return;let width=CHART_PADDING_LEFT+CHART_PADDING_RIGHT+
+((BAR_WIDTH+BAR_PADDING)*this.pictureOps_.length);if(width<this.offsetWidth){width=this.offsetWidth;}
+this.chartWidth_=width;this.chartHeight_=this.getBoundingClientRect().height;this.chart_.width=this.chartWidth_*this.chartScale_;this.chart_.height=this.chartHeight_*this.chartScale_;this.chart_.style.width=this.chartWidth_+'px';this.chart_.style.height=this.chartHeight_+'px';this.chartCtx_.scale(this.chartScale_,this.chartScale_);this.dimensionsHaveChanged=false;},drawChartContents_(){this.clearChartContents_();if(this.pictureOps_===undefined||this.pictureOps_.length===0||this.pictureOps_[0].cmd_time===undefined){this.showNoTimingDataMessage_();return;}
+this.drawSelection_();this.drawBars_();this.drawChartAxes_();this.drawLinesAtTickMarks_();this.drawLineAtBottomOfChart_();if(this.currentBarMouseOverTarget_===undefined){return;}
+this.drawTooltip_();},drawSelection_(){if(this.selectedOpIndex===undefined){return;}
+const width=(BAR_WIDTH+BAR_PADDING)*this.selectedOpIndex;this.chartCtx_.fillStyle='rgb(223, 235, 230)';this.chartCtx_.fillRect(CHART_PADDING_LEFT,CHART_PADDING_TOP,width,this.chartHeight_-CHART_PADDING_TOP-CHART_PADDING_BOTTOM);},drawChartAxes_(){const min=this.opCosts_[0];const max=this.opCosts_[this.opCosts_.length-1];const height=this.chartHeight_-AXIS_PADDING_TOP-AXIS_PADDING_BOTTOM;const tickYInterval=height/(VERTICAL_TICKS-1);let tickYPosition=0;const tickValInterval=(max-min)/(VERTICAL_TICKS-1);let tickVal=0;this.chartCtx_.fillStyle='#333';this.chartCtx_.strokeStyle='#777';this.chartCtx_.save();this.chartCtx_.translate(0.5,0.5);this.chartCtx_.beginPath();this.chartCtx_.moveTo(AXIS_PADDING_LEFT,AXIS_PADDING_TOP);this.chartCtx_.lineTo(AXIS_PADDING_LEFT,this.chartHeight_-
+AXIS_PADDING_BOTTOM);this.chartCtx_.lineTo(this.chartWidth_-AXIS_PADDING_RIGHT,this.chartHeight_-AXIS_PADDING_BOTTOM);this.chartCtx_.stroke();this.chartCtx_.closePath();this.chartCtx_.translate(AXIS_PADDING_LEFT,AXIS_PADDING_TOP);this.chartCtx_.font='10px Arial';this.chartCtx_.textAlign='right';this.chartCtx_.textBaseline='middle';this.chartCtx_.beginPath();for(let t=0;t<VERTICAL_TICKS;t++){tickYPosition=Math.round(t*tickYInterval);tickVal=(max-t*tickValInterval).toFixed(4);this.chartCtx_.moveTo(0,tickYPosition);this.chartCtx_.lineTo(-AXIS_TICK_SIZE,tickYPosition);this.chartCtx_.fillText(tickVal,-AXIS_TICK_SIZE-AXIS_LABEL_PADDING,tickYPosition);}
+this.chartCtx_.stroke();this.chartCtx_.closePath();this.chartCtx_.restore();},drawLinesAtTickMarks_(){const height=this.chartHeight_-AXIS_PADDING_TOP-AXIS_PADDING_BOTTOM;const width=this.chartWidth_-AXIS_PADDING_LEFT-AXIS_PADDING_RIGHT;const tickYInterval=height/(VERTICAL_TICKS-1);let tickYPosition=0;this.chartCtx_.save();this.chartCtx_.translate(AXIS_PADDING_LEFT+0.5,AXIS_PADDING_TOP+0.5);this.chartCtx_.beginPath();this.chartCtx_.strokeStyle='rgba(0,0,0,0.05)';for(let t=0;t<VERTICAL_TICKS;t++){tickYPosition=Math.round(t*tickYInterval);this.chartCtx_.moveTo(0,tickYPosition);this.chartCtx_.lineTo(width,tickYPosition);this.chartCtx_.stroke();}
+this.chartCtx_.restore();this.chartCtx_.closePath();},drawLineAtBottomOfChart_(){this.chartCtx_.strokeStyle='#AAA';this.chartCtx_.beginPath();this.chartCtx_.moveTo(0,this.chartHeight_-0.5);this.chartCtx_.lineTo(this.chartWidth_,this.chartHeight_-0.5);this.chartCtx_.stroke();this.chartCtx_.closePath();},drawTooltip_(){const tooltipData=this.pictureOps_[this.currentBarMouseOverTarget_];const tooltipTitle=tooltipData.cmd_string;const tooltipTime=tooltipData.cmd_time.toFixed(4);const toolTipTimePercentage=((tooltipData.cmd_time/this.totalOpCost_)*100).toFixed(2);const tooltipWidth=120;const tooltipHeight=40;const chartInnerWidth=this.chartWidth_-CHART_PADDING_RIGHT-
+CHART_PADDING_LEFT;const barWidth=BAR_WIDTH+BAR_PADDING;const tooltipOffset=Math.round((tooltipWidth-barWidth)*0.5);const left=CHART_PADDING_LEFT+this.currentBarMouseOverTarget_*barWidth-tooltipOffset;const top=Math.round((this.chartHeight_-tooltipHeight)*0.5);this.chartCtx_.save();this.chartCtx_.shadowOffsetX=0;this.chartCtx_.shadowOffsetY=5;this.chartCtx_.shadowBlur=4;this.chartCtx_.shadowColor='rgba(0,0,0,0.4)';this.chartCtx_.strokeStyle='#888';this.chartCtx_.fillStyle='#EEE';this.chartCtx_.fillRect(left,top,tooltipWidth,tooltipHeight);this.chartCtx_.shadowColor='transparent';this.chartCtx_.translate(0.5,0.5);this.chartCtx_.strokeRect(left,top,tooltipWidth,tooltipHeight);this.chartCtx_.restore();this.chartCtx_.fillStyle='#222';this.chartCtx_.textAlign='left';this.chartCtx_.textBaseline='top';this.chartCtx_.font='800 12px Arial';this.chartCtx_.fillText(tooltipTitle,left+8,top+8);this.chartCtx_.fillStyle='#555';this.chartCtx_.font='400 italic 10px Arial';this.chartCtx_.fillText(tooltipTime+'ms ('+
+toolTipTimePercentage+'%)',left+8,top+22);},drawBars_(){let op;let opColor=0;let opHeight=0;const opWidth=BAR_WIDTH+BAR_PADDING;let opHover=false;const bottom=this.chartHeight_-CHART_PADDING_BOTTOM;const maxHeight=this.chartHeight_-CHART_PADDING_BOTTOM-
+CHART_PADDING_TOP;let maxValue;if(this.usePercentileScale){maxValue=this.ninetyFifthPercentileCost_;}else{maxValue=this.maxCost_;}
+for(let b=0;b<this.pictureOps_.length;b++){op=this.pictureOps_[b];opHeight=Math.round((op.cmd_time/maxValue)*maxHeight);opHeight=Math.max(opHeight,1);opHover=(b===this.currentBarMouseOverTarget_);opColor=this.getOpColor_(op.cmd_string,opHover);if(b===this.selectedOpIndex){this.chartCtx_.fillStyle='#FFFF00';}else{this.chartCtx_.fillStyle=opColor;}
+this.chartCtx_.fillRect(CHART_PADDING_LEFT+b*opWidth,bottom-opHeight,BAR_WIDTH,opHeight);}},getOpColor_(opName,hover){const characters=opName.split('');const hue=characters.reduce(this.reduceNameToHue,0)%360;const saturation=30;const lightness=hover?'75%':'50%';return'hsl('+hue+', '+saturation+'%, '+lightness+'%)';},reduceNameToHue(previousValue,currentValue,index,array){return Math.round(previousValue+currentValue.charCodeAt(0)*HUE_CHAR_CODE_ADJUSTMENT);},clearChartContents_(){this.chartCtx_.clearRect(0,0,this.chartWidth_,this.chartHeight_);},showNoTimingDataMessage_(){this.chartCtx_.font='800 italic 14px Arial';this.chartCtx_.fillStyle='#333';this.chartCtx_.textAlign='center';this.chartCtx_.textBaseline='middle';this.chartCtx_.fillText('No timing data available.',this.chartWidth_*0.5,this.chartHeight_*0.5);}};return{PictureOpsChartView,};});'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){const THIS_DOC=document.currentScript.ownerDocument;const PictureDebugger=tr.ui.b.define('tr-ui-e-chrome-cc-picture-debugger');PictureDebugger.prototype={__proto__:HTMLDivElement.prototype,decorate(){const node=tr.ui.b.instantiateTemplate('#tr-ui-e-chrome-cc-picture-debugger-template',THIS_DOC);Polymer.dom(this).appendChild(node);this.pictureAsImageData_=undefined;this.showOverdraw_=false;this.zoomScaleValue_=1;this.sizeInfo_=Polymer.dom(this).querySelector('.size');this.rasterArea_=Polymer.dom(this).querySelector('raster-area');this.rasterCanvas_=Polymer.dom(this.rasterArea_).querySelector('canvas');this.rasterCtx_=this.rasterCanvas_.getContext('2d');this.filename_=Polymer.dom(this).querySelector('.filename');this.drawOpsChartSummaryView_=new tr.ui.e.chrome.cc.PictureOpsChartSummaryView();this.drawOpsChartView_=new tr.ui.e.chrome.cc.PictureOpsChartView();this.drawOpsChartView_.addEventListener('selection-changed',this.onChartBarClicked_.bind(this));this.exportButton_=Polymer.dom(this).querySelector('.export');this.exportButton_.addEventListener('click',this.onSaveAsSkPictureClicked_.bind(this));this.trackMouse_();const overdrawCheckbox=tr.ui.b.createCheckBox(this,'showOverdraw','pictureView.showOverdraw',false,'Show overdraw');const chartCheckbox=tr.ui.b.createCheckBox(this,'showSummaryChart','pictureView.showSummaryChart',false,'Show timing summary');const pictureInfo=Polymer.dom(this).querySelector('picture-info');Polymer.dom(pictureInfo).appendChild(overdrawCheckbox);Polymer.dom(pictureInfo).appendChild(chartCheckbox);this.drawOpsView_=new tr.ui.e.chrome.cc.PictureOpsListView();this.drawOpsView_.addEventListener('selection-changed',this.onChangeDrawOps_.bind(this));const leftPanel=Polymer.dom(this).querySelector('left-panel');Polymer.dom(leftPanel).appendChild(this.drawOpsChartSummaryView_);Polymer.dom(leftPanel).appendChild(this.drawOpsView_);const middleDragHandle=document.createElement('tr-ui-b-drag-handle');middleDragHandle.horizontal=false;middleDragHandle.target=leftPanel;const rightPanel=Polymer.dom(this).querySelector('right-panel');rightPanel.replaceChild(this.drawOpsChartView_,Polymer.dom(rightPanel).querySelector('tr-ui-e-chrome-cc-picture-ops-chart-view'));this.infoBar_=document.createElement('tr-ui-b-info-bar');Polymer.dom(this.rasterArea_).appendChild(this.infoBar_);Polymer.dom(this).insertBefore(middleDragHandle,rightPanel);this.picture_=undefined;const hkc=document.createElement('tv-ui-b-hotkey-controller');hkc.addHotKey(new tr.ui.b.HotKey({eventType:'keypress',thisArg:this,keyCode:'h'.charCodeAt(0),callback(e){this.moveSelectedOpBy(-1);e.stopPropagation();}}));hkc.addHotKey(new tr.ui.b.HotKey({eventType:'keypress',thisArg:this,keyCode:'l'.charCodeAt(0),callback(e){this.moveSelectedOpBy(1);e.stopPropagation();}}));Polymer.dom(this).appendChild(hkc);this.mutationObserver_=new MutationObserver(this.onMutation_.bind(this));this.mutationObserver_.observe(leftPanel,{attributes:true});},onMutation_(mutations){for(let m=0;m<mutations.length;m++){if(mutations[m].attributeName==='style'){this.drawOpsChartSummaryView_.requiresRedraw=true;this.drawOpsChartSummaryView_.updateChartContents();this.drawOpsChartView_.dimensionsHaveChanged=true;this.drawOpsChartView_.updateChartContents();break;}}},onSaveAsSkPictureClicked_(){const rawData=tr.b.Base64.atob(this.picture_.getBase64SkpData());const length=rawData.length;const arrayBuffer=new ArrayBuffer(length);const uint8Array=new Uint8Array(arrayBuffer);for(let c=0;c<length;c++){uint8Array[c]=rawData.charCodeAt(c);}
+const blob=new Blob([uint8Array],{type:'application/octet-binary'});const blobUrl=window.webkitURL.createObjectURL(blob);const link=document.createElementNS('http://www.w3.org/1999/xhtml','a');link.href=blobUrl;link.download=this.filename_.value;const event=document.createEvent('MouseEvents');event.initMouseEvent('click',true,false,window,0,0,0,0,0,false,false,false,false,0,null);link.dispatchEvent(event);},get picture(){return this.picture_;},set picture(picture){this.drawOpsView_.picture=picture;this.drawOpsChartView_.picture=picture;this.drawOpsChartSummaryView_.picture=picture;this.picture_=picture;this.exportButton_.disabled=!this.picture_.canSave;if(picture){const size=this.getRasterCanvasSize_();this.rasterCanvas_.width=size.width;this.rasterCanvas_.height=size.height;}
+const bounds=this.rasterArea_.getBoundingClientRect();const selectorBounds=this.mouseModeSelector_.getBoundingClientRect();this.mouseModeSelector_.pos={x:(bounds.right-selectorBounds.width-10),y:bounds.top};this.rasterize_();this.scheduleUpdateContents_();},getRasterCanvasSize_(){const style=window.getComputedStyle(this.rasterArea_);const width=Math.max(parseInt(style.width),this.picture_.layerRect.width);const height=Math.max(parseInt(style.height),this.picture_.layerRect.height);return{width,height};},scheduleUpdateContents_(){if(this.updateContentsPending_)return;this.updateContentsPending_=true;tr.b.requestAnimationFrameInThisFrameIfPossible(this.updateContents_.bind(this));},updateContents_(){this.updateContentsPending_=false;if(this.picture_){Polymer.dom(this.sizeInfo_).textContent='('+
+this.picture_.layerRect.width+' x '+
+this.picture_.layerRect.height+')';}
+this.drawOpsChartView_.updateChartContents();this.drawOpsChartView_.scrollSelectedItemIntoViewIfNecessary();if(!this.pictureAsImageData_)return;this.infoBar_.visible=false;this.infoBar_.removeAllButtons();if(this.pictureAsImageData_.error){this.infoBar_.message='Cannot rasterize...';this.infoBar_.addButton('More info...',function(e){const overlay=new tr.ui.b.Overlay();Polymer.dom(overlay).textContent=this.pictureAsImageData_.error;overlay.visible=true;e.stopPropagation();return false;}.bind(this));this.infoBar_.visible=true;}
+this.drawPicture_();},drawPicture_(){const size=this.getRasterCanvasSize_();if(size.width!==this.rasterCanvas_.width){this.rasterCanvas_.width=size.width;}
+if(size.height!==this.rasterCanvas_.height){this.rasterCanvas_.height=size.height;}
+this.rasterCtx_.clearRect(0,0,size.width,size.height);if(!this.pictureAsImageData_.imageData)return;const imgCanvas=this.pictureAsImageData_.asCanvas();const w=imgCanvas.width;const h=imgCanvas.height;this.rasterCtx_.drawImage(imgCanvas,0,0,w,h,0,0,w*this.zoomScaleValue_,h*this.zoomScaleValue_);},rasterize_(){if(this.picture_){this.picture_.rasterize({stopIndex:this.drawOpsView_.selectedOpIndex,showOverdraw:this.showOverdraw_},this.onRasterComplete_.bind(this));}},onRasterComplete_(pictureAsImageData){this.pictureAsImageData_=pictureAsImageData;this.scheduleUpdateContents_();},moveSelectedOpBy(increment){if(this.selectedOpIndex===undefined){this.selectedOpIndex=0;return;}
+this.selectedOpIndex=tr.b.math.clamp(this.selectedOpIndex+increment,0,this.numOps);},get numOps(){return this.drawOpsView_.numOps;},get selectedOpIndex(){return this.drawOpsView_.selectedOpIndex;},set selectedOpIndex(index){this.drawOpsView_.selectedOpIndex=index;this.drawOpsChartView_.selectedOpIndex=index;},onChartBarClicked_(e){this.drawOpsView_.selectedOpIndex=this.drawOpsChartView_.selectedOpIndex;},onChangeDrawOps_(e){this.rasterize_();this.scheduleUpdateContents_();this.drawOpsChartView_.selectedOpIndex=this.drawOpsView_.selectedOpIndex;},set showOverdraw(v){this.showOverdraw_=v;this.rasterize_();},set showSummaryChart(chartShouldBeVisible){if(chartShouldBeVisible){this.drawOpsChartSummaryView_.show();}else{this.drawOpsChartSummaryView_.hide();}},trackMouse_(){this.mouseModeSelector_=document.createElement('tr-ui-b-mouse-mode-selector');this.mouseModeSelector_.targetElement=this.rasterArea_;Polymer.dom(this.rasterArea_).appendChild(this.mouseModeSelector_);this.mouseModeSelector_.supportedModeMask=tr.ui.b.MOUSE_SELECTOR_MODE.ZOOM;this.mouseModeSelector_.mode=tr.ui.b.MOUSE_SELECTOR_MODE.ZOOM;this.mouseModeSelector_.defaultMode=tr.ui.b.MOUSE_SELECTOR_MODE.ZOOM;this.mouseModeSelector_.settingsKey='pictureDebugger.mouseModeSelector';this.mouseModeSelector_.addEventListener('beginzoom',this.onBeginZoom_.bind(this));this.mouseModeSelector_.addEventListener('updatezoom',this.onUpdateZoom_.bind(this));this.mouseModeSelector_.addEventListener('endzoom',this.onEndZoom_.bind(this));},onBeginZoom_(e){this.isZooming_=true;this.lastMouseViewPos_=this.extractRelativeMousePosition_(e);e.preventDefault();},onUpdateZoom_(e){if(!this.isZooming_)return;const currentMouseViewPos=this.extractRelativeMousePosition_(e);this.zoomScaleValue_+=((this.lastMouseViewPos_.y-currentMouseViewPos.y)*0.001);this.zoomScaleValue_=Math.max(this.zoomScaleValue_,0.1);this.drawPicture_();this.lastMouseViewPos_=currentMouseViewPos;},onEndZoom_(e){this.lastMouseViewPos_=undefined;this.isZooming_=false;e.preventDefault();},extractRelativeMousePosition_(e){return{x:e.clientX-this.rasterArea_.offsetLeft,y:e.clientY-this.rasterArea_.offsetTop};}};return{PictureDebugger,};});'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){const PictureSnapshotView=tr.ui.b.define('tr-ui-e-chrome-cc-picture-snapshot-view',tr.ui.analysis.ObjectSnapshotView);PictureSnapshotView.prototype={__proto__:tr.ui.analysis.ObjectSnapshotView.prototype,decorate(){Polymer.dom(this).classList.add('tr-ui-e-chrome-cc-picture-snapshot-view');this.pictureDebugger_=new tr.ui.e.chrome.cc.PictureDebugger();Polymer.dom(this).appendChild(this.pictureDebugger_);},updateContents(){if(this.objectSnapshot_&&this.pictureDebugger_){this.pictureDebugger_.picture=this.objectSnapshot_;}}};tr.ui.analysis.ObjectSnapshotView.register(PictureSnapshotView,{typeNames:['cc::Picture','cc::LayeredPicture'],showInstances:false});return{PictureSnapshotView,};});'use strict';tr.exportTo('tr.e.cc',function(){const knownRasterTaskNames=['TileManager::RunRasterTask','RasterWorkerPoolTaskImpl::RunRasterOnThread','RasterWorkerPoolTaskImpl::Raster','RasterTaskImpl::Raster','cc::RasterTask','RasterTask'];const knownAnalysisTaskNames=['TileManager::RunAnalyzeTask','RasterWorkerPoolTaskImpl::RunAnalysisOnThread','RasterWorkerPoolTaskImpl::Analyze','RasterTaskImpl::Analyze','cc::AnalyzeTask','AnalyzeTask'];function getTileFromRasterTaskSlice(slice){if(!(isSliceDoingRasterization(slice)||isSliceDoingAnalysis(slice))){return undefined;}
+let tileData;if(slice.args.data){tileData=slice.args.data;}else{tileData=slice.args.tileData;}
+if(tileData===undefined)return undefined;if(tileData.tile_id)return tileData.tile_id;const tile=tileData.tileId;if(!(tile instanceof tr.e.cc.TileSnapshot)){return undefined;}
+return tileData.tileId;}
+function isSliceDoingRasterization(slice){return knownRasterTaskNames.includes(slice.title);}
+function isSliceDoingAnalysis(slice){return knownAnalysisTaskNames.includes(slice.title);}
+return{getTileFromRasterTaskSlice,isSliceDoingRasterization,isSliceDoingAnalysis};});'use strict';tr.exportTo('tr.ui.analysis',function(){const AnalysisSubView={set tabLabel(label){Polymer.dom(this).setAttribute('tab-label',label);},get tabLabel(){return this.getAttribute('tab-label');},get requiresTallView(){return false;},get relatedEventsToHighlight(){return undefined;},set selection(selection){throw new Error('Not implemented!');},get selection(){throw new Error('Not implemented!');}};const allTypeInfosByEventProto=new Map();let onlyRootTypeInfosByEventProto=undefined;let eventProtoToRootTypeInfoMap=undefined;function AnalysisSubViewTypeInfo(eventConstructor,options){if(options.multi===undefined){throw new Error('missing field: multi');}
+if(options.title===undefined){throw new Error('missing field: title');}
+this.eventConstructor=eventConstructor;this.singleTagName=undefined;this.singleTitle=undefined;this.multiTagName=undefined;this.multiTitle=undefined;this.childrenTypeInfos_=undefined;}
+AnalysisSubViewTypeInfo.prototype={get childrenTypeInfos(){return this.childrenTypeInfos_;},resetchildrenTypeInfos(){this.childrenTypeInfos_=[];}};AnalysisSubView.register=function(tagName,eventConstructor,options){let typeInfo=allTypeInfosByEventProto.get(eventConstructor.prototype);if(typeInfo===undefined){typeInfo=new AnalysisSubViewTypeInfo(eventConstructor,options);allTypeInfosByEventProto.set(typeInfo.eventConstructor.prototype,typeInfo);onlyRootTypeInfosByEventProto=undefined;}
+if(!options.multi){if(typeInfo.singleTagName!==undefined){throw new Error('SingleTagName already set');}
+typeInfo.singleTagName=tagName;typeInfo.singleTitle=options.title;}else{if(typeInfo.multiTagName!==undefined){throw new Error('MultiTagName already set');}
+typeInfo.multiTagName=tagName;typeInfo.multiTitle=options.title;}
+return typeInfo;};function rebuildRootSubViewTypeInfos(){onlyRootTypeInfosByEventProto=new Map();allTypeInfosByEventProto.forEach(function(typeInfo){typeInfo.resetchildrenTypeInfos();});allTypeInfosByEventProto.forEach(function(typeInfo,eventProto){const eventPrototype=typeInfo.eventConstructor.prototype;let lastEventProto=eventPrototype;let curEventProto=eventPrototype.__proto__;while(true){if(!allTypeInfosByEventProto.has(curEventProto)){const rootTypeInfo=allTypeInfosByEventProto.get(lastEventProto);const rootEventProto=lastEventProto;const isNew=onlyRootTypeInfosByEventProto.has(rootEventProto);onlyRootTypeInfosByEventProto.set(rootEventProto,rootTypeInfo);break;}
+lastEventProto=curEventProto;curEventProto=curEventProto.__proto__;}});allTypeInfosByEventProto.forEach(function(typeInfo,eventProto){const eventPrototype=typeInfo.eventConstructor.prototype;const parentEventProto=eventPrototype.__proto__;const parentTypeInfo=allTypeInfosByEventProto.get(parentEventProto);if(!parentTypeInfo)return;parentTypeInfo.childrenTypeInfos.push(typeInfo);});eventProtoToRootTypeInfoMap=new Map();allTypeInfosByEventProto.forEach(function(typeInfo,eventProto){const eventPrototype=typeInfo.eventConstructor.prototype;let curEventProto=eventPrototype;while(true){if(onlyRootTypeInfosByEventProto.has(curEventProto)){const rootTypeInfo=onlyRootTypeInfosByEventProto.get(curEventProto);eventProtoToRootTypeInfoMap.set(eventPrototype,rootTypeInfo);break;}
+curEventProto=curEventProto.__proto__;}});}
+function findLowestTypeInfoForEvents(thisTypeInfo,events){if(events.length===0)return thisTypeInfo;const event0=tr.b.getFirstElement(events);let candidateSubTypeInfo;for(let i=0;i<thisTypeInfo.childrenTypeInfos.length;i++){const childTypeInfo=thisTypeInfo.childrenTypeInfos[i];if(event0 instanceof childTypeInfo.eventConstructor){candidateSubTypeInfo=childTypeInfo;break;}}
+if(!candidateSubTypeInfo)return thisTypeInfo;let allMatch=true;for(const event of events){if(event instanceof candidateSubTypeInfo.eventConstructor)continue;allMatch=false;break;}
+if(!allMatch){return thisTypeInfo;}
+return findLowestTypeInfoForEvents(candidateSubTypeInfo,events);}
+const primaryEventProtoToTypeInfoMap=new Map();function getRootTypeInfoForEvent(event){const curProto=event.__proto__;const typeInfo=primaryEventProtoToTypeInfoMap.get(curProto);if(typeInfo)return typeInfo;return getRootTypeInfoForEventSlow(event);}
+function getRootTypeInfoForEventSlow(event){let typeInfo;let curProto=event.__proto__;while(true){if(curProto===Object.prototype){throw new Error('No view registered for '+event.toString());}
+typeInfo=onlyRootTypeInfosByEventProto.get(curProto);if(typeInfo){primaryEventProtoToTypeInfoMap.set(event.__proto__,typeInfo);return typeInfo;}
+curProto=curProto.__proto__;}}
+AnalysisSubView.getEventsOrganizedByTypeInfo=function(selection){if(onlyRootTypeInfosByEventProto===undefined){rebuildRootSubViewTypeInfos();}
+const eventsByRootTypeInfo=tr.b.groupIntoMap(selection,function(event){return getRootTypeInfoForEvent(event);},this,tr.model.EventSet);const eventsByLowestTypeInfo=new Map();eventsByRootTypeInfo.forEach(function(events,typeInfo){const lowestTypeInfo=findLowestTypeInfoForEvents(typeInfo,events);eventsByLowestTypeInfo.set(lowestTypeInfo,events);});return eventsByLowestTypeInfo;};return{AnalysisSubView,AnalysisSubViewTypeInfo,};});Polymer({is:'tr-ui-a-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView]});'use strict';Polymer({is:'tr-ui-a-stack-frame',ready(){this.stackFrame_=undefined;this.$.table.tableColumns=[];this.$.table.showHeader=true;},get stackFrame(){return this.stackFrame_;},set stackFrame(stackFrame){const table=this.$.table;this.stackFrame_=stackFrame;if(stackFrame===undefined){table.tableColumns=[];table.tableRows=[];table.rebuild();return;}
+let hasName=false;let hasTitle=false;table.tableRows=stackFrame.stackTrace;table.tableRows.forEach(function(row){hasName|=row.name!==undefined;hasTitle|=row.title!==undefined;});const cols=[];if(hasName){cols.push({title:'Name',value(row){return row.name;}});}
+if(hasTitle){cols.push({title:'Title',value(row){return row.title;}});}
+table.tableColumns=cols;table.rebuild();},tableForTesting(){return this.$.table;}});'use strict';Polymer({is:'tr-ui-a-single-event-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],properties:{isFlow:{type:Boolean,value:false}},ready(){this.currentSelection_=undefined;this.$.table.tableColumns=[{title:'Label',value(row){return row.name;},width:'150px'},{title:'Value',width:'100%',value(row){return row.value;}}];this.$.table.showHeader=false;},get selection(){return this.currentSelection_;},set selection(selection){if(selection.length!==1){throw new Error('Only supports single slices');}
+this.setSelectionWithoutErrorChecks(selection);},setSelectionWithoutErrorChecks(selection){this.currentSelection_=selection;this.updateContents_();},getFlowEventRows_(event){const rows=this.getEventRowsHelper_(event);rows.splice(0,0,{name:'ID',value:event.id});function createLinkTo(slice){const linkEl=document.createElement('tr-ui-a-analysis-link');linkEl.setSelectionAndContent(function(){return new tr.model.EventSet(slice);});Polymer.dom(linkEl).textContent=slice.userFriendlyName;return linkEl;}
+rows.push({name:'From',value:createLinkTo(event.startSlice)});rows.push({name:'To',value:createLinkTo(event.endSlice)});return rows;},getEventRowsHelper_(event){const rows=[];if(event.error){rows.push({name:'Error',value:event.error});}
+if(event.title){rows.push({name:'Title',value:event.title});}
+if(event.category){rows.push({name:'Category',value:event.category});}
+if(event.model!==undefined){const ufc=event.model.getUserFriendlyCategoryFromEvent(event);if(ufc!==undefined){rows.push({name:'User Friendly Category',value:ufc});}}
+if(event.name){rows.push({name:'Name',value:event.name});}
+rows.push({name:'Start',value:tr.v.ui.createScalarSpan(event.start,{unit:tr.b.Unit.byName.timeStampInMs})});if(event.duration){rows.push({name:'Wall Duration',value:tr.v.ui.createScalarSpan(event.duration,{unit:tr.b.Unit.byName.timeDurationInMs})});}
+if(event.cpuDuration){rows.push({name:'CPU Duration',value:tr.v.ui.createScalarSpan(event.cpuDuration,{unit:tr.b.Unit.byName.timeDurationInMs})});}
+if(event.subSlices!==undefined&&event.subSlices.length!==0){if(event.selfTime){rows.push({name:'Self Time',value:tr.v.ui.createScalarSpan(event.selfTime,{unit:tr.b.Unit.byName.timeDurationInMs})});}
+if(event.cpuSelfTime){const cpuSelfTimeEl=tr.v.ui.createScalarSpan(event.cpuSelfTime,{unit:tr.b.Unit.byName.timeDurationInMs});if(event.cpuSelfTime>event.selfTime){cpuSelfTimeEl.warning=' Note that CPU Self Time is larger than Self Time. '+'This is a known limitation of this system, which occurs '+'due to several subslices, rounding issues, and imprecise '+'time at which we get cpu- and real-time.';}
+rows.push({name:'CPU Self Time',value:cpuSelfTimeEl});}}
+if(event.durationInUserTime){rows.push({name:'Duration (U)',value:tr.v.ui.createScalarSpan(event.durationInUserTime,{unit:tr.b.Unit.byName.timeDurationInMs})});}
+function createStackFrameEl(sf){const sfEl=document.createElement('tr-ui-a-stack-frame');sfEl.stackFrame=sf;return sfEl;}
+if(event.startStackFrame&&event.endStackFrame){if(event.startStackFrame===event.endStackFrame){rows.push({name:'Start+End Stack Trace',value:createStackFrameEl(event.startStackFrame)});}else{rows.push({name:'Start Stack Trace',value:createStackFrameEl(event.startStackFrame)});rows.push({name:'End Stack Trace',value:createStackFrameEl(event.endStackFrame)});}}else if(event.startStackFrame){rows.push({name:'Start Stack Trace',value:createStackFrameEl(event.startStackFrame)});}else if(event.endStackFrame){rows.push({name:'End Stack Trace',value:createStackFrameEl(event.endStackFrame)});}
+if(event.info){const descriptionEl=tr.ui.b.createDiv({textContent:event.info.description,maxWidth:'300px'});rows.push({name:'Description',value:descriptionEl});if(event.info.docLinks){event.info.docLinks.forEach(function(linkObject){const linkEl=document.createElement('a');linkEl.target='_blank';linkEl.href=linkObject.href;Polymer.dom(linkEl).textContent=Polymer.dom(linkObject).textContent;rows.push({name:linkObject.label,value:linkEl});});}}
+if(event.associatedAlerts.length){const alertSubRows=[];event.associatedAlerts.forEach(function(alert){const linkEl=document.createElement('tr-ui-a-analysis-link');linkEl.setSelectionAndContent(function(){return new tr.model.EventSet(alert);},alert.info.description);alertSubRows.push({name:alert.title,value:linkEl});});rows.push({name:'Alerts',value:'',isExpanded:true,subRows:alertSubRows});}
+return rows;},getEventRows_(event){if(this.isFlow){return this.getFlowEventRows_(event);}
+return this.getEventRowsHelper_(event);},addArgsToRows_(rows,args){let n=0;for(const argName in args){n+=1;}
+if(n>0){const subRows=[];for(const argName in args){n+=1;}
+if(n>0){const subRows=[];for(const argName in args){const argView=document.createElement('tr-ui-a-generic-object-view');argView.object=args[argName];subRows.push({name:argName,value:argView});}
+rows.push({name:'Args',value:'',isExpanded:true,subRows});}}},addContextsToRows_(rows,contexts){if(contexts.length){const subRows=contexts.map(function(context){const contextView=document.createElement('tr-ui-a-generic-object-view');contextView.object=context;return{name:'Context',value:contextView};});rows.push({name:'Contexts',value:'',isExpanded:true,subRows});}},updateContents_(){if(this.currentSelection_===undefined){this.$.table.rows=[];this.$.table.rebuild();return;}
+const event=tr.b.getOnlyElement(this.currentSelection_);const rows=this.getEventRows_(event);if(event.argsStripped){rows.push({name:'Args',value:'Stripped'});}else{this.addArgsToRows_(rows,event.args);}
+this.addContextsToRows_(rows,event.contexts);const customizeRowsEvent=new tr.b.Event('customize-rows');customizeRowsEvent.rows=rows;this.dispatchEvent(customizeRowsEvent);this.$.table.tableRows=rows;this.$.table.rebuild();}});'use strict';Polymer({is:'tr-ui-e-chrome-cc-raster-task-view',created(){this.selection_=undefined;},set selection(selection){this.selection_=selection;this.updateContents_();},updateColumns_(hadCpuDurations){const timeSpanConfig={unit:tr.b.Unit.byName.timeDurationInMs,ownerDocument:this.ownerDocument};const columns=[{title:'Layer',value(row){if(row.isTotals)return'Totals';if(row.layer){const linkEl=document.createElement('tr-ui-a-analysis-link');linkEl.setSelectionAndContent(function(){return new tr.ui.e.chrome.cc.LayerSelection(costs.layer);},'Layer '+row.layerId);return linkEl;}
+return'Layer '+row.layerId;},width:'250px'},{title:'Num Tiles',value(row){return row.numTiles;},cmp(a,b){return a.numTiles-b.numTiles;}},{title:'Num Analysis Tasks',value(row){return row.numAnalysisTasks;},cmp(a,b){return a.numAnalysisTasks-b.numAnalysisTasks;}},{title:'Num Raster Tasks',value(row){return row.numRasterTasks;},cmp(a,b){return a.numRasterTasks-b.numRasterTasks;}},{title:'Wall Duration (ms)',value(row){return tr.v.ui.createScalarSpan(row.duration,timeSpanConfig);},cmp(a,b){return a.duration-b.duration;}}];if(hadCpuDurations){columns.push({title:'CPU Duration (ms)',value(row){return tr.v.ui.createScalarSpan(row.cpuDuration,timeSpanConfig);},cmp(a,b){return a.cpuDuration-b.cpuDuration;}});}
+let colWidthPercentage;if(columns.length===1){colWidthPercentage='100%';}else{colWidthPercentage=(100/(columns.length-1)).toFixed(3)+'%';}
+for(let i=1;i<columns.length;i++){columns[i].width=colWidthPercentage;}
+this.$.content.tableColumns=columns;this.$.content.sortColumnIndex=columns.length-1;},updateContents_(){const table=this.$.content;if(this.selection_.length===0){this.$.link.setSelectionAndContent(undefined,'');table.tableRows=[];table.footerRows=[];table.rebuild();return;}
+const lthi=tr.e.cc.getTileFromRasterTaskSlice(tr.b.getFirstElement(this.selection_)).containingSnapshot;this.$.link.setSelectionAndContent(function(){return new tr.model.EventSet(lthi);},lthi.userFriendlyName);const costsByLayerId={};function getCurrentCostsForLayerId(tile){const layerId=tile.layerId;const lthi=tile.containingSnapshot;let layer;if(lthi.activeTree){layer=lthi.activeTree.findLayerWithId(layerId);}
+if(layer===undefined&&lthi.pendingTree){layer=lthi.pendingTree.findLayerWithId(layerId);}
+if(costsByLayerId[layerId]===undefined){costsByLayerId[layerId]={layerId,layer,numTiles:0,numAnalysisTasks:0,numRasterTasks:0,duration:0,cpuDuration:0};}
+return costsByLayerId[layerId];}
+let totalDuration=0;let totalCpuDuration=0;let totalNumAnalyzeTasks=0;let totalNumRasterizeTasks=0;let hadCpuDurations=false;const tilesThatWeHaveSeen={};this.selection_.forEach(function(slice){const tile=tr.e.cc.getTileFromRasterTaskSlice(slice);const curCosts=getCurrentCostsForLayerId(tile);if(!tilesThatWeHaveSeen[tile.objectInstance.id]){tilesThatWeHaveSeen[tile.objectInstance.id]=true;curCosts.numTiles+=1;}
+if(tr.e.cc.isSliceDoingAnalysis(slice)){curCosts.numAnalysisTasks+=1;totalNumAnalyzeTasks+=1;}else{curCosts.numRasterTasks+=1;totalNumRasterizeTasks+=1;}
+curCosts.duration+=slice.duration;totalDuration+=slice.duration;if(slice.cpuDuration!==undefined){curCosts.cpuDuration+=slice.cpuDuration;totalCpuDuration+=slice.cpuDuration;hadCpuDurations=true;}});this.updateColumns_(hadCpuDurations);table.tableRows=Object.values(costsByLayerId);table.rebuild();table.footerRows=[{isTotals:true,numTiles:Object.keys(tilesThatWeHaveSeen).length,numAnalysisTasks:totalNumAnalyzeTasks,numRasterTasks:totalNumRasterizeTasks,duration:totalDuration,cpuDuration:totalCpuDuration}];}});'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){function RasterTaskSelection(selection){tr.ui.e.chrome.cc.Selection.call(this);const whySupported=RasterTaskSelection.whySuported(selection);if(!whySupported.ok){throw new Error('Fail: '+whySupported.why);}
+this.slices_=tr.b.asArray(selection);this.tiles_=this.slices_.map(function(slice){const tile=tr.e.cc.getTileFromRasterTaskSlice(slice);if(tile===undefined){throw new Error('This should never happen due to .supports check.');}
+return tile;});}
+RasterTaskSelection.whySuported=function(selection){if(!(selection instanceof tr.model.EventSet)){return{ok:false,why:'Must be selection'};}
+if(selection.length===0){return{ok:false,why:'Selection must be non empty'};}
+let referenceSnapshot=undefined;for(const event of selection){if(!(event instanceof tr.model.Slice)){return{ok:false,why:'Not a slice'};}
+const tile=tr.e.cc.getTileFromRasterTaskSlice(event);if(tile===undefined){return{ok:false,why:'No tile found'};}
+if(!referenceSnapshot){referenceSnapshot=tile.containingSnapshot;}else{if(tile.containingSnapshot!==referenceSnapshot){return{ok:false,why:'Raster tasks are from different compositor instances'};}}}
+return{ok:true};};RasterTaskSelection.supports=function(selection){return RasterTaskSelection.whySuported(selection).ok;};RasterTaskSelection.prototype={__proto__:tr.ui.e.chrome.cc.Selection.prototype,get specicifity(){return 3;},get associatedLayerId(){const tile0=this.tiles_[0];const allSameLayer=this.tiles_.every(function(tile){tile.layerId===tile0.layerId;});if(allSameLayer){return tile0.layerId;}
+return undefined;},get extraHighlightsByLayerId(){const highlights={};this.tiles_.forEach(function(tile,i){if(highlights[tile.layerId]===undefined){highlights[tile.layerId]=[];}
+const slice=this.slices_[i];highlights[tile.layerId].push({colorKey:slice.title,rect:tile.layerRect});},this);return highlights;},createAnalysis(){const sel=new tr.model.EventSet();this.slices_.forEach(function(slice){sel.push(slice);});let analysis;if(sel.length===1){analysis=document.createElement('tr-ui-a-single-event-sub-view');}else{analysis=document.createElement('tr-ui-e-chrome-cc-raster-task-view');}
+analysis.selection=sel;return analysis;},findEquivalent(lthi){return undefined;},get containingSnapshot(){return this.tiles_[0].containingSnapshot;}};return{RasterTaskSelection,};});'use strict';tr.exportTo('tr.ui.e.chrome.cc',function(){const TileSnapshotView=tr.ui.b.define('tr-ui-e-chrome-cc-tile-snapshot-view',tr.ui.analysis.ObjectSnapshotView);TileSnapshotView.prototype={__proto__:tr.ui.analysis.ObjectSnapshotView.prototype,decorate(){Polymer.dom(this).classList.add('tr-ui-e-chrome-cc-tile-snapshot-view');this.layerTreeView_=new tr.ui.e.chrome.cc.LayerTreeHostImplSnapshotView();Polymer.dom(this).appendChild(this.layerTreeView_);},updateContents(){const tile=this.objectSnapshot_;const layerTreeHostImpl=tile.containingSnapshot;if(!layerTreeHostImpl)return;this.layerTreeView_.objectSnapshot=layerTreeHostImpl;this.layerTreeView_.selection=new tr.ui.e.chrome.cc.TileSelection(tile);}};tr.ui.analysis.ObjectSnapshotView.register(TileSnapshotView,{typeName:'cc::Tile',showInTrackView:false});return{TileSnapshotView,};});'use strict';tr.exportTo('tr.e.gpu',function(){const AsyncSlice=tr.model.AsyncSlice;function GpuAsyncSlice(){AsyncSlice.apply(this,arguments);}
+GpuAsyncSlice.prototype={__proto__:AsyncSlice.prototype,get viewSubGroupTitle(){if(this.args.channel){if(this.category==='disabled-by-default-gpu.device'){return'Device.'+this.args.channel;}
+return'Service.'+this.args.channel;}
+return this.title;}};AsyncSlice.subTypes.register(GpuAsyncSlice,{categoryParts:['disabled-by-default-gpu.device','disabled-by-default-gpu.service']});return{GpuAsyncSlice,};});'use strict';tr.exportTo('tr.e.gpu',function(){const ObjectSnapshot=tr.model.ObjectSnapshot;function StateSnapshot(){ObjectSnapshot.apply(this,arguments);}
+StateSnapshot.prototype={__proto__:ObjectSnapshot.prototype,preInitialize(){this.screenshot_=undefined;},initialize(){if(this.args.screenshot){this.screenshot_=this.args.screenshot;}},get screenshot(){return this.screenshot_;}};ObjectSnapshot.subTypes.register(StateSnapshot,{typeName:'gpu::State'});return{StateSnapshot,};});'use strict';tr.exportTo('tr.ui.e.chrome.gpu',function(){const StateSnapshotView=tr.ui.b.define('tr-ui-e-chrome-gpu-state-snapshot-view',tr.ui.analysis.ObjectSnapshotView);StateSnapshotView.prototype={__proto__:tr.ui.analysis.ObjectSnapshotView.prototype,decorate(){Polymer.dom(this).classList.add('tr-ui-e-chrome-gpu-state-snapshot-view');this.screenshotImage_=document.createElement('img');Polymer.dom(this).appendChild(this.screenshotImage_);},updateContents(){if(this.objectSnapshot_&&this.objectSnapshot_.screenshot){this.screenshotImage_.src='data:image/png;base64,'+
+this.objectSnapshot_.screenshot;}}};tr.ui.analysis.ObjectSnapshotView.register(StateSnapshotView,{typeName:'gpu::State'});return{StateSnapshotView,};});'use strict';tr.exportTo('tr.ui.analysis',function(){Polymer({is:'tr-ui-a-layout-tree-sub-view',behaviors:['tr-ui-a-sub-view'],set selection(selection){this.currentSelection_=selection;this.updateContents_();},get selection(){return this.currentSelection_;},updateContents_(){this.set('$.content.textContent','');if(!this.currentSelection_)return;const columns=[{title:'Tag/Name',value(layoutObject){return layoutObject.tag||':'+layoutObject.name;}},{title:'htmlId',value(layoutObject){return layoutObject.htmlId||'';}},{title:'classNames',value(layoutObject){return layoutObject.classNames||'';}},{title:'reasons',value(layoutObject){return layoutObject.needsLayoutReasons.join(', ');}},{title:'width',value(layoutObject){return layoutObject.absoluteRect.width;}},{title:'height',value(layoutObject){return layoutObject.absoluteRect.height;}},{title:'absX',value(layoutObject){return layoutObject.absoluteRect.left;}},{title:'absY',value(layoutObject){return layoutObject.absoluteRect.top;}},{title:'relX',value(layoutObject){return layoutObject.relativeRect.left;}},{title:'relY',value(layoutObject){return layoutObject.relativeRect.top;}},{title:'float',value(layoutObject){return layoutObject.isFloat?'float':'';}},{title:'positioned',value(layoutObject){return layoutObject.isPositioned?'positioned':'';}},{title:'relative',value(layoutObject){return layoutObject.isRelativePositioned?'relative':'';}},{title:'sticky',value(layoutObject){return layoutObject.isStickyPositioned?'sticky':'';}},{title:'anonymous',value(layoutObject){return layoutObject.isAnonymous?'anonymous':'';}},{title:'row',value(layoutObject){if(layoutObject.tableRow===undefined){return'';}
+return layoutObject.tableRow;}},{title:'col',value(layoutObject){if(layoutObject.tableCol===undefined){return'';}
+return layoutObject.tableCol;}},{title:'rowSpan',value(layoutObject){if(layoutObject.tableRowSpan===undefined){return'';}
+return layoutObject.tableRowSpan;}},{title:'colSpan',value(layoutObject){if(layoutObject.tableColSpan===undefined){return'';}
+return layoutObject.tableColSpan;}},{title:'address',value(layoutObject){return layoutObject.id.toString(16);}}];const table=this.ownerDocument.createElement('tr-ui-b-table');table.defaultExpansionStateCallback=function(layoutObject,parentLayoutObject){return true;};table.subRowsPropertyName='childLayoutObjects';table.tableColumns=columns;table.tableRows=this.currentSelection_.map(function(snapshot){return snapshot.rootLayoutObject;});table.rebuild();Polymer.dom(this.$.content).appendChild(table);},});return{};});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-layout-tree-sub-view',tr.e.chrome.LayoutTreeSnapshot,{multi:false,title:'Layout Tree',});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-layout-tree-sub-view',tr.e.chrome.LayoutTreeSnapshot,{multi:true,title:'Layout Trees',});'use strict';tr.exportTo('tr.ui.behaviors',function(){const SidePanel={get rangeOfInterest(){throw new Error('Not implemented');},set rangeOfInterest(rangeOfInterest){throw new Error('Not implemented');},get selection(){throw new Error('Not implemented');},set selection(selection){throw new Error('Not implemented');},get model(){throw new Error('Not implemented');},set model(model){throw new Error('Not implemented');},supportsModel(m){throw new Error('Not implemented');}};return{SidePanel,};});'use strict';tr.exportTo('tr.ui.side_panel',function(){function SidePanelRegistry(){}
+const options=new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE);tr.b.decorateExtensionRegistry(SidePanelRegistry,options);return{SidePanelRegistry,};});'use strict';tr.exportTo('tr.ui.e.s',function(){const BlameContextSnapshot=tr.e.chrome.BlameContextSnapshot;const FrameTreeNodeSnapshot=tr.e.chrome.FrameTreeNodeSnapshot;const RenderFrameSnapshot=tr.e.chrome.RenderFrameSnapshot;const TopLevelSnapshot=tr.e.chrome.TopLevelSnapshot;const BlameContextInstance=tr.e.chrome.BlameContextInstance;const FrameTreeNodeInstance=tr.e.chrome.FrameTreeNodeInstance;const RenderFrameInstance=tr.e.chrome.RenderFrameInstance;const TopLevelInstance=tr.e.chrome.TopLevelInstance;function Row(context){this.subRows=undefined;this.contexts=[];this.type=undefined;this.renderer='N/A';this.url=undefined;this.time=0;this.eventsOfInterest=new tr.model.EventSet();if(context===undefined)return;this.type=context.objectInstance.blameContextType;this.contexts.push(context);if(context instanceof FrameTreeNodeSnapshot){if(context.renderFrame){this.contexts.push(context.renderFrame);this.renderer=context.renderFrame.objectInstance.parent.pid;}}else if(context instanceof RenderFrameSnapshot){if(context.frameTreeNode){this.contexts.push(context.frameTreeNode);}
+this.renderer=context.objectInstance.parent.pid;}else if(context instanceof TopLevelSnapshot){this.renderer=context.objectInstance.parent.pid;}else{throw new Error('Unknown context type');}
+this.eventsOfInterest.addEventSet(this.contexts);this.url=context.url;}
+const groupFunctions={none:rows=>rows,tree(rows,rowMap){const getParentRow=function(row){let pivot;row.contexts.forEach(function(context){if(context instanceof tr.e.chrome.FrameTreeNodeSnapshot){pivot=context;}});if(pivot&&pivot.parentContext){return rowMap[pivot.parentContext.guid];}
+return undefined;};const rootRows=[];rows.forEach(function(row){const parentRow=getParentRow(row);if(parentRow===undefined){rootRows.push(row);return;}
+if(parentRow.subRows===undefined){parentRow.subRows=[];}
+parentRow.subRows.push(row);});const aggregateAllDescendants=function(row){if(!row.subRows){if(getParentRow(row)){row.type='Subframe';}
+return row;}
+const result=new Row();result.type='Frame Tree';result.renderer=row.renderer;result.url=row.url;result.subRows=[row];row.subRows.forEach(subRow=>result.subRows.push(aggregateAllDescendants(subRow)));result.subRows.forEach(function(subRow){result.time+=subRow.time;result.eventsOfInterest.addEventSet(subRow.eventsOfInterest);});row.subRows=undefined;return result;};return rootRows.map(rootRow=>aggregateAllDescendants(rootRow));}};Polymer({is:'tr-ui-e-s-frame-data-side-panel',behaviors:[tr.ui.behaviors.SidePanel],ready(){this.model_=undefined;this.rangeOfInterest_=new tr.b.math.Range();this.$.table.showHeader=true;this.$.table.selectionMode=tr.ui.b.TableFormat.SelectionMode.ROW;this.$.table.tableColumns=this.createFrameDataTableColumns_();this.$.table.addEventListener('selection-changed',function(e){this.selectEventSet_(this.$.table.selectedTableRow.eventsOfInterest);}.bind(this));this.$.select.addEventListener('change',function(e){this.updateContents_();}.bind(this));},selectEventSet_(eventSet){const event=new tr.model.RequestSelectionChangeEvent();event.selection=eventSet;this.dispatchEvent(event);},createFrameDataTableColumns_(){return[{title:'Renderer',value:row=>row.renderer,cmp:(a,b)=>a.renderer-b.renderer},{title:'Type',value:row=>row.type},{title:'Time',value:row=>tr.v.ui.createScalarSpan(row.time,{unit:tr.b.Unit.byName.timeStampInMs,ownerDocument:this.ownerDocument}),cmp:(a,b)=>a.time-b.time},{title:'URL',value:row=>row.url,cmp:(a,b)=>(a.url||'').localeCompare(b.url||'')}];},createFrameDataTableRows_(){if(!this.model_)return[];const rows=[];const rowMap={};for(const proc of Object.values(this.model_.processes)){proc.objects.iterObjectInstances(function(objectInstance){if(!(objectInstance instanceof BlameContextInstance)){return;}
+objectInstance.snapshots.forEach(function(snapshot){if(rowMap[snapshot.guid])return;const row=new Row(snapshot);row.contexts.forEach(context=>rowMap[context.guid]=row);rows.push(row);},this);},this);}
+for(const proc of Object.values(this.model_.processes)){for(const thread of Object.values(proc.threads)){thread.sliceGroup.iterSlicesInTimeRange(function(topLevelSlice){topLevelSlice.contexts.forEach(function(context){if(!context.snapshot.guid||!rowMap[context.snapshot.guid]){return;}
+const row=rowMap[context.snapshot.guid];row.eventsOfInterest.push(topLevelSlice);row.time+=topLevelSlice.selfTime||0;});},this.currentRangeOfInterest.min,this.currentRangeOfInterest.max);}}
+const select=this.$.select;const groupOption=select.options[select.selectedIndex].value;const groupFunction=groupFunctions[groupOption];return groupFunction(rows,rowMap);},updateContents_(){this.$.table.tableRows=this.createFrameDataTableRows_();this.$.table.rebuild();},supportsModel(m){if(!m){return{supported:false,reason:'No model available.'};}
+const ans={supported:false};for(const proc of Object.values(m.processes)){proc.objects.iterObjectInstances(function(instance){if(instance instanceof BlameContextInstance){ans.supported=true;}});}
+if(!ans.supported){ans.reason='No frame data available';}
+return ans;},get currentRangeOfInterest(){if(this.rangeOfInterest_.isEmpty){return this.model_.bounds;}
+return this.rangeOfInterest_;},get rangeOfInterest(){return this.rangeOfInterest_;},set rangeOfInterest(rangeOfInterest){this.rangeOfInterest_=rangeOfInterest;this.updateContents_();},get selection(){},set selection(_){},get textLabel(){return'Frame Data';},get model(){return this.model_;},set model(model){this.model_=model;this.updateContents_();}});tr.ui.side_panel.SidePanelRegistry.register(function(){return document.createElement('tr-ui-e-s-frame-data-side-panel');});});'use strict';Polymer({is:'tr-ui-b-chart-legend-key',ready(){this.$.checkbox.addEventListener('change',this.onCheckboxChange_.bind(this));},onCheckboxChange_(){tr.b.dispatchSimpleEvent(this,tr.ui.b.DataSeriesEnableChangeEventType,true,false,{key:Polymer.dom(this).textContent,enabled:this.enabled});},set textContent(t){Polymer.dom(this.$.label).textContent=t;Polymer.dom(this.$.link).textContent=t;this.updateContents_();},set width(w){w-=20;this.$.link.style.width=w+'px';this.$.label.style.width=w+'px';},get textContent(){return Polymer.dom(this.$.label).textContent;},set optional(optional){this.$.checkbox.style.visibility=optional?'visible':'hidden';},get optional(){return this.$.checkbox.style.visibility==='visible';},set enabled(enabled){this.$.checkbox.checked=enabled?'checked':'';},get enabled(){return this.$.checkbox.checked;},set color(c){this.$.label.style.color=c;this.$.link.color=c;},set target(target){this.$.link.setSelectionAndContent(target,Polymer.dom(this.$.label).textContent);this.updateContents_();},get target(){return this.$.link.selection;},set title(title){this.$.link.title=title;},updateContents_(){this.$.link.style.display=this.target?'':'none';this.$.label.style.display=this.target?'none':'';this.$.label.htmlFor=this.optional?'checkbox':'';}});'use strict';(function(window){window.define=function(x){window.d3=x;};window.define.amd=true;})(this);!function(){function n(n){return null!=n&&!isNaN(n)}function t(n){return n.length}function e(n){for(var t=1;n*t%1;)t*=10;return t}function r(n,t){try{for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}catch(r){n.prototype=t}}function u(){}function i(n){return aa+n in this}function o(n){return n=aa+n,n in this&&delete this[n]}function a(){var n=[];return this.forEach(function(t){n.push(t)}),n}function c(){var n=0;for(var t in this)t.charCodeAt(0)===ca&&++n;return n}function s(){for(var n in this)if(n.charCodeAt(0)===ca)return!1;return!0}function l(){}function f(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function h(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.substring(1);for(var e=0,r=sa.length;r>e;++e){var u=sa[e]+t;if(u in n)return u}}function g(){}function p(){}function v(n){function t(){for(var t,r=e,u=-1,i=r.length;++u<i;)(t=r[u].on)&&t.apply(this,arguments);return n}var e=[],r=new u;return t.on=function(t,u){var i,o=r.get(t);return arguments.length<2?o&&o.on:(o&&(o.on=null,e=e.slice(0,i=e.indexOf(o)).concat(e.slice(i+1)),r.remove(t)),u&&e.push(r.set(t,{on:u})),n)},t}function d(){Xo.event.preventDefault()}function m(){for(var n,t=Xo.event;n=t.sourceEvent;)t=n;return t}function y(n){for(var t=new p,e=0,r=arguments.length;++e<r;)t[arguments[e]]=v(t);return t.of=function(e,r){return function(u){try{var i=u.sourceEvent=Xo.event;u.target=n,Xo.event=u,t[u.type].apply(e,r)}finally{Xo.event=i}}},t}function x(n){return fa(n,da),n}function M(n){return"function"==typeof n?n:function(){return ha(n,this)}}function _(n){return"function"==typeof n?n:function(){return ga(n,this)}}function b(n,t){function e(){this.removeAttribute(n)}function r(){this.removeAttributeNS(n.space,n.local)}function u(){this.setAttribute(n,t)}function i(){this.setAttributeNS(n.space,n.local,t)}function o(){var e=t.apply(this,arguments);null==e?this.removeAttribute(n):this.setAttribute(n,e)}function a(){var e=t.apply(this,arguments);null==e?this.removeAttributeNS(n.space,n.local):this.setAttributeNS(n.space,n.local,e)}return n=Xo.ns.qualify(n),null==t?n.local?r:e:"function"==typeof t?n.local?a:o:n.local?i:u}function w(n){return n.trim().replace(/\s+/g," ")}function S(n){return new RegExp("(?:^|\\s+)"+Xo.requote(n)+"(?:\\s+|$)","g")}function k(n){return n.trim().split(/^|\s+/)}function E(n,t){function e(){for(var e=-1;++e<u;)n[e](this,t)}function r(){for(var e=-1,r=t.apply(this,arguments);++e<u;)n[e](this,r)}n=k(n).map(A);var u=n.length;return"function"==typeof t?r:e}function A(n){var t=S(n);return function(e,r){if(u=e.classList)return r?u.add(n):u.remove(n);var u=e.getAttribute("class")||"";r?(t.lastIndex=0,t.test(u)||e.setAttribute("class",w(u+" "+n))):e.setAttribute("class",w(u.replace(t," ")))}}function C(n,t,e){function r(){this.style.removeProperty(n)}function u(){this.style.setProperty(n,t,e)}function i(){var r=t.apply(this,arguments);null==r?this.style.removeProperty(n):this.style.setProperty(n,r,e)}return null==t?r:"function"==typeof t?i:u}function N(n,t){function e(){delete this[n]}function r(){this[n]=t}function u(){var e=t.apply(this,arguments);null==e?delete this[n]:this[n]=e}return null==t?e:"function"==typeof t?u:r}function L(n){return"function"==typeof n?n:(n=Xo.ns.qualify(n)).local?function(){return this.ownerDocument.createElementNS(n.space,n.local)}:function(){return this.ownerDocument.createElementNS(this.namespaceURI,n)}}function T(n){return{__data__:n}}function q(n){return function(){return va(this,n)}}function z(n){return arguments.length||(n=Xo.ascending),function(t,e){return t&&e?n(t.__data__,e.__data__):!t-!e}}function R(n,t){for(var e=0,r=n.length;r>e;e++)for(var u,i=n[e],o=0,a=i.length;a>o;o++)(u=i[o])&&t(u,o,e);return n}function D(n){return fa(n,ya),n}function P(n){var t,e;return function(r,u,i){var o,a=n[i].update,c=a.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(o=a[t])&&++t<c;);return o}}function U(){var n=this.__transition__;n&&++n.active}function j(n,t,e){function r(){var t=this[o];t&&(this.removeEventListener(n,t,t.$),delete this[o])}function u(){var u=c(t,Bo(arguments));r.call(this),this.addEventListener(n,this[o]=u,u.$=e),u._=t}function i(){var t,e=new RegExp("^__on([^.]+)"+Xo.requote(n)+"$");for(var r in this)if(t=r.match(e)){var u=this[r];this.removeEventListener(t[1],u,u.$),delete this[r]}}var o="__on"+n,a=n.indexOf("."),c=H;a>0&&(n=n.substring(0,a));var s=Ma.get(n);return s&&(n=s,c=F),a?t?u:r:t?g:i}function H(n,t){return function(e){var r=Xo.event;Xo.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{Xo.event=r}}}function F(n,t){var e=H(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function O(){var n=".dragsuppress-"+ ++ba,t="click"+n,e=Xo.select(Go).on("touchmove"+n,d).on("dragstart"+n,d).on("selectstart"+n,d);if(_a){var r=Jo.style,u=r[_a];r[_a]="none"}return function(i){function o(){e.on(t,null)}e.on(n,null),_a&&(r[_a]=u),i&&(e.on(t,function(){d(),o()},!0),setTimeout(o,0))}}function Y(n,t){t.changedTouches&&(t=t.changedTouches[0]);var e=n.ownerSVGElement||n;if(e.createSVGPoint){var r=e.createSVGPoint();if(0>wa&&(Go.scrollX||Go.scrollY)){e=Xo.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var u=e[0][0].getScreenCTM();wa=!(u.f||u.e),e.remove()}return wa?(r.x=t.pageX,r.y=t.pageY):(r.x=t.clientX,r.y=t.clientY),r=r.matrixTransform(n.getScreenCTM().inverse()),[r.x,r.y]}var i=n.getBoundingClientRect();return[t.clientX-i.left-n.clientLeft,t.clientY-i.top-n.clientTop]}function I(n){return n>0?1:0>n?-1:0}function Z(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function V(n){return n>1?0:-1>n?Sa:Math.acos(n)}function X(n){return n>1?Ea:-1>n?-Ea:Math.asin(n)}function $(n){return((n=Math.exp(n))-1/n)/2}function B(n){return((n=Math.exp(n))+1/n)/2}function W(n){return((n=Math.exp(2*n))-1)/(n+1)}function J(n){return(n=Math.sin(n/2))*n}function G(){}function K(n,t,e){return new Q(n,t,e)}function Q(n,t,e){this.h=n,this.s=t,this.l=e}function nt(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(o-i)*n/60:180>n?o:240>n?i+(o-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,i=2*e-o,gt(u(n+120),u(n),u(n-120))}function tt(n,t,e){return new et(n,t,e)}function et(n,t,e){this.h=n,this.c=t,this.l=e}function rt(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),ut(e,Math.cos(n*=Na)*t,Math.sin(n)*t)}function ut(n,t,e){return new it(n,t,e)}function it(n,t,e){this.l=n,this.a=t,this.b=e}function ot(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=ct(u)*Fa,r=ct(r)*Oa,i=ct(i)*Ya,gt(lt(3.2404542*u-1.5371385*r-.4985314*i),lt(-.969266*u+1.8760108*r+.041556*i),lt(.0556434*u-.2040259*r+1.0572252*i))}function at(n,t,e){return n>0?tt(Math.atan2(e,t)*La,Math.sqrt(t*t+e*e),n):tt(0/0,0/0,n)}function ct(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function st(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function lt(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function ft(n){return gt(n>>16,255&n>>8,255&n)}function ht(n){return ft(n)+""}function gt(n,t,e){return new pt(n,t,e)}function pt(n,t,e){this.r=n,this.g=t,this.b=e}function vt(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function dt(n,t,e){var r,u,i,o,a=0,c=0,s=0;if(u=/([a-z]+)\((.*)\)/i.exec(n))switch(i=u[2].split(","),u[1]){case"hsl":return e(parseFloat(i[0]),parseFloat(i[1])/100,parseFloat(i[2])/100);case"rgb":return t(Mt(i[0]),Mt(i[1]),Mt(i[2]))}return(o=Va.get(n))?t(o.r,o.g,o.b):(null!=n&&"#"===n.charAt(0)&&(r=parseInt(n.substring(1),16),isNaN(r)||(4===n.length?(a=(3840&r)>>4,a=a>>4|a,c=240&r,c=c>>4|c,s=15&r,s=s<<4|s):7===n.length&&(a=(16711680&r)>>16,c=(65280&r)>>8,s=255&r))),t(a,c,s))}function mt(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-i,c=(o+i)/2;return a?(u=.5>c?a/(o+i):a/(2-o-i),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=0/0,u=c>0&&1>c?0:r),K(r,u,c)}function yt(n,t,e){n=xt(n),t=xt(t),e=xt(e);var r=st((.4124564*n+.3575761*t+.1804375*e)/Fa),u=st((.2126729*n+.7151522*t+.072175*e)/Oa),i=st((.0193339*n+.119192*t+.9503041*e)/Ya);return ut(116*u-16,500*(r-u),200*(u-i))}function xt(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function Mt(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function _t(n){return"function"==typeof n?n:function(){return n}}function bt(n){return n}function wt(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),St(t,e,n,r)}}function St(n,t,e,r){function u(){var n,t=c.status;if(!t&&c.responseText||t>=200&&300>t||304===t){try{n=e.call(i,c)}catch(r){return o.error.call(i,r),void 0}o.load.call(i,n)}else o.error.call(i,c)}var i={},o=Xo.dispatch("beforesend","progress","load","error"),a={},c=new XMLHttpRequest,s=null;return!Go.XDomainRequest||"withCredentials"in c||!/^(http(s)?:)?\/\//.test(n)||(c=new XDomainRequest),"onload"in c?c.onload=c.onerror=u:c.onreadystatechange=function(){c.readyState>3&&u()},c.onprogress=function(n){var t=Xo.event;Xo.event=n;try{o.progress.call(i,c)}finally{Xo.event=t}},i.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",i):t},i.responseType=function(n){return arguments.length?(s=n,i):s},i.response=function(n){return e=n,i},["get","post"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(Bo(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&"function"==typeof r&&(u=r,r=null),c.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),c.setRequestHeader)for(var l in a)c.setRequestHeader(l,a[l]);return null!=t&&c.overrideMimeType&&c.overrideMimeType(t),null!=s&&(c.responseType=s),null!=u&&i.on("error",u).on("load",function(n){u(null,n)}),o.beforesend.call(i,c),c.send(null==r?null:r),i},i.abort=function(){return c.abort(),i},Xo.rebind(i,o,"on"),null==r?i:i.get(kt(r))}function kt(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Et(){var n=At(),t=Ct()-n;t>24?(isFinite(t)&&(clearTimeout(Wa),Wa=setTimeout(Et,t)),Ba=0):(Ba=1,Ga(Et))}function At(){var n=Date.now();for(Ja=Xa;Ja;)n>=Ja.t&&(Ja.f=Ja.c(n-Ja.t)),Ja=Ja.n;return n}function Ct(){for(var n,t=Xa,e=1/0;t;)t.f?t=n?n.n=t.n:Xa=t.n:(t.t<e&&(e=t.t),t=(n=t).n);return $a=n,e}function Nt(n,t){return t-(n?Math.ceil(Math.log(n)/Math.LN10):1)}function Lt(n,t){var e=Math.pow(10,3*oa(8-t));return{scale:t>8?function(n){return n/e}:function(n){return n*e},symbol:n}}function Tt(n){var t=n.decimal,e=n.thousands,r=n.grouping,u=n.currency,i=r?function(n){for(var t=n.length,u=[],i=0,o=r[0];t>0&&o>0;)u.push(n.substring(t-=o,t+o)),o=r[i=(i+1)%r.length];return u.reverse().join(e)}:bt;return function(n){var e=Qa.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"",c=e[4]||"",s=e[5],l=+e[6],f=e[7],h=e[8],g=e[9],p=1,v="",d="",m=!1;switch(h&&(h=+h.substring(1)),(s||"0"===r&&"="===o)&&(s=r="0",o="=",f&&(l-=Math.floor((l-1)/4))),g){case"n":f=!0,g="g";break;case"%":p=100,d="%",g="f";break;case"p":p=100,d="%",g="r";break;case"b":case"o":case"x":case"X":"#"===c&&(v="0"+g.toLowerCase());case"c":case"d":m=!0,h=0;break;case"s":p=-1,g="r"}"$"===c&&(v=u[0],d=u[1]),"r"!=g||h||(g="g"),null!=h&&("g"==g?h=Math.max(1,Math.min(21,h)):("e"==g||"f"==g)&&(h=Math.max(0,Math.min(20,h)))),g=nc.get(g)||qt;var y=s&&f;return function(n){var e=d;if(m&&n%1)return"";var u=0>n||0===n&&0>1/n?(n=-n,"-"):a;if(0>p){var c=Xo.formatPrefix(n,h);n=c.scale(n),e=c.symbol+d}else n*=p;n=g(n,h);var x=n.lastIndexOf("."),M=0>x?n:n.substring(0,x),_=0>x?"":t+n.substring(x+1);!s&&f&&(M=i(M));var b=v.length+M.length+_.length+(y?0:u.length),w=l>b?new Array(b=l-b+1).join(r):"";return y&&(M=i(w+M)),u+=v,n=M+_,("<"===o?u+n+w:">"===o?w+u+n:"^"===o?w.substring(0,b>>=1)+u+n+w.substring(b):u+(y?n:w+n))+e}}}function qt(n){return n+""}function zt(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Rt(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new ec(e-1)),1),e}function i(n,e){return t(n=new ec(+n),e),n}function o(n,r,i){var o=u(n),a=[];if(i>1)for(;r>o;)e(o)%i||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{ec=zt;var r=new zt;return r._=n,o(r,t,e)}finally{ec=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=o;var c=n.utc=Dt(n);return c.floor=c,c.round=Dt(r),c.ceil=Dt(u),c.offset=Dt(i),c.range=a,n}function Dt(n){return function(t,e){try{ec=zt;var r=new zt;return r._=t,n(r,e)._}finally{ec=Date}}}function Pt(n){function t(n){function t(t){for(var e,u,i,o=[],a=-1,c=0;++a<r;)37===n.charCodeAt(a)&&(o.push(n.substring(c,a)),null!=(u=uc[e=n.charAt(++a)])&&(e=n.charAt(++a)),(i=C[e])&&(e=i(t,null==u?"e"===e?" ":"0":u)),o.push(e),c=a+1);return o.push(n.substring(c,a)),o.join("")}var r=n.length;return t.parse=function(t){var r={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},u=e(r,n,t,0);if(u!=t.length)return null;"p"in r&&(r.H=r.H%12+12*r.p);var i=null!=r.Z&&ec!==zt,o=new(i?zt:ec);return"j"in r?o.setFullYear(r.y,0,r.j):"w"in r&&("W"in r||"U"in r)?(o.setFullYear(r.y,0,1),o.setFullYear(r.y,0,"W"in r?(r.w+6)%7+7*r.W-(o.getDay()+5)%7:r.w+7*r.U-(o.getDay()+6)%7)):o.setFullYear(r.y,r.m,r.d),o.setHours(r.H+Math.floor(r.Z/100),r.M+r.Z%100,r.S,r.L),i?o._:o},t.toString=function(){return n},t}function e(n,t,e,r){for(var u,i,o,a=0,c=t.length,s=e.length;c>a;){if(r>=s)return-1;if(u=t.charCodeAt(a++),37===u){if(o=t.charAt(a++),i=N[o in uc?t.charAt(a++):o],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){b.lastIndex=0;var r=b.exec(t.substring(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){M.lastIndex=0;var r=M.exec(t.substring(e));return r?(n.w=_.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){E.lastIndex=0;var r=E.exec(t.substring(e));return r?(n.m=A.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.substring(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,C.c.toString(),t,r)}function c(n,t,r){return e(n,C.x.toString(),t,r)}function s(n,t,r){return e(n,C.X.toString(),t,r)}function l(n,t,e){var r=x.get(t.substring(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var f=n.dateTime,h=n.date,g=n.time,p=n.periods,v=n.days,d=n.shortDays,m=n.months,y=n.shortMonths;t.utc=function(n){function e(n){try{ec=zt;var t=new ec;return t._=n,r(t)}finally{ec=Date}}var r=t(n);return e.parse=function(n){try{ec=zt;var t=r.parse(n);return t&&t._}finally{ec=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ee;var x=Xo.map(),M=jt(v),_=Ht(v),b=jt(d),w=Ht(d),S=jt(m),k=Ht(m),E=jt(y),A=Ht(y);p.forEach(function(n,t){x.set(n.toLowerCase(),t)});var C={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return y[n.getMonth()]},B:function(n){return m[n.getMonth()]},c:t(f),d:function(n,t){return Ut(n.getDate(),t,2)},e:function(n,t){return Ut(n.getDate(),t,2)},H:function(n,t){return Ut(n.getHours(),t,2)},I:function(n,t){return Ut(n.getHours()%12||12,t,2)},j:function(n,t){return Ut(1+tc.dayOfYear(n),t,3)},L:function(n,t){return Ut(n.getMilliseconds(),t,3)},m:function(n,t){return Ut(n.getMonth()+1,t,2)},M:function(n,t){return Ut(n.getMinutes(),t,2)},p:function(n){return p[+(n.getHours()>=12)]},S:function(n,t){return Ut(n.getSeconds(),t,2)},U:function(n,t){return Ut(tc.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Ut(tc.mondayOfYear(n),t,2)},x:t(h),X:t(g),y:function(n,t){return Ut(n.getFullYear()%100,t,2)},Y:function(n,t){return Ut(n.getFullYear()%1e4,t,4)},Z:ne,"%":function(){return"%"}},N={a:r,A:u,b:i,B:o,c:a,d:Bt,e:Bt,H:Jt,I:Jt,j:Wt,L:Qt,m:$t,M:Gt,p:l,S:Kt,U:Ot,w:Ft,W:Yt,x:c,X:s,y:Zt,Y:It,Z:Vt,"%":te};return t}function Ut(n,t,e){var r=0>n?"-":"",u=(r?-n:n)+"",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function jt(n){return new RegExp("^(?:"+n.map(Xo.requote).join("|")+")","i")}function Ht(n){for(var t=new u,e=-1,r=n.length;++e<r;)t.set(n[e].toLowerCase(),e);return t}function Ft(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+1));return r?(n.w=+r[0],e+r[0].length):-1}function Ot(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e));return r?(n.U=+r[0],e+r[0].length):-1}function Yt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e));return r?(n.W=+r[0],e+r[0].length):-1}function It(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+4));return r?(n.y=+r[0],e+r[0].length):-1}function Zt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.y=Xt(+r[0]),e+r[0].length):-1}function Vt(n,t,e){return/^[+-]\d{4}$/.test(t=t.substring(e,e+5))?(n.Z=+t,e+5):-1}function Xt(n){return n+(n>68?1900:2e3)}function $t(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function Bt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function Wt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function Jt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function Gt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function Kt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function Qt(n,t,e){ic.lastIndex=0;var r=ic.exec(t.substring(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function ne(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=~~(oa(t)/60),u=oa(t)%60;return e+Ut(r,"0",2)+Ut(u,"0",2)}function te(n,t,e){oc.lastIndex=0;var r=oc.exec(t.substring(e,e+1));return r?e+r[0].length:-1}function ee(n){for(var t=n.length,e=-1;++e<t;)n[e][0]=this(n[e][0]);return function(t){for(var e=0,r=n[e];!r[1](t);)r=n[++e];return r[0](t)}}function re(){}function ue(n,t,e){var r=e.s=n+t,u=r-n,i=r-u;e.t=n-i+(t-u)}function ie(n,t){n&&lc.hasOwnProperty(n.type)&&lc[n.type](n,t)}function oe(n,t,e){var r,u=-1,i=n.length-e;for(t.lineStart();++u<i;)r=n[u],t.point(r[0],r[1],r[2]);t.lineEnd()}function ae(n,t){var e=-1,r=n.length;for(t.polygonStart();++e<r;)oe(n[e],t,1);t.polygonEnd()}function ce(){function n(n,t){n*=Na,t=t*Na/2+Sa/4;var e=n-r,o=e>=0?1:-1,a=o*e,c=Math.cos(t),s=Math.sin(t),l=i*s,f=u*c+l*Math.cos(a),h=l*o*Math.sin(a);hc.add(Math.atan2(h,f)),r=n,u=c,i=s}var t,e,r,u,i;gc.point=function(o,a){gc.point=n,r=(t=o)*Na,u=Math.cos(a=(e=a)*Na/2+Sa/4),i=Math.sin(a)},gc.lineEnd=function(){n(t,e)}}function se(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function le(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function fe(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function he(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function ge(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function pe(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function ve(n){return[Math.atan2(n[1],n[0]),X(n[2])]}function de(n,t){return oa(n[0]-t[0])<Aa&&oa(n[1]-t[1])<Aa}function me(n,t){n*=Na;var e=Math.cos(t*=Na);ye(e*Math.cos(n),e*Math.sin(n),Math.sin(t))}function ye(n,t,e){++pc,dc+=(n-dc)/pc,mc+=(t-mc)/pc,yc+=(e-yc)/pc}function xe(){function n(n,u){n*=Na;var i=Math.cos(u*=Na),o=i*Math.cos(n),a=i*Math.sin(n),c=Math.sin(u),s=Math.atan2(Math.sqrt((s=e*c-r*a)*s+(s=r*o-t*c)*s+(s=t*a-e*o)*s),t*o+e*a+r*c);vc+=s,xc+=s*(t+(t=o)),Mc+=s*(e+(e=a)),_c+=s*(r+(r=c)),ye(t,e,r)}var t,e,r;kc.point=function(u,i){u*=Na;var o=Math.cos(i*=Na);t=o*Math.cos(u),e=o*Math.sin(u),r=Math.sin(i),kc.point=n,ye(t,e,r)}}function Me(){kc.point=me}function _e(){function n(n,t){n*=Na;var e=Math.cos(t*=Na),o=e*Math.cos(n),a=e*Math.sin(n),c=Math.sin(t),s=u*c-i*a,l=i*o-r*c,f=r*a-u*o,h=Math.sqrt(s*s+l*l+f*f),g=r*o+u*a+i*c,p=h&&-V(g)/h,v=Math.atan2(h,g);bc+=p*s,wc+=p*l,Sc+=p*f,vc+=v,xc+=v*(r+(r=o)),Mc+=v*(u+(u=a)),_c+=v*(i+(i=c)),ye(r,u,i)}var t,e,r,u,i;kc.point=function(o,a){t=o,e=a,kc.point=n,o*=Na;var c=Math.cos(a*=Na);r=c*Math.cos(o),u=c*Math.sin(o),i=Math.sin(a),ye(r,u,i)},kc.lineEnd=function(){n(t,e),kc.lineEnd=Me,kc.point=me}}function be(){return!0}function we(n,t,e,r,u){var i=[],o=[];if(n.forEach(function(n){if(!((t=n.length-1)<=0)){var t,e=n[0],r=n[t];if(de(e,r)){u.lineStart();for(var a=0;t>a;++a)u.point((e=n[a])[0],e[1]);return u.lineEnd(),void 0}var c=new ke(e,n,null,!0),s=new ke(e,null,c,!1);c.o=s,i.push(c),o.push(s),c=new ke(r,n,null,!1),s=new ke(r,null,c,!0),c.o=s,i.push(c),o.push(s)}}),o.sort(t),Se(i),Se(o),i.length){for(var a=0,c=e,s=o.length;s>a;++a)o[a].e=c=!c;for(var l,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;l=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var a=0,s=l.length;s>a;++a)u.point((f=l[a])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){l=g.p.z;for(var a=l.length-1;a>=0;--a)u.point((f=l[a])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,l=g.z,p=!p}while(!g.v);u.lineEnd()}}}function Se(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r<t;)u.n=e=n[r],e.p=u,u=e;u.n=e=n[0],e.p=u}}function ke(n,t,e,r){this.x=n,this.z=t,this.o=e,this.e=r,this.v=!1,this.n=this.p=null}function Ee(n,t,e,r){return function(u,i){function o(t,e){var r=u(t,e);n(t=r[0],e=r[1])&&i.point(t,e)}function a(n,t){var e=u(n,t);d.point(e[0],e[1])}function c(){y.point=a,d.lineStart()}function s(){y.point=o,d.lineEnd()}function l(n,t){v.push([n,t]);var e=u(n,t);M.point(e[0],e[1])}function f(){M.lineStart(),v=[]}function h(){l(v[0][0],v[0][1]),M.lineEnd();var n,t=M.clean(),e=x.buffer(),r=e.length;if(v.pop(),p.push(v),v=null,r){if(1&t){n=e[0];var u,r=n.length-1,o=-1;for(i.lineStart();++o<r;)i.point((u=n[o])[0],u[1]);return i.lineEnd(),void 0}r>1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Ae))}}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:o,lineStart:c,lineEnd:s,polygonStart:function(){y.point=l,y.lineStart=f,y.lineEnd=h,g=[],p=[],i.polygonStart()},polygonEnd:function(){y.point=o,y.lineStart=c,y.lineEnd=s,g=Xo.merge(g);var n=Le(m,p);g.length?we(g,Ne,n,e,i):n&&(i.lineStart(),e(null,null,1,i),i.lineEnd()),i.polygonEnd(),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},x=Ce(),M=t(x);return y}}function Ae(n){return n.length>1}function Ce(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:g,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Ne(n,t){return((n=n.x)[0]<0?n[1]-Ea-Aa:Ea-n[1])-((t=t.x)[0]<0?t[1]-Ea-Aa:Ea-t[1])}function Le(n,t){var e=n[0],r=n[1],u=[Math.sin(e),-Math.cos(e),0],i=0,o=0;hc.reset();for(var a=0,c=t.length;c>a;++a){var s=t[a],l=s.length;if(l)for(var f=s[0],h=f[0],g=f[1]/2+Sa/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===l&&(d=0),n=s[d];var m=n[0],y=n[1]/2+Sa/4,x=Math.sin(y),M=Math.cos(y),_=m-h,b=_>=0?1:-1,w=b*_,S=w>Sa,k=p*x;if(hc.add(Math.atan2(k*b*Math.sin(w),v*M+k*Math.cos(w))),i+=S?_+b*ka:_,S^h>=e^m>=e){var E=fe(se(f),se(n));pe(E);var A=fe(u,E);pe(A);var C=(S^_>=0?-1:1)*X(A[2]);(r>C||r===C&&(E[0]||E[1]))&&(o+=S^_>=0?1:-1)}if(!d++)break;h=m,p=x,v=M,f=n}}return(-Aa>i||Aa>i&&0>hc)^1&o}function Te(n){var t,e=0/0,r=0/0,u=0/0;return{lineStart:function(){n.lineStart(),t=1},point:function(i,o){var a=i>0?Sa:-Sa,c=oa(i-e);oa(c-Sa)<Aa?(n.point(e,r=(r+o)/2>0?Ea:-Ea),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(i,r),t=0):u!==a&&c>=Sa&&(oa(e-u)<Aa&&(e-=u*Aa),oa(i-a)<Aa&&(i-=a*Aa),r=qe(e,r,i,o),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),t=0),n.point(e=i,r=o),u=a},lineEnd:function(){n.lineEnd(),e=r=0/0},clean:function(){return 2-t}}}function qe(n,t,e,r){var u,i,o=Math.sin(n-e);return oa(o)>Aa?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*o)):(t+r)/2}function ze(n,t,e,r){var u;if(null==n)u=e*Ea,r.point(-Sa,u),r.point(0,u),r.point(Sa,u),r.point(Sa,0),r.point(Sa,-u),r.point(0,-u),r.point(-Sa,-u),r.point(-Sa,0),r.point(-Sa,u);else if(oa(n[0]-t[0])>Aa){var i=n[0]<t[0]?Sa:-Sa;u=e*i/2,r.point(-i,u),r.point(0,u),r.point(i,u)}else r.point(t[0],t[1])}function Re(n){function t(n,t){return Math.cos(n)*Math.cos(t)>i}function e(n){var e,i,c,s,l;return{lineStart:function(){s=c=!1,l=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=o?v?0:u(f,h):v?u(f+(0>f?Sa:-Sa),h):0;if(!e&&(s=c=v)&&n.lineStart(),v!==c&&(g=r(e,p),(de(e,g)||de(p,g))&&(p[0]+=Aa,p[1]+=Aa,v=t(p[0],p[1]))),v!==c)l=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(a&&e&&o^v){var m;d&i||!(m=r(p,e,!0))||(l=0,o?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&&de(e,p)||n.point(p[0],p[1]),e=p,c=v,i=d},lineEnd:function(){c&&n.lineEnd(),e=null},clean:function(){return l|(s&&c)<<1}}}function r(n,t,e){var r=se(n),u=se(t),o=[1,0,0],a=fe(r,u),c=le(a,a),s=a[0],l=c-s*s;if(!l)return!e&&n;var f=i*c/l,h=-i*s/l,g=fe(o,a),p=ge(o,f),v=ge(a,h);he(p,v);var d=g,m=le(p,d),y=le(d,d),x=m*m-y*(le(p,p)-1);if(!(0>x)){var M=Math.sqrt(x),_=ge(d,(-m-M)/y);if(he(_,p),_=ve(_),!e)return _;var b,w=n[0],S=t[0],k=n[1],E=t[1];w>S&&(b=w,w=S,S=b);var A=S-w,C=oa(A-Sa)<Aa,N=C||Aa>A;if(!C&&k>E&&(b=k,k=E,E=b),N?C?k+E>0^_[1]<(oa(_[0]-w)<Aa?k:E):k<=_[1]&&_[1]<=E:A>Sa^(w<=_[0]&&_[0]<=S)){var L=ge(d,(-m+M)/y);return he(L,p),[_,ve(L)]}}}function u(t,e){var r=o?n:Sa-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),o=i>0,a=oa(i)>Aa,c=cr(n,6*Na);return Ee(t,e,c,o?[0,-n]:[-Sa,n-Sa])}function De(n,t,e,r){return function(u){var i,o=u.a,a=u.b,c=o.x,s=o.y,l=a.x,f=a.y,h=0,g=1,p=l-c,v=f-s;if(i=n-c,p||!(i>0)){if(i/=p,0>p){if(h>i)return;g>i&&(g=i)}else if(p>0){if(i>g)return;i>h&&(h=i)}if(i=e-c,p||!(0>i)){if(i/=p,0>p){if(i>g)return;i>h&&(h=i)}else if(p>0){if(h>i)return;g>i&&(g=i)}if(i=t-s,v||!(i>0)){if(i/=v,0>v){if(h>i)return;g>i&&(g=i)}else if(v>0){if(i>g)return;i>h&&(h=i)}if(i=r-s,v||!(0>i)){if(i/=v,0>v){if(i>g)return;i>h&&(h=i)}else if(v>0){if(h>i)return;g>i&&(g=i)}return h>0&&(u.a={x:c+h*p,y:s+h*v}),1>g&&(u.b={x:c+g*p,y:s+g*v}),u}}}}}}function Pe(n,t,e,r){function u(r,u){return oa(r[0]-n)<Aa?u>0?0:3:oa(r[0]-e)<Aa?u>0?2:1:oa(r[1]-t)<Aa?u>0?1:0:u>0?3:2}function i(n,t){return o(n.x,t.x)}function o(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function c(n){for(var t=0,e=d.length,r=n[1],u=0;e>u;++u)for(var i,o=1,a=d[u],c=a.length,s=a[0];c>o;++o)i=a[o],s[1]<=r?i[1]>r&&Z(s,i,n)>0&&++t:i[1]<=r&&Z(s,i,n)<0&&--t,s=i;return 0!==t}function s(i,a,c,s){var l=0,f=0;if(null==i||(l=u(i,c))!==(f=u(a,c))||o(i,a)<0^c>0){do s.point(0===l||3===l?n:e,l>1?r:t);while((l=(l+c+4)%4)!==f)}else s.point(a[0],a[1])}function l(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function f(n,t){l(n,t)&&a.point(n,t)}function h(){N.point=p,d&&d.push(m=[]),S=!0,w=!1,_=b=0/0}function g(){v&&(p(y,x),M&&w&&A.rejoin(),v.push(A.buffer())),N.point=f,w&&a.lineEnd()}function p(n,t){n=Math.max(-Ac,Math.min(Ac,n)),t=Math.max(-Ac,Math.min(Ac,t));var e=l(n,t);if(d&&m.push([n,t]),S)y=n,x=t,M=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:_,y:b},b:{x:n,y:t}};C(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}_=n,b=t,w=e}var v,d,m,y,x,M,_,b,w,S,k,E=a,A=Ce(),C=De(n,t,e,r),N={point:f,lineStart:h,lineEnd:g,polygonStart:function(){a=A,v=[],d=[],k=!0},polygonEnd:function(){a=E,v=Xo.merge(v);var t=c([n,r]),e=k&&t,u=v.length;(e||u)&&(a.polygonStart(),e&&(a.lineStart(),s(null,null,1,a),a.lineEnd()),u&&we(v,i,t,s,a),a.polygonEnd()),v=d=m=null}};return N}}function Ue(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.invert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function je(n){var t=0,e=Sa/3,r=nr(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*Sa/180,e=n[1]*Sa/180):[180*(t/Sa),180*(e/Sa)]},u}function He(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),o-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),o=Math.sqrt(i)/u;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/u,X((i-(n*n+e*e)*u*u)/(2*u))]},e}function Fe(){function n(n,t){Nc+=u*n-r*t,r=n,u=t}var t,e,r,u;Rc.point=function(i,o){Rc.point=n,t=r=i,e=u=o},Rc.lineEnd=function(){n(t,e)}}function Oe(n,t){Lc>n&&(Lc=n),n>qc&&(qc=n),Tc>t&&(Tc=t),t>zc&&(zc=t)}function Ye(){function n(n,t){o.push("M",n,",",t,i)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function u(){o.push("Z")}var i=Ie(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return i=Ie(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Ie(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function Ze(n,t){dc+=n,mc+=t,++yc}function Ve(){function n(n,r){var u=n-t,i=r-e,o=Math.sqrt(u*u+i*i);xc+=o*(t+n)/2,Mc+=o*(e+r)/2,_c+=o,Ze(t=n,e=r)}var t,e;Pc.point=function(r,u){Pc.point=n,Ze(t=r,e=u)}}function Xe(){Pc.point=Ze}function $e(){function n(n,t){var e=n-r,i=t-u,o=Math.sqrt(e*e+i*i);xc+=o*(r+n)/2,Mc+=o*(u+t)/2,_c+=o,o=u*n-r*t,bc+=o*(r+n),wc+=o*(u+t),Sc+=3*o,Ze(r=n,u=t)}var t,e,r,u;Pc.point=function(i,o){Pc.point=n,Ze(t=r=i,e=u=o)},Pc.lineEnd=function(){n(t,e)}}function Be(n){function t(t,e){n.moveTo(t,e),n.arc(t,e,o,0,ka)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function u(){a.point=t}function i(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:u,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=u,a.point=t},pointRadius:function(n){return o=n,a},result:g};return a}function We(n){function t(n){return(a?r:e)(n)}function e(t){return Ke(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){x=0/0,S.point=i,t.lineStart()}function i(e,r){var i=se([e,r]),o=n(e,r);u(x,M,y,_,b,w,x=o[0],M=o[1],y=e,_=i[0],b=i[1],w=i[2],a,t),t.point(x,M)}function o(){S.point=e,t.lineEnd()}function c(){r(),S.point=s,S.lineEnd=l}function s(n,t){i(f=n,h=t),g=x,p=M,v=_,d=b,m=w,S.point=i}function l(){u(x,M,y,_,b,w,g,p,f,v,d,m,a,t),S.lineEnd=o,o()}var f,h,g,p,v,d,m,y,x,M,_,b,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=c},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,a,c,s,l,f,h,g,p,v,d,m){var y=l-t,x=f-e,M=y*y+x*x;if(M>4*i&&d--){var _=a+g,b=c+p,w=s+v,S=Math.sqrt(_*_+b*b+w*w),k=Math.asin(w/=S),E=oa(oa(w)-1)<Aa||oa(r-h)<Aa?(r+h)/2:Math.atan2(b,_),A=n(E,k),C=A[0],N=A[1],L=C-t,T=N-e,q=x*L-y*T;(q*q/M>i||oa((y*L+x*T)/M-.5)>.3||o>a*g+c*p+s*v)&&(u(t,e,r,a,c,s,C,N,E,_/=S,b/=S,w,d,m),m.point(C,N),u(C,N,E,_,b,w,l,f,h,g,p,v,d,m))}}var i=.5,o=Math.cos(30*Na),a=16;return t.precision=function(n){return arguments.length?(a=(i=n*n)>0&&16,t):Math.sqrt(i)},t}function Je(n){var t=We(function(t,e){return n([t*La,e*La])});return function(n){return tr(t(n))}}function Ge(n){this.stream=n}function Ke(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function Qe(n){return nr(function(){return n})()}function nr(n){function t(n){return n=a(n[0]*Na,n[1]*Na),[n[0]*h+c,s-n[1]*h]}function e(n){return n=a.invert((n[0]-c)/h,(s-n[1])/h),n&&[n[0]*La,n[1]*La]}function r(){a=Ue(o=ur(m,y,x),i);var n=i(v,d);return c=g-n[0]*h,s=p+n[1]*h,u()}function u(){return l&&(l.valid=!1,l=null),t}var i,o,a,c,s,l,f=We(function(n,t){return n=i(n,t),[n[0]*h+c,s-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,y=0,x=0,M=Ec,_=bt,b=null,w=null;return t.stream=function(n){return l&&(l.valid=!1),l=tr(M(o,f(_(n)))),l.valid=!0,l},t.clipAngle=function(n){return arguments.length?(M=null==n?(b=n,Ec):Re((b=+n)*Na),u()):b},t.clipExtent=function(n){return arguments.length?(w=n,_=n?Pe(n[0][0],n[0][1],n[1][0],n[1][1]):bt,u()):w},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*Na,d=n[1]%360*Na,r()):[v*La,d*La]},t.rotate=function(n){return arguments.length?(m=n[0]%360*Na,y=n[1]%360*Na,x=n.length>2?n[2]%360*Na:0,r()):[m*La,y*La,x*La]},Xo.rebind(t,f,"precision"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function tr(n){return Ke(n,function(t,e){n.point(t*Na,e*Na)})}function er(n,t){return[n,t]}function rr(n,t){return[n>Sa?n-ka:-Sa>n?n+ka:n,t]}function ur(n,t,e){return n?t||e?Ue(or(n),ar(t,e)):or(n):t||e?ar(t,e):rr}function ir(n){return function(t,e){return t+=n,[t>Sa?t-ka:-Sa>t?t+ka:t,e]}}function or(n){var t=ir(n);return t.invert=ir(-n),t}function ar(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,s=Math.sin(t),l=s*r+a*u;return[Math.atan2(c*i-l*o,a*r-s*u),X(l*i+c*o)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,s=Math.sin(t),l=s*i-c*o;return[Math.atan2(c*i+s*o,a*r+l*u),X(l*r-a*u)]},e}function cr(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,o,a){var c=o*t;null!=u?(u=sr(e,u),i=sr(e,i),(o>0?i>u:u>i)&&(u+=o*ka)):(u=n+o*ka,i=n-.5*c);for(var s,l=u;o>0?l>i:i>l;l-=c)a.point((s=ve([e,-r*Math.cos(l),-r*Math.sin(l)]))[0],s[1])}}function sr(n,t){var e=se(t);e[0]-=n,pe(e);var r=V(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Aa)%(2*Math.PI)}function lr(n,t,e){var r=Xo.range(n,t-Aa,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function fr(n,t,e){var r=Xo.range(n,t-Aa,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function hr(n){return n.source}function gr(n){return n.target}function pr(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),o=Math.cos(r),a=Math.sin(r),c=u*Math.cos(n),s=u*Math.sin(n),l=o*Math.cos(e),f=o*Math.sin(e),h=2*Math.asin(Math.sqrt(J(r-t)+u*o*J(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*c+t*l,u=e*s+t*f,o=e*i+t*a;return[Math.atan2(u,r)*La,Math.atan2(o,Math.sqrt(r*r+u*u))*La]}:function(){return[n*La,t*La]};return p.distance=h,p}function vr(){function n(n,u){var i=Math.sin(u*=Na),o=Math.cos(u),a=oa((n*=Na)-t),c=Math.cos(a);Uc+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*i-e*o*c)*a),e*i+r*o*c),t=n,e=i,r=o}var t,e,r;jc.point=function(u,i){t=u*Na,e=Math.sin(i*=Na),r=Math.cos(i),jc.point=n},jc.lineEnd=function(){jc.point=jc.lineEnd=g}}function dr(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),o=Math.cos(u);return[Math.atan2(n*i,r*o),Math.asin(r&&e*i/r)]},e}function mr(n,t){function e(n,t){var e=oa(oa(t)-Ea)<Aa?0:o/Math.pow(u(t),i);return[e*Math.sin(i*n),o-e*Math.cos(i*n)]}var r=Math.cos(n),u=function(n){return Math.tan(Sa/4+n/2)},i=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(u(t)/u(n)),o=r*Math.pow(u(n),i)/i;return i?(e.invert=function(n,t){var e=o-t,r=I(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(o/r,1/i))-Ea]},e):xr}function yr(n,t){function e(n,t){var e=i-t;return[e*Math.sin(u*n),i-e*Math.cos(u*n)]}var r=Math.cos(n),u=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),i=r/u+n;return oa(u)<Aa?er:(e.invert=function(n,t){var e=i-t;return[Math.atan2(n,e)/u,i-I(u)*Math.sqrt(n*n+e*e)]},e)}function xr(n,t){return[n,Math.log(Math.tan(Sa/4+t/2))]}function Mr(n){var t,e=Qe(n),r=e.scale,u=e.translate,i=e.clipExtent;return e.scale=function(){var n=r.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.translate=function(){var n=u.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.clipExtent=function(n){var o=i.apply(e,arguments);if(o===e){if(t=null==n){var a=Sa*r(),c=u();i([[c[0]-a,c[1]-a],[c[0]+a,c[1]+a]])}}else t&&(o=null);return o},e.clipExtent(null)}function _r(n,t){return[Math.log(Math.tan(Sa/4+t/2)),-n]}function br(n){return n[0]}function wr(n){return n[1]}function Sr(n){for(var t=n.length,e=[0,1],r=2,u=2;t>u;u++){for(;r>1&&Z(n[e[r-2]],n[e[r-1]],n[u])<=0;)--r;e[r++]=u}return e.slice(0,r)}function kr(n,t){return n[0]-t[0]||n[1]-t[1]}function Er(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Ar(n,t,e,r){var u=n[0],i=e[0],o=t[0]-u,a=r[0]-i,c=n[1],s=e[1],l=t[1]-c,f=r[1]-s,h=(a*(c-s)-f*(u-i))/(f*o-a*l);return[u+h*o,c+h*l]}function Cr(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Nr(){Jr(this),this.edge=this.site=this.circle=null}function Lr(n){var t=Jc.pop()||new Nr;return t.site=n,t}function Tr(n){Or(n),$c.remove(n),Jc.push(n),Jr(n)}function qr(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,o=n.N,a=[n];Tr(n);for(var c=i;c.circle&&oa(e-c.circle.x)<Aa&&oa(r-c.circle.cy)<Aa;)i=c.P,a.unshift(c),Tr(c),c=i;a.unshift(c),Or(c);for(var s=o;s.circle&&oa(e-s.circle.x)<Aa&&oa(r-s.circle.cy)<Aa;)o=s.N,a.push(s),Tr(s),s=o;a.push(s),Or(s);var l,f=a.length;for(l=1;f>l;++l)s=a[l],c=a[l-1],$r(s.edge,c.site,s.site,u);c=a[0],s=a[f-1],s.edge=Vr(c.site,s.site,null,u),Fr(c),Fr(s)}function zr(n){for(var t,e,r,u,i=n.x,o=n.y,a=$c._;a;)if(r=Rr(a,o)-i,r>Aa)a=a.L;else{if(u=i-Dr(a,o),!(u>Aa)){r>-Aa?(t=a.P,e=a):u>-Aa?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var c=Lr(n);if($c.insert(t,c),t||e){if(t===e)return Or(t),e=Lr(t.site),$c.insert(c,e),c.edge=e.edge=Vr(t.site,c.site),Fr(t),Fr(e),void 0;if(!e)return c.edge=Vr(t.site,c.site),void 0;Or(t),Or(e);var s=t.site,l=s.x,f=s.y,h=n.x-l,g=n.y-f,p=e.site,v=p.x-l,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,x=v*v+d*d,M={x:(d*y-g*x)/m+l,y:(h*x-v*y)/m+f};$r(e.edge,s,p,M),c.edge=Vr(s,n,null,M),e.edge=Vr(n,p,null,M),Fr(t),Fr(e)}}function Rr(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var o=n.P;if(!o)return-1/0;e=o.site;var a=e.x,c=e.y,s=c-t;if(!s)return a;var l=a-r,f=1/i-1/s,h=l/s;return f?(-h+Math.sqrt(h*h-2*f*(l*l/(-2*s)-c+s/2+u-i/2)))/f+r:(r+a)/2}function Dr(n,t){var e=n.N;if(e)return Rr(e,t);var r=n.site;return r.y===t?r.x:1/0}function Pr(n){this.site=n,this.edges=[]}function Ur(n){for(var t,e,r,u,i,o,a,c,s,l,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=Xc,d=v.length;d--;)if(i=v[d],i&&i.prepare())for(a=i.edges,c=a.length,o=0;c>o;)l=a[o].end(),r=l.x,u=l.y,s=a[++o%c].start(),t=s.x,e=s.y,(oa(r-t)>Aa||oa(u-e)>Aa)&&(a.splice(o,0,new Br(Xr(i.site,l,oa(r-f)<Aa&&p-u>Aa?{x:f,y:oa(t-f)<Aa?e:p}:oa(u-p)<Aa&&h-r>Aa?{x:oa(e-p)<Aa?t:h,y:p}:oa(r-h)<Aa&&u-g>Aa?{x:h,y:oa(t-h)<Aa?e:g}:oa(u-g)<Aa&&r-f>Aa?{x:oa(e-g)<Aa?t:f,y:g}:null),i.site,null)),++c)}function jr(n,t){return t.angle-n.angle}function Hr(){Jr(this),this.x=this.y=this.arc=this.site=this.cy=null}function Fr(n){var t=n.P,e=n.N;if(t&&e){var r=t.site,u=n.site,i=e.site;if(r!==i){var o=u.x,a=u.y,c=r.x-o,s=r.y-a,l=i.x-o,f=i.y-a,h=2*(c*f-s*l);if(!(h>=-Ca)){var g=c*c+s*s,p=l*l+f*f,v=(f*g-s*p)/h,d=(c*p-l*g)/h,f=d+a,m=Gc.pop()||new Hr;m.arc=n,m.site=u,m.x=v+o,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,x=Wc._;x;)if(m.y<x.y||m.y===x.y&&m.x<=x.x){if(!x.L){y=x.P;break}x=x.L}else{if(!x.R){y=x;break}x=x.R}Wc.insert(y,m),y||(Bc=m)}}}}function Or(n){var t=n.circle;t&&(t.P||(Bc=t.N),Wc.remove(t),Gc.push(t),Jr(t),n.circle=null)}function Yr(n){for(var t,e=Vc,r=De(n[0][0],n[0][1],n[1][0],n[1][1]),u=e.length;u--;)t=e[u],(!Ir(t,n)||!r(t)||oa(t.a.x-t.b.x)<Aa&&oa(t.a.y-t.b.y)<Aa)&&(t.a=t.b=null,e.splice(u,1))}function Ir(n,t){var e=n.b;if(e)return!0;var r,u,i=n.a,o=t[0][0],a=t[1][0],c=t[0][1],s=t[1][1],l=n.l,f=n.r,h=l.x,g=l.y,p=f.x,v=f.y,d=(h+p)/2,m=(g+v)/2;if(v===g){if(o>d||d>=a)return;if(h>p){if(i){if(i.y>=s)return}else i={x:d,y:c};e={x:d,y:s}}else{if(i){if(i.y<c)return}else i={x:d,y:s};e={x:d,y:c}}}else if(r=(h-p)/(v-g),u=m-r*d,-1>r||r>1)if(h>p){if(i){if(i.y>=s)return}else i={x:(c-u)/r,y:c};e={x:(s-u)/r,y:s}}else{if(i){if(i.y<c)return}else i={x:(s-u)/r,y:s};e={x:(c-u)/r,y:c}}else if(v>g){if(i){if(i.x>=a)return}else i={x:o,y:r*o+u};e={x:a,y:r*a+u}}else{if(i){if(i.x<o)return}else i={x:a,y:r*a+u};e={x:o,y:r*o+u}}return n.a=i,n.b=e,!0}function Zr(n,t){this.l=n,this.r=t,this.a=this.b=null}function Vr(n,t,e,r){var u=new Zr(n,t);return Vc.push(u),e&&$r(u,n,t,e),r&&$r(u,t,n,r),Xc[n.i].edges.push(new Br(u,n,t)),Xc[t.i].edges.push(new Br(u,t,n)),u}function Xr(n,t,e){var r=new Zr(n,null);return r.a=t,r.b=e,Vc.push(r),r}function $r(n,t,e,r){n.a||n.b?n.l===e?n.b=r:n.a=r:(n.a=r,n.l=t,n.r=e)}function Br(n,t,e){var r=n.a,u=n.b;this.edge=n,this.site=t,this.angle=e?Math.atan2(e.y-t.y,e.x-t.x):n.l===t?Math.atan2(u.x-r.x,r.y-u.y):Math.atan2(r.x-u.x,u.y-r.y)}function Wr(){this._=null}function Jr(n){n.U=n.C=n.L=n.R=n.P=n.N=null}function Gr(n,t){var e=t,r=t.R,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.R=r.L,e.R&&(e.R.U=e),r.L=e}function Kr(n,t){var e=t,r=t.L,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.L=r.R,e.L&&(e.L.U=e),r.R=e}function Qr(n){for(;n.L;)n=n.L;return n}function nu(n,t){var e,r,u,i=n.sort(tu).pop();for(Vc=[],Xc=new Array(n.length),$c=new Wr,Wc=new Wr;;)if(u=Bc,i&&(!u||i.y<u.y||i.y===u.y&&i.x<u.x))(i.x!==e||i.y!==r)&&(Xc[i.i]=new Pr(i),zr(i),e=i.x,r=i.y),i=n.pop();else{if(!u)break;qr(u.arc)}t&&(Yr(t),Ur(t));var o={cells:Xc,edges:Vc};return $c=Wc=Vc=Xc=null,o}function tu(n,t){return t.y-n.y||t.x-n.x}function eu(n,t,e){return(n.x-e.x)*(t.y-n.y)-(n.x-t.x)*(e.y-n.y)}function ru(n){return n.x}function uu(n){return n.y}function iu(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function ou(n,t,e,r,u,i){if(!n(t,e,r,u,i)){var o=.5*(e+u),a=.5*(r+i),c=t.nodes;c[0]&&ou(n,c[0],e,r,o,a),c[1]&&ou(n,c[1],o,r,u,a),c[2]&&ou(n,c[2],e,a,o,i),c[3]&&ou(n,c[3],o,a,u,i)}}function au(n,t){n=Xo.rgb(n),t=Xo.rgb(t);var e=n.r,r=n.g,u=n.b,i=t.r-e,o=t.g-r,a=t.b-u;return function(n){return"#"+vt(Math.round(e+i*n))+vt(Math.round(r+o*n))+vt(Math.round(u+a*n))}}function cu(n,t){var e,r={},u={};for(e in n)e in t?r[e]=fu(n[e],t[e]):u[e]=n[e];for(e in t)e in n||(u[e]=t[e]);return function(n){for(e in r)u[e]=r[e](n);return u}}function su(n,t){return t-=n=+n,function(e){return n+t*e}}function lu(n,t){var e,r,u,i,o,a=0,c=0,s=[],l=[];for(n+="",t+="",Qc.lastIndex=0,r=0;e=Qc.exec(t);++r)e.index&&s.push(t.substring(a,c=e.index)),l.push({i:s.length,x:e[0]}),s.push(null),a=Qc.lastIndex;for(a<t.length&&s.push(t.substring(a)),r=0,i=l.length;(e=Qc.exec(n))&&i>r;++r)if(o=l[r],o.x==e[0]){if(o.i)if(null==s[o.i+1])for(s[o.i-1]+=o.x,s.splice(o.i,1),u=r+1;i>u;++u)l[u].i--;else for(s[o.i-1]+=o.x+s[o.i+1],s.splice(o.i,2),u=r+1;i>u;++u)l[u].i-=2;else if(null==s[o.i+1])s[o.i]=o.x;else for(s[o.i]=o.x+s[o.i+1],s.splice(o.i+1,1),u=r+1;i>u;++u)l[u].i--;l.splice(r,1),i--,r--}else o.x=su(parseFloat(e[0]),parseFloat(o.x));for(;i>r;)o=l.pop(),null==s[o.i+1]?s[o.i]=o.x:(s[o.i]=o.x+s[o.i+1],s.splice(o.i+1,1)),i--;return 1===s.length?null==s[0]?(o=l[0].x,function(n){return o(n)+""}):function(){return t}:function(n){for(r=0;i>r;++r)s[(o=l[r]).i]=o.x(n);return s.join("")}}function fu(n,t){for(var e,r=Xo.interpolators.length;--r>=0&&!(e=Xo.interpolators[r](n,t)););return e}function hu(n,t){var e,r=[],u=[],i=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(fu(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;o>e;++e)u[e]=t[e];return function(n){for(e=0;a>e;++e)u[e]=r[e](n);return u}}function gu(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function pu(n){return function(t){return 1-n(1-t)}}function vu(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function du(n){return n*n}function mu(n){return n*n*n}function yu(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function xu(n){return function(t){return Math.pow(t,n)}}function Mu(n){return 1-Math.cos(n*Ea)}function _u(n){return Math.pow(2,10*(n-1))}function bu(n){return 1-Math.sqrt(1-n*n)}function wu(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/ka*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*ka/t)}}function Su(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function ku(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Eu(n,t){n=Xo.hcl(n),t=Xo.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,o=t.c-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return rt(e+i*n,r+o*n,u+a*n)+""}}function Au(n,t){n=Xo.hsl(n),t=Xo.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,o=t.s-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return nt(e+i*n,r+o*n,u+a*n)+""}}function Cu(n,t){n=Xo.lab(n),t=Xo.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,o=t.a-r,a=t.b-u;return function(n){return ot(e+i*n,r+o*n,u+a*n)+""}}function Nu(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Lu(n){var t=[n.a,n.b],e=[n.c,n.d],r=qu(t),u=Tu(t,e),i=qu(zu(e,t,-u))||0;t[0]*e[1]<e[0]*t[1]&&(t[0]*=-1,t[1]*=-1,r*=-1,u*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-e[0],e[1]))*La,this.translate=[n.e,n.f],this.scale=[r,i],this.skew=i?Math.atan2(u,i)*La:0}function Tu(n,t){return n[0]*t[0]+n[1]*t[1]}function qu(n){var t=Math.sqrt(Tu(n,n));return t&&(n[0]/=t,n[1]/=t),t}function zu(n,t,e){return n[0]+=e*t[0],n[1]+=e*t[1],n}function Ru(n,t){var e,r=[],u=[],i=Xo.transform(n),o=Xo.transform(t),a=i.translate,c=o.translate,s=i.rotate,l=o.rotate,f=i.skew,h=o.skew,g=i.scale,p=o.scale;return a[0]!=c[0]||a[1]!=c[1]?(r.push("translate(",null,",",null,")"),u.push({i:1,x:su(a[0],c[0])},{i:3,x:su(a[1],c[1])})):c[0]||c[1]?r.push("translate("+c+")"):r.push(""),s!=l?(s-l>180?l+=360:l-s>180&&(s+=360),u.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:su(s,l)})):l&&r.push(r.pop()+"rotate("+l+")"),f!=h?u.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:su(f,h)}):h&&r.push(r.pop()+"skewX("+h+")"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),u.push({i:e-4,x:su(g[0],p[0])},{i:e-2,x:su(g[1],p[1])})):(1!=p[0]||1!=p[1])&&r.push(r.pop()+"scale("+p+")"),e=u.length,function(n){for(var t,i=-1;++i<e;)r[(t=u[i]).i]=t.x(n);return r.join("")}}function Du(n,t){return t=t-(n=+n)?1/(t-n):0,function(e){return(e-n)*t}}function Pu(n,t){return t=t-(n=+n)?1/(t-n):0,function(e){return Math.max(0,Math.min(1,(e-n)*t))}}function Uu(n){for(var t=n.source,e=n.target,r=Hu(t,e),u=[t];t!==r;)t=t.parent,u.push(t);for(var i=u.length;e!==r;)u.splice(i,0,e),e=e.parent;return u}function ju(n){for(var t=[],e=n.parent;null!=e;)t.push(n),n=e,e=e.parent;return t.push(n),t}function Hu(n,t){if(n===t)return n;for(var e=ju(n),r=ju(t),u=e.pop(),i=r.pop(),o=null;u===i;)o=u,u=e.pop(),i=r.pop();return o}function Fu(n){n.fixed|=2}function Ou(n){n.fixed&=-7}function Yu(n){n.fixed|=4,n.px=n.x,n.py=n.y}function Iu(n){n.fixed&=-5}function Zu(n,t,e){var r=0,u=0;if(n.charge=0,!n.leaf)for(var i,o=n.nodes,a=o.length,c=-1;++c<a;)i=o[c],null!=i&&(Zu(i,t,e),n.charge+=i.charge,r+=i.charge*i.cx,u+=i.charge*i.cy);if(n.point){n.leaf||(n.point.x+=Math.random()-.5,n.point.y+=Math.random()-.5);var s=t*e[n.point.index];n.charge+=n.pointCharge=s,r+=s*n.point.x,u+=s*n.point.y}n.cx=r/n.charge,n.cy=u/n.charge}function Vu(n,t){return Xo.rebind(n,t,"sort","children","value"),n.nodes=n,n.links=Wu,n}function Xu(n){return n.children}function $u(n){return n.value}function Bu(n,t){return t.value-n.value}function Wu(n){return Xo.merge(n.map(function(n){return(n.children||[]).map(function(t){return{source:n,target:t}})}))}function Ju(n){return n.x}function Gu(n){return n.y}function Ku(n,t,e){n.y0=t,n.y=e}function Qu(n){return Xo.range(n.length)}function ni(n){for(var t=-1,e=n[0].length,r=[];++t<e;)r[t]=0;return r}function ti(n){for(var t,e=1,r=0,u=n[0][1],i=n.length;i>e;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function ei(n){return n.reduce(ri,0)}function ri(n,t){return n+t[1]}function ui(n,t){return ii(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function ii(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function oi(n){return[Xo.min(n),Xo.max(n)]}function ai(n,t){return n.parent==t.parent?1:2}function ci(n){var t=n.children;return t&&t.length?t[0]:n._tree.thread}function si(n){var t,e=n.children;return e&&(t=e.length)?e[t-1]:n._tree.thread}function li(n,t){var e=n.children;if(e&&(u=e.length))for(var r,u,i=-1;++i<u;)t(r=li(e[i],t),n)>0&&(n=r);return n}function fi(n,t){return n.x-t.x}function hi(n,t){return t.x-n.x}function gi(n,t){return n.depth-t.depth}function pi(n,t){function e(n,r){var u=n.children;if(u&&(o=u.length))for(var i,o,a=null,c=-1;++c<o;)i=u[c],e(i,a),a=i;t(n,r)}e(n,null)}function vi(n){for(var t,e=0,r=0,u=n.children,i=u.length;--i>=0;)t=u[i]._tree,t.prelim+=e,t.mod+=e,e+=t.shift+(r+=t.change)}function di(n,t,e){n=n._tree,t=t._tree;var r=e/(t.number-n.number);n.change+=r,t.change-=r,t.shift+=e,t.prelim+=e,t.mod+=e}function mi(n,t,e){return n._tree.ancestor.parent==t.parent?n._tree.ancestor:e}function yi(n,t){return n.value-t.value}function xi(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Mi(n,t){n._pack_next=t,t._pack_prev=n}function _i(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function bi(n){function t(n){l=Math.min(n.x-n.r,l),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(s=e.length)){var e,r,u,i,o,a,c,s,l=1/0,f=-1/0,h=1/0,g=-1/0;if(e.forEach(wi),r=e[0],r.x=-r.r,r.y=0,t(r),s>1&&(u=e[1],u.x=u.r,u.y=0,t(u),s>2))for(i=e[2],Ei(r,u,i),t(i),xi(r,i),r._pack_prev=i,xi(i,u),u=r._pack_next,o=3;s>o;o++){Ei(r,u,i=e[o]);var p=0,v=1,d=1;for(a=u._pack_next;a!==u;a=a._pack_next,v++)if(_i(a,i)){p=1;break}if(1==p)for(c=r._pack_prev;c!==a._pack_prev&&!_i(c,i);c=c._pack_prev,d++);p?(d>v||v==d&&u.r<r.r?Mi(r,u=a):Mi(r=c,u),o--):(xi(r,i),u=i,t(i))}var m=(l+f)/2,y=(h+g)/2,x=0;for(o=0;s>o;o++)i=e[o],i.x-=m,i.y-=y,x=Math.max(x,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=x,e.forEach(Si)}}function wi(n){n._pack_next=n._pack_prev=n}function Si(n){delete n._pack_next,delete n._pack_prev}function ki(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,o=u.length;++i<o;)ki(u[i],t,e,r)}function Ei(n,t,e){var r=n.r+e.r,u=t.x-n.x,i=t.y-n.y;if(r&&(u||i)){var o=t.r+e.r,a=u*u+i*i;o*=o,r*=r;var c=.5+(r-o)/(2*a),s=Math.sqrt(Math.max(0,2*o*(r+a)-(r-=a)*r-o*o))/(2*a);e.x=n.x+c*u+s*i,e.y=n.y+c*i-s*u}else e.x=n.x+r,e.y=n.y}function Ai(n){return 1+Xo.max(n,function(n){return n.y})}function Ci(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Ni(n){var t=n.children;return t&&t.length?Ni(t[0]):n}function Li(n){var t,e=n.children;return e&&(t=e.length)?Li(e[t-1]):n}function Ti(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function qi(n,t){var e=n.x+t[3],r=n.y+t[0],u=n.dx-t[1]-t[3],i=n.dy-t[0]-t[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function zi(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Ri(n){return n.rangeExtent?n.rangeExtent():zi(n.range())}function Di(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function Pi(n,t){var e,r=0,u=n.length-1,i=n[r],o=n[u];return i>o&&(e=r,r=u,u=e,e=i,i=o,o=e),n[r]=t.floor(i),n[u]=t.ceil(o),n}function Ui(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:ls}function ji(n,t,e,r){var u=[],i=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]<n[0]&&(n=n.slice().reverse(),t=t.slice().reverse());++o<=a;)u.push(e(n[o-1],n[o])),i.push(r(t[o-1],t[o]));return function(t){var e=Xo.bisect(n,t,1,a)-1;return i[e](u[e](t))}}function Hi(n,t,e,r){function u(){var u=Math.min(n.length,t.length)>2?ji:Di,c=r?Pu:Du;return o=u(n,t,c,e),a=u(t,n,c,fu),i}function i(n){return o(n)}var o,a;return i.invert=function(n){return a(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(Nu)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return Ii(n,t)},i.tickFormat=function(t,e){return Zi(n,t,e)},i.nice=function(t){return Oi(n,t),u()},i.copy=function(){return Hi(n,t,e,r)},u()}function Fi(n,t){return Xo.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Oi(n,t){return Pi(n,Ui(Yi(n,t)[2]))}function Yi(n,t){null==t&&(t=10);var e=zi(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Ii(n,t){return Xo.range.apply(Xo,Yi(n,t))}function Zi(n,t,e){var r=Yi(n,t);return Xo.format(e?e.replace(Qa,function(n,t,e,u,i,o,a,c,s,l){return[t,e,u,i,o,a,c,s||"."+Xi(l,r),l].join("")}):",."+Vi(r[2])+"f")}function Vi(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function Xi(n,t){var e=Vi(t[2]);return n in fs?Math.abs(e-Vi(Math.max(Math.abs(t[0]),Math.abs(t[1]))))+ +("e"!==n):e-2*("%"===n)}function $i(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(u(t))}return o.invert=function(t){return i(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),o):t},o.nice=function(){var t=Pi(r.map(u),e?Math:gs);return n.domain(t),r=t.map(i),o},o.ticks=function(){var n=zi(r),o=[],a=n[0],c=n[1],s=Math.floor(u(a)),l=Math.ceil(u(c)),f=t%1?2:t;if(isFinite(l-s)){if(e){for(;l>s;s++)for(var h=1;f>h;h++)o.push(i(s)*h);o.push(i(s))}else for(o.push(i(s));s++<l;)for(var h=f-1;h>0;h--)o.push(i(s)*h);for(s=0;o[s]<a;s++);for(l=o.length;o[l-1]>c;l--);o=o.slice(s,l)}return o},o.tickFormat=function(n,t){if(!arguments.length)return hs;arguments.length<2?t=hs:"function"!=typeof t&&(t=Xo.format(t));var r,a=Math.max(.1,n/o.ticks().length),c=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(c(u(n)+r))<=a?t(n):""}},o.copy=function(){return $i(n.copy(),t,e,r)},Fi(o,n)}function Bi(n,t,e){function r(t){return n(u(t))}var u=Wi(t),i=Wi(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return Ii(e,n)},r.tickFormat=function(n,t){return Zi(e,n,t)},r.nice=function(n){return r.domain(Oi(e,n))},r.exponent=function(o){return arguments.length?(u=Wi(t=o),i=Wi(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return Bi(n.copy(),t,e)},Fi(r,n)}function Wi(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function Ji(n,t){function e(e){return o[((i.get(e)||"range"===t.t&&i.set(e,n.push(e)))-1)%o.length]}function r(t,e){return Xo.range(n.length).map(function(n){return t+e*n})}var i,o,a;return e.domain=function(r){if(!arguments.length)return n;n=[],i=new u;for(var o,a=-1,c=r.length;++a<c;)i.has(o=r[a])||i.set(o,n.push(o));return e[t.t].apply(e,t.a)},e.range=function(n){return arguments.length?(o=n,a=0,t={t:"range",a:arguments},e):o},e.rangePoints=function(u,i){arguments.length<2&&(i=0);var c=u[0],s=u[1],l=(s-c)/(Math.max(1,n.length-1)+i);return o=r(n.length<2?(c+s)/2:c+l*i/2,l),a=0,t={t:"rangePoints",a:arguments},e},e.rangeBands=function(u,i,c){arguments.length<2&&(i=0),arguments.length<3&&(c=i);var s=u[1]<u[0],l=u[s-0],f=u[1-s],h=(f-l)/(n.length-i+2*c);return o=r(l+h*c,h),s&&o.reverse(),a=h*(1-i),t={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(u,i,c){arguments.length<2&&(i=0),arguments.length<3&&(c=i);var s=u[1]<u[0],l=u[s-0],f=u[1-s],h=Math.floor((f-l)/(n.length-i+2*c)),g=f-l-(n.length-i)*h;return o=r(l+Math.round(g/2),h),s&&o.reverse(),a=Math.round(h*(1-i)),t={t:"rangeRoundBands",a:arguments},e},e.rangeBand=function(){return a},e.rangeExtent=function(){return zi(t.a[0])},e.copy=function(){return Ji(n,t)},e.domain(n)}function Gi(n,t){function e(){var e=0,i=t.length;for(u=[];++e<i;)u[e-1]=Xo.quantile(n,e/i);return r}function r(n){return isNaN(n=+n)?void 0:t[Xo.bisect(u,n)]}var u;return r.domain=function(t){return arguments.length?(n=t.filter(function(n){return!isNaN(n)}).sort(Xo.ascending),e()):n},r.range=function(n){return arguments.length?(t=n,e()):t},r.quantiles=function(){return u},r.invertExtent=function(e){return e=t.indexOf(e),0>e?[0/0,0/0]:[e>0?u[e-1]:n[0],e<u.length?u[e]:n[n.length-1]]},r.copy=function(){return Gi(n,t)},e()}function Ki(n,t,e){function r(t){return e[Math.max(0,Math.min(o,Math.floor(i*(t-n))))]}function u(){return i=e.length/(t-n),o=e.length-1,r}var i,o;return r.domain=function(e){return arguments.length?(n=+e[0],t=+e[e.length-1],u()):[n,t]},r.range=function(n){return arguments.length?(e=n,u()):e},r.invertExtent=function(t){return t=e.indexOf(t),t=0>t?0/0:t/i+n,[t,t+1/i]},r.copy=function(){return Ki(n,t,e)},u()}function Qi(n,t){function e(e){return e>=e?t[Xo.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return Qi(n,t)},e}function no(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Ii(n,t)},t.tickFormat=function(t,e){return Zi(n,t,e)},t.copy=function(){return no(n)},t}function to(n){return n.innerRadius}function eo(n){return n.outerRadius}function ro(n){return n.startAngle}function uo(n){return n.endAngle}function io(n){function t(t){function o(){s.push("M",i(n(l),a))}for(var c,s=[],l=[],f=-1,h=t.length,g=_t(e),p=_t(r);++f<h;)u.call(this,c=t[f],f)?l.push([+g.call(this,c,f),+p.call(this,c,f)]):l.length&&(o(),l=[]);return l.length&&o(),s.length?s.join(""):null}var e=br,r=wr,u=be,i=oo,o=i.key,a=.7;return t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.defined=function(n){return arguments.length?(u=n,t):u},t.interpolate=function(n){return arguments.length?(o="function"==typeof n?i=n:(i=Ms.get(n)||oo).key,t):o},t.tension=function(n){return arguments.length?(a=n,t):a},t}function oo(n){return n.join("L")}function ao(n){return oo(n)+"Z"}function co(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r[0]+(r=n[t])[0])/2,"V",r[1]);return e>1&&u.push("H",r[0]),u.join("")}function so(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("V",(r=n[t])[1],"H",r[0]);return u.join("")}function lo(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r=n[t])[0],"V",r[1]);return u.join("")}function fo(n,t){return n.length<4?oo(n):n[1]+po(n.slice(1,n.length-1),vo(n,t))}function ho(n,t){return n.length<3?oo(n):n[0]+po((n.push(n[0]),n),vo([n[n.length-2]].concat(n,[n[1]]),t))}function go(n,t){return n.length<3?oo(n):n[0]+po(n,vo(n,t))}function po(n,t){if(t.length<1||n.length!=t.length&&n.length!=t.length+2)return oo(n);var e=n.length!=t.length,r="",u=n[0],i=n[1],o=t[0],a=o,c=1;if(e&&(r+="Q"+(i[0]-2*o[0]/3)+","+(i[1]-2*o[1]/3)+","+i[0]+","+i[1],u=n[1],c=2),t.length>1){a=t[1],i=n[c],c++,r+="C"+(u[0]+o[0])+","+(u[1]+o[1])+","+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1];for(var s=2;s<t.length;s++,c++)i=n[c],a=t[s],r+="S"+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1]}if(e){var l=n[c];r+="Q"+(i[0]+2*a[0]/3)+","+(i[1]+2*a[1]/3)+","+l[0]+","+l[1]}return r}function vo(n,t){for(var e,r=[],u=(1-t)/2,i=n[0],o=n[1],a=1,c=n.length;++a<c;)e=i,i=o,o=n[a],r.push([u*(o[0]-e[0]),u*(o[1]-e[1])]);return r}function mo(n){if(n.length<3)return oo(n);var t=1,e=n.length,r=n[0],u=r[0],i=r[1],o=[u,u,u,(r=n[1])[0]],a=[i,i,i,r[1]],c=[u,",",i,"L",_o(ws,o),",",_o(ws,a)];for(n.push(n[e-1]);++t<=e;)r=n[t],o.shift(),o.push(r[0]),a.shift(),a.push(r[1]),bo(c,o,a);return n.pop(),c.push("L",r),c.join("")}function yo(n){if(n.length<4)return oo(n);for(var t,e=[],r=-1,u=n.length,i=[0],o=[0];++r<3;)t=n[r],i.push(t[0]),o.push(t[1]);for(e.push(_o(ws,i)+","+_o(ws,o)),--r;++r<u;)t=n[r],i.shift(),i.push(t[0]),o.shift(),o.push(t[1]),bo(e,i,o);return e.join("")}function xo(n){for(var t,e,r=-1,u=n.length,i=u+4,o=[],a=[];++r<4;)e=n[r%u],o.push(e[0]),a.push(e[1]);for(t=[_o(ws,o),",",_o(ws,a)],--r;++r<i;)e=n[r%u],o.shift(),o.push(e[0]),a.shift(),a.push(e[1]),bo(t,o,a);return t.join("")}function Mo(n,t){var e=n.length-1;if(e)for(var r,u,i=n[0][0],o=n[0][1],a=n[e][0]-i,c=n[e][1]-o,s=-1;++s<=e;)r=n[s],u=s/e,r[0]=t*r[0]+(1-t)*(i+u*a),r[1]=t*r[1]+(1-t)*(o+u*c);return mo(n)}function _o(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]}function bo(n,t,e){n.push("C",_o(_s,t),",",_o(_s,e),",",_o(bs,t),",",_o(bs,e),",",_o(ws,t),",",_o(ws,e))}function wo(n,t){return(t[1]-n[1])/(t[0]-n[0])}function So(n){for(var t=0,e=n.length-1,r=[],u=n[0],i=n[1],o=r[0]=wo(u,i);++t<e;)r[t]=(o+(o=wo(u=i,i=n[t+1])))/2;return r[t]=o,r}function ko(n){for(var t,e,r,u,i=[],o=So(n),a=-1,c=n.length-1;++a<c;)t=wo(n[a],n[a+1]),oa(t)<Aa?o[a]=o[a+1]=0:(e=o[a]/t,r=o[a+1]/t,u=e*e+r*r,u>9&&(u=3*t/Math.sqrt(u),o[a]=u*e,o[a+1]=u*r));for(a=-1;++a<=c;)u=(n[Math.min(c,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),i.push([u||0,o[a]*u||0]);return i}function Eo(n){return n.length<3?oo(n):n[0]+po(n,ko(n))}function Ao(n){for(var t,e,r,u=-1,i=n.length;++u<i;)t=n[u],e=t[0],r=t[1]+ys,t[0]=e*Math.cos(r),t[1]=e*Math.sin(r);return n}function Co(n){function t(t){function c(){v.push("M",a(n(m),f),l,s(n(d.reverse()),f),"Z")}for(var h,g,p,v=[],d=[],m=[],y=-1,x=t.length,M=_t(e),_=_t(u),b=e===r?function(){return g}:_t(r),w=u===i?function(){return p}:_t(i);++y<x;)o.call(this,h=t[y],y)?(d.push([g=+M.call(this,h,y),p=+_.call(this,h,y)]),m.push([+b.call(this,h,y),+w.call(this,h,y)])):d.length&&(c(),d=[],m=[]);return d.length&&c(),v.length?v.join(""):null}var e=br,r=br,u=0,i=wr,o=be,a=oo,c=a.key,s=a,l="L",f=.7;return t.x=function(n){return arguments.length?(e=r=n,t):r},t.x0=function(n){return arguments.length?(e=n,t):e},t.x1=function(n){return arguments.length?(r=n,t):r},t.y=function(n){return arguments.length?(u=i=n,t):i},t.y0=function(n){return arguments.length?(u=n,t):u},t.y1=function(n){return arguments.length?(i=n,t):i},t.defined=function(n){return arguments.length?(o=n,t):o},t.interpolate=function(n){return arguments.length?(c="function"==typeof n?a=n:(a=Ms.get(n)||oo).key,s=a.reverse||a,l=a.closed?"M":"L",t):c},t.tension=function(n){return arguments.length?(f=n,t):f},t}function No(n){return n.radius}function Lo(n){return[n.x,n.y]}function To(n){return function(){var t=n.apply(this,arguments),e=t[0],r=t[1]+ys;return[e*Math.cos(r),e*Math.sin(r)]}}function qo(){return 64}function zo(){return"circle"}function Ro(n){var t=Math.sqrt(n/Sa);return"M0,"+t+"A"+t+","+t+" 0 1,1 0,"+-t+"A"+t+","+t+" 0 1,1 0,"+t+"Z"}function Do(n,t){return fa(n,Ns),n.id=t,n}function Po(n,t,e,r){var u=n.id;return R(n,"function"==typeof e?function(n,i,o){n.__transition__[u].tween.set(t,r(e.call(n,n.__data__,i,o)))}:(e=r(e),function(n){n.__transition__[u].tween.set(t,e)}))}function Uo(n){return null==n&&(n=""),function(){this.textContent=n}}function jo(n,t,e,r){var i=n.__transition__||(n.__transition__={active:0,count:0}),o=i[e];if(!o){var a=r.time;o=i[e]={tween:new u,time:a,ease:r.ease,delay:r.delay,duration:r.duration},++i.count,Xo.timer(function(r){function u(r){return i.active>e?s():(i.active=e,o.event&&o.event.start.call(n,l,t),o.tween.forEach(function(e,r){(r=r.call(n,l,t))&&v.push(r)}),Xo.timer(function(){return p.c=c(r||1)?be:c,1},0,a),void 0)}function c(r){if(i.active!==e)return s();for(var u=r/g,a=f(u),c=v.length;c>0;)v[--c].call(n,a);return u>=1?(o.event&&o.event.end.call(n,l,t),s()):void 0}function s(){return--i.count?delete i[e]:delete n.__transition__,1}var l=n.__data__,f=o.ease,h=o.delay,g=o.duration,p=Ja,v=[];return p.t=h+a,r>=h?u(r-h):(p.c=u,void 0)},0,a)}}function Ho(n,t){n.attr("transform",function(n){return"translate("+t(n)+",0)"})}function Fo(n,t){n.attr("transform",function(n){return"translate(0,"+t(n)+")"})}function Oo(n){return n.toISOString()}function Yo(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=Xo.bisect(js,u);return i==js.length?[t.year,Yi(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/js[i-1]<js[i]/u?i-1:i]:[Os,Yi(n,e)[2]]}return r.invert=function(t){return Io(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain(t),r):n.domain().map(Io)},r.nice=function(n,t){function e(e){return!isNaN(e)&&!n.range(e,Io(+e+1),t).length}var i=r.domain(),o=zi(i),a=null==n?u(o,10):"number"==typeof n&&u(o,n);return a&&(n=a[0],t=a[1]),r.domain(Pi(i,t>1?{floor:function(t){for(;e(t=n.floor(t));)t=Io(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=Io(+t+1);return t}}:n))},r.ticks=function(n,t){var e=zi(r.domain()),i=null==n?u(e,10):"number"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],Io(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return Yo(n.copy(),t,e)},Fi(r,n)}function Io(n){return new Date(n)}function Zo(n){return JSON.parse(n.responseText)}function Vo(n){var t=Wo.createRange();return t.selectNode(Wo.body),t.createContextualFragment(n.responseText)}var Xo={version:"3.4.3"};Date.now||(Date.now=function(){return+new Date});var $o=[].slice,Bo=function(n){return $o.call(n)},Wo=document,Jo=Wo.documentElement,Go=window;try{Bo(Jo.childNodes)[0].nodeType}catch(Ko){Bo=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}try{Wo.createElement("div").style.setProperty("opacity",0,"")}catch(Qo){var na=Go.Element.prototype,ta=na.setAttribute,ea=na.setAttributeNS,ra=Go.CSSStyleDeclaration.prototype,ua=ra.setProperty;na.setAttribute=function(n,t){ta.call(this,n,t+"")},na.setAttributeNS=function(n,t,e){ea.call(this,n,t,e+"")},ra.setProperty=function(n,t,e){ua.call(this,n,t+"",e)}}Xo.ascending=function(n,t){return t>n?-1:n>t?1:n>=t?0:0/0},Xo.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:0/0},Xo.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i&&!(null!=(e=n[u])&&e>=e);)e=void 0;for(;++u<i;)null!=(r=n[u])&&e>r&&(e=r)}else{for(;++u<i&&!(null!=(e=t.call(n,n[u],u))&&e>=e);)e=void 0;for(;++u<i;)null!=(r=t.call(n,n[u],u))&&e>r&&(e=r)}return e},Xo.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i&&!(null!=(e=n[u])&&e>=e);)e=void 0;for(;++u<i;)null!=(r=n[u])&&r>e&&(e=r)}else{for(;++u<i&&!(null!=(e=t.call(n,n[u],u))&&e>=e);)e=void 0;for(;++u<i;)null!=(r=t.call(n,n[u],u))&&r>e&&(e=r)}return e},Xo.extent=function(n,t){var e,r,u,i=-1,o=n.length;if(1===arguments.length){for(;++i<o&&!(null!=(e=u=n[i])&&e>=e);)e=u=void 0;for(;++i<o;)null!=(r=n[i])&&(e>r&&(e=r),r>u&&(u=r))}else{for(;++i<o&&!(null!=(e=u=t.call(n,n[i],i))&&e>=e);)e=void 0;for(;++i<o;)null!=(r=t.call(n,n[i],i))&&(e>r&&(e=r),r>u&&(u=r))}return[e,u]},Xo.sum=function(n,t){var e,r=0,u=n.length,i=-1;if(1===arguments.length)for(;++i<u;)isNaN(e=+n[i])||(r+=e);else for(;++i<u;)isNaN(e=+t.call(n,n[i],i))||(r+=e);return r},Xo.mean=function(t,e){var r,u=t.length,i=0,o=-1,a=0;if(1===arguments.length)for(;++o<u;)n(r=t[o])&&(i+=(r-i)/++a);else for(;++o<u;)n(r=e.call(t,t[o],o))&&(i+=(r-i)/++a);return a?i:void 0},Xo.quantile=function(n,t){var e=(n.length-1)*t+1,r=Math.floor(e),u=+n[r-1],i=e-r;return i?u+i*(n[r]-u):u},Xo.median=function(t,e){return arguments.length>1&&(t=t.map(e)),t=t.filter(n),t.length?Xo.quantile(t.sort(Xo.ascending),.5):void 0},Xo.bisector=function(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n.call(t,t[i],i)<e?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;e<n.call(t,t[i],i)?u=i:r=i+1}return r}}};var ia=Xo.bisector(function(n){return n});Xo.bisectLeft=ia.left,Xo.bisect=Xo.bisectRight=ia.right,Xo.shuffle=function(n){for(var t,e,r=n.length;r;)e=0|Math.random()*r--,t=n[r],n[r]=n[e],n[e]=t;return n},Xo.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},Xo.pairs=function(n){for(var t,e=0,r=n.length-1,u=n[0],i=new Array(0>r?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},Xo.zip=function(){if(!(u=arguments.length))return[];for(var n=-1,e=Xo.min(arguments,t),r=new Array(e);++n<e;)for(var u,i=-1,o=r[n]=new Array(u);++i<u;)o[i]=arguments[i][n];return r},Xo.transpose=function(n){return Xo.zip.apply(Xo,n)},Xo.keys=function(n){var t=[];for(var e in n)t.push(e);return t},Xo.values=function(n){var t=[];for(var e in n)t.push(n[e]);return t},Xo.entries=function(n){var t=[];for(var e in n)t.push({key:e,value:n[e]});return t},Xo.merge=function(n){for(var t,e,r,u=n.length,i=-1,o=0;++i<u;)o+=n[i].length;for(e=new Array(o);--u>=0;)for(r=n[u],t=r.length;--t>=0;)e[--o]=r[t];return e};var oa=Math.abs;Xo.range=function(n,t,r){if(arguments.length<3&&(r=1,arguments.length<2&&(t=n,n=0)),1/0===(t-n)/r)throw new Error("infinite range");var u,i=[],o=e(oa(r)),a=-1;if(n*=o,t*=o,r*=o,0>r)for(;(u=n+r*++a)>t;)i.push(u/o);else for(;(u=n+r*++a)<t;)i.push(u/o);return i},Xo.map=function(n){var t=new u;if(n instanceof u)n.forEach(function(n,e){t.set(n,e)});else for(var e in n)t.set(e,n[e]);return t},r(u,{has:i,get:function(n){return this[aa+n]},set:function(n,t){return this[aa+n]=t},remove:o,keys:a,values:function(){var n=[];return this.forEach(function(t,e){n.push(e)}),n},entries:function(){var n=[];return this.forEach(function(t,e){n.push({key:t,value:e})}),n},size:c,empty:s,forEach:function(n){for(var t in this)t.charCodeAt(0)===ca&&n.call(this,t.substring(1),this[t])}});var aa="\x00",ca=aa.charCodeAt(0);Xo.nest=function(){function n(t,a,c){if(c>=o.length)return r?r.call(i,a):e?a.sort(e):a;for(var s,l,f,h,g=-1,p=a.length,v=o[c++],d=new u;++g<p;)(h=d.get(s=v(l=a[g])))?h.push(l):d.set(s,[l]);return t?(l=t(),f=function(e,r){l.set(e,n(t,r,c))}):(l={},f=function(e,r){l[e]=n(t,r,c)}),d.forEach(f),l}function t(n,e){if(e>=o.length)return n;var r=[],u=a[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,i={},o=[],a=[];return i.map=function(t,e){return n(e,t,0)},i.entries=function(e){return t(n(Xo.map,e,0),0)},i.key=function(n){return o.push(n),i},i.sortKeys=function(n){return a[o.length-1]=n,i},i.sortValues=function(n){return e=n,i},i.rollup=function(n){return r=n,i},i},Xo.set=function(n){var t=new l;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},r(l,{has:i,add:function(n){return this[aa+n]=!0,n},remove:function(n){return n=aa+n,n in this&&delete this[n]},values:a,size:c,empty:s,forEach:function(n){for(var t in this)t.charCodeAt(0)===ca&&n.call(this,t.substring(1))}}),Xo.behavior={},Xo.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r<u;)n[e=arguments[r]]=f(n,t,t[e]);return n};var sa=["webkit","ms","moz","Moz","o","O"];Xo.dispatch=function(){for(var n=new p,t=-1,e=arguments.length;++t<e;)n[arguments[t]]=v(n);return n},p.prototype.on=function(n,t){var e=n.indexOf("."),r="";if(e>=0&&(r=n.substring(e+1),n=n.substring(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},Xo.event=null,Xo.requote=function(n){return n.replace(la,"\\$&")};var la=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,fa={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},ha=function(n,t){return t.querySelector(n)},ga=function(n,t){return t.querySelectorAll(n)},pa=Jo[h(Jo,"matchesSelector")],va=function(n,t){return pa.call(n,t)};"function"==typeof Sizzle&&(ha=function(n,t){return Sizzle(n,t)[0]||null},ga=Sizzle,va=Sizzle.matchesSelector),Xo.selection=function(){return xa};var da=Xo.selection.prototype=[];da.select=function(n){var t,e,r,u,i=[];n=M(n);for(var o=-1,a=this.length;++o<a;){i.push(t=[]),t.parentNode=(r=this[o]).parentNode;for(var c=-1,s=r.length;++c<s;)(u=r[c])?(t.push(e=n.call(u,u.__data__,c,o)),e&&"__data__"in u&&(e.__data__=u.__data__)):t.push(null)}return x(i)},da.selectAll=function(n){var t,e,r=[];n=_(n);for(var u=-1,i=this.length;++u<i;)for(var o=this[u],a=-1,c=o.length;++a<c;)(e=o[a])&&(r.push(t=Bo(n.call(e,e.__data__,a,u))),t.parentNode=e);return x(r)};var ma={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};Xo.ns={prefix:ma,qualify:function(n){var t=n.indexOf(":"),e=n;return t>=0&&(e=n.substring(0,t),n=n.substring(t+1)),ma.hasOwnProperty(e)?{space:ma[e],local:n}:n}},da.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=Xo.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(b(t,n[t]));return this}return this.each(b(n,t))},da.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=k(n)).length,u=-1;if(t=e.classList){for(;++u<r;)if(!t.contains(n[u]))return!1}else for(t=e.getAttribute("class");++u<r;)if(!S(n[u]).test(t))return!1;return!0}for(t in n)this.each(E(t,n[t]));return this}return this.each(E(n,t))},da.style=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t="");for(e in n)this.each(C(e,n[e],t));return this}if(2>r)return Go.getComputedStyle(this.node(),null).getPropertyValue(n);e=""}return this.each(C(n,t,e))},da.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(N(t,n[t]));return this}return this.each(N(n,t))},da.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},da.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},da.append=function(n){return n=L(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},da.insert=function(n,t){return n=L(n),t=M(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},da.remove=function(){return this.each(function(){var n=this.parentNode;n&&n.removeChild(this)})},da.data=function(n,t){function e(n,e){var r,i,o,a=n.length,f=e.length,h=Math.min(a,f),g=new Array(f),p=new Array(f),v=new Array(a);if(t){var d,m=new u,y=new u,x=[];for(r=-1;++r<a;)d=t.call(i=n[r],i.__data__,r),m.has(d)?v[r]=i:m.set(d,i),x.push(d);for(r=-1;++r<f;)d=t.call(e,o=e[r],r),(i=m.get(d))?(g[r]=i,i.__data__=o):y.has(d)||(p[r]=T(o)),y.set(d,o),m.remove(d);for(r=-1;++r<a;)m.has(x[r])&&(v[r]=n[r])}else{for(r=-1;++r<h;)i=n[r],o=e[r],i?(i.__data__=o,g[r]=i):p[r]=T(o);for(;f>r;++r)p[r]=T(e[r]);for(;a>r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,c.push(p),s.push(g),l.push(v)}var r,i,o=-1,a=this.length;if(!arguments.length){for(n=new Array(a=(r=this[0]).length);++o<a;)(i=r[o])&&(n[o]=i.__data__);return n}var c=D([]),s=x([]),l=x([]);if("function"==typeof n)for(;++o<a;)e(r=this[o],n.call(r,r.parentNode.__data__,o));else for(;++o<a;)e(r=this[o],n);return s.enter=function(){return c},s.exit=function(){return l},s},da.datum=function(n){return arguments.length?this.property("__data__",n):this.property("__data__")},da.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=q(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return x(u)},da.order=function(){for(var n=-1,t=this.length;++n<t;)for(var e,r=this[n],u=r.length-1,i=r[u];--u>=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},da.sort=function(n){n=z.apply(this,arguments);for(var t=-1,e=this.length;++t<e;)this[t].sort(n);return this.order()},da.each=function(n){return R(this,function(t,e,r){n.call(t,t.__data__,e,r)})},da.call=function(n){var t=Bo(arguments);return n.apply(t[0]=this,t),this},da.empty=function(){return!this.node()},da.node=function(){for(var n=0,t=this.length;t>n;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},da.size=function(){var n=0;return this.each(function(){++n}),n};var ya=[];Xo.selection.enter=D,Xo.selection.enter.prototype=ya,ya.append=da.append,ya.empty=da.empty,ya.node=da.node,ya.call=da.call,ya.size=da.size,ya.select=function(n){for(var t,e,r,u,i,o=[],a=-1,c=this.length;++a<c;){r=(u=this[a]).update,o.push(t=[]),t.parentNode=u.parentNode;for(var s=-1,l=u.length;++s<l;)(i=u[s])?(t.push(r[s]=e=n.call(u.parentNode,i.__data__,s,a)),e.__data__=i.__data__):t.push(null)}return x(o)},ya.insert=function(n,t){return arguments.length<2&&(t=P(this)),da.insert.call(this,n,t)},da.transition=function(){for(var n,t,e=ks||++Ls,r=[],u=Es||{time:Date.now(),ease:yu,delay:0,duration:250},i=-1,o=this.length;++i<o;){r.push(n=[]);for(var a=this[i],c=-1,s=a.length;++c<s;)(t=a[c])&&jo(t,c,e,u),n.push(t)}return Do(r,e)},da.interrupt=function(){return this.each(U)},Xo.select=function(n){var t=["string"==typeof n?ha(n,Wo):n];return t.parentNode=Jo,x([t])},Xo.selectAll=function(n){var t=Bo("string"==typeof n?ga(n,Wo):n);return t.parentNode=Jo,x([t])};var xa=Xo.select(Jo);da.on=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(j(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(j(n,t,e))};var Ma=Xo.map({mouseenter:"mouseover",mouseleave:"mouseout"});Ma.forEach(function(n){"on"+n in Wo&&Ma.remove(n)});var _a="onselectstart"in Wo?null:h(Jo.style,"userSelect"),ba=0;Xo.mouse=function(n){return Y(n,m())};var wa=/WebKit/.test(Go.navigator.userAgent)?-1:0;Xo.touches=function(n,t){return arguments.length<2&&(t=m().touches),t?Bo(t).map(function(t){var e=Y(n,t);return e.identifier=t.identifier,e}):[]},Xo.behavior.drag=function(){function n(){this.on("mousedown.drag",o).on("touchstart.drag",a)}function t(){return Xo.event.changedTouches[0].identifier}function e(n,t){return Xo.touches(n).filter(function(n){return n.identifier===t})[0]}function r(n,t,e,r){return function(){function o(){var n=t(l,g),e=n[0]-v[0],r=n[1]-v[1];d|=e|r,v=n,f({type:"drag",x:n[0]+c[0],y:n[1]+c[1],dx:e,dy:r})}function a(){m.on(e+"."+p,null).on(r+"."+p,null),y(d&&Xo.event.target===h),f({type:"dragend"})}var c,s=this,l=s.parentNode,f=u.of(s,arguments),h=Xo.event.target,g=n(),p=null==g?"drag":"drag-"+g,v=t(l,g),d=0,m=Xo.select(Go).on(e+"."+p,o).on(r+"."+p,a),y=O();i?(c=i.apply(s,arguments),c=[c.x-v[0],c.y-v[1]]):c=[0,0],f({type:"dragstart"})}}var u=y(n,"drag","dragstart","dragend"),i=null,o=r(g,Xo.mouse,"mousemove","mouseup"),a=r(t,e,"touchmove","touchend");return n.origin=function(t){return arguments.length?(i=t,n):i},Xo.rebind(n,u,"on")};var Sa=Math.PI,ka=2*Sa,Ea=Sa/2,Aa=1e-6,Ca=Aa*Aa,Na=Sa/180,La=180/Sa,Ta=Math.SQRT2,qa=2,za=4;Xo.interpolateZoom=function(n,t){function e(n){var t=n*y;if(m){var e=B(v),o=i/(qa*h)*(e*W(Ta*t+v)-$(v));return[r+o*s,u+o*l,i*e/B(Ta*t+v)]}return[r+n*s,u+n*l,i*Math.exp(Ta*t)]}var r=n[0],u=n[1],i=n[2],o=t[0],a=t[1],c=t[2],s=o-r,l=a-u,f=s*s+l*l,h=Math.sqrt(f),g=(c*c-i*i+za*f)/(2*i*qa*h),p=(c*c-i*i-za*f)/(2*c*qa*h),v=Math.log(Math.sqrt(g*g+1)-g),d=Math.log(Math.sqrt(p*p+1)-p),m=d-v,y=(m||Math.log(c/i))/Ta;return e.duration=1e3*y,e},Xo.behavior.zoom=function(){function n(n){n.on(A,s).on(Pa+".zoom",f).on(C,h).on("dblclick.zoom",g).on(L,l)}function t(n){return[(n[0]-S.x)/S.k,(n[1]-S.y)/S.k]}function e(n){return[n[0]*S.k+S.x,n[1]*S.k+S.y]}function r(n){S.k=Math.max(E[0],Math.min(E[1],n))}function u(n,t){t=e(t),S.x+=n[0]-t[0],S.y+=n[1]-t[1]}function i(){_&&_.domain(M.range().map(function(n){return(n-S.x)/S.k}).map(M.invert)),w&&w.domain(b.range().map(function(n){return(n-S.y)/S.k}).map(b.invert))}function o(n){n({type:"zoomstart"})}function a(n){i(),n({type:"zoom",scale:S.k,translate:[S.x,S.y]})}function c(n){n({type:"zoomend"})}function s(){function n(){l=1,u(Xo.mouse(r),g),a(i)}function e(){f.on(C,Go===r?h:null).on(N,null),p(l&&Xo.event.target===s),c(i)}var r=this,i=T.of(r,arguments),s=Xo.event.target,l=0,f=Xo.select(Go).on(C,n).on(N,e),g=t(Xo.mouse(r)),p=O();U.call(r),o(i)}function l(){function n(){var n=Xo.touches(g);return h=S.k,n.forEach(function(n){n.identifier in v&&(v[n.identifier]=t(n))}),n}function e(){for(var t=Xo.event.changedTouches,e=0,i=t.length;i>e;++e)v[t[e].identifier]=null;var o=n(),c=Date.now();if(1===o.length){if(500>c-x){var s=o[0],l=v[s.identifier];r(2*S.k),u(s,l),d(),a(p)}x=c}else if(o.length>1){var s=o[0],f=o[1],h=s[0]-f[0],g=s[1]-f[1];m=h*h+g*g}}function i(){for(var n,t,e,i,o=Xo.touches(g),c=0,s=o.length;s>c;++c,i=null)if(e=o[c],i=v[e.identifier]){if(t)break;n=e,t=i}if(i){var l=(l=e[0]-n[0])*l+(l=e[1]-n[1])*l,f=m&&Math.sqrt(l/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+i[0])/2,(t[1]+i[1])/2],r(f*h)}x=null,u(n,t),a(p)}function f(){if(Xo.event.touches.length){for(var t=Xo.event.changedTouches,e=0,r=t.length;r>e;++e)delete v[t[e].identifier];for(var u in v)return void n()}b.on(M,null).on(_,null),w.on(A,s).on(L,l),k(),c(p)}var h,g=this,p=T.of(g,arguments),v={},m=0,y=Xo.event.changedTouches[0].identifier,M="touchmove.zoom-"+y,_="touchend.zoom-"+y,b=Xo.select(Go).on(M,i).on(_,f),w=Xo.select(g).on(A,null).on(L,e),k=O();U.call(g),e(),o(p)}function f(){var n=T.of(this,arguments);m?clearTimeout(m):(U.call(this),o(n)),m=setTimeout(function(){m=null,c(n)},50),d();var e=v||Xo.mouse(this);p||(p=t(e)),r(Math.pow(2,.002*Ra())*S.k),u(e,p),a(n)}function h(){p=null}function g(){var n=T.of(this,arguments),e=Xo.mouse(this),i=t(e),s=Math.log(S.k)/Math.LN2;o(n),r(Math.pow(2,Xo.event.shiftKey?Math.ceil(s)-1:Math.floor(s)+1)),u(e,i),a(n),c(n)}var p,v,m,x,M,_,b,w,S={x:0,y:0,k:1},k=[960,500],E=Da,A="mousedown.zoom",C="mousemove.zoom",N="mouseup.zoom",L="touchstart.zoom",T=y(n,"zoomstart","zoom","zoomend");return n.event=function(n){n.each(function(){var n=T.of(this,arguments),t=S;ks?Xo.select(this).transition().each("start.zoom",function(){S=this.__chart__||{x:0,y:0,k:1},o(n)}).tween("zoom:zoom",function(){var e=k[0],r=k[1],u=e/2,i=r/2,o=Xo.interpolateZoom([(u-S.x)/S.k,(i-S.y)/S.k,e/S.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=o(t),c=e/r[2];this.__chart__=S={x:u-r[0]*c,y:i-r[1]*c,k:c},a(n)}}).each("end.zoom",function(){c(n)}):(this.__chart__=S,o(n),a(n),c(n))})},n.translate=function(t){return arguments.length?(S={x:+t[0],y:+t[1],k:S.k},i(),n):[S.x,S.y]},n.scale=function(t){return arguments.length?(S={x:S.x,y:S.y,k:+t},i(),n):S.k},n.scaleExtent=function(t){return arguments.length?(E=null==t?Da:[+t[0],+t[1]],n):E},n.center=function(t){return arguments.length?(v=t&&[+t[0],+t[1]],n):v},n.size=function(t){return arguments.length?(k=t&&[+t[0],+t[1]],n):k},n.x=function(t){return arguments.length?(_=t,M=t.copy(),S={x:0,y:0,k:1},n):_},n.y=function(t){return arguments.length?(w=t,b=t.copy(),S={x:0,y:0,k:1},n):w},Xo.rebind(n,T,"on")};var Ra,Da=[0,1/0],Pa="onwheel"in Wo?(Ra=function(){return-Xo.event.deltaY*(Xo.event.deltaMode?120:1)},"wheel"):"onmousewheel"in Wo?(Ra=function(){return Xo.event.wheelDelta},"mousewheel"):(Ra=function(){return-Xo.event.detail},"MozMousePixelScroll");G.prototype.toString=function(){return this.rgb()+""},Xo.hsl=function(n,t,e){return 1===arguments.length?n instanceof Q?K(n.h,n.s,n.l):dt(""+n,mt,K):K(+n,+t,+e)};var Ua=Q.prototype=new G;Ua.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),K(this.h,this.s,this.l/n)},Ua.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),K(this.h,this.s,n*this.l)},Ua.rgb=function(){return nt(this.h,this.s,this.l)},Xo.hcl=function(n,t,e){return 1===arguments.length?n instanceof et?tt(n.h,n.c,n.l):n instanceof it?at(n.l,n.a,n.b):at((n=yt((n=Xo.rgb(n)).r,n.g,n.b)).l,n.a,n.b):tt(+n,+t,+e)};var ja=et.prototype=new G;ja.brighter=function(n){return tt(this.h,this.c,Math.min(100,this.l+Ha*(arguments.length?n:1)))},ja.darker=function(n){return tt(this.h,this.c,Math.max(0,this.l-Ha*(arguments.length?n:1)))},ja.rgb=function(){return rt(this.h,this.c,this.l).rgb()},Xo.lab=function(n,t,e){return 1===arguments.length?n instanceof it?ut(n.l,n.a,n.b):n instanceof et?rt(n.l,n.c,n.h):yt((n=Xo.rgb(n)).r,n.g,n.b):ut(+n,+t,+e)};var Ha=18,Fa=.95047,Oa=1,Ya=1.08883,Ia=it.prototype=new G;Ia.brighter=function(n){return ut(Math.min(100,this.l+Ha*(arguments.length?n:1)),this.a,this.b)},Ia.darker=function(n){return ut(Math.max(0,this.l-Ha*(arguments.length?n:1)),this.a,this.b)},Ia.rgb=function(){return ot(this.l,this.a,this.b)},Xo.rgb=function(n,t,e){return 1===arguments.length?n instanceof pt?gt(n.r,n.g,n.b):dt(""+n,gt,nt):gt(~~n,~~t,~~e)};var Za=pt.prototype=new G;Za.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),gt(Math.min(255,~~(t/n)),Math.min(255,~~(e/n)),Math.min(255,~~(r/n)))):gt(u,u,u)},Za.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),gt(~~(n*this.r),~~(n*this.g),~~(n*this.b))},Za.hsl=function(){return mt(this.r,this.g,this.b)},Za.toString=function(){return"#"+vt(this.r)+vt(this.g)+vt(this.b)};var Va=Xo.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});Va.forEach(function(n,t){Va.set(n,ft(t))}),Xo.functor=_t,Xo.xhr=wt(bt),Xo.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var o=St(n,t,null==e?r:u(e),i);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:u(n)):e},o}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function i(t){return t.map(o).join(n)}function o(n){return a.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var a=new RegExp('["'+n+"\n]"),c=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(l>=s)return o;if(u)return u=!1,i;var t=l;if(34===n.charCodeAt(t)){for(var e=t;e++<s;)if(34===n.charCodeAt(e)){if(34!==n.charCodeAt(e+1))break;++e}l=e+2;var r=n.charCodeAt(e+1);return 13===r?(u=!0,10===n.charCodeAt(e+2)&&++l):10===r&&(u=!0),n.substring(t+1,e).replace(/""/g,'"')}for(;s>l;){var r=n.charCodeAt(l++),a=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(l)&&(++l,++a);else if(r!==c)continue;return n.substring(t,l-a)}return n.substring(t)}for(var r,u,i={},o={},a=[],s=n.length,l=0,f=0;(r=e())!==o;){for(var h=[];r!==i&&r!==o;)h.push(r),r=e();(!t||(h=t(h,f++)))&&a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new l,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(o).join(n)].concat(t.map(function(t){return u.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(i).join("\n")},e},Xo.csv=Xo.dsv(",","text/csv"),Xo.tsv=Xo.dsv(" ","text/tab-separated-values");var Xa,$a,Ba,Wa,Ja,Ga=Go[h(Go,"requestAnimationFrame")]||function(n){setTimeout(n,17)};Xo.timer=function(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={c:n,t:u,f:!1,n:null};$a?$a.n=i:Xa=i,$a=i,Ba||(Wa=clearTimeout(Wa),Ba=1,Ga(Et))},Xo.timer.flush=function(){At(),Ct()},Xo.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var Ka=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(Lt);Xo.formatPrefix=function(n,t){var e=0;return n&&(0>n&&(n*=-1),t&&(n=Xo.round(n,Nt(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((0>=e?e+1:e-1)/3)))),Ka[8+e/3]};var Qa=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,nc=Xo.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=Xo.round(n,Nt(n,t))).toFixed(Math.max(0,Math.min(20,Nt(n*(1+1e-15),t))))}}),tc=Xo.time={},ec=Date;zt.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){rc.setUTCDate.apply(this._,arguments)},setDay:function(){rc.setUTCDay.apply(this._,arguments)},setFullYear:function(){rc.setUTCFullYear.apply(this._,arguments)},setHours:function(){rc.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){rc.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){rc.setUTCMinutes.apply(this._,arguments)},setMonth:function(){rc.setUTCMonth.apply(this._,arguments)},setSeconds:function(){rc.setUTCSeconds.apply(this._,arguments)},setTime:function(){rc.setTime.apply(this._,arguments)}};var rc=Date.prototype;tc.year=Rt(function(n){return n=tc.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),tc.years=tc.year.range,tc.years.utc=tc.year.utc.range,tc.day=Rt(function(n){var t=new ec(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),tc.days=tc.day.range,tc.days.utc=tc.day.utc.range,tc.dayOfYear=function(n){var t=tc.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=tc[n]=Rt(function(n){return(n=tc.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=tc.year(n).getDay();return Math.floor((tc.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});tc[n+"s"]=e.range,tc[n+"s"].utc=e.utc.range,tc[n+"OfYear"]=function(n){var e=tc.year(n).getDay();return Math.floor((tc.dayOfYear(n)+(e+t)%7)/7)}}),tc.week=tc.sunday,tc.weeks=tc.sunday.range,tc.weeks.utc=tc.sunday.utc.range,tc.weekOfYear=tc.sundayOfYear;var uc={"-":"",_:" ",0:"0"},ic=/^\s*\d+/,oc=/^%/;Xo.locale=function(n){return{numberFormat:Tt(n),timeFormat:Pt(n)}};var ac=Xo.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});Xo.format=ac.numberFormat,Xo.geo={},re.prototype={s:0,t:0,add:function(n){ue(n,this.t,cc),ue(cc.s,this.s,this),this.s?this.t+=cc.t:this.s=cc.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var cc=new re;Xo.geo.stream=function(n,t){n&&sc.hasOwnProperty(n.type)?sc[n.type](n,t):ie(n,t)};var sc={Feature:function(n,t){ie(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++r<u;)ie(e[r].geometry,t)}},lc={Sphere:function(n,t){t.sphere()},Point:function(n,t){n=n.coordinates,t.point(n[0],n[1],n[2])},MultiPoint:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)n=e[r],t.point(n[0],n[1],n[2])},LineString:function(n,t){oe(n.coordinates,t,0)},MultiLineString:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)oe(e[r],t,0)},Polygon:function(n,t){ae(n.coordinates,t)},MultiPolygon:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)ae(e[r],t)},GeometryCollection:function(n,t){for(var e=n.geometries,r=-1,u=e.length;++r<u;)ie(e[r],t)}};Xo.geo.area=function(n){return fc=0,Xo.geo.stream(n,gc),fc};var fc,hc=new re,gc={sphere:function(){fc+=4*Sa},point:g,lineStart:g,lineEnd:g,polygonStart:function(){hc.reset(),gc.lineStart=ce},polygonEnd:function(){var n=2*hc;fc+=0>n?4*Sa+n:n,gc.lineStart=gc.lineEnd=gc.point=g}};Xo.geo.bounds=function(){function n(n,t){x.push(M=[l=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=se([t*Na,e*Na]);if(m){var u=fe(m,r),i=[u[1],-u[0],0],o=fe(i,u);pe(o),o=ve(o);var c=t-p,s=c>0?1:-1,v=o[0]*La*s,d=oa(c)>180;if(d^(v>s*p&&s*t>v)){var y=o[1]*La;y>g&&(g=y)}else if(v=(v+360)%360-180,d^(v>s*p&&s*t>v)){var y=-o[1]*La;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?a(l,t)>a(l,h)&&(h=t):a(t,h)>a(l,h)&&(l=t):h>=l?(l>t&&(l=t),t>h&&(h=t)):t>p?a(l,t)>a(l,h)&&(h=t):a(t,h)>a(l,h)&&(l=t)}else n(t,e);m=r,p=t}function e(){_.point=t}function r(){M[0]=l,M[1]=h,_.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=oa(r)>180?r+(r>0?360:-360):r}else v=n,d=e;gc.point(n,e),t(n,e)}function i(){gc.lineStart()}function o(){u(v,d),gc.lineEnd(),oa(y)>Aa&&(l=-(h=180)),M[0]=l,M[1]=h,m=null}function a(n,t){return(t-=n)<0?t+360:t}function c(n,t){return n[0]-t[0]}function s(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:n<t[0]||t[1]<n}var l,f,h,g,p,v,d,m,y,x,M,_={point:n,lineStart:e,lineEnd:r,polygonStart:function(){_.point=u,_.lineStart=i,_.lineEnd=o,y=0,gc.polygonStart()},polygonEnd:function(){gc.polygonEnd(),_.point=n,_.lineStart=e,_.lineEnd=r,0>hc?(l=-(h=180),f=-(g=90)):y>Aa?g=90:-Aa>y&&(f=-90),M[0]=l,M[1]=h}};return function(n){g=h=-(l=f=1/0),x=[],Xo.geo.stream(n,_);var t=x.length;if(t){x.sort(c);for(var e,r=1,u=x[0],i=[u];t>r;++r)e=x[r],s(e[0],u)||s(e[1],u)?(a(u[0],e[1])>a(u[0],u[1])&&(u[1]=e[1]),a(e[0],u[1])>a(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var o,e,p=-1/0,t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(o=a(u[1],e[0]))>p&&(p=o,l=e[0],h=u[1])}return x=M=null,1/0===l||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[l,f],[h,g]]}}(),Xo.geo.centroid=function(n){pc=vc=dc=mc=yc=xc=Mc=_c=bc=wc=Sc=0,Xo.geo.stream(n,kc);var t=bc,e=wc,r=Sc,u=t*t+e*e+r*r;return Ca>u&&(t=xc,e=Mc,r=_c,Aa>vc&&(t=dc,e=mc,r=yc),u=t*t+e*e+r*r,Ca>u)?[0/0,0/0]:[Math.atan2(e,t)*La,X(r/Math.sqrt(u))*La]};var pc,vc,dc,mc,yc,xc,Mc,_c,bc,wc,Sc,kc={sphere:g,point:me,lineStart:xe,lineEnd:Me,polygonStart:function(){kc.lineStart=_e},polygonEnd:function(){kc.lineStart=xe}},Ec=Ee(be,Te,ze,[-Sa,-Sa/2]),Ac=1e9;Xo.geo.clipExtent=function(){var n,t,e,r,u,i,o={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(a){return arguments.length?(i=Pe(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),u&&(u.valid=!1,u=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(Xo.geo.conicEqualArea=function(){return je(He)}).raw=He,Xo.geo.albers=function(){return Xo.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},Xo.geo.albersUsa=function(){function n(n){var i=n[0],o=n[1];return t=null,e(i,o),t||(r(i,o),t)||u(i,o),t}var t,e,r,u,i=Xo.geo.albers(),o=Xo.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=Xo.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),c={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?o:u>=.166&&.234>u&&r>=-.214&&-.115>r?a:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),o.precision(t),a.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),o.scale(.35*t),a.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var s=i.scale(),l=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[l-.455*s,f-.238*s],[l+.455*s,f+.238*s]]).stream(c).point,r=o.translate([l-.307*s,f+.201*s]).clipExtent([[l-.425*s+Aa,f+.12*s+Aa],[l-.214*s-Aa,f+.234*s-Aa]]).stream(c).point,u=a.translate([l-.205*s,f+.212*s]).clipExtent([[l-.214*s+Aa,f+.166*s+Aa],[l-.115*s-Aa,f+.234*s-Aa]]).stream(c).point,n},n.scale(1070)};var Cc,Nc,Lc,Tc,qc,zc,Rc={point:g,lineStart:g,lineEnd:g,polygonStart:function(){Nc=0,Rc.lineStart=Fe},polygonEnd:function(){Rc.lineStart=Rc.lineEnd=Rc.point=g,Cc+=oa(Nc/2)}},Dc={point:Oe,lineStart:g,lineEnd:g,polygonStart:g,polygonEnd:g},Pc={point:Ze,lineStart:Ve,lineEnd:Xe,polygonStart:function(){Pc.lineStart=$e},polygonEnd:function(){Pc.point=Ze,Pc.lineStart=Ve,Pc.lineEnd=Xe}};Xo.geo.path=function(){function n(n){return n&&("function"==typeof a&&i.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=u(i)),Xo.geo.stream(n,o)),i.result()}function t(){return o=null,n}var e,r,u,i,o,a=4.5;return n.area=function(n){return Cc=0,Xo.geo.stream(n,u(Rc)),Cc},n.centroid=function(n){return dc=mc=yc=xc=Mc=_c=bc=wc=Sc=0,Xo.geo.stream(n,u(Pc)),Sc?[bc/Sc,wc/Sc]:_c?[xc/_c,Mc/_c]:yc?[dc/yc,mc/yc]:[0/0,0/0]},n.bounds=function(n){return qc=zc=-(Lc=Tc=1/0),Xo.geo.stream(n,u(Dc)),[[Lc,Tc],[qc,zc]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||Je(n):bt,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new Ye:new Be(n),"function"!=typeof a&&i.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(i.pointRadius(+t),+t),n):a},n.projection(Xo.geo.albersUsa()).context(null)},Xo.geo.transform=function(n){return{stream:function(t){var e=new Ge(t);for(var r in n)e[r]=n[r];return e}}},Ge.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},Xo.geo.projection=Qe,Xo.geo.projectionMutator=nr,(Xo.geo.equirectangular=function(){return Qe(er)}).raw=er.invert=er,Xo.geo.rotation=function(n){function t(t){return t=n(t[0]*Na,t[1]*Na),t[0]*=La,t[1]*=La,t}return n=ur(n[0]%360*Na,n[1]*Na,n.length>2?n[2]*Na:0),t.invert=function(t){return t=n.invert(t[0]*Na,t[1]*Na),t[0]*=La,t[1]*=La,t},t},rr.invert=er,Xo.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=ur(-n[0]*Na,-n[1]*Na,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=La,n[1]*=La}}),{type:"Polygon",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=cr((t=+r)*Na,u*Na),n):t},n.precision=function(r){return arguments.length?(e=cr(t*Na,(u=+r)*Na),n):u},n.angle(90)},Xo.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Na,u=n[1]*Na,i=t[1]*Na,o=Math.sin(r),a=Math.cos(r),c=Math.sin(u),s=Math.cos(u),l=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*o)*e+(e=s*l-c*f*a)*e),c*l+s*f*a)},Xo.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return Xo.range(Math.ceil(i/d)*d,u,d).map(h).concat(Xo.range(Math.ceil(s/m)*m,c,m).map(g)).concat(Xo.range(Math.ceil(r/p)*p,e,p).filter(function(n){return oa(n%d)>Aa}).map(l)).concat(Xo.range(Math.ceil(a/v)*v,o,v).filter(function(n){return oa(n%m)>Aa}).map(f))}var e,r,u,i,o,a,c,s,l,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(i).concat(g(c).slice(1),h(u).reverse().slice(1),g(s).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],s=+t[0][1],c=+t[1][1],i>u&&(t=i,i=u,u=t),s>c&&(t=s,s=c,c=t),n.precision(y)):[[i,s],[u,c]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(y)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,l=lr(a,o,90),f=fr(r,e,y),h=lr(s,c,90),g=fr(i,u,y),n):y},n.majorExtent([[-180,-90+Aa],[180,90-Aa]]).minorExtent([[-180,-80-Aa],[180,80+Aa]])},Xo.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=hr,u=gr;return n.distance=function(){return Xo.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e="function"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},Xo.geo.interpolate=function(n,t){return pr(n[0]*Na,n[1]*Na,t[0]*Na,t[1]*Na)},Xo.geo.length=function(n){return Uc=0,Xo.geo.stream(n,jc),Uc};var Uc,jc={sphere:g,point:g,lineStart:vr,lineEnd:g,polygonStart:g,polygonEnd:g},Hc=dr(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(Xo.geo.azimuthalEqualArea=function(){return Qe(Hc)}).raw=Hc;var Fc=dr(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},bt);(Xo.geo.azimuthalEquidistant=function(){return Qe(Fc)}).raw=Fc,(Xo.geo.conicConformal=function(){return je(mr)}).raw=mr,(Xo.geo.conicEquidistant=function(){return je(yr)}).raw=yr;var Oc=dr(function(n){return 1/n},Math.atan);(Xo.geo.gnomonic=function(){return Qe(Oc)}).raw=Oc,xr.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Ea]},(Xo.geo.mercator=function(){return Mr(xr)}).raw=xr;var Yc=dr(function(){return 1},Math.asin);(Xo.geo.orthographic=function(){return Qe(Yc)}).raw=Yc;var Ic=dr(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(Xo.geo.stereographic=function(){return Qe(Ic)}).raw=Ic,_r.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Ea]},(Xo.geo.transverseMercator=function(){var n=Mr(_r),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[-n[1],n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},n.rotate([0,0])}).raw=_r,Xo.geom={},Xo.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u=_t(e),i=_t(r),o=n.length,a=[],c=[];for(t=0;o>t;t++)a.push([+u.call(this,n[t],t),+i.call(this,n[t],t),t]);for(a.sort(kr),t=0;o>t;t++)c.push([a[t][0],-a[t][1]]);var s=Sr(a),l=Sr(c),f=l[0]===s[0],h=l[l.length-1]===s[s.length-1],g=[];for(t=s.length-1;t>=0;--t)g.push(n[a[s[t]][2]]);for(t=+f;t<l.length-h;++t)g.push(n[a[l[t]][2]]);return g}var e=br,r=wr;return arguments.length?t(n):(t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t)},Xo.geom.polygon=function(n){return fa(n,Zc),n};var Zc=Xo.geom.polygon.prototype=[];Zc.area=function(){for(var n,t=-1,e=this.length,r=this[e-1],u=0;++t<e;)n=r,r=this[t],u+=n[1]*r[0]-n[0]*r[1];return.5*u},Zc.centroid=function(n){var t,e,r=-1,u=this.length,i=0,o=0,a=this[u-1];for(arguments.length||(n=-1/(6*this.area()));++r<u;)t=a,a=this[r],e=t[0]*a[1]-a[0]*t[1],i+=(t[0]+a[0])*e,o+=(t[1]+a[1])*e;return[i*n,o*n]},Zc.clip=function(n){for(var t,e,r,u,i,o,a=Cr(n),c=-1,s=this.length-Cr(this),l=this[s-1];++c<s;){for(t=n.slice(),n.length=0,u=this[c],i=t[(r=t.length-a)-1],e=-1;++e<r;)o=t[e],Er(o,l,u)?(Er(i,l,u)||n.push(Ar(i,o,l,u)),n.push(o)):Er(i,l,u)&&n.push(Ar(i,o,l,u)),i=o;a&&n.push(n[0]),l=u}return n};var Vc,Xc,$c,Bc,Wc,Jc=[],Gc=[];Pr.prototype.prepare=function(){for(var n,t=this.edges,e=t.length;e--;)n=t[e].edge,n.b&&n.a||t.splice(e,1);return t.sort(jr),t.length},Br.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},Wr.prototype={insert:function(n,t){var e,r,u;if(n){if(t.P=n,t.N=n.N,n.N&&(n.N.P=t),n.N=t,n.R){for(n=n.R;n.L;)n=n.L;n.L=t}else n.R=t;e=n}else this._?(n=Qr(this._),t.P=null,t.N=n,n.P=n.L=t,e=n):(t.P=t.N=null,this._=t,e=null);for(t.L=t.R=null,t.U=e,t.C=!0,n=t;e&&e.C;)r=e.U,e===r.L?(u=r.R,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.R&&(Gr(this,e),n=e,e=n.U),e.C=!1,r.C=!0,Kr(this,r))):(u=r.L,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.L&&(Kr(this,e),n=e,e=n.U),e.C=!1,r.C=!0,Gr(this,r))),e=n.U;this._.C=!1},remove:function(n){n.N&&(n.N.P=n.P),n.P&&(n.P.N=n.N),n.N=n.P=null;var t,e,r,u=n.U,i=n.L,o=n.R;if(e=i?o?Qr(o):i:o,u?u.L===n?u.L=e:u.R=e:this._=e,i&&o?(r=e.C,e.C=n.C,e.L=i,i.U=e,e!==o?(u=e.U,e.U=n.U,n=e.R,u.L=n,e.R=o,o.U=e):(e.U=u,u=e,n=e.R)):(r=n.C,n=e),n&&(n.U=u),!r){if(n&&n.C)return n.C=!1,void 0;do{if(n===this._)break;if(n===u.L){if(t=u.R,t.C&&(t.C=!1,u.C=!0,Gr(this,u),t=u.R),t.L&&t.L.C||t.R&&t.R.C){t.R&&t.R.C||(t.L.C=!1,t.C=!0,Kr(this,t),t=u.R),t.C=u.C,u.C=t.R.C=!1,Gr(this,u),n=this._;break}}else if(t=u.L,t.C&&(t.C=!1,u.C=!0,Kr(this,u),t=u.L),t.L&&t.L.C||t.R&&t.R.C){t.L&&t.L.C||(t.R.C=!1,t.C=!0,Gr(this,t),t=u.L),t.C=u.C,u.C=t.L.C=!1,Kr(this,u),n=this._;break}t.C=!0,n=u,u=u.U}while(!n.C);n&&(n.C=!1)}}},Xo.geom.voronoi=function(n){function t(n){var t=new Array(n.length),r=a[0][0],u=a[0][1],i=a[1][0],o=a[1][1];return nu(e(n),a).cells.forEach(function(e,a){var c=e.edges,s=e.site,l=t[a]=c.length?c.map(function(n){var t=n.start();return[t.x,t.y]}):s.x>=r&&s.x<=i&&s.y>=u&&s.y<=o?[[r,o],[i,o],[i,u],[r,u]]:[];l.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Aa)*Aa,y:Math.round(o(n,t)/Aa)*Aa,i:t}})}var r=br,u=wr,i=r,o=u,a=Kc;return n?t(n):(t.links=function(n){return nu(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return nu(e(n)).cells.forEach(function(e,r){for(var u,i,o=e.site,a=e.edges.sort(jr),c=-1,s=a.length,l=a[s-1].edge,f=l.l===o?l.r:l.l;++c<s;)u=l,i=f,l=a[c].edge,f=l.l===o?l.r:l.l,r<i.i&&r<f.i&&eu(o,i,f)<0&&t.push([n[r],n[i.i],n[f.i]])}),t},t.x=function(n){return arguments.length?(i=_t(r=n),t):r},t.y=function(n){return arguments.length?(o=_t(u=n),t):u},t.clipExtent=function(n){return arguments.length?(a=null==n?Kc:n,t):a===Kc?null:a},t.size=function(n){return arguments.length?t.clipExtent(n&&[[0,0],n]):a===Kc?null:a&&a[1]},t)};var Kc=[[-1e6,-1e6],[1e6,1e6]];Xo.geom.delaunay=function(n){return Xo.geom.voronoi().triangles(n)},Xo.geom.quadtree=function(n,t,e,r,u){function i(n){function i(n,t,e,r,u,i,o,a){if(!isNaN(e)&&!isNaN(r))if(n.leaf){var c=n.x,l=n.y;if(null!=c)if(oa(c-e)+oa(l-r)<.01)s(n,t,e,r,u,i,o,a);else{var f=n.point;n.x=n.y=n.point=null,s(n,f,c,l,u,i,o,a),s(n,t,e,r,u,i,o,a)}else n.x=e,n.y=r,n.point=t}else s(n,t,e,r,u,i,o,a)}function s(n,t,e,r,u,o,a,c){var s=.5*(u+a),l=.5*(o+c),f=e>=s,h=r>=l,g=(h<<1)+f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=iu()),f?u=s:a=s,h?o=l:c=l,i(n,t,e,r,u,o,a,c)}var l,f,h,g,p,v,d,m,y,x=_t(a),M=_t(c);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,o)for(g=0;p>g;++g)l=n[g],l.x<v&&(v=l.x),l.y<d&&(d=l.y),l.x>m&&(m=l.x),l.y>y&&(y=l.y),f.push(l.x),h.push(l.y);else for(g=0;p>g;++g){var _=+x(l=n[g],g),b=+M(l,g);v>_&&(v=_),d>b&&(d=b),_>m&&(m=_),b>y&&(y=b),f.push(_),h.push(b)}var w=m-v,S=y-d;w>S?y=d+w:m=v+S;var k=iu();if(k.add=function(n){i(k,n,+x(n,++g),+M(n,g),v,d,m,y)},k.visit=function(n){ou(n,k,v,d,m,y)},g=-1,null==t){for(;++g<p;)i(k,n[g],f[g],h[g],v,d,m,y);--g}else n.forEach(k.add);return f=h=n=l=null,k}var o,a=br,c=wr;return(o=arguments.length)?(a=ru,c=uu,3===o&&(u=e,r=t,e=t=0),i(n)):(i.x=function(n){return arguments.length?(a=n,i):a},i.y=function(n){return arguments.length?(c=n,i):c},i.extent=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=+n[0][0],e=+n[0][1],r=+n[1][0],u=+n[1][1]),i):null==t?null:[[t,e],[r,u]]},i.size=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=e=0,r=+n[0],u=+n[1]),i):null==t?null:[r-t,u-e]},i)},Xo.interpolateRgb=au,Xo.interpolateObject=cu,Xo.interpolateNumber=su,Xo.interpolateString=lu;var Qc=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;Xo.interpolate=fu,Xo.interpolators=[function(n,t){var e=typeof t;return("string"===e?Va.has(t)||/^(#|rgb\(|hsl\()/.test(t)?au:lu:t instanceof G?au:"object"===e?Array.isArray(t)?hu:cu:su)(n,t)}],Xo.interpolateArray=hu;var ns=function(){return bt},ts=Xo.map({linear:ns,poly:xu,quad:function(){return du},cubic:function(){return mu},sin:function(){return Mu},exp:function(){return _u},circle:function(){return bu},elastic:wu,back:Su,bounce:function(){return ku}}),es=Xo.map({"in":bt,out:pu,"in-out":vu,"out-in":function(n){return vu(pu(n))}});Xo.ease=function(n){var t=n.indexOf("-"),e=t>=0?n.substring(0,t):n,r=t>=0?n.substring(t+1):"in";return e=ts.get(e)||ns,r=es.get(r)||bt,gu(r(e.apply(null,$o.call(arguments,1))))},Xo.interpolateHcl=Eu,Xo.interpolateHsl=Au,Xo.interpolateLab=Cu,Xo.interpolateRound=Nu,Xo.transform=function(n){var t=Wo.createElementNS(Xo.ns.prefix.svg,"g");return(Xo.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new Lu(e?e.matrix:rs)})(n)},Lu.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var rs={a:1,b:0,c:0,d:1,e:0,f:0};Xo.interpolateTransform=Ru,Xo.layout={},Xo.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++e<r;)t.push(Uu(n[e]));return t}},Xo.layout.chord=function(){function n(){var n,s,f,h,g,p={},v=[],d=Xo.range(i),m=[];for(e=[],r=[],n=0,h=-1;++h<i;){for(s=0,g=-1;++g<i;)s+=u[h][g];v.push(s),m.push(Xo.range(i)),n+=s}for(o&&d.sort(function(n,t){return o(v[n],v[t])}),a&&m.forEach(function(n,t){n.sort(function(n,e){return a(u[t][n],u[t][e])})}),n=(ka-l*i)/n,s=0,h=-1;++h<i;){for(f=s,g=-1;++g<i;){var y=d[h],x=m[y][g],M=u[y][x],_=s,b=s+=M*n;p[y+"-"+x]={index:y,subindex:x,startAngle:_,endAngle:b,value:M}}r[y]={index:y,startAngle:f,endAngle:s,value:(s-f)/n},s+=l}for(h=-1;++h<i;)for(g=h-1;++g<i;){var w=p[h+"-"+g],S=p[g+"-"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}c&&t()}function t(){e.sort(function(n,t){return c((n.source.value+n.target.value)/2,(t.source.value+t.target.value)/2)})}var e,r,u,i,o,a,c,s={},l=0;return s.matrix=function(n){return arguments.length?(i=(u=n)&&u.length,e=r=null,s):u},s.padding=function(n){return arguments.length?(l=n,e=r=null,s):l},s.sortGroups=function(n){return arguments.length?(o=n,e=r=null,s):o},s.sortSubgroups=function(n){return arguments.length?(a=n,e=null,s):a},s.sortChords=function(n){return arguments.length?(c=n,e&&t(),s):c},s.chords=function(){return e||n(),e},s.groups=function(){return r||n(),r},s},Xo.layout.force=function(){function n(n){return function(t,e,r,u){if(t.point!==n){var i=t.cx-n.x,o=t.cy-n.y,a=u-e,c=i*i+o*o;if(c>a*a/d){if(p>c){var s=t.charge/c;n.px-=i*s,n.py-=o*s}return!0}if(t.point&&c&&p>c){var s=t.pointCharge/c;n.px-=i*s,n.py-=o*s}}return!t.charge}}function t(n){n.px=Xo.event.x,n.py=Xo.event.y,a.resume()}var e,r,u,i,o,a={},c=Xo.dispatch("start","tick","end"),s=[1,1],l=.9,f=us,h=is,g=-30,p=os,v=.1,d=.64,m=[],y=[];return a.tick=function(){if((r*=.99)<.005)return c.end({type:"end",alpha:r=0}),!0;var t,e,a,f,h,p,d,x,M,_=m.length,b=y.length;for(e=0;b>e;++e)a=y[e],f=a.source,h=a.target,x=h.x-f.x,M=h.y-f.y,(p=x*x+M*M)&&(p=r*i[e]*((p=Math.sqrt(p))-u[e])/p,x*=p,M*=p,h.x-=x*(d=f.weight/(h.weight+f.weight)),h.y-=M*d,f.x+=x*(d=1-d),f.y+=M*d);if((d=r*v)&&(x=s[0]/2,M=s[1]/2,e=-1,d))for(;++e<_;)a=m[e],a.x+=(x-a.x)*d,a.y+=(M-a.y)*d;if(g)for(Zu(t=Xo.geom.quadtree(m),r,o),e=-1;++e<_;)(a=m[e]).fixed||t.visit(n(a));for(e=-1;++e<_;)a=m[e],a.fixed?(a.x=a.px,a.y=a.py):(a.x-=(a.px-(a.px=a.x))*l,a.y-=(a.py-(a.py=a.y))*l);c.tick({type:"tick",alpha:r})},a.nodes=function(n){return arguments.length?(m=n,a):m},a.links=function(n){return arguments.length?(y=n,a):y},a.size=function(n){return arguments.length?(s=n,a):s},a.linkDistance=function(n){return arguments.length?(f="function"==typeof n?n:+n,a):f},a.distance=a.linkDistance,a.linkStrength=function(n){return arguments.length?(h="function"==typeof n?n:+n,a):h},a.friction=function(n){return arguments.length?(l=+n,a):l},a.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,a):g},a.chargeDistance=function(n){return arguments.length?(p=n*n,a):Math.sqrt(p)},a.gravity=function(n){return arguments.length?(v=+n,a):v},a.theta=function(n){return arguments.length?(d=n*n,a):Math.sqrt(d)},a.alpha=function(n){return arguments.length?(n=+n,r?r=n>0?n:0:n>0&&(c.start({type:"start",alpha:r=n}),Xo.timer(a.tick)),a):r},a.start=function(){function n(n,r){if(!e){for(e=new Array(c),a=0;c>a;++a)e[a]=[];for(a=0;s>a;++a){var u=y[a];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var i,o=e[t],a=-1,s=o.length;++a<s;)if(!isNaN(i=o[a][n]))return i;return Math.random()*r}var t,e,r,c=m.length,l=y.length,p=s[0],v=s[1];for(t=0;c>t;++t)(r=m[t]).index=t,r.weight=0;for(t=0;l>t;++t)r=y[t],"number"==typeof r.source&&(r.source=m[r.source]),"number"==typeof r.target&&(r.target=m[r.target]),++r.source.weight,++r.target.weight;for(t=0;c>t;++t)r=m[t],isNaN(r.x)&&(r.x=n("x",p)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof f)for(t=0;l>t;++t)u[t]=+f.call(this,y[t],t);else for(t=0;l>t;++t)u[t]=f;if(i=[],"function"==typeof h)for(t=0;l>t;++t)i[t]=+h.call(this,y[t],t);else for(t=0;l>t;++t)i[t]=h;if(o=[],"function"==typeof g)for(t=0;c>t;++t)o[t]=+g.call(this,m[t],t);else for(t=0;c>t;++t)o[t]=g;return a.resume()},a.resume=function(){return a.alpha(.1)},a.stop=function(){return a.alpha(0)},a.drag=function(){return e||(e=Xo.behavior.drag().origin(bt).on("dragstart.force",Fu).on("drag.force",t).on("dragend.force",Ou)),arguments.length?(this.on("mouseover.force",Yu).on("mouseout.force",Iu).call(e),void 0):e},Xo.rebind(a,c,"on")};var us=20,is=1,os=1/0;Xo.layout.hierarchy=function(){function n(t,o,a){var c=u.call(e,t,o);if(t.depth=o,a.push(t),c&&(s=c.length)){for(var s,l,f=-1,h=t.children=new Array(s),g=0,p=o+1;++f<s;)l=h[f]=n(c[f],p,a),l.parent=t,g+=l.value;r&&h.sort(r),i&&(t.value=g)}else delete t.children,i&&(t.value=+i.call(e,t,o)||0);return t}function t(n,r){var u=n.children,o=0;if(u&&(a=u.length))for(var a,c=-1,s=r+1;++c<a;)o+=t(u[c],s);else i&&(o=+i.call(e,n,r)||0);return i&&(n.value=o),o}function e(t){var e=[];return n(t,0,e),e}var r=Bu,u=Xu,i=$u;return e.sort=function(n){return arguments.length?(r=n,e):r},e.children=function(n){return arguments.length?(u=n,e):u},e.value=function(n){return arguments.length?(i=n,e):i},e.revalue=function(n){return t(n,0),n},e},Xo.layout.partition=function(){function n(t,e,r,u){var i=t.children;if(t.x=e,t.y=t.depth*u,t.dx=r,t.dy=u,i&&(o=i.length)){var o,a,c,s=-1;for(r=t.value?r/t.value:0;++s<o;)n(a=i[s],e,c=a.value*r,u),e+=c}}function t(n){var e=n.children,r=0;if(e&&(u=e.length))for(var u,i=-1;++i<u;)r=Math.max(r,t(e[i]));return 1+r}function e(e,i){var o=r.call(this,e,i);return n(o[0],0,u[0],u[1]/t(o[0])),o}var r=Xo.layout.hierarchy(),u=[1,1];return e.size=function(n){return arguments.length?(u=n,e):u},Vu(e,r)},Xo.layout.pie=function(){function n(i){var o=i.map(function(e,r){return+t.call(n,e,r)}),a=+("function"==typeof r?r.apply(this,arguments):r),c=(("function"==typeof u?u.apply(this,arguments):u)-a)/Xo.sum(o),s=Xo.range(i.length);null!=e&&s.sort(e===as?function(n,t){return o[t]-o[n]}:function(n,t){return e(i[n],i[t])});var l=[];return s.forEach(function(n){var t;l[n]={data:i[n],value:t=o[n],startAngle:a,endAngle:a+=t*c}}),l}var t=Number,e=as,r=0,u=ka;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(u=t,n):u},n};var as={};Xo.layout.stack=function(){function n(a,c){var s=a.map(function(e,r){return t.call(n,e,r)}),l=s.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),o.call(n,t,e)]})}),f=e.call(n,l,c);s=Xo.permute(s,f),l=Xo.permute(l,f);var h,g,p,v=r.call(n,l,c),d=s.length,m=s[0].length;for(g=0;m>g;++g)for(u.call(n,s[0][g],p=v[g],l[0][g][1]),h=1;d>h;++h)u.call(n,s[h][g],p+=l[h-1][g][1],l[h][g][1]);return a}var t=bt,e=Qu,r=ni,u=Ku,i=Ju,o=Gu;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:cs.get(t)||Qu,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:ss.get(t)||ni,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(u=t,n):u},n};var cs=Xo.map({"inside-out":function(n){var t,e,r=n.length,u=n.map(ti),i=n.map(ei),o=Xo.range(r).sort(function(n,t){return u[n]-u[t]}),a=0,c=0,s=[],l=[];for(t=0;r>t;++t)e=o[t],c>a?(a+=i[e],s.push(e)):(c+=i[e],l.push(e));return l.reverse().concat(s)},reverse:function(n){return Xo.range(n.length).reverse()},"default":Qu}),ss=Xo.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,o=[],a=0,c=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;i>e;++e)c[e]=(a-o[e])/2;return c},wiggle:function(n){var t,e,r,u,i,o,a,c,s,l=n.length,f=n[0],h=f.length,g=[];for(g[0]=c=s=0,e=1;h>e;++e){for(t=0,u=0;l>t;++t)u+=n[t][e][1];for(t=0,i=0,a=f[e][0]-f[e-1][0];l>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;i+=o*n[t][e][1]}g[e]=c-=u?i/u*a:0,s>c&&(s=c)}for(e=0;h>e;++e)g[e]-=s;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,o=1/u,a=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=o}for(e=0;i>e;++e)a[e]=0;return a},zero:ni});Xo.layout.histogram=function(){function n(n,i){for(var o,a,c=[],s=n.map(e,this),l=r.call(this,s,i),f=u.call(this,l,s,i),i=-1,h=s.length,g=f.length-1,p=t?1:1/h;++i<g;)o=c[i]=[],o.dx=f[i+1]-(o.x=f[i]),o.y=0;if(g>0)for(i=-1;++i<h;)a=s[i],a>=l[0]&&a<=l[1]&&(o=c[Xo.bisect(f,a,1,g)-1],o.y+=p,o.push(n[i]));return c}var t=!0,e=Number,r=oi,u=ui;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=_t(t),n):r},n.bins=function(t){return arguments.length?(u="number"==typeof t?function(n){return ii(n,t)}:_t(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},Xo.layout.tree=function(){function n(n,i){function o(n,t){var r=n.children,u=n._tree;if(r&&(i=r.length)){for(var i,a,s,l=r[0],f=l,h=-1;++h<i;)s=r[h],o(s,a),f=c(s,a,f),a=s;vi(n);var g=.5*(l._tree.prelim+s._tree.prelim);t?(u.prelim=t._tree.prelim+e(n,t),u.mod=u.prelim-g):u.prelim=g}else t&&(u.prelim=t._tree.prelim+e(n,t))}function a(n,t){n.x=n._tree.prelim+t;var e=n.children;if(e&&(r=e.length)){var r,u=-1;for(t+=n._tree.mod;++u<r;)a(e[u],t)}}function c(n,t,r){if(t){for(var u,i=n,o=n,a=t,c=n.parent.children[0],s=i._tree.mod,l=o._tree.mod,f=a._tree.mod,h=c._tree.mod;a=si(a),i=ci(i),a&&i;)c=ci(c),o=si(o),o._tree.ancestor=n,u=a._tree.prelim+f-i._tree.prelim-s+e(a,i),u>0&&(di(mi(a,n,r),n,u),s+=u,l+=u),f+=a._tree.mod,s+=i._tree.mod,h+=c._tree.mod,l+=o._tree.mod;a&&!si(o)&&(o._tree.thread=a,o._tree.mod+=f-l),i&&!ci(c)&&(c._tree.thread=i,c._tree.mod+=s-h,r=n)}return r}var s=t.call(this,n,i),l=s[0];pi(l,function(n,t){n._tree={ancestor:n,prelim:0,mod:0,change:0,shift:0,number:t?t._tree.number+1:0}}),o(l),a(l,-l._tree.prelim);var f=li(l,hi),h=li(l,fi),g=li(l,gi),p=f.x-e(f,h)/2,v=h.x+e(h,f)/2,d=g.depth||1;return pi(l,u?function(n){n.x*=r[0],n.y=n.depth*r[1],delete n._tree}:function(n){n.x=(n.x-p)/(v-p)*r[0],n.y=n.depth/d*r[1],delete n._tree}),s}var t=Xo.layout.hierarchy().sort(null).value(null),e=ai,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},Vu(n,t)},Xo.layout.pack=function(){function n(n,i){var o=e.call(this,n,i),a=o[0],c=u[0],s=u[1],l=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,pi(a,function(n){n.r=+l(n.value)}),pi(a,bi),r){var f=r*(t?1:Math.max(2*a.r/c,2*a.r/s))/2;pi(a,function(n){n.r+=f}),pi(a,bi),pi(a,function(n){n.r-=f})}return ki(a,c/2,s/2,t?1:1/Math.max(2*a.r/c,2*a.r/s)),o}var t,e=Xo.layout.hierarchy().sort(yi),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},Vu(n,e)},Xo.layout.cluster=function(){function n(n,i){var o,a=t.call(this,n,i),c=a[0],s=0;pi(c,function(n){var t=n.children;t&&t.length?(n.x=Ci(t),n.y=Ai(t)):(n.x=o?s+=e(n,o):0,n.y=0,o=n)});var l=Ni(c),f=Li(c),h=l.x-e(l,f)/2,g=f.x+e(f,l)/2;return pi(c,u?function(n){n.x=(n.x-c.x)*r[0],n.y=(c.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(c.y?n.y/c.y:1))*r[1]}),a}var t=Xo.layout.hierarchy().sort(null).value(null),e=ai,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},Vu(n,t)},Xo.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++u<i;)r=(e=n[u]).value*(0>t?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var o,a,c,s=f(e),l=[],h=i.slice(),p=1/0,v="slice"===g?s.dx:"dice"===g?s.dy:"slice-dice"===g?1&e.depth?s.dy:s.dx:Math.min(s.dx,s.dy);for(n(h,s.dx*s.dy/e.value),l.area=0;(c=h.length)>0;)l.push(o=h[c-1]),l.area+=o.area,"squarify"!==g||(a=r(l,v))<=p?(h.pop(),p=a):(l.area-=l.pop().area,u(l,v,s,!1),v=Math.min(s.dx,s.dy),l.length=l.area=0,p=1/0);l.length&&(u(l,v,s,!0),l.length=l.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,o=f(t),a=r.slice(),c=[];for(n(a,o.dx*o.dy/t.value),c.area=0;i=a.pop();)c.push(i),c.area+=i.area,null!=i.z&&(u(c,i.z?o.dx:o.dy,o,!a.length),c.length=c.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,o=-1,a=n.length;++o<a;)(e=n[o].area)&&(i>e&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,o=n.length,a=e.x,s=e.y,l=t?c(n.area/t):0;if(t==e.dx){for((r||l>e.dy)&&(l=e.dy);++i<o;)u=n[i],u.x=a,u.y=s,u.dy=l,a+=u.dx=Math.min(e.x+e.dx-a,l?c(u.area/l):0);u.z=!0,u.dx+=e.x+e.dx-a,e.y+=l,e.dy-=l}else{for((r||l>e.dx)&&(l=e.dx);++i<o;)u=n[i],u.x=a,u.y=s,u.dx=l,s+=u.dy=Math.min(e.y+e.dy-s,l?c(u.area/l):0);u.z=!1,u.dy+=e.y+e.dy-s,e.x+=l,e.dx-=l}}function i(r){var u=o||a(r),i=u[0];return i.x=0,i.y=0,i.dx=s[0],i.dy=s[1],o&&a.revalue(i),n([i],i.dx*i.dy/i.value),(o?e:t)(i),h&&(o=u),u}var o,a=Xo.layout.hierarchy(),c=Math.round,s=[1,1],l=null,f=Ti,h=!1,g="squarify",p=.5*(1+Math.sqrt(5));return i.size=function(n){return arguments.length?(s=n,i):s},i.padding=function(n){function t(t){var e=n.call(i,t,t.depth);return null==e?Ti(t):qi(t,"number"==typeof e?[e,e,e,e]:e)}function e(t){return qi(t,n)}if(!arguments.length)return l;var r;return f=null==(l=n)?Ti:"function"==(r=typeof n)?t:"number"===r?(n=[n,n,n,n],e):e,i},i.round=function(n){return arguments.length?(c=n?Math.round:Number,i):c!=Number},i.sticky=function(n){return arguments.length?(h=n,o=null,i):h},i.ratio=function(n){return arguments.length?(p=n,i):p},i.mode=function(n){return arguments.length?(g=n+"",i):g},Vu(i,a)},Xo.random={normal:function(n,t){var e=arguments.length;return 2>e&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=Xo.random.normal.apply(Xo,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=Xo.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},Xo.scale={};var ls={floor:bt,ceil:bt};Xo.scale.linear=function(){return Hi([0,1],[0,1],fu,!1)};var fs={s:1,g:1,p:1,r:1,e:1};Xo.scale.log=function(){return $i(Xo.scale.linear().domain([0,1]),10,!0,[1,10])};var hs=Xo.format(".0e"),gs={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};Xo.scale.pow=function(){return Bi(Xo.scale.linear(),1,[0,1])},Xo.scale.sqrt=function(){return Xo.scale.pow().exponent(.5)},Xo.scale.ordinal=function(){return Ji([],{t:"range",a:[[]]})},Xo.scale.category10=function(){return Xo.scale.ordinal().range(ps)},Xo.scale.category20=function(){return Xo.scale.ordinal().range(vs)},Xo.scale.category20b=function(){return Xo.scale.ordinal().range(ds)},Xo.scale.category20c=function(){return Xo.scale.ordinal().range(ms)};var ps=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(ht),vs=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(ht),ds=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(ht),ms=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(ht);Xo.scale.quantile=function(){return Gi([],[])},Xo.scale.quantize=function(){return Ki(0,1,[0,1])},Xo.scale.threshold=function(){return Qi([.5],[0,1])},Xo.scale.identity=function(){return no([0,1])},Xo.svg={},Xo.svg.arc=function(){function n(){var n=t.apply(this,arguments),i=e.apply(this,arguments),o=r.apply(this,arguments)+ys,a=u.apply(this,arguments)+ys,c=(o>a&&(c=o,o=a,a=c),a-o),s=Sa>c?"0":"1",l=Math.cos(o),f=Math.sin(o),h=Math.cos(a),g=Math.sin(a);return c>=xs?n?"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"M0,"+n+"A"+n+","+n+" 0 1,0 0,"+-n+"A"+n+","+n+" 0 1,0 0,"+n+"Z":"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"Z":n?"M"+i*l+","+i*f+"A"+i+","+i+" 0 "+s+",1 "+i*h+","+i*g+"L"+n*h+","+n*g+"A"+n+","+n+" 0 "+s+",0 "+n*l+","+n*f+"Z":"M"+i*l+","+i*f+"A"+i+","+i+" 0 "+s+",1 "+i*h+","+i*g+"L0,0"+"Z"}var t=to,e=eo,r=ro,u=uo;return n.innerRadius=function(e){return arguments.length?(t=_t(e),n):t},n.outerRadius=function(t){return arguments.length?(e=_t(t),n):e},n.startAngle=function(t){return arguments.length?(r=_t(t),n):r},n.endAngle=function(t){return arguments.length?(u=_t(t),n):u},n.centroid=function(){var n=(t.apply(this,arguments)+e.apply(this,arguments))/2,i=(r.apply(this,arguments)+u.apply(this,arguments))/2+ys;return[Math.cos(i)*n,Math.sin(i)*n]},n};var ys=-Ea,xs=ka-Aa;Xo.svg.line=function(){return io(bt)};var Ms=Xo.map({linear:oo,"linear-closed":ao,step:co,"step-before":so,"step-after":lo,basis:mo,"basis-open":yo,"basis-closed":xo,bundle:Mo,cardinal:go,"cardinal-open":fo,"cardinal-closed":ho,monotone:Eo});Ms.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var _s=[0,2/3,1/3,0],bs=[0,1/3,2/3,0],ws=[0,1/6,2/3,1/6];Xo.svg.line.radial=function(){var n=io(Ao);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},so.reverse=lo,lo.reverse=so,Xo.svg.area=function(){return Co(bt)},Xo.svg.area.radial=function(){var n=Co(Ao);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},Xo.svg.chord=function(){function n(n,a){var c=t(this,i,n,a),s=t(this,o,n,a);return"M"+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,s)?u(c.r,c.p1,c.r,c.p0):u(c.r,c.p1,s.r,s.p0)+r(s.r,s.p1,s.a1-s.a0)+u(s.r,s.p1,c.r,c.p0))+"Z"}function t(n,t,e,r){var u=t.call(n,e,r),i=a.call(n,u,r),o=c.call(n,u,r)+ys,l=s.call(n,u,r)+ys;return{r:i,a0:o,a1:l,p0:[i*Math.cos(o),i*Math.sin(o)],p1:[i*Math.cos(l),i*Math.sin(l)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>Sa)+",1 "+t}function u(n,t,e,r){return"Q 0,0 "+r}var i=hr,o=gr,a=No,c=ro,s=uo;return n.radius=function(t){return arguments.length?(a=_t(t),n):a},n.source=function(t){return arguments.length?(i=_t(t),n):i},n.target=function(t){return arguments.length?(o=_t(t),n):o},n.startAngle=function(t){return arguments.length?(c=_t(t),n):c},n.endAngle=function(t){return arguments.length?(s=_t(t),n):s},n},Xo.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),o=e.call(this,n,u),a=(i.y+o.y)/2,c=[i,{x:i.x,y:a},{x:o.x,y:a},o];return c=c.map(r),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var t=hr,e=gr,r=Lo;return n.source=function(e){return arguments.length?(t=_t(e),n):t},n.target=function(t){return arguments.length?(e=_t(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},Xo.svg.diagonal.radial=function(){var n=Xo.svg.diagonal(),t=Lo,e=n.projection;return n.projection=function(n){return arguments.length?e(To(t=n)):t},n},Xo.svg.symbol=function(){function n(n,r){return(Ss.get(t.call(this,n,r))||Ro)(e.call(this,n,r))}var t=zo,e=qo;return n.type=function(e){return arguments.length?(t=_t(e),n):t},n.size=function(t){return arguments.length?(e=_t(t),n):e},n};var Ss=Xo.map({circle:Ro,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Cs)),e=t*Cs;return"M0,"+-t+"L"+e+",0"+" 0,"+t+" "+-e+",0"+"Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/As),e=t*As/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/As),e=t*As/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});Xo.svg.symbolTypes=Ss.keys();var ks,Es,As=Math.sqrt(3),Cs=Math.tan(30*Na),Ns=[],Ls=0;Ns.call=da.call,Ns.empty=da.empty,Ns.node=da.node,Ns.size=da.size,Xo.transition=function(n){return arguments.length?ks?n.transition():n:xa.transition()},Xo.transition.prototype=Ns,Ns.select=function(n){var t,e,r,u=this.id,i=[];n=M(n);for(var o=-1,a=this.length;++o<a;){i.push(t=[]);for(var c=this[o],s=-1,l=c.length;++s<l;)(r=c[s])&&(e=n.call(r,r.__data__,s,o))?("__data__"in r&&(e.__data__=r.__data__),jo(e,s,u,r.__transition__[u]),t.push(e)):t.push(null)}return Do(i,u)},Ns.selectAll=function(n){var t,e,r,u,i,o=this.id,a=[];n=_(n);for(var c=-1,s=this.length;++c<s;)for(var l=this[c],f=-1,h=l.length;++f<h;)if(r=l[f]){i=r.__transition__[o],e=n.call(r,r.__data__,f,c),a.push(t=[]);for(var g=-1,p=e.length;++g<p;)(u=e[g])&&jo(u,g,o,i),t.push(u)}return Do(a,o)},Ns.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=q(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]);for(var e=this[i],a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a,i)&&t.push(r)}return Do(u,this.id)},Ns.tween=function(n,t){var e=this.id;return arguments.length<2?this.node().__transition__[e].tween.get(n):R(this,null==t?function(t){t.__transition__[e].tween.remove(n)}:function(r){r.__transition__[e].tween.set(n,t)})},Ns.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function u(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function i(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?Ru:fu,a=Xo.ns.qualify(n);return Po(this,"attr."+n,t,a.local?i:u)},Ns.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=Xo.ns.qualify(n);return this.tween("attr."+n,u.local?r:e)},Ns.style=function(n,t,e){function r(){this.style.removeProperty(n)}function u(t){return null==t?r:(t+="",function(){var r,u=Go.getComputedStyle(this,null).getPropertyValue(n);return u!==t&&(r=fu(u,t),function(t){this.style.setProperty(n,r(t),e)})})}var i=arguments.length;if(3>i){if("string"!=typeof n){2>i&&(t="");for(e in n)this.style(e,n[e],t);return this}e=""}return Po(this,"style."+n,t,u)},Ns.styleTween=function(n,t,e){function r(r,u){var i=t.call(this,r,u,Go.getComputedStyle(this,null).getPropertyValue(n));return i&&function(t){this.style.setProperty(n,i(t),e)}}return arguments.length<3&&(e=""),this.tween("style."+n,r)},Ns.text=function(n){return Po(this,"text",n,Uo)},Ns.remove=function(){return this.each("end.transition",function(){var n;this.__transition__.count<2&&(n=this.parentNode)&&n.removeChild(this)})},Ns.ease=function(n){var t=this.id;return arguments.length<1?this.node().__transition__[t].ease:("function"!=typeof n&&(n=Xo.ease.apply(Xo,arguments)),R(this,function(e){e.__transition__[t].ease=n}))},Ns.delay=function(n){var t=this.id;return R(this,"function"==typeof n?function(e,r,u){e.__transition__[t].delay=+n.call(e,e.__data__,r,u)}:(n=+n,function(e){e.__transition__[t].delay=n}))},Ns.duration=function(n){var t=this.id;return R(this,"function"==typeof n?function(e,r,u){e.__transition__[t].duration=Math.max(1,n.call(e,e.__data__,r,u))}:(n=Math.max(1,n),function(e){e.__transition__[t].duration=n}))},Ns.each=function(n,t){var e=this.id;if(arguments.length<2){var r=Es,u=ks;ks=e,R(this,function(t,r,u){Es=t.__transition__[e],n.call(t,t.__data__,r,u)}),Es=r,ks=u}else R(this,function(r){var u=r.__transition__[e];(u.event||(u.event=Xo.dispatch("start","end"))).on(n,t)});return this},Ns.transition=function(){for(var n,t,e,r,u=this.id,i=++Ls,o=[],a=0,c=this.length;c>a;a++){o.push(n=[]);for(var t=this[a],s=0,l=t.length;l>s;s++)(e=t[s])&&(r=Object.create(e.__transition__[u]),r.delay+=r.duration,jo(e,s,i,r)),n.push(e)}return Do(o,i)},Xo.svg.axis=function(){function n(n){n.each(function(){var n,s=Xo.select(this),l=this.__chart__||e,f=this.__chart__=e.copy(),h=null==c?f.ticks?f.ticks.apply(f,a):f.domain():c,g=null==t?f.tickFormat?f.tickFormat.apply(f,a):bt:t,p=s.selectAll(".tick").data(h,f),v=p.enter().insert("g",".domain").attr("class","tick").style("opacity",Aa),d=Xo.transition(p.exit()).style("opacity",Aa).remove(),m=Xo.transition(p).style("opacity",1),y=Ri(f),x=s.selectAll(".domain").data([0]),M=(x.enter().append("path").attr("class","domain"),Xo.transition(x));v.append("line"),v.append("text");var _=v.select("line"),b=m.select("line"),w=p.select("text").text(g),S=v.select("text"),k=m.select("text");switch(r){case"bottom":n=Ho,_.attr("y2",u),S.attr("y",Math.max(u,0)+o),b.attr("x2",0).attr("y2",u),k.attr("x",0).attr("y",Math.max(u,0)+o),w.attr("dy",".71em").style("text-anchor","middle"),M.attr("d","M"+y[0]+","+i+"V0H"+y[1]+"V"+i);break;case"top":n=Ho,_.attr("y2",-u),S.attr("y",-(Math.max(u,0)+o)),b.attr("x2",0).attr("y2",-u),k.attr("x",0).attr("y",-(Math.max(u,0)+o)),w.attr("dy","0em").style("text-anchor","middle"),M.attr("d","M"+y[0]+","+-i+"V0H"+y[1]+"V"+-i);break;case"left":n=Fo,_.attr("x2",-u),S.attr("x",-(Math.max(u,0)+o)),b.attr("x2",-u).attr("y2",0),k.attr("x",-(Math.max(u,0)+o)).attr("y",0),w.attr("dy",".32em").style("text-anchor","end"),M.attr("d","M"+-i+","+y[0]+"H0V"+y[1]+"H"+-i);break;case"right":n=Fo,_.attr("x2",u),S.attr("x",Math.max(u,0)+o),b.attr("x2",u).attr("y2",0),k.attr("x",Math.max(u,0)+o).attr("y",0),w.attr("dy",".32em").style("text-anchor","start"),M.attr("d","M"+i+","+y[0]+"H0V"+y[1]+"H"+i)}if(f.rangeBand){var E=f,A=E.rangeBand()/2;l=f=function(n){return E(n)+A}}else l.rangeBand?l=f:d.call(n,f);v.call(n,l),m.call(n,f)})}var t,e=Xo.scale.linear(),r=Ts,u=6,i=6,o=3,a=[10],c=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in qs?t+"":Ts,n):r},n.ticks=function(){return arguments.length?(a=arguments,n):a},n.tickValues=function(t){return arguments.length?(c=t,n):c},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var Ts="bottom",qs={top:1,right:1,bottom:1,left:1};Xo.svg.brush=function(){function n(i){i.each(function(){var i=Xo.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",u).on("touchstart.brush",u),o=i.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),i.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=i.selectAll(".resize").data(p,bt);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return zs[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var l,f=Xo.transition(i),h=Xo.transition(o);c&&(l=Ri(c),h.attr("x",l[0]).attr("width",l[1]-l[0]),e(f)),s&&(l=Ri(s),h.attr("y",l[0]).attr("height",l[1]-l[0]),r(f)),t(f)})}function t(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+l[+/e$/.test(n)]+","+f[+/^s/.test(n)]+")"})}function e(n){n.select(".extent").attr("x",l[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",l[1]-l[0])}function r(n){n.select(".extent").attr("y",f[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",f[1]-f[0])}function u(){function u(){32==Xo.event.keyCode&&(C||(x=null,L[0]-=l[1],L[1]-=f[1],C=2),d())}function p(){32==Xo.event.keyCode&&2==C&&(L[0]+=l[1],L[1]+=f[1],C=0,d())}function v(){var n=Xo.mouse(_),u=!1;M&&(n[0]+=M[0],n[1]+=M[1]),C||(Xo.event.altKey?(x||(x=[(l[0]+l[1])/2,(f[0]+f[1])/2]),L[0]=l[+(n[0]<x[0])],L[1]=f[+(n[1]<x[1])]):x=null),E&&m(n,c,0)&&(e(S),u=!0),A&&m(n,s,1)&&(r(S),u=!0),u&&(t(S),w({type:"brush",mode:C?"move":"resize"}))}function m(n,t,e){var r,u,a=Ri(t),c=a[0],s=a[1],p=L[e],v=e?f:l,d=v[1]-v[0];return C&&(c-=p,s-=d+p),r=(e?g:h)?Math.max(c,Math.min(s,n[e])):n[e],C?u=(r+=p)+d:(x&&(p=Math.max(c,Math.min(s,2*x[e]-r))),r>p?(u=r,r=p):u=p),v[0]!=r||v[1]!=u?(e?o=null:i=null,v[0]=r,v[1]=u,!0):void 0}function y(){v(),S.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),Xo.select("body").style("cursor",null),T.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),N(),w({type:"brushend"})}var x,M,_=this,b=Xo.select(Xo.event.target),w=a.of(_,arguments),S=Xo.select(_),k=b.datum(),E=!/^(n|s)$/.test(k)&&c,A=!/^(e|w)$/.test(k)&&s,C=b.classed("extent"),N=O(),L=Xo.mouse(_),T=Xo.select(Go).on("keydown.brush",u).on("keyup.brush",p);if(Xo.event.changedTouches?T.on("touchmove.brush",v).on("touchend.brush",y):T.on("mousemove.brush",v).on("mouseup.brush",y),S.interrupt().selectAll("*").interrupt(),C)L[0]=l[0]-L[0],L[1]=f[0]-L[1];else if(k){var q=+/w$/.test(k),z=+/^n/.test(k);M=[l[1-q]-L[0],f[1-z]-L[1]],L[0]=l[q],L[1]=f[z]}else Xo.event.altKey&&(x=L.slice());S.style("pointer-events","none").selectAll(".resize").style("display",null),Xo.select("body").style("cursor",b.style("cursor")),w({type:"brushstart"}),v()}var i,o,a=y(n,"brushstart","brush","brushend"),c=null,s=null,l=[0,0],f=[0,0],h=!0,g=!0,p=Rs[0];return n.event=function(n){n.each(function(){var n=a.of(this,arguments),t={x:l,y:f,i:i,j:o},e=this.__chart__||t;this.__chart__=t,ks?Xo.select(this).transition().each("start.brush",function(){i=e.i,o=e.j,l=e.x,f=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=hu(l,t.x),r=hu(f,t.y);return i=o=null,function(u){l=t.x=e(u),f=t.y=r(u),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){i=t.i,o=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(c=t,p=Rs[!c<<1|!s],n):c},n.y=function(t){return arguments.length?(s=t,p=Rs[!c<<1|!s],n):s},n.clamp=function(t){return arguments.length?(c&&s?(h=!!t[0],g=!!t[1]):c?h=!!t:s&&(g=!!t),n):c&&s?[h,g]:c?h:s?g:null},n.extent=function(t){var e,r,u,a,h;return arguments.length?(c&&(e=t[0],r=t[1],s&&(e=e[0],r=r[0]),i=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(h=e,e=r,r=h),(e!=l[0]||r!=l[1])&&(l=[e,r])),s&&(u=t[0],a=t[1],c&&(u=u[1],a=a[1]),o=[u,a],s.invert&&(u=s(u),a=s(a)),u>a&&(h=u,u=a,a=h),(u!=f[0]||a!=f[1])&&(f=[u,a])),n):(c&&(i?(e=i[0],r=i[1]):(e=l[0],r=l[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(h=e,e=r,r=h))),s&&(o?(u=o[0],a=o[1]):(u=f[0],a=f[1],s.invert&&(u=s.invert(u),a=s.invert(a)),u>a&&(h=u,u=a,a=h))),c&&s?[[e,u],[r,a]]:c?[e,r]:s&&[u,a])},n.clear=function(){return n.empty()||(l=[0,0],f=[0,0],i=o=null),n},n.empty=function(){return!!c&&l[0]==l[1]||!!s&&f[0]==f[1]},Xo.rebind(n,a,"on")};var zs={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Rs=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Ds=tc.format=ac.timeFormat,Ps=Ds.utc,Us=Ps("%Y-%m-%dT%H:%M:%S.%LZ");Ds.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?Oo:Us,Oo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},Oo.toString=Us.toString,tc.second=Rt(function(n){return new ec(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),tc.seconds=tc.second.range,tc.seconds.utc=tc.second.utc.range,tc.minute=Rt(function(n){return new ec(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),tc.minutes=tc.minute.range,tc.minutes.utc=tc.minute.utc.range,tc.hour=Rt(function(n){var t=n.getTimezoneOffset()/60;return new ec(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),tc.hours=tc.hour.range,tc.hours.utc=tc.hour.utc.range,tc.month=Rt(function(n){return n=tc.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),tc.months=tc.month.range,tc.months.utc=tc.month.utc.range;var js=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Hs=[[tc.second,1],[tc.second,5],[tc.second,15],[tc.second,30],[tc.minute,1],[tc.minute,5],[tc.minute,15],[tc.minute,30],[tc.hour,1],[tc.hour,3],[tc.hour,6],[tc.hour,12],[tc.day,1],[tc.day,2],[tc.week,1],[tc.month,1],[tc.month,3],[tc.year,1]],Fs=Ds.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",be]]),Os={range:function(n,t,e){return Xo.range(Math.ceil(n/e)*e,+t,e).map(Io)},floor:bt,ceil:bt};Hs.year=tc.year,tc.scale=function(){return Yo(Xo.scale.linear(),Hs,Fs)};var Ys=Hs.map(function(n){return[n[0].utc,n[1]]}),Is=Ps.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",be]]);Ys.year=tc.year.utc,tc.scale.utc=function(){return Yo(Xo.scale.linear(),Ys,Is)},Xo.text=wt(function(n){return n.responseText}),Xo.json=function(n,t){return St(n,"application/json",Zo,t)},Xo.html=function(n,t){return St(n,"text/html",Vo,t)},Xo.xml=wt(function(n){return n.responseXML}),"function"==typeof define&&define.amd?define(Xo):"object"==typeof module&&module.exports?module.exports=Xo:this.d3=Xo}();'use strict';(function(window){window.define=undefined;}).call(this,this);'use strict';tr.exportTo('tr.ui.b',function(){const DataSeriesEnableChangeEventType='data-series-enabled-change';const THIS_DOC=document.currentScript.ownerDocument;const svgNS='http://www.w3.org/2000/svg';const ColorScheme=tr.b.ColorScheme;function getColorOfKey(key,selected){let id=ColorScheme.getColorIdForGeneralPurposeString(key);if(selected){id+=ColorScheme.properties.brightenedOffsets[0];}
+return ColorScheme.colorsAsStrings[id];}
+function getSVGTextSize(parentNode,text,opt_callback,opt_this){const textNode=document.createElementNS('http://www.w3.org/2000/svg','text');textNode.setAttributeNS(null,'x',0);textNode.setAttributeNS(null,'y',0);textNode.setAttributeNS(null,'fill','black');textNode.appendChild(document.createTextNode(text));parentNode.appendChild(textNode);if(opt_callback){opt_callback.call(opt_this||parentNode,textNode);}
+const width=textNode.getComputedTextLength();const height=textNode.getBBox().height;parentNode.removeChild(textNode);return{width,height};}
+function DataSeries(key){this.key_=key;this.target_=undefined;this.title_='';this.optional_=false;this.enabled_=true;this.color_=getColorOfKey(key,false);this.highlightedColor_=getColorOfKey(key,true);}
+DataSeries.prototype={get key(){return this.key_;},get title(){return this.title_;},set title(t){this.title_=t;},get color(){return this.color_;},set color(c){this.color_=c;},get highlightedColor(){return this.highlightedColor_;},set highlightedColor(c){this.highlightedColor_=c;},get optional(){return this.optional_;},set optional(optional){this.optional_=optional;},get enabled(){return this.enabled_;},set enabled(enabled){if(!this.optional&&!enabled){this.optional=true;}
+this.enabled_=enabled;},get target(){return this.target_;},set target(t){this.target_=t;}};const ChartBase=tr.ui.b.define('svg',undefined,svgNS);ChartBase.prototype={__proto__:HTMLUnknownElement.prototype,getDataSeries(key){if(!this.seriesByKey_.has(key)){this.seriesByKey_.set(key,new DataSeries(key));}
+return this.seriesByKey_.get(key);},decorate(){Polymer.dom(this).classList.add('chart-base');this.chartTitle_=undefined;this.seriesByKey_=new Map();this.graphWidth_=undefined;this.graphHeight_=undefined;this.margin={top:0,right:0,bottom:0,left:0,};this.hideLegend_=false;const template=Polymer.dom(THIS_DOC).querySelector('#chart-base-template');const svgEl=Polymer.dom(template.content).querySelector('svg');for(let i=0;i<Polymer.dom(svgEl).children.length;i++){Polymer.dom(this).appendChild(Polymer.dom(svgEl.children[i]).cloneNode(true));}
+this.addEventListener(DataSeriesEnableChangeEventType,this.onDataSeriesEnableChange_.bind(this));},get hideLegend(){return this.hideLegend_;},set hideLegend(h){this.hideLegend_=h;this.updateContents_();},isSeriesEnabled(key){return this.getDataSeries(key).enabled;},onDataSeriesEnableChange_(event){this.getDataSeries(event.key).enabled=event.enabled;this.updateContents_();},get chartTitle(){return this.chartTitle_;},set chartTitle(chartTitle){this.chartTitle_=chartTitle;this.updateContents_();},get chartAreaElement(){return Polymer.dom(this).querySelector('#chart-area');},get graphWidth(){if(this.graphWidth_===undefined)return this.defaultGraphWidth;return this.graphWidth_;},set graphWidth(width){this.graphWidth_=width;this.updateContents_();},get defaultGraphWidth(){return 0;},get graphHeight(){if(this.graphHeight_===undefined)return this.defaultGraphHeight;return this.graphHeight_;},set graphHeight(height){this.graphHeight_=height;this.updateContents_();},get defaultGraphHeight(){return 0;},get totalWidth(){return this.margin.left+this.graphWidth+this.margin.right;},get totalHeight(){return this.margin.top+this.graphHeight+this.margin.bottom;},updateMargins_(){const legendSize=this.computeLegendSize_();this.margin.right=Math.max(this.margin.right,legendSize.width);this.margin.bottom=Math.max(this.margin.bottom,legendSize.height-this.graphHeight);if(this.chartTitle_){const titleSize=getSVGTextSize(this,this.chartTitle_,textNode=>{textNode.style.fontSize='16pt';});this.margin.top=Math.max(this.margin.top,titleSize.height+15);const horizontalOverhangPx=(titleSize.width-this.graphWidth)/2;this.margin.left=Math.max(this.margin.left,horizontalOverhangPx);this.margin.right=Math.max(this.margin.right,horizontalOverhangPx);}},computeLegendSize_(){let width=0;let height=0;if(this.hideLegend)return{width,height};for(const series of this.seriesByKey_.values()){const textSize=getSVGTextSize(this,series.key);width=Math.max(width,textSize.width+20);height+=textSize.height;}
+return{width,height};},updateDimensions_(){const thisSel=d3.select(this);thisSel.attr('width',this.totalWidth);thisSel.attr('height',this.totalHeight);d3.select(this.chartAreaElement).attr('transform','translate('+this.margin.left+', '+this.margin.top+')');},updateContents_(){this.updateMargins_();this.updateDimensions_();this.updateTitle_();this.updateLegend_();},updateTitle_(){const titleSel=d3.select(this.chartAreaElement).select('#title');if(!this.chartTitle_){titleSel.style('display','none');return;}
+titleSel.attr('transform','translate('+this.graphWidth*0.5+',-15)').style('display',undefined).style('text-anchor','middle').style('font-size','16pt').attr('class','title').attr('width',this.graphWidth).text(this.chartTitle_);},updateLegend_(){const chartAreaSel=d3.select(this.chartAreaElement);chartAreaSel.selectAll('.legend').remove();if(this.hideLegend)return;const series=[...this.seriesByKey_.values()].reverse();const legendEntriesSel=chartAreaSel.selectAll('.legend').data(series);legendEntriesSel.enter().append('foreignObject').attr('class','legend').attr('x',this.graphWidth+2).attr('width',this.margin.right).attr('height',18).attr('transform',(series,i)=>'translate(0,'+i*18+')').append('xhtml:body').style('margin',0).append('tr-ui-b-chart-legend-key').property('color',series=>((this.currentHighlightedLegendKey===series.key)?series.highlightedColor:series.color)).property('width',this.margin.right).property('target',series=>series.target).property('title',series=>series.title).property('optional',series=>series.optional).property('enabled',series=>series.enabled).text(series=>series.key);legendEntriesSel.exit().remove();},get highlightedLegendKey(){return this.highlightedLegendKey_;},set highlightedLegendKey(highlightedLegendKey){this.highlightedLegendKey_=highlightedLegendKey;this.updateHighlight_();},get currentHighlightedLegendKey(){if(this.tempHighlightedLegendKey_){return this.tempHighlightedLegendKey_;}
+return this.highlightedLegendKey_;},pushTempHighlightedLegendKey(key){if(this.tempHighlightedLegendKey_){throw new Error('push cannot nest');}
+this.tempHighlightedLegendKey_=key;this.updateHighlight_();},popTempHighlightedLegendKey(key){if(this.tempHighlightedLegendKey_!==key){throw new Error('pop cannot happen');}
+this.tempHighlightedLegendKey_=undefined;this.updateHighlight_();},updateHighlight_(){const chartAreaSel=d3.select(this.chartAreaElement);const legendEntriesSel=chartAreaSel.selectAll('.legend');const getDataSeries=chart.getDataSeries.bind(chart);const currentHighlightedLegendKey=chart.currentHighlightedLegendKey;legendEntriesSel.each(function(key){const dataSeries=getDataSeries(key);if(key===currentHighlightedLegendKey){this.style.fill=dataSeries.highlightedColor;this.style.fontWeight='bold';}else{this.style.fill=dataSeries.color;this.style.fontWeight='';}});}};return{ChartBase,DataSeriesEnableChangeEventType,getColorOfKey,getSVGTextSize,};});'use strict';tr.exportTo('tr.ui.b',function(){const D3_Y_AXIS_WIDTH_PX=9;const D3_X_AXIS_HEIGHT_PX=23;function sanitizePower(x,defaultValue){if(!isNaN(x)&&isFinite(x)&&(x!==0))return x;return defaultValue;}
+const ChartBase2D=tr.ui.b.define('chart-base-2d',tr.ui.b.ChartBase);ChartBase2D.prototype={__proto__:tr.ui.b.ChartBase.prototype,decorate(){super.decorate();Polymer.dom(this).classList.add('chart-base-2d');this.xScale_=d3.scale.linear();this.yScale_=d3.scale.linear();this.isYLogScale_=false;this.yLogScaleMin_=undefined;this.autoDataRange_=new tr.b.math.Range();this.overrideDataRange_=undefined;this.hideXAxis_=false;this.hideYAxis_=false;this.data_=[];this.xAxisLabel_='';this.yAxisLabel_='';this.textHeightPx_=0;d3.select(this.chartAreaElement).append('g').attr('id','brushes');d3.select(this.chartAreaElement).append('g').attr('id','series');this.addEventListener('mousedown',this.onMouseDown_.bind(this));},get xAxisLabel(){return this.xAxisLabel_;},set xAxisLabel(label){this.xAxisLabel_=label;},get yAxisLabel(){return this.yAxisLabel_;},set yAxisLabel(label){this.yAxisLabel_=label;},get hideXAxis(){return this.hideXAxis_;},set hideXAxis(h){this.hideXAxis_=h;this.updateContents_();},get hideYAxis(){return this.hideYAxis_;},set hideYAxis(h){this.hideYAxis_=h;this.updateContents_();},get data(){return this.data_;},set data(data){if(data===undefined){throw new Error('data must be an Array');}
+this.data_=data;this.updateSeriesKeys_();this.updateDataRange_();this.updateContents_();},set isYLogScale(logScale){if(logScale){this.yScale_=d3.scale.log(10);}else{this.yScale_=d3.scale.linear();}
+this.isYLogScale_=logScale;},getYScaleMin_(){return this.isYLogScale_?this.yLogScaleMin_:0;},getYScaleDomain_(minValue,maxValue){if(this.overrideDataRange_!==undefined){return[this.dataRange.min,this.dataRange.max];}
+if(this.isYLogScale_){return[this.getYScaleMin_(),maxValue];}
+return[Math.min(minValue,this.getYScaleMin_()),maxValue];},getSampleWidth_(data,index,leftSide){let leftIndex;let rightIndex;if(leftSide){leftIndex=Math.max(index-1,0);rightIndex=index;}else{leftIndex=index;rightIndex=Math.min(index+1,data.length-1);}
+const leftWidth=this.getXForDatum_(data[index],index)-
+this.getXForDatum_(data[leftIndex],leftIndex);const rightWidth=this.getXForDatum_(data[rightIndex],rightIndex)-
+this.getXForDatum_(data[index],index);return tr.b.math.Statistics.mean([leftWidth,rightWidth]);},updateSeriesKeys_(){this.data_.forEach(function(datum){Object.keys(datum).forEach(function(key){if(this.isDatumFieldSeries_(key)){this.getDataSeries(key);}},this);},this);},isDatumFieldSeries_(fieldName){return fieldName!=='x';},getXForDatum_(datum,index){return datum.x;},updateMargins_(){this.margin.left=this.hideYAxis?0:this.yAxisWidth;this.margin.bottom=this.hideXAxis?0:this.xAxisHeight;if(this.hideXAxis&&!this.hideYAxis){this.margin.bottom=10;}
+if(this.hideYAxis&&!this.hideXAxis){this.margin.left=10;}
+this.margin.top=this.hideYAxis?0:10;if(this.yAxisLabel){this.margin.top+=this.textHeightPx_;}
+if(this.xAxisLabel){this.margin.right=Math.max(this.margin.right,16+tr.ui.b.getSVGTextSize(this,this.xAxisLabel).width);}
+super.updateMargins_();},get xAxisHeight(){return D3_X_AXIS_HEIGHT_PX;},computeScaleTickWidth_(scale){if(this.data.length===0)return 0;let tickValues=scale.ticks();let format=scale.tickFormat();if(this.isYLogScale_){const enclosingPowers=this.dataRange.enclosingPowers();tickValues=[sanitizePower(enclosingPowers.min,1),sanitizePower(enclosingPowers.max,10),];format=v=>v.toString();}
+return D3_Y_AXIS_WIDTH_PX+Math.max(tr.ui.b.getSVGTextSize(this,format(tickValues[0])).width,tr.ui.b.getSVGTextSize(this,format(tickValues[tickValues.length-1])).width);},get yAxisWidth(){return this.computeScaleTickWidth_(this.yScale_);},updateScales_(){if(this.data_.length===0)return;this.xScale_.range([0,this.graphWidth]);this.xScale_.domain(d3.extent(this.data_,this.getXForDatum_.bind(this)));this.yScale_.range([this.graphHeight,0]);this.yScale_.domain([this.dataRange.min,this.dataRange.max]);},updateBrushContents_(brushSel){brushSel.selectAll('*').remove();},updateXAxis_(xAxis){xAxis.selectAll('*').remove();xAxis[0][0].style.opacity=0;if(this.hideXAxis)return;this.drawXAxis_(xAxis);const label=xAxis.append('text').attr('class','label');this.drawXAxisTicks_(xAxis);this.drawXAxisLabel_(label);xAxis[0][0].style.opacity=1;},drawXAxis_(xAxis){xAxis.attr('transform','translate(0,'+this.graphHeight+')').call(d3.svg.axis().scale(this.xScale_).orient('bottom'));},drawXAxisLabel_(label){label.attr('x',this.graphWidth+16).attr('y',8).text(this.xAxisLabel);},drawXAxisTicks_(xAxis){let previousRight=undefined;xAxis.selectAll('.tick')[0].forEach(function(tick){const currentLeft=tick.transform.baseVal[0].matrix.e;if((previousRight===undefined)||(currentLeft>(previousRight+3))){const currentWidth=tick.getBBox().width;previousRight=currentLeft+currentWidth;}else{tick.style.opacity=0;}});},set overrideDataRange(range){this.overrideDataRange_=range;},get dataRange(){if(this.overrideDataRange_!==undefined){return this.overrideDataRange_;}
+return this.autoDataRange_;},updateDataRange_(){if(this.overrideDataRange_!==undefined)return;const dataBySeriesKey=this.getDataBySeriesKey_();this.autoDataRange_.reset();for(const[series,values]of Object.entries(dataBySeriesKey)){for(let i=0;i<values.length;i++){this.autoDataRange_.addValue(values[i][series]);}}
+this.yLogScaleMin_=undefined;if(this.autoDataRange_.min!==undefined){let minValue=this.autoDataRange_.min;if(minValue===0){minValue=1;}
+const onePowerLess=tr.b.math.lesserPower(minValue/10);this.yLogScaleMin_=onePowerLess;}},updateYAxis_(yAxis){yAxis.selectAll('*').remove();yAxis[0][0].style.opacity=0;if(this.hideYAxis)return;this.drawYAxis_(yAxis);this.drawYAxisTicks_(yAxis);const label=yAxis.append('text').attr('class','label');this.drawYAxisLabel_(label);},drawYAxis_(yAxis){let axisModifier=d3.svg.axis().scale(this.yScale_).orient('left');if(this.isYLogScale_){if(this.yLogScaleMin_===undefined)return;const tickValues=[];const enclosingPowers=this.dataRange.enclosingPowers();const maxPower=sanitizePower(enclosingPowers.max,10);for(let power=sanitizePower(enclosingPowers.min,1);power<=maxPower;power*=10){tickValues.push(power);}
+axisModifier=axisModifier.tickValues(tickValues).tickFormat(v=>v.toString());}
+yAxis.call(axisModifier);},drawYAxisLabel_(label){const labelWidthPx=Math.ceil(tr.ui.b.getSVGTextSize(this.chartAreaElement,this.yAxisLabel).width);label.attr('x',-labelWidthPx).attr('y',-8).text(this.yAxisLabel);},drawYAxisTicks_(yAxis){let previousTop=undefined;yAxis.selectAll('.tick')[0].forEach(function(tick){const bbox=tick.getBBox();const currentTop=tick.transform.baseVal[0].matrix.f;const currentBottom=currentTop+bbox.height;if((previousTop===undefined)||(previousTop>(currentBottom+3))){previousTop=currentTop;}else{tick.style.opacity=0;}});yAxis[0][0].style.opacity=1;},updateContents_(){if(this.textHeightPx_===0){this.textHeightPx_=tr.ui.b.getSVGTextSize(this,'Ay').height;}
+this.updateScales_();super.updateContents_();const chartAreaSel=d3.select(this.chartAreaElement);this.updateXAxis_(chartAreaSel.select('.x.axis'));this.updateYAxis_(chartAreaSel.select('.y.axis'));this.updateBrushContents_(chartAreaSel.select('#brushes'));this.updateDataContents_(chartAreaSel.select('#series'));},updateDataContents_(seriesSel){throw new Error('Not implemented');},getDataBySeriesKey_(){const dataBySeriesKey={};for(const[key,series]of this.seriesByKey_){dataBySeriesKey[key]=[];}
+this.data_.forEach(function(multiSeriesDatum,index){const x=this.getXForDatum_(multiSeriesDatum,index);d3.keys(multiSeriesDatum).forEach(function(seriesKey){if(seriesKey==='x')return;if(multiSeriesDatum[seriesKey]===undefined)return;if(!this.isDatumFieldSeries_(seriesKey))return;const singleSeriesDatum={x};singleSeriesDatum[seriesKey]=multiSeriesDatum[seriesKey];dataBySeriesKey[seriesKey].push(singleSeriesDatum);},this);},this);return dataBySeriesKey;},getChartPointAtClientPoint_(clientPoint){const rect=this.getBoundingClientRect();return{x:clientPoint.x-rect.left-this.margin.left,y:clientPoint.y-rect.top-this.margin.top};},getDataPointAtChartPoint_(chartPoint){return{x:tr.b.math.clamp(this.xScale_.invert(chartPoint.x),this.xScale_.domain()[0],this.xScale_.domain()[1]),y:tr.b.math.clamp(this.yScale_.invert(chartPoint.y),this.yScale_.domain()[0],this.yScale_.domain()[1])};},getDataPointAtClientPoint_(clientX,clientY){const chartPoint=this.getChartPointAtClientPoint_({x:clientX,y:clientY});return this.getDataPointAtChartPoint_(chartPoint);},prepareDataEvent_(mouseEvent,dataEvent){const dataPoint=this.getDataPointAtClientPoint_(mouseEvent.clientX,mouseEvent.clientY);dataEvent.x=dataPoint.x;dataEvent.y=dataPoint.y;},onMouseDown_(mouseEvent){tr.ui.b.trackMouseMovesUntilMouseUp(this.onMouseMove_.bind(this,mouseEvent.button),this.onMouseUp_.bind(this,mouseEvent.button));mouseEvent.preventDefault();mouseEvent.stopPropagation();const dataEvent=new tr.b.Event('item-mousedown');dataEvent.button=mouseEvent.button;Polymer.dom(this).classList.add('updating-brushing-state');this.prepareDataEvent_(mouseEvent,dataEvent);this.dispatchEvent(dataEvent);},onMouseMove_(button,mouseEvent){if(mouseEvent.buttons!==undefined){mouseEvent.preventDefault();mouseEvent.stopPropagation();}
+const dataEvent=new tr.b.Event('item-mousemove');dataEvent.button=button;this.prepareDataEvent_(mouseEvent,dataEvent);this.dispatchEvent(dataEvent);},onMouseUp_(button,mouseEvent){mouseEvent.preventDefault();mouseEvent.stopPropagation();const dataEvent=new tr.b.Event('item-mouseup');dataEvent.button=button;this.prepareDataEvent_(mouseEvent,dataEvent);this.dispatchEvent(dataEvent);Polymer.dom(this).classList.remove('updating-brushing-state');}};return{ChartBase2D,};});'use strict';tr.exportTo('tr.ui.b',function(){const ChartBase2D=tr.ui.b.ChartBase2D;const ChartBase2DBrushX=tr.ui.b.define('chart-base-2d-brush-1d',ChartBase2D);ChartBase2DBrushX.prototype={__proto__:ChartBase2D.prototype,decorate(){super.decorate();this.brushedRange_=new tr.b.math.Range();},set brushedRange(range){this.brushedRange_.reset();this.brushedRange_.addRange(range);this.updateContents_();},get brushedRange(){return tr.b.math.Range.fromDict(this.brushedRange_.toJSON());},computeBrushRangeFromIndices(indexA,indexB){indexA=tr.b.math.clamp(indexA,0,this.data_.length-1);indexB=tr.b.math.clamp(indexB,0,this.data_.length-1);const leftIndex=Math.min(indexA,indexB);const rightIndex=Math.max(indexA,indexB);const brushRange=new tr.b.math.Range();brushRange.addValue(this.getXForDatum_(this.data_[leftIndex],leftIndex)-
+this.getSampleWidth_(this.data_,leftIndex,true));brushRange.addValue(this.getXForDatum_(this.data_[rightIndex],rightIndex)+
+this.getSampleWidth_(this.data_,rightIndex,false));return brushRange;},getDataIndex_(dataX){if(this.data.length===0)return undefined;const bisect=d3.bisector(this.getXForDatum_.bind(this)).right;return bisect(this.data_,dataX)-1;},prepareDataEvent_(mouseEvent,dataEvent){ChartBase2D.prototype.prepareDataEvent_.call(this,mouseEvent,dataEvent);dataEvent.index=this.getDataIndex_(dataEvent.x);if(dataEvent.index!==undefined){dataEvent.data=this.data_[dataEvent.index];}},updateBrushContents_(brushSel){brushSel.selectAll('*').remove();const brushes=this.brushedRange_.isEmpty?[]:[this.brushedRange_];const brushRectsSel=brushSel.selectAll('rect').data(brushes);brushRectsSel.enter().append('rect');brushRectsSel.exit().remove();this.drawBrush_(brushRectsSel);},drawBrush_(brushRectsSel){brushRectsSel.attr('x',d=>this.xScale_(d.min)).attr('y',0).attr('width',d=>this.xScale_(d.max)-this.xScale_(d.min)).attr('height',this.graphHeight);}};return{ChartBase2DBrushX,};});'use strict';tr.exportTo('tr.ui.b',function(){const LineChart=tr.ui.b.define('line-chart',tr.ui.b.ChartBase2DBrushX);LineChart.prototype={__proto__:tr.ui.b.ChartBase2DBrushX.prototype,get defaultGraphWidth(){return 20*this.data_.length;},get defaultGraphHeight(){return 100;},updateDataContents_(dataSel){dataSel.selectAll('*').remove();const dataBySeriesKey=this.getDataBySeriesKey_();const seriesKeys=[...this.seriesByKey_.keys()];const pathsSel=dataSel.selectAll('path').data(seriesKeys);pathsSel.enter().append('path').style('fill','none').style('stroke-width','1.5px').style('stroke',key=>this.getDataSeries(key).color).attr('d',key=>{const line=d3.svg.line().x(d=>this.xScale_(d.x)).y(d=>this.yScale_(this.dataRange.clamp(d[key])));return line(dataBySeriesKey[key]);});pathsSel.exit().remove();}};return{LineChart,};});'use strict';Polymer({is:'tr-ui-e-s-input-latency-side-panel',behaviors:[tr.ui.behaviors.SidePanel],ready(){this.rangeOfInterest_=new tr.b.math.Range();this.frametimeType_=tr.model.helpers.IMPL_FRAMETIME_TYPE;this.latencyChart_=undefined;this.frametimeChart_=undefined;this.selectedProcessId_=undefined;this.mouseDownIndex_=undefined;this.curMouseIndex_=undefined;},get model(){return this.model_;},set model(model){this.model_=model;if(this.model_){this.modelHelper_=this.model_.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);}else{this.modelHelper_=undefined;}
+this.updateToolbar_();this.updateContents_();},get frametimeType(){return this.frametimeType_;},set frametimeType(type){if(this.frametimeType_===type)return;this.frametimeType_=type;this.updateContents_();},get selectedProcessId(){return this.selectedProcessId_;},set selectedProcessId(process){if(this.selectedProcessId_===process)return;this.selectedProcessId_=process;this.updateContents_();},set selection(selection){if(this.latencyChart_===undefined)return;this.latencyChart_.brushedRange=selection.bounds;},setBrushedIndices(mouseDownIndex,curIndex){this.mouseDownIndex_=mouseDownIndex;this.curMouseIndex_=curIndex;this.updateBrushedRange_();},updateBrushedRange_(){if(this.latencyChart_===undefined)return;let r=new tr.b.math.Range();if(this.mouseDownIndex_===undefined){this.latencyChart_.brushedRange=r;return;}
+r=this.latencyChart_.computeBrushRangeFromIndices(this.mouseDownIndex_,this.curMouseIndex_);this.latencyChart_.brushedRange=r;let latencySlices=[];for(const thread of this.model_.getAllThreads()){for(const event of thread.getDescendantEvents()){if(event.title.indexOf('InputLatency:')===0){latencySlices.push(event);}}}
+latencySlices=tr.model.helpers.getSlicesIntersectingRange(r,latencySlices);const event=new tr.model.RequestSelectionChangeEvent();event.selection=new tr.model.EventSet(latencySlices);this.latencyChart_.dispatchEvent(event);},registerMouseEventForLatencyChart_(){this.latencyChart_.addEventListener('item-mousedown',function(e){this.mouseDownIndex_=e.index;this.curMouseIndex_=e.index;this.updateBrushedRange_();}.bind(this));this.latencyChart_.addEventListener('item-mousemove',function(e){if(e.button===undefined)return;this.curMouseIndex_=e.index;this.updateBrushedRange_();}.bind(this));this.latencyChart_.addEventListener('item-mouseup',function(e){this.curMouseIndex=e.index;this.updateBrushedRange_();}.bind(this));},updateToolbar_(){const browserProcess=this.modelHelper_.browserProcess;const labels=[];if(browserProcess!==undefined){const labelStr='Browser: '+browserProcess.pid;labels.push({label:labelStr,value:browserProcess.pid});}
+for(const rendererHelper of
+Object.values(this.modelHelper_.rendererHelpers)){const rendererProcess=rendererHelper.process;const labelStr='Renderer: '+rendererProcess.userFriendlyName;labels.push({label:labelStr,value:rendererProcess.userFriendlyName});}
+if(labels.length===0)return;this.selectedProcessId_=labels[0].value;const toolbarEl=this.$.toolbar;Polymer.dom(toolbarEl).appendChild(tr.ui.b.createSelector(this,'frametimeType','inputLatencySidePanel.frametimeType',this.frametimeType_,[{label:'Main Thread Frame Times',value:tr.model.helpers.MAIN_FRAMETIME_TYPE},{label:'Impl Thread Frame Times',value:tr.model.helpers.IMPL_FRAMETIME_TYPE}]));Polymer.dom(toolbarEl).appendChild(tr.ui.b.createSelector(this,'selectedProcessId','inputLatencySidePanel.selectedProcessId',this.selectedProcessId_,labels));},get currentRangeOfInterest(){if(this.rangeOfInterest_.isEmpty){return this.model_.bounds;}
+return this.rangeOfInterest_;},createLatencyLineChart(data,title,parentNode){const chart=new tr.ui.b.LineChart();Polymer.dom(parentNode).appendChild(chart);let width=600;if(document.body.clientWidth!==undefined){width=document.body.clientWidth*0.5;}
+chart.graphWidth=width;chart.chartTitle=title;chart.data=data;return chart;},updateContents_(){const resultArea=this.$.result_area;this.latencyChart_=undefined;this.frametimeChart_=undefined;Polymer.dom(resultArea).textContent='';if(this.modelHelper_===undefined)return;const rangeOfInterest=this.currentRangeOfInterest;let chromeProcess;if(this.modelHelper_.rendererHelpers[this.selectedProcessId_]){chromeProcess=this.modelHelper_.rendererHelpers[this.selectedProcessId_];}else{chromeProcess=this.modelHelper_.browserHelper;}
+const frameEvents=chromeProcess.getFrameEventsInRange(this.frametimeType,rangeOfInterest);const frametimeData=tr.model.helpers.getFrametimeDataFromEvents(frameEvents);const averageFrametime=tr.b.math.Statistics.mean(frametimeData,d=>d.frametime);const latencyEvents=this.modelHelper_.browserHelper.getLatencyEventsInRange(rangeOfInterest);const latencyData=[];latencyEvents.forEach(function(event){if(event.inputLatency===undefined)return;latencyData.push({x:event.start,latency:event.inputLatency/1000});});const averageLatency=tr.b.math.Statistics.mean(latencyData,function(d){return d.latency;});const latencySummaryText=document.createElement('div');Polymer.dom(latencySummaryText).appendChild(tr.ui.b.createSpan({textContent:'Average Latency '+averageLatency+' ms',bold:true}));Polymer.dom(resultArea).appendChild(latencySummaryText);const frametimeSummaryText=document.createElement('div');Polymer.dom(frametimeSummaryText).appendChild(tr.ui.b.createSpan({textContent:'Average Frame Time '+averageFrametime+' ms',bold:true}));Polymer.dom(resultArea).appendChild(frametimeSummaryText);if(latencyData.length!==0){this.latencyChart_=this.createLatencyLineChart(latencyData,'Latency Over Time',resultArea);this.registerMouseEventForLatencyChart_();}
+if(frametimeData.length!==0){this.frametimeChart_=this.createLatencyLineChart(frametimeData,'Frame Times',resultArea);}},get rangeOfInterest(){return this.rangeOfInterest_;},set rangeOfInterest(rangeOfInterest){this.rangeOfInterest_=rangeOfInterest;this.updateContents_();},supportsModel(m){if(m===undefined){return{supported:false,reason:'Unknown tracing model'};}
+if(!tr.model.helpers.ChromeModelHelper.supportsModel(m)){return{supported:false,reason:'No Chrome browser or renderer process found'};}
+const modelHelper=m.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);if(modelHelper.browserHelper&&modelHelper.browserHelper.hasLatencyEvents){return{supported:true};}
+return{supported:false,reason:'No InputLatency events trace. Consider enabling '+'benchmark" and "input" category when recording the trace'};},get textLabel(){return'Input Latency';}});tr.ui.side_panel.SidePanelRegistry.register(function(){return document.createElement('tr-ui-e-s-input-latency-side-panel');});'use strict';tr.exportTo('tr.e.system_stats',function(){const ObjectSnapshot=tr.model.ObjectSnapshot;function SystemStatsSnapshot(objectInstance,ts,args){ObjectSnapshot.apply(this,arguments);this.objectInstance=objectInstance;this.ts=ts;this.args=args;this.stats=args;}
+SystemStatsSnapshot.prototype={__proto__:ObjectSnapshot.prototype,initialize(){if(this.args.length===0){throw new Error('No system stats snapshot data.');}
+this.stats_=this.args;},getStats(){return this.stats_;},setStats(stats){this.stats_=stats;}};ObjectSnapshot.subTypes.register(SystemStatsSnapshot,{typeName:'base::TraceEventSystemStatsMonitor::SystemStats'});return{SystemStatsSnapshot,};});'use strict';tr.exportTo('tr.ui.b',function(){const constants={HEADING_WIDTH:250};return{constants,};});'use strict';Polymer({is:'tr-ui-b-heading',DOWN_ARROW:String.fromCharCode(0x25BE),RIGHT_ARROW:String.fromCharCode(0x25B8),ready(viewport){this.style.width=(tr.ui.b.constants.HEADING_WIDTH-6)+'px';this.heading_='';this.expanded_=true;this.arrowVisible_=false;this.selectionGenerator_=undefined;this.updateContents_();},get heading(){return this.heading_;},set heading(text){if(this.heading_===text)return;this.heading_=text;this.updateContents_();},set arrowVisible(val){if(this.arrowVisible_===val)return;this.arrowVisible_=!!val;this.updateContents_();},set tooltip(text){this.$.heading.title=text;},set selectionGenerator(generator){if(this.selectionGenerator_===generator)return;this.selectionGenerator_=generator;this.updateContents_();},get expanded(){return this.expanded_;},set expanded(expanded){if(this.expanded_===expanded)return;this.expanded_=!!expanded;this.updateContents_();},onHeadingDivClicked_(){this.dispatchEvent(new tr.b.Event('heading-clicked',true));},updateContents_(){if(this.arrowVisible_){this.$.arrow.style.display='';}else{this.$.arrow.style.display='none';this.$.heading.style.display=this.expanded_?'':'none';}
+if(this.arrowVisible_){Polymer.dom(this.$.arrow).textContent=this.expanded_?this.DOWN_ARROW:this.RIGHT_ARROW;}
+this.$.link.style.display='none';this.$.heading_content.style.display='none';if(this.selectionGenerator_){this.$.link.style.display='inline-block';this.$.link.selection=this.selectionGenerator_;Polymer.dom(this.$.link).textContent=this.heading_;}else{this.$.heading_content.style.display='inline-block';Polymer.dom(this.$.heading_content).textContent=this.heading_;}}});'use strict';tr.exportTo('tr.ui.tracks',function(){const Track=tr.ui.b.define('track',tr.ui.b.ContainerThatDecoratesItsChildren);Track.prototype={__proto__:tr.ui.b.ContainerThatDecoratesItsChildren.prototype,decorate(viewport){tr.ui.b.ContainerThatDecoratesItsChildren.prototype.decorate.call(this);if(viewport===undefined){throw new Error('viewport is required when creating a Track.');}
+this.viewport_=viewport;Polymer.dom(this).classList.add('track');},get viewport(){return this.viewport_;},get drawingContainer(){if(this instanceof tr.ui.tracks.DrawingContainer)return this;let cur=this.parentElement;while(cur){if(cur instanceof tr.ui.tracks.DrawingContainer)return cur;cur=cur.parentElement;}
+return undefined;},get eventContainer(){},invalidateDrawingContainer(){const dc=this.drawingContainer;if(dc)dc.invalidate();},context(){if(!Polymer.dom(this).parentNode)return undefined;if(!Polymer.dom(this).parentNode.context){throw new Error('Parent container does not support context() method.');}
+return Polymer.dom(this).parentNode.context();},decorateChild_(childTrack){},undecorateChild_(childTrack){if(childTrack.detach){childTrack.detach();}},updateContents_(){},drawTrack(type){const ctx=this.context();const pixelRatio=window.devicePixelRatio||1;const bounds=this.getBoundingClientRect();const canvasBounds=ctx.canvas.getBoundingClientRect();ctx.save();ctx.translate(0,pixelRatio*(bounds.top-canvasBounds.top));const dt=this.viewport.currentDisplayTransform;const viewLWorld=dt.xViewToWorld(0);const viewRWorld=dt.xViewToWorld(bounds.width*pixelRatio);this.draw(type,viewLWorld,viewRWorld);ctx.restore();},draw(type,viewLWorld,viewRWorld){},addEventsToTrackMap(eventToTrackMap){},addContainersToTrackMap(containerToTrackMap){},addIntersectingEventsInRangeToSelection(loVX,hiVX,loVY,hiVY,selection){const pixelRatio=window.devicePixelRatio||1;const dt=this.viewport.currentDisplayTransform;const viewPixWidthWorld=dt.xViewVectorToWorld(1);const loWX=dt.xViewToWorld(loVX*pixelRatio);const hiWX=dt.xViewToWorld(hiVX*pixelRatio);const clientRect=this.getBoundingClientRect();const a=Math.max(loVY,clientRect.top);const b=Math.min(hiVY,clientRect.bottom);if(a>b)return;this.addIntersectingEventsInRangeToSelectionInWorldSpace(loWX,hiWX,viewPixWidthWorld,selection);},addIntersectingEventsInRangeToSelectionInWorldSpace(loWX,hiWX,viewPixWidthWorld,selection){},addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection){},addClosestInstantEventToSelection(instantEvents,worldX,worldMaxDist,selection){const instantEvent=tr.b.math.findClosestElementInSortedArray(instantEvents,function(x){return x.start;},worldX,worldMaxDist);if(!instantEvent)return;selection.push(instantEvent);}};return{Track,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const SelectionState=tr.model.SelectionState;const EventPresenter=tr.ui.b.EventPresenter;const ObjectInstanceTrack=tr.ui.b.define('object-instance-track',tr.ui.tracks.Track);ObjectInstanceTrack.prototype={__proto__:tr.ui.tracks.Track.prototype,decorate(viewport){tr.ui.tracks.Track.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('object-instance-track');this.objectInstances_=[];this.objectSnapshots_=[];this.heading_=document.createElement('tr-ui-b-heading');Polymer.dom(this).appendChild(this.heading_);},set heading(heading){this.heading_.heading=heading;},get heading(){return this.heading_.heading;},set tooltip(tooltip){this.heading_.tooltip=tooltip;},get objectInstances(){return this.objectInstances_;},set objectInstances(objectInstances){if(!objectInstances||objectInstances.length===0){this.heading='';this.objectInstances_=[];this.objectSnapshots_=[];return;}
+this.heading=objectInstances[0].typeName;this.objectInstances_=objectInstances;this.objectSnapshots_=[];this.objectInstances_.forEach(function(instance){this.objectSnapshots_.push.apply(this.objectSnapshots_,instance.snapshots);},this);this.objectSnapshots_.sort(function(a,b){return a.ts-b.ts;});},get height(){return window.getComputedStyle(this).height;},set height(height){this.style.height=height;},get snapshotRadiusView(){return 7*(window.devicePixelRatio||1);},draw(type,viewLWorld,viewRWorld){switch(type){case tr.ui.tracks.DrawType.GENERAL_EVENT:this.drawLetterDots_(viewLWorld,viewRWorld);break;}},drawLetterDots_(viewLWorld,viewRWorld){const ctx=this.context();const pixelRatio=window.devicePixelRatio||1;const bounds=this.getBoundingClientRect();const height=bounds.height*pixelRatio;const halfHeight=height*0.5;const twoPi=Math.PI*2;const dt=this.viewport.currentDisplayTransform;const snapshotRadiusView=this.snapshotRadiusView;const snapshotRadiusWorld=dt.xViewVectorToWorld(height);ctx.save();dt.applyTransformToCanvas(ctx);const objectInstances=this.objectInstances_;let loI=tr.b.math.findLowIndexInSortedArray(objectInstances,function(instance){return instance.deletionTs;},viewLWorld);ctx.strokeStyle='rgb(0,0,0)';for(let i=loI;i<objectInstances.length;++i){const instance=objectInstances[i];const x=instance.creationTs;if(x>viewRWorld)break;const right=instance.deletionTs===Number.MAX_VALUE?viewRWorld:instance.deletionTs;ctx.fillStyle=EventPresenter.getObjectInstanceColor(instance);ctx.fillRect(x,pixelRatio,right-x,height-2*pixelRatio);}
+ctx.restore();const objectSnapshots=this.objectSnapshots_;loI=tr.b.math.findLowIndexInSortedArray(objectSnapshots,function(snapshot){return snapshot.ts+snapshotRadiusWorld;},viewLWorld);for(let i=loI;i<objectSnapshots.length;++i){const snapshot=objectSnapshots[i];const x=snapshot.ts;if(x-snapshotRadiusWorld>viewRWorld)break;const xView=dt.xWorldToView(x);ctx.fillStyle=EventPresenter.getObjectSnapshotColor(snapshot);ctx.beginPath();ctx.arc(xView,halfHeight,snapshotRadiusView,0,twoPi);ctx.fill();if(snapshot.selected){ctx.lineWidth=5;ctx.strokeStyle='rgb(100,100,0)';ctx.stroke();ctx.beginPath();ctx.arc(xView,halfHeight,snapshotRadiusView-1,0,twoPi);ctx.lineWidth=2;ctx.strokeStyle='rgb(255,255,0)';ctx.stroke();}else{ctx.lineWidth=1;ctx.strokeStyle='rgb(0,0,0)';ctx.stroke();}}
+ctx.lineWidth=1;let selectionState=SelectionState.NONE;if(objectInstances.length&&objectInstances[0].selectionState===SelectionState.DIMMED){selectionState=SelectionState.DIMMED;}
+if(selectionState===SelectionState.DIMMED){const width=bounds.width*pixelRatio;ctx.fillStyle='rgba(255,255,255,0.5)';ctx.fillRect(0,0,width,height);ctx.restore();}},addEventsToTrackMap(eventToTrackMap){if(this.objectInstance_!==undefined){this.objectInstance_.forEach(function(obj){eventToTrackMap.addEvent(obj,this);},this);}
+if(this.objectSnapshots_!==undefined){this.objectSnapshots_.forEach(function(obj){eventToTrackMap.addEvent(obj,this);},this);}},addIntersectingEventsInRangeToSelectionInWorldSpace(loWX,hiWX,viewPixWidthWorld,selection){let foundSnapshot=false;function onSnapshot(snapshot){selection.push(snapshot);foundSnapshot=true;}
+const snapshotRadiusView=this.snapshotRadiusView;const snapshotRadiusWorld=viewPixWidthWorld*snapshotRadiusView;tr.b.math.iterateOverIntersectingIntervals(this.objectSnapshots_,function(x){return x.ts-snapshotRadiusWorld;},function(x){return 2*snapshotRadiusWorld;},loWX,hiWX,onSnapshot);if(foundSnapshot)return;tr.b.math.iterateOverIntersectingIntervals(this.objectInstances_,function(x){return x.creationTs;},function(x){return x.deletionTs-x.creationTs;},loWX,hiWX,(value)=>{selection.push(value);});},addEventNearToProvidedEventToSelection(event,offset,selection){let events;if(event instanceof tr.model.ObjectSnapshot){events=this.objectSnapshots_;}else if(event instanceof tr.model.ObjectInstance){events=this.objectInstances_;}else{throw new Error('Unrecognized event');}
+const index=events.indexOf(event);const newIndex=index+offset;if(newIndex>=0&&newIndex<events.length){selection.push(events[newIndex]);return true;}
+return false;},addAllEventsMatchingFilterToSelection(filter,selection){},addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection){const snapshot=tr.b.math.findClosestElementInSortedArray(this.objectSnapshots_,function(x){return x.ts;},worldX,worldMaxDist);if(!snapshot)return;selection.push(snapshot);}};const options=new tr.b.ExtensionRegistryOptions(tr.b.TYPE_BASED_REGISTRY_MODE);tr.b.decorateExtensionRegistry(ObjectInstanceTrack,options);return{ObjectInstanceTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const StackedBarsTrack=tr.ui.b.define('stacked-bars-track',tr.ui.tracks.Track);StackedBarsTrack.prototype={__proto__:tr.ui.tracks.Track.prototype,decorate(viewport){tr.ui.tracks.Track.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('stacked-bars-track');this.objectInstance_=null;this.heading_=document.createElement('tr-ui-b-heading');Polymer.dom(this).appendChild(this.heading_);},set heading(heading){this.heading_.heading=heading;},get heading(){return this.heading_.heading;},set tooltip(tooltip){this.heading_.tooltip=tooltip;},addEventsToTrackMap(eventToTrackMap){const objectSnapshots=this.objectInstance_.snapshots;objectSnapshots.forEach(function(obj){eventToTrackMap.addEvent(obj,this);},this);},addIntersectingEventsInRangeToSelectionInWorldSpace(loWX,hiWX,viewPixWidthWorld,selection){function onSnapshot(snapshot){selection.push(snapshot);}
+const snapshots=this.objectInstance_.snapshots;const maxBounds=this.objectInstance_.parent.model.bounds.max;tr.b.math.iterateOverIntersectingIntervals(snapshots,function(x){return x.ts;},function(x,i){if(i===snapshots.length-1){if(snapshots.length===1){return maxBounds;}
+return snapshots[i].ts-snapshots[i-1].ts;}
+return snapshots[i+1].ts-snapshots[i].ts;},loWX,hiWX,onSnapshot);},addEventNearToProvidedEventToSelection(event,offset,selection){if(!(event instanceof tr.model.ObjectSnapshot)){throw new Error('Unrecognized event');}
+const objectSnapshots=this.objectInstance_.snapshots;const index=objectSnapshots.indexOf(event);const newIndex=index+offset;if(newIndex>=0&&newIndex<objectSnapshots.length){selection.push(objectSnapshots[newIndex]);return true;}
+return false;},addAllEventsMatchingFilterToSelection(filter,selection){},addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection){const snapshot=tr.b.math.findClosestElementInSortedArray(this.objectInstance_.snapshots,function(x){return x.ts;},worldX,worldMaxDist);if(!snapshot)return;selection.push(snapshot);}};return{StackedBarsTrack,};});'use strict';tr.exportTo('tr.ui.e.system_stats',function(){const EventPresenter=tr.ui.b.EventPresenter;let statCount;const excludedStats={'meminfo':{'pswpin':0,'pswpout':0,'pgmajfault':0},'diskinfo':{'io':0,'io_time':0,'read_time':0,'reads':0,'reads_merged':0,'sectors_read':0,'sectors_written':0,'weighted_io_time':0,'write_time':0,'writes':0,'writes_merged':0},'swapinfo':{}};const SystemStatsInstanceTrack=tr.ui.b.define('tr-ui-e-system-stats-instance-track',tr.ui.tracks.StackedBarsTrack);SystemStatsInstanceTrack.prototype={__proto__:tr.ui.tracks.StackedBarsTrack.prototype,decorate(viewport){tr.ui.tracks.StackedBarsTrack.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('tr-ui-e-system-stats-instance-track');this.objectInstance_=null;},set objectInstances(objectInstances){if(!objectInstances){this.objectInstance_=[];return;}
+if(objectInstances.length!==1){throw new Error('Bad object instance count.');}
+this.objectInstance_=objectInstances[0];if(this.objectInstance_!==null){this.computeRates_(this.objectInstance_.snapshots);this.maxStats_=this.computeMaxStats_(this.objectInstance_.snapshots);}},computeRates_(snapshots){for(let i=0;i<snapshots.length;i++){const snapshot=snapshots[i];const stats=snapshot.getStats();let prevSnapshot;if(i===0){prevSnapshot=snapshots[0];}else{prevSnapshot=snapshots[i-1];}
+const prevStats=prevSnapshot.getStats();let timeIntervalSeconds=(snapshot.ts-prevSnapshot.ts)/1000;if(timeIntervalSeconds===0){timeIntervalSeconds=1;}
+this.computeRatesRecursive_(prevStats,stats,timeIntervalSeconds);}},computeRatesRecursive_(prevStats,stats,timeIntervalSeconds){for(const statName in stats){if(stats[statName]instanceof Object){this.computeRatesRecursive_(prevStats[statName],stats[statName],timeIntervalSeconds);}else{if(statName==='sectors_read'){stats.bytes_read_per_sec=(stats.sectors_read-
+prevStats.sectors_read)*512/timeIntervalSeconds;}
+if(statName==='sectors_written'){stats.bytes_written_per_sec=(stats.sectors_written-
+prevStats.sectors_written)*512/timeIntervalSeconds;}
+if(statName==='pgmajfault'){stats.pgmajfault_per_sec=(stats.pgmajfault-
+prevStats.pgmajfault)/timeIntervalSeconds;}
+if(statName==='pswpin'){stats.bytes_swpin_per_sec=(stats.pswpin-
+prevStats.pswpin)*1000/timeIntervalSeconds;}
+if(statName==='pswpout'){stats.bytes_swpout_per_sec=(stats.pswpout-
+prevStats.pswpout)*1000/timeIntervalSeconds;}}}},computeMaxStats_(snapshots){const maxStats={};statCount=0;for(let i=0;i<snapshots.length;i++){const snapshot=snapshots[i];const stats=snapshot.getStats();this.computeMaxStatsRecursive_(stats,maxStats,excludedStats);}
+return maxStats;},computeMaxStatsRecursive_(stats,maxStats,excludedStats){for(const statName in stats){if(stats[statName]instanceof Object){if(!(statName in maxStats)){maxStats[statName]={};}
+let excludedNested;if(excludedStats&&statName in excludedStats){excludedNested=excludedStats[statName];}else{excludedNested=null;}
+this.computeMaxStatsRecursive_(stats[statName],maxStats[statName],excludedNested);}else{if(excludedStats&&statName in excludedStats){continue;}
+if(!(statName in maxStats)){maxStats[statName]=0;statCount++;}
+if(stats[statName]>maxStats[statName]){maxStats[statName]=stats[statName];}}}},get height(){return window.getComputedStyle(this).height;},set height(height){this.style.height=height;},draw(type,viewLWorld,viewRWorld){switch(type){case tr.ui.tracks.DrawType.GENERAL_EVENT:this.drawStatBars_(viewLWorld,viewRWorld);break;}},drawStatBars_(viewLWorld,viewRWorld){const ctx=this.context();const pixelRatio=window.devicePixelRatio||1;const bounds=this.getBoundingClientRect();const width=bounds.width*pixelRatio;const height=(bounds.height*pixelRatio)/statCount;const vp=this.viewport.currentDisplayTransform;const maxStats=this.maxStats_;const objectSnapshots=this.objectInstance_.snapshots;let lowIndex=tr.b.math.findLowIndexInSortedArray(objectSnapshots,function(snapshot){return snapshot.ts;},viewLWorld);if(lowIndex>0)lowIndex-=1;for(let i=lowIndex;i<objectSnapshots.length;++i){const snapshot=objectSnapshots[i];const trace=snapshot.getStats();const currentY=height;const left=snapshot.ts;if(left>viewRWorld)break;let leftView=vp.xWorldToView(left);if(leftView<0)leftView=0;let right;if(i!==objectSnapshots.length-1){right=objectSnapshots[i+1].ts;}else{if(objectSnapshots.length>1){right=objectSnapshots[i].ts+(objectSnapshots[i].ts-
+objectSnapshots[i-1].ts);}else{right=this.objectInstance_.parent.model.bounds.max;}}
+let rightView=vp.xWorldToView(right);if(rightView>width){rightView=width;}
+leftView=Math.floor(leftView);rightView=Math.floor(rightView);this.drawStatBarsRecursive_(snapshot,leftView,rightView,height,trace,maxStats,currentY);if(i===lowIndex){this.drawStatNames_(leftView,height,currentY,'',maxStats);}}
+ctx.lineWidth=1;},drawStatBarsRecursive_(snapshot,leftView,rightView,height,stats,maxStats,currentY){const ctx=this.context();for(const statName in maxStats){if(stats[statName]instanceof Object){currentY=this.drawStatBarsRecursive_(snapshot,leftView,rightView,height,stats[statName],maxStats[statName],currentY);}else{const maxStat=maxStats[statName];ctx.fillStyle=EventPresenter.getBarSnapshotColor(snapshot,Math.round(currentY/height));let barHeight;if(maxStat>0){barHeight=height*Math.max(stats[statName],0)/maxStat;}else{barHeight=0;}
+ctx.fillRect(leftView,currentY-barHeight,Math.max(rightView-leftView,1),barHeight);currentY+=height;}}
+return currentY;},drawStatNames_(leftView,height,currentY,prefix,maxStats){const ctx=this.context();ctx.textAlign='end';ctx.font='12px Arial';ctx.fillStyle='#000000';for(const statName in maxStats){if(maxStats[statName]instanceof Object){currentY=this.drawStatNames_(leftView,height,currentY,statName,maxStats[statName]);}else{let fullname=statName;if(prefix!==''){fullname=prefix+' :: '+statName;}
+ctx.fillText(fullname,leftView-10,currentY-height/4);currentY+=height;}}
+return currentY;}};tr.ui.tracks.ObjectInstanceTrack.register(SystemStatsInstanceTrack,{typeName:'base::TraceEventSystemStatsMonitor::SystemStats'});return{SystemStatsInstanceTrack,};});'use strict';tr.exportTo('tr.ui.e.system_stats',function(){const SystemStatsSnapshotView=tr.ui.b.define('tr-ui-e-system-stats-snapshot-view',tr.ui.analysis.ObjectSnapshotView);SystemStatsSnapshotView.prototype={__proto__:tr.ui.analysis.ObjectSnapshotView.prototype,decorate(){Polymer.dom(this).classList.add('tr-ui-e-system-stats-snapshot-view');},updateContents(){const snapshot=this.objectSnapshot_;if(!snapshot||!snapshot.getStats()){Polymer.dom(this).textContent='No system stats snapshot found.';return;}
+Polymer.dom(this).textContent='';const stats=snapshot.getStats();Polymer.dom(this).appendChild(this.buildList_(stats));},isFloat(n){return typeof n==='number'&&n%1!==0;},buildList_(stats){const statList=document.createElement('ul');for(const statName in stats){const statText=document.createElement('li');Polymer.dom(statText).textContent=''+statName+': ';Polymer.dom(statList).appendChild(statText);if(stats[statName]instanceof Object){Polymer.dom(statList).appendChild(this.buildList_(stats[statName]));}else{if(this.isFloat(stats[statName])){Polymer.dom(statText).textContent+=stats[statName].toFixed(2);}else{Polymer.dom(statText).textContent+=stats[statName];}}}
+return statList;}};tr.ui.analysis.ObjectSnapshotView.register(SystemStatsSnapshotView,{typeName:'base::TraceEventSystemStatsMonitor::SystemStats'});return{SystemStatsSnapshotView,};});'use strict';tr.exportTo('tr.ui.e.v8',function(){const IGNORED_ENTRIES={match:full=>full.startsWith('*CODE_AGE_')};const INSTANCE_TYPE_GROUPS={FIXED_ARRAY_TYPE:{match:full=>full.startsWith('*FIXED_ARRAY_'),realEntry:'FIXED_ARRAY_TYPE',keyToName:key=>key.slice('*FIXED_ARRAY_'.length).slice(0,-('_SUB_TYPE'.length)),nameToKey:name=>'*FIXED_ARRAY_'+name+'_SUB_TYPE'},CODE_TYPE:{match:full=>full.startsWith('*CODE_'),realEntry:'CODE_TYPE',keyToName:key=>key.slice('*CODE_'.length),nameToKey:name=>'*CODE_'+name},JS_OBJECTS:{match:full=>full.startsWith('JS_'),keyToName:key=>key,nameToKey:name=>name},Strings:{match:full=>full.endsWith('STRING_TYPE'),keyToName:key=>key,nameToKey:name=>name}};const DIFF_COLOR={GREEN:'#64DD17',RED:'#D50000'};function computePercentage(valueA,valueB){if(valueA===0)return 0;return valueA/valueB*100;}
+class DiffEntry{constructor(originalEntry,diffEntry){this.originalEntry_=originalEntry;this.diffEntry_=diffEntry;}
+get title(){return this.diffEntry_.title;}
+get overall(){return this.diffEntry_.overall;}
+get overAllocated(){return this.diffEntry_.overAllocated;}
+get count(){return this.diffEntry_.count;}
+get overallPercent(){return this.diffEntry_.overallPercent;}
+get overAllocatedPercent(){return this.diffEntry_.overAllocatedPercent;}
+get origin(){return this.originalEntry_;}
+get diff(){return this.diffEntry_;}
+get subRows(){return this.diffEntry_.subRows;}}
+class Entry{constructor(title,count,overall,overAllocated,histogram,overAllocatedHistogram){this.title_=title;this.overall_=overall;this.count_=count;this.overAllocated_=overAllocated;this.histogram_=histogram;this.overAllocatedHistogram_=overAllocatedHistogram;this.bucketSize_=this.histogram_.length;this.overallPercent_=100;this.overAllocatedPercent_=100;}
+get title(){return this.title_;}
+get overall(){return this.overall_;}
+get count(){return this.count_;}
+get overAllocated(){return this.overAllocated_;}
+get histogram(){return this.histogram_;}
+get overAllocatedHistogram(){return this.overAllocatedHistogram_;}
+get bucketSize(){return this.bucketSize_;}
+get overallPercent(){return this.overallPercent_;}
+set overallPercent(value){this.overallPercent_=value;}
+get overAllocatedPercent(){return this.overAllocatedPercent_;}
+set overAllocatedPercent(value){this.overAllocatedPercent_=value;}
+setFromObject(obj){this.count_=obj.count;this.overall_=obj.overall/1024;this.overAllocated_=obj.over_allocated/1024;this.histogram_=obj.histogram;this.overAllocatedHistogram_=obj.over_allocated_histogram;}
+diff(other){const entry=new Entry(this.title_,other.count_-this.count,other.overall_-this.overall,other.overAllocated_-this.overAllocated,[],[]);entry.overallPercent=computePercentage(entry.overall,this.overall);entry.overAllocatedPercent=computePercentage(entry.overAllocated,this.overAllocated);return new DiffEntry(this,entry);}}
+class GroupedEntry extends Entry{constructor(title,count,overall,overAllocated,histogram,overAllocatedHistogram){super(title,count,overall,overAllocated,histogram,overAllocatedHistogram);this.histogram_.fill(0);this.overAllocatedHistogram_.fill(0);this.entries_=new Map();}
+get title(){return this.title_;}
+set title(value){this.title_=value;}
+get subRows(){return Array.from(this.entries_.values());}
+getEntryFromTitle(title){return this.entries_.get(title);}
+add(entry){this.count_+=entry.count;this.overall_+=entry.overall;this.overAllocated_+=entry.overAllocated;if(this.bucketSize_===entry.bucketSize){for(let i=0;i<this.bucketSize_;++i){this.histogram_[i]+=entry.histogram[i];this.overAllocatedHistogram_[i]+=entry.overAllocatedHistogram[i];}}
+this.entries_.set(entry.title,entry);}
+accumulateUnknown(title){let unknownCount=this.count_;let unknownOverall=this.overall_;let unknownOverAllocated=this.overAllocated_;const unknownHistogram=tr.b.deepCopy(this.histogram_);const unknownOverAllocatedHistogram=tr.b.deepCopy(this.overAllocatedHistogram_);for(const entry of this.entries_.values()){unknownCount-=entry.count;unknownOverall-=entry.overall;unknownOverAllocated-=entry.overAllocated;for(let i=0;i<this.bucketSize_;++i){unknownHistogram[i]-=entry.histogram[i];unknownOverAllocatedHistogram[i]-=entry.overAllocatedHistogram[i];}}
+unknownOverAllocated=unknownOverAllocated<0?0:unknownOverAllocated;this.entries_.set(title,new Entry(title,unknownCount,unknownOverall,unknownOverAllocated,unknownHistogram,unknownOverAllocatedHistogram));}
+calculatePercentage(){for(const entry of this.entries_.values()){entry.overallPercent=computePercentage(entry.overall,this.overall_);entry.overAllocatedPercent=computePercentage(entry.overAllocated,this.overAllocated_);if(entry instanceof GroupedEntry)entry.calculatePercentage();}}
+diff(other){let newTitle='';if(this.title_.startsWith('Isolate')){newTitle='Total';}else{newTitle=this.title_;}
+const result=new GroupedEntry(newTitle,0,0,0,[],[]);for(const entry of this.entries_){const otherEntry=other.getEntryFromTitle(entry[0]);if(otherEntry===undefined)continue;result.add(entry[1].diff(otherEntry));}
+result.overallPercent=computePercentage(result.overall,this.overall);result.overAllocatedPercent=computePercentage(result.overAllocated,this.overAllocated);return new DiffEntry(this,result);}}
+function createSelector(targetEl,defaultValue,items,callback){const selectorEl=document.createElement('select');selectorEl.addEventListener('change',callback.bind(targetEl));const defaultOptionEl=document.createElement('option');for(let i=0;i<items.length;i++){const item=items[i];const optionEl=document.createElement('option');Polymer.dom(optionEl).textContent=item.label;optionEl.targetPropertyValue=item.value;optionEl.item=item;Polymer.dom(selectorEl).appendChild(optionEl);}
+selectorEl.__defineGetter__('selectedValue',function(v){if(selectorEl.children[selectorEl.selectedIndex]===undefined){return undefined;}
+return selectorEl.children[selectorEl.selectedIndex].targetPropertyValue;});selectorEl.__defineGetter__('selectedItem',function(v){if(selectorEl.children[selectorEl.selectedIndex]===undefined){return undefined;}
+return selectorEl.children[selectorEl.selectedIndex].item;});selectorEl.__defineSetter__('selectedValue',function(v){for(let i=0;i<selectorEl.children.length;i++){const value=selectorEl.children[i].targetPropertyValue;if(value===v){const changed=selectorEl.selectedIndex!==i;if(changed){selectorEl.selectedIndex=i;callback();}
+return;}}
+throw new Error('Not a valid value');});selectorEl.selectedIndex=-1;return selectorEl;}
+function plusMinus(value,toFixed=3){return(value>0?'+':'')+value.toFixed(toFixed);}
+function addArrow(value){if(value===0)return value;if(value===Number.NEGATIVE_INFINITY)return'\u2193\u221E';if(value===Number.POSITIVE_INFINITY)return'\u2191\u221E';return(value>0?'\u2191':'\u2193')+Math.abs(value.toFixed(3));}
+Polymer({is:'tr-ui-e-v8-gc-objects-stats-table',ready(){this.$.diffOption.style.display='none';this.isolateEntries_=[];this.selector1_=undefined;this.selector2_=undefined;},constructDiffTable_(table){this.$.diffTable.selectionMode=tr.ui.b.TableFormat.SelectionMode.ROW;this.$.diffTable.tableColumns=[{title:'Component',value(row){const typeEl=document.createElement('span');typeEl.innerText=row.title;return typeEl;},showExpandButtons:true},{title:'Overall Memory(KB)',value(row){const spanEl=tr.ui.b.createSpan();spanEl.innerText=row.origin.overall.toFixed(3);return spanEl;},cmp(a,b){return a.origin.overall-b.origin.overall;}},{title:'diff(KB)',value(row){const spanEl=tr.ui.b.createSpan();spanEl.innerText=plusMinus(row.overall);if(row.overall>0){spanEl.style.color=DIFF_COLOR.RED;}else if(row.overall<0){spanEl.style.color=DIFF_COLOR.GREEN;}
+return spanEl;},cmp(a,b){return a.overall-b.overall;}},{title:'diff(%)',value(row){const spanEl=tr.ui.b.createSpan();spanEl.innerText=addArrow(row.overallPercent);if(row.overall>0){spanEl.style.color=DIFF_COLOR.RED;}else if(row.overall<0){spanEl.style.color=DIFF_COLOR.GREEN;}
+return spanEl;},cmp(a,b){return a.overall-b.overall;}},{title:'Over Allocated Memory(KB)',value(row){const spanEl=tr.ui.b.createSpan();spanEl.innerText=row.origin.overAllocated.toFixed(3);return spanEl;},cmp(a,b){return a.origin.overAllocated-b.origin.overAllocated;}},{title:'diff(KB)',value(row){const spanEl=tr.ui.b.createSpan();spanEl.innerText=plusMinus(row.overAllocated);if(row.overAllocated>0){spanEl.style.color=DIFF_COLOR.RED;}else if(row.overAllocated<0){spanEl.style.color=DIFF_COLOR.GREEN;}
+return spanEl;},cmp(a,b){return a.overAllocated-b.overAllocated;}},{title:'diff(%)',value(row){const spanEl=tr.ui.b.createSpan();spanEl.innerText=addArrow(row.overAllocatedPercent);if(row.overAllocated>0){spanEl.style.color=DIFF_COLOR.RED;}else if(row.overAllocated<0){spanEl.style.color=DIFF_COLOR.GREEN;}
+return spanEl;},cmp(a,b){return a.overAllocated-b.overAllocated;}},{title:'Count',value(row){const spanEl=tr.ui.b.createSpan();spanEl.innerText=row.origin.count;return spanEl;},cmp(a,b){return a.origin.count-b.origin.count;}},{title:'diff',value(row){const spanEl=tr.ui.b.createSpan();spanEl.innerText=plusMinus(row.count,0);if(row.count>0){spanEl.style.color=DIFF_COLOR.RED;}else if(row.count<0){spanEl.style.color=DIFF_COLOR.GREEN;}
+return spanEl;},cmp(a,b){return a.count-b.count;}},];},buildOptions_(){const items=[];for(const isolateEntry of this.isolateEntries_){items.push({label:isolateEntry.title,value:isolateEntry});}
+this.$.diffOption.style.display='inline-block';this.selector1_=createSelector(this,'',items,this.diffOptionChanged_);Polymer.dom(this.$.diffOption).appendChild(this.selector1_);const spanEl=tr.ui.b.createSpan();spanEl.innerText=' VS ';Polymer.dom(this.$.diffOption).appendChild(spanEl);this.selector2_=createSelector(this,'',items,this.diffOptionChanged_);Polymer.dom(this.$.diffOption).appendChild(this.selector2_);},diffOptionChanged_(){const isolateEntry1=this.selector1_.selectedValue;const isolateEntry2=this.selector2_.selectedValue;if(isolateEntry1===undefined||isolateEntry2===undefined){return;}
+if(isolateEntry1===isolateEntry2){this.$.diffTable.tableRows=[];this.$.diffTable.rebuild();return;}
+this.$.diffTable.tableRows=[isolateEntry1.diff(isolateEntry2)];this.$.diffTable.rebuild();},constructTable_(){this.$.table.selectionMode=tr.ui.b.TableFormat.SelectionMode.ROW;this.$.table.tableColumns=[{title:'Component',value(row){const typeEl=document.createElement('span');typeEl.innerText=row.title;return typeEl;},showExpandButtons:true},{title:'Overall Memory (KB)',value(row){const typeEl=document.createElement('span');typeEl.innerText=row.overall.toFixed(3);return typeEl;},cmp(a,b){return a.overall-b.overall;}},{title:'Over Allocated Memory (KB)',value(row){const typeEl=document.createElement('span');typeEl.innerText=row.overAllocated.toFixed(3);return typeEl;},cmp(a,b){return a.overAllocated-b.overAllocated;}},{title:'Overall Count',value(row){const typeEl=document.createElement('span');typeEl.innerText=row.count;return typeEl;},cmp(a,b){return a.count-b.count;}},{title:'Overall Memory Percent',value(row){const typeEl=document.createElement('span');typeEl.innerText=row.overallPercent.toFixed(3)+'%';return typeEl;},cmp(a,b){return a.overall-b.overall;}},{title:'Overall Allocated Memory Percent',value(row){const typeEl=document.createElement('span');typeEl.innerText=row.overAllocatedPercent.toFixed(3)+'%';return typeEl;},cmp(a,b){return a.overAllocated-b.overAllocated;}}];this.$.table.sortColumnIndex=1;this.$.table.sortDescending=true;},buildSubEntry_(objects,groupEntry,keyToName){const typeGroup=INSTANCE_TYPE_GROUPS[groupEntry.title];for(const instanceType of typeGroup){const e=objects[instanceType];if(e===undefined)continue;delete objects[instanceType];let title=instanceType;if(keyToName!==undefined)title=keyToName(title);groupEntry.add(new Entry(title,e.count,e.overall/1024,e.over_allocated/1024,e.histogram,e.over_allocated_histogram));}},buildUnGroupedEntries_(objects,objectEntry,bucketSize){for(const title of Object.getOwnPropertyNames(objects)){const obj=objects[title];const groupedEntry=new GroupedEntry(title,0,0,0,new Array(bucketSize),new Array(bucketSize));groupedEntry.setFromObject(obj);objectEntry.add(groupedEntry);}},createGroupEntries_(groupEntries,objects,bucketSize){for(const groupName of Object.getOwnPropertyNames(INSTANCE_TYPE_GROUPS)){const groupEntry=new GroupedEntry(groupName,0,0,0,new Array(bucketSize),new Array(bucketSize));if(INSTANCE_TYPE_GROUPS[groupName].realEntry!==undefined){groupEntry.savedRealEntry=objects[INSTANCE_TYPE_GROUPS[groupName].realEntry];delete objects[INSTANCE_TYPE_GROUPS[groupName].realEntry];}
+groupEntries[groupName]=groupEntry;}},buildGroupEntries_(groupEntries,objectEntry){for(const groupName of Object.getOwnPropertyNames(groupEntries)){const groupEntry=groupEntries[groupName];if(groupEntry.savedRealEntry!==undefined){groupEntry.setFromObject(groupEntry.savedRealEntry);groupEntry.accumulateUnknown('UNKNOWN');delete groupEntry.savedRealEntry;}
+objectEntry.add(groupEntry);}},buildSubEntriesForGroups_(groupEntries,objects){for(const instanceType of Object.getOwnPropertyNames(objects)){if(IGNORED_ENTRIES.match(instanceType)){delete objects[instanceType];continue;}
+const e=objects[instanceType];for(const name of Object.getOwnPropertyNames(INSTANCE_TYPE_GROUPS)){const group=INSTANCE_TYPE_GROUPS[name];if(group.match(instanceType)){groupEntries[name].add(new Entry(group.keyToName(instanceType),e.count,e.overall/1024,e.over_allocated/1024,e.histogram,e.over_allocated_histogram));delete objects[instanceType];}}}},build_(objects,objectEntry,bucketSize){delete objects.END;const groupEntries={};this.createGroupEntries_(groupEntries,objects,bucketSize);this.buildSubEntriesForGroups_(groupEntries,objects);this.buildGroupEntries_(groupEntries,objectEntry);this.buildUnGroupedEntries_(objects,objectEntry,bucketSize);},set selection(slices){slices.sortEvents(function(a,b){return b.start-a.start;});const previous=undefined;for(const slice of slices){if(!slice instanceof tr.e.v8.V8GCStatsThreadSlice)continue;const liveObjects=slice.liveObjects;const deadObjects=slice.deadObjects;const isolate=liveObjects.isolate;const isolateEntry=new GroupedEntry('Isolate_'+isolate+' at '+slice.start.toFixed(3)+' ms',0,0,0,[],[]);const liveEntry=new GroupedEntry('live objects',0,0,0,[],[]);const deadEntry=new GroupedEntry('dead objects',0,0,0,[],[]);const liveBucketSize=liveObjects.bucket_sizes.length;const deadBucketSize=deadObjects.bucket_sizes.length;this.build_(tr.b.deepCopy(liveObjects.type_data),liveEntry,liveBucketSize);isolateEntry.add(liveEntry);this.build_(tr.b.deepCopy(deadObjects.type_data),deadEntry,deadBucketSize);isolateEntry.add(deadEntry);isolateEntry.calculatePercentage();this.isolateEntries_.push(isolateEntry);}
+this.updateTable_();if(slices.length>1){this.buildOptions_();this.constructDiffTable_();}},updateTable_(){this.constructTable_();this.$.table.tableRows=this.isolateEntries_;this.$.table.rebuild();},});return{};});'use strict';Polymer({is:'tr-ui-e-multi-v8-gc-stats-thread-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],get selection(){return this.$.content.selection;},set selection(selection){this.$.gcObjectsStats.selection=selection;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-e-multi-v8-gc-stats-thread-slice-sub-view',tr.e.v8.V8GCStatsThreadSlice,{multi:true,title:'V8 GC Stats slices'});'use strict';tr.exportTo('tr.e.v8',function(){const IC_STATS_PROPERTIES=['type','category','scriptName','filePosition','state','isNative','map','propertiesMode','numberOfOwnProperties','instanceType'];class ICStatsEntry{constructor(obj){this.type_=obj.type;if(this.type_.includes('Store')){this.category_='Store';}else if(this.type_.includes('Load')){this.category_='Load';}
+this.state_=obj.state;if(obj.functionName){this.functionName_=obj.optimized?'*':'~';this.functionName_+=obj.functionName.length===0?'(anonymous function)':obj.functionName;}
+this.offset_=obj.offset;this.scriptName_=obj.scriptName?obj.scriptName:'unknown';this.isNative_=obj.scriptName&&obj.scriptName.includes('native');this.lineNum_=obj.lineNum?obj.lineNum:'unknown';this.filePosition_=this.scriptName_+':'+this.lineNum_;if(this.functionName_){this.filePosition_+=' '+this.functionName_+'+'+this.offset_;}
+this.constructor_=obj.constructor?false:true;this.map_=obj.map;if(this.map_){this.propertiesMode_=obj.dict===0?'slow':'fast';}else{this.propertiesMode_='unknown';}
+this.numberOfOwnProperties_=obj.own;this.instanceType_=obj.instanceType;this.key_=obj.key;}
+get type(){return this.type_;}
+get category(){return this.category_;}
+get state(){return this.state_;}
+get functionName(){return this.functionName_;}
+get offset(){return this.offset_;}
+get scriptName(){return this.scriptName_;}
+get isNative(){return this.isNative_;}
+get lineNumber(){return this.lineNum_;}
+get isConstructor(){return this.constructor_;}
+get map(){return this.map_;}
+get propertiesMode(){return this.propertiesMode_;}
+get numberOfOwnProperties(){return this.numberOfOwnProperties_;}
+get instanceType(){return this.instanceType_;}
+get filePosition(){return this.filePosition_;}}
+class ICStatsEntryGroup{constructor(property,key){this.property_=property;this.key_=key;this.percentage_=0;this.entries_=[];this.subGroup_=undefined;}
+static groupBy(groups,entries,property){for(const entry of entries){const key=entry[property];let group=groups.get(key);if(!group){group=new ICStatsEntryGroup(property,key);groups.set(key,group);}
+group.add(entry);}
+for(const group of groups.values()){group.percentage=group.length/entries.length;}}
+add(entry){this.entries_.push(entry);}
+createSubGroup(){if(this.subGroup_)return this.subGroup_;this.subGroup_=new Map();for(const property of IC_STATS_PROPERTIES){if(property===this.property_)continue;const groups=new Map();this.subGroup_.set(property,groups);ICStatsEntryGroup.groupBy(groups,this.entries_,property);}
+return this.subGroup_;}
+get entries(){return this.entries_;}
+get key(){return this.key_;}
+get length(){return this.entries_.length;}
+get percentage(){return this.percentage_;}
+set percentage(value){this.percentage_=value;}}
+class ICStatsCollection{constructor(){this.entries_=[];this.groupedEntries_=new Map();}
+add(entry){this.entries_.push(entry);}
+groupBy(property){if(this.groupedEntries_.has(property)){return Array.from(this.groupedEntries_.get(property).values());}
+const groups=new Map();this.groupedEntries_.set(property,groups);ICStatsEntryGroup.groupBy(groups,this.entries_,property);return Array.from(groups.values());}
+get entries(){return this.entries_;}
+get length(){return this.entries_.length;}}
+return{IC_STATS_PROPERTIES,ICStatsEntry,ICStatsEntryGroup,ICStatsCollection,};});'use strict';tr.exportTo('tr.ui.e.v8',function(){const PROPERTIES=tr.e.v8.IC_STATS_PROPERTIES.map(x=>{return{label:x,value:x};});const ICStatsEntry=tr.e.v8.ICStatsEntry;const ICStatsEntryGroup=tr.e.v8.ICStatsEntryGroup;const ICStatsCollection=tr.e.v8.ICStatsCollection;Polymer({is:'tr-ui-e-v8-ic-stats-table',ready(){this.icStatsCollection_=new ICStatsCollection();this.groupKey_=PROPERTIES[0].value;this.selector_=tr.ui.b.createSelector(this,'groupKey','v8ICStatsGroupKey',this.groupKey_,PROPERTIES);Polymer.dom(this.$.groupOption).appendChild(this.selector_);},get groupKey(){return this.groupKey_;},set groupKey(key){this.groupKey_=key;if(this.icStatsCollection_.length===0)return;this.updateTable_(this.groupKey_);},constructTable_(table,groupKey){table.tableColumns=[{title:'',value:row=>{let expanded=false;const buttonEl=tr.ui.b.createButton('details',function(){const previousSibling=Polymer.dom(this).parentNode.parentNode;const parentNode=previousSibling.parentNode;if(expanded){const trEls=parentNode.getElementsByClassName('subTable');Array.from(trEls).map(x=>x.parentNode.removeChild(x));expanded=false;return;}
+expanded=true;const subGroups=row.createSubGroup();const tr=document.createElement('tr');tr.classList.add('subTable');tr.appendChild(document.createElement('td'));const td=document.createElement('td');td.colSpan=3;for(const subGroup of subGroups){const property=subGroup[0];const all=Array.from(subGroup[1].values());const group=all.slice(0,20);const divEl=document.createElement('div');const spanEl=document.createElement('span');const subTableEl=document.createElement('tr-ui-b-table');spanEl.innerText=`Top 20 out of ${all.length}`;spanEl.style.fontWeight='bold';spanEl.style.fontSize='14px';divEl.appendChild(spanEl);this.constructTable_(subTableEl,property);subTableEl.tableRows=group;subTableEl.rebuild();divEl.appendChild(subTableEl);td.appendChild(divEl);}
+tr.appendChild(td);parentNode.insertBefore(tr,previousSibling.nextSibling);});return buttonEl;}},{title:'Percentage',value(row){const spanEl=document.createElement('span');spanEl.innerText=(row.percentage*100).toFixed(3)+'%';return spanEl;},cmp:(a,b)=>a.percentage-b.percentage},{title:'Count',value(row){const spanEl=document.createElement('span');spanEl.innerText=row.length;return spanEl;},cmp:(a,b)=>a.length-b.length},{title:groupKey,value(row){const spanEl=document.createElement('span');spanEl.innerText=row.key?row.key:'';return spanEl;}}];table.sortColumnIndex=1;table.sortDescending=true;},updateTable_(groupKey){this.constructTable_(this.$.table,groupKey);this.$.table.tableRows=this.icStatsCollection_.groupBy(groupKey);this.$.table.rebuild();},set selection(slices){for(const slice of slices){for(const icStatsObj of slice.icStats){const entry=new ICStatsEntry(icStatsObj);this.icStatsCollection_.add(entry);}}
+this.$.total.innerText='Total items: '+this.icStatsCollection_.length;this.updateTable_(this.selector_.selectedValue);}});return{};});'use strict';Polymer({is:'tr-ui-e-multi-v8-ic-stats-thread-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],get selection(){return this.$.content.selection;},set selection(selection){this.$.table.selection=selection;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-e-multi-v8-ic-stats-thread-slice-sub-view',tr.e.v8.V8ICStatsThreadSlice,{multi:true,title:'V8 IC stats slices'});'use strict';tr.exportTo('tr.e.v8',function(){class RuntimeStatsEntry{constructor(name,count,time){this.name_=name;this.count_=count;this.time_=time;}
+get name(){return this.name_;}
+get count(){return this.count_;}
+get time(){return this.time_;}
+addSample(count,time){this.count_+=count;this.time_+=time;}}
+class RuntimeStatsGroup extends RuntimeStatsEntry{constructor(name,matchRegex){super(name,0,0);this.regex_=matchRegex;this.entries_=new Map();}
+match(name){return this.regex_&&name.match(this.regex_);}
+add(entry){const value=this.entries_.get(entry.name);if(value!==undefined){value.addSample(entry.count,entry.time);}else{this.entries_.set(entry.name,entry);}
+this.count_+=entry.count;this.time_+=entry.time;}
+get values(){return Array.from(this.entries_.values());}}
+class RuntimeStatsGroupCollection{constructor(){this.groups_=[new RuntimeStatsGroup('Total'),new RuntimeStatsGroup('IC',/.*IC_.*/),new RuntimeStatsGroup('Optimize',/StackGuard|.*Optimize.*|.*Deoptimize.*|Recompile.*/),new RuntimeStatsGroup('Compile-Background',/(.*CompileBackground.*)/),new RuntimeStatsGroup('Compile',/(^Compile.*)|(.*_Compile.*)/),new RuntimeStatsGroup('Parse-Background',/.*ParseBackground.*/),new RuntimeStatsGroup('Parse',/.*Parse.*/),new RuntimeStatsGroup('Blink C++',/.*Callback.*/),new RuntimeStatsGroup('API',/.*API.*/),new RuntimeStatsGroup('GC',/GC|AllocateInTargetSpace/),new RuntimeStatsGroup('JavaScript',/JS_Execution/),new RuntimeStatsGroup('V8 C++',/.*/)];}
+addSlices(slices){for(const slice of slices){if(!(slice instanceof tr.e.v8.V8ThreadSlice))return;let runtimeCallStats;try{runtimeCallStats=JSON.parse(slice.runtimeCallStats);}catch(e){runtimeCallStats=slice.runtimeCallStats;}
+if(runtimeCallStats===undefined)continue;for(const[name,stat]of Object.entries(runtimeCallStats)){for(let i=1;i<this.groups_.length;++i){if(this.groups_[i].match(name)){if(stat.length!==2)break;const entry=new RuntimeStatsEntry(name,stat[0],stat[1]);this.groups_[0].addSample(stat[0],stat[1]);this.groups_[i].add(entry);break;}}}}}
+get totalTime(){return this.groups_[0].time;}
+get totalCount(){return this.groups_[0].count;}
+get runtimeGroups(){return this.groups_;}}
+return{RuntimeStatsEntry,RuntimeStatsGroup,RuntimeStatsGroupCollection,};});'use strict';tr.exportTo('tr.ui.e.v8',function(){function handleCodeSearch_(event){if(event.target.parentNode===undefined)return;let name=event.target.parentNode.entryName;let url='https://cs.chromium.org/search/?sq=package:chromium&type=cs&q=';if(name.startsWith('API_'))name=name.substring(4);url+=encodeURIComponent(name)+'+file:src/v8/src';window.open(url,'_blank');}
+Polymer({is:'tr-ui-e-v8-runtime-call-stats-table',ready(){this.table_=this.$.table;this.totalTime_=0;},constructTable_(totalTime){this.table_.selectionMode=tr.ui.b.TableFormat.SelectionMode.ROW;this.table_.tableColumns=[{title:'Name',value(row){const typeEl=document.createElement('span');typeEl.innerText=row.name;if(!(row instanceof tr.e.v8.RuntimeStatsGroup)){typeEl.title='click ? for code search';typeEl.entryName=row.name;const codeSearchEl=document.createElement('span');codeSearchEl.innerText='?';codeSearchEl.style.float='right';codeSearchEl.style.borderRadius='5px';codeSearchEl.style.backgroundColor='#EEE';codeSearchEl.addEventListener('click',handleCodeSearch_.bind(this));typeEl.appendChild(codeSearchEl);}
+return typeEl;},width:'200px',showExpandButtons:true},{title:'Time',value(row){const typeEl=document.createElement('span');typeEl.innerText=(row.time/1000.0).toFixed(3)+' ms';return typeEl;},width:'100px',cmp(a,b){return a.time-b.time;}},{title:'Count',value(row){const typeEl=document.createElement('span');typeEl.innerText=row.count;return typeEl;},width:'100px',cmp(a,b){return a.count-b.count;}},{title:'Percent',value(row){const typeEl=document.createElement('span');typeEl.innerText=(row.time/totalTime*100).toFixed(3)+'%';return typeEl;},width:'100px',cmp(a,b){return a.time-b.time;}}];this.table_.sortColumnIndex=1;this.table_.sortDescending=true;this.table_.subRowsPropertyName='values';},set slices(slices){const runtimeGroupCollection=new tr.e.v8.RuntimeStatsGroupCollection();runtimeGroupCollection.addSlices(slices);if(runtimeGroupCollection.totalTime>0){this.constructTable_(runtimeGroupCollection.totalTime);this.table_.tableRows=runtimeGroupCollection.runtimeGroups;this.table_.rebuild();}}});return{};});'use strict';Polymer({is:'tr-ui-e-multi-v8-thread-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],get selection(){return this.$.content.selection;},set selection(selection){this.$.runtimeCallStats.slices=selection;this.$.content.selection=selection;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-e-multi-v8-thread-slice-sub-view',tr.e.v8.V8ThreadSlice,{multi:true,title:'V8 slices'});'use strict';Polymer({is:'tr-ui-e-single-v8-gc-stats-thread-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],get selection(){return this.$.content.selection;},set selection(selection){this.$.content.selection=selection;this.$.gcObjectsStats.selection=selection;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-e-single-v8-gc-stats-thread-slice-sub-view',tr.e.v8.V8GCStatsThreadSlice,{multi:false,title:'V8 GC stats slice'});'use strict';Polymer({is:'tr-ui-e-single-v8-ic-stats-thread-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],get selection(){return this.$.content.selection;},set selection(selection){this.$.table.selection=selection;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-e-single-v8-ic-stats-thread-slice-sub-view',tr.e.v8.V8ICStatsThreadSlice,{multi:false,title:'V8 IC stats slice'});'use strict';Polymer({is:'tr-ui-e-single-v8-thread-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],get selection(){return this.$.content.selection;},set selection(selection){this.$.runtimeCallStats.slices=selection;this.$.content.selection=selection;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-e-single-v8-thread-slice-sub-view',tr.e.v8.V8ThreadSlice,{multi:false,title:'V8 slice'});'use strict';tr.exportTo('tr.c',function(){function ScriptingObject(){}
+ScriptingObject.prototype={onModelChanged(model){}};return{ScriptingObject,};});'use strict';tr.exportTo('tr.c',function(){function ScriptingController(brushingStateController){this.brushingStateController_=brushingStateController;this.scriptObjectNames_=[];this.scriptObjectValues_=[];this.brushingStateController.addEventListener('model-changed',this.onModelChanged_.bind(this));const typeInfos=ScriptingObjectRegistry.getAllRegisteredTypeInfos();typeInfos.forEach(function(typeInfo){this.addScriptObject(typeInfo.metadata.name,typeInfo.constructor);global[typeInfo.metadata.name]=typeInfo.constructor;},this);}
+function ScriptingObjectRegistry(){}
+const options=new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE);tr.b.decorateExtensionRegistry(ScriptingObjectRegistry,options);ScriptingController.prototype={get brushingStateController(){return this.brushingStateController_;},onModelChanged_(){this.scriptObjectValues_.forEach(function(v){if(v.onModelChanged){v.onModelChanged(this.brushingStateController.model);}},this);},addScriptObject(name,value){this.scriptObjectNames_.push(name);this.scriptObjectValues_.push(value);},executeCommand(command){const f=new Function(this.scriptObjectNames_,'return eval('+command+')');return f.apply(null,this.scriptObjectValues_);}};return{ScriptingController,ScriptingObjectRegistry,};});'use strict';tr.exportTo('tr.metrics',function(){function MetricRegistry(){}
+const options=new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE);options.defaultMetadata={};tr.b.decorateExtensionRegistry(MetricRegistry,options);function camelCaseToHackerString(camelCase){let hackerString='';for(const c of camelCase){const lowered=c.toLocaleLowerCase();if(lowered===c){hackerString+=c;}else{hackerString+='_'+lowered;}}
+return hackerString;}
+function getCallStack(){try{throw new Error();}catch(error){return error.stack;}}
+function getPathsFromStack(stack){return stack.split('\n').map(line=>{line=line.replace(/^ */,'').split(':');if(line.length<4)return'';return line[line.length-3].split('/');}).filter(tr.b.identity);}
+MetricRegistry.checkFilename=function(metricName,opt_metricPathForTest){if(metricName==='runtimeStatsTotalMetric'||metricName==='v8AndMemoryMetrics'){return;}
+const expectedFilename=camelCaseToHackerString(metricName)+'.html';const stack=getCallStack();let metricPath=opt_metricPathForTest;if(metricPath===undefined){const paths=getPathsFromStack(stack);const METRIC_STACK_INDEX=5;if(paths.length<=METRIC_STACK_INDEX||paths[METRIC_STACK_INDEX].join('/')===paths[0].join('/')){return;}
+metricPath=paths[METRIC_STACK_INDEX].slice(paths[METRIC_STACK_INDEX].length-2);}
+if(!metricPath[1].endsWith('_test.html')&&metricPath[1]!==expectedFilename&&metricPath.join('_')!==expectedFilename){throw new Error('Expected '+metricName+' to be in a file named '+
+expectedFilename+'; actual: '+metricPath.join('/')+'; stack: '+stack.replace(/\n/g,'\n '));}};MetricRegistry.addEventListener('will-register',function(e){const metric=e.typeInfo.constructor;if(!(metric instanceof Function)){throw new Error('Metrics must be functions.');}
+if(!metric.name.endsWith('Metric')&&!metric.name.endsWith('Metrics')){throw new Error('Metric names must end with "Metric" or "Metrics".');}
+if(metric.length<2){throw new Error('Metrics take a HistogramSet and a Model and '+'optionally an options dictionary.');}
+MetricRegistry.checkFilename(metric.name);});return{MetricRegistry,};});'use strict';tr.exportTo('tr.metrics.sh',function(){const MAX_INPUT_EVENT_TO_STARTUP_DELAY_IN_MS=2000;const MIN_DRAW_DELAY_IN_MS=80;const MAX_DRAW_DELAY_IN_MS=2000;function findProcess(processName,model){for(const pid in model.processes){const process=model.processes[pid];if(process.name===processName){return process;}}
+return undefined;}
+function findThreads(process,threadPrefix){if(process===undefined)return undefined;const threads=[];for(const tid in process.threads){const thread=process.threads[tid];if(thread.name.startsWith(threadPrefix)){threads.push(thread);}}
+return threads;}
+function findUIThread(process){if(process===undefined)return undefined;const threads=findThreads(process,'UI Thread');if(threads!==undefined&&threads.length===1){return threads[0];}
+return process.threads[process.pid];}
+function findLaunchSlices(model){const launches=[];const binders=findThreads(findProcess('system_server',model),'Binder');for(const binderId in binders){const binder=binders[binderId];for(const sliceId in binder.asyncSliceGroup.slices){const slice=binder.asyncSliceGroup.slices[sliceId];if(slice.title.startsWith('launching:')){launches.push(slice);}}}
+return launches;}
+function findDrawSlice(appName,startNotBefore,model){let drawSlice=undefined;const thread=findUIThread(findProcess(appName,model));if(thread===undefined)return undefined;for(const sliceId in thread.sliceGroup.slices){const slice=thread.sliceGroup.slices[sliceId];if(slice.start<startNotBefore+MIN_DRAW_DELAY_IN_MS||slice.start>startNotBefore+MAX_DRAW_DELAY_IN_MS)continue;if(slice.title!=='draw')continue;if(drawSlice===undefined||slice.start<drawSlice.start){drawSlice=slice;}}
+return drawSlice;}
+function findInputEventSlice(endNotAfter,model){const endNotBefore=endNotAfter-MAX_INPUT_EVENT_TO_STARTUP_DELAY_IN_MS;let inputSlice=undefined;const systemUi=findUIThread(findProcess('com.android.systemui',model));if(systemUi===undefined)return undefined;for(const sliceId in systemUi.asyncSliceGroup.slices){const slice=systemUi.asyncSliceGroup.slices[sliceId];if(slice.end>endNotAfter||slice.end<endNotBefore)continue;if(slice.title!=='deliverInputEvent')continue;if(inputSlice===undefined||slice.end>inputSlice.end){inputSlice=slice;}}
+return inputSlice;}
+function computeStartupTimeInMs(appName,launchSlice,model){let startupStart=launchSlice.start;let startupEnd=launchSlice.end;const drawSlice=findDrawSlice(appName,launchSlice.end,model);if(drawSlice!==undefined){startupEnd=drawSlice.end;}
+const inputSlice=findInputEventSlice(launchSlice.start,model);if(inputSlice!==undefined){startupStart=inputSlice.start;}
+return startupEnd-startupStart;}
+function measureStartup(histograms,model){const launches=findLaunchSlices(model);for(const sliceId in launches){const launchSlice=launches[sliceId];const appName=launchSlice.title.split(': ')[1];const startupMs=computeStartupTimeInMs(appName,launchSlice,model);histograms.createHistogram(`android:systrace:startup:${appName}`,tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,startupMs);}}
+function measureThreadStates(histograms,model,rangeOfInterest){for(const pid in model.processes){const process=model.processes[pid];if(process.name===undefined)continue;let hasSlices=false;let timeRunning=0;let timeRunnable=0;let timeSleeping=0;let timeUninterruptible=0;let timeBlockIO=0;let timeUnknown=0;for(const tid in process.threads){const thread=process.threads[tid];if(thread.timeSlices===undefined)continue;for(const sliceId in thread.timeSlices){const slice=thread.timeSlices[sliceId];const sliceRange=tr.b.math.Range.fromExplicitRange(slice.start,slice.end);const intersection=rangeOfInterest.findIntersection(sliceRange);const duration=intersection.duration;if(duration===0)continue;hasSlices=true;if(slice.title==='Running'){timeRunning+=duration;}else if(slice.title==='Runnable'){timeRunnable+=duration;}else if(slice.title==='Sleeping'){timeSleeping+=duration;}else if(slice.title.startsWith('Uninterruptible')){timeUninterruptible+=duration;if(slice.title.includes('Block I/O'))timeBlockIO+=duration;}else{timeUnknown+=duration;}}}
+if(hasSlices){const wall=rangeOfInterest.max-rangeOfInterest.min;histograms.createHistogram(`android:systrace:threadtime:${process.name}:running`,tr.b.Unit.byName.normalizedPercentage,timeRunning/wall);histograms.createHistogram(`android:systrace:threadtime:${process.name}:runnable`,tr.b.Unit.byName.normalizedPercentage,timeRunnable/wall);histograms.createHistogram(`android:systrace:threadtime:${process.name}:sleeping`,tr.b.Unit.byName.normalizedPercentage,timeSleeping/wall);histograms.createHistogram(`android:systrace:threadtime:${process.name}:blockio`,tr.b.Unit.byName.normalizedPercentage,timeBlockIO/wall);histograms.createHistogram(`android:systrace:threadtime:${process.name}:uninterruptible`,tr.b.Unit.byName.normalizedPercentage,timeUninterruptible/wall);if(timeUnknown>0){histograms.createHistogram(`android:systrace:threadtime:${process.name}:unknown`,tr.b.Unit.byName.normalizedPercentage,timeUnknown/wall);}}}}
+function androidSystraceMetric(histograms,model,options){let rangeOfInterest=model.bounds;if(options!==undefined&&options.rangeOfInterest!==undefined){rangeOfInterest=options.rangeOfInterest;}
+measureStartup(histograms,model);measureThreadStates(histograms,model,rangeOfInterest);}
+tr.metrics.MetricRegistry.register(androidSystraceMetric,{supportsRangeOfInterest:true});return{androidSystraceMetric,};});'use strict';tr.exportTo('tr.b.math',function(){const PERCENTILE_PRECISION=1e-7;function PiecewiseLinearFunction(){this.pieces=[];}
+PiecewiseLinearFunction.prototype={push(x1,y1,x2,y2){if(x1>=x2){throw new Error('Invalid segment');}
+if(this.pieces.length>0&&this.pieces[this.pieces.length-1].x2>x1){throw new Error('Potentially overlapping segments');}
+if(x1<x2){this.pieces.push(new Piece(x1,y1,x2,y2));}},partBelow(y){return this.pieces.reduce((acc,p)=>(acc+p.partBelow(y)),0);},get min(){return this.pieces.reduce((acc,p)=>Math.min(acc,p.min),Infinity);},get max(){return this.pieces.reduce((acc,p)=>Math.max(acc,p.max),-Infinity);},get average(){let weightedSum=0;let totalWeight=0;this.pieces.forEach(function(piece){weightedSum+=piece.width*piece.average;totalWeight+=piece.width;});if(totalWeight===0)return 0;return weightedSum/totalWeight;},percentile(percent){if(!(percent>=0&&percent<=1)){throw new Error('percent must be [0,1]');}
+let lower=this.min;let upper=this.max;const total=this.partBelow(upper);if(total===0)return 0;while(upper-lower>PERCENTILE_PRECISION){const middle=(lower+upper)/2;const below=this.partBelow(middle);if(below/total<percent){lower=middle;}else{upper=middle;}}
+return(lower+upper)/2;}};function Piece(x1,y1,x2,y2){this.x1=x1;this.y1=y1;this.x2=x2;this.y2=y2;}
+Piece.prototype={partBelow(y){const width=this.width;if(width===0)return 0;const minY=this.min;const maxY=this.max;if(y>=maxY)return width;if(y<minY)return 0;return(y-minY)/(maxY-minY)*width;},get min(){return Math.min(this.y1,this.y2);},get max(){return Math.max(this.y1,this.y2);},get average(){return(this.y1+this.y2)/2;},get width(){return this.x2-this.x1;}};return{PiecewiseLinearFunction,};});'use strict';tr.exportTo('tr.metrics.v8.utils',function(){const IDLE_TASK_EVENT='SingleThreadIdleTaskRunner::RunTask';const V8_EXECUTE='V8.Execute';const GC_EVENT_PREFIX='V8.GC';const FULL_GC_EVENT='V8.GCCompactor';const LOW_MEMORY_EVENT='V8.GCLowMemoryNotification';const MAJOR_GC_EVENT='MajorGC';const MINOR_GC_EVENT='MinorGC';const TOP_GC_EVENTS={'V8.GCCompactor':'v8-gc-full-mark-compactor','V8.GCFinalizeMC':'v8-gc-latency-mark-compactor','V8.GCFinalizeMCReduceMemory':'v8-gc-memory-mark-compactor','V8.GCIncrementalMarking':'v8-gc-incremental-step','V8.GCIncrementalMarkingFinalize':'v8-gc-incremental-finalize','V8.GCIncrementalMarkingStart':'v8-gc-incremental-start','V8.GCPhantomHandleProcessingCallback':'v8-gc-phantom-handle-callback','V8.GCScavenger':'v8-gc-scavenger'};const LOW_MEMORY_MARK_COMPACTOR='v8-gc-low-memory-mark-compactor';function findParent(event,predicate){let parent=event.parentSlice;while(parent){if(predicate(parent)){return parent;}
+parent=parent.parentSlice;}
+return null;}
+function isIdleTask(event){return event.title===IDLE_TASK_EVENT;}
+function isLowMemoryEvent(event){return event.title===LOW_MEMORY_EVENT;}
+function isV8Event(event){return event.title.startsWith('V8.');}
+function isV8ExecuteEvent(event){return event.title===V8_EXECUTE;}
+function isTopV8ExecuteEvent(event){return isV8ExecuteEvent(event)&&findParent(isV8ExecuteEvent)===null;}
+function isGarbageCollectionEvent(event){return event.title&&event.title.startsWith(GC_EVENT_PREFIX)&&event.title!==LOW_MEMORY_EVENT;}
+function isTopGarbageCollectionEvent(event){return event.title in TOP_GC_EVENTS;}
+function isForcedGarbageCollectionEvent(event){return findParent(event,isLowMemoryEvent)!==null;}
+function isSubGarbageCollectionEvent(event){return isGarbageCollectionEvent(event)&&event.parentSlice&&(isTopGarbageCollectionEvent(event.parentSlice)||event.parentSlice.title===MAJOR_GC_EVENT||event.parentSlice.title===MINOR_GC_EVENT);}
+function isCompileOptimizeEvent(event){return(event.title==='V8.OptimizeCode'||event.title==='V8.RecompileSynchronous'||event.title==='V8.RecompileConcurrent');}
+function isCompileUnoptimizeEvent(event){return(event.title==='V8.CompileIgnition'||event.title==='V8.CompileUnoptimizedInnerFunctions'||event.title==='V8.Compile'||event.title==='V8.CompileEval'||event.title==='V8.CompileCode'||event.title==='V8.CompileScript');}
+function isCompileParseEvent(event){return(event.title==='V8.PreParse'||event.title==='V8.ParseFunction'||event.title==='V8.ParseProgram');}
+function isCompileEvent(event){return tr.b.getCategoryParts(event.category).includes('disabled-by-default-v8.compile');}
+function isFullMarkCompactorEvent(event){return event.title==='V8.GCCompactor';}
+function isIncrementalMarkingEvent(event){return event.title.startsWith('V8.GCIncrementalMarking');}
+function isLatencyMarkCompactorEvent(event){return event.title==='V8.GCFinalizeMC';}
+function isMemoryMarkCompactorEvent(event){return event.title==='V8.GCFinalizeMCReduceMemory';}
+function isScavengerEvent(event){return event.title==='V8.GCScavenger';}
+function topGarbageCollectionEventName(event){if(event.title===FULL_GC_EVENT){if(findParent(event,isLowMemoryEvent)){return LOW_MEMORY_MARK_COMPACTOR;}}
+return TOP_GC_EVENTS[event.title];}
+function subGarbageCollectionEventName(event){const topEvent=findParent(event,isTopGarbageCollectionEvent);const prefix=topEvent?topGarbageCollectionEventName(topEvent):'unknown';const name=event.title.replace('V8.GC_MC_','').replace('V8.GC_SCAVENGER_','').replace('V8.GC_','').replace(/_/g,'-').toLowerCase();return prefix+'-'+name;}
+function groupAndProcessEvents(model,filterCallback,nameCallback,processCallback){const nameToEvents={};for(const event of model.getDescendantEvents()){if(!filterCallback(event))continue;const name=nameCallback(event);nameToEvents[name]=nameToEvents[name]||[];nameToEvents[name].push(event);}
+for(const[name,events]of Object.entries(nameToEvents)){processCallback(name,events);}}
+function unionOfIntervals(intervals){if(intervals.length===0)return[];return tr.b.math.mergeRanges(intervals.map(x=>{return{min:x.start,max:x.end};}),1e-6,function(ranges){return{start:ranges.reduce((acc,x)=>Math.min(acc,x.min),ranges[0].min),end:ranges.reduce((acc,x)=>Math.max(acc,x.max),ranges[0].max)};});}
+function hasV8Stats(globalMemoryDump){let v8stats=undefined;globalMemoryDump.iterateContainerDumps(function(dump){v8stats=v8stats||dump.getMemoryAllocatorDumpByFullName('v8');});return!!v8stats;}
+function rangeForMemoryDumps(model){const startOfFirstDumpWithV8=model.globalMemoryDumps.filter(hasV8Stats).reduce((start,dump)=>Math.min(start,dump.start),Infinity);if(startOfFirstDumpWithV8===Infinity)return new tr.b.math.Range();return tr.b.math.Range.fromExplicitRange(startOfFirstDumpWithV8,Infinity);}
+return{findParent,groupAndProcessEvents,isCompileEvent,isCompileOptimizeEvent,isCompileUnoptimizeEvent,isCompileParseEvent,isForcedGarbageCollectionEvent,isFullMarkCompactorEvent,isGarbageCollectionEvent,isIdleTask,isIncrementalMarkingEvent,isLatencyMarkCompactorEvent,isLowMemoryEvent,isMemoryMarkCompactorEvent,isScavengerEvent,isSubGarbageCollectionEvent,isTopGarbageCollectionEvent,isTopV8ExecuteEvent,isV8Event,isV8ExecuteEvent,rangeForMemoryDumps,subGarbageCollectionEventName,topGarbageCollectionEventName,unionOfIntervals,};});'use strict';tr.exportTo('tr.metrics.blink',function(){const BLINK_GC_EVENTS={'BlinkGCMarking':'blink-gc-marking','ThreadState::completeSweep':'blink-gc-complete-sweep','ThreadState::performIdleLazySweep':'blink-gc-idle-lazy-sweep'};function isBlinkGarbageCollectionEvent(event){return event.title in BLINK_GC_EVENTS;}
+function blinkGarbageCollectionEventName(event){return BLINK_GC_EVENTS[event.title];}
+function blinkGcMetric(histograms,model){addDurationOfTopEvents(histograms,model);addTotalDurationOfTopEvents(histograms,model);addIdleTimesOfTopEvents(histograms,model);addTotalIdleTimesOfTopEvents(histograms,model);}
+tr.metrics.MetricRegistry.register(blinkGcMetric);const timeDurationInMs_smallerIsBetter=tr.b.Unit.byName.timeDurationInMs_smallerIsBetter;const percentage_biggerIsBetter=tr.b.Unit.byName.normalizedPercentage_biggerIsBetter;const CUSTOM_BOUNDARIES=tr.v.HistogramBinBoundaries.createLinear(0,20,200).addExponentialBins(200,100);function createNumericForTopEventTime(name){const n=new tr.v.Histogram(name,timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);n.customizeSummaryOptions({avg:true,count:true,max:true,min:false,std:true,sum:true,percentile:[0.90]});return n;}
+function createNumericForIdleTime(name){const n=new tr.v.Histogram(name,timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);n.customizeSummaryOptions({avg:true,count:false,max:true,min:false,std:false,sum:true,percentile:[]});return n;}
+function createPercentage(name,numerator,denominator){const histogram=new tr.v.Histogram(name,percentage_biggerIsBetter);if(denominator===0){histogram.addSample(0);}else{histogram.addSample(numerator/denominator);}
+return histogram;}
+function addDurationOfTopEvents(histograms,model){tr.metrics.v8.utils.groupAndProcessEvents(model,isBlinkGarbageCollectionEvent,blinkGarbageCollectionEventName,function(name,events){const cpuDuration=createNumericForTopEventTime(name);events.forEach(function(event){cpuDuration.addSample(event.cpuDuration);});histograms.addHistogram(cpuDuration);});}
+function addTotalDurationOfTopEvents(histograms,model){tr.metrics.v8.utils.groupAndProcessEvents(model,isBlinkGarbageCollectionEvent,event=>'blink-gc-total',function(name,events){const cpuDuration=createNumericForTopEventTime(name);events.forEach(function(event){cpuDuration.addSample(event.cpuDuration);});histograms.addHistogram(cpuDuration);});}
+function addIdleTimesOfTopEvents(histograms,model){tr.metrics.v8.utils.groupAndProcessEvents(model,isBlinkGarbageCollectionEvent,blinkGarbageCollectionEventName,function(name,events){addIdleTimes(histograms,model,name,events);});}
+function addTotalIdleTimesOfTopEvents(histograms,model){tr.metrics.v8.utils.groupAndProcessEvents(model,isBlinkGarbageCollectionEvent,event=>'blink-gc-total',function(name,events){addIdleTimes(histograms,model,name,events);});}
+function addIdleTimes(histograms,model,name,events){const cpuDuration=createNumericForIdleTime(name+'_cpu');const insideIdle=createNumericForIdleTime(name+'_inside_idle');const outsideIdle=createNumericForIdleTime(name+'_outside_idle');const idleDeadlineOverrun=createNumericForIdleTime(name+'_idle_deadline_overrun');events.forEach(function(event){const idleTask=tr.metrics.v8.utils.findParent(event,tr.metrics.v8.utils.isIdleTask);let inside=0;let overrun=0;if(idleTask){const allottedTime=idleTask.args.allotted_time_ms;if(event.duration>allottedTime){overrun=event.duration-allottedTime;inside=event.cpuDuration*allottedTime/event.duration;}else{inside=event.cpuDuration;}}
+cpuDuration.addSample(event.cpuDuration);insideIdle.addSample(inside);outsideIdle.addSample(event.cpuDuration-inside);idleDeadlineOverrun.addSample(overrun);});histograms.addHistogram(idleDeadlineOverrun);histograms.addHistogram(outsideIdle);const percentage=createPercentage(name+'_percentage_idle',insideIdle.sum,cpuDuration.sum);histograms.addHistogram(percentage);}
+return{blinkGcMetric,};});'use strict';tr.exportTo('tr.metrics.sh',function(){function getCpuSnapshotsFromModel(model){const snapshots=[];for(const pid in model.processes){const snapshotInstances=model.processes[pid].objects.getAllInstancesNamed('CPUSnapshots');if(!snapshotInstances)continue;for(const object of snapshotInstances[0].snapshots){snapshots.push(object.args.processes);}}
+return snapshots;}
+function getProcessSumsFromSnapshot(snapshot){const processSums=new Map();for(const processData of snapshot){const processName=processData.name;if(!(processSums.has(processName))){processSums.set(processName,{sum:0.0,paths:new Set()});}
+processSums.get(processName).sum+=parseFloat(processData.pCpu);if(processData.path){processSums.get(processName).paths.add(processData.path);}}
+return processSums;}
+function buildNumericsFromSnapshots(snapshots){const processNumerics=new Map();for(const snapshot of snapshots){const processSums=getProcessSumsFromSnapshot(snapshot);for(const[processName,processData]of processSums.entries()){if(!(processNumerics.has(processName))){processNumerics.set(processName,{numeric:new tr.v.Histogram('cpu:percent:'+processName,tr.b.Unit.byName.normalizedPercentage_smallerIsBetter),paths:new Set()});}
+processNumerics.get(processName).numeric.addSample(processData.sum/100.0);for(const path of processData.paths){processNumerics.get(processName).paths.add(path);}}}
+return processNumerics;}
+function cpuProcessMetric(histograms,model){const snapshots=getCpuSnapshotsFromModel(model);const processNumerics=buildNumericsFromSnapshots(snapshots);for(const[processName,processData]of processNumerics){const numeric=processData.numeric;const missingSnapshotCount=snapshots.length-numeric.numValues;for(let i=0;i<missingSnapshotCount;i++){numeric.addSample(0);}
+numeric.diagnostics.set('paths',new
+tr.v.d.Generic([...processData.paths]));histograms.addHistogram(numeric);}}
+tr.metrics.MetricRegistry.register(cpuProcessMetric);return{cpuProcessMetric,};});'use strict';tr.exportTo('tr.metrics',function(){function sampleMetric(histograms,model){const hist=new tr.v.Histogram('foo',tr.b.Unit.byName.sizeInBytes_smallerIsBetter);hist.addSample(9);hist.addSample(91,{bar:new tr.v.d.Generic({hello:42})});for(const expectation of model.userModel.expectations){if(expectation instanceof tr.model.um.ResponseExpectation){}else if(expectation instanceof tr.model.um.AnimationExpectation){}else if(expectation instanceof tr.model.um.IdleExpectation){}else if(expectation instanceof tr.model.um.LoadExpectation){}}
+const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);for(const[pid,process]of Object.entries(model.processes)){}
+histograms.addHistogram(hist);}
+tr.metrics.MetricRegistry.register(sampleMetric);return{sampleMetric,};});'use strict';tr.exportTo('tr.metrics',function(){const HANDLE_INPUT_EVENT_TITLE='WebViewImpl::handleInputEvent';function findPrecedingEvents_(eventsA,eventsB){const events=new Map();let eventsBIndex=0;for(const eventA of eventsA){for(;eventsBIndex<eventsB.length;eventsBIndex++){if(eventsB[eventsBIndex].start>eventA.start)break;}
+if(eventsBIndex>0){events.set(eventA,eventsB[eventsBIndex-1]);}}
+return events;}
+function findFollowingEvents_(eventsA,eventsB){const events=new Map();let eventsBIndex=0;for(const eventA of eventsA){for(;eventsBIndex<eventsB.length;eventsBIndex++){if(eventsB[eventsBIndex].start>=eventA.start)break;}
+if(eventsBIndex>=0&&eventsBIndex<eventsB.length){events.set(eventA,eventsB[eventsBIndex]);}}
+return events;}
+function getSpaNavigationStartCandidates_(rendererHelper,browserHelper){const isNavStartEvent=e=>{if(e.title===HANDLE_INPUT_EVENT_TITLE&&e.args.type==='MouseUp'){return true;}
+return e.title==='NavigationControllerImpl::GoToIndex';};return[...rendererHelper.mainThread.sliceGroup.getDescendantEvents(),...browserHelper.mainThread.sliceGroup.getDescendantEvents()].filter(isNavStartEvent);}
+function getSpaNavigationEvents_(rendererHelper){const isNavEvent=e=>e.category==='blink'&&e.title==='FrameLoader::updateForSameDocumentNavigation';return[...rendererHelper.mainThread.sliceGroup.getDescendantEvents()].filter(isNavEvent);}
+function getInputLatencyEvents_(browserHelper){const isInputLatencyEvent=e=>e.title==='InputLatency::MouseUp';return browserHelper.getAllAsyncSlicesMatching(isInputLatencyEvent);}
+function getInputLatencyEventByBindIdMap_(browserHelper){const inputLatencyEventByBindIdMap=new Map();for(const event of getInputLatencyEvents_(browserHelper)){inputLatencyEventByBindIdMap.set(event.args.data.trace_id,event);}
+return inputLatencyEventByBindIdMap;}
+function getSpaNavigationEventToNavigationStartMap_(rendererHelper,browserHelper){const mainThread=rendererHelper.mainThread;const spaNavEvents=getSpaNavigationEvents_(rendererHelper);const navStartCandidates=getSpaNavigationStartCandidates_(rendererHelper,browserHelper).sort(tr.importer.compareEvents);const spaNavEventToNavStartCandidateMap=findPrecedingEvents_(spaNavEvents,navStartCandidates);const inputLatencyEventByBindIdMap=getInputLatencyEventByBindIdMap_(browserHelper);const spaNavEventToNavStartEventMap=new Map();for(const[spaNavEvent,navStartCandidate]of
+spaNavEventToNavStartCandidateMap){if(navStartCandidate.title===HANDLE_INPUT_EVENT_TITLE){const inputLatencySlice=inputLatencyEventByBindIdMap.get(Number(navStartCandidate.parentSlice.bindId));if(inputLatencySlice){spaNavEventToNavStartEventMap.set(spaNavEvent,inputLatencySlice);}}else{spaNavEventToNavStartEventMap.set(spaNavEvent,navStartCandidate);}}
+return spaNavEventToNavStartEventMap;}
+function getFirstPaintEvents_(rendererHelper){const isFirstPaintEvent=e=>e.category==='blink'&&e.title==='PaintLayerCompositor::updateIfNeededRecursive';return[...rendererHelper.mainThread.sliceGroup.getDescendantEvents()].filter(isFirstPaintEvent);}
+function getSpaNavigationEventToFirstPaintEventMap_(rendererHelper){const spaNavEvents=getSpaNavigationEvents_(rendererHelper).sort(tr.importer.compareEvents);const firstPaintEvents=getFirstPaintEvents_(rendererHelper).sort(tr.importer.compareEvents);return findFollowingEvents_(spaNavEvents,firstPaintEvents);}
+function findSpaNavigationsOnRenderer(rendererHelper,browserHelper){const spaNavEventToNavStartMap=getSpaNavigationEventToNavigationStartMap_(rendererHelper,browserHelper);const spaNavEventToFirstPaintEventMap=getSpaNavigationEventToFirstPaintEventMap_(rendererHelper);const spaNavigations=[];for(const[spaNavEvent,navStartEvent]of
+spaNavEventToNavStartMap){if(spaNavEventToFirstPaintEventMap.has(spaNavEvent)){const firstPaintEvent=spaNavEventToFirstPaintEventMap.get(spaNavEvent);const isNavStartAsyncSlice=navStartEvent instanceof tr.model.AsyncSlice;spaNavigations.push({navStartCandidates:{inputLatencyAsyncSlice:isNavStartAsyncSlice?navStartEvent:undefined,goToIndexSlice:isNavStartAsyncSlice?undefined:navStartEvent},firstPaintEvent,url:spaNavEvent.args.url});}}
+return spaNavigations;}
+return{findSpaNavigationsOnRenderer,};});'use strict';tr.exportTo('tr.metrics.sh',function(){function perceptualBlend(ir,index,score){return Math.exp(1-score);}
+function filterExpectationsByRange(irs,opt_range){const filteredExpectations=[];irs.forEach(function(ir){if(!(ir instanceof tr.model.um.UserExpectation))return;if(!opt_range||opt_range.intersectsExplicitRangeInclusive(ir.start,ir.end)){filteredExpectations.push(ir);}});return filteredExpectations;}
+return{perceptualBlend,filterExpectationsByRange,};});'use strict';tr.exportTo('tr.metrics.sh',function(){function generateTimeBreakdownTree(mainThread,rangeOfInterest,getEventStart,getEventDuration,getEventSelfTime){if(mainThread===null)return;const breakdownTree={};for(const title of
+tr.e.chrome.ChromeUserFriendlyCategoryDriver.ALL_TITLES){breakdownTree[title]={total:0,events:{}};}
+for(const event of mainThread.getDescendantEvents()){const eventStart=getEventStart(event);const eventDuration=getEventDuration(event);const eventSelfTime=getEventSelfTime(event);const eventEnd=eventStart+eventDuration;if(!rangeOfInterest.intersectsExplicitRangeExclusive(eventStart,eventEnd)){continue;}
+if(eventSelfTime===undefined)continue;const title=tr.e.chrome.ChromeUserFriendlyCategoryDriver.fromEvent(event);let timeIntersectionRatio=0;if(eventDuration>0){timeIntersectionRatio=rangeOfInterest.findExplicitIntersectionDuration(eventStart,eventEnd)/eventDuration;}
+const v8Runtime=event.args['runtime-call-stat'];if(v8Runtime!==undefined){const v8RuntimeObject=JSON.parse(v8Runtime);for(const runtimeCall in v8RuntimeObject){if(v8RuntimeObject[runtimeCall].length===2){if(breakdownTree.v8_runtime.events[runtimeCall]===undefined){breakdownTree.v8_runtime.events[runtimeCall]=0;}
+const runtimeTime=tr.b.Unit.timestampFromUs(v8RuntimeObject[runtimeCall][1]*timeIntersectionRatio);breakdownTree.v8_runtime.total+=runtimeTime;breakdownTree.v8_runtime.events[runtimeCall]+=runtimeTime;}}}
+const approximatedSelfTimeContribution=eventSelfTime*timeIntersectionRatio;breakdownTree[title].total+=approximatedSelfTimeContribution;if(breakdownTree[title].events[event.title]===undefined){breakdownTree[title].events[event.title]=0;}
+breakdownTree[title].events[event.title]+=approximatedSelfTimeContribution;}
+return breakdownTree;}
+function addIdleAndBlockByNetworkBreakdown_(breakdownTree,mainThreadEvents,networkEvents,rangeOfInterest){let idleRanges=[rangeOfInterest];const mainThreadEventRanges=tr.b.math.convertEventsToRanges(mainThreadEvents);const networkEventRanges=tr.b.math.convertEventsToRanges(networkEvents);const eventRanges=mainThreadEventRanges.concat(networkEventRanges);eventRanges.sort((a,b)=>a.min-b.min);for(const eventRange of eventRanges){if(!eventRange||eventRange.isEmpty||eventRange.duration<0){throw new Error('Range is invalid');}
+const newLastIdleRanges=tr.b.math.Range.findDifference(idleRanges[idleRanges.length-1],eventRange);idleRanges.pop();idleRanges=idleRanges.concat(newLastIdleRanges);if(idleRanges.length===0)break;}
+const totalFreeDuration=tr.b.math.Statistics.sum(idleRanges,range=>range.duration);breakdownTree.idle={total:totalFreeDuration,events:{}};let totalBlockedDuration=rangeOfInterest.duration;for(const component of Object.values(breakdownTree)){totalBlockedDuration-=component.total;}
+breakdownTree.blocked_on_network={total:totalBlockedDuration,events:{}};}
+function generateWallClockTimeBreakdownTree(mainThread,networkEvents,rangeOfInterest){function getEventStart(e){return e.start;}
+function getEventDuration(e){return e.duration;}
+function getEventSelfTime(e){return e.selfTime;}
+const breakdownTree=generateTimeBreakdownTree(mainThread,rangeOfInterest,getEventStart,getEventDuration,getEventSelfTime);const mainThreadEventsInRange=tr.model.helpers.getSlicesIntersectingRange(rangeOfInterest,mainThread.sliceGroup.topLevelSlices);addIdleAndBlockByNetworkBreakdown_(breakdownTree,mainThreadEventsInRange,networkEvents,rangeOfInterest);return breakdownTree;}
+function generateCpuTimeBreakdownTree(mainThread,rangeOfInterestCpuTime){function getEventStart(e){return e.cpuStart;}
+function getEventDuration(e){return e.cpuDuration;}
+function getEventSelfTime(e){return e.cpuSelfTime;}
+return generateTimeBreakdownTree(mainThread,rangeOfInterestCpuTime,getEventStart,getEventDuration,getEventSelfTime);}
+return{generateTimeBreakdownTree,generateWallClockTimeBreakdownTree,generateCpuTimeBreakdownTree,};});'use strict';tr.exportTo('tr.metrics.sh',function(){const RESPONSIVENESS_THRESHOLD_MS=50;const INTERACTIVE_WINDOW_SIZE_MS=5*1000;const timeDurationInMs_smallerIsBetter=tr.b.Unit.byName.timeDurationInMs_smallerIsBetter;const RelatedEventSet=tr.v.d.RelatedEventSet;function getNetworkEventsInRange(process,range){const networkEvents=[];for(const thread of Object.values(process.threads)){const threadHelper=new tr.model.helpers.ChromeThreadHelper(thread);const events=threadHelper.getNetworkEvents();for(const event of events){if(range.intersectsExplicitRangeInclusive(event.start,event.end)){networkEvents.push(event);}}}
+return networkEvents;}
+function hasCategoryAndName(event,category,title){return event.title===title&&event.category&&tr.b.getCategoryParts(event.category).includes(category);}
+function createBreakdownDiagnostic(breakdownTree){const breakdownDiagnostic=new tr.v.d.Breakdown();breakdownDiagnostic.colorScheme=tr.v.d.COLOR_SCHEME_CHROME_USER_FRIENDLY_CATEGORY_DRIVER;for(const label in breakdownTree){breakdownDiagnostic.set(label,breakdownTree[label].total);}
+return breakdownDiagnostic;}
+function NavigationStartFinder(rendererHelper){this.navigationStartsForFrameId_={};for(const ev of rendererHelper.mainThread.sliceGroup.childEvents()){if(!hasCategoryAndName(ev,'blink.user_timing','navigationStart')){continue;}
+const frameIdRef=ev.args.frame;let list=this.navigationStartsForFrameId_[frameIdRef];if(list===undefined){this.navigationStartsForFrameId_[frameIdRef]=list=[];}
+list.unshift(ev);}}
+NavigationStartFinder.prototype={findNavigationStartEventForFrameBeforeTimestamp(frameIdRef,ts){const list=this.navigationStartsForFrameId_[frameIdRef];if(list===undefined)return undefined;let eventBeforeTimestamp;for(const ev of list){if(ev.start>ts)continue;if(eventBeforeTimestamp===undefined){eventBeforeTimestamp=ev;}}
+if(eventBeforeTimestamp===undefined)return undefined;return eventBeforeTimestamp;}};const FIRST_PAINT_BOUNDARIES=tr.v.HistogramBinBoundaries.createLinear(0,1e3,20).addLinearBins(3e3,20).addExponentialBins(20e3,20);function createHistogram(name){const histogram=new tr.v.Histogram(name,timeDurationInMs_smallerIsBetter,FIRST_PAINT_BOUNDARIES);histogram.customizeSummaryOptions({avg:true,count:false,max:true,min:true,std:true,sum:false,});return histogram;}
+function findFrameLoaderSnapshotAt(rendererHelper,frameIdRef,ts){const objects=rendererHelper.process.objects;const frameLoaderInstances=objects.instancesByTypeName_.FrameLoader;if(frameLoaderInstances===undefined)return undefined;let snapshot;for(const instance of frameLoaderInstances){if(!instance.isAliveAt(ts))continue;const maybeSnapshot=instance.getSnapshotAt(ts);if(frameIdRef!==maybeSnapshot.args.frame.id_ref)continue;snapshot=maybeSnapshot;}
+return snapshot;}
+function findAllEvents(rendererHelper,category,title){const targetEvents=[];for(const ev of rendererHelper.process.getDescendantEvents()){if(!hasCategoryAndName(ev,category,title))continue;targetEvents.push(ev);}
+return targetEvents;}
+function findFirstMeaningfulPaintCandidates(rendererHelper){const candidatesForFrameId={};for(const ev of rendererHelper.process.getDescendantEvents()){if(!hasCategoryAndName(ev,'loading','firstMeaningfulPaintCandidate')){continue;}
+if(rendererHelper.isTelemetryInternalEvent(ev))continue;const frameIdRef=ev.args.frame;if(frameIdRef===undefined)continue;let list=candidatesForFrameId[frameIdRef];if(list===undefined){candidatesForFrameId[frameIdRef]=list=[];}
+list.push(ev);}
+return candidatesForFrameId;}
+const URL_BLACKLIST=['about:blank','data:text/html,pluginplaceholderdata','data:text/html,chromewebdata'];function shouldIgnoreURL(url){return URL_BLACKLIST.includes(url);}
+function collectTimeToEvent(category,eventName,rendererHelper,navigationStartFinder){const targetEvents=findAllEvents(rendererHelper,category,eventName);const samples=[];for(const ev of targetEvents){if(rendererHelper.isTelemetryInternalEvent(ev))continue;const frameIdRef=ev.args.frame;const snapshot=findFrameLoaderSnapshotAt(rendererHelper,frameIdRef,ev.start);if(snapshot===undefined||!snapshot.args.isLoadingMainFrame)continue;const url=snapshot.args.documentLoaderURL;if(shouldIgnoreURL(url))continue;const navigationStartEvent=navigationStartFinder.findNavigationStartEventForFrameBeforeTimestamp(frameIdRef,ev.start);if(navigationStartEvent===undefined)continue;const timeToEvent=ev.start-navigationStartEvent.start;samples.push({value:timeToEvent,diagnostics:{url:new tr.v.d.Generic(url)}});}
+return samples;}
+function addFirstMeaningfulPaintSample(samples,rendererHelper,frameIdRef,navigationStart,fmpMarkerEvent){const snapshot=findFrameLoaderSnapshotAt(rendererHelper,frameIdRef,fmpMarkerEvent.start);if(!snapshot||!snapshot.args.isLoadingMainFrame)return;const url=snapshot.args.documentLoaderURL;if(shouldIgnoreURL(url))return;const navStartToFMPRange=tr.b.math.Range.fromExplicitRange(navigationStart.start,fmpMarkerEvent.start);const networkEvents=getNetworkEventsInRange(rendererHelper.process,navStartToFMPRange);const timeToFirstMeaningfulPaint=navStartToFMPRange.duration;const breakdownTree=tr.metrics.sh.generateWallClockTimeBreakdownTree(rendererHelper.mainThread,networkEvents,navStartToFMPRange);const breakdownDiagnostic=createBreakdownDiagnostic(breakdownTree);samples.push({value:timeToFirstMeaningfulPaint,diagnostics:{'Breakdown of [navStart, FMP]':breakdownDiagnostic,'Start':new RelatedEventSet(navigationStart),'End':new RelatedEventSet(fmpMarkerEvent),'Navigation infos':new tr.v.d.Generic({url,pid:rendererHelper.pid,start:navigationStart.start,fmp:fmpMarkerEvent.start}),}});return{firstMeaningfulPaint:fmpMarkerEvent.start,url};}
+function addFirstMeaningfulPaintCpuTimeSample(samples,rendererHelper,frameIdRef,navigationStart,fmpMarkerEvent){const navStartToFMPCpuRange=tr.b.math.Range.fromExplicitRange(navigationStart.cpuStart,fmpMarkerEvent.cpuStart);const snapshot=findFrameLoaderSnapshotAt(rendererHelper,frameIdRef,fmpMarkerEvent.start);if(!snapshot||!snapshot.args.isLoadingMainFrame)return;const url=snapshot.args.documentLoaderURL;if(shouldIgnoreURL(url))return;const mainThreadCpuTime=getMainThreadCpuTime(rendererHelper,navStartToFMPCpuRange);const breakdownTree=tr.metrics.sh.generateCpuTimeBreakdownTree(rendererHelper.mainThread,navStartToFMPCpuRange);const breakdownDiagnostic=createBreakdownDiagnostic(breakdownTree);samples.push({value:mainThreadCpuTime,diagnostics:{'Breakdown of [navStart, FMP]':breakdownDiagnostic,'Start':new RelatedEventSet(navigationStart),'End':new RelatedEventSet(fmpMarkerEvent),'Navigation infos':new tr.v.d.Generic({url,pid:rendererHelper.pid,start:navigationStart.start,fmp:fmpMarkerEvent.start}),}});}
+function getMainThreadCpuTime(rendererHelper,rangeOfInterest){let mainThreadCpuTime=0;for(const slice of rendererHelper.mainThread.sliceGroup.topLevelSlices){if(!slice.cpuDuration)continue;const sliceRange=tr.b.math.Range.fromExplicitRange(slice.cpuStart,slice.cpuStart+slice.cpuDuration);const intersection=rangeOfInterest.findIntersection(sliceRange);mainThreadCpuTime+=intersection.duration;}
+return mainThreadCpuTime;}
+function addFirstInteractiveSample(samples,rendererHelper,navigationStart,firstMeaningfulPaint,url){if(shouldIgnoreURL(url))return;const navigationStartTime=navigationStart.start;let firstInteractive=Infinity;let firstInteractiveCandidate=firstMeaningfulPaint;let lastLongTaskEvent=undefined;for(const ev of[...rendererHelper.mainThread.sliceGroup.childEvents()]){if(ev.start<firstInteractiveCandidate)continue;const interactiveDurationSoFar=ev.start-firstInteractiveCandidate;if(interactiveDurationSoFar>=INTERACTIVE_WINDOW_SIZE_MS){firstInteractive=firstInteractiveCandidate;break;}
+if(ev.title==='TaskQueueManager::ProcessTaskFromWorkQueue'&&ev.duration>RESPONSIVENESS_THRESHOLD_MS){firstInteractiveCandidate=ev.end-50;lastLongTaskEvent=ev;}}
+const navStartToFirstInteractiveRange=tr.b.math.Range.fromExplicitRange(navigationStartTime,firstInteractive);const networkEvents=getNetworkEventsInRange(rendererHelper.process,navStartToFirstInteractiveRange);const breakdownTree=tr.metrics.sh.generateWallClockTimeBreakdownTree(rendererHelper.mainThread,networkEvents,navStartToFirstInteractiveRange);const breakdownDiagnostic=createBreakdownDiagnostic(breakdownTree);const timeToFirstInteractive=navStartToFirstInteractiveRange.duration;samples.push({value:timeToFirstInteractive,diagnostics:{'Start':new RelatedEventSet(navigationStart),'Last long task':new RelatedEventSet(lastLongTaskEvent),'Navigation infos':new tr.v.d.Generic({url,pid:rendererHelper.pid,start:navigationStartTime,interactive:firstInteractive}),'Breakdown of [navStart, Interactive]':breakdownDiagnostic,}});}
+function collectFirstMeaningfulPaintAndTimeToInteractiveForRenderer(rendererHelper,navigationStartFinder){const firstMeaningfulPaintSamples=[];const firstMeaningfulPaintCpuTimeSamples=[];const firstInteractiveSamples=[];function addSamples(frameIdRef,navigationStart,fmpMarkerEvent){const data=addFirstMeaningfulPaintSample(firstMeaningfulPaintSamples,rendererHelper,frameIdRef,navigationStart,fmpMarkerEvent);addFirstMeaningfulPaintCpuTimeSample(firstMeaningfulPaintCpuTimeSamples,rendererHelper,frameIdRef,navigationStart,fmpMarkerEvent);if(data!==undefined){addFirstInteractiveSample(firstInteractiveSamples,rendererHelper,navigationStart,data.firstMeaningfulPaint,data.url);}}
+const candidatesForFrameId=findFirstMeaningfulPaintCandidates(rendererHelper);for(const frameIdRef in candidatesForFrameId){let navigationStart=undefined;let lastCandidate=undefined;for(const ev of candidatesForFrameId[frameIdRef]){const navigationStartForThisCandidate=navigationStartFinder.findNavigationStartEventForFrameBeforeTimestamp(frameIdRef,ev.start);if(navigationStartForThisCandidate===undefined)continue;if(navigationStart!==navigationStartForThisCandidate){if(navigationStart!==undefined&&lastCandidate!==undefined){addSamples(frameIdRef,navigationStart,lastCandidate);}
+navigationStart=navigationStartForThisCandidate;}
+lastCandidate=ev;}
+if(lastCandidate!==undefined){addSamples(frameIdRef,navigationStart,lastCandidate);}}
+return{firstMeaningfulPaintSamples,firstMeaningfulPaintCpuTimeSamples,firstInteractiveSamples};}
+function collectLoadingMetricsForRenderer(rendererHelper){const navigationStartFinder=new NavigationStartFinder(rendererHelper);const firstContentfulPaintSamples=collectTimeToEvent('loading','firstContentfulPaint',rendererHelper,navigationStartFinder);const onLoadSamples=collectTimeToEvent('blink.user_timing','loadEventStart',rendererHelper,navigationStartFinder);const{firstMeaningfulPaintSamples,firstMeaningfulPaintCpuTimeSamples,firstInteractiveSamples}=collectFirstMeaningfulPaintAndTimeToInteractiveForRenderer(rendererHelper,navigationStartFinder);return{firstContentfulPaintSamples,onLoadSamples,firstMeaningfulPaintSamples,firstMeaningfulPaintCpuTimeSamples,firstInteractiveSamples};}
+function addSamplesToHistogram(samples,histogram){for(const sample of samples){histogram.addSample(sample.value,sample.diagnostics);}}
+function loadingMetric(histograms,model){const firstContentfulPaintHistogram=createHistogram('timeToFirstContentfulPaint');firstContentfulPaintHistogram.description='time to first contentful paint';const onLoadHistogram=createHistogram('timeToOnload');onLoadHistogram.description='time to onload. '+'This is temporary metric used for PCv1/v2 sanity checking';const firstMeaningfulPaintHistogram=createHistogram('timeToFirstMeaningfulPaint');firstMeaningfulPaintHistogram.description='time to first meaningful paint';const firstMeaningfulPaintCpuTimeHistogram=createHistogram('cpuTimeToFirstMeaningfulPaint');firstMeaningfulPaintCpuTimeHistogram.description='CPU time to first meaningful paint';const firstInteractiveHistogram=createHistogram('timeToFirstInteractive');firstInteractiveHistogram.description='time to first interactive';const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);for(const pid in chromeHelper.rendererHelpers){const rendererHelper=chromeHelper.rendererHelpers[pid];if(rendererHelper.isChromeTracingUI)continue;const{firstContentfulPaintSamples,onLoadSamples,firstMeaningfulPaintSamples,firstMeaningfulPaintCpuTimeSamples,firstInteractiveSamples}=collectLoadingMetricsForRenderer(rendererHelper);addSamplesToHistogram(firstContentfulPaintSamples,firstContentfulPaintHistogram);addSamplesToHistogram(onLoadSamples,onLoadHistogram);addSamplesToHistogram(firstMeaningfulPaintSamples,firstMeaningfulPaintHistogram);addSamplesToHistogram(firstMeaningfulPaintCpuTimeSamples,firstMeaningfulPaintCpuTimeHistogram);addSamplesToHistogram(firstInteractiveSamples,firstInteractiveHistogram);}
+histograms.addHistogram(firstContentfulPaintHistogram);histograms.addHistogram(onLoadHistogram);histograms.addHistogram(firstMeaningfulPaintHistogram);histograms.addHistogram(firstMeaningfulPaintCpuTimeHistogram);histograms.addHistogram(firstInteractiveHistogram);}
+tr.metrics.MetricRegistry.register(loadingMetric);return{loadingMetric,getNetworkEventsInRange,collectLoadingMetricsForRenderer,RESPONSIVENESS_THRESHOLD_MS,INTERACTIVE_WINDOW_SIZE_MS,};});'use strict';tr.exportTo('tr.metrics',function(){const SPA_NAVIGATION_START_TO_FIRST_PAINT_DURATION_BIN_BOUNDARY=tr.v.HistogramBinBoundaries.createExponential(1,1000,50);function spaNavigationMetric(histograms,model){const histogram=new tr.v.Histogram('spaNavigationStartToFpDuration',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,SPA_NAVIGATION_START_TO_FIRST_PAINT_DURATION_BIN_BOUNDARY);histogram.description='Latency between the input event causing'+' a SPA navigation and the first paint event after it';histogram.customizeSummaryOptions({count:false,sum:false,});const modelHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);if(!modelHelper){return;}
+const rendererHelpers=modelHelper.rendererHelpers;if(!rendererHelpers){return;}
+const browserHelper=modelHelper.browserHelper;for(const rendererHelper of Object.values(rendererHelpers)){const spaNavigations=tr.metrics.findSpaNavigationsOnRenderer(rendererHelper,browserHelper);for(const spaNav of spaNavigations){let beginTs=0;if(spaNav.navStartCandidates.inputLatencyAsyncSlice){const beginData=spaNav.navStartCandidates.inputLatencyAsyncSlice.args.data;beginTs=model.convertTimestampToModelTime('traceEventClock',beginData.INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT.time);}else{beginTs=spaNav.navStartCandidates.goToIndexSlice.start;}
+const rangeOfInterest=tr.b.math.Range.fromExplicitRange(beginTs,spaNav.firstPaintEvent.start);const networkEvents=tr.metrics.sh.getNetworkEventsInRange(rendererHelper.process,rangeOfInterest);const breakdownDict=tr.metrics.sh.generateWallClockTimeBreakdownTree(rendererHelper.mainThread,networkEvents,rangeOfInterest);const breakdownDiagnostic=new tr.v.d.Breakdown();breakdownDiagnostic.colorScheme=tr.v.d.COLOR_SCHEME_CHROME_USER_FRIENDLY_CATEGORY_DRIVER;for(const label in breakdownDict){breakdownDiagnostic.set(label,parseInt(breakdownDict[label].total*1e3)/1e3);}
+histogram.addSample(rangeOfInterest.duration,{'Breakdown of [navStart, firstPaint]':breakdownDiagnostic,'Start':new tr.v.d.RelatedEventSet(spaNav.navigationStart),'End':new tr.v.d.RelatedEventSet(spaNav.firstPaintEvent),'Navigation infos':new tr.v.d.Generic({url:spaNav.url,pid:rendererHelper.pid,navStart:beginTs,firstPaint:spaNav.firstPaintEvent.start})});}}
+histograms.addHistogram(histogram);}
+tr.metrics.MetricRegistry.register(spaNavigationMetric);return{spaNavigationMetric,};});'use strict';tr.exportTo('tr.metrics.sh',function(){const LATENCY_BOUNDS=tr.v.HistogramBinBoundaries.createLinear(0,20,100);function clockSyncLatencyMetric(values,model){const domains=Array.from(model.clockSyncManager.domainsSeen).sort();for(let i=0;i<domains.length;i++){for(let j=i+1;j<domains.length;j++){const latency=model.clockSyncManager.getTimeTransformerError(domains[i],domains[j]);const hist=new tr.v.Histogram('clock_sync_latency_'+
+domains[i].toLowerCase()+'_to_'+domains[j].toLowerCase(),tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,LATENCY_BOUNDS);hist.customizeSummaryOptions({avg:true,count:false,max:false,min:false,std:false,sum:false,});hist.description='Clock sync latency for domain '+domains[i]+' to domain '+domains[j];hist.addSample(latency);values.addHistogram(hist);}}}
+tr.metrics.MetricRegistry.register(clockSyncLatencyMetric);return{clockSyncLatencyMetric,};});'use strict';tr.exportTo('tr.metrics.sh',function(){const CPU_TIME_PERCENTAGE_BOUNDARIES=tr.v.HistogramBinBoundaries.createExponential(0.01,50,200);function cpuTimeMetric(histograms,model,opt_options){let rangeOfInterest=model.bounds;if(opt_options&&opt_options.rangeOfInterest){rangeOfInterest=opt_options.rangeOfInterest;}else{const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);if(chromeHelper){const chromeBounds=chromeHelper.chromeBounds;if(chromeBounds){rangeOfInterest=chromeBounds;}}}
+let allProcessCpuTime=0;for(const pid in model.processes){const process=model.processes[pid];if(tr.model.helpers.ChromeRendererHelper.isTracingProcess(process)){continue;}
+let processCpuTime=0;for(const tid in process.threads){const thread=process.threads[tid];let threadCpuTime=0;thread.sliceGroup.topLevelSlices.forEach(function(slice){if(slice.duration===0)return;if(!slice.cpuDuration)return;const sliceRange=tr.b.math.Range.fromExplicitRange(slice.start,slice.end);const intersection=rangeOfInterest.findIntersection(sliceRange);const fractionOfSliceInsideRangeOfInterest=intersection.duration/slice.duration;threadCpuTime+=slice.cpuDuration*fractionOfSliceInsideRangeOfInterest;});processCpuTime+=threadCpuTime;}
+allProcessCpuTime+=processCpuTime;}
+let normalizedAllProcessCpuTime=0;if(rangeOfInterest.duration>0){normalizedAllProcessCpuTime=allProcessCpuTime/rangeOfInterest.duration;}
+const unit=tr.b.Unit.byName.normalizedPercentage_smallerIsBetter;const cpuTimeHist=new tr.v.Histogram('cpu_time_percentage',unit,CPU_TIME_PERCENTAGE_BOUNDARIES);cpuTimeHist.description='Percent CPU utilization, normalized against a single core. Can be '+'greater than 100% if machine has multiple cores.';cpuTimeHist.customizeSummaryOptions({avg:true,count:false,max:false,min:false,std:false,sum:false});cpuTimeHist.addSample(normalizedAllProcessCpuTime);histograms.addHistogram(cpuTimeHist);}
+tr.metrics.MetricRegistry.register(cpuTimeMetric,{supportsRangeOfInterest:true});return{cpuTimeMetric,};});'use strict';tr.exportTo('tr.v',function(){class HistogramGrouping{constructor(key,callback,opt_label){this.key=key;this.callback=callback;this.label=opt_label||key;HistogramGrouping.KEYS_TO_GROUPINGS.set(key,this);}}
+HistogramGrouping.KEYS_TO_GROUPINGS=new Map();class HistogramSet{constructor(opt_histograms){this.histogramsByGuid_=new Map();this.sharedDiagnosticsByGuid_=new Map();if(opt_histograms!==undefined){for(const hist of opt_histograms){this.addHistogram(hist);}}}
+createHistogram(name,unit,samples,opt_options){const hist=tr.v.Histogram.create(name,unit,samples,opt_options);this.addHistogram(hist);return hist;}
+addHistogram(hist,opt_diagnostics){if(this.histogramsByGuid_.has(hist.guid)){throw new Error('Cannot add same Histogram twice');}
+if(opt_diagnostics!==undefined){if(!(opt_diagnostics instanceof Map)){opt_diagnostics=Object.entries(opt_diagnostics);}
+for(const[name,diagnostic]of opt_diagnostics){hist.diagnostics.set(name,diagnostic);}}
+this.histogramsByGuid_.set(hist.guid,hist);}
+addSharedDiagnostic(name,diagnostic){this.sharedDiagnosticsByGuid_.set(diagnostic.guid,diagnostic);for(const hist of this){hist.diagnostics.set(name,diagnostic);}}
+get length(){return this.histogramsByGuid_.size;}*[Symbol.iterator](){for(const hist of this.histogramsByGuid_.values()){yield hist;}}
+getHistogramsNamed(name){return[...this].filter(h=>h.name===name);}
+getHistogramNamed(name){const histograms=this.getHistogramsNamed(name);if(histograms.length===0)return undefined;if(histograms.length>1){throw new Error(`Unexpectedly found multiple histograms named "${name}"`);}
+return histograms[0];}
+lookupHistogram(guid){return this.histogramsByGuid_.get(guid);}
+lookupDiagnostic(guid){return this.sharedDiagnosticsByGuid_.get(guid);}
+resolveRelatedHistograms(){const handleDiagnosticMap=dm=>{for(const[name,diagnostic]of dm){if((diagnostic instanceof tr.v.d.RelatedHistogramSet)||(diagnostic instanceof tr.v.d.RelatedHistogramMap)){diagnostic.resolve(this);}}};for(const hist of this){hist.diagnostics.resolveSharedDiagnostics(this);handleDiagnosticMap(hist.diagnostics);for(const dm of hist.nanDiagnosticMaps){handleDiagnosticMap(dm);}
+for(const bin of hist.allBins){for(const dm of bin.diagnosticMaps){handleDiagnosticMap(dm);}}}}
+importDicts(dicts){for(const dict of dicts){if(dict.type&&tr.v.d.Diagnostic.findTypeInfoWithName(dict.type)){this.sharedDiagnosticsByGuid_.set(dict.guid,tr.v.d.Diagnostic.fromDict(dict));}else{this.addHistogram(tr.v.Histogram.fromDict(dict));}}}
+asDicts(){const dicts=[];for(const diagnostic of this.sharedDiagnosticsByGuid_.values()){dicts.push(diagnostic.asDict());}
+for(const hist of this){dicts.push(hist.asDict());}
+return dicts;}
+get sourceHistograms(){const sourceHistograms=new Map(this.histogramsByGuid_);function deleteSourceHistograms(diagnosticMap){for(const[name,diagnostic]of diagnosticMap){if(diagnostic instanceof tr.v.d.RelatedHistogramSet){for(const relatedHist of diagnostic){sourceHistograms.delete(relatedHist.guid);}}else if(diagnostic instanceof tr.v.d.RelatedHistogramMap){for(const[name,relatedHist]of diagnostic){sourceHistograms.delete(relatedHist.guid);}}}}
+for(const hist of this){deleteSourceHistograms(hist.diagnostics);for(const dm of hist.nanDiagnosticMaps){deleteSourceHistograms(dm);}
+for(const b of hist.allBins){for(const dm of b.diagnosticMaps){deleteSourceHistograms(dm);}}}
+return new HistogramSet([...sourceHistograms.values()]);}
+groupHistogramsRecursively(groupings,opt_skipGroupingCallback){function recurse(histograms,level){if(level===groupings.length){return histograms;}
+const grouping=groupings[level];const groupedHistograms=tr.b.groupIntoMap(histograms,grouping.callback);if(opt_skipGroupingCallback&&opt_skipGroupingCallback(grouping,groupedHistograms)){return recurse(histograms,level+1);}
+for(const[key,group]of groupedHistograms){groupedHistograms.set(key,recurse(group,level+1));}
+return groupedHistograms;}
+return recurse([...this],0);}
+deduplicateDiagnostics(){const diagnosticsToCounts=new Map();for(const hist of this){const candidates=[];const telemetryInfo=tr.v.d.TelemetryInfo.getFromHistogram(hist);if(telemetryInfo instanceof tr.v.d.MergedTelemetryInfo){candidates.push(telemetryInfo);}
+const buildbotInfo=tr.v.d.BuildbotInfo.getFromHistogram(hist);if(buildbotInfo instanceof tr.v.d.MergedBuildbotInfo){candidates.push(buildbotInfo);}
+const deviceInfo=tr.v.d.DeviceInfo.getFromHistogram(hist);if(deviceInfo instanceof tr.v.d.MergedDeviceInfo){candidates.push(deviceInfo);}
+for(const diagnostic of candidates){if(diagnostic===undefined)continue;let found=false;for(const[testDiagnostic,count]of diagnosticsToCounts){if(diagnostic.equals(testDiagnostic)){testDiagnostic.addToHistogram(hist);diagnosticsToCounts.set(testDiagnostic,count+1);found=true;break;}}
+if(!found){diagnosticsToCounts.set(diagnostic,1);}}}
+for(const[diagnostic,count]of diagnosticsToCounts){if(count>1){this.sharedDiagnosticsByGuid_.set(diagnostic.guid,diagnostic);}}}
+mergeRelationships(){for(const hist of this){hist.diagnostics.mergeRelationships(hist);}}}
+HistogramSet.GROUPINGS={HISTOGRAM_NAME:new HistogramGrouping('name',h=>h.name),BENCHMARK_NAME:new HistogramGrouping('benchmark',h=>tr.v.d.TelemetryInfo.getField(h,'benchmarkName','')),BENCHMARK_START:new HistogramGrouping('time',h=>tr.v.d.TelemetryInfo.getField(h,'benchmarkStartString','')),STORYSET_REPEAT:new HistogramGrouping('storyset_repeat',h=>tr.v.d.TelemetryInfo.getField(h,'storysetRepeatCounterLabel',0),'storyset repeat'),STORY_NAME:new HistogramGrouping('story',h=>tr.v.d.TelemetryInfo.getField(h,'storyDisplayName','')),LEGACY_TIR_LABEL:new HistogramGrouping('tir',h=>tr.v.d.TelemetryInfo.getField(h,'legacyTIRLabel','')),MASTER_NAME:new HistogramGrouping('master',h=>tr.v.d.BuildbotInfo.getField(h,'buildbotMasterName','')),SLAVE_NAME:new HistogramGrouping('bot',h=>tr.v.d.BuildbotInfo.getField(h,'buildbotName','')),BUILD_NUMBER:new HistogramGrouping('build',h=>tr.v.d.BuildbotInfo.getField(h,'buildNumber','')),DISPLAY_LABEL:new HistogramGrouping('label',h=>tr.v.d.TelemetryInfo.getField(h,'displayLabel','Value'))};return{HistogramGrouping,HistogramSet,};});'use strict';tr.exportTo('tr.e.chrome',function(){function hasTitleAndCategory(event,title,category){return event.title===title&&event.category&&tr.b.getCategoryParts(event.category).includes(category);}
+function getNavStartTimestamps(rendererHelper){const navStartTimestamps=[];for(const e of rendererHelper.mainThread.sliceGroup.childEvents()){if(hasTitleAndCategory(e,'navigationStart','blink.user_timing')){navStartTimestamps.push(e.start);}}
+return navStartTimestamps;}
+function getInteractiveTimestamps(model){const interactiveTimestampsMap=new Map();const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);for(const rendererHelper of Object.values(chromeHelper.rendererHelpers)){const timestamps=[];interactiveTimestampsMap.set(rendererHelper.pid,timestamps);const samples=tr.metrics.sh.collectLoadingMetricsForRenderer(rendererHelper).firstInteractiveSamples;for(const sample of samples){timestamps.push(sample.diagnostics['Navigation infos'].value.interactive);}}
+return interactiveTimestampsMap;}
+function getPostInteractiveTaskWindows(interactiveTimestamps,navStartTimestamps,traceEndTimestamp){let navStartTsIndex=0;let lastTaskWindowEndTs=undefined;const taskWindows=[];for(const currTTI of interactiveTimestamps){while(navStartTsIndex<navStartTimestamps.length&&navStartTimestamps[navStartTsIndex]<currTTI){navStartTsIndex++;}
+const taskWindowEndTs=navStartTsIndex<navStartTimestamps.length?navStartTimestamps[navStartTsIndex]:traceEndTimestamp;if(taskWindowEndTs===lastTaskWindowEndTs){throw Error('Encountered two consecutive interactive timestamps '+'with no navigationStart between them. '+'PostInteractiveTaskWindow is not well defined in this case.');}
+taskWindows.push(tr.b.math.Range.fromExplicitRange(currTTI,taskWindowEndTs));lastTaskWindowEndTs=taskWindowEndTs;}
+return taskWindows;}
+function contributionToEQT(window,task){const startInWindow=Math.max(window.min,task.start);const endInWindow=Math.min(window.max,task.end);const durationInWindow=endInWindow-startInWindow;if(durationInWindow<=0)return 0;const probabilityOfTask=durationInWindow/(window.max-window.min);const minQueueingTime=task.end-endInWindow;const maxQueueingTime=task.end-startInWindow;const expectedQueueingTimeDueToTask=(maxQueueingTime+minQueueingTime)/2;return probabilityOfTask*expectedQueueingTimeDueToTask;}
+function weightedExpectedQueueingTime(window,weightedTasks){let result=0;for(const task of weightedTasks){result+=contributionToEQT(window,task)*task.weight;}
+return result;}
+function expectedQueueingTime(window,tasks){return weightedExpectedQueueingTime(window,tasks.map(function(task){return{start:task.start,end:task.end,weight:1};}));}
+class SlidingWindow{constructor(startTime,windowSize,sortedTasks){this.windowSize_=windowSize;this.sortedTasks_=sortedTasks;this.range_=tr.b.math.Range.fromExplicitRange(startTime,startTime+windowSize);this.firstTaskIndex_=sortedTasks.findIndex(task=>startTime<task.end);if(this.firstTaskIndex_===-1){this.firstTaskIndex_=sortedTasks.length;}
+this.lastTaskIndex_=-1;while(this.lastTaskIndex_+1<sortedTasks.length&&sortedTasks[this.lastTaskIndex_+1].start<startTime+windowSize){this.lastTaskIndex_++;}
+this.innerEQT_=0;for(let i=this.firstTaskIndex_+1;i<this.lastTaskIndex_;i++){this.innerEQT_+=contributionToEQT(this.range_,sortedTasks[i]);}}
+get getEQT(){let firstTaskEQT=0;if(this.firstTaskIndex_<this.sortedTasks_.length){firstTaskEQT=contributionToEQT(this.range_,this.sortedTasks_[this.firstTaskIndex_]);}
+let lastTaskEQT=0;if(this.firstTaskIndex_<this.lastTaskIndex_){lastTaskEQT=contributionToEQT(this.range_,this.sortedTasks_[this.lastTaskIndex_]);}
+return firstTaskEQT+this.innerEQT_+lastTaskEQT;}
+slide(t){this.range_=tr.b.math.Range.fromExplicitRange(t,t+this.windowSize_);if(this.firstTaskIndex_<this.sortedTasks_.length&&this.sortedTasks_[this.firstTaskIndex_].end<=t){this.firstTaskIndex_++;if(this.firstTaskIndex_<this.lastTaskIndex_){this.innerEQT_-=contributionToEQT(this.range_,this.sortedTasks_[this.firstTaskIndex_]);}}
+if(this.lastTaskIndex_+1<this.sortedTasks_.length&&this.sortedTasks_[this.lastTaskIndex_+1].start<t+this.windowSize_){if(this.firstTaskIndex_<this.lastTaskIndex_){this.innerEQT_+=contributionToEQT(this.range_,this.sortedTasks_[this.lastTaskIndex_]);}
+this.lastTaskIndex_++;}}}
+function maxExpectedQueueingTimeInSlidingWindow(startTime,endTime,windowSize,tasks){if(windowSize<=0){throw Error('The window size must be positive number');}
+if(startTime+windowSize>endTime){throw Error('The sliding window must fit in the specified time range');}
+const sortedTasks=tasks.slice().sort((a,b)=>a.start-b.start);for(let i=1;i<sortedTasks.length;i++){const PRECISION_MS=0.1;if(sortedTasks[i-1].end>sortedTasks[i].start+PRECISION_MS){throw Error('Tasks must not overlap');}
+if(sortedTasks[i-1].end>sortedTasks[i].start){const midpoint=(sortedTasks[i-1].end+sortedTasks[i].start)/2;sortedTasks[i-1].end=midpoint;sortedTasks[i].start=midpoint;}}
+let endpoints=[];endpoints.push(startTime);endpoints.push(endTime-windowSize);for(const task of tasks){endpoints.push(task.start-windowSize);endpoints.push(task.start);endpoints.push(task.end-windowSize);endpoints.push(task.end);}
+endpoints=endpoints.filter(x=>(startTime<=x&&x+windowSize<=endTime));endpoints.sort((a,b)=>a-b);const slidingWindow=new SlidingWindow(endpoints[0],windowSize,sortedTasks);let maxEQT=0;for(const t of endpoints){slidingWindow.slide(t);maxEQT=Math.max(maxEQT,slidingWindow.getEQT);}
+return maxEQT;}
+return{getPostInteractiveTaskWindows,getNavStartTimestamps,getInteractiveTimestamps,expectedQueueingTime,maxExpectedQueueingTimeInSlidingWindow,weightedExpectedQueueingTime};});'use strict';tr.exportTo('tr.metrics.sh',function(){const WINDOW_SIZE_MS=500;const EQT_BOUNDARIES=tr.v.HistogramBinBoundaries.createExponential(0.01,WINDOW_SIZE_MS,50);const V8_EVENT_NAMES_TO_FILTERS=new Map([['v8',fromPredicate_(tr.metrics.v8.utils.isV8Event)],['v8:compile',fromPredicate_(tr.metrics.v8.utils.isCompileEvent)],['v8:compile:optimize',fromPredicate_(tr.metrics.v8.utils.isCompileOptimizeEvent)],['v8:compile:parse',fromPredicate_(tr.metrics.v8.utils.isCompileParseEvent)],['v8:compile:compile-unoptimize',filterCompileUnoptimizeAndSubtractParseEvents_],['v8:execute',fromPredicate_(tr.metrics.v8.utils.isV8ExecuteEvent)],['v8:gc',fromPredicate_(tr.metrics.v8.utils.isGarbageCollectionEvent)],['v8:gc:full-mark-compactor',fromPredicate_(tr.metrics.v8.utils.isFullMarkCompactorEvent)],['v8:gc:incremental-marking',fromPredicate_(tr.metrics.v8.utils.isIncrementalMarkingEvent)],['v8:gc:latency-mark-compactor',fromPredicate_(tr.metrics.v8.utils.isLatencyMarkCompactorEvent)],['v8:gc:memory-mark-compactor',fromPredicate_(tr.metrics.v8.utils.isMemoryMarkCompactorEvent)],['v8:gc:scavenger',fromPredicate_(tr.metrics.v8.utils.isScavengerEvent)]]);function fromPredicate_(eventPredicate){return function(slice){const duration=durationOfTopmostSubSlices(slice,eventPredicate);return{start:slice.start,end:slice.start+duration};};}
+function filterCompileUnoptimizeAndSubtractParseEvents_(slice){const duration=durationOfTopmostSubSlices(slice,tr.metrics.v8.utils.isCompileUnoptimizeEvent,tr.metrics.v8.utils.isCompileParseEvent);return{start:slice.start,end:slice.start+duration};}
+function containsForcedGC_(slice){return slice.findTopmostSlicesRelativeToThisSlice(tr.metrics.v8.utils.isForcedGarbageCollectionEvent).length>0;}
+function createHistogramForEQT_(name,description){const histogram=new tr.v.Histogram(name,tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,EQT_BOUNDARIES);histogram.customizeSummaryOptions({avg:false,count:false,max:true,min:false,std:false,sum:false,});histogram.description=description;return histogram;}
+function expectedQueueingTimeMetric(histograms,model){const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);const totalHistogram=createHistogramForEQT_(`total:${WINDOW_SIZE_MS}ms_window:renderer_eqt`,`The maximum EQT in a ${WINDOW_SIZE_MS}ms sliding window`+' for a given renderer');const interactiveHistogram=createHistogramForEQT_(`interactive:${WINDOW_SIZE_MS}ms_window:renderer_eqt`,`The maximum EQT in a ${WINDOW_SIZE_MS}ms sliding window`+' for a given renderer while the page is interactive');const rendererHelpers=Object.values(chromeHelper.rendererHelpers);const rendererToInteractiveTimestamps=tr.e.chrome.getInteractiveTimestamps(model);for(const rendererHelper of rendererHelpers){if(rendererHelper.isChromeTracingUI)continue;const tasks=rendererHelper.mainThread.sliceGroup.topLevelSlices.filter(slice=>slice.duration>0&&!containsForcedGC_(slice)).map(slice=>{return{start:slice.start,end:slice.end};});totalHistogram.addSample(tr.e.chrome.maxExpectedQueueingTimeInSlidingWindow(rendererHelper.mainThread.bounds.min,rendererHelper.mainThread.bounds.max,WINDOW_SIZE_MS,tasks));const interactiveTimestamps=rendererToInteractiveTimestamps.get(rendererHelper.pid);if(interactiveTimestamps.length===0)continue;if(interactiveTimestamps.length>1){continue;}
+const interactiveWindow=tr.b.math.Range.fromExplicitRange(interactiveTimestamps[0],Infinity).findIntersection(rendererHelper.mainThread.bounds);interactiveHistogram.addSample(tr.e.chrome.maxExpectedQueueingTimeInSlidingWindow(interactiveWindow.min,interactiveWindow.max,WINDOW_SIZE_MS,tasks));}
+addV8ContributionToExpectedQueueingTime(totalHistogram,interactiveHistogram,rendererToInteractiveTimestamps,histograms,model);histograms.addHistogram(totalHistogram);histograms.addHistogram(interactiveHistogram);}
+function addV8ContributionToExpectedQueueingTime(totalEqtHistogram,interactiveEqtHistogram,rendererToInteractiveTimestamps,histograms,model){if(!model.categories.includes('v8'))return;const breakdownForTotal=new tr.v.d.RelatedHistogramMap();const breakdownForInteractive=new tr.v.d.RelatedHistogramMap();for(const[eventName,filterFunction]of V8_EVENT_NAMES_TO_FILTERS){const contribution=contributionToExpectedQueueingTime(filterFunction,eventName,rendererToInteractiveTimestamps,histograms,model);breakdownForTotal.set(eventName,contribution.total);breakdownForInteractive.set(eventName,contribution.interactive);}
+totalEqtHistogram.diagnostics.set('v8',breakdownForTotal);interactiveEqtHistogram.diagnostics.set('v8',breakdownForInteractive);}
+function durationOfTopmostSubSlices(slice,predicate,subEventPredicate){let duration=0;for(const sub of slice.findTopmostSlicesRelativeToThisSlice(predicate)){duration+=sub.duration;if(subEventPredicate!==null&&subEventPredicate!==undefined){duration-=durationOfTopmostSubSlices(sub,subEventPredicate);}}
+return duration;}
+function contributionToExpectedQueueingTime(filterFunction,eventName,rendererToInteractiveTimestamps,histograms,model){const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);const totalHistogram=createHistogramForEQT_(`total:${WINDOW_SIZE_MS}ms_window:renderer_eqt:${eventName}`,`Contribution to the expected queueing time by ${eventName}`+' for a given renderer. It is computed as the maximum EQT in'+` a ${WINDOW_SIZE_MS}ms sliding window after shrinking top-level`+` tasks to contain only ${eventName} subevents`);const interactiveHistogram=createHistogramForEQT_(`interactive:${WINDOW_SIZE_MS}ms_window:renderer_eqt:${eventName}`,`Contribution to the expected queueing time by ${eventName}`+' for a given renderer while the page is interactive. It is computed'+` as the maximum EQT in a ${WINDOW_SIZE_MS}ms sliding window after`+` shrinking top-level tasks to contain only ${eventName} subevents`);const rendererHelpers=Object.values(chromeHelper.rendererHelpers);for(const rendererHelper of rendererHelpers){if(rendererHelper.isChromeTracingUI)continue;const tasks=rendererHelper.mainThread.sliceGroup.topLevelSlices.filter(slice=>slice.duration>0&&!containsForcedGC_(slice)).map(filterFunction);totalHistogram.addSample(tr.e.chrome.maxExpectedQueueingTimeInSlidingWindow(rendererHelper.mainThread.bounds.min,rendererHelper.mainThread.bounds.max,WINDOW_SIZE_MS,tasks));const interactiveTimestamps=rendererToInteractiveTimestamps.get(rendererHelper.pid);if(interactiveTimestamps.length===0)continue;if(interactiveTimestamps.length>1){continue;}
+const interactiveWindow=tr.b.math.Range.fromExplicitRange(interactiveTimestamps[0],Infinity).findIntersection(rendererHelper.mainThread.bounds);interactiveHistogram.addSample(tr.e.chrome.maxExpectedQueueingTimeInSlidingWindow(interactiveWindow.min,interactiveWindow.max,WINDOW_SIZE_MS,tasks));}
+histograms.addHistogram(totalHistogram);histograms.addHistogram(interactiveHistogram);return{total:totalHistogram,interactive:interactiveHistogram};}
+tr.metrics.MetricRegistry.register(expectedQueueingTimeMetric);return{expectedQueueingTimeMetric,contributionToExpectedQueueingTime,};});'use strict';tr.exportTo('tr.metrics.sh',function(){const LONG_TASK_MS=50;const LONGEST_TASK_MS=1000;function iterateLongTopLevelTasksOnThreadInRange(thread,opt_range,cb,opt_this){thread.sliceGroup.topLevelSlices.forEach(function(slice){if(opt_range&&!opt_range.intersectsExplicitRangeInclusive(slice.start,slice.end)){return;}
+if(slice.duration<LONG_TASK_MS)return;cb.call(opt_this,slice);});}
+function iterateRendererMainThreads(model,cb,opt_this){const modelHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);if(modelHelper!==undefined){Object.values(modelHelper.rendererHelpers).forEach(function(rendererHelper){if(!rendererHelper.mainThread)return;cb.call(opt_this,rendererHelper.mainThread);});}}
+function longTasksMetric(histograms,model,opt_options){const rangeOfInterest=opt_options?opt_options.rangeOfInterest:undefined;const longTaskHist=new tr.v.Histogram('long tasks',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,tr.v.HistogramBinBoundaries.createLinear(LONG_TASK_MS,LONGEST_TASK_MS,40));longTaskHist.description='durations of long tasks';const slices=new tr.model.EventSet();iterateRendererMainThreads(model,function(thread){iterateLongTopLevelTasksOnThreadInRange(thread,rangeOfInterest,function(task){longTaskHist.addSample(task.duration,{relatedEvents:new tr.v.d.RelatedEventSet([task])});slices.push(task);slices.addEventSet(task.descendentSlices);});});histograms.addHistogram(longTaskHist);const sampleForEvent=undefined;const breakdown=tr.v.d.RelatedHistogramBreakdown.buildFromEvents(histograms,'long tasks ',slices,e=>(model.getUserFriendlyCategoryFromEvent(e)||'unknown'),tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,sampleForEvent,tr.v.HistogramBinBoundaries.createExponential(1,LONGEST_TASK_MS,40));breakdown.colorScheme=tr.v.d.COLOR_SCHEME_CHROME_USER_FRIENDLY_CATEGORY_DRIVER;longTaskHist.diagnostics.set('category',breakdown);}
+tr.metrics.MetricRegistry.register(longTasksMetric,{supportsRangeOfInterest:true});return{longTasksMetric,iterateLongTopLevelTasksOnThreadInRange,iterateRendererMainThreads,LONG_TASK_MS,LONGEST_TASK_MS,};});'use strict';tr.exportTo('tr.b',function(){function MultiDimensionalViewNode(title,valueCount){this.title=title;const dimensions=title.length;this.children=new Array(dimensions);for(let i=0;i<dimensions;i++){this.children[i]=new Map();}
+this.values=new Array(valueCount);for(let v=0;v<valueCount;v++){this.values[v]={self:0,total:0,totalState:NOT_PROVIDED};}}
+MultiDimensionalViewNode.TotalState={NOT_PROVIDED:0,LOWER_BOUND:1,EXACT:2};const NOT_PROVIDED=MultiDimensionalViewNode.TotalState.NOT_PROVIDED;const LOWER_BOUND=MultiDimensionalViewNode.TotalState.LOWER_BOUND;const EXACT=MultiDimensionalViewNode.TotalState.EXACT;MultiDimensionalViewNode.prototype={get subRows(){return tr.b.mapValues(this.children[0]);}};function MultiDimensionalViewBuilder(dimensions,valueCount){if(typeof(dimensions)!=='number'||dimensions<0){throw new Error('Dimensions must be a non-negative number');}
+this.dimensions_=dimensions;if(typeof(valueCount)!=='number'||valueCount<0){throw new Error('Number of values must be a non-negative number');}
+this.valueCount_=valueCount;this.buildRoot_=this.createRootNode_();this.topDownTreeViewRoot_=undefined;this.topDownHeavyViewRoot_=undefined;this.bottomUpHeavyViewNode_=undefined;this.complete_=false;this.maxDimensionDepths_=new Array(dimensions);for(let d=0;d<dimensions;d++){this.maxDimensionDepths_[d]=0;}}
+MultiDimensionalViewBuilder.ValueKind={SELF:0,TOTAL:1};MultiDimensionalViewBuilder.ViewType={TOP_DOWN_TREE_VIEW:0,TOP_DOWN_HEAVY_VIEW:1,BOTTOM_UP_HEAVY_VIEW:2};MultiDimensionalViewBuilder.prototype={addPath(path,values,valueKind){if(this.buildRoot_===undefined){throw new Error('Paths cannot be added after either view has been built');}
+if(path.length!==this.dimensions_){throw new Error('Path must be '+this.dimensions_+'-dimensional');}
+if(values.length!==this.valueCount_){throw new Error('Must provide '+this.valueCount_+' values');}
+let isTotal;switch(valueKind){case MultiDimensionalViewBuilder.ValueKind.SELF:isTotal=false;break;case MultiDimensionalViewBuilder.ValueKind.TOTAL:isTotal=true;break;default:throw new Error('Invalid value kind: '+valueKind);}
+let node=this.buildRoot_;for(let d=0;d<path.length;d++){const singleDimensionPath=path[d];const singleDimensionPathLength=singleDimensionPath.length;this.maxDimensionDepths_[d]=Math.max(this.maxDimensionDepths_[d],singleDimensionPathLength);for(let i=0;i<singleDimensionPathLength;i++){node=this.getOrCreateChildNode_(node,d,singleDimensionPath[i]);}}
+for(let v=0;v<this.valueCount_;v++){const addedValue=values[v];if(addedValue===undefined)continue;const nodeValue=node.values[v];if(isTotal){nodeValue.total+=addedValue;nodeValue.totalState=EXACT;}else{nodeValue.self+=addedValue;nodeValue.totalState=Math.max(nodeValue.totalState,LOWER_BOUND);}}},get complete(){return this.complete_;},set complete(isComplete){if(this.buildRoot_===undefined){throw new Error('Can\'t set complete after any view has been built.');}
+this.complete_=isComplete;},buildView(viewType){switch(viewType){case MultiDimensionalViewBuilder.ViewType.TOP_DOWN_TREE_VIEW:return this.buildTopDownTreeView();case MultiDimensionalViewBuilder.ViewType.TOP_DOWN_HEAVY_VIEW:return this.buildTopDownHeavyView();case MultiDimensionalViewBuilder.ViewType.BOTTOM_UP_HEAVY_VIEW:return this.buildBottomUpHeavyView();default:throw new Error('Unknown multi-dimensional view type: '+viewType);}},buildTopDownTreeView(){if(this.topDownTreeViewRoot_===undefined){const treeViewRoot=this.buildRoot_;this.buildRoot_=undefined;this.setUpMissingChildRelationships_(treeViewRoot,0);this.finalizeTotalValues_(treeViewRoot,0,new WeakMap());this.topDownTreeViewRoot_=treeViewRoot;}
+return this.topDownTreeViewRoot_;},buildTopDownHeavyView(){if(this.topDownHeavyViewRoot_===undefined){this.topDownHeavyViewRoot_=this.buildGenericHeavyView_(this.addDimensionToTopDownHeavyViewNode_.bind(this));}
+return this.topDownHeavyViewRoot_;},buildBottomUpHeavyView(){if(this.bottomUpHeavyViewNode_===undefined){this.bottomUpHeavyViewNode_=this.buildGenericHeavyView_(this.addDimensionToBottomUpHeavyViewNode_.bind(this));}
+return this.bottomUpHeavyViewNode_;},createRootNode_(){return new MultiDimensionalViewNode(new Array(this.dimensions_),this.valueCount_);},getOrCreateChildNode_(parentNode,dimension,childDimensionTitle){if(dimension<0||dimension>=this.dimensions_){throw new Error('Invalid dimension');}
+const dimensionChildren=parentNode.children[dimension];let childNode=dimensionChildren.get(childDimensionTitle);if(childNode!==undefined){return childNode;}
+const childTitle=parentNode.title.slice();childTitle[dimension]=childDimensionTitle;childNode=new MultiDimensionalViewNode(childTitle,this.valueCount_);dimensionChildren.set(childDimensionTitle,childNode);return childNode;},setUpMissingChildRelationships_(node,firstDimensionToSetUp){for(let d=firstDimensionToSetUp;d<this.dimensions_;d++){const currentDimensionChildTitles=new Set(node.children[d].keys());for(let i=0;i<d;i++){for(const previousDimensionChildNode of node.children[i].values()){for(const previousDimensionGrandChildTitle of
+previousDimensionChildNode.children[d].keys()){currentDimensionChildTitles.add(previousDimensionGrandChildTitle);}}}
+for(const currentDimensionChildTitle of currentDimensionChildTitles){const currentDimensionChildNode=this.getOrCreateChildNode_(node,d,currentDimensionChildTitle);for(let i=0;i<d;i++){for(const previousDimensionChildNode of
+node.children[i].values()){const previousDimensionGrandChildNode=previousDimensionChildNode.children[d].get(currentDimensionChildTitle);if(previousDimensionGrandChildNode!==undefined){currentDimensionChildNode.children[i].set(previousDimensionChildNode.title[i],previousDimensionGrandChildNode);}}}
+this.setUpMissingChildRelationships_(currentDimensionChildNode,d);}}},finalizeTotalValues_(node,firstDimensionToFinalize,dimensionalSelfSumsMap){const dimensionalSelfSums=new Array(this.dimensions_);const minResidual=new Array(this.valueCount_);for(let v=0;v<this.valueCount_;v++)minResidual[v]=0;const nodeValues=node.values;const nodeSelfSums=new Array(this.valueCount_);for(let v=0;v<this.valueCount_;v++){nodeSelfSums[v]=nodeValues[v].self;}
+for(let d=0;d<this.dimensions_;d++){const childResidualSums=new Array(this.valueCount_);for(let v=0;v<this.valueCount_;v++){childResidualSums[v]=0;}
+for(const childNode of node.children[d].values()){if(d>=firstDimensionToFinalize){this.finalizeTotalValues_(childNode,d,dimensionalSelfSumsMap);}
+const childNodeSelfSums=dimensionalSelfSumsMap.get(childNode);const childNodeValues=childNode.values;for(let v=0;v<this.valueCount_;v++){nodeSelfSums[v]+=childNodeSelfSums[d][v];const residual=childNodeValues[v].total-
+childNodeSelfSums[this.dimensions_-1][v];childResidualSums[v]+=residual;if(this.complete){nodeValues[v].totalState=EXACT;}else if(childNodeValues[v].totalState>NOT_PROVIDED){nodeValues[v].totalState=Math.max(nodeValues[v].totalState,LOWER_BOUND);}}}
+dimensionalSelfSums[d]=nodeSelfSums.slice();for(let v=0;v<this.valueCount_;v++){minResidual[v]=Math.max(minResidual[v],childResidualSums[v]);}}
+for(let v=0;v<this.valueCount_;v++){nodeValues[v].total=Math.max(nodeValues[v].total,nodeSelfSums[v]+minResidual[v]);}
+if(dimensionalSelfSumsMap.has(node)){throw new Error('Internal error: Node finalized more than once');}
+dimensionalSelfSumsMap.set(node,dimensionalSelfSums);},buildGenericHeavyView_(treeViewNodeHandler){const treeViewRoot=this.buildTopDownTreeView();const heavyViewRoot=this.createRootNode_();heavyViewRoot.values=treeViewRoot.values;const recursionDepthTrackers=new Array(this.dimensions_);for(let d=0;d<this.dimensions_;d++){recursionDepthTrackers[d]=new RecursionDepthTracker(this.maxDimensionDepths_[d],d);}
+this.addDimensionsToGenericHeavyViewNode_(treeViewRoot,heavyViewRoot,0,recursionDepthTrackers,false,treeViewNodeHandler);this.setUpMissingChildRelationships_(heavyViewRoot,0);return heavyViewRoot;},addDimensionsToGenericHeavyViewNode_(treeViewParentNode,heavyViewParentNode,startDimension,recursionDepthTrackers,previousDimensionsRecursive,treeViewNodeHandler){for(let d=startDimension;d<this.dimensions_;d++){this.addDimensionDescendantsToGenericHeavyViewNode_(treeViewParentNode,heavyViewParentNode,d,recursionDepthTrackers,previousDimensionsRecursive,treeViewNodeHandler);}},addDimensionDescendantsToGenericHeavyViewNode_(treeViewParentNode,heavyViewParentNode,currentDimension,recursionDepthTrackers,previousDimensionsRecursive,treeViewNodeHandler){const treeViewChildren=treeViewParentNode.children[currentDimension];const recursionDepthTracker=recursionDepthTrackers[currentDimension];for(const treeViewChildNode of treeViewChildren.values()){recursionDepthTracker.push(treeViewChildNode);treeViewNodeHandler(treeViewChildNode,heavyViewParentNode,currentDimension,recursionDepthTrackers,previousDimensionsRecursive);this.addDimensionDescendantsToGenericHeavyViewNode_(treeViewChildNode,heavyViewParentNode,currentDimension,recursionDepthTrackers,previousDimensionsRecursive,treeViewNodeHandler);recursionDepthTracker.pop();}},addDimensionToTopDownHeavyViewNode_(treeViewChildNode,heavyViewParentNode,currentDimension,recursionDepthTrackers,previousDimensionsRecursive){this.addDimensionToTopDownHeavyViewNodeRecursively_(treeViewChildNode,heavyViewParentNode,currentDimension,recursionDepthTrackers,previousDimensionsRecursive,1);},addDimensionToTopDownHeavyViewNodeRecursively_(treeViewChildNode,heavyViewParentNode,currentDimension,recursionDepthTrackers,previousDimensionsRecursive,subTreeDepth){const recursionDepthTracker=recursionDepthTrackers[currentDimension];const currentDimensionRecursive=subTreeDepth<=recursionDepthTracker.recursionDepth;const currentOrPreviousDimensionsRecursive=currentDimensionRecursive||previousDimensionsRecursive;const dimensionTitle=treeViewChildNode.title[currentDimension];const heavyViewChildNode=this.getOrCreateChildNode_(heavyViewParentNode,currentDimension,dimensionTitle);this.addNodeValues_(treeViewChildNode,heavyViewChildNode,!currentOrPreviousDimensionsRecursive);this.addDimensionsToGenericHeavyViewNode_(treeViewChildNode,heavyViewChildNode,currentDimension+1,recursionDepthTrackers,currentOrPreviousDimensionsRecursive,this.addDimensionToTopDownHeavyViewNode_.bind(this));for(const treeViewGrandChildNode of
+treeViewChildNode.children[currentDimension].values()){recursionDepthTracker.push(treeViewGrandChildNode);this.addDimensionToTopDownHeavyViewNodeRecursively_(treeViewGrandChildNode,heavyViewChildNode,currentDimension,recursionDepthTrackers,previousDimensionsRecursive,subTreeDepth+1);recursionDepthTracker.pop();}},addDimensionToBottomUpHeavyViewNode_(treeViewChildNode,heavyViewParentNode,currentDimension,recursionDepthTrackers,previousDimensionsRecursive){const recursionDepthTracker=recursionDepthTrackers[currentDimension];const bottomIndex=recursionDepthTracker.bottomIndex;const topIndex=recursionDepthTracker.topIndex;const firstNonRecursiveIndex=bottomIndex+recursionDepthTracker.recursionDepth;const viewNodePath=recursionDepthTracker.viewNodePath;const trackerAncestorNode=recursionDepthTracker.trackerAncestorNode;let heavyViewDescendantNode=heavyViewParentNode;for(let i=bottomIndex;i<topIndex;i++){const treeViewAncestorNode=viewNodePath[i];const dimensionTitle=treeViewAncestorNode.title[currentDimension];heavyViewDescendantNode=this.getOrCreateChildNode_(heavyViewDescendantNode,currentDimension,dimensionTitle);const currentDimensionRecursive=i<firstNonRecursiveIndex;const currentOrPreviousDimensionsRecursive=currentDimensionRecursive||previousDimensionsRecursive;this.addNodeValues_(treeViewChildNode,heavyViewDescendantNode,!currentOrPreviousDimensionsRecursive);this.addDimensionsToGenericHeavyViewNode_(treeViewChildNode,heavyViewDescendantNode,currentDimension+1,recursionDepthTrackers,currentOrPreviousDimensionsRecursive,this.addDimensionToBottomUpHeavyViewNode_.bind(this));}},addNodeValues_(sourceNode,targetNode,addTotal){const targetNodeValues=targetNode.values;const sourceNodeValues=sourceNode.values;for(let v=0;v<this.valueCount_;v++){const targetNodeValue=targetNodeValues[v];const sourceNodeValue=sourceNodeValues[v];targetNodeValue.self+=sourceNodeValue.self;if(addTotal){targetNodeValue.total+=sourceNodeValue.total;if(this.complete){targetNodeValue.totalState=EXACT;}else if(sourceNodeValue.totalState>NOT_PROVIDED){targetNodeValue.totalState=Math.max(targetNodeValue.totalState,LOWER_BOUND);}}}}};function RecursionDepthTracker(maxDepth,dimension){this.titlePath=new Array(maxDepth);this.viewNodePath=new Array(maxDepth);this.bottomIndex=this.topIndex=maxDepth;this.dimension_=dimension;this.currentTrackerNode_=this.createNode_(0,undefined);}
+RecursionDepthTracker.prototype={push(viewNode){if(this.bottomIndex===0){throw new Error('Cannot push to a full tracker');}
+const title=viewNode.title[this.dimension_];this.bottomIndex--;this.titlePath[this.bottomIndex]=title;this.viewNodePath[this.bottomIndex]=viewNode;let childTrackerNode=this.currentTrackerNode_.children.get(title);if(childTrackerNode!==undefined){this.currentTrackerNode_=childTrackerNode;return;}
+const maxLengths=zFunction(this.titlePath,this.bottomIndex);let recursionDepth=0;for(let i=0;i<maxLengths.length;i++){recursionDepth=Math.max(recursionDepth,maxLengths[i]);}
+childTrackerNode=this.createNode_(recursionDepth,this.currentTrackerNode_);this.currentTrackerNode_.children.set(title,childTrackerNode);this.currentTrackerNode_=childTrackerNode;},pop(){if(this.bottomIndex===this.topIndex){throw new Error('Cannot pop from an empty tracker');}
+this.titlePath[this.bottomIndex]=undefined;this.viewNodePath[this.bottomIndex]=undefined;this.bottomIndex++;this.currentTrackerNode_=this.currentTrackerNode_.parent;},get recursionDepth(){return this.currentTrackerNode_.recursionDepth;},createNode_(recursionDepth,parent){return{recursionDepth,parent,children:new Map()};}};function zFunction(list,startIndex){const n=list.length-startIndex;if(n===0)return[];const z=new Array(n);z[0]=0;for(let i=1,left=0,right=0;i<n;++i){let maxLength;if(i<=right){maxLength=Math.min(right-i+1,z[i-left]);}else{maxLength=0;}
+while(i+maxLength<n&&list[startIndex+maxLength]===list[startIndex+i+maxLength]){++maxLength;}
+if(i+maxLength-1>right){left=i;right=i+maxLength-1;}
+z[i]=maxLength;}
+return z;}
+return{MultiDimensionalViewBuilder,MultiDimensionalViewNode,RecursionDepthTracker,zFunction,};});'use strict';tr.exportTo('tr.b',function(){class FixedColorScheme{constructor(namesToColors){this.namesToColors_=namesToColors;}
+static fromNames(names){const namesToColors=new Map();const generator=new tr.b.SinebowColorGenerator();for(const name of names){namesToColors.set(name,generator.colorForKey(name));}
+return new FixedColorScheme(namesToColors);}
+getColor(name){const color=this.namesToColors_.get(name);if(color===undefined)throw new Error('Unknown color: '+name);return color;}}
+const MemoryColumnColorScheme=new FixedColorScheme(new Map([['used_memory_column',new tr.b.Color(0,0,255)],['older_used_memory_column',new tr.b.Color(153,204,255)],['tracing_memory_column',new tr.b.Color(153,153,153)]]));function FixedColorSchemeRegistry(){}
+FixedColorSchemeRegistry.lookUp=function(name){const info=this.findTypeInfoMatching(info=>info.metadata.name===name);if(!info)return undefined;return info.constructor();};const options=new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE);tr.b.decorateExtensionRegistry(FixedColorSchemeRegistry,options);return{MemoryColumnColorScheme,FixedColorScheme,FixedColorSchemeRegistry,};});'use strict';tr.exportTo('tr.e.chrome.chrome_processes',function(){const CHROME_PROCESS_NAMES={BROWSER:'browser_process',RENDERER:'renderer_processes',ALL:'all_processes',GPU:'gpu_process',PPAPI:'ppapi_process',UNKNOWN:'unknown_processes',};const PROCESS_COLOR_SCHEME_NAME='ChromeProcessNames';const PROCESS_COLOR_SCHEME=tr.b.FixedColorScheme.fromNames(Object.values(CHROME_PROCESS_NAMES));tr.b.FixedColorSchemeRegistry.register(()=>PROCESS_COLOR_SCHEME,{name:PROCESS_COLOR_SCHEME_NAME,});function canonicalizeName(name){return name.toLowerCase().replace(' ','_');}
+function canonicalizeProcessName(rawProcessName){if(!rawProcessName)return CHROME_PROCESS_NAMES.UNKNOWN;const baseCanonicalName=canonicalizeName(rawProcessName);switch(baseCanonicalName){case'renderer':return CHROME_PROCESS_NAMES.RENDERER;case'browser':return CHROME_PROCESS_NAMES.BROWSER;}
+if(Object.values(CHROME_PROCESS_NAMES).includes(baseCanonicalName)){return baseCanonicalName;}
+throw new Error(`Unknown process name "${baseCanonicalName}".`+' Please add it to |CHROME_PROCESS_NAMES|.');}
+return{CHROME_PROCESS_NAMES,PROCESS_COLOR_SCHEME,PROCESS_COLOR_SCHEME_NAME,canonicalizeName,canonicalizeProcessName,};});'use strict';tr.exportTo('tr.metrics.sh',function(){const BACKGROUND=tr.model.ContainerMemoryDump.LevelOfDetail.BACKGROUND;const LIGHT=tr.model.ContainerMemoryDump.LevelOfDetail.LIGHT;const DETAILED=tr.model.ContainerMemoryDump.LevelOfDetail.DETAILED;const sizeInBytes_smallerIsBetter=tr.b.Unit.byName.sizeInBytes_smallerIsBetter;const count_smallerIsBetter=tr.b.Unit.byName.count_smallerIsBetter;const DISPLAYED_SIZE_NUMERIC_NAME=tr.model.MemoryAllocatorDump.DISPLAYED_SIZE_NUMERIC_NAME;const LEVEL_OF_DETAIL_NAMES=new Map();LEVEL_OF_DETAIL_NAMES.set(BACKGROUND,'background');LEVEL_OF_DETAIL_NAMES.set(LIGHT,'light');LEVEL_OF_DETAIL_NAMES.set(DETAILED,'detailed');const HEAP_PROFILER_DETAIL_NAME='heap_profiler';const BOUNDARIES_FOR_UNIT_MAP=new WeakMap();BOUNDARIES_FOR_UNIT_MAP.set(count_smallerIsBetter,tr.v.HistogramBinBoundaries.createLinear(0,20,20));BOUNDARIES_FOR_UNIT_MAP.set(sizeInBytes_smallerIsBetter,new tr.v.HistogramBinBoundaries(0).addBinBoundary(1024).addExponentialBins(16*1024*1024*1024,4*24));const CHROME_PROCESS_NAMES=tr.e.chrome.chrome_processes.CHROME_PROCESS_NAMES;function memoryMetric(values,model,opt_options){const rangeOfInterest=opt_options?opt_options.rangeOfInterest:undefined;const browserNameToGlobalDumps=splitGlobalDumpsByBrowserName(model,rangeOfInterest);addGeneralMemoryDumpValues(browserNameToGlobalDumps,values);addDetailedMemoryDumpValues(browserNameToGlobalDumps,values);addMemoryDumpCountValues(browserNameToGlobalDumps,values);}
+function splitGlobalDumpsByBrowserName(model,opt_rangeOfInterest){const chromeModelHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);const browserNameToGlobalDumps=new Map();const globalDumpToBrowserHelper=new WeakMap();if(chromeModelHelper){chromeModelHelper.browserHelpers.forEach(function(helper){const globalDumps=skipDumpsThatDoNotIntersectRange(helper.process.memoryDumps.map(d=>d.globalMemoryDump),opt_rangeOfInterest);globalDumps.forEach(function(globalDump){const existingHelper=globalDumpToBrowserHelper.get(globalDump);if(existingHelper!==undefined){throw new Error('Memory dump ID clash across multiple browsers '+'with PIDs: '+existingHelper.pid+' and '+helper.pid);}
+globalDumpToBrowserHelper.set(globalDump,helper);});makeKeyUniqueAndSet(browserNameToGlobalDumps,tr.e.chrome.chrome_processes.canonicalizeName(helper.browserName),globalDumps);});}
+const unclassifiedGlobalDumps=skipDumpsThatDoNotIntersectRange(model.globalMemoryDumps.filter(g=>!globalDumpToBrowserHelper.has(g)),opt_rangeOfInterest);if(unclassifiedGlobalDumps.length>0){makeKeyUniqueAndSet(browserNameToGlobalDumps,'unknown_browser',unclassifiedGlobalDumps);}
+return browserNameToGlobalDumps;}
+function skipDumpsThatDoNotIntersectRange(dumps,opt_range){if(!opt_range)return dumps;return dumps.filter(d=>opt_range.intersectsExplicitRangeInclusive(d.start,d.end));}
+const USER_FRIENDLY_BROWSER_NAMES={'chrome':'Chrome','webview':'WebView','unknown_browser':'an unknown browser'};function convertBrowserNameToUserFriendlyName(browserName){for(const baseName in USER_FRIENDLY_BROWSER_NAMES){if(!browserName.startsWith(baseName))continue;const userFriendlyBaseName=USER_FRIENDLY_BROWSER_NAMES[baseName];const suffix=browserName.substring(baseName.length);if(suffix.length===0){return userFriendlyBaseName;}else if(/^\d+$/.test(suffix)){return userFriendlyBaseName+'('+suffix+')';}}
+return'\''+browserName+'\' browser';}
+function convertProcessNameToUserFriendlyName(processName,opt_requirePlural){switch(processName){case CHROME_PROCESS_NAMES.BROWSER:return opt_requirePlural?'browser processes':'the browser process';case CHROME_PROCESS_NAMES.RENDERER:return'renderer processes';case CHROME_PROCESS_NAMES.GPU:return opt_requirePlural?'GPU processes':'the GPU process';case CHROME_PROCESS_NAMES.PPAPI:return opt_requirePlural?'PPAPI processes':'the PPAPI process';case CHROME_PROCESS_NAMES.ALL:return'all processes';case CHROME_PROCESS_NAMES.UNKNOWN:return'unknown processes';default:return'\''+processName+'\' processes';}}
+function makeKeyUniqueAndSet(map,key,value){let uniqueKey=key;let nextIndex=2;while(map.has(uniqueKey)){uniqueKey=key+nextIndex;nextIndex++;}
+map.set(uniqueKey,value);}
+function addGeneralMemoryDumpValues(browserNameToGlobalDumps,values){addMemoryDumpValues(browserNameToGlobalDumps,gmd=>true,function(processDump,addProcessScalar){addProcessScalar({source:'process_count',property:PROCESS_COUNT,value:1});if(processDump.totals!==undefined){addProcessScalar({source:'reported_by_os',property:RESIDENT_SIZE,component:['system_memory'],value:processDump.totals.residentBytes});addProcessScalar({source:'reported_by_os',property:PEAK_RESIDENT_SIZE,component:['system_memory'],value:processDump.totals.peakResidentBytes});}
+if(processDump.memoryAllocatorDumps===undefined)return;processDump.memoryAllocatorDumps.forEach(function(rootAllocatorDump){CHROME_VALUE_PROPERTIES.forEach(function(property){addProcessScalar({source:'reported_by_chrome',component:[rootAllocatorDump.name],property,value:rootAllocatorDump.numerics[property.name]});});if(rootAllocatorDump.numerics.allocated_objects_size===undefined){const allocatedObjectsDump=rootAllocatorDump.getDescendantDumpByFullName('allocated_objects');if(allocatedObjectsDump!==undefined){addProcessScalar({source:'reported_by_chrome',component:[rootAllocatorDump.name],property:ALLOCATED_OBJECTS_SIZE,value:allocatedObjectsDump.numerics.size});}}});addV8MemoryDumpValues(processDump,addProcessScalar);},function(componentTree){const tracingNode=componentTree.children[1].get('tracing');if(tracingNode===undefined)return;for(let i=0;i<componentTree.values.length;i++){componentTree.values[i].total-=tracingNode.values[i].total;}},values);}
+function addV8MemoryDumpValues(processDump,addProcessScalar){const v8Dump=processDump.getMemoryAllocatorDumpByFullName('v8');if(v8Dump===undefined)return;v8Dump.children.forEach(function(isolateDump){const mallocDump=isolateDump.getDescendantDumpByFullName('malloc');if(mallocDump!==undefined){addV8ComponentValues(mallocDump,['v8','allocated_by_malloc'],addProcessScalar);}
+const heapDump=isolateDump.getDescendantDumpByFullName('heap_spaces');if(heapDump!==undefined){addV8ComponentValues(heapDump,['v8','heap'],addProcessScalar);heapDump.children.forEach(function(spaceDump){if(spaceDump.name==='other_spaces')return;addV8ComponentValues(spaceDump,['v8','heap',spaceDump.name],addProcessScalar);});}});addProcessScalar({source:'reported_by_chrome',component:['v8'],property:CODE_AND_METADATA_SIZE,value:v8Dump.numerics.code_and_metadata_size});addProcessScalar({source:'reported_by_chrome',component:['v8'],property:CODE_AND_METADATA_SIZE,value:v8Dump.numerics.bytecode_and_metadata_size});}
+function addV8ComponentValues(componentDump,componentPath,addProcessScalar){CHROME_VALUE_PROPERTIES.forEach(function(property){addProcessScalar({source:'reported_by_chrome',component:componentPath,property,value:componentDump.numerics[property.name]});});}
+const PROCESS_COUNT={unit:count_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){if(componentPath.length>0){throw new Error('Unexpected process count non-empty component path: '+
+componentPath.join(':'));}
+return'total number of '+convertProcessNameToUserFriendlyName(processName,true);}};const EFFECTIVE_SIZE={name:'effective_size',unit:sizeInBytes_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){return buildChromeValueDescriptionPrefix(componentPath,processName,{userFriendlyPropertyName:'effective size',componentPreposition:'of'});}};const ALLOCATED_OBJECTS_SIZE={name:'allocated_objects_size',unit:sizeInBytes_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){return buildChromeValueDescriptionPrefix(componentPath,processName,{userFriendlyPropertyName:'size of all objects allocated',totalUserFriendlyPropertyName:'size of all allocated objects',componentPreposition:'by'});}};const SHIM_ALLOCATED_OBJECTS_SIZE={name:'shim_allocated_objects_size',unit:sizeInBytes_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){return buildChromeValueDescriptionPrefix(componentPath,processName,{userFriendlyPropertyName:'size of all objects allocated through shim',totalUserFriendlyPropertyName:'size of all allocated objects through shim',componentPreposition:'by'});}};const LOCKED_SIZE={name:'locked_size',unit:sizeInBytes_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){return buildChromeValueDescriptionPrefix(componentPath,processName,{userFriendlyPropertyName:'locked (pinned) size',componentPreposition:'of'});}};const PEAK_SIZE={name:'peak_size',unit:sizeInBytes_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){return buildChromeValueDescriptionPrefix(componentPath,processName,{userFriendlyPropertyName:'peak size',componentPreposition:'of'});}};const CODE_AND_METADATA_SIZE={name:'code_and_metadata_size',unit:sizeInBytes_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){return buildChromeValueDescriptionPrefix(componentPath,processName,{userFriendlyPropertyNamePrefix:'size of',userFriendlyPropertyName:'code and metadata'});}};const CHROME_VALUE_PROPERTIES=[EFFECTIVE_SIZE,ALLOCATED_OBJECTS_SIZE,SHIM_ALLOCATED_OBJECTS_SIZE,LOCKED_SIZE,PEAK_SIZE];function buildChromeValueDescriptionPrefix(componentPath,processName,formatSpec){const nameParts=[];if(componentPath.length===0){nameParts.push('total');if(formatSpec.totalUserFriendlyPropertyName){nameParts.push(formatSpec.totalUserFriendlyPropertyName);}else{if(formatSpec.userFriendlyPropertyNamePrefix){nameParts.push(formatSpec.userFriendlyPropertyNamePrefix);}
+nameParts.push(formatSpec.userFriendlyPropertyName);}
+nameParts.push('reported by Chrome for');}else{if(formatSpec.componentPreposition===undefined){if(formatSpec.userFriendlyPropertyNamePrefix){nameParts.push(formatSpec.userFriendlyPropertyNamePrefix);}
+nameParts.push(componentPath.join(':'));nameParts.push(formatSpec.userFriendlyPropertyName);}else{if(formatSpec.userFriendlyPropertyNamePrefix){nameParts.push(formatSpec.userFriendlyPropertyNamePrefix);}
+nameParts.push(formatSpec.userFriendlyPropertyName);nameParts.push(formatSpec.componentPreposition);if(componentPath[componentPath.length-1]==='allocated_by_malloc'){nameParts.push('objects allocated by malloc for');nameParts.push(componentPath.slice(0,componentPath.length-1).join(':'));}else{nameParts.push(componentPath.join(':'));}}
+nameParts.push('in');}
+nameParts.push(convertProcessNameToUserFriendlyName(processName));return nameParts.join(' ');}
+const RESIDENT_SIZE={name:'resident_size',unit:sizeInBytes_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){return buildOsValueDescriptionPrefix(componentPath,processName,'resident set size (RSS)');}};const PEAK_RESIDENT_SIZE={name:'peak_resident_size',unit:sizeInBytes_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){return buildOsValueDescriptionPrefix(componentPath,processName,'peak resident set size');}};const PROPORTIONAL_RESIDENT_SIZE={name:'proportional_resident_size',unit:sizeInBytes_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){return buildOsValueDescriptionPrefix(componentPath,processName,'proportional resident size (PSS)');}};const PRIVATE_DIRTY_SIZE={name:'private_dirty_size',unit:sizeInBytes_smallerIsBetter,buildDescriptionPrefix(componentPath,processName){return buildOsValueDescriptionPrefix(componentPath,processName,'private dirty size');}};function buildOsValueDescriptionPrefix(componentPath,processName,userFriendlyPropertyName){if(componentPath.length>2){throw new Error('OS value component path for \''+
+userFriendlyPropertyName+'\' too long: '+componentPath.join(':'));}
+const nameParts=[];if(componentPath.length<2){nameParts.push('total');}
+nameParts.push(userFriendlyPropertyName);if(componentPath.length>0){switch(componentPath[0]){case'system_memory':if(componentPath.length>1){const userFriendlyComponentName=SYSTEM_VALUE_COMPONENTS[componentPath[1]].userFriendlyName;if(userFriendlyComponentName===undefined){throw new Error('System value sub-component for \''+
+userFriendlyPropertyName+'\' unknown: '+
+componentPath.join(':'));}
+nameParts.push('of',userFriendlyComponentName,'in');}else{nameParts.push('of system memory (RAM) used by');}
+break;case'gpu_memory':if(componentPath.length>1){nameParts.push('of the',componentPath[1]);nameParts.push('Android memtrack component in');}else{nameParts.push('of GPU memory (Android memtrack) used by');}
+break;default:throw new Error('OS value component for \''+
+userFriendlyPropertyName+'\' unknown: '+
+componentPath.join(':'));}}else{nameParts.push('reported by the OS for');}
+nameParts.push(convertProcessNameToUserFriendlyName(processName));return nameParts.join(' ');}
+function addDetailedMemoryDumpValues(browserNameToGlobalDumps,values){addMemoryDumpValues(browserNameToGlobalDumps,g=>g.levelOfDetail===DETAILED,function(processDump,addProcessScalar){for(const[componentName,componentSpec]of
+Object.entries(SYSTEM_VALUE_COMPONENTS)){const node=getDescendantVmRegionClassificationNode(processDump.vmRegions,componentSpec.classificationPath);const componentPath=['system_memory'];if(componentName)componentPath.push(componentName);addProcessScalar({source:'reported_by_os',component:componentPath,property:PROPORTIONAL_RESIDENT_SIZE,value:node===undefined?0:(node.byteStats.proportionalResident||0)});addProcessScalar({source:'reported_by_os',component:componentPath,property:PRIVATE_DIRTY_SIZE,value:node===undefined?0:(node.byteStats.privateDirtyResident||0)});}
+const memtrackDump=processDump.getMemoryAllocatorDumpByFullName('gpu/android_memtrack');if(memtrackDump!==undefined){memtrackDump.children.forEach(function(memtrackChildDump){addProcessScalar({source:'reported_by_os',component:['gpu_memory',memtrackChildDump.name],property:PROPORTIONAL_RESIDENT_SIZE,value:memtrackChildDump.numerics.memtrack_pss});});}},function(componentTree){},values);}
+const SYSTEM_VALUE_COMPONENTS={'':{classificationPath:[],},'java_heap':{classificationPath:['Android','Java runtime','Spaces'],userFriendlyName:'the Java heap'},'ashmem':{classificationPath:['Android','Ashmem'],userFriendlyName:'ashmem'},'native_heap':{classificationPath:['Native heap'],userFriendlyName:'the native heap'},'stack':{classificationPath:['Stack'],userFriendlyName:'the thread stacks'}};function getDescendantVmRegionClassificationNode(node,path){for(let i=0;i<path.length;i++){if(node===undefined)break;node=tr.b.findFirstInArray(node.children,c=>c.title===path[i]);}
+return node;}
+function addMemoryDumpCountValues(browserNameToGlobalDumps,values){browserNameToGlobalDumps.forEach(function(globalDumps,browserName){let totalDumpCount=0;const levelOfDetailNameToDumpCount={};LEVEL_OF_DETAIL_NAMES.forEach(function(levelOfDetailName){levelOfDetailNameToDumpCount[levelOfDetailName]=0;});levelOfDetailNameToDumpCount[HEAP_PROFILER_DETAIL_NAME]=0;globalDumps.forEach(function(globalDump){totalDumpCount++;const levelOfDetailName=LEVEL_OF_DETAIL_NAMES.get(globalDump.levelOfDetail);if(levelOfDetailName===undefined){return;}
+levelOfDetailNameToDumpCount[levelOfDetailName]++;if(globalDump.levelOfDetail===DETAILED){if(detectHeapProfilerInMemoryDump(globalDump)){levelOfDetailNameToDumpCount[HEAP_PROFILER_DETAIL_NAME]++;}}});reportMemoryDumpCountAsValue(browserName,undefined,totalDumpCount,values);for(const[levelOfDetailName,levelOfDetailDumpCount]of
+Object.entries(levelOfDetailNameToDumpCount)){reportMemoryDumpCountAsValue(browserName,levelOfDetailName,levelOfDetailDumpCount,values);}});}
+function detectHeapProfilerInMemoryDump(globalDump){for(const processDump of Object.values(globalDump.processMemoryDumps)){if(processDump.heapDumps&&processDump.heapDumps.malloc){const mallocDump=processDump.heapDumps.malloc;if(mallocDump.entries&&mallocDump.entries.length>0){return true;}}}
+return false;}
+function reportMemoryDumpCountAsValue(browserName,levelOfDetailName,levelOfDetailDumpCount,values){const nameParts=['memory',browserName,'all_processes','dump_count'];if(levelOfDetailName!==undefined){nameParts.push(levelOfDetailName);}
+const name=nameParts.join(':');const histogram=new tr.v.Histogram(name,count_smallerIsBetter,BOUNDARIES_FOR_UNIT_MAP.get(count_smallerIsBetter));histogram.addSample(levelOfDetailDumpCount);const userFriendlyLevelOfDetail=(levelOfDetailName||'all').replace('_',' ');histogram.description=['total number of',userFriendlyLevelOfDetail,'memory dumps added by',convertBrowserNameToUserFriendlyName(browserName),'to the trace'].join(' ');values.addHistogram(histogram);}
+function addMemoryDumpValues(browserNameToGlobalDumps,customGlobalDumpFilter,customProcessDumpValueExtractor,customComponentTreeModifier,values){browserNameToGlobalDumps.forEach(function(globalDumps,browserName){const filteredGlobalDumps=globalDumps.filter(customGlobalDumpFilter);const sourceToPropertyToBuilder=extractDataFromGlobalDumps(filteredGlobalDumps,customProcessDumpValueExtractor);reportDataAsValues(sourceToPropertyToBuilder,browserName,customComponentTreeModifier,values);});}
+function extractDataFromGlobalDumps(globalDumps,customProcessDumpValueExtractor){const sourceToPropertyToBuilder=new Map();const dumpCount=globalDumps.length;globalDumps.forEach(function(globalDump,dumpIndex){for(const processDump of Object.values(globalDump.processMemoryDumps)){extractDataFromProcessDump(processDump,sourceToPropertyToBuilder,dumpIndex,dumpCount,customProcessDumpValueExtractor);}});return sourceToPropertyToBuilder;}
+function extractDataFromProcessDump(processDump,sourceToPropertyToBuilder,dumpIndex,dumpCount,customProcessDumpValueExtractor){const rawProcessName=processDump.process.name;const processNamePath=[tr.e.chrome.chrome_processes.canonicalizeProcessName(rawProcessName)];customProcessDumpValueExtractor(processDump,function addProcessScalar(spec){if(spec.value===undefined)return;const component=spec.component||[];function createDetailsForErrorMessage(){return['source=',spec.source,', property=',spec.property.name||'(undefined)',', component=',component.length===0?'(empty)':component.join(':'),' in ',processDump.process.userFriendlyName].join('');}
+let value;if(spec.value instanceof tr.b.Scalar){value=spec.value.value;if(spec.value.unit!==spec.property.unit){throw new Error('Scalar unit for '+
+createDetailsForErrorMessage()+' ('+
+spec.value.unit.unitName+') doesn\'t match the unit of the property ('+
+spec.property.unit.unitName+')');}}else{value=spec.value;}
+let propertyToBuilder=sourceToPropertyToBuilder.get(spec.source);if(propertyToBuilder===undefined){propertyToBuilder=new Map();sourceToPropertyToBuilder.set(spec.source,propertyToBuilder);}
+let builder=propertyToBuilder.get(spec.property);if(builder===undefined){builder=new tr.b.MultiDimensionalViewBuilder(2,dumpCount),propertyToBuilder.set(spec.property,builder);}
+const values=new Array(dumpCount);values[dumpIndex]=value;builder.addPath([processNamePath,component],values,tr.b.MultiDimensionalViewBuilder.ValueKind.TOTAL);});}
+function reportDataAsValues(sourceToPropertyToBuilder,browserName,customComponentTreeModifier,values){sourceToPropertyToBuilder.forEach(function(propertyToBuilder,sourceName){propertyToBuilder.forEach(function(builders,property){const tree=builders.buildTopDownTreeView();reportComponentDataAsValues(browserName,sourceName,property,[],[],tree,values,customComponentTreeModifier);});});}
+function reportComponentDataAsValues(browserName,sourceName,property,processPath,componentPath,tree,values,customComponentTreeModifier,opt_cachedHistograms){const cachedHistograms=opt_cachedHistograms||new Map();function recurse(processPath,componentPath,node){return reportComponentDataAsValues(browserName,sourceName,property,processPath,componentPath,node,values,customComponentTreeModifier,cachedHistograms);}
+function buildHistogram(processPath,componentPath,node){return buildNamedMemoryNumericFromNode(browserName,sourceName,property,processPath.length===0?'all_processes':processPath[0],componentPath,node);}
+customComponentTreeModifier(tree);const histogram=buildHistogram(processPath,componentPath,tree);if(cachedHistograms.has(histogram.name)){return cachedHistograms.get(histogram.name);}
+cachedHistograms.set(histogram.name,histogram);const processBreakdown=new tr.v.d.RelatedHistogramBreakdown();processBreakdown.colorScheme=tr.e.chrome.chrome_processes.PROCESS_COLOR_SCHEME_NAME;for(const[childProcessName,childProcessNode]of tree.children[0]){processPath.push(childProcessName);const childProcessHistogram=recurse(processPath,componentPath,childProcessNode);processBreakdown.set(childProcessName,childProcessHistogram);processPath.pop();}
+const componentBreakdown=new tr.v.d.RelatedHistogramBreakdown();for(const[childComponentName,childComponentNode]of tree.children[1]){componentPath.push(childComponentName);const childComponentHistogram=recurse(processPath,componentPath,childComponentNode);componentBreakdown.set(childComponentName,childComponentHistogram);componentPath.pop();}
+values.addHistogram(histogram);if(tree.children[0].size>0){histogram.diagnostics.set('processes',processBreakdown);}
+if(tree.children[1].size>0){histogram.diagnostics.set('components',componentBreakdown);}
+return histogram;}
+function getNumericName(browserName,sourceName,propertyName,processName,componentPath){const nameParts=['memory',browserName,processName,sourceName].concat(componentPath);if(propertyName!==undefined)nameParts.push(propertyName);return nameParts.join(':');}
+function getNumericDescription(property,browserName,processName,componentPath){return[property.buildDescriptionPrefix(componentPath,processName),'in',convertBrowserNameToUserFriendlyName(browserName)].join(' ');}
+function buildNamedMemoryNumericFromNode(browserName,sourceName,property,processName,componentPath,node){const name=getNumericName(browserName,sourceName,property.name,processName,componentPath);const description=getNumericDescription(property,browserName,processName,componentPath);const numeric=buildMemoryNumericFromNode(name,node,property.unit);numeric.description=description;return numeric;}
+function buildMemoryNumericFromNode(name,node,unit){const histogram=new tr.v.Histogram(name,unit,BOUNDARIES_FOR_UNIT_MAP.get(unit));node.values.forEach(v=>histogram.addSample(v.total));return histogram;}
+tr.metrics.MetricRegistry.register(memoryMetric,{supportsRangeOfInterest:true});return{memoryMetric,};});'use strict';tr.exportTo('tr.metrics.sh',function(){const CHROME_POWER_GRACE_PERIOD_MS=1;function createEmptyHistogram_(interval,histograms){if(interval.perSecond){return{perSecond:true,energy:histograms.createHistogram(`${interval.name}:power`,tr.b.Unit.byName.powerInWatts_smallerIsBetter,[],{description:`Energy consumption rate for ${interval.description}`,summaryOptions:{avg:true,count:false,max:true,min:true,std:false,sum:false,},}),};}
+return{perSecond:false,energy:histograms.createHistogram(`${interval.name}:energy`,tr.b.Unit.byName.energyInJoules_smallerIsBetter,[],{description:`Energy consumed in ${interval.description}`,summaryOptions:{avg:false,count:false,max:true,min:true,std:false,sum:true,},}),};}
+function createHistograms_(data,interval,histograms){if(data.histograms[interval.name]===undefined){data.histograms[interval.name]=createEmptyHistogram_(interval,histograms);}
+if(data.histograms[interval.name].perSecond){for(const sample of data.model.device.powerSeries.getSamplesWithinRange(interval.bounds.min,interval.bounds.max)){data.histograms[interval.name].energy.addSample(sample.powerInW);}}else{const energyInJ=data.model.device.powerSeries.getEnergyConsumedInJ(interval.bounds.min,interval.bounds.max);data.histograms[interval.name].energy.addSample(energyInJ);}}
+function getNavigationTTIIntervals_(model){const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);const intervals=[];for(const rendererHelper of Object.values(chromeHelper.rendererHelpers)){const samples=tr.metrics.sh.collectLoadingMetricsForRenderer(rendererHelper).firstInteractiveSamples;for(const sample of samples){const info=sample.diagnostics['Navigation infos'].value;intervals.push(tr.b.math.Range.fromExplicitRange(info.start,info.interactive));}}
+return intervals.sort((x,y)=>x.min-y.min);}
+function*computeTimeIntervals_(model){const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);const powerSeries=model.device.powerSeries;if(powerSeries===undefined||powerSeries.samples.length===0){return;}
+yield{bounds:model.bounds,name:'story',description:'user story',perSecond:true};const chromeBounds=computeChromeBounds_(model);if(chromeBounds.isEmpty)return;const powerSeriesBoundsWithGracePeriod=tr.b.math.Range.fromExplicitRange(powerSeries.bounds.min-CHROME_POWER_GRACE_PERIOD_MS,powerSeries.bounds.max+CHROME_POWER_GRACE_PERIOD_MS);if(!powerSeriesBoundsWithGracePeriod.containsRangeExclusive(chromeBounds)){return;}
+for(const interval of getRailStageIntervals_(model)){yield{bounds:interval.bounds.findIntersection(chromeBounds),name:interval.name,description:interval.description,perSecond:interval.perSecond};}
+for(const interval of getLoadingIntervals_(model,chromeBounds)){yield{bounds:interval.bounds.findIntersection(chromeBounds),name:interval.name,description:interval.description,perSecond:interval.perSecond};}}
+function*getRailStageIntervals_(model){for(const exp of model.userModel.expectations){const histogramName=exp.title.toLowerCase().replace(' ','_');const energyHist=undefined;if(histogramName.includes('response')){yield{bounds:tr.b.math.Range.fromExplicitRange(exp.start,exp.end),name:histogramName,description:'RAIL stage '+histogramName,perSecond:false};}else if(histogramName.includes('animation')||histogramName.includes('idle')){yield{bounds:tr.b.math.Range.fromExplicitRange(exp.start,exp.end),name:histogramName,description:'RAIL stage '+histogramName,perSecond:true};}}}
+function*getLoadingIntervals_(model,chromeBounds){const ttiIntervals=getNavigationTTIIntervals_(model);let lastLoadTime=undefined;for(const ttiInterval of ttiIntervals){yield{bounds:ttiInterval,name:'load',description:'page loads',perSecond:false};lastLoadTime=lastLoadTime===undefined?ttiInterval.max:Math.max(lastLoadTime,ttiInterval.max);}
+if(lastLoadTime!==undefined){yield{bounds:tr.b.math.Range.fromExplicitRange(lastLoadTime,chromeBounds.max),name:'after_load',description:'period after load',perSecond:true};}}
+function computeChromeBounds_(model){const chromeBounds=new tr.b.math.Range();const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);if(chromeHelper===undefined)return chromeBounds;for(const helper of chromeHelper.browserHelpers){if(helper.mainThread){chromeBounds.addRange(helper.mainThread.bounds);}}
+for(const pid in chromeHelper.rendererHelpers){if(chromeHelper.rendererHelpers[pid].mainThread){chromeBounds.addRange(chromeHelper.rendererHelpers[pid].mainThread.bounds);}}
+return chromeBounds;}
+function powerMetric(histograms,model){const data={model,histograms:{}};for(const interval of computeTimeIntervals_(model)){createHistograms_(data,interval,histograms);}}
+tr.metrics.MetricRegistry.register(powerMetric);return{powerMetric};});'use strict';tr.exportTo('tr.metrics.sh',function(){function computeAnimationThroughput(animationExpectation){if(animationExpectation.frameEvents===undefined||animationExpectation.frameEvents.length===0){throw new Error('Animation missing frameEvents '+
+animationExpectation.stableId);}
+const durationInS=tr.b.convertUnit(animationExpectation.duration,tr.b.UnitPrefixScale.METRIC.MILLI,tr.b.UnitPrefixScale.METRIC.NONE);return animationExpectation.frameEvents.length/durationInS;}
+function computeAnimationframeTimeDiscrepancy(animationExpectation){if(animationExpectation.frameEvents===undefined||animationExpectation.frameEvents.length===0){throw new Error('Animation missing frameEvents '+
+animationExpectation.stableId);}
+let frameTimestamps=animationExpectation.frameEvents;frameTimestamps=frameTimestamps.toArray().map(function(event){return event.start;});const absolute=true;return tr.b.math.Statistics.timestampsDiscrepancy(frameTimestamps,absolute);}
+function responsivenessMetric(histograms,model,opt_options){const responseNumeric=new tr.v.Histogram('response latency',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,tr.v.HistogramBinBoundaries.createLinear(100,1e3,50));const throughputNumeric=new tr.v.Histogram('animation throughput',tr.b.Unit.byName.unitlessNumber_biggerIsBetter,tr.v.HistogramBinBoundaries.createLinear(10,60,10));const frameTimeDiscrepancyNumeric=new tr.v.Histogram('animation frameTimeDiscrepancy',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,tr.v.HistogramBinBoundaries.createLinear(0,1e3,50).addExponentialBins(1e4,10));const latencyNumeric=new tr.v.Histogram('animation latency',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,tr.v.HistogramBinBoundaries.createLinear(0,300,60));model.userModel.expectations.forEach(function(ue){if(opt_options&&opt_options.rangeOfInterest&&!opt_options.rangeOfInterest.intersectsExplicitRangeInclusive(ue.start,ue.end)){return;}
+const sampleDiagnosticMap=tr.v.d.DiagnosticMap.fromObject({relatedEvents:new tr.v.d.RelatedEventSet([ue])});if(ue instanceof tr.model.um.IdleExpectation){return;}else if(ue instanceof tr.model.um.StartupExpectation){return;}else if(ue instanceof tr.model.um.LoadExpectation){}else if(ue instanceof tr.model.um.ResponseExpectation){responseNumeric.addSample(ue.duration,sampleDiagnosticMap);}else if(ue instanceof tr.model.um.AnimationExpectation){if(ue.frameEvents===undefined||ue.frameEvents.length===0){return;}
+const throughput=computeAnimationThroughput(ue);if(throughput===undefined){throw new Error('Missing throughput for '+
+ue.stableId);}
+throughputNumeric.addSample(throughput,sampleDiagnosticMap);const frameTimeDiscrepancy=computeAnimationframeTimeDiscrepancy(ue);if(frameTimeDiscrepancy===undefined){throw new Error('Missing frameTimeDiscrepancy for '+
+ue.stableId);}
+frameTimeDiscrepancyNumeric.addSample(frameTimeDiscrepancy,sampleDiagnosticMap);ue.associatedEvents.forEach(function(event){if(!(event instanceof tr.e.cc.InputLatencyAsyncSlice)){return;}
+latencyNumeric.addSample(event.duration,sampleDiagnosticMap);});}else{throw new Error('Unrecognized stage for '+ue.stableId);}});[responseNumeric,throughputNumeric,frameTimeDiscrepancyNumeric,latencyNumeric].forEach(function(numeric){numeric.customizeSummaryOptions({avg:true,max:true,min:true,std:true});});histograms.addHistogram(responseNumeric);histograms.addHistogram(throughputNumeric);histograms.addHistogram(frameTimeDiscrepancyNumeric);histograms.addHistogram(latencyNumeric);}
+tr.metrics.MetricRegistry.register(responsivenessMetric,{supportsRangeOfInterest:true});return{responsivenessMetric,};});'use strict';tr.exportTo('tr.metrics.sh',function(){function webviewStartupMetric(histograms,model){const startupWallHist=new tr.v.Histogram('webview_startup_wall_time',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);startupWallHist.description='WebView startup wall time';const startupCPUHist=new tr.v.Histogram('webview_startup_cpu_time',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);startupCPUHist.description='WebView startup CPU time';const loadWallHist=new tr.v.Histogram('webview_url_load_wall_time',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);loadWallHist.description='WebView blank URL load wall time';const loadCPUHist=new tr.v.Histogram('webview_url_load_cpu_time',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter);loadCPUHist.description='WebView blank URL load CPU time';for(const slice of model.getDescendantEvents()){if(!(slice instanceof tr.model.ThreadSlice))continue;if(slice.title==='WebViewStartupInterval'){startupWallHist.addSample(slice.duration);startupCPUHist.addSample(slice.cpuDuration);}
+if(slice.title==='WebViewBlankUrlLoadInterval'){loadWallHist.addSample(slice.duration);loadCPUHist.addSample(slice.cpuDuration);}}
+histograms.addHistogram(startupWallHist);histograms.addHistogram(startupCPUHist);histograms.addHistogram(loadWallHist);histograms.addHistogram(loadCPUHist);}
+tr.metrics.MetricRegistry.register(webviewStartupMetric);return{webviewStartupMetric,};});'use strict';tr.exportTo('tr.metrics',function(){const MEMORY_INFRA_TRACING_CATEGORY='disabled-by-default-memory-infra';const TIME_BOUNDARIES=tr.v.HistogramBinBoundaries.createExponential(1e-3,1e5,30);const BYTE_BOUNDARIES=tr.v.HistogramBinBoundaries.createExponential(1,1e9,30);const COUNT_BOUNDARIES=tr.v.HistogramBinBoundaries.createExponential(1,1e5,30);const SUMMARY_OPTIONS=tr.v.Histogram.AVERAGE_ONLY_SUMMARY_OPTIONS;function addMemoryInfraHistograms(histograms,model,categoryNamesToTotalEventSizes){const memoryDumpCount=model.globalMemoryDumps.length;if(memoryDumpCount===0)return;let totalOverhead=0;let nonMemoryInfraThreadOverhead=0;const overheadByProvider={};for(const process of Object.values(model.processes)){for(const thread of Object.values(process.threads)){for(const slice of Object.values(thread.sliceGroup.slices)){if(slice.category!==MEMORY_INFRA_TRACING_CATEGORY)continue;totalOverhead+=slice.duration;if(thread.name!=='MemoryInfra'){nonMemoryInfraThreadOverhead+=slice.duration;}
+if(slice.args&&slice.args['dump_provider.name']){const providerName=slice.args['dump_provider.name'];let durationAndCount=overheadByProvider[providerName];if(durationAndCount===undefined){overheadByProvider[providerName]=durationAndCount={duration:0,count:0};}
+durationAndCount.duration+=slice.duration;durationAndCount.count++;}}}}
+histograms.createHistogram('memory_dump_cpu_overhead',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,totalOverhead/memoryDumpCount,{binBoundaries:TIME_BOUNDARIES,description:'Average CPU overhead on all threads per memory-infra dump',summaryOptions:SUMMARY_OPTIONS,});histograms.createHistogram('nonmemory_thread_memory_dump_cpu_overhead',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,nonMemoryInfraThreadOverhead/memoryDumpCount,{binBoundaries:TIME_BOUNDARIES,description:'Average CPU overhead on non-memory-infra threads '+'per memory-infra dump',summaryOptions:SUMMARY_OPTIONS,});for(const[providerName,overhead]of Object.entries(overheadByProvider)){histograms.createHistogram(`${providerName}_memory_dump_cpu_overhead`,tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,overhead.duration/overhead.count,{binBoundaries:TIME_BOUNDARIES,description:`Average CPU overhead of ${providerName} per OnMemoryDump call`,summaryOptions:SUMMARY_OPTIONS,});}
+const memoryInfraEventsSize=categoryNamesToTotalEventSizes.get(MEMORY_INFRA_TRACING_CATEGORY);const memoryInfraTraceBytesValue=new tr.v.Histogram('total_memory_dump_size',tr.b.Unit.byName.sizeInBytes_smallerIsBetter,BYTE_BOUNDARIES);memoryInfraTraceBytesValue.description='Total trace size of memory-infra dumps in bytes';memoryInfraTraceBytesValue.customizeSummaryOptions(SUMMARY_OPTIONS);memoryInfraTraceBytesValue.addSample(memoryInfraEventsSize);histograms.addHistogram(memoryInfraTraceBytesValue);const traceBytesPerDumpValue=new tr.v.Histogram('memory_dump_size',tr.b.Unit.byName.sizeInBytes_smallerIsBetter,BYTE_BOUNDARIES);traceBytesPerDumpValue.description='Average trace size of memory-infra dumps in bytes';traceBytesPerDumpValue.customizeSummaryOptions(SUMMARY_OPTIONS);traceBytesPerDumpValue.addSample(memoryInfraEventsSize/memoryDumpCount);histograms.addHistogram(traceBytesPerDumpValue);}
+function tracingMetric(histograms,model){histograms.createHistogram('trace_import_duration',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,model.stats.traceImportDurationMs,{binBoundaries:TIME_BOUNDARIES,description:'Duration that trace viewer required to import the trace',summaryOptions:SUMMARY_OPTIONS,});if(!model.stats.hasEventSizesinBytes)return;const eventStats=model.stats.allTraceEventStatsInTimeIntervals;eventStats.sort((a,b)=>a.timeInterval-b.timeInterval);const totalTraceBytes=eventStats.reduce((a,b)=>a+b.totalEventSizeinBytes,0);let maxEventCountPerSec=0;let maxEventBytesPerSec=0;const INTERVALS_PER_SEC=Math.floor(1000/model.stats.TIME_INTERVAL_SIZE_IN_MS);let runningEventNumPerSec=0;let runningEventBytesPerSec=0;let start=0;let end=0;while(end<eventStats.length){runningEventNumPerSec+=eventStats[end].numEvents;runningEventBytesPerSec+=eventStats[end].totalEventSizeinBytes;end++;while((eventStats[end-1].timeInterval-
+eventStats[start].timeInterval)>=INTERVALS_PER_SEC){runningEventNumPerSec-=eventStats[start].numEvents;runningEventBytesPerSec-=eventStats[start].totalEventSizeinBytes;start++;}
+maxEventCountPerSec=Math.max(maxEventCountPerSec,runningEventNumPerSec);maxEventBytesPerSec=Math.max(maxEventBytesPerSec,runningEventBytesPerSec);}
+const stats=model.stats.allTraceEventStats;const categoryNamesToTotalEventSizes=(stats.reduce((map,stat)=>(map.set(stat.category,((map.get(stat.category)||0)+
+stat.totalEventSizeinBytes))),new Map()));const maxCatNameAndBytes=Array.from(categoryNamesToTotalEventSizes.entries()).reduce((a,b)=>((b[1]>=a[1])?b:a));const maxEventBytesPerCategory=maxCatNameAndBytes[1];const categoryWithMaxEventBytes=maxCatNameAndBytes[0];const maxEventCountPerSecValue=new tr.v.Histogram('peak_event_rate',tr.b.Unit.byName.count_smallerIsBetter,COUNT_BOUNDARIES);maxEventCountPerSecValue.description='Max number of events per second';maxEventCountPerSecValue.customizeSummaryOptions(SUMMARY_OPTIONS);maxEventCountPerSecValue.addSample(maxEventCountPerSec);const maxEventBytesPerSecValue=new tr.v.Histogram('peak_event_size_rate',tr.b.Unit.byName.sizeInBytes_smallerIsBetter,BYTE_BOUNDARIES);maxEventBytesPerSecValue.description='Max event size in bytes per second';maxEventBytesPerSecValue.customizeSummaryOptions(SUMMARY_OPTIONS);maxEventBytesPerSecValue.addSample(maxEventBytesPerSec);const totalTraceBytesValue=new tr.v.Histogram('trace_size',tr.b.Unit.byName.sizeInBytes_smallerIsBetter,BYTE_BOUNDARIES);totalTraceBytesValue.customizeSummaryOptions(SUMMARY_OPTIONS);totalTraceBytesValue.addSample(totalTraceBytes);const biggestCategory={name:categoryWithMaxEventBytes,size_in_bytes:maxEventBytesPerCategory};totalTraceBytesValue.diagnostics.set('category_with_max_event_size',new tr.v.d.Generic(biggestCategory));histograms.addHistogram(totalTraceBytesValue);maxEventCountPerSecValue.diagnostics.set('category_with_max_event_size',new tr.v.d.Generic(biggestCategory));histograms.addHistogram(maxEventCountPerSecValue);maxEventBytesPerSecValue.diagnostics.set('category_with_max_event_size',new tr.v.d.Generic(biggestCategory));histograms.addHistogram(maxEventBytesPerSecValue);addMemoryInfraHistograms(histograms,model,categoryNamesToTotalEventSizes);}
+tr.metrics.MetricRegistry.register(tracingMetric);return{tracingMetric,MEMORY_INFRA_TRACING_CATEGORY,};});'use strict';tr.exportTo('tr.metrics.v8',function(){const CUSTOM_BOUNDARIES=tr.v.HistogramBinBoundaries.createLinear(4,200,100);function computeExecuteMetrics(histograms,model){const cpuTotalExecution=new tr.v.Histogram('v8_execution_cpu_total',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);cpuTotalExecution.description='cpu total time spent in script execution';const wallTotalExecution=new tr.v.Histogram('v8_execution_wall_total',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);wallTotalExecution.description='wall total time spent in script execution';const cpuSelfExecution=new tr.v.Histogram('v8_execution_cpu_self',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);cpuSelfExecution.description='cpu self time spent in script execution';const wallSelfExecution=new tr.v.Histogram('v8_execution_wall_self',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);wallSelfExecution.description='wall self time spent in script execution';for(const e of model.findTopmostSlicesNamed('V8.Execute')){cpuTotalExecution.addSample(e.cpuDuration);wallTotalExecution.addSample(e.duration);cpuSelfExecution.addSample(e.cpuSelfTime);wallSelfExecution.addSample(e.selfTime);}
+histograms.addHistogram(cpuTotalExecution);histograms.addHistogram(wallTotalExecution);histograms.addHistogram(cpuSelfExecution);histograms.addHistogram(wallSelfExecution);}
+function computeParseLazyMetrics(histograms,model){const cpuSelfParseLazy=new tr.v.Histogram('v8_parse_lazy_cpu_self',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);cpuSelfParseLazy.description='cpu self time spent performing lazy parsing';const wallSelfParseLazy=new tr.v.Histogram('v8_parse_lazy_wall_self',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);wallSelfParseLazy.description='wall self time spent performing lazy parsing';for(const e of model.findTopmostSlicesNamed('V8.ParseLazyMicroSeconds')){cpuSelfParseLazy.addSample(e.cpuSelfTime);wallSelfParseLazy.addSample(e.selfTime);}
+for(const e of model.findTopmostSlicesNamed('V8.ParseLazy')){cpuSelfParseLazy.addSample(e.cpuSelfTime);wallSelfParseLazy.addSample(e.selfTime);}
+histograms.addHistogram(cpuSelfParseLazy);histograms.addHistogram(wallSelfParseLazy);}
+function computeCompileFullCodeMetrics(histograms,model){const cpuSelfCompileFullCode=new tr.v.Histogram('v8_compile_full_code_cpu_self',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);cpuSelfCompileFullCode.description='cpu self time spent performing compiling full code';const wallSelfCompileFullCode=new tr.v.Histogram('v8_compile_full_code_wall_self',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);wallSelfCompileFullCode.description='wall self time spent performing compiling full code';for(const e of model.findTopmostSlicesNamed('V8.CompileFullCode')){cpuSelfCompileFullCode.addSample(e.cpuSelfTime);wallSelfCompileFullCode.addSample(e.selfTime);}
+histograms.addHistogram(cpuSelfCompileFullCode);histograms.addHistogram(wallSelfCompileFullCode);}
+function computeCompileIgnitionMetrics(histograms,model){const cpuSelfCompileIgnition=new tr.v.Histogram('v8_compile_ignition_cpu_self',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);cpuSelfCompileIgnition.description='cpu self time spent in compile ignition';const wallSelfCompileIgnition=new tr.v.Histogram('v8_compile_ignition_wall_self',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);wallSelfCompileIgnition.description='wall self time spent in compile ignition';for(const e of model.findTopmostSlicesNamed('V8.CompileIgnition')){cpuSelfCompileIgnition.addSample(e.cpuSelfTime);wallSelfCompileIgnition.addSample(e.selfTime);}
+histograms.addHistogram(cpuSelfCompileIgnition);histograms.addHistogram(wallSelfCompileIgnition);}
+function computeRecompileMetrics(histograms,model){const cpuTotalRecompileSynchronous=new tr.v.Histogram('v8_recompile_synchronous_cpu_total',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);cpuTotalRecompileSynchronous.description='cpu total time spent in synchronous recompilation';const wallTotalRecompileSynchronous=new tr.v.Histogram('v8_recompile_synchronous_wall_total',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);wallTotalRecompileSynchronous.description='wall total time spent in synchronous recompilation';const cpuTotalRecompileConcurrent=new tr.v.Histogram('v8_recompile_concurrent_cpu_total',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);cpuTotalRecompileConcurrent.description='cpu total time spent in concurrent recompilation';const wallTotalRecompileConcurrent=new tr.v.Histogram('v8_recompile_concurrent_wall_total',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);wallTotalRecompileConcurrent.description='wall total time spent in concurrent recompilation';const cpuTotalRecompileOverall=new tr.v.Histogram('v8_recompile_overall_cpu_total',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);cpuTotalRecompileOverall.description='cpu total time spent in synchronous or concurrent recompilation';const wallTotalRecompileOverall=new tr.v.Histogram('v8_recompile_overall_wall_total',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);wallTotalRecompileOverall.description='wall total time spent in synchronous or concurrent recompilation';for(const e of model.findTopmostSlicesNamed('V8.RecompileSynchronous')){cpuTotalRecompileSynchronous.addSample(e.cpuDuration);wallTotalRecompileSynchronous.addSample(e.duration);cpuTotalRecompileOverall.addSample(e.cpuDuration);wallTotalRecompileOverall.addSample(e.duration);}
+histograms.addHistogram(cpuTotalRecompileSynchronous);histograms.addHistogram(wallTotalRecompileSynchronous);for(const e of model.findTopmostSlicesNamed('V8.RecompileConcurrent')){cpuTotalRecompileConcurrent.addSample(e.cpuDuration);wallTotalRecompileConcurrent.addSample(e.duration);cpuTotalRecompileOverall.addSample(e.cpuDuration);wallTotalRecompileOverall.addSample(e.duration);}
+histograms.addHistogram(cpuTotalRecompileConcurrent);histograms.addHistogram(wallTotalRecompileConcurrent);histograms.addHistogram(cpuTotalRecompileOverall);histograms.addHistogram(wallTotalRecompileOverall);}
+function computeOptimizeCodeMetrics(histograms,model){const cpuTotalOptimizeCode=new tr.v.Histogram('v8_optimize_code_cpu_total',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);cpuTotalOptimizeCode.description='cpu total time spent in code optimization';const wallTotalOptimizeCode=new tr.v.Histogram('v8_optimize_code_wall_total',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);wallTotalOptimizeCode.description='wall total time spent in code optimization';for(const e of model.findTopmostSlicesNamed('V8.OptimizeCode')){cpuTotalOptimizeCode.addSample(e.cpuDuration);wallTotalOptimizeCode.addSample(e.duration);}
+histograms.addHistogram(cpuTotalOptimizeCode);histograms.addHistogram(wallTotalOptimizeCode);}
+function computeDeoptimizeCodeMetrics(histograms,model){const cpuTotalDeoptimizeCode=new tr.v.Histogram('v8_deoptimize_code_cpu_total',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);cpuTotalDeoptimizeCode.description='cpu total time spent in code deoptimization';const wallTotalDeoptimizeCode=new tr.v.Histogram('v8_deoptimize_code_wall_total',tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);wallTotalDeoptimizeCode.description='wall total time spent in code deoptimization';for(const e of model.findTopmostSlicesNamed('V8.DeoptimizeCode')){cpuTotalDeoptimizeCode.addSample(e.cpuDuration);wallTotalDeoptimizeCode.addSample(e.duration);}
+histograms.addHistogram(cpuTotalDeoptimizeCode);histograms.addHistogram(wallTotalDeoptimizeCode);}
+function executionMetric(histograms,model){computeExecuteMetrics(histograms,model);computeParseLazyMetrics(histograms,model);computeCompileIgnitionMetrics(histograms,model);computeCompileFullCodeMetrics(histograms,model);computeRecompileMetrics(histograms,model);computeOptimizeCodeMetrics(histograms,model);computeDeoptimizeCodeMetrics(histograms,model);}
+tr.metrics.MetricRegistry.register(executionMetric);return{executionMetric,};});'use strict';tr.exportTo('tr.metrics.v8',function(){const TARGET_FPS=60;const MS_PER_SECOND=1000;const WINDOW_SIZE_MS=MS_PER_SECOND/TARGET_FPS;function gcMetric(histograms,model){addDurationOfTopEvents(histograms,model);addTotalDurationOfTopEvents(histograms,model);addDurationOfSubEvents(histograms,model);addPercentageInV8ExecuteOfTopEvents(histograms,model);addTotalPercentageInV8Execute(histograms,model);}
+tr.metrics.MetricRegistry.register(gcMetric);const timeDurationInMs_smallerIsBetter=tr.b.Unit.byName.timeDurationInMs_smallerIsBetter;const percentage_biggerIsBetter=tr.b.Unit.byName.normalizedPercentage_biggerIsBetter;const percentage_smallerIsBetter=tr.b.Unit.byName.normalizedPercentage_smallerIsBetter;const CUSTOM_BOUNDARIES=tr.v.HistogramBinBoundaries.createLinear(0,20,200).addExponentialBins(200,100);function createNumericForTopEventTime(name){const n=new tr.v.Histogram(name,timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);n.customizeSummaryOptions({avg:true,count:true,max:true,min:false,std:true,sum:true,percentile:[0.90]});return n;}
+function createNumericForSubEventTime(name){const n=new tr.v.Histogram(name,timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);n.customizeSummaryOptions({avg:true,count:false,max:true,min:false,std:false,sum:false,percentile:[0.90]});return n;}
+function createNumericForIdleTime(name){const n=new tr.v.Histogram(name,timeDurationInMs_smallerIsBetter,CUSTOM_BOUNDARIES);n.customizeSummaryOptions({avg:true,count:false,max:true,min:false,std:false,sum:true,percentile:[]});return n;}
+function createPercentage(name,numerator,denominator,unit){const hist=new tr.v.Histogram(name,unit);if(denominator===0){hist.addSample(0);}else{hist.addSample(numerator/denominator);}
+hist.customizeSummaryOptions({avg:true,count:false,max:false,min:false,std:false,sum:false,percentile:[]});return hist;}
+function isNotForcedTopGarbageCollectionEvent(event){return tr.metrics.v8.utils.isTopGarbageCollectionEvent(event)&&!tr.metrics.v8.utils.isForcedGarbageCollectionEvent(event);}
+function isNotForcedSubGarbageCollectionEvent(event){return tr.metrics.v8.utils.isSubGarbageCollectionEvent(event)&&!tr.metrics.v8.utils.isForcedGarbageCollectionEvent(event);}
+function addDurationOfTopEvents(histograms,model){tr.metrics.v8.utils.groupAndProcessEvents(model,isNotForcedTopGarbageCollectionEvent,tr.metrics.v8.utils.topGarbageCollectionEventName,function(name,events){const cpuDuration=createNumericForTopEventTime(name);events.forEach(function(event){cpuDuration.addSample(event.cpuDuration);});histograms.addHistogram(cpuDuration);});}
+function addTotalDurationOfTopEvents(histograms,model){tr.metrics.v8.utils.groupAndProcessEvents(model,isNotForcedTopGarbageCollectionEvent,event=>'v8-gc-total',function(name,events){const cpuDuration=createNumericForTopEventTime(name);events.forEach(function(event){cpuDuration.addSample(event.cpuDuration);});histograms.addHistogram(cpuDuration);});}
+function addDurationOfSubEvents(histograms,model){tr.metrics.v8.utils.groupAndProcessEvents(model,isNotForcedSubGarbageCollectionEvent,tr.metrics.v8.utils.subGarbageCollectionEventName,function(name,events){const cpuDuration=createNumericForSubEventTime(name);events.forEach(function(event){cpuDuration.addSample(event.cpuDuration);});histograms.addHistogram(cpuDuration);});}
+function addPercentageInV8ExecuteOfTopEvents(histograms,model){tr.metrics.v8.utils.groupAndProcessEvents(model,isNotForcedTopGarbageCollectionEvent,tr.metrics.v8.utils.topGarbageCollectionEventName,function(name,events){addPercentageInV8Execute(histograms,model,name,events);});}
+function addTotalPercentageInV8Execute(histograms,model){tr.metrics.v8.utils.groupAndProcessEvents(model,isNotForcedTopGarbageCollectionEvent,event=>'v8-gc-total',function(name,events){addPercentageInV8Execute(histograms,model,name,events);});}
+function addPercentageInV8Execute(histograms,model,name,events){let cpuDurationInV8Execute=0;let cpuDurationTotal=0;events.forEach(function(event){const v8Execute=tr.metrics.v8.utils.findParent(event,tr.metrics.v8.utils.isV8ExecuteEvent);if(v8Execute){cpuDurationInV8Execute+=event.cpuDuration;}
+cpuDurationTotal+=event.cpuDuration;});const percentage=createPercentage(name+'_percentage_in_v8_execute',cpuDurationInV8Execute,cpuDurationTotal,percentage_smallerIsBetter);histograms.addHistogram(percentage);}
+return{gcMetric,WINDOW_SIZE_MS,};});'use strict';tr.exportTo('tr.metrics.v8',function(){const COUNT_CUSTOM_BOUNDARIES=tr.v.HistogramBinBoundaries.createExponential(1,1000000,50);const DURATION_CUSTOM_BOUNDARIES=tr.v.HistogramBinBoundaries.createExponential(0.1,10000,50);const SUMMARY_OPTIONS={std:false,count:false,sum:false,min:false,max:false,};function computeDomContentLoadedTime_(model){const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);let domContentLoadedTime=0;for(const rendererHelper of Object.values(chromeHelper.rendererHelpers)){for(const ev of rendererHelper.mainThread.sliceGroup.childEvents()){if(ev.title==='domContentLoadedEventEnd'&&ev.start>domContentLoadedTime){domContentLoadedTime=ev.start;}}}
+return domContentLoadedTime;}
+function computeInteractiveTime_(model){const chromeHelper=model.getOrCreateHelper(tr.model.helpers.ChromeModelHelper);let interactiveTime=0;for(const rendererHelper of Object.values(chromeHelper.rendererHelpers)){const samples=tr.metrics.sh.collectLoadingMetricsForRenderer(rendererHelper).firstInteractiveSamples;if(samples.length===0)continue;if(interactiveTime!==0)throw new Error('Too many navigations');interactiveTime=tr.b.getOnlyElement(samples).diagnostics['Navigation infos'].value.interactive;}
+return interactiveTime;}
+function convertMicroToMilli_(time){return tr.b.convertUnit(time,tr.b.UnitPrefixScale.METRIC.MICRO,tr.b.UnitPrefixScale.METRIC.MILLI);}
+function computeRuntimeStats(histograms,slices){const runtimeGroupCollection=new tr.e.v8.RuntimeStatsGroupCollection();runtimeGroupCollection.addSlices(slices);for(const runtimeGroup of runtimeGroupCollection.runtimeGroups){const durationSamples=new tr.v.d.RelatedHistogramBreakdown();const countSamples=new tr.v.d.RelatedHistogramBreakdown();for(const entry of runtimeGroup.values){const durationSampleHistogram=histograms.createHistogram(`${entry.name}:duration`,tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,convertMicroToMilli_(entry.time),{binBoundaries:DURATION_CUSTOM_BOUNDARIES,summaryOptions:SUMMARY_OPTIONS,});durationSamples.set(durationSampleHistogram.name,durationSampleHistogram);const countSampleHistogram=histograms.createHistogram(`${entry.name}:count`,tr.b.Unit.byName.count_smallerIsBetter,entry.count,{binBoundaries:COUNT_CUSTOM_BOUNDARIES,summaryOptions:SUMMARY_OPTIONS,});countSamples.set(countSampleHistogram.name,countSampleHistogram);}
+histograms.createHistogram(`${runtimeGroup.name}:duration`,tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,{value:convertMicroToMilli_(runtimeGroup.time),diagnostics:{samples:durationSamples},},{binBoundaries:DURATION_CUSTOM_BOUNDARIES,summaryOptions:SUMMARY_OPTIONS,});histograms.createHistogram(`${runtimeGroup.name}:count`,tr.b.Unit.byName.count_smallerIsBetter,{value:runtimeGroup.count,diagnostics:{samples:countSamples},},{binBoundaries:COUNT_CUSTOM_BOUNDARIES,summaryOptions:SUMMARY_OPTIONS,});}}
+function runtimeStatsMetric(histograms,model){const interactiveTime=computeInteractiveTime_(model);const domContentLoadedTime=computeDomContentLoadedTime_(model);const endTime=Math.max(interactiveTime,domContentLoadedTime);const slices=[...model.getDescendantEvents()].filter(event=>event instanceof tr.e.v8.V8ThreadSlice&&event.start<=endTime);computeRuntimeStats(histograms,slices);}
+function addDurationHistogram(railStageName,runtimeGroupName,sampleValue,histograms,durationRelatedHistsByGroupName){const durationHistogram=histograms.createHistogram(`${railStageName}_${runtimeGroupName}:duration`,tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,convertMicroToMilli_(sampleValue),{binBoundaries:DURATION_CUSTOM_BOUNDARIES,summaryOptions:SUMMARY_OPTIONS,});if(durationRelatedHistsByGroupName.get(runtimeGroupName)===undefined){const durationHistogramMap=new tr.v.d.RelatedHistogramMap();durationHistogramMap.set(railStageName,durationHistogram);durationRelatedHistsByGroupName.set(runtimeGroupName,durationHistogramMap);}else{durationRelatedHistsByGroupName.get(runtimeGroupName).set(railStageName,durationHistogram);}}
+function addCountHistogram(railStageName,runtimeGroupName,sampleValue,histograms,countRelatedHistsByGroupName){const countHistogram=histograms.createHistogram(`${railStageName}_${runtimeGroupName}:count`,tr.b.Unit.byName.count_smallerIsBetter,sampleValue,{binBoundaries:COUNT_CUSTOM_BOUNDARIES,summaryOptions:SUMMARY_OPTIONS,});if(countRelatedHistsByGroupName.get(runtimeGroupName)===undefined){const countHistogramMap=new tr.v.d.RelatedHistogramMap();countHistogramMap.set(railStageName,countHistogram);countRelatedHistsByGroupName.set(runtimeGroupName,countHistogramMap);}else{countRelatedHistsByGroupName.get(runtimeGroupName).set(railStageName,countHistogram);}}
+function addTotalDurationHistogram(histogramName,time,histograms,durationRelatedHistsByGroupName){const durationHistogram=histograms.createHistogram(`${histogramName}:duration`,tr.b.Unit.byName.timeDurationInMs_smallerIsBetter,convertMicroToMilli_(time),{binBoundaries:DURATION_CUSTOM_BOUNDARIES,summaryOptions:SUMMARY_OPTIONS,});const durationRelatedHistogram=durationRelatedHistsByGroupName.get(histogramName);if(durationRelatedHistogram!==undefined){durationHistogram.diagnostics.set('RAIL stages',durationRelatedHistogram);}}
+function addTotalCountHistogram(histogramName,count,histograms,countRelatedHistsByGroupName){const countHistogram=histograms.createHistogram(`${histogramName}:count`,tr.b.Unit.byName.count_smallerIsBetter,count,{binBoundaries:COUNT_CUSTOM_BOUNDARIES,summaryOptions:SUMMARY_OPTIONS,});const countRelatedHistogram=countRelatedHistsByGroupName.get(histogramName);if(countRelatedHistogram!==undefined){countHistogram.diagnostics.set('RAIL stages',countRelatedHistogram);}}
+function computeRuntimeStatsBucketOnUE(histograms,slices,v8SlicesBucketOnUEMap){const durationRelatedHistsByGroupName=new Map();const countRelatedHistsByGroupName=new Map();for(const[name,slicesUE]of v8SlicesBucketOnUEMap){const runtimeGroupCollection=new tr.e.v8.RuntimeStatsGroupCollection();runtimeGroupCollection.addSlices(slicesUE);let overallV8Time=runtimeGroupCollection.totalTime;let overallV8Count=runtimeGroupCollection.totalCount;for(const runtimeGroup of runtimeGroupCollection.runtimeGroups){addDurationHistogram(name,runtimeGroup.name,runtimeGroup.time,histograms,durationRelatedHistsByGroupName);if(runtimeGroup.name==='Blink C++'){overallV8Time-=runtimeGroup.time;}
+addCountHistogram(name,runtimeGroup.name,runtimeGroup.count,histograms,countRelatedHistsByGroupName);if(runtimeGroup.name==='Blink C++'){overallV8Count-=runtimeGroup.count;}}
+addDurationHistogram(name,'V8-Only',overallV8Time,histograms,durationRelatedHistsByGroupName);addCountHistogram(name,'V8-Only',overallV8Count,histograms,countRelatedHistsByGroupName);}
+const runtimeGroupCollection=new tr.e.v8.RuntimeStatsGroupCollection();runtimeGroupCollection.addSlices(slices);let overallV8Time=runtimeGroupCollection.totalTime;let overallV8Count=runtimeGroupCollection.totalCount;for(const runtimeGroup of runtimeGroupCollection.runtimeGroups){addTotalDurationHistogram(runtimeGroup.name,runtimeGroup.time,histograms,durationRelatedHistsByGroupName);if(runtimeGroup.name==='Blink C++'){overallV8Time-=runtimeGroup.time;}
+addTotalCountHistogram(runtimeGroup.name,runtimeGroup.count,histograms,countRelatedHistsByGroupName);if(runtimeGroup.name==='Blink C++'){overallV8Count-=runtimeGroup.count;}}
+addTotalDurationHistogram('V8-Only',overallV8Time,histograms,durationRelatedHistsByGroupName);addTotalCountHistogram('V8-Only',overallV8Count,histograms,countRelatedHistsByGroupName);}
+function runtimeStatsTotalMetric(histograms,model){const v8ThreadSlices=[...model.getDescendantEvents()].filter(event=>event instanceof tr.e.v8.V8ThreadSlice).sort((e1,e2)=>e1.start-e2.start);const v8SlicesBucketOnUEMap=new Map();for(const expectation of model.userModel.expectations){const slices=expectation.range.filterArray(v8ThreadSlices,event=>event.start);if(slices.length===0)continue;const lastSlice=slices[slices.length-1];if(!expectation.range.intersectsRangeExclusive(lastSlice.range)){slices.pop();}
+if(v8SlicesBucketOnUEMap.get(expectation.stageTitle)===undefined){v8SlicesBucketOnUEMap.set(expectation.stageTitle,slices);}else{const totalSlices=v8SlicesBucketOnUEMap.get(expectation.stageTitle).concat(slices);v8SlicesBucketOnUEMap.set(expectation.stageTitle,totalSlices);}}
+computeRuntimeStatsBucketOnUE(histograms,v8ThreadSlices,v8SlicesBucketOnUEMap);}
+tr.metrics.MetricRegistry.register(runtimeStatsTotalMetric);tr.metrics.MetricRegistry.register(runtimeStatsMetric);return{runtimeStatsMetric,runtimeStatsTotalMetric,};});'use strict';tr.exportTo('tr.metrics.v8',function(){function v8AndMemoryMetrics(histograms,model){tr.metrics.v8.executionMetric(histograms,model);tr.metrics.v8.gcMetric(histograms,model);tr.metrics.sh.memoryMetric(histograms,model,{rangeOfInterest:tr.metrics.v8.utils.rangeForMemoryDumps(model)});}
+tr.metrics.MetricRegistry.register(v8AndMemoryMetrics);return{v8AndMemoryMetrics,};});'use strict';tr.exportTo('tr.metrics.webrtc',function(){const DISPLAY_HERTZ=60.0;const VSYNC_DURATION_US=1e6/DISPLAY_HERTZ;const SEVERITY=3;const FROZEN_FRAME_VSYNC_COUNT_THRESHOLD=6;const WEB_MEDIA_PLAYER_UPDATE_TITLE='WebMediaPlayerMS::UpdateCurrentFrame';const IDEAL_RENDER_INSTANT_NAME='Ideal Render Instant';const ACTUAL_RENDER_BEGIN_NAME='Actual Render Begin';const ACTUAL_RENDER_END_NAME='Actual Render End';const STREAM_ID_NAME='Serial';const REQUIRED_EVENT_ARGS_NAMES=[IDEAL_RENDER_INSTANT_NAME,ACTUAL_RENDER_BEGIN_NAME,ACTUAL_RENDER_END_NAME,STREAM_ID_NAME];const SUMMARY_OPTIONS=tr.v.Histogram.AVERAGE_ONLY_SUMMARY_OPTIONS;const count_smallerIsBetter=tr.b.Unit.byName.count_smallerIsBetter;const percentage_biggerIsBetter=tr.b.Unit.byName.normalizedPercentage_biggerIsBetter;const percentage_smallerIsBetter=tr.b.Unit.byName.normalizedPercentage_smallerIsBetter;const timeDurationInMs_smallerIsBetter=tr.b.Unit.byName.timeDurationInMs_smallerIsBetter;const unitlessNumber_biggerIsBetter=tr.b.Unit.byName.unitlessNumber_biggerIsBetter;function isValidEvent(event){if(event.title!==WEB_MEDIA_PLAYER_UPDATE_TITLE||!event.args){return false;}
+for(const parameter of REQUIRED_EVENT_ARGS_NAMES){if(!(parameter in event.args)){return false;}}
+return true;}
+function webrtcRenderingMetric(histograms,model){tr.metrics.v8.utils.groupAndProcessEvents(model,isValidEvent,event=>event.args[STREAM_ID_NAME],(streamName,events)=>getTimeStats(histograms,streamName,events));}
+tr.metrics.MetricRegistry.register(webrtcRenderingMetric);function getTimeStats(histograms,streamName,events){const frameHist=getFrameDistribution(histograms,events);addFpsFromFrameDistribution(histograms,frameHist);addFreezingScore(histograms,frameHist);const driftTimeStats=getDriftStats(events);histograms.createHistogram('WebRTCRendering_drift_time',timeDurationInMs_smallerIsBetter,driftTimeStats.driftTime,{summaryOptions:{count:false,min:false,percentile:[0.75,0.9],},});histograms.createHistogram('WebRTCRendering_rendering_length_error',percentage_smallerIsBetter,driftTimeStats.renderingLengthError,{summaryOptions:SUMMARY_OPTIONS,});const smoothnessStats=getSmoothnessStats(driftTimeStats.driftTime);histograms.createHistogram('WebRTCRendering_percent_badly_out_of_sync',percentage_smallerIsBetter,smoothnessStats.percentBadlyOutOfSync,{summaryOptions:SUMMARY_OPTIONS,});histograms.createHistogram('WebRTCRendering_percent_out_of_sync',percentage_smallerIsBetter,smoothnessStats.percentOutOfSync,{summaryOptions:SUMMARY_OPTIONS,});histograms.createHistogram('WebRTCRendering_smoothness_score',percentage_biggerIsBetter,smoothnessStats.smoothnessScore,{summaryOptions:SUMMARY_OPTIONS,});histograms.createHistogram('WebRTCRendering_frames_out_of_sync',count_smallerIsBetter,smoothnessStats.framesOutOfSync,{summaryOptions:SUMMARY_OPTIONS,});histograms.createHistogram('WebRTCRendering_frames_badly_out_of_sync',count_smallerIsBetter,smoothnessStats.framesSeverelyOutOfSync,{summaryOptions:SUMMARY_OPTIONS,});}
+const FRAME_DISTRIBUTION_BIN_BOUNDARIES=tr.v.HistogramBinBoundaries.createLinear(1,50,49);function getFrameDistribution(histograms,events){const cadence=tr.b.runLengthEncoding(events.map(e=>e.args[IDEAL_RENDER_INSTANT_NAME]));return histograms.createHistogram('WebRTCRendering_frame_distribution',count_smallerIsBetter,cadence.map(ticks=>ticks.count),{binBoundaries:FRAME_DISTRIBUTION_BIN_BOUNDARIES,summaryOptions:{percentile:[0.75,0.9],},});}
+function addFpsFromFrameDistribution(histograms,frameHist){let numberFrames=0;let numberVsyncs=0;for(let ticks=1;ticks<frameHist.allBins.length;++ticks){const count=frameHist.allBins[ticks].count;numberFrames+=count;numberVsyncs+=ticks*count;}
+const meanRatio=numberVsyncs/numberFrames;histograms.createHistogram('WebRTCRendering_fps',unitlessNumber_biggerIsBetter,DISPLAY_HERTZ/meanRatio,{summaryOptions:SUMMARY_OPTIONS,});}
+function frozenPenaltyWeight(numberFrozenFrames){const penalty={5:1,6:5,7:15,8:25};return penalty[numberFrozenFrames]||(8*(numberFrozenFrames-4));}
+function addFreezingScore(histograms,frameHist){let numberVsyncs=0;let freezingScore=0;let frozenFramesCount=0;for(let ticks=1;ticks<frameHist.allBins.length;++ticks){const count=frameHist.allBins[ticks].count;numberVsyncs+=ticks*count;if(ticks>=FROZEN_FRAME_VSYNC_COUNT_THRESHOLD){frozenFramesCount+=count*(ticks-1);freezingScore+=count*frozenPenaltyWeight(ticks-1);}}
+freezingScore=1-freezingScore/numberVsyncs;if(freezingScore<0){freezingScore=0;}
+histograms.createHistogram('WebRTCRendering_frozen_frames_count',count_smallerIsBetter,frozenFramesCount,{summaryOptions:SUMMARY_OPTIONS,});histograms.createHistogram('WebRTCRendering_freezing_score',percentage_biggerIsBetter,freezingScore,{summaryOptions:SUMMARY_OPTIONS,});}
+function getDriftStats(events){const driftTime=[];const discrepancy=[];let oldIdealRender=0;let expectedIdealRender=0;for(const event of events){const currentIdealRender=event.args[IDEAL_RENDER_INSTANT_NAME];expectedIdealRender+=VSYNC_DURATION_US;if(currentIdealRender===oldIdealRender){continue;}
+const actualRenderBegin=event.args[ACTUAL_RENDER_BEGIN_NAME];driftTime.push(actualRenderBegin-currentIdealRender);discrepancy.push(Math.abs(currentIdealRender-expectedIdealRender));expectedIdealRender=currentIdealRender;oldIdealRender=currentIdealRender;}
+const discrepancySum=tr.b.math.Statistics.sum(discrepancy)-
+discrepancy[0];const lastIdealRender=events[events.length-1].args[IDEAL_RENDER_INSTANT_NAME];const firstIdealRender=events[0].args[IDEAL_RENDER_INSTANT_NAME];const idealRenderSpan=lastIdealRender-firstIdealRender;const renderingLengthError=discrepancySum/idealRenderSpan;return{driftTime,renderingLengthError};}
+function getSmoothnessStats(driftTimes){const meanDriftTime=tr.b.math.Statistics.mean(driftTimes);const normDriftTimes=driftTimes.map(driftTime=>Math.abs(driftTime-meanDriftTime));const framesSeverelyOutOfSync=normDriftTimes.filter(driftTime=>driftTime>2*VSYNC_DURATION_US).length;const framesOutOfSync=normDriftTimes.filter(driftTime=>driftTime>VSYNC_DURATION_US).length;const percentBadlyOutOfSync=framesSeverelyOutOfSync/driftTimes.length;const percentOutOfSync=framesOutOfSync/driftTimes.length;const framesOutOfSyncOnlyOnce=framesOutOfSync-framesSeverelyOutOfSync;let smoothnessScore=1-(framesOutOfSyncOnlyOnce+
+SEVERITY*framesSeverelyOutOfSync)/driftTimes.length;if(smoothnessScore<0){smoothnessScore=0;}
+return{framesOutOfSync,framesSeverelyOutOfSync,percentBadlyOutOfSync,percentOutOfSync,smoothnessScore};}
+return{webrtcRenderingMetric,};});'use strict';Polymer({is:'tr-ui-a-alert-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],ready(){this.currentSelection_=undefined;this.$.table.tableColumns=[{title:'Label',value(row){return row.name;},width:'150px'},{title:'Value',width:'100%',value(row){return row.value;}}];this.$.table.showHeader=false;},get selection(){return this.currentSelection_;},set selection(selection){this.currentSelection_=selection;this.updateContents_();},getRowsForSingleAlert_(alert){const rows=[];for(const argName in alert.args){const argView=document.createElement('tr-ui-a-generic-object-view');argView.object=alert.args[argName];rows.push({name:argName,value:argView});}
+if(alert.associatedEvents.length){alert.associatedEvents.forEach(function(event,i){const linkEl=document.createElement('tr-ui-a-analysis-link');linkEl.setSelectionAndContent(new tr.model.EventSet(event),event.title);let valueString='';if(event instanceof tr.model.TimedEvent){valueString='took '+event.duration.toFixed(2)+'ms';}
+rows.push({name:linkEl,value:valueString});});}
+const descriptionEl=tr.ui.b.createDiv({textContent:alert.info.description,maxWidth:'300px'});rows.push({name:'Description',value:descriptionEl});if(alert.info.docLinks){alert.info.docLinks.forEach(function(linkObject){const linkEl=document.createElement('a');linkEl.target='_blank';linkEl.href=linkObject.href;Polymer.dom(linkEl).textContent=Polymer.dom(linkObject).textContent;rows.push({name:linkObject.label,value:linkEl});});}
+return rows;},getRowsForAlerts_(alerts){if(alerts.length===1){const rows=[{name:'Alert',value:tr.b.getOnlyElement(alerts).title}];const detailRows=this.getRowsForSingleAlert_(tr.b.getOnlyElement(alerts));rows.push.apply(rows,detailRows);return rows;}
+return alerts.map(function(alert){return{name:'Alert',value:alert.title,isExpanded:alerts.size<10,subRows:this.getRowsForSingleAlert_(alert)};},this);},updateContents_(){if(this.currentSelection_===undefined){this.$.table.rows=[];this.$.table.rebuild();return;}
+const alerts=this.currentSelection_;this.$.table.tableRows=this.getRowsForAlerts_(alerts);this.$.table.rebuild();},get relatedEventsToHighlight(){if(!this.currentSelection_)return undefined;const result=new tr.model.EventSet();for(const event of this.currentSelection_){result.addEventSet(event.associatedEvents);}
+return result;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-alert-sub-view',tr.model.Alert,{multi:false,title:'Alert',});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-alert-sub-view',tr.model.Alert,{multi:true,title:'Alerts',});'use strict';tr.exportTo('tr.ui.analysis',function(){const NO_BREAK_SPACE=String.fromCharCode(160);const RIGHTWARDS_ARROW=String.fromCharCode(8594);const COLLATOR=new Intl.Collator(undefined,{numeric:true});function TitleColumn(title){this.title=title;}
+TitleColumn.prototype={supportsCellSelection:false,value(row){const formattedTitle=this.formatTitle(row);const contexts=row.contexts;if(contexts===undefined||contexts.length===0){return formattedTitle;}
+const firstContext=contexts[0];const lastContext=contexts[contexts.length-1];let changeDefinedContextCount=0;for(let i=1;i<contexts.length;i++){if((contexts[i]===undefined)!==(contexts[i-1]===undefined)){changeDefinedContextCount++;}}
+let color=undefined;let prefix=undefined;if(!firstContext&&lastContext){color='red';prefix='+++';}else if(firstContext&&!lastContext){color='green';prefix='---';}
+if(changeDefinedContextCount>1){color='purple';}
+if(color===undefined&&prefix===undefined){return formattedTitle;}
+const titleEl=document.createElement('span');if(prefix!==undefined){const prefixEl=tr.ui.b.createSpan({textContent:prefix});prefixEl.style.fontFamily='monospace';Polymer.dom(titleEl).appendChild(prefixEl);Polymer.dom(titleEl).appendChild(tr.ui.b.asHTMLOrTextNode(NO_BREAK_SPACE));}
+if(color!==undefined){titleEl.style.color=color;}
+Polymer.dom(titleEl).appendChild(tr.ui.b.asHTMLOrTextNode(formattedTitle));return titleEl;},formatTitle(row){return row.title;},cmp(rowA,rowB){return COLLATOR.compare(rowA.title,rowB.title);}};function MemoryColumn(name,cellPath,aggregationMode){this.name=name;this.cellPath=cellPath;this.shouldSetContextGroup=false;this.aggregationMode=aggregationMode;}
+MemoryColumn.fromRows=function(rows,config){const cellNames=new Set();function gatherCellNames(rows){rows.forEach(function(row){if(row===undefined)return;const fieldCells=row[config.cellKey];if(fieldCells!==undefined){for(const[fieldName,fieldCell]of Object.entries(fieldCells)){if(fieldCell===undefined||fieldCell.fields===undefined){continue;}
+cellNames.add(fieldName);}}
+const subRows=row.subRows;if(subRows!==undefined){gatherCellNames(subRows);}});}
+gatherCellNames(rows);const positions=[];cellNames.forEach(function(cellName){const cellPath=[config.cellKey,cellName];const matchingRule=MemoryColumn.findMatchingRule(cellName,config.rules);const constructor=matchingRule.columnConstructor;const column=new constructor(cellName,cellPath,config.aggregationMode);column.shouldSetContextGroup=!!config.shouldSetContextGroup;positions.push({importance:matchingRule.importance,column});});positions.sort(function(a,b){if(a.importance===b.importance){return COLLATOR.compare(a.column.name,b.column.name);}
+return b.importance-a.importance;});return positions.map(function(position){return position.column;});};MemoryColumn.spaceEqually=function(columns){const columnWidth=(100/columns.length).toFixed(3)+'%';columns.forEach(function(column){column.width=columnWidth;});};MemoryColumn.findMatchingRule=function(name,rules){for(let i=0;i<rules.length;i++){const rule=rules[i];if(MemoryColumn.nameMatchesCondition(name,rule.condition)){return rule;}}
+return undefined;};MemoryColumn.nameMatchesCondition=function(name,condition){if(condition===undefined)return true;if(typeof(condition)==='string')return name===condition;return condition.test(name);};MemoryColumn.AggregationMode={DIFF:0,MAX:1};MemoryColumn.SOME_TIMESTAMPS_INFO_QUANTIFIER='at some selected timestamps';MemoryColumn.prototype={get title(){return this.name;},cell(row){let cell=row;const cellPath=this.cellPath;for(let i=0;i<cellPath.length;i++){if(cell===undefined)return undefined;cell=cell[cellPath[i]];}
+return cell;},aggregateCells(row,subRows){},fields(row){const cell=this.cell(row);if(cell===undefined)return undefined;return cell.fields;},value(row){const fields=this.fields(row);if(this.hasAllRelevantFieldsUndefined(fields))return'';const contexts=row.contexts;const color=this.color(fields,contexts);const infos=[];this.addInfos(fields,contexts,infos);const formattedFields=this.formatFields(fields);if((color===undefined||formattedFields==='')&&infos.length===0){return formattedFields;}
+const fieldEl=document.createElement('span');fieldEl.style.display='flex';fieldEl.style.alignItems='center';fieldEl.style.justifyContent='flex-end';Polymer.dom(fieldEl).appendChild(tr.ui.b.asHTMLOrTextNode(formattedFields));infos.forEach(function(info){const infoEl=document.createElement('span');infoEl.style.paddingLeft='4px';infoEl.style.cursor='help';infoEl.style.fontWeight='bold';Polymer.dom(infoEl).textContent=info.icon;if(info.color!==undefined){infoEl.style.color=info.color;}
+infoEl.title=info.message;Polymer.dom(fieldEl).appendChild(infoEl);},this);if(color!==undefined){fieldEl.style.color=color;}
+return fieldEl;},hasAllRelevantFieldsUndefined(fields){if(fields===undefined)return true;switch(this.aggregationMode){case MemoryColumn.AggregationMode.DIFF:return fields[0]===undefined&&fields[fields.length-1]===undefined;case MemoryColumn.AggregationMode.MAX:default:return fields.every(function(field){return field===undefined;});}},color(fields,contexts){return undefined;},formatFields(fields){if(fields.length===1){return this.formatSingleField(fields[0]);}
+return this.formatMultipleFields(fields);},formatSingleField(field){throw new Error('Not implemented');},formatMultipleFields(fields){switch(this.aggregationMode){case MemoryColumn.AggregationMode.DIFF:return this.formatMultipleFieldsDiff(fields[0],fields[fields.length-1]);case MemoryColumn.AggregationMode.MAX:return this.formatMultipleFieldsMax(fields);default:return tr.ui.b.createSpan({textContent:'(unsupported aggregation mode)',italic:true});}},formatMultipleFieldsDiff(firstField,lastField){throw new Error('Not implemented');},formatMultipleFieldsMax(fields){return this.formatSingleField(this.getMaxField(fields));},cmp(rowA,rowB){const fieldsA=this.fields(rowA);const fieldsB=this.fields(rowB);if(fieldsA!==undefined&&fieldsB!==undefined&&fieldsA.length!==fieldsB.length){throw new Error('Different number of fields');}
+const undefinedA=this.hasAllRelevantFieldsUndefined(fieldsA);const undefinedB=this.hasAllRelevantFieldsUndefined(fieldsB);if(undefinedA&&undefinedB)return 0;if(undefinedA)return-1;if(undefinedB)return 1;return this.compareFields(fieldsA,fieldsB);},compareFields(fieldsA,fieldsB){if(fieldsA.length===1){return this.compareSingleFields(fieldsA[0],fieldsB[0]);}
+return this.compareMultipleFields(fieldsA,fieldsB);},compareSingleFields(fieldA,fieldB){throw new Error('Not implemented');},compareMultipleFields(fieldsA,fieldsB){switch(this.aggregationMode){case MemoryColumn.AggregationMode.DIFF:return this.compareMultipleFieldsDiff(fieldsA[0],fieldsA[fieldsA.length-1],fieldsB[0],fieldsB[fieldsB.length-1]);case MemoryColumn.AggregationMode.MAX:return this.compareMultipleFieldsMax(fieldsA,fieldsB);default:return 0;}},compareMultipleFieldsDiff(firstFieldA,lastFieldA,firstFieldB,lastFieldB){throw new Error('Not implemented');},compareMultipleFieldsMax(fieldsA,fieldsB){return this.compareSingleFields(this.getMaxField(fieldsA),this.getMaxField(fieldsB));},getMaxField(fields){return fields.reduce(function(accumulator,field){if(field===undefined){return accumulator;}
+if(accumulator===undefined||this.compareSingleFields(field,accumulator)>0){return field;}
+return accumulator;}.bind(this),undefined);},addInfos(fields,contexts,infos){},getImportance(importanceRules){if(importanceRules.length===0)return 0;const matchingRule=MemoryColumn.findMatchingRule(this.name,importanceRules);if(matchingRule!==undefined){return matchingRule.importance;}
+let minImportance=importanceRules[0].importance;for(let i=1;i<importanceRules.length;i++){minImportance=Math.min(minImportance,importanceRules[i].importance);}
+return minImportance-1;}};function StringMemoryColumn(name,cellPath,aggregationMode){MemoryColumn.call(this,name,cellPath,aggregationMode);}
+StringMemoryColumn.prototype={__proto__:MemoryColumn.prototype,formatSingleField(string){return string;},formatMultipleFieldsDiff(firstString,lastString){if(firstString===undefined){const spanEl=tr.ui.b.createSpan({color:'red'});Polymer.dom(spanEl).appendChild(tr.ui.b.asHTMLOrTextNode('+'));Polymer.dom(spanEl).appendChild(tr.ui.b.asHTMLOrTextNode(this.formatSingleField(lastString)));return spanEl;}else if(lastString===undefined){const spanEl=tr.ui.b.createSpan({color:'green'});Polymer.dom(spanEl).appendChild(tr.ui.b.asHTMLOrTextNode('-'));Polymer.dom(spanEl).appendChild(tr.ui.b.asHTMLOrTextNode(this.formatSingleField(firstString)));return spanEl;}else if(firstString===lastString){return this.formatSingleField(firstString);}
+const spanEl=tr.ui.b.createSpan({color:'DarkOrange'});Polymer.dom(spanEl).appendChild(tr.ui.b.asHTMLOrTextNode(this.formatSingleField(firstString)));Polymer.dom(spanEl).appendChild(tr.ui.b.asHTMLOrTextNode(' '+RIGHTWARDS_ARROW+' '));Polymer.dom(spanEl).appendChild(tr.ui.b.asHTMLOrTextNode(this.formatSingleField(lastString)));return spanEl;},compareSingleFields(stringA,stringB){return COLLATOR.compare(stringA,stringB);},compareMultipleFieldsDiff(firstStringA,lastStringA,firstStringB,lastStringB){if(firstStringA===undefined&&firstStringB!==undefined){return 1;}
+if(firstStringA!==undefined&&firstStringB===undefined){return-1;}
+if(firstStringA===undefined&&firstStringB===undefined){return this.compareSingleFields(lastStringA,lastStringB);}
+if(lastStringA===undefined&&lastStringB!==undefined){return-1;}
+if(lastStringA!==undefined&&lastStringB===undefined){return 1;}
+if(lastStringA===undefined&&lastStringB===undefined){return this.compareSingleFields(firstStringB,firstStringA);}
+const areStringsAEqual=firstStringA===lastStringA;const areStringsBEqual=firstStringB===lastStringB;if(areStringsAEqual&&areStringsBEqual)return 0;if(areStringsAEqual)return-1;if(areStringsBEqual)return 1;return 0;}};function NumericMemoryColumn(name,cellPath,aggregationMode){MemoryColumn.call(this,name,cellPath,aggregationMode);}
+NumericMemoryColumn.DIFF_EPSILON=0.0001;NumericMemoryColumn.prototype={__proto__:MemoryColumn.prototype,align:tr.ui.b.TableFormat.ColumnAlignment.RIGHT,aggregateCells(row,subRows){const subRowCells=subRows.map(this.cell,this);let hasDefinedSubRowNumeric=false;let timestampCount=undefined;subRowCells.forEach(function(subRowCell){if(subRowCell===undefined)return;const subRowNumerics=subRowCell.fields;if(subRowNumerics===undefined)return;if(timestampCount===undefined){timestampCount=subRowNumerics.length;}else if(timestampCount!==subRowNumerics.length){throw new Error('Sub-rows have different numbers of timestamps');}
+if(hasDefinedSubRowNumeric){return;}
+hasDefinedSubRowNumeric=subRowNumerics.some(function(numeric){return numeric!==undefined;});});if(!hasDefinedSubRowNumeric){return;}
+const cellPath=this.cellPath;let rowCell=row;for(let i=0;i<cellPath.length;i++){const nextStepName=cellPath[i];let nextStep=rowCell[nextStepName];if(nextStep===undefined){if(i<cellPath.length-1){nextStep={};}else{nextStep=new MemoryCell(undefined);}
+rowCell[nextStepName]=nextStep;}
+rowCell=nextStep;}
+if(rowCell.fields===undefined){rowCell.fields=new Array(timestampCount);}else if(rowCell.fields.length!==timestampCount){throw new Error('Row has a different number of timestamps than sub-rows');}
+for(let i=0;i<timestampCount;i++){if(rowCell.fields[i]!==undefined)continue;rowCell.fields[i]=tr.model.MemoryAllocatorDump.aggregateNumerics(subRowCells.map(function(subRowCell){if(subRowCell===undefined||subRowCell.fields===undefined){return undefined;}
+return subRowCell.fields[i];}));}},formatSingleField(numeric){return tr.v.ui.createScalarSpan(numeric,{context:this.getFormattingContext(numeric.unit),contextGroup:this.shouldSetContextGroup?this.name:undefined,inline:true,});},getFormattingContext(unit){return undefined;},formatMultipleFieldsDiff(firstNumeric,lastNumeric){return this.formatSingleField(this.getDiffField_(firstNumeric,lastNumeric));},compareSingleFields(numericA,numericB){return numericA.value-numericB.value;},compareMultipleFieldsDiff(firstNumericA,lastNumericA,firstNumericB,lastNumericB){return this.getDiffFieldValue_(firstNumericA,lastNumericA)-
+this.getDiffFieldValue_(firstNumericB,lastNumericB);},getDiffField_(firstNumeric,lastNumeric){const definedNumeric=firstNumeric||lastNumeric;return new tr.b.Scalar(definedNumeric.unit.correspondingDeltaUnit,this.getDiffFieldValue_(firstNumeric,lastNumeric));},getDiffFieldValue_(firstNumeric,lastNumeric){const firstValue=firstNumeric===undefined?0:firstNumeric.value;const lastValue=lastNumeric===undefined?0:lastNumeric.value;const diff=lastValue-firstValue;return Math.abs(diff)<NumericMemoryColumn.DIFF_EPSILON?0:diff;}};function MemoryCell(fields){this.fields=fields;}
+MemoryCell.extractFields=function(cell){if(cell===undefined)return undefined;return cell.fields;};const RECURSIVE_EXPANSION_MAX_VISIBLE_ROW_COUNT=10;function expandTableRowsRecursively(table){let currentLevelRows=table.tableRows;let totalVisibleRowCount=currentLevelRows.length;while(currentLevelRows.length>0){let nextLevelRowCount=0;currentLevelRows.forEach(function(currentLevelRow){const subRows=currentLevelRow.subRows;if(subRows===undefined||subRows.length===0)return;nextLevelRowCount+=subRows.length;});if(totalVisibleRowCount+nextLevelRowCount>RECURSIVE_EXPANSION_MAX_VISIBLE_ROW_COUNT){break;}
+const nextLevelRows=new Array(nextLevelRowCount);let nextLevelRowIndex=0;currentLevelRows.forEach(function(currentLevelRow){const subRows=currentLevelRow.subRows;if(subRows===undefined||subRows.length===0)return;table.setExpandedForTableRow(currentLevelRow,true);subRows.forEach(function(subRow){nextLevelRows[nextLevelRowIndex++]=subRow;});});totalVisibleRowCount+=nextLevelRowCount;currentLevelRows=nextLevelRows;}}
+function aggregateTableRowCellsRecursively(row,columns,opt_predicate){const subRows=row.subRows;if(subRows===undefined||subRows.length===0)return;subRows.forEach(function(subRow){aggregateTableRowCellsRecursively(subRow,columns,opt_predicate);});if(opt_predicate===undefined||opt_predicate(row.contexts)){aggregateTableRowCells(row,subRows,columns);}}
+function aggregateTableRowCells(row,subRows,columns){columns.forEach(function(column){if(!(column instanceof MemoryColumn))return;column.aggregateCells(row,subRows);});}
+function createCells(timeToValues,valueFieldsGetter,opt_this){opt_this=opt_this||this;const fieldNameToFields=tr.b.invertArrayOfDicts(timeToValues,valueFieldsGetter,opt_this);return tr.b.mapItems(fieldNameToFields,function(fieldName,fields){return new tr.ui.analysis.MemoryCell(fields);});}
+function createWarningInfo(message){return{message,icon:String.fromCharCode(9888),color:'red'};}
+function DetailsNumericMemoryColumn(name,cellPath,aggregationMode){NumericMemoryColumn.call(this,name,cellPath,aggregationMode);}
+DetailsNumericMemoryColumn.prototype={__proto__:NumericMemoryColumn.prototype,getFormattingContext(unit){if(unit.baseUnit===tr.b.Unit.byName.sizeInBytes){return{unitPrefix:tr.b.UnitPrefixScale.BINARY.KIBI};}
+return undefined;}};return{TitleColumn,MemoryColumn,StringMemoryColumn,NumericMemoryColumn,MemoryCell,expandTableRowsRecursively,aggregateTableRowCellsRecursively,aggregateTableRowCells,createCells,createWarningInfo,DetailsNumericMemoryColumn,};});'use strict';tr.exportTo('tr.ui.analysis',function(){const LATIN_SMALL_LETTER_F_WITH_HOOK=String.fromCharCode(0x0192);const CIRCLED_LATIN_CAPITAL_LETTER_T=String.fromCharCode(0x24C9);const HeapDetailsRowDimension={ROOT:{},STACK_FRAME:{label:'Stack frame',symbol:LATIN_SMALL_LETTER_F_WITH_HOOK,color:'heap_dump_stack_frame'},OBJECT_TYPE:{label:'Object type',symbol:CIRCLED_LATIN_CAPITAL_LETTER_T,color:'heap_dump_object_type'}};function HeapDetailsTitleColumn(title){tr.ui.analysis.TitleColumn.call(this,title);}
+HeapDetailsTitleColumn.prototype={__proto__:tr.ui.analysis.TitleColumn.prototype,formatTitle(row){if(row.dimension===HeapDetailsRowDimension.ROOT){return row.title;}
+const symbolEl=document.createElement('span');Polymer.dom(symbolEl).textContent=row.dimension.symbol;symbolEl.title=row.dimension.label;symbolEl.style.color=tr.b.ColorScheme.getColorForReservedNameAsString(row.dimension.color);symbolEl.style.paddingRight='4px';symbolEl.style.cursor='help';symbolEl.style.fontWeight='bold';const titleEl=document.createElement('span');Polymer.dom(titleEl).appendChild(symbolEl);Polymer.dom(titleEl).appendChild(document.createTextNode(row.title));return titleEl;}};function AllocationCountColumn(name,cellPath,aggregationMode){tr.ui.analysis.DetailsNumericMemoryColumn.call(this,name,cellPath,aggregationMode);}
+AllocationCountColumn.prototype={__proto__:tr.ui.analysis.DetailsNumericMemoryColumn.prototype,getFormattingContext(unit){return{minimumFractionDigits:0};}};const HEAP_DETAILS_COLUMN_RULES=[{condition:'Size',importance:2,columnConstructor:tr.ui.analysis.DetailsNumericMemoryColumn},{condition:'Count',importance:1,columnConstructor:AllocationCountColumn},{importance:0,columnConstructor:tr.ui.analysis.DetailsNumericMemoryColumn}];return{HeapDetailsRowDimension,HeapDetailsTitleColumn,AllocationCountColumn,HEAP_DETAILS_COLUMN_RULES,};});'use strict';tr.exportTo('tr.ui.analysis',function(){const RebuildableBehavior={rebuild(){if(!this.paneDirty_){return;}
+this.paneDirty_=false;this.onRebuild_();},scheduleRebuild_(){if(this.paneDirty_)return;this.paneDirty_=true;tr.b.requestAnimationFrame(this.rebuild.bind(this));},onRebuild_(){}};return{RebuildableBehavior,};});'use strict';Polymer({is:'tr-ui-b-tab-view',properties:{label_:{type:String,value:()=>''},selectedSubView_:Object,subViews_:{type:Array,value:()=>[]},tabsHidden:{type:Boolean,value:false,observer:'tabsHiddenChanged_'}},ready(){this.$.tabs.addEventListener('keydown',this.onKeyDown_.bind(this),true);this.updateFocusability_();},set label(newLabel){this.set('label_',newLabel);},get tabs(){return this.get('subViews_');},get selectedSubView(){return this.selectedSubView_;},set selectedSubView(subView){if(subView===this.selectedSubView_)return;if(this.selectedSubView_){Polymer.dom(this.$.subView).removeChild(this.selectedSubView_);const oldInput=this.root.getElementById(this.computeRadioId_(this.selectedSubView_));if(oldInput){oldInput.checked=false;}}
+this.set('selectedSubView_',subView);if(subView){Polymer.dom(this.$.subView).appendChild(subView);const newInput=this.root.getElementById(this.computeRadioId_(subView));if(newInput){newInput.checked=true;}}
+this.fire('selected-tab-change');},clearSubViews(){this.splice('subViews_',0,this.subViews_.length);this.selectedSubView=undefined;this.updateFocusability_();},addSubView(subView){this.push('subViews_',subView);if(!this.selectedSubView_)this.selectedSubView=subView;this.updateFocusability_();},resetSubViews(subViews){this.splice('subViews_',0,this.subViews_.length);if(subViews.length){for(const subView of subViews){this.push('subViews_',subView);}
+this.selectedSubView=subViews[0];}else{this.selectedSubView=undefined;}
+this.updateFocusability_();},onTabChanged_(event){this.selectedSubView=event.model.item;},isChecked_(subView){return this.selectedSubView_===subView;},tabsHiddenChanged_(){this.updateFocusability_();},onKeyDown_(e){if(this.tabsHidden)return;let keyHandled=false;switch(e.keyCode){case 37:keyHandled=this.selectPreviousTabIfPossible();break;case 39:keyHandled=this.selectNextTabIfPossible();break;}
+if(!keyHandled)return;e.stopPropagation();e.preventDefault();},selectNextTabIfPossible(){return this.selectTabByOffsetIfPossible_(1);},selectPreviousTabIfPossible(){return this.selectTabByOffsetIfPossible_(-1);},selectTabByOffsetIfPossible_(offset){if(!this.selectedSubView_)return false;const currentIndex=this.subViews_.indexOf(this.selectedSubView_);const newSubView=this.tabs[currentIndex+offset];if(!newSubView)return false;this.selectedSubView=newSubView;return true;},shouldBeFocusable_(){return!this.tabsHidden&&this.subViews_.length>0;},updateFocusability_(){if(this.shouldBeFocusable_()){Polymer.dom(this.$.tabs).setAttribute('tabindex',0);}else{Polymer.dom(this.$.tabs).removeAttribute('tabindex');}},computeRadioId_(subView){return subView.tagName+'-'+subView.tabLabel.replace(/ /g,'-');}});'use strict';tr.exportTo('tr.ui.analysis',function(){const RESONABLE_NUMBER_OF_ROWS=200;const TabUiState={NO_LONG_TAIL:0,HIDING_LONG_TAIL:1,SHOWING_LONG_TAIL:2,};function EmptyFillerColumn(){}
+EmptyFillerColumn.prototype={title:'',value(){return'';},};Polymer({is:'tr-ui-a-memory-dump-heap-details-breakdown-view',behaviors:[tr.ui.analysis.RebuildableBehavior],created(){this.displayedNode_=undefined;this.dimensionToTab_=new Map();},ready(){this.scheduleRebuild_();this.root.addEventListener('keydown',this.onKeyDown_.bind(this),true);},get displayedNode(){return this.displayedNode_;},set displayedNode(node){this.displayedNode_=node;this.scheduleRebuild_();},get aggregationMode(){return this.aggregationMode_;},set aggregationMode(aggregationMode){this.aggregationMode_=aggregationMode;for(const tab of this.$.tabs.tabs){tab.aggregationMode=aggregationMode;}},onRebuild_(){const previouslySelectedTab=this.$.tabs.selectedSubView;let previouslySelectedTabFocused=false;let previouslySelectedDimension=undefined;if(previouslySelectedTab){previouslySelectedTabFocused=previouslySelectedTab.isFocused;previouslySelectedDimension=previouslySelectedTab.dimension;}
+for(const tab of this.$.tabs.tabs){tab.nodes=undefined;}
+this.$.tabs.clearSubViews();if(this.displayedNode_===undefined){this.$.tabs.label='No heap node provided.';return;}
+for(const[dimension,children]of this.displayedNode_.childNodes){if(!this.dimensionToTab_.has(dimension)){this.dimensionToTab_.set(dimension,document.createElement('tr-ui-a-memory-dump-heap-details-breakdown-view-tab'));}
+const tab=this.dimensionToTab_.get(dimension);tab.aggregationMode=this.aggregationMode_;tab.dimension=dimension;tab.nodes=children;this.$.tabs.addSubView(tab);tab.rebuild();if(dimension===previouslySelectedDimension){this.$.tabs.selectedSubView=tab;if(previouslySelectedTabFocused){tab.focus();}}}
+if(this.$.tabs.tabs.length>0){this.$.tabs.label='Break selected node further by:';}else{this.$.tabs.label='Selected node cannot be broken down any further.';}},onKeyDown_(keyEvent){if(!this.displayedNode_)return;let keyHandled=false;switch(keyEvent.keyCode){case 8:{if(!this.displayedNode_.parentNode)break;const viewEvent=new tr.b.Event('enter-node');viewEvent.node=this.displayedNode_.parentNode;this.dispatchEvent(viewEvent);keyHandled=true;break;}
+case 37:case 39:{const wasFocused=this.$.tabs.selectedSubView.isFocused;keyHandled=keyEvent.keyCode===37?this.$.tabs.selectPreviousTabIfPossible():this.$.tabs.selectNextTabIfPossible();if(wasFocused&&keyHandled){this.$.tabs.selectedSubView.focus();}}}
+if(!keyHandled)return;keyEvent.stopPropagation();keyEvent.preventDefault();}});Polymer({is:'tr-ui-a-memory-dump-heap-details-breakdown-view-tab',behaviors:[tr.ui.analysis.RebuildableBehavior],created(){this.dimension_=undefined;this.nodes_=undefined;this.aggregationMode_=undefined;this.displayLongTail_=false;},ready(){this.$.table.addEventListener('step-into',function(tableEvent){const viewEvent=new tr.b.Event('enter-node');viewEvent.node=tableEvent.tableRow;this.dispatchEvent(viewEvent);}.bind(this));},get displayLongTail(){return this.displayLongTail_;},set displayLongTail(newValue){if(this.displayLongTail===newValue)return;this.displayLongTail_=newValue;this.scheduleRebuild_();},get dimension(){return this.dimension_;},set dimension(dimension){this.dimension_=dimension;this.scheduleRebuild_();},get nodes(){return this.nodes_;},set nodes(nodes){this.nodes_=nodes;this.scheduleRebuild_();},get nodes(){return this.nodes_||[];},get dimensionLabel_(){if(this.dimension_===undefined)return'(undefined)';return this.dimension_.label;},get tabLabel(){let nodeCount=0;if(this.nodes_){nodeCount=this.nodes_.length;}
+return this.dimensionLabel_+' ('+nodeCount+')';},get tabIcon(){if(this.dimension_===undefined||this.dimension_===tr.ui.analysis.HeapDetailsRowDimension.ROOT){return undefined;}
+return{text:this.dimension_.symbol,style:'color: '+tr.b.ColorScheme.getColorForReservedNameAsString(this.dimension_.color)+';'};},get aggregationMode(){return this.aggregationMode_;},set aggregationMode(aggregationMode){this.aggregationMode_=aggregationMode;this.scheduleRebuild_();},focus(){this.$.table.focus();},blur(){this.$.table.blur();},get isFocused(){return this.$.table.isFocused;},onRebuild_(){this.$.table.selectionMode=tr.ui.b.TableFormat.SelectionMode.ROW;this.$.table.emptyValue='Cannot break down by '+
+this.dimensionLabel_.toLowerCase()+' any further.';const[state,rows]=this.getRows_();const total=this.nodes.length;const displayed=rows.length;const hidden=total-displayed;this.updateInfoBar_(state,[total,displayed,hidden]);this.$.table.tableRows=rows;this.$.table.tableColumns=this.createColumns_(rows);if(this.$.table.sortColumnIndex===undefined){this.$.table.sortColumnIndex=0;this.$.table.sortDescending=false;}
+this.$.table.rebuild();},createColumns_(rows){const titleColumn=new tr.ui.analysis.HeapDetailsTitleColumn(this.dimensionLabel_);titleColumn.width='400px';const numericColumns=tr.ui.analysis.MemoryColumn.fromRows(rows,{cellKey:'cells',aggregationMode:this.aggregationMode_,rules:tr.ui.analysis.HEAP_DETAILS_COLUMN_RULES,shouldSetContextGroup:true});if(numericColumns.length===0){numericColumns.push(new EmptyFillerColumn());}
+tr.ui.analysis.MemoryColumn.spaceEqually(numericColumns);const columns=[titleColumn].concat(numericColumns);return columns;},getRows_(){let rows=this.nodes;if(rows.length<=RESONABLE_NUMBER_OF_ROWS){return[TabUiState.NO_LONG_TAIL,rows];}else if(this.displayLongTail){return[TabUiState.SHOWING_LONG_TAIL,rows];}
+const absSize=row=>Math.max(row.cells.Size.fields[0].value);rows.sort((a,b)=>absSize(b)-absSize(a));rows=rows.slice(0,RESONABLE_NUMBER_OF_ROWS);return[TabUiState.HIDING_LONG_TAIL,rows];},updateInfoBar_(state,rowStats){if(state===TabUiState.SHOWING_LONG_TAIL){this.longTailVisibleInfoBar_(rowStats);}else if(state===TabUiState.HIDING_LONG_TAIL){this.longTailHiddenInfoBar_(rowStats);}else{this.hideInfoBar_();}},longTailVisibleInfoBar_(rowStats){const[total,visible,hidden]=rowStats;const couldHide=total-RESONABLE_NUMBER_OF_ROWS;this.$.info.message='Showing '+total+' rows. This may be slow.';this.$.info.removeAllButtons();const buttonText='Hide '+couldHide+' rows.';this.$.info.addButton(buttonText,()=>this.displayLongTail=false);this.$.info.visible=true;},longTailHiddenInfoBar_(rowStats){const[total,visible,hidden]=rowStats;this.$.info.message='Hiding the smallest '+hidden+' rows.';this.$.info.removeAllButtons();this.$.info.addButton('Show all.',()=>this.displayLongTail=true);this.$.info.visible=true;},hideInfoBar_(){this.$.info.visible=false;},});return{};});'use strict';tr.exportTo('tr.ui.analysis',function(){const DOWNWARDS_ARROW_WITH_TIP_RIGHTWARDS=String.fromCharCode(0x21B3);function HeapDetailsPathColumn(title){tr.ui.analysis.HeapDetailsTitleColumn.call(this,title);}
+HeapDetailsPathColumn.prototype={__proto__:tr.ui.analysis.HeapDetailsTitleColumn.prototype,formatTitle(row){const title=tr.ui.analysis.HeapDetailsTitleColumn.prototype.formatTitle.call(this,row);if(row.dimension===tr.ui.analysis.HeapDetailsRowDimension.ROOT){return title;}
+const arrowEl=document.createElement('span');Polymer.dom(arrowEl).textContent=DOWNWARDS_ARROW_WITH_TIP_RIGHTWARDS;arrowEl.style.paddingRight='2px';arrowEl.style.fontWeight='bold';arrowEl.style.color=tr.b.ColorScheme.getColorForReservedNameAsString('heap_dump_child_node_arrow');const rowEl=document.createElement('span');Polymer.dom(rowEl).appendChild(arrowEl);Polymer.dom(rowEl).appendChild(tr.ui.b.asHTMLOrTextNode(title));return rowEl;}};Polymer({is:'tr-ui-a-memory-dump-heap-details-path-view',behaviors:[tr.ui.analysis.RebuildableBehavior],created(){this.selectedNode_=undefined;this.aggregationMode_=undefined;},ready(){this.$.table.addEventListener('selection-changed',function(event){this.selectedNode_=this.$.table.selectedTableRow;this.didSelectedNodeChange_();}.bind(this));},didSelectedNodeChange_(){this.dispatchEvent(new tr.b.Event('selected-node-changed'));},get selectedNode(){return this.selectedNode_;},set selectedNode(node){this.selectedNode_=node;this.didSelectedNodeChange_();this.scheduleRebuild_();},get aggregationMode(){return this.aggregationMode_;},set aggregationMode(aggregationMode){this.aggregationMode_=aggregationMode;this.scheduleRebuild_();},onRebuild_(){if(this.selectedNode_===undefined){this.$.table.clear();return;}
+if(this.$.table.tableRows.includes(this.selectedNode_)){this.$.table.selectedTableRow=this.selectedNode_;return;}
+this.$.table.selectionMode=tr.ui.b.TableFormat.SelectionMode.ROW;this.$.table.userCanModifySortOrder=false;const rows=this.createRows_(this.selectedNode_);this.$.table.tableRows=rows;this.$.table.tableColumns=this.createColumns_(rows);this.$.table.selectedTableRow=rows[rows.length-1];},createRows_(node){const rows=[];while(node){rows.push(node);node=node.parentNode;}
+rows.reverse();return rows;},createColumns_(rows){const titleColumn=new HeapDetailsPathColumn('Current path');titleColumn.width='200px';const numericColumns=tr.ui.analysis.MemoryColumn.fromRows(rows,{cellKey:'cells',aggregationMode:this.aggregationMode_,rules:tr.ui.analysis.HEAP_DETAILS_COLUMN_RULES,shouldSetContextGroup:true});tr.ui.analysis.MemoryColumn.spaceEqually(numericColumns);return[titleColumn].concat(numericColumns);}});return{};});'use strict';tr.exportTo('tr.ui.analysis',function(){const StackedPaneImpl={set childPaneBuilder(childPaneBuilder){this.childPaneBuilder_=childPaneBuilder;this.dispatchEvent(new tr.b.Event('request-child-pane-change'));},get childPaneBuilder(){return this.childPaneBuilder_;},appended(){this.rebuild();}};const StackedPane=[tr.ui.analysis.RebuildableBehavior,StackedPaneImpl];return{StackedPane,};});Polymer({is:'tr-ui-a-stacked-pane',behaviors:[tr.ui.analysis.StackedPane]});'use strict';tr.exportTo('tr.ui.analysis',function(){const Scalar=tr.b.Scalar;const sizeInBytes_smallerIsBetter=tr.b.Unit.byName.sizeInBytes_smallerIsBetter;const count_smallerIsBetter=tr.b.Unit.byName.count_smallerIsBetter;const MultiDimensionalViewBuilder=tr.b.MultiDimensionalViewBuilder;const TotalState=tr.b.MultiDimensionalViewNode.TotalState;function HeapDumpTreeNode(stackFrameNodes,dimension,title,heavyView,parentNode){this.dimension=dimension;this.title=title;this.parentNode=parentNode;this.heavyView_=heavyView;this.stackFrameNodes_=stackFrameNodes;this.lazyCells_=undefined;this.lazyChildNodes_=undefined;}
+HeapDumpTreeNode.prototype={get minDisplayedTotalState_(){if(this.heavyView_){return TotalState.LOWER_BOUND;}
+return TotalState.EXACT;},get childNodes(){if(!this.lazyChildNodes_){this.lazyChildNodes_=new Map();this.addDimensionChildNodes_(tr.ui.analysis.HeapDetailsRowDimension.STACK_FRAME,0);this.addDimensionChildNodes_(tr.ui.analysis.HeapDetailsRowDimension.OBJECT_TYPE,1);this.releaseStackFrameNodesIfPossible_();}
+return this.lazyChildNodes_;},get cells(){if(!this.lazyCells_){this.addCells_();this.releaseStackFrameNodesIfPossible_();}
+return this.lazyCells_;},releaseStackFrameNodesIfPossible_(){if(this.lazyCells_&&this.lazyChildNodes_){this.stackFrameNodes_=undefined;}},addDimensionChildNodes_(dimension,dimensionIndex){const dimensionChildTitleToStackFrameNodes=tr.b.invertArrayOfDicts(this.stackFrameNodes_,node=>this.convertStackFrameNodeDimensionToChildDict_(node,dimensionIndex));const dimensionChildNodes=[];for(const[childTitle,childStackFrameNodes]of
+Object.entries(dimensionChildTitleToStackFrameNodes)){dimensionChildNodes.push(new HeapDumpTreeNode(childStackFrameNodes,dimension,childTitle,this.heavyView_,this));}
+this.lazyChildNodes_.set(dimension,dimensionChildNodes);},convertStackFrameNodeDimensionToChildDict_(stackFrameNode,dimensionIndex){const childDict={};let displayedChildrenTotalSize=0;let displayedChildrenTotalCount=0;let hasDisplayedChildren=false;let allDisplayedChildrenHaveDisplayedCounts=true;for(const child of stackFrameNode.children[dimensionIndex].values()){if(child.values[0].totalState<this.minDisplayedTotalState_){continue;}
+if(child.values[1].totalState<this.minDisplayedTotalState_){allDisplayedChildrenHaveDisplayedCounts=false;}
+childDict[child.title[dimensionIndex]]=child;displayedChildrenTotalSize+=child.values[0].total;displayedChildrenTotalCount+=child.values[1].total;hasDisplayedChildren=true;}
+const nodeTotalSize=stackFrameNode.values[0].total;const nodeTotalCount=stackFrameNode.values[1].total;const hasUnclassifiedSizeOrCount=displayedChildrenTotalSize<nodeTotalSize||displayedChildrenTotalCount<nodeTotalCount;if(!this.heavyView_&&hasUnclassifiedSizeOrCount&&hasDisplayedChildren){const otherTitle=stackFrameNode.title.slice();otherTitle[dimensionIndex]='<other>';const otherNode=new tr.b.MultiDimensionalViewNode(otherTitle,2);childDict[otherTitle[dimensionIndex]]=otherNode;otherNode.values[0].total=nodeTotalSize-displayedChildrenTotalSize;otherNode.values[0].totalState=this.minDisplayedTotalState_;otherNode.values[1].total=nodeTotalCount-displayedChildrenTotalCount;otherNode.values[1].totalState=allDisplayedChildrenHaveDisplayedCounts?this.minDisplayedTotalState_:TotalState.NOT_PROVIDED;}
+return childDict;},addCells_(){this.lazyCells_=tr.ui.analysis.createCells(this.stackFrameNodes_,function(stackFrameNode){const size=stackFrameNode.values[0].total;const numerics={'Size':new Scalar(sizeInBytes_smallerIsBetter,size)};const countValue=stackFrameNode.values[1];if(countValue.totalState>=this.minDisplayedTotalState_){const count=countValue.total;numerics.Count=new Scalar(count_smallerIsBetter,count);}
+return numerics;},this);}};Polymer({is:'tr-ui-a-memory-dump-heap-details-pane',behaviors:[tr.ui.analysis.StackedPane],created(){this.heapDumps_=undefined;this.viewMode_=undefined;this.aggregationMode_=undefined;this.cachedBuilders_=new Map();},ready(){this.$.info_bar.message='Note: Values displayed in the heavy view '+'are lower bounds (except for the root).';Polymer.dom(this.$.view_mode_container).appendChild(tr.ui.b.createSelector(this,'viewMode','memoryDumpHeapDetailsPane.viewMode',MultiDimensionalViewBuilder.ViewType.TOP_DOWN_TREE_VIEW,[{label:'Top-down (Tree)',value:MultiDimensionalViewBuilder.ViewType.TOP_DOWN_TREE_VIEW},{label:'Top-down (Heavy)',value:MultiDimensionalViewBuilder.ViewType.TOP_DOWN_HEAVY_VIEW},{label:'Bottom-up (Heavy)',value:MultiDimensionalViewBuilder.ViewType.BOTTOM_UP_HEAVY_VIEW}]));this.$.drag_handle.target=this.$.path_view;this.$.drag_handle.horizontal=false;this.$.path_view.addEventListener('selected-node-changed',(function(e){this.$.breakdown_view.displayedNode=this.$.path_view.selectedNode;}).bind(this));this.$.breakdown_view.addEventListener('enter-node',(function(e){this.$.path_view.selectedNode=e.node;}).bind(this));},set heapDumps(heapDumps){this.heapDumps_=heapDumps;this.scheduleRebuild_();},get heapDumps(){return this.heapDumps_;},set aggregationMode(aggregationMode){this.aggregationMode_=aggregationMode;this.$.path_view.aggregationMode=aggregationMode;this.$.breakdown_view.aggregationMode=aggregationMode;},get aggregationMode(){return this.aggregationMode_;},set viewMode(viewMode){this.viewMode_=viewMode;this.scheduleRebuild_();},get viewMode(){return this.viewMode_;},get heavyView(){switch(this.viewMode){case MultiDimensionalViewBuilder.ViewType.TOP_DOWN_HEAVY_VIEW:case MultiDimensionalViewBuilder.ViewType.BOTTOM_UP_HEAVY_VIEW:return true;default:return false;}},onRebuild_(){if(this.heapDumps_===undefined||this.heapDumps_.length===0){this.$.info_text.style.display='block';this.$.split_view.style.display='none';this.$.view_mode_container.style.display='none';this.$.info_bar.hidden=true;this.$.path_view.selectedNode=undefined;return;}
+this.$.info_text.style.display='none';this.$.split_view.style.display='flex';this.$.view_mode_container.style.display='block';this.$.info_bar.hidden=!this.heavyView;this.$.path_view.selectedNode=this.createHeapTree_();this.$.path_view.rebuild();this.$.breakdown_view.rebuild();},createHeapTree_(){const definedHeapDump=tr.b.findFirstInArray(this.heapDumps_);if(definedHeapDump===undefined)return undefined;const rootRowTitle=definedHeapDump.allocatorName;const stackFrameTrees=this.createStackFrameTrees_(this.heapDumps_);return new HeapDumpTreeNode(stackFrameTrees,tr.ui.analysis.HeapDetailsRowDimension.ROOT,rootRowTitle,this.heavyView);},createStackFrameTrees_(heapDumps){const builders=heapDumps.map(heapDump=>this.createBuilder_(heapDump));const views=builders.map(builder=>{if(builder===undefined)return undefined;return builder.buildView(this.viewMode);});return views;},createBuilder_(heapDump){if(heapDump===undefined)return undefined;if(this.cachedBuilders_.has(heapDump)){return this.cachedBuilders_.get(heapDump);}
+const dimensions=2;const valueCount=2;const builder=new MultiDimensionalViewBuilder(dimensions,valueCount);for(const entry of heapDump.entries){const leafStackFrame=entry.leafStackFrame;const stackTracePath=leafStackFrame===undefined?[]:leafStackFrame.getUserFriendlyStackTrace().reverse();const objectTypeName=entry.objectTypeName;const objectTypeNamePath=objectTypeName===undefined?[]:[objectTypeName];const valueKind=entry.valuesAreTotals?MultiDimensionalViewBuilder.ValueKind.TOTAL:MultiDimensionalViewBuilder.ValueKind.SELF;builder.addPath([stackTracePath,objectTypeNamePath],[entry.size,entry.count],valueKind);}
+builder.complete=heapDump.isComplete;this.cachedBuilders_.set(heapDump,builder);return builder;},});return{};});'use strict';tr.exportTo('tr.ui.analysis',function(){const URL_TO_SIZE_VS_EFFECTIVE_SIZE='https://chromium.googlesource.com/chromium/src/+/master/docs/memory-infra/README.md#effective_size-vs_size';const SUBALLOCATION_CONTEXT=true;const MemoryAllocatorDumpInfoType=tr.model.MemoryAllocatorDumpInfoType;const PROVIDED_SIZE_LESS_THAN_AGGREGATED_CHILDREN=MemoryAllocatorDumpInfoType.PROVIDED_SIZE_LESS_THAN_AGGREGATED_CHILDREN;const PROVIDED_SIZE_LESS_THAN_LARGEST_OWNER=MemoryAllocatorDumpInfoType.PROVIDED_SIZE_LESS_THAN_LARGEST_OWNER;const LEFTWARDS_OPEN_HEADED_ARROW=String.fromCharCode(0x21FD);const RIGHTWARDS_OPEN_HEADED_ARROW=String.fromCharCode(0x21FE);const EN_DASH=String.fromCharCode(0x2013);const CIRCLED_LATIN_SMALL_LETTER_I=String.fromCharCode(0x24D8);function AllocatorDumpNameColumn(){tr.ui.analysis.TitleColumn.call(this,'Component');}
+AllocatorDumpNameColumn.prototype={__proto__:tr.ui.analysis.TitleColumn.prototype,formatTitle(row){if(!row.suballocation){return row.title;}
+return tr.ui.b.createSpan({textContent:row.title,italic:true,tooltip:row.fullNames===undefined?undefined:row.fullNames.join(', ')});}};function getAndUpdateEntry(map,name,createdCallback){let entry=map.get(name);if(entry===undefined){entry={count:0};createdCallback(entry);map.set(name,entry);}
+entry.count++;return entry;}
+function SizeInfoMessageBuilder(){this.parts_=[];this.indent_=0;}
+SizeInfoMessageBuilder.prototype={append(){this.parts_.push.apply(this.parts_,Array.prototype.slice.apply(arguments));},appendMap(map,hasPluralSuffix,emptyText,itemCallback,opt_this){opt_this=opt_this||this;if(map.size===0){if(emptyText){this.append(emptyText);}}else if(map.size===1){this.parts_.push(' ');const key=map.keys().next().value;itemCallback.call(opt_this,key,map.get(key));}else{if(hasPluralSuffix){this.parts_.push('s');}
+this.parts_.push(':');this.indent_++;for(const key of map.keys()){this.parts_.push('\n',' '.repeat(3*(this.indent_-1)),' - ');itemCallback.call(opt_this,key,map.get(key));}
+this.indent_--;}},appendImportanceRange(range){this.append(' (importance: ');if(range.min===range.max){this.append(range.min);}else{this.append(range.min,EN_DASH,range.max);}
+this.append(')');},appendSizeIfDefined(size){if(size!==undefined){this.append(' (',tr.b.Unit.byName.sizeInBytes.format(size),')');}},appendSomeTimestampsQuantifier(){this.append(' ',tr.ui.analysis.MemoryColumn.SOME_TIMESTAMPS_INFO_QUANTIFIER);},build(){return this.parts_.join('');}};function EffectiveSizeColumn(name,cellPath,aggregationMode){tr.ui.analysis.DetailsNumericMemoryColumn.call(this,name,cellPath,aggregationMode);}
+EffectiveSizeColumn.prototype={__proto__:tr.ui.analysis.DetailsNumericMemoryColumn.prototype,get title(){return tr.ui.b.createLink({textContent:this.name,tooltip:'Memory used by this component',href:URL_TO_SIZE_VS_EFFECTIVE_SIZE});},addInfos(numerics,memoryAllocatorDumps,infos){if(memoryAllocatorDumps===undefined)return;const ownerNameToEntry=new Map();const ownedNameToEntry=new Map();for(let i=0;i<numerics.length;i++){if(numerics[i]===undefined)continue;const dump=memoryAllocatorDumps[i];if(dump===SUBALLOCATION_CONTEXT){return;}
+dump.ownedBy.forEach(function(ownerLink){const ownerDump=ownerLink.source;this.getAndUpdateOwnershipEntry_(ownerNameToEntry,ownerDump,ownerLink);},this);const ownedLink=dump.owns;if(ownedLink!==undefined){const ownedDump=ownedLink.target;const ownedEntry=this.getAndUpdateOwnershipEntry_(ownedNameToEntry,ownedDump,ownedLink,true);const sharerNameToEntry=ownedEntry.sharerNameToEntry;ownedDump.ownedBy.forEach(function(sharerLink){const sharerDump=sharerLink.source;if(sharerDump===dump)return;this.getAndUpdateOwnershipEntry_(sharerNameToEntry,sharerDump,sharerLink);},this);}}
+if(ownerNameToEntry.size>0){const messageBuilder=new SizeInfoMessageBuilder();messageBuilder.append('shared by');messageBuilder.appendMap(ownerNameToEntry,false,undefined,function(ownerName,ownerEntry){messageBuilder.append(ownerName);if(ownerEntry.count<numerics.length){messageBuilder.appendSomeTimestampsQuantifier();}
+messageBuilder.appendImportanceRange(ownerEntry.importanceRange);},this);infos.push({message:messageBuilder.build(),icon:LEFTWARDS_OPEN_HEADED_ARROW,color:'green'});}
+if(ownedNameToEntry.size>0){const messageBuilder=new SizeInfoMessageBuilder();messageBuilder.append('shares');messageBuilder.appendMap(ownedNameToEntry,false,undefined,function(ownedName,ownedEntry){messageBuilder.append(ownedName);const ownedCount=ownedEntry.count;if(ownedCount<numerics.length){messageBuilder.appendSomeTimestampsQuantifier();}
+messageBuilder.appendImportanceRange(ownedEntry.importanceRange);messageBuilder.append(' with');messageBuilder.appendMap(ownedEntry.sharerNameToEntry,false,' no other dumps',function(sharerName,sharerEntry){messageBuilder.append(sharerName);if(sharerEntry.count<ownedCount){messageBuilder.appendSomeTimestampsQuantifier();}
+messageBuilder.appendImportanceRange(sharerEntry.importanceRange);},this);},this);infos.push({message:messageBuilder.build(),icon:RIGHTWARDS_OPEN_HEADED_ARROW,color:'green'});}},getAndUpdateOwnershipEntry_(map,dump,link,opt_withSharerNameToEntry){const entry=getAndUpdateEntry(map,dump.quantifiedName,function(newEntry){newEntry.importanceRange=new tr.b.math.Range();if(opt_withSharerNameToEntry){newEntry.sharerNameToEntry=new Map();}});entry.importanceRange.addValue(link.importance||0);return entry;}};function SizeColumn(name,cellPath,aggregationMode){tr.ui.analysis.DetailsNumericMemoryColumn.call(this,name,cellPath,aggregationMode);}
+SizeColumn.prototype={__proto__:tr.ui.analysis.DetailsNumericMemoryColumn.prototype,get title(){return tr.ui.b.createLink({textContent:this.name,tooltip:'Memory requested by this component',href:URL_TO_SIZE_VS_EFFECTIVE_SIZE});},addInfos(numerics,memoryAllocatorDumps,infos){if(memoryAllocatorDumps===undefined)return;this.addOverlapInfo_(numerics,memoryAllocatorDumps,infos);this.addProvidedSizeWarningInfos_(numerics,memoryAllocatorDumps,infos);},addOverlapInfo_(numerics,memoryAllocatorDumps,infos){const siblingNameToEntry=new Map();for(let i=0;i<numerics.length;i++){if(numerics[i]===undefined)continue;const dump=memoryAllocatorDumps[i];if(dump===SUBALLOCATION_CONTEXT){return;}
+const ownedBySiblingSizes=dump.ownedBySiblingSizes;for(const siblingDump of ownedBySiblingSizes.keys()){const siblingName=siblingDump.name;getAndUpdateEntry(siblingNameToEntry,siblingName,function(newEntry){if(numerics.length===1){newEntry.size=ownedBySiblingSizes.get(siblingDump);}});}}
+if(siblingNameToEntry.size>0){const messageBuilder=new SizeInfoMessageBuilder();messageBuilder.append('overlaps with its sibling');messageBuilder.appendMap(siblingNameToEntry,true,undefined,function(siblingName,siblingEntry){messageBuilder.append('\'',siblingName,'\'');messageBuilder.appendSizeIfDefined(siblingEntry.size);if(siblingEntry.count<numerics.length){messageBuilder.appendSomeTimestampsQuantifier();}},this);infos.push({message:messageBuilder.build(),icon:CIRCLED_LATIN_SMALL_LETTER_I,color:'blue'});}},addProvidedSizeWarningInfos_(numerics,memoryAllocatorDumps,infos){const infoTypeToEntry=new Map();for(let i=0;i<numerics.length;i++){if(numerics[i]===undefined)continue;const dump=memoryAllocatorDumps[i];if(dump===SUBALLOCATION_CONTEXT){return;}
+dump.infos.forEach(function(dumpInfo){getAndUpdateEntry(infoTypeToEntry,dumpInfo.type,function(newEntry){if(numerics.length===1){newEntry.providedSize=dumpInfo.providedSize;newEntry.dependencySize=dumpInfo.dependencySize;}});});}
+for(const infoType of infoTypeToEntry.keys()){const entry=infoTypeToEntry.get(infoType);const messageBuilder=new SizeInfoMessageBuilder();messageBuilder.append('provided size');messageBuilder.appendSizeIfDefined(entry.providedSize);let dependencyName;switch(infoType){case PROVIDED_SIZE_LESS_THAN_AGGREGATED_CHILDREN:dependencyName='the aggregated size of the children';break;case PROVIDED_SIZE_LESS_THAN_LARGEST_OWNER:dependencyName='the size of the largest owner';break;default:dependencyName='an unknown dependency';break;}
+messageBuilder.append(' was less than ',dependencyName);messageBuilder.appendSizeIfDefined(entry.dependencySize);if(entry.count<numerics.length){messageBuilder.appendSomeTimestampsQuantifier();}
+infos.push(tr.ui.analysis.createWarningInfo(messageBuilder.build()));}}};const NUMERIC_COLUMN_RULES=[{condition:tr.model.MemoryAllocatorDump.EFFECTIVE_SIZE_NUMERIC_NAME,importance:10,columnConstructor:EffectiveSizeColumn},{condition:tr.model.MemoryAllocatorDump.SIZE_NUMERIC_NAME,importance:9,columnConstructor:SizeColumn},{condition:'page_size',importance:0,columnConstructor:tr.ui.analysis.DetailsNumericMemoryColumn},{condition:/size/,importance:5,columnConstructor:tr.ui.analysis.DetailsNumericMemoryColumn},{importance:0,columnConstructor:tr.ui.analysis.DetailsNumericMemoryColumn}];const DIAGNOSTIC_COLUMN_RULES=[{importance:0,columnConstructor:tr.ui.analysis.StringMemoryColumn}];Polymer({is:'tr-ui-a-memory-dump-allocator-details-pane',behaviors:[tr.ui.analysis.StackedPane],created(){this.memoryAllocatorDumps_=undefined;this.heapDumps_=undefined;this.aggregationMode_=undefined;},ready(){this.$.table.selectionMode=tr.ui.b.TableFormat.SelectionMode.ROW;},set memoryAllocatorDumps(memoryAllocatorDumps){this.memoryAllocatorDumps_=memoryAllocatorDumps;this.scheduleRebuild_();},get memoryAllocatorDumps(){return this.memoryAllocatorDumps_;},set heapDumps(heapDumps){this.heapDumps_=heapDumps;this.scheduleRebuild_();},set aggregationMode(aggregationMode){this.aggregationMode_=aggregationMode;this.scheduleRebuild_();},get aggregationMode(){return this.aggregationMode_;},onRebuild_(){if(this.memoryAllocatorDumps_===undefined||this.memoryAllocatorDumps_.length===0){this.$.info_text.style.display='block';this.$.table.style.display='none';this.$.table.clear();this.$.table.rebuild();this.childPaneBuilder=undefined;return;}
+this.$.info_text.style.display='none';this.$.table.style.display='block';const rows=this.createRows_();const columns=this.createColumns_(rows);rows.forEach(function(rootRow){tr.ui.analysis.aggregateTableRowCellsRecursively(rootRow,columns,function(contexts){return contexts!==undefined&&contexts.some(function(context){return context===SUBALLOCATION_CONTEXT;});});});this.$.table.tableRows=rows;this.$.table.tableColumns=columns;this.$.table.rebuild();tr.ui.analysis.expandTableRowsRecursively(this.$.table);if(this.heapDumps_===undefined){this.childPaneBuilder=undefined;}else{this.childPaneBuilder=function(){const pane=document.createElement('tr-ui-a-memory-dump-heap-details-pane');pane.heapDumps=this.heapDumps_;pane.aggregationMode=this.aggregationMode_;return pane;}.bind(this);}},createRows_(){return[this.createAllocatorRowRecursively_(this.memoryAllocatorDumps_)];},createAllocatorRowRecursively_(dumps){const definedDump=tr.b.findFirstInArray(dumps);const title=definedDump.name;const fullName=definedDump.fullName;const numericCells=tr.ui.analysis.createCells(dumps,function(dump){return dump.numerics;});const diagnosticCells=tr.ui.analysis.createCells(dumps,function(dump){return dump.diagnostics;});let suballocatedBy=undefined;if(title.startsWith('__')){for(let i=0;i<dumps.length;i++){const dump=dumps[i];if(dump===undefined||dump.ownedBy.length===0){continue;}
+const ownerDump=dump.ownedBy[0].source;if(dump.ownedBy.length>1||dump.children.length>0||ownerDump.containerMemoryDump!==dump.containerMemoryDump){suballocatedBy=undefined;break;}
+if(suballocatedBy===undefined){suballocatedBy=ownerDump.fullName;}else if(suballocatedBy!==ownerDump.fullName){suballocatedBy=undefined;break;}}}
+const row={title,fullNames:[fullName],contexts:dumps,numericCells,diagnosticCells,suballocatedBy};const childDumpNameToDumps=tr.b.invertArrayOfDicts(dumps,function(dump){return tr.b.arrayToDict(dump.children,function(child){return child.name;});});const subRows=[];let suballocationClassificationRootNode=undefined;for(const childDumps of Object.values(childDumpNameToDumps)){const childRow=this.createAllocatorRowRecursively_(childDumps);if(childRow.suballocatedBy===undefined){subRows.push(childRow);}else{suballocationClassificationRootNode=this.classifySuballocationRow_(childRow,suballocationClassificationRootNode);}}
+if(suballocationClassificationRootNode!==undefined){const suballocationRow=this.createSuballocationRowRecursively_('suballocations',suballocationClassificationRootNode);subRows.push(suballocationRow);}
+if(subRows.length>0){row.subRows=subRows;}
+return row;},classifySuballocationRow_(suballocationRow,rootNode){if(rootNode===undefined){rootNode={children:{},row:undefined};}
+const suballocationLevels=suballocationRow.suballocatedBy.split('/');let currentNode=rootNode;for(let i=0;i<suballocationLevels.length;i++){const suballocationLevel=suballocationLevels[i];let nextNode=currentNode.children[suballocationLevel];if(nextNode===undefined){currentNode.children[suballocationLevel]=nextNode={children:{},row:undefined};}
+currentNode=nextNode;}
+const existingRow=currentNode.row;if(existingRow!==undefined){for(let i=0;i<suballocationRow.contexts.length;i++){const newContext=suballocationRow.contexts[i];if(newContext===undefined)continue;if(existingRow.contexts[i]!==undefined){throw new Error('Multiple suballocations with the same owner name');}
+existingRow.contexts[i]=newContext;['numericCells','diagnosticCells'].forEach(function(cellKey){const suballocationCells=suballocationRow[cellKey];if(suballocationCells===undefined)return;for(const[cellName,cell]of Object.entries(suballocationCells)){if(cell===undefined)continue;const fields=cell.fields;if(fields===undefined)continue;const field=fields[i];if(field===undefined)continue;let existingCells=existingRow[cellKey];if(existingCells===undefined){existingCells={};existingRow[cellKey]=existingCells;}
+let existingCell=existingCells[cellName];if(existingCell===undefined){existingCell=new tr.ui.analysis.MemoryCell(new Array(fields.length));existingCells[cellName]=existingCell;}
+existingCell.fields[i]=field;}});}
+existingRow.fullNames.push.apply(existingRow.fullNames,suballocationRow.fullNames);}else{currentNode.row=suballocationRow;}
+return rootNode;},createSuballocationRowRecursively_(name,node){const childCount=Object.keys(node.children).length;if(childCount===0){if(node.row===undefined){throw new Error('Suballocation node must have a row or children');}
+const row=node.row;row.title=name;row.suballocation=true;return row;}
+const subRows=Object.values(tr.b.mapItems(node.children,this.createSuballocationRowRecursively_,this));if(node.row!==undefined){const row=node.row;row.title='<unspecified>';row.suballocation=true;subRows.unshift(row);}
+const contexts=new Array(subRows[0].contexts.length);for(let i=0;i<subRows.length;i++){subRows[i].contexts.forEach(function(subContext,index){if(subContext!==undefined){contexts[index]=SUBALLOCATION_CONTEXT;}});}
+return{title:name,suballocation:true,contexts,subRows};},createColumns_(rows){const titleColumn=new AllocatorDumpNameColumn();titleColumn.width='200px';const numericColumns=tr.ui.analysis.MemoryColumn.fromRows(rows,{cellKey:'numericCells',aggregationMode:this.aggregationMode_,rules:NUMERIC_COLUMN_RULES});const diagnosticColumns=tr.ui.analysis.MemoryColumn.fromRows(rows,{cellKey:'diagnosticCells',aggregationMode:this.aggregationMode_,rules:DIAGNOSTIC_COLUMN_RULES});const fieldColumns=numericColumns.concat(diagnosticColumns);tr.ui.analysis.MemoryColumn.spaceEqually(fieldColumns);const columns=[titleColumn].concat(fieldColumns);return columns;}});return{SUBALLOCATION_CONTEXT,AllocatorDumpNameColumn,EffectiveSizeColumn,SizeColumn,};});'use strict';tr.exportTo('tr.ui.analysis',function(){const Scalar=tr.b.Scalar;const sizeInBytes_smallerIsBetter=tr.b.Unit.byName.sizeInBytes_smallerIsBetter;const CONSTANT_COLUMN_RULES=[{condition:'Start address',importance:0,columnConstructor:tr.ui.analysis.StringMemoryColumn}];const VARIABLE_COLUMN_RULES=[{condition:'Virtual size',importance:7,columnConstructor:tr.ui.analysis.DetailsNumericMemoryColumn},{condition:'Protection flags',importance:6,columnConstructor:tr.ui.analysis.StringMemoryColumn},{condition:'PSS',importance:5,columnConstructor:tr.ui.analysis.DetailsNumericMemoryColumn},{condition:'Private dirty',importance:4,columnConstructor:tr.ui.analysis.DetailsNumericMemoryColumn},{condition:'Private clean',importance:3,columnConstructor:tr.ui.analysis.DetailsNumericMemoryColumn},{condition:'Shared dirty',importance:2,columnConstructor:tr.ui.analysis.DetailsNumericMemoryColumn},{condition:'Shared clean',importance:1,columnConstructor:tr.ui.analysis.DetailsNumericMemoryColumn},{condition:'Swapped',importance:0,columnConstructor:tr.ui.analysis.DetailsNumericMemoryColumn}];const BYTE_STAT_COLUMN_MAP={'proportionalResident':'PSS','privateDirtyResident':'Private dirty','privateCleanResident':'Private clean','sharedDirtyResident':'Shared dirty','sharedCleanResident':'Shared clean','swapped':'Swapped'};function hexString(address,is64BitAddress){if(address===undefined)return undefined;const hexPadding=is64BitAddress?'0000000000000000':'00000000';return(hexPadding+address.toString(16)).substr(-hexPadding.length);}
+function pruneEmptyRuleRows(row){if(row.subRows===undefined||row.subRows.length===0)return;if(row.subRows[0].rule===undefined){return;}
+row.subRows.forEach(pruneEmptyRuleRows);row.subRows=row.subRows.filter(function(subRow){return subRow.subRows.length>0;});}
+Polymer({is:'tr-ui-a-memory-dump-vm-regions-details-pane',behaviors:[tr.ui.analysis.StackedPane],created(){this.vmRegions_=undefined;this.aggregationMode_=undefined;},ready(){this.$.table.selectionMode=tr.ui.b.TableFormat.SelectionMode.ROW;},set vmRegions(vmRegions){this.vmRegions_=vmRegions;this.scheduleRebuild_();},get vmRegions(){return this.vmRegions_;},set aggregationMode(aggregationMode){this.aggregationMode_=aggregationMode;this.scheduleRebuild_();},get aggregationMode(){return this.aggregationMode_;},onRebuild_(){if(this.vmRegions_===undefined||this.vmRegions_.length===0){this.$.info_text.style.display='block';this.$.table.style.display='none';this.$.table.clear();this.$.table.rebuild();return;}
+this.$.info_text.style.display='none';this.$.table.style.display='block';const rows=this.createRows_(this.vmRegions_);const columns=this.createColumns_(rows);this.$.table.tableRows=rows;this.$.table.tableColumns=columns;this.$.table.rebuild();tr.ui.analysis.expandTableRowsRecursively(this.$.table);},createRows_(timeToVmRegionTree){const is64BitAddress=timeToVmRegionTree.some(function(vmRegionTree){if(vmRegionTree===undefined)return false;return vmRegionTree.someRegion(function(region){if(region.startAddress===undefined)return false;return region.startAddress>=4294967296;});});return[this.createClassificationNodeRow(timeToVmRegionTree,is64BitAddress)];},createClassificationNodeRow(timeToNode,is64BitAddress){const definedNode=tr.b.findFirstInArray(timeToNode);const childNodeIdToTimeToNode=Object.values(tr.b.invertArrayOfDicts(timeToNode,function(node){const children=node.children;if(children===undefined)return undefined;const childMap={};children.forEach(function(childNode){if(!childNode.hasRegions)return;childMap[childNode.title]=childNode;});return childMap;}));const childNodeSubRows=childNodeIdToTimeToNode.map(function(timeToChildNode){return this.createClassificationNodeRow(timeToChildNode,is64BitAddress);},this);const regionIdToTimeToRegion=Object.values(tr.b.invertArrayOfDicts(timeToNode,function(node){const regions=node.regions;if(regions===undefined)return undefined;return tr.b.arrayToDict(regions,function(region){return region.uniqueIdWithinProcess;});}));const regionSubRows=regionIdToTimeToRegion.map(function(timeToRegion){return this.createRegionRow_(timeToRegion,is64BitAddress);},this);const subRows=childNodeSubRows.concat(regionSubRows);return{title:definedNode.title,contexts:timeToNode,variableCells:this.createVariableCells_(timeToNode),subRows};},createRegionRow_(timeToRegion,is64BitAddress){const definedRegion=tr.b.findFirstInArray(timeToRegion);return{title:definedRegion.mappedFile,contexts:timeToRegion,constantCells:this.createConstantCells_(definedRegion,is64BitAddress),variableCells:this.createVariableCells_(timeToRegion)};},createConstantCells_(definedRegion,is64BitAddress){return tr.ui.analysis.createCells([definedRegion],function(region){const startAddress=region.startAddress;if(startAddress===undefined)return undefined;return{'Start address':hexString(startAddress,is64BitAddress)};});},createVariableCells_(timeToRegion){return tr.ui.analysis.createCells(timeToRegion,function(region){const fields={};const sizeInBytes=region.sizeInBytes;if(sizeInBytes!==undefined){fields['Virtual size']=new Scalar(sizeInBytes_smallerIsBetter,sizeInBytes);}
+const protectionFlags=region.protectionFlagsToString;if(protectionFlags!==undefined){fields['Protection flags']=protectionFlags;}
+for(const[byteStatName,columnName]of
+Object.entries(BYTE_STAT_COLUMN_MAP)){const byteStat=region.byteStats[byteStatName];if(byteStat===undefined)continue;fields[columnName]=new Scalar(sizeInBytes_smallerIsBetter,byteStat);}
+return fields;});},createColumns_(rows){const titleColumn=new tr.ui.analysis.TitleColumn('Mapped file');titleColumn.width='200px';const constantColumns=tr.ui.analysis.MemoryColumn.fromRows(rows,{cellKey:'constantCells',aggregationMode:undefined,rules:CONSTANT_COLUMN_RULES});const variableColumns=tr.ui.analysis.MemoryColumn.fromRows(rows,{cellKey:'variableCells',aggregationMode:this.aggregationMode_,rules:VARIABLE_COLUMN_RULES});const fieldColumns=constantColumns.concat(variableColumns);tr.ui.analysis.MemoryColumn.spaceEqually(fieldColumns);const columns=[titleColumn].concat(fieldColumns);return columns;}});return{};});'use strict';Polymer({is:'tr-ui-b-color-legend',ready(){const blackSquareCharCode=9632;this.$.square.innerText=String.fromCharCode(blackSquareCharCode);this.label_=undefined;this.compoundEventSelectionState_=tr.model.CompoundEventSelectionState.NOT_SELECTED;},set compoundEventSelectionState(compoundEventSelectionState){this.compoundEventSelectionState_=compoundEventSelectionState;},get label(){return this.label_;},set label(label){if(label===undefined){this.setLabelAndColorId(undefined,undefined);return;}
+const colorId=tr.b.ColorScheme.getColorIdForGeneralPurposeString(label);this.setLabelAndColorId(label,colorId);},setLabelAndColorId(label,colorId){this.label_=label;Polymer.dom(this.$.label).textContent='';Polymer.dom(this.$.label).appendChild(tr.ui.b.asHTMLOrTextNode(label));if(colorId===undefined){this.$.square.style.color='initial';}else{this.$.square.style.color=tr.b.ColorScheme.colorsAsStrings[colorId];}}});'use strict';Polymer({is:'tr-ui-b-view-specific-brushing-state',get viewId(){return this.getAttribute('view-id');},set viewId(viewId){Polymer.dom(this).setAttribute('view-id',viewId);},get(){const viewId=this.viewId;if(!viewId){throw new Error('Element must have a view-id attribute!');}
+const brushingStateController=tr.c.BrushingStateController.getControllerForElement(this);if(!brushingStateController)return undefined;return brushingStateController.getViewSpecificBrushingState(viewId);},set(state){const viewId=this.viewId;if(!viewId){throw new Error('Element must have a view-id attribute!');}
+const brushingStateController=tr.c.BrushingStateController.getControllerForElement(this);if(!brushingStateController)return;brushingStateController.changeViewSpecificBrushingState(viewId,state);}});'use strict';tr.exportTo('tr.ui.analysis',function(){const MemoryColumnColorScheme=tr.b.MemoryColumnColorScheme;const Scalar=tr.b.Scalar;const sizeInBytes_smallerIsBetter=tr.b.Unit.byName.sizeInBytes_smallerIsBetter;const PLATFORM_SPECIFIC_TOTAL_NAME_SUFFIX='_bytes';const DISPLAYED_SIZE_NUMERIC_NAME=tr.model.MemoryAllocatorDump.DISPLAYED_SIZE_NUMERIC_NAME;const SOME_TIMESTAMPS_INFO_QUANTIFIER=tr.ui.analysis.MemoryColumn.SOME_TIMESTAMPS_INFO_QUANTIFIER;const RIGHTWARDS_ARROW_WITH_HOOK=String.fromCharCode(0x21AA);const RIGHTWARDS_ARROW_FROM_BAR=String.fromCharCode(0x21A6);const GREATER_THAN_OR_EQUAL_TO=String.fromCharCode(0x2265);const UNMARRIED_PARTNERSHIP_SYMBOL=String.fromCharCode(0x26AF);const TRIGRAM_FOR_HEAVEN=String.fromCharCode(0x2630);function lazyMap(list,fn,opt_this){opt_this=opt_this||this;let result=undefined;list.forEach(function(item,index){const value=fn.call(opt_this,item,index);if(value===undefined)return;if(result===undefined){result=new Array(list.length);}
+result[index]=value;});return result;}
+function ProcessNameColumn(){tr.ui.analysis.TitleColumn.call(this,'Process');}
+ProcessNameColumn.prototype={__proto__:tr.ui.analysis.TitleColumn.prototype,formatTitle(row){if(row.contexts===undefined){return row.title;}
+const titleEl=document.createElement('tr-ui-b-color-legend');titleEl.label=row.title;return titleEl;}};function UsedMemoryColumn(name,cellPath,aggregationMode){tr.ui.analysis.NumericMemoryColumn.call(this,name,cellPath,aggregationMode);}
+UsedMemoryColumn.COLOR=MemoryColumnColorScheme.getColor('used_memory_column').toString();UsedMemoryColumn.OLDER_COLOR=MemoryColumnColorScheme.getColor('older_used_memory_column').toString();UsedMemoryColumn.prototype={__proto__:tr.ui.analysis.NumericMemoryColumn.prototype,get title(){return tr.ui.b.createSpan({textContent:this.name,color:UsedMemoryColumn.COLOR});},getFormattingContext(unit){return{unitPrefix:tr.b.UnitPrefixScale.BINARY.MEBI};},color(numerics,processMemoryDumps){return UsedMemoryColumn.COLOR;},getChildPaneBuilder(processMemoryDumps){if(processMemoryDumps===undefined)return undefined;const vmRegions=lazyMap(processMemoryDumps,function(pmd){if(pmd===undefined)return undefined;return pmd.mostRecentVmRegions;});if(vmRegions===undefined)return undefined;return function(){const pane=document.createElement('tr-ui-a-memory-dump-vm-regions-details-pane');pane.vmRegions=vmRegions;pane.aggregationMode=this.aggregationMode;return pane;}.bind(this);}};function PeakMemoryColumn(name,cellPath,aggregationMode){UsedMemoryColumn.call(this,name,cellPath,aggregationMode);}
+PeakMemoryColumn.prototype={__proto__:UsedMemoryColumn.prototype,addInfos(numerics,processMemoryDumps,infos){if(processMemoryDumps===undefined)return;let resettableValueCount=0;let nonResettableValueCount=0;for(let i=0;i<numerics.length;i++){if(numerics[i]===undefined)continue;if(processMemoryDumps[i].arePeakResidentBytesResettable){resettableValueCount++;}else{nonResettableValueCount++;}}
+if(resettableValueCount>0&&nonResettableValueCount>0){infos.push(tr.ui.analysis.createWarningInfo('Both resettable and '+'non-resettable peak RSS values were provided by the process'));}else if(resettableValueCount>0){infos.push({icon:RIGHTWARDS_ARROW_WITH_HOOK,message:'Peak RSS since previous memory dump.'});}else{infos.push({icon:RIGHTWARDS_ARROW_FROM_BAR,message:'Peak RSS since process startup. Finer grained '+'peaks require a Linux kernel version '+
+GREATER_THAN_OR_EQUAL_TO+' 4.0.'});}}};function ByteStatColumn(name,cellPath,aggregationMode){UsedMemoryColumn.call(this,name,cellPath,aggregationMode);}
+ByteStatColumn.prototype={__proto__:UsedMemoryColumn.prototype,color(numerics,processMemoryDumps){if(processMemoryDumps===undefined){return UsedMemoryColumn.COLOR;}
+const allOlderValues=processMemoryDumps.every(function(processMemoryDump){if(processMemoryDump===undefined)return true;return!processMemoryDump.hasOwnVmRegions;});if(allOlderValues){return UsedMemoryColumn.OLDER_COLOR;}
+return UsedMemoryColumn.COLOR;},addInfos(numerics,processMemoryDumps,infos){if(processMemoryDumps===undefined)return;let olderValueCount=0;for(let i=0;i<numerics.length;i++){const processMemoryDump=processMemoryDumps[i];if(processMemoryDump!==undefined&&!processMemoryDump.hasOwnVmRegions){olderValueCount++;}}
+if(olderValueCount===0){return;}
+const infoQuantifier=olderValueCount<numerics.length?' '+SOME_TIMESTAMPS_INFO_QUANTIFIER:'';infos.push({message:'Older value'+infoQuantifier+' (only heavy (purple) memory dumps contain memory maps).',icon:UNMARRIED_PARTNERSHIP_SYMBOL});}};UsedMemoryColumn.RULES=[{condition:'Total resident',importance:10,columnConstructor:UsedMemoryColumn},{condition:'Peak total resident',importance:9,columnConstructor:PeakMemoryColumn},{condition:'PSS',importance:8,columnConstructor:ByteStatColumn},{condition:'Private dirty',importance:7,columnConstructor:ByteStatColumn},{condition:'Swapped',importance:6,columnConstructor:ByteStatColumn},{importance:0,columnConstructor:UsedMemoryColumn}];UsedMemoryColumn.TOTALS_MAP={'residentBytes':'Total resident','peakResidentBytes':'Peak total resident'};UsedMemoryColumn.BYTE_STAT_MAP={'proportionalResident':'PSS','privateDirtyResident':'Private dirty','swapped':'Swapped'};function AllocatorColumn(name,cellPath,aggregationMode){tr.ui.analysis.NumericMemoryColumn.call(this,name,cellPath,aggregationMode);}
+AllocatorColumn.prototype={__proto__:tr.ui.analysis.NumericMemoryColumn.prototype,get title(){const titleEl=document.createElement('tr-ui-b-color-legend');titleEl.label=this.name;return titleEl;},getFormattingContext(unit){return{unitPrefix:tr.b.UnitPrefixScale.BINARY.MEBI};},addInfos(numerics,processMemoryDumps,infos){if(processMemoryDumps===undefined)return;let heapDumpCount=0;let missingSizeCount=0;for(let i=0;i<processMemoryDumps.length;i++){const processMemoryDump=processMemoryDumps[i];if(processMemoryDump===undefined)continue;const heapDumps=processMemoryDump.heapDumps;if(heapDumps!==undefined&&heapDumps[this.name]!==undefined){heapDumpCount++;}
+const allocatorDump=processMemoryDump.getMemoryAllocatorDumpByFullName(this.name);if(allocatorDump!==undefined&&allocatorDump.numerics[DISPLAYED_SIZE_NUMERIC_NAME]===undefined){missingSizeCount++;}}
+if(heapDumpCount>0){const infoQuantifier=heapDumpCount<numerics.length?' '+SOME_TIMESTAMPS_INFO_QUANTIFIER:'';infos.push({message:'Heap dump provided'+infoQuantifier+'.',icon:TRIGRAM_FOR_HEAVEN});}
+if(missingSizeCount>0){const infoQuantifier=missingSizeCount<numerics.length?' '+SOME_TIMESTAMPS_INFO_QUANTIFIER:'';infos.push(tr.ui.analysis.createWarningInfo('Size was not provided'+infoQuantifier+'.'));}},getChildPaneBuilder(processMemoryDumps){if(processMemoryDumps===undefined)return undefined;const memoryAllocatorDumps=lazyMap(processMemoryDumps,function(pmd){if(pmd===undefined)return undefined;return pmd.getMemoryAllocatorDumpByFullName(this.name);},this);if(memoryAllocatorDumps===undefined)return undefined;const heapDumps=lazyMap(processMemoryDumps,function(pmd){if(pmd===undefined||pmd.heapDumps===undefined)return undefined;return pmd.heapDumps[this.name];},this);return function(){const pane=document.createElement('tr-ui-a-memory-dump-allocator-details-pane');pane.memoryAllocatorDumps=memoryAllocatorDumps;pane.heapDumps=heapDumps;pane.aggregationMode=this.aggregationMode;return pane;}.bind(this);}};function TracingColumn(name,cellPath,aggregationMode){AllocatorColumn.call(this,name,cellPath,aggregationMode);}
+TracingColumn.COLOR=MemoryColumnColorScheme.getColor('tracing_memory_column').toString();TracingColumn.prototype={__proto__:AllocatorColumn.prototype,get title(){return tr.ui.b.createSpan({textContent:this.name,color:TracingColumn.COLOR});},color(numerics,processMemoryDumps){return TracingColumn.COLOR;}};AllocatorColumn.RULES=[{condition:'tracing',importance:0,columnConstructor:TracingColumn},{importance:1,columnConstructor:AllocatorColumn}];Polymer({is:'tr-ui-a-memory-dump-overview-pane',behaviors:[tr.ui.analysis.StackedPane],created(){this.processMemoryDumps_=undefined;this.aggregationMode_=undefined;},ready(){this.$.table.selectionMode=tr.ui.b.TableFormat.SelectionMode.CELL;this.$.table.addEventListener('selection-changed',function(tableEvent){tableEvent.stopPropagation();this.changeChildPane_();}.bind(this));},set processMemoryDumps(processMemoryDumps){this.processMemoryDumps_=processMemoryDumps;this.scheduleRebuild_();},get processMemoryDumps(){return this.processMemoryDumps_;},set aggregationMode(aggregationMode){this.aggregationMode_=aggregationMode;this.scheduleRebuild_();},get aggregationMode(){return this.aggregationMode_;},get selectedMemoryCell(){if(this.processMemoryDumps_===undefined||this.processMemoryDumps_.length===0){return undefined;}
+const selectedTableRow=this.$.table.selectedTableRow;if(!selectedTableRow)return undefined;const selectedColumnIndex=this.$.table.selectedColumnIndex;if(selectedColumnIndex===undefined)return undefined;const selectedColumn=this.$.table.tableColumns[selectedColumnIndex];const selectedMemoryCell=selectedColumn.cell(selectedTableRow);return selectedMemoryCell;},changeChildPane_(){this.storeSelection_();this.childPaneBuilder=this.determineChildPaneBuilderFromSelection_();},determineChildPaneBuilderFromSelection_(){if(this.processMemoryDumps_===undefined||this.processMemoryDumps_.length===0){return undefined;}
+const selectedTableRow=this.$.table.selectedTableRow;if(!selectedTableRow)return undefined;const selectedColumnIndex=this.$.table.selectedColumnIndex;if(selectedColumnIndex===undefined)return undefined;const selectedColumn=this.$.table.tableColumns[selectedColumnIndex];return selectedColumn.getChildPaneBuilder(selectedTableRow.contexts);},onRebuild_(){if(this.processMemoryDumps_===undefined||this.processMemoryDumps_.length===0){this.$.info_text.style.display='block';this.$.table.style.display='none';this.$.table.clear();this.$.table.rebuild();return;}
+this.$.info_text.style.display='none';this.$.table.style.display='block';const rows=this.createRows_();const columns=this.createColumns_(rows);const footerRows=this.createFooterRows_(rows,columns);this.$.table.tableRows=rows;this.$.table.footerRows=footerRows;this.$.table.tableColumns=columns;this.$.table.rebuild();this.restoreSelection_();},createRows_(){const timeToPidToProcessMemoryDump=this.processMemoryDumps_;const pidToTimeToProcessMemoryDump=tr.b.invertArrayOfDicts(timeToPidToProcessMemoryDump);return Object.values(tr.b.mapItems(pidToTimeToProcessMemoryDump,function(pid,timeToDump){const process=tr.b.findFirstInArray(timeToDump).process;const usedMemoryCells=tr.ui.analysis.createCells(timeToDump,function(dump){const sizes={};const totals=dump.totals;if(totals!==undefined){for(const[totalName,cellName]of
+Object.entries(UsedMemoryColumn.TOTALS_MAP)){const total=totals[totalName];if(total===undefined)continue;sizes[cellName]=new Scalar(sizeInBytes_smallerIsBetter,total);}
+const platformSpecific=totals.platformSpecific;if(platformSpecific!==undefined){for(const[name,size]of
+Object.entries(platformSpecific)){let newName=name;if(name.endsWith(PLATFORM_SPECIFIC_TOTAL_NAME_SUFFIX)){newName=name.substring(0,name.length-
+PLATFORM_SPECIFIC_TOTAL_NAME_SUFFIX.length);}
+newName=newName.replace('_',' ').trim();newName=newName.charAt(0).toUpperCase()+
+newName.slice(1);sizes[newName]=new Scalar(sizeInBytes_smallerIsBetter,size);}}}
+const vmRegions=dump.mostRecentVmRegions;if(vmRegions!==undefined){for(const[byteStatName,cellName]of
+Object.entries(UsedMemoryColumn.BYTE_STAT_MAP)){const byteStat=vmRegions.byteStats[byteStatName];if(byteStat===undefined)continue;sizes[cellName]=new Scalar(sizeInBytes_smallerIsBetter,byteStat);}}
+return sizes;});const allocatorCells=tr.ui.analysis.createCells(timeToDump,function(dump){const memoryAllocatorDumps=dump.memoryAllocatorDumps;if(memoryAllocatorDumps===undefined)return undefined;const sizes={};memoryAllocatorDumps.forEach(function(allocatorDump){let rootDisplayedSizeNumeric=allocatorDump.numerics[DISPLAYED_SIZE_NUMERIC_NAME];if(rootDisplayedSizeNumeric===undefined){rootDisplayedSizeNumeric=new Scalar(sizeInBytes_smallerIsBetter,0);}
+sizes[allocatorDump.fullName]=rootDisplayedSizeNumeric;});return sizes;});return{title:process.userFriendlyName,contexts:timeToDump,usedMemoryCells,allocatorCells};}));},createFooterRows_(rows,columns){if(rows.length<=1)return[];const totalRow={title:'Total'};tr.ui.analysis.aggregateTableRowCells(totalRow,rows,columns);return[totalRow];},createColumns_(rows){const titleColumn=new ProcessNameColumn();titleColumn.width='200px';const usedMemorySizeColumns=tr.ui.analysis.MemoryColumn.fromRows(rows,{cellKey:'usedMemoryCells',aggregationMode:this.aggregationMode_,rules:UsedMemoryColumn.RULES});const allocatorSizeColumns=tr.ui.analysis.MemoryColumn.fromRows(rows,{cellKey:'allocatorCells',aggregationMode:this.aggregationMode_,rules:AllocatorColumn.RULES});const sizeColumns=usedMemorySizeColumns.concat(allocatorSizeColumns);tr.ui.analysis.MemoryColumn.spaceEqually(sizeColumns);const columns=[titleColumn].concat(sizeColumns);return columns;},storeSelection_(){let selectedRowTitle;const selectedRow=this.$.table.selectedTableRow;if(selectedRow!==undefined){selectedRowTitle=selectedRow.title;}
+let selectedColumnName;const selectedColumnIndex=this.$.table.selectedColumnIndex;if(selectedColumnIndex!==undefined){const selectedColumn=this.$.table.tableColumns[selectedColumnIndex];selectedColumnName=selectedColumn.name;}
+this.$.state.set({rowTitle:selectedRowTitle,columnName:selectedColumnName});},restoreSelection_(){const settings=this.$.state.get();if(settings===undefined||settings.rowTitle===undefined||settings.columnName===undefined){return;}
+const selectedColumnName=settings.columnName;const selectedColumnIndex=tr.b.findFirstIndexInArray(this.$.table.tableColumns,function(column){return column.name===selectedColumnName;});if(selectedColumnIndex<0)return;const selectedRowTitle=settings.rowTitle;const selectedRow=tr.b.findFirstInArray(this.$.table.tableRows,function(row){return row.title===selectedRowTitle;});if(selectedRow===undefined)return;this.$.table.selectedTableRow=selectedRow;this.$.table.selectedColumnIndex=selectedColumnIndex;}});return{ProcessNameColumn,UsedMemoryColumn,PeakMemoryColumn,ByteStatColumn,AllocatorColumn,TracingColumn,};});'use strict';tr.exportTo('tr.ui.analysis',function(){Polymer({is:'tr-ui-a-memory-dump-header-pane',behaviors:[tr.ui.analysis.StackedPane],created(){this.containerMemoryDumps_=undefined;},ready(){Polymer.dom(this.$.aggregation_mode_container).appendChild(tr.ui.b.createSelector(this,'aggregationMode','memoryDumpHeaderPane.aggregationMode',tr.ui.analysis.MemoryColumn.AggregationMode.DIFF,[{label:'Diff',value:tr.ui.analysis.MemoryColumn.AggregationMode.DIFF},{label:'Max',value:tr.ui.analysis.MemoryColumn.AggregationMode.MAX}]));},set containerMemoryDumps(containerMemoryDumps){this.containerMemoryDumps_=containerMemoryDumps;this.scheduleRebuild_();},get containerMemoryDumps(){return this.containerMemoryDumps_;},set aggregationMode(aggregationMode){this.aggregationMode_=aggregationMode;this.scheduleRebuild_();},get aggregationMode(){return this.aggregationMode_;},onRebuild_(){this.updateLabel_();this.updateAggregationModeSelector_();this.changeChildPane_();},updateLabel_(){Polymer.dom(this.$.label).textContent='';if(this.containerMemoryDumps_===undefined||this.containerMemoryDumps_.length<=0){Polymer.dom(this.$.label).textContent='No memory dumps selected';return;}
+const containerDumpCount=this.containerMemoryDumps_.length;const isMultiSelection=containerDumpCount>1;Polymer.dom(this.$.label).appendChild(document.createTextNode('Selected '+containerDumpCount+' memory dump'+
+(isMultiSelection?'s':'')+' in '+this.containerMemoryDumps_[0].containerName+' at '));Polymer.dom(this.$.label).appendChild(document.createTextNode(tr.b.Unit.byName.timeStampInMs.format(this.containerMemoryDumps_[0].start)));if(isMultiSelection){const ELLIPSIS=String.fromCharCode(8230);Polymer.dom(this.$.label).appendChild(document.createTextNode(ELLIPSIS));Polymer.dom(this.$.label).appendChild(document.createTextNode(tr.b.Unit.byName.timeStampInMs.format(this.containerMemoryDumps_[containerDumpCount-1].start)));}},updateAggregationModeSelector_(){let displayStyle;if(this.containerMemoryDumps_===undefined||this.containerMemoryDumps_.length<=1){displayStyle='none';}else{displayStyle='initial';}
+this.$.aggregation_mode_container.style.display=displayStyle;},changeChildPane_(){this.childPaneBuilder=function(){if(this.containerMemoryDumps_===undefined||this.containerMemoryDumps_.length<=0){return undefined;}
+const overviewPane=document.createElement('tr-ui-a-memory-dump-overview-pane');overviewPane.processMemoryDumps=this.containerMemoryDumps_.map(function(containerDump){return containerDump.processMemoryDumps;});overviewPane.aggregationMode=this.aggregationMode;return overviewPane;}.bind(this);}});return{};});'use strict';Polymer({is:'tr-ui-a-stacked-pane-view',setPaneBuilder(paneBuilder,opt_parentPane){const paneContainer=this.$.pane_container;if(opt_parentPane){if(!(opt_parentPane instanceof HTMLElement)){throw new Error('Parent pane must be an HTML element');}
+if(opt_parentPane.parentElement!==paneContainer){throw new Error('Parent pane must be a child of the pane container');}}
+while(Polymer.dom(paneContainer).lastElementChild!==null&&Polymer.dom(paneContainer).lastElementChild!==opt_parentPane){const removedPane=Polymer.dom(this.$.pane_container).lastElementChild;const listener=this.listeners_.get(removedPane);if(listener===undefined){throw new Error('No listener associated with pane');}
+this.listeners_.delete(removedPane);removedPane.removeEventListener('request-child-pane-change',listener);Polymer.dom(paneContainer).removeChild(removedPane);}
+if(opt_parentPane&&opt_parentPane.parentElement!==paneContainer){throw new Error('Parent pane was removed from the pane container');}
+if(!paneBuilder)return;const pane=paneBuilder();if(!pane)return;if(!(pane instanceof HTMLElement)){throw new Error('Pane must be an HTML element');}
+const listener=function(event){this.setPaneBuilder(pane.childPaneBuilder,pane);}.bind(this);if(!this.listeners_){this.listeners_=new WeakMap();}
+this.listeners_.set(pane,listener);pane.addEventListener('request-child-pane-change',listener);Polymer.dom(paneContainer).appendChild(pane);pane.appended();},rebuild(){let currentPane=Polymer.dom(this.$.pane_container).firstElementChild;while(currentPane){currentPane.rebuild();currentPane=currentPane.nextElementSibling;}},get panesForTesting(){const panes=[];let currentChild=Polymer.dom(this.$.pane_container).firstElementChild;while(currentChild){panes.push(currentChild);currentChild=currentChild.nextElementSibling;}
+return panes;}});'use strict';tr.exportTo('tr.ui.analysis',function(){Polymer({is:'tr-ui-a-container-memory-dump-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],set selection(selection){if(selection===undefined){this.currentSelection_=undefined;this.dumpsByContainerName_=undefined;this.updateContents_();return;}
+selection.forEach(function(event){if(!(event instanceof tr.model.ContainerMemoryDump)){throw new Error('Memory dump sub-view only supports container memory dumps');}});this.currentSelection_=selection;this.dumpsByContainerName_=tr.b.groupIntoMap(this.currentSelection_.toArray(),dump=>dump.containerName);for(const dumps of this.dumpsByContainerName_.values()){dumps.sort((a,b)=>a.start-b.start);}
+this.updateContents_();},get selection(){return this.currentSelection_;},get requiresTallView(){return true;},updateContents_(){Polymer.dom(this.$.content).textContent='';if(this.dumpsByContainerName_===undefined)return;const containerNames=Array.from(this.dumpsByContainerName_.keys());if(containerNames.length===0)return;if(containerNames.length>1){this.buildViewForMultipleContainerNames_();}else{this.buildViewForSingleContainerName_();}},buildViewForSingleContainerName_(){const containerMemoryDumps=tr.b.getFirstElement(this.dumpsByContainerName_.values());const dumpView=this.ownerDocument.createElement('tr-ui-a-stacked-pane-view');Polymer.dom(this.$.content).appendChild(dumpView);dumpView.setPaneBuilder(function(){const headerPane=document.createElement('tr-ui-a-memory-dump-header-pane');headerPane.containerMemoryDumps=containerMemoryDumps;return headerPane;});},buildViewForMultipleContainerNames_(){const ownerDocument=this.ownerDocument;const rows=[];for(const[containerName,dumps]of this.dumpsByContainerName_){rows.push({containerName,subRows:dumps,isExpanded:true,});}
+rows.sort(function(a,b){return a.containerName.localeCompare(b.containerName);});const columns=[{title:'Dump',value(row){if(row.subRows===undefined){return this.singleDumpValue_(row);}
+return this.groupedDumpValue_(row);},singleDumpValue_(row){const linkEl=ownerDocument.createElement('tr-ui-a-analysis-link');linkEl.setSelectionAndContent(new tr.model.EventSet([row]));Polymer.dom(linkEl).appendChild(tr.v.ui.createScalarSpan(row.start,{unit:tr.b.Unit.byName.timeStampInMs,ownerDocument}));return linkEl;},groupedDumpValue_(row){const linkEl=ownerDocument.createElement('tr-ui-a-analysis-link');linkEl.setSelectionAndContent(new tr.model.EventSet(row.subRows));Polymer.dom(linkEl).appendChild(tr.ui.b.createSpan({ownerDocument,textContent:row.subRows.length+' memory dump'+
+(row.subRows.length===1?'':'s')+' in '}));Polymer.dom(linkEl).appendChild(tr.ui.b.createSpan({ownerDocument,textContent:row.containerName,bold:true}));return linkEl;}}];const table=this.ownerDocument.createElement('tr-ui-b-table');table.tableColumns=columns;table.tableRows=rows;table.showHeader=false;table.rebuild();Polymer.dom(this.$.content).appendChild(table);}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-container-memory-dump-sub-view',tr.model.GlobalMemoryDump,{multi:false,title:'Global Memory Dump',});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-container-memory-dump-sub-view',tr.model.GlobalMemoryDump,{multi:true,title:'Global Memory Dumps',});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-container-memory-dump-sub-view',tr.model.ProcessMemoryDump,{multi:false,title:'Process Memory Dump',});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-container-memory-dump-sub-view',tr.model.ProcessMemoryDump,{multi:true,title:'Process Memory Dumps',});return{};});'use strict';(function(){const COUNTER_SAMPLE_TABLE_COLUMNS=[{title:'Counter',width:'150px',value(row){return row.counter;}},{title:'Series',width:'150px',value(row){return row.series;}},{title:'Time',width:'150px',value(row){return row.start;}},{title:'Value',width:'100%',value(row){return row.value;}}];Polymer({is:'tr-ui-a-counter-sample-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],ready(){this.currentSelection_=undefined;this.$.table.tableColumns=COUNTER_SAMPLE_TABLE_COLUMNS;},get selection(){return this.currentSelection_;},set selection(selection){this.currentSelection_=selection;this.updateContents_();},updateContents_(){this.$.table.tableRows=this.selection?this.getRows_(this.selection.toArray()):[];this.$.table.rebuild();},getRows_(samples){const samplesByCounter=tr.b.groupIntoMap(samples,sample=>sample.series.counter.guid);const rows=[];for(const counterSamples of samplesByCounter.values()){const samplesBySeries=tr.b.groupIntoMap(counterSamples,sample=>sample.series.guid);for(const seriesSamples of samplesBySeries.values()){const seriesRows=this.getRowsForSamples_(seriesSamples);seriesRows[0].counter=seriesSamples[0].series.counter.name;seriesRows[0].series=seriesSamples[0].series.name;if(seriesRows.length>1){seriesRows[0].subRows=seriesRows.slice(1);seriesRows[0].isExpanded=true;}
+rows.push(seriesRows[0]);}}
+return rows;},getRowsForSamples_(samples){return samples.map(function(sample){return{start:sample.timestamp,value:sample.value};});}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-counter-sample-sub-view',tr.model.CounterSample,{multi:false,title:'Counter Sample',});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-counter-sample-sub-view',tr.model.CounterSample,{multi:true,title:'Counter Samples',});})();'use strict';tr.exportTo('tr.ui.analysis',function(){function MultiEventSummary(title,events){this.title=title;this.duration_=undefined;this.selfTime_=undefined;this.events_=events;this.cpuTimesComputed_=false;this.cpuSelfTime_=undefined;this.cpuDuration_=undefined;this.maxDuration_=undefined;this.maxCpuDuration_=undefined;this.maxSelfTime_=undefined;this.maxCpuSelfTime_=undefined;this.untotallableArgs_=[];this.totalledArgs_=undefined;}
+MultiEventSummary.prototype={set title(title){if(title==='Totals'){this.totalsRow=true;}
+this.title_=title;},get title(){return this.title_;},get duration(){if(this.duration_===undefined){this.duration_=tr.b.math.Statistics.sum(this.events_,function(event){return event.duration;});}
+return this.duration_;},get cpuSelfTime(){this.computeCpuTimesIfNeeded_();return this.cpuSelfTime_;},get cpuDuration(){this.computeCpuTimesIfNeeded_();return this.cpuDuration_;},computeCpuTimesIfNeeded_(){if(this.cpuTimesComputed_)return;this.cpuTimesComputed_=true;let cpuSelfTime=0;let cpuDuration=0;let hasCpuData=false;for(const event of this.events_){if(event.cpuDuration!==undefined){cpuDuration+=event.cpuDuration;hasCpuData=true;}
+if(event.cpuSelfTime!==undefined){cpuSelfTime+=event.cpuSelfTime;hasCpuData=true;}}
+if(hasCpuData){this.cpuDuration_=cpuDuration;this.cpuSelfTime_=cpuSelfTime;}},get selfTime(){if(this.selfTime_===undefined){this.selfTime_=0;for(const event of this.events_){if(event.selfTime!==undefined){this.selfTime_+=event.selfTime;}}}
+return this.selfTime_;},get events(){return this.events_;},get numEvents(){return this.events_.length;},get numAlerts(){if(this.numAlerts_===undefined){this.numAlerts_=tr.b.math.Statistics.sum(this.events_,event=>event.associatedAlerts.length);}
+return this.numAlerts_;},get untotallableArgs(){this.updateArgsIfNeeded_();return this.untotallableArgs_;},get totalledArgs(){this.updateArgsIfNeeded_();return this.totalledArgs_;},get maxDuration(){if(this.maxDuration_===undefined){this.maxDuration_=tr.b.math.Statistics.max(this.events_,function(event){return event.duration;});}
+return this.maxDuration_;},get maxCpuDuration(){if(this.maxCpuDuration_===undefined){this.maxCpuDuration_=tr.b.math.Statistics.max(this.events_,function(event){return event.cpuDuration;});}
+return this.maxCpuDuration_;},get maxSelfTime(){if(this.maxSelfTime_===undefined){this.maxSelfTime_=tr.b.math.Statistics.max(this.events_,function(event){return event.selfTime;});}
+return this.maxSelfTime_;},get maxCpuSelfTime(){if(this.maxCpuSelfTime_===undefined){this.maxCpuSelfTime_=tr.b.math.Statistics.max(this.events_,function(event){return event.cpuSelfTime;});}
+return this.maxCpuSelfTime_;},updateArgsIfNeeded_(){if(this.totalledArgs_!==undefined)return;const untotallableArgs={};const totalledArgs={};for(const event of this.events_){for(const argName in event.args){const argVal=event.args[argName];const type=typeof argVal;if(type!=='number'){untotallableArgs[argName]=true;delete totalledArgs[argName];continue;}
+if(untotallableArgs[argName]){continue;}
+if(totalledArgs[argName]===undefined){totalledArgs[argName]=0;}
+totalledArgs[argName]+=argVal;}}
+this.untotallableArgs_=Object.keys(untotallableArgs);this.totalledArgs_=totalledArgs;}};return{MultiEventSummary,};});'use strict';Polymer({is:'tr-ui-a-multi-event-summary-table',ready(){this.showTotals_=false;this.eventsHaveDuration_=true;this.eventsHaveSubRows_=true;this.eventsByTitle_=undefined;},updateTableColumns_(rows,maxValues){let hasCpuData=false;let hasAlerts=false;rows.forEach(function(row){if(row.cpuDuration!==undefined){hasCpuData=true;}
+if(row.cpuSelfTime!==undefined){hasCpuData=true;}
+if(row.numAlerts){hasAlerts=true;}});const ownerDocument=this.ownerDocument;const columns=[];columns.push({title:'Name',value(row){if(row.title==='Totals')return'Totals';const linkEl=document.createElement('tr-ui-a-analysis-link');linkEl.setSelectionAndContent(function(){return new tr.model.EventSet(row.events);},row.title);return linkEl;},width:'350px',cmp(rowA,rowB){return rowA.title.localeCompare(rowB.title);}});if(this.eventsHaveDuration_){columns.push({title:'Wall Duration',value(row){return tr.v.ui.createScalarSpan(row.duration,{unit:tr.b.Unit.byName.timeDurationInMs,customContextRange:row.totalsRow?undefined:tr.b.math.Range.fromExplicitRange(0,maxValues.duration),ownerDocument,});},width:'<upated further down>',cmp(rowA,rowB){return rowA.duration-rowB.duration;}});}
+if(this.eventsHaveDuration_&&hasCpuData){columns.push({title:'CPU Duration',value(row){return tr.v.ui.createScalarSpan(row.cpuDuration,{unit:tr.b.Unit.byName.timeDurationInMs,customContextRange:row.totalsRow?undefined:tr.b.math.Range.fromExplicitRange(0,maxValues.cpuDuration),ownerDocument,});},width:'<upated further down>',cmp(rowA,rowB){return rowA.cpuDuration-rowB.cpuDuration;}});}
+if(this.eventsHaveSubRows_&&this.eventsHaveDuration_){columns.push({title:'Self time',value(row){return tr.v.ui.createScalarSpan(row.selfTime,{unit:tr.b.Unit.byName.timeDurationInMs,customContextRange:row.totalsRow?undefined:tr.b.math.Range.fromExplicitRange(0,maxValues.selfTime),ownerDocument,});},width:'<upated further down>',cmp(rowA,rowB){return rowA.selfTime-rowB.selfTime;}});}
+if(this.eventsHaveSubRows_&&this.eventsHaveDuration_&&hasCpuData){columns.push({title:'CPU Self Time',value(row){return tr.v.ui.createScalarSpan(row.cpuSelfTime,{unit:tr.b.Unit.byName.timeDurationInMs,customContextRange:row.totalsRow?undefined:tr.b.math.Range.fromExplicitRange(0,maxValues.cpuSelfTime),ownerDocument,});},width:'<upated further down>',cmp(rowA,rowB){return rowA.cpuSelfTime-rowB.cpuSelfTime;}});}
+if(this.eventsHaveDuration_){columns.push({title:'Average '+(hasCpuData?'CPU':'Wall')+' Duration',value(row){const totalDuration=hasCpuData?row.cpuDuration:row.duration;return tr.v.ui.createScalarSpan(totalDuration/row.numEvents,{unit:tr.b.Unit.byName.timeDurationInMs,customContextRange:row.totalsRow?undefined:tr.b.math.Range.fromExplicitRange(0,maxValues.duration),ownerDocument,});},width:'<upated further down>',cmp(rowA,rowB){if(hasCpuData){return rowA.cpuDuration/rowA.numEvents-
+rowB.cpuDuration/rowB.numEvents;}
+return rowA.duration/rowA.numEvents-
+rowB.duration/rowB.numEvents;}});}
+columns.push({title:'Occurrences',value(row){return row.numEvents;},width:'<upated further down>',cmp(rowA,rowB){return rowA.numEvents-rowB.numEvents;}});let alertsColumnIndex;if(hasAlerts){columns.push({title:'Num Alerts',value(row){return row.numAlerts;},width:'<upated further down>',cmp(rowA,rowB){return rowA.numAlerts-rowB.numAlerts;}});alertsColumnIndex=columns.length-1;}
+let colWidthPercentage;if(columns.length===1){colWidthPercentage='100%';}else{colWidthPercentage=(100/(columns.length-1)).toFixed(3)+'%';}
+for(let i=1;i<columns.length;i++){columns[i].width=colWidthPercentage;}
+this.$.table.tableColumns=columns;if(hasAlerts){this.$.table.sortColumnIndex=alertsColumnIndex;this.$.table.sortDescending=true;}},configure(config){if(config.eventsByTitle===undefined){throw new Error('Required: eventsByTitle');}
+if(config.showTotals!==undefined){this.showTotals_=config.showTotals;}else{this.showTotals_=true;}
+if(config.eventsHaveDuration!==undefined){this.eventsHaveDuration_=config.eventsHaveDuration;}else{this.eventsHaveDuration_=true;}
+if(config.eventsHaveSubRows!==undefined){this.eventsHaveSubRows_=config.eventsHaveSubRows;}else{this.eventsHaveSubRows_=true;}
+this.eventsByTitle_=config.eventsByTitle;this.updateContents_();},get showTotals(){return this.showTotals_;},set showTotals(showTotals){this.showTotals_=showTotals;this.updateContents_();},get eventsHaveDuration(){return this.eventsHaveDuration_;},set eventsHaveDuration(eventsHaveDuration){this.eventsHaveDuration_=eventsHaveDuration;this.updateContents_();},get eventsHaveSubRows(){return this.eventsHaveSubRows_;},set eventsHaveSubRows(eventsHaveSubRows){this.eventsHaveSubRows_=eventsHaveSubRows;this.updateContents_();},get eventsByTitle(){return this.eventsByTitle_;},set eventsByTitle(eventsByTitle){this.eventsByTitle_=eventsByTitle;this.updateContents_();},get selectionBounds(){return this.selectionBounds_;},set selectionBounds(selectionBounds){this.selectionBounds_=selectionBounds;this.updateContents_();},updateContents_(){let eventsByTitle;if(this.eventsByTitle_!==undefined){eventsByTitle=this.eventsByTitle_;}else{eventsByTitle=[];}
+const allEvents=new tr.model.EventSet();const rows=[];for(const[title,eventsOfSingleTitle]of Object.entries(eventsByTitle)){for(const event of eventsOfSingleTitle)allEvents.push(event);const row=new tr.ui.analysis.MultiEventSummary(title,eventsOfSingleTitle);rows.push(row);}
+this.updateTableColumns_(rows);this.$.table.tableRows=rows;const maxValues={duration:undefined,selfTime:undefined,cpuSelfTime:undefined,cpuDuration:undefined};if(this.eventsHaveDuration){for(const column in maxValues){maxValues[column]=tr.b.math.Statistics.max(rows,function(event){return event[column];});}}
+const footerRows=[];if(this.showTotals_){const multiEventSummary=new tr.ui.analysis.MultiEventSummary('Totals',allEvents);footerRows.push(multiEventSummary);}
+this.updateTableColumns_(rows,maxValues);this.$.table.tableRows=rows;this.$.table.footerRows=footerRows;this.$.table.rebuild();}});'use strict';Polymer({is:'tr-ui-a-selection-summary-table',created(){this.selection_=new tr.b.math.Range();},ready(){this.$.table.showHeader=false;this.$.table.tableColumns=[{title:'Name',value(row){return row.title;},width:'350px'},{title:'Value',width:'100%',value(row){return row.value;}}];},get selection(){return this.selection_;},set selection(selection){this.selection_=selection;this.updateContents_();},updateContents_(){const selection=this.selection_;const rows=[];let hasRange;if(this.selection_&&(!selection.bounds.isEmpty)){hasRange=true;}else{hasRange=false;}
+rows.push({title:'Selection start',value:hasRange?tr.v.ui.createScalarSpan(selection.bounds.min,{unit:tr.b.Unit.byName.timeStampInMs,ownerDocument:this.ownerDocument}):'<empty>'});rows.push({title:'Selection extent',value:hasRange?tr.v.ui.createScalarSpan(selection.bounds.range,{unit:tr.b.Unit.byName.timeDurationInMs,ownerDocument:this.ownerDocument}):'<empty>'});this.$.table.tableRows=rows;this.$.table.rebuild();}});'use strict';Polymer({is:'tr-ui-b-radio-picker',created(){this.needsInit_=true;this.settingsKey_=undefined;this.isReady_=false;this.radioButtons_=undefined;this.selectedKey_=undefined;},ready(){this.isReady_=true;this.maybeInit_();this.maybeRenderRadioButtons_();},get vertical(){return this.getAttribute('vertical');},set vertical(vertical){if(vertical){this.setAttribute('vertical',true);}else{this.removeAttribute('vertical');}},get settingsKey(){return this.settingsKey_;},set settingsKey(settingsKey){if(!this.needsInit_){throw new Error('Already initialized.');}
+this.settingsKey_=settingsKey;this.maybeInit_();},maybeInit_(){if(!this.needsInit_)return;if(this.settingsKey_===undefined)return;this.needsInit_=false;this.select(tr.b.Settings.get(this.settingsKey_));},set items(items){this.radioButtons_={};items.forEach(function(e){if(e.key in this.radioButtons_){throw new Error(e.key+' already exists');}
+const radioButton=document.createElement('div');const input=document.createElement('input');const label=document.createElement('label');input.type='radio';input.id=e.label;input.addEventListener('click',function(){this.select(e.key);}.bind(this));Polymer.dom(label).innerHTML=e.label;label.htmlFor=e.label;label.style.display='inline';Polymer.dom(radioButton).appendChild(input);Polymer.dom(radioButton).appendChild(label);this.radioButtons_[e.key]=input;}.bind(this));this.maybeInit_();this.maybeRenderRadioButtons_();},maybeRenderRadioButtons_(){if(!this.isReady_)return;if(this.radioButtons_===undefined)return;for(const key in this.radioButtons_){Polymer.dom(this.$.container).appendChild(this.radioButtons_[key].parentElement);}
+if(this.selectedKey_!==undefined){this.select(this.selectedKey_);}},select(key){if(key===undefined||key===this.selectedKey_){return;}
+if(this.radioButtons_===undefined){this.selectedKey_=key;return;}
+if(!(key in this.radioButtons_)){throw new Error(key+' does not exists');}
+if(this.selectedKey_!==undefined){this.radioButtons_[this.selectedKey_].checked=false;}
+this.selectedKey_=key;tr.b.Settings.set(this.settingsKey_,this.selectedKey_);if(this.selectedKey_!==undefined){this.radioButtons_[this.selectedKey_].checked=true;}
+this.dispatchEvent(new tr.b.Event('change',false));},get selectedKey(){return this.selectedKey_;},});'use strict';tr.exportTo('tr.ui.b',function(){const ColumnChart=tr.ui.b.define('column-chart',tr.ui.b.ChartBase2DBrushX);ColumnChart.prototype={__proto__:tr.ui.b.ChartBase2DBrushX.prototype,decorate(){super.decorate();this.xCushion_=1;this.isStacked_=false;this.enableHoverBox=true;},set isStacked(stacked){this.isStacked_=true;this.updateContents_();},get isStacked(){return this.isStacked_;},get defaultGraphHeight(){return 100;},get defaultGraphWidth(){return 10*this.data_.length;},updateScales_(){if(this.data_.length===0)return;let xDifferences=0;let currentX=undefined;let previousX=undefined;this.data_.forEach(function(datum,index){previousX=currentX;currentX=this.getXForDatum_(datum,index);if(previousX!==undefined){xDifferences+=currentX-previousX;}},this);this.xScale_.range([0,this.graphWidth]);const domain=d3.extent(this.data_,this.getXForDatum_.bind(this));if(this.data_.length>1){this.xCushion_=xDifferences/(this.data_.length-1);}
+this.xScale_.domain([domain[0],domain[1]+this.xCushion_]);this.yScale_.range([this.graphHeight,0]);this.yScale_.domain(this.getYScaleDomain_(this.dataRange.min,this.dataRange.max));},updateDataRange_(){if(!this.isStacked){super.updateDataRange_();return;}
+this.autoDataRange_.reset();this.autoDataRange_.addValue(0);for(const datum of this.data_){let sum=0;for(const[key,series]of this.seriesByKey_){if(datum[key]===undefined){continue;}
+sum+=datum[key];}
+this.autoDataRange_.addValue(sum);}},getStackedRectsForDatum_(datum,index){const stacks=[];let bottom=this.yScale_.range()[0];let sum=0;for(const[key,series]of this.seriesByKey_){if(datum[key]===undefined||!this.isSeriesEnabled(key)){continue;}
+sum+=this.dataRange.clamp(datum[key]);const heightPx=bottom-this.yScale_(sum);bottom-=heightPx;stacks.push({key,value:datum[key],color:this.getDataSeries(key).color,heightPx,topPx:bottom,underflow:sum<this.dataRange.min,overflow:sum>this.dataRange.max,});}
+return stacks;},getRectsForDatum_(datum,index){if(this.isStacked){return this.getStackedRectsForDatum_(datum,index);}
+const stacks=[];for(const[key,series]of this.seriesByKey_){if(datum[key]===undefined||!this.isSeriesEnabled(key)){continue;}
+const clampedValue=this.dataRange.clamp(datum[key]);const topPx=this.yScale_(Math.max(clampedValue,this.getYScaleMin_()));stacks.push({key,value:datum[key],topPx,heightPx:this.yScale_.range()[0]-topPx,color:this.getDataSeries(key).color,underflow:datum[key]<this.dataRange.min,overflow:datum[key]>this.dataRange.max,});}
+stacks.sort(function(a,b){return b.topPx-a.topPx;});return stacks;},drawHoverValueBox_(rect){const rectHoverEvent=new tr.b.Event('rect-mouseenter');rectHoverEvent.rect=rect;this.dispatchEvent(rectHoverEvent);if(!this.enableHoverBox)return;const seriesKeys=[...this.seriesByKey_.keys()];const chartAreaSel=d3.select(this.chartAreaElement);chartAreaSel.selectAll('.hover').remove();let keyWidthPx=0;let keyHeightPx=0;if(seriesKeys.length>1){keyWidthPx=tr.ui.b.getSVGTextSize(this.chartAreaElement,rect.key).width+5;keyHeightPx=16;}
+const valueWidthPx=tr.ui.b.getSVGTextSize(this.chartAreaElement,rect.value).width+5;const valueHeightPx=16;const hoverLeftPx=rect.leftPx+(rect.widthPx/2);chartAreaSel.append('rect').attr('class','hover').attr('fill','white').attr('x',hoverLeftPx).attr('y',rect.topPx).attr('width',Math.max(keyWidthPx,valueWidthPx)).attr('height',keyHeightPx+valueHeightPx);if(seriesKeys.length>1){chartAreaSel.append('text').attr('class','hover').attr('fill',rect.color).attr('x',hoverLeftPx+2).attr('y',rect.topPx+keyHeightPx-3).text(rect.key);}
+chartAreaSel.append('text').attr('class','hover').attr('fill',rect.color).attr('x',hoverLeftPx+2).attr('y',rect.topPx+keyHeightPx+valueHeightPx-3).text(rect.value);},clearHoverValueBox_(rect){const rectHoverEvent=new tr.b.Event('rect-mouseleave');rectHoverEvent.rect=rect;this.dispatchEvent(rectHoverEvent);d3.select(this.chartAreaElement).selectAll('.hover').remove();},drawRect_(rect,sel){sel=sel.data([rect]);sel.enter().append('rect').attr('fill',rect.color).attr('x',rect.leftPx).attr('y',rect.topPx).attr('width',rect.widthPx).attr('height',rect.heightPx).on('mouseenter',this.drawHoverValueBox_.bind(this,rect)).on('mouseleave',this.clearHoverValueBox_.bind(this,rect));sel.exit().remove();},drawUnderflow_(rect,sel){sel=sel.data([rect]);sel.enter().append('text').text('*').attr('fill',rect.color).attr('x',rect.leftPx+(rect.widthPx/2)).attr('y',this.graphHeight).on('mouseenter',this.drawHoverValueBox_.bind(this,rect)).on('mouseleave',this.clearHoverValueBox_.bind(this,rect));sel.exit().remove();},drawOverflow_(rect,sel){sel=sel.data([rect]);sel.enter().append('text').text('*').attr('fill',rect.color).attr('x',rect.leftPx+(rect.widthPx/2)).attr('y',0);sel.exit().remove();},updateDataContents_(dataSel){dataSel.selectAll('*').remove();const chartAreaSel=d3.select(this.chartAreaElement);const seriesKeys=[...this.seriesByKey_.keys()];const rectsSel=dataSel.selectAll('path');this.data_.forEach(function(datum,index){const currentX=this.getXForDatum_(datum,index);let width=undefined;if(index<(this.data_.length-1)){const nextX=this.getXForDatum_(this.data_[index+1],index+1);width=nextX-currentX;}else{width=this.xCushion_;}
+for(const rect of this.getRectsForDatum_(datum,index)){rect.datum=datum;rect.index=index;rect.leftPx=this.xScale_(currentX);rect.rightPx=this.xScale_(currentX+width);rect.widthPx=rect.rightPx-rect.leftPx;this.drawRect_(rect,rectsSel);if(rect.underflow){this.drawUnderflow_(rect,rectsSel);}
+if(rect.overflow){this.drawOverflow_(rect,rectsSel);}}},this);}};return{ColumnChart,};});'use strict';tr.exportTo('tr.ui.b',function(){const MIN_GUIDELINE_HEIGHT_PX=3;const CHECKBOX_WIDTH_PX=18;const NameColumnChart=tr.ui.b.define('name-column-chart',tr.ui.b.ColumnChart);NameColumnChart.prototype={__proto__:tr.ui.b.ColumnChart.prototype,get xAxisHeight(){return 5+(this.textHeightPx_*this.data_.length);},updateMargins_(){super.updateMargins_();let xAxisTickOverhangPx=0;for(let i=0;i<this.data_.length;++i){const datum=this.data_[i];xAxisTickOverhangPx=Math.max(xAxisTickOverhangPx,this.xScale_(i)+tr.ui.b.getSVGTextSize(this,datum.x).width-
+this.graphWidth);}
+this.margin.right=Math.max(this.margin.right,xAxisTickOverhangPx);},getXForDatum_(datum,index){return index;},get xAxisTickOffset(){return 0.5;},updateXAxis_(xAxis){xAxis.selectAll('*').remove();if(this.hideXAxis)return;const nameTexts=xAxis.selectAll('text').data(this.data_);nameTexts.enter().append('text').attr('transform',(d,index)=>'translate(0, '+
+this.textHeightPx_*(this.data_.length-index)+')').attr('x',(d,index)=>this.xScale_(index)).attr('y',d=>this.graphHeight).text(d=>d.x);nameTexts.exit().remove();const guideLines=xAxis.selectAll('line.guide').data(this.data_);guideLines.enter().append('line').attr('x1',(d,index)=>this.xScale_(index+this.xAxisTickOffset)).attr('x2',(d,index)=>this.xScale_(index+this.xAxisTickOffset)).attr('y1',()=>this.graphHeight).attr('y2',(d,index)=>this.graphHeight+Math.max(MIN_GUIDELINE_HEIGHT_PX,(this.textHeightPx_*(this.data_.length-index-1))));}};return{NameColumnChart,};});'use strict';tr.exportTo('tr.ui.b',function(){const LineChart=tr.ui.b.LineChart;const NameLineChart=tr.ui.b.define('name-line-chart',LineChart);NameLineChart.prototype={__proto__:LineChart.prototype,getXForDatum_(datum,index){return index;},get xAxisHeight(){return 5+(this.textHeightPx_*this.data_.length);},get xAxisTickOffset(){return 0;},updateMargins_(){tr.ui.b.NameColumnChart.prototype.updateMargins_.call(this);},updateXAxis_(xAxis){xAxis.selectAll('*').remove();if(this.hideXAxis)return;tr.ui.b.NameColumnChart.prototype.updateXAxis_.call(this,xAxis);const baseline=xAxis.selectAll('path').data([this]);baseline.enter().append('line').attr('stroke','black').attr('x1',this.xScale_(0)).attr('x2',this.xScale_(this.data_.length-1)).attr('y1',this.graphHeight).attr('y2',this.graphHeight);baseline.exit().remove();}};return{NameLineChart,};});'use strict';tr.exportTo('tr.ui.b',function(){const BoxChart=tr.ui.b.define('box-chart',tr.ui.b.NameLineChart);BoxChart.prototype={__proto__:tr.ui.b.NameLineChart.prototype,get hideLegend(){return true;},updateDataRange_(){if(this.overrideDataRange_!==undefined){return;}
+this.autoDataRange_.reset();for(const datum of this.data_){this.autoDataRange_.addValue(datum.percentile_0);this.autoDataRange_.addValue(datum.percentile_100);}},updateScales_(){super.updateScales_();this.xScale_.domain([0,this.data_.length]);},get xAxisTickOffset(){return 0.5;},updateDataRange_(){if(this.overrideDataRange_!==undefined)return;this.autoDataRange_.reset();for(const datum of this.data_){this.autoDataRange_.addValue(datum.percentile_0);this.autoDataRange_.addValue(datum.percentile_100);}},updateXAxis_(xAxis){xAxis.selectAll('*').remove();if(this.hideXAxis)return;tr.ui.b.NameColumnChart.prototype.updateXAxis_.call(this,xAxis);const baseline=xAxis.selectAll('path').data([this]);baseline.enter().append('line').attr('stroke','black').attr('x1',this.xScale_(0)).attr('x2',this.xScale_(this.data_.length)).attr('y1',this.graphHeight).attr('y2',this.graphHeight);baseline.exit().remove();},updateDataContents_(dataSel){dataSel.selectAll('*').remove();const boxesSel=dataSel.selectAll('path');for(let index=0;index<this.data_.length;++index){const datum=this.data_[index];const color=datum.color||'black';let sel=boxesSel.data([datum]);sel.enter().append('rect').attr('fill',color).attr('x',this.xScale_(index+0.2)).attr('width',this.xScale_(index+0.8)-this.xScale_(index+0.2)).attr('y',this.yScale_(datum.percentile_75)).attr('height',this.yScale_(datum.percentile_25)-
+this.yScale_(datum.percentile_75));sel.exit().remove();sel=boxesSel.data([datum]);sel.enter().append('line').attr('stroke',color).attr('x1',this.xScale_(index)).attr('x2',this.xScale_(index+1)).attr('y1',this.yScale_(datum.percentile_50)).attr('y2',this.yScale_(datum.percentile_50));sel.exit().remove();sel=boxesSel.data([datum]);sel.enter().append('line').attr('stroke',color).attr('x1',this.xScale_(index+0.4)).attr('x2',this.xScale_(index+0.6)).attr('y1',this.yScale_(datum.percentile_0)).attr('y2',this.yScale_(datum.percentile_0));sel.exit().remove();sel=boxesSel.data([datum]);sel.enter().append('line').attr('stroke',color).attr('x1',this.xScale_(index+0.4)).attr('x2',this.xScale_(index+0.6)).attr('y1',this.yScale_(datum.percentile_100)).attr('y2',this.yScale_(datum.percentile_100));sel.exit().remove();sel=boxesSel.data([datum]);sel.enter().append('line').attr('stroke',color).attr('x1',this.xScale_(index+0.5)).attr('x2',this.xScale_(index+0.5)).attr('y1',this.yScale_(datum.percentile_100)).attr('y2',this.yScale_(datum.percentile_0));sel.exit().remove();}}};return{BoxChart,};});'use strict';tr.exportTo('tr.ui.b',function(){const BarChart=tr.ui.b.define('bar-chart',tr.ui.b.ColumnChart);BarChart.prototype={__proto__:tr.ui.b.ColumnChart.prototype,decorate(){super.decorate();this.verticalScale_=undefined;this.horizontalScale_=undefined;},updateScales_(){super.updateScales_();this.yScale_.range([this.graphWidth,0]);this.xScale_.range([0,this.graphHeight]);this.verticalScale_=this.isYLogScale_?d3.scale.log(10):d3.scale.linear();this.verticalScale_.domain(this.xScale_.domain());this.verticalScale_.range([this.graphHeight,0]);this.horizontalScale_=d3.scale.linear();this.horizontalScale_.domain(this.yScale_.domain());this.horizontalScale_.range([0,this.graphWidth]);},get defaultGraphHeight(){return Math.max(20,10*this.data_.length);},get defaultGraphWidth(){return 100;},get barHeight(){return this.graphHeight/this.data.length;},drawBrush_(brushRectsSel){brushRectsSel.attr('x',0).attr('width',this.graphWidth).attr('y',d=>this.verticalScale_(d.max)).attr('height',d=>this.verticalScale_(d.min)-this.verticalScale_(d.max));},getDataPointAtChartPoint_(chartPoint){const flippedPoint={x:this.graphHeight-chartPoint.y,y:this.graphWidth-chartPoint.x};return super.getDataPointAtChartPoint_(flippedPoint);},drawXAxis_(xAxis){xAxis.attr('transform','translate(0,'+this.graphHeight+')').call(d3.svg.axis().scale(this.horizontalScale_).orient('bottom'));},get yAxisWidth(){return this.computeScaleTickWidth_(this.verticalScale_);},drawYAxis_(yAxis){const axisModifier=d3.svg.axis().scale(this.verticalScale_).orient('left');yAxis.call(axisModifier);},drawHoverValueBox_(rect){const rectHoverEvent=new tr.b.Event('rect-mouseenter');rectHoverEvent.rect=rect;this.dispatchEvent(rectHoverEvent);if(!this.enableHoverBox)return;const seriesKeys=[...this.seriesByKey_.keys()];const chartAreaSel=d3.select(this.chartAreaElement);chartAreaSel.selectAll('.hover').remove();let keyWidthPx=0;let keyHeightPx=0;let xWidthPx=0;let xHeightPx=0;if(seriesKeys.length>1){keyWidthPx=tr.ui.b.getSVGTextSize(this.chartAreaElement,rect.key).width;keyHeightPx=this.textHeightPx_;}
+if(this.data.length>1){xWidthPx=tr.ui.b.getSVGTextSize(this.chartAreaElement,''+rect.datum.x).width;xHeightPx=this.textHeightPx_;}
+const valueWidthPx=tr.ui.b.getSVGTextSize(this.chartAreaElement,rect.value).width;const valueHeightPx=this.textHeightPx_;const hoverWidthPx=Math.min(Math.max(keyWidthPx,xWidthPx,valueWidthPx)+5,Math.max(50,rect.widthPx));const hoverTopPx=rect.topPx+(rect.heightPx/2);const hoverLeftPx=rect.leftPx+rect.widthPx-hoverWidthPx;chartAreaSel.append('rect').attr('class','hover').attr('fill','white').attr('x',hoverLeftPx).attr('y',hoverTopPx).attr('width',hoverWidthPx).attr('height',keyHeightPx+xHeightPx+valueHeightPx);if(seriesKeys.length>1){chartAreaSel.append('text').attr('class','hover').attr('fill',rect.color).attr('x',hoverLeftPx+2).attr('y',hoverTopPx+keyHeightPx-3).text(rect.key);}
+if(this.data.length>1){chartAreaSel.append('text').attr('class','hover').attr('fill',rect.color).attr('x',hoverLeftPx+2).attr('y',hoverTopPx+keyHeightPx+valueHeightPx-3).text(''+rect.datum.x);}
+chartAreaSel.append('text').attr('class','hover').attr('fill',rect.color).attr('x',hoverLeftPx+2).attr('y',hoverTopPx+xHeightPx+keyHeightPx+valueHeightPx-3).text(rect.value);},flipRect_(rect){return{datum:rect.datum,index:rect.index,key:rect.key,value:rect.value,color:rect.color,topPx:this.graphHeight-rect.leftPx-rect.widthPx,leftPx:this.graphWidth-rect.topPx-rect.heightPx,widthPx:rect.heightPx,heightPx:rect.widthPx,underflow:rect.underflow,overflow:rect.overflow,};},drawRect_(rect,sel){super.drawRect_(this.flipRect_(rect),sel);},drawUnderflow_(rect,rectsSel){let sel=rectsSel.data([rect]);sel.enter().append('text').text('*').attr('fill',rect.color).attr('x',0).attr('y',this.graphHeight-rect.leftPx+
+3+(rect.widthPx/2));sel.exit().remove();sel=rectsSel.data([rect]);sel.enter().append('rect').attr('fill','rgba(0, 0, 0, 0)').attr('x',0).attr('y',this.graphHeight-rect.leftPx-rect.widthPx).attr('width',10).attr('height',rect.widthPx).on('mouseenter',()=>this.drawHoverValueBox_(this.flipRect_(rect))).on('mouseleave',()=>this.clearHoverValueBox_(rect));sel.exit().remove();},drawOverflow_(rect,sel){sel=sel.data([rect]);sel.enter().append('text').text('*').attr('fill',rect.color).attr('x',this.graphWidth).attr('y',this.graphHeight-rect.leftPx+
+3+(rect.widthPx/2));sel.exit().remove();}};return{BarChart,};});'use strict';tr.exportTo('tr.ui.b',function(){const NameBarChart=tr.ui.b.define('name-bar-chart',tr.ui.b.BarChart);const Y_AXIS_PADDING=2;NameBarChart.prototype={__proto__:tr.ui.b.BarChart.prototype,getDataPointAtChartPoint_(chartPoint){return{x:tr.ui.b.BarChart.prototype.getDataPointAtChartPoint_.call(this,chartPoint).x,y:parseInt(Math.floor((this.graphHeight-chartPoint.y)/this.barHeight))};},getXForDatum_(datum,index){return index;},get yAxisWidth(){if(this.data.length===0)return 0;return Y_AXIS_PADDING+tr.b.math.Statistics.max(this.data_,d=>tr.ui.b.getSVGTextSize(this,d.x).width);},get defaultGraphHeight(){return(3+this.textHeightPx_)*this.data.length;},updateYAxis_(yAxis){if(tr.ui.b.getSVGTextSize(this,'test').width===0){tr.b.requestAnimationFrame(()=>this.updateYAxis_(yAxis));return;}
+yAxis.selectAll('*').remove();const nameTexts=yAxis.selectAll('text').data(this.data_);nameTexts.enter().append('text').attr('x',d=>-(tr.ui.b.getSVGTextSize(this,d.x).width+Y_AXIS_PADDING)).attr('y',(d,index)=>this.verticalScale_(index)).text(d=>d.x);nameTexts.exit().remove();let previousTop=undefined;for(const text of nameTexts[0]){const bbox=text.getBBox();if((previousTop===undefined)||(previousTop>(bbox.y+bbox.height))){previousTop=bbox.y;}else{text.style.opacity=0;}}}};return{NameBarChart,};});'use strict';const DEFAULT_COLOR_SCHEME=new tr.b.SinebowColorGenerator();class BreakdownTableSummaryRow{constructor(displayElement,histogramNames){this.displayElement_=displayElement;this.histogramNames_=histogramNames;this.keySpan_=undefined;}
+get numberValue(){return undefined;}
+get keySpan(){if(this.keySpan_===undefined){if(this.histogramNames_.length){this.keySpan_=document.createElement('tr-ui-a-analysis-link');this.keySpan_.setSelectionAndContent(this.histogramNames_,'Select All');}else{this.keySpan_='Sum';}}
+return this.keySpan_;}
+get displayElement(){return this.displayElement_;}
+get stringPercent(){return'100%';}}
+class BreakdownTableRow{constructor(name,value,color){this.name_=name;this.value=value;if(!this.isHistogram&&typeof value!=='number'){throw new Error('unsupported value '+value);}
+this.tableSum_=undefined;this.keySpan_=undefined;this.color_=color;const hsl=this.color.toHSL();hsl.l*=0.85;this.highlightedColor_=tr.b.Color.fromHSL(hsl);}
+get isHistogram(){return this.value instanceof tr.v.Histogram;}
+get name(){return this.name_;}
+get color(){return this.color_;}
+get highlightedColor(){return this.highlightedColor_;}
+get keySpan(){if(this.keySpan_===undefined){if(this.isHistogram){this.keySpan_=document.createElement('tr-ui-a-analysis-link');this.keySpan_.setSelectionAndContent([this.value.name],this.name);this.keySpan_.color=this.color;this.keySpan_.title=this.value.name;}else{this.keySpan_=document.createElement('span');this.keySpan_.innerText=this.name;this.keySpan_.style.color=this.color;}}
+return this.keySpan_;}
+get numberValue(){if(this.isHistogram)return this.value.sum;if(!isNaN(this.value)&&(this.value!==Infinity)&&(this.value!==-Infinity)&&(this.value>0))return this.value;return undefined;}
+get stringValue(){if(this.numberValue===undefined)return this.value.toString();return this.numberValue.toString();}
+set tableSum(s){this.tableSum_=s;}
+get stringPercent(){if(this.tableSum_===undefined)return'';const num=this.numberValue;if(num===undefined)return'';return Math.floor(num*100.0/this.tableSum_)+'%';}
+get displayElement(){if(this.numberValue===undefined)return this.value.toString();if(this.isHistogram){return tr.v.ui.createScalarSpan(this.numberValue,{unit:this.value.unit,});}
+return this.numberValue;}
+compare(other){if(this.numberValue===undefined){if(other.numberValue===undefined){return this.name.localeCompare(other.name);}
+return 1;}
+if(other.numberValue===undefined){return-1;}
+if(this.numberValue===other.numberValue){return this.name.localeCompare(other.name);}
+return other.numberValue-this.numberValue;}}
+Polymer({is:'tr-v-ui-breakdown-span',created(){this.diagnostic_=undefined;this.chart_=new tr.ui.b.ColumnChart();this.chart_.graphHeight=130;this.chart_.isStacked=true;this.chart_.hideXAxis=true;this.chart_.hideLegend=true;this.chart_.enableHoverBox=false;this.chart_.addEventListener('rect-mouseenter',event=>this.onRectMouseEnter_(event));this.chart_.addEventListener('rect-mouseleave',event=>this.onRectMouseLeave_(event));},onRectMouseEnter_(event){for(const row of this.$.table.tableRows){if(row.name===event.rect.key){row.keySpan.parentNode.nextSibling.style.background=event.rect.color;row.keySpan.scrollIntoViewIfNeeded();}else{row.keySpan.parentNode.nextSibling.style.background='';}}},onRectMouseLeave_(event){for(const row of this.$.table.tableRows){row.keySpan.parentNode.nextSibling.style.background='';}},ready(){Polymer.dom(this.$.container).appendChild(this.chart_);this.$.table.zebra=true;this.$.table.showHeader=false;this.$.table.tableColumns=[{value:row=>row.keySpan,},{value:row=>row.displayElement,align:tr.ui.b.TableFormat.ColumnAlignment.RIGHT,},{value:row=>row.stringPercent,align:tr.ui.b.TableFormat.ColumnAlignment.RIGHT,},];},attached(){if(this.diagnostic_)this.updateContents_();},get diagnostic(){return this.diagnostic_;},set diagnostic(d){this.diagnostic_=d;if(this.isAttached)this.updateContents_();},updateContents_(){this.$.container.style.display='none';this.$.table.style.display='none';this.$.empty.style.display='block';if(!this.diagnostic_){this.chart_.data=[];return;}
+let colorScheme=undefined;if(this.diagnostic.colorScheme===tr.v.d.COLOR_SCHEME_CHROME_USER_FRIENDLY_CATEGORY_DRIVER){colorScheme=(name)=>{let cat=name.split(' ');cat=cat[cat.length-1];return tr.e.chrome.ChromeUserFriendlyCategoryDriver.getColor(cat);};}else if(this.diagnostic.colorScheme!==undefined){colorScheme=(name)=>tr.b.FixedColorSchemeRegistry.lookUp(this.diagnostic.colorScheme).getColor(name);}else{colorScheme=(name)=>DEFAULT_COLOR_SCHEME.colorForKey(name);}
+const tableRows=[];let tableSum=0;const histogramNames=[];let unit=undefined;for(const[name,value]of this.diagnostic){const row=new BreakdownTableRow(name,value,colorScheme(name));tableRows.push(row);if(row.numberValue!==undefined)tableSum+=row.numberValue;if(row.isHistogram){histogramNames.push(value.name);if(unit===undefined)unit=value.unit;}}
+tableRows.sort((x,y)=>x.compare(y));if(tableSum>0){let summaryDisplayElement=tableSum;if(unit!==undefined){summaryDisplayElement=unit.format(tableSum);}
+tableRows.unshift(new BreakdownTableSummaryRow(summaryDisplayElement,histogramNames));}
+const chartData={x:0};for(const row of tableRows){if(row.numberValue===undefined)continue;row.tableSum=tableSum;chartData[row.name]=row.numberValue;const dataSeries=this.chart_.getDataSeries(row.name);dataSeries.color=row.color;dataSeries.highlightedColor=row.highlightedColor;}
+if(tableRows.length>0){this.$.table.style.display='block';this.$.empty.style.display='none';this.$.table.tableRows=tableRows;this.$.table.rebuild();}
+if(Object.keys(chartData).length>1){this.$.container.style.display='block';this.$.empty.style.display='none';this.chart_.data=[chartData];}}});'use strict';Polymer({is:'tr-v-ui-buildbot-info-span',ready(){this.diagnostic_=undefined;this.$.table.showHeader=false;this.$.table.tableColumns=[{value:row=>row[0]},{value:row=>row[1]}];},get diagnostic(){return this.diagnostic_;},set diagnostic(d){this.diagnostic_=d;this.updateContents_();},updateContents_(){if(this.diagnostic===undefined){this.$.table.tableRows=[];return;}
+const rows=[];if(this.diagnostic.displayMasterName){rows.push(['master',this.diagnostic.displayMasterName]);}
+if(this.diagnostic.buildbotMasterName){rows.push(['master',this.diagnostic.buildbotMasterName]);}
+if(this.diagnostic.displayBotName){rows.push(['bot',this.diagnostic.displayBotName]);}
+if(this.diagnostic.buildbotName){rows.push(['bot',this.diagnostic.buildbotName]);}
+if(this.diagnostic.buildNumber){rows.push(['build number',this.diagnostic.buildNumber]);}
+if(this.diagnostic.logUri){const anchor=document.createElement('a');anchor.href=this.diagnostic.logUri;anchor.innerText=this.diagnostic.logUri;rows.push(['log',anchor]);}
+this.$.table.tableRows=rows;}});'use strict';Polymer({is:'tr-v-ui-collected-related-event-set-span',ready(){this.diagnostic_=undefined;},get diagnostic(){return this.diagnostic_;},set diagnostic(d){this.diagnostic_=d;this.updateContents_();},updateContents_(){Polymer.dom(this).textContent='';for(const[canonicalUrl,events]of this.diagnostic){const link=document.createElement('a');if(events.length===1){const event=tr.b.getOnlyElement(events);link.textContent=event.title+' '+
+tr.b.Unit.byName.timeDurationInMs.format(event.duration);}else{link.textContent=events.length+' events';}
+link.href=canonicalUrl;Polymer.dom(this).appendChild(link);Polymer.dom(this).appendChild(document.createElement('br'));}}});'use strict';Polymer({is:'tr-v-ui-device-info-span',ready(){this.diagnostic_=undefined;this.$.table.showHeader=false;this.$.table.tableColumns=[{value(row){return row[0];},},{value(row){return row[1];}}];},get diagnostic(){return this.diagnostic_;},set diagnostic(d){this.diagnostic_=d;this.updateContents_();},updateContents_(){if(this.diagnostic===undefined){this.$.table.tableRows=[];return;}
+const rows=[];if(this.diagnostic.chromeVersion){rows.push(['chrome version',this.diagnostic.chromeVersion]);}
+if(this.diagnostic.osName){rows.push(['OS name',this.diagnostic.osName]);}
+if(this.diagnostic.osVersion){rows.push(['OS version',this.diagnostic.osVersion]);}
+if(this.diagnostic.gpuInfo){rows.push(['GPU',JSON.stringify(this.diagnostic.gpuInfo)]);}
+if(this.diagnostic.arch){rows.push(['arch',this.diagnostic.arch]);}
+if(this.diagnostic.ram){rows.push(['ram',tr.b.Unit.byName.sizeInBytes.format(this.diagnostic.ram)]);}
+this.$.table.tableRows=rows;}});'use strict';Polymer({is:'tr-v-ui-generic-diagnostic-span',ready(){this.diagnostic_=undefined;},get diagnostic(){return this.diagnostic_;},set diagnostic(d){this.diagnostic_=d;this.updateContents_();},updateContents_(){if(this.diagnostic===undefined){this.$.generic.object=undefined;return;}
+this.$.generic.object=this.diagnostic.value;}});'use strict';Polymer({is:'tr-v-ui-merged-buildbot-info-span',ready(){this.diagnostic_=undefined;this.$.table.showHeader=false;this.$.table.tableColumns=[{value:row=>row[0]},{value:row=>row[1]},];},get diagnostic(){return this.diagnostic_;},set diagnostic(d){this.diagnostic_=d;this.updateContents_();},updateContents_(){if(this.diagnostic===undefined){this.$.table.tableRows=[];return;}
+const rows=[];if(this.diagnostic.displayMasterNames.size){rows.push(['masters',Array.from(this.diagnostic.displayMasterNames).join(', ')]);}
+if(this.diagnostic.displayBotNames.size){rows.push(['bots',Array.from(this.diagnostic.displayBotNames).join(', ')]);}
+if(this.diagnostic.buildNumbers.size){rows.push(['builds',Array.from(this.diagnostic.buildNumbers).join(', ')]);}
+for(const logUri of this.diagnostic.logUris){const anchor=document.createElement('a');anchor.href=logUri;anchor.innerText=logUri;rows.push(['log',anchor]);}
+this.$.table.tableRows=rows;}});'use strict';Polymer({is:'tr-v-ui-merged-device-info-span',ready(){this.diagnostic_=undefined;this.$.table.showHeader=false;this.$.table.tableColumns=[{value:row=>row[0]},{value:row=>row[1]},];},get diagnostic(){return this.diagnostic_;},set diagnostic(d){this.diagnostic_=d;this.updateContents_();},updateContents_(){if(this.diagnostic===undefined){this.$.table.tableRows=[];return;}
+const rows=[];if(this.diagnostic.chromeVersions.size){rows.push(['chrome versions',Array.from(this.diagnostic.chromeVersions).join(', ')]);}
+if(this.diagnostic.osNames.size){rows.push(['os names',Array.from(this.diagnostic.osNames).join(', ')]);}
+if(this.diagnostic.osVersions.size){rows.push(['os versions',Array.from(this.diagnostic.osVersions).join(', ')]);}
+this.$.table.tableRows=rows;}});'use strict';Polymer({is:'tr-v-ui-merged-revision-info-span',ready(){this.diagnostic_=undefined;this.$.table.showHeader=false;this.$.table.tableColumns=[{value:row=>row[0]},{value:row=>row[1]},];},get diagnostic(){return this.diagnostic_;},set diagnostic(d){this.diagnostic_=d;this.updateContents_();},buildRow_(rows,label,revisions,host){if(revisions.length===0)return;const valueSpan=document.createElement('span');for(const revs of revisions){const anchor=document.createElement('a');anchor.innerText=revs[0];if(revs.length===1){anchor.href=host+'+/'+revs[0];}else{anchor.innerText+='..'+revs[1];anchor.href=host+'+log/'+revs[0]+'..'+revs[1];}
+anchor.addEventListener('click',event=>{event.stopPropagation();});valueSpan.appendChild(anchor);valueSpan.appendChild(document.createTextNode(' '));}
+rows.push([label,valueSpan]);},updateContents_(){if(this.diagnostic===undefined){this.$.table.tableRows=[];return;}
+const rows=[];if(this.diagnostic.chromiumCommitPosition){const positions=Array.from(this.diagnostic.chromiumCommitPositions);positions.sort((x,y)=>x-y);rows.push(['chromiumCommitPositions',positions.join(', ')]);}
+if(this.diagnostic.v8CommitPosition){const positions=Array.from(this.diagnostic.v8CommitPositions);rows.push(['v8CommitPositions',positions.join(', ')]);}
+this.buildRow_(rows,'chromium',this.diagnostic.chromium,tr.v.ui.CHROMIUM_REVISION_HOST);this.buildRow_(rows,'v8',this.diagnostic.v8,tr.v.ui.V8_REVISION_HOST);this.buildRow_(rows,'catapult',this.diagnostic.catapult,tr.v.ui.CATAPULT_REVISION_HOST);this.buildRow_(rows,'angle',this.diagnostic.angle,tr.v.ui.ANGLE_REVISION_HOST);this.buildRow_(rows,'skia',this.diagnostic.skia,tr.v.ui.SKIA_REVISION_HOST);this.buildRow_(rows,'webrtc',this.diagnostic.webrtc,tr.v.ui.WEBRTC_REVISION_HOST);this.$.table.tableRows=rows;}});'use strict';Polymer({is:'tr-v-ui-merged-telemetry-info-span',ready(){this.diagnostic_=undefined;this.$.table.showHeader=false;this.$.table.tableColumns=[{value:row=>row[0]},{value:row=>row[1]},];},onShow_(){this.$.show.style.display='none';this.$.hide.style.display='block';this.$.table.style.display='table';},onHide_(){this.$.show.style.display='block';this.$.hide.style.display='none';this.$.table.style.display='none';},get diagnostic(){return this.diagnostic_;},set diagnostic(d){this.diagnostic_=d;this.updateContents_();},updateContents_(){if(this.diagnostic===undefined){this.$.table.tableRows=[];return;}
+const rows=[];if(this.diagnostic.benchmarkNames.size){rows.push(['benchmark names',Array.from(this.diagnostic.benchmarkNames).join(', ')]);}
+if(this.diagnostic.benchmarkStarts.length){rows.push(['benchmark starts',this.diagnostic.benchmarkStartStrings.join(', ')]);}
+if(this.diagnostic.storyDisplayNames.size){rows.push(['stories',Array.from(this.diagnostic.storyDisplayNames).join(', ')]);}
+if(this.diagnostic.storysetRepeatCounters.size){rows.push(['storyset repeats',Array.from(this.diagnostic.storysetRepeatCounters).join(', ')]);}
+if(this.diagnostic.labels.size){rows.push(['label',Array.from(this.diagnostic.labels).join(', ')]);}
+if(this.diagnostic.storyGroupingKeys.size){const gov=document.createElement('tr-ui-a-generic-object-view');const obj={};for(const[key,value]of this.diagnostic.storyGroupingKeys){obj[key]=Array.from(value);}
+gov.object=obj;rows.push(['grouping keys',gov]);}
+this.$.table.tableRows=rows;}});'use strict';Polymer({is:'tr-v-ui-related-event-set-span',ready(){this.diagnostic_=undefined;},get diagnostic(){return this.diagnostic_;},set diagnostic(d){this.diagnostic_=d;this.updateContents_();},updateContents_(){Polymer.dom(this).textContent='';const events=new tr.model.EventSet([...this.diagnostic]);const link=document.createElement('tr-ui-a-analysis-link');let label=events.length+' events';if(events.length===1){const event=tr.b.getOnlyElement(events);label=event.title+' ';label+=tr.b.Unit.byName.timeDurationInMs.format(event.duration);}
+link.setSelectionAndContent(events,label);Polymer.dom(this).appendChild(link);}});'use strict';Polymer({is:'tr-v-ui-related-histogram-map-span',ready(){this.diagnostic_=undefined;this.$.table.showHeader=false;this.$.table.tableColumns=[{value:row=>row[0]},{value:row=>row[1]},];},get diagnostic(){return this.diagnostic_;},set diagnostic(d){this.diagnostic_=d;this.updateContents_();},updateContents_(){Polymer.dom(this).textContent='';const rows=[];const histogramNames=new Set();for(const[name,hist]of this.diagnostic){histogramNames.add(hist.name);}
+if(histogramNames.size>1){const link=document.createElement('tr-ui-a-analysis-link');link.setSelectionAndContent(Array.from(histogramNames),'Select All');rows.push([link,'']);}
+for(const[name,hist]of this.diagnostic){const link=document.createElement('tr-ui-a-analysis-link');link.setSelectionAndContent([hist.name],name);const scalarSpan=tr.v.ui.createScalarSpan(hist);rows.push([link,scalarSpan]);}
+this.$.table.tableRows=rows;this.$.table.rebuild();}});'use strict';Polymer({is:'tr-v-ui-related-histogram-set-span',ready(){this.diagnostic_=undefined;},get diagnostic(){return this.diagnostic_;},set diagnostic(d){this.diagnostic_=d;this.updateContents_();},addLink_(selection,content){const link=document.createElement('tr-ui-a-analysis-link');link.setSelectionAndContent(selection,content);Polymer.dom(this).appendChild(link);Polymer.dom(this).appendChild(document.createElement('br'));},updateContents_(){Polymer.dom(this).textContent='';const histogramNames=new Set();for(const hist of this.diagnostic){histogramNames.add(hist.name);}
+if(histogramNames.size>1){this.addLink_(Array.from(histogramNames),'Select All');}
+for(const hist of this.diagnostic){this.addLink_([hist.name],hist.name);}}});'use strict';tr.exportTo('tr.v.ui',function(){const CHROMIUM_REVISION_HOST='https://chromium.googlesource.com/chromium/src/';const V8_REVISION_HOST='https://chromium.googlesource.com/v8/v8.git/';const CATAPULT_REVISION_HOST='https://chromium.googlesource.com/external/github.com/catapult-project/catapult.git/';const ANGLE_REVISION_HOST='https://chromium.googlesource.com/angle/angle/';const SKIA_REVISION_HOST='https://chromium.googlesource.com/skia/';const WEBRTC_REVISION_HOST='https://chromium.googlesource.com/external/webrtc/';Polymer({is:'tr-v-ui-revision-info-span',ready(){this.diagnostic_=undefined;this.$.table.showHeader=false;this.$.table.tableColumns=[{value:row=>row[0]},{value:row=>row[1]},];},get diagnostic(){return this.diagnostic_;},set diagnostic(d){this.diagnostic_=d;this.updateContents_();},buildRow_(rows,label,revisions,host){if(revisions.length===0)return;const anchor=document.createElement('a');anchor.innerText=revisions[0];if(revisions.length===1){anchor.href=host+'+/'+revisions[0];}else{anchor.innerText+='..'+revisions[1];anchor.href=host+'+log/'+revisions[0]+'..'+revisions[1];}
+anchor.addEventListener('click',event=>{event.stopPropagation();});rows.push([label,anchor]);},updateContents_(){if(this.diagnostic===undefined){this.$.table.tableRows=[];return;}
+const rows=[];if(this.diagnostic.chromiumCommitPosition){rows.push(['chromiumCommitPosition',this.diagnostic.chromiumCommitPosition]);}
+if(this.diagnostic.v8CommitPosition){rows.push(['v8CommitPosition',this.diagnostic.v8CommitPosition]);}
+this.buildRow_(rows,'chromium',this.diagnostic.chromium,CHROMIUM_REVISION_HOST);this.buildRow_(rows,'v8',this.diagnostic.v8,V8_REVISION_HOST);this.buildRow_(rows,'catapult',this.diagnostic.catapult,CATAPULT_REVISION_HOST);this.buildRow_(rows,'angle',this.diagnostic.angle,ANGLE_REVISION_HOST);this.buildRow_(rows,'skia',this.diagnostic.skia,SKIA_REVISION_HOST);this.buildRow_(rows,'webrtc',this.diagnostic.webrtc,WEBRTC_REVISION_HOST);this.$.table.tableRows=rows;}});return{CHROMIUM_REVISION_HOST,V8_REVISION_HOST,CATAPULT_REVISION_HOST,ANGLE_REVISION_HOST,SKIA_REVISION_HOST,WEBRTC_REVISION_HOST,};});'use strict';Polymer({is:'tr-v-ui-scalar-diagnostic-span',ready(){this.diagnostic_=undefined;},get diagnostic(){return this.diagnostic_;},set diagnostic(d){this.diagnostic_=d;this.updateContents_();},updateContents_(){this.$.scalar.setValueAndUnit(this.diagnostic.value.value,this.diagnostic.value.unit);}});'use strict';Polymer({is:'tr-v-ui-telemetry-info-span',ready(){this.diagnostic_=undefined;this.$.table.showHeader=false;this.$.table.tableColumns=[{value:row=>row[0]},{value:row=>row[1]},];},get diagnostic(){return this.diagnostic_;},set diagnostic(d){this.diagnostic_=d;this.updateContents_();},updateContents_(){if(this.diagnostic===undefined){this.$.table.tableRows=[];return;}
+const rows=[];if(this.diagnostic.benchmarkName){rows.push(['benchmark name',this.diagnostic.benchmarkName]);}
+if(this.diagnostic.benchmarkStart){rows.push(['benchmark start',this.diagnostic.benchmarkStartString]);}
+if(this.diagnostic.storyDisplayName){rows.push(['story',this.diagnostic.storyDisplayName]);}
+if(this.diagnostic.storysetRepeatCounter!==undefined){rows.push(['storyset repeat',this.diagnostic.storysetRepeatCounter]);}
+if(this.diagnostic.label){rows.push(['label',this.diagnostic.label]);}
+if(this.diagnostic.storyGroupingKeys.size){const gov=document.createElement('tr-ui-a-generic-object-view');const obj={};for(const[key,value]of this.diagnostic.storyGroupingKeys){obj[key]=value;}
+gov.object=obj;rows.push(['grouping keys',gov]);}
+this.$.table.tableRows=rows;}});'use strict';Polymer({is:'tr-v-ui-unmergeable-diagnostic-set-span',ready(){this.diagnostic_=undefined;},get diagnostic(){return this.diagnostic_;},set diagnostic(d){this.diagnostic_=d;this.updateContents_();},updateContents_(){Polymer.dom(this).textContent='';for(const diagnostic of this.diagnostic){Polymer.dom(this).appendChild(tr.v.ui.createDiagnosticSpan(diagnostic));Polymer.dom(this).appendChild(document.createElement('br'));}}});'use strict';tr.exportTo('tr.v.ui',function(){function findElementNameForDiagnostic(diagnostic){let typeInfo=undefined;let curProto=diagnostic.constructor.prototype;while(curProto){typeInfo=tr.v.d.Diagnostic.findTypeInfo(curProto.constructor);if(typeInfo&&typeInfo.metadata.elementName)break;typeInfo=undefined;curProto=curProto.__proto__;}
+if(typeInfo===undefined){throw new Error(diagnostic.constructor.name+' or a base class must have a registered elementName');}
+const tagName=typeInfo.metadata.elementName;if(tr.ui.b.isUnknownElementName(tagName)){throw new Error('Element not registered: '+tagName);}
+return tagName;}
+function createDiagnosticSpan(diagnostic){const tagName=findElementNameForDiagnostic(diagnostic);const span=document.createElement(tagName);span.diagnostic=diagnostic;return span;}
+return{createDiagnosticSpan,};});'use strict';Polymer({is:'tr-v-ui-diagnostic-map-table',created(){this.diagnosticMaps_=undefined;},set diagnosticMaps(maps){this.diagnosticMaps_=maps;this.updateContents_();},updateContents_(){if(this.diagnosticMaps_===undefined||this.diagnosticMaps_.length===0){this.$.table.tableRows=[];this.$.table.tableColumns=[];return;}
+const columnTitles=new Set();for(const map of this.diagnosticMaps_){for(const[name,diagnostic]of map){if(diagnostic instanceof tr.v.d.UnmergeableDiagnosticSet)continue;if(diagnostic instanceof tr.v.d.CollectedRelatedEventSet)continue;if(diagnostic instanceof tr.v.d.GroupingPath)continue;columnTitles.add(name);}}
+const columns=[];function makeColumn(title){return{title,value(map){const diagnostic=map.get(title);if(!diagnostic)return'';return tr.v.ui.createDiagnosticSpan(diagnostic);}};}
+for(const title of columnTitles){columns.push(makeColumn(title));}
+this.$.table.tableColumns=columns;this.$.table.tableRows=this.diagnosticMaps_;this.$.table.rebuild();}});'use strict';tr.exportTo('tr.b',function(){class Serializable{constructor(){Object.defineProperty(this,'properties_',{configurable:false,enumerable:false,value:new Map(),});}
+define(name,initialValue){if(this[name]!==undefined){throw new Error(`"${name}" is already defined.`);}
+if(name[name.length-1]==='_'){throw new Error(`"${name}" cannot end with an underscore.`);}
+this.properties_.set(name,initialValue);Object.defineProperty(this,name,{configurable:false,enumerable:true,get:()=>this.properties_.get(name),set:value=>this.setProperty_(name,value),});}
+setProperty_(name,value){this.properties_.set(name,value);}
+clone(){return Serializable.fromDict(this.asDict());}
+asDict(){function visit(obj){if(obj instanceof Serializable)return obj.asDict();if(obj instanceof Set)return Array.from(obj);if(obj instanceof Array)return obj.map(visit);if(!(obj instanceof Map))return obj;const result={};for(const[name,value]of obj){result[name]=visit(value);}
+return result;}
+const dict={type:this.constructor.name};for(const[name,value]of this.properties_){dict[name.replace(/_$/,'')]=visit(value);}
+return dict;}
+static fromDict(dict){function visit(d){if(d instanceof Array)return d.map(visit);if(!(d instanceof Object))return d;if(typeof d.type==='string')return Serializable.fromDict(d);const result=new Map();for(const[name,value]of Object.entries(d)){result.set(name,visit(value));}
+return result;}
+const typeInfo=Serializable.findTypeInfoWithName(dict.type);const result=new typeInfo.constructor();for(const[name,value]of Object.entries(dict)){result[name]=visit(value);}
+return result;}}
+const options=new tr.b.ExtensionRegistryOptions(tr.b.BASIC_REGISTRY_MODE);options.defaultMetadata={};options.mandatoryBaseClass=Serializable;tr.b.decorateExtensionRegistry(Serializable,options);return{Serializable,};});'use strict';tr.exportTo('tr.b',function(){class ViewState extends tr.b.Serializable{constructor(){super();tr.b.EventTarget.decorate(this);}
+setProperty_(name,value){this.update(new Map([[name,value]]));}
+async updateFromViewState(other){await this.update(other.properties_);}
+async update(delta){if(!(delta instanceof Map))delta=new Map(Object.entries(delta));const actualDelta={};for(const[name,current]of delta){const previous=this[name];if(previous===current)continue;actualDelta[name]={previous,current};tr.b.Serializable.prototype.setProperty_.call(this,name,current);}
+if(Object.keys(actualDelta).length===0)return;await tr.b.dispatchSimpleEventAsync(this,this.updateEventName_,{delta:actualDelta});}
+get updateEventName_(){return this.constructor.name+'.update';}
+addUpdateListener(listener){this.addEventListener(this.updateEventName_,listener);}
+removeUpdateListener(listener){this.removeEventListener(this.updateEventName_,listener);}}
+return{ViewState,};});'use strict';tr.exportTo('tr.v.ui',function(){class HistogramSetViewState extends tr.b.ViewState{constructor(){super();this.define('searchQuery','');this.define('referenceDisplayLabel','');this.define('displayStatisticName','');this.define('showAll',false);this.define('groupings',[]);this.define('sortColumnIndex',0);this.define('sortDescending',false);this.define('constrainNameColumn',true);this.define('tableRowStates',new Map());}}
+tr.b.ViewState.register(HistogramSetViewState);class HistogramSetTableRowState extends tr.b.ViewState{constructor(){super();this.define('isExpanded',false);this.define('isOverviewed',false);this.define('cells',new Map());this.define('subRows',new Map());}
+asCompactDict(){const result={};if(this.isExpanded)result.e='1';if(this.isOverviewed)result.o='1';const cells={};for(const[name,cell]of this.cells){const cellDict=cell.asCompactDict();if(cellDict===undefined)continue;cells[name]=cellDict;}
+if(Object.keys(cells).length>0)result.c=cells;const subRows={};for(const[name,row]of this.subRows){const rowDict=row.asCompactDict();if(rowDict===undefined)continue;subRows[name]=rowDict;}
+if(Object.keys(subRows).length>0)result.r=subRows;if(Object.keys(result).length===0)return undefined;return result;}
+async updateFromCompactDict(dict){await this.update({isExpanded:dict.e==='1',isOverviewed:dict.o==='1',});for(const[name,cellDict]of Object.entries(dict.c||{})){const cell=this.cells.get(name);if(cell===undefined)continue;await cell.updateFromCompactDict(cellDict);}
+for(const[name,subRowDict]of Object.entries(dict.r||{})){const subRow=this.subRows.get(name);if(subRow===undefined)continue;await subRow.updateFromCompactDict(subRowDict);}}*walk(){yield this;for(const row of this.subRows.values())yield*row.walk();}
+static*walkAll(rootRows){for(const rootRow of rootRows)yield*rootRow.walk();}}
+tr.b.ViewState.register(HistogramSetTableRowState);class HistogramSetTableCellState extends tr.b.ViewState{constructor(){super();this.define('isOpen',false);this.define('brushedBinRange',new tr.b.math.Range());this.define('mergeSampleDiagnostics',true);}
+asCompactDict(){const result={};if(this.isOpen)result.o='1';if(!this.mergeSampleDiagnostics)result.m='0';if(!this.brushedBinRange.isEmpty){result.b=this.brushedBinRange.min+'_'+this.brushedBinRange.max;}
+if(Object.keys(result).length===0)return undefined;return result;}
+async updateFromCompactDict(dict){let binRange=this.brushedBinRange;if(dict.b){let[bMin,bMax]=dict.b.split('_');bMin=parseInt(bMin);bMax=parseInt(bMax);if(bMin!==binRange.min||bMax!==binRange.max){binRange=tr.b.math.Range.fromExplicitRange(bMin,bMax);}}
+await this.update({isOpen:dict.o==='1',brushedBinRange:binRange,mergeSampleDiagnostics:dict.m!=='0',});}}
+tr.b.ViewState.register(HistogramSetTableCellState);return{HistogramSetTableCellState,HistogramSetTableRowState,HistogramSetViewState,};});'use strict';Polymer({is:'tr-v-ui-scalar-map-table',created(){this.scalarMap_=new Map();this.significance_=new Map();},ready(){this.$.table.showHeader=false;this.$.table.tableColumns=[{value(row){return row.name;}},{value(row){const span=tr.v.ui.createScalarSpan(row.value);if(row.significance!==undefined){span.significance=row.significance;}else if(row.anyRowsHaveSignificance){span.style.marginRight='18px';}
+span.style.whiteSpace='nowrap';return span;}}];},get scalarMap(){return this.scalarMap_;},set scalarMap(map){this.scalarMap_=map;this.updateContents_();},setSignificanceForKey(key,significance){this.significance_.set(key,significance);this.updateContents_();},updateContents_(){const rows=[];for(const[key,scalar]of this.scalarMap){rows.push({name:key,value:scalar,significance:this.significance_.get(key),anyRowsHaveSignificance:(this.significance_.size>0)});}
+this.$.table.tableRows=rows;this.$.table.rebuild();}});'use strict';tr.exportTo('tr.v.ui',function(){const DEFAULT_BAR_HEIGHT_PX=5;const TRUNCATE_BIN_MARGIN=0.15;const IGNORE_DELTA_STATISTICS_NAMES=[`${tr.v.DELTA}min`,`%${tr.v.DELTA}min`,`${tr.v.DELTA}max`,`%${tr.v.DELTA}max`,`${tr.v.DELTA}sum`,`%${tr.v.DELTA}sum`,`${tr.v.DELTA}count`,`%${tr.v.DELTA}count`,];Polymer({is:'tr-v-ui-histogram-span',created(){this.viewStateListener_=this.onViewStateUpdate_.bind(this);this.viewState=new tr.v.ui.HistogramSetTableCellState();this.histogram_=undefined;this.referenceHistogram_=undefined;this.graphWidth_=undefined;this.graphHeight_=undefined;this.mouseDownBin_=undefined;this.prevBrushedBinRange_=new tr.b.math.Range();this.canMergeSampleDiagnostics_=true;},get viewState(){return this.viewState_;},set viewState(vs){if(this.viewState){this.viewState.removeUpdateListener(this.viewStateListener_);}
+this.viewState_=vs;this.viewState.addUpdateListener(this.viewStateListener_);if(this.isAttached)this.updateContents_();},onViewStateUpdate_(event){if(event.delta.brushedBinRange){this.brushedBinRange=this.viewState.brushedBinRange;}
+if(event.delta.mergeSampleDiagnostics){this.mergeSampleDiagnostics=this.canMergeSampleDiagnostics&&this.viewState.mergeSampleDiagnostics;}},ready(){this.$.drag_handle.target=this.$.container;this.$.drag_handle.addEventListener('drag-handle-resize',this.onResize_.bind(this));},attached(){if(this.histogram_!==undefined)this.updateContents_();},get canMergeSampleDiagnostics(){return this.canMergeSampleDiagnostics_;},set canMergeSampleDiagnostics(merge){this.canMergeSampleDiagnostics_=merge;this.$.merge_sample_diagnostics_container.style.display=(merge?'':'none');},onResize_(event){event.stopPropagation();let heightPx=parseInt(this.$.container.style.height);if(heightPx<this.defaultGraphHeight){heightPx=this.defaultGraphHeight;this.$.container.style.height=this.defaultGraphHeight+'px';}
+this.chart_.graphHeight=heightPx-(this.chart_.margin.top+
+this.chart_.margin.bottom);},get graphWidth(){return this.graphWidth_||this.defaultGraphWidth;},set graphWidth(width){this.graphWidth_=width;},get graphHeight(){return this.graphHeight_||this.defaultGraphHeight;},set graphHeight(height){this.graphHeight_=height;},get barHeight(){return this.chart_.barHeight;},set barHeight(px){this.graphHeight=this.computeChartHeight_(px);},computeChartHeight_(barHeightPx){return(this.chart_.margin.top+
+this.chart_.margin.bottom+
+(barHeightPx*this.histogram.allBins.length));},get defaultGraphHeight(){if(this.histogram&&this.histogram.allBins.length===1){return 150;}
+return this.computeChartHeight_(DEFAULT_BAR_HEIGHT_PX);},get defaultGraphWidth(){if(this.histogram.allBins.length===1){return 100;}
+return 300;},get brushedBins(){const bins=[];if(this.histogram&&!this.brushedBinRange.isEmpty){for(let i=this.brushedBinRange.min;i<this.brushedBinRange.max;++i){bins.push(this.histogram.allBins[i]);}}
+return bins;},get brushedBinRange(){return this.viewState.brushedBinRange;},set brushedBinRange(r){if(this.chart_===undefined)return;const current=this.brushedBinRange;if(r.min===current.min&&r.max===current.max)return;this.chart_.brushedRange=r;this.viewState.brushedBinRange=r;this.updateDiagnostics_();},get mergeSampleDiagnostics(){return this.canMergeSampleDiagnostics&&this.$.merge_sample_diagnostics.checked;},set mergeSampleDiagnostics(m){this.$.merge_sample_diagnostics.checked=m;},updateBrushedRange_(binIndex){const brushedBinRange=new tr.b.math.Range();brushedBinRange.addValue(tr.b.math.clamp(this.mouseDownBinIndex_,0,this.histogram.allBins.length-1));brushedBinRange.addValue(tr.b.math.clamp(binIndex,0,this.histogram.allBins.length-1));brushedBinRange.max+=1;this.brushedBinRange=brushedBinRange;},onMouseDown_(chartEvent){chartEvent.stopPropagation();if(!this.histogram){return;}
+this.prevBrushedBinRange_=this.brushedBinRange;this.mouseDownBinIndex_=chartEvent.y;this.updateBrushedRange_(chartEvent.y);},onMouseMove_(chartEvent){chartEvent.stopPropagation();if(!this.histogram){return;}
+this.updateBrushedRange_(chartEvent.y);},onMouseUp_(chartEvent){chartEvent.stopPropagation();if(!this.histogram){return;}
+this.updateBrushedRange_(chartEvent.y);if(this.prevBrushedBinRange_.range===1&&this.brushedBinRange.range===1&&this.prevBrushedBinRange_.min===this.brushedBinRange.min){tr.b.Timing.instant('histogram-span','clearBrushedBins');this.brushedBinRange=new tr.b.math.Range();}else{tr.b.Timing.instant('histogram-span','brushBins');}
+this.mouseDownBinIndex_=undefined;},updateDiagnostics_(){let maps=[];for(const bin of this.brushedBins){for(const map of bin.diagnosticMaps){maps.push(map);}}
+if(maps.length===0){this.$.sample_diagnostics_container.style.display='none';return;}
+if(this.mergeSampleDiagnostics!==this.viewState.mergeSampleDiagnostics){tr.b.Timing.instant('histogram-span',(this.mergeSampleDiagnostics?'merge':'split')+'SampleDiagnostics');this.viewState.mergeSampleDiagnostics=this.mergeSampleDiagnostics;}
+if(this.mergeSampleDiagnostics){const merged=new tr.v.d.DiagnosticMap();for(const map of maps){merged.addDiagnostics(map);}
+maps=[merged];}
+this.$.sample_diagnostics_container.style.display='block';this.$.sample_diagnostics.diagnosticMaps=maps;},get histogram(){return this.histogram_;},set histogram(histogram){if(histogram===this.histogram_)return;this.histogram_=histogram;if(this.isAttached)this.updateContents_();},get referenceHistogram(){return this.referenceHistogram_;},set referenceHistogram(histogram){if(histogram===this.referenceHistogram_){return;}
+this.referenceHistogram_=histogram;if(this.histogram)this.updateContents_();},getDeltaScalars_(statNames,scalarMap){if(!this.histogram.canCompare(this.referenceHistogram))return;const mwu=tr.b.math.Statistics.mwu(this.histogram.sampleValues,this.referenceHistogram.sampleValues);for(const deltaStatName of tr.v.Histogram.getDeltaStatisticsNames(statNames)){if(IGNORE_DELTA_STATISTICS_NAMES.includes(deltaStatName))continue;const scalar=this.histogram.getStatisticScalar(deltaStatName,this.referenceHistogram,mwu);if(scalar===undefined)continue;scalarMap.set(deltaStatName,scalar);}
+if(this.histogram.unit.improvementDirection!==tr.b.ImprovementDirection.DONT_CARE){this.$.stats.setSignificanceForKey(`${tr.v.DELTA}avg`,mwu.significance);}},set isYLogScale(logScale){this.chart_.isYLogScale=logScale;},updateContents_(){this.$.chart.style.display='none';this.$.drag_handle.style.display='none';this.$.sample_diagnostics_container.style.display='none';this.$.container.style.justifyContent='';this.brushedBinRange=new tr.b.math.Range();while(Polymer.dom(this.$.chart).lastChild){Polymer.dom(this.$.chart).removeChild(Polymer.dom(this.$.chart).lastChild);}
+if(!this.histogram)return;this.$.container.style.display='';const scalarMap=new Map();this.getDeltaScalars_(this.histogram.statisticsNames,scalarMap);for(const[name,scalar]of this.histogram.statisticsScalars){scalarMap.set(name,scalar);}
+this.$.stats.scalarMap=scalarMap;if(this.histogram.diagnostics.size>0){const diagnosticMap=new tr.v.d.DiagnosticMap();for(const[key,diagnostic]of this.histogram.diagnostics){if(key!==tr.v.d.MERGED_FROM_DIAGNOSTIC_KEY&&key!==tr.v.d.MERGED_TO_DIAGNOSTIC_KEY){diagnosticMap.set(key,diagnostic);}}
+this.$.histogram_diagnostics.diagnosticMaps=[diagnosticMap];this.$.histogram_diagnostics.style.display='block';}else{this.$.histogram_diagnostics.style.display='none';}
+if(this.histogram.numValues<=1){this.brushedBinRange=tr.b.math.Range.fromExplicitRange(0,this.histogram.allBins.length);this.updateDiagnostics_();this.$.container.style.justifyContent='flex-end';return;}
+this.$.chart.style.display='block';this.$.drag_handle.style.display='block';if(this.histogram.allBins.length===1){if(this.histogram.min!==this.histogram.max){this.chart_=new tr.ui.b.BoxChart();Polymer.dom(this.$.chart).appendChild(this.chart_);this.chart_.graphWidth=this.graphWidth;this.chart_.graphHeight=this.graphHeight;this.chart_.hideXAxis=true;this.chart_.data=[{x:'',color:'blue',percentile_0:this.histogram.running.min,percentile_25:this.histogram.getApproximatePercentile(0.25),percentile_50:this.histogram.getApproximatePercentile(0.5),percentile_75:this.histogram.getApproximatePercentile(0.75),percentile_100:this.histogram.running.max,}];}
+this.brushedBinRange=tr.b.math.Range.fromExplicitRange(0,this.histogram.allBins.length);this.updateDiagnostics_();return;}
+this.chart_=new tr.ui.b.NameBarChart();Polymer.dom(this.$.chart).appendChild(this.chart_);this.chart_.graphWidth=this.graphWidth;this.chart_.graphHeight=this.graphHeight;this.chart_.addEventListener('item-mousedown',this.onMouseDown_.bind(this));this.chart_.addEventListener('item-mousemove',this.onMouseMove_.bind(this));this.chart_.addEventListener('item-mouseup',this.onMouseUp_.bind(this));this.chart_.hideLegend=true;this.chart_.getDataSeries('y').color='blue';this.chart_.xAxisLabel='#';this.chart_.brushedRange=this.brushedBinRange;this.updateDiagnostics_();const chartData=[];const binCounts=[];for(const bin of this.histogram.allBins){let x=bin.range.min;if(x===-Number.MAX_VALUE){x='<'+new tr.b.Scalar(this.histogram.unit,bin.range.max).toString();}else{x=new tr.b.Scalar(this.histogram.unit,x).toString();}
+chartData.push({x,y:bin.count});binCounts.push(bin.count);}
+binCounts.sort((x,y)=>y-x);const dataRange=tr.b.math.Range.fromExplicitRange(0,binCounts[0]);if(binCounts[1]>0&&binCounts[0]>(binCounts[1]*2)){dataRange.max=binCounts[1]*(1+TRUNCATE_BIN_MARGIN);}
+if(binCounts[2]>0&&binCounts[1]>(binCounts[2]*2)){dataRange.max=binCounts[2]*(1+TRUNCATE_BIN_MARGIN);}
+this.chart_.overrideDataRange=dataRange;this.chart_.data=chartData;}});});'use strict';tr.exportTo('tr.ui.analysis',function(){const EVENT_FIELD=[{key:'start',label:'Start'},{key:'cpuDuration',label:'CPU Duration'},{key:'duration',label:'Duration'},{key:'cpuSelfTime',label:'CPU Self Time'},{key:'selfTime',label:'Self Time'}];function buildDiagnostics_(slice){const diagnostics={};for(const item of EVENT_FIELD){const fieldName=item.key;if(slice[fieldName]===undefined)continue;diagnostics[fieldName]=new tr.v.d.Scalar(new tr.b.Scalar(tr.b.Unit.byName.timeDurationInMs,slice[fieldName]));}
+diagnostics.args=new tr.v.d.Generic(slice.args);diagnostics.event=new tr.v.d.RelatedEventSet(slice);return diagnostics;}
+Polymer({is:'tr-ui-a-multi-event-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.currentSelection_=undefined;this.eventsHaveDuration_=true;this.eventsHaveSubRows_=true;},ready(){this.$.radioPicker.style.display='none';this.$.radioPicker.items=EVENT_FIELD;this.$.radioPicker.select('cpuSelfTime');this.$.radioPicker.addEventListener('change',()=>{if(this.isAttached)this.updateContents_();});this.$.histogramSpan.graphWidth=400;this.$.histogramSpan.canMergeSampleDiagnostics=false;this.$.histogramContainer.style.display='none';},attached(){if(this.currentSelection_!==undefined)this.updateContents_();},set selection(selection){if(selection.length<=1){throw new Error('Only supports multiple items');}
+this.setSelectionWithoutErrorChecks(selection);},get selection(){return this.currentSelection_;},setSelectionWithoutErrorChecks(selection){this.currentSelection_=selection;if(this.isAttached)this.updateContents_();},get eventsHaveDuration(){return this.eventsHaveDuration_;},set eventsHaveDuration(eventsHaveDuration){this.eventsHaveDuration_=eventsHaveDuration;if(this.isAttached)this.updateContents_();},get eventsHaveSubRows(){return this.eventsHaveSubRows_;},set eventsHaveSubRows(eventsHaveSubRows){this.eventsHaveSubRows_=eventsHaveSubRows;if(this.isAttached)this.updateContents_();},buildHistogram_(selectedKey){let leftBoundary=Number.MAX_VALUE;let rightBoundary=tr.b.math.Statistics.percentile(this.currentSelection_,0.95,function(value){leftBoundary=Math.min(leftBoundary,value[selectedKey]);return value[selectedKey];});if(leftBoundary===rightBoundary)rightBoundary+=1;const histogram=new tr.v.Histogram('',tr.b.Unit.byName.timeDurationInMs,tr.v.HistogramBinBoundaries.createLinear(leftBoundary,rightBoundary,Math.ceil(Math.sqrt(this.currentSelection_.length))));histogram.customizeSummaryOptions({sum:false});for(const slice of this.currentSelection_){histogram.addSample(slice[selectedKey],buildDiagnostics_(slice));}
+return histogram;},updateContents_(){const selection=this.currentSelection_;if(!selection)return;const eventsByTitle=selection.getEventsOrganizedByTitle();const numTitles=Object.keys(eventsByTitle).length;this.$.eventSummaryTable.configure({showTotals:numTitles>1,eventsByTitle,eventsHaveDuration:this.eventsHaveDuration_,eventsHaveSubRows:this.eventsHaveSubRows_});this.$.selectionSummaryTable.selection=this.currentSelection_;if(numTitles===1){this.$.radioPicker.style.display='block';this.$.histogramContainer.style.display='flex';this.$.histogramSpan.histogram=this.buildHistogram_(this.$.radioPicker.selectedKey);if(this.$.histogramSpan.histogram.numValues===0){this.$.histogramContainer.style.display='none';}}else{this.$.radioPicker.style.display='none';this.$.histogramContainer.style.display='none';}}});return{};});'use strict';tr.exportTo('tr.ui.analysis',function(){const FLOW_IN=0x1;const FLOW_OUT=0x2;const FLOW_IN_OUT=FLOW_IN|FLOW_OUT;function FlowClassifier(){this.numEvents_=0;this.eventsByGUID_={};}
+FlowClassifier.prototype={getFS_(event){let fs=this.eventsByGUID_[event.guid];if(fs===undefined){this.numEvents_++;fs={state:0,event};this.eventsByGUID_[event.guid]=fs;}
+return fs;},addInFlow(event){const fs=this.getFS_(event);fs.state|=FLOW_IN;return event;},addOutFlow(event){const fs=this.getFS_(event);fs.state|=FLOW_OUT;return event;},hasEvents(){return this.numEvents_>0;},get inFlowEvents(){const selection=new tr.model.EventSet();for(const guid in this.eventsByGUID_){const fs=this.eventsByGUID_[guid];if(fs.state===FLOW_IN){selection.push(fs.event);}}
+return selection;},get outFlowEvents(){const selection=new tr.model.EventSet();for(const guid in this.eventsByGUID_){const fs=this.eventsByGUID_[guid];if(fs.state===FLOW_OUT){selection.push(fs.event);}}
+return selection;},get internalFlowEvents(){const selection=new tr.model.EventSet();for(const guid in this.eventsByGUID_){const fs=this.eventsByGUID_[guid];if(fs.state===FLOW_IN_OUT){selection.push(fs.event);}}
+return selection;}};return{FlowClassifier,};});'use strict';function*getEventInFlowEvents(event){if(!event.inFlowEvents)return;yield*event.inFlowEvents;}
+function*getEventOutFlowEvents(event){if(!event.outFlowEvents)return;yield*event.outFlowEvents;}
+function*getEventAncestors(event){if(!event.enumerateAllAncestors)return;yield*event.enumerateAllAncestors();}
+function*getEventDescendents(event){if(!event.enumerateAllDescendents)return;yield*event.enumerateAllDescendents();}
+Polymer({is:'tr-ui-a-related-events',ready(){this.eventGroups_=[];this.cancelFunctions_=[];this.$.table.tableColumns=[{title:'Event(s)',value(row){const typeEl=document.createElement('span');typeEl.innerText=row.type;if(row.tooltip){typeEl.title=row.tooltip;}
+return typeEl;},width:'150px'},{title:'Link',width:'100%',value(row){const linkEl=document.createElement('tr-ui-a-analysis-link');if(row.name){linkEl.setSelectionAndContent(row.selection,row.name);}else{linkEl.selection=row.selection;}
+return linkEl;}}];},hasRelatedEvents(){return(this.eventGroups_&&this.eventGroups_.length>0);},setRelatedEvents(eventSet){this.cancelAllTasks_();this.eventGroups_=[];this.addRuntimeCallStats_(eventSet);this.addOverlappingV8ICStats_(eventSet);this.addV8GCObjectStats_(eventSet);this.addV8Slices_(eventSet);this.addConnectedFlows_(eventSet);this.addConnectedEvents_(eventSet);this.addOverlappingSamples_(eventSet);this.updateContents_();},addConnectedFlows_(eventSet){const classifier=new tr.ui.analysis.FlowClassifier();eventSet.forEach(function(slice){if(slice.inFlowEvents){slice.inFlowEvents.forEach(function(flow){classifier.addInFlow(flow);});}
+if(slice.outFlowEvents){slice.outFlowEvents.forEach(function(flow){classifier.addOutFlow(flow);});}});if(!classifier.hasEvents())return;const addToEventGroups=function(type,flowEvent){this.eventGroups_.push({type,selection:new tr.model.EventSet(flowEvent),name:flowEvent.title});};classifier.inFlowEvents.forEach(addToEventGroups.bind(this,'Incoming flow'));classifier.outFlowEvents.forEach(addToEventGroups.bind(this,'Outgoing flow'));classifier.internalFlowEvents.forEach(addToEventGroups.bind(this,'Internal flow'));},cancelAllTasks_(){this.cancelFunctions_.forEach(function(cancelFunction){cancelFunction();});this.cancelFunctions_=[];},addConnectedEvents_(eventSet){this.cancelFunctions_.push(this.createEventsLinkIfNeeded_('Preceding events','Add all events that have led to the selected one(s), connected by '+'flow arrows or by call stack.',eventSet,function*(event){yield*getEventInFlowEvents(event);yield*getEventAncestors(event);if(event.startSlice){yield event.startSlice;}}.bind(this)));this.cancelFunctions_.push(this.createEventsLinkIfNeeded_('Following events','Add all events that have been caused by the selected one(s), '+'connected by flow arrows or by call stack.',eventSet,function*(event){yield*getEventOutFlowEvents(event);yield*getEventDescendents(event);if(event.endSlice){yield event.endSlice;}}.bind(this)));this.cancelFunctions_.push(this.createEventsLinkIfNeeded_('All connected events','Add all events connected to the selected one(s) by flow arrows or '+'by call stack.',eventSet,function*(event){yield*getEventInFlowEvents(event);yield*getEventOutFlowEvents(event);yield*getEventAncestors(event);yield*getEventDescendents(event);if(event.startSlice){yield event.startSlice;}
+if(event.endSlice){yield event.endSlice;}}.bind(this)));},createEventsLinkIfNeeded_(title,tooltip,events,connectedFn){events=new tr.model.EventSet(events);const eventsToProcess=new Set(events);let wasChanged=false;let task;let isCanceled=false;function addEventsUntilTimeout(){if(isCanceled)return;const timeout=window.performance.now()+8;while(eventsToProcess.size>0&&window.performance.now()<=timeout){const nextEvent=tr.b.getFirstElement(eventsToProcess);eventsToProcess.delete(nextEvent);for(const eventToAdd of connectedFn(nextEvent)){if(!events.contains(eventToAdd)){events.push(eventToAdd);eventsToProcess.add(eventToAdd);wasChanged=true;}}}
+if(eventsToProcess.size>0){const newTask=new tr.b.Task(addEventsUntilTimeout.bind(this),this);task.after(newTask);task=newTask;return;}
+if(!wasChanged)return;this.eventGroups_.push({type:title,tooltip,selection:events});this.updateContents_();}
+function cancelTask(){isCanceled=true;}
+task=new tr.b.Task(addEventsUntilTimeout.bind(this),this);tr.b.Task.RunWhenIdle(task);return cancelTask;},addOverlappingSamples_(eventSet){const samples=new tr.model.EventSet();for(const slice of eventSet){if(!slice.parentContainer||!slice.parentContainer.samples){continue;}
+const candidates=slice.parentContainer.samples;const range=tr.b.math.Range.fromExplicitRange(slice.start,slice.start+slice.duration);const filteredSamples=range.filterArray(candidates,function(value){return value.start;});for(const sample of filteredSamples){samples.push(sample);}}
+if(samples.length>0){this.eventGroups_.push({type:'Overlapping samples',tooltip:'All samples overlapping the selected slice(s).',selection:samples});}},addV8Slices_(eventSet){const v8Slices=new tr.model.EventSet();for(const slice of eventSet){if(slice.category==='v8'){v8Slices.push(slice);}}
+if(v8Slices.length>0){this.eventGroups_.push({type:'V8 Slices',tooltip:'All V8 slices in the selected slice(s).',selection:v8Slices});}},addRuntimeCallStats_(eventSet){const slices=new tr.model.EventSet();for(const slice of eventSet){if(slice.category==='v8'&&slice.runtimeCallStats){slices.push(slice);}}
+if(slices.length>0){this.eventGroups_.push({type:'Runtime call stats table',tooltip:'All V8 slices containing runtime call stats table in the selected slice(s).',selection:slices});}},addV8GCObjectStats_(eventSet){const slices=new tr.model.EventSet();for(const slice of eventSet){if(slice.title==='V8.GC_Objects_Stats'){slices.push(slice);}}
+if(slices.length>0){this.eventGroups_.push({type:'V8 GC stats table',tooltip:'All V8 GC statistics slices in the selected set.',selection:slices});}},addOverlappingV8ICStats_(eventSet){const slices=new tr.model.EventSet();for(const slice of eventSet){if(!slice.parentContainer||!slice.parentContainer.sliceGroup){continue;}
+const sliceGroup=slice.parentContainer.sliceGroup.slices;const range=tr.b.math.Range.fromExplicitRange(slice.start,slice.start+slice.duration);const filteredSlices=range.filterArray(sliceGroup,value=>value.start);const icSlices=filteredSlices.filter(x=>x.title==='V8.ICStats');for(const icSlice of icSlices){slices.push(icSlice);}}
+if(slices.length>0){this.eventGroups_.push({type:'Overlapping V8 IC stats',tooltip:'All V8 IC statistics overlapping the selected set.',selection:slices});}},updateContents_(){const table=this.$.table;if(this.eventGroups_===undefined){table.tableRows=[];}else{table.tableRows=this.eventGroups_.slice();}
+table.rebuild();}});'use strict';Polymer({is:'tr-ui-a-multi-async-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],get selection(){return this.$.content.selection;},set selection(selection){this.$.content.selection=selection;this.$.relatedEvents.setRelatedEvents(selection);if(this.$.relatedEvents.hasRelatedEvents()){this.$.relatedEvents.style.display='';}else{this.$.relatedEvents.style.display='none';}},get relatedEventsToHighlight(){if(!this.$.content.selection)return undefined;const selection=new tr.model.EventSet();this.$.content.selection.forEach(function(asyncEvent){if(!asyncEvent.associatedEvents)return;asyncEvent.associatedEvents.forEach(function(event){selection.push(event);});});if(selection.length)return selection;return undefined;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-multi-async-slice-sub-view',tr.model.AsyncSlice,{multi:true,title:'Async Slices',});'use strict';Polymer({is:'tr-ui-a-multi-cpu-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],ready(){this.$.content.eventsHaveSubRows=false;},get selection(){return this.$.content.selection;},set selection(selection){this.$.content.setSelectionWithoutErrorChecks(selection);}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-multi-cpu-slice-sub-view',tr.model.CpuSlice,{multi:true,title:'CPU Slices',});'use strict';Polymer({is:'tr-ui-a-multi-flow-event-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],ready(){this.$.content.eventsHaveDuration=false;this.$.content.eventsHaveSubRows=false;},set selection(selection){this.$.content.selection=selection;},get selection(){return this.$.content.selection;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-multi-flow-event-sub-view',tr.model.FlowEvent,{multi:true,title:'Flow Events',});'use strict';Polymer({is:'tr-ui-a-multi-frame-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.currentSelection_=undefined;},set selection(selection){Polymer.dom(this).textContent='';const realView=document.createElement('tr-ui-a-multi-event-sub-view');realView.eventsHaveDuration=false;realView.eventsHaveSubRows=false;Polymer.dom(this).appendChild(realView);realView.setSelectionWithoutErrorChecks(selection);this.currentSelection_=selection;},get selection(){return this.currentSelection_;},get relatedEventsToHighlight(){if(!this.currentSelection_)return undefined;const selection=new tr.model.EventSet();this.currentSelection_.forEach(function(frameEvent){frameEvent.associatedEvents.forEach(function(event){selection.push(event);});});return selection;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-multi-frame-sub-view',tr.model.Frame,{multi:true,title:'Frames',});'use strict';Polymer({is:'tr-ui-a-multi-instant-event-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.currentSelection_=undefined;},set selection(selection){Polymer.dom(this.$.content).textContent='';const realView=document.createElement('tr-ui-a-multi-event-sub-view');realView.eventsHaveDuration=false;realView.eventsHaveSubRows=false;Polymer.dom(this.$.content).appendChild(realView);realView.setSelectionWithoutErrorChecks(selection);this.currentSelection_=selection;},get selection(){return this.currentSelection_;}});'use strict';Polymer({is:'tr-ui-a-multi-object-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.currentSelection_=undefined;},ready(){this.$.content.showHeader=false;},get selection(){return this.currentSelection_;},set selection(selection){this.currentSelection_=selection;const objectEvents=tr.b.asArray(selection).sort(tr.b.math.Range.compareByMinTimes);const timeSpanConfig={unit:tr.b.Unit.byName.timeStampInMs,ownerDocument:this.ownerDocument};const table=this.$.content;table.tableColumns=[{title:'First',value(event){if(event instanceof tr.model.ObjectSnapshot){return tr.v.ui.createScalarSpan(event.ts,timeSpanConfig);}
+const spanEl=document.createElement('span');Polymer.dom(spanEl).appendChild(tr.v.ui.createScalarSpan(event.creationTs,timeSpanConfig));Polymer.dom(spanEl).appendChild(tr.ui.b.createSpan({textContent:'-',marginLeft:'4px',marginRight:'4px'}));if(event.deletionTs!==Number.MAX_VALUE){Polymer.dom(spanEl).appendChild(tr.v.ui.createScalarSpan(event.deletionTs,timeSpanConfig));}
+return spanEl;},width:'200px'},{title:'Second',value(event){const linkEl=document.createElement('tr-ui-a-analysis-link');linkEl.setSelectionAndContent(function(){return new tr.model.EventSet(event);},event.userFriendlyName);return linkEl;},width:'100%'}];table.tableRows=objectEvents;table.rebuild();}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-multi-object-sub-view',tr.model.ObjectInstance,{multi:true,title:'Object Instances',});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-multi-object-sub-view',tr.model.ObjectSnapshot,{multi:true,title:'Object Snapshots',});'use strict';const EventSet=tr.model.EventSet;const CHART_TITLE='Power (W) by ms since vertical sync';Polymer({is:'tr-ui-a-frame-power-usage-chart',ready(){this.chart_=undefined;this.samples_=new EventSet();this.vSyncTimestamps_=[];},attached(){if(this.samples_)this.updateContents_();},get chart(){return this.chart_;},get samples(){return this.samples_;},get vSyncTimestamps(){return this.vSyncTimestamps_;},setData(samples,vSyncTimestamps){this.samples_=(samples===undefined)?new EventSet():samples;this.vSyncTimestamps_=(vSyncTimestamps===undefined)?[]:vSyncTimestamps;if(this.isAttached)this.updateContents_();},updateContents_(){this.clearChart_();const data=this.getDataForLineChart_();if(data.length===0)return;this.chart_=new tr.ui.b.LineChart();Polymer.dom(this.$.content).appendChild(this.chart_);this.chart_.chartTitle=CHART_TITLE;this.chart_.data=data;},clearChart_(){const content=this.$.content;while(Polymer.dom(content).firstChild){Polymer.dom(content).removeChild(Polymer.dom(content).firstChild);}
+this.chart_=undefined;},getDataForLineChart_(){const sortedSamples=this.sortSamplesByTimestampAscending_(this.samples);const vSyncTimestamps=this.vSyncTimestamps.slice();let lastVSyncTimestamp=undefined;const points=[];let frameNumber=0;sortedSamples.forEach(function(sample){while(vSyncTimestamps.length>0&&vSyncTimestamps[0]<=sample.start){lastVSyncTimestamp=vSyncTimestamps.shift();frameNumber++;}
+if(lastVSyncTimestamp===undefined)return;const point={x:sample.start-lastVSyncTimestamp};point['f'+frameNumber]=sample.powerInW;points.push(point);});return points;},sortSamplesByTimestampAscending_(samples){return samples.toArray().sort(function(smpl1,smpl2){return smpl1.start-smpl2.start;});}});'use strict';Polymer({is:'tr-ui-a-power-sample-summary-table',ready(){this.$.table.tableColumns=[{title:'Min power',width:'100px',value(row){return tr.b.Unit.byName.powerInWatts.format(row.min);}},{title:'Max power',width:'100px',value(row){return tr.b.Unit.byName.powerInWatts.format(row.max);}},{title:'Time-weighted average',width:'100px',value(row){return tr.b.Unit.byName.powerInWatts.format(row.timeWeightedAverageInW);}},{title:'Energy consumed',width:'100px',value(row){return tr.b.Unit.byName.energyInJoules.format(row.energyConsumedInJ);}},{title:'Sample count',width:'100%',value(row){return row.sampleCount;}}];this.samples=new tr.model.EventSet();},get samples(){return this.samples_;},set samples(samples){if(samples===this.samples)return;this.samples_=(samples===undefined)?new tr.model.EventSet():samples;this.updateContents_();},updateContents_(){if(this.samples.length===0){this.$.table.tableRows=[];}else{this.$.table.tableRows=[{min:this.getMin(),max:this.getMax(),timeWeightedAverageInW:this.getTimeWeightedAverageInW(),energyConsumedInJ:this.getEnergyConsumedInJ(),sampleCount:this.samples.length}];}
+this.$.table.rebuild();},getMin(){return Math.min.apply(null,this.samples.map(function(sample){return sample.powerInW;}));},getMax(){return Math.max.apply(null,this.samples.map(function(sample){return sample.powerInW;}));},getTimeWeightedAverageInW(){const energyConsumedInJ=this.getEnergyConsumedInJ();if(energyConsumedInJ==='N/A')return'N/A';const durationInS=tr.b.convertUnit(this.samples.bounds.duration,tr.b.UnitPrefixScale.METRIC.MILLI,tr.b.UnitPrefixScale.METRIC.NONE);return energyConsumedInJ/durationInS;},getEnergyConsumedInJ(){if(this.samples.length<2)return'N/A';const bounds=this.samples.bounds;const series=tr.b.getFirstElement(this.samples).series;return series.getEnergyConsumedInJ(bounds.min,bounds.max);}});'use strict';Polymer({is:'tr-ui-a-multi-power-sample-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],ready(){this.currentSelection_=undefined;},get selection(){return this.currentSelection_;},set selection(selection){this.currentSelection_=selection;this.updateContents_();},updateContents_(){const samples=this.selection;const vSyncTimestamps=(!samples?[]:tr.b.getFirstElement(samples).series.device.vSyncTimestamps);this.$.summaryTable.samples=samples;this.$.chart.setData(this.selection,vSyncTimestamps);}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-multi-power-sample-sub-view',tr.model.PowerSample,{multi:true,title:'Power Samples',});'use strict';(function(){const MultiDimensionalViewBuilder=tr.b.MultiDimensionalViewBuilder;Polymer({is:'tr-ui-a-multi-sample-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.viewOption_=undefined;this.selection_=undefined;},ready(){const viewSelector=tr.ui.b.createSelector(this,'viewOption','tracing.ui.analysis.multi_sample_sub_view',MultiDimensionalViewBuilder.ViewType.TOP_DOWN_TREE_VIEW,[{label:'Top-down (Tree)',value:MultiDimensionalViewBuilder.ViewType.TOP_DOWN_TREE_VIEW},{label:'Top-down (Heavy)',value:MultiDimensionalViewBuilder.ViewType.TOP_DOWN_HEAVY_VIEW},{label:'Bottom-up (Heavy)',value:MultiDimensionalViewBuilder.ViewType.BOTTOM_UP_HEAVY_VIEW}]);Polymer.dom(this.$.control).appendChild(viewSelector);this.$.table.selectionMode=tr.ui.b.TableFormat.SelectionMode.ROW;},get selection(){return this.selection_;},set selection(selection){this.selection_=selection;this.updateContents_();},get viewOption(){return this.viewOption_;},set viewOption(viewOption){this.viewOption_=viewOption;this.updateContents_();},createSamplingSummary_(selection,viewOption){const builder=new MultiDimensionalViewBuilder(1,1);const samples=selection.filter(event=>event instanceof tr.model.Sample);samples.forEach(function(sample){builder.addPath([sample.userFriendlyStack.reverse()],[1],MultiDimensionalViewBuilder.ValueKind.SELF);});return builder.buildView(viewOption);},processSampleRows_(rows){for(const row of rows){let title=row.title[0];let results=/(.*) (Deoptimized reason: .*)/.exec(title);if(results!==null){row.deoptReason=results[2];title=results[1];}
+results=/(.*) url: (.*)/.exec(title);if(results!==null){row.functionName=results[1];row.url=results[2];if(row.functionName===''){row.functionName='(anonymous function)';}
+if(row.url===''){row.url='unknown';}}else{row.functionName=title;row.url='unknown';}
+this.processSampleRows_(row.subRows);}},updateContents_(){if(this.selection===undefined){this.$.table.tableColumns=[];this.$.table.tableRows=[];this.$.table.rebuild();return;}
+const samplingData=this.createSamplingSummary_(this.selection,this.viewOption);const total=samplingData.values[0].total;const columns=[this.createPercentColumn_('Total',total),this.createSamplesColumn_('Total'),this.createPercentColumn_('Self',total),this.createSamplesColumn_('Self'),{title:'Function Name',value(row){if(row.deoptReason!==undefined){const spanEl=tr.ui.b.createSpan({italic:true,color:'#F44336',tooltip:row.deoptReason});spanEl.innerText=row.functionName;return spanEl;}
+return row.functionName;},width:'150px',cmp:(a,b)=>a.functionName.localeCompare(b.functionName),showExpandButtons:true},{title:'Location',value(row){return row.url;},width:'250px',cmp:(a,b)=>a.url.localeCompare(b.url),}];this.processSampleRows_(samplingData.subRows);this.$.table.tableColumns=columns;this.$.table.sortColumnIndex=1;this.$.table.sortDescending=true;this.$.table.tableRows=samplingData.subRows;this.$.table.rebuild();},createPercentColumn_(title,samplingDataTotal){const field=title.toLowerCase();return{title:title+' percent',value(row){return tr.v.ui.createScalarSpan(row.values[0][field]/samplingDataTotal,{customContextRange:tr.b.math.Range.PERCENT_RANGE,unit:tr.b.Unit.byName.normalizedPercentage,context:{minimumFractionDigits:2,maximumFractionDigits:2},});},width:'60px',cmp:(a,b)=>a.values[0][field]-b.values[0][field]};},createSamplesColumn_(title){const field=title.toLowerCase();return{title:title+' samples',value(row){return tr.v.ui.createScalarSpan(row.values[0][field],{unit:tr.b.Unit.byName.unitlessNumber,context:{maximumFractionDigits:0},});},width:'60px',cmp:(a,b)=>a.values[0][field]-b.values[0][field]};}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-multi-sample-sub-view',tr.model.Sample,{multi:true,title:'Samples',});})();'use strict';Polymer({is:'tr-ui-a-multi-thread-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.selection_=undefined;},get selection(){return this.selection_;},set selection(selection){this.selection_=selection;if(tr.isExported('tr.ui.e.chrome.cc.RasterTaskSelection')){if(tr.ui.e.chrome.cc.RasterTaskSelection.supports(selection)){const ltvSelection=new tr.ui.e.chrome.cc.RasterTaskSelection(selection);const ltv=new tr.ui.e.chrome.cc.LayerTreeHostImplSnapshotView();ltv.objectSnapshot=ltvSelection.containingSnapshot;ltv.selection=ltvSelection;ltv.extraHighlightsByLayerId=ltvSelection.extraHighlightsByLayerId;Polymer.dom(this.$.content).textContent='';Polymer.dom(this.$.content).appendChild(ltv);this.requiresTallView_=true;return;}}
+Polymer.dom(this.$.content).textContent='';const mesv=document.createElement('tr-ui-a-multi-event-sub-view');mesv.selection=selection;Polymer.dom(this.$.content).appendChild(mesv);const relatedEvents=document.createElement('tr-ui-a-related-events');relatedEvents.setRelatedEvents(selection);if(relatedEvents.hasRelatedEvents()){Polymer.dom(this.$.content).appendChild(relatedEvents);}},get requiresTallView(){if(this.$.content.children.length===0)return false;const childTagName=this.$.content.children[0].tagName;if(childTagName==='TR-UI-A-MULTI-EVENT-SUB-VIEW'){return false;}
+return true;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-multi-thread-slice-sub-view',tr.model.ThreadSlice,{multi:true,title:'Slices',});'use strict';Polymer({is:'tr-ui-a-multi-thread-time-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],ready(){this.$.content.eventsHaveSubRows=false;},get selection(){return this.$.content.selection;},set selection(selection){this.$.content.setSelectionWithoutErrorChecks(selection);}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-multi-thread-time-slice-sub-view',tr.model.ThreadTimeSlice,{multi:true,title:'Thread Timeslices',});'use strict';Polymer({is:'tr-ui-a-user-expectation-related-samples-table',ready(){this.samples_=[];this.$.table.tableColumns=[{title:'Event(s)',value(row){const typeEl=document.createElement('span');typeEl.innerText=row.type;if(row.tooltip){typeEl.title=row.tooltip;}
+return typeEl;},width:'150px'},{title:'Link',width:'100%',value(row){const linkEl=document.createElement('tr-ui-a-analysis-link');if(row.name){linkEl.setSelectionAndContent(row.selection,row.name);}else{linkEl.selection=row.selection;}
+return linkEl;}}];},hasRelatedSamples(){return(this.samples_&&this.samples_.length>0);},set selection(eventSet){this.samples_=[];const samples=new tr.model.EventSet;eventSet.forEach(function(ue){samples.addEventSet(ue.associatedSamples);}.bind(this));if(samples.length>0){this.samples_.push({type:'Overlapping samples',tooltip:'All samples overlapping the selected user expectation(s).',selection:samples});}
+this.updateContents_();},updateContents_(){const table=this.$.table;if(this.samples_&&this.samples_.length>0){table.tableRows=this.samples_.slice();}else{table.tableRows=[];}
+table.rebuild();}});'use strict';Polymer({is:'tr-ui-a-multi-interaction-record-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.currentSelection_=undefined;},set selection(selection){this.currentSelection_=selection;this.$.realView.setSelectionWithoutErrorChecks(selection);this.currentSelection_=selection;this.$.relatedSamples.selection=selection;if(this.$.relatedSamples.hasRelatedSamples()){this.$.events.style.display='';}else{this.$.events.style.display='none';}},get selection(){return this.currentSelection_;},get relatedEventsToHighlight(){if(!this.currentSelection_)return undefined;const selection=new tr.model.EventSet();this.currentSelection_.forEach(function(ir){ir.associatedEvents.forEach(function(event){selection.push(event);});});return selection;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-single-user-expectation-sub-view',tr.model.um.UserExpectation,{multi:true,title:'User Expectations',});'use strict';Polymer({is:'tr-ui-a-single-async-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],get selection(){return this.$.content.selection;},set selection(selection){if(selection.length!==1){throw new Error('Only supports single slices');}
+this.$.content.setSelectionWithoutErrorChecks(selection);this.$.relatedEvents.setRelatedEvents(selection);if(this.$.relatedEvents.hasRelatedEvents()){this.$.relatedEvents.style.display='';}else{this.$.relatedEvents.style.display='none';}},getEventRows_(event){const rows=this.__proto__.__proto__.getEventRows_(event);rows.splice(0,0,{name:'ID',value:event.id});return rows;},get relatedEventsToHighlight(){if(!this.currentSelection_)return undefined;return tr.b.getOnlyElement(this.currentSelection_).associatedEvents;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-single-async-slice-sub-view',tr.model.AsyncSlice,{multi:false,title:'Async Slice',});'use strict';Polymer({is:'tr-ui-a-single-cpu-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.currentSelection_=undefined;},get selection(){return this.currentSelection_;},set selection(selection){const cpuSlice=tr.b.getOnlyElement(selection);if(!(cpuSlice instanceof tr.model.CpuSlice)){throw new Error('Only supports thread time slices');}
+this.currentSelection_=selection;const thread=cpuSlice.threadThatWasRunning;const root=Polymer.dom(this.root);if(thread){Polymer.dom(root.querySelector('#process-name')).textContent=thread.parent.userFriendlyName;Polymer.dom(root.querySelector('#thread-name')).textContent=thread.userFriendlyName;}else{root.querySelector('#process-name').parentElement.style.display='none';Polymer.dom(root.querySelector('#thread-name')).textContent=cpuSlice.title;}
+root.querySelector('#start').setValueAndUnit(cpuSlice.start,tr.b.Unit.byName.timeStampInMs);root.querySelector('#duration').setValueAndUnit(cpuSlice.duration,tr.b.Unit.byName.timeDurationInMs);const runningThreadEl=root.querySelector('#running-thread');const timeSlice=cpuSlice.getAssociatedTimeslice();if(!timeSlice){runningThreadEl.parentElement.style.display='none';}else{const threadLink=document.createElement('tr-ui-a-analysis-link');threadLink.selection=new tr.model.EventSet(timeSlice);Polymer.dom(threadLink).textContent='Click to select';runningThreadEl.parentElement.style.display='';Polymer.dom(runningThreadEl).textContent='';Polymer.dom(runningThreadEl).appendChild(threadLink);}
+root.querySelector('#args').object=cpuSlice.args;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-single-cpu-slice-sub-view',tr.model.CpuSlice,{multi:false,title:'CPU Slice',});'use strict';function createAnalysisLinkTo(event){const linkEl=document.createElement('tr-ui-a-analysis-link');linkEl.setSelectionAndContent(new tr.model.EventSet(event),event.userFriendlyName);return linkEl;}
+Polymer({is:'tr-ui-a-single-flow-event-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],listeners:{'singleEventSubView.customize-rows':'onCustomizeRows_'},set selection(selection){this.currentSelection_=selection;this.$.singleEventSubView.setSelectionWithoutErrorChecks(selection);},get selection(){return this.currentSelection_;},onCustomizeRows_(e){const event=tr.b.getOnlyElement(this.currentSelection_);const rows=e.rows;rows.unshift({name:'ID',value:event.id});rows.push({name:'From',value:createAnalysisLinkTo(event.startSlice)});rows.push({name:'To',value:createAnalysisLinkTo(event.endSlice)});}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-single-flow-event-sub-view',tr.model.FlowEvent,{multi:false,title:'Flow Event',});'use strict';Polymer({is:'tr-ui-a-single-frame-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],ready(){this.currentSelection_=undefined;},get selection(){return this.currentSelection_;},set selection(selection){this.currentSelection_=selection;this.$.asv.selection=tr.b.getOnlyElement(selection).associatedAlerts;},get relatedEventsToHighlight(){if(!this.currentSelection_)return undefined;return tr.b.getOnlyElement(this.currentSelection_).associatedEvents;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-single-frame-sub-view',tr.model.Frame,{multi:false,title:'Frame',});'use strict';Polymer({is:'tr-ui-a-single-instant-event-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.currentSelection_=undefined;},set selection(selection){Polymer.dom(this.$.content).textContent='';const realView=document.createElement('tr-ui-a-single-event-sub-view');realView.setSelectionWithoutErrorChecks(selection);Polymer.dom(this.$.content).appendChild(realView);this.currentSelection_=selection;},get selection(){return this.currentSelection_;}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-single-instant-event-sub-view',tr.model.InstantEvent,{multi:false,title:'Instant Event',});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-multi-instant-event-sub-view',tr.model.InstantEvent,{multi:true,title:'Instant Events',});'use strict';tr.exportTo('tr.ui.analysis',function(){const ObjectInstanceView=tr.ui.b.define('object-instance-view');ObjectInstanceView.prototype={__proto__:HTMLDivElement.prototype,decorate(){this.objectInstance_=undefined;},get requiresTallView(){return true;},set modelEvent(obj){this.objectInstance=obj;},get modelEvent(){return this.objectInstance;},get objectInstance(){return this.objectInstance_;},set objectInstance(i){this.objectInstance_=i;this.updateContents();},updateContents(){throw new Error('Not implemented');}};const options=new tr.b.ExtensionRegistryOptions(tr.b.TYPE_BASED_REGISTRY_MODE);options.mandatoryBaseClass=ObjectInstanceView;options.defaultMetadata={showInTrackView:true};tr.b.decorateExtensionRegistry(ObjectInstanceView,options);return{ObjectInstanceView,};});'use strict';Polymer({is:'tr-ui-a-single-object-instance-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.currentSelection_=undefined;},get requiresTallView(){if(this.$.content.children.length===0){return false;}
+if(this.$.content.children[0]instanceof
+tr.ui.analysis.ObjectInstanceView){return this.$.content.children[0].requiresTallView;}},get selection(){return this.currentSelection_;},set selection(selection){const instance=tr.b.getOnlyElement(selection);if(!(instance instanceof tr.model.ObjectInstance)){throw new Error('Only supports object instances');}
+Polymer.dom(this.$.content).textContent='';this.currentSelection_=selection;const typeInfo=tr.ui.analysis.ObjectInstanceView.getTypeInfo(instance.category,instance.typeName);if(typeInfo){const customView=new typeInfo.constructor();Polymer.dom(this.$.content).appendChild(customView);customView.modelEvent=instance;}else{this.appendGenericAnalysis_(instance);}},appendGenericAnalysis_(instance){let html='';html+='<div class="title">'+
+instance.typeName+' '+
+instance.id+'</div>\n';html+='<table>';html+='<tr>';html+='<tr><td>creationTs:</td><td>'+
+instance.creationTs+'</td></tr>\n';if(instance.deletionTs!==Number.MAX_VALUE){html+='<tr><td>deletionTs:</td><td>'+
+instance.deletionTs+'</td></tr>\n';}else{html+='<tr><td>deletionTs:</td><td>not deleted</td></tr>\n';}
+html+='<tr><td>snapshots:</td><td id="snapshots"></td></tr>\n';html+='</table>';Polymer.dom(this.$.content).innerHTML=html;const snapshotsEl=Polymer.dom(this.$.content).querySelector('#snapshots');instance.snapshots.forEach(function(snapshot){const snapshotLink=document.createElement('tr-ui-a-analysis-link');snapshotLink.selection=new tr.model.EventSet(snapshot);Polymer.dom(snapshotsEl).appendChild(snapshotLink);});}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-single-object-instance-sub-view',tr.model.ObjectInstance,{multi:false,title:'Object Instance',});'use strict';Polymer({is:'tr-ui-a-single-object-snapshot-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.currentSelection_=undefined;},get requiresTallView(){if(this.children.length===0){return false;}
+if(this.children[0]instanceof tr.ui.analysis.ObjectSnapshotView){return this.children[0].requiresTallView;}},get selection(){return this.currentSelection_;},set selection(selection){const snapshot=tr.b.getOnlyElement(selection);if(!(snapshot instanceof tr.model.ObjectSnapshot)){throw new Error('Only supports object instances');}
+Polymer.dom(this).textContent='';this.currentSelection_=selection;const typeInfo=tr.ui.analysis.ObjectSnapshotView.getTypeInfo(snapshot.objectInstance.category,snapshot.objectInstance.typeName);if(typeInfo){const customView=new typeInfo.constructor();Polymer.dom(this).appendChild(customView);customView.modelEvent=snapshot;}else{this.appendGenericAnalysis_(snapshot);}},appendGenericAnalysis_(snapshot){const instance=snapshot.objectInstance;Polymer.dom(this).textContent='';const titleEl=document.createElement('div');Polymer.dom(titleEl).classList.add('title');Polymer.dom(titleEl).appendChild(document.createTextNode('Snapshot of '));Polymer.dom(this).appendChild(titleEl);const instanceLinkEl=document.createElement('tr-ui-a-analysis-link');instanceLinkEl.selection=new tr.model.EventSet(instance);Polymer.dom(titleEl).appendChild(instanceLinkEl);Polymer.dom(titleEl).appendChild(document.createTextNode(' @ '));Polymer.dom(titleEl).appendChild(tr.v.ui.createScalarSpan(snapshot.ts,{unit:tr.b.Unit.byName.timeStampInMs,ownerDocument:this.ownerDocument,inline:true,}));const tableEl=document.createElement('table');Polymer.dom(this).appendChild(tableEl);const rowEl=document.createElement('tr');Polymer.dom(tableEl).appendChild(rowEl);const labelEl=document.createElement('td');Polymer.dom(labelEl).textContent='args:';Polymer.dom(rowEl).appendChild(labelEl);const argsEl=document.createElement('td');argsEl.id='args';Polymer.dom(rowEl).appendChild(argsEl);const objectViewEl=document.createElement('tr-ui-a-generic-object-view');objectViewEl.object=snapshot.args;Polymer.dom(argsEl).appendChild(objectViewEl);}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-single-object-snapshot-sub-view',tr.model.ObjectSnapshot,{multi:false,title:'Object Snapshot',});'use strict';Polymer({is:'tr-ui-a-power-sample-table',ready(){this.$.table.tableColumns=[{title:'Time',width:'100px',value(row){return tr.v.ui.createScalarSpan(row.start,{unit:tr.b.Unit.byName.timeStampInMs});}},{title:'Power',width:'100%',value(row){return tr.v.ui.createScalarSpan(row.powerInW,{unit:tr.b.Unit.byName.powerInWatts});}}];this.sample=undefined;},get sample(){return this.sample_;},set sample(sample){this.sample_=sample;this.updateContents_();},updateContents_(){if(this.sample===undefined){this.$.table.tableRows=[];}else{this.$.table.tableRows=[this.sample];}
+this.$.table.rebuild();}});'use strict';Polymer({is:'tr-ui-a-single-power-sample-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],ready(){this.currentSelection_=undefined;},get selection(){return this.currentSelection_;},set selection(selection){this.currentSelection_=selection;this.updateContents_();},updateContents_(){if(this.selection.length!==1){throw new Error('Cannot pass multiple samples to sample table.');}
+this.$.samplesTable.sample=tr.b.getOnlyElement(this.selection);}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-single-power-sample-sub-view',tr.model.PowerSample,{multi:false,title:'Power Sample',});'use strict';Polymer({is:'tr-ui-a-single-sample-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.currentSelection_=undefined;},ready(){this.$.content.tableColumns=[{title:'',value:row=>row.title,width:'100px'},{title:'',value:row=>row.value,width:'100%'}];this.$.content.showHeader=false;},get selection(){return this.currentSelection_;},set selection(selection){this.currentSelection_=selection;if(this.currentSelection_===undefined){this.$.content.tableRows=[];return;}
+const sample=tr.b.getOnlyElement(this.currentSelection_);const table=this.$.content;const rows=[];rows.push({title:'Title',value:sample.title});rows.push({title:'Sample time',value:tr.v.ui.createScalarSpan(sample.start,{unit:tr.b.Unit.byName.timeStampInMs,ownerDocument:this.ownerDocument})});const callStackTableEl=document.createElement('tr-ui-b-table');callStackTableEl.tableRows=sample.getNodesAsArray().reverse();callStackTableEl.tableColumns=[{title:'function name',value:row=>row.functionName||'(anonymous function)'},{title:'location',value:row=>row.url}];callStackTableEl.rebuild();rows.push({title:'Call stack',value:callStackTableEl});table.tableRows=rows;table.rebuild();}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-single-sample-sub-view',tr.model.Sample,{multi:false,title:'Sample',});'use strict';Polymer({is:'tr-ui-a-single-thread-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],get selection(){return this.$.content.selection;},set selection(selection){this.$.content.selection=selection;this.$.relatedEvents.setRelatedEvents(selection);if(this.$.relatedEvents.hasRelatedEvents()){this.$.relatedEvents.style.display='';}else{this.$.relatedEvents.style.display='none';}}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-single-thread-slice-sub-view',tr.model.ThreadSlice,{multi:false,title:'Slice',});'use strict';Polymer({is:'tr-ui-a-single-thread-time-slice-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.currentSelection_=undefined;},get selection(){return this.currentSelection_;},set selection(selection){const timeSlice=tr.b.getOnlyElement(selection);if(!(timeSlice instanceof tr.model.ThreadTimeSlice)){throw new Error('Only supports thread time slices');}
+this.currentSelection_=selection;const thread=timeSlice.thread;const root=Polymer.dom(this.root);Polymer.dom(root.querySelector('#state')).textContent=timeSlice.title;const stateColor=tr.b.ColorScheme.colorsAsStrings[timeSlice.colorId];root.querySelector('#state').style.backgroundColor=stateColor;Polymer.dom(root.querySelector('#process-name')).textContent=thread.parent.userFriendlyName;Polymer.dom(root.querySelector('#thread-name')).textContent=thread.userFriendlyName;root.querySelector('#start').setValueAndUnit(timeSlice.start,tr.b.Unit.byName.timeStampInMs);root.querySelector('#duration').setValueAndUnit(timeSlice.duration,tr.b.Unit.byName.timeDurationInMs);const onCpuEl=root.querySelector('#on-cpu');Polymer.dom(onCpuEl).textContent='';const runningInsteadEl=root.querySelector('#running-instead');if(timeSlice.cpuOnWhichThreadWasRunning){Polymer.dom(runningInsteadEl.parentElement).removeChild(runningInsteadEl);const cpuLink=document.createElement('tr-ui-a-analysis-link');cpuLink.selection=new tr.model.EventSet(timeSlice.getAssociatedCpuSlice());Polymer.dom(cpuLink).textContent=timeSlice.cpuOnWhichThreadWasRunning.userFriendlyName;Polymer.dom(onCpuEl).appendChild(cpuLink);}else{Polymer.dom(onCpuEl.parentElement).removeChild(onCpuEl);const cpuSliceThatTookCpu=timeSlice.getCpuSliceThatTookCpu();if(cpuSliceThatTookCpu){const cpuLink=document.createElement('tr-ui-a-analysis-link');cpuLink.selection=new tr.model.EventSet(cpuSliceThatTookCpu);if(cpuSliceThatTookCpu.thread){Polymer.dom(cpuLink).textContent=cpuSliceThatTookCpu.thread.userFriendlyName;}else{Polymer.dom(cpuLink).textContent=cpuSliceThatTookCpu.title;}
+Polymer.dom(runningInsteadEl).appendChild(cpuLink);}else{Polymer.dom(runningInsteadEl.parentElement).removeChild(runningInsteadEl);}}
+const argsEl=root.querySelector('#args');if(Object.keys(timeSlice.args).length>0){const argsView=document.createElement('tr-ui-a-generic-object-view');argsView.object=timeSlice.args;argsEl.parentElement.style.display='';Polymer.dom(argsEl).textContent='';Polymer.dom(argsEl).appendChild(argsView);}else{argsEl.parentElement.style.display='none';}}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-single-thread-time-slice-sub-view',tr.model.ThreadTimeSlice,{multi:false,title:'Thread Timeslice',});'use strict';Polymer({is:'tr-ui-a-single-user-expectation-sub-view',behaviors:[tr.ui.analysis.AnalysisSubView],created(){this.currentSelection_=undefined;},get selection(){return this.currentSelection_;},set selection(selection){this.$.realView.addEventListener('customize-rows',this.onCustomizeRows_.bind(this));this.currentSelection_=selection;this.$.realView.setSelectionWithoutErrorChecks(selection);this.$.relatedSamples.selection=selection;if(this.$.relatedSamples.hasRelatedSamples()){this.$.events.style.display='';}else{this.$.events.style.display='none';}},get relatedEventsToHighlight(){if(!this.currentSelection_)return undefined;return tr.b.getOnlyElement(this.currentSelection_).associatedEvents;},onCustomizeRows_(event){const ue=tr.b.getOnlyElement(this.selection);if(ue.rawCpuMs){event.rows.push({name:'Total CPU',value:tr.v.ui.createScalarSpan(ue.totalCpuMs,{unit:tr.b.Unit.byName.timeDurationInMs})});}}});tr.ui.analysis.AnalysisSubView.register('tr-ui-a-single-user-expectation-sub-view',tr.model.um.UserExpectation,{multi:false,title:'User Expectation',});'use strict';(function(){const EventRegistry=tr.model.EventRegistry;function getTabStripLabel(numEvents){if(numEvents===0){return'Nothing selected. Tap stuff.';}else if(numEvents===1){return'1 item selected.';}
+return numEvents+' items selected.';}
+function createSubView(subViewTypeInfo,selection){let tagName;if(selection.length===1){tagName=subViewTypeInfo.singleTagName;}else{tagName=subViewTypeInfo.multiTagName;}
+if(tagName===undefined){throw new Error('No view registered for '+
+subViewTypeInfo.eventConstructor.name);}
+const subView=document.createElement(tagName);let title;if(selection.length===1){title=subViewTypeInfo.singleTitle;}else{title=subViewTypeInfo.multiTitle;}
+title+=' ('+selection.length+')';subView.tabLabel=title;subView.selection=selection;return subView;}
+Polymer({is:'tr-ui-a-analysis-view',ready(){this.brushingStateController_=undefined;this.lastSelection_=undefined;this.tabView_=document.createElement('tr-ui-b-tab-view');this.tabView_.addEventListener('selected-tab-change',this.onSelectedSubViewChanged_.bind(this));Polymer.dom(this).appendChild(this.tabView_);},set tallMode(value){Polymer.dom(this).classList.toggle('tall-mode',value);},get tallMode(){return Polymer.dom(this).classList.contains('tall-mode');},get tabView(){return this.tabView_;},get brushingStateController(){return this.brushingStateController_;},set brushingStateController(brushingStateController){if(this.brushingStateController_){this.brushingStateController_.removeEventListener('change',this.onSelectionChanged_.bind(this));}
+this.brushingStateController_=brushingStateController;if(this.brushingStateController){this.brushingStateController_.addEventListener('change',this.onSelectionChanged_.bind(this));}
+this.onSelectionChanged_();},get selection(){return this.brushingStateController_.selection;},onSelectionChanged_(e){if(this.lastSelection_&&this.selection.equals(this.lastSelection_)){return;}
+this.lastSelection_=this.selection;this.tallMode=false;this.tabView_.label=getTabStripLabel(this.selection.length);const eventsByBaseTypeName=this.selection.getEventsOrganizedByBaseType(true);const ASV=tr.ui.analysis.AnalysisSubView;const eventsByTagName=ASV.getEventsOrganizedByTypeInfo(this.selection);const newSubViews=[];eventsByTagName.forEach(function(events,typeInfo){newSubViews.push(createSubView(typeInfo,events));});this.tabView_.resetSubViews(newSubViews);},onSelectedSubViewChanged_(){const selectedSubView=this.tabView_.selectedSubView;if(!selectedSubView){this.tallMode=false;this.maybeChangeRelatedEvents_(undefined);return;}
+this.tallMode=selectedSubView.requiresTallView;this.maybeChangeRelatedEvents_(selectedSubView.relatedEventsToHighlight);},maybeChangeRelatedEvents_(events){if(this.brushingStateController){this.brushingStateController.changeAnalysisViewRelatedEvents(events);}}});})();'use strict';Polymer({is:'tr-ui-b-dropdown',ready(){this.$.outer.tabIndex=0;},get iconElement(){return this.$.icon;},onOuterKeyDown_(e){if(e.keyCode===' '.charCodeAt(0)){this.toggle_();e.preventDefault();e.stopPropagation();}},onOuterClick_(e){const or=this.$.outer.getBoundingClientRect();let inside=true;inside&=e.clientX>=or.left;inside&=e.clientX<or.right;inside&=e.clientY>=or.top;inside&=e.clientY<or.bottom;if(!inside)return;e.preventDefault();this.toggle_();},toggle_(){if(!this.isOpen){this.show();}else{this.close();}},show(){if(this.isOpen)return;Polymer.dom(this.$.outer).classList.add('open');const ddr=this.$.outer.getBoundingClientRect();const rW=Math.max(ddr.width,150);this.$.dialog.style.minWidth=rW+'px';this.$.dialog.showModal();const ddw=this.$.outer.getBoundingClientRect().width;const w=this.$.dialog.getBoundingClientRect().width;this.$.dialog.style.top=ddr.bottom-1+'px';this.$.dialog.style.left=ddr.left+'px';},onDialogClick_(e){if(!this.isOpen)return;if(e.srcElement!==this.$.dialog)return;e.preventDefault();this.close();},onDialogCancel_(e){e.preventDefault();this.close();},close(){if(!this.isOpen)return;this.$.dialog.close();Polymer.dom(this.$.outer).classList.remove('open');this.$.outer.focus();},get isOpen(){return this.$.dialog.hasAttribute('open');}});'use strict';tr.exportTo('tr.ui.b',function(){const FaviconsByHue={blue:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALgAAAC4CAYAAABQMybHAAAlrklEQVR4Ae2dCXwdVb3H5265yc3SpEk3ukEXCqVUBLT4Wm19oFKtaN0fKijy9CMguPBarIJsIiA8qsjTh7SllAoFeVBaEARkLV1ooXtL0yRdkqZp9u3uy/v/5uY/OZm75y659+acdnLOnP385zv/+58zZ2YMinTplIAhzsoDceaT2RKUQLwHIMFqh0V2ll0kn4XA6byv9/Vw834kX19e7keRQCzhRyk6bJJYRvD1YTXuhRdeqDj77LPPtNls400mU7HRaCzFFggEVJ/iSqhsicFgKIXUKL6bvB6fz9fj9/u7Kb4bPjaK67Xb7Q0HDhw49IUvfKEd2XUb7WpxHIYvXRgJ8AELkzRso1gmKrwkBfjG7373u5Zly5ZNKS8vn2G1Ws80m83YphPI0wnQUemQFp0IzQR9tdfrxXbI5XId6ujo+PCuu+6qXbNmjYfa9NMmngDoBmt+hIe944M53AUhwqwCvXTp0qJrr732opKSkk8XFhZ+imC+gIAryAZB0QnlJuB3OJ3Ot3p6el5/6KGHttxzzz0O6pse+GEP+3AGnKE2EhgG0tAFt99++4WkoT9tsVgW0DaH4guzAeg4+uD0eDxbaXuDNPzrt9xyy3bS8G4qB8BF6OOoKr+yDDfAB0B91VVXFf72t7+9lLT05QUFBZfQoYWtnA+ux+12v0ra/W+/+tWvXlq5cqWTBjUsYR8OgDPU8KGtjR9++OHHx4wZ8+2ioqKv0X4lbfnsWh0Ox9+bmprWzpgxYxsNFBpd1Op5bcbkM+AMtgr11q1bTz/zzDP/gy4Qv02zGtPzmehIY6MZmmq6UF176NChJ+bMmXOkD3QR9khFczY+HwEXwTbV1NTMI229FCYIXSTm43gTho8uUgMwYUir3zN16tR3qAIfbXkJej4dcIxF1dbkm44ePfqZqqqqpTT7MZf2pYsgAZqN2dTS0nLP5MmTX6EsDDrDHqFU7kTnA+Aa2BMmTDBv2bLliyNHjlxCZsgFuXMYhr6nZL7saGtru/eiiy7aUF9f76UeAfKcBz2XAUffVbgJbAuB/Y3KysoldONl5tDjkrs9oBtL+1tbWwH6UwS6/mZSzg0sVwHXTJG9e/deOGXKlOWksS/MOelncYdJo2+vra396axZs7ZTN0XTJYt7Hdq1XANc1dg0DNOqVatGLl68+DZa/3E1XTwCeOn6JLCly6ncU9+mNLnBZRLOYPAHHI5H2l5/8TdHbl3SRjUx6DkztZgrgKOfDLf5xIkT36moqLiLzJG0rAFJAomsKDp1W51S74IZnSIX8DcrXV3LlK/Oe5xqZPsckGc96LkAOPpowrZ79+5ZNK31BzkzQtKI4qxvV0dJTSLJ592kHKu7QfnPxXupFmhzbFkNeTb/tGsae/bs2Va6wr/lrLPO2izhTgLQZIuaaMp1yvTNyvNbb1HomFB1ZtrAUNYqymztGMNt2rhx44T58+evohs1n0r2+AyX8mnT4KIAvZ63lA82f1/55TX1FJ21tnk2As4zJObq6urP0BTgCmlri2TFDmcEcHQDtnlz4w+Uyz+Hm0Rsm2PuPGtcNpkomtZesGBBYXNz8210d+05CXfWsBLaEQNd5I+e8JyyYettCh0zyoBrpawyWbJFg2twv/jiixPnzZu3mhZFzQ2VqIyJRwIZ0+BiZzyeTcqebVcqS350nKKzxmTJBsDRB3WWZN++fXPpps060tpVouxkODEJDAng6GIg0KI0Hv+mcsXnN9FeVsyyDLWJwnCbadXfomnTpm2UcCcGc1blNhiqlNMmblT+9soi6hdmWKC4hlSJDiXgaBsCsNDKvysnTpz4JIWLaJMupyVgKFLGjHtSefrNK2kYFtpwjIeMs6FqWIOb7kr+Yty4cX+m2+0446XLBwkESHuPrPqz8uymX9BwhhTyoQBchZseQiigdcj30grAO+SDCPlAtW4MeLikdMQdyvqt9yp0rCl1SDR5pgFX4V64cGERvdhmRWlp6XU6scjdfJNAcfF1ysqNK5Q5C2F+ZhzyTF4AqHCPGjXKSjdwHqUHfr+ab8cyW8YzZLMo0QTgcj2jfO/S7ynNzS7KxtOI0UqkJC1TGlyFm3pccPDgwfsk3Ck5drlVidX6VWXFxvvAAG0Z0+SZAJzhtjQ2Ni6ld5D8KLeOjOxtyiRgK/6R8uy7S6m+jF14phtwmEBow3L8+PGr6FnJm1MmLFlRbkqgtOxm5am3rgITtIGNtJrJ6QQcHcdPkYUuKL9MsybLKSydlICijKxcrjz+0pdJFKzJ0wZ5ugBnuM27du2aT7ffV9JUIGCXTkqAJEAsjJ2wQlm1fj7tpPWOZzoAB9yo1/zSSy/NoLdJraMwFsdLJyUgSqBQGX/GOuX+FTMoEpCDmZRr8nQBbqIHgovnzp27mtaWlImjkmEpAU0CYGPmR1crF19cTHH4hU854KmuECcMOmo9derUAyNGjLiawtJlWAJZOQ8eTQb27keUyz7xM8qS8jnyVGpwNk0s+/fv/4qEO9oRlWkDJGArvVpZ89JXKC7lMyupApzhNm/YsGH6GWec8eCAAcgdKYFYEhhz2oPK3X+ZTtlSao+nEnDzxWRL0eNmj0q7O9bRlOkhEoA9ft6cR5WPq/Y4IE+J+ZyKSjS7m56jvK+srEzeqQw5epmNyDkbXBRPT8//Kl++6EaKSok9nqwG10yTHTt2fJpWB0q4xYMlw4lLoJhu5z/y3KepYEpMlWQBV7U3mSXFNN99H71YPfEByRJSAqIEwND4yfcpFyzgqcOkGE2mMGtvy2OPPXY9vZjnTLGfMiwlMGgJWCxnKktv/QmVT3pWZbCAM9zmxx9//IzRo0fj0STppARSJ4HykTcqN//3GVRhUqZKMoCrC6no6Zy7yTSxpW5ksiYpAZKA0WhTPj73dxRKakHWYABn7W3Zs2cPvjH5eXlApATSIoGi4i8oK56/tA9ysAr2EnKDARxlzJdddlkJ3dC5N6HWZGYpgUQlMH7SvbRWpYSKsamSUA2JAs7a2/ynP/3pOvrc9eSEWpOZpQQSlYDZPFn54a/xcDoDnpAWTxRw5DfRJ7DL6HUPP060rzK/lMCgJFA+8sfKZd/CqlRc9yXEbCKZWXtbli1b9gN6EX3loDorC0kJJCoBk6lS+ebVP6BiCU8bJgI48ppxU2fs2LHXJNpHmV9KICkJVFZdo3zsY7j5w6ZKXNXFCzhrb/PDDz/8HbK9x8ZVu8wkJZAqCZjNY5Wf3vkdqo4Bj8sWjxdw5DPRt3KKTjvtNNxhkk5KIPMSqBz1E2Xq7ITekBUP4Ky9LevWrfsGae9JmR+ZbFFKgCRgLpik3HL3NygUty0eD+Cq9h4/fnwBbTdIQUsJDKkERo+9QSkr47ubMfmNlQHaG5v56aef/ndaUDVtSAcnG5cSMFumKXc/fDGYpI35jCiXeADH3KOZ7lp+Sy6HjShHmZApCWA57dgJ3wKTtIFNQB7RxQIc6abLL7+cniEesTBiLTJBSiCTEiguWah8/isjqEkAHpXhaIk4M5BuXrp06ZfoOUtcvUonJTD0EjCaipSvff9L1JGYU4bRAEeaCjh9P+fr0jwZ+uMqe9AnAZgpo0Z/nfYY8IgcR0qA9sZmeuCBBybZbLZ/66taelIC2SEBKzF5zTJMWbMdDl5DXDTAVe29aNGib5D2jpQvpEIZISWQEQkYicm5C0QtnjDg6uwJPY72tYx0WDYiJZCoBMorGXDW4iE1hNPMOBMQb1qzZs0MmvueHlJKRmS1BCZYYZoOA2exTFd+dT/eTsuzKSFaPJwkNMDPO++8+fLiMvdA+Z8JJcqPN+9RGnocoZ0PBELjFF2cbjdYIEykvq4wWehd4APb05dBari4gaWCe/p8AT+uFOdT4j7aoJTB7oAGowFurqqqmicBV5QPmgLKX3b7lVbHANmRLLPVVSjnGT6hzFRa44dHHEqIHhQThXC8+YQiqQ66K9rnvakoD1O9DPiAJvSAo8vYjMXFxWZ6U9VFA3IP052fv+5VGntzBW4+SCYl4KtQ/L3tpCBJ0+WpC/hKLgKrvb29DDj41Q4WIvUOcaZHH310lslkGqlPHI77uQd38CgZTBbSVBVKXk+CGYwjS758/ywwS1sIz/oI1uCmmTNnflKaJ7l/OmuQG3migQ9xnvg0W2gaN/2TfYDzoLQDFw5wVYOT/T1XAq7JKacDKuS2csVg1B/unB6W2nkwaiiumEs7rMEBueZEG5zpN9Gt+QKyv+douWQg5yXAkPvtHYO78MxiCZisJXNsVRML7C3HndRN5li1w/WnNPaNDz744Ll0ZpRm8Zhk1wYhAYacjPJBlM7eIgHFUFryxZvPpR6q/Io9DavBJ0yYcJY0T0Qx5U84CDnNrtjb82dQZHqZysefRQPaRltEDc4JRlr7PS1/Ri9HopeAwWRWjLYKQiF/NLnBWgpmocGZY3XYoomCBOybaPXgNKnBVfnk7R8V8qLyvIAcrBoLiqaCXdoYcvXYMeB8KmPfSIBPUVPln7yWQD/kjEEOD7fABsBVfvtGoTIdYoOPHDnSXFhYODmHhyq7noAEgpCPUPyOTiql3QBMoIbsyGo0F04uInYdbW3RTZRbb711AnXZmh3dlr3IhAQYcpooz0RzaWmDTk1r0YLrwS4GwRaJuoMGmXrjOeecI5fHQiLDzKmQF9ILXFXIGYfc8q2jZ4JdBlyFnE9ZHolx1KhR8gJzmMHNw9Ugz8U7nrijWToyZCZFtMEBu7GoqGgiD1j6w08CKuTWUsXv6s65O56GApVdlWM+cnoNbqB3D+JzEdINYwkw5DlnkxvNYJetEdVEETU4Ioy0RLZEzoEPY7r7hh6EvIQ0eQ/FZP/sCpilPgNwKG0VbgyFdzTqCXC8ZFw6KQEAoxgLS3NoPbkR7GosIyxqcBxSgwQcYpCOJWDAOnIrKUbS5AH9M5GcKUt8OiEZcK1HbIMjQiVfAq7JRgb6JADIDQR5tpuuAaMGuGaisAbXIiTgkutwEujX5L2UnJ02uSEIOHdfZVpqcBaH9GNKIKjJQ6yAmOUylYHsa+6cprBZg3MfpA3OkpB+WAkENXmxEnDbs2+e3KABrvU9RINTih56LbMMSAlAAqomL7BRQFOU2SGYgMouOqV1jGHWIrxer50+8iofV8uOQ5a1vVA1OUEecOPtWdlhkxsUH/2saE5lmufBtVifz4erCOmkBGJKIKjJ8V0ETT/GLJPODAG/X8+uOg+O0087BaHB09kJWXd+SSCoyYuUgIceaB/qeXL/AA2uci3a4JB8QGrw/AIwE6NRNbmlcMht8oBftT40ZY2xsw2OsJogAYcopEtUAqomt5Am9w6dJg8ENPNagzysBs/2W7KJCl/mz4wE8OYsg3loNLnKbNAG1+DGqFmDI1LdpA2eGRjytRX19XAEecDr6kMqcyM1BNTrR41ltCxqcAYc6yOlkxIYtASCmhyP9WZ2doVmUXhtL1hWHWtw3lccDkcb1H22L6zROiwDWSmBoCa39mnyDHSRmPV7nG36lliDs1r3t7e31+kzyX0pgcFIQNPkGbrj6be3gV287Z95Vk0U7MCpkdXV1bXyIjMoEPk3eQmokJsKglOIAD1tm6J4Wo7UMsd9PQ+wBse+CvgzzzwjAe+TjvRSIwGGnB4qS02F4WohE8W58zk94CGzKP6XX3652+VyNdN6lFHh6pFxUgKDkQAgDygWxeDzDKZ47DJeV3PvvtfpVQChJgoKs80C+8Xf09NzRJopEIt0qZQAIFfou0GpXoUIVv0uxxHqq8ov+cxzyDShmsFut9elcmCyLikBloAKuZEm71Jsi/vdKrMi4GqTbIMz8cjgw0yK1OB8SKSfagkMgDwVlZMGDzg6oJR9tIFh5lmzwdEMR/pPnjxZiwjppATSJQHVJg/QRaffm3wT9Gvg624GswPgRsXhNLh//fr1u2nRFYCXTkogbRJQbybCXEl2diXgCzh2bthNFQHwAZAz4BgEgEaijz4C29zZ2VkjzRSIRbp0SiAIOT7MgCnExDeyThS/s7uma+vaZqpANFHUbusBZ8i9ra2tWyXgqozknzRLQIMcF56JOiLc19O6lYrB1hmgvVGVCDj2VQ1Ovq+mpmaLBBwikS4TElAhx7vJE55dIWhb6rZQH6G9WYNrXRYBh/ZmDe5buXLlVj85LacMSAmkWQIa5Im0Q4x2bXkUGpzhZo7VWsIBrp4JGzZsaCc7/KDU4olIW+ZNVgL9kMe2x4P2d+dB+86X8NFP1uARAUffWIPDnvHSdOE2CTjEIl0mJRCEPA57nAj3dzXj468qr+SzDa51V9TgiGTAcTZ4yQ7fLAHXZCUDGZSABnlUm5wgba3dDFZpE00Uraf6Bx5YveNM8C5fvnzbJZdc4iwuLqYH7Yavq+ytURq70rRIKIvEGlmZAYswDjZCRBchLUJ0ULeGqYzaQL8AfEj/PA5nz8u/Zw3O2ntAC+EAR0bVnnn33Xe7Gxsb35gyZcqlxhR9mGj/oU7liWfrlPZOd5jRZGfUbK9bmUnPGIYIeEB3B8i1PyUKBHTo+vPFEYrcfpR6orYfR6NZmiUQ8Cs9XU1vbDiyEysI2f5myLVe6wFHAqSlanDyPTt37nz+9NNPTxngv/3DHqW5lV4tkGPO67ErPi+9pgw/mYAGfjyO8zJo+vL6dH2dmc6vb1/fP31/9Pn1+7HK69P15fXt9eUP+LxKR/OB5yk7flrFOfABNehtcCSKgHuvu+66t2n5bGtk7TGgvpg7uQg3BmW22BSTGa8pIwehx+s4L3wxzOXFOM4j+sjHecSwmEcMi3nEsJhHDIt5ENY75IXjMhxWI+P4E6u8Pp3bYV/fHsWDRb/f1Vq3b9XblBzxAhNFowEOte+hlYWO+vr6f6QKcDSaq06F3FQYdeUEow9fDGfLmMU+ieFI/RPziOFU5Y9UT/T4gOJ2tP/D7e7Bmz+hwcNeYKKOcIAjHiaKZqa8+uqr6+l9KYgf9g6QG/sgxwHXbxAQgyCG9fmGal/skxiO1B8xjxhOVf5I9USLV8j+7mjd/Rz1RzRPwGuIiwQ4zBScFaDas3Tp0r0dHR2HpRYPyo8hD+7Jv5mUABj0eeyHjx58Yh+1y4CDVTAb4qIBzpCjEjfNiW+Qd+775dcPeTRdI9NCf+OSlQl98M3RvAFM0sbmCVhNCHAcSah8TYuvXr16PT2MjAql65OAapPjXXzRnP4iCnk5Llw5ToMvhsPlzYU4cQxiOFLfxTxiuC+/3+/xNB9/cz3tito7rHmCIpE0ONJwRrAd7l61alXjkSNHXpBaHKLpd5hZMfELJ3FA9Buy8oESw/p8vC/mEcOcnmu+OAYxHGkcYh4xTPlx38DtaHnhZP3rjZQEDR5xehBF4eIFXDVT1q5d+whp8YhnS7DK4fdXhdyEd/FJl04J+ANef3PDpkeoDTZPkgIcfR2gxe+7776aY8eO/VNq8dDD2A95sjamLE8/eSTggRsuLj2Otn821D5fQ4lxaW8cpWgaHOnQ1pqZQmHXU0899VePxxPWoEeB4ewYchwadhzmw4V4jhPDnJ6oL9YhhuOtRywjhuMtr88n1iGGOZ8YJ4Y5PZKv+H2BthOb/0pl8F5mEfCoFkUswNEHVICLTdVMufPOOw+QFn9TanGIJtTBHjeSucIHCjkQZsfhSOmcL14/2fqSLa/vZ6z6YqXr68M+1p24nK1vHq3++wHaZfMETEaFG2XjARzaWgOcwq4XX3zxYdLiKC9dGAkw5Pqf2czso0OMkRhGXG5u9N5vpb3p/YdpAKy9AR+YjGlJxAs4a3GcPa4lS5bsOnHixGapxUkaEVwQcnqrasYdw80wowMcl/HOJN0gtLfb1bH5yMHHd1FlDDhr75QAjk6yFsdVKyB3bty48UE5owLRRHYa5JgSY8dhniZDPMeJYU5P1BfrEMOR6hHzIBzLcV8j1aePR31cRgxzPjFODPel+xWvv6N5x4OUhCWoYA8MxqW9KV9cJgryAXBocQbcdeONN+6kd4k/J9eoQDyRnQq5se+Fk3yg2UcxDvcdULUmjotcbeQULhtvffr8XC6Sj5a5TORe9KdwXq5PXz5KOn0WUHH2nnyudt/qnVSMtXfMqcH+xuMHHGVYi6sXm2jwpptuWk4PJrfLNSqiSEPDGuShSTImggTUNSdee/uxA2uXUxaGO27bm6uNxwbnvKzF8fOABp2vvfZa89atW/8oLzhZRJF9zVyJnEWmCBKgb14qPZ01f2xv3o03VsE8AXNx295cVSKAo4yoxVXIFy9e/Aw91rZLXnCySCP7Jpo+NNLnPMQvHXAYfjz/UDuXEcNcVowTw5yeal9sQwxHakfMI4bF/HhiyuPq2LV/293PUB6GO2HtjfoHA7g4o4LGnWvWrLnL6XT6pKkCkUZ3gNxAL4HnA4rcCMfrOG+k8rHS420n3nyJthcrPxgK+D2+5oa37qI+qHyRj4vLhLU3xpAo4CjDgOOMUrX4HXfcse/AgQPr6I20SJcuhgQYcvVijS++pN938RpQHD0n1h378Cms99Zrb7CXkBsM4GiAIVenDGnfccMNNzzU0tLSKE2V+OSvmiuYXZFOkwDmvD2e7saa/X99iCLxOBoAF7W3ljfewGABZ1ucpw2d7733XusTTzxxE33+xCNNlfjED3vcqELON2WGr0+WCS03cXtaTmy6qbutppUkyHAnNO+tl/xgAUc9DLmmxWnacAeB/hDdANK3I/cjSCAIebi3d0QokKfRZHcrvZ01D9XtW72DhqjX3mBtUC5ZwGGqaFqcws5LL7109dGjR9+WN4DiPx7DHXLc0HE5Wt7es/m21WCob4PiTOimTjiJJwM46gPg2PiCE2ee/Wc/+9lvyB5vkvY4SSNO12+uxFkgT7LB7vZ6uptq9678DQ3JThsYggkAppgvCg7OJQs4WkUnMH2CMw6dc9ANoJNPPvnkL8ke90p7nCQSpzPS9CFscryHbzhsEEvA7/a2NLzzy46WXSdpV+WH/KQuLFEvu1QAzrY4mypqJ+lVE9u3bdv2Z9jjEnIWd2wfkBsM+W+T9813093K6j/X7l+9nSQjwp3UhaUo5VQAjvoY8gGmysKFC1fSgqxX3G6ckNLFKwEVcu3rY/k5swK729Hb9Mqed29fSXLRmyawCAZ9YSnKOVWAo06GHDTjQgGdti9atOjXdNH5noScpJGAU00VI74+ln+OXv2gOJ0t7x3cduevaXQqJ+TztGDK4IbkUg24aI+rkNNXIrquuOKKG+kBiYNyURZEHr/LR8j99OFXt6v94KH377/R4WjtImkAcBFuMJQS7Q1Jp0NFoHNiBw0Eube2tnbT/PnzFzz3UtMIA76mJV1cEjAYcIhInLgTkuMOZonH3XW8dvdff9zZur+JhtNLGwMO8zal2hviSgfgqBduAOhki7u6u7u3NHWO+yxNidkk5EEhxfM3CHmfSHN0zQq98Fjxunta6w+v+9GphneO0Wj0cKdUc7Nc0wW4qG608AcffNBrMlvfLx0x5XMGo7lAQs6HIbbfLytNnLELZUkOrO2mF2b2nDz64rX1hzccpG7p4YbmBuApd+kCHB3lI8G+2vnOlr0dBYVV+4tKxl1MswWW/gOX8rHlXYUsq+C8ChaeZv8/vOqYvo5hb2l48+d1+9fiNrwId8rmuyMd7HQCLrYJyDXQ20/tOGUxF+6wlU1aYDQWFPGBEwvIcHgJ9MtKE2f4jFkQq9rcnu72xrp//OTIgccx181wY8477XBDBJkGXAO9o2VPm+JzbioZMXWewVRQ2n/g0C3poklgoKyyc57cTxeUXnfHCVrXfU1D7fr9NJ4e2gA4w530OpNoMuK0TAGO9ljlaJB3tVd3u1yNb5ZVzPy40Wyt7L+Y4u5JP5IE+iFnsUbKmfl4zHN7nG3VdXtWXNvU8GYd9QBgZxxujDyTgKM9OAZc9e1dDY6ejoOvl1fNnm0yFY1TaApR/QhoMK/8G0UCGuQGEmUWKHK83jhA89z0gvoPDu1cfn1b864T1H29WZIRzc1iyzTgA+CmTqj7Lkeru6156xsVoy+cQk+fn44DJyHnQxTd1yBXRRk9bzpTsSrQ7/MoLvvJN/a/d9uSno5jLdQew40bOVghmFG4Md5MA4424UJA97rtvub6f71VPupcq9lSNttgNBLj8oZQUFzR/w6UU+ZVOeD2eV2B3u7ax/a9e/PvXI7OTuqxCDcuKDMON6Q2VICjbYacJ/jpHYte/8mjr35gtVUdLCwaPYfmyunDlFKbQ1ixXBByiDRzTl0RGPBiPXd7S8Pbyw68d+/TdAz5YlK8QzkkcEMSQwk42mfI4Wugt53c3uB0nHyttHz6THo4dywOnjRZIK7ojiHPxOw4lg4EYJI4mnfW7V95ff3h9bupd9DarLlhkohTgZk9+/pElS2AA27eVOjt3fW9p4699kr5qFkmc0HZR6TJ0nfEYngDzZUYmQeZrN6ZhEnSeXj1nk2/vr2nsw5vn4LGZrj1i6cG2VLyxYYacIyAz2zW4hro9HPnO3nstZ2FhZX7Cm1j5tCDAEWkyqU2j3HctV+7FJvjWE+CWRKvt6utpeGtX+7f/vv/6zNJGG7McfPFZNpuv8cY/oDkbAAcHRIhF0FXw21N2084HfWv2UonjaHPhEwJaikJ+oAjqdvRINfFD2ZXfSILF5I+Fz2kUP/akT0rlhyv2bCX6mKNDcD1N3CgqIbc4RzPJof+YOoEJx7eioNPl+FDlHSxqdgQnj77h5+oGPeJXxQUlE3Cg7qZ+EmmdnPWYYYjGRec/nMrbnfnsbaT2+6v2f3wZqoPJghDzVOAvNwVDbLCSqbplJTNNsAxKP5hBeR4OBGfSQDkDHpRYWFFyYzzf/Gd4oqpV5JGt+IZxlRqLGorr1zwmdjEmOMZEp/X4erpqFld/f4Djzud7ZghgabGBrDZ1sYsCa/lTqwhKphOly0min6MLCT42KAV2Kbzeb1Ob9Pxf+32utteLSqZOJ4++jRJmi16Efbv95/8rDsi++pzFX3mCM1kvXPkw7X/Vbd31eskc3H6D9pbhBvHJ7mfiv7upjSUjRpcHCD6xyYLa3PW6DBbVM0+4/yffKq88iPXmq0jJuOdf/J2vyjC/nBQk/fviyHRzva6u462N+96qHrng29RHtbUrLUx9cc3bljpsEISq8yKcLYDzkIC5Aw6bHNAzva5CrnZbC6c/pHrLykbefYVZmv5NAk6iy66PwBsV8fhrrYDj1Xv+uOr9GYyBpt9ntcWbe2s1NriiHMFcPSZtTlAhzZn0AE4ww7fOuP86z45ovLcKyzWkecEL0RN0kYnwYguaGP78MJLetl8277O1j2Pffj+n96mPAAZG8BmHxobYPMdSYCdtVqb+qa5XAKcO40+49qBQYc2Z42uAk77qj919tUfqxh1wZXWosrz6cEKslxQbPhOLwZNFKz4I7D9broL2fp+e/OO1TW7H3mPBMNgi75ojgBqvpCkYG64XAQckkW/sYlmCzQ6Ty2KoBeccc53Z5eP/uiXrIWjFpjNRTaD+no0FM1/2DWo6cIRb3D1eh12l7P5jY5TH6yv27cGt9cBsQg1wtDWvIl2dk5obeq75nIVcB4AQ86gs+nCoLNmV7V8YcnY4ikzvr3ANuKMz1mLqi4k0E3q+7nVu6OoIn+cOv9NUyJ4+ACfBKG3t263d9a9XPvh2jecPSdxg4a1M4BmyBlqnvaD1s4ZcyTc0ct1wHlMetBhi7CNziYM+6qmrzrtwtHjJi/6rK1k/OfoiblpAJ1hz0XNzpoai6AANTafu/uwvafh5cajG//ZcmL7KZIJA8xwiz7SoK1ZY+c02DQO1eUL4OJ4grZH0E6HRmetDsAZetE3T5q6eHr5mPPmWQurzjcXls8i0K20VFcx4iWYeA9JFpoyA4CmJatYI0JQu7zOjr0uZ8v7HU073zlW82w1dR7aGPAC5nA+0llj8z2HnDNFaAxhXb4BzoMMUtlvo0Ojs1bXA69qdEqHby4sLLeOm7p4Vln5tAsshRXnFxSMOJseirbgAhXPjAZvmrDYgn7/jRRuPjV+EGLUxbzRBSKWqdJ7RnChGKBPftAt9AMeZ/v7XR2HdzTWPLvX6eyAycFQA2jeGHBOY23NGhuNcEMUzA/HRyo/RhM6ChF0aHbRVhe1O0POceybiovH28ZNW/SR4pJJ55oLiieZzLZJJottPFY2BoHHWnWAT1Wr0owkUn18JJYoHv9xUQiQNd/roJfnNPi89mNed++x3p5jexoPb9zV29uAu4qAlDUx+ww2fI6Dz0CL9nWkzlD23HZ6qef2aKL3HmNl84VBZ83OQEfyOR98lDWOnjB3dFnFOZOttjGTLIWlk81m20RaMlBpUEw2Ay2QoRPARg1SffQXF7F9vtpFaOEgxbSrhuhDAV57gBZ+BBSf3e9ztXq99uMeZ/dRl73pWFf7vqOn6jfBhmYoRe0rwhsuLOZlu5p9tTv5/Gc4Ac7HEWMWN4ZW9AE6Q83Q8z6fHKKvQq+r10DmjrmoZEKx1Ta6yGItK7aYy7AiUvF4u+weV1evy37K4eip7yWzAmBCi4obwwyfta7oI8xAM8TYF/NwWbHevNXWNPYQNxwBF4Uggo4wg8q+CL0IuAg350Ec18H1oi0xjH3RMXiI4zBrVwZcDyxDy1DzPudnn+tjX2x32IQhfOmCEmBZMJDwGXQxLMYBbqSxz5AjDg4+b7wPH9DBMXz6fUCKOEAs+gwv+0gTw9jHBsd+cG+Y/uUDMUyHH3XYLBsGNJIvQq3PgwbEesQGGUDRR1i/Mez6eHEf9WJfOp0EWPi6aLkbQQIsLwYZ2aLFiekRqhwAJkPK8KJMtLhIdcr4PgnwwZECSU4Cejnq91G7Po7BFVvWx+n3xbwyHIcE/h9VLWRYHWXC/QAAAABJRU5ErkJggg==',green:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALgAAAC4CAYAAABQMybHAAAltklEQVR4Ae2dCXQcxZnHR3NoNDp8SD7kU7bxFXCchBhMYoLNmhCcOBBykGw2gYTkPV6AhGXD2sTZJQcJG3jsgw3hscuCsTEsOAQW1sbY+MAHxpYtHzI+5EOy5UMStnWPZkZzab9/j75WTWt6NKO5Z6r82lVdXV1d9e/ffPq6uro7zyBDIhXIi7DyngjLyWJRKhDpCYiy2pwoztrpxSwCb+d1bayFm9f1Yu3+cj2MAgOJH2bXnNnEGiHWppW8d999d/inPvWp6YWFheNMJlOR0WgswdLT06PElFdM+xbn5eWVQDXK76TI7vP57H6/v5PyOxFjobwuh8Nx4dixYye+9rWvtaK4ZqFVNY/TiGUIoQCfsBCbcjaLNVHgJRUQG3/4wx9ali1bNmXYsGEzrFbrdLPZjGUagTyNAB2ZCLXoh3CJoD/p9XqxnOju7j7R1tZ2/LHHHqtbtWqVh47pp0X8AaAZbPmRzvnAJzPXhRBhVoBeunSp7b777ruuuLj4xoKCghsI5s8TcPnpIBT9oNwE/D6Xy7Xdbrd/8Oyzz+5+/PHHndQ2LfA5D3suA85QGwmMPLLQ+b///e/nkIW+0WKxLKBlLuUXpAPQEbTB5fF4KmnZShb+g0ceeaSKLLyb9gPgIvQRVJVdRXIN8CCo77777oI//vGPt5CV/n5+fv5NdGrhK2dDsLvd7k1k3f/n17/+9frly5e7qFM5CXsuAM5QI4a1Nh4/fvza0aNH/4PNZvs2rZfRks2h2el0/u2TTz55dcaMGXuoo7DoolXPajcmmwFnsBWoKysrJ02fPv3v6QLxH2hUY1o2E63XNxqhOUkXqq+eOHHitblz557pBV2EXW/XjM3PRsBFsE21tbXXk7VeCheELhKzsb9Rw0cXqT1wYciqP37FFVd8SBX4aMlK0LPphKMvirWm2FRfX//lESNGLKXRj3m0LoOOAjQas/Py5cuPV1RUbKQiDDrDrrNX5mRnA+Aq2OPHjzfv3r3766WlpUvIDfl85pyG1LeU3Jd9LS0tT1x33XVrzp8/76UWAfKMBz2TAUfbFbgJbAuBfUdZWdkSuvFyZepxydwW0I2lo83NzQD9rwS69mZSxnUsUwFXXZHDhw/PmTJlytNksedknPpp3GCy6FV1dXX/OGvWrCpqpui6pHGr+zct0wBXLDZ1w/TSSy+V3n777b+j+R8/pYtHAC9DrwIO9xHD5c5XDF5fS0ya0MWo3+nwvrBx47nfLLlvKypj0DNmaDFTAEc7GW5zQ0PDD4YPH/4YuSMJmQMSExVpsPPxhjsMHt/FuLWkp8dwqb3dt2zhnD2vUKXsnwPytAc9EwBHG01YDh06NIuGtf5DjoyQGmHC4XMLwmwd/Caft2fnmXr3A3d8Zf9hqgXWHEtaQ57Of9pViz179mwrXeE/MnPmzF0S7sEDGuueJnPevCuusO76sPq6R2bPHm2l+sy0gKG0NZTp2jCG27R27drx8+fPf4lu1NwQ6wnKlf0TZcFF/bwe//Z9uxw/vvfuj89Tftr65ukIOI+QmE+ePPllGgJ8UfraIloDp5MBOFoB37zxQvdPvr5gP24SsW+OsfO0CenkoqhWe8GCBQWXLl36Hd1de1vCnTas9GtIXp5h5LgJ1re3H7z2dwsWjMTUYlwrpZXLki4WXIV73bp1E66//vqVNClK3mLvh1RkGcmy4GJr3B7/zkOVXXfd86PD5yg/bVyWdAAcbVBGSY4cOTKPbtqsJqs9QhRPpqNTIBWAo4U0l+1yw1nXd29duH8nrabFKEuqXRSG20yz/hZPnTp1rYQ7OpjTqTRNUhwxtsK69t3tcxZTuzDCAsOVUiOaSsBxbAhgoZl/d02YMOF1SttokSGDFSCabeVj819/v3LOXdQNCy04xynjLFUHVuGmu5K/HDNmzHN0ux2/eBmyQoEe84gRluc2V13zS+pOSiFPBeAK3PQQQj7NQ36CZgA+Kh9EyAqqgzpBQ4h5w4aZH6URlidwrmljSix5sgFX4F60aJGNXmzzYklJyf1BqsiVrFOgqNh0/5ubJr24aFEp3M+kQ57MCwAF7pEjR1rpBs4KeuD3W1l3NtOkQ6kaRQnXfZfL/+Y3bqz7Ed3f6KZyPIwYbpe4bEuWBVfgphbn19TUPCnhjsu5y6hKCgqM33pr4+QnwQAtSbPkyQCc4bY0NjYupXeQ3JNRZ0Y2Nm4KFBab7tlSdc1SqjBpF56JBhwuEI5hOXfu3N30rOS/xk0tWVFGKjB0mPlfN1bOuRtM0AI2EuomJxJwNBx/iix0QfkNupJ+mtIySAUMpSPyn16z5fPfICnYkicM8kQBznCbq6ur59Pt9+U0FAjYZZAK4J6+aczE/BffWn/1fJIjoXc8EwE44Ea95vXr18+gt0mtpjQmx8sgFVAVIEgKJkzJX/2fq66aQZmAHMzE3ZInCnATPRBcNG/evJU0t2SI2iuZkAoIChiNeUM+O6d45cLbxxVRNv7Cxx3weFeIHwwaar148eJTQ4cO/SmlZUiyAuk4Dh5Ogs5O3wsLPrfnQSoT9zHyeFpw/FhQn+Xo0aPflHCHO6Vym6hASYnpp29v+dw3wQ4tYChuhjdegDPc5jVr1kybPHnyM2IHZFoqMJAC48Zbn/nzi1dNo3Jx9cfjCbh54cKFRfS42Qrpdw90OuV2rQLwx6/9QvGKhQsVfxyQx8WKx6MS/EgUv5vmGTw5ZMgQeadSe/aSvJ5pPrgoj73D91/zr97zEOXFxR+P1YKrrsm+fftupNmBEm7xbMl01AoUlRjvWb1u9o20Y1xclVgBV6w3uSVFNN79JL3LLuoOyR2kAqICYKhisu3JBQvG8tBhTIzGsjNbb8vLL7/8C3oxz3SxoTItFRisAhaLcfqyP435Oe0f86jKYAFnuM2vvPLK5FGjRuHRJBmkAnFToLTM8tCfnpk5mSqMyVWJBXBcWFro6Zw/0Z+Vwrj1TFYkFSAFwNQX5w/5N0rGNCFrMICz9bZ8/PHH+MbkV+UZkQokQoGiQtPX/rb+M7f0Qg5WwV5UYTCAYx/zrbfeWkw3dJ6I6miysFQgSgXGV9ieWHjrqGLajV2VqGqIFnC23ua//OUv99PnriuiOposLBWIUgGLJa9iya8q8HA6Ax6VFY8WcJQ30Sewh9DrHn4WZVtlcanAoBQYXmr62fe+NwGzUnHdFxWz0RRm621ZtmzZT+hF9GWDaq3cSSoQpQImU17ZnfeO+gntFvWwYTSAo6wZN3XKy8vvjbKNsrhUICYFykZa7r1mwUjc/GFXJaL6IgWcrbf5+eef/wH53uUR1S4LSQXipIDZklf+m99N/AFVx4BH5ItHCjjKmehbObaxY8fiDpMMUoGkK0BW/OezZxdH9YasSABn621ZvXr1HWS9Jya9Z/KAUgFSID8/b+KjT02/g5IR++KRAK5Y73HjxuXT8oBUWiqQSgVGlVseoCnZfHdzQH4HKgDrjcX8xhtv/B1NqJqays7JY0sFLPl5U59bVbEQTNLCfOoKEwngGHs0013L78npsLo6yg1JUgAMjhlb8D0wSQvYBOS6YSDAsd30/e9/n54hHrpItxa5QSqQRAWKh5gWffWbY4bSIQF4WIbDbcQvA9vNS5cuvY2es8TVqwxSgZQrYDQabHffU34bNWTAIcNwgGObAjh9P+c70j1J+XmVDehVACyOLs//Dq0y4Loc621g59301FNPTSwsLPyiVFcqkE4K2ArzvvjPv52GIWv2w0P64uEAV6z34sWL76BfjF65dOqzbEsOKQAm5/9diWjFowZcGT2hx9G+nUO6ya5mkAL0WBsDzla8X+tDWWa+uDStWrVqBo19T+u3l8xIawUsplFp3b54NY7mik/703/MxNtpeTSlnxWHk64NKuCf/exn58uLS6086b8+3Pqg4WDNHw0O5yf9Gkuf9+sX6N3twXmaVWwMkUWv+Q7eLVShHk1mv310Kg9Vrt/h/PStQoN/PlVxhBYYa7AbVCwc4PQxzxHXS8ANhkZ7jaGq8W8Gh6ed9MuM4C2ebrD7Jhp6CIJsDr481/UGw4nnqY8MeFB3tYDjF6BY8KKiIjO9qeq6oNI5urL+1L8bOt2XM673PrPf4OjwZDXk/p6e68BqV1cXAx5kxUP54MgzrVixYpbJZCrNuLOagAZnItyQwWQ2GgppXlKeEec8OwON75V+/YErZlHv2A8P6qieBTddeeWVX5LuSZBWGbnCkDs7PQa/PyO7EL7RZI5HTCj+EhXaTwt7IKpfprXgintCBU3kf8+TgIfXNlO2AnJbicVAt7izLoBR2xDLPOoYW/CgP1eiBWf6TXRrPp/877lZp0YOd4ghhyUPNUKRydJYbaa5IyYU5l8+53BRP5hjxYprf9NYNz7zzDOfpl9GSSZ3Wra9vwIMORm9rArUn5Kbfzzt09QphV+xcyEt+Pjx42dK90SUKXvSDDksedYEwnrYyIKZ1J89tOhacN5gpLnfU7Om87Ij/RRgyLPJiFlsZjALC84cK/1GBgdswLqJZg9OzabOcwdl3KcAIC8oNuMtrn2ZGZpCHyxW0xXU/H4Xmgw49xLrRgJ8Sob2VTY7CgVUyLNgnLwXcIXfXgkUpvv54KWlpeaCgoKKKHSSRTNYAQXyIrPB1eXVzOLIrE5ZrcaK0lKbuaXFCbDZYCsuCfcEmcbf/va34ym2cqaMs18BhjyTZ/3TmKB17ncngV1Y8X6AM/XGq65SPsaZ/WdV9jBIAUBuLSSfnPFgIjIoHj2pCFO7xR6oFpy7YRw5cqS8wAw69bmz0gc5cMiwQE0uKrH0G0kRfXDFQbfZbBMyrGuyuXFUQIGc3p/Q7fSRT65O6YjjERJXVX6hCewqHPNRsILAFjyP3j2Iz0XIkMMKBCA3ZdwQosloBLsqyziFogXHBiNNkS3OhrFRdE6GwSsAyPPJkrvJkmeCHVeYNeUBcPbBlc7ziko9AY6XjMsgFVDmkysXnqAjAwIN54NdlWWkRQuOLuRJwCGDDKyA0ZRnsNrM5JOn/zi5yZzHgHPz1VEUZCjkS8BVbWSiVwGGXCEkjVUxGlXA1b85bMHVDAl4Gp/BFDaNIXe7vGk7uEL+iOheK0zzKAqkkxY8hQBlwqEBeX4BJmilZ2uNRuX6UeGYW8gWnNelD85KyDikAgy5uzv9xslNRvUiU217PwtOW7TQq4VlQioABRTIrTQzNc1MeU9eD9gNacHVPzper9dBH3mVj6tJlsMqwJB7yJKnyzg5vTXAITRaYZrHwdV8n8/Xpa7IhFQgjAKAnOZhp83gSo/foGVXGQfHD1D9EcKCh+mT3CQVCFKAIfe6yZKrFAUVSdqK39cjsqtwLfrgaEiPtOBJOx9ZcyBAbs7H3JUUd8mnWPCgn5l4QalskICn+CRl6OEVyMld8brp9VkpMuU9fj+7KCrkIS14v9fpZqjostnJVYDuJJIlJ6RSYMrBrK9HAVyFG71nC45MZZE+eHKhyLajMeQ+jz/phtzvy4MPrrIMbUULzoDbs0102Z/kKgDITRZj0g253+8Huwy40mm24KoCTqezBeZezglXJZGJQSgAyA0EOSx5MgLcfp+7p0V7LLbgTL2/tbX1tLaQXJcKDEYBtuSD2Xcw+zg6u8EuflHMs+KiYAVByTx58mSdvMgMCCL/j12BpEFO9Laed9Yxx70t72ELjnUF8DfffFMC3quOjOKjAEOeyMEVfOyqevtFLeD9RlH8GzZs6Ozu7r5E81FGxqd7shapAI1mwCen5zz93sT45H5Pz6UTey52ktb9XBTor1jv3o1+u91+RropkEWGeCoAyI0EebyHV8Bqt8t7htoKuEMCjn4AcqWAw+E4jQwZpALxVkCBnG7tK5DDZ4nT4nb5wawIuNJ09sFFC+7DSIq04PE+tbI+VoAhj5dPjiHCbrsXgNNTGMEWXBwHVyFvamqq48bIWCqQCAUAeQ8ZcJoBGHP1+KF0NHvALCw4c6zUG8qC+995551DNOkq9iPH3HRZQTYrgJuJmKQVa6CvOffUfNhwiOoRXRSFXwYcx0AGCvjoI7CX2tvba6WbAllkSKQCsUKuXGB2eWsr37twidopuihKs7WAM+Te5ubmSgl4Ik+trJsVYMgHMz0E/ndXm6eS6qI3E+m7KHwsxYLTiq+2tna3BJxlkXGiFQDceDe5EiMd6UIPzLU0OneD2d4FDKtBz4L7li9fXkmzs4IKq3vJhFQgAQow5NFUTYT696w5DwsuuieK/416QgGu/BLWrFnTSn54jbTi0cgty8aqgAo5rj0HWHB7vtvhqTnyUVMrlWYLDrhDAo62YQOsNvwZLw0X7pGAkxIyJFWBgHsy8CHhf9tb3Pj4q8IrxWBXhRs1iBYc6ww4fg1e8sN3ScAhiwzJVoAhJ1dc/2YnNaq5oWsXRQBcdFHU5oo3epAJwBly79NPP73npptuchUVFRWoe+RgwnXRZmh3YBQqu4OuMQuyiX0a6GQHCuhs1D1GX7VBKVhp7APgtfvSS4dcm1bUsQVn6x105FCAo6Diz3z00UedjY2NW6dMmXKL0ag19kHtiHil9nyj4b2dVYaOLvEVFhHvnpKCXs9XDUa3m44dpF1QW7TiB23UWdHdR+cw8DlDBlCgE/S30A5h9tOpLubsaG/r6JWnJ+gNrtbmrRdO7sYMQva/GXK1nVrAsQGaoCDMvufgwYP/N2nSpLgB/sJb6w0tHWhTZgV3t4teidBNjYbkkEhPem2/uCyjpt1fu127f7LLa4+vbZ+2Pdry2vWB9tdu1+6vPV6gvN/vMzTUHv8/Ku2hBaz2gxs1hTLLqIEB995///07aPpss661QS1RhEyEG93LtxbQKxH4+7gQPdLAZRGLad5fzOMyYoxyXEZMi2XEtFhGTItlxLRYBmltQFkE3ofTSmYE/w20v3Y7H4dj7fECrorP42mu2rZhB23VvcDEnuEAh9n30MxC5/nz59+LF+A4aKaGAOT5wbxpO6M9X9jOedqyqVjntujxo21Tostrjxfheldnx3tuu91JxWHBQ15goqpQgCMfFpytuGfTpk3v0PtSkJ/zAZBbLL2QMyRiDIUYCjEtlkllWmyTmNZrk1hGTMervF49YfL99JbNpvrat6k5onsCXvsFPcDhpuBXofjhS5cuPdzW1nZKWvGAfhaGvJ+cMiPRCoBBj8t16tCOTUfoWAw4WAWz/UKoi0wUQmGGHJW4aUx8TVlZ2YP0DR9sz/kAyBG8HsgjQ7IUAOD2jvY1dDwMa0F8hjsk4HoWHO2FyVet+MqVK9+hh5Hl2YQyvQGQm/PJXQkXcKcCge9YcFrJDPFftOVDVJFWWdH2Z4Dy9PpjT92R/e9QH8EiPAwwGtI9oXxdHxzb8ItgP9z90ksvNZ45c+ZdOf8K0vQFC42sKJAzwNoYRfmkiWltOV4Xy4hp3p5psdgHMa3XD7GMmKbyALKrs/3dMx8faKQkLDgAB6MhrTflRww4fi3uV1999QWy4rq/FlSYi0GB3GLJxa4ntc9+r9d/5tjHL9BB2T2JCXA0PsiKP/nkk7Vnz559X1rx/ueVIQ9z8a+OJMsygYGmaHTAXVdnZ+f7x/bsqO0FfEC4cZbC+eDYDmutuimU7v7rX//63x6PR/dPAnbK1QDITcoQYq/fDSHwp5hjMR3I7b9d70+3Xj7XPdj6Yt1f266B6htou7a+3nW6c9lTf/Lwf9PuuJ0suidhPYqBAEdzUAEcecVN+cMf/nCMrPg2acUhTf9goYtOk5ncFT5RKII0B07rbedykcax1hfr/tp2DlTfQNu19dE6Rk4c9o5th3d+cIxW2T0Je3HJ1UQCOKy1Cjilu9etW/c8WXGuQ8YaBVTINflydXAK+H007+TUyedpb7begA9MDuhJRAo4W3H8erqXLFlS3dDQsEtacVJDJ0jIdYSJMhvW29nVuevAtvXVtCsDztY7LoCjSWzF4dgDctfatWufkSMqkEY/AHIzja5gLjMHTgcm9AfyOQ9lOM3bo43FOsS0Xj1iGaQHCtG2D/XxPmKa2yPmiWne3uP3+Zvqjj9D21y0gD0wGJH1pnIDXmSiDAIAD7rYfOihhw7Su8TflnNUFH10/zPTRafJbFZOMp9ojrETp/mEinm6lYbZEG192vLcDr042vZp69fuH247psR2tDS/XbVl/UHaj613RKMnLFEkLgqXZSuuXGzigA8//PDT9GByK/6MyKCvAEOuX0Ju0SoAprzd3a3VO9Y/TdsY7oh9b64vWsDZF8cBXZs3b75UWVn5Z3nByXLqxwHI5c0gfYWCt8B6Nzde+HPj6dN4VhDuCZiL2Pfm2qIBHPuIVlyB/Pbbb3+THmurlhecLKl+DH9cHULkYuyfI45kwX68j5jmfcU8Mc3b4x2LxxDTescRy4hpoTwezXN1dVVvfeuVN6kIwx219Ub1gwGcrbhysYkGrFq16jGXy+WTrgokDR8UyE00iZNPKIojHWngsnr7D7Q90uNEWi7a4w1QHgz5vF5f3ZEDj1ETADdfXEZtvdGFaAHHPgw4flGKFX/00UePHDt2bDW9kRbbZRhAAYYcWMslWAMDPcxgb768mm7qYL631nqDvajCYADHARhytuLOBx544NnLly83SlclMv0BuZFGV2ToU6CH4HY7nI37Nr/3LOXicTSt9e4rHGFqsICzL66Oi+/du7f5tddee5g+f+KRrkpk6pvplr4CObsbORwDKBpy9pyuqX74YkN9M60y3FGNe2uVHyzgqIchV604DRvuI9CfpRtA2uPIdR0FFMjlU1L0pQcvjZo0PHvggw37SCqt9QZrgwqxAg5XRbXilHbdcsstK+vr63fIG0CRnw+GPFf9cbpbaejqaNuxZfXylWCod+G7lmAsJYDjDOLgWPiCE788x4MPPvgb8sc/kf44qRFhCECeez45/O5up/OTqo3v/oakwuvOwBBcADDFfFFycCEWC85HRCMwfIJfHBrnpBtATa+//vqvyB/3Sn+cFIkw4Ja+URxCzHKfHGaZ/tJ76SmdX9FrIJpoVeGHYrDEw4KUHHyIB+BoJxrDrorSSHrVRNWePXuegz8uIY/8BCmQG7P/zQVgAn735aYLz+3fsq6KFBLhjunCUlQ7HoCjPoY8yFVZtGjRcpqQtdGtvLhSPKxMh1MgYMkBefZ65TRJ0NDZ1rpxy2vLl1NHta4JDCaYijnEC3A0hCHnURU02rF48eJ/oYvOvRLy6M6ViVwVoymepye64yeytI8sd1dH+94tb6z4FzDSu/CwYNzgRh/iqSAAF/1xNNhBX4nouPPOOx+iByRq5KQsSB55YMizyRXHiEm3vbNm99o3HnJ2dHSQGgBchBsMxcV6Q+lEOHtonNjAPILcW1dXt3P+/PkLPth/eGgePqclQ0QK4L3synvBs2BKMmYIuhz2c/s2rf1ZY33tJyRAFy0MONzbuFpvCJwIwFEvQhDo5It3d3Z27naYCm6mGXWFPNE9UFT+H04B/vhAgPHM9Mv9fvpglNPZfGjnpntOHzl0lvqrhTuulpv1TBTgogVX0wcOHOiix7j2Dx899is0HJYvIefTMHCc1/uFjUwckcL9EHphpv34gY/uq9nzUU0IuGG5AXjcQ6IAR0MZbI6VxjfV17UVlQw5OqR0xEKah2GRkEd+TlXIIW2GGHK86tjtcjnqjx74pwNb38dteNFyx228W0/FRAIuHhOQq6BfqD1+0WIp2Dds1KgFNCRmkz65KFX4tAp5Bvjk8LndDkfriQN7fn5g6waMdTPcGPNOONxQMtmAq6DTnasWn8e1s7R8wvVkyEv4xKFRMoRXQDUIiiGnz16n4b8eGud2d9kbqnd+cC+9bu0o9chOCwBnuHEzJyF+N9WrhmQBjgOyBVchv9xwobOro3XbqPGTrjVZLGV8MaW2TiZ0FQhATlKyqrolk78B49z0HsGT+zatua/uyMHT1AKAnXS40fNkAo7jITDgStx++aKz+cLZD8onTZ1NryEeA59c+uUBoQb6X4UcBdPAJ8dwJt5CRTMDD+xY88YvGs+caqCWad2SpFhu1i7ZgAfBTY1Q1umdz+7zp45uHXfFjCn0AstJeUYJOZ+ggWLVXUmxKcesQHqWkm6/t2zd+saKJW0Xmy5T2xlu3MjBDMGkwg3tkg04jonQD3S60vbVVh/cPmbyFGu+rXA2+eRkyGGWZBhIAdYpYMST75H30Bg3fcqlp62p4eWNry7/N3rVWju1WYQbF5RJhxu6pQpwHJsh5wsN+nit13+quupA4ZChNSVDh881mkw0wiKtOcQaKEAnCJrMoMwIpJESj6Orlaa8Ltv2v6++QeeQLybFO5QpgRtapBJwHJ8hR6yCfuFUzQX6U7d5RPn4K8kvL5cuC6QaOKiQJ8EfJ2/bgItJR3vbwb1b1v3iaOX2Q9RCWG223HBJxKHAZP/+FMHSBXDAzYsCPV18dp06eGBjecVkk7Ww6DPSZVHO14D/sbsyYMEYCuDOpNfj7mlpOL9yw6oXf996sQFvn4LFZri1k6diOFpsu6YacLSef9lsxVXQ6c+d79ShqoN05/NI0TByWYxwWWjAQPrmYc96nz7xNeWBhxRofNvpbDl7rPpX2/73f97qdUkYboxx88Vkwm6/h+28ZmM6AI4miZCLoCvp86eON9ibWzYPHVk+mlyWKXBZMC7WdyI1vZKrvdqwrLEJArAxSoJvgna0XNpctXntkqOVHx6mWtliA3DtDRwYqpQHkJJOAe3BXFr88PCmSist+OKqjZZCpK+55bYvVEy78pcFRcUT8eRL3zAZbZWhnwIAM5bAw3/dXfaz9SeO/vve99fsovrggjDUPATI011xwPj8smJpeO++6QY4mhUwzwHI8Zg5vrQKyBl0W0FJSfENt/39D0pHj73LYrVayXWR1pwE0guBGYjRMaeOkNBDtc1NDSs/XLP6FVdnJ0ZIYKmxAGz2tTFKwnO5ozsQ7ZjIkC4uiraPLBJiLLAK7NP5vG63t/bQvkMOR8emoWWjx9Fr0CZKt0UrYd96nyvHtkM/xhwudkfsra0fHtz6/j/v2/zuB6S5OPwH6y3CjfMT25+KvubGNZWOFlzsINrHLgtbc7bocFsUyz7vq9+6oXzK9PsKCgsraE6L4rb0nVSxutxOByx5aA3Yz/aRn+1yOOobT598dte6N7dTabbUbLUx9Mc3btjosEEKXXkKc9MdcJYGkDPo8M0BOfvnCuRms7lg7uJv31Q+ruJOa1HxVLzcEv65BJ0lDB0z2LiAJD/7VNOF+pcr1/5tE72uhMHmmMe1RV87La222NNMARxtZmsO0GHNGXQAzrAjtn5x0Te/VD556p0FxSVX4Y1RmIorQSdlhKCAjfFsL1lse+eRptOnXv7ovbd2UBGAjAVgcwyLDbD5jiTATlurTW1TQyYBzo1Gm3HtwKDDmrNFVwCndSW+5uavXzNu8oy7CocMuRpfVgi8hiF3hxcDLgpm/GFilMfg6OjYf+H08ZU0MrKXNGOwxVh0RwA1X0hSMjNCJgIOZdFuLKLbAovOQ4si6PlXz7959tipM28rKhm2wGzNL8TrGHLlopShxoQo3Fr3drsdXZ1tWxtO1byzf9v7uL0OiEWokYa15kX0szPCalPb1ZCpgHMHGHIGnV0XBp0tu2Lli4eNKPrc/C8vKC0v/0phybA5NI5uogldivuSbePpGAkB3JifjU+CODrbqlqamjYc2LZxq73tMm7QsHUG0Aw5Q83DfrDaGeOOMBRinOmAc1+0oPONInZfxFix9BOmXjVq+py5Nw8rG/kVmp47lV+XFvDVM8+NUS11H9R0S91xqq350oYTVZXvnzt15CKJxQAz3GKMbbDWbLEzGmwRDE5nQ8ygIwbksOhs1QE54NbG5qu+cMO0cZOmXW8bMvTqgsLiWQS7FW95hc+ersAHA+1XXmRJlrqbXqxz2NnRvv/CmZMfHtm1/ST1F9YY8ALmUDG2s8WGC5IVYFM/lJAtFpz7wzH6xbADdF4AuBZ4xaJTvrKtoLjYOuvaL80qGzPx8wVDSq622Yo/ZTSbLLhbqjwzqsxPp9JKCMiXqBGaAMQ4UMD1xU0Y8jsMmM2HJ9ZpLprH6bQfc3V07m9uPLvv8J4dh112O1wOhhpA88KA8za21myxldqpfFaFbAWcT5IIOvx00VcXrTtDznkcm4aWlRXOuGbeZ4aXjfm0xVYwMT/fOtFsLRhnwsMYyvCjUQG/76KVD62NtVIHoNWWUiAmoHFRCJAVX5pi+oKdk+zzBbe7+6zH6Trb2tz48fG9O6vbm5txVxGQsiXmmMFGzHmIGWjRvw7dGCqc6UGreqb3J1z70VcAzjFbddGVYbC1sVhW+aFUzPzMqNETJ1YUDyubaLUVVeRbrRNMFnOZyWguzAvAj9fToZ6AmwPLjxUKCk1EMltoir30OJOjhyD2+b0On8fb7O7uPtft7Kq3tzWf/eTs2fr6mmr40AylaH1FeEOlxbLsfnCstCeb/2PNs7mP2r6hz+ICeNmycwwwGWqGnde5jBgjjUWsN4/cHfPQ0lFF9PidzVpUWFRgK8KMSIPL2eXo7qLRuvZWZ3vLxS5yKwAmuwgcM8yI2eqKMdIMNEOMdbEM78t1ckzFciPkIuDimQ0CkjYwqByL8IuAY7u4jcujPqS5XkoGpbEuBhE4TrN1ZcC1wDK0DDWvc3mOuT6OxePmTDrXARdPNGvBcCLWgsvrDDEgRzmOOT9UXTgW5wM6BIZPuw5IkQeIxZjh5RjbxDTWsSBwHFjL0f9Z8BztfthuszaIwy0i1NpyOIBYj3hABlCMkdYuDLs2X1xHvViXQaMAi6/Jlqs6CrBeDDKKhcsTt+tUGQQmQ8rwYp9weXp1yvxeBfjkSEFiU0Cro3YdtWvzGFzxyNo87bpYVqYjUOD/AZrbm7Ts1rpFAAAAAElFTkSuQmCC',red:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALgAAAC4CAYAAABQMybHAAAk/0lEQVR4Ae2dCZxUxZ3Hq8/pnhkGmOEQuQS5VCTxWHEDBlyNkciakMMkxujGuOvHO24IKCae0UQlKwmyroocoqtozGpA4oFiVAQU5IaRcchwDsPczNF39/5/b+bfVL/p7ume6bur+DyqXt31r2//5//q1XvPIJRLpgQMMVYeiDGfyhanBGKdgDirzYvsLLtIPguB0/lc7+vh5vNIvr68Oo8ige6EH6Vo3iSxjODrw1rcm2++2f+MM84YV1hYONRkMhUZjcY+OAKBgOZTXDGVLTYYDH0gNYpvIa/V5/O1+v3+FopvgY+D4tra29uP7N27d98VV1zRiOy6g06DcRyGr1wYCfCEhUnK2yiWiQYvSQG+8ac//all3rx5o/v16ze+oKBgnNlsxjGWQB5LgA5MhrToh1BL0Fd4vV4c+1wu176mpqYvHnnkkf0rVqzwUJt+OuQfALrBmh/hvHc8mfkuCBlmDei5c+fab7nllguLi4svttlsXyeYzyPgrJkgKPpBuQn4LU6n88PW1tZ1ixYt2vjoo486qG964PMe9nwGnKE2EhgG0tDWBx988HzS0BdbLJbpdEymeFsmAB1DH5wej2cTHR+Qhl937733biYN76ZyAFyGPoaqcitLvgEeAvX1119ve/jhhy8nLX211Wq9lKYWtnIuuFa3272WtPv/3nPPPW8tWbLESYPKS9jzAXCGGj60tfGLL764YPDgwT+x2+3fp/MyOnLZ1Tscjj/X1NS8OH78+E9poNDoslbPaTMmlwFnsDWoN23adNq4ceN+TBeIP6FVjbG5THSksdEKTQVdqL64b9++lyZPnlzVCboMe6SiWRufi4DLYJsqKyunkraeCxOELhJzcbxxw0cXqQGYMKTVHz399NM/pgp8dOQk6Lk04RiLpq3JNx04cOAbAwYMmEurH1PoXLkIEqDVmPV1dXWPjhw58l3KwqAz7BFKZU90LgAeBHvYsGHmjRs3/mtpaekcMkPOy55pSH9PyXzZ0tDQ8NiFF1646vDhw17qESDPetCzGXD0XYObwLYQ2FeVlZXNoRsvZ6Yfl+ztAd1Y2lNfXw/QXyHQ9TeTsm5g2Qp40BTZtWvX+aNHj15AGvv8rJN+BneYNPrm/fv3/2LixImbqZuy6ZLBve7atWwDXNPYNAzT0qVLS2fNmvUA7f+4gS4eAbxynRIwHN8ozDseFQZHTW9l4m/3BBa/8nnDfT97vKqBKmPQs2ZpMVsARz8ZbvPRo0ev6d+//yNkjiRlD0hvqUh3ecsrpwtD2+GEdcMfELUNbWLewNniBaqU7XNAnvGgZwPg6KMJx44dOybSstYf1coISSOKsy4tiJLa8ySPX6wvrxN3TLpX7KJaoM1xZDTkmfynPaixJ02aVEBX+PdOmDBhg4K754D2tqTFKKacPVhsOPEnce+kSQK/IjMdYChjFWWmdozhNq1evXrYtGnTltKNmq/3doLypXyyNLgsP49XfPhOpfjZzCcEbKGMtc0zEXBeITFXVFR8g5YAn1O2toxW9+FUAI5ewDY/UC9+PvrXAjeJ2DbH2nnGuEwyUYJae/r06bba2toH6O7a6wrujGGlS0eMBjFw1ADxetMT4oHpZ2lbi3GtlFEmS6Zo8CDca9asGT516tTltClK3WLvglRsEanS4HJvXF6x/v0vxHXfWigOUXzGmCyZADj6oK2S7N69ewrdtFlJWnuALDwVjk8C6QAcPSSTpa6iTvxwwm/EejrNiFWWdJsoDLeZdv3NHDNmzGoFd3wwZ1JuMlkGjBsoVlf9TsykfmGFBYorrUo0nYCjbQjAQjv/rhs+fPjLFLbToVwWS4Boto/sL14++ri4joZhoQNznDbO0tVwEG66K/nLIUOGPEW32/GLVy43JGAeUiKeqvsv8UsaTlohTwfgGtz0EIKV9iE/RjsAH1IPIuQG1SGjCAhDWaF4qHmBeGzwYIG3EaRFk6cacA3uGTNm2OnFNs/16dPn1hChqJOck0CJTdxaeY94bsZkzfxMOeSpvADQ4B44cGAB3cBZRg/8fi/nZjNDBpSuVZRow3d4xGsjHxT/VlsrXJSPlxGjFUlIWqo0uAY39dhaXl4+X8GdkLnLqkrsFvE90uTzwQAdKdPkqQCc4bZUV1fPpXeQ3JhVM6M6mzAJ9LGJG+v/IOZShSm78Ew24DCB0Ibl0KFD19Ozkr9JmLRURVkpgdIi8Zvqx8X1YIIOsJFUMzmZgKPj+FNkoQvK79CqyQIKK6ckIE4pEQsqHxbfIVGwJk8a5MkCnOE2b9++fRrdfl9CS4GAXTklATwiYRpVJp7bfb+YRuJI6h3PZAAOuFGv+a233hpPb5NaSeHkPGJCFSuXnRIgSGwTBomVb/2nGE8jAORgJuGaPFmAm+iB4KIpU6Ysp70lJdk5BarXyZaA0ShKLh4tls+6QBRRW/gLn3DAE10hfjDoaMHx48ef6Nu37w0UVi7FEsjEdfBoImh2iMX97hR3Up6Er5EnUoPjx4L6LHv27PmugjvalKo0WQJ97eKGLx8U3wU7dIChhCneRAHOcJtXrVo1dtSoUQvlAaiwkkB3EqAngxauuk2MpXwJtccTCbj5kksuKaLHzZYpu7u76VTpegnAHr9svFh2yQTNHgfkCdHiiagEPxLN7qbnKOeXlJSoO5X62UvxebbZ4LJ4yB5/muzx2RSXEHu8txo8aJps2bLlYtodqOCWZ0uF45YA7T68cfu94mIqmBBTpbeAa9qbzJIiWu+eTy9Wj3tAqoCSgCwBIETr4/OnjwsuHfaK0d4UZu1tef7552+nF/OMkzuqwkoCPZWA1SzGvXS9uI3K93pVpaeAM9zmF154YdSgQYPwaJJySgIJk8DgvmL2C/8hRlGFvTJVegM4Liwt9HTO78k0KUzYyFRFSgIkATJVCq88S/yOgr3akNUTwFl7W3bu3IlvTH5LzYiSQDIk0KdAXEEbsi7vhBysgr24XE8ARxnzlVdeWUw3dB6LqzWVWUkgTgmMHSgeu3Ky9oFeNlXiqiFewFl7m5988slb6XPXI+NqTWVWEohTAhaTGPnMLIGH0xnwuLR4vIAjv4k+gV1Cr3u4Kc6+quxKAj2SwIA+4qbrpwjsSsV1X1zMxpOZtbdl3rx5P6cX0Zf1qLeqkJJAnBIwmUTZ/TPFz6lY3MuG8QCOvGbc1DnllFNujrOPKruSQK8kQG/Kuple0Yx942yqxFRfrICz9jY/88wz15DtfUpMtatMSgIJkoDZJE5Z9mNxDVXHgMdki8cKOPKZ6Fs59lNPPRV3mJRTEki5BIb0FbdNOj2+N2TFAjhrb8vKlSuvIu09IuUjUw0qCZAErBYx4i/XiasoGLMtHgvgmvYeOnSolY47lKSVBNIpgWH9xR0lJcG7m93y210GaG8c5ldfffVfaEPVmHQOTrWtJEAbsca8f7O4BEzSwXxGFEwsgGPt0Ux3LX+ktsNGlKNKSJEEsJ121CDxIzBJB9gE5BFdd4Aj3XT11VfTM8R9Z0SsRSUoCaRQAn0LxIyrvyb6UpMAPCrD0RLxy0C6ee7cud+m5yzV50VIGMqlXwL0/Kb9nsvEt6kn3S4ZRgMcaRrg9P2cHyjzJP0Tq3rQIQGYKSP6iR/QGQMekeNICdDeOExPPPHEiMLCwq91VK3+VxLIDAkUWcXXnrhaYMma7XDw2sVFA1zT3jNnzryKtHekfF0qVBFKAqmQABFpnDUxRIvHDbi2ekKPo30/FR1WbSgJxCuBwcVBwFmLd6kinGbGLwHxphUrVoynte+xXUqpiIyWQKBoWEb3L1GdozXxsS/9u/Z2Wl5N6aLFYaTrXRDwr371q9PUxaVePJl/3nzef4uaN28S7hNHunQ2EOgSRa/r1rkuEXild1enr6unecJVHktd9OlwaOJp1LPddEApg92QotEANw8YMGCqApwktmen8K9cIURTI8kv810BdXGI72JR73LR9+ND5jvzOx9nD80u11QhVj1DxRjwkBr0gOMXoGnwoqIiM72p6sKQ3Hl64nv0fhGoPZ5Vo8ff7P5+v2jw+Eil5S7kfQKBC8FqW1sbAx6ixRGpd4gzLVu2bKLJZCrVJ+bjebbBzXNkoTsipfRQo0HTWRybWz7BWvqHkYMn0qjYDg8ZoB5w1uCmM8888yJlnoTIKitPGHIj3R3hyc0lHwCPLbRdRB4A56EF5yoc4Igzkf09RQEelFNWBwB5f3okJhfnE2MqNZumgFk6wC4gDzoZcKbfRLfmrWR/Tw7mUoGsl0Ao5DzVueEXmUyThxcW8heUeVDanMmAIwLnxoULF55Nv4w+Wg71X85IgCE3AoEccjScPr8ZderZNCSNX3lo8ioKk28aNmzYhFz8cyYPPF/DHZAbRKPXmzNrK6B6qM0ygbxP6WCOtaUjWYNzgpH2fo/JVwDyYdxmUuH9zWZN3eXKePuYjGAWPDPH2tD0GhwZTLR7cIzS4Jp8cvY/QN6PIG/KAU0OVouMxtPBLh0MuTZ3rMFBPRzOjQT4aO1M/ZfTEmDIc8Emt5s0wDV+OydNY5oBR5ym2ktLS802m21kTs+sGlxQAoC8r4nMFZp9DQAGIct8m9EwstRuh0XCw9DGqAfceP/992MrGrYzKJcnEjgJOdjIUhcQBbcPHQx2wXRwIGyDM/XGs846S22PzdI57k23AXkJmbAnfNm5dwUAn1mkbe3+ohNwRAVYgwcBHzhwoLrA7A0pWVxWg5xe5Wo8qQCzZjQAuNRs7rKSwhocAwHsRrvdPhwnyuWnBAB5H9LkLZomzy4ZFJmNYFfjmHuu1+AGevdgMScqPz8loEGuafLsGr/ZYAC7bI3A1x6751EgwkhbZIvVGjiLJH99QF5Mmrw1SzQ5mKVFcAAOpa3BjdnjkyD1BDheMq6ckoDQNDntQsQSYjY4ghzsBllGWLbBMQaDAhxiUI4lYCLNWEzmiqbJM/zBIKvByIBz9zUNzica+QpwFofyWQIMObGe0c4kAgx4sKeswYMRCvCMnsO0dY4hb/P5M/YZT7NJ0+AsI41pXkVBJCKUicLiUX4XCQDyIhNWyYP6sEuedEZE0+DcLwU4S0L5YSXAkLdrmjxslrRFGmOxwal3bLakraOq4cyWACAv1DR5ZvWTVlHArmaJcM/YRAn+zfF6ve2cqHwlgUgSYMi7rDNTASYs1b7PH5DZ1Zjm/gXH4fP52oInKqAkEEUCgJz2YWeMRU6Xv3p2NZWO1c3gCqfS4FFmVCV1kQBD7qS3aKX7LXE+v1/W4BrXbKJwxwNKg7MolB+rBAC5jd69Ql5anS8goMGDyhqdkS8otQQFeFrnKGsb1zQ5Qa5p8jSNwm8ImihByMNq8EC6/9akSUCq2d5JAK+H0zR576rpUWkwSyuXETW4Zq9QzQFlg/dIvqpQpwQYche9vDvVb7X1BgRs8CDL6JKswbUEAry1s6/KUxLokQQAeQFtQUz1HU96FzrYZcC1vss2uBbhcDgaoO7VnvAeza0q1CmBDsiFcPlTIxJQ7aTXoetbYw3O1PsbGxv/oc+kzpUEeiKBk5q8J6XjL9Pk9YBd/KSYZ81EwQmcFllRUbFfXWR2CET933sJAHKrZq4k9w4nelrldOwnLwg3wqzBka4lvPbaawpwSEO5hEkgCHkS18kB72v1zXrAg+vgTL3/7bffbnG5XLVms3lgwkaoKsp7CQByC0nBo+nRxIvD7ffXrjve1EI1dzFR0FoQcGRobW2tUmYKxKJcIiWgQU6gJ1qRg9U2X6CK+gq4wwKOcQByLUN7e/s/EKGckkCiJQDI6fUOCd9x2O7zgVkZcK3rbIPLGtyHlRSlwRM9tao+loAMOcf1xge8TT4vAPfREaLB5XXwIOTHjh3b35sGVVklge4kAMhhqngTsC0E9dR6fGA2BG70IZwG97/xxhs7aNMVgFdOSSBpEsDNxA5zpXdWuY/MjVW1zTuoowA8BHIGHIMA0Ej00Udga5ubmyuVmQKxKJdMCQByE/ENfd6Tf6C2xR+ofPFITS31UzZRtG7rAWfIvfX19ZsU4MmcWlU3SyAIeQ8UOYCt93g3keelI0R7o34ZcJxrGpx8X2Vl5UYFOESiXCokAMgBI3lxHTDkqxyujVQU2ps1eLDLMuD4MbAG9y1ZsmSTn1wwpwooCSRZAgx5PM3Qg3L+JTX10OAMN3OsVRMOcO2XsGrVqkayw8uVFo9H3CpvbyXAkMNa6e7AQ6DNXl/5W8fqGyk7a/CIgKNvrMFhz3hpufBTBTjEolwqJQDIAXd3DrDWuj34+KvGK/lsgweLyhockQw4fg1essM3KMCDslKBFEqAIY+mxdGdynbPBvIAuGyiIElz8o0eRLB6xy/Bu2DBgk8vvfRSZ1FRkU3Lnaf/VRaVCM/xmpwffSRlBijCuUjxyBsxLUJCpMfbkB39AvD6/jn8fufjh46wBmftHdJCOMCRUbNnPvnkk5bq6uoPRo8efbmRnphOhGvbWiGO/c9fhaeuORHVpaQOt+8rwlmCb7uHyC6k7UgpUctEKBStTEijnSf6iZfzRGhCyxJvO3K96Q7T42mi2nnig21N5dhByPY3Qx7snh5wJEAmmgYn37Nt27a/nnbaaQkDfP+dTwp3dT3aySrn9HtEu9+r2YYQUCw2IgbIeRk0lOO4cOmIk12q88ttI8x9jdR/fX79eXfl9en68pHG7w34xW5nzV8pv4cOeQ08pIpwahltMuDeW2+99SPaPlsfTUuE1NjNSTbCjSEVGS2i0NihD2KFG+U4L3w5jDQ4OY7zyL6cRw7LeeSwnEcOy3nksJwHYb1DXjguw2EtMob/uiuvT+d22Ne3h3iw6Az46he37PyITiNeYKJsNMCh9j20s9Bx+PDhvyUKcDSarQ6Q2wnyaNf4nMa3nTFWjsuEcXNfYu1fsvP3RCbQwLU+598a3W4HBaHBw15gou5wgCMeGpy1uGft2rVv0OskEJ/3DpDbjCYNWoZE9iEghkIOy3nSGZb7JIcj9UnOI4cTlT9SPdHiAeZ2Z93r5MnmCaK7uEiA40eCXwWo9sydO3dXU1PTl0qLd8iPIe84U/+nUgJgsC3g+XJJ8+7d1C4DDlbBbBcX7iITmZCZIUclbloTX1VWVnYnfcMH6XnvADmcKwDZKpcqCUBN13jbVpHnpoPNE+a1SzciaXBkRF1BLb58+fI36GFkVKhcpwQ0Td7lS4xKPMmUgFv4PG+3HXmD2pC1d1jzBP2IBjh+FSgIM8W9dOnS6qqqqjfV/iuShuSwsmJTkEsSSV4Qa9+1Pseb77ZWVVMr0OBgE4yC1bAuVsA1M+XFF19cTFo84q8lbAt5EKkgT80kuwMB/7q2I4upNTZPegU4eh2ixefPn1958ODBd5QW7zqhDHm0q3+V1nMJkPIW9f72d149UVHZCXi3cGOWomlwpENbB80UCrteeeWVZz0eT8Q/CSiUr64DciwhnnQcjnbjArk5PV6fy3KL+va6q6+35fX1d1dfd+n6+vjcL/yBjx3Vz1J5Fx2yeRLVougOcPQHFeBiUzNTfvvb3+4lLf53pcUhmq4ON4IKDB2QY3Lg2JfDPHFyHMLxOq67p/X1try+v93V1126vj6cd9jezr+vaCrfS6dsnoDJqHCjbCyAQ1sHAaewa82aNc+QFkd55cJIQA85w5cKH91hiORwKtpOVhs+4nij89gzNB7W3oAPTHZrScQKOGtx/Hpcc+bM2X706NENSouTNCI4QG4lTZ5qx3AzbGif41Ldl0S0B+1d73dtWNy4ezvVx4Cz9k4I4Ogna3EY9oDcuXr16oVqRQWiiexOavKTiOEyC44vtzisRXbGcxznicfnsrHWp8/P5SL5+v531zd9/fry3aV7aOVkk+P4QsrnpAPsgcGYtDfli8lEQT4ADi3OgLtmz569jd4l/rraowLxRHY2TZPjY6kd/5CTJ1kOR0qPXHP4FK471vr0+blcJF/uc/gehMbq69eXj5buoy2xR31trz/duGMblWPtHdPqCfciFhOF87IW1y420eBdd921gB5MblR7VFhE4X2GPHyqig0ngY49J97GxU27FlA6wx2z7c11xgs42+Jo0Pnee+/Vbtq06U/qgpPFGdkH5FhdUS42CeD5qb2exj997qzFG6tgnoC5mG1vbiUewFFG1uIa5LNmzXqNHmvbri44WaSR/QLaZstLiJyLrXP4sRwox2XkMJeV4+Qwpyfal9uQw5HakfPIYTk/tHej37X9vuMbX6M8DHfc2hv19wRw1uLaxSY6sGLFikecTifegYg6lYsiAUCO1RWeUGRFOFbHeSOV7y491nZizRdve93lB0Nu+qD8O22HH6E+AG6+uIxbe2MM8QKOMgw4flGaFn/ooYd27927dyW9kRbpynUjgSDkeP+HOkJkEKBfwCF/68oXmvdgv7dee4O9uFxPAEcDDDlrcccdd9yxqK6urlqZKrHJH5BbeqRfYqs/G3NhzftEwF39ZNPORdR/PI6m195xD6ungLMtzsuGzs8++6z+pZdeuos+f0JLl8pUiWUmGHL82c73A69hcwm/5/3WQ3eVOxrw2gWGO651b73cewo46mHIg1qclg23EOiL6AaQvh11HkECgNysNDltdPKLfe6GRU837d5CotJr7x5rzN4CDlMlqMUp7Lz88suXHzhw4CN1AygC0WGi8x1y3NCp8To++lXN+uVgqPPgu5ZgLC2AY6rQOA6+4MQvr/3OO++8j+zxGmWPkzRidJq5YuiNvomxoQzLBru72e+pWdS46z7qWjsdYAgmAJhivijYM5cIiaITWD7BLw6dc9ANoGMvv/zy3WSP0zeGevzjo6ryy2H50EKQR7pNnmvx0MvugN/7vuPw3Vucx47RbGv8kA+WeFmwVxAkAnAQjM6wqaJ1kl41sfnTTz99Cva4gjz2OQLk+DBTrjswAbt7r6fhqacbdm6m8cpw9+rCUpZdIgBHfQx5iKkyY8aMJbQh6123Gz9I5WKVwElNnrurK16C+4i39d05NeuXkFz0pgkUZkL+9CcKcMwdQw6acaGATrfPnDnz13TR+ZmCnKQRh4OpYs5Rm9yjXVS2f3ZX3YZfk0g0TsjnZcGEwQ1xJxpw2R7XIKevRJy49tprZ9MDEuVqUxZEHrtjyHNpjRwrJvU+R/nDjZtn13scJ0gaAFyGGwwlRHtD0snY3obOyR00EOTe/fv3r582bdr0pmXv9MVXbpWLTQImklWHQGWRxlY203IB7kaf69CC5p037XDU4osCbXQw4DBvE6q9Mf5kAI564UJAJ1vc1dLSsnFUZctltKOuUEHeIaRY/gfkcBBotq6k+KnzJwKe+mUnym9c13roIA1FD3dCNTfkBZcswGV1Ewxv3bq1rcBk+Xycpd836c+vVUHeMQmx/M+yCgozlkIZkoe2mYrWgKf19ROVt/y55cty6pYebmhuAJ5wlyzA0VGeC/a1zm9z1jaVme17hluKL6HVAgtPXMJHloMVsqxCBJrh4+yA292+tv3Ifz7btAu34WW4E7beHUkMyQRcbhNzEpyXTY5jx+kJly2jrSXTSZPbeeLkAiocXgIsq6Aww2fLiFjY3Cf8nsbX2/bf9mzjLqx1M9xY80463BBCqgEPgr7VWdvQbvCuH28tnUo2eR+eOHRKuegSCMqKTHOY55l44F0mDQHn0eXNX9z8yomKPTSiVjoAOMONmzlJsbup3qBLFeBokJVOEPJyV2PLUW/738+2DbjAZjCV8cVUsHcqEFECgDwoyIi50pOAde46n6NiYePuW9a2HfgH9QJgpxxujD6VgKM9OJ4XzT/gOeHY7W5Yd65t0CS70TRE24nRuWrQkV39H0kCDHmmrK1gZnH7/ZjXsfWRhs23b3HUHKW+682SlGhullmqAQ+Bmzqhndd6He5PHDUfTC48ZXShwXyagpynp3ufzRUIMp0OuwLpWUq6/d72wd21G+fsdzfVUX8YbtzIwQ7BlMINeaQacLQJ1wX0Fr/b9zfnwQ/PKxhUUGKyTjIJo4Enr6OI+j+SBGQ5YcU81Qfgdga8gQpP0/O/qP/4d41eB77yK8ONC8qUww15pQtwtM2Q84VGwEsbyN9srdo60FRYPsRin2wxmOzYS4AHc5WLLoGT5kr0fIlMxY5AvL+k2e9ufK/98Lz7aje9SnPIF5PyHcq0wI2xphNwtM+Qww+CvsFRfaTa2/beuILSM+0G0ynKZIGounephJxNkhpf+7aFjTtvp5WSHdRDaG3W3DBJ5KVAzHHKXaYADrj50KCv8rS0rXFUvXtOwSBTX5P1K8pkiY0NNleSSRNu3sAkKfc0L7+j9sMH97ua8fYpaGyGW795KrbOJyFXugHHkHgu4DPkmjanP3e+Na1V2waa7buHmAsn0/ZRu7YXQ5ksUVE4adIlducKcU0mCW7euBvWOo7c/UDtxr90miQMN9a4+WIyabffow5el5gJgKNLMuQy6Fp4g+PY0cNksoyylgymz4SM7nioS9nmurkMOT0JeUh0j05ga/toiuj78OKQr/W9RY3b57x64stdVBlrbACuv4EDJZV2l2lXb+gPrivxw8OXVgvosNFhp6MQ4TvKzvnni+yn/rLUaB2BJ1/4TzKlKRdGArCVe+PY1m70uw9+7Kz+wx/rt26g+mCCMNS8BMjbXbW/vr1pM5FlMw1wjA19wgHI8SVmKx2AnEG39zfbiu8vu+CasdZ+19HHWAvM2ESqzBYSUXgHDRwv5rxC0ub3uCrI1n6w/tMXGr1OrJBAU+MA2GxrY5WE93LH2xQVTZ7LFBNFP0IWEnwc0Aps0/mcfq/3rbYDO+r9zrUjLMVDaePWCGW26EV48px//Kw5ovl4wxSbI/Ty+Y+fa97zq0WNO9aRzOXlP2hvGW7MT0aYJCdH3RHCWDPZoX9ssrA2Z40Os0XT7HMGnP/1C2yDbulrtI7E64nx7lae1EweXKr7Bq0cybGd7SI7m9a1D3zmqln0WN3nH1J+1tSstbH0xzduWOlErjhSgymKz3TAWQyAnEGHbQ7I2T7XIDebzba7+p1z6STbgGv7GwvGKNBZdNF9GWx6J/eXO5x1z/++aetaejMZg80+r2vLtnZGam15xNkCOPrM2hygQ5sz6ACcYYdf8Kuy8y86zz7g2jKj7SwFOkkkjJPBJlNv9xZH3fOP12/+iLICZBwAm31obIDNdyQBdsZqbepb0GUT4Nxp9BnXDgw6tDlrdA1wOtf828rO+afJtkHXDTLZz7XiNQxUBIXz1XwB1KASa9n0Rilx3Of4fJPz+PKF9Vs/o2gGW/ZlcwRQ84UkBbPDZSPgkKzGKfmy2QKNzkuLMujWG0rPmnRhwZBvDzbbp9sN5kLAni8XpQy1n9AG1I6At51edPnBRlf1G4sbduP2OiCWoUYY2poP2c7OCq1NfQ+6bAWcB4D+A3IGnU0XBp01u6blh5qLi27od8b0Mdb+3xxosp9PoJvwch3Anmvr6Vi/BtRegprA9tX6HJu/dDe+vbhp7wf0RincoGHtDKAZcoaal/2gtbPGHKG+dnHZDjgPSA86TBi20dmEYV/T9FMKTx00q3j0ZSOsfb5ZYrCO0UyYLNbssqbuhBpfS/jyoLvl7f9r3f/O+vajx0kmDDDDLftIg7ZmjZ3VYNM4NJcrgMvjgTbHuAA5NDprdQDO0Mu++Yf9xo2dXDB4Kmn1c/uZCibShWkBPi+CR+gy1ZSRgcbmJzxJQ0t8riafaxdp6883uWo+Xtm0r4LGDG0MeAFzOB/prLFhguQE2DQOzeUa4PK4WKsDdD4Ath54TaNTvJbWz2wr+FHfsRMnWErPG2iyndvfVHAGwW7BBSqA7/jX0QwLL1kXrYAYjg1f+LhMBNC4UCSoPfSmqL21Pufn5Z6GLS83V+xq8jphcjDUAJoPBpzTWFuzxu6ongrkkuM5yqUxyWPB+Bh0va0ua3eGnOPYNw21FRX+oHDcV06zlpxdQvtfCg2mEYVGy1CrMNpZw7Mvwy93AmG9oBlafT6GGPYzQGbfLfyOdr/nSHvAd5B28x2scp/Y+Wr7vu1HnG24qwhIWROzz2DD5zj4DLRsX0fqDmXPbqeXe3aPJnrvGXT2WavLpgyDrfflvNoP5eLiYYMmWctGDjEVj+hrtowsMliG01cayugppEK6k2qnbWCFlNGMxhh81vRsXkAbgywizUuvWWinW+QOT8DX7vL76tsCnkPNXs+Bal/rwR3u+gPrWg/DhmYoZe0rwxsuLOdl84P96BLLgdR8Apynq4O5DqWKMOAFtLIPwBlqhp3P9Xk14DvrCKmbzB3zSGtx0RBjob2fuaCoj8GKHZGiJeBub/K62qr97Y4D7tY2MisAZofyPukzzPBZ68o+wgw0Q4xzOQ+X1ddN2fLD5SPg8syGAEkJMqx6kGXA9WlcDvUhzPWiLTmMc9kxeIjjMGtXBlwPLEPLUPM552ef62NfbjdvwhC+ch0SYFkwkPD14PI5QwzokY99jg9XF1rheEAHx/DpzwEp4gCx7DO87CNNDuMcBxz7HWd5+j8LPE+HH3XYLBv40Q4Zan0+NCDXIzfIAMo+wvqDYdfHy+eoF+fK6STAwtdFq9MIEmB5McjIFi1OTo9QZQiYDCnDizLR4iLVqeI7JcCTowTSOwno5ag/R+36OAZXblkfpz+X86pwDBL4fwN/IZwMBwH5AAAAAElFTkSuQmCC',yellow:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALcAAAC4CAYAAAChOH1KAAAlaElEQVR4Ae2dCZhUxbXHTy+zL8ywDDsSVhEVJQoCkoSIIr4kvohLxO2ZfC8an0mQrCQm+uJ7qHkv5hE/xSQaNokBogkxigaUuLDIpsiOMA4MOwyz7zPd7/yLOZfqnu7p7umeXut83+2qW7du3apTv3v63Lr31rWRkUhowOZViPc6Nutpbq/8WPVO8173sYtJ6kgDusI7yme2nYdTdIZQj0NH1vrgwYNtc+bMyb344otzCgsL87KysnLT0tKym5ub6+rr62vKy8urd+7cWfv444/XlJSUAGSB2VfoKw3HM9KBBqQzOsiSspsEXgmhCMTtDGT2TTfdNDwvL28kQzvC6XSOcDgcQ2w2Wzfenme323M5nuN2uwPql/O5OF+dy+Wq4X2rOV7Z2tpa3NLSsp9Pgv3V1dX7XnnllU/4RKnj7S5edNARl4WjRnQNBFS+njnJ4wKxHtp37NgxpG/fvlPY6l7CAI/kZTgv/YMBN1L64hPAzcAf5eUTXvax9d9x/PjxtZdcckkxH0OAF8gljNThE7acVIdbQLZzDyJuX7du3YChQ4dOycnJ+QJb5M+zFR4Qr73L1v4IW/h3amtr/3nw4MG1kyZNOsJ1FdglBOwpKakItwfQTz31VN4dd9wxnd2LL7J1/hzDPCxRSWDYD7BVf5fdmbeXLl26avbs2dXcFsCdkqCnCtwCNEL7gAEDnBs2bPh8QUHBnenp6TdyWi4vySY1TU1NKysqKl6cMGHCO0eOHGnhBuqQJ71FT3a4FczcqQgdu3btGtWvX787MzMzv8YWun+y0eyvPWzRjzY0NPzp2LFjL44ePXoP52vlRbfo/nZN6PRkhdvyoX/7299245GNe9iHvoMvBC9P6N6KQOX5gvRD9tGX8gjMovvuu6+SixRrjjCpJJngRluwAGz78uXLu0+dOvXbDPW3eL2QFyOeGihnyOevWbPm6VtvvfUsbwLcAnpSuCzJALcH1KtXr+4zduzYWbm5uf/OnZWMvrQnouGv1bD8ftu2bf937bXXnmgDPCkgT3S4lZXmDrGvX79+0EUXXTSbRz3u5fXM8Ps85Upo4FGWBbt3735q4sSJh7n1YskRJqQkKtyoN8B2vPzyyz2uueaaX2RnZ9/NN1bSE7IX4qjSfMOoqa6ubvFbb7318xkzZpRx1XDxKZY8jmoauCqJBjfqi8WB4bzNmzf/W/fu3R/j9R6Bm5o6OWyuErK1fMiKwuhfJ8VNZWUVtT/77MTHFrYNI8oIS8L444kEt7ggju3bt182bNiweXwHcXwnuy5pdwPYzrofMdiR8SaaW9wffFLc+N3RE/7xEStNrHhkCu/iXkgEuFFHBfb8+fMLb7vttkf4YvGb7II4u1g3CVm8vXEpORtfiGzdbbaWmpqW3724ou4/v/WDj8u5cMAd965KvMMt1tp56NCh24qKip7gmy99IttzyVWao3ERYekKcbnpxKmy5h/3HbVpGZcvdzzj1ooDnngUnHQOLI8++mhBZWXlC3369FlowI5tV9lt1KdPz7SFdaUTXnj00REF0kccxqWRjMdKWWBv2rTpUn7YfwnfWRwZ225NnKN3peXWtdDion0799TedfkXPvqY0+GLywWnni2m8Xiz3KgPLLbz6NGj3xgzZsw7BuyY8uH34E47jRxzUc47J/eN/wb6ixf0W1zxFC+VEWvtnDt3biE/ybagZ8+ez7CysngxEqcasNkoq6i785m6w1ctmDt3GB5xEMjjwiOIh0qgDjjJMG49hp9ae5Gt9fA47c+4r1a03BJvRbS43J/s3FN3R5ubIhebMR0Tj7XlFoudtm/fvmsuvfTSNQZsb2wSY91ptw0fMzrnrYObr7iGa5zGC9yUmBrPWMItYGOY7xZ+W/wvrIw8XowkqAa4Q/M+MzjjL0d2jL+FmxBzFyVWcOO4OLPT+AH6b/ELuAs5bp4LYSUkujDg6f37Ohee3ncVHjUWCx4TzmJxUAE7/eTJk4/06NHjKb7bGIt6JDpH8Vt/N9l7dnc8dfaTcY9wJWG0YjKSEm2oFNh80ZhRVlb2NL/D+KP47SFTs3A1UFiQ9qOakglPjx7dKyMWgEcTbgX2+PHjs3j6hCX8fMjXw1We2T/+NZCTY//65jeGLRk/vjuGdaNqwaN1NavA5salnz179jl+9evO+O+WxKxhrIYCA2mrtq71xdwLNt7P+Zp4kacLA+0W1vZoWG4BO4197McM2GH1V8LunJPtuLP84FWPcQOidpHZ1XCjfCxppaWl32Ef+6GE7R1T8bA1UJDveOjUnvHfAQ+8CBthl+uvgK6EGy6PAru4uPj23r17z/VXCZOeOhro1cs5t3T7uNu5xQJ4l7nGXQU3KqzGsfmF0+v79+8/P5oTR6YOKgnYUjfZ+vdLm7/vg7HXtwEOTroE8K6AWyy2kx9ZHTdkyJAlbY1IwJ4wVe4KDTAgacMHZy3Z9vbl47h83MkEhxEHvCvgRpnOefPmFfF49lLMU83rRowGPDRgs1POpRdlLZ33xJAi3iCAe+QJdyXSZ4sCmyuVwY+truA5RKaFW0Gzf2gaiNehQH+tqKt3vZkzaAOeRWnkRZ4m9Jc9pPRIWm6cKMrPPnz48HcN2CH1Q8pmzs6yTzux+8rvsgJkiDBiBjdScAvY8LOv4hd58UyBEaOBoDRQ1DPtEfa/r+LMEX2SMFJwoxzHE0880Yv97AXsZ6OSRowGgtIAeLl0VNaCJx4d0ot3wL9/RLiMxF8AKgKY4WcvY3dkOseNxEgDieZz62qqq29dlTNo422cFhH/O9wzBCeHgptfOHjAgK13lYmHqoHsLMf0ozvHPcD7yehJWMY3HLgtsBcvXnwB34F8ONTGmPxGA94a6FuU9vDiZy6+gNPDBjxcuNXoyA033PA4+01mLmzvnjLrIWuA36jP/dcb8h7nHcMePeks3JbV3rp167X8sVF8NMmI0UBENJCXa7/xo3fGXsuFhWW9Ows39nNed911uRdeeOEvI9IiU4jRgKaBi0Zk/vK663rDGxDAta3BRTsDt2W1n3/++Vk8jfDQ4A5lchkNBK+BNKdt6OJfD5rFewjcIV9chgq3BTZ/UGkY36wxz2cH318mZ4ga4Js7Dy1fMHpYZwHvDNzqIpI/1fEkX0Sab8+E2GEme/AasNltmdO/kP8k79Gpi8tQ4Las9rvvvjuBXxe7LvhqmpxGA53TQE6O7bp1r4+RW/PgNWj3JFS4ldXmW+zfY6vdudqavYwGQtAAOONb89/nXUK23sHCbVnt119//TKelmFqCPUzWY0GwtJAbq596j9eueQyLiSki8tQ4IbVdl555ZWzOTRmO6zuMjuHpgGbbfxlOeAOcIPDoPgLBm7LavM3H0fl5+d/KbSKmdxGA+FrID/P/qWXXxw1iksK2noHC7ey2pMnT8bQXzD7hN8aU4LRgIcGbPYpV3UDf0Fb70CgitV2LFq0aAhb7RkexzMrRgNR1ADPezJj0fyLhvAhYWzBbofuSbBwO6dOnfogX7miUCNGAzHRAA+cOP5lSt6DfPCgXJNg4HawO5LDs0XdFJMWmYMaDWgaKChw3DR5ck/MqBDwwrIjuMUlwTQN0/lzHvjuoBGjgZhqwG6ngmfnDsTbXgGtd0dwY5u6kBwwYMCt5qZNTPvUHLxNA+BwYP/0W3lVLiz9MuxvA6w2FsecOXN68fPaX2wr2wRGAzHXQF6O44tzZlsvEwur7erVEdzY5rz77rtv5s9S49anEaOBuNCA3W5L+/rt3W/mynTomnQEt3JJ+JvrmA3IiNFAXGmgX1FawC+m+YJbzLxjyZIlI/mNdtzTN2I0EFcayMqyXfbS7y4cyZWSURNw6yH+4MYOjokTJ95iLiQ99BX3K271Tx331Qy7guBy0vg8WG/FKoft4IbP4i3IpPztwsLCz3tvNOvxrYEW23iqKPs9VxKfnUlc4fncPSrvtUpYb2lygU+/frc33JZLcs899xSwS3KpxxFSdMVWv4dsle+Qzd0c9xqAGevm/AJVVBSTy+ViCDwhQQN8JLVLc1P7/bz39VXOuTye+/rK5zvNcz+U1ZG4XO5Lb5teWbBs1QHMUCXsWoV4w42yYLUd99133yQ2/dBVSoutbhc5997MmkscS4hOK2hxU1mlb7h9daj3f7r3uq99Yp3GJ67jnqktk5atopVcF3Dr0UnecKNNCu5+/fpNNv42m4PyN8jWdDTW/Rjy8TF22yPLTWeriFyWLQu5mLjeAbD26eaezMHfeQG3SLJaiwRdsK7g5icAJ+kbUjVuc+OziYkpPD0Cdc/nDk0EM9xJFedn2ybyrvizEnatknS4oQIsjlmzZvXMzs6+0MplIgmrAQHcwT0tHZxMYXaGe9QDX03vCW55kaap/vIFt33mzJlXt2VUmcxPYmsAgBfmsWkD4Nz9SbbYvnq1G7yC5Q7hRgYH35W82vjbiQ20d+11wL23JfI6OO1TSIBbXBMArsTbciu4eU4Sc1dSNJREoQKcZ9+DBY+U4F8AIv8GEleJUfrJyiTw2g5uGS0R2hXcPL79mSjVyxwmyhpwwkXJdVNFTeRGUQRwNEXiEkajedkZBF4FblUN/nHr5zDi9p/85Cd92NSzh2YkWTUAwAtgwcWkJXhD+UTKm3VLWh9uhmJYmiNwo5lY7Pw8yXDZaMLk1YAArkZRuOdhaRN5mXSxDdyCZ2FZrUgPKrj55s1QczEpKknuEIB347cRYcGFiEQMUf++3V1DubcEbtVx7Sw3v3UzLLm71LRO14AADqudyJKbaQO3ArdqjQ434naeB3CIsdyJ3M2h110Aj+QoSui16Pwe4DUnm4ZwCYphDhXcGC2Rcxahg0dKkMlIimkAgOdnu6mqzvdTg/Gujqx0G7jFiInFM0iHIME+atSo9MzMzAEqxfyknAbOAc4gMBWJdnGZke4eMOozmengmBcFuA63bdq0aYV4jDDletU02NIAAM/LOge3lZgYEceUMa2FXFWAbcEtKzaen4RHP42kugYE8M6Mg8uFqVh+6FLSfOlVtnU2v+yHcFCRG/xaPOt3KG29evUyN2989UAKpgHwXH4evKZee0A6SD0IsMgucQl9FaFvk7iEgfLr27vnucGvwK38E9lu42FAY7lFGyYkZcGz2YkFLgkg+TkOsdyqtjJaomjnZ7gN3AnQidGsosOhWXDrHZdo1iC4YwHgzEzfbglKsBm4g1NkquUSwGsb4neYEG5MTjp5WG6P0RIeBswxN3BSDd3g2gvAc/irox35wsGV1DW5UK/0DDemNlZeCI5ijQkikT91jY1GjAZ8asAX4AI7Qj3us4BOJOpl6nFfRaU77AI3Ntv00RK+gDBw+1KaSTuvgXOAu6mOZwqRuUcEOuSSuITn9+x8TC9L4hLqpTqdynIjCdbbc+6t1tbWFiQaMRroSAMAnF/MpXoA3lHGKG9rddk8+BWfG9WwNTU11fqaoSjKdTSHSwANAPCsjDYTGQf1xb9IYzPVclWU1UaVdLipoaEBG40YDQSlAR1wuYrzDlGQRZuPUmWb937+1r3L0/fnuQM9+NXhdhu4fWjfJHWoAQtwocwrtyQHC6vX7u1WvctDBkmrb7YBbstTErhVQl1dHb82asRoIDQNAHA8j+frIi+0ksLLzRe5wq/iGaMlQrq7oqLCw6yHdyizdypp4JwFd1MDzz4noyjRbD9OrMpaD8vtlqFAAO4uLy8X8qNZL3OsJNEAf6uGLfg5wKPdJMBdXuMCv4plHF/cElWX06dPV5vREqUK89NJDZwDPPouCv4tTpVTtV5tgVvRvnv37hoDt64eE++MBgB4Bs+hDGvqvaA8pIlIXPIhXdIkjx7KNskvIa4q9xyyA24Py40ViHvlypXVPNbNMzobMRoITwMW4F7FeMOJzZKmxwVa71DPg7hIczNVvba+SdwSJFszTgntbh4xKTHWW1RmwnA0AMDTYcG5kK5ccAXLIyUlfBiLY9Rb3BLEscFVW1tbghUjRgOR0IAFuOaKRKJc7zJqG2wlnObiRTwRBbfQjg0uHg781Fhu1oSRiGkAgKfxuJy3ixGpdVS0qtb9KQeKYQ4V02K5BXA3j5gUI7MRo4FIakAAj2SZelmnKuggr1scYxvg1hNaecTkoLHcUI2RSGtAAI+UxZZyUM89h1wwyviamcWzWG5sVyZ94cKFn/L3CxE3YjQQcQ0AcCfPjAMwIyVMq2vhasenXJ5iWMoVuIV2165duxp4xOSYZDCh0UCkNaADLtY3nLC+yXZs14EmfsPTuqAEz9ZoiQU3p7XW1NQY1wTaMdJlGsC7urDg4Qpc6JoGN/xtuCSw3MKyB9xi0l0nTpzYbPzucNVu9g+kAQE8lDFwlOnh0TDKJ8tsmznZ4pfjHpYb+yABGVq3bNmywbjdUImRrtYAAHeE4IML2HJC4OvIW/e3buB66pZbVbudz41MP/3pT3fziwvmNnxX96wpX2kAgHd2ZtnGFqr68QuO3eCWF59uCQ5iWe7q6uqms2fPbjWuCdRiJBoaEMBDORb4LKugLYwrvmGuw62KEcuNFQtujrccO3bsAwO30pH5iZIGBPBgR05QrWNltk0c4K33gHADcGRq2bBhw3rjd7MmjERVAwAccAcj8LfX7Wxdz3kFbvCLRYleDOIYnOEX9tWca93OnDmznmd+7aFypuiP48jjhMVIdDUQjNdQVecuK7iheSLXrJIXPO7KM6ko46wAl9fMOE0Rj0Q1YsJhC8O9mT+Vfb09Ub8EhFaFKc2taVReYRmDMEszu4eigY4Ad7HZPnyKMAQoVtvjYhLH0eHGusCNHVr27du3euDAgRGF21axm2zH1pLN3Yzjxb3YG89Qel02PzIM3bUXf9jjtSdf4i8def3s4veFW39l+StHHaODjaGW5zd/R8fw08pQy2ppddOuva2rGVPFKrdN4EYzlehuCRKwDuB5Pk/KGzlyZM/169e/z5/vi8gXFwC28x9fZrDh1ieOVNW7cBcscSqcAjWtbXRXf/l/K6/ed6rpDDcXr5fh9jtAtzrKl+XGRtDXzJa77siRI6tHjBhxUyRcE9vhV8lWe4SLTizJR3XZLtRiwMlIzDWAx/qOn6HV+04Rf1iQ4AKAV3Brgc1x6/Y74iIw71hwFjTxqMlKniBTtoUV2lyJS0c+f+GLJzc3EgcaYI+EthyilVwVAAVOhVmP2unj3LJBLLfyZe6///5NVVVVRzty7mXHZA8BeC6PJcF3M0tsdADbzF94OPq9P5OMb4NTsdweCPqDWwCHyW8uKSl5zcB9Tm95fDWSg8FSIzHRAC48SyvoNT64YpNDARvMeogvuJEBZh474axo5ikf/trM784bOacBATzYO2kmH1t5/quLxNLCCK/aSX8Fl7yI1Qav7cQf3DgLLL/7ySefLC4rK9turPd5/QHwbOODn1dIFGKw2uW1tP3/3qZiPpzub7ez2qhOMHDj7GjasWPHSy1qSBG7GYEGlAVnwI3/HR0dtLK53XWCXmLVC9hgE0Y4JLg5v9oBO8L8N82cOfM1nvah1FhvqOa85BoLfl4ZXRiD1a6sp9L7lil/G3CDS79goyr+LDe24Wyw/G5+9axh+/btf4jUsCAOkCwigEfCpzRl+PbN8ZDUzhP0h5oadbNG97d9Wm2wFQhuAVxZ729+85t/raysPGmsd/vTEoBn8dRhRiKvAWW1G+jk7OXqQlKstt9REqlBR3AjD8w+CgHcjUePHq3duXPnImO9WRs+xFhw31Y33H8jWO29J2jR0Qr1QSc8+QcewSX49CuB4IblRgHqopLDxm9/+9sr+E2dMmO9fesUY+DGgvvWTWdSYbVrmqjsxytpBfjjRS4mO/S3caxAcCOPWG8FOD9vUrVnz54XjfWGanyLAG5GUcIfRcFzJPtP0ov7jhPe6RWwA1pt9EwwcIv1Vn4379M4Z86cl9h6VxrrDRX6FgW4GQf3rZwgU2G1qxup8ud/V8N/YrXBYUCrjUMEAzfyifVWvvfGjRvLN2/e/LS5awnV+Bfc5MnCOHiE7s6lWjktTN22Unp6awmVs5aD9rWlR4KF29t6N8yYMWMFT96z07xnKar0HQLwTDOK4ls5HaTCHTlVTTvvWqR8bTyrLaMkQVltFB0s3MjrYb358yL1y5Ytm8vzm7iMewL1+BcB3PjgwfnguMPC85G4Xt5Gc3nShnrWbMhWG70RCtztrPfDDz/88f79+/9sLi79gy1bBHBZN6F/DeA2+4Ez9OdfvE4fc65OWW2UHgrcyC/WG38ROJsavv/97/+Gb8ufNdYb6ulY4H/DRUk13zmU9kKDlY109sd/pd9wFGDLhWRQIyTYXyRUuGG9cRAMC+Kg9e+9914ZX2D+mt0UXjUSSAMAPMP75b5AO6XQ9iama0sJ/XrjQSrjZotLAt7AHfgLWkKFGwUL4GrkhNfr+eJyJd+93Gbck+D0LoCHYtFSIS/uRJ6oom23v6BeIROwwVnIYKMnOgs33BPrriXHG+bNm/cIv45WY0ZPoNbAIoAHznk+By5IIXJhKnGV2JYuaXpe2R4o1PfR4/720/PocX/5O0rH6EhlA9U88096hPPp7gg4A28hWW0cqzNwYz/xvS3r/dxzzx1cvXr1L3j0hOfZCLkeKDPlBP43XBSAEcwCBQlEelz21dP0uGwPFOr76HF/++l59Li//P7S20ZHaO0++sXv31cfbvK22uAtZOks3DgQDijWG2da/V133fXm3r17l5ubO1BPcALA01PcB29mp4OnaVj+jcX0JmsNYMsIiVjt4JTplSscuGGeAbhYb1So7pZbbvnV8ePH9xr/20vTHaxaFpxNWyr41nob4WefrKG9dy6kX4EfXsQlAVfgq9NuQAS+SsKHPy829rt5gquWDydMmPCVjIyMdMzaKWI/8S5hMdJeA+r7MNyN6GwR0Zy/v/NIp+O4ckw9LsfR0/S4bA81xAx1VQ1U+8s19K1/7qVjXGYtL7Dc8oCUpg0cMTQJx3LjSDi4t3tSN3/+fPjfjxn/O7TOyGAXJQ2f0ODdsEAkPLfWtb9yLH/HD7Q9lNrhsqyBnY639tJjv39X+dlitQXssKw26hIu3ChDABf3BGdeHfvfq/jR2BVm/BsqCl4E8OD3SMycGM/ec4JW3LuYVnELADa4wb2TsN0RLkNJJOBGQTjLMBbpAfj06dOfLC4uft8ADhUFLwAcF5m6b5pMcVxAlpyl9298jp5krXiDDY7AU9gSKbhREVhwffSkjt+3rLn55pt/WFpa+rEZQQmtrwA3XJRkE4B9pJw+/trz9MPKOjVhvLc7Ao4iIpGGW/xv/L2o0ZMDBw5U8HyDD/HjscUteEDXSNAaEMCTxWrjgaiT1VT84Ev00IFTVMGKELDBiwz7RQzurrYNqqKHDh1q4tvzGyZfmHVNbsUHufz5byNBasDRZn7kvpiuOokj9LXgEJJHj/vKK/kk7Ex+7KOLlIUQdyBP19CJOa/Q/W/soSOchJERwB1RP5vLs6Qr4PZ55vHFZb2r1b1lXNHRa/muXKYB3OqDgBFfgOvg+CtAz6PHuyo/jqEvOA7WYbF5GrSKX71NDyzaQAc4SYb88O+O67SI+dlcliVdATcKB+CyyMFsH+w6WsnTAO+8pD9dx4CnGcBFNYFDAVwfBw+8V+xzAGyeKar+D+vpu798k7ZzjWCtxR3Rh/0iXtmugluvqECO0MbPD5zpmUs7RvamKQx4Rgp/S0rXUVBxAVwpkk1ivPviAPtsPVUv2Uizfvaq+jgToBarDbBhsdGcLpFowo0GqIas3kOnud0fjBlAk/nWc450Wpe0MMkKFV3BB9ddgHiLtzC27GOfmvcWPTj3DfqIuwFQY4ErolvshIab22KdnWiIasyGYqrkZwreu/ICmsivYBVIpyGzkY41IP92cpHZce7ob23icY/jVXToZ3+jB55fR59wDfCNSN1iR3xkxFcro2G55bhyhlqAf3yEanccp7WfG05j+XszRQAcf7VGAmsgHgHHyQawedqzXQ8up/949WNrVEQHO2J3IANpKZpwS10EbhV+eoYaV++lt68dRaPyM2mAAVzUFDgUwJEz1v436oBb6p+W0cZbX6CHNn1KpzkJUMPP1h+GYo/U+ifnaNdJtOHWwZZGus/UUMufPqS114+mfvkZNNxpLHjQPS6Ax9JFwRh2Hdtjnqzy9WnP0k9Ky9QNmpiCDQVGG27pNB1yxF31jeT63Xu07ooLqLx3N7oy3UFO6TjZyYS+NaAPqUbbgquhvkZq5FGwX13/ND3L/YgPnsLH9jXch76OmsQKbjRQQd0WWrAv30r7bXbaOLIPXZHppG7GTQmOBQ/AeZeuHj1B7/HEOXSikg4/vZZmzV5Ba/mwsNbiX8uoiNygQR9HVWIJtzQUjYaLYrkp6w5QOfvhb04aSn3YDx9m3BRRVcehAN7VFCk3hAfz9p6kN29fQD9Y+REd4poJ2GKx9TuPXV0ln4qJNdxotPeiQD9dTc3sprw39gI60zufxsFNkb9cny0xiUoDMtrUFTTBr1e30huo8e399D/TfkPPcj9V8oF1/1qeFRGLHbOeiTXcaLj0g1hvPXSv2EqfuG20bngRXc43fAod/H8rHRgzrcX5gS39tOlKjEI4IcDGmzPHKql43ts0i7/g+y6rQe44yoiIgC19GFNNwTWLF0FdcLJh4cf1Cd/p5Q9SqyW7ex7lLL2X7vjsILq3WyZ/vIBzWZ3ImYy01wDch3AFUOMZbJ5TpH7rYVrAs64uPVvtYan1N2hgrbGIwQr38GHtHw+WW28AlCKLnP0IW+ubyLX0A9pxqIzWXNib+vLk7oPlYtNArqvwfDwcvYgLUsu2eP9pemfOSvrBwyvpHe4HuCAyGgKwvZ/siwuwoYV4styojwieYsaCGT14dj1lxfl7YZYlz3j2drr6Xy6m2T3zqD+PqpAZNmTt+BGAiiVYgcWHC8L3H46+toOeenAZvc/7wuUAzAI01vVnRCLwP8ElRlDiFW40EXUTwAVyAG4tA3tR3oI76J4xA+mOvHTKgKtiIIfq2kswcANquCDVTdTIj0YsvXcpLSo9rcatYZ31RaDmU8Aa5Wp/0BinxDPcUA3qhwXuEwCHLw5LbgGO+MyraNCDk+nuEb1pOrsr6TyyYiBnxXiLP8ABNW6dswvStP8UrXrmPVr8x410mPfXgUYcUGOID1CLbx3CfwLvFUWJd7hFFagnrLhALq4KLjoF9IyvXkb9Zk+lmSOK6Cv8XfZMfl7cQC4a9BECatyIqW6gBob6b0+toT/+5SM1OQ5cDgEbcd0FAdRwQeIWaq6bkkSBG5VFXQVyWHFxVQC4QK7iU4ZTr4e/RLeN7kdfzcugXAU57xnOBRYfIykE1htv8yioG6lm1zH6y3/9nZat/UQ96CQgA2yJ+3JB4h5sdFYiwS1wCeDe/jjAFosOa57+2c9Q4X9/mW4Z3Zdm8J3OQszJJ3c7Uwl0AI0Fkw80sFPBU5iV7zpOL//0VVqx9VP1pTAALEAjrltq8asTwlpz3S1JRLil8gI5XBUs8MdlfFwgV8AX5lHW4zfSxCsG0vUDu9NEfnY8Xax5Ml+Awu0QK13bRE2lZ2n9llJ6g4f11pdXW4+h6hYacfjUcus8YVwQrnM7SWS40RjUXyAXn1wgB+ACucTTxw2mbj+cRlNH9aZp/QroYobcpmZ3QkFcUiJbdLHQ8Bnw0gC7Hu5jFbRzDz8Dwi/nrtlUom6VwzLLIhYa6zrUsNJiqRPCBeH6tpNEh1sa5AtyfXQFcAN6gVydAHdNoAF3j6PpQ3rQlIIcGoxRFoCubg5x5niHXYcZz3wAaIx6VNRSSXEZrV28iVYt2UBHuCkCrkCNdT0O10OsdMJDzW1Rkixw6+0R0MVd0V0WuQgV0MXKO798CRV9bRxdMbQHje3TjS7n0Za+cF0wdq7DjgPFwroDZIgCmkPAjDHpttGO4/zo6YcHy2jbnzbRlld30CnOAmB1qAVoPR1Ay4IjyMLRxJdkg1vvEbQNroq4KwI7ABeovUNsQz7nzHHU78YxdMWQnjSWn0q8LDuNemIObVyQAnbrwpQzQ3Tg9fi5rYF/BV7klLgijX9wIQiYEeKtcn7r5czJKvqo+AxtW7mdtvxxkxq+E+urwytwSyh5BGgu0XI/AlcywXIkM9zSFWLJBXSEFsQcB+BYF+glriBvS7dPGU6FUy+iwcOKaFBRPg3qlkUD89NpIFv4fmzdnQAez1OLK6POLK91bBPLq0IGFxd8AjHSsN5mlVt4/PlYVROV8qQ2paeq6DDPr3d4zW4q4WE7fAsdYAJWAVbiANk7DpiRJjAjVIflMGkFfZAqgrbqC+AF6Ahl8QU20mS7vo86WXIzyfm1K6jfZQNpQEEm5fP0w1lZaZTNw47Z7L9ns4XPZl8+i61+NsOdwQA3svWtY9+4ni1xHfvJdTw8V1fPS2Mz1Vc0UNVHpXTkT1voWE2DB5AAFFCK1RVgBWR9Xc8j+wjMEnJRyS2pBLfekzrkiCtQOdThFaB9wS0nhYRShne5so5jIy4CwCACmncolhWQCpwIJS7wAmyJ+8rrXS5nTx3RFZ46rfZsqQCohwK7Hgr4HaXpZUgcR9PjWBfo9LikIRSQBWZ93V8a0vUyJI5jpKRA6UY8NSAgeoeAGmmBQu/9UDrSvAXwQQRCPRRQA4X6PhI/V6r59al0oxZPDQisSPUVlzQ9lLx6iLi3AEiIHgqk3qHk886rCjA/7TWADjESugZ0vUncO5RSJV3W9VBAlTRZ9w6xXdIkrwkDaKAjxQfY1WwOoIFQdGvADaDMzmz+f6SMYEX4z7hMAAAAAElFTkSuQmCC'};return{FaviconsByHue,};});'use strict';Polymer({is:'tr-ui-b-info-bar-group',ready(){this.messages_=[];},clearMessages(){this.messages_=[];this.updateContents_();},addMessage(text,opt_buttons){opt_buttons=opt_buttons||[];for(let i=0;i<opt_buttons.length;i++){if(opt_buttons[i].buttonText===undefined){throw new Error('buttonText must be provided');}
+if(opt_buttons[i].onClick===undefined){throw new Error('onClick must be provided');}}
+this.messages_.push({text,buttons:opt_buttons||[]});this.updateContents_();},updateContents_(){Polymer.dom(this.$.messages).textContent='';this.messages_.forEach(function(message){const bar=document.createElement('tr-ui-b-info-bar');bar.message=message.text;bar.visible=true;message.buttons.forEach(function(button){bar.addButton(button.buttonText,button.onClick);},this);Polymer.dom(this.$.messages).appendChild(bar);},this);}});'use strict';Polymer({is:'tr-ui-b-toolbar-button'});'use strict';tr.exportTo('tr.ui',function(){const Task=tr.b.Task;function FindController(brushingStateController){this.brushingStateController_=brushingStateController;this.filterHits_=[];this.currentHitIndex_=-1;this.activePromise_=Promise.resolve();this.activeTask_=undefined;}
+FindController.prototype={__proto__:Object.prototype,get model(){return this.brushingStateController_.model;},get brushingStateController(){return this.brushingStateController_;},enqueueOperation_(operation){let task;if(operation instanceof tr.b.Task){task=operation;}else{task=new tr.b.Task(operation,this);}
+if(this.activeTask_){this.activeTask_=this.activeTask_.enqueue(task);}else{this.activeTask_=task;this.activePromise_=Task.RunWhenIdle(this.activeTask_);this.activePromise_.then(function(){this.activePromise_=undefined;this.activeTask_=undefined;}.bind(this));}},startFiltering(filterText){const sc=this.brushingStateController_;if(!sc)return;this.enqueueOperation_(function(){this.filterHits_=[];this.currentHitIndex_=-1;}.bind(this));let stateFromString;try{stateFromString=sc.uiStateFromString(filterText);}catch(e){this.enqueueOperation_(function(){const overlay=new tr.ui.b.Overlay();Polymer.dom(overlay).textContent=e.message;overlay.title='UI State Navigation Error';overlay.visible=true;});return this.activePromise_;}
+if(stateFromString!==undefined){this.enqueueOperation_(sc.navToPosition.bind(this,stateFromString,true));}else{if(filterText.length===0){this.enqueueOperation_(sc.findTextCleared.bind(sc));}else{const filter=new tr.c.FullTextFilter(filterText);const filterHitSet=new tr.model.EventSet();this.enqueueOperation_(sc.addAllEventsMatchingFilterToSelectionAsTask(filter,filterHitSet));this.enqueueOperation_(function(){this.filterHits_=filterHitSet.toArray();sc.findTextChangedTo(filterHitSet);}.bind(this));}}
+return this.activePromise_;},get filterHits(){return this.filterHits_;},get currentHitIndex(){return this.currentHitIndex_;},find_(dir){const firstHit=this.currentHitIndex_===-1;if(firstHit&&dir<0){this.currentHitIndex_=0;}
+const N=this.filterHits.length;this.currentHitIndex_=(this.currentHitIndex_+dir+N)%N;if(!this.brushingStateController_)return;this.brushingStateController_.findFocusChangedTo(new tr.model.EventSet(this.filterHits[this.currentHitIndex]));},findNext(){this.find_(1);},findPrevious(){this.find_(-1);}};return{FindController,};});'use strict';tr.exportTo('tr.ui.b',function(){function TimingTool(viewport,targetElement){this.viewport_=viewport;this.onMouseMove_=this.onMouseMove_.bind(this);this.onDblClick_=this.onDblClick_.bind(this);this.targetElement_=targetElement;this.isMovingLeftEdge_=false;}
+TimingTool.prototype={onEnterTiming(e){this.targetElement_.addEventListener('mousemove',this.onMouseMove_);this.targetElement_.addEventListener('dblclick',this.onDblClick_);},onBeginTiming(e){if(!this.isTouchPointInsideTrackBounds_(e.clientX,e.clientY)){return;}
+const pt=this.getSnappedToEventPosition_(e);this.mouseDownAt_(pt.x,pt.y);this.updateSnapIndicators_(pt);},updateSnapIndicators_(pt){if(!pt.snapped)return;const ir=this.viewport_.interestRange;if(ir.min===pt.x){ir.leftSnapIndicator=new tr.ui.SnapIndicator(pt.y,pt.height);}
+if(ir.max===pt.x){ir.rightSnapIndicator=new tr.ui.SnapIndicator(pt.y,pt.height);}},onUpdateTiming(e){const pt=this.getSnappedToEventPosition_(e);this.mouseMoveAt_(pt.x,pt.y,true);this.updateSnapIndicators_(pt);},onEndTiming(e){this.mouseUp_();},onExitTiming(e){this.targetElement_.removeEventListener('mousemove',this.onMouseMove_);this.targetElement_.removeEventListener('dblclick',this.onDblClick_);},onMouseMove_(e){if(e.button)return;const worldX=this.getWorldXFromEvent_(e);this.mouseMoveAt_(worldX,e.clientY,false);},onDblClick_(e){},isTouchPointInsideTrackBounds_(clientX,clientY){if(!this.viewport_||!this.viewport_.modelTrackContainer||!this.viewport_.modelTrackContainer.canvas){return false;}
+const canvas=this.viewport_.modelTrackContainer.canvas;const canvasRect=canvas.getBoundingClientRect();if(clientX>=canvasRect.left&&clientX<=canvasRect.right&&clientY>=canvasRect.top&&clientY<=canvasRect.bottom){return true;}
+return false;},mouseDownAt_(worldX,y){const ir=this.viewport_.interestRange;const dt=this.viewport_.currentDisplayTransform;const pixelRatio=window.devicePixelRatio||1;const nearnessThresholdWorld=dt.xViewVectorToWorld(6*pixelRatio);if(ir.isEmpty){ir.setMinAndMax(worldX,worldX);ir.rightSelected=true;this.isMovingLeftEdge_=false;return;}
+if(Math.abs(worldX-ir.min)<nearnessThresholdWorld){ir.leftSelected=true;ir.min=worldX;this.isMovingLeftEdge_=true;return;}
+if(Math.abs(worldX-ir.max)<nearnessThresholdWorld){ir.rightSelected=true;ir.max=worldX;this.isMovingLeftEdge_=false;return;}
+ir.setMinAndMax(worldX,worldX);ir.rightSelected=true;this.isMovingLeftEdge_=false;},mouseMoveAt_(worldX,y,mouseDown){if(mouseDown){this.updateMovingEdge_(worldX);return;}
+const ir=this.viewport_.interestRange;const dt=this.viewport_.currentDisplayTransform;const pixelRatio=window.devicePixelRatio||1;const nearnessThresholdWorld=dt.xViewVectorToWorld(6*pixelRatio);if(Math.abs(worldX-ir.min)<nearnessThresholdWorld){ir.leftSelected=true;ir.rightSelected=false;return;}
+if(Math.abs(worldX-ir.max)<nearnessThresholdWorld){ir.leftSelected=false;ir.rightSelected=true;return;}
+ir.leftSelected=false;ir.rightSelected=false;return;},updateMovingEdge_(newWorldX){const ir=this.viewport_.interestRange;let a=ir.min;let b=ir.max;if(this.isMovingLeftEdge_){a=newWorldX;}else{b=newWorldX;}
+if(a<=b){ir.setMinAndMax(a,b);}else{ir.setMinAndMax(b,a);}
+if(ir.min===newWorldX){this.isMovingLeftEdge_=true;ir.leftSelected=true;ir.rightSelected=false;}else{this.isMovingLeftEdge_=false;ir.leftSelected=false;ir.rightSelected=true;}},mouseUp_(){const dt=this.viewport_.currentDisplayTransform;const ir=this.viewport_.interestRange;ir.leftSelected=false;ir.rightSelected=false;const pixelRatio=window.devicePixelRatio||1;const minWidthValue=dt.xViewVectorToWorld(2*pixelRatio);if(ir.range<minWidthValue){ir.reset();}},getWorldXFromEvent_(e){const pixelRatio=window.devicePixelRatio||1;const canvas=this.viewport_.modelTrackContainer.canvas;const worldOffset=canvas.getBoundingClientRect().left;const viewX=(e.clientX-worldOffset)*pixelRatio;return this.viewport_.currentDisplayTransform.xViewToWorld(viewX);},getSnappedToEventPosition_(e){const pixelRatio=window.devicePixelRatio||1;const EVENT_SNAP_RANGE=16*pixelRatio;const modelTrackContainer=this.viewport_.modelTrackContainer;const modelTrackContainerRect=modelTrackContainer.getBoundingClientRect();const viewport=this.viewport_;const dt=viewport.currentDisplayTransform;const worldMaxDist=dt.xViewVectorToWorld(EVENT_SNAP_RANGE);const worldX=this.getWorldXFromEvent_(e);const mouseY=e.clientY;const selection=new tr.model.EventSet();modelTrackContainer.addClosestEventToSelection(worldX,worldMaxDist,mouseY,mouseY,selection);if(!selection.length){modelTrackContainer.addClosestEventToSelection(worldX,worldMaxDist,modelTrackContainerRect.top,modelTrackContainerRect.bottom,selection);}
+let minDistX=worldMaxDist;let minDistY=Infinity;const pixWidth=dt.xViewVectorToWorld(1);const result={x:worldX,y:mouseY-modelTrackContainerRect.top,height:0,snapped:false};const eventBounds=new tr.b.math.Range();for(const event of selection){const track=viewport.trackForEvent(event);const trackRect=track.getBoundingClientRect();eventBounds.reset();event.addBoundsToRange(eventBounds);let eventX;if(Math.abs(eventBounds.min-worldX)<Math.abs(eventBounds.max-worldX)){eventX=eventBounds.min;}else{eventX=eventBounds.max;}
+const distX=eventX-worldX;const eventY=trackRect.top;const eventHeight=trackRect.height;const distY=Math.abs(eventY+eventHeight/2-mouseY);if((distX<=minDistX||Math.abs(distX-minDistX)<pixWidth)&&distY<minDistY){minDistX=distX;minDistY=distY;result.x=eventX;result.y=eventY+
+modelTrackContainer.scrollTop-modelTrackContainerRect.top;result.height=eventHeight;result.snapped=true;}}
+return result;}};return{TimingTool,};});'use strict';tr.exportTo('tr.ui',function(){const kDefaultPanAnimationDurationMs=100.0;const lerp=tr.b.math.lerp;function TimelineDisplayTransformPanAnimation(deltaX,deltaY,opt_durationMs){this.deltaX=deltaX;this.deltaY=deltaY;if(opt_durationMs===undefined){this.durationMs=kDefaultPanAnimationDurationMs;}else{this.durationMs=opt_durationMs;}
+this.startPanX=undefined;this.startPanY=undefined;this.startTimeMs=undefined;}
+TimelineDisplayTransformPanAnimation.prototype={__proto__:tr.ui.b.Animation.prototype,get affectsPanY(){return this.deltaY!==0;},canTakeOverFor(existingAnimation){return existingAnimation instanceof TimelineDisplayTransformPanAnimation;},takeOverFor(existing,timestamp,target){const remainingDeltaXOnExisting=existing.goalPanX-target.panX;const remainingDeltaYOnExisting=existing.goalPanY-target.panY;let remainingTimeOnExisting=timestamp-(existing.startTimeMs+existing.durationMs);remainingTimeOnExisting=Math.max(remainingTimeOnExisting,0);this.deltaX+=remainingDeltaXOnExisting;this.deltaY+=remainingDeltaYOnExisting;this.durationMs+=remainingTimeOnExisting;},start(timestamp,target){this.startTimeMs=timestamp;this.startPanX=target.panX;this.startPanY=target.panY;},tick(timestamp,target){let percentDone=(timestamp-this.startTimeMs)/this.durationMs;percentDone=tr.b.math.clamp(percentDone,0,1);target.panX=lerp(percentDone,this.startPanX,this.goalPanX);if(this.affectsPanY){target.panY=lerp(percentDone,this.startPanY,this.goalPanY);}
+return timestamp>=this.startTimeMs+this.durationMs;},get goalPanX(){return this.startPanX+this.deltaX;},get goalPanY(){return this.startPanY+this.deltaY;}};function TimelineDisplayTransformZoomToAnimation(goalFocalPointXWorld,goalFocalPointXView,goalFocalPointY,zoomInRatioX,opt_durationMs){this.goalFocalPointXWorld=goalFocalPointXWorld;this.goalFocalPointXView=goalFocalPointXView;this.goalFocalPointY=goalFocalPointY;this.zoomInRatioX=zoomInRatioX;if(opt_durationMs===undefined){this.durationMs=kDefaultPanAnimationDurationMs;}else{this.durationMs=opt_durationMs;}
+this.startTimeMs=undefined;this.startScaleX=undefined;this.goalScaleX=undefined;this.startPanY=undefined;}
+TimelineDisplayTransformZoomToAnimation.prototype={__proto__:tr.ui.b.Animation.prototype,get affectsPanY(){return this.startPanY!==this.goalFocalPointY;},canTakeOverFor(existingAnimation){return false;},takeOverFor(existingAnimation,timestamp,target){this.goalScaleX=target.scaleX*this.zoomInRatioX;},start(timestamp,target){this.startTimeMs=timestamp;this.startScaleX=target.scaleX;this.goalScaleX=this.zoomInRatioX*target.scaleX;this.startPanY=target.panY;},tick(timestamp,target){let percentDone=(timestamp-this.startTimeMs)/this.durationMs;percentDone=tr.b.math.clamp(percentDone,0,1);target.scaleX=lerp(percentDone,this.startScaleX,this.goalScaleX);if(this.affectsPanY){target.panY=lerp(percentDone,this.startPanY,this.goalFocalPointY);}
+target.xPanWorldPosToViewPos(this.goalFocalPointXWorld,this.goalFocalPointXView);return timestamp>=this.startTimeMs+this.durationMs;}};return{TimelineDisplayTransformPanAnimation,TimelineDisplayTransformZoomToAnimation,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const DrawType={GENERAL_EVENT:1,INSTANT_EVENT:2,BACKGROUND:3,GRID:4,FLOW_ARROWS:5,MARKERS:6,HIGHLIGHTS:7,ANNOTATIONS:8};const MAX_OVERSIZE_MULTIPLE=3.0;const REDRAW_SLOP=(MAX_OVERSIZE_MULTIPLE-1)/2;const DrawingContainer=tr.ui.b.define('drawing-container',tr.ui.tracks.Track);DrawingContainer.prototype={__proto__:tr.ui.tracks.Track.prototype,decorate(viewport){tr.ui.tracks.Track.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('drawing-container');this.canvas_=document.createElement('canvas');this.canvas_.className='drawing-container-canvas';this.canvas_.style.left=tr.ui.b.constants.HEADING_WIDTH+'px';Polymer.dom(this).appendChild(this.canvas_);this.ctx_=this.canvas_.getContext('2d');this.offsetY_=0;this.viewportChange_=this.viewportChange_.bind(this);this.viewport.addEventListener('change',this.viewportChange_);window.addEventListener('resize',this.windowResized_.bind(this));this.addEventListener('scroll',this.scrollChanged_.bind(this));},get canvas(){return this.canvas_;},context(){return this.ctx_;},viewportChange_(){this.invalidate();},windowResized_(){this.invalidate();},scrollChanged_(){if(this.updateOffsetY_()){this.invalidate();}},invalidate(){if(this.rafPending_)return;this.rafPending_=true;tr.b.requestPreAnimationFrame(this.preDraw_,this);},preDraw_(){this.rafPending_=false;this.updateCanvasSizeIfNeeded_();tr.b.requestAnimationFrameInThisFrameIfPossible(this.draw_,this);},draw_(){this.ctx_.clearRect(0,0,this.canvas_.width,this.canvas_.height);const typesToDraw=[DrawType.BACKGROUND,DrawType.HIGHLIGHTS,DrawType.GRID,DrawType.INSTANT_EVENT,DrawType.GENERAL_EVENT,DrawType.MARKERS,DrawType.ANNOTATIONS,DrawType.FLOW_ARROWS];for(const idx in typesToDraw){for(let i=0;i<this.children.length;++i){if(!(this.children[i]instanceof tr.ui.tracks.Track)){continue;}
+this.children[i].drawTrack(typesToDraw[idx]);}}
+const pixelRatio=window.devicePixelRatio||1;const bounds=this.canvas_.getBoundingClientRect();const dt=this.viewport.currentDisplayTransform;const viewLWorld=dt.xViewToWorld(0);const viewRWorld=dt.xViewToWorld(bounds.width*pixelRatio);this.viewport.drawGridLines(this.ctx_,viewLWorld,viewRWorld);},updateOffsetY_(){const maxYDelta=window.innerHeight*REDRAW_SLOP;let newOffset=this.scrollTop-maxYDelta;if(Math.abs(newOffset-this.offsetY_)<=maxYDelta)return false;const maxOffset=this.scrollHeight-
+this.canvas_.getBoundingClientRect().height;newOffset=Math.max(0,Math.min(newOffset,maxOffset));if(newOffset!==this.offsetY_){this.offsetY_=newOffset;return true;}
+return false;},updateCanvasSizeIfNeeded_(){const visibleChildTracks=tr.b.asArray(this.children).filter(this.visibleFilter_);if(visibleChildTracks.length===0){return;}
+const thisBounds=this.getBoundingClientRect();const firstChildTrackBounds=visibleChildTracks[0].getBoundingClientRect();const lastChildTrackBounds=visibleChildTracks[visibleChildTracks.length-1].getBoundingClientRect();const innerWidth=firstChildTrackBounds.width-
+tr.ui.b.constants.HEADING_WIDTH;const innerHeight=Math.min(lastChildTrackBounds.bottom-firstChildTrackBounds.top,Math.floor(window.innerHeight*MAX_OVERSIZE_MULTIPLE));const pixelRatio=window.devicePixelRatio||1;if(this.canvas_.width!==innerWidth*pixelRatio){this.canvas_.width=innerWidth*pixelRatio;this.canvas_.style.width=innerWidth+'px';}
+if(this.canvas_.height!==innerHeight*pixelRatio){this.canvas_.height=innerHeight*pixelRatio;this.canvas_.style.height=innerHeight+'px';}
+if(this.canvas_.top!==this.offsetY_){this.canvas_.top=this.offsetY_;this.canvas_.style.top=this.offsetY_+'px';}},visibleFilter_(element){if(!(element instanceof tr.ui.tracks.Track))return false;return window.getComputedStyle(element).display!=='none';},addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection){for(let i=0;i<this.children.length;++i){if(!(this.children[i]instanceof tr.ui.tracks.Track)){continue;}
+const trackClientRect=this.children[i].getBoundingClientRect();const a=Math.max(loY,trackClientRect.top);const b=Math.min(hiY,trackClientRect.bottom);if(a<=b){this.children[i].addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection);}}
+tr.ui.tracks.Track.prototype.addClosestEventToSelection.apply(this,arguments);},addEventsToTrackMap(eventToTrackMap){for(let i=0;i<this.children.length;++i){if(!(this.children[i]instanceof tr.ui.tracks.Track)){continue;}
+this.children[i].addEventsToTrackMap(eventToTrackMap);}}};return{DrawingContainer,DrawType,};});'use strict';tr.exportTo('tr.model',function(){const SelectableItem=tr.model.SelectableItem;const SelectionState=tr.model.SelectionState;function ProxySelectableItem(modelItem){SelectableItem.call(this,modelItem);}
+ProxySelectableItem.prototype={__proto__:SelectableItem.prototype,get selectionState(){const modelItem=this.modelItem_;if(modelItem===undefined){return SelectionState.NONE;}
+return modelItem.selectionState;}};return{ProxySelectableItem,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const EventPresenter=tr.ui.b.EventPresenter;const SelectionState=tr.model.SelectionState;const LetterDotTrack=tr.ui.b.define('letter-dot-track',tr.ui.tracks.Track);LetterDotTrack.prototype={__proto__:tr.ui.tracks.Track.prototype,decorate(viewport){tr.ui.tracks.Track.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('letter-dot-track');this.items_=undefined;this.heading_=document.createElement('tr-ui-b-heading');Polymer.dom(this).appendChild(this.heading_);},set heading(heading){this.heading_.heading=heading;},get heading(){return this.heading_.heading;},set tooltip(tooltip){this.heading_.tooltip=tooltip;},get items(){return this.items_;},set items(items){this.items_=items;this.invalidateDrawingContainer();},get height(){return window.getComputedStyle(this).height;},set height(height){this.style.height=height;},get dumpRadiusView(){return 7*(window.devicePixelRatio||1);},draw(type,viewLWorld,viewRWorld){if(this.items_===undefined)return;switch(type){case tr.ui.tracks.DrawType.GENERAL_EVENT:this.drawLetterDots_(viewLWorld,viewRWorld);break;}},drawLetterDots_(viewLWorld,viewRWorld){const ctx=this.context();const pixelRatio=window.devicePixelRatio||1;const bounds=this.getBoundingClientRect();const height=bounds.height*pixelRatio;const halfHeight=height*0.5;const twoPi=Math.PI*2;const dt=this.viewport.currentDisplayTransform;const dumpRadiusView=this.dumpRadiusView;const itemRadiusWorld=dt.xViewVectorToWorld(height);const items=this.items_;const loI=tr.b.math.findLowIndexInSortedArray(items,function(item){return item.start;},viewLWorld);const oldFont=ctx.font;ctx.font='400 '+Math.floor(9*pixelRatio)+'px Arial';ctx.strokeStyle='rgb(0,0,0)';ctx.textBaseline='middle';ctx.textAlign='center';const drawItems=function(selected){for(let i=loI;i<items.length;++i){const item=items[i];const x=item.start;if(x-itemRadiusWorld>viewRWorld)break;if(item.selected!==selected)continue;const xView=dt.xWorldToView(x);ctx.fillStyle=EventPresenter.getSelectableItemColorAsString(item);ctx.beginPath();ctx.arc(xView,halfHeight,dumpRadiusView+0.5,0,twoPi);ctx.fill();if(item.selected){ctx.lineWidth=3;ctx.strokeStyle='rgb(100,100,0)';ctx.stroke();ctx.beginPath();ctx.arc(xView,halfHeight,dumpRadiusView,0,twoPi);ctx.lineWidth=1.5;ctx.strokeStyle='rgb(255,255,0)';ctx.stroke();}else{ctx.lineWidth=1;ctx.strokeStyle='rgb(0,0,0)';ctx.stroke();}
+ctx.fillStyle='rgb(255, 255, 255)';ctx.fillText(item.dotLetter,xView,halfHeight);}};drawItems(false);drawItems(true);ctx.lineWidth=1;ctx.font=oldFont;},addEventsToTrackMap(eventToTrackMap){if(this.items_===undefined)return;this.items_.forEach(function(item){item.addToTrackMap(eventToTrackMap,this);},this);},addIntersectingEventsInRangeToSelectionInWorldSpace(loWX,hiWX,viewPixWidthWorld,selection){if(this.items_===undefined)return;const itemRadiusWorld=viewPixWidthWorld*this.dumpRadiusView;tr.b.math.iterateOverIntersectingIntervals(this.items_,function(x){return x.start-itemRadiusWorld;},function(x){return 2*itemRadiusWorld;},loWX,hiWX,function(item){item.addToSelection(selection);}.bind(this));},addEventNearToProvidedEventToSelection(event,offset,selection){if(this.items_===undefined)return;const items=this.items_;const index=tr.b.findFirstIndexInArray(items,function(item){return item.modelItem===event;});if(index===-1)return false;const newIndex=index+offset;if(newIndex>=0&&newIndex<items.length){items[newIndex].addToSelection(selection);return true;}
+return false;},addAllEventsMatchingFilterToSelection(filter,selection){},addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection){if(this.items_===undefined)return;const item=tr.b.math.findClosestElementInSortedArray(this.items_,function(x){return x.start;},worldX,worldMaxDist);if(!item)return;item.addToSelection(selection);}};function LetterDot(modelItem,dotLetter,colorId,start){tr.model.ProxySelectableItem.call(this,modelItem);this.dotLetter=dotLetter;this.colorId=colorId;this.start=start;}
+LetterDot.prototype={__proto__:tr.model.ProxySelectableItem.prototype};return{LetterDotTrack,LetterDot,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const AlertTrack=tr.ui.b.define('alert-track',tr.ui.tracks.LetterDotTrack);AlertTrack.prototype={__proto__:tr.ui.tracks.LetterDotTrack.prototype,decorate(viewport){tr.ui.tracks.LetterDotTrack.prototype.decorate.call(this,viewport);this.heading='Alerts';this.alerts_=undefined;},get alerts(){return this.alerts_;},set alerts(alerts){this.alerts_=alerts;if(alerts===undefined){this.items=undefined;return;}
+this.items=this.alerts_.map(function(alert){return new tr.ui.tracks.LetterDot(alert,String.fromCharCode(9888),alert.colorId,alert.start);});}};return{AlertTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const Task=tr.b.Task;const ContainerTrack=tr.ui.b.define('container-track',tr.ui.tracks.Track);ContainerTrack.prototype={__proto__:tr.ui.tracks.Track.prototype,decorate(viewport){tr.ui.tracks.Track.prototype.decorate.call(this,viewport);},detach(){Polymer.dom(this).textContent='';},get tracks_(){const tracks=[];for(let i=0;i<this.children.length;i++){if(this.children[i]instanceof tr.ui.tracks.Track){tracks.push(this.children[i]);}}
+return tracks;},drawTrack(type){this.tracks_.forEach(function(track){track.drawTrack(type);});},addIntersectingEventsInRangeToSelection(loVX,hiVX,loY,hiY,selection){for(let i=0;i<this.tracks_.length;i++){const trackClientRect=this.tracks_[i].getBoundingClientRect();const a=Math.max(loY,trackClientRect.top);const b=Math.min(hiY,trackClientRect.bottom);if(a<=b){this.tracks_[i].addIntersectingEventsInRangeToSelection(loVX,hiVX,loY,hiY,selection);}}
+tr.ui.tracks.Track.prototype.addIntersectingEventsInRangeToSelection.apply(this,arguments);},addEventsToTrackMap(eventToTrackMap){for(const track of this.tracks_){track.addEventsToTrackMap(eventToTrackMap);}},addAllEventsMatchingFilterToSelection(filter,selection){for(let i=0;i<this.tracks_.length;i++){this.tracks_[i].addAllEventsMatchingFilterToSelection(filter,selection);}},addAllEventsMatchingFilterToSelectionAsTask(filter,selection){const task=new Task();for(let i=0;i<this.tracks_.length;i++){task.subTask(function(i){return function(){this.tracks_[i].addAllEventsMatchingFilterToSelection(filter,selection);};}(i),this);}
+return task;},addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection){for(let i=0;i<this.tracks_.length;i++){const trackClientRect=this.tracks_[i].getBoundingClientRect();const a=Math.max(loY,trackClientRect.top);const b=Math.min(hiY,trackClientRect.bottom);if(a<=b){this.tracks_[i].addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection);}}
+tr.ui.tracks.Track.prototype.addClosestEventToSelection.apply(this,arguments);},addContainersToTrackMap(containerToTrackMap){this.tracks_.forEach(function(track){track.addContainersToTrackMap(containerToTrackMap);});},clearTracks_(){this.tracks_.forEach(function(track){Polymer.dom(this).removeChild(track);},this);}};return{ContainerTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){function ChartPoint(modelItem,x,y,opt_yBase){tr.model.ProxySelectableItem.call(this,modelItem);this.x=x;this.y=y;this.dotLetter=undefined;this.yBase=opt_yBase;}
+ChartPoint.prototype={__proto__:tr.model.ProxySelectableItem.prototype,};return{ChartPoint,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const ColorScheme=tr.b.ColorScheme;const EventPresenter=tr.ui.b.EventPresenter;const SelectionState=tr.model.SelectionState;const ChartSeriesType={LINE:0,AREA:1};const DEFAULT_RENDERING_CONFIG={chartType:ChartSeriesType.LINE,selectedPointSize:4,unselectedPointSize:3,solidSelectedDots:false,colorId:0,lineWidth:1,skipDistance:1,unselectedPointDensityTransparent:0.10,unselectedPointDensityOpaque:0.05,backgroundOpacity:0.5,stepGraph:true};const LAST_POINT_WIDTH=16;const DOT_LETTER_RADIUS_PX=7;const DOT_LETTER_RADIUS_PADDING_PX=0.5;const DOT_LETTER_SELECTED_OUTLINE_WIDTH_PX=3;const DOT_LETTER_SELECTED_OUTLINE_DETAIL_WIDTH_PX=1.5;const DOT_LETTER_UNSELECTED_OUTLINE_WIDTH_PX=1;const DOT_LETTER_FONT_WEIGHT=400;const DOT_LETTER_FONT_SIZE_PX=9;const DOT_LETTER_FONT='Arial';const ChartSeriesComponent={BACKGROUND:0,LINE:1,DOTS:2};function ChartSeries(points,seriesYAxis,opt_renderingConfig){this.points=points;this.seriesYAxis=seriesYAxis;this.useRenderingConfig_(opt_renderingConfig);}
+ChartSeries.prototype={useRenderingConfig_(opt_renderingConfig){const config=opt_renderingConfig||{};for(const[key,defaultValue]of
+Object.entries(DEFAULT_RENDERING_CONFIG)){let value=config[key];if(value===undefined){value=defaultValue;}
+this[key+'_']=value;}
+this.topPadding=this.bottomPadding=Math.max(this.selectedPointSize_,this.unselectedPointSize_)/2;},get range(){const range=new tr.b.math.Range();this.points.forEach(function(point){range.addValue(point.y);},this);return range;},draw(ctx,transform,highDetails){if(this.points===undefined||this.points.length===0){return;}
+if(this.chartType_===ChartSeriesType.AREA){this.drawComponent_(ctx,transform,ChartSeriesComponent.BACKGROUND,highDetails);}
+if(this.chartType_===ChartSeriesType.LINE||highDetails){this.drawComponent_(ctx,transform,ChartSeriesComponent.LINE,highDetails);}
+this.drawComponent_(ctx,transform,ChartSeriesComponent.DOTS,highDetails);},drawComponent_(ctx,transform,component,highDetails){let extraPixels=0;if(component===ChartSeriesComponent.DOTS){extraPixels=Math.max(this.selectedPointSize_,this.unselectedPointSize_);}
+const pixelRatio=transform.pixelRatio;const leftViewX=transform.leftViewX-extraPixels*pixelRatio;const rightViewX=transform.rightViewX+extraPixels*pixelRatio;const leftTimestamp=transform.leftTimestamp-extraPixels;const rightTimestamp=transform.rightTimestamp+extraPixels;const firstVisibleIndex=tr.b.math.findLowIndexInSortedArray(this.points,function(point){return point.x;},leftTimestamp);let lastVisibleIndex=tr.b.math.findLowIndexInSortedArray(this.points,function(point){return point.x;},rightTimestamp);if(lastVisibleIndex>=this.points.length||this.points[lastVisibleIndex].x>rightTimestamp){lastVisibleIndex--;}
+const viewSkipDistance=this.skipDistance_*pixelRatio;let selectedCircleRadius;let letterDotRadius;let squareSize;let squareHalfSize;let squareOpacity;let unselectedSeriesColor;let currentStateSeriesColor;ctx.save();ctx.font=DOT_LETTER_FONT_WEIGHT+' '+
+Math.floor(DOT_LETTER_FONT_SIZE_PX*pixelRatio)+'px '+
+DOT_LETTER_FONT;ctx.textBaseline='middle';ctx.textAlign='center';switch(component){case ChartSeriesComponent.DOTS:{selectedCircleRadius=(this.selectedPointSize_/2)*pixelRatio;letterDotRadius=Math.max(selectedCircleRadius,DOT_LETTER_RADIUS_PX*pixelRatio);squareSize=this.unselectedPointSize_*pixelRatio;squareHalfSize=squareSize/2;unselectedSeriesColor=EventPresenter.getCounterSeriesColor(this.colorId_,SelectionState.NONE);if(!highDetails){squareOpacity=0;break;}
+const visibleIndexRange=lastVisibleIndex-firstVisibleIndex;if(visibleIndexRange<=0){squareOpacity=1;break;}
+const visibleViewXRange=transform.worldXToViewX(this.points[lastVisibleIndex].x)-
+transform.worldXToViewX(this.points[firstVisibleIndex].x);if(visibleViewXRange===0){squareOpacity=1;break;}
+const density=visibleIndexRange/visibleViewXRange;const clampedDensity=tr.b.math.clamp(density,this.unselectedPointDensityOpaque_,this.unselectedPointDensityTransparent_);const densityRange=this.unselectedPointDensityTransparent_-
+this.unselectedPointDensityOpaque_;squareOpacity=(this.unselectedPointDensityTransparent_-clampedDensity)/densityRange;break;}
+case ChartSeriesComponent.LINE:ctx.strokeStyle=EventPresenter.getCounterSeriesColor(this.colorId_,SelectionState.NONE);ctx.lineWidth=this.lineWidth_*pixelRatio;break;case ChartSeriesComponent.BACKGROUND:break;default:throw new Error('Invalid component: '+component);}
+let previousViewX=undefined;let previousViewY=undefined;let previousViewYBase=undefined;let lastSelectionState=undefined;let baseSteps=undefined;const startIndex=Math.max(firstVisibleIndex-1,0);let currentViewX;for(let i=startIndex;i<this.points.length;i++){const currentPoint=this.points[i];currentViewX=transform.worldXToViewX(currentPoint.x);if(currentViewX>rightViewX){if(previousViewX!==undefined){previousViewX=currentViewX=rightViewX;if(component===ChartSeriesComponent.BACKGROUND||component===ChartSeriesComponent.LINE){ctx.lineTo(currentViewX,previousViewY);}}
+break;}
+if(i+1<this.points.length){const nextPoint=this.points[i+1];const nextViewX=transform.worldXToViewX(nextPoint.x);if(previousViewX!==undefined&&nextViewX-previousViewX<=viewSkipDistance&&nextViewX<rightViewX){continue;}
+if(currentViewX<leftViewX){currentViewX=leftViewX;}}
+if(previousViewX!==undefined&&currentViewX-previousViewX<viewSkipDistance){currentViewX=previousViewX+viewSkipDistance;}
+const currentViewY=Math.round(transform.worldYToViewY(currentPoint.y));let currentViewYBase;if(currentPoint.yBase===undefined){currentViewYBase=transform.outerBottomViewY;}else{currentViewYBase=Math.round(transform.worldYToViewY(currentPoint.yBase));}
+const currentSelectionState=currentPoint.selectionState;if(currentSelectionState!==lastSelectionState){const opacity=currentSelectionState===SelectionState.SELECTED?1:squareOpacity;currentStateSeriesColor=EventPresenter.getCounterSeriesColor(this.colorId_,currentSelectionState,opacity);}
+switch(component){case ChartSeriesComponent.DOTS:if(currentPoint.dotLetter){ctx.fillStyle=unselectedSeriesColor;ctx.strokeStyle=ColorScheme.getColorForReservedNameAsString('black');ctx.beginPath();ctx.arc(currentViewX,currentViewY,letterDotRadius+DOT_LETTER_RADIUS_PADDING_PX,0,2*Math.PI);ctx.fill();if(currentSelectionState===SelectionState.SELECTED){ctx.lineWidth=DOT_LETTER_SELECTED_OUTLINE_WIDTH_PX;ctx.strokeStyle=ColorScheme.getColorForReservedNameAsString('olive');ctx.stroke();ctx.beginPath();ctx.arc(currentViewX,currentViewY,letterDotRadius,0,2*Math.PI);ctx.lineWidth=DOT_LETTER_SELECTED_OUTLINE_DETAIL_WIDTH_PX;ctx.strokeStyle=ColorScheme.getColorForReservedNameAsString('yellow');ctx.stroke();}else{ctx.lineWidth=DOT_LETTER_UNSELECTED_OUTLINE_WIDTH_PX;ctx.strokeStyle=ColorScheme.getColorForReservedNameAsString('black');ctx.stroke();}
+ctx.fillStyle=ColorScheme.getColorForReservedNameAsString('white');ctx.fillText(currentPoint.dotLetter,currentViewX,currentViewY);}else{ctx.strokeStyle=unselectedSeriesColor;ctx.lineWidth=pixelRatio;if(currentSelectionState===SelectionState.SELECTED){if(this.solidSelectedDots_){ctx.fillStyle=ctx.strokeStyle;}else{ctx.fillStyle=currentStateSeriesColor;}
+ctx.beginPath();ctx.arc(currentViewX,currentViewY,selectedCircleRadius,0,2*Math.PI);ctx.fill();ctx.stroke();}else if(squareOpacity>0){ctx.fillStyle=currentStateSeriesColor;ctx.fillRect(currentViewX-squareHalfSize,currentViewY-squareHalfSize,squareSize,squareSize);}}
+break;case ChartSeriesComponent.LINE:if(previousViewX===undefined){ctx.beginPath();ctx.moveTo(currentViewX,currentViewY);}else if(this.stepGraph_){ctx.lineTo(currentViewX,previousViewY);}
+ctx.lineTo(currentViewX,currentViewY);break;case ChartSeriesComponent.BACKGROUND:if(previousViewX!==undefined&&this.stepGraph_){ctx.lineTo(currentViewX,previousViewY);}else{ctx.lineTo(currentViewX,currentViewY);}
+if(currentSelectionState!==lastSelectionState){if(previousViewX!==undefined){let previousBaseStepViewX=currentViewX;for(let j=baseSteps.length-1;j>=0;j--){const baseStep=baseSteps[j];const baseStepViewX=baseStep.viewX;const baseStepViewY=baseStep.viewY;ctx.lineTo(previousBaseStepViewX,baseStepViewY);ctx.lineTo(baseStepViewX,baseStepViewY);previousBaseStepViewX=baseStepViewX;}
+ctx.closePath();ctx.fill();}
+ctx.beginPath();ctx.fillStyle=EventPresenter.getCounterSeriesColor(this.colorId_,currentSelectionState,this.backgroundOpacity_);ctx.moveTo(currentViewX,currentViewYBase);baseSteps=[];}
+if(currentViewYBase!==previousViewYBase||currentSelectionState!==lastSelectionState){baseSteps.push({viewX:currentViewX,viewY:currentViewYBase});}
+ctx.lineTo(currentViewX,currentViewY);break;default:throw new Error('Not reachable');}
+previousViewX=currentViewX;previousViewY=currentViewY;previousViewYBase=currentViewYBase;lastSelectionState=currentSelectionState;}
+if(previousViewX!==undefined){switch(component){case ChartSeriesComponent.DOTS:break;case ChartSeriesComponent.LINE:ctx.stroke();break;case ChartSeriesComponent.BACKGROUND:{let previousBaseStepViewX=currentViewX;for(let j=baseSteps.length-1;j>=0;j--){const baseStep=baseSteps[j];const baseStepViewX=baseStep.viewX;const baseStepViewY=baseStep.viewY;ctx.lineTo(previousBaseStepViewX,baseStepViewY);ctx.lineTo(baseStepViewX,baseStepViewY);previousBaseStepViewX=baseStepViewX;}
+ctx.closePath();ctx.fill();break;}
+default:throw new Error('Not reachable');}}
+ctx.restore();},addIntersectingEventsInRangeToSelectionInWorldSpace(loWX,hiWX,viewPixWidthWorld,selection){const points=this.points;function getPointWidth(point,i){if(i===points.length-1){return LAST_POINT_WIDTH*viewPixWidthWorld;}
+const nextPoint=points[i+1];return nextPoint.x-point.x;}
+function selectPoint(point){point.addToSelection(selection);}
+tr.b.math.iterateOverIntersectingIntervals(this.points,function(point){return point.x;},getPointWidth,loWX,hiWX,selectPoint);},addEventNearToProvidedEventToSelection(event,offset,selection){if(this.points===undefined)return false;const index=tr.b.findFirstIndexInArray(this.points,function(point){return point.modelItem===event;},this);if(index===-1)return false;const newIndex=index+offset;if(newIndex<0||newIndex>=this.points.length)return false;this.points[newIndex].addToSelection(selection);return true;},addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection){if(this.points===undefined)return;const item=tr.b.math.findClosestElementInSortedArray(this.points,function(point){return point.x;},worldX,worldMaxDist);if(!item)return;item.addToSelection(selection);}};return{ChartSeries,ChartSeriesType,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const ColorScheme=tr.b.ColorScheme;const IDEAL_MAJOR_MARK_HEIGHT_PX=30;const AXIS_LABLE_MARGIN_PX=10;const AXIS_LABLE_FONT_SIZE_PX=9;const AXIS_LABLE_FONT='Arial';function ChartSeriesYAxis(opt_min,opt_max){this.guid_=tr.b.GUID.allocateSimple();this.bounds=new tr.b.math.Range();if(opt_min!==undefined)this.bounds.addValue(opt_min);if(opt_max!==undefined)this.bounds.addValue(opt_max);}
+ChartSeriesYAxis.prototype={get guid(){return this.guid_;},valueToUnitRange(value){if(this.bounds.isEmpty){throw new Error('Chart series y-axis bounds are empty');}
+const bounds=this.bounds;if(bounds.range===0)return 0;return(value-bounds.min)/bounds.range;},unitRangeToValue(unitRange){if(this.bounds.isEmpty){throw new Error('Chart series y-axis bounds are empty');}
+return unitRange*this.bounds.range+this.bounds.min;},autoSetFromSeries(series,opt_config){const range=new tr.b.math.Range();series.forEach(function(s){range.addRange(s.range);},this);this.autoSetFromRange(range,opt_config);},autoSetFromRange(range,opt_config){if(range.isEmpty)return;const bounds=this.bounds;if(bounds.isEmpty){bounds.addRange(range);return;}
+if(!opt_config)return;const useRangeMin=(opt_config.expandMin&&range.min<bounds.min||opt_config.shrinkMin&&range.min>bounds.min);const useRangeMax=(opt_config.expandMax&&range.max>bounds.max||opt_config.shrinkMax&&range.max<bounds.max);if(!useRangeMin&&!useRangeMax)return;if(useRangeMin&&useRangeMax){bounds.min=range.min;bounds.max=range.max;return;}
+if(useRangeMin){bounds.min=Math.min(range.min,bounds.max);}else{bounds.max=Math.max(range.max,bounds.min);}},majorMarkHeightWorld_(transform,pixelRatio){const idealMajorMarkHeightPx=IDEAL_MAJOR_MARK_HEIGHT_PX*pixelRatio;const idealMajorMarkHeightWorld=transform.vectorToWorldDistance(idealMajorMarkHeightPx);return tr.b.math.preferredNumberLargerThanMin(idealMajorMarkHeightWorld);},draw(ctx,transform,showYAxisLabels,showYGridLines){if(!showYAxisLabels&&!showYGridLines)return;const pixelRatio=transform.pixelRatio;const viewTop=transform.outerTopViewY;const worldTop=transform.viewYToWorldY(viewTop);const viewBottom=transform.outerBottomViewY;const viewHeight=viewBottom-viewTop;const viewLeft=transform.leftViewX;const viewRight=transform.rightViewX;const labelLeft=transform.leftYLabel;ctx.save();ctx.lineWidth=pixelRatio;ctx.fillStyle=ColorScheme.getColorForReservedNameAsString('black');ctx.textAlign='left';ctx.textBaseline='center';ctx.font=(AXIS_LABLE_FONT_SIZE_PX*pixelRatio)+'px '+AXIS_LABLE_FONT;ctx.beginPath();ctx.strokeStyle=ColorScheme.getColorForReservedNameAsString('black');tr.ui.b.drawLine(ctx,viewLeft,viewTop,viewLeft,viewBottom,viewLeft);ctx.stroke();ctx.closePath();ctx.beginPath();ctx.strokeStyle=ColorScheme.getColorForReservedNameAsString('grey');const majorMarkHeight=this.majorMarkHeightWorld_(transform,pixelRatio);const maxMajorMark=Math.max(transform.viewYToWorldY(viewTop),Math.abs(transform.viewYToWorldY(viewBottom)));for(let curWorldY=0;curWorldY<=maxMajorMark;curWorldY+=majorMarkHeight){const roundedUnitValue=Math.floor(curWorldY*1000000)/1000000;const curViewYPositive=transform.worldYToViewY(curWorldY);if(curViewYPositive>=viewTop){if(showYAxisLabels){ctx.fillText(roundedUnitValue,viewLeft+AXIS_LABLE_MARGIN_PX,curViewYPositive-AXIS_LABLE_MARGIN_PX);}
+if(showYGridLines){tr.ui.b.drawLine(ctx,viewLeft,curViewYPositive,viewRight,curViewYPositive);}}
+const curViewYNegative=transform.worldYToViewY(-1*curWorldY);if(curViewYNegative<=viewBottom){if(showYAxisLabels){ctx.fillText(roundedUnitValue,viewLeft+AXIS_LABLE_MARGIN_PX,curViewYNegative-AXIS_LABLE_MARGIN_PX);}
+if(showYGridLines){tr.ui.b.drawLine(ctx,viewLeft,curViewYNegative,viewRight,curViewYNegative);}}}
+ctx.stroke();ctx.restore();}};return{ChartSeriesYAxis,};});'use strict';tr.exportTo('tr.ui.tracks',function(){function ChartTransform(displayTransform,axis,trackWidth,trackHeight,topPadding,bottomPadding,pixelRatio){this.pixelRatio=pixelRatio;this.leftViewX=0;this.rightViewX=trackWidth;this.leftTimestamp=displayTransform.xViewToWorld(this.leftViewX);this.rightTimestamp=displayTransform.xViewToWorld(this.rightViewX);this.displayTransform_=displayTransform;this.outerTopViewY=0;this.innerTopViewY=topPadding;this.innerBottomViewY=trackHeight-bottomPadding;this.outerBottomViewY=trackHeight;this.axis_=axis;this.innerHeight_=this.innerBottomViewY-this.innerTopViewY;}
+ChartTransform.prototype={worldXToViewX(worldX){return this.displayTransform_.xWorldToView(worldX);},viewXToWorldX(viewX){return this.displayTransform_.xViewToWorld(viewX);},vectorToWorldDistance(viewY){return this.axis_.bounds.range*Math.abs(viewY/this.innerHeight_);},viewYToWorldY(viewY){return this.axis_.unitRangeToValue(1-(viewY-this.innerTopViewY)/this.innerHeight_);},worldYToViewY(worldY){const innerHeightCoefficient=1-this.axis_.valueToUnitRange(worldY);return innerHeightCoefficient*this.innerHeight_+this.innerTopViewY;}};return{ChartTransform,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const ChartTrack=tr.ui.b.define('chart-track',tr.ui.tracks.Track);ChartTrack.prototype={__proto__:tr.ui.tracks.Track.prototype,decorate(viewport){tr.ui.tracks.Track.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('chart-track');this.series_=undefined;this.axes_=undefined;this.axisGuidToAxisData_=undefined;this.topPadding_=undefined;this.bottomPadding_=undefined;this.showYAxisLabels_=undefined;this.showGridLines_=undefined;this.heading_=document.createElement('tr-ui-b-heading');Polymer.dom(this).appendChild(this.heading_);},set heading(heading){this.heading_.heading=heading;},get heading(){return this.heading_.heading;},set tooltip(tooltip){this.heading_.tooltip=tooltip;},get series(){return this.series_;},set series(series){this.series_=series;this.calculateAxisDataAndPadding_();this.invalidateDrawingContainer();},get height(){return window.getComputedStyle(this).height;},set height(height){this.style.height=height;this.invalidateDrawingContainer();},get showYAxisLabels(){return this.showYAxisLabels_;},set showYAxisLabels(showYAxisLabels){this.showYAxisLabels_=showYAxisLabels;this.invalidateDrawingContainer();},get showGridLines(){return this.showGridLines_;},set showGridLines(showGridLines){this.showGridLines_=showGridLines;this.invalidateDrawingContainer();},get hasVisibleContent(){return!!this.series&&this.series.length>0;},calculateAxisDataAndPadding_(){if(!this.series_){this.axes_=undefined;this.axisGuidToAxisData_=undefined;this.topPadding_=undefined;this.bottomPadding_=undefined;return;}
+const axisGuidToAxisData={};let topPadding=0;let bottomPadding=0;this.series_.forEach(function(series){const seriesYAxis=series.seriesYAxis;const axisGuid=seriesYAxis.guid;if(!(axisGuid in axisGuidToAxisData)){axisGuidToAxisData[axisGuid]={axis:seriesYAxis,series:[]};if(!this.axes_)this.axes_=[];this.axes_.push(seriesYAxis);}
+axisGuidToAxisData[axisGuid].series.push(series);topPadding=Math.max(topPadding,series.topPadding);bottomPadding=Math.max(bottomPadding,series.bottomPadding);},this);this.axisGuidToAxisData_=axisGuidToAxisData;this.topPadding_=topPadding;this.bottomPadding_=bottomPadding;},draw(type,viewLWorld,viewRWorld){switch(type){case tr.ui.tracks.DrawType.GENERAL_EVENT:this.drawChart_(viewLWorld,viewRWorld);break;}},drawChart_(viewLWorld,viewRWorld){if(!this.series_)return;const ctx=this.context();const displayTransform=this.viewport.currentDisplayTransform;const pixelRatio=window.devicePixelRatio||1;const bounds=this.getBoundingClientRect();const highDetails=this.viewport.highDetails;const width=bounds.width*pixelRatio;const height=bounds.height*pixelRatio;const topPadding=this.topPadding_*pixelRatio;const bottomPadding=this.bottomPadding_*pixelRatio;ctx.save();ctx.beginPath();ctx.rect(0,0,width,height);ctx.clip();if(this.axes_){if((this.showGridLines_||this.showYAxisLabels_)&&this.axes_.length>1){throw new Error('Only one axis allowed when showing grid lines.');}
+for(const yAxis of this.axes_){const chartTransform=new tr.ui.tracks.ChartTransform(displayTransform,yAxis,width,height,topPadding,bottomPadding,pixelRatio);yAxis.draw(ctx,chartTransform,this.showYAxisLabels_,this.showGridLines_);}}
+for(const series of this.series){const chartTransform=new tr.ui.tracks.ChartTransform(displayTransform,series.seriesYAxis,width,height,topPadding,bottomPadding,pixelRatio);series.draw(ctx,chartTransform,highDetails);}
+ctx.restore();},addEventsToTrackMap(eventToTrackMap){this.series_.forEach(function(series){series.points.forEach(function(point){point.addToTrackMap(eventToTrackMap,this);},this);},this);},addIntersectingEventsInRangeToSelectionInWorldSpace(loWX,hiWX,viewPixWidthWorld,selection){this.series_.forEach(function(series){series.addIntersectingEventsInRangeToSelectionInWorldSpace(loWX,hiWX,viewPixWidthWorld,selection);},this);},addEventNearToProvidedEventToSelection(event,offset,selection){let foundItem=false;this.series_.forEach(function(series){foundItem=foundItem||series.addEventNearToProvidedEventToSelection(event,offset,selection);},this);return foundItem;},addAllEventsMatchingFilterToSelection(filter,selection){},addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection){this.series_.forEach(function(series){series.addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection);},this);},autoSetAllAxes(opt_config){for(const axisData of Object.values(this.axisGuidToAxisData_)){const seriesYAxis=axisData.axis;const series=axisData.series;seriesYAxis.autoSetFromSeries(series,opt_config);}},autoSetAxis(seriesYAxis,opt_config){const series=this.axisGuidToAxisData_[seriesYAxis.guid].series;seriesYAxis.autoSetFromSeries(series,opt_config);}};return{ChartTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const ColorScheme=tr.b.ColorScheme;const ChartTrack=tr.ui.tracks.ChartTrack;const CpuUsageTrack=tr.ui.b.define('cpu-usage-track',ChartTrack);CpuUsageTrack.prototype={__proto__:ChartTrack.prototype,decorate(viewport){ChartTrack.prototype.decorate.call(this,viewport);this.classList.add('cpu-usage-track');this.heading='CPU usage';this.cpuUsageSeries_=undefined;},initialize(model){if(model!==undefined){this.cpuUsageSeries_=model.device.cpuUsageSeries;}else{this.cpuUsageSeries_=undefined;}
+this.series=this.buildChartSeries_();this.autoSetAllAxes({expandMax:true});},get hasVisibleContent(){return!!this.cpuUsageSeries_&&this.cpuUsageSeries_.samples.length>0;},addContainersToTrackMap(containerToTrackMap){containerToTrackMap.addContainer(this.series_,this);},buildChartSeries_(yAxis,color){if(!this.hasVisibleContent)return[];yAxis=new tr.ui.tracks.ChartSeriesYAxis(0,undefined);const usageSamples=this.cpuUsageSeries_.samples;const pts=new Array(usageSamples.length+1);for(let i=0;i<usageSamples.length;i++){pts[i]=new tr.ui.tracks.ChartPoint(undefined,usageSamples[i].start,usageSamples[i].usage);}
+pts[usageSamples.length]=new tr.ui.tracks.ChartPoint(undefined,usageSamples[usageSamples.length-1].start,0);const renderingConfig={chartType:tr.ui.tracks.ChartSeriesType.AREA,colorId:color};return[new tr.ui.tracks.ChartSeries(pts,yAxis,renderingConfig)];},};return{CpuUsageTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const ColorScheme=tr.b.ColorScheme;const ChartTrack=tr.ui.tracks.ChartTrack;const PowerSeriesTrack=tr.ui.b.define('power-series-track',ChartTrack);PowerSeriesTrack.prototype={__proto__:ChartTrack.prototype,decorate(viewport){ChartTrack.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('power-series-track');this.heading='Power';this.powerSeries_=undefined;},set powerSeries(powerSeries){this.powerSeries_=powerSeries;this.series=this.buildChartSeries_();this.autoSetAllAxes({expandMax:true});},get hasVisibleContent(){return(this.powerSeries_&&this.powerSeries_.samples.length>0);},addContainersToTrackMap(containerToTrackMap){containerToTrackMap.addContainer(this.powerSeries_,this);},buildChartSeries_(){if(!this.hasVisibleContent)return[];const seriesYAxis=new tr.ui.tracks.ChartSeriesYAxis(0,undefined);const pts=this.powerSeries_.samples.map(function(smpl){return new tr.ui.tracks.ChartPoint(smpl,smpl.start,smpl.powerInW);});const renderingConfig={chartType:tr.ui.tracks.ChartSeriesType.AREA,colorId:ColorScheme.getColorIdForGeneralPurposeString(this.heading)};return[new tr.ui.tracks.ChartSeries(pts,seriesYAxis,renderingConfig)];}};return{PowerSeriesTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const SpacingTrack=tr.ui.b.define('spacing-track',tr.ui.tracks.Track);SpacingTrack.prototype={__proto__:tr.ui.tracks.Track.prototype,decorate(viewport){tr.ui.tracks.Track.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('spacing-track');this.heading_=document.createElement('tr-ui-b-heading');Polymer.dom(this).appendChild(this.heading_);},addAllEventsMatchingFilterToSelection(filter,selection){}};return{SpacingTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const ContainerTrack=tr.ui.tracks.ContainerTrack;const DeviceTrack=tr.ui.b.define('device-track',ContainerTrack);DeviceTrack.prototype={__proto__:ContainerTrack.prototype,decorate(viewport){ContainerTrack.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('device-track');this.device_=undefined;this.powerSeriesTrack_=undefined;},get device(){return this.device_;},set device(device){this.device_=device;this.updateContents_();},get powerSeriesTrack(){return this.powerSeriesTrack_;},get hasVisibleContent(){return(this.powerSeriesTrack_&&this.powerSeriesTrack_.hasVisibleContent);},addContainersToTrackMap(containerToTrackMap){tr.ui.tracks.ContainerTrack.prototype.addContainersToTrackMap.call(this,containerToTrackMap);containerToTrackMap.addContainer(this.device,this);},addEventsToTrackMap(eventToTrackMap){this.tracks_.forEach(function(track){track.addEventsToTrackMap(eventToTrackMap);});},appendPowerSeriesTrack_(){this.powerSeriesTrack_=new tr.ui.tracks.PowerSeriesTrack(this.viewport);this.powerSeriesTrack_.powerSeries=this.device.powerSeries;if(this.powerSeriesTrack_.hasVisibleContent){Polymer.dom(this).appendChild(this.powerSeriesTrack_);Polymer.dom(this).appendChild(new tr.ui.tracks.SpacingTrack(this.viewport));}},updateContents_(){this.clearTracks_();this.appendPowerSeriesTrack_();}};return{DeviceTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const ColorScheme=tr.b.ColorScheme;const DISPLAYED_SIZE_NUMERIC_NAME=tr.model.MemoryAllocatorDump.DISPLAYED_SIZE_NUMERIC_NAME;const BACKGROUND=tr.model.ContainerMemoryDump.LevelOfDetail.BACKGROUND;const LIGHT=tr.model.ContainerMemoryDump.LevelOfDetail.LIGHT;const DETAILED=tr.model.ContainerMemoryDump.LevelOfDetail.DETAILED;function extractGlobalMemoryDumpUsedSizes(globalMemoryDump,addSize){for(const[pid,pmd]of
+Object.entries(globalMemoryDump.processMemoryDumps)){const mostRecentVmRegions=pmd.mostRecentVmRegions;if(mostRecentVmRegions===undefined)continue;addSize(pid,mostRecentVmRegions.byteStats.proportionalResident||0,pmd.process.userFriendlyName);}}
+function extractProcessMemoryDumpAllocatorSizes(processMemoryDump,addSize){const allocatorDumps=processMemoryDump.memoryAllocatorDumps;if(allocatorDumps===undefined)return;allocatorDumps.forEach(function(allocatorDump){if(allocatorDump.fullName==='tracing')return;const allocatorSize=allocatorDump.numerics[DISPLAYED_SIZE_NUMERIC_NAME];if(allocatorSize===undefined)return;const allocatorSizeValue=allocatorSize.value;if(allocatorSizeValue===undefined)return;addSize(allocatorDump.fullName,allocatorSizeValue);});}
+function extractGlobalMemoryDumpAllocatorSizes(globalMemoryDump,addSize){for(const pmd of Object.values(globalMemoryDump.processMemoryDumps)){extractProcessMemoryDumpAllocatorSizes(pmd,addSize);}}
+function buildMemoryChartSeries(memoryDumps,dumpSizeExtractor){const dumpCount=memoryDumps.length;const idToTimestampToPoint={};const idToName={};memoryDumps.forEach(function(dump,index){dumpSizeExtractor(dump,function addSize(id,size,opt_name){let timestampToPoint=idToTimestampToPoint[id];if(timestampToPoint===undefined){idToTimestampToPoint[id]=timestampToPoint=new Array(dumpCount);for(let i=0;i<dumpCount;i++){const modelItem=memoryDumps[i];timestampToPoint[i]=new tr.ui.tracks.ChartPoint(modelItem,modelItem.start,0);}}
+timestampToPoint[index].y+=size;if(opt_name!==undefined)idToName[id]=opt_name;});});const ids=Object.keys(idToTimestampToPoint);if(ids.length===0)return undefined;ids.sort();for(let i=0;i<dumpCount;i++){let baseSize=0;for(let j=ids.length-1;j>=0;j--){const point=idToTimestampToPoint[ids[j]][i];point.yBase=baseSize;point.y+=baseSize;baseSize=point.y;}}
+const seriesYAxis=new tr.ui.tracks.ChartSeriesYAxis(0);const series=ids.map(function(id){const colorId=ColorScheme.getColorIdForGeneralPurposeString(idToName[id]||id);const renderingConfig={chartType:tr.ui.tracks.ChartSeriesType.AREA,colorId,backgroundOpacity:0.8};return new tr.ui.tracks.ChartSeries(idToTimestampToPoint[id],seriesYAxis,renderingConfig);});series.reverse();return series;}
+function buildMemoryLetterDots(memoryDumps){const backgroundMemoryColorId=ColorScheme.getColorIdForReservedName('background_memory_dump');const lightMemoryColorId=ColorScheme.getColorIdForReservedName('light_memory_dump');const detailedMemoryColorId=ColorScheme.getColorIdForReservedName('detailed_memory_dump');return memoryDumps.map(function(memoryDump){let memoryColorId;switch(memoryDump.levelOfDetail){case BACKGROUND:memoryColorId=backgroundMemoryColorId;break;case DETAILED:memoryColorId=detailedMemoryColorId;break;case LIGHT:default:memoryColorId=lightMemoryColorId;}
+return new tr.ui.tracks.LetterDot(memoryDump,'M',memoryColorId,memoryDump.start);});}
+function buildGlobalUsedMemoryChartSeries(globalMemoryDumps){return buildMemoryChartSeries(globalMemoryDumps,extractGlobalMemoryDumpUsedSizes);}
+function buildProcessAllocatedMemoryChartSeries(processMemoryDumps){return buildMemoryChartSeries(processMemoryDumps,extractProcessMemoryDumpAllocatorSizes);}
+function buildGlobalAllocatedMemoryChartSeries(globalMemoryDumps){return buildMemoryChartSeries(globalMemoryDumps,extractGlobalMemoryDumpAllocatorSizes);}
+return{buildMemoryLetterDots,buildGlobalUsedMemoryChartSeries,buildProcessAllocatedMemoryChartSeries,buildGlobalAllocatedMemoryChartSeries,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const USED_MEMORY_TRACK_HEIGHT=50;const ALLOCATED_MEMORY_TRACK_HEIGHT=50;const GlobalMemoryDumpTrack=tr.ui.b.define('global-memory-dump-track',tr.ui.tracks.ContainerTrack);GlobalMemoryDumpTrack.prototype={__proto__:tr.ui.tracks.ContainerTrack.prototype,decorate(viewport){tr.ui.tracks.ContainerTrack.prototype.decorate.call(this,viewport);this.memoryDumps_=undefined;},get memoryDumps(){return this.memoryDumps_;},set memoryDumps(memoryDumps){this.memoryDumps_=memoryDumps;this.updateContents_();},updateContents_(){this.clearTracks_();if(!this.memoryDumps_||!this.memoryDumps_.length)return;this.appendDumpDotsTrack_();this.appendUsedMemoryTrack_();this.appendAllocatedMemoryTrack_();},appendDumpDotsTrack_(){const items=tr.ui.tracks.buildMemoryLetterDots(this.memoryDumps_);if(!items)return;const track=new tr.ui.tracks.LetterDotTrack(this.viewport);track.heading='Memory Dumps';track.items=items;Polymer.dom(this).appendChild(track);},appendUsedMemoryTrack_(){const series=tr.ui.tracks.buildGlobalUsedMemoryChartSeries(this.memoryDumps_);if(!series)return;const track=new tr.ui.tracks.ChartTrack(this.viewport);track.heading='Memory per process';track.height=USED_MEMORY_TRACK_HEIGHT+'px';track.series=series;track.autoSetAllAxes({expandMax:true});Polymer.dom(this).appendChild(track);},appendAllocatedMemoryTrack_(){const series=tr.ui.tracks.buildGlobalAllocatedMemoryChartSeries(this.memoryDumps_);if(!series)return;const track=new tr.ui.tracks.ChartTrack(this.viewport);track.heading='Memory per component';track.height=ALLOCATED_MEMORY_TRACK_HEIGHT+'px';track.series=series;track.autoSetAllAxes({expandMax:true});Polymer.dom(this).appendChild(track);}};return{GlobalMemoryDumpTrack,};});'use strict';tr.exportTo('tr.ui.b',function(){function FastRectRenderer(ctx,minRectSize,maxMergeDist,pallette){this.ctx_=ctx;this.minRectSize_=minRectSize;this.maxMergeDist_=maxMergeDist;this.pallette_=pallette;}
+FastRectRenderer.prototype={y_:0,h_:0,merging_:false,mergeStartX_:0,mergeCurRight_:0,mergedColorId_:0,mergedAlpha_:0,setYandH(y,h){if(this.y_===y&&this.h_===h){return;}
+this.flush();this.y_=y;this.h_=h;},fillRect(x,w,colorId,alpha){const r=x+w;if(w<this.minRectSize_){if(r-this.mergeStartX_>this.maxMergeDist_){this.flush();}
+if(!this.merging_){this.merging_=true;this.mergeStartX_=x;this.mergeCurRight_=r;this.mergedColorId_=colorId;this.mergedAlpha_=alpha;}else{this.mergeCurRight_=r;if(this.mergedAlpha_<alpha||(this.mergedAlpha_===alpha&&this.mergedColorId_<colorId)){this.mergedAlpha_=alpha;this.mergedColorId_=colorId;}}}else{if(this.merging_){this.flush();}
+this.ctx_.fillStyle=this.pallette_[colorId];this.ctx_.globalAlpha=alpha;this.ctx_.fillRect(x,this.y_,w,this.h_);}},flush(){if(this.merging_){this.ctx_.fillStyle=this.pallette_[this.mergedColorId_];this.ctx_.globalAlpha=this.mergedAlpha_;this.ctx_.fillRect(this.mergeStartX_,this.y_,this.mergeCurRight_-this.mergeStartX_,this.h_);this.merging_=false;}}};return{FastRectRenderer,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const RectTrack=tr.ui.b.define('rect-track',tr.ui.tracks.Track);RectTrack.prototype={__proto__:tr.ui.tracks.Track.prototype,decorate(viewport){tr.ui.tracks.Track.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('rect-track');this.asyncStyle_=false;this.rects_=null;this.heading_=document.createElement('tr-ui-b-heading');Polymer.dom(this).appendChild(this.heading_);},set heading(heading){this.heading_.heading=heading;},get heading(){return this.heading_.heading;},set tooltip(tooltip){this.heading_.tooltip=tooltip;},set selectionGenerator(generator){this.heading_.selectionGenerator=generator;},set expanded(expanded){this.heading_.expanded=!!expanded;},set arrowVisible(arrowVisible){this.heading_.arrowVisible=!!arrowVisible;},get expanded(){return this.heading_.expanded;},get asyncStyle(){return this.asyncStyle_;},set asyncStyle(v){this.asyncStyle_=!!v;},get rects(){return this.rects_;},set rects(rects){this.rects_=rects||[];this.invalidateDrawingContainer();},get height(){return window.getComputedStyle(this).height;},set height(height){this.style.height=height;this.invalidateDrawingContainer();},get hasVisibleContent(){return this.rects_.length>0;},draw(type,viewLWorld,viewRWorld){switch(type){case tr.ui.tracks.DrawType.GENERAL_EVENT:this.drawRects_(viewLWorld,viewRWorld);break;}},drawRects_(viewLWorld,viewRWorld){const ctx=this.context();ctx.save();const bounds=this.getBoundingClientRect();tr.ui.b.drawSlices(ctx,this.viewport.currentDisplayTransform,viewLWorld,viewRWorld,bounds.height,this.rects_,this.asyncStyle_);ctx.restore();if(bounds.height<=6)return;let fontSize;let yOffset;if(bounds.height<15){fontSize=6;yOffset=1.0;}else{fontSize=10;yOffset=2.5;}
+tr.ui.b.drawLabels(ctx,this.viewport.currentDisplayTransform,viewLWorld,viewRWorld,this.rects_,this.asyncStyle_,fontSize,yOffset);},addEventsToTrackMap(eventToTrackMap){if(this.rects_===undefined||this.rects_===null){return;}
+this.rects_.forEach(function(rect){rect.addToTrackMap(eventToTrackMap,this);},this);},addIntersectingEventsInRangeToSelectionInWorldSpace(loWX,hiWX,viewPixWidthWorld,selection){function onRect(rect){rect.addToSelection(selection);}
+onRect=onRect.bind(this);const instantEventWidth=2*viewPixWidthWorld;tr.b.math.iterateOverIntersectingIntervals(this.rects_,function(x){return x.start;},function(x){return x.duration===0?x.duration+instantEventWidth:x.duration;},loWX,hiWX,onRect);},addEventNearToProvidedEventToSelection(event,offset,selection){const index=tr.b.findFirstIndexInArray(this.rects_,function(rect){return rect.modelItem===event;});if(index===-1)return false;const newIndex=index+offset;if(newIndex<0||newIndex>=this.rects_.length)return false;this.rects_[newIndex].addToSelection(selection);return true;},addAllEventsMatchingFilterToSelection(filter,selection){for(let i=0;i<this.rects_.length;++i){const modelItem=this.rects_[i].modelItem;if(!modelItem)continue;if(filter.matchSlice(modelItem)){selection.push(modelItem);}}},addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection){const rect=tr.b.math.findClosestIntervalInSortedIntervals(this.rects_,function(x){return x.start;},function(x){return x.end;},worldX,worldMaxDist);if(!rect)return;rect.addToSelection(selection);}};function Rect(modelItem,title,colorId,start,duration){tr.model.ProxySelectableItem.call(this,modelItem);this.title=title;this.colorId=colorId;this.start=start;this.duration=duration;this.end=start+duration;}
+Rect.prototype={__proto__:tr.model.ProxySelectableItem.prototype};return{RectTrack,Rect,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const SliceTrack=tr.ui.b.define('slice-track',tr.ui.tracks.RectTrack);SliceTrack.prototype={__proto__:tr.ui.tracks.RectTrack.prototype,decorate(viewport){tr.ui.tracks.RectTrack.prototype.decorate.call(this,viewport);},get slices(){return this.rects;},set slices(slices){this.rects=slices;}};return{SliceTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const CpuTrack=tr.ui.b.define('cpu-track',tr.ui.tracks.ContainerTrack);CpuTrack.prototype={__proto__:tr.ui.tracks.ContainerTrack.prototype,decorate(viewport){tr.ui.tracks.ContainerTrack.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('cpu-track');this.detailedMode_=true;},get cpu(){return this.cpu_;},set cpu(cpu){this.cpu_=cpu;this.updateContents_();},get detailedMode(){return this.detailedMode_;},set detailedMode(detailedMode){this.detailedMode_=detailedMode;this.updateContents_();},get tooltip(){return this.tooltip_;},set tooltip(value){this.tooltip_=value;this.updateContents_();},get hasVisibleContent(){if(this.cpu_===undefined)return false;const cpu=this.cpu_;if(cpu.slices.length)return true;if(cpu.samples&&cpu.samples.length)return true;if(Object.keys(cpu.counters).length>0)return true;return false;},updateContents_(){this.detach();if(!this.cpu_)return;const slices=this.cpu_.slices;if(slices.length){const track=new tr.ui.tracks.SliceTrack(this.viewport);track.slices=slices;track.heading=this.cpu_.userFriendlyName+':';Polymer.dom(this).appendChild(track);}
+if(this.detailedMode_){this.appendSamplesTracks_();for(const counterName in this.cpu_.counters){const counter=this.cpu_.counters[counterName];const track=new tr.ui.tracks.CounterTrack(this.viewport);track.heading=this.cpu_.userFriendlyName+' '+
+counter.name+':';track.counter=counter;Polymer.dom(this).appendChild(track);}}},appendSamplesTracks_(){const samples=this.cpu_.samples;if(samples===undefined||samples.length===0){return;}
+const samplesByTitle={};samples.forEach(function(sample){if(samplesByTitle[sample.title]===undefined){samplesByTitle[sample.title]=[];}
+samplesByTitle[sample.title].push(sample);});const sampleTitles=Object.keys(samplesByTitle);sampleTitles.sort();sampleTitles.forEach(function(sampleTitle){const samples=samplesByTitle[sampleTitle];const samplesTrack=new tr.ui.tracks.SliceTrack(this.viewport);samplesTrack.group=this.cpu_;samplesTrack.slices=samples;samplesTrack.heading=this.cpu_.userFriendlyName+': '+
+sampleTitle;samplesTrack.tooltip=this.cpu_.userFriendlyDetails;samplesTrack.selectionGenerator=function(){const selection=new tr.model.EventSet();for(let i=0;i<samplesTrack.slices.length;i++){selection.push(samplesTrack.slices[i]);}
+return selection;};Polymer.dom(this).appendChild(samplesTrack);},this);}};return{CpuTrack,};});'use strict';tr.exportTo('tr.model',function(){const Settings=tr.b.Settings;function ModelSettings(model){this.model=model;this.objectsByKey_=[];this.nonuniqueKeys_=[];this.buildObjectsByKeyMap_();this.removeNonuniqueKeysFromSettings_();this.ephemeralSettingsByGUID_={};}
+ModelSettings.prototype={buildObjectsByKeyMap_(){const objects=[];this.model.iterateAllPersistableObjects(function(o){objects.push(o);});const objectsByKey={};const NONUNIQUE_KEY='nonuniqueKey';for(let i=0;i<objects.length;i++){const object=objects[i];const objectKey=object.getSettingsKey();if(!objectKey)continue;if(objectsByKey[objectKey]===undefined){objectsByKey[objectKey]=object;continue;}
+objectsByKey[objectKey]=NONUNIQUE_KEY;}
+const nonuniqueKeys={};Object.keys(objectsByKey).forEach(function(objectKey){if(objectsByKey[objectKey]!==NONUNIQUE_KEY){return;}
+delete objectsByKey[objectKey];nonuniqueKeys[objectKey]=true;});this.nonuniqueKeys=nonuniqueKeys;this.objectsByKey_=objectsByKey;},removeNonuniqueKeysFromSettings_(){const settings=Settings.get('trace_model_settings',{});let settingsChanged=false;Object.keys(settings).forEach(function(objectKey){if(!this.nonuniqueKeys[objectKey]){return;}
+settingsChanged=true;delete settings[objectKey];},this);if(settingsChanged){Settings.set('trace_model_settings',settings);}},hasUniqueSettingKey(object){const objectKey=object.getSettingsKey();if(!objectKey)return false;return this.objectsByKey_[objectKey]!==undefined;},getSettingFor(object,objectLevelKey,defaultValue){const objectKey=object.getSettingsKey();if(!objectKey||!this.objectsByKey_[objectKey]){const settings=this.getEphemeralSettingsFor_(object);const ephemeralValue=settings[objectLevelKey];if(ephemeralValue!==undefined){return ephemeralValue;}
+return defaultValue;}
+const settings=Settings.get('trace_model_settings',{});if(!settings[objectKey]){settings[objectKey]={};}
+const value=settings[objectKey][objectLevelKey];if(value!==undefined){return value;}
+return defaultValue;},setSettingFor(object,objectLevelKey,value){const objectKey=object.getSettingsKey();if(!objectKey||!this.objectsByKey_[objectKey]){this.getEphemeralSettingsFor_(object)[objectLevelKey]=value;return;}
+const settings=Settings.get('trace_model_settings',{});if(!settings[objectKey]){settings[objectKey]={};}
+if(settings[objectKey][objectLevelKey]===value){return;}
+settings[objectKey][objectLevelKey]=value;Settings.set('trace_model_settings',settings);},getEphemeralSettingsFor_(object){if(object.guid===undefined){throw new Error('Only objects with GUIDs can be persisted');}
+if(this.ephemeralSettingsByGUID_[object.guid]===undefined){this.ephemeralSettingsByGUID_[object.guid]={};}
+return this.ephemeralSettingsByGUID_[object.guid];}};return{ModelSettings,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const CounterTrack=tr.ui.b.define('counter-track',tr.ui.tracks.ChartTrack);CounterTrack.prototype={__proto__:tr.ui.tracks.ChartTrack.prototype,decorate(viewport){tr.ui.tracks.ChartTrack.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('counter-track');},get counter(){return this.chart;},set counter(counter){this.heading=counter.name+': ';this.series=CounterTrack.buildChartSeriesFromCounter(counter);this.autoSetAllAxes({expandMax:true});},getModelEventFromItem(chartValue){return chartValue;}};CounterTrack.buildChartSeriesFromCounter=function(counter){const numSeries=counter.series.length;const totals=counter.totals;const seriesYAxis=new tr.ui.tracks.ChartSeriesYAxis(0,undefined);const chartSeries=counter.series.map(function(series,seriesIndex){const chartPoints=series.samples.map(function(sample,sampleIndex){const total=totals[sampleIndex*numSeries+seriesIndex];return new tr.ui.tracks.ChartPoint(sample,sample.timestamp,total);});const renderingConfig={chartType:tr.ui.tracks.ChartSeriesType.AREA,colorId:series.color};return new tr.ui.tracks.ChartSeries(chartPoints,seriesYAxis,renderingConfig);});chartSeries.reverse();return chartSeries;};return{CounterTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const startCompare=function(x,y){return x.start-y.start;};const FrameTrack=tr.ui.b.define('frame-track',tr.ui.tracks.LetterDotTrack);FrameTrack.prototype={__proto__:tr.ui.tracks.LetterDotTrack.prototype,decorate(viewport){tr.ui.tracks.LetterDotTrack.prototype.decorate.call(this,viewport);this.heading='Frames';this.frames_=undefined;this.items=undefined;},get frames(){return this.frames_;},set frames(frames){this.frames_=frames;if(frames===undefined)return;this.frames_=this.frames_.slice();this.frames_.sort(startCompare);this.items=this.frames_.map(function(frame){return new FrameDot(frame);});}};function FrameDot(frame){tr.ui.tracks.LetterDot.call(this,frame,'F',frame.colorId,frame.start);}
+FrameDot.prototype={__proto__:tr.ui.tracks.LetterDot.prototype};return{FrameTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const MultiRowTrack=tr.ui.b.define('multi-row-track',tr.ui.tracks.ContainerTrack);MultiRowTrack.prototype={__proto__:tr.ui.tracks.ContainerTrack.prototype,decorate(viewport){tr.ui.tracks.ContainerTrack.prototype.decorate.call(this,viewport);this.tooltip_='';this.heading_='';this.groupingSource_=undefined;this.itemsToGroup_=undefined;this.defaultToCollapsedWhenSubRowCountMoreThan=1;this.itemsGroupedOnLastUpdateContents_=undefined;this.currentSubRows_=[];this.expanded_=true;},get itemsToGroup(){return this.itemsToGroup_;},setItemsToGroup(itemsToGroup,opt_groupingSource){this.itemsToGroup_=itemsToGroup;this.groupingSource_=opt_groupingSource;this.updateContents_();this.updateExpandedStateFromGroupingSource_();},get heading(){return this.heading_;},set heading(h){this.heading_=h;this.updateContents_();},get tooltip(){return this.tooltip_;},set tooltip(t){this.tooltip_=t;this.updateContents_();},get subRows(){return this.currentSubRows_;},get hasVisibleContent(){return this.children.length>0;},get expanded(){return this.expanded_;},set expanded(expanded){if(this.expanded_===expanded)return;this.expanded_=expanded;this.expandedStateChanged_();},onHeadingClicked_(e){if(this.subRows.length<=1)return;this.expanded=!this.expanded;if(this.groupingSource_){const modelSettings=new tr.model.ModelSettings(this.groupingSource_.model);modelSettings.setSettingFor(this.groupingSource_,'expanded',this.expanded);}
+e.stopPropagation();},updateExpandedStateFromGroupingSource_(){if(this.groupingSource_){const numSubRows=this.subRows.length;const modelSettings=new tr.model.ModelSettings(this.groupingSource_.model);if(numSubRows>1){let defaultExpanded;if(numSubRows>this.defaultToCollapsedWhenSubRowCountMoreThan){defaultExpanded=false;}else{defaultExpanded=true;}
+this.expanded=modelSettings.getSettingFor(this.groupingSource_,'expanded',defaultExpanded);}else{this.expanded=undefined;}}},expandedStateChanged_(){const minH=Math.max(2,Math.ceil(18/this.children.length));const h=(this.expanded_?18:minH)+'px';for(let i=0;i<this.children.length;i++){this.children[i].height=h;if(i===0){this.children[i].arrowVisible=true;}
+this.children[i].expanded=this.expanded;}
+if(this.children.length===1){this.children[0].expanded=true;this.children[0].arrowVisible=false;}},updateContents_(){tr.ui.tracks.ContainerTrack.prototype.updateContents_.call(this);if(!this.itemsToGroup_){this.updateHeadingAndTooltip_();this.currentSubRows_=[];return;}
+if(this.areArrayContentsSame_(this.itemsGroupedOnLastUpdateContents_,this.itemsToGroup_)){this.updateHeadingAndTooltip_();return;}
+this.itemsGroupedOnLastUpdateContents_=this.itemsToGroup_;this.detach();if(!this.itemsToGroup_.length){this.currentSubRows_=[];return;}
+const subRows=this.buildSubRows_(this.itemsToGroup_);this.currentSubRows_=subRows;for(let srI=0;srI<subRows.length;srI++){const subRow=subRows[srI];if(!subRow.length)continue;const track=this.addSubTrack_(subRow);track.addEventListener('heading-clicked',this.onHeadingClicked_.bind(this));}
+this.updateHeadingAndTooltip_();this.expandedStateChanged_();},updateHeadingAndTooltip_(){if(!Polymer.dom(this).firstChild)return;Polymer.dom(this).firstChild.heading=this.heading_;Polymer.dom(this).firstChild.tooltip=this.tooltip_;},buildSubRows_(itemsToGroup){throw new Error('Not implemented');},addSubTrack_(subRowItems){throw new Error('Not implemented');},areArrayContentsSame_(a,b){if(!a||!b)return false;if(!a.length||!b.length)return false;if(a.length!==b.length)return false;for(let i=0;i<a.length;++i){if(a[i]!==b[i])return false;}
+return true;}};return{MultiRowTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const ObjectInstanceGroupTrack=tr.ui.b.define('object-instance-group-track',tr.ui.tracks.MultiRowTrack);ObjectInstanceGroupTrack.prototype={__proto__:tr.ui.tracks.MultiRowTrack.prototype,decorate(viewport){tr.ui.tracks.MultiRowTrack.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('object-instance-group-track');this.objectInstances_=undefined;},get objectInstances(){return this.itemsToGroup;},set objectInstances(objectInstances){this.setItemsToGroup(objectInstances);},addSubTrack_(objectInstances){const hasMultipleRows=this.subRows.length>1;const track=new tr.ui.tracks.ObjectInstanceTrack(this.viewport);track.objectInstances=objectInstances;Polymer.dom(this).appendChild(track);return track;},buildSubRows_(objectInstances){objectInstances.sort(function(x,y){return x.creationTs-y.creationTs;});const subRows=[];for(let i=0;i<objectInstances.length;i++){const objectInstance=objectInstances[i];let found=false;for(let j=0;j<subRows.length;j++){const subRow=subRows[j];const lastItemInSubRow=subRow[subRow.length-1];if(objectInstance.creationTs>=lastItemInSubRow.deletionTs){found=true;subRow.push(objectInstance);break;}}
+if(!found){subRows.push([objectInstance]);}}
+return subRows;},updateHeadingAndTooltip_(){}};return{ObjectInstanceGroupTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const AsyncSliceGroupTrack=tr.ui.b.define('async-slice-group-track',tr.ui.tracks.MultiRowTrack);AsyncSliceGroupTrack.prototype={__proto__:tr.ui.tracks.MultiRowTrack.prototype,decorate(viewport){tr.ui.tracks.MultiRowTrack.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('async-slice-group-track');this.group_=undefined;},addSubTrack_(slices){const track=new tr.ui.tracks.SliceTrack(this.viewport);track.slices=slices;Polymer.dom(this).appendChild(track);track.asyncStyle=true;return track;},get group(){return this.group_;},set group(group){this.group_=group;this.setItemsToGroup(this.group_.slices,this.group_);},get eventContainer(){return this.group;},addContainersToTrackMap(containerToTrackMap){tr.ui.tracks.MultiRowTrack.prototype.addContainersToTrackMap.apply(this,arguments);containerToTrackMap.addContainer(this.group,this);},buildSubRows_(slices,opt_skipSort){if(!opt_skipSort){slices.sort(function(x,y){return x.start-y.start;});}
+const findLevel=function(sliceToPut,rows,n){if(n>=rows.length){return true;}
+const subRow=rows[n];const lastSliceInSubRow=subRow[subRow.length-1];if(sliceToPut.start>=lastSliceInSubRow.end){if(sliceToPut.subSlices===undefined||sliceToPut.subSlices.length===0){return true;}
+for(const subSlice of sliceToPut.subSlices){if(!findLevel(subSlice,rows,n+1)){return false;}}
+return true;}
+return false;};const subRows=[];for(const slice of slices){let found=false;let index=subRows.length;for(let j=0;j<subRows.length;j++){if(findLevel(slice,subRows,j)){found=true;index=j;break;}}
+if(!found){subRows.push([]);}
+subRows[index].push(slice);const fitSubSlicesRecursively=function(subSlices,level,rows){if(subSlices===undefined||subSlices.length===0){return;}
+if(level===rows.length){rows.push([]);}
+for(const subSlice of subSlices){rows[level].push(subSlice);fitSubSlicesRecursively(subSlice.subSlices,level+1,rows);}};fitSubSlicesRecursively(slice.subSlices,index+1,subRows);}
+return subRows;}};return{AsyncSliceGroupTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const SampleTrack=tr.ui.b.define('sample-track',tr.ui.tracks.RectTrack);SampleTrack.prototype={__proto__:tr.ui.tracks.RectTrack.prototype,decorate(viewport){tr.ui.tracks.RectTrack.prototype.decorate.call(this,viewport);},get samples(){return this.rects;},set samples(samples){this.rects=samples;}};return{SampleTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const SliceGroupTrack=tr.ui.b.define('slice-group-track',tr.ui.tracks.MultiRowTrack);SliceGroupTrack.prototype={__proto__:tr.ui.tracks.MultiRowTrack.prototype,decorate(viewport){tr.ui.tracks.MultiRowTrack.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('slice-group-track');this.group_=undefined;this.defaultToCollapsedWhenSubRowCountMoreThan=100;},addSubTrack_(slices){const track=new tr.ui.tracks.SliceTrack(this.viewport);track.slices=slices;Polymer.dom(this).appendChild(track);return track;},get group(){return this.group_;},set group(group){this.group_=group;this.setItemsToGroup(this.group_.slices,this.group_);},get eventContainer(){return this.group;},addContainersToTrackMap(containerToTrackMap){tr.ui.tracks.MultiRowTrack.prototype.addContainersToTrackMap.apply(this,arguments);containerToTrackMap.addContainer(this.group,this);},buildSubRows_(slices){const precisionUnit=this.group.model.intrinsicTimeUnit;if(!slices.length)return[];const ops=[];for(let i=0;i<slices.length;i++){if(slices[i].subSlices){slices[i].subSlices.splice(0,slices[i].subSlices.length);}
+ops.push(i);}
+ops.sort(function(ix,iy){const x=slices[ix];const y=slices[iy];if(x.start!==y.start)return x.start-y.start;return ix-iy;});const subRows=[[]];this.badSlices_=[];for(let i=0;i<ops.length;i++){const op=ops[i];const slice=slices[op];let inserted=false;for(let j=subRows.length-1;j>=0;j--){if(subRows[j].length===0)continue;const insertedSlice=subRows[j][subRows[j].length-1];if(slice.start<insertedSlice.start){this.badSlices_.push(slice);inserted=true;}
+if(insertedSlice.bounds(slice,precisionUnit)){while(subRows.length<=j+1){subRows.push([]);}
+subRows[j+1].push(slice);if(insertedSlice.subSlices){insertedSlice.subSlices.push(slice);}
+inserted=true;break;}}
+if(inserted)continue;subRows[0].push(slice);}
+return subRows;}};return{SliceGroupTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const ThreadTrack=tr.ui.b.define('thread-track',tr.ui.tracks.ContainerTrack);ThreadTrack.prototype={__proto__:tr.ui.tracks.ContainerTrack.prototype,decorate(viewport){tr.ui.tracks.ContainerTrack.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('thread-track');this.heading_=document.createElement('tr-ui-b-heading');},get thread(){return this.thread_;},set thread(thread){this.thread_=thread;this.updateContents_();},get hasVisibleContent(){return this.tracks_.length>0;},get hasSlices(){return this.thread_.asyncSliceGroup.length>0||this.thread_.sliceGroup.length>0;},get hasTimeSlices(){return this.thread_.timeSlices;},get eventContainer(){return this.thread;},addContainersToTrackMap(containerToTrackMap){tr.ui.tracks.ContainerTrack.prototype.addContainersToTrackMap.apply(this,arguments);containerToTrackMap.addContainer(this.thread,this);},updateContents_(){this.detach();if(!this.thread_)return;this.heading_.heading=this.thread_.userFriendlyName;this.heading_.tooltip=this.thread_.userFriendlyDetails;if(this.thread_.asyncSliceGroup.length){this.appendAsyncSliceTracks_();}
+this.appendThreadSamplesTracks_();let needsHeading=false;if(this.thread_.timeSlices){const timeSlicesTrack=new tr.ui.tracks.SliceTrack(this.viewport);timeSlicesTrack.heading='';timeSlicesTrack.height=tr.ui.b.THIN_SLICE_HEIGHT+'px';timeSlicesTrack.slices=this.thread_.timeSlices;if(timeSlicesTrack.hasVisibleContent){needsHeading=true;Polymer.dom(this).appendChild(timeSlicesTrack);}}
+if(this.thread_.sliceGroup.length){const track=new tr.ui.tracks.SliceGroupTrack(this.viewport);track.heading=this.thread_.userFriendlyName;track.tooltip=this.thread_.userFriendlyDetails;track.group=this.thread_.sliceGroup;if(track.hasVisibleContent){needsHeading=false;Polymer.dom(this).appendChild(track);}}
+if(needsHeading){Polymer.dom(this).appendChild(this.heading_);}},appendAsyncSliceTracks_(){const subGroups=this.thread_.asyncSliceGroup.viewSubGroups;subGroups.forEach(function(subGroup){const asyncTrack=new tr.ui.tracks.AsyncSliceGroupTrack(this.viewport);const title=subGroup.slices[0].viewSubGroupTitle;asyncTrack.group=subGroup;asyncTrack.heading=title;if(asyncTrack.hasVisibleContent){Polymer.dom(this).appendChild(asyncTrack);}},this);},appendThreadSamplesTracks_(){const threadSamples=this.thread_.samples;if(threadSamples===undefined||threadSamples.length===0){return;}
+const samplesByTitle={};threadSamples.forEach(function(sample){if(samplesByTitle[sample.title]===undefined){samplesByTitle[sample.title]=[];}
+samplesByTitle[sample.title].push(sample);});const sampleTitles=Object.keys(samplesByTitle);sampleTitles.sort();sampleTitles.forEach(function(sampleTitle){const samples=samplesByTitle[sampleTitle];const samplesTrack=new tr.ui.tracks.SampleTrack(this.viewport);samplesTrack.group=this.thread_;samplesTrack.samples=samples;samplesTrack.heading=this.thread_.userFriendlyName+': '+
+sampleTitle;samplesTrack.tooltip=this.thread_.userFriendlyDetails;samplesTrack.selectionGenerator=function(){const selection=new tr.model.EventSet();for(let i=0;i<samplesTrack.samples.length;i++){selection.push(samplesTrack.samples[i]);}
+return selection;};Polymer.dom(this).appendChild(samplesTrack);},this);},collapsedDidChange(collapsed){if(collapsed){let h=parseInt(this.tracks[0].height);for(let i=0;i<this.tracks.length;++i){if(h>2){this.tracks[i].height=Math.floor(h)+'px';}else{this.tracks[i].style.display='none';}
+h=h*0.5;}}else{for(let i=0;i<this.tracks.length;++i){this.tracks[i].height=this.tracks[0].height;this.tracks[i].style.display='';}}}};return{ThreadTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const OtherThreadsTrack=tr.ui.b.define('other-threads-track',tr.ui.tracks.OtherThreadsTrack);const SpacingTrack=tr.ui.tracks.SpacingTrack;OtherThreadsTrack.prototype={__proto__:tr.ui.tracks.ContainerTrack.prototype,decorate(viewport){tr.ui.tracks.ContainerTrack.prototype.decorate.call(this,viewport);this.header_=document.createElement('tr-ui-b-heading');this.header_.addEventListener('click',this.onHeaderClick_.bind(this));this.header_.heading='Other Threads';this.header_.tooltip='Threads with only scheduling information';this.header_.arrowVisible=true;this.threads_=[];this.expanded=false;this.collapsible_=true;},set threads(threads){this.threads_=threads;this.updateContents_();},set collapsible(collapsible){this.collapsible_=collapsible;this.updateContents_();},onHeaderClick_(e){e.stopPropagation();e.preventDefault();this.expanded=!this.expanded;},get expanded(){return this.header_.expanded;},set expanded(expanded){expanded=!!expanded;if(this.expanded===expanded)return;this.header_.expanded=expanded;this.viewport_.dispatchChangeEvent();this.updateContents_();},updateContents_(){this.detach();if(this.collapsible_){Polymer.dom(this).appendChild(this.header_);}
+if(this.expanded||!this.collapsible_){for(const thread of this.threads_){const track=new tr.ui.tracks.ThreadTrack(this.viewport);track.thread=thread;if(!track.hasVisibleContent)return;Polymer.dom(this).appendChild(track);Polymer.dom(this).appendChild(new SpacingTrack(this.viewport));}}}};return{OtherThreadsTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const ColorScheme=tr.b.ColorScheme;const ProcessSummaryTrack=tr.ui.b.define('process-summary-track',tr.ui.tracks.RectTrack);ProcessSummaryTrack.buildRectsFromProcess=function(process){if(!process)return[];const ops=[];const pushOp=function(isStart,time,slice){ops.push({isStart,time,slice});};for(const tid in process.threads){const sliceGroup=process.threads[tid].sliceGroup;sliceGroup.topLevelSlices.forEach(function(slice){pushOp(true,slice.start,undefined);pushOp(false,slice.end,undefined);});sliceGroup.slices.forEach(function(slice){if(slice.important){pushOp(true,slice.start,slice);pushOp(false,slice.end,slice);}});}
+ops.sort(function(a,b){return a.time-b.time;});const rects=[];const genericColorId=ColorScheme.getColorIdForReservedName('generic_work');const pushRect=function(start,end,slice){rects.push(new tr.ui.tracks.Rect(slice,slice?slice.title:'',slice?slice.colorId:genericColorId,start,end-start));};let depth=0;let currentSlice=undefined;let lastStart=undefined;ops.forEach(function(op){depth+=op.isStart?1:-1;if(currentSlice){if(!op.isStart&&op.slice===currentSlice){pushRect(lastStart,op.time,currentSlice);lastStart=depth>=1?op.time:undefined;currentSlice=undefined;}}else{if(op.isStart){if(depth===1){lastStart=op.time;currentSlice=op.slice;}else if(op.slice){if(op.time!==lastStart){pushRect(lastStart,op.time,undefined);lastStart=op.time;}
+currentSlice=op.slice;}}else{if(depth===0){pushRect(lastStart,op.time,undefined);lastStart=undefined;}}}});return rects;};ProcessSummaryTrack.prototype={__proto__:tr.ui.tracks.RectTrack.prototype,decorate(viewport){tr.ui.tracks.RectTrack.prototype.decorate.call(this,viewport);},get process(){return this.process_;},set process(process){this.process_=process;this.rects=ProcessSummaryTrack.buildRectsFromProcess(process);}};return{ProcessSummaryTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const ObjectSnapshotView=tr.ui.analysis.ObjectSnapshotView;const ObjectInstanceView=tr.ui.analysis.ObjectInstanceView;const SpacingTrack=tr.ui.tracks.SpacingTrack;const ProcessTrackBase=tr.ui.b.define('process-track-base',tr.ui.tracks.ContainerTrack);ProcessTrackBase.prototype={__proto__:tr.ui.tracks.ContainerTrack.prototype,decorate(viewport){tr.ui.tracks.ContainerTrack.prototype.decorate.call(this,viewport);this.processBase_=undefined;Polymer.dom(this).classList.add('process-track-base');Polymer.dom(this).classList.add('expanded');this.processNameEl_=tr.ui.b.createSpan();Polymer.dom(this.processNameEl_).classList.add('process-track-name');this.headerEl_=tr.ui.b.createDiv({className:'process-track-header'});Polymer.dom(this.headerEl_).appendChild(this.processNameEl_);this.headerEl_.addEventListener('click',this.onHeaderClick_.bind(this));Polymer.dom(this).appendChild(this.headerEl_);},get processBase(){return this.processBase_;},set processBase(processBase){this.processBase_=processBase;if(this.processBase_){const modelSettings=new tr.model.ModelSettings(this.processBase_.model);const defaultValue=this.processBase_.important;this.expanded=modelSettings.getSettingFor(this.processBase_,'expanded',defaultValue);}
+this.updateContents_();},get expanded(){return Polymer.dom(this).classList.contains('expanded');},set expanded(expanded){expanded=!!expanded;if(this.expanded===expanded)return;Polymer.dom(this).classList.toggle('expanded');this.viewport_.dispatchChangeEvent();if(!this.processBase_)return;const modelSettings=new tr.model.ModelSettings(this.processBase_.model);modelSettings.setSettingFor(this.processBase_,'expanded',expanded);this.updateContents_();this.viewport.rebuildEventToTrackMap();this.viewport.rebuildContainerToTrackMap();},get hasVisibleContent(){if(this.expanded){return this.children.length>1;}
+return true;},onHeaderClick_(e){e.stopPropagation();e.preventDefault();this.expanded=!this.expanded;},updateContents_(){this.clearTracks_();if(!this.processBase_)return;Polymer.dom(this.processNameEl_).textContent=this.processBase_.userFriendlyName;this.headerEl_.title=this.processBase_.userFriendlyDetails;this.willAppendTracks_();if(this.expanded){this.appendMemoryDumpTrack_();this.appendObjectInstanceTracks_();this.appendCounterTracks_();this.appendFrameTrack_();this.appendThreadTracks_();}else{this.appendSummaryTrack_();}
+this.didAppendTracks_();},willAppendTracks_(){},didAppendTracks_(){},appendMemoryDumpTrack_(){},appendSummaryTrack_(){const track=new tr.ui.tracks.ProcessSummaryTrack(this.viewport);track.process=this.process;if(!track.hasVisibleContent)return;Polymer.dom(this).appendChild(track);},appendFrameTrack_(){const frames=this.process?this.process.frames:undefined;if(!frames||!frames.length)return;const track=new tr.ui.tracks.FrameTrack(this.viewport);track.frames=frames;Polymer.dom(this).appendChild(track);},appendObjectInstanceTracks_(){const instancesByTypeName=this.processBase_.objects.getAllInstancesByTypeName();const instanceTypeNames=Object.keys(instancesByTypeName);instanceTypeNames.sort();let didAppendAtLeastOneTrack=false;instanceTypeNames.forEach(function(typeName){const allInstances=instancesByTypeName[typeName];let instanceViewInfo=ObjectInstanceView.getTypeInfo(undefined,typeName);let snapshotViewInfo=ObjectSnapshotView.getTypeInfo(undefined,typeName);if(instanceViewInfo&&!instanceViewInfo.metadata.showInTrackView){instanceViewInfo=undefined;}
+if(snapshotViewInfo&&!snapshotViewInfo.metadata.showInTrackView){snapshotViewInfo=undefined;}
+const hasViewInfo=instanceViewInfo||snapshotViewInfo;const visibleInstances=[];for(let i=0;i<allInstances.length;i++){const instance=allInstances[i];if(instance.snapshots.length===0)continue;if(instance.hasImplicitSnapshots&&!hasViewInfo)continue;visibleInstances.push(instance);}
+if(visibleInstances.length===0)return;let trackConstructor=tr.ui.tracks.ObjectInstanceTrack.getConstructor(undefined,typeName);if(!trackConstructor){snapshotViewInfo=ObjectSnapshotView.getTypeInfo(undefined,typeName);if(snapshotViewInfo&&snapshotViewInfo.metadata.showInstances){trackConstructor=tr.ui.tracks.ObjectInstanceGroupTrack;}else{trackConstructor=tr.ui.tracks.ObjectInstanceTrack;}}
+const track=new trackConstructor(this.viewport);track.objectInstances=visibleInstances;Polymer.dom(this).appendChild(track);didAppendAtLeastOneTrack=true;},this);if(didAppendAtLeastOneTrack){Polymer.dom(this).appendChild(new SpacingTrack(this.viewport));}},appendCounterTracks_(){const counters=Object.values(this.processBase.counters);counters.sort(tr.model.Counter.compare);counters.forEach(function(counter){const track=new tr.ui.tracks.CounterTrack(this.viewport);track.counter=counter;Polymer.dom(this).appendChild(track);Polymer.dom(this).appendChild(new SpacingTrack(this.viewport));}.bind(this));},appendThreadTracks_(){const threads=Object.values(this.processBase.threads);threads.sort(tr.model.Thread.compare);const otherThreads=[];let hasVisibleThreads=false;threads.forEach(function(thread){const track=new tr.ui.tracks.ThreadTrack(this.viewport);track.thread=thread;if(!track.hasVisibleContent)return;if(track.hasSlices){hasVisibleThreads=true;Polymer.dom(this).appendChild(track);Polymer.dom(this).appendChild(new SpacingTrack(this.viewport));}else if(track.hasTimeSlices){otherThreads.push(thread);}}.bind(this));if(otherThreads.length>0){const track=new tr.ui.tracks.OtherThreadsTrack(this.viewport);track.threads=otherThreads;track.collapsible=otherThreads.length>1&&hasVisibleThreads;Polymer.dom(this).appendChild(track);}}};return{ProcessTrackBase,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const Cpu=tr.model.Cpu;const CpuTrack=tr.ui.tracks.cpu_track;const ProcessTrackBase=tr.ui.tracks.ProcessTrackBase;const SpacingTrack=tr.ui.tracks.SpacingTrack;const KernelTrack=tr.ui.b.define('kernel-track',ProcessTrackBase);KernelTrack.prototype={__proto__:ProcessTrackBase.prototype,decorate(viewport){ProcessTrackBase.prototype.decorate.call(this,viewport);},set kernel(kernel){this.processBase=kernel;},get kernel(){return this.processBase;},get eventContainer(){return this.kernel;},get hasVisibleContent(){return this.children.length>1;},addContainersToTrackMap(containerToTrackMap){tr.ui.tracks.ProcessTrackBase.prototype.addContainersToTrackMap.call(this,containerToTrackMap);containerToTrackMap.addContainer(this.kernel,this);},willAppendTracks_(){const cpus=Object.values(this.kernel.cpus);cpus.sort(tr.model.Cpu.compare);let didAppendAtLeastOneTrack=false;for(let i=0;i<cpus.length;++i){const cpu=cpus[i];const track=new tr.ui.tracks.CpuTrack(this.viewport);track.detailedMode=this.expanded;track.cpu=cpu;if(!track.hasVisibleContent)continue;Polymer.dom(this).appendChild(track);didAppendAtLeastOneTrack=true;}
+if(didAppendAtLeastOneTrack){Polymer.dom(this).appendChild(new SpacingTrack(this.viewport));}}};return{KernelTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const InteractionTrack=tr.ui.b.define('interaction-track',tr.ui.tracks.MultiRowTrack);InteractionTrack.prototype={__proto__:tr.ui.tracks.MultiRowTrack.prototype,decorate(viewport){tr.ui.tracks.MultiRowTrack.prototype.decorate.call(this,viewport);this.heading='Interactions';this.subRows_=[];},set model(model){this.setItemsToGroup(model.userModel.expectations,{guid:tr.b.GUID.allocateSimple(),model,getSettingsKey(){return undefined;}});},buildSubRows_(slices){if(this.subRows_.length){return this.subRows_;}
+this.subRows_.push.apply(this.subRows_,tr.ui.tracks.AsyncSliceGroupTrack.prototype.buildSubRows_.call({},slices,true));return this.subRows_;},addSubTrack_(slices){const track=new tr.ui.tracks.SliceTrack(this.viewport);track.slices=slices;Polymer.dom(this).appendChild(track);return track;}};return{InteractionTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const ALLOCATED_MEMORY_TRACK_HEIGHT=50;const ProcessMemoryDumpTrack=tr.ui.b.define('process-memory-dump-track',tr.ui.tracks.ContainerTrack);ProcessMemoryDumpTrack.prototype={__proto__:tr.ui.tracks.ContainerTrack.prototype,decorate(viewport){tr.ui.tracks.ContainerTrack.prototype.decorate.call(this,viewport);this.memoryDumps_=undefined;},get memoryDumps(){return this.memoryDumps_;},set memoryDumps(memoryDumps){this.memoryDumps_=memoryDumps;this.updateContents_();},updateContents_(){this.clearTracks_();if(!this.memoryDumps_||!this.memoryDumps_.length)return;this.appendAllocatedMemoryTrack_();},appendAllocatedMemoryTrack_(){const series=tr.ui.tracks.buildProcessAllocatedMemoryChartSeries(this.memoryDumps_);if(!series)return;const track=new tr.ui.tracks.ChartTrack(this.viewport);track.heading='Memory per component';track.height=ALLOCATED_MEMORY_TRACK_HEIGHT+'px';track.series=series;track.autoSetAllAxes({expandMax:true});Polymer.dom(this).appendChild(track);}};return{ProcessMemoryDumpTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const ProcessTrackBase=tr.ui.tracks.ProcessTrackBase;const ProcessTrack=tr.ui.b.define('process-track',ProcessTrackBase);ProcessTrack.prototype={__proto__:ProcessTrackBase.prototype,decorate(viewport){tr.ui.tracks.ProcessTrackBase.prototype.decorate.call(this,viewport);},drawTrack(type){switch(type){case tr.ui.tracks.DrawType.INSTANT_EVENT:{if(!this.processBase.instantEvents||this.processBase.instantEvents.length===0){break;}
+const ctx=this.context();const pixelRatio=window.devicePixelRatio||1;const bounds=this.getBoundingClientRect();const canvasBounds=ctx.canvas.getBoundingClientRect();ctx.save();ctx.translate(0,pixelRatio*(bounds.top-canvasBounds.top));const dt=this.viewport.currentDisplayTransform;const viewLWorld=dt.xViewToWorld(0);const viewRWorld=dt.xViewToWorld(bounds.width*pixelRatio);tr.ui.b.drawInstantSlicesAsLines(ctx,this.viewport.currentDisplayTransform,viewLWorld,viewRWorld,bounds.height,this.processBase.instantEvents,2);ctx.restore();break;}
+case tr.ui.tracks.DrawType.BACKGROUND:this.drawBackground_();return;}
+tr.ui.tracks.ContainerTrack.prototype.drawTrack.call(this,type);},drawBackground_(){const ctx=this.context();const canvasBounds=ctx.canvas.getBoundingClientRect();const pixelRatio=window.devicePixelRatio||1;let draw=false;ctx.fillStyle='#eee';for(let i=0;i<this.children.length;++i){if(!(this.children[i]instanceof tr.ui.tracks.Track)||(this.children[i]instanceof tr.ui.tracks.SpacingTrack)){continue;}
+draw=!draw;if(!draw)continue;const bounds=this.children[i].getBoundingClientRect();ctx.fillRect(0,pixelRatio*(bounds.top-canvasBounds.top),ctx.canvas.width,pixelRatio*bounds.height);}},set process(process){this.processBase=process;},get process(){return this.processBase;},get eventContainer(){return this.process;},addContainersToTrackMap(containerToTrackMap){tr.ui.tracks.ProcessTrackBase.prototype.addContainersToTrackMap.apply(this,arguments);containerToTrackMap.addContainer(this.process,this);},appendMemoryDumpTrack_(){const processMemoryDumps=this.process.memoryDumps;if(processMemoryDumps.length){const pmdt=new tr.ui.tracks.ProcessMemoryDumpTrack(this.viewport_);pmdt.memoryDumps=processMemoryDumps;Polymer.dom(this).appendChild(pmdt);}},addIntersectingEventsInRangeToSelectionInWorldSpace(loWX,hiWX,viewPixWidthWorld,selection){function onPickHit(instantEvent){selection.push(instantEvent);}
+const instantEventWidth=2*viewPixWidthWorld;tr.b.math.iterateOverIntersectingIntervals(this.processBase.instantEvents,function(x){return x.start;},function(x){return x.duration+instantEventWidth;},loWX,hiWX,onPickHit.bind(this));tr.ui.tracks.ContainerTrack.prototype.addIntersectingEventsInRangeToSelectionInWorldSpace.apply(this,arguments);},addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection){this.addClosestInstantEventToSelection(this.processBase.instantEvents,worldX,worldMaxDist,selection);tr.ui.tracks.ContainerTrack.prototype.addClosestEventToSelection.apply(this,arguments);}};return{ProcessTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const SelectionState=tr.model.SelectionState;const ColorScheme=tr.b.ColorScheme;const EventPresenter=tr.ui.b.EventPresenter;const ModelTrack=tr.ui.b.define('model-track',tr.ui.tracks.ContainerTrack);ModelTrack.VSYNC_HIGHLIGHT_ALPHA=0.1;ModelTrack.VSYNC_DENSITY_TRANSPARENT=0.20;ModelTrack.VSYNC_DENSITY_OPAQUE=0.10;ModelTrack.VSYNC_DENSITY_RANGE=ModelTrack.VSYNC_DENSITY_TRANSPARENT-ModelTrack.VSYNC_DENSITY_OPAQUE;ModelTrack.generateStripes_=function(times,minTime,maxTime){if(times.length===0)return[];const lowIndex=tr.b.math.findLowIndexInSortedArray(times,tr.b.identity,minTime);let highIndex=lowIndex-1;while(times[highIndex+1]<=maxTime){highIndex++;}
+const stripes=[];for(let i=lowIndex-(lowIndex%2);i<=highIndex;i+=2){const left=i<lowIndex?minTime:times[i];const right=i+1>highIndex?maxTime:times[i+1];stripes.push(tr.b.math.Range.fromExplicitRange(left,right));}
+return stripes;};ModelTrack.prototype={__proto__:tr.ui.tracks.ContainerTrack.prototype,decorate(viewport){tr.ui.tracks.ContainerTrack.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('model-track');this.upperMode_=false;this.annotationViews_=[];this.vSyncTimes_=[];},get upperMode(){return this.upperMode_;},set upperMode(upperMode){this.upperMode_=upperMode;this.updateContents_();},detach(){tr.ui.tracks.ContainerTrack.prototype.detach.call(this);},get model(){return this.model_;},set model(model){this.model_=model;this.updateContents_();this.model_.addEventListener('annotationChange',this.updateAnnotations_.bind(this));},get hasVisibleContent(){return this.children.length>0;},updateContents_(){Polymer.dom(this).textContent='';if(!this.model_)return;if(this.upperMode_){this.updateContentsForUpperMode_();}else{this.updateContentsForLowerMode_();}},updateContentsForUpperMode_(){},updateContentsForLowerMode_(){if(this.model_.userModel.expectations.length>1){const mrt=new tr.ui.tracks.InteractionTrack(this.viewport_);mrt.model=this.model_;Polymer.dom(this).appendChild(mrt);}
+if(this.model_.alerts.length){const at=new tr.ui.tracks.AlertTrack(this.viewport_);at.alerts=this.model_.alerts;Polymer.dom(this).appendChild(at);}
+if(this.model_.globalMemoryDumps.length){const gmdt=new tr.ui.tracks.GlobalMemoryDumpTrack(this.viewport_);gmdt.memoryDumps=this.model_.globalMemoryDumps;Polymer.dom(this).appendChild(gmdt);}
+this.appendDeviceTrack_();this.appendCpuUsageTrack_();this.appendKernelTrack_();const processes=this.model_.getAllProcesses();processes.sort(tr.model.Process.compare);for(let i=0;i<processes.length;++i){const process=processes[i];const track=new tr.ui.tracks.ProcessTrack(this.viewport);track.process=process;if(!track.hasVisibleContent)continue;Polymer.dom(this).appendChild(track);}
+this.viewport_.rebuildEventToTrackMap();this.viewport_.rebuildContainerToTrackMap();this.vSyncTimes_=this.model_.device.vSyncTimestamps;this.updateAnnotations_();},getContentBounds(){return this.model.bounds;},addAnnotation(annotation){this.model.addAnnotation(annotation);},removeAnnotation(annotation){this.model.removeAnnotation(annotation);},updateAnnotations_(){this.annotationViews_=[];const annotations=this.model_.getAllAnnotations();for(let i=0;i<annotations.length;i++){this.annotationViews_.push(annotations[i].getOrCreateView(this.viewport_));}
+this.invalidateDrawingContainer();},addEventsToTrackMap(eventToTrackMap){if(!this.model_)return;const tracks=this.children;for(let i=0;i<tracks.length;++i){tracks[i].addEventsToTrackMap(eventToTrackMap);}
+if(this.instantEvents===undefined)return;const vp=this.viewport_;this.instantEvents.forEach(function(ev){eventToTrackMap.addEvent(ev,this);}.bind(this));},appendDeviceTrack_(){const device=this.model.device;const track=new tr.ui.tracks.DeviceTrack(this.viewport);track.device=this.model.device;if(!track.hasVisibleContent)return;Polymer.dom(this).appendChild(track);},appendKernelTrack_(){const kernel=this.model.kernel;const track=new tr.ui.tracks.KernelTrack(this.viewport);track.kernel=this.model.kernel;if(!track.hasVisibleContent)return;Polymer.dom(this).appendChild(track);},appendCpuUsageTrack_(){const track=new tr.ui.tracks.CpuUsageTrack(this.viewport);track.initialize(this.model);if(!track.hasVisibleContent)return;this.appendChild(track);},appendCpuUsageTrack_(){const track=new tr.ui.tracks.CpuUsageTrack(this.viewport);track.initialize(this.model);if(!track.hasVisibleContent)return;this.appendChild(track);},drawTrack(type){const ctx=this.context();if(!this.model_)return;const pixelRatio=window.devicePixelRatio||1;const bounds=this.getBoundingClientRect();const canvasBounds=ctx.canvas.getBoundingClientRect();ctx.save();ctx.translate(0,pixelRatio*(bounds.top-canvasBounds.top));const dt=this.viewport.currentDisplayTransform;const viewLWorld=dt.xViewToWorld(0);const viewRWorld=dt.xViewToWorld(bounds.width*pixelRatio);switch(type){case tr.ui.tracks.DrawType.GRID:this.viewport.drawMajorMarkLines(ctx);ctx.restore();return;case tr.ui.tracks.DrawType.FLOW_ARROWS:if(this.model_.flowIntervalTree.size===0){ctx.restore();return;}
+this.drawFlowArrows_(viewLWorld,viewRWorld);ctx.restore();return;case tr.ui.tracks.DrawType.INSTANT_EVENT:if(!this.model_.instantEvents||this.model_.instantEvents.length===0){break;}
+tr.ui.b.drawInstantSlicesAsLines(ctx,this.viewport.currentDisplayTransform,viewLWorld,viewRWorld,bounds.height,this.model_.instantEvents,4);break;case tr.ui.tracks.DrawType.MARKERS:if(!this.viewport.interestRange.isEmpty){this.viewport.interestRange.draw(ctx,viewLWorld,viewRWorld);this.viewport.interestRange.drawIndicators(ctx,viewLWorld,viewRWorld);}
+ctx.restore();return;case tr.ui.tracks.DrawType.HIGHLIGHTS:this.drawVSyncHighlight(ctx,dt,viewLWorld,viewRWorld,bounds.height);ctx.restore();return;case tr.ui.tracks.DrawType.ANNOTATIONS:for(let i=0;i<this.annotationViews_.length;i++){this.annotationViews_[i].draw(ctx);}
+ctx.restore();return;}
+ctx.restore();tr.ui.tracks.ContainerTrack.prototype.drawTrack.call(this,type);},drawFlowArrows_(viewLWorld,viewRWorld){const ctx=this.context();const dt=this.viewport.currentDisplayTransform;dt.applyTransformToCanvas(ctx);const pixWidth=dt.xViewVectorToWorld(1);ctx.strokeStyle='rgba(0, 0, 0, 0.4)';ctx.fillStyle='rgba(0, 0, 0, 0.4)';ctx.lineWidth=pixWidth>1.0?1:pixWidth;const events=this.model_.flowIntervalTree.findIntersection(viewLWorld,viewRWorld);const onlyHighlighted=!this.viewport.showFlowEvents;const canvasBounds=ctx.canvas.getBoundingClientRect();for(let i=0;i<events.length;++i){if(onlyHighlighted&&events[i].selectionState!==SelectionState.SELECTED&&events[i].selectionState!==SelectionState.HIGHLIGHTED){continue;}
+this.drawFlowArrow_(ctx,events[i],canvasBounds,pixWidth);}},drawFlowArrow_(ctx,flowEvent,canvasBounds,pixWidth){const pixelRatio=window.devicePixelRatio||1;const startTrack=this.viewport.trackForEvent(flowEvent.startSlice);const endTrack=this.viewport.trackForEvent(flowEvent.endSlice);if(startTrack===undefined||endTrack===undefined)return;const startBounds=startTrack.getBoundingClientRect();const endBounds=endTrack.getBoundingClientRect();if(flowEvent.selectionState===SelectionState.SELECTED){ctx.shadowBlur=1;ctx.shadowColor='red';ctx.shadowOffsety=2;ctx.strokeStyle='red';}else if(flowEvent.selectionState===SelectionState.HIGHLIGHTED){ctx.shadowBlur=1;ctx.shadowColor='red';ctx.shadowOffsety=2;ctx.strokeStyle='red';}else if(flowEvent.selectionState===SelectionState.DIMMED){ctx.shadowBlur=0;ctx.shadowOffsetX=0;ctx.strokeStyle='rgba(0, 0, 0, 0.2)';}else{let hasBoost=false;const startSlice=flowEvent.startSlice;hasBoost|=startSlice.selectionState===SelectionState.SELECTED;hasBoost|=startSlice.selectionState===SelectionState.HIGHLIGHTED;const endSlice=flowEvent.endSlice;hasBoost|=endSlice.selectionState===SelectionState.SELECTED;hasBoost|=endSlice.selectionState===SelectionState.HIGHLIGHTED;if(hasBoost){ctx.shadowBlur=1;ctx.shadowColor='rgba(255, 0, 0, 0.4)';ctx.shadowOffsety=2;ctx.strokeStyle='rgba(255, 0, 0, 0.4)';}else{ctx.shadowBlur=0;ctx.shadowOffsetX=0;ctx.strokeStyle='rgba(0, 0, 0, 0.4)';}}
+const startSize=startBounds.left+startBounds.top+
+startBounds.bottom+startBounds.right;const endSize=endBounds.left+endBounds.top+
+endBounds.bottom+endBounds.right;if(startSize===0&&endSize===0)return;const startY=this.calculateTrackY_(startTrack,canvasBounds);const endY=this.calculateTrackY_(endTrack,canvasBounds);const pixelStartY=pixelRatio*startY;const pixelEndY=pixelRatio*endY;const half=(flowEvent.end-flowEvent.start)/2;ctx.beginPath();ctx.moveTo(flowEvent.start,pixelStartY);ctx.bezierCurveTo(flowEvent.start+half,pixelStartY,flowEvent.start+half,pixelEndY,flowEvent.end,pixelEndY);ctx.stroke();const arrowWidth=5*pixWidth*pixelRatio;const distance=flowEvent.end-flowEvent.start;if(distance<=(2*arrowWidth))return;const tipX=flowEvent.end;const tipY=pixelEndY;const arrowHeight=(endBounds.height/4)*pixelRatio;tr.ui.b.drawTriangle(ctx,tipX,tipY,tipX-arrowWidth,tipY-arrowHeight,tipX-arrowWidth,tipY+arrowHeight);ctx.fill();},drawVSyncHighlight(ctx,dt,viewLWorld,viewRWorld,viewHeight){if(!this.viewport_.highlightVSync){return;}
+const stripes=ModelTrack.generateStripes_(this.vSyncTimes_,viewLWorld,viewRWorld);if(stripes.length===0){return;}
+const vSyncHighlightColor=new tr.b.Color(ColorScheme.getColorForReservedNameAsString('vsync_highlight_color'));const stripeRange=stripes[stripes.length-1].max-stripes[0].min;const stripeDensity=stripeRange?stripes.length/(dt.scaleX*stripeRange):0;const clampedStripeDensity=tr.b.math.clamp(stripeDensity,ModelTrack.VSYNC_DENSITY_OPAQUE,ModelTrack.VSYNC_DENSITY_TRANSPARENT);const opacity=(ModelTrack.VSYNC_DENSITY_TRANSPARENT-clampedStripeDensity)/ModelTrack.VSYNC_DENSITY_RANGE;if(opacity===0){return;}
+const pixelRatio=window.devicePixelRatio||1;const height=viewHeight*pixelRatio;ctx.fillStyle=vSyncHighlightColor.toStringWithAlphaOverride(ModelTrack.VSYNC_HIGHLIGHT_ALPHA*opacity);for(let i=0;i<stripes.length;i++){const xLeftView=dt.xWorldToView(stripes[i].min);const xRightView=dt.xWorldToView(stripes[i].max);ctx.fillRect(xLeftView,0,xRightView-xLeftView,height);}},calculateTrackY_(track,canvasBounds){const bounds=track.getBoundingClientRect();const size=bounds.left+bounds.top+bounds.bottom+bounds.right;if(size===0){return this.calculateTrackY_(Polymer.dom(track).parentNode,canvasBounds);}
+return bounds.top-canvasBounds.top+(bounds.height/2);},addIntersectingEventsInRangeToSelectionInWorldSpace(loWX,hiWX,viewPixWidthWorld,selection){function onPickHit(instantEvent){selection.push(instantEvent);}
+const instantEventWidth=3*viewPixWidthWorld;tr.b.math.iterateOverIntersectingIntervals(this.model_.instantEvents,function(x){return x.start;},function(x){return x.duration+instantEventWidth;},loWX,hiWX,onPickHit.bind(this));tr.ui.tracks.ContainerTrack.prototype.addIntersectingEventsInRangeToSelectionInWorldSpace.apply(this,arguments);},addClosestEventToSelection(worldX,worldMaxDist,loY,hiY,selection){this.addClosestInstantEventToSelection(this.model_.instantEvents,worldX,worldMaxDist,selection);tr.ui.tracks.ContainerTrack.prototype.addClosestEventToSelection.apply(this,arguments);}};return{ModelTrack,};});'use strict';tr.exportTo('tr.ui.tracks',function(){const XAxisTrack=tr.ui.b.define('x-axis-track',tr.ui.tracks.Track);XAxisTrack.prototype={__proto__:tr.ui.tracks.Track.prototype,decorate(viewport){tr.ui.tracks.Track.prototype.decorate.call(this,viewport);Polymer.dom(this).classList.add('x-axis-track');this.strings_secs_=[];this.strings_msecs_=[];this.strings_usecs_=[];this.strings_nsecs_=[];this.viewportChange_=this.viewportChange_.bind(this);viewport.addEventListener('change',this.viewportChange_);const heading=document.createElement('tr-ui-b-heading');heading.arrowVisible=false;Polymer.dom(this).appendChild(heading);},detach(){tr.ui.tracks.Track.prototype.detach.call(this);this.viewport.removeEventListener('change',this.viewportChange_);},viewportChange_(){if(this.viewport.interestRange.isEmpty){Polymer.dom(this).classList.remove('tall-mode');}else{Polymer.dom(this).classList.add('tall-mode');}},draw(type,viewLWorld,viewRWorld){switch(type){case tr.ui.tracks.DrawType.GRID:this.drawGrid_(viewLWorld,viewRWorld);break;case tr.ui.tracks.DrawType.MARKERS:if(!this.viewport.interestRange.isEmpty){this.viewport.interestRange.draw(this.context(),viewLWorld,viewRWorld);}
+break;}},drawGrid_(viewLWorld,viewRWorld){const ctx=this.context();const pixelRatio=window.devicePixelRatio||1;const canvasBounds=ctx.canvas.getBoundingClientRect();const trackBounds=this.getBoundingClientRect();const width=canvasBounds.width*pixelRatio;const height=trackBounds.height*pixelRatio;const hasInterestRange=!this.viewport.interestRange.isEmpty;const xAxisHeightPx=hasInterestRange?(height*2)/5:height;const vp=this.viewport;const dt=vp.currentDisplayTransform;vp.updateMajorMarkData(viewLWorld,viewRWorld);const majorMarkDistanceWorld=vp.majorMarkWorldPositions.length>1?vp.majorMarkWorldPositions[1]-vp.majorMarkWorldPositions[0]:0;const numTicksPerMajor=5;const minorMarkDistanceWorld=majorMarkDistanceWorld/numTicksPerMajor;const minorMarkDistancePx=dt.xWorldVectorToView(minorMarkDistanceWorld);const minorTickHeight=Math.floor(xAxisHeightPx*0.25);ctx.save();ctx.lineWidth=Math.round(pixelRatio);const crispLineCorrection=(ctx.lineWidth%2)/2;ctx.translate(crispLineCorrection,-crispLineCorrection);ctx.fillStyle='rgb(0, 0, 0)';ctx.strokeStyle='rgb(0, 0, 0)';ctx.textAlign='left';ctx.textBaseline='top';ctx.font=(9*pixelRatio)+'px sans-serif';const tickLabels=[];ctx.beginPath();for(let i=0;i<vp.majorMarkWorldPositions.length;i++){const curXWorld=vp.majorMarkWorldPositions[i];const curXView=dt.xWorldToView(curXWorld);const displayText=vp.majorMarkUnit.format(curXWorld,{deltaValue:majorMarkDistanceWorld});ctx.fillText(displayText,curXView+(2*pixelRatio),0);tr.ui.b.drawLine(ctx,curXView,0,curXView,xAxisHeightPx);if(minorMarkDistancePx){for(let j=1;j<numTicksPerMajor;++j){const xView=Math.floor(curXView+minorMarkDistancePx*j);tr.ui.b.drawLine(ctx,xView,xAxisHeightPx-minorTickHeight,xView,xAxisHeightPx);}}}
+ctx.strokeStyle='rgb(0, 0, 0)';tr.ui.b.drawLine(ctx,0,height,width,height);ctx.stroke();if(!hasInterestRange)return;tr.ui.b.drawLine(ctx,0,xAxisHeightPx,width,xAxisHeightPx);ctx.stroke();let displayDistance;const displayTextColor='rgb(0,0,0)';const arrowSpacing=10*pixelRatio;const arrowColor='rgb(128,121,121)';const arrowPosY=xAxisHeightPx*1.75;const arrowWidthView=3*pixelRatio;const arrowLengthView=10*pixelRatio;const spaceForArrowsView=2*(arrowWidthView+arrowSpacing);ctx.textBaseline='middle';ctx.font=(14*pixelRatio)+'px sans-serif';const textPosY=arrowPosY;const interestRange=vp.interestRange;if(interestRange.range===0){const markerWorld=interestRange.min;const markerView=dt.xWorldToView(markerWorld);const textToDraw=vp.majorMarkUnit.format(markerWorld);let textLeftView=markerView+4*pixelRatio;const textWidthView=ctx.measureText(textToDraw).width;if(textLeftView+textWidthView>width){textLeftView=markerView-4*pixelRatio-textWidthView;}
+ctx.fillStyle=displayTextColor;ctx.fillText(textToDraw,textLeftView,textPosY);return;}
+const leftMarker=interestRange.min;const rightMarker=interestRange.max;const leftMarkerView=dt.xWorldToView(leftMarker);const rightMarkerView=dt.xWorldToView(rightMarker);const distanceBetweenMarkers=interestRange.range;const distanceBetweenMarkersView=dt.xWorldVectorToView(distanceBetweenMarkers);const positionInMiddleOfMarkersView=leftMarkerView+(distanceBetweenMarkersView/2);const textToDraw=vp.majorMarkUnit.format(distanceBetweenMarkers);const textWidthView=ctx.measureText(textToDraw).width;const spaceForArrowsAndTextView=textWidthView+spaceForArrowsView+arrowSpacing;let textLeftView=positionInMiddleOfMarkersView-textWidthView/2;const textRightView=textLeftView+textWidthView;if(spaceForArrowsAndTextView>distanceBetweenMarkersView){textLeftView=rightMarkerView+2*arrowSpacing;if(textLeftView+textWidthView>width){textLeftView=leftMarkerView-2*arrowSpacing-textWidthView;}
+ctx.fillStyle=displayTextColor;ctx.fillText(textToDraw,textLeftView,textPosY);ctx.strokeStyle=arrowColor;ctx.beginPath();tr.ui.b.drawLine(ctx,leftMarkerView,arrowPosY,rightMarkerView,arrowPosY);ctx.stroke();ctx.fillStyle=arrowColor;tr.ui.b.drawArrow(ctx,leftMarkerView-1.5*arrowSpacing,arrowPosY,leftMarkerView,arrowPosY,arrowLengthView,arrowWidthView);tr.ui.b.drawArrow(ctx,rightMarkerView+1.5*arrowSpacing,arrowPosY,rightMarkerView,arrowPosY,arrowLengthView,arrowWidthView);}else if(spaceForArrowsView<=distanceBetweenMarkersView){let leftArrowStart;let rightArrowStart;if(spaceForArrowsAndTextView<=distanceBetweenMarkersView){ctx.fillStyle=displayTextColor;ctx.fillText(textToDraw,textLeftView,textPosY);leftArrowStart=textLeftView-arrowSpacing;rightArrowStart=textRightView+arrowSpacing;}else{leftArrowStart=positionInMiddleOfMarkersView;rightArrowStart=positionInMiddleOfMarkersView;}
+ctx.strokeStyle=arrowColor;ctx.fillStyle=arrowColor;tr.ui.b.drawArrow(ctx,leftArrowStart,arrowPosY,leftMarkerView,arrowPosY,arrowLengthView,arrowWidthView);tr.ui.b.drawArrow(ctx,rightArrowStart,arrowPosY,rightMarkerView,arrowPosY,arrowLengthView,arrowWidthView);}
+ctx.restore();},addIntersectingEventsInRangeToSelection(loVX,hiVX,loY,hiY,selection){},addAllEventsMatchingFilterToSelection(filter,selection){}};return{XAxisTrack,};});'use strict';Polymer({is:'tr-ui-timeline-track-view',ready(){this.displayTransform_=new tr.ui.TimelineDisplayTransform();this.model_=undefined;this.timelineView_=undefined;this.pollIfViewportAttachedInterval_=undefined;this.viewport_=new tr.ui.TimelineViewport(this);this.viewportDisplayTransformAtMouseDown_=undefined;this.brushingStateController_=undefined;this.rulerTrackContainer_=new tr.ui.tracks.DrawingContainer(this.viewport_);Polymer.dom(this).appendChild(this.rulerTrackContainer_);this.rulerTrackContainer_.invalidate();this.rulerTrack_=new tr.ui.tracks.XAxisTrack(this.viewport_);Polymer.dom(this.rulerTrackContainer_).appendChild(this.rulerTrack_);this.upperModelTrack_=new tr.ui.tracks.ModelTrack(this.viewport_);this.upperModelTrack_.upperMode=true;Polymer.dom(this.rulerTrackContainer_).appendChild(this.upperModelTrack_);this.modelTrackContainer_=new tr.ui.tracks.DrawingContainer(this.viewport_);Polymer.dom(this).appendChild(this.modelTrackContainer_);this.modelTrackContainer_.style.display='block';this.modelTrackContainer_.invalidate();this.viewport_.modelTrackContainer=this.modelTrackContainer_;this.modelTrack_=new tr.ui.tracks.ModelTrack(this.viewport_);Polymer.dom(this.modelTrackContainer_).appendChild(this.modelTrack_);this.timingTool_=new tr.ui.b.TimingTool(this.viewport_,this);this.initMouseModeSelector();this.hideDragBox_();this.initHintText_();this.onSelectionChanged_=this.onSelectionChanged_.bind(this);this.onDblClick_=this.onDblClick_.bind(this);this.addEventListener('dblclick',this.onDblClick_);this.onMouseWheel_=this.onMouseWheel_.bind(this);this.addEventListener('mousewheel',this.onMouseWheel_);this.onMouseDown_=this.onMouseDown_.bind(this);this.addEventListener('mousedown',this.onMouseDown_);this.onMouseMove_=this.onMouseMove_.bind(this);this.addEventListener('mousemove',this.onMouseMove_);this.onTouchStart_=this.onTouchStart_.bind(this);this.addEventListener('touchstart',this.onTouchStart_);this.onTouchMove_=this.onTouchMove_.bind(this);this.addEventListener('touchmove',this.onTouchMove_);this.onTouchEnd_=this.onTouchEnd_.bind(this);this.addEventListener('touchend',this.onTouchEnd_);this.addHotKeys_();this.mouseViewPosAtMouseDown_={x:0,y:0};this.lastMouseViewPos_={x:0,y:0};this.lastTouchViewPositions_=[];this.alert_=undefined;this.isPanningAndScanning_=false;this.isZooming_=false;},initMouseModeSelector(){this.mouseModeSelector_=document.createElement('tr-ui-b-mouse-mode-selector');this.mouseModeSelector_.targetElement=this;Polymer.dom(this).appendChild(this.mouseModeSelector_);this.mouseModeSelector_.addEventListener('beginpan',this.onBeginPanScan_.bind(this));this.mouseModeSelector_.addEventListener('updatepan',this.onUpdatePanScan_.bind(this));this.mouseModeSelector_.addEventListener('endpan',this.onEndPanScan_.bind(this));this.mouseModeSelector_.addEventListener('beginselection',this.onBeginSelection_.bind(this));this.mouseModeSelector_.addEventListener('updateselection',this.onUpdateSelection_.bind(this));this.mouseModeSelector_.addEventListener('endselection',this.onEndSelection_.bind(this));this.mouseModeSelector_.addEventListener('beginzoom',this.onBeginZoom_.bind(this));this.mouseModeSelector_.addEventListener('updatezoom',this.onUpdateZoom_.bind(this));this.mouseModeSelector_.addEventListener('endzoom',this.onEndZoom_.bind(this));this.mouseModeSelector_.addEventListener('entertiming',this.timingTool_.onEnterTiming.bind(this.timingTool_));this.mouseModeSelector_.addEventListener('begintiming',this.timingTool_.onBeginTiming.bind(this.timingTool_));this.mouseModeSelector_.addEventListener('updatetiming',this.timingTool_.onUpdateTiming.bind(this.timingTool_));this.mouseModeSelector_.addEventListener('endtiming',this.timingTool_.onEndTiming.bind(this.timingTool_));this.mouseModeSelector_.addEventListener('exittiming',this.timingTool_.onExitTiming.bind(this.timingTool_));const m=tr.ui.b.MOUSE_SELECTOR_MODE;this.mouseModeSelector_.supportedModeMask=m.SELECTION|m.PANSCAN|m.ZOOM|m.TIMING;this.mouseModeSelector_.settingsKey='timelineTrackView.mouseModeSelector';this.mouseModeSelector_.setKeyCodeForMode(m.PANSCAN,'2'.charCodeAt(0));this.mouseModeSelector_.setKeyCodeForMode(m.SELECTION,'1'.charCodeAt(0));this.mouseModeSelector_.setKeyCodeForMode(m.ZOOM,'3'.charCodeAt(0));this.mouseModeSelector_.setKeyCodeForMode(m.TIMING,'4'.charCodeAt(0));this.mouseModeSelector_.setModifierForAlternateMode(m.SELECTION,tr.ui.b.MODIFIER.SHIFT);this.mouseModeSelector_.setModifierForAlternateMode(m.PANSCAN,tr.ui.b.MODIFIER.SPACE);},get brushingStateController(){return this.brushingStateController_;},set brushingStateController(brushingStateController){if(this.brushingStateController_){this.brushingStateController_.removeEventListener('change',this.onSelectionChanged_);}
+this.brushingStateController_=brushingStateController;if(this.brushingStateController_){this.brushingStateController_.addEventListener('change',this.onSelectionChanged_);}},set timelineView(view){this.timelineView_=view;},onSelectionChanged_(){this.showHintText_('Press \'m\' to mark current selection');this.viewport_.dispatchChangeEvent();},set selection(selection){throw new Error('DO NOT CALL THIS');},set highlight(highlight){throw new Error('DO NOT CALL THIS');},detach(){this.modelTrack_.detach();this.upperModelTrack_.detach();if(this.pollIfViewportAttachedInterval_){window.clearInterval(this.pollIfViewportAttachedInterval_);this.pollIfViewportAttachedInterval_=undefined;}
+this.viewport_.detach();},get viewport(){return this.viewport_;},get model(){return this.model_;},set model(model){if(!model){throw new Error('Model cannot be undefined');}
+const modelInstanceChanged=this.model_!==model;this.model_=model;this.modelTrack_.model=model;this.upperModelTrack_.model=model;if(modelInstanceChanged){this.pollIfViewportAttachedInterval_=window.setInterval(this.pollIfViewportAttached_.bind(this),250);}},get hasVisibleContent(){return this.modelTrack_.hasVisibleContent||this.upperModelTrack_.hasVisibleContent;},pollIfViewportAttached_(){if(!this.viewport_.isAttachedToDocumentOrInTestMode||this.viewport_.clientWidth===0){return;}
+window.addEventListener('resize',this.viewport_.dispatchChangeEvent);window.clearInterval(this.pollIfViewportAttachedInterval_);this.pollIfViewportAttachedInterval_=undefined;this.setInitialViewport_();},setInitialViewport_(){this.modelTrackContainer_.updateCanvasSizeIfNeeded_();const w=this.modelTrackContainer_.canvas.width;let min;let range;if(this.model_.bounds.isEmpty){min=0;range=1000;}else if(this.model_.bounds.range===0){min=this.model_.bounds.min;range=1000;}else{min=this.model_.bounds.min;range=this.model_.bounds.range;}
+const boost=range*0.15;this.displayTransform_.set(this.viewport_.currentDisplayTransform);this.displayTransform_.xSetWorldBounds(min-boost,min+range+boost,w);this.viewport_.setDisplayTransformImmediately(this.displayTransform_);},addAllEventsMatchingFilterToSelectionAsTask(filter,selection){const modelTrack=this.modelTrack_;const firstT=modelTrack.addAllEventsMatchingFilterToSelectionAsTask(filter,selection);const lastT=firstT.after(function(){this.upperModelTrack_.addAllEventsMatchingFilterToSelection(filter,selection);},this);return firstT;},onMouseMove_(e){if(this.isZooming_)return;this.storeLastMousePos_(e);},onTouchStart_(e){this.storeLastTouchPositions_(e);this.focusElements_();},onTouchMove_(e){e.preventDefault();this.onUpdateTransformForTouch_(e);},onTouchEnd_(e){this.storeLastTouchPositions_(e);this.focusElements_();},addHotKeys_(){this.addKeyDownHotKeys_();this.addKeyPressHotKeys_();},addKeyPressHotKey(dict){dict.eventType='keypress';dict.useCapture=false;dict.thisArg=this;const binding=new tr.ui.b.HotKey(dict);this.$.hotkey_controller.addHotKey(binding);},addKeyPressHotKeys_(){this.addKeyPressHotKey({keyCodes:['w'.charCodeAt(0),','.charCodeAt(0)],callback(e){this.zoomBy_(1.5,true);e.stopPropagation();}});this.addKeyPressHotKey({keyCodes:['s'.charCodeAt(0),'o'.charCodeAt(0)],callback(e){this.zoomBy_(1/1.5,true);e.stopPropagation();}});this.addKeyPressHotKey({keyCode:'g'.charCodeAt(0),callback(e){this.onGridToggle_(true);e.stopPropagation();}});this.addKeyPressHotKey({keyCode:'G'.charCodeAt(0),callback(e){this.onGridToggle_(false);e.stopPropagation();}});this.addKeyPressHotKey({keyCodes:['W'.charCodeAt(0),'<'.charCodeAt(0)],callback(e){this.zoomBy_(10,true);e.stopPropagation();}});this.addKeyPressHotKey({keyCodes:['S'.charCodeAt(0),'O'.charCodeAt(0)],callback(e){this.zoomBy_(1/10,true);e.stopPropagation();}});this.addKeyPressHotKey({keyCode:'a'.charCodeAt(0),callback(e){this.queueSmoothPan_(this.viewWidth_*0.3,0);e.stopPropagation();}});this.addKeyPressHotKey({keyCodes:['d'.charCodeAt(0),'e'.charCodeAt(0)],callback(e){this.queueSmoothPan_(this.viewWidth_*-0.3,0);e.stopPropagation();}});this.addKeyPressHotKey({keyCode:'A'.charCodeAt(0),callback(e){this.queueSmoothPan_(viewWidth*0.5,0);e.stopPropagation();}});this.addKeyPressHotKey({keyCode:'D'.charCodeAt(0),callback(e){this.queueSmoothPan_(viewWidth*-0.5,0);e.stopPropagation();}});this.addKeyPressHotKey({keyCode:'0'.charCodeAt(0),callback(e){this.setInitialViewport_();e.stopPropagation();}});this.addKeyPressHotKey({keyCode:'f'.charCodeAt(0),callback(e){this.zoomToSelection();e.stopPropagation();}});this.addKeyPressHotKey({keyCode:'m'.charCodeAt(0),callback(e){this.setCurrentSelectionAsInterestRange_();e.stopPropagation();}});this.addKeyPressHotKey({keyCode:'p'.charCodeAt(0),callback(e){this.selectPowerSamplesInCurrentTimeRange_();e.stopPropagation();}});this.addKeyPressHotKey({keyCode:'h'.charCodeAt(0),callback(e){this.toggleHighDetails_();e.stopPropagation();}});},get viewWidth_(){return this.modelTrackContainer_.canvas.clientWidth;},addKeyDownHotKeys_(){const addBinding=function(dict){dict.eventType='keydown';dict.useCapture=false;dict.thisArg=this;const binding=new tr.ui.b.HotKey(dict);this.$.hotkey_controller.addHotKey(binding);}.bind(this);addBinding({keyCode:37,callback(e){const curSel=this.brushingStateController_.selection;const sel=this.viewport.getShiftedSelection(curSel,-1);if(sel){this.brushingStateController.changeSelectionFromTimeline(sel);this.panToSelection();}else{this.queueSmoothPan_(this.viewWidth_*0.3,0);}
+e.preventDefault();e.stopPropagation();}});addBinding({keyCode:39,callback(e){const curSel=this.brushingStateController_.selection;const sel=this.viewport.getShiftedSelection(curSel,1);if(sel){this.brushingStateController.changeSelectionFromTimeline(sel);this.panToSelection();}else{this.queueSmoothPan_(-this.viewWidth_*0.3,0);}
+e.preventDefault();e.stopPropagation();}});},onDblClick_(e){if(this.mouseModeSelector_.mode!==tr.ui.b.MOUSE_SELECTOR_MODE.SELECTION){return;}
+const curSelection=this.brushingStateController_.selection;if(!curSelection.length||!tr.b.getOnlyElement(curSelection).title){return;}
+const selection=new tr.model.EventSet();const filter=new tr.c.ExactTitleFilter(tr.b.getOnlyElement(curSelection).title);this.modelTrack_.addAllEventsMatchingFilterToSelection(filter,selection);this.brushingStateController.changeSelectionFromTimeline(selection);},onMouseWheel_(e){if(!e.altKey)return;const delta=e.wheelDelta/120;const zoomScale=Math.pow(1.5,delta);this.zoomBy_(zoomScale);e.preventDefault();},onMouseDown_(e){if(this.mouseModeSelector_.mode!==tr.ui.b.MOUSE_SELECTOR_MODE.SELECTION){return;}
+if(e.target!==this.rulerTrack_)return;this.dragBeginEvent_=undefined;if(this.xNavStringMarker_){this.model.removeAnnotation(this.xNavStringMarker_);this.xNavStringMarker_=undefined;}
+const dt=this.viewport_.currentDisplayTransform;tr.ui.b.trackMouseMovesUntilMouseUp(function(e){if(e.target===this.rulerTrack_)return;const relativePosition=this.extractRelativeMousePosition_(e);const loc=tr.model.Location.fromViewCoordinates(this.viewport_,relativePosition.x,relativePosition.y);if(!loc)return;if(this.guideLineAnnotation_===undefined){this.guideLineAnnotation_=new tr.model.XMarkerAnnotation(loc.xWorld);this.model.addAnnotation(this.guideLineAnnotation_);}else{this.guideLineAnnotation_.timestamp=loc.xWorld;this.modelTrackContainer_.invalidate();}
+const state=new tr.ui.b.UIState(loc,this.viewport_.currentDisplayTransform.scaleX);this.timelineView_.setFindCtlText(state.toUserFriendlyString(this.viewport_));}.bind(this),undefined,function onKeyUpDuringDrag(){if(this.dragBeginEvent_){this.setDragBoxPosition_(this.dragBoxXStart_,this.dragBoxYStart_,this.dragBoxXEnd_,this.dragBoxYEnd_);}}.bind(this));},queueSmoothPan_(viewDeltaX,deltaY){const deltaX=this.viewport_.currentDisplayTransform.xViewVectorToWorld(viewDeltaX);const animation=new tr.ui.TimelineDisplayTransformPanAnimation(deltaX,deltaY);this.viewport_.queueDisplayTransformAnimation(animation);},zoomBy_(scale,smooth){if(scale<=0){return;}
+smooth=!!smooth;const vp=this.viewport_;const pixelRatio=window.devicePixelRatio||1;const goalFocalPointXView=this.lastMouseViewPos_.x*pixelRatio;const goalFocalPointXWorld=vp.currentDisplayTransform.xViewToWorld(goalFocalPointXView);if(smooth){const animation=new tr.ui.TimelineDisplayTransformZoomToAnimation(goalFocalPointXWorld,goalFocalPointXView,vp.currentDisplayTransform.panY,scale);vp.queueDisplayTransformAnimation(animation);}else{this.displayTransform_.set(vp.currentDisplayTransform);this.displayTransform_.scaleX*=scale;this.displayTransform_.xPanWorldPosToViewPos(goalFocalPointXWorld,goalFocalPointXView,this.viewWidth_);vp.setDisplayTransformImmediately(this.displayTransform_);}},zoomToSelection(){if(!this.brushingStateController.selectionOfInterest.length)return;const bounds=this.brushingStateController.selectionOfInterest.bounds;if(!bounds.range)return;const worldCenter=bounds.center;const viewCenter=this.modelTrackContainer_.canvas.width/2;const adjustedWorldRange=bounds.range*1.25;const newScale=this.modelTrackContainer_.canvas.width/adjustedWorldRange;const zoomInRatio=newScale/this.viewport_.currentDisplayTransform.scaleX;const animation=new tr.ui.TimelineDisplayTransformZoomToAnimation(worldCenter,viewCenter,this.viewport_.currentDisplayTransform.panY,zoomInRatio);this.viewport_.queueDisplayTransformAnimation(animation);},panToSelection(){if(!this.brushingStateController.selectionOfInterest.length)return;const bounds=this.brushingStateController.selectionOfInterest.bounds;const worldCenter=bounds.center;const viewWidth=this.viewWidth_;const dt=this.viewport_.currentDisplayTransform;if(false&&!bounds.range){if(dt.xWorldToView(bounds.center)<0||dt.xWorldToView(bounds.center)>viewWidth){this.displayTransform_.set(dt);this.displayTransform_.xPanWorldPosToViewPos(worldCenter,'center',viewWidth);const deltaX=this.displayTransform_.panX-dt.panX;const animation=new tr.ui.TimelineDisplayTransformPanAnimation(deltaX,0);this.viewport_.queueDisplayTransformAnimation(animation);}
+return;}
+this.displayTransform_.set(dt);this.displayTransform_.xPanWorldBoundsIntoView(bounds.min,bounds.max,viewWidth);const deltaX=this.displayTransform_.panX-dt.panX;const animation=new tr.ui.TimelineDisplayTransformPanAnimation(deltaX,0);this.viewport_.queueDisplayTransformAnimation(animation);},navToPosition(uiState,showNavLine){const location=uiState.location;const scaleX=uiState.scaleX;const track=location.getContainingTrack(this.viewport_);const worldCenter=location.xWorld;const viewCenter=this.modelTrackContainer_.canvas.width/5;const zoomInRatio=scaleX/this.viewport_.currentDisplayTransform.scaleX;track.scrollIntoViewIfNeeded();const animation=new tr.ui.TimelineDisplayTransformZoomToAnimation(worldCenter,viewCenter,this.viewport_.currentDisplayTransform.panY,zoomInRatio);this.viewport_.queueDisplayTransformAnimation(animation);if(!showNavLine)return;if(this.xNavStringMarker_){this.model.removeAnnotation(this.xNavStringMarker_);}
+this.xNavStringMarker_=new tr.model.XMarkerAnnotation(worldCenter);this.model.addAnnotation(this.xNavStringMarker_);},selectPowerSamplesInCurrentTimeRange_(){const selectionBounds=this.brushingStateController_.selection.bounds;if(this.model.device.powerSeries&&!selectionBounds.empty){const events=this.model.device.powerSeries.getSamplesWithinRange(selectionBounds.min,selectionBounds.max);const selection=new tr.model.EventSet(events);this.brushingStateController_.changeSelectionFromTimeline(selection);}},setCurrentSelectionAsInterestRange_(){const selectionBounds=this.brushingStateController_.selection.bounds;if(selectionBounds.empty){this.viewport_.interestRange.reset();return;}
+if(this.viewport_.interestRange.min===selectionBounds.min&&this.viewport_.interestRange.max===selectionBounds.max){this.viewport_.interestRange.reset();}else{this.viewport_.interestRange.set(selectionBounds);}},toggleHighDetails_(){this.viewport_.highDetails=!this.viewport_.highDetails;},hideDragBox_(){this.$.drag_box.style.left='-1000px';this.$.drag_box.style.top='-1000px';this.$.drag_box.style.width=0;this.$.drag_box.style.height=0;},setDragBoxPosition_(xStart,yStart,xEnd,yEnd){const loY=Math.min(yStart,yEnd);const hiY=Math.max(yStart,yEnd);const loX=Math.min(xStart,xEnd);const hiX=Math.max(xStart,xEnd);const modelTrackRect=this.modelTrack_.getBoundingClientRect();const dragRect={left:loX,top:loY,width:hiX-loX,height:hiY-loY};dragRect.right=dragRect.left+dragRect.width;dragRect.bottom=dragRect.top+dragRect.height;const modelTrackContainerRect=this.modelTrackContainer_.getBoundingClientRect();const clipRect={left:modelTrackContainerRect.left,top:modelTrackContainerRect.top,right:modelTrackContainerRect.right,bottom:modelTrackContainerRect.bottom};const headingWidth=window.getComputedStyle(Polymer.dom(this).querySelector('tr-ui-b-heading')).width;const trackTitleWidth=parseInt(headingWidth);clipRect.left=clipRect.left+trackTitleWidth;const intersectRect_=function(r1,r2){if(r2.left>r1.right||r2.right<r1.left||r2.top>r1.bottom||r2.bottom<r1.top){return false;}
+const results={};results.left=Math.max(r1.left,r2.left);results.top=Math.max(r1.top,r2.top);results.right=Math.min(r1.right,r2.right);results.bottom=Math.min(r1.bottom,r2.bottom);results.width=results.right-results.left;results.height=results.bottom-results.top;return results;};const finalDragBox=intersectRect_(clipRect,dragRect);this.$.drag_box.style.left=finalDragBox.left+'px';this.$.drag_box.style.width=finalDragBox.width+'px';this.$.drag_box.style.top=finalDragBox.top+'px';this.$.drag_box.style.height=finalDragBox.height+'px';this.$.drag_box.style.whiteSpace='nowrap';const pixelRatio=window.devicePixelRatio||1;const canv=this.modelTrackContainer_.canvas;const dt=this.viewport_.currentDisplayTransform;const loWX=dt.xViewToWorld((loX-canv.offsetLeft)*pixelRatio);const hiWX=dt.xViewToWorld((hiX-canv.offsetLeft)*pixelRatio);Polymer.dom(this.$.drag_box).textContent=tr.b.Unit.byName.timeDurationInMs.format(hiWX-loWX);const e=new tr.b.Event('selectionChanging');e.loWX=loWX;e.hiWX=hiWX;this.dispatchEvent(e);},onGridToggle_(left){const selection=this.brushingStateController_.selection;const tb=left?selection.bounds.min:selection.bounds.max;if(this.viewport_.gridEnabled&&this.viewport_.gridSide===left&&this.viewport_.gridInitialTimebase===tb){this.viewport_.gridside=undefined;this.viewport_.gridEnabled=false;this.viewport_.gridInitialTimebase=undefined;return;}
+const numIntervalsSinceStart=Math.ceil((tb-this.model_.bounds.min)/this.viewport_.gridStep_);this.viewport_.gridEnabled=true;this.viewport_.gridSide=left;this.viewport_.gridInitialTimebase=tb;this.viewport_.gridTimebase=tb-
+(numIntervalsSinceStart+1)*this.viewport_.gridStep_;},storeLastMousePos_(e){this.lastMouseViewPos_=this.extractRelativeMousePosition_(e);},storeLastTouchPositions_(e){this.lastTouchViewPositions_=this.extractRelativeTouchPositions_(e);},extractRelativeMousePosition_(e){const canv=this.modelTrackContainer_.canvas;return{x:e.clientX-canv.offsetLeft,y:e.clientY-canv.offsetTop};},extractRelativeTouchPositions_(e){const canv=this.modelTrackContainer_.canvas;const touches=[];for(let i=0;i<e.touches.length;++i){touches.push({x:e.touches[i].clientX-canv.offsetLeft,y:e.touches[i].clientY-canv.offsetTop});}
+return touches;},storeInitialMouseDownPos_(e){const position=this.extractRelativeMousePosition_(e);this.mouseViewPosAtMouseDown_.x=position.x;this.mouseViewPosAtMouseDown_.y=position.y;},focusElements_(){this.$.hotkey_controller.childRequestsGeneralFocus(this);},storeInitialInteractionPositionsAndFocus_(e){this.storeInitialMouseDownPos_(e);this.storeLastMousePos_(e);this.focusElements_();},onBeginPanScan_(e){const vp=this.viewport_;this.viewportDisplayTransformAtMouseDown_=vp.currentDisplayTransform.clone();this.isPanningAndScanning_=true;this.storeInitialInteractionPositionsAndFocus_(e);e.preventDefault();},onUpdatePanScan_(e){if(!this.isPanningAndScanning_)return;const viewWidth=this.viewWidth_;const pixelRatio=window.devicePixelRatio||1;const xDeltaView=pixelRatio*(this.lastMouseViewPos_.x-
+this.mouseViewPosAtMouseDown_.x);const yDelta=this.lastMouseViewPos_.y-
+this.mouseViewPosAtMouseDown_.y;this.displayTransform_.set(this.viewportDisplayTransformAtMouseDown_);this.displayTransform_.incrementPanXInViewUnits(xDeltaView);this.displayTransform_.panY-=yDelta;this.viewport_.setDisplayTransformImmediately(this.displayTransform_);e.preventDefault();e.stopPropagation();this.storeLastMousePos_(e);},onEndPanScan_(e){this.isPanningAndScanning_=false;this.storeLastMousePos_(e);if(!e.isClick){e.preventDefault();}},onBeginSelection_(e){const canv=this.modelTrackContainer_.canvas;const rect=this.modelTrack_.getBoundingClientRect();const canvRect=canv.getBoundingClientRect();const inside=rect&&e.clientX>=rect.left&&e.clientX<rect.right&&e.clientY>=rect.top&&e.clientY<rect.bottom&&e.clientX>=canvRect.left&&e.clientX<canvRect.right;if(!inside)return;this.dragBeginEvent_=e;this.storeInitialInteractionPositionsAndFocus_(e);e.preventDefault();},onUpdateSelection_(e){if(!this.dragBeginEvent_)return;this.dragBoxXStart_=this.dragBeginEvent_.clientX;this.dragBoxXEnd_=e.clientX;this.dragBoxYStart_=this.dragBeginEvent_.clientY;this.dragBoxYEnd_=e.clientY;this.setDragBoxPosition_(this.dragBoxXStart_,this.dragBoxYStart_,this.dragBoxXEnd_,this.dragBoxYEnd_);},onEndSelection_(e){e.preventDefault();if(!this.dragBeginEvent_)return;this.hideDragBox_();const eDown=this.dragBeginEvent_;this.dragBeginEvent_=undefined;const loY=Math.min(eDown.clientY,e.clientY);const hiY=Math.max(eDown.clientY,e.clientY);const loX=Math.min(eDown.clientX,e.clientX);const hiX=Math.max(eDown.clientX,e.clientX);const canv=this.modelTrackContainer_.canvas;const worldOffset=canv.getBoundingClientRect().left;const loVX=loX-worldOffset;const hiVX=hiX-worldOffset;const selection=new tr.model.EventSet();if(eDown.appendSelection){const previousSelection=this.brushingStateController_.selection;if(previousSelection!==undefined){selection.addEventSet(previousSelection);}}
+this.modelTrack_.addIntersectingEventsInRangeToSelection(loVX,hiVX,loY,hiY,selection);this.brushingStateController_.changeSelectionFromTimeline(selection);},onBeginZoom_(e){this.isZooming_=true;this.storeInitialInteractionPositionsAndFocus_(e);e.preventDefault();},onUpdateZoom_(e){if(!this.isZooming_)return;const newPosition=this.extractRelativeMousePosition_(e);const zoomScaleValue=1+(this.lastMouseViewPos_.y-
+newPosition.y)*0.01;this.zoomBy_(zoomScaleValue,false);this.storeLastMousePos_(e);},onEndZoom_(e){this.isZooming_=false;if(!e.isClick){e.preventDefault();}},computeTouchCenter_(positions){let xSum=0;let ySum=0;for(let i=0;i<positions.length;++i){xSum+=positions[i].x;ySum+=positions[i].y;}
+return{x:xSum/positions.length,y:ySum/positions.length};},computeTouchSpan_(positions){let xMin=Number.MAX_VALUE;let yMin=Number.MAX_VALUE;let xMax=Number.MIN_VALUE;let yMax=Number.MIN_VALUE;for(let i=0;i<positions.length;++i){xMin=Math.min(xMin,positions[i].x);yMin=Math.min(yMin,positions[i].y);xMax=Math.max(xMax,positions[i].x);yMax=Math.max(yMax,positions[i].y);}
+return Math.sqrt((xMin-xMax)*(xMin-xMax)+
+(yMin-yMax)*(yMin-yMax));},onUpdateTransformForTouch_(e){const newPositions=this.extractRelativeTouchPositions_(e);const currentPositions=this.lastTouchViewPositions_;const newCenter=this.computeTouchCenter_(newPositions);const currentCenter=this.computeTouchCenter_(currentPositions);const newSpan=this.computeTouchSpan_(newPositions);const currentSpan=this.computeTouchSpan_(currentPositions);const vp=this.viewport_;const viewWidth=this.viewWidth_;const pixelRatio=window.devicePixelRatio||1;const xDelta=pixelRatio*(newCenter.x-currentCenter.x);const yDelta=newCenter.y-currentCenter.y;const zoomScaleValue=currentSpan>10?newSpan/currentSpan:1;const viewFocus=pixelRatio*newCenter.x;const worldFocus=vp.currentDisplayTransform.xViewToWorld(viewFocus);this.displayTransform_.set(vp.currentDisplayTransform);this.displayTransform_.scaleX*=zoomScaleValue;this.displayTransform_.xPanWorldPosToViewPos(worldFocus,viewFocus,viewWidth);this.displayTransform_.incrementPanXInViewUnits(xDelta);this.displayTransform_.panY-=yDelta;vp.setDisplayTransformImmediately(this.displayTransform_);this.storeLastTouchPositions_(e);},initHintText_(){this.$.hint_text.style.display='none';this.pendingHintTextClearTimeout_=undefined;},showHintText_(text){if(this.pendingHintTextClearTimeout_){window.clearTimeout(this.pendingHintTextClearTimeout_);this.pendingHintTextClearTimeout_=undefined;}
+this.pendingHintTextClearTimeout_=setTimeout(this.hideHintText_.bind(this),1000);Polymer.dom(this.$.hint_text).textContent=text;this.$.hint_text.style.display='';},hideHintText_(){this.pendingHintTextClearTimeout_=undefined;this.$.hint_text.style.display='none';}});'use strict';Polymer({is:'tr-ui-find-control',filterKeyDown(e){if(e.keyCode===27){const hkc=tr.b.getHotkeyControllerForElement(this);if(hkc){hkc.childRequestsBlur(this);}else{this.blur();}
+e.preventDefault();e.stopPropagation();return;}else if(e.keyCode===13){if(e.shiftKey){this.findPrevious();}else{this.findNext();}}},filterBlur(e){this.updateHitCountEl();},filterFocus(e){this.$.filter.select();},filterMouseUp(e){e.preventDefault();},get controller(){return this.controller_;},set controller(c){this.controller_=c;this.updateHitCountEl();},focus(){this.$.filter.focus();},get hasFocus(){return this===document.activeElement;},filterTextChanged(){Polymer.dom(this.$.hitCount).textContent='';this.$.spinner.style.visibility='visible';this.$.spinner.style.animation='spin 1s linear infinite';this.controller.startFiltering(this.$.filter.value).then(function(){this.$.spinner.style.visibility='hidden';this.$.spinner.style.animation='';this.updateHitCountEl();}.bind(this));},findNext(){if(this.controller){this.controller.findNext();}
+this.updateHitCountEl();},findPrevious(){if(this.controller){this.controller.findPrevious();}
+this.updateHitCountEl();},updateHitCountEl(){if(!this.controller||this.$.filter.value.length===0){Polymer.dom(this.$.hitCount).textContent='';return;}
+const n=this.controller.filterHits.length;const i=n===0?-1:this.controller.currentHitIndex;Polymer.dom(this.$.hitCount).textContent=(i+1)+' of '+n;},setText(string){this.$.filter.value=string;}});'use strict';tr.exportTo('tr.e.tquery',function(){function Context(){this.event=undefined;this.ancestors=[];}
+Context.prototype={push(event){const ctx=new Context();ctx.ancestors=this.ancestors.slice();ctx.ancestors.push(event);return ctx;},pop(event){const ctx=new Context();ctx.event=this.ancestors[this.ancestors.length-1];ctx.ancestors=this.ancestors.slice(0,this.ancestors.length-1);return ctx;}};return{Context,};});'use strict';tr.exportTo('tr.e.tquery',function(){function Filter(){tr.c.ScriptingObject.call(this);}
+Filter.normalizeFilterExpression=function(filterExpression){if(filterExpression instanceof String||typeof(filterExpression)==='string'||filterExpression instanceof RegExp){const filter=new tr.e.tquery.FilterHasTitle(filterExpression);return filter;}
+return filterExpression;};Filter.prototype={__proto__:tr.c.ScriptingObject.prototype,evaluate(context){throw new Error('Not implemented');},matchValue_(value,expected){if(expected instanceof RegExp){return expected.test(value);}else if(expected instanceof Function){return expected(value);}
+return value===expected;}};return{Filter,};});'use strict';tr.exportTo('tr.e.tquery',function(){function FilterAllOf(opt_subExpressions){tr.e.tquery.Filter.call(this);this.subExpressions=opt_subExpressions||[];}
+FilterAllOf.prototype={__proto__:tr.e.tquery.Filter.prototype,set subExpressions(exprs){this.subExpressions_=[];for(let i=0;i<exprs.length;i++){this.subExpressions_.push(tr.e.tquery.Filter.normalizeFilterExpression(exprs[i]));}},get subExpressions(){return this.subExpressions_;},evaluate(context){if(!this.subExpressions.length)return true;for(let i=0;i<this.subExpressions.length;i++){if(!this.subExpressions[i].evaluate(context)){return false;}}
+return true;}};tr.c.ScriptingObjectRegistry.register(function(){const exprs=[];for(let i=0;i<arguments.length;i++){exprs.push(arguments[i]);}
+return new FilterAllOf(exprs);},{name:'allOf'});return{FilterAllOf,};});'use strict';tr.exportTo('tr.e.tquery',function(){function FilterNot(subExpression){tr.e.tquery.Filter.call(this);this.subExpression=subExpression;}
+FilterNot.prototype={__proto__:tr.e.tquery.Filter.prototype,set subExpression(expr){this.subExpression_=tr.e.tquery.Filter.normalizeFilterExpression(expr);},get subExpression(){return this.subExpression_;},evaluate(context){return!this.subExpression.evaluate(context);}};tr.c.ScriptingObjectRegistry.register(function(){const exprs=Array.prototype.slice.call(arguments);if(exprs.length!==1){throw new Error('not() must have exactly one subexpression');}
+return new FilterNot(exprs[0]);},{name:'not'});return{FilterNot,};});'use strict';tr.exportTo('tr.e.tquery',function(){function FilterAnyOf(opt_subExpressions){tr.e.tquery.Filter.call(this);this.subExpressions=opt_subExpressions||[];}
+FilterAnyOf.prototype={__proto__:tr.e.tquery.Filter.prototype,set subExpressions(exprs){this.subExpressions_=[];for(let i=0;i<exprs.length;i++){this.subExpressions_.push(tr.e.tquery.Filter.normalizeFilterExpression(exprs[i]));}},get subExpressions(){return this.subExpressions_;},evaluate(context){if(!this.subExpressions.length)return true;for(let i=0;i<this.subExpressions.length;i++){if(this.subExpressions[i].evaluate(context))return true;}
+return false;}};tr.c.ScriptingObjectRegistry.register(function(){const exprs=Array.prototype.slice.call(arguments);return new FilterAnyOf(exprs);},{name:'anyOf'});tr.c.ScriptingObjectRegistry.register(function(){const exprs=Array.prototype.slice.call(arguments);return new tr.e.tquery.FilterNot(new FilterAnyOf(exprs));},{name:'noneOf'});return{FilterAnyOf,};});'use strict';tr.exportTo('tr.e.tquery',function(){function FilterHasAncestor(opt_subExpression){this.subExpression=opt_subExpression;}
+FilterHasAncestor.prototype={__proto__:tr.e.tquery.Filter.prototype,set subExpression(expr){this.subExpression_=tr.e.tquery.Filter.normalizeFilterExpression(expr);},get subExpression(){return this.subExpression_;},evaluate(context){if(!this.subExpression){return context.ancestors.length>0;}
+while(context.ancestors.length){context=context.pop();if(this.subExpression.evaluate(context))return true;}
+return false;}};tr.c.ScriptingObjectRegistry.register(function(subExpression){return new FilterHasAncestor(subExpression);},{name:'hasAncestor'});return{FilterHasAncestor,};});'use strict';tr.exportTo('tr.e.tquery',function(){function FilterHasDuration(minValueOrExpected,opt_maxValue){if(minValueOrExpected!==undefined&&opt_maxValue!==undefined){this.minValue=minValueOrExpected;this.maxValue=opt_maxValue;}else{this.expected=minValueOrExpected;}}
+FilterHasDuration.prototype={__proto__:tr.e.tquery.Filter.prototype,evaluate(context){if(context.event.duration===undefined)return false;if(this.minValue!==undefined&&this.maxValue!==undefined){return context.event.duration>=this.minValue&&context.event.duration<=this.maxValue;}
+return this.matchValue_(context.event.duration,this.expected);}};tr.c.ScriptingObjectRegistry.register(function(minValueOrExpected,opt_maxValue){return new FilterHasDuration(minValueOrExpected,opt_maxValue);},{name:'hasDuration'});return{FilterHasDuration,};});'use strict';tr.exportTo('tr.e.tquery',function(){function FilterHasTitle(expected){tr.e.tquery.Filter.call(this);this.expected=expected;}
+FilterHasTitle.prototype={__proto__:tr.e.tquery.Filter.prototype,evaluate(context){return this.matchValue_(context.event.title,this.expected);}};tr.c.ScriptingObjectRegistry.register(function(expected){const filter=new tr.e.tquery.FilterHasTitle(expected);return filter;},{name:'hasTitle'});return{FilterHasTitle,};});'use strict';tr.exportTo('tr.e.tquery',function(){function FilterIsTopLevel(opt_subExpression){this.subExpression=opt_subExpression;}
+FilterIsTopLevel.prototype={__proto__:tr.e.tquery.Filter.prototype,set subExpression(expr){this.subExpression_=tr.e.tquery.Filter.normalizeFilterExpression(expr);},get subExpression(){return this.subExpression_;},evaluate(context){if(context.ancestors.length>0)return false;if(!this.subExpression)return true;return this.subExpression.evaluate(context);}};tr.c.ScriptingObjectRegistry.register(function(subExpression){return new FilterIsTopLevel(subExpression);},{name:'isTopLevel'});return{FilterIsTopLevel,};});'use strict';tr.exportTo('tr.e.tquery',function(){function addEventTreeToSelection(selection,event){selection.push(event);if(!event.subSlices)return;event.subSlices.forEach(addEventTreeToSelection.bind(undefined,selection));}
+function TQuery(model){tr.c.ScriptingObject.call(this);this.model_=model;this.parent_=undefined;this.filterExpression_=undefined;this.selection_=undefined;}
+TQuery.prototype={__proto__:tr.c.ScriptingObject.prototype,onModelChanged(model){this.model_=model;this.selection_=undefined;},get brushingStateController(){return this.brushingStateController_;},filter(filterExpression){const result=new TQuery(this.model_);result.parent_=this;result.filterExpression_=tr.e.tquery.Filter.normalizeFilterExpression(filterExpression);return result;},createFilterTaskGraph_(){const nodes=[this];while(nodes[nodes.length-1].parent_){nodes.push(nodes[nodes.length-1].parent_);}
+const rootTask=new tr.b.Task();let lastTask=rootTask;let node;for(let i=nodes.length-1;i>=0;i--){node=nodes[i];if(node.selection_!==undefined)continue;node.selection_=new tr.model.EventSet();if(node.parent_===undefined){lastTask=lastTask.after(this.selectEverythingAsTask_(node.selection_));}else{const prevNode=nodes[i+1];lastTask=this.createFilterTaskForNode_(lastTask,node,prevNode);}}
+return{rootTask,lastTask,lastNode:node};},createFilterTaskForNode_(lastTask,node,prevNode){return lastTask.after(function(){node.evaluateFilterExpression_(prevNode.selection_,node.selection_);},this);},evaluateFilterExpression_(inputSelection,outputSelection){const seenEvents={};inputSelection.forEach(function(event){const context=new tr.e.tquery.Context();context.event=event;this.evaluateFilterExpressionForEvent_(context,inputSelection,outputSelection,seenEvents);}.bind(this));},evaluateFilterExpressionForEvent_(context,inputSelection,outputSelection,seenEvents){const event=context.event;if(inputSelection.contains(event)&&!seenEvents[event.guid]){seenEvents[event.guid]=true;if(!this.filterExpression_||this.filterExpression_.evaluate(context)){outputSelection.push(event);}}
+if(!event.subSlices)return;context=context.push(event);for(let i=0;i<event.subSlices.length;i++){context.event=event.subSlices[i];this.evaluateFilterExpressionForEvent_(context,inputSelection,outputSelection,seenEvents);}},selectEverythingAsTask_(selection){const filterTask=new tr.b.Task();for(const container of this.model_.getDescendantEventContainers()){filterTask.subTask(()=>{for(const event of container.childEvents()){addEventTreeToSelection(selection,event);}},this);}
+return filterTask;},ready(){return new Promise(function(resolve,reject){const graph=this.createFilterTaskGraph_();graph.lastTask=graph.lastTask.after(function(){resolve(this.selection_);},this);tr.b.Task.RunWhenIdle(graph.rootTask);}.bind(this));},get selection(){if(this.selection_===undefined){const graph=this.createFilterTaskGraph_();tr.b.Task.RunSynchronously(graph.rootTask);}
+return this.selection_;}};tr.c.ScriptingObjectRegistry.register(new TQuery(),{name:'$t'});return{TQuery,};});'use strict';Polymer({is:'tr-ui-scripting-control',isEnterKey_(event){return event.keyCode!==229&&(event.key==='Enter'||event.keyIdentifier==='Enter');},setFocus_(focused){const promptEl=this.$.prompt;if(focused){promptEl.focus();Polymer.dom(this.$.root).classList.add('focused');if(promptEl.value.length>0){const sel=window.getSelection();sel.collapse(Polymer.dom(promptEl).firstChild,promptEl.value.length);}}else{promptEl.blur();Polymer.dom(this.$.root).classList.remove('focused');const parent=promptEl.parentElement;const nextEl=Polymer.dom(promptEl).nextSibling;promptEl.remove();Polymer.dom(parent).insertBefore(promptEl,nextEl);}},onConsoleFocus(e){e.stopPropagation();this.setFocus_(true);},onConsoleBlur(e){e.stopPropagation();this.setFocus_(false);},promptKeyDown(e){e.stopPropagation();if(!this.isEnterKey_(e))return;e.preventDefault();const promptEl=this.$.prompt;const command=promptEl.value;if(command.length===0)return;promptEl.value='';this.addLine_(String.fromCharCode(187)+' '+command);let result;try{result=this.controller_.executeCommand(command);}catch(e){result=e.stack||e.stackTrace;}
+if(result instanceof tr.e.tquery.TQuery){result.ready().then(function(selection){this.addLine_(selection.length+' matches');this.controller_.brushingStateController.showScriptControlSelection(selection);}.bind(this));}else{this.addLine_(result);}
+promptEl.scrollIntoView();},addLine_(line){const historyEl=this.$.history;if(historyEl.innerText.length!==0){historyEl.innerText+='\n';}
+historyEl.innerText+=line;},promptKeyPress(e){e.stopPropagation();},toggleVisibility(){const root=this.$.root;if(!this.visible){Polymer.dom(root).classList.remove('hidden');this.setFocus_(true);}else{Polymer.dom(root).classList.add('hidden');this.setFocus_(false);}},get hasFocus(){return this===document.activeElement;},get visible(){const root=this.$.root;return!Polymer.dom(root).classList.contains('hidden');},get controller(){return this.controller_;},set controller(c){this.controller_=c;}});'use strict';Polymer({is:'tr-ui-side-panel-container',ready(){this.activePanelContainer_=this.$.active_panel_container;this.tabStrip_=this.$.tab_strip;this.dragHandle_=this.$.side_panel_drag_handle;this.dragHandle_.horizontal=false;this.dragHandle_.target=this.activePanelContainer_;this.rangeOfInterest_=new tr.b.math.Range();this.brushingStateController_=undefined;this.onSelectionChanged_=this.onSelectionChanged_.bind(this);this.onModelChanged_=this.onModelChanged_.bind(this);},get brushingStateController(){return this.brushingStateController_;},set brushingStateController(brushingStateController){if(this.brushingStateController){this.brushingStateController_.removeEventListener('change',this.onSelectionChanged_);this.brushingStateController_.removeEventListener('model-changed',this.onModelChanged_);}
+this.brushingStateController_=brushingStateController;if(this.brushingStateController){this.brushingStateController_.addEventListener('change',this.onSelectionChanged_);this.brushingStateController_.addEventListener('model-changed',this.onModelChanged_);}},onSelectionChanged_(){if(this.activePanel){this.activePanel.selection=this.selection;}},get model(){return this.brushingStateController_.model;},onModelChanged_(){this.activePanelType_=undefined;this.updateContents_();},get expanded(){this.hasAttribute('expanded');},get activePanel(){return this.activePanelContainer_.children[0];},get activePanelType(){return this.activePanelType_;},set activePanelType(panelType){if(this.model===undefined){throw new Error('Cannot activate panel without a model');}
+let panel=undefined;if(panelType){panel=document.createElement(panelType);}
+if(panel!==undefined&&!panel.supportsModel(this.model)){throw new Error('Cannot activate panel: does not support this model');}
+if(this.activePanelType){Polymer.dom(this.getLabelElementForPanelType_(this.activePanelType)).removeAttribute('selected');}
+if(this.activePanelType){this.getLabelElementForPanelType_(this.activePanelType).removeAttribute('selected');}
+if(this.activePanel){this.activePanelContainer_.removeChild(this.activePanel);}
+if(panelType===undefined){Polymer.dom(this).removeAttribute('expanded');this.activePanelType_=undefined;return;}
+Polymer.dom(this.getLabelElementForPanelType_(panelType)).setAttribute('selected',true);Polymer.dom(this).setAttribute('expanded',true);Polymer.dom(this.activePanelContainer_).appendChild(panel);panel.rangeOfInterest=this.rangeOfInterest_;panel.selection=this.selection_;panel.model=this.model;this.activePanelType_=panelType;},getPanelTypeForConstructor_(constructor){for(let i=0;i<this.tabStrip_.children.length;i++){if(this.tabStrip_.children[i].panelType.constructor===constructor){return this.tabStrip_.children[i].panelType;}}},getLabelElementForPanelType_(panelType){for(let i=0;i<this.tabStrip_.children.length;i++){if(this.tabStrip_.children[i].panelType===panelType){return this.tabStrip_.children[i];}}
+return undefined;},updateContents_(){const previouslyActivePanelType=this.activePanelType;Polymer.dom(this.tabStrip_).textContent='';const supportedPanelTypes=[];for(const panelTypeInfo of
+tr.ui.side_panel.SidePanelRegistry.getAllRegisteredTypeInfos()){const labelEl=document.createElement('tab-strip-label');const panel=panelTypeInfo.constructor();const panelType=panel.tagName;Polymer.dom(labelEl).textContent=panel.textLabel;labelEl.panelType=panelType;const supported=panel.supportsModel(this.model);if(this.model&&supported.supported){supportedPanelTypes.push(panelType);Polymer.dom(labelEl).setAttribute('enabled',true);labelEl.addEventListener('click',function(panelType){this.activePanelType=this.activePanelType===panelType?undefined:panelType;}.bind(this,panelType));}else{if(this.activePanel){this.activePanelContainer_.removeChild(this.activePanel);}
+this.removeAttribute('expanded');}
+Polymer.dom(this.tabStrip_).appendChild(labelEl);}
+if(previouslyActivePanelType&&supportedPanelTypes.includes(previouslyActivePanelType)){this.activePanelType=previouslyActivePanelType;Polymer.dom(this).setAttribute('expanded',true);}else{if(this.activePanel){Polymer.dom(this.activePanelContainer_).removeChild(this.activePanel);}
+Polymer.dom(this).removeAttribute('expanded');}},get rangeOfInterest(){return this.rangeOfInterest_;},set rangeOfInterest(range){if(range===undefined){throw new Error('Must not be undefined');}
+this.rangeOfInterest_=range;if(this.activePanel){this.activePanel.rangeOfInterest=range;}}});'use strict';Polymer({is:'tr-ui-timeline-view-help-overlay',ready(){const mod=tr.isMac?'cmd ':'ctrl';const spans=Polymer.dom(this.root).querySelectorAll('span.mod');for(let i=0;i<spans.length;i++){Polymer.dom(spans[i]).textContent=mod;}}});'use strict';Polymer({is:'tr-ui-timeline-view-metadata-overlay',created(){this.metadata_=undefined;},ready(){this.$.table.tableColumns=[{title:'name',value:d=>d.name,},{title:'value',value:d=>{const gov=document.createElement('tr-ui-a-generic-object-view');gov.object=d.value;return gov;},}];},get metadata(){return this.metadata_;},set metadata(metadata){this.metadata_=metadata;this.$.table.tableRows=this.metadata_;this.$.table.rebuild();}});'use strict';Polymer({is:'tr-v-ui-preferred-display-unit',ready(){this.preferredTimeDisplayMode_=undefined;},attached(){tr.b.Unit.didPreferredTimeDisplayUnitChange();},detached(){tr.b.Unit.didPreferredTimeDisplayUnitChange();},get preferredTimeDisplayMode(){return this.preferredTimeDisplayMode_;},set preferredTimeDisplayMode(v){if(this.preferredTimeDisplayMode_===v)return;this.preferredTimeDisplayMode_=v;tr.b.Unit.didPreferredTimeDisplayUnitChange();}});'use strict';Polymer({is:'tr-ui-timeline-view',attached(){this.async(function(){this.trackViewContainer_=Polymer.dom(this).querySelector('#track_view_container');if(!this.trackViewContainer_){throw new Error('missing trackviewContainer');}});},ready(){this.tabIndex=0;this.titleEl_=this.$.title;this.leftControlsEl_=this.$.left_controls;this.rightControlsEl_=this.$.right_controls;this.collapsingControlsEl_=this.$.collapsing_controls;this.sidePanelContainer_=this.$.side_panel_container;this.brushingStateController_=new tr.c.BrushingStateController(this);this.findCtl_=this.$.view_find_control;this.findCtl_.controller=new tr.ui.FindController(this.brushingStateController_);this.scriptingCtl_=document.createElement('tr-ui-scripting-control');this.scriptingCtl_.controller=new tr.c.ScriptingController(this.brushingStateController_);this.sidePanelContainer_.brushingStateController=this.brushingStateController_;if(window.tr.metrics&&window.tr.metrics.sh&&window.tr.metrics.sh.SystemHealthMetric){this.railScoreSpan_=document.createElement('tr-metrics-ui-sh-system-health-span');Polymer.dom(this.rightControls).appendChild(this.railScoreSpan_);}else{this.railScoreSpan_=undefined;}
+this.optionsDropdown_=this.$.view_options_dropdown;Polymer.dom(this.optionsDropdown_.iconElement).textContent='View Options';this.showFlowEvents_=false;Polymer.dom(this.optionsDropdown_).appendChild(tr.ui.b.createCheckBox(this,'showFlowEvents','tr.ui.TimelineView.showFlowEvents',false,'Flow events'));this.highlightVSync_=false;this.highlightVSyncCheckbox_=tr.ui.b.createCheckBox(this,'highlightVSync','tr.ui.TimelineView.highlightVSync',false,'Highlight VSync');Polymer.dom(this.optionsDropdown_).appendChild(this.highlightVSyncCheckbox_);this.initMetadataButton_();this.initConsoleButton_();this.initHelpButton_();Polymer.dom(this.collapsingControls).appendChild(this.scriptingCtl_);this.dragEl_=this.$.drag_handle;this.analysisEl_=this.$.analysis;this.analysisEl_.brushingStateController=this.brushingStateController_;this.addEventListener('requestSelectionChange',function(e){const sc=this.brushingStateController_;sc.changeSelectionFromRequestSelectionChangeEvent(e.selection);}.bind(this));this.onViewportChanged_=this.onViewportChanged_.bind(this);this.bindKeyListeners_();this.dragEl_.target=this.analysisEl_;},get globalMode(){return this.hotkeyController.globalMode;},set globalMode(globalMode){globalMode=!!globalMode;this.brushingStateController_.historyEnabled=globalMode;this.hotkeyController.globalMode=globalMode;},get hotkeyController(){return this.$.hkc;},updateDocumentFavicon(){let hue;if(!this.model){hue='blue';}else{hue=this.model.faviconHue;}
+let faviconData=tr.ui.b.FaviconsByHue[hue];if(faviconData===undefined){faviconData=tr.ui.b.FaviconsByHue.blue;}
+let link=Polymer.dom(document.head).querySelector('link[rel="shortcut icon"]');if(!link){link=document.createElement('link');link.rel='shortcut icon';Polymer.dom(document.head).appendChild(link);}
+link.href=faviconData;},get showFlowEvents(){return this.showFlowEvents_;},set showFlowEvents(showFlowEvents){this.showFlowEvents_=showFlowEvents;if(!this.trackView_)return;this.trackView_.viewport.showFlowEvents=showFlowEvents;},get highlightVSync(){return this.highlightVSync_;},set highlightVSync(highlightVSync){this.highlightVSync_=highlightVSync;if(!this.trackView_)return;this.trackView_.viewport.highlightVSync=highlightVSync;},initHelpButton_(){const helpButtonEl=this.$.view_help_button;const dlg=new tr.ui.b.Overlay();dlg.title='Chrome Tracing Help';dlg.visible=false;dlg.appendChild(document.createElement('tr-ui-timeline-view-help-overlay'));function onClick(e){dlg.visible=!dlg.visible;e.stopPropagation();}
+helpButtonEl.addEventListener('click',onClick.bind(this));},initConsoleButton_(){const toggleEl=this.$.view_console_button;function onClick(e){this.scriptingCtl_.toggleVisibility();e.stopPropagation();return false;}
+toggleEl.addEventListener('click',onClick.bind(this));},initMetadataButton_(){const showEl=this.$.view_metadata_button;function onClick(e){const dlg=new tr.ui.b.Overlay();dlg.title='Metadata for trace';const metadataOverlay=document.createElement('tr-ui-timeline-view-metadata-overlay');metadataOverlay.metadata=this.model.metadata;Polymer.dom(dlg).appendChild(metadataOverlay);dlg.visible=true;e.stopPropagation();return false;}
+showEl.addEventListener('click',onClick.bind(this));this.updateMetadataButtonVisibility_();},updateMetadataButtonVisibility_(){const showEl=this.$.view_metadata_button;showEl.style.display=(this.model&&this.model.metadata.length)?'':'none';},get leftControls(){return this.leftControlsEl_;},get rightControls(){return this.rightControlsEl_;},get collapsingControls(){return this.collapsingControlsEl_;},get viewTitle(){return Polymer.dom(this.titleEl_).textContent.substring(Polymer.dom(this.titleEl_).textContent.length-2);},set viewTitle(text){if(text===undefined){Polymer.dom(this.titleEl_).textContent='';this.titleEl_.hidden=true;return;}
+this.titleEl_.hidden=false;Polymer.dom(this.titleEl_).textContent=text;},get model(){if(this.trackView_){return this.trackView_.model;}
+return undefined;},set model(model){const modelInstanceChanged=model!==this.model;const modelValid=model&&!model.bounds.isEmpty;const importWarningsEl=Polymer.dom(this.root).querySelector('#import-warnings');Polymer.dom(importWarningsEl).textContent='';if(modelInstanceChanged){if(this.railScoreSpan_){this.railScoreSpan_.model=undefined;}
+Polymer.dom(this.trackViewContainer_).textContent='';if(this.trackView_){this.trackView_.viewport.removeEventListener('change',this.onViewportChanged_);this.trackView_.brushingStateController=undefined;this.trackView_.detach();this.trackView_=undefined;}
+this.brushingStateController_.modelWillChange();}
+if(modelValid&&!this.trackView_){this.trackView_=document.createElement('tr-ui-timeline-track-view');this.trackView_.timelineView=this;this.trackView.brushingStateController=this.brushingStateController_;Polymer.dom(this.trackViewContainer_).appendChild(this.trackView_);this.trackView_.viewport.addEventListener('change',this.onViewportChanged_);}
+if(modelValid){this.trackView_.model=model;this.trackView_.viewport.showFlowEvents=this.showFlowEvents;this.trackView_.viewport.highlightVSync=this.highlightVSync;if(this.railScoreSpan_){this.railScoreSpan_.model=model;}
+this.$.display_unit.preferredTimeDisplayMode=model.intrinsicTimeUnit;}
+if(model){model.importWarningsThatShouldBeShownToUser.forEach(function(importWarning){importWarningsEl.addMessage('Import Warning: '+importWarning.type+': '+
+importWarning.message);},this);}
+if(modelInstanceChanged){this.updateMetadataButtonVisibility_();this.brushingStateController_.modelDidChange();this.onViewportChanged_();}},get brushingStateController(){return this.brushingStateController_;},get trackView(){return this.trackView_;},get settings(){if(!this.settings_){this.settings_=new tr.b.Settings();}
+return this.settings_;},set focusElement(value){throw new Error('This is deprecated. Please set globalMode to true.');},bindKeyListeners_(){const hkc=this.hotkeyController;hkc.addHotKey(new tr.ui.b.HotKey({eventType:'keypress',keyCode:'`'.charCodeAt(0),useCapture:true,thisArg:this,callback(e){this.scriptingCtl_.toggleVisibility();if(!this.scriptingCtl_.hasFocus){this.focus();}
+e.stopPropagation();}}));hkc.addHotKey(new tr.ui.b.HotKey({eventType:'keypress',keyCode:'/'.charCodeAt(0),useCapture:true,thisArg:this,callback(e){if(this.scriptingCtl_.hasFocus)return;if(this.findCtl_.hasFocus){this.focus();}else{this.findCtl_.focus();}
+e.preventDefault();e.stopPropagation();}}));hkc.addHotKey(new tr.ui.b.HotKey({eventType:'keypress',keyCode:'?'.charCodeAt(0),useCapture:false,thisArg:this,callback(e){this.$.view_help_button.click();e.stopPropagation();}}));hkc.addHotKey(new tr.ui.b.HotKey({eventType:'keypress',keyCode:'v'.charCodeAt(0),useCapture:false,thisArg:this,callback(e){this.toggleHighlightVSync_();e.stopPropagation();}}));},onViewportChanged_(e){const spc=this.sidePanelContainer_;if(!this.trackView_){spc.rangeOfInterest.reset();return;}
+const vr=this.trackView_.viewport.interestRange.asRangeObject();if(!spc.rangeOfInterest.equals(vr)){spc.rangeOfInterest=vr;}
+if(this.railScoreSpan_&&this.model){this.railScoreSpan_.model=this.model;}},toggleHighlightVSync_(){this.highlightVSyncCheckbox_.checked=!this.highlightVSyncCheckbox_.checked;},setFindCtlText(string){this.findCtl_.setText(string);}});'use strict';tr.exportTo('tr.ui.b',function(){function Row(title,data,groupingKeyFuncs,rowStatsConstructor){this.title=title;this.data_=data;if(groupingKeyFuncs===undefined){groupingKeyFuncs=[];}
+this.groupingKeyFuncs_=groupingKeyFuncs;this.rowStatsConstructor_=rowStatsConstructor;this.subRowsBuilt_=false;this.subRows_=undefined;this.rowStats_=undefined;}
+Row.prototype={getCurrentGroupingKeyFunc_(){if(this.groupingKeyFuncs_.length===0)return undefined;return this.groupingKeyFuncs_[0];},get data(){return this.data_;},get rowStats(){if(this.rowStats_===undefined){this.rowStats_=new this.rowStatsConstructor_(this);}
+return this.rowStats_;},rebuildSubRowsIfNeeded_(){if(this.subRowsBuilt_)return;this.subRowsBuilt_=true;const groupingKeyFunc=this.getCurrentGroupingKeyFunc_();if(groupingKeyFunc===undefined){this.subRows_=undefined;return;}
+const dataByKey={};let hasValues=false;this.data_.forEach(function(datum){const key=groupingKeyFunc(datum);hasValues=hasValues||(key!==undefined);if(dataByKey[key]===undefined){dataByKey[key]=[];}
+dataByKey[key].push(datum);});if(!hasValues){this.subRows_=undefined;return;}
+this.subRows_=[];for(const key in dataByKey){const row=new Row(key,dataByKey[key],this.groupingKeyFuncs_.slice(1),this.rowStatsConstructor_);this.subRows_.push(row);}},get isExpanded(){return(this.subRows&&(this.subRows.length>0)&&(this.subRows.length<5));},get subRows(){this.rebuildSubRowsIfNeeded_();return this.subRows_;}};Polymer({is:'tr-ui-b-grouping-table',created(){this.dataToGroup_=undefined;this.groupBy_=undefined;this.rowStatsConstructor_=undefined;},get tableColumns(){return this.$.table.tableColumns;},set tableColumns(tableColumns){this.$.table.tableColumns=tableColumns;},get tableRows(){return this.$.table.tableRows;},get sortColumnIndex(){return this.$.table.sortColumnIndex;},set sortColumnIndex(sortColumnIndex){this.$.table.sortColumnIndex=sortColumnIndex;},get sortDescending(){return this.$.table.sortDescending;},set sortDescending(sortDescending){this.$.table.sortDescending=sortDescending;},get selectionMode(){return this.$.table.selectionMode;},set selectionMode(selectionMode){this.$.table.selectionMode=selectionMode;},get rowHighlightStyle(){return this.$.table.rowHighlightStyle;},set rowHighlightStyle(rowHighlightStyle){this.$.table.rowHighlightStyle=rowHighlightStyle;},get cellHighlightStyle(){return this.$.table.cellHighlightStyle;},set cellHighlightStyle(cellHighlightStyle){this.$.table.cellHighlightStyle=cellHighlightStyle;},get selectedColumnIndex(){return this.$.table.selectedColumnIndex;},set selectedColumnIndex(selectedColumnIndex){this.$.table.selectedColumnIndex=selectedColumnIndex;},get selectedTableRow(){return this.$.table.selectedTableRow;},set selectedTableRow(selectedTableRow){this.$.table.selectedTableRow=selectedTableRow;},get groupBy(){return this.groupBy_;},set groupBy(groupBy){this.groupBy_=groupBy;this.updateContents_();},get dataToGroup(){return this.dataToGroup_;},set dataToGroup(dataToGroup){this.dataToGroup_=dataToGroup;this.updateContents_();},get rowStatsConstructor(){return this.rowStatsConstructor_;},set rowStatsConstructor(rowStatsConstructor){this.rowStatsConstructor_=rowStatsConstructor;this.updateContents_();},rebuild(){this.$.table.rebuild();},updateContents_(){const groupBy=this.groupBy_||[];const dataToGroup=this.dataToGroup_||[];const rowStatsConstructor=this.rowStatsConstructor_||function(){};const superRow=new Row('',dataToGroup,groupBy,rowStatsConstructor);this.$.table.tableRows=superRow.subRows||[];}});return{};});'use strict';tr.exportTo('tr.ui.b',function(){const THIS_DOC=document.currentScript.ownerDocument;Polymer({is:'tr-ui-b-grouping-table-groupby-picker-group',created(){this.picker_=undefined;this.group_=undefined;},get picker(){return this.picker_;},set picker(picker){this.picker_=picker;},get group(){return this.group_;},set group(g){this.group_=g;this.$.label.textContent=g.label;},get enabled(){return this.$.enabled.checked;},set enabled(enabled){this.$.enabled.checked=enabled;if(!this.enabled){this.$.left.style.display='none';this.$.right.style.display='none';}},set isFirst(isFirst){this.$.left.style.display=(!this.enabled||isFirst)?'none':'inline';},set isLast(isLast){this.$.right.style.display=(!this.enabled||isLast)?'none':'inline';},moveLeft_(){this.picker.moveLeft_(this);},moveRight_(){this.picker.moveRight_(this);},onEnableChanged_(){if(!this.enabled){this.$.left.style.display='none';this.$.right.style.display='none';}
+this.picker.onEnableChanged_(this);}});Polymer({is:'tr-ui-b-grouping-table-groupby-picker',created(){this.settingsKey_=undefined;},get settingsKey(){return this.settingsKey_;},set settingsKey(settingsKey){this.settingsKey_=settingsKey;if(this.$.container.children.length){this.restoreSetting_();}},restoreSetting_(){if(this.settingsKey_===undefined)return;this.currentGroupKeys=tr.b.Settings.get(this.settingsKey_,this.currentGroupKeys);},get possibleGroups(){return[...this.$.container.children].map(groupEl=>groupEl.group);},set possibleGroups(possibleGroups){Polymer.dom(this.$.container).textContent='';for(let i=0;i<possibleGroups.length;++i){const groupEl=document.createElement('tr-ui-b-grouping-table-groupby-picker-group');groupEl.picker=this;groupEl.group=possibleGroups[i];Polymer.dom(this.$.container).appendChild(groupEl);}
+this.restoreSetting_();this.updateFirstLast_();},updateFirstLast_(){const groupEls=this.$.container.children;const enabledGroupEls=[...groupEls].filter(el=>el.enabled);for(let i=0;i<enabledGroupEls.length;++i){enabledGroupEls[i].isFirst=i===0;enabledGroupEls[i].isLast=i===enabledGroupEls.length-1;}},get currentGroupKeys(){return this.currentGroups.map(group=>group.key);},get currentGroups(){const groups=[];for(const groupEl of this.$.container.children){if(groupEl.enabled){groups.push(groupEl.group);}}
+return groups;},set currentGroupKeys(newKeys){if(!tr.b.compareArrays(this.currentGroupKeys,newKeys,(x,y)=>x.localeCompare(y))){return;}
+const possibleGroups=new Map();for(const group of this.possibleGroups){possibleGroups.set(group.key,group);}
+const groupEls=this.$.container.children;let i=0;for(i=0;i<newKeys.length;++i){const group=possibleGroups.get(newKeys[i]);if(group===undefined){newKeys.splice(i,1);--i;continue;}
+groupEls[i].group=group;groupEls[i].enabled=true;possibleGroups.delete(newKeys[i]);}
+for(const group of possibleGroups.values()){groupEls[i].group=group;groupEls[i].enabled=false;++i;}
+this.updateFirstLast_();this.onCurrentGroupsChanged_();},moveLeft_(groupEl){const reference=groupEl.previousSibling;Polymer.dom(this.$.container).removeChild(groupEl);Polymer.dom(this.$.container).insertBefore(groupEl,reference);this.updateFirstLast_();if(groupEl.enabled){this.onCurrentGroupsChanged_();}},moveRight_(groupEl){const reference=groupEl.nextSibling.nextSibling;Polymer.dom(this.$.container).removeChild(groupEl);if(reference){Polymer.dom(this.$.container).insertBefore(groupEl,reference);}else{Polymer.dom(this.$.container).appendChild(groupEl);}
+this.updateFirstLast_();if(groupEl.enabled){this.onCurrentGroupsChanged_();}},onCurrentGroupsChanged_(){this.dispatchEvent(new tr.b.Event('current-groups-changed'));tr.b.Settings.set(this.settingsKey_,this.currentGroupKeys);},onEnableChanged_(groupEl){this.updateFirstLast_();this.onCurrentGroupsChanged_();}});return{};});'use strict';(function(){Polymer({is:'tr-ui-sp-file-size-stats-side-panel',behaviors:[tr.ui.behaviors.SidePanel],ready(){this.model_=undefined;this.selection_=new tr.model.EventSet();this.$.picker.settingsKey='tr-ui-sp-file-size-stats-side-panel-picker';this.$.picker.possibleGroups=[{key:'phase',label:'Event Type',dataFn(eventStat){return eventStat.phase;}},{key:'category',label:'Category',dataFn(eventStat){return eventStat.category;}},{key:'title',label:'Title',dataFn(eventStat){return eventStat.title;}}];if(this.$.picker.currentGroupKeys.length===0){this.$.picker.currentGroupKeys=['phase','title'];}
+this.$.picker.addEventListener('current-groups-changed',this.updateContents_.bind(this));},get textLabel(){return'File Size Stats';},supportsModel(m){if(!m){return{supported:false,reason:'No stats were collected for this file.'};}
+if(m.stats.allTraceEventStats.length===0){return{supported:false,reason:'No stats were collected for this file.'};}
+return{supported:true};},get model(){return this.model_;},set model(model){this.model_=model;this.updateContents_();},get rangeOfInterest(){return this.rangeOfInterest_;},set rangeOfInterest(rangeOfInterest){this.rangeOfInterest_=rangeOfInterest;},get selection(){return this.selection_;},set selection(selection){this.selection_=selection;},createColumns_(stats){const columns=[{title:'Title',value(row){const titleEl=document.createElement('span');Polymer.dom(titleEl).textContent=row.title;titleEl.style.textOverflow='ellipsis';return titleEl;},cmp(a,b){return a.title.localeCompare(b.title);},width:'400px'},{title:'Num Events',align:tr.ui.b.TableFormat.ColumnAlignment.RIGHT,value(row){return row.rowStats.numEvents;},cmp(a,b){return a.rowStats.numEvents-b.rowStats.numEvents;},width:'80px'}];if(stats&&stats.hasEventSizesinBytes){columns.push({title:'Bytes',value(row){const value=new tr.b.Scalar(tr.b.Unit.byName.sizeInBytes,row.rowStats.totalEventSizeinBytes);const spanEl=tr.v.ui.createScalarSpan(value);return spanEl;},cmp(a,b){return a.rowStats.totalEventSizeinBytes-
+b.rowStats.totalEventSizeinBytes;},width:'80px'});}
+return columns;},updateContents_(){const table=this.$.table;const columns=this.createColumns_(this.model.stats);table.rowStatsConstructor=function ModelStatsRowStats(row){const sum=tr.b.math.Statistics.sum(row.data,function(x){return x.numEvents;});const totalEventSizeinBytes=tr.b.math.Statistics.sum(row.data,x=>x.totalEventSizeinBytes);return{numEvents:sum,totalEventSizeinBytes};};table.tableColumns=columns;table.sortColumnIndex=1;table.sortDescending=true;table.selectionMode=tr.ui.b.TableFormat.SelectionMode.ROW;table.groupBy=this.$.picker.currentGroups.map(function(group){return group.dataFn;});if(!this.model){table.dataToGroup=[];}else{table.dataToGroup=this.model.stats.allTraceEventStats;}
+this.$.table.rebuild();}});tr.ui.side_panel.SidePanelRegistry.register(function(){return document.createElement('tr-ui-sp-file-size-stats-side-panel');});})();'use strict';tr.exportTo('tr.mre',function(){const FunctionRegistry={allFunctions_:[],allFunctionsByName_:{},get allFunctions(){return this.allFunctions_;},get allFunctionsByName(){return this.allFunctionsByName_;}};FunctionRegistry.getFunction=function(name){return this.allFunctionsByName_[name];};FunctionRegistry.register=function(func){if(func.name===''){throw new Error('Registered functions must not be anonymous');}
+if(this.allFunctionsByName[func.name]!==undefined){throw new Error('Function named '+func.name+'is already registered.');}
+this.allFunctionsByName[func.name]=func;this.allFunctions.push(func);};function ModuleToLoad(href,filename){if((href!==undefined)?(filename!==undefined):(filename===undefined)){throw new Error('ModuleToLoad must specify exactly one of href or '+'filename');}
+this.href=href;this.filename=filename;}
+ModuleToLoad.prototype={asDict(){if(this.href!==undefined){return{'href':this.href};}
+return{'filename':this.filename};},toString(){if(this.href!==undefined){return'ModuleToLoad(href="'+this.href+'")';}
+return'ModuleToLoad(filename="'+this.filename+'")';}};ModuleToLoad.fromDict=function(moduleDict){return new ModuleToLoad(moduleDict.href,moduleDict.filename);};function FunctionHandle(modulesToLoad,functionName,opt_options){if(!(modulesToLoad instanceof Array)){throw new Error('modulesToLoad in FunctionHandle must be an array');}
+if(typeof(functionName)!=='string'){throw new Error('functionName in FunctionHandle must be a string');}
+this.modulesToLoad=modulesToLoad;this.functionName=functionName;this.options_=opt_options;}
+FunctionHandle.prototype={get options(){return this.options_;},asDict(){return{'modules_to_load':this.modulesToLoad.map(function(m){return m.asDict();}),'function_name':this.functionName,'options':this.options_};},asUserFriendlyString(){const parts=this.modulesToLoad.map(mtl=>mtl.filename);parts.push(this.functionName);parts.push(JSON.stringify(this.options_));return parts.join(',');},hasHrefs(){for(const module in this.modulesToLoad){if(this.modulesToLoad[module].href!==undefined){return true;}}
+return false;},load(){if(this.hasHrefs()){const err=new Error('FunctionHandle named '+this.functionName+' specifies hrefs, which cannot be loaded.');err.name='FunctionLoadingError';throw err;}
+for(const module in this.modulesToLoad){const filename=this.modulesToLoad[module].filename;try{HTMLImportsLoader.loadHTMLFile(filename);}catch(err){err.name='FunctionLoadingError';throw err;}}
+const func=FunctionRegistry.getFunction(this.functionName);if(func===undefined){const err=new Error('No registered function named '+this.functionName);err.name='FunctionNotDefinedError';throw err;}
+return func;},toString(){const modulesToLoadStr=this.modulesToLoad.map(function(module){return module.toString();});return'FunctionHandle(modulesToLoad=['+modulesToLoadStr+'], '+'functionName="'+this.functionName+'", options="'+
+JSON.stringify(this.options_)+'")';}};FunctionHandle.loadFromFilename_=function(filename){try{const numFunctionsBefore=FunctionRegistry.allFunctions.length;HTMLImportsLoader.loadHTMLFile(filename);}catch(err){err.name='FunctionLoadingError';throw err;}
+const numFunctionsNow=FunctionRegistry.allFunctions.length;if(numFunctionsNow!==(numFunctionsBefore+1)){const err=new Error(filename+' didn\'t call FunctionRegistry.register');err.name='FunctionNotDefinedError';throw err;}
+return FunctionRegistry.allFunctions[numFunctionsNow-1];};FunctionHandle.fromDict=function(handleDict){const options=handleDict.options;let modulesToLoad;if(handleDict.modules_to_load!==undefined){modulesToLoad=handleDict.modules_to_load.map(function(module){return ModuleToLoad.fromDict(module);});}
+return new FunctionHandle(modulesToLoad,handleDict.function_name,options);};return{FunctionHandle,ModuleToLoad,FunctionRegistry,};});'use strict';tr.exportTo('tr.metrics',function(){function runMetrics(model,options){if(options===undefined){throw new Error('Options are required.');}
+const metricNames=options.metrics;if(!metricNames){throw new Error('Metric names should be specified.');}
+const histograms=new tr.v.HistogramSet();for(const metricName of metricNames){const metric=tr.metrics.MetricRegistry.findTypeInfoWithName(metricName);if(metric===undefined){throw new Error('"'+metricName+'" is not a registered metric.');}
+metric.constructor(histograms,model,options);}
+return histograms;}
+function addTelemetryInfo(histograms,model){const telemetry=new tr.v.d.TelemetryInfo();for(const metadata of model.metadata){if(!metadata.value)continue;if(metadata.value.telemetry){telemetry.addInfo(metadata.value.telemetry);}}
+histograms.addSharedDiagnostic(tr.v.d.TelemetryInfo.NAME,telemetry);}
+function metricMapFunction(result,model,options){const histograms=runMetrics(model,options);addTelemetryInfo(histograms,model);result.addPair('histograms',histograms.asDicts());const scalarDicts=[];for(const value of histograms){for(const[statName,scalar]of value.statisticsScalars){scalarDicts.push({name:value.name+'_'+statName,numeric:scalar.asDict(),description:value.description,});}}
+result.addPair('scalars',scalarDicts);}
+tr.mre.FunctionRegistry.register(metricMapFunction);return{metricMapFunction,runMetrics,};});'use strict';tr.exportTo('tr.mre',function(){function Failure(job,functionHandleString,traceCanonicalUrl,failureTypeName,description,stack){this.job=job;this.functionHandleString=functionHandleString;this.traceCanonicalUrl=traceCanonicalUrl;this.failureTypeName=failureTypeName;this.description=description;this.stack=stack;}
+Failure.prototype={asDict(){return{function_handle_string:this.functionHandleString,trace_canonical_url:this.traceCanonicalUrl,type:this.failureTypeName,description:this.description,stack:this.stack};}};Failure.fromDict=function(failureDict){return new Failure(undefined,failureDict.function_handle_string,failureDict.trace_canonical_url,failureDict.type,failureDict.description,failureDict.stack);};return{Failure,};});'use strict';tr.exportTo('tr.mre',function(){class MreResult{constructor(failures,pairs){if(failures===undefined){failures=[];}
+if(pairs===undefined){pairs={};}
+this.failures=failures;this.pairs=pairs;}
+addFailure(failure){this.failures.push(failure);}
+addPair(key,value){if(key in this.pairs){throw new Error('Key '+key+' already exists in result.');}
+this.pairs[key]=value;}
+asDict(){const d={pairs:this.pairs};if(this.failures){d.failures=this.failures.map(function(f){return f.asDict();});}
+return d;}
+hadFailures(){return this.failures.length>0;}
+static fromDict(resultDict){const failures=(resultDict.failures!==undefined)?resultDict.failures.map(tr.mre.Failure.fromDict):undefined;const pairs=resultDict.pairs;return new MreResult(failures,pairs);}}
+return{MreResult,};});'use strict';tr.exportTo('tr.ui',function(){class NullBrushingStateController extends tr.c.BrushingStateController{constructor(){super(undefined);this.parentController=undefined;}
+dispatchChangeEvent_(){if(this.parentController)this.parentController.dispatchChangeEvent_();}
+get model(){if(!this.parentController)return undefined;return this.parentController.model;}
+get trackView(){if(!this.parentController)return undefined;return this.parentController.trackView;}
+get viewport(){if(!this.parentController)return undefined;return this.parentController.viewport;}
+get historyEnabled(){if(!this.parentController)return undefined;return this.parentController.historyEnabled;}
+set historyEnabled(historyEnabled){if(this.parentController){this.parentController.historyEnabled=historyEnabled;}}
+modelWillChange(){if(this.parentController)this.parentController.modelWillChange();}
+modelDidChange(){if(this.parentController)this.parentController.modelDidChange();}
+onUserInitiatedSelectionChange_(){if(this.parentController){this.parentController.onUserInitiatedSelectionChange_();}}
+onPopState_(e){if(this.parentController)this.parentController.onPopState_(e);}
+get selection(){if(!this.parentController)return undefined;return this.parentController.selection;}
+get findMatches(){if(!this.parentController)return undefined;return this.parentController.findMatches;}
+get selectionOfInterest(){if(!this.parentController)return undefined;return this.parentController.selectionOfInterest;}
+get currentBrushingState(){if(!this.parentController)return undefined;return this.parentController.currentBrushingState;}
+set currentBrushingState(newBrushingState){if(this.parentController){this.parentController.currentBrushingState=newBrushingState;}}
+addAllEventsMatchingFilterToSelectionAsTask(filter,selection){if(this.parentController){this.parentController.addAllEventsMatchingFilterToSelectionAsTask(filter,selection);}}
+findTextChangedTo(allPossibleMatches){if(this.parentController){this.parentController.findTextChangedTo(allPossibleMatches);}}
+findFocusChangedTo(currentFocus){if(this.parentController){this.parentController.findFocusChangedTo(currentFocus);}}
+findTextCleared(){if(this.parentController){this.parentController.findTextCleared();}}
+uiStateFromString(string){if(this.parentController){this.parentController.uiStateFromString(string);}}
+navToPosition(uiState,showNavLine){if(this.parentController){this.parentController.navToPosition(uiState,showNavLine);}}
+changeSelectionFromTimeline(selection){if(this.parentController){this.parentController.changeSelectionFromTimeline(selection);}}
+showScriptControlSelection(selection){if(this.parentController){this.parentController.showScriptControlSelection(selection);}}
+changeSelectionFromRequestSelectionChangeEvent(selection){if(this.parentController){this.parentController.changeSelectionFromRequestSelectionChangeEvent(selection);}}
+changeAnalysisViewRelatedEvents(eventSet){if(this.parentController&&(eventSet instanceof tr.model.EventSet)){this.parentController.changeAnalysisViewRelatedEvents(eventSet);}}
+changeAnalysisLinkHoveredEvents(eventSet){if(this.parentController&&(eventSet instanceof tr.model.EventSet)){this.parentController.changeAnalysisLinkHoveredEvents(eventSet);}}
+getViewSpecificBrushingState(viewId){if(this.parentController){this.parentController.getViewSpecificBrushingState(viewId);}}
+changeViewSpecificBrushingState(viewId,newState){if(this.parentController){this.parentController.changeViewSpecificBrushingState(viewId,newState);}}}
+return{NullBrushingStateController,};});'use strict';tr.exportTo('tr.v',function(){const CSV_ITERATION_INFO_NAMES=['benchmarkName','benchmarkStartString','label','osVersion','productVersion','storyDisplayName','storysetRepeatCounter',];class CSVBuilder{constructor(histograms){this.histograms_=histograms;this.table_=[];this.statisticsNames_=new Set();this.iterationInfoNames_=new Set();this.storyGroupingKeys_=new Set();}
+build(){this.prepare_();this.buildHeader_();for(const hist of this.histograms_){const row=[hist.name,hist.unit.unitString];this.table_.push(row);const stats=hist.statisticsScalars;for(const name of this.statisticsNames_){row.push(stats.has(name)?stats.get(name).value:'');}
+const iteration=tr.v.d.TelemetryInfo.getFromHistogram(hist);for(const name of this.iterationInfoNames_){if(iteration===undefined||iteration[name]===undefined){row.push('');}else{row.push(iteration[name]);}}
+for(const key of this.storyGroupingKeys_){if(iteration===undefined||iteration.storyGroupingKeys.get(key)===undefined){row.push('');}else{row.push(iteration.storyGroupingKeys.get(key));}}}}
+prepare_(){for(const hist of this.histograms_){for(const name of hist.statisticsNames){this.statisticsNames_.add(name);}
+const iteration=tr.v.d.TelemetryInfo.getFromHistogram(hist);if(iteration===undefined)continue;for(const name of CSV_ITERATION_INFO_NAMES){if(iteration[name]){this.iterationInfoNames_.add(name);}}
+for(const[key,value]of iteration.storyGroupingKeys){this.storyGroupingKeys_.add(key);}}}
+buildHeader_(){const header=['name','unit'];for(const name of this.statisticsNames_){header.push(name);}
+for(const name of this.iterationInfoNames_){header.push(name);}
+for(const key of this.storyGroupingKeys_){header.push(key);}
+this.table_.push(header);}
+toString(){let str='';for(const row of this.table_){for(let i=0;i<row.length;++i){if(i>0){str+=',';}
+let cell=''+row[i];if(cell.indexOf(',')>=0||cell.indexOf('"')>=0){cell='"'+cell.replace(/"/g,'""')+'"';}
+str+=cell;}
+str+='\n';}
+return str;}}
+return{CSVBuilder,};});'use strict';tr.exportTo('tr.v',function(){const getDisplayLabel=tr.v.HistogramSet.GROUPINGS.DISPLAY_LABEL.callback;const DEFAULT_POSSIBLE_GROUPS=[];DEFAULT_POSSIBLE_GROUPS.push(new tr.v.HistogramGrouping(tr.v.HistogramSet.GROUPINGS.HISTOGRAM_NAME.key,h=>h.shortName||h.name));for(const group of Object.values(tr.v.HistogramSet.GROUPINGS)){if(group!==tr.v.HistogramSet.GROUPINGS.DISPLAY_LABEL&&group!==tr.v.HistogramSet.GROUPINGS.HISTOGRAM_NAME){DEFAULT_POSSIBLE_GROUPS.push(group);}}
+class HistogramParameterCollector{constructor(){this.statisticNames_=new Set(['avg']);this.labelsToStartTimes_=new Map();this.keysToGroupings_=new Map(DEFAULT_POSSIBLE_GROUPS.map(g=>[g.key,g]));this.keysToValues_=new Map(DEFAULT_POSSIBLE_GROUPS.map(g=>[g.key,new Set()]));this.keysToValues_.delete(tr.v.HistogramSet.GROUPINGS.HISTOGRAM_NAME.key);}
+process(histograms){for(const hist of histograms){for(const statName of hist.statisticsNames){this.statisticNames_.add(statName);}
+const telemetry=tr.v.d.TelemetryInfo.getFromHistogram(hist);let startTime=0;if(telemetry&&telemetry.benchmarkStart){startTime=telemetry.benchmarkStart.getTime();}
+const displayLabel=getDisplayLabel(hist);if(this.labelsToStartTimes_.has(displayLabel)){startTime=Math.min(startTime,this.labelsToStartTimes_.get(displayLabel));}
+this.labelsToStartTimes_.set(displayLabel,startTime);if(!telemetry)continue;for(const[groupingKey,values]of this.keysToValues_){const grouping=this.keysToGroupings_.get(groupingKey);const value=grouping.callback(hist);if(!value)continue;values.add(value);if(values.size>1){this.keysToValues_.delete(groupingKey);}}
+for(const[key,value]of telemetry.storyGroupingKeys){const groupingKey='storyGroupingKey_'+key;if(this.keysToGroupings_.has(groupingKey))continue;this.keysToGroupings_.set(groupingKey,new tr.v.HistogramGrouping(groupingKey,tr.v.d.TelemetryInfo.makeStoryGroupingKeyLabelGetter(key)));this.keysToValues_.set(groupingKey,new Set([value]));}}}
+get statisticNames(){return Array.from(this.statisticNames_);}
+get labels(){const displayLabels=Array.from(this.labelsToStartTimes_.keys());displayLabels.sort((x,y)=>this.labelsToStartTimes_.get(x)-this.labelsToStartTimes_.get(y));return displayLabels;}
+get possibleGroupings(){for(const[key,values]of this.keysToValues_){if(values.size>=2)continue;this.keysToGroupings_.delete(key);}
+return Array.from(this.keysToGroupings_.values());}}
+return{HistogramParameterCollector,};});'use strict';tr.exportTo('tr.v.ui',function(){Polymer({is:'tr-v-ui-histogram-set-controls',properties:{searchQuery:{type:String,value:'',observer:'onUserChange_',},showAll:{type:Boolean,value:false,observer:'onUserChange_',},referenceDisplayLabel:{type:String,value:'',observer:'onUserChange_',},displayStatisticName:{type:String,value:'',observer:'onUserChange_',},},created(){this.viewState_=undefined;this.rowListener_=this.onRowViewStateUpdate_.bind(this);this.baseStatisticNames_=[];this.isInOnViewStateUpdate_=false;},ready(){this.$.picker.addEventListener('current-groups-changed',this.onGroupsChanged_.bind(this));},get viewState(){return this.viewState_;},set viewState(vs){if(this.viewState_){throw new Error('viewState must be set exactly once.');}
+this.viewState_=vs;this.viewState.addUpdateListener(this.onViewStateUpdate_.bind(this));},async onUserChange_(){if(!this.viewState)return;if(this.isInOnViewStateUpdate_)return;const marks=[];if(this.searchQuery!==this.viewState.searchQuery){marks.push(tr.b.Timing.mark('histogram-set-controls','search'));}
+if(this.showAll!==this.viewState.showAll){marks.push(tr.b.Timing.mark('histogram-set-controls','showAll'));}
+if(this.referenceDisplayLabel!==this.viewState.referenceDisplayLabel){marks.push(tr.b.Timing.mark('histogram-set-controls','referenceColumn'));}
+if(this.displayStatisticName!==this.viewState.displayStatisticName){marks.push(tr.b.Timing.mark('histogram-set-controls','statistic'));}
+let displayStatisticName=this.displayStatisticName;if(this.viewState.referenceDisplayLabel===''&&this.referenceDisplayLabel!==''&&this.baseStatisticNames.length){displayStatisticName=`${tr.v.DELTA}${this.displayStatisticName}`;}
+if(this.referenceDisplayLabel===''&&this.viewState.referenceDisplayLabel!==''&&this.baseStatisticNames.length){const deltaIndex=displayStatisticName.indexOf(tr.v.DELTA);if(deltaIndex>=0){displayStatisticName=displayStatisticName.slice(deltaIndex+1);}else if(!this.baseStatisticNames.includes(displayStatisticName)){displayStatisticName='avg';}}
+await this.viewState.update({searchQuery:this.searchQuery,showAll:this.showAll,referenceDisplayLabel:this.referenceDisplayLabel,displayStatisticName,});if(this.referenceDisplayLabel&&this.statisticNames.length===this.baseStatisticNames.length){this.statisticNames=this.baseStatisticNames.concat(tr.v.Histogram.getDeltaStatisticsNames(this.baseStatisticNames));}else if(!this.referenceDisplayLabel&&this.statisticNames.length>this.baseStatisticNames.length){this.statisticNames=this.baseStatisticNames;}
+for(const mark of marks)mark.end();},onViewStateUpdate_(event){this.isInOnViewStateUpdate_=true;if(event.delta.searchQuery){this.searchQuery=this.viewState.searchQuery;}
+if(event.delta.showAll)this.showAll=this.viewState.showAll;if(event.delta.displayStatisticName){this.displayStatisticName=this.viewState.displayStatisticName;}
+if(event.delta.referenceDisplayLabel){this.referenceDisplayLabel=this.viewState.referenceDisplayLabel;}
+if(event.delta.groupings){this.$.picker.currentGroupKeys=this.viewState.groupings.map(g=>g.key);}
+if(event.delta.tableRowStates){for(const row of tr.v.ui.HistogramSetTableRowState.walkAll(this.viewState.tableRowStates.values())){row.addUpdateListener(this.rowListener_);}
+const anyShowing=this.anyOverviewCharts_;this.$.hide_overview.style.display=anyShowing?'inline':'none';this.$.show_overview.style.display=anyShowing?'none':'inline';}
+this.isInOnViewStateUpdate_=false;this.onUserChange_();},onRowViewStateUpdate_(event){if(event.delta.isOverviewed){const anyShowing=event.delta.isOverviewed.current||this.anyOverviewCharts_;this.$.hide_overview.style.display=anyShowing?'inline':'none';this.$.show_overview.style.display=anyShowing?'none':'inline';}
+if(event.delta.subRows){for(const subRow of event.delta.subRows.previous){subRow.removeUpdateListener(this.rowListener_);}
+for(const subRow of event.delta.subRows.current){subRow.addUpdateListener(this.rowListener_);}}},onGroupsChanged_(){if(this.$.picker.currentGroups.length===0&&this.$.picker.possibleGroups.length>0){this.$.picker.currentGroupKeys=[this.$.picker.possibleGroups[0].key];}
+this.viewState.groupings=this.$.picker.currentGroups;},set showAllEnabled(enable){if(!enable)this.$.show_all.checked=true;this.$.show_all.disabled=!enable;},set possibleGroupings(groupings){this.$.picker.possibleGroups=groupings;this.$.picker.style.display=(groupings.length<2)?'none':'block';this.onGroupsChanged_();},set displayLabels(labels){this.$.reference_display_label.style.display=(labels.length<2)?'none':'inline';while(this.$.reference_display_label.children.length>1){this.$.reference_display_label.removeChild(this.$.reference_display_label.lastChild);}
+for(const displayLabel of labels){const option=document.createElement('option');option.textContent=displayLabel;this.$.reference_display_label.appendChild(option);}
+if(labels.includes(this.viewState.referenceDisplayLabel)){this.referenceDisplayLabel=this.viewState.referenceDisplayLabel;}else{this.viewState.referenceDisplayLabel='';}},get baseStatisticNames(){return this.baseStatisticNames_;},set baseStatisticNames(names){this.baseStatisticNames_=names;this.statisticNames=names;},get statisticNames(){return Array.from(this.$.statistic.options).map(o=>o.value);},set statisticNames(names){this.$.statistic.style.display=(names.length<2)?'none':'inline';while(this.$.statistic.children.length){this.$.statistic.removeChild(this.$.statistic.lastChild);}
+for(const name of names){const option=document.createElement('option');option.textContent=name;this.$.statistic.appendChild(option);}
+if(names.includes(this.viewState.displayStatisticName)){this.displayStatisticName=this.viewState.displayStatisticName;this.$.statistic.value=this.displayStatisticName;}else{this.viewState.displayStatisticName=names[0]||'';}},get anyOverviewCharts_(){for(const row of tr.v.ui.HistogramSetTableRowState.walkAll(this.viewState.tableRowStates.values())){if(row.isOverviewed)return true;}
+return false;},async toggleOverviewLineCharts_(){const showOverviews=!this.anyOverviewCharts_;const mark=tr.b.Timing.mark('histogram-set-controls',(showOverviews?'show':'hide')+'OverviewCharts');for(const row of tr.v.ui.HistogramSetTableRowState.walkAll(this.viewState.tableRowStates.values())){await row.update({isOverviewed:showOverviews});}
+this.$.hide_overview.style.display=showOverviews?'inline':'none';this.$.show_overview.style.display=showOverviews?'none':'inline';await tr.b.animationFrame();mark.end();},set helpHref(href){this.$.help.href=href;this.$.help.style.display='inline';},set feedbackHref(href){this.$.feedback.href=href;this.$.feedback.style.display='inline';},downloadCSV_(event){this.dispatchEvent(new tr.b.Event('download-csv'));}});return{};});'use strict';tr.exportTo('tr.v',function(){class HistogramSetHierarchy{constructor(name){this.name=name;this.description='';this.depth=0;this.subRows=[];this.columns=new Map();this.overviewDataRange_=undefined;this.mergeRelationshipsForColumn_=new Map();}*walk(){yield this;for(const row of this.subRows)yield*row.walk();}
+static*walkAll(rootRows){for(const rootRow of rootRows)yield*rootRow.walk();}
+static build(histogramArrayMap){const rootRows=[];HistogramSetHierarchy.buildInternal_(histogramArrayMap,[],rootRows);const histograms=new tr.v.HistogramSet();for(const row of HistogramSetHierarchy.walkAll(rootRows)){for(const hist of row.columns.values()){if(!(hist instanceof tr.v.Histogram))continue;histograms.addHistogram(hist);}}
+histograms.deduplicateDiagnostics();for(const row of HistogramSetHierarchy.walkAll(rootRows)){for(const[name,hist]of row.columns){if(!(hist instanceof tr.v.Histogram))continue;if(!row.mergeRelationshipsForColumn_.get(name))continue;hist.diagnostics.mergeRelationships(hist);}}
+for(const row of HistogramSetHierarchy.walkAll(rootRows)){if(row.subRows.length)continue;for(const hist of row.columns.values()){if(!(hist instanceof tr.v.Histogram))continue;const mergedFrom=hist.diagnostics.get(tr.v.MERGED_FROM_DIAGNOSTIC_KEY);if(mergedFrom!==undefined){for(const other of mergedFrom){other.diagnostics.delete(tr.v.MERGED_TO_DIAGNOSTIC_KEY);}}}}
+for(const row of HistogramSetHierarchy.walkAll(rootRows)){row.maybeRebin_();}
+return rootRows;}
+maybeRebin_(){const dataRange=new tr.b.math.Range();for(const hist of this.columns.values()){if(!(hist instanceof tr.v.Histogram))continue;if(hist.allBins.length>1)return;if(hist.numValues===0)continue;dataRange.addValue(hist.min);dataRange.addValue(hist.max);}
+dataRange.addValue(tr.b.math.lesserWholeNumber(dataRange.min));dataRange.addValue(tr.b.math.greaterWholeNumber(dataRange.max));if(dataRange.min===dataRange.max)return;const boundaries=tr.v.HistogramBinBoundaries.createLinear(dataRange.min,dataRange.max,tr.v.DEFAULT_REBINNED_COUNT);for(const[name,hist]of this.columns){if(!(hist instanceof tr.v.Histogram))continue;this.columns.set(name,hist.rebin(boundaries));}}
+static mergeHistogramDownHierarchy_(histogram,hierarchy,columnName){let groupingPath=undefined;for(const row of hierarchy){if(groupingPath!==undefined){groupingPath.push(row.name);}else if(row.name===histogram.name){groupingPath=[];}
+if(!row.description){row.description=histogram.description;}
+const existing=row.columns.get(columnName);if(existing===undefined){const clone=histogram.clone();if(groupingPath!==undefined){new tr.v.d.GroupingPath(groupingPath).addToHistogram(clone);}
+row.columns.set(columnName,clone);row.mergeRelationshipsForColumn_.set(columnName,true);continue;}
+if(existing instanceof tr.v.HistogramSet){existing.addHistogram(histogram);continue;}
+if(!existing.canAddHistogram(histogram)){const unmergeableHistograms=new tr.v.HistogramSet([histogram]);const mergedFrom=existing.diagnostics.get(tr.v.d.MERGED_FROM_DIAGNOSTIC_KEY);if(mergedFrom!==undefined){for(const origHist of mergedFrom){unmergeableHistograms.addHistogram(origHist);}}
+row.columns.set(columnName,unmergeableHistograms);continue;}
+if(existing.name!==histogram.name){row.mergeRelationshipsForColumn_.set(name,false);}
+existing.addHistogram(histogram);}}
+static buildInternal_(histogramArrayMap,hierarchy,rootRows){for(const[name,histograms]of histogramArrayMap){if(histograms instanceof Array){for(const histogram of histograms){HistogramSetHierarchy.mergeHistogramDownHierarchy_(histogram,hierarchy,name);}}else if(histograms instanceof Map){const row=new HistogramSetHierarchy(name);row.depth=hierarchy.length;hierarchy.push(row);HistogramSetHierarchy.buildInternal_(histograms,hierarchy,rootRows);hierarchy.pop();if(hierarchy.length===0){rootRows.push(row);}else{const parentRow=hierarchy[hierarchy.length-1];parentRow.subRows.push(row);}}}}
+static filter(rows,histograms){const results=[];for(const row of rows){let filteredSubRows=[];if(row.subRows.length>0){filteredSubRows=HistogramSetHierarchy.filter(row.subRows,histograms);if(filteredSubRows.length===0)continue;}else{let found=false;for(const testHist of row.columns.values()){if(testHist instanceof tr.v.HistogramSet){for(const origHist of testHist){if(histograms.lookupHistogram(origHist.guid)!==undefined){found=true;break;}}
+if(found)break;continue;}
+if(!(testHist instanceof tr.v.Histogram)){throw new Error('Cells can only contain Histogram or HistogramSet');}
+if(histograms.lookupHistogram(testHist.guid)!==undefined){found=true;break;}
+const mergedFrom=testHist.diagnostics.get(tr.v.d.MERGED_FROM_DIAGNOSTIC_KEY);if(mergedFrom!==undefined){for(const origHist of mergedFrom){if(histograms.lookupHistogram(origHist.guid)!==undefined){found=true;break;}}}
+if(found)break;}
+if(!found)continue;}
+const clone=new HistogramSetHierarchy(row.name);clone.description=row.description;clone.depth=row.depth;clone.subRows=filteredSubRows;clone.columns=row.columns;clone.overviewDataRange_=row.overviewDataRange_;results.push(clone);}
+return results;}
+get overviewDataRange(){if(this.overviewDataRange_===undefined){this.overviewDataRange_=new tr.b.math.Range();for(const[displayLabel,hist]of this.columns){if(hist instanceof tr.v.Histogram&&hist.average!==undefined){this.overviewDataRange_.addValue(hist.average);}
+for(const subRow of this.subRows){const subHist=subRow.columns.get(displayLabel);if(!(subHist instanceof tr.v.Histogram))continue;if(subHist.average===undefined)continue;this.overviewDataRange_.addValue(subHist.average);}}}
+return this.overviewDataRange_;}}
+return{HistogramSetHierarchy,};});'use strict';tr.exportTo('tr.v.ui',function(){Polymer({is:'tr-v-ui-histogram-set-table-cell',created(){this.viewState_=undefined;this.rootListener_=this.onRootStateUpdate_.bind(this);this.row_=undefined;this.displayLabel_='';this.histogram_=undefined;this.histogramSpan_=undefined;this.overviewChart_=undefined;},ready(){this.addEventListener('click',this.onClick_.bind(this));},attached(){if(this.row){this.row.rootViewState.addUpdateListener(this.rootListener_);}},detached(){this.row.rootViewState.removeUpdateListener(this.rootListener_);},build(row,displayLabel,viewState){this.row_=row;this.displayLabel_=displayLabel;this.viewState_=viewState;this.histogram_=this.row.columns.get(displayLabel);if(this.viewState){this.viewState.addUpdateListener(this.onViewStateUpdate_.bind(this));}
+this.row.viewState.addUpdateListener(this.onRowStateUpdate_.bind(this));if(this.isAttached){this.row.rootViewState.addUpdateListener(this.rootListener_);}
+this.updateContents_();},get viewState(){return this.viewState_;},get row(){return this.row_;},get histogram(){return this.histogram_;},get referenceHistogram(){const referenceDisplayLabel=this.row.rootViewState.referenceDisplayLabel;if(!referenceDisplayLabel)return undefined;if(referenceDisplayLabel===this.displayLabel_)return undefined;return this.row.columns.get(referenceDisplayLabel);},get isHistogramOpen(){return(this.histogramSpan_!==undefined)&&(this.$.histogram.style.display==='block');},get brushedBinRange(){if(!this.isHistogramOpen)return new tr.b.math.Range();return this.histogramSpan_.brushedBinRange;},set brushedBinRange(r){if(this.histogramSpan_===undefined)return;this.histogramSpan_.brushedBinRange=r;},get mergeSampleDiagnostics(){if(!this.isHistogramOpen)return false;return this.histogramSpan_.mergeSampleDiagnostics;},set mergeSampleDiagnostics(m){if(this.histogramSpan_===undefined)return;this.histogramSpan_.mergeSampleDiagnostics=m;},set isHistogramOpen(open){if(!(this.histogram instanceof tr.v.Histogram)||(this.histogram.numValues===0)){return;}
+this.$.scalar.style.display=open?'none':'flex';this.$.open_histogram.style.display=open?'none':'block';this.$.close_histogram.style.display=open?'block':'none';this.$.histogram.style.display=open?'block':'none';if(open&&this.histogramSpan_===undefined){this.histogramSpan_=document.createElement('tr-v-ui-histogram-span');this.$.histogram.appendChild(this.histogramSpan_);this.histogramSpan_.viewState=this.viewState;this.histogramSpan_.referenceHistogram=this.referenceHistogram;this.histogramSpan_.histogram=this.histogram;}
+this.viewState.isOpen=open;},onViewStateUpdate_(event){if(event.delta.isOpen){this.isHistogramOpen=this.viewState.isOpen;}},onRowStateUpdate_(event){if(event.delta.isOverviewed===undefined)return;if(this.row.viewState.isOverviewed){this.showOverview();}else{this.hideOverview();}},onRootStateUpdate_(event){if(event.delta.displayStatisticName||event.delta.referenceDisplayLabel){this.updateContents_();}},onClick_(event){event.stopPropagation();},openHistogram_(){this.isHistogramOpen=true;tr.b.Timing.instant('histogram-set-table-cell','open');},closeHistogram_(){this.isHistogramOpen=false;tr.b.Timing.instant('histogram-set-table-cell','close');},updateContents_(){const isOpen=this.isHistogramOpen;this.$.empty.style.display='none';this.$.unmergeable.style.display='none';this.$.scalar.style.display='none';this.$.histogram.style.display='none';this.$.close_histogram.style.display='none';this.$.open_histogram.style.visibility='hidden';if(!this.histogram){this.$.missing.style.display='block';return;}
+this.$.missing.style.display='none';if(this.histogram instanceof tr.v.HistogramSet){this.$.unmergeable.style.display='block';return;}
+if(!(this.histogram instanceof tr.v.Histogram)){throw new Error('Invalid Histogram: '+this.histogram);}
+if(this.histogram.numValues===0){this.$.empty.style.display='block';return;}
+this.$.open_histogram.style.display='block';this.$.open_histogram.style.visibility='visible';this.$.scalar.style.display='flex';const referenceHistogram=this.referenceHistogram;if(this.histogramSpan_){this.histogramSpan_.referenceHistogram=referenceHistogram;}
+if((referenceHistogram instanceof tr.v.Histogram)&&(this.histogram.unit===referenceHistogram.unit)&&(referenceHistogram.numValues>0)){this.$.scalar.significance=this.histogram.getDifferenceSignificance(referenceHistogram);}
+const statName=this.histogram.getAvailableStatisticName(this.row.rootViewState.displayStatisticName,referenceHistogram);const statisticScalar=this.histogram.getStatisticScalar(statName,referenceHistogram);this.$.scalar.setValueAndUnit(statisticScalar.value,statisticScalar.unit);this.isHistogramOpen=isOpen;},showOverview(){this.$.overview_container.style.display='block';if(this.overviewChart_!==undefined)return;const data=[];let unitString;for(const subRow of this.row.subRows){const subHist=subRow.columns.get(this.displayLabel_);if(!(subHist instanceof tr.v.Histogram))continue;data.push({x:subRow.name,y:subHist.average});unitString=subHist.unit.unitString;}
+if(data.length<2)return;this.overviewChart_=new tr.ui.b.NameLineChart();this.$.overview_container.appendChild(this.overviewChart_);this.overviewChart_.hideLegend=true;this.overviewChart_.yAxisLabel=unitString;this.overviewChart_.overrideDataRange=this.row.overviewDataRange;this.overviewChart_.data=data;},hideOverview(){this.$.overview_container.style.display='none';}});return{};});'use strict';tr.exportTo('tr.v.ui',function(){const NAME_COLUMN_WIDTH_PX=300;Polymer({is:'tr-v-ui-histogram-set-table-name-cell',created(){this.row_=undefined;this.overviewChart_=undefined;this.cellListener_=this.onCellStateUpdate_.bind(this);this.rootListener_=this.onRootStateUpdate_.bind(this);},attached(){if(this.row){this.row.rootViewState.addUpdateListener(this.rootListener_);}},detached(){this.row.rootViewState.removeUpdateListener(this.rootListener_);},get row(){return this.row_;},build(row){if(this.row_!==undefined){throw new Error('row must be set exactly once.');}
+this.row_=row;this.row.viewState.addUpdateListener(this.onRowStateUpdate_.bind(this));this.constrainWidth=this.row.rootViewState.constrainNameColumn;if(this.isAttached){this.row.rootViewState.addUpdateListener(this.rootListener_);}
+for(const cellState of this.row.viewState.cells.values()){cellState.addUpdateListener(this.cellListener_);}
+Polymer.dom(this.$.name).textContent=this.row.name;this.title=this.row.name;if(this.row.description){this.title+='\n'+this.row.description;}
+if(this.row.overviewDataRange.isEmpty||this.row.overviewDataRange.min===this.row.overviewDataRange.max){this.$.show_overview.style.display='none';}
+let histogramCount=0;for(const cell of this.row.columns.values()){if(cell instanceof tr.v.Histogram&&cell.numValues>0){++histogramCount;}}
+if(histogramCount<=1){this.$.open_histograms.style.display='none';}},set constrainWidth(constrain){this.$.name.style.maxWidth=constrain?(this.nameWidthPx+'px'):'none';},get nameWidthPx(){return NAME_COLUMN_WIDTH_PX-(16*this.row.depth);},get isOverflowing(){return this.$.name.style.maxWidth!=='none'&&this.$.name.getBoundingClientRect().width===this.nameWidthPx;},get isOverviewed(){return this.$.overview_container.style.display==='block';},set isOverviewed(isOverviewed){if(isOverviewed===this.isOverviewed)return;if(isOverviewed){this.showOverview_();}else{this.hideOverview_();}},hideOverview_(opt_event){this.$.overview_container.style.display='none';this.$.hide_overview.style.display='none';this.$.show_overview.style.display='block';if(opt_event!==undefined){opt_event.stopPropagation();tr.b.Timing.instant('histogram-set-table-name-cell','hideOverview');this.row.viewState.isOverviewed=this.isOverviewed;}},showOverview_(opt_event){this.$.overview_container.style.display='block';if(this.overviewChart_===undefined){const data=[];let unitString=undefined;for(const[displayLabel,hist]of this.row.columns){data.push({x:displayLabel,y:hist.average});unitString=hist.unit.unitString;}
+if(data.length<2){return;}
+this.overviewChart_=new tr.ui.b.NameLineChart();this.$.overview_container.appendChild(this.overviewChart_);this.overviewChart_.hideLegend=true;this.overviewChart_.yAxisLabel=unitString;this.overviewChart_.overrideDataRange=this.row.overviewDataRange;this.overviewChart_.data=data;}
+this.$.hide_overview.style.display='block';this.$.show_overview.style.display='none';if(opt_event!==undefined){opt_event.stopPropagation();tr.b.Timing.instant('histogram-set-table-name-cell','showOverview');this.row.viewState.isOverviewed=this.isOverviewed;}},openHistograms_(event){event.stopPropagation();tr.b.Timing.instant('histogram-set-table-name-cell','openHistograms');for(const cell of this.row.cells.values()){cell.isHistogramOpen=true;}
+this.$.close_histograms.style.display='block';this.$.open_histograms.style.display='none';},closeHistograms_(event){event.stopPropagation();tr.b.Timing.instant('histogram-set-table-name-cell','closeHistograms');for(const cell of this.row.cells.values()){cell.isHistogramOpen=false;}
+this.$.open_histograms.style.display='block';this.$.close_histograms.style.display='none';},onRootStateUpdate_(event){if(event.delta.constrainNameColumn){this.constrainWidth=this.row.rootViewState.constrainNameColumn;}},onRowStateUpdate_(event){if(event.delta.isOverviewed){this.isOverviewed=this.row.viewState.isOverviewed;}},onCellStateUpdate_(event){if(!event.delta.isOpen)return;let cellCount=0;let openCellCount=0;for(const cell of this.row.cells.values()){if(!(cell.histogram instanceof tr.v.Histogram)||(cell.histogram.numValues===0)){continue;}
+++cellCount;if(cell.isHistogramOpen)++openCellCount;}
+if(cellCount<=1)return;const mostlyOpen=openCellCount>(cellCount/2);this.$.open_histograms.style.display=mostlyOpen?'none':'block';this.$.close_histograms.style.display=mostlyOpen?'block':'none';}});return{NAME_COLUMN_WIDTH_PX,};});'use strict';tr.exportTo('tr.v.ui',function(){class HistogramSetTableRow{constructor(hierarchy,baseTable,rootViewState){this.hierarchy_=hierarchy;this.baseTable_=baseTable;this.rootViewState_=rootViewState;this.viewState_=new tr.v.ui.HistogramSetTableRowState();this.viewState_.addUpdateListener(this.onViewStateUpdate_.bind(this));this.nameCell_=undefined;this.cells_=new Map();this.subRows_=[];for(const subHierarchy of hierarchy.subRows){const subRow=new HistogramSetTableRow(subHierarchy,baseTable,rootViewState);this.subRows_.push(subRow);this.viewState.subRows.set(subRow.name,subRow.viewState);}
+for(const columnName of this.columns.keys()){this.viewState.cells.set(columnName,new tr.v.ui.HistogramSetTableCellState());}}
+get name(){return this.hierarchy_.name;}
+get depth(){return this.hierarchy_.depth;}
+get description(){return this.hierarchy_.description;}
+get columns(){return this.hierarchy_.columns;}
+get overviewDataRange(){return this.hierarchy_.overviewDataRange;}
+get rootViewState(){return this.rootViewState_;}
+get cells(){return this.cells_;}
+get subRows(){return this.subRows_;}
+get viewState(){return this.viewState_;}*walk(){yield this;for(const row of this.subRows)yield*row.walk();}
+static*walkAll(rootRows){for(const rootRow of rootRows)yield*rootRow.walk();}
+get nameCell(){if(this.nameCell_===undefined){this.nameCell_=document.createElement('tr-v-ui-histogram-set-table-name-cell');this.nameCell_.build(this);}
+return this.nameCell_;}
+getCell(columnName){if(this.cells.has(columnName))return this.cells.get(columnName);const cell=document.createElement('tr-v-ui-histogram-set-table-cell');cell.build(this,columnName,this.viewState.cells.get(columnName));this.cells.set(columnName,cell);return cell;}
+compareNames(other){return this.name.localeCompare(other.name);}
+compareCells(other,displayLabel,referenceDisplayLabel){const cellA=this.columns.get(displayLabel);const cellB=other.columns.get(displayLabel);if(!(cellA instanceof tr.v.Histogram)||!(cellB instanceof tr.v.Histogram)){return undefined;}
+let referenceCellA;let referenceCellB;if(referenceDisplayLabel&&referenceDisplayLabel!==displayLabel){referenceCellA=this.columns.get(referenceDisplayLabel);referenceCellB=other.columns.get(referenceDisplayLabel);}
+const statisticA=cellA.getAvailableStatisticName(this.rootViewState.displayStatisticName,referenceCellA);const statisticB=cellB.getAvailableStatisticName(this.rootViewState.displayStatisticName,referenceCellB);const valueA=cellA.getStatisticScalar(statisticA,referenceCellA).value;const valueB=cellB.getStatisticScalar(statisticB,referenceCellB).value;return valueA-valueB;}
+onViewStateUpdate_(event){if(event.delta.isExpanded){this.baseTable_.setExpandedForTableRow(this,this.viewState.isExpanded);}
+if(event.delta.subRows){throw new Error('HistogramSetTableRow.subRows must not be reassigned.');}
+if(event.delta.cells){for(const[displayLabel,cell]of this.cells){if(cell.viewState!==this.viewState.cells.get(displayLabel)){throw new Error('Only HistogramSetTableRow may update cells');}}}}
+async restoreState(vs){await this.viewState.update({isExpanded:vs.isExpanded,isOverviewed:vs.isOverviewed,});for(const[displayLabel,cell]of this.cells){const previousState=vs.cells.get(displayLabel);if(!previousState)continue;await cell.viewState.updateFromViewState(previousState);}
+for(const row of this.subRows){const previousState=vs.subRows.get(row.name);if(!previousState)continue;await row.restoreState(previousState);}}}
+return{HistogramSetTableRow,};});'use strict';tr.exportTo('tr.v.ui',function(){const MIDLINE_HORIZONTAL_ELLIPSIS=String.fromCharCode(0x22ef);function escapeRegExp(str){return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,'\\$&');}
+Polymer({is:'tr-v-ui-histogram-set-table',created(){this.viewState_=undefined;this.progress_=()=>Promise.resolve();this.nameColumnTitle_=undefined;this.displayLabels_=[];this.histograms_=undefined;this.sourceHistograms_=undefined;this.groupedHistograms_=undefined;this.hierarchies_=undefined;this.tableRows_=undefined;},ready(){this.$.table.zebra=true;this.addEventListener('sort-column-changed',this.onSortColumnChanged_.bind(this));this.addEventListener('requestSelectionChange',this.onRequestSelectionChange_.bind(this));this.addEventListener('row-expanded-changed',this.onRowExpandedChanged_.bind(this));},get viewState(){return this.viewState_;},set viewState(vs){if(this.viewState_){throw new Error('viewState must be set exactly once.');}
+this.viewState_=vs;this.viewState.addUpdateListener(this.onViewStateUpdate_.bind(this));},get histograms(){return this.histograms_;},async build(histograms,sourceHistograms,displayLabels,opt_progress){this.histograms_=histograms;this.sourceHistograms_=sourceHistograms;this.groupedHistograms_=undefined;this.displayLabels_=displayLabels;if(opt_progress!==undefined)this.progress_=opt_progress;if(histograms.length===0){throw new Error('histogram-set-table requires non-empty HistogramSet.');}
+await this.progress_('Building columns...');this.$.table.tableColumns=[{title:this.buildNameColumnTitle_(),value:row=>row.nameCell,cmp:(a,b)=>a.compareNames(b),}].concat(displayLabels.map(l=>this.buildColumn_(l)));tr.b.Timing.instant('histogram-set-table','columnCount',this.$.table.tableColumns.length);await this.updateContents_();this.fire('display-ready');this.progress_=()=>Promise.resolve();this.checkNameColumnOverflow_(tr.v.ui.HistogramSetTableRow.walkAll(this.$.table.tableRows));},buildNameColumnTitle_(){this.nameColumnTitle_=document.createElement('span');this.nameColumnTitle_.style.display='inline-flex';const nameEl=document.createElement('span');nameEl.textContent='Name';this.nameColumnTitle_.appendChild(nameEl);const toggleWidthEl=document.createElement('span');toggleWidthEl.style.fontWeight='bold';toggleWidthEl.style.background='#bbb';toggleWidthEl.style.color='#333';toggleWidthEl.style.padding='0px 3px';toggleWidthEl.style.marginRight='8px';toggleWidthEl.style.display='none';toggleWidthEl.textContent=MIDLINE_HORIZONTAL_ELLIPSIS;toggleWidthEl.addEventListener('click',this.toggleNameColumnWidth_.bind(this));this.nameColumnTitle_.appendChild(toggleWidthEl);return this.nameColumnTitle_;},toggleNameColumnWidth_(opt_event){this.viewState.update({constrainNameColumn:!this.viewState.constrainNameColumn,});if(opt_event!==undefined){opt_event.stopPropagation();opt_event.preventDefault();tr.b.Timing.instant('histogram-set-table','nameColumn'+
+(this.viewState.constrainNameColumn?'Constrained':'Unconstrained'));}},buildColumn_(displayLabel){const title=document.createElement('span');title.textContent=displayLabel;title.style.whiteSpace='pre';return{title,value:row=>row.getCell(displayLabel),cmp:(rowA,rowB)=>rowA.compareCells(rowB,displayLabel),};},async updateContents_(){if(this.groupedHistograms_===undefined){await this.progress_('Grouping Histograms...');this.groupHistograms_();}
+if(this.hierarchies_===undefined){await this.progress_('Merging Histograms...');this.hierarchies_=tr.v.HistogramSetHierarchy.build(this.groupedHistograms_);this.tableRows_=undefined;}
+const tableRowsDirty=this.tableRows_===undefined;const previousRowStates=this.viewState.tableRowStates;if(tableRowsDirty){await this.progress_('Filtering rows...');let filteredHistograms=this.viewState.showAll?this.histograms:this.sourceHistograms_;if(this.viewState.searchQuery){let query=undefined;try{query=new RegExp(this.viewState.searchQuery);}catch(e){}
+if(query!==undefined){filteredHistograms=new tr.v.HistogramSet([...filteredHistograms].filter(hist=>hist.name.match(query)));}}
+const filteredHierarchies=tr.v.HistogramSetHierarchy.filter(this.hierarchies_,filteredHistograms);this.tableRows_=filteredHierarchies.map(hierarchy=>new tr.v.ui.HistogramSetTableRow(hierarchy,this.$.table,this.viewState));tr.b.Timing.instant('histogram-set-table','rootRowCount',this.tableRows_.length);const namesToRowStates=new Map();for(const row of this.tableRows_){namesToRowStates.set(row.name,row.viewState);}
+await this.viewState.update({tableRowStates:namesToRowStates});}
+await this.progress_('Configuring table...');this.nameColumnTitle_.children[1].style.filter=this.viewState.constrainNameColumn?'invert(100%)':'';const referenceDisplayLabelIndex=this.displayLabels_.indexOf(this.viewState.referenceDisplayLabel);this.$.table.selectedTableColumnIndex=(referenceDisplayLabelIndex<0)?undefined:(1+referenceDisplayLabelIndex);this.$.table.sortColumnIndex=this.viewState.sortColumnIndex;this.$.table.sortDescending=this.viewState.sortDescending;if(tableRowsDirty){await this.progress_('Building DOM...');this.$.table.tableRows=this.tableRows_;for(const row of this.tableRows_){const previousState=previousRowStates.get(row.name);if(!previousState)continue;await row.restoreState(previousState);}}
+this.$.table.rebuild();},async onRowExpandedChanged_(event){event.row.viewState.isExpanded=this.$.table.getExpandedForTableRow(event.row);tr.b.Timing.instant('histogram-set-table','row'+(event.row.viewState.isExpanded?'Expanded':'Collapsed'));if(this.nameColumnTitle_.children[1].style.display==='block')return;await tr.b.animationFrame();this.checkNameColumnOverflow_(event.row.subRows);},checkNameColumnOverflow_(rows){for(const row of rows){if(!row.nameCell.isOverflowing)continue;const[nameSpan,dots]=this.nameColumnTitle_.children;dots.style.display='block';const labelWidthPx=tr.v.ui.NAME_COLUMN_WIDTH_PX-
+dots.getBoundingClientRect().width;nameSpan.style.width=labelWidthPx+'px';return;}},groupHistograms_(){const groupings=this.viewState.groupings.slice();groupings.push(tr.v.HistogramSet.GROUPINGS.DISPLAY_LABEL);function canSkipGrouping(grouping,groupedHistograms){if(groupedHistograms.size>1)return false;if(grouping.key===groupings[0].key)return false;if(grouping.key===tr.v.HistogramSet.GROUPINGS.DISPLAY_LABEL.key){return false;}
+return true;}
+this.groupedHistograms_=this.histograms.groupHistogramsRecursively(groupings,canSkipGrouping);this.hierarchies_=undefined;},async onViewStateUpdate_(event){if(this.histograms_===undefined)return;if(event.delta.groupings!==undefined){this.groupedHistograms_=undefined;}
+if(event.delta.searchQuery!==undefined||event.delta.showAll!==undefined){this.tableRows_=undefined;}
+if(event.delta.displayStatistic!==undefined&&this.$.table.sortColumnIndex>0){this.$.table.sortColumnIndex=undefined;}
+if(event.delta.referenceDisplayLabel!==undefined||event.delta.displayStatisticName!==undefined){this.$.table.tableRows=this.$.table.tableRows;}
+if(event.delta.tableRowStates){if(this.tableRows_.length!==this.viewState.tableRowStates.size){throw new Error('Only histogram-set-table may update tableRowStates');}
+for(const row of this.tableRows_){if(this.viewState.tableRowStates.get(row.name)!==row.viewState){throw new Error('Only histogram-set-table may update tableRowStates');}}}
+await this.updateContents_();},onSortColumnChanged_(event){tr.b.Timing.instant('histogram-set-table','sortColumn');this.viewState.update({sortColumnIndex:event.sortColumnIndex,sortDescending:event.sortDescending,});},onRequestSelectionChange_(event){if(event.selection instanceof tr.model.EventSet)return;event.stopPropagation();tr.b.Timing.instant('histogram-set-table','selectHistogramNames');let histogramNames=event.selection;histogramNames.sort();histogramNames=histogramNames.map(escapeRegExp).join('|');this.viewState.update({showAll:true,searchQuery:`^(${histogramNames})$`,});},get leafHistograms(){const histograms=new tr.v.HistogramSet();for(const row of
+tr.v.ui.HistogramSetTableRow.walkAll(this.$.table.tableRows)){if(row.subRows.length)continue;for(const hist of this.columns.values()){if(!(hist instanceof tr.v.Histogram))continue;histograms.addHistogram(hist);}}
+return histograms;}});return{MIDLINE_HORIZONTAL_ELLIPSIS,};});'use strict';tr.exportTo('tr.v.ui',function(){Polymer({is:'tr-v-ui-histogram-set-view',created(){this.brushingStateController_=new tr.ui.NullBrushingStateController();this.viewState_=new tr.v.ui.HistogramSetViewState();},ready(){this.$.table.viewState=this.viewState;this.$.controls.viewState=this.viewState;this.$.controls.addEventListener('download-csv',this.downloadCSV_.bind(this));},attached(){this.brushingStateController.parentController=tr.c.BrushingStateController.getControllerForElement(this.parentNode);},get brushingStateController(){return this.brushingStateController_;},get viewState(){return this.viewState_;},set helpHref(href){this.$.controls.helpHref=href;},set feedbackHref(href){this.$.controls.feedbackHref=href;},get histograms(){return this.$.table.histograms;},async build(histograms,opt_progress){const progress=opt_progress||(()=>Promise.resolve());if(histograms===undefined||histograms.length===0){this.$.container.style.display='none';this.$.zero.style.display='block';this.style.display='block';return;}
+this.$.zero.style.display='none';this.$.container.style.display='block';this.$.container.style.maxHeight=(window.innerHeight-16)+'px';const buildMark=tr.b.Timing.mark('histogram-set-view','build');await progress('Finding important Histograms...');const sourceHistogramsMark=tr.b.Timing.mark('histogram-set-view','sourceHistograms');const sourceHistograms=histograms.sourceHistograms;sourceHistogramsMark.end();this.$.controls.showAllEnabled=(sourceHistograms.length!==histograms.length);await progress('Collecting parameters...');const collectParametersMark=tr.b.Timing.mark('histogram-set-view','collectParameters');const parameterCollector=new tr.v.HistogramParameterCollector();parameterCollector.process(histograms);this.$.controls.baseStatisticNames=parameterCollector.statisticNames;this.$.controls.possibleGroupings=parameterCollector.possibleGroupings;const displayLabels=parameterCollector.labels;this.$.controls.displayLabels=displayLabels;collectParametersMark.end();await this.$.table.build(histograms,sourceHistograms,displayLabels,progress);buildMark.end();},downloadCSV_(){const downloadCSVMark=tr.b.Timing.mark('histogram-set-view','downloadCSV');const anchor=document.createElement('a');const path=window.location.pathname.split('/');const basename=path[path.length-1].split('.')[0]||'histograms';anchor.download=basename+'.csv';const csv=new tr.v.CSVBuilder(this.$.table.leafHistograms);csv.build();const blob=new window.Blob([csv.toString()],{type:'text/csv'});anchor.href=window.URL.createObjectURL(blob);anchor.click();downloadCSVMark.end();}});return{};});'use strict';tr.exportTo('tr.ui',function(){Polymer({is:'tr-ui-sp-metrics-side-panel',behaviors:[tr.ui.behaviors.SidePanel],ready(){this.model_=undefined;this.rangeOfInterest_=undefined;this.metricLatenciesMs_=[];this.metrics_=[];tr.metrics.MetricRegistry.getAllRegisteredTypeInfos().forEach(function(m){if(m.constructor.name==='sampleMetric')return;this.metrics_.push({label:m.constructor.name,value:m.constructor.name});},this);this.settingsKey_='metrics-side-panel-metric-name';this.currentMetricName_='responsivenessMetric';const metricSelector=tr.ui.b.createSelector(this,'currentMetricName_',this.settingsKey_,this.currentMetricName_,this.metrics_);Polymer.dom(this.$.top_left_controls).appendChild(metricSelector);metricSelector.addEventListener('change',this.onMetricChange_.bind(this));this.currentMetricTypeInfo_=tr.metrics.MetricRegistry.findTypeInfoWithName(this.currentMetricName_);this.recomputeButton_=tr.ui.b.createButton('Recompute',this.onRecompute_,this);Polymer.dom(this.$.top_left_controls).appendChild(this.recomputeButton_);this.$.results.addEventListener('display-ready',()=>{this.$.results.style.display='';});},async build(model){this.model_=model;await this.updateContents_();},get metricLatencyMs(){return tr.b.math.Statistics.mean(this.metricLatenciesMs_);},onMetricChange_(){this.currentMetricTypeInfo_=tr.metrics.MetricRegistry.findTypeInfoWithName(this.currentMetricName_);this.metricLatenciesMs_=[];this.updateContents_();},onRecompute_(){this.updateContents_();},get textLabel(){return'Metrics';},supportsModel(m){if(!m){return{supported:false,reason:'No model available'};}
+return{supported:true};},get model(){return this.model_;},set model(model){this.build(model);},get selection(){},set selection(_){},get rangeOfInterest(){return this.rangeOfInterest_;},set rangeOfInterest(range){this.rangeOfInterest_=range;if(this.currentMetricTypeInfo_&&this.currentMetricTypeInfo_.metadata.supportsRangeOfInterest){if((this.metricLatencyMs===undefined)||(this.metricLatencyMs<100)){this.updateContents_();}else{this.recomputeButton_.style.background='red';}}},async updateContents_(){Polymer.dom(this.$.error).textContent='';this.$.results.style.display='none';if(!this.model_){Polymer.dom(this.$.error).textContent='Missing model';return;}
+const options={metrics:[this.currentMetricName_]};if(this.currentMetricTypeInfo_&&this.currentMetricTypeInfo_.metadata.supportsRangeOfInterest&&this.rangeOfInterest&&!this.rangeOfInterest.isEmpty){options.rangeOfInterest=this.rangeOfInterest;}
+const startDate=new Date();let histograms;try{histograms=tr.metrics.runMetrics(this.model_,options);}catch(err){Polymer.dom(this.$.error).textContent=err.message;return;}
+this.metricLatenciesMs_.push(new Date()-startDate);while(this.metricLatenciesMs_.length>20){this.metricLatenciesMs_.shift();}
+this.recomputeButton_.style.background='';await this.$.results.build(histograms);}});tr.ui.side_panel.SidePanelRegistry.register(function(){return document.createElement('tr-ui-sp-metrics-side-panel');});return{};});'use strict';Polymer({is:'tr-ui-e-s-alerts-side-panel',behaviors:[tr.ui.behaviors.SidePanel],ready(){this.rangeOfInterest_=new tr.b.math.Range();this.selection_=undefined;},get model(){return this.model_;},set model(model){this.model_=model;this.updateContents_();},set selection(selection){},set rangeOfInterest(rangeOfInterest){},selectAlertsOfType(alertTypeString){const alertsOfType=this.model_.alerts.filter(function(alert){return alert.title===alertTypeString;});const event=new tr.model.RequestSelectionChangeEvent();event.selection=new tr.model.EventSet(alertsOfType);this.dispatchEvent(event);},alertsByType_(alerts){const alertsByType={};alerts.forEach(function(alert){if(!alertsByType[alert.title]){alertsByType[alert.title]=[];}
+alertsByType[alert.title].push(alert);});return alertsByType;},alertsTableRows_(alertsByType){return Object.keys(alertsByType).map(function(key){return{alertType:key,count:alertsByType[key].length};});},alertsTableColumns_(){return[{title:'Alert type',value(row){return row.alertType;},width:'180px'},{title:'Count',width:'100%',value(row){return row.count;}}];},createAlertsTable_(alerts){const alertsByType=this.alertsByType_(alerts);const table=document.createElement('tr-ui-b-table');table.tableColumns=this.alertsTableColumns_();table.tableRows=this.alertsTableRows_(alertsByType);table.selectionMode=tr.ui.b.TableFormat.SelectionMode.ROW;table.addEventListener('selection-changed',function(e){const row=table.selectedTableRow;if(row){this.selectAlertsOfType(row.alertType);}}.bind(this));return table;},updateContents_(){Polymer.dom(this.$.result_area).textContent='';if(this.model_===undefined)return;const panel=this.createAlertsTable_(this.model_.alerts);Polymer.dom(this.$.result_area).appendChild(panel);},supportsModel(m){if(m===undefined){return{supported:false,reason:'Unknown tracing model'};}else if(m.alerts.length===0){return{supported:false,reason:'No alerts in tracing model'};}
+return{supported:true};},get textLabel(){return'Alerts';}});tr.ui.side_panel.SidePanelRegistry.register(function(){return document.createElement('tr-ui-e-s-alerts-side-panel');});
+</script>
+<!--CATAPULT_REV=NO_AUTO_UPDATE--> \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_data b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_data
new file mode 100644
index 0000000..2aceb18
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_data
@@ -0,0 +1,127 @@
+# tracer: nop
+#
+# entries-in-buffer/entries-written: 116/116 #P:1
+#
+# _-----=> irqs-off
+# / _----=> need-resched
+# | / _---=> hardirq/softirq
+# || / _--=> preempt-depth
+# ||| / delay
+# TASK-PID CPU# |||| TIMESTAMP FUNCTION
+# | | | |||| | |
+atrace-14446 [000] ...2 1212.465062: sched_switch: prev_comm=atrace prev_pid=14446 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1212.465074: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.465082: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ksoftirqd/0-3 [000] ...2 1212.465092: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1212.465102: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.465126: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ksoftirqd/0-3 [000] ...2 1212.465132: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1212.465139: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.465145: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ksoftirqd/0-3 [000] ...2 1212.465227: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h5 1212.465297: sched_wakeup: comm=adbd pid=212 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.465306: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=adbd next_pid=212 next_prio=120
+dsx_exp_workque-212 [000] d..4 1212.465329: sched_wakeup: comm=adbd pid=209 prio=120 success=1 target_cpu=000
+dsx_exp_workque-212 [000] ...2 1212.465348: sched_switch: prev_comm=adbd prev_pid=212 prev_prio=120 prev_state=S ==> next_comm=adbd next_pid=209 next_prio=120
+uether-209 [000] d..4 1212.465395: sched_wakeup: comm=adbd pid=211 prio=120 success=1 target_cpu=000
+uether-209 [000] ...2 1212.465441: sched_switch: prev_comm=adbd prev_pid=209 prev_prio=120 prev_state=S ==> next_comm=adbd next_pid=211 next_prio=120
+dsx_rebuild_wor-211 [000] ...2 1212.465448: sched_switch: prev_comm=adbd prev_pid=211 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h5 1212.574554: sched_wakeup: comm=sensors.qcom pid=292 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.574566: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=sensors.qcom next_pid=292 next_prio=120
+irq/363-ARM64 s-292 [000] ...2 1212.574665: sched_switch: prev_comm=sensors.qcom prev_pid=292 prev_prio=120 prev_state=S ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
+sensors.qcom-14447 [000] d..4 1212.574797: sched_wakeup: comm=sensors.qcom pid=1593 prio=120 success=1 target_cpu=000
+sensors.qcom-14447 [000] ...2 1212.574802: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=R+ ==> next_comm=sensors.qcom next_pid=1593 next_prio=120
+sensors.qcom-1593 [000] ...2 1212.574819: sched_switch: prev_comm=sensors.qcom prev_pid=1593 prev_prio=120 prev_state=D ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
+sensors.qcom-14447 [000] d..3 1212.574823: sched_wakeup: comm=sensors.qcom pid=1593 prio=120 success=1 target_cpu=000
+sensors.qcom-14447 [000] ...2 1212.574827: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=R+ ==> next_comm=sensors.qcom next_pid=1593 next_prio=120
+sensors.qcom-1593 [000] d..4 1212.574865: sched_wakeup: comm=sensors.qcom pid=760 prio=120 success=1 target_cpu=000
+sensors.qcom-1593 [000] ...2 1212.574876: sched_switch: prev_comm=sensors.qcom prev_pid=1593 prev_prio=120 prev_state=S ==> next_comm=sensors.qcom next_pid=760 next_prio=120
+sensors.qcom-760 [000] d..4 1212.574905: sched_wakeup: comm=system_server pid=782 prio=118 success=1 target_cpu=000
+sensors.qcom-760 [000] ...2 1212.574917: sched_switch: prev_comm=sensors.qcom prev_pid=760 prev_prio=120 prev_state=S ==> next_comm=system_server next_pid=782 next_prio=118
+system_server-782 [000] d..4 1212.574981: sched_wakeup: comm=system_server pid=785 prio=118 success=1 target_cpu=000
+system_server-782 [000] ...2 1212.575009: sched_switch: prev_comm=system_server prev_pid=782 prev_prio=118 prev_state=S ==> next_comm=system_server next_pid=785 next_prio=118
+system_server-785 [000] ...2 1212.575045: sched_switch: prev_comm=system_server prev_pid=785 prev_prio=118 prev_state=S ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
+sensors.qcom-14447 [000] ...3 1212.575143: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=x ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1212.575153: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.575159: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ksoftirqd/0-3 [000] ...2 1212.575167: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1212.575175: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.575181: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ksoftirqd/0-3 [000] ...2 1212.575188: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1212.575195: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.575201: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ksoftirqd/0-3 [000] ...2 1212.575211: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h4 1212.649601: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.649614: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
+MMHandlerThread-7231 [000] ...2 1212.649630: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h6 1212.729539: sched_wakeup: comm=kworker/u:1 pid=21 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] dNs6 1212.729550: sched_wakeup: comm=kworker/0:2H pid=557 prio=100 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.729563: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:1 next_pid=21 next_prio=120
+kworker/u:1-21 [000] d..5 1212.729571: sched_wakeup: comm=mpdecision pid=2046 prio=113 success=1 target_cpu=000
+kworker/u:1-21 [000] ...2 1212.729578: sched_switch: prev_comm=kworker/u:1 prev_pid=21 prev_prio=120 prev_state=S ==> next_comm=kworker/0:2H next_pid=557 next_prio=100
+thermal-engine-557 [000] d..4 1212.729597: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
+thermal-engine-557 [000] ...2 1212.729600: sched_switch: prev_comm=kworker/0:2H prev_pid=557 prev_prio=100 prev_state=D ==> next_comm=mpdecision next_pid=2046 next_prio=113
+mpdecision-2046 [000] ...2 1212.729801: sched_switch: prev_comm=mpdecision prev_pid=2046 prev_prio=113 prev_state=S ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
+kworker/0:1H-17 [000] ...2 1212.730104: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1212.730134: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.730154: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ksoftirqd/0-3 [000] ...2 1212.730176: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1212.730201: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.730220: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ksoftirqd/0-3 [000] ...2 1212.730241: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1212.730262: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.730280: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ksoftirqd/0-3 [000] ...2 1212.730303: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h6 1212.730638: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.730669: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
+migration/0-7 [000] d..6 1212.730707: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
+migration/0-7 [000] ...2 1212.730728: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
+kworker/0:1H-17 [000] ...2 1212.730916: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h6 1212.731632: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.731661: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
+migration/0-7 [000] d..6 1212.731702: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
+migration/0-7 [000] ...2 1212.731722: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
+kworker/0:1H-17 [000] ...2 1212.731832: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h6 1212.732685: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.732714: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
+migration/0-7 [000] d..6 1212.732747: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
+migration/0-7 [000] ...2 1212.732767: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
+kworker/0:1H-17 [000] d..4 1212.732810: sched_wakeup: comm=kworker/0:2H pid=557 prio=100 success=1 target_cpu=000
+kworker/0:1H-17 [000] ...2 1212.732829: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=S ==> next_comm=kworker/0:2H next_pid=557 next_prio=100
+thermal-engine-557 [000] ...2 1212.732854: sched_switch: prev_comm=kworker/0:2H prev_pid=557 prev_prio=100 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h4 1212.876266: sched_wakeup: comm=RILSender0 pid=1365 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] dNh4 1212.876284: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.876316: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=RILSender0 next_pid=1365 next_prio=120
+RILSender0-1365 [000] ...2 1212.876415: sched_switch: prev_comm=RILSender0 prev_pid=1365 prev_prio=120 prev_state=S ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
+MMHandlerThread-7231 [000] ...2 1212.876454: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h4 1213.089569: sched_wakeup: comm=Thread-625 pid=5750 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] dNh4 1213.089587: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1213.089622: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=Thread-625 next_pid=5750 next_prio=120
+AsyncTask #1-5750 [000] ...2 1213.089842: sched_switch: prev_comm=Thread-625 prev_pid=5750 prev_prio=120 prev_state=S ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
+MMHandlerThread-7231 [000] ...2 1213.089879: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h4 1213.327439: sched_wakeup: comm=pandora.android pid=5395 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] dNh4 1213.327455: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1213.327487: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
+MMHandlerThread-7231 [000] ...2 1213.327518: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=pandora.android next_pid=5395 next_prio=120
+pandora.android-5395 [000] d..4 1213.327718: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
+pandora.android-5395 [000] ...2 1213.327739: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=R+ ==> next_comm=Binder_1 next_pid=780 next_prio=120
+Binder_1-780 [000] ...2 1213.327763: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=D ==> next_comm=pandora.android next_pid=5395 next_prio=120
+pandora.android-5395 [000] d..3 1213.327781: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
+pandora.android-5395 [000] ...2 1213.327795: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=R+ ==> next_comm=Binder_1 next_pid=780 next_prio=120
+Binder_1-780 [000] d..4 1213.328056: sched_wakeup: comm=Binder_1 pid=878 prio=120 success=1 target_cpu=000
+Binder_1-780 [000] ...2 1213.328095: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=S ==> next_comm=Binder_1 next_pid=878 next_prio=120
+Binder_1-878 [000] d..4 1213.328263: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
+Binder_1-878 [000] ...2 1213.328345: sched_switch: prev_comm=Binder_1 prev_pid=878 prev_prio=120 prev_state=S ==> next_comm=Binder_1 next_pid=780 next_prio=120
+Binder_1-780 [000] ...2 1213.328558: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=S ==> next_comm=pandora.android next_pid=5395 next_prio=120
+pandora.android-5395 [000] ...2 1213.328743: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1213.328773: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1213.328793: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ksoftirqd/0-3 [000] ...2 1213.328821: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1213.328846: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1213.328866: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ksoftirqd/0-3 [000] ...2 1213.328891: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1213.328913: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1213.328931: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ksoftirqd/0-3 [000] ...2 1213.328964: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h4 1213.465138: sched_wakeup: comm=atrace pid=14446 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1213.465171: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=atrace next_pid=14446 next_prio=120
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_data_raw b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_data_raw
new file mode 100644
index 0000000..1c8e086
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_data_raw
@@ -0,0 +1,128 @@
+
+# tracer: nop
+#
+# entries-in-buffer/entries-written: 116/116 #P:1
+#
+# _-----=> irqs-off
+# / _----=> need-resched
+# | / _---=> hardirq/softirq
+# || / _--=> preempt-depth
+# ||| / delay
+# TASK-PID CPU# |||| TIMESTAMP FUNCTION
+# | | | |||| | |
+ atrace-14446 [000] ...2 1212.465062: sched_switch: prev_comm=atrace prev_pid=14446 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1212.465074: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.465082: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 [000] ...2 1212.465092: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1212.465102: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.465126: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 [000] ...2 1212.465132: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1212.465139: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.465145: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 [000] ...2 1212.465227: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h5 1212.465297: sched_wakeup: comm=adbd pid=212 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.465306: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=adbd next_pid=212 next_prio=120
+ adbd-212 [000] d..4 1212.465329: sched_wakeup: comm=adbd pid=209 prio=120 success=1 target_cpu=000
+ adbd-212 [000] ...2 1212.465348: sched_switch: prev_comm=adbd prev_pid=212 prev_prio=120 prev_state=S ==> next_comm=adbd next_pid=209 next_prio=120
+ adbd-209 [000] d..4 1212.465395: sched_wakeup: comm=adbd pid=211 prio=120 success=1 target_cpu=000
+ adbd-209 [000] ...2 1212.465441: sched_switch: prev_comm=adbd prev_pid=209 prev_prio=120 prev_state=S ==> next_comm=adbd next_pid=211 next_prio=120
+ adbd-211 [000] ...2 1212.465448: sched_switch: prev_comm=adbd prev_pid=211 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h5 1212.574554: sched_wakeup: comm=sensors.qcom pid=292 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.574566: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=sensors.qcom next_pid=292 next_prio=120
+ sensors.qcom-292 [000] ...2 1212.574665: sched_switch: prev_comm=sensors.qcom prev_pid=292 prev_prio=120 prev_state=S ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
+ sensors.qcom-14447 [000] d..4 1212.574797: sched_wakeup: comm=sensors.qcom pid=1593 prio=120 success=1 target_cpu=000
+ sensors.qcom-14447 [000] ...2 1212.574802: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=R+ ==> next_comm=sensors.qcom next_pid=1593 next_prio=120
+ sensors.qcom-1593 [000] ...2 1212.574819: sched_switch: prev_comm=sensors.qcom prev_pid=1593 prev_prio=120 prev_state=D ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
+ sensors.qcom-14447 [000] d..3 1212.574823: sched_wakeup: comm=sensors.qcom pid=1593 prio=120 success=1 target_cpu=000
+ sensors.qcom-14447 [000] ...2 1212.574827: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=R+ ==> next_comm=sensors.qcom next_pid=1593 next_prio=120
+ sensors.qcom-1593 [000] d..4 1212.574865: sched_wakeup: comm=sensors.qcom pid=760 prio=120 success=1 target_cpu=000
+ sensors.qcom-1593 [000] ...2 1212.574876: sched_switch: prev_comm=sensors.qcom prev_pid=1593 prev_prio=120 prev_state=S ==> next_comm=sensors.qcom next_pid=760 next_prio=120
+ sensors.qcom-760 [000] d..4 1212.574905: sched_wakeup: comm=system_server pid=782 prio=118 success=1 target_cpu=000
+ sensors.qcom-760 [000] ...2 1212.574917: sched_switch: prev_comm=sensors.qcom prev_pid=760 prev_prio=120 prev_state=S ==> next_comm=system_server next_pid=782 next_prio=118
+ system_server-782 [000] d..4 1212.574981: sched_wakeup: comm=system_server pid=785 prio=118 success=1 target_cpu=000
+ system_server-782 [000] ...2 1212.575009: sched_switch: prev_comm=system_server prev_pid=782 prev_prio=118 prev_state=S ==> next_comm=system_server next_pid=785 next_prio=118
+ system_server-785 [000] ...2 1212.575045: sched_switch: prev_comm=system_server prev_pid=785 prev_prio=118 prev_state=S ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
+ sensors.qcom-14447 [000] ...3 1212.575143: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=x ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1212.575153: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.575159: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 [000] ...2 1212.575167: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1212.575175: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.575181: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 [000] ...2 1212.575188: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1212.575195: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.575201: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 [000] ...2 1212.575211: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h4 1212.649601: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.649614: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
+ MMHandlerThread-7231 [000] ...2 1212.649630: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h6 1212.729539: sched_wakeup: comm=kworker/u:1 pid=21 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] dNs6 1212.729550: sched_wakeup: comm=kworker/0:2H pid=557 prio=100 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.729563: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:1 next_pid=21 next_prio=120
+ kworker/u:1-21 [000] d..5 1212.729571: sched_wakeup: comm=mpdecision pid=2046 prio=113 success=1 target_cpu=000
+ kworker/u:1-21 [000] ...2 1212.729578: sched_switch: prev_comm=kworker/u:1 prev_pid=21 prev_prio=120 prev_state=S ==> next_comm=kworker/0:2H next_pid=557 next_prio=100
+ kworker/0:2H-557 [000] d..4 1212.729597: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
+ kworker/0:2H-557 [000] ...2 1212.729600: sched_switch: prev_comm=kworker/0:2H prev_pid=557 prev_prio=100 prev_state=D ==> next_comm=mpdecision next_pid=2046 next_prio=113
+ mpdecision-2046 [000] ...2 1212.729801: sched_switch: prev_comm=mpdecision prev_pid=2046 prev_prio=113 prev_state=S ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
+ kworker/0:1H-17 [000] ...2 1212.730104: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1212.730134: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.730154: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 [000] ...2 1212.730176: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1212.730201: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.730220: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 [000] ...2 1212.730241: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1212.730262: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.730280: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 [000] ...2 1212.730303: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h6 1212.730638: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.730669: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
+ kworker/u:0H-7 [000] d..6 1212.730707: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
+ kworker/u:0H-7 [000] ...2 1212.730728: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
+ kworker/0:1H-17 [000] ...2 1212.730916: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h6 1212.731632: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.731661: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
+ kworker/u:0H-7 [000] d..6 1212.731702: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
+ kworker/u:0H-7 [000] ...2 1212.731722: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
+ kworker/0:1H-17 [000] ...2 1212.731832: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h6 1212.732685: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.732714: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
+ kworker/u:0H-7 [000] d..6 1212.732747: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
+ kworker/u:0H-7 [000] ...2 1212.732767: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
+ kworker/0:1H-17 [000] d..4 1212.732810: sched_wakeup: comm=kworker/0:2H pid=557 prio=100 success=1 target_cpu=000
+ kworker/0:1H-17 [000] ...2 1212.732829: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=S ==> next_comm=kworker/0:2H next_pid=557 next_prio=100
+ kworker/0:2H-557 [000] ...2 1212.732854: sched_switch: prev_comm=kworker/0:2H prev_pid=557 prev_prio=100 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h4 1212.876266: sched_wakeup: comm=RILSender0 pid=1365 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] dNh4 1212.876284: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.876316: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=RILSender0 next_pid=1365 next_prio=120
+ RILSender0-1365 [000] ...2 1212.876415: sched_switch: prev_comm=RILSender0 prev_pid=1365 prev_prio=120 prev_state=S ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
+ MMHandlerThread-7231 [000] ...2 1212.876454: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h4 1213.089569: sched_wakeup: comm=Thread-625 pid=5750 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] dNh4 1213.089587: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1213.089622: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=Thread-625 next_pid=5750 next_prio=120
+ Thread-625-5750 [000] ...2 1213.089842: sched_switch: prev_comm=Thread-625 prev_pid=5750 prev_prio=120 prev_state=S ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
+ MMHandlerThread-7231 [000] ...2 1213.089879: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h4 1213.327439: sched_wakeup: comm=pandora.android pid=5395 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] dNh4 1213.327455: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1213.327487: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
+ MMHandlerThread-7231 [000] ...2 1213.327518: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=pandora.android next_pid=5395 next_prio=120
+ pandora.android-5395 [000] d..4 1213.327718: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
+ pandora.android-5395 [000] ...2 1213.327739: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=R+ ==> next_comm=Binder_1 next_pid=780 next_prio=120
+ Binder_1-780 [000] ...2 1213.327763: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=D ==> next_comm=pandora.android next_pid=5395 next_prio=120
+ pandora.android-5395 [000] d..3 1213.327781: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
+ pandora.android-5395 [000] ...2 1213.327795: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=R+ ==> next_comm=Binder_1 next_pid=780 next_prio=120
+ Binder_1-780 [000] d..4 1213.328056: sched_wakeup: comm=Binder_1 pid=878 prio=120 success=1 target_cpu=000
+ Binder_1-780 [000] ...2 1213.328095: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=S ==> next_comm=Binder_1 next_pid=878 next_prio=120
+ Binder_1-878 [000] d..4 1213.328263: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
+ Binder_1-878 [000] ...2 1213.328345: sched_switch: prev_comm=Binder_1 prev_pid=878 prev_prio=120 prev_state=S ==> next_comm=Binder_1 next_pid=780 next_prio=120
+ Binder_1-780 [000] ...2 1213.328558: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=S ==> next_comm=pandora.android next_pid=5395 next_prio=120
+ pandora.android-5395 [000] ...2 1213.328743: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1213.328773: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1213.328793: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 [000] ...2 1213.328821: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1213.328846: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1213.328866: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 [000] ...2 1213.328891: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1213.328913: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1213.328931: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 [000] ...2 1213.328964: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h4 1213.465138: sched_wakeup: comm=atrace pid=14446 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1213.465171: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=atrace next_pid=14446 next_prio=120
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_data_stripped b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_data_stripped
new file mode 100644
index 0000000..3261ebf
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_data_stripped
@@ -0,0 +1,127 @@
+# tracer: nop
+#
+# entries-in-buffer/entries-written: 116/116 #P:1
+#
+# _-----=> irqs-off
+# / _----=> need-resched
+# | / _---=> hardirq/softirq
+# || / _--=> preempt-depth
+# ||| / delay
+# TASK-PID CPU# |||| TIMESTAMP FUNCTION
+# | | | |||| | |
+ atrace-14446 [000] ...2 1212.465062: sched_switch: prev_comm=atrace prev_pid=14446 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1212.465074: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.465082: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 [000] ...2 1212.465092: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1212.465102: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.465126: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 [000] ...2 1212.465132: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1212.465139: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.465145: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 [000] ...2 1212.465227: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h5 1212.465297: sched_wakeup: comm=adbd pid=212 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.465306: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=adbd next_pid=212 next_prio=120
+ adbd-212 [000] d..4 1212.465329: sched_wakeup: comm=adbd pid=209 prio=120 success=1 target_cpu=000
+ adbd-212 [000] ...2 1212.465348: sched_switch: prev_comm=adbd prev_pid=212 prev_prio=120 prev_state=S ==> next_comm=adbd next_pid=209 next_prio=120
+ adbd-209 [000] d..4 1212.465395: sched_wakeup: comm=adbd pid=211 prio=120 success=1 target_cpu=000
+ adbd-209 [000] ...2 1212.465441: sched_switch: prev_comm=adbd prev_pid=209 prev_prio=120 prev_state=S ==> next_comm=adbd next_pid=211 next_prio=120
+ adbd-211 [000] ...2 1212.465448: sched_switch: prev_comm=adbd prev_pid=211 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h5 1212.574554: sched_wakeup: comm=sensors.qcom pid=292 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.574566: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=sensors.qcom next_pid=292 next_prio=120
+ sensors.qcom-292 [000] ...2 1212.574665: sched_switch: prev_comm=sensors.qcom prev_pid=292 prev_prio=120 prev_state=S ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
+ sensors.qcom-14447 [000] d..4 1212.574797: sched_wakeup: comm=sensors.qcom pid=1593 prio=120 success=1 target_cpu=000
+ sensors.qcom-14447 [000] ...2 1212.574802: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=R+ ==> next_comm=sensors.qcom next_pid=1593 next_prio=120
+ sensors.qcom-1593 [000] ...2 1212.574819: sched_switch: prev_comm=sensors.qcom prev_pid=1593 prev_prio=120 prev_state=D ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
+ sensors.qcom-14447 [000] d..3 1212.574823: sched_wakeup: comm=sensors.qcom pid=1593 prio=120 success=1 target_cpu=000
+ sensors.qcom-14447 [000] ...2 1212.574827: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=R+ ==> next_comm=sensors.qcom next_pid=1593 next_prio=120
+ sensors.qcom-1593 [000] d..4 1212.574865: sched_wakeup: comm=sensors.qcom pid=760 prio=120 success=1 target_cpu=000
+ sensors.qcom-1593 [000] ...2 1212.574876: sched_switch: prev_comm=sensors.qcom prev_pid=1593 prev_prio=120 prev_state=S ==> next_comm=sensors.qcom next_pid=760 next_prio=120
+ sensors.qcom-760 [000] d..4 1212.574905: sched_wakeup: comm=system_server pid=782 prio=118 success=1 target_cpu=000
+ sensors.qcom-760 [000] ...2 1212.574917: sched_switch: prev_comm=sensors.qcom prev_pid=760 prev_prio=120 prev_state=S ==> next_comm=system_server next_pid=782 next_prio=118
+ system_server-782 [000] d..4 1212.574981: sched_wakeup: comm=system_server pid=785 prio=118 success=1 target_cpu=000
+ system_server-782 [000] ...2 1212.575009: sched_switch: prev_comm=system_server prev_pid=782 prev_prio=118 prev_state=S ==> next_comm=system_server next_pid=785 next_prio=118
+ system_server-785 [000] ...2 1212.575045: sched_switch: prev_comm=system_server prev_pid=785 prev_prio=118 prev_state=S ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
+ sensors.qcom-14447 [000] ...3 1212.575143: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=x ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1212.575153: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.575159: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 [000] ...2 1212.575167: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1212.575175: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.575181: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 [000] ...2 1212.575188: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1212.575195: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.575201: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 [000] ...2 1212.575211: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h4 1212.649601: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.649614: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
+ MMHandlerThread-7231 [000] ...2 1212.649630: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h6 1212.729539: sched_wakeup: comm=kworker/u:1 pid=21 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] dNs6 1212.729550: sched_wakeup: comm=kworker/0:2H pid=557 prio=100 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.729563: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:1 next_pid=21 next_prio=120
+ kworker/u:1-21 [000] d..5 1212.729571: sched_wakeup: comm=mpdecision pid=2046 prio=113 success=1 target_cpu=000
+ kworker/u:1-21 [000] ...2 1212.729578: sched_switch: prev_comm=kworker/u:1 prev_pid=21 prev_prio=120 prev_state=S ==> next_comm=kworker/0:2H next_pid=557 next_prio=100
+ kworker/0:2H-557 [000] d..4 1212.729597: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
+ kworker/0:2H-557 [000] ...2 1212.729600: sched_switch: prev_comm=kworker/0:2H prev_pid=557 prev_prio=100 prev_state=D ==> next_comm=mpdecision next_pid=2046 next_prio=113
+ mpdecision-2046 [000] ...2 1212.729801: sched_switch: prev_comm=mpdecision prev_pid=2046 prev_prio=113 prev_state=S ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
+ kworker/0:1H-17 [000] ...2 1212.730104: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1212.730134: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.730154: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 [000] ...2 1212.730176: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1212.730201: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.730220: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 [000] ...2 1212.730241: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1212.730262: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.730280: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 [000] ...2 1212.730303: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h6 1212.730638: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.730669: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
+ kworker/u:0H-7 [000] d..6 1212.730707: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
+ kworker/u:0H-7 [000] ...2 1212.730728: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
+ kworker/0:1H-17 [000] ...2 1212.730916: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h6 1212.731632: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.731661: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
+ kworker/u:0H-7 [000] d..6 1212.731702: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
+ kworker/u:0H-7 [000] ...2 1212.731722: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
+ kworker/0:1H-17 [000] ...2 1212.731832: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h6 1212.732685: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.732714: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
+ kworker/u:0H-7 [000] d..6 1212.732747: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
+ kworker/u:0H-7 [000] ...2 1212.732767: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
+ kworker/0:1H-17 [000] d..4 1212.732810: sched_wakeup: comm=kworker/0:2H pid=557 prio=100 success=1 target_cpu=000
+ kworker/0:1H-17 [000] ...2 1212.732829: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=S ==> next_comm=kworker/0:2H next_pid=557 next_prio=100
+ kworker/0:2H-557 [000] ...2 1212.732854: sched_switch: prev_comm=kworker/0:2H prev_pid=557 prev_prio=100 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h4 1212.876266: sched_wakeup: comm=RILSender0 pid=1365 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] dNh4 1212.876284: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1212.876316: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=RILSender0 next_pid=1365 next_prio=120
+ RILSender0-1365 [000] ...2 1212.876415: sched_switch: prev_comm=RILSender0 prev_pid=1365 prev_prio=120 prev_state=S ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
+ MMHandlerThread-7231 [000] ...2 1212.876454: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h4 1213.089569: sched_wakeup: comm=Thread-625 pid=5750 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] dNh4 1213.089587: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1213.089622: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=Thread-625 next_pid=5750 next_prio=120
+ Thread-625-5750 [000] ...2 1213.089842: sched_switch: prev_comm=Thread-625 prev_pid=5750 prev_prio=120 prev_state=S ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
+ MMHandlerThread-7231 [000] ...2 1213.089879: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h4 1213.327439: sched_wakeup: comm=pandora.android pid=5395 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] dNh4 1213.327455: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1213.327487: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
+ MMHandlerThread-7231 [000] ...2 1213.327518: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=pandora.android next_pid=5395 next_prio=120
+ pandora.android-5395 [000] d..4 1213.327718: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
+ pandora.android-5395 [000] ...2 1213.327739: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=R+ ==> next_comm=Binder_1 next_pid=780 next_prio=120
+ Binder_1-780 [000] ...2 1213.327763: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=D ==> next_comm=pandora.android next_pid=5395 next_prio=120
+ pandora.android-5395 [000] d..3 1213.327781: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
+ pandora.android-5395 [000] ...2 1213.327795: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=R+ ==> next_comm=Binder_1 next_pid=780 next_prio=120
+ Binder_1-780 [000] d..4 1213.328056: sched_wakeup: comm=Binder_1 pid=878 prio=120 success=1 target_cpu=000
+ Binder_1-780 [000] ...2 1213.328095: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=S ==> next_comm=Binder_1 next_pid=878 next_prio=120
+ Binder_1-878 [000] d..4 1213.328263: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
+ Binder_1-878 [000] ...2 1213.328345: sched_switch: prev_comm=Binder_1 prev_pid=878 prev_prio=120 prev_state=S ==> next_comm=Binder_1 next_pid=780 next_prio=120
+ Binder_1-780 [000] ...2 1213.328558: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=S ==> next_comm=pandora.android next_pid=5395 next_prio=120
+ pandora.android-5395 [000] ...2 1213.328743: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1213.328773: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1213.328793: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 [000] ...2 1213.328821: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1213.328846: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1213.328866: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 [000] ...2 1213.328891: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d..4 1213.328913: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1213.328931: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 [000] ...2 1213.328964: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 [000] d.h4 1213.465138: sched_wakeup: comm=atrace pid=14446 prio=120 success=1 target_cpu=000
+ <idle>-0 [000] ...2 1213.465171: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=atrace next_pid=14446 next_prio=120
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_extracted_tgids b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_extracted_tgids
new file mode 100644
index 0000000..1084fba
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_extracted_tgids
@@ -0,0 +1 @@
+{'22503': '18089', '1868': '1772', '10458': '1772', '429': '429', '234': '234', '18956': '18949', '18957': '18949', '18954': '18949', '18955': '18949', '5980': '1370', '344': '344', '345': '345', '346': '346', '340': '340', '341': '341', '342': '342', '343': '343', '3723': '450', '22184': '1760', '349': '349', '411': '406', '2912': '1483', '2913': '1483', '1793': '1772', '1790': '1772', '1797': '1483', '1490': '1393', '1397': '1393', '1492': '1483', '1493': '1483', '1494': '1483', '1495': '1483', '1496': '858', '1497': '1483', '1498': '1483', '18686': '454', '24304': '24304', '1395': '1393', '1068': '1068', '422': '422', '1704': '1500', '5262': '1772', '425': '425', '6654': '1370', '25224': '25224', '424': '424', '868': '858', '1669': '1655', '1668': '1655', '1667': '1655', '1666': '1655', '294': '294', '295': '295', '1663': '1655', '2708': '2579', '1660': '1655', '1129': '1124', '1628': '1483', '3776': '858', '1081': '1079', '1080': '1079', '1124': '1124', '1127': '1124', '270': '270', '271': '271', '272': '272', '273': '273', '274': '274', '275': '275', '276': '276', '277': '277', '278': '278', '279': '279', '25115': '25115', '583': '444', '3386': '858', '11689': '8269', '2544': '1655', '2548': '1655', '524': '450', '525': '450', '526': '450', '527': '450', '520': '450', '521': '450', '522': '450', '523': '450', '1403': '1393', '1402': '1393', '1016': '445', '1017': '445', '1407': '1393', '1406': '1393', '1405': '1393', '1013': '445', '303': '303', '1339': '858', '7516': '858', '1232': '1124', '2445': '1760', '25227': '25227', '442': '442', '2761': '2761', '421': '421', '447': '447', '446': '446', '445': '445', '305': '305', '108': '108', '109': '109', '18101': '18089', '18100': '18089', '8280': '8269', '2102': '1772', '102': '102', '103': '103', '100': '100', '101': '101', '106': '106', '107': '107', '104': '104', '105': '105', '1849': '1500', '1848': '1500', '906': '906', '907': '907', '905': '905', '33': '33', '1842': '1500', '31': '31', '30': '30', '1847': '1500', '1536': '858', '1535': '1393', '246': '246', '1533': '1393', '1532': '1393', '1531': '1500', '21920': '1370', '24281': '24281', '437': '437', '434': '434', '1512': '1500', '2161': '1370', '1940': '1772', '1539': '1458', '2162': '1772', '2615': '1655', '2614': '1760', '2612': '1760', '2611': '2579', '423': '423', '335': '335', '337': '337', '18450': '18089', '331': '331', '19187': '1370', '333': '333', '332': '332', '5136': '1500', '23246': '23233', '2087': '1772', '23240': '23233', '23241': '23233', '23242': '23233', '23243': '23233', '854': '439', '850': '439', '851': '439', '852': '439', '853': '439', '858': '858', '88': '88', '1375': '858', '541': '442', '2688': '2579', '6': '6', '2684': '2579', '2685': '2579', '23398': '1124', '2683': '2579', '49': '49', '846': '439', '1374': '858', '3555': '858', '5424': '445', '99': '99', '98': '98', '2245': '858', '91': '91', '90': '90', '93': '93', '92': '92', '95': '95', '94': '94', '14143': '1760', '96': '96', '1623': '1471', '1622': '1483', '1621': '1483', '5181': '1500', '1627': '1483', '2578': '2558', '1625': '1483', '1624': '1483', '348': '348', '5189': '1500', '5427': '445', '4469': '442', '20228': '18649', '559': '442', '774': '405', '11180': '858', '22758': '18649', '18670': '18649', '238': '238', '239': '239', '24337': '1124', '235': '235', '22751': '18649', '22750': '18649', '236': '236', '22752': '18649', '22755': '18649', '231': '231', '232': '232', '22756': '18649', '1050': '858', '1051': '445', '1052': '858', '237': '237', '230': '230', '233': '233', '2705': '2579', '1692': '1370', '1693': '1500', '2704': '2579', '1754': '1655', '5928': '858', '502': '450', '1579': '1483', '614': '457', '12281': '1772', '4468': '442', '2565': '2558', '1887': '405', '1886': '1500', '1885': '1760', '1438': '445', '1882': '1772', '11048': '1370', '2123': '1370', '80': '80', '1491': '1471', '2082': '1370', '3116': '1772', '3114': '1370', '1288': '1124', '1028': '858', '1470': '1458', '1471': '1471', '1476': '1458', '1475': '1471', '1478': '1471', '1479': '1471', '680': '452', '23200': '23187', '23201': '23187', '2659': '2579', '2711': '2579', '2716': '2579', '1301': '1124', '23206': '23187', '2715': '2579', '2653': '2579', '2652': '2579', '2651': '2579', '2650': '2579', '2657': '2579', '2655': '2579', '873': '871', '23590': '453', '23591': '453', '23593': '453', '498': '450', '499': '436', '135': '135', '134': '134', '494': '450', '495': '450', '218': '218', '497': '450', '490': '450', '491': '450', '492': '450', '493': '450', '24': '24', '2037': '1772', '26': '26', '27': '27', '1836': '1655', '22': '22', '23': '23', '1838': '1655', '1839': '1772', '28': '28', '29': '29', '1370': '1370', '405': '405', '404': '404', '403': '403', '402': '402', '1377': '1370', '451': '451', '1378': '1370', '452': '452', '453': '453', '879': '877', '3': '3', '454': '454', '8298': '8269', '2450': '858', '11274': '8269', '9': '9', '1951': '1772', '456': '456', '2712': '2579', '9701': '858', '23370': '1124', '18969': '18089', '8290': '8269', '18964': '18949', '18962': '18949', '18961': '18949', '371': '364', '370': '364', '372': '372', '821': '442', '820': '442', '1314': '858', '1334': '858', '179': '179', '18665': '18649', '18660': '18649', '18661': '18649', '1483': '1483', '1482': '1471', '1481': '1471', '1480': '1471', '397': '397', '9011': '1772', '1485': '1471', '394': '366', '82': '82', '83': '83', '1489': '1483', '398': '398', '86': '86', '87': '87', '84': '84', '85': '85', '797': '442', '796': '442', '5250': '1500', '1710': '1655', '1716': '1655', '415': '405', '1718': '1655', '799': '442', '7': '7', '1655': '1655', '3214': '1760', '298': '298', '18690': '454', '1133': '1124', '1772': '1772', '1131': '1124', '299': '299', '1137': '1124', '1136': '1124', '1135': '1124', '1134': '1124', '245': '245', '244': '244', '247': '247', '18340': '18089', '241': '241', '3156': '1772', '243': '243', '19309': '1760', '249': '249', '248': '248', '1983': '1772', '1437': '1437', '201': '201', '1430': '1124', '2579': '2579', '2577': '1655', '3213': '1760', '2570': '2558', '519': '450', '518': '450', '1009': '445', '1008': '405', '511': '450', '510': '450', '513': '450', '512': '450', '515': '450', '514': '450', '517': '450', '516': '450', '2594': '2579', '459': '459', '1224': '1124', '2590': '2579', '2591': '2579', '53': '53', '450': '450', '5234': '1471', '2714': '2579', '8058': '1370', '2598': '2579', '1345': '1345', '2453': '1370', '457': '457', '3702': '450', '25228': '465', '8294': '8269', '1870': '1655', '178': '178', '177': '177', '176': '176', '175': '175', '174': '174', '173': '173', '172': '172', '171': '171', '170': '170', '2883': '2883', '3200': '858', '2886': '2883', '3775': '858', '2441': '858', '69': '69', '895': '858', '2888': '2883', '3774': '858', '4463': '442', '1500': '1500', '1501': '1483', '871': '871', '297': '297', '1509': '1500', '6367': '1772', '2626': '2579', '2625': '1760', '2628': '2579', '2629': '2579', '1919': '1500', '1911': '1772', '1910': '1772', '1913': '1772', '1912': '1772', '1915': '1500', '1914': '1772', '23237': '23233', '11': '11', '10': '10', '3086': '1370', '15': '15', '14': '14', '16': '16', '19': '19', '18': '18', '25214': '8269', '862': '858', '865': '858', '5712': '1772', '7568': '858', '866': '858', '18949': '18949', '2699': '2579', '2698': '2579', '2697': '2579', '2694': '2579', '883': '858', '882': '877', '881': '877', '880': '880', '887': '457', '886': '858', '885': '858', '884': '858', '889': '457', '888': '858', '3908': '442', '1972': '1370', '1607': '1483', '1970': '1772', '1011': '445', '11181': '858', '496': '450', '18685': '454', '3234': '1760', '1616': '1500', '1617': '1471', '1614': '1471', '1967': '1772', '1613': '1370', '322': '322', '323': '323', '320': '320', '321': '321', '326': '326', '327': '327', '324': '324', '325': '325', '433': '433', '328': '328', '329': '329', '18655': '18649', '18654': '18649', '18657': '18649', '18656': '18649', '205': '205', '204': '204', '207': '207', '772': '405', '209': '209', '208': '208', '18659': '18649', '18658': '18649', '1340': '858', '77': '77', '3354': '436', '75': '75', '74': '74', '73': '73', '72': '72', '71': '71', '70': '70', '79': '79', '78': '78', '2': '2', '23239': '23233', '20067': '1500', '1040': '858', '1047': '858', '1043': '858', '1045': '858', '1044': '858', '1048': '858', '2235': '1760', '12764': '1760', '3575': '442', '1768': '1760', '1769': '1760', '4122': '442', '1760': '1760', '1766': '1760', '1767': '1760', '1765': '1760', '216': '216', '1268': '1268', '2713': '2579', '1267': '858', '2710': '2579', '13400': '1655', '2096': '1760', '2090': '1772', '2093': '1471', '3170': '858', '4470': '442', '3656': '450', '23233': '23233', '8753': '8269', '2717': '2579', '2524': '1500', '1542': '1458', '2520': '1500', '2486': '1760', '2487': '1760', '2484': '1760', '2485': '1760', '2483': '1760', '1548': '1458', '1549': '1458', '4494': '442', '1469': '1458', '368': '364', '1465': '1458', '8': '8', '1467': '1458', '1466': '1458', '1461': '1458', '2718': '2579', '1463': '1458', '23604': '1760', '869': '858', '1315': '1124', '2719': '2579', '2709': '2579', '2461': '1772', '5148': '1471', '1024': '858', '5146': '1471', '18097': '18089', '2707': '2579', '2706': '2579', '2702': '2579', '1014': '445', '12': '12', '8272': '8269', '18095': '18089', '1015': '445', '13927': '1370', '219': '219', '25219': '25219', '25218': '858', '4230': '436', '777': '405', '5740': '5740', '25181': '25181', '1023': '858', '1825': '1760', '1010': '445', '1827': '1760', '1821': '1500', '1822': '1500', '414': '405', '2069': '1471', '416': '405', '410': '406', '1389': '1370', '412': '406', '413': '406', '1384': '1370', '1385': '1124', '1386': '1370', '361': '361', '1184': '1124', '1382': '1370', '1383': '1370', '319': '319', '318': '318', '18693': '454', '313': '313', '312': '312', '311': '311', '310': '310', '317': '317', '316': '316', '315': '315', '314': '314', '1921': '1772', '1922': '1772', '448': '448', '867': '858', '369': '364', '24678': '24678', '20693': '18089', '784': '784', '808': '442', '2666': '2579', '2667': '2579', '2589': '2579', '2665': '2579', '2662': '2579', '2663': '2579', '2660': '2579', '2661': '2579', '366': '366', '364': '364', '362': '362', '363': '363', '360': '360', '2669': '2579', '440': '440', '12042': '8269', '2664': '2579', '1331': '858', '22782': '1124', '97': '97', '380': '364', '381': '364', '406': '406', '5133': '445', '528': '450', '20': '20', '444': '444', '9009': '1370', '1770': '1760', '4758': '1483', '4759': '1483', '1647': '1483', '5248': '1471', '1725': '1655', '5242': '1471', '5979': '1370', '3610': '437', '1072': '858', '8281': '8269', '1042': '858', '60': '60', '775': '405', '4631': '1483', '259': '259', '64': '64', '65': '65', '66': '66', '67': '67', '252': '252', '253': '253', '250': '250', '251': '251', '256': '256', '257': '257', '254': '254', '255': '255', '2568': '2558', '24358': '1124', '1426': '1124', '1429': '858', '2560': '2558', '1580': '1483', '2562': '2558', '24357': '1124', '24356': '1124', '24355': '1124', '2566': '2558', '1038': '858', '18958': '18949', '508': '450', '509': '450', '506': '450', '507': '450', '504': '450', '505': '450', '23245': '23233', '503': '450', '500': '450', '2001': '1772', '2586': '1655', '1359': '1345', '2584': '2579', '469': '465', '468': '465', '785': '785', '465': '465', '464': '451', '467': '465', '466': '466', '461': '461', '1355': '1345', '1354': '1345', '1861': '1655', '901': '436', '168': '168', '169': '169', '280': '280', '164': '164', '165': '165', '166': '166', '167': '167', '160': '160', '161': '161', '162': '162', '163': '163', '8289': '8269', '1457': '858', '2898': '2883', '864': '858', '2895': '2883', '2894': '2883', '2897': '2883', '2891': '2883', '2890': '2883', '2893': '2883', '2892': '2883', '1454': '858', '529': '450', '2108': '1760', '1519': '1500', '1518': '1500', '32': '32', '2103': '1370', '1514': '1500', '2516': '1471', '286': '286', '1458': '1458', '2106': '1370', '1513': '1500', '2104': '1760', '10168': '8269', '2634': '2579', '8278': '8269', '2631': '2579', '2630': '2579', '2633': '2579', '1097': '858', '23187': '23187', '18765': '858', '1810': '1471', '1811': '1471', '878': '877', '1813': '1471', '876': '871', '877': '877', '874': '871', '875': '871', '872': '872', '6410': '858', '870': '858', '441': '441', '7777': '1655', '7776': '1655', '7775': '1655', '7773': '1655', '10769': '8269', '18764': '858', '890': '457', '891': '858', '892': '858', '893': '858', '894': '858', '438': '438', '896': '858', '897': '436', '899': '858', '439': '439', '3186': '858', '436': '436', '9768': '8269', '63': '63', '1609': '1471', '435': '435', '4155': '442', '18089': '18089', '4158': '442', '25094': '25094', '3220': '1760', '3223': '1760', '3222': '1760', '356': '356', '355': '355', '354': '354', '52': '52', '430': '430', '803': '803', '908': '436', '801': '442', '431': '431', '807': '442', '1788': '1772', '18099': '18089', '18098': '18089', '212': '212', '213': '213', '211': '211', '18093': '18089', '1781': '1772', '18763': '858', '1783': '1772', '1784': '1772', '18096': '18089', '1786': '1772', '18649': '18649', '463': '463', '3329': '1370', '1033': '858', '338': '338', '1775': '1760', '76': '76', '1776': '1772', '1771': '1760', '4702': '1483', '1078': '858', '1079': '1079', '1076': '858', '1077': '858', '1074': '858', '1075': '858', '1779': '1772', '1073': '858', '484': '450', '1071': '858', '289': '289', '288': '288', '3750': '858', '281': '281', '1675': '1655', '283': '283', '282': '282', '285': '285', '284': '284', '287': '287', '1673': '1655', '1094': '858', '1096': '858', '336': '336', '2498': '1772', '330': '330', '263': '263', '262': '262', '261': '261', '260': '260', '267': '267', '266': '266', '265': '265', '264': '264', '59': '59', '269': '269', '268': '268', '18368': '18089', '58': '58', '2550': '1655', '1550': '1393', '2552': '1655', '1552': '1124', '2554': '1655', '1554': '1124', '61': '61', '1559': '1483', '54': '54', '57': '57', '56': '56', '2495': '1772', '2494': '1772', '2497': '1772', '2496': '1772', '2558': '2558', '535': '450', '24912': '24912', '533': '450', '532': '450', '531': '450', '530': '450', '24918': '24918', '1412': '1393', '1415': '858', '539': '466', '538': '461', '1322': '1124', '1323': '1124', '2475': '1760', '2473': '1760', '1327': '1124', '200': '200', '5151': '1458', '5152': '1471', '203': '203', '50': '50', '68': '68', '776': '405', '111': '111', '110': '110', '1907': '1772', '771': '405', '5': '5', '9356': '8269', '1858': '1760', '1859': '1500', '25194': '25194', '5134': '445', '536': '450', '1850': '1500', '16865': '1370', '1852': '1500', '1853': '1500', '1854': '1500', '1857': '1772', '1524': '1500', '534': '450', '1398': '858', '2073': '1471', '2072': '1471', '2071': '1471', '2070': '1471', '1393': '1393', '1392': '1370', '427': '427', '426': '426', '308': '308', '309': '309', '2607': '1655', '2600': '1655', '2602': '2579', '300': '300', '301': '301', '302': '302', '19192': '1370', '304': '304', '2609': '2579', '306': '306', '778': '405', '23253': '23253', '1035': '858', '4114': '436', '4112': '436', '4113': '436', '22382': '22382', '458': '458', '847': '439', '3343': '435', '3462': '442', '296': '296', '55': '55', '18869': '1772', '849': '439', '848': '439', '2671': '2579', '2670': '1760', '2672': '2579', '1428': '858', '24767': '24767', '1581': '405', '7100': '858', '20230': '18649', '62': '62', '81': '81', '487': '450', '240': '240', '258': '258', '2567': '2558', '23400': '23400', '23401': '1124', '1585': '858', '485': '450', '1986': '1760', '1738': '1345', '3216': '1760', '3217': '1760', '1982': '1370', '3211': '1760', '18697': '18649', '1637': '1500', '5232': '1500', '3218': '1760', '3219': '1760', '1737': '1655', '482': '435', '1039': '858', '480': '480', '1046': '858', '3602': '450', '2811': '858', '3604': '437', '1036': '858', '3608': '437', '1041': '858', '242': '242', '2183': '1760', '229': '229', '228': '228', '227': '227', '226': '226', '225': '225', '224': '224', '223': '223', '222': '222', '221': '221', '220': '220', '1025': '858', '393': '393', '1027': '858', '1026': '858', '1021': '445', '2272': '858', '8269': '8269', '1333': '858', '5425': '445', '1187': '1124', '17951': '1760', '5426': '445', '1182': '1124', '3372': '436', '1037': '858', '89': '89', '1034': '858', '1746': '1483', '501': '450', '396': '366', '605': '605', '8172': '858', '2438': '1370', '155': '155', '395': '366', '157': '157', '156': '156', '159': '159', '158': '158', '2585': '1655', '2435': '858', '1898': '1760', '1899': '1500', '8279': '8269', '15349': '8269', '8277': '8269', '8276': '8269', '8275': '8269', '3733': '858', '399': '399', '1892': '1655', '2136': '1772', '2135': '1370', '2132': '1772', '48': '48', '2131': '1370', '46': '46', '47': '47', '44': '44', '45': '45', '42': '42', '40': '40', '41': '41', '1682': '1483', '1443': '1370', '1442': '1370', '1012': '445', '3201': '858', '1449': '858', '477': '450', '2727': '2579', '2649': '2579', '2725': '2579', '5164': '1471', '5165': '1500', '2720': '2579', '2640': '2579', '606': '606', '475': '437', '486': '463', '23198': '23187', '8060': '1772', '488': '450', '23194': '23187', '23195': '23187', '23196': '23187', '23197': '23187', '483': '463', '23191': '23187', '23589': '453', '11310': '1655', '1800': '1483', '3789': '450', '1809': '1471', '1364': '1345', '1365': '1345', '1363': '1345', '1360': '1345', '1851': '1500', '479': '450', '1368': '1345', '3198': '2579'} \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_extracted_threads b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_extracted_threads
new file mode 100644
index 0000000..b649fbf
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_extracted_threads
@@ -0,0 +1 @@
+{1: '/init', 2: 'kthreadd', 3: 'ksoftirqd/0', 7: 'kworker/u:0H', 8: 'migration/0', 13: 'khelper', 14: 'netns'}
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_fixed_tgids b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_fixed_tgids
new file mode 100644
index 0000000..92456d5
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_fixed_tgids
@@ -0,0 +1,127 @@
+# tracer: nop
+#
+# entries-in-buffer/entries-written: 116/116 #P:1
+#
+# _-----=> irqs-off
+# / _----=> need-resched
+# | / _---=> hardirq/softirq
+# || / _--=> preempt-depth
+# ||| / delay
+# TASK-PID CPU# |||| TIMESTAMP FUNCTION
+# | | | |||| | |
+ atrace-14446 (-----) [000] ...2 1212.465062: sched_switch: prev_comm=atrace prev_pid=14446 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d..4 1212.465074: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.465082: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ksoftirqd/0-3 ( 3) [000] ...2 1212.465092: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d..4 1212.465102: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.465126: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ksoftirqd/0-3 ( 3) [000] ...2 1212.465132: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d..4 1212.465139: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.465145: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ksoftirqd/0-3 ( 3) [000] ...2 1212.465227: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d.h5 1212.465297: sched_wakeup: comm=adbd pid=212 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.465306: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=adbd next_pid=212 next_prio=120
+adbd-212 ( 212) [000] d..4 1212.465329: sched_wakeup: comm=adbd pid=209 prio=120 success=1 target_cpu=000
+adbd-212 ( 212) [000] ...2 1212.465348: sched_switch: prev_comm=adbd prev_pid=212 prev_prio=120 prev_state=S ==> next_comm=adbd next_pid=209 next_prio=120
+adbd-209 ( 209) [000] d..4 1212.465395: sched_wakeup: comm=adbd pid=211 prio=120 success=1 target_cpu=000
+adbd-209 ( 209) [000] ...2 1212.465441: sched_switch: prev_comm=adbd prev_pid=209 prev_prio=120 prev_state=S ==> next_comm=adbd next_pid=211 next_prio=120
+adbd-211 ( 211) [000] ...2 1212.465448: sched_switch: prev_comm=adbd prev_pid=211 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d.h5 1212.574554: sched_wakeup: comm=sensors.qcom pid=292 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.574566: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=sensors.qcom next_pid=292 next_prio=120
+ sensors.qcom-292 (-----) [000] ...2 1212.574665: sched_switch: prev_comm=sensors.qcom prev_pid=292 prev_prio=120 prev_state=S ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
+ sensors.qcom-14447 (-----) [000] d..4 1212.574797: sched_wakeup: comm=sensors.qcom pid=1593 prio=120 success=1 target_cpu=000
+ sensors.qcom-14447 (-----) [000] ...2 1212.574802: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=R+ ==> next_comm=sensors.qcom next_pid=1593 next_prio=120
+ sensors.qcom-1593 (-----) [000] ...2 1212.574819: sched_switch: prev_comm=sensors.qcom prev_pid=1593 prev_prio=120 prev_state=D ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
+ sensors.qcom-14447 (-----) [000] d..3 1212.574823: sched_wakeup: comm=sensors.qcom pid=1593 prio=120 success=1 target_cpu=000
+ sensors.qcom-14447 (-----) [000] ...2 1212.574827: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=R+ ==> next_comm=sensors.qcom next_pid=1593 next_prio=120
+ sensors.qcom-1593 (-----) [000] d..4 1212.574865: sched_wakeup: comm=sensors.qcom pid=760 prio=120 success=1 target_cpu=000
+ sensors.qcom-1593 (-----) [000] ...2 1212.574876: sched_switch: prev_comm=sensors.qcom prev_pid=1593 prev_prio=120 prev_state=S ==> next_comm=sensors.qcom next_pid=760 next_prio=120
+ sensors.qcom-760 (-----) [000] d..4 1212.574905: sched_wakeup: comm=system_server pid=782 prio=118 success=1 target_cpu=000
+ sensors.qcom-760 (-----) [000] ...2 1212.574917: sched_switch: prev_comm=sensors.qcom prev_pid=760 prev_prio=120 prev_state=S ==> next_comm=system_server next_pid=782 next_prio=118
+ system_server-782 (-----) [000] d..4 1212.574981: sched_wakeup: comm=system_server pid=785 prio=118 success=1 target_cpu=000
+ system_server-782 (-----) [000] ...2 1212.575009: sched_switch: prev_comm=system_server prev_pid=782 prev_prio=118 prev_state=S ==> next_comm=system_server next_pid=785 next_prio=118
+system_server-785 ( 785) [000] ...2 1212.575045: sched_switch: prev_comm=system_server prev_pid=785 prev_prio=118 prev_state=S ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
+ sensors.qcom-14447 (-----) [000] ...3 1212.575143: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=x ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d..4 1212.575153: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.575159: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ksoftirqd/0-3 ( 3) [000] ...2 1212.575167: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d..4 1212.575175: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.575181: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ksoftirqd/0-3 ( 3) [000] ...2 1212.575188: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d..4 1212.575195: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.575201: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ksoftirqd/0-3 ( 3) [000] ...2 1212.575211: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d.h4 1212.649601: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.649614: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
+ MMHandlerThread-7231 (-----) [000] ...2 1212.649630: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d.h6 1212.729539: sched_wakeup: comm=kworker/u:1 pid=21 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] dNs6 1212.729550: sched_wakeup: comm=kworker/0:2H pid=557 prio=100 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.729563: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:1 next_pid=21 next_prio=120
+ kworker/u:1-21 (-----) [000] d..5 1212.729571: sched_wakeup: comm=mpdecision pid=2046 prio=113 success=1 target_cpu=000
+ kworker/u:1-21 (-----) [000] ...2 1212.729578: sched_switch: prev_comm=kworker/u:1 prev_pid=21 prev_prio=120 prev_state=S ==> next_comm=kworker/0:2H next_pid=557 next_prio=100
+ kworker/0:2H-557 (-----) [000] d..4 1212.729597: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
+ kworker/0:2H-557 (-----) [000] ...2 1212.729600: sched_switch: prev_comm=kworker/0:2H prev_pid=557 prev_prio=100 prev_state=D ==> next_comm=mpdecision next_pid=2046 next_prio=113
+ mpdecision-2046 (-----) [000] ...2 1212.729801: sched_switch: prev_comm=mpdecision prev_pid=2046 prev_prio=113 prev_state=S ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
+ kworker/0:1H-17 (-----) [000] ...2 1212.730104: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d..4 1212.730134: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.730154: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ksoftirqd/0-3 ( 3) [000] ...2 1212.730176: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d..4 1212.730201: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.730220: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ksoftirqd/0-3 ( 3) [000] ...2 1212.730241: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d..4 1212.730262: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.730280: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ksoftirqd/0-3 ( 3) [000] ...2 1212.730303: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d.h6 1212.730638: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.730669: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
+kworker/u:0H-7 ( 7) [000] d..6 1212.730707: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
+kworker/u:0H-7 ( 7) [000] ...2 1212.730728: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
+ kworker/0:1H-17 (-----) [000] ...2 1212.730916: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d.h6 1212.731632: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.731661: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
+kworker/u:0H-7 ( 7) [000] d..6 1212.731702: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
+kworker/u:0H-7 ( 7) [000] ...2 1212.731722: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
+ kworker/0:1H-17 (-----) [000] ...2 1212.731832: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d.h6 1212.732685: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.732714: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
+kworker/u:0H-7 ( 7) [000] d..6 1212.732747: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
+kworker/u:0H-7 ( 7) [000] ...2 1212.732767: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
+ kworker/0:1H-17 (-----) [000] d..4 1212.732810: sched_wakeup: comm=kworker/0:2H pid=557 prio=100 success=1 target_cpu=000
+ kworker/0:1H-17 (-----) [000] ...2 1212.732829: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=S ==> next_comm=kworker/0:2H next_pid=557 next_prio=100
+ kworker/0:2H-557 (-----) [000] ...2 1212.732854: sched_switch: prev_comm=kworker/0:2H prev_pid=557 prev_prio=100 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d.h4 1212.876266: sched_wakeup: comm=RILSender0 pid=1365 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] dNh4 1212.876284: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.876316: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=RILSender0 next_pid=1365 next_prio=120
+RILSender0-1365 ( 1345) [000] ...2 1212.876415: sched_switch: prev_comm=RILSender0 prev_pid=1365 prev_prio=120 prev_state=S ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
+ MMHandlerThread-7231 (-----) [000] ...2 1212.876454: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d.h4 1213.089569: sched_wakeup: comm=Thread-625 pid=5750 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] dNh4 1213.089587: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1213.089622: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=Thread-625 next_pid=5750 next_prio=120
+ Thread-625-5750 (-----) [000] ...2 1213.089842: sched_switch: prev_comm=Thread-625 prev_pid=5750 prev_prio=120 prev_state=S ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
+ MMHandlerThread-7231 (-----) [000] ...2 1213.089879: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d.h4 1213.327439: sched_wakeup: comm=pandora.android pid=5395 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] dNh4 1213.327455: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1213.327487: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
+ MMHandlerThread-7231 (-----) [000] ...2 1213.327518: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=pandora.android next_pid=5395 next_prio=120
+ pandora.android-5395 (-----) [000] d..4 1213.327718: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
+ pandora.android-5395 (-----) [000] ...2 1213.327739: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=R+ ==> next_comm=Binder_1 next_pid=780 next_prio=120
+ Binder_1-780 (-----) [000] ...2 1213.327763: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=D ==> next_comm=pandora.android next_pid=5395 next_prio=120
+ pandora.android-5395 (-----) [000] d..3 1213.327781: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
+ pandora.android-5395 (-----) [000] ...2 1213.327795: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=R+ ==> next_comm=Binder_1 next_pid=780 next_prio=120
+ Binder_1-780 (-----) [000] d..4 1213.328056: sched_wakeup: comm=Binder_1 pid=878 prio=120 success=1 target_cpu=000
+ Binder_1-780 (-----) [000] ...2 1213.328095: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=S ==> next_comm=Binder_1 next_pid=878 next_prio=120
+Binder_1-878 ( 877) [000] d..4 1213.328263: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
+Binder_1-878 ( 877) [000] ...2 1213.328345: sched_switch: prev_comm=Binder_1 prev_pid=878 prev_prio=120 prev_state=S ==> next_comm=Binder_1 next_pid=780 next_prio=120
+ Binder_1-780 (-----) [000] ...2 1213.328558: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=S ==> next_comm=pandora.android next_pid=5395 next_prio=120
+ pandora.android-5395 (-----) [000] ...2 1213.328743: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d..4 1213.328773: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1213.328793: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ksoftirqd/0-3 ( 3) [000] ...2 1213.328821: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d..4 1213.328846: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1213.328866: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ksoftirqd/0-3 ( 3) [000] ...2 1213.328891: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d..4 1213.328913: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1213.328931: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ksoftirqd/0-3 ( 3) [000] ...2 1213.328964: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d.h4 1213.465138: sched_wakeup: comm=atrace pid=14446 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1213.465171: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=atrace next_pid=14446 next_prio=120
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_missing_tgids b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_missing_tgids
new file mode 100644
index 0000000..c662482
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_missing_tgids
@@ -0,0 +1,127 @@
+# tracer: nop
+#
+# entries-in-buffer/entries-written: 116/116 #P:1
+#
+# _-----=> irqs-off
+# / _----=> need-resched
+# | / _---=> hardirq/softirq
+# || / _--=> preempt-depth
+# ||| / delay
+# TASK-PID CPU# |||| TIMESTAMP FUNCTION
+# | | | |||| | |
+ atrace-14446 (-----) [000] ...2 1212.465062: sched_switch: prev_comm=atrace prev_pid=14446 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d..4 1212.465074: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.465082: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 (-----) [000] ...2 1212.465092: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d..4 1212.465102: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.465126: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 (-----) [000] ...2 1212.465132: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d..4 1212.465139: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.465145: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 (-----) [000] ...2 1212.465227: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d.h5 1212.465297: sched_wakeup: comm=adbd pid=212 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.465306: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=adbd next_pid=212 next_prio=120
+ adbd-212 (-----) [000] d..4 1212.465329: sched_wakeup: comm=adbd pid=209 prio=120 success=1 target_cpu=000
+ adbd-212 (-----) [000] ...2 1212.465348: sched_switch: prev_comm=adbd prev_pid=212 prev_prio=120 prev_state=S ==> next_comm=adbd next_pid=209 next_prio=120
+ adbd-209 (-----) [000] d..4 1212.465395: sched_wakeup: comm=adbd pid=211 prio=120 success=1 target_cpu=000
+ adbd-209 (-----) [000] ...2 1212.465441: sched_switch: prev_comm=adbd prev_pid=209 prev_prio=120 prev_state=S ==> next_comm=adbd next_pid=211 next_prio=120
+ adbd-211 (-----) [000] ...2 1212.465448: sched_switch: prev_comm=adbd prev_pid=211 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d.h5 1212.574554: sched_wakeup: comm=sensors.qcom pid=292 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.574566: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=sensors.qcom next_pid=292 next_prio=120
+ sensors.qcom-292 (-----) [000] ...2 1212.574665: sched_switch: prev_comm=sensors.qcom prev_pid=292 prev_prio=120 prev_state=S ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
+ sensors.qcom-14447 (-----) [000] d..4 1212.574797: sched_wakeup: comm=sensors.qcom pid=1593 prio=120 success=1 target_cpu=000
+ sensors.qcom-14447 (-----) [000] ...2 1212.574802: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=R+ ==> next_comm=sensors.qcom next_pid=1593 next_prio=120
+ sensors.qcom-1593 (-----) [000] ...2 1212.574819: sched_switch: prev_comm=sensors.qcom prev_pid=1593 prev_prio=120 prev_state=D ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
+ sensors.qcom-14447 (-----) [000] d..3 1212.574823: sched_wakeup: comm=sensors.qcom pid=1593 prio=120 success=1 target_cpu=000
+ sensors.qcom-14447 (-----) [000] ...2 1212.574827: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=R+ ==> next_comm=sensors.qcom next_pid=1593 next_prio=120
+ sensors.qcom-1593 (-----) [000] d..4 1212.574865: sched_wakeup: comm=sensors.qcom pid=760 prio=120 success=1 target_cpu=000
+ sensors.qcom-1593 (-----) [000] ...2 1212.574876: sched_switch: prev_comm=sensors.qcom prev_pid=1593 prev_prio=120 prev_state=S ==> next_comm=sensors.qcom next_pid=760 next_prio=120
+ sensors.qcom-760 (-----) [000] d..4 1212.574905: sched_wakeup: comm=system_server pid=782 prio=118 success=1 target_cpu=000
+ sensors.qcom-760 (-----) [000] ...2 1212.574917: sched_switch: prev_comm=sensors.qcom prev_pid=760 prev_prio=120 prev_state=S ==> next_comm=system_server next_pid=782 next_prio=118
+ system_server-782 (-----) [000] d..4 1212.574981: sched_wakeup: comm=system_server pid=785 prio=118 success=1 target_cpu=000
+ system_server-782 (-----) [000] ...2 1212.575009: sched_switch: prev_comm=system_server prev_pid=782 prev_prio=118 prev_state=S ==> next_comm=system_server next_pid=785 next_prio=118
+ system_server-785 (-----) [000] ...2 1212.575045: sched_switch: prev_comm=system_server prev_pid=785 prev_prio=118 prev_state=S ==> next_comm=sensors.qcom next_pid=14447 next_prio=120
+ sensors.qcom-14447 (-----) [000] ...3 1212.575143: sched_switch: prev_comm=sensors.qcom prev_pid=14447 prev_prio=120 prev_state=x ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d..4 1212.575153: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.575159: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 (-----) [000] ...2 1212.575167: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d..4 1212.575175: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.575181: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 (-----) [000] ...2 1212.575188: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d..4 1212.575195: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.575201: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 (-----) [000] ...2 1212.575211: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d.h4 1212.649601: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.649614: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
+ MMHandlerThread-7231 (-----) [000] ...2 1212.649630: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d.h6 1212.729539: sched_wakeup: comm=kworker/u:1 pid=21 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] dNs6 1212.729550: sched_wakeup: comm=kworker/0:2H pid=557 prio=100 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.729563: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:1 next_pid=21 next_prio=120
+ kworker/u:1-21 (-----) [000] d..5 1212.729571: sched_wakeup: comm=mpdecision pid=2046 prio=113 success=1 target_cpu=000
+ kworker/u:1-21 (-----) [000] ...2 1212.729578: sched_switch: prev_comm=kworker/u:1 prev_pid=21 prev_prio=120 prev_state=S ==> next_comm=kworker/0:2H next_pid=557 next_prio=100
+ kworker/0:2H-557 (-----) [000] d..4 1212.729597: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
+ kworker/0:2H-557 (-----) [000] ...2 1212.729600: sched_switch: prev_comm=kworker/0:2H prev_pid=557 prev_prio=100 prev_state=D ==> next_comm=mpdecision next_pid=2046 next_prio=113
+ mpdecision-2046 (-----) [000] ...2 1212.729801: sched_switch: prev_comm=mpdecision prev_pid=2046 prev_prio=113 prev_state=S ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
+ kworker/0:1H-17 (-----) [000] ...2 1212.730104: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d..4 1212.730134: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.730154: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 (-----) [000] ...2 1212.730176: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d..4 1212.730201: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.730220: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 (-----) [000] ...2 1212.730241: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d..4 1212.730262: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.730280: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 (-----) [000] ...2 1212.730303: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d.h6 1212.730638: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.730669: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
+ kworker/u:0H-7 (-----) [000] d..6 1212.730707: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
+ kworker/u:0H-7 (-----) [000] ...2 1212.730728: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
+ kworker/0:1H-17 (-----) [000] ...2 1212.730916: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d.h6 1212.731632: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.731661: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
+ kworker/u:0H-7 (-----) [000] d..6 1212.731702: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
+ kworker/u:0H-7 (-----) [000] ...2 1212.731722: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
+ kworker/0:1H-17 (-----) [000] ...2 1212.731832: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=D ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d.h6 1212.732685: sched_wakeup: comm=kworker/u:0H pid=7 prio=100 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.732714: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=kworker/u:0H next_pid=7 next_prio=100
+ kworker/u:0H-7 (-----) [000] d..6 1212.732747: sched_wakeup: comm=kworker/0:1H pid=17 prio=100 success=1 target_cpu=000
+ kworker/u:0H-7 (-----) [000] ...2 1212.732767: sched_switch: prev_comm=kworker/u:0H prev_pid=7 prev_prio=100 prev_state=D ==> next_comm=kworker/0:1H next_pid=17 next_prio=100
+ kworker/0:1H-17 (-----) [000] d..4 1212.732810: sched_wakeup: comm=kworker/0:2H pid=557 prio=100 success=1 target_cpu=000
+ kworker/0:1H-17 (-----) [000] ...2 1212.732829: sched_switch: prev_comm=kworker/0:1H prev_pid=17 prev_prio=100 prev_state=S ==> next_comm=kworker/0:2H next_pid=557 next_prio=100
+ kworker/0:2H-557 (-----) [000] ...2 1212.732854: sched_switch: prev_comm=kworker/0:2H prev_pid=557 prev_prio=100 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d.h4 1212.876266: sched_wakeup: comm=RILSender0 pid=1365 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] dNh4 1212.876284: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1212.876316: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=RILSender0 next_pid=1365 next_prio=120
+ RILSender0-1365 (-----) [000] ...2 1212.876415: sched_switch: prev_comm=RILSender0 prev_pid=1365 prev_prio=120 prev_state=S ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
+ MMHandlerThread-7231 (-----) [000] ...2 1212.876454: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d.h4 1213.089569: sched_wakeup: comm=Thread-625 pid=5750 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] dNh4 1213.089587: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1213.089622: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=Thread-625 next_pid=5750 next_prio=120
+ Thread-625-5750 (-----) [000] ...2 1213.089842: sched_switch: prev_comm=Thread-625 prev_pid=5750 prev_prio=120 prev_state=S ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
+ MMHandlerThread-7231 (-----) [000] ...2 1213.089879: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d.h4 1213.327439: sched_wakeup: comm=pandora.android pid=5395 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] dNh4 1213.327455: sched_wakeup: comm=MMHandlerThread pid=7231 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1213.327487: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=MMHandlerThread next_pid=7231 next_prio=120
+ MMHandlerThread-7231 (-----) [000] ...2 1213.327518: sched_switch: prev_comm=MMHandlerThread prev_pid=7231 prev_prio=120 prev_state=S ==> next_comm=pandora.android next_pid=5395 next_prio=120
+ pandora.android-5395 (-----) [000] d..4 1213.327718: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
+ pandora.android-5395 (-----) [000] ...2 1213.327739: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=R+ ==> next_comm=Binder_1 next_pid=780 next_prio=120
+ Binder_1-780 (-----) [000] ...2 1213.327763: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=D ==> next_comm=pandora.android next_pid=5395 next_prio=120
+ pandora.android-5395 (-----) [000] d..3 1213.327781: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
+ pandora.android-5395 (-----) [000] ...2 1213.327795: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=R+ ==> next_comm=Binder_1 next_pid=780 next_prio=120
+ Binder_1-780 (-----) [000] d..4 1213.328056: sched_wakeup: comm=Binder_1 pid=878 prio=120 success=1 target_cpu=000
+ Binder_1-780 (-----) [000] ...2 1213.328095: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=S ==> next_comm=Binder_1 next_pid=878 next_prio=120
+ Binder_1-878 (-----) [000] d..4 1213.328263: sched_wakeup: comm=Binder_1 pid=780 prio=120 success=1 target_cpu=000
+ Binder_1-878 (-----) [000] ...2 1213.328345: sched_switch: prev_comm=Binder_1 prev_pid=878 prev_prio=120 prev_state=S ==> next_comm=Binder_1 next_pid=780 next_prio=120
+ Binder_1-780 (-----) [000] ...2 1213.328558: sched_switch: prev_comm=Binder_1 prev_pid=780 prev_prio=120 prev_state=S ==> next_comm=pandora.android next_pid=5395 next_prio=120
+ pandora.android-5395 (-----) [000] ...2 1213.328743: sched_switch: prev_comm=pandora.android prev_pid=5395 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d..4 1213.328773: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1213.328793: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 (-----) [000] ...2 1213.328821: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d..4 1213.328846: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1213.328866: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 (-----) [000] ...2 1213.328891: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d..4 1213.328913: sched_wakeup: comm=ksoftirqd/0 pid=3 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1213.328931: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=ksoftirqd/0 next_pid=3 next_prio=120
+ ksoftirqd/0-3 (-----) [000] ...2 1213.328964: sched_switch: prev_comm=ksoftirqd/0 prev_pid=3 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120
+ <idle>-0 (-----) [000] d.h4 1213.465138: sched_wakeup: comm=atrace pid=14446 prio=120 success=1 target_cpu=000
+ <idle>-0 (-----) [000] ...2 1213.465171: sched_switch: prev_comm=swapper/0 prev_pid=0 prev_prio=120 prev_state=R ==> next_comm=atrace next_pid=14446 next_prio=120
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_procfs_dump b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_procfs_dump
new file mode 100644
index 0000000..f1f0c76
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/atrace_procfs_dump
@@ -0,0 +1,1156 @@
+proc/1/task/1
+/proc/10/task/10
+/proc/100/task/100
+/proc/101/task/101
+/proc/102/task/102
+/proc/103/task/103
+/proc/104/task/104
+/proc/105/task/105
+/proc/106/task/106
+/proc/1068/task/1068
+/proc/107/task/107
+/proc/1079/task/1079
+/proc/1079/task/1080
+/proc/1079/task/1081
+/proc/108/task/108
+/proc/109/task/109
+/proc/11/task/11
+/proc/110/task/110
+/proc/111/task/111
+/proc/1124/task/1124
+/proc/1124/task/1127
+/proc/1124/task/1129
+/proc/1124/task/1131
+/proc/1124/task/1133
+/proc/1124/task/1134
+/proc/1124/task/1135
+/proc/1124/task/1136
+/proc/1124/task/1137
+/proc/1124/task/1182
+/proc/1124/task/1184
+/proc/1124/task/1187
+/proc/1124/task/1224
+/proc/1124/task/1232
+/proc/1124/task/1288
+/proc/1124/task/1301
+/proc/1124/task/1315
+/proc/1124/task/1322
+/proc/1124/task/1323
+/proc/1124/task/1327
+/proc/1124/task/1385
+/proc/1124/task/1426
+/proc/1124/task/1430
+/proc/1124/task/1552
+/proc/1124/task/1554
+/proc/1124/task/22782
+/proc/1124/task/23370
+/proc/1124/task/23398
+/proc/1124/task/23401
+/proc/1124/task/24337
+/proc/1124/task/24355
+/proc/1124/task/24356
+/proc/1124/task/24357
+/proc/1124/task/24358
+/proc/12/task/12
+/proc/1268/task/1268
+/proc/134/task/134
+/proc/1345/task/1345
+/proc/1345/task/1354
+/proc/1345/task/1355
+/proc/1345/task/1359
+/proc/1345/task/1360
+/proc/1345/task/1363
+/proc/1345/task/1364
+/proc/1345/task/1365
+/proc/1345/task/1368
+/proc/1345/task/1738
+/proc/135/task/135
+/proc/1370/task/11048
+/proc/1370/task/1370
+/proc/1370/task/1377
+/proc/1370/task/1378
+/proc/1370/task/1382
+/proc/1370/task/1383
+/proc/1370/task/1384
+/proc/1370/task/1386
+/proc/1370/task/1389
+/proc/1370/task/1392
+/proc/1370/task/13927
+/proc/1370/task/1442
+/proc/1370/task/1443
+/proc/1370/task/1613
+/proc/1370/task/16865
+/proc/1370/task/1692
+/proc/1370/task/19187
+/proc/1370/task/19192
+/proc/1370/task/1972
+/proc/1370/task/1982
+/proc/1370/task/2082
+/proc/1370/task/2103
+/proc/1370/task/2106
+/proc/1370/task/2123
+/proc/1370/task/2131
+/proc/1370/task/2135
+/proc/1370/task/2161
+/proc/1370/task/21920
+/proc/1370/task/2438
+/proc/1370/task/2453
+/proc/1370/task/3086
+/proc/1370/task/3114
+/proc/1370/task/3329
+/proc/1370/task/5979
+/proc/1370/task/5980
+/proc/1370/task/6654
+/proc/1370/task/8058
+/proc/1370/task/9009
+/proc/1393/task/1393
+/proc/1393/task/1395
+/proc/1393/task/1397
+/proc/1393/task/1402
+/proc/1393/task/1403
+/proc/1393/task/1405
+/proc/1393/task/1406
+/proc/1393/task/1407
+/proc/1393/task/1412
+/proc/1393/task/1490
+/proc/1393/task/1532
+/proc/1393/task/1533
+/proc/1393/task/1535
+/proc/1393/task/1550
+/proc/14/task/14
+/proc/1437/task/1437
+/proc/1458/task/1458
+/proc/1458/task/1461
+/proc/1458/task/1463
+/proc/1458/task/1465
+/proc/1458/task/1466
+/proc/1458/task/1467
+/proc/1458/task/1469
+/proc/1458/task/1470
+/proc/1458/task/1476
+/proc/1458/task/1539
+/proc/1458/task/1542
+/proc/1458/task/1548
+/proc/1458/task/1549
+/proc/1458/task/5151
+/proc/1471/task/1471
+/proc/1471/task/1475
+/proc/1471/task/1478
+/proc/1471/task/1479
+/proc/1471/task/1480
+/proc/1471/task/1481
+/proc/1471/task/1482
+/proc/1471/task/1485
+/proc/1471/task/1491
+/proc/1471/task/1609
+/proc/1471/task/1614
+/proc/1471/task/1617
+/proc/1471/task/1623
+/proc/1471/task/1809
+/proc/1471/task/1810
+/proc/1471/task/1811
+/proc/1471/task/1813
+/proc/1471/task/2069
+/proc/1471/task/2070
+/proc/1471/task/2071
+/proc/1471/task/2072
+/proc/1471/task/2073
+/proc/1471/task/2093
+/proc/1471/task/2516
+/proc/1471/task/5146
+/proc/1471/task/5148
+/proc/1471/task/5152
+/proc/1471/task/5164
+/proc/1471/task/5234
+/proc/1471/task/5242
+/proc/1471/task/5248
+/proc/1483/task/1483
+/proc/1483/task/1489
+/proc/1483/task/1492
+/proc/1483/task/1493
+/proc/1483/task/1494
+/proc/1483/task/1495
+/proc/1483/task/1497
+/proc/1483/task/1498
+/proc/1483/task/1501
+/proc/1483/task/1559
+/proc/1483/task/1579
+/proc/1483/task/1580
+/proc/1483/task/1607
+/proc/1483/task/1621
+/proc/1483/task/1622
+/proc/1483/task/1624
+/proc/1483/task/1625
+/proc/1483/task/1627
+/proc/1483/task/1628
+/proc/1483/task/1647
+/proc/1483/task/1682
+/proc/1483/task/1746
+/proc/1483/task/1797
+/proc/1483/task/1800
+/proc/1483/task/2912
+/proc/1483/task/2913
+/proc/1483/task/4631
+/proc/1483/task/4702
+/proc/1483/task/4758
+/proc/1483/task/4759
+/proc/15/task/15
+/proc/1500/task/1500
+/proc/1500/task/1509
+/proc/1500/task/1512
+/proc/1500/task/1513
+/proc/1500/task/1514
+/proc/1500/task/1518
+/proc/1500/task/1519
+/proc/1500/task/1524
+/proc/1500/task/1531
+/proc/1500/task/1616
+/proc/1500/task/1637
+/proc/1500/task/1693
+/proc/1500/task/1704
+/proc/1500/task/1821
+/proc/1500/task/1822
+/proc/1500/task/1842
+/proc/1500/task/1847
+/proc/1500/task/1848
+/proc/1500/task/1849
+/proc/1500/task/1850
+/proc/1500/task/1851
+/proc/1500/task/1852
+/proc/1500/task/1853
+/proc/1500/task/1854
+/proc/1500/task/1859
+/proc/1500/task/1886
+/proc/1500/task/1899
+/proc/1500/task/1915
+/proc/1500/task/1919
+/proc/1500/task/20067
+/proc/1500/task/2520
+/proc/1500/task/2524
+/proc/1500/task/5136
+/proc/1500/task/5165
+/proc/1500/task/5181
+/proc/1500/task/5189
+/proc/1500/task/5232
+/proc/1500/task/5250
+/proc/155/task/155
+/proc/156/task/156
+/proc/157/task/157
+/proc/158/task/158
+/proc/159/task/159
+/proc/16/task/16
+/proc/160/task/160
+/proc/161/task/161
+/proc/162/task/162
+/proc/163/task/163
+/proc/164/task/164
+/proc/165/task/165
+/proc/1655/task/11310
+/proc/1655/task/13400
+/proc/1655/task/1655
+/proc/1655/task/1660
+/proc/1655/task/1663
+/proc/1655/task/1666
+/proc/1655/task/1667
+/proc/1655/task/1668
+/proc/1655/task/1669
+/proc/1655/task/1673
+/proc/1655/task/1675
+/proc/1655/task/1710
+/proc/1655/task/1716
+/proc/1655/task/1718
+/proc/1655/task/1725
+/proc/1655/task/1737
+/proc/1655/task/1754
+/proc/1655/task/1836
+/proc/1655/task/1838
+/proc/1655/task/1861
+/proc/1655/task/1870
+/proc/1655/task/1892
+/proc/1655/task/2544
+/proc/1655/task/2548
+/proc/1655/task/2550
+/proc/1655/task/2552
+/proc/1655/task/2554
+/proc/1655/task/2577
+/proc/1655/task/2585
+/proc/1655/task/2586
+/proc/1655/task/2600
+/proc/1655/task/2607
+/proc/1655/task/2615
+/proc/1655/task/7773
+/proc/1655/task/7775
+/proc/1655/task/7776
+/proc/1655/task/7777
+/proc/166/task/166
+/proc/167/task/167
+/proc/168/task/168
+/proc/169/task/169
+/proc/170/task/170
+/proc/171/task/171
+/proc/172/task/172
+/proc/173/task/173
+/proc/174/task/174
+/proc/175/task/175
+/proc/176/task/176
+/proc/1760/task/12764
+/proc/1760/task/14143
+/proc/1760/task/1760
+/proc/1760/task/1765
+/proc/1760/task/1766
+/proc/1760/task/1767
+/proc/1760/task/1768
+/proc/1760/task/1769
+/proc/1760/task/1770
+/proc/1760/task/1771
+/proc/1760/task/1775
+/proc/1760/task/17951
+/proc/1760/task/1825
+/proc/1760/task/1827
+/proc/1760/task/1858
+/proc/1760/task/1885
+/proc/1760/task/1898
+/proc/1760/task/19309
+/proc/1760/task/1986
+/proc/1760/task/2096
+/proc/1760/task/2104
+/proc/1760/task/2108
+/proc/1760/task/2183
+/proc/1760/task/22184
+/proc/1760/task/2235
+/proc/1760/task/23604
+/proc/1760/task/2445
+/proc/1760/task/2473
+/proc/1760/task/2475
+/proc/1760/task/2483
+/proc/1760/task/2484
+/proc/1760/task/2485
+/proc/1760/task/2486
+/proc/1760/task/2487
+/proc/1760/task/2612
+/proc/1760/task/2614
+/proc/1760/task/2625
+/proc/1760/task/2670
+/proc/1760/task/3211
+/proc/1760/task/3213
+/proc/1760/task/3214
+/proc/1760/task/3216
+/proc/1760/task/3217
+/proc/1760/task/3218
+/proc/1760/task/3219
+/proc/1760/task/3220
+/proc/1760/task/3222
+/proc/1760/task/3223
+/proc/1760/task/3234
+/proc/177/task/177
+/proc/1772/task/10458
+/proc/1772/task/12281
+/proc/1772/task/1772
+/proc/1772/task/1776
+/proc/1772/task/1779
+/proc/1772/task/1781
+/proc/1772/task/1783
+/proc/1772/task/1784
+/proc/1772/task/1786
+/proc/1772/task/1788
+/proc/1772/task/1790
+/proc/1772/task/1793
+/proc/1772/task/1839
+/proc/1772/task/1857
+/proc/1772/task/1868
+/proc/1772/task/1882
+/proc/1772/task/18869
+/proc/1772/task/1907
+/proc/1772/task/1910
+/proc/1772/task/1911
+/proc/1772/task/1912
+/proc/1772/task/1913
+/proc/1772/task/1914
+/proc/1772/task/1921
+/proc/1772/task/1922
+/proc/1772/task/1940
+/proc/1772/task/1951
+/proc/1772/task/1967
+/proc/1772/task/1970
+/proc/1772/task/1983
+/proc/1772/task/2001
+/proc/1772/task/2037
+/proc/1772/task/2087
+/proc/1772/task/2090
+/proc/1772/task/2102
+/proc/1772/task/2132
+/proc/1772/task/2136
+/proc/1772/task/2162
+/proc/1772/task/2461
+/proc/1772/task/2494
+/proc/1772/task/2495
+/proc/1772/task/2496
+/proc/1772/task/2497
+/proc/1772/task/2498
+/proc/1772/task/3116
+/proc/1772/task/3156
+/proc/1772/task/5262
+/proc/1772/task/5712
+/proc/1772/task/6367
+/proc/1772/task/8060
+/proc/1772/task/9011
+/proc/178/task/178
+/proc/179/task/179
+/proc/18/task/18
+/proc/18089/task/18089
+/proc/18089/task/18093
+/proc/18089/task/18095
+/proc/18089/task/18096
+/proc/18089/task/18097
+/proc/18089/task/18098
+/proc/18089/task/18099
+/proc/18089/task/18100
+/proc/18089/task/18101
+/proc/18089/task/18340
+/proc/18089/task/18368
+/proc/18089/task/18450
+/proc/18089/task/18969
+/proc/18089/task/20693
+/proc/18089/task/22503
+/proc/18649/task/18649
+/proc/18649/task/18654
+/proc/18649/task/18655
+/proc/18649/task/18656
+/proc/18649/task/18657
+/proc/18649/task/18658
+/proc/18649/task/18659
+/proc/18649/task/18660
+/proc/18649/task/18661
+/proc/18649/task/18665
+/proc/18649/task/18670
+/proc/18649/task/18697
+/proc/18649/task/20228
+/proc/18649/task/20230
+/proc/18649/task/22750
+/proc/18649/task/22751
+/proc/18649/task/22752
+/proc/18649/task/22755
+/proc/18649/task/22756
+/proc/18649/task/22758
+/proc/18949/task/18949
+/proc/18949/task/18954
+/proc/18949/task/18955
+/proc/18949/task/18956
+/proc/18949/task/18957
+/proc/18949/task/18958
+/proc/18949/task/18961
+/proc/18949/task/18962
+/proc/18949/task/18964
+/proc/19/task/19
+/proc/2/task/2
+/proc/20/task/20
+/proc/200/task/200
+/proc/201/task/201
+/proc/203/task/203
+/proc/204/task/204
+/proc/205/task/205
+/proc/207/task/207
+/proc/208/task/208
+/proc/209/task/209
+/proc/211/task/211
+/proc/212/task/212
+/proc/213/task/213
+/proc/216/task/216
+/proc/218/task/218
+/proc/219/task/219
+/proc/22/task/22
+/proc/220/task/220
+/proc/221/task/221
+/proc/222/task/222
+/proc/223/task/223
+/proc/22382/task/22382
+/proc/224/task/224
+/proc/225/task/225
+/proc/226/task/226
+/proc/227/task/227
+/proc/228/task/228
+/proc/229/task/229
+/proc/23/task/23
+/proc/230/task/230
+/proc/231/task/231
+/proc/23187/task/23187
+/proc/23187/task/23191
+/proc/23187/task/23194
+/proc/23187/task/23195
+/proc/23187/task/23196
+/proc/23187/task/23197
+/proc/23187/task/23198
+/proc/23187/task/23200
+/proc/23187/task/23201
+/proc/23187/task/23206
+/proc/232/task/232
+/proc/23233/task/23233
+/proc/23233/task/23237
+/proc/23233/task/23239
+/proc/23233/task/23240
+/proc/23233/task/23241
+/proc/23233/task/23242
+/proc/23233/task/23243
+/proc/23233/task/23245
+/proc/23233/task/23246
+/proc/23253/task/23253
+/proc/233/task/233
+/proc/234/task/234
+/proc/23400/task/23400
+/proc/235/task/235
+/proc/236/task/236
+/proc/237/task/237
+/proc/238/task/238
+/proc/239/task/239
+/proc/24/task/24
+/proc/240/task/240
+/proc/241/task/241
+/proc/242/task/242
+/proc/24281/task/24281
+/proc/243/task/243
+/proc/24304/task/24304
+/proc/244/task/244
+/proc/245/task/245
+/proc/246/task/246
+/proc/24678/task/24678
+/proc/247/task/247
+/proc/24767/task/24767
+/proc/248/task/248
+/proc/249/task/249
+/proc/24912/task/24912
+/proc/24918/task/24918
+/proc/250/task/250
+/proc/25094/task/25094
+/proc/251/task/251
+/proc/25115/task/25115
+/proc/25181/task/25181
+/proc/25194/task/25194
+/proc/252/task/252
+/proc/25219/task/25219
+/proc/25224/task/25224
+/proc/25227/task/25227
+/proc/253/task/253
+/proc/254/task/254
+/proc/255/task/255
+/proc/2558/task/2558
+/proc/2558/task/2560
+/proc/2558/task/2562
+/proc/2558/task/2565
+/proc/2558/task/2566
+/proc/2558/task/2567
+/proc/2558/task/2568
+/proc/2558/task/2570
+/proc/2558/task/2578
+/proc/256/task/256
+/proc/257/task/257
+/proc/2579/task/2579
+/proc/2579/task/2584
+/proc/2579/task/2589
+/proc/2579/task/2590
+/proc/2579/task/2591
+/proc/2579/task/2594
+/proc/2579/task/2598
+/proc/2579/task/2602
+/proc/2579/task/2609
+/proc/2579/task/2611
+/proc/2579/task/2626
+/proc/2579/task/2628
+/proc/2579/task/2629
+/proc/2579/task/2630
+/proc/2579/task/2631
+/proc/2579/task/2633
+/proc/2579/task/2634
+/proc/2579/task/2640
+/proc/2579/task/2649
+/proc/2579/task/2650
+/proc/2579/task/2651
+/proc/2579/task/2652
+/proc/2579/task/2653
+/proc/2579/task/2655
+/proc/2579/task/2657
+/proc/2579/task/2659
+/proc/2579/task/2660
+/proc/2579/task/2661
+/proc/2579/task/2662
+/proc/2579/task/2663
+/proc/2579/task/2664
+/proc/2579/task/2665
+/proc/2579/task/2666
+/proc/2579/task/2667
+/proc/2579/task/2669
+/proc/2579/task/2671
+/proc/2579/task/2672
+/proc/2579/task/2683
+/proc/2579/task/2684
+/proc/2579/task/2685
+/proc/2579/task/2688
+/proc/2579/task/2694
+/proc/2579/task/2697
+/proc/2579/task/2698
+/proc/2579/task/2699
+/proc/2579/task/2702
+/proc/2579/task/2704
+/proc/2579/task/2705
+/proc/2579/task/2706
+/proc/2579/task/2707
+/proc/2579/task/2708
+/proc/2579/task/2709
+/proc/2579/task/2710
+/proc/2579/task/2711
+/proc/2579/task/2712
+/proc/2579/task/2713
+/proc/2579/task/2714
+/proc/2579/task/2715
+/proc/2579/task/2716
+/proc/2579/task/2717
+/proc/2579/task/2718
+/proc/2579/task/2719
+/proc/2579/task/2720
+/proc/2579/task/2725
+/proc/2579/task/2727
+/proc/2579/task/3198
+/proc/258/task/258
+/proc/259/task/259
+/proc/26/task/26
+/proc/260/task/260
+/proc/261/task/261
+/proc/262/task/262
+/proc/263/task/263
+/proc/264/task/264
+/proc/265/task/265
+/proc/266/task/266
+/proc/267/task/267
+/proc/268/task/268
+/proc/269/task/269
+/proc/27/task/27
+/proc/270/task/270
+/proc/271/task/271
+/proc/272/task/272
+/proc/273/task/273
+/proc/274/task/274
+/proc/275/task/275
+/proc/276/task/276
+/proc/2761/task/2761
+/proc/277/task/277
+/proc/278/task/278
+/proc/279/task/279
+/proc/28/task/28
+/proc/280/task/280
+/proc/281/task/281
+/proc/282/task/282
+/proc/283/task/283
+/proc/284/task/284
+/proc/285/task/285
+/proc/286/task/286
+/proc/287/task/287
+/proc/288/task/288
+/proc/2883/task/2883
+/proc/2883/task/2886
+/proc/2883/task/2888
+/proc/2883/task/2890
+/proc/2883/task/2891
+/proc/2883/task/2892
+/proc/2883/task/2893
+/proc/2883/task/2894
+/proc/2883/task/2895
+/proc/2883/task/2897
+/proc/2883/task/2898
+/proc/289/task/289
+/proc/29/task/29
+/proc/294/task/294
+/proc/295/task/295
+/proc/296/task/296
+/proc/297/task/297
+/proc/298/task/298
+/proc/299/task/299
+/proc/3/task/3
+/proc/30/task/30
+/proc/300/task/300
+/proc/301/task/301
+/proc/302/task/302
+/proc/303/task/303
+/proc/304/task/304
+/proc/305/task/305
+/proc/306/task/306
+/proc/308/task/308
+/proc/309/task/309
+/proc/31/task/31
+/proc/310/task/310
+/proc/311/task/311
+/proc/312/task/312
+/proc/313/task/313
+/proc/314/task/314
+/proc/315/task/315
+/proc/316/task/316
+/proc/317/task/317
+/proc/318/task/318
+/proc/319/task/319
+/proc/32/task/32
+/proc/320/task/320
+/proc/321/task/321
+/proc/322/task/322
+/proc/323/task/323
+/proc/324/task/324
+/proc/325/task/325
+/proc/326/task/326
+/proc/327/task/327
+/proc/328/task/328
+/proc/329/task/329
+/proc/33/task/33
+/proc/330/task/330
+/proc/331/task/331
+/proc/332/task/332
+/proc/333/task/333
+/proc/335/task/335
+/proc/336/task/336
+/proc/337/task/337
+/proc/338/task/338
+/proc/340/task/340
+/proc/341/task/341
+/proc/342/task/342
+/proc/343/task/343
+/proc/344/task/344
+/proc/345/task/345
+/proc/346/task/346
+/proc/348/task/348
+/proc/349/task/349
+/proc/354/task/354
+/proc/355/task/355
+/proc/356/task/356
+/proc/360/task/360
+/proc/361/task/361
+/proc/362/task/362
+/proc/363/task/363
+/proc/364/task/364
+/proc/364/task/368
+/proc/364/task/369
+/proc/364/task/370
+/proc/364/task/371
+/proc/364/task/380
+/proc/364/task/381
+/proc/366/task/366
+/proc/366/task/394
+/proc/366/task/395
+/proc/366/task/396
+/proc/372/task/372
+/proc/393/task/393
+/proc/397/task/397
+/proc/398/task/398
+/proc/399/task/399
+/proc/40/task/40
+/proc/402/task/402
+/proc/403/task/403
+/proc/404/task/404
+/proc/405/task/1008
+/proc/405/task/1581
+/proc/405/task/1887
+/proc/405/task/405
+/proc/405/task/414
+/proc/405/task/415
+/proc/405/task/416
+/proc/405/task/771
+/proc/405/task/772
+/proc/405/task/774
+/proc/405/task/775
+/proc/405/task/776
+/proc/405/task/777
+/proc/405/task/778
+/proc/406/task/406
+/proc/406/task/410
+/proc/406/task/411
+/proc/406/task/412
+/proc/406/task/413
+/proc/41/task/41
+/proc/42/task/42
+/proc/421/task/421
+/proc/422/task/422
+/proc/423/task/423
+/proc/424/task/424
+/proc/425/task/425
+/proc/426/task/426
+/proc/427/task/427
+/proc/429/task/429
+/proc/430/task/430
+/proc/431/task/431
+/proc/433/task/433
+/proc/434/task/434
+/proc/435/task/3343
+/proc/435/task/435
+/proc/435/task/482
+/proc/436/task/3354
+/proc/436/task/3372
+/proc/436/task/4112
+/proc/436/task/4113
+/proc/436/task/4114
+/proc/436/task/4230
+/proc/436/task/436
+/proc/436/task/499
+/proc/436/task/897
+/proc/436/task/901
+/proc/436/task/908
+/proc/437/task/3604
+/proc/437/task/3608
+/proc/437/task/3610
+/proc/437/task/437
+/proc/437/task/475
+/proc/438/task/438
+/proc/439/task/439
+/proc/439/task/846
+/proc/439/task/847
+/proc/439/task/848
+/proc/439/task/849
+/proc/439/task/850
+/proc/439/task/851
+/proc/439/task/852
+/proc/439/task/853
+/proc/439/task/854
+/proc/44/task/44
+/proc/440/task/440
+/proc/441/task/441
+/proc/442/task/3462
+/proc/442/task/3575
+/proc/442/task/3908
+/proc/442/task/4122
+/proc/442/task/4155
+/proc/442/task/4158
+/proc/442/task/442
+/proc/442/task/4463
+/proc/442/task/4468
+/proc/442/task/4469
+/proc/442/task/4470
+/proc/442/task/4494
+/proc/442/task/541
+/proc/442/task/559
+/proc/442/task/796
+/proc/442/task/797
+/proc/442/task/799
+/proc/442/task/801
+/proc/442/task/807
+/proc/442/task/808
+/proc/442/task/820
+/proc/442/task/821
+/proc/444/task/444
+/proc/444/task/583
+/proc/445/task/1009
+/proc/445/task/1010
+/proc/445/task/1011
+/proc/445/task/1012
+/proc/445/task/1013
+/proc/445/task/1014
+/proc/445/task/1015
+/proc/445/task/1016
+/proc/445/task/1017
+/proc/445/task/1021
+/proc/445/task/1051
+/proc/445/task/1438
+/proc/445/task/445
+/proc/445/task/5133
+/proc/445/task/5134
+/proc/445/task/5424
+/proc/445/task/5425
+/proc/445/task/5426
+/proc/445/task/5427
+/proc/446/task/446
+/proc/447/task/447
+/proc/448/task/448
+/proc/45/task/45
+/proc/450/task/3602
+/proc/450/task/3656
+/proc/450/task/3702
+/proc/450/task/3723
+/proc/450/task/3789
+/proc/450/task/450
+/proc/450/task/477
+/proc/450/task/479
+/proc/450/task/484
+/proc/450/task/485
+/proc/450/task/487
+/proc/450/task/488
+/proc/450/task/490
+/proc/450/task/491
+/proc/450/task/492
+/proc/450/task/493
+/proc/450/task/494
+/proc/450/task/495
+/proc/450/task/496
+/proc/450/task/497
+/proc/450/task/498
+/proc/450/task/500
+/proc/450/task/501
+/proc/450/task/502
+/proc/450/task/503
+/proc/450/task/504
+/proc/450/task/505
+/proc/450/task/506
+/proc/450/task/507
+/proc/450/task/508
+/proc/450/task/509
+/proc/450/task/510
+/proc/450/task/511
+/proc/450/task/512
+/proc/450/task/513
+/proc/450/task/514
+/proc/450/task/515
+/proc/450/task/516
+/proc/450/task/517
+/proc/450/task/518
+/proc/450/task/519
+/proc/450/task/520
+/proc/450/task/521
+/proc/450/task/522
+/proc/450/task/523
+/proc/450/task/524
+/proc/450/task/525
+/proc/450/task/526
+/proc/450/task/527
+/proc/450/task/528
+/proc/450/task/529
+/proc/450/task/530
+/proc/450/task/531
+/proc/450/task/532
+/proc/450/task/533
+/proc/450/task/534
+/proc/450/task/535
+/proc/450/task/536
+/proc/451/task/451
+/proc/451/task/464
+/proc/452/task/452
+/proc/452/task/680
+/proc/453/task/23589
+/proc/453/task/23590
+/proc/453/task/23591
+/proc/453/task/23593
+/proc/453/task/453
+/proc/454/task/18685
+/proc/454/task/18686
+/proc/454/task/18690
+/proc/454/task/18693
+/proc/454/task/454
+/proc/456/task/456
+/proc/457/task/457
+/proc/457/task/614
+/proc/457/task/887
+/proc/457/task/889
+/proc/457/task/890
+/proc/458/task/458
+/proc/459/task/459
+/proc/46/task/46
+/proc/461/task/461
+/proc/461/task/538
+/proc/463/task/463
+/proc/463/task/483
+/proc/463/task/486
+/proc/465/task/25228
+/proc/465/task/465
+/proc/465/task/467
+/proc/465/task/468
+/proc/465/task/469
+/proc/466/task/466
+/proc/466/task/539
+/proc/47/task/47
+/proc/48/task/48
+/proc/480/task/480
+/proc/49/task/49
+/proc/5/task/5
+/proc/50/task/50
+/proc/52/task/52
+/proc/53/task/53
+/proc/54/task/54
+/proc/55/task/55
+/proc/56/task/56
+/proc/57/task/57
+/proc/5740/task/5740
+/proc/58/task/58
+/proc/59/task/59
+/proc/6/task/6
+/proc/60/task/60
+/proc/605/task/605
+/proc/606/task/606
+/proc/61/task/61
+/proc/62/task/62
+/proc/63/task/63
+/proc/64/task/64
+/proc/65/task/65
+/proc/66/task/66
+/proc/67/task/67
+/proc/68/task/68
+/proc/69/task/69
+/proc/7/task/7
+/proc/70/task/70
+/proc/71/task/71
+/proc/72/task/72
+/proc/73/task/73
+/proc/74/task/74
+/proc/75/task/75
+/proc/76/task/76
+/proc/77/task/77
+/proc/78/task/78
+/proc/784/task/784
+/proc/785/task/785
+/proc/79/task/79
+/proc/8/task/8
+/proc/80/task/80
+/proc/803/task/803
+/proc/81/task/81
+/proc/82/task/82
+/proc/8269/task/10168
+/proc/8269/task/10769
+/proc/8269/task/11274
+/proc/8269/task/11689
+/proc/8269/task/12042
+/proc/8269/task/15349
+/proc/8269/task/25214
+/proc/8269/task/8269
+/proc/8269/task/8272
+/proc/8269/task/8275
+/proc/8269/task/8276
+/proc/8269/task/8277
+/proc/8269/task/8278
+/proc/8269/task/8279
+/proc/8269/task/8280
+/proc/8269/task/8281
+/proc/8269/task/8289
+/proc/8269/task/8290
+/proc/8269/task/8294
+/proc/8269/task/8298
+/proc/8269/task/8753
+/proc/8269/task/9356
+/proc/8269/task/9768
+/proc/83/task/83
+/proc/84/task/84
+/proc/85/task/85
+/proc/858/task/1023
+/proc/858/task/1024
+/proc/858/task/1025
+/proc/858/task/1026
+/proc/858/task/1027
+/proc/858/task/1028
+/proc/858/task/1033
+/proc/858/task/1034
+/proc/858/task/1035
+/proc/858/task/1036
+/proc/858/task/1037
+/proc/858/task/1038
+/proc/858/task/1039
+/proc/858/task/1040
+/proc/858/task/1041
+/proc/858/task/1042
+/proc/858/task/1043
+/proc/858/task/1044
+/proc/858/task/1045
+/proc/858/task/1046
+/proc/858/task/1047
+/proc/858/task/1048
+/proc/858/task/1050
+/proc/858/task/1052
+/proc/858/task/1071
+/proc/858/task/1072
+/proc/858/task/1073
+/proc/858/task/1074
+/proc/858/task/1075
+/proc/858/task/1076
+/proc/858/task/1077
+/proc/858/task/1078
+/proc/858/task/1094
+/proc/858/task/1096
+/proc/858/task/1097
+/proc/858/task/11180
+/proc/858/task/11181
+/proc/858/task/1267
+/proc/858/task/1314
+/proc/858/task/1331
+/proc/858/task/1333
+/proc/858/task/1334
+/proc/858/task/1339
+/proc/858/task/1340
+/proc/858/task/1374
+/proc/858/task/1375
+/proc/858/task/1398
+/proc/858/task/1415
+/proc/858/task/1428
+/proc/858/task/1429
+/proc/858/task/1449
+/proc/858/task/1454
+/proc/858/task/1457
+/proc/858/task/1496
+/proc/858/task/1536
+/proc/858/task/1585
+/proc/858/task/18763
+/proc/858/task/18764
+/proc/858/task/18765
+/proc/858/task/2245
+/proc/858/task/2272
+/proc/858/task/2435
+/proc/858/task/2441
+/proc/858/task/2450
+/proc/858/task/25218
+/proc/858/task/2811
+/proc/858/task/3170
+/proc/858/task/3186
+/proc/858/task/3200
+/proc/858/task/3201
+/proc/858/task/3386
+/proc/858/task/3555
+/proc/858/task/3733
+/proc/858/task/3750
+/proc/858/task/3774
+/proc/858/task/3775
+/proc/858/task/3776
+/proc/858/task/5928
+/proc/858/task/6410
+/proc/858/task/7100
+/proc/858/task/7516
+/proc/858/task/7568
+/proc/858/task/8172
+/proc/858/task/858
+/proc/858/task/862
+/proc/858/task/864
+/proc/858/task/865
+/proc/858/task/866
+/proc/858/task/867
+/proc/858/task/868
+/proc/858/task/869
+/proc/858/task/870
+/proc/858/task/883
+/proc/858/task/884
+/proc/858/task/885
+/proc/858/task/886
+/proc/858/task/888
+/proc/858/task/891
+/proc/858/task/892
+/proc/858/task/893
+/proc/858/task/894
+/proc/858/task/895
+/proc/858/task/896
+/proc/858/task/899
+/proc/858/task/9701
+/proc/86/task/86
+/proc/87/task/87
+/proc/871/task/871
+/proc/871/task/873
+/proc/871/task/874
+/proc/871/task/875
+/proc/871/task/876
+/proc/872/task/872
+/proc/877/task/877
+/proc/877/task/878
+/proc/877/task/879
+/proc/877/task/881
+/proc/877/task/882
+/proc/88/task/88
+/proc/880/task/880
+/proc/89/task/89
+/proc/9/task/9
+/proc/90/task/90
+/proc/905/task/905
+/proc/906/task/906
+/proc/907/task/907
+/proc/91/task/91
+/proc/92/task/92
+/proc/93/task/93
+/proc/94/task/94
+/proc/95/task/95
+/proc/96/task/96
+/proc/97/task/97
+/proc/98/task/98
+/proc/99/task/99 \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/battor_test_data.txt b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/battor_test_data.txt
new file mode 100644
index 0000000..9672736
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/battor_test_data.txt
@@ -0,0 +1,16 @@
+# BattOr
+# voltage_range [-6079.7, 6196.8] mV
+# current_range [-6057.3, 5764.1] mA
+# sample_rate 10000 Hz, gain 10.1x
+0.00 6.5 4307.7
+0.10 15.1 4313.7
+0.20 15.1 4313.7
+0.30 12.2 4310.7
+0.40 12.2 4307.7
+0.50 18.0 4334.7
+0.60 15.1 4334.7
+0.70 18.0 4337.7
+0.80 18.0 4337.7
+0.90 20.9 4331.7
+1.00 9.3 4334.7
+1.10 9.3 4307.7
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/compressed_atrace_data.txt b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/compressed_atrace_data.txt
new file mode 100644
index 0000000..1368210
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/compressed_atrace_data.txt
@@ -0,0 +1,5 @@
+TRACE:
+x]nG}W4σ[U3zlʞ}X,6dso$-&+OEd5dhsqluܯ6OVW}l:o^?_qsu\~[V^|ܬ__j?o?I?xٜ?ogo6~OYωm"9tF #>ZRPk1ʡ@TfCqhkI5@r@`-%uzѨxvL-%|tu/QNf+#qCM >׻ǯ.D[@- 8j
+Oo'rf⌷ % A@R]U 50V_6Cƿ]E} 2|"!ǰ:
+@Ԍ\!>c0V49LAyD 'OsP[2w(vgO ࿉f<T?9xj4Q)Ɇ5
+9[ \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/decompressed_atrace_data.txt b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/decompressed_atrace_data.txt
new file mode 100644
index 0000000..a7fb5e8
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/decompressed_atrace_data.txt
@@ -0,0 +1,1053 @@
+# tracer: nop
+#
+# entries-in-buffer/entries-written: 1042/1042 #P:6
+#
+# _-----=> irqs-off
+# / _----=> need-resched
+# | / _---=> hardirq/softirq
+# || / _--=> preempt-depth
+# ||| / delay
+# TASK-PID TGID CPU# |||| TIMESTAMP FUNCTION
+# | | | | |||| | |
+ <...>-19161 (-----) [001] ...1 683201.354908: tracing_mark_write: trace_event_clock_sync: parent_ts=683201.375000
+ <...>-19161 (-----) [001] ...1 683201.354926: tracing_mark_write: trace_event_clock_sync: realtime_ts=3720325137
+ ndroid.systemui-13580 (13580) [001] ...1 683202.104223: tracing_mark_write: S|13580|deliverInputEvent|263
+ <...>-18926 (-----) [000] ...1 683202.104223: tracing_mark_write: S|18926|deliverInputEvent|1024
+ ndroid.systemui-13580 (13580) [001] ...1 683202.104606: tracing_mark_write: F|13580|deliverInputEvent|263
+ ndroid.systemui-13580 (13580) [001] ...1 683202.104846: tracing_mark_write: S|13580|deliverInputEvent|267
+ ndroid.systemui-13580 (13580) [001] ...1 683202.105046: tracing_mark_write: F|13580|deliverInputEvent|267
+ <...>-18926 (-----) [000] ...1 683202.107286: tracing_mark_write: F|18926|deliverInputEvent|1024
+ <...>-18926 (-----) [005] ...1 683202.115809: tracing_mark_write: B|18926|Choreographer#doFrame
+ <...>-18926 (-----) [005] ...1 683202.115860: tracing_mark_write: B|18926|input
+ <...>-18926 (-----) [005] ...1 683202.115972: tracing_mark_write: S|18926|deliverInputEvent|1041
+ <...>-18926 (-----) [005] ...1 683202.116506: tracing_mark_write: F|18926|deliverInputEvent|1041
+ <...>-18926 (-----) [005] ...1 683202.116849: tracing_mark_write: E
+ <...>-18926 (-----) [005] ...1 683202.116883: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.131660: tracing_mark_write: B|18926|Choreographer#doFrame
+ <...>-18926 (-----) [004] ...1 683202.131710: tracing_mark_write: B|18926|input
+ <...>-18926 (-----) [004] ...1 683202.131833: tracing_mark_write: S|18926|deliverInputEvent|1056
+ <...>-18926 (-----) [004] ...1 683202.132351: tracing_mark_write: F|18926|deliverInputEvent|1056
+ <...>-18926 (-----) [004] ...1 683202.132442: tracing_mark_write: S|18926|deliverInputEvent|1071
+ <...>-18926 (-----) [004] ...1 683202.133158: tracing_mark_write: S|18926|animator:opacity|23751452
+ <...>-18964 (-----) [002] ...1 683202.133760: tracing_mark_write: B|18926|notifyFramePending
+ <...>-18964 (-----) [002] ...1 683202.133771: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.133780: tracing_mark_write: F|18926|deliverInputEvent|1071
+ <...>-18926 (-----) [004] ...1 683202.133853: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.133879: tracing_mark_write: B|18926|animation
+ <...>-18926 (-----) [004] ...1 683202.133993: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.134018: tracing_mark_write: B|18926|traversal
+ <...>-18926 (-----) [004] ...1 683202.134075: tracing_mark_write: B|18926|draw
+ <...>-18926 (-----) [004] ...1 683202.134114: tracing_mark_write: B|18926|Record View#draw()
+ <...>-18926 (-----) [004] ...1 683202.134466: tracing_mark_write: E
+ <...>-18964 (-----) [002] ...1 683202.134734: tracing_mark_write: B|18926|DrawFrame
+ <...>-18964 (-----) [002] ...1 683202.134743: tracing_mark_write: B|18926|syncFrameState
+ <...>-18964 (-----) [002] ...1 683202.134797: tracing_mark_write: B|18926|prepareTree
+ <...>-18964 (-----) [002] ...1 683202.135205: tracing_mark_write: E
+ <...>-18964 (-----) [002] ...1 683202.135213: tracing_mark_write: E
+ <...>-18964 (-----) [002] ...1 683202.135308: tracing_mark_write: B|18926|computeOrdering
+ <...>-18964 (-----) [002] ...1 683202.135376: tracing_mark_write: E
+ <...>-18964 (-----) [002] ...1 683202.135819: tracing_mark_write: B|18926|flush drawing commands
+ <...>-18989 (-----) [003] ...1 683202.136120: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18989 (-----) [003] ...1 683202.136133: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18989 (-----) [003] ...1 683202.136151: tracing_mark_write: E
+ <...>-18988 (-----) [002] ...1 683202.136156: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18989 (-----) [003] ...1 683202.136165: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18988 (-----) [002] ...1 683202.136165: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18989 (-----) [003] ...1 683202.136170: tracing_mark_write: E
+ <...>-18989 (-----) [003] ...1 683202.136177: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18988 (-----) [002] ...1 683202.136177: tracing_mark_write: E
+ <...>-18988 (-----) [002] ...1 683202.136186: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18988 (-----) [002] ...1 683202.136204: tracing_mark_write: E
+ <...>-18988 (-----) [002] ...1 683202.136210: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18989 (-----) [003] ...1 683202.136220: tracing_mark_write: E
+ <...>-18989 (-----) [003] ...1 683202.136228: tracing_mark_write: E
+ <...>-18988 (-----) [002] ...1 683202.136234: tracing_mark_write: E
+ <...>-18988 (-----) [002] ...1 683202.136243: tracing_mark_write: E
+ <...>-18988 (-----) [002] ...1 683202.136250: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18988 (-----) [002] ...1 683202.136257: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18988 (-----) [002] ...1 683202.136264: tracing_mark_write: E
+ <...>-18988 (-----) [002] ...1 683202.136273: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18988 (-----) [002] ...1 683202.136281: tracing_mark_write: E
+ <...>-18988 (-----) [002] ...1 683202.136288: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18988 (-----) [002] ...1 683202.136311: tracing_mark_write: E
+ <...>-18988 (-----) [002] ...1 683202.136318: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.136377: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.136393: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.136441: tracing_mark_write: C|18926|jitterNanos|6767359
+ <...>-18926 (-----) [004] ...1 683202.136470: tracing_mark_write: B|18926|commit
+ <...>-18926 (-----) [004] ...1 683202.136500: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.136531: tracing_mark_write: E
+ <...>-18964 (-----) [002] ...1 683202.137447: tracing_mark_write: E
+ <...>-18964 (-----) [001] ...1 683202.139502: tracing_mark_write: C|18926|hwui_Texture|1858380
+ <...>-18964 (-----) [001] ...1 683202.139532: tracing_mark_write: C|18926|hwui_Texture_count|157
+ <...>-18964 (-----) [001] ...1 683202.139542: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
+ <...>-18964 (-----) [001] ...1 683202.139552: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|0
+ <...>-18964 (-----) [001] ...1 683202.139562: tracing_mark_write: C|18926|hwui_Layer|0
+ <...>-18964 (-----) [001] ...1 683202.139571: tracing_mark_write: C|18926|hwui_Layer_count|0
+ <...>-18964 (-----) [001] ...1 683202.139771: tracing_mark_write: E
+ <...>-18964 (-----) [001] ...1 683202.139787: tracing_mark_write: B|18926|notifyFramePending
+ <...>-18964 (-----) [001] ...1 683202.139793: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.149085: tracing_mark_write: B|18926|Choreographer#doFrame
+ <...>-18926 (-----) [004] ...1 683202.149136: tracing_mark_write: B|18926|input
+ <...>-18926 (-----) [004] ...1 683202.149185: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.149204: tracing_mark_write: B|18926|animation
+ <...>-18926 (-----) [004] ...1 683202.149511: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.149537: tracing_mark_write: B|18926|traversal
+ <...>-18926 (-----) [004] ...1 683202.149595: tracing_mark_write: B|18926|measure
+ <...>-18926 (-----) [004] ...1 683202.149738: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.149762: tracing_mark_write: B|18926|layout
+ <...>-18926 (-----) [004] ...1 683202.157004: tracing_mark_write: S|18926|animator:bottom|177885989
+ <...>-18926 (-----) [004] ...1 683202.161620: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.161704: tracing_mark_write: B|18926|draw
+ <...>-18926 (-----) [004] ...1 683202.161755: tracing_mark_write: B|18926|Record View#draw()
+ <...>-18926 (-----) [004] ...1 683202.165418: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.165542: tracing_mark_write: B|18926|DrawFrame
+ <...>-18964 (-----) [005] ...1 683202.165553: tracing_mark_write: B|18926|syncFrameState
+ <...>-18964 (-----) [005] ...1 683202.165586: tracing_mark_write: B|18926|prepareTree
+ <...>-18964 (-----) [005] ...1 683202.165981: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.165989: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.166060: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.166072: tracing_mark_write: B|18926|computeOrdering
+ <...>-18926 (-----) [004] ...1 683202.166074: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.166116: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.166125: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.166296: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18988 (-----) [001] ...1 683202.166312: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18926 (-----) [004] ...1 683202.166314: tracing_mark_write: B|18926|Choreographer#doFrame
+ <...>-18988 (-----) [001] ...1 683202.166330: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.166342: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18988 (-----) [001] ...1 683202.166361: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.166363: tracing_mark_write: B|18926|animation
+ <...>-18988 (-----) [001] ...1 683202.166369: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18988 (-----) [001] ...1 683202.166408: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.166416: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.167058: tracing_mark_write: S|18926|animator|46267553
+ <...>-18926 (-----) [004] ...1 683202.167297: tracing_mark_write: S|18926|animator|219664070
+ <...>-18988 (-----) [001] ...1 683202.167362: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18988 (-----) [001] ...1 683202.167377: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18988 (-----) [001] ...1 683202.167386: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.167394: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18988 (-----) [001] ...1 683202.167402: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.167408: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18988 (-----) [001] ...1 683202.167429: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.167434: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.167467: tracing_mark_write: E
+ <...>-18989 (-----) [001] ...1 683202.167469: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18989 (-----) [001] ...1 683202.167477: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18989 (-----) [001] ...1 683202.167487: tracing_mark_write: E
+ <...>-18989 (-----) [001] ...1 683202.167494: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18926 (-----) [004] ...1 683202.167501: tracing_mark_write: B|18926|traversal
+ <...>-18964 (-----) [005] ...1 683202.167508: tracing_mark_write: B|18926|flush drawing commands
+ <...>-18989 (-----) [001] ...1 683202.167529: tracing_mark_write: E
+ <...>-18989 (-----) [001] ...1 683202.167536: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18989 (-----) [001] ...1 683202.167556: tracing_mark_write: E
+ <...>-18989 (-----) [001] ...1 683202.167561: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.167580: tracing_mark_write: B|18926|draw
+ <...>-18926 (-----) [004] ...1 683202.167626: tracing_mark_write: B|18926|Record View#draw()
+ <...>-18964 (-----) [005] ...1 683202.168483: tracing_mark_write: B|18926|Upload 63x63 Texture
+ <...>-18964 (-----) [005] ...1 683202.168780: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.168970: tracing_mark_write: B|18926|Upload 63x63 Texture
+ <...>-18926 (-----) [004] ...1 683202.168978: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.169188: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.169313: tracing_mark_write: B|18926|Upload 63x63 Texture
+ <...>-18964 (-----) [005] ...1 683202.169537: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.170878: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.171711: tracing_mark_write: C|18926|hwui_Texture|1906008
+ <...>-18964 (-----) [005] ...1 683202.171721: tracing_mark_write: C|18926|hwui_Texture_count|160
+ <...>-18964 (-----) [005] ...1 683202.171728: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
+ <...>-18964 (-----) [005] ...1 683202.171735: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|0
+ <...>-18964 (-----) [005] ...1 683202.171742: tracing_mark_write: C|18926|hwui_Layer|0
+ <...>-18964 (-----) [005] ...1 683202.171748: tracing_mark_write: C|18926|hwui_Layer_count|0
+ <...>-18964 (-----) [005] ...1 683202.171872: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.171882: tracing_mark_write: B|18926|notifyFramePending
+ <...>-18964 (-----) [005] ...1 683202.171886: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.171893: tracing_mark_write: B|18926|notifyFramePending
+ <...>-18964 (-----) [005] ...1 683202.171896: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.171903: tracing_mark_write: B|18926|DrawFrame
+ <...>-18964 (-----) [005] ...1 683202.171909: tracing_mark_write: B|18926|syncFrameState
+ <...>-18964 (-----) [005] ...1 683202.171933: tracing_mark_write: B|18926|prepareTree
+ <...>-18964 (-----) [005] ...1 683202.172095: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.172101: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.172156: tracing_mark_write: B|18926|computeOrdering
+ <...>-18964 (-----) [005] ...1 683202.172196: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.172318: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18988 (-----) [001] ...1 683202.172326: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18988 (-----) [001] ...1 683202.172335: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.172343: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18988 (-----) [001] ...1 683202.172354: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.172360: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18988 (-----) [001] ...1 683202.172380: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.172386: tracing_mark_write: E
+ <...>-18926 (-----) [000] ...1 683202.172480: tracing_mark_write: E
+ <...>-18926 (-----) [000] ...1 683202.172495: tracing_mark_write: E
+ <...>-18926 (-----) [000] ...1 683202.172539: tracing_mark_write: C|18926|jitterNanos|10113151
+ <...>-18926 (-----) [000] ...1 683202.172566: tracing_mark_write: B|18926|commit
+ <...>-18988 (-----) [001] ...1 683202.172593: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18988 (-----) [001] ...1 683202.172600: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18926 (-----) [000] ...1 683202.172603: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.172607: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.172615: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18964 (-----) [005] ...1 683202.172618: tracing_mark_write: B|18926|flush drawing commands
+ <...>-18988 (-----) [001] ...1 683202.172619: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.172626: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18926 (-----) [000] ...1 683202.172642: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.172646: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.172652: tracing_mark_write: E
+ <...>-18989 (-----) [001] ...1 683202.172681: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18989 (-----) [001] ...1 683202.172687: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18989 (-----) [001] ...1 683202.172695: tracing_mark_write: E
+ <...>-18989 (-----) [001] ...1 683202.172702: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18989 (-----) [001] ...1 683202.172710: tracing_mark_write: E
+ <...>-18989 (-----) [001] ...1 683202.172716: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18989 (-----) [001] ...1 683202.172741: tracing_mark_write: E
+ <...>-18989 (-----) [001] ...1 683202.172746: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.173451: tracing_mark_write: B|18926|tessellatePath
+ <...>-18964 (-----) [005] ...1 683202.173460: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18964 (-----) [005] ...1 683202.173489: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.173506: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.174384: tracing_mark_write: E
+ <...>-18926 (-----) [005] ...1 683202.179559: tracing_mark_write: B|18926|Choreographer#doFrame
+ <...>-18926 (-----) [005] ...1 683202.179602: tracing_mark_write: B|18926|input
+ <...>-18926 (-----) [005] ...1 683202.179643: tracing_mark_write: E
+ <...>-18926 (-----) [005] ...1 683202.179663: tracing_mark_write: B|18926|animation
+ <...>-18926 (-----) [005] ...1 683202.180146: tracing_mark_write: E
+ <...>-18926 (-----) [005] ...1 683202.180178: tracing_mark_write: B|18926|traversal
+ <...>-18926 (-----) [005] ...1 683202.180238: tracing_mark_write: B|18926|draw
+ <...>-18926 (-----) [005] ...1 683202.180274: tracing_mark_write: B|18926|Record View#draw()
+ <...>-18926 (-----) [005] ...1 683202.181062: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.181975: tracing_mark_write: C|18926|hwui_Texture|1906008
+ <...>-18964 (-----) [005] ...1 683202.181986: tracing_mark_write: C|18926|hwui_Texture_count|160
+ <...>-18964 (-----) [005] ...1 683202.181993: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
+ <...>-18964 (-----) [005] ...1 683202.182000: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|0
+ <...>-18964 (-----) [005] ...1 683202.182006: tracing_mark_write: C|18926|hwui_Layer|0
+ <...>-18964 (-----) [005] ...1 683202.182012: tracing_mark_write: C|18926|hwui_Layer_count|0
+ <...>-18964 (-----) [005] ...1 683202.182117: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.182133: tracing_mark_write: B|18926|notifyFramePending
+ <...>-18964 (-----) [005] ...1 683202.182138: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.182146: tracing_mark_write: B|18926|DrawFrame
+ <...>-18964 (-----) [005] ...1 683202.182152: tracing_mark_write: B|18926|syncFrameState
+ <...>-18964 (-----) [005] ...1 683202.182184: tracing_mark_write: B|18926|prepareTree
+ <...>-18964 (-----) [005] ...1 683202.182379: tracing_mark_write: B|18926|Allocate 896x128 HW Layer
+ <...>-18964 (-----) [005] ...1 683202.182455: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.182548: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.182554: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.182809: tracing_mark_write: B|18926|Optimize HW Layer DisplayList Button 849x126
+ <...>-18964 (-----) [005] ...1 683202.182898: tracing_mark_write: B|18926|computeOrdering
+ <...>-18964 (-----) [005] ...1 683202.182956: tracing_mark_write: E
+ <...>-18926 (-----) [001] ...1 683202.183195: tracing_mark_write: E
+ <...>-18926 (-----) [001] ...1 683202.183223: tracing_mark_write: E
+ <...>-18926 (-----) [001] ...1 683202.183332: tracing_mark_write: C|18926|jitterNanos|4175322
+ <...>-18926 (-----) [001] ...1 683202.183361: tracing_mark_write: B|18926|commit
+ <...>-18926 (-----) [001] ...1 683202.183393: tracing_mark_write: E
+ <...>-18926 (-----) [001] ...1 683202.183428: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.184160: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.184173: tracing_mark_write: B|18926|computeOrdering
+ <...>-18964 (-----) [005] ...1 683202.184248: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.184400: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18988 (-----) [003] ...1 683202.184411: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18988 (-----) [003] ...1 683202.184451: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.184463: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18988 (-----) [003] ...1 683202.184478: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.184485: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18964 (-----) [005] ...1 683202.184607: tracing_mark_write: B|18926|Button alpha caused saveLayer 849x126
+ <...>-18964 (-----) [005] ...1 683202.184612: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.184829: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.184871: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.184884: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18988 (-----) [003] ...1 683202.184891: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18988 (-----) [003] ...1 683202.184898: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.184907: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18988 (-----) [003] ...1 683202.184910: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.184916: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18989 (-----) [000] ...1 683202.184921: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18989 (-----) [000] ...1 683202.184930: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18989 (-----) [000] ...1 683202.184941: tracing_mark_write: E
+ <...>-18989 (-----) [000] ...1 683202.184949: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18989 (-----) [000] ...1 683202.184961: tracing_mark_write: E
+ <...>-18989 (-----) [000] ...1 683202.184968: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18989 (-----) [000] ...1 683202.184989: tracing_mark_write: E
+ <...>-18989 (-----) [000] ...1 683202.185017: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.185064: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.185072: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.187274: tracing_mark_write: B|18926|Issue HW Layer DisplayList Button 849x126
+ <...>-18964 (-----) [005] ...1 683202.187506: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.187645: tracing_mark_write: B|18926|flush drawing commands
+ <...>-18964 (-----) [005] ...1 683202.188279: tracing_mark_write: B|18926|tessellatePath
+ <...>-18964 (-----) [005] ...1 683202.188289: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18964 (-----) [005] ...1 683202.188318: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.188332: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.188578: tracing_mark_write: B|18926|Build GL Shader
+ <...>-18964 (-----) [005] ...1 683202.188959: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.188972: tracing_mark_write: B|18926|Build GL Shader
+ <...>-18964 (-----) [005] ...1 683202.192088: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.192173: tracing_mark_write: B|18926|linkProgram
+ <...>-18926 (-----) [004] ...1 683202.196237: tracing_mark_write: B|18926|Choreographer#doFrame
+ <...>-18926 (-----) [004] ...1 683202.196276: tracing_mark_write: B|18926|input
+ <...>-18926 (-----) [004] ...1 683202.196304: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.196320: tracing_mark_write: B|18926|animation
+ <...>-18926 (-----) [004] ...1 683202.196702: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.196732: tracing_mark_write: B|18926|traversal
+ <...>-18926 (-----) [004] ...1 683202.196791: tracing_mark_write: B|18926|draw
+ <...>-18926 (-----) [004] ...1 683202.196824: tracing_mark_write: B|18926|Record View#draw()
+ <...>-18926 (-----) [004] ...1 683202.197263: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.206362: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.207218: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.208128: tracing_mark_write: C|18926|hwui_Texture|2364760
+ <...>-18964 (-----) [005] ...1 683202.208138: tracing_mark_write: C|18926|hwui_Texture_count|161
+ <...>-18964 (-----) [005] ...1 683202.208144: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
+ <...>-18964 (-----) [005] ...1 683202.208150: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|1
+ <...>-18964 (-----) [005] ...1 683202.208156: tracing_mark_write: C|18926|hwui_Layer|0
+ <...>-18964 (-----) [005] ...1 683202.208162: tracing_mark_write: C|18926|hwui_Layer_count|0
+ <...>-18964 (-----) [005] ...1 683202.208236: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.208244: tracing_mark_write: B|18926|notifyFramePending
+ <...>-18964 (-----) [005] ...1 683202.208248: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.208254: tracing_mark_write: B|18926|DrawFrame
+ <...>-18964 (-----) [005] ...1 683202.208260: tracing_mark_write: B|18926|syncFrameState
+ <...>-18964 (-----) [005] ...1 683202.208281: tracing_mark_write: B|18926|prepareTree
+ <...>-18964 (-----) [005] ...1 683202.208469: tracing_mark_write: B|18926|Allocate 1088x192 HW Layer
+ <...>-18964 (-----) [005] ...1 683202.208515: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.208545: tracing_mark_write: B|18926|Allocate 1088x192 HW Layer
+ <...>-18964 (-----) [005] ...1 683202.208559: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.208574: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.208580: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.208631: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.208632: tracing_mark_write: B|18926|Optimize HW Layer DisplayList LinearLayout 1080x189
+ <...>-18964 (-----) [005] ...1 683202.208637: tracing_mark_write: B|18926|computeOrdering
+ <...>-18926 (-----) [004] ...1 683202.208642: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.208644: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.208672: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.208694: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.208705: tracing_mark_write: B|18926|Optimize HW Layer DisplayList LinearLayout 1080x189
+ <...>-18964 (-----) [005] ...1 683202.208710: tracing_mark_write: B|18926|computeOrdering
+ <...>-18964 (-----) [005] ...1 683202.208716: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.208741: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.208749: tracing_mark_write: B|18926|computeOrdering
+ <...>-18964 (-----) [005] ...1 683202.208798: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.208892: tracing_mark_write: F|18926|animator:opacity|23751452
+ <...>-18988 (-----) [003] ...1 683202.208930: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18988 (-----) [003] ...1 683202.208942: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18988 (-----) [003] ...1 683202.208956: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.208967: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18964 (-----) [005] ...1 683202.208971: tracing_mark_write: B|18926|Button alpha caused saveLayer 849x126
+ <...>-18964 (-----) [005] ...1 683202.208975: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.208989: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.208995: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18988 (-----) [003] ...1 683202.209027: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.209034: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.209124: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
+ <...>-18964 (-----) [005] ...1 683202.209127: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.209137: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
+ <...>-18964 (-----) [005] ...1 683202.209140: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.209199: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18988 (-----) [003] ...1 683202.209205: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18988 (-----) [003] ...1 683202.209212: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.209220: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18988 (-----) [003] ...1 683202.209223: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.209228: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18988 (-----) [003] ...1 683202.209251: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.209257: tracing_mark_write: E
+ <...>-18989 (-----) [003] ...1 683202.209347: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18989 (-----) [003] ...1 683202.209357: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18989 (-----) [003] ...1 683202.209367: tracing_mark_write: E
+ <...>-18989 (-----) [003] ...1 683202.209421: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18989 (-----) [003] ...1 683202.209476: tracing_mark_write: E
+ <...>-18989 (-----) [003] ...1 683202.209484: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18989 (-----) [003] ...1 683202.209506: tracing_mark_write: E
+ <...>-18989 (-----) [003] ...1 683202.209511: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.210303: tracing_mark_write: B|18926|Issue HW Layer DisplayList LinearLayout 1080x189
+ <...>-18964 (-----) [005] ...1 683202.210644: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.211769: tracing_mark_write: B|18926|Issue HW Layer DisplayList LinearLayout 1080x189
+ <...>-18964 (-----) [005] ...1 683202.212040: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.212151: tracing_mark_write: B|18926|flush drawing commands
+ <...>-18964 (-----) [005] ...1 683202.212697: tracing_mark_write: B|18926|tessellatePath
+ <...>-18964 (-----) [005] ...1 683202.212705: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18964 (-----) [005] ...1 683202.212733: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.212747: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.212810: tracing_mark_write: B|18926|Choreographer#doFrame
+ <...>-18926 (-----) [004] ...1 683202.212843: tracing_mark_write: B|18926|input
+ <...>-18926 (-----) [004] ...1 683202.212878: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.212895: tracing_mark_write: B|18926|animation
+ <...>-18926 (-----) [004] ...1 683202.213187: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.213221: tracing_mark_write: B|18926|traversal
+ <...>-18926 (-----) [004] ...1 683202.213321: tracing_mark_write: B|18926|draw
+ <...>-18926 (-----) [004] ...1 683202.213360: tracing_mark_write: B|18926|Record View#draw()
+ <...>-18964 (-----) [005] ...1 683202.214038: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.214843: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.215111: tracing_mark_write: C|18926|hwui_Texture|4035928
+ <...>-18964 (-----) [005] ...1 683202.215118: tracing_mark_write: C|18926|hwui_Texture_count|163
+ <...>-18964 (-----) [005] ...1 683202.215122: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
+ <...>-18964 (-----) [005] ...1 683202.215127: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|3
+ <...>-18964 (-----) [005] ...1 683202.215131: tracing_mark_write: C|18926|hwui_Layer|0
+ <...>-18964 (-----) [005] ...1 683202.215135: tracing_mark_write: C|18926|hwui_Layer_count|0
+ <...>-18964 (-----) [005] ...1 683202.215203: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.215210: tracing_mark_write: B|18926|notifyFramePending
+ <...>-18964 (-----) [005] ...1 683202.215212: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.215219: tracing_mark_write: B|18926|DrawFrame
+ <...>-18964 (-----) [005] ...1 683202.215223: tracing_mark_write: B|18926|syncFrameState
+ <...>-18964 (-----) [005] ...1 683202.215242: tracing_mark_write: B|18926|prepareTree
+ <...>-18964 (-----) [005] ...1 683202.215444: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.215452: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.215496: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.215504: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.215506: tracing_mark_write: B|18926|computeOrdering
+ <...>-18926 (-----) [004] ...1 683202.215527: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.215546: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.215665: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18988 (-----) [003] ...1 683202.215676: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18988 (-----) [003] ...1 683202.215691: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.215699: tracing_mark_write: B|18926|Button alpha caused saveLayer 849x126
+ <...>-18988 (-----) [003] ...1 683202.215702: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18964 (-----) [005] ...1 683202.215703: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.215718: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.215725: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18988 (-----) [003] ...1 683202.215758: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.215765: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.215840: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
+ <...>-18964 (-----) [005] ...1 683202.215843: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.215852: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
+ <...>-18964 (-----) [005] ...1 683202.215854: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.215907: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18988 (-----) [003] ...1 683202.215914: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18964 (-----) [005] ...1 683202.215916: tracing_mark_write: B|18926|flush drawing commands
+ <...>-18988 (-----) [003] ...1 683202.215922: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.215930: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18988 (-----) [003] ...1 683202.215933: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.215939: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18988 (-----) [003] ...1 683202.215959: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.215964: tracing_mark_write: E
+ <...>-18989 (-----) [003] ...1 683202.215995: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18989 (-----) [003] ...1 683202.216002: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18989 (-----) [003] ...1 683202.216010: tracing_mark_write: E
+ <...>-18989 (-----) [003] ...1 683202.216016: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18989 (-----) [003] ...1 683202.216028: tracing_mark_write: E
+ <...>-18989 (-----) [003] ...1 683202.216034: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18989 (-----) [003] ...1 683202.216054: tracing_mark_write: E
+ <...>-18989 (-----) [003] ...1 683202.216059: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.216381: tracing_mark_write: B|18926|tessellatePath
+ <...>-18964 (-----) [005] ...1 683202.216388: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18964 (-----) [005] ...1 683202.216407: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.216416: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.217126: tracing_mark_write: E
+ <...>-18964 (-----) [001] ...1 683202.222253: tracing_mark_write: C|18926|hwui_Texture|4035928
+ <...>-18964 (-----) [001] ...1 683202.222264: tracing_mark_write: C|18926|hwui_Texture_count|163
+ <...>-18964 (-----) [001] ...1 683202.222271: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
+ <...>-18964 (-----) [001] ...1 683202.222279: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|3
+ <...>-18964 (-----) [001] ...1 683202.222287: tracing_mark_write: C|18926|hwui_Layer|0
+ <...>-18964 (-----) [001] ...1 683202.222295: tracing_mark_write: C|18926|hwui_Layer_count|0
+ <...>-18964 (-----) [001] ...1 683202.222397: tracing_mark_write: E
+ <...>-18964 (-----) [001] ...1 683202.222406: tracing_mark_write: B|18926|drainDisplayEventQueue
+ <...>-18964 (-----) [001] ...1 683202.222421: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.229007: tracing_mark_write: B|18926|drainDisplayEventQueue
+ <...>-18964 (-----) [004] ...1 683202.229029: tracing_mark_write: B|18926|queue mFrameCallbackTask
+ <...>-18964 (-----) [004] ...1 683202.229037: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.229039: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.230451: tracing_mark_write: B|18926|Choreographer#doFrame
+ <...>-18926 (-----) [004] ...1 683202.230484: tracing_mark_write: B|18926|input
+ <...>-18926 (-----) [004] ...1 683202.230507: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.230518: tracing_mark_write: B|18926|animation
+ <...>-18926 (-----) [004] ...1 683202.230755: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.230773: tracing_mark_write: B|18926|traversal
+ <...>-18926 (-----) [004] ...1 683202.230818: tracing_mark_write: B|18926|draw
+ <...>-18926 (-----) [004] ...1 683202.230848: tracing_mark_write: B|18926|Record View#draw()
+ <...>-18926 (-----) [004] ...1 683202.231162: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.231162: tracing_mark_write: B|18926|notifyFramePending
+ <...>-18964 (-----) [005] ...1 683202.231169: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.231178: tracing_mark_write: B|18926|DrawFrame
+ <...>-18964 (-----) [005] ...1 683202.231182: tracing_mark_write: B|18926|syncFrameState
+ <...>-18964 (-----) [005] ...1 683202.231203: tracing_mark_write: B|18926|prepareTree
+ <...>-18964 (-----) [005] ...1 683202.231342: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.231347: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.231381: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.231388: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.231392: tracing_mark_write: B|18926|computeOrdering
+ <...>-18926 (-----) [004] ...1 683202.231408: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.231424: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.231572: tracing_mark_write: B|18926|Button alpha caused saveLayer 849x126
+ <...>-18964 (-----) [005] ...1 683202.231576: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.231706: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18964 (-----) [005] ...1 683202.231715: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
+ <...>-18964 (-----) [005] ...1 683202.231718: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.231719: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18964 (-----) [005] ...1 683202.231728: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
+ <...>-18964 (-----) [005] ...1 683202.231730: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.231735: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.231746: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18988 (-----) [003] ...1 683202.231771: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.231774: tracing_mark_write: B|18926|flush drawing commands
+ <...>-18988 (-----) [003] ...1 683202.231779: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18988 (-----) [003] ...1 683202.231811: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.231818: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.231832: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18988 (-----) [003] ...1 683202.231837: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18988 (-----) [003] ...1 683202.231844: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.231851: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18988 (-----) [003] ...1 683202.231854: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.231859: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18988 (-----) [003] ...1 683202.231883: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.231889: tracing_mark_write: E
+ <...>-18989 (-----) [000] ...1 683202.232044: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18989 (-----) [000] ...1 683202.232053: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18989 (-----) [000] ...1 683202.232063: tracing_mark_write: E
+ <...>-18989 (-----) [000] ...1 683202.232071: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18989 (-----) [000] ...1 683202.232080: tracing_mark_write: E
+ <...>-18989 (-----) [000] ...1 683202.232085: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18989 (-----) [000] ...1 683202.232107: tracing_mark_write: E
+ <...>-18989 (-----) [000] ...1 683202.232113: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.232269: tracing_mark_write: B|18926|tessellatePath
+ <...>-18964 (-----) [005] ...1 683202.232275: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18964 (-----) [005] ...1 683202.232293: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.232303: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.232352: tracing_mark_write: B|18926|tessellatePath
+ <...>-18964 (-----) [005] ...1 683202.232356: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18964 (-----) [005] ...1 683202.232363: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.232367: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.232939: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.233604: tracing_mark_write: C|18926|hwui_Texture|4035928
+ <...>-18964 (-----) [005] ...1 683202.233612: tracing_mark_write: C|18926|hwui_Texture_count|163
+ <...>-18964 (-----) [005] ...1 683202.233616: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
+ <...>-18964 (-----) [005] ...1 683202.233621: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|3
+ <...>-18964 (-----) [005] ...1 683202.233626: tracing_mark_write: C|18926|hwui_Layer|0
+ <...>-18964 (-----) [005] ...1 683202.233630: tracing_mark_write: C|18926|hwui_Layer_count|0
+ <...>-18964 (-----) [005] ...1 683202.233688: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.233694: tracing_mark_write: B|18926|dispatchFrameCallbacks
+ <...>-18964 (-----) [005] ...1 683202.233696: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.233700: tracing_mark_write: B|18926|drainDisplayEventQueue
+ <...>-18964 (-----) [005] ...1 683202.233710: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.245778: tracing_mark_write: B|18926|drainDisplayEventQueue
+ <...>-18964 (-----) [005] ...1 683202.245799: tracing_mark_write: B|18926|queue mFrameCallbackTask
+ <...>-18964 (-----) [005] ...1 683202.245805: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.245807: tracing_mark_write: E
+ <...>-18926 (-----) [005] ...1 683202.246567: tracing_mark_write: B|18926|Choreographer#doFrame
+ <...>-18926 (-----) [005] ...1 683202.246598: tracing_mark_write: B|18926|input
+ <...>-18926 (-----) [005] ...1 683202.246649: tracing_mark_write: E
+ <...>-18926 (-----) [005] ...1 683202.246661: tracing_mark_write: B|18926|animation
+ <...>-18926 (-----) [005] ...1 683202.246881: tracing_mark_write: E
+ <...>-18926 (-----) [005] ...1 683202.246894: tracing_mark_write: B|18926|traversal
+ <...>-18926 (-----) [005] ...1 683202.246927: tracing_mark_write: B|18926|draw
+ <...>-18926 (-----) [005] ...1 683202.246948: tracing_mark_write: B|18926|Record View#draw()
+ <...>-18964 (-----) [004] ...1 683202.247070: tracing_mark_write: B|18926|notifyFramePending
+ <...>-18964 (-----) [004] ...1 683202.247077: tracing_mark_write: E
+ <...>-18926 (-----) [005] ...1 683202.247196: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.247236: tracing_mark_write: B|18926|DrawFrame
+ <...>-18964 (-----) [004] ...1 683202.247240: tracing_mark_write: B|18926|syncFrameState
+ <...>-18964 (-----) [004] ...1 683202.247263: tracing_mark_write: B|18926|prepareTree
+ <...>-18964 (-----) [004] ...1 683202.247407: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.247412: tracing_mark_write: E
+ <...>-18926 (-----) [005] ...1 683202.247443: tracing_mark_write: E
+ <...>-18926 (-----) [005] ...1 683202.247450: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.247457: tracing_mark_write: B|18926|computeOrdering
+ <...>-18926 (-----) [005] ...1 683202.247465: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.247487: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.247631: tracing_mark_write: B|18926|Button alpha caused saveLayer 849x126
+ <...>-18964 (-----) [004] ...1 683202.247634: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.247744: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18964 (-----) [004] ...1 683202.247756: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
+ <...>-18988 (-----) [003] ...1 683202.247756: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18964 (-----) [004] ...1 683202.247759: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.247768: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
+ <...>-18964 (-----) [004] ...1 683202.247772: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.247772: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.247783: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18988 (-----) [003] ...1 683202.247805: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.247812: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18964 (-----) [004] ...1 683202.247819: tracing_mark_write: B|18926|flush drawing commands
+ <...>-18988 (-----) [003] ...1 683202.247847: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.247854: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.247864: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18988 (-----) [003] ...1 683202.247870: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18988 (-----) [003] ...1 683202.247876: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.247883: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18988 (-----) [003] ...1 683202.247886: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.247891: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18988 (-----) [003] ...1 683202.247912: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.247917: tracing_mark_write: E
+ <...>-18989 (-----) [003] ...1 683202.247948: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18989 (-----) [003] ...1 683202.247955: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18989 (-----) [003] ...1 683202.247963: tracing_mark_write: E
+ <...>-18989 (-----) [003] ...1 683202.247970: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18989 (-----) [003] ...1 683202.247981: tracing_mark_write: E
+ <...>-18989 (-----) [003] ...1 683202.247986: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18989 (-----) [003] ...1 683202.248006: tracing_mark_write: E
+ <...>-18989 (-----) [003] ...1 683202.248011: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.248259: tracing_mark_write: B|18926|tessellatePath
+ <...>-18964 (-----) [004] ...1 683202.248265: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18964 (-----) [004] ...1 683202.248282: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.248292: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.248345: tracing_mark_write: B|18926|tessellatePath
+ <...>-18964 (-----) [004] ...1 683202.248349: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18964 (-----) [004] ...1 683202.248358: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.248365: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.248952: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.249556: tracing_mark_write: C|18926|hwui_Texture|4035928
+ <...>-18964 (-----) [004] ...1 683202.249562: tracing_mark_write: C|18926|hwui_Texture_count|163
+ <...>-18964 (-----) [004] ...1 683202.249567: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
+ <...>-18964 (-----) [004] ...1 683202.249572: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|3
+ <...>-18964 (-----) [004] ...1 683202.249576: tracing_mark_write: C|18926|hwui_Layer|0
+ <...>-18964 (-----) [004] ...1 683202.249580: tracing_mark_write: C|18926|hwui_Layer_count|0
+ <...>-18964 (-----) [004] ...1 683202.249663: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.249669: tracing_mark_write: B|18926|dispatchFrameCallbacks
+ <...>-18964 (-----) [004] ...1 683202.249671: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.249676: tracing_mark_write: B|18926|drainDisplayEventQueue
+ <...>-18964 (-----) [004] ...1 683202.249684: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.262890: tracing_mark_write: B|18926|drainDisplayEventQueue
+ <...>-18964 (-----) [004] ...1 683202.262909: tracing_mark_write: B|18926|queue mFrameCallbackTask
+ <...>-18964 (-----) [004] ...1 683202.262917: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.262919: tracing_mark_write: E
+ <...>-18926 (-----) [005] ...1 683202.263007: tracing_mark_write: B|18926|Choreographer#doFrame
+ <...>-18926 (-----) [005] ...1 683202.263032: tracing_mark_write: B|18926|input
+ <...>-18926 (-----) [005] ...1 683202.263055: tracing_mark_write: E
+ <...>-18926 (-----) [005] ...1 683202.263064: tracing_mark_write: B|18926|animation
+ <...>-18926 (-----) [005] ...1 683202.263309: tracing_mark_write: E
+ <...>-18926 (-----) [005] ...1 683202.263323: tracing_mark_write: B|18926|traversal
+ <...>-18926 (-----) [005] ...1 683202.263356: tracing_mark_write: B|18926|draw
+ <...>-18926 (-----) [005] ...1 683202.263379: tracing_mark_write: B|18926|Record View#draw()
+ <...>-18964 (-----) [004] ...1 683202.263518: tracing_mark_write: B|18926|notifyFramePending
+ <...>-18964 (-----) [004] ...1 683202.263523: tracing_mark_write: E
+ <...>-18926 (-----) [005] ...1 683202.263649: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.263700: tracing_mark_write: B|18926|DrawFrame
+ <...>-18964 (-----) [004] ...1 683202.263704: tracing_mark_write: B|18926|syncFrameState
+ <...>-18964 (-----) [004] ...1 683202.263729: tracing_mark_write: B|18926|prepareTree
+ <...>-18964 (-----) [004] ...1 683202.263882: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.263888: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.263946: tracing_mark_write: B|18926|computeOrdering
+ <...>-18964 (-----) [004] ...1 683202.263978: tracing_mark_write: E
+ <...>-18926 (-----) [005] ...1 683202.264105: tracing_mark_write: E
+ <...>-18926 (-----) [005] ...1 683202.264116: tracing_mark_write: E
+ <...>-18926 (-----) [005] ...1 683202.264139: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.264149: tracing_mark_write: B|18926|Button alpha caused saveLayer 849x126
+ <...>-18964 (-----) [004] ...1 683202.264153: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.264271: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18988 (-----) [003] ...1 683202.264282: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18964 (-----) [004] ...1 683202.264291: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
+ <...>-18964 (-----) [004] ...1 683202.264294: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.264297: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.264304: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
+ <...>-18964 (-----) [004] ...1 683202.264307: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.264309: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18988 (-----) [003] ...1 683202.264323: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.264329: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18964 (-----) [004] ...1 683202.264355: tracing_mark_write: B|18926|flush drawing commands
+ <...>-18988 (-----) [003] ...1 683202.264370: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.264377: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.264389: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18988 (-----) [003] ...1 683202.264395: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18988 (-----) [003] ...1 683202.264401: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.264408: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18988 (-----) [003] ...1 683202.264411: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.264416: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18988 (-----) [003] ...1 683202.264439: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.264444: tracing_mark_write: E
+ <...>-18989 (-----) [003] ...1 683202.264476: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18989 (-----) [003] ...1 683202.264483: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18989 (-----) [003] ...1 683202.264491: tracing_mark_write: E
+ <...>-18989 (-----) [003] ...1 683202.264498: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18989 (-----) [003] ...1 683202.264507: tracing_mark_write: E
+ <...>-18989 (-----) [003] ...1 683202.264513: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18989 (-----) [003] ...1 683202.264532: tracing_mark_write: E
+ <...>-18989 (-----) [003] ...1 683202.264538: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.264793: tracing_mark_write: B|18926|tessellatePath
+ <...>-18964 (-----) [004] ...1 683202.264799: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18964 (-----) [004] ...1 683202.264818: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.264828: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.264877: tracing_mark_write: B|18926|tessellatePath
+ <...>-18964 (-----) [004] ...1 683202.264881: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18964 (-----) [004] ...1 683202.264890: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.264896: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.265471: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.266007: tracing_mark_write: C|18926|hwui_Texture|4035928
+ <...>-18964 (-----) [004] ...1 683202.266013: tracing_mark_write: C|18926|hwui_Texture_count|163
+ <...>-18964 (-----) [004] ...1 683202.266018: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
+ <...>-18964 (-----) [004] ...1 683202.266023: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|3
+ <...>-18964 (-----) [004] ...1 683202.266027: tracing_mark_write: C|18926|hwui_Layer|0
+ <...>-18964 (-----) [004] ...1 683202.266031: tracing_mark_write: C|18926|hwui_Layer_count|0
+ <...>-18964 (-----) [004] ...1 683202.266086: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.266092: tracing_mark_write: B|18926|dispatchFrameCallbacks
+ <...>-18964 (-----) [004] ...1 683202.266095: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.266099: tracing_mark_write: B|18926|drainDisplayEventQueue
+ <...>-18964 (-----) [004] ...1 683202.266107: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.279197: tracing_mark_write: B|18926|drainDisplayEventQueue
+ <...>-18964 (-----) [005] ...1 683202.279278: tracing_mark_write: B|18926|queue mFrameCallbackTask
+ <...>-18964 (-----) [005] ...1 683202.279290: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.279292: tracing_mark_write: E
+ <...>-18926 (-----) [005] ...1 683202.280270: tracing_mark_write: B|18926|Choreographer#doFrame
+ <...>-18926 (-----) [005] ...1 683202.280317: tracing_mark_write: B|18926|input
+ <...>-18926 (-----) [005] ...1 683202.280361: tracing_mark_write: E
+ <...>-18926 (-----) [005] ...1 683202.280373: tracing_mark_write: B|18926|animation
+ <...>-18926 (-----) [005] ...1 683202.280645: tracing_mark_write: E
+ <...>-18926 (-----) [005] ...1 683202.280659: tracing_mark_write: B|18926|traversal
+ <...>-18926 (-----) [005] ...1 683202.280703: tracing_mark_write: B|18926|draw
+ <...>-18926 (-----) [005] ...1 683202.280735: tracing_mark_write: B|18926|Record View#draw()
+ <...>-18964 (-----) [004] ...1 683202.281109: tracing_mark_write: B|18926|notifyFramePending
+ <...>-18926 (-----) [005] ...1 683202.281109: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.281118: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.281131: tracing_mark_write: B|18926|DrawFrame
+ <...>-18964 (-----) [004] ...1 683202.281135: tracing_mark_write: B|18926|syncFrameState
+ <...>-18964 (-----) [004] ...1 683202.281160: tracing_mark_write: B|18926|prepareTree
+ <...>-18964 (-----) [004] ...1 683202.281328: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.281334: tracing_mark_write: E
+ <...>-18926 (-----) [005] ...1 683202.281376: tracing_mark_write: E
+ <...>-18926 (-----) [005] ...1 683202.281383: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.281387: tracing_mark_write: B|18926|computeOrdering
+ <...>-18926 (-----) [005] ...1 683202.281405: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.281422: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.281607: tracing_mark_write: B|18926|Button alpha caused saveLayer 849x126
+ <...>-18964 (-----) [004] ...1 683202.281612: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.281740: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18964 (-----) [004] ...1 683202.281751: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
+ <...>-18988 (-----) [003] ...1 683202.281754: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18964 (-----) [004] ...1 683202.281755: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.281764: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
+ <...>-18964 (-----) [004] ...1 683202.281766: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.281771: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.281783: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18988 (-----) [003] ...1 683202.281808: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.281815: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18964 (-----) [004] ...1 683202.281816: tracing_mark_write: B|18926|flush drawing commands
+ <...>-18988 (-----) [003] ...1 683202.281854: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.281861: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.281872: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18988 (-----) [003] ...1 683202.281878: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18988 (-----) [003] ...1 683202.281885: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.281891: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18988 (-----) [003] ...1 683202.281895: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.281900: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18988 (-----) [003] ...1 683202.281919: tracing_mark_write: E
+ <...>-18988 (-----) [003] ...1 683202.281924: tracing_mark_write: E
+ <...>-18989 (-----) [003] ...1 683202.281958: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18989 (-----) [003] ...1 683202.281965: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18989 (-----) [003] ...1 683202.281975: tracing_mark_write: E
+ <...>-18989 (-----) [003] ...1 683202.281982: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18989 (-----) [003] ...1 683202.281993: tracing_mark_write: E
+ <...>-18989 (-----) [003] ...1 683202.281999: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18989 (-----) [003] ...1 683202.282018: tracing_mark_write: E
+ <...>-18989 (-----) [003] ...1 683202.282024: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.282331: tracing_mark_write: B|18926|tessellatePath
+ <...>-18964 (-----) [004] ...1 683202.282338: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18964 (-----) [004] ...1 683202.282357: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.282367: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.282425: tracing_mark_write: B|18926|tessellatePath
+ <...>-18964 (-----) [004] ...1 683202.282429: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18964 (-----) [004] ...1 683202.282438: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.282444: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.283093: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.283996: tracing_mark_write: C|18926|hwui_Texture|4035928
+ <...>-18964 (-----) [004] ...1 683202.284005: tracing_mark_write: C|18926|hwui_Texture_count|163
+ <...>-18964 (-----) [004] ...1 683202.284011: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
+ <...>-18964 (-----) [004] ...1 683202.284016: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|3
+ <...>-18964 (-----) [004] ...1 683202.284020: tracing_mark_write: C|18926|hwui_Layer|0
+ <...>-18964 (-----) [004] ...1 683202.284025: tracing_mark_write: C|18926|hwui_Layer_count|0
+ <...>-18964 (-----) [004] ...1 683202.284112: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.284119: tracing_mark_write: B|18926|dispatchFrameCallbacks
+ <...>-18964 (-----) [004] ...1 683202.284121: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.284125: tracing_mark_write: B|18926|drainDisplayEventQueue
+ <...>-18964 (-----) [004] ...1 683202.284135: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.295969: tracing_mark_write: B|18926|drainDisplayEventQueue
+ <...>-18964 (-----) [004] ...1 683202.296010: tracing_mark_write: B|18926|queue mFrameCallbackTask
+ <...>-18964 (-----) [004] ...1 683202.296019: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.296021: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.297071: tracing_mark_write: B|18926|Choreographer#doFrame
+ <...>-18926 (-----) [004] ...1 683202.297129: tracing_mark_write: B|18926|input
+ <...>-18926 (-----) [004] ...1 683202.297210: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.297224: tracing_mark_write: B|18926|animation
+ <...>-18926 (-----) [004] ...1 683202.297739: tracing_mark_write: S|18926|animator|122130055
+ <...>-18926 (-----) [004] ...1 683202.297847: tracing_mark_write: S|18926|animator|172949940
+ <...>-18926 (-----) [004] ...1 683202.297932: tracing_mark_write: S|18926|animator|190890461
+ <...>-18926 (-----) [004] ...1 683202.298010: tracing_mark_write: S|18926|animator|20058450
+ <...>-18926 (-----) [004] ...1 683202.298087: tracing_mark_write: S|18926|animator|184847395
+ <...>-18926 (-----) [004] ...1 683202.298200: tracing_mark_write: S|18926|animator|162825504
+ <...>-18926 (-----) [004] ...1 683202.298288: tracing_mark_write: S|18926|animator|153919193
+ <...>-18926 (-----) [004] ...1 683202.298327: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.298340: tracing_mark_write: B|18926|traversal
+ <...>-18926 (-----) [004] ...1 683202.298377: tracing_mark_write: B|18926|draw
+ <...>-18926 (-----) [004] ...1 683202.298402: tracing_mark_write: B|18926|Record View#draw()
+ <...>-18964 (-----) [005] ...1 683202.298521: tracing_mark_write: B|18926|dispatchFrameCallbacks
+ <...>-18964 (-----) [005] ...1 683202.298566: tracing_mark_write: B|18926|prepareAndDraw
+ <...>-18964 (-----) [005] ...1 683202.298580: tracing_mark_write: B|18926|prepareTree
+ <...>-18926 (-----) [004] ...1 683202.298754: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.298770: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.298832: tracing_mark_write: B|18926|computeOrdering
+ <...>-18964 (-----) [005] ...1 683202.298903: tracing_mark_write: E
+ <...>-18988 (-----) [000] ...1 683202.299039: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18988 (-----) [000] ...1 683202.299052: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18988 (-----) [000] ...1 683202.299068: tracing_mark_write: E
+ <...>-18988 (-----) [000] ...1 683202.299079: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18964 (-----) [005] ...1 683202.299087: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
+ <...>-18964 (-----) [005] ...1 683202.299090: tracing_mark_write: E
+ <...>-18988 (-----) [000] ...1 683202.299099: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.299100: tracing_mark_write: B|18926|LinearLayout alpha caused saveLayer 1080x189
+ <...>-18964 (-----) [005] ...1 683202.299103: tracing_mark_write: E
+ <...>-18988 (-----) [000] ...1 683202.299108: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18964 (-----) [005] ...1 683202.299153: tracing_mark_write: B|18926|flush drawing commands
+ <...>-18988 (-----) [000] ...1 683202.299155: tracing_mark_write: E
+ <...>-18988 (-----) [000] ...1 683202.299162: tracing_mark_write: E
+ <...>-18988 (-----) [000] ...1 683202.299178: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18988 (-----) [000] ...1 683202.299184: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18988 (-----) [000] ...1 683202.299191: tracing_mark_write: E
+ <...>-18988 (-----) [000] ...1 683202.299198: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18988 (-----) [000] ...1 683202.299201: tracing_mark_write: E
+ <...>-18988 (-----) [000] ...1 683202.299207: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18988 (-----) [000] ...1 683202.299227: tracing_mark_write: E
+ <...>-18988 (-----) [000] ...1 683202.299233: tracing_mark_write: E
+ <...>-18989 (-----) [000] ...1 683202.299267: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18989 (-----) [000] ...1 683202.299274: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18989 (-----) [000] ...1 683202.299284: tracing_mark_write: E
+ <...>-18989 (-----) [000] ...1 683202.299291: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18989 (-----) [000] ...1 683202.299307: tracing_mark_write: E
+ <...>-18989 (-----) [000] ...1 683202.299313: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18989 (-----) [000] ...1 683202.299334: tracing_mark_write: E
+ <...>-18989 (-----) [000] ...1 683202.299339: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.299552: tracing_mark_write: B|18926|tessellatePath
+ <...>-18964 (-----) [005] ...1 683202.299559: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18964 (-----) [005] ...1 683202.299576: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.299587: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.299659: tracing_mark_write: B|18926|tessellatePath
+ <...>-18964 (-----) [005] ...1 683202.299663: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18964 (-----) [005] ...1 683202.299672: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.299678: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.299902: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.301062: tracing_mark_write: C|18926|hwui_Texture|4035928
+ <...>-18964 (-----) [005] ...1 683202.301075: tracing_mark_write: C|18926|hwui_Texture_count|163
+ <...>-18964 (-----) [005] ...1 683202.301084: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
+ <...>-18964 (-----) [005] ...1 683202.301094: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|3
+ <...>-18964 (-----) [005] ...1 683202.301103: tracing_mark_write: C|18926|hwui_Layer|0
+ <...>-18964 (-----) [005] ...1 683202.301112: tracing_mark_write: C|18926|hwui_Layer_count|0
+ <...>-18964 (-----) [005] ...1 683202.301214: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.301220: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.301231: tracing_mark_write: B|18926|notifyFramePending
+ <...>-18964 (-----) [005] ...1 683202.301236: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.301247: tracing_mark_write: B|18926|DrawFrame
+ <...>-18964 (-----) [005] ...1 683202.301254: tracing_mark_write: B|18926|syncFrameState
+ <...>-18964 (-----) [005] ...1 683202.301281: tracing_mark_write: B|18926|prepareTree
+ <...>-18964 (-----) [005] ...1 683202.301489: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.301497: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.301520: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.301537: tracing_mark_write: B|18926|drainDisplayEventQueue
+ <...>-18964 (-----) [005] ...1 683202.301557: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.301798: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.301813: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.301858: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.312850: tracing_mark_write: B|18926|drainDisplayEventQueue
+ <...>-18964 (-----) [005] ...1 683202.312883: tracing_mark_write: B|18926|queue mFrameCallbackTask
+ <...>-18964 (-----) [005] ...1 683202.312896: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.312900: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.313023: tracing_mark_write: B|18926|Choreographer#doFrame
+ <...>-18926 (-----) [004] ...1 683202.313069: tracing_mark_write: B|18926|input
+ <...>-18926 (-----) [004] ...1 683202.313105: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.313125: tracing_mark_write: B|18926|animation
+ <...>-18926 (-----) [004] ...1 683202.313914: tracing_mark_write: F|18926|animator|46267553
+ <...>-18926 (-----) [004] ...1 683202.314201: tracing_mark_write: F|18926|animator|219664070
+ <...>-18926 (-----) [004] ...1 683202.314488: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.314515: tracing_mark_write: B|18926|traversal
+ <...>-18926 (-----) [004] ...1 683202.314638: tracing_mark_write: B|18926|draw
+ <...>-18926 (-----) [004] ...1 683202.314704: tracing_mark_write: B|18926|Record View#draw()
+ <...>-18964 (-----) [005] ...1 683202.314999: tracing_mark_write: B|18926|notifyFramePending
+ <...>-18964 (-----) [005] ...1 683202.315016: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.315048: tracing_mark_write: B|18926|dispatchFrameCallbacks
+ <...>-18964 (-----) [005] ...1 683202.315053: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.315061: tracing_mark_write: B|18926|drainDisplayEventQueue
+ <...>-18964 (-----) [005] ...1 683202.315072: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.315243: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.315872: tracing_mark_write: B|18926|DrawFrame
+ <...>-18964 (-----) [005] ...1 683202.315882: tracing_mark_write: B|18926|syncFrameState
+ <...>-18964 (-----) [005] ...1 683202.315916: tracing_mark_write: B|18926|prepareTree
+ <...>-18964 (-----) [005] ...1 683202.316177: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.316188: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.316281: tracing_mark_write: B|18926|computeOrdering
+ <...>-18964 (-----) [005] ...1 683202.316338: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.316502: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18988 (-----) [001] ...1 683202.316515: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18988 (-----) [001] ...1 683202.316532: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.316543: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18988 (-----) [001] ...1 683202.316560: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.316568: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18926 (-----) [004] ...1 683202.316571: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.316575: tracing_mark_write: B|18926|Button alpha caused saveLayer 849x126
+ <...>-18964 (-----) [005] ...1 683202.316581: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.316585: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.316608: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.316673: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.316834: tracing_mark_write: C|18926|jitterNanos|5552900
+ <...>-18926 (-----) [004] ...1 683202.316973: tracing_mark_write: B|18926|commit
+ <...>-18989 (-----) [001] ...1 683202.316982: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18964 (-----) [005] ...1 683202.316984: tracing_mark_write: B|18926|flush drawing commands
+ <...>-18989 (-----) [001] ...1 683202.316992: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18989 (-----) [001] ...1 683202.317003: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.317010: tracing_mark_write: E
+ <...>-18989 (-----) [001] ...1 683202.317013: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18989 (-----) [001] ...1 683202.317026: tracing_mark_write: E
+ <...>-18989 (-----) [001] ...1 683202.317032: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18926 (-----) [004] ...1 683202.317040: tracing_mark_write: E
+ <...>-18989 (-----) [001] ...1 683202.317054: tracing_mark_write: E
+ <...>-18989 (-----) [001] ...1 683202.317060: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.317090: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18988 (-----) [001] ...1 683202.317096: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18988 (-----) [001] ...1 683202.317103: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.317111: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18988 (-----) [001] ...1 683202.317115: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.317120: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18988 (-----) [001] ...1 683202.317141: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.317146: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.317779: tracing_mark_write: B|18926|tessellatePath
+ <...>-18964 (-----) [005] ...1 683202.317790: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18964 (-----) [005] ...1 683202.317823: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.317844: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.317935: tracing_mark_write: B|18926|tessellatePath
+ <...>-18964 (-----) [005] ...1 683202.317944: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18964 (-----) [005] ...1 683202.317964: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.317977: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.319029: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.319801: tracing_mark_write: C|18926|hwui_Texture|4035928
+ <...>-18964 (-----) [005] ...1 683202.319813: tracing_mark_write: C|18926|hwui_Texture_count|163
+ <...>-18964 (-----) [005] ...1 683202.319822: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
+ <...>-18964 (-----) [005] ...1 683202.319832: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|3
+ <...>-18964 (-----) [005] ...1 683202.319841: tracing_mark_write: C|18926|hwui_Layer|0
+ <...>-18964 (-----) [005] ...1 683202.319850: tracing_mark_write: C|18926|hwui_Layer_count|0
+ <...>-18964 (-----) [005] ...1 683202.319939: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.320015: tracing_mark_write: B|18926|drainDisplayEventQueue
+ <...>-18964 (-----) [005] ...1 683202.320033: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.329503: tracing_mark_write: B|18926|drainDisplayEventQueue
+ <...>-18964 (-----) [005] ...1 683202.329538: tracing_mark_write: B|18926|queue mFrameCallbackTask
+ <...>-18964 (-----) [005] ...1 683202.329557: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.329562: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.329759: tracing_mark_write: B|18926|Choreographer#doFrame
+ <...>-18926 (-----) [004] ...1 683202.329819: tracing_mark_write: B|18926|input
+ <...>-18926 (-----) [004] ...1 683202.329857: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.329877: tracing_mark_write: B|18926|animation
+ <...>-18926 (-----) [004] ...1 683202.330409: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.330434: tracing_mark_write: B|18926|traversal
+ <...>-18926 (-----) [004] ...1 683202.330505: tracing_mark_write: B|18926|draw
+ <...>-18926 (-----) [004] ...1 683202.330553: tracing_mark_write: B|18926|Record View#draw()
+ <...>-18926 (-----) [004] ...1 683202.331128: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.331212: tracing_mark_write: B|18926|notifyFramePending
+ <...>-18964 (-----) [004] ...1 683202.331227: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.331237: tracing_mark_write: B|18926|DrawFrame
+ <...>-18964 (-----) [004] ...1 683202.331245: tracing_mark_write: B|18926|syncFrameState
+ <...>-18964 (-----) [004] ...1 683202.331281: tracing_mark_write: B|18926|prepareTree
+ <...>-18964 (-----) [004] ...1 683202.331518: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.331539: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.331639: tracing_mark_write: B|18926|computeOrdering
+ <...>-18964 (-----) [004] ...1 683202.331700: tracing_mark_write: E
+ <...>-18926 (-----) [005] ...1 683202.331876: tracing_mark_write: E
+ <...>-18926 (-----) [005] ...1 683202.331892: tracing_mark_write: E
+ <...>-18926 (-----) [005] ...1 683202.331933: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.331988: tracing_mark_write: B|18926|Button alpha caused saveLayer 849x126
+ <...>-18964 (-----) [004] ...1 683202.331994: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.332075: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18988 (-----) [001] ...1 683202.332088: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18988 (-----) [001] ...1 683202.332107: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.332119: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18988 (-----) [001] ...1 683202.332136: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.332143: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18988 (-----) [001] ...1 683202.332189: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.332195: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.332319: tracing_mark_write: B|18926|flush drawing commands
+ <...>-18989 (-----) [001] ...1 683202.332349: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18989 (-----) [001] ...1 683202.332357: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18989 (-----) [001] ...1 683202.332368: tracing_mark_write: E
+ <...>-18989 (-----) [001] ...1 683202.332376: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18989 (-----) [001] ...1 683202.332385: tracing_mark_write: E
+ <...>-18989 (-----) [001] ...1 683202.332391: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18989 (-----) [001] ...1 683202.332412: tracing_mark_write: E
+ <...>-18989 (-----) [001] ...1 683202.332417: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.332446: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18988 (-----) [001] ...1 683202.332453: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18988 (-----) [001] ...1 683202.332459: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.332466: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18988 (-----) [001] ...1 683202.332469: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.332475: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18988 (-----) [001] ...1 683202.332499: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.332504: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.333108: tracing_mark_write: B|18926|tessellatePath
+ <...>-18964 (-----) [004] ...1 683202.333119: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18964 (-----) [004] ...1 683202.333156: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.333176: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.333267: tracing_mark_write: B|18926|tessellatePath
+ <...>-18964 (-----) [004] ...1 683202.333362: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18964 (-----) [004] ...1 683202.333387: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.333405: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.334671: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.335531: tracing_mark_write: C|18926|hwui_Texture|4035928
+ <...>-18964 (-----) [004] ...1 683202.335544: tracing_mark_write: C|18926|hwui_Texture_count|163
+ <...>-18964 (-----) [004] ...1 683202.335554: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
+ <...>-18964 (-----) [004] ...1 683202.335563: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|3
+ <...>-18964 (-----) [004] ...1 683202.335572: tracing_mark_write: C|18926|hwui_Layer|0
+ <...>-18964 (-----) [004] ...1 683202.335582: tracing_mark_write: C|18926|hwui_Layer_count|0
+ <...>-18964 (-----) [004] ...1 683202.335733: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.335745: tracing_mark_write: B|18926|dispatchFrameCallbacks
+ <...>-18964 (-----) [004] ...1 683202.335749: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.335757: tracing_mark_write: B|18926|drainDisplayEventQueue
+ <...>-18964 (-----) [004] ...1 683202.335773: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.344870: tracing_mark_write: B|18926|drainDisplayEventQueue
+ <...>-18964 (-----) [004] ...1 683202.344923: tracing_mark_write: B|18926|queue mFrameCallbackTask
+ <...>-18964 (-----) [004] ...1 683202.344939: tracing_mark_write: E
+ <...>-18964 (-----) [004] ...1 683202.344943: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.346588: tracing_mark_write: B|18926|Choreographer#doFrame
+ <...>-18926 (-----) [004] ...1 683202.346695: tracing_mark_write: B|18926|input
+ <...>-18926 (-----) [004] ...1 683202.346761: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.346782: tracing_mark_write: B|18926|animation
+ <...>-18926 (-----) [004] ...1 683202.347462: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.347492: tracing_mark_write: B|18926|traversal
+ <...>-18926 (-----) [004] ...1 683202.347562: tracing_mark_write: B|18926|draw
+ <...>-18926 (-----) [004] ...1 683202.347603: tracing_mark_write: B|18926|Record View#draw()
+ <...>-18964 (-----) [005] ...1 683202.348107: tracing_mark_write: B|18926|notifyFramePending
+ <...>-18964 (-----) [005] ...1 683202.348120: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.348131: tracing_mark_write: B|18926|dispatchFrameCallbacks
+ <...>-18964 (-----) [005] ...1 683202.348135: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.348143: tracing_mark_write: B|18926|drainDisplayEventQueue
+ <...>-18964 (-----) [005] ...1 683202.348155: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.348158: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.348226: tracing_mark_write: B|18926|DrawFrame
+ <...>-18964 (-----) [005] ...1 683202.348235: tracing_mark_write: B|18926|syncFrameState
+ <...>-18964 (-----) [005] ...1 683202.348270: tracing_mark_write: B|18926|prepareTree
+ <...>-18964 (-----) [005] ...1 683202.348510: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.348519: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.348615: tracing_mark_write: B|18926|computeOrdering
+ <...>-18964 (-----) [005] ...1 683202.348675: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.348863: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.348877: tracing_mark_write: E
+ <...>-18926 (-----) [004] ...1 683202.348910: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.348946: tracing_mark_write: B|18926|Button alpha caused saveLayer 849x126
+ <...>-18964 (-----) [005] ...1 683202.348953: tracing_mark_write: E
+ <...>-18988 (-----) [000] ...1 683202.348986: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18988 (-----) [000] ...1 683202.348999: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18988 (-----) [000] ...1 683202.349018: tracing_mark_write: E
+ <...>-18988 (-----) [000] ...1 683202.349030: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18988 (-----) [000] ...1 683202.349049: tracing_mark_write: E
+ <...>-18988 (-----) [000] ...1 683202.349056: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18988 (-----) [000] ...1 683202.349096: tracing_mark_write: E
+ <...>-18988 (-----) [000] ...1 683202.349103: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.349254: tracing_mark_write: B|18926|flush drawing commands
+ <...>-18989 (-----) [001] ...1 683202.349316: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18989 (-----) [001] ...1 683202.349326: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18989 (-----) [001] ...1 683202.349338: tracing_mark_write: E
+ <...>-18989 (-----) [001] ...1 683202.349346: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18989 (-----) [001] ...1 683202.349359: tracing_mark_write: E
+ <...>-18989 (-----) [001] ...1 683202.349365: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18989 (-----) [001] ...1 683202.349386: tracing_mark_write: E
+ <...>-18989 (-----) [001] ...1 683202.349392: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.349424: tracing_mark_write: B|18926|shadow tessellation
+ <...>-18988 (-----) [001] ...1 683202.349430: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18988 (-----) [001] ...1 683202.349438: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.349445: tracing_mark_write: B|18926|tessellateAmbientShadow
+ <...>-18988 (-----) [001] ...1 683202.349448: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.349454: tracing_mark_write: B|18926|tessellateSpotShadow
+ <...>-18988 (-----) [001] ...1 683202.349473: tracing_mark_write: E
+ <...>-18988 (-----) [001] ...1 683202.349479: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.350099: tracing_mark_write: B|18926|tessellatePath
+ <...>-18964 (-----) [005] ...1 683202.350115: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18964 (-----) [005] ...1 683202.350172: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.350197: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.350339: tracing_mark_write: B|18926|tessellatePath
+ <...>-18964 (-----) [005] ...1 683202.350349: tracing_mark_write: B|18926|approximatePathOutlineVertices
+ <...>-18964 (-----) [005] ...1 683202.350368: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.350381: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.351526: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.352548: tracing_mark_write: C|18926|hwui_Texture|4035928
+ <...>-18964 (-----) [005] ...1 683202.352562: tracing_mark_write: C|18926|hwui_Texture_count|163
+ <...>-18964 (-----) [005] ...1 683202.352571: tracing_mark_write: C|18926|hwui_OffscreenBuffer|0
+ <...>-18964 (-----) [005] ...1 683202.352580: tracing_mark_write: C|18926|hwui_OffscreenBuffer_count|3
+ <...>-18964 (-----) [005] ...1 683202.352589: tracing_mark_write: C|18926|hwui_Layer|0
+ <...>-18964 (-----) [005] ...1 683202.352599: tracing_mark_write: C|18926|hwui_Layer_count|0
+ <...>-18964 (-----) [005] ...1 683202.352734: tracing_mark_write: E
+ <...>-18964 (-----) [005] ...1 683202.352745: tracing_mark_write: B|18926|drainDisplayEventQueue
+ <...>-18964 (-----) [005] ...1 683202.352760: tracing_mark_write: E
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/profile-chrome_systrace_perf_chrome_data b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/profile-chrome_systrace_perf_chrome_data
new file mode 100644
index 0000000..3ef0b90
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/test_data/profile-chrome_systrace_perf_chrome_data
@@ -0,0 +1 @@
+{"traceEvents": [{"tdur": 460, "name": "MessageLoop::RunTask", "tts": 6016200, "args": {"src_func": "PushOntoImmediateIncomingQueueLocked", "src_file": "../../components/scheduler/base/task_queue_impl.cc"}, "pid": 13931, "ts": 196489505302, "cat": "toplevel", "tid": 13956, "ph": "X", "dur": 463}, {"tdur": 412, "name": "TaskQueueManager::DoWork", "tts": 6016243, "args": {"from_main_thread": false}, "pid": 13931, "ts": 196489505345, "cat": "renderer.scheduler", "tid": 13956, "ph": "X", "dur": 415}, {"tdur": 113, "name": "TaskQueueManager::ProcessTaskFromWorkQueue", "tts": 6016280, "args": {"src_func": "SetEnabled", "src_file": "../../base/trace_event/trace_log.cc"}, "pid": 13931, "ts": 196489505382, "cat": "toplevel", "tid": 13956, "ph": "X", "dur": 117}, {"name": "FrameBlameContext", "tts": 6016311, "args": {}, "pid": 13931, "ts": 196489505414, "cat": "blink", "tid": 13956, "scope": "PlatformThread", "ph": "(", "id": "0x3684"}, {"tdur": 71, "name": "TaskQueueManager::RunTask", "tts": 6016318, "args": {"queue": "default_tq"}, "pid": 13931, "ts": 196489505421, "cat": "renderer.scheduler", "tid": 13956, "ph": "X", "dur": 74}, {"name": "TopLevel", "tts": 6016332, "args": {"snapshot": {}}, "pid": 13931, "ts": 196489505434, "cat": "blink", "tid": 13956, "scope": "PlatformThread", "ph": "O", "id": "0x3684"}, {"name": "FrameBlameContext", "tts": 6016382, "args": {}, "pid": 13931, "ts": 196489505483, "cat": "blink", "tid": 13956, "scope": "PlatformThread", "ph": ")", "id": "0x3684"}, {"tdur": 87, "name": "TaskQueueManager::ProcessTaskFromWorkQueue", "tts": 6016413, "args": {"src_func": "SetEnabled", "src_file": "../../base/trace_event/trace_log.cc"}, "pid": 13931, "ts": 196489505515, "cat": "toplevel", "tid": 13956, "ph": "X", "dur": 91}, {"name": "FrameBlameContext", "tts": 6016441, "args": {}, "pid": 13931, "ts": 196489505543, "cat": "blink", "tid": 13956, "scope": "PlatformThread", "ph": "(", "id": "0x3684"}, {"tdur": 48, "name": "TaskQueueManager::RunTask", "tts": 6016447, "args": {"queue": "default_tq"}, "pid": 13931, "ts": 196489505550, "cat": "renderer.scheduler", "tid": 13956, "ph": "X", "dur": 51}], "stackFrames": {"2850": {"category": "Kernel", "name": "datagram_poll", "parent": 2573}, "2853": {"category": "Android", "name": "android::IPCThreadState::IPCThreadState()", "parent": 152}, "1523": {"category": "Kernel", "name": "update_clk_statistics", "parent": 1522}, "2855": {"category": "Java", "name": "art::mirror::PrimitiveArray<unsigned char>::SetArrayClass(art::mirror::Class*)"}, "1993": {"category": "Kernel", "name": "_find_next_bit_le"}, "2857": {"category": "Kernel", "name": "__put_task_struct", "parent": 2856}, "2856": {"category": "Kernel", "name": "delayed_put_task_struct", "parent": 541}, "1490": {"category": "Kernel", "name": "__rcu_read_unlock", "parent": 1194}, "1397": {"category": "Kernel", "name": "msm_rpm_send_smd_buffer", "parent": 1396}, "1492": {"category": "Kernel", "name": "kgsl_iommu_default_setstate", "parent": 1143}, "1493": {"category": "Kernel", "name": "_raw_spin_lock", "parent": 126}, "1494": {"category": "libinputflinger.so", "name": "android::EventHub::mapKey(int, int, int, int*, unsigned int*) const"}, "1495": {"category": "Standard Lib", "name": "je_free"}, "1496": {"category": "liboverlay.so", "name": "overlay::Overlay::configBegin()", "parent": 1495}, "1396": {"category": "Kernel", "name": "msm_rpm_send_data.isra.11", "parent": 1395}, "1498": {"category": "Kernel", "name": "schedule_hrtimeout_range", "parent": 1497}, "1499": {"category": "Kernel", "name": "schedule_hrtimeout_range_clock", "parent": 1498}, "3339": {"category": "Kernel", "name": "force_quiescent_state", "parent": 3338}, "3338": {"category": "Kernel", "name": "rcu_process_callbacks", "parent": 3337}, "1395": {"category": "Kernel", "name": "msm_rpm_send_request", "parent": 1394}, "4189": {"category": "libz.so", "name": "inflate_fast"}, "1994": {"category": "Kernel", "name": "up_read", "parent": 28}, "1700": {"category": "GPU Driver", "name": "gsl_memory_write"}, "1701": {"category": "GPU Driver", "name": "leia_end_tiling"}, "1702": {"category": "Kernel", "name": "tracing_mark_write", "parent": 59}, "1394": {"category": "Kernel", "name": "msm_bus_rpm_req.constprop.2", "parent": 1393}, "1704": {"category": "Android", "name": "android::SortedVector<android::key_value_pair_t<android::wp<android::IBinder>, android::HeapCache::heap_info_t> >::do_move_backward(void*, void const*, unsigned int) const"}, "1705": {"category": "Standard Lib", "name": "epoll_pwait"}, "1706": {"category": "Kernel", "name": "dpcm_dapm_stream_event", "parent": 1689}, "1707": {"category": "Kernel", "name": "snd_soc_dapm_rtd_stream_event", "parent": 1706}, "1708": {"category": "Kernel", "name": "widget_stream_event", "parent": 1707}, "1393": {"category": "Kernel", "name": "msm_bus_rpm_commit_arb.isra.1", "parent": 1392}, "1996": {"category": "Kernel", "name": "schedule", "parent": 1569}, "4572": {"category": "libc++_shared.so", "name": "std::__1::ios_base::~ios_base()"}, "1392": {"category": "Kernel", "name": "msm_bus_remote_hw_commit", "parent": 1391}, "4573": {"category": "Kernel", "name": "fput", "parent": 53}, "1391": {"category": "Kernel", "name": "msm_bus_bimc_commit", "parent": 1390}, "3217": {"category": "Kernel", "name": "msm_bus_fabric_clk_set", "parent": 3216}, "1390": {"category": "Kernel", "name": "msm_bus_fabric_hw_commit", "parent": 1389}, "4188": {"category": "libgpu.cr.so", "name": "gpu::gles2::GLES2DecoderImpl::RestoreState(gpu::gles2::ContextState const*)"}, "3659": {"category": "Kernel", "name": "__ocmem_allocate_range", "parent": 3658}, "1128": {"category": "Kernel", "name": "put_cred_rcu", "parent": 541}, "1129": {"category": "Kernel", "name": "kmem_cache_free", "parent": 1128}, "1628": {"category": "Kernel", "name": "kgsl_iommu_unmap", "parent": 1627}, "4576": {"category": "Java", "name": "art::JNI::ReleaseBooleanArrayElements(_JNIEnv*, _jbooleanArray*, unsigned char*, int)"}, "3813": {"category": "Kernel", "name": "regulator_disable", "parent": 3812}, "1120": {"category": "Standard Lib", "name": "sendto"}, "1121": {"category": "Java", "name": "artAllocStringFromBytesFromCodeRegion"}, "1122": {"category": "Android", "name": "android::IPCThreadState::decStrongHandle(int)", "parent": 152}, "1123": {"category": "Android", "name": "android::BpMemory::getMemory(int*, unsigned int*) const"}, "1124": {"category": "GPU Driver", "name": "oxili_configure_depthcontrol"}, "1125": {"category": "Android", "name": "android::BufferedTextOutput::popBundle()"}, "1126": {"category": "Kernel", "name": "_test_and_set_bit", "parent": 83}, "1127": {"category": "thermal-engine-hh", "name": "[unknown]"}, "4490": {"category": "Kernel", "name": "__schedule", "parent": 4489}, "4579": {"category": "libc++_shared.so", "name": "std::__1::num_put<char, std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> > >::do_put(std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> >, std::__1::ios_base&, char, long) const"}, "2989": {"category": "Kernel", "name": "tty_release", "parent": 51}, "2988": {"category": "Kernel", "name": "kmem_cache_alloc", "parent": 2987}, "3029": {"category": "Kernel", "name": "prepare_to_wait", "parent": 3028}, "3028": {"category": "Kernel", "name": "dhd_pno_stop_for_gscan", "parent": 2102}, "2983": {"category": "Kernel", "name": "kfree", "parent": 2982}, "2982": {"category": "Kernel", "name": "binder_deferred_func", "parent": 35}, "2981": {"category": "Kernel", "name": "__mutex_lock_slowpath", "parent": 2980}, "2980": {"category": "Kernel", "name": "mutex_lock", "parent": 2979}, "2987": {"category": "Kernel", "name": "split_vma", "parent": 2293}, "2986": {"category": "Kernel", "name": "__slab_free", "parent": 2985}, "2985": {"category": "Kernel", "name": "kmem_cache_free", "parent": 2984}, "2984": {"category": "Kernel", "name": "remove_vma", "parent": 2973}, "524": {"category": "Kernel", "name": "rcu_idle_enter", "parent": 200}, "525": {"category": "Standard Lib", "name": "sigemptyset"}, "526": {"category": "Kernel", "name": "skb_free_datagram", "parent": 284}, "527": {"category": "Kernel", "name": "consume_skb", "parent": 526}, "520": {"category": "Kernel", "name": "run_rebalance_domains", "parent": 519}, "521": {"category": "Kernel", "name": "rebalance_domains", "parent": 520}, "522": {"category": "Kernel", "name": "load_balance", "parent": 521}, "523": {"category": "Kernel", "name": "cpumask_next_and", "parent": 522}, "1014": {"category": "Java", "name": "art::mirror::Class::SetStatus(art::Handle<art::mirror::Class>, art::mirror::Class::Status, art::Thread*)"}, "1015": {"category": "Kernel", "name": "sg_next", "parent": 159}, "1016": {"category": "GPU Driver", "name": "leia_primitive_clear"}, "1017": {"category": "Standard Lib", "name": "memmove"}, "528": {"category": "Kernel", "name": "__kfree_skb", "parent": 527}, "529": {"category": "Kernel", "name": "skb_release_head_state", "parent": 528}, "1012": {"category": "Kernel", "name": "__schedule", "parent": 1011}, "1013": {"category": "Kernel", "name": "_raw_spin_unlock_irq", "parent": 1012}, "1234": {"category": "GPU Driver", "name": "eglMapImage"}, "1235": {"category": "Kernel", "name": "mutex_unlock", "parent": 391}, "1236": {"category": "Kernel", "name": "__mutex_unlock_slowpath", "parent": 1235}, "1237": {"category": "Kernel", "name": "gen_pool_alloc_aligned", "parent": 403}, "1230": {"category": "Standard Lib", "name": "strncmp"}, "1231": {"category": "libqmi_encdec.so", "name": "[unknown]"}, "1232": {"category": "base.odex", "name": "[unknown]"}, "1233": {"category": "Java", "name": "[unknown]", "parent": 1232}, "4196": {"category": "libcc.cr.so", "name": "cc::RollingTimeDeltaHistory::Percentile(double) const"}, "3957": {"category": "Android", "name": "android::BpBinder::BpBinder(int)"}, "4194": {"category": "Kernel", "name": "select_estimate_accuracy", "parent": 380}, "4195": {"category": "Kernel", "name": "ktime_get_ts", "parent": 4194}, "1238": {"category": "Kernel", "name": "set_bits_ll", "parent": 1237}, "1239": {"category": "Kernel", "name": "atomic_notifier_call_chain", "parent": 1146}, "4190": {"category": "libgpu.cr.so", "name": "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::append(char const*, unsigned int)"}, "3956": {"category": "Kernel", "name": "remove_vm_area", "parent": 3955}, "2526": {"category": "Kernel", "name": "__d_alloc", "parent": 2525}, "4358": {"category": "Kernel", "name": "mdss_mdp_smp_reserve", "parent": 592}, "3955": {"category": "Kernel", "name": "__vunmap", "parent": 3954}, "4354": {"category": "Kernel", "name": "kmap_atomic", "parent": 4353}, "4355": {"category": "Kernel", "name": "kmap_high_get", "parent": 4354}, "4356": {"category": "Kernel", "name": "_raw_spin_unlock_irqrestore", "parent": 4355}, "3954": {"category": "Kernel", "name": "vfree", "parent": 1558}, "3167": {"category": "Kernel", "name": "__alloc_skb", "parent": 3166}, "4351": {"category": "Kernel", "name": "__inc_zone_page_state", "parent": 4350}, "4352": {"category": "Kernel", "name": "__inc_zone_state", "parent": 4351}, "4353": {"category": "Kernel", "name": "v6_clear_user_highpage_nonaliasing", "parent": 4349}, "4310": {"category": "libgpu.cr.so", "name": "[unknown]", "parent": 4309}, "438": {"category": "Kernel", "name": "kgsl_add_fence_event", "parent": 437}, "439": {"category": "Kernel", "name": "sync_fence_create", "parent": 438}, "436": {"category": "Android", "name": "android::RefBase::weakref_type::decWeak(void const*)"}, "437": {"category": "Kernel", "name": "kgsl_ioctl_timestamp_event", "parent": 386}, "434": {"category": "Standard Lib", "name": "pthread_create"}}, "samples": [{"name": "cycles:HG", "weight": 297850, "ts": 196493621870.241, "cpu": 2, "comm": "ksoftirqd/2", "tid": 14106, "sf": 539}, {"name": "cycles:HG", "weight": 1132096, "ts": 196493621938.626, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132116, "ts": 196493622439.043, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1130919, "ts": 196493622938.678, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1130876, "ts": 196493623438.105, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1130876, "ts": 196493623937.897, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131083, "ts": 196493624437.22, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131128, "ts": 196493624936.074, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131320, "ts": 196493625435.918, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131601, "ts": 196493625937.48, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131734, "ts": 196493626435.918, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131397, "ts": 196493626935.397, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 437658, "ts": 196493626987.168, "cpu": 0, "comm": "swapper", "tid": 0, "sf": 77}, {"name": "cycles:HG", "weight": 1131678, "ts": 196493627436.126, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131929, "ts": 196493627935.762, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131710, "ts": 196493628435.605, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131799, "ts": 196493628934.772, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131829, "ts": 196493629434.407, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131977, "ts": 196493629934.772, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132199, "ts": 196493630434.824, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132038, "ts": 196493630934.668, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131980, "ts": 196493631434.772, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 437658, "ts": 196493631773.105, "cpu": 0, "comm": "surfaceflinger", "tid": 235, "sf": 48}, {"name": "cycles:HG", "weight": 348651, "ts": 196493631851.855, "cpu": 2, "comm": "ksoftirqd/2", "tid": 14106, "sf": 3005}, {"name": "cycles:HG", "weight": 1131995, "ts": 196493631939.668, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 275538, "ts": 196493631973.626, "cpu": 2, "comm": "ndroid.systemui", "tid": 965, "sf": 152}, {"name": "cycles:HG", "weight": 386273, "ts": 196493632025.553, "cpu": 0, "comm": "swapper", "tid": 0, "sf": 77}, {"name": "cycles:HG", "weight": 242822, "ts": 196493632086.282, "cpu": 2, "comm": "swapper", "tid": 0, "sf": 524}, {"name": "cycles:HG", "weight": 306050, "ts": 196493632162.48, "cpu": 0, "comm": "ksoftirqd/0", "tid": 3, "sf": 84}, {"name": "cycles:HG", "weight": 1131861, "ts": 196493632439.928, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1130548, "ts": 196493632938.105, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1130563, "ts": 196493633438.366, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1130932, "ts": 196493633937.637, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1130919, "ts": 196493634437.22, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131082, "ts": 196493634936.491, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131230, "ts": 196493635435.501, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131407, "ts": 196493635935.293, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131717, "ts": 196493636434.72, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131747, "ts": 196493636934.72, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 343424, "ts": 196493637077.272, "cpu": 0, "comm": "swapper", "tid": 0, "sf": 77}, {"name": "cycles:HG", "weight": 1131954, "ts": 196493637435.501, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131911, "ts": 196493637934.824, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 457251, "ts": 196493638301.23, "cpu": 0, "comm": "sensors.qcom", "tid": 973, "sf": 5}, {"name": "cycles:HG", "weight": 1131824, "ts": 196493638434.928, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 405911, "ts": 196493638480.189, "cpu": 0, "comm": "system_server", "tid": 844, "sf": 3006}, {"name": "cycles:HG", "weight": 337207, "ts": 196493638558.053, "cpu": 2, "comm": "system_server", "tid": 885, "sf": 584}, {"name": "cycles:HG", "weight": 375907, "ts": 196493638727.376, "cpu": 0, "comm": "r.ScannerThread", "tid": 14164, "sf": 409}, {"name": "cycles:HG", "weight": 482221, "ts": 196493638770.449, "cpu": 2, "comm": ".gms.persistent", "tid": 13885, "sf": 24}, {"name": "cycles:HG", "weight": 1131898, "ts": 196493638935.501, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131870, "ts": 196493639434.668, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131680, "ts": 196493639934.355, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131916, "ts": 196493640434.355, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132034, "ts": 196493640935.189, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132034, "ts": 196493641434.095, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131888, "ts": 196493641937.897, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 459973, "ts": 196493641989.147, "cpu": 0, "comm": "swapper", "tid": 0, "sf": 77}, {"name": "cycles:HG", "weight": 426602, "ts": 196493642392.116, "cpu": 2, "comm": "swapper", "tid": 0, "sf": 204}, {"name": "cycles:HG", "weight": 1132137, "ts": 196493642437.168, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131128, "ts": 196493642936.751, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131261, "ts": 196493643436.491, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131335, "ts": 196493643936.803, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131394, "ts": 196493644435.762, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131336, "ts": 196493644935.97, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131602, "ts": 196493645435.605, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131662, "ts": 196493645935.137, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131736, "ts": 196493646434.46, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131810, "ts": 196493646935.345, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132017, "ts": 196493647436.699, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131739, "ts": 196493647935.345, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131417, "ts": 196493648434.147, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 468491, "ts": 196493648580.449, "cpu": 0, "comm": "swapper", "tid": 0, "sf": 73}, {"name": "cycles:HG", "weight": 446158, "ts": 196493648862.585, "cpu": 2, "comm": "ndroid.systemui", "tid": 965, "sf": 152}, {"name": "cycles:HG", "weight": 1131831, "ts": 196493648934.564, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132141, "ts": 196493649434.824, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132025, "ts": 196493649934.616, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131982, "ts": 196493650434.251, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131968, "ts": 196493650935.241, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132057, "ts": 196493651434.512, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 398089, "ts": 196493651839.824, "cpu": 2, "comm": "ksoftirqd/2", "tid": 14106, "sf": 84}, {"name": "cycles:HG", "weight": 418907, "ts": 196493651861.074, "cpu": 0, "comm": "ksoftirqd/0", "tid": 3, "sf": 1699}, {"name": "cycles:HG", "weight": 1131926, "ts": 196493651937.22, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131921, "ts": 196493652437.949, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131233, "ts": 196493652936.855, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131087, "ts": 196493653435.866, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131309, "ts": 196493653935.866, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131590, "ts": 196493654435.814, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131562, "ts": 196493654935.449, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131607, "ts": 196493655435.397, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131710, "ts": 196493655935.605, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131740, "ts": 196493656434.616, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131653, "ts": 196493656934.72, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 331059, "ts": 196493657041.855, "cpu": 0, "comm": "swapper", "tid": 0, "sf": 77}, {"name": "cycles:HG", "weight": 1131993, "ts": 196493657435.189, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131906, "ts": 196493657933.939, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 295985, "ts": 196493658029.98, "cpu": 0, "comm": "kworker/u:2", "tid": 13922, "sf": 34}, {"name": "cycles:HG", "weight": 262559, "ts": 196493658147.637, "cpu": 0, "comm": "sensors.qcom", "tid": 973, "sf": 534}, {"name": "cycles:HG", "weight": 246341, "ts": 196493658256.595, "cpu": 0, "comm": "system_server", "tid": 840, "sf": 2330}, {"name": "cycles:HG", "weight": 314916, "ts": 196493658369.616, "cpu": 2, "comm": "system_server", "tid": 885, "sf": 454}, {"name": "cycles:HG", "weight": 1131848, "ts": 196493658434.46, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 346814, "ts": 196493658469.928, "cpu": 0, "comm": "r.ScannerThread", "tid": 14164, "sf": 1262}, {"name": "cycles:HG", "weight": 282163, "ts": 196493658493.314, "cpu": 2, "comm": "system_server", "tid": 809, "sf": 480}, {"name": "cycles:HG", "weight": 249595, "ts": 196493658604.616, "cpu": 2, "comm": ".gms.persistent", "tid": 13885, "sf": 1186}, {"name": "cycles:HG", "weight": 1132099, "ts": 196493658934.407, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132012, "ts": 196493659435.189, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131969, "ts": 196493659935.137, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131764, "ts": 196493660434.303, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131868, "ts": 196493660934.98, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132045, "ts": 196493661433.835, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131884, "ts": 196493661938.21, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 502401, "ts": 196493661992.532, "cpu": 0, "comm": "swapper", "tid": 0, "sf": 77}, {"name": "cycles:HG", "weight": 344348, "ts": 196493662348.418, "cpu": 2, "comm": "swapper", "tid": 0, "sf": 204}, {"name": "cycles:HG", "weight": 1132124, "ts": 196493662438.366, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1130985, "ts": 196493662938.105, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1130913, "ts": 196493663437.532, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1130987, "ts": 196493663937.168, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131105, "ts": 196493664435.657, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131208, "ts": 196493664935.762, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131637, "ts": 196493665436.282, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 439774, "ts": 196493665612.064, "cpu": 2, "comm": "ndroid.systemui", "tid": 965, "sf": 834}, {"name": "cycles:HG", "weight": 1131609, "ts": 196493665936.699, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131536, "ts": 196493666434.72, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131523, "ts": 196493666934.564, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 525437, "ts": 196493666979.303, "cpu": 0, "comm": "swapper", "tid": 0, "sf": 77}, {"name": "cycles:HG", "weight": 1131893, "ts": 196493667436.491, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131908, "ts": 196493667934.199, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131542, "ts": 196493668434.928, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132075, "ts": 196493668934.876, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132003, "ts": 196493669434.095, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131857, "ts": 196493669934.043, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132064, "ts": 196493670434.199, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132109, "ts": 196493670934.564, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132051, "ts": 196493671434.668, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131979, "ts": 196493671938.939, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 469080, "ts": 196493671981.387, "cpu": 0, "comm": "swapper", "tid": 0, "sf": 77}, {"name": "cycles:HG", "weight": 313399, "ts": 196493672291.595, "cpu": 2, "comm": "swapper", "tid": 0, "sf": 1060}, {"name": "cycles:HG", "weight": 1131941, "ts": 196493672438.574, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1130831, "ts": 196493672937.793, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1130831, "ts": 196493673436.491, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131038, "ts": 196493673936.178, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131393, "ts": 196493674436.491, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131511, "ts": 196493674936.647, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131394, "ts": 196493675435.866, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131424, "ts": 196493675935.397, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131557, "ts": 196493676435.449, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131690, "ts": 196493676935.553, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 370528, "ts": 196493677103.47, "cpu": 0, "comm": "swapper", "tid": 0, "sf": 77}, {"name": "cycles:HG", "weight": 1131764, "ts": 196493677435.605, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 328843, "ts": 196493677897.741, "cpu": 0, "comm": "sensors.qcom", "tid": 973, "sf": 3009}, {"name": "cycles:HG", "weight": 1131647, "ts": 196493677934.928, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 291752, "ts": 196493678027.949, "cpu": 0, "comm": "system_server", "tid": 840, "sf": 1004}, {"name": "cycles:HG", "weight": 278245, "ts": 196493678150.293, "cpu": 0, "comm": "system_server", "tid": 844, "sf": 48}, {"name": "cycles:HG", "weight": 313399, "ts": 196493678267.376, "cpu": 2, "comm": "system_server", "tid": 885, "sf": 2046}, {"name": "cycles:HG", "weight": 377236, "ts": 196493678367.741, "cpu": 0, "comm": "r.ScannerThread", "tid": 14164, "sf": 409}, {"name": "cycles:HG", "weight": 277158, "ts": 196493678389.251, "cpu": 2, "comm": ".gms.persistent", "tid": 13885, "sf": 3010}, {"name": "cycles:HG", "weight": 1131750, "ts": 196493678435.397, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131839, "ts": 196493678934.46, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131722, "ts": 196493679434.407, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131944, "ts": 196493679935.345, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1132003, "ts": 196493680434.772, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131725, "ts": 196493680934.772, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1131902, "ts": 196493681434.46, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 245413, "ts": 196493681847.428, "cpu": 2, "comm": "swapper", "tid": 0, "sf": 524}, {"name": "cycles:HG", "weight": 1131902, "ts": 196493681938.001, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 521979, "ts": 196493681991.699, "cpu": 0, "comm": "swapper", "tid": 0, "sf": 77}, {"name": "cycles:HG", "weight": 304608, "ts": 196493682404.616, "cpu": 2, "comm": "ndroid.systemui", "tid": 965, "sf": 1191}, {"name": "cycles:HG", "weight": 1131941, "ts": 196493682438.678, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 272039, "ts": 196493682524.303, "cpu": 2, "comm": "ndroid.systemui", "tid": 965, "sf": 24}, {"name": "cycles:HG", "weight": 268553, "ts": 196493682649.928, "cpu": 2, "comm": "swapper", "tid": 0, "sf": 204}, {"name": "cycles:HG", "weight": 1130903, "ts": 196493682938.366, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1130772, "ts": 196493683437.324, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 607013, "ts": 196493683841.543, "cpu": 0, "comm": "dhd_dpc", "tid": 125, "sf": 3021}, {"name": "cycles:HG", "weight": 1130861, "ts": 196493683936.959, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 541605, "ts": 196493684080.137, "cpu": 0, "comm": "wpa_supplicant", "tid": 1108, "sf": 3022}, {"name": "cycles:HG", "weight": 1126514, "ts": 196493684083.678, "cpu": 3, "comm": "system_server", "tid": 1103, "sf": 1024}, {"name": "cycles:HG", "weight": 1131127, "ts": 196493684437.376, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 492206, "ts": 196493684605.709, "cpu": 0, "comm": "swapper", "tid": 0, "sf": 77}, {"name": "cycles:HG", "weight": 559558, "ts": 196493684824.824, "cpu": 0, "comm": "dhd_dpc", "tid": 125, "sf": 3025}, {"name": "cycles:HG", "weight": 1050347, "ts": 196493684920.605, "cpu": 3, "comm": "system_server", "tid": 924, "sf": 1887}, {"name": "cycles:HG", "weight": 1131216, "ts": 196493684935.605, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 272}, {"name": "cycles:HG", "weight": 1050347, "ts": 196493685385.241, "cpu": 3, "comm": "system_server", "tid": 924, "sf": 152}, {"name": "cycles:HG", "weight": 1131114, "ts": 196493685435.241, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 997507, "ts": 196493685826.178, "cpu": 3, "comm": "system_server", "tid": 924, "sf": 905}, {"name": "cycles:HG", "weight": 1131617, "ts": 196493685935.032, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1007073, "ts": 196493686270.345, "cpu": 3, "comm": "system_server", "tid": 924, "sf": 3026}, {"name": "cycles:HG", "weight": 1131691, "ts": 196493686435.293, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1023885, "ts": 196493686722.428, "cpu": 3, "comm": "system_server", "tid": 924, "sf": 3027}, {"name": "cycles:HG", "weight": 1131721, "ts": 196493686934.72, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1039957, "ts": 196493687182.897, "cpu": 3, "comm": "system_server", "tid": 924, "sf": 2356}, {"name": "cycles:HG", "weight": 1131780, "ts": 196493687436.074, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 1053686, "ts": 196493687647.428, "cpu": 3, "comm": "system_server", "tid": 924, "sf": 2326}, {"name": "cycles:HG", "weight": 1131810, "ts": 196493687935.762, "cpu": 1, "comm": ".gms.persistent", "tid": 1660, "sf": 152}, {"name": "cycles:HG", "weight": 1065205, "ts": 196493688117.532, "cpu": 3, "comm": ".gms.persistent", "tid": 1729, "sf": 12}, {"name": "cycles:HG", "weight": 1131532, "ts": 196493688436.074, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 556143, "ts": 196493688570.345, "cpu": 0, "comm": ".gms.persistent", "tid": 1692, "sf": 1232}, {"name": "cycles:HG", "weight": 1075356, "ts": 196493688591.855, "cpu": 3, "comm": "system_server", "tid": 924, "sf": 3029}, {"name": "cycles:HG", "weight": 645259, "ts": 196493688855.137, "cpu": 0, "comm": ".gms.persistent", "tid": 1692, "sf": 152}, {"name": "cycles:HG", "weight": 1131680, "ts": 196493688935.032, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 575371, "ts": 196493689110.397, "cpu": 0, "comm": ".gms.persistent", "tid": 1692, "sf": 1378}, {"name": "cycles:HG", "weight": 629674, "ts": 196493689387.845, "cpu": 0, "comm": ".gms.persistent", "tid": 1692, "sf": 12}, {"name": "cycles:HG", "weight": 1131593, "ts": 196493689434.095, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 705297, "ts": 196493689699.824, "cpu": 0, "comm": ".gms.persistent", "tid": 1692, "sf": 905}, {"name": "cycles:HG", "weight": 1131800, "ts": 196493689934.407, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 775837, "ts": 196493690042.272, "cpu": 0, "comm": ".gms.persistent", "tid": 1692, "sf": 1232}, {"name": "cycles:HG", "weight": 834492, "ts": 196493690411.282, "cpu": 0, "comm": ".gms.persistent", "tid": 1692, "sf": 152}, {"name": "cycles:HG", "weight": 1132036, "ts": 196493690433.73, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 882321, "ts": 196493690800.814, "cpu": 0, "comm": ".gms.persistent", "tid": 1692, "sf": 3030}, {"name": "cycles:HG", "weight": 1131934, "ts": 196493690934.251, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 921577, "ts": 196493691209.407, "cpu": 0, "comm": ".gms.persistent", "tid": 1692, "sf": 1014}, {"name": "cycles:HG", "weight": 1132126, "ts": 196493691434.876, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 954187, "ts": 196493691630.501, "cpu": 0, "comm": "system_server", "tid": 2277, "sf": 152}, {"name": "cycles:HG", "weight": 374916, "ts": 196493691678.262, "cpu": 2, "comm": "system_server", "tid": 815, "sf": 2713}, {"name": "cycles:HG", "weight": 514732, "ts": 196493691913.782, "cpu": 2, "comm": "dhd_dpc", "tid": 125, "sf": 728}, {"name": "cycles:HG", "weight": 1131980, "ts": 196493691937.48, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 980963, "ts": 196493692076.803, "cpu": 0, "comm": ".gms.persistent", "tid": 1692, "sf": 3031}, {"name": "cycles:HG", "weight": 1083778, "ts": 196493692182.064, "cpu": 3, "comm": "swapper", "tid": 0, "sf": 524}, {"name": "cycles:HG", "weight": 407059, "ts": 196493692255.709, "cpu": 2, "comm": "swapper", "tid": 0, "sf": 201}, {"name": "cycles:HG", "weight": 1131786, "ts": 196493692438.782, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 464437, "ts": 196493692462.168, "cpu": 2, "comm": "system_server", "tid": 1419, "sf": 24}, {"name": "cycles:HG", "weight": 956095, "ts": 196493692503.939, "cpu": 0, "comm": "system_server", "tid": 808, "sf": 380}, {"name": "cycles:HG", "weight": 491108, "ts": 196493692678.991, "cpu": 2, "comm": "lmkd", "tid": 192, "sf": 1053}, {"name": "cycles:HG", "weight": 578691, "ts": 196493692934.98, "cpu": 2, "comm": "system_server", "tid": 1419, "sf": 2261}, {"name": "cycles:HG", "weight": 1131069, "ts": 196493692936.282, "cpu": 1, "comm": ".gms.persistent", "tid": 1375, "sf": 1479}, {"name": "cycles:HG", "weight": 673045, "ts": 196493693233.626, "cpu": 2, "comm": "system_server", "tid": 1436, "sf": 2382}, {"name": "cycles:HG", "weight": 970459, "ts": 196493693301.439, "cpu": 0, "comm": "system_server", "tid": 2979, "sf": 152}, {"name": "cycles:HG", "weight": 1130952, "ts": 196493693437.584, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 753340, "ts": 196493693568.678, "cpu": 2, "comm": "swapper", "tid": 0, "sf": 204}, {"name": "cycles:HG", "weight": 990963, "ts": 196493693739.564, "cpu": 0, "comm": "system_server", "tid": 802, "sf": 152}, {"name": "cycles:HG", "weight": 1131425, "ts": 196493693939.564, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 816721, "ts": 196493694022.324, "cpu": 2, "comm": "system_server", "tid": 1202, "sf": 152}, {"name": "cycles:HG", "weight": 1018311, "ts": 196493694280.709, "cpu": 3, "comm": ".gms.persistent", "tid": 1692, "sf": 3031}, {"name": "cycles:HG", "weight": 944745, "ts": 196493694318.262, "cpu": 0, "comm": "dhd_dpc", "tid": 125, "sf": 718}, {"name": "cycles:HG", "weight": 1131132, "ts": 196493694436.907, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 866886, "ts": 196493694583.314, "cpu": 2, "comm": "system_server", "tid": 31585, "sf": 152}, {"name": "cycles:HG", "weight": 1130561, "ts": 196493694935.605, "cpu": 1, "comm": ".gms.persistent", "tid": 27896, "sf": 24}, {"name": "cycles:HG", "weight": 877972, "ts": 196493694970.709, "cpu": 2, "comm": "system_server", "tid": 31585, "sf": 1885}, {"name": "cycles:HG", "weight": 908751, "ts": 196493695255.397, "cpu": 3, "comm": ".gms.persistent", "tid": 1692, "sf": 1518}, {"name": "cycles:HG", "weight": 961487, "ts": 196493695255.97, "cpu": 0, "comm": ".gms.persistent", "tid": 1581, "sf": 2579}, {"name": "cycles:HG", "weight": 1131391, "ts": 196493695438.939, "cpu": 1, "comm": ".gms.persistent", "tid": 3490, "sf": 152}, {"name": "cycles:HG", "weight": 866087, "ts": 196493695617.793, "cpu": 2, "comm": "swapper", "tid": 0, "sf": 204}, {"name": "cycles:HG", "weight": 822225, "ts": 196493695626.959, "cpu": 3, "comm": "system_server", "tid": 3435, "sf": 3036}, {"name": "cycles:HG", "weight": 945135, "ts": 196493695725.449, "cpu": 0, "comm": "system_server", "tid": 2276, "sf": 152}, {"name": "cycles:HG", "weight": 1131701, "ts": 196493695938.991, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 772163, "ts": 196493696069.512, "cpu": 3, "comm": ".gms.persistent", "tid": 1692, "sf": 24}, {"name": "cycles:HG", "weight": 889986, "ts": 196493696117.949, "cpu": 0, "comm": "system_server", "tid": 807, "sf": 152}, {"name": "cycles:HG", "weight": 1130736, "ts": 196493696437.168, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 897232, "ts": 196493696514.147, "cpu": 0, "comm": "system_server", "tid": 1428, "sf": 20}, {"name": "cycles:HG", "weight": 805509, "ts": 196493696757.064, "cpu": 3, "comm": ".gms.persistent", "tid": 1363, "sf": 2326}, {"name": "cycles:HG", "weight": 927988, "ts": 196493696926.022, "cpu": 0, "comm": "system_server", "tid": 2277, "sf": 152}, {"name": "cycles:HG", "weight": 1130736, "ts": 196493696940.501, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 897462, "ts": 196493696952.064, "cpu": 2, "comm": "system_server", "tid": 1419, "sf": 24}, {"name": "cycles:HG", "weight": 818607, "ts": 196493697124.147, "cpu": 3, "comm": ".gms.persistent", "tid": 1363, "sf": 447}, {"name": "cycles:HG", "weight": 958379, "ts": 196493697357.012, "cpu": 0, "comm": "system_server", "tid": 2979, "sf": 12}, {"name": "cycles:HG", "weight": 1131180, "ts": 196493697440.293, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 872027, "ts": 196493697586.959, "cpu": 2, "comm": "system_server", "tid": 1436, "sf": 152}, {"name": "cycles:HG", "weight": 983975, "ts": 196493697792.689, "cpu": 0, "comm": "sensors.qcom", "tid": 819, "sf": 2017}, {"name": "cycles:HG", "weight": 1130230, "ts": 196493697939.928, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 803857, "ts": 196493697942.376, "cpu": 2, "comm": ".gms.persistent", "tid": 1363, "sf": 192}, {"name": "cycles:HG", "weight": 1003687, "ts": 196493698237.116, "cpu": 0, "comm": ".gms.persistent", "tid": 1636, "sf": 1232}, {"name": "cycles:HG", "weight": 782509, "ts": 196493698288.105, "cpu": 2, "comm": "system_server", "tid": 1202, "sf": 19}, {"name": "cycles:HG", "weight": 1130334, "ts": 196493698438.678, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 822340, "ts": 196493698651.699, "cpu": 2, "comm": ".gms.persistent", "tid": 1363, "sf": 3038}, {"name": "cycles:HG", "weight": 1022348, "ts": 196493698687.012, "cpu": 0, "comm": "system_server", "tid": 807, "sf": 1256}, {"name": "cycles:HG", "weight": 1130541, "ts": 196493698938.782, "cpu": 1, "comm": "system_server", "tid": 807, "sf": 3039}, {"name": "cycles:HG", "weight": 790673, "ts": 196493699002.168, "cpu": 3, "comm": "system_server", "tid": 3435, "sf": 3041}, {"name": "cycles:HG", "weight": 868186, "ts": 196493699036.855, "cpu": 2, "comm": "system_server", "tid": 1414, "sf": 841}, {"name": "cycles:HG", "weight": 1038294, "ts": 196493699151.803, "cpu": 0, "comm": "surfaceflinger", "tid": 235, "sf": 48}, {"name": "cycles:HG", "weight": 826537, "ts": 196493699369.459, "cpu": 3, "comm": "system_server", "tid": 3435, "sf": 152}, {"name": "cycles:HG", "weight": 1130748, "ts": 196493699439.147, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 908964, "ts": 196493699439.459, "cpu": 2, "comm": "ndroid.systemui", "tid": 965, "sf": 24}, {"name": "cycles:HG", "weight": 1052615, "ts": 196493699622.116, "cpu": 0, "comm": "system_server", "tid": 1428, "sf": 450}, {"name": "cycles:HG", "weight": 750727, "ts": 196493699702.793, "cpu": 3, "comm": "system_server", "tid": 2978, "sf": 24}, {"name": "cycles:HG", "weight": 942863, "ts": 196493699855.032, "cpu": 2, "comm": ".gms.persistent", "tid": 1363, "sf": 1754}, {"name": "cycles:HG", "weight": 1130940, "ts": 196493699938.834, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 784670, "ts": 196493700050.241, "cpu": 3, "comm": "system_server", "tid": 807, "sf": 12}, {"name": "cycles:HG", "weight": 1062662, "ts": 196493700157.012, "cpu": 0, "comm": "system_server", "tid": 1428, "sf": 938}, {"name": "cycles:HG", "weight": 971451, "ts": 196493700288.366, "cpu": 2, "comm": "system_server", "tid": 2979, "sf": 3047}, {"name": "cycles:HG", "weight": 833621, "ts": 196493700418.887, "cpu": 3, "comm": ".gms.persistent", "tid": 1692, "sf": 1232}, {"name": "cycles:HG", "weight": 1130750, "ts": 196493700436.595, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}, {"name": "cycles:HG", "weight": 879395, "ts": 196493700810.709, "cpu": 3, "comm": "system_server", "tid": 804, "sf": 3054}, {"name": "cycles:HG", "weight": 1130898, "ts": 196493700936.751, "cpu": 1, "comm": "ileged_process1", "tid": 14138, "sf": 3}], "metadata": {"network-type": "WiFi", "gpu-gl-vendor": "Qualcomm", "gpu-psver": "3.00", "field-trials": ["853359fa-f7de5af1", "236d5d9e-fecfffa1", "e036a196-3f4a17df", "77207729-3f4a17df", "4bf94d2-15606520", "2a33b90e-3f4a17df", "ba3f87da-92cc81ec", "46da3e07-3f4a17df", "1ce8a192-3f4a17df", "3fbe5359-3f4a17df", "43d0dd1e-3f4a17df", "10667b28-e2bc4126", "6ce7d7b5-3f4a17df", "93731dca-3f4a17df", "64cbdfc2-3f4a17df", "b7786474-d93a0620", "158a87f-3f4a17df", "868bda90-3f4a17df", "2182dcae-37a58975", "4ea303a6-3f4a17df", "826d6cab-96e3ef3c", "8b4d89aa-3f4a17df", "30e679f-3f4a17df", "f2cb3653-c2fe0862", "867c4c68-3f4a17df", "d747916f-d747916f", "77d0f131-df0c9747", "2f40feb6-3f4a17df", "dd139bd7-3f4a17df", "fe05be5f-4ad60575"], "product-version": "Chrome/53.0.2784.0", "gpu-vsver": "3.00", "user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA59G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2784.0 Mobile Safari/537.36", "os-arch": "armv7l", "os-version": "6.0.0", "gpu-gl-renderer": "Adreno (TM) 330", "num-cpus": 4, "gpu-driver": "127.0", "clock-domain": "LINUX_CLOCK_MONOTONIC", "physical-memory": 1854, "cpu-model": 0, "cpu-family": 0, "highres-ticks": true, "cpu-brand": "RMv7 Processor rev 0 (v7l)", "cpu-stepping": 0, "os-name": "Android"}} \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/trace_result.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/trace_result.py
new file mode 100644
index 0000000..11c78f7
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/trace_result.py
@@ -0,0 +1,17 @@
+#!/usr/bin/env python
+
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+'''Tracing agent result wrapper for systrace.
+
+This class represents the captured trace results from a particular
+tool (e.g. atrace, ftrace.)
+'''
+
+
+class TraceResult(object):
+ def __init__(self, source_name, raw_data):
+ self.source_name = source_name
+ self.raw_data = raw_data
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/__init__.py
new file mode 100644
index 0000000..859d779
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/__init__.py
@@ -0,0 +1,91 @@
+#!/usr/bin/env python
+
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+'''Tracing agent interface for systrace.
+
+This class represents an agent that captures traces from a particular
+tool (e.g. atrace, ftrace.)
+'''
+
+# Timeout interval constants.
+
+START_STOP_TIMEOUT = 10.0
+GET_RESULTS_TIMEOUT = 30.0
+
+
+class TracingConfig(object):
+ '''Store the tracing configuration options for all Systrace agents. If there
+ are ever any options that are to be shared between all of the agents, those
+ options should go here.
+ '''
+ def __init__(self):
+ pass
+
+
+class TracingAgent(object):
+ def __init__(self):
+ pass
+
+ def StartAgentTracing(self, config, timeout=None):
+ '''Starts running the trace for this agent. Stops with timeout if
+ not completed within timeout interval.
+
+ Args:
+ config: TracingConfig subclass containing agent-specific options
+ and categories.
+ timeout: Timeout interval in seconds.
+
+ Returns:
+ Boolean value indicating whether or not the trace started successfully.
+ '''
+ pass
+
+ def StopAgentTracing(self, timeout=None):
+ '''Stops running the trace for this agent and returns immediately.
+ Stops with timeout if not completed within timeout interval.
+
+ Args:
+ timeout: Timeout interval in seconds.
+
+ Returns:
+ Boolean value indicating whether or not the trace started successfully.
+ '''
+ pass
+
+ def SupportsExplicitClockSync(self):
+ '''Find out if this agent supports recording of clock sync markers.
+
+ Returns:
+ Boolean value indicating whether this agent supports recording
+ of clock sync markers.
+ '''
+ raise NotImplementedError
+
+ def RecordClockSyncMarker(self, sync_id, did_record_sync_marker_callback):
+ '''Record a clock sync marker for this agent.
+
+ Args:
+ sync_id: Clock sync ID string.
+ did_record_sync_marker_callback: Callback function to call
+ (with arguments: timestamp and sync_id) after the
+ clock sync marker is recorded.
+ '''
+ raise NotImplementedError
+
+ def GetResults(self, timeout=None):
+ '''Get the completed trace for this agent, stopping with timeout
+
+ Get the completed trace for this agent. Call only after
+ StopAgentTracing is done. This function blocks until the result
+ is collected (note; this may take several seconds). Stops with timeout
+ if not completed within self._options.collection_timeout seconds.
+
+ Args:
+ timeout: Timeout interval in seconds.
+ Returns:
+ Completed trace for this agent.
+ '''
+ pass
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/agents_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/agents_unittest.py
new file mode 100644
index 0000000..74498bd
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/agents_unittest.py
@@ -0,0 +1,50 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import unittest
+
+from systrace import util
+
+from devil.android import device_utils
+from devil.android.sdk import intent
+from devil.android.sdk import keyevent
+
+
+class BaseAgentTest(unittest.TestCase):
+ def setUp(self):
+ devices = device_utils.DeviceUtils.HealthyDevices()
+ self.browser = 'stable'
+ self.package_info = util.get_supported_browsers()[self.browser]
+ self.device = devices[0]
+
+ curr_browser = self.GetChromeProcessID()
+ if curr_browser == None:
+ self.StartBrowser()
+
+ def tearDown(self):
+ # Stop the browser after each test to ensure that it doesn't interfere
+ # with subsequent tests, e.g. by holding the devtools socket open.
+ self.device.ForceStop(self.package_info.package)
+
+ def StartBrowser(self):
+ # Turn on the device screen.
+ self.device.SetScreen(True)
+
+ # Unlock device.
+ self.device.SendKeyEvent(keyevent.KEYCODE_MENU)
+
+ # Start browser.
+ self.device.StartActivity(
+ intent.Intent(activity=self.package_info.activity,
+ package=self.package_info.package,
+ data='about:blank',
+ extras={'create_new_tab': True}),
+ blocking=True, force_stop=True)
+
+ def GetChromeProcessID(self):
+ chrome_processes = self.device.GetPids(self.package_info.package)
+ if (self.package_info.package in chrome_processes and
+ len(chrome_processes[self.package_info.package]) > 0):
+ return chrome_processes[self.package_info.package][0]
+ return None
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/android_process_data_agent.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/android_process_data_agent.py
new file mode 100644
index 0000000..1a40aea
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/android_process_data_agent.py
@@ -0,0 +1,89 @@
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# Tracing agent that captures friendly process and thread data - names, pids and
+# tids and names, etc to enrich display in the trace viewer. Captures snapshots
+# of the output of 'ps' on the device at intervals.
+
+import logging
+import py_utils
+
+from devil.android import device_utils
+from devil.android.device_errors import AdbShellCommandFailedError
+from systrace import tracing_agents
+from systrace import trace_result
+
+# Leftmost output columns match those used on legacy devices.
+# Get thread names separately as there may be spaces that breaks col
+# splitting.
+# TODO(benm): Refactor device_utils.GetPids to get threads and use that here.
+PS_COMMAND_PROC = "ps -A -o USER,PID,PPID,VSIZE,RSS,WCHAN,ADDR=PC,S,NAME,COMM" \
+ "&& ps -AT -o USER,PID,TID,CMD"
+
+# Fallback for old devices.
+PS_COMMAND_PROC_LEGACY = "ps && ps -t"
+
+# identify this as trace of thread / process state
+TRACE_HEADER = 'PROCESS DUMP\n'
+
+def try_create_agent(config):
+ if config.target != 'android':
+ return None
+ if config.from_file is not None:
+ return None
+ return AndroidProcessDataAgent()
+
+def get_config(options):
+ return options
+
+class AndroidProcessDataAgent(tracing_agents.TracingAgent):
+ def __init__(self):
+ super(AndroidProcessDataAgent, self).__init__()
+ self._trace_data = ""
+ self._device = None
+
+ def __repr__(self):
+ return 'android_process_data'
+
+ @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
+ def StartAgentTracing(self, config, timeout=None):
+ self._device = device_utils.DeviceUtils(config.device_serial_number)
+ self._trace_data += self._get_process_snapshot()
+ return True
+
+ @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
+ def StopAgentTracing(self, timeout=None):
+ self._trace_data += self._get_process_snapshot()
+ return True
+
+ @py_utils.Timeout(tracing_agents.GET_RESULTS_TIMEOUT)
+ def GetResults(self, timeout=None):
+ result = TRACE_HEADER + self._trace_data
+ return trace_result.TraceResult('androidProcessDump', result)
+
+ def SupportsExplicitClockSync(self):
+ return False
+
+ def RecordClockSyncMarker(self, sync_id, did_record_sync_marker_callback):
+ pass
+
+ def _get_process_snapshot(self):
+ use_legacy = False
+ try:
+ dump = self._device.RunShellCommand( \
+ PS_COMMAND_PROC, check_return=True, as_root=True, shell=True)
+ except AdbShellCommandFailedError:
+ use_legacy = True
+
+ # Check length of 2 as we execute two commands, which in case of failure
+ # on old devices output 1 line each.
+ if use_legacy or len(dump) == 2:
+ logging.debug('Couldn\'t parse ps dump, trying legacy method ...')
+ dump = self._device.RunShellCommand( \
+ PS_COMMAND_PROC_LEGACY, check_return=True, as_root=True, shell=True)
+ if len(dump) == 2:
+ logging.error('Unable to extract process data!')
+ return ""
+
+ return '\n'.join(dump) + '\n'
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/atrace_agent.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/atrace_agent.py
new file mode 100644
index 0000000..e7e15e9
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/atrace_agent.py
@@ -0,0 +1,451 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import optparse
+import py_utils
+import re
+import sys
+import threading
+import zlib
+
+from devil.android import device_utils
+from devil.android.sdk import version_codes
+from py_trace_event import trace_time as trace_time_module
+from systrace import trace_result
+from systrace import tracing_agents
+from systrace import util
+
+# Text that ADB sends, but does not need to be displayed to the user.
+ADB_IGNORE_REGEXP = r'^capturing trace\.\.\. done|^capturing trace\.\.\.'
+# The number of seconds to wait on output from ADB.
+ADB_STDOUT_READ_TIMEOUT = 0.2
+# The adb shell command to initiate a trace.
+ATRACE_BASE_ARGS = ['atrace']
+# If a custom list of categories is not specified, traces will include
+# these categories (if available on the device).
+DEFAULT_CATEGORIES = 'sched,freq,gfx,view,dalvik,webview,'\
+ 'input,disk,am,wm,rs,binder_driver'
+# The command to list trace categories.
+LIST_CATEGORIES_ARGS = ATRACE_BASE_ARGS + ['--list_categories']
+# Minimum number of seconds between displaying status updates.
+MIN_TIME_BETWEEN_STATUS_UPDATES = 0.2
+# ADB sends this text to indicate the beginning of the trace data.
+TRACE_START_REGEXP = r'TRACE\:'
+# Plain-text trace data should always start with this string.
+TRACE_TEXT_HEADER = '# tracer'
+_FIX_MISSING_TGIDS = True
+_FIX_CIRCULAR_TRACES = True
+
+
+def list_categories(config):
+ """List the possible trace event categories.
+
+ This function needs the tracing config since it needs to get the serial
+ number of the device to send a command to.
+
+ Args:
+ config: Tracing config.
+ """
+ devutils = device_utils.DeviceUtils(config.device_serial_number)
+ categories = devutils.RunShellCommand(
+ LIST_CATEGORIES_ARGS, check_return=True)
+
+ device_sdk_version = util.get_device_sdk_version()
+ if device_sdk_version < version_codes.MARSHMALLOW:
+ # work around platform bug where rs tag would corrupt trace until M(Api23)
+ categories = [c for c in categories if not re.match(r'^\s*rs\s*-', c)]
+
+ print '\n'.join(categories)
+ if not devutils.HasRoot():
+ print '\nNOTE: more categories may be available with adb root\n'
+
+
+def get_available_categories(config, device_sdk_version):
+ """Gets the list of atrace categories available for tracing.
+ Args:
+ config: Tracing config.
+ device_sdk_version: Sdk version int of device to be queried.
+ """
+ devutils = device_utils.DeviceUtils(config.device_serial_number)
+ categories_output = devutils.RunShellCommand(
+ LIST_CATEGORIES_ARGS, check_return=True)
+ categories = [c.split('-')[0].strip() for c in categories_output]
+
+ if device_sdk_version < version_codes.MARSHMALLOW:
+ # work around platform bug where rs tag would corrupt trace until M(Api23)
+ categories = [c for c in categories if c != 'rs']
+ return categories
+
+
+def try_create_agent(config):
+ """Create an Atrace agent.
+
+ Args:
+ config: Command line config.
+ """
+ if config.target != 'android':
+ return None
+ if config.from_file is not None:
+ return None
+
+ if not config.atrace_categories:
+ return None
+
+ # Check device SDK version.
+ device_sdk_version = util.get_device_sdk_version()
+ if device_sdk_version < version_codes.JELLY_BEAN_MR2:
+ print ('Device SDK versions < 18 (Jellybean MR2) not supported.\n'
+ 'Your device SDK version is %d.' % device_sdk_version)
+ return None
+
+ return AtraceAgent(device_sdk_version)
+
+def _construct_extra_atrace_args(config, categories):
+ """Construct extra arguments (-a, -k, categories) for atrace command.
+
+ Args:
+ config: Tracing config.
+ """
+ extra_args = []
+
+ if config.app_name is not None:
+ extra_args.extend(['-a', config.app_name])
+
+ if config.kfuncs is not None:
+ extra_args.extend(['-k', config.kfuncs])
+
+ extra_args.extend(categories)
+ return extra_args
+
+def _construct_atrace_args(config, categories):
+ """Builds the command used to invoke a trace process.
+ Returns:
+ A tuple where the first element is an array of command arguments, and
+ the second element is a boolean which will be true if the command will
+ stream trace data.
+ """
+ atrace_args = ATRACE_BASE_ARGS[:]
+
+ if config.compress_trace_data:
+ atrace_args.extend(['-z'])
+
+ if (config.trace_time is not None) and (config.trace_time > 0):
+ atrace_args.extend(['-t', str(config.trace_time)])
+
+ if (config.trace_buf_size is not None) and (config.trace_buf_size > 0):
+ atrace_args.extend(['-b', str(config.trace_buf_size)])
+
+ elif 'sched' in categories:
+ # 'sched' is a high-volume tag, double the default buffer size
+ # to accommodate that
+ atrace_args.extend(['-b', '4096'])
+ extra_args = _construct_extra_atrace_args(config, categories)
+
+ atrace_args.extend(extra_args)
+ return atrace_args
+
+
+class AtraceAgent(tracing_agents.TracingAgent):
+
+ def __init__(self, device_sdk_version):
+ super(AtraceAgent, self).__init__()
+ self._device_sdk_version = device_sdk_version
+ self._adb = None
+ self._trace_data = None
+ self._tracer_args = None
+ self._collection_thread = None
+ self._device_utils = None
+ self._device_serial_number = None
+ self._config = None
+ self._categories = None
+
+ def __repr__(self):
+ return 'atrace'
+
+ @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
+ def StartAgentTracing(self, config, timeout=None):
+ assert config.atrace_categories, 'Atrace categories are missing!'
+ self._config = config
+ self._categories = config.atrace_categories
+ if isinstance(self._categories, list):
+ self._categories = ','.join(self._categories)
+ avail_cats = get_available_categories(config, self._device_sdk_version)
+ unavailable = [x for x in self._categories.split(',') if
+ x not in avail_cats]
+ self._categories = [x for x in self._categories.split(',') if
+ x in avail_cats]
+ if unavailable:
+ print 'These categories are unavailable: ' + ' '.join(unavailable)
+ self._device_utils = device_utils.DeviceUtils(config.device_serial_number)
+ self._device_serial_number = config.device_serial_number
+ self._tracer_args = _construct_atrace_args(config,
+ self._categories)
+ self._device_utils.RunShellCommand(
+ self._tracer_args + ['--async_start'], check_return=True)
+ return True
+
+ def _collect_and_preprocess(self):
+ """Collects and preprocesses trace data.
+
+ Stores results in self._trace_data.
+ """
+ trace_data = self._collect_trace_data()
+ self._trace_data = self._preprocess_trace_data(trace_data)
+
+ @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
+ def StopAgentTracing(self, timeout=None):
+ """Stops tracing and starts collecting results.
+
+ To synchronously retrieve the results after calling this function,
+ call GetResults().
+ """
+ self._collection_thread = threading.Thread(
+ target=self._collect_and_preprocess)
+ self._collection_thread.start()
+ return True
+
+ @py_utils.Timeout(tracing_agents.GET_RESULTS_TIMEOUT)
+ def GetResults(self, timeout=None):
+ """Waits for collection thread to finish and returns trace results."""
+ self._collection_thread.join()
+ self._collection_thread = None
+ return trace_result.TraceResult('systemTraceEvents', self._trace_data)
+
+ def SupportsExplicitClockSync(self):
+ return True
+
+ def RecordClockSyncMarker(self, sync_id, did_record_sync_marker_callback):
+ """Records a clock sync marker.
+
+ Args:
+ sync_id: ID string for clock sync marker.
+ """
+ cmd = 'echo trace_event_clock_sync: name=%s >' \
+ ' /sys/kernel/debug/tracing/trace_marker' % sync_id
+ with self._device_utils.adb.PersistentShell(
+ self._device_serial_number) as shell:
+ t1 = trace_time_module.Now()
+ shell.RunCommand(cmd, close=True)
+ did_record_sync_marker_callback(t1, sync_id)
+
+ def _stop_trace(self):
+ """Stops atrace.
+
+ Note that prior to Api 23, --async-stop may not actually stop tracing.
+ Thus, this uses a fallback method of running a zero-length synchronous
+ trace if tracing is still on."""
+ self._device_utils.RunShellCommand(
+ self._tracer_args + ['--async_stop'], check_return=True)
+ is_trace_enabled_file = '/sys/kernel/debug/tracing/tracing_on'
+
+ if self._device_sdk_version < version_codes.MARSHMALLOW:
+ if int(self._device_utils.ReadFile(is_trace_enabled_file)):
+ # tracing was incorrectly left on, disable it
+ self._device_utils.RunShellCommand(
+ self._tracer_args + ['-t 0'], check_return=True)
+
+ def _collect_trace_data(self):
+ """Reads the output from atrace and stops the trace."""
+ dump_cmd = self._tracer_args + ['--async_dump']
+ result = self._device_utils.RunShellCommand(
+ dump_cmd, raw_output=True, large_output=True, check_return=True)
+
+ data_start = re.search(TRACE_START_REGEXP, result)
+ if data_start:
+ data_start = data_start.end(0)
+ else:
+ raise IOError('Unable to get atrace data. Did you forget adb root?')
+ output = re.sub(ADB_IGNORE_REGEXP, '', result[data_start:])
+ self._stop_trace()
+ return output
+
+ def _preprocess_trace_data(self, trace_data):
+ """Performs various processing on atrace data.
+
+ Args:
+ trace_data: The raw trace data.
+ Returns:
+ The processed trace data.
+ """
+ if trace_data:
+ trace_data = strip_and_decompress_trace(trace_data)
+
+ if not trace_data:
+ print >> sys.stderr, ('No data was captured. Output file was not '
+ 'written.')
+ sys.exit(1)
+
+ if _FIX_MISSING_TGIDS:
+ # Gather proc data from device and patch tgids
+ procfs_dump = self._device_utils.RunShellCommand(
+ 'echo -n /proc/[0-9]*/task/[0-9]*',
+ shell=True, check_return=True)[0].split(' ')
+ pid2_tgid = extract_tgids(procfs_dump)
+ trace_data = fix_missing_tgids(trace_data, pid2_tgid)
+
+ if _FIX_CIRCULAR_TRACES:
+ trace_data = fix_circular_traces(trace_data)
+
+ return trace_data
+
+def extract_tgids(trace_lines):
+ """Removes the procfs dump from the given trace text
+
+ Args:
+ trace_lines: The text portion of the trace
+
+ Returns:
+ a map of pids to their tgid.
+ """
+ tgid_2pid = {}
+ for line in trace_lines:
+ result = re.match('^/proc/([0-9]+)/task/([0-9]+)', line)
+ if result:
+ parent_pid, tgid = result.group(1, 2)
+ tgid_2pid[tgid] = parent_pid
+
+ return tgid_2pid
+
+
+def strip_and_decompress_trace(trace_data):
+ """Fixes new-lines and decompresses trace data.
+
+ Args:
+ trace_data: The trace data returned by atrace.
+ Returns:
+ The decompressed trace data.
+ """
+ # Collapse CRLFs that are added by adb shell.
+ if trace_data.startswith('\r\n'):
+ trace_data = trace_data.replace('\r\n', '\n')
+ elif trace_data.startswith('\r\r\n'):
+ # On windows, adb adds an extra '\r' character for each line.
+ trace_data = trace_data.replace('\r\r\n', '\n')
+
+ # Skip the initial newline.
+ if trace_data[0] == '\n':
+ trace_data = trace_data[1:]
+
+ if not trace_data.startswith(TRACE_TEXT_HEADER):
+ # No header found, so assume the data is compressed.
+ trace_data = zlib.decompress(trace_data)
+
+ # Enforce Unix line-endings.
+ trace_data = trace_data.replace('\r', '')
+
+ # Skip any initial newlines.
+ while trace_data and trace_data[0] == '\n':
+ trace_data = trace_data[1:]
+
+ return trace_data
+
+
+def fix_missing_tgids(trace_data, pid2_tgid):
+ """Replaces missing TGIDs from the trace data with those found in procfs
+
+ Args:
+ trace_data: the atrace data
+
+ Returns:
+ The updated trace data with missing TGIDs replaced with the correct TGID
+ """
+
+ def repl(m):
+ tid = m.group(2)
+ if (int(tid) > 0 and m.group(1) != '<idle>' and m.group(3) == '(-----)'
+ and tid in pid2_tgid):
+ # returns Proc_name-PID (TGID)
+ # Binder_2-381 (-----) becomes Binder_2-381 (128)
+ return m.group(1) + '-' + m.group(2) + ' ( ' + pid2_tgid[tid] + ')'
+
+ return m.group(0)
+
+ # matches something like:
+ # Binder_2-895 (-----)
+ trace_data = re.sub(r'^\s*(\S+)-(\d+)\s+(\(\S+\))', repl, trace_data,
+ flags=re.MULTILINE)
+ return trace_data
+
+
+def fix_circular_traces(out):
+ """Fix inconsistentcies in traces due to circular buffering.
+
+ The circular buffers are kept per CPU, so it is not guaranteed that the
+ beginning of a slice is overwritten before the end. To work around this, we
+ throw away the prefix of the trace where not all CPUs have events yet.
+
+ Args:
+ out: The data to fix.
+ Returns:
+ The updated trace data.
+ """
+ # If any of the CPU's buffers have filled up and
+ # older events have been dropped, the kernel
+ # emits markers of the form '##### CPU 2 buffer started ####' on
+ # the line before the first event in the trace on that CPU.
+ #
+ # No such headers are emitted if there were no overflows or the trace
+ # was captured with non-circular buffers.
+ buffer_start_re = re.compile(r'^#+ CPU \d+ buffer started', re.MULTILINE)
+
+ start_of_full_trace = 0
+
+ while True:
+ result = buffer_start_re.search(out, start_of_full_trace + 1)
+ if result:
+ start_of_full_trace = result.start()
+ else:
+ break
+
+ if start_of_full_trace > 0:
+ # Need to keep the header intact to make the importer happy.
+ end_of_header = re.search(r'^[^#]', out, re.MULTILINE).start()
+ out = out[:end_of_header] + out[start_of_full_trace:]
+ return out
+
+
+class AtraceConfig(tracing_agents.TracingConfig):
+ def __init__(self, atrace_categories, trace_buf_size, kfuncs,
+ app_name, compress_trace_data, from_file,
+ device_serial_number, trace_time, target):
+ tracing_agents.TracingConfig.__init__(self)
+ self.atrace_categories = atrace_categories
+ self.trace_buf_size = trace_buf_size
+ self.kfuncs = kfuncs
+ self.app_name = app_name
+ self.compress_trace_data = compress_trace_data
+ self.from_file = from_file
+ self.device_serial_number = device_serial_number
+ self.trace_time = trace_time
+ self.target = target
+
+
+def add_options(parser):
+ options = optparse.OptionGroup(parser, 'Atrace options')
+ options.add_option('--atrace-categories', dest='atrace_categories',
+ help='Select atrace categories with a comma-delimited '
+ 'list, e.g. --atrace-categories=cat1,cat2,cat3')
+ options.add_option('-k', '--ktrace', dest='kfuncs', action='store',
+ help='specify a comma-separated list of kernel functions '
+ 'to trace')
+ options.add_option('--no-compress', dest='compress_trace_data',
+ default=True, action='store_false',
+ help='Tell the device not to send the trace data in '
+ 'compressed form.')
+ options.add_option('-a', '--app', dest='app_name', default=None,
+ type='string', action='store',
+ help='enable application-level tracing for '
+ 'comma-separated list of app cmdlines')
+ options.add_option('--from-file', dest='from_file',
+ action='store', help='read the trace from a '
+ 'file (compressed) rather than running a '
+ 'live trace')
+ return options
+
+def get_config(options):
+ return AtraceConfig(options.atrace_categories,
+ options.trace_buf_size, options.kfuncs,
+ options.app_name, options.compress_trace_data,
+ options.from_file, options.device_serial_number,
+ options.trace_time, options.target)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/atrace_agent_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/atrace_agent_unittest.py
new file mode 100644
index 0000000..9ccc6e3
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/atrace_agent_unittest.py
@@ -0,0 +1,132 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import contextlib
+import logging
+import os
+import unittest
+
+from systrace import decorators
+from systrace import run_systrace
+from systrace import util
+from systrace.tracing_agents import atrace_agent
+
+from devil.android import device_utils
+from devil.android.sdk import intent
+
+
+DEVICE_SERIAL = 'AG8404EC0444AGC'
+ATRACE_ARGS = ['atrace', '-z', '-t', '10', '-b', '4096']
+CATEGORIES = ['sched', 'gfx', 'view', 'wm']
+ADB_SHELL = ['adb', '-s', DEVICE_SERIAL, 'shell']
+
+SYSTRACE_CMD = ['./run_systrace.py', '--time', '10', '-o', 'out.html', '-e',
+ DEVICE_SERIAL] + CATEGORIES
+TRACE_ARGS = (ATRACE_ARGS + CATEGORIES)
+
+TEST_DIR = os.path.join(os.path.dirname(__file__), os.pardir, 'test_data')
+ATRACE_DATA = os.path.join(TEST_DIR, 'atrace_data')
+ATRACE_DATA_RAW = os.path.join(TEST_DIR, 'atrace_data_raw')
+ATRACE_DATA_STRIPPED = os.path.join(TEST_DIR, 'atrace_data_stripped')
+ATRACE_PROCFS_DUMP = os.path.join(TEST_DIR, 'atrace_procfs_dump')
+ATRACE_EXTRACTED_TGIDS = os.path.join(TEST_DIR, 'atrace_extracted_tgids')
+ATRACE_MISSING_TGIDS = os.path.join(TEST_DIR, 'atrace_missing_tgids')
+ATRACE_FIXED_TGIDS = os.path.join(TEST_DIR, 'atrace_fixed_tgids')
+
+
+class AtraceAgentTest(unittest.TestCase):
+
+ # TODO(washingtonp): These end-to-end tests do not work on the Trybot server
+ # because adb cannot be found on the Trybot servers. Figure out what the
+ # issue is and update this test.
+ @decorators.Disabled
+ def test_tracing(self):
+ TRACE_BUFFER_SIZE = '16384'
+ TRACE_TIME = '5'
+
+ devices = device_utils.DeviceUtils.HealthyDevices()
+ package_info = util.get_supported_browsers()['stable']
+ device = devices[0]
+ output_file_name = util.generate_random_filename_for_test()
+
+ try:
+ # Launch the browser before tracing.
+ device.StartActivity(
+ intent.Intent(activity=package_info.activity,
+ package=package_info.package,
+ data='about:blank',
+ extras={'create_new_tab': True}),
+ blocking=True, force_stop=True)
+
+ # Run atrace agent.
+ run_systrace.main_impl(['./run_systrace.py',
+ '-b',
+ TRACE_BUFFER_SIZE,
+ '-t',
+ TRACE_TIME,
+ '-o',
+ output_file_name,
+ '-e',
+ str(device),
+ '--atrace-categories=gfx,input,view'])
+
+ # Verify results.
+ with open(output_file_name, 'r') as f:
+ full_trace = f.read()
+ self.assertTrue('CPU#'in full_trace)
+ except:
+ raise
+ finally:
+ if os.path.exists(output_file_name):
+ os.remove(output_file_name)
+
+ @decorators.HostOnlyTest
+ def test_construct_atrace_args(self):
+ options, categories = run_systrace.parse_options(SYSTRACE_CMD)
+ options.atrace_categories = categories
+ tracer_args = atrace_agent._construct_atrace_args(options, categories)
+ self.assertEqual(' '.join(TRACE_ARGS), ' '.join(tracer_args))
+
+ @decorators.HostOnlyTest
+ def test_strip_and_decompress_trace(self):
+ with contextlib.nested(open(ATRACE_DATA_RAW, 'r'),
+ open(ATRACE_DATA_STRIPPED, 'r')) as (f1, f2):
+ atrace_data_raw = f1.read()
+ atrace_data_stripped = f2.read()
+
+ trace_data = atrace_agent.strip_and_decompress_trace(atrace_data_raw)
+ self.assertEqual(atrace_data_stripped, trace_data)
+
+ @decorators.HostOnlyTest
+ def test_extract_tgids(self):
+ with contextlib.nested(open(ATRACE_PROCFS_DUMP, 'r'),
+ open(ATRACE_EXTRACTED_TGIDS, 'r')) as (f1, f2):
+
+ atrace_procfs_dump = f1.read()
+ atrace_procfs_extracted = f2.read()
+
+ tgids = eval(atrace_procfs_extracted)
+ result = atrace_agent.extract_tgids(atrace_procfs_dump.splitlines())
+
+ self.assertEqual(result, tgids)
+
+ @decorators.HostOnlyTest
+ def test_fix_missing_tgids(self):
+ with contextlib.nested(open(ATRACE_EXTRACTED_TGIDS, 'r'),
+ open(ATRACE_MISSING_TGIDS, 'r'),
+ open(ATRACE_FIXED_TGIDS, 'r')) as (f1, f2, f3):
+
+ atrace_data = f2.read()
+ tgid_map = eval(f1.read())
+ fixed = f3.read()
+
+ res = atrace_agent.fix_missing_tgids(atrace_data, tgid_map)
+ self.assertEqual(res, fixed)
+
+
+if __name__ == "__main__":
+ logging.getLogger().setLevel(logging.DEBUG)
+ unittest.main(verbosity=2)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/atrace_from_file_agent.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/atrace_from_file_agent.py
new file mode 100644
index 0000000..2a4e781
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/atrace_from_file_agent.py
@@ -0,0 +1,81 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import py_utils
+import re
+
+from systrace import trace_result
+from systrace import tracing_agents
+from systrace.tracing_agents import atrace_agent
+
+
+# ADB sends this text to indicate the beginning of the trace data.
+TRACE_START_REGEXP = r'TRACE\:'
+# Text that ADB sends, but does not need to be displayed to the user.
+ADB_IGNORE_REGEXP = r'^capturing trace\.\.\. done|^capturing trace\.\.\.'
+
+
+def try_create_agent(options):
+ if options.from_file is not None:
+ return AtraceFromFileAgent(options)
+ else:
+ return False
+
+
+class AtraceFromFileConfig(tracing_agents.TracingConfig):
+ def __init__(self, from_file):
+ tracing_agents.TracingConfig.__init__(self)
+ self.fix_circular = True
+ self.from_file = from_file
+
+def add_options(parser): # pylint: disable=unused-argument
+ # The atrace_from_file_agent is not currently used, so don't display
+ # any options.
+ return None
+
+def get_config(options):
+ return AtraceFromFileConfig(options.from_file)
+
+
+class AtraceFromFileAgent(tracing_agents.TracingAgent):
+ def __init__(self, options):
+ super(AtraceFromFileAgent, self).__init__()
+ self._filename = os.path.expanduser(options.from_file)
+ self._trace_data = False
+
+ @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
+ def StartAgentTracing(self, config, timeout=None):
+ # pylint: disable=unused-argument
+ return True
+
+ @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
+ def StopAgentTracing(self, timeout=None):
+ self._trace_data = self._read_trace_data()
+ return True
+
+ def SupportsExplicitClockSync(self):
+ return False
+
+ def RecordClockSyncMarker(self, sync_id, did_record_clock_sync_callback):
+ raise NotImplementedError
+
+ @py_utils.Timeout(tracing_agents.GET_RESULTS_TIMEOUT)
+ def GetResults(self, timeout=None):
+ return trace_result.TraceResult('trace-data', self._trace_data)
+
+ def _read_trace_data(self):
+ with open(self._filename, 'rb') as f:
+ result = f.read()
+ data_start = re.search(TRACE_START_REGEXP, result).end(0)
+ data = re.sub(ADB_IGNORE_REGEXP, '', result[data_start:])
+ return self._preprocess_data(data)
+
+ # pylint: disable=no-self-use
+ def _preprocess_data(self, data):
+ # TODO: add fix_threads and fix_tgids options back in here
+ # once we embed the dump data in the file (b/27504068)
+ data = atrace_agent.strip_and_decompress_trace(data)
+ data = atrace_agent.fix_circular_traces(data)
+ return data
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/atrace_from_file_agent_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/atrace_from_file_agent_unittest.py
new file mode 100644
index 0000000..2531c91
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/atrace_from_file_agent_unittest.py
@@ -0,0 +1,59 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import contextlib
+import os
+import unittest
+
+from systrace import decorators
+from systrace import run_systrace
+from systrace import update_systrace_trace_viewer
+from systrace import util
+
+TEST_DIR = os.path.join(os.path.dirname(__file__), '..', 'test_data')
+
+COMPRESSED_ATRACE_DATA = os.path.join(TEST_DIR, 'compressed_atrace_data.txt')
+DECOMPRESSED_ATRACE_DATA = os.path.join(TEST_DIR,
+ 'decompressed_atrace_data.txt')
+NON_EXISTENT_DATA = os.path.join(TEST_DIR, 'THIS_FILE_DOES_NOT_EXIST.txt')
+
+class AtraceFromFileAgentTest(unittest.TestCase):
+ @decorators.HostOnlyTest
+ def test_from_file(self):
+ update_systrace_trace_viewer.update(force_update=True)
+ self.assertTrue(os.path.exists(
+ update_systrace_trace_viewer.SYSTRACE_TRACE_VIEWER_HTML_FILE))
+ output_file_name = util.generate_random_filename_for_test()
+ try:
+ # use from-file to create a specific expected output
+ run_systrace.main_impl(['./run_systrace.py',
+ '--from-file',
+ COMPRESSED_ATRACE_DATA,
+ '-o',
+ output_file_name])
+ # and verify file contents
+ with contextlib.nested(open(output_file_name, 'r'),
+ open(DECOMPRESSED_ATRACE_DATA, 'r')) as (f1, f2):
+ full_trace = f1.read()
+ expected_contents = f2.read()
+ self.assertTrue(expected_contents in full_trace)
+ except:
+ raise
+ finally:
+ os.remove(update_systrace_trace_viewer.SYSTRACE_TRACE_VIEWER_HTML_FILE)
+ if os.path.exists(output_file_name):
+ os.remove(output_file_name)
+
+
+ @decorators.HostOnlyTest
+ def test_missing_file(self):
+ try:
+ run_systrace.main_impl(['./run_systrace.py',
+ '--from-file',
+ NON_EXISTENT_DATA])
+ self.fail('should not get here')
+ except IOError:
+ pass
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/battor_trace_agent.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/battor_trace_agent.py
new file mode 100644
index 0000000..a48ea87
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/battor_trace_agent.py
@@ -0,0 +1,165 @@
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import atexit
+import logging
+import optparse
+import py_utils
+
+from battor import battor_wrapper
+from devil.android import battery_utils
+from devil.android import device_utils
+from devil.utils import battor_device_mapping
+from devil.utils import find_usb_devices
+from py_trace_event import trace_time
+from systrace import trace_result
+from systrace import tracing_agents
+
+
+def try_create_agent(config):
+ if config.from_file is not None:
+ return None
+ if config.battor:
+ return BattOrTraceAgent()
+ return None
+
+
+class BattOrConfig(tracing_agents.TracingConfig):
+ def __init__(self, battor_categories, serial_map, battor_path,
+ battor, target, from_file, device_serial_number):
+ tracing_agents.TracingConfig.__init__(self)
+ self.battor_categories = battor_categories
+ self.serial_map = serial_map
+ self.battor_path = battor_path
+ self.battor = battor
+ self.target = target
+ self.from_file = from_file
+ self.device_serial_number = device_serial_number
+
+
+def add_options(parser):
+ options = optparse.OptionGroup(parser, 'BattOr trace options')
+ options.add_option('--battor-categories', dest='battor_categories',
+ help='Select battor categories with a comma-delimited '
+ 'list, e.g. --battor-categories=cat1,cat2,cat3')
+ options.add_option('--serial-map', dest='serial_map',
+ default='serial_map.json',
+ help='File containing pregenerated map of phone serial '
+ 'numbers to BattOr serial numbers.')
+ options.add_option('--battor-path', dest='battor_path', default=None,
+ type='string', help='specify a BattOr path to use')
+ options.add_option('--battor', dest='battor', default=False,
+ action='store_true', help='Use the BattOr tracing agent.')
+ return options
+
+def get_config(options):
+ return BattOrConfig(
+ options.battor_categories, options.serial_map, options.battor_path,
+ options.battor, options.target, options.from_file,
+ options.device_serial_number)
+
+def _reenable_charging_if_needed(battery):
+ if not battery.GetCharging():
+ battery.SetCharging(True)
+ logging.info('Charging status checked at exit.')
+
+
+class BattOrTraceAgent(tracing_agents.TracingAgent):
+ # Class representing tracing agent that gets data from a BattOr.
+ # BattOrs are high-frequency power monitors used for battery testing.
+ def __init__(self):
+ super(BattOrTraceAgent, self).__init__()
+ self._collection_process = None
+ self._recording_error = None
+ self._battor_wrapper = None
+ self._battery_utils = None
+
+ @staticmethod
+ def _FindBattOrPath(config):
+ device_tree = find_usb_devices.GetBusNumberToDeviceTreeMap()
+ battors = battor_device_mapping.GetBattOrList(device_tree)
+ battor_path = config.battor_path
+ if not config.battor_path and not config.serial_map:
+ assert len(battors) == 1, ('Must specify BattOr path if there is not '
+ 'exactly one')
+ battor_path = battors[0]
+ return battor_path
+
+ @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
+ def StartAgentTracing(self, config, timeout=None):
+ """Starts tracing.
+
+ Args:
+ config: Tracing config.
+
+ Raises:
+ RuntimeError: If trace already in progress.
+ AssertionError: If There is no BattOr path given and more
+ than one BattOr is attached.
+ """
+ battor_path = self._FindBattOrPath(config)
+ self._battor_wrapper = battor_wrapper.BattOrWrapper(
+ target_platform=config.target,
+ android_device=config.device_serial_number,
+ battor_path=battor_path,
+ battor_map_file=config.serial_map)
+
+ dev_utils = device_utils.DeviceUtils(config.device_serial_number)
+ self._battery_utils = battery_utils.BatteryUtils(dev_utils)
+ self._battery_utils.SetCharging(False)
+ atexit.register(_reenable_charging_if_needed, self._battery_utils)
+ self._battor_wrapper.StartShell()
+ self._battor_wrapper.StartTracing()
+ return True
+
+ @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
+ def StopAgentTracing(self, timeout=None):
+ """Stops tracing and collects the results asynchronously.
+
+ Creates a new process that stops the tracing and collects the results.
+ Returns immediately after the process is created (does not wait for
+ trace results to be collected).
+ """
+ self._battor_wrapper.StopTracing()
+ self._battery_utils.SetCharging(True)
+ return True
+
+ def SupportsExplicitClockSync(self):
+ """Returns whether this function supports explicit clock sync."""
+ return self._battor_wrapper.SupportsExplicitClockSync()
+
+ def RecordClockSyncMarker(self, sync_id, did_record_sync_marker_callback):
+ """Records a clock sync marker.
+
+ Args:
+ sync_id: ID string for clock sync marker.
+ did_record_sync_marker_callback: Callback function to call after
+ the clock sync marker is recorded.
+ """
+ ts = trace_time.Now()
+ self._battor_wrapper.RecordClockSyncMarker(sync_id)
+ did_record_sync_marker_callback(ts, sync_id)
+
+ @py_utils.Timeout(tracing_agents.GET_RESULTS_TIMEOUT)
+ def GetResults(self, timeout=None):
+ """Waits until data collection is completed and get the trace data.
+
+ The trace data is the data that comes out of the BattOr, and is in the
+ format with the following lines:
+
+ time current voltage <sync_id>
+
+ where the sync_id is only there if a clock sync marker was recorded
+ during that sample.
+
+ time = time since start of trace (ms)
+ current = current through battery (mA) - this can be negative if the
+ battery is charging
+ voltage = voltage of battery (mV)
+
+ Returns:
+ The trace data.
+ """
+ return trace_result.TraceResult(
+ 'powerTraceAsString', self._battor_wrapper.CollectTraceData())
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/battor_trace_agent_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/battor_trace_agent_unittest.py
new file mode 100644
index 0000000..6347161
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/battor_trace_agent_unittest.py
@@ -0,0 +1,182 @@
+#!/usr/bin/env python
+
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from collections import namedtuple
+import unittest
+import logging
+
+from systrace import decorators
+from systrace.tracing_agents import battor_trace_agent
+from battor import battor_wrapper
+from devil.android import battery_utils
+from devil.utils import battor_device_mapping
+from devil.utils import find_usb_devices
+
+
+mock_opts = namedtuple('mock_opts', ['target', 'device_serial_number',
+ 'battor_path', 'serial_map'])
+OPTIONS = mock_opts('android', 'Phn2', None, __file__)
+CATEGORIES = None
+_DEFAULT_BATTOR_LIST = ['dev/ttyUSB0']
+
+def raise_error(*args, **kwargs):
+ del args
+ del kwargs
+ raise RuntimeError('Should not call this function in the test')
+
+battor_device_mapping.GenerateSerialMapFile = raise_error
+
+def setup_battor_test(StartShell_error, StartTracing_error,
+ StopTracing_error, CollectTraceData_error,
+ battor_paths=None):
+ wrapper = MockBattOrWrapper(StartShell_error, StartTracing_error,
+ StopTracing_error, CollectTraceData_error)
+ def wrapper_maker(*args, **kwargs):
+ del args
+ del kwargs
+ return wrapper
+ battor_wrapper.BattOrWrapper = wrapper_maker
+ find_usb_devices.GetBusNumberToDeviceTreeMap = lambda: None
+ if battor_paths is None:
+ battor_paths = _DEFAULT_BATTOR_LIST
+ battor_device_mapping.GetBattOrList = lambda x: battor_paths
+
+
+class MockBattOrWrapper(object):
+ def __init__(self, StartShell_error=False, StartTracing_error=False,
+ StopTracing_error=False, CollectTraceData_error=False):
+ self._StartShell_error = StartShell_error
+ self._StartTracing_error = StartTracing_error
+ self._StopTracing_error = StopTracing_error
+ self._CollectTraceData_error = CollectTraceData_error
+ self._running = False
+ self._tracing = False
+ self._output = False
+
+ def IsShellRunning(self):
+ return self._running
+
+ def StartShell(self):
+ assert not self._running
+ if self._StartShell_error:
+ raise RuntimeError('Simulated error in StartShell')
+ self._running = True
+
+ def StartTracing(self):
+ assert self._running
+ assert not self._tracing
+ if self._StartTracing_error:
+ raise RuntimeError('Simulated error in StartTracing')
+ self._tracing = True
+
+ def StopTracing(self):
+ assert self._running
+ assert self._tracing
+ if self._StopTracing_error:
+ raise RuntimeError('Simulated error in StopTracing')
+ self._running = False
+ self._tracing = False
+ self._output = True
+
+ def CollectTraceData(self):
+ assert self._output
+ if self._CollectTraceData_error:
+ raise RuntimeError('Simulated error in CollectTraceData')
+ return 'traceout1\ntraceout2'
+
+
+class MockBatteryUtils(object):
+ def __init__(self, _):
+ self._is_charging = True
+
+ def GetCharging(self):
+ return self._is_charging
+
+ def SetCharging(self, value):
+ self._is_charging = value
+
+
+battery_utils.BatteryUtils = MockBatteryUtils
+
+
+class BattOrAgentTest(unittest.TestCase):
+
+ @decorators.HostOnlyTest
+ def test_trace_double_start(self):
+ setup_battor_test(StartShell_error=False, StartTracing_error=False,
+ StopTracing_error=False, CollectTraceData_error=False)
+ agent = battor_trace_agent.BattOrTraceAgent()
+ agent.StartAgentTracing(OPTIONS, CATEGORIES)
+ self.assertRaises(AssertionError,
+ lambda: agent.StartAgentTracing(OPTIONS, CATEGORIES))
+
+ @decorators.HostOnlyTest
+ def test_trace_error_start_shell(self):
+ setup_battor_test(StartShell_error=True, StartTracing_error=False,
+ StopTracing_error=False, CollectTraceData_error=False)
+ agent = battor_trace_agent.BattOrTraceAgent()
+ self.assertRaises(RuntimeError,
+ lambda: agent.StartAgentTracing(OPTIONS, CATEGORIES))
+
+ @decorators.HostOnlyTest
+ def test_trace_error_start_tracing(self):
+ setup_battor_test(StartShell_error=False, StartTracing_error=True,
+ StopTracing_error=False, CollectTraceData_error=False)
+ agent = battor_trace_agent.BattOrTraceAgent()
+ self.assertRaises(RuntimeError,
+ lambda: agent.StartAgentTracing(OPTIONS, CATEGORIES))
+
+ @decorators.HostOnlyTest
+ def test_trace_error_stop_tracing(self):
+ setup_battor_test(StartShell_error=False, StartTracing_error=False,
+ StopTracing_error=True, CollectTraceData_error=False)
+ agent = battor_trace_agent.BattOrTraceAgent()
+ agent.StartAgentTracing(OPTIONS, CATEGORIES)
+ self.assertRaises(RuntimeError, agent.StopAgentTracing)
+
+ @decorators.HostOnlyTest
+ def test_trace_error_get_results(self):
+ setup_battor_test(StartShell_error=False, StartTracing_error=False,
+ StopTracing_error=False, CollectTraceData_error=True)
+ agent = battor_trace_agent.BattOrTraceAgent()
+ agent.StartAgentTracing(OPTIONS, CATEGORIES)
+ agent.StopAgentTracing()
+ self.assertRaises(RuntimeError, agent.GetResults)
+
+ @decorators.HostOnlyTest
+ def test_trace_complete(self):
+ setup_battor_test(StartShell_error=False, StartTracing_error=False,
+ StopTracing_error=False, CollectTraceData_error=False)
+ agent = battor_trace_agent.BattOrTraceAgent()
+ agent.StartAgentTracing(OPTIONS, CATEGORIES)
+ agent.StopAgentTracing()
+ x = agent.GetResults()
+ self.assertEqual(x.raw_data, 'traceout1\ntraceout2')
+
+ @decorators.HostOnlyTest
+ def test_trace_error_no_battor(self):
+ setup_battor_test(StartShell_error=False, StartTracing_error=False,
+ StopTracing_error=False, CollectTraceData_error=False,
+ battor_paths=[])
+ agent = battor_trace_agent.BattOrTraceAgent()
+ options = mock_opts('android', 'Phn2', None, None)
+ with self.assertRaises(AssertionError):
+ agent.StartAgentTracing(options, CATEGORIES)
+
+ @decorators.HostOnlyTest
+ def test_trace_error_multiple_battors_no_battor_path(self):
+ setup_battor_test(StartShell_error=False, StartTracing_error=False,
+ StopTracing_error=False, CollectTraceData_error=False,
+ battor_paths=['a', 'b'])
+ agent = battor_trace_agent.BattOrTraceAgent()
+ options = mock_opts('android', 'Phn2', None, None)
+ with self.assertRaises(AssertionError):
+ agent.StartAgentTracing(options, CATEGORIES)
+
+
+if __name__ == "__main__":
+ logging.getLogger().setLevel(logging.DEBUG)
+ unittest.main(verbosity=2)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/ftrace_agent.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/ftrace_agent.py
new file mode 100644
index 0000000..cb1e7e1
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/ftrace_agent.py
@@ -0,0 +1,257 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import optparse
+import os
+import py_utils
+
+from systrace import trace_result
+from systrace import tracing_agents
+
+
+class FtraceAgentIo(object):
+ @staticmethod
+ def writeFile(path, data):
+ if FtraceAgentIo.haveWritePermissions(path):
+ with open(path, 'w') as f:
+ f.write(data)
+ else:
+ raise IOError('Cannot write to %s; did you forget sudo/root?' % path)
+
+ @staticmethod
+ def readFile(path):
+ with open(path, 'r') as f:
+ return f.read()
+
+ @staticmethod
+ def haveWritePermissions(path):
+ return os.access(path, os.W_OK)
+
+
+FT_DIR = "/sys/kernel/debug/tracing/"
+FT_CLOCK = FT_DIR + "trace_clock"
+FT_BUFFER_SIZE = FT_DIR + "buffer_size_kb"
+FT_TRACER = FT_DIR + "current_tracer"
+FT_PRINT_TGID = FT_DIR + "options/print-tgid"
+FT_TRACE_ON = FT_DIR + "tracing_on"
+FT_TRACE = FT_DIR + "trace"
+FT_TRACE_MARKER = FT_DIR + "trace_marker"
+FT_OVERWRITE = FT_DIR + "options/overwrite"
+
+all_categories = {
+ "sched": {
+ "desc": "CPU Scheduling",
+ "req": ["sched/sched_switch/", "sched/sched_wakeup/"]
+ },
+ "freq": {
+ "desc": "CPU Frequency",
+ "req": ["power/cpu_frequency/", "power/clock_set_rate/"]
+ },
+ "irq": {
+ "desc": "CPU IRQS and IPIS",
+ "req": ["irq/"],
+ "opt": ["ipi/"]
+ },
+ "workq": {
+ "desc": "Kernel workqueues",
+ "req": ["workqueue/"]
+ },
+ "memreclaim": {
+ "desc": "Kernel Memory Reclaim",
+ "req": ["vmscan/mm_vmscan_direct_reclaim_begin/",
+ "vmscan/mm_vmscan_direct_reclaim_end/",
+ "vmscan/mm_vmscan_kswapd_wake/",
+ "vmscan/mm_vmscan_kswapd_sleep/"]
+ },
+ "idle": {
+ "desc": "CPU Idle",
+ "req": ["power/cpu_idle/"]
+ },
+ "regulators": {
+ "desc": "Voltage and Current Regulators",
+ "req": ["regulator/"]
+ },
+ "disk": {
+ "desc": "Disk I/O",
+ "req": ["block/block_rq_issue/",
+ "block/block_rq_complete/"],
+ "opt": ["f2fs/f2fs_sync_file_enter/",
+ "f2fs/f2fs_sync_file_exit/",
+ "f2fs/f2fs_write_begin/",
+ "f2fs/f2fs_write_end/",
+ "ext4/ext4_da_write_begin/",
+ "ext4/ext4_da_write_end/",
+ "ext4/ext4_sync_file_enter/",
+ "ext4/ext4_sync_file_exit/"]
+ }
+}
+
+
+def try_create_agent(config):
+ if config.target != 'linux':
+ return None
+ return FtraceAgent(FtraceAgentIo)
+
+
+def list_categories(_):
+ agent = FtraceAgent(FtraceAgentIo)
+ agent._print_avail_categories()
+
+
+class FtraceConfig(tracing_agents.TracingConfig):
+ def __init__(self, ftrace_categories, target, trace_buf_size):
+ tracing_agents.TracingConfig.__init__(self)
+ self.ftrace_categories = ftrace_categories
+ self.target = target
+ self.trace_buf_size = trace_buf_size
+
+
+def add_options(parser):
+ options = optparse.OptionGroup(parser, 'Ftrace options')
+ options.add_option('--ftrace-categories', dest='ftrace_categories',
+ help='Select ftrace categories with a comma-delimited '
+ 'list, e.g. --ftrace-categories=cat1,cat2,cat3')
+ return options
+
+
+def get_config(options):
+ return FtraceConfig(options.ftrace_categories, options.target,
+ options.trace_buf_size)
+
+
+class FtraceAgent(tracing_agents.TracingAgent):
+
+ def __init__(self, fio=FtraceAgentIo):
+ """Initialize a systrace agent.
+
+ Args:
+ config: The command-line config.
+ categories: The trace categories to capture.
+ """
+ super(FtraceAgent, self).__init__()
+ self._fio = fio
+ self._config = None
+ self._categories = None
+
+ def _get_trace_buffer_size(self):
+ buffer_size = 4096
+ if ((self._config.trace_buf_size is not None)
+ and (self._config.trace_buf_size > 0)):
+ buffer_size = self._config.trace_buf_size
+ return buffer_size
+
+ def _fix_categories(self, categories):
+ """
+ Applies the default category (sched) if there are no categories
+ in the list and removes unavailable categories from the list.
+ Args:
+ categories: List of categories.
+ """
+ if not categories:
+ categories = ["sched"]
+ return [x for x in categories
+ if self._is_category_available(x)]
+
+ @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
+ def StartAgentTracing(self, config, timeout=None):
+ """Start tracing.
+ """
+ self._config = config
+ categories = self._fix_categories(config.ftrace_categories)
+ self._fio.writeFile(FT_BUFFER_SIZE,
+ str(self._get_trace_buffer_size()))
+ self._fio.writeFile(FT_CLOCK, 'global')
+ self._fio.writeFile(FT_TRACER, 'nop')
+ self._fio.writeFile(FT_OVERWRITE, "0")
+
+ # TODO: riandrews to push necessary patches for TGID option to upstream
+ # linux kernel
+ # self._fio.writeFile(FT_PRINT_TGID, '1')
+
+ for category in categories:
+ self._category_enable(category)
+
+ self._categories = categories # need to store list of categories to disable
+ print 'starting tracing.'
+
+ self._fio.writeFile(FT_TRACE, '')
+ self._fio.writeFile(FT_TRACE_ON, '1')
+ return True
+
+ @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
+ def StopAgentTracing(self, timeout=None):
+ """Collect the result of tracing.
+
+ This function will block while collecting the result. For sync mode, it
+ reads the data, e.g., from stdout, until it finishes. For async mode, it
+ blocks until the agent is stopped and the data is ready.
+ """
+ self._fio.writeFile(FT_TRACE_ON, '0')
+ for category in self._categories:
+ self._category_disable(category)
+ return True
+
+ @py_utils.Timeout(tracing_agents.GET_RESULTS_TIMEOUT)
+ def GetResults(self, timeout=None):
+ # get the output
+ d = self._fio.readFile(FT_TRACE)
+ self._fio.writeFile(FT_BUFFER_SIZE, "1")
+ return trace_result.TraceResult('trace-data', d)
+
+ def SupportsExplicitClockSync(self):
+ return False
+
+ def RecordClockSyncMarker(self, sync_id, did_record_sync_marker_callback):
+ # No implementation, but need to have this to support the API
+ # pylint: disable=unused-argument
+ return False
+
+ def _is_category_available(self, category):
+ if category not in all_categories:
+ return False
+ events_dir = FT_DIR + "events/"
+ req_events = all_categories[category]["req"]
+ for event in req_events:
+ event_full_path = events_dir + event + "enable"
+ if not self._fio.haveWritePermissions(event_full_path):
+ return False
+ return True
+
+ def _avail_categories(self):
+ ret = []
+ for event in all_categories:
+ if self._is_category_available(event):
+ ret.append(event)
+ return ret
+
+ def _print_avail_categories(self):
+ avail = self._avail_categories()
+ if len(avail):
+ print "tracing config:"
+ for category in self._avail_categories():
+ desc = all_categories[category]["desc"]
+ print "{0: <16}".format(category), ": ", desc
+ else:
+ print "No tracing categories available - perhaps you need root?"
+
+ def _category_enable_paths(self, category):
+ events_dir = FT_DIR + "events/"
+ req_events = all_categories[category]["req"]
+ for event in req_events:
+ event_full_path = events_dir + event + "enable"
+ yield event_full_path
+ if "opt" in all_categories[category]:
+ opt_events = all_categories[category]["opt"]
+ for event in opt_events:
+ event_full_path = events_dir + event + "enable"
+ if self._fio.haveWritePermissions(event_full_path):
+ yield event_full_path
+
+ def _category_enable(self, category):
+ for path in self._category_enable_paths(category):
+ self._fio.writeFile(path, "1")
+
+ def _category_disable(self, category):
+ for path in self._category_enable_paths(category):
+ self._fio.writeFile(path, "0")
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/ftrace_agent_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/ftrace_agent_unittest.py
new file mode 100644
index 0000000..fdc54cd
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/ftrace_agent_unittest.py
@@ -0,0 +1,143 @@
+#!/usr/bin/env python
+
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import unittest
+import logging
+
+from systrace import decorators
+from systrace import run_systrace
+from systrace.tracing_agents import ftrace_agent
+
+
+SYSTRACE_HOST_CMD_DEFAULT = ['./systrace.py', '--target=linux']
+FT_DIR = "/sys/kernel/debug/tracing/"
+FT_EVENT_DIR = FT_DIR + "events/"
+FT_TRACE_ON = FT_DIR + "tracing_on"
+FT_TRACE = FT_DIR + "trace"
+FT_BUFFER_SIZE = FT_DIR + "buffer_size_kb"
+
+
+def make_test_io_interface(permitted_files):
+ class TestIoImpl(object):
+
+ @staticmethod
+ def writeFile(path, data):
+ permitted_files[path] = data
+
+ @staticmethod
+ def readFile(path):
+ if path in permitted_files:
+ return permitted_files[path]
+ else:
+ return ""
+
+ @staticmethod
+ def haveWritePermissions(path):
+ return path in permitted_files
+
+ return TestIoImpl
+
+
+class FtraceAgentTest(unittest.TestCase):
+
+ @decorators.HostOnlyTest
+ def test_avail_categories(self):
+ # sched only has required events
+ permitted_files = {
+ FT_EVENT_DIR + "sched/sched_switch/enable": "0",
+ FT_EVENT_DIR + "sched/sched_wakeup/enable": "0"
+ }
+ io_interface = make_test_io_interface(permitted_files)
+ agent = ftrace_agent.FtraceAgent(io_interface)
+ self.assertEqual(['sched'], agent._avail_categories())
+
+ # check for no available categories
+ permitted_files = {}
+ io_interface = make_test_io_interface(permitted_files)
+ agent = ftrace_agent.FtraceAgent(io_interface)
+ self.assertEqual([], agent._avail_categories())
+
+ # block has some required, some optional events
+ permitted_files = {
+ FT_EVENT_DIR + "block/block_rq_complete/enable": "0",
+ FT_EVENT_DIR + "block/block_rq_issue/enable": "0"
+ }
+ io_interface = make_test_io_interface(permitted_files)
+ agent = ftrace_agent.FtraceAgent(io_interface)
+ self.assertEqual(['disk'], agent._avail_categories())
+
+ @decorators.HostOnlyTest
+ def test_tracing_bootstrap(self):
+ workq_event_path = FT_EVENT_DIR + "workqueue/enable"
+ permitted_files = {
+ workq_event_path: "0",
+ FT_TRACE: "x"
+ }
+ io_interface = make_test_io_interface(permitted_files)
+ systrace_cmd = SYSTRACE_HOST_CMD_DEFAULT + ["workq"]
+ options, categories = run_systrace.parse_options(systrace_cmd)
+ agent = ftrace_agent.FtraceAgent(io_interface)
+ self.assertEqual(['workq'], agent._avail_categories())
+
+ # confirm tracing is enabled, buffer is cleared
+ agent.StartAgentTracing(options, categories)
+ self.assertEqual(permitted_files[FT_TRACE_ON], "1")
+ self.assertEqual(permitted_files[FT_TRACE], "")
+
+ # fill in file with dummy contents
+ dummy_trace = "trace_contents"
+ permitted_files[FT_TRACE] = dummy_trace
+
+ # confirm tracing is disabled
+ agent.StopAgentTracing()
+ agent.GetResults()
+ self.assertEqual(permitted_files[FT_TRACE_ON], "0")
+
+ # confirm trace is expected, and read from fs
+ self.assertEqual(agent.GetResults().raw_data, dummy_trace)
+
+ # confirm buffer size is reset to 1
+ self.assertEqual(permitted_files[FT_BUFFER_SIZE], "1")
+
+ @decorators.HostOnlyTest
+ def test_tracing_event_enable_disable(self):
+ # turn on irq tracing
+ ipi_event_path = FT_EVENT_DIR + "ipi/enable"
+ irq_event_path = FT_EVENT_DIR + "irq/enable"
+ permitted_files = {
+ ipi_event_path: "0",
+ irq_event_path: "0"
+ }
+ io_interface = make_test_io_interface(permitted_files)
+ systrace_cmd = SYSTRACE_HOST_CMD_DEFAULT + ["irq"]
+ options, categories = run_systrace.parse_options(systrace_cmd)
+ options.ftrace_categories = categories
+ agent = ftrace_agent.FtraceAgent(io_interface)
+ self.assertEqual(['irq'], agent._avail_categories())
+
+ # confirm all the event nodes are turned on during tracing
+ agent.StartAgentTracing(options)
+ self.assertEqual(permitted_files[irq_event_path], "1")
+ self.assertEqual(permitted_files[ipi_event_path], "1")
+
+ # and then turned off when completed.
+ agent.StopAgentTracing()
+ agent.GetResults()
+ self.assertEqual(permitted_files[irq_event_path], "0")
+ self.assertEqual(permitted_files[ipi_event_path], "0")
+
+ @decorators.HostOnlyTest
+ def test_buffer_size(self):
+ systrace_cmd = SYSTRACE_HOST_CMD_DEFAULT + ['-b', '16000']
+ options, categories = run_systrace.parse_options(systrace_cmd)
+ agent = ftrace_agent.FtraceAgent()
+ agent._config = options
+ agent._config.atrace_categories = categories
+ self.assertEqual(agent._get_trace_buffer_size(), 16000)
+
+if __name__ == "__main__":
+ logging.getLogger().setLevel(logging.DEBUG)
+ unittest.main(verbosity=2)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/walt_agent.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/walt_agent.py
new file mode 100644
index 0000000..72d84b5
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/walt_agent.py
@@ -0,0 +1,120 @@
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import py_utils
+import optparse
+import threading
+
+from devil.android import device_utils
+from systrace import trace_result
+from systrace import tracing_agents
+from py_trace_event import trace_time as trace_time_module
+
+TRACE_FILE_PATH = \
+ '/sdcard/Android/data/org.chromium.latency.walt/files/trace.txt'
+
+CLOCK_DOMAIN_MARKER = '# clock_type=LINUX_CLOCK_MONOTONIC\n'
+
+
+def try_create_agent(options):
+ if options.is_walt_enabled:
+ return WaltAgent()
+ return None
+
+
+class WaltConfig(tracing_agents.TracingConfig):
+ def __init__(self, device_serial_number, is_walt_enabled):
+ tracing_agents.TracingConfig.__init__(self)
+ self.device_serial_number = device_serial_number
+ self.is_walt_enabled = is_walt_enabled
+
+
+def add_options(parser):
+ options = optparse.OptionGroup(parser, 'WALT trace options')
+ options.add_option('--walt', dest='is_walt_enabled', default=False,
+ action='store_true', help='Use the WALT tracing agent. '
+ 'WALT is a device for measuring latency of physical '
+ 'sensors on phones and computers. '
+ 'See https://github.com/google/walt')
+ return options
+
+
+def get_config(options):
+ return WaltConfig(options.device_serial_number, options.is_walt_enabled)
+
+
+class WaltAgent(tracing_agents.TracingAgent):
+ """
+ This tracing agent requires the WALT app to be installed on the Android phone,
+ and requires the WALT device to be attached to the phone. WALT is a device
+ for measuring latency of physical sensors and outputs on phones and
+ computers. For more information, visit https://github.com/google/walt
+ """
+ def __init__(self):
+ super(WaltAgent, self).__init__()
+ self._trace_contents = None
+ self._config = None
+ self._device_utils = None
+ self._clock_sync_marker = None
+ self._collection_thread = None
+
+ def __repr__(self):
+ return 'WaltAgent'
+
+ @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
+ def StartAgentTracing(self, config, timeout=None):
+ del timeout # unused
+ self._config = config
+ self._device_utils = device_utils.DeviceUtils(
+ self._config.device_serial_number)
+ if self._device_utils.PathExists(TRACE_FILE_PATH):
+ # clear old trace events so they are not included in the current trace
+ self._device_utils.WriteFile(TRACE_FILE_PATH, '')
+ return True
+
+ @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
+ def StopAgentTracing(self, timeout=None):
+ """Stops tracing and starts collecting results.
+
+ To synchronously retrieve the results after calling this function,
+ call GetResults().
+ """
+ del timeout # unused
+ self._collection_thread = threading.Thread(
+ target=self._collect_trace_data)
+ self._collection_thread.start()
+ return True
+
+ def _collect_trace_data(self):
+ self._trace_contents = self._device_utils.ReadFile(TRACE_FILE_PATH)
+
+ def SupportsExplicitClockSync(self):
+ return True
+
+ def RecordClockSyncMarker(self, sync_id, did_record_clock_sync_callback):
+ cmd = 'cat /proc/timer_list | grep now'
+ t1 = trace_time_module.Now()
+ command_result = self._device_utils.RunShellCommand(cmd, shell=True)
+ nsec = command_result[0].split()[2]
+ self._clock_sync_marker = format_clock_sync_marker(sync_id, nsec)
+ did_record_clock_sync_callback(t1, sync_id)
+
+ @py_utils.Timeout(tracing_agents.GET_RESULTS_TIMEOUT)
+ def GetResults(self, timeout=None):
+ del timeout # unused
+ self._collection_thread.join()
+ self._collection_thread = None
+ return trace_result.TraceResult('waltTrace', self._get_trace_result())
+
+ def _get_trace_result(self):
+ result = '# tracer: \n' + CLOCK_DOMAIN_MARKER + self._trace_contents
+ if self._clock_sync_marker is not None:
+ result += self._clock_sync_marker
+ return result
+
+
+def format_clock_sync_marker(sync_id, nanosec_time):
+ return ('<0>-0 (-----) [001] ...1 ' + str(float(nanosec_time) / 1e9)
+ + ': tracing_mark_write: trace_event_clock_sync: name='
+ + sync_id + '\n')
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/walt_agent_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/walt_agent_unittest.py
new file mode 100644
index 0000000..b4fcaf7
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_agents/walt_agent_unittest.py
@@ -0,0 +1,51 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import logging
+import unittest
+
+from systrace import decorators
+from systrace import run_systrace
+from systrace.tracing_agents import walt_agent
+
+
+class WaltAgentTest(unittest.TestCase):
+ """
+ The WALT agent pulls the trace log from the Android phone, and does not
+ communicate with the WALT device directly. This makes the agent more similar
+ to atrace than BattOr. Since the host only connects to the Android phone,
+ more exhaustive testing would require mocking DeviceUtils.
+ """
+
+ @decorators.HostOnlyTest
+ def test_construct_walt_args(self):
+ options, _ = run_systrace.parse_options(['./run_systrace.py',
+ '--walt'])
+ self.assertTrue(walt_agent.get_config(options).is_walt_enabled)
+ options, _ = run_systrace.parse_options(['./run_systrace.py'])
+ self.assertFalse(walt_agent.get_config(options).is_walt_enabled)
+
+ @decorators.HostOnlyTest
+ def test_format_clock_sync_marker(self):
+ actual_marker = walt_agent.format_clock_sync_marker(
+ 'some_sync_id', 12345678901234)
+ expected_marker = ('<0>-0 (-----) [001] ...1 12345.6789012: ' +
+ 'tracing_mark_write: trace_event_clock_sync: ' +
+ 'name=some_sync_id\n')
+ self.assertEqual(actual_marker, expected_marker)
+
+ @decorators.HostOnlyTest
+ def test_get_results_string(self):
+ agent = walt_agent.WaltAgent()
+ agent._trace_contents = '<trace contents here>\n'
+ agent._clock_sync_marker = '<clock sync marker here>\n'
+ result = agent._get_trace_result()
+ self.assertEquals(result, '# tracer: \n# clock_type=LINUX_CLOCK_MONOTONIC\n'
+ '<trace contents here>\n<clock sync marker here>\n')
+
+if __name__ == "__main__":
+ logging.getLogger().setLevel(logging.DEBUG)
+ unittest.main(verbosity=2)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_controller.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_controller.py
new file mode 100644
index 0000000..d0d2d7c
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/tracing_controller.py
@@ -0,0 +1,306 @@
+#!/usr/bin/env python
+
+# Copyright 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+'''Tracing controller class. This class manages
+multiple tracing agents and collects data from all of them. It also
+manages the clock sync process.
+'''
+
+import ast
+import json
+import sys
+import py_utils
+import tempfile
+import uuid
+
+from systrace import trace_result
+from systrace import tracing_agents
+from py_trace_event import trace_event
+
+
+TRACE_DATA_CONTROLLER_NAME = 'systraceController'
+
+
+def ControllerAgentClockSync(issue_ts, name):
+ """Record the clock sync marker for controller tracing agent.
+
+ Unlike with the other tracing agents, the tracing controller should not
+ call this directly. Rather, it is called via callback from the other
+ tracing agents when they write a trace.
+ """
+ trace_event.clock_sync(name, issue_ts=issue_ts)
+
+
+class TracingControllerAgent(tracing_agents.TracingAgent):
+ def __init__(self):
+ super(TracingControllerAgent, self).__init__()
+ self._log_path = None
+
+ @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
+ def StartAgentTracing(self, config, timeout=None):
+ """Start tracing for the controller tracing agent.
+
+ Start tracing for the controller tracing agent. Note that
+ the tracing controller records the "controller side"
+ of the clock sync records, and nothing else.
+ """
+ del config
+ if not trace_event.trace_can_enable():
+ raise RuntimeError, ('Cannot enable trace_event;'
+ ' ensure py_utils is in PYTHONPATH')
+
+ controller_log_file = tempfile.NamedTemporaryFile(delete=False)
+ self._log_path = controller_log_file.name
+ controller_log_file.close()
+ trace_event.trace_enable(self._log_path)
+ return True
+
+ @py_utils.Timeout(tracing_agents.START_STOP_TIMEOUT)
+ def StopAgentTracing(self, timeout=None):
+ """Stops tracing for the controller tracing agent.
+ """
+ # pylint: disable=no-self-use
+ # This function doesn't use self, but making it a member function
+ # for consistency with the other TracingAgents
+ trace_event.trace_disable()
+ return True
+
+ @py_utils.Timeout(tracing_agents.GET_RESULTS_TIMEOUT)
+ def GetResults(self, timeout=None):
+ """Gets the log output from the controller tracing agent.
+
+ This output only contains the "controller side" of the clock sync records.
+ """
+ with open(self._log_path, 'r') as outfile:
+ data = ast.literal_eval(outfile.read() + ']')
+ # Explicitly set its own clock domain. This will stop the Systrace clock
+ # domain from incorrectly being collapsed into the on device clock domain.
+ formatted_data = {
+ 'traceEvents': data,
+ 'metadata': {
+ 'clock-domain': 'SYSTRACE',
+ }
+ }
+ return trace_result.TraceResult(TRACE_DATA_CONTROLLER_NAME,
+ json.dumps(formatted_data))
+
+ def SupportsExplicitClockSync(self):
+ """Returns whether this supports explicit clock sync.
+ Although the tracing controller conceptually supports explicit clock
+ sync, it is not an agent controlled by other controllers so it does not
+ define RecordClockSyncMarker (rather, the recording of the "controller
+ side" of the clock sync marker is done in _IssueClockSyncMarker). Thus,
+ SupportsExplicitClockSync must return false.
+ """
+ return False
+
+ # pylint: disable=unused-argument
+ def RecordClockSyncMarker(self, sync_id, callback):
+ raise NotImplementedError
+
+class TracingController(object):
+ def __init__(self, agents_with_config, controller_config):
+ """Create tracing controller.
+
+ Create a tracing controller object. Note that the tracing
+ controller is also a tracing agent.
+
+ Args:
+ agents_with_config: List of tracing agents for this controller with the
+ corresponding tracing configuration objects.
+ controller_config: Configuration options for the tracing controller.
+ """
+ self._child_agents = None
+ self._child_agents_with_config = agents_with_config
+ self._controller_agent = TracingControllerAgent()
+ self._controller_config = controller_config
+ self._trace_in_progress = False
+ self.all_results = None
+
+ @property
+ def get_child_agents(self):
+ return self._child_agents
+
+ def StartTracing(self):
+ """Start tracing for all tracing agents.
+
+ This function starts tracing for both the controller tracing agent
+ and the child tracing agents.
+
+ Returns:
+ Boolean indicating whether or not the start tracing succeeded.
+ Start tracing is considered successful if at least the
+ controller tracing agent was started.
+ """
+ assert not self._trace_in_progress, 'Trace already in progress.'
+ self._trace_in_progress = True
+
+ # Start the controller tracing agents. Controller tracing agent
+ # must be started successfully to proceed.
+ if not self._controller_agent.StartAgentTracing(
+ self._controller_config,
+ timeout=self._controller_config.timeout):
+ print 'Unable to start controller tracing agent.'
+ return False
+
+ # Start the child tracing agents.
+ succ_agents = []
+ for agent_and_config in self._child_agents_with_config:
+ agent = agent_and_config.agent
+ config = agent_and_config.config
+ if agent.StartAgentTracing(config,
+ timeout=self._controller_config.timeout):
+ succ_agents.append(agent)
+ else:
+ print 'Agent %s not started.' % str(agent)
+
+ # Print warning if all agents not started.
+ na = len(self._child_agents_with_config)
+ ns = len(succ_agents)
+ if ns < na:
+ print 'Warning: Only %d of %d tracing agents started.' % (ns, na)
+ self._child_agents = succ_agents
+ return True
+
+ def StopTracing(self):
+ """Issue clock sync marker and stop tracing for all tracing agents.
+
+ This function stops both the controller tracing agent
+ and the child tracing agents. It issues a clock sync marker prior
+ to stopping tracing.
+
+ Returns:
+ Boolean indicating whether or not the stop tracing succeeded
+ for all agents.
+ """
+ assert self._trace_in_progress, 'No trace in progress.'
+ self._trace_in_progress = False
+
+ # Issue the clock sync marker and stop the child tracing agents.
+ self._IssueClockSyncMarker()
+ succ_agents = []
+ for agent in self._child_agents:
+ if agent.StopAgentTracing(timeout=self._controller_config.timeout):
+ succ_agents.append(agent)
+ else:
+ print 'Agent %s not stopped.' % str(agent)
+
+ # Stop the controller tracing agent. Controller tracing agent
+ # must be stopped successfully to proceed.
+ if not self._controller_agent.StopAgentTracing(
+ timeout=self._controller_config.timeout):
+ print 'Unable to stop controller tracing agent.'
+ return False
+
+ # Print warning if all agents not stopped.
+ na = len(self._child_agents)
+ ns = len(succ_agents)
+ if ns < na:
+ print 'Warning: Only %d of %d tracing agents stopped.' % (ns, na)
+ self._child_agents = succ_agents
+
+ # Collect the results from all the stopped tracing agents.
+ all_results = []
+ for agent in self._child_agents + [self._controller_agent]:
+ try:
+ result = agent.GetResults(
+ timeout=self._controller_config.collection_timeout)
+ if not result:
+ print 'Warning: Timeout when getting results from %s.' % str(agent)
+ continue
+ if result.source_name in [r.source_name for r in all_results]:
+ print ('Warning: Duplicate tracing agents named %s.' %
+ result.source_name)
+ all_results.append(result)
+ # Check for exceptions. If any exceptions are seen, reraise and abort.
+ # Note that a timeout exception will be swalloed by the timeout
+ # mechanism and will not get to that point (it will return False instead
+ # of the trace result, which will be dealt with above)
+ except:
+ print 'Warning: Exception getting results from %s:' % str(agent)
+ print sys.exc_info()[0]
+ raise
+ self.all_results = all_results
+ return all_results
+
+ def GetTraceType(self):
+ """Return a string representing the child agents that are being traced."""
+ sorted_agents = sorted(map(str, self._child_agents))
+ return ' + '.join(sorted_agents)
+
+ def _IssueClockSyncMarker(self):
+ """Issue clock sync markers to all the child tracing agents."""
+ for agent in self._child_agents:
+ if agent.SupportsExplicitClockSync():
+ sync_id = GetUniqueSyncID()
+ agent.RecordClockSyncMarker(sync_id, ControllerAgentClockSync)
+
+def GetUniqueSyncID():
+ """Get a unique sync ID.
+
+ Gets a unique sync ID by generating a UUID and converting it to a string
+ (since UUIDs are not JSON serializable)
+ """
+ return str(uuid.uuid4())
+
+
+class AgentWithConfig(object):
+ def __init__(self, agent, config):
+ self.agent = agent
+ self.config = config
+
+
+def CreateAgentsWithConfig(options, modules):
+ """Create tracing agents.
+
+ This function will determine which tracing agents are valid given the
+ options and create those agents along with their corresponding configuration
+ object.
+ Args:
+ options: The command-line options.
+ modules: The modules for either Systrace or profile_chrome.
+ TODO(washingtonp): After all profile_chrome agents are in
+ Systrace, this parameter will no longer be valid.
+ Returns:
+ A list of AgentWithConfig options containing agents and their corresponding
+ configuration object.
+ """
+ result = []
+ for module in modules:
+ config = module.get_config(options)
+ agent = module.try_create_agent(config)
+ if agent and config:
+ result.append(AgentWithConfig(agent, config))
+ return [x for x in result if x and x.agent]
+
+
+class TracingControllerConfig(tracing_agents.TracingConfig):
+ def __init__(self, output_file, trace_time, write_json,
+ link_assets, asset_dir, timeout, collection_timeout,
+ device_serial_number, target):
+ tracing_agents.TracingConfig.__init__(self)
+ self.output_file = output_file
+ self.trace_time = trace_time
+ self.write_json = write_json
+ self.link_assets = link_assets
+ self.asset_dir = asset_dir
+ self.timeout = timeout
+ self.collection_timeout = collection_timeout
+ self.device_serial_number = device_serial_number
+ self.target = target
+
+
+def GetControllerConfig(options):
+ return TracingControllerConfig(options.output_file, options.trace_time,
+ options.write_json,
+ options.link_assets, options.asset_dir,
+ options.timeout, options.collection_timeout,
+ options.device_serial_number, options.target)
+
+def GetChromeStartupControllerConfig(options):
+ return TracingControllerConfig(None, options.trace_time,
+ options.write_json, None, None, None, None,
+ None, None)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/update_systrace_trace_viewer.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/update_systrace_trace_viewer.py
new file mode 100644
index 0000000..c735e82
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/update_systrace_trace_viewer.py
@@ -0,0 +1,119 @@
+#!/usr/bin/env python
+
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import codecs
+import optparse
+import os
+import re
+import subprocess
+import sys
+
+_CATAPULT_PATH = os.path.abspath(
+ os.path.join(os.path.dirname(__file__), os.path.pardir, os.path.pardir))
+sys.path.append(os.path.join(_CATAPULT_PATH, 'tracing'))
+
+from tracing_build import vulcanize_trace_viewer
+
+
+SYSTRACE_TRACE_VIEWER_HTML_FILE = os.path.join(
+ os.path.abspath(os.path.dirname(__file__)),
+ 'systrace_trace_viewer.html')
+CATAPULT_REV_ = 'CATAPULT_REV'
+NO_AUTO_UPDATE_ = 'NO_AUTO_UPDATE'
+
+
+def create_catapult_rev_str_(revision):
+ return '<!--' + CATAPULT_REV_ + '=' + str(revision) + '-->'
+
+
+def get_catapult_rev_in_file_(html_file):
+ assert os.path.exists(html_file)
+ rev = ''
+ with open(html_file, 'r') as f:
+ lines = f.readlines()
+ for line in lines[::-1]:
+ if CATAPULT_REV_ in line:
+ tokens = line.split(CATAPULT_REV_)
+ rev = re.sub(r'[=\->]', '', tokens[1]).strip()
+ break
+ return rev
+
+
+def get_catapult_rev_in_git_():
+ try:
+ catapult_rev = subprocess.check_output(
+ ['git', 'rev-parse', 'HEAD'],
+ shell=True, # Needed by Windows
+ cwd=os.path.dirname(os.path.abspath(__file__))).strip()
+ except (subprocess.CalledProcessError, OSError):
+ catapult_rev = ''
+ if not catapult_rev:
+ return ''
+ else:
+ return catapult_rev
+
+
+def update(no_auto_update=False, no_min=False, force_update=False):
+ """Update the systrace trace viewer html file.
+
+ When the html file exists, do not update the file if
+ 1. the revision is NO_AUTO_UPDATE_;
+ 2. or the revision is not changed.
+
+ Args:
+ no_auto_update: If true, force updating the file with revision
+ NO_AUTO_UPDATE_. Future updates will be skipped unless this
+ argument is true again.
+ no_min: If true, skip minification when updating the file.
+ force_update: If true, update the systrace trace viewer file no matter
+ what.
+ """
+ new_rev = None
+ if not force_update:
+ if no_auto_update:
+ new_rev = NO_AUTO_UPDATE_
+ else:
+ new_rev = get_catapult_rev_in_git_()
+ if not new_rev:
+ return
+
+ if os.path.exists(SYSTRACE_TRACE_VIEWER_HTML_FILE):
+ rev_in_file = get_catapult_rev_in_file_(SYSTRACE_TRACE_VIEWER_HTML_FILE)
+ if rev_in_file == NO_AUTO_UPDATE_ or rev_in_file == new_rev:
+ return
+
+ if force_update and not new_rev:
+ new_rev = "none"
+
+ print 'Generating viewer file %s with revision %s.' % (
+ SYSTRACE_TRACE_VIEWER_HTML_FILE, new_rev)
+
+ # Generate the vulcanized result.
+ with codecs.open(SYSTRACE_TRACE_VIEWER_HTML_FILE,
+ encoding='utf-8', mode='w') as f:
+ vulcanize_trace_viewer.WriteTraceViewer(
+ f,
+ config_name='full',
+ minify=(not no_min),
+ output_html_head_and_body=False)
+ if not force_update:
+ f.write(create_catapult_rev_str_(new_rev))
+
+def main():
+ parser = optparse.OptionParser()
+ parser.add_option('--no-auto-update', dest='no_auto_update',
+ default=False, action='store_true', help='force update the '
+ 'systrace trace viewer html file. Future auto updates will '
+ 'be skipped unless this flag is specified again.')
+ parser.add_option('--no-min', dest='no_min', default=False,
+ action='store_true', help='skip minification')
+ # pylint: disable=unused-variable
+ options, unused_args = parser.parse_args(sys.argv[1:])
+
+ update(no_auto_update=options.no_auto_update, no_min=options.no_min)
+
+if __name__ == '__main__':
+ main()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/util.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/util.py
new file mode 100644
index 0000000..61dc475
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/util.py
@@ -0,0 +1,211 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import optparse
+import os
+import random
+import string
+import subprocess
+import sys
+
+from devil.android.constants import chrome
+
+class OptionParserIgnoreErrors(optparse.OptionParser):
+ """Wrapper for OptionParser that ignores errors and produces no output."""
+
+ def error(self, msg):
+ pass
+
+ def exit(self, status=0, msg=None):
+ pass
+
+ def print_usage(self, out_file=None):
+ pass
+
+ def print_help(self, out_file=None):
+ pass
+
+ def print_version(self, out_file=None):
+ pass
+
+
+def add_adb_serial(adb_command, device_serial):
+ """Add serial number to ADB shell command.
+
+ ADB shell command is given as list, e.g.
+ ['adb','shell','some_command','some_args'].
+ This replaces it with:
+ ['adb','shell',-s',device_serial,'some_command','some_args']
+
+ Args:
+ adb_command: ADB command list.
+ device_serial: Device serial number.
+
+ Returns:
+ ADB command list with serial number added.
+ """
+ if device_serial is not None:
+ adb_command.insert(1, device_serial)
+ adb_command.insert(1, '-s')
+
+
+def construct_adb_shell_command(shell_args, device_serial):
+ """Construct an ADB shell command with given device serial and arguments.
+
+ Args:
+ shell_args: array of arguments to pass to adb shell.
+ device_serial: if not empty, will add the appropriate command-line
+ parameters so that adb targets the given device.
+ """
+ adb_command = ['adb', 'shell', ' '.join(shell_args)]
+ add_adb_serial(adb_command, device_serial)
+ return adb_command
+
+
+def run_adb_command(adb_command):
+ adb_output = []
+ adb_return_code = 0
+ try:
+ adb_output = subprocess.check_output(adb_command, stderr=subprocess.STDOUT,
+ shell=False, universal_newlines=True)
+ except OSError as error:
+ # This usually means that the adb executable was not found in the path.
+ print >> sys.stderr, ('\nThe command "%s" failed with the following error:'
+ % ' '.join(adb_command))
+ print >> sys.stderr, ' %s' % str(error)
+ print >> sys.stderr, 'Is adb in your path?'
+ adb_return_code = error.errno
+ adb_output = error
+ except subprocess.CalledProcessError as error:
+ # The process exited with an error.
+ adb_return_code = error.returncode
+ adb_output = error.output
+
+ return (adb_output, adb_return_code)
+
+
+def run_adb_shell(shell_args, device_serial):
+ """Runs "adb shell" with the given arguments.
+
+ Args:
+ shell_args: array of arguments to pass to adb shell.
+ device_serial: if not empty, will add the appropriate command-line
+ parameters so that adb targets the given device.
+ Returns:
+ A tuple containing the adb output (stdout & stderr) and the return code
+ from adb. Will exit if adb fails to start.
+ """
+ adb_command = construct_adb_shell_command(shell_args, device_serial)
+ return run_adb_command(adb_command)
+
+
+def get_device_sdk_version():
+ """Uses adb to attempt to determine the SDK version of a running device."""
+
+ getprop_args = ['getprop', 'ro.build.version.sdk']
+
+ # get_device_sdk_version() is called before we even parse our command-line
+ # args. Therefore, parse just the device serial number part of the
+ # command-line so we can send the adb command to the correct device.
+ parser = OptionParserIgnoreErrors()
+ parser.add_option('-e', '--serial', dest='device_serial', type='string')
+ options, unused_args = parser.parse_args() # pylint: disable=unused-variable
+
+ success = False
+
+ adb_output, adb_return_code = run_adb_shell(getprop_args,
+ options.device_serial)
+
+ if adb_return_code == 0:
+ # ADB may print output other than the version number (e.g. it chould
+ # print a message about starting the ADB server).
+ # Break the ADB output into white-space delimited segments.
+ parsed_output = str.split(adb_output)
+ if parsed_output:
+ # Assume that the version number is the last thing printed by ADB.
+ version_string = parsed_output[-1]
+ if version_string:
+ try:
+ # Try to convert the text into an integer.
+ version = int(version_string)
+ except ValueError:
+ version = -1
+ else:
+ success = True
+
+ if not success:
+ sys.exit(1)
+
+ return version
+
+
+def generate_random_filename_for_test():
+ """Used for temporary files used in tests.
+
+ Files created from 'NamedTemporaryFile' have inconsistent reuse support across
+ platforms, so it's not guaranteed that they can be reopened. Since many tests
+ communicate files via path, we typically use this method, as well as
+ manual file removal."""
+ name = ''.join(random.choice(string.ascii_uppercase +
+ string.digits) for _ in range(10))
+ return os.path.abspath(name)
+
+
+def get_supported_browsers():
+ """Returns the package names of all supported browsers."""
+ # Add aliases for backwards compatibility.
+ supported_browsers = {
+ 'stable': chrome.PACKAGE_INFO['chrome_stable'],
+ 'beta': chrome.PACKAGE_INFO['chrome_beta'],
+ 'dev': chrome.PACKAGE_INFO['chrome_dev'],
+ 'build': chrome.PACKAGE_INFO['chrome'],
+ }
+ supported_browsers.update(chrome.PACKAGE_INFO)
+ return supported_browsers
+
+
+def get_default_serial():
+ if 'ANDROID_SERIAL' in os.environ:
+ return os.environ['ANDROID_SERIAL']
+ return None
+
+
+def get_main_options(parser):
+ parser.add_option('-o', dest='output_file', help='write trace output to FILE',
+ default=None, metavar='FILE')
+ parser.add_option('-t', '--time', dest='trace_time', type='int',
+ help='trace for N seconds', metavar='N')
+ parser.add_option('-j', '--json', dest='write_json',
+ default=False, action='store_true',
+ help='write a JSON file')
+ parser.add_option('--link-assets', dest='link_assets', default=False,
+ action='store_true',
+ help='(deprecated)')
+ parser.add_option('--from-file', dest='from_file', action='store',
+ help='read the trace from a file (compressed) rather than'
+ 'running a live trace')
+ parser.add_option('--asset-dir', dest='asset_dir', default='trace-viewer',
+ type='string', help='(deprecated)')
+ parser.add_option('-e', '--serial', dest='device_serial_number',
+ default=get_default_serial(),
+ type='string', help='adb device serial number')
+ parser.add_option('--target', dest='target', default='android', type='string',
+ help='choose tracing target (android or linux)')
+ parser.add_option('--timeout', dest='timeout', type='int',
+ help='timeout for start and stop tracing (seconds)')
+ parser.add_option('--collection-timeout', dest='collection_timeout',
+ type='int', help='timeout for data collection (seconds)')
+ parser.add_option('-a', '--app', dest='app_name', default=None,
+ type='string', action='store',
+ help='enable application-level tracing for '
+ 'comma-separated list of app cmdlines')
+ parser.add_option('-t', '--time', dest='trace_time', type='int',
+ help='trace for N seconds', metavar='N')
+ parser.add_option('--target', dest='target', default='android',
+ type='string', help='choose tracing target (android or '
+ ' linux)')
+ parser.add_option('-b', '--buf-size', dest='trace_buf_size',
+ type='int', help='use a trace buffer size '
+ ' of N KB', metavar='N')
+ return parser
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/util_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/util_unittest.py
new file mode 100644
index 0000000..e88f835
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/systrace/systrace/util_unittest.py
@@ -0,0 +1,30 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import unittest
+
+from systrace import decorators
+from systrace import util
+
+
+DEVICE_SERIAL = 'AG8404EC0444AGC'
+LIST_TMP_ARGS = ['ls', '/data/local/tmp']
+ATRACE_ARGS = ['atrace', '-z', '-t', '10', '-b', '4096']
+ADB_SHELL = ['adb', '-s', DEVICE_SERIAL, 'shell']
+
+
+class UtilTest(unittest.TestCase):
+
+ @decorators.HostOnlyTest
+ def test_construct_adb_shell_command(self):
+ command = util.construct_adb_shell_command(LIST_TMP_ARGS, None)
+ self.assertEqual(' '.join(command), 'adb shell ls /data/local/tmp')
+
+ command = util.construct_adb_shell_command(LIST_TMP_ARGS, DEVICE_SERIAL)
+ self.assertEqual(' '.join(command),
+ 'adb -s AG8404EC0444AGC shell ls /data/local/tmp')
+
+ command = util.construct_adb_shell_command(ATRACE_ARGS, DEVICE_SERIAL)
+ self.assertEqual(' '.join(command),
+ 'adb -s AG8404EC0444AGC shell atrace -z -t 10 -b 4096')
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/LICENSE.txt b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/LICENSE.txt
new file mode 100644
index 0000000..f604ea3
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/LICENSE.txt
@@ -0,0 +1,61 @@
+Copyright (c) 2001-2013 Chris Liechti <cliechti@gmx.net>;
+All Rights Reserved.
+
+This is the Python license. In short, you can use this product in
+commercial and non-commercial applications, modify it, redistribute it.
+A notification to the author when you use and/or modify it is welcome.
+
+
+TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING THIS SOFTWARE
+===================================================================
+
+LICENSE AGREEMENT
+-----------------
+
+1. This LICENSE AGREEMENT is between the copyright holder of this
+product, and the Individual or Organization ("Licensee") accessing
+and otherwise using this product in source or binary form and its
+associated documentation.
+
+2. Subject to the terms and conditions of this License Agreement,
+the copyright holder hereby grants Licensee a nonexclusive,
+royalty-free, world-wide license to reproduce, analyze, test,
+perform and/or display publicly, prepare derivative works, distribute,
+and otherwise use this product alone or in any derivative version,
+provided, however, that copyright holders License Agreement and
+copyright holders notice of copyright are retained in this product
+alone or in any derivative version prepared by Licensee.
+
+3. In the event Licensee prepares a derivative work that is based on
+or incorporates this product or any part thereof, and wants to make
+the derivative work available to others as provided herein, then
+Licensee hereby agrees to include in any such work a brief summary of
+the changes made to this product.
+
+4. The copyright holder is making this product available to Licensee on
+an "AS IS" basis. THE COPYRIGHT HOLDER MAKES NO REPRESENTATIONS OR
+WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION,
+THE COPYRIGHT HOLDER MAKES NO AND DISCLAIMS ANY REPRESENTATION OR
+WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR
+THAT THE USE OF THIS PRODUCT WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
+
+5. THE COPYRIGHT HOLDER SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER
+USERS OF THIS PRODUCT FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL
+DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE
+USING THIS PRODUCT, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE
+POSSIBILITY THEREOF.
+
+6. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
+
+7. Nothing in this License Agreement shall be deemed to create any
+relationship of agency, partnership, or joint venture between the
+copyright holder and Licensee. This License Agreement does not grant
+permission to use trademarks or trade names from the copyright holder
+in a trademark sense to endorse or promote products or services of
+Licensee, or any third party.
+
+8. By copying, installing or otherwise using this product, Licensee
+agrees to be bound by the terms and conditions of this License
+Agreement.
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/README.chromium b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/README.chromium
new file mode 100644
index 0000000..04593db
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/README.chromium
@@ -0,0 +1,19 @@
+Name: pySerial
+Short Name: pySerial
+URL: https://github.com/pyserial/pyserial
+Version: 2.7
+Date: 2013-10-17
+License: Python
+License File: NOT_SHIPPED
+Security Critical: no
+
+Description:
+Library for Python access for the serial port. Used for communication with
+a Monsoon device, which tunnels serial over USB.
+
+Local Modifications:
+Includes only the serial/ folder and LICENSE.txt.
+Packaging and setup files have not been copied downstream.
+All other files and folders (documentation/, examples/, test/)
+have not been copied downstream.
+linux-product_info.patch has been applied to include the product information as description.
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/linux-product_info.patch b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/linux-product_info.patch
new file mode 100644
index 0000000..9f8001a
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/linux-product_info.patch
@@ -0,0 +1,19 @@
+Index: serial/tools/list_ports_linux.py
+===================================================================
+--- serial/tools/list_ports_linux.py (revision 494)
++++ serial/tools/list_ports_linux.py (working copy)
+@@ -110,6 +110,14 @@
+ sys_dev_path = '/sys/class/tty/%s/device/interface' % (base,)
+ if os.path.exists(sys_dev_path):
+ return read_line(sys_dev_path)
++
++ # USB Product Information
++ sys_dev_path = '/sys/class/tty/%s/device' % (base,)
++ if os.path.exists(sys_dev_path):
++ product_name_file = os.path.dirname(os.path.realpath(sys_dev_path)) + "/product"
++ if os.path.exists(product_name_file):
++ return read_line(product_name_file)
++
+ return base
+
+ def hwinfo(device):
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/__init__.py
new file mode 100644
index 0000000..33ae52e
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/__init__.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python
+
+# portable serial port access with python
+# this is a wrapper module for different platform implementations
+#
+# (C) 2001-2010 Chris Liechti <cliechti@gmx.net>
+# this is distributed under a free software license, see license.txt
+
+VERSION = '2.7'
+
+import sys
+
+if sys.platform == 'cli':
+ from serial.serialcli import *
+else:
+ import os
+ # chose an implementation, depending on os
+ if os.name == 'nt': #sys.platform == 'win32':
+ from serial.serialwin32 import *
+ elif os.name == 'posix':
+ from serial.serialposix import *
+ elif os.name == 'java':
+ from serial.serialjava import *
+ else:
+ raise ImportError("Sorry: no implementation for your platform ('%s') available" % (os.name,))
+
+
+protocol_handler_packages = [
+ 'serial.urlhandler',
+ ]
+
+def serial_for_url(url, *args, **kwargs):
+ """\
+ Get an instance of the Serial class, depending on port/url. The port is not
+ opened when the keyword parameter 'do_not_open' is true, by default it
+ is. All other parameters are directly passed to the __init__ method when
+ the port is instantiated.
+
+ The list of package names that is searched for protocol handlers is kept in
+ ``protocol_handler_packages``.
+
+ e.g. we want to support a URL ``foobar://``. A module
+ ``my_handlers.protocol_foobar`` is provided by the user. Then
+ ``protocol_handler_packages.append("my_handlers")`` would extend the search
+ path so that ``serial_for_url("foobar://"))`` would work.
+ """
+ # check remove extra parameter to not confuse the Serial class
+ do_open = 'do_not_open' not in kwargs or not kwargs['do_not_open']
+ if 'do_not_open' in kwargs: del kwargs['do_not_open']
+ # the default is to use the native version
+ klass = Serial # 'native' implementation
+ # check port type and get class
+ try:
+ url_nocase = url.lower()
+ except AttributeError:
+ # it's not a string, use default
+ pass
+ else:
+ if '://' in url_nocase:
+ protocol = url_nocase.split('://', 1)[0]
+ for package_name in protocol_handler_packages:
+ module_name = '%s.protocol_%s' % (package_name, protocol,)
+ try:
+ handler_module = __import__(module_name)
+ except ImportError:
+ pass
+ else:
+ klass = sys.modules[module_name].Serial
+ break
+ else:
+ raise ValueError('invalid URL, protocol %r not known' % (protocol,))
+ else:
+ klass = Serial # 'native' implementation
+ # instantiate and open when desired
+ instance = klass(None, *args, **kwargs)
+ instance.port = url
+ if do_open:
+ instance.open()
+ return instance
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/rfc2217.py b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/rfc2217.py
new file mode 100644
index 0000000..2012ea7
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/rfc2217.py
@@ -0,0 +1,1323 @@
+#! python
+#
+# Python Serial Port Extension for Win32, Linux, BSD, Jython
+# see __init__.py
+#
+# This module implements a RFC2217 compatible client. RF2217 descibes a
+# protocol to access serial ports over TCP/IP and allows setting the baud rate,
+# modem control lines etc.
+#
+# (C) 2001-2013 Chris Liechti <cliechti@gmx.net>
+# this is distributed under a free software license, see license.txt
+
+# TODO:
+# - setting control line -> answer is not checked (had problems with one of the
+# severs). consider implementing a compatibility mode flag to make check
+# conditional
+# - write timeout not implemented at all
+
+##############################################################################
+# observations and issues with servers
+#=============================================================================
+# sredird V2.2.1
+# - http://www.ibiblio.org/pub/Linux/system/serial/ sredird-2.2.2.tar.gz
+# - does not acknowledge SET_CONTROL (RTS/DTR) correctly, always responding
+# [105 1] instead of the actual value.
+# - SET_BAUDRATE answer contains 4 extra null bytes -> probably for larger
+# numbers than 2**32?
+# - To get the signature [COM_PORT_OPTION 0] has to be sent.
+# - run a server: while true; do nc -l -p 7000 -c "sredird debug /dev/ttyUSB0 /var/lock/sredir"; done
+#=============================================================================
+# telnetcpcd (untested)
+# - http://ftp.wayne.edu/kermit/sredird/telnetcpcd-1.09.tar.gz
+# - To get the signature [COM_PORT_OPTION] w/o data has to be sent.
+#=============================================================================
+# ser2net
+# - does not negotiate BINARY or COM_PORT_OPTION for his side but at least
+# acknowledges that the client activates these options
+# - The configuration may be that the server prints a banner. As this client
+# implementation does a flushInput on connect, this banner is hidden from
+# the user application.
+# - NOTIFY_MODEMSTATE: the poll interval of the server seems to be one
+# second.
+# - To get the signature [COM_PORT_OPTION 0] has to be sent.
+# - run a server: run ser2net daemon, in /etc/ser2net.conf:
+# 2000:telnet:0:/dev/ttyS0:9600 remctl banner
+##############################################################################
+
+# How to identify ports? pySerial might want to support other protocols in the
+# future, so lets use an URL scheme.
+# for RFC2217 compliant servers we will use this:
+# rfc2217://<host>:<port>[/option[/option...]]
+#
+# options:
+# - "debug" print diagnostic messages
+# - "ign_set_control": do not look at the answers to SET_CONTROL
+# - "poll_modem": issue NOTIFY_MODEMSTATE requests when CTS/DTR/RI/CD is read.
+# Without this option it expects that the server sends notifications
+# automatically on change (which most servers do and is according to the
+# RFC).
+# the order of the options is not relevant
+
+from serial.serialutil import *
+import time
+import struct
+import socket
+import threading
+import Queue
+import logging
+
+# port string is expected to be something like this:
+# rfc2217://host:port
+# host may be an IP or including domain, whatever.
+# port is 0...65535
+
+# map log level names to constants. used in fromURL()
+LOGGER_LEVELS = {
+ 'debug': logging.DEBUG,
+ 'info': logging.INFO,
+ 'warning': logging.WARNING,
+ 'error': logging.ERROR,
+ }
+
+
+# telnet protocol characters
+IAC = to_bytes([255]) # Interpret As Command
+DONT = to_bytes([254])
+DO = to_bytes([253])
+WONT = to_bytes([252])
+WILL = to_bytes([251])
+IAC_DOUBLED = to_bytes([IAC, IAC])
+
+SE = to_bytes([240]) # Subnegotiation End
+NOP = to_bytes([241]) # No Operation
+DM = to_bytes([242]) # Data Mark
+BRK = to_bytes([243]) # Break
+IP = to_bytes([244]) # Interrupt process
+AO = to_bytes([245]) # Abort output
+AYT = to_bytes([246]) # Are You There
+EC = to_bytes([247]) # Erase Character
+EL = to_bytes([248]) # Erase Line
+GA = to_bytes([249]) # Go Ahead
+SB = to_bytes([250]) # Subnegotiation Begin
+
+# selected telnet options
+BINARY = to_bytes([0]) # 8-bit data path
+ECHO = to_bytes([1]) # echo
+SGA = to_bytes([3]) # suppress go ahead
+
+# RFC2217
+COM_PORT_OPTION = to_bytes([44])
+
+# Client to Access Server
+SET_BAUDRATE = to_bytes([1])
+SET_DATASIZE = to_bytes([2])
+SET_PARITY = to_bytes([3])
+SET_STOPSIZE = to_bytes([4])
+SET_CONTROL = to_bytes([5])
+NOTIFY_LINESTATE = to_bytes([6])
+NOTIFY_MODEMSTATE = to_bytes([7])
+FLOWCONTROL_SUSPEND = to_bytes([8])
+FLOWCONTROL_RESUME = to_bytes([9])
+SET_LINESTATE_MASK = to_bytes([10])
+SET_MODEMSTATE_MASK = to_bytes([11])
+PURGE_DATA = to_bytes([12])
+
+SERVER_SET_BAUDRATE = to_bytes([101])
+SERVER_SET_DATASIZE = to_bytes([102])
+SERVER_SET_PARITY = to_bytes([103])
+SERVER_SET_STOPSIZE = to_bytes([104])
+SERVER_SET_CONTROL = to_bytes([105])
+SERVER_NOTIFY_LINESTATE = to_bytes([106])
+SERVER_NOTIFY_MODEMSTATE = to_bytes([107])
+SERVER_FLOWCONTROL_SUSPEND = to_bytes([108])
+SERVER_FLOWCONTROL_RESUME = to_bytes([109])
+SERVER_SET_LINESTATE_MASK = to_bytes([110])
+SERVER_SET_MODEMSTATE_MASK = to_bytes([111])
+SERVER_PURGE_DATA = to_bytes([112])
+
+RFC2217_ANSWER_MAP = {
+ SET_BAUDRATE: SERVER_SET_BAUDRATE,
+ SET_DATASIZE: SERVER_SET_DATASIZE,
+ SET_PARITY: SERVER_SET_PARITY,
+ SET_STOPSIZE: SERVER_SET_STOPSIZE,
+ SET_CONTROL: SERVER_SET_CONTROL,
+ NOTIFY_LINESTATE: SERVER_NOTIFY_LINESTATE,
+ NOTIFY_MODEMSTATE: SERVER_NOTIFY_MODEMSTATE,
+ FLOWCONTROL_SUSPEND: SERVER_FLOWCONTROL_SUSPEND,
+ FLOWCONTROL_RESUME: SERVER_FLOWCONTROL_RESUME,
+ SET_LINESTATE_MASK: SERVER_SET_LINESTATE_MASK,
+ SET_MODEMSTATE_MASK: SERVER_SET_MODEMSTATE_MASK,
+ PURGE_DATA: SERVER_PURGE_DATA,
+}
+
+SET_CONTROL_REQ_FLOW_SETTING = to_bytes([0]) # Request Com Port Flow Control Setting (outbound/both)
+SET_CONTROL_USE_NO_FLOW_CONTROL = to_bytes([1]) # Use No Flow Control (outbound/both)
+SET_CONTROL_USE_SW_FLOW_CONTROL = to_bytes([2]) # Use XON/XOFF Flow Control (outbound/both)
+SET_CONTROL_USE_HW_FLOW_CONTROL = to_bytes([3]) # Use HARDWARE Flow Control (outbound/both)
+SET_CONTROL_REQ_BREAK_STATE = to_bytes([4]) # Request BREAK State
+SET_CONTROL_BREAK_ON = to_bytes([5]) # Set BREAK State ON
+SET_CONTROL_BREAK_OFF = to_bytes([6]) # Set BREAK State OFF
+SET_CONTROL_REQ_DTR = to_bytes([7]) # Request DTR Signal State
+SET_CONTROL_DTR_ON = to_bytes([8]) # Set DTR Signal State ON
+SET_CONTROL_DTR_OFF = to_bytes([9]) # Set DTR Signal State OFF
+SET_CONTROL_REQ_RTS = to_bytes([10]) # Request RTS Signal State
+SET_CONTROL_RTS_ON = to_bytes([11]) # Set RTS Signal State ON
+SET_CONTROL_RTS_OFF = to_bytes([12]) # Set RTS Signal State OFF
+SET_CONTROL_REQ_FLOW_SETTING_IN = to_bytes([13]) # Request Com Port Flow Control Setting (inbound)
+SET_CONTROL_USE_NO_FLOW_CONTROL_IN = to_bytes([14]) # Use No Flow Control (inbound)
+SET_CONTROL_USE_SW_FLOW_CONTOL_IN = to_bytes([15]) # Use XON/XOFF Flow Control (inbound)
+SET_CONTROL_USE_HW_FLOW_CONTOL_IN = to_bytes([16]) # Use HARDWARE Flow Control (inbound)
+SET_CONTROL_USE_DCD_FLOW_CONTROL = to_bytes([17]) # Use DCD Flow Control (outbound/both)
+SET_CONTROL_USE_DTR_FLOW_CONTROL = to_bytes([18]) # Use DTR Flow Control (inbound)
+SET_CONTROL_USE_DSR_FLOW_CONTROL = to_bytes([19]) # Use DSR Flow Control (outbound/both)
+
+LINESTATE_MASK_TIMEOUT = 128 # Time-out Error
+LINESTATE_MASK_SHIFTREG_EMPTY = 64 # Transfer Shift Register Empty
+LINESTATE_MASK_TRANSREG_EMPTY = 32 # Transfer Holding Register Empty
+LINESTATE_MASK_BREAK_DETECT = 16 # Break-detect Error
+LINESTATE_MASK_FRAMING_ERROR = 8 # Framing Error
+LINESTATE_MASK_PARTIY_ERROR = 4 # Parity Error
+LINESTATE_MASK_OVERRUN_ERROR = 2 # Overrun Error
+LINESTATE_MASK_DATA_READY = 1 # Data Ready
+
+MODEMSTATE_MASK_CD = 128 # Receive Line Signal Detect (also known as Carrier Detect)
+MODEMSTATE_MASK_RI = 64 # Ring Indicator
+MODEMSTATE_MASK_DSR = 32 # Data-Set-Ready Signal State
+MODEMSTATE_MASK_CTS = 16 # Clear-To-Send Signal State
+MODEMSTATE_MASK_CD_CHANGE = 8 # Delta Receive Line Signal Detect
+MODEMSTATE_MASK_RI_CHANGE = 4 # Trailing-edge Ring Detector
+MODEMSTATE_MASK_DSR_CHANGE = 2 # Delta Data-Set-Ready
+MODEMSTATE_MASK_CTS_CHANGE = 1 # Delta Clear-To-Send
+
+PURGE_RECEIVE_BUFFER = to_bytes([1]) # Purge access server receive data buffer
+PURGE_TRANSMIT_BUFFER = to_bytes([2]) # Purge access server transmit data buffer
+PURGE_BOTH_BUFFERS = to_bytes([3]) # Purge both the access server receive data buffer and the access server transmit data buffer
+
+
+RFC2217_PARITY_MAP = {
+ PARITY_NONE: 1,
+ PARITY_ODD: 2,
+ PARITY_EVEN: 3,
+ PARITY_MARK: 4,
+ PARITY_SPACE: 5,
+}
+RFC2217_REVERSE_PARITY_MAP = dict((v,k) for k,v in RFC2217_PARITY_MAP.items())
+
+RFC2217_STOPBIT_MAP = {
+ STOPBITS_ONE: 1,
+ STOPBITS_ONE_POINT_FIVE: 3,
+ STOPBITS_TWO: 2,
+}
+RFC2217_REVERSE_STOPBIT_MAP = dict((v,k) for k,v in RFC2217_STOPBIT_MAP.items())
+
+# Telnet filter states
+M_NORMAL = 0
+M_IAC_SEEN = 1
+M_NEGOTIATE = 2
+
+# TelnetOption and TelnetSubnegotiation states
+REQUESTED = 'REQUESTED'
+ACTIVE = 'ACTIVE'
+INACTIVE = 'INACTIVE'
+REALLY_INACTIVE = 'REALLY_INACTIVE'
+
+class TelnetOption(object):
+ """Manage a single telnet option, keeps track of DO/DONT WILL/WONT."""
+
+ def __init__(self, connection, name, option, send_yes, send_no, ack_yes, ack_no, initial_state, activation_callback=None):
+ """\
+ Initialize option.
+ :param connection: connection used to transmit answers
+ :param name: a readable name for debug outputs
+ :param send_yes: what to send when option is to be enabled.
+ :param send_no: what to send when option is to be disabled.
+ :param ack_yes: what to expect when remote agrees on option.
+ :param ack_no: what to expect when remote disagrees on option.
+ :param initial_state: options initialized with REQUESTED are tried to
+ be enabled on startup. use INACTIVE for all others.
+ """
+ self.connection = connection
+ self.name = name
+ self.option = option
+ self.send_yes = send_yes
+ self.send_no = send_no
+ self.ack_yes = ack_yes
+ self.ack_no = ack_no
+ self.state = initial_state
+ self.active = False
+ self.activation_callback = activation_callback
+
+ def __repr__(self):
+ """String for debug outputs"""
+ return "%s:%s(%s)" % (self.name, self.active, self.state)
+
+ def process_incoming(self, command):
+ """A DO/DONT/WILL/WONT was received for this option, update state and
+ answer when needed."""
+ if command == self.ack_yes:
+ if self.state is REQUESTED:
+ self.state = ACTIVE
+ self.active = True
+ if self.activation_callback is not None:
+ self.activation_callback()
+ elif self.state is ACTIVE:
+ pass
+ elif self.state is INACTIVE:
+ self.state = ACTIVE
+ self.connection.telnetSendOption(self.send_yes, self.option)
+ self.active = True
+ if self.activation_callback is not None:
+ self.activation_callback()
+ elif self.state is REALLY_INACTIVE:
+ self.connection.telnetSendOption(self.send_no, self.option)
+ else:
+ raise ValueError('option in illegal state %r' % self)
+ elif command == self.ack_no:
+ if self.state is REQUESTED:
+ self.state = INACTIVE
+ self.active = False
+ elif self.state is ACTIVE:
+ self.state = INACTIVE
+ self.connection.telnetSendOption(self.send_no, self.option)
+ self.active = False
+ elif self.state is INACTIVE:
+ pass
+ elif self.state is REALLY_INACTIVE:
+ pass
+ else:
+ raise ValueError('option in illegal state %r' % self)
+
+
+class TelnetSubnegotiation(object):
+ """\
+ A object to handle subnegotiation of options. In this case actually
+ sub-sub options for RFC 2217. It is used to track com port options.
+ """
+
+ def __init__(self, connection, name, option, ack_option=None):
+ if ack_option is None: ack_option = option
+ self.connection = connection
+ self.name = name
+ self.option = option
+ self.value = None
+ self.ack_option = ack_option
+ self.state = INACTIVE
+
+ def __repr__(self):
+ """String for debug outputs."""
+ return "%s:%s" % (self.name, self.state)
+
+ def set(self, value):
+ """\
+ request a change of the value. a request is sent to the server. if
+ the client needs to know if the change is performed he has to check the
+ state of this object.
+ """
+ self.value = value
+ self.state = REQUESTED
+ self.connection.rfc2217SendSubnegotiation(self.option, self.value)
+ if self.connection.logger:
+ self.connection.logger.debug("SB Requesting %s -> %r" % (self.name, self.value))
+
+ def isReady(self):
+ """\
+ check if answer from server has been received. when server rejects
+ the change, raise a ValueError.
+ """
+ if self.state == REALLY_INACTIVE:
+ raise ValueError("remote rejected value for option %r" % (self.name))
+ return self.state == ACTIVE
+ # add property to have a similar interface as TelnetOption
+ active = property(isReady)
+
+ def wait(self, timeout=3):
+ """\
+ wait until the subnegotiation has been acknowledged or timeout. It
+ can also throw a value error when the answer from the server does not
+ match the value sent.
+ """
+ timeout_time = time.time() + timeout
+ while time.time() < timeout_time:
+ time.sleep(0.05) # prevent 100% CPU load
+ if self.isReady():
+ break
+ else:
+ raise SerialException("timeout while waiting for option %r" % (self.name))
+
+ def checkAnswer(self, suboption):
+ """\
+ check an incoming subnegotiation block. the parameter already has
+ cut off the header like sub option number and com port option value.
+ """
+ if self.value == suboption[:len(self.value)]:
+ self.state = ACTIVE
+ else:
+ # error propagation done in isReady
+ self.state = REALLY_INACTIVE
+ if self.connection.logger:
+ self.connection.logger.debug("SB Answer %s -> %r -> %s" % (self.name, suboption, self.state))
+
+
+class RFC2217Serial(SerialBase):
+ """Serial port implementation for RFC 2217 remote serial ports."""
+
+ BAUDRATES = (50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
+ 9600, 19200, 38400, 57600, 115200)
+
+ def open(self):
+ """\
+ Open port with current settings. This may throw a SerialException
+ if the port cannot be opened.
+ """
+ self.logger = None
+ self._ignore_set_control_answer = False
+ self._poll_modem_state = False
+ self._network_timeout = 3
+ if self._port is None:
+ raise SerialException("Port must be configured before it can be used.")
+ if self._isOpen:
+ raise SerialException("Port is already open.")
+ try:
+ self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ self._socket.connect(self.fromURL(self.portstr))
+ self._socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
+ except Exception, msg:
+ self._socket = None
+ raise SerialException("Could not open port %s: %s" % (self.portstr, msg))
+
+ self._socket.settimeout(5) # XXX good value?
+
+ # use a thread save queue as buffer. it also simplifies implementing
+ # the read timeout
+ self._read_buffer = Queue.Queue()
+ # to ensure that user writes does not interfere with internal
+ # telnet/rfc2217 options establish a lock
+ self._write_lock = threading.Lock()
+ # name the following separately so that, below, a check can be easily done
+ mandadory_options = [
+ TelnetOption(self, 'we-BINARY', BINARY, WILL, WONT, DO, DONT, INACTIVE),
+ TelnetOption(self, 'we-RFC2217', COM_PORT_OPTION, WILL, WONT, DO, DONT, REQUESTED),
+ ]
+ # all supported telnet options
+ self._telnet_options = [
+ TelnetOption(self, 'ECHO', ECHO, DO, DONT, WILL, WONT, REQUESTED),
+ TelnetOption(self, 'we-SGA', SGA, WILL, WONT, DO, DONT, REQUESTED),
+ TelnetOption(self, 'they-SGA', SGA, DO, DONT, WILL, WONT, REQUESTED),
+ TelnetOption(self, 'they-BINARY', BINARY, DO, DONT, WILL, WONT, INACTIVE),
+ TelnetOption(self, 'they-RFC2217', COM_PORT_OPTION, DO, DONT, WILL, WONT, REQUESTED),
+ ] + mandadory_options
+ # RFC 2217 specific states
+ # COM port settings
+ self._rfc2217_port_settings = {
+ 'baudrate': TelnetSubnegotiation(self, 'baudrate', SET_BAUDRATE, SERVER_SET_BAUDRATE),
+ 'datasize': TelnetSubnegotiation(self, 'datasize', SET_DATASIZE, SERVER_SET_DATASIZE),
+ 'parity': TelnetSubnegotiation(self, 'parity', SET_PARITY, SERVER_SET_PARITY),
+ 'stopsize': TelnetSubnegotiation(self, 'stopsize', SET_STOPSIZE, SERVER_SET_STOPSIZE),
+ }
+ # There are more subnegotiation objects, combine all in one dictionary
+ # for easy access
+ self._rfc2217_options = {
+ 'purge': TelnetSubnegotiation(self, 'purge', PURGE_DATA, SERVER_PURGE_DATA),
+ 'control': TelnetSubnegotiation(self, 'control', SET_CONTROL, SERVER_SET_CONTROL),
+ }
+ self._rfc2217_options.update(self._rfc2217_port_settings)
+ # cache for line and modem states that the server sends to us
+ self._linestate = 0
+ self._modemstate = None
+ self._modemstate_expires = 0
+ # RFC 2217 flow control between server and client
+ self._remote_suspend_flow = False
+
+ self._thread = threading.Thread(target=self._telnetReadLoop)
+ self._thread.setDaemon(True)
+ self._thread.setName('pySerial RFC 2217 reader thread for %s' % (self._port,))
+ self._thread.start()
+
+ # negotiate Telnet/RFC 2217 -> send initial requests
+ for option in self._telnet_options:
+ if option.state is REQUESTED:
+ self.telnetSendOption(option.send_yes, option.option)
+ # now wait until important options are negotiated
+ timeout_time = time.time() + self._network_timeout
+ while time.time() < timeout_time:
+ time.sleep(0.05) # prevent 100% CPU load
+ if sum(o.active for o in mandadory_options) == len(mandadory_options):
+ break
+ else:
+ raise SerialException("Remote does not seem to support RFC2217 or BINARY mode %r" % mandadory_options)
+ if self.logger:
+ self.logger.info("Negotiated options: %s" % self._telnet_options)
+
+ # fine, go on, set RFC 2271 specific things
+ self._reconfigurePort()
+ # all things set up get, now a clean start
+ self._isOpen = True
+ if not self._rtscts:
+ self.setRTS(True)
+ self.setDTR(True)
+ self.flushInput()
+ self.flushOutput()
+
+ def _reconfigurePort(self):
+ """Set communication parameters on opened port."""
+ if self._socket is None:
+ raise SerialException("Can only operate on open ports")
+
+ # if self._timeout != 0 and self._interCharTimeout is not None:
+ # XXX
+
+ if self._writeTimeout is not None:
+ raise NotImplementedError('writeTimeout is currently not supported')
+ # XXX
+
+ # Setup the connection
+ # to get good performance, all parameter changes are sent first...
+ if not isinstance(self._baudrate, (int, long)) or not 0 < self._baudrate < 2**32:
+ raise ValueError("invalid baudrate: %r" % (self._baudrate))
+ self._rfc2217_port_settings['baudrate'].set(struct.pack('!I', self._baudrate))
+ self._rfc2217_port_settings['datasize'].set(struct.pack('!B', self._bytesize))
+ self._rfc2217_port_settings['parity'].set(struct.pack('!B', RFC2217_PARITY_MAP[self._parity]))
+ self._rfc2217_port_settings['stopsize'].set(struct.pack('!B', RFC2217_STOPBIT_MAP[self._stopbits]))
+
+ # and now wait until parameters are active
+ items = self._rfc2217_port_settings.values()
+ if self.logger:
+ self.logger.debug("Negotiating settings: %s" % (items,))
+ timeout_time = time.time() + self._network_timeout
+ while time.time() < timeout_time:
+ time.sleep(0.05) # prevent 100% CPU load
+ if sum(o.active for o in items) == len(items):
+ break
+ else:
+ raise SerialException("Remote does not accept parameter change (RFC2217): %r" % items)
+ if self.logger:
+ self.logger.info("Negotiated settings: %s" % (items,))
+
+ if self._rtscts and self._xonxoff:
+ raise ValueError('xonxoff and rtscts together are not supported')
+ elif self._rtscts:
+ self.rfc2217SetControl(SET_CONTROL_USE_HW_FLOW_CONTROL)
+ elif self._xonxoff:
+ self.rfc2217SetControl(SET_CONTROL_USE_SW_FLOW_CONTROL)
+ else:
+ self.rfc2217SetControl(SET_CONTROL_USE_NO_FLOW_CONTROL)
+
+ def close(self):
+ """Close port"""
+ if self._isOpen:
+ if self._socket:
+ try:
+ self._socket.shutdown(socket.SHUT_RDWR)
+ self._socket.close()
+ except:
+ # ignore errors.
+ pass
+ self._socket = None
+ if self._thread:
+ self._thread.join()
+ self._isOpen = False
+ # in case of quick reconnects, give the server some time
+ time.sleep(0.3)
+
+ def makeDeviceName(self, port):
+ raise SerialException("there is no sensible way to turn numbers into URLs")
+
+ def fromURL(self, url):
+ """extract host and port from an URL string"""
+ if url.lower().startswith("rfc2217://"): url = url[10:]
+ try:
+ # is there a "path" (our options)?
+ if '/' in url:
+ # cut away options
+ url, options = url.split('/', 1)
+ # process options now, directly altering self
+ for option in options.split('/'):
+ if '=' in option:
+ option, value = option.split('=', 1)
+ else:
+ value = None
+ if option == 'logging':
+ logging.basicConfig() # XXX is that good to call it here?
+ self.logger = logging.getLogger('pySerial.rfc2217')
+ self.logger.setLevel(LOGGER_LEVELS[value])
+ self.logger.debug('enabled logging')
+ elif option == 'ign_set_control':
+ self._ignore_set_control_answer = True
+ elif option == 'poll_modem':
+ self._poll_modem_state = True
+ elif option == 'timeout':
+ self._network_timeout = float(value)
+ else:
+ raise ValueError('unknown option: %r' % (option,))
+ # get host and port
+ host, port = url.split(':', 1) # may raise ValueError because of unpacking
+ port = int(port) # and this if it's not a number
+ if not 0 <= port < 65536: raise ValueError("port not in range 0...65535")
+ except ValueError, e:
+ raise SerialException('expected a string in the form "[rfc2217://]<host>:<port>[/option[/option...]]": %s' % e)
+ return (host, port)
+
+ # - - - - - - - - - - - - - - - - - - - - - - - -
+
+ def inWaiting(self):
+ """Return the number of characters currently in the input buffer."""
+ if not self._isOpen: raise portNotOpenError
+ return self._read_buffer.qsize()
+
+ def read(self, size=1):
+ """\
+ Read size bytes from the serial port. If a timeout is set it may
+ return less characters as requested. With no timeout it will block
+ until the requested number of bytes is read.
+ """
+ if not self._isOpen: raise portNotOpenError
+ data = bytearray()
+ try:
+ while len(data) < size:
+ if self._thread is None:
+ raise SerialException('connection failed (reader thread died)')
+ data.append(self._read_buffer.get(True, self._timeout))
+ except Queue.Empty: # -> timeout
+ pass
+ return bytes(data)
+
+ def write(self, data):
+ """\
+ Output the given string over the serial port. Can block if the
+ connection is blocked. May raise SerialException if the connection is
+ closed.
+ """
+ if not self._isOpen: raise portNotOpenError
+ self._write_lock.acquire()
+ try:
+ try:
+ self._socket.sendall(to_bytes(data).replace(IAC, IAC_DOUBLED))
+ except socket.error, e:
+ raise SerialException("connection failed (socket error): %s" % e) # XXX what exception if socket connection fails
+ finally:
+ self._write_lock.release()
+ return len(data)
+
+ def flushInput(self):
+ """Clear input buffer, discarding all that is in the buffer."""
+ if not self._isOpen: raise portNotOpenError
+ self.rfc2217SendPurge(PURGE_RECEIVE_BUFFER)
+ # empty read buffer
+ while self._read_buffer.qsize():
+ self._read_buffer.get(False)
+
+ def flushOutput(self):
+ """\
+ Clear output buffer, aborting the current output and
+ discarding all that is in the buffer.
+ """
+ if not self._isOpen: raise portNotOpenError
+ self.rfc2217SendPurge(PURGE_TRANSMIT_BUFFER)
+
+ def sendBreak(self, duration=0.25):
+ """Send break condition. Timed, returns to idle state after given
+ duration."""
+ if not self._isOpen: raise portNotOpenError
+ self.setBreak(True)
+ time.sleep(duration)
+ self.setBreak(False)
+
+ def setBreak(self, level=True):
+ """\
+ Set break: Controls TXD. When active, to transmitting is
+ possible.
+ """
+ if not self._isOpen: raise portNotOpenError
+ if self.logger:
+ self.logger.info('set BREAK to %s' % ('inactive', 'active')[bool(level)])
+ if level:
+ self.rfc2217SetControl(SET_CONTROL_BREAK_ON)
+ else:
+ self.rfc2217SetControl(SET_CONTROL_BREAK_OFF)
+
+ def setRTS(self, level=True):
+ """Set terminal status line: Request To Send."""
+ if not self._isOpen: raise portNotOpenError
+ if self.logger:
+ self.logger.info('set RTS to %s' % ('inactive', 'active')[bool(level)])
+ if level:
+ self.rfc2217SetControl(SET_CONTROL_RTS_ON)
+ else:
+ self.rfc2217SetControl(SET_CONTROL_RTS_OFF)
+
+ def setDTR(self, level=True):
+ """Set terminal status line: Data Terminal Ready."""
+ if not self._isOpen: raise portNotOpenError
+ if self.logger:
+ self.logger.info('set DTR to %s' % ('inactive', 'active')[bool(level)])
+ if level:
+ self.rfc2217SetControl(SET_CONTROL_DTR_ON)
+ else:
+ self.rfc2217SetControl(SET_CONTROL_DTR_OFF)
+
+ def getCTS(self):
+ """Read terminal status line: Clear To Send."""
+ if not self._isOpen: raise portNotOpenError
+ return bool(self.getModemState() & MODEMSTATE_MASK_CTS)
+
+ def getDSR(self):
+ """Read terminal status line: Data Set Ready."""
+ if not self._isOpen: raise portNotOpenError
+ return bool(self.getModemState() & MODEMSTATE_MASK_DSR)
+
+ def getRI(self):
+ """Read terminal status line: Ring Indicator."""
+ if not self._isOpen: raise portNotOpenError
+ return bool(self.getModemState() & MODEMSTATE_MASK_RI)
+
+ def getCD(self):
+ """Read terminal status line: Carrier Detect."""
+ if not self._isOpen: raise portNotOpenError
+ return bool(self.getModemState() & MODEMSTATE_MASK_CD)
+
+ # - - - platform specific - - -
+ # None so far
+
+ # - - - RFC2217 specific - - -
+
+ def _telnetReadLoop(self):
+ """read loop for the socket."""
+ mode = M_NORMAL
+ suboption = None
+ try:
+ while self._socket is not None:
+ try:
+ data = self._socket.recv(1024)
+ except socket.timeout:
+ # just need to get out of recv form time to time to check if
+ # still alive
+ continue
+ except socket.error, e:
+ # connection fails -> terminate loop
+ if self.logger:
+ self.logger.debug("socket error in reader thread: %s" % (e,))
+ break
+ if not data: break # lost connection
+ for byte in data:
+ if mode == M_NORMAL:
+ # interpret as command or as data
+ if byte == IAC:
+ mode = M_IAC_SEEN
+ else:
+ # store data in read buffer or sub option buffer
+ # depending on state
+ if suboption is not None:
+ suboption.append(byte)
+ else:
+ self._read_buffer.put(byte)
+ elif mode == M_IAC_SEEN:
+ if byte == IAC:
+ # interpret as command doubled -> insert character
+ # itself
+ if suboption is not None:
+ suboption.append(IAC)
+ else:
+ self._read_buffer.put(IAC)
+ mode = M_NORMAL
+ elif byte == SB:
+ # sub option start
+ suboption = bytearray()
+ mode = M_NORMAL
+ elif byte == SE:
+ # sub option end -> process it now
+ self._telnetProcessSubnegotiation(bytes(suboption))
+ suboption = None
+ mode = M_NORMAL
+ elif byte in (DO, DONT, WILL, WONT):
+ # negotiation
+ telnet_command = byte
+ mode = M_NEGOTIATE
+ else:
+ # other telnet commands
+ self._telnetProcessCommand(byte)
+ mode = M_NORMAL
+ elif mode == M_NEGOTIATE: # DO, DONT, WILL, WONT was received, option now following
+ self._telnetNegotiateOption(telnet_command, byte)
+ mode = M_NORMAL
+ finally:
+ self._thread = None
+ if self.logger:
+ self.logger.debug("read thread terminated")
+
+ # - incoming telnet commands and options
+
+ def _telnetProcessCommand(self, command):
+ """Process commands other than DO, DONT, WILL, WONT."""
+ # Currently none. RFC2217 only uses negotiation and subnegotiation.
+ if self.logger:
+ self.logger.warning("ignoring Telnet command: %r" % (command,))
+
+ def _telnetNegotiateOption(self, command, option):
+ """Process incoming DO, DONT, WILL, WONT."""
+ # check our registered telnet options and forward command to them
+ # they know themselves if they have to answer or not
+ known = False
+ for item in self._telnet_options:
+ # can have more than one match! as some options are duplicated for
+ # 'us' and 'them'
+ if item.option == option:
+ item.process_incoming(command)
+ known = True
+ if not known:
+ # handle unknown options
+ # only answer to positive requests and deny them
+ if command == WILL or command == DO:
+ self.telnetSendOption((command == WILL and DONT or WONT), option)
+ if self.logger:
+ self.logger.warning("rejected Telnet option: %r" % (option,))
+
+
+ def _telnetProcessSubnegotiation(self, suboption):
+ """Process subnegotiation, the data between IAC SB and IAC SE."""
+ if suboption[0:1] == COM_PORT_OPTION:
+ if suboption[1:2] == SERVER_NOTIFY_LINESTATE and len(suboption) >= 3:
+ self._linestate = ord(suboption[2:3]) # ensure it is a number
+ if self.logger:
+ self.logger.info("NOTIFY_LINESTATE: %s" % self._linestate)
+ elif suboption[1:2] == SERVER_NOTIFY_MODEMSTATE and len(suboption) >= 3:
+ self._modemstate = ord(suboption[2:3]) # ensure it is a number
+ if self.logger:
+ self.logger.info("NOTIFY_MODEMSTATE: %s" % self._modemstate)
+ # update time when we think that a poll would make sense
+ self._modemstate_expires = time.time() + 0.3
+ elif suboption[1:2] == FLOWCONTROL_SUSPEND:
+ self._remote_suspend_flow = True
+ elif suboption[1:2] == FLOWCONTROL_RESUME:
+ self._remote_suspend_flow = False
+ else:
+ for item in self._rfc2217_options.values():
+ if item.ack_option == suboption[1:2]:
+ #~ print "processing COM_PORT_OPTION: %r" % list(suboption[1:])
+ item.checkAnswer(bytes(suboption[2:]))
+ break
+ else:
+ if self.logger:
+ self.logger.warning("ignoring COM_PORT_OPTION: %r" % (suboption,))
+ else:
+ if self.logger:
+ self.logger.warning("ignoring subnegotiation: %r" % (suboption,))
+
+ # - outgoing telnet commands and options
+
+ def _internal_raw_write(self, data):
+ """internal socket write with no data escaping. used to send telnet stuff."""
+ self._write_lock.acquire()
+ try:
+ self._socket.sendall(data)
+ finally:
+ self._write_lock.release()
+
+ def telnetSendOption(self, action, option):
+ """Send DO, DONT, WILL, WONT."""
+ self._internal_raw_write(to_bytes([IAC, action, option]))
+
+ def rfc2217SendSubnegotiation(self, option, value=''):
+ """Subnegotiation of RFC2217 parameters."""
+ value = value.replace(IAC, IAC_DOUBLED)
+ self._internal_raw_write(to_bytes([IAC, SB, COM_PORT_OPTION, option] + list(value) + [IAC, SE]))
+
+ def rfc2217SendPurge(self, value):
+ item = self._rfc2217_options['purge']
+ item.set(value) # transmit desired purge type
+ item.wait(self._network_timeout) # wait for acknowledge from the server
+
+ def rfc2217SetControl(self, value):
+ item = self._rfc2217_options['control']
+ item.set(value) # transmit desired control type
+ if self._ignore_set_control_answer:
+ # answers are ignored when option is set. compatibility mode for
+ # servers that answer, but not the expected one... (or no answer
+ # at all) i.e. sredird
+ time.sleep(0.1) # this helps getting the unit tests passed
+ else:
+ item.wait(self._network_timeout) # wait for acknowledge from the server
+
+ def rfc2217FlowServerReady(self):
+ """\
+ check if server is ready to receive data. block for some time when
+ not.
+ """
+ #~ if self._remote_suspend_flow:
+ #~ wait---
+
+ def getModemState(self):
+ """\
+ get last modem state (cached value. if value is "old", request a new
+ one. this cache helps that we don't issue to many requests when e.g. all
+ status lines, one after the other is queried by te user (getCTS, getDSR
+ etc.)
+ """
+ # active modem state polling enabled? is the value fresh enough?
+ if self._poll_modem_state and self._modemstate_expires < time.time():
+ if self.logger:
+ self.logger.debug('polling modem state')
+ # when it is older, request an update
+ self.rfc2217SendSubnegotiation(NOTIFY_MODEMSTATE)
+ timeout_time = time.time() + self._network_timeout
+ while time.time() < timeout_time:
+ time.sleep(0.05) # prevent 100% CPU load
+ # when expiration time is updated, it means that there is a new
+ # value
+ if self._modemstate_expires > time.time():
+ if self.logger:
+ self.logger.warning('poll for modem state failed')
+ break
+ # even when there is a timeout, do not generate an error just
+ # return the last known value. this way we can support buggy
+ # servers that do not respond to polls, but send automatic
+ # updates.
+ if self._modemstate is not None:
+ if self.logger:
+ self.logger.debug('using cached modem state')
+ return self._modemstate
+ else:
+ # never received a notification from the server
+ raise SerialException("remote sends no NOTIFY_MODEMSTATE")
+
+
+# assemble Serial class with the platform specific implementation and the base
+# for file-like behavior. for Python 2.6 and newer, that provide the new I/O
+# library, derive from io.RawIOBase
+try:
+ import io
+except ImportError:
+ # classic version with our own file-like emulation
+ class Serial(RFC2217Serial, FileLike):
+ pass
+else:
+ # io library present
+ class Serial(RFC2217Serial, io.RawIOBase):
+ pass
+
+
+#############################################################################
+# The following is code that helps implementing an RFC 2217 server.
+
+class PortManager(object):
+ """\
+ This class manages the state of Telnet and RFC 2217. It needs a serial
+ instance and a connection to work with. Connection is expected to implement
+ a (thread safe) write function, that writes the string to the network.
+ """
+
+ def __init__(self, serial_port, connection, logger=None):
+ self.serial = serial_port
+ self.connection = connection
+ self.logger = logger
+ self._client_is_rfc2217 = False
+
+ # filter state machine
+ self.mode = M_NORMAL
+ self.suboption = None
+ self.telnet_command = None
+
+ # states for modem/line control events
+ self.modemstate_mask = 255
+ self.last_modemstate = None
+ self.linstate_mask = 0
+
+ # all supported telnet options
+ self._telnet_options = [
+ TelnetOption(self, 'ECHO', ECHO, WILL, WONT, DO, DONT, REQUESTED),
+ TelnetOption(self, 'we-SGA', SGA, WILL, WONT, DO, DONT, REQUESTED),
+ TelnetOption(self, 'they-SGA', SGA, DO, DONT, WILL, WONT, INACTIVE),
+ TelnetOption(self, 'we-BINARY', BINARY, WILL, WONT, DO, DONT, INACTIVE),
+ TelnetOption(self, 'they-BINARY', BINARY, DO, DONT, WILL, WONT, REQUESTED),
+ TelnetOption(self, 'we-RFC2217', COM_PORT_OPTION, WILL, WONT, DO, DONT, REQUESTED, self._client_ok),
+ TelnetOption(self, 'they-RFC2217', COM_PORT_OPTION, DO, DONT, WILL, WONT, INACTIVE, self._client_ok),
+ ]
+
+ # negotiate Telnet/RFC2217 -> send initial requests
+ if self.logger:
+ self.logger.debug("requesting initial Telnet/RFC 2217 options")
+ for option in self._telnet_options:
+ if option.state is REQUESTED:
+ self.telnetSendOption(option.send_yes, option.option)
+ # issue 1st modem state notification
+
+ def _client_ok(self):
+ """\
+ callback of telnet option. it gets called when option is activated.
+ this one here is used to detect when the client agrees on RFC 2217. a
+ flag is set so that other functions like check_modem_lines know if the
+ client is ok.
+ """
+ # The callback is used for we and they so if one party agrees, we're
+ # already happy. it seems not all servers do the negotiation correctly
+ # and i guess there are incorrect clients too.. so be happy if client
+ # answers one or the other positively.
+ self._client_is_rfc2217 = True
+ if self.logger:
+ self.logger.info("client accepts RFC 2217")
+ # this is to ensure that the client gets a notification, even if there
+ # was no change
+ self.check_modem_lines(force_notification=True)
+
+ # - outgoing telnet commands and options
+
+ def telnetSendOption(self, action, option):
+ """Send DO, DONT, WILL, WONT."""
+ self.connection.write(to_bytes([IAC, action, option]))
+
+ def rfc2217SendSubnegotiation(self, option, value=''):
+ """Subnegotiation of RFC 2217 parameters."""
+ value = value.replace(IAC, IAC_DOUBLED)
+ self.connection.write(to_bytes([IAC, SB, COM_PORT_OPTION, option] + list(value) + [IAC, SE]))
+
+ # - check modem lines, needs to be called periodically from user to
+ # establish polling
+
+ def check_modem_lines(self, force_notification=False):
+ modemstate = (
+ (self.serial.getCTS() and MODEMSTATE_MASK_CTS) |
+ (self.serial.getDSR() and MODEMSTATE_MASK_DSR) |
+ (self.serial.getRI() and MODEMSTATE_MASK_RI) |
+ (self.serial.getCD() and MODEMSTATE_MASK_CD)
+ )
+ # check what has changed
+ deltas = modemstate ^ (self.last_modemstate or 0) # when last is None -> 0
+ if deltas & MODEMSTATE_MASK_CTS:
+ modemstate |= MODEMSTATE_MASK_CTS_CHANGE
+ if deltas & MODEMSTATE_MASK_DSR:
+ modemstate |= MODEMSTATE_MASK_DSR_CHANGE
+ if deltas & MODEMSTATE_MASK_RI:
+ modemstate |= MODEMSTATE_MASK_RI_CHANGE
+ if deltas & MODEMSTATE_MASK_CD:
+ modemstate |= MODEMSTATE_MASK_CD_CHANGE
+ # if new state is different and the mask allows this change, send
+ # notification. suppress notifications when client is not rfc2217
+ if modemstate != self.last_modemstate or force_notification:
+ if (self._client_is_rfc2217 and (modemstate & self.modemstate_mask)) or force_notification:
+ self.rfc2217SendSubnegotiation(
+ SERVER_NOTIFY_MODEMSTATE,
+ to_bytes([modemstate & self.modemstate_mask])
+ )
+ if self.logger:
+ self.logger.info("NOTIFY_MODEMSTATE: %s" % (modemstate,))
+ # save last state, but forget about deltas.
+ # otherwise it would also notify about changing deltas which is
+ # probably not very useful
+ self.last_modemstate = modemstate & 0xf0
+
+ # - outgoing data escaping
+
+ def escape(self, data):
+ """\
+ this generator function is for the user. all outgoing data has to be
+ properly escaped, so that no IAC character in the data stream messes up
+ the Telnet state machine in the server.
+
+ socket.sendall(escape(data))
+ """
+ for byte in data:
+ if byte == IAC:
+ yield IAC
+ yield IAC
+ else:
+ yield byte
+
+ # - incoming data filter
+
+ def filter(self, data):
+ """\
+ handle a bunch of incoming bytes. this is a generator. it will yield
+ all characters not of interest for Telnet/RFC 2217.
+
+ The idea is that the reader thread pushes data from the socket through
+ this filter:
+
+ for byte in filter(socket.recv(1024)):
+ # do things like CR/LF conversion/whatever
+ # and write data to the serial port
+ serial.write(byte)
+
+ (socket error handling code left as exercise for the reader)
+ """
+ for byte in data:
+ if self.mode == M_NORMAL:
+ # interpret as command or as data
+ if byte == IAC:
+ self.mode = M_IAC_SEEN
+ else:
+ # store data in sub option buffer or pass it to our
+ # consumer depending on state
+ if self.suboption is not None:
+ self.suboption.append(byte)
+ else:
+ yield byte
+ elif self.mode == M_IAC_SEEN:
+ if byte == IAC:
+ # interpret as command doubled -> insert character
+ # itself
+ if self.suboption is not None:
+ self.suboption.append(byte)
+ else:
+ yield byte
+ self.mode = M_NORMAL
+ elif byte == SB:
+ # sub option start
+ self.suboption = bytearray()
+ self.mode = M_NORMAL
+ elif byte == SE:
+ # sub option end -> process it now
+ self._telnetProcessSubnegotiation(bytes(self.suboption))
+ self.suboption = None
+ self.mode = M_NORMAL
+ elif byte in (DO, DONT, WILL, WONT):
+ # negotiation
+ self.telnet_command = byte
+ self.mode = M_NEGOTIATE
+ else:
+ # other telnet commands
+ self._telnetProcessCommand(byte)
+ self.mode = M_NORMAL
+ elif self.mode == M_NEGOTIATE: # DO, DONT, WILL, WONT was received, option now following
+ self._telnetNegotiateOption(self.telnet_command, byte)
+ self.mode = M_NORMAL
+
+ # - incoming telnet commands and options
+
+ def _telnetProcessCommand(self, command):
+ """Process commands other than DO, DONT, WILL, WONT."""
+ # Currently none. RFC2217 only uses negotiation and subnegotiation.
+ if self.logger:
+ self.logger.warning("ignoring Telnet command: %r" % (command,))
+
+ def _telnetNegotiateOption(self, command, option):
+ """Process incoming DO, DONT, WILL, WONT."""
+ # check our registered telnet options and forward command to them
+ # they know themselves if they have to answer or not
+ known = False
+ for item in self._telnet_options:
+ # can have more than one match! as some options are duplicated for
+ # 'us' and 'them'
+ if item.option == option:
+ item.process_incoming(command)
+ known = True
+ if not known:
+ # handle unknown options
+ # only answer to positive requests and deny them
+ if command == WILL or command == DO:
+ self.telnetSendOption((command == WILL and DONT or WONT), option)
+ if self.logger:
+ self.logger.warning("rejected Telnet option: %r" % (option,))
+
+
+ def _telnetProcessSubnegotiation(self, suboption):
+ """Process subnegotiation, the data between IAC SB and IAC SE."""
+ if suboption[0:1] == COM_PORT_OPTION:
+ if self.logger:
+ self.logger.debug('received COM_PORT_OPTION: %r' % (suboption,))
+ if suboption[1:2] == SET_BAUDRATE:
+ backup = self.serial.baudrate
+ try:
+ (baudrate,) = struct.unpack("!I", suboption[2:6])
+ if baudrate != 0:
+ self.serial.baudrate = baudrate
+ except ValueError, e:
+ if self.logger:
+ self.logger.error("failed to set baud rate: %s" % (e,))
+ self.serial.baudrate = backup
+ else:
+ if self.logger:
+ self.logger.info("%s baud rate: %s" % (baudrate and 'set' or 'get', self.serial.baudrate))
+ self.rfc2217SendSubnegotiation(SERVER_SET_BAUDRATE, struct.pack("!I", self.serial.baudrate))
+ elif suboption[1:2] == SET_DATASIZE:
+ backup = self.serial.bytesize
+ try:
+ (datasize,) = struct.unpack("!B", suboption[2:3])
+ if datasize != 0:
+ self.serial.bytesize = datasize
+ except ValueError, e:
+ if self.logger:
+ self.logger.error("failed to set data size: %s" % (e,))
+ self.serial.bytesize = backup
+ else:
+ if self.logger:
+ self.logger.info("%s data size: %s" % (datasize and 'set' or 'get', self.serial.bytesize))
+ self.rfc2217SendSubnegotiation(SERVER_SET_DATASIZE, struct.pack("!B", self.serial.bytesize))
+ elif suboption[1:2] == SET_PARITY:
+ backup = self.serial.parity
+ try:
+ parity = struct.unpack("!B", suboption[2:3])[0]
+ if parity != 0:
+ self.serial.parity = RFC2217_REVERSE_PARITY_MAP[parity]
+ except ValueError, e:
+ if self.logger:
+ self.logger.error("failed to set parity: %s" % (e,))
+ self.serial.parity = backup
+ else:
+ if self.logger:
+ self.logger.info("%s parity: %s" % (parity and 'set' or 'get', self.serial.parity))
+ self.rfc2217SendSubnegotiation(
+ SERVER_SET_PARITY,
+ struct.pack("!B", RFC2217_PARITY_MAP[self.serial.parity])
+ )
+ elif suboption[1:2] == SET_STOPSIZE:
+ backup = self.serial.stopbits
+ try:
+ stopbits = struct.unpack("!B", suboption[2:3])[0]
+ if stopbits != 0:
+ self.serial.stopbits = RFC2217_REVERSE_STOPBIT_MAP[stopbits]
+ except ValueError, e:
+ if self.logger:
+ self.logger.error("failed to set stop bits: %s" % (e,))
+ self.serial.stopbits = backup
+ else:
+ if self.logger:
+ self.logger.info("%s stop bits: %s" % (stopbits and 'set' or 'get', self.serial.stopbits))
+ self.rfc2217SendSubnegotiation(
+ SERVER_SET_STOPSIZE,
+ struct.pack("!B", RFC2217_STOPBIT_MAP[self.serial.stopbits])
+ )
+ elif suboption[1:2] == SET_CONTROL:
+ if suboption[2:3] == SET_CONTROL_REQ_FLOW_SETTING:
+ if self.serial.xonxoff:
+ self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_USE_SW_FLOW_CONTROL)
+ elif self.serial.rtscts:
+ self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_USE_HW_FLOW_CONTROL)
+ else:
+ self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_USE_NO_FLOW_CONTROL)
+ elif suboption[2:3] == SET_CONTROL_USE_NO_FLOW_CONTROL:
+ self.serial.xonxoff = False
+ self.serial.rtscts = False
+ if self.logger:
+ self.logger.info("changed flow control to None")
+ self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_USE_NO_FLOW_CONTROL)
+ elif suboption[2:3] == SET_CONTROL_USE_SW_FLOW_CONTROL:
+ self.serial.xonxoff = True
+ if self.logger:
+ self.logger.info("changed flow control to XON/XOFF")
+ self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_USE_SW_FLOW_CONTROL)
+ elif suboption[2:3] == SET_CONTROL_USE_HW_FLOW_CONTROL:
+ self.serial.rtscts = True
+ if self.logger:
+ self.logger.info("changed flow control to RTS/CTS")
+ self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_USE_HW_FLOW_CONTROL)
+ elif suboption[2:3] == SET_CONTROL_REQ_BREAK_STATE:
+ if self.logger:
+ self.logger.warning("requested break state - not implemented")
+ pass # XXX needs cached value
+ elif suboption[2:3] == SET_CONTROL_BREAK_ON:
+ self.serial.setBreak(True)
+ if self.logger:
+ self.logger.info("changed BREAK to active")
+ self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_BREAK_ON)
+ elif suboption[2:3] == SET_CONTROL_BREAK_OFF:
+ self.serial.setBreak(False)
+ if self.logger:
+ self.logger.info("changed BREAK to inactive")
+ self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_BREAK_OFF)
+ elif suboption[2:3] == SET_CONTROL_REQ_DTR:
+ if self.logger:
+ self.logger.warning("requested DTR state - not implemented")
+ pass # XXX needs cached value
+ elif suboption[2:3] == SET_CONTROL_DTR_ON:
+ self.serial.setDTR(True)
+ if self.logger:
+ self.logger.info("changed DTR to active")
+ self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_DTR_ON)
+ elif suboption[2:3] == SET_CONTROL_DTR_OFF:
+ self.serial.setDTR(False)
+ if self.logger:
+ self.logger.info("changed DTR to inactive")
+ self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_DTR_OFF)
+ elif suboption[2:3] == SET_CONTROL_REQ_RTS:
+ if self.logger:
+ self.logger.warning("requested RTS state - not implemented")
+ pass # XXX needs cached value
+ #~ self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_RTS_ON)
+ elif suboption[2:3] == SET_CONTROL_RTS_ON:
+ self.serial.setRTS(True)
+ if self.logger:
+ self.logger.info("changed RTS to active")
+ self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_RTS_ON)
+ elif suboption[2:3] == SET_CONTROL_RTS_OFF:
+ self.serial.setRTS(False)
+ if self.logger:
+ self.logger.info("changed RTS to inactive")
+ self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_RTS_OFF)
+ #~ elif suboption[2:3] == SET_CONTROL_REQ_FLOW_SETTING_IN:
+ #~ elif suboption[2:3] == SET_CONTROL_USE_NO_FLOW_CONTROL_IN:
+ #~ elif suboption[2:3] == SET_CONTROL_USE_SW_FLOW_CONTOL_IN:
+ #~ elif suboption[2:3] == SET_CONTROL_USE_HW_FLOW_CONTOL_IN:
+ #~ elif suboption[2:3] == SET_CONTROL_USE_DCD_FLOW_CONTROL:
+ #~ elif suboption[2:3] == SET_CONTROL_USE_DTR_FLOW_CONTROL:
+ #~ elif suboption[2:3] == SET_CONTROL_USE_DSR_FLOW_CONTROL:
+ elif suboption[1:2] == NOTIFY_LINESTATE:
+ # client polls for current state
+ self.rfc2217SendSubnegotiation(
+ SERVER_NOTIFY_LINESTATE,
+ to_bytes([0]) # sorry, nothing like that implemented
+ )
+ elif suboption[1:2] == NOTIFY_MODEMSTATE:
+ if self.logger:
+ self.logger.info("request for modem state")
+ # client polls for current state
+ self.check_modem_lines(force_notification=True)
+ elif suboption[1:2] == FLOWCONTROL_SUSPEND:
+ if self.logger:
+ self.logger.info("suspend")
+ self._remote_suspend_flow = True
+ elif suboption[1:2] == FLOWCONTROL_RESUME:
+ if self.logger:
+ self.logger.info("resume")
+ self._remote_suspend_flow = False
+ elif suboption[1:2] == SET_LINESTATE_MASK:
+ self.linstate_mask = ord(suboption[2:3]) # ensure it is a number
+ if self.logger:
+ self.logger.info("line state mask: 0x%02x" % (self.linstate_mask,))
+ elif suboption[1:2] == SET_MODEMSTATE_MASK:
+ self.modemstate_mask = ord(suboption[2:3]) # ensure it is a number
+ if self.logger:
+ self.logger.info("modem state mask: 0x%02x" % (self.modemstate_mask,))
+ elif suboption[1:2] == PURGE_DATA:
+ if suboption[2:3] == PURGE_RECEIVE_BUFFER:
+ self.serial.flushInput()
+ if self.logger:
+ self.logger.info("purge in")
+ self.rfc2217SendSubnegotiation(SERVER_PURGE_DATA, PURGE_RECEIVE_BUFFER)
+ elif suboption[2:3] == PURGE_TRANSMIT_BUFFER:
+ self.serial.flushOutput()
+ if self.logger:
+ self.logger.info("purge out")
+ self.rfc2217SendSubnegotiation(SERVER_PURGE_DATA, PURGE_TRANSMIT_BUFFER)
+ elif suboption[2:3] == PURGE_BOTH_BUFFERS:
+ self.serial.flushInput()
+ self.serial.flushOutput()
+ if self.logger:
+ self.logger.info("purge both")
+ self.rfc2217SendSubnegotiation(SERVER_PURGE_DATA, PURGE_BOTH_BUFFERS)
+ else:
+ if self.logger:
+ self.logger.error("undefined PURGE_DATA: %r" % list(suboption[2:]))
+ else:
+ if self.logger:
+ self.logger.error("undefined COM_PORT_OPTION: %r" % list(suboption[1:]))
+ else:
+ if self.logger:
+ self.logger.warning("unknown subnegotiation: %r" % (suboption,))
+
+
+# simple client test
+if __name__ == '__main__':
+ import sys
+ s = Serial('rfc2217://localhost:7000', 115200)
+ sys.stdout.write('%s\n' % s)
+
+ #~ s.baudrate = 1898
+
+ sys.stdout.write("write...\n")
+ s.write("hello\n")
+ s.flush()
+ sys.stdout.write("read: %s\n" % s.read(5))
+
+ #~ s.baudrate = 19200
+ #~ s.databits = 7
+ s.close()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/serialcli.py b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/serialcli.py
new file mode 100644
index 0000000..19169a3
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/serialcli.py
@@ -0,0 +1,273 @@
+#! python
+# Python Serial Port Extension for Win32, Linux, BSD, Jython and .NET/Mono
+# serial driver for .NET/Mono (IronPython), .NET >= 2
+# see __init__.py
+#
+# (C) 2008 Chris Liechti <cliechti@gmx.net>
+# this is distributed under a free software license, see license.txt
+
+import clr
+import System
+import System.IO.Ports
+from serial.serialutil import *
+
+
+def device(portnum):
+ """Turn a port number into a device name"""
+ return System.IO.Ports.SerialPort.GetPortNames()[portnum]
+
+
+# must invoke function with byte array, make a helper to convert strings
+# to byte arrays
+sab = System.Array[System.Byte]
+def as_byte_array(string):
+ return sab([ord(x) for x in string]) # XXX will require adaption when run with a 3.x compatible IronPython
+
+class IronSerial(SerialBase):
+ """Serial port implementation for .NET/Mono."""
+
+ BAUDRATES = (50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
+ 9600, 19200, 38400, 57600, 115200)
+
+ def open(self):
+ """Open port with current settings. This may throw a SerialException
+ if the port cannot be opened."""
+ if self._port is None:
+ raise SerialException("Port must be configured before it can be used.")
+ if self._isOpen:
+ raise SerialException("Port is already open.")
+ try:
+ self._port_handle = System.IO.Ports.SerialPort(self.portstr)
+ except Exception, msg:
+ self._port_handle = None
+ raise SerialException("could not open port %s: %s" % (self.portstr, msg))
+
+ self._reconfigurePort()
+ self._port_handle.Open()
+ self._isOpen = True
+ if not self._rtscts:
+ self.setRTS(True)
+ self.setDTR(True)
+ self.flushInput()
+ self.flushOutput()
+
+ def _reconfigurePort(self):
+ """Set communication parameters on opened port."""
+ if not self._port_handle:
+ raise SerialException("Can only operate on a valid port handle")
+
+ #~ self._port_handle.ReceivedBytesThreshold = 1
+
+ if self._timeout is None:
+ self._port_handle.ReadTimeout = System.IO.Ports.SerialPort.InfiniteTimeout
+ else:
+ self._port_handle.ReadTimeout = int(self._timeout*1000)
+
+ # if self._timeout != 0 and self._interCharTimeout is not None:
+ # timeouts = (int(self._interCharTimeout * 1000),) + timeouts[1:]
+
+ if self._writeTimeout is None:
+ self._port_handle.WriteTimeout = System.IO.Ports.SerialPort.InfiniteTimeout
+ else:
+ self._port_handle.WriteTimeout = int(self._writeTimeout*1000)
+
+
+ # Setup the connection info.
+ try:
+ self._port_handle.BaudRate = self._baudrate
+ except IOError, e:
+ # catch errors from illegal baudrate settings
+ raise ValueError(str(e))
+
+ if self._bytesize == FIVEBITS:
+ self._port_handle.DataBits = 5
+ elif self._bytesize == SIXBITS:
+ self._port_handle.DataBits = 6
+ elif self._bytesize == SEVENBITS:
+ self._port_handle.DataBits = 7
+ elif self._bytesize == EIGHTBITS:
+ self._port_handle.DataBits = 8
+ else:
+ raise ValueError("Unsupported number of data bits: %r" % self._bytesize)
+
+ if self._parity == PARITY_NONE:
+ self._port_handle.Parity = getattr(System.IO.Ports.Parity, 'None') # reserved keyword in Py3k
+ elif self._parity == PARITY_EVEN:
+ self._port_handle.Parity = System.IO.Ports.Parity.Even
+ elif self._parity == PARITY_ODD:
+ self._port_handle.Parity = System.IO.Ports.Parity.Odd
+ elif self._parity == PARITY_MARK:
+ self._port_handle.Parity = System.IO.Ports.Parity.Mark
+ elif self._parity == PARITY_SPACE:
+ self._port_handle.Parity = System.IO.Ports.Parity.Space
+ else:
+ raise ValueError("Unsupported parity mode: %r" % self._parity)
+
+ if self._stopbits == STOPBITS_ONE:
+ self._port_handle.StopBits = System.IO.Ports.StopBits.One
+ elif self._stopbits == STOPBITS_ONE_POINT_FIVE:
+ self._port_handle.StopBits = System.IO.Ports.StopBits.OnePointFive
+ elif self._stopbits == STOPBITS_TWO:
+ self._port_handle.StopBits = System.IO.Ports.StopBits.Two
+ else:
+ raise ValueError("Unsupported number of stop bits: %r" % self._stopbits)
+
+ if self._rtscts and self._xonxoff:
+ self._port_handle.Handshake = System.IO.Ports.Handshake.RequestToSendXOnXOff
+ elif self._rtscts:
+ self._port_handle.Handshake = System.IO.Ports.Handshake.RequestToSend
+ elif self._xonxoff:
+ self._port_handle.Handshake = System.IO.Ports.Handshake.XOnXOff
+ else:
+ self._port_handle.Handshake = getattr(System.IO.Ports.Handshake, 'None') # reserved keyword in Py3k
+
+ #~ def __del__(self):
+ #~ self.close()
+
+ def close(self):
+ """Close port"""
+ if self._isOpen:
+ if self._port_handle:
+ try:
+ self._port_handle.Close()
+ except System.IO.Ports.InvalidOperationException:
+ # ignore errors. can happen for unplugged USB serial devices
+ pass
+ self._port_handle = None
+ self._isOpen = False
+
+ def makeDeviceName(self, port):
+ try:
+ return device(port)
+ except TypeError, e:
+ raise SerialException(str(e))
+
+ # - - - - - - - - - - - - - - - - - - - - - - - -
+
+ def inWaiting(self):
+ """Return the number of characters currently in the input buffer."""
+ if not self._port_handle: raise portNotOpenError
+ return self._port_handle.BytesToRead
+
+ def read(self, size=1):
+ """Read size bytes from the serial port. If a timeout is set it may
+ return less characters as requested. With no timeout it will block
+ until the requested number of bytes is read."""
+ if not self._port_handle: raise portNotOpenError
+ # must use single byte reads as this is the only way to read
+ # without applying encodings
+ data = bytearray()
+ while size:
+ try:
+ data.append(self._port_handle.ReadByte())
+ except System.TimeoutException, e:
+ break
+ else:
+ size -= 1
+ return bytes(data)
+
+ def write(self, data):
+ """Output the given string over the serial port."""
+ if not self._port_handle: raise portNotOpenError
+ if not isinstance(data, (bytes, bytearray)):
+ raise TypeError('expected %s or bytearray, got %s' % (bytes, type(data)))
+ try:
+ # must call overloaded method with byte array argument
+ # as this is the only one not applying encodings
+ self._port_handle.Write(as_byte_array(data), 0, len(data))
+ except System.TimeoutException, e:
+ raise writeTimeoutError
+ return len(data)
+
+ def flushInput(self):
+ """Clear input buffer, discarding all that is in the buffer."""
+ if not self._port_handle: raise portNotOpenError
+ self._port_handle.DiscardInBuffer()
+
+ def flushOutput(self):
+ """Clear output buffer, aborting the current output and
+ discarding all that is in the buffer."""
+ if not self._port_handle: raise portNotOpenError
+ self._port_handle.DiscardOutBuffer()
+
+ def sendBreak(self, duration=0.25):
+ """Send break condition. Timed, returns to idle state after given duration."""
+ if not self._port_handle: raise portNotOpenError
+ import time
+ self._port_handle.BreakState = True
+ time.sleep(duration)
+ self._port_handle.BreakState = False
+
+ def setBreak(self, level=True):
+ """Set break: Controls TXD. When active, to transmitting is possible."""
+ if not self._port_handle: raise portNotOpenError
+ self._port_handle.BreakState = bool(level)
+
+ def setRTS(self, level=True):
+ """Set terminal status line: Request To Send"""
+ if not self._port_handle: raise portNotOpenError
+ self._port_handle.RtsEnable = bool(level)
+
+ def setDTR(self, level=True):
+ """Set terminal status line: Data Terminal Ready"""
+ if not self._port_handle: raise portNotOpenError
+ self._port_handle.DtrEnable = bool(level)
+
+ def getCTS(self):
+ """Read terminal status line: Clear To Send"""
+ if not self._port_handle: raise portNotOpenError
+ return self._port_handle.CtsHolding
+
+ def getDSR(self):
+ """Read terminal status line: Data Set Ready"""
+ if not self._port_handle: raise portNotOpenError
+ return self._port_handle.DsrHolding
+
+ def getRI(self):
+ """Read terminal status line: Ring Indicator"""
+ if not self._port_handle: raise portNotOpenError
+ #~ return self._port_handle.XXX
+ return False #XXX an error would be better
+
+ def getCD(self):
+ """Read terminal status line: Carrier Detect"""
+ if not self._port_handle: raise portNotOpenError
+ return self._port_handle.CDHolding
+
+ # - - platform specific - - - -
+ # none
+
+
+# assemble Serial class with the platform specific implementation and the base
+# for file-like behavior. for Python 2.6 and newer, that provide the new I/O
+# library, derive from io.RawIOBase
+try:
+ import io
+except ImportError:
+ # classic version with our own file-like emulation
+ class Serial(IronSerial, FileLike):
+ pass
+else:
+ # io library present
+ class Serial(IronSerial, io.RawIOBase):
+ pass
+
+
+# Nur Testfunktion!!
+if __name__ == '__main__':
+ import sys
+
+ s = Serial(0)
+ sys.stdio.write('%s\n' % s)
+
+ s = Serial()
+ sys.stdio.write('%s\n' % s)
+
+
+ s.baudrate = 19200
+ s.databits = 7
+ s.close()
+ s.port = 0
+ s.open()
+ sys.stdio.write('%s\n' % s)
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/serialjava.py b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/serialjava.py
new file mode 100644
index 0000000..46a78f8
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/serialjava.py
@@ -0,0 +1,262 @@
+#!jython
+#
+# Python Serial Port Extension for Win32, Linux, BSD, Jython
+# module for serial IO for Jython and JavaComm
+# see __init__.py
+#
+# (C) 2002-2008 Chris Liechti <cliechti@gmx.net>
+# this is distributed under a free software license, see license.txt
+
+from serial.serialutil import *
+
+def my_import(name):
+ mod = __import__(name)
+ components = name.split('.')
+ for comp in components[1:]:
+ mod = getattr(mod, comp)
+ return mod
+
+
+def detect_java_comm(names):
+ """try given list of modules and return that imports"""
+ for name in names:
+ try:
+ mod = my_import(name)
+ mod.SerialPort
+ return mod
+ except (ImportError, AttributeError):
+ pass
+ raise ImportError("No Java Communications API implementation found")
+
+
+# Java Communications API implementations
+# http://mho.republika.pl/java/comm/
+
+comm = detect_java_comm([
+ 'javax.comm', # Sun/IBM
+ 'gnu.io', # RXTX
+])
+
+
+def device(portnumber):
+ """Turn a port number into a device name"""
+ enum = comm.CommPortIdentifier.getPortIdentifiers()
+ ports = []
+ while enum.hasMoreElements():
+ el = enum.nextElement()
+ if el.getPortType() == comm.CommPortIdentifier.PORT_SERIAL:
+ ports.append(el)
+ return ports[portnumber].getName()
+
+
+class JavaSerial(SerialBase):
+ """Serial port class, implemented with Java Communications API and
+ thus usable with jython and the appropriate java extension."""
+
+ def open(self):
+ """Open port with current settings. This may throw a SerialException
+ if the port cannot be opened."""
+ if self._port is None:
+ raise SerialException("Port must be configured before it can be used.")
+ if self._isOpen:
+ raise SerialException("Port is already open.")
+ if type(self._port) == type(''): # strings are taken directly
+ portId = comm.CommPortIdentifier.getPortIdentifier(self._port)
+ else:
+ portId = comm.CommPortIdentifier.getPortIdentifier(device(self._port)) # numbers are transformed to a comport id obj
+ try:
+ self.sPort = portId.open("python serial module", 10)
+ except Exception, msg:
+ self.sPort = None
+ raise SerialException("Could not open port: %s" % msg)
+ self._reconfigurePort()
+ self._instream = self.sPort.getInputStream()
+ self._outstream = self.sPort.getOutputStream()
+ self._isOpen = True
+
+ def _reconfigurePort(self):
+ """Set communication parameters on opened port."""
+ if not self.sPort:
+ raise SerialException("Can only operate on a valid port handle")
+
+ self.sPort.enableReceiveTimeout(30)
+ if self._bytesize == FIVEBITS:
+ jdatabits = comm.SerialPort.DATABITS_5
+ elif self._bytesize == SIXBITS:
+ jdatabits = comm.SerialPort.DATABITS_6
+ elif self._bytesize == SEVENBITS:
+ jdatabits = comm.SerialPort.DATABITS_7
+ elif self._bytesize == EIGHTBITS:
+ jdatabits = comm.SerialPort.DATABITS_8
+ else:
+ raise ValueError("unsupported bytesize: %r" % self._bytesize)
+
+ if self._stopbits == STOPBITS_ONE:
+ jstopbits = comm.SerialPort.STOPBITS_1
+ elif stopbits == STOPBITS_ONE_POINT_FIVE:
+ self._jstopbits = comm.SerialPort.STOPBITS_1_5
+ elif self._stopbits == STOPBITS_TWO:
+ jstopbits = comm.SerialPort.STOPBITS_2
+ else:
+ raise ValueError("unsupported number of stopbits: %r" % self._stopbits)
+
+ if self._parity == PARITY_NONE:
+ jparity = comm.SerialPort.PARITY_NONE
+ elif self._parity == PARITY_EVEN:
+ jparity = comm.SerialPort.PARITY_EVEN
+ elif self._parity == PARITY_ODD:
+ jparity = comm.SerialPort.PARITY_ODD
+ elif self._parity == PARITY_MARK:
+ jparity = comm.SerialPort.PARITY_MARK
+ elif self._parity == PARITY_SPACE:
+ jparity = comm.SerialPort.PARITY_SPACE
+ else:
+ raise ValueError("unsupported parity type: %r" % self._parity)
+
+ jflowin = jflowout = 0
+ if self._rtscts:
+ jflowin |= comm.SerialPort.FLOWCONTROL_RTSCTS_IN
+ jflowout |= comm.SerialPort.FLOWCONTROL_RTSCTS_OUT
+ if self._xonxoff:
+ jflowin |= comm.SerialPort.FLOWCONTROL_XONXOFF_IN
+ jflowout |= comm.SerialPort.FLOWCONTROL_XONXOFF_OUT
+
+ self.sPort.setSerialPortParams(self._baudrate, jdatabits, jstopbits, jparity)
+ self.sPort.setFlowControlMode(jflowin | jflowout)
+
+ if self._timeout >= 0:
+ self.sPort.enableReceiveTimeout(self._timeout*1000)
+ else:
+ self.sPort.disableReceiveTimeout()
+
+ def close(self):
+ """Close port"""
+ if self._isOpen:
+ if self.sPort:
+ self._instream.close()
+ self._outstream.close()
+ self.sPort.close()
+ self.sPort = None
+ self._isOpen = False
+
+ def makeDeviceName(self, port):
+ return device(port)
+
+ # - - - - - - - - - - - - - - - - - - - - - - - -
+
+ def inWaiting(self):
+ """Return the number of characters currently in the input buffer."""
+ if not self.sPort: raise portNotOpenError
+ return self._instream.available()
+
+ def read(self, size=1):
+ """Read size bytes from the serial port. If a timeout is set it may
+ return less characters as requested. With no timeout it will block
+ until the requested number of bytes is read."""
+ if not self.sPort: raise portNotOpenError
+ read = bytearray()
+ if size > 0:
+ while len(read) < size:
+ x = self._instream.read()
+ if x == -1:
+ if self.timeout >= 0:
+ break
+ else:
+ read.append(x)
+ return bytes(read)
+
+ def write(self, data):
+ """Output the given string over the serial port."""
+ if not self.sPort: raise portNotOpenError
+ if not isinstance(data, (bytes, bytearray)):
+ raise TypeError('expected %s or bytearray, got %s' % (bytes, type(data)))
+ self._outstream.write(data)
+ return len(data)
+
+ def flushInput(self):
+ """Clear input buffer, discarding all that is in the buffer."""
+ if not self.sPort: raise portNotOpenError
+ self._instream.skip(self._instream.available())
+
+ def flushOutput(self):
+ """Clear output buffer, aborting the current output and
+ discarding all that is in the buffer."""
+ if not self.sPort: raise portNotOpenError
+ self._outstream.flush()
+
+ def sendBreak(self, duration=0.25):
+ """Send break condition. Timed, returns to idle state after given duration."""
+ if not self.sPort: raise portNotOpenError
+ self.sPort.sendBreak(duration*1000.0)
+
+ def setBreak(self, level=1):
+ """Set break: Controls TXD. When active, to transmitting is possible."""
+ if self.fd is None: raise portNotOpenError
+ raise SerialException("The setBreak function is not implemented in java.")
+
+ def setRTS(self, level=1):
+ """Set terminal status line: Request To Send"""
+ if not self.sPort: raise portNotOpenError
+ self.sPort.setRTS(level)
+
+ def setDTR(self, level=1):
+ """Set terminal status line: Data Terminal Ready"""
+ if not self.sPort: raise portNotOpenError
+ self.sPort.setDTR(level)
+
+ def getCTS(self):
+ """Read terminal status line: Clear To Send"""
+ if not self.sPort: raise portNotOpenError
+ self.sPort.isCTS()
+
+ def getDSR(self):
+ """Read terminal status line: Data Set Ready"""
+ if not self.sPort: raise portNotOpenError
+ self.sPort.isDSR()
+
+ def getRI(self):
+ """Read terminal status line: Ring Indicator"""
+ if not self.sPort: raise portNotOpenError
+ self.sPort.isRI()
+
+ def getCD(self):
+ """Read terminal status line: Carrier Detect"""
+ if not self.sPort: raise portNotOpenError
+ self.sPort.isCD()
+
+
+# assemble Serial class with the platform specific implementation and the base
+# for file-like behavior. for Python 2.6 and newer, that provide the new I/O
+# library, derive from io.RawIOBase
+try:
+ import io
+except ImportError:
+ # classic version with our own file-like emulation
+ class Serial(JavaSerial, FileLike):
+ pass
+else:
+ # io library present
+ class Serial(JavaSerial, io.RawIOBase):
+ pass
+
+
+if __name__ == '__main__':
+ s = Serial(0,
+ baudrate=19200, # baudrate
+ bytesize=EIGHTBITS, # number of databits
+ parity=PARITY_EVEN, # enable parity checking
+ stopbits=STOPBITS_ONE, # number of stopbits
+ timeout=3, # set a timeout value, None for waiting forever
+ xonxoff=0, # enable software flow control
+ rtscts=0, # enable RTS/CTS flow control
+ )
+ s.setRTS(1)
+ s.setDTR(1)
+ s.flushInput()
+ s.flushOutput()
+ s.write('hello')
+ sys.stdio.write('%r\n' % s.read(5))
+ sys.stdio.write('%s\n' % s.inWaiting())
+ del s
+
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/serialposix.py b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/serialposix.py
new file mode 100644
index 0000000..b9b4b28
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/serialposix.py
@@ -0,0 +1,703 @@
+#!/usr/bin/env python
+#
+# Python Serial Port Extension for Win32, Linux, BSD, Jython
+# module for serial IO for POSIX compatible systems, like Linux
+# see __init__.py
+#
+# (C) 2001-2010 Chris Liechti <cliechti@gmx.net>
+# this is distributed under a free software license, see license.txt
+#
+# parts based on code from Grant B. Edwards <grante@visi.com>:
+# ftp://ftp.visi.com/users/grante/python/PosixSerial.py
+#
+# references: http://www.easysw.com/~mike/serial/serial.html
+
+import sys, os, fcntl, termios, struct, select, errno, time
+from serial.serialutil import *
+
+# Do check the Python version as some constants have moved.
+if (sys.hexversion < 0x020100f0):
+ import TERMIOS
+else:
+ TERMIOS = termios
+
+if (sys.hexversion < 0x020200f0):
+ import FCNTL
+else:
+ FCNTL = fcntl
+
+# try to detect the OS so that a device can be selected...
+# this code block should supply a device() and set_special_baudrate() function
+# for the platform
+plat = sys.platform.lower()
+
+if plat[:5] == 'linux': # Linux (confirmed)
+
+ def device(port):
+ return '/dev/ttyS%d' % port
+
+ TCGETS2 = 0x802C542A
+ TCSETS2 = 0x402C542B
+ BOTHER = 0o010000
+
+ def set_special_baudrate(port, baudrate):
+ # right size is 44 on x86_64, allow for some growth
+ import array
+ buf = array.array('i', [0] * 64)
+
+ try:
+ # get serial_struct
+ FCNTL.ioctl(port.fd, TCGETS2, buf)
+ # set custom speed
+ buf[2] &= ~TERMIOS.CBAUD
+ buf[2] |= BOTHER
+ buf[9] = buf[10] = baudrate
+
+ # set serial_struct
+ res = FCNTL.ioctl(port.fd, TCSETS2, buf)
+ except IOError, e:
+ raise ValueError('Failed to set custom baud rate (%s): %s' % (baudrate, e))
+
+ baudrate_constants = {
+ 0: 0000000, # hang up
+ 50: 0000001,
+ 75: 0000002,
+ 110: 0000003,
+ 134: 0000004,
+ 150: 0000005,
+ 200: 0000006,
+ 300: 0000007,
+ 600: 0000010,
+ 1200: 0000011,
+ 1800: 0000012,
+ 2400: 0000013,
+ 4800: 0000014,
+ 9600: 0000015,
+ 19200: 0000016,
+ 38400: 0000017,
+ 57600: 0010001,
+ 115200: 0010002,
+ 230400: 0010003,
+ 460800: 0010004,
+ 500000: 0010005,
+ 576000: 0010006,
+ 921600: 0010007,
+ 1000000: 0010010,
+ 1152000: 0010011,
+ 1500000: 0010012,
+ 2000000: 0010013,
+ 2500000: 0010014,
+ 3000000: 0010015,
+ 3500000: 0010016,
+ 4000000: 0010017
+ }
+
+elif plat == 'cygwin': # cygwin/win32 (confirmed)
+
+ def device(port):
+ return '/dev/com%d' % (port + 1)
+
+ def set_special_baudrate(port, baudrate):
+ raise ValueError("sorry don't know how to handle non standard baud rate on this platform")
+
+ baudrate_constants = {
+ 128000: 0x01003,
+ 256000: 0x01005,
+ 500000: 0x01007,
+ 576000: 0x01008,
+ 921600: 0x01009,
+ 1000000: 0x0100a,
+ 1152000: 0x0100b,
+ 1500000: 0x0100c,
+ 2000000: 0x0100d,
+ 2500000: 0x0100e,
+ 3000000: 0x0100f
+ }
+
+elif plat[:7] == 'openbsd': # OpenBSD
+
+ def device(port):
+ return '/dev/cua%02d' % port
+
+ def set_special_baudrate(port, baudrate):
+ raise ValueError("sorry don't know how to handle non standard baud rate on this platform")
+
+ baudrate_constants = {}
+
+elif plat[:3] == 'bsd' or \
+ plat[:7] == 'freebsd':
+
+ def device(port):
+ return '/dev/cuad%d' % port
+
+ def set_special_baudrate(port, baudrate):
+ raise ValueError("sorry don't know how to handle non standard baud rate on this platform")
+
+ baudrate_constants = {}
+
+elif plat[:6] == 'darwin': # OS X
+
+ version = os.uname()[2].split('.')
+ # Tiger or above can support arbitrary serial speeds
+ if int(version[0]) >= 8:
+ def set_special_baudrate(port, baudrate):
+ # use IOKit-specific call to set up high speeds
+ import array, fcntl
+ buf = array.array('i', [baudrate])
+ IOSSIOSPEED = 0x80045402 #_IOW('T', 2, speed_t)
+ fcntl.ioctl(port.fd, IOSSIOSPEED, buf, 1)
+ else: # version < 8
+ def set_special_baudrate(port, baudrate):
+ raise ValueError("baud rate not supported")
+
+ def device(port):
+ return '/dev/cuad%d' % port
+
+ baudrate_constants = {}
+
+
+elif plat[:6] == 'netbsd': # NetBSD 1.6 testing by Erk
+
+ def device(port):
+ return '/dev/dty%02d' % port
+
+ def set_special_baudrate(port, baudrate):
+ raise ValueError("sorry don't know how to handle non standard baud rate on this platform")
+
+ baudrate_constants = {}
+
+elif plat[:4] == 'irix': # IRIX (partially tested)
+
+ def device(port):
+ return '/dev/ttyf%d' % (port+1) #XXX different device names depending on flow control
+
+ def set_special_baudrate(port, baudrate):
+ raise ValueError("sorry don't know how to handle non standard baud rate on this platform")
+
+ baudrate_constants = {}
+
+elif plat[:2] == 'hp': # HP-UX (not tested)
+
+ def device(port):
+ return '/dev/tty%dp0' % (port+1)
+
+ def set_special_baudrate(port, baudrate):
+ raise ValueError("sorry don't know how to handle non standard baud rate on this platform")
+
+ baudrate_constants = {}
+
+elif plat[:5] == 'sunos': # Solaris/SunOS (confirmed)
+
+ def device(port):
+ return '/dev/tty%c' % (ord('a')+port)
+
+ def set_special_baudrate(port, baudrate):
+ raise ValueError("sorry don't know how to handle non standard baud rate on this platform")
+
+ baudrate_constants = {}
+
+elif plat[:3] == 'aix': # AIX
+
+ def device(port):
+ return '/dev/tty%d' % (port)
+
+ def set_special_baudrate(port, baudrate):
+ raise ValueError("sorry don't know how to handle non standard baud rate on this platform")
+
+ baudrate_constants = {}
+
+else:
+ # platform detection has failed...
+ sys.stderr.write("""\
+don't know how to number ttys on this system.
+! Use an explicit path (eg /dev/ttyS1) or send this information to
+! the author of this module:
+
+sys.platform = %r
+os.name = %r
+serialposix.py version = %s
+
+also add the device name of the serial port and where the
+counting starts for the first serial port.
+e.g. 'first serial port: /dev/ttyS0'
+and with a bit luck you can get this module running...
+""" % (sys.platform, os.name, VERSION))
+ # no exception, just continue with a brave attempt to build a device name
+ # even if the device name is not correct for the platform it has chances
+ # to work using a string with the real device name as port parameter.
+ def device(portum):
+ return '/dev/ttyS%d' % portnum
+ def set_special_baudrate(port, baudrate):
+ raise SerialException("sorry don't know how to handle non standard baud rate on this platform")
+ baudrate_constants = {}
+ #~ raise Exception, "this module does not run on this platform, sorry."
+
+# whats up with "aix", "beos", ....
+# they should work, just need to know the device names.
+
+
+# load some constants for later use.
+# try to use values from TERMIOS, use defaults from linux otherwise
+TIOCMGET = hasattr(TERMIOS, 'TIOCMGET') and TERMIOS.TIOCMGET or 0x5415
+TIOCMBIS = hasattr(TERMIOS, 'TIOCMBIS') and TERMIOS.TIOCMBIS or 0x5416
+TIOCMBIC = hasattr(TERMIOS, 'TIOCMBIC') and TERMIOS.TIOCMBIC or 0x5417
+TIOCMSET = hasattr(TERMIOS, 'TIOCMSET') and TERMIOS.TIOCMSET or 0x5418
+
+#TIOCM_LE = hasattr(TERMIOS, 'TIOCM_LE') and TERMIOS.TIOCM_LE or 0x001
+TIOCM_DTR = hasattr(TERMIOS, 'TIOCM_DTR') and TERMIOS.TIOCM_DTR or 0x002
+TIOCM_RTS = hasattr(TERMIOS, 'TIOCM_RTS') and TERMIOS.TIOCM_RTS or 0x004
+#TIOCM_ST = hasattr(TERMIOS, 'TIOCM_ST') and TERMIOS.TIOCM_ST or 0x008
+#TIOCM_SR = hasattr(TERMIOS, 'TIOCM_SR') and TERMIOS.TIOCM_SR or 0x010
+
+TIOCM_CTS = hasattr(TERMIOS, 'TIOCM_CTS') and TERMIOS.TIOCM_CTS or 0x020
+TIOCM_CAR = hasattr(TERMIOS, 'TIOCM_CAR') and TERMIOS.TIOCM_CAR or 0x040
+TIOCM_RNG = hasattr(TERMIOS, 'TIOCM_RNG') and TERMIOS.TIOCM_RNG or 0x080
+TIOCM_DSR = hasattr(TERMIOS, 'TIOCM_DSR') and TERMIOS.TIOCM_DSR or 0x100
+TIOCM_CD = hasattr(TERMIOS, 'TIOCM_CD') and TERMIOS.TIOCM_CD or TIOCM_CAR
+TIOCM_RI = hasattr(TERMIOS, 'TIOCM_RI') and TERMIOS.TIOCM_RI or TIOCM_RNG
+#TIOCM_OUT1 = hasattr(TERMIOS, 'TIOCM_OUT1') and TERMIOS.TIOCM_OUT1 or 0x2000
+#TIOCM_OUT2 = hasattr(TERMIOS, 'TIOCM_OUT2') and TERMIOS.TIOCM_OUT2 or 0x4000
+if hasattr(TERMIOS, 'TIOCINQ'):
+ TIOCINQ = TERMIOS.TIOCINQ
+else:
+ TIOCINQ = hasattr(TERMIOS, 'FIONREAD') and TERMIOS.FIONREAD or 0x541B
+TIOCOUTQ = hasattr(TERMIOS, 'TIOCOUTQ') and TERMIOS.TIOCOUTQ or 0x5411
+
+TIOCM_zero_str = struct.pack('I', 0)
+TIOCM_RTS_str = struct.pack('I', TIOCM_RTS)
+TIOCM_DTR_str = struct.pack('I', TIOCM_DTR)
+
+TIOCSBRK = hasattr(TERMIOS, 'TIOCSBRK') and TERMIOS.TIOCSBRK or 0x5427
+TIOCCBRK = hasattr(TERMIOS, 'TIOCCBRK') and TERMIOS.TIOCCBRK or 0x5428
+
+
+class PosixSerial(SerialBase):
+ """Serial port class POSIX implementation. Serial port configuration is
+ done with termios and fcntl. Runs on Linux and many other Un*x like
+ systems."""
+
+ def open(self):
+ """Open port with current settings. This may throw a SerialException
+ if the port cannot be opened."""
+ if self._port is None:
+ raise SerialException("Port must be configured before it can be used.")
+ if self._isOpen:
+ raise SerialException("Port is already open.")
+ self.fd = None
+ # open
+ try:
+ self.fd = os.open(self.portstr, os.O_RDWR|os.O_NOCTTY|os.O_NONBLOCK)
+ except IOError, msg:
+ self.fd = None
+ raise SerialException(msg.errno, "could not open port %s: %s" % (self._port, msg))
+ #~ fcntl.fcntl(self.fd, FCNTL.F_SETFL, 0) # set blocking
+
+ try:
+ self._reconfigurePort()
+ except:
+ try:
+ os.close(self.fd)
+ except:
+ # ignore any exception when closing the port
+ # also to keep original exception that happened when setting up
+ pass
+ self.fd = None
+ raise
+ else:
+ self._isOpen = True
+ self.flushInput()
+
+
+ def _reconfigurePort(self):
+ """Set communication parameters on opened port."""
+ if self.fd is None:
+ raise SerialException("Can only operate on a valid file descriptor")
+ custom_baud = None
+
+ vmin = vtime = 0 # timeout is done via select
+ if self._interCharTimeout is not None:
+ vmin = 1
+ vtime = int(self._interCharTimeout * 10)
+ try:
+ orig_attr = termios.tcgetattr(self.fd)
+ iflag, oflag, cflag, lflag, ispeed, ospeed, cc = orig_attr
+ except termios.error, msg: # if a port is nonexistent but has a /dev file, it'll fail here
+ raise SerialException("Could not configure port: %s" % msg)
+ # set up raw mode / no echo / binary
+ cflag |= (TERMIOS.CLOCAL|TERMIOS.CREAD)
+ lflag &= ~(TERMIOS.ICANON|TERMIOS.ECHO|TERMIOS.ECHOE|TERMIOS.ECHOK|TERMIOS.ECHONL|
+ TERMIOS.ISIG|TERMIOS.IEXTEN) #|TERMIOS.ECHOPRT
+ for flag in ('ECHOCTL', 'ECHOKE'): # netbsd workaround for Erk
+ if hasattr(TERMIOS, flag):
+ lflag &= ~getattr(TERMIOS, flag)
+
+ oflag &= ~(TERMIOS.OPOST)
+ iflag &= ~(TERMIOS.INLCR|TERMIOS.IGNCR|TERMIOS.ICRNL|TERMIOS.IGNBRK)
+ if hasattr(TERMIOS, 'IUCLC'):
+ iflag &= ~TERMIOS.IUCLC
+ if hasattr(TERMIOS, 'PARMRK'):
+ iflag &= ~TERMIOS.PARMRK
+
+ # setup baud rate
+ try:
+ ispeed = ospeed = getattr(TERMIOS, 'B%s' % (self._baudrate))
+ except AttributeError:
+ try:
+ ispeed = ospeed = baudrate_constants[self._baudrate]
+ except KeyError:
+ #~ raise ValueError('Invalid baud rate: %r' % self._baudrate)
+ # may need custom baud rate, it isn't in our list.
+ ispeed = ospeed = getattr(TERMIOS, 'B38400')
+ try:
+ custom_baud = int(self._baudrate) # store for later
+ except ValueError:
+ raise ValueError('Invalid baud rate: %r' % self._baudrate)
+ else:
+ if custom_baud < 0:
+ raise ValueError('Invalid baud rate: %r' % self._baudrate)
+
+ # setup char len
+ cflag &= ~TERMIOS.CSIZE
+ if self._bytesize == 8:
+ cflag |= TERMIOS.CS8
+ elif self._bytesize == 7:
+ cflag |= TERMIOS.CS7
+ elif self._bytesize == 6:
+ cflag |= TERMIOS.CS6
+ elif self._bytesize == 5:
+ cflag |= TERMIOS.CS5
+ else:
+ raise ValueError('Invalid char len: %r' % self._bytesize)
+ # setup stopbits
+ if self._stopbits == STOPBITS_ONE:
+ cflag &= ~(TERMIOS.CSTOPB)
+ elif self._stopbits == STOPBITS_ONE_POINT_FIVE:
+ cflag |= (TERMIOS.CSTOPB) # XXX same as TWO.. there is no POSIX support for 1.5
+ elif self._stopbits == STOPBITS_TWO:
+ cflag |= (TERMIOS.CSTOPB)
+ else:
+ raise ValueError('Invalid stop bit specification: %r' % self._stopbits)
+ # setup parity
+ iflag &= ~(TERMIOS.INPCK|TERMIOS.ISTRIP)
+ if self._parity == PARITY_NONE:
+ cflag &= ~(TERMIOS.PARENB|TERMIOS.PARODD)
+ elif self._parity == PARITY_EVEN:
+ cflag &= ~(TERMIOS.PARODD)
+ cflag |= (TERMIOS.PARENB)
+ elif self._parity == PARITY_ODD:
+ cflag |= (TERMIOS.PARENB|TERMIOS.PARODD)
+ else:
+ raise ValueError('Invalid parity: %r' % self._parity)
+ # setup flow control
+ # xonxoff
+ if hasattr(TERMIOS, 'IXANY'):
+ if self._xonxoff:
+ iflag |= (TERMIOS.IXON|TERMIOS.IXOFF) #|TERMIOS.IXANY)
+ else:
+ iflag &= ~(TERMIOS.IXON|TERMIOS.IXOFF|TERMIOS.IXANY)
+ else:
+ if self._xonxoff:
+ iflag |= (TERMIOS.IXON|TERMIOS.IXOFF)
+ else:
+ iflag &= ~(TERMIOS.IXON|TERMIOS.IXOFF)
+ # rtscts
+ if hasattr(TERMIOS, 'CRTSCTS'):
+ if self._rtscts:
+ cflag |= (TERMIOS.CRTSCTS)
+ else:
+ cflag &= ~(TERMIOS.CRTSCTS)
+ elif hasattr(TERMIOS, 'CNEW_RTSCTS'): # try it with alternate constant name
+ if self._rtscts:
+ cflag |= (TERMIOS.CNEW_RTSCTS)
+ else:
+ cflag &= ~(TERMIOS.CNEW_RTSCTS)
+ # XXX should there be a warning if setting up rtscts (and xonxoff etc) fails??
+
+ # buffer
+ # vmin "minimal number of characters to be read. = for non blocking"
+ if vmin < 0 or vmin > 255:
+ raise ValueError('Invalid vmin: %r ' % vmin)
+ cc[TERMIOS.VMIN] = vmin
+ # vtime
+ if vtime < 0 or vtime > 255:
+ raise ValueError('Invalid vtime: %r' % vtime)
+ cc[TERMIOS.VTIME] = vtime
+ # activate settings
+ if [iflag, oflag, cflag, lflag, ispeed, ospeed, cc] != orig_attr:
+ termios.tcsetattr(self.fd, TERMIOS.TCSANOW, [iflag, oflag, cflag, lflag, ispeed, ospeed, cc])
+
+ # apply custom baud rate, if any
+ if custom_baud is not None:
+ set_special_baudrate(self, custom_baud)
+
+ def close(self):
+ """Close port"""
+ if self._isOpen:
+ if self.fd is not None:
+ os.close(self.fd)
+ self.fd = None
+ self._isOpen = False
+
+ def makeDeviceName(self, port):
+ return device(port)
+
+ # - - - - - - - - - - - - - - - - - - - - - - - -
+
+ def inWaiting(self):
+ """Return the number of characters currently in the input buffer."""
+ #~ s = fcntl.ioctl(self.fd, TERMIOS.FIONREAD, TIOCM_zero_str)
+ s = fcntl.ioctl(self.fd, TIOCINQ, TIOCM_zero_str)
+ return struct.unpack('I',s)[0]
+
+ # select based implementation, proved to work on many systems
+ def read(self, size=1):
+ """Read size bytes from the serial port. If a timeout is set it may
+ return less characters as requested. With no timeout it will block
+ until the requested number of bytes is read."""
+ if not self._isOpen: raise portNotOpenError
+ read = bytearray()
+ while len(read) < size:
+ try:
+ ready,_,_ = select.select([self.fd],[],[], self._timeout)
+ # If select was used with a timeout, and the timeout occurs, it
+ # returns with empty lists -> thus abort read operation.
+ # For timeout == 0 (non-blocking operation) also abort when there
+ # is nothing to read.
+ if not ready:
+ break # timeout
+ buf = os.read(self.fd, size-len(read))
+ # read should always return some data as select reported it was
+ # ready to read when we get to this point.
+ if not buf:
+ # Disconnected devices, at least on Linux, show the
+ # behavior that they are always ready to read immediately
+ # but reading returns nothing.
+ raise SerialException('device reports readiness to read but returned no data (device disconnected or multiple access on port?)')
+ read.extend(buf)
+ except select.error, e:
+ # ignore EAGAIN errors. all other errors are shown
+ # see also http://www.python.org/dev/peps/pep-3151/#select
+ if e[0] != errno.EAGAIN:
+ raise SerialException('read failed: %s' % (e,))
+ except OSError, e:
+ # ignore EAGAIN errors. all other errors are shown
+ if e.errno != errno.EAGAIN:
+ raise SerialException('read failed: %s' % (e,))
+ return bytes(read)
+
+ def write(self, data):
+ """Output the given string over the serial port."""
+ if not self._isOpen: raise portNotOpenError
+ d = to_bytes(data)
+ tx_len = len(d)
+ if self._writeTimeout is not None and self._writeTimeout > 0:
+ timeout = time.time() + self._writeTimeout
+ else:
+ timeout = None
+ while tx_len > 0:
+ try:
+ n = os.write(self.fd, d)
+ if timeout:
+ # when timeout is set, use select to wait for being ready
+ # with the time left as timeout
+ timeleft = timeout - time.time()
+ if timeleft < 0:
+ raise writeTimeoutError
+ _, ready, _ = select.select([], [self.fd], [], timeleft)
+ if not ready:
+ raise writeTimeoutError
+ else:
+ # wait for write operation
+ _, ready, _ = select.select([], [self.fd], [], None)
+ if not ready:
+ raise SerialException('write failed (select)')
+ d = d[n:]
+ tx_len -= n
+ except OSError, v:
+ if v.errno != errno.EAGAIN:
+ raise SerialException('write failed: %s' % (v,))
+ return len(data)
+
+ def flush(self):
+ """Flush of file like objects. In this case, wait until all data
+ is written."""
+ self.drainOutput()
+
+ def flushInput(self):
+ """Clear input buffer, discarding all that is in the buffer."""
+ if not self._isOpen: raise portNotOpenError
+ termios.tcflush(self.fd, TERMIOS.TCIFLUSH)
+
+ def flushOutput(self):
+ """Clear output buffer, aborting the current output and
+ discarding all that is in the buffer."""
+ if not self._isOpen: raise portNotOpenError
+ termios.tcflush(self.fd, TERMIOS.TCOFLUSH)
+
+ def sendBreak(self, duration=0.25):
+ """Send break condition. Timed, returns to idle state after given duration."""
+ if not self._isOpen: raise portNotOpenError
+ termios.tcsendbreak(self.fd, int(duration/0.25))
+
+ def setBreak(self, level=1):
+ """Set break: Controls TXD. When active, no transmitting is possible."""
+ if self.fd is None: raise portNotOpenError
+ if level:
+ fcntl.ioctl(self.fd, TIOCSBRK)
+ else:
+ fcntl.ioctl(self.fd, TIOCCBRK)
+
+ def setRTS(self, level=1):
+ """Set terminal status line: Request To Send"""
+ if not self._isOpen: raise portNotOpenError
+ if level:
+ fcntl.ioctl(self.fd, TIOCMBIS, TIOCM_RTS_str)
+ else:
+ fcntl.ioctl(self.fd, TIOCMBIC, TIOCM_RTS_str)
+
+ def setDTR(self, level=1):
+ """Set terminal status line: Data Terminal Ready"""
+ if not self._isOpen: raise portNotOpenError
+ if level:
+ fcntl.ioctl(self.fd, TIOCMBIS, TIOCM_DTR_str)
+ else:
+ fcntl.ioctl(self.fd, TIOCMBIC, TIOCM_DTR_str)
+
+ def getCTS(self):
+ """Read terminal status line: Clear To Send"""
+ if not self._isOpen: raise portNotOpenError
+ s = fcntl.ioctl(self.fd, TIOCMGET, TIOCM_zero_str)
+ return struct.unpack('I',s)[0] & TIOCM_CTS != 0
+
+ def getDSR(self):
+ """Read terminal status line: Data Set Ready"""
+ if not self._isOpen: raise portNotOpenError
+ s = fcntl.ioctl(self.fd, TIOCMGET, TIOCM_zero_str)
+ return struct.unpack('I',s)[0] & TIOCM_DSR != 0
+
+ def getRI(self):
+ """Read terminal status line: Ring Indicator"""
+ if not self._isOpen: raise portNotOpenError
+ s = fcntl.ioctl(self.fd, TIOCMGET, TIOCM_zero_str)
+ return struct.unpack('I',s)[0] & TIOCM_RI != 0
+
+ def getCD(self):
+ """Read terminal status line: Carrier Detect"""
+ if not self._isOpen: raise portNotOpenError
+ s = fcntl.ioctl(self.fd, TIOCMGET, TIOCM_zero_str)
+ return struct.unpack('I',s)[0] & TIOCM_CD != 0
+
+ # - - platform specific - - - -
+
+ def outWaiting(self):
+ """Return the number of characters currently in the output buffer."""
+ #~ s = fcntl.ioctl(self.fd, TERMIOS.FIONREAD, TIOCM_zero_str)
+ s = fcntl.ioctl(self.fd, TIOCOUTQ, TIOCM_zero_str)
+ return struct.unpack('I',s)[0]
+
+ def drainOutput(self):
+ """internal - not portable!"""
+ if not self._isOpen: raise portNotOpenError
+ termios.tcdrain(self.fd)
+
+ def nonblocking(self):
+ """internal - not portable!"""
+ if not self._isOpen: raise portNotOpenError
+ fcntl.fcntl(self.fd, FCNTL.F_SETFL, os.O_NONBLOCK)
+
+ def fileno(self):
+ """\
+ For easier use of the serial port instance with select.
+ WARNING: this function is not portable to different platforms!
+ """
+ if not self._isOpen: raise portNotOpenError
+ return self.fd
+
+ def setXON(self, level=True):
+ """\
+ Manually control flow - when software flow control is enabled.
+ This will send XON (true) and XOFF (false) to the other device.
+ WARNING: this function is not portable to different platforms!
+ """
+ if not self.hComPort: raise portNotOpenError
+ if enable:
+ termios.tcflow(self.fd, TERMIOS.TCION)
+ else:
+ termios.tcflow(self.fd, TERMIOS.TCIOFF)
+
+ def flowControlOut(self, enable):
+ """\
+ Manually control flow of outgoing data - when hardware or software flow
+ control is enabled.
+ WARNING: this function is not portable to different platforms!
+ """
+ if not self._isOpen: raise portNotOpenError
+ if enable:
+ termios.tcflow(self.fd, TERMIOS.TCOON)
+ else:
+ termios.tcflow(self.fd, TERMIOS.TCOOFF)
+
+
+# assemble Serial class with the platform specifc implementation and the base
+# for file-like behavior. for Python 2.6 and newer, that provide the new I/O
+# library, derrive from io.RawIOBase
+try:
+ import io
+except ImportError:
+ # classic version with our own file-like emulation
+ class Serial(PosixSerial, FileLike):
+ pass
+else:
+ # io library present
+ class Serial(PosixSerial, io.RawIOBase):
+ pass
+
+class PosixPollSerial(Serial):
+ """poll based read implementation. not all systems support poll properly.
+ however this one has better handling of errors, such as a device
+ disconnecting while it's in use (e.g. USB-serial unplugged)"""
+
+ def read(self, size=1):
+ """Read size bytes from the serial port. If a timeout is set it may
+ return less characters as requested. With no timeout it will block
+ until the requested number of bytes is read."""
+ if self.fd is None: raise portNotOpenError
+ read = bytearray()
+ poll = select.poll()
+ poll.register(self.fd, select.POLLIN|select.POLLERR|select.POLLHUP|select.POLLNVAL)
+ if size > 0:
+ while len(read) < size:
+ # print "\tread(): size",size, "have", len(read) #debug
+ # wait until device becomes ready to read (or something fails)
+ for fd, event in poll.poll(self._timeout*1000):
+ if event & (select.POLLERR|select.POLLHUP|select.POLLNVAL):
+ raise SerialException('device reports error (poll)')
+ # we don't care if it is select.POLLIN or timeout, that's
+ # handled below
+ buf = os.read(self.fd, size - len(read))
+ read.extend(buf)
+ if ((self._timeout is not None and self._timeout >= 0) or
+ (self._interCharTimeout is not None and self._interCharTimeout > 0)) and not buf:
+ break # early abort on timeout
+ return bytes(read)
+
+
+if __name__ == '__main__':
+ s = Serial(0,
+ baudrate=19200, # baud rate
+ bytesize=EIGHTBITS, # number of data bits
+ parity=PARITY_EVEN, # enable parity checking
+ stopbits=STOPBITS_ONE, # number of stop bits
+ timeout=3, # set a timeout value, None for waiting forever
+ xonxoff=0, # enable software flow control
+ rtscts=0, # enable RTS/CTS flow control
+ )
+ s.setRTS(1)
+ s.setDTR(1)
+ s.flushInput()
+ s.flushOutput()
+ s.write('hello')
+ sys.stdout.write('%r\n' % s.read(5))
+ sys.stdout.write('%s\n' % s.inWaiting())
+ del s
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/serialutil.py b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/serialutil.py
new file mode 100644
index 0000000..f28ece4
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/serialutil.py
@@ -0,0 +1,551 @@
+#! python
+# Python Serial Port Extension for Win32, Linux, BSD, Jython
+# see __init__.py
+#
+# (C) 2001-2010 Chris Liechti <cliechti@gmx.net>
+# this is distributed under a free software license, see license.txt
+
+# compatibility for older Python < 2.6
+try:
+ bytes
+ bytearray
+except (NameError, AttributeError):
+ # Python older than 2.6 do not have these types. Like for Python 2.6 they
+ # should behave like str. For Python older than 3.0 we want to work with
+ # strings anyway, only later versions have a true bytes type.
+ bytes = str
+ # bytearray is a mutable type that is easily turned into an instance of
+ # bytes
+ class bytearray(list):
+ # for bytes(bytearray()) usage
+ def __str__(self): return ''.join(self)
+ def __repr__(self): return 'bytearray(%r)' % ''.join(self)
+ # append automatically converts integers to characters
+ def append(self, item):
+ if isinstance(item, str):
+ list.append(self, item)
+ else:
+ list.append(self, chr(item))
+ # +=
+ def __iadd__(self, other):
+ for byte in other:
+ self.append(byte)
+ return self
+
+ def __getslice__(self, i, j):
+ return bytearray(list.__getslice__(self, i, j))
+
+ def __getitem__(self, item):
+ if isinstance(item, slice):
+ return bytearray(list.__getitem__(self, item))
+ else:
+ return ord(list.__getitem__(self, item))
+
+ def __eq__(self, other):
+ if isinstance(other, basestring):
+ other = bytearray(other)
+ return list.__eq__(self, other)
+
+# ``memoryview`` was introduced in Python 2.7 and ``bytes(some_memoryview)``
+# isn't returning the contents (very unfortunate). Therefore we need special
+# cases and test for it. Ensure that there is a ``memoryview`` object for older
+# Python versions. This is easier than making every test dependent on its
+# existence.
+try:
+ memoryview
+except (NameError, AttributeError):
+ # implementation does not matter as we do not realy use it.
+ # it just must not inherit from something else we might care for.
+ class memoryview:
+ pass
+
+
+# all Python versions prior 3.x convert ``str([17])`` to '[17]' instead of '\x11'
+# so a simple ``bytes(sequence)`` doesn't work for all versions
+def to_bytes(seq):
+ """convert a sequence to a bytes type"""
+ if isinstance(seq, bytes):
+ return seq
+ elif isinstance(seq, bytearray):
+ return bytes(seq)
+ elif isinstance(seq, memoryview):
+ return seq.tobytes()
+ else:
+ b = bytearray()
+ for item in seq:
+ b.append(item) # this one handles int and str for our emulation and ints for Python 3.x
+ return bytes(b)
+
+# create control bytes
+XON = to_bytes([17])
+XOFF = to_bytes([19])
+
+CR = to_bytes([13])
+LF = to_bytes([10])
+
+
+PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK, PARITY_SPACE = 'N', 'E', 'O', 'M', 'S'
+STOPBITS_ONE, STOPBITS_ONE_POINT_FIVE, STOPBITS_TWO = (1, 1.5, 2)
+FIVEBITS, SIXBITS, SEVENBITS, EIGHTBITS = (5, 6, 7, 8)
+
+PARITY_NAMES = {
+ PARITY_NONE: 'None',
+ PARITY_EVEN: 'Even',
+ PARITY_ODD: 'Odd',
+ PARITY_MARK: 'Mark',
+ PARITY_SPACE: 'Space',
+}
+
+
+class SerialException(IOError):
+ """Base class for serial port related exceptions."""
+
+
+class SerialTimeoutException(SerialException):
+ """Write timeouts give an exception"""
+
+
+writeTimeoutError = SerialTimeoutException('Write timeout')
+portNotOpenError = SerialException('Attempting to use a port that is not open')
+
+
+class FileLike(object):
+ """An abstract file like class.
+
+ This class implements readline and readlines based on read and
+ writelines based on write.
+ This class is used to provide the above functions for to Serial
+ port objects.
+
+ Note that when the serial port was opened with _NO_ timeout that
+ readline blocks until it sees a newline (or the specified size is
+ reached) and that readlines would never return and therefore
+ refuses to work (it raises an exception in this case)!
+ """
+
+ def __init__(self):
+ self.closed = True
+
+ def close(self):
+ self.closed = True
+
+ # so that ports are closed when objects are discarded
+ def __del__(self):
+ """Destructor. Calls close()."""
+ # The try/except block is in case this is called at program
+ # exit time, when it's possible that globals have already been
+ # deleted, and then the close() call might fail. Since
+ # there's nothing we can do about such failures and they annoy
+ # the end users, we suppress the traceback.
+ try:
+ self.close()
+ except:
+ pass
+
+ def writelines(self, sequence):
+ for line in sequence:
+ self.write(line)
+
+ def flush(self):
+ """flush of file like objects"""
+ pass
+
+ # iterator for e.g. "for line in Serial(0): ..." usage
+ def next(self):
+ line = self.readline()
+ if not line: raise StopIteration
+ return line
+
+ def __iter__(self):
+ return self
+
+ def readline(self, size=None, eol=LF):
+ """read a line which is terminated with end-of-line (eol) character
+ ('\n' by default) or until timeout."""
+ leneol = len(eol)
+ line = bytearray()
+ while True:
+ c = self.read(1)
+ if c:
+ line += c
+ if line[-leneol:] == eol:
+ break
+ if size is not None and len(line) >= size:
+ break
+ else:
+ break
+ return bytes(line)
+
+ def readlines(self, sizehint=None, eol=LF):
+ """read a list of lines, until timeout.
+ sizehint is ignored."""
+ if self.timeout is None:
+ raise ValueError("Serial port MUST have enabled timeout for this function!")
+ leneol = len(eol)
+ lines = []
+ while True:
+ line = self.readline(eol=eol)
+ if line:
+ lines.append(line)
+ if line[-leneol:] != eol: # was the line received with a timeout?
+ break
+ else:
+ break
+ return lines
+
+ def xreadlines(self, sizehint=None):
+ """Read lines, implemented as generator. It will raise StopIteration on
+ timeout (empty read). sizehint is ignored."""
+ while True:
+ line = self.readline()
+ if not line: break
+ yield line
+
+ # other functions of file-likes - not used by pySerial
+
+ #~ readinto(b)
+
+ def seek(self, pos, whence=0):
+ raise IOError("file is not seekable")
+
+ def tell(self):
+ raise IOError("file is not seekable")
+
+ def truncate(self, n=None):
+ raise IOError("file is not seekable")
+
+ def isatty(self):
+ return False
+
+
+class SerialBase(object):
+ """Serial port base class. Provides __init__ function and properties to
+ get/set port settings."""
+
+ # default values, may be overridden in subclasses that do not support all values
+ BAUDRATES = (50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
+ 9600, 19200, 38400, 57600, 115200, 230400, 460800, 500000,
+ 576000, 921600, 1000000, 1152000, 1500000, 2000000, 2500000,
+ 3000000, 3500000, 4000000)
+ BYTESIZES = (FIVEBITS, SIXBITS, SEVENBITS, EIGHTBITS)
+ PARITIES = (PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK, PARITY_SPACE)
+ STOPBITS = (STOPBITS_ONE, STOPBITS_ONE_POINT_FIVE, STOPBITS_TWO)
+
+ def __init__(self,
+ port = None, # number of device, numbering starts at
+ # zero. if everything fails, the user
+ # can specify a device string, note
+ # that this isn't portable anymore
+ # port will be opened if one is specified
+ baudrate=9600, # baud rate
+ bytesize=EIGHTBITS, # number of data bits
+ parity=PARITY_NONE, # enable parity checking
+ stopbits=STOPBITS_ONE, # number of stop bits
+ timeout=None, # set a timeout value, None to wait forever
+ xonxoff=False, # enable software flow control
+ rtscts=False, # enable RTS/CTS flow control
+ writeTimeout=None, # set a timeout for writes
+ dsrdtr=False, # None: use rtscts setting, dsrdtr override if True or False
+ interCharTimeout=None # Inter-character timeout, None to disable
+ ):
+ """Initialize comm port object. If a port is given, then the port will be
+ opened immediately. Otherwise a Serial port object in closed state
+ is returned."""
+
+ self._isOpen = False
+ self._port = None # correct value is assigned below through properties
+ self._baudrate = None # correct value is assigned below through properties
+ self._bytesize = None # correct value is assigned below through properties
+ self._parity = None # correct value is assigned below through properties
+ self._stopbits = None # correct value is assigned below through properties
+ self._timeout = None # correct value is assigned below through properties
+ self._writeTimeout = None # correct value is assigned below through properties
+ self._xonxoff = None # correct value is assigned below through properties
+ self._rtscts = None # correct value is assigned below through properties
+ self._dsrdtr = None # correct value is assigned below through properties
+ self._interCharTimeout = None # correct value is assigned below through properties
+
+ # assign values using get/set methods using the properties feature
+ self.port = port
+ self.baudrate = baudrate
+ self.bytesize = bytesize
+ self.parity = parity
+ self.stopbits = stopbits
+ self.timeout = timeout
+ self.writeTimeout = writeTimeout
+ self.xonxoff = xonxoff
+ self.rtscts = rtscts
+ self.dsrdtr = dsrdtr
+ self.interCharTimeout = interCharTimeout
+
+ if port is not None:
+ self.open()
+
+ def isOpen(self):
+ """Check if the port is opened."""
+ return self._isOpen
+
+ # - - - - - - - - - - - - - - - - - - - - - - - -
+
+ # TODO: these are not really needed as the is the BAUDRATES etc. attribute...
+ # maybe i remove them before the final release...
+
+ def getSupportedBaudrates(self):
+ return [(str(b), b) for b in self.BAUDRATES]
+
+ def getSupportedByteSizes(self):
+ return [(str(b), b) for b in self.BYTESIZES]
+
+ def getSupportedStopbits(self):
+ return [(str(b), b) for b in self.STOPBITS]
+
+ def getSupportedParities(self):
+ return [(PARITY_NAMES[b], b) for b in self.PARITIES]
+
+ # - - - - - - - - - - - - - - - - - - - - - - - -
+
+ def setPort(self, port):
+ """Change the port. The attribute portstr is set to a string that
+ contains the name of the port."""
+
+ was_open = self._isOpen
+ if was_open: self.close()
+ if port is not None:
+ if isinstance(port, basestring):
+ self.portstr = port
+ else:
+ self.portstr = self.makeDeviceName(port)
+ else:
+ self.portstr = None
+ self._port = port
+ self.name = self.portstr
+ if was_open: self.open()
+
+ def getPort(self):
+ """Get the current port setting. The value that was passed on init or using
+ setPort() is passed back. See also the attribute portstr which contains
+ the name of the port as a string."""
+ return self._port
+
+ port = property(getPort, setPort, doc="Port setting")
+
+
+ def setBaudrate(self, baudrate):
+ """Change baud rate. It raises a ValueError if the port is open and the
+ baud rate is not possible. If the port is closed, then the value is
+ accepted and the exception is raised when the port is opened."""
+ try:
+ b = int(baudrate)
+ except TypeError:
+ raise ValueError("Not a valid baudrate: %r" % (baudrate,))
+ else:
+ if b <= 0:
+ raise ValueError("Not a valid baudrate: %r" % (baudrate,))
+ self._baudrate = b
+ if self._isOpen: self._reconfigurePort()
+
+ def getBaudrate(self):
+ """Get the current baud rate setting."""
+ return self._baudrate
+
+ baudrate = property(getBaudrate, setBaudrate, doc="Baud rate setting")
+
+
+ def setByteSize(self, bytesize):
+ """Change byte size."""
+ if bytesize not in self.BYTESIZES: raise ValueError("Not a valid byte size: %r" % (bytesize,))
+ self._bytesize = bytesize
+ if self._isOpen: self._reconfigurePort()
+
+ def getByteSize(self):
+ """Get the current byte size setting."""
+ return self._bytesize
+
+ bytesize = property(getByteSize, setByteSize, doc="Byte size setting")
+
+
+ def setParity(self, parity):
+ """Change parity setting."""
+ if parity not in self.PARITIES: raise ValueError("Not a valid parity: %r" % (parity,))
+ self._parity = parity
+ if self._isOpen: self._reconfigurePort()
+
+ def getParity(self):
+ """Get the current parity setting."""
+ return self._parity
+
+ parity = property(getParity, setParity, doc="Parity setting")
+
+
+ def setStopbits(self, stopbits):
+ """Change stop bits size."""
+ if stopbits not in self.STOPBITS: raise ValueError("Not a valid stop bit size: %r" % (stopbits,))
+ self._stopbits = stopbits
+ if self._isOpen: self._reconfigurePort()
+
+ def getStopbits(self):
+ """Get the current stop bits setting."""
+ return self._stopbits
+
+ stopbits = property(getStopbits, setStopbits, doc="Stop bits setting")
+
+
+ def setTimeout(self, timeout):
+ """Change timeout setting."""
+ if timeout is not None:
+ try:
+ timeout + 1 # test if it's a number, will throw a TypeError if not...
+ except TypeError:
+ raise ValueError("Not a valid timeout: %r" % (timeout,))
+ if timeout < 0: raise ValueError("Not a valid timeout: %r" % (timeout,))
+ self._timeout = timeout
+ if self._isOpen: self._reconfigurePort()
+
+ def getTimeout(self):
+ """Get the current timeout setting."""
+ return self._timeout
+
+ timeout = property(getTimeout, setTimeout, doc="Timeout setting for read()")
+
+
+ def setWriteTimeout(self, timeout):
+ """Change timeout setting."""
+ if timeout is not None:
+ if timeout < 0: raise ValueError("Not a valid timeout: %r" % (timeout,))
+ try:
+ timeout + 1 #test if it's a number, will throw a TypeError if not...
+ except TypeError:
+ raise ValueError("Not a valid timeout: %r" % timeout)
+
+ self._writeTimeout = timeout
+ if self._isOpen: self._reconfigurePort()
+
+ def getWriteTimeout(self):
+ """Get the current timeout setting."""
+ return self._writeTimeout
+
+ writeTimeout = property(getWriteTimeout, setWriteTimeout, doc="Timeout setting for write()")
+
+
+ def setXonXoff(self, xonxoff):
+ """Change XON/XOFF setting."""
+ self._xonxoff = xonxoff
+ if self._isOpen: self._reconfigurePort()
+
+ def getXonXoff(self):
+ """Get the current XON/XOFF setting."""
+ return self._xonxoff
+
+ xonxoff = property(getXonXoff, setXonXoff, doc="XON/XOFF setting")
+
+ def setRtsCts(self, rtscts):
+ """Change RTS/CTS flow control setting."""
+ self._rtscts = rtscts
+ if self._isOpen: self._reconfigurePort()
+
+ def getRtsCts(self):
+ """Get the current RTS/CTS flow control setting."""
+ return self._rtscts
+
+ rtscts = property(getRtsCts, setRtsCts, doc="RTS/CTS flow control setting")
+
+ def setDsrDtr(self, dsrdtr=None):
+ """Change DsrDtr flow control setting."""
+ if dsrdtr is None:
+ # if not set, keep backwards compatibility and follow rtscts setting
+ self._dsrdtr = self._rtscts
+ else:
+ # if defined independently, follow its value
+ self._dsrdtr = dsrdtr
+ if self._isOpen: self._reconfigurePort()
+
+ def getDsrDtr(self):
+ """Get the current DSR/DTR flow control setting."""
+ return self._dsrdtr
+
+ dsrdtr = property(getDsrDtr, setDsrDtr, "DSR/DTR flow control setting")
+
+ def setInterCharTimeout(self, interCharTimeout):
+ """Change inter-character timeout setting."""
+ if interCharTimeout is not None:
+ if interCharTimeout < 0: raise ValueError("Not a valid timeout: %r" % interCharTimeout)
+ try:
+ interCharTimeout + 1 # test if it's a number, will throw a TypeError if not...
+ except TypeError:
+ raise ValueError("Not a valid timeout: %r" % interCharTimeout)
+
+ self._interCharTimeout = interCharTimeout
+ if self._isOpen: self._reconfigurePort()
+
+ def getInterCharTimeout(self):
+ """Get the current inter-character timeout setting."""
+ return self._interCharTimeout
+
+ interCharTimeout = property(getInterCharTimeout, setInterCharTimeout, doc="Inter-character timeout setting for read()")
+
+ # - - - - - - - - - - - - - - - - - - - - - - - -
+
+ _SETTINGS = ('baudrate', 'bytesize', 'parity', 'stopbits', 'xonxoff',
+ 'dsrdtr', 'rtscts', 'timeout', 'writeTimeout', 'interCharTimeout')
+
+ def getSettingsDict(self):
+ """Get current port settings as a dictionary. For use with
+ applySettingsDict"""
+ return dict([(key, getattr(self, '_'+key)) for key in self._SETTINGS])
+
+ def applySettingsDict(self, d):
+ """apply stored settings from a dictionary returned from
+ getSettingsDict. it's allowed to delete keys from the dictionary. these
+ values will simply left unchanged."""
+ for key in self._SETTINGS:
+ if d[key] != getattr(self, '_'+key): # check against internal "_" value
+ setattr(self, key, d[key]) # set non "_" value to use properties write function
+
+ # - - - - - - - - - - - - - - - - - - - - - - - -
+
+ def __repr__(self):
+ """String representation of the current port settings and its state."""
+ return "%s<id=0x%x, open=%s>(port=%r, baudrate=%r, bytesize=%r, parity=%r, stopbits=%r, timeout=%r, xonxoff=%r, rtscts=%r, dsrdtr=%r)" % (
+ self.__class__.__name__,
+ id(self),
+ self._isOpen,
+ self.portstr,
+ self.baudrate,
+ self.bytesize,
+ self.parity,
+ self.stopbits,
+ self.timeout,
+ self.xonxoff,
+ self.rtscts,
+ self.dsrdtr,
+ )
+
+
+ # - - - - - - - - - - - - - - - - - - - - - - - -
+ # compatibility with io library
+
+ def readable(self): return True
+ def writable(self): return True
+ def seekable(self): return False
+ def readinto(self, b):
+ data = self.read(len(b))
+ n = len(data)
+ try:
+ b[:n] = data
+ except TypeError, err:
+ import array
+ if not isinstance(b, array.array):
+ raise err
+ b[:n] = array.array('b', data)
+ return n
+
+
+if __name__ == '__main__':
+ import sys
+ s = SerialBase()
+ sys.stdout.write('port name: %s\n' % s.portstr)
+ sys.stdout.write('baud rates: %s\n' % s.getSupportedBaudrates())
+ sys.stdout.write('byte sizes: %s\n' % s.getSupportedByteSizes())
+ sys.stdout.write('parities: %s\n' % s.getSupportedParities())
+ sys.stdout.write('stop bits: %s\n' % s.getSupportedStopbits())
+ sys.stdout.write('%s\n' % s)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/serialwin32.py b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/serialwin32.py
new file mode 100644
index 0000000..dfdd953
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/serialwin32.py
@@ -0,0 +1,461 @@
+#! python
+# Python Serial Port Extension for Win32, Linux, BSD, Jython
+# serial driver for win32
+# see __init__.py
+#
+# (C) 2001-2011 Chris Liechti <cliechti@gmx.net>
+# this is distributed under a free software license, see license.txt
+#
+# Initial patch to use ctypes by Giovanni Bajo <rasky@develer.com>
+
+import ctypes
+from serial import win32
+
+from serial.serialutil import *
+
+
+def device(portnum):
+ """Turn a port number into a device name"""
+ return 'COM%d' % (portnum+1) # numbers are transformed to a string
+
+
+class Win32Serial(SerialBase):
+ """Serial port implementation for Win32 based on ctypes."""
+
+ BAUDRATES = (50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
+ 9600, 19200, 38400, 57600, 115200)
+
+ def __init__(self, *args, **kwargs):
+ self.hComPort = None
+ self._overlappedRead = None
+ self._overlappedWrite = None
+ self._rtsToggle = False
+
+ self._rtsState = win32.RTS_CONTROL_ENABLE
+ self._dtrState = win32.DTR_CONTROL_ENABLE
+
+
+ SerialBase.__init__(self, *args, **kwargs)
+
+ def open(self):
+ """Open port with current settings. This may throw a SerialException
+ if the port cannot be opened."""
+ if self._port is None:
+ raise SerialException("Port must be configured before it can be used.")
+ if self._isOpen:
+ raise SerialException("Port is already open.")
+ # the "\\.\COMx" format is required for devices other than COM1-COM8
+ # not all versions of windows seem to support this properly
+ # so that the first few ports are used with the DOS device name
+ port = self.portstr
+ try:
+ if port.upper().startswith('COM') and int(port[3:]) > 8:
+ port = '\\\\.\\' + port
+ except ValueError:
+ # for like COMnotanumber
+ pass
+ self.hComPort = win32.CreateFile(port,
+ win32.GENERIC_READ | win32.GENERIC_WRITE,
+ 0, # exclusive access
+ None, # no security
+ win32.OPEN_EXISTING,
+ win32.FILE_ATTRIBUTE_NORMAL | win32.FILE_FLAG_OVERLAPPED,
+ 0)
+ if self.hComPort == win32.INVALID_HANDLE_VALUE:
+ self.hComPort = None # 'cause __del__ is called anyway
+ raise SerialException("could not open port %r: %r" % (self.portstr, ctypes.WinError()))
+
+ try:
+ self._overlappedRead = win32.OVERLAPPED()
+ self._overlappedRead.hEvent = win32.CreateEvent(None, 1, 0, None)
+ self._overlappedWrite = win32.OVERLAPPED()
+ #~ self._overlappedWrite.hEvent = win32.CreateEvent(None, 1, 0, None)
+ self._overlappedWrite.hEvent = win32.CreateEvent(None, 0, 0, None)
+
+ # Setup a 4k buffer
+ win32.SetupComm(self.hComPort, 4096, 4096)
+
+ # Save original timeout values:
+ self._orgTimeouts = win32.COMMTIMEOUTS()
+ win32.GetCommTimeouts(self.hComPort, ctypes.byref(self._orgTimeouts))
+
+ self._reconfigurePort()
+
+ # Clear buffers:
+ # Remove anything that was there
+ win32.PurgeComm(self.hComPort,
+ win32.PURGE_TXCLEAR | win32.PURGE_TXABORT |
+ win32.PURGE_RXCLEAR | win32.PURGE_RXABORT)
+ except:
+ try:
+ self._close()
+ except:
+ # ignore any exception when closing the port
+ # also to keep original exception that happened when setting up
+ pass
+ self.hComPort = None
+ raise
+ else:
+ self._isOpen = True
+
+
+ def _reconfigurePort(self):
+ """Set communication parameters on opened port."""
+ if not self.hComPort:
+ raise SerialException("Can only operate on a valid port handle")
+
+ # Set Windows timeout values
+ # timeouts is a tuple with the following items:
+ # (ReadIntervalTimeout,ReadTotalTimeoutMultiplier,
+ # ReadTotalTimeoutConstant,WriteTotalTimeoutMultiplier,
+ # WriteTotalTimeoutConstant)
+ if self._timeout is None:
+ timeouts = (0, 0, 0, 0, 0)
+ elif self._timeout == 0:
+ timeouts = (win32.MAXDWORD, 0, 0, 0, 0)
+ else:
+ timeouts = (0, 0, int(self._timeout*1000), 0, 0)
+ if self._timeout != 0 and self._interCharTimeout is not None:
+ timeouts = (int(self._interCharTimeout * 1000),) + timeouts[1:]
+
+ if self._writeTimeout is None:
+ pass
+ elif self._writeTimeout == 0:
+ timeouts = timeouts[:-2] + (0, win32.MAXDWORD)
+ else:
+ timeouts = timeouts[:-2] + (0, int(self._writeTimeout*1000))
+ win32.SetCommTimeouts(self.hComPort, ctypes.byref(win32.COMMTIMEOUTS(*timeouts)))
+
+ win32.SetCommMask(self.hComPort, win32.EV_ERR)
+
+ # Setup the connection info.
+ # Get state and modify it:
+ comDCB = win32.DCB()
+ win32.GetCommState(self.hComPort, ctypes.byref(comDCB))
+ comDCB.BaudRate = self._baudrate
+
+ if self._bytesize == FIVEBITS:
+ comDCB.ByteSize = 5
+ elif self._bytesize == SIXBITS:
+ comDCB.ByteSize = 6
+ elif self._bytesize == SEVENBITS:
+ comDCB.ByteSize = 7
+ elif self._bytesize == EIGHTBITS:
+ comDCB.ByteSize = 8
+ else:
+ raise ValueError("Unsupported number of data bits: %r" % self._bytesize)
+
+ if self._parity == PARITY_NONE:
+ comDCB.Parity = win32.NOPARITY
+ comDCB.fParity = 0 # Disable Parity Check
+ elif self._parity == PARITY_EVEN:
+ comDCB.Parity = win32.EVENPARITY
+ comDCB.fParity = 1 # Enable Parity Check
+ elif self._parity == PARITY_ODD:
+ comDCB.Parity = win32.ODDPARITY
+ comDCB.fParity = 1 # Enable Parity Check
+ elif self._parity == PARITY_MARK:
+ comDCB.Parity = win32.MARKPARITY
+ comDCB.fParity = 1 # Enable Parity Check
+ elif self._parity == PARITY_SPACE:
+ comDCB.Parity = win32.SPACEPARITY
+ comDCB.fParity = 1 # Enable Parity Check
+ else:
+ raise ValueError("Unsupported parity mode: %r" % self._parity)
+
+ if self._stopbits == STOPBITS_ONE:
+ comDCB.StopBits = win32.ONESTOPBIT
+ elif self._stopbits == STOPBITS_ONE_POINT_FIVE:
+ comDCB.StopBits = win32.ONE5STOPBITS
+ elif self._stopbits == STOPBITS_TWO:
+ comDCB.StopBits = win32.TWOSTOPBITS
+ else:
+ raise ValueError("Unsupported number of stop bits: %r" % self._stopbits)
+
+ comDCB.fBinary = 1 # Enable Binary Transmission
+ # Char. w/ Parity-Err are replaced with 0xff (if fErrorChar is set to TRUE)
+ if self._rtscts:
+ comDCB.fRtsControl = win32.RTS_CONTROL_HANDSHAKE
+ elif self._rtsToggle:
+ comDCB.fRtsControl = win32.RTS_CONTROL_TOGGLE
+ else:
+ comDCB.fRtsControl = self._rtsState
+ if self._dsrdtr:
+ comDCB.fDtrControl = win32.DTR_CONTROL_HANDSHAKE
+ else:
+ comDCB.fDtrControl = self._dtrState
+
+ if self._rtsToggle:
+ comDCB.fOutxCtsFlow = 0
+ else:
+ comDCB.fOutxCtsFlow = self._rtscts
+ comDCB.fOutxDsrFlow = self._dsrdtr
+ comDCB.fOutX = self._xonxoff
+ comDCB.fInX = self._xonxoff
+ comDCB.fNull = 0
+ comDCB.fErrorChar = 0
+ comDCB.fAbortOnError = 0
+ comDCB.XonChar = XON
+ comDCB.XoffChar = XOFF
+
+ if not win32.SetCommState(self.hComPort, ctypes.byref(comDCB)):
+ raise ValueError("Cannot configure port, some setting was wrong. Original message: %r" % ctypes.WinError())
+
+ #~ def __del__(self):
+ #~ self.close()
+
+
+ def _close(self):
+ """internal close port helper"""
+ if self.hComPort:
+ # Restore original timeout values:
+ win32.SetCommTimeouts(self.hComPort, self._orgTimeouts)
+ # Close COM-Port:
+ win32.CloseHandle(self.hComPort)
+ if self._overlappedRead is not None:
+ win32.CloseHandle(self._overlappedRead.hEvent)
+ self._overlappedRead = None
+ if self._overlappedWrite is not None:
+ win32.CloseHandle(self._overlappedWrite.hEvent)
+ self._overlappedWrite = None
+ self.hComPort = None
+
+ def close(self):
+ """Close port"""
+ if self._isOpen:
+ self._close()
+ self._isOpen = False
+
+ def makeDeviceName(self, port):
+ return device(port)
+
+ # - - - - - - - - - - - - - - - - - - - - - - - -
+
+ def inWaiting(self):
+ """Return the number of characters currently in the input buffer."""
+ flags = win32.DWORD()
+ comstat = win32.COMSTAT()
+ if not win32.ClearCommError(self.hComPort, ctypes.byref(flags), ctypes.byref(comstat)):
+ raise SerialException('call to ClearCommError failed')
+ return comstat.cbInQue
+
+ def read(self, size=1):
+ """Read size bytes from the serial port. If a timeout is set it may
+ return less characters as requested. With no timeout it will block
+ until the requested number of bytes is read."""
+ if not self.hComPort: raise portNotOpenError
+ if size > 0:
+ win32.ResetEvent(self._overlappedRead.hEvent)
+ flags = win32.DWORD()
+ comstat = win32.COMSTAT()
+ if not win32.ClearCommError(self.hComPort, ctypes.byref(flags), ctypes.byref(comstat)):
+ raise SerialException('call to ClearCommError failed')
+ if self.timeout == 0:
+ n = min(comstat.cbInQue, size)
+ if n > 0:
+ buf = ctypes.create_string_buffer(n)
+ rc = win32.DWORD()
+ err = win32.ReadFile(self.hComPort, buf, n, ctypes.byref(rc), ctypes.byref(self._overlappedRead))
+ if not err and win32.GetLastError() != win32.ERROR_IO_PENDING:
+ raise SerialException("ReadFile failed (%r)" % ctypes.WinError())
+ err = win32.WaitForSingleObject(self._overlappedRead.hEvent, win32.INFINITE)
+ read = buf.raw[:rc.value]
+ else:
+ read = bytes()
+ else:
+ buf = ctypes.create_string_buffer(size)
+ rc = win32.DWORD()
+ err = win32.ReadFile(self.hComPort, buf, size, ctypes.byref(rc), ctypes.byref(self._overlappedRead))
+ if not err and win32.GetLastError() != win32.ERROR_IO_PENDING:
+ raise SerialException("ReadFile failed (%r)" % ctypes.WinError())
+ err = win32.GetOverlappedResult(self.hComPort, ctypes.byref(self._overlappedRead), ctypes.byref(rc), True)
+ read = buf.raw[:rc.value]
+ else:
+ read = bytes()
+ return bytes(read)
+
+ def write(self, data):
+ """Output the given string over the serial port."""
+ if not self.hComPort: raise portNotOpenError
+ #~ if not isinstance(data, (bytes, bytearray)):
+ #~ raise TypeError('expected %s or bytearray, got %s' % (bytes, type(data)))
+ # convert data (needed in case of memoryview instance: Py 3.1 io lib), ctypes doesn't like memoryview
+ data = to_bytes(data)
+ if data:
+ #~ win32event.ResetEvent(self._overlappedWrite.hEvent)
+ n = win32.DWORD()
+ err = win32.WriteFile(self.hComPort, data, len(data), ctypes.byref(n), self._overlappedWrite)
+ if not err and win32.GetLastError() != win32.ERROR_IO_PENDING:
+ raise SerialException("WriteFile failed (%r)" % ctypes.WinError())
+ if self._writeTimeout != 0: # if blocking (None) or w/ write timeout (>0)
+ # Wait for the write to complete.
+ #~ win32.WaitForSingleObject(self._overlappedWrite.hEvent, win32.INFINITE)
+ err = win32.GetOverlappedResult(self.hComPort, self._overlappedWrite, ctypes.byref(n), True)
+ if n.value != len(data):
+ raise writeTimeoutError
+ return n.value
+ else:
+ return 0
+
+ def flush(self):
+ """Flush of file like objects. In this case, wait until all data
+ is written."""
+ while self.outWaiting():
+ time.sleep(0.05)
+ # XXX could also use WaitCommEvent with mask EV_TXEMPTY, but it would
+ # require overlapped IO and its also only possible to set a single mask
+ # on the port---
+
+ def flushInput(self):
+ """Clear input buffer, discarding all that is in the buffer."""
+ if not self.hComPort: raise portNotOpenError
+ win32.PurgeComm(self.hComPort, win32.PURGE_RXCLEAR | win32.PURGE_RXABORT)
+
+ def flushOutput(self):
+ """Clear output buffer, aborting the current output and
+ discarding all that is in the buffer."""
+ if not self.hComPort: raise portNotOpenError
+ win32.PurgeComm(self.hComPort, win32.PURGE_TXCLEAR | win32.PURGE_TXABORT)
+
+ def sendBreak(self, duration=0.25):
+ """Send break condition. Timed, returns to idle state after given duration."""
+ if not self.hComPort: raise portNotOpenError
+ import time
+ win32.SetCommBreak(self.hComPort)
+ time.sleep(duration)
+ win32.ClearCommBreak(self.hComPort)
+
+ def setBreak(self, level=1):
+ """Set break: Controls TXD. When active, to transmitting is possible."""
+ if not self.hComPort: raise portNotOpenError
+ if level:
+ win32.SetCommBreak(self.hComPort)
+ else:
+ win32.ClearCommBreak(self.hComPort)
+
+ def setRTS(self, level=1):
+ """Set terminal status line: Request To Send"""
+ # remember level for reconfigure
+ if level:
+ self._rtsState = win32.RTS_CONTROL_ENABLE
+ else:
+ self._rtsState = win32.RTS_CONTROL_DISABLE
+ # also apply now if port is open
+ if self.hComPort:
+ if level:
+ win32.EscapeCommFunction(self.hComPort, win32.SETRTS)
+ else:
+ win32.EscapeCommFunction(self.hComPort, win32.CLRRTS)
+
+ def setDTR(self, level=1):
+ """Set terminal status line: Data Terminal Ready"""
+ # remember level for reconfigure
+ if level:
+ self._dtrState = win32.DTR_CONTROL_ENABLE
+ else:
+ self._dtrState = win32.DTR_CONTROL_DISABLE
+ # also apply now if port is open
+ if self.hComPort:
+ if level:
+ win32.EscapeCommFunction(self.hComPort, win32.SETDTR)
+ else:
+ win32.EscapeCommFunction(self.hComPort, win32.CLRDTR)
+
+ def _GetCommModemStatus(self):
+ stat = win32.DWORD()
+ win32.GetCommModemStatus(self.hComPort, ctypes.byref(stat))
+ return stat.value
+
+ def getCTS(self):
+ """Read terminal status line: Clear To Send"""
+ if not self.hComPort: raise portNotOpenError
+ return win32.MS_CTS_ON & self._GetCommModemStatus() != 0
+
+ def getDSR(self):
+ """Read terminal status line: Data Set Ready"""
+ if not self.hComPort: raise portNotOpenError
+ return win32.MS_DSR_ON & self._GetCommModemStatus() != 0
+
+ def getRI(self):
+ """Read terminal status line: Ring Indicator"""
+ if not self.hComPort: raise portNotOpenError
+ return win32.MS_RING_ON & self._GetCommModemStatus() != 0
+
+ def getCD(self):
+ """Read terminal status line: Carrier Detect"""
+ if not self.hComPort: raise portNotOpenError
+ return win32.MS_RLSD_ON & self._GetCommModemStatus() != 0
+
+ # - - platform specific - - - -
+
+ def setBufferSize(self, rx_size=4096, tx_size=None):
+ """\
+ Recommend a buffer size to the driver (device driver can ignore this
+ vlaue). Must be called before the port is opended.
+ """
+ if tx_size is None: tx_size = rx_size
+ win32.SetupComm(self.hComPort, rx_size, tx_size)
+
+ def setXON(self, level=True):
+ """\
+ Manually control flow - when software flow control is enabled.
+ This will send XON (true) and XOFF (false) to the other device.
+ WARNING: this function is not portable to different platforms!
+ """
+ if not self.hComPort: raise portNotOpenError
+ if level:
+ win32.EscapeCommFunction(self.hComPort, win32.SETXON)
+ else:
+ win32.EscapeCommFunction(self.hComPort, win32.SETXOFF)
+
+ def outWaiting(self):
+ """return how many characters the in the outgoing buffer"""
+ flags = win32.DWORD()
+ comstat = win32.COMSTAT()
+ if not win32.ClearCommError(self.hComPort, ctypes.byref(flags), ctypes.byref(comstat)):
+ raise SerialException('call to ClearCommError failed')
+ return comstat.cbOutQue
+
+ # functions useful for RS-485 adapters
+ def setRtsToggle(self, rtsToggle):
+ """Change RTS toggle control setting."""
+ self._rtsToggle = rtsToggle
+ if self._isOpen: self._reconfigurePort()
+
+ def getRtsToggle(self):
+ """Get the current RTS toggle control setting."""
+ return self._rtsToggle
+
+ rtsToggle = property(getRtsToggle, setRtsToggle, doc="RTS toggle control setting")
+
+
+# assemble Serial class with the platform specific implementation and the base
+# for file-like behavior. for Python 2.6 and newer, that provide the new I/O
+# library, derive from io.RawIOBase
+try:
+ import io
+except ImportError:
+ # classic version with our own file-like emulation
+ class Serial(Win32Serial, FileLike):
+ pass
+else:
+ # io library present
+ class Serial(Win32Serial, io.RawIOBase):
+ pass
+
+
+# Nur Testfunktion!!
+if __name__ == '__main__':
+ s = Serial(0)
+ sys.stdout.write("%s\n" % s)
+
+ s = Serial()
+ sys.stdout.write("%s\n" % s)
+
+ s.baudrate = 19200
+ s.databits = 7
+ s.close()
+ s.port = 0
+ s.open()
+ sys.stdout.write("%s\n" % s)
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/sermsdos.py b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/sermsdos.py
new file mode 100644
index 0000000..09a0017
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/sermsdos.py
@@ -0,0 +1,200 @@
+# sermsdos.py
+#
+# History:
+#
+# 3rd September 2002 Dave Haynes
+# 1. First defined
+#
+# Although this code should run under the latest versions of
+# Python, on DOS-based platforms such as Windows 95 and 98,
+# it has been specifically written to be compatible with
+# PyDOS, available at:
+# http://www.python.org/ftp/python/wpy/dos.html
+#
+# PyDOS is a stripped-down version of Python 1.5.2 for
+# DOS machines. Therefore, in making changes to this file,
+# please respect Python 1.5.2 syntax. In addition, please
+# limit the width of this file to 60 characters.
+#
+# Note also that the modules in PyDOS contain fewer members
+# than other versions, so we are restricted to using the
+# following:
+#
+# In module os:
+# -------------
+# environ, chdir, getcwd, getpid, umask, fdopen, close,
+# dup, dup2, fstat, lseek, open, read, write, O_RDONLY,
+# O_WRONLY, O_RDWR, O_APPEND, O_CREAT, O_EXCL, O_TRUNC,
+# access, F_OK, R_OK, W_OK, X_OK, chmod, listdir, mkdir,
+# remove, rename, renames, rmdir, stat, unlink, utime,
+# execl, execle, execlp, execlpe, execvp, execvpe, _exit,
+# system.
+#
+# In module os.path:
+# ------------------
+# curdir, pardir, sep, altsep, pathsep, defpath, linesep.
+#
+
+import os
+import sys
+import string
+import serial.serialutil
+
+BAUD_RATES = {
+ 110: "11",
+ 150: "15",
+ 300: "30",
+ 600: "60",
+ 1200: "12",
+ 2400: "24",
+ 4800: "48",
+ 9600: "96",
+ 19200: "19"}
+
+(PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK,
+PARITY_SPACE) = (0, 1, 2, 3, 4)
+(STOPBITS_ONE, STOPBITS_ONEANDAHALF,
+STOPBITS_TWO) = (1, 1.5, 2)
+FIVEBITS, SIXBITS, SEVENBITS, EIGHTBITS = (5, 6, 7, 8)
+(RETURN_ERROR, RETURN_BUSY, RETURN_RETRY, RETURN_READY,
+RETURN_NONE) = ('E', 'B', 'P', 'R', 'N')
+portNotOpenError = ValueError('port not open')
+
+def device(portnum):
+ return 'COM%d' % (portnum+1)
+
+class Serial(serialutil.FileLike):
+ """
+ port: number of device; numbering starts at
+ zero. if everything fails, the user can
+ specify a device string, note that this
+ isn't portable any more
+ baudrate: baud rate
+ bytesize: number of databits
+ parity: enable parity checking
+ stopbits: number of stopbits
+ timeout: set a timeout (None for waiting forever)
+ xonxoff: enable software flow control
+ rtscts: enable RTS/CTS flow control
+ retry: DOS retry mode
+ """
+ def __init__(self,
+ port,
+ baudrate = 9600,
+ bytesize = EIGHTBITS,
+ parity = PARITY_NONE,
+ stopbits = STOPBITS_ONE,
+ timeout = None,
+ xonxoff = 0,
+ rtscts = 0,
+ retry = RETURN_RETRY
+ ):
+
+ if type(port) == type(''):
+ # strings are taken directly
+ self.portstr = port
+ else:
+ # numbers are transformed to a string
+ self.portstr = device(port+1)
+
+ self.baud = BAUD_RATES[baudrate]
+ self.bytesize = str(bytesize)
+
+ if parity == PARITY_NONE:
+ self.parity = 'N'
+ elif parity == PARITY_EVEN:
+ self.parity = 'E'
+ elif parity == PARITY_ODD:
+ self.parity = 'O'
+ elif parity == PARITY_MARK:
+ self.parity = 'M'
+ elif parity == PARITY_SPACE:
+ self.parity = 'S'
+
+ self.stop = str(stopbits)
+ self.retry = retry
+ self.filename = "sermsdos.tmp"
+
+ self._config(self.portstr, self.baud, self.parity,
+ self.bytesize, self.stop, self.retry, self.filename)
+
+ def __del__(self):
+ self.close()
+
+ def close(self):
+ pass
+
+ def _config(self, port, baud, parity, data, stop, retry,
+ filename):
+ comString = string.join(("MODE ", port, ":"
+ , " BAUD= ", baud, " PARITY= ", parity
+ , " DATA= ", data, " STOP= ", stop, " RETRY= ",
+ retry, " > ", filename ), '')
+ os.system(comString)
+
+ def setBaudrate(self, baudrate):
+ self._config(self.portstr, BAUD_RATES[baudrate],
+ self.parity, self.bytesize, self.stop, self.retry,
+ self.filename)
+
+ def inWaiting(self):
+ """returns the number of bytes waiting to be read"""
+ raise NotImplementedError
+
+ def read(self, num = 1):
+ """Read num bytes from serial port"""
+ handle = os.open(self.portstr,
+ os.O_RDONLY | os.O_BINARY)
+ rv = os.read(handle, num)
+ os.close(handle)
+ return rv
+
+ def write(self, s):
+ """Write string to serial port"""
+ handle = os.open(self.portstr,
+ os.O_WRONLY | os.O_BINARY)
+ rv = os.write(handle, s)
+ os.close(handle)
+ return rv
+
+ def flushInput(self):
+ raise NotImplementedError
+
+ def flushOutput(self):
+ raise NotImplementedError
+
+ def sendBreak(self):
+ raise NotImplementedError
+
+ def setRTS(self,level=1):
+ """Set terminal status line"""
+ raise NotImplementedError
+
+ def setDTR(self,level=1):
+ """Set terminal status line"""
+ raise NotImplementedError
+
+ def getCTS(self):
+ """Eead terminal status line"""
+ raise NotImplementedError
+
+ def getDSR(self):
+ """Eead terminal status line"""
+ raise NotImplementedError
+
+ def getRI(self):
+ """Eead terminal status line"""
+ raise NotImplementedError
+
+ def getCD(self):
+ """Eead terminal status line"""
+ raise NotImplementedError
+
+ def __repr__(self):
+ return string.join(( "<Serial>: ", self.portstr
+ , self.baud, self.parity, self.bytesize, self.stop,
+ self.retry , self.filename), ' ')
+
+if __name__ == '__main__':
+ s = Serial(0)
+ sys.stdio.write('%s %s\n' % (__name__, s))
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/__init__.py
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/list_ports.py b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/list_ports.py
new file mode 100644
index 0000000..d373a55
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/list_ports.py
@@ -0,0 +1,103 @@
+#!/usr/bin/env python
+
+# portable serial port access with python
+# this is a wrapper module for different platform implementations of the
+# port enumeration feature
+#
+# (C) 2011-2013 Chris Liechti <cliechti@gmx.net>
+# this is distributed under a free software license, see license.txt
+
+"""\
+This module will provide a function called comports that returns an
+iterable (generator or list) that will enumerate available com ports. Note that
+on some systems non-existent ports may be listed.
+
+Additionally a grep function is supplied that can be used to search for ports
+based on their descriptions or hardware ID.
+"""
+
+import sys, os, re
+
+# chose an implementation, depending on os
+#~ if sys.platform == 'cli':
+#~ else:
+import os
+# chose an implementation, depending on os
+if os.name == 'nt': #sys.platform == 'win32':
+ from serial.tools.list_ports_windows import *
+elif os.name == 'posix':
+ from serial.tools.list_ports_posix import *
+#~ elif os.name == 'java':
+else:
+ raise ImportError("Sorry: no implementation for your platform ('%s') available" % (os.name,))
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+def grep(regexp):
+ """\
+ Search for ports using a regular expression. Port name, description and
+ hardware ID are searched. The function returns an iterable that returns the
+ same tuples as comport() would do.
+ """
+ r = re.compile(regexp, re.I)
+ for port, desc, hwid in comports():
+ if r.search(port) or r.search(desc) or r.search(hwid):
+ yield port, desc, hwid
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+def main():
+ import optparse
+
+ parser = optparse.OptionParser(
+ usage = "%prog [options] [<regexp>]",
+ description = "Miniterm - A simple terminal program for the serial port."
+ )
+
+ parser.add_option("--debug",
+ help="print debug messages and tracebacks (development mode)",
+ dest="debug",
+ default=False,
+ action='store_true')
+
+ parser.add_option("-v", "--verbose",
+ help="show more messages (can be given multiple times)",
+ dest="verbose",
+ default=1,
+ action='count')
+
+ parser.add_option("-q", "--quiet",
+ help="suppress all messages",
+ dest="verbose",
+ action='store_const',
+ const=0)
+
+ (options, args) = parser.parse_args()
+
+
+ hits = 0
+ # get iteraror w/ or w/o filter
+ if args:
+ if len(args) > 1:
+ parser.error('more than one regexp not supported')
+ print "Filtered list with regexp: %r" % (args[0],)
+ iterator = sorted(grep(args[0]))
+ else:
+ iterator = sorted(comports())
+ # list them
+ for port, desc, hwid in iterator:
+ print("%-20s" % (port,))
+ if options.verbose > 1:
+ print(" desc: %s" % (desc,))
+ print(" hwid: %s" % (hwid,))
+ hits += 1
+ if options.verbose:
+ if hits:
+ print("%d ports found" % (hits,))
+ else:
+ print("no ports found")
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# test
+if __name__ == '__main__':
+ main()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/list_ports_linux.py b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/list_ports_linux.py
new file mode 100644
index 0000000..ecfd158
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/list_ports_linux.py
@@ -0,0 +1,151 @@
+#!/usr/bin/env python
+
+# portable serial port access with python
+#
+# This is a module that gathers a list of serial ports including details on
+# GNU/Linux systems
+#
+# (C) 2011-2013 Chris Liechti <cliechti@gmx.net>
+# this is distributed under a free software license, see license.txt
+
+import glob
+import sys
+import os
+import re
+
+try:
+ import subprocess
+except ImportError:
+ def popen(argv):
+ try:
+ si, so = os.popen4(' '.join(argv))
+ return so.read().strip()
+ except:
+ raise IOError('lsusb failed')
+else:
+ def popen(argv):
+ try:
+ return subprocess.check_output(argv, stderr=subprocess.STDOUT).strip()
+ except:
+ raise IOError('lsusb failed')
+
+
+# The comports function is expected to return an iterable that yields tuples of
+# 3 strings: port name, human readable description and a hardware ID.
+#
+# as currently no method is known to get the second two strings easily, they
+# are currently just identical to the port name.
+
+# try to detect the OS so that a device can be selected...
+plat = sys.platform.lower()
+
+def read_line(filename):
+ """help function to read a single line from a file. returns none"""
+ try:
+ f = open(filename)
+ line = f.readline().strip()
+ f.close()
+ return line
+ except IOError:
+ return None
+
+def re_group(regexp, text):
+ """search for regexp in text, return 1st group on match"""
+ if sys.version < '3':
+ m = re.search(regexp, text)
+ else:
+ # text is bytes-like
+ m = re.search(regexp, text.decode('ascii', 'replace'))
+ if m: return m.group(1)
+
+
+# try to extract descriptions from sysfs. this was done by experimenting,
+# no guarantee that it works for all devices or in the future...
+
+def usb_sysfs_hw_string(sysfs_path):
+ """given a path to a usb device in sysfs, return a string describing it"""
+ bus, dev = os.path.basename(os.path.realpath(sysfs_path)).split('-')
+ snr = read_line(sysfs_path+'/serial')
+ if snr:
+ snr_txt = ' SNR=%s' % (snr,)
+ else:
+ snr_txt = ''
+ return 'USB VID:PID=%s:%s%s' % (
+ read_line(sysfs_path+'/idVendor'),
+ read_line(sysfs_path+'/idProduct'),
+ snr_txt
+ )
+
+def usb_lsusb_string(sysfs_path):
+ base = os.path.basename(os.path.realpath(sysfs_path))
+ bus = base.split('-')[0]
+ try:
+ dev = int(read_line(os.path.join(sysfs_path, 'devnum')))
+ desc = popen(['lsusb', '-v', '-s', '%s:%s' % (bus, dev)])
+ # descriptions from device
+ iManufacturer = re_group('iManufacturer\s+\w+ (.+)', desc)
+ iProduct = re_group('iProduct\s+\w+ (.+)', desc)
+ iSerial = re_group('iSerial\s+\w+ (.+)', desc) or ''
+ # descriptions from kernel
+ idVendor = re_group('idVendor\s+0x\w+ (.+)', desc)
+ idProduct = re_group('idProduct\s+0x\w+ (.+)', desc)
+ # create descriptions. prefer text from device, fall back to the others
+ return '%s %s %s' % (iManufacturer or idVendor, iProduct or idProduct, iSerial)
+ except IOError:
+ return base
+
+def describe(device):
+ """\
+ Get a human readable description.
+ For USB-Serial devices try to run lsusb to get a human readable description.
+ For USB-CDC devices read the description from sysfs.
+ """
+ base = os.path.basename(device)
+ # USB-Serial devices
+ sys_dev_path = '/sys/class/tty/%s/device/driver/%s' % (base, base)
+ if os.path.exists(sys_dev_path):
+ sys_usb = os.path.dirname(os.path.dirname(os.path.realpath(sys_dev_path)))
+ return usb_lsusb_string(sys_usb)
+ # USB-CDC devices
+ sys_dev_path = '/sys/class/tty/%s/device/interface' % (base,)
+ if os.path.exists(sys_dev_path):
+ return read_line(sys_dev_path)
+
+ # USB Product Information
+ sys_dev_path = '/sys/class/tty/%s/device' % (base,)
+ if os.path.exists(sys_dev_path):
+ product_name_file = os.path.dirname(os.path.realpath(sys_dev_path)) + "/product"
+ if os.path.exists(product_name_file):
+ return read_line(product_name_file)
+
+ return base
+
+def hwinfo(device):
+ """Try to get a HW identification using sysfs"""
+ base = os.path.basename(device)
+ if os.path.exists('/sys/class/tty/%s/device' % (base,)):
+ # PCI based devices
+ sys_id_path = '/sys/class/tty/%s/device/id' % (base,)
+ if os.path.exists(sys_id_path):
+ return read_line(sys_id_path)
+ # USB-Serial devices
+ sys_dev_path = '/sys/class/tty/%s/device/driver/%s' % (base, base)
+ if os.path.exists(sys_dev_path):
+ sys_usb = os.path.dirname(os.path.dirname(os.path.realpath(sys_dev_path)))
+ return usb_sysfs_hw_string(sys_usb)
+ # USB-CDC devices
+ if base.startswith('ttyACM'):
+ sys_dev_path = '/sys/class/tty/%s/device' % (base,)
+ if os.path.exists(sys_dev_path):
+ return usb_sysfs_hw_string(sys_dev_path + '/..')
+ return 'n/a' # XXX directly remove these from the list?
+
+def comports():
+ devices = glob.glob('/dev/ttyS*') + glob.glob('/dev/ttyUSB*') + glob.glob('/dev/ttyACM*')
+ return [(d, describe(d), hwinfo(d)) for d in devices]
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# test
+if __name__ == '__main__':
+ for port, desc, hwid in sorted(comports()):
+ print "%s: %s [%s]" % (port, desc, hwid)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/list_ports_osx.py b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/list_ports_osx.py
new file mode 100644
index 0000000..c9ed615
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/list_ports_osx.py
@@ -0,0 +1,208 @@
+#!/usr/bin/env python
+
+# portable serial port access with python
+#
+# This is a module that gathers a list of serial ports including details on OSX
+#
+# code originally from https://github.com/makerbot/pyserial/tree/master/serial/tools
+# with contributions from cibomahto, dgs3, FarMcKon, tedbrandston
+# and modifications by cliechti
+#
+# this is distributed under a free software license, see license.txt
+
+
+
+# List all of the callout devices in OS/X by querying IOKit.
+
+# See the following for a reference of how to do this:
+# http://developer.apple.com/library/mac/#documentation/DeviceDrivers/Conceptual/WorkingWSerial/WWSerial_SerialDevs/SerialDevices.html#//apple_ref/doc/uid/TP30000384-CIHGEAFD
+
+# More help from darwin_hid.py
+
+# Also see the 'IORegistryExplorer' for an idea of what we are actually searching
+
+import ctypes
+from ctypes import util
+import re
+
+iokit = ctypes.cdll.LoadLibrary(ctypes.util.find_library('IOKit'))
+cf = ctypes.cdll.LoadLibrary(ctypes.util.find_library('CoreFoundation'))
+
+kIOMasterPortDefault = ctypes.c_void_p.in_dll(iokit, "kIOMasterPortDefault")
+kCFAllocatorDefault = ctypes.c_void_p.in_dll(cf, "kCFAllocatorDefault")
+
+kCFStringEncodingMacRoman = 0
+
+iokit.IOServiceMatching.restype = ctypes.c_void_p
+
+iokit.IOServiceGetMatchingServices.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p]
+iokit.IOServiceGetMatchingServices.restype = ctypes.c_void_p
+
+iokit.IORegistryEntryGetParentEntry.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p]
+
+iokit.IORegistryEntryCreateCFProperty.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_uint32]
+iokit.IORegistryEntryCreateCFProperty.restype = ctypes.c_void_p
+
+iokit.IORegistryEntryGetPath.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p]
+iokit.IORegistryEntryGetPath.restype = ctypes.c_void_p
+
+iokit.IORegistryEntryGetName.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
+iokit.IORegistryEntryGetName.restype = ctypes.c_void_p
+
+iokit.IOObjectGetClass.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
+iokit.IOObjectGetClass.restype = ctypes.c_void_p
+
+iokit.IOObjectRelease.argtypes = [ctypes.c_void_p]
+
+
+cf.CFStringCreateWithCString.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int32]
+cf.CFStringCreateWithCString.restype = ctypes.c_void_p
+
+cf.CFStringGetCStringPtr.argtypes = [ctypes.c_void_p, ctypes.c_uint32]
+cf.CFStringGetCStringPtr.restype = ctypes.c_char_p
+
+cf.CFNumberGetValue.argtypes = [ctypes.c_void_p, ctypes.c_uint32, ctypes.c_void_p]
+cf.CFNumberGetValue.restype = ctypes.c_void_p
+
+def get_string_property(device_t, property):
+ """ Search the given device for the specified string property
+
+ @param device_t Device to search
+ @param property String to search for.
+ @return Python string containing the value, or None if not found.
+ """
+ key = cf.CFStringCreateWithCString(
+ kCFAllocatorDefault,
+ property.encode("mac_roman"),
+ kCFStringEncodingMacRoman
+ )
+
+ CFContainer = iokit.IORegistryEntryCreateCFProperty(
+ device_t,
+ key,
+ kCFAllocatorDefault,
+ 0
+ );
+
+ output = None
+
+ if CFContainer:
+ output = cf.CFStringGetCStringPtr(CFContainer, 0)
+
+ return output
+
+def get_int_property(device_t, property):
+ """ Search the given device for the specified string property
+
+ @param device_t Device to search
+ @param property String to search for.
+ @return Python string containing the value, or None if not found.
+ """
+ key = cf.CFStringCreateWithCString(
+ kCFAllocatorDefault,
+ property.encode("mac_roman"),
+ kCFStringEncodingMacRoman
+ )
+
+ CFContainer = iokit.IORegistryEntryCreateCFProperty(
+ device_t,
+ key,
+ kCFAllocatorDefault,
+ 0
+ );
+
+ number = ctypes.c_uint16()
+
+ if CFContainer:
+ output = cf.CFNumberGetValue(CFContainer, 2, ctypes.byref(number))
+
+ return number.value
+
+def IORegistryEntryGetName(device):
+ pathname = ctypes.create_string_buffer(100) # TODO: Is this ok?
+ iokit.IOObjectGetClass(
+ device,
+ ctypes.byref(pathname)
+ )
+
+ return pathname.value
+
+def GetParentDeviceByType(device, parent_type):
+ """ Find the first parent of a device that implements the parent_type
+ @param IOService Service to inspect
+ @return Pointer to the parent type, or None if it was not found.
+ """
+ # First, try to walk up the IOService tree to find a parent of this device that is a IOUSBDevice.
+ while IORegistryEntryGetName(device) != parent_type:
+ parent = ctypes.c_void_p()
+ response = iokit.IORegistryEntryGetParentEntry(
+ device,
+ "IOService".encode("mac_roman"),
+ ctypes.byref(parent)
+ )
+
+ # If we weren't able to find a parent for the device, we're done.
+ if response != 0:
+ return None
+
+ device = parent
+
+ return device
+
+def GetIOServicesByType(service_type):
+ """
+ """
+ serial_port_iterator = ctypes.c_void_p()
+
+ response = iokit.IOServiceGetMatchingServices(
+ kIOMasterPortDefault,
+ iokit.IOServiceMatching(service_type),
+ ctypes.byref(serial_port_iterator)
+ )
+
+ services = []
+ while iokit.IOIteratorIsValid(serial_port_iterator):
+ service = iokit.IOIteratorNext(serial_port_iterator)
+ if not service:
+ break
+ services.append(service)
+
+ iokit.IOObjectRelease(serial_port_iterator)
+
+ return services
+
+def comports():
+ # Scan for all iokit serial ports
+ services = GetIOServicesByType('IOSerialBSDClient')
+
+ ports = []
+ for service in services:
+ info = []
+
+ # First, add the callout device file.
+ info.append(get_string_property(service, "IOCalloutDevice"))
+
+ # If the serial port is implemented by a
+ usb_device = GetParentDeviceByType(service, "IOUSBDevice")
+ if usb_device != None:
+ info.append(get_string_property(usb_device, "USB Product Name"))
+
+ info.append(
+ "USB VID:PID=%x:%x SNR=%s"%(
+ get_int_property(usb_device, "idVendor"),
+ get_int_property(usb_device, "idProduct"),
+ get_string_property(usb_device, "USB Serial Number"))
+ )
+ else:
+ info.append('n/a')
+ info.append('n/a')
+
+ ports.append(info)
+
+ return ports
+
+# test
+if __name__ == '__main__':
+ for port, desc, hwid in sorted(comports()):
+ print "%s: %s [%s]" % (port, desc, hwid)
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/list_ports_posix.py b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/list_ports_posix.py
new file mode 100644
index 0000000..09f115f
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/list_ports_posix.py
@@ -0,0 +1,101 @@
+#!/usr/bin/env python
+
+# portable serial port access with python
+
+# This is a module that gathers a list of serial ports on POSIXy systems.
+# For some specific implementations, see also list_ports_linux, list_ports_osx
+#
+# this is a wrapper module for different platform implementations of the
+# port enumeration feature
+#
+# (C) 2011-2013 Chris Liechti <cliechti@gmx.net>
+# this is distributed under a free software license, see license.txt
+
+"""\
+The ``comports`` function is expected to return an iterable that yields tuples
+of 3 strings: port name, human readable description and a hardware ID.
+
+As currently no method is known to get the second two strings easily, they are
+currently just identical to the port name.
+"""
+
+import glob
+import sys
+import os
+
+# try to detect the OS so that a device can be selected...
+plat = sys.platform.lower()
+
+if plat[:5] == 'linux': # Linux (confirmed)
+ from serial.tools.list_ports_linux import comports
+
+elif plat == 'cygwin': # cygwin/win32
+ def comports():
+ devices = glob.glob('/dev/com*')
+ return [(d, d, d) for d in devices]
+
+elif plat[:7] == 'openbsd': # OpenBSD
+ def comports():
+ devices = glob.glob('/dev/cua*')
+ return [(d, d, d) for d in devices]
+
+elif plat[:3] == 'bsd' or \
+ plat[:7] == 'freebsd':
+
+ def comports():
+ devices = glob.glob('/dev/cuad*')
+ return [(d, d, d) for d in devices]
+
+elif plat[:6] == 'darwin': # OS X (confirmed)
+ from serial.tools.list_ports_osx import comports
+
+elif plat[:6] == 'netbsd': # NetBSD
+ def comports():
+ """scan for available ports. return a list of device names."""
+ devices = glob.glob('/dev/dty*')
+ return [(d, d, d) for d in devices]
+
+elif plat[:4] == 'irix': # IRIX
+ def comports():
+ """scan for available ports. return a list of device names."""
+ devices = glob.glob('/dev/ttyf*')
+ return [(d, d, d) for d in devices]
+
+elif plat[:2] == 'hp': # HP-UX (not tested)
+ def comports():
+ """scan for available ports. return a list of device names."""
+ devices = glob.glob('/dev/tty*p0')
+ return [(d, d, d) for d in devices]
+
+elif plat[:5] == 'sunos': # Solaris/SunOS
+ def comports():
+ """scan for available ports. return a list of device names."""
+ devices = glob.glob('/dev/tty*c')
+ return [(d, d, d) for d in devices]
+
+elif plat[:3] == 'aix': # AIX
+ def comports():
+ """scan for available ports. return a list of device names."""
+ devices = glob.glob('/dev/tty*')
+ return [(d, d, d) for d in devices]
+
+else:
+ # platform detection has failed...
+ sys.stderr.write("""\
+don't know how to enumerate ttys on this system.
+! I you know how the serial ports are named send this information to
+! the author of this module:
+
+sys.platform = %r
+os.name = %r
+pySerial version = %s
+
+also add the naming scheme of the serial ports and with a bit luck you can get
+this module running...
+""" % (sys.platform, os.name, serial.VERSION))
+ raise ImportError("Sorry: no implementation for your platform ('%s') available" % (os.name,))
+
+# test
+if __name__ == '__main__':
+ for port, desc, hwid in sorted(comports()):
+ print "%s: %s [%s]" % (port, desc, hwid)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/list_ports_windows.py b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/list_ports_windows.py
new file mode 100644
index 0000000..ca597ca
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/list_ports_windows.py
@@ -0,0 +1,240 @@
+import ctypes
+import re
+
+def ValidHandle(value, func, arguments):
+ if value == 0:
+ raise ctypes.WinError()
+ return value
+
+import serial
+from serial.win32 import ULONG_PTR, is_64bit
+from ctypes.wintypes import HANDLE
+from ctypes.wintypes import BOOL
+from ctypes.wintypes import HWND
+from ctypes.wintypes import DWORD
+from ctypes.wintypes import WORD
+from ctypes.wintypes import LONG
+from ctypes.wintypes import ULONG
+from ctypes.wintypes import LPCSTR
+from ctypes.wintypes import HKEY
+from ctypes.wintypes import BYTE
+
+NULL = 0
+HDEVINFO = ctypes.c_void_p
+PCTSTR = ctypes.c_char_p
+PTSTR = ctypes.c_void_p
+CHAR = ctypes.c_char
+LPDWORD = PDWORD = ctypes.POINTER(DWORD)
+#~ LPBYTE = PBYTE = ctypes.POINTER(BYTE)
+LPBYTE = PBYTE = ctypes.c_void_p # XXX avoids error about types
+
+ACCESS_MASK = DWORD
+REGSAM = ACCESS_MASK
+
+
+def byte_buffer(length):
+ """Get a buffer for a string"""
+ return (BYTE*length)()
+
+def string(buffer):
+ s = []
+ for c in buffer:
+ if c == 0: break
+ s.append(chr(c & 0xff)) # "& 0xff": hack to convert signed to unsigned
+ return ''.join(s)
+
+
+class GUID(ctypes.Structure):
+ _fields_ = [
+ ('Data1', DWORD),
+ ('Data2', WORD),
+ ('Data3', WORD),
+ ('Data4', BYTE*8),
+ ]
+ def __str__(self):
+ return "{%08x-%04x-%04x-%s-%s}" % (
+ self.Data1,
+ self.Data2,
+ self.Data3,
+ ''.join(["%02x" % d for d in self.Data4[:2]]),
+ ''.join(["%02x" % d for d in self.Data4[2:]]),
+ )
+
+class SP_DEVINFO_DATA(ctypes.Structure):
+ _fields_ = [
+ ('cbSize', DWORD),
+ ('ClassGuid', GUID),
+ ('DevInst', DWORD),
+ ('Reserved', ULONG_PTR),
+ ]
+ def __str__(self):
+ return "ClassGuid:%s DevInst:%s" % (self.ClassGuid, self.DevInst)
+PSP_DEVINFO_DATA = ctypes.POINTER(SP_DEVINFO_DATA)
+
+PSP_DEVICE_INTERFACE_DETAIL_DATA = ctypes.c_void_p
+
+setupapi = ctypes.windll.LoadLibrary("setupapi")
+SetupDiDestroyDeviceInfoList = setupapi.SetupDiDestroyDeviceInfoList
+SetupDiDestroyDeviceInfoList.argtypes = [HDEVINFO]
+SetupDiDestroyDeviceInfoList.restype = BOOL
+
+SetupDiClassGuidsFromName = setupapi.SetupDiClassGuidsFromNameA
+SetupDiClassGuidsFromName.argtypes = [PCTSTR, ctypes.POINTER(GUID), DWORD, PDWORD]
+SetupDiClassGuidsFromName.restype = BOOL
+
+SetupDiEnumDeviceInfo = setupapi.SetupDiEnumDeviceInfo
+SetupDiEnumDeviceInfo.argtypes = [HDEVINFO, DWORD, PSP_DEVINFO_DATA]
+SetupDiEnumDeviceInfo.restype = BOOL
+
+SetupDiGetClassDevs = setupapi.SetupDiGetClassDevsA
+SetupDiGetClassDevs.argtypes = [ctypes.POINTER(GUID), PCTSTR, HWND, DWORD]
+SetupDiGetClassDevs.restype = HDEVINFO
+SetupDiGetClassDevs.errcheck = ValidHandle
+
+SetupDiGetDeviceRegistryProperty = setupapi.SetupDiGetDeviceRegistryPropertyA
+SetupDiGetDeviceRegistryProperty.argtypes = [HDEVINFO, PSP_DEVINFO_DATA, DWORD, PDWORD, PBYTE, DWORD, PDWORD]
+SetupDiGetDeviceRegistryProperty.restype = BOOL
+
+SetupDiGetDeviceInstanceId = setupapi.SetupDiGetDeviceInstanceIdA
+SetupDiGetDeviceInstanceId.argtypes = [HDEVINFO, PSP_DEVINFO_DATA, PTSTR, DWORD, PDWORD]
+SetupDiGetDeviceInstanceId.restype = BOOL
+
+SetupDiOpenDevRegKey = setupapi.SetupDiOpenDevRegKey
+SetupDiOpenDevRegKey.argtypes = [HDEVINFO, PSP_DEVINFO_DATA, DWORD, DWORD, DWORD, REGSAM]
+SetupDiOpenDevRegKey.restype = HKEY
+
+advapi32 = ctypes.windll.LoadLibrary("Advapi32")
+RegCloseKey = advapi32.RegCloseKey
+RegCloseKey.argtypes = [HKEY]
+RegCloseKey.restype = LONG
+
+RegQueryValueEx = advapi32.RegQueryValueExA
+RegQueryValueEx.argtypes = [HKEY, LPCSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD]
+RegQueryValueEx.restype = LONG
+
+
+DIGCF_PRESENT = 2
+DIGCF_DEVICEINTERFACE = 16
+INVALID_HANDLE_VALUE = 0
+ERROR_INSUFFICIENT_BUFFER = 122
+SPDRP_HARDWAREID = 1
+SPDRP_FRIENDLYNAME = 12
+DICS_FLAG_GLOBAL = 1
+DIREG_DEV = 0x00000001
+KEY_READ = 0x20019
+
+# workaround for compatibility between Python 2.x and 3.x
+Ports = serial.to_bytes([80, 111, 114, 116, 115]) # "Ports"
+PortName = serial.to_bytes([80, 111, 114, 116, 78, 97, 109, 101]) # "PortName"
+
+def comports():
+ GUIDs = (GUID*8)() # so far only seen one used, so hope 8 are enough...
+ guids_size = DWORD()
+ if not SetupDiClassGuidsFromName(
+ Ports,
+ GUIDs,
+ ctypes.sizeof(GUIDs),
+ ctypes.byref(guids_size)):
+ raise ctypes.WinError()
+
+ # repeat for all possible GUIDs
+ for index in range(guids_size.value):
+ g_hdi = SetupDiGetClassDevs(
+ ctypes.byref(GUIDs[index]),
+ None,
+ NULL,
+ DIGCF_PRESENT) # was DIGCF_PRESENT|DIGCF_DEVICEINTERFACE which misses CDC ports
+
+ devinfo = SP_DEVINFO_DATA()
+ devinfo.cbSize = ctypes.sizeof(devinfo)
+ index = 0
+ while SetupDiEnumDeviceInfo(g_hdi, index, ctypes.byref(devinfo)):
+ index += 1
+
+ # get the real com port name
+ hkey = SetupDiOpenDevRegKey(
+ g_hdi,
+ ctypes.byref(devinfo),
+ DICS_FLAG_GLOBAL,
+ 0,
+ DIREG_DEV, # DIREG_DRV for SW info
+ KEY_READ)
+ port_name_buffer = byte_buffer(250)
+ port_name_length = ULONG(ctypes.sizeof(port_name_buffer))
+ RegQueryValueEx(
+ hkey,
+ PortName,
+ None,
+ None,
+ ctypes.byref(port_name_buffer),
+ ctypes.byref(port_name_length))
+ RegCloseKey(hkey)
+
+ # unfortunately does this method also include parallel ports.
+ # we could check for names starting with COM or just exclude LPT
+ # and hope that other "unknown" names are serial ports...
+ if string(port_name_buffer).startswith('LPT'):
+ continue
+
+ # hardware ID
+ szHardwareID = byte_buffer(250)
+ # try to get ID that includes serial number
+ if not SetupDiGetDeviceInstanceId(
+ g_hdi,
+ ctypes.byref(devinfo),
+ ctypes.byref(szHardwareID),
+ ctypes.sizeof(szHardwareID) - 1,
+ None):
+ # fall back to more generic hardware ID if that would fail
+ if not SetupDiGetDeviceRegistryProperty(
+ g_hdi,
+ ctypes.byref(devinfo),
+ SPDRP_HARDWAREID,
+ None,
+ ctypes.byref(szHardwareID),
+ ctypes.sizeof(szHardwareID) - 1,
+ None):
+ # Ignore ERROR_INSUFFICIENT_BUFFER
+ if ctypes.GetLastError() != ERROR_INSUFFICIENT_BUFFER:
+ raise ctypes.WinError()
+ # stringify
+ szHardwareID_str = string(szHardwareID)
+
+ # in case of USB, make a more readable string, similar to that form
+ # that we also generate on other platforms
+ if szHardwareID_str.startswith('USB'):
+ m = re.search(r'VID_([0-9a-f]{4})&PID_([0-9a-f]{4})(\\(\w+))?', szHardwareID_str, re.I)
+ if m:
+ if m.group(4):
+ szHardwareID_str = 'USB VID:PID=%s:%s SNR=%s' % (m.group(1), m.group(2), m.group(4))
+ else:
+ szHardwareID_str = 'USB VID:PID=%s:%s' % (m.group(1), m.group(2))
+
+ # friendly name
+ szFriendlyName = byte_buffer(250)
+ if not SetupDiGetDeviceRegistryProperty(
+ g_hdi,
+ ctypes.byref(devinfo),
+ SPDRP_FRIENDLYNAME,
+ #~ SPDRP_DEVICEDESC,
+ None,
+ ctypes.byref(szFriendlyName),
+ ctypes.sizeof(szFriendlyName) - 1,
+ None):
+ # Ignore ERROR_INSUFFICIENT_BUFFER
+ #~ if ctypes.GetLastError() != ERROR_INSUFFICIENT_BUFFER:
+ #~ raise IOError("failed to get details for %s (%s)" % (devinfo, szHardwareID.value))
+ # ignore errors and still include the port in the list, friendly name will be same as port name
+ yield string(port_name_buffer), 'n/a', szHardwareID_str
+ else:
+ yield string(port_name_buffer), string(szFriendlyName), szHardwareID_str
+
+ SetupDiDestroyDeviceInfoList(g_hdi)
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# test
+if __name__ == '__main__':
+ import serial
+
+ for port, desc, hwid in sorted(comports()):
+ print "%s: %s [%s]" % (port, desc, hwid)
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/miniterm.py b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/miniterm.py
new file mode 100644
index 0000000..274c7fb
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/tools/miniterm.py
@@ -0,0 +1,694 @@
+#!/usr/bin/env python
+
+# Very simple serial terminal
+# (C)2002-2011 Chris Liechti <cliechti@gmx.net>
+
+# Input characters are sent directly (only LF -> CR/LF/CRLF translation is
+# done), received characters are displayed as is (or escaped trough pythons
+# repr, useful for debug purposes)
+
+
+import sys, os, serial, threading
+try:
+ from serial.tools.list_ports import comports
+except ImportError:
+ comports = None
+
+EXITCHARCTER = serial.to_bytes([0x1d]) # GS/CTRL+]
+MENUCHARACTER = serial.to_bytes([0x14]) # Menu: CTRL+T
+
+DEFAULT_PORT = None
+DEFAULT_BAUDRATE = 9600
+DEFAULT_RTS = None
+DEFAULT_DTR = None
+
+
+def key_description(character):
+ """generate a readable description for a key"""
+ ascii_code = ord(character)
+ if ascii_code < 32:
+ return 'Ctrl+%c' % (ord('@') + ascii_code)
+ else:
+ return repr(character)
+
+
+# help text, starts with blank line! it's a function so that the current values
+# for the shortcut keys is used and not the value at program start
+def get_help_text():
+ return """
+--- pySerial (%(version)s) - miniterm - help
+---
+--- %(exit)-8s Exit program
+--- %(menu)-8s Menu escape key, followed by:
+--- Menu keys:
+--- %(itself)-7s Send the menu character itself to remote
+--- %(exchar)-7s Send the exit character itself to remote
+--- %(info)-7s Show info
+--- %(upload)-7s Upload file (prompt will be shown)
+--- Toggles:
+--- %(rts)-7s RTS %(echo)-7s local echo
+--- %(dtr)-7s DTR %(break)-7s BREAK
+--- %(lfm)-7s line feed %(repr)-7s Cycle repr mode
+---
+--- Port settings (%(menu)s followed by the following):
+--- p change port
+--- 7 8 set data bits
+--- n e o s m change parity (None, Even, Odd, Space, Mark)
+--- 1 2 3 set stop bits (1, 2, 1.5)
+--- b change baud rate
+--- x X disable/enable software flow control
+--- r R disable/enable hardware flow control
+""" % {
+ 'version': getattr(serial, 'VERSION', 'unknown version'),
+ 'exit': key_description(EXITCHARCTER),
+ 'menu': key_description(MENUCHARACTER),
+ 'rts': key_description('\x12'),
+ 'repr': key_description('\x01'),
+ 'dtr': key_description('\x04'),
+ 'lfm': key_description('\x0c'),
+ 'break': key_description('\x02'),
+ 'echo': key_description('\x05'),
+ 'info': key_description('\x09'),
+ 'upload': key_description('\x15'),
+ 'itself': key_description(MENUCHARACTER),
+ 'exchar': key_description(EXITCHARCTER),
+}
+
+if sys.version_info >= (3, 0):
+ def character(b):
+ return b.decode('latin1')
+else:
+ def character(b):
+ return b
+
+LF = serial.to_bytes([10])
+CR = serial.to_bytes([13])
+CRLF = serial.to_bytes([13, 10])
+
+X00 = serial.to_bytes([0])
+X0E = serial.to_bytes([0x0e])
+
+# first choose a platform dependant way to read single characters from the console
+global console
+
+if os.name == 'nt':
+ import msvcrt
+ class Console(object):
+ def __init__(self):
+ pass
+
+ def setup(self):
+ pass # Do nothing for 'nt'
+
+ def cleanup(self):
+ pass # Do nothing for 'nt'
+
+ def getkey(self):
+ while True:
+ z = msvcrt.getch()
+ if z == X00 or z == X0E: # functions keys, ignore
+ msvcrt.getch()
+ else:
+ if z == CR:
+ return LF
+ return z
+
+ console = Console()
+
+elif os.name == 'posix':
+ import termios, sys, os
+ class Console(object):
+ def __init__(self):
+ self.fd = sys.stdin.fileno()
+ self.old = None
+
+ def setup(self):
+ self.old = termios.tcgetattr(self.fd)
+ new = termios.tcgetattr(self.fd)
+ new[3] = new[3] & ~termios.ICANON & ~termios.ECHO & ~termios.ISIG
+ new[6][termios.VMIN] = 1
+ new[6][termios.VTIME] = 0
+ termios.tcsetattr(self.fd, termios.TCSANOW, new)
+
+ def getkey(self):
+ c = os.read(self.fd, 1)
+ return c
+
+ def cleanup(self):
+ if self.old is not None:
+ termios.tcsetattr(self.fd, termios.TCSAFLUSH, self.old)
+
+ console = Console()
+
+ def cleanup_console():
+ console.cleanup()
+
+ sys.exitfunc = cleanup_console # terminal modes have to be restored on exit...
+
+else:
+ raise NotImplementedError("Sorry no implementation for your platform (%s) available." % sys.platform)
+
+
+def dump_port_list():
+ if comports:
+ sys.stderr.write('\n--- Available ports:\n')
+ for port, desc, hwid in sorted(comports()):
+ #~ sys.stderr.write('--- %-20s %s [%s]\n' % (port, desc, hwid))
+ sys.stderr.write('--- %-20s %s\n' % (port, desc))
+
+
+CONVERT_CRLF = 2
+CONVERT_CR = 1
+CONVERT_LF = 0
+NEWLINE_CONVERISON_MAP = (LF, CR, CRLF)
+LF_MODES = ('LF', 'CR', 'CR/LF')
+
+REPR_MODES = ('raw', 'some control', 'all control', 'hex')
+
+class Miniterm(object):
+ def __init__(self, port, baudrate, parity, rtscts, xonxoff, echo=False, convert_outgoing=CONVERT_CRLF, repr_mode=0):
+ try:
+ self.serial = serial.serial_for_url(port, baudrate, parity=parity, rtscts=rtscts, xonxoff=xonxoff, timeout=1)
+ except AttributeError:
+ # happens when the installed pyserial is older than 2.5. use the
+ # Serial class directly then.
+ self.serial = serial.Serial(port, baudrate, parity=parity, rtscts=rtscts, xonxoff=xonxoff, timeout=1)
+ self.echo = echo
+ self.repr_mode = repr_mode
+ self.convert_outgoing = convert_outgoing
+ self.newline = NEWLINE_CONVERISON_MAP[self.convert_outgoing]
+ self.dtr_state = True
+ self.rts_state = True
+ self.break_state = False
+
+ def _start_reader(self):
+ """Start reader thread"""
+ self._reader_alive = True
+ # start serial->console thread
+ self.receiver_thread = threading.Thread(target=self.reader)
+ self.receiver_thread.setDaemon(True)
+ self.receiver_thread.start()
+
+ def _stop_reader(self):
+ """Stop reader thread only, wait for clean exit of thread"""
+ self._reader_alive = False
+ self.receiver_thread.join()
+
+
+ def start(self):
+ self.alive = True
+ self._start_reader()
+ # enter console->serial loop
+ self.transmitter_thread = threading.Thread(target=self.writer)
+ self.transmitter_thread.setDaemon(True)
+ self.transmitter_thread.start()
+
+ def stop(self):
+ self.alive = False
+
+ def join(self, transmit_only=False):
+ self.transmitter_thread.join()
+ if not transmit_only:
+ self.receiver_thread.join()
+
+ def dump_port_settings(self):
+ sys.stderr.write("\n--- Settings: %s %s,%s,%s,%s\n" % (
+ self.serial.portstr,
+ self.serial.baudrate,
+ self.serial.bytesize,
+ self.serial.parity,
+ self.serial.stopbits))
+ sys.stderr.write('--- RTS: %-8s DTR: %-8s BREAK: %-8s\n' % (
+ (self.rts_state and 'active' or 'inactive'),
+ (self.dtr_state and 'active' or 'inactive'),
+ (self.break_state and 'active' or 'inactive')))
+ try:
+ sys.stderr.write('--- CTS: %-8s DSR: %-8s RI: %-8s CD: %-8s\n' % (
+ (self.serial.getCTS() and 'active' or 'inactive'),
+ (self.serial.getDSR() and 'active' or 'inactive'),
+ (self.serial.getRI() and 'active' or 'inactive'),
+ (self.serial.getCD() and 'active' or 'inactive')))
+ except serial.SerialException:
+ # on RFC 2217 ports it can happen to no modem state notification was
+ # yet received. ignore this error.
+ pass
+ sys.stderr.write('--- software flow control: %s\n' % (self.serial.xonxoff and 'active' or 'inactive'))
+ sys.stderr.write('--- hardware flow control: %s\n' % (self.serial.rtscts and 'active' or 'inactive'))
+ sys.stderr.write('--- data escaping: %s linefeed: %s\n' % (
+ REPR_MODES[self.repr_mode],
+ LF_MODES[self.convert_outgoing]))
+
+ def reader(self):
+ """loop and copy serial->console"""
+ try:
+ while self.alive and self._reader_alive:
+ data = character(self.serial.read(1))
+
+ if self.repr_mode == 0:
+ # direct output, just have to care about newline setting
+ if data == '\r' and self.convert_outgoing == CONVERT_CR:
+ sys.stdout.write('\n')
+ else:
+ sys.stdout.write(data)
+ elif self.repr_mode == 1:
+ # escape non-printable, let pass newlines
+ if self.convert_outgoing == CONVERT_CRLF and data in '\r\n':
+ if data == '\n':
+ sys.stdout.write('\n')
+ elif data == '\r':
+ pass
+ elif data == '\n' and self.convert_outgoing == CONVERT_LF:
+ sys.stdout.write('\n')
+ elif data == '\r' and self.convert_outgoing == CONVERT_CR:
+ sys.stdout.write('\n')
+ else:
+ sys.stdout.write(repr(data)[1:-1])
+ elif self.repr_mode == 2:
+ # escape all non-printable, including newline
+ sys.stdout.write(repr(data)[1:-1])
+ elif self.repr_mode == 3:
+ # escape everything (hexdump)
+ for c in data:
+ sys.stdout.write("%s " % c.encode('hex'))
+ sys.stdout.flush()
+ except serial.SerialException, e:
+ self.alive = False
+ # would be nice if the console reader could be interruptted at this
+ # point...
+ raise
+
+
+ def writer(self):
+ """\
+ Loop and copy console->serial until EXITCHARCTER character is
+ found. When MENUCHARACTER is found, interpret the next key
+ locally.
+ """
+ menu_active = False
+ try:
+ while self.alive:
+ try:
+ b = console.getkey()
+ except KeyboardInterrupt:
+ b = serial.to_bytes([3])
+ c = character(b)
+ if menu_active:
+ if c == MENUCHARACTER or c == EXITCHARCTER: # Menu character again/exit char -> send itself
+ self.serial.write(b) # send character
+ if self.echo:
+ sys.stdout.write(c)
+ elif c == '\x15': # CTRL+U -> upload file
+ sys.stderr.write('\n--- File to upload: ')
+ sys.stderr.flush()
+ console.cleanup()
+ filename = sys.stdin.readline().rstrip('\r\n')
+ if filename:
+ try:
+ file = open(filename, 'r')
+ sys.stderr.write('--- Sending file %s ---\n' % filename)
+ while True:
+ line = file.readline().rstrip('\r\n')
+ if not line:
+ break
+ self.serial.write(line)
+ self.serial.write('\r\n')
+ # Wait for output buffer to drain.
+ self.serial.flush()
+ sys.stderr.write('.') # Progress indicator.
+ sys.stderr.write('\n--- File %s sent ---\n' % filename)
+ except IOError, e:
+ sys.stderr.write('--- ERROR opening file %s: %s ---\n' % (filename, e))
+ console.setup()
+ elif c in '\x08hH?': # CTRL+H, h, H, ? -> Show help
+ sys.stderr.write(get_help_text())
+ elif c == '\x12': # CTRL+R -> Toggle RTS
+ self.rts_state = not self.rts_state
+ self.serial.setRTS(self.rts_state)
+ sys.stderr.write('--- RTS %s ---\n' % (self.rts_state and 'active' or 'inactive'))
+ elif c == '\x04': # CTRL+D -> Toggle DTR
+ self.dtr_state = not self.dtr_state
+ self.serial.setDTR(self.dtr_state)
+ sys.stderr.write('--- DTR %s ---\n' % (self.dtr_state and 'active' or 'inactive'))
+ elif c == '\x02': # CTRL+B -> toggle BREAK condition
+ self.break_state = not self.break_state
+ self.serial.setBreak(self.break_state)
+ sys.stderr.write('--- BREAK %s ---\n' % (self.break_state and 'active' or 'inactive'))
+ elif c == '\x05': # CTRL+E -> toggle local echo
+ self.echo = not self.echo
+ sys.stderr.write('--- local echo %s ---\n' % (self.echo and 'active' or 'inactive'))
+ elif c == '\x09': # CTRL+I -> info
+ self.dump_port_settings()
+ elif c == '\x01': # CTRL+A -> cycle escape mode
+ self.repr_mode += 1
+ if self.repr_mode > 3:
+ self.repr_mode = 0
+ sys.stderr.write('--- escape data: %s ---\n' % (
+ REPR_MODES[self.repr_mode],
+ ))
+ elif c == '\x0c': # CTRL+L -> cycle linefeed mode
+ self.convert_outgoing += 1
+ if self.convert_outgoing > 2:
+ self.convert_outgoing = 0
+ self.newline = NEWLINE_CONVERISON_MAP[self.convert_outgoing]
+ sys.stderr.write('--- line feed %s ---\n' % (
+ LF_MODES[self.convert_outgoing],
+ ))
+ elif c in 'pP': # P -> change port
+ dump_port_list()
+ sys.stderr.write('--- Enter port name: ')
+ sys.stderr.flush()
+ console.cleanup()
+ try:
+ port = sys.stdin.readline().strip()
+ except KeyboardInterrupt:
+ port = None
+ console.setup()
+ if port and port != self.serial.port:
+ # reader thread needs to be shut down
+ self._stop_reader()
+ # save settings
+ settings = self.serial.getSettingsDict()
+ try:
+ try:
+ new_serial = serial.serial_for_url(port, do_not_open=True)
+ except AttributeError:
+ # happens when the installed pyserial is older than 2.5. use the
+ # Serial class directly then.
+ new_serial = serial.Serial()
+ new_serial.port = port
+ # restore settings and open
+ new_serial.applySettingsDict(settings)
+ new_serial.open()
+ new_serial.setRTS(self.rts_state)
+ new_serial.setDTR(self.dtr_state)
+ new_serial.setBreak(self.break_state)
+ except Exception, e:
+ sys.stderr.write('--- ERROR opening new port: %s ---\n' % (e,))
+ new_serial.close()
+ else:
+ self.serial.close()
+ self.serial = new_serial
+ sys.stderr.write('--- Port changed to: %s ---\n' % (self.serial.port,))
+ # and restart the reader thread
+ self._start_reader()
+ elif c in 'bB': # B -> change baudrate
+ sys.stderr.write('\n--- Baudrate: ')
+ sys.stderr.flush()
+ console.cleanup()
+ backup = self.serial.baudrate
+ try:
+ self.serial.baudrate = int(sys.stdin.readline().strip())
+ except ValueError, e:
+ sys.stderr.write('--- ERROR setting baudrate: %s ---\n' % (e,))
+ self.serial.baudrate = backup
+ else:
+ self.dump_port_settings()
+ console.setup()
+ elif c == '8': # 8 -> change to 8 bits
+ self.serial.bytesize = serial.EIGHTBITS
+ self.dump_port_settings()
+ elif c == '7': # 7 -> change to 8 bits
+ self.serial.bytesize = serial.SEVENBITS
+ self.dump_port_settings()
+ elif c in 'eE': # E -> change to even parity
+ self.serial.parity = serial.PARITY_EVEN
+ self.dump_port_settings()
+ elif c in 'oO': # O -> change to odd parity
+ self.serial.parity = serial.PARITY_ODD
+ self.dump_port_settings()
+ elif c in 'mM': # M -> change to mark parity
+ self.serial.parity = serial.PARITY_MARK
+ self.dump_port_settings()
+ elif c in 'sS': # S -> change to space parity
+ self.serial.parity = serial.PARITY_SPACE
+ self.dump_port_settings()
+ elif c in 'nN': # N -> change to no parity
+ self.serial.parity = serial.PARITY_NONE
+ self.dump_port_settings()
+ elif c == '1': # 1 -> change to 1 stop bits
+ self.serial.stopbits = serial.STOPBITS_ONE
+ self.dump_port_settings()
+ elif c == '2': # 2 -> change to 2 stop bits
+ self.serial.stopbits = serial.STOPBITS_TWO
+ self.dump_port_settings()
+ elif c == '3': # 3 -> change to 1.5 stop bits
+ self.serial.stopbits = serial.STOPBITS_ONE_POINT_FIVE
+ self.dump_port_settings()
+ elif c in 'xX': # X -> change software flow control
+ self.serial.xonxoff = (c == 'X')
+ self.dump_port_settings()
+ elif c in 'rR': # R -> change hardware flow control
+ self.serial.rtscts = (c == 'R')
+ self.dump_port_settings()
+ else:
+ sys.stderr.write('--- unknown menu character %s --\n' % key_description(c))
+ menu_active = False
+ elif c == MENUCHARACTER: # next char will be for menu
+ menu_active = True
+ elif c == EXITCHARCTER:
+ self.stop()
+ break # exit app
+ elif c == '\n':
+ self.serial.write(self.newline) # send newline character(s)
+ if self.echo:
+ sys.stdout.write(c) # local echo is a real newline in any case
+ sys.stdout.flush()
+ else:
+ self.serial.write(b) # send byte
+ if self.echo:
+ sys.stdout.write(c)
+ sys.stdout.flush()
+ except:
+ self.alive = False
+ raise
+
+def main():
+ import optparse
+
+ parser = optparse.OptionParser(
+ usage = "%prog [options] [port [baudrate]]",
+ description = "Miniterm - A simple terminal program for the serial port."
+ )
+
+ group = optparse.OptionGroup(parser, "Port settings")
+
+ group.add_option("-p", "--port",
+ dest = "port",
+ help = "port, a number or a device name. (deprecated option, use parameter instead)",
+ default = DEFAULT_PORT
+ )
+
+ group.add_option("-b", "--baud",
+ dest = "baudrate",
+ action = "store",
+ type = 'int',
+ help = "set baud rate, default %default",
+ default = DEFAULT_BAUDRATE
+ )
+
+ group.add_option("--parity",
+ dest = "parity",
+ action = "store",
+ help = "set parity, one of [N, E, O, S, M], default=N",
+ default = 'N'
+ )
+
+ group.add_option("--rtscts",
+ dest = "rtscts",
+ action = "store_true",
+ help = "enable RTS/CTS flow control (default off)",
+ default = False
+ )
+
+ group.add_option("--xonxoff",
+ dest = "xonxoff",
+ action = "store_true",
+ help = "enable software flow control (default off)",
+ default = False
+ )
+
+ group.add_option("--rts",
+ dest = "rts_state",
+ action = "store",
+ type = 'int',
+ help = "set initial RTS line state (possible values: 0, 1)",
+ default = DEFAULT_RTS
+ )
+
+ group.add_option("--dtr",
+ dest = "dtr_state",
+ action = "store",
+ type = 'int',
+ help = "set initial DTR line state (possible values: 0, 1)",
+ default = DEFAULT_DTR
+ )
+
+ parser.add_option_group(group)
+
+ group = optparse.OptionGroup(parser, "Data handling")
+
+ group.add_option("-e", "--echo",
+ dest = "echo",
+ action = "store_true",
+ help = "enable local echo (default off)",
+ default = False
+ )
+
+ group.add_option("--cr",
+ dest = "cr",
+ action = "store_true",
+ help = "do not send CR+LF, send CR only",
+ default = False
+ )
+
+ group.add_option("--lf",
+ dest = "lf",
+ action = "store_true",
+ help = "do not send CR+LF, send LF only",
+ default = False
+ )
+
+ group.add_option("-D", "--debug",
+ dest = "repr_mode",
+ action = "count",
+ help = """debug received data (escape non-printable chars)
+--debug can be given multiple times:
+0: just print what is received
+1: escape non-printable characters, do newlines as unusual
+2: escape non-printable characters, newlines too
+3: hex dump everything""",
+ default = 0
+ )
+
+ parser.add_option_group(group)
+
+
+ group = optparse.OptionGroup(parser, "Hotkeys")
+
+ group.add_option("--exit-char",
+ dest = "exit_char",
+ action = "store",
+ type = 'int',
+ help = "ASCII code of special character that is used to exit the application",
+ default = 0x1d
+ )
+
+ group.add_option("--menu-char",
+ dest = "menu_char",
+ action = "store",
+ type = 'int',
+ help = "ASCII code of special character that is used to control miniterm (menu)",
+ default = 0x14
+ )
+
+ parser.add_option_group(group)
+
+ group = optparse.OptionGroup(parser, "Diagnostics")
+
+ group.add_option("-q", "--quiet",
+ dest = "quiet",
+ action = "store_true",
+ help = "suppress non-error messages",
+ default = False
+ )
+
+ parser.add_option_group(group)
+
+
+ (options, args) = parser.parse_args()
+
+ options.parity = options.parity.upper()
+ if options.parity not in 'NEOSM':
+ parser.error("invalid parity")
+
+ if options.cr and options.lf:
+ parser.error("only one of --cr or --lf can be specified")
+
+ if options.menu_char == options.exit_char:
+ parser.error('--exit-char can not be the same as --menu-char')
+
+ global EXITCHARCTER, MENUCHARACTER
+ EXITCHARCTER = chr(options.exit_char)
+ MENUCHARACTER = chr(options.menu_char)
+
+ port = options.port
+ baudrate = options.baudrate
+ if args:
+ if options.port is not None:
+ parser.error("no arguments are allowed, options only when --port is given")
+ port = args.pop(0)
+ if args:
+ try:
+ baudrate = int(args[0])
+ except ValueError:
+ parser.error("baud rate must be a number, not %r" % args[0])
+ args.pop(0)
+ if args:
+ parser.error("too many arguments")
+ else:
+ # noport given on command line -> ask user now
+ if port is None:
+ dump_port_list()
+ port = raw_input('Enter port name:')
+
+ convert_outgoing = CONVERT_CRLF
+ if options.cr:
+ convert_outgoing = CONVERT_CR
+ elif options.lf:
+ convert_outgoing = CONVERT_LF
+
+ try:
+ miniterm = Miniterm(
+ port,
+ baudrate,
+ options.parity,
+ rtscts=options.rtscts,
+ xonxoff=options.xonxoff,
+ echo=options.echo,
+ convert_outgoing=convert_outgoing,
+ repr_mode=options.repr_mode,
+ )
+ except serial.SerialException, e:
+ sys.stderr.write("could not open port %r: %s\n" % (port, e))
+ sys.exit(1)
+
+ if not options.quiet:
+ sys.stderr.write('--- Miniterm on %s: %d,%s,%s,%s ---\n' % (
+ miniterm.serial.portstr,
+ miniterm.serial.baudrate,
+ miniterm.serial.bytesize,
+ miniterm.serial.parity,
+ miniterm.serial.stopbits,
+ ))
+ sys.stderr.write('--- Quit: %s | Menu: %s | Help: %s followed by %s ---\n' % (
+ key_description(EXITCHARCTER),
+ key_description(MENUCHARACTER),
+ key_description(MENUCHARACTER),
+ key_description('\x08'),
+ ))
+
+ if options.dtr_state is not None:
+ if not options.quiet:
+ sys.stderr.write('--- forcing DTR %s\n' % (options.dtr_state and 'active' or 'inactive'))
+ miniterm.serial.setDTR(options.dtr_state)
+ miniterm.dtr_state = options.dtr_state
+ if options.rts_state is not None:
+ if not options.quiet:
+ sys.stderr.write('--- forcing RTS %s\n' % (options.rts_state and 'active' or 'inactive'))
+ miniterm.serial.setRTS(options.rts_state)
+ miniterm.rts_state = options.rts_state
+
+ console.setup()
+ miniterm.start()
+ try:
+ miniterm.join(True)
+ except KeyboardInterrupt:
+ pass
+ if not options.quiet:
+ sys.stderr.write("\n--- exit ---\n")
+ miniterm.join()
+ #~ console.cleanup()
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+if __name__ == '__main__':
+ main()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/urlhandler/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/urlhandler/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/urlhandler/__init__.py
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_hwgrep.py b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_hwgrep.py
new file mode 100644
index 0000000..62cda43
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_hwgrep.py
@@ -0,0 +1,45 @@
+#! python
+#
+# Python Serial Port Extension for Win32, Linux, BSD, Jython
+# see __init__.py
+#
+# This module implements a special URL handler that uses the port listing to
+# find ports by searching the string descriptions.
+#
+# (C) 2011 Chris Liechti <cliechti@gmx.net>
+# this is distributed under a free software license, see license.txt
+#
+# URL format: hwgrep://regexp
+
+import serial
+import serial.tools.list_ports
+
+class Serial(serial.Serial):
+ """Just inherit the native Serial port implementation and patch the open function."""
+
+ def setPort(self, value):
+ """translate port name before storing it"""
+ if isinstance(value, basestring) and value.startswith('hwgrep://'):
+ serial.Serial.setPort(self, self.fromURL(value))
+ else:
+ serial.Serial.setPort(self, value)
+
+ def fromURL(self, url):
+ """extract host and port from an URL string"""
+ if url.lower().startswith("hwgrep://"): url = url[9:]
+ # use a for loop to get the 1st element from the generator
+ for port, desc, hwid in serial.tools.list_ports.grep(url):
+ return port
+ else:
+ raise serial.SerialException('no ports found matching regexp %r' % (url,))
+
+ # override property
+ port = property(serial.Serial.getPort, setPort, doc="Port setting")
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+if __name__ == '__main__':
+ #~ s = Serial('hwgrep://ttyS0')
+ s = Serial(None)
+ s.port = 'hwgrep://ttyS0'
+ print s
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_loop.py b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_loop.py
new file mode 100644
index 0000000..7da94ad
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_loop.py
@@ -0,0 +1,265 @@
+#! python
+#
+# Python Serial Port Extension for Win32, Linux, BSD, Jython
+# see __init__.py
+#
+# This module implements a loop back connection receiving itself what it sent.
+#
+# The purpose of this module is.. well... You can run the unit tests with it.
+# and it was so easy to implement ;-)
+#
+# (C) 2001-2011 Chris Liechti <cliechti@gmx.net>
+# this is distributed under a free software license, see license.txt
+#
+# URL format: loop://[option[/option...]]
+# options:
+# - "debug" print diagnostic messages
+
+from serial.serialutil import *
+import threading
+import time
+import logging
+
+# map log level names to constants. used in fromURL()
+LOGGER_LEVELS = {
+ 'debug': logging.DEBUG,
+ 'info': logging.INFO,
+ 'warning': logging.WARNING,
+ 'error': logging.ERROR,
+ }
+
+
+class LoopbackSerial(SerialBase):
+ """Serial port implementation that simulates a loop back connection in plain software."""
+
+ BAUDRATES = (50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
+ 9600, 19200, 38400, 57600, 115200)
+
+ def open(self):
+ """Open port with current settings. This may throw a SerialException
+ if the port cannot be opened."""
+ if self._isOpen:
+ raise SerialException("Port is already open.")
+ self.logger = None
+ self.buffer_lock = threading.Lock()
+ self.loop_buffer = bytearray()
+ self.cts = False
+ self.dsr = False
+
+ if self._port is None:
+ raise SerialException("Port must be configured before it can be used.")
+ # not that there is anything to open, but the function applies the
+ # options found in the URL
+ self.fromURL(self.port)
+
+ # not that there anything to configure...
+ self._reconfigurePort()
+ # all things set up get, now a clean start
+ self._isOpen = True
+ if not self._rtscts:
+ self.setRTS(True)
+ self.setDTR(True)
+ self.flushInput()
+ self.flushOutput()
+
+ def _reconfigurePort(self):
+ """Set communication parameters on opened port. for the loop://
+ protocol all settings are ignored!"""
+ # not that's it of any real use, but it helps in the unit tests
+ if not isinstance(self._baudrate, (int, long)) or not 0 < self._baudrate < 2**32:
+ raise ValueError("invalid baudrate: %r" % (self._baudrate))
+ if self.logger:
+ self.logger.info('_reconfigurePort()')
+
+ def close(self):
+ """Close port"""
+ if self._isOpen:
+ self._isOpen = False
+ # in case of quick reconnects, give the server some time
+ time.sleep(0.3)
+
+ def makeDeviceName(self, port):
+ raise SerialException("there is no sensible way to turn numbers into URLs")
+
+ def fromURL(self, url):
+ """extract host and port from an URL string"""
+ if url.lower().startswith("loop://"): url = url[7:]
+ try:
+ # process options now, directly altering self
+ for option in url.split('/'):
+ if '=' in option:
+ option, value = option.split('=', 1)
+ else:
+ value = None
+ if not option:
+ pass
+ elif option == 'logging':
+ logging.basicConfig() # XXX is that good to call it here?
+ self.logger = logging.getLogger('pySerial.loop')
+ self.logger.setLevel(LOGGER_LEVELS[value])
+ self.logger.debug('enabled logging')
+ else:
+ raise ValueError('unknown option: %r' % (option,))
+ except ValueError, e:
+ raise SerialException('expected a string in the form "[loop://][option[/option...]]": %s' % e)
+
+ # - - - - - - - - - - - - - - - - - - - - - - - -
+
+ def inWaiting(self):
+ """Return the number of characters currently in the input buffer."""
+ if not self._isOpen: raise portNotOpenError
+ if self.logger:
+ # attention the logged value can differ from return value in
+ # threaded environments...
+ self.logger.debug('inWaiting() -> %d' % (len(self.loop_buffer),))
+ return len(self.loop_buffer)
+
+ def read(self, size=1):
+ """Read size bytes from the serial port. If a timeout is set it may
+ return less characters as requested. With no timeout it will block
+ until the requested number of bytes is read."""
+ if not self._isOpen: raise portNotOpenError
+ if self._timeout is not None:
+ timeout = time.time() + self._timeout
+ else:
+ timeout = None
+ data = bytearray()
+ while size > 0:
+ self.buffer_lock.acquire()
+ try:
+ block = to_bytes(self.loop_buffer[:size])
+ del self.loop_buffer[:size]
+ finally:
+ self.buffer_lock.release()
+ data += block
+ size -= len(block)
+ # check for timeout now, after data has been read.
+ # useful for timeout = 0 (non blocking) read
+ if timeout and time.time() > timeout:
+ break
+ return bytes(data)
+
+ def write(self, data):
+ """Output the given string over the serial port. Can block if the
+ connection is blocked. May raise SerialException if the connection is
+ closed."""
+ if not self._isOpen: raise portNotOpenError
+ # ensure we're working with bytes
+ data = to_bytes(data)
+ # calculate aprox time that would be used to send the data
+ time_used_to_send = 10.0*len(data) / self._baudrate
+ # when a write timeout is configured check if we would be successful
+ # (not sending anything, not even the part that would have time)
+ if self._writeTimeout is not None and time_used_to_send > self._writeTimeout:
+ time.sleep(self._writeTimeout) # must wait so that unit test succeeds
+ raise writeTimeoutError
+ self.buffer_lock.acquire()
+ try:
+ self.loop_buffer += data
+ finally:
+ self.buffer_lock.release()
+ return len(data)
+
+ def flushInput(self):
+ """Clear input buffer, discarding all that is in the buffer."""
+ if not self._isOpen: raise portNotOpenError
+ if self.logger:
+ self.logger.info('flushInput()')
+ self.buffer_lock.acquire()
+ try:
+ del self.loop_buffer[:]
+ finally:
+ self.buffer_lock.release()
+
+ def flushOutput(self):
+ """Clear output buffer, aborting the current output and
+ discarding all that is in the buffer."""
+ if not self._isOpen: raise portNotOpenError
+ if self.logger:
+ self.logger.info('flushOutput()')
+
+ def sendBreak(self, duration=0.25):
+ """Send break condition. Timed, returns to idle state after given
+ duration."""
+ if not self._isOpen: raise portNotOpenError
+
+ def setBreak(self, level=True):
+ """Set break: Controls TXD. When active, to transmitting is
+ possible."""
+ if not self._isOpen: raise portNotOpenError
+ if self.logger:
+ self.logger.info('setBreak(%r)' % (level,))
+
+ def setRTS(self, level=True):
+ """Set terminal status line: Request To Send"""
+ if not self._isOpen: raise portNotOpenError
+ if self.logger:
+ self.logger.info('setRTS(%r) -> state of CTS' % (level,))
+ self.cts = level
+
+ def setDTR(self, level=True):
+ """Set terminal status line: Data Terminal Ready"""
+ if not self._isOpen: raise portNotOpenError
+ if self.logger:
+ self.logger.info('setDTR(%r) -> state of DSR' % (level,))
+ self.dsr = level
+
+ def getCTS(self):
+ """Read terminal status line: Clear To Send"""
+ if not self._isOpen: raise portNotOpenError
+ if self.logger:
+ self.logger.info('getCTS() -> state of RTS (%r)' % (self.cts,))
+ return self.cts
+
+ def getDSR(self):
+ """Read terminal status line: Data Set Ready"""
+ if not self._isOpen: raise portNotOpenError
+ if self.logger:
+ self.logger.info('getDSR() -> state of DTR (%r)' % (self.dsr,))
+ return self.dsr
+
+ def getRI(self):
+ """Read terminal status line: Ring Indicator"""
+ if not self._isOpen: raise portNotOpenError
+ if self.logger:
+ self.logger.info('returning dummy for getRI()')
+ return False
+
+ def getCD(self):
+ """Read terminal status line: Carrier Detect"""
+ if not self._isOpen: raise portNotOpenError
+ if self.logger:
+ self.logger.info('returning dummy for getCD()')
+ return True
+
+ # - - - platform specific - - -
+ # None so far
+
+
+# assemble Serial class with the platform specific implementation and the base
+# for file-like behavior. for Python 2.6 and newer, that provide the new I/O
+# library, derive from io.RawIOBase
+try:
+ import io
+except ImportError:
+ # classic version with our own file-like emulation
+ class Serial(LoopbackSerial, FileLike):
+ pass
+else:
+ # io library present
+ class Serial(LoopbackSerial, io.RawIOBase):
+ pass
+
+
+# simple client test
+if __name__ == '__main__':
+ import sys
+ s = Serial('loop://')
+ sys.stdout.write('%s\n' % s)
+
+ sys.stdout.write("write...\n")
+ s.write("hello\n")
+ s.flush()
+ sys.stdout.write("read: %s\n" % s.read(5))
+
+ s.close()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_rfc2217.py b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_rfc2217.py
new file mode 100644
index 0000000..981ba45
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_rfc2217.py
@@ -0,0 +1,11 @@
+#! python
+#
+# Python Serial Port Extension for Win32, Linux, BSD, Jython
+# see ../__init__.py
+#
+# This is a thin wrapper to load the rfc2271 implementation.
+#
+# (C) 2011 Chris Liechti <cliechti@gmx.net>
+# this is distributed under a free software license, see license.txt
+
+from serial.rfc2217 import Serial
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_socket.py b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_socket.py
new file mode 100644
index 0000000..c90a8e4
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/urlhandler/protocol_socket.py
@@ -0,0 +1,274 @@
+#! python
+#
+# Python Serial Port Extension for Win32, Linux, BSD, Jython
+# see __init__.py
+#
+# This module implements a simple socket based client.
+# It does not support changing any port parameters and will silently ignore any
+# requests to do so.
+#
+# The purpose of this module is that applications using pySerial can connect to
+# TCP/IP to serial port converters that do not support RFC 2217.
+#
+# (C) 2001-2011 Chris Liechti <cliechti@gmx.net>
+# this is distributed under a free software license, see license.txt
+#
+# URL format: socket://<host>:<port>[/option[/option...]]
+# options:
+# - "debug" print diagnostic messages
+
+from serial.serialutil import *
+import time
+import socket
+import logging
+
+# map log level names to constants. used in fromURL()
+LOGGER_LEVELS = {
+ 'debug': logging.DEBUG,
+ 'info': logging.INFO,
+ 'warning': logging.WARNING,
+ 'error': logging.ERROR,
+ }
+
+POLL_TIMEOUT = 2
+
+class SocketSerial(SerialBase):
+ """Serial port implementation for plain sockets."""
+
+ BAUDRATES = (50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800,
+ 9600, 19200, 38400, 57600, 115200)
+
+ def open(self):
+ """Open port with current settings. This may throw a SerialException
+ if the port cannot be opened."""
+ self.logger = None
+ if self._port is None:
+ raise SerialException("Port must be configured before it can be used.")
+ if self._isOpen:
+ raise SerialException("Port is already open.")
+ try:
+ # XXX in future replace with create_connection (py >=2.6)
+ self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ self._socket.connect(self.fromURL(self.portstr))
+ except Exception, msg:
+ self._socket = None
+ raise SerialException("Could not open port %s: %s" % (self.portstr, msg))
+
+ self._socket.settimeout(POLL_TIMEOUT) # used for write timeout support :/
+
+ # not that there anything to configure...
+ self._reconfigurePort()
+ # all things set up get, now a clean start
+ self._isOpen = True
+ if not self._rtscts:
+ self.setRTS(True)
+ self.setDTR(True)
+ self.flushInput()
+ self.flushOutput()
+
+ def _reconfigurePort(self):
+ """Set communication parameters on opened port. for the socket://
+ protocol all settings are ignored!"""
+ if self._socket is None:
+ raise SerialException("Can only operate on open ports")
+ if self.logger:
+ self.logger.info('ignored port configuration change')
+
+ def close(self):
+ """Close port"""
+ if self._isOpen:
+ if self._socket:
+ try:
+ self._socket.shutdown(socket.SHUT_RDWR)
+ self._socket.close()
+ except:
+ # ignore errors.
+ pass
+ self._socket = None
+ self._isOpen = False
+ # in case of quick reconnects, give the server some time
+ time.sleep(0.3)
+
+ def makeDeviceName(self, port):
+ raise SerialException("there is no sensible way to turn numbers into URLs")
+
+ def fromURL(self, url):
+ """extract host and port from an URL string"""
+ if url.lower().startswith("socket://"): url = url[9:]
+ try:
+ # is there a "path" (our options)?
+ if '/' in url:
+ # cut away options
+ url, options = url.split('/', 1)
+ # process options now, directly altering self
+ for option in options.split('/'):
+ if '=' in option:
+ option, value = option.split('=', 1)
+ else:
+ value = None
+ if option == 'logging':
+ logging.basicConfig() # XXX is that good to call it here?
+ self.logger = logging.getLogger('pySerial.socket')
+ self.logger.setLevel(LOGGER_LEVELS[value])
+ self.logger.debug('enabled logging')
+ else:
+ raise ValueError('unknown option: %r' % (option,))
+ # get host and port
+ host, port = url.split(':', 1) # may raise ValueError because of unpacking
+ port = int(port) # and this if it's not a number
+ if not 0 <= port < 65536: raise ValueError("port not in range 0...65535")
+ except ValueError, e:
+ raise SerialException('expected a string in the form "[rfc2217://]<host>:<port>[/option[/option...]]": %s' % e)
+ return (host, port)
+
+ # - - - - - - - - - - - - - - - - - - - - - - - -
+
+ def inWaiting(self):
+ """Return the number of characters currently in the input buffer."""
+ if not self._isOpen: raise portNotOpenError
+ if self.logger:
+ # set this one to debug as the function could be called often...
+ self.logger.debug('WARNING: inWaiting returns dummy value')
+ return 0 # hmmm, see comment in read()
+
+ def read(self, size=1):
+ """Read size bytes from the serial port. If a timeout is set it may
+ return less characters as requested. With no timeout it will block
+ until the requested number of bytes is read."""
+ if not self._isOpen: raise portNotOpenError
+ data = bytearray()
+ if self._timeout is not None:
+ timeout = time.time() + self._timeout
+ else:
+ timeout = None
+ while len(data) < size and (timeout is None or time.time() < timeout):
+ try:
+ # an implementation with internal buffer would be better
+ # performing...
+ t = time.time()
+ block = self._socket.recv(size - len(data))
+ duration = time.time() - t
+ if block:
+ data.extend(block)
+ else:
+ # no data -> EOF (connection probably closed)
+ break
+ except socket.timeout:
+ # just need to get out of recv from time to time to check if
+ # still alive
+ continue
+ except socket.error, e:
+ # connection fails -> terminate loop
+ raise SerialException('connection failed (%s)' % e)
+ return bytes(data)
+
+ def write(self, data):
+ """Output the given string over the serial port. Can block if the
+ connection is blocked. May raise SerialException if the connection is
+ closed."""
+ if not self._isOpen: raise portNotOpenError
+ try:
+ self._socket.sendall(to_bytes(data))
+ except socket.error, e:
+ # XXX what exception if socket connection fails
+ raise SerialException("socket connection failed: %s" % e)
+ return len(data)
+
+ def flushInput(self):
+ """Clear input buffer, discarding all that is in the buffer."""
+ if not self._isOpen: raise portNotOpenError
+ if self.logger:
+ self.logger.info('ignored flushInput')
+
+ def flushOutput(self):
+ """Clear output buffer, aborting the current output and
+ discarding all that is in the buffer."""
+ if not self._isOpen: raise portNotOpenError
+ if self.logger:
+ self.logger.info('ignored flushOutput')
+
+ def sendBreak(self, duration=0.25):
+ """Send break condition. Timed, returns to idle state after given
+ duration."""
+ if not self._isOpen: raise portNotOpenError
+ if self.logger:
+ self.logger.info('ignored sendBreak(%r)' % (duration,))
+
+ def setBreak(self, level=True):
+ """Set break: Controls TXD. When active, to transmitting is
+ possible."""
+ if not self._isOpen: raise portNotOpenError
+ if self.logger:
+ self.logger.info('ignored setBreak(%r)' % (level,))
+
+ def setRTS(self, level=True):
+ """Set terminal status line: Request To Send"""
+ if not self._isOpen: raise portNotOpenError
+ if self.logger:
+ self.logger.info('ignored setRTS(%r)' % (level,))
+
+ def setDTR(self, level=True):
+ """Set terminal status line: Data Terminal Ready"""
+ if not self._isOpen: raise portNotOpenError
+ if self.logger:
+ self.logger.info('ignored setDTR(%r)' % (level,))
+
+ def getCTS(self):
+ """Read terminal status line: Clear To Send"""
+ if not self._isOpen: raise portNotOpenError
+ if self.logger:
+ self.logger.info('returning dummy for getCTS()')
+ return True
+
+ def getDSR(self):
+ """Read terminal status line: Data Set Ready"""
+ if not self._isOpen: raise portNotOpenError
+ if self.logger:
+ self.logger.info('returning dummy for getDSR()')
+ return True
+
+ def getRI(self):
+ """Read terminal status line: Ring Indicator"""
+ if not self._isOpen: raise portNotOpenError
+ if self.logger:
+ self.logger.info('returning dummy for getRI()')
+ return False
+
+ def getCD(self):
+ """Read terminal status line: Carrier Detect"""
+ if not self._isOpen: raise portNotOpenError
+ if self.logger:
+ self.logger.info('returning dummy for getCD()')
+ return True
+
+ # - - - platform specific - - -
+ # None so far
+
+
+# assemble Serial class with the platform specific implementation and the base
+# for file-like behavior. for Python 2.6 and newer, that provide the new I/O
+# library, derive from io.RawIOBase
+try:
+ import io
+except ImportError:
+ # classic version with our own file-like emulation
+ class Serial(SocketSerial, FileLike):
+ pass
+else:
+ # io library present
+ class Serial(SocketSerial, io.RawIOBase):
+ pass
+
+
+# simple client test
+if __name__ == '__main__':
+ import sys
+ s = Serial('socket://localhost:7000')
+ sys.stdout.write('%s\n' % s)
+
+ sys.stdout.write("write...\n")
+ s.write("hello\n")
+ s.flush()
+ sys.stdout.write("read: %s\n" % s.read(5))
+
+ s.close()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/win32.py b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/win32.py
new file mode 100644
index 0000000..61b3d7a
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/pyserial/serial/win32.py
@@ -0,0 +1,320 @@
+from ctypes import *
+from ctypes.wintypes import HANDLE
+from ctypes.wintypes import BOOL
+from ctypes.wintypes import LPCWSTR
+_stdcall_libraries = {}
+_stdcall_libraries['kernel32'] = WinDLL('kernel32')
+from ctypes.wintypes import DWORD
+from ctypes.wintypes import WORD
+from ctypes.wintypes import BYTE
+
+INVALID_HANDLE_VALUE = HANDLE(-1).value
+
+# some details of the windows API differ between 32 and 64 bit systems..
+def is_64bit():
+ """Returns true when running on a 64 bit system"""
+ return sizeof(c_ulong) != sizeof(c_void_p)
+
+# ULONG_PTR is a an ordinary number, not a pointer and contrary to the name it
+# is either 32 or 64 bits, depending on the type of windows...
+# so test if this a 32 bit windows...
+if is_64bit():
+ # assume 64 bits
+ ULONG_PTR = c_int64
+else:
+ # 32 bits
+ ULONG_PTR = c_ulong
+
+
+class _SECURITY_ATTRIBUTES(Structure):
+ pass
+LPSECURITY_ATTRIBUTES = POINTER(_SECURITY_ATTRIBUTES)
+
+
+try:
+ CreateEventW = _stdcall_libraries['kernel32'].CreateEventW
+except AttributeError:
+ # Fallback to non wide char version for old OS...
+ from ctypes.wintypes import LPCSTR
+ CreateEventA = _stdcall_libraries['kernel32'].CreateEventA
+ CreateEventA.restype = HANDLE
+ CreateEventA.argtypes = [LPSECURITY_ATTRIBUTES, BOOL, BOOL, LPCSTR]
+ CreateEvent=CreateEventA
+
+ CreateFileA = _stdcall_libraries['kernel32'].CreateFileA
+ CreateFileA.restype = HANDLE
+ CreateFileA.argtypes = [LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE]
+ CreateFile = CreateFileA
+else:
+ CreateEventW.restype = HANDLE
+ CreateEventW.argtypes = [LPSECURITY_ATTRIBUTES, BOOL, BOOL, LPCWSTR]
+ CreateEvent = CreateEventW # alias
+
+ CreateFileW = _stdcall_libraries['kernel32'].CreateFileW
+ CreateFileW.restype = HANDLE
+ CreateFileW.argtypes = [LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE]
+ CreateFile = CreateFileW # alias
+
+class _OVERLAPPED(Structure):
+ pass
+OVERLAPPED = _OVERLAPPED
+
+class _COMSTAT(Structure):
+ pass
+COMSTAT = _COMSTAT
+
+class _DCB(Structure):
+ pass
+DCB = _DCB
+
+class _COMMTIMEOUTS(Structure):
+ pass
+COMMTIMEOUTS = _COMMTIMEOUTS
+
+GetLastError = _stdcall_libraries['kernel32'].GetLastError
+GetLastError.restype = DWORD
+GetLastError.argtypes = []
+
+LPOVERLAPPED = POINTER(_OVERLAPPED)
+LPDWORD = POINTER(DWORD)
+
+GetOverlappedResult = _stdcall_libraries['kernel32'].GetOverlappedResult
+GetOverlappedResult.restype = BOOL
+GetOverlappedResult.argtypes = [HANDLE, LPOVERLAPPED, LPDWORD, BOOL]
+
+ResetEvent = _stdcall_libraries['kernel32'].ResetEvent
+ResetEvent.restype = BOOL
+ResetEvent.argtypes = [HANDLE]
+
+LPCVOID = c_void_p
+
+WriteFile = _stdcall_libraries['kernel32'].WriteFile
+WriteFile.restype = BOOL
+WriteFile.argtypes = [HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED]
+
+LPVOID = c_void_p
+
+ReadFile = _stdcall_libraries['kernel32'].ReadFile
+ReadFile.restype = BOOL
+ReadFile.argtypes = [HANDLE, LPVOID, DWORD, LPDWORD, LPOVERLAPPED]
+
+CloseHandle = _stdcall_libraries['kernel32'].CloseHandle
+CloseHandle.restype = BOOL
+CloseHandle.argtypes = [HANDLE]
+
+ClearCommBreak = _stdcall_libraries['kernel32'].ClearCommBreak
+ClearCommBreak.restype = BOOL
+ClearCommBreak.argtypes = [HANDLE]
+
+LPCOMSTAT = POINTER(_COMSTAT)
+
+ClearCommError = _stdcall_libraries['kernel32'].ClearCommError
+ClearCommError.restype = BOOL
+ClearCommError.argtypes = [HANDLE, LPDWORD, LPCOMSTAT]
+
+SetupComm = _stdcall_libraries['kernel32'].SetupComm
+SetupComm.restype = BOOL
+SetupComm.argtypes = [HANDLE, DWORD, DWORD]
+
+EscapeCommFunction = _stdcall_libraries['kernel32'].EscapeCommFunction
+EscapeCommFunction.restype = BOOL
+EscapeCommFunction.argtypes = [HANDLE, DWORD]
+
+GetCommModemStatus = _stdcall_libraries['kernel32'].GetCommModemStatus
+GetCommModemStatus.restype = BOOL
+GetCommModemStatus.argtypes = [HANDLE, LPDWORD]
+
+LPDCB = POINTER(_DCB)
+
+GetCommState = _stdcall_libraries['kernel32'].GetCommState
+GetCommState.restype = BOOL
+GetCommState.argtypes = [HANDLE, LPDCB]
+
+LPCOMMTIMEOUTS = POINTER(_COMMTIMEOUTS)
+
+GetCommTimeouts = _stdcall_libraries['kernel32'].GetCommTimeouts
+GetCommTimeouts.restype = BOOL
+GetCommTimeouts.argtypes = [HANDLE, LPCOMMTIMEOUTS]
+
+PurgeComm = _stdcall_libraries['kernel32'].PurgeComm
+PurgeComm.restype = BOOL
+PurgeComm.argtypes = [HANDLE, DWORD]
+
+SetCommBreak = _stdcall_libraries['kernel32'].SetCommBreak
+SetCommBreak.restype = BOOL
+SetCommBreak.argtypes = [HANDLE]
+
+SetCommMask = _stdcall_libraries['kernel32'].SetCommMask
+SetCommMask.restype = BOOL
+SetCommMask.argtypes = [HANDLE, DWORD]
+
+SetCommState = _stdcall_libraries['kernel32'].SetCommState
+SetCommState.restype = BOOL
+SetCommState.argtypes = [HANDLE, LPDCB]
+
+SetCommTimeouts = _stdcall_libraries['kernel32'].SetCommTimeouts
+SetCommTimeouts.restype = BOOL
+SetCommTimeouts.argtypes = [HANDLE, LPCOMMTIMEOUTS]
+
+WaitForSingleObject = _stdcall_libraries['kernel32'].WaitForSingleObject
+WaitForSingleObject.restype = DWORD
+WaitForSingleObject.argtypes = [HANDLE, DWORD]
+
+ONESTOPBIT = 0 # Variable c_int
+TWOSTOPBITS = 2 # Variable c_int
+ONE5STOPBITS = 1
+
+NOPARITY = 0 # Variable c_int
+ODDPARITY = 1 # Variable c_int
+EVENPARITY = 2 # Variable c_int
+MARKPARITY = 3
+SPACEPARITY = 4
+
+RTS_CONTROL_HANDSHAKE = 2 # Variable c_int
+RTS_CONTROL_DISABLE = 0 # Variable c_int
+RTS_CONTROL_ENABLE = 1 # Variable c_int
+RTS_CONTROL_TOGGLE = 3 # Variable c_int
+SETRTS = 3
+CLRRTS = 4
+
+DTR_CONTROL_HANDSHAKE = 2 # Variable c_int
+DTR_CONTROL_DISABLE = 0 # Variable c_int
+DTR_CONTROL_ENABLE = 1 # Variable c_int
+SETDTR = 5
+CLRDTR = 6
+
+MS_DSR_ON = 32 # Variable c_ulong
+EV_RING = 256 # Variable c_int
+EV_PERR = 512 # Variable c_int
+EV_ERR = 128 # Variable c_int
+SETXOFF = 1 # Variable c_int
+EV_RXCHAR = 1 # Variable c_int
+GENERIC_WRITE = 1073741824 # Variable c_long
+PURGE_TXCLEAR = 4 # Variable c_int
+FILE_FLAG_OVERLAPPED = 1073741824 # Variable c_int
+EV_DSR = 16 # Variable c_int
+MAXDWORD = 4294967295L # Variable c_uint
+EV_RLSD = 32 # Variable c_int
+ERROR_IO_PENDING = 997 # Variable c_long
+MS_CTS_ON = 16 # Variable c_ulong
+EV_EVENT1 = 2048 # Variable c_int
+EV_RX80FULL = 1024 # Variable c_int
+PURGE_RXABORT = 2 # Variable c_int
+FILE_ATTRIBUTE_NORMAL = 128 # Variable c_int
+PURGE_TXABORT = 1 # Variable c_int
+SETXON = 2 # Variable c_int
+OPEN_EXISTING = 3 # Variable c_int
+MS_RING_ON = 64 # Variable c_ulong
+EV_TXEMPTY = 4 # Variable c_int
+EV_RXFLAG = 2 # Variable c_int
+MS_RLSD_ON = 128 # Variable c_ulong
+GENERIC_READ = 2147483648L # Variable c_ulong
+EV_EVENT2 = 4096 # Variable c_int
+EV_CTS = 8 # Variable c_int
+EV_BREAK = 64 # Variable c_int
+PURGE_RXCLEAR = 8 # Variable c_int
+INFINITE = 0xFFFFFFFFL
+
+
+class N11_OVERLAPPED4DOLLAR_48E(Union):
+ pass
+class N11_OVERLAPPED4DOLLAR_484DOLLAR_49E(Structure):
+ pass
+N11_OVERLAPPED4DOLLAR_484DOLLAR_49E._fields_ = [
+ ('Offset', DWORD),
+ ('OffsetHigh', DWORD),
+]
+
+PVOID = c_void_p
+
+N11_OVERLAPPED4DOLLAR_48E._anonymous_ = ['_0']
+N11_OVERLAPPED4DOLLAR_48E._fields_ = [
+ ('_0', N11_OVERLAPPED4DOLLAR_484DOLLAR_49E),
+ ('Pointer', PVOID),
+]
+_OVERLAPPED._anonymous_ = ['_0']
+_OVERLAPPED._fields_ = [
+ ('Internal', ULONG_PTR),
+ ('InternalHigh', ULONG_PTR),
+ ('_0', N11_OVERLAPPED4DOLLAR_48E),
+ ('hEvent', HANDLE),
+]
+_SECURITY_ATTRIBUTES._fields_ = [
+ ('nLength', DWORD),
+ ('lpSecurityDescriptor', LPVOID),
+ ('bInheritHandle', BOOL),
+]
+_COMSTAT._fields_ = [
+ ('fCtsHold', DWORD, 1),
+ ('fDsrHold', DWORD, 1),
+ ('fRlsdHold', DWORD, 1),
+ ('fXoffHold', DWORD, 1),
+ ('fXoffSent', DWORD, 1),
+ ('fEof', DWORD, 1),
+ ('fTxim', DWORD, 1),
+ ('fReserved', DWORD, 25),
+ ('cbInQue', DWORD),
+ ('cbOutQue', DWORD),
+]
+_DCB._fields_ = [
+ ('DCBlength', DWORD),
+ ('BaudRate', DWORD),
+ ('fBinary', DWORD, 1),
+ ('fParity', DWORD, 1),
+ ('fOutxCtsFlow', DWORD, 1),
+ ('fOutxDsrFlow', DWORD, 1),
+ ('fDtrControl', DWORD, 2),
+ ('fDsrSensitivity', DWORD, 1),
+ ('fTXContinueOnXoff', DWORD, 1),
+ ('fOutX', DWORD, 1),
+ ('fInX', DWORD, 1),
+ ('fErrorChar', DWORD, 1),
+ ('fNull', DWORD, 1),
+ ('fRtsControl', DWORD, 2),
+ ('fAbortOnError', DWORD, 1),
+ ('fDummy2', DWORD, 17),
+ ('wReserved', WORD),
+ ('XonLim', WORD),
+ ('XoffLim', WORD),
+ ('ByteSize', BYTE),
+ ('Parity', BYTE),
+ ('StopBits', BYTE),
+ ('XonChar', c_char),
+ ('XoffChar', c_char),
+ ('ErrorChar', c_char),
+ ('EofChar', c_char),
+ ('EvtChar', c_char),
+ ('wReserved1', WORD),
+]
+_COMMTIMEOUTS._fields_ = [
+ ('ReadIntervalTimeout', DWORD),
+ ('ReadTotalTimeoutMultiplier', DWORD),
+ ('ReadTotalTimeoutConstant', DWORD),
+ ('WriteTotalTimeoutMultiplier', DWORD),
+ ('WriteTotalTimeoutConstant', DWORD),
+]
+__all__ = ['GetLastError', 'MS_CTS_ON', 'FILE_ATTRIBUTE_NORMAL',
+ 'DTR_CONTROL_ENABLE', '_COMSTAT', 'MS_RLSD_ON',
+ 'GetOverlappedResult', 'SETXON', 'PURGE_TXABORT',
+ 'PurgeComm', 'N11_OVERLAPPED4DOLLAR_48E', 'EV_RING',
+ 'ONESTOPBIT', 'SETXOFF', 'PURGE_RXABORT', 'GetCommState',
+ 'RTS_CONTROL_ENABLE', '_DCB', 'CreateEvent',
+ '_COMMTIMEOUTS', '_SECURITY_ATTRIBUTES', 'EV_DSR',
+ 'EV_PERR', 'EV_RXFLAG', 'OPEN_EXISTING', 'DCB',
+ 'FILE_FLAG_OVERLAPPED', 'EV_CTS', 'SetupComm',
+ 'LPOVERLAPPED', 'EV_TXEMPTY', 'ClearCommBreak',
+ 'LPSECURITY_ATTRIBUTES', 'SetCommBreak', 'SetCommTimeouts',
+ 'COMMTIMEOUTS', 'ODDPARITY', 'EV_RLSD',
+ 'GetCommModemStatus', 'EV_EVENT2', 'PURGE_TXCLEAR',
+ 'EV_BREAK', 'EVENPARITY', 'LPCVOID', 'COMSTAT', 'ReadFile',
+ 'PVOID', '_OVERLAPPED', 'WriteFile', 'GetCommTimeouts',
+ 'ResetEvent', 'EV_RXCHAR', 'LPCOMSTAT', 'ClearCommError',
+ 'ERROR_IO_PENDING', 'EscapeCommFunction', 'GENERIC_READ',
+ 'RTS_CONTROL_HANDSHAKE', 'OVERLAPPED',
+ 'DTR_CONTROL_HANDSHAKE', 'PURGE_RXCLEAR', 'GENERIC_WRITE',
+ 'LPDCB', 'CreateEventW', 'SetCommMask', 'EV_EVENT1',
+ 'SetCommState', 'LPVOID', 'CreateFileW', 'LPDWORD',
+ 'EV_RX80FULL', 'TWOSTOPBITS', 'LPCOMMTIMEOUTS', 'MAXDWORD',
+ 'MS_DSR_ON', 'MS_RING_ON',
+ 'N11_OVERLAPPED4DOLLAR_484DOLLAR_49E', 'EV_ERR',
+ 'ULONG_PTR', 'CreateFile', 'NOPARITY', 'CloseHandle']
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/zipfile/LICENSE b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/zipfile/LICENSE
new file mode 100644
index 0000000..84a3337
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/zipfile/LICENSE
@@ -0,0 +1,255 @@
+A. HISTORY OF THE SOFTWARE
+==========================
+
+Python was created in the early 1990s by Guido van Rossum at Stichting
+Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
+as a successor of a language called ABC. Guido remains Python's
+principal author, although it includes many contributions from others.
+
+In 1995, Guido continued his work on Python at the Corporation for
+National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
+in Reston, Virginia where he released several versions of the
+software.
+
+In May 2000, Guido and the Python core development team moved to
+BeOpen.com to form the BeOpen PythonLabs team. In October of the same
+year, the PythonLabs team moved to Digital Creations (now Zope
+Corporation, see http://www.zope.com). In 2001, the Python Software
+Foundation (PSF, see http://www.python.org/psf/) was formed, a
+non-profit organization created specifically to own Python-related
+Intellectual Property. Zope Corporation is a sponsoring member of
+the PSF.
+
+All Python releases are Open Source (see http://www.opensource.org for
+the Open Source Definition). Historically, most, but not all, Python
+releases have also been GPL-compatible; the table below summarizes
+the various releases.
+
+ Release Derived Year Owner GPL-
+ from compatible? (1)
+
+ 0.9.0 thru 1.2 1991-1995 CWI yes
+ 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes
+ 1.6 1.5.2 2000 CNRI no
+ 2.0 1.6 2000 BeOpen.com no
+ 1.6.1 1.6 2001 CNRI yes (2)
+ 2.1 2.0+1.6.1 2001 PSF no
+ 2.0.1 2.0+1.6.1 2001 PSF yes
+ 2.1.1 2.1+2.0.1 2001 PSF yes
+ 2.1.2 2.1.1 2002 PSF yes
+ 2.1.3 2.1.2 2002 PSF yes
+ 2.2 and above 2.1.1 2001-now PSF yes
+
+Footnotes:
+
+(1) GPL-compatible doesn't mean that we're distributing Python under
+ the GPL. All Python licenses, unlike the GPL, let you distribute
+ a modified version without making your changes open source. The
+ GPL-compatible licenses make it possible to combine Python with
+ other software that is released under the GPL; the others don't.
+
+(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
+ because its license has a choice of law clause. According to
+ CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
+ is "not incompatible" with the GPL.
+
+Thanks to the many outside volunteers who have worked under Guido's
+direction to make these releases possible.
+
+
+B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
+===============================================================
+
+PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
+--------------------------------------------
+
+1. This LICENSE AGREEMENT is between the Python Software Foundation
+("PSF"), and the Individual or Organization ("Licensee") accessing and
+otherwise using this software ("Python") in source or binary form and
+its associated documentation.
+
+2. Subject to the terms and conditions of this License Agreement, PSF hereby
+grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
+analyze, test, perform and/or display publicly, prepare derivative works,
+distribute, and otherwise use Python alone or in any derivative version,
+provided, however, that PSF's License Agreement and PSF's notice of copyright,
+i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+2011, 2012, 2013, 2014, 2015, 2016 Python Software Foundation; All Rights
+Reserved" are retained in Python alone or in any derivative version prepared by
+Licensee.
+
+3. In the event Licensee prepares a derivative work that is based on
+or incorporates Python or any part thereof, and wants to make
+the derivative work available to others as provided herein, then
+Licensee hereby agrees to include in any such work a brief summary of
+the changes made to Python.
+
+4. PSF is making Python available to Licensee on an "AS IS"
+basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
+
+5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
+FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
+A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
+OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+6. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
+
+7. Nothing in this License Agreement shall be deemed to create any
+relationship of agency, partnership, or joint venture between PSF and
+Licensee. This License Agreement does not grant permission to use PSF
+trademarks or trade name in a trademark sense to endorse or promote
+products or services of Licensee, or any third party.
+
+8. By copying, installing or otherwise using Python, Licensee
+agrees to be bound by the terms and conditions of this License
+Agreement.
+
+
+BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
+-------------------------------------------
+
+BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
+
+1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
+office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
+Individual or Organization ("Licensee") accessing and otherwise using
+this software in source or binary form and its associated
+documentation ("the Software").
+
+2. Subject to the terms and conditions of this BeOpen Python License
+Agreement, BeOpen hereby grants Licensee a non-exclusive,
+royalty-free, world-wide license to reproduce, analyze, test, perform
+and/or display publicly, prepare derivative works, distribute, and
+otherwise use the Software alone or in any derivative version,
+provided, however, that the BeOpen Python License is retained in the
+Software, alone or in any derivative version prepared by Licensee.
+
+3. BeOpen is making the Software available to Licensee on an "AS IS"
+basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
+
+4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
+SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
+AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
+DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+5. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
+
+6. This License Agreement shall be governed by and interpreted in all
+respects by the law of the State of California, excluding conflict of
+law provisions. Nothing in this License Agreement shall be deemed to
+create any relationship of agency, partnership, or joint venture
+between BeOpen and Licensee. This License Agreement does not grant
+permission to use BeOpen trademarks or trade names in a trademark
+sense to endorse or promote products or services of Licensee, or any
+third party. As an exception, the "BeOpen Python" logos available at
+http://www.pythonlabs.com/logos.html may be used according to the
+permissions granted on that web page.
+
+7. By copying, installing or otherwise using the software, Licensee
+agrees to be bound by the terms and conditions of this License
+Agreement.
+
+
+CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
+---------------------------------------
+
+1. This LICENSE AGREEMENT is between the Corporation for National
+Research Initiatives, having an office at 1895 Preston White Drive,
+Reston, VA 20191 ("CNRI"), and the Individual or Organization
+("Licensee") accessing and otherwise using Python 1.6.1 software in
+source or binary form and its associated documentation.
+
+2. Subject to the terms and conditions of this License Agreement, CNRI
+hereby grants Licensee a nonexclusive, royalty-free, world-wide
+license to reproduce, analyze, test, perform and/or display publicly,
+prepare derivative works, distribute, and otherwise use Python 1.6.1
+alone or in any derivative version, provided, however, that CNRI's
+License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
+1995-2001 Corporation for National Research Initiatives; All Rights
+Reserved" are retained in Python 1.6.1 alone or in any derivative
+version prepared by Licensee. Alternately, in lieu of CNRI's License
+Agreement, Licensee may substitute the following text (omitting the
+quotes): "Python 1.6.1 is made available subject to the terms and
+conditions in CNRI's License Agreement. This Agreement together with
+Python 1.6.1 may be located on the Internet using the following
+unique, persistent identifier (known as a handle): 1895.22/1013. This
+Agreement may also be obtained from a proxy server on the Internet
+using the following URL: http://hdl.handle.net/1895.22/1013".
+
+3. In the event Licensee prepares a derivative work that is based on
+or incorporates Python 1.6.1 or any part thereof, and wants to make
+the derivative work available to others as provided herein, then
+Licensee hereby agrees to include in any such work a brief summary of
+the changes made to Python 1.6.1.
+
+4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
+basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
+
+5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
+1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
+A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
+OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+6. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
+
+7. This License Agreement shall be governed by the federal
+intellectual property law of the United States, including without
+limitation the federal copyright law, and, to the extent such
+U.S. federal law does not apply, by the law of the Commonwealth of
+Virginia, excluding Virginia's conflict of law provisions.
+Notwithstanding the foregoing, with regard to derivative works based
+on Python 1.6.1 that incorporate non-separable material that was
+previously distributed under the GNU General Public License (GPL), the
+law of the Commonwealth of Virginia shall govern this License
+Agreement only as to issues arising under or with respect to
+Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this
+License Agreement shall be deemed to create any relationship of
+agency, partnership, or joint venture between CNRI and Licensee. This
+License Agreement does not grant permission to use CNRI trademarks or
+trade name in a trademark sense to endorse or promote products or
+services of Licensee, or any third party.
+
+8. By clicking on the "ACCEPT" button where indicated, or by copying,
+installing or otherwise using Python 1.6.1, Licensee agrees to be
+bound by the terms and conditions of this License Agreement.
+
+ ACCEPT
+
+
+CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
+--------------------------------------------------
+
+Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
+The Netherlands. All rights reserved.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Stichting Mathematisch
+Centrum or CWI not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
+THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
+FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/zipfile/README.chromium b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/zipfile/README.chromium
new file mode 100644
index 0000000..f45d3cf
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/zipfile/README.chromium
@@ -0,0 +1,16 @@
+Name: Python zipfile module
+Short Name: zipfile
+URL: https://github.com/python/cpython/blob/master/Lib/zipfile.py
+Version: 2.7.13
+License: Python
+License File: NOT_SHIPPED
+Security Critical: no
+
+Description:
+This is a copy of the zipfile module from Python 2.7.13. This snapshot was
+taken to workaround a bug in older Python versions such as 2.7.3. See
+<https://bugs.python.org/issue6972> and specifically the fix at
+<https://hg.python.org/cpython/rev/0c5fa35c9f12#l3.11>.
+
+Local Modifications:
+Renamed zipfile.py to zipfile_2_7_13.py to avoid conflicting with system copy.
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/zipfile/zipfile_2_7_13.py b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/zipfile/zipfile_2_7_13.py
new file mode 100644
index 0000000..1d10650
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/third_party/zipfile/zipfile_2_7_13.py
@@ -0,0 +1,1543 @@
+"""
+Read and write ZIP files.
+"""
+import struct, os, time, sys, shutil
+import binascii, cStringIO, stat
+import io
+import re
+import string
+
+try:
+ import zlib # We may need its compression method
+ crc32 = zlib.crc32
+except ImportError:
+ zlib = None
+ crc32 = binascii.crc32
+
+__all__ = ["BadZipfile", "error", "ZIP_STORED", "ZIP_DEFLATED", "is_zipfile",
+ "ZipInfo", "ZipFile", "PyZipFile", "LargeZipFile" ]
+
+class BadZipfile(Exception):
+ pass
+
+
+class LargeZipFile(Exception):
+ """
+ Raised when writing a zipfile, the zipfile requires ZIP64 extensions
+ and those extensions are disabled.
+ """
+
+error = BadZipfile # The exception raised by this module
+
+ZIP64_LIMIT = (1 << 31) - 1
+ZIP_FILECOUNT_LIMIT = (1 << 16) - 1
+ZIP_MAX_COMMENT = (1 << 16) - 1
+
+# constants for Zip file compression methods
+ZIP_STORED = 0
+ZIP_DEFLATED = 8
+# Other ZIP compression methods not supported
+
+# Below are some formats and associated data for reading/writing headers using
+# the struct module. The names and structures of headers/records are those used
+# in the PKWARE description of the ZIP file format:
+# http://www.pkware.com/documents/casestudies/APPNOTE.TXT
+# (URL valid as of January 2008)
+
+# The "end of central directory" structure, magic number, size, and indices
+# (section V.I in the format document)
+structEndArchive = "<4s4H2LH"
+stringEndArchive = "PK\005\006"
+sizeEndCentDir = struct.calcsize(structEndArchive)
+
+_ECD_SIGNATURE = 0
+_ECD_DISK_NUMBER = 1
+_ECD_DISK_START = 2
+_ECD_ENTRIES_THIS_DISK = 3
+_ECD_ENTRIES_TOTAL = 4
+_ECD_SIZE = 5
+_ECD_OFFSET = 6
+_ECD_COMMENT_SIZE = 7
+# These last two indices are not part of the structure as defined in the
+# spec, but they are used internally by this module as a convenience
+_ECD_COMMENT = 8
+_ECD_LOCATION = 9
+
+# The "central directory" structure, magic number, size, and indices
+# of entries in the structure (section V.F in the format document)
+structCentralDir = "<4s4B4HL2L5H2L"
+stringCentralDir = "PK\001\002"
+sizeCentralDir = struct.calcsize(structCentralDir)
+
+# indexes of entries in the central directory structure
+_CD_SIGNATURE = 0
+_CD_CREATE_VERSION = 1
+_CD_CREATE_SYSTEM = 2
+_CD_EXTRACT_VERSION = 3
+_CD_EXTRACT_SYSTEM = 4
+_CD_FLAG_BITS = 5
+_CD_COMPRESS_TYPE = 6
+_CD_TIME = 7
+_CD_DATE = 8
+_CD_CRC = 9
+_CD_COMPRESSED_SIZE = 10
+_CD_UNCOMPRESSED_SIZE = 11
+_CD_FILENAME_LENGTH = 12
+_CD_EXTRA_FIELD_LENGTH = 13
+_CD_COMMENT_LENGTH = 14
+_CD_DISK_NUMBER_START = 15
+_CD_INTERNAL_FILE_ATTRIBUTES = 16
+_CD_EXTERNAL_FILE_ATTRIBUTES = 17
+_CD_LOCAL_HEADER_OFFSET = 18
+
+# The "local file header" structure, magic number, size, and indices
+# (section V.A in the format document)
+structFileHeader = "<4s2B4HL2L2H"
+stringFileHeader = "PK\003\004"
+sizeFileHeader = struct.calcsize(structFileHeader)
+
+_FH_SIGNATURE = 0
+_FH_EXTRACT_VERSION = 1
+_FH_EXTRACT_SYSTEM = 2
+_FH_GENERAL_PURPOSE_FLAG_BITS = 3
+_FH_COMPRESSION_METHOD = 4
+_FH_LAST_MOD_TIME = 5
+_FH_LAST_MOD_DATE = 6
+_FH_CRC = 7
+_FH_COMPRESSED_SIZE = 8
+_FH_UNCOMPRESSED_SIZE = 9
+_FH_FILENAME_LENGTH = 10
+_FH_EXTRA_FIELD_LENGTH = 11
+
+# The "Zip64 end of central directory locator" structure, magic number, and size
+structEndArchive64Locator = "<4sLQL"
+stringEndArchive64Locator = "PK\x06\x07"
+sizeEndCentDir64Locator = struct.calcsize(structEndArchive64Locator)
+
+# The "Zip64 end of central directory" record, magic number, size, and indices
+# (section V.G in the format document)
+structEndArchive64 = "<4sQ2H2L4Q"
+stringEndArchive64 = "PK\x06\x06"
+sizeEndCentDir64 = struct.calcsize(structEndArchive64)
+
+_CD64_SIGNATURE = 0
+_CD64_DIRECTORY_RECSIZE = 1
+_CD64_CREATE_VERSION = 2
+_CD64_EXTRACT_VERSION = 3
+_CD64_DISK_NUMBER = 4
+_CD64_DISK_NUMBER_START = 5
+_CD64_NUMBER_ENTRIES_THIS_DISK = 6
+_CD64_NUMBER_ENTRIES_TOTAL = 7
+_CD64_DIRECTORY_SIZE = 8
+_CD64_OFFSET_START_CENTDIR = 9
+
+def _check_zipfile(fp):
+ try:
+ if _EndRecData(fp):
+ return True # file has correct magic number
+ except IOError:
+ pass
+ return False
+
+def is_zipfile(filename):
+ """Quickly see if a file is a ZIP file by checking the magic number.
+
+ The filename argument may be a file or file-like object too.
+ """
+ result = False
+ try:
+ if hasattr(filename, "read"):
+ result = _check_zipfile(fp=filename)
+ else:
+ with open(filename, "rb") as fp:
+ result = _check_zipfile(fp)
+ except IOError:
+ pass
+ return result
+
+def _EndRecData64(fpin, offset, endrec):
+ """
+ Read the ZIP64 end-of-archive records and use that to update endrec
+ """
+ try:
+ fpin.seek(offset - sizeEndCentDir64Locator, 2)
+ except IOError:
+ # If the seek fails, the file is not large enough to contain a ZIP64
+ # end-of-archive record, so just return the end record we were given.
+ return endrec
+
+ data = fpin.read(sizeEndCentDir64Locator)
+ if len(data) != sizeEndCentDir64Locator:
+ return endrec
+ sig, diskno, reloff, disks = struct.unpack(structEndArchive64Locator, data)
+ if sig != stringEndArchive64Locator:
+ return endrec
+
+ if diskno != 0 or disks != 1:
+ raise BadZipfile("zipfiles that span multiple disks are not supported")
+
+ # Assume no 'zip64 extensible data'
+ fpin.seek(offset - sizeEndCentDir64Locator - sizeEndCentDir64, 2)
+ data = fpin.read(sizeEndCentDir64)
+ if len(data) != sizeEndCentDir64:
+ return endrec
+ sig, sz, create_version, read_version, disk_num, disk_dir, \
+ dircount, dircount2, dirsize, diroffset = \
+ struct.unpack(structEndArchive64, data)
+ if sig != stringEndArchive64:
+ return endrec
+
+ # Update the original endrec using data from the ZIP64 record
+ endrec[_ECD_SIGNATURE] = sig
+ endrec[_ECD_DISK_NUMBER] = disk_num
+ endrec[_ECD_DISK_START] = disk_dir
+ endrec[_ECD_ENTRIES_THIS_DISK] = dircount
+ endrec[_ECD_ENTRIES_TOTAL] = dircount2
+ endrec[_ECD_SIZE] = dirsize
+ endrec[_ECD_OFFSET] = diroffset
+ return endrec
+
+
+def _EndRecData(fpin):
+ """Return data from the "End of Central Directory" record, or None.
+
+ The data is a list of the nine items in the ZIP "End of central dir"
+ record followed by a tenth item, the file seek offset of this record."""
+
+ # Determine file size
+ fpin.seek(0, 2)
+ filesize = fpin.tell()
+
+ # Check to see if this is ZIP file with no archive comment (the
+ # "end of central directory" structure should be the last item in the
+ # file if this is the case).
+ try:
+ fpin.seek(-sizeEndCentDir, 2)
+ except IOError:
+ return None
+ data = fpin.read()
+ if (len(data) == sizeEndCentDir and
+ data[0:4] == stringEndArchive and
+ data[-2:] == b"\000\000"):
+ # the signature is correct and there's no comment, unpack structure
+ endrec = struct.unpack(structEndArchive, data)
+ endrec=list(endrec)
+
+ # Append a blank comment and record start offset
+ endrec.append("")
+ endrec.append(filesize - sizeEndCentDir)
+
+ # Try to read the "Zip64 end of central directory" structure
+ return _EndRecData64(fpin, -sizeEndCentDir, endrec)
+
+ # Either this is not a ZIP file, or it is a ZIP file with an archive
+ # comment. Search the end of the file for the "end of central directory"
+ # record signature. The comment is the last item in the ZIP file and may be
+ # up to 64K long. It is assumed that the "end of central directory" magic
+ # number does not appear in the comment.
+ maxCommentStart = max(filesize - (1 << 16) - sizeEndCentDir, 0)
+ fpin.seek(maxCommentStart, 0)
+ data = fpin.read()
+ start = data.rfind(stringEndArchive)
+ if start >= 0:
+ # found the magic number; attempt to unpack and interpret
+ recData = data[start:start+sizeEndCentDir]
+ if len(recData) != sizeEndCentDir:
+ # Zip file is corrupted.
+ return None
+ endrec = list(struct.unpack(structEndArchive, recData))
+ commentSize = endrec[_ECD_COMMENT_SIZE] #as claimed by the zip file
+ comment = data[start+sizeEndCentDir:start+sizeEndCentDir+commentSize]
+ endrec.append(comment)
+ endrec.append(maxCommentStart + start)
+
+ # Try to read the "Zip64 end of central directory" structure
+ return _EndRecData64(fpin, maxCommentStart + start - filesize,
+ endrec)
+
+ # Unable to find a valid end of central directory structure
+ return None
+
+
+class ZipInfo (object):
+ """Class with attributes describing each file in the ZIP archive."""
+
+ __slots__ = (
+ 'orig_filename',
+ 'filename',
+ 'date_time',
+ 'compress_type',
+ 'comment',
+ 'extra',
+ 'create_system',
+ 'create_version',
+ 'extract_version',
+ 'reserved',
+ 'flag_bits',
+ 'volume',
+ 'internal_attr',
+ 'external_attr',
+ 'header_offset',
+ 'CRC',
+ 'compress_size',
+ 'file_size',
+ '_raw_time',
+ )
+
+ def __init__(self, filename="NoName", date_time=(1980,1,1,0,0,0)):
+ self.orig_filename = filename # Original file name in archive
+
+ # Terminate the file name at the first null byte. Null bytes in file
+ # names are used as tricks by viruses in archives.
+ null_byte = filename.find(chr(0))
+ if null_byte >= 0:
+ filename = filename[0:null_byte]
+ # This is used to ensure paths in generated ZIP files always use
+ # forward slashes as the directory separator, as required by the
+ # ZIP format specification.
+ if os.sep != "/" and os.sep in filename:
+ filename = filename.replace(os.sep, "/")
+
+ self.filename = filename # Normalized file name
+ self.date_time = date_time # year, month, day, hour, min, sec
+
+ if date_time[0] < 1980:
+ raise ValueError('ZIP does not support timestamps before 1980')
+
+ # Standard values:
+ self.compress_type = ZIP_STORED # Type of compression for the file
+ self.comment = "" # Comment for each file
+ self.extra = "" # ZIP extra data
+ if sys.platform == 'win32':
+ self.create_system = 0 # System which created ZIP archive
+ else:
+ # Assume everything else is unix-y
+ self.create_system = 3 # System which created ZIP archive
+ self.create_version = 20 # Version which created ZIP archive
+ self.extract_version = 20 # Version needed to extract archive
+ self.reserved = 0 # Must be zero
+ self.flag_bits = 0 # ZIP flag bits
+ self.volume = 0 # Volume number of file header
+ self.internal_attr = 0 # Internal attributes
+ self.external_attr = 0 # External file attributes
+ # Other attributes are set by class ZipFile:
+ # header_offset Byte offset to the file header
+ # CRC CRC-32 of the uncompressed file
+ # compress_size Size of the compressed file
+ # file_size Size of the uncompressed file
+
+ def FileHeader(self, zip64=None):
+ """Return the per-file header as a string."""
+ dt = self.date_time
+ dosdate = (dt[0] - 1980) << 9 | dt[1] << 5 | dt[2]
+ dostime = dt[3] << 11 | dt[4] << 5 | (dt[5] // 2)
+ if self.flag_bits & 0x08:
+ # Set these to zero because we write them after the file data
+ CRC = compress_size = file_size = 0
+ else:
+ CRC = self.CRC
+ compress_size = self.compress_size
+ file_size = self.file_size
+
+ extra = self.extra
+
+ if zip64 is None:
+ zip64 = file_size > ZIP64_LIMIT or compress_size > ZIP64_LIMIT
+ if zip64:
+ fmt = '<HHQQ'
+ extra = extra + struct.pack(fmt,
+ 1, struct.calcsize(fmt)-4, file_size, compress_size)
+ if file_size > ZIP64_LIMIT or compress_size > ZIP64_LIMIT:
+ if not zip64:
+ raise LargeZipFile("Filesize would require ZIP64 extensions")
+ # File is larger than what fits into a 4 byte integer,
+ # fall back to the ZIP64 extension
+ file_size = 0xffffffff
+ compress_size = 0xffffffff
+ self.extract_version = max(45, self.extract_version)
+ self.create_version = max(45, self.extract_version)
+
+ filename, flag_bits = self._encodeFilenameFlags()
+ header = struct.pack(structFileHeader, stringFileHeader,
+ self.extract_version, self.reserved, flag_bits,
+ self.compress_type, dostime, dosdate, CRC,
+ compress_size, file_size,
+ len(filename), len(extra))
+ return header + filename + extra
+
+ def _encodeFilenameFlags(self):
+ if isinstance(self.filename, unicode):
+ try:
+ return self.filename.encode('ascii'), self.flag_bits
+ except UnicodeEncodeError:
+ return self.filename.encode('utf-8'), self.flag_bits | 0x800
+ else:
+ return self.filename, self.flag_bits
+
+ def _decodeFilename(self):
+ if self.flag_bits & 0x800:
+ return self.filename.decode('utf-8')
+ else:
+ return self.filename
+
+ def _decodeExtra(self):
+ # Try to decode the extra field.
+ extra = self.extra
+ unpack = struct.unpack
+ while len(extra) >= 4:
+ tp, ln = unpack('<HH', extra[:4])
+ if tp == 1:
+ if ln >= 24:
+ counts = unpack('<QQQ', extra[4:28])
+ elif ln == 16:
+ counts = unpack('<QQ', extra[4:20])
+ elif ln == 8:
+ counts = unpack('<Q', extra[4:12])
+ elif ln == 0:
+ counts = ()
+ else:
+ raise RuntimeError, "Corrupt extra field %s"%(ln,)
+
+ idx = 0
+
+ # ZIP64 extension (large files and/or large archives)
+ if self.file_size in (0xffffffffffffffffL, 0xffffffffL):
+ self.file_size = counts[idx]
+ idx += 1
+
+ if self.compress_size == 0xFFFFFFFFL:
+ self.compress_size = counts[idx]
+ idx += 1
+
+ if self.header_offset == 0xffffffffL:
+ old = self.header_offset
+ self.header_offset = counts[idx]
+ idx+=1
+
+ extra = extra[ln+4:]
+
+
+class _ZipDecrypter:
+ """Class to handle decryption of files stored within a ZIP archive.
+
+ ZIP supports a password-based form of encryption. Even though known
+ plaintext attacks have been found against it, it is still useful
+ to be able to get data out of such a file.
+
+ Usage:
+ zd = _ZipDecrypter(mypwd)
+ plain_char = zd(cypher_char)
+ plain_text = map(zd, cypher_text)
+ """
+
+ def _GenerateCRCTable():
+ """Generate a CRC-32 table.
+
+ ZIP encryption uses the CRC32 one-byte primitive for scrambling some
+ internal keys. We noticed that a direct implementation is faster than
+ relying on binascii.crc32().
+ """
+ poly = 0xedb88320
+ table = [0] * 256
+ for i in range(256):
+ crc = i
+ for j in range(8):
+ if crc & 1:
+ crc = ((crc >> 1) & 0x7FFFFFFF) ^ poly
+ else:
+ crc = ((crc >> 1) & 0x7FFFFFFF)
+ table[i] = crc
+ return table
+ crctable = _GenerateCRCTable()
+
+ def _crc32(self, ch, crc):
+ """Compute the CRC32 primitive on one byte."""
+ return ((crc >> 8) & 0xffffff) ^ self.crctable[(crc ^ ord(ch)) & 0xff]
+
+ def __init__(self, pwd):
+ self.key0 = 305419896
+ self.key1 = 591751049
+ self.key2 = 878082192
+ for p in pwd:
+ self._UpdateKeys(p)
+
+ def _UpdateKeys(self, c):
+ self.key0 = self._crc32(c, self.key0)
+ self.key1 = (self.key1 + (self.key0 & 255)) & 4294967295
+ self.key1 = (self.key1 * 134775813 + 1) & 4294967295
+ self.key2 = self._crc32(chr((self.key1 >> 24) & 255), self.key2)
+
+ def __call__(self, c):
+ """Decrypt a single character."""
+ c = ord(c)
+ k = self.key2 | 2
+ c = c ^ (((k * (k^1)) >> 8) & 255)
+ c = chr(c)
+ self._UpdateKeys(c)
+ return c
+
+
+compressor_names = {
+ 0: 'store',
+ 1: 'shrink',
+ 2: 'reduce',
+ 3: 'reduce',
+ 4: 'reduce',
+ 5: 'reduce',
+ 6: 'implode',
+ 7: 'tokenize',
+ 8: 'deflate',
+ 9: 'deflate64',
+ 10: 'implode',
+ 12: 'bzip2',
+ 14: 'lzma',
+ 18: 'terse',
+ 19: 'lz77',
+ 97: 'wavpack',
+ 98: 'ppmd',
+}
+
+
+class ZipExtFile(io.BufferedIOBase):
+ """File-like object for reading an archive member.
+ Is returned by ZipFile.open().
+ """
+
+ # Max size supported by decompressor.
+ MAX_N = 1 << 31 - 1
+
+ # Read from compressed files in 4k blocks.
+ MIN_READ_SIZE = 4096
+
+ # Search for universal newlines or line chunks.
+ PATTERN = re.compile(r'^(?P<chunk>[^\r\n]+)|(?P<newline>\n|\r\n?)')
+
+ def __init__(self, fileobj, mode, zipinfo, decrypter=None,
+ close_fileobj=False):
+ self._fileobj = fileobj
+ self._decrypter = decrypter
+ self._close_fileobj = close_fileobj
+
+ self._compress_type = zipinfo.compress_type
+ self._compress_size = zipinfo.compress_size
+ self._compress_left = zipinfo.compress_size
+
+ if self._compress_type == ZIP_DEFLATED:
+ self._decompressor = zlib.decompressobj(-15)
+ elif self._compress_type != ZIP_STORED:
+ descr = compressor_names.get(self._compress_type)
+ if descr:
+ raise NotImplementedError("compression type %d (%s)" % (self._compress_type, descr))
+ else:
+ raise NotImplementedError("compression type %d" % (self._compress_type,))
+ self._unconsumed = ''
+
+ self._readbuffer = ''
+ self._offset = 0
+
+ self._universal = 'U' in mode
+ self.newlines = None
+
+ # Adjust read size for encrypted files since the first 12 bytes
+ # are for the encryption/password information.
+ if self._decrypter is not None:
+ self._compress_left -= 12
+
+ self.mode = mode
+ self.name = zipinfo.filename
+
+ if hasattr(zipinfo, 'CRC'):
+ self._expected_crc = zipinfo.CRC
+ self._running_crc = crc32(b'') & 0xffffffff
+ else:
+ self._expected_crc = None
+
+ def readline(self, limit=-1):
+ """Read and return a line from the stream.
+
+ If limit is specified, at most limit bytes will be read.
+ """
+
+ if not self._universal and limit < 0:
+ # Shortcut common case - newline found in buffer.
+ i = self._readbuffer.find('\n', self._offset) + 1
+ if i > 0:
+ line = self._readbuffer[self._offset: i]
+ self._offset = i
+ return line
+
+ if not self._universal:
+ return io.BufferedIOBase.readline(self, limit)
+
+ line = ''
+ while limit < 0 or len(line) < limit:
+ readahead = self.peek(2)
+ if readahead == '':
+ return line
+
+ #
+ # Search for universal newlines or line chunks.
+ #
+ # The pattern returns either a line chunk or a newline, but not
+ # both. Combined with peek(2), we are assured that the sequence
+ # '\r\n' is always retrieved completely and never split into
+ # separate newlines - '\r', '\n' due to coincidental readaheads.
+ #
+ match = self.PATTERN.search(readahead)
+ newline = match.group('newline')
+ if newline is not None:
+ if self.newlines is None:
+ self.newlines = []
+ if newline not in self.newlines:
+ self.newlines.append(newline)
+ self._offset += len(newline)
+ return line + '\n'
+
+ chunk = match.group('chunk')
+ if limit >= 0:
+ chunk = chunk[: limit - len(line)]
+
+ self._offset += len(chunk)
+ line += chunk
+
+ return line
+
+ def peek(self, n=1):
+ """Returns buffered bytes without advancing the position."""
+ if n > len(self._readbuffer) - self._offset:
+ chunk = self.read(n)
+ if len(chunk) > self._offset:
+ self._readbuffer = chunk + self._readbuffer[self._offset:]
+ self._offset = 0
+ else:
+ self._offset -= len(chunk)
+
+ # Return up to 512 bytes to reduce allocation overhead for tight loops.
+ return self._readbuffer[self._offset: self._offset + 512]
+
+ def readable(self):
+ return True
+
+ def read(self, n=-1):
+ """Read and return up to n bytes.
+ If the argument is omitted, None, or negative, data is read and returned until EOF is reached..
+ """
+ buf = ''
+ if n is None:
+ n = -1
+ while True:
+ if n < 0:
+ data = self.read1(n)
+ elif n > len(buf):
+ data = self.read1(n - len(buf))
+ else:
+ return buf
+ if len(data) == 0:
+ return buf
+ buf += data
+
+ def _update_crc(self, newdata, eof):
+ # Update the CRC using the given data.
+ if self._expected_crc is None:
+ # No need to compute the CRC if we don't have a reference value
+ return
+ self._running_crc = crc32(newdata, self._running_crc) & 0xffffffff
+ # Check the CRC if we're at the end of the file
+ if eof and self._running_crc != self._expected_crc:
+ raise BadZipfile("Bad CRC-32 for file %r" % self.name)
+
+ def read1(self, n):
+ """Read up to n bytes with at most one read() system call."""
+
+ # Simplify algorithm (branching) by transforming negative n to large n.
+ if n < 0 or n is None:
+ n = self.MAX_N
+
+ # Bytes available in read buffer.
+ len_readbuffer = len(self._readbuffer) - self._offset
+
+ # Read from file.
+ if self._compress_left > 0 and n > len_readbuffer + len(self._unconsumed):
+ nbytes = n - len_readbuffer - len(self._unconsumed)
+ nbytes = max(nbytes, self.MIN_READ_SIZE)
+ nbytes = min(nbytes, self._compress_left)
+
+ data = self._fileobj.read(nbytes)
+ self._compress_left -= len(data)
+
+ if data and self._decrypter is not None:
+ data = ''.join(map(self._decrypter, data))
+
+ if self._compress_type == ZIP_STORED:
+ self._update_crc(data, eof=(self._compress_left==0))
+ self._readbuffer = self._readbuffer[self._offset:] + data
+ self._offset = 0
+ else:
+ # Prepare deflated bytes for decompression.
+ self._unconsumed += data
+
+ # Handle unconsumed data.
+ if (len(self._unconsumed) > 0 and n > len_readbuffer and
+ self._compress_type == ZIP_DEFLATED):
+ data = self._decompressor.decompress(
+ self._unconsumed,
+ max(n - len_readbuffer, self.MIN_READ_SIZE)
+ )
+
+ self._unconsumed = self._decompressor.unconsumed_tail
+ eof = len(self._unconsumed) == 0 and self._compress_left == 0
+ if eof:
+ data += self._decompressor.flush()
+
+ self._update_crc(data, eof=eof)
+ self._readbuffer = self._readbuffer[self._offset:] + data
+ self._offset = 0
+
+ # Read from buffer.
+ data = self._readbuffer[self._offset: self._offset + n]
+ self._offset += len(data)
+ return data
+
+ def close(self):
+ try :
+ if self._close_fileobj:
+ self._fileobj.close()
+ finally:
+ super(ZipExtFile, self).close()
+
+
+class ZipFile(object):
+ """ Class with methods to open, read, write, close, list zip files.
+
+ z = ZipFile(file, mode="r", compression=ZIP_STORED, allowZip64=False)
+
+ file: Either the path to the file, or a file-like object.
+ If it is a path, the file will be opened and closed by ZipFile.
+ mode: The mode can be either read "r", write "w" or append "a".
+ compression: ZIP_STORED (no compression) or ZIP_DEFLATED (requires zlib).
+ allowZip64: if True ZipFile will create files with ZIP64 extensions when
+ needed, otherwise it will raise an exception when this would
+ be necessary.
+
+ """
+
+ fp = None # Set here since __del__ checks it
+
+ def __init__(self, file, mode="r", compression=ZIP_STORED, allowZip64=False):
+ """Open the ZIP file with mode read "r", write "w" or append "a"."""
+ if mode not in ("r", "w", "a"):
+ raise RuntimeError('ZipFile() requires mode "r", "w", or "a"')
+
+ if compression == ZIP_STORED:
+ pass
+ elif compression == ZIP_DEFLATED:
+ if not zlib:
+ raise RuntimeError,\
+ "Compression requires the (missing) zlib module"
+ else:
+ raise RuntimeError, "That compression method is not supported"
+
+ self._allowZip64 = allowZip64
+ self._didModify = False
+ self.debug = 0 # Level of printing: 0 through 3
+ self.NameToInfo = {} # Find file info given name
+ self.filelist = [] # List of ZipInfo instances for archive
+ self.compression = compression # Method of compression
+ self.mode = key = mode.replace('b', '')[0]
+ self.pwd = None
+ self._comment = ''
+
+ # Check if we were passed a file-like object
+ if isinstance(file, basestring):
+ self._filePassed = 0
+ self.filename = file
+ modeDict = {'r' : 'rb', 'w': 'wb', 'a' : 'r+b'}
+ try:
+ self.fp = open(file, modeDict[mode])
+ except IOError:
+ if mode == 'a':
+ mode = key = 'w'
+ self.fp = open(file, modeDict[mode])
+ else:
+ raise
+ else:
+ self._filePassed = 1
+ self.fp = file
+ self.filename = getattr(file, 'name', None)
+
+ try:
+ if key == 'r':
+ self._RealGetContents()
+ elif key == 'w':
+ # set the modified flag so central directory gets written
+ # even if no files are added to the archive
+ self._didModify = True
+ self._start_disk = self.fp.tell()
+ elif key == 'a':
+ try:
+ # See if file is a zip file
+ self._RealGetContents()
+ # seek to start of directory and overwrite
+ self.fp.seek(self.start_dir, 0)
+ except BadZipfile:
+ # file is not a zip file, just append
+ self.fp.seek(0, 2)
+
+ # set the modified flag so central directory gets written
+ # even if no files are added to the archive
+ self._didModify = True
+ self._start_disk = self.fp.tell()
+ else:
+ raise RuntimeError('Mode must be "r", "w" or "a"')
+ except:
+ fp = self.fp
+ self.fp = None
+ if not self._filePassed:
+ fp.close()
+ raise
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, type, value, traceback):
+ self.close()
+
+ def _RealGetContents(self):
+ """Read in the table of contents for the ZIP file."""
+ fp = self.fp
+ try:
+ endrec = _EndRecData(fp)
+ except IOError:
+ raise BadZipfile("File is not a zip file")
+ if not endrec:
+ raise BadZipfile, "File is not a zip file"
+ if self.debug > 1:
+ print endrec
+ size_cd = endrec[_ECD_SIZE] # bytes in central directory
+ offset_cd = endrec[_ECD_OFFSET] # offset of central directory
+ self._comment = endrec[_ECD_COMMENT] # archive comment
+
+ # self._start_disk: Position of the start of ZIP archive
+ # It is zero, unless ZIP was concatenated to another file
+ self._start_disk = endrec[_ECD_LOCATION] - size_cd - offset_cd
+ if endrec[_ECD_SIGNATURE] == stringEndArchive64:
+ # If Zip64 extension structures are present, account for them
+ self._start_disk -= (sizeEndCentDir64 + sizeEndCentDir64Locator)
+
+ if self.debug > 2:
+ inferred = self._start_disk + offset_cd
+ print "given, inferred, offset", offset_cd, inferred, self._start_disk
+ # self.start_dir: Position of start of central directory
+ self.start_dir = offset_cd + self._start_disk
+ fp.seek(self.start_dir, 0)
+ data = fp.read(size_cd)
+ fp = cStringIO.StringIO(data)
+ total = 0
+ while total < size_cd:
+ centdir = fp.read(sizeCentralDir)
+ if len(centdir) != sizeCentralDir:
+ raise BadZipfile("Truncated central directory")
+ centdir = struct.unpack(structCentralDir, centdir)
+ if centdir[_CD_SIGNATURE] != stringCentralDir:
+ raise BadZipfile("Bad magic number for central directory")
+ if self.debug > 2:
+ print centdir
+ filename = fp.read(centdir[_CD_FILENAME_LENGTH])
+ # Create ZipInfo instance to store file information
+ x = ZipInfo(filename)
+ x.extra = fp.read(centdir[_CD_EXTRA_FIELD_LENGTH])
+ x.comment = fp.read(centdir[_CD_COMMENT_LENGTH])
+ x.header_offset = centdir[_CD_LOCAL_HEADER_OFFSET]
+ (x.create_version, x.create_system, x.extract_version, x.reserved,
+ x.flag_bits, x.compress_type, t, d,
+ x.CRC, x.compress_size, x.file_size) = centdir[1:12]
+ x.volume, x.internal_attr, x.external_attr = centdir[15:18]
+ # Convert date/time code to (year, month, day, hour, min, sec)
+ x._raw_time = t
+ x.date_time = ( (d>>9)+1980, (d>>5)&0xF, d&0x1F,
+ t>>11, (t>>5)&0x3F, (t&0x1F) * 2 )
+
+ x._decodeExtra()
+ x.header_offset = x.header_offset + self._start_disk
+ x.filename = x._decodeFilename()
+ self.filelist.append(x)
+ self.NameToInfo[x.filename] = x
+
+ # update total bytes read from central directory
+ total = (total + sizeCentralDir + centdir[_CD_FILENAME_LENGTH]
+ + centdir[_CD_EXTRA_FIELD_LENGTH]
+ + centdir[_CD_COMMENT_LENGTH])
+
+ if self.debug > 2:
+ print "total", total
+
+
+ def namelist(self):
+ """Return a list of file names in the archive."""
+ l = []
+ for data in self.filelist:
+ l.append(data.filename)
+ return l
+
+ def infolist(self):
+ """Return a list of class ZipInfo instances for files in the
+ archive."""
+ return self.filelist
+
+ def printdir(self):
+ """Print a table of contents for the zip file."""
+ print "%-46s %19s %12s" % ("File Name", "Modified ", "Size")
+ for zinfo in self.filelist:
+ date = "%d-%02d-%02d %02d:%02d:%02d" % zinfo.date_time[:6]
+ print "%-46s %s %12d" % (zinfo.filename, date, zinfo.file_size)
+
+ def testzip(self):
+ """Read all the files and check the CRC."""
+ chunk_size = 2 ** 20
+ for zinfo in self.filelist:
+ try:
+ # Read by chunks, to avoid an OverflowError or a
+ # MemoryError with very large embedded files.
+ with self.open(zinfo.filename, "r") as f:
+ while f.read(chunk_size): # Check CRC-32
+ pass
+ except BadZipfile:
+ return zinfo.filename
+
+ def getinfo(self, name):
+ """Return the instance of ZipInfo given 'name'."""
+ info = self.NameToInfo.get(name)
+ if info is None:
+ raise KeyError(
+ 'There is no item named %r in the archive' % name)
+
+ return info
+
+ def setpassword(self, pwd):
+ """Set default password for encrypted files."""
+ self.pwd = pwd
+
+ @property
+ def comment(self):
+ """The comment text associated with the ZIP file."""
+ return self._comment
+
+ @comment.setter
+ def comment(self, comment):
+ # check for valid comment length
+ if len(comment) > ZIP_MAX_COMMENT:
+ import warnings
+ warnings.warn('Archive comment is too long; truncating to %d bytes'
+ % ZIP_MAX_COMMENT, stacklevel=2)
+ comment = comment[:ZIP_MAX_COMMENT]
+ self._comment = comment
+ self._didModify = True
+
+ def read(self, name, pwd=None):
+ """Return file bytes (as a string) for name."""
+ return self.open(name, "r", pwd).read()
+
+ def open(self, name, mode="r", pwd=None):
+ """Return file-like object for 'name'."""
+ if mode not in ("r", "U", "rU"):
+ raise RuntimeError, 'open() requires mode "r", "U", or "rU"'
+ if not self.fp:
+ raise RuntimeError, \
+ "Attempt to read ZIP archive that was already closed"
+
+ # Only open a new file for instances where we were not
+ # given a file object in the constructor
+ if self._filePassed:
+ zef_file = self.fp
+ should_close = False
+ else:
+ zef_file = open(self.filename, 'rb')
+ should_close = True
+
+ try:
+ # Make sure we have an info object
+ if isinstance(name, ZipInfo):
+ # 'name' is already an info object
+ zinfo = name
+ else:
+ # Get info object for name
+ zinfo = self.getinfo(name)
+
+ zef_file.seek(zinfo.header_offset, 0)
+
+ # Skip the file header:
+ fheader = zef_file.read(sizeFileHeader)
+ if len(fheader) != sizeFileHeader:
+ raise BadZipfile("Truncated file header")
+ fheader = struct.unpack(structFileHeader, fheader)
+ if fheader[_FH_SIGNATURE] != stringFileHeader:
+ raise BadZipfile("Bad magic number for file header")
+
+ fname = zef_file.read(fheader[_FH_FILENAME_LENGTH])
+ if fheader[_FH_EXTRA_FIELD_LENGTH]:
+ zef_file.read(fheader[_FH_EXTRA_FIELD_LENGTH])
+
+ if fname != zinfo.orig_filename:
+ raise BadZipfile, \
+ 'File name in directory "%s" and header "%s" differ.' % (
+ zinfo.orig_filename, fname)
+
+ # check for encrypted flag & handle password
+ is_encrypted = zinfo.flag_bits & 0x1
+ zd = None
+ if is_encrypted:
+ if not pwd:
+ pwd = self.pwd
+ if not pwd:
+ raise RuntimeError, "File %s is encrypted, " \
+ "password required for extraction" % name
+
+ zd = _ZipDecrypter(pwd)
+ # The first 12 bytes in the cypher stream is an encryption header
+ # used to strengthen the algorithm. The first 11 bytes are
+ # completely random, while the 12th contains the MSB of the CRC,
+ # or the MSB of the file time depending on the header type
+ # and is used to check the correctness of the password.
+ bytes = zef_file.read(12)
+ h = map(zd, bytes[0:12])
+ if zinfo.flag_bits & 0x8:
+ # compare against the file type from extended local headers
+ check_byte = (zinfo._raw_time >> 8) & 0xff
+ else:
+ # compare against the CRC otherwise
+ check_byte = (zinfo.CRC >> 24) & 0xff
+ if ord(h[11]) != check_byte:
+ raise RuntimeError("Bad password for file", name)
+
+ return ZipExtFile(zef_file, mode, zinfo, zd,
+ close_fileobj=should_close)
+ except:
+ if should_close:
+ zef_file.close()
+ raise
+
+ def extract(self, member, path=None, pwd=None):
+ """Extract a member from the archive to the current working directory,
+ using its full name. Its file information is extracted as accurately
+ as possible. `member' may be a filename or a ZipInfo object. You can
+ specify a different directory using `path'.
+ """
+ if not isinstance(member, ZipInfo):
+ member = self.getinfo(member)
+
+ if path is None:
+ path = os.getcwd()
+
+ return self._extract_member(member, path, pwd)
+
+ def extractall(self, path=None, members=None, pwd=None):
+ """Extract all members from the archive to the current working
+ directory. `path' specifies a different directory to extract to.
+ `members' is optional and must be a subset of the list returned
+ by namelist().
+ """
+ if members is None:
+ members = self.namelist()
+
+ for zipinfo in members:
+ self.extract(zipinfo, path, pwd)
+
+ def _extract_member(self, member, targetpath, pwd):
+ """Extract the ZipInfo object 'member' to a physical
+ file on the path targetpath.
+ """
+ # build the destination pathname, replacing
+ # forward slashes to platform specific separators.
+ arcname = member.filename.replace('/', os.path.sep)
+
+ if os.path.altsep:
+ arcname = arcname.replace(os.path.altsep, os.path.sep)
+ # interpret absolute pathname as relative, remove drive letter or
+ # UNC path, redundant separators, "." and ".." components.
+ arcname = os.path.splitdrive(arcname)[1]
+ arcname = os.path.sep.join(x for x in arcname.split(os.path.sep)
+ if x not in ('', os.path.curdir, os.path.pardir))
+ if os.path.sep == '\\':
+ # filter illegal characters on Windows
+ illegal = ':<>|"?*'
+ if isinstance(arcname, unicode):
+ table = {ord(c): ord('_') for c in illegal}
+ else:
+ table = string.maketrans(illegal, '_' * len(illegal))
+ arcname = arcname.translate(table)
+ # remove trailing dots
+ arcname = (x.rstrip('.') for x in arcname.split(os.path.sep))
+ arcname = os.path.sep.join(x for x in arcname if x)
+
+ targetpath = os.path.join(targetpath, arcname)
+ targetpath = os.path.normpath(targetpath)
+
+ # Create all upper directories if necessary.
+ upperdirs = os.path.dirname(targetpath)
+ if upperdirs and not os.path.exists(upperdirs):
+ os.makedirs(upperdirs)
+
+ if member.filename[-1] == '/':
+ if not os.path.isdir(targetpath):
+ os.mkdir(targetpath)
+ return targetpath
+
+ with self.open(member, pwd=pwd) as source, \
+ file(targetpath, "wb") as target:
+ shutil.copyfileobj(source, target)
+
+ return targetpath
+
+ def _writecheck(self, zinfo):
+ """Check for errors before writing a file to the archive."""
+ if zinfo.filename in self.NameToInfo:
+ import warnings
+ warnings.warn('Duplicate name: %r' % zinfo.filename, stacklevel=3)
+ if self.mode not in ("w", "a"):
+ raise RuntimeError, 'write() requires mode "w" or "a"'
+ if not self.fp:
+ raise RuntimeError, \
+ "Attempt to write ZIP archive that was already closed"
+ if zinfo.compress_type == ZIP_DEFLATED and not zlib:
+ raise RuntimeError, \
+ "Compression requires the (missing) zlib module"
+ if zinfo.compress_type not in (ZIP_STORED, ZIP_DEFLATED):
+ raise RuntimeError, \
+ "That compression method is not supported"
+ if not self._allowZip64:
+ requires_zip64 = None
+ if len(self.filelist) >= ZIP_FILECOUNT_LIMIT:
+ requires_zip64 = "Files count"
+ elif zinfo.file_size > ZIP64_LIMIT:
+ requires_zip64 = "Filesize"
+ elif zinfo.header_offset > ZIP64_LIMIT:
+ requires_zip64 = "Zipfile size"
+ if requires_zip64:
+ raise LargeZipFile(requires_zip64 +
+ " would require ZIP64 extensions")
+
+ def write(self, filename, arcname=None, compress_type=None):
+ """Put the bytes from filename into the archive under the name
+ arcname."""
+ if not self.fp:
+ raise RuntimeError(
+ "Attempt to write to ZIP archive that was already closed")
+
+ st = os.stat(filename)
+ isdir = stat.S_ISDIR(st.st_mode)
+ mtime = time.localtime(st.st_mtime)
+ date_time = mtime[0:6]
+ # Create ZipInfo instance to store file information
+ if arcname is None:
+ arcname = filename
+ arcname = os.path.normpath(os.path.splitdrive(arcname)[1])
+ while arcname[0] in (os.sep, os.altsep):
+ arcname = arcname[1:]
+ if isdir:
+ arcname += '/'
+ zinfo = ZipInfo(arcname, date_time)
+ zinfo.external_attr = (st[0] & 0xFFFF) << 16L # Unix attributes
+ if isdir:
+ zinfo.compress_type = ZIP_STORED
+ elif compress_type is None:
+ zinfo.compress_type = self.compression
+ else:
+ zinfo.compress_type = compress_type
+
+ zinfo.file_size = st.st_size
+ zinfo.flag_bits = 0x00
+ zinfo.header_offset = self.fp.tell() # Start of header bytes
+
+ self._writecheck(zinfo)
+ self._didModify = True
+
+ if isdir:
+ zinfo.file_size = 0
+ zinfo.compress_size = 0
+ zinfo.CRC = 0
+ zinfo.external_attr |= 0x10 # MS-DOS directory flag
+ self.filelist.append(zinfo)
+ self.NameToInfo[zinfo.filename] = zinfo
+ self.fp.write(zinfo.FileHeader(False))
+ return
+
+ with open(filename, "rb") as fp:
+ # Must overwrite CRC and sizes with correct data later
+ zinfo.CRC = CRC = 0
+ zinfo.compress_size = compress_size = 0
+ # Compressed size can be larger than uncompressed size
+ zip64 = self._allowZip64 and \
+ zinfo.file_size * 1.05 > ZIP64_LIMIT
+ self.fp.write(zinfo.FileHeader(zip64))
+ if zinfo.compress_type == ZIP_DEFLATED:
+ cmpr = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION,
+ zlib.DEFLATED, -15)
+ else:
+ cmpr = None
+ file_size = 0
+ while 1:
+ buf = fp.read(1024 * 8)
+ if not buf:
+ break
+ file_size = file_size + len(buf)
+ CRC = crc32(buf, CRC) & 0xffffffff
+ if cmpr:
+ buf = cmpr.compress(buf)
+ compress_size = compress_size + len(buf)
+ self.fp.write(buf)
+ if cmpr:
+ buf = cmpr.flush()
+ compress_size = compress_size + len(buf)
+ self.fp.write(buf)
+ zinfo.compress_size = compress_size
+ else:
+ zinfo.compress_size = file_size
+ zinfo.CRC = CRC
+ zinfo.file_size = file_size
+ if not zip64 and self._allowZip64:
+ if file_size > ZIP64_LIMIT:
+ raise RuntimeError('File size has increased during compressing')
+ if compress_size > ZIP64_LIMIT:
+ raise RuntimeError('Compressed size larger than uncompressed size')
+ # Seek backwards and write file header (which will now include
+ # correct CRC and file sizes)
+ position = self.fp.tell() # Preserve current position in file
+ self.fp.seek(zinfo.header_offset, 0)
+ self.fp.write(zinfo.FileHeader(zip64))
+ self.fp.seek(position, 0)
+ self.filelist.append(zinfo)
+ self.NameToInfo[zinfo.filename] = zinfo
+
+ def writestr(self, zinfo_or_arcname, bytes, compress_type=None):
+ """Write a file into the archive. The contents is the string
+ 'bytes'. 'zinfo_or_arcname' is either a ZipInfo instance or
+ the name of the file in the archive."""
+ if not isinstance(zinfo_or_arcname, ZipInfo):
+ zinfo = ZipInfo(filename=zinfo_or_arcname,
+ date_time=time.localtime(time.time())[:6])
+
+ zinfo.compress_type = self.compression
+ if zinfo.filename[-1] == '/':
+ zinfo.external_attr = 0o40775 << 16 # drwxrwxr-x
+ zinfo.external_attr |= 0x10 # MS-DOS directory flag
+ else:
+ zinfo.external_attr = 0o600 << 16 # ?rw-------
+ else:
+ zinfo = zinfo_or_arcname
+
+ if not self.fp:
+ raise RuntimeError(
+ "Attempt to write to ZIP archive that was already closed")
+
+ if compress_type is not None:
+ zinfo.compress_type = compress_type
+
+ zinfo.file_size = len(bytes) # Uncompressed size
+ zinfo.header_offset = self.fp.tell() # Start of header bytes
+ self._writecheck(zinfo)
+ self._didModify = True
+ zinfo.CRC = crc32(bytes) & 0xffffffff # CRC-32 checksum
+ if zinfo.compress_type == ZIP_DEFLATED:
+ co = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION,
+ zlib.DEFLATED, -15)
+ bytes = co.compress(bytes) + co.flush()
+ zinfo.compress_size = len(bytes) # Compressed size
+ else:
+ zinfo.compress_size = zinfo.file_size
+ zip64 = zinfo.file_size > ZIP64_LIMIT or \
+ zinfo.compress_size > ZIP64_LIMIT
+ if zip64 and not self._allowZip64:
+ raise LargeZipFile("Filesize would require ZIP64 extensions")
+ self.fp.write(zinfo.FileHeader(zip64))
+ self.fp.write(bytes)
+ if zinfo.flag_bits & 0x08:
+ # Write CRC and file sizes after the file data
+ fmt = '<LQQ' if zip64 else '<LLL'
+ self.fp.write(struct.pack(fmt, zinfo.CRC, zinfo.compress_size,
+ zinfo.file_size))
+ self.fp.flush()
+ self.filelist.append(zinfo)
+ self.NameToInfo[zinfo.filename] = zinfo
+
+ def __del__(self):
+ """Call the "close()" method in case the user forgot."""
+ self.close()
+
+ def close(self):
+ """Close the file, and for mode "w" and "a" write the ending
+ records."""
+ if self.fp is None:
+ return
+
+ try:
+ if self.mode in ("w", "a") and self._didModify: # write ending records
+ pos1 = self.fp.tell()
+ for zinfo in self.filelist: # write central directory
+ dt = zinfo.date_time
+ dosdate = (dt[0] - 1980) << 9 | dt[1] << 5 | dt[2]
+ dostime = dt[3] << 11 | dt[4] << 5 | (dt[5] // 2)
+ extra = []
+ if zinfo.file_size > ZIP64_LIMIT \
+ or zinfo.compress_size > ZIP64_LIMIT:
+ extra.append(zinfo.file_size)
+ extra.append(zinfo.compress_size)
+ file_size = 0xffffffff
+ compress_size = 0xffffffff
+ else:
+ file_size = zinfo.file_size
+ compress_size = zinfo.compress_size
+
+ header_offset = zinfo.header_offset - self._start_disk
+ if header_offset > ZIP64_LIMIT:
+ extra.append(header_offset)
+ header_offset = 0xffffffffL
+
+ extra_data = zinfo.extra
+ if extra:
+ # Append a ZIP64 field to the extra's
+ extra_data = struct.pack(
+ '<HH' + 'Q'*len(extra),
+ 1, 8*len(extra), *extra) + extra_data
+
+ extract_version = max(45, zinfo.extract_version)
+ create_version = max(45, zinfo.create_version)
+ else:
+ extract_version = zinfo.extract_version
+ create_version = zinfo.create_version
+
+ try:
+ filename, flag_bits = zinfo._encodeFilenameFlags()
+ centdir = struct.pack(structCentralDir,
+ stringCentralDir, create_version,
+ zinfo.create_system, extract_version, zinfo.reserved,
+ flag_bits, zinfo.compress_type, dostime, dosdate,
+ zinfo.CRC, compress_size, file_size,
+ len(filename), len(extra_data), len(zinfo.comment),
+ 0, zinfo.internal_attr, zinfo.external_attr,
+ header_offset)
+ except DeprecationWarning:
+ print >>sys.stderr, (structCentralDir,
+ stringCentralDir, create_version,
+ zinfo.create_system, extract_version, zinfo.reserved,
+ zinfo.flag_bits, zinfo.compress_type, dostime, dosdate,
+ zinfo.CRC, compress_size, file_size,
+ len(zinfo.filename), len(extra_data), len(zinfo.comment),
+ 0, zinfo.internal_attr, zinfo.external_attr,
+ header_offset)
+ raise
+ self.fp.write(centdir)
+ self.fp.write(filename)
+ self.fp.write(extra_data)
+ self.fp.write(zinfo.comment)
+
+ pos2 = self.fp.tell()
+ # Write end-of-zip-archive record
+ centDirCount = len(self.filelist)
+ centDirSize = pos2 - pos1
+ centDirOffset = pos1 - self._start_disk
+ requires_zip64 = None
+ if centDirCount > ZIP_FILECOUNT_LIMIT:
+ requires_zip64 = "Files count"
+ elif centDirOffset > ZIP64_LIMIT:
+ requires_zip64 = "Central directory offset"
+ elif centDirSize > ZIP64_LIMIT:
+ requires_zip64 = "Central directory size"
+ if requires_zip64:
+ # Need to write the ZIP64 end-of-archive records
+ if not self._allowZip64:
+ raise LargeZipFile(requires_zip64 +
+ " would require ZIP64 extensions")
+ zip64endrec = struct.pack(
+ structEndArchive64, stringEndArchive64,
+ 44, 45, 45, 0, 0, centDirCount, centDirCount,
+ centDirSize, centDirOffset)
+ self.fp.write(zip64endrec)
+
+ zip64locrec = struct.pack(
+ structEndArchive64Locator,
+ stringEndArchive64Locator, 0, pos2, 1)
+ self.fp.write(zip64locrec)
+ centDirCount = min(centDirCount, 0xFFFF)
+ centDirSize = min(centDirSize, 0xFFFFFFFF)
+ centDirOffset = min(centDirOffset, 0xFFFFFFFF)
+
+ endrec = struct.pack(structEndArchive, stringEndArchive,
+ 0, 0, centDirCount, centDirCount,
+ centDirSize, centDirOffset, len(self._comment))
+ self.fp.write(endrec)
+ self.fp.write(self._comment)
+ self.fp.flush()
+ finally:
+ fp = self.fp
+ self.fp = None
+ if not self._filePassed:
+ fp.close()
+
+
+class PyZipFile(ZipFile):
+ """Class to create ZIP archives with Python library files and packages."""
+
+ def writepy(self, pathname, basename = ""):
+ """Add all files from "pathname" to the ZIP archive.
+
+ If pathname is a package directory, search the directory and
+ all package subdirectories recursively for all *.py and enter
+ the modules into the archive. If pathname is a plain
+ directory, listdir *.py and enter all modules. Else, pathname
+ must be a Python *.py file and the module will be put into the
+ archive. Added modules are always module.pyo or module.pyc.
+ This method will compile the module.py into module.pyc if
+ necessary.
+ """
+ dir, name = os.path.split(pathname)
+ if os.path.isdir(pathname):
+ initname = os.path.join(pathname, "__init__.py")
+ if os.path.isfile(initname):
+ # This is a package directory, add it
+ if basename:
+ basename = "%s/%s" % (basename, name)
+ else:
+ basename = name
+ if self.debug:
+ print "Adding package in", pathname, "as", basename
+ fname, arcname = self._get_codename(initname[0:-3], basename)
+ if self.debug:
+ print "Adding", arcname
+ self.write(fname, arcname)
+ dirlist = os.listdir(pathname)
+ dirlist.remove("__init__.py")
+ # Add all *.py files and package subdirectories
+ for filename in dirlist:
+ path = os.path.join(pathname, filename)
+ root, ext = os.path.splitext(filename)
+ if os.path.isdir(path):
+ if os.path.isfile(os.path.join(path, "__init__.py")):
+ # This is a package directory, add it
+ self.writepy(path, basename) # Recursive call
+ elif ext == ".py":
+ fname, arcname = self._get_codename(path[0:-3],
+ basename)
+ if self.debug:
+ print "Adding", arcname
+ self.write(fname, arcname)
+ else:
+ # This is NOT a package directory, add its files at top level
+ if self.debug:
+ print "Adding files from directory", pathname
+ for filename in os.listdir(pathname):
+ path = os.path.join(pathname, filename)
+ root, ext = os.path.splitext(filename)
+ if ext == ".py":
+ fname, arcname = self._get_codename(path[0:-3],
+ basename)
+ if self.debug:
+ print "Adding", arcname
+ self.write(fname, arcname)
+ else:
+ if pathname[-3:] != ".py":
+ raise RuntimeError, \
+ 'Files added with writepy() must end with ".py"'
+ fname, arcname = self._get_codename(pathname[0:-3], basename)
+ if self.debug:
+ print "Adding file", arcname
+ self.write(fname, arcname)
+
+ def _get_codename(self, pathname, basename):
+ """Return (filename, archivename) for the path.
+
+ Given a module name path, return the correct file path and
+ archive name, compiling if necessary. For example, given
+ /python/lib/string, return (/python/lib/string.pyc, string).
+ """
+ file_py = pathname + ".py"
+ file_pyc = pathname + ".pyc"
+ file_pyo = pathname + ".pyo"
+ if os.path.isfile(file_pyo) and \
+ os.stat(file_pyo).st_mtime >= os.stat(file_py).st_mtime:
+ fname = file_pyo # Use .pyo file
+ elif not os.path.isfile(file_pyc) or \
+ os.stat(file_pyc).st_mtime < os.stat(file_py).st_mtime:
+ import py_compile
+ if self.debug:
+ print "Compiling", file_py
+ try:
+ py_compile.compile(file_py, file_pyc, None, True)
+ except py_compile.PyCompileError,err:
+ print err.msg
+ fname = file_pyc
+ else:
+ fname = file_pyc
+ archivename = os.path.split(fname)[1]
+ if basename:
+ archivename = "%s/%s" % (basename, archivename)
+ return (fname, archivename)
+
+
+def main(args = None):
+ import textwrap
+ USAGE=textwrap.dedent("""\
+ Usage:
+ zipfile.py -l zipfile.zip # Show listing of a zipfile
+ zipfile.py -t zipfile.zip # Test if a zipfile is valid
+ zipfile.py -e zipfile.zip target # Extract zipfile into target dir
+ zipfile.py -c zipfile.zip src ... # Create zipfile from sources
+ """)
+ if args is None:
+ args = sys.argv[1:]
+
+ if not args or args[0] not in ('-l', '-c', '-e', '-t'):
+ print USAGE
+ sys.exit(1)
+
+ if args[0] == '-l':
+ if len(args) != 2:
+ print USAGE
+ sys.exit(1)
+ with ZipFile(args[1], 'r') as zf:
+ zf.printdir()
+
+ elif args[0] == '-t':
+ if len(args) != 2:
+ print USAGE
+ sys.exit(1)
+ with ZipFile(args[1], 'r') as zf:
+ badfile = zf.testzip()
+ if badfile:
+ print("The following enclosed file is corrupted: {!r}".format(badfile))
+ print "Done testing"
+
+ elif args[0] == '-e':
+ if len(args) != 3:
+ print USAGE
+ sys.exit(1)
+
+ with ZipFile(args[1], 'r') as zf:
+ zf.extractall(args[2])
+
+ elif args[0] == '-c':
+ if len(args) < 3:
+ print USAGE
+ sys.exit(1)
+
+ def addToZip(zf, path, zippath):
+ if os.path.isfile(path):
+ zf.write(path, zippath, ZIP_DEFLATED)
+ elif os.path.isdir(path):
+ if zippath:
+ zf.write(path, zippath)
+ for nm in os.listdir(path):
+ addToZip(zf,
+ os.path.join(path, nm), os.path.join(zippath, nm))
+ # else: ignore
+
+ with ZipFile(args[1], 'w', allowZip64=True) as zf:
+ for path in args[2:]:
+ zippath = os.path.basename(path)
+ if not zippath:
+ zippath = os.path.basename(os.path.dirname(path))
+ if zippath in ('', os.curdir, os.pardir):
+ zippath = ''
+ addToZip(zf, path, zippath)
+
+if __name__ == "__main__":
+ main()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/tracing/tracing/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/tracing/tracing/__init__.py
new file mode 100644
index 0000000..76063aa
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/tracing/tracing/__init__.py
@@ -0,0 +1,6 @@
+# Copyright (c) 2016 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import tracing_project
+tracing_project.UpdateSysPathIfNeeded()
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/tracing/tracing/trace_data/__init__.py b/love2dToAPK/tools/tools/adb/systrace/catapult/tracing/tracing/trace_data/__init__.py
new file mode 100644
index 0000000..bdb1f26
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/tracing/tracing/trace_data/__init__.py
@@ -0,0 +1,4 @@
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/tracing/tracing/trace_data/trace_data.py b/love2dToAPK/tools/tools/adb/systrace/catapult/tracing/tracing/trace_data/trace_data.py
new file mode 100644
index 0000000..e6a62ff
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/tracing/tracing/trace_data/trace_data.py
@@ -0,0 +1,339 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import copy
+import json
+import logging
+import os
+import shutil
+import subprocess
+import tempfile
+
+
+_TRACING_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)),
+ os.path.pardir, os.path.pardir)
+_TRACE2HTML_PATH = os.path.join(_TRACING_DIR, 'bin', 'trace2html')
+
+
+class NonSerializableTraceData(Exception):
+ """Raised when raw trace data cannot be serialized to TraceData."""
+ pass
+
+
+class TraceDataPart(object):
+ """TraceData can have a variety of events.
+
+ These are called "parts" and are accessed by the following fixed field names.
+ """
+ def __init__(self, raw_field_name):
+ self._raw_field_name = raw_field_name
+
+ def __repr__(self):
+ return 'TraceDataPart("%s")' % self._raw_field_name
+
+ @property
+ def raw_field_name(self):
+ return self._raw_field_name
+
+ def __eq__(self, other):
+ return self.raw_field_name == other.raw_field_name
+
+ def __hash__(self):
+ return hash(self.raw_field_name)
+
+
+ANDROID_PROCESS_DATA_PART = TraceDataPart('androidProcessDump')
+ATRACE_PART = TraceDataPart('systemTraceEvents')
+BATTOR_TRACE_PART = TraceDataPart('powerTraceAsString')
+CHROME_TRACE_PART = TraceDataPart('traceEvents')
+CPU_TRACE_DATA = TraceDataPart('cpuSnapshots')
+INSPECTOR_TRACE_PART = TraceDataPart('inspectorTimelineEvents')
+SURFACE_FLINGER_PART = TraceDataPart('surfaceFlinger')
+TAB_ID_PART = TraceDataPart('tabIds')
+TELEMETRY_PART = TraceDataPart('telemetry')
+WALT_TRACE_PART = TraceDataPart('waltTraceEvents')
+
+ALL_TRACE_PARTS = {ANDROID_PROCESS_DATA_PART,
+ ATRACE_PART,
+ BATTOR_TRACE_PART,
+ CHROME_TRACE_PART,
+ CPU_TRACE_DATA,
+ INSPECTOR_TRACE_PART,
+ SURFACE_FLINGER_PART,
+ TAB_ID_PART,
+ TELEMETRY_PART}
+
+ALL_TRACE_PARTS_RAW_NAMES = set(k.raw_field_name for k in ALL_TRACE_PARTS)
+
+def _HasTraceFor(part, raw):
+ assert isinstance(part, TraceDataPart)
+ if part.raw_field_name not in raw:
+ return False
+ return len(raw[part.raw_field_name]) > 0
+
+
+def _GetFilePathForTrace(trace, dir_path):
+ """ Return path to a file that contains |trace|.
+
+ Note: if |trace| is an instance of TraceFileHandle, this reuses the trace path
+ that the trace file handle holds. Otherwise, it creates a new trace file
+ in |dir_path| directory.
+ """
+ if isinstance(trace, TraceFileHandle):
+ return trace.file_path
+ with tempfile.NamedTemporaryFile(mode='w', dir=dir_path, delete=False) as fp:
+ if isinstance(trace, basestring):
+ fp.write(trace)
+ elif isinstance(trace, dict) or isinstance(trace, list):
+ json.dump(trace, fp)
+ else:
+ raise TypeError('Trace is of unknown type.')
+ return fp.name
+
+
+class TraceData(object):
+ """ TraceData holds a collection of traces from multiple sources.
+
+ A TraceData can have multiple active parts. Each part represents traces
+ collected from a different trace agent.
+ """
+ def __init__(self):
+ """Creates TraceData from the given data."""
+ self._raw_data = {}
+ self._events_are_safely_mutable = False
+
+ def _SetFromBuilder(self, d):
+ self._raw_data = d
+ self._events_are_safely_mutable = True
+
+ @property
+ def events_are_safely_mutable(self):
+ """Returns true if the events in this value are completely sealed.
+
+ Some importers want to take complex fields out of the TraceData and add
+ them to the model, changing them subtly as they do so. If the TraceData
+ was constructed with data that is shared with something outside the trace
+ data, for instance a test harness, then this mutation is unexpected. But,
+ if the values are sealed, then mutating the events is a lot faster.
+
+ We know if events are sealed if the value came from a string, or if the
+ value came from a TraceDataBuilder.
+ """
+ return self._events_are_safely_mutable
+
+ @property
+ def active_parts(self):
+ return {p for p in ALL_TRACE_PARTS if p.raw_field_name in self._raw_data}
+
+ def HasTracesFor(self, part):
+ return _HasTraceFor(part, self._raw_data)
+
+ def GetTracesFor(self, part):
+ """ Return the list of traces for |part| in string or dictionary forms.
+
+ Note: since this API return the traces that can be directly accessed in
+ memory, it may require lots of memory usage as some of the trace can be
+ very big.
+ For references, we have cases where Telemetry is OOM'ed because the memory
+ required for processing the trace in Python is too big (crbug.com/672097).
+ """
+ assert isinstance(part, TraceDataPart)
+ if not self.HasTracesFor(part):
+ return []
+ traces_list = self._raw_data[part.raw_field_name]
+ # Since this API return the traces in memory form, and since the memory
+ # bottleneck of Telemetry is for keeping trace in memory, there is no uses
+ # in keeping the on-disk form of tracing beyond this point. Hence we convert
+ # all traces for part of form TraceFileHandle to the JSON form.
+ for i, data in enumerate(traces_list):
+ if isinstance(data, TraceFileHandle):
+ traces_list[i] = data.AsTraceData()
+ return traces_list
+
+ def GetTraceFor(self, part):
+ assert isinstance(part, TraceDataPart)
+ traces = self.GetTracesFor(part)
+ assert len(traces) == 1
+ return traces[0]
+
+ def CleanUpAllTraces(self):
+ """ Remove all the traces that this has handles to.
+
+ Those include traces stored in memory & on disk. After invoking this,
+ one can no longer uses this object for collecting the traces.
+ """
+ for traces_list in self._raw_data.itervalues():
+ for trace in traces_list:
+ if isinstance(trace, TraceFileHandle):
+ trace.Clean()
+ self._raw_data = {}
+
+ def Serialize(self, file_path, trace_title=''):
+ """Serializes the trace result to |file_path|.
+
+ """
+ if not self._raw_data:
+ logging.warning('No traces to convert to html.')
+ return
+ temp_dir = tempfile.mkdtemp()
+ trace_files = []
+ try:
+ trace_size_data = {}
+ for part, traces_list in self._raw_data.iteritems():
+ for trace in traces_list:
+ path = _GetFilePathForTrace(trace, temp_dir)
+ trace_size_data.setdefault(part, 0)
+ trace_size_data[part] += os.path.getsize(path)
+ trace_files.append(path)
+ logging.info('Trace sizes in bytes: %s', trace_size_data)
+
+ cmd = (['python', _TRACE2HTML_PATH] + trace_files +
+ ['--output', file_path] + ['--title', trace_title])
+ subprocess.check_output(cmd)
+ finally:
+ shutil.rmtree(temp_dir)
+
+
+class TraceFileHandle(object):
+ """A trace file handle object allows storing trace data on disk.
+
+ TraceFileHandle API allows one to collect traces from Chrome into disk instead
+ of keeping them in memory. This is important for keeping memory usage of
+ Telemetry low to avoid OOM (see:
+ https://github.com/catapult-project/catapult/issues/3119).
+
+ The fact that this uses a file underneath to store tracing data means the
+ callsite is repsonsible for discarding the file when they no longer need the
+ tracing data. Call TraceFileHandle.Clean when you done using this object.
+ """
+ def __init__(self):
+ self._backing_file = None
+ self._file_path = None
+ self._trace_data = None
+
+ def Open(self):
+ assert not self._backing_file and not self._file_path
+ self._backing_file = tempfile.NamedTemporaryFile(delete=False, mode='a')
+
+ def AppendTraceData(self, partial_trace_data):
+ assert isinstance(partial_trace_data, basestring)
+ self._backing_file.write(partial_trace_data)
+
+ @property
+ def file_path(self):
+ assert self._file_path, (
+ 'Either the handle need to be closed first or this handle is cleaned')
+ return self._file_path
+
+ def Close(self):
+ assert self._backing_file
+ self._backing_file.close()
+ self._file_path = self._backing_file.name
+ self._backing_file = None
+
+ def AsTraceData(self):
+ """Get the object form of trace data that this handle manages.
+
+ *Warning: this can have large memory footprint if the trace data is big.
+
+ Since this requires the in-memory form of the trace, it is no longer useful
+ to still keep the backing file underneath, invoking this will also discard
+ the file to avoid the risk of leaking the backing trace file.
+ """
+ if self._trace_data:
+ return self._trace_data
+ assert self._file_path
+ with open(self._file_path) as f:
+ self._trace_data = json.load(f)
+ self.Clean()
+ return self._trace_data
+
+ def Clean(self):
+ """Remove the backing file used for storing trace on disk.
+
+ This should be called when and only when you no longer need to use
+ TraceFileHandle.
+ """
+ assert self._file_path
+ os.remove(self._file_path)
+ self._file_path = None
+
+
+class TraceDataBuilder(object):
+ """TraceDataBuilder helps build up a trace from multiple trace agents.
+
+ TraceData is supposed to be immutable, but it is useful during recording to
+ have a mutable version. That is TraceDataBuilder.
+ """
+ def __init__(self):
+ self._raw_data = {}
+
+ def AsData(self):
+ if self._raw_data == None:
+ raise Exception('Can only AsData once')
+ data = TraceData()
+ data._SetFromBuilder(self._raw_data)
+ self._raw_data = None
+ return data
+
+ def AddTraceFor(self, part, trace):
+ assert isinstance(part, TraceDataPart), part
+ if part == CHROME_TRACE_PART:
+ assert (isinstance(trace, dict) or
+ isinstance(trace, list) or
+ isinstance(trace, TraceFileHandle))
+ else:
+ assert (isinstance(trace, basestring) or
+ isinstance(trace, dict) or
+ isinstance(trace, list))
+
+ if self._raw_data == None:
+ raise Exception('Already called AsData() on this builder.')
+
+ self._raw_data.setdefault(part.raw_field_name, [])
+ self._raw_data[part.raw_field_name].append(trace)
+
+ def HasTracesFor(self, part):
+ return _HasTraceFor(part, self._raw_data)
+
+
+def CreateTraceDataFromRawData(raw_data):
+ """Convenient method for creating a TraceData object from |raw_data|.
+ This is mostly used for testing.
+
+ Args:
+ raw_data can be:
+ + A dictionary that repsents multiple trace parts. Keys of the
+ dictionary must always contain 'traceEvents', as chrome trace
+ must always present.
+ + A list that represents Chrome trace events.
+ + JSON string of either above.
+
+ """
+ raw_data = copy.deepcopy(raw_data)
+ if isinstance(raw_data, basestring):
+ json_data = json.loads(raw_data)
+ else:
+ json_data = raw_data
+
+ b = TraceDataBuilder()
+ if not json_data:
+ return b.AsData()
+ if isinstance(json_data, dict):
+ assert 'traceEvents' in json_data, 'Only raw chrome trace is supported'
+ trace_parts_keys = []
+ for k in json_data:
+ if k != 'traceEvents' and k in ALL_TRACE_PARTS_RAW_NAMES:
+ trace_parts_keys.append(k)
+ b.AddTraceFor(TraceDataPart(k), json_data[k])
+ # Delete the data for extra keys to form trace data for Chrome part only.
+ for k in trace_parts_keys:
+ del json_data[k]
+ b.AddTraceFor(CHROME_TRACE_PART, json_data)
+ elif isinstance(json_data, list):
+ b.AddTraceFor(CHROME_TRACE_PART, {'traceEvents': json_data})
+ else:
+ raise NonSerializableTraceData('Unrecognized data format.')
+ return b.AsData()
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/tracing/tracing/trace_data/trace_data_unittest.py b/love2dToAPK/tools/tools/adb/systrace/catapult/tracing/tracing/trace_data/trace_data_unittest.py
new file mode 100644
index 0000000..b065b4f
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/tracing/tracing/trace_data/trace_data_unittest.py
@@ -0,0 +1,103 @@
+# Copyright 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import datetime
+import exceptions
+import os
+import shutil
+import tempfile
+import unittest
+
+from tracing.trace_data import trace_data
+from tracing_build import html2trace
+
+
+class TraceDataTest(unittest.TestCase):
+ def testSerialize(self):
+ test_dir = tempfile.mkdtemp()
+ trace_path = os.path.join(test_dir, 'test_trace.json')
+ try:
+ ri = trace_data.CreateTraceDataFromRawData({'traceEvents': [1, 2, 3]})
+ ri.Serialize(trace_path)
+ with open(trace_path) as f:
+ json_traces = html2trace.ReadTracesFromHTMLFilePath(f)
+ self.assertEqual(json_traces, [{'traceEvents': [1, 2, 3]}])
+ finally:
+ shutil.rmtree(test_dir)
+
+ def testEmptyArrayValue(self):
+ # We can import empty lists and empty string.
+ d = trace_data.CreateTraceDataFromRawData([])
+ self.assertFalse(d.HasTracesFor(trace_data.CHROME_TRACE_PART))
+
+ def testInvalidTrace(self):
+ with self.assertRaises(AssertionError):
+ trace_data.CreateTraceDataFromRawData({'hello': 1})
+
+ def testListForm(self):
+ d = trace_data.CreateTraceDataFromRawData([{'ph': 'B'}])
+ self.assertTrue(d.HasTracesFor(trace_data.CHROME_TRACE_PART))
+ events = d.GetTracesFor(trace_data.CHROME_TRACE_PART)[0].get(
+ 'traceEvents', [])
+ self.assertEquals(1, len(events))
+
+ def testStringForm(self):
+ d = trace_data.CreateTraceDataFromRawData('[{"ph": "B"}]')
+ self.assertTrue(d.HasTracesFor(trace_data.CHROME_TRACE_PART))
+ events = d.GetTracesFor(trace_data.CHROME_TRACE_PART)[0].get(
+ 'traceEvents', [])
+ self.assertEquals(1, len(events))
+
+
+class TraceDataBuilderTest(unittest.TestCase):
+ def testBasicChrome(self):
+ builder = trace_data.TraceDataBuilder()
+ builder.AddTraceFor(trace_data.CHROME_TRACE_PART,
+ {'traceEvents': [1, 2, 3]})
+ builder.AddTraceFor(trace_data.TAB_ID_PART, ['tab-7'])
+ builder.AddTraceFor(trace_data.BATTOR_TRACE_PART, 'battor data here')
+
+ d = builder.AsData()
+ self.assertTrue(d.HasTracesFor(trace_data.CHROME_TRACE_PART))
+ self.assertTrue(d.HasTracesFor(trace_data.TAB_ID_PART))
+ self.assertTrue(d.HasTracesFor(trace_data.BATTOR_TRACE_PART))
+
+ self.assertRaises(Exception, builder.AsData)
+
+ def testSetTraceFor(self):
+ telemetry_trace = {
+ 'traceEvents': [1, 2, 3],
+ 'metadata': {
+ 'field1': 'value1'
+ }
+ }
+
+ builder = trace_data.TraceDataBuilder()
+ builder.AddTraceFor(trace_data.TELEMETRY_PART, telemetry_trace)
+ d = builder.AsData()
+
+ self.assertEqual(d.GetTracesFor(trace_data.TELEMETRY_PART),
+ [telemetry_trace])
+
+ def testSetTraceForRaisesWithInvalidPart(self):
+ builder = trace_data.TraceDataBuilder()
+
+ self.assertRaises(exceptions.AssertionError,
+ lambda: builder.AddTraceFor('not_a_trace_part', {}))
+
+ def testSetTraceForRaisesWithInvalidTrace(self):
+ builder = trace_data.TraceDataBuilder()
+
+ self.assertRaises(
+ exceptions.AssertionError,
+ lambda: builder.AddTraceFor(trace_data.TELEMETRY_PART,
+ datetime.time.min))
+
+ def testSetTraceForRaisesAfterAsData(self):
+ builder = trace_data.TraceDataBuilder()
+ builder.AsData()
+
+ self.assertRaises(
+ exceptions.Exception,
+ lambda: builder.AddTraceFor(trace_data.TELEMETRY_PART, {}))
diff --git a/love2dToAPK/tools/tools/adb/systrace/catapult/tracing/tracing_project.py b/love2dToAPK/tools/tools/adb/systrace/catapult/tracing/tracing_project.py
new file mode 100644
index 0000000..3bdcb4e
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/catapult/tracing/tracing_project.py
@@ -0,0 +1,196 @@
+# Copyright (c) 2014 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import sys
+import os
+import re
+
+
+def _AddToPathIfNeeded(path):
+ if path not in sys.path:
+ sys.path.insert(0, path)
+
+
+def UpdateSysPathIfNeeded():
+ p = TracingProject()
+ _AddToPathIfNeeded(p.catapult_path)
+ _AddToPathIfNeeded(p.py_vulcanize_path)
+ _AddToPathIfNeeded(p.vinn_path)
+
+ _AddToPathIfNeeded(os.path.join(p.catapult_third_party_path, 'WebOb'))
+ _AddToPathIfNeeded(os.path.join(p.catapult_third_party_path, 'Paste'))
+ _AddToPathIfNeeded(os.path.join(p.catapult_third_party_path, 'six'))
+ _AddToPathIfNeeded(os.path.join(p.catapult_third_party_path, 'webapp2'))
+
+
+def _FindAllFilesRecursive(source_paths):
+ assert isinstance(source_paths, list)
+ all_filenames = set()
+ for source_path in source_paths:
+ for dirpath, _, filenames in os.walk(source_path):
+ for f in filenames:
+ if f.startswith('.'):
+ continue
+ x = os.path.abspath(os.path.join(dirpath, f))
+ all_filenames.add(x)
+ return all_filenames
+
+def _IsFilenameATest(x):
+ if x.endswith('_test.js'):
+ return True
+
+ if x.endswith('_test.html'):
+ return True
+
+ if x.endswith('_unittest.js'):
+ return True
+
+ if x.endswith('_unittest.html'):
+ return True
+
+ # TODO(nduca): Add content test?
+ return False
+
+
+class TracingProject(object):
+ catapult_path = os.path.abspath(
+ os.path.join(os.path.dirname(__file__), os.path.pardir))
+
+ tracing_root_path = os.path.join(catapult_path, 'tracing')
+ trace_processor_root_path = os.path.join(catapult_path, 'trace_processor')
+ tracing_src_path = os.path.join(tracing_root_path, 'tracing')
+ extras_path = os.path.join(tracing_src_path, 'extras')
+ ui_extras_path = os.path.join(tracing_src_path, 'ui', 'extras')
+
+ catapult_third_party_path = os.path.join(catapult_path, 'third_party')
+ polymer_path = os.path.join(catapult_third_party_path, 'polymer')
+
+ tracing_third_party_path = os.path.join(tracing_root_path, 'third_party')
+ py_vulcanize_path = os.path.join(catapult_third_party_path, 'py_vulcanize')
+ vinn_path = os.path.join(catapult_third_party_path, 'vinn')
+
+ jszip_path = os.path.join(tracing_third_party_path, 'jszip')
+
+ glmatrix_path = os.path.join(
+ tracing_third_party_path, 'gl-matrix', 'dist')
+
+ mannwhitneyu_path = os.path.join(
+ tracing_third_party_path, 'mannwhitneyu')
+
+ ui_path = os.path.join(tracing_src_path, 'ui')
+ d3_path = os.path.join(tracing_third_party_path, 'd3')
+ chai_path = os.path.join(tracing_third_party_path, 'chai')
+ mocha_path = os.path.join(tracing_third_party_path, 'mocha')
+ oboe_path = os.path.join(tracing_third_party_path, 'oboe')
+
+ mre_path = os.path.join(tracing_src_path, 'mre')
+
+ metrics_path = os.path.join(tracing_src_path, 'metrics')
+ diagnostics_path = os.path.join(tracing_src_path, 'value', 'diagnostics')
+
+ value_ui_path = os.path.join(tracing_src_path, 'value', 'ui')
+ metrics_ui_path = os.path.join(tracing_src_path, 'metrics', 'ui')
+
+ test_data_path = os.path.join(tracing_root_path, 'test_data')
+ skp_data_path = os.path.join(tracing_root_path, 'skp_data')
+
+ rjsmin_path = os.path.join(
+ tracing_third_party_path, 'tvcm', 'third_party', 'rjsmin')
+ rcssmin_path = os.path.join(
+ tracing_third_party_path, 'tvcm', 'third_party', 'rcssmin')
+
+ def __init__(self):
+ self.source_paths = []
+ self.source_paths.append(self.tracing_root_path)
+ self.source_paths.append(self.polymer_path)
+ self.source_paths.append(self.tracing_third_party_path)
+ self.source_paths.append(self.mre_path)
+ self.source_paths.append(self.jszip_path)
+ self.source_paths.append(self.glmatrix_path)
+ self.source_paths.append(self.mannwhitneyu_path)
+ self.source_paths.append(self.d3_path)
+ self.source_paths.append(self.chai_path)
+ self.source_paths.append(self.mocha_path)
+ self.source_paths.append(self.oboe_path)
+
+ def CreateVulcanizer(self):
+ from py_vulcanize import project as project_module
+ return project_module.Project(self.source_paths)
+
+ def IsD8CompatibleFile(self, filename):
+ if filename.startswith(self.ui_path):
+ return False
+
+ if filename.startswith(self.value_ui_path):
+ return False
+
+ if filename.startswith(self.metrics_ui_path):
+ return False
+
+ return True
+
+ def FindAllTestModuleRelPaths(self, pred=None):
+ if pred is None:
+ pred = lambda x: True
+
+ all_filenames = _FindAllFilesRecursive([self.tracing_src_path])
+ test_module_filenames = [x for x in all_filenames if
+ _IsFilenameATest(x) and pred(x)]
+ test_module_filenames.sort()
+
+ return [os.path.relpath(x, self.tracing_root_path)
+ for x in test_module_filenames]
+
+ def FindAllMetricsModuleRelPaths(self):
+ all_filenames = _FindAllFilesRecursive([self.tracing_src_path])
+ all_metrics_module_filenames = []
+ for x in all_filenames:
+ if x.startswith(self.metrics_path) and not _IsFilenameATest(x):
+ all_metrics_module_filenames.append(x)
+ all_metrics_module_filenames.sort()
+ return [os.path.relpath(x, self.tracing_root_path)
+ for x in all_metrics_module_filenames]
+
+ def FindAllDiagnosticsModuleRelPaths(self):
+ all_filenames = _FindAllFilesRecursive([self.tracing_src_path])
+ all_diagnostics_module_filenames = []
+ for x in all_filenames:
+ if x.startswith(self.diagnostics_path) and not _IsFilenameATest(x):
+ all_diagnostics_module_filenames.append(x)
+ all_diagnostics_module_filenames.sort()
+ return [os.path.relpath(x, self.tracing_root_path)
+ for x in all_diagnostics_module_filenames]
+
+ def FindAllD8TestModuleRelPaths(self):
+ return self.FindAllTestModuleRelPaths(pred=self.IsD8CompatibleFile)
+
+ def GetConfigNames(self):
+ config_files = [
+ os.path.join(self.ui_extras_path, x)
+ for x in os.listdir(self.ui_extras_path)
+ if x.endswith('_config.html')
+ ]
+
+ config_files = [x for x in config_files if os.path.isfile(x)]
+
+ config_basenames = [os.path.basename(x) for x in config_files]
+ config_names = [re.match('(.+)_config.html$', x).group(1)
+ for x in config_basenames]
+ return config_names
+
+ def GetDefaultConfigName(self):
+ assert 'full' in self.GetConfigNames()
+ return 'full'
+
+ def AddConfigNameOptionToParser(self, parser):
+ choices = self.GetConfigNames()
+ parser.add_argument(
+ '--config', dest='config_name',
+ choices=choices, default=self.GetDefaultConfigName(),
+ help='Picks a browser config. Valid choices: %s' % ', '.join(choices))
+ return choices
+
+ def GetModuleNameForConfigName(self, config_name):
+ return 'tracing.ui.extras.%s_config' % config_name
+
diff --git a/love2dToAPK/tools/tools/adb/systrace/systrace.py b/love2dToAPK/tools/tools/adb/systrace/systrace.py
new file mode 100644
index 0000000..71da650
--- /dev/null
+++ b/love2dToAPK/tools/tools/adb/systrace/systrace.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import sys
+
+version = sys.version_info[:2]
+if version != (2, 7):
+ sys.stderr.write('Systrace does not support Python %d.%d. '
+ 'Please use Python 2.7.\n' % version)
+ sys.exit(1)
+
+systrace_dir = os.path.abspath(
+ os.path.join(os.path.dirname(__file__), 'catapult', 'systrace'))
+sys.path.insert(0, systrace_dir)
+
+def RemoveAllStalePycFiles(base_dir):
+ """Scan directories for old .pyc files without a .py file and delete them."""
+ for dirname, _, filenames in os.walk(base_dir):
+ if '.git' in dirname:
+ continue
+ for filename in filenames:
+ root, ext = os.path.splitext(filename)
+ if ext != '.pyc':
+ continue
+
+ pyc_path = os.path.join(dirname, filename)
+ py_path = os.path.join(dirname, root + '.py')
+
+ try:
+ if not os.path.exists(py_path):
+ os.remove(pyc_path)
+ except OSError:
+ # Wrap OS calls in try/except in case another process touched this file.
+ pass
+
+ try:
+ os.removedirs(dirname)
+ except OSError:
+ # Wrap OS calls in try/except in case another process touched this dir.
+ pass
+
+if __name__ == '__main__':
+ RemoveAllStalePycFiles(os.path.dirname(__file__))
+ from systrace import run_systrace
+ sys.exit(run_systrace.main())
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/NOTICE.txt b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/NOTICE.txt
new file mode 100644
index 0000000..1fdb31d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/NOTICE.txt
@@ -0,0 +1,195 @@
+Notice for all the files in this folder.
+------------------------------------------------------------
+
+
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/aapt.exe b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/aapt.exe
new file mode 100644
index 0000000..691c328
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/aapt.exe
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/aidl.exe b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/aidl.exe
new file mode 100644
index 0000000..48dd36c
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/aidl.exe
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/bcc_compat.exe b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/bcc_compat.exe
new file mode 100644
index 0000000..ab19a04
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/bcc_compat.exe
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/dexdump.exe b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/dexdump.exe
new file mode 100644
index 0000000..b732368
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/dexdump.exe
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/dx.bat b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/dx.bat
new file mode 100644
index 0000000..e2d678b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/dx.bat
@@ -0,0 +1,88 @@
+@echo off
+REM Copyright (C) 2007 The Android Open Source Project
+REM
+REM Licensed under the Apache License, Version 2.0 (the "License");
+REM you may not use this file except in compliance with the License.
+REM You may obtain a copy of the License at
+REM
+REM http://www.apache.org/licenses/LICENSE-2.0
+REM
+REM Unless required by applicable law or agreed to in writing, software
+REM distributed under the License is distributed on an "AS IS" BASIS,
+REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+REM See the License for the specific language governing permissions and
+REM limitations under the License.
+
+REM don't modify the caller's environment
+setlocal
+
+REM Locate dx.jar in the directory where dx.bat was found and start it.
+
+REM Set up prog to be the path of this script, including following symlinks,
+REM and set up progdir to be the fully-qualified pathname of its directory.
+set prog=%~f0
+
+rem Check we have a valid Java.exe in the path.
+set java_exe=
+if exist "%~dp0..\tools\lib\find_java.bat" call "%~dp0..\tools\lib\find_java.bat"
+if exist "%~dp0..\..\tools\lib\find_java.bat" call "%~dp0..\..\tools\lib\find_java.bat"
+if not defined java_exe goto :EOF
+
+set jarfile=dx.jar
+set "frameworkdir=%~dp0"
+rem frameworkdir must not end with a dir sep.
+set "frameworkdir=%frameworkdir:~0,-1%"
+
+if exist "%frameworkdir%\%jarfile%" goto JarFileOk
+ set "frameworkdir=%~dp0lib"
+
+if exist "%frameworkdir%\%jarfile%" goto JarFileOk
+ set "frameworkdir=%~dp0..\framework"
+
+:JarFileOk
+
+set "jarpath=%frameworkdir%\%jarfile%"
+
+set javaOpts=
+set args=
+
+REM By default, give dx a max heap size of 1 gig and a stack size of 1meg.
+rem This can be overridden by using "-JXmx..." and "-JXss..." options below.
+set defaultXmx=-Xmx1024M
+set defaultXss=-Xss1m
+
+REM Capture all arguments that are not -J options.
+REM Note that when reading the input arguments with %1, the cmd.exe
+REM automagically converts --name=value arguments into 2 arguments "--name"
+REM followed by "value". Dx has been changed to know how to deal with that.
+set params=
+
+:firstArg
+if [%1]==[] goto endArgs
+set a=%~1
+
+ if [%defaultXmx%]==[] goto notXmx
+ if %a:~0,5% NEQ -JXmx goto notXmx
+ set defaultXmx=
+ :notXmx
+
+ if [%defaultXss%]==[] goto notXss
+ if %a:~0,5% NEQ -JXss goto notXss
+ set defaultXss=
+ :notXss
+
+ if %a:~0,2% NEQ -J goto notJ
+ set javaOpts=%javaOpts% -%a:~2%
+ shift /1
+ goto firstArg
+
+ :notJ
+ set params=%params% %1
+ shift /1
+ goto firstArg
+
+:endArgs
+
+set javaOpts=%javaOpts% %defaultXmx% %defaultXss%
+call "%java_exe%" %javaOpts% -Djava.ext.dirs="%frameworkdir%" -jar "%jarpath%" %params%
+
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/lib/dx.jar b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/lib/dx.jar
new file mode 100644
index 0000000..bb766fc
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/lib/dx.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/libbcc.dll b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/libbcc.dll
new file mode 100644
index 0000000..6f208a6
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/libbcc.dll
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/libbcinfo.dll b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/libbcinfo.dll
new file mode 100644
index 0000000..af76b3e
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/libbcinfo.dll
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/CMakeLists.txt b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/CMakeLists.txt
new file mode 100644
index 0000000..8be33b7
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/CMakeLists.txt
@@ -0,0 +1,108 @@
+set(files
+ altivec.h
+ ammintrin.h
+ avxintrin.h
+ avx2intrin.h
+ bmiintrin.h
+ bmi2intrin.h
+ emmintrin.h
+ f16cintrin.h
+ float.h
+ fma4intrin.h
+ fmaintrin.h
+ immintrin.h
+ iso646.h
+ limits.h
+ lzcntintrin.h
+ mm3dnow.h
+ mmintrin.h
+ mm_malloc.h
+ nmmintrin.h
+ pmmintrin.h
+ popcntintrin.h
+ prfchwintrin.h
+ rdseedintrin.h
+ rtmintrin.h
+ smmintrin.h
+ stdalign.h
+ stdarg.h
+ stdbool.h
+ stddef.h
+ stdint.h
+ stdnoreturn.h
+ tgmath.h
+ tmmintrin.h
+ varargs.h
+ wmmintrin.h
+ __wmmintrin_aes.h
+ __wmmintrin_pclmul.h
+ x86intrin.h
+ xmmintrin.h
+ xopintrin.h
+ cpuid.h
+ unwind.h
+ module.map
+ )
+
+set(output_dir ${LLVM_BINARY_DIR}/lib/clang/${CLANG_VERSION}/include)
+
+# If we are in an IDE that has a configuration directory, we need to
+# create a second copy of the headers so that 'clang' can find them if
+# it's run from the build directory.
+if(MSVC_IDE OR XCODE)
+ set(other_output_dir ${LLVM_BINARY_DIR}/bin/lib/clang/${CLANG_VERSION}/include)
+endif()
+
+# Generate arm_neon.h
+clang_tablegen(arm_neon.h.inc -gen-arm-neon
+ SOURCE ${CLANG_SOURCE_DIR}/include/clang/Basic/arm_neon.td)
+
+set(out_files)
+foreach( f ${files} )
+ set( src ${CMAKE_CURRENT_SOURCE_DIR}/${f} )
+ set( dst ${output_dir}/${f} )
+ add_custom_command(OUTPUT ${dst}
+ DEPENDS ${src}
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst}
+ COMMENT "Copying clang's ${f}...")
+ list(APPEND out_files ${dst})
+
+ if(other_output_dir)
+ set(other_dst ${other_output_dir}/${f})
+ add_custom_command(OUTPUT ${other_dst}
+ DEPENDS ${src}
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${other_dst}
+ COMMENT "Copying clang's ${f}...")
+ list(APPEND out_files ${other_dst})
+ endif()
+endforeach( f )
+
+add_custom_command(OUTPUT ${output_dir}/arm_neon.h
+ DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/arm_neon.h.inc
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/arm_neon.h.inc ${output_dir}/arm_neon.h
+ COMMENT "Copying clang's arm_neon.h...")
+list(APPEND out_files ${output_dir}/arm_neon.h)
+
+if (other_output_dir)
+ set(other_dst ${other_output_dir}/arm_neon.h)
+ add_custom_command(OUTPUT ${other_dst}
+ DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/arm_neon.h.inc
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_BINARY_DIR}/arm_neon.h.inc ${other_dst}
+ COMMENT "Copying clang's arm_neon.h...")
+ list(APPEND out_files ${other_dst})
+endif ()
+
+add_custom_target(clang-headers ALL DEPENDS ${out_files})
+set_target_properties(clang-headers PROPERTIES FOLDER "Misc")
+
+if (other_output_dir)
+ if(UNIX)
+ add_custom_command(TARGET clang-headers POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E make_directory "${LLVM_BINARY_DIR}/lib/${CMAKE_CFG_INTDIR}"
+ COMMAND ${CMAKE_COMMAND} -E create_symlink "${LLVM_BINARY_DIR}/bin/lib/clang" "${LLVM_BINARY_DIR}/lib/${CMAKE_CFG_INTDIR}/clang")
+ endif()
+endif ()
+
+install(FILES ${files} ${output_dir}/arm_neon.h
+ PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
+ DESTINATION lib${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION}/include)
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/LICENSE.TXT b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/LICENSE.TXT
new file mode 100644
index 0000000..e31223a
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/LICENSE.TXT
@@ -0,0 +1,63 @@
+==============================================================================
+LLVM Release License
+==============================================================================
+University of Illinois/NCSA
+Open Source License
+
+Copyright (c) 2007-2013 University of Illinois at Urbana-Champaign.
+All rights reserved.
+
+Developed by:
+
+ LLVM Team
+
+ University of Illinois at Urbana-Champaign
+
+ http://llvm.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal with
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimers.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimers in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the names of the LLVM Team, University of Illinois at
+ Urbana-Champaign, nor the names of its contributors may be used to
+ endorse or promote products derived from this Software without specific
+ prior written permission.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
+SOFTWARE.
+
+==============================================================================
+The LLVM software contains code written by third parties. Such software will
+have its own individual LICENSE.TXT file in the directory in which it appears.
+This file will describe the copyrights, license, and restrictions which apply
+to that code.
+
+The disclaimer of warranty in the University of Illinois Open Source License
+applies to all code in the LLVM Distribution, and nothing in any of the
+other licenses gives permission to use the names of the LLVM Team or the
+University of Illinois to endorse or promote products derived from this
+Software.
+
+The following pieces of software have additional or alternate copyrights,
+licenses, and/or restrictions:
+
+Program Directory
+------- ---------
+<none yet>
+
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/altivec.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/altivec.h
new file mode 100644
index 0000000..74ce08a
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/altivec.h
@@ -0,0 +1,11856 @@
+/*===---- altivec.h - Standard header for type generic math ---------------===*\
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+\*===----------------------------------------------------------------------===*/
+
+#ifndef __ALTIVEC_H
+#define __ALTIVEC_H
+
+#ifndef __ALTIVEC__
+#error "AltiVec support not enabled"
+#endif
+
+/* constants for mapping CR6 bits to predicate result. */
+
+#define __CR6_EQ 0
+#define __CR6_EQ_REV 1
+#define __CR6_LT 2
+#define __CR6_LT_REV 3
+
+#define __ATTRS_o_ai __attribute__((__overloadable__, __always_inline__))
+
+static vector signed char __ATTRS_o_ai
+vec_perm(vector signed char __a, vector signed char __b, vector unsigned char __c);
+
+static vector unsigned char __ATTRS_o_ai
+vec_perm(vector unsigned char __a,
+ vector unsigned char __b,
+ vector unsigned char __c);
+
+static vector bool char __ATTRS_o_ai
+vec_perm(vector bool char __a, vector bool char __b, vector unsigned char __c);
+
+static vector short __ATTRS_o_ai
+vec_perm(vector short __a, vector short __b, vector unsigned char __c);
+
+static vector unsigned short __ATTRS_o_ai
+vec_perm(vector unsigned short __a,
+ vector unsigned short __b,
+ vector unsigned char __c);
+
+static vector bool short __ATTRS_o_ai
+vec_perm(vector bool short __a, vector bool short __b, vector unsigned char __c);
+
+static vector pixel __ATTRS_o_ai
+vec_perm(vector pixel __a, vector pixel __b, vector unsigned char __c);
+
+static vector int __ATTRS_o_ai
+vec_perm(vector int __a, vector int __b, vector unsigned char __c);
+
+static vector unsigned int __ATTRS_o_ai
+vec_perm(vector unsigned int __a, vector unsigned int __b, vector unsigned char __c);
+
+static vector bool int __ATTRS_o_ai
+vec_perm(vector bool int __a, vector bool int __b, vector unsigned char __c);
+
+static vector float __ATTRS_o_ai
+vec_perm(vector float __a, vector float __b, vector unsigned char __c);
+
+/* vec_abs */
+
+#define __builtin_altivec_abs_v16qi vec_abs
+#define __builtin_altivec_abs_v8hi vec_abs
+#define __builtin_altivec_abs_v4si vec_abs
+
+static vector signed char __ATTRS_o_ai
+vec_abs(vector signed char __a)
+{
+ return __builtin_altivec_vmaxsb(__a, -__a);
+}
+
+static vector signed short __ATTRS_o_ai
+vec_abs(vector signed short __a)
+{
+ return __builtin_altivec_vmaxsh(__a, -__a);
+}
+
+static vector signed int __ATTRS_o_ai
+vec_abs(vector signed int __a)
+{
+ return __builtin_altivec_vmaxsw(__a, -__a);
+}
+
+static vector float __ATTRS_o_ai
+vec_abs(vector float __a)
+{
+ vector unsigned int __res = (vector unsigned int)__a
+ & (vector unsigned int)(0x7FFFFFFF);
+ return (vector float)__res;
+}
+
+/* vec_abss */
+
+#define __builtin_altivec_abss_v16qi vec_abss
+#define __builtin_altivec_abss_v8hi vec_abss
+#define __builtin_altivec_abss_v4si vec_abss
+
+static vector signed char __ATTRS_o_ai
+vec_abss(vector signed char __a)
+{
+ return __builtin_altivec_vmaxsb
+ (__a, __builtin_altivec_vsubsbs((vector signed char)(0), __a));
+}
+
+static vector signed short __ATTRS_o_ai
+vec_abss(vector signed short __a)
+{
+ return __builtin_altivec_vmaxsh
+ (__a, __builtin_altivec_vsubshs((vector signed short)(0), __a));
+}
+
+static vector signed int __ATTRS_o_ai
+vec_abss(vector signed int __a)
+{
+ return __builtin_altivec_vmaxsw
+ (__a, __builtin_altivec_vsubsws((vector signed int)(0), __a));
+}
+
+/* vec_add */
+
+static vector signed char __ATTRS_o_ai
+vec_add(vector signed char __a, vector signed char __b)
+{
+ return __a + __b;
+}
+
+static vector signed char __ATTRS_o_ai
+vec_add(vector bool char __a, vector signed char __b)
+{
+ return (vector signed char)__a + __b;
+}
+
+static vector signed char __ATTRS_o_ai
+vec_add(vector signed char __a, vector bool char __b)
+{
+ return __a + (vector signed char)__b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_add(vector unsigned char __a, vector unsigned char __b)
+{
+ return __a + __b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_add(vector bool char __a, vector unsigned char __b)
+{
+ return (vector unsigned char)__a + __b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_add(vector unsigned char __a, vector bool char __b)
+{
+ return __a + (vector unsigned char)__b;
+}
+
+static vector short __ATTRS_o_ai
+vec_add(vector short __a, vector short __b)
+{
+ return __a + __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_add(vector bool short __a, vector short __b)
+{
+ return (vector short)__a + __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_add(vector short __a, vector bool short __b)
+{
+ return __a + (vector short)__b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_add(vector unsigned short __a, vector unsigned short __b)
+{
+ return __a + __b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_add(vector bool short __a, vector unsigned short __b)
+{
+ return (vector unsigned short)__a + __b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_add(vector unsigned short __a, vector bool short __b)
+{
+ return __a + (vector unsigned short)__b;
+}
+
+static vector int __ATTRS_o_ai
+vec_add(vector int __a, vector int __b)
+{
+ return __a + __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_add(vector bool int __a, vector int __b)
+{
+ return (vector int)__a + __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_add(vector int __a, vector bool int __b)
+{
+ return __a + (vector int)__b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_add(vector unsigned int __a, vector unsigned int __b)
+{
+ return __a + __b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_add(vector bool int __a, vector unsigned int __b)
+{
+ return (vector unsigned int)__a + __b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_add(vector unsigned int __a, vector bool int __b)
+{
+ return __a + (vector unsigned int)__b;
+}
+
+static vector float __ATTRS_o_ai
+vec_add(vector float __a, vector float __b)
+{
+ return __a + __b;
+}
+
+/* vec_vaddubm */
+
+#define __builtin_altivec_vaddubm vec_vaddubm
+
+static vector signed char __ATTRS_o_ai
+vec_vaddubm(vector signed char __a, vector signed char __b)
+{
+ return __a + __b;
+}
+
+static vector signed char __ATTRS_o_ai
+vec_vaddubm(vector bool char __a, vector signed char __b)
+{
+ return (vector signed char)__a + __b;
+}
+
+static vector signed char __ATTRS_o_ai
+vec_vaddubm(vector signed char __a, vector bool char __b)
+{
+ return __a + (vector signed char)__b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vaddubm(vector unsigned char __a, vector unsigned char __b)
+{
+ return __a + __b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vaddubm(vector bool char __a, vector unsigned char __b)
+{
+ return (vector unsigned char)__a + __b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vaddubm(vector unsigned char __a, vector bool char __b)
+{
+ return __a + (vector unsigned char)__b;
+}
+
+/* vec_vadduhm */
+
+#define __builtin_altivec_vadduhm vec_vadduhm
+
+static vector short __ATTRS_o_ai
+vec_vadduhm(vector short __a, vector short __b)
+{
+ return __a + __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_vadduhm(vector bool short __a, vector short __b)
+{
+ return (vector short)__a + __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_vadduhm(vector short __a, vector bool short __b)
+{
+ return __a + (vector short)__b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vadduhm(vector unsigned short __a, vector unsigned short __b)
+{
+ return __a + __b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vadduhm(vector bool short __a, vector unsigned short __b)
+{
+ return (vector unsigned short)__a + __b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vadduhm(vector unsigned short __a, vector bool short __b)
+{
+ return __a + (vector unsigned short)__b;
+}
+
+/* vec_vadduwm */
+
+#define __builtin_altivec_vadduwm vec_vadduwm
+
+static vector int __ATTRS_o_ai
+vec_vadduwm(vector int __a, vector int __b)
+{
+ return __a + __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_vadduwm(vector bool int __a, vector int __b)
+{
+ return (vector int)__a + __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_vadduwm(vector int __a, vector bool int __b)
+{
+ return __a + (vector int)__b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vadduwm(vector unsigned int __a, vector unsigned int __b)
+{
+ return __a + __b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vadduwm(vector bool int __a, vector unsigned int __b)
+{
+ return (vector unsigned int)__a + __b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vadduwm(vector unsigned int __a, vector bool int __b)
+{
+ return __a + (vector unsigned int)__b;
+}
+
+/* vec_vaddfp */
+
+#define __builtin_altivec_vaddfp vec_vaddfp
+
+static vector float __attribute__((__always_inline__))
+vec_vaddfp(vector float __a, vector float __b)
+{
+ return __a + __b;
+}
+
+/* vec_addc */
+
+static vector unsigned int __attribute__((__always_inline__))
+vec_addc(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vaddcuw(__a, __b);
+}
+
+/* vec_vaddcuw */
+
+static vector unsigned int __attribute__((__always_inline__))
+vec_vaddcuw(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vaddcuw(__a, __b);
+}
+
+/* vec_adds */
+
+static vector signed char __ATTRS_o_ai
+vec_adds(vector signed char __a, vector signed char __b)
+{
+ return __builtin_altivec_vaddsbs(__a, __b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_adds(vector bool char __a, vector signed char __b)
+{
+ return __builtin_altivec_vaddsbs((vector signed char)__a, __b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_adds(vector signed char __a, vector bool char __b)
+{
+ return __builtin_altivec_vaddsbs(__a, (vector signed char)__b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_adds(vector unsigned char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vaddubs(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_adds(vector bool char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vaddubs((vector unsigned char)__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_adds(vector unsigned char __a, vector bool char __b)
+{
+ return __builtin_altivec_vaddubs(__a, (vector unsigned char)__b);
+}
+
+static vector short __ATTRS_o_ai
+vec_adds(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vaddshs(__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_adds(vector bool short __a, vector short __b)
+{
+ return __builtin_altivec_vaddshs((vector short)__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_adds(vector short __a, vector bool short __b)
+{
+ return __builtin_altivec_vaddshs(__a, (vector short)__b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_adds(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vadduhs(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_adds(vector bool short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vadduhs((vector unsigned short)__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_adds(vector unsigned short __a, vector bool short __b)
+{
+ return __builtin_altivec_vadduhs(__a, (vector unsigned short)__b);
+}
+
+static vector int __ATTRS_o_ai
+vec_adds(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vaddsws(__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_adds(vector bool int __a, vector int __b)
+{
+ return __builtin_altivec_vaddsws((vector int)__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_adds(vector int __a, vector bool int __b)
+{
+ return __builtin_altivec_vaddsws(__a, (vector int)__b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_adds(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vadduws(__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_adds(vector bool int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vadduws((vector unsigned int)__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_adds(vector unsigned int __a, vector bool int __b)
+{
+ return __builtin_altivec_vadduws(__a, (vector unsigned int)__b);
+}
+
+/* vec_vaddsbs */
+
+static vector signed char __ATTRS_o_ai
+vec_vaddsbs(vector signed char __a, vector signed char __b)
+{
+ return __builtin_altivec_vaddsbs(__a, __b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_vaddsbs(vector bool char __a, vector signed char __b)
+{
+ return __builtin_altivec_vaddsbs((vector signed char)__a, __b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_vaddsbs(vector signed char __a, vector bool char __b)
+{
+ return __builtin_altivec_vaddsbs(__a, (vector signed char)__b);
+}
+
+/* vec_vaddubs */
+
+static vector unsigned char __ATTRS_o_ai
+vec_vaddubs(vector unsigned char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vaddubs(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vaddubs(vector bool char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vaddubs((vector unsigned char)__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vaddubs(vector unsigned char __a, vector bool char __b)
+{
+ return __builtin_altivec_vaddubs(__a, (vector unsigned char)__b);
+}
+
+/* vec_vaddshs */
+
+static vector short __ATTRS_o_ai
+vec_vaddshs(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vaddshs(__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_vaddshs(vector bool short __a, vector short __b)
+{
+ return __builtin_altivec_vaddshs((vector short)__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_vaddshs(vector short __a, vector bool short __b)
+{
+ return __builtin_altivec_vaddshs(__a, (vector short)__b);
+}
+
+/* vec_vadduhs */
+
+static vector unsigned short __ATTRS_o_ai
+vec_vadduhs(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vadduhs(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vadduhs(vector bool short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vadduhs((vector unsigned short)__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vadduhs(vector unsigned short __a, vector bool short __b)
+{
+ return __builtin_altivec_vadduhs(__a, (vector unsigned short)__b);
+}
+
+/* vec_vaddsws */
+
+static vector int __ATTRS_o_ai
+vec_vaddsws(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vaddsws(__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_vaddsws(vector bool int __a, vector int __b)
+{
+ return __builtin_altivec_vaddsws((vector int)__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_vaddsws(vector int __a, vector bool int __b)
+{
+ return __builtin_altivec_vaddsws(__a, (vector int)__b);
+}
+
+/* vec_vadduws */
+
+static vector unsigned int __ATTRS_o_ai
+vec_vadduws(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vadduws(__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vadduws(vector bool int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vadduws((vector unsigned int)__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vadduws(vector unsigned int __a, vector bool int __b)
+{
+ return __builtin_altivec_vadduws(__a, (vector unsigned int)__b);
+}
+
+/* vec_and */
+
+#define __builtin_altivec_vand vec_and
+
+static vector signed char __ATTRS_o_ai
+vec_and(vector signed char __a, vector signed char __b)
+{
+ return __a & __b;
+}
+
+static vector signed char __ATTRS_o_ai
+vec_and(vector bool char __a, vector signed char __b)
+{
+ return (vector signed char)__a & __b;
+}
+
+static vector signed char __ATTRS_o_ai
+vec_and(vector signed char __a, vector bool char __b)
+{
+ return __a & (vector signed char)__b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_and(vector unsigned char __a, vector unsigned char __b)
+{
+ return __a & __b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_and(vector bool char __a, vector unsigned char __b)
+{
+ return (vector unsigned char)__a & __b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_and(vector unsigned char __a, vector bool char __b)
+{
+ return __a & (vector unsigned char)__b;
+}
+
+static vector bool char __ATTRS_o_ai
+vec_and(vector bool char __a, vector bool char __b)
+{
+ return __a & __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_and(vector short __a, vector short __b)
+{
+ return __a & __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_and(vector bool short __a, vector short __b)
+{
+ return (vector short)__a & __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_and(vector short __a, vector bool short __b)
+{
+ return __a & (vector short)__b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_and(vector unsigned short __a, vector unsigned short __b)
+{
+ return __a & __b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_and(vector bool short __a, vector unsigned short __b)
+{
+ return (vector unsigned short)__a & __b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_and(vector unsigned short __a, vector bool short __b)
+{
+ return __a & (vector unsigned short)__b;
+}
+
+static vector bool short __ATTRS_o_ai
+vec_and(vector bool short __a, vector bool short __b)
+{
+ return __a & __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_and(vector int __a, vector int __b)
+{
+ return __a & __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_and(vector bool int __a, vector int __b)
+{
+ return (vector int)__a & __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_and(vector int __a, vector bool int __b)
+{
+ return __a & (vector int)__b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_and(vector unsigned int __a, vector unsigned int __b)
+{
+ return __a & __b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_and(vector bool int __a, vector unsigned int __b)
+{
+ return (vector unsigned int)__a & __b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_and(vector unsigned int __a, vector bool int __b)
+{
+ return __a & (vector unsigned int)__b;
+}
+
+static vector bool int __ATTRS_o_ai
+vec_and(vector bool int __a, vector bool int __b)
+{
+ return __a & __b;
+}
+
+static vector float __ATTRS_o_ai
+vec_and(vector float __a, vector float __b)
+{
+ vector unsigned int __res = (vector unsigned int)__a & (vector unsigned int)__b;
+ return (vector float)__res;
+}
+
+static vector float __ATTRS_o_ai
+vec_and(vector bool int __a, vector float __b)
+{
+ vector unsigned int __res = (vector unsigned int)__a & (vector unsigned int)__b;
+ return (vector float)__res;
+}
+
+static vector float __ATTRS_o_ai
+vec_and(vector float __a, vector bool int __b)
+{
+ vector unsigned int __res = (vector unsigned int)__a & (vector unsigned int)__b;
+ return (vector float)__res;
+}
+
+/* vec_vand */
+
+static vector signed char __ATTRS_o_ai
+vec_vand(vector signed char __a, vector signed char __b)
+{
+ return __a & __b;
+}
+
+static vector signed char __ATTRS_o_ai
+vec_vand(vector bool char __a, vector signed char __b)
+{
+ return (vector signed char)__a & __b;
+}
+
+static vector signed char __ATTRS_o_ai
+vec_vand(vector signed char __a, vector bool char __b)
+{
+ return __a & (vector signed char)__b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vand(vector unsigned char __a, vector unsigned char __b)
+{
+ return __a & __b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vand(vector bool char __a, vector unsigned char __b)
+{
+ return (vector unsigned char)__a & __b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vand(vector unsigned char __a, vector bool char __b)
+{
+ return __a & (vector unsigned char)__b;
+}
+
+static vector bool char __ATTRS_o_ai
+vec_vand(vector bool char __a, vector bool char __b)
+{
+ return __a & __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_vand(vector short __a, vector short __b)
+{
+ return __a & __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_vand(vector bool short __a, vector short __b)
+{
+ return (vector short)__a & __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_vand(vector short __a, vector bool short __b)
+{
+ return __a & (vector short)__b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vand(vector unsigned short __a, vector unsigned short __b)
+{
+ return __a & __b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vand(vector bool short __a, vector unsigned short __b)
+{
+ return (vector unsigned short)__a & __b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vand(vector unsigned short __a, vector bool short __b)
+{
+ return __a & (vector unsigned short)__b;
+}
+
+static vector bool short __ATTRS_o_ai
+vec_vand(vector bool short __a, vector bool short __b)
+{
+ return __a & __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_vand(vector int __a, vector int __b)
+{
+ return __a & __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_vand(vector bool int __a, vector int __b)
+{
+ return (vector int)__a & __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_vand(vector int __a, vector bool int __b)
+{
+ return __a & (vector int)__b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vand(vector unsigned int __a, vector unsigned int __b)
+{
+ return __a & __b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vand(vector bool int __a, vector unsigned int __b)
+{
+ return (vector unsigned int)__a & __b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vand(vector unsigned int __a, vector bool int __b)
+{
+ return __a & (vector unsigned int)__b;
+}
+
+static vector bool int __ATTRS_o_ai
+vec_vand(vector bool int __a, vector bool int __b)
+{
+ return __a & __b;
+}
+
+static vector float __ATTRS_o_ai
+vec_vand(vector float __a, vector float __b)
+{
+ vector unsigned int __res = (vector unsigned int)__a & (vector unsigned int)__b;
+ return (vector float)__res;
+}
+
+static vector float __ATTRS_o_ai
+vec_vand(vector bool int __a, vector float __b)
+{
+ vector unsigned int __res = (vector unsigned int)__a & (vector unsigned int)__b;
+ return (vector float)__res;
+}
+
+static vector float __ATTRS_o_ai
+vec_vand(vector float __a, vector bool int __b)
+{
+ vector unsigned int __res = (vector unsigned int)__a & (vector unsigned int)__b;
+ return (vector float)__res;
+}
+
+/* vec_andc */
+
+#define __builtin_altivec_vandc vec_andc
+
+static vector signed char __ATTRS_o_ai
+vec_andc(vector signed char __a, vector signed char __b)
+{
+ return __a & ~__b;
+}
+
+static vector signed char __ATTRS_o_ai
+vec_andc(vector bool char __a, vector signed char __b)
+{
+ return (vector signed char)__a & ~__b;
+}
+
+static vector signed char __ATTRS_o_ai
+vec_andc(vector signed char __a, vector bool char __b)
+{
+ return __a & ~(vector signed char)__b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_andc(vector unsigned char __a, vector unsigned char __b)
+{
+ return __a & ~__b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_andc(vector bool char __a, vector unsigned char __b)
+{
+ return (vector unsigned char)__a & ~__b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_andc(vector unsigned char __a, vector bool char __b)
+{
+ return __a & ~(vector unsigned char)__b;
+}
+
+static vector bool char __ATTRS_o_ai
+vec_andc(vector bool char __a, vector bool char __b)
+{
+ return __a & ~__b;
+}
+
+static vector short __ATTRS_o_ai
+vec_andc(vector short __a, vector short __b)
+{
+ return __a & ~__b;
+}
+
+static vector short __ATTRS_o_ai
+vec_andc(vector bool short __a, vector short __b)
+{
+ return (vector short)__a & ~__b;
+}
+
+static vector short __ATTRS_o_ai
+vec_andc(vector short __a, vector bool short __b)
+{
+ return __a & ~(vector short)__b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_andc(vector unsigned short __a, vector unsigned short __b)
+{
+ return __a & ~__b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_andc(vector bool short __a, vector unsigned short __b)
+{
+ return (vector unsigned short)__a & ~__b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_andc(vector unsigned short __a, vector bool short __b)
+{
+ return __a & ~(vector unsigned short)__b;
+}
+
+static vector bool short __ATTRS_o_ai
+vec_andc(vector bool short __a, vector bool short __b)
+{
+ return __a & ~__b;
+}
+
+static vector int __ATTRS_o_ai
+vec_andc(vector int __a, vector int __b)
+{
+ return __a & ~__b;
+}
+
+static vector int __ATTRS_o_ai
+vec_andc(vector bool int __a, vector int __b)
+{
+ return (vector int)__a & ~__b;
+}
+
+static vector int __ATTRS_o_ai
+vec_andc(vector int __a, vector bool int __b)
+{
+ return __a & ~(vector int)__b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_andc(vector unsigned int __a, vector unsigned int __b)
+{
+ return __a & ~__b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_andc(vector bool int __a, vector unsigned int __b)
+{
+ return (vector unsigned int)__a & ~__b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_andc(vector unsigned int __a, vector bool int __b)
+{
+ return __a & ~(vector unsigned int)__b;
+}
+
+static vector bool int __ATTRS_o_ai
+vec_andc(vector bool int __a, vector bool int __b)
+{
+ return __a & ~__b;
+}
+
+static vector float __ATTRS_o_ai
+vec_andc(vector float __a, vector float __b)
+{
+ vector unsigned int __res = (vector unsigned int)__a & ~(vector unsigned int)__b;
+ return (vector float)__res;
+}
+
+static vector float __ATTRS_o_ai
+vec_andc(vector bool int __a, vector float __b)
+{
+ vector unsigned int __res = (vector unsigned int)__a & ~(vector unsigned int)__b;
+ return (vector float)__res;
+}
+
+static vector float __ATTRS_o_ai
+vec_andc(vector float __a, vector bool int __b)
+{
+ vector unsigned int __res = (vector unsigned int)__a & ~(vector unsigned int)__b;
+ return (vector float)__res;
+}
+
+/* vec_vandc */
+
+static vector signed char __ATTRS_o_ai
+vec_vandc(vector signed char __a, vector signed char __b)
+{
+ return __a & ~__b;
+}
+
+static vector signed char __ATTRS_o_ai
+vec_vandc(vector bool char __a, vector signed char __b)
+{
+ return (vector signed char)__a & ~__b;
+}
+
+static vector signed char __ATTRS_o_ai
+vec_vandc(vector signed char __a, vector bool char __b)
+{
+ return __a & ~(vector signed char)__b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vandc(vector unsigned char __a, vector unsigned char __b)
+{
+ return __a & ~__b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vandc(vector bool char __a, vector unsigned char __b)
+{
+ return (vector unsigned char)__a & ~__b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vandc(vector unsigned char __a, vector bool char __b)
+{
+ return __a & ~(vector unsigned char)__b;
+}
+
+static vector bool char __ATTRS_o_ai
+vec_vandc(vector bool char __a, vector bool char __b)
+{
+ return __a & ~__b;
+}
+
+static vector short __ATTRS_o_ai
+vec_vandc(vector short __a, vector short __b)
+{
+ return __a & ~__b;
+}
+
+static vector short __ATTRS_o_ai
+vec_vandc(vector bool short __a, vector short __b)
+{
+ return (vector short)__a & ~__b;
+}
+
+static vector short __ATTRS_o_ai
+vec_vandc(vector short __a, vector bool short __b)
+{
+ return __a & ~(vector short)__b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vandc(vector unsigned short __a, vector unsigned short __b)
+{
+ return __a & ~__b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vandc(vector bool short __a, vector unsigned short __b)
+{
+ return (vector unsigned short)__a & ~__b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vandc(vector unsigned short __a, vector bool short __b)
+{
+ return __a & ~(vector unsigned short)__b;
+}
+
+static vector bool short __ATTRS_o_ai
+vec_vandc(vector bool short __a, vector bool short __b)
+{
+ return __a & ~__b;
+}
+
+static vector int __ATTRS_o_ai
+vec_vandc(vector int __a, vector int __b)
+{
+ return __a & ~__b;
+}
+
+static vector int __ATTRS_o_ai
+vec_vandc(vector bool int __a, vector int __b)
+{
+ return (vector int)__a & ~__b;
+}
+
+static vector int __ATTRS_o_ai
+vec_vandc(vector int __a, vector bool int __b)
+{
+ return __a & ~(vector int)__b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vandc(vector unsigned int __a, vector unsigned int __b)
+{
+ return __a & ~__b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vandc(vector bool int __a, vector unsigned int __b)
+{
+ return (vector unsigned int)__a & ~__b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vandc(vector unsigned int __a, vector bool int __b)
+{
+ return __a & ~(vector unsigned int)__b;
+}
+
+static vector bool int __ATTRS_o_ai
+vec_vandc(vector bool int __a, vector bool int __b)
+{
+ return __a & ~__b;
+}
+
+static vector float __ATTRS_o_ai
+vec_vandc(vector float __a, vector float __b)
+{
+ vector unsigned int __res = (vector unsigned int)__a & ~(vector unsigned int)__b;
+ return (vector float)__res;
+}
+
+static vector float __ATTRS_o_ai
+vec_vandc(vector bool int __a, vector float __b)
+{
+ vector unsigned int __res = (vector unsigned int)__a & ~(vector unsigned int)__b;
+ return (vector float)__res;
+}
+
+static vector float __ATTRS_o_ai
+vec_vandc(vector float __a, vector bool int __b)
+{
+ vector unsigned int __res = (vector unsigned int)__a & ~(vector unsigned int)__b;
+ return (vector float)__res;
+}
+
+/* vec_avg */
+
+static vector signed char __ATTRS_o_ai
+vec_avg(vector signed char __a, vector signed char __b)
+{
+ return __builtin_altivec_vavgsb(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_avg(vector unsigned char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vavgub(__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_avg(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vavgsh(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_avg(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vavguh(__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_avg(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vavgsw(__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_avg(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vavguw(__a, __b);
+}
+
+/* vec_vavgsb */
+
+static vector signed char __attribute__((__always_inline__))
+vec_vavgsb(vector signed char __a, vector signed char __b)
+{
+ return __builtin_altivec_vavgsb(__a, __b);
+}
+
+/* vec_vavgub */
+
+static vector unsigned char __attribute__((__always_inline__))
+vec_vavgub(vector unsigned char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vavgub(__a, __b);
+}
+
+/* vec_vavgsh */
+
+static vector short __attribute__((__always_inline__))
+vec_vavgsh(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vavgsh(__a, __b);
+}
+
+/* vec_vavguh */
+
+static vector unsigned short __attribute__((__always_inline__))
+vec_vavguh(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vavguh(__a, __b);
+}
+
+/* vec_vavgsw */
+
+static vector int __attribute__((__always_inline__))
+vec_vavgsw(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vavgsw(__a, __b);
+}
+
+/* vec_vavguw */
+
+static vector unsigned int __attribute__((__always_inline__))
+vec_vavguw(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vavguw(__a, __b);
+}
+
+/* vec_ceil */
+
+static vector float __attribute__((__always_inline__))
+vec_ceil(vector float __a)
+{
+ return __builtin_altivec_vrfip(__a);
+}
+
+/* vec_vrfip */
+
+static vector float __attribute__((__always_inline__))
+vec_vrfip(vector float __a)
+{
+ return __builtin_altivec_vrfip(__a);
+}
+
+/* vec_cmpb */
+
+static vector int __attribute__((__always_inline__))
+vec_cmpb(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vcmpbfp(__a, __b);
+}
+
+/* vec_vcmpbfp */
+
+static vector int __attribute__((__always_inline__))
+vec_vcmpbfp(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vcmpbfp(__a, __b);
+}
+
+/* vec_cmpeq */
+
+static vector bool char __ATTRS_o_ai
+vec_cmpeq(vector signed char __a, vector signed char __b)
+{
+ return (vector bool char)
+ __builtin_altivec_vcmpequb((vector char)__a, (vector char)__b);
+}
+
+static vector bool char __ATTRS_o_ai
+vec_cmpeq(vector unsigned char __a, vector unsigned char __b)
+{
+ return (vector bool char)
+ __builtin_altivec_vcmpequb((vector char)__a, (vector char)__b);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_cmpeq(vector short __a, vector short __b)
+{
+ return (vector bool short)__builtin_altivec_vcmpequh(__a, __b);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_cmpeq(vector unsigned short __a, vector unsigned short __b)
+{
+ return (vector bool short)
+ __builtin_altivec_vcmpequh((vector short)__a, (vector short)__b);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_cmpeq(vector int __a, vector int __b)
+{
+ return (vector bool int)__builtin_altivec_vcmpequw(__a, __b);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_cmpeq(vector unsigned int __a, vector unsigned int __b)
+{
+ return (vector bool int)
+ __builtin_altivec_vcmpequw((vector int)__a, (vector int)__b);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_cmpeq(vector float __a, vector float __b)
+{
+ return (vector bool int)__builtin_altivec_vcmpeqfp(__a, __b);
+}
+
+/* vec_cmpge */
+
+static vector bool int __attribute__((__always_inline__))
+vec_cmpge(vector float __a, vector float __b)
+{
+ return (vector bool int)__builtin_altivec_vcmpgefp(__a, __b);
+}
+
+/* vec_vcmpgefp */
+
+static vector bool int __attribute__((__always_inline__))
+vec_vcmpgefp(vector float __a, vector float __b)
+{
+ return (vector bool int)__builtin_altivec_vcmpgefp(__a, __b);
+}
+
+/* vec_cmpgt */
+
+static vector bool char __ATTRS_o_ai
+vec_cmpgt(vector signed char __a, vector signed char __b)
+{
+ return (vector bool char)__builtin_altivec_vcmpgtsb(__a, __b);
+}
+
+static vector bool char __ATTRS_o_ai
+vec_cmpgt(vector unsigned char __a, vector unsigned char __b)
+{
+ return (vector bool char)__builtin_altivec_vcmpgtub(__a, __b);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_cmpgt(vector short __a, vector short __b)
+{
+ return (vector bool short)__builtin_altivec_vcmpgtsh(__a, __b);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_cmpgt(vector unsigned short __a, vector unsigned short __b)
+{
+ return (vector bool short)__builtin_altivec_vcmpgtuh(__a, __b);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_cmpgt(vector int __a, vector int __b)
+{
+ return (vector bool int)__builtin_altivec_vcmpgtsw(__a, __b);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_cmpgt(vector unsigned int __a, vector unsigned int __b)
+{
+ return (vector bool int)__builtin_altivec_vcmpgtuw(__a, __b);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_cmpgt(vector float __a, vector float __b)
+{
+ return (vector bool int)__builtin_altivec_vcmpgtfp(__a, __b);
+}
+
+/* vec_vcmpgtsb */
+
+static vector bool char __attribute__((__always_inline__))
+vec_vcmpgtsb(vector signed char __a, vector signed char __b)
+{
+ return (vector bool char)__builtin_altivec_vcmpgtsb(__a, __b);
+}
+
+/* vec_vcmpgtub */
+
+static vector bool char __attribute__((__always_inline__))
+vec_vcmpgtub(vector unsigned char __a, vector unsigned char __b)
+{
+ return (vector bool char)__builtin_altivec_vcmpgtub(__a, __b);
+}
+
+/* vec_vcmpgtsh */
+
+static vector bool short __attribute__((__always_inline__))
+vec_vcmpgtsh(vector short __a, vector short __b)
+{
+ return (vector bool short)__builtin_altivec_vcmpgtsh(__a, __b);
+}
+
+/* vec_vcmpgtuh */
+
+static vector bool short __attribute__((__always_inline__))
+vec_vcmpgtuh(vector unsigned short __a, vector unsigned short __b)
+{
+ return (vector bool short)__builtin_altivec_vcmpgtuh(__a, __b);
+}
+
+/* vec_vcmpgtsw */
+
+static vector bool int __attribute__((__always_inline__))
+vec_vcmpgtsw(vector int __a, vector int __b)
+{
+ return (vector bool int)__builtin_altivec_vcmpgtsw(__a, __b);
+}
+
+/* vec_vcmpgtuw */
+
+static vector bool int __attribute__((__always_inline__))
+vec_vcmpgtuw(vector unsigned int __a, vector unsigned int __b)
+{
+ return (vector bool int)__builtin_altivec_vcmpgtuw(__a, __b);
+}
+
+/* vec_vcmpgtfp */
+
+static vector bool int __attribute__((__always_inline__))
+vec_vcmpgtfp(vector float __a, vector float __b)
+{
+ return (vector bool int)__builtin_altivec_vcmpgtfp(__a, __b);
+}
+
+/* vec_cmple */
+
+static vector bool int __attribute__((__always_inline__))
+vec_cmple(vector float __a, vector float __b)
+{
+ return (vector bool int)__builtin_altivec_vcmpgefp(__b, __a);
+}
+
+/* vec_cmplt */
+
+static vector bool char __ATTRS_o_ai
+vec_cmplt(vector signed char __a, vector signed char __b)
+{
+ return (vector bool char)__builtin_altivec_vcmpgtsb(__b, __a);
+}
+
+static vector bool char __ATTRS_o_ai
+vec_cmplt(vector unsigned char __a, vector unsigned char __b)
+{
+ return (vector bool char)__builtin_altivec_vcmpgtub(__b, __a);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_cmplt(vector short __a, vector short __b)
+{
+ return (vector bool short)__builtin_altivec_vcmpgtsh(__b, __a);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_cmplt(vector unsigned short __a, vector unsigned short __b)
+{
+ return (vector bool short)__builtin_altivec_vcmpgtuh(__b, __a);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_cmplt(vector int __a, vector int __b)
+{
+ return (vector bool int)__builtin_altivec_vcmpgtsw(__b, __a);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_cmplt(vector unsigned int __a, vector unsigned int __b)
+{
+ return (vector bool int)__builtin_altivec_vcmpgtuw(__b, __a);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_cmplt(vector float __a, vector float __b)
+{
+ return (vector bool int)__builtin_altivec_vcmpgtfp(__b, __a);
+}
+
+/* vec_ctf */
+
+static vector float __ATTRS_o_ai
+vec_ctf(vector int __a, int __b)
+{
+ return __builtin_altivec_vcfsx(__a, __b);
+}
+
+static vector float __ATTRS_o_ai
+vec_ctf(vector unsigned int __a, int __b)
+{
+ return __builtin_altivec_vcfux((vector int)__a, __b);
+}
+
+/* vec_vcfsx */
+
+static vector float __attribute__((__always_inline__))
+vec_vcfsx(vector int __a, int __b)
+{
+ return __builtin_altivec_vcfsx(__a, __b);
+}
+
+/* vec_vcfux */
+
+static vector float __attribute__((__always_inline__))
+vec_vcfux(vector unsigned int __a, int __b)
+{
+ return __builtin_altivec_vcfux((vector int)__a, __b);
+}
+
+/* vec_cts */
+
+static vector int __attribute__((__always_inline__))
+vec_cts(vector float __a, int __b)
+{
+ return __builtin_altivec_vctsxs(__a, __b);
+}
+
+/* vec_vctsxs */
+
+static vector int __attribute__((__always_inline__))
+vec_vctsxs(vector float __a, int __b)
+{
+ return __builtin_altivec_vctsxs(__a, __b);
+}
+
+/* vec_ctu */
+
+static vector unsigned int __attribute__((__always_inline__))
+vec_ctu(vector float __a, int __b)
+{
+ return __builtin_altivec_vctuxs(__a, __b);
+}
+
+/* vec_vctuxs */
+
+static vector unsigned int __attribute__((__always_inline__))
+vec_vctuxs(vector float __a, int __b)
+{
+ return __builtin_altivec_vctuxs(__a, __b);
+}
+
+/* vec_dss */
+
+static void __attribute__((__always_inline__))
+vec_dss(int __a)
+{
+ __builtin_altivec_dss(__a);
+}
+
+/* vec_dssall */
+
+static void __attribute__((__always_inline__))
+vec_dssall(void)
+{
+ __builtin_altivec_dssall();
+}
+
+/* vec_dst */
+
+static void __attribute__((__always_inline__))
+vec_dst(const void *__a, int __b, int __c)
+{
+ __builtin_altivec_dst(__a, __b, __c);
+}
+
+/* vec_dstst */
+
+static void __attribute__((__always_inline__))
+vec_dstst(const void *__a, int __b, int __c)
+{
+ __builtin_altivec_dstst(__a, __b, __c);
+}
+
+/* vec_dststt */
+
+static void __attribute__((__always_inline__))
+vec_dststt(const void *__a, int __b, int __c)
+{
+ __builtin_altivec_dststt(__a, __b, __c);
+}
+
+/* vec_dstt */
+
+static void __attribute__((__always_inline__))
+vec_dstt(const void *__a, int __b, int __c)
+{
+ __builtin_altivec_dstt(__a, __b, __c);
+}
+
+/* vec_expte */
+
+static vector float __attribute__((__always_inline__))
+vec_expte(vector float __a)
+{
+ return __builtin_altivec_vexptefp(__a);
+}
+
+/* vec_vexptefp */
+
+static vector float __attribute__((__always_inline__))
+vec_vexptefp(vector float __a)
+{
+ return __builtin_altivec_vexptefp(__a);
+}
+
+/* vec_floor */
+
+static vector float __attribute__((__always_inline__))
+vec_floor(vector float __a)
+{
+ return __builtin_altivec_vrfim(__a);
+}
+
+/* vec_vrfim */
+
+static vector float __attribute__((__always_inline__))
+vec_vrfim(vector float __a)
+{
+ return __builtin_altivec_vrfim(__a);
+}
+
+/* vec_ld */
+
+static vector signed char __ATTRS_o_ai
+vec_ld(int __a, const vector signed char *__b)
+{
+ return (vector signed char)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_ld(int __a, const signed char *__b)
+{
+ return (vector signed char)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_ld(int __a, const vector unsigned char *__b)
+{
+ return (vector unsigned char)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_ld(int __a, const unsigned char *__b)
+{
+ return (vector unsigned char)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector bool char __ATTRS_o_ai
+vec_ld(int __a, const vector bool char *__b)
+{
+ return (vector bool char)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_ld(int __a, const vector short *__b)
+{
+ return (vector short)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_ld(int __a, const short *__b)
+{
+ return (vector short)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_ld(int __a, const vector unsigned short *__b)
+{
+ return (vector unsigned short)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_ld(int __a, const unsigned short *__b)
+{
+ return (vector unsigned short)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_ld(int __a, const vector bool short *__b)
+{
+ return (vector bool short)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector pixel __ATTRS_o_ai
+vec_ld(int __a, const vector pixel *__b)
+{
+ return (vector pixel)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_ld(int __a, const vector int *__b)
+{
+ return (vector int)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_ld(int __a, const int *__b)
+{
+ return (vector int)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_ld(int __a, const vector unsigned int *__b)
+{
+ return (vector unsigned int)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_ld(int __a, const unsigned int *__b)
+{
+ return (vector unsigned int)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_ld(int __a, const vector bool int *__b)
+{
+ return (vector bool int)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector float __ATTRS_o_ai
+vec_ld(int __a, const vector float *__b)
+{
+ return (vector float)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector float __ATTRS_o_ai
+vec_ld(int __a, const float *__b)
+{
+ return (vector float)__builtin_altivec_lvx(__a, __b);
+}
+
+/* vec_lvx */
+
+static vector signed char __ATTRS_o_ai
+vec_lvx(int __a, const vector signed char *__b)
+{
+ return (vector signed char)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_lvx(int __a, const signed char *__b)
+{
+ return (vector signed char)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_lvx(int __a, const vector unsigned char *__b)
+{
+ return (vector unsigned char)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_lvx(int __a, const unsigned char *__b)
+{
+ return (vector unsigned char)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector bool char __ATTRS_o_ai
+vec_lvx(int __a, const vector bool char *__b)
+{
+ return (vector bool char)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_lvx(int __a, const vector short *__b)
+{
+ return (vector short)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_lvx(int __a, const short *__b)
+{
+ return (vector short)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_lvx(int __a, const vector unsigned short *__b)
+{
+ return (vector unsigned short)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_lvx(int __a, const unsigned short *__b)
+{
+ return (vector unsigned short)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_lvx(int __a, const vector bool short *__b)
+{
+ return (vector bool short)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector pixel __ATTRS_o_ai
+vec_lvx(int __a, const vector pixel *__b)
+{
+ return (vector pixel)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_lvx(int __a, const vector int *__b)
+{
+ return (vector int)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_lvx(int __a, const int *__b)
+{
+ return (vector int)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_lvx(int __a, const vector unsigned int *__b)
+{
+ return (vector unsigned int)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_lvx(int __a, const unsigned int *__b)
+{
+ return (vector unsigned int)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_lvx(int __a, const vector bool int *__b)
+{
+ return (vector bool int)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector float __ATTRS_o_ai
+vec_lvx(int __a, const vector float *__b)
+{
+ return (vector float)__builtin_altivec_lvx(__a, __b);
+}
+
+static vector float __ATTRS_o_ai
+vec_lvx(int __a, const float *__b)
+{
+ return (vector float)__builtin_altivec_lvx(__a, __b);
+}
+
+/* vec_lde */
+
+static vector signed char __ATTRS_o_ai
+vec_lde(int __a, const signed char *__b)
+{
+ return (vector signed char)__builtin_altivec_lvebx(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_lde(int __a, const unsigned char *__b)
+{
+ return (vector unsigned char)__builtin_altivec_lvebx(__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_lde(int __a, const short *__b)
+{
+ return (vector short)__builtin_altivec_lvehx(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_lde(int __a, const unsigned short *__b)
+{
+ return (vector unsigned short)__builtin_altivec_lvehx(__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_lde(int __a, const int *__b)
+{
+ return (vector int)__builtin_altivec_lvewx(__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_lde(int __a, const unsigned int *__b)
+{
+ return (vector unsigned int)__builtin_altivec_lvewx(__a, __b);
+}
+
+static vector float __ATTRS_o_ai
+vec_lde(int __a, const float *__b)
+{
+ return (vector float)__builtin_altivec_lvewx(__a, __b);
+}
+
+/* vec_lvebx */
+
+static vector signed char __ATTRS_o_ai
+vec_lvebx(int __a, const signed char *__b)
+{
+ return (vector signed char)__builtin_altivec_lvebx(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_lvebx(int __a, const unsigned char *__b)
+{
+ return (vector unsigned char)__builtin_altivec_lvebx(__a, __b);
+}
+
+/* vec_lvehx */
+
+static vector short __ATTRS_o_ai
+vec_lvehx(int __a, const short *__b)
+{
+ return (vector short)__builtin_altivec_lvehx(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_lvehx(int __a, const unsigned short *__b)
+{
+ return (vector unsigned short)__builtin_altivec_lvehx(__a, __b);
+}
+
+/* vec_lvewx */
+
+static vector int __ATTRS_o_ai
+vec_lvewx(int __a, const int *__b)
+{
+ return (vector int)__builtin_altivec_lvewx(__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_lvewx(int __a, const unsigned int *__b)
+{
+ return (vector unsigned int)__builtin_altivec_lvewx(__a, __b);
+}
+
+static vector float __ATTRS_o_ai
+vec_lvewx(int __a, const float *__b)
+{
+ return (vector float)__builtin_altivec_lvewx(__a, __b);
+}
+
+/* vec_ldl */
+
+static vector signed char __ATTRS_o_ai
+vec_ldl(int __a, const vector signed char *__b)
+{
+ return (vector signed char)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_ldl(int __a, const signed char *__b)
+{
+ return (vector signed char)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_ldl(int __a, const vector unsigned char *__b)
+{
+ return (vector unsigned char)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_ldl(int __a, const unsigned char *__b)
+{
+ return (vector unsigned char)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector bool char __ATTRS_o_ai
+vec_ldl(int __a, const vector bool char *__b)
+{
+ return (vector bool char)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_ldl(int __a, const vector short *__b)
+{
+ return (vector short)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_ldl(int __a, const short *__b)
+{
+ return (vector short)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_ldl(int __a, const vector unsigned short *__b)
+{
+ return (vector unsigned short)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_ldl(int __a, const unsigned short *__b)
+{
+ return (vector unsigned short)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_ldl(int __a, const vector bool short *__b)
+{
+ return (vector bool short)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector pixel __ATTRS_o_ai
+vec_ldl(int __a, const vector pixel *__b)
+{
+ return (vector pixel short)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_ldl(int __a, const vector int *__b)
+{
+ return (vector int)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_ldl(int __a, const int *__b)
+{
+ return (vector int)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_ldl(int __a, const vector unsigned int *__b)
+{
+ return (vector unsigned int)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_ldl(int __a, const unsigned int *__b)
+{
+ return (vector unsigned int)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_ldl(int __a, const vector bool int *__b)
+{
+ return (vector bool int)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector float __ATTRS_o_ai
+vec_ldl(int __a, const vector float *__b)
+{
+ return (vector float)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector float __ATTRS_o_ai
+vec_ldl(int __a, const float *__b)
+{
+ return (vector float)__builtin_altivec_lvxl(__a, __b);
+}
+
+/* vec_lvxl */
+
+static vector signed char __ATTRS_o_ai
+vec_lvxl(int __a, const vector signed char *__b)
+{
+ return (vector signed char)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_lvxl(int __a, const signed char *__b)
+{
+ return (vector signed char)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_lvxl(int __a, const vector unsigned char *__b)
+{
+ return (vector unsigned char)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_lvxl(int __a, const unsigned char *__b)
+{
+ return (vector unsigned char)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector bool char __ATTRS_o_ai
+vec_lvxl(int __a, const vector bool char *__b)
+{
+ return (vector bool char)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_lvxl(int __a, const vector short *__b)
+{
+ return (vector short)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_lvxl(int __a, const short *__b)
+{
+ return (vector short)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_lvxl(int __a, const vector unsigned short *__b)
+{
+ return (vector unsigned short)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_lvxl(int __a, const unsigned short *__b)
+{
+ return (vector unsigned short)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_lvxl(int __a, const vector bool short *__b)
+{
+ return (vector bool short)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector pixel __ATTRS_o_ai
+vec_lvxl(int __a, const vector pixel *__b)
+{
+ return (vector pixel)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_lvxl(int __a, const vector int *__b)
+{
+ return (vector int)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_lvxl(int __a, const int *__b)
+{
+ return (vector int)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_lvxl(int __a, const vector unsigned int *__b)
+{
+ return (vector unsigned int)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_lvxl(int __a, const unsigned int *__b)
+{
+ return (vector unsigned int)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_lvxl(int __a, const vector bool int *__b)
+{
+ return (vector bool int)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector float __ATTRS_o_ai
+vec_lvxl(int __a, const vector float *__b)
+{
+ return (vector float)__builtin_altivec_lvxl(__a, __b);
+}
+
+static vector float __ATTRS_o_ai
+vec_lvxl(int __a, const float *__b)
+{
+ return (vector float)__builtin_altivec_lvxl(__a, __b);
+}
+
+/* vec_loge */
+
+static vector float __attribute__((__always_inline__))
+vec_loge(vector float __a)
+{
+ return __builtin_altivec_vlogefp(__a);
+}
+
+/* vec_vlogefp */
+
+static vector float __attribute__((__always_inline__))
+vec_vlogefp(vector float __a)
+{
+ return __builtin_altivec_vlogefp(__a);
+}
+
+/* vec_lvsl */
+
+static vector unsigned char __ATTRS_o_ai
+vec_lvsl(int __a, const signed char *__b)
+{
+ return (vector unsigned char)__builtin_altivec_lvsl(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_lvsl(int __a, const unsigned char *__b)
+{
+ return (vector unsigned char)__builtin_altivec_lvsl(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_lvsl(int __a, const short *__b)
+{
+ return (vector unsigned char)__builtin_altivec_lvsl(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_lvsl(int __a, const unsigned short *__b)
+{
+ return (vector unsigned char)__builtin_altivec_lvsl(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_lvsl(int __a, const int *__b)
+{
+ return (vector unsigned char)__builtin_altivec_lvsl(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_lvsl(int __a, const unsigned int *__b)
+{
+ return (vector unsigned char)__builtin_altivec_lvsl(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_lvsl(int __a, const float *__b)
+{
+ return (vector unsigned char)__builtin_altivec_lvsl(__a, __b);
+}
+
+/* vec_lvsr */
+
+static vector unsigned char __ATTRS_o_ai
+vec_lvsr(int __a, const signed char *__b)
+{
+ return (vector unsigned char)__builtin_altivec_lvsr(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_lvsr(int __a, const unsigned char *__b)
+{
+ return (vector unsigned char)__builtin_altivec_lvsr(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_lvsr(int __a, const short *__b)
+{
+ return (vector unsigned char)__builtin_altivec_lvsr(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_lvsr(int __a, const unsigned short *__b)
+{
+ return (vector unsigned char)__builtin_altivec_lvsr(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_lvsr(int __a, const int *__b)
+{
+ return (vector unsigned char)__builtin_altivec_lvsr(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_lvsr(int __a, const unsigned int *__b)
+{
+ return (vector unsigned char)__builtin_altivec_lvsr(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_lvsr(int __a, const float *__b)
+{
+ return (vector unsigned char)__builtin_altivec_lvsr(__a, __b);
+}
+
+/* vec_madd */
+
+static vector float __attribute__((__always_inline__))
+vec_madd(vector float __a, vector float __b, vector float __c)
+{
+ return __builtin_altivec_vmaddfp(__a, __b, __c);
+}
+
+/* vec_vmaddfp */
+
+static vector float __attribute__((__always_inline__))
+vec_vmaddfp(vector float __a, vector float __b, vector float __c)
+{
+ return __builtin_altivec_vmaddfp(__a, __b, __c);
+}
+
+/* vec_madds */
+
+static vector signed short __attribute__((__always_inline__))
+vec_madds(vector signed short __a, vector signed short __b, vector signed short __c)
+{
+ return __builtin_altivec_vmhaddshs(__a, __b, __c);
+}
+
+/* vec_vmhaddshs */
+static vector signed short __attribute__((__always_inline__))
+vec_vmhaddshs(vector signed short __a,
+ vector signed short __b,
+ vector signed short __c)
+{
+ return __builtin_altivec_vmhaddshs(__a, __b, __c);
+}
+
+/* vec_max */
+
+static vector signed char __ATTRS_o_ai
+vec_max(vector signed char __a, vector signed char __b)
+{
+ return __builtin_altivec_vmaxsb(__a, __b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_max(vector bool char __a, vector signed char __b)
+{
+ return __builtin_altivec_vmaxsb((vector signed char)__a, __b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_max(vector signed char __a, vector bool char __b)
+{
+ return __builtin_altivec_vmaxsb(__a, (vector signed char)__b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_max(vector unsigned char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vmaxub(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_max(vector bool char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vmaxub((vector unsigned char)__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_max(vector unsigned char __a, vector bool char __b)
+{
+ return __builtin_altivec_vmaxub(__a, (vector unsigned char)__b);
+}
+
+static vector short __ATTRS_o_ai
+vec_max(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vmaxsh(__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_max(vector bool short __a, vector short __b)
+{
+ return __builtin_altivec_vmaxsh((vector short)__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_max(vector short __a, vector bool short __b)
+{
+ return __builtin_altivec_vmaxsh(__a, (vector short)__b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_max(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vmaxuh(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_max(vector bool short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vmaxuh((vector unsigned short)__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_max(vector unsigned short __a, vector bool short __b)
+{
+ return __builtin_altivec_vmaxuh(__a, (vector unsigned short)__b);
+}
+
+static vector int __ATTRS_o_ai
+vec_max(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vmaxsw(__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_max(vector bool int __a, vector int __b)
+{
+ return __builtin_altivec_vmaxsw((vector int)__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_max(vector int __a, vector bool int __b)
+{
+ return __builtin_altivec_vmaxsw(__a, (vector int)__b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_max(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vmaxuw(__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_max(vector bool int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vmaxuw((vector unsigned int)__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_max(vector unsigned int __a, vector bool int __b)
+{
+ return __builtin_altivec_vmaxuw(__a, (vector unsigned int)__b);
+}
+
+static vector float __ATTRS_o_ai
+vec_max(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vmaxfp(__a, __b);
+}
+
+/* vec_vmaxsb */
+
+static vector signed char __ATTRS_o_ai
+vec_vmaxsb(vector signed char __a, vector signed char __b)
+{
+ return __builtin_altivec_vmaxsb(__a, __b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_vmaxsb(vector bool char __a, vector signed char __b)
+{
+ return __builtin_altivec_vmaxsb((vector signed char)__a, __b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_vmaxsb(vector signed char __a, vector bool char __b)
+{
+ return __builtin_altivec_vmaxsb(__a, (vector signed char)__b);
+}
+
+/* vec_vmaxub */
+
+static vector unsigned char __ATTRS_o_ai
+vec_vmaxub(vector unsigned char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vmaxub(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vmaxub(vector bool char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vmaxub((vector unsigned char)__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vmaxub(vector unsigned char __a, vector bool char __b)
+{
+ return __builtin_altivec_vmaxub(__a, (vector unsigned char)__b);
+}
+
+/* vec_vmaxsh */
+
+static vector short __ATTRS_o_ai
+vec_vmaxsh(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vmaxsh(__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_vmaxsh(vector bool short __a, vector short __b)
+{
+ return __builtin_altivec_vmaxsh((vector short)__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_vmaxsh(vector short __a, vector bool short __b)
+{
+ return __builtin_altivec_vmaxsh(__a, (vector short)__b);
+}
+
+/* vec_vmaxuh */
+
+static vector unsigned short __ATTRS_o_ai
+vec_vmaxuh(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vmaxuh(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vmaxuh(vector bool short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vmaxuh((vector unsigned short)__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vmaxuh(vector unsigned short __a, vector bool short __b)
+{
+ return __builtin_altivec_vmaxuh(__a, (vector unsigned short)__b);
+}
+
+/* vec_vmaxsw */
+
+static vector int __ATTRS_o_ai
+vec_vmaxsw(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vmaxsw(__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_vmaxsw(vector bool int __a, vector int __b)
+{
+ return __builtin_altivec_vmaxsw((vector int)__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_vmaxsw(vector int __a, vector bool int __b)
+{
+ return __builtin_altivec_vmaxsw(__a, (vector int)__b);
+}
+
+/* vec_vmaxuw */
+
+static vector unsigned int __ATTRS_o_ai
+vec_vmaxuw(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vmaxuw(__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vmaxuw(vector bool int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vmaxuw((vector unsigned int)__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vmaxuw(vector unsigned int __a, vector bool int __b)
+{
+ return __builtin_altivec_vmaxuw(__a, (vector unsigned int)__b);
+}
+
+/* vec_vmaxfp */
+
+static vector float __attribute__((__always_inline__))
+vec_vmaxfp(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vmaxfp(__a, __b);
+}
+
+/* vec_mergeh */
+
+static vector signed char __ATTRS_o_ai
+vec_mergeh(vector signed char __a, vector signed char __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x00, 0x10, 0x01, 0x11, 0x02, 0x12, 0x03, 0x13,
+ 0x04, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x17));
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_mergeh(vector unsigned char __a, vector unsigned char __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x00, 0x10, 0x01, 0x11, 0x02, 0x12, 0x03, 0x13,
+ 0x04, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x17));
+}
+
+static vector bool char __ATTRS_o_ai
+vec_mergeh(vector bool char __a, vector bool char __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x00, 0x10, 0x01, 0x11, 0x02, 0x12, 0x03, 0x13,
+ 0x04, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x17));
+}
+
+static vector short __ATTRS_o_ai
+vec_mergeh(vector short __a, vector short __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x00, 0x01, 0x10, 0x11, 0x02, 0x03, 0x12, 0x13,
+ 0x04, 0x05, 0x14, 0x15, 0x06, 0x07, 0x16, 0x17));
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_mergeh(vector unsigned short __a, vector unsigned short __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x00, 0x01, 0x10, 0x11, 0x02, 0x03, 0x12, 0x13,
+ 0x04, 0x05, 0x14, 0x15, 0x06, 0x07, 0x16, 0x17));
+}
+
+static vector bool short __ATTRS_o_ai
+vec_mergeh(vector bool short __a, vector bool short __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x00, 0x01, 0x10, 0x11, 0x02, 0x03, 0x12, 0x13,
+ 0x04, 0x05, 0x14, 0x15, 0x06, 0x07, 0x16, 0x17));
+}
+
+static vector pixel __ATTRS_o_ai
+vec_mergeh(vector pixel __a, vector pixel __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x00, 0x01, 0x10, 0x11, 0x02, 0x03, 0x12, 0x13,
+ 0x04, 0x05, 0x14, 0x15, 0x06, 0x07, 0x16, 0x17));
+}
+
+static vector int __ATTRS_o_ai
+vec_mergeh(vector int __a, vector int __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13,
+ 0x04, 0x05, 0x06, 0x07, 0x14, 0x15, 0x16, 0x17));
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_mergeh(vector unsigned int __a, vector unsigned int __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13,
+ 0x04, 0x05, 0x06, 0x07, 0x14, 0x15, 0x16, 0x17));
+}
+
+static vector bool int __ATTRS_o_ai
+vec_mergeh(vector bool int __a, vector bool int __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13,
+ 0x04, 0x05, 0x06, 0x07, 0x14, 0x15, 0x16, 0x17));
+}
+
+static vector float __ATTRS_o_ai
+vec_mergeh(vector float __a, vector float __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13,
+ 0x04, 0x05, 0x06, 0x07, 0x14, 0x15, 0x16, 0x17));
+}
+
+/* vec_vmrghb */
+
+#define __builtin_altivec_vmrghb vec_vmrghb
+
+static vector signed char __ATTRS_o_ai
+vec_vmrghb(vector signed char __a, vector signed char __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x00, 0x10, 0x01, 0x11, 0x02, 0x12, 0x03, 0x13,
+ 0x04, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x17));
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vmrghb(vector unsigned char __a, vector unsigned char __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x00, 0x10, 0x01, 0x11, 0x02, 0x12, 0x03, 0x13,
+ 0x04, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x17));
+}
+
+static vector bool char __ATTRS_o_ai
+vec_vmrghb(vector bool char __a, vector bool char __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x00, 0x10, 0x01, 0x11, 0x02, 0x12, 0x03, 0x13,
+ 0x04, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x17));
+}
+
+/* vec_vmrghh */
+
+#define __builtin_altivec_vmrghh vec_vmrghh
+
+static vector short __ATTRS_o_ai
+vec_vmrghh(vector short __a, vector short __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x00, 0x01, 0x10, 0x11, 0x02, 0x03, 0x12, 0x13,
+ 0x04, 0x05, 0x14, 0x15, 0x06, 0x07, 0x16, 0x17));
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vmrghh(vector unsigned short __a, vector unsigned short __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x00, 0x01, 0x10, 0x11, 0x02, 0x03, 0x12, 0x13,
+ 0x04, 0x05, 0x14, 0x15, 0x06, 0x07, 0x16, 0x17));
+}
+
+static vector bool short __ATTRS_o_ai
+vec_vmrghh(vector bool short __a, vector bool short __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x00, 0x01, 0x10, 0x11, 0x02, 0x03, 0x12, 0x13,
+ 0x04, 0x05, 0x14, 0x15, 0x06, 0x07, 0x16, 0x17));
+}
+
+static vector pixel __ATTRS_o_ai
+vec_vmrghh(vector pixel __a, vector pixel __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x00, 0x01, 0x10, 0x11, 0x02, 0x03, 0x12, 0x13,
+ 0x04, 0x05, 0x14, 0x15, 0x06, 0x07, 0x16, 0x17));
+}
+
+/* vec_vmrghw */
+
+#define __builtin_altivec_vmrghw vec_vmrghw
+
+static vector int __ATTRS_o_ai
+vec_vmrghw(vector int __a, vector int __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13,
+ 0x04, 0x05, 0x06, 0x07, 0x14, 0x15, 0x16, 0x17));
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vmrghw(vector unsigned int __a, vector unsigned int __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13,
+ 0x04, 0x05, 0x06, 0x07, 0x14, 0x15, 0x16, 0x17));
+}
+
+static vector bool int __ATTRS_o_ai
+vec_vmrghw(vector bool int __a, vector bool int __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13,
+ 0x04, 0x05, 0x06, 0x07, 0x14, 0x15, 0x16, 0x17));
+}
+
+static vector float __ATTRS_o_ai
+vec_vmrghw(vector float __a, vector float __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13,
+ 0x04, 0x05, 0x06, 0x07, 0x14, 0x15, 0x16, 0x17));
+}
+
+/* vec_mergel */
+
+static vector signed char __ATTRS_o_ai
+vec_mergel(vector signed char __a, vector signed char __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x08, 0x18, 0x09, 0x19, 0x0A, 0x1A, 0x0B, 0x1B,
+ 0x0C, 0x1C, 0x0D, 0x1D, 0x0E, 0x1E, 0x0F, 0x1F));
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_mergel(vector unsigned char __a, vector unsigned char __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x08, 0x18, 0x09, 0x19, 0x0A, 0x1A, 0x0B, 0x1B,
+ 0x0C, 0x1C, 0x0D, 0x1D, 0x0E, 0x1E, 0x0F, 0x1F));
+}
+
+static vector bool char __ATTRS_o_ai
+vec_mergel(vector bool char __a, vector bool char __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x08, 0x18, 0x09, 0x19, 0x0A, 0x1A, 0x0B, 0x1B,
+ 0x0C, 0x1C, 0x0D, 0x1D, 0x0E, 0x1E, 0x0F, 0x1F));
+}
+
+static vector short __ATTRS_o_ai
+vec_mergel(vector short __a, vector short __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x08, 0x09, 0x18, 0x19, 0x0A, 0x0B, 0x1A, 0x1B,
+ 0x0C, 0x0D, 0x1C, 0x1D, 0x0E, 0x0F, 0x1E, 0x1F));
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_mergel(vector unsigned short __a, vector unsigned short __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x08, 0x09, 0x18, 0x19, 0x0A, 0x0B, 0x1A, 0x1B,
+ 0x0C, 0x0D, 0x1C, 0x1D, 0x0E, 0x0F, 0x1E, 0x1F));
+}
+
+static vector bool short __ATTRS_o_ai
+vec_mergel(vector bool short __a, vector bool short __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x08, 0x09, 0x18, 0x19, 0x0A, 0x0B, 0x1A, 0x1B,
+ 0x0C, 0x0D, 0x1C, 0x1D, 0x0E, 0x0F, 0x1E, 0x1F));
+}
+
+static vector pixel __ATTRS_o_ai
+vec_mergel(vector pixel __a, vector pixel __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x08, 0x09, 0x18, 0x19, 0x0A, 0x0B, 0x1A, 0x1B,
+ 0x0C, 0x0D, 0x1C, 0x1D, 0x0E, 0x0F, 0x1E, 0x1F));
+}
+
+static vector int __ATTRS_o_ai
+vec_mergel(vector int __a, vector int __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x08, 0x09, 0x0A, 0x0B, 0x18, 0x19, 0x1A, 0x1B,
+ 0x0C, 0x0D, 0x0E, 0x0F, 0x1C, 0x1D, 0x1E, 0x1F));
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_mergel(vector unsigned int __a, vector unsigned int __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x08, 0x09, 0x0A, 0x0B, 0x18, 0x19, 0x1A, 0x1B,
+ 0x0C, 0x0D, 0x0E, 0x0F, 0x1C, 0x1D, 0x1E, 0x1F));
+}
+
+static vector bool int __ATTRS_o_ai
+vec_mergel(vector bool int __a, vector bool int __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x08, 0x09, 0x0A, 0x0B, 0x18, 0x19, 0x1A, 0x1B,
+ 0x0C, 0x0D, 0x0E, 0x0F, 0x1C, 0x1D, 0x1E, 0x1F));
+}
+
+static vector float __ATTRS_o_ai
+vec_mergel(vector float __a, vector float __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x08, 0x09, 0x0A, 0x0B, 0x18, 0x19, 0x1A, 0x1B,
+ 0x0C, 0x0D, 0x0E, 0x0F, 0x1C, 0x1D, 0x1E, 0x1F));
+}
+
+/* vec_vmrglb */
+
+#define __builtin_altivec_vmrglb vec_vmrglb
+
+static vector signed char __ATTRS_o_ai
+vec_vmrglb(vector signed char __a, vector signed char __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x08, 0x18, 0x09, 0x19, 0x0A, 0x1A, 0x0B, 0x1B,
+ 0x0C, 0x1C, 0x0D, 0x1D, 0x0E, 0x1E, 0x0F, 0x1F));
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vmrglb(vector unsigned char __a, vector unsigned char __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x08, 0x18, 0x09, 0x19, 0x0A, 0x1A, 0x0B, 0x1B,
+ 0x0C, 0x1C, 0x0D, 0x1D, 0x0E, 0x1E, 0x0F, 0x1F));
+}
+
+static vector bool char __ATTRS_o_ai
+vec_vmrglb(vector bool char __a, vector bool char __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x08, 0x18, 0x09, 0x19, 0x0A, 0x1A, 0x0B, 0x1B,
+ 0x0C, 0x1C, 0x0D, 0x1D, 0x0E, 0x1E, 0x0F, 0x1F));
+}
+
+/* vec_vmrglh */
+
+#define __builtin_altivec_vmrglh vec_vmrglh
+
+static vector short __ATTRS_o_ai
+vec_vmrglh(vector short __a, vector short __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x08, 0x09, 0x18, 0x19, 0x0A, 0x0B, 0x1A, 0x1B,
+ 0x0C, 0x0D, 0x1C, 0x1D, 0x0E, 0x0F, 0x1E, 0x1F));
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vmrglh(vector unsigned short __a, vector unsigned short __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x08, 0x09, 0x18, 0x19, 0x0A, 0x0B, 0x1A, 0x1B,
+ 0x0C, 0x0D, 0x1C, 0x1D, 0x0E, 0x0F, 0x1E, 0x1F));
+}
+
+static vector bool short __ATTRS_o_ai
+vec_vmrglh(vector bool short __a, vector bool short __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x08, 0x09, 0x18, 0x19, 0x0A, 0x0B, 0x1A, 0x1B,
+ 0x0C, 0x0D, 0x1C, 0x1D, 0x0E, 0x0F, 0x1E, 0x1F));
+}
+
+static vector pixel __ATTRS_o_ai
+vec_vmrglh(vector pixel __a, vector pixel __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x08, 0x09, 0x18, 0x19, 0x0A, 0x0B, 0x1A, 0x1B,
+ 0x0C, 0x0D, 0x1C, 0x1D, 0x0E, 0x0F, 0x1E, 0x1F));
+}
+
+/* vec_vmrglw */
+
+#define __builtin_altivec_vmrglw vec_vmrglw
+
+static vector int __ATTRS_o_ai
+vec_vmrglw(vector int __a, vector int __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x08, 0x09, 0x0A, 0x0B, 0x18, 0x19, 0x1A, 0x1B,
+ 0x0C, 0x0D, 0x0E, 0x0F, 0x1C, 0x1D, 0x1E, 0x1F));
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vmrglw(vector unsigned int __a, vector unsigned int __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x08, 0x09, 0x0A, 0x0B, 0x18, 0x19, 0x1A, 0x1B,
+ 0x0C, 0x0D, 0x0E, 0x0F, 0x1C, 0x1D, 0x1E, 0x1F));
+}
+
+static vector bool int __ATTRS_o_ai
+vec_vmrglw(vector bool int __a, vector bool int __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x08, 0x09, 0x0A, 0x0B, 0x18, 0x19, 0x1A, 0x1B,
+ 0x0C, 0x0D, 0x0E, 0x0F, 0x1C, 0x1D, 0x1E, 0x1F));
+}
+
+static vector float __ATTRS_o_ai
+vec_vmrglw(vector float __a, vector float __b)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (0x08, 0x09, 0x0A, 0x0B, 0x18, 0x19, 0x1A, 0x1B,
+ 0x0C, 0x0D, 0x0E, 0x0F, 0x1C, 0x1D, 0x1E, 0x1F));
+}
+
+/* vec_mfvscr */
+
+static vector unsigned short __attribute__((__always_inline__))
+vec_mfvscr(void)
+{
+ return __builtin_altivec_mfvscr();
+}
+
+/* vec_min */
+
+static vector signed char __ATTRS_o_ai
+vec_min(vector signed char __a, vector signed char __b)
+{
+ return __builtin_altivec_vminsb(__a, __b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_min(vector bool char __a, vector signed char __b)
+{
+ return __builtin_altivec_vminsb((vector signed char)__a, __b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_min(vector signed char __a, vector bool char __b)
+{
+ return __builtin_altivec_vminsb(__a, (vector signed char)__b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_min(vector unsigned char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vminub(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_min(vector bool char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vminub((vector unsigned char)__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_min(vector unsigned char __a, vector bool char __b)
+{
+ return __builtin_altivec_vminub(__a, (vector unsigned char)__b);
+}
+
+static vector short __ATTRS_o_ai
+vec_min(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vminsh(__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_min(vector bool short __a, vector short __b)
+{
+ return __builtin_altivec_vminsh((vector short)__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_min(vector short __a, vector bool short __b)
+{
+ return __builtin_altivec_vminsh(__a, (vector short)__b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_min(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vminuh(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_min(vector bool short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vminuh((vector unsigned short)__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_min(vector unsigned short __a, vector bool short __b)
+{
+ return __builtin_altivec_vminuh(__a, (vector unsigned short)__b);
+}
+
+static vector int __ATTRS_o_ai
+vec_min(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vminsw(__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_min(vector bool int __a, vector int __b)
+{
+ return __builtin_altivec_vminsw((vector int)__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_min(vector int __a, vector bool int __b)
+{
+ return __builtin_altivec_vminsw(__a, (vector int)__b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_min(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vminuw(__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_min(vector bool int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vminuw((vector unsigned int)__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_min(vector unsigned int __a, vector bool int __b)
+{
+ return __builtin_altivec_vminuw(__a, (vector unsigned int)__b);
+}
+
+static vector float __ATTRS_o_ai
+vec_min(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vminfp(__a, __b);
+}
+
+/* vec_vminsb */
+
+static vector signed char __ATTRS_o_ai
+vec_vminsb(vector signed char __a, vector signed char __b)
+{
+ return __builtin_altivec_vminsb(__a, __b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_vminsb(vector bool char __a, vector signed char __b)
+{
+ return __builtin_altivec_vminsb((vector signed char)__a, __b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_vminsb(vector signed char __a, vector bool char __b)
+{
+ return __builtin_altivec_vminsb(__a, (vector signed char)__b);
+}
+
+/* vec_vminub */
+
+static vector unsigned char __ATTRS_o_ai
+vec_vminub(vector unsigned char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vminub(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vminub(vector bool char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vminub((vector unsigned char)__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vminub(vector unsigned char __a, vector bool char __b)
+{
+ return __builtin_altivec_vminub(__a, (vector unsigned char)__b);
+}
+
+/* vec_vminsh */
+
+static vector short __ATTRS_o_ai
+vec_vminsh(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vminsh(__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_vminsh(vector bool short __a, vector short __b)
+{
+ return __builtin_altivec_vminsh((vector short)__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_vminsh(vector short __a, vector bool short __b)
+{
+ return __builtin_altivec_vminsh(__a, (vector short)__b);
+}
+
+/* vec_vminuh */
+
+static vector unsigned short __ATTRS_o_ai
+vec_vminuh(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vminuh(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vminuh(vector bool short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vminuh((vector unsigned short)__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vminuh(vector unsigned short __a, vector bool short __b)
+{
+ return __builtin_altivec_vminuh(__a, (vector unsigned short)__b);
+}
+
+/* vec_vminsw */
+
+static vector int __ATTRS_o_ai
+vec_vminsw(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vminsw(__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_vminsw(vector bool int __a, vector int __b)
+{
+ return __builtin_altivec_vminsw((vector int)__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_vminsw(vector int __a, vector bool int __b)
+{
+ return __builtin_altivec_vminsw(__a, (vector int)__b);
+}
+
+/* vec_vminuw */
+
+static vector unsigned int __ATTRS_o_ai
+vec_vminuw(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vminuw(__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vminuw(vector bool int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vminuw((vector unsigned int)__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vminuw(vector unsigned int __a, vector bool int __b)
+{
+ return __builtin_altivec_vminuw(__a, (vector unsigned int)__b);
+}
+
+/* vec_vminfp */
+
+static vector float __attribute__((__always_inline__))
+vec_vminfp(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vminfp(__a, __b);
+}
+
+/* vec_mladd */
+
+#define __builtin_altivec_vmladduhm vec_mladd
+
+static vector short __ATTRS_o_ai
+vec_mladd(vector short __a, vector short __b, vector short __c)
+{
+ return __a * __b + __c;
+}
+
+static vector short __ATTRS_o_ai
+vec_mladd(vector short __a, vector unsigned short __b, vector unsigned short __c)
+{
+ return __a * (vector short)__b + (vector short)__c;
+}
+
+static vector short __ATTRS_o_ai
+vec_mladd(vector unsigned short __a, vector short __b, vector short __c)
+{
+ return (vector short)__a * __b + __c;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_mladd(vector unsigned short __a,
+ vector unsigned short __b,
+ vector unsigned short __c)
+{
+ return __a * __b + __c;
+}
+
+/* vec_vmladduhm */
+
+static vector short __ATTRS_o_ai
+vec_vmladduhm(vector short __a, vector short __b, vector short __c)
+{
+ return __a * __b + __c;
+}
+
+static vector short __ATTRS_o_ai
+vec_vmladduhm(vector short __a, vector unsigned short __b, vector unsigned short __c)
+{
+ return __a * (vector short)__b + (vector short)__c;
+}
+
+static vector short __ATTRS_o_ai
+vec_vmladduhm(vector unsigned short __a, vector short __b, vector short __c)
+{
+ return (vector short)__a * __b + __c;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vmladduhm(vector unsigned short __a,
+ vector unsigned short __b,
+ vector unsigned short __c)
+{
+ return __a * __b + __c;
+}
+
+/* vec_mradds */
+
+static vector short __attribute__((__always_inline__))
+vec_mradds(vector short __a, vector short __b, vector short __c)
+{
+ return __builtin_altivec_vmhraddshs(__a, __b, __c);
+}
+
+/* vec_vmhraddshs */
+
+static vector short __attribute__((__always_inline__))
+vec_vmhraddshs(vector short __a, vector short __b, vector short __c)
+{
+ return __builtin_altivec_vmhraddshs(__a, __b, __c);
+}
+
+/* vec_msum */
+
+static vector int __ATTRS_o_ai
+vec_msum(vector signed char __a, vector unsigned char __b, vector int __c)
+{
+ return __builtin_altivec_vmsummbm(__a, __b, __c);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_msum(vector unsigned char __a, vector unsigned char __b, vector unsigned int __c)
+{
+ return __builtin_altivec_vmsumubm(__a, __b, __c);
+}
+
+static vector int __ATTRS_o_ai
+vec_msum(vector short __a, vector short __b, vector int __c)
+{
+ return __builtin_altivec_vmsumshm(__a, __b, __c);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_msum(vector unsigned short __a,
+ vector unsigned short __b,
+ vector unsigned int __c)
+{
+ return __builtin_altivec_vmsumuhm(__a, __b, __c);
+}
+
+/* vec_vmsummbm */
+
+static vector int __attribute__((__always_inline__))
+vec_vmsummbm(vector signed char __a, vector unsigned char __b, vector int __c)
+{
+ return __builtin_altivec_vmsummbm(__a, __b, __c);
+}
+
+/* vec_vmsumubm */
+
+static vector unsigned int __attribute__((__always_inline__))
+vec_vmsumubm(vector unsigned char __a,
+ vector unsigned char __b,
+ vector unsigned int __c)
+{
+ return __builtin_altivec_vmsumubm(__a, __b, __c);
+}
+
+/* vec_vmsumshm */
+
+static vector int __attribute__((__always_inline__))
+vec_vmsumshm(vector short __a, vector short __b, vector int __c)
+{
+ return __builtin_altivec_vmsumshm(__a, __b, __c);
+}
+
+/* vec_vmsumuhm */
+
+static vector unsigned int __attribute__((__always_inline__))
+vec_vmsumuhm(vector unsigned short __a,
+ vector unsigned short __b,
+ vector unsigned int __c)
+{
+ return __builtin_altivec_vmsumuhm(__a, __b, __c);
+}
+
+/* vec_msums */
+
+static vector int __ATTRS_o_ai
+vec_msums(vector short __a, vector short __b, vector int __c)
+{
+ return __builtin_altivec_vmsumshs(__a, __b, __c);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_msums(vector unsigned short __a,
+ vector unsigned short __b,
+ vector unsigned int __c)
+{
+ return __builtin_altivec_vmsumuhs(__a, __b, __c);
+}
+
+/* vec_vmsumshs */
+
+static vector int __attribute__((__always_inline__))
+vec_vmsumshs(vector short __a, vector short __b, vector int __c)
+{
+ return __builtin_altivec_vmsumshs(__a, __b, __c);
+}
+
+/* vec_vmsumuhs */
+
+static vector unsigned int __attribute__((__always_inline__))
+vec_vmsumuhs(vector unsigned short __a,
+ vector unsigned short __b,
+ vector unsigned int __c)
+{
+ return __builtin_altivec_vmsumuhs(__a, __b, __c);
+}
+
+/* vec_mtvscr */
+
+static void __ATTRS_o_ai
+vec_mtvscr(vector signed char __a)
+{
+ __builtin_altivec_mtvscr((vector int)__a);
+}
+
+static void __ATTRS_o_ai
+vec_mtvscr(vector unsigned char __a)
+{
+ __builtin_altivec_mtvscr((vector int)__a);
+}
+
+static void __ATTRS_o_ai
+vec_mtvscr(vector bool char __a)
+{
+ __builtin_altivec_mtvscr((vector int)__a);
+}
+
+static void __ATTRS_o_ai
+vec_mtvscr(vector short __a)
+{
+ __builtin_altivec_mtvscr((vector int)__a);
+}
+
+static void __ATTRS_o_ai
+vec_mtvscr(vector unsigned short __a)
+{
+ __builtin_altivec_mtvscr((vector int)__a);
+}
+
+static void __ATTRS_o_ai
+vec_mtvscr(vector bool short __a)
+{
+ __builtin_altivec_mtvscr((vector int)__a);
+}
+
+static void __ATTRS_o_ai
+vec_mtvscr(vector pixel __a)
+{
+ __builtin_altivec_mtvscr((vector int)__a);
+}
+
+static void __ATTRS_o_ai
+vec_mtvscr(vector int __a)
+{
+ __builtin_altivec_mtvscr((vector int)__a);
+}
+
+static void __ATTRS_o_ai
+vec_mtvscr(vector unsigned int __a)
+{
+ __builtin_altivec_mtvscr((vector int)__a);
+}
+
+static void __ATTRS_o_ai
+vec_mtvscr(vector bool int __a)
+{
+ __builtin_altivec_mtvscr((vector int)__a);
+}
+
+static void __ATTRS_o_ai
+vec_mtvscr(vector float __a)
+{
+ __builtin_altivec_mtvscr((vector int)__a);
+}
+
+/* vec_mule */
+
+static vector short __ATTRS_o_ai
+vec_mule(vector signed char __a, vector signed char __b)
+{
+ return __builtin_altivec_vmulesb(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_mule(vector unsigned char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vmuleub(__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_mule(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vmulesh(__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_mule(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vmuleuh(__a, __b);
+}
+
+/* vec_vmulesb */
+
+static vector short __attribute__((__always_inline__))
+vec_vmulesb(vector signed char __a, vector signed char __b)
+{
+ return __builtin_altivec_vmulesb(__a, __b);
+}
+
+/* vec_vmuleub */
+
+static vector unsigned short __attribute__((__always_inline__))
+vec_vmuleub(vector unsigned char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vmuleub(__a, __b);
+}
+
+/* vec_vmulesh */
+
+static vector int __attribute__((__always_inline__))
+vec_vmulesh(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vmulesh(__a, __b);
+}
+
+/* vec_vmuleuh */
+
+static vector unsigned int __attribute__((__always_inline__))
+vec_vmuleuh(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vmuleuh(__a, __b);
+}
+
+/* vec_mulo */
+
+static vector short __ATTRS_o_ai
+vec_mulo(vector signed char __a, vector signed char __b)
+{
+ return __builtin_altivec_vmulosb(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_mulo(vector unsigned char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vmuloub(__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_mulo(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vmulosh(__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_mulo(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vmulouh(__a, __b);
+}
+
+/* vec_vmulosb */
+
+static vector short __attribute__((__always_inline__))
+vec_vmulosb(vector signed char __a, vector signed char __b)
+{
+ return __builtin_altivec_vmulosb(__a, __b);
+}
+
+/* vec_vmuloub */
+
+static vector unsigned short __attribute__((__always_inline__))
+vec_vmuloub(vector unsigned char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vmuloub(__a, __b);
+}
+
+/* vec_vmulosh */
+
+static vector int __attribute__((__always_inline__))
+vec_vmulosh(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vmulosh(__a, __b);
+}
+
+/* vec_vmulouh */
+
+static vector unsigned int __attribute__((__always_inline__))
+vec_vmulouh(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vmulouh(__a, __b);
+}
+
+/* vec_nmsub */
+
+static vector float __attribute__((__always_inline__))
+vec_nmsub(vector float __a, vector float __b, vector float __c)
+{
+ return __builtin_altivec_vnmsubfp(__a, __b, __c);
+}
+
+/* vec_vnmsubfp */
+
+static vector float __attribute__((__always_inline__))
+vec_vnmsubfp(vector float __a, vector float __b, vector float __c)
+{
+ return __builtin_altivec_vnmsubfp(__a, __b, __c);
+}
+
+/* vec_nor */
+
+#define __builtin_altivec_vnor vec_nor
+
+static vector signed char __ATTRS_o_ai
+vec_nor(vector signed char __a, vector signed char __b)
+{
+ return ~(__a | __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_nor(vector unsigned char __a, vector unsigned char __b)
+{
+ return ~(__a | __b);
+}
+
+static vector bool char __ATTRS_o_ai
+vec_nor(vector bool char __a, vector bool char __b)
+{
+ return ~(__a | __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_nor(vector short __a, vector short __b)
+{
+ return ~(__a | __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_nor(vector unsigned short __a, vector unsigned short __b)
+{
+ return ~(__a | __b);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_nor(vector bool short __a, vector bool short __b)
+{
+ return ~(__a | __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_nor(vector int __a, vector int __b)
+{
+ return ~(__a | __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_nor(vector unsigned int __a, vector unsigned int __b)
+{
+ return ~(__a | __b);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_nor(vector bool int __a, vector bool int __b)
+{
+ return ~(__a | __b);
+}
+
+static vector float __ATTRS_o_ai
+vec_nor(vector float __a, vector float __b)
+{
+ vector unsigned int __res = ~((vector unsigned int)__a | (vector unsigned int)__b);
+ return (vector float)__res;
+}
+
+/* vec_vnor */
+
+static vector signed char __ATTRS_o_ai
+vec_vnor(vector signed char __a, vector signed char __b)
+{
+ return ~(__a | __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vnor(vector unsigned char __a, vector unsigned char __b)
+{
+ return ~(__a | __b);
+}
+
+static vector bool char __ATTRS_o_ai
+vec_vnor(vector bool char __a, vector bool char __b)
+{
+ return ~(__a | __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_vnor(vector short __a, vector short __b)
+{
+ return ~(__a | __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vnor(vector unsigned short __a, vector unsigned short __b)
+{
+ return ~(__a | __b);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_vnor(vector bool short __a, vector bool short __b)
+{
+ return ~(__a | __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_vnor(vector int __a, vector int __b)
+{
+ return ~(__a | __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vnor(vector unsigned int __a, vector unsigned int __b)
+{
+ return ~(__a | __b);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_vnor(vector bool int __a, vector bool int __b)
+{
+ return ~(__a | __b);
+}
+
+static vector float __ATTRS_o_ai
+vec_vnor(vector float __a, vector float __b)
+{
+ vector unsigned int __res = ~((vector unsigned int)__a | (vector unsigned int)__b);
+ return (vector float)__res;
+}
+
+/* vec_or */
+
+#define __builtin_altivec_vor vec_or
+
+static vector signed char __ATTRS_o_ai
+vec_or(vector signed char __a, vector signed char __b)
+{
+ return __a | __b;
+}
+
+static vector signed char __ATTRS_o_ai
+vec_or(vector bool char __a, vector signed char __b)
+{
+ return (vector signed char)__a | __b;
+}
+
+static vector signed char __ATTRS_o_ai
+vec_or(vector signed char __a, vector bool char __b)
+{
+ return __a | (vector signed char)__b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_or(vector unsigned char __a, vector unsigned char __b)
+{
+ return __a | __b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_or(vector bool char __a, vector unsigned char __b)
+{
+ return (vector unsigned char)__a | __b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_or(vector unsigned char __a, vector bool char __b)
+{
+ return __a | (vector unsigned char)__b;
+}
+
+static vector bool char __ATTRS_o_ai
+vec_or(vector bool char __a, vector bool char __b)
+{
+ return __a | __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_or(vector short __a, vector short __b)
+{
+ return __a | __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_or(vector bool short __a, vector short __b)
+{
+ return (vector short)__a | __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_or(vector short __a, vector bool short __b)
+{
+ return __a | (vector short)__b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_or(vector unsigned short __a, vector unsigned short __b)
+{
+ return __a | __b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_or(vector bool short __a, vector unsigned short __b)
+{
+ return (vector unsigned short)__a | __b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_or(vector unsigned short __a, vector bool short __b)
+{
+ return __a | (vector unsigned short)__b;
+}
+
+static vector bool short __ATTRS_o_ai
+vec_or(vector bool short __a, vector bool short __b)
+{
+ return __a | __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_or(vector int __a, vector int __b)
+{
+ return __a | __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_or(vector bool int __a, vector int __b)
+{
+ return (vector int)__a | __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_or(vector int __a, vector bool int __b)
+{
+ return __a | (vector int)__b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_or(vector unsigned int __a, vector unsigned int __b)
+{
+ return __a | __b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_or(vector bool int __a, vector unsigned int __b)
+{
+ return (vector unsigned int)__a | __b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_or(vector unsigned int __a, vector bool int __b)
+{
+ return __a | (vector unsigned int)__b;
+}
+
+static vector bool int __ATTRS_o_ai
+vec_or(vector bool int __a, vector bool int __b)
+{
+ return __a | __b;
+}
+
+static vector float __ATTRS_o_ai
+vec_or(vector float __a, vector float __b)
+{
+ vector unsigned int __res = (vector unsigned int)__a | (vector unsigned int)__b;
+ return (vector float)__res;
+}
+
+static vector float __ATTRS_o_ai
+vec_or(vector bool int __a, vector float __b)
+{
+ vector unsigned int __res = (vector unsigned int)__a | (vector unsigned int)__b;
+ return (vector float)__res;
+}
+
+static vector float __ATTRS_o_ai
+vec_or(vector float __a, vector bool int __b)
+{
+ vector unsigned int __res = (vector unsigned int)__a | (vector unsigned int)__b;
+ return (vector float)__res;
+}
+
+/* vec_vor */
+
+static vector signed char __ATTRS_o_ai
+vec_vor(vector signed char __a, vector signed char __b)
+{
+ return __a | __b;
+}
+
+static vector signed char __ATTRS_o_ai
+vec_vor(vector bool char __a, vector signed char __b)
+{
+ return (vector signed char)__a | __b;
+}
+
+static vector signed char __ATTRS_o_ai
+vec_vor(vector signed char __a, vector bool char __b)
+{
+ return __a | (vector signed char)__b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vor(vector unsigned char __a, vector unsigned char __b)
+{
+ return __a | __b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vor(vector bool char __a, vector unsigned char __b)
+{
+ return (vector unsigned char)__a | __b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vor(vector unsigned char __a, vector bool char __b)
+{
+ return __a | (vector unsigned char)__b;
+}
+
+static vector bool char __ATTRS_o_ai
+vec_vor(vector bool char __a, vector bool char __b)
+{
+ return __a | __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_vor(vector short __a, vector short __b)
+{
+ return __a | __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_vor(vector bool short __a, vector short __b)
+{
+ return (vector short)__a | __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_vor(vector short __a, vector bool short __b)
+{
+ return __a | (vector short)__b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vor(vector unsigned short __a, vector unsigned short __b)
+{
+ return __a | __b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vor(vector bool short __a, vector unsigned short __b)
+{
+ return (vector unsigned short)__a | __b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vor(vector unsigned short __a, vector bool short __b)
+{
+ return __a | (vector unsigned short)__b;
+}
+
+static vector bool short __ATTRS_o_ai
+vec_vor(vector bool short __a, vector bool short __b)
+{
+ return __a | __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_vor(vector int __a, vector int __b)
+{
+ return __a | __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_vor(vector bool int __a, vector int __b)
+{
+ return (vector int)__a | __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_vor(vector int __a, vector bool int __b)
+{
+ return __a | (vector int)__b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vor(vector unsigned int __a, vector unsigned int __b)
+{
+ return __a | __b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vor(vector bool int __a, vector unsigned int __b)
+{
+ return (vector unsigned int)__a | __b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vor(vector unsigned int __a, vector bool int __b)
+{
+ return __a | (vector unsigned int)__b;
+}
+
+static vector bool int __ATTRS_o_ai
+vec_vor(vector bool int __a, vector bool int __b)
+{
+ return __a | __b;
+}
+
+static vector float __ATTRS_o_ai
+vec_vor(vector float __a, vector float __b)
+{
+ vector unsigned int __res = (vector unsigned int)__a | (vector unsigned int)__b;
+ return (vector float)__res;
+}
+
+static vector float __ATTRS_o_ai
+vec_vor(vector bool int __a, vector float __b)
+{
+ vector unsigned int __res = (vector unsigned int)__a | (vector unsigned int)__b;
+ return (vector float)__res;
+}
+
+static vector float __ATTRS_o_ai
+vec_vor(vector float __a, vector bool int __b)
+{
+ vector unsigned int __res = (vector unsigned int)__a | (vector unsigned int)__b;
+ return (vector float)__res;
+}
+
+/* vec_pack */
+
+static vector signed char __ATTRS_o_ai
+vec_pack(vector signed short __a, vector signed short __b)
+{
+ return (vector signed char)vec_perm(__a, __b, (vector unsigned char)
+ (0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F,
+ 0x11, 0x13, 0x15, 0x17, 0x19, 0x1B, 0x1D, 0x1F));
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_pack(vector unsigned short __a, vector unsigned short __b)
+{
+ return (vector unsigned char)vec_perm(__a, __b, (vector unsigned char)
+ (0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F,
+ 0x11, 0x13, 0x15, 0x17, 0x19, 0x1B, 0x1D, 0x1F));
+}
+
+static vector bool char __ATTRS_o_ai
+vec_pack(vector bool short __a, vector bool short __b)
+{
+ return (vector bool char)vec_perm(__a, __b, (vector unsigned char)
+ (0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F,
+ 0x11, 0x13, 0x15, 0x17, 0x19, 0x1B, 0x1D, 0x1F));
+}
+
+static vector short __ATTRS_o_ai
+vec_pack(vector int __a, vector int __b)
+{
+ return (vector short)vec_perm(__a, __b, (vector unsigned char)
+ (0x02, 0x03, 0x06, 0x07, 0x0A, 0x0B, 0x0E, 0x0F,
+ 0x12, 0x13, 0x16, 0x17, 0x1A, 0x1B, 0x1E, 0x1F));
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_pack(vector unsigned int __a, vector unsigned int __b)
+{
+ return (vector unsigned short)vec_perm(__a, __b, (vector unsigned char)
+ (0x02, 0x03, 0x06, 0x07, 0x0A, 0x0B, 0x0E, 0x0F,
+ 0x12, 0x13, 0x16, 0x17, 0x1A, 0x1B, 0x1E, 0x1F));
+}
+
+static vector bool short __ATTRS_o_ai
+vec_pack(vector bool int __a, vector bool int __b)
+{
+ return (vector bool short)vec_perm(__a, __b, (vector unsigned char)
+ (0x02, 0x03, 0x06, 0x07, 0x0A, 0x0B, 0x0E, 0x0F,
+ 0x12, 0x13, 0x16, 0x17, 0x1A, 0x1B, 0x1E, 0x1F));
+}
+
+/* vec_vpkuhum */
+
+#define __builtin_altivec_vpkuhum vec_vpkuhum
+
+static vector signed char __ATTRS_o_ai
+vec_vpkuhum(vector signed short __a, vector signed short __b)
+{
+ return (vector signed char)vec_perm(__a, __b, (vector unsigned char)
+ (0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F,
+ 0x11, 0x13, 0x15, 0x17, 0x19, 0x1B, 0x1D, 0x1F));
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vpkuhum(vector unsigned short __a, vector unsigned short __b)
+{
+ return (vector unsigned char)vec_perm(__a, __b, (vector unsigned char)
+ (0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F,
+ 0x11, 0x13, 0x15, 0x17, 0x19, 0x1B, 0x1D, 0x1F));
+}
+
+static vector bool char __ATTRS_o_ai
+vec_vpkuhum(vector bool short __a, vector bool short __b)
+{
+ return (vector bool char)vec_perm(__a, __b, (vector unsigned char)
+ (0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F,
+ 0x11, 0x13, 0x15, 0x17, 0x19, 0x1B, 0x1D, 0x1F));
+}
+
+/* vec_vpkuwum */
+
+#define __builtin_altivec_vpkuwum vec_vpkuwum
+
+static vector short __ATTRS_o_ai
+vec_vpkuwum(vector int __a, vector int __b)
+{
+ return (vector short)vec_perm(__a, __b, (vector unsigned char)
+ (0x02, 0x03, 0x06, 0x07, 0x0A, 0x0B, 0x0E, 0x0F,
+ 0x12, 0x13, 0x16, 0x17, 0x1A, 0x1B, 0x1E, 0x1F));
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vpkuwum(vector unsigned int __a, vector unsigned int __b)
+{
+ return (vector unsigned short)vec_perm(__a, __b, (vector unsigned char)
+ (0x02, 0x03, 0x06, 0x07, 0x0A, 0x0B, 0x0E, 0x0F,
+ 0x12, 0x13, 0x16, 0x17, 0x1A, 0x1B, 0x1E, 0x1F));
+}
+
+static vector bool short __ATTRS_o_ai
+vec_vpkuwum(vector bool int __a, vector bool int __b)
+{
+ return (vector bool short)vec_perm(__a, __b, (vector unsigned char)
+ (0x02, 0x03, 0x06, 0x07, 0x0A, 0x0B, 0x0E, 0x0F,
+ 0x12, 0x13, 0x16, 0x17, 0x1A, 0x1B, 0x1E, 0x1F));
+}
+
+/* vec_packpx */
+
+static vector pixel __attribute__((__always_inline__))
+vec_packpx(vector unsigned int __a, vector unsigned int __b)
+{
+ return (vector pixel)__builtin_altivec_vpkpx(__a, __b);
+}
+
+/* vec_vpkpx */
+
+static vector pixel __attribute__((__always_inline__))
+vec_vpkpx(vector unsigned int __a, vector unsigned int __b)
+{
+ return (vector pixel)__builtin_altivec_vpkpx(__a, __b);
+}
+
+/* vec_packs */
+
+static vector signed char __ATTRS_o_ai
+vec_packs(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vpkshss(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_packs(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vpkuhus(__a, __b);
+}
+
+static vector signed short __ATTRS_o_ai
+vec_packs(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vpkswss(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_packs(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vpkuwus(__a, __b);
+}
+
+/* vec_vpkshss */
+
+static vector signed char __attribute__((__always_inline__))
+vec_vpkshss(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vpkshss(__a, __b);
+}
+
+/* vec_vpkuhus */
+
+static vector unsigned char __attribute__((__always_inline__))
+vec_vpkuhus(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vpkuhus(__a, __b);
+}
+
+/* vec_vpkswss */
+
+static vector signed short __attribute__((__always_inline__))
+vec_vpkswss(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vpkswss(__a, __b);
+}
+
+/* vec_vpkuwus */
+
+static vector unsigned short __attribute__((__always_inline__))
+vec_vpkuwus(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vpkuwus(__a, __b);
+}
+
+/* vec_packsu */
+
+static vector unsigned char __ATTRS_o_ai
+vec_packsu(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vpkshus(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_packsu(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vpkuhus(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_packsu(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vpkswus(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_packsu(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vpkuwus(__a, __b);
+}
+
+/* vec_vpkshus */
+
+static vector unsigned char __ATTRS_o_ai
+vec_vpkshus(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vpkshus(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vpkshus(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vpkuhus(__a, __b);
+}
+
+/* vec_vpkswus */
+
+static vector unsigned short __ATTRS_o_ai
+vec_vpkswus(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vpkswus(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vpkswus(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vpkuwus(__a, __b);
+}
+
+/* vec_perm */
+
+vector signed char __ATTRS_o_ai
+vec_perm(vector signed char __a, vector signed char __b, vector unsigned char __c)
+{
+ return (vector signed char)
+ __builtin_altivec_vperm_4si((vector int)__a, (vector int)__b, __c);
+}
+
+vector unsigned char __ATTRS_o_ai
+vec_perm(vector unsigned char __a,
+ vector unsigned char __b,
+ vector unsigned char __c)
+{
+ return (vector unsigned char)
+ __builtin_altivec_vperm_4si((vector int)__a, (vector int)__b, __c);
+}
+
+vector bool char __ATTRS_o_ai
+vec_perm(vector bool char __a, vector bool char __b, vector unsigned char __c)
+{
+ return (vector bool char)
+ __builtin_altivec_vperm_4si((vector int)__a, (vector int)__b, __c);
+}
+
+vector short __ATTRS_o_ai
+vec_perm(vector short __a, vector short __b, vector unsigned char __c)
+{
+ return (vector short)
+ __builtin_altivec_vperm_4si((vector int)__a, (vector int)__b, __c);
+}
+
+vector unsigned short __ATTRS_o_ai
+vec_perm(vector unsigned short __a,
+ vector unsigned short __b,
+ vector unsigned char __c)
+{
+ return (vector unsigned short)
+ __builtin_altivec_vperm_4si((vector int)__a, (vector int)__b, __c);
+}
+
+vector bool short __ATTRS_o_ai
+vec_perm(vector bool short __a, vector bool short __b, vector unsigned char __c)
+{
+ return (vector bool short)
+ __builtin_altivec_vperm_4si((vector int)__a, (vector int)__b, __c);
+}
+
+vector pixel __ATTRS_o_ai
+vec_perm(vector pixel __a, vector pixel __b, vector unsigned char __c)
+{
+ return (vector pixel)
+ __builtin_altivec_vperm_4si((vector int)__a, (vector int)__b, __c);
+}
+
+vector int __ATTRS_o_ai
+vec_perm(vector int __a, vector int __b, vector unsigned char __c)
+{
+ return (vector int)__builtin_altivec_vperm_4si(__a, __b, __c);
+}
+
+vector unsigned int __ATTRS_o_ai
+vec_perm(vector unsigned int __a, vector unsigned int __b, vector unsigned char __c)
+{
+ return (vector unsigned int)
+ __builtin_altivec_vperm_4si((vector int)__a, (vector int)__b, __c);
+}
+
+vector bool int __ATTRS_o_ai
+vec_perm(vector bool int __a, vector bool int __b, vector unsigned char __c)
+{
+ return (vector bool int)
+ __builtin_altivec_vperm_4si((vector int)__a, (vector int)__b, __c);
+}
+
+vector float __ATTRS_o_ai
+vec_perm(vector float __a, vector float __b, vector unsigned char __c)
+{
+ return (vector float)
+ __builtin_altivec_vperm_4si((vector int)__a, (vector int)__b, __c);
+}
+
+/* vec_vperm */
+
+static vector signed char __ATTRS_o_ai
+vec_vperm(vector signed char __a, vector signed char __b, vector unsigned char __c)
+{
+ return (vector signed char)
+ __builtin_altivec_vperm_4si((vector int)__a, (vector int)__b, __c);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vperm(vector unsigned char __a,
+ vector unsigned char __b,
+ vector unsigned char __c)
+{
+ return (vector unsigned char)
+ __builtin_altivec_vperm_4si((vector int)__a, (vector int)__b, __c);
+}
+
+static vector bool char __ATTRS_o_ai
+vec_vperm(vector bool char __a, vector bool char __b, vector unsigned char __c)
+{
+ return (vector bool char)
+ __builtin_altivec_vperm_4si((vector int)__a, (vector int)__b, __c);
+}
+
+static vector short __ATTRS_o_ai
+vec_vperm(vector short __a, vector short __b, vector unsigned char __c)
+{
+ return (vector short)
+ __builtin_altivec_vperm_4si((vector int)__a, (vector int)__b, __c);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vperm(vector unsigned short __a,
+ vector unsigned short __b,
+ vector unsigned char __c)
+{
+ return (vector unsigned short)
+ __builtin_altivec_vperm_4si((vector int)__a, (vector int)__b, __c);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_vperm(vector bool short __a, vector bool short __b, vector unsigned char __c)
+{
+ return (vector bool short)
+ __builtin_altivec_vperm_4si((vector int)__a, (vector int)__b, __c);
+}
+
+static vector pixel __ATTRS_o_ai
+vec_vperm(vector pixel __a, vector pixel __b, vector unsigned char __c)
+{
+ return (vector pixel)
+ __builtin_altivec_vperm_4si((vector int)__a, (vector int)__b, __c);
+}
+
+static vector int __ATTRS_o_ai
+vec_vperm(vector int __a, vector int __b, vector unsigned char __c)
+{
+ return (vector int)__builtin_altivec_vperm_4si(__a, __b, __c);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vperm(vector unsigned int __a, vector unsigned int __b, vector unsigned char __c)
+{
+ return (vector unsigned int)
+ __builtin_altivec_vperm_4si((vector int)__a, (vector int)__b, __c);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_vperm(vector bool int __a, vector bool int __b, vector unsigned char __c)
+{
+ return (vector bool int)
+ __builtin_altivec_vperm_4si((vector int)__a, (vector int)__b, __c);
+}
+
+static vector float __ATTRS_o_ai
+vec_vperm(vector float __a, vector float __b, vector unsigned char __c)
+{
+ return (vector float)
+ __builtin_altivec_vperm_4si((vector int)__a, (vector int)__b, __c);
+}
+
+/* vec_re */
+
+static vector float __attribute__((__always_inline__))
+vec_re(vector float __a)
+{
+ return __builtin_altivec_vrefp(__a);
+}
+
+/* vec_vrefp */
+
+static vector float __attribute__((__always_inline__))
+vec_vrefp(vector float __a)
+{
+ return __builtin_altivec_vrefp(__a);
+}
+
+/* vec_rl */
+
+static vector signed char __ATTRS_o_ai
+vec_rl(vector signed char __a, vector unsigned char __b)
+{
+ return (vector signed char)__builtin_altivec_vrlb((vector char)__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_rl(vector unsigned char __a, vector unsigned char __b)
+{
+ return (vector unsigned char)__builtin_altivec_vrlb((vector char)__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_rl(vector short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vrlh(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_rl(vector unsigned short __a, vector unsigned short __b)
+{
+ return (vector unsigned short)__builtin_altivec_vrlh((vector short)__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_rl(vector int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vrlw(__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_rl(vector unsigned int __a, vector unsigned int __b)
+{
+ return (vector unsigned int)__builtin_altivec_vrlw((vector int)__a, __b);
+}
+
+/* vec_vrlb */
+
+static vector signed char __ATTRS_o_ai
+vec_vrlb(vector signed char __a, vector unsigned char __b)
+{
+ return (vector signed char)__builtin_altivec_vrlb((vector char)__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vrlb(vector unsigned char __a, vector unsigned char __b)
+{
+ return (vector unsigned char)__builtin_altivec_vrlb((vector char)__a, __b);
+}
+
+/* vec_vrlh */
+
+static vector short __ATTRS_o_ai
+vec_vrlh(vector short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vrlh(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vrlh(vector unsigned short __a, vector unsigned short __b)
+{
+ return (vector unsigned short)__builtin_altivec_vrlh((vector short)__a, __b);
+}
+
+/* vec_vrlw */
+
+static vector int __ATTRS_o_ai
+vec_vrlw(vector int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vrlw(__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vrlw(vector unsigned int __a, vector unsigned int __b)
+{
+ return (vector unsigned int)__builtin_altivec_vrlw((vector int)__a, __b);
+}
+
+/* vec_round */
+
+static vector float __attribute__((__always_inline__))
+vec_round(vector float __a)
+{
+ return __builtin_altivec_vrfin(__a);
+}
+
+/* vec_vrfin */
+
+static vector float __attribute__((__always_inline__))
+vec_vrfin(vector float __a)
+{
+ return __builtin_altivec_vrfin(__a);
+}
+
+/* vec_rsqrte */
+
+static __vector float __attribute__((__always_inline__))
+vec_rsqrte(vector float __a)
+{
+ return __builtin_altivec_vrsqrtefp(__a);
+}
+
+/* vec_vrsqrtefp */
+
+static __vector float __attribute__((__always_inline__))
+vec_vrsqrtefp(vector float __a)
+{
+ return __builtin_altivec_vrsqrtefp(__a);
+}
+
+/* vec_sel */
+
+#define __builtin_altivec_vsel_4si vec_sel
+
+static vector signed char __ATTRS_o_ai
+vec_sel(vector signed char __a, vector signed char __b, vector unsigned char __c)
+{
+ return (__a & ~(vector signed char)__c) | (__b & (vector signed char)__c);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_sel(vector signed char __a, vector signed char __b, vector bool char __c)
+{
+ return (__a & ~(vector signed char)__c) | (__b & (vector signed char)__c);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_sel(vector unsigned char __a, vector unsigned char __b, vector unsigned char __c)
+{
+ return (__a & ~__c) | (__b & __c);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_sel(vector unsigned char __a, vector unsigned char __b, vector bool char __c)
+{
+ return (__a & ~(vector unsigned char)__c) | (__b & (vector unsigned char)__c);
+}
+
+static vector bool char __ATTRS_o_ai
+vec_sel(vector bool char __a, vector bool char __b, vector unsigned char __c)
+{
+ return (__a & ~(vector bool char)__c) | (__b & (vector bool char)__c);
+}
+
+static vector bool char __ATTRS_o_ai
+vec_sel(vector bool char __a, vector bool char __b, vector bool char __c)
+{
+ return (__a & ~__c) | (__b & __c);
+}
+
+static vector short __ATTRS_o_ai
+vec_sel(vector short __a, vector short __b, vector unsigned short __c)
+{
+ return (__a & ~(vector short)__c) | (__b & (vector short)__c);
+}
+
+static vector short __ATTRS_o_ai
+vec_sel(vector short __a, vector short __b, vector bool short __c)
+{
+ return (__a & ~(vector short)__c) | (__b & (vector short)__c);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_sel(vector unsigned short __a,
+ vector unsigned short __b,
+ vector unsigned short __c)
+{
+ return (__a & ~__c) | (__b & __c);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_sel(vector unsigned short __a, vector unsigned short __b, vector bool short __c)
+{
+ return (__a & ~(vector unsigned short)__c) | (__b & (vector unsigned short)__c);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_sel(vector bool short __a, vector bool short __b, vector unsigned short __c)
+{
+ return (__a & ~(vector bool short)__c) | (__b & (vector bool short)__c);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_sel(vector bool short __a, vector bool short __b, vector bool short __c)
+{
+ return (__a & ~__c) | (__b & __c);
+}
+
+static vector int __ATTRS_o_ai
+vec_sel(vector int __a, vector int __b, vector unsigned int __c)
+{
+ return (__a & ~(vector int)__c) | (__b & (vector int)__c);
+}
+
+static vector int __ATTRS_o_ai
+vec_sel(vector int __a, vector int __b, vector bool int __c)
+{
+ return (__a & ~(vector int)__c) | (__b & (vector int)__c);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_sel(vector unsigned int __a, vector unsigned int __b, vector unsigned int __c)
+{
+ return (__a & ~__c) | (__b & __c);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_sel(vector unsigned int __a, vector unsigned int __b, vector bool int __c)
+{
+ return (__a & ~(vector unsigned int)__c) | (__b & (vector unsigned int)__c);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_sel(vector bool int __a, vector bool int __b, vector unsigned int __c)
+{
+ return (__a & ~(vector bool int)__c) | (__b & (vector bool int)__c);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_sel(vector bool int __a, vector bool int __b, vector bool int __c)
+{
+ return (__a & ~__c) | (__b & __c);
+}
+
+static vector float __ATTRS_o_ai
+vec_sel(vector float __a, vector float __b, vector unsigned int __c)
+{
+ vector int __res = ((vector int)__a & ~(vector int)__c)
+ | ((vector int)__b & (vector int)__c);
+ return (vector float)__res;
+}
+
+static vector float __ATTRS_o_ai
+vec_sel(vector float __a, vector float __b, vector bool int __c)
+{
+ vector int __res = ((vector int)__a & ~(vector int)__c)
+ | ((vector int)__b & (vector int)__c);
+ return (vector float)__res;
+}
+
+/* vec_vsel */
+
+static vector signed char __ATTRS_o_ai
+vec_vsel(vector signed char __a, vector signed char __b, vector unsigned char __c)
+{
+ return (__a & ~(vector signed char)__c) | (__b & (vector signed char)__c);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_vsel(vector signed char __a, vector signed char __b, vector bool char __c)
+{
+ return (__a & ~(vector signed char)__c) | (__b & (vector signed char)__c);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vsel(vector unsigned char __a, vector unsigned char __b, vector unsigned char __c)
+{
+ return (__a & ~__c) | (__b & __c);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vsel(vector unsigned char __a, vector unsigned char __b, vector bool char __c)
+{
+ return (__a & ~(vector unsigned char)__c) | (__b & (vector unsigned char)__c);
+}
+
+static vector bool char __ATTRS_o_ai
+vec_vsel(vector bool char __a, vector bool char __b, vector unsigned char __c)
+{
+ return (__a & ~(vector bool char)__c) | (__b & (vector bool char)__c);
+}
+
+static vector bool char __ATTRS_o_ai
+vec_vsel(vector bool char __a, vector bool char __b, vector bool char __c)
+{
+ return (__a & ~__c) | (__b & __c);
+}
+
+static vector short __ATTRS_o_ai
+vec_vsel(vector short __a, vector short __b, vector unsigned short __c)
+{
+ return (__a & ~(vector short)__c) | (__b & (vector short)__c);
+}
+
+static vector short __ATTRS_o_ai
+vec_vsel(vector short __a, vector short __b, vector bool short __c)
+{
+ return (__a & ~(vector short)__c) | (__b & (vector short)__c);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vsel(vector unsigned short __a,
+ vector unsigned short __b,
+ vector unsigned short __c)
+{
+ return (__a & ~__c) | (__b & __c);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vsel(vector unsigned short __a, vector unsigned short __b, vector bool short __c)
+{
+ return (__a & ~(vector unsigned short)__c) | (__b & (vector unsigned short)__c);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_vsel(vector bool short __a, vector bool short __b, vector unsigned short __c)
+{
+ return (__a & ~(vector bool short)__c) | (__b & (vector bool short)__c);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_vsel(vector bool short __a, vector bool short __b, vector bool short __c)
+{
+ return (__a & ~__c) | (__b & __c);
+}
+
+static vector int __ATTRS_o_ai
+vec_vsel(vector int __a, vector int __b, vector unsigned int __c)
+{
+ return (__a & ~(vector int)__c) | (__b & (vector int)__c);
+}
+
+static vector int __ATTRS_o_ai
+vec_vsel(vector int __a, vector int __b, vector bool int __c)
+{
+ return (__a & ~(vector int)__c) | (__b & (vector int)__c);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vsel(vector unsigned int __a, vector unsigned int __b, vector unsigned int __c)
+{
+ return (__a & ~__c) | (__b & __c);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vsel(vector unsigned int __a, vector unsigned int __b, vector bool int __c)
+{
+ return (__a & ~(vector unsigned int)__c) | (__b & (vector unsigned int)__c);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_vsel(vector bool int __a, vector bool int __b, vector unsigned int __c)
+{
+ return (__a & ~(vector bool int)__c) | (__b & (vector bool int)__c);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_vsel(vector bool int __a, vector bool int __b, vector bool int __c)
+{
+ return (__a & ~__c) | (__b & __c);
+}
+
+static vector float __ATTRS_o_ai
+vec_vsel(vector float __a, vector float __b, vector unsigned int __c)
+{
+ vector int __res = ((vector int)__a & ~(vector int)__c)
+ | ((vector int)__b & (vector int)__c);
+ return (vector float)__res;
+}
+
+static vector float __ATTRS_o_ai
+vec_vsel(vector float __a, vector float __b, vector bool int __c)
+{
+ vector int __res = ((vector int)__a & ~(vector int)__c)
+ | ((vector int)__b & (vector int)__c);
+ return (vector float)__res;
+}
+
+/* vec_sl */
+
+static vector signed char __ATTRS_o_ai
+vec_sl(vector signed char __a, vector unsigned char __b)
+{
+ return __a << (vector signed char)__b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_sl(vector unsigned char __a, vector unsigned char __b)
+{
+ return __a << __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_sl(vector short __a, vector unsigned short __b)
+{
+ return __a << (vector short)__b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_sl(vector unsigned short __a, vector unsigned short __b)
+{
+ return __a << __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_sl(vector int __a, vector unsigned int __b)
+{
+ return __a << (vector int)__b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_sl(vector unsigned int __a, vector unsigned int __b)
+{
+ return __a << __b;
+}
+
+/* vec_vslb */
+
+#define __builtin_altivec_vslb vec_vslb
+
+static vector signed char __ATTRS_o_ai
+vec_vslb(vector signed char __a, vector unsigned char __b)
+{
+ return vec_sl(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vslb(vector unsigned char __a, vector unsigned char __b)
+{
+ return vec_sl(__a, __b);
+}
+
+/* vec_vslh */
+
+#define __builtin_altivec_vslh vec_vslh
+
+static vector short __ATTRS_o_ai
+vec_vslh(vector short __a, vector unsigned short __b)
+{
+ return vec_sl(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vslh(vector unsigned short __a, vector unsigned short __b)
+{
+ return vec_sl(__a, __b);
+}
+
+/* vec_vslw */
+
+#define __builtin_altivec_vslw vec_vslw
+
+static vector int __ATTRS_o_ai
+vec_vslw(vector int __a, vector unsigned int __b)
+{
+ return vec_sl(__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vslw(vector unsigned int __a, vector unsigned int __b)
+{
+ return vec_sl(__a, __b);
+}
+
+/* vec_sld */
+
+#define __builtin_altivec_vsldoi_4si vec_sld
+
+static vector signed char __ATTRS_o_ai
+vec_sld(vector signed char __a, vector signed char __b, unsigned char __c)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7,
+ __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15));
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_sld(vector unsigned char __a, vector unsigned char __b, unsigned char __c)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7,
+ __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15));
+}
+
+static vector short __ATTRS_o_ai
+vec_sld(vector short __a, vector short __b, unsigned char __c)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7,
+ __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15));
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_sld(vector unsigned short __a, vector unsigned short __b, unsigned char __c)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7,
+ __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15));
+}
+
+static vector pixel __ATTRS_o_ai
+vec_sld(vector pixel __a, vector pixel __b, unsigned char __c)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7,
+ __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15));
+}
+
+static vector int __ATTRS_o_ai
+vec_sld(vector int __a, vector int __b, unsigned char __c)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7,
+ __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15));
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_sld(vector unsigned int __a, vector unsigned int __b, unsigned char __c)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7,
+ __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15));
+}
+
+static vector float __ATTRS_o_ai
+vec_sld(vector float __a, vector float __b, unsigned char __c)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7,
+ __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15));
+}
+
+/* vec_vsldoi */
+
+static vector signed char __ATTRS_o_ai
+vec_vsldoi(vector signed char __a, vector signed char __b, unsigned char __c)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7,
+ __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15));
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vsldoi(vector unsigned char __a, vector unsigned char __b, unsigned char __c)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7,
+ __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15));
+}
+
+static vector short __ATTRS_o_ai
+vec_vsldoi(vector short __a, vector short __b, unsigned char __c)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7,
+ __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15));
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vsldoi(vector unsigned short __a, vector unsigned short __b, unsigned char __c)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7,
+ __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15));
+}
+
+static vector pixel __ATTRS_o_ai
+vec_vsldoi(vector pixel __a, vector pixel __b, unsigned char __c)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7,
+ __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15));
+}
+
+static vector int __ATTRS_o_ai
+vec_vsldoi(vector int __a, vector int __b, unsigned char __c)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7,
+ __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15));
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vsldoi(vector unsigned int __a, vector unsigned int __b, unsigned char __c)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7,
+ __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15));
+}
+
+static vector float __ATTRS_o_ai
+vec_vsldoi(vector float __a, vector float __b, unsigned char __c)
+{
+ return vec_perm(__a, __b, (vector unsigned char)
+ (__c, __c+1, __c+2, __c+3, __c+4, __c+5, __c+6, __c+7,
+ __c+8, __c+9, __c+10, __c+11, __c+12, __c+13, __c+14, __c+15));
+}
+
+/* vec_sll */
+
+static vector signed char __ATTRS_o_ai
+vec_sll(vector signed char __a, vector unsigned char __b)
+{
+ return (vector signed char)
+ __builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_sll(vector signed char __a, vector unsigned short __b)
+{
+ return (vector signed char)
+ __builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_sll(vector signed char __a, vector unsigned int __b)
+{
+ return (vector signed char)
+ __builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_sll(vector unsigned char __a, vector unsigned char __b)
+{
+ return (vector unsigned char)
+ __builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_sll(vector unsigned char __a, vector unsigned short __b)
+{
+ return (vector unsigned char)
+ __builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_sll(vector unsigned char __a, vector unsigned int __b)
+{
+ return (vector unsigned char)
+ __builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector bool char __ATTRS_o_ai
+vec_sll(vector bool char __a, vector unsigned char __b)
+{
+ return (vector bool char)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector bool char __ATTRS_o_ai
+vec_sll(vector bool char __a, vector unsigned short __b)
+{
+ return (vector bool char)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector bool char __ATTRS_o_ai
+vec_sll(vector bool char __a, vector unsigned int __b)
+{
+ return (vector bool char)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector short __ATTRS_o_ai
+vec_sll(vector short __a, vector unsigned char __b)
+{
+ return (vector short)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector short __ATTRS_o_ai
+vec_sll(vector short __a, vector unsigned short __b)
+{
+ return (vector short)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector short __ATTRS_o_ai
+vec_sll(vector short __a, vector unsigned int __b)
+{
+ return (vector short)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_sll(vector unsigned short __a, vector unsigned char __b)
+{
+ return (vector unsigned short)
+ __builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_sll(vector unsigned short __a, vector unsigned short __b)
+{
+ return (vector unsigned short)
+ __builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_sll(vector unsigned short __a, vector unsigned int __b)
+{
+ return (vector unsigned short)
+ __builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_sll(vector bool short __a, vector unsigned char __b)
+{
+ return (vector bool short)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_sll(vector bool short __a, vector unsigned short __b)
+{
+ return (vector bool short)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_sll(vector bool short __a, vector unsigned int __b)
+{
+ return (vector bool short)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector pixel __ATTRS_o_ai
+vec_sll(vector pixel __a, vector unsigned char __b)
+{
+ return (vector pixel)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector pixel __ATTRS_o_ai
+vec_sll(vector pixel __a, vector unsigned short __b)
+{
+ return (vector pixel)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector pixel __ATTRS_o_ai
+vec_sll(vector pixel __a, vector unsigned int __b)
+{
+ return (vector pixel)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector int __ATTRS_o_ai
+vec_sll(vector int __a, vector unsigned char __b)
+{
+ return (vector int)__builtin_altivec_vsl(__a, (vector int)__b);
+}
+
+static vector int __ATTRS_o_ai
+vec_sll(vector int __a, vector unsigned short __b)
+{
+ return (vector int)__builtin_altivec_vsl(__a, (vector int)__b);
+}
+
+static vector int __ATTRS_o_ai
+vec_sll(vector int __a, vector unsigned int __b)
+{
+ return (vector int)__builtin_altivec_vsl(__a, (vector int)__b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_sll(vector unsigned int __a, vector unsigned char __b)
+{
+ return (vector unsigned int)
+ __builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_sll(vector unsigned int __a, vector unsigned short __b)
+{
+ return (vector unsigned int)
+ __builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_sll(vector unsigned int __a, vector unsigned int __b)
+{
+ return (vector unsigned int)
+ __builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_sll(vector bool int __a, vector unsigned char __b)
+{
+ return (vector bool int)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_sll(vector bool int __a, vector unsigned short __b)
+{
+ return (vector bool int)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_sll(vector bool int __a, vector unsigned int __b)
+{
+ return (vector bool int)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+/* vec_vsl */
+
+static vector signed char __ATTRS_o_ai
+vec_vsl(vector signed char __a, vector unsigned char __b)
+{
+ return (vector signed char)
+ __builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_vsl(vector signed char __a, vector unsigned short __b)
+{
+ return (vector signed char)
+ __builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_vsl(vector signed char __a, vector unsigned int __b)
+{
+ return (vector signed char)
+ __builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vsl(vector unsigned char __a, vector unsigned char __b)
+{
+ return (vector unsigned char)
+ __builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vsl(vector unsigned char __a, vector unsigned short __b)
+{
+ return (vector unsigned char)
+ __builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vsl(vector unsigned char __a, vector unsigned int __b)
+{
+ return (vector unsigned char)
+ __builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector bool char __ATTRS_o_ai
+vec_vsl(vector bool char __a, vector unsigned char __b)
+{
+ return (vector bool char)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector bool char __ATTRS_o_ai
+vec_vsl(vector bool char __a, vector unsigned short __b)
+{
+ return (vector bool char)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector bool char __ATTRS_o_ai
+vec_vsl(vector bool char __a, vector unsigned int __b)
+{
+ return (vector bool char)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector short __ATTRS_o_ai
+vec_vsl(vector short __a, vector unsigned char __b)
+{
+ return (vector short)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector short __ATTRS_o_ai
+vec_vsl(vector short __a, vector unsigned short __b)
+{
+ return (vector short)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector short __ATTRS_o_ai
+vec_vsl(vector short __a, vector unsigned int __b)
+{
+ return (vector short)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vsl(vector unsigned short __a, vector unsigned char __b)
+{
+ return (vector unsigned short)
+ __builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vsl(vector unsigned short __a, vector unsigned short __b)
+{
+ return (vector unsigned short)
+ __builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vsl(vector unsigned short __a, vector unsigned int __b)
+{
+ return (vector unsigned short)
+ __builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_vsl(vector bool short __a, vector unsigned char __b)
+{
+ return (vector bool short)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_vsl(vector bool short __a, vector unsigned short __b)
+{
+ return (vector bool short)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_vsl(vector bool short __a, vector unsigned int __b)
+{
+ return (vector bool short)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector pixel __ATTRS_o_ai
+vec_vsl(vector pixel __a, vector unsigned char __b)
+{
+ return (vector pixel)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector pixel __ATTRS_o_ai
+vec_vsl(vector pixel __a, vector unsigned short __b)
+{
+ return (vector pixel)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector pixel __ATTRS_o_ai
+vec_vsl(vector pixel __a, vector unsigned int __b)
+{
+ return (vector pixel)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector int __ATTRS_o_ai
+vec_vsl(vector int __a, vector unsigned char __b)
+{
+ return (vector int)__builtin_altivec_vsl(__a, (vector int)__b);
+}
+
+static vector int __ATTRS_o_ai
+vec_vsl(vector int __a, vector unsigned short __b)
+{
+ return (vector int)__builtin_altivec_vsl(__a, (vector int)__b);
+}
+
+static vector int __ATTRS_o_ai
+vec_vsl(vector int __a, vector unsigned int __b)
+{
+ return (vector int)__builtin_altivec_vsl(__a, (vector int)__b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vsl(vector unsigned int __a, vector unsigned char __b)
+{
+ return (vector unsigned int)
+ __builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vsl(vector unsigned int __a, vector unsigned short __b)
+{
+ return (vector unsigned int)
+ __builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vsl(vector unsigned int __a, vector unsigned int __b)
+{
+ return (vector unsigned int)
+ __builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_vsl(vector bool int __a, vector unsigned char __b)
+{
+ return (vector bool int)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_vsl(vector bool int __a, vector unsigned short __b)
+{
+ return (vector bool int)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_vsl(vector bool int __a, vector unsigned int __b)
+{
+ return (vector bool int)__builtin_altivec_vsl((vector int)__a, (vector int)__b);
+}
+
+/* vec_slo */
+
+static vector signed char __ATTRS_o_ai
+vec_slo(vector signed char __a, vector signed char __b)
+{
+ return (vector signed char)
+ __builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_slo(vector signed char __a, vector unsigned char __b)
+{
+ return (vector signed char)
+ __builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_slo(vector unsigned char __a, vector signed char __b)
+{
+ return (vector unsigned char)
+ __builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_slo(vector unsigned char __a, vector unsigned char __b)
+{
+ return (vector unsigned char)
+ __builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+static vector short __ATTRS_o_ai
+vec_slo(vector short __a, vector signed char __b)
+{
+ return (vector short)__builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+static vector short __ATTRS_o_ai
+vec_slo(vector short __a, vector unsigned char __b)
+{
+ return (vector short)__builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_slo(vector unsigned short __a, vector signed char __b)
+{
+ return (vector unsigned short)
+ __builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_slo(vector unsigned short __a, vector unsigned char __b)
+{
+ return (vector unsigned short)
+ __builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+static vector pixel __ATTRS_o_ai
+vec_slo(vector pixel __a, vector signed char __b)
+{
+ return (vector pixel)__builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+static vector pixel __ATTRS_o_ai
+vec_slo(vector pixel __a, vector unsigned char __b)
+{
+ return (vector pixel)__builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+static vector int __ATTRS_o_ai
+vec_slo(vector int __a, vector signed char __b)
+{
+ return (vector int)__builtin_altivec_vslo(__a, (vector int)__b);
+}
+
+static vector int __ATTRS_o_ai
+vec_slo(vector int __a, vector unsigned char __b)
+{
+ return (vector int)__builtin_altivec_vslo(__a, (vector int)__b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_slo(vector unsigned int __a, vector signed char __b)
+{
+ return (vector unsigned int)
+ __builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_slo(vector unsigned int __a, vector unsigned char __b)
+{
+ return (vector unsigned int)
+ __builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+static vector float __ATTRS_o_ai
+vec_slo(vector float __a, vector signed char __b)
+{
+ return (vector float)__builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+static vector float __ATTRS_o_ai
+vec_slo(vector float __a, vector unsigned char __b)
+{
+ return (vector float)__builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+/* vec_vslo */
+
+static vector signed char __ATTRS_o_ai
+vec_vslo(vector signed char __a, vector signed char __b)
+{
+ return (vector signed char)
+ __builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_vslo(vector signed char __a, vector unsigned char __b)
+{
+ return (vector signed char)
+ __builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vslo(vector unsigned char __a, vector signed char __b)
+{
+ return (vector unsigned char)
+ __builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vslo(vector unsigned char __a, vector unsigned char __b)
+{
+ return (vector unsigned char)
+ __builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+static vector short __ATTRS_o_ai
+vec_vslo(vector short __a, vector signed char __b)
+{
+ return (vector short)__builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+static vector short __ATTRS_o_ai
+vec_vslo(vector short __a, vector unsigned char __b)
+{
+ return (vector short)__builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vslo(vector unsigned short __a, vector signed char __b)
+{
+ return (vector unsigned short)
+ __builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vslo(vector unsigned short __a, vector unsigned char __b)
+{
+ return (vector unsigned short)
+ __builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+static vector pixel __ATTRS_o_ai
+vec_vslo(vector pixel __a, vector signed char __b)
+{
+ return (vector pixel)__builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+static vector pixel __ATTRS_o_ai
+vec_vslo(vector pixel __a, vector unsigned char __b)
+{
+ return (vector pixel)__builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+static vector int __ATTRS_o_ai
+vec_vslo(vector int __a, vector signed char __b)
+{
+ return (vector int)__builtin_altivec_vslo(__a, (vector int)__b);
+}
+
+static vector int __ATTRS_o_ai
+vec_vslo(vector int __a, vector unsigned char __b)
+{
+ return (vector int)__builtin_altivec_vslo(__a, (vector int)__b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vslo(vector unsigned int __a, vector signed char __b)
+{
+ return (vector unsigned int)
+ __builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vslo(vector unsigned int __a, vector unsigned char __b)
+{
+ return (vector unsigned int)
+ __builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+static vector float __ATTRS_o_ai
+vec_vslo(vector float __a, vector signed char __b)
+{
+ return (vector float)__builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+static vector float __ATTRS_o_ai
+vec_vslo(vector float __a, vector unsigned char __b)
+{
+ return (vector float)__builtin_altivec_vslo((vector int)__a, (vector int)__b);
+}
+
+/* vec_splat */
+
+static vector signed char __ATTRS_o_ai
+vec_splat(vector signed char __a, unsigned char __b)
+{
+ return vec_perm(__a, __a, (vector unsigned char)(__b));
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_splat(vector unsigned char __a, unsigned char __b)
+{
+ return vec_perm(__a, __a, (vector unsigned char)(__b));
+}
+
+static vector bool char __ATTRS_o_ai
+vec_splat(vector bool char __a, unsigned char __b)
+{
+ return vec_perm(__a, __a, (vector unsigned char)(__b));
+}
+
+static vector short __ATTRS_o_ai
+vec_splat(vector short __a, unsigned char __b)
+{
+ __b *= 2;
+ unsigned char b1=__b+1;
+ return vec_perm(__a, __a, (vector unsigned char)
+ (__b, b1, __b, b1, __b, b1, __b, b1, __b, b1, __b, b1, __b, b1, __b, b1));
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_splat(vector unsigned short __a, unsigned char __b)
+{
+ __b *= 2;
+ unsigned char b1=__b+1;
+ return vec_perm(__a, __a, (vector unsigned char)
+ (__b, b1, __b, b1, __b, b1, __b, b1, __b, b1, __b, b1, __b, b1, __b, b1));
+}
+
+static vector bool short __ATTRS_o_ai
+vec_splat(vector bool short __a, unsigned char __b)
+{
+ __b *= 2;
+ unsigned char b1=__b+1;
+ return vec_perm(__a, __a, (vector unsigned char)
+ (__b, b1, __b, b1, __b, b1, __b, b1, __b, b1, __b, b1, __b, b1, __b, b1));
+}
+
+static vector pixel __ATTRS_o_ai
+vec_splat(vector pixel __a, unsigned char __b)
+{
+ __b *= 2;
+ unsigned char b1=__b+1;
+ return vec_perm(__a, __a, (vector unsigned char)
+ (__b, b1, __b, b1, __b, b1, __b, b1, __b, b1, __b, b1, __b, b1, __b, b1));
+}
+
+static vector int __ATTRS_o_ai
+vec_splat(vector int __a, unsigned char __b)
+{
+ __b *= 4;
+ unsigned char b1=__b+1, b2=__b+2, b3=__b+3;
+ return vec_perm(__a, __a, (vector unsigned char)
+ (__b, b1, b2, b3, __b, b1, b2, b3, __b, b1, b2, b3, __b, b1, b2, b3));
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_splat(vector unsigned int __a, unsigned char __b)
+{
+ __b *= 4;
+ unsigned char b1=__b+1, b2=__b+2, b3=__b+3;
+ return vec_perm(__a, __a, (vector unsigned char)
+ (__b, b1, b2, b3, __b, b1, b2, b3, __b, b1, b2, b3, __b, b1, b2, b3));
+}
+
+static vector bool int __ATTRS_o_ai
+vec_splat(vector bool int __a, unsigned char __b)
+{
+ __b *= 4;
+ unsigned char b1=__b+1, b2=__b+2, b3=__b+3;
+ return vec_perm(__a, __a, (vector unsigned char)
+ (__b, b1, b2, b3, __b, b1, b2, b3, __b, b1, b2, b3, __b, b1, b2, b3));
+}
+
+static vector float __ATTRS_o_ai
+vec_splat(vector float __a, unsigned char __b)
+{
+ __b *= 4;
+ unsigned char b1=__b+1, b2=__b+2, b3=__b+3;
+ return vec_perm(__a, __a, (vector unsigned char)
+ (__b, b1, b2, b3, __b, b1, b2, b3, __b, b1, b2, b3, __b, b1, b2, b3));
+}
+
+/* vec_vspltb */
+
+#define __builtin_altivec_vspltb vec_vspltb
+
+static vector signed char __ATTRS_o_ai
+vec_vspltb(vector signed char __a, unsigned char __b)
+{
+ return vec_perm(__a, __a, (vector unsigned char)(__b));
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vspltb(vector unsigned char __a, unsigned char __b)
+{
+ return vec_perm(__a, __a, (vector unsigned char)(__b));
+}
+
+static vector bool char __ATTRS_o_ai
+vec_vspltb(vector bool char __a, unsigned char __b)
+{
+ return vec_perm(__a, __a, (vector unsigned char)(__b));
+}
+
+/* vec_vsplth */
+
+#define __builtin_altivec_vsplth vec_vsplth
+
+static vector short __ATTRS_o_ai
+vec_vsplth(vector short __a, unsigned char __b)
+{
+ __b *= 2;
+ unsigned char b1=__b+1;
+ return vec_perm(__a, __a, (vector unsigned char)
+ (__b, b1, __b, b1, __b, b1, __b, b1, __b, b1, __b, b1, __b, b1, __b, b1));
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vsplth(vector unsigned short __a, unsigned char __b)
+{
+ __b *= 2;
+ unsigned char b1=__b+1;
+ return vec_perm(__a, __a, (vector unsigned char)
+ (__b, b1, __b, b1, __b, b1, __b, b1, __b, b1, __b, b1, __b, b1, __b, b1));
+}
+
+static vector bool short __ATTRS_o_ai
+vec_vsplth(vector bool short __a, unsigned char __b)
+{
+ __b *= 2;
+ unsigned char b1=__b+1;
+ return vec_perm(__a, __a, (vector unsigned char)
+ (__b, b1, __b, b1, __b, b1, __b, b1, __b, b1, __b, b1, __b, b1, __b, b1));
+}
+
+static vector pixel __ATTRS_o_ai
+vec_vsplth(vector pixel __a, unsigned char __b)
+{
+ __b *= 2;
+ unsigned char b1=__b+1;
+ return vec_perm(__a, __a, (vector unsigned char)
+ (__b, b1, __b, b1, __b, b1, __b, b1, __b, b1, __b, b1, __b, b1, __b, b1));
+}
+
+/* vec_vspltw */
+
+#define __builtin_altivec_vspltw vec_vspltw
+
+static vector int __ATTRS_o_ai
+vec_vspltw(vector int __a, unsigned char __b)
+{
+ __b *= 4;
+ unsigned char b1=__b+1, b2=__b+2, b3=__b+3;
+ return vec_perm(__a, __a, (vector unsigned char)
+ (__b, b1, b2, b3, __b, b1, b2, b3, __b, b1, b2, b3, __b, b1, b2, b3));
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vspltw(vector unsigned int __a, unsigned char __b)
+{
+ __b *= 4;
+ unsigned char b1=__b+1, b2=__b+2, b3=__b+3;
+ return vec_perm(__a, __a, (vector unsigned char)
+ (__b, b1, b2, b3, __b, b1, b2, b3, __b, b1, b2, b3, __b, b1, b2, b3));
+}
+
+static vector bool int __ATTRS_o_ai
+vec_vspltw(vector bool int __a, unsigned char __b)
+{
+ __b *= 4;
+ unsigned char b1=__b+1, b2=__b+2, b3=__b+3;
+ return vec_perm(__a, __a, (vector unsigned char)
+ (__b, b1, b2, b3, __b, b1, b2, b3, __b, b1, b2, b3, __b, b1, b2, b3));
+}
+
+static vector float __ATTRS_o_ai
+vec_vspltw(vector float __a, unsigned char __b)
+{
+ __b *= 4;
+ unsigned char b1=__b+1, b2=__b+2, b3=__b+3;
+ return vec_perm(__a, __a, (vector unsigned char)
+ (__b, b1, b2, b3, __b, b1, b2, b3, __b, b1, b2, b3, __b, b1, b2, b3));
+}
+
+/* vec_splat_s8 */
+
+#define __builtin_altivec_vspltisb vec_splat_s8
+
+// FIXME: parameter should be treated as 5-bit signed literal
+static vector signed char __ATTRS_o_ai
+vec_splat_s8(signed char __a)
+{
+ return (vector signed char)(__a);
+}
+
+/* vec_vspltisb */
+
+// FIXME: parameter should be treated as 5-bit signed literal
+static vector signed char __ATTRS_o_ai
+vec_vspltisb(signed char __a)
+{
+ return (vector signed char)(__a);
+}
+
+/* vec_splat_s16 */
+
+#define __builtin_altivec_vspltish vec_splat_s16
+
+// FIXME: parameter should be treated as 5-bit signed literal
+static vector short __ATTRS_o_ai
+vec_splat_s16(signed char __a)
+{
+ return (vector short)(__a);
+}
+
+/* vec_vspltish */
+
+// FIXME: parameter should be treated as 5-bit signed literal
+static vector short __ATTRS_o_ai
+vec_vspltish(signed char __a)
+{
+ return (vector short)(__a);
+}
+
+/* vec_splat_s32 */
+
+#define __builtin_altivec_vspltisw vec_splat_s32
+
+// FIXME: parameter should be treated as 5-bit signed literal
+static vector int __ATTRS_o_ai
+vec_splat_s32(signed char __a)
+{
+ return (vector int)(__a);
+}
+
+/* vec_vspltisw */
+
+// FIXME: parameter should be treated as 5-bit signed literal
+static vector int __ATTRS_o_ai
+vec_vspltisw(signed char __a)
+{
+ return (vector int)(__a);
+}
+
+/* vec_splat_u8 */
+
+// FIXME: parameter should be treated as 5-bit signed literal
+static vector unsigned char __ATTRS_o_ai
+vec_splat_u8(unsigned char __a)
+{
+ return (vector unsigned char)(__a);
+}
+
+/* vec_splat_u16 */
+
+// FIXME: parameter should be treated as 5-bit signed literal
+static vector unsigned short __ATTRS_o_ai
+vec_splat_u16(signed char __a)
+{
+ return (vector unsigned short)(__a);
+}
+
+/* vec_splat_u32 */
+
+// FIXME: parameter should be treated as 5-bit signed literal
+static vector unsigned int __ATTRS_o_ai
+vec_splat_u32(signed char __a)
+{
+ return (vector unsigned int)(__a);
+}
+
+/* vec_sr */
+
+static vector signed char __ATTRS_o_ai
+vec_sr(vector signed char __a, vector unsigned char __b)
+{
+ return __a >> (vector signed char)__b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_sr(vector unsigned char __a, vector unsigned char __b)
+{
+ return __a >> __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_sr(vector short __a, vector unsigned short __b)
+{
+ return __a >> (vector short)__b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_sr(vector unsigned short __a, vector unsigned short __b)
+{
+ return __a >> __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_sr(vector int __a, vector unsigned int __b)
+{
+ return __a >> (vector int)__b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_sr(vector unsigned int __a, vector unsigned int __b)
+{
+ return __a >> __b;
+}
+
+/* vec_vsrb */
+
+#define __builtin_altivec_vsrb vec_vsrb
+
+static vector signed char __ATTRS_o_ai
+vec_vsrb(vector signed char __a, vector unsigned char __b)
+{
+ return __a >> (vector signed char)__b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vsrb(vector unsigned char __a, vector unsigned char __b)
+{
+ return __a >> __b;
+}
+
+/* vec_vsrh */
+
+#define __builtin_altivec_vsrh vec_vsrh
+
+static vector short __ATTRS_o_ai
+vec_vsrh(vector short __a, vector unsigned short __b)
+{
+ return __a >> (vector short)__b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vsrh(vector unsigned short __a, vector unsigned short __b)
+{
+ return __a >> __b;
+}
+
+/* vec_vsrw */
+
+#define __builtin_altivec_vsrw vec_vsrw
+
+static vector int __ATTRS_o_ai
+vec_vsrw(vector int __a, vector unsigned int __b)
+{
+ return __a >> (vector int)__b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vsrw(vector unsigned int __a, vector unsigned int __b)
+{
+ return __a >> __b;
+}
+
+/* vec_sra */
+
+static vector signed char __ATTRS_o_ai
+vec_sra(vector signed char __a, vector unsigned char __b)
+{
+ return (vector signed char)__builtin_altivec_vsrab((vector char)__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_sra(vector unsigned char __a, vector unsigned char __b)
+{
+ return (vector unsigned char)__builtin_altivec_vsrab((vector char)__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_sra(vector short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vsrah(__a, (vector unsigned short)__b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_sra(vector unsigned short __a, vector unsigned short __b)
+{
+ return (vector unsigned short)__builtin_altivec_vsrah((vector short)__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_sra(vector int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vsraw(__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_sra(vector unsigned int __a, vector unsigned int __b)
+{
+ return (vector unsigned int)__builtin_altivec_vsraw((vector int)__a, __b);
+}
+
+/* vec_vsrab */
+
+static vector signed char __ATTRS_o_ai
+vec_vsrab(vector signed char __a, vector unsigned char __b)
+{
+ return (vector signed char)__builtin_altivec_vsrab((vector char)__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vsrab(vector unsigned char __a, vector unsigned char __b)
+{
+ return (vector unsigned char)__builtin_altivec_vsrab((vector char)__a, __b);
+}
+
+/* vec_vsrah */
+
+static vector short __ATTRS_o_ai
+vec_vsrah(vector short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vsrah(__a, (vector unsigned short)__b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vsrah(vector unsigned short __a, vector unsigned short __b)
+{
+ return (vector unsigned short)__builtin_altivec_vsrah((vector short)__a, __b);
+}
+
+/* vec_vsraw */
+
+static vector int __ATTRS_o_ai
+vec_vsraw(vector int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vsraw(__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vsraw(vector unsigned int __a, vector unsigned int __b)
+{
+ return (vector unsigned int)__builtin_altivec_vsraw((vector int)__a, __b);
+}
+
+/* vec_srl */
+
+static vector signed char __ATTRS_o_ai
+vec_srl(vector signed char __a, vector unsigned char __b)
+{
+ return (vector signed char)
+ __builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_srl(vector signed char __a, vector unsigned short __b)
+{
+ return (vector signed char)
+ __builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_srl(vector signed char __a, vector unsigned int __b)
+{
+ return (vector signed char)
+ __builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_srl(vector unsigned char __a, vector unsigned char __b)
+{
+ return (vector unsigned char)
+ __builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_srl(vector unsigned char __a, vector unsigned short __b)
+{
+ return (vector unsigned char)
+ __builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_srl(vector unsigned char __a, vector unsigned int __b)
+{
+ return (vector unsigned char)
+ __builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector bool char __ATTRS_o_ai
+vec_srl(vector bool char __a, vector unsigned char __b)
+{
+ return (vector bool char)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector bool char __ATTRS_o_ai
+vec_srl(vector bool char __a, vector unsigned short __b)
+{
+ return (vector bool char)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector bool char __ATTRS_o_ai
+vec_srl(vector bool char __a, vector unsigned int __b)
+{
+ return (vector bool char)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector short __ATTRS_o_ai
+vec_srl(vector short __a, vector unsigned char __b)
+{
+ return (vector short)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector short __ATTRS_o_ai
+vec_srl(vector short __a, vector unsigned short __b)
+{
+ return (vector short)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector short __ATTRS_o_ai
+vec_srl(vector short __a, vector unsigned int __b)
+{
+ return (vector short)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_srl(vector unsigned short __a, vector unsigned char __b)
+{
+ return (vector unsigned short)
+ __builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_srl(vector unsigned short __a, vector unsigned short __b)
+{
+ return (vector unsigned short)
+ __builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_srl(vector unsigned short __a, vector unsigned int __b)
+{
+ return (vector unsigned short)
+ __builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_srl(vector bool short __a, vector unsigned char __b)
+{
+ return (vector bool short)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_srl(vector bool short __a, vector unsigned short __b)
+{
+ return (vector bool short)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_srl(vector bool short __a, vector unsigned int __b)
+{
+ return (vector bool short)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector pixel __ATTRS_o_ai
+vec_srl(vector pixel __a, vector unsigned char __b)
+{
+ return (vector pixel)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector pixel __ATTRS_o_ai
+vec_srl(vector pixel __a, vector unsigned short __b)
+{
+ return (vector pixel)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector pixel __ATTRS_o_ai
+vec_srl(vector pixel __a, vector unsigned int __b)
+{
+ return (vector pixel)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector int __ATTRS_o_ai
+vec_srl(vector int __a, vector unsigned char __b)
+{
+ return (vector int)__builtin_altivec_vsr(__a, (vector int)__b);
+}
+
+static vector int __ATTRS_o_ai
+vec_srl(vector int __a, vector unsigned short __b)
+{
+ return (vector int)__builtin_altivec_vsr(__a, (vector int)__b);
+}
+
+static vector int __ATTRS_o_ai
+vec_srl(vector int __a, vector unsigned int __b)
+{
+ return (vector int)__builtin_altivec_vsr(__a, (vector int)__b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_srl(vector unsigned int __a, vector unsigned char __b)
+{
+ return (vector unsigned int)
+ __builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_srl(vector unsigned int __a, vector unsigned short __b)
+{
+ return (vector unsigned int)
+ __builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_srl(vector unsigned int __a, vector unsigned int __b)
+{
+ return (vector unsigned int)
+ __builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_srl(vector bool int __a, vector unsigned char __b)
+{
+ return (vector bool int)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_srl(vector bool int __a, vector unsigned short __b)
+{
+ return (vector bool int)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_srl(vector bool int __a, vector unsigned int __b)
+{
+ return (vector bool int)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+/* vec_vsr */
+
+static vector signed char __ATTRS_o_ai
+vec_vsr(vector signed char __a, vector unsigned char __b)
+{
+ return (vector signed char)
+ __builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_vsr(vector signed char __a, vector unsigned short __b)
+{
+ return (vector signed char)
+ __builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_vsr(vector signed char __a, vector unsigned int __b)
+{
+ return (vector signed char)
+ __builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vsr(vector unsigned char __a, vector unsigned char __b)
+{
+ return (vector unsigned char)
+ __builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vsr(vector unsigned char __a, vector unsigned short __b)
+{
+ return (vector unsigned char)
+ __builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vsr(vector unsigned char __a, vector unsigned int __b)
+{
+ return (vector unsigned char)
+ __builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector bool char __ATTRS_o_ai
+vec_vsr(vector bool char __a, vector unsigned char __b)
+{
+ return (vector bool char)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector bool char __ATTRS_o_ai
+vec_vsr(vector bool char __a, vector unsigned short __b)
+{
+ return (vector bool char)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector bool char __ATTRS_o_ai
+vec_vsr(vector bool char __a, vector unsigned int __b)
+{
+ return (vector bool char)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector short __ATTRS_o_ai
+vec_vsr(vector short __a, vector unsigned char __b)
+{
+ return (vector short)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector short __ATTRS_o_ai
+vec_vsr(vector short __a, vector unsigned short __b)
+{
+ return (vector short)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector short __ATTRS_o_ai
+vec_vsr(vector short __a, vector unsigned int __b)
+{
+ return (vector short)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vsr(vector unsigned short __a, vector unsigned char __b)
+{
+ return (vector unsigned short)
+ __builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vsr(vector unsigned short __a, vector unsigned short __b)
+{
+ return (vector unsigned short)
+ __builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vsr(vector unsigned short __a, vector unsigned int __b)
+{
+ return (vector unsigned short)
+ __builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_vsr(vector bool short __a, vector unsigned char __b)
+{
+ return (vector bool short)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_vsr(vector bool short __a, vector unsigned short __b)
+{
+ return (vector bool short)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_vsr(vector bool short __a, vector unsigned int __b)
+{
+ return (vector bool short)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector pixel __ATTRS_o_ai
+vec_vsr(vector pixel __a, vector unsigned char __b)
+{
+ return (vector pixel)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector pixel __ATTRS_o_ai
+vec_vsr(vector pixel __a, vector unsigned short __b)
+{
+ return (vector pixel)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector pixel __ATTRS_o_ai
+vec_vsr(vector pixel __a, vector unsigned int __b)
+{
+ return (vector pixel)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector int __ATTRS_o_ai
+vec_vsr(vector int __a, vector unsigned char __b)
+{
+ return (vector int)__builtin_altivec_vsr(__a, (vector int)__b);
+}
+
+static vector int __ATTRS_o_ai
+vec_vsr(vector int __a, vector unsigned short __b)
+{
+ return (vector int)__builtin_altivec_vsr(__a, (vector int)__b);
+}
+
+static vector int __ATTRS_o_ai
+vec_vsr(vector int __a, vector unsigned int __b)
+{
+ return (vector int)__builtin_altivec_vsr(__a, (vector int)__b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vsr(vector unsigned int __a, vector unsigned char __b)
+{
+ return (vector unsigned int)
+ __builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vsr(vector unsigned int __a, vector unsigned short __b)
+{
+ return (vector unsigned int)
+ __builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vsr(vector unsigned int __a, vector unsigned int __b)
+{
+ return (vector unsigned int)
+ __builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_vsr(vector bool int __a, vector unsigned char __b)
+{
+ return (vector bool int)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_vsr(vector bool int __a, vector unsigned short __b)
+{
+ return (vector bool int)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_vsr(vector bool int __a, vector unsigned int __b)
+{
+ return (vector bool int)__builtin_altivec_vsr((vector int)__a, (vector int)__b);
+}
+
+/* vec_sro */
+
+static vector signed char __ATTRS_o_ai
+vec_sro(vector signed char __a, vector signed char __b)
+{
+ return (vector signed char)
+ __builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_sro(vector signed char __a, vector unsigned char __b)
+{
+ return (vector signed char)
+ __builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_sro(vector unsigned char __a, vector signed char __b)
+{
+ return (vector unsigned char)
+ __builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_sro(vector unsigned char __a, vector unsigned char __b)
+{
+ return (vector unsigned char)
+ __builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+static vector short __ATTRS_o_ai
+vec_sro(vector short __a, vector signed char __b)
+{
+ return (vector short)__builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+static vector short __ATTRS_o_ai
+vec_sro(vector short __a, vector unsigned char __b)
+{
+ return (vector short)__builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_sro(vector unsigned short __a, vector signed char __b)
+{
+ return (vector unsigned short)
+ __builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_sro(vector unsigned short __a, vector unsigned char __b)
+{
+ return (vector unsigned short)
+ __builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+static vector pixel __ATTRS_o_ai
+vec_sro(vector pixel __a, vector signed char __b)
+{
+ return (vector pixel)__builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+static vector pixel __ATTRS_o_ai
+vec_sro(vector pixel __a, vector unsigned char __b)
+{
+ return (vector pixel)__builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+static vector int __ATTRS_o_ai
+vec_sro(vector int __a, vector signed char __b)
+{
+ return (vector int)__builtin_altivec_vsro(__a, (vector int)__b);
+}
+
+static vector int __ATTRS_o_ai
+vec_sro(vector int __a, vector unsigned char __b)
+{
+ return (vector int)__builtin_altivec_vsro(__a, (vector int)__b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_sro(vector unsigned int __a, vector signed char __b)
+{
+ return (vector unsigned int)
+ __builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_sro(vector unsigned int __a, vector unsigned char __b)
+{
+ return (vector unsigned int)
+ __builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+static vector float __ATTRS_o_ai
+vec_sro(vector float __a, vector signed char __b)
+{
+ return (vector float)__builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+static vector float __ATTRS_o_ai
+vec_sro(vector float __a, vector unsigned char __b)
+{
+ return (vector float)__builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+/* vec_vsro */
+
+static vector signed char __ATTRS_o_ai
+vec_vsro(vector signed char __a, vector signed char __b)
+{
+ return (vector signed char)
+ __builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_vsro(vector signed char __a, vector unsigned char __b)
+{
+ return (vector signed char)
+ __builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vsro(vector unsigned char __a, vector signed char __b)
+{
+ return (vector unsigned char)
+ __builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vsro(vector unsigned char __a, vector unsigned char __b)
+{
+ return (vector unsigned char)
+ __builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+static vector short __ATTRS_o_ai
+vec_vsro(vector short __a, vector signed char __b)
+{
+ return (vector short)__builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+static vector short __ATTRS_o_ai
+vec_vsro(vector short __a, vector unsigned char __b)
+{
+ return (vector short)__builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vsro(vector unsigned short __a, vector signed char __b)
+{
+ return (vector unsigned short)
+ __builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vsro(vector unsigned short __a, vector unsigned char __b)
+{
+ return (vector unsigned short)
+ __builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+static vector pixel __ATTRS_o_ai
+vec_vsro(vector pixel __a, vector signed char __b)
+{
+ return (vector pixel)__builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+static vector pixel __ATTRS_o_ai
+vec_vsro(vector pixel __a, vector unsigned char __b)
+{
+ return (vector pixel)__builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+static vector int __ATTRS_o_ai
+vec_vsro(vector int __a, vector signed char __b)
+{
+ return (vector int)__builtin_altivec_vsro(__a, (vector int)__b);
+}
+
+static vector int __ATTRS_o_ai
+vec_vsro(vector int __a, vector unsigned char __b)
+{
+ return (vector int)__builtin_altivec_vsro(__a, (vector int)__b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vsro(vector unsigned int __a, vector signed char __b)
+{
+ return (vector unsigned int)
+ __builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vsro(vector unsigned int __a, vector unsigned char __b)
+{
+ return (vector unsigned int)
+ __builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+static vector float __ATTRS_o_ai
+vec_vsro(vector float __a, vector signed char __b)
+{
+ return (vector float)__builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+static vector float __ATTRS_o_ai
+vec_vsro(vector float __a, vector unsigned char __b)
+{
+ return (vector float)__builtin_altivec_vsro((vector int)__a, (vector int)__b);
+}
+
+/* vec_st */
+
+static void __ATTRS_o_ai
+vec_st(vector signed char __a, int __b, vector signed char *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_st(vector signed char __a, int __b, signed char *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_st(vector unsigned char __a, int __b, vector unsigned char *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_st(vector unsigned char __a, int __b, unsigned char *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_st(vector bool char __a, int __b, signed char *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_st(vector bool char __a, int __b, unsigned char *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_st(vector bool char __a, int __b, vector bool char *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_st(vector short __a, int __b, vector short *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_st(vector short __a, int __b, short *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_st(vector unsigned short __a, int __b, vector unsigned short *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_st(vector unsigned short __a, int __b, unsigned short *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_st(vector bool short __a, int __b, short *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_st(vector bool short __a, int __b, unsigned short *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_st(vector bool short __a, int __b, vector bool short *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_st(vector pixel __a, int __b, short *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_st(vector pixel __a, int __b, unsigned short *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_st(vector pixel __a, int __b, vector pixel *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_st(vector int __a, int __b, vector int *__c)
+{
+ __builtin_altivec_stvx(__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_st(vector int __a, int __b, int *__c)
+{
+ __builtin_altivec_stvx(__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_st(vector unsigned int __a, int __b, vector unsigned int *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_st(vector unsigned int __a, int __b, unsigned int *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_st(vector bool int __a, int __b, int *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_st(vector bool int __a, int __b, unsigned int *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_st(vector bool int __a, int __b, vector bool int *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_st(vector float __a, int __b, vector float *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_st(vector float __a, int __b, float *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+/* vec_stvx */
+
+static void __ATTRS_o_ai
+vec_stvx(vector signed char __a, int __b, vector signed char *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvx(vector signed char __a, int __b, signed char *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvx(vector unsigned char __a, int __b, vector unsigned char *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvx(vector unsigned char __a, int __b, unsigned char *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvx(vector bool char __a, int __b, signed char *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvx(vector bool char __a, int __b, unsigned char *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvx(vector bool char __a, int __b, vector bool char *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvx(vector short __a, int __b, vector short *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvx(vector short __a, int __b, short *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvx(vector unsigned short __a, int __b, vector unsigned short *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvx(vector unsigned short __a, int __b, unsigned short *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvx(vector bool short __a, int __b, short *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvx(vector bool short __a, int __b, unsigned short *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvx(vector bool short __a, int __b, vector bool short *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvx(vector pixel __a, int __b, short *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvx(vector pixel __a, int __b, unsigned short *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvx(vector pixel __a, int __b, vector pixel *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvx(vector int __a, int __b, vector int *__c)
+{
+ __builtin_altivec_stvx(__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvx(vector int __a, int __b, int *__c)
+{
+ __builtin_altivec_stvx(__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvx(vector unsigned int __a, int __b, vector unsigned int *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvx(vector unsigned int __a, int __b, unsigned int *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvx(vector bool int __a, int __b, int *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvx(vector bool int __a, int __b, unsigned int *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvx(vector bool int __a, int __b, vector bool int *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvx(vector float __a, int __b, vector float *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvx(vector float __a, int __b, float *__c)
+{
+ __builtin_altivec_stvx((vector int)__a, __b, __c);
+}
+
+/* vec_ste */
+
+static void __ATTRS_o_ai
+vec_ste(vector signed char __a, int __b, signed char *__c)
+{
+ __builtin_altivec_stvebx((vector char)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_ste(vector unsigned char __a, int __b, unsigned char *__c)
+{
+ __builtin_altivec_stvebx((vector char)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_ste(vector bool char __a, int __b, signed char *__c)
+{
+ __builtin_altivec_stvebx((vector char)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_ste(vector bool char __a, int __b, unsigned char *__c)
+{
+ __builtin_altivec_stvebx((vector char)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_ste(vector short __a, int __b, short *__c)
+{
+ __builtin_altivec_stvehx(__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_ste(vector unsigned short __a, int __b, unsigned short *__c)
+{
+ __builtin_altivec_stvehx((vector short)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_ste(vector bool short __a, int __b, short *__c)
+{
+ __builtin_altivec_stvehx((vector short)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_ste(vector bool short __a, int __b, unsigned short *__c)
+{
+ __builtin_altivec_stvehx((vector short)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_ste(vector pixel __a, int __b, short *__c)
+{
+ __builtin_altivec_stvehx((vector short)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_ste(vector pixel __a, int __b, unsigned short *__c)
+{
+ __builtin_altivec_stvehx((vector short)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_ste(vector int __a, int __b, int *__c)
+{
+ __builtin_altivec_stvewx(__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_ste(vector unsigned int __a, int __b, unsigned int *__c)
+{
+ __builtin_altivec_stvewx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_ste(vector bool int __a, int __b, int *__c)
+{
+ __builtin_altivec_stvewx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_ste(vector bool int __a, int __b, unsigned int *__c)
+{
+ __builtin_altivec_stvewx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_ste(vector float __a, int __b, float *__c)
+{
+ __builtin_altivec_stvewx((vector int)__a, __b, __c);
+}
+
+/* vec_stvebx */
+
+static void __ATTRS_o_ai
+vec_stvebx(vector signed char __a, int __b, signed char *__c)
+{
+ __builtin_altivec_stvebx((vector char)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvebx(vector unsigned char __a, int __b, unsigned char *__c)
+{
+ __builtin_altivec_stvebx((vector char)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvebx(vector bool char __a, int __b, signed char *__c)
+{
+ __builtin_altivec_stvebx((vector char)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvebx(vector bool char __a, int __b, unsigned char *__c)
+{
+ __builtin_altivec_stvebx((vector char)__a, __b, __c);
+}
+
+/* vec_stvehx */
+
+static void __ATTRS_o_ai
+vec_stvehx(vector short __a, int __b, short *__c)
+{
+ __builtin_altivec_stvehx(__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvehx(vector unsigned short __a, int __b, unsigned short *__c)
+{
+ __builtin_altivec_stvehx((vector short)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvehx(vector bool short __a, int __b, short *__c)
+{
+ __builtin_altivec_stvehx((vector short)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvehx(vector bool short __a, int __b, unsigned short *__c)
+{
+ __builtin_altivec_stvehx((vector short)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvehx(vector pixel __a, int __b, short *__c)
+{
+ __builtin_altivec_stvehx((vector short)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvehx(vector pixel __a, int __b, unsigned short *__c)
+{
+ __builtin_altivec_stvehx((vector short)__a, __b, __c);
+}
+
+/* vec_stvewx */
+
+static void __ATTRS_o_ai
+vec_stvewx(vector int __a, int __b, int *__c)
+{
+ __builtin_altivec_stvewx(__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvewx(vector unsigned int __a, int __b, unsigned int *__c)
+{
+ __builtin_altivec_stvewx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvewx(vector bool int __a, int __b, int *__c)
+{
+ __builtin_altivec_stvewx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvewx(vector bool int __a, int __b, unsigned int *__c)
+{
+ __builtin_altivec_stvewx((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvewx(vector float __a, int __b, float *__c)
+{
+ __builtin_altivec_stvewx((vector int)__a, __b, __c);
+}
+
+/* vec_stl */
+
+static void __ATTRS_o_ai
+vec_stl(vector signed char __a, int __b, vector signed char *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stl(vector signed char __a, int __b, signed char *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stl(vector unsigned char __a, int __b, vector unsigned char *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stl(vector unsigned char __a, int __b, unsigned char *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stl(vector bool char __a, int __b, signed char *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stl(vector bool char __a, int __b, unsigned char *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stl(vector bool char __a, int __b, vector bool char *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stl(vector short __a, int __b, vector short *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stl(vector short __a, int __b, short *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stl(vector unsigned short __a, int __b, vector unsigned short *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stl(vector unsigned short __a, int __b, unsigned short *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stl(vector bool short __a, int __b, short *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stl(vector bool short __a, int __b, unsigned short *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stl(vector bool short __a, int __b, vector bool short *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stl(vector pixel __a, int __b, short *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stl(vector pixel __a, int __b, unsigned short *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stl(vector pixel __a, int __b, vector pixel *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stl(vector int __a, int __b, vector int *__c)
+{
+ __builtin_altivec_stvxl(__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stl(vector int __a, int __b, int *__c)
+{
+ __builtin_altivec_stvxl(__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stl(vector unsigned int __a, int __b, vector unsigned int *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stl(vector unsigned int __a, int __b, unsigned int *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stl(vector bool int __a, int __b, int *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stl(vector bool int __a, int __b, unsigned int *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stl(vector bool int __a, int __b, vector bool int *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stl(vector float __a, int __b, vector float *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stl(vector float __a, int __b, float *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+/* vec_stvxl */
+
+static void __ATTRS_o_ai
+vec_stvxl(vector signed char __a, int __b, vector signed char *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvxl(vector signed char __a, int __b, signed char *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvxl(vector unsigned char __a, int __b, vector unsigned char *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvxl(vector unsigned char __a, int __b, unsigned char *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvxl(vector bool char __a, int __b, signed char *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvxl(vector bool char __a, int __b, unsigned char *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvxl(vector bool char __a, int __b, vector bool char *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvxl(vector short __a, int __b, vector short *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvxl(vector short __a, int __b, short *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvxl(vector unsigned short __a, int __b, vector unsigned short *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvxl(vector unsigned short __a, int __b, unsigned short *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvxl(vector bool short __a, int __b, short *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvxl(vector bool short __a, int __b, unsigned short *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvxl(vector bool short __a, int __b, vector bool short *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvxl(vector pixel __a, int __b, short *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvxl(vector pixel __a, int __b, unsigned short *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvxl(vector pixel __a, int __b, vector pixel *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvxl(vector int __a, int __b, vector int *__c)
+{
+ __builtin_altivec_stvxl(__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvxl(vector int __a, int __b, int *__c)
+{
+ __builtin_altivec_stvxl(__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvxl(vector unsigned int __a, int __b, vector unsigned int *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvxl(vector unsigned int __a, int __b, unsigned int *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvxl(vector bool int __a, int __b, int *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvxl(vector bool int __a, int __b, unsigned int *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvxl(vector bool int __a, int __b, vector bool int *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvxl(vector float __a, int __b, vector float *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvxl(vector float __a, int __b, float *__c)
+{
+ __builtin_altivec_stvxl((vector int)__a, __b, __c);
+}
+
+/* vec_sub */
+
+static vector signed char __ATTRS_o_ai
+vec_sub(vector signed char __a, vector signed char __b)
+{
+ return __a - __b;
+}
+
+static vector signed char __ATTRS_o_ai
+vec_sub(vector bool char __a, vector signed char __b)
+{
+ return (vector signed char)__a - __b;
+}
+
+static vector signed char __ATTRS_o_ai
+vec_sub(vector signed char __a, vector bool char __b)
+{
+ return __a - (vector signed char)__b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_sub(vector unsigned char __a, vector unsigned char __b)
+{
+ return __a - __b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_sub(vector bool char __a, vector unsigned char __b)
+{
+ return (vector unsigned char)__a - __b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_sub(vector unsigned char __a, vector bool char __b)
+{
+ return __a - (vector unsigned char)__b;
+}
+
+static vector short __ATTRS_o_ai
+vec_sub(vector short __a, vector short __b)
+{
+ return __a - __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_sub(vector bool short __a, vector short __b)
+{
+ return (vector short)__a - __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_sub(vector short __a, vector bool short __b)
+{
+ return __a - (vector short)__b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_sub(vector unsigned short __a, vector unsigned short __b)
+{
+ return __a - __b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_sub(vector bool short __a, vector unsigned short __b)
+{
+ return (vector unsigned short)__a - __b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_sub(vector unsigned short __a, vector bool short __b)
+{
+ return __a - (vector unsigned short)__b;
+}
+
+static vector int __ATTRS_o_ai
+vec_sub(vector int __a, vector int __b)
+{
+ return __a - __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_sub(vector bool int __a, vector int __b)
+{
+ return (vector int)__a - __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_sub(vector int __a, vector bool int __b)
+{
+ return __a - (vector int)__b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_sub(vector unsigned int __a, vector unsigned int __b)
+{
+ return __a - __b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_sub(vector bool int __a, vector unsigned int __b)
+{
+ return (vector unsigned int)__a - __b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_sub(vector unsigned int __a, vector bool int __b)
+{
+ return __a - (vector unsigned int)__b;
+}
+
+static vector float __ATTRS_o_ai
+vec_sub(vector float __a, vector float __b)
+{
+ return __a - __b;
+}
+
+/* vec_vsububm */
+
+#define __builtin_altivec_vsububm vec_vsububm
+
+static vector signed char __ATTRS_o_ai
+vec_vsububm(vector signed char __a, vector signed char __b)
+{
+ return __a - __b;
+}
+
+static vector signed char __ATTRS_o_ai
+vec_vsububm(vector bool char __a, vector signed char __b)
+{
+ return (vector signed char)__a - __b;
+}
+
+static vector signed char __ATTRS_o_ai
+vec_vsububm(vector signed char __a, vector bool char __b)
+{
+ return __a - (vector signed char)__b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vsububm(vector unsigned char __a, vector unsigned char __b)
+{
+ return __a - __b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vsububm(vector bool char __a, vector unsigned char __b)
+{
+ return (vector unsigned char)__a - __b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vsububm(vector unsigned char __a, vector bool char __b)
+{
+ return __a - (vector unsigned char)__b;
+}
+
+/* vec_vsubuhm */
+
+#define __builtin_altivec_vsubuhm vec_vsubuhm
+
+static vector short __ATTRS_o_ai
+vec_vsubuhm(vector short __a, vector short __b)
+{
+ return __a - __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_vsubuhm(vector bool short __a, vector short __b)
+{
+ return (vector short)__a - __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_vsubuhm(vector short __a, vector bool short __b)
+{
+ return __a - (vector short)__b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vsubuhm(vector unsigned short __a, vector unsigned short __b)
+{
+ return __a - __b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vsubuhm(vector bool short __a, vector unsigned short __b)
+{
+ return (vector unsigned short)__a - __b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vsubuhm(vector unsigned short __a, vector bool short __b)
+{
+ return __a - (vector unsigned short)__b;
+}
+
+/* vec_vsubuwm */
+
+#define __builtin_altivec_vsubuwm vec_vsubuwm
+
+static vector int __ATTRS_o_ai
+vec_vsubuwm(vector int __a, vector int __b)
+{
+ return __a - __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_vsubuwm(vector bool int __a, vector int __b)
+{
+ return (vector int)__a - __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_vsubuwm(vector int __a, vector bool int __b)
+{
+ return __a - (vector int)__b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vsubuwm(vector unsigned int __a, vector unsigned int __b)
+{
+ return __a - __b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vsubuwm(vector bool int __a, vector unsigned int __b)
+{
+ return (vector unsigned int)__a - __b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vsubuwm(vector unsigned int __a, vector bool int __b)
+{
+ return __a - (vector unsigned int)__b;
+}
+
+/* vec_vsubfp */
+
+#define __builtin_altivec_vsubfp vec_vsubfp
+
+static vector float __attribute__((__always_inline__))
+vec_vsubfp(vector float __a, vector float __b)
+{
+ return __a - __b;
+}
+
+/* vec_subc */
+
+static vector unsigned int __attribute__((__always_inline__))
+vec_subc(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vsubcuw(__a, __b);
+}
+
+/* vec_vsubcuw */
+
+static vector unsigned int __attribute__((__always_inline__))
+vec_vsubcuw(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vsubcuw(__a, __b);
+}
+
+/* vec_subs */
+
+static vector signed char __ATTRS_o_ai
+vec_subs(vector signed char __a, vector signed char __b)
+{
+ return __builtin_altivec_vsubsbs(__a, __b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_subs(vector bool char __a, vector signed char __b)
+{
+ return __builtin_altivec_vsubsbs((vector signed char)__a, __b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_subs(vector signed char __a, vector bool char __b)
+{
+ return __builtin_altivec_vsubsbs(__a, (vector signed char)__b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_subs(vector unsigned char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vsububs(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_subs(vector bool char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vsububs((vector unsigned char)__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_subs(vector unsigned char __a, vector bool char __b)
+{
+ return __builtin_altivec_vsububs(__a, (vector unsigned char)__b);
+}
+
+static vector short __ATTRS_o_ai
+vec_subs(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vsubshs(__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_subs(vector bool short __a, vector short __b)
+{
+ return __builtin_altivec_vsubshs((vector short)__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_subs(vector short __a, vector bool short __b)
+{
+ return __builtin_altivec_vsubshs(__a, (vector short)__b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_subs(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vsubuhs(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_subs(vector bool short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vsubuhs((vector unsigned short)__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_subs(vector unsigned short __a, vector bool short __b)
+{
+ return __builtin_altivec_vsubuhs(__a, (vector unsigned short)__b);
+}
+
+static vector int __ATTRS_o_ai
+vec_subs(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vsubsws(__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_subs(vector bool int __a, vector int __b)
+{
+ return __builtin_altivec_vsubsws((vector int)__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_subs(vector int __a, vector bool int __b)
+{
+ return __builtin_altivec_vsubsws(__a, (vector int)__b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_subs(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vsubuws(__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_subs(vector bool int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vsubuws((vector unsigned int)__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_subs(vector unsigned int __a, vector bool int __b)
+{
+ return __builtin_altivec_vsubuws(__a, (vector unsigned int)__b);
+}
+
+/* vec_vsubsbs */
+
+static vector signed char __ATTRS_o_ai
+vec_vsubsbs(vector signed char __a, vector signed char __b)
+{
+ return __builtin_altivec_vsubsbs(__a, __b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_vsubsbs(vector bool char __a, vector signed char __b)
+{
+ return __builtin_altivec_vsubsbs((vector signed char)__a, __b);
+}
+
+static vector signed char __ATTRS_o_ai
+vec_vsubsbs(vector signed char __a, vector bool char __b)
+{
+ return __builtin_altivec_vsubsbs(__a, (vector signed char)__b);
+}
+
+/* vec_vsububs */
+
+static vector unsigned char __ATTRS_o_ai
+vec_vsububs(vector unsigned char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vsububs(__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vsububs(vector bool char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vsububs((vector unsigned char)__a, __b);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vsububs(vector unsigned char __a, vector bool char __b)
+{
+ return __builtin_altivec_vsububs(__a, (vector unsigned char)__b);
+}
+
+/* vec_vsubshs */
+
+static vector short __ATTRS_o_ai
+vec_vsubshs(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vsubshs(__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_vsubshs(vector bool short __a, vector short __b)
+{
+ return __builtin_altivec_vsubshs((vector short)__a, __b);
+}
+
+static vector short __ATTRS_o_ai
+vec_vsubshs(vector short __a, vector bool short __b)
+{
+ return __builtin_altivec_vsubshs(__a, (vector short)__b);
+}
+
+/* vec_vsubuhs */
+
+static vector unsigned short __ATTRS_o_ai
+vec_vsubuhs(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vsubuhs(__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vsubuhs(vector bool short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vsubuhs((vector unsigned short)__a, __b);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vsubuhs(vector unsigned short __a, vector bool short __b)
+{
+ return __builtin_altivec_vsubuhs(__a, (vector unsigned short)__b);
+}
+
+/* vec_vsubsws */
+
+static vector int __ATTRS_o_ai
+vec_vsubsws(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vsubsws(__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_vsubsws(vector bool int __a, vector int __b)
+{
+ return __builtin_altivec_vsubsws((vector int)__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_vsubsws(vector int __a, vector bool int __b)
+{
+ return __builtin_altivec_vsubsws(__a, (vector int)__b);
+}
+
+/* vec_vsubuws */
+
+static vector unsigned int __ATTRS_o_ai
+vec_vsubuws(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vsubuws(__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vsubuws(vector bool int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vsubuws((vector unsigned int)__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vsubuws(vector unsigned int __a, vector bool int __b)
+{
+ return __builtin_altivec_vsubuws(__a, (vector unsigned int)__b);
+}
+
+/* vec_sum4s */
+
+static vector int __ATTRS_o_ai
+vec_sum4s(vector signed char __a, vector int __b)
+{
+ return __builtin_altivec_vsum4sbs(__a, __b);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_sum4s(vector unsigned char __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vsum4ubs(__a, __b);
+}
+
+static vector int __ATTRS_o_ai
+vec_sum4s(vector signed short __a, vector int __b)
+{
+ return __builtin_altivec_vsum4shs(__a, __b);
+}
+
+/* vec_vsum4sbs */
+
+static vector int __attribute__((__always_inline__))
+vec_vsum4sbs(vector signed char __a, vector int __b)
+{
+ return __builtin_altivec_vsum4sbs(__a, __b);
+}
+
+/* vec_vsum4ubs */
+
+static vector unsigned int __attribute__((__always_inline__))
+vec_vsum4ubs(vector unsigned char __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vsum4ubs(__a, __b);
+}
+
+/* vec_vsum4shs */
+
+static vector int __attribute__((__always_inline__))
+vec_vsum4shs(vector signed short __a, vector int __b)
+{
+ return __builtin_altivec_vsum4shs(__a, __b);
+}
+
+/* vec_sum2s */
+
+static vector signed int __attribute__((__always_inline__))
+vec_sum2s(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vsum2sws(__a, __b);
+}
+
+/* vec_vsum2sws */
+
+static vector signed int __attribute__((__always_inline__))
+vec_vsum2sws(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vsum2sws(__a, __b);
+}
+
+/* vec_sums */
+
+static vector signed int __attribute__((__always_inline__))
+vec_sums(vector signed int __a, vector signed int __b)
+{
+ return __builtin_altivec_vsumsws(__a, __b);
+}
+
+/* vec_vsumsws */
+
+static vector signed int __attribute__((__always_inline__))
+vec_vsumsws(vector signed int __a, vector signed int __b)
+{
+ return __builtin_altivec_vsumsws(__a, __b);
+}
+
+/* vec_trunc */
+
+static vector float __attribute__((__always_inline__))
+vec_trunc(vector float __a)
+{
+ return __builtin_altivec_vrfiz(__a);
+}
+
+/* vec_vrfiz */
+
+static vector float __attribute__((__always_inline__))
+vec_vrfiz(vector float __a)
+{
+ return __builtin_altivec_vrfiz(__a);
+}
+
+/* vec_unpackh */
+
+static vector short __ATTRS_o_ai
+vec_unpackh(vector signed char __a)
+{
+ return __builtin_altivec_vupkhsb((vector char)__a);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_unpackh(vector bool char __a)
+{
+ return (vector bool short)__builtin_altivec_vupkhsb((vector char)__a);
+}
+
+static vector int __ATTRS_o_ai
+vec_unpackh(vector short __a)
+{
+ return __builtin_altivec_vupkhsh(__a);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_unpackh(vector bool short __a)
+{
+ return (vector bool int)__builtin_altivec_vupkhsh((vector short)__a);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_unpackh(vector pixel __a)
+{
+ return (vector unsigned int)__builtin_altivec_vupkhsh((vector short)__a);
+}
+
+/* vec_vupkhsb */
+
+static vector short __ATTRS_o_ai
+vec_vupkhsb(vector signed char __a)
+{
+ return __builtin_altivec_vupkhsb((vector char)__a);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_vupkhsb(vector bool char __a)
+{
+ return (vector bool short)__builtin_altivec_vupkhsb((vector char)__a);
+}
+
+/* vec_vupkhsh */
+
+static vector int __ATTRS_o_ai
+vec_vupkhsh(vector short __a)
+{
+ return __builtin_altivec_vupkhsh(__a);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_vupkhsh(vector bool short __a)
+{
+ return (vector bool int)__builtin_altivec_vupkhsh((vector short)__a);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vupkhsh(vector pixel __a)
+{
+ return (vector unsigned int)__builtin_altivec_vupkhsh((vector short)__a);
+}
+
+/* vec_unpackl */
+
+static vector short __ATTRS_o_ai
+vec_unpackl(vector signed char __a)
+{
+ return __builtin_altivec_vupklsb((vector char)__a);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_unpackl(vector bool char __a)
+{
+ return (vector bool short)__builtin_altivec_vupklsb((vector char)__a);
+}
+
+static vector int __ATTRS_o_ai
+vec_unpackl(vector short __a)
+{
+ return __builtin_altivec_vupklsh(__a);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_unpackl(vector bool short __a)
+{
+ return (vector bool int)__builtin_altivec_vupklsh((vector short)__a);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_unpackl(vector pixel __a)
+{
+ return (vector unsigned int)__builtin_altivec_vupklsh((vector short)__a);
+}
+
+/* vec_vupklsb */
+
+static vector short __ATTRS_o_ai
+vec_vupklsb(vector signed char __a)
+{
+ return __builtin_altivec_vupklsb((vector char)__a);
+}
+
+static vector bool short __ATTRS_o_ai
+vec_vupklsb(vector bool char __a)
+{
+ return (vector bool short)__builtin_altivec_vupklsb((vector char)__a);
+}
+
+/* vec_vupklsh */
+
+static vector int __ATTRS_o_ai
+vec_vupklsh(vector short __a)
+{
+ return __builtin_altivec_vupklsh(__a);
+}
+
+static vector bool int __ATTRS_o_ai
+vec_vupklsh(vector bool short __a)
+{
+ return (vector bool int)__builtin_altivec_vupklsh((vector short)__a);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vupklsh(vector pixel __a)
+{
+ return (vector unsigned int)__builtin_altivec_vupklsh((vector short)__a);
+}
+
+/* vec_xor */
+
+#define __builtin_altivec_vxor vec_xor
+
+static vector signed char __ATTRS_o_ai
+vec_xor(vector signed char __a, vector signed char __b)
+{
+ return __a ^ __b;
+}
+
+static vector signed char __ATTRS_o_ai
+vec_xor(vector bool char __a, vector signed char __b)
+{
+ return (vector signed char)__a ^ __b;
+}
+
+static vector signed char __ATTRS_o_ai
+vec_xor(vector signed char __a, vector bool char __b)
+{
+ return __a ^ (vector signed char)__b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_xor(vector unsigned char __a, vector unsigned char __b)
+{
+ return __a ^ __b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_xor(vector bool char __a, vector unsigned char __b)
+{
+ return (vector unsigned char)__a ^ __b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_xor(vector unsigned char __a, vector bool char __b)
+{
+ return __a ^ (vector unsigned char)__b;
+}
+
+static vector bool char __ATTRS_o_ai
+vec_xor(vector bool char __a, vector bool char __b)
+{
+ return __a ^ __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_xor(vector short __a, vector short __b)
+{
+ return __a ^ __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_xor(vector bool short __a, vector short __b)
+{
+ return (vector short)__a ^ __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_xor(vector short __a, vector bool short __b)
+{
+ return __a ^ (vector short)__b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_xor(vector unsigned short __a, vector unsigned short __b)
+{
+ return __a ^ __b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_xor(vector bool short __a, vector unsigned short __b)
+{
+ return (vector unsigned short)__a ^ __b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_xor(vector unsigned short __a, vector bool short __b)
+{
+ return __a ^ (vector unsigned short)__b;
+}
+
+static vector bool short __ATTRS_o_ai
+vec_xor(vector bool short __a, vector bool short __b)
+{
+ return __a ^ __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_xor(vector int __a, vector int __b)
+{
+ return __a ^ __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_xor(vector bool int __a, vector int __b)
+{
+ return (vector int)__a ^ __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_xor(vector int __a, vector bool int __b)
+{
+ return __a ^ (vector int)__b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_xor(vector unsigned int __a, vector unsigned int __b)
+{
+ return __a ^ __b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_xor(vector bool int __a, vector unsigned int __b)
+{
+ return (vector unsigned int)__a ^ __b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_xor(vector unsigned int __a, vector bool int __b)
+{
+ return __a ^ (vector unsigned int)__b;
+}
+
+static vector bool int __ATTRS_o_ai
+vec_xor(vector bool int __a, vector bool int __b)
+{
+ return __a ^ __b;
+}
+
+static vector float __ATTRS_o_ai
+vec_xor(vector float __a, vector float __b)
+{
+ vector unsigned int __res = (vector unsigned int)__a ^ (vector unsigned int)__b;
+ return (vector float)__res;
+}
+
+static vector float __ATTRS_o_ai
+vec_xor(vector bool int __a, vector float __b)
+{
+ vector unsigned int __res = (vector unsigned int)__a ^ (vector unsigned int)__b;
+ return (vector float)__res;
+}
+
+static vector float __ATTRS_o_ai
+vec_xor(vector float __a, vector bool int __b)
+{
+ vector unsigned int __res = (vector unsigned int)__a ^ (vector unsigned int)__b;
+ return (vector float)__res;
+}
+
+/* vec_vxor */
+
+static vector signed char __ATTRS_o_ai
+vec_vxor(vector signed char __a, vector signed char __b)
+{
+ return __a ^ __b;
+}
+
+static vector signed char __ATTRS_o_ai
+vec_vxor(vector bool char __a, vector signed char __b)
+{
+ return (vector signed char)__a ^ __b;
+}
+
+static vector signed char __ATTRS_o_ai
+vec_vxor(vector signed char __a, vector bool char __b)
+{
+ return __a ^ (vector signed char)__b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vxor(vector unsigned char __a, vector unsigned char __b)
+{
+ return __a ^ __b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vxor(vector bool char __a, vector unsigned char __b)
+{
+ return (vector unsigned char)__a ^ __b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_vxor(vector unsigned char __a, vector bool char __b)
+{
+ return __a ^ (vector unsigned char)__b;
+}
+
+static vector bool char __ATTRS_o_ai
+vec_vxor(vector bool char __a, vector bool char __b)
+{
+ return __a ^ __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_vxor(vector short __a, vector short __b)
+{
+ return __a ^ __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_vxor(vector bool short __a, vector short __b)
+{
+ return (vector short)__a ^ __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_vxor(vector short __a, vector bool short __b)
+{
+ return __a ^ (vector short)__b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vxor(vector unsigned short __a, vector unsigned short __b)
+{
+ return __a ^ __b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vxor(vector bool short __a, vector unsigned short __b)
+{
+ return (vector unsigned short)__a ^ __b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_vxor(vector unsigned short __a, vector bool short __b)
+{
+ return __a ^ (vector unsigned short)__b;
+}
+
+static vector bool short __ATTRS_o_ai
+vec_vxor(vector bool short __a, vector bool short __b)
+{
+ return __a ^ __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_vxor(vector int __a, vector int __b)
+{
+ return __a ^ __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_vxor(vector bool int __a, vector int __b)
+{
+ return (vector int)__a ^ __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_vxor(vector int __a, vector bool int __b)
+{
+ return __a ^ (vector int)__b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vxor(vector unsigned int __a, vector unsigned int __b)
+{
+ return __a ^ __b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vxor(vector bool int __a, vector unsigned int __b)
+{
+ return (vector unsigned int)__a ^ __b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_vxor(vector unsigned int __a, vector bool int __b)
+{
+ return __a ^ (vector unsigned int)__b;
+}
+
+static vector bool int __ATTRS_o_ai
+vec_vxor(vector bool int __a, vector bool int __b)
+{
+ return __a ^ __b;
+}
+
+static vector float __ATTRS_o_ai
+vec_vxor(vector float __a, vector float __b)
+{
+ vector unsigned int __res = (vector unsigned int)__a ^ (vector unsigned int)__b;
+ return (vector float)__res;
+}
+
+static vector float __ATTRS_o_ai
+vec_vxor(vector bool int __a, vector float __b)
+{
+ vector unsigned int __res = (vector unsigned int)__a ^ (vector unsigned int)__b;
+ return (vector float)__res;
+}
+
+static vector float __ATTRS_o_ai
+vec_vxor(vector float __a, vector bool int __b)
+{
+ vector unsigned int __res = (vector unsigned int)__a ^ (vector unsigned int)__b;
+ return (vector float)__res;
+}
+
+/* ------------------------ extensions for CBEA ----------------------------- */
+
+/* vec_extract */
+
+static signed char __ATTRS_o_ai
+vec_extract(vector signed char __a, int __b)
+{
+ return __a[__b];
+}
+
+static unsigned char __ATTRS_o_ai
+vec_extract(vector unsigned char __a, int __b)
+{
+ return __a[__b];
+}
+
+static short __ATTRS_o_ai
+vec_extract(vector short __a, int __b)
+{
+ return __a[__b];
+}
+
+static unsigned short __ATTRS_o_ai
+vec_extract(vector unsigned short __a, int __b)
+{
+ return __a[__b];
+}
+
+static int __ATTRS_o_ai
+vec_extract(vector int __a, int __b)
+{
+ return __a[__b];
+}
+
+static unsigned int __ATTRS_o_ai
+vec_extract(vector unsigned int __a, int __b)
+{
+ return __a[__b];
+}
+
+static float __ATTRS_o_ai
+vec_extract(vector float __a, int __b)
+{
+ return __a[__b];
+}
+
+/* vec_insert */
+
+static vector signed char __ATTRS_o_ai
+vec_insert(signed char __a, vector signed char __b, int __c)
+{
+ __b[__c] = __a;
+ return __b;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_insert(unsigned char __a, vector unsigned char __b, int __c)
+{
+ __b[__c] = __a;
+ return __b;
+}
+
+static vector short __ATTRS_o_ai
+vec_insert(short __a, vector short __b, int __c)
+{
+ __b[__c] = __a;
+ return __b;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_insert(unsigned short __a, vector unsigned short __b, int __c)
+{
+ __b[__c] = __a;
+ return __b;
+}
+
+static vector int __ATTRS_o_ai
+vec_insert(int __a, vector int __b, int __c)
+{
+ __b[__c] = __a;
+ return __b;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_insert(unsigned int __a, vector unsigned int __b, int __c)
+{
+ __b[__c] = __a;
+ return __b;
+}
+
+static vector float __ATTRS_o_ai
+vec_insert(float __a, vector float __b, int __c)
+{
+ __b[__c] = __a;
+ return __b;
+}
+
+/* vec_lvlx */
+
+static vector signed char __ATTRS_o_ai
+vec_lvlx(int __a, const signed char *__b)
+{
+ return vec_perm(vec_ld(__a, __b),
+ (vector signed char)(0),
+ vec_lvsl(__a, __b));
+}
+
+static vector signed char __ATTRS_o_ai
+vec_lvlx(int __a, const vector signed char *__b)
+{
+ return vec_perm(vec_ld(__a, __b),
+ (vector signed char)(0),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_lvlx(int __a, const unsigned char *__b)
+{
+ return vec_perm(vec_ld(__a, __b),
+ (vector unsigned char)(0),
+ vec_lvsl(__a, __b));
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_lvlx(int __a, const vector unsigned char *__b)
+{
+ return vec_perm(vec_ld(__a, __b),
+ (vector unsigned char)(0),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector bool char __ATTRS_o_ai
+vec_lvlx(int __a, const vector bool char *__b)
+{
+ return vec_perm(vec_ld(__a, __b),
+ (vector bool char)(0),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector short __ATTRS_o_ai
+vec_lvlx(int __a, const short *__b)
+{
+ return vec_perm(vec_ld(__a, __b),
+ (vector short)(0),
+ vec_lvsl(__a, __b));
+}
+
+static vector short __ATTRS_o_ai
+vec_lvlx(int __a, const vector short *__b)
+{
+ return vec_perm(vec_ld(__a, __b),
+ (vector short)(0),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_lvlx(int __a, const unsigned short *__b)
+{
+ return vec_perm(vec_ld(__a, __b),
+ (vector unsigned short)(0),
+ vec_lvsl(__a, __b));
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_lvlx(int __a, const vector unsigned short *__b)
+{
+ return vec_perm(vec_ld(__a, __b),
+ (vector unsigned short)(0),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector bool short __ATTRS_o_ai
+vec_lvlx(int __a, const vector bool short *__b)
+{
+ return vec_perm(vec_ld(__a, __b),
+ (vector bool short)(0),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector pixel __ATTRS_o_ai
+vec_lvlx(int __a, const vector pixel *__b)
+{
+ return vec_perm(vec_ld(__a, __b),
+ (vector pixel)(0),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector int __ATTRS_o_ai
+vec_lvlx(int __a, const int *__b)
+{
+ return vec_perm(vec_ld(__a, __b),
+ (vector int)(0),
+ vec_lvsl(__a, __b));
+}
+
+static vector int __ATTRS_o_ai
+vec_lvlx(int __a, const vector int *__b)
+{
+ return vec_perm(vec_ld(__a, __b),
+ (vector int)(0),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_lvlx(int __a, const unsigned int *__b)
+{
+ return vec_perm(vec_ld(__a, __b),
+ (vector unsigned int)(0),
+ vec_lvsl(__a, __b));
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_lvlx(int __a, const vector unsigned int *__b)
+{
+ return vec_perm(vec_ld(__a, __b),
+ (vector unsigned int)(0),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector bool int __ATTRS_o_ai
+vec_lvlx(int __a, const vector bool int *__b)
+{
+ return vec_perm(vec_ld(__a, __b),
+ (vector bool int)(0),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector float __ATTRS_o_ai
+vec_lvlx(int __a, const float *__b)
+{
+ return vec_perm(vec_ld(__a, __b),
+ (vector float)(0),
+ vec_lvsl(__a, __b));
+}
+
+static vector float __ATTRS_o_ai
+vec_lvlx(int __a, const vector float *__b)
+{
+ return vec_perm(vec_ld(__a, __b),
+ (vector float)(0),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+/* vec_lvlxl */
+
+static vector signed char __ATTRS_o_ai
+vec_lvlxl(int __a, const signed char *__b)
+{
+ return vec_perm(vec_ldl(__a, __b),
+ (vector signed char)(0),
+ vec_lvsl(__a, __b));
+}
+
+static vector signed char __ATTRS_o_ai
+vec_lvlxl(int __a, const vector signed char *__b)
+{
+ return vec_perm(vec_ldl(__a, __b),
+ (vector signed char)(0),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_lvlxl(int __a, const unsigned char *__b)
+{
+ return vec_perm(vec_ldl(__a, __b),
+ (vector unsigned char)(0),
+ vec_lvsl(__a, __b));
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_lvlxl(int __a, const vector unsigned char *__b)
+{
+ return vec_perm(vec_ldl(__a, __b),
+ (vector unsigned char)(0),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector bool char __ATTRS_o_ai
+vec_lvlxl(int __a, const vector bool char *__b)
+{
+ return vec_perm(vec_ldl(__a, __b),
+ (vector bool char)(0),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector short __ATTRS_o_ai
+vec_lvlxl(int __a, const short *__b)
+{
+ return vec_perm(vec_ldl(__a, __b),
+ (vector short)(0),
+ vec_lvsl(__a, __b));
+}
+
+static vector short __ATTRS_o_ai
+vec_lvlxl(int __a, const vector short *__b)
+{
+ return vec_perm(vec_ldl(__a, __b),
+ (vector short)(0),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_lvlxl(int __a, const unsigned short *__b)
+{
+ return vec_perm(vec_ldl(__a, __b),
+ (vector unsigned short)(0),
+ vec_lvsl(__a, __b));
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_lvlxl(int __a, const vector unsigned short *__b)
+{
+ return vec_perm(vec_ldl(__a, __b),
+ (vector unsigned short)(0),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector bool short __ATTRS_o_ai
+vec_lvlxl(int __a, const vector bool short *__b)
+{
+ return vec_perm(vec_ldl(__a, __b),
+ (vector bool short)(0),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector pixel __ATTRS_o_ai
+vec_lvlxl(int __a, const vector pixel *__b)
+{
+ return vec_perm(vec_ldl(__a, __b),
+ (vector pixel)(0),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector int __ATTRS_o_ai
+vec_lvlxl(int __a, const int *__b)
+{
+ return vec_perm(vec_ldl(__a, __b),
+ (vector int)(0),
+ vec_lvsl(__a, __b));
+}
+
+static vector int __ATTRS_o_ai
+vec_lvlxl(int __a, const vector int *__b)
+{
+ return vec_perm(vec_ldl(__a, __b),
+ (vector int)(0),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_lvlxl(int __a, const unsigned int *__b)
+{
+ return vec_perm(vec_ldl(__a, __b),
+ (vector unsigned int)(0),
+ vec_lvsl(__a, __b));
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_lvlxl(int __a, const vector unsigned int *__b)
+{
+ return vec_perm(vec_ldl(__a, __b),
+ (vector unsigned int)(0),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector bool int __ATTRS_o_ai
+vec_lvlxl(int __a, const vector bool int *__b)
+{
+ return vec_perm(vec_ldl(__a, __b),
+ (vector bool int)(0),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector float __ATTRS_o_ai
+vec_lvlxl(int __a, const float *__b)
+{
+ return vec_perm(vec_ldl(__a, __b),
+ (vector float)(0),
+ vec_lvsl(__a, __b));
+}
+
+static vector float __ATTRS_o_ai
+vec_lvlxl(int __a, vector float *__b)
+{
+ return vec_perm(vec_ldl(__a, __b),
+ (vector float)(0),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+/* vec_lvrx */
+
+static vector signed char __ATTRS_o_ai
+vec_lvrx(int __a, const signed char *__b)
+{
+ return vec_perm((vector signed char)(0),
+ vec_ld(__a, __b),
+ vec_lvsl(__a, __b));
+}
+
+static vector signed char __ATTRS_o_ai
+vec_lvrx(int __a, const vector signed char *__b)
+{
+ return vec_perm((vector signed char)(0),
+ vec_ld(__a, __b),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_lvrx(int __a, const unsigned char *__b)
+{
+ return vec_perm((vector unsigned char)(0),
+ vec_ld(__a, __b),
+ vec_lvsl(__a, __b));
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_lvrx(int __a, const vector unsigned char *__b)
+{
+ return vec_perm((vector unsigned char)(0),
+ vec_ld(__a, __b),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector bool char __ATTRS_o_ai
+vec_lvrx(int __a, const vector bool char *__b)
+{
+ return vec_perm((vector bool char)(0),
+ vec_ld(__a, __b),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector short __ATTRS_o_ai
+vec_lvrx(int __a, const short *__b)
+{
+ return vec_perm((vector short)(0),
+ vec_ld(__a, __b),
+ vec_lvsl(__a, __b));
+}
+
+static vector short __ATTRS_o_ai
+vec_lvrx(int __a, const vector short *__b)
+{
+ return vec_perm((vector short)(0),
+ vec_ld(__a, __b),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_lvrx(int __a, const unsigned short *__b)
+{
+ return vec_perm((vector unsigned short)(0),
+ vec_ld(__a, __b),
+ vec_lvsl(__a, __b));
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_lvrx(int __a, const vector unsigned short *__b)
+{
+ return vec_perm((vector unsigned short)(0),
+ vec_ld(__a, __b),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector bool short __ATTRS_o_ai
+vec_lvrx(int __a, const vector bool short *__b)
+{
+ return vec_perm((vector bool short)(0),
+ vec_ld(__a, __b),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector pixel __ATTRS_o_ai
+vec_lvrx(int __a, const vector pixel *__b)
+{
+ return vec_perm((vector pixel)(0),
+ vec_ld(__a, __b),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector int __ATTRS_o_ai
+vec_lvrx(int __a, const int *__b)
+{
+ return vec_perm((vector int)(0),
+ vec_ld(__a, __b),
+ vec_lvsl(__a, __b));
+}
+
+static vector int __ATTRS_o_ai
+vec_lvrx(int __a, const vector int *__b)
+{
+ return vec_perm((vector int)(0),
+ vec_ld(__a, __b),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_lvrx(int __a, const unsigned int *__b)
+{
+ return vec_perm((vector unsigned int)(0),
+ vec_ld(__a, __b),
+ vec_lvsl(__a, __b));
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_lvrx(int __a, const vector unsigned int *__b)
+{
+ return vec_perm((vector unsigned int)(0),
+ vec_ld(__a, __b),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector bool int __ATTRS_o_ai
+vec_lvrx(int __a, const vector bool int *__b)
+{
+ return vec_perm((vector bool int)(0),
+ vec_ld(__a, __b),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector float __ATTRS_o_ai
+vec_lvrx(int __a, const float *__b)
+{
+ return vec_perm((vector float)(0),
+ vec_ld(__a, __b),
+ vec_lvsl(__a, __b));
+}
+
+static vector float __ATTRS_o_ai
+vec_lvrx(int __a, const vector float *__b)
+{
+ return vec_perm((vector float)(0),
+ vec_ld(__a, __b),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+/* vec_lvrxl */
+
+static vector signed char __ATTRS_o_ai
+vec_lvrxl(int __a, const signed char *__b)
+{
+ return vec_perm((vector signed char)(0),
+ vec_ldl(__a, __b),
+ vec_lvsl(__a, __b));
+}
+
+static vector signed char __ATTRS_o_ai
+vec_lvrxl(int __a, const vector signed char *__b)
+{
+ return vec_perm((vector signed char)(0),
+ vec_ldl(__a, __b),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_lvrxl(int __a, const unsigned char *__b)
+{
+ return vec_perm((vector unsigned char)(0),
+ vec_ldl(__a, __b),
+ vec_lvsl(__a, __b));
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_lvrxl(int __a, const vector unsigned char *__b)
+{
+ return vec_perm((vector unsigned char)(0),
+ vec_ldl(__a, __b),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector bool char __ATTRS_o_ai
+vec_lvrxl(int __a, const vector bool char *__b)
+{
+ return vec_perm((vector bool char)(0),
+ vec_ldl(__a, __b),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector short __ATTRS_o_ai
+vec_lvrxl(int __a, const short *__b)
+{
+ return vec_perm((vector short)(0),
+ vec_ldl(__a, __b),
+ vec_lvsl(__a, __b));
+}
+
+static vector short __ATTRS_o_ai
+vec_lvrxl(int __a, const vector short *__b)
+{
+ return vec_perm((vector short)(0),
+ vec_ldl(__a, __b),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_lvrxl(int __a, const unsigned short *__b)
+{
+ return vec_perm((vector unsigned short)(0),
+ vec_ldl(__a, __b),
+ vec_lvsl(__a, __b));
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_lvrxl(int __a, const vector unsigned short *__b)
+{
+ return vec_perm((vector unsigned short)(0),
+ vec_ldl(__a, __b),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector bool short __ATTRS_o_ai
+vec_lvrxl(int __a, const vector bool short *__b)
+{
+ return vec_perm((vector bool short)(0),
+ vec_ldl(__a, __b),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector pixel __ATTRS_o_ai
+vec_lvrxl(int __a, const vector pixel *__b)
+{
+ return vec_perm((vector pixel)(0),
+ vec_ldl(__a, __b),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector int __ATTRS_o_ai
+vec_lvrxl(int __a, const int *__b)
+{
+ return vec_perm((vector int)(0),
+ vec_ldl(__a, __b),
+ vec_lvsl(__a, __b));
+}
+
+static vector int __ATTRS_o_ai
+vec_lvrxl(int __a, const vector int *__b)
+{
+ return vec_perm((vector int)(0),
+ vec_ldl(__a, __b),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_lvrxl(int __a, const unsigned int *__b)
+{
+ return vec_perm((vector unsigned int)(0),
+ vec_ldl(__a, __b),
+ vec_lvsl(__a, __b));
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_lvrxl(int __a, const vector unsigned int *__b)
+{
+ return vec_perm((vector unsigned int)(0),
+ vec_ldl(__a, __b),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector bool int __ATTRS_o_ai
+vec_lvrxl(int __a, const vector bool int *__b)
+{
+ return vec_perm((vector bool int)(0),
+ vec_ldl(__a, __b),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+static vector float __ATTRS_o_ai
+vec_lvrxl(int __a, const float *__b)
+{
+ return vec_perm((vector float)(0),
+ vec_ldl(__a, __b),
+ vec_lvsl(__a, __b));
+}
+
+static vector float __ATTRS_o_ai
+vec_lvrxl(int __a, const vector float *__b)
+{
+ return vec_perm((vector float)(0),
+ vec_ldl(__a, __b),
+ vec_lvsl(__a, (unsigned char *)__b));
+}
+
+/* vec_stvlx */
+
+static void __ATTRS_o_ai
+vec_stvlx(vector signed char __a, int __b, signed char *__c)
+{
+ return vec_st(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, __c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlx(vector signed char __a, int __b, vector signed char *__c)
+{
+ return vec_st(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlx(vector unsigned char __a, int __b, unsigned char *__c)
+{
+ return vec_st(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, __c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlx(vector unsigned char __a, int __b, vector unsigned char *__c)
+{
+ return vec_st(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlx(vector bool char __a, int __b, vector bool char *__c)
+{
+ return vec_st(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlx(vector short __a, int __b, short *__c)
+{
+ return vec_st(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, __c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlx(vector short __a, int __b, vector short *__c)
+{
+ return vec_st(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlx(vector unsigned short __a, int __b, unsigned short *__c)
+{
+ return vec_st(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, __c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlx(vector unsigned short __a, int __b, vector unsigned short *__c)
+{
+ return vec_st(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlx(vector bool short __a, int __b, vector bool short *__c)
+{
+ return vec_st(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlx(vector pixel __a, int __b, vector pixel *__c)
+{
+ return vec_st(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlx(vector int __a, int __b, int *__c)
+{
+ return vec_st(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, __c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlx(vector int __a, int __b, vector int *__c)
+{
+ return vec_st(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlx(vector unsigned int __a, int __b, unsigned int *__c)
+{
+ return vec_st(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, __c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlx(vector unsigned int __a, int __b, vector unsigned int *__c)
+{
+ return vec_st(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlx(vector bool int __a, int __b, vector bool int *__c)
+{
+ return vec_st(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlx(vector float __a, int __b, vector float *__c)
+{
+ return vec_st(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+/* vec_stvlxl */
+
+static void __ATTRS_o_ai
+vec_stvlxl(vector signed char __a, int __b, signed char *__c)
+{
+ return vec_stl(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, __c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlxl(vector signed char __a, int __b, vector signed char *__c)
+{
+ return vec_stl(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlxl(vector unsigned char __a, int __b, unsigned char *__c)
+{
+ return vec_stl(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, __c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlxl(vector unsigned char __a, int __b, vector unsigned char *__c)
+{
+ return vec_stl(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlxl(vector bool char __a, int __b, vector bool char *__c)
+{
+ return vec_stl(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlxl(vector short __a, int __b, short *__c)
+{
+ return vec_stl(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, __c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlxl(vector short __a, int __b, vector short *__c)
+{
+ return vec_stl(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlxl(vector unsigned short __a, int __b, unsigned short *__c)
+{
+ return vec_stl(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, __c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlxl(vector unsigned short __a, int __b, vector unsigned short *__c)
+{
+ return vec_stl(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlxl(vector bool short __a, int __b, vector bool short *__c)
+{
+ return vec_stl(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlxl(vector pixel __a, int __b, vector pixel *__c)
+{
+ return vec_stl(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlxl(vector int __a, int __b, int *__c)
+{
+ return vec_stl(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, __c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlxl(vector int __a, int __b, vector int *__c)
+{
+ return vec_stl(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlxl(vector unsigned int __a, int __b, unsigned int *__c)
+{
+ return vec_stl(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, __c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlxl(vector unsigned int __a, int __b, vector unsigned int *__c)
+{
+ return vec_stl(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlxl(vector bool int __a, int __b, vector bool int *__c)
+{
+ return vec_stl(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvlxl(vector float __a, int __b, vector float *__c)
+{
+ return vec_stl(vec_perm(vec_lvrx(__b, __c),
+ __a,
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+/* vec_stvrx */
+
+static void __ATTRS_o_ai
+vec_stvrx(vector signed char __a, int __b, signed char *__c)
+{
+ return vec_st(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, __c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrx(vector signed char __a, int __b, vector signed char *__c)
+{
+ return vec_st(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrx(vector unsigned char __a, int __b, unsigned char *__c)
+{
+ return vec_st(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, __c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrx(vector unsigned char __a, int __b, vector unsigned char *__c)
+{
+ return vec_st(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrx(vector bool char __a, int __b, vector bool char *__c)
+{
+ return vec_st(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrx(vector short __a, int __b, short *__c)
+{
+ return vec_st(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, __c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrx(vector short __a, int __b, vector short *__c)
+{
+ return vec_st(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrx(vector unsigned short __a, int __b, unsigned short *__c)
+{
+ return vec_st(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, __c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrx(vector unsigned short __a, int __b, vector unsigned short *__c)
+{
+ return vec_st(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrx(vector bool short __a, int __b, vector bool short *__c)
+{
+ return vec_st(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrx(vector pixel __a, int __b, vector pixel *__c)
+{
+ return vec_st(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrx(vector int __a, int __b, int *__c)
+{
+ return vec_st(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, __c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrx(vector int __a, int __b, vector int *__c)
+{
+ return vec_st(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrx(vector unsigned int __a, int __b, unsigned int *__c)
+{
+ return vec_st(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, __c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrx(vector unsigned int __a, int __b, vector unsigned int *__c)
+{
+ return vec_st(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrx(vector bool int __a, int __b, vector bool int *__c)
+{
+ return vec_st(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrx(vector float __a, int __b, vector float *__c)
+{
+ return vec_st(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+/* vec_stvrxl */
+
+static void __ATTRS_o_ai
+vec_stvrxl(vector signed char __a, int __b, signed char *__c)
+{
+ return vec_stl(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, __c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrxl(vector signed char __a, int __b, vector signed char *__c)
+{
+ return vec_stl(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrxl(vector unsigned char __a, int __b, unsigned char *__c)
+{
+ return vec_stl(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, __c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrxl(vector unsigned char __a, int __b, vector unsigned char *__c)
+{
+ return vec_stl(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrxl(vector bool char __a, int __b, vector bool char *__c)
+{
+ return vec_stl(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrxl(vector short __a, int __b, short *__c)
+{
+ return vec_stl(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, __c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrxl(vector short __a, int __b, vector short *__c)
+{
+ return vec_stl(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrxl(vector unsigned short __a, int __b, unsigned short *__c)
+{
+ return vec_stl(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, __c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrxl(vector unsigned short __a, int __b, vector unsigned short *__c)
+{
+ return vec_stl(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrxl(vector bool short __a, int __b, vector bool short *__c)
+{
+ return vec_stl(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrxl(vector pixel __a, int __b, vector pixel *__c)
+{
+ return vec_stl(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrxl(vector int __a, int __b, int *__c)
+{
+ return vec_stl(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, __c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrxl(vector int __a, int __b, vector int *__c)
+{
+ return vec_stl(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrxl(vector unsigned int __a, int __b, unsigned int *__c)
+{
+ return vec_stl(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, __c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrxl(vector unsigned int __a, int __b, vector unsigned int *__c)
+{
+ return vec_stl(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrxl(vector bool int __a, int __b, vector bool int *__c)
+{
+ return vec_stl(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+static void __ATTRS_o_ai
+vec_stvrxl(vector float __a, int __b, vector float *__c)
+{
+ return vec_stl(vec_perm(__a,
+ vec_lvlx(__b, __c),
+ vec_lvsr(__b, (unsigned char *)__c)),
+ __b, __c);
+}
+
+/* vec_promote */
+
+static vector signed char __ATTRS_o_ai
+vec_promote(signed char __a, int __b)
+{
+ vector signed char __res = (vector signed char)(0);
+ __res[__b] = __a;
+ return __res;
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_promote(unsigned char __a, int __b)
+{
+ vector unsigned char __res = (vector unsigned char)(0);
+ __res[__b] = __a;
+ return __res;
+}
+
+static vector short __ATTRS_o_ai
+vec_promote(short __a, int __b)
+{
+ vector short __res = (vector short)(0);
+ __res[__b] = __a;
+ return __res;
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_promote(unsigned short __a, int __b)
+{
+ vector unsigned short __res = (vector unsigned short)(0);
+ __res[__b] = __a;
+ return __res;
+}
+
+static vector int __ATTRS_o_ai
+vec_promote(int __a, int __b)
+{
+ vector int __res = (vector int)(0);
+ __res[__b] = __a;
+ return __res;
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_promote(unsigned int __a, int __b)
+{
+ vector unsigned int __res = (vector unsigned int)(0);
+ __res[__b] = __a;
+ return __res;
+}
+
+static vector float __ATTRS_o_ai
+vec_promote(float __a, int __b)
+{
+ vector float __res = (vector float)(0);
+ __res[__b] = __a;
+ return __res;
+}
+
+/* vec_splats */
+
+static vector signed char __ATTRS_o_ai
+vec_splats(signed char __a)
+{
+ return (vector signed char)(__a);
+}
+
+static vector unsigned char __ATTRS_o_ai
+vec_splats(unsigned char __a)
+{
+ return (vector unsigned char)(__a);
+}
+
+static vector short __ATTRS_o_ai
+vec_splats(short __a)
+{
+ return (vector short)(__a);
+}
+
+static vector unsigned short __ATTRS_o_ai
+vec_splats(unsigned short __a)
+{
+ return (vector unsigned short)(__a);
+}
+
+static vector int __ATTRS_o_ai
+vec_splats(int __a)
+{
+ return (vector int)(__a);
+}
+
+static vector unsigned int __ATTRS_o_ai
+vec_splats(unsigned int __a)
+{
+ return (vector unsigned int)(__a);
+}
+
+static vector float __ATTRS_o_ai
+vec_splats(float __a)
+{
+ return (vector float)(__a);
+}
+
+/* ----------------------------- predicates --------------------------------- */
+
+/* vec_all_eq */
+
+static int __ATTRS_o_ai
+vec_all_eq(vector signed char __a, vector signed char __b)
+{
+ return __builtin_altivec_vcmpequb_p(__CR6_LT, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_eq(vector signed char __a, vector bool char __b)
+{
+ return __builtin_altivec_vcmpequb_p(__CR6_LT, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_eq(vector unsigned char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vcmpequb_p(__CR6_LT, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_eq(vector unsigned char __a, vector bool char __b)
+{
+ return __builtin_altivec_vcmpequb_p(__CR6_LT, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_eq(vector bool char __a, vector signed char __b)
+{
+ return __builtin_altivec_vcmpequb_p(__CR6_LT, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_eq(vector bool char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vcmpequb_p(__CR6_LT, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_eq(vector bool char __a, vector bool char __b)
+{
+ return __builtin_altivec_vcmpequb_p(__CR6_LT, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_eq(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vcmpequh_p(__CR6_LT, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_all_eq(vector short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpequh_p(__CR6_LT, __a, (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_eq(vector unsigned short __a, vector unsigned short __b)
+{
+ return
+ __builtin_altivec_vcmpequh_p(__CR6_LT, (vector short)__a, (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_eq(vector unsigned short __a, vector bool short __b)
+{
+ return
+ __builtin_altivec_vcmpequh_p(__CR6_LT, (vector short)__a, (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_eq(vector bool short __a, vector short __b)
+{
+ return
+ __builtin_altivec_vcmpequh_p(__CR6_LT, (vector short)__a, (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_eq(vector bool short __a, vector unsigned short __b)
+{
+ return
+ __builtin_altivec_vcmpequh_p(__CR6_LT, (vector short)__a, (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_eq(vector bool short __a, vector bool short __b)
+{
+ return
+ __builtin_altivec_vcmpequh_p(__CR6_LT, (vector short)__a, (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_eq(vector pixel __a, vector pixel __b)
+{
+ return
+ __builtin_altivec_vcmpequh_p(__CR6_LT, (vector short)__a, (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_eq(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vcmpequw_p(__CR6_LT, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_all_eq(vector int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpequw_p(__CR6_LT, __a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_eq(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vcmpequw_p(__CR6_LT, (vector int)__a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_eq(vector unsigned int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpequw_p(__CR6_LT, (vector int)__a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_eq(vector bool int __a, vector int __b)
+{
+ return __builtin_altivec_vcmpequw_p(__CR6_LT, (vector int)__a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_eq(vector bool int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vcmpequw_p(__CR6_LT, (vector int)__a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_eq(vector bool int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpequw_p(__CR6_LT, (vector int)__a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_eq(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vcmpeqfp_p(__CR6_LT, __a, __b);
+}
+
+/* vec_all_ge */
+
+static int __ATTRS_o_ai
+vec_all_ge(vector signed char __a, vector signed char __b)
+{
+ return __builtin_altivec_vcmpgtsb_p(__CR6_EQ, __b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_all_ge(vector signed char __a, vector bool char __b)
+{
+ return __builtin_altivec_vcmpgtsb_p(__CR6_EQ, (vector signed char)__b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_all_ge(vector unsigned char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_EQ, __b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_all_ge(vector unsigned char __a, vector bool char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_EQ, (vector unsigned char)__b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_all_ge(vector bool char __a, vector signed char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_EQ,
+ (vector unsigned char)__b,
+ (vector unsigned char)__a);
+}
+
+static int __ATTRS_o_ai
+vec_all_ge(vector bool char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_EQ, __b, (vector unsigned char)__a);
+}
+
+static int __ATTRS_o_ai
+vec_all_ge(vector bool char __a, vector bool char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_EQ,
+ (vector unsigned char)__b,
+ (vector unsigned char)__a);
+}
+
+static int __ATTRS_o_ai
+vec_all_ge(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vcmpgtsh_p(__CR6_EQ, __b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_all_ge(vector short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpgtsh_p(__CR6_EQ, (vector short)__b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_all_ge(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_EQ, __b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_all_ge(vector unsigned short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_EQ, (vector unsigned short)__b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_all_ge(vector bool short __a, vector short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_EQ,
+ (vector unsigned short)__b,
+ (vector unsigned short)__a);
+}
+
+static int __ATTRS_o_ai
+vec_all_ge(vector bool short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_EQ, __b, (vector unsigned short)__a);
+}
+
+static int __ATTRS_o_ai
+vec_all_ge(vector bool short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_EQ,
+ (vector unsigned short)__b,
+ (vector unsigned short)__a);
+}
+
+static int __ATTRS_o_ai
+vec_all_ge(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vcmpgtsw_p(__CR6_EQ, __b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_all_ge(vector int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpgtsw_p(__CR6_EQ, (vector int)__b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_all_ge(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_EQ, __b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_all_ge(vector unsigned int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_EQ, (vector unsigned int)__b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_all_ge(vector bool int __a, vector int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_EQ,
+ (vector unsigned int)__b,
+ (vector unsigned int)__a);
+}
+
+static int __ATTRS_o_ai
+vec_all_ge(vector bool int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_EQ, __b, (vector unsigned int)__a);
+}
+
+static int __ATTRS_o_ai
+vec_all_ge(vector bool int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_EQ,
+ (vector unsigned int)__b,
+ (vector unsigned int)__a);
+}
+
+static int __ATTRS_o_ai
+vec_all_ge(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vcmpgefp_p(__CR6_LT, __a, __b);
+}
+
+/* vec_all_gt */
+
+static int __ATTRS_o_ai
+vec_all_gt(vector signed char __a, vector signed char __b)
+{
+ return __builtin_altivec_vcmpgtsb_p(__CR6_LT, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_all_gt(vector signed char __a, vector bool char __b)
+{
+ return __builtin_altivec_vcmpgtsb_p(__CR6_LT, __a, (vector signed char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_gt(vector unsigned char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_LT, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_all_gt(vector unsigned char __a, vector bool char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_LT, __a, (vector unsigned char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_gt(vector bool char __a, vector signed char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_LT,
+ (vector unsigned char)__a,
+ (vector unsigned char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_gt(vector bool char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_LT, (vector unsigned char)__a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_all_gt(vector bool char __a, vector bool char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_LT,
+ (vector unsigned char)__a,
+ (vector unsigned char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_gt(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vcmpgtsh_p(__CR6_LT, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_all_gt(vector short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpgtsh_p(__CR6_LT, __a, (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_gt(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_LT, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_all_gt(vector unsigned short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_LT, __a, (vector unsigned short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_gt(vector bool short __a, vector short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_LT,
+ (vector unsigned short)__a,
+ (vector unsigned short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_gt(vector bool short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_LT, (vector unsigned short)__a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_all_gt(vector bool short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_LT,
+ (vector unsigned short)__a,
+ (vector unsigned short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_gt(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vcmpgtsw_p(__CR6_LT, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_all_gt(vector int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpgtsw_p(__CR6_LT, __a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_gt(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_LT, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_all_gt(vector unsigned int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_LT, __a, (vector unsigned int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_gt(vector bool int __a, vector int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_LT,
+ (vector unsigned int)__a,
+ (vector unsigned int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_gt(vector bool int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_LT, (vector unsigned int)__a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_all_gt(vector bool int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_LT,
+ (vector unsigned int)__a,
+ (vector unsigned int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_gt(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vcmpgtfp_p(__CR6_LT, __a, __b);
+}
+
+/* vec_all_in */
+
+static int __attribute__((__always_inline__))
+vec_all_in(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vcmpbfp_p(__CR6_EQ, __a, __b);
+}
+
+/* vec_all_le */
+
+static int __ATTRS_o_ai
+vec_all_le(vector signed char __a, vector signed char __b)
+{
+ return __builtin_altivec_vcmpgtsb_p(__CR6_EQ, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_all_le(vector signed char __a, vector bool char __b)
+{
+ return __builtin_altivec_vcmpgtsb_p(__CR6_EQ, __a, (vector signed char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_le(vector unsigned char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_EQ, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_all_le(vector unsigned char __a, vector bool char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_EQ, __a, (vector unsigned char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_le(vector bool char __a, vector signed char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_EQ,
+ (vector unsigned char)__a,
+ (vector unsigned char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_le(vector bool char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_EQ, (vector unsigned char)__a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_all_le(vector bool char __a, vector bool char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_EQ,
+ (vector unsigned char)__a,
+ (vector unsigned char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_le(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vcmpgtsh_p(__CR6_EQ, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_all_le(vector short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpgtsh_p(__CR6_EQ, __a, (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_le(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_EQ, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_all_le(vector unsigned short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_EQ, __a, (vector unsigned short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_le(vector bool short __a, vector short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_EQ,
+ (vector unsigned short)__a,
+ (vector unsigned short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_le(vector bool short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_EQ, (vector unsigned short)__a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_all_le(vector bool short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_EQ,
+ (vector unsigned short)__a,
+ (vector unsigned short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_le(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vcmpgtsw_p(__CR6_EQ, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_all_le(vector int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpgtsw_p(__CR6_EQ, __a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_le(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_EQ, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_all_le(vector unsigned int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_EQ, __a, (vector unsigned int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_le(vector bool int __a, vector int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_EQ,
+ (vector unsigned int)__a,
+ (vector unsigned int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_le(vector bool int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_EQ, (vector unsigned int)__a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_all_le(vector bool int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_EQ,
+ (vector unsigned int)__a,
+ (vector unsigned int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_le(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vcmpgefp_p(__CR6_LT, __b, __a);
+}
+
+/* vec_all_lt */
+
+static int __ATTRS_o_ai
+vec_all_lt(vector signed char __a, vector signed char __b)
+{
+ return __builtin_altivec_vcmpgtsb_p(__CR6_LT, __b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_all_lt(vector signed char __a, vector bool char __b)
+{
+ return __builtin_altivec_vcmpgtsb_p(__CR6_LT, (vector signed char)__b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_all_lt(vector unsigned char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_LT, __b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_all_lt(vector unsigned char __a, vector bool char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_LT, (vector unsigned char)__b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_all_lt(vector bool char __a, vector signed char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_LT,
+ (vector unsigned char)__b,
+ (vector unsigned char)__a);
+}
+
+static int __ATTRS_o_ai
+vec_all_lt(vector bool char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_LT, __b, (vector unsigned char)__a);
+}
+
+static int __ATTRS_o_ai
+vec_all_lt(vector bool char __a, vector bool char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_LT,
+ (vector unsigned char)__b,
+ (vector unsigned char)__a);
+}
+
+static int __ATTRS_o_ai
+vec_all_lt(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vcmpgtsh_p(__CR6_LT, __b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_all_lt(vector short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpgtsh_p(__CR6_LT, (vector short)__b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_all_lt(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_LT, __b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_all_lt(vector unsigned short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_LT, (vector unsigned short)__b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_all_lt(vector bool short __a, vector short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_LT,
+ (vector unsigned short)__b,
+ (vector unsigned short)__a);
+}
+
+static int __ATTRS_o_ai
+vec_all_lt(vector bool short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_LT, __b, (vector unsigned short)__a);
+}
+
+static int __ATTRS_o_ai
+vec_all_lt(vector bool short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_LT,
+ (vector unsigned short)__b,
+ (vector unsigned short)__a);
+}
+
+static int __ATTRS_o_ai
+vec_all_lt(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vcmpgtsw_p(__CR6_LT, __b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_all_lt(vector int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpgtsw_p(__CR6_LT, (vector int)__b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_all_lt(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_LT, __b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_all_lt(vector unsigned int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_LT, (vector unsigned int)__b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_all_lt(vector bool int __a, vector int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_LT,
+ (vector unsigned int)__b,
+ (vector unsigned int)__a);
+}
+
+static int __ATTRS_o_ai
+vec_all_lt(vector bool int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_LT, __b, (vector unsigned int)__a);
+}
+
+static int __ATTRS_o_ai
+vec_all_lt(vector bool int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_LT,
+ (vector unsigned int)__b,
+ (vector unsigned int)__a);
+}
+
+static int __ATTRS_o_ai
+vec_all_lt(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vcmpgtfp_p(__CR6_LT, __b, __a);
+}
+
+/* vec_all_nan */
+
+static int __attribute__((__always_inline__))
+vec_all_nan(vector float __a)
+{
+ return __builtin_altivec_vcmpeqfp_p(__CR6_EQ, __a, __a);
+}
+
+/* vec_all_ne */
+
+static int __ATTRS_o_ai
+vec_all_ne(vector signed char __a, vector signed char __b)
+{
+ return __builtin_altivec_vcmpequb_p(__CR6_EQ, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_ne(vector signed char __a, vector bool char __b)
+{
+ return __builtin_altivec_vcmpequb_p(__CR6_EQ, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_ne(vector unsigned char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vcmpequb_p(__CR6_EQ, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_ne(vector unsigned char __a, vector bool char __b)
+{
+ return __builtin_altivec_vcmpequb_p(__CR6_EQ, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_ne(vector bool char __a, vector signed char __b)
+{
+ return __builtin_altivec_vcmpequb_p(__CR6_EQ, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_ne(vector bool char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vcmpequb_p(__CR6_EQ, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_ne(vector bool char __a, vector bool char __b)
+{
+ return __builtin_altivec_vcmpequb_p(__CR6_EQ, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_ne(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vcmpequh_p(__CR6_EQ, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_all_ne(vector short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpequh_p(__CR6_EQ, __a, (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_ne(vector unsigned short __a, vector unsigned short __b)
+{
+ return
+ __builtin_altivec_vcmpequh_p(__CR6_EQ, (vector short)__a, (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_ne(vector unsigned short __a, vector bool short __b)
+{
+ return
+ __builtin_altivec_vcmpequh_p(__CR6_EQ, (vector short)__a, (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_ne(vector bool short __a, vector short __b)
+{
+ return
+ __builtin_altivec_vcmpequh_p(__CR6_EQ, (vector short)__a, (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_ne(vector bool short __a, vector unsigned short __b)
+{
+ return
+ __builtin_altivec_vcmpequh_p(__CR6_EQ, (vector short)__a, (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_ne(vector bool short __a, vector bool short __b)
+{
+ return
+ __builtin_altivec_vcmpequh_p(__CR6_EQ, (vector short)__a, (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_ne(vector pixel __a, vector pixel __b)
+{
+ return
+ __builtin_altivec_vcmpequh_p(__CR6_EQ, (vector short)__a, (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_ne(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vcmpequw_p(__CR6_EQ, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_all_ne(vector int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpequw_p(__CR6_EQ, __a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_ne(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vcmpequw_p(__CR6_EQ, (vector int)__a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_ne(vector unsigned int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpequw_p(__CR6_EQ, (vector int)__a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_ne(vector bool int __a, vector int __b)
+{
+ return __builtin_altivec_vcmpequw_p(__CR6_EQ, (vector int)__a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_ne(vector bool int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vcmpequw_p(__CR6_EQ, (vector int)__a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_ne(vector bool int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpequw_p(__CR6_EQ, (vector int)__a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_all_ne(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vcmpeqfp_p(__CR6_EQ, __a, __b);
+}
+
+/* vec_all_nge */
+
+static int __attribute__((__always_inline__))
+vec_all_nge(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vcmpgefp_p(__CR6_EQ, __a, __b);
+}
+
+/* vec_all_ngt */
+
+static int __attribute__((__always_inline__))
+vec_all_ngt(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vcmpgtfp_p(__CR6_EQ, __a, __b);
+}
+
+/* vec_all_nle */
+
+static int __attribute__((__always_inline__))
+vec_all_nle(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vcmpgefp_p(__CR6_EQ, __b, __a);
+}
+
+/* vec_all_nlt */
+
+static int __attribute__((__always_inline__))
+vec_all_nlt(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vcmpgtfp_p(__CR6_EQ, __b, __a);
+}
+
+/* vec_all_numeric */
+
+static int __attribute__((__always_inline__))
+vec_all_numeric(vector float __a)
+{
+ return __builtin_altivec_vcmpeqfp_p(__CR6_LT, __a, __a);
+}
+
+/* vec_any_eq */
+
+static int __ATTRS_o_ai
+vec_any_eq(vector signed char __a, vector signed char __b)
+{
+ return
+ __builtin_altivec_vcmpequb_p(__CR6_EQ_REV, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_eq(vector signed char __a, vector bool char __b)
+{
+ return
+ __builtin_altivec_vcmpequb_p(__CR6_EQ_REV, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_eq(vector unsigned char __a, vector unsigned char __b)
+{
+ return
+ __builtin_altivec_vcmpequb_p(__CR6_EQ_REV, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_eq(vector unsigned char __a, vector bool char __b)
+{
+ return
+ __builtin_altivec_vcmpequb_p(__CR6_EQ_REV, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_eq(vector bool char __a, vector signed char __b)
+{
+ return
+ __builtin_altivec_vcmpequb_p(__CR6_EQ_REV, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_eq(vector bool char __a, vector unsigned char __b)
+{
+ return
+ __builtin_altivec_vcmpequb_p(__CR6_EQ_REV, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_eq(vector bool char __a, vector bool char __b)
+{
+ return
+ __builtin_altivec_vcmpequb_p(__CR6_EQ_REV, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_eq(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vcmpequh_p(__CR6_EQ_REV, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_any_eq(vector short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpequh_p(__CR6_EQ_REV, __a, (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_eq(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vcmpequh_p(__CR6_EQ_REV,
+ (vector short)__a,
+ (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_eq(vector unsigned short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpequh_p(__CR6_EQ_REV,
+ (vector short)__a,
+ (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_eq(vector bool short __a, vector short __b)
+{
+ return __builtin_altivec_vcmpequh_p(__CR6_EQ_REV,
+ (vector short)__a,
+ (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_eq(vector bool short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vcmpequh_p(__CR6_EQ_REV,
+ (vector short)__a,
+ (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_eq(vector bool short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpequh_p(__CR6_EQ_REV,
+ (vector short)__a,
+ (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_eq(vector pixel __a, vector pixel __b)
+{
+ return __builtin_altivec_vcmpequh_p(__CR6_EQ_REV,
+ (vector short)__a,
+ (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_eq(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vcmpequw_p(__CR6_EQ_REV, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_any_eq(vector int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpequw_p(__CR6_EQ_REV, __a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_eq(vector unsigned int __a, vector unsigned int __b)
+{
+ return
+ __builtin_altivec_vcmpequw_p(__CR6_EQ_REV, (vector int)__a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_eq(vector unsigned int __a, vector bool int __b)
+{
+ return
+ __builtin_altivec_vcmpequw_p(__CR6_EQ_REV, (vector int)__a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_eq(vector bool int __a, vector int __b)
+{
+ return
+ __builtin_altivec_vcmpequw_p(__CR6_EQ_REV, (vector int)__a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_eq(vector bool int __a, vector unsigned int __b)
+{
+ return
+ __builtin_altivec_vcmpequw_p(__CR6_EQ_REV, (vector int)__a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_eq(vector bool int __a, vector bool int __b)
+{
+ return
+ __builtin_altivec_vcmpequw_p(__CR6_EQ_REV, (vector int)__a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_eq(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vcmpeqfp_p(__CR6_EQ_REV, __a, __b);
+}
+
+/* vec_any_ge */
+
+static int __ATTRS_o_ai
+vec_any_ge(vector signed char __a, vector signed char __b)
+{
+ return __builtin_altivec_vcmpgtsb_p(__CR6_LT_REV, __b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_any_ge(vector signed char __a, vector bool char __b)
+{
+ return __builtin_altivec_vcmpgtsb_p(__CR6_LT_REV, (vector signed char)__b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_any_ge(vector unsigned char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_LT_REV, __b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_any_ge(vector unsigned char __a, vector bool char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_LT_REV, (vector unsigned char)__b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_any_ge(vector bool char __a, vector signed char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_LT_REV,
+ (vector unsigned char)__b,
+ (vector unsigned char)__a);
+}
+
+static int __ATTRS_o_ai
+vec_any_ge(vector bool char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_LT_REV, __b, (vector unsigned char)__a);
+}
+
+static int __ATTRS_o_ai
+vec_any_ge(vector bool char __a, vector bool char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_LT_REV,
+ (vector unsigned char)__b,
+ (vector unsigned char)__a);
+}
+
+static int __ATTRS_o_ai
+vec_any_ge(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vcmpgtsh_p(__CR6_LT_REV, __b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_any_ge(vector short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpgtsh_p(__CR6_LT_REV, (vector short)__b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_any_ge(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_LT_REV, __b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_any_ge(vector unsigned short __a, vector bool short __b)
+{
+ return
+ __builtin_altivec_vcmpgtuh_p(__CR6_LT_REV, (vector unsigned short)__b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_any_ge(vector bool short __a, vector short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_LT_REV,
+ (vector unsigned short)__b,
+ (vector unsigned short)__a);
+}
+
+static int __ATTRS_o_ai
+vec_any_ge(vector bool short __a, vector unsigned short __b)
+{
+ return
+ __builtin_altivec_vcmpgtuh_p(__CR6_LT_REV, __b, (vector unsigned short)__a);
+}
+
+static int __ATTRS_o_ai
+vec_any_ge(vector bool short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_LT_REV,
+ (vector unsigned short)__b,
+ (vector unsigned short)__a);
+}
+
+static int __ATTRS_o_ai
+vec_any_ge(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vcmpgtsw_p(__CR6_LT_REV, __b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_any_ge(vector int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpgtsw_p(__CR6_LT_REV, (vector int)__b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_any_ge(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_LT_REV, __b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_any_ge(vector unsigned int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_LT_REV, (vector unsigned int)__b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_any_ge(vector bool int __a, vector int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_LT_REV,
+ (vector unsigned int)__b,
+ (vector unsigned int)__a);
+}
+
+static int __ATTRS_o_ai
+vec_any_ge(vector bool int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_LT_REV, __b, (vector unsigned int)__a);
+}
+
+static int __ATTRS_o_ai
+vec_any_ge(vector bool int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_LT_REV,
+ (vector unsigned int)__b,
+ (vector unsigned int)__a);
+}
+
+static int __ATTRS_o_ai
+vec_any_ge(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vcmpgefp_p(__CR6_EQ_REV, __a, __b);
+}
+
+/* vec_any_gt */
+
+static int __ATTRS_o_ai
+vec_any_gt(vector signed char __a, vector signed char __b)
+{
+ return __builtin_altivec_vcmpgtsb_p(__CR6_EQ_REV, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_any_gt(vector signed char __a, vector bool char __b)
+{
+ return __builtin_altivec_vcmpgtsb_p(__CR6_EQ_REV, __a, (vector signed char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_gt(vector unsigned char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_EQ_REV, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_any_gt(vector unsigned char __a, vector bool char __b)
+{
+ return
+ __builtin_altivec_vcmpgtub_p(__CR6_EQ_REV, __a, (vector unsigned char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_gt(vector bool char __a, vector signed char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_EQ_REV,
+ (vector unsigned char)__a,
+ (vector unsigned char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_gt(vector bool char __a, vector unsigned char __b)
+{
+ return
+ __builtin_altivec_vcmpgtub_p(__CR6_EQ_REV, (vector unsigned char)__a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_any_gt(vector bool char __a, vector bool char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_EQ_REV,
+ (vector unsigned char)__a,
+ (vector unsigned char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_gt(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vcmpgtsh_p(__CR6_EQ_REV, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_any_gt(vector short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpgtsh_p(__CR6_EQ_REV, __a, (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_gt(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_EQ_REV, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_any_gt(vector unsigned short __a, vector bool short __b)
+{
+ return
+ __builtin_altivec_vcmpgtuh_p(__CR6_EQ_REV, __a, (vector unsigned short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_gt(vector bool short __a, vector short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_EQ_REV,
+ (vector unsigned short)__a,
+ (vector unsigned short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_gt(vector bool short __a, vector unsigned short __b)
+{
+ return
+ __builtin_altivec_vcmpgtuh_p(__CR6_EQ_REV, (vector unsigned short)__a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_any_gt(vector bool short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_EQ_REV,
+ (vector unsigned short)__a,
+ (vector unsigned short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_gt(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vcmpgtsw_p(__CR6_EQ_REV, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_any_gt(vector int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpgtsw_p(__CR6_EQ_REV, __a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_gt(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_EQ_REV, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_any_gt(vector unsigned int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_EQ_REV, __a, (vector unsigned int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_gt(vector bool int __a, vector int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_EQ_REV,
+ (vector unsigned int)__a,
+ (vector unsigned int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_gt(vector bool int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_EQ_REV, (vector unsigned int)__a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_any_gt(vector bool int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_EQ_REV,
+ (vector unsigned int)__a,
+ (vector unsigned int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_gt(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vcmpgtfp_p(__CR6_EQ_REV, __a, __b);
+}
+
+/* vec_any_le */
+
+static int __ATTRS_o_ai
+vec_any_le(vector signed char __a, vector signed char __b)
+{
+ return __builtin_altivec_vcmpgtsb_p(__CR6_LT_REV, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_any_le(vector signed char __a, vector bool char __b)
+{
+ return __builtin_altivec_vcmpgtsb_p(__CR6_LT_REV, __a, (vector signed char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_le(vector unsigned char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_LT_REV, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_any_le(vector unsigned char __a, vector bool char __b)
+{
+ return
+ __builtin_altivec_vcmpgtub_p(__CR6_LT_REV, __a, (vector unsigned char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_le(vector bool char __a, vector signed char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_LT_REV,
+ (vector unsigned char)__a,
+ (vector unsigned char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_le(vector bool char __a, vector unsigned char __b)
+{
+ return
+ __builtin_altivec_vcmpgtub_p(__CR6_LT_REV, (vector unsigned char)__a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_any_le(vector bool char __a, vector bool char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_LT_REV,
+ (vector unsigned char)__a,
+ (vector unsigned char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_le(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vcmpgtsh_p(__CR6_LT_REV, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_any_le(vector short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpgtsh_p(__CR6_LT_REV, __a, (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_le(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_LT_REV, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_any_le(vector unsigned short __a, vector bool short __b)
+{
+ return
+ __builtin_altivec_vcmpgtuh_p(__CR6_LT_REV, __a, (vector unsigned short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_le(vector bool short __a, vector short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_LT_REV,
+ (vector unsigned short)__a,
+ (vector unsigned short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_le(vector bool short __a, vector unsigned short __b)
+{
+ return
+ __builtin_altivec_vcmpgtuh_p(__CR6_LT_REV, (vector unsigned short)__a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_any_le(vector bool short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_LT_REV,
+ (vector unsigned short)__a,
+ (vector unsigned short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_le(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vcmpgtsw_p(__CR6_LT_REV, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_any_le(vector int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpgtsw_p(__CR6_LT_REV, __a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_le(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_LT_REV, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_any_le(vector unsigned int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_LT_REV, __a, (vector unsigned int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_le(vector bool int __a, vector int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_LT_REV,
+ (vector unsigned int)__a,
+ (vector unsigned int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_le(vector bool int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_LT_REV, (vector unsigned int)__a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_any_le(vector bool int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_LT_REV,
+ (vector unsigned int)__a,
+ (vector unsigned int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_le(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vcmpgefp_p(__CR6_EQ_REV, __b, __a);
+}
+
+/* vec_any_lt */
+
+static int __ATTRS_o_ai
+vec_any_lt(vector signed char __a, vector signed char __b)
+{
+ return __builtin_altivec_vcmpgtsb_p(__CR6_EQ_REV, __b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_any_lt(vector signed char __a, vector bool char __b)
+{
+ return __builtin_altivec_vcmpgtsb_p(__CR6_EQ_REV, (vector signed char)__b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_any_lt(vector unsigned char __a, vector unsigned char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_EQ_REV, __b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_any_lt(vector unsigned char __a, vector bool char __b)
+{
+ return
+ __builtin_altivec_vcmpgtub_p(__CR6_EQ_REV, (vector unsigned char)__b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_any_lt(vector bool char __a, vector signed char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_EQ_REV,
+ (vector unsigned char)__b,
+ (vector unsigned char)__a);
+}
+
+static int __ATTRS_o_ai
+vec_any_lt(vector bool char __a, vector unsigned char __b)
+{
+ return
+ __builtin_altivec_vcmpgtub_p(__CR6_EQ_REV, __b, (vector unsigned char)__a);
+}
+
+static int __ATTRS_o_ai
+vec_any_lt(vector bool char __a, vector bool char __b)
+{
+ return __builtin_altivec_vcmpgtub_p(__CR6_EQ_REV,
+ (vector unsigned char)__b,
+ (vector unsigned char)__a);
+}
+
+static int __ATTRS_o_ai
+vec_any_lt(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vcmpgtsh_p(__CR6_EQ_REV, __b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_any_lt(vector short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpgtsh_p(__CR6_EQ_REV, (vector short)__b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_any_lt(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_EQ_REV, __b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_any_lt(vector unsigned short __a, vector bool short __b)
+{
+ return
+ __builtin_altivec_vcmpgtuh_p(__CR6_EQ_REV, (vector unsigned short)__b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_any_lt(vector bool short __a, vector short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_EQ_REV,
+ (vector unsigned short)__b,
+ (vector unsigned short)__a);
+}
+
+static int __ATTRS_o_ai
+vec_any_lt(vector bool short __a, vector unsigned short __b)
+{
+ return
+ __builtin_altivec_vcmpgtuh_p(__CR6_EQ_REV, __b, (vector unsigned short)__a);
+}
+
+static int __ATTRS_o_ai
+vec_any_lt(vector bool short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpgtuh_p(__CR6_EQ_REV,
+ (vector unsigned short)__b,
+ (vector unsigned short)__a);
+}
+
+static int __ATTRS_o_ai
+vec_any_lt(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vcmpgtsw_p(__CR6_EQ_REV, __b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_any_lt(vector int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpgtsw_p(__CR6_EQ_REV, (vector int)__b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_any_lt(vector unsigned int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_EQ_REV, __b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_any_lt(vector unsigned int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_EQ_REV, (vector unsigned int)__b, __a);
+}
+
+static int __ATTRS_o_ai
+vec_any_lt(vector bool int __a, vector int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_EQ_REV,
+ (vector unsigned int)__b,
+ (vector unsigned int)__a);
+}
+
+static int __ATTRS_o_ai
+vec_any_lt(vector bool int __a, vector unsigned int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_EQ_REV, __b, (vector unsigned int)__a);
+}
+
+static int __ATTRS_o_ai
+vec_any_lt(vector bool int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpgtuw_p(__CR6_EQ_REV,
+ (vector unsigned int)__b,
+ (vector unsigned int)__a);
+}
+
+static int __ATTRS_o_ai
+vec_any_lt(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vcmpgtfp_p(__CR6_EQ_REV, __b, __a);
+}
+
+/* vec_any_nan */
+
+static int __attribute__((__always_inline__))
+vec_any_nan(vector float __a)
+{
+ return __builtin_altivec_vcmpeqfp_p(__CR6_LT_REV, __a, __a);
+}
+
+/* vec_any_ne */
+
+static int __ATTRS_o_ai
+vec_any_ne(vector signed char __a, vector signed char __b)
+{
+ return
+ __builtin_altivec_vcmpequb_p(__CR6_LT_REV, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_ne(vector signed char __a, vector bool char __b)
+{
+ return
+ __builtin_altivec_vcmpequb_p(__CR6_LT_REV, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_ne(vector unsigned char __a, vector unsigned char __b)
+{
+ return
+ __builtin_altivec_vcmpequb_p(__CR6_LT_REV, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_ne(vector unsigned char __a, vector bool char __b)
+{
+ return
+ __builtin_altivec_vcmpequb_p(__CR6_LT_REV, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_ne(vector bool char __a, vector signed char __b)
+{
+ return
+ __builtin_altivec_vcmpequb_p(__CR6_LT_REV, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_ne(vector bool char __a, vector unsigned char __b)
+{
+ return
+ __builtin_altivec_vcmpequb_p(__CR6_LT_REV, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_ne(vector bool char __a, vector bool char __b)
+{
+ return
+ __builtin_altivec_vcmpequb_p(__CR6_LT_REV, (vector char)__a, (vector char)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_ne(vector short __a, vector short __b)
+{
+ return __builtin_altivec_vcmpequh_p(__CR6_LT_REV, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_any_ne(vector short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpequh_p(__CR6_LT_REV, __a, (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_ne(vector unsigned short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vcmpequh_p(__CR6_LT_REV,
+ (vector short)__a,
+ (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_ne(vector unsigned short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpequh_p(__CR6_LT_REV,
+ (vector short)__a,
+ (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_ne(vector bool short __a, vector short __b)
+{
+ return __builtin_altivec_vcmpequh_p(__CR6_LT_REV,
+ (vector short)__a,
+ (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_ne(vector bool short __a, vector unsigned short __b)
+{
+ return __builtin_altivec_vcmpequh_p(__CR6_LT_REV,
+ (vector short)__a,
+ (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_ne(vector bool short __a, vector bool short __b)
+{
+ return __builtin_altivec_vcmpequh_p(__CR6_LT_REV,
+ (vector short)__a,
+ (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_ne(vector pixel __a, vector pixel __b)
+{
+ return __builtin_altivec_vcmpequh_p(__CR6_LT_REV,
+ (vector short)__a,
+ (vector short)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_ne(vector int __a, vector int __b)
+{
+ return __builtin_altivec_vcmpequw_p(__CR6_LT_REV, __a, __b);
+}
+
+static int __ATTRS_o_ai
+vec_any_ne(vector int __a, vector bool int __b)
+{
+ return __builtin_altivec_vcmpequw_p(__CR6_LT_REV, __a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_ne(vector unsigned int __a, vector unsigned int __b)
+{
+ return
+ __builtin_altivec_vcmpequw_p(__CR6_LT_REV, (vector int)__a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_ne(vector unsigned int __a, vector bool int __b)
+{
+ return
+ __builtin_altivec_vcmpequw_p(__CR6_LT_REV, (vector int)__a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_ne(vector bool int __a, vector int __b)
+{
+ return
+ __builtin_altivec_vcmpequw_p(__CR6_LT_REV, (vector int)__a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_ne(vector bool int __a, vector unsigned int __b)
+{
+ return
+ __builtin_altivec_vcmpequw_p(__CR6_LT_REV, (vector int)__a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_ne(vector bool int __a, vector bool int __b)
+{
+ return
+ __builtin_altivec_vcmpequw_p(__CR6_LT_REV, (vector int)__a, (vector int)__b);
+}
+
+static int __ATTRS_o_ai
+vec_any_ne(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vcmpeqfp_p(__CR6_LT_REV, __a, __b);
+}
+
+/* vec_any_nge */
+
+static int __attribute__((__always_inline__))
+vec_any_nge(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vcmpgefp_p(__CR6_LT_REV, __a, __b);
+}
+
+/* vec_any_ngt */
+
+static int __attribute__((__always_inline__))
+vec_any_ngt(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vcmpgtfp_p(__CR6_LT_REV, __a, __b);
+}
+
+/* vec_any_nle */
+
+static int __attribute__((__always_inline__))
+vec_any_nle(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vcmpgefp_p(__CR6_LT_REV, __b, __a);
+}
+
+/* vec_any_nlt */
+
+static int __attribute__((__always_inline__))
+vec_any_nlt(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vcmpgtfp_p(__CR6_LT_REV, __b, __a);
+}
+
+/* vec_any_numeric */
+
+static int __attribute__((__always_inline__))
+vec_any_numeric(vector float __a)
+{
+ return __builtin_altivec_vcmpeqfp_p(__CR6_EQ_REV, __a, __a);
+}
+
+/* vec_any_out */
+
+static int __attribute__((__always_inline__))
+vec_any_out(vector float __a, vector float __b)
+{
+ return __builtin_altivec_vcmpbfp_p(__CR6_EQ_REV, __a, __b);
+}
+
+#undef __ATTRS_o_ai
+
+#endif /* __ALTIVEC_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/ammintrin.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/ammintrin.h
new file mode 100644
index 0000000..d87b9cd
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/ammintrin.h
@@ -0,0 +1,68 @@
+/*===---- ammintrin.h - SSE4a intrinsics -----------------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef __AMMINTRIN_H
+#define __AMMINTRIN_H
+
+#ifndef __SSE4A__
+#error "SSE4A instruction set not enabled"
+#else
+
+#include <pmmintrin.h>
+
+#define _mm_extracti_si64(x, len, idx) \
+ ((__m128i)__builtin_ia32_extrqi((__v2di)(__m128i)(x), \
+ (char)(len), (char)(idx)))
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_extract_si64(__m128i __x, __m128i __y)
+{
+ return (__m128i)__builtin_ia32_extrq((__v2di)__x, (__v16qi)__y);
+}
+
+#define _mm_inserti_si64(x, y, len, idx) \
+ ((__m128i)__builtin_ia32_insertqi((__v2di)(__m128i)(x), \
+ (__v2di)(__m128i)(y), \
+ (char)(len), (char)(idx)))
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_insert_si64(__m128i __x, __m128i __y)
+{
+ return (__m128i)__builtin_ia32_insertq((__v2di)__x, (__v2di)__y);
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_stream_sd(double *__p, __m128d __a)
+{
+ __builtin_ia32_movntsd(__p, (__v2df)__a);
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_stream_ss(float *__p, __m128 __a)
+{
+ __builtin_ia32_movntss(__p, (__v4sf)__a);
+}
+
+#endif /* __SSE4A__ */
+
+#endif /* __AMMINTRIN_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/avx2intrin.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/avx2intrin.h
new file mode 100644
index 0000000..1887fc8
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/avx2intrin.h
@@ -0,0 +1,1206 @@
+/*===---- avx2intrin.h - AVX2 intrinsics -----------------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef __IMMINTRIN_H
+#error "Never use <avx2intrin.h> directly; include <immintrin.h> instead."
+#endif
+
+#ifndef __AVX2INTRIN_H
+#define __AVX2INTRIN_H
+
+/* SSE4 Multiple Packed Sums of Absolute Difference. */
+#define _mm256_mpsadbw_epu8(X, Y, M) __builtin_ia32_mpsadbw256((X), (Y), (M))
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_abs_epi8(__m256i __a)
+{
+ return (__m256i)__builtin_ia32_pabsb256((__v32qi)__a);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_abs_epi16(__m256i __a)
+{
+ return (__m256i)__builtin_ia32_pabsw256((__v16hi)__a);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_abs_epi32(__m256i __a)
+{
+ return (__m256i)__builtin_ia32_pabsd256((__v8si)__a);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_packs_epi16(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_packsswb256((__v16hi)__a, (__v16hi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_packs_epi32(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_packssdw256((__v8si)__a, (__v8si)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_packus_epi16(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_packuswb256((__v16hi)__a, (__v16hi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_packus_epi32(__m256i __V1, __m256i __V2)
+{
+ return (__m256i) __builtin_ia32_packusdw256((__v8si)__V1, (__v8si)__V2);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_add_epi8(__m256i __a, __m256i __b)
+{
+ return (__m256i)((__v32qi)__a + (__v32qi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_add_epi16(__m256i __a, __m256i __b)
+{
+ return (__m256i)((__v16hi)__a + (__v16hi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_add_epi32(__m256i __a, __m256i __b)
+{
+ return (__m256i)((__v8si)__a + (__v8si)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_add_epi64(__m256i __a, __m256i __b)
+{
+ return __a + __b;
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_adds_epi8(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_paddsb256((__v32qi)__a, (__v32qi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_adds_epi16(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_paddsw256((__v16hi)__a, (__v16hi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_adds_epu8(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_paddusb256((__v32qi)__a, (__v32qi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_adds_epu16(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_paddusw256((__v16hi)__a, (__v16hi)__b);
+}
+
+#define _mm256_alignr_epi8(a, b, n) __extension__ ({ \
+ __m256i __a = (a); \
+ __m256i __b = (b); \
+ (__m256i)__builtin_ia32_palignr256((__v32qi)__a, (__v32qi)__b, (n)); })
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_and_si256(__m256i __a, __m256i __b)
+{
+ return __a & __b;
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_andnot_si256(__m256i __a, __m256i __b)
+{
+ return ~__a & __b;
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_avg_epu8(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_pavgb256((__v32qi)__a, (__v32qi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_avg_epu16(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_pavgw256((__v16hi)__a, (__v16hi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_blendv_epi8(__m256i __V1, __m256i __V2, __m256i __M)
+{
+ return (__m256i)__builtin_ia32_pblendvb256((__v32qi)__V1, (__v32qi)__V2,
+ (__v32qi)__M);
+}
+
+#define _mm256_blend_epi16(V1, V2, M) __extension__ ({ \
+ __m256i __V1 = (V1); \
+ __m256i __V2 = (V2); \
+ (__m256i)__builtin_ia32_pblendw256((__v16hi)__V1, (__v16hi)__V2, (M)); })
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_cmpeq_epi8(__m256i __a, __m256i __b)
+{
+ return (__m256i)((__v32qi)__a == (__v32qi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_cmpeq_epi16(__m256i __a, __m256i __b)
+{
+ return (__m256i)((__v16hi)__a == (__v16hi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_cmpeq_epi32(__m256i __a, __m256i __b)
+{
+ return (__m256i)((__v8si)__a == (__v8si)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_cmpeq_epi64(__m256i __a, __m256i __b)
+{
+ return (__m256i)(__a == __b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_cmpgt_epi8(__m256i __a, __m256i __b)
+{
+ return (__m256i)((__v32qi)__a > (__v32qi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_cmpgt_epi16(__m256i __a, __m256i __b)
+{
+ return (__m256i)((__v16hi)__a > (__v16hi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_cmpgt_epi32(__m256i __a, __m256i __b)
+{
+ return (__m256i)((__v8si)__a > (__v8si)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_cmpgt_epi64(__m256i __a, __m256i __b)
+{
+ return (__m256i)(__a > __b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_hadd_epi16(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_phaddw256((__v16hi)__a, (__v16hi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_hadd_epi32(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_phaddd256((__v8si)__a, (__v8si)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_hadds_epi16(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_phaddsw256((__v16hi)__a, (__v16hi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_hsub_epi16(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_phsubw256((__v16hi)__a, (__v16hi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_hsub_epi32(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_phsubd256((__v8si)__a, (__v8si)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_hsubs_epi16(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_phsubsw256((__v16hi)__a, (__v16hi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_maddubs_epi16(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_pmaddubsw256((__v32qi)__a, (__v32qi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_madd_epi16(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_pmaddwd256((__v16hi)__a, (__v16hi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_max_epi8(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_pmaxsb256((__v32qi)__a, (__v32qi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_max_epi16(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_pmaxsw256((__v16hi)__a, (__v16hi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_max_epi32(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_pmaxsd256((__v8si)__a, (__v8si)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_max_epu8(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_pmaxub256((__v32qi)__a, (__v32qi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_max_epu16(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_pmaxuw256((__v16hi)__a, (__v16hi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_max_epu32(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_pmaxud256((__v8si)__a, (__v8si)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_min_epi8(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_pminsb256((__v32qi)__a, (__v32qi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_min_epi16(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_pminsw256((__v16hi)__a, (__v16hi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_min_epi32(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_pminsd256((__v8si)__a, (__v8si)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_min_epu8(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_pminub256((__v32qi)__a, (__v32qi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_min_epu16(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_pminuw256 ((__v16hi)__a, (__v16hi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_min_epu32(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_pminud256((__v8si)__a, (__v8si)__b);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm256_movemask_epi8(__m256i __a)
+{
+ return __builtin_ia32_pmovmskb256((__v32qi)__a);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_cvtepi8_epi16(__m128i __V)
+{
+ return (__m256i)__builtin_ia32_pmovsxbw256((__v16qi)__V);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_cvtepi8_epi32(__m128i __V)
+{
+ return (__m256i)__builtin_ia32_pmovsxbd256((__v16qi)__V);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_cvtepi8_epi64(__m128i __V)
+{
+ return (__m256i)__builtin_ia32_pmovsxbq256((__v16qi)__V);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_cvtepi16_epi32(__m128i __V)
+{
+ return (__m256i)__builtin_ia32_pmovsxwd256((__v8hi)__V);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_cvtepi16_epi64(__m128i __V)
+{
+ return (__m256i)__builtin_ia32_pmovsxwq256((__v8hi)__V);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_cvtepi32_epi64(__m128i __V)
+{
+ return (__m256i)__builtin_ia32_pmovsxdq256((__v4si)__V);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_cvtepu8_epi16(__m128i __V)
+{
+ return (__m256i)__builtin_ia32_pmovzxbw256((__v16qi)__V);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_cvtepu8_epi32(__m128i __V)
+{
+ return (__m256i)__builtin_ia32_pmovzxbd256((__v16qi)__V);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_cvtepu8_epi64(__m128i __V)
+{
+ return (__m256i)__builtin_ia32_pmovzxbq256((__v16qi)__V);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_cvtepu16_epi32(__m128i __V)
+{
+ return (__m256i)__builtin_ia32_pmovzxwd256((__v8hi)__V);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_cvtepu16_epi64(__m128i __V)
+{
+ return (__m256i)__builtin_ia32_pmovzxwq256((__v8hi)__V);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_cvtepu32_epi64(__m128i __V)
+{
+ return (__m256i)__builtin_ia32_pmovzxdq256((__v4si)__V);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_mul_epi32(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_pmuldq256((__v8si)__a, (__v8si)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_mulhrs_epi16(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_pmulhrsw256((__v16hi)__a, (__v16hi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_mulhi_epu16(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_pmulhuw256((__v16hi)__a, (__v16hi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_mulhi_epi16(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_pmulhw256((__v16hi)__a, (__v16hi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_mullo_epi16(__m256i __a, __m256i __b)
+{
+ return (__m256i)((__v16hi)__a * (__v16hi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_mullo_epi32 (__m256i __a, __m256i __b)
+{
+ return (__m256i)((__v8si)__a * (__v8si)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_mul_epu32(__m256i __a, __m256i __b)
+{
+ return __builtin_ia32_pmuludq256((__v8si)__a, (__v8si)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_or_si256(__m256i __a, __m256i __b)
+{
+ return __a | __b;
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_sad_epu8(__m256i __a, __m256i __b)
+{
+ return __builtin_ia32_psadbw256((__v32qi)__a, (__v32qi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_shuffle_epi8(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_pshufb256((__v32qi)__a, (__v32qi)__b);
+}
+
+#define _mm256_shuffle_epi32(a, imm) __extension__ ({ \
+ __m256i __a = (a); \
+ (__m256i)__builtin_shufflevector((__v8si)__a, (__v8si)_mm256_set1_epi32(0), \
+ (imm) & 0x3, ((imm) & 0xc) >> 2, \
+ ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6, \
+ 4 + (((imm) & 0x03) >> 0), \
+ 4 + (((imm) & 0x0c) >> 2), \
+ 4 + (((imm) & 0x30) >> 4), \
+ 4 + (((imm) & 0xc0) >> 6)); })
+
+#define _mm256_shufflehi_epi16(a, imm) __extension__ ({ \
+ __m256i __a = (a); \
+ (__m256i)__builtin_shufflevector((__v16hi)__a, (__v16hi)_mm256_set1_epi16(0), \
+ 0, 1, 2, 3, \
+ 4 + (((imm) & 0x03) >> 0), \
+ 4 + (((imm) & 0x0c) >> 2), \
+ 4 + (((imm) & 0x30) >> 4), \
+ 4 + (((imm) & 0xc0) >> 6), \
+ 8, 9, 10, 11, \
+ 12 + (((imm) & 0x03) >> 0), \
+ 12 + (((imm) & 0x0c) >> 2), \
+ 12 + (((imm) & 0x30) >> 4), \
+ 12 + (((imm) & 0xc0) >> 6)); })
+
+#define _mm256_shufflelo_epi16(a, imm) __extension__ ({ \
+ __m256i __a = (a); \
+ (__m256i)__builtin_shufflevector((__v16hi)__a, (__v16hi)_mm256_set1_epi16(0), \
+ (imm) & 0x3,((imm) & 0xc) >> 2, \
+ ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6, \
+ 4, 5, 6, 7, \
+ 8 + (((imm) & 0x03) >> 0), \
+ 8 + (((imm) & 0x0c) >> 2), \
+ 8 + (((imm) & 0x30) >> 4), \
+ 8 + (((imm) & 0xc0) >> 6), \
+ 12, 13, 14, 15); })
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_sign_epi8(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_psignb256((__v32qi)__a, (__v32qi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_sign_epi16(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_psignw256((__v16hi)__a, (__v16hi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_sign_epi32(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_psignd256((__v8si)__a, (__v8si)__b);
+}
+
+#define _mm256_slli_si256(a, count) __extension__ ({ \
+ __m256i __a = (a); \
+ (__m256i)__builtin_ia32_pslldqi256(__a, (count)*8); })
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_slli_epi16(__m256i __a, int __count)
+{
+ return (__m256i)__builtin_ia32_psllwi256((__v16hi)__a, __count);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_sll_epi16(__m256i __a, __m128i __count)
+{
+ return (__m256i)__builtin_ia32_psllw256((__v16hi)__a, (__v8hi)__count);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_slli_epi32(__m256i __a, int __count)
+{
+ return (__m256i)__builtin_ia32_pslldi256((__v8si)__a, __count);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_sll_epi32(__m256i __a, __m128i __count)
+{
+ return (__m256i)__builtin_ia32_pslld256((__v8si)__a, (__v4si)__count);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_slli_epi64(__m256i __a, int __count)
+{
+ return __builtin_ia32_psllqi256(__a, __count);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_sll_epi64(__m256i __a, __m128i __count)
+{
+ return __builtin_ia32_psllq256(__a, __count);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_srai_epi16(__m256i __a, int __count)
+{
+ return (__m256i)__builtin_ia32_psrawi256((__v16hi)__a, __count);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_sra_epi16(__m256i __a, __m128i __count)
+{
+ return (__m256i)__builtin_ia32_psraw256((__v16hi)__a, (__v8hi)__count);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_srai_epi32(__m256i __a, int __count)
+{
+ return (__m256i)__builtin_ia32_psradi256((__v8si)__a, __count);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_sra_epi32(__m256i __a, __m128i __count)
+{
+ return (__m256i)__builtin_ia32_psrad256((__v8si)__a, (__v4si)__count);
+}
+
+#define _mm256_srli_si256(a, count) __extension__ ({ \
+ __m256i __a = (a); \
+ (__m256i)__builtin_ia32_psrldqi256(__a, (count)*8); })
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_srli_epi16(__m256i __a, int __count)
+{
+ return (__m256i)__builtin_ia32_psrlwi256((__v16hi)__a, __count);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_srl_epi16(__m256i __a, __m128i __count)
+{
+ return (__m256i)__builtin_ia32_psrlw256((__v16hi)__a, (__v8hi)__count);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_srli_epi32(__m256i __a, int __count)
+{
+ return (__m256i)__builtin_ia32_psrldi256((__v8si)__a, __count);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_srl_epi32(__m256i __a, __m128i __count)
+{
+ return (__m256i)__builtin_ia32_psrld256((__v8si)__a, (__v4si)__count);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_srli_epi64(__m256i __a, int __count)
+{
+ return __builtin_ia32_psrlqi256(__a, __count);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_srl_epi64(__m256i __a, __m128i __count)
+{
+ return __builtin_ia32_psrlq256(__a, __count);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_sub_epi8(__m256i __a, __m256i __b)
+{
+ return (__m256i)((__v32qi)__a - (__v32qi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_sub_epi16(__m256i __a, __m256i __b)
+{
+ return (__m256i)((__v16hi)__a - (__v16hi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_sub_epi32(__m256i __a, __m256i __b)
+{
+ return (__m256i)((__v8si)__a - (__v8si)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_sub_epi64(__m256i __a, __m256i __b)
+{
+ return __a - __b;
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_subs_epi8(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_psubsb256((__v32qi)__a, (__v32qi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_subs_epi16(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_psubsw256((__v16hi)__a, (__v16hi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_subs_epu8(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_psubusb256((__v32qi)__a, (__v32qi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_subs_epu16(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_psubusw256((__v16hi)__a, (__v16hi)__b);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_unpackhi_epi8(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_shufflevector((__v32qi)__a, (__v32qi)__b, 8, 32+8, 9, 32+9, 10, 32+10, 11, 32+11, 12, 32+12, 13, 32+13, 14, 32+14, 15, 32+15, 24, 32+24, 25, 32+25, 26, 32+26, 27, 32+27, 28, 32+28, 29, 32+29, 30, 32+30, 31, 32+31);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_unpackhi_epi16(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_shufflevector((__v16hi)__a, (__v16hi)__b, 4, 16+4, 5, 16+5, 6, 16+6, 7, 16+7, 12, 16+12, 13, 16+13, 14, 16+14, 15, 16+15);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_unpackhi_epi32(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_shufflevector((__v8si)__a, (__v8si)__b, 2, 8+2, 3, 8+3, 6, 8+6, 7, 8+7);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_unpackhi_epi64(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_shufflevector(__a, __b, 1, 4+1, 3, 4+3);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_unpacklo_epi8(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_shufflevector((__v32qi)__a, (__v32qi)__b, 0, 32+0, 1, 32+1, 2, 32+2, 3, 32+3, 4, 32+4, 5, 32+5, 6, 32+6, 7, 32+7, 16, 32+16, 17, 32+17, 18, 32+18, 19, 32+19, 20, 32+20, 21, 32+21, 22, 32+22, 23, 32+23);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_unpacklo_epi16(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_shufflevector((__v16hi)__a, (__v16hi)__b, 0, 16+0, 1, 16+1, 2, 16+2, 3, 16+3, 8, 16+8, 9, 16+9, 10, 16+10, 11, 16+11);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_unpacklo_epi32(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_shufflevector((__v8si)__a, (__v8si)__b, 0, 8+0, 1, 8+1, 4, 8+4, 5, 8+5);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_unpacklo_epi64(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_shufflevector(__a, __b, 0, 4+0, 2, 4+2);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_xor_si256(__m256i __a, __m256i __b)
+{
+ return __a ^ __b;
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_stream_load_si256(__m256i *__V)
+{
+ return (__m256i)__builtin_ia32_movntdqa256((__v4di *)__V);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_broadcastss_ps(__m128 __X)
+{
+ return (__m128)__builtin_ia32_vbroadcastss_ps((__v4sf)__X);
+}
+
+static __inline__ __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_broadcastss_ps(__m128 __X)
+{
+ return (__m256)__builtin_ia32_vbroadcastss_ps256((__v4sf)__X);
+}
+
+static __inline__ __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_broadcastsd_pd(__m128d __X)
+{
+ return (__m256d)__builtin_ia32_vbroadcastsd_pd256((__v2df)__X);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm_broadcastsi128_si256(__m128i const *__a)
+{
+ return (__m256i)__builtin_ia32_vbroadcastsi256(__a);
+}
+
+#define _mm_blend_epi32(V1, V2, M) __extension__ ({ \
+ __m128i __V1 = (V1); \
+ __m128i __V2 = (V2); \
+ (__m128i)__builtin_ia32_pblendd128((__v4si)__V1, (__v4si)__V2, (M)); })
+
+#define _mm256_blend_epi32(V1, V2, M) __extension__ ({ \
+ __m256i __V1 = (V1); \
+ __m256i __V2 = (V2); \
+ (__m256i)__builtin_ia32_pblendd256((__v8si)__V1, (__v8si)__V2, (M)); })
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_broadcastb_epi8(__m128i __X)
+{
+ return (__m256i)__builtin_ia32_pbroadcastb256((__v16qi)__X);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_broadcastw_epi16(__m128i __X)
+{
+ return (__m256i)__builtin_ia32_pbroadcastw256((__v8hi)__X);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_broadcastd_epi32(__m128i __X)
+{
+ return (__m256i)__builtin_ia32_pbroadcastd256((__v4si)__X);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_broadcastq_epi64(__m128i __X)
+{
+ return (__m256i)__builtin_ia32_pbroadcastq256(__X);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_broadcastb_epi8(__m128i __X)
+{
+ return (__m128i)__builtin_ia32_pbroadcastb128((__v16qi)__X);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_broadcastw_epi16(__m128i __X)
+{
+ return (__m128i)__builtin_ia32_pbroadcastw128((__v8hi)__X);
+}
+
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_broadcastd_epi32(__m128i __X)
+{
+ return (__m128i)__builtin_ia32_pbroadcastd128((__v4si)__X);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_broadcastq_epi64(__m128i __X)
+{
+ return (__m128i)__builtin_ia32_pbroadcastq128(__X);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_permutevar8x32_epi32(__m256i __a, __m256i __b)
+{
+ return (__m256i)__builtin_ia32_permvarsi256((__v8si)__a, (__v8si)__b);
+}
+
+#define _mm256_permute4x64_pd(V, M) __extension__ ({ \
+ __m256d __V = (V); \
+ (__m256d)__builtin_shufflevector((__v4df)__V, (__v4df) _mm256_setzero_pd(), \
+ (M) & 0x3, ((M) & 0xc) >> 2, \
+ ((M) & 0x30) >> 4, ((M) & 0xc0) >> 6); })
+
+static __inline__ __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_permutevar8x32_ps(__m256 __a, __m256 __b)
+{
+ return (__m256)__builtin_ia32_permvarsf256((__v8sf)__a, (__v8sf)__b);
+}
+
+#define _mm256_permute4x64_epi64(V, M) __extension__ ({ \
+ __m256i __V = (V); \
+ (__m256i)__builtin_shufflevector((__v4di)__V, (__v4di) _mm256_setzero_si256(), \
+ (M) & 0x3, ((M) & 0xc) >> 2, \
+ ((M) & 0x30) >> 4, ((M) & 0xc0) >> 6); })
+
+#define _mm256_permute2x128_si256(V1, V2, M) __extension__ ({ \
+ __m256i __V1 = (V1); \
+ __m256i __V2 = (V2); \
+ (__m256i)__builtin_ia32_permti256(__V1, __V2, (M)); })
+
+#define _mm256_extracti128_si256(A, O) __extension__ ({ \
+ __m256i __A = (A); \
+ (__m128i)__builtin_ia32_extract128i256(__A, (O)); })
+
+#define _mm256_inserti128_si256(V1, V2, O) __extension__ ({ \
+ __m256i __V1 = (V1); \
+ __m128i __V2 = (V2); \
+ (__m256i)__builtin_ia32_insert128i256(__V1, __V2, (O)); })
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_maskload_epi32(int const *__X, __m256i __M)
+{
+ return (__m256i)__builtin_ia32_maskloadd256((const __v8si *)__X, (__v8si)__M);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_maskload_epi64(long long const *__X, __m256i __M)
+{
+ return (__m256i)__builtin_ia32_maskloadq256((const __v4di *)__X, __M);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_maskload_epi32(int const *__X, __m128i __M)
+{
+ return (__m128i)__builtin_ia32_maskloadd((const __v4si *)__X, (__v4si)__M);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_maskload_epi64(long long const *__X, __m128i __M)
+{
+ return (__m128i)__builtin_ia32_maskloadq((const __v2di *)__X, (__v2di)__M);
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm256_maskstore_epi32(int *__X, __m256i __M, __m256i __Y)
+{
+ __builtin_ia32_maskstored256((__v8si *)__X, (__v8si)__M, (__v8si)__Y);
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm256_maskstore_epi64(long long *__X, __m256i __M, __m256i __Y)
+{
+ __builtin_ia32_maskstoreq256((__v4di *)__X, __M, __Y);
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_maskstore_epi32(int *__X, __m128i __M, __m128i __Y)
+{
+ __builtin_ia32_maskstored((__v4si *)__X, (__v4si)__M, (__v4si)__Y);
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_maskstore_epi64(long long *__X, __m128i __M, __m128i __Y)
+{
+ __builtin_ia32_maskstoreq(( __v2di *)__X, __M, __Y);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_sllv_epi32(__m256i __X, __m256i __Y)
+{
+ return (__m256i)__builtin_ia32_psllv8si((__v8si)__X, (__v8si)__Y);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_sllv_epi32(__m128i __X, __m128i __Y)
+{
+ return (__m128i)__builtin_ia32_psllv4si((__v4si)__X, (__v4si)__Y);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_sllv_epi64(__m256i __X, __m256i __Y)
+{
+ return (__m256i)__builtin_ia32_psllv4di(__X, __Y);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_sllv_epi64(__m128i __X, __m128i __Y)
+{
+ return (__m128i)__builtin_ia32_psllv2di(__X, __Y);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_srav_epi32(__m256i __X, __m256i __Y)
+{
+ return (__m256i)__builtin_ia32_psrav8si((__v8si)__X, (__v8si)__Y);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_srav_epi32(__m128i __X, __m128i __Y)
+{
+ return (__m128i)__builtin_ia32_psrav4si((__v4si)__X, (__v4si)__Y);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_srlv_epi32(__m256i __X, __m256i __Y)
+{
+ return (__m256i)__builtin_ia32_psrlv8si((__v8si)__X, (__v8si)__Y);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_srlv_epi32(__m128i __X, __m128i __Y)
+{
+ return (__m128i)__builtin_ia32_psrlv4si((__v4si)__X, (__v4si)__Y);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_srlv_epi64(__m256i __X, __m256i __Y)
+{
+ return (__m256i)__builtin_ia32_psrlv4di(__X, __Y);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_srlv_epi64(__m128i __X, __m128i __Y)
+{
+ return (__m128i)__builtin_ia32_psrlv2di(__X, __Y);
+}
+
+#define _mm_mask_i32gather_pd(a, m, i, mask, s) __extension__ ({ \
+ __m128d __a = (a); \
+ double const *__m = (m); \
+ __m128i __i = (i); \
+ __m128d __mask = (mask); \
+ (__m128d)__builtin_ia32_gatherd_pd((__v2df)__a, (const __v2df *)__m, \
+ (__v4si)__i, (__v2df)__mask, (s)); })
+
+#define _mm256_mask_i32gather_pd(a, m, i, mask, s) __extension__ ({ \
+ __m256d __a = (a); \
+ double const *__m = (m); \
+ __m128i __i = (i); \
+ __m256d __mask = (mask); \
+ (__m256d)__builtin_ia32_gatherd_pd256((__v4df)__a, (const __v4df *)__m, \
+ (__v4si)__i, (__v4df)__mask, (s)); })
+
+#define _mm_mask_i64gather_pd(a, m, i, mask, s) __extension__ ({ \
+ __m128d __a = (a); \
+ double const *__m = (m); \
+ __m128i __i = (i); \
+ __m128d __mask = (mask); \
+ (__m128d)__builtin_ia32_gatherq_pd((__v2df)__a, (const __v2df *)__m, \
+ (__v2di)__i, (__v2df)__mask, (s)); })
+
+#define _mm256_mask_i64gather_pd(a, m, i, mask, s) __extension__ ({ \
+ __m256d __a = (a); \
+ double const *__m = (m); \
+ __m256i __i = (i); \
+ __m256d __mask = (mask); \
+ (__m256d)__builtin_ia32_gatherq_pd256((__v4df)__a, (const __v4df *)__m, \
+ (__v4di)__i, (__v4df)__mask, (s)); })
+
+#define _mm_mask_i32gather_ps(a, m, i, mask, s) __extension__ ({ \
+ __m128 __a = (a); \
+ float const *__m = (m); \
+ __m128i __i = (i); \
+ __m128 __mask = (mask); \
+ (__m128)__builtin_ia32_gatherd_ps((__v4sf)__a, (const __v4sf *)__m, \
+ (__v4si)__i, (__v4sf)__mask, (s)); })
+
+#define _mm256_mask_i32gather_ps(a, m, i, mask, s) __extension__ ({ \
+ __m256 __a = (a); \
+ float const *__m = (m); \
+ __m256i __i = (i); \
+ __m256 __mask = (mask); \
+ (__m256)__builtin_ia32_gatherd_ps256((__v8sf)__a, (const __v8sf *)__m, \
+ (__v8si)__i, (__v8sf)__mask, (s)); })
+
+#define _mm_mask_i64gather_ps(a, m, i, mask, s) __extension__ ({ \
+ __m128 __a = (a); \
+ float const *__m = (m); \
+ __m128i __i = (i); \
+ __m128 __mask = (mask); \
+ (__m128)__builtin_ia32_gatherq_ps((__v4sf)__a, (const __v4sf *)__m, \
+ (__v2di)__i, (__v4sf)__mask, (s)); })
+
+#define _mm256_mask_i64gather_ps(a, m, i, mask, s) __extension__ ({ \
+ __m128 __a = (a); \
+ float const *__m = (m); \
+ __m256i __i = (i); \
+ __m128 __mask = (mask); \
+ (__m128)__builtin_ia32_gatherq_ps256((__v4sf)__a, (const __v4sf *)__m, \
+ (__v4di)__i, (__v4sf)__mask, (s)); })
+
+#define _mm_mask_i32gather_epi32(a, m, i, mask, s) __extension__ ({ \
+ __m128i __a = (a); \
+ int const *__m = (m); \
+ __m128i __i = (i); \
+ __m128i __mask = (mask); \
+ (__m128i)__builtin_ia32_gatherd_d((__v4si)__a, (const __v4si *)__m, \
+ (__v4si)__i, (__v4si)__mask, (s)); })
+
+#define _mm256_mask_i32gather_epi32(a, m, i, mask, s) __extension__ ({ \
+ __m256i __a = (a); \
+ int const *__m = (m); \
+ __m256i __i = (i); \
+ __m256i __mask = (mask); \
+ (__m256i)__builtin_ia32_gatherd_d256((__v8si)__a, (const __v8si *)__m, \
+ (__v8si)__i, (__v8si)__mask, (s)); })
+
+#define _mm_mask_i64gather_epi32(a, m, i, mask, s) __extension__ ({ \
+ __m128i __a = (a); \
+ int const *__m = (m); \
+ __m128i __i = (i); \
+ __m128i __mask = (mask); \
+ (__m128i)__builtin_ia32_gatherq_d((__v4si)__a, (const __v4si *)__m, \
+ (__v2di)__i, (__v4si)__mask, (s)); })
+
+#define _mm256_mask_i64gather_epi32(a, m, i, mask, s) __extension__ ({ \
+ __m128i __a = (a); \
+ int const *__m = (m); \
+ __m256i __i = (i); \
+ __m128i __mask = (mask); \
+ (__m128i)__builtin_ia32_gatherq_d256((__v4si)__a, (const __v4si *)__m, \
+ (__v4di)__i, (__v4si)__mask, (s)); })
+
+#define _mm_mask_i32gather_epi64(a, m, i, mask, s) __extension__ ({ \
+ __m128i __a = (a); \
+ int const *__m = (m); \
+ __m128i __i = (i); \
+ __m128i __mask = (mask); \
+ (__m128i)__builtin_ia32_gatherd_q((__v2di)__a, (const __v2di *)__m, \
+ (__v4si)__i, (__v2di)__mask, (s)); })
+
+#define _mm256_mask_i32gather_epi64(a, m, i, mask, s) __extension__ ({ \
+ __m256i __a = (a); \
+ int const *__m = (m); \
+ __m128i __i = (i); \
+ __m256i __mask = (mask); \
+ (__m256i)__builtin_ia32_gatherd_q256((__v4di)__a, (const __v4di *)__m, \
+ (__v4si)__i, (__v4di)__mask, (s)); })
+
+#define _mm_mask_i64gather_epi64(a, m, i, mask, s) __extension__ ({ \
+ __m128i __a = (a); \
+ int const *__m = (m); \
+ __m128i __i = (i); \
+ __m128i __mask = (mask); \
+ (__m128i)__builtin_ia32_gatherq_q((__v2di)__a, (const __v2di *)__m, \
+ (__v2di)__i, (__v2di)__mask, (s)); })
+
+#define _mm256_mask_i64gather_epi64(a, m, i, mask, s) __extension__ ({ \
+ __m256i __a = (a); \
+ int const *__m = (m); \
+ __m256i __i = (i); \
+ __m256i __mask = (mask); \
+ (__m256i)__builtin_ia32_gatherq_q256((__v4di)__a, (const __v4di *)__m, \
+ (__v4di)__i, (__v4di)__mask, (s)); })
+
+#define _mm_i32gather_pd(m, i, s) __extension__ ({ \
+ double const *__m = (m); \
+ __m128i __i = (i); \
+ (__m128d)__builtin_ia32_gatherd_pd((__v2df)_mm_setzero_pd(), \
+ (const __v2df *)__m, (__v4si)__i, \
+ (__v2df)_mm_set1_pd((double)(long long int)-1), (s)); })
+
+#define _mm256_i32gather_pd(m, i, s) __extension__ ({ \
+ double const *__m = (m); \
+ __m128i __i = (i); \
+ (__m256d)__builtin_ia32_gatherd_pd256((__v4df)_mm256_setzero_pd(), \
+ (const __v4df *)__m, (__v4si)__i, \
+ (__v4df)_mm256_set1_pd((double)(long long int)-1), (s)); })
+
+#define _mm_i64gather_pd(m, i, s) __extension__ ({ \
+ double const *__m = (m); \
+ __m128i __i = (i); \
+ (__m128d)__builtin_ia32_gatherq_pd((__v2df)_mm_setzero_pd(), \
+ (const __v2df *)__m, (__v2di)__i, \
+ (__v2df)_mm_set1_pd((double)(long long int)-1), (s)); })
+
+#define _mm256_i64gather_pd(m, i, s) __extension__ ({ \
+ double const *__m = (m); \
+ __m256i __i = (i); \
+ (__m256d)__builtin_ia32_gatherq_pd256((__v4df)_mm256_setzero_pd(), \
+ (const __v4df *)__m, (__v4di)__i, \
+ (__v4df)_mm256_set1_pd((double)(long long int)-1), (s)); })
+
+#define _mm_i32gather_ps(m, i, s) __extension__ ({ \
+ float const *__m = (m); \
+ __m128i __i = (i); \
+ (__m128)__builtin_ia32_gatherd_ps((__v4sf)_mm_setzero_ps(), \
+ (const __v4sf *)__m, (__v4si)__i, \
+ (__v4sf)_mm_set1_ps((float)(int)-1), (s)); })
+
+#define _mm256_i32gather_ps(m, i, s) __extension__ ({ \
+ float const *__m = (m); \
+ __m256i __i = (i); \
+ (__m256)__builtin_ia32_gatherd_ps256((__v8sf)_mm256_setzero_ps(), \
+ (const __v8sf *)__m, (__v8si)__i, \
+ (__v8sf)_mm256_set1_ps((float)(int)-1), (s)); })
+
+#define _mm_i64gather_ps(m, i, s) __extension__ ({ \
+ float const *__m = (m); \
+ __m128i __i = (i); \
+ (__m128)__builtin_ia32_gatherq_ps((__v4sf)_mm_setzero_ps(), \
+ (const __v4sf *)__m, (__v2di)__i, \
+ (__v4sf)_mm_set1_ps((float)(int)-1), (s)); })
+
+#define _mm256_i64gather_ps(m, i, s) __extension__ ({ \
+ float const *__m = (m); \
+ __m256i __i = (i); \
+ (__m128)__builtin_ia32_gatherq_ps256((__v4sf)_mm_setzero_ps(), \
+ (const __v4sf *)__m, (__v4di)__i, \
+ (__v4sf)_mm_set1_ps((float)(int)-1), (s)); })
+
+#define _mm_i32gather_epi32(m, i, s) __extension__ ({ \
+ int const *__m = (m); \
+ __m128i __i = (i); \
+ (__m128i)__builtin_ia32_gatherd_d((__v4si)_mm_setzero_si128(), \
+ (const __v4si *)__m, (__v4si)__i, \
+ (__v4si)_mm_set1_epi32(-1), (s)); })
+
+#define _mm256_i32gather_epi32(m, i, s) __extension__ ({ \
+ int const *__m = (m); \
+ __m256i __i = (i); \
+ (__m256i)__builtin_ia32_gatherd_d256((__v8si)_mm256_setzero_si256(), \
+ (const __v8si *)__m, (__v8si)__i, \
+ (__v8si)_mm256_set1_epi32(-1), (s)); })
+
+#define _mm_i64gather_epi32(m, i, s) __extension__ ({ \
+ int const *__m = (m); \
+ __m128i __i = (i); \
+ (__m128i)__builtin_ia32_gatherq_d((__v4si)_mm_setzero_si128(), \
+ (const __v4si *)__m, (__v2di)__i, \
+ (__v4si)_mm_set1_epi32(-1), (s)); })
+
+#define _mm256_i64gather_epi32(m, i, s) __extension__ ({ \
+ int const *__m = (m); \
+ __m256i __i = (i); \
+ (__m128i)__builtin_ia32_gatherq_d256((__v4si)_mm_setzero_si128(), \
+ (const __v4si *)__m, (__v4di)__i, \
+ (__v4si)_mm_set1_epi32(-1), (s)); })
+
+#define _mm_i32gather_epi64(m, i, s) __extension__ ({ \
+ int const *__m = (m); \
+ __m128i __i = (i); \
+ (__m128i)__builtin_ia32_gatherd_q((__v2di)_mm_setzero_si128(), \
+ (const __v2di *)__m, (__v4si)__i, \
+ (__v2di)_mm_set1_epi64x(-1), (s)); })
+
+#define _mm256_i32gather_epi64(m, i, s) __extension__ ({ \
+ int const *__m = (m); \
+ __m128i __i = (i); \
+ (__m256i)__builtin_ia32_gatherd_q256((__v4di)_mm256_setzero_si256(), \
+ (const __v4di *)__m, (__v4si)__i, \
+ (__v4di)_mm256_set1_epi64x(-1), (s)); })
+
+#define _mm_i64gather_epi64(m, i, s) __extension__ ({ \
+ int const *__m = (m); \
+ __m128i __i = (i); \
+ (__m128i)__builtin_ia32_gatherq_q((__v2di)_mm_setzero_si128(), \
+ (const __v2di *)__m, (__v2di)__i, \
+ (__v2di)_mm_set1_epi64x(-1), (s)); })
+
+#define _mm256_i64gather_epi64(m, i, s) __extension__ ({ \
+ int const *__m = (m); \
+ __m256i __i = (i); \
+ (__m256i)__builtin_ia32_gatherq_q256((__v4di)_mm256_setzero_si256(), \
+ (const __v4di *)__m, (__v4di)__i, \
+ (__v4di)_mm256_set1_epi64x(-1), (s)); })
+
+#endif /* __AVX2INTRIN_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/avxintrin.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/avxintrin.h
new file mode 100644
index 0000000..50454f2
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/avxintrin.h
@@ -0,0 +1,1224 @@
+/*===---- avxintrin.h - AVX intrinsics -------------------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef __IMMINTRIN_H
+#error "Never use <avxintrin.h> directly; include <immintrin.h> instead."
+#endif
+
+#ifndef __AVXINTRIN_H
+#define __AVXINTRIN_H
+
+typedef double __v4df __attribute__ ((__vector_size__ (32)));
+typedef float __v8sf __attribute__ ((__vector_size__ (32)));
+typedef long long __v4di __attribute__ ((__vector_size__ (32)));
+typedef int __v8si __attribute__ ((__vector_size__ (32)));
+typedef short __v16hi __attribute__ ((__vector_size__ (32)));
+typedef char __v32qi __attribute__ ((__vector_size__ (32)));
+
+typedef float __m256 __attribute__ ((__vector_size__ (32)));
+typedef double __m256d __attribute__((__vector_size__(32)));
+typedef long long __m256i __attribute__((__vector_size__(32)));
+
+/* Arithmetic */
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_add_pd(__m256d __a, __m256d __b)
+{
+ return __a+__b;
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_add_ps(__m256 __a, __m256 __b)
+{
+ return __a+__b;
+}
+
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_sub_pd(__m256d __a, __m256d __b)
+{
+ return __a-__b;
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_sub_ps(__m256 __a, __m256 __b)
+{
+ return __a-__b;
+}
+
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_addsub_pd(__m256d __a, __m256d __b)
+{
+ return (__m256d)__builtin_ia32_addsubpd256((__v4df)__a, (__v4df)__b);
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_addsub_ps(__m256 __a, __m256 __b)
+{
+ return (__m256)__builtin_ia32_addsubps256((__v8sf)__a, (__v8sf)__b);
+}
+
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_div_pd(__m256d __a, __m256d __b)
+{
+ return __a / __b;
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_div_ps(__m256 __a, __m256 __b)
+{
+ return __a / __b;
+}
+
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_max_pd(__m256d __a, __m256d __b)
+{
+ return (__m256d)__builtin_ia32_maxpd256((__v4df)__a, (__v4df)__b);
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_max_ps(__m256 __a, __m256 __b)
+{
+ return (__m256)__builtin_ia32_maxps256((__v8sf)__a, (__v8sf)__b);
+}
+
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_min_pd(__m256d __a, __m256d __b)
+{
+ return (__m256d)__builtin_ia32_minpd256((__v4df)__a, (__v4df)__b);
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_min_ps(__m256 __a, __m256 __b)
+{
+ return (__m256)__builtin_ia32_minps256((__v8sf)__a, (__v8sf)__b);
+}
+
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_mul_pd(__m256d __a, __m256d __b)
+{
+ return __a * __b;
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_mul_ps(__m256 __a, __m256 __b)
+{
+ return __a * __b;
+}
+
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_sqrt_pd(__m256d __a)
+{
+ return (__m256d)__builtin_ia32_sqrtpd256((__v4df)__a);
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_sqrt_ps(__m256 __a)
+{
+ return (__m256)__builtin_ia32_sqrtps256((__v8sf)__a);
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_rsqrt_ps(__m256 __a)
+{
+ return (__m256)__builtin_ia32_rsqrtps256((__v8sf)__a);
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_rcp_ps(__m256 __a)
+{
+ return (__m256)__builtin_ia32_rcpps256((__v8sf)__a);
+}
+
+#define _mm256_round_pd(V, M) __extension__ ({ \
+ __m256d __V = (V); \
+ (__m256d)__builtin_ia32_roundpd256((__v4df)__V, (M)); })
+
+#define _mm256_round_ps(V, M) __extension__ ({ \
+ __m256 __V = (V); \
+ (__m256)__builtin_ia32_roundps256((__v8sf)__V, (M)); })
+
+#define _mm256_ceil_pd(V) _mm256_round_pd((V), _MM_FROUND_CEIL)
+#define _mm256_floor_pd(V) _mm256_round_pd((V), _MM_FROUND_FLOOR)
+#define _mm256_ceil_ps(V) _mm256_round_ps((V), _MM_FROUND_CEIL)
+#define _mm256_floor_ps(V) _mm256_round_ps((V), _MM_FROUND_FLOOR)
+
+/* Logical */
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_and_pd(__m256d __a, __m256d __b)
+{
+ return (__m256d)((__v4di)__a & (__v4di)__b);
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_and_ps(__m256 __a, __m256 __b)
+{
+ return (__m256)((__v8si)__a & (__v8si)__b);
+}
+
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_andnot_pd(__m256d __a, __m256d __b)
+{
+ return (__m256d)(~(__v4di)__a & (__v4di)__b);
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_andnot_ps(__m256 __a, __m256 __b)
+{
+ return (__m256)(~(__v8si)__a & (__v8si)__b);
+}
+
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_or_pd(__m256d __a, __m256d __b)
+{
+ return (__m256d)((__v4di)__a | (__v4di)__b);
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_or_ps(__m256 __a, __m256 __b)
+{
+ return (__m256)((__v8si)__a | (__v8si)__b);
+}
+
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_xor_pd(__m256d __a, __m256d __b)
+{
+ return (__m256d)((__v4di)__a ^ (__v4di)__b);
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_xor_ps(__m256 __a, __m256 __b)
+{
+ return (__m256)((__v8si)__a ^ (__v8si)__b);
+}
+
+/* Horizontal arithmetic */
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_hadd_pd(__m256d __a, __m256d __b)
+{
+ return (__m256d)__builtin_ia32_haddpd256((__v4df)__a, (__v4df)__b);
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_hadd_ps(__m256 __a, __m256 __b)
+{
+ return (__m256)__builtin_ia32_haddps256((__v8sf)__a, (__v8sf)__b);
+}
+
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_hsub_pd(__m256d __a, __m256d __b)
+{
+ return (__m256d)__builtin_ia32_hsubpd256((__v4df)__a, (__v4df)__b);
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_hsub_ps(__m256 __a, __m256 __b)
+{
+ return (__m256)__builtin_ia32_hsubps256((__v8sf)__a, (__v8sf)__b);
+}
+
+/* Vector permutations */
+static __inline __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_permutevar_pd(__m128d __a, __m128i __c)
+{
+ return (__m128d)__builtin_ia32_vpermilvarpd((__v2df)__a, (__v2di)__c);
+}
+
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_permutevar_pd(__m256d __a, __m256i __c)
+{
+ return (__m256d)__builtin_ia32_vpermilvarpd256((__v4df)__a, (__v4di)__c);
+}
+
+static __inline __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_permutevar_ps(__m128 __a, __m128i __c)
+{
+ return (__m128)__builtin_ia32_vpermilvarps((__v4sf)__a, (__v4si)__c);
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_permutevar_ps(__m256 __a, __m256i __c)
+{
+ return (__m256)__builtin_ia32_vpermilvarps256((__v8sf)__a,
+ (__v8si)__c);
+}
+
+#define _mm_permute_pd(A, C) __extension__ ({ \
+ __m128d __A = (A); \
+ (__m128d)__builtin_shufflevector((__v2df)__A, (__v2df) _mm_setzero_pd(), \
+ (C) & 0x1, ((C) & 0x2) >> 1); })
+
+#define _mm256_permute_pd(A, C) __extension__ ({ \
+ __m256d __A = (A); \
+ (__m256d)__builtin_shufflevector((__v4df)__A, (__v4df) _mm256_setzero_pd(), \
+ (C) & 0x1, ((C) & 0x2) >> 1, \
+ 2 + (((C) & 0x4) >> 2), \
+ 2 + (((C) & 0x8) >> 3)); })
+
+#define _mm_permute_ps(A, C) __extension__ ({ \
+ __m128 __A = (A); \
+ (__m128)__builtin_shufflevector((__v4sf)__A, (__v4sf) _mm_setzero_ps(), \
+ (C) & 0x3, ((C) & 0xc) >> 2, \
+ ((C) & 0x30) >> 4, ((C) & 0xc0) >> 6); })
+
+#define _mm256_permute_ps(A, C) __extension__ ({ \
+ __m256 __A = (A); \
+ (__m256)__builtin_shufflevector((__v8sf)__A, (__v8sf) _mm256_setzero_ps(), \
+ (C) & 0x3, ((C) & 0xc) >> 2, \
+ ((C) & 0x30) >> 4, ((C) & 0xc0) >> 6, \
+ 4 + (((C) & 0x03) >> 0), \
+ 4 + (((C) & 0x0c) >> 2), \
+ 4 + (((C) & 0x30) >> 4), \
+ 4 + (((C) & 0xc0) >> 6)); })
+
+#define _mm256_permute2f128_pd(V1, V2, M) __extension__ ({ \
+ __m256d __V1 = (V1); \
+ __m256d __V2 = (V2); \
+ (__m256d)__builtin_ia32_vperm2f128_pd256((__v4df)__V1, (__v4df)__V2, (M)); })
+
+#define _mm256_permute2f128_ps(V1, V2, M) __extension__ ({ \
+ __m256 __V1 = (V1); \
+ __m256 __V2 = (V2); \
+ (__m256)__builtin_ia32_vperm2f128_ps256((__v8sf)__V1, (__v8sf)__V2, (M)); })
+
+#define _mm256_permute2f128_si256(V1, V2, M) __extension__ ({ \
+ __m256i __V1 = (V1); \
+ __m256i __V2 = (V2); \
+ (__m256i)__builtin_ia32_vperm2f128_si256((__v8si)__V1, (__v8si)__V2, (M)); })
+
+/* Vector Blend */
+#define _mm256_blend_pd(V1, V2, M) __extension__ ({ \
+ __m256d __V1 = (V1); \
+ __m256d __V2 = (V2); \
+ (__m256d)__builtin_ia32_blendpd256((__v4df)__V1, (__v4df)__V2, (M)); })
+
+#define _mm256_blend_ps(V1, V2, M) __extension__ ({ \
+ __m256 __V1 = (V1); \
+ __m256 __V2 = (V2); \
+ (__m256)__builtin_ia32_blendps256((__v8sf)__V1, (__v8sf)__V2, (M)); })
+
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_blendv_pd(__m256d __a, __m256d __b, __m256d __c)
+{
+ return (__m256d)__builtin_ia32_blendvpd256(
+ (__v4df)__a, (__v4df)__b, (__v4df)__c);
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_blendv_ps(__m256 __a, __m256 __b, __m256 __c)
+{
+ return (__m256)__builtin_ia32_blendvps256(
+ (__v8sf)__a, (__v8sf)__b, (__v8sf)__c);
+}
+
+/* Vector Dot Product */
+#define _mm256_dp_ps(V1, V2, M) __extension__ ({ \
+ __m256 __V1 = (V1); \
+ __m256 __V2 = (V2); \
+ (__m256)__builtin_ia32_dpps256((__v8sf)__V1, (__v8sf)__V2, (M)); })
+
+/* Vector shuffle */
+#define _mm256_shuffle_ps(a, b, mask) __extension__ ({ \
+ __m256 __a = (a); \
+ __m256 __b = (b); \
+ (__m256)__builtin_shufflevector((__v8sf)__a, (__v8sf)__b, \
+ (mask) & 0x3, ((mask) & 0xc) >> 2, \
+ (((mask) & 0x30) >> 4) + 8, (((mask) & 0xc0) >> 6) + 8, \
+ ((mask) & 0x3) + 4, (((mask) & 0xc) >> 2) + 4, \
+ (((mask) & 0x30) >> 4) + 12, (((mask) & 0xc0) >> 6) + 12); })
+
+#define _mm256_shuffle_pd(a, b, mask) __extension__ ({ \
+ __m256d __a = (a); \
+ __m256d __b = (b); \
+ (__m256d)__builtin_shufflevector((__v4df)__a, (__v4df)__b, \
+ (mask) & 0x1, \
+ (((mask) & 0x2) >> 1) + 4, \
+ (((mask) & 0x4) >> 2) + 2, \
+ (((mask) & 0x8) >> 3) + 6); })
+
+/* Compare */
+#define _CMP_EQ_OQ 0x00 /* Equal (ordered, non-signaling) */
+#define _CMP_LT_OS 0x01 /* Less-than (ordered, signaling) */
+#define _CMP_LE_OS 0x02 /* Less-than-or-equal (ordered, signaling) */
+#define _CMP_UNORD_Q 0x03 /* Unordered (non-signaling) */
+#define _CMP_NEQ_UQ 0x04 /* Not-equal (unordered, non-signaling) */
+#define _CMP_NLT_US 0x05 /* Not-less-than (unordered, signaling) */
+#define _CMP_NLE_US 0x06 /* Not-less-than-or-equal (unordered, signaling) */
+#define _CMP_ORD_Q 0x07 /* Ordered (nonsignaling) */
+#define _CMP_EQ_UQ 0x08 /* Equal (unordered, non-signaling) */
+#define _CMP_NGE_US 0x09 /* Not-greater-than-or-equal (unord, signaling) */
+#define _CMP_NGT_US 0x0a /* Not-greater-than (unordered, signaling) */
+#define _CMP_FALSE_OQ 0x0b /* False (ordered, non-signaling) */
+#define _CMP_NEQ_OQ 0x0c /* Not-equal (ordered, non-signaling) */
+#define _CMP_GE_OS 0x0d /* Greater-than-or-equal (ordered, signaling) */
+#define _CMP_GT_OS 0x0e /* Greater-than (ordered, signaling) */
+#define _CMP_TRUE_UQ 0x0f /* True (unordered, non-signaling) */
+#define _CMP_EQ_OS 0x10 /* Equal (ordered, signaling) */
+#define _CMP_LT_OQ 0x11 /* Less-than (ordered, non-signaling) */
+#define _CMP_LE_OQ 0x12 /* Less-than-or-equal (ordered, non-signaling) */
+#define _CMP_UNORD_S 0x13 /* Unordered (signaling) */
+#define _CMP_NEQ_US 0x14 /* Not-equal (unordered, signaling) */
+#define _CMP_NLT_UQ 0x15 /* Not-less-than (unordered, non-signaling) */
+#define _CMP_NLE_UQ 0x16 /* Not-less-than-or-equal (unord, non-signaling) */
+#define _CMP_ORD_S 0x17 /* Ordered (signaling) */
+#define _CMP_EQ_US 0x18 /* Equal (unordered, signaling) */
+#define _CMP_NGE_UQ 0x19 /* Not-greater-than-or-equal (unord, non-sign) */
+#define _CMP_NGT_UQ 0x1a /* Not-greater-than (unordered, non-signaling) */
+#define _CMP_FALSE_OS 0x1b /* False (ordered, signaling) */
+#define _CMP_NEQ_OS 0x1c /* Not-equal (ordered, signaling) */
+#define _CMP_GE_OQ 0x1d /* Greater-than-or-equal (ordered, non-signaling) */
+#define _CMP_GT_OQ 0x1e /* Greater-than (ordered, non-signaling) */
+#define _CMP_TRUE_US 0x1f /* True (unordered, signaling) */
+
+#define _mm_cmp_pd(a, b, c) __extension__ ({ \
+ __m128d __a = (a); \
+ __m128d __b = (b); \
+ (__m128d)__builtin_ia32_cmppd((__v2df)__a, (__v2df)__b, (c)); })
+
+#define _mm_cmp_ps(a, b, c) __extension__ ({ \
+ __m128 __a = (a); \
+ __m128 __b = (b); \
+ (__m128)__builtin_ia32_cmpps((__v4sf)__a, (__v4sf)__b, (c)); })
+
+#define _mm256_cmp_pd(a, b, c) __extension__ ({ \
+ __m256d __a = (a); \
+ __m256d __b = (b); \
+ (__m256d)__builtin_ia32_cmppd256((__v4df)__a, (__v4df)__b, (c)); })
+
+#define _mm256_cmp_ps(a, b, c) __extension__ ({ \
+ __m256 __a = (a); \
+ __m256 __b = (b); \
+ (__m256)__builtin_ia32_cmpps256((__v8sf)__a, (__v8sf)__b, (c)); })
+
+#define _mm_cmp_sd(a, b, c) __extension__ ({ \
+ __m128d __a = (a); \
+ __m128d __b = (b); \
+ (__m128d)__builtin_ia32_cmpsd((__v2df)__a, (__v2df)__b, (c)); })
+
+#define _mm_cmp_ss(a, b, c) __extension__ ({ \
+ __m128 __a = (a); \
+ __m128 __b = (b); \
+ (__m128)__builtin_ia32_cmpss((__v4sf)__a, (__v4sf)__b, (c)); })
+
+/* Vector extract */
+#define _mm256_extractf128_pd(A, O) __extension__ ({ \
+ __m256d __A = (A); \
+ (__m128d)__builtin_ia32_vextractf128_pd256((__v4df)__A, (O)); })
+
+#define _mm256_extractf128_ps(A, O) __extension__ ({ \
+ __m256 __A = (A); \
+ (__m128)__builtin_ia32_vextractf128_ps256((__v8sf)__A, (O)); })
+
+#define _mm256_extractf128_si256(A, O) __extension__ ({ \
+ __m256i __A = (A); \
+ (__m128i)__builtin_ia32_vextractf128_si256((__v8si)__A, (O)); })
+
+static __inline int __attribute__((__always_inline__, __nodebug__))
+_mm256_extract_epi32(__m256i __a, int const __imm)
+{
+ __v8si __b = (__v8si)__a;
+ return __b[__imm];
+}
+
+static __inline int __attribute__((__always_inline__, __nodebug__))
+_mm256_extract_epi16(__m256i __a, int const __imm)
+{
+ __v16hi __b = (__v16hi)__a;
+ return __b[__imm];
+}
+
+static __inline int __attribute__((__always_inline__, __nodebug__))
+_mm256_extract_epi8(__m256i __a, int const __imm)
+{
+ __v32qi __b = (__v32qi)__a;
+ return __b[__imm];
+}
+
+#ifdef __x86_64__
+static __inline long long __attribute__((__always_inline__, __nodebug__))
+_mm256_extract_epi64(__m256i __a, const int __imm)
+{
+ __v4di __b = (__v4di)__a;
+ return __b[__imm];
+}
+#endif
+
+/* Vector insert */
+#define _mm256_insertf128_pd(V1, V2, O) __extension__ ({ \
+ __m256d __V1 = (V1); \
+ __m128d __V2 = (V2); \
+ (__m256d)__builtin_ia32_vinsertf128_pd256((__v4df)__V1, (__v2df)__V2, (O)); })
+
+#define _mm256_insertf128_ps(V1, V2, O) __extension__ ({ \
+ __m256 __V1 = (V1); \
+ __m128 __V2 = (V2); \
+ (__m256)__builtin_ia32_vinsertf128_ps256((__v8sf)__V1, (__v4sf)__V2, (O)); })
+
+#define _mm256_insertf128_si256(V1, V2, O) __extension__ ({ \
+ __m256i __V1 = (V1); \
+ __m128i __V2 = (V2); \
+ (__m256i)__builtin_ia32_vinsertf128_si256((__v8si)__V1, (__v4si)__V2, (O)); })
+
+static __inline __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_insert_epi32(__m256i __a, int __b, int const __imm)
+{
+ __v8si __c = (__v8si)__a;
+ __c[__imm & 7] = __b;
+ return (__m256i)__c;
+}
+
+static __inline __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_insert_epi16(__m256i __a, int __b, int const __imm)
+{
+ __v16hi __c = (__v16hi)__a;
+ __c[__imm & 15] = __b;
+ return (__m256i)__c;
+}
+
+static __inline __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_insert_epi8(__m256i __a, int __b, int const __imm)
+{
+ __v32qi __c = (__v32qi)__a;
+ __c[__imm & 31] = __b;
+ return (__m256i)__c;
+}
+
+#ifdef __x86_64__
+static __inline __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_insert_epi64(__m256i __a, int __b, int const __imm)
+{
+ __v4di __c = (__v4di)__a;
+ __c[__imm & 3] = __b;
+ return (__m256i)__c;
+}
+#endif
+
+/* Conversion */
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_cvtepi32_pd(__m128i __a)
+{
+ return (__m256d)__builtin_ia32_cvtdq2pd256((__v4si) __a);
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_cvtepi32_ps(__m256i __a)
+{
+ return (__m256)__builtin_ia32_cvtdq2ps256((__v8si) __a);
+}
+
+static __inline __m128 __attribute__((__always_inline__, __nodebug__))
+_mm256_cvtpd_ps(__m256d __a)
+{
+ return (__m128)__builtin_ia32_cvtpd2ps256((__v4df) __a);
+}
+
+static __inline __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_cvtps_epi32(__m256 __a)
+{
+ return (__m256i)__builtin_ia32_cvtps2dq256((__v8sf) __a);
+}
+
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_cvtps_pd(__m128 __a)
+{
+ return (__m256d)__builtin_ia32_cvtps2pd256((__v4sf) __a);
+}
+
+static __inline __m128i __attribute__((__always_inline__, __nodebug__))
+_mm256_cvttpd_epi32(__m256d __a)
+{
+ return (__m128i)__builtin_ia32_cvttpd2dq256((__v4df) __a);
+}
+
+static __inline __m128i __attribute__((__always_inline__, __nodebug__))
+_mm256_cvtpd_epi32(__m256d __a)
+{
+ return (__m128i)__builtin_ia32_cvtpd2dq256((__v4df) __a);
+}
+
+static __inline __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_cvttps_epi32(__m256 __a)
+{
+ return (__m256i)__builtin_ia32_cvttps2dq256((__v8sf) __a);
+}
+
+/* Vector replicate */
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_movehdup_ps(__m256 __a)
+{
+ return __builtin_shufflevector(__a, __a, 1, 1, 3, 3, 5, 5, 7, 7);
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_moveldup_ps(__m256 __a)
+{
+ return __builtin_shufflevector(__a, __a, 0, 0, 2, 2, 4, 4, 6, 6);
+}
+
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_movedup_pd(__m256d __a)
+{
+ return __builtin_shufflevector(__a, __a, 0, 0, 2, 2);
+}
+
+/* Unpack and Interleave */
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_unpackhi_pd(__m256d __a, __m256d __b)
+{
+ return __builtin_shufflevector(__a, __b, 1, 5, 1+2, 5+2);
+}
+
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_unpacklo_pd(__m256d __a, __m256d __b)
+{
+ return __builtin_shufflevector(__a, __b, 0, 4, 0+2, 4+2);
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_unpackhi_ps(__m256 __a, __m256 __b)
+{
+ return __builtin_shufflevector(__a, __b, 2, 10, 2+1, 10+1, 6, 14, 6+1, 14+1);
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_unpacklo_ps(__m256 __a, __m256 __b)
+{
+ return __builtin_shufflevector(__a, __b, 0, 8, 0+1, 8+1, 4, 12, 4+1, 12+1);
+}
+
+/* Bit Test */
+static __inline int __attribute__((__always_inline__, __nodebug__))
+_mm_testz_pd(__m128d __a, __m128d __b)
+{
+ return __builtin_ia32_vtestzpd((__v2df)__a, (__v2df)__b);
+}
+
+static __inline int __attribute__((__always_inline__, __nodebug__))
+_mm_testc_pd(__m128d __a, __m128d __b)
+{
+ return __builtin_ia32_vtestcpd((__v2df)__a, (__v2df)__b);
+}
+
+static __inline int __attribute__((__always_inline__, __nodebug__))
+_mm_testnzc_pd(__m128d __a, __m128d __b)
+{
+ return __builtin_ia32_vtestnzcpd((__v2df)__a, (__v2df)__b);
+}
+
+static __inline int __attribute__((__always_inline__, __nodebug__))
+_mm_testz_ps(__m128 __a, __m128 __b)
+{
+ return __builtin_ia32_vtestzps((__v4sf)__a, (__v4sf)__b);
+}
+
+static __inline int __attribute__((__always_inline__, __nodebug__))
+_mm_testc_ps(__m128 __a, __m128 __b)
+{
+ return __builtin_ia32_vtestcps((__v4sf)__a, (__v4sf)__b);
+}
+
+static __inline int __attribute__((__always_inline__, __nodebug__))
+_mm_testnzc_ps(__m128 __a, __m128 __b)
+{
+ return __builtin_ia32_vtestnzcps((__v4sf)__a, (__v4sf)__b);
+}
+
+static __inline int __attribute__((__always_inline__, __nodebug__))
+_mm256_testz_pd(__m256d __a, __m256d __b)
+{
+ return __builtin_ia32_vtestzpd256((__v4df)__a, (__v4df)__b);
+}
+
+static __inline int __attribute__((__always_inline__, __nodebug__))
+_mm256_testc_pd(__m256d __a, __m256d __b)
+{
+ return __builtin_ia32_vtestcpd256((__v4df)__a, (__v4df)__b);
+}
+
+static __inline int __attribute__((__always_inline__, __nodebug__))
+_mm256_testnzc_pd(__m256d __a, __m256d __b)
+{
+ return __builtin_ia32_vtestnzcpd256((__v4df)__a, (__v4df)__b);
+}
+
+static __inline int __attribute__((__always_inline__, __nodebug__))
+_mm256_testz_ps(__m256 __a, __m256 __b)
+{
+ return __builtin_ia32_vtestzps256((__v8sf)__a, (__v8sf)__b);
+}
+
+static __inline int __attribute__((__always_inline__, __nodebug__))
+_mm256_testc_ps(__m256 __a, __m256 __b)
+{
+ return __builtin_ia32_vtestcps256((__v8sf)__a, (__v8sf)__b);
+}
+
+static __inline int __attribute__((__always_inline__, __nodebug__))
+_mm256_testnzc_ps(__m256 __a, __m256 __b)
+{
+ return __builtin_ia32_vtestnzcps256((__v8sf)__a, (__v8sf)__b);
+}
+
+static __inline int __attribute__((__always_inline__, __nodebug__))
+_mm256_testz_si256(__m256i __a, __m256i __b)
+{
+ return __builtin_ia32_ptestz256((__v4di)__a, (__v4di)__b);
+}
+
+static __inline int __attribute__((__always_inline__, __nodebug__))
+_mm256_testc_si256(__m256i __a, __m256i __b)
+{
+ return __builtin_ia32_ptestc256((__v4di)__a, (__v4di)__b);
+}
+
+static __inline int __attribute__((__always_inline__, __nodebug__))
+_mm256_testnzc_si256(__m256i __a, __m256i __b)
+{
+ return __builtin_ia32_ptestnzc256((__v4di)__a, (__v4di)__b);
+}
+
+/* Vector extract sign mask */
+static __inline int __attribute__((__always_inline__, __nodebug__))
+_mm256_movemask_pd(__m256d __a)
+{
+ return __builtin_ia32_movmskpd256((__v4df)__a);
+}
+
+static __inline int __attribute__((__always_inline__, __nodebug__))
+_mm256_movemask_ps(__m256 __a)
+{
+ return __builtin_ia32_movmskps256((__v8sf)__a);
+}
+
+/* Vector __zero */
+static __inline void __attribute__((__always_inline__, __nodebug__))
+_mm256_zeroall(void)
+{
+ __builtin_ia32_vzeroall();
+}
+
+static __inline void __attribute__((__always_inline__, __nodebug__))
+_mm256_zeroupper(void)
+{
+ __builtin_ia32_vzeroupper();
+}
+
+/* Vector load with broadcast */
+static __inline __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_broadcast_ss(float const *__a)
+{
+ return (__m128)__builtin_ia32_vbroadcastss(__a);
+}
+
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_broadcast_sd(double const *__a)
+{
+ return (__m256d)__builtin_ia32_vbroadcastsd256(__a);
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_broadcast_ss(float const *__a)
+{
+ return (__m256)__builtin_ia32_vbroadcastss256(__a);
+}
+
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_broadcast_pd(__m128d const *__a)
+{
+ return (__m256d)__builtin_ia32_vbroadcastf128_pd256(__a);
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_broadcast_ps(__m128 const *__a)
+{
+ return (__m256)__builtin_ia32_vbroadcastf128_ps256(__a);
+}
+
+/* SIMD load ops */
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_load_pd(double const *__p)
+{
+ return *(__m256d *)__p;
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_load_ps(float const *__p)
+{
+ return *(__m256 *)__p;
+}
+
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_loadu_pd(double const *__p)
+{
+ struct __loadu_pd {
+ __m256d __v;
+ } __attribute__((packed, may_alias));
+ return ((struct __loadu_pd*)__p)->__v;
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_loadu_ps(float const *__p)
+{
+ struct __loadu_ps {
+ __m256 __v;
+ } __attribute__((packed, may_alias));
+ return ((struct __loadu_ps*)__p)->__v;
+}
+
+static __inline __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_load_si256(__m256i const *__p)
+{
+ return *__p;
+}
+
+static __inline __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_loadu_si256(__m256i const *__p)
+{
+ struct __loadu_si256 {
+ __m256i __v;
+ } __attribute__((packed, may_alias));
+ return ((struct __loadu_si256*)__p)->__v;
+}
+
+static __inline __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_lddqu_si256(__m256i const *__p)
+{
+ return (__m256i)__builtin_ia32_lddqu256((char const *)__p);
+}
+
+/* SIMD store ops */
+static __inline void __attribute__((__always_inline__, __nodebug__))
+_mm256_store_pd(double *__p, __m256d __a)
+{
+ *(__m256d *)__p = __a;
+}
+
+static __inline void __attribute__((__always_inline__, __nodebug__))
+_mm256_store_ps(float *__p, __m256 __a)
+{
+ *(__m256 *)__p = __a;
+}
+
+static __inline void __attribute__((__always_inline__, __nodebug__))
+_mm256_storeu_pd(double *__p, __m256d __a)
+{
+ __builtin_ia32_storeupd256(__p, (__v4df)__a);
+}
+
+static __inline void __attribute__((__always_inline__, __nodebug__))
+_mm256_storeu_ps(float *__p, __m256 __a)
+{
+ __builtin_ia32_storeups256(__p, (__v8sf)__a);
+}
+
+static __inline void __attribute__((__always_inline__, __nodebug__))
+_mm256_store_si256(__m256i *__p, __m256i __a)
+{
+ *__p = __a;
+}
+
+static __inline void __attribute__((__always_inline__, __nodebug__))
+_mm256_storeu_si256(__m256i *__p, __m256i __a)
+{
+ __builtin_ia32_storedqu256((char *)__p, (__v32qi)__a);
+}
+
+/* Conditional load ops */
+static __inline __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_maskload_pd(double const *__p, __m128d __m)
+{
+ return (__m128d)__builtin_ia32_maskloadpd((const __v2df *)__p, (__v2df)__m);
+}
+
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_maskload_pd(double const *__p, __m256d __m)
+{
+ return (__m256d)__builtin_ia32_maskloadpd256((const __v4df *)__p,
+ (__v4df)__m);
+}
+
+static __inline __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_maskload_ps(float const *__p, __m128 __m)
+{
+ return (__m128)__builtin_ia32_maskloadps((const __v4sf *)__p, (__v4sf)__m);
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_maskload_ps(float const *__p, __m256 __m)
+{
+ return (__m256)__builtin_ia32_maskloadps256((const __v8sf *)__p, (__v8sf)__m);
+}
+
+/* Conditional store ops */
+static __inline void __attribute__((__always_inline__, __nodebug__))
+_mm256_maskstore_ps(float *__p, __m256 __m, __m256 __a)
+{
+ __builtin_ia32_maskstoreps256((__v8sf *)__p, (__v8sf)__m, (__v8sf)__a);
+}
+
+static __inline void __attribute__((__always_inline__, __nodebug__))
+_mm_maskstore_pd(double *__p, __m128d __m, __m128d __a)
+{
+ __builtin_ia32_maskstorepd((__v2df *)__p, (__v2df)__m, (__v2df)__a);
+}
+
+static __inline void __attribute__((__always_inline__, __nodebug__))
+_mm256_maskstore_pd(double *__p, __m256d __m, __m256d __a)
+{
+ __builtin_ia32_maskstorepd256((__v4df *)__p, (__v4df)__m, (__v4df)__a);
+}
+
+static __inline void __attribute__((__always_inline__, __nodebug__))
+_mm_maskstore_ps(float *__p, __m128 __m, __m128 __a)
+{
+ __builtin_ia32_maskstoreps((__v4sf *)__p, (__v4sf)__m, (__v4sf)__a);
+}
+
+/* Cacheability support ops */
+static __inline void __attribute__((__always_inline__, __nodebug__))
+_mm256_stream_si256(__m256i *__a, __m256i __b)
+{
+ __builtin_ia32_movntdq256((__v4di *)__a, (__v4di)__b);
+}
+
+static __inline void __attribute__((__always_inline__, __nodebug__))
+_mm256_stream_pd(double *__a, __m256d __b)
+{
+ __builtin_ia32_movntpd256(__a, (__v4df)__b);
+}
+
+static __inline void __attribute__((__always_inline__, __nodebug__))
+_mm256_stream_ps(float *__p, __m256 __a)
+{
+ __builtin_ia32_movntps256(__p, (__v8sf)__a);
+}
+
+/* Create vectors */
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_set_pd(double __a, double __b, double __c, double __d)
+{
+ return (__m256d){ __d, __c, __b, __a };
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_set_ps(float __a, float __b, float __c, float __d,
+ float __e, float __f, float __g, float __h)
+{
+ return (__m256){ __h, __g, __f, __e, __d, __c, __b, __a };
+}
+
+static __inline __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_set_epi32(int __i0, int __i1, int __i2, int __i3,
+ int __i4, int __i5, int __i6, int __i7)
+{
+ return (__m256i)(__v8si){ __i7, __i6, __i5, __i4, __i3, __i2, __i1, __i0 };
+}
+
+static __inline __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_set_epi16(short __w15, short __w14, short __w13, short __w12,
+ short __w11, short __w10, short __w09, short __w08,
+ short __w07, short __w06, short __w05, short __w04,
+ short __w03, short __w02, short __w01, short __w00)
+{
+ return (__m256i)(__v16hi){ __w00, __w01, __w02, __w03, __w04, __w05, __w06,
+ __w07, __w08, __w09, __w10, __w11, __w12, __w13, __w14, __w15 };
+}
+
+static __inline __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_set_epi8(char __b31, char __b30, char __b29, char __b28,
+ char __b27, char __b26, char __b25, char __b24,
+ char __b23, char __b22, char __b21, char __b20,
+ char __b19, char __b18, char __b17, char __b16,
+ char __b15, char __b14, char __b13, char __b12,
+ char __b11, char __b10, char __b09, char __b08,
+ char __b07, char __b06, char __b05, char __b04,
+ char __b03, char __b02, char __b01, char __b00)
+{
+ return (__m256i)(__v32qi){
+ __b00, __b01, __b02, __b03, __b04, __b05, __b06, __b07,
+ __b08, __b09, __b10, __b11, __b12, __b13, __b14, __b15,
+ __b16, __b17, __b18, __b19, __b20, __b21, __b22, __b23,
+ __b24, __b25, __b26, __b27, __b28, __b29, __b30, __b31
+ };
+}
+
+static __inline __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_set_epi64x(long long __a, long long __b, long long __c, long long __d)
+{
+ return (__m256i)(__v4di){ __d, __c, __b, __a };
+}
+
+/* Create vectors with elements in reverse order */
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_setr_pd(double __a, double __b, double __c, double __d)
+{
+ return (__m256d){ __a, __b, __c, __d };
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_setr_ps(float __a, float __b, float __c, float __d,
+ float __e, float __f, float __g, float __h)
+{
+ return (__m256){ __a, __b, __c, __d, __e, __f, __g, __h };
+}
+
+static __inline __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_setr_epi32(int __i0, int __i1, int __i2, int __i3,
+ int __i4, int __i5, int __i6, int __i7)
+{
+ return (__m256i)(__v8si){ __i0, __i1, __i2, __i3, __i4, __i5, __i6, __i7 };
+}
+
+static __inline __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_setr_epi16(short __w15, short __w14, short __w13, short __w12,
+ short __w11, short __w10, short __w09, short __w08,
+ short __w07, short __w06, short __w05, short __w04,
+ short __w03, short __w02, short __w01, short __w00)
+{
+ return (__m256i)(__v16hi){ __w15, __w14, __w13, __w12, __w11, __w10, __w09,
+ __w08, __w07, __w06, __w05, __w04, __w03, __w02, __w01, __w00 };
+}
+
+static __inline __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_setr_epi8(char __b31, char __b30, char __b29, char __b28,
+ char __b27, char __b26, char __b25, char __b24,
+ char __b23, char __b22, char __b21, char __b20,
+ char __b19, char __b18, char __b17, char __b16,
+ char __b15, char __b14, char __b13, char __b12,
+ char __b11, char __b10, char __b09, char __b08,
+ char __b07, char __b06, char __b05, char __b04,
+ char __b03, char __b02, char __b01, char __b00)
+{
+ return (__m256i)(__v32qi){
+ __b31, __b30, __b29, __b28, __b27, __b26, __b25, __b24,
+ __b23, __b22, __b21, __b20, __b19, __b18, __b17, __b16,
+ __b15, __b14, __b13, __b12, __b11, __b10, __b09, __b08,
+ __b07, __b06, __b05, __b04, __b03, __b02, __b01, __b00 };
+}
+
+static __inline __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_setr_epi64x(long long __a, long long __b, long long __c, long long __d)
+{
+ return (__m256i)(__v4di){ __a, __b, __c, __d };
+}
+
+/* Create vectors with repeated elements */
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_set1_pd(double __w)
+{
+ return (__m256d){ __w, __w, __w, __w };
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_set1_ps(float __w)
+{
+ return (__m256){ __w, __w, __w, __w, __w, __w, __w, __w };
+}
+
+static __inline __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_set1_epi32(int __i)
+{
+ return (__m256i)(__v8si){ __i, __i, __i, __i, __i, __i, __i, __i };
+}
+
+static __inline __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_set1_epi16(short __w)
+{
+ return (__m256i)(__v16hi){ __w, __w, __w, __w, __w, __w, __w, __w, __w, __w,
+ __w, __w, __w, __w, __w, __w };
+}
+
+static __inline __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_set1_epi8(char __b)
+{
+ return (__m256i)(__v32qi){ __b, __b, __b, __b, __b, __b, __b, __b, __b, __b,
+ __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b,
+ __b, __b, __b, __b, __b, __b, __b };
+}
+
+static __inline __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_set1_epi64x(long long __q)
+{
+ return (__m256i)(__v4di){ __q, __q, __q, __q };
+}
+
+/* Create __zeroed vectors */
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_setzero_pd(void)
+{
+ return (__m256d){ 0, 0, 0, 0 };
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_setzero_ps(void)
+{
+ return (__m256){ 0, 0, 0, 0, 0, 0, 0, 0 };
+}
+
+static __inline __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_setzero_si256(void)
+{
+ return (__m256i){ 0LL, 0LL, 0LL, 0LL };
+}
+
+/* Cast between vector types */
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_castpd_ps(__m256d __a)
+{
+ return (__m256)__a;
+}
+
+static __inline __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_castpd_si256(__m256d __a)
+{
+ return (__m256i)__a;
+}
+
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_castps_pd(__m256 __a)
+{
+ return (__m256d)__a;
+}
+
+static __inline __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_castps_si256(__m256 __a)
+{
+ return (__m256i)__a;
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_castsi256_ps(__m256i __a)
+{
+ return (__m256)__a;
+}
+
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_castsi256_pd(__m256i __a)
+{
+ return (__m256d)__a;
+}
+
+static __inline __m128d __attribute__((__always_inline__, __nodebug__))
+_mm256_castpd256_pd128(__m256d __a)
+{
+ return __builtin_shufflevector(__a, __a, 0, 1);
+}
+
+static __inline __m128 __attribute__((__always_inline__, __nodebug__))
+_mm256_castps256_ps128(__m256 __a)
+{
+ return __builtin_shufflevector(__a, __a, 0, 1, 2, 3);
+}
+
+static __inline __m128i __attribute__((__always_inline__, __nodebug__))
+_mm256_castsi256_si128(__m256i __a)
+{
+ return __builtin_shufflevector(__a, __a, 0, 1);
+}
+
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_castpd128_pd256(__m128d __a)
+{
+ return __builtin_shufflevector(__a, __a, 0, 1, -1, -1);
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_castps128_ps256(__m128 __a)
+{
+ return __builtin_shufflevector(__a, __a, 0, 1, 2, 3, -1, -1, -1, -1);
+}
+
+static __inline __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_castsi128_si256(__m128i __a)
+{
+ return __builtin_shufflevector(__a, __a, 0, 1, -1, -1);
+}
+
+/* SIMD load ops (unaligned) */
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_loadu2_m128(float const *__addr_hi, float const *__addr_lo)
+{
+ struct __loadu_ps {
+ __m128 __v;
+ } __attribute__((__packed__, __may_alias__));
+
+ __m256 __v256 = _mm256_castps128_ps256(((struct __loadu_ps*)__addr_lo)->__v);
+ return _mm256_insertf128_ps(__v256, ((struct __loadu_ps*)__addr_hi)->__v, 1);
+}
+
+static __inline __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_loadu2_m128d(double const *__addr_hi, double const *__addr_lo)
+{
+ struct __loadu_pd {
+ __m128d __v;
+ } __attribute__((__packed__, __may_alias__));
+
+ __m256d __v256 = _mm256_castpd128_pd256(((struct __loadu_pd*)__addr_lo)->__v);
+ return _mm256_insertf128_pd(__v256, ((struct __loadu_pd*)__addr_hi)->__v, 1);
+}
+
+static __inline __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_loadu2_m128i(__m128i const *__addr_hi, __m128i const *__addr_lo)
+{
+ struct __loadu_si128 {
+ __m128i __v;
+ } __attribute__((packed, may_alias));
+ __m256i __v256 = _mm256_castsi128_si256(
+ ((struct __loadu_si128*)__addr_lo)->__v);
+ return _mm256_insertf128_si256(__v256,
+ ((struct __loadu_si128*)__addr_hi)->__v, 1);
+}
+
+/* SIMD store ops (unaligned) */
+static __inline void __attribute__((__always_inline__, __nodebug__))
+_mm256_storeu2_m128(float *__addr_hi, float *__addr_lo, __m256 __a)
+{
+ __m128 __v128;
+
+ __v128 = _mm256_castps256_ps128(__a);
+ __builtin_ia32_storeups(__addr_lo, __v128);
+ __v128 = _mm256_extractf128_ps(__a, 1);
+ __builtin_ia32_storeups(__addr_hi, __v128);
+}
+
+static __inline void __attribute__((__always_inline__, __nodebug__))
+_mm256_storeu2_m128d(double *__addr_hi, double *__addr_lo, __m256d __a)
+{
+ __m128d __v128;
+
+ __v128 = _mm256_castpd256_pd128(__a);
+ __builtin_ia32_storeupd(__addr_lo, __v128);
+ __v128 = _mm256_extractf128_pd(__a, 1);
+ __builtin_ia32_storeupd(__addr_hi, __v128);
+}
+
+static __inline void __attribute__((__always_inline__, __nodebug__))
+_mm256_storeu2_m128i(__m128i *__addr_hi, __m128i *__addr_lo, __m256i __a)
+{
+ __m128i __v128;
+
+ __v128 = _mm256_castsi256_si128(__a);
+ __builtin_ia32_storedqu((char *)__addr_lo, (__v16qi)__v128);
+ __v128 = _mm256_extractf128_si256(__a, 1);
+ __builtin_ia32_storedqu((char *)__addr_hi, (__v16qi)__v128);
+}
+
+#endif /* __AVXINTRIN_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/bmi2intrin.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/bmi2intrin.h
new file mode 100644
index 0000000..a05cfad
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/bmi2intrin.h
@@ -0,0 +1,94 @@
+/*===---- bmi2intrin.h - BMI2 intrinsics -----------------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#if !defined __X86INTRIN_H && !defined __IMMINTRIN_H
+#error "Never use <bmi2intrin.h> directly; include <x86intrin.h> instead."
+#endif
+
+#ifndef __BMI2__
+# error "BMI2 instruction set not enabled"
+#endif /* __BMI2__ */
+
+#ifndef __BMI2INTRIN_H
+#define __BMI2INTRIN_H
+
+static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))
+_bzhi_u32(unsigned int __X, unsigned int __Y)
+{
+ return __builtin_ia32_bzhi_si(__X, __Y);
+}
+
+static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))
+_pdep_u32(unsigned int __X, unsigned int __Y)
+{
+ return __builtin_ia32_pdep_si(__X, __Y);
+}
+
+static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))
+_pext_u32(unsigned int __X, unsigned int __Y)
+{
+ return __builtin_ia32_pext_si(__X, __Y);
+}
+
+#ifdef __x86_64__
+
+static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__))
+_bzhi_u64(unsigned long long __X, unsigned long long __Y)
+{
+ return __builtin_ia32_bzhi_di(__X, __Y);
+}
+
+static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__))
+_pdep_u64(unsigned long long __X, unsigned long long __Y)
+{
+ return __builtin_ia32_pdep_di(__X, __Y);
+}
+
+static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__))
+_pext_u64(unsigned long long __X, unsigned long long __Y)
+{
+ return __builtin_ia32_pext_di(__X, __Y);
+}
+
+static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__))
+_mulx_u64 (unsigned long long __X, unsigned long long __Y,
+ unsigned long long *__P)
+{
+ unsigned __int128 __res = (unsigned __int128) __X * __Y;
+ *__P = (unsigned long long) (__res >> 64);
+ return (unsigned long long) __res;
+}
+
+#else /* !__x86_64__ */
+
+static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))
+_mulx_u32 (unsigned int __X, unsigned int __Y, unsigned int *__P)
+{
+ unsigned long long __res = (unsigned long long) __X * __Y;
+ *__P = (unsigned int) (__res >> 32);
+ return (unsigned int) __res;
+}
+
+#endif /* !__x86_64__ */
+
+#endif /* __BMI2INTRIN_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/bmiintrin.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/bmiintrin.h
new file mode 100644
index 0000000..8cb00f5
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/bmiintrin.h
@@ -0,0 +1,115 @@
+/*===---- bmiintrin.h - BMI intrinsics -------------------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#if !defined __X86INTRIN_H && !defined __IMMINTRIN_H
+#error "Never use <bmiintrin.h> directly; include <x86intrin.h> instead."
+#endif
+
+#ifndef __BMI__
+# error "BMI instruction set not enabled"
+#endif /* __BMI__ */
+
+#ifndef __BMIINTRIN_H
+#define __BMIINTRIN_H
+
+static __inline__ unsigned short __attribute__((__always_inline__, __nodebug__))
+__tzcnt_u16(unsigned short __X)
+{
+ return __builtin_ctzs(__X);
+}
+
+static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))
+__andn_u32(unsigned int __X, unsigned int __Y)
+{
+ return ~__X & __Y;
+}
+
+static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))
+__bextr_u32(unsigned int __X, unsigned int __Y)
+{
+ return __builtin_ia32_bextr_u32(__X, __Y);
+}
+
+static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))
+__blsi_u32(unsigned int __X)
+{
+ return __X & -__X;
+}
+
+static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))
+__blsmsk_u32(unsigned int __X)
+{
+ return __X ^ (__X - 1);
+}
+
+static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))
+__blsr_u32(unsigned int __X)
+{
+ return __X & (__X - 1);
+}
+
+static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))
+__tzcnt_u32(unsigned int __X)
+{
+ return __builtin_ctz(__X);
+}
+
+#ifdef __x86_64__
+static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__))
+__andn_u64 (unsigned long long __X, unsigned long long __Y)
+{
+ return ~__X & __Y;
+}
+
+static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__))
+__bextr_u64(unsigned long long __X, unsigned long long __Y)
+{
+ return __builtin_ia32_bextr_u64(__X, __Y);
+}
+
+static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__))
+__blsi_u64(unsigned long long __X)
+{
+ return __X & -__X;
+}
+
+static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__))
+__blsmsk_u64(unsigned long long __X)
+{
+ return __X ^ (__X - 1);
+}
+
+static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__))
+__blsr_u64(unsigned long long __X)
+{
+ return __X & (__X - 1);
+}
+
+static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__))
+__tzcnt_u64(unsigned long long __X)
+{
+ return __builtin_ctzll(__X);
+}
+#endif
+
+#endif /* __BMIINTRIN_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/cpuid.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/cpuid.h
new file mode 100644
index 0000000..8f12cae
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/cpuid.h
@@ -0,0 +1,156 @@
+/*===---- cpuid.h - X86 cpu model detection --------------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#if !(__x86_64__ || __i386__)
+#error this header is for x86 only
+#endif
+
+/* Features in %ecx for level 1 */
+#define bit_SSE3 0x00000001
+#define bit_PCLMULQDQ 0x00000002
+#define bit_DTES64 0x00000004
+#define bit_MONITOR 0x00000008
+#define bit_DSCPL 0x00000010
+#define bit_VMX 0x00000020
+#define bit_SMX 0x00000040
+#define bit_EIST 0x00000080
+#define bit_TM2 0x00000100
+#define bit_SSSE3 0x00000200
+#define bit_CNXTID 0x00000400
+#define bit_FMA 0x00001000
+#define bit_CMPXCHG16B 0x00002000
+#define bit_xTPR 0x00004000
+#define bit_PDCM 0x00008000
+#define bit_PCID 0x00020000
+#define bit_DCA 0x00040000
+#define bit_SSE41 0x00080000
+#define bit_SSE42 0x00100000
+#define bit_x2APIC 0x00200000
+#define bit_MOVBE 0x00400000
+#define bit_POPCNT 0x00800000
+#define bit_TSCDeadline 0x01000000
+#define bit_AESNI 0x02000000
+#define bit_XSAVE 0x04000000
+#define bit_OSXSAVE 0x08000000
+#define bit_AVX 0x10000000
+#define bit_RDRAND 0x40000000
+
+/* Features in %edx for level 1 */
+#define bit_FPU 0x00000001
+#define bit_VME 0x00000002
+#define bit_DE 0x00000004
+#define bit_PSE 0x00000008
+#define bit_TSC 0x00000010
+#define bit_MSR 0x00000020
+#define bit_PAE 0x00000040
+#define bit_MCE 0x00000080
+#define bit_CX8 0x00000100
+#define bit_APIC 0x00000200
+#define bit_SEP 0x00000800
+#define bit_MTRR 0x00001000
+#define bit_PGE 0x00002000
+#define bit_MCA 0x00004000
+#define bit_CMOV 0x00008000
+#define bit_PAT 0x00010000
+#define bit_PSE36 0x00020000
+#define bit_PSN 0x00040000
+#define bit_CLFSH 0x00080000
+#define bit_DS 0x00200000
+#define bit_ACPI 0x00400000
+#define bit_MMX 0x00800000
+#define bit_FXSR 0x01000000
+#define bit_SSE 0x02000000
+#define bit_SSE2 0x04000000
+#define bit_SS 0x08000000
+#define bit_HTT 0x10000000
+#define bit_TM 0x20000000
+#define bit_PBE 0x80000000
+
+/* Features in %ebx for level 7 sub-leaf 0 */
+#define bit_FSGSBASE 0x00000001
+#define bit_SMEP 0x00000080
+#define bit_ENH_MOVSB 0x00000200
+
+/* PIC on i386 uses %ebx, so preserve it. */
+#if __i386__
+#define __cpuid(__level, __eax, __ebx, __ecx, __edx) \
+ __asm(" pushl %%ebx\n" \
+ " cpuid\n" \
+ " mov %%ebx,%1\n" \
+ " popl %%ebx" \
+ : "=a"(__eax), "=r" (__ebx), "=c"(__ecx), "=d"(__edx) \
+ : "0"(__level))
+
+#define __cpuid_count(__level, __count, __eax, __ebx, __ecx, __edx) \
+ __asm(" pushl %%ebx\n" \
+ " cpuid\n" \
+ " mov %%ebx,%1\n" \
+ " popl %%ebx" \
+ : "=a"(__eax), "=r" (__ebx), "=c"(__ecx), "=d"(__edx) \
+ : "0"(__level), "2"(__count))
+#else
+#define __cpuid(__level, __eax, __ebx, __ecx, __edx) \
+ __asm("cpuid" : "=a"(__eax), "=b" (__ebx), "=c"(__ecx), "=d"(__edx) \
+ : "0"(__level))
+
+#define __cpuid_count(__level, __count, __eax, __ebx, __ecx, __edx) \
+ __asm("cpuid" : "=a"(__eax), "=b" (__ebx), "=c"(__ecx), "=d"(__edx) \
+ : "0"(__level), "2"(__count))
+#endif
+
+static __inline int __get_cpuid (unsigned int __level, unsigned int *__eax,
+ unsigned int *__ebx, unsigned int *__ecx,
+ unsigned int *__edx) {
+ __cpuid(__level, *__eax, *__ebx, *__ecx, *__edx);
+ return 1;
+}
+
+static __inline int __get_cpuid_max (unsigned int __level, unsigned int *__sig)
+{
+ unsigned int __eax, __ebx, __ecx, __edx;
+#if __i386__
+ int __cpuid_supported;
+
+ __asm(" pushfl\n"
+ " popl %%eax\n"
+ " movl %%eax,%%ecx\n"
+ " xorl $0x00200000,%%eax\n"
+ " pushl %%eax\n"
+ " popfl\n"
+ " pushfl\n"
+ " popl %%eax\n"
+ " movl $0,%0\n"
+ " cmpl %%eax,%%ecx\n"
+ " je 1f\n"
+ " movl $1,%0\n"
+ "1:"
+ : "=r" (__cpuid_supported) : : "eax", "ecx");
+ if (!__cpuid_supported)
+ return 0;
+#endif
+
+ __cpuid(__level, __eax, __ebx, __ecx, __edx);
+ if (__sig)
+ *__sig = __ebx;
+ return __eax;
+}
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/emmintrin.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/emmintrin.h
new file mode 100644
index 0000000..f965dce
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/emmintrin.h
@@ -0,0 +1,1431 @@
+/*===---- emmintrin.h - SSE2 intrinsics ------------------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef __EMMINTRIN_H
+#define __EMMINTRIN_H
+
+#ifndef __SSE2__
+#error "SSE2 instruction set not enabled"
+#else
+
+#include <xmmintrin.h>
+
+typedef double __m128d __attribute__((__vector_size__(16)));
+typedef long long __m128i __attribute__((__vector_size__(16)));
+
+/* Type defines. */
+typedef double __v2df __attribute__ ((__vector_size__ (16)));
+typedef long long __v2di __attribute__ ((__vector_size__ (16)));
+typedef short __v8hi __attribute__((__vector_size__(16)));
+typedef char __v16qi __attribute__((__vector_size__(16)));
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_add_sd(__m128d __a, __m128d __b)
+{
+ __a[0] += __b[0];
+ return __a;
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_add_pd(__m128d __a, __m128d __b)
+{
+ return __a + __b;
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_sub_sd(__m128d __a, __m128d __b)
+{
+ __a[0] -= __b[0];
+ return __a;
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_sub_pd(__m128d __a, __m128d __b)
+{
+ return __a - __b;
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_mul_sd(__m128d __a, __m128d __b)
+{
+ __a[0] *= __b[0];
+ return __a;
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_mul_pd(__m128d __a, __m128d __b)
+{
+ return __a * __b;
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_div_sd(__m128d __a, __m128d __b)
+{
+ __a[0] /= __b[0];
+ return __a;
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_div_pd(__m128d __a, __m128d __b)
+{
+ return __a / __b;
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_sqrt_sd(__m128d __a, __m128d __b)
+{
+ __m128d __c = __builtin_ia32_sqrtsd(__b);
+ return (__m128d) { __c[0], __a[1] };
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_sqrt_pd(__m128d __a)
+{
+ return __builtin_ia32_sqrtpd(__a);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_min_sd(__m128d __a, __m128d __b)
+{
+ return __builtin_ia32_minsd(__a, __b);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_min_pd(__m128d __a, __m128d __b)
+{
+ return __builtin_ia32_minpd(__a, __b);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_max_sd(__m128d __a, __m128d __b)
+{
+ return __builtin_ia32_maxsd(__a, __b);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_max_pd(__m128d __a, __m128d __b)
+{
+ return __builtin_ia32_maxpd(__a, __b);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_and_pd(__m128d __a, __m128d __b)
+{
+ return (__m128d)((__v4si)__a & (__v4si)__b);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_andnot_pd(__m128d __a, __m128d __b)
+{
+ return (__m128d)(~(__v4si)__a & (__v4si)__b);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_or_pd(__m128d __a, __m128d __b)
+{
+ return (__m128d)((__v4si)__a | (__v4si)__b);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_xor_pd(__m128d __a, __m128d __b)
+{
+ return (__m128d)((__v4si)__a ^ (__v4si)__b);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cmpeq_pd(__m128d __a, __m128d __b)
+{
+ return (__m128d)__builtin_ia32_cmppd(__a, __b, 0);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cmplt_pd(__m128d __a, __m128d __b)
+{
+ return (__m128d)__builtin_ia32_cmppd(__a, __b, 1);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cmple_pd(__m128d __a, __m128d __b)
+{
+ return (__m128d)__builtin_ia32_cmppd(__a, __b, 2);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cmpgt_pd(__m128d __a, __m128d __b)
+{
+ return (__m128d)__builtin_ia32_cmppd(__b, __a, 1);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cmpge_pd(__m128d __a, __m128d __b)
+{
+ return (__m128d)__builtin_ia32_cmppd(__b, __a, 2);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cmpord_pd(__m128d __a, __m128d __b)
+{
+ return (__m128d)__builtin_ia32_cmppd(__a, __b, 7);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cmpunord_pd(__m128d __a, __m128d __b)
+{
+ return (__m128d)__builtin_ia32_cmppd(__a, __b, 3);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cmpneq_pd(__m128d __a, __m128d __b)
+{
+ return (__m128d)__builtin_ia32_cmppd(__a, __b, 4);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cmpnlt_pd(__m128d __a, __m128d __b)
+{
+ return (__m128d)__builtin_ia32_cmppd(__a, __b, 5);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cmpnle_pd(__m128d __a, __m128d __b)
+{
+ return (__m128d)__builtin_ia32_cmppd(__a, __b, 6);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cmpngt_pd(__m128d __a, __m128d __b)
+{
+ return (__m128d)__builtin_ia32_cmppd(__b, __a, 5);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cmpnge_pd(__m128d __a, __m128d __b)
+{
+ return (__m128d)__builtin_ia32_cmppd(__b, __a, 6);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cmpeq_sd(__m128d __a, __m128d __b)
+{
+ return (__m128d)__builtin_ia32_cmpsd(__a, __b, 0);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cmplt_sd(__m128d __a, __m128d __b)
+{
+ return (__m128d)__builtin_ia32_cmpsd(__a, __b, 1);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cmple_sd(__m128d __a, __m128d __b)
+{
+ return (__m128d)__builtin_ia32_cmpsd(__a, __b, 2);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cmpgt_sd(__m128d __a, __m128d __b)
+{
+ __m128d __c = __builtin_ia32_cmpsd(__b, __a, 1);
+ return (__m128d) { __c[0], __a[1] };
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cmpge_sd(__m128d __a, __m128d __b)
+{
+ __m128d __c = __builtin_ia32_cmpsd(__b, __a, 2);
+ return (__m128d) { __c[0], __a[1] };
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cmpord_sd(__m128d __a, __m128d __b)
+{
+ return (__m128d)__builtin_ia32_cmpsd(__a, __b, 7);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cmpunord_sd(__m128d __a, __m128d __b)
+{
+ return (__m128d)__builtin_ia32_cmpsd(__a, __b, 3);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cmpneq_sd(__m128d __a, __m128d __b)
+{
+ return (__m128d)__builtin_ia32_cmpsd(__a, __b, 4);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cmpnlt_sd(__m128d __a, __m128d __b)
+{
+ return (__m128d)__builtin_ia32_cmpsd(__a, __b, 5);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cmpnle_sd(__m128d __a, __m128d __b)
+{
+ return (__m128d)__builtin_ia32_cmpsd(__a, __b, 6);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cmpngt_sd(__m128d __a, __m128d __b)
+{
+ __m128d __c = __builtin_ia32_cmpsd(__b, __a, 5);
+ return (__m128d) { __c[0], __a[1] };
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cmpnge_sd(__m128d __a, __m128d __b)
+{
+ __m128d __c = __builtin_ia32_cmpsd(__b, __a, 6);
+ return (__m128d) { __c[0], __a[1] };
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_comieq_sd(__m128d __a, __m128d __b)
+{
+ return __builtin_ia32_comisdeq(__a, __b);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_comilt_sd(__m128d __a, __m128d __b)
+{
+ return __builtin_ia32_comisdlt(__a, __b);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_comile_sd(__m128d __a, __m128d __b)
+{
+ return __builtin_ia32_comisdle(__a, __b);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_comigt_sd(__m128d __a, __m128d __b)
+{
+ return __builtin_ia32_comisdgt(__a, __b);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_comige_sd(__m128d __a, __m128d __b)
+{
+ return __builtin_ia32_comisdge(__a, __b);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_comineq_sd(__m128d __a, __m128d __b)
+{
+ return __builtin_ia32_comisdneq(__a, __b);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_ucomieq_sd(__m128d __a, __m128d __b)
+{
+ return __builtin_ia32_ucomisdeq(__a, __b);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_ucomilt_sd(__m128d __a, __m128d __b)
+{
+ return __builtin_ia32_ucomisdlt(__a, __b);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_ucomile_sd(__m128d __a, __m128d __b)
+{
+ return __builtin_ia32_ucomisdle(__a, __b);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_ucomigt_sd(__m128d __a, __m128d __b)
+{
+ return __builtin_ia32_ucomisdgt(__a, __b);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_ucomige_sd(__m128d __a, __m128d __b)
+{
+ return __builtin_ia32_ucomisdge(__a, __b);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_ucomineq_sd(__m128d __a, __m128d __b)
+{
+ return __builtin_ia32_ucomisdneq(__a, __b);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cvtpd_ps(__m128d __a)
+{
+ return __builtin_ia32_cvtpd2ps(__a);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cvtps_pd(__m128 __a)
+{
+ return __builtin_ia32_cvtps2pd(__a);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cvtepi32_pd(__m128i __a)
+{
+ return __builtin_ia32_cvtdq2pd((__v4si)__a);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cvtpd_epi32(__m128d __a)
+{
+ return __builtin_ia32_cvtpd2dq(__a);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_cvtsd_si32(__m128d __a)
+{
+ return __builtin_ia32_cvtsd2si(__a);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cvtsd_ss(__m128 __a, __m128d __b)
+{
+ __a[0] = __b[0];
+ return __a;
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cvtsi32_sd(__m128d __a, int __b)
+{
+ __a[0] = __b;
+ return __a;
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cvtss_sd(__m128d __a, __m128 __b)
+{
+ __a[0] = __b[0];
+ return __a;
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cvttpd_epi32(__m128d __a)
+{
+ return (__m128i)__builtin_ia32_cvttpd2dq(__a);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_cvttsd_si32(__m128d __a)
+{
+ return __a[0];
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_cvtpd_pi32(__m128d __a)
+{
+ return (__m64)__builtin_ia32_cvtpd2pi(__a);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_cvttpd_pi32(__m128d __a)
+{
+ return (__m64)__builtin_ia32_cvttpd2pi(__a);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cvtpi32_pd(__m64 __a)
+{
+ return __builtin_ia32_cvtpi2pd((__v2si)__a);
+}
+
+static __inline__ double __attribute__((__always_inline__, __nodebug__))
+_mm_cvtsd_f64(__m128d __a)
+{
+ return __a[0];
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_load_pd(double const *__dp)
+{
+ return *(__m128d*)__dp;
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_load1_pd(double const *__dp)
+{
+ struct __mm_load1_pd_struct {
+ double __u;
+ } __attribute__((__packed__, __may_alias__));
+ double __u = ((struct __mm_load1_pd_struct*)__dp)->__u;
+ return (__m128d){ __u, __u };
+}
+
+#define _mm_load_pd1(dp) _mm_load1_pd(dp)
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_loadr_pd(double const *__dp)
+{
+ __m128d __u = *(__m128d*)__dp;
+ return __builtin_shufflevector(__u, __u, 1, 0);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_loadu_pd(double const *__dp)
+{
+ struct __loadu_pd {
+ __m128d __v;
+ } __attribute__((packed, may_alias));
+ return ((struct __loadu_pd*)__dp)->__v;
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_load_sd(double const *__dp)
+{
+ struct __mm_load_sd_struct {
+ double __u;
+ } __attribute__((__packed__, __may_alias__));
+ double __u = ((struct __mm_load_sd_struct*)__dp)->__u;
+ return (__m128d){ __u, 0 };
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_loadh_pd(__m128d __a, double const *__dp)
+{
+ struct __mm_loadh_pd_struct {
+ double __u;
+ } __attribute__((__packed__, __may_alias__));
+ double __u = ((struct __mm_loadh_pd_struct*)__dp)->__u;
+ return (__m128d){ __a[0], __u };
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_loadl_pd(__m128d __a, double const *__dp)
+{
+ struct __mm_loadl_pd_struct {
+ double __u;
+ } __attribute__((__packed__, __may_alias__));
+ double __u = ((struct __mm_loadl_pd_struct*)__dp)->__u;
+ return (__m128d){ __u, __a[1] };
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_set_sd(double __w)
+{
+ return (__m128d){ __w, 0 };
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_set1_pd(double __w)
+{
+ return (__m128d){ __w, __w };
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_set_pd(double __w, double __x)
+{
+ return (__m128d){ __x, __w };
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_setr_pd(double __w, double __x)
+{
+ return (__m128d){ __w, __x };
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_setzero_pd(void)
+{
+ return (__m128d){ 0, 0 };
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_move_sd(__m128d __a, __m128d __b)
+{
+ return (__m128d){ __b[0], __a[1] };
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_store_sd(double *__dp, __m128d __a)
+{
+ struct __mm_store_sd_struct {
+ double __u;
+ } __attribute__((__packed__, __may_alias__));
+ ((struct __mm_store_sd_struct*)__dp)->__u = __a[0];
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_store1_pd(double *__dp, __m128d __a)
+{
+ struct __mm_store1_pd_struct {
+ double __u[2];
+ } __attribute__((__packed__, __may_alias__));
+ ((struct __mm_store1_pd_struct*)__dp)->__u[0] = __a[0];
+ ((struct __mm_store1_pd_struct*)__dp)->__u[1] = __a[0];
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_store_pd(double *__dp, __m128d __a)
+{
+ *(__m128d *)__dp = __a;
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_storeu_pd(double *__dp, __m128d __a)
+{
+ __builtin_ia32_storeupd(__dp, __a);
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_storer_pd(double *__dp, __m128d __a)
+{
+ __a = __builtin_shufflevector(__a, __a, 1, 0);
+ *(__m128d *)__dp = __a;
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_storeh_pd(double *__dp, __m128d __a)
+{
+ struct __mm_storeh_pd_struct {
+ double __u;
+ } __attribute__((__packed__, __may_alias__));
+ ((struct __mm_storeh_pd_struct*)__dp)->__u = __a[1];
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_storel_pd(double *__dp, __m128d __a)
+{
+ struct __mm_storeh_pd_struct {
+ double __u;
+ } __attribute__((__packed__, __may_alias__));
+ ((struct __mm_storeh_pd_struct*)__dp)->__u = __a[0];
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_add_epi8(__m128i __a, __m128i __b)
+{
+ return (__m128i)((__v16qi)__a + (__v16qi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_add_epi16(__m128i __a, __m128i __b)
+{
+ return (__m128i)((__v8hi)__a + (__v8hi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_add_epi32(__m128i __a, __m128i __b)
+{
+ return (__m128i)((__v4si)__a + (__v4si)__b);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_add_si64(__m64 __a, __m64 __b)
+{
+ return __a + __b;
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_add_epi64(__m128i __a, __m128i __b)
+{
+ return __a + __b;
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_adds_epi8(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_paddsb128((__v16qi)__a, (__v16qi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_adds_epi16(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_paddsw128((__v8hi)__a, (__v8hi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_adds_epu8(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_paddusb128((__v16qi)__a, (__v16qi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_adds_epu16(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_paddusw128((__v8hi)__a, (__v8hi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_avg_epu8(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_pavgb128((__v16qi)__a, (__v16qi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_avg_epu16(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_pavgw128((__v8hi)__a, (__v8hi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_madd_epi16(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_pmaddwd128((__v8hi)__a, (__v8hi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_max_epi16(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_pmaxsw128((__v8hi)__a, (__v8hi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_max_epu8(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_pmaxub128((__v16qi)__a, (__v16qi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_min_epi16(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_pminsw128((__v8hi)__a, (__v8hi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_min_epu8(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_pminub128((__v16qi)__a, (__v16qi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_mulhi_epi16(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_pmulhw128((__v8hi)__a, (__v8hi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_mulhi_epu16(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_pmulhuw128((__v8hi)__a, (__v8hi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_mullo_epi16(__m128i __a, __m128i __b)
+{
+ return (__m128i)((__v8hi)__a * (__v8hi)__b);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_mul_su32(__m64 __a, __m64 __b)
+{
+ return __builtin_ia32_pmuludq((__v2si)__a, (__v2si)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_mul_epu32(__m128i __a, __m128i __b)
+{
+ return __builtin_ia32_pmuludq128((__v4si)__a, (__v4si)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_sad_epu8(__m128i __a, __m128i __b)
+{
+ return __builtin_ia32_psadbw128((__v16qi)__a, (__v16qi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_sub_epi8(__m128i __a, __m128i __b)
+{
+ return (__m128i)((__v16qi)__a - (__v16qi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_sub_epi16(__m128i __a, __m128i __b)
+{
+ return (__m128i)((__v8hi)__a - (__v8hi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_sub_epi32(__m128i __a, __m128i __b)
+{
+ return (__m128i)((__v4si)__a - (__v4si)__b);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_sub_si64(__m64 __a, __m64 __b)
+{
+ return __a - __b;
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_sub_epi64(__m128i __a, __m128i __b)
+{
+ return __a - __b;
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_subs_epi8(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_psubsb128((__v16qi)__a, (__v16qi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_subs_epi16(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_psubsw128((__v8hi)__a, (__v8hi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_subs_epu8(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_psubusb128((__v16qi)__a, (__v16qi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_subs_epu16(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_psubusw128((__v8hi)__a, (__v8hi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_and_si128(__m128i __a, __m128i __b)
+{
+ return __a & __b;
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_andnot_si128(__m128i __a, __m128i __b)
+{
+ return ~__a & __b;
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_or_si128(__m128i __a, __m128i __b)
+{
+ return __a | __b;
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_xor_si128(__m128i __a, __m128i __b)
+{
+ return __a ^ __b;
+}
+
+#define _mm_slli_si128(a, count) __extension__ ({ \
+ __m128i __a = (a); \
+ (__m128i)__builtin_ia32_pslldqi128(__a, (count)*8); })
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_slli_epi16(__m128i __a, int __count)
+{
+ return (__m128i)__builtin_ia32_psllwi128((__v8hi)__a, __count);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_sll_epi16(__m128i __a, __m128i __count)
+{
+ return (__m128i)__builtin_ia32_psllw128((__v8hi)__a, (__v8hi)__count);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_slli_epi32(__m128i __a, int __count)
+{
+ return (__m128i)__builtin_ia32_pslldi128((__v4si)__a, __count);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_sll_epi32(__m128i __a, __m128i __count)
+{
+ return (__m128i)__builtin_ia32_pslld128((__v4si)__a, (__v4si)__count);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_slli_epi64(__m128i __a, int __count)
+{
+ return __builtin_ia32_psllqi128(__a, __count);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_sll_epi64(__m128i __a, __m128i __count)
+{
+ return __builtin_ia32_psllq128(__a, __count);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_srai_epi16(__m128i __a, int __count)
+{
+ return (__m128i)__builtin_ia32_psrawi128((__v8hi)__a, __count);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_sra_epi16(__m128i __a, __m128i __count)
+{
+ return (__m128i)__builtin_ia32_psraw128((__v8hi)__a, (__v8hi)__count);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_srai_epi32(__m128i __a, int __count)
+{
+ return (__m128i)__builtin_ia32_psradi128((__v4si)__a, __count);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_sra_epi32(__m128i __a, __m128i __count)
+{
+ return (__m128i)__builtin_ia32_psrad128((__v4si)__a, (__v4si)__count);
+}
+
+
+#define _mm_srli_si128(a, count) __extension__ ({ \
+ __m128i __a = (a); \
+ (__m128i)__builtin_ia32_psrldqi128(__a, (count)*8); })
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_srli_epi16(__m128i __a, int __count)
+{
+ return (__m128i)__builtin_ia32_psrlwi128((__v8hi)__a, __count);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_srl_epi16(__m128i __a, __m128i __count)
+{
+ return (__m128i)__builtin_ia32_psrlw128((__v8hi)__a, (__v8hi)__count);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_srli_epi32(__m128i __a, int __count)
+{
+ return (__m128i)__builtin_ia32_psrldi128((__v4si)__a, __count);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_srl_epi32(__m128i __a, __m128i __count)
+{
+ return (__m128i)__builtin_ia32_psrld128((__v4si)__a, (__v4si)__count);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_srli_epi64(__m128i __a, int __count)
+{
+ return __builtin_ia32_psrlqi128(__a, __count);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_srl_epi64(__m128i __a, __m128i __count)
+{
+ return __builtin_ia32_psrlq128(__a, __count);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cmpeq_epi8(__m128i __a, __m128i __b)
+{
+ return (__m128i)((__v16qi)__a == (__v16qi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cmpeq_epi16(__m128i __a, __m128i __b)
+{
+ return (__m128i)((__v8hi)__a == (__v8hi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cmpeq_epi32(__m128i __a, __m128i __b)
+{
+ return (__m128i)((__v4si)__a == (__v4si)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cmpgt_epi8(__m128i __a, __m128i __b)
+{
+ /* This function always performs a signed comparison, but __v16qi is a char
+ which may be signed or unsigned. */
+ typedef signed char __v16qs __attribute__((__vector_size__(16)));
+ return (__m128i)((__v16qs)__a > (__v16qs)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cmpgt_epi16(__m128i __a, __m128i __b)
+{
+ return (__m128i)((__v8hi)__a > (__v8hi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cmpgt_epi32(__m128i __a, __m128i __b)
+{
+ return (__m128i)((__v4si)__a > (__v4si)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cmplt_epi8(__m128i __a, __m128i __b)
+{
+ return _mm_cmpgt_epi8(__b, __a);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cmplt_epi16(__m128i __a, __m128i __b)
+{
+ return _mm_cmpgt_epi16(__b, __a);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cmplt_epi32(__m128i __a, __m128i __b)
+{
+ return _mm_cmpgt_epi32(__b, __a);
+}
+
+#ifdef __x86_64__
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_cvtsi64_sd(__m128d __a, long long __b)
+{
+ __a[0] = __b;
+ return __a;
+}
+
+static __inline__ long long __attribute__((__always_inline__, __nodebug__))
+_mm_cvtsd_si64(__m128d __a)
+{
+ return __builtin_ia32_cvtsd2si64(__a);
+}
+
+static __inline__ long long __attribute__((__always_inline__, __nodebug__))
+_mm_cvttsd_si64(__m128d __a)
+{
+ return __a[0];
+}
+#endif
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cvtepi32_ps(__m128i __a)
+{
+ return __builtin_ia32_cvtdq2ps((__v4si)__a);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cvtps_epi32(__m128 __a)
+{
+ return (__m128i)__builtin_ia32_cvtps2dq(__a);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cvttps_epi32(__m128 __a)
+{
+ return (__m128i)__builtin_ia32_cvttps2dq(__a);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cvtsi32_si128(int __a)
+{
+ return (__m128i)(__v4si){ __a, 0, 0, 0 };
+}
+
+#ifdef __x86_64__
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cvtsi64_si128(long long __a)
+{
+ return (__m128i){ __a, 0 };
+}
+#endif
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_cvtsi128_si32(__m128i __a)
+{
+ __v4si __b = (__v4si)__a;
+ return __b[0];
+}
+
+#ifdef __x86_64__
+static __inline__ long long __attribute__((__always_inline__, __nodebug__))
+_mm_cvtsi128_si64(__m128i __a)
+{
+ return __a[0];
+}
+#endif
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_load_si128(__m128i const *__p)
+{
+ return *__p;
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_loadu_si128(__m128i const *__p)
+{
+ struct __loadu_si128 {
+ __m128i __v;
+ } __attribute__((packed, may_alias));
+ return ((struct __loadu_si128*)__p)->__v;
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_loadl_epi64(__m128i const *__p)
+{
+ struct __mm_loadl_epi64_struct {
+ long long __u;
+ } __attribute__((__packed__, __may_alias__));
+ return (__m128i) { ((struct __mm_loadl_epi64_struct*)__p)->__u, 0};
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_set_epi64x(long long q1, long long q0)
+{
+ return (__m128i){ q0, q1 };
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_set_epi64(__m64 q1, __m64 q0)
+{
+ return (__m128i){ (long long)q0, (long long)q1 };
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_set_epi32(int i3, int i2, int i1, int i0)
+{
+ return (__m128i)(__v4si){ i0, i1, i2, i3};
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_set_epi16(short w7, short w6, short w5, short w4, short w3, short w2, short w1, short w0)
+{
+ return (__m128i)(__v8hi){ w0, w1, w2, w3, w4, w5, w6, w7 };
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_set_epi8(char b15, char b14, char b13, char b12, char b11, char b10, char b9, char b8, char b7, char b6, char b5, char b4, char b3, char b2, char b1, char b0)
+{
+ return (__m128i)(__v16qi){ b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15 };
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_set1_epi64x(long long __q)
+{
+ return (__m128i){ __q, __q };
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_set1_epi64(__m64 __q)
+{
+ return (__m128i){ (long long)__q, (long long)__q };
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_set1_epi32(int __i)
+{
+ return (__m128i)(__v4si){ __i, __i, __i, __i };
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_set1_epi16(short __w)
+{
+ return (__m128i)(__v8hi){ __w, __w, __w, __w, __w, __w, __w, __w };
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_set1_epi8(char __b)
+{
+ return (__m128i)(__v16qi){ __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b };
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_setr_epi64(__m64 q0, __m64 q1)
+{
+ return (__m128i){ (long long)q0, (long long)q1 };
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_setr_epi32(int i0, int i1, int i2, int i3)
+{
+ return (__m128i)(__v4si){ i0, i1, i2, i3};
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_setr_epi16(short w0, short w1, short w2, short w3, short w4, short w5, short w6, short w7)
+{
+ return (__m128i)(__v8hi){ w0, w1, w2, w3, w4, w5, w6, w7 };
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_setr_epi8(char b0, char b1, char b2, char b3, char b4, char b5, char b6, char b7, char b8, char b9, char b10, char b11, char b12, char b13, char b14, char b15)
+{
+ return (__m128i)(__v16qi){ b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15 };
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_setzero_si128(void)
+{
+ return (__m128i){ 0LL, 0LL };
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_store_si128(__m128i *__p, __m128i __b)
+{
+ *__p = __b;
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_storeu_si128(__m128i *__p, __m128i __b)
+{
+ __builtin_ia32_storedqu((char *)__p, (__v16qi)__b);
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_maskmoveu_si128(__m128i __d, __m128i __n, char *__p)
+{
+ __builtin_ia32_maskmovdqu((__v16qi)__d, (__v16qi)__n, __p);
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_storel_epi64(__m128i *__p, __m128i __a)
+{
+ struct __mm_storel_epi64_struct {
+ long long __u;
+ } __attribute__((__packed__, __may_alias__));
+ ((struct __mm_storel_epi64_struct*)__p)->__u = __a[0];
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_stream_pd(double *__p, __m128d __a)
+{
+ __builtin_ia32_movntpd(__p, __a);
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_stream_si128(__m128i *__p, __m128i __a)
+{
+ __builtin_ia32_movntdq(__p, __a);
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_stream_si32(int *__p, int __a)
+{
+ __builtin_ia32_movnti(__p, __a);
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_clflush(void const *__p)
+{
+ __builtin_ia32_clflush(__p);
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_lfence(void)
+{
+ __builtin_ia32_lfence();
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_mfence(void)
+{
+ __builtin_ia32_mfence();
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_packs_epi16(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_packsswb128((__v8hi)__a, (__v8hi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_packs_epi32(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_packssdw128((__v4si)__a, (__v4si)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_packus_epi16(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_packuswb128((__v8hi)__a, (__v8hi)__b);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_extract_epi16(__m128i __a, int __imm)
+{
+ __v8hi __b = (__v8hi)__a;
+ return (unsigned short)__b[__imm];
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_insert_epi16(__m128i __a, int __b, int __imm)
+{
+ __v8hi __c = (__v8hi)__a;
+ __c[__imm & 7] = __b;
+ return (__m128i)__c;
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_movemask_epi8(__m128i __a)
+{
+ return __builtin_ia32_pmovmskb128((__v16qi)__a);
+}
+
+#define _mm_shuffle_epi32(a, imm) __extension__ ({ \
+ __m128i __a = (a); \
+ (__m128i)__builtin_shufflevector((__v4si)__a, (__v4si) _mm_set1_epi32(0), \
+ (imm) & 0x3, ((imm) & 0xc) >> 2, \
+ ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6); })
+
+#define _mm_shufflelo_epi16(a, imm) __extension__ ({ \
+ __m128i __a = (a); \
+ (__m128i)__builtin_shufflevector((__v8hi)__a, (__v8hi) _mm_set1_epi16(0), \
+ (imm) & 0x3, ((imm) & 0xc) >> 2, \
+ ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6, \
+ 4, 5, 6, 7); })
+
+#define _mm_shufflehi_epi16(a, imm) __extension__ ({ \
+ __m128i __a = (a); \
+ (__m128i)__builtin_shufflevector((__v8hi)__a, (__v8hi) _mm_set1_epi16(0), \
+ 0, 1, 2, 3, \
+ 4 + (((imm) & 0x03) >> 0), \
+ 4 + (((imm) & 0x0c) >> 2), \
+ 4 + (((imm) & 0x30) >> 4), \
+ 4 + (((imm) & 0xc0) >> 6)); })
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_unpackhi_epi8(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_shufflevector((__v16qi)__a, (__v16qi)__b, 8, 16+8, 9, 16+9, 10, 16+10, 11, 16+11, 12, 16+12, 13, 16+13, 14, 16+14, 15, 16+15);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_unpackhi_epi16(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_shufflevector((__v8hi)__a, (__v8hi)__b, 4, 8+4, 5, 8+5, 6, 8+6, 7, 8+7);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_unpackhi_epi32(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_shufflevector((__v4si)__a, (__v4si)__b, 2, 4+2, 3, 4+3);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_unpackhi_epi64(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_shufflevector(__a, __b, 1, 2+1);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_unpacklo_epi8(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_shufflevector((__v16qi)__a, (__v16qi)__b, 0, 16+0, 1, 16+1, 2, 16+2, 3, 16+3, 4, 16+4, 5, 16+5, 6, 16+6, 7, 16+7);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_unpacklo_epi16(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_shufflevector((__v8hi)__a, (__v8hi)__b, 0, 8+0, 1, 8+1, 2, 8+2, 3, 8+3);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_unpacklo_epi32(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_shufflevector((__v4si)__a, (__v4si)__b, 0, 4+0, 1, 4+1);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_unpacklo_epi64(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_shufflevector(__a, __b, 0, 2+0);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_movepi64_pi64(__m128i __a)
+{
+ return (__m64)__a[0];
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_movpi64_pi64(__m64 __a)
+{
+ return (__m128i){ (long long)__a, 0 };
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_move_epi64(__m128i __a)
+{
+ return __builtin_shufflevector(__a, (__m128i){ 0 }, 0, 2);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_unpackhi_pd(__m128d __a, __m128d __b)
+{
+ return __builtin_shufflevector(__a, __b, 1, 2+1);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_unpacklo_pd(__m128d __a, __m128d __b)
+{
+ return __builtin_shufflevector(__a, __b, 0, 2+0);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_movemask_pd(__m128d __a)
+{
+ return __builtin_ia32_movmskpd(__a);
+}
+
+#define _mm_shuffle_pd(a, b, i) __extension__ ({ \
+ __m128d __a = (a); \
+ __m128d __b = (b); \
+ __builtin_shufflevector(__a, __b, (i) & 1, (((i) & 2) >> 1) + 2); })
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_castpd_ps(__m128d __a)
+{
+ return (__m128)__a;
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_castpd_si128(__m128d __a)
+{
+ return (__m128i)__a;
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_castps_pd(__m128 __a)
+{
+ return (__m128d)__a;
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_castps_si128(__m128 __a)
+{
+ return (__m128i)__a;
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_castsi128_ps(__m128i __a)
+{
+ return (__m128)__a;
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_castsi128_pd(__m128i __a)
+{
+ return (__m128d)__a;
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_pause(void)
+{
+ __asm__ volatile ("pause");
+}
+
+#define _MM_SHUFFLE2(x, y) (((x) << 1) | (y))
+
+#endif /* __SSE2__ */
+
+#endif /* __EMMINTRIN_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/f16cintrin.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/f16cintrin.h
new file mode 100644
index 0000000..a6d7812
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/f16cintrin.h
@@ -0,0 +1,58 @@
+/*===---- f16cintrin.h - F16C intrinsics ---------------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining __a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#if !defined __X86INTRIN_H && !defined __IMMINTRIN_H
+#error "Never use <f16cintrin.h> directly; include <x86intrin.h> instead."
+#endif
+
+#ifndef __F16C__
+# error "F16C instruction is not enabled"
+#endif /* __F16C__ */
+
+#ifndef __F16CINTRIN_H
+#define __F16CINTRIN_H
+
+typedef float __v8sf __attribute__ ((__vector_size__ (32)));
+typedef float __m256 __attribute__ ((__vector_size__ (32)));
+
+#define _mm_cvtps_ph(a, imm) __extension__ ({ \
+ __m128 __a = (a); \
+ (__m128i)__builtin_ia32_vcvtps2ph((__v4sf)__a, (imm)); })
+
+#define _mm256_cvtps_ph(a, imm) __extension__ ({ \
+ __m256 __a = (a); \
+ (__m128i)__builtin_ia32_vcvtps2ph256((__v8sf)__a, (imm)); })
+
+static __inline __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cvtph_ps(__m128i __a)
+{
+ return (__m128)__builtin_ia32_vcvtph2ps((__v8hi)__a);
+}
+
+static __inline __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_cvtph_ps(__m128i __a)
+{
+ return (__m256)__builtin_ia32_vcvtph2ps256((__v8hi)__a);
+}
+
+#endif /* __F16CINTRIN_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/float.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/float.h
new file mode 100644
index 0000000..2cb13d3
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/float.h
@@ -0,0 +1,124 @@
+/*===---- float.h - Characteristics of floating point types ----------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef __FLOAT_H
+#define __FLOAT_H
+
+/* If we're on MinGW, fall back to the system's float.h, which might have
+ * additional definitions provided for Windows.
+ * For more details see http://msdn.microsoft.com/en-us/library/y0ybw9fy.aspx
+ */
+#if (defined(__MINGW32__) || defined(_MSC_VER)) && \
+ defined(__has_include_next) && __has_include_next(<float.h>)
+# include_next <float.h>
+
+/* Undefine anything that we'll be redefining below. */
+# undef FLT_EVAL_METHOD
+# undef FLT_ROUNDS
+# undef FLT_RADIX
+# undef FLT_MANT_DIG
+# undef DBL_MANT_DIG
+# undef LDBL_MANT_DIG
+# undef DECIMAL_DIG
+# undef FLT_DIG
+# undef DBL_DIG
+# undef LDBL_DIG
+# undef FLT_MIN_EXP
+# undef DBL_MIN_EXP
+# undef LDBL_MIN_EXP
+# undef FLT_MIN_10_EXP
+# undef DBL_MIN_10_EXP
+# undef LDBL_MIN_10_EXP
+# undef FLT_MAX_EXP
+# undef DBL_MAX_EXP
+# undef LDBL_MAX_EXP
+# undef FLT_MAX_10_EXP
+# undef DBL_MAX_10_EXP
+# undef LDBL_MAX_10_EXP
+# undef FLT_MAX
+# undef DBL_MAX
+# undef LDBL_MAX
+# undef FLT_EPSILON
+# undef DBL_EPSILON
+# undef LDBL_EPSILON
+# undef FLT_MIN
+# undef DBL_MIN
+# undef LDBL_MIN
+# if __STDC_VERSION__ >= 201112L || !defined(__STRICT_ANSI__)
+# undef FLT_TRUE_MIN
+# undef DBL_TRUE_MIN
+# undef LDBL_TRUE_MIN
+# endif
+#endif
+
+/* Characteristics of floating point types, C99 5.2.4.2.2 */
+
+#define FLT_EVAL_METHOD __FLT_EVAL_METHOD__
+#define FLT_ROUNDS (__builtin_flt_rounds())
+#define FLT_RADIX __FLT_RADIX__
+
+#define FLT_MANT_DIG __FLT_MANT_DIG__
+#define DBL_MANT_DIG __DBL_MANT_DIG__
+#define LDBL_MANT_DIG __LDBL_MANT_DIG__
+
+#define DECIMAL_DIG __DECIMAL_DIG__
+
+#define FLT_DIG __FLT_DIG__
+#define DBL_DIG __DBL_DIG__
+#define LDBL_DIG __LDBL_DIG__
+
+#define FLT_MIN_EXP __FLT_MIN_EXP__
+#define DBL_MIN_EXP __DBL_MIN_EXP__
+#define LDBL_MIN_EXP __LDBL_MIN_EXP__
+
+#define FLT_MIN_10_EXP __FLT_MIN_10_EXP__
+#define DBL_MIN_10_EXP __DBL_MIN_10_EXP__
+#define LDBL_MIN_10_EXP __LDBL_MIN_10_EXP__
+
+#define FLT_MAX_EXP __FLT_MAX_EXP__
+#define DBL_MAX_EXP __DBL_MAX_EXP__
+#define LDBL_MAX_EXP __LDBL_MAX_EXP__
+
+#define FLT_MAX_10_EXP __FLT_MAX_10_EXP__
+#define DBL_MAX_10_EXP __DBL_MAX_10_EXP__
+#define LDBL_MAX_10_EXP __LDBL_MAX_10_EXP__
+
+#define FLT_MAX __FLT_MAX__
+#define DBL_MAX __DBL_MAX__
+#define LDBL_MAX __LDBL_MAX__
+
+#define FLT_EPSILON __FLT_EPSILON__
+#define DBL_EPSILON __DBL_EPSILON__
+#define LDBL_EPSILON __LDBL_EPSILON__
+
+#define FLT_MIN __FLT_MIN__
+#define DBL_MIN __DBL_MIN__
+#define LDBL_MIN __LDBL_MIN__
+
+#if __STDC_VERSION__ >= 201112L || !defined(__STRICT_ANSI__)
+# define FLT_TRUE_MIN __FLT_DENORM_MIN__
+# define DBL_TRUE_MIN __DBL_DENORM_MIN__
+# define LDBL_TRUE_MIN __LDBL_DENORM_MIN__
+#endif
+
+#endif /* __FLOAT_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/fma4intrin.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/fma4intrin.h
new file mode 100644
index 0000000..c30920d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/fma4intrin.h
@@ -0,0 +1,231 @@
+/*===---- fma4intrin.h - FMA4 intrinsics -----------------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef __X86INTRIN_H
+#error "Never use <fma4intrin.h> directly; include <x86intrin.h> instead."
+#endif
+
+#ifndef __FMA4INTRIN_H
+#define __FMA4INTRIN_H
+
+#ifndef __FMA4__
+# error "FMA4 instruction set is not enabled"
+#else
+
+#include <pmmintrin.h>
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_macc_ps(__m128 __A, __m128 __B, __m128 __C)
+{
+ return (__m128)__builtin_ia32_vfmaddps(__A, __B, __C);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_macc_pd(__m128d __A, __m128d __B, __m128d __C)
+{
+ return (__m128d)__builtin_ia32_vfmaddpd(__A, __B, __C);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_macc_ss(__m128 __A, __m128 __B, __m128 __C)
+{
+ return (__m128)__builtin_ia32_vfmaddss(__A, __B, __C);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_macc_sd(__m128d __A, __m128d __B, __m128d __C)
+{
+ return (__m128d)__builtin_ia32_vfmaddsd(__A, __B, __C);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_msub_ps(__m128 __A, __m128 __B, __m128 __C)
+{
+ return (__m128)__builtin_ia32_vfmsubps(__A, __B, __C);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_msub_pd(__m128d __A, __m128d __B, __m128d __C)
+{
+ return (__m128d)__builtin_ia32_vfmsubpd(__A, __B, __C);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_msub_ss(__m128 __A, __m128 __B, __m128 __C)
+{
+ return (__m128)__builtin_ia32_vfmsubss(__A, __B, __C);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_msub_sd(__m128d __A, __m128d __B, __m128d __C)
+{
+ return (__m128d)__builtin_ia32_vfmsubsd(__A, __B, __C);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_nmacc_ps(__m128 __A, __m128 __B, __m128 __C)
+{
+ return (__m128)__builtin_ia32_vfnmaddps(__A, __B, __C);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_nmacc_pd(__m128d __A, __m128d __B, __m128d __C)
+{
+ return (__m128d)__builtin_ia32_vfnmaddpd(__A, __B, __C);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_nmacc_ss(__m128 __A, __m128 __B, __m128 __C)
+{
+ return (__m128)__builtin_ia32_vfnmaddss(__A, __B, __C);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_nmacc_sd(__m128d __A, __m128d __B, __m128d __C)
+{
+ return (__m128d)__builtin_ia32_vfnmaddsd(__A, __B, __C);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_nmsub_ps(__m128 __A, __m128 __B, __m128 __C)
+{
+ return (__m128)__builtin_ia32_vfnmsubps(__A, __B, __C);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_nmsub_pd(__m128d __A, __m128d __B, __m128d __C)
+{
+ return (__m128d)__builtin_ia32_vfnmsubpd(__A, __B, __C);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_nmsub_ss(__m128 __A, __m128 __B, __m128 __C)
+{
+ return (__m128)__builtin_ia32_vfnmsubss(__A, __B, __C);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_nmsub_sd(__m128d __A, __m128d __B, __m128d __C)
+{
+ return (__m128d)__builtin_ia32_vfnmsubsd(__A, __B, __C);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_maddsub_ps(__m128 __A, __m128 __B, __m128 __C)
+{
+ return (__m128)__builtin_ia32_vfmaddsubps(__A, __B, __C);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_maddsub_pd(__m128d __A, __m128d __B, __m128d __C)
+{
+ return (__m128d)__builtin_ia32_vfmaddsubpd(__A, __B, __C);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_msubadd_ps(__m128 __A, __m128 __B, __m128 __C)
+{
+ return (__m128)__builtin_ia32_vfmsubaddps(__A, __B, __C);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_msubadd_pd(__m128d __A, __m128d __B, __m128d __C)
+{
+ return (__m128d)__builtin_ia32_vfmsubaddpd(__A, __B, __C);
+}
+
+static __inline__ __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_macc_ps(__m256 __A, __m256 __B, __m256 __C)
+{
+ return (__m256)__builtin_ia32_vfmaddps256(__A, __B, __C);
+}
+
+static __inline__ __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_macc_pd(__m256d __A, __m256d __B, __m256d __C)
+{
+ return (__m256d)__builtin_ia32_vfmaddpd256(__A, __B, __C);
+}
+
+static __inline__ __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_msub_ps(__m256 __A, __m256 __B, __m256 __C)
+{
+ return (__m256)__builtin_ia32_vfmsubps256(__A, __B, __C);
+}
+
+static __inline__ __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_msub_pd(__m256d __A, __m256d __B, __m256d __C)
+{
+ return (__m256d)__builtin_ia32_vfmsubpd256(__A, __B, __C);
+}
+
+static __inline__ __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_nmacc_ps(__m256 __A, __m256 __B, __m256 __C)
+{
+ return (__m256)__builtin_ia32_vfnmaddps256(__A, __B, __C);
+}
+
+static __inline__ __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_nmacc_pd(__m256d __A, __m256d __B, __m256d __C)
+{
+ return (__m256d)__builtin_ia32_vfnmaddpd256(__A, __B, __C);
+}
+
+static __inline__ __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_nmsub_ps(__m256 __A, __m256 __B, __m256 __C)
+{
+ return (__m256)__builtin_ia32_vfnmsubps256(__A, __B, __C);
+}
+
+static __inline__ __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_nmsub_pd(__m256d __A, __m256d __B, __m256d __C)
+{
+ return (__m256d)__builtin_ia32_vfnmsubpd256(__A, __B, __C);
+}
+
+static __inline__ __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_maddsub_ps(__m256 __A, __m256 __B, __m256 __C)
+{
+ return (__m256)__builtin_ia32_vfmaddsubps256(__A, __B, __C);
+}
+
+static __inline__ __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_maddsub_pd(__m256d __A, __m256d __B, __m256d __C)
+{
+ return (__m256d)__builtin_ia32_vfmaddsubpd256(__A, __B, __C);
+}
+
+static __inline__ __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_msubadd_ps(__m256 __A, __m256 __B, __m256 __C)
+{
+ return (__m256)__builtin_ia32_vfmsubaddps256(__A, __B, __C);
+}
+
+static __inline__ __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_msubadd_pd(__m256d __A, __m256d __B, __m256d __C)
+{
+ return (__m256d)__builtin_ia32_vfmsubaddpd256(__A, __B, __C);
+}
+
+#endif /* __FMA4__ */
+
+#endif /* __FMA4INTRIN_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/fmaintrin.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/fmaintrin.h
new file mode 100644
index 0000000..6bfd5a8
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/fmaintrin.h
@@ -0,0 +1,229 @@
+/*===---- fma4intrin.h - FMA4 intrinsics -----------------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef __IMMINTRIN_H
+#error "Never use <fmaintrin.h> directly; include <immintrin.h> instead."
+#endif
+
+#ifndef __FMAINTRIN_H
+#define __FMAINTRIN_H
+
+#ifndef __FMA__
+# error "FMA instruction set is not enabled"
+#else
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_fmadd_ps(__m128 __A, __m128 __B, __m128 __C)
+{
+ return (__m128)__builtin_ia32_vfmaddps(__A, __B, __C);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_fmadd_pd(__m128d __A, __m128d __B, __m128d __C)
+{
+ return (__m128d)__builtin_ia32_vfmaddpd(__A, __B, __C);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_fmadd_ss(__m128 __A, __m128 __B, __m128 __C)
+{
+ return (__m128)__builtin_ia32_vfmaddss(__A, __B, __C);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_fmadd_sd(__m128d __A, __m128d __B, __m128d __C)
+{
+ return (__m128d)__builtin_ia32_vfmaddsd(__A, __B, __C);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_fmsub_ps(__m128 __A, __m128 __B, __m128 __C)
+{
+ return (__m128)__builtin_ia32_vfmsubps(__A, __B, __C);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_fmsub_pd(__m128d __A, __m128d __B, __m128d __C)
+{
+ return (__m128d)__builtin_ia32_vfmsubpd(__A, __B, __C);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_fmsub_ss(__m128 __A, __m128 __B, __m128 __C)
+{
+ return (__m128)__builtin_ia32_vfmsubss(__A, __B, __C);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_fmsub_sd(__m128d __A, __m128d __B, __m128d __C)
+{
+ return (__m128d)__builtin_ia32_vfmsubsd(__A, __B, __C);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_fnmadd_ps(__m128 __A, __m128 __B, __m128 __C)
+{
+ return (__m128)__builtin_ia32_vfnmaddps(__A, __B, __C);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_fnmadd_pd(__m128d __A, __m128d __B, __m128d __C)
+{
+ return (__m128d)__builtin_ia32_vfnmaddpd(__A, __B, __C);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_fnmadd_ss(__m128 __A, __m128 __B, __m128 __C)
+{
+ return (__m128)__builtin_ia32_vfnmaddss(__A, __B, __C);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_fnmadd_sd(__m128d __A, __m128d __B, __m128d __C)
+{
+ return (__m128d)__builtin_ia32_vfnmaddsd(__A, __B, __C);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_fnmsub_ps(__m128 __A, __m128 __B, __m128 __C)
+{
+ return (__m128)__builtin_ia32_vfnmsubps(__A, __B, __C);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_fnmsub_pd(__m128d __A, __m128d __B, __m128d __C)
+{
+ return (__m128d)__builtin_ia32_vfnmsubpd(__A, __B, __C);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_fnmsub_ss(__m128 __A, __m128 __B, __m128 __C)
+{
+ return (__m128)__builtin_ia32_vfnmsubss(__A, __B, __C);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_fnmsub_sd(__m128d __A, __m128d __B, __m128d __C)
+{
+ return (__m128d)__builtin_ia32_vfnmsubsd(__A, __B, __C);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_fmaddsub_ps(__m128 __A, __m128 __B, __m128 __C)
+{
+ return (__m128)__builtin_ia32_vfmaddsubps(__A, __B, __C);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_fmaddsub_pd(__m128d __A, __m128d __B, __m128d __C)
+{
+ return (__m128d)__builtin_ia32_vfmaddsubpd(__A, __B, __C);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_fmsubadd_ps(__m128 __A, __m128 __B, __m128 __C)
+{
+ return (__m128)__builtin_ia32_vfmsubaddps(__A, __B, __C);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_fmsubadd_pd(__m128d __A, __m128d __B, __m128d __C)
+{
+ return (__m128d)__builtin_ia32_vfmsubaddpd(__A, __B, __C);
+}
+
+static __inline__ __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_fmadd_ps(__m256 __A, __m256 __B, __m256 __C)
+{
+ return (__m256)__builtin_ia32_vfmaddps256(__A, __B, __C);
+}
+
+static __inline__ __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_fmadd_pd(__m256d __A, __m256d __B, __m256d __C)
+{
+ return (__m256d)__builtin_ia32_vfmaddpd256(__A, __B, __C);
+}
+
+static __inline__ __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_fmsub_ps(__m256 __A, __m256 __B, __m256 __C)
+{
+ return (__m256)__builtin_ia32_vfmsubps256(__A, __B, __C);
+}
+
+static __inline__ __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_fmsub_pd(__m256d __A, __m256d __B, __m256d __C)
+{
+ return (__m256d)__builtin_ia32_vfmsubpd256(__A, __B, __C);
+}
+
+static __inline__ __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_fnmadd_ps(__m256 __A, __m256 __B, __m256 __C)
+{
+ return (__m256)__builtin_ia32_vfnmaddps256(__A, __B, __C);
+}
+
+static __inline__ __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_fnmadd_pd(__m256d __A, __m256d __B, __m256d __C)
+{
+ return (__m256d)__builtin_ia32_vfnmaddpd256(__A, __B, __C);
+}
+
+static __inline__ __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_fnmsub_ps(__m256 __A, __m256 __B, __m256 __C)
+{
+ return (__m256)__builtin_ia32_vfnmsubps256(__A, __B, __C);
+}
+
+static __inline__ __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_fnmsub_pd(__m256d __A, __m256d __B, __m256d __C)
+{
+ return (__m256d)__builtin_ia32_vfnmsubpd256(__A, __B, __C);
+}
+
+static __inline__ __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_fmaddsub_ps(__m256 __A, __m256 __B, __m256 __C)
+{
+ return (__m256)__builtin_ia32_vfmaddsubps256(__A, __B, __C);
+}
+
+static __inline__ __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_fmaddsub_pd(__m256d __A, __m256d __B, __m256d __C)
+{
+ return (__m256d)__builtin_ia32_vfmaddsubpd256(__A, __B, __C);
+}
+
+static __inline__ __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_fmsubadd_ps(__m256 __A, __m256 __B, __m256 __C)
+{
+ return (__m256)__builtin_ia32_vfmsubaddps256(__A, __B, __C);
+}
+
+static __inline__ __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_fmsubadd_pd(__m256d __A, __m256d __B, __m256d __C)
+{
+ return (__m256d)__builtin_ia32_vfmsubaddpd256(__A, __B, __C);
+}
+
+#endif /* __FMA__ */
+
+#endif /* __FMAINTRIN_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/immintrin.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/immintrin.h
new file mode 100644
index 0000000..fea7c3b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/immintrin.h
@@ -0,0 +1,114 @@
+/*===---- immintrin.h - Intel intrinsics -----------------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef __IMMINTRIN_H
+#define __IMMINTRIN_H
+
+#ifdef __MMX__
+#include <mmintrin.h>
+#endif
+
+#ifdef __SSE__
+#include <xmmintrin.h>
+#endif
+
+#ifdef __SSE2__
+#include <emmintrin.h>
+#endif
+
+#ifdef __SSE3__
+#include <pmmintrin.h>
+#endif
+
+#ifdef __SSSE3__
+#include <tmmintrin.h>
+#endif
+
+#if defined (__SSE4_2__) || defined (__SSE4_1__)
+#include <smmintrin.h>
+#endif
+
+#if defined (__AES__)
+#include <wmmintrin.h>
+#endif
+
+#ifdef __AVX__
+#include <avxintrin.h>
+#endif
+
+#ifdef __AVX2__
+#include <avx2intrin.h>
+#endif
+
+#ifdef __BMI__
+#include <bmiintrin.h>
+#endif
+
+#ifdef __BMI2__
+#include <bmi2intrin.h>
+#endif
+
+#ifdef __LZCNT__
+#include <lzcntintrin.h>
+#endif
+
+#ifdef __FMA__
+#include <fmaintrin.h>
+#endif
+
+#ifdef __RDRND__
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_rdrand16_step(unsigned short *__p)
+{
+ return __builtin_ia32_rdrand16_step(__p);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_rdrand32_step(unsigned int *__p)
+{
+ return __builtin_ia32_rdrand32_step(__p);
+}
+
+#ifdef __x86_64__
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_rdrand64_step(unsigned long long *__p)
+{
+ return __builtin_ia32_rdrand64_step(__p);
+}
+#endif
+#endif /* __RDRND__ */
+
+#ifdef __RTM__
+#include <rtmintrin.h>
+#endif
+
+/* FIXME: check __HLE__ as well when HLE is supported. */
+#if defined (__RTM__)
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_xtest(void)
+{
+ return __builtin_ia32_xtest();
+}
+#endif
+
+#endif /* __IMMINTRIN_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/iso646.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/iso646.h
new file mode 100644
index 0000000..dca13c5
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/iso646.h
@@ -0,0 +1,43 @@
+/*===---- iso646.h - Standard header for alternate spellings of operators---===
+ *
+ * Copyright (c) 2008 Eli Friedman
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef __ISO646_H
+#define __ISO646_H
+
+#ifndef __cplusplus
+#define and &&
+#define and_eq &=
+#define bitand &
+#define bitor |
+#define compl ~
+#define not !
+#define not_eq !=
+#define or ||
+#define or_eq |=
+#define xor ^
+#define xor_eq ^=
+#endif
+
+#endif /* __ISO646_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/limits.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/limits.h
new file mode 100644
index 0000000..ecd09a4
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/limits.h
@@ -0,0 +1,117 @@
+/*===---- limits.h - Standard header for integer sizes --------------------===*\
+ *
+ * Copyright (c) 2009 Chris Lattner
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+\*===----------------------------------------------------------------------===*/
+
+#ifndef __CLANG_LIMITS_H
+#define __CLANG_LIMITS_H
+
+/* The system's limits.h may, in turn, try to #include_next GCC's limits.h.
+ Avert this #include_next madness. */
+#if defined __GNUC__ && !defined _GCC_LIMITS_H_
+#define _GCC_LIMITS_H_
+#endif
+
+/* System headers include a number of constants from POSIX in <limits.h>.
+ Include it if we're hosted. */
+#if __STDC_HOSTED__ && \
+ defined(__has_include_next) && __has_include_next(<limits.h>)
+#include_next <limits.h>
+#endif
+
+/* Many system headers try to "help us out" by defining these. No really, we
+ know how big each datatype is. */
+#undef SCHAR_MIN
+#undef SCHAR_MAX
+#undef UCHAR_MAX
+#undef SHRT_MIN
+#undef SHRT_MAX
+#undef USHRT_MAX
+#undef INT_MIN
+#undef INT_MAX
+#undef UINT_MAX
+#undef LONG_MIN
+#undef LONG_MAX
+#undef ULONG_MAX
+
+#undef CHAR_BIT
+#undef CHAR_MIN
+#undef CHAR_MAX
+
+/* C90/99 5.2.4.2.1 */
+#define SCHAR_MAX __SCHAR_MAX__
+#define SHRT_MAX __SHRT_MAX__
+#define INT_MAX __INT_MAX__
+#define LONG_MAX __LONG_MAX__
+
+#define SCHAR_MIN (-__SCHAR_MAX__-1)
+#define SHRT_MIN (-__SHRT_MAX__ -1)
+#define INT_MIN (-__INT_MAX__ -1)
+#define LONG_MIN (-__LONG_MAX__ -1L)
+
+#define UCHAR_MAX (__SCHAR_MAX__*2 +1)
+#define USHRT_MAX (__SHRT_MAX__ *2 +1)
+#define UINT_MAX (__INT_MAX__ *2U +1U)
+#define ULONG_MAX (__LONG_MAX__ *2UL+1UL)
+
+#ifndef MB_LEN_MAX
+#define MB_LEN_MAX 1
+#endif
+
+#define CHAR_BIT __CHAR_BIT__
+
+#ifdef __CHAR_UNSIGNED__ /* -funsigned-char */
+#define CHAR_MIN 0
+#define CHAR_MAX UCHAR_MAX
+#else
+#define CHAR_MIN SCHAR_MIN
+#define CHAR_MAX __SCHAR_MAX__
+#endif
+
+/* C99 5.2.4.2.1: Added long long. */
+#if __STDC_VERSION__ >= 199901
+
+#undef LLONG_MIN
+#undef LLONG_MAX
+#undef ULLONG_MAX
+
+#define LLONG_MAX __LONG_LONG_MAX__
+#define LLONG_MIN (-__LONG_LONG_MAX__-1LL)
+#define ULLONG_MAX (__LONG_LONG_MAX__*2ULL+1ULL)
+#endif
+
+/* LONG_LONG_MIN/LONG_LONG_MAX/ULONG_LONG_MAX are a GNU extension. It's too bad
+ that we don't have something like #pragma poison that could be used to
+ deprecate a macro - the code should just use LLONG_MAX and friends.
+ */
+#if defined(__GNU_LIBRARY__) ? defined(__USE_GNU) : !defined(__STRICT_ANSI__)
+
+#undef LONG_LONG_MIN
+#undef LONG_LONG_MAX
+#undef ULONG_LONG_MAX
+
+#define LONG_LONG_MAX __LONG_LONG_MAX__
+#define LONG_LONG_MIN (-__LONG_LONG_MAX__-1LL)
+#define ULONG_LONG_MAX (__LONG_LONG_MAX__*2ULL+1ULL)
+#endif
+
+#endif /* __CLANG_LIMITS_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/lzcntintrin.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/lzcntintrin.h
new file mode 100644
index 0000000..62ab5ca
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/lzcntintrin.h
@@ -0,0 +1,55 @@
+/*===---- lzcntintrin.h - LZCNT intrinsics ---------------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#if !defined __X86INTRIN_H && !defined __IMMINTRIN_H
+#error "Never use <lzcntintrin.h> directly; include <x86intrin.h> instead."
+#endif
+
+#ifndef __LZCNT__
+# error "LZCNT instruction is not enabled"
+#endif /* __LZCNT__ */
+
+#ifndef __LZCNTINTRIN_H
+#define __LZCNTINTRIN_H
+
+static __inline__ unsigned short __attribute__((__always_inline__, __nodebug__))
+__lzcnt16(unsigned short __X)
+{
+ return __builtin_clzs(__X);
+}
+
+static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))
+__lzcnt32(unsigned int __X)
+{
+ return __builtin_clz(__X);
+}
+
+#ifdef __x86_64__
+static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__))
+__lzcnt64(unsigned long long __X)
+{
+ return __builtin_clzll(__X);
+}
+#endif
+
+#endif /* __LZCNTINTRIN_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/mm3dnow.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/mm3dnow.h
new file mode 100644
index 0000000..5242d99
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/mm3dnow.h
@@ -0,0 +1,162 @@
+/*===---- mm3dnow.h - 3DNow! intrinsics ------------------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef _MM3DNOW_H_INCLUDED
+#define _MM3DNOW_H_INCLUDED
+
+#include <mmintrin.h>
+#include <prfchwintrin.h>
+
+typedef float __v2sf __attribute__((__vector_size__(8)));
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_m_femms() {
+ __builtin_ia32_femms();
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_m_pavgusb(__m64 __m1, __m64 __m2) {
+ return (__m64)__builtin_ia32_pavgusb((__v8qi)__m1, (__v8qi)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_m_pf2id(__m64 __m) {
+ return (__m64)__builtin_ia32_pf2id((__v2sf)__m);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_m_pfacc(__m64 __m1, __m64 __m2) {
+ return (__m64)__builtin_ia32_pfacc((__v2sf)__m1, (__v2sf)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_m_pfadd(__m64 __m1, __m64 __m2) {
+ return (__m64)__builtin_ia32_pfadd((__v2sf)__m1, (__v2sf)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_m_pfcmpeq(__m64 __m1, __m64 __m2) {
+ return (__m64)__builtin_ia32_pfcmpeq((__v2sf)__m1, (__v2sf)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_m_pfcmpge(__m64 __m1, __m64 __m2) {
+ return (__m64)__builtin_ia32_pfcmpge((__v2sf)__m1, (__v2sf)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_m_pfcmpgt(__m64 __m1, __m64 __m2) {
+ return (__m64)__builtin_ia32_pfcmpgt((__v2sf)__m1, (__v2sf)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_m_pfmax(__m64 __m1, __m64 __m2) {
+ return (__m64)__builtin_ia32_pfmax((__v2sf)__m1, (__v2sf)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_m_pfmin(__m64 __m1, __m64 __m2) {
+ return (__m64)__builtin_ia32_pfmin((__v2sf)__m1, (__v2sf)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_m_pfmul(__m64 __m1, __m64 __m2) {
+ return (__m64)__builtin_ia32_pfmul((__v2sf)__m1, (__v2sf)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_m_pfrcp(__m64 __m) {
+ return (__m64)__builtin_ia32_pfrcp((__v2sf)__m);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_m_pfrcpit1(__m64 __m1, __m64 __m2) {
+ return (__m64)__builtin_ia32_pfrcpit1((__v2sf)__m1, (__v2sf)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_m_pfrcpit2(__m64 __m1, __m64 __m2) {
+ return (__m64)__builtin_ia32_pfrcpit2((__v2sf)__m1, (__v2sf)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_m_pfrsqrt(__m64 __m) {
+ return (__m64)__builtin_ia32_pfrsqrt((__v2sf)__m);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_m_pfrsqrtit1(__m64 __m1, __m64 __m2) {
+ return (__m64)__builtin_ia32_pfrsqit1((__v2sf)__m1, (__v2sf)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_m_pfsub(__m64 __m1, __m64 __m2) {
+ return (__m64)__builtin_ia32_pfsub((__v2sf)__m1, (__v2sf)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_m_pfsubr(__m64 __m1, __m64 __m2) {
+ return (__m64)__builtin_ia32_pfsubr((__v2sf)__m1, (__v2sf)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_m_pi2fd(__m64 __m) {
+ return (__m64)__builtin_ia32_pi2fd((__v2si)__m);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_m_pmulhrw(__m64 __m1, __m64 __m2) {
+ return (__m64)__builtin_ia32_pmulhrw((__v4hi)__m1, (__v4hi)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_m_pf2iw(__m64 __m) {
+ return (__m64)__builtin_ia32_pf2iw((__v2sf)__m);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_m_pfnacc(__m64 __m1, __m64 __m2) {
+ return (__m64)__builtin_ia32_pfnacc((__v2sf)__m1, (__v2sf)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_m_pfpnacc(__m64 __m1, __m64 __m2) {
+ return (__m64)__builtin_ia32_pfpnacc((__v2sf)__m1, (__v2sf)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_m_pi2fw(__m64 __m) {
+ return (__m64)__builtin_ia32_pi2fw((__v2si)__m);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_m_pswapdsf(__m64 __m) {
+ return (__m64)__builtin_ia32_pswapdsf((__v2sf)__m);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_m_pswapdsi(__m64 __m) {
+ return (__m64)__builtin_ia32_pswapdsi((__v2si)__m);
+}
+
+#endif
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/mm_malloc.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/mm_malloc.h
new file mode 100644
index 0000000..305afd3
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/mm_malloc.h
@@ -0,0 +1,75 @@
+/*===---- mm_malloc.h - Allocating and Freeing Aligned Memory Blocks -------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef __MM_MALLOC_H
+#define __MM_MALLOC_H
+
+#include <stdlib.h>
+
+#ifdef _WIN32
+#include <malloc.h>
+#else
+#ifndef __cplusplus
+extern int posix_memalign(void **__memptr, size_t __alignment, size_t __size);
+#else
+// Some systems (e.g. those with GNU libc) declare posix_memalign with an
+// exception specifier. Via an "egregious workaround" in
+// Sema::CheckEquivalentExceptionSpec, Clang accepts the following as a valid
+// redeclaration of glibc's declaration.
+extern "C" int posix_memalign(void **__memptr, size_t __alignment, size_t __size);
+#endif
+#endif
+
+#if !(defined(_WIN32) && defined(_mm_malloc))
+static __inline__ void *__attribute__((__always_inline__, __nodebug__,
+ __malloc__))
+_mm_malloc(size_t __size, size_t __align)
+{
+ if (__align == 1) {
+ return malloc(__size);
+ }
+
+ if (!(__align & (__align - 1)) && __align < sizeof(void *))
+ __align = sizeof(void *);
+
+ void *__mallocedMemory;
+#if defined(__MINGW32__)
+ __mallocedMemory = __mingw_aligned_malloc(__size, __align);
+#elif defined(_WIN32)
+ __mallocedMemory = _aligned_malloc(__size, __align);
+#else
+ if (posix_memalign(&__mallocedMemory, __align, __size))
+ return 0;
+#endif
+
+ return __mallocedMemory;
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_free(void *__p)
+{
+ free(__p);
+}
+#endif
+
+#endif /* __MM_MALLOC_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/mmintrin.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/mmintrin.h
new file mode 100644
index 0000000..986870a
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/mmintrin.h
@@ -0,0 +1,503 @@
+/*===---- mmintrin.h - MMX intrinsics --------------------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef __MMINTRIN_H
+#define __MMINTRIN_H
+
+#ifndef __MMX__
+#error "MMX instruction set not enabled"
+#else
+
+typedef long long __m64 __attribute__((__vector_size__(8)));
+
+typedef int __v2si __attribute__((__vector_size__(8)));
+typedef short __v4hi __attribute__((__vector_size__(8)));
+typedef char __v8qi __attribute__((__vector_size__(8)));
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_empty(void)
+{
+ __builtin_ia32_emms();
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_cvtsi32_si64(int __i)
+{
+ return (__m64)__builtin_ia32_vec_init_v2si(__i, 0);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_cvtsi64_si32(__m64 __m)
+{
+ return __builtin_ia32_vec_ext_v2si((__v2si)__m, 0);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_cvtsi64_m64(long long __i)
+{
+ return (__m64)__i;
+}
+
+static __inline__ long long __attribute__((__always_inline__, __nodebug__))
+_mm_cvtm64_si64(__m64 __m)
+{
+ return (long long)__m;
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_packs_pi16(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_packsswb((__v4hi)__m1, (__v4hi)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_packs_pi32(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_packssdw((__v2si)__m1, (__v2si)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_packs_pu16(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_packuswb((__v4hi)__m1, (__v4hi)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_unpackhi_pi8(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_punpckhbw((__v8qi)__m1, (__v8qi)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_unpackhi_pi16(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_punpckhwd((__v4hi)__m1, (__v4hi)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_unpackhi_pi32(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_punpckhdq((__v2si)__m1, (__v2si)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_unpacklo_pi8(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_punpcklbw((__v8qi)__m1, (__v8qi)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_unpacklo_pi16(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_punpcklwd((__v4hi)__m1, (__v4hi)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_unpacklo_pi32(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_punpckldq((__v2si)__m1, (__v2si)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_add_pi8(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_paddb((__v8qi)__m1, (__v8qi)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_add_pi16(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_paddw((__v4hi)__m1, (__v4hi)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_add_pi32(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_paddd((__v2si)__m1, (__v2si)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_adds_pi8(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_paddsb((__v8qi)__m1, (__v8qi)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_adds_pi16(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_paddsw((__v4hi)__m1, (__v4hi)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_adds_pu8(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_paddusb((__v8qi)__m1, (__v8qi)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_adds_pu16(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_paddusw((__v4hi)__m1, (__v4hi)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_sub_pi8(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_psubb((__v8qi)__m1, (__v8qi)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_sub_pi16(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_psubw((__v4hi)__m1, (__v4hi)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_sub_pi32(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_psubd((__v2si)__m1, (__v2si)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_subs_pi8(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_psubsb((__v8qi)__m1, (__v8qi)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_subs_pi16(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_psubsw((__v4hi)__m1, (__v4hi)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_subs_pu8(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_psubusb((__v8qi)__m1, (__v8qi)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_subs_pu16(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_psubusw((__v4hi)__m1, (__v4hi)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_madd_pi16(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_pmaddwd((__v4hi)__m1, (__v4hi)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_mulhi_pi16(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_pmulhw((__v4hi)__m1, (__v4hi)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_mullo_pi16(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_pmullw((__v4hi)__m1, (__v4hi)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_sll_pi16(__m64 __m, __m64 __count)
+{
+ return (__m64)__builtin_ia32_psllw((__v4hi)__m, __count);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_slli_pi16(__m64 __m, int __count)
+{
+ return (__m64)__builtin_ia32_psllwi((__v4hi)__m, __count);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_sll_pi32(__m64 __m, __m64 __count)
+{
+ return (__m64)__builtin_ia32_pslld((__v2si)__m, __count);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_slli_pi32(__m64 __m, int __count)
+{
+ return (__m64)__builtin_ia32_pslldi((__v2si)__m, __count);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_sll_si64(__m64 __m, __m64 __count)
+{
+ return (__m64)__builtin_ia32_psllq(__m, __count);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_slli_si64(__m64 __m, int __count)
+{
+ return (__m64)__builtin_ia32_psllqi(__m, __count);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_sra_pi16(__m64 __m, __m64 __count)
+{
+ return (__m64)__builtin_ia32_psraw((__v4hi)__m, __count);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_srai_pi16(__m64 __m, int __count)
+{
+ return (__m64)__builtin_ia32_psrawi((__v4hi)__m, __count);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_sra_pi32(__m64 __m, __m64 __count)
+{
+ return (__m64)__builtin_ia32_psrad((__v2si)__m, __count);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_srai_pi32(__m64 __m, int __count)
+{
+ return (__m64)__builtin_ia32_psradi((__v2si)__m, __count);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_srl_pi16(__m64 __m, __m64 __count)
+{
+ return (__m64)__builtin_ia32_psrlw((__v4hi)__m, __count);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_srli_pi16(__m64 __m, int __count)
+{
+ return (__m64)__builtin_ia32_psrlwi((__v4hi)__m, __count);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_srl_pi32(__m64 __m, __m64 __count)
+{
+ return (__m64)__builtin_ia32_psrld((__v2si)__m, __count);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_srli_pi32(__m64 __m, int __count)
+{
+ return (__m64)__builtin_ia32_psrldi((__v2si)__m, __count);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_srl_si64(__m64 __m, __m64 __count)
+{
+ return (__m64)__builtin_ia32_psrlq(__m, __count);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_srli_si64(__m64 __m, int __count)
+{
+ return (__m64)__builtin_ia32_psrlqi(__m, __count);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_and_si64(__m64 __m1, __m64 __m2)
+{
+ return __builtin_ia32_pand(__m1, __m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_andnot_si64(__m64 __m1, __m64 __m2)
+{
+ return __builtin_ia32_pandn(__m1, __m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_or_si64(__m64 __m1, __m64 __m2)
+{
+ return __builtin_ia32_por(__m1, __m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_xor_si64(__m64 __m1, __m64 __m2)
+{
+ return __builtin_ia32_pxor(__m1, __m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_cmpeq_pi8(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_pcmpeqb((__v8qi)__m1, (__v8qi)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_cmpeq_pi16(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_pcmpeqw((__v4hi)__m1, (__v4hi)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_cmpeq_pi32(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_pcmpeqd((__v2si)__m1, (__v2si)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_cmpgt_pi8(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_pcmpgtb((__v8qi)__m1, (__v8qi)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_cmpgt_pi16(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_pcmpgtw((__v4hi)__m1, (__v4hi)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_cmpgt_pi32(__m64 __m1, __m64 __m2)
+{
+ return (__m64)__builtin_ia32_pcmpgtd((__v2si)__m1, (__v2si)__m2);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_setzero_si64(void)
+{
+ return (__m64){ 0LL };
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_set_pi32(int __i1, int __i0)
+{
+ return (__m64)__builtin_ia32_vec_init_v2si(__i0, __i1);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_set_pi16(short __s3, short __s2, short __s1, short __s0)
+{
+ return (__m64)__builtin_ia32_vec_init_v4hi(__s0, __s1, __s2, __s3);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_set_pi8(char __b7, char __b6, char __b5, char __b4, char __b3, char __b2,
+ char __b1, char __b0)
+{
+ return (__m64)__builtin_ia32_vec_init_v8qi(__b0, __b1, __b2, __b3,
+ __b4, __b5, __b6, __b7);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_set1_pi32(int __i)
+{
+ return _mm_set_pi32(__i, __i);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_set1_pi16(short __w)
+{
+ return _mm_set_pi16(__w, __w, __w, __w);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_set1_pi8(char __b)
+{
+ return _mm_set_pi8(__b, __b, __b, __b, __b, __b, __b, __b);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_setr_pi32(int __i0, int __i1)
+{
+ return _mm_set_pi32(__i1, __i0);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_setr_pi16(short __w0, short __w1, short __w2, short __w3)
+{
+ return _mm_set_pi16(__w3, __w2, __w1, __w0);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_setr_pi8(char __b0, char __b1, char __b2, char __b3, char __b4, char __b5,
+ char __b6, char __b7)
+{
+ return _mm_set_pi8(__b7, __b6, __b5, __b4, __b3, __b2, __b1, __b0);
+}
+
+
+/* Aliases for compatibility. */
+#define _m_empty _mm_empty
+#define _m_from_int _mm_cvtsi32_si64
+#define _m_to_int _mm_cvtsi64_si32
+#define _m_packsswb _mm_packs_pi16
+#define _m_packssdw _mm_packs_pi32
+#define _m_packuswb _mm_packs_pu16
+#define _m_punpckhbw _mm_unpackhi_pi8
+#define _m_punpckhwd _mm_unpackhi_pi16
+#define _m_punpckhdq _mm_unpackhi_pi32
+#define _m_punpcklbw _mm_unpacklo_pi8
+#define _m_punpcklwd _mm_unpacklo_pi16
+#define _m_punpckldq _mm_unpacklo_pi32
+#define _m_paddb _mm_add_pi8
+#define _m_paddw _mm_add_pi16
+#define _m_paddd _mm_add_pi32
+#define _m_paddsb _mm_adds_pi8
+#define _m_paddsw _mm_adds_pi16
+#define _m_paddusb _mm_adds_pu8
+#define _m_paddusw _mm_adds_pu16
+#define _m_psubb _mm_sub_pi8
+#define _m_psubw _mm_sub_pi16
+#define _m_psubd _mm_sub_pi32
+#define _m_psubsb _mm_subs_pi8
+#define _m_psubsw _mm_subs_pi16
+#define _m_psubusb _mm_subs_pu8
+#define _m_psubusw _mm_subs_pu16
+#define _m_pmaddwd _mm_madd_pi16
+#define _m_pmulhw _mm_mulhi_pi16
+#define _m_pmullw _mm_mullo_pi16
+#define _m_psllw _mm_sll_pi16
+#define _m_psllwi _mm_slli_pi16
+#define _m_pslld _mm_sll_pi32
+#define _m_pslldi _mm_slli_pi32
+#define _m_psllq _mm_sll_si64
+#define _m_psllqi _mm_slli_si64
+#define _m_psraw _mm_sra_pi16
+#define _m_psrawi _mm_srai_pi16
+#define _m_psrad _mm_sra_pi32
+#define _m_psradi _mm_srai_pi32
+#define _m_psrlw _mm_srl_pi16
+#define _m_psrlwi _mm_srli_pi16
+#define _m_psrld _mm_srl_pi32
+#define _m_psrldi _mm_srli_pi32
+#define _m_psrlq _mm_srl_si64
+#define _m_psrlqi _mm_srli_si64
+#define _m_pand _mm_and_si64
+#define _m_pandn _mm_andnot_si64
+#define _m_por _mm_or_si64
+#define _m_pxor _mm_xor_si64
+#define _m_pcmpeqb _mm_cmpeq_pi8
+#define _m_pcmpeqw _mm_cmpeq_pi16
+#define _m_pcmpeqd _mm_cmpeq_pi32
+#define _m_pcmpgtb _mm_cmpgt_pi8
+#define _m_pcmpgtw _mm_cmpgt_pi16
+#define _m_pcmpgtd _mm_cmpgt_pi32
+
+#endif /* __MMX__ */
+
+#endif /* __MMINTRIN_H */
+
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/module.map b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/module.map
new file mode 100644
index 0000000..9f7944d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/module.map
@@ -0,0 +1,156 @@
+module _Builtin_intrinsics [system] {
+ explicit module altivec {
+ requires altivec
+ header "altivec.h"
+ }
+
+ explicit module arm {
+ requires arm
+
+ explicit module neon {
+ requires neon
+ header "arm_neon.h"
+ export *
+ }
+ }
+
+ explicit module intel {
+ requires x86
+ export *
+
+ header "immintrin.h"
+ header "x86intrin.h"
+
+ explicit module mm_malloc {
+ header "mm_malloc.h"
+ export * // note: for <stdlib.h> dependency
+ }
+
+ explicit module cpuid {
+ requires x86
+ header "cpuid.h"
+ }
+
+ explicit module mmx {
+ requires mmx
+ header "mmintrin.h"
+ }
+
+ explicit module f16c {
+ requires f16c
+ header "f16cintrin.h"
+ }
+
+ explicit module sse {
+ requires sse
+ export mmx
+ export * // note: for hackish <emmintrin.h> dependency
+ header "xmmintrin.h"
+ }
+
+ explicit module sse2 {
+ requires sse2
+ export sse
+ header "emmintrin.h"
+ }
+
+ explicit module sse3 {
+ requires sse3
+ export sse2
+ header "pmmintrin.h"
+ }
+
+ explicit module ssse3 {
+ requires ssse3
+ export sse3
+ header "tmmintrin.h"
+ }
+
+ explicit module sse4_1 {
+ requires sse41
+ export ssse3
+ header "smmintrin.h"
+ }
+
+ explicit module sse4_2 {
+ requires sse42
+ export sse4_1
+ header "nmmintrin.h"
+ }
+
+ explicit module sse4a {
+ requires sse4a
+ export sse3
+ header "ammintrin.h"
+ }
+
+ explicit module avx {
+ requires avx
+ export sse4_2
+ header "avxintrin.h"
+ }
+
+ explicit module avx2 {
+ requires avx2
+ export avx
+ header "avx2intrin.h"
+ }
+
+ explicit module bmi {
+ requires bmi
+ header "bmiintrin.h"
+ }
+
+ explicit module bmi2 {
+ requires bmi2
+ header "bmi2intrin.h"
+ }
+
+ explicit module fma {
+ requires fma
+ header "fmaintrin.h"
+ }
+
+ explicit module fma4 {
+ requires fma4
+ export sse3
+ header "fma4intrin.h"
+ }
+
+ explicit module lzcnt {
+ requires lzcnt
+ header "lzcntintrin.h"
+ }
+
+ explicit module popcnt {
+ requires popcnt
+ header "popcntintrin.h"
+ }
+
+ explicit module mm3dnow {
+ requires mm3dnow
+ header "mm3dnow.h"
+ }
+
+ explicit module xop {
+ requires xop
+ export fma4
+ header "xopintrin.h"
+ }
+
+ explicit module aes_pclmul {
+ requires aes, pclmul
+ header "wmmintrin.h"
+ }
+
+ explicit module aes {
+ requires aes
+ header "__wmmintrin_aes.h"
+ }
+
+ explicit module pclmul {
+ requires pclmul
+ header "__wmmintrin_pclmul.h"
+ }
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/nmmintrin.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/nmmintrin.h
new file mode 100644
index 0000000..f12622d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/nmmintrin.h
@@ -0,0 +1,35 @@
+/*===---- nmmintrin.h - SSE4 intrinsics ------------------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef _NMMINTRIN_H
+#define _NMMINTRIN_H
+
+#ifndef __SSE4_2__
+#error "SSE4.2 instruction set not enabled"
+#else
+
+/* To match expectations of gcc we put the sse4.2 definitions into smmintrin.h,
+ just include it now then. */
+#include <smmintrin.h>
+#endif /* __SSE4_2__ */
+#endif /* _NMMINTRIN_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/pmmintrin.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/pmmintrin.h
new file mode 100644
index 0000000..6f1fc32
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/pmmintrin.h
@@ -0,0 +1,117 @@
+/*===---- pmmintrin.h - SSE3 intrinsics ------------------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef __PMMINTRIN_H
+#define __PMMINTRIN_H
+
+#ifndef __SSE3__
+#error "SSE3 instruction set not enabled"
+#else
+
+#include <emmintrin.h>
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_lddqu_si128(__m128i const *__p)
+{
+ return (__m128i)__builtin_ia32_lddqu((char const *)__p);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_addsub_ps(__m128 __a, __m128 __b)
+{
+ return __builtin_ia32_addsubps(__a, __b);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_hadd_ps(__m128 __a, __m128 __b)
+{
+ return __builtin_ia32_haddps(__a, __b);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_hsub_ps(__m128 __a, __m128 __b)
+{
+ return __builtin_ia32_hsubps(__a, __b);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_movehdup_ps(__m128 __a)
+{
+ return __builtin_shufflevector(__a, __a, 1, 1, 3, 3);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_moveldup_ps(__m128 __a)
+{
+ return __builtin_shufflevector(__a, __a, 0, 0, 2, 2);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_addsub_pd(__m128d __a, __m128d __b)
+{
+ return __builtin_ia32_addsubpd(__a, __b);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_hadd_pd(__m128d __a, __m128d __b)
+{
+ return __builtin_ia32_haddpd(__a, __b);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_hsub_pd(__m128d __a, __m128d __b)
+{
+ return __builtin_ia32_hsubpd(__a, __b);
+}
+
+#define _mm_loaddup_pd(dp) _mm_load1_pd(dp)
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_movedup_pd(__m128d __a)
+{
+ return __builtin_shufflevector(__a, __a, 0, 0);
+}
+
+#define _MM_DENORMALS_ZERO_ON (0x0040)
+#define _MM_DENORMALS_ZERO_OFF (0x0000)
+
+#define _MM_DENORMALS_ZERO_MASK (0x0040)
+
+#define _MM_GET_DENORMALS_ZERO_MODE() (_mm_getcsr() & _MM_DENORMALS_ZERO_MASK)
+#define _MM_SET_DENORMALS_ZERO_MODE(x) (_mm_setcsr((_mm_getcsr() & ~_MM_DENORMALS_ZERO_MASK) | (x)))
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_monitor(void const *__p, unsigned __extensions, unsigned __hints)
+{
+ __builtin_ia32_monitor((void *)__p, __extensions, __hints);
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_mwait(unsigned __extensions, unsigned __hints)
+{
+ __builtin_ia32_mwait(__extensions, __hints);
+}
+
+#endif /* __SSE3__ */
+
+#endif /* __PMMINTRIN_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/popcntintrin.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/popcntintrin.h
new file mode 100644
index 0000000..d439daa
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/popcntintrin.h
@@ -0,0 +1,45 @@
+/*===---- popcntintrin.h - POPCNT intrinsics -------------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef __POPCNT__
+#error "POPCNT instruction set not enabled"
+#endif
+
+#ifndef _POPCNTINTRIN_H
+#define _POPCNTINTRIN_H
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_popcnt_u32(unsigned int __A)
+{
+ return __builtin_popcount(__A);
+}
+
+#ifdef __x86_64__
+static __inline__ long long __attribute__((__always_inline__, __nodebug__))
+_mm_popcnt_u64(unsigned long long __A)
+{
+ return __builtin_popcountll(__A);
+}
+#endif /* __x86_64__ */
+
+#endif /* _POPCNTINTRIN_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/prfchwintrin.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/prfchwintrin.h
new file mode 100644
index 0000000..9825bd8
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/prfchwintrin.h
@@ -0,0 +1,39 @@
+/*===---- prfchwintrin.h - PREFETCHW intrinsic -----------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#if !defined(__X86INTRIN_H) && !defined(_MM3DNOW_H_INCLUDED)
+#error "Never use <prfchwintrin.h> directly; include <x86intrin.h> or <mm3dnow.h> instead."
+#endif
+
+#ifndef __PRFCHWINTRIN_H
+#define __PRFCHWINTRIN_H
+
+#if defined(__PRFCHW__) || defined(__3dNOW__)
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_m_prefetchw(void *__P)
+{
+ __builtin_prefetch (__P, 1, 3 /* _MM_HINT_T0 */);
+}
+#endif
+
+#endif /* __PRFCHWINTRIN_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/rdseedintrin.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/rdseedintrin.h
new file mode 100644
index 0000000..0fef1fa
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/rdseedintrin.h
@@ -0,0 +1,52 @@
+/*===---- rdseedintrin.h - RDSEED intrinsics -------------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef __X86INTRIN_H
+#error "Never use <rdseedintrin.h> directly; include <x86intrin.h> instead."
+#endif
+
+#ifndef __RDSEEDINTRIN_H
+#define __RDSEEDINTRIN_H
+
+#ifdef __RDSEED__
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_rdseed16_step(unsigned short *__p)
+{
+ return __builtin_ia32_rdseed16_step(__p);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_rdseed32_step(unsigned int *__p)
+{
+ return __builtin_ia32_rdseed32_step(__p);
+}
+
+#ifdef __x86_64__
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_rdseed64_step(unsigned long long *__p)
+{
+ return __builtin_ia32_rdseed64_step(__p);
+}
+#endif
+#endif /* __RDSEED__ */
+#endif /* __RDSEEDINTRIN_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/rtmintrin.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/rtmintrin.h
new file mode 100644
index 0000000..26149ca
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/rtmintrin.h
@@ -0,0 +1,54 @@
+/*===---- rtmintrin.h - RTM intrinsics -------------------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef __IMMINTRIN_H
+#error "Never use <rtmintrin.h> directly; include <immintrin.h> instead."
+#endif
+
+#ifndef __RTMINTRIN_H
+#define __RTMINTRIN_H
+
+#define _XBEGIN_STARTED (~0u)
+#define _XABORT_EXPLICIT (1 << 0)
+#define _XABORT_RETRY (1 << 1)
+#define _XABORT_CONFLICT (1 << 2)
+#define _XABORT_CAPACITY (1 << 3)
+#define _XABORT_DEBUG (1 << 4)
+#define _XABORT_NESTED (1 << 5)
+#define _XABORT_CODE(x) (((x) >> 24) & 0xFF)
+
+static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))
+_xbegin(void)
+{
+ return __builtin_ia32_xbegin();
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_xend(void)
+{
+ __builtin_ia32_xend();
+}
+
+#define _xabort(imm) __builtin_ia32_xabort((imm))
+
+#endif /* __RTMINTRIN_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/smmintrin.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/smmintrin.h
new file mode 100644
index 0000000..498f6f0
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/smmintrin.h
@@ -0,0 +1,467 @@
+/*===---- smmintrin.h - SSE4 intrinsics ------------------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef _SMMINTRIN_H
+#define _SMMINTRIN_H
+
+#ifndef __SSE4_1__
+#error "SSE4.1 instruction set not enabled"
+#else
+
+#include <tmmintrin.h>
+
+/* SSE4 Rounding macros. */
+#define _MM_FROUND_TO_NEAREST_INT 0x00
+#define _MM_FROUND_TO_NEG_INF 0x01
+#define _MM_FROUND_TO_POS_INF 0x02
+#define _MM_FROUND_TO_ZERO 0x03
+#define _MM_FROUND_CUR_DIRECTION 0x04
+
+#define _MM_FROUND_RAISE_EXC 0x00
+#define _MM_FROUND_NO_EXC 0x08
+
+#define _MM_FROUND_NINT (_MM_FROUND_RAISE_EXC | _MM_FROUND_TO_NEAREST_INT)
+#define _MM_FROUND_FLOOR (_MM_FROUND_RAISE_EXC | _MM_FROUND_TO_NEG_INF)
+#define _MM_FROUND_CEIL (_MM_FROUND_RAISE_EXC | _MM_FROUND_TO_POS_INF)
+#define _MM_FROUND_TRUNC (_MM_FROUND_RAISE_EXC | _MM_FROUND_TO_ZERO)
+#define _MM_FROUND_RINT (_MM_FROUND_RAISE_EXC | _MM_FROUND_CUR_DIRECTION)
+#define _MM_FROUND_NEARBYINT (_MM_FROUND_NO_EXC | _MM_FROUND_CUR_DIRECTION)
+
+#define _mm_ceil_ps(X) _mm_round_ps((X), _MM_FROUND_CEIL)
+#define _mm_ceil_pd(X) _mm_round_pd((X), _MM_FROUND_CEIL)
+#define _mm_ceil_ss(X, Y) _mm_round_ss((X), (Y), _MM_FROUND_CEIL)
+#define _mm_ceil_sd(X, Y) _mm_round_sd((X), (Y), _MM_FROUND_CEIL)
+
+#define _mm_floor_ps(X) _mm_round_ps((X), _MM_FROUND_FLOOR)
+#define _mm_floor_pd(X) _mm_round_pd((X), _MM_FROUND_FLOOR)
+#define _mm_floor_ss(X, Y) _mm_round_ss((X), (Y), _MM_FROUND_FLOOR)
+#define _mm_floor_sd(X, Y) _mm_round_sd((X), (Y), _MM_FROUND_FLOOR)
+
+#define _mm_round_ps(X, M) __extension__ ({ \
+ __m128 __X = (X); \
+ (__m128) __builtin_ia32_roundps((__v4sf)__X, (M)); })
+
+#define _mm_round_ss(X, Y, M) __extension__ ({ \
+ __m128 __X = (X); \
+ __m128 __Y = (Y); \
+ (__m128) __builtin_ia32_roundss((__v4sf)__X, (__v4sf)__Y, (M)); })
+
+#define _mm_round_pd(X, M) __extension__ ({ \
+ __m128d __X = (X); \
+ (__m128d) __builtin_ia32_roundpd((__v2df)__X, (M)); })
+
+#define _mm_round_sd(X, Y, M) __extension__ ({ \
+ __m128d __X = (X); \
+ __m128d __Y = (Y); \
+ (__m128d) __builtin_ia32_roundsd((__v2df)__X, (__v2df)__Y, (M)); })
+
+/* SSE4 Packed Blending Intrinsics. */
+#define _mm_blend_pd(V1, V2, M) __extension__ ({ \
+ __m128d __V1 = (V1); \
+ __m128d __V2 = (V2); \
+ (__m128d) __builtin_ia32_blendpd ((__v2df)__V1, (__v2df)__V2, (M)); })
+
+#define _mm_blend_ps(V1, V2, M) __extension__ ({ \
+ __m128 __V1 = (V1); \
+ __m128 __V2 = (V2); \
+ (__m128) __builtin_ia32_blendps ((__v4sf)__V1, (__v4sf)__V2, (M)); })
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_blendv_pd (__m128d __V1, __m128d __V2, __m128d __M)
+{
+ return (__m128d) __builtin_ia32_blendvpd ((__v2df)__V1, (__v2df)__V2,
+ (__v2df)__M);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_blendv_ps (__m128 __V1, __m128 __V2, __m128 __M)
+{
+ return (__m128) __builtin_ia32_blendvps ((__v4sf)__V1, (__v4sf)__V2,
+ (__v4sf)__M);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_blendv_epi8 (__m128i __V1, __m128i __V2, __m128i __M)
+{
+ return (__m128i) __builtin_ia32_pblendvb128 ((__v16qi)__V1, (__v16qi)__V2,
+ (__v16qi)__M);
+}
+
+#define _mm_blend_epi16(V1, V2, M) __extension__ ({ \
+ __m128i __V1 = (V1); \
+ __m128i __V2 = (V2); \
+ (__m128i) __builtin_ia32_pblendw128 ((__v8hi)__V1, (__v8hi)__V2, (M)); })
+
+/* SSE4 Dword Multiply Instructions. */
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_mullo_epi32 (__m128i __V1, __m128i __V2)
+{
+ return (__m128i) ((__v4si)__V1 * (__v4si)__V2);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_mul_epi32 (__m128i __V1, __m128i __V2)
+{
+ return (__m128i) __builtin_ia32_pmuldq128 ((__v4si)__V1, (__v4si)__V2);
+}
+
+/* SSE4 Floating Point Dot Product Instructions. */
+#define _mm_dp_ps(X, Y, M) __extension__ ({ \
+ __m128 __X = (X); \
+ __m128 __Y = (Y); \
+ (__m128) __builtin_ia32_dpps((__v4sf)__X, (__v4sf)__Y, (M)); })
+
+#define _mm_dp_pd(X, Y, M) __extension__ ({\
+ __m128d __X = (X); \
+ __m128d __Y = (Y); \
+ (__m128d) __builtin_ia32_dppd((__v2df)__X, (__v2df)__Y, (M)); })
+
+/* SSE4 Streaming Load Hint Instruction. */
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_stream_load_si128 (__m128i *__V)
+{
+ return (__m128i) __builtin_ia32_movntdqa ((__v2di *) __V);
+}
+
+/* SSE4 Packed Integer Min/Max Instructions. */
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_min_epi8 (__m128i __V1, __m128i __V2)
+{
+ return (__m128i) __builtin_ia32_pminsb128 ((__v16qi) __V1, (__v16qi) __V2);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_max_epi8 (__m128i __V1, __m128i __V2)
+{
+ return (__m128i) __builtin_ia32_pmaxsb128 ((__v16qi) __V1, (__v16qi) __V2);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_min_epu16 (__m128i __V1, __m128i __V2)
+{
+ return (__m128i) __builtin_ia32_pminuw128 ((__v8hi) __V1, (__v8hi) __V2);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_max_epu16 (__m128i __V1, __m128i __V2)
+{
+ return (__m128i) __builtin_ia32_pmaxuw128 ((__v8hi) __V1, (__v8hi) __V2);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_min_epi32 (__m128i __V1, __m128i __V2)
+{
+ return (__m128i) __builtin_ia32_pminsd128 ((__v4si) __V1, (__v4si) __V2);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_max_epi32 (__m128i __V1, __m128i __V2)
+{
+ return (__m128i) __builtin_ia32_pmaxsd128 ((__v4si) __V1, (__v4si) __V2);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_min_epu32 (__m128i __V1, __m128i __V2)
+{
+ return (__m128i) __builtin_ia32_pminud128((__v4si) __V1, (__v4si) __V2);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_max_epu32 (__m128i __V1, __m128i __V2)
+{
+ return (__m128i) __builtin_ia32_pmaxud128((__v4si) __V1, (__v4si) __V2);
+}
+
+/* SSE4 Insertion and Extraction from XMM Register Instructions. */
+#define _mm_insert_ps(X, Y, N) __builtin_ia32_insertps128((X), (Y), (N))
+#define _mm_extract_ps(X, N) (__extension__ \
+ ({ union { int __i; float __f; } __t; \
+ __v4sf __a = (__v4sf)(X); \
+ __t.__f = __a[N]; \
+ __t.__i;}))
+
+/* Miscellaneous insert and extract macros. */
+/* Extract a single-precision float from X at index N into D. */
+#define _MM_EXTRACT_FLOAT(D, X, N) (__extension__ ({ __v4sf __a = (__v4sf)(X); \
+ (D) = __a[N]; }))
+
+/* Or together 2 sets of indexes (X and Y) with the zeroing bits (Z) to create
+ an index suitable for _mm_insert_ps. */
+#define _MM_MK_INSERTPS_NDX(X, Y, Z) (((X) << 6) | ((Y) << 4) | (Z))
+
+/* Extract a float from X at index N into the first index of the return. */
+#define _MM_PICK_OUT_PS(X, N) _mm_insert_ps (_mm_setzero_ps(), (X), \
+ _MM_MK_INSERTPS_NDX((N), 0, 0x0e))
+
+/* Insert int into packed integer array at index. */
+#define _mm_insert_epi8(X, I, N) (__extension__ ({ __v16qi __a = (__v16qi)(X); \
+ __a[(N)] = (I); \
+ __a;}))
+#define _mm_insert_epi32(X, I, N) (__extension__ ({ __v4si __a = (__v4si)(X); \
+ __a[(N)] = (I); \
+ __a;}))
+#ifdef __x86_64__
+#define _mm_insert_epi64(X, I, N) (__extension__ ({ __v2di __a = (__v2di)(X); \
+ __a[(N)] = (I); \
+ __a;}))
+#endif /* __x86_64__ */
+
+/* Extract int from packed integer array at index. This returns the element
+ * as a zero extended value, so it is unsigned.
+ */
+#define _mm_extract_epi8(X, N) (__extension__ ({ __v16qi __a = (__v16qi)(X); \
+ (unsigned char)__a[(N)];}))
+#define _mm_extract_epi32(X, N) (__extension__ ({ __v4si __a = (__v4si)(X); \
+ (unsigned)__a[(N)];}))
+#ifdef __x86_64__
+#define _mm_extract_epi64(X, N) (__extension__ ({ __v2di __a = (__v2di)(X); \
+ __a[(N)];}))
+#endif /* __x86_64 */
+
+/* SSE4 128-bit Packed Integer Comparisons. */
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_testz_si128(__m128i __M, __m128i __V)
+{
+ return __builtin_ia32_ptestz128((__v2di)__M, (__v2di)__V);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_testc_si128(__m128i __M, __m128i __V)
+{
+ return __builtin_ia32_ptestc128((__v2di)__M, (__v2di)__V);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_testnzc_si128(__m128i __M, __m128i __V)
+{
+ return __builtin_ia32_ptestnzc128((__v2di)__M, (__v2di)__V);
+}
+
+#define _mm_test_all_ones(V) _mm_testc_si128((V), _mm_cmpeq_epi32((V), (V)))
+#define _mm_test_mix_ones_zeros(M, V) _mm_testnzc_si128((M), (V))
+#define _mm_test_all_zeros(M, V) _mm_testz_si128 ((M), (V))
+
+/* SSE4 64-bit Packed Integer Comparisons. */
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cmpeq_epi64(__m128i __V1, __m128i __V2)
+{
+ return (__m128i)((__v2di)__V1 == (__v2di)__V2);
+}
+
+/* SSE4 Packed Integer Sign-Extension. */
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cvtepi8_epi16(__m128i __V)
+{
+ return (__m128i) __builtin_ia32_pmovsxbw128((__v16qi) __V);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cvtepi8_epi32(__m128i __V)
+{
+ return (__m128i) __builtin_ia32_pmovsxbd128((__v16qi) __V);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cvtepi8_epi64(__m128i __V)
+{
+ return (__m128i) __builtin_ia32_pmovsxbq128((__v16qi) __V);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cvtepi16_epi32(__m128i __V)
+{
+ return (__m128i) __builtin_ia32_pmovsxwd128((__v8hi) __V);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cvtepi16_epi64(__m128i __V)
+{
+ return (__m128i) __builtin_ia32_pmovsxwq128((__v8hi)__V);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cvtepi32_epi64(__m128i __V)
+{
+ return (__m128i) __builtin_ia32_pmovsxdq128((__v4si)__V);
+}
+
+/* SSE4 Packed Integer Zero-Extension. */
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cvtepu8_epi16(__m128i __V)
+{
+ return (__m128i) __builtin_ia32_pmovzxbw128((__v16qi) __V);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cvtepu8_epi32(__m128i __V)
+{
+ return (__m128i) __builtin_ia32_pmovzxbd128((__v16qi)__V);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cvtepu8_epi64(__m128i __V)
+{
+ return (__m128i) __builtin_ia32_pmovzxbq128((__v16qi)__V);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cvtepu16_epi32(__m128i __V)
+{
+ return (__m128i) __builtin_ia32_pmovzxwd128((__v8hi)__V);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cvtepu16_epi64(__m128i __V)
+{
+ return (__m128i) __builtin_ia32_pmovzxwq128((__v8hi)__V);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cvtepu32_epi64(__m128i __V)
+{
+ return (__m128i) __builtin_ia32_pmovzxdq128((__v4si)__V);
+}
+
+/* SSE4 Pack with Unsigned Saturation. */
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_packus_epi32(__m128i __V1, __m128i __V2)
+{
+ return (__m128i) __builtin_ia32_packusdw128((__v4si)__V1, (__v4si)__V2);
+}
+
+/* SSE4 Multiple Packed Sums of Absolute Difference. */
+#define _mm_mpsadbw_epu8(X, Y, M) __extension__ ({ \
+ __m128i __X = (X); \
+ __m128i __Y = (Y); \
+ (__m128i) __builtin_ia32_mpsadbw128((__v16qi)__X, (__v16qi)__Y, (M)); })
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_minpos_epu16(__m128i __V)
+{
+ return (__m128i) __builtin_ia32_phminposuw128((__v8hi)__V);
+}
+
+/* These definitions are normally in nmmintrin.h, but gcc puts them in here
+ so we'll do the same. */
+#ifdef __SSE4_2__
+
+/* These specify the type of data that we're comparing. */
+#define _SIDD_UBYTE_OPS 0x00
+#define _SIDD_UWORD_OPS 0x01
+#define _SIDD_SBYTE_OPS 0x02
+#define _SIDD_SWORD_OPS 0x03
+
+/* These specify the type of comparison operation. */
+#define _SIDD_CMP_EQUAL_ANY 0x00
+#define _SIDD_CMP_RANGES 0x04
+#define _SIDD_CMP_EQUAL_EACH 0x08
+#define _SIDD_CMP_EQUAL_ORDERED 0x0c
+
+/* These macros specify the polarity of the operation. */
+#define _SIDD_POSITIVE_POLARITY 0x00
+#define _SIDD_NEGATIVE_POLARITY 0x10
+#define _SIDD_MASKED_POSITIVE_POLARITY 0x20
+#define _SIDD_MASKED_NEGATIVE_POLARITY 0x30
+
+/* These macros are used in _mm_cmpXstri() to specify the return. */
+#define _SIDD_LEAST_SIGNIFICANT 0x00
+#define _SIDD_MOST_SIGNIFICANT 0x40
+
+/* These macros are used in _mm_cmpXstri() to specify the return. */
+#define _SIDD_BIT_MASK 0x00
+#define _SIDD_UNIT_MASK 0x40
+
+/* SSE4.2 Packed Comparison Intrinsics. */
+#define _mm_cmpistrm(A, B, M) __builtin_ia32_pcmpistrm128((A), (B), (M))
+#define _mm_cmpistri(A, B, M) __builtin_ia32_pcmpistri128((A), (B), (M))
+
+#define _mm_cmpestrm(A, LA, B, LB, M) \
+ __builtin_ia32_pcmpestrm128((A), (LA), (B), (LB), (M))
+#define _mm_cmpestri(A, LA, B, LB, M) \
+ __builtin_ia32_pcmpestri128((A), (LA), (B), (LB), (M))
+
+/* SSE4.2 Packed Comparison Intrinsics and EFlag Reading. */
+#define _mm_cmpistra(A, B, M) \
+ __builtin_ia32_pcmpistria128((A), (B), (M))
+#define _mm_cmpistrc(A, B, M) \
+ __builtin_ia32_pcmpistric128((A), (B), (M))
+#define _mm_cmpistro(A, B, M) \
+ __builtin_ia32_pcmpistrio128((A), (B), (M))
+#define _mm_cmpistrs(A, B, M) \
+ __builtin_ia32_pcmpistris128((A), (B), (M))
+#define _mm_cmpistrz(A, B, M) \
+ __builtin_ia32_pcmpistriz128((A), (B), (M))
+
+#define _mm_cmpestra(A, LA, B, LB, M) \
+ __builtin_ia32_pcmpestria128((A), (LA), (B), (LB), (M))
+#define _mm_cmpestrc(A, LA, B, LB, M) \
+ __builtin_ia32_pcmpestric128((A), (LA), (B), (LB), (M))
+#define _mm_cmpestro(A, LA, B, LB, M) \
+ __builtin_ia32_pcmpestrio128((A), (LA), (B), (LB), (M))
+#define _mm_cmpestrs(A, LA, B, LB, M) \
+ __builtin_ia32_pcmpestris128((A), (LA), (B), (LB), (M))
+#define _mm_cmpestrz(A, LA, B, LB, M) \
+ __builtin_ia32_pcmpestriz128((A), (LA), (B), (LB), (M))
+
+/* SSE4.2 Compare Packed Data -- Greater Than. */
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cmpgt_epi64(__m128i __V1, __m128i __V2)
+{
+ return (__m128i)((__v2di)__V1 > (__v2di)__V2);
+}
+
+/* SSE4.2 Accumulate CRC32. */
+static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))
+_mm_crc32_u8(unsigned int __C, unsigned char __D)
+{
+ return __builtin_ia32_crc32qi(__C, __D);
+}
+
+static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))
+_mm_crc32_u16(unsigned int __C, unsigned short __D)
+{
+ return __builtin_ia32_crc32hi(__C, __D);
+}
+
+static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))
+_mm_crc32_u32(unsigned int __C, unsigned int __D)
+{
+ return __builtin_ia32_crc32si(__C, __D);
+}
+
+#ifdef __x86_64__
+static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__))
+_mm_crc32_u64(unsigned long long __C, unsigned long long __D)
+{
+ return __builtin_ia32_crc32di(__C, __D);
+}
+#endif /* __x86_64__ */
+
+#ifdef __POPCNT__
+#include <popcntintrin.h>
+#endif
+
+#endif /* __SSE4_2__ */
+#endif /* __SSE4_1__ */
+
+#endif /* _SMMINTRIN_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/stdalign.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/stdalign.h
new file mode 100644
index 0000000..3738d12
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/stdalign.h
@@ -0,0 +1,35 @@
+/*===---- stdalign.h - Standard header for alignment ------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef __STDALIGN_H
+#define __STDALIGN_H
+
+#ifndef __cplusplus
+#define alignas _Alignas
+#define alignof _Alignof
+#endif
+
+#define __alignas_is_defined 1
+#define __alignof_is_defined 1
+
+#endif /* __STDALIGN_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/stdarg.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/stdarg.h
new file mode 100644
index 0000000..2957bf0
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/stdarg.h
@@ -0,0 +1,50 @@
+/*===---- stdarg.h - Variable argument handling ----------------------------===
+ *
+ * Copyright (c) 2008 Eli Friedman
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef __STDARG_H
+#define __STDARG_H
+
+#ifndef _VA_LIST
+typedef __builtin_va_list va_list;
+#define _VA_LIST
+#endif
+#define va_start(ap, param) __builtin_va_start(ap, param)
+#define va_end(ap) __builtin_va_end(ap)
+#define va_arg(ap, type) __builtin_va_arg(ap, type)
+
+/* GCC always defines __va_copy, but does not define va_copy unless in c99 mode
+ * or -ansi is not specified, since it was not part of C90.
+ */
+#define __va_copy(d,s) __builtin_va_copy(d,s)
+
+#if __STDC_VERSION__ >= 199900L || __cplusplus >= 201103L || !defined(__STRICT_ANSI__)
+#define va_copy(dest, src) __builtin_va_copy(dest, src)
+#endif
+
+/* Hack required to make standard headers work, at least on Ubuntu */
+#define __GNUC_VA_LIST 1
+typedef __builtin_va_list __gnuc_va_list;
+
+#endif /* __STDARG_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/stdbool.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/stdbool.h
new file mode 100644
index 0000000..0467893
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/stdbool.h
@@ -0,0 +1,44 @@
+/*===---- stdbool.h - Standard header for booleans -------------------------===
+ *
+ * Copyright (c) 2008 Eli Friedman
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef __STDBOOL_H
+#define __STDBOOL_H
+
+/* Don't define bool, true, and false in C++, except as a GNU extension. */
+#ifndef __cplusplus
+#define bool _Bool
+#define true 1
+#define false 0
+#elif defined(__GNUC__) && !defined(__STRICT_ANSI__)
+/* Define _Bool, bool, false, true as a GNU extension. */
+#define _Bool bool
+#define bool bool
+#define false false
+#define true true
+#endif
+
+#define __bool_true_false_are_defined 1
+
+#endif /* __STDBOOL_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/stddef.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/stddef.h
new file mode 100644
index 0000000..6a64d6d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/stddef.h
@@ -0,0 +1,102 @@
+/*===---- stddef.h - Basic type definitions --------------------------------===
+ *
+ * Copyright (c) 2008 Eli Friedman
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef __STDDEF_H
+#define __STDDEF_H
+
+#if !defined(_PTRDIFF_T) || __has_feature(modules)
+/* Always define ptrdiff_t when modules are available. */
+#if !__has_feature(modules)
+#define _PTRDIFF_T
+#endif
+typedef __PTRDIFF_TYPE__ ptrdiff_t;
+#endif
+
+#if !defined(_SIZE_T) || __has_feature(modules)
+/* Always define size_t when modules are available. */
+#if !__has_feature(modules)
+#define _SIZE_T
+#endif
+typedef __SIZE_TYPE__ size_t;
+#endif
+
+/* ISO9899:2011 7.20 (C11 Annex K): Define rsize_t if __STDC_WANT_LIB_EXT1__ is
+ * enabled. */
+#if (defined(__STDC_WANT_LIB_EXT1__) && __STDC_WANT_LIB_EXT1__ >= 1 && \
+ !defined(_RSIZE_T)) || __has_feature(modules)
+/* Always define rsize_t when modules are available. */
+#if !__has_feature(modules)
+#define _RSIZE_T
+#endif
+typedef __SIZE_TYPE__ rsize_t;
+#endif
+
+#ifndef __cplusplus
+/* Always define wchar_t when modules are available. */
+#if !defined(_WCHAR_T) || __has_feature(modules)
+#if !__has_feature(modules)
+#define _WCHAR_T
+#if defined(_MSC_EXTENSIONS)
+#define _WCHAR_T_DEFINED
+#endif
+#endif
+typedef __WCHAR_TYPE__ wchar_t;
+#endif
+#endif
+
+#undef NULL
+#ifdef __cplusplus
+# if !defined(__MINGW32__) && !defined(_MSC_VER)
+# define NULL __null
+# else
+# define NULL 0
+# endif
+#else
+# define NULL ((void*)0)
+#endif
+
+#ifdef __cplusplus
+#if defined(_MSC_EXTENSIONS) && defined(_NATIVE_NULLPTR_SUPPORTED)
+namespace std { typedef decltype(nullptr) nullptr_t; }
+using ::std::nullptr_t;
+#endif
+#endif
+
+#define offsetof(t, d) __builtin_offsetof(t, d)
+
+#endif /* __STDDEF_H */
+
+/* Some C libraries expect to see a wint_t here. Others (notably MinGW) will use
+__WINT_TYPE__ directly; accommodate both by requiring __need_wint_t */
+#if defined(__need_wint_t)
+/* Always define wint_t when modules are available. */
+#if !defined(_WINT_T) || __has_feature(modules)
+#if !__has_feature(modules)
+#define _WINT_T
+#endif
+typedef __WINT_TYPE__ wint_t;
+#endif
+#undef __need_wint_t
+#endif /* __need_wint_t */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/stdint.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/stdint.h
new file mode 100644
index 0000000..11529c0
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/stdint.h
@@ -0,0 +1,708 @@
+/*===---- stdint.h - Standard header for sized integer types --------------===*\
+ *
+ * Copyright (c) 2009 Chris Lattner
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+\*===----------------------------------------------------------------------===*/
+
+#ifndef __CLANG_STDINT_H
+#define __CLANG_STDINT_H
+
+/* If we're hosted, fall back to the system's stdint.h, which might have
+ * additional definitions.
+ */
+#if __STDC_HOSTED__ && \
+ defined(__has_include_next) && __has_include_next(<stdint.h>)
+
+// C99 7.18.3 Limits of other integer types
+//
+// Footnote 219, 220: C++ implementations should define these macros only when
+// __STDC_LIMIT_MACROS is defined before <stdint.h> is included.
+//
+// Footnote 222: C++ implementations should define these macros only when
+// __STDC_CONSTANT_MACROS is defined before <stdint.h> is included.
+//
+// C++11 [cstdint.syn]p2:
+//
+// The macros defined by <cstdint> are provided unconditionally. In particular,
+// the symbols __STDC_LIMIT_MACROS and __STDC_CONSTANT_MACROS (mentioned in
+// footnotes 219, 220, and 222 in the C standard) play no role in C++.
+//
+// C11 removed the problematic footnotes.
+//
+// Work around this inconsistency by always defining those macros in C++ mode,
+// so that a C library implementation which follows the C99 standard can be
+// used in C++.
+# ifdef __cplusplus
+# if !defined(__STDC_LIMIT_MACROS)
+# define __STDC_LIMIT_MACROS
+# define __STDC_LIMIT_MACROS_DEFINED_BY_CLANG
+# endif
+# if !defined(__STDC_CONSTANT_MACROS)
+# define __STDC_CONSTANT_MACROS
+# define __STDC_CONSTANT_MACROS_DEFINED_BY_CLANG
+# endif
+# endif
+
+# include_next <stdint.h>
+
+# ifdef __STDC_LIMIT_MACROS_DEFINED_BY_CLANG
+# undef __STDC_LIMIT_MACROS
+# undef __STDC_LIMIT_MACROS_DEFINED_BY_CLANG
+# endif
+# ifdef __STDC_CONSTANT_MACROS_DEFINED_BY_CLANG
+# undef __STDC_CONSTANT_MACROS
+# undef __STDC_CONSTANT_MACROS_DEFINED_BY_CLANG
+# endif
+
+#else
+
+/* C99 7.18.1.1 Exact-width integer types.
+ * C99 7.18.1.2 Minimum-width integer types.
+ * C99 7.18.1.3 Fastest minimum-width integer types.
+ *
+ * The standard requires that exact-width type be defined for 8-, 16-, 32-, and
+ * 64-bit types if they are implemented. Other exact width types are optional.
+ * This implementation defines an exact-width types for every integer width
+ * that is represented in the standard integer types.
+ *
+ * The standard also requires minimum-width types be defined for 8-, 16-, 32-,
+ * and 64-bit widths regardless of whether there are corresponding exact-width
+ * types.
+ *
+ * To accommodate targets that are missing types that are exactly 8, 16, 32, or
+ * 64 bits wide, this implementation takes an approach of cascading
+ * redefintions, redefining __int_leastN_t to successively smaller exact-width
+ * types. It is therefore important that the types are defined in order of
+ * descending widths.
+ *
+ * We currently assume that the minimum-width types and the fastest
+ * minimum-width types are the same. This is allowed by the standard, but is
+ * suboptimal.
+ *
+ * In violation of the standard, some targets do not implement a type that is
+ * wide enough to represent all of the required widths (8-, 16-, 32-, 64-bit).
+ * To accommodate these targets, a required minimum-width type is only
+ * defined if there exists an exact-width type of equal or greater width.
+ */
+
+#ifdef __INT64_TYPE__
+# ifndef __int8_t_defined /* glibc sys/types.h also defines int64_t*/
+typedef signed __INT64_TYPE__ int64_t;
+# endif /* __int8_t_defined */
+typedef unsigned __INT64_TYPE__ uint64_t;
+# define __int_least64_t int64_t
+# define __uint_least64_t uint64_t
+# define __int_least32_t int64_t
+# define __uint_least32_t uint64_t
+# define __int_least16_t int64_t
+# define __uint_least16_t uint64_t
+# define __int_least8_t int64_t
+# define __uint_least8_t uint64_t
+#endif /* __INT64_TYPE__ */
+
+#ifdef __int_least64_t
+typedef __int_least64_t int_least64_t;
+typedef __uint_least64_t uint_least64_t;
+typedef __int_least64_t int_fast64_t;
+typedef __uint_least64_t uint_fast64_t;
+#endif /* __int_least64_t */
+
+#ifdef __INT56_TYPE__
+typedef signed __INT56_TYPE__ int56_t;
+typedef unsigned __INT56_TYPE__ uint56_t;
+typedef int56_t int_least56_t;
+typedef uint56_t uint_least56_t;
+typedef int56_t int_fast56_t;
+typedef uint56_t uint_fast56_t;
+# define __int_least32_t int56_t
+# define __uint_least32_t uint56_t
+# define __int_least16_t int56_t
+# define __uint_least16_t uint56_t
+# define __int_least8_t int56_t
+# define __uint_least8_t uint56_t
+#endif /* __INT56_TYPE__ */
+
+
+#ifdef __INT48_TYPE__
+typedef signed __INT48_TYPE__ int48_t;
+typedef unsigned __INT48_TYPE__ uint48_t;
+typedef int48_t int_least48_t;
+typedef uint48_t uint_least48_t;
+typedef int48_t int_fast48_t;
+typedef uint48_t uint_fast48_t;
+# define __int_least32_t int48_t
+# define __uint_least32_t uint48_t
+# define __int_least16_t int48_t
+# define __uint_least16_t uint48_t
+# define __int_least8_t int48_t
+# define __uint_least8_t uint48_t
+#endif /* __INT48_TYPE__ */
+
+
+#ifdef __INT40_TYPE__
+typedef signed __INT40_TYPE__ int40_t;
+typedef unsigned __INT40_TYPE__ uint40_t;
+typedef int40_t int_least40_t;
+typedef uint40_t uint_least40_t;
+typedef int40_t int_fast40_t;
+typedef uint40_t uint_fast40_t;
+# define __int_least32_t int40_t
+# define __uint_least32_t uint40_t
+# define __int_least16_t int40_t
+# define __uint_least16_t uint40_t
+# define __int_least8_t int40_t
+# define __uint_least8_t uint40_t
+#endif /* __INT40_TYPE__ */
+
+
+#ifdef __INT32_TYPE__
+
+# ifndef __int8_t_defined /* glibc sys/types.h also defines int32_t*/
+typedef signed __INT32_TYPE__ int32_t;
+# endif /* __int8_t_defined */
+
+# ifndef __uint32_t_defined /* more glibc compatibility */
+# define __uint32_t_defined
+typedef unsigned __INT32_TYPE__ uint32_t;
+# endif /* __uint32_t_defined */
+
+# define __int_least32_t int32_t
+# define __uint_least32_t uint32_t
+# define __int_least16_t int32_t
+# define __uint_least16_t uint32_t
+# define __int_least8_t int32_t
+# define __uint_least8_t uint32_t
+#endif /* __INT32_TYPE__ */
+
+#ifdef __int_least32_t
+typedef __int_least32_t int_least32_t;
+typedef __uint_least32_t uint_least32_t;
+typedef __int_least32_t int_fast32_t;
+typedef __uint_least32_t uint_fast32_t;
+#endif /* __int_least32_t */
+
+#ifdef __INT24_TYPE__
+typedef signed __INT24_TYPE__ int24_t;
+typedef unsigned __INT24_TYPE__ uint24_t;
+typedef int24_t int_least24_t;
+typedef uint24_t uint_least24_t;
+typedef int24_t int_fast24_t;
+typedef uint24_t uint_fast24_t;
+# define __int_least16_t int24_t
+# define __uint_least16_t uint24_t
+# define __int_least8_t int24_t
+# define __uint_least8_t uint24_t
+#endif /* __INT24_TYPE__ */
+
+#ifdef __INT16_TYPE__
+#ifndef __int8_t_defined /* glibc sys/types.h also defines int16_t*/
+typedef signed __INT16_TYPE__ int16_t;
+#endif /* __int8_t_defined */
+typedef unsigned __INT16_TYPE__ uint16_t;
+# define __int_least16_t int16_t
+# define __uint_least16_t uint16_t
+# define __int_least8_t int16_t
+# define __uint_least8_t uint16_t
+#endif /* __INT16_TYPE__ */
+
+#ifdef __int_least16_t
+typedef __int_least16_t int_least16_t;
+typedef __uint_least16_t uint_least16_t;
+typedef __int_least16_t int_fast16_t;
+typedef __uint_least16_t uint_fast16_t;
+#endif /* __int_least16_t */
+
+
+#ifdef __INT8_TYPE__
+#ifndef __int8_t_defined /* glibc sys/types.h also defines int8_t*/
+typedef signed __INT8_TYPE__ int8_t;
+#endif /* __int8_t_defined */
+typedef unsigned __INT8_TYPE__ uint8_t;
+# define __int_least8_t int8_t
+# define __uint_least8_t uint8_t
+#endif /* __INT8_TYPE__ */
+
+#ifdef __int_least8_t
+typedef __int_least8_t int_least8_t;
+typedef __uint_least8_t uint_least8_t;
+typedef __int_least8_t int_fast8_t;
+typedef __uint_least8_t uint_fast8_t;
+#endif /* __int_least8_t */
+
+/* prevent glibc sys/types.h from defining conflicting types */
+#ifndef __int8_t_defined
+# define __int8_t_defined
+#endif /* __int8_t_defined */
+
+/* C99 7.18.1.4 Integer types capable of holding object pointers.
+ */
+#define __stdint_join3(a,b,c) a ## b ## c
+
+#define __intn_t(n) __stdint_join3( int, n, _t)
+#define __uintn_t(n) __stdint_join3(uint, n, _t)
+
+#ifndef _INTPTR_T
+#ifndef __intptr_t_defined
+typedef __intn_t(__INTPTR_WIDTH__) intptr_t;
+#define __intptr_t_defined
+#define _INTPTR_T
+#endif
+#endif
+
+#ifndef _UINTPTR_T
+typedef __uintn_t(__INTPTR_WIDTH__) uintptr_t;
+#define _UINTPTR_T
+#endif
+
+/* C99 7.18.1.5 Greatest-width integer types.
+ */
+typedef __INTMAX_TYPE__ intmax_t;
+typedef __UINTMAX_TYPE__ uintmax_t;
+
+/* C99 7.18.4 Macros for minimum-width integer constants.
+ *
+ * The standard requires that integer constant macros be defined for all the
+ * minimum-width types defined above. As 8-, 16-, 32-, and 64-bit minimum-width
+ * types are required, the corresponding integer constant macros are defined
+ * here. This implementation also defines minimum-width types for every other
+ * integer width that the target implements, so corresponding macros are
+ * defined below, too.
+ *
+ * These macros are defined using the same successive-shrinking approach as
+ * the type definitions above. It is likewise important that macros are defined
+ * in order of decending width.
+ *
+ * Note that C++ should not check __STDC_CONSTANT_MACROS here, contrary to the
+ * claims of the C standard (see C++ 18.3.1p2, [cstdint.syn]).
+ */
+
+#define __int_c_join(a, b) a ## b
+#define __int_c(v, suffix) __int_c_join(v, suffix)
+#define __uint_c(v, suffix) __int_c_join(v##U, suffix)
+
+
+#ifdef __INT64_TYPE__
+# ifdef __INT64_C_SUFFIX__
+# define __int64_c_suffix __INT64_C_SUFFIX__
+# define __int32_c_suffix __INT64_C_SUFFIX__
+# define __int16_c_suffix __INT64_C_SUFFIX__
+# define __int8_c_suffix __INT64_C_SUFFIX__
+# else
+# undef __int64_c_suffix
+# undef __int32_c_suffix
+# undef __int16_c_suffix
+# undef __int8_c_suffix
+# endif /* __INT64_C_SUFFIX__ */
+#endif /* __INT64_TYPE__ */
+
+#ifdef __int_least64_t
+# ifdef __int64_c_suffix
+# define INT64_C(v) __int_c(v, __int64_c_suffix)
+# define UINT64_C(v) __uint_c(v, __int64_c_suffix)
+# else
+# define INT64_C(v) v
+# define UINT64_C(v) v ## U
+# endif /* __int64_c_suffix */
+#endif /* __int_least64_t */
+
+
+#ifdef __INT56_TYPE__
+# ifdef __INT56_C_SUFFIX__
+# define INT56_C(v) __int_c(v, __INT56_C_SUFFIX__)
+# define UINT56_C(v) __uint_c(v, __INT56_C_SUFFIX__)
+# define __int32_c_suffix __INT56_C_SUFFIX__
+# define __int16_c_suffix __INT56_C_SUFFIX__
+# define __int8_c_suffix __INT56_C_SUFFIX__
+# else
+# define INT56_C(v) v
+# define UINT56_C(v) v ## U
+# undef __int32_c_suffix
+# undef __int16_c_suffix
+# undef __int8_c_suffix
+# endif /* __INT56_C_SUFFIX__ */
+#endif /* __INT56_TYPE__ */
+
+
+#ifdef __INT48_TYPE__
+# ifdef __INT48_C_SUFFIX__
+# define INT48_C(v) __int_c(v, __INT48_C_SUFFIX__)
+# define UINT48_C(v) __uint_c(v, __INT48_C_SUFFIX__)
+# define __int32_c_suffix __INT48_C_SUFFIX__
+# define __int16_c_suffix __INT48_C_SUFFIX__
+# define __int8_c_suffix __INT48_C_SUFFIX__
+# else
+# define INT48_C(v) v
+# define UINT48_C(v) v ## U
+# undef __int32_c_suffix
+# undef __int16_c_suffix
+# undef __int8_c_suffix
+# endif /* __INT48_C_SUFFIX__ */
+#endif /* __INT48_TYPE__ */
+
+
+#ifdef __INT40_TYPE__
+# ifdef __INT40_C_SUFFIX__
+# define INT40_C(v) __int_c(v, __INT40_C_SUFFIX__)
+# define UINT40_C(v) __uint_c(v, __INT40_C_SUFFIX__)
+# define __int32_c_suffix __INT40_C_SUFFIX__
+# define __int16_c_suffix __INT40_C_SUFFIX__
+# define __int8_c_suffix __INT40_C_SUFFIX__
+# else
+# define INT40_C(v) v
+# define UINT40_C(v) v ## U
+# undef __int32_c_suffix
+# undef __int16_c_suffix
+# undef __int8_c_suffix
+# endif /* __INT40_C_SUFFIX__ */
+#endif /* __INT40_TYPE__ */
+
+
+#ifdef __INT32_TYPE__
+# ifdef __INT32_C_SUFFIX__
+# define __int32_c_suffix __INT32_C_SUFFIX__
+# define __int16_c_suffix __INT32_C_SUFFIX__
+# define __int8_c_suffix __INT32_C_SUFFIX__
+#else
+# undef __int32_c_suffix
+# undef __int16_c_suffix
+# undef __int8_c_suffix
+# endif /* __INT32_C_SUFFIX__ */
+#endif /* __INT32_TYPE__ */
+
+#ifdef __int_least32_t
+# ifdef __int32_c_suffix
+# define INT32_C(v) __int_c(v, __int32_c_suffix)
+# define UINT32_C(v) __uint_c(v, __int32_c_suffix)
+# else
+# define INT32_C(v) v
+# define UINT32_C(v) v ## U
+# endif /* __int32_c_suffix */
+#endif /* __int_least32_t */
+
+
+#ifdef __INT24_TYPE__
+# ifdef __INT24_C_SUFFIX__
+# define INT24_C(v) __int_c(v, __INT24_C_SUFFIX__)
+# define UINT24_C(v) __uint_c(v, __INT24_C_SUFFIX__)
+# define __int16_c_suffix __INT24_C_SUFFIX__
+# define __int8_c_suffix __INT24_C_SUFFIX__
+# else
+# define INT24_C(v) v
+# define UINT24_C(v) v ## U
+# undef __int16_c_suffix
+# undef __int8_c_suffix
+# endif /* __INT24_C_SUFFIX__ */
+#endif /* __INT24_TYPE__ */
+
+
+#ifdef __INT16_TYPE__
+# ifdef __INT16_C_SUFFIX__
+# define __int16_c_suffix __INT16_C_SUFFIX__
+# define __int8_c_suffix __INT16_C_SUFFIX__
+#else
+# undef __int16_c_suffix
+# undef __int8_c_suffix
+# endif /* __INT16_C_SUFFIX__ */
+#endif /* __INT16_TYPE__ */
+
+#ifdef __int_least16_t
+# ifdef __int16_c_suffix
+# define INT16_C(v) __int_c(v, __int16_c_suffix)
+# define UINT16_C(v) __uint_c(v, __int16_c_suffix)
+# else
+# define INT16_C(v) v
+# define UINT16_C(v) v ## U
+# endif /* __int16_c_suffix */
+#endif /* __int_least16_t */
+
+
+#ifdef __INT8_TYPE__
+# ifdef __INT8_C_SUFFIX__
+# define __int8_c_suffix __INT8_C_SUFFIX__
+#else
+# undef __int8_c_suffix
+# endif /* __INT8_C_SUFFIX__ */
+#endif /* __INT8_TYPE__ */
+
+#ifdef __int_least8_t
+# ifdef __int8_c_suffix
+# define INT8_C(v) __int_c(v, __int8_c_suffix)
+# define UINT8_C(v) __uint_c(v, __int8_c_suffix)
+# else
+# define INT8_C(v) v
+# define UINT8_C(v) v ## U
+# endif /* __int8_c_suffix */
+#endif /* __int_least8_t */
+
+
+/* C99 7.18.2.1 Limits of exact-width integer types.
+ * C99 7.18.2.2 Limits of minimum-width integer types.
+ * C99 7.18.2.3 Limits of fastest minimum-width integer types.
+ *
+ * The presence of limit macros are completely optional in C99. This
+ * implementation defines limits for all of the types (exact- and
+ * minimum-width) that it defines above, using the limits of the minimum-width
+ * type for any types that do not have exact-width representations.
+ *
+ * As in the type definitions, this section takes an approach of
+ * successive-shrinking to determine which limits to use for the standard (8,
+ * 16, 32, 64) bit widths when they don't have exact representations. It is
+ * therefore important that the defintions be kept in order of decending
+ * widths.
+ *
+ * Note that C++ should not check __STDC_LIMIT_MACROS here, contrary to the
+ * claims of the C standard (see C++ 18.3.1p2, [cstdint.syn]).
+ */
+
+#ifdef __INT64_TYPE__
+# define INT64_MAX INT64_C( 9223372036854775807)
+# define INT64_MIN (-INT64_C( 9223372036854775807)-1)
+# define UINT64_MAX UINT64_C(18446744073709551615)
+# define __INT_LEAST64_MIN INT64_MIN
+# define __INT_LEAST64_MAX INT64_MAX
+# define __UINT_LEAST64_MAX UINT64_MAX
+# define __INT_LEAST32_MIN INT64_MIN
+# define __INT_LEAST32_MAX INT64_MAX
+# define __UINT_LEAST32_MAX UINT64_MAX
+# define __INT_LEAST16_MIN INT64_MIN
+# define __INT_LEAST16_MAX INT64_MAX
+# define __UINT_LEAST16_MAX UINT64_MAX
+# define __INT_LEAST8_MIN INT64_MIN
+# define __INT_LEAST8_MAX INT64_MAX
+# define __UINT_LEAST8_MAX UINT64_MAX
+#endif /* __INT64_TYPE__ */
+
+#ifdef __INT_LEAST64_MIN
+# define INT_LEAST64_MIN __INT_LEAST64_MIN
+# define INT_LEAST64_MAX __INT_LEAST64_MAX
+# define UINT_LEAST64_MAX __UINT_LEAST64_MAX
+# define INT_FAST64_MIN __INT_LEAST64_MIN
+# define INT_FAST64_MAX __INT_LEAST64_MAX
+# define UINT_FAST64_MAX __UINT_LEAST64_MAX
+#endif /* __INT_LEAST64_MIN */
+
+
+#ifdef __INT56_TYPE__
+# define INT56_MAX INT56_C(36028797018963967)
+# define INT56_MIN (-INT56_C(36028797018963967)-1)
+# define UINT56_MAX UINT56_C(72057594037927935)
+# define INT_LEAST56_MIN INT56_MIN
+# define INT_LEAST56_MAX INT56_MAX
+# define UINT_LEAST56_MAX UINT56_MAX
+# define INT_FAST56_MIN INT56_MIN
+# define INT_FAST56_MAX INT56_MAX
+# define UINT_FAST56_MAX UINT56_MAX
+# define __INT_LEAST32_MIN INT56_MIN
+# define __INT_LEAST32_MAX INT56_MAX
+# define __UINT_LEAST32_MAX UINT56_MAX
+# define __INT_LEAST16_MIN INT56_MIN
+# define __INT_LEAST16_MAX INT56_MAX
+# define __UINT_LEAST16_MAX UINT56_MAX
+# define __INT_LEAST8_MIN INT56_MIN
+# define __INT_LEAST8_MAX INT56_MAX
+# define __UINT_LEAST8_MAX UINT56_MAX
+#endif /* __INT56_TYPE__ */
+
+
+#ifdef __INT48_TYPE__
+# define INT48_MAX INT48_C(140737488355327)
+# define INT48_MIN (-INT48_C(140737488355327)-1)
+# define UINT48_MAX UINT48_C(281474976710655)
+# define INT_LEAST48_MIN INT48_MIN
+# define INT_LEAST48_MAX INT48_MAX
+# define UINT_LEAST48_MAX UINT48_MAX
+# define INT_FAST48_MIN INT48_MIN
+# define INT_FAST48_MAX INT48_MAX
+# define UINT_FAST48_MAX UINT48_MAX
+# define __INT_LEAST32_MIN INT48_MIN
+# define __INT_LEAST32_MAX INT48_MAX
+# define __UINT_LEAST32_MAX UINT48_MAX
+# define __INT_LEAST16_MIN INT48_MIN
+# define __INT_LEAST16_MAX INT48_MAX
+# define __UINT_LEAST16_MAX UINT48_MAX
+# define __INT_LEAST8_MIN INT48_MIN
+# define __INT_LEAST8_MAX INT48_MAX
+# define __UINT_LEAST8_MAX UINT48_MAX
+#endif /* __INT48_TYPE__ */
+
+
+#ifdef __INT40_TYPE__
+# define INT40_MAX INT40_C(549755813887)
+# define INT40_MIN (-INT40_C(549755813887)-1)
+# define UINT40_MAX UINT40_C(1099511627775)
+# define INT_LEAST40_MIN INT40_MIN
+# define INT_LEAST40_MAX INT40_MAX
+# define UINT_LEAST40_MAX UINT40_MAX
+# define INT_FAST40_MIN INT40_MIN
+# define INT_FAST40_MAX INT40_MAX
+# define UINT_FAST40_MAX UINT40_MAX
+# define __INT_LEAST32_MIN INT40_MIN
+# define __INT_LEAST32_MAX INT40_MAX
+# define __UINT_LEAST32_MAX UINT40_MAX
+# define __INT_LEAST16_MIN INT40_MIN
+# define __INT_LEAST16_MAX INT40_MAX
+# define __UINT_LEAST16_MAX UINT40_MAX
+# define __INT_LEAST8_MIN INT40_MIN
+# define __INT_LEAST8_MAX INT40_MAX
+# define __UINT_LEAST8_MAX UINT40_MAX
+#endif /* __INT40_TYPE__ */
+
+
+#ifdef __INT32_TYPE__
+# define INT32_MAX INT32_C(2147483647)
+# define INT32_MIN (-INT32_C(2147483647)-1)
+# define UINT32_MAX UINT32_C(4294967295)
+# define __INT_LEAST32_MIN INT32_MIN
+# define __INT_LEAST32_MAX INT32_MAX
+# define __UINT_LEAST32_MAX UINT32_MAX
+# define __INT_LEAST16_MIN INT32_MIN
+# define __INT_LEAST16_MAX INT32_MAX
+# define __UINT_LEAST16_MAX UINT32_MAX
+# define __INT_LEAST8_MIN INT32_MIN
+# define __INT_LEAST8_MAX INT32_MAX
+# define __UINT_LEAST8_MAX UINT32_MAX
+#endif /* __INT32_TYPE__ */
+
+#ifdef __INT_LEAST32_MIN
+# define INT_LEAST32_MIN __INT_LEAST32_MIN
+# define INT_LEAST32_MAX __INT_LEAST32_MAX
+# define UINT_LEAST32_MAX __UINT_LEAST32_MAX
+# define INT_FAST32_MIN __INT_LEAST32_MIN
+# define INT_FAST32_MAX __INT_LEAST32_MAX
+# define UINT_FAST32_MAX __UINT_LEAST32_MAX
+#endif /* __INT_LEAST32_MIN */
+
+
+#ifdef __INT24_TYPE__
+# define INT24_MAX INT24_C(8388607)
+# define INT24_MIN (-INT24_C(8388607)-1)
+# define UINT24_MAX UINT24_C(16777215)
+# define INT_LEAST24_MIN INT24_MIN
+# define INT_LEAST24_MAX INT24_MAX
+# define UINT_LEAST24_MAX UINT24_MAX
+# define INT_FAST24_MIN INT24_MIN
+# define INT_FAST24_MAX INT24_MAX
+# define UINT_FAST24_MAX UINT24_MAX
+# define __INT_LEAST16_MIN INT24_MIN
+# define __INT_LEAST16_MAX INT24_MAX
+# define __UINT_LEAST16_MAX UINT24_MAX
+# define __INT_LEAST8_MIN INT24_MIN
+# define __INT_LEAST8_MAX INT24_MAX
+# define __UINT_LEAST8_MAX UINT24_MAX
+#endif /* __INT24_TYPE__ */
+
+
+#ifdef __INT16_TYPE__
+#define INT16_MAX INT16_C(32767)
+#define INT16_MIN (-INT16_C(32767)-1)
+#define UINT16_MAX UINT16_C(65535)
+# define __INT_LEAST16_MIN INT16_MIN
+# define __INT_LEAST16_MAX INT16_MAX
+# define __UINT_LEAST16_MAX UINT16_MAX
+# define __INT_LEAST8_MIN INT16_MIN
+# define __INT_LEAST8_MAX INT16_MAX
+# define __UINT_LEAST8_MAX UINT16_MAX
+#endif /* __INT16_TYPE__ */
+
+#ifdef __INT_LEAST16_MIN
+# define INT_LEAST16_MIN __INT_LEAST16_MIN
+# define INT_LEAST16_MAX __INT_LEAST16_MAX
+# define UINT_LEAST16_MAX __UINT_LEAST16_MAX
+# define INT_FAST16_MIN __INT_LEAST16_MIN
+# define INT_FAST16_MAX __INT_LEAST16_MAX
+# define UINT_FAST16_MAX __UINT_LEAST16_MAX
+#endif /* __INT_LEAST16_MIN */
+
+
+#ifdef __INT8_TYPE__
+# define INT8_MAX INT8_C(127)
+# define INT8_MIN (-INT8_C(127)-1)
+# define UINT8_MAX UINT8_C(255)
+# define __INT_LEAST8_MIN INT8_MIN
+# define __INT_LEAST8_MAX INT8_MAX
+# define __UINT_LEAST8_MAX UINT8_MAX
+#endif /* __INT8_TYPE__ */
+
+#ifdef __INT_LEAST8_MIN
+# define INT_LEAST8_MIN __INT_LEAST8_MIN
+# define INT_LEAST8_MAX __INT_LEAST8_MAX
+# define UINT_LEAST8_MAX __UINT_LEAST8_MAX
+# define INT_FAST8_MIN __INT_LEAST8_MIN
+# define INT_FAST8_MAX __INT_LEAST8_MAX
+# define UINT_FAST8_MAX __UINT_LEAST8_MAX
+#endif /* __INT_LEAST8_MIN */
+
+/* Some utility macros */
+#define __INTN_MIN(n) __stdint_join3( INT, n, _MIN)
+#define __INTN_MAX(n) __stdint_join3( INT, n, _MAX)
+#define __UINTN_MAX(n) __stdint_join3(UINT, n, _MAX)
+#define __INTN_C(n, v) __stdint_join3( INT, n, _C(v))
+#define __UINTN_C(n, v) __stdint_join3(UINT, n, _C(v))
+
+/* C99 7.18.2.4 Limits of integer types capable of holding object pointers. */
+/* C99 7.18.3 Limits of other integer types. */
+
+#define INTPTR_MIN __INTN_MIN(__INTPTR_WIDTH__)
+#define INTPTR_MAX __INTN_MAX(__INTPTR_WIDTH__)
+#define UINTPTR_MAX __UINTN_MAX(__INTPTR_WIDTH__)
+#define PTRDIFF_MIN __INTN_MIN(__PTRDIFF_WIDTH__)
+#define PTRDIFF_MAX __INTN_MAX(__PTRDIFF_WIDTH__)
+#define SIZE_MAX __UINTN_MAX(__SIZE_WIDTH__)
+
+/* ISO9899:2011 7.20 (C11 Annex K): Define RSIZE_MAX if __STDC_WANT_LIB_EXT1__
+ * is enabled. */
+#if defined(__STDC_WANT_LIB_EXT1__) && __STDC_WANT_LIB_EXT1__ >= 1
+#define RSIZE_MAX (SIZE_MAX >> 1)
+#endif
+
+/* C99 7.18.2.5 Limits of greatest-width integer types. */
+#define INTMAX_MIN __INTN_MIN(__INTMAX_WIDTH__)
+#define INTMAX_MAX __INTN_MAX(__INTMAX_WIDTH__)
+#define UINTMAX_MAX __UINTN_MAX(__INTMAX_WIDTH__)
+
+/* C99 7.18.3 Limits of other integer types. */
+#define SIG_ATOMIC_MIN __INTN_MIN(__SIG_ATOMIC_WIDTH__)
+#define SIG_ATOMIC_MAX __INTN_MAX(__SIG_ATOMIC_WIDTH__)
+#ifdef __WINT_UNSIGNED__
+# define WINT_MIN __UINTN_C(__WINT_WIDTH__, 0)
+# define WINT_MAX __UINTN_MAX(__WINT_WIDTH__)
+#else
+# define WINT_MIN __INTN_MIN(__WINT_WIDTH__)
+# define WINT_MAX __INTN_MAX(__WINT_WIDTH__)
+#endif
+
+#ifndef WCHAR_MAX
+# define WCHAR_MAX __WCHAR_MAX__
+#endif
+#ifndef WCHAR_MIN
+# if __WCHAR_MAX__ == __INTN_MAX(__WCHAR_WIDTH__)
+# define WCHAR_MIN __INTN_MIN(__WCHAR_WIDTH__)
+# else
+# define WCHAR_MIN __UINTN_C(__WCHAR_WIDTH__, 0)
+# endif
+#endif
+
+/* 7.18.4.2 Macros for greatest-width integer constants. */
+#define INTMAX_C(v) __INTN_C(__INTMAX_WIDTH__, v)
+#define UINTMAX_C(v) __UINTN_C(__INTMAX_WIDTH__, v)
+
+#endif /* __STDC_HOSTED__ */
+#endif /* __CLANG_STDINT_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/stdnoreturn.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/stdnoreturn.h
new file mode 100644
index 0000000..a7a301d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/stdnoreturn.h
@@ -0,0 +1,30 @@
+/*===---- stdnoreturn.h - Standard header for noreturn macro ---------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef __STDNORETURN_H
+#define __STDNORETURN_H
+
+#define noreturn _Noreturn
+#define __noreturn_is_defined 1
+
+#endif /* __STDNORETURN_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/tgmath.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/tgmath.h
new file mode 100644
index 0000000..a48e267
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/tgmath.h
@@ -0,0 +1,1374 @@
+/*===---- tgmath.h - Standard header for type generic math ----------------===*\
+ *
+ * Copyright (c) 2009 Howard Hinnant
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+\*===----------------------------------------------------------------------===*/
+
+#ifndef __TGMATH_H
+#define __TGMATH_H
+
+/* C99 7.22 Type-generic math <tgmath.h>. */
+#include <math.h>
+
+/* C++ handles type genericity with overloading in math.h. */
+#ifndef __cplusplus
+#include <complex.h>
+
+#define _TG_ATTRSp __attribute__((__overloadable__))
+#define _TG_ATTRS __attribute__((__overloadable__, __always_inline__))
+
+// promotion
+
+typedef void _Argument_type_is_not_arithmetic;
+static _Argument_type_is_not_arithmetic __tg_promote(...)
+ __attribute__((__unavailable__,__overloadable__));
+static double _TG_ATTRSp __tg_promote(int);
+static double _TG_ATTRSp __tg_promote(unsigned int);
+static double _TG_ATTRSp __tg_promote(long);
+static double _TG_ATTRSp __tg_promote(unsigned long);
+static double _TG_ATTRSp __tg_promote(long long);
+static double _TG_ATTRSp __tg_promote(unsigned long long);
+static float _TG_ATTRSp __tg_promote(float);
+static double _TG_ATTRSp __tg_promote(double);
+static long double _TG_ATTRSp __tg_promote(long double);
+static float _Complex _TG_ATTRSp __tg_promote(float _Complex);
+static double _Complex _TG_ATTRSp __tg_promote(double _Complex);
+static long double _Complex _TG_ATTRSp __tg_promote(long double _Complex);
+
+#define __tg_promote1(__x) (__typeof__(__tg_promote(__x)))
+#define __tg_promote2(__x, __y) (__typeof__(__tg_promote(__x) + \
+ __tg_promote(__y)))
+#define __tg_promote3(__x, __y, __z) (__typeof__(__tg_promote(__x) + \
+ __tg_promote(__y) + \
+ __tg_promote(__z)))
+
+// acos
+
+static float
+ _TG_ATTRS
+ __tg_acos(float __x) {return acosf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_acos(double __x) {return acos(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_acos(long double __x) {return acosl(__x);}
+
+static float _Complex
+ _TG_ATTRS
+ __tg_acos(float _Complex __x) {return cacosf(__x);}
+
+static double _Complex
+ _TG_ATTRS
+ __tg_acos(double _Complex __x) {return cacos(__x);}
+
+static long double _Complex
+ _TG_ATTRS
+ __tg_acos(long double _Complex __x) {return cacosl(__x);}
+
+#undef acos
+#define acos(__x) __tg_acos(__tg_promote1((__x))(__x))
+
+// asin
+
+static float
+ _TG_ATTRS
+ __tg_asin(float __x) {return asinf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_asin(double __x) {return asin(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_asin(long double __x) {return asinl(__x);}
+
+static float _Complex
+ _TG_ATTRS
+ __tg_asin(float _Complex __x) {return casinf(__x);}
+
+static double _Complex
+ _TG_ATTRS
+ __tg_asin(double _Complex __x) {return casin(__x);}
+
+static long double _Complex
+ _TG_ATTRS
+ __tg_asin(long double _Complex __x) {return casinl(__x);}
+
+#undef asin
+#define asin(__x) __tg_asin(__tg_promote1((__x))(__x))
+
+// atan
+
+static float
+ _TG_ATTRS
+ __tg_atan(float __x) {return atanf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_atan(double __x) {return atan(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_atan(long double __x) {return atanl(__x);}
+
+static float _Complex
+ _TG_ATTRS
+ __tg_atan(float _Complex __x) {return catanf(__x);}
+
+static double _Complex
+ _TG_ATTRS
+ __tg_atan(double _Complex __x) {return catan(__x);}
+
+static long double _Complex
+ _TG_ATTRS
+ __tg_atan(long double _Complex __x) {return catanl(__x);}
+
+#undef atan
+#define atan(__x) __tg_atan(__tg_promote1((__x))(__x))
+
+// acosh
+
+static float
+ _TG_ATTRS
+ __tg_acosh(float __x) {return acoshf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_acosh(double __x) {return acosh(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_acosh(long double __x) {return acoshl(__x);}
+
+static float _Complex
+ _TG_ATTRS
+ __tg_acosh(float _Complex __x) {return cacoshf(__x);}
+
+static double _Complex
+ _TG_ATTRS
+ __tg_acosh(double _Complex __x) {return cacosh(__x);}
+
+static long double _Complex
+ _TG_ATTRS
+ __tg_acosh(long double _Complex __x) {return cacoshl(__x);}
+
+#undef acosh
+#define acosh(__x) __tg_acosh(__tg_promote1((__x))(__x))
+
+// asinh
+
+static float
+ _TG_ATTRS
+ __tg_asinh(float __x) {return asinhf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_asinh(double __x) {return asinh(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_asinh(long double __x) {return asinhl(__x);}
+
+static float _Complex
+ _TG_ATTRS
+ __tg_asinh(float _Complex __x) {return casinhf(__x);}
+
+static double _Complex
+ _TG_ATTRS
+ __tg_asinh(double _Complex __x) {return casinh(__x);}
+
+static long double _Complex
+ _TG_ATTRS
+ __tg_asinh(long double _Complex __x) {return casinhl(__x);}
+
+#undef asinh
+#define asinh(__x) __tg_asinh(__tg_promote1((__x))(__x))
+
+// atanh
+
+static float
+ _TG_ATTRS
+ __tg_atanh(float __x) {return atanhf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_atanh(double __x) {return atanh(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_atanh(long double __x) {return atanhl(__x);}
+
+static float _Complex
+ _TG_ATTRS
+ __tg_atanh(float _Complex __x) {return catanhf(__x);}
+
+static double _Complex
+ _TG_ATTRS
+ __tg_atanh(double _Complex __x) {return catanh(__x);}
+
+static long double _Complex
+ _TG_ATTRS
+ __tg_atanh(long double _Complex __x) {return catanhl(__x);}
+
+#undef atanh
+#define atanh(__x) __tg_atanh(__tg_promote1((__x))(__x))
+
+// cos
+
+static float
+ _TG_ATTRS
+ __tg_cos(float __x) {return cosf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_cos(double __x) {return cos(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_cos(long double __x) {return cosl(__x);}
+
+static float _Complex
+ _TG_ATTRS
+ __tg_cos(float _Complex __x) {return ccosf(__x);}
+
+static double _Complex
+ _TG_ATTRS
+ __tg_cos(double _Complex __x) {return ccos(__x);}
+
+static long double _Complex
+ _TG_ATTRS
+ __tg_cos(long double _Complex __x) {return ccosl(__x);}
+
+#undef cos
+#define cos(__x) __tg_cos(__tg_promote1((__x))(__x))
+
+// sin
+
+static float
+ _TG_ATTRS
+ __tg_sin(float __x) {return sinf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_sin(double __x) {return sin(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_sin(long double __x) {return sinl(__x);}
+
+static float _Complex
+ _TG_ATTRS
+ __tg_sin(float _Complex __x) {return csinf(__x);}
+
+static double _Complex
+ _TG_ATTRS
+ __tg_sin(double _Complex __x) {return csin(__x);}
+
+static long double _Complex
+ _TG_ATTRS
+ __tg_sin(long double _Complex __x) {return csinl(__x);}
+
+#undef sin
+#define sin(__x) __tg_sin(__tg_promote1((__x))(__x))
+
+// tan
+
+static float
+ _TG_ATTRS
+ __tg_tan(float __x) {return tanf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_tan(double __x) {return tan(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_tan(long double __x) {return tanl(__x);}
+
+static float _Complex
+ _TG_ATTRS
+ __tg_tan(float _Complex __x) {return ctanf(__x);}
+
+static double _Complex
+ _TG_ATTRS
+ __tg_tan(double _Complex __x) {return ctan(__x);}
+
+static long double _Complex
+ _TG_ATTRS
+ __tg_tan(long double _Complex __x) {return ctanl(__x);}
+
+#undef tan
+#define tan(__x) __tg_tan(__tg_promote1((__x))(__x))
+
+// cosh
+
+static float
+ _TG_ATTRS
+ __tg_cosh(float __x) {return coshf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_cosh(double __x) {return cosh(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_cosh(long double __x) {return coshl(__x);}
+
+static float _Complex
+ _TG_ATTRS
+ __tg_cosh(float _Complex __x) {return ccoshf(__x);}
+
+static double _Complex
+ _TG_ATTRS
+ __tg_cosh(double _Complex __x) {return ccosh(__x);}
+
+static long double _Complex
+ _TG_ATTRS
+ __tg_cosh(long double _Complex __x) {return ccoshl(__x);}
+
+#undef cosh
+#define cosh(__x) __tg_cosh(__tg_promote1((__x))(__x))
+
+// sinh
+
+static float
+ _TG_ATTRS
+ __tg_sinh(float __x) {return sinhf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_sinh(double __x) {return sinh(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_sinh(long double __x) {return sinhl(__x);}
+
+static float _Complex
+ _TG_ATTRS
+ __tg_sinh(float _Complex __x) {return csinhf(__x);}
+
+static double _Complex
+ _TG_ATTRS
+ __tg_sinh(double _Complex __x) {return csinh(__x);}
+
+static long double _Complex
+ _TG_ATTRS
+ __tg_sinh(long double _Complex __x) {return csinhl(__x);}
+
+#undef sinh
+#define sinh(__x) __tg_sinh(__tg_promote1((__x))(__x))
+
+// tanh
+
+static float
+ _TG_ATTRS
+ __tg_tanh(float __x) {return tanhf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_tanh(double __x) {return tanh(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_tanh(long double __x) {return tanhl(__x);}
+
+static float _Complex
+ _TG_ATTRS
+ __tg_tanh(float _Complex __x) {return ctanhf(__x);}
+
+static double _Complex
+ _TG_ATTRS
+ __tg_tanh(double _Complex __x) {return ctanh(__x);}
+
+static long double _Complex
+ _TG_ATTRS
+ __tg_tanh(long double _Complex __x) {return ctanhl(__x);}
+
+#undef tanh
+#define tanh(__x) __tg_tanh(__tg_promote1((__x))(__x))
+
+// exp
+
+static float
+ _TG_ATTRS
+ __tg_exp(float __x) {return expf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_exp(double __x) {return exp(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_exp(long double __x) {return expl(__x);}
+
+static float _Complex
+ _TG_ATTRS
+ __tg_exp(float _Complex __x) {return cexpf(__x);}
+
+static double _Complex
+ _TG_ATTRS
+ __tg_exp(double _Complex __x) {return cexp(__x);}
+
+static long double _Complex
+ _TG_ATTRS
+ __tg_exp(long double _Complex __x) {return cexpl(__x);}
+
+#undef exp
+#define exp(__x) __tg_exp(__tg_promote1((__x))(__x))
+
+// log
+
+static float
+ _TG_ATTRS
+ __tg_log(float __x) {return logf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_log(double __x) {return log(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_log(long double __x) {return logl(__x);}
+
+static float _Complex
+ _TG_ATTRS
+ __tg_log(float _Complex __x) {return clogf(__x);}
+
+static double _Complex
+ _TG_ATTRS
+ __tg_log(double _Complex __x) {return clog(__x);}
+
+static long double _Complex
+ _TG_ATTRS
+ __tg_log(long double _Complex __x) {return clogl(__x);}
+
+#undef log
+#define log(__x) __tg_log(__tg_promote1((__x))(__x))
+
+// pow
+
+static float
+ _TG_ATTRS
+ __tg_pow(float __x, float __y) {return powf(__x, __y);}
+
+static double
+ _TG_ATTRS
+ __tg_pow(double __x, double __y) {return pow(__x, __y);}
+
+static long double
+ _TG_ATTRS
+ __tg_pow(long double __x, long double __y) {return powl(__x, __y);}
+
+static float _Complex
+ _TG_ATTRS
+ __tg_pow(float _Complex __x, float _Complex __y) {return cpowf(__x, __y);}
+
+static double _Complex
+ _TG_ATTRS
+ __tg_pow(double _Complex __x, double _Complex __y) {return cpow(__x, __y);}
+
+static long double _Complex
+ _TG_ATTRS
+ __tg_pow(long double _Complex __x, long double _Complex __y)
+ {return cpowl(__x, __y);}
+
+#undef pow
+#define pow(__x, __y) __tg_pow(__tg_promote2((__x), (__y))(__x), \
+ __tg_promote2((__x), (__y))(__y))
+
+// sqrt
+
+static float
+ _TG_ATTRS
+ __tg_sqrt(float __x) {return sqrtf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_sqrt(double __x) {return sqrt(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_sqrt(long double __x) {return sqrtl(__x);}
+
+static float _Complex
+ _TG_ATTRS
+ __tg_sqrt(float _Complex __x) {return csqrtf(__x);}
+
+static double _Complex
+ _TG_ATTRS
+ __tg_sqrt(double _Complex __x) {return csqrt(__x);}
+
+static long double _Complex
+ _TG_ATTRS
+ __tg_sqrt(long double _Complex __x) {return csqrtl(__x);}
+
+#undef sqrt
+#define sqrt(__x) __tg_sqrt(__tg_promote1((__x))(__x))
+
+// fabs
+
+static float
+ _TG_ATTRS
+ __tg_fabs(float __x) {return fabsf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_fabs(double __x) {return fabs(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_fabs(long double __x) {return fabsl(__x);}
+
+static float
+ _TG_ATTRS
+ __tg_fabs(float _Complex __x) {return cabsf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_fabs(double _Complex __x) {return cabs(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_fabs(long double _Complex __x) {return cabsl(__x);}
+
+#undef fabs
+#define fabs(__x) __tg_fabs(__tg_promote1((__x))(__x))
+
+// atan2
+
+static float
+ _TG_ATTRS
+ __tg_atan2(float __x, float __y) {return atan2f(__x, __y);}
+
+static double
+ _TG_ATTRS
+ __tg_atan2(double __x, double __y) {return atan2(__x, __y);}
+
+static long double
+ _TG_ATTRS
+ __tg_atan2(long double __x, long double __y) {return atan2l(__x, __y);}
+
+#undef atan2
+#define atan2(__x, __y) __tg_atan2(__tg_promote2((__x), (__y))(__x), \
+ __tg_promote2((__x), (__y))(__y))
+
+// cbrt
+
+static float
+ _TG_ATTRS
+ __tg_cbrt(float __x) {return cbrtf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_cbrt(double __x) {return cbrt(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_cbrt(long double __x) {return cbrtl(__x);}
+
+#undef cbrt
+#define cbrt(__x) __tg_cbrt(__tg_promote1((__x))(__x))
+
+// ceil
+
+static float
+ _TG_ATTRS
+ __tg_ceil(float __x) {return ceilf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_ceil(double __x) {return ceil(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_ceil(long double __x) {return ceill(__x);}
+
+#undef ceil
+#define ceil(__x) __tg_ceil(__tg_promote1((__x))(__x))
+
+// copysign
+
+static float
+ _TG_ATTRS
+ __tg_copysign(float __x, float __y) {return copysignf(__x, __y);}
+
+static double
+ _TG_ATTRS
+ __tg_copysign(double __x, double __y) {return copysign(__x, __y);}
+
+static long double
+ _TG_ATTRS
+ __tg_copysign(long double __x, long double __y) {return copysignl(__x, __y);}
+
+#undef copysign
+#define copysign(__x, __y) __tg_copysign(__tg_promote2((__x), (__y))(__x), \
+ __tg_promote2((__x), (__y))(__y))
+
+// erf
+
+static float
+ _TG_ATTRS
+ __tg_erf(float __x) {return erff(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_erf(double __x) {return erf(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_erf(long double __x) {return erfl(__x);}
+
+#undef erf
+#define erf(__x) __tg_erf(__tg_promote1((__x))(__x))
+
+// erfc
+
+static float
+ _TG_ATTRS
+ __tg_erfc(float __x) {return erfcf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_erfc(double __x) {return erfc(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_erfc(long double __x) {return erfcl(__x);}
+
+#undef erfc
+#define erfc(__x) __tg_erfc(__tg_promote1((__x))(__x))
+
+// exp2
+
+static float
+ _TG_ATTRS
+ __tg_exp2(float __x) {return exp2f(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_exp2(double __x) {return exp2(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_exp2(long double __x) {return exp2l(__x);}
+
+#undef exp2
+#define exp2(__x) __tg_exp2(__tg_promote1((__x))(__x))
+
+// expm1
+
+static float
+ _TG_ATTRS
+ __tg_expm1(float __x) {return expm1f(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_expm1(double __x) {return expm1(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_expm1(long double __x) {return expm1l(__x);}
+
+#undef expm1
+#define expm1(__x) __tg_expm1(__tg_promote1((__x))(__x))
+
+// fdim
+
+static float
+ _TG_ATTRS
+ __tg_fdim(float __x, float __y) {return fdimf(__x, __y);}
+
+static double
+ _TG_ATTRS
+ __tg_fdim(double __x, double __y) {return fdim(__x, __y);}
+
+static long double
+ _TG_ATTRS
+ __tg_fdim(long double __x, long double __y) {return fdiml(__x, __y);}
+
+#undef fdim
+#define fdim(__x, __y) __tg_fdim(__tg_promote2((__x), (__y))(__x), \
+ __tg_promote2((__x), (__y))(__y))
+
+// floor
+
+static float
+ _TG_ATTRS
+ __tg_floor(float __x) {return floorf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_floor(double __x) {return floor(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_floor(long double __x) {return floorl(__x);}
+
+#undef floor
+#define floor(__x) __tg_floor(__tg_promote1((__x))(__x))
+
+// fma
+
+static float
+ _TG_ATTRS
+ __tg_fma(float __x, float __y, float __z)
+ {return fmaf(__x, __y, __z);}
+
+static double
+ _TG_ATTRS
+ __tg_fma(double __x, double __y, double __z)
+ {return fma(__x, __y, __z);}
+
+static long double
+ _TG_ATTRS
+ __tg_fma(long double __x,long double __y, long double __z)
+ {return fmal(__x, __y, __z);}
+
+#undef fma
+#define fma(__x, __y, __z) \
+ __tg_fma(__tg_promote3((__x), (__y), (__z))(__x), \
+ __tg_promote3((__x), (__y), (__z))(__y), \
+ __tg_promote3((__x), (__y), (__z))(__z))
+
+// fmax
+
+static float
+ _TG_ATTRS
+ __tg_fmax(float __x, float __y) {return fmaxf(__x, __y);}
+
+static double
+ _TG_ATTRS
+ __tg_fmax(double __x, double __y) {return fmax(__x, __y);}
+
+static long double
+ _TG_ATTRS
+ __tg_fmax(long double __x, long double __y) {return fmaxl(__x, __y);}
+
+#undef fmax
+#define fmax(__x, __y) __tg_fmax(__tg_promote2((__x), (__y))(__x), \
+ __tg_promote2((__x), (__y))(__y))
+
+// fmin
+
+static float
+ _TG_ATTRS
+ __tg_fmin(float __x, float __y) {return fminf(__x, __y);}
+
+static double
+ _TG_ATTRS
+ __tg_fmin(double __x, double __y) {return fmin(__x, __y);}
+
+static long double
+ _TG_ATTRS
+ __tg_fmin(long double __x, long double __y) {return fminl(__x, __y);}
+
+#undef fmin
+#define fmin(__x, __y) __tg_fmin(__tg_promote2((__x), (__y))(__x), \
+ __tg_promote2((__x), (__y))(__y))
+
+// fmod
+
+static float
+ _TG_ATTRS
+ __tg_fmod(float __x, float __y) {return fmodf(__x, __y);}
+
+static double
+ _TG_ATTRS
+ __tg_fmod(double __x, double __y) {return fmod(__x, __y);}
+
+static long double
+ _TG_ATTRS
+ __tg_fmod(long double __x, long double __y) {return fmodl(__x, __y);}
+
+#undef fmod
+#define fmod(__x, __y) __tg_fmod(__tg_promote2((__x), (__y))(__x), \
+ __tg_promote2((__x), (__y))(__y))
+
+// frexp
+
+static float
+ _TG_ATTRS
+ __tg_frexp(float __x, int* __y) {return frexpf(__x, __y);}
+
+static double
+ _TG_ATTRS
+ __tg_frexp(double __x, int* __y) {return frexp(__x, __y);}
+
+static long double
+ _TG_ATTRS
+ __tg_frexp(long double __x, int* __y) {return frexpl(__x, __y);}
+
+#undef frexp
+#define frexp(__x, __y) __tg_frexp(__tg_promote1((__x))(__x), __y)
+
+// hypot
+
+static float
+ _TG_ATTRS
+ __tg_hypot(float __x, float __y) {return hypotf(__x, __y);}
+
+static double
+ _TG_ATTRS
+ __tg_hypot(double __x, double __y) {return hypot(__x, __y);}
+
+static long double
+ _TG_ATTRS
+ __tg_hypot(long double __x, long double __y) {return hypotl(__x, __y);}
+
+#undef hypot
+#define hypot(__x, __y) __tg_hypot(__tg_promote2((__x), (__y))(__x), \
+ __tg_promote2((__x), (__y))(__y))
+
+// ilogb
+
+static int
+ _TG_ATTRS
+ __tg_ilogb(float __x) {return ilogbf(__x);}
+
+static int
+ _TG_ATTRS
+ __tg_ilogb(double __x) {return ilogb(__x);}
+
+static int
+ _TG_ATTRS
+ __tg_ilogb(long double __x) {return ilogbl(__x);}
+
+#undef ilogb
+#define ilogb(__x) __tg_ilogb(__tg_promote1((__x))(__x))
+
+// ldexp
+
+static float
+ _TG_ATTRS
+ __tg_ldexp(float __x, int __y) {return ldexpf(__x, __y);}
+
+static double
+ _TG_ATTRS
+ __tg_ldexp(double __x, int __y) {return ldexp(__x, __y);}
+
+static long double
+ _TG_ATTRS
+ __tg_ldexp(long double __x, int __y) {return ldexpl(__x, __y);}
+
+#undef ldexp
+#define ldexp(__x, __y) __tg_ldexp(__tg_promote1((__x))(__x), __y)
+
+// lgamma
+
+static float
+ _TG_ATTRS
+ __tg_lgamma(float __x) {return lgammaf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_lgamma(double __x) {return lgamma(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_lgamma(long double __x) {return lgammal(__x);}
+
+#undef lgamma
+#define lgamma(__x) __tg_lgamma(__tg_promote1((__x))(__x))
+
+// llrint
+
+static long long
+ _TG_ATTRS
+ __tg_llrint(float __x) {return llrintf(__x);}
+
+static long long
+ _TG_ATTRS
+ __tg_llrint(double __x) {return llrint(__x);}
+
+static long long
+ _TG_ATTRS
+ __tg_llrint(long double __x) {return llrintl(__x);}
+
+#undef llrint
+#define llrint(__x) __tg_llrint(__tg_promote1((__x))(__x))
+
+// llround
+
+static long long
+ _TG_ATTRS
+ __tg_llround(float __x) {return llroundf(__x);}
+
+static long long
+ _TG_ATTRS
+ __tg_llround(double __x) {return llround(__x);}
+
+static long long
+ _TG_ATTRS
+ __tg_llround(long double __x) {return llroundl(__x);}
+
+#undef llround
+#define llround(__x) __tg_llround(__tg_promote1((__x))(__x))
+
+// log10
+
+static float
+ _TG_ATTRS
+ __tg_log10(float __x) {return log10f(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_log10(double __x) {return log10(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_log10(long double __x) {return log10l(__x);}
+
+#undef log10
+#define log10(__x) __tg_log10(__tg_promote1((__x))(__x))
+
+// log1p
+
+static float
+ _TG_ATTRS
+ __tg_log1p(float __x) {return log1pf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_log1p(double __x) {return log1p(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_log1p(long double __x) {return log1pl(__x);}
+
+#undef log1p
+#define log1p(__x) __tg_log1p(__tg_promote1((__x))(__x))
+
+// log2
+
+static float
+ _TG_ATTRS
+ __tg_log2(float __x) {return log2f(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_log2(double __x) {return log2(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_log2(long double __x) {return log2l(__x);}
+
+#undef log2
+#define log2(__x) __tg_log2(__tg_promote1((__x))(__x))
+
+// logb
+
+static float
+ _TG_ATTRS
+ __tg_logb(float __x) {return logbf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_logb(double __x) {return logb(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_logb(long double __x) {return logbl(__x);}
+
+#undef logb
+#define logb(__x) __tg_logb(__tg_promote1((__x))(__x))
+
+// lrint
+
+static long
+ _TG_ATTRS
+ __tg_lrint(float __x) {return lrintf(__x);}
+
+static long
+ _TG_ATTRS
+ __tg_lrint(double __x) {return lrint(__x);}
+
+static long
+ _TG_ATTRS
+ __tg_lrint(long double __x) {return lrintl(__x);}
+
+#undef lrint
+#define lrint(__x) __tg_lrint(__tg_promote1((__x))(__x))
+
+// lround
+
+static long
+ _TG_ATTRS
+ __tg_lround(float __x) {return lroundf(__x);}
+
+static long
+ _TG_ATTRS
+ __tg_lround(double __x) {return lround(__x);}
+
+static long
+ _TG_ATTRS
+ __tg_lround(long double __x) {return lroundl(__x);}
+
+#undef lround
+#define lround(__x) __tg_lround(__tg_promote1((__x))(__x))
+
+// nearbyint
+
+static float
+ _TG_ATTRS
+ __tg_nearbyint(float __x) {return nearbyintf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_nearbyint(double __x) {return nearbyint(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_nearbyint(long double __x) {return nearbyintl(__x);}
+
+#undef nearbyint
+#define nearbyint(__x) __tg_nearbyint(__tg_promote1((__x))(__x))
+
+// nextafter
+
+static float
+ _TG_ATTRS
+ __tg_nextafter(float __x, float __y) {return nextafterf(__x, __y);}
+
+static double
+ _TG_ATTRS
+ __tg_nextafter(double __x, double __y) {return nextafter(__x, __y);}
+
+static long double
+ _TG_ATTRS
+ __tg_nextafter(long double __x, long double __y) {return nextafterl(__x, __y);}
+
+#undef nextafter
+#define nextafter(__x, __y) __tg_nextafter(__tg_promote2((__x), (__y))(__x), \
+ __tg_promote2((__x), (__y))(__y))
+
+// nexttoward
+
+static float
+ _TG_ATTRS
+ __tg_nexttoward(float __x, long double __y) {return nexttowardf(__x, __y);}
+
+static double
+ _TG_ATTRS
+ __tg_nexttoward(double __x, long double __y) {return nexttoward(__x, __y);}
+
+static long double
+ _TG_ATTRS
+ __tg_nexttoward(long double __x, long double __y) {return nexttowardl(__x, __y);}
+
+#undef nexttoward
+#define nexttoward(__x, __y) __tg_nexttoward(__tg_promote1((__x))(__x), (__y))
+
+// remainder
+
+static float
+ _TG_ATTRS
+ __tg_remainder(float __x, float __y) {return remainderf(__x, __y);}
+
+static double
+ _TG_ATTRS
+ __tg_remainder(double __x, double __y) {return remainder(__x, __y);}
+
+static long double
+ _TG_ATTRS
+ __tg_remainder(long double __x, long double __y) {return remainderl(__x, __y);}
+
+#undef remainder
+#define remainder(__x, __y) __tg_remainder(__tg_promote2((__x), (__y))(__x), \
+ __tg_promote2((__x), (__y))(__y))
+
+// remquo
+
+static float
+ _TG_ATTRS
+ __tg_remquo(float __x, float __y, int* __z)
+ {return remquof(__x, __y, __z);}
+
+static double
+ _TG_ATTRS
+ __tg_remquo(double __x, double __y, int* __z)
+ {return remquo(__x, __y, __z);}
+
+static long double
+ _TG_ATTRS
+ __tg_remquo(long double __x,long double __y, int* __z)
+ {return remquol(__x, __y, __z);}
+
+#undef remquo
+#define remquo(__x, __y, __z) \
+ __tg_remquo(__tg_promote2((__x), (__y))(__x), \
+ __tg_promote2((__x), (__y))(__y), \
+ (__z))
+
+// rint
+
+static float
+ _TG_ATTRS
+ __tg_rint(float __x) {return rintf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_rint(double __x) {return rint(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_rint(long double __x) {return rintl(__x);}
+
+#undef rint
+#define rint(__x) __tg_rint(__tg_promote1((__x))(__x))
+
+// round
+
+static float
+ _TG_ATTRS
+ __tg_round(float __x) {return roundf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_round(double __x) {return round(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_round(long double __x) {return roundl(__x);}
+
+#undef round
+#define round(__x) __tg_round(__tg_promote1((__x))(__x))
+
+// scalbn
+
+static float
+ _TG_ATTRS
+ __tg_scalbn(float __x, int __y) {return scalbnf(__x, __y);}
+
+static double
+ _TG_ATTRS
+ __tg_scalbn(double __x, int __y) {return scalbn(__x, __y);}
+
+static long double
+ _TG_ATTRS
+ __tg_scalbn(long double __x, int __y) {return scalbnl(__x, __y);}
+
+#undef scalbn
+#define scalbn(__x, __y) __tg_scalbn(__tg_promote1((__x))(__x), __y)
+
+// scalbln
+
+static float
+ _TG_ATTRS
+ __tg_scalbln(float __x, long __y) {return scalblnf(__x, __y);}
+
+static double
+ _TG_ATTRS
+ __tg_scalbln(double __x, long __y) {return scalbln(__x, __y);}
+
+static long double
+ _TG_ATTRS
+ __tg_scalbln(long double __x, long __y) {return scalblnl(__x, __y);}
+
+#undef scalbln
+#define scalbln(__x, __y) __tg_scalbln(__tg_promote1((__x))(__x), __y)
+
+// tgamma
+
+static float
+ _TG_ATTRS
+ __tg_tgamma(float __x) {return tgammaf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_tgamma(double __x) {return tgamma(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_tgamma(long double __x) {return tgammal(__x);}
+
+#undef tgamma
+#define tgamma(__x) __tg_tgamma(__tg_promote1((__x))(__x))
+
+// trunc
+
+static float
+ _TG_ATTRS
+ __tg_trunc(float __x) {return truncf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_trunc(double __x) {return trunc(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_trunc(long double __x) {return truncl(__x);}
+
+#undef trunc
+#define trunc(__x) __tg_trunc(__tg_promote1((__x))(__x))
+
+// carg
+
+static float
+ _TG_ATTRS
+ __tg_carg(float __x) {return atan2f(0.F, __x);}
+
+static double
+ _TG_ATTRS
+ __tg_carg(double __x) {return atan2(0., __x);}
+
+static long double
+ _TG_ATTRS
+ __tg_carg(long double __x) {return atan2l(0.L, __x);}
+
+static float
+ _TG_ATTRS
+ __tg_carg(float _Complex __x) {return cargf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_carg(double _Complex __x) {return carg(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_carg(long double _Complex __x) {return cargl(__x);}
+
+#undef carg
+#define carg(__x) __tg_carg(__tg_promote1((__x))(__x))
+
+// cimag
+
+static float
+ _TG_ATTRS
+ __tg_cimag(float __x) {return 0;}
+
+static double
+ _TG_ATTRS
+ __tg_cimag(double __x) {return 0;}
+
+static long double
+ _TG_ATTRS
+ __tg_cimag(long double __x) {return 0;}
+
+static float
+ _TG_ATTRS
+ __tg_cimag(float _Complex __x) {return cimagf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_cimag(double _Complex __x) {return cimag(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_cimag(long double _Complex __x) {return cimagl(__x);}
+
+#undef cimag
+#define cimag(__x) __tg_cimag(__tg_promote1((__x))(__x))
+
+// conj
+
+static float _Complex
+ _TG_ATTRS
+ __tg_conj(float __x) {return __x;}
+
+static double _Complex
+ _TG_ATTRS
+ __tg_conj(double __x) {return __x;}
+
+static long double _Complex
+ _TG_ATTRS
+ __tg_conj(long double __x) {return __x;}
+
+static float _Complex
+ _TG_ATTRS
+ __tg_conj(float _Complex __x) {return conjf(__x);}
+
+static double _Complex
+ _TG_ATTRS
+ __tg_conj(double _Complex __x) {return conj(__x);}
+
+static long double _Complex
+ _TG_ATTRS
+ __tg_conj(long double _Complex __x) {return conjl(__x);}
+
+#undef conj
+#define conj(__x) __tg_conj(__tg_promote1((__x))(__x))
+
+// cproj
+
+static float _Complex
+ _TG_ATTRS
+ __tg_cproj(float __x) {return cprojf(__x);}
+
+static double _Complex
+ _TG_ATTRS
+ __tg_cproj(double __x) {return cproj(__x);}
+
+static long double _Complex
+ _TG_ATTRS
+ __tg_cproj(long double __x) {return cprojl(__x);}
+
+static float _Complex
+ _TG_ATTRS
+ __tg_cproj(float _Complex __x) {return cprojf(__x);}
+
+static double _Complex
+ _TG_ATTRS
+ __tg_cproj(double _Complex __x) {return cproj(__x);}
+
+static long double _Complex
+ _TG_ATTRS
+ __tg_cproj(long double _Complex __x) {return cprojl(__x);}
+
+#undef cproj
+#define cproj(__x) __tg_cproj(__tg_promote1((__x))(__x))
+
+// creal
+
+static float
+ _TG_ATTRS
+ __tg_creal(float __x) {return __x;}
+
+static double
+ _TG_ATTRS
+ __tg_creal(double __x) {return __x;}
+
+static long double
+ _TG_ATTRS
+ __tg_creal(long double __x) {return __x;}
+
+static float
+ _TG_ATTRS
+ __tg_creal(float _Complex __x) {return crealf(__x);}
+
+static double
+ _TG_ATTRS
+ __tg_creal(double _Complex __x) {return creal(__x);}
+
+static long double
+ _TG_ATTRS
+ __tg_creal(long double _Complex __x) {return creall(__x);}
+
+#undef creal
+#define creal(__x) __tg_creal(__tg_promote1((__x))(__x))
+
+#undef _TG_ATTRSp
+#undef _TG_ATTRS
+
+#endif /* __cplusplus */
+#endif /* __TGMATH_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/tmmintrin.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/tmmintrin.h
new file mode 100644
index 0000000..4238f5b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/tmmintrin.h
@@ -0,0 +1,225 @@
+/*===---- tmmintrin.h - SSSE3 intrinsics -----------------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef __TMMINTRIN_H
+#define __TMMINTRIN_H
+
+#ifndef __SSSE3__
+#error "SSSE3 instruction set not enabled"
+#else
+
+#include <pmmintrin.h>
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_abs_pi8(__m64 __a)
+{
+ return (__m64)__builtin_ia32_pabsb((__v8qi)__a);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_abs_epi8(__m128i __a)
+{
+ return (__m128i)__builtin_ia32_pabsb128((__v16qi)__a);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_abs_pi16(__m64 __a)
+{
+ return (__m64)__builtin_ia32_pabsw((__v4hi)__a);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_abs_epi16(__m128i __a)
+{
+ return (__m128i)__builtin_ia32_pabsw128((__v8hi)__a);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_abs_pi32(__m64 __a)
+{
+ return (__m64)__builtin_ia32_pabsd((__v2si)__a);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_abs_epi32(__m128i __a)
+{
+ return (__m128i)__builtin_ia32_pabsd128((__v4si)__a);
+}
+
+#define _mm_alignr_epi8(a, b, n) __extension__ ({ \
+ __m128i __a = (a); \
+ __m128i __b = (b); \
+ (__m128i)__builtin_ia32_palignr128((__v16qi)__a, (__v16qi)__b, (n)); })
+
+#define _mm_alignr_pi8(a, b, n) __extension__ ({ \
+ __m64 __a = (a); \
+ __m64 __b = (b); \
+ (__m64)__builtin_ia32_palignr((__v8qi)__a, (__v8qi)__b, (n)); })
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_hadd_epi16(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_phaddw128((__v8hi)__a, (__v8hi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_hadd_epi32(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_phaddd128((__v4si)__a, (__v4si)__b);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_hadd_pi16(__m64 __a, __m64 __b)
+{
+ return (__m64)__builtin_ia32_phaddw((__v4hi)__a, (__v4hi)__b);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_hadd_pi32(__m64 __a, __m64 __b)
+{
+ return (__m64)__builtin_ia32_phaddd((__v2si)__a, (__v2si)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_hadds_epi16(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_phaddsw128((__v8hi)__a, (__v8hi)__b);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_hadds_pi16(__m64 __a, __m64 __b)
+{
+ return (__m64)__builtin_ia32_phaddsw((__v4hi)__a, (__v4hi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_hsub_epi16(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_phsubw128((__v8hi)__a, (__v8hi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_hsub_epi32(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_phsubd128((__v4si)__a, (__v4si)__b);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_hsub_pi16(__m64 __a, __m64 __b)
+{
+ return (__m64)__builtin_ia32_phsubw((__v4hi)__a, (__v4hi)__b);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_hsub_pi32(__m64 __a, __m64 __b)
+{
+ return (__m64)__builtin_ia32_phsubd((__v2si)__a, (__v2si)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_hsubs_epi16(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_phsubsw128((__v8hi)__a, (__v8hi)__b);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_hsubs_pi16(__m64 __a, __m64 __b)
+{
+ return (__m64)__builtin_ia32_phsubsw((__v4hi)__a, (__v4hi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_maddubs_epi16(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_pmaddubsw128((__v16qi)__a, (__v16qi)__b);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_maddubs_pi16(__m64 __a, __m64 __b)
+{
+ return (__m64)__builtin_ia32_pmaddubsw((__v8qi)__a, (__v8qi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_mulhrs_epi16(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_pmulhrsw128((__v8hi)__a, (__v8hi)__b);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_mulhrs_pi16(__m64 __a, __m64 __b)
+{
+ return (__m64)__builtin_ia32_pmulhrsw((__v4hi)__a, (__v4hi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_shuffle_epi8(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_pshufb128((__v16qi)__a, (__v16qi)__b);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_shuffle_pi8(__m64 __a, __m64 __b)
+{
+ return (__m64)__builtin_ia32_pshufb((__v8qi)__a, (__v8qi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_sign_epi8(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_psignb128((__v16qi)__a, (__v16qi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_sign_epi16(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_psignw128((__v8hi)__a, (__v8hi)__b);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_sign_epi32(__m128i __a, __m128i __b)
+{
+ return (__m128i)__builtin_ia32_psignd128((__v4si)__a, (__v4si)__b);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_sign_pi8(__m64 __a, __m64 __b)
+{
+ return (__m64)__builtin_ia32_psignb((__v8qi)__a, (__v8qi)__b);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_sign_pi16(__m64 __a, __m64 __b)
+{
+ return (__m64)__builtin_ia32_psignw((__v4hi)__a, (__v4hi)__b);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_sign_pi32(__m64 __a, __m64 __b)
+{
+ return (__m64)__builtin_ia32_psignd((__v2si)__a, (__v2si)__b);
+}
+
+#endif /* __SSSE3__ */
+
+#endif /* __TMMINTRIN_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/unwind.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/unwind.h
new file mode 100644
index 0000000..e94fd70
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/unwind.h
@@ -0,0 +1,133 @@
+/*===---- unwind.h - Stack unwinding ----------------------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+/* See "Data Definitions for libgcc_s" in the Linux Standard Base.*/
+
+#ifndef __CLANG_UNWIND_H
+#define __CLANG_UNWIND_H
+
+#if __has_include_next(<unwind.h>)
+/* Darwin and libunwind provide an unwind.h. If that's available, use
+ * it. libunwind wraps some of its definitions in #ifdef _GNU_SOURCE,
+ * so define that around the include.*/
+# ifndef _GNU_SOURCE
+# define _SHOULD_UNDEFINE_GNU_SOURCE
+# define _GNU_SOURCE
+# endif
+// libunwind's unwind.h reflects the current visibility. However, Mozilla
+// builds with -fvisibility=hidden and relies on gcc's unwind.h to reset the
+// visibility to default and export its contents. gcc also allows users to
+// override its override by #defining HIDE_EXPORTS (but note, this only obeys
+// the user's -fvisibility setting; it doesn't hide any exports on its own). We
+// imitate gcc's header here:
+# ifdef HIDE_EXPORTS
+# include_next <unwind.h>
+# else
+# pragma GCC visibility push(default)
+# include_next <unwind.h>
+# pragma GCC visibility pop
+# endif
+# ifdef _SHOULD_UNDEFINE_GNU_SOURCE
+# undef _GNU_SOURCE
+# undef _SHOULD_UNDEFINE_GNU_SOURCE
+# endif
+#else
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* It is a bit strange for a header to play with the visibility of the
+ symbols it declares, but this matches gcc's behavior and some programs
+ depend on it */
+#ifndef HIDE_EXPORTS
+#pragma GCC visibility push(default)
+#endif
+
+struct _Unwind_Context;
+typedef enum {
+ _URC_NO_REASON = 0,
+ _URC_FOREIGN_EXCEPTION_CAUGHT = 1,
+
+ _URC_FATAL_PHASE2_ERROR = 2,
+ _URC_FATAL_PHASE1_ERROR = 3,
+ _URC_NORMAL_STOP = 4,
+
+ _URC_END_OF_STACK = 5,
+ _URC_HANDLER_FOUND = 6,
+ _URC_INSTALL_CONTEXT = 7,
+ _URC_CONTINUE_UNWIND = 8
+} _Unwind_Reason_Code;
+
+
+#ifdef __arm__
+
+typedef enum {
+ _UVRSC_CORE = 0, /* integer register */
+ _UVRSC_VFP = 1, /* vfp */
+ _UVRSC_WMMXD = 3, /* Intel WMMX data register */
+ _UVRSC_WMMXC = 4 /* Intel WMMX control register */
+} _Unwind_VRS_RegClass;
+
+typedef enum {
+ _UVRSD_UINT32 = 0,
+ _UVRSD_VFPX = 1,
+ _UVRSD_UINT64 = 3,
+ _UVRSD_FLOAT = 4,
+ _UVRSD_DOUBLE = 5
+} _Unwind_VRS_DataRepresentation;
+
+typedef enum {
+ _UVRSR_OK = 0,
+ _UVRSR_NOT_IMPLEMENTED = 1,
+ _UVRSR_FAILED = 2
+} _Unwind_VRS_Result;
+
+_Unwind_VRS_Result _Unwind_VRS_Get(struct _Unwind_Context *__context,
+ _Unwind_VRS_RegClass __regclass,
+ uint32_t __regno,
+ _Unwind_VRS_DataRepresentation __representation,
+ void *__valuep);
+
+#else
+
+uintptr_t _Unwind_GetIP(struct _Unwind_Context* __context);
+
+#endif
+
+typedef _Unwind_Reason_Code (*_Unwind_Trace_Fn)(struct _Unwind_Context*, void*);
+_Unwind_Reason_Code _Unwind_Backtrace(_Unwind_Trace_Fn, void*);
+
+#ifndef HIDE_EXPORTS
+#pragma GCC visibility pop
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+#endif /* __CLANG_UNWIND_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/varargs.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/varargs.h
new file mode 100644
index 0000000..b5477d0
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/varargs.h
@@ -0,0 +1,26 @@
+/*===---- varargs.h - Variable argument handling -------------------------------------===
+*
+* Permission is hereby granted, free of charge, to any person obtaining a copy
+* of this software and associated documentation files (the "Software"), to deal
+* in the Software without restriction, including without limitation the rights
+* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+* copies of the Software, and to permit persons to whom the Software is
+* furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included in
+* all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+* THE SOFTWARE.
+*
+*===-----------------------------------------------------------------------===
+*/
+#ifndef __VARARGS_H
+#define __VARARGS_H
+ #error "Please use <stdarg.h> instead of <varargs.h>"
+#endif
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/wmmintrin.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/wmmintrin.h
new file mode 100644
index 0000000..369e3c2
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/wmmintrin.h
@@ -0,0 +1,42 @@
+/*===---- wmmintrin.h - AES intrinsics ------------------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef _WMMINTRIN_H
+#define _WMMINTRIN_H
+
+#include <emmintrin.h>
+
+#if !defined (__AES__) && !defined (__PCLMUL__)
+# error "AES/PCLMUL instructions not enabled"
+#else
+
+#ifdef __AES__
+#include <__wmmintrin_aes.h>
+#endif /* __AES__ */
+
+#ifdef __PCLMUL__
+#include <__wmmintrin_pclmul.h>
+#endif /* __PCLMUL__ */
+
+#endif /* __AES__ || __PCLMUL__ */
+#endif /* _WMMINTRIN_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/x86intrin.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/x86intrin.h
new file mode 100644
index 0000000..94fbe2f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/x86intrin.h
@@ -0,0 +1,75 @@
+/*===---- x86intrin.h - X86 intrinsics -------------------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef __X86INTRIN_H
+#define __X86INTRIN_H
+
+#include <immintrin.h>
+
+#ifdef __3dNOW__
+#include <mm3dnow.h>
+#endif
+
+#ifdef __BMI__
+#include <bmiintrin.h>
+#endif
+
+#ifdef __BMI2__
+#include <bmi2intrin.h>
+#endif
+
+#ifdef __LZCNT__
+#include <lzcntintrin.h>
+#endif
+
+#ifdef __POPCNT__
+#include <popcntintrin.h>
+#endif
+
+#ifdef __RDSEED__
+#include <rdseedintrin.h>
+#endif
+
+#ifdef __PRFCHW__
+#include <prfchwintrin.h>
+#endif
+
+#ifdef __SSE4A__
+#include <ammintrin.h>
+#endif
+
+#ifdef __FMA4__
+#include <fma4intrin.h>
+#endif
+
+#ifdef __XOP__
+#include <xopintrin.h>
+#endif
+
+#ifdef __F16C__
+#include <f16cintrin.h>
+#endif
+
+// FIXME: LWP
+
+#endif /* __X86INTRIN_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/xmmintrin.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/xmmintrin.h
new file mode 100644
index 0000000..c68d3ed
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/xmmintrin.h
@@ -0,0 +1,1001 @@
+/*===---- xmmintrin.h - SSE intrinsics -------------------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef __XMMINTRIN_H
+#define __XMMINTRIN_H
+
+#ifndef __SSE__
+#error "SSE instruction set not enabled"
+#else
+
+#include <mmintrin.h>
+
+typedef int __v4si __attribute__((__vector_size__(16)));
+typedef float __v4sf __attribute__((__vector_size__(16)));
+typedef float __m128 __attribute__((__vector_size__(16)));
+
+// This header should only be included in a hosted environment as it depends on
+// a standard library to provide allocation routines.
+#if __STDC_HOSTED__
+#include <mm_malloc.h>
+#endif
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_add_ss(__m128 __a, __m128 __b)
+{
+ __a[0] += __b[0];
+ return __a;
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_add_ps(__m128 __a, __m128 __b)
+{
+ return __a + __b;
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_sub_ss(__m128 __a, __m128 __b)
+{
+ __a[0] -= __b[0];
+ return __a;
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_sub_ps(__m128 __a, __m128 __b)
+{
+ return __a - __b;
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_mul_ss(__m128 __a, __m128 __b)
+{
+ __a[0] *= __b[0];
+ return __a;
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_mul_ps(__m128 __a, __m128 __b)
+{
+ return __a * __b;
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_div_ss(__m128 __a, __m128 __b)
+{
+ __a[0] /= __b[0];
+ return __a;
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_div_ps(__m128 __a, __m128 __b)
+{
+ return __a / __b;
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_sqrt_ss(__m128 __a)
+{
+ __m128 __c = __builtin_ia32_sqrtss(__a);
+ return (__m128) { __c[0], __a[1], __a[2], __a[3] };
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_sqrt_ps(__m128 __a)
+{
+ return __builtin_ia32_sqrtps(__a);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_rcp_ss(__m128 __a)
+{
+ __m128 __c = __builtin_ia32_rcpss(__a);
+ return (__m128) { __c[0], __a[1], __a[2], __a[3] };
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_rcp_ps(__m128 __a)
+{
+ return __builtin_ia32_rcpps(__a);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_rsqrt_ss(__m128 __a)
+{
+ __m128 __c = __builtin_ia32_rsqrtss(__a);
+ return (__m128) { __c[0], __a[1], __a[2], __a[3] };
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_rsqrt_ps(__m128 __a)
+{
+ return __builtin_ia32_rsqrtps(__a);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_min_ss(__m128 __a, __m128 __b)
+{
+ return __builtin_ia32_minss(__a, __b);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_min_ps(__m128 __a, __m128 __b)
+{
+ return __builtin_ia32_minps(__a, __b);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_max_ss(__m128 __a, __m128 __b)
+{
+ return __builtin_ia32_maxss(__a, __b);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_max_ps(__m128 __a, __m128 __b)
+{
+ return __builtin_ia32_maxps(__a, __b);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_and_ps(__m128 __a, __m128 __b)
+{
+ return (__m128)((__v4si)__a & (__v4si)__b);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_andnot_ps(__m128 __a, __m128 __b)
+{
+ return (__m128)(~(__v4si)__a & (__v4si)__b);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_or_ps(__m128 __a, __m128 __b)
+{
+ return (__m128)((__v4si)__a | (__v4si)__b);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_xor_ps(__m128 __a, __m128 __b)
+{
+ return (__m128)((__v4si)__a ^ (__v4si)__b);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cmpeq_ss(__m128 __a, __m128 __b)
+{
+ return (__m128)__builtin_ia32_cmpss(__a, __b, 0);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cmpeq_ps(__m128 __a, __m128 __b)
+{
+ return (__m128)__builtin_ia32_cmpps(__a, __b, 0);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cmplt_ss(__m128 __a, __m128 __b)
+{
+ return (__m128)__builtin_ia32_cmpss(__a, __b, 1);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cmplt_ps(__m128 __a, __m128 __b)
+{
+ return (__m128)__builtin_ia32_cmpps(__a, __b, 1);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cmple_ss(__m128 __a, __m128 __b)
+{
+ return (__m128)__builtin_ia32_cmpss(__a, __b, 2);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cmple_ps(__m128 __a, __m128 __b)
+{
+ return (__m128)__builtin_ia32_cmpps(__a, __b, 2);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cmpgt_ss(__m128 __a, __m128 __b)
+{
+ return (__m128)__builtin_shufflevector(__a,
+ __builtin_ia32_cmpss(__b, __a, 1),
+ 4, 1, 2, 3);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cmpgt_ps(__m128 __a, __m128 __b)
+{
+ return (__m128)__builtin_ia32_cmpps(__b, __a, 1);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cmpge_ss(__m128 __a, __m128 __b)
+{
+ return (__m128)__builtin_shufflevector(__a,
+ __builtin_ia32_cmpss(__b, __a, 2),
+ 4, 1, 2, 3);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cmpge_ps(__m128 __a, __m128 __b)
+{
+ return (__m128)__builtin_ia32_cmpps(__b, __a, 2);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cmpneq_ss(__m128 __a, __m128 __b)
+{
+ return (__m128)__builtin_ia32_cmpss(__a, __b, 4);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cmpneq_ps(__m128 __a, __m128 __b)
+{
+ return (__m128)__builtin_ia32_cmpps(__a, __b, 4);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cmpnlt_ss(__m128 __a, __m128 __b)
+{
+ return (__m128)__builtin_ia32_cmpss(__a, __b, 5);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cmpnlt_ps(__m128 __a, __m128 __b)
+{
+ return (__m128)__builtin_ia32_cmpps(__a, __b, 5);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cmpnle_ss(__m128 __a, __m128 __b)
+{
+ return (__m128)__builtin_ia32_cmpss(__a, __b, 6);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cmpnle_ps(__m128 __a, __m128 __b)
+{
+ return (__m128)__builtin_ia32_cmpps(__a, __b, 6);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cmpngt_ss(__m128 __a, __m128 __b)
+{
+ return (__m128)__builtin_shufflevector(__a,
+ __builtin_ia32_cmpss(__b, __a, 5),
+ 4, 1, 2, 3);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cmpngt_ps(__m128 __a, __m128 __b)
+{
+ return (__m128)__builtin_ia32_cmpps(__b, __a, 5);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cmpnge_ss(__m128 __a, __m128 __b)
+{
+ return (__m128)__builtin_shufflevector(__a,
+ __builtin_ia32_cmpss(__b, __a, 6),
+ 4, 1, 2, 3);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cmpnge_ps(__m128 __a, __m128 __b)
+{
+ return (__m128)__builtin_ia32_cmpps(__b, __a, 6);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cmpord_ss(__m128 __a, __m128 __b)
+{
+ return (__m128)__builtin_ia32_cmpss(__a, __b, 7);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cmpord_ps(__m128 __a, __m128 __b)
+{
+ return (__m128)__builtin_ia32_cmpps(__a, __b, 7);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cmpunord_ss(__m128 __a, __m128 __b)
+{
+ return (__m128)__builtin_ia32_cmpss(__a, __b, 3);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cmpunord_ps(__m128 __a, __m128 __b)
+{
+ return (__m128)__builtin_ia32_cmpps(__a, __b, 3);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_comieq_ss(__m128 __a, __m128 __b)
+{
+ return __builtin_ia32_comieq(__a, __b);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_comilt_ss(__m128 __a, __m128 __b)
+{
+ return __builtin_ia32_comilt(__a, __b);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_comile_ss(__m128 __a, __m128 __b)
+{
+ return __builtin_ia32_comile(__a, __b);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_comigt_ss(__m128 __a, __m128 __b)
+{
+ return __builtin_ia32_comigt(__a, __b);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_comige_ss(__m128 __a, __m128 __b)
+{
+ return __builtin_ia32_comige(__a, __b);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_comineq_ss(__m128 __a, __m128 __b)
+{
+ return __builtin_ia32_comineq(__a, __b);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_ucomieq_ss(__m128 __a, __m128 __b)
+{
+ return __builtin_ia32_ucomieq(__a, __b);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_ucomilt_ss(__m128 __a, __m128 __b)
+{
+ return __builtin_ia32_ucomilt(__a, __b);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_ucomile_ss(__m128 __a, __m128 __b)
+{
+ return __builtin_ia32_ucomile(__a, __b);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_ucomigt_ss(__m128 __a, __m128 __b)
+{
+ return __builtin_ia32_ucomigt(__a, __b);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_ucomige_ss(__m128 __a, __m128 __b)
+{
+ return __builtin_ia32_ucomige(__a, __b);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_ucomineq_ss(__m128 __a, __m128 __b)
+{
+ return __builtin_ia32_ucomineq(__a, __b);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_cvtss_si32(__m128 __a)
+{
+ return __builtin_ia32_cvtss2si(__a);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_cvt_ss2si(__m128 __a)
+{
+ return _mm_cvtss_si32(__a);
+}
+
+#ifdef __x86_64__
+
+static __inline__ long long __attribute__((__always_inline__, __nodebug__))
+_mm_cvtss_si64(__m128 __a)
+{
+ return __builtin_ia32_cvtss2si64(__a);
+}
+
+#endif
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_cvtps_pi32(__m128 __a)
+{
+ return (__m64)__builtin_ia32_cvtps2pi(__a);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_cvt_ps2pi(__m128 __a)
+{
+ return _mm_cvtps_pi32(__a);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_cvttss_si32(__m128 __a)
+{
+ return __a[0];
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_cvtt_ss2si(__m128 __a)
+{
+ return _mm_cvttss_si32(__a);
+}
+
+static __inline__ long long __attribute__((__always_inline__, __nodebug__))
+_mm_cvttss_si64(__m128 __a)
+{
+ return __a[0];
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_cvttps_pi32(__m128 __a)
+{
+ return (__m64)__builtin_ia32_cvttps2pi(__a);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_cvtt_ps2pi(__m128 __a)
+{
+ return _mm_cvttps_pi32(__a);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cvtsi32_ss(__m128 __a, int __b)
+{
+ __a[0] = __b;
+ return __a;
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cvt_si2ss(__m128 __a, int __b)
+{
+ return _mm_cvtsi32_ss(__a, __b);
+}
+
+#ifdef __x86_64__
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cvtsi64_ss(__m128 __a, long long __b)
+{
+ __a[0] = __b;
+ return __a;
+}
+
+#endif
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cvtpi32_ps(__m128 __a, __m64 __b)
+{
+ return __builtin_ia32_cvtpi2ps(__a, (__v2si)__b);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cvt_pi2ps(__m128 __a, __m64 __b)
+{
+ return _mm_cvtpi32_ps(__a, __b);
+}
+
+static __inline__ float __attribute__((__always_inline__, __nodebug__))
+_mm_cvtss_f32(__m128 __a)
+{
+ return __a[0];
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_loadh_pi(__m128 __a, const __m64 *__p)
+{
+ typedef float __mm_loadh_pi_v2f32 __attribute__((__vector_size__(8)));
+ struct __mm_loadh_pi_struct {
+ __mm_loadh_pi_v2f32 __u;
+ } __attribute__((__packed__, __may_alias__));
+ __mm_loadh_pi_v2f32 __b = ((struct __mm_loadh_pi_struct*)__p)->__u;
+ __m128 __bb = __builtin_shufflevector(__b, __b, 0, 1, 0, 1);
+ return __builtin_shufflevector(__a, __bb, 0, 1, 4, 5);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_loadl_pi(__m128 __a, const __m64 *__p)
+{
+ typedef float __mm_loadl_pi_v2f32 __attribute__((__vector_size__(8)));
+ struct __mm_loadl_pi_struct {
+ __mm_loadl_pi_v2f32 __u;
+ } __attribute__((__packed__, __may_alias__));
+ __mm_loadl_pi_v2f32 __b = ((struct __mm_loadl_pi_struct*)__p)->__u;
+ __m128 __bb = __builtin_shufflevector(__b, __b, 0, 1, 0, 1);
+ return __builtin_shufflevector(__a, __bb, 4, 5, 2, 3);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_load_ss(const float *__p)
+{
+ struct __mm_load_ss_struct {
+ float __u;
+ } __attribute__((__packed__, __may_alias__));
+ float __u = ((struct __mm_load_ss_struct*)__p)->__u;
+ return (__m128){ __u, 0, 0, 0 };
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_load1_ps(const float *__p)
+{
+ struct __mm_load1_ps_struct {
+ float __u;
+ } __attribute__((__packed__, __may_alias__));
+ float __u = ((struct __mm_load1_ps_struct*)__p)->__u;
+ return (__m128){ __u, __u, __u, __u };
+}
+
+#define _mm_load_ps1(p) _mm_load1_ps(p)
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_load_ps(const float *__p)
+{
+ return *(__m128*)__p;
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_loadu_ps(const float *__p)
+{
+ struct __loadu_ps {
+ __m128 __v;
+ } __attribute__((__packed__, __may_alias__));
+ return ((struct __loadu_ps*)__p)->__v;
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_loadr_ps(const float *__p)
+{
+ __m128 __a = _mm_load_ps(__p);
+ return __builtin_shufflevector(__a, __a, 3, 2, 1, 0);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_set_ss(float __w)
+{
+ return (__m128){ __w, 0, 0, 0 };
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_set1_ps(float __w)
+{
+ return (__m128){ __w, __w, __w, __w };
+}
+
+// Microsoft specific.
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_set_ps1(float __w)
+{
+ return _mm_set1_ps(__w);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_set_ps(float __z, float __y, float __x, float __w)
+{
+ return (__m128){ __w, __x, __y, __z };
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_setr_ps(float __z, float __y, float __x, float __w)
+{
+ return (__m128){ __z, __y, __x, __w };
+}
+
+static __inline__ __m128 __attribute__((__always_inline__))
+_mm_setzero_ps(void)
+{
+ return (__m128){ 0, 0, 0, 0 };
+}
+
+static __inline__ void __attribute__((__always_inline__))
+_mm_storeh_pi(__m64 *__p, __m128 __a)
+{
+ __builtin_ia32_storehps((__v2si *)__p, __a);
+}
+
+static __inline__ void __attribute__((__always_inline__))
+_mm_storel_pi(__m64 *__p, __m128 __a)
+{
+ __builtin_ia32_storelps((__v2si *)__p, __a);
+}
+
+static __inline__ void __attribute__((__always_inline__))
+_mm_store_ss(float *__p, __m128 __a)
+{
+ struct __mm_store_ss_struct {
+ float __u;
+ } __attribute__((__packed__, __may_alias__));
+ ((struct __mm_store_ss_struct*)__p)->__u = __a[0];
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_storeu_ps(float *__p, __m128 __a)
+{
+ __builtin_ia32_storeups(__p, __a);
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_store1_ps(float *__p, __m128 __a)
+{
+ __a = __builtin_shufflevector(__a, __a, 0, 0, 0, 0);
+ _mm_storeu_ps(__p, __a);
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_store_ps1(float *__p, __m128 __a)
+{
+ return _mm_store1_ps(__p, __a);
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_store_ps(float *__p, __m128 __a)
+{
+ *(__m128 *)__p = __a;
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_storer_ps(float *__p, __m128 __a)
+{
+ __a = __builtin_shufflevector(__a, __a, 3, 2, 1, 0);
+ _mm_store_ps(__p, __a);
+}
+
+#define _MM_HINT_T0 3
+#define _MM_HINT_T1 2
+#define _MM_HINT_T2 1
+#define _MM_HINT_NTA 0
+
+/* FIXME: We have to #define this because "sel" must be a constant integer, and
+ Sema doesn't do any form of constant propagation yet. */
+
+#define _mm_prefetch(a, sel) (__builtin_prefetch((void *)(a), 0, (sel)))
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_stream_pi(__m64 *__p, __m64 __a)
+{
+ __builtin_ia32_movntq(__p, __a);
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_stream_ps(float *__p, __m128 __a)
+{
+ __builtin_ia32_movntps(__p, __a);
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_sfence(void)
+{
+ __builtin_ia32_sfence();
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_extract_pi16(__m64 __a, int __n)
+{
+ __v4hi __b = (__v4hi)__a;
+ return (unsigned short)__b[__n & 3];
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_insert_pi16(__m64 __a, int __d, int __n)
+{
+ __v4hi __b = (__v4hi)__a;
+ __b[__n & 3] = __d;
+ return (__m64)__b;
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_max_pi16(__m64 __a, __m64 __b)
+{
+ return (__m64)__builtin_ia32_pmaxsw((__v4hi)__a, (__v4hi)__b);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_max_pu8(__m64 __a, __m64 __b)
+{
+ return (__m64)__builtin_ia32_pmaxub((__v8qi)__a, (__v8qi)__b);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_min_pi16(__m64 __a, __m64 __b)
+{
+ return (__m64)__builtin_ia32_pminsw((__v4hi)__a, (__v4hi)__b);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_min_pu8(__m64 __a, __m64 __b)
+{
+ return (__m64)__builtin_ia32_pminub((__v8qi)__a, (__v8qi)__b);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_movemask_pi8(__m64 __a)
+{
+ return __builtin_ia32_pmovmskb((__v8qi)__a);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_mulhi_pu16(__m64 __a, __m64 __b)
+{
+ return (__m64)__builtin_ia32_pmulhuw((__v4hi)__a, (__v4hi)__b);
+}
+
+#define _mm_shuffle_pi16(a, n) __extension__ ({ \
+ __m64 __a = (a); \
+ (__m64)__builtin_ia32_pshufw((__v4hi)__a, (n)); })
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_maskmove_si64(__m64 __d, __m64 __n, char *__p)
+{
+ __builtin_ia32_maskmovq((__v8qi)__d, (__v8qi)__n, __p);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_avg_pu8(__m64 __a, __m64 __b)
+{
+ return (__m64)__builtin_ia32_pavgb((__v8qi)__a, (__v8qi)__b);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_avg_pu16(__m64 __a, __m64 __b)
+{
+ return (__m64)__builtin_ia32_pavgw((__v4hi)__a, (__v4hi)__b);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_sad_pu8(__m64 __a, __m64 __b)
+{
+ return (__m64)__builtin_ia32_psadbw((__v8qi)__a, (__v8qi)__b);
+}
+
+static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))
+_mm_getcsr(void)
+{
+ return __builtin_ia32_stmxcsr();
+}
+
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_mm_setcsr(unsigned int __i)
+{
+ __builtin_ia32_ldmxcsr(__i);
+}
+
+#define _mm_shuffle_ps(a, b, mask) __extension__ ({ \
+ __m128 __a = (a); \
+ __m128 __b = (b); \
+ (__m128)__builtin_shufflevector((__v4sf)__a, (__v4sf)__b, \
+ (mask) & 0x3, ((mask) & 0xc) >> 2, \
+ (((mask) & 0x30) >> 4) + 4, \
+ (((mask) & 0xc0) >> 6) + 4); })
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_unpackhi_ps(__m128 __a, __m128 __b)
+{
+ return __builtin_shufflevector(__a, __b, 2, 6, 3, 7);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_unpacklo_ps(__m128 __a, __m128 __b)
+{
+ return __builtin_shufflevector(__a, __b, 0, 4, 1, 5);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_move_ss(__m128 __a, __m128 __b)
+{
+ return __builtin_shufflevector(__a, __b, 4, 1, 2, 3);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_movehl_ps(__m128 __a, __m128 __b)
+{
+ return __builtin_shufflevector(__a, __b, 6, 7, 2, 3);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_movelh_ps(__m128 __a, __m128 __b)
+{
+ return __builtin_shufflevector(__a, __b, 0, 1, 4, 5);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cvtpi16_ps(__m64 __a)
+{
+ __m64 __b, __c;
+ __m128 __r;
+
+ __b = _mm_setzero_si64();
+ __b = _mm_cmpgt_pi16(__b, __a);
+ __c = _mm_unpackhi_pi16(__a, __b);
+ __r = _mm_setzero_ps();
+ __r = _mm_cvtpi32_ps(__r, __c);
+ __r = _mm_movelh_ps(__r, __r);
+ __c = _mm_unpacklo_pi16(__a, __b);
+ __r = _mm_cvtpi32_ps(__r, __c);
+
+ return __r;
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cvtpu16_ps(__m64 __a)
+{
+ __m64 __b, __c;
+ __m128 __r;
+
+ __b = _mm_setzero_si64();
+ __c = _mm_unpackhi_pi16(__a, __b);
+ __r = _mm_setzero_ps();
+ __r = _mm_cvtpi32_ps(__r, __c);
+ __r = _mm_movelh_ps(__r, __r);
+ __c = _mm_unpacklo_pi16(__a, __b);
+ __r = _mm_cvtpi32_ps(__r, __c);
+
+ return __r;
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cvtpi8_ps(__m64 __a)
+{
+ __m64 __b;
+
+ __b = _mm_setzero_si64();
+ __b = _mm_cmpgt_pi8(__b, __a);
+ __b = _mm_unpacklo_pi8(__a, __b);
+
+ return _mm_cvtpi16_ps(__b);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cvtpu8_ps(__m64 __a)
+{
+ __m64 __b;
+
+ __b = _mm_setzero_si64();
+ __b = _mm_unpacklo_pi8(__a, __b);
+
+ return _mm_cvtpi16_ps(__b);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_cvtpi32x2_ps(__m64 __a, __m64 __b)
+{
+ __m128 __c;
+
+ __c = _mm_setzero_ps();
+ __c = _mm_cvtpi32_ps(__c, __b);
+ __c = _mm_movelh_ps(__c, __c);
+
+ return _mm_cvtpi32_ps(__c, __a);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_cvtps_pi16(__m128 __a)
+{
+ __m64 __b, __c;
+
+ __b = _mm_cvtps_pi32(__a);
+ __a = _mm_movehl_ps(__a, __a);
+ __c = _mm_cvtps_pi32(__a);
+
+ return _mm_packs_pi16(__b, __c);
+}
+
+static __inline__ __m64 __attribute__((__always_inline__, __nodebug__))
+_mm_cvtps_pi8(__m128 __a)
+{
+ __m64 __b, __c;
+
+ __b = _mm_cvtps_pi16(__a);
+ __c = _mm_setzero_si64();
+
+ return _mm_packs_pi16(__b, __c);
+}
+
+static __inline__ int __attribute__((__always_inline__, __nodebug__))
+_mm_movemask_ps(__m128 __a)
+{
+ return __builtin_ia32_movmskps(__a);
+}
+
+#define _MM_SHUFFLE(z, y, x, w) (((z) << 6) | ((y) << 4) | ((x) << 2) | (w))
+
+#define _MM_EXCEPT_INVALID (0x0001)
+#define _MM_EXCEPT_DENORM (0x0002)
+#define _MM_EXCEPT_DIV_ZERO (0x0004)
+#define _MM_EXCEPT_OVERFLOW (0x0008)
+#define _MM_EXCEPT_UNDERFLOW (0x0010)
+#define _MM_EXCEPT_INEXACT (0x0020)
+#define _MM_EXCEPT_MASK (0x003f)
+
+#define _MM_MASK_INVALID (0x0080)
+#define _MM_MASK_DENORM (0x0100)
+#define _MM_MASK_DIV_ZERO (0x0200)
+#define _MM_MASK_OVERFLOW (0x0400)
+#define _MM_MASK_UNDERFLOW (0x0800)
+#define _MM_MASK_INEXACT (0x1000)
+#define _MM_MASK_MASK (0x1f80)
+
+#define _MM_ROUND_NEAREST (0x0000)
+#define _MM_ROUND_DOWN (0x2000)
+#define _MM_ROUND_UP (0x4000)
+#define _MM_ROUND_TOWARD_ZERO (0x6000)
+#define _MM_ROUND_MASK (0x6000)
+
+#define _MM_FLUSH_ZERO_MASK (0x8000)
+#define _MM_FLUSH_ZERO_ON (0x8000)
+#define _MM_FLUSH_ZERO_OFF (0x0000)
+
+#define _MM_GET_EXCEPTION_MASK() (_mm_getcsr() & _MM_MASK_MASK)
+#define _MM_GET_EXCEPTION_STATE() (_mm_getcsr() & _MM_EXCEPT_MASK)
+#define _MM_GET_FLUSH_ZERO_MODE() (_mm_getcsr() & _MM_FLUSH_ZERO_MASK)
+#define _MM_GET_ROUNDING_MODE() (_mm_getcsr() & _MM_ROUND_MASK)
+
+#define _MM_SET_EXCEPTION_MASK(x) (_mm_setcsr((_mm_getcsr() & ~_MM_MASK_MASK) | (x)))
+#define _MM_SET_EXCEPTION_STATE(x) (_mm_setcsr((_mm_getcsr() & ~_MM_EXCEPT_MASK) | (x)))
+#define _MM_SET_FLUSH_ZERO_MODE(x) (_mm_setcsr((_mm_getcsr() & ~_MM_FLUSH_ZERO_MASK) | (x)))
+#define _MM_SET_ROUNDING_MODE(x) (_mm_setcsr((_mm_getcsr() & ~_MM_ROUND_MASK) | (x)))
+
+#define _MM_TRANSPOSE4_PS(row0, row1, row2, row3) \
+do { \
+ __m128 tmp3, tmp2, tmp1, tmp0; \
+ tmp0 = _mm_unpacklo_ps((row0), (row1)); \
+ tmp2 = _mm_unpacklo_ps((row2), (row3)); \
+ tmp1 = _mm_unpackhi_ps((row0), (row1)); \
+ tmp3 = _mm_unpackhi_ps((row2), (row3)); \
+ (row0) = _mm_movelh_ps(tmp0, tmp2); \
+ (row1) = _mm_movehl_ps(tmp2, tmp0); \
+ (row2) = _mm_movelh_ps(tmp1, tmp3); \
+ (row3) = _mm_movehl_ps(tmp3, tmp1); \
+} while (0)
+
+/* Aliases for compatibility. */
+#define _m_pextrw _mm_extract_pi16
+#define _m_pinsrw _mm_insert_pi16
+#define _m_pmaxsw _mm_max_pi16
+#define _m_pmaxub _mm_max_pu8
+#define _m_pminsw _mm_min_pi16
+#define _m_pminub _mm_min_pu8
+#define _m_pmovmskb _mm_movemask_pi8
+#define _m_pmulhuw _mm_mulhi_pu16
+#define _m_pshufw _mm_shuffle_pi16
+#define _m_maskmovq _mm_maskmove_si64
+#define _m_pavgb _mm_avg_pu8
+#define _m_pavgw _mm_avg_pu16
+#define _m_psadbw _mm_sad_pu8
+#define _m_ _mm_
+#define _m_ _mm_
+
+/* Ugly hack for backwards-compatibility (compatible with gcc) */
+#ifdef __SSE2__
+#include <emmintrin.h>
+#endif
+
+#endif /* __SSE__ */
+
+#endif /* __XMMINTRIN_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/xopintrin.h b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/xopintrin.h
new file mode 100644
index 0000000..cc94ca0
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/clang-include/xopintrin.h
@@ -0,0 +1,804 @@
+/*===---- xopintrin.h - XOP intrinsics -------------------------------------===
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ *===-----------------------------------------------------------------------===
+ */
+
+#ifndef __X86INTRIN_H
+#error "Never use <xopintrin.h> directly; include <x86intrin.h> instead."
+#endif
+
+#ifndef __XOPINTRIN_H
+#define __XOPINTRIN_H
+
+#ifndef __XOP__
+# error "XOP instruction set is not enabled"
+#else
+
+#include <fma4intrin.h>
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_maccs_epi16(__m128i __A, __m128i __B, __m128i __C)
+{
+ return (__m128i)__builtin_ia32_vpmacssww((__v8hi)__A, (__v8hi)__B, (__v8hi)__C);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_macc_epi16(__m128i __A, __m128i __B, __m128i __C)
+{
+ return (__m128i)__builtin_ia32_vpmacsww((__v8hi)__A, (__v8hi)__B, (__v8hi)__C);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_maccsd_epi16(__m128i __A, __m128i __B, __m128i __C)
+{
+ return (__m128i)__builtin_ia32_vpmacsswd((__v8hi)__A, (__v8hi)__B, (__v4si)__C);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_maccd_epi16(__m128i __A, __m128i __B, __m128i __C)
+{
+ return (__m128i)__builtin_ia32_vpmacswd((__v8hi)__A, (__v8hi)__B, (__v4si)__C);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_maccs_epi32(__m128i __A, __m128i __B, __m128i __C)
+{
+ return (__m128i)__builtin_ia32_vpmacssdd((__v4si)__A, (__v4si)__B, (__v4si)__C);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_macc_epi32(__m128i __A, __m128i __B, __m128i __C)
+{
+ return (__m128i)__builtin_ia32_vpmacsdd((__v4si)__A, (__v4si)__B, (__v4si)__C);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_maccslo_epi32(__m128i __A, __m128i __B, __m128i __C)
+{
+ return (__m128i)__builtin_ia32_vpmacssdql((__v4si)__A, (__v4si)__B, (__v2di)__C);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_macclo_epi32(__m128i __A, __m128i __B, __m128i __C)
+{
+ return (__m128i)__builtin_ia32_vpmacsdql((__v4si)__A, (__v4si)__B, (__v2di)__C);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_maccshi_epi32(__m128i __A, __m128i __B, __m128i __C)
+{
+ return (__m128i)__builtin_ia32_vpmacssdqh((__v4si)__A, (__v4si)__B, (__v2di)__C);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_macchi_epi32(__m128i __A, __m128i __B, __m128i __C)
+{
+ return (__m128i)__builtin_ia32_vpmacsdqh((__v4si)__A, (__v4si)__B, (__v2di)__C);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_maddsd_epi16(__m128i __A, __m128i __B, __m128i __C)
+{
+ return (__m128i)__builtin_ia32_vpmadcsswd((__v8hi)__A, (__v8hi)__B, (__v4si)__C);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_maddd_epi16(__m128i __A, __m128i __B, __m128i __C)
+{
+ return (__m128i)__builtin_ia32_vpmadcswd((__v8hi)__A, (__v8hi)__B, (__v4si)__C);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_haddw_epi8(__m128i __A)
+{
+ return (__m128i)__builtin_ia32_vphaddbw((__v16qi)__A);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_haddd_epi8(__m128i __A)
+{
+ return (__m128i)__builtin_ia32_vphaddbd((__v16qi)__A);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_haddq_epi8(__m128i __A)
+{
+ return (__m128i)__builtin_ia32_vphaddbq((__v16qi)__A);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_haddd_epi16(__m128i __A)
+{
+ return (__m128i)__builtin_ia32_vphaddwd((__v8hi)__A);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_haddq_epi16(__m128i __A)
+{
+ return (__m128i)__builtin_ia32_vphaddwq((__v8hi)__A);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_haddq_epi32(__m128i __A)
+{
+ return (__m128i)__builtin_ia32_vphadddq((__v4si)__A);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_haddw_epu8(__m128i __A)
+{
+ return (__m128i)__builtin_ia32_vphaddubw((__v16qi)__A);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_haddd_epu8(__m128i __A)
+{
+ return (__m128i)__builtin_ia32_vphaddubd((__v16qi)__A);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_haddq_epu8(__m128i __A)
+{
+ return (__m128i)__builtin_ia32_vphaddubq((__v16qi)__A);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_haddd_epu16(__m128i __A)
+{
+ return (__m128i)__builtin_ia32_vphadduwd((__v8hi)__A);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_haddq_epu16(__m128i __A)
+{
+ return (__m128i)__builtin_ia32_vphadduwq((__v8hi)__A);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_haddq_epu32(__m128i __A)
+{
+ return (__m128i)__builtin_ia32_vphaddudq((__v4si)__A);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_hsubw_epi8(__m128i __A)
+{
+ return (__m128i)__builtin_ia32_vphsubbw((__v16qi)__A);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_hsubd_epi16(__m128i __A)
+{
+ return (__m128i)__builtin_ia32_vphsubwd((__v8hi)__A);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_hsubq_epi32(__m128i __A)
+{
+ return (__m128i)__builtin_ia32_vphsubdq((__v4si)__A);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_cmov_si128(__m128i __A, __m128i __B, __m128i __C)
+{
+ return (__m128i)__builtin_ia32_vpcmov(__A, __B, __C);
+}
+
+static __inline__ __m256i __attribute__((__always_inline__, __nodebug__))
+_mm256_cmov_si256(__m256i __A, __m256i __B, __m256i __C)
+{
+ return (__m256i)__builtin_ia32_vpcmov_256(__A, __B, __C);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_perm_epi8(__m128i __A, __m128i __B, __m128i __C)
+{
+ return (__m128i)__builtin_ia32_vpperm((__v16qi)__A, (__v16qi)__B, (__v16qi)__C);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_rot_epi8(__m128i __A, __m128i __B)
+{
+ return (__m128i)__builtin_ia32_vprotb((__v16qi)__A, (__v16qi)__B);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_rot_epi16(__m128i __A, __m128i __B)
+{
+ return (__m128i)__builtin_ia32_vprotw((__v8hi)__A, (__v8hi)__B);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_rot_epi32(__m128i __A, __m128i __B)
+{
+ return (__m128i)__builtin_ia32_vprotd((__v4si)__A, (__v4si)__B);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_rot_epi64(__m128i __A, __m128i __B)
+{
+ return (__m128i)__builtin_ia32_vprotq((__v2di)__A, (__v2di)__B);
+}
+
+#define _mm_roti_epi8(A, N) __extension__ ({ \
+ __m128i __A = (A); \
+ (__m128i)__builtin_ia32_vprotbi((__v16qi)__A, (N)); })
+
+#define _mm_roti_epi16(A, N) __extension__ ({ \
+ __m128i __A = (A); \
+ (__m128i)__builtin_ia32_vprotwi((__v8hi)__A, (N)); })
+
+#define _mm_roti_epi32(A, N) __extension__ ({ \
+ __m128i __A = (A); \
+ (__m128i)__builtin_ia32_vprotdi((__v4si)__A, (N)); })
+
+#define _mm_roti_epi64(A, N) __extension__ ({ \
+ __m128i __A = (A); \
+ (__m128i)__builtin_ia32_vprotqi((__v2di)__A, (N)); })
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_shl_epi8(__m128i __A, __m128i __B)
+{
+ return (__m128i)__builtin_ia32_vpshlb((__v16qi)__A, (__v16qi)__B);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_shl_epi16(__m128i __A, __m128i __B)
+{
+ return (__m128i)__builtin_ia32_vpshlw((__v8hi)__A, (__v8hi)__B);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_shl_epi32(__m128i __A, __m128i __B)
+{
+ return (__m128i)__builtin_ia32_vpshld((__v4si)__A, (__v4si)__B);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_shl_epi64(__m128i __A, __m128i __B)
+{
+ return (__m128i)__builtin_ia32_vpshlq((__v2di)__A, (__v2di)__B);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_sha_epi8(__m128i __A, __m128i __B)
+{
+ return (__m128i)__builtin_ia32_vpshab((__v16qi)__A, (__v16qi)__B);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_sha_epi16(__m128i __A, __m128i __B)
+{
+ return (__m128i)__builtin_ia32_vpshaw((__v8hi)__A, (__v8hi)__B);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_sha_epi32(__m128i __A, __m128i __B)
+{
+ return (__m128i)__builtin_ia32_vpshad((__v4si)__A, (__v4si)__B);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_sha_epi64(__m128i __A, __m128i __B)
+{
+ return (__m128i)__builtin_ia32_vpshaq((__v2di)__A, (__v2di)__B);
+}
+
+#define _mm_com_epu8(A, B, N) __extension__ ({ \
+ __m128i __A = (A); \
+ __m128i __B = (B); \
+ (__m128i)__builtin_ia32_vpcomub((__v16qi)__A, (__v16qi)__B, (N)); })
+
+#define _mm_com_epu16(A, B, N) __extension__ ({ \
+ __m128i __A = (A); \
+ __m128i __B = (B); \
+ (__m128i)__builtin_ia32_vpcomuw((__v8hi)__A, (__v8hi)__B, (N)); })
+
+#define _mm_com_epu32(A, B, N) __extension__ ({ \
+ __m128i __A = (A); \
+ __m128i __B = (B); \
+ (__m128i)__builtin_ia32_vpcomud((__v4si)__A, (__v4si)__B, (N)); })
+
+#define _mm_com_epu64(A, B, N) __extension__ ({ \
+ __m128i __A = (A); \
+ __m128i __B = (B); \
+ (__m128i)__builtin_ia32_vpcomuq((__v2di)__A, (__v2di)__B, (N)); })
+
+#define _mm_com_epi8(A, B, N) __extension__ ({ \
+ __m128i __A = (A); \
+ __m128i __B = (B); \
+ (__m128i)__builtin_ia32_vpcomb((__v16qi)__A, (__v16qi)__B, (N)); })
+
+#define _mm_com_epi16(A, B, N) __extension__ ({ \
+ __m128i __A = (A); \
+ __m128i __B = (B); \
+ (__m128i)__builtin_ia32_vpcomw((__v8hi)__A, (__v8hi)__B, (N)); })
+
+#define _mm_com_epi32(A, B, N) __extension__ ({ \
+ __m128i __A = (A); \
+ __m128i __B = (B); \
+ (__m128i)__builtin_ia32_vpcomd((__v4si)__A, (__v4si)__B, (N)); })
+
+#define _mm_com_epi64(A, B, N) __extension__ ({ \
+ __m128i __A = (A); \
+ __m128i __B = (B); \
+ (__m128i)__builtin_ia32_vpcomq((__v2di)__A, (__v2di)__B, (N)); })
+
+#define _MM_PCOMCTRL_LT 0
+#define _MM_PCOMCTRL_LE 1
+#define _MM_PCOMCTRL_GT 2
+#define _MM_PCOMCTRL_GE 3
+#define _MM_PCOMCTRL_EQ 4
+#define _MM_PCOMCTRL_NEQ 5
+#define _MM_PCOMCTRL_FALSE 6
+#define _MM_PCOMCTRL_TRUE 7
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comlt_epu8(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu8(__A, __B, _MM_PCOMCTRL_LT);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comle_epu8(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu8(__A, __B, _MM_PCOMCTRL_LE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comgt_epu8(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu8(__A, __B, _MM_PCOMCTRL_GT);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comge_epu8(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu8(__A, __B, _MM_PCOMCTRL_GE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comeq_epu8(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu8(__A, __B, _MM_PCOMCTRL_EQ);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comneq_epu8(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu8(__A, __B, _MM_PCOMCTRL_NEQ);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comfalse_epu8(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu8(__A, __B, _MM_PCOMCTRL_FALSE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comtrue_epu8(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu8(__A, __B, _MM_PCOMCTRL_TRUE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comlt_epu16(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu16(__A, __B, _MM_PCOMCTRL_LT);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comle_epu16(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu16(__A, __B, _MM_PCOMCTRL_LE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comgt_epu16(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu16(__A, __B, _MM_PCOMCTRL_GT);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comge_epu16(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu16(__A, __B, _MM_PCOMCTRL_GE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comeq_epu16(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu16(__A, __B, _MM_PCOMCTRL_EQ);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comneq_epu16(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu16(__A, __B, _MM_PCOMCTRL_NEQ);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comfalse_epu16(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu16(__A, __B, _MM_PCOMCTRL_FALSE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comtrue_epu16(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu16(__A, __B, _MM_PCOMCTRL_TRUE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comlt_epu32(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu32(__A, __B, _MM_PCOMCTRL_LT);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comle_epu32(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu32(__A, __B, _MM_PCOMCTRL_LE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comgt_epu32(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu32(__A, __B, _MM_PCOMCTRL_GT);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comge_epu32(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu32(__A, __B, _MM_PCOMCTRL_GE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comeq_epu32(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu32(__A, __B, _MM_PCOMCTRL_EQ);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comneq_epu32(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu32(__A, __B, _MM_PCOMCTRL_NEQ);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comfalse_epu32(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu32(__A, __B, _MM_PCOMCTRL_FALSE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comtrue_epu32(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu32(__A, __B, _MM_PCOMCTRL_TRUE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comlt_epu64(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu64(__A, __B, _MM_PCOMCTRL_LT);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comle_epu64(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu64(__A, __B, _MM_PCOMCTRL_LE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comgt_epu64(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu64(__A, __B, _MM_PCOMCTRL_GT);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comge_epu64(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu64(__A, __B, _MM_PCOMCTRL_GE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comeq_epu64(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu64(__A, __B, _MM_PCOMCTRL_EQ);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comneq_epu64(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu64(__A, __B, _MM_PCOMCTRL_NEQ);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comfalse_epu64(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu64(__A, __B, _MM_PCOMCTRL_FALSE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comtrue_epu64(__m128i __A, __m128i __B)
+{
+ return _mm_com_epu64(__A, __B, _MM_PCOMCTRL_TRUE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comlt_epi8(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi8(__A, __B, _MM_PCOMCTRL_LT);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comle_epi8(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi8(__A, __B, _MM_PCOMCTRL_LE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comgt_epi8(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi8(__A, __B, _MM_PCOMCTRL_GT);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comge_epi8(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi8(__A, __B, _MM_PCOMCTRL_GE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comeq_epi8(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi8(__A, __B, _MM_PCOMCTRL_EQ);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comneq_epi8(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi8(__A, __B, _MM_PCOMCTRL_NEQ);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comfalse_epi8(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi8(__A, __B, _MM_PCOMCTRL_FALSE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comtrue_epi8(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi8(__A, __B, _MM_PCOMCTRL_TRUE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comlt_epi16(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi16(__A, __B, _MM_PCOMCTRL_LT);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comle_epi16(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi16(__A, __B, _MM_PCOMCTRL_LE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comgt_epi16(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi16(__A, __B, _MM_PCOMCTRL_GT);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comge_epi16(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi16(__A, __B, _MM_PCOMCTRL_GE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comeq_epi16(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi16(__A, __B, _MM_PCOMCTRL_EQ);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comneq_epi16(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi16(__A, __B, _MM_PCOMCTRL_NEQ);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comfalse_epi16(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi16(__A, __B, _MM_PCOMCTRL_FALSE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comtrue_epi16(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi16(__A, __B, _MM_PCOMCTRL_TRUE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comlt_epi32(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi32(__A, __B, _MM_PCOMCTRL_LT);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comle_epi32(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi32(__A, __B, _MM_PCOMCTRL_LE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comgt_epi32(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi32(__A, __B, _MM_PCOMCTRL_GT);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comge_epi32(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi32(__A, __B, _MM_PCOMCTRL_GE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comeq_epi32(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi32(__A, __B, _MM_PCOMCTRL_EQ);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comneq_epi32(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi32(__A, __B, _MM_PCOMCTRL_NEQ);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comfalse_epi32(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi32(__A, __B, _MM_PCOMCTRL_FALSE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comtrue_epi32(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi32(__A, __B, _MM_PCOMCTRL_TRUE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comlt_epi64(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi64(__A, __B, _MM_PCOMCTRL_LT);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comle_epi64(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi64(__A, __B, _MM_PCOMCTRL_LE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comgt_epi64(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi64(__A, __B, _MM_PCOMCTRL_GT);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comge_epi64(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi64(__A, __B, _MM_PCOMCTRL_GE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comeq_epi64(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi64(__A, __B, _MM_PCOMCTRL_EQ);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comneq_epi64(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi64(__A, __B, _MM_PCOMCTRL_NEQ);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comfalse_epi64(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi64(__A, __B, _MM_PCOMCTRL_FALSE);
+}
+
+static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
+_mm_comtrue_epi64(__m128i __A, __m128i __B)
+{
+ return _mm_com_epi64(__A, __B, _MM_PCOMCTRL_TRUE);
+}
+
+#define _mm_permute2_pd(X, Y, C, I) __extension__ ({ \
+ __m128d __X = (X); \
+ __m128d __Y = (Y); \
+ __m128i __C = (C); \
+ (__m128d)__builtin_ia32_vpermil2pd((__v2df)__X, (__v2df)__Y, \
+ (__v2di)__C, (I)); })
+
+#define _mm256_permute2_pd(X, Y, C, I) __extension__ ({ \
+ __m256d __X = (X); \
+ __m256d __Y = (Y); \
+ __m256i __C = (C); \
+ (__m256d)__builtin_ia32_vpermil2pd256((__v4df)__X, (__v4df)__Y, \
+ (__v4di)__C, (I)); })
+
+#define _mm_permute2_ps(X, Y, C, I) __extension__ ({ \
+ __m128 __X = (X); \
+ __m128 __Y = (Y); \
+ __m128i __C = (C); \
+ (__m128)__builtin_ia32_vpermil2ps((__v4sf)__X, (__v4sf)__Y, \
+ (__v4si)__C, (I)); })
+
+#define _mm256_permute2_ps(X, Y, C, I) __extension__ ({ \
+ __m256 __X = (X); \
+ __m256 __Y = (Y); \
+ __m256i __C = (C); \
+ (__m256)__builtin_ia32_vpermil2ps256((__v8sf)__X, (__v8sf)__Y, \
+ (__v8si)__C, (I)); })
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_frcz_ss(__m128 __A)
+{
+ return (__m128)__builtin_ia32_vfrczss((__v4sf)__A);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_frcz_sd(__m128d __A)
+{
+ return (__m128d)__builtin_ia32_vfrczsd((__v2df)__A);
+}
+
+static __inline__ __m128 __attribute__((__always_inline__, __nodebug__))
+_mm_frcz_ps(__m128 __A)
+{
+ return (__m128)__builtin_ia32_vfrczps((__v4sf)__A);
+}
+
+static __inline__ __m128d __attribute__((__always_inline__, __nodebug__))
+_mm_frcz_pd(__m128d __A)
+{
+ return (__m128d)__builtin_ia32_vfrczpd((__v2df)__A);
+}
+
+static __inline__ __m256 __attribute__((__always_inline__, __nodebug__))
+_mm256_frcz_ps(__m256 __A)
+{
+ return (__m256)__builtin_ia32_vfrczps256((__v8sf)__A);
+}
+
+static __inline__ __m256d __attribute__((__always_inline__, __nodebug__))
+_mm256_frcz_pd(__m256d __A)
+{
+ return (__m256d)__builtin_ia32_vfrczpd256((__v4df)__A);
+}
+
+#endif /* __XOP__ */
+
+#endif /* __XOPINTRIN_H */
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_allocation.rsh b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_allocation.rsh
new file mode 100644
index 0000000..7dffa54
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_allocation.rsh
@@ -0,0 +1,378 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * 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.
+ */
+
+/** @file rs_allocation.rsh
+ * \brief Allocation routines
+ *
+ *
+ */
+
+#ifndef __RS_ALLOCATION_RSH__
+#define __RS_ALLOCATION_RSH__
+
+/**
+ * Returns the Allocation for a given pointer. The pointer should point within
+ * a valid allocation. The results are undefined if the pointer is not from a
+ * valid allocation.
+ *
+ * This function is deprecated and will be removed in the SDK from a future
+ * release.
+ */
+extern rs_allocation __attribute__((overloadable))
+ rsGetAllocation(const void *);
+
+/**
+ * Query the dimension of an allocation.
+ *
+ * @return uint32_t The X dimension of the allocation.
+ */
+extern uint32_t __attribute__((overloadable))
+ rsAllocationGetDimX(rs_allocation);
+
+/**
+ * Query the dimension of an allocation.
+ *
+ * @return uint32_t The Y dimension of the allocation.
+ */
+extern uint32_t __attribute__((overloadable))
+ rsAllocationGetDimY(rs_allocation);
+
+/**
+ * Query the dimension of an allocation.
+ *
+ * @return uint32_t The Z dimension of the allocation.
+ */
+extern uint32_t __attribute__((overloadable))
+ rsAllocationGetDimZ(rs_allocation);
+
+/**
+ * Query an allocation for the presence of more than one LOD.
+ *
+ * @return uint32_t Returns 1 if more than one LOD is present, 0 otherwise.
+ */
+extern uint32_t __attribute__((overloadable))
+ rsAllocationGetDimLOD(rs_allocation);
+
+/**
+ * Query an allocation for the presence of more than one face.
+ *
+ * @return uint32_t Returns 1 if more than one face is present, 0 otherwise.
+ */
+extern uint32_t __attribute__((overloadable))
+ rsAllocationGetDimFaces(rs_allocation);
+
+#if (defined(RS_VERSION) && (RS_VERSION >= 14))
+
+/**
+ * Copy part of an allocation from another allocation.
+ *
+ * @param dstAlloc Allocation to copy data into.
+ * @param dstOff The offset of the first element to be copied in
+ * the destination allocation.
+ * @param dstMip Mip level in the destination allocation.
+ * @param count The number of elements to be copied.
+ * @param srcAlloc The source data allocation.
+ * @param srcOff The offset of the first element in data to be
+ * copied in the source allocation.
+ * @param srcMip Mip level in the source allocation.
+ */
+extern void __attribute__((overloadable))
+ rsAllocationCopy1DRange(rs_allocation dstAlloc,
+ uint32_t dstOff, uint32_t dstMip,
+ uint32_t count,
+ rs_allocation srcAlloc,
+ uint32_t srcOff, uint32_t srcMip);
+
+/**
+ * Copy a rectangular region into the allocation from another
+ * allocation.
+ *
+ * @param dstAlloc allocation to copy data into.
+ * @param dstXoff X offset of the region to update in the
+ * destination allocation.
+ * @param dstYoff Y offset of the region to update in the
+ * destination allocation.
+ * @param dstMip Mip level in the destination allocation.
+ * @param dstFace Cubemap face of the destination allocation,
+ * ignored for allocations that aren't cubemaps.
+ * @param width Width of the incoming region to update.
+ * @param height Height of the incoming region to update.
+ * @param srcAlloc The source data allocation.
+ * @param srcXoff X offset in data of the source allocation.
+ * @param srcYoff Y offset in data of the source allocation.
+ * @param srcMip Mip level in the source allocation.
+ * @param srcFace Cubemap face of the source allocation,
+ * ignored for allocations that aren't cubemaps.
+ */
+extern void __attribute__((overloadable))
+ rsAllocationCopy2DRange(rs_allocation dstAlloc,
+ uint32_t dstXoff, uint32_t dstYoff,
+ uint32_t dstMip,
+ rs_allocation_cubemap_face dstFace,
+ uint32_t width, uint32_t height,
+ rs_allocation srcAlloc,
+ uint32_t srcXoff, uint32_t srcYoff,
+ uint32_t srcMip,
+ rs_allocation_cubemap_face srcFace);
+
+#endif //defined(RS_VERSION) && (RS_VERSION >= 14)
+
+/**
+ * Extract a single element from an allocation.
+ */
+extern const void * __attribute__((overloadable))
+ rsGetElementAt(rs_allocation a, uint32_t x);
+/**
+ * \overload
+ */
+extern const void * __attribute__((overloadable))
+ rsGetElementAt(rs_allocation a, uint32_t x, uint32_t y);
+/**
+ * \overload
+ */
+extern const void * __attribute__((overloadable))
+ rsGetElementAt(rs_allocation a, uint32_t x, uint32_t y, uint32_t z);
+
+
+#if (defined(RS_VERSION) && (RS_VERSION >= 18))
+ #define GET_ELEMENT_AT(T) \
+ extern T __attribute__((overloadable)) \
+ rsGetElementAt_##T(rs_allocation a, uint32_t x); \
+ extern T __attribute__((overloadable)) \
+ rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y); \
+ extern T __attribute__((overloadable)) \
+ rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y, uint32_t z);
+#else
+ #define GET_ELEMENT_AT(T) \
+ static inline T __attribute__((overloadable)) \
+ rsGetElementAt_##T(rs_allocation a, uint32_t x) { \
+ return ((T *)rsGetElementAt(a, x))[0]; \
+ } \
+ static inline T __attribute__((overloadable)) \
+ rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y) { \
+ return ((T *)rsGetElementAt(a, x, y))[0]; \
+ } \
+ static inline T __attribute__((overloadable)) \
+ rsGetElementAt_##T(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) { \
+ return ((T *)rsGetElementAt(a, x, y, z))[0]; \
+ }
+#endif
+
+GET_ELEMENT_AT(char)
+GET_ELEMENT_AT(char2)
+GET_ELEMENT_AT(char3)
+GET_ELEMENT_AT(char4)
+GET_ELEMENT_AT(uchar)
+GET_ELEMENT_AT(uchar2)
+GET_ELEMENT_AT(uchar3)
+GET_ELEMENT_AT(uchar4)
+GET_ELEMENT_AT(short)
+GET_ELEMENT_AT(short2)
+GET_ELEMENT_AT(short3)
+GET_ELEMENT_AT(short4)
+GET_ELEMENT_AT(ushort)
+GET_ELEMENT_AT(ushort2)
+GET_ELEMENT_AT(ushort3)
+GET_ELEMENT_AT(ushort4)
+GET_ELEMENT_AT(int)
+GET_ELEMENT_AT(int2)
+GET_ELEMENT_AT(int3)
+GET_ELEMENT_AT(int4)
+GET_ELEMENT_AT(uint)
+GET_ELEMENT_AT(uint2)
+GET_ELEMENT_AT(uint3)
+GET_ELEMENT_AT(uint4)
+GET_ELEMENT_AT(long)
+GET_ELEMENT_AT(long2)
+GET_ELEMENT_AT(long3)
+GET_ELEMENT_AT(long4)
+GET_ELEMENT_AT(ulong)
+GET_ELEMENT_AT(ulong2)
+GET_ELEMENT_AT(ulong3)
+GET_ELEMENT_AT(ulong4)
+GET_ELEMENT_AT(float)
+GET_ELEMENT_AT(float2)
+GET_ELEMENT_AT(float3)
+GET_ELEMENT_AT(float4)
+GET_ELEMENT_AT(double)
+GET_ELEMENT_AT(double2)
+GET_ELEMENT_AT(double3)
+GET_ELEMENT_AT(double4)
+
+#undef GET_ELEMENT_AT
+
+// Jelly Bean
+#if (defined(RS_VERSION) && (RS_VERSION >= 16))
+
+/**
+ * Send the contents of the Allocation to the queue.
+ * @param a allocation to work on
+ */
+extern const void __attribute__((overloadable))
+ rsAllocationIoSend(rs_allocation a);
+
+/**
+ * Receive a new set of contents from the queue.
+ * @param a allocation to work on
+ */
+extern const void __attribute__((overloadable))
+ rsAllocationIoReceive(rs_allocation a);
+
+
+/**
+ * Get the element object describing the allocation's layout
+ * @param a allocation to get data from
+ * @return element describing allocation layout
+ */
+extern rs_element __attribute__((overloadable))
+ rsAllocationGetElement(rs_allocation a);
+
+/**
+ * Fetch allocation in a way described by the sampler
+ * @param a 1D allocation to sample from
+ * @param s sampler state
+ * @param location to sample from
+ */
+extern const float4 __attribute__((overloadable))
+ rsSample(rs_allocation a, rs_sampler s, float location);
+/**
+ * Fetch allocation in a way described by the sampler
+ * @param a 1D allocation to sample from
+ * @param s sampler state
+ * @param location to sample from
+ * @param lod mip level to sample from, for fractional values
+ * mip levels will be interpolated if
+ * RS_SAMPLER_LINEAR_MIP_LINEAR is used
+ */
+extern const float4 __attribute__((overloadable))
+ rsSample(rs_allocation a, rs_sampler s, float location, float lod);
+
+/**
+ * Fetch allocation in a way described by the sampler
+ * @param a 2D allocation to sample from
+ * @param s sampler state
+ * @param location to sample from
+ */
+extern const float4 __attribute__((overloadable))
+ rsSample(rs_allocation a, rs_sampler s, float2 location);
+
+/**
+ * Fetch allocation in a way described by the sampler
+ * @param a 2D allocation to sample from
+ * @param s sampler state
+ * @param location to sample from
+ * @param lod mip level to sample from, for fractional values
+ * mip levels will be interpolated if
+ * RS_SAMPLER_LINEAR_MIP_LINEAR is used
+ */
+extern const float4 __attribute__((overloadable))
+ rsSample(rs_allocation a, rs_sampler s, float2 location, float lod);
+
+#endif // (defined(RS_VERSION) && (RS_VERSION >= 16))
+
+#if (defined(RS_VERSION) && (RS_VERSION >= 18))
+
+/**
+ * Set single element of an allocation.
+ */
+extern void __attribute__((overloadable))
+ rsSetElementAt(rs_allocation a, void* ptr, uint32_t x);
+
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsSetElementAt(rs_allocation a, void* ptr, uint32_t x, uint32_t y);
+
+#define SET_ELEMENT_AT(T) \
+ extern void __attribute__((overloadable)) \
+ rsSetElementAt_##T(rs_allocation a, T val, uint32_t x); \
+ extern void __attribute__((overloadable)) \
+ rsSetElementAt_##T(rs_allocation a, T val, uint32_t x, uint32_t y); \
+ extern void __attribute__((overloadable)) \
+ rsSetElementAt_##T(rs_allocation a, T val, uint32_t x, uint32_t y, uint32_t z);
+
+
+SET_ELEMENT_AT(char)
+SET_ELEMENT_AT(char2)
+SET_ELEMENT_AT(char3)
+SET_ELEMENT_AT(char4)
+SET_ELEMENT_AT(uchar)
+SET_ELEMENT_AT(uchar2)
+SET_ELEMENT_AT(uchar3)
+SET_ELEMENT_AT(uchar4)
+SET_ELEMENT_AT(short)
+SET_ELEMENT_AT(short2)
+SET_ELEMENT_AT(short3)
+SET_ELEMENT_AT(short4)
+SET_ELEMENT_AT(ushort)
+SET_ELEMENT_AT(ushort2)
+SET_ELEMENT_AT(ushort3)
+SET_ELEMENT_AT(ushort4)
+SET_ELEMENT_AT(int)
+SET_ELEMENT_AT(int2)
+SET_ELEMENT_AT(int3)
+SET_ELEMENT_AT(int4)
+SET_ELEMENT_AT(uint)
+SET_ELEMENT_AT(uint2)
+SET_ELEMENT_AT(uint3)
+SET_ELEMENT_AT(uint4)
+SET_ELEMENT_AT(long)
+SET_ELEMENT_AT(long2)
+SET_ELEMENT_AT(long3)
+SET_ELEMENT_AT(long4)
+SET_ELEMENT_AT(ulong)
+SET_ELEMENT_AT(ulong2)
+SET_ELEMENT_AT(ulong3)
+SET_ELEMENT_AT(ulong4)
+SET_ELEMENT_AT(float)
+SET_ELEMENT_AT(float2)
+SET_ELEMENT_AT(float3)
+SET_ELEMENT_AT(float4)
+SET_ELEMENT_AT(double)
+SET_ELEMENT_AT(double2)
+SET_ELEMENT_AT(double3)
+SET_ELEMENT_AT(double4)
+
+#undef SET_ELEMENT_AT
+
+
+/**
+ * Extract a single element from an allocation.
+ */
+extern const uchar __attribute__((overloadable))
+ rsGetElementAtYuv_uchar_Y(rs_allocation a, uint32_t x, uint32_t y);
+
+/**
+ * Extract a single element from an allocation.
+ *
+ * Coordinates are in the dimensions of the Y plane
+ */
+extern const uchar __attribute__((overloadable))
+ rsGetElementAtYuv_uchar_U(rs_allocation a, uint32_t x, uint32_t y);
+
+/**
+ * Extract a single element from an allocation.
+ *
+ * Coordinates are in the dimensions of the Y plane
+ */
+extern const uchar __attribute__((overloadable))
+ rsGetElementAtYuv_uchar_V(rs_allocation a, uint32_t x, uint32_t y);
+
+#endif // (defined(RS_VERSION) && (RS_VERSION >= 18))
+
+#endif
+
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_atomic.rsh b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_atomic.rsh
new file mode 100644
index 0000000..a455edd
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_atomic.rsh
@@ -0,0 +1,250 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * 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.
+ */
+
+/** @file rs_atomic.rsh
+ * \brief Atomic routines
+ *
+ *
+ */
+
+#ifndef __RS_ATOMIC_RSH__
+#define __RS_ATOMIC_RSH__
+
+#if (defined(RS_VERSION) && (RS_VERSION >= 14))
+
+/**
+ * Atomic add one to the value at addr.
+ * Equal to rsAtomicAdd(addr, 1)
+ *
+ * @param addr Address of value to increment
+ *
+ * @return old value
+ */
+extern int32_t __attribute__((overloadable))
+ rsAtomicInc(volatile int32_t* addr);
+/**
+ * Atomic add one to the value at addr.
+ * Equal to rsAtomicAdd(addr, 1)
+ *
+ * @param addr Address of value to increment
+ *
+ * @return old value
+ */
+extern uint32_t __attribute__((overloadable))
+ rsAtomicInc(volatile uint32_t* addr);
+
+/**
+ * Atomic subtract one from the value at addr. Equal to rsAtomicSub(addr, 1)
+ *
+ * @param addr Address of value to decrement
+ *
+ * @return old value
+ */
+extern int32_t __attribute__((overloadable))
+ rsAtomicDec(volatile int32_t* addr);
+/**
+ * Atomic subtract one from the value at addr. Equal to rsAtomicSub(addr, 1)
+ *
+ * @param addr Address of value to decrement
+ *
+ * @return old value
+ */
+extern uint32_t __attribute__((overloadable))
+ rsAtomicDec(volatile uint32_t* addr);
+
+/**
+ * Atomic add a value to the value at addr. addr[0] += value
+ *
+ * @param addr Address of value to modify
+ * @param value Amount to add to the value at addr
+ *
+ * @return old value
+ */
+extern int32_t __attribute__((overloadable))
+ rsAtomicAdd(volatile int32_t* addr, int32_t value);
+/**
+ * Atomic add a value to the value at addr. addr[0] += value
+ *
+ * @param addr Address of value to modify
+ * @param value Amount to add to the value at addr
+ *
+ * @return old value
+ */
+extern uint32_t __attribute__((overloadable))
+ rsAtomicAdd(volatile uint32_t* addr, uint32_t value);
+
+/**
+ * Atomic Subtract a value from the value at addr. addr[0] -= value
+ *
+ * @param addr Address of value to modify
+ * @param value Amount to subtract from the value at addr
+ *
+ * @return old value
+ */
+extern int32_t __attribute__((overloadable))
+ rsAtomicSub(volatile int32_t* addr, int32_t value);
+/**
+ * Atomic Subtract a value from the value at addr. addr[0] -= value
+ *
+ * @param addr Address of value to modify
+ * @param value Amount to subtract from the value at addr
+ *
+ * @return old value
+ */
+extern uint32_t __attribute__((overloadable))
+ rsAtomicSub(volatile uint32_t* addr, uint32_t value);
+
+/**
+ * Atomic Bitwise and a value from the value at addr. addr[0] &= value
+ *
+ * @param addr Address of value to modify
+ * @param value Amount to and with the value at addr
+ *
+ * @return old value
+ */
+extern int32_t __attribute__((overloadable))
+ rsAtomicAnd(volatile int32_t* addr, int32_t value);
+/**
+ * Atomic Bitwise and a value from the value at addr. addr[0] &= value
+ *
+ * @param addr Address of value to modify
+ * @param value Amount to and with the value at addr
+ *
+ * @return old value
+ */
+extern uint32_t __attribute__((overloadable))
+ rsAtomicAnd(volatile uint32_t* addr, uint32_t value);
+
+/**
+ * Atomic Bitwise or a value from the value at addr. addr[0] |= value
+ *
+ * @param addr Address of value to modify
+ * @param value Amount to or with the value at addr
+ *
+ * @return old value
+ */
+extern int32_t __attribute__((overloadable))
+ rsAtomicOr(volatile int32_t* addr, int32_t value);
+/**
+ * Atomic Bitwise or a value from the value at addr. addr[0] |= value
+ *
+ * @param addr Address of value to modify
+ * @param value Amount to or with the value at addr
+ *
+ * @return old value
+ */
+extern uint32_t __attribute__((overloadable))
+ rsAtomicOr(volatile uint32_t* addr, uint32_t value);
+
+/**
+ * Atomic Bitwise xor a value from the value at addr. addr[0] ^= value
+ *
+ * @param addr Address of value to modify
+ * @param value Amount to xor with the value at addr
+ *
+ * @return old value
+ */
+extern uint32_t __attribute__((overloadable))
+ rsAtomicXor(volatile uint32_t* addr, uint32_t value);
+/**
+ * Atomic Bitwise xor a value from the value at addr. addr[0] ^= value
+ *
+ * @param addr Address of value to modify
+ * @param value Amount to xor with the value at addr
+ *
+ * @return old value
+ */
+extern int32_t __attribute__((overloadable))
+ rsAtomicXor(volatile int32_t* addr, int32_t value);
+
+/**
+ * Atomic Set the value at addr to the min of addr and value
+ * addr[0] = rsMin(addr[0], value)
+ *
+ * @param addr Address of value to modify
+ * @param value comparison value
+ *
+ * @return old value
+ */
+extern uint32_t __attribute__((overloadable))
+ rsAtomicMin(volatile uint32_t* addr, uint32_t value);
+/**
+ * Atomic Set the value at addr to the min of addr and value
+ * addr[0] = rsMin(addr[0], value)
+ *
+ * @param addr Address of value to modify
+ * @param value comparison value
+ *
+ * @return old value
+ */
+extern int32_t __attribute__((overloadable))
+ rsAtomicMin(volatile int32_t* addr, int32_t value);
+
+/**
+ * Atomic Set the value at addr to the max of addr and value
+ * addr[0] = rsMax(addr[0], value)
+ *
+ * @param addr Address of value to modify
+ * @param value comparison value
+ *
+ * @return old value
+ */
+extern uint32_t __attribute__((overloadable))
+ rsAtomicMax(volatile uint32_t* addr, uint32_t value);
+/**
+ * Atomic Set the value at addr to the max of addr and value
+ * addr[0] = rsMin(addr[0], value)
+ *
+ * @param addr Address of value to modify
+ * @param value comparison value
+ *
+ * @return old value
+ */
+extern int32_t __attribute__((overloadable))
+ rsAtomicMax(volatile int32_t* addr, int32_t value);
+
+/**
+ * Compare-and-set operation with a full memory barrier.
+ *
+ * If the value at addr matches compareValue then newValue is written.
+ *
+ * @param addr The address to compare and replace if the compare passes.
+ * @param compareValue The value to test addr[0] against.
+ * @param newValue The value to write if the test passes.
+ *
+ * @return old value
+ */
+extern int32_t __attribute__((overloadable))
+ rsAtomicCas(volatile int32_t* addr, int32_t compareValue, int32_t newValue);
+
+/**
+ * Compare-and-set operation with a full memory barrier.
+ *
+ * If the value at addr matches compareValue then newValue is written.
+ *
+ * @param addr The address to compare and replace if the compare passes.
+ * @param compareValue The value to test addr[0] against.
+ * @param newValue The value to write if the test passes.
+ *
+ * @return old value
+ */
+extern uint32_t __attribute__((overloadable))
+ rsAtomicCas(volatile uint32_t* addr, uint32_t compareValue, uint32_t newValue);
+
+#endif //defined(RS_VERSION) && (RS_VERSION >= 14)
+
+#endif
+
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_cl.rsh b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_cl.rsh
new file mode 100644
index 0000000..2ff5d8b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_cl.rsh
@@ -0,0 +1,1120 @@
+/*
+ * Copyright (C) 2011-2012 The Android Open Source Project
+ *
+ * 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.
+ */
+
+/** @file rs_cl.rsh
+ * \brief Basic math functions
+ *
+ *
+ */
+
+#ifndef __RS_CL_RSH__
+#define __RS_CL_RSH__
+
+// Conversions
+#define CVT_FUNC_2(typeout, typein) \
+_RS_RUNTIME typeout##2 __attribute__((const, overloadable)) \
+ convert_##typeout##2(typein##2 v); \
+_RS_RUNTIME typeout##3 __attribute__((const, overloadable)) \
+ convert_##typeout##3(typein##3 v); \
+_RS_RUNTIME typeout##4 __attribute__((const, overloadable)) \
+ convert_##typeout##4(typein##4 v);
+
+
+#define CVT_FUNC(type) CVT_FUNC_2(type, uchar) \
+ CVT_FUNC_2(type, char) \
+ CVT_FUNC_2(type, ushort) \
+ CVT_FUNC_2(type, short) \
+ CVT_FUNC_2(type, uint) \
+ CVT_FUNC_2(type, int) \
+ CVT_FUNC_2(type, float)
+
+/**
+ * Convert to char.
+ *
+ * Supports 2,3,4 components of uchar, char, ushort, short, uint, int, float.
+ */
+CVT_FUNC(char)
+
+/**
+ * Convert to unsigned char.
+ *
+ * Supports 2,3,4 components of uchar, char, ushort, short, uint, int, float.
+ */
+CVT_FUNC(uchar)
+
+/**
+ * Convert to short.
+ *
+ * Supports 2,3,4 components of uchar, char, ushort, short, uint, int, float.
+ */
+CVT_FUNC(short)
+
+/**
+ * Convert to unsigned short.
+ *
+ * Supports 2,3,4 components of uchar, char, ushort, short, uint, int, float.
+ */
+CVT_FUNC(ushort)
+
+/**
+ * Convert to int.
+ *
+ * Supports 2,3,4 components of uchar, char, ushort, short, uint, int, float.
+ */
+CVT_FUNC(int)
+
+/**
+ * Convert to unsigned int.
+ *
+ * Supports 2,3,4 components of uchar, char, ushort, short, uint, int, float.
+ */
+CVT_FUNC(uint)
+
+/**
+ * Convert to float.
+ *
+ * Supports 2,3,4 components of uchar, char, ushort, short, uint, int, float.
+ */
+CVT_FUNC(float)
+
+// Float ops, 6.11.2
+
+#ifdef DOXYGEN
+
+#define FN_FUNC_FN(fnc)
+#define F_FUNC_FN(fnc)
+#define IN_FUNC_FN(fnc)
+#define FN_FUNC_FN_FN(fnc)
+#define F_FUNC_FN_FN(fnc)
+#define FN_FUNC_FN_F(fnc)
+#define FN_FUNC_FN_IN(fnc)
+#define FN_FUNC_FN_I(fnc)
+#define FN_FUNC_FN_PFN(fnc)
+#define FN_FUNC_FN_PIN(fnc)
+#define FN_FUNC_FN_FN_FN(fnc)
+#define FN_FUNC_FN_FN_F(fnc)
+#define FN_FUNC_FN_F_F(fnc)
+#define FN_FUNC_FN_FN_PIN(fnc)
+
+#else
+
+#define FN_FUNC_FN(fnc) \
+_RS_RUNTIME float2 __attribute__((const, overloadable)) fnc(float2 v); \
+_RS_RUNTIME float3 __attribute__((const, overloadable)) fnc(float3 v); \
+_RS_RUNTIME float4 __attribute__((const, overloadable)) fnc(float4 v);
+
+#define F_FUNC_FN(fnc) \
+_RS_RUNTIME float __attribute__((const, overloadable)) fnc(float2 v); \
+_RS_RUNTIME float __attribute__((const, overloadable)) fnc(float3 v); \
+_RS_RUNTIME float __attribute__((const, overloadable)) fnc(float4 v);
+
+#define IN_FUNC_FN(fnc) \
+_RS_RUNTIME int2 __attribute__((const, overloadable)) fnc(float2 v); \
+_RS_RUNTIME int3 __attribute__((const, overloadable)) fnc(float3 v); \
+_RS_RUNTIME int4 __attribute__((const, overloadable)) fnc(float4 v);
+
+#define FN_FUNC_FN_FN(fnc) \
+_RS_RUNTIME float2 __attribute__((const, overloadable)) fnc(float2 v1, float2 v2); \
+_RS_RUNTIME float3 __attribute__((const, overloadable)) fnc(float3 v1, float3 v2); \
+_RS_RUNTIME float4 __attribute__((const, overloadable)) fnc(float4 v1, float4 v2);
+
+#define F_FUNC_FN_FN(fnc) \
+_RS_RUNTIME float __attribute__((const, overloadable)) fnc(float2 v1, float2 v2); \
+_RS_RUNTIME float __attribute__((const, overloadable)) fnc(float3 v1, float3 v2); \
+_RS_RUNTIME float __attribute__((const, overloadable)) fnc(float4 v1, float4 v2);
+
+#define FN_FUNC_FN_F(fnc) \
+_RS_RUNTIME float2 __attribute__((const, overloadable)) fnc(float2 v1, float v2); \
+_RS_RUNTIME float3 __attribute__((const, overloadable)) fnc(float3 v1, float v2); \
+_RS_RUNTIME float4 __attribute__((const, overloadable)) fnc(float4 v1, float v2);
+
+#define FN_FUNC_FN_IN(fnc) \
+_RS_RUNTIME float2 __attribute__((const, overloadable)) fnc(float2 v1, int2 v2); \
+_RS_RUNTIME float3 __attribute__((const, overloadable)) fnc(float3 v1, int3 v2); \
+_RS_RUNTIME float4 __attribute__((const, overloadable)) fnc(float4 v1, int4 v2);
+
+#define FN_FUNC_FN_I(fnc) \
+_RS_RUNTIME float2 __attribute__((const, overloadable)) fnc(float2 v1, int v2); \
+_RS_RUNTIME float3 __attribute__((const, overloadable)) fnc(float3 v1, int v2); \
+_RS_RUNTIME float4 __attribute__((const, overloadable)) fnc(float4 v1, int v2);
+
+#define FN_FUNC_FN_PFN(fnc) \
+_RS_RUNTIME float2 __attribute__((pure, overloadable)) \
+ fnc(float2 v1, float2 *v2); \
+_RS_RUNTIME float3 __attribute__((pure, overloadable)) \
+ fnc(float3 v1, float3 *v2); \
+_RS_RUNTIME float4 __attribute__((pure, overloadable)) \
+ fnc(float4 v1, float4 *v2);
+
+#define FN_FUNC_FN_PIN(fnc) \
+_RS_RUNTIME float2 __attribute__((pure, overloadable)) fnc(float2 v1, int2 *v2); \
+_RS_RUNTIME float3 __attribute__((pure, overloadable)) fnc(float3 v1, int3 *v2); \
+_RS_RUNTIME float4 __attribute__((pure, overloadable)) fnc(float4 v1, int4 *v2);
+
+#define FN_FUNC_FN_FN_FN(fnc) \
+_RS_RUNTIME float2 __attribute__((const, overloadable)) \
+ fnc(float2 v1, float2 v2, float2 v3); \
+_RS_RUNTIME float3 __attribute__((const, overloadable)) \
+ fnc(float3 v1, float3 v2, float3 v3); \
+_RS_RUNTIME float4 __attribute__((const, overloadable)) \
+ fnc(float4 v1, float4 v2, float4 v3);
+
+#define FN_FUNC_FN_FN_F(fnc) \
+_RS_RUNTIME float2 __attribute__((const, overloadable)) \
+ fnc(float2 v1, float2 v2, float v3); \
+_RS_RUNTIME float3 __attribute__((const, overloadable)) \
+ fnc(float3 v1, float3 v2, float v3); \
+_RS_RUNTIME float4 __attribute__((const, overloadable)) \
+ fnc(float4 v1, float4 v2, float v3);
+
+#define FN_FUNC_FN_F_F(fnc) \
+_RS_RUNTIME float2 __attribute__((const, overloadable)) \
+ fnc(float2 v1, float v2, float v3); \
+_RS_RUNTIME float3 __attribute__((const, overloadable)) \
+ fnc(float3 v1, float v2, float v3); \
+_RS_RUNTIME float4 __attribute__((const, overloadable)) \
+ fnc(float4 v1, float v2, float v3);
+
+#define FN_FUNC_FN_FN_PIN(fnc) \
+_RS_RUNTIME float2 __attribute__((pure, overloadable)) \
+ fnc(float2 v1, float2 v2, int2 *v3); \
+_RS_RUNTIME float3 __attribute__((pure, overloadable)) \
+ fnc(float3 v1, float3 v2, int3 *v3); \
+_RS_RUNTIME float4 __attribute__((pure, overloadable)) \
+ fnc(float4 v1, float4 v2, int4 *v3);
+
+#endif // DOXYGEN
+
+
+/**
+ * Return the inverse cosine.
+ *
+ * Supports float, float2, float3, float4
+ */
+extern float __attribute__((const, overloadable)) acos(float);
+FN_FUNC_FN(acos)
+
+/**
+ * Return the inverse hyperbolic cosine.
+ *
+ * Supports float, float2, float3, float4
+ */
+extern float __attribute__((const, overloadable)) acosh(float);
+FN_FUNC_FN(acosh)
+
+/**
+ * Return the inverse cosine divided by PI.
+ *
+ * Supports float, float2, float3, float4
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) acospi(float v);
+FN_FUNC_FN(acospi)
+
+/**
+ * Return the inverse sine.
+ *
+ * Supports float, float2, float3, float4
+ */
+extern float __attribute__((const, overloadable)) asin(float);
+FN_FUNC_FN(asin)
+
+/**
+ * Return the inverse hyperbolic sine.
+ *
+ * Supports float, float2, float3, float4
+ */
+extern float __attribute__((const, overloadable)) asinh(float);
+FN_FUNC_FN(asinh)
+
+
+/**
+ * Return the inverse sine divided by PI.
+ *
+ * Supports float, float2, float3, float4
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) asinpi(float v);
+FN_FUNC_FN(asinpi)
+
+/**
+ * Return the inverse tangent.
+ *
+ * Supports float, float2, float3, float4
+ */
+extern float __attribute__((const, overloadable)) atan(float);
+FN_FUNC_FN(atan)
+
+/**
+ * Return the inverse tangent of y / x.
+ *
+ * Supports float, float2, float3, float4. Both arguments must be of the same
+ * type.
+ *
+ * @param y
+ * @param x
+ */
+extern float __attribute__((const, overloadable)) atan2(float y, float x);
+FN_FUNC_FN_FN(atan2)
+
+/**
+ * Return the inverse hyperbolic tangent.
+ *
+ * Supports float, float2, float3, float4
+ */
+extern float __attribute__((const, overloadable)) atanh(float);
+FN_FUNC_FN(atanh)
+
+/**
+ * Return the inverse tangent divided by PI.
+ *
+ * Supports float, float2, float3, float4
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) atanpi(float v);
+FN_FUNC_FN(atanpi)
+
+/**
+ * Return the inverse tangent of y / x, divided by PI.
+ *
+ * Supports float, float2, float3, float4. Both arguments must be of the same
+ * type.
+ *
+ * @param y
+ * @param x
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) atan2pi(float y, float x);
+FN_FUNC_FN_FN(atan2pi)
+
+
+/**
+ * Return the cube root.
+ *
+ * Supports float, float2, float3, float4.
+ */
+extern float __attribute__((const, overloadable)) cbrt(float);
+FN_FUNC_FN(cbrt)
+
+/**
+ * Return the smallest integer not less than a value.
+ *
+ * Supports float, float2, float3, float4.
+ */
+extern float __attribute__((const, overloadable)) ceil(float);
+FN_FUNC_FN(ceil)
+
+/**
+ * Copy the sign bit from y to x.
+ *
+ * Supports float, float2, float3, float4. Both arguments must be of the same
+ * type.
+ *
+ * @param x
+ * @param y
+ */
+extern float __attribute__((const, overloadable)) copysign(float x, float y);
+FN_FUNC_FN_FN(copysign)
+
+/**
+ * Return the cosine.
+ *
+ * Supports float, float2, float3, float4.
+ */
+extern float __attribute__((const, overloadable)) cos(float);
+FN_FUNC_FN(cos)
+
+/**
+ * Return the hypebolic cosine.
+ *
+ * Supports float, float2, float3, float4.
+ */
+extern float __attribute__((const, overloadable)) cosh(float);
+FN_FUNC_FN(cosh)
+
+/**
+ * Return the cosine of the value * PI.
+ *
+ * Supports float, float2, float3, float4.
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) cospi(float v);
+FN_FUNC_FN(cospi)
+
+/**
+ * Return the complementary error function.
+ *
+ * Supports float, float2, float3, float4.
+ */
+extern float __attribute__((const, overloadable)) erfc(float);
+FN_FUNC_FN(erfc)
+
+/**
+ * Return the error function.
+ *
+ * Supports float, float2, float3, float4.
+ */
+extern float __attribute__((const, overloadable)) erf(float);
+FN_FUNC_FN(erf)
+
+/**
+ * Return e ^ value.
+ *
+ * Supports float, float2, float3, float4.
+ */
+extern float __attribute__((const, overloadable)) exp(float);
+FN_FUNC_FN(exp)
+
+/**
+ * Return 2 ^ value.
+ *
+ * Supports float, float2, float3, float4.
+ */
+extern float __attribute__((const, overloadable)) exp2(float);
+FN_FUNC_FN(exp2)
+
+/**
+ * Return x ^ y.
+ *
+ * Supports float, float2, float3, float4. Both arguments must be of the same
+ * type.
+ */
+extern float __attribute__((const, overloadable)) pow(float x, float y);
+FN_FUNC_FN_FN(pow)
+
+/**
+ * Return 10 ^ value.
+ *
+ * Supports float, float2, float3, float4.
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) exp10(float v);
+FN_FUNC_FN(exp10)
+
+/**
+ * Return (e ^ value) - 1.
+ *
+ * Supports float, float2, float3, float4.
+ */
+extern float __attribute__((const, overloadable)) expm1(float);
+FN_FUNC_FN(expm1)
+
+/**
+ * Return the absolute value of a value.
+ *
+ * Supports float, float2, float3, float4.
+ */
+extern float __attribute__((const, overloadable)) fabs(float);
+FN_FUNC_FN(fabs)
+
+/**
+ * Return the positive difference between two values.
+ *
+ * Supports float, float2, float3, float4. Both arguments must be of the same
+ * type.
+ */
+extern float __attribute__((const, overloadable)) fdim(float, float);
+FN_FUNC_FN_FN(fdim)
+
+/**
+ * Return the smallest integer not greater than a value.
+ *
+ * Supports float, float2, float3, float4.
+ */
+extern float __attribute__((const, overloadable)) floor(float);
+FN_FUNC_FN(floor)
+
+/**
+ * Return a*b + c.
+ *
+ * Supports float, float2, float3, float4.
+ */
+extern float __attribute__((const, overloadable)) fma(float a, float b, float c);
+FN_FUNC_FN_FN_FN(fma)
+
+/**
+ * Return (x < y ? y : x)
+ *
+ * Supports float, float2, float3, float4.
+ * @param x: may be float, float2, float3, float4
+ * @param y: may be float or vector. If vector must match type of x.
+ */
+extern float __attribute__((const, overloadable)) fmax(float x, float y);
+FN_FUNC_FN_FN(fmax);
+FN_FUNC_FN_F(fmax);
+
+/**
+ * Return (x > y ? y : x)
+ *
+ * @param x: may be float, float2, float3, float4
+ * @param y: may be float or vector. If vector must match type of x.
+ */
+extern float __attribute__((const, overloadable)) fmin(float x, float y);
+FN_FUNC_FN_FN(fmin);
+FN_FUNC_FN_F(fmin);
+
+/**
+ * Return the remainder from x / y
+ *
+ * Supports float, float2, float3, float4.
+ */
+extern float __attribute__((const, overloadable)) fmod(float x, float y);
+FN_FUNC_FN_FN(fmod)
+
+/**
+ * Return fractional part of v
+ *
+ * @param iptr iptr[0] will be set to the floor of the input value.
+ * Supports float, float2, float3, float4.
+ */
+_RS_RUNTIME float __attribute__((pure, overloadable)) fract(float v, float *iptr);
+FN_FUNC_FN_PFN(fract)
+
+/**
+ * Return fractional part of v
+ *
+ * Supports float, float2, float3, float4.
+ */
+static inline float __attribute__((const, overloadable)) fract(float v) {
+ float unused;
+ return fract(v, &unused);
+}
+
+static inline float2 __attribute__((const, overloadable)) fract(float2 v) {
+ float2 unused;
+ return fract(v, &unused);
+}
+
+static inline float3 __attribute__((const, overloadable)) fract(float3 v) {
+ float3 unused;
+ return fract(v, &unused);
+}
+
+static inline float4 __attribute__((const, overloadable)) fract(float4 v) {
+ float4 unused;
+ return fract(v, &unused);
+}
+
+/**
+ * Return the mantissa and place the exponent into iptr[0]
+ *
+ * @param v Supports float, float2, float3, float4.
+ * @param iptr Must have the same vector size as v.
+ */
+extern float __attribute__((pure, overloadable)) frexp(float v, int *iptr);
+FN_FUNC_FN_PIN(frexp)
+
+/**
+ * Return sqrt(x*x + y*y)
+ *
+ * Supports float, float2, float3, float4.
+ */
+extern float __attribute__((const, overloadable)) hypot(float x, float y);
+FN_FUNC_FN_FN(hypot)
+
+/**
+ * Return the integer exponent of a value
+ *
+ * Supports 1,2,3,4 components
+ */
+extern int __attribute__((const, overloadable)) ilogb(float);
+IN_FUNC_FN(ilogb)
+
+/**
+ * Return (x * 2^y)
+ *
+ * @param x Supports 1,2,3,4 components
+ * @param y Supports single component or matching vector.
+ */
+extern float __attribute__((const, overloadable)) ldexp(float x, int y);
+FN_FUNC_FN_IN(ldexp)
+FN_FUNC_FN_I(ldexp)
+
+/**
+ * Return the log gamma
+ *
+ * Supports 1,2,3,4 components
+ */
+extern float __attribute__((const, overloadable)) lgamma(float);
+FN_FUNC_FN(lgamma)
+
+/**
+ * Return the log gamma and sign
+ *
+ * @param x Supports 1,2,3,4 components
+ * @param y Supports matching vector.
+ */
+extern float __attribute__((pure, overloadable)) lgamma(float x, int* y);
+FN_FUNC_FN_PIN(lgamma)
+
+/**
+ * Return the natural logarithm
+ *
+ * Supports 1,2,3,4 components
+ */
+extern float __attribute__((const, overloadable)) log(float);
+FN_FUNC_FN(log)
+
+/**
+ * Return the base 10 logarithm
+ *
+ * Supports 1,2,3,4 components
+ */
+extern float __attribute__((const, overloadable)) log10(float);
+FN_FUNC_FN(log10)
+
+/**
+ * Return the base 2 logarithm
+ *
+ * Supports 1,2,3,4 components
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) log2(float v);
+FN_FUNC_FN(log2)
+
+/**
+ * Return the natural logarithm of (v + 1.0f)
+ *
+ * Supports 1,2,3,4 components
+ */
+extern float __attribute__((const, overloadable)) log1p(float v);
+FN_FUNC_FN(log1p)
+
+/**
+ * Compute the exponent of the value.
+ *
+ * Supports 1,2,3,4 components
+ */
+extern float __attribute__((const, overloadable)) logb(float);
+FN_FUNC_FN(logb)
+
+/**
+ * Compute (a * b) + c
+ *
+ * Supports 1,2,3,4 components
+ */
+extern float __attribute__((const, overloadable)) mad(float a, float b, float c);
+FN_FUNC_FN_FN_FN(mad)
+
+/**
+ * Return the integral and fractional components of a number.
+ * Supports 1,2,3,4 components
+ *
+ * @param x Source value
+ * @param iret iret[0] will be set to the integral portion of the number.
+ * @return The floating point portion of the value.
+ */
+extern float __attribute__((pure, overloadable)) modf(float x, float *iret);
+FN_FUNC_FN_PFN(modf);
+
+extern float __attribute__((const, overloadable)) nan(uint);
+
+/**
+ * Return the next floating point number from x towards y.
+ *
+ * Supports 1,2,3,4 components
+ */
+extern float __attribute__((const, overloadable)) nextafter(float x, float y);
+FN_FUNC_FN_FN(nextafter)
+
+/**
+ * Return (v ^ p).
+ *
+ * Supports 1,2,3,4 components
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) pown(float v, int p);
+FN_FUNC_FN_IN(pown)
+
+/**
+ * Return (v ^ p).
+ * @param v must be greater than 0.
+ *
+ * Supports 1,2,3,4 components
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) powr(float v, float p);
+FN_FUNC_FN_FN(powr)
+
+/**
+ * Return round x/y to the nearest integer then compute the remander.
+ *
+ * Supports 1,2,3,4 components
+ */
+extern float __attribute__((const, overloadable)) remainder(float x, float y);
+FN_FUNC_FN_FN(remainder)
+
+// document once we know the precision of bionic
+extern float __attribute__((pure, overloadable)) remquo(float, float, int *);
+FN_FUNC_FN_FN_PIN(remquo)
+
+/**
+ * Round to the nearest integral value.
+ *
+ * Supports 1,2,3,4 components
+ */
+extern float __attribute__((const, overloadable)) rint(float);
+FN_FUNC_FN(rint)
+
+/**
+ * Compute the Nth root of a value.
+ *
+ * Supports 1,2,3,4 components
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) rootn(float v, int n);
+FN_FUNC_FN_IN(rootn)
+
+/**
+ * Round to the nearest integral value. Half values are rounded away from zero.
+ *
+ * Supports 1,2,3,4 components
+ */
+extern float __attribute__((const, overloadable)) round(float);
+FN_FUNC_FN(round)
+
+/**
+ * Return the square root of a value.
+ *
+ * Supports 1,2,3,4 components
+ */
+extern float __attribute__((const, overloadable)) sqrt(float);
+FN_FUNC_FN(sqrt)
+
+/**
+ * Return (1 / sqrt(value)).
+ *
+ * Supports 1,2,3,4 components
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) rsqrt(float v);
+FN_FUNC_FN(rsqrt)
+
+/**
+ * Return the sine of a value specified in radians.
+ *
+ * @param v The incoming value in radians
+ * Supports 1,2,3,4 components
+ */
+extern float __attribute__((const, overloadable)) sin(float v);
+FN_FUNC_FN(sin)
+
+/**
+ * Return the sine and cosine of a value.
+ *
+ * @return sine
+ * @param v The incoming value in radians
+ * @param *cosptr cosptr[0] will be set to the cosine value.
+ *
+ * Supports 1,2,3,4 components
+ */
+_RS_RUNTIME float __attribute__((pure, overloadable)) sincos(float v, float *cosptr);
+FN_FUNC_FN_PFN(sincos);
+
+/**
+ * Return the hyperbolic sine of a value specified in radians.
+ *
+ * Supports 1,2,3,4 components
+ */
+extern float __attribute__((const, overloadable)) sinh(float);
+FN_FUNC_FN(sinh)
+
+/**
+ * Return the sin(v * PI).
+ *
+ * Supports 1,2,3,4 components
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) sinpi(float v);
+FN_FUNC_FN(sinpi)
+
+/**
+ * Return the tangent of a value.
+ *
+ * Supports 1,2,3,4 components
+ * @param v The incoming value in radians
+ */
+extern float __attribute__((const, overloadable)) tan(float v);
+FN_FUNC_FN(tan)
+
+/**
+ * Return the hyperbolic tangent of a value.
+ *
+ * Supports 1,2,3,4 components
+ * @param v The incoming value in radians
+ */
+extern float __attribute__((const, overloadable)) tanh(float);
+FN_FUNC_FN(tanh)
+
+/**
+ * Return tan(v * PI)
+ *
+ * Supports 1,2,3,4 components
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) tanpi(float v);
+FN_FUNC_FN(tanpi)
+
+/**
+ * Compute the gamma function of a value.
+ *
+ * Supports 1,2,3,4 components
+ */
+extern float __attribute__((const, overloadable)) tgamma(float);
+FN_FUNC_FN(tgamma)
+
+/**
+ * Round to integral using truncation.
+ *
+ * Supports 1,2,3,4 components
+ */
+extern float __attribute__((const, overloadable)) trunc(float);
+FN_FUNC_FN(trunc)
+
+#ifdef DOXYGEN
+
+#define XN_FUNC_YN(typeout, fnc, typein) \
+extern typeout __attribute__((overloadable)) fnc(typein v);
+
+#define XN_FUNC_XN_XN_BODY(type, fnc, body) \
+_RS_RUNTIME type __attribute__((overloadable)) \
+ fnc(type v1, type v2);
+
+#else
+
+#define XN_FUNC_YN(typeout, fnc, typein) \
+extern typeout __attribute__((const, overloadable)) fnc(typein v); \
+_RS_RUNTIME typeout##2 __attribute__((const, overloadable)) fnc(typein##2 v); \
+_RS_RUNTIME typeout##3 __attribute__((const, overloadable)) fnc(typein##3 v); \
+_RS_RUNTIME typeout##4 __attribute__((const, overloadable)) fnc(typein##4 v);
+
+#define XN_FUNC_XN_XN_BODY(type, fnc, body) \
+_RS_RUNTIME type __attribute__((const, overloadable)) \
+ fnc(type v1, type v2); \
+_RS_RUNTIME type##2 __attribute__((const, overloadable)) \
+ fnc(type##2 v1, type##2 v2); \
+_RS_RUNTIME type##3 __attribute__((const, overloadable)) \
+ fnc(type##3 v1, type##3 v2); \
+_RS_RUNTIME type##4 __attribute__((const, overloadable)) \
+ fnc(type##4 v1, type##4 v2);
+
+#endif // DOXYGEN
+
+#define UIN_FUNC_IN(fnc) \
+XN_FUNC_YN(uchar, fnc, char) \
+XN_FUNC_YN(ushort, fnc, short) \
+XN_FUNC_YN(uint, fnc, int)
+
+#define IN_FUNC_IN(fnc) \
+XN_FUNC_YN(uchar, fnc, uchar) \
+XN_FUNC_YN(char, fnc, char) \
+XN_FUNC_YN(ushort, fnc, ushort) \
+XN_FUNC_YN(short, fnc, short) \
+XN_FUNC_YN(uint, fnc, uint) \
+XN_FUNC_YN(int, fnc, int)
+
+#define IN_FUNC_IN_IN_BODY(fnc, body) \
+XN_FUNC_XN_XN_BODY(uchar, fnc, body) \
+XN_FUNC_XN_XN_BODY(char, fnc, body) \
+XN_FUNC_XN_XN_BODY(ushort, fnc, body) \
+XN_FUNC_XN_XN_BODY(short, fnc, body) \
+XN_FUNC_XN_XN_BODY(uint, fnc, body) \
+XN_FUNC_XN_XN_BODY(int, fnc, body) \
+XN_FUNC_XN_XN_BODY(float, fnc, body)
+
+/**
+ * \fn uchar abs(char)
+ * Return the absolute value of a value.
+ *
+ * Supports 1,2,3,4 components of char, short, int.
+ */
+UIN_FUNC_IN(abs)
+
+/**
+ * Return the number of leading 0-bits in a value.
+ *
+ * Supports 1,2,3,4 components of uchar, char, ushort, short, uint, int.
+ */
+IN_FUNC_IN(clz)
+
+/**
+ * Return the minimum of two values.
+ *
+ * Supports 1,2,3,4 components of uchar, char, ushort, short, uint, int, float.
+ */
+IN_FUNC_IN_IN_BODY(min, (v1 < v2 ? v1 : v2))
+FN_FUNC_FN_F(min)
+
+/**
+ * Return the maximum of two values.
+ *
+ * Supports 1,2,3,4 components of uchar, char, ushort, short, uint, int, float.
+ */
+IN_FUNC_IN_IN_BODY(max, (v1 > v2 ? v1 : v2))
+FN_FUNC_FN_F(max)
+
+/**
+ * Clamp a value to a specified high and low bound.
+ *
+ * @param amount value to be clamped. Supports 1,2,3,4 components
+ * @param low Lower bound, must be scalar or matching vector.
+ * @param high High bound, must match type of low
+ */
+
+#if !defined(RS_VERSION) || (RS_VERSION < 19)
+_RS_RUNTIME float __attribute__((const, overloadable)) clamp(float amount, float low, float high);
+FN_FUNC_FN_FN_FN(clamp)
+FN_FUNC_FN_F_F(clamp)
+#else
+#define _CLAMP(T) \
+extern T __attribute__((overloadable)) clamp(T amount, T low, T high); \
+extern T##2 __attribute__((overloadable)) clamp(T##2 amount, T##2 low, T##2 high); \
+extern T##3 __attribute__((overloadable)) clamp(T##3 amount, T##3 low, T##3 high); \
+extern T##4 __attribute__((overloadable)) clamp(T##4 amount, T##4 low, T##4 high); \
+extern T##2 __attribute__((overloadable)) clamp(T##2 amount, T low, T high); \
+extern T##3 __attribute__((overloadable)) clamp(T##3 amount, T low, T high); \
+extern T##4 __attribute__((overloadable)) clamp(T##4 amount, T low, T high)
+
+_CLAMP(float);
+_CLAMP(double);
+_CLAMP(char);
+_CLAMP(uchar);
+_CLAMP(short);
+_CLAMP(ushort);
+_CLAMP(int);
+_CLAMP(uint);
+_CLAMP(long);
+_CLAMP(ulong);
+
+#undef _CLAMP
+#endif
+
+/**
+ * Convert from radians to degrees.
+ *
+ * Supports 1,2,3,4 components
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) degrees(float radians);
+FN_FUNC_FN(degrees)
+
+/**
+ * return start + ((stop - start) * amount);
+ *
+ * Supports 1,2,3,4 components
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) mix(float start, float stop, float amount);
+FN_FUNC_FN_FN_FN(mix)
+FN_FUNC_FN_FN_F(mix)
+
+/**
+ * Convert from degrees to radians.
+ *
+ * Supports 1,2,3,4 components
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) radians(float degrees);
+FN_FUNC_FN(radians)
+
+/**
+ * if (v < edge)
+ * return 0.f;
+ * else
+ * return 1.f;
+ *
+ * Supports 1,2,3,4 components
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) step(float edge, float v);
+FN_FUNC_FN_FN(step)
+FN_FUNC_FN_F(step)
+
+// not implemented
+extern float __attribute__((const, overloadable)) smoothstep(float, float, float);
+extern float2 __attribute__((const, overloadable)) smoothstep(float2, float2, float2);
+extern float3 __attribute__((const, overloadable)) smoothstep(float3, float3, float3);
+extern float4 __attribute__((const, overloadable)) smoothstep(float4, float4, float4);
+extern float2 __attribute__((const, overloadable)) smoothstep(float, float, float2);
+extern float3 __attribute__((const, overloadable)) smoothstep(float, float, float3);
+extern float4 __attribute__((const, overloadable)) smoothstep(float, float, float4);
+
+/**
+ * Return the sign of a value.
+ *
+ * if (v < 0) return -1.f;
+ * else if (v > 0) return 1.f;
+ * else return 0.f;
+ *
+ * Supports 1,2,3,4 components
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) sign(float v);
+FN_FUNC_FN(sign)
+
+/**
+ * Compute the cross product of two vectors.
+ *
+ * Supports 3,4 components
+ */
+_RS_RUNTIME float3 __attribute__((const, overloadable)) cross(float3 lhs, float3 rhs);
+_RS_RUNTIME float4 __attribute__((const, overloadable)) cross(float4 lhs, float4 rhs);
+
+/**
+ * Compute the dot product of two vectors.
+ *
+ * Supports 1,2,3,4 components
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) dot(float lhs, float rhs);
+F_FUNC_FN_FN(dot)
+
+/**
+ * Compute the length of a vector.
+ *
+ * Supports 1,2,3,4 components
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) length(float v);
+F_FUNC_FN(length)
+
+/**
+ * Compute the distance between two points.
+ *
+ * Supports 1,2,3,4 components
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) distance(float lhs, float rhs);
+F_FUNC_FN_FN(distance)
+
+/**
+ * Normalize a vector.
+ *
+ * Supports 1,2,3,4 components
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) normalize(float v);
+FN_FUNC_FN(normalize)
+
+
+// New approx API functions
+#if (defined(RS_VERSION) && (RS_VERSION >= 17))
+
+/**
+ * Return the approximate reciprocal of a value.
+ *
+ * Supports 1,2,3,4 components
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) half_recip(float);
+FN_FUNC_FN(half_recip)
+
+/**
+ * Return the approximate square root of a value.
+ *
+ * Supports 1,2,3,4 components
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) half_sqrt(float);
+FN_FUNC_FN(half_sqrt)
+
+/**
+ * Return the approximate value of (1 / sqrt(value)).
+ *
+ * Supports 1,2,3,4 components
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) half_rsqrt(float v);
+FN_FUNC_FN(half_rsqrt)
+
+/**
+ * Compute the approximate length of a vector.
+ *
+ * Supports 1,2,3,4 components
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) fast_length(float v);
+F_FUNC_FN(fast_length)
+
+/**
+ * Compute the approximate distance between two points.
+ *
+ * Supports 1,2,3,4 components
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) fast_distance(float lhs, float rhs);
+F_FUNC_FN_FN(fast_distance)
+
+/**
+ * Approximately normalize a vector.
+ *
+ * Supports 1,2,3,4 components
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) fast_normalize(float v);
+F_FUNC_FN(fast_normalize)
+
+#endif // (defined(RS_VERSION) && (RS_VERSION >= 17))
+
+
+
+#if (defined(RS_VERSION) && (RS_VERSION >= 18))
+// Fast native math functions.
+
+
+/**
+ * Fast approximate exp2
+ * valid for inputs -125.f to 125.f
+ * Max 8192 ulps of error
+ *
+ * Supports 1,2,3,4 components
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) native_exp2(float v);
+FN_FUNC_FN(native_exp2)
+
+/**
+ * Fast approximate exp
+ * valid for inputs -86.f to 86.f
+ * Max 8192 ulps of error
+ *
+ * Supports 1,2,3,4 components
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) native_exp(float v);
+FN_FUNC_FN(native_exp)
+
+/**
+ * Fast approximate exp10
+ * valid for inputs -37.f to 37.f
+ * Max 8192 ulps of error
+ *
+ * Supports 1,2,3,4 components
+ */
+_RS_RUNTIME float __attribute__((const, overloadable)) native_exp10(float v);
+FN_FUNC_FN(native_exp10)
+
+
+_RS_RUNTIME float __attribute__((const, overloadable)) native_log2(float v);
+FN_FUNC_FN(native_log2)
+
+_RS_RUNTIME float __attribute__((const, overloadable)) native_log(float v);
+FN_FUNC_FN(native_log)
+
+_RS_RUNTIME float __attribute__((const, overloadable)) native_log10(float v);
+FN_FUNC_FN(native_log10)
+
+
+_RS_RUNTIME float __attribute__((const, overloadable)) native_powr(float v, float y);
+FN_FUNC_FN_FN(native_powr)
+
+
+#endif // (defined(RS_VERSION) && (RS_VERSION >= 18))
+
+
+#undef CVT_FUNC
+#undef CVT_FUNC_2
+#undef FN_FUNC_FN
+#undef F_FUNC_FN
+#undef IN_FUNC_FN
+#undef FN_FUNC_FN_FN
+#undef F_FUNC_FN_FN
+#undef FN_FUNC_FN_F
+#undef FN_FUNC_FN_IN
+#undef FN_FUNC_FN_I
+#undef FN_FUNC_FN_PFN
+#undef FN_FUNC_FN_PIN
+#undef FN_FUNC_FN_FN_FN
+#undef FN_FUNC_FN_FN_F
+#undef FN_FUNC_FN_F_F
+#undef FN_FUNC_FN_FN_PIN
+#undef XN_FUNC_YN
+#undef UIN_FUNC_IN
+#undef IN_FUNC_IN
+#undef XN_FUNC_XN_XN_BODY
+#undef IN_FUNC_IN_IN_BODY
+
+#endif
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_core.rsh b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_core.rsh
new file mode 100644
index 0000000..9caf355
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_core.rsh
@@ -0,0 +1,189 @@
+/*
+ * Copyright (C) 2011-2012 The Android Open Source Project
+ *
+ * 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.
+ */
+
+ /*! \mainpage notitle
+ *
+ * RenderScript is a high-performance runtime that provides
+ * compute operations at the native level. RenderScript code is compiled on devices
+ * at runtime to allow platform-independence as well.
+ * This reference documentation describes the RenderScript runtime APIs, which you
+ * can utilize to write RenderScript code in C99. The RenderScript compute header
+ * files are automatically included for you.
+ *
+ * To use RenderScript, you need to utilize the RenderScript runtime APIs documented here
+ * as well as the Android framework APIs for RenderScript.
+ * For documentation on the Android framework APIs, see the <a target="_parent" href=
+ * "http://developer.android.com/reference/android/renderscript/package-summary.html">
+ * android.renderscript</a> package reference.
+ * For more information on how to develop with RenderScript and how the runtime and
+ * Android framework APIs interact, see the <a target="_parent" href=
+ * "http://developer.android.com/guide/topics/renderscript/index.html">RenderScript
+ * developer guide</a> and the <a target="_parent" href=
+ * "http://developer.android.com/resources/samples/RenderScript/index.html">
+ * RenderScript samples</a>.
+ */
+
+/** @file rs_core.rsh
+ * \brief todo-jsams
+ *
+ * todo-jsams
+ *
+ */
+
+#ifndef __RS_CORE_RSH__
+#define __RS_CORE_RSH__
+
+#define _RS_RUNTIME extern
+
+#include "rs_types.rsh"
+#include "rs_allocation.rsh"
+#include "rs_atomic.rsh"
+#include "rs_cl.rsh"
+#include "rs_debug.rsh"
+#include "rs_element.rsh"
+#include "rs_math.rsh"
+#include "rs_matrix.rsh"
+#include "rs_object.rsh"
+#include "rs_quaternion.rsh"
+#include "rs_sampler.rsh"
+#include "rs_time.rsh"
+
+/**
+ * Send a message back to the client. Will not block and returns true
+ * if the message was sendable and false if the fifo was full.
+ * A message ID is required. Data payload is optional.
+ */
+extern bool __attribute__((overloadable))
+ rsSendToClient(int cmdID);
+/**
+ * \overload
+ */
+extern bool __attribute__((overloadable))
+ rsSendToClient(int cmdID, const void *data, uint len);
+/**
+ * Send a message back to the client, blocking until the message is queued.
+ * A message ID is required. Data payload is optional.
+ */
+extern void __attribute__((overloadable))
+ rsSendToClientBlocking(int cmdID);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsSendToClientBlocking(int cmdID, const void *data, uint len);
+
+
+/**
+ * Launch order hint for rsForEach calls. This provides a hint to the system to
+ * determine in which order the root function of the target is called with each
+ * cell of the allocation.
+ *
+ * This is a hint and implementations may not obey the order.
+ */
+enum rs_for_each_strategy {
+ RS_FOR_EACH_STRATEGY_SERIAL = 0,
+ RS_FOR_EACH_STRATEGY_DONT_CARE = 1,
+ RS_FOR_EACH_STRATEGY_DST_LINEAR = 2,
+ RS_FOR_EACH_STRATEGY_TILE_SMALL= 3,
+ RS_FOR_EACH_STRATEGY_TILE_MEDIUM = 4,
+ RS_FOR_EACH_STRATEGY_TILE_LARGE = 5
+};
+
+
+/**
+ * Structure to provide extra information to a rsForEach call. Primarly used to
+ * restrict the call to a subset of cells in the allocation.
+ */
+typedef struct rs_script_call {
+ enum rs_for_each_strategy strategy;
+ uint32_t xStart;
+ uint32_t xEnd;
+ uint32_t yStart;
+ uint32_t yEnd;
+ uint32_t zStart;
+ uint32_t zEnd;
+ uint32_t arrayStart;
+ uint32_t arrayEnd;
+} rs_script_call_t;
+
+/**
+ * Make a script to script call to launch work. One of the input or output is
+ * required to be a valid object. The input and output must be of the same
+ * dimensions.
+ * API 10-13
+ *
+ * @param script The target script to call
+ * @param input The allocation to source data from
+ * @param output the allocation to write date into
+ * @param usrData The user definied params to pass to the root script. May be
+ * NULL.
+ * @param sc Extra control infomation used to select a sub-region of the
+ * allocation to be processed or suggest a walking strategy. May be
+ * NULL.
+ *
+ * */
+#if !defined(RS_VERSION) || (RS_VERSION < 14)
+extern void __attribute__((overloadable))
+ rsForEach(rs_script script, rs_allocation input,
+ rs_allocation output, const void * usrData,
+ const rs_script_call_t *sc);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsForEach(rs_script script, rs_allocation input,
+ rs_allocation output, const void * usrData);
+#else
+
+/**
+ * Make a script to script call to launch work. One of the input or output is
+ * required to be a valid object. The input and output must be of the same
+ * dimensions.
+ * API 14+
+ *
+ * @param script The target script to call
+ * @param input The allocation to source data from
+ * @param output the allocation to write date into
+ * @param usrData The user definied params to pass to the root script. May be
+ * NULL.
+ * @param usrDataLen The size of the userData structure. This will be used to
+ * perform a shallow copy of the data if necessary.
+ * @param sc Extra control infomation used to select a sub-region of the
+ * allocation to be processed or suggest a walking strategy. May be
+ * NULL.
+ *
+ */
+extern void __attribute__((overloadable))
+ rsForEach(rs_script script, rs_allocation input, rs_allocation output,
+ const void * usrData, size_t usrDataLen, const rs_script_call_t *);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsForEach(rs_script script, rs_allocation input, rs_allocation output,
+ const void * usrData, size_t usrDataLen);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsForEach(rs_script script, rs_allocation input, rs_allocation output);
+#endif
+
+
+
+#undef _RS_RUNTIME
+
+#endif
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_debug.rsh b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_debug.rsh
new file mode 100644
index 0000000..7a13c9d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_debug.rsh
@@ -0,0 +1,267 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * 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.
+ */
+
+/** @file rs_debug.rsh
+ * \brief Utility debugging routines
+ *
+ * Routines intended to be used during application developement. These should
+ * not be used in shipping applications. All print a string and value pair to
+ * the standard log.
+ *
+ */
+
+#ifndef __RS_DEBUG_RSH__
+#define __RS_DEBUG_RSH__
+
+
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, float);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, float, float);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, float, float, float);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, float, float, float, float);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, float2);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, float3);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, float4);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, double);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, const rs_matrix4x4 *);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, const rs_matrix3x3 *);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, const rs_matrix2x2 *);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, int);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, uint);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, long);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, unsigned long);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, long long);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, unsigned long long);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, const void *);
+
+#if (defined(RS_VERSION) && (RS_VERSION >= 17))
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, char);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, char2);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, char3);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, char4);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, unsigned char);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, uchar2);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, uchar3);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, uchar4);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, short);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, short2);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, short3);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, short4);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, unsigned short);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, ushort2);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, ushort3);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, ushort4);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, int2);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, int3);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, int4);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, uint2);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, uint3);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, uint4);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, long2);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, long3);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, long4);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, ulong2);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, ulong3);
+/**
+ * Debug function. Prints a string and value to the log.
+ */
+extern void __attribute__((overloadable))
+ rsDebug(const char *, ulong4);
+#endif // (defined(RS_VERSION) && (RS_VERSION >= 17))
+
+#define RS_DEBUG(a) rsDebug(#a, a)
+#define RS_DEBUG_MARKER rsDebug(__FILE__, __LINE__)
+
+#endif
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_element.rsh b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_element.rsh
new file mode 100644
index 0000000..0230f10
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_element.rsh
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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.
+ */
+
+/** @file rs_element.rsh
+ * \brief Element routines
+ *
+ *
+ */
+
+#ifndef __RS_ELEMENT_RSH__
+#define __RS_ELEMENT_RSH__
+
+// New API's
+#if (defined(RS_VERSION) && (RS_VERSION >= 16))
+
+/**
+ * Elements could be simple, such as an int or a float, or a
+ * structure with multiple sub elements, such as a collection of
+ * floats, float2, float4. This function returns zero for simple
+ * elements or the number of sub-elements otherwise.
+ *
+ * @param e element to get data from
+ * @return number of sub-elements in this element
+ */
+extern uint32_t __attribute__((overloadable))
+ rsElementGetSubElementCount(rs_element e);
+
+/**
+ * For complex elements, this function will return the
+ * sub-element at index
+ *
+ * @param e element to get data from
+ * @param index index of the sub-element to return
+ * @return sub-element in this element at given index
+ */
+extern rs_element __attribute__((overloadable))
+ rsElementGetSubElement(rs_element, uint32_t index);
+
+/**
+ * For complex elements, this function will return the length of
+ * sub-element name at index
+ *
+ * @param e element to get data from
+ * @param index index of the sub-element to return
+ * @return length of the sub-element name including the null
+ * terminator (size of buffer needed to write the name)
+ */
+extern uint32_t __attribute__((overloadable))
+ rsElementGetSubElementNameLength(rs_element e, uint32_t index);
+
+/**
+ * For complex elements, this function will return the
+ * sub-element name at index
+ *
+ * @param e element to get data from
+ * @param index index of the sub-element
+ * @param name array to store the name into
+ * @param nameLength length of the provided name array
+ * @return number of characters actually written, excluding the
+ * null terminator
+ */
+extern uint32_t __attribute__((overloadable))
+ rsElementGetSubElementName(rs_element e, uint32_t index, char *name, uint32_t nameLength);
+
+/**
+ * For complex elements, some sub-elements could be statically
+ * sized arrays. This function will return the array size for
+ * sub-element at index
+ *
+ * @param e element to get data from
+ * @param index index of the sub-element
+ * @return array size of sub-element in this element at given
+ * index
+ */
+extern uint32_t __attribute__((overloadable))
+ rsElementGetSubElementArraySize(rs_element e, uint32_t index);
+
+/**
+ * This function specifies the location of a sub-element within
+ * the element
+ *
+ * @param e element to get data from
+ * @param index index of the sub-element
+ * @return offset in bytes of sub-element in this element at
+ * given index
+ */
+extern uint32_t __attribute__((overloadable))
+ rsElementGetSubElementOffsetBytes(rs_element e, uint32_t index);
+
+/**
+ * Returns the size of element in bytes
+ *
+ * @param e element to get data from
+ * @return total size of the element in bytes
+ */
+extern uint32_t __attribute__((overloadable))
+ rsElementGetBytesSize(rs_element e);
+
+/**
+ * Returns the element's data type
+ *
+ * @param e element to get data from
+ * @return element's data type
+ */
+extern rs_data_type __attribute__((overloadable))
+ rsElementGetDataType(rs_element e);
+
+/**
+ * Returns the element's data kind
+ *
+ * @param e element to get data from
+ * @return element's data size
+ */
+extern rs_data_kind __attribute__((overloadable))
+ rsElementGetDataKind(rs_element e);
+
+/**
+ * Returns the element's vector size
+ *
+ * @param e element to get data from
+ * @return length of the element vector (for float2, float3,
+ * etc.)
+ */
+extern uint32_t __attribute__((overloadable))
+ rsElementGetVectorSize(rs_element e);
+
+#endif // (defined(RS_VERSION) && (RS_VERSION >= 16))
+
+#endif // __RS_ELEMENT_RSH__
+
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_graphics.rsh b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_graphics.rsh
new file mode 100644
index 0000000..782b27f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_graphics.rsh
@@ -0,0 +1,421 @@
+/*
+ * Copyright (C) 2011-2012 The Android Open Source Project
+ *
+ * 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.
+ */
+
+/** @file rs_graphics.rsh
+ * \brief RenderScript graphics API
+ *
+ * A set of graphics functions used by RenderScript.
+ *
+ */
+#ifndef __RS_GRAPHICS_RSH__
+#define __RS_GRAPHICS_RSH__
+
+#include "rs_mesh.rsh"
+#include "rs_program.rsh"
+
+#if (defined(RS_VERSION) && (RS_VERSION >= 14))
+/**
+ * Set the color target used for all subsequent rendering calls
+ * @param colorTarget
+ * @param slot
+ */
+extern void __attribute__((overloadable))
+ rsgBindColorTarget(rs_allocation colorTarget, uint slot);
+
+/**
+ * Clear the previously set color target
+ * @param slot
+ */
+extern void __attribute__((overloadable))
+ rsgClearColorTarget(uint slot);
+
+/**
+ * Set the depth target used for all subsequent rendering calls
+ * @param depthTarget
+ */
+extern void __attribute__((overloadable))
+ rsgBindDepthTarget(rs_allocation depthTarget);
+
+/**
+ * Clear the previously set depth target
+ */
+extern void __attribute__((overloadable))
+ rsgClearDepthTarget(void);
+
+/**
+ * Clear all color and depth targets and resume rendering into
+ * the framebuffer
+ */
+extern void __attribute__((overloadable))
+ rsgClearAllRenderTargets(void);
+
+/**
+ * Force RenderScript to finish all rendering commands
+ */
+extern uint __attribute__((overloadable))
+ rsgFinish(void);
+
+#endif //defined(RS_VERSION) && (RS_VERSION >= 14)
+
+/**
+ * Bind a new ProgramFragment to the rendering context.
+ *
+ * @param pf
+ */
+extern void __attribute__((overloadable))
+ rsgBindProgramFragment(rs_program_fragment pf);
+
+/**
+ * Bind a new ProgramStore to the rendering context.
+ *
+ * @param ps
+ */
+extern void __attribute__((overloadable))
+ rsgBindProgramStore(rs_program_store ps);
+
+/**
+ * Bind a new ProgramVertex to the rendering context.
+ *
+ * @param pv
+ */
+extern void __attribute__((overloadable))
+ rsgBindProgramVertex(rs_program_vertex pv);
+
+/**
+ * Bind a new ProgramRaster to the rendering context.
+ *
+ * @param pr
+ */
+extern void __attribute__((overloadable))
+ rsgBindProgramRaster(rs_program_raster pr);
+
+/**
+ * Bind a new Sampler object to a ProgramFragment. The sampler will
+ * operate on the texture bound at the matching slot.
+ *
+ * @param slot
+ */
+extern void __attribute__((overloadable))
+ rsgBindSampler(rs_program_fragment, uint slot, rs_sampler);
+
+/**
+ * Bind a new Allocation object to a ProgramFragment. The
+ * Allocation must be a valid texture for the Program. The sampling
+ * of the texture will be controled by the Sampler bound at the
+ * matching slot.
+ *
+ * @param slot
+ */
+extern void __attribute__((overloadable))
+ rsgBindTexture(rs_program_fragment, uint slot, rs_allocation);
+
+/**
+ * Load the projection matrix for a currently bound fixed function
+ * vertex program. Calling this function with a custom vertex shader
+ * would result in an error.
+ * @param proj projection matrix
+ */
+extern void __attribute__((overloadable))
+ rsgProgramVertexLoadProjectionMatrix(const rs_matrix4x4 *proj);
+/**
+ * Load the model matrix for a currently bound fixed function
+ * vertex program. Calling this function with a custom vertex shader
+ * would result in an error.
+ * @param model model matrix
+ */
+extern void __attribute__((overloadable))
+ rsgProgramVertexLoadModelMatrix(const rs_matrix4x4 *model);
+/**
+ * Load the texture matrix for a currently bound fixed function
+ * vertex program. Calling this function with a custom vertex shader
+ * would result in an error.
+ * @param tex texture matrix
+ */
+extern void __attribute__((overloadable))
+ rsgProgramVertexLoadTextureMatrix(const rs_matrix4x4 *tex);
+/**
+ * Get the projection matrix for a currently bound fixed function
+ * vertex program. Calling this function with a custom vertex shader
+ * would result in an error.
+ * @param proj matrix to store the current projection matrix into
+ */
+extern void __attribute__((overloadable))
+ rsgProgramVertexGetProjectionMatrix(rs_matrix4x4 *proj);
+
+/**
+ * Set the constant color for a fixed function emulation program.
+ *
+ * @param pf
+ * @param r
+ * @param g
+ * @param b
+ * @param a
+ */
+extern void __attribute__((overloadable))
+ rsgProgramFragmentConstantColor(rs_program_fragment pf, float r, float g, float b, float a);
+
+/**
+ * Bind a new Allocation object to a ProgramFragment. The
+ * Allocation must be a valid constant input for the Program.
+ *
+ * @param ps program object
+ * @param slot index of the constant buffer on the program
+ * @param c constants to bind
+ */
+extern void __attribute__((overloadable))
+ rsgBindConstant(rs_program_fragment ps, uint slot, rs_allocation c);
+
+/**
+ * Bind a new Allocation object to a ProgramVertex. The
+ * Allocation must be a valid constant input for the Program.
+ *
+ * @param pv program object
+ * @param slot index of the constant buffer on the program
+ * @param c constants to bind
+ */
+extern void __attribute__((overloadable))
+ rsgBindConstant(rs_program_vertex pv, uint slot, rs_allocation c);
+
+/**
+ * Get the width of the current rendering surface.
+ *
+ * @return uint
+ */
+extern uint __attribute__((overloadable))
+ rsgGetWidth(void);
+
+/**
+ * Get the height of the current rendering surface.
+ *
+ * @return uint
+ */
+extern uint __attribute__((overloadable))
+ rsgGetHeight(void);
+
+
+/**
+ * Sync the contents of an allocation from its SCRIPT memory space to its HW
+ * memory spaces.
+ *
+ * @param alloc
+ */
+extern void __attribute__((overloadable))
+ rsgAllocationSyncAll(rs_allocation alloc);
+
+#if (defined(RS_VERSION) && (RS_VERSION >= 14))
+
+/**
+ * Sync the contents of an allocation from memory space
+ * specified by source.
+ *
+ * @param alloc
+ * @param source
+ */
+extern void __attribute__((overloadable))
+ rsgAllocationSyncAll(rs_allocation alloc,
+ rs_allocation_usage_type source);
+
+#endif //defined(RS_VERSION) && (RS_VERSION >= 14)
+
+/**
+ * Low performance utility function for drawing a simple rectangle. Not
+ * intended for drawing large quantities of geometry.
+ *
+ * @param x1
+ * @param y1
+ * @param x2
+ * @param y2
+ * @param z
+ */
+extern void __attribute__((overloadable))
+ rsgDrawRect(float x1, float y1, float x2, float y2, float z);
+
+/**
+ * Low performance utility function for drawing a simple quad. Not intended for
+ * drawing large quantities of geometry.
+ *
+ * @param x1
+ * @param y1
+ * @param z1
+ * @param x2
+ * @param y2
+ * @param z2
+ * @param x3
+ * @param y3
+ * @param z3
+ * @param x4
+ * @param y4
+ * @param z4
+ */
+extern void __attribute__((overloadable))
+ rsgDrawQuad(float x1, float y1, float z1,
+ float x2, float y2, float z2,
+ float x3, float y3, float z3,
+ float x4, float y4, float z4);
+
+
+/**
+ * Low performance utility function for drawing a textured quad. Not intended
+ * for drawing large quantities of geometry.
+ *
+ * @param x1
+ * @param y1
+ * @param z1
+ * @param u1
+ * @param v1
+ * @param x2
+ * @param y2
+ * @param z2
+ * @param u2
+ * @param v2
+ * @param x3
+ * @param y3
+ * @param z3
+ * @param u3
+ * @param v3
+ * @param x4
+ * @param y4
+ * @param z4
+ * @param u4
+ * @param v4
+ */
+extern void __attribute__((overloadable))
+ rsgDrawQuadTexCoords(float x1, float y1, float z1, float u1, float v1,
+ float x2, float y2, float z2, float u2, float v2,
+ float x3, float y3, float z3, float u3, float v3,
+ float x4, float y4, float z4, float u4, float v4);
+
+
+/**
+ * Low performance function for drawing rectangles in screenspace. This
+ * function uses the default passthough ProgramVertex. Any bound ProgramVertex
+ * is ignored. This function has considerable overhead and should not be used
+ * for drawing in shipping applications.
+ *
+ * @param x
+ * @param y
+ * @param z
+ * @param w
+ * @param h
+ */
+extern void __attribute__((overloadable))
+ rsgDrawSpriteScreenspace(float x, float y, float z, float w, float h);
+
+extern void __attribute__((overloadable))
+ rsgDrawPath(rs_path p);
+
+/**
+ * Draw a mesh using the current context state. The whole mesh is
+ * rendered.
+ *
+ * @param ism
+ */
+extern void __attribute__((overloadable))
+ rsgDrawMesh(rs_mesh ism);
+/**
+ * Draw part of a mesh using the current context state.
+ * @param ism mesh object to render
+ * @param primitiveIndex for meshes that contain multiple primitive groups
+ * this parameter specifies the index of the group to draw.
+ */
+extern void __attribute__((overloadable))
+ rsgDrawMesh(rs_mesh ism, uint primitiveIndex);
+/**
+ * Draw specified index range of part of a mesh using the current context state.
+ * @param ism mesh object to render
+ * @param primitiveIndex for meshes that contain multiple primitive groups
+ * this parameter specifies the index of the group to draw.
+ * @param start starting index in the range
+ * @param len number of indices to draw
+ */
+extern void __attribute__((overloadable))
+ rsgDrawMesh(rs_mesh ism, uint primitiveIndex, uint start, uint len);
+
+/**
+ * Clears the rendering surface to the specified color.
+ *
+ * @param r
+ * @param g
+ * @param b
+ * @param a
+ */
+extern void __attribute__((overloadable))
+ rsgClearColor(float r, float g, float b, float a);
+
+/**
+ * Clears the depth suface to the specified value.
+ */
+extern void __attribute__((overloadable))
+ rsgClearDepth(float value);
+/**
+ * Draws text given a string and location
+ */
+extern void __attribute__((overloadable))
+ rsgDrawText(const char *, int x, int y);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsgDrawText(rs_allocation, int x, int y);
+/**
+ * Binds the font object to be used for all subsequent font rendering calls
+ * @param font object to bind
+ */
+extern void __attribute__((overloadable))
+ rsgBindFont(rs_font font);
+/**
+ * Sets the font color for all subsequent rendering calls
+ * @param r red component
+ * @param g green component
+ * @param b blue component
+ * @param a alpha component
+ */
+extern void __attribute__((overloadable))
+ rsgFontColor(float r, float g, float b, float a);
+/**
+ * Returns the bounding box of the text relative to (0, 0)
+ * Any of left, right, top, bottom could be NULL
+ */
+extern void __attribute__((overloadable))
+ rsgMeasureText(const char *, int *left, int *right, int *top, int *bottom);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsgMeasureText(rs_allocation, int *left, int *right, int *top, int *bottom);
+/**
+ * Computes an axis aligned bounding box of a mesh object
+ */
+extern void __attribute__((overloadable))
+ rsgMeshComputeBoundingBox(rs_mesh mesh, float *minX, float *minY, float *minZ,
+ float *maxX, float *maxY, float *maxZ);
+/**
+ * \overload
+ */
+__inline__ static void __attribute__((overloadable, always_inline))
+rsgMeshComputeBoundingBox(rs_mesh mesh, float3 *bBoxMin, float3 *bBoxMax) {
+ float x1, y1, z1, x2, y2, z2;
+ rsgMeshComputeBoundingBox(mesh, &x1, &y1, &z1, &x2, &y2, &z2);
+ bBoxMin->x = x1;
+ bBoxMin->y = y1;
+ bBoxMin->z = z1;
+ bBoxMax->x = x2;
+ bBoxMax->y = y2;
+ bBoxMax->z = z2;
+}
+
+#endif
+
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_math.rsh b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_math.rsh
new file mode 100644
index 0000000..4d3124c
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_math.rsh
@@ -0,0 +1,251 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * 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.
+ */
+
+/** @file rs_math.rsh
+ * \brief todo-jsams
+ *
+ * todo-jsams
+ *
+ */
+
+#ifndef __RS_MATH_RSH__
+#define __RS_MATH_RSH__
+
+
+/**
+ * Return a random value between 0 (or min_value) and max_malue.
+ */
+extern int __attribute__((overloadable))
+ rsRand(int max_value);
+/**
+ * \overload
+ */
+extern int __attribute__((overloadable))
+ rsRand(int min_value, int max_value);
+/**
+ * \overload
+ */
+extern float __attribute__((overloadable))
+ rsRand(float max_value);
+/**
+ * \overload
+ */
+extern float __attribute__((overloadable))
+ rsRand(float min_value, float max_value);
+
+/**
+ * Returns the fractional part of a float
+ */
+extern float __attribute__((const, overloadable))
+ rsFrac(float);
+
+
+/////////////////////////////////////////////////////
+// int ops
+/////////////////////////////////////////////////////
+
+/**
+ * Clamp the value amount between low and high.
+ *
+ * @param amount The value to clamp
+ * @param low
+ * @param high
+ */
+_RS_RUNTIME uint __attribute__((const, overloadable, always_inline)) rsClamp(uint amount, uint low, uint high);
+
+/**
+ * \overload
+ */
+_RS_RUNTIME int __attribute__((const, overloadable, always_inline)) rsClamp(int amount, int low, int high);
+/**
+ * \overload
+ */
+_RS_RUNTIME ushort __attribute__((const, overloadable, always_inline)) rsClamp(ushort amount, ushort low, ushort high);
+/**
+ * \overload
+ */
+_RS_RUNTIME short __attribute__((const, overloadable, always_inline)) rsClamp(short amount, short low, short high);
+/**
+ * \overload
+ */
+_RS_RUNTIME uchar __attribute__((const, overloadable, always_inline)) rsClamp(uchar amount, uchar low, uchar high);
+/**
+ * \overload
+ */
+_RS_RUNTIME char __attribute__((const, overloadable, always_inline)) rsClamp(char amount, char low, char high);
+
+
+/**
+ * Computes 6 frustum planes from the view projection matrix
+ * @param viewProj matrix to extract planes from
+ * @param left plane
+ * @param right plane
+ * @param top plane
+ * @param bottom plane
+ * @param near plane
+ * @param far plane
+ */
+__inline__ static void __attribute__((overloadable, always_inline))
+rsExtractFrustumPlanes(const rs_matrix4x4 *viewProj,
+ float4 *left, float4 *right,
+ float4 *top, float4 *bottom,
+ float4 *near, float4 *far) {
+ // x y z w = a b c d in the plane equation
+ left->x = viewProj->m[3] + viewProj->m[0];
+ left->y = viewProj->m[7] + viewProj->m[4];
+ left->z = viewProj->m[11] + viewProj->m[8];
+ left->w = viewProj->m[15] + viewProj->m[12];
+
+ right->x = viewProj->m[3] - viewProj->m[0];
+ right->y = viewProj->m[7] - viewProj->m[4];
+ right->z = viewProj->m[11] - viewProj->m[8];
+ right->w = viewProj->m[15] - viewProj->m[12];
+
+ top->x = viewProj->m[3] - viewProj->m[1];
+ top->y = viewProj->m[7] - viewProj->m[5];
+ top->z = viewProj->m[11] - viewProj->m[9];
+ top->w = viewProj->m[15] - viewProj->m[13];
+
+ bottom->x = viewProj->m[3] + viewProj->m[1];
+ bottom->y = viewProj->m[7] + viewProj->m[5];
+ bottom->z = viewProj->m[11] + viewProj->m[9];
+ bottom->w = viewProj->m[15] + viewProj->m[13];
+
+ near->x = viewProj->m[3] + viewProj->m[2];
+ near->y = viewProj->m[7] + viewProj->m[6];
+ near->z = viewProj->m[11] + viewProj->m[10];
+ near->w = viewProj->m[15] + viewProj->m[14];
+
+ far->x = viewProj->m[3] - viewProj->m[2];
+ far->y = viewProj->m[7] - viewProj->m[6];
+ far->z = viewProj->m[11] - viewProj->m[10];
+ far->w = viewProj->m[15] - viewProj->m[14];
+
+ float len = length(left->xyz);
+ *left /= len;
+ len = length(right->xyz);
+ *right /= len;
+ len = length(top->xyz);
+ *top /= len;
+ len = length(bottom->xyz);
+ *bottom /= len;
+ len = length(near->xyz);
+ *near /= len;
+ len = length(far->xyz);
+ *far /= len;
+}
+
+/**
+ * Checks if a sphere is withing the 6 frustum planes
+ * @param sphere float4 representing the sphere
+ * @param left plane
+ * @param right plane
+ * @param top plane
+ * @param bottom plane
+ * @param near plane
+ * @param far plane
+ */
+__inline__ static bool __attribute__((overloadable, always_inline))
+rsIsSphereInFrustum(float4 *sphere,
+ float4 *left, float4 *right,
+ float4 *top, float4 *bottom,
+ float4 *near, float4 *far) {
+
+ float distToCenter = dot(left->xyz, sphere->xyz) + left->w;
+ if (distToCenter < -sphere->w) {
+ return false;
+ }
+ distToCenter = dot(right->xyz, sphere->xyz) + right->w;
+ if (distToCenter < -sphere->w) {
+ return false;
+ }
+ distToCenter = dot(top->xyz, sphere->xyz) + top->w;
+ if (distToCenter < -sphere->w) {
+ return false;
+ }
+ distToCenter = dot(bottom->xyz, sphere->xyz) + bottom->w;
+ if (distToCenter < -sphere->w) {
+ return false;
+ }
+ distToCenter = dot(near->xyz, sphere->xyz) + near->w;
+ if (distToCenter < -sphere->w) {
+ return false;
+ }
+ distToCenter = dot(far->xyz, sphere->xyz) + far->w;
+ if (distToCenter < -sphere->w) {
+ return false;
+ }
+ return true;
+}
+
+
+/**
+ * Pack floating point (0-1) RGB values into a uchar4. The alpha component is
+ * set to 255 (1.0).
+ *
+ * @param r
+ * @param g
+ * @param b
+ *
+ * @return uchar4
+ */
+_RS_RUNTIME uchar4 __attribute__((const, overloadable)) rsPackColorTo8888(float r, float g, float b);
+
+/**
+ * Pack floating point (0-1) RGBA values into a uchar4.
+ *
+ * @param r
+ * @param g
+ * @param b
+ * @param a
+ *
+ * @return uchar4
+ */
+_RS_RUNTIME uchar4 __attribute__((const, overloadable)) rsPackColorTo8888(float r, float g, float b, float a);
+
+/**
+ * Pack floating point (0-1) RGB values into a uchar4. The alpha component is
+ * set to 255 (1.0).
+ *
+ * @param color
+ *
+ * @return uchar4
+ */
+_RS_RUNTIME uchar4 __attribute__((const, overloadable)) rsPackColorTo8888(float3 color);
+
+/**
+ * Pack floating point (0-1) RGBA values into a uchar4.
+ *
+ * @param color
+ *
+ * @return uchar4
+ */
+_RS_RUNTIME uchar4 __attribute__((const, overloadable)) rsPackColorTo8888(float4 color);
+
+/**
+ * Unpack a uchar4 color to float4. The resulting float range will be (0-1).
+ *
+ * @param c
+ *
+ * @return float4
+ */
+_RS_RUNTIME float4 __attribute__((const)) rsUnpackColor8888(uchar4 c);
+
+_RS_RUNTIME uchar4 __attribute__((const, overloadable)) rsYuvToRGBA_uchar4(uchar y, uchar u, uchar v);
+_RS_RUNTIME float4 __attribute__((const, overloadable)) rsYuvToRGBA_float4(uchar y, uchar u, uchar v);
+
+
+#endif
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_matrix.rsh b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_matrix.rsh
new file mode 100644
index 0000000..ebff7f4
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_matrix.rsh
@@ -0,0 +1,378 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * 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.
+ */
+
+/** @file rs_matrix.rsh
+ * \brief Matrix routines
+ *
+ *
+ */
+
+#ifndef __RS_MATRIX_RSH__
+#define __RS_MATRIX_RSH__
+
+/**
+ * Set one element of a matrix.
+ *
+ * @param m The matrix to be set
+ * @param row
+ * @param col
+ * @param v
+ *
+ * @return void
+ */
+_RS_RUNTIME void __attribute__((overloadable))
+rsMatrixSet(rs_matrix4x4 *m, uint32_t row, uint32_t col, float v);
+/**
+ * \overload
+ */
+_RS_RUNTIME void __attribute__((overloadable))
+rsMatrixSet(rs_matrix3x3 *m, uint32_t row, uint32_t col, float v);
+/**
+ * \overload
+ */
+_RS_RUNTIME void __attribute__((overloadable))
+rsMatrixSet(rs_matrix2x2 *m, uint32_t row, uint32_t col, float v);
+
+/**
+ * Get one element of a matrix.
+ *
+ * @param m The matrix to read from
+ * @param row
+ * @param col
+ *
+ * @return float
+ */
+_RS_RUNTIME float __attribute__((overloadable))
+rsMatrixGet(const rs_matrix4x4 *m, uint32_t row, uint32_t col);
+/**
+ * \overload
+ */
+_RS_RUNTIME float __attribute__((overloadable))
+rsMatrixGet(const rs_matrix3x3 *m, uint32_t row, uint32_t col);
+/**
+ * \overload
+ */
+_RS_RUNTIME float __attribute__((overloadable))
+rsMatrixGet(const rs_matrix2x2 *m, uint32_t row, uint32_t col);
+
+/**
+ * Set the elements of a matrix to the identity matrix.
+ *
+ * @param m
+ */
+extern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix4x4 *m);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix3x3 *m);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix2x2 *m);
+
+/**
+ * Set the elements of a matrix from an array of floats.
+ *
+ * @param m
+ */
+extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const float *v);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix3x3 *m, const float *v);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix2x2 *m, const float *v);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix4x4 *v);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix3x3 *v);
+
+/**
+ * Set the elements of a matrix from another matrix.
+ *
+ * @param m
+ */
+extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix2x2 *v);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix3x3 *m, const rs_matrix3x3 *v);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix2x2 *m, const rs_matrix2x2 *v);
+
+/**
+ * Load a rotation matrix.
+ *
+ * @param m
+ * @param rot
+ * @param x
+ * @param y
+ * @param z
+ */
+extern void __attribute__((overloadable))
+rsMatrixLoadRotate(rs_matrix4x4 *m, float rot, float x, float y, float z);
+
+/**
+ * Load a scale matrix.
+ *
+ * @param m
+ * @param x
+ * @param y
+ * @param z
+ */
+extern void __attribute__((overloadable))
+rsMatrixLoadScale(rs_matrix4x4 *m, float x, float y, float z);
+
+/**
+ * Load a translation matrix.
+ *
+ * @param m
+ * @param x
+ * @param y
+ * @param z
+ */
+extern void __attribute__((overloadable))
+rsMatrixLoadTranslate(rs_matrix4x4 *m, float x, float y, float z);
+
+/**
+ * Multiply two matrix (lhs, rhs) and place the result in m.
+ *
+ * @param m
+ * @param lhs
+ * @param rhs
+ */
+extern void __attribute__((overloadable))
+rsMatrixLoadMultiply(rs_matrix4x4 *m, const rs_matrix4x4 *lhs, const rs_matrix4x4 *rhs);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+rsMatrixLoadMultiply(rs_matrix3x3 *m, const rs_matrix3x3 *lhs, const rs_matrix3x3 *rhs);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+rsMatrixLoadMultiply(rs_matrix2x2 *m, const rs_matrix2x2 *lhs, const rs_matrix2x2 *rhs);
+
+/**
+ * Multiply the matrix m by rhs and place the result back into m.
+ *
+ * @param m (lhs)
+ * @param rhs
+ */
+extern void __attribute__((overloadable))
+rsMatrixMultiply(rs_matrix4x4 *m, const rs_matrix4x4 *rhs);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+rsMatrixMultiply(rs_matrix3x3 *m, const rs_matrix3x3 *rhs);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+rsMatrixMultiply(rs_matrix2x2 *m, const rs_matrix2x2 *rhs);
+
+/**
+ * Multiple matrix m with a rotation matrix
+ *
+ * @param m
+ * @param rot
+ * @param x
+ * @param y
+ * @param z
+ */
+extern void __attribute__((overloadable))
+rsMatrixRotate(rs_matrix4x4 *m, float rot, float x, float y, float z);
+
+/**
+ * Multiple matrix m with a scale matrix
+ *
+ * @param m
+ * @param x
+ * @param y
+ * @param z
+ */
+extern void __attribute__((overloadable))
+rsMatrixScale(rs_matrix4x4 *m, float x, float y, float z);
+
+/**
+ * Multiple matrix m with a translation matrix
+ *
+ * @param m
+ * @param x
+ * @param y
+ * @param z
+ */
+extern void __attribute__((overloadable))
+rsMatrixTranslate(rs_matrix4x4 *m, float x, float y, float z);
+
+/**
+ * Load an Ortho projection matrix constructed from the 6 planes
+ *
+ * @param m
+ * @param left
+ * @param right
+ * @param bottom
+ * @param top
+ * @param near
+ * @param far
+ */
+extern void __attribute__((overloadable))
+rsMatrixLoadOrtho(rs_matrix4x4 *m, float left, float right, float bottom, float top, float near, float far);
+
+/**
+ * Load an Frustum projection matrix constructed from the 6 planes
+ *
+ * @param m
+ * @param left
+ * @param right
+ * @param bottom
+ * @param top
+ * @param near
+ * @param far
+ */
+extern void __attribute__((overloadable))
+rsMatrixLoadFrustum(rs_matrix4x4 *m, float left, float right, float bottom, float top, float near, float far);
+
+/**
+ * Load an perspective projection matrix constructed from the 6 planes
+ *
+ * @param m
+ * @param fovy Field of view, in degrees along the Y axis.
+ * @param aspect Ratio of x / y.
+ * @param near
+ * @param far
+ */
+extern void __attribute__((overloadable))
+rsMatrixLoadPerspective(rs_matrix4x4* m, float fovy, float aspect, float near, float far);
+
+#if !defined(RS_VERSION) || (RS_VERSION < 14)
+/**
+ * Multiply a vector by a matrix and return the result vector.
+ * API version 10-13
+ */
+_RS_RUNTIME float4 __attribute__((overloadable))
+rsMatrixMultiply(rs_matrix4x4 *m, float4 in);
+
+/**
+ * \overload
+ */
+_RS_RUNTIME float4 __attribute__((overloadable))
+rsMatrixMultiply(rs_matrix4x4 *m, float3 in);
+
+/**
+ * \overload
+ */
+_RS_RUNTIME float4 __attribute__((overloadable))
+rsMatrixMultiply(rs_matrix4x4 *m, float2 in);
+
+/**
+ * \overload
+ */
+_RS_RUNTIME float3 __attribute__((overloadable))
+rsMatrixMultiply(rs_matrix3x3 *m, float3 in);
+
+/**
+ * \overload
+ */
+_RS_RUNTIME float3 __attribute__((overloadable))
+rsMatrixMultiply(rs_matrix3x3 *m, float2 in);
+
+/**
+ * \overload
+ */
+_RS_RUNTIME float2 __attribute__((overloadable))
+rsMatrixMultiply(rs_matrix2x2 *m, float2 in);
+#else
+/**
+ * Multiply a vector by a matrix and return the result vector.
+ * API version 14+
+ */
+_RS_RUNTIME float4 __attribute__((overloadable))
+rsMatrixMultiply(const rs_matrix4x4 *m, float4 in);
+
+/**
+ * \overload
+ */
+_RS_RUNTIME float4 __attribute__((overloadable))
+rsMatrixMultiply(const rs_matrix4x4 *m, float3 in);
+
+/**
+ * \overload
+ */
+_RS_RUNTIME float4 __attribute__((overloadable))
+rsMatrixMultiply(const rs_matrix4x4 *m, float2 in);
+
+/**
+ * \overload
+ */
+_RS_RUNTIME float3 __attribute__((overloadable))
+rsMatrixMultiply(const rs_matrix3x3 *m, float3 in);
+
+/**
+ * \overload
+ */
+_RS_RUNTIME float3 __attribute__((overloadable))
+rsMatrixMultiply(const rs_matrix3x3 *m, float2 in);
+
+/**
+ * \overload
+ */
+_RS_RUNTIME float2 __attribute__((overloadable))
+rsMatrixMultiply(const rs_matrix2x2 *m, float2 in);
+#endif
+
+
+/**
+ * Returns true if the matrix was successfully inversed
+ *
+ * @param m
+ */
+extern bool __attribute__((overloadable)) rsMatrixInverse(rs_matrix4x4 *m);
+
+/**
+ * Returns true if the matrix was successfully inversed and transposed.
+ *
+ * @param m
+ */
+extern bool __attribute__((overloadable)) rsMatrixInverseTranspose(rs_matrix4x4 *m);
+
+/**
+ * Transpose the matrix m.
+ *
+ * @param m
+ */
+extern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix4x4 *m);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix3x3 *m);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix2x2 *m);
+
+
+#endif
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_mesh.rsh b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_mesh.rsh
new file mode 100644
index 0000000..0ecd786
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_mesh.rsh
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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.
+ */
+
+/** @file rs_mesh.rsh
+ * \brief Mesh routines
+ *
+ *
+ */
+
+#ifndef __RS_MESH_RSH__
+#define __RS_MESH_RSH__
+
+// New API's
+#if (defined(RS_VERSION) && (RS_VERSION >= 16))
+
+/**
+ * Returns the number of allocations in the mesh that contain
+ * vertex data
+ *
+ * @param m mesh to get data from
+ * @return number of allocations in the mesh that contain vertex
+ * data
+ */
+extern uint32_t __attribute__((overloadable))
+ rsgMeshGetVertexAllocationCount(rs_mesh m);
+
+/**
+ * Meshes could have multiple index sets, this function returns
+ * the number.
+ *
+ * @param m mesh to get data from
+ * @return number of primitive groups in the mesh. This would
+ * include simple primitives as well as allocations
+ * containing index data
+ */
+extern uint32_t __attribute__((overloadable))
+ rsgMeshGetPrimitiveCount(rs_mesh m);
+
+/**
+ * Returns an allocation that is part of the mesh and contains
+ * vertex data, e.g. positions, normals, texcoords
+ *
+ * @param m mesh to get data from
+ * @param index index of the vertex allocation
+ * @return allocation containing vertex data
+ */
+extern rs_allocation __attribute__((overloadable))
+ rsgMeshGetVertexAllocation(rs_mesh m, uint32_t index);
+
+/**
+ * Returns an allocation containing index data or a null
+ * allocation if only the primitive is specified
+ *
+ * @param m mesh to get data from
+ * @param index index of the index allocation
+ * @return allocation containing index data
+ */
+extern rs_allocation __attribute__((overloadable))
+ rsgMeshGetIndexAllocation(rs_mesh m, uint32_t index);
+
+/**
+ * Returns the primitive describing how a part of the mesh is
+ * rendered
+ *
+ * @param m mesh to get data from
+ * @param index index of the primitive
+ * @return primitive describing how the mesh is rendered
+ */
+extern rs_primitive __attribute__((overloadable))
+ rsgMeshGetPrimitive(rs_mesh m, uint32_t index);
+
+#endif // (defined(RS_VERSION) && (RS_VERSION >= 16))
+
+#endif // __RS_MESH_RSH__
+
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_object.rsh b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_object.rsh
new file mode 100644
index 0000000..1fc3f83
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_object.rsh
@@ -0,0 +1,220 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * 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.
+ */
+
+/** @file rs_object.rsh
+ * \brief Object routines
+ *
+ *
+ */
+
+#ifndef __RS_OBJECT_RSH__
+#define __RS_OBJECT_RSH__
+
+
+/**
+ * Copy reference to the specified object.
+ *
+ * @param dst
+ * @param src
+ */
+extern void __attribute__((overloadable))
+ rsSetObject(rs_element *dst, rs_element src);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsSetObject(rs_type *dst, rs_type src);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsSetObject(rs_allocation *dst, rs_allocation src);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsSetObject(rs_sampler *dst, rs_sampler src);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsSetObject(rs_script *dst, rs_script src);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsSetObject(rs_path *dst, rs_path src);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsSetObject(rs_mesh *dst, rs_mesh src);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsSetObject(rs_program_fragment *dst, rs_program_fragment src);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsSetObject(rs_program_vertex *dst, rs_program_vertex src);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsSetObject(rs_program_raster *dst, rs_program_raster src);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsSetObject(rs_program_store *dst, rs_program_store src);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsSetObject(rs_font *dst, rs_font src);
+
+/**
+ * Sets the object to NULL.
+ *
+ * @return bool
+ */
+extern void __attribute__((overloadable))
+ rsClearObject(rs_element *dst);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsClearObject(rs_type *dst);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsClearObject(rs_allocation *dst);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsClearObject(rs_sampler *dst);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsClearObject(rs_script *dst);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsClearObject(rs_path *dst);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsClearObject(rs_mesh *dst);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsClearObject(rs_program_fragment *dst);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsClearObject(rs_program_vertex *dst);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsClearObject(rs_program_raster *dst);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsClearObject(rs_program_store *dst);
+/**
+ * \overload
+ */
+extern void __attribute__((overloadable))
+ rsClearObject(rs_font *dst);
+
+
+
+/**
+ * Tests if the object is valid. Returns true if the object is valid, false if
+ * it is NULL.
+ *
+ * @return bool
+ */
+extern bool __attribute__((overloadable))
+ rsIsObject(rs_element);
+/**
+ * \overload
+ */
+extern bool __attribute__((overloadable))
+ rsIsObject(rs_type);
+/**
+ * \overload
+ */
+extern bool __attribute__((overloadable))
+ rsIsObject(rs_allocation);
+/**
+ * \overload
+ */
+extern bool __attribute__((overloadable))
+ rsIsObject(rs_sampler);
+/**
+ * \overload
+ */
+extern bool __attribute__((overloadable))
+ rsIsObject(rs_script);
+/**
+ * \overload
+ */
+extern bool __attribute__((overloadable))
+ rsIsObject(rs_path);
+/**
+ * \overload
+ */
+extern bool __attribute__((overloadable))
+ rsIsObject(rs_mesh);
+/**
+ * \overload
+ */
+extern bool __attribute__((overloadable))
+ rsIsObject(rs_program_fragment);
+/**
+ * \overload
+ */
+extern bool __attribute__((overloadable))
+ rsIsObject(rs_program_vertex);
+/**
+ * \overload
+ */
+extern bool __attribute__((overloadable))
+ rsIsObject(rs_program_raster);
+/**
+ * \overload
+ */
+extern bool __attribute__((overloadable))
+ rsIsObject(rs_program_store);
+/**
+ * \overload
+ */
+extern bool __attribute__((overloadable))
+ rsIsObject(rs_font);
+
+#endif
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_program.rsh b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_program.rsh
new file mode 100644
index 0000000..299aae6
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_program.rsh
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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.
+ */
+
+/** @file rs_program.rsh
+ * \brief Program object routines
+ *
+ *
+ */
+
+#ifndef __RS_PROGRAM_RSH__
+#define __RS_PROGRAM_RSH__
+
+#if (defined(RS_VERSION) && (RS_VERSION >= 16))
+
+/**
+ * Get program store depth function
+ *
+ * @param ps program store to query
+ */
+extern rs_depth_func __attribute__((overloadable))
+ rsgProgramStoreGetDepthFunc(rs_program_store ps);
+
+/**
+ * Get program store depth mask
+ *
+ * @param ps program store to query
+ */
+extern bool __attribute__((overloadable))
+ rsgProgramStoreIsDepthMaskEnabled(rs_program_store ps);
+/**
+ * Get program store red component color mask
+ *
+ * @param ps program store to query
+ */
+extern bool __attribute__((overloadable))
+ rsgProgramStoreIsColorMaskRedEnabled(rs_program_store ps);
+
+/**
+ * Get program store green component color mask
+ *
+ * @param ps program store to query
+ */
+extern bool __attribute__((overloadable))
+ rsgProgramStoreIsColorMaskGreenEnabled(rs_program_store ps);
+
+/**
+ * Get program store blur component color mask
+ *
+ * @param ps program store to query
+ */
+extern bool __attribute__((overloadable))
+ rsgProgramStoreIsColorMaskBlueEnabled(rs_program_store ps);
+
+/**
+ * Get program store alpha component color mask
+ *
+ * @param ps program store to query
+ */
+extern bool __attribute__((overloadable))
+ rsgProgramStoreIsColorMaskAlphaEnabled(rs_program_store ps);
+
+/**
+ * Get program store blend source function
+ *
+ * @param ps program store to query
+ */
+extern rs_blend_src_func __attribute__((overloadable))
+ rsgProgramStoreGetBlendSrcFunc(rs_program_store ps);
+
+/**
+ * Get program store blend destination function
+ *
+ * @param ps program store to query
+ */
+extern rs_blend_dst_func __attribute__((overloadable))
+ rsgProgramStoreGetBlendDstFunc(rs_program_store ps);
+
+/**
+ * Get program store dither state
+ *
+ * @param ps program store to query
+ */
+extern bool __attribute__((overloadable))
+ rsgProgramStoreIsDitherEnabled(rs_program_store ps);
+
+/**
+ * Get program raster point sprite state
+ *
+ * @param pr program raster to query
+ */
+extern bool __attribute__((overloadable))
+ rsgProgramRasterIsPointSpriteEnabled(rs_program_raster pr);
+
+/**
+ * Get program raster cull mode
+ *
+ * @param pr program raster to query
+ */
+extern rs_cull_mode __attribute__((overloadable))
+ rsgProgramRasterGetCullMode(rs_program_raster pr);
+
+#endif // (defined(RS_VERSION) && (RS_VERSION >= 16))
+
+#endif // __RS_PROGRAM_RSH__
+
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_quaternion.rsh b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_quaternion.rsh
new file mode 100644
index 0000000..4e08d2f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_quaternion.rsh
@@ -0,0 +1,253 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * 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.
+ */
+
+/** @file rs_quaternion.rsh
+ * \brief Quaternion routines
+ *
+ *
+ */
+
+#ifndef __RS_QUATERNION_RSH__
+#define __RS_QUATERNION_RSH__
+
+
+/**
+ * Set the quaternion components
+ * @param w component
+ * @param x component
+ * @param y component
+ * @param z component
+ */
+static void __attribute__((overloadable))
+rsQuaternionSet(rs_quaternion *q, float w, float x, float y, float z) {
+ q->w = w;
+ q->x = x;
+ q->y = y;
+ q->z = z;
+}
+
+/**
+ * Set the quaternion from another quaternion
+ * @param q destination quaternion
+ * @param rhs source quaternion
+ */
+static void __attribute__((overloadable))
+rsQuaternionSet(rs_quaternion *q, const rs_quaternion *rhs) {
+ q->w = rhs->w;
+ q->x = rhs->x;
+ q->y = rhs->y;
+ q->z = rhs->z;
+}
+
+/**
+ * Multiply quaternion by a scalar
+ * @param q quaternion to multiply
+ * @param s scalar
+ */
+static void __attribute__((overloadable))
+rsQuaternionMultiply(rs_quaternion *q, float s) {
+ q->w *= s;
+ q->x *= s;
+ q->y *= s;
+ q->z *= s;
+}
+
+/**
+ * Add two quaternions
+ * @param q destination quaternion to add to
+ * @param rsh right hand side quaternion to add
+ */
+static void
+rsQuaternionAdd(rs_quaternion *q, const rs_quaternion *rhs) {
+ q->w *= rhs->w;
+ q->x *= rhs->x;
+ q->y *= rhs->y;
+ q->z *= rhs->z;
+}
+
+/**
+ * Loads a quaternion that represents a rotation about an arbitrary unit vector
+ * @param q quaternion to set
+ * @param rot angle to rotate by
+ * @param x component of a vector
+ * @param y component of a vector
+ * @param x component of a vector
+ */
+static void
+rsQuaternionLoadRotateUnit(rs_quaternion *q, float rot, float x, float y, float z) {
+ rot *= (float)(M_PI / 180.0f) * 0.5f;
+ float c = cos(rot);
+ float s = sin(rot);
+
+ q->w = c;
+ q->x = x * s;
+ q->y = y * s;
+ q->z = z * s;
+}
+
+/**
+ * Loads a quaternion that represents a rotation about an arbitrary vector
+ * (doesn't have to be unit)
+ * @param q quaternion to set
+ * @param rot angle to rotate by
+ * @param x component of a vector
+ * @param y component of a vector
+ * @param x component of a vector
+ */
+static void
+rsQuaternionLoadRotate(rs_quaternion *q, float rot, float x, float y, float z) {
+ const float len = x*x + y*y + z*z;
+ if (len != 1) {
+ const float recipLen = 1.f / sqrt(len);
+ x *= recipLen;
+ y *= recipLen;
+ z *= recipLen;
+ }
+ rsQuaternionLoadRotateUnit(q, rot, x, y, z);
+}
+
+/**
+ * Conjugates the quaternion
+ * @param q quaternion to conjugate
+ */
+static void
+rsQuaternionConjugate(rs_quaternion *q) {
+ q->x = -q->x;
+ q->y = -q->y;
+ q->z = -q->z;
+}
+
+/**
+ * Dot product of two quaternions
+ * @param q0 first quaternion
+ * @param q1 second quaternion
+ * @return dot product between q0 and q1
+ */
+static float
+rsQuaternionDot(const rs_quaternion *q0, const rs_quaternion *q1) {
+ return q0->w*q1->w + q0->x*q1->x + q0->y*q1->y + q0->z*q1->z;
+}
+
+/**
+ * Normalizes the quaternion
+ * @param q quaternion to normalize
+ */
+static void
+rsQuaternionNormalize(rs_quaternion *q) {
+ const float len = rsQuaternionDot(q, q);
+ if (len != 1) {
+ const float recipLen = 1.f / sqrt(len);
+ rsQuaternionMultiply(q, recipLen);
+ }
+}
+
+/**
+ * Multiply quaternion by another quaternion
+ * @param q destination quaternion
+ * @param rhs right hand side quaternion to multiply by
+ */
+static void __attribute__((overloadable))
+rsQuaternionMultiply(rs_quaternion *q, const rs_quaternion *rhs) {
+ rs_quaternion qtmp;
+ rsQuaternionSet(&qtmp, q);
+
+ q->w = qtmp.w*rhs->w - qtmp.x*rhs->x - qtmp.y*rhs->y - qtmp.z*rhs->z;
+ q->x = qtmp.w*rhs->x + qtmp.x*rhs->w + qtmp.y*rhs->z - qtmp.z*rhs->y;
+ q->y = qtmp.w*rhs->y + qtmp.y*rhs->w + qtmp.z*rhs->x - qtmp.x*rhs->z;
+ q->z = qtmp.w*rhs->z + qtmp.z*rhs->w + qtmp.x*rhs->y - qtmp.y*rhs->x;
+ rsQuaternionNormalize(q);
+}
+
+/**
+ * Performs spherical linear interpolation between two quaternions
+ * @param q result quaternion from interpolation
+ * @param q0 first param
+ * @param q1 second param
+ * @param t how much to interpolate by
+ */
+static void
+rsQuaternionSlerp(rs_quaternion *q, const rs_quaternion *q0, const rs_quaternion *q1, float t) {
+ if (t <= 0.0f) {
+ rsQuaternionSet(q, q0);
+ return;
+ }
+ if (t >= 1.0f) {
+ rsQuaternionSet(q, q1);
+ return;
+ }
+
+ rs_quaternion tempq0, tempq1;
+ rsQuaternionSet(&tempq0, q0);
+ rsQuaternionSet(&tempq1, q1);
+
+ float angle = rsQuaternionDot(q0, q1);
+ if (angle < 0) {
+ rsQuaternionMultiply(&tempq0, -1.0f);
+ angle *= -1.0f;
+ }
+
+ float scale, invScale;
+ if (angle + 1.0f > 0.05f) {
+ if (1.0f - angle >= 0.05f) {
+ float theta = acos(angle);
+ float invSinTheta = 1.0f / sin(theta);
+ scale = sin(theta * (1.0f - t)) * invSinTheta;
+ invScale = sin(theta * t) * invSinTheta;
+ } else {
+ scale = 1.0f - t;
+ invScale = t;
+ }
+ } else {
+ rsQuaternionSet(&tempq1, tempq0.z, -tempq0.y, tempq0.x, -tempq0.w);
+ scale = sin(M_PI * (0.5f - t));
+ invScale = sin(M_PI * t);
+ }
+
+ rsQuaternionSet(q, tempq0.w*scale + tempq1.w*invScale, tempq0.x*scale + tempq1.x*invScale,
+ tempq0.y*scale + tempq1.y*invScale, tempq0.z*scale + tempq1.z*invScale);
+}
+
+/**
+ * Computes rotation matrix from the normalized quaternion
+ * @param m resulting matrix
+ * @param p normalized quaternion
+ */
+static void rsQuaternionGetMatrixUnit(rs_matrix4x4 *m, const rs_quaternion *q) {
+ float xx = q->x * q->x;
+ float xy = q->x * q->y;
+ float xz = q->x * q->z;
+ float xw = q->x * q->w;
+ float yy = q->y * q->y;
+ float yz = q->y * q->z;
+ float yw = q->y * q->w;
+ float zz = q->z * q->z;
+ float zw = q->z * q->w;
+
+ m->m[0] = 1.0f - 2.0f * ( yy + zz );
+ m->m[4] = 2.0f * ( xy - zw );
+ m->m[8] = 2.0f * ( xz + yw );
+ m->m[1] = 2.0f * ( xy + zw );
+ m->m[5] = 1.0f - 2.0f * ( xx + zz );
+ m->m[9] = 2.0f * ( yz - xw );
+ m->m[2] = 2.0f * ( xz - yw );
+ m->m[6] = 2.0f * ( yz + xw );
+ m->m[10] = 1.0f - 2.0f * ( xx + yy );
+ m->m[3] = m->m[7] = m->m[11] = m->m[12] = m->m[13] = m->m[14] = 0.0f;
+ m->m[15] = 1.0f;
+}
+
+#endif
+
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_sampler.rsh b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_sampler.rsh
new file mode 100644
index 0000000..2ff426c
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_sampler.rsh
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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.
+ */
+
+/** @file rs_sampler.rsh
+ * \brief Sampler routines
+ *
+ *
+ */
+
+#ifndef __RS_SAMPLER_RSH__
+#define __RS_SAMPLER_RSH__
+
+// New API's
+#if (defined(RS_VERSION) && (RS_VERSION >= 16))
+
+/**
+ * Get sampler minification value
+ *
+ * @param s sampler to query
+ * @return minification value
+ */
+extern rs_sampler_value __attribute__((overloadable))
+ rsSamplerGetMinification(rs_sampler s);
+
+/**
+ * Get sampler magnification value
+ *
+ * @param s sampler to query
+ * @return magnification value
+ */
+extern rs_sampler_value __attribute__((overloadable))
+ rsSamplerGetMagnification(rs_sampler s);
+
+/**
+ * Get sampler wrap S value
+ *
+ * @param s sampler to query
+ * @return wrap S value
+ */
+extern rs_sampler_value __attribute__((overloadable))
+ rsSamplerGetWrapS(rs_sampler s);
+
+/**
+ * Get sampler wrap T value
+ *
+ * @param s sampler to query
+ * @return wrap T value
+ */
+extern rs_sampler_value __attribute__((overloadable))
+ rsSamplerGetWrapT(rs_sampler s);
+
+/**
+ Get sampler anisotropy
+ *
+ * @param s sampler to query
+ * @return anisotropy
+ */
+extern float __attribute__((overloadable))
+ rsSamplerGetAnisotropy(rs_sampler s);
+
+#endif // (defined(RS_VERSION) && (RS_VERSION >= 16))
+
+#endif // __RS_SAMPLER_RSH__
+
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_time.rsh b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_time.rsh
new file mode 100644
index 0000000..1e6ab99
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_time.rsh
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * 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.
+ */
+
+/** @file rs_time.rsh
+ * \brief RenderScript time routines
+ *
+ * This file contains RenderScript functions relating to time and date
+ * manipulation.
+ */
+
+#ifndef __RS_TIME_RSH__
+#define __RS_TIME_RSH__
+
+/**
+ * Calendar time interpreted as seconds elapsed since the Epoch (00:00:00 on
+ * January 1, 1970, Coordinated Universal Time (UTC)).
+ */
+typedef int rs_time_t;
+
+/**
+ * Data structure for broken-down time components.
+ *
+ * tm_sec - Seconds after the minute. This ranges from 0 to 59, but possibly
+ * up to 60 for leap seconds.
+ * tm_min - Minutes after the hour. This ranges from 0 to 59.
+ * tm_hour - Hours past midnight. This ranges from 0 to 23.
+ * tm_mday - Day of the month. This ranges from 1 to 31.
+ * tm_mon - Months since January. This ranges from 0 to 11.
+ * tm_year - Years since 1900.
+ * tm_wday - Days since Sunday. This ranges from 0 to 6.
+ * tm_yday - Days since January 1. This ranges from 0 to 365.
+ * tm_isdst - Flag to indicate whether daylight saving time is in effect. The
+ * value is positive if it is in effect, zero if it is not, and
+ * negative if the information is not available.
+ */
+typedef struct {
+ int tm_sec; ///< seconds
+ int tm_min; ///< minutes
+ int tm_hour; ///< hours
+ int tm_mday; ///< day of the month
+ int tm_mon; ///< month
+ int tm_year; ///< year
+ int tm_wday; ///< day of the week
+ int tm_yday; ///< day of the year
+ int tm_isdst; ///< daylight savings time
+} rs_tm;
+
+/**
+ * Returns the number of seconds since the Epoch (00:00:00 UTC, January 1,
+ * 1970). If @p timer is non-NULL, the result is also stored in the memory
+ * pointed to by this variable. If an error occurs, a value of -1 is returned.
+ *
+ * @param timer Location to also store the returned calendar time.
+ *
+ * @return Seconds since the Epoch.
+ */
+extern rs_time_t __attribute__((overloadable))
+ rsTime(rs_time_t *timer);
+
+/**
+ * Converts the time specified by @p timer into broken-down time and stores it
+ * in @p local. This function also returns a pointer to @p local. If @p local
+ * is NULL, this function does nothing and returns NULL.
+ *
+ * @param local Broken-down time.
+ * @param timer Input time as calendar time.
+ *
+ * @return Pointer to broken-down time (same as input @p local).
+ */
+extern rs_tm * __attribute__((overloadable))
+ rsLocaltime(rs_tm *local, const rs_time_t *timer);
+
+/**
+ * Returns the current system clock (uptime) in milliseconds.
+ *
+ * @return Uptime in milliseconds.
+ */
+extern int64_t __attribute__((overloadable))
+ rsUptimeMillis(void);
+
+/**
+ * Returns the current system clock (uptime) in nanoseconds.
+ *
+ * @return Uptime in nanoseconds.
+ */
+extern int64_t __attribute__((overloadable))
+ rsUptimeNanos(void);
+
+/**
+ * Returns the time in seconds since this function was last called in this
+ * script.
+ *
+ * @return Time in seconds.
+ */
+extern float __attribute__((overloadable))
+ rsGetDt(void);
+
+#endif
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_types.rsh b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_types.rsh
new file mode 100644
index 0000000..de09279
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/include/rs_types.rsh
@@ -0,0 +1,628 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * 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.
+ */
+
+/** @file rs_types.rsh
+ *
+ * Define the standard RenderScript types
+ *
+ * Integers
+ * 8 bit: char, int8_t
+ * 16 bit: short, int16_t
+ * 32 bit: int, in32_t
+ * 64 bit: long, long long, int64_t
+ *
+ * Unsigned Integers
+ * 8 bit: uchar, uint8_t
+ * 16 bit: ushort, uint16_t
+ * 32 bit: uint, uint32_t
+ * 64 bit: ulong, uint64_t
+ *
+ * Floating point
+ * 32 bit: float
+ * 64 bit: double
+ *
+ * Vectors of length 2, 3, and 4 are supported for all the types above.
+ *
+ */
+
+#ifndef __RS_TYPES_RSH__
+#define __RS_TYPES_RSH__
+
+/* Constants */
+#define M_E 2.718281828459045235360287471352662498f /* e */
+#define M_LOG2E 1.442695040888963407359924681001892137f /* log_2 e */
+#define M_LOG10E 0.434294481903251827651128918916605082f /* log_10 e */
+#define M_LN2 0.693147180559945309417232121458176568f /* log_e 2 */
+#define M_LN10 2.302585092994045684017991454684364208f /* log_e 10 */
+#define M_PI 3.141592653589793238462643383279502884f /* pi */
+#define M_PI_2 1.570796326794896619231321691639751442f /* pi/2 */
+#define M_PI_4 0.785398163397448309615660845819875721f /* pi/4 */
+#define M_1_PI 0.318309886183790671537767526745028724f /* 1/pi */
+#define M_2_PIl 0.636619772367581343075535053490057448f /* 2/pi */
+#define M_2_SQRTPI 1.128379167095512573896158903121545172f /* 2/sqrt(pi) */
+#define M_SQRT2 1.414213562373095048801688724209698079f /* sqrt(2) */
+#define M_SQRT1_2 0.707106781186547524400844362104849039f /* 1/sqrt(2) */
+
+#include "stdbool.h"
+/**
+ * 8 bit integer type
+ */
+typedef char int8_t;
+/**
+ * 16 bit integer type
+ */
+typedef short int16_t;
+/**
+ * 32 bit integer type
+ */
+typedef int int32_t;
+/**
+ * 64 bit integer type
+ */
+typedef long long int64_t;
+/**
+ * 8 bit unsigned integer type
+ */
+typedef unsigned char uint8_t;
+/**
+ * 16 bit unsigned integer type
+ */
+typedef unsigned short uint16_t;
+/**
+ * 32 bit unsigned integer type
+ */
+typedef unsigned int uint32_t;
+/**
+ * 64 bit unsigned integer type
+ */
+typedef unsigned long long uint64_t;
+/**
+ * 8 bit unsigned integer type
+ */
+typedef uint8_t uchar;
+/**
+ * 16 bit unsigned integer type
+ */
+typedef uint16_t ushort;
+/**
+ * 32 bit unsigned integer type
+ */
+typedef uint32_t uint;
+/**
+ * Typedef for unsigned long (use for 64-bit unsigned integers)
+ */
+typedef uint64_t ulong;
+/**
+ * Typedef for unsigned int
+ */
+typedef uint32_t size_t;
+/**
+ * Typedef for int (use for 32-bit integers)
+ */
+typedef int32_t ssize_t;
+
+/**
+ * \brief Opaque handle to a RenderScript element.
+ *
+ * See: android.renderscript.Element
+ */
+typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_element;
+/**
+ * \brief Opaque handle to a RenderScript type.
+ *
+ * See: android.renderscript.Type
+ */
+typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_type;
+/**
+ * \brief Opaque handle to a RenderScript allocation.
+ *
+ * See: android.renderscript.Allocation
+ */
+typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_allocation;
+/**
+ * \brief Opaque handle to a RenderScript sampler object.
+ *
+ * See: android.renderscript.Sampler
+ */
+typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_sampler;
+/**
+ * \brief Opaque handle to a RenderScript script object.
+ *
+ * See: android.renderscript.ScriptC
+ */
+typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_script;
+/**
+ * \brief Opaque handle to a RenderScript mesh object.
+ *
+ * See: android.renderscript.Mesh
+ */
+typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_mesh;
+/**
+ * \brief Opaque handle to a RenderScript Path object.
+ *
+ * See: android.renderscript.Path
+ */
+typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_path;
+/**
+ * \brief Opaque handle to a RenderScript ProgramFragment object.
+ *
+ * See: android.renderscript.ProgramFragment
+ */
+typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_program_fragment;
+/**
+ * \brief Opaque handle to a RenderScript ProgramVertex object.
+ *
+ * See: android.renderscript.ProgramVertex
+ */
+typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_program_vertex;
+/**
+ * \brief Opaque handle to a RenderScript ProgramRaster object.
+ *
+ * See: android.renderscript.ProgramRaster
+ */
+typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_program_raster;
+/**
+ * \brief Opaque handle to a RenderScript ProgramStore object.
+ *
+ * See: android.renderscript.ProgramStore
+ */
+typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_program_store;
+/**
+ * \brief Opaque handle to a RenderScript font object.
+ *
+ * See: android.renderscript.Font
+ */
+typedef struct { const int* const p; } __attribute__((packed, aligned(4))) rs_font;
+
+/**
+ * Vector version of the basic float type.
+ * Provides two float fields packed into a single 64 bit field with 64 bit
+ * alignment.
+ */
+typedef float float2 __attribute__((ext_vector_type(2)));
+/**
+ * Vector version of the basic float type. Provides three float fields packed
+ * into a single 128 bit field with 128 bit alignment.
+ */
+typedef float float3 __attribute__((ext_vector_type(3)));
+/**
+ * Vector version of the basic float type.
+ * Provides four float fields packed into a single 128 bit field with 128 bit
+ * alignment.
+ */
+typedef float float4 __attribute__((ext_vector_type(4)));
+
+/**
+ * Vector version of the basic double type. Provides two double fields packed
+ * into a single 128 bit field with 128 bit alignment.
+ */
+typedef double double2 __attribute__((ext_vector_type(2)));
+/**
+ * Vector version of the basic double type. Provides three double fields packed
+ * into a single 256 bit field with 256 bit alignment.
+ */
+typedef double double3 __attribute__((ext_vector_type(3)));
+/**
+ * Vector version of the basic double type. Provides four double fields packed
+ * into a single 256 bit field with 256 bit alignment.
+ */
+typedef double double4 __attribute__((ext_vector_type(4)));
+
+/**
+ * Vector version of the basic uchar type. Provides two uchar fields packed
+ * into a single 16 bit field with 16 bit alignment.
+ */
+typedef uchar uchar2 __attribute__((ext_vector_type(2)));
+/**
+ * Vector version of the basic uchar type. Provides three uchar fields packed
+ * into a single 32 bit field with 32 bit alignment.
+ */
+typedef uchar uchar3 __attribute__((ext_vector_type(3)));
+/**
+ * Vector version of the basic uchar type. Provides four uchar fields packed
+ * into a single 32 bit field with 32 bit alignment.
+ */
+typedef uchar uchar4 __attribute__((ext_vector_type(4)));
+
+/**
+ * Vector version of the basic ushort type. Provides two ushort fields packed
+ * into a single 32 bit field with 32 bit alignment.
+ */
+typedef ushort ushort2 __attribute__((ext_vector_type(2)));
+/**
+ * Vector version of the basic ushort type. Provides three ushort fields packed
+ * into a single 64 bit field with 64 bit alignment.
+ */
+typedef ushort ushort3 __attribute__((ext_vector_type(3)));
+/**
+ * Vector version of the basic ushort type. Provides four ushort fields packed
+ * into a single 64 bit field with 64 bit alignment.
+ */
+typedef ushort ushort4 __attribute__((ext_vector_type(4)));
+
+/**
+ * Vector version of the basic uint type. Provides two uint fields packed into a
+ * single 64 bit field with 64 bit alignment.
+ */
+typedef uint uint2 __attribute__((ext_vector_type(2)));
+/**
+ * Vector version of the basic uint type. Provides three uint fields packed into
+ * a single 128 bit field with 128 bit alignment.
+ */
+typedef uint uint3 __attribute__((ext_vector_type(3)));
+/**
+ * Vector version of the basic uint type. Provides four uint fields packed into
+ * a single 128 bit field with 128 bit alignment.
+ */
+typedef uint uint4 __attribute__((ext_vector_type(4)));
+
+/**
+ * Vector version of the basic ulong type. Provides two ulong fields packed into
+ * a single 128 bit field with 128 bit alignment.
+ */
+typedef ulong ulong2 __attribute__((ext_vector_type(2)));
+/**
+ * Vector version of the basic ulong type. Provides three ulong fields packed
+ * into a single 256 bit field with 256 bit alignment.
+ */
+typedef ulong ulong3 __attribute__((ext_vector_type(3)));
+/**
+ * Vector version of the basic ulong type. Provides four ulong fields packed
+ * into a single 256 bit field with 256 bit alignment.
+ */
+typedef ulong ulong4 __attribute__((ext_vector_type(4)));
+
+/**
+ * Vector version of the basic char type. Provides two char fields packed into a
+ * single 16 bit field with 16 bit alignment.
+ */
+typedef char char2 __attribute__((ext_vector_type(2)));
+/**
+ * Vector version of the basic char type. Provides three char fields packed into
+ * a single 32 bit field with 32 bit alignment.
+ */
+typedef char char3 __attribute__((ext_vector_type(3)));
+/**
+ * Vector version of the basic char type. Provides four char fields packed into
+ * a single 32 bit field with 32 bit alignment.
+ */
+typedef char char4 __attribute__((ext_vector_type(4)));
+
+/**
+ * Vector version of the basic short type. Provides two short fields packed into
+ * a single 32 bit field with 32 bit alignment.
+ */
+typedef short short2 __attribute__((ext_vector_type(2)));
+/**
+ * Vector version of the basic short type. Provides three short fields packed
+ * into a single 64 bit field with 64 bit alignment.
+ */
+typedef short short3 __attribute__((ext_vector_type(3)));
+/**
+ * Vector version of the basic short type. Provides four short fields packed
+ * into a single 64 bit field with 64 bit alignment.
+ */
+typedef short short4 __attribute__((ext_vector_type(4)));
+
+/**
+ * Vector version of the basic int type. Provides two int fields packed into a
+ * single 64 bit field with 64 bit alignment.
+ */
+typedef int int2 __attribute__((ext_vector_type(2)));
+/**
+ * Vector version of the basic int type. Provides three int fields packed into a
+ * single 128 bit field with 128 bit alignment.
+ */
+typedef int int3 __attribute__((ext_vector_type(3)));
+/**
+ * Vector version of the basic int type. Provides two four fields packed into a
+ * single 128 bit field with 128 bit alignment.
+ */
+typedef int int4 __attribute__((ext_vector_type(4)));
+
+/**
+ * Vector version of the basic long type. Provides two long fields packed into a
+ * single 128 bit field with 128 bit alignment.
+ */
+typedef long long2 __attribute__((ext_vector_type(2)));
+/**
+ * Vector version of the basic long type. Provides three long fields packed into
+ * a single 256 bit field with 256 bit alignment.
+ */
+typedef long long3 __attribute__((ext_vector_type(3)));
+/**
+ * Vector version of the basic long type. Provides four long fields packed into
+ * a single 256 bit field with 256 bit alignment.
+ */
+typedef long long4 __attribute__((ext_vector_type(4)));
+
+/**
+ * \brief 4x4 float matrix
+ *
+ * Native holder for RS matrix. Elements are stored in the array at the
+ * location [row*4 + col]
+ */
+typedef struct {
+ float m[16];
+} rs_matrix4x4;
+/**
+ * \brief 3x3 float matrix
+ *
+ * Native holder for RS matrix. Elements are stored in the array at the
+ * location [row*3 + col]
+ */
+typedef struct {
+ float m[9];
+} rs_matrix3x3;
+/**
+ * \brief 2x2 float matrix
+ *
+ * Native holder for RS matrix. Elements are stored in the array at the
+ * location [row*2 + col]
+ */
+typedef struct {
+ float m[4];
+} rs_matrix2x2;
+
+/**
+ * quaternion type for use with the quaternion functions
+ */
+typedef float4 rs_quaternion;
+
+#define RS_PACKED __attribute__((packed, aligned(4)))
+#define NULL ((void *)0)
+
+#if (defined(RS_VERSION) && (RS_VERSION >= 14))
+
+/**
+ * \brief Enum for selecting cube map faces
+ */
+typedef enum {
+ RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X = 0,
+ RS_ALLOCATION_CUBEMAP_FACE_NEGATIVE_X = 1,
+ RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_Y = 2,
+ RS_ALLOCATION_CUBEMAP_FACE_NEGATIVE_Y = 3,
+ RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_Z = 4,
+ RS_ALLOCATION_CUBEMAP_FACE_NEGATIVE_Z = 5
+} rs_allocation_cubemap_face;
+
+/**
+ * \brief Bitfield to specify the usage types for an allocation.
+ *
+ * These values are ORed together to specify which usages or memory spaces are
+ * relevant to an allocation or an operation on an allocation.
+ */
+typedef enum {
+ RS_ALLOCATION_USAGE_SCRIPT = 0x0001,
+ RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE = 0x0002,
+ RS_ALLOCATION_USAGE_GRAPHICS_VERTEX = 0x0004,
+ RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS = 0x0008,
+ RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET = 0x0010
+} rs_allocation_usage_type;
+
+#endif //defined(RS_VERSION) && (RS_VERSION >= 14)
+
+// New API's
+#if (defined(RS_VERSION) && (RS_VERSION >= 16))
+
+/**
+ * Describes the way mesh vertex data is interpreted when rendering
+ *
+ **/
+typedef enum {
+ /**
+ * Vertex data will be rendered as a series of points
+ */
+ RS_PRIMITIVE_POINT = 0,
+ /**
+ * Vertex pairs will be rendered as lines
+ */
+ RS_PRIMITIVE_LINE = 1,
+ /**
+ * Vertex data will be rendered as a connected line strip
+ */
+ RS_PRIMITIVE_LINE_STRIP = 2,
+ /**
+ * Vertices will be rendered as individual triangles
+ */
+ RS_PRIMITIVE_TRIANGLE = 3,
+ /**
+ * Vertices will be rendered as a connected triangle strip
+ * defined by the first three vertices with each additional
+ * triangle defined by a new vertex
+ */
+ RS_PRIMITIVE_TRIANGLE_STRIP = 4,
+ /**
+ * Vertices will be rendered as a sequence of triangles that all
+ * share first vertex as the origin
+ */
+ RS_PRIMITIVE_TRIANGLE_FAN = 5,
+
+ /**
+ * Invalid primitive
+ */
+ RS_PRIMITIVE_INVALID = 100,
+} rs_primitive;
+
+/**
+ * \brief Enumeration for possible element data types
+ *
+ * DataType represents the basic type information for a basic element. The
+ * naming convention follows. For numeric types it is FLOAT,
+ * SIGNED, or UNSIGNED followed by the _BITS where BITS is the
+ * size of the data. BOOLEAN is a true / false (1,0)
+ * represented in an 8 bit container. The UNSIGNED variants
+ * with multiple bit definitions are for packed graphical data
+ * formats and represent vectors with per vector member sizes
+ * which are treated as a single unit for packing and alignment
+ * purposes.
+ *
+ * MATRIX the three matrix types contain FLOAT_32 elements and are treated
+ * as 32 bits for alignment purposes.
+ *
+ * RS_* objects. 32 bit opaque handles.
+ */
+typedef enum {
+ RS_TYPE_NONE = 0,
+ RS_TYPE_FLOAT_32 = 2,
+ RS_TYPE_FLOAT_64 = 3,
+ RS_TYPE_SIGNED_8 = 4,
+ RS_TYPE_SIGNED_16 = 5,
+ RS_TYPE_SIGNED_32 = 6,
+ RS_TYPE_SIGNED_64 = 7,
+ RS_TYPE_UNSIGNED_8 = 8,
+ RS_TYPE_UNSIGNED_16 = 9,
+ RS_TYPE_UNSIGNED_32 = 10,
+ RS_TYPE_UNSIGNED_64 = 11,
+
+ RS_TYPE_BOOLEAN = 12,
+
+ RS_TYPE_UNSIGNED_5_6_5 = 13,
+ RS_TYPE_UNSIGNED_5_5_5_1 = 14,
+ RS_TYPE_UNSIGNED_4_4_4_4 = 15,
+
+ RS_TYPE_MATRIX_4X4 = 16,
+ RS_TYPE_MATRIX_3X3 = 17,
+ RS_TYPE_MATRIX_2X2 = 18,
+
+ RS_TYPE_ELEMENT = 1000,
+ RS_TYPE_TYPE = 1001,
+ RS_TYPE_ALLOCATION = 1002,
+ RS_TYPE_SAMPLER = 1003,
+ RS_TYPE_SCRIPT = 1004,
+ RS_TYPE_MESH = 1005,
+ RS_TYPE_PROGRAM_FRAGMENT = 1006,
+ RS_TYPE_PROGRAM_VERTEX = 1007,
+ RS_TYPE_PROGRAM_RASTER = 1008,
+ RS_TYPE_PROGRAM_STORE = 1009,
+ RS_TYPE_FONT = 1010,
+
+ RS_TYPE_INVALID = 10000,
+} rs_data_type;
+
+/**
+ * \brief Enumeration for possible element data kind
+ *
+ * The special interpretation of the data if required. This is primarly
+ * useful for graphical data. USER indicates no special interpretation is
+ * expected. PIXEL is used in conjunction with the standard data types for
+ * representing texture formats.
+ */
+typedef enum {
+ RS_KIND_USER = 0,
+
+ RS_KIND_PIXEL_L = 7,
+ RS_KIND_PIXEL_A = 8,
+ RS_KIND_PIXEL_LA = 9,
+ RS_KIND_PIXEL_RGB = 10,
+ RS_KIND_PIXEL_RGBA = 11,
+ RS_KIND_PIXEL_DEPTH = 12,
+ RS_KIND_PIXEL_YUV = 13,
+
+ RS_KIND_INVALID = 100,
+} rs_data_kind;
+
+typedef enum {
+ /**
+ * Always drawn
+ */
+ RS_DEPTH_FUNC_ALWAYS = 0,
+ /**
+ * Drawn if the incoming depth value is less than that in the
+ * depth buffer
+ */
+ RS_DEPTH_FUNC_LESS = 1,
+ /**
+ * Drawn if the incoming depth value is less or equal to that in
+ * the depth buffer
+ */
+ RS_DEPTH_FUNC_LEQUAL = 2,
+ /**
+ * Drawn if the incoming depth value is greater than that in the
+ * depth buffer
+ */
+ RS_DEPTH_FUNC_GREATER = 3,
+ /**
+ * Drawn if the incoming depth value is greater or equal to that
+ * in the depth buffer
+ */
+ RS_DEPTH_FUNC_GEQUAL = 4,
+ /**
+ * Drawn if the incoming depth value is equal to that in the
+ * depth buffer
+ */
+ RS_DEPTH_FUNC_EQUAL = 5,
+ /**
+ * Drawn if the incoming depth value is not equal to that in the
+ * depth buffer
+ */
+ RS_DEPTH_FUNC_NOTEQUAL = 6,
+ /**
+ * Invalid depth function
+ */
+ RS_DEPTH_FUNC_INVALID = 100,
+} rs_depth_func;
+
+typedef enum {
+ RS_BLEND_SRC_ZERO = 0,
+ RS_BLEND_SRC_ONE = 1,
+ RS_BLEND_SRC_DST_COLOR = 2,
+ RS_BLEND_SRC_ONE_MINUS_DST_COLOR = 3,
+ RS_BLEND_SRC_SRC_ALPHA = 4,
+ RS_BLEND_SRC_ONE_MINUS_SRC_ALPHA = 5,
+ RS_BLEND_SRC_DST_ALPHA = 6,
+ RS_BLEND_SRC_ONE_MINUS_DST_ALPHA = 7,
+ RS_BLEND_SRC_SRC_ALPHA_SATURATE = 8,
+
+ RS_BLEND_SRC_INVALID = 100,
+} rs_blend_src_func;
+
+typedef enum {
+ RS_BLEND_DST_ZERO = 0,
+ RS_BLEND_DST_ONE = 1,
+ RS_BLEND_DST_SRC_COLOR = 2,
+ RS_BLEND_DST_ONE_MINUS_SRC_COLOR = 3,
+ RS_BLEND_DST_SRC_ALPHA = 4,
+ RS_BLEND_DST_ONE_MINUS_SRC_ALPHA = 5,
+ RS_BLEND_DST_DST_ALPHA = 6,
+ RS_BLEND_DST_ONE_MINUS_DST_ALPHA = 7,
+
+ RS_BLEND_DST_INVALID = 100,
+} rs_blend_dst_func;
+
+typedef enum {
+ RS_CULL_BACK = 0,
+ RS_CULL_FRONT = 1,
+ RS_CULL_NONE = 2,
+
+ RS_CULL_INVALID = 100,
+} rs_cull_mode;
+
+typedef enum {
+ RS_SAMPLER_NEAREST = 0,
+ RS_SAMPLER_LINEAR = 1,
+ RS_SAMPLER_LINEAR_MIP_LINEAR = 2,
+ RS_SAMPLER_WRAP = 3,
+ RS_SAMPLER_CLAMP = 4,
+ RS_SAMPLER_LINEAR_MIP_NEAREST = 5,
+ RS_SAMPLER_MIRRORED_REPEAT = 6,
+
+ RS_SAMPLER_INVALID = 100,
+} rs_sampler_value;
+
+#endif // (defined(RS_VERSION) && (RS_VERSION >= 16))
+
+#endif // __RS_TYPES_RSH__
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/bc/armeabi-v7a/libclcore.bc b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/bc/armeabi-v7a/libclcore.bc
new file mode 100644
index 0000000..5c53b2f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/bc/armeabi-v7a/libclcore.bc
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/bc/mips/libclcore.bc b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/bc/mips/libclcore.bc
new file mode 100644
index 0000000..5c53b2f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/bc/mips/libclcore.bc
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/intermediates/armeabi-v7a/libc.so b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/intermediates/armeabi-v7a/libc.so
new file mode 100644
index 0000000..e832f6f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/intermediates/armeabi-v7a/libc.so
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/intermediates/armeabi-v7a/libcompiler_rt.a b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/intermediates/armeabi-v7a/libcompiler_rt.a
new file mode 100644
index 0000000..8913a9f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/intermediates/armeabi-v7a/libcompiler_rt.a
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/intermediates/armeabi-v7a/libm.so b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/intermediates/armeabi-v7a/libm.so
new file mode 100644
index 0000000..c777400
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/intermediates/armeabi-v7a/libm.so
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/intermediates/mips/libc.so b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/intermediates/mips/libc.so
new file mode 100644
index 0000000..74a6a25
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/intermediates/mips/libc.so
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/intermediates/mips/libcompiler_rt.a b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/intermediates/mips/libcompiler_rt.a
new file mode 100644
index 0000000..81f81f2
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/intermediates/mips/libcompiler_rt.a
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/intermediates/mips/libm.so b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/intermediates/mips/libm.so
new file mode 100644
index 0000000..e8ce741
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/intermediates/mips/libm.so
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/packaged/armeabi-v7a/libRSSupport.so b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/packaged/armeabi-v7a/libRSSupport.so
new file mode 100644
index 0000000..5b303bc
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/packaged/armeabi-v7a/libRSSupport.so
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/packaged/armeabi-v7a/librsjni.so b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/packaged/armeabi-v7a/librsjni.so
new file mode 100644
index 0000000..0d4c150
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/packaged/armeabi-v7a/librsjni.so
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/packaged/mips/libRSSupport.so b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/packaged/mips/libRSSupport.so
new file mode 100644
index 0000000..b31817d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/packaged/mips/libRSSupport.so
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/packaged/mips/librsjni.so b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/packaged/mips/librsjni.so
new file mode 100644
index 0000000..9875a8b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/packaged/mips/librsjni.so
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/renderscript-v8.jar b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/renderscript-v8.jar
new file mode 100644
index 0000000..daac526
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/renderscript/lib/renderscript-v8.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/source.properties b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/source.properties
new file mode 100644
index 0000000..859d4d4
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/source.properties
@@ -0,0 +1,7 @@
+### Android Tool: Source of this archive.
+#Thu Jul 09 05:19:19 CEST 2015
+Archive.HostOs=windows
+Pkg.License=To get started with the Android SDK, you must agree to the following terms and conditions.\n\nThis is the Android SDK License Agreement (the "License Agreement").\n\n1. Introduction\n\n1.1 The Android SDK (referred to in the License Agreement as the "SDK" and specifically including the Android system files, packaged APIs, and SDK library files and tools , if and when they are made available) is licensed to you subject to the terms of the License Agreement. The License Agreement forms a legally binding contract between you and Google in relation to your use of the SDK.\n\n1.2 "Android" means the Android software stack for devices, as made available under the Android Open Source Project, which is located at the following URL\: http\://source.android.com/, as updated from time to time.\n\n1.3 "Google" means Google Inc., a Delaware corporation with principal place of business at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States.\n\n2. Accepting the License Agreement\n\n2.1 In order to use the SDK, you must first agree to the License Agreement. You may not use the SDK if you do not accept the License Agreement.\n\n2.2 By clicking to accept and/or using the SDK, you hereby agree to the terms of the License Agreement.\n\n2.3 You may not use the SDK and may not accept the License Agreement if you are a person barred from receiving the SDK under the laws of the United States or other countries including the country in which you are resident or from which you use the SDK.\n\n2.4 If you will use the SDK internally within your company or organization you agree to be bound by the License Agreement on behalf of your employer or other entity, and you represent and warrant that you have full legal authority to bind your employer or such entity to the License Agreement. If you do not have the requisite authority, you may not accept the License Agreement or use the SDK on behalf of your employer or other entity.\n\n3. SDK License from Google\n\n3.1 Subject to the terms of the License Agreement, Google grants you a royalty-free, non-assignable, non-exclusive, non-sublicensable, limited, revocable license to use the SDK, personally or internally within your company or organization, solely to develop and distribute applications to run on the Android platform.\n\n3.2 You agree that Google or third parties own all legal right, title and interest in and to the SDK, including any Intellectual Property Rights that subsist in the SDK. "Intellectual Property Rights" means any and all rights under patent law, copyright law, trade secret law, trademark law, and any and all other proprietary rights. Google reserves all rights not expressly granted to you.\n\n3.3 You may not use the SDK for any purpose not expressly permitted by the License Agreement. Except to the extent required by applicable third party licenses, you may not\: (a) copy (except for backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create derivative works of the SDK or any part of the SDK; or (b) load any part of the SDK onto a mobile handset or any other hardware device except a personal computer, combine any part of the SDK with other software, or distribute any software or device incorporating a part of the SDK.\n\n3.4 You agree that you will not take any actions that may cause or result in the fragmentation of Android, including but not limited to distributing, participating in the creation of, or promoting in any way a software development kit derived from the SDK.\n\n3.5 Use, reproduction and distribution of components of the SDK licensed under an open source software license are governed solely by the terms of that open source software license and not the License Agreement. You agree to remain a licensee in good standing in regard to such open source software licenses under all the rights granted and to refrain from any actions that may terminate, suspend, or breach such rights.\n\n3.6 You agree that the form and nature of the SDK that Google provides may change without prior notice to you and that future versions of the SDK may be incompatible with applications developed on previous versions of the SDK. You agree that Google may stop (permanently or temporarily) providing the SDK (or any features within the SDK) to you or to users generally at Google's sole discretion, without prior notice to you.\n\n3.7 Nothing in the License Agreement gives you a right to use any of Google's trade names, trademarks, service marks, logos, domain names, or other distinctive brand features.\n\n3.8 You agree that you will not remove, obscure, or alter any proprietary rights notices (including copyright and trademark notices) that may be affixed to or contained within the SDK.\n\n4. Use of the SDK by You\n\n4.1 Google agrees that nothing in the License Agreement gives Google any right, title or interest from you (or your licensors) under the License Agreement in or to any software applications that you develop using the SDK, including any intellectual property rights that subsist in those applications.\n\n4.2 You agree to use the SDK and write applications only for purposes that are permitted by (a) the License Agreement, and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding the export of data or software to and from the United States or other relevant countries).\n\n4.3 You agree that if you use the SDK to develop applications, you will protect the privacy and legal rights of users. If users provide you with user names, passwords, or other login information or personal information, you must make the users aware that the information will be available to your application, and you must provide legally adequate privacy notice and protection for those users. If your application stores personal or sensitive information provided by users, it must do so securely. If users provide you with Google Account information, your application may only use that information to access the user's Google Account when, and for the limited purposes for which, each user has given you permission to do so.\n\n4.4 You agree that you will not engage in any activity with the SDK, including the development or distribution of an application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the servers, networks, or other properties or services of Google or any third party.\n\n4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any data, content, or resources that you create, transmit or display through Android and/or applications for Android, and for the consequences of your actions (including any loss or damage which Google may suffer) by doing so.\n\n4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any breach of your obligations under the License Agreement, any applicable third party contract or Terms of Service, or any applicable law or regulation, and for the consequences (including any loss or damage which Google or any third party may suffer) of any such breach.\n\n5. Your Developer Credentials\n\n5.1 You agree that you are responsible for maintaining the confidentiality of any developer credentials that may be issued to you by Google or which you may choose yourself and that you will be solely responsible for all applications that are developed under your developer credentials.\n\n6. Privacy and Information\n\n6.1 In order to continually innovate and improve the SDK, Google may collect certain usage statistics from the software including but not limited to a unique identifier, associated IP address, version number of the software, and information on which tools and/or services in the SDK are being used and how they are being used. Before any of this information is collected, the SDK will notify you and seek your consent. If you withhold consent, the information will not be collected.\n\n6.2 The data collected is examined in the aggregate to improve the SDK and is maintained in accordance with Google's Privacy Policy located at http\://www.google.com/policies/privacy/.\n\n7. Third Party Applications\n\n7.1 If you use the SDK to run applications developed by a third party or that access data, content or resources provided by a third party, you agree that Google is not responsible for those applications, data, content, or resources. You understand that all data, content or resources which you may access through such third party applications are the sole responsibility of the person from which they originated and that Google is not liable for any loss or damage that you may experience as a result of the use or access of any of those third party applications, data, content, or resources.\n\n7.2 You should be aware the data, content, and resources presented to you through such a third party application may be protected by intellectual property rights which are owned by the providers (or by other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute or create derivative works based on these data, content, or resources (either in whole or in part) unless you have been specifically given permission to do so by the relevant owners.\n\n7.3 You acknowledge that your use of such third party applications, data, content, or resources may be subject to separate terms between you and the relevant third party.\n\n8. Using Google APIs\n\n8.1 Google APIs\n\n8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be protected by intellectual property rights which are owned by Google or those parties that provide the data (or by other persons or companies on their behalf). Your use of any such API may be subject to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create derivative works based on this data (either in whole or in part) unless allowed by the relevant Terms of Service.\n\n8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you shall retrieve data only with the user's explicit consent and only when, and for the limited purposes for which, the user has given you permission to do so.\n\n9. Terminating the License Agreement\n\n9.1 The License Agreement will continue to apply until terminated by either you or Google as set out below.\n\n9.2 If you want to terminate the License Agreement, you may do so by ceasing your use of the SDK and any relevant developer credentials.\n\n9.3 Google may at any time, terminate the License Agreement, with or without cause, upon notice to you.\n\n9.4 The License Agreement will automatically terminate without notice or other action when Google ceases to provide the SDK or certain parts of the SDK to users in the country in which you are resident or from which you use the service.\n\n9.5 When the License Agreement is terminated, the license granted to you in the License Agreement will terminate, you will immediately cease all use of the SDK, and the provisions of paragraphs 10, 11, 12 and 14 shall survive indefinitely.\n\n10. DISCLAIMERS\n\n10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SDK IS AT YOUR SOLE RISK AND THAT THE SDK IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE.\n\n10.2 YOUR USE OF THE SDK AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE SDK IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. WITHOUT LIMITING THE FOREGOING, YOU UNDERSTAND THAT THE SDK MAY CONTAIN ERRORS, DEFECTS AND SECURITY VULNERABILITIES THAT CAN RESULT IN SIGNIFICANT DAMAGE, INCLUDING THE COMPLETE, IRRECOVERABLE LOSS OF USE OF YOUR COMPUTER SYSTEM OR OTHER DEVICE.\n\n10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.\n\n11. LIMITATION OF LIABILITY\n\n11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING.\n\n12. Indemnification\n\n12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless Google, its affiliates and their respective directors, officers, employees and agents from and against any and all claims, actions, suits or proceedings, as well as any and all losses, liabilities, damages, costs and expenses (including reasonable attorneys\u2019 fees) arising out of or accruing from (a) your use of the SDK, (b) any application you develop on the SDK that infringes any Intellectual Property Rights of any person or defames any person or violates their rights of publicity or privacy, and (c) any non-compliance by you of the License Agreement.\n\n13. Changes to the License Agreement\n\n13.1 Google may make changes to the License Agreement as it distributes new versions of the SDK. When these changes are made, Google will make a new version of the License Agreement available on the website where the SDK is made available.\n\n14. General Legal Terms\n\n14.1 The License Agreement constitutes the whole legal agreement between you and Google and governs your use of the SDK (excluding any services which Google may provide to you under a separate written agreement), and completely replaces any prior agreements between you and Google in relation to the SDK.\n\n14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is contained in the License Agreement (or which Google has the benefit of under any applicable law), this will not be taken to be a formal waiver of Google's rights and that those rights or remedies will still be available to Google.\n\n14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of the License Agreement is invalid, then that provision will be removed from the License Agreement without affecting the rest of the License Agreement. The remaining provisions of the License Agreement will continue to be valid and enforceable.\n\n14.4 You acknowledge and agree that each member of the group of companies of which Google is the parent shall be third party beneficiaries to the License Agreement and that such other companies shall be entitled to directly enforce, and rely upon, any provision of the License Agreement that confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall be third party beneficiaries to the License Agreement.\n\n14.5 EXPORT RESTRICTIONS. THE SDK IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE SDK. THESE LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE.\n\n14.6 The License Agreement may not be assigned or transferred by you without the prior written approval of Google, and any attempted assignment without such approval will be void. You shall not delegate your responsibilities or obligations under the License Agreement without the prior written approval of Google.\n\n14.7 The License Agreement, and your relationship with Google under the License Agreement, shall be governed by the laws of the State of California without regard to its conflict of laws provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located within the county of Santa Clara, California to resolve any legal matter arising from the License Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction.\n\nJune 2014.\n
+Pkg.LicenseRef=android-sdk-license
+Pkg.Revision=19.1
+Pkg.SourceUrl=https\://dl.google.com/android/repository/repository-11.xml
diff --git a/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/zipalign.exe b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/zipalign.exe
new file mode 100644
index 0000000..c7d2e88
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/build-tools/19.1.0/zipalign.exe
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/platform-tools/AdbWinApi.dll b/love2dToAPK/tools/tools/android-win/platform-tools/AdbWinApi.dll
new file mode 100644
index 0000000..b5586eb
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/platform-tools/AdbWinApi.dll
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/platform-tools/AdbWinUsbApi.dll b/love2dToAPK/tools/tools/android-win/platform-tools/AdbWinUsbApi.dll
new file mode 100644
index 0000000..0c9e00b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/platform-tools/AdbWinUsbApi.dll
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/platform-tools/NOTICE.txt b/love2dToAPK/tools/tools/android-win/platform-tools/NOTICE.txt
new file mode 100644
index 0000000..afe2446
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/platform-tools/NOTICE.txt
@@ -0,0 +1,15551 @@
+Notices for files contained in the tools directory:
+============================================================
+Notices for file(s):
+/usr/icu/icudt53l.dat
+------------------------------------------------------------
+ICU License - ICU 1.8.1 and later
+
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright (c) 1995-2008 International Business Machines Corporation and others
+
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, provided that the above copyright notice(s) and this permission notice appear in all copies of the Software and that both the above copyright notice(s) and this permission notice appear in supporting documentation.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization of the copyright holder.
+
+All trademarks and registered trademarks mentioned herein are the property of their respective owners.
+
+==============================================================================
+
+UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE
+
+ Unicode Data Files include all data files under the directories
+http://www.unicode.org/Public/, http://www.unicode.org/reports/, and
+http://www.unicode.org/cldr/data/ . Unicode Software includes any source code
+published in the Unicode Standard or under the directories
+http://www.unicode.org/Public/, http://www.unicode.org/reports/, and
+http://www.unicode.org/cldr/data/.
+
+ NOTICE TO USER: Carefully read the following legal agreement. BY
+DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA FILES
+("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY ACCEPT, AND
+AGREE TO BE BOUND BY, ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU
+DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES
+OR SOFTWARE.
+
+ COPYRIGHT AND PERMISSION NOTICE
+
+ Copyright © 1991-2007 Unicode, Inc. All rights reserved. Distributed under
+the Terms of Use in http://www.unicode.org/copyright.html.
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+of the Unicode data files and any associated documentation (the "Data Files") or
+Unicode software and any associated documentation (the "Software") to deal in
+the Data Files or Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, and/or sell copies of
+the Data Files or Software, and to permit persons to whom the Data Files or
+Software are furnished to do so, provided that (a) the above copyright notice(s)
+and this permission notice appear with all copies of the Data Files or Software,
+(b) both the above copyright notice(s) and this permission notice appear in
+associated documentation, and (c) there is clear notice in each modified Data
+File or in the Software as well as in the documentation associated with the Data
+File(s) or Software that the data or software has been modified.
+
+ THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD
+PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
+NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
+DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR
+SOFTWARE.
+
+ Except as contained in this notice, the name of a copyright holder shall not
+be used in advertising or otherwise to promote the sale, use or other dealings
+in these Data Files or Software without prior written authorization of the
+copyright holder.
+
+===============================================================================
+
+
+/* This ICU code derived from: */
+/*
+punycode.c 0.4.0 (2001-Nov-17-Sat)
+http://www.cs.berkeley.edu/~amc/idn/
+Adam M. Costello
+http://www.nicemice.net/amc/
+
+Disclaimer and license
+
+Regarding this entire document or any portion of it (including
+the pseudocode and C code), the author makes no guarantees and
+is not responsible for any damage resulting from its use. The
+author grants irrevocable permission to anyone to use, modify,
+and distribute it in any way that does not diminish the rights
+of anyone else to use, modify, and distribute it, provided that
+redistributed derivative works do not contain misleading author or
+version information. Derivative works need not be licensed under
+similar terms.
+*/
+
+
+/*
+** This file is in the public domain, so clarified as of
+** 2006-07-17 by Arthur David Olson.
+*/
+
+============================================================
+Notices for file(s):
+/bin/make_ext4fs
+/bin/mkuserimg.sh
+/lib/libext4_utils_host.a
+/lib/libf2fs_dlutils_host.a
+/lib/libf2fs_ioutils_host.a
+/lib/libf2fs_utils_host.a
+------------------------------------------------------------
+
+ Copyright (c) 2010, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+
+============================================================
+Notices for file(s):
+/lib/libsqlite_jni.so
+------------------------------------------------------------
+This software is copyrighted by Christian Werner <chw@ch-werner.de>
+and others. The following terms apply to all files associated with the
+software unless explicitly disclaimed in individual files.
+
+The authors hereby grant permission to use, copy, modify, distribute,
+and license this software and its documentation for any purpose, provided
+that existing copyright notices are retained in all copies and that this
+notice is included verbatim in any distributions. No written agreement,
+license, or royalty fee is required for any of the authorized uses.
+Modifications to this software may be copyrighted by their authors
+and need not follow the licensing terms described here, provided that
+the new terms are clearly indicated on the first page of each file where
+they apply.
+
+IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
+FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
+DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE
+IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
+NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
+MODIFICATIONS.
+
+============================================================
+Notices for file(s):
+/lib/libgccdemangle.a
+------------------------------------------------------------
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
+============================================================
+Notices for file(s):
+/bin/aapt
+/bin/aidl
+/bin/dexdump
+/bin/dx
+/bin/jasmin
+/framework/jasmin.jar
+/lib/libaapt.a
+/lib/libandroidfw.a
+/lib/libcutils.a
+/lib/libnativehelper.so
+/lib/libsqlite3_android.a
+/lib/libutils.a
+/lib/libzipfile.a
+/lib64/libcutils.a
+/lib64/libnativehelper.so
+/lib64/libutils.a
+/lib64/libzipfile.a
+------------------------------------------------------------
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+
+============================================================
+Notices for file(s):
+/framework/commons-compress-1.0.jar
+------------------------------------------------------------
+Apache Commons Compress
+Copyright 2002-2009 The Apache Software Foundation
+
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org/).
+
+Original BZip2 classes contributed by Keiron Liddle
+<keiron@aftexsw.com>, Aftex Software to the Apache Ant project
+
+Original Tar classes from contributors of the Apache Ant project
+
+Original Zip classes from contributors of the Apache Ant project
+
+Original CPIO classes contributed by Markus Kuss and the jRPM project
+(jrpm.sourceforge.net)
+
+============================================================
+Notices for file(s):
+/lib/libbcc.so
+------------------------------------------------------------
+==========================
+NOTICE file for libbcc.git
+==========================
+
+* NOTICE for lib/ExecutionEngine/, lib/ScriptCRT/, include and helper/.
+
+ Copyright (c) 2005-2011, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+
+
+* NOTICE for runtime/ and lib/CodeGen/.
+ Note: The NOTICE is the same for another git project, external/llvm.git.
+
+==============================================================================
+LLVM Release License
+==============================================================================
+University of Illinois/NCSA
+Open Source License
+
+Copyright (c) 2003-2011 University of Illinois at Urbana-Champaign.
+All rights reserved.
+
+Developed by:
+
+ LLVM Team
+
+ University of Illinois at Urbana-Champaign
+
+ http://llvm.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal with
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimers.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimers in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the names of the LLVM Team, University of Illinois at
+ Urbana-Champaign, nor the names of its contributors may be used to
+ endorse or promote products derived from this Software without specific
+ prior written permission.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
+SOFTWARE.
+
+==============================================================================
+Copyrights and Licenses for Third Party Software Distributed with LLVM:
+==============================================================================
+The LLVM software contains code written by third parties. Such software will
+have its own individual LICENSE.TXT file in the directory in which it appears.
+This file will describe the copyrights, license, and restrictions which apply
+to that code.
+
+The disclaimer of warranty in the University of Illinois Open Source License
+applies to all code in the LLVM Distribution, and nothing in any of the
+other licenses gives permission to use the names of the LLVM Team or the
+University of Illinois to endorse or promote products derived from this
+Software.
+
+The following pieces of software have additional or alternate copyrights,
+licenses, and/or restrictions:
+
+Program Directory
+------- ---------
+Autoconf llvm/autoconf
+ llvm/projects/ModuleMaker/autoconf
+ llvm/projects/sample/autoconf
+CellSPU backend llvm/lib/Target/CellSPU/README.txt
+Google Test llvm/utils/unittest/googletest
+OpenBSD regex llvm/lib/Support/{reg*, COPYRIGHT.regex}
+
+
+
+* NOTICE for tests/disassem.cpp and tests/disassem.h.
+
+/* $NetBSD: disassem.c,v 1.14 2003/03/27 16:58:36 mycroft Exp $ */
+
+/*-
+ * Copyright (c) 1996 Mark Brinicombe.
+ * Copyright (c) 1996 Brini.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Brini.
+ * 4. The name of the company nor the name of the author may be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BRINI ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL BRINI OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * RiscBSD kernel project
+ *
+ * db_disasm.c
+ *
+ * Kernel disassembler
+ *
+ * Created : 10/02/96
+ *
+ * Structured after the sparc/sparc/db_disasm.c by David S. Miller &
+ * Paul Kranenburg
+ *
+ * This code is not complete. Not all instructions are disassembled.
+ */
+
+============================================================
+Notices for file(s):
+/lib/libjavacore.so
+/lib64/libjavacore.so
+------------------------------------------------------------
+ =========================================================================
+ == NOTICE file corresponding to the section 4 d of ==
+ == the Apache License, Version 2.0, ==
+ == in this case for the Android-specific code. ==
+ =========================================================================
+
+Android Code
+Copyright 2005-2008 The Android Open Source Project
+
+This product includes software developed as part of
+The Android Open Source Project (http://source.android.com).
+
+ =========================================================================
+ == NOTICE file corresponding to the section 4 d of ==
+ == the Apache License, Version 2.0, ==
+ == in this case for the Apache Harmony distribution. ==
+ =========================================================================
+
+Apache Harmony
+Copyright 2006 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+Portions of Harmony were originally developed by
+Intel Corporation and are licensed to the Apache Software
+Foundation under the "Software Grant and Corporate Contribution
+License Agreement", informally known as the "Intel Harmony CLA".
+
+
+ =========================================================================
+ == NOTICE file for the ICU License. ==
+ =========================================================================
+
+Copyright (c) 1995-2014 International Business Machines Corporation and others
+
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, and/or sell copies of the Software, and to permit persons
+to whom the Software is furnished to do so, provided that the above
+copyright notice(s) and this permission notice appear in all copies of
+the Software and that both the above copyright notice(s) and this
+permission notice appear in supporting documentation.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY
+SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale, use
+or other dealings in this Software without prior written authorization
+of the copyright holder.
+
+All trademarks and registered trademarks mentioned herein are the
+property of their respective owners.
+
+
+ =========================================================================
+ == NOTICE file for the KXML License. ==
+ =========================================================================
+
+Copyright (c) 2002,2003, Stefan Haustein, Oberhausen, Rhld., Germany
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+ =========================================================================
+ == NOTICE file for the W3C License. ==
+ =========================================================================
+
+Copyright (c) 2000 World Wide Web Consortium, (Massachusetts Institute
+of Technology, Institut National de Recherche en Informatique et en
+Automatique, Keio University). All Rights Reserved. This program is
+distributed under the W3C's Software Intellectual Property License.
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+See W3C License http://www.w3.org/Consortium/Legal/ for more details.
+
+============================================================
+Notices for file(s):
+/lib/libfdlibm.a
+/lib64/libfdlibm.a
+------------------------------------------------------------
+Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+
+Developed at SunSoft, a Sun Microsystems, Inc. business.
+Permission to use, copy, modify, and distribute this
+software is freely granted, provided that this notice
+is preserved.
+
+============================================================
+Notices for file(s):
+/framework/guavalib.jar
+------------------------------------------------------------
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
+
+============================================================
+Notices for file(s):
+/lib/third_party_icu_icudata_arm_host_gyp.a
+/lib/third_party_icu_icui18n_arm_host_gyp.a
+/lib/third_party_icu_icuuc_arm_host_gyp.a
+/lib/third_party_protobuf_protobuf_full_do_not_use_arm_host_gyp.a
+/lib/v8_tools_gyp_v8_base_arm_host_gyp.a
+/lib/v8_tools_gyp_v8_libbase_arm_host_gyp.a
+/lib/v8_tools_gyp_v8_libplatform_arm_host_gyp.a
+/lib/v8_tools_gyp_v8_nosnapshot_arm_host_gyp.a
+/obj/GYP/shared_intermediates/libvpx_obj_int_extract
+/obj/GYP/shared_intermediates/mksnapshot
+/obj/GYP/shared_intermediates/protoc
+------------------------------------------------------------
+// Copyright 2014 The Chromium Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+/****************************************************************
+ *
+ * The author of this software is David M. Gay.
+ *
+ * Copyright (c) 1991, 2000, 2001 by Lucent Technologies.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose without fee is hereby granted, provided that this entire notice
+ * is included in all copies of any software which is or includes a copy
+ * or modification of this software and in all copies of the supporting
+ * documentation for such software.
+ *
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY
+ * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
+ *
+ ***************************************************************/
+
+/* Copyright (c) 2008-2009, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ---
+ * Author: Kostya Serebryany
+ */
+
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (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.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is the Netscape Portable Runtime (NSPR).
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 1998-2000
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+Paul Hsieh OLD BSD license
+
+Copyright (c) 2010, Paul Hsieh
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above copyright notice, this
+ list of conditions and the following disclaimer in the documentation and/or
+ other materials provided with the distribution.
+* Neither my name, Paul Hsieh, nor the names of any other contributors to the
+ code use may not be used to endorse or promote products derived from this
+ software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Copyright (c) 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ Notice that the following BSD-style license applies to the Valgrind header
+ files used by Chromium (valgrind.h and memcheck.h). However, the rest of
+ Valgrind is licensed under the terms of the GNU General Public License,
+ version 2, unless otherwise indicated.
+
+ ----------------------------------------------------------------
+
+ Copyright (C) 2000-2008 Julian Seward. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. The origin of this software must not be misrepresented; you must
+ not claim that you wrote the original software. If you use this
+ software in a product, an acknowledgment in the product
+ documentation would be appreciated but is not required.
+
+ 3. Altered source versions must be plainly marked as such, and must
+ not be misrepresented as being the original software.
+
+ 4. The name of the author may not be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ Copyright (c) 2007 Red Hat, inc
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation files
+ (the "Software"), to deal in the Software without restriction,
+ including without limitation the rights to use, copy, modify, merge,
+ publish, distribute, sublicense, and/or sell copies of the Software,
+ and to permit persons to whom the Software is furnished to do so,
+ subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+
+Copyright 2003-2005 Colin Percival
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted providing that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2007-2009 Google Inc.
+ Copyright 2007-2009 WebDriver committers
+
+ 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.
+
+
+// Copyright 2013 Google Inc.
+//
+// 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.
+
+Copyright (C) 2009 by Tung Mac.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (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.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is the Netscape security libraries.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2000
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (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.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is the Netscape security libraries.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 1994-2000
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+Name: fancy_urllib
+URL: http://googleappengine.googlecode.com/svn/trunk/python/lib/fancy_urllib
+License: Apache 2.0
+License File: README.chromium
+Security Critical: no
+
+The fancy_urllib library was obtained from
+http://googleappengine.googlecode.com/svn/trunk/python/lib/fancy_urllib/fancy_urllib/__init__.py
+under the following license (http://googleappengine.googlecode.com/svn/trunk/python/LICENSE):
+
+GOOGLE APP ENGINE SDK
+=====================
+Copyright 2008 Google Inc.
+All rights reserved.
+
+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.
+
+ README for newlib-2.0.0 release
+ (mostly cribbed from the README in the gdb-4.13 release)
+
+This is `newlib', a simple ANSI C library, math library, and collection
+of board support packages.
+
+The newlib and libgloss subdirectories are a collection of software from
+several sources, each wi6h their own copyright and license. See the file
+COPYING.NEWLIB for details. The rest of the release tree is under either
+the GNU GPL or LGPL licenses.
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+
+Unpacking and Installation -- quick overview
+==========================
+
+When you unpack the newlib-2.0.0.tar.gz file, you'll find a directory
+called `newlib-2.0.0', which contains:
+
+COPYING config/ install-sh* mpw-configure
+COPYING.LIB config-ml.in libgloss/ mpw-install
+COPYING.NEWLIB config.guess* mkinstalldirs* newlib/
+CYGNUS config.sub* move-if-change* symlink-tree*
+ChangeLog configure* mpw-README texinfo/
+Makefile.in configure.in mpw-build.in
+README etc/ mpw-config.in
+
+To build NEWLIB, you must follow the instructions in the section entitled
+"Compiling NEWLIB".
+
+This will configure and build all the libraries and crt0 (if one exists).
+If `configure' can't determine your host system type, specify one as its
+argument, e.g., sun4 or sun4sol2. NEWLIB is most often used in cross
+environments.
+
+NOTE THAT YOU MUST HAVE ALREADY BUILT AND INSTALLED GCC and BINUTILS.
+
+
+More Documentation
+==================
+
+ Newlib documentation is available on the net via:
+ http://sourceware.org/newlib/docs.html
+
+ All the documentation for NEWLIB comes as part of the machine-readable
+distribution. The documentation is written in Texinfo format, which is
+a documentation system that uses a single source file to produce both
+on-line information and a printed manual. You can use one of the Info
+formatting commands to create the on-line version of the documentation
+and TeX (or `texi2roff') to typeset the printed version.
+
+ If you want to format these Info files yourself, you need one of the
+Info formatting programs, such as `texinfo-format-buffer' or `makeinfo'.
+
+ If you want to typeset and print copies of this manual, you need TeX,
+a program to print its DVI output files, and `texinfo.tex', the Texinfo
+definitions file.
+
+ TeX is a typesetting program; it does not print files directly, but
+produces output files called DVI files. To print a typeset document,
+you need a program to print DVI files. If your system has TeX
+installed, chances are it has such a program. The precise command to
+use depends on your system; `lpr -d' is common; another (for PostScript
+devices) is `dvips'. The DVI print command may require a file name
+without any extension or a `.dvi' extension.
+
+ TeX also requires a macro definitions file called `texinfo.tex'.
+This file tells TeX how to typeset a document written in Texinfo
+format. On its own, TeX cannot read, much less typeset a Texinfo file.
+`texinfo.tex' is distributed with NEWLIB and is located in the
+`newlib-VERSION-NUMBER/texinfo' directory.
+
+
+
+Compiling NEWLIB
+================
+
+ To compile NEWLIB, you must build it in a directory separate from
+the source directory. If you want to run NEWLIB versions for several host
+or target machines, you need a different `newlib' compiled for each combination
+of host and target. `configure' is designed to make this easy by allowing
+you to generate each configuration in a separate subdirectory.
+If your `make' program handles the `VPATH' feature correctly (like GNU `make')
+running `make' in each of these directories builds the `newlib' libraries
+specified there.
+
+ To build `newlib' in a specific directory, run `configure' with the
+`--srcdir' option to specify where to find the source. (You also need
+to specify a path to find `configure' itself from your working
+directory. If the path to `configure' would be the same as the
+argument to `--srcdir', you can leave out the `--srcdir' option; it
+will be assumed.)
+
+ For example, with version 2.0.0, you can build NEWLIB in a separate
+directory for a Sun 4 cross m68k-aout environment like this:
+
+ cd newlib-2.0.0
+ mkdir ../newlib-m68k-aout
+ cd ../newlib-m68k-aout
+ ../newlib-2.0.0/configure --host=sun4 --target=m68k-aout
+ make
+
+ When `configure' builds a configuration using a remote source
+directory, it creates a tree for the binaries with the same structure
+(and using the same names) as the tree under the source directory. In
+the example, you'd find the Sun 4 library `libiberty.a' in the
+directory `newlib-m68k-aout/libiberty', and NEWLIB itself in
+`newlib-m68k-aout/newlib'.
+
+ When you run `make' to build a program or library, you must run it
+in a configured directory--whatever directory you were in when you
+called `configure' (or one of its subdirectories).
+
+ The `Makefile' that `configure' generates in each source directory
+also runs recursively. If you type `make' in a source directory such
+as `newlib-2.0.0' (or in a separate configured directory configured with
+`--srcdir=PATH/newlib-2.0.0'), you will build all the required libraries.
+
+ When you have multiple hosts or targets configured in separate
+directories, you can run `make' on them in parallel (for example, if
+they are NFS-mounted on each of the hosts); they will not interfere
+with each other.
+
+
+Specifying names for hosts and targets
+======================================
+
+ The specifications used for hosts and targets in the `configure'
+script are based on a three-part naming scheme, but some short
+predefined aliases are also supported. The full naming scheme encodes
+three pieces of information in the following pattern:
+
+ ARCHITECTURE-VENDOR-OS
+
+ For example, you can use the alias `sun4' as a HOST argument or in a
+`--target=TARGET' option. The equivalent full name is
+`sparc-sun-sunos4'.
+
+ The `configure' script accompanying NEWLIB does not provide any query
+facility to list all supported host and target names or aliases.
+`configure' calls the Bourne shell script `config.sub' to map
+abbreviations to full names; you can read the script, if you wish, or
+you can use it to test your guesses on abbreviations--for example:
+
+ % sh config.sub sun4
+ sparc-sun-sunos4.1.1
+ % sh config.sub sun3
+ m68k-sun-sunos4.1.1
+ % sh config.sub decstation
+ mips-dec-ultrix4.2
+ % sh config.sub hp300bsd
+ m68k-hp-bsd
+ % sh config.sub i386v
+ i386-pc-sysv
+ % sh config.sub i786v
+ Invalid configuration `i786v': machine `i786v' not recognized
+
+The Build, Host and Target Concepts in newlib
+=============================================
+
+The build, host and target concepts are defined for gcc as follows:
+
+build: the platform on which gcc is built.
+host: the platform on which gcc is run.
+target: the platform for which gcc generates code.
+
+Since newlib is a library, the target concept does not apply to it, and the
+build, host, and target options given to the top-level configure script must
+be changed for newlib's use.
+
+The options are shifted according to these correspondences:
+
+gcc's build platform has no equivalent in newlib.
+gcc's host platform is newlib's build platform.
+gcc's target platform is newlib's host platform.
+and as mentioned before, newlib has no concept of target.
+
+`configure' options
+===================
+
+ Here is a summary of the `configure' options and arguments that are
+most often useful for building NEWLIB. `configure' also has several other
+options not listed here.
+
+ configure [--help]
+ [--prefix=DIR]
+ [--srcdir=PATH]
+ [--target=TARGET] HOST
+
+You may introduce options with a single `-' rather than `--' if you
+prefer; but you may abbreviate option names if you use `--'.
+
+`--help'
+ Display a quick summary of how to invoke `configure'.
+
+`--prefix=DIR'
+ Configure the source to install programs and files in directory
+ `DIR'.
+
+`--exec-prefix=DIR'
+ Configure the source to install host-dependent files in directory
+ `DIR'.
+
+`--srcdir=PATH'
+ *Warning: using this option requires GNU `make', or another `make'
+ that compatibly implements the `VPATH' feature.
+ Use this option to make configurations in directories separate
+ from the NEWLIB source directories. Among other things, you can use
+ this to build (or maintain) several configurations simultaneously,
+ in separate directories. `configure' writes configuration
+ specific files in the current directory, but arranges for them to
+ use the source in the directory PATH. `configure' will create
+ directories under the working directory in parallel to the source
+ directories below PATH.
+
+`--norecursion'
+ Configure only the directory level where `configure' is executed;
+ do not propagate configuration to subdirectories.
+
+`--target=TARGET'
+ Configure NEWLIB for running on the specified TARGET.
+
+ There is no convenient way to generate a list of all available
+ targets.
+
+`HOST ...'
+ Configure NEWLIB to be built using a cross compiler running on
+ the specified HOST.
+
+ There is no convenient way to generate a list of all available
+ hosts.
+
+To fit diverse usage models, NEWLIB supports a group of configuration
+options so that library features can be turned on/off according to
+target system's requirements.
+
+One feature can be enabled by specifying `--enable-FEATURE=yes' or
+`--enable-FEATURE'. Or it can be disable by `--enable-FEATURE=no' or
+`--disable-FEATURE'.
+
+`--enable-newlib-io-pos-args'
+ Enable printf-family positional arg support.
+ Disabled by default, but some hosts enable it in configure.host.
+
+`--enable-newlib-io-c99-formats'
+ Enable C99 support in IO functions like printf/scanf.
+ Disabled by default, but some hosts enable it in configure.host.
+
+`--enable-newlib-register-fini'
+ Enable finalization function registration using atexit.
+ Disabled by default.
+
+`--enable-newlib-io-long-long'
+ Enable long long type support in IO functions like printf/scanf.
+ Disabled by default, but many hosts enable it in configure.host.
+
+`--enable-newlib-io-long-double'
+ Enable long double type support in IO functions printf/scanf.
+ Disabled by default, but some hosts enable it in configure.host.
+
+`--enable-newlib-mb'
+ Enable multibyte support.
+ Disabled by default.
+
+`--enable-newlib-iconv-encodings'
+ Enable specific comma-separated list of bidirectional iconv
+ encodings to be built-in.
+ Disabled by default.
+
+`--enable-newlib-iconv-from-encodings'
+ Enable specific comma-separated list of \"from\" iconv encodings
+ to be built-in.
+ Disabled by default.
+
+`--enable-newlib-iconv-to-encodings'
+ Enable specific comma-separated list of \"to\" iconv encodings
+ to be built-in.
+ Disabled by default.
+
+`--enable-newlib-iconv-external-ccs'
+ Enable capabilities to load external CCS files for iconv.
+ Disabled by default.
+
+`--disable-newlib-atexit-dynamic-alloc'
+ Disable dynamic allocation of atexit entries.
+ Most hosts and targets have it enabled in configure.host.
+
+`--enable-newlib-reent-small'
+ Enable small reentrant struct support.
+ Disabled by default.
+
+`--disable-newlib-fvwrite-in-streamio'
+ NEWLIB implements the vector buffer mechanism to support stream IO
+ buffering required by C standard. This feature is possibly
+ unnecessary for embedded systems which won't change file buffering
+ with functions like `setbuf' or `setvbuf'. The buffering mechanism
+ still acts as default for STDIN/STDOUT/STDERR even if this option
+ is specified.
+ Enabled by default.
+
+`--disable-newlib-fseek-optimization'
+ Disable fseek optimization. It can decrease code size of application
+ calling `fseek`.
+ Enabled by default.
+
+`--disable-newlib-wide-orient'
+ C99 states that each stream has an orientation, wide or byte. This
+ feature is possibly unnecessary for embedded systems which only do
+ byte input/output operations on stream. It can decrease code size
+ by disable the feature.
+ Enabled by default.
+
+`--enable-newlib-nano-malloc'
+ NEWLIB has two implementations of malloc family's functions, one in
+ `mallocr.c' and the other one in `nano-mallocr.c'. This options
+ enables the nano-malloc implementation, which is for small systems
+ with very limited memory. Note that this implementation does not
+ support `--enable-malloc-debugging' any more.
+ Disabled by default.
+
+`--disable-newlib-unbuf-stream-opt'
+ NEWLIB does optimization when `fprintf to write only unbuffered unix
+ file'. It creates a temorary buffer to do the optimization that
+ increases stack consumption by about `BUFSIZ' bytes. This option
+ disables the optimization and saves size of text and stack.
+ Enabled by default.
+
+`--enable-multilib'
+ Build many library versions.
+ Enabled by default.
+
+`--enable-target-optspace'
+ Optimize for space.
+ Disabled by default.
+
+`--enable-malloc-debugging'
+ Indicate malloc debugging requested.
+ Disabled by default.
+
+`--enable-newlib-multithread'
+ Enable support for multiple threads.
+ Enabled by default.
+
+`--enable-newlib-iconv'
+ Enable iconv library support.
+ Disabled by default.
+
+`--enable-newlib-elix-level'
+ Supply desired elix library level (1-4). Please refer to HOWTO for
+ more information about this option.
+ Set to level 0 by default.
+
+`--disable-newlib-io-float'
+ Disable printf/scanf family float support.
+ Enabled by default.
+
+`--disable-newlib-supplied-syscalls'
+ Disable newlib from supplying syscalls.
+ Enabled by default.
+
+`--enable-lite-exit'
+ Enable lite exit, a size-reduced implementation of exit that doesn't
+ invoke clean-up functions such as _fini or global destructors.
+ Disabled by default.
+
+Running the Testsuite
+=====================
+
+To run newlib's testsuite, you'll need a site.exp in your home
+directory which points dejagnu to the proper baseboards directory and
+the proper exp file for your target.
+
+Before running make check-target-newlib, set the DEJAGNU environment
+variable to point to ~/site.exp.
+
+Here is a sample site.exp:
+
+# Make sure we look in the right place for the board description files.
+if ![info exists boards_dir] {
+ set boards_dir {}
+}
+lappend boards_dir "your dejagnu/baseboards here"
+
+verbose "Global Config File: target_triplet is $target_triplet" 2
+
+global target_list
+case "$target_triplet" in {
+
+ { "mips-*elf*" } {
+ set target_list "mips-sim"
+ }
+
+ default {
+ set target_list { "unix" }
+ }
+}
+
+mips-sim refers to an exp file in the baseboards directory. You'll
+need to add the other targets you're testing to the case statement.
+
+Now type make check-target-newlib in the top-level build directory to
+run the testsuite.
+
+Shared newlib
+=============
+
+newlib uses libtool when it is being compiled natively (with
+--target=i[34567]86-pc-linux-gnu) on an i[34567]86-pc-linux-gnu
+host. This allows newlib to be compiled as a shared library.
+
+To configure newlib, do the following from your build directory:
+
+$(source_dir)/src/configure --with-newlib --prefix=$(install_dir)
+
+configure will recognize that host == target ==
+i[34567]86-pc-linux-gnu, so it will tell newlib to compile itself using
+libtool. By default, libtool will build shared and static versions of
+newlib.
+
+To compile a program against shared newlib, do the following (where
+target_install_dir = $(install_dir)/i[34567]86-pc-linux-gnu):
+
+gcc -nostdlib $(target_install_dir)/lib/crt0.o progname.c -I $(target_install_dir)/include -L $(target_install_dir)/lib -lc -lm -lgcc
+
+To run the program, make sure that $(target_install_dir)/lib is listed
+in the LD_LIBRARY_PATH environment variable.
+
+To create a static binary linked against newlib, do the following:
+
+gcc -nostdlib -static $(target_install_dir)/lib/crt0.o progname.c -I $(target_install_dir)/include -L $(target_install_dir)/lib -lc -lm
+
+libtool can be instructed to produce only static libraries. To build
+newlib as a static library only, do the following from your build
+directory:
+
+$(source_dir)/src/configure --with-newlib --prefix=$(install_dir) --disable-shared
+
+Regenerating Configuration Files
+================================
+
+At times you will need to make changes to configure.in and Makefile.am files.
+This will mean that configure and Makefile.in files will need to be
+regenerated.
+
+At the top level of newlib is the file: acinclude.m4. This file contains
+the definition of the NEWLIB_CONFIGURE macro which is used by all configure.in
+files in newlib. You will notice that each directory in newlib containing
+a configure.in file also contains an aclocal.m4 file. This file is
+generated by issuing: aclocal -I${relative_path_to_toplevel_newlib_dir}
+-I${relative_path_to_toplevel_src_dir}
+The first relative directory is to access acinclude.m4. The second relative
+directory is to access libtool information in the top-level src directory.
+
+For example, to regenerate aclocal.m4 in newlib/libc/machine/arm:
+
+ aclocal -I ../../.. -I ../../../..
+
+Note that if the top level acinclude.m4 is altered, every aclocal.m4 file
+in newlib should be regenerated.
+
+If the aclocal.m4 file is regenerated due to a change in acinclude.m4 or
+if a configure.in file is modified, the corresponding configure file in the
+directory must be regenerated using autoconf. No parameters are necessary.
+In the previous example, we would issue:
+
+ autoconf
+
+from the newlib/libc/machine/arm directory.
+
+If you have regenerated a configure file or if you have modified a Makefile.am
+file, you will need to regenerate the appropriate Makefile.in file(s).
+For newlib, automake is a bit trickier. First of all, all Makefile.in
+files in newlib (and libgloss) are generated using the --cygnus option
+of automake.
+
+Makefile.in files are generated from the nearest directory up the chain
+which contains a configure.in file. In most cases, this is the same
+directory containing configure.in, but there are exceptions.
+For example, the newlib/libc directory has a number of
+subdirectories that do not contain their own configure.in files (e.g. stdio).
+For these directories, you must issue the automake command from newlib/libc
+which is the nearest parent directory that contains a configure.in.
+When you issue the automake command, you specify the subdirectory for
+the Makefile.in you are regenerating. For example:
+
+ automake --cygnus stdio/Makefile stdlib/Makefile
+
+Note how multiple Makefile.in files can be created in the same step. You
+would not specify machine/Makefile or sys/Makefile in the previous example
+because both of these subdirectories contain their own configure.in files.
+One would change to each of these subdirectories and in turn issue:
+
+ automake --cygnus Makefile
+
+Let's say you create a new machine directory XXXX off of newlib/libc/machine.
+After creating a new configure.in and Makefile.am file, you would issue:
+
+ aclocal -I ../../..
+ autoconf
+ automake --cygnus Makefile
+
+from newlib/libc/machine/XXXX
+
+It is strongly advised that you use an adequate version of autotools.
+For this latest release, the following were used: autoconf 2.68, aclocal 1.11.6, and
+automake 1.11.6.
+
+Reporting Bugs
+==============
+
+The correct address for reporting bugs found in NEWLIB is
+"newlib@sourceware.org". Please email all bug reports to that
+address. Please include the NEWLIB version number (e.g., newlib-2.0.0),
+and how you configured it (e.g., "sun4 host and m68k-aout target").
+Since NEWLIB supports many different configurations, it is important
+that you be precise about this.
+
+Archives of the newlib mailing list are on-line, see
+ http://sourceware.org/ml/newlib/
+
+ pthreads-win32 - a POSIX threads library for Microsoft Windows
+
+
+This file is Copyrighted
+------------------------
+
+ This file is covered under the following Copyright:
+
+ Copyright (C) 2001,2006 Ross P. Johnson
+ All rights reserved.
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+Pthreads-win32 is covered by the GNU Lesser General Public License
+------------------------------------------------------------------
+
+ Pthreads-win32 is open software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public License
+ as published by the Free Software Foundation version 2.1 of the
+ License.
+
+ Pthreads-win32 is several binary link libraries, several modules,
+ associated interface definition files and scripts used to control
+ its compilation and installation.
+
+ Pthreads-win32 is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Lesser General Public License for more details.
+
+ A copy of the GNU Lesser General Public License is distributed with
+ pthreads-win32 under the filename:
+
+ COPYING.LIB
+
+ You should have received a copy of the version 2.1 GNU Lesser General
+ Public License with pthreads-win32; if not, write to:
+
+ Free Software Foundation, Inc.
+ 59 Temple Place
+ Suite 330
+ Boston, MA 02111-1307
+ USA
+
+ The contact addresses for pthreads-win32 is as follows:
+
+ Web: http://sources.redhat.com/pthreads-win32
+ Email: Ross Johnson
+ Please use: Firstname.Lastname@homemail.com.au
+
+
+
+Pthreads-win32 copyrights and exception files
+---------------------------------------------
+
+ With the exception of the files listed below, Pthreads-win32
+ is covered under the following GNU Lesser General Public License
+ Copyrights:
+
+ Pthreads-win32 - POSIX Threads Library for Win32
+ Copyright(C) 1998 John E. Bossom
+ Copyright(C) 1999,2006 Pthreads-win32 contributors
+
+ The current list of contributors is contained
+ in the file CONTRIBUTORS included with the source
+ code distribution. The current list of CONTRIBUTORS
+ can also be seen at the following WWW location:
+ http://sources.redhat.com/pthreads-win32/contributors.html
+
+ Contact Email: Ross Johnson
+ Please use: Firstname.Lastname@homemail.com.au
+
+ These files are not covered under one of the Copyrights listed above:
+
+ COPYING
+ COPYING.LIB
+ tests/rwlock7.c
+
+ This file, COPYING, is distributed under the Copyright found at the
+ top of this file. It is important to note that you may distribute
+ verbatim copies of this file but you may not modify this file.
+
+ The file COPYING.LIB, which contains a copy of the version 2.1
+ GNU Lesser General Public License, is itself copyrighted by the
+ Free Software Foundation, Inc. Please note that the Free Software
+ Foundation, Inc. does NOT have a copyright over Pthreads-win32,
+ only the COPYING.LIB that is supplied with pthreads-win32.
+
+ The file tests/rwlock7.c is derived from code written by
+ Dave Butenhof for his book 'Programming With POSIX(R) Threads'.
+ The original code was obtained by free download from his website
+ http://home.earthlink.net/~anneart/family/Threads/source.html
+ and did not contain a copyright or author notice. It is assumed to
+ be freely distributable.
+
+ In all cases one may use and distribute these exception files freely.
+ And because one may freely distribute the LGPL covered files, the
+ entire pthreads-win32 source may be freely used and distributed.
+
+
+
+General Copyleft and License info
+---------------------------------
+
+ For general information on Copylefts, see:
+
+ http://www.gnu.org/copyleft/
+
+ For information on GNU Lesser General Public Licenses, see:
+
+ http://www.gnu.org/copyleft/lesser.html
+ http://www.gnu.org/copyleft/lesser.txt
+
+
+Why pthreads-win32 did not use the GNU General Public License
+-------------------------------------------------------------
+
+ The goal of the pthreads-win32 project has been to
+ provide a quality and complete implementation of the POSIX
+ threads API for Microsoft Windows within the limits imposed
+ by virtue of it being a stand-alone library and not
+ linked directly to other POSIX compliant libraries. For
+ example, some functions and features, such as those based
+ on POSIX signals, are missing.
+
+ Pthreads-win32 is a library, available in several different
+ versions depending on supported compilers, and may be used
+ as a dynamically linked module or a statically linked set of
+ binary modules. It is not an application on it's own.
+
+ It was fully intended that pthreads-win32 be usable with
+ commercial software not covered by either the GPL or the LGPL
+ licenses. Pthreads-win32 has many contributors to it's
+ code base, many of whom have done so because they have
+ used the library in commercial or proprietry software
+ projects.
+
+ Releasing pthreads-win32 under the LGPL ensures that the
+ library can be used widely, while at the same time ensures
+ that bug fixes and improvements to the pthreads-win32 code
+ itself is returned to benefit all current and future users
+ of the library.
+
+ Although pthreads-win32 makes it possible for applications
+ that use POSIX threads to be ported to Win32 platforms, the
+ broader goal of the project is to encourage the use of open
+ standards, and in particular, to make it just a little easier
+ for developers writing Win32 applications to consider
+ widening the potential market for their products.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright (c) 2008, Google Inc.
+
+ 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.
+
+(WebKit doesn't distribute an explicit license. This LICENSE is derived from
+license text in the source.)
+
+Copyright (c) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+2006, 2007 Alexander Kellett, Alexey Proskuryakov, Alex Mathews, Allan
+Sandfeld Jensen, Alp Toker, Anders Carlsson, Andrew Wellington, Antti
+Koivisto, Apple Inc., Arthur Langereis, Baron Schwartz, Bjoern Graf,
+Brent Fulgham, Cameron Zwarich, Charles Samuels, Christian Dywan,
+Collabora Ltd., Cyrus Patel, Daniel Molkentin, Dave Maclachlan, David
+Smith, Dawit Alemayehu, Dirk Mueller, Dirk Schulze, Don Gibson, Enrico
+Ros, Eric Seidel, Frederik Holljen, Frerich Raabe, Friedmann Kleint,
+George Staikos, Google Inc., Graham Dennis, Harri Porten, Henry Mason,
+Hiroyuki Ikezoe, Holger Hans Peter Freyther, IBM, James G. Speth, Jan
+Alonzo, Jean-Loup Gailly, John Reis, Jonas Witt, Jon Shier, Jonas
+Witt, Julien Chaffraix, Justin Haygood, Kevin Ollivier, Kevin Watters,
+Kimmo Kinnunen, Kouhei Sutou, Krzysztof Kowalczyk, Lars Knoll, Luca
+Bruno, Maks Orlovich, Malte Starostik, Mark Adler, Martin Jones,
+Marvin Decker, Matt Lilek, Michael Emmel, Mitz Pettel, mozilla.org,
+Netscape Communications Corporation, Nicholas Shanks, Nikolas
+Zimmermann, Nokia, Oliver Hunt, Opened Hand, Paul Johnston, Peter
+Kelly, Pioneer Research Center USA, Rich Moore, Rob Buis, Robin Dunn,
+Ronald Tschalär, Samuel Weinig, Simon Hausmann, Staikos Computing
+Services Inc., Stefan Schimanski, Symantec Corporation, The Dojo
+Foundation, The Karbon Developers, Thomas Boyer, Tim Copperfield,
+Tobias Anton, Torben Weis, Trolltech, University of Cambridge, Vaclav
+Slavik, Waldo Bastian, Xan Lopez, Zack Rusin
+
+The terms and conditions vary from file to file, but are one of:
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the
+ distribution.
+
+*OR*
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the
+ distribution.
+3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ its contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL. It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it. You can use it for
+your libraries, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library. If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software. To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+ Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs. This
+license, the GNU Library General Public License, applies to certain
+designated libraries. This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+ The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it. Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program. However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+ Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries. We
+concluded that weaker conditions might promote sharing better.
+
+ However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves. This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them. (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.) The hope is that this
+will lead to faster development of free libraries.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+ Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License"). Each licensee is
+addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ c) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ d) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
+
+// Copyright 2014 The Chromium Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * 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.
+ */
+// Copyright (C) 2002-2013 The ANGLE Project Authors.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+// Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//
+// Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+//
+// Neither the name of TransGaming Inc., Google Inc., 3DLabs Inc.
+// Ltd., nor the names of their contributors may be used to endorse
+// or promote products derived from this software without specific
+// prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
+
+Copyright (c) 2012, Manfred Moitzi
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Deutsche Übersetzung:
+
+Copyright (c) 2012, Manfred Moitzi
+
+Hiermit wird unentgeltlich, jeder Person, die eine Kopie der Software
+und der zugehörigen Dokumentationen (die "Software") erhält, die
+Erlaubnis erteilt, uneingeschränkt zu benutzen, inklusive und ohne
+Ausnahme, dem Recht, sie zu verwenden, kopieren, ändern, fusionieren,
+verlegen, verbreiten, unterlizenzieren und/oder zu verkaufen, und
+Personen, die diese Software erhalten, diese Rechte zu geben, unter den
+folgenden Bedingungen:
+
+Der obige Urheberrechtsvermerk und dieser Erlaubnisvermerk sind in allen
+Kopien oder Teilkopien der Software beizulegen.
+
+DIE SOFTWARE WIRD OHNE JEDE AUSDRÜCKLICHE ODER IMPLIZIERTE GARANTIE
+BEREITGESTELLT, EINSCHLIESSLICH DER GARANTIE ZUR BENUTZUNG FÜR DEN
+VORGESEHENEN ODER EINEM BESTIMMTEN ZWECK SOWIE JEGLICHER
+RECHTSVERLETZUNG, JEDOCH NICHT DARAUF BESCHRÄNKT. IN KEINEM FALL SIND
+DIE AUTOREN ODER COPYRIGHTINHABER FÜR JEGLICHEN SCHADEN ODER SONSTIGE
+ANSPRÜCHE HAFTBAR ZU MACHEN, OB INFOLGE DER ERFÜLLUNG EINES VERTRAGES,
+EINES DELIKTES ODER ANDERS IM ZUSAMMENHANG MIT DER SOFTWARE ODER
+SONSTIGER VERWENDUNG DER SOFTWARE ENTSTANDEN.
+
+
+Copyright (c) 2013 Alex Seville
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+
+ LICENSE ISSUES
+ ==============
+
+ The OpenSSL toolkit stays under a dual license, i.e. both the conditions of
+ the OpenSSL License and the original SSLeay license apply to the toolkit.
+ See below for the actual license texts. Actually both licenses are BSD-style
+ Open Source licenses. In case of any license issues related to OpenSSL
+ please contact openssl-core@openssl.org.
+
+ OpenSSL License
+ ---------------
+
+/* ====================================================================
+ * Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ * software must display the following acknowledgment:
+ * "This product includes software developed by the OpenSSL Project
+ * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
+ *
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * openssl-core@openssl.org.
+ *
+ * 5. Products derived from this software may not be called "OpenSSL"
+ * nor may "OpenSSL" appear in their names without prior written
+ * permission of the OpenSSL Project.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ * "This product includes software developed by the OpenSSL Project
+ * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This product includes cryptographic software written by Eric Young
+ * (eay@cryptsoft.com). This product includes software written by Tim
+ * Hudson (tjh@cryptsoft.com).
+ *
+ */
+
+ Original SSLeay License
+ -----------------------
+
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ *
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to. The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code. The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ *
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * "This product includes cryptographic software written by
+ * Eric Young (eay@cryptsoft.com)"
+ * The word 'cryptographic' can be left out if the rouines from the library
+ * being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from
+ * the apps directory (application code) you must include an acknowledgement:
+ * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed. i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+
+
+// Copyright (c) 2011 Google Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
+
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
+
+ MOZILLA PUBLIC LICENSE
+ Version 1.1
+
+ ---------------
+
+1. Definitions.
+
+ 1.0.1. "Commercial Use" means distribution or otherwise making the
+ Covered Code available to a third party.
+
+ 1.1. "Contributor" means each entity that creates or contributes to
+ the creation of Modifications.
+
+ 1.2. "Contributor Version" means the combination of the Original
+ Code, prior Modifications used by a Contributor, and the Modifications
+ made by that particular Contributor.
+
+ 1.3. "Covered Code" means the Original Code or Modifications or the
+ combination of the Original Code and Modifications, in each case
+ including portions thereof.
+
+ 1.4. "Electronic Distribution Mechanism" means a mechanism generally
+ accepted in the software development community for the electronic
+ transfer of data.
+
+ 1.5. "Executable" means Covered Code in any form other than Source
+ Code.
+
+ 1.6. "Initial Developer" means the individual or entity identified
+ as the Initial Developer in the Source Code notice required by Exhibit
+ A.
+
+ 1.7. "Larger Work" means a work which combines Covered Code or
+ portions thereof with code not governed by the terms of this License.
+
+ 1.8. "License" means this document.
+
+ 1.8.1. "Licensable" means having the right to grant, to the maximum
+ extent possible, whether at the time of the initial grant or
+ subsequently acquired, any and all of the rights conveyed herein.
+
+ 1.9. "Modifications" means any addition to or deletion from the
+ substance or structure of either the Original Code or any previous
+ Modifications. When Covered Code is released as a series of files, a
+ Modification is:
+ A. Any addition to or deletion from the contents of a file
+ containing Original Code or previous Modifications.
+
+ B. Any new file that contains any part of the Original Code or
+ previous Modifications.
+
+ 1.10. "Original Code" means Source Code of computer software code
+ which is described in the Source Code notice required by Exhibit A as
+ Original Code, and which, at the time of its release under this
+ License is not already Covered Code governed by this License.
+
+ 1.10.1. "Patent Claims" means any patent claim(s), now owned or
+ hereafter acquired, including without limitation, method, process,
+ and apparatus claims, in any patent Licensable by grantor.
+
+ 1.11. "Source Code" means the preferred form of the Covered Code for
+ making modifications to it, including all modules it contains, plus
+ any associated interface definition files, scripts used to control
+ compilation and installation of an Executable, or source code
+ differential comparisons against either the Original Code or another
+ well known, available Covered Code of the Contributor's choice. The
+ Source Code can be in a compressed or archival form, provided the
+ appropriate decompression or de-archiving software is widely available
+ for no charge.
+
+ 1.12. "You" (or "Your") means an individual or a legal entity
+ exercising rights under, and complying with all of the terms of, this
+ License or a future version of this License issued under Section 6.1.
+ For legal entities, "You" includes any entity which controls, is
+ controlled by, or is under common control with You. For purposes of
+ this definition, "control" means (a) the power, direct or indirect,
+ to cause the direction or management of such entity, whether by
+ contract or otherwise, or (b) ownership of more than fifty percent
+ (50%) of the outstanding shares or beneficial ownership of such
+ entity.
+
+2. Source Code License.
+
+ 2.1. The Initial Developer Grant.
+ The Initial Developer hereby grants You a world-wide, royalty-free,
+ non-exclusive license, subject to third party intellectual property
+ claims:
+ (a) under intellectual property rights (other than patent or
+ trademark) Licensable by Initial Developer to use, reproduce,
+ modify, display, perform, sublicense and distribute the Original
+ Code (or portions thereof) with or without Modifications, and/or
+ as part of a Larger Work; and
+
+ (b) under Patents Claims infringed by the making, using or
+ selling of Original Code, to make, have made, use, practice,
+ sell, and offer for sale, and/or otherwise dispose of the
+ Original Code (or portions thereof).
+
+ (c) the licenses granted in this Section 2.1(a) and (b) are
+ effective on the date Initial Developer first distributes
+ Original Code under the terms of this License.
+
+ (d) Notwithstanding Section 2.1(b) above, no patent license is
+ granted: 1) for code that You delete from the Original Code; 2)
+ separate from the Original Code; or 3) for infringements caused
+ by: i) the modification of the Original Code or ii) the
+ combination of the Original Code with other software or devices.
+
+ 2.2. Contributor Grant.
+ Subject to third party intellectual property claims, each Contributor
+ hereby grants You a world-wide, royalty-free, non-exclusive license
+
+ (a) under intellectual property rights (other than patent or
+ trademark) Licensable by Contributor, to use, reproduce, modify,
+ display, perform, sublicense and distribute the Modifications
+ created by such Contributor (or portions thereof) either on an
+ unmodified basis, with other Modifications, as Covered Code
+ and/or as part of a Larger Work; and
+
+ (b) under Patent Claims infringed by the making, using, or
+ selling of Modifications made by that Contributor either alone
+ and/or in combination with its Contributor Version (or portions
+ of such combination), to make, use, sell, offer for sale, have
+ made, and/or otherwise dispose of: 1) Modifications made by that
+ Contributor (or portions thereof); and 2) the combination of
+ Modifications made by that Contributor with its Contributor
+ Version (or portions of such combination).
+
+ (c) the licenses granted in Sections 2.2(a) and 2.2(b) are
+ effective on the date Contributor first makes Commercial Use of
+ the Covered Code.
+
+ (d) Notwithstanding Section 2.2(b) above, no patent license is
+ granted: 1) for any code that Contributor has deleted from the
+ Contributor Version; 2) separate from the Contributor Version;
+ 3) for infringements caused by: i) third party modifications of
+ Contributor Version or ii) the combination of Modifications made
+ by that Contributor with other software (except as part of the
+ Contributor Version) or other devices; or 4) under Patent Claims
+ infringed by Covered Code in the absence of Modifications made by
+ that Contributor.
+
+3. Distribution Obligations.
+
+ 3.1. Application of License.
+ The Modifications which You create or to which You contribute are
+ governed by the terms of this License, including without limitation
+ Section 2.2. The Source Code version of Covered Code may be
+ distributed only under the terms of this License or a future version
+ of this License released under Section 6.1, and You must include a
+ copy of this License with every copy of the Source Code You
+ distribute. You may not offer or impose any terms on any Source Code
+ version that alters or restricts the applicable version of this
+ License or the recipients' rights hereunder. However, You may include
+ an additional document offering the additional rights described in
+ Section 3.5.
+
+ 3.2. Availability of Source Code.
+ Any Modification which You create or to which You contribute must be
+ made available in Source Code form under the terms of this License
+ either on the same media as an Executable version or via an accepted
+ Electronic Distribution Mechanism to anyone to whom you made an
+ Executable version available; and if made available via Electronic
+ Distribution Mechanism, must remain available for at least twelve (12)
+ months after the date it initially became available, or at least six
+ (6) months after a subsequent version of that particular Modification
+ has been made available to such recipients. You are responsible for
+ ensuring that the Source Code version remains available even if the
+ Electronic Distribution Mechanism is maintained by a third party.
+
+ 3.3. Description of Modifications.
+ You must cause all Covered Code to which You contribute to contain a
+ file documenting the changes You made to create that Covered Code and
+ the date of any change. You must include a prominent statement that
+ the Modification is derived, directly or indirectly, from Original
+ Code provided by the Initial Developer and including the name of the
+ Initial Developer in (a) the Source Code, and (b) in any notice in an
+ Executable version or related documentation in which You describe the
+ origin or ownership of the Covered Code.
+
+ 3.4. Intellectual Property Matters
+ (a) Third Party Claims.
+ If Contributor has knowledge that a license under a third party's
+ intellectual property rights is required to exercise the rights
+ granted by such Contributor under Sections 2.1 or 2.2,
+ Contributor must include a text file with the Source Code
+ distribution titled "LEGAL" which describes the claim and the
+ party making the claim in sufficient detail that a recipient will
+ know whom to contact. If Contributor obtains such knowledge after
+ the Modification is made available as described in Section 3.2,
+ Contributor shall promptly modify the LEGAL file in all copies
+ Contributor makes available thereafter and shall take other steps
+ (such as notifying appropriate mailing lists or newsgroups)
+ reasonably calculated to inform those who received the Covered
+ Code that new knowledge has been obtained.
+
+ (b) Contributor APIs.
+ If Contributor's Modifications include an application programming
+ interface and Contributor has knowledge of patent licenses which
+ are reasonably necessary to implement that API, Contributor must
+ also include this information in the LEGAL file.
+
+ (c) Representations.
+ Contributor represents that, except as disclosed pursuant to
+ Section 3.4(a) above, Contributor believes that Contributor's
+ Modifications are Contributor's original creation(s) and/or
+ Contributor has sufficient rights to grant the rights conveyed by
+ this License.
+
+ 3.5. Required Notices.
+ You must duplicate the notice in Exhibit A in each file of the Source
+ Code. If it is not possible to put such notice in a particular Source
+ Code file due to its structure, then You must include such notice in a
+ location (such as a relevant directory) where a user would be likely
+ to look for such a notice. If You created one or more Modification(s)
+ You may add your name as a Contributor to the notice described in
+ Exhibit A. You must also duplicate this License in any documentation
+ for the Source Code where You describe recipients' rights or ownership
+ rights relating to Covered Code. You may choose to offer, and to
+ charge a fee for, warranty, support, indemnity or liability
+ obligations to one or more recipients of Covered Code. However, You
+ may do so only on Your own behalf, and not on behalf of the Initial
+ Developer or any Contributor. You must make it absolutely clear than
+ any such warranty, support, indemnity or liability obligation is
+ offered by You alone, and You hereby agree to indemnify the Initial
+ Developer and every Contributor for any liability incurred by the
+ Initial Developer or such Contributor as a result of warranty,
+ support, indemnity or liability terms You offer.
+
+ 3.6. Distribution of Executable Versions.
+ You may distribute Covered Code in Executable form only if the
+ requirements of Section 3.1-3.5 have been met for that Covered Code,
+ and if You include a notice stating that the Source Code version of
+ the Covered Code is available under the terms of this License,
+ including a description of how and where You have fulfilled the
+ obligations of Section 3.2. The notice must be conspicuously included
+ in any notice in an Executable version, related documentation or
+ collateral in which You describe recipients' rights relating to the
+ Covered Code. You may distribute the Executable version of Covered
+ Code or ownership rights under a license of Your choice, which may
+ contain terms different from this License, provided that You are in
+ compliance with the terms of this License and that the license for the
+ Executable version does not attempt to limit or alter the recipient's
+ rights in the Source Code version from the rights set forth in this
+ License. If You distribute the Executable version under a different
+ license You must make it absolutely clear that any terms which differ
+ from this License are offered by You alone, not by the Initial
+ Developer or any Contributor. You hereby agree to indemnify the
+ Initial Developer and every Contributor for any liability incurred by
+ the Initial Developer or such Contributor as a result of any such
+ terms You offer.
+
+ 3.7. Larger Works.
+ You may create a Larger Work by combining Covered Code with other code
+ not governed by the terms of this License and distribute the Larger
+ Work as a single product. In such a case, You must make sure the
+ requirements of this License are fulfilled for the Covered Code.
+
+4. Inability to Comply Due to Statute or Regulation.
+
+ If it is impossible for You to comply with any of the terms of this
+ License with respect to some or all of the Covered Code due to
+ statute, judicial order, or regulation then You must: (a) comply with
+ the terms of this License to the maximum extent possible; and (b)
+ describe the limitations and the code they affect. Such description
+ must be included in the LEGAL file described in Section 3.4 and must
+ be included with all distributions of the Source Code. Except to the
+ extent prohibited by statute or regulation, such description must be
+ sufficiently detailed for a recipient of ordinary skill to be able to
+ understand it.
+
+5. Application of this License.
+
+ This License applies to code to which the Initial Developer has
+ attached the notice in Exhibit A and to related Covered Code.
+
+6. Versions of the License.
+
+ 6.1. New Versions.
+ Netscape Communications Corporation ("Netscape") may publish revised
+ and/or new versions of the License from time to time. Each version
+ will be given a distinguishing version number.
+
+ 6.2. Effect of New Versions.
+ Once Covered Code has been published under a particular version of the
+ License, You may always continue to use it under the terms of that
+ version. You may also choose to use such Covered Code under the terms
+ of any subsequent version of the License published by Netscape. No one
+ other than Netscape has the right to modify the terms applicable to
+ Covered Code created under this License.
+
+ 6.3. Derivative Works.
+ If You create or use a modified version of this License (which you may
+ only do in order to apply it to code which is not already Covered Code
+ governed by this License), You must (a) rename Your license so that
+ the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
+ "MPL", "NPL" or any confusingly similar phrase do not appear in your
+ license (except to note that your license differs from this License)
+ and (b) otherwise make it clear that Your version of the license
+ contains terms which differ from the Mozilla Public License and
+ Netscape Public License. (Filling in the name of the Initial
+ Developer, Original Code or Contributor in the notice described in
+ Exhibit A shall not of themselves be deemed to be modifications of
+ this License.)
+
+7. DISCLAIMER OF WARRANTY.
+
+ COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
+ DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
+ THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
+ IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
+ YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
+ COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
+ OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
+ ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+8. TERMINATION.
+
+ 8.1. This License and the rights granted hereunder will terminate
+ automatically if You fail to comply with terms herein and fail to cure
+ such breach within 30 days of becoming aware of the breach. All
+ sublicenses to the Covered Code which are properly granted shall
+ survive any termination of this License. Provisions which, by their
+ nature, must remain in effect beyond the termination of this License
+ shall survive.
+
+ 8.2. If You initiate litigation by asserting a patent infringement
+ claim (excluding declatory judgment actions) against Initial Developer
+ or a Contributor (the Initial Developer or Contributor against whom
+ You file such action is referred to as "Participant") alleging that:
+
+ (a) such Participant's Contributor Version directly or indirectly
+ infringes any patent, then any and all rights granted by such
+ Participant to You under Sections 2.1 and/or 2.2 of this License
+ shall, upon 60 days notice from Participant terminate prospectively,
+ unless if within 60 days after receipt of notice You either: (i)
+ agree in writing to pay Participant a mutually agreeable reasonable
+ royalty for Your past and future use of Modifications made by such
+ Participant, or (ii) withdraw Your litigation claim with respect to
+ the Contributor Version against such Participant. If within 60 days
+ of notice, a reasonable royalty and payment arrangement are not
+ mutually agreed upon in writing by the parties or the litigation claim
+ is not withdrawn, the rights granted by Participant to You under
+ Sections 2.1 and/or 2.2 automatically terminate at the expiration of
+ the 60 day notice period specified above.
+
+ (b) any software, hardware, or device, other than such Participant's
+ Contributor Version, directly or indirectly infringes any patent, then
+ any rights granted to You by such Participant under Sections 2.1(b)
+ and 2.2(b) are revoked effective as of the date You first made, used,
+ sold, distributed, or had made, Modifications made by that
+ Participant.
+
+ 8.3. If You assert a patent infringement claim against Participant
+ alleging that such Participant's Contributor Version directly or
+ indirectly infringes any patent where such claim is resolved (such as
+ by license or settlement) prior to the initiation of patent
+ infringement litigation, then the reasonable value of the licenses
+ granted by such Participant under Sections 2.1 or 2.2 shall be taken
+ into account in determining the amount or value of any payment or
+ license.
+
+ 8.4. In the event of termination under Sections 8.1 or 8.2 above,
+ all end user license agreements (excluding distributors and resellers)
+ which have been validly granted by You or any distributor hereunder
+ prior to termination shall survive termination.
+
+9. LIMITATION OF LIABILITY.
+
+ UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
+ (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
+ DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
+ OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
+ ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
+ CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
+ WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
+ COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
+ INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
+ LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
+ RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
+ PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
+ EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
+ THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+10. U.S. GOVERNMENT END USERS.
+
+ The Covered Code is a "commercial item," as that term is defined in
+ 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
+ software" and "commercial computer software documentation," as such
+ terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
+ C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
+ all U.S. Government End Users acquire Covered Code with only those
+ rights set forth herein.
+
+11. MISCELLANEOUS.
+
+ This License represents the complete agreement concerning subject
+ matter hereof. If any provision of this License is held to be
+ unenforceable, such provision shall be reformed only to the extent
+ necessary to make it enforceable. This License shall be governed by
+ California law provisions (except to the extent applicable law, if
+ any, provides otherwise), excluding its conflict-of-law provisions.
+ With respect to disputes in which at least one party is a citizen of,
+ or an entity chartered or registered to do business in the United
+ States of America, any litigation relating to this License shall be
+ subject to the jurisdiction of the Federal Courts of the Northern
+ District of California, with venue lying in Santa Clara County,
+ California, with the losing party responsible for costs, including
+ without limitation, court costs and reasonable attorneys' fees and
+ expenses. The application of the United Nations Convention on
+ Contracts for the International Sale of Goods is expressly excluded.
+ Any law or regulation which provides that the language of a contract
+ shall be construed against the drafter shall not apply to this
+ License.
+
+12. RESPONSIBILITY FOR CLAIMS.
+
+ As between Initial Developer and the Contributors, each party is
+ responsible for claims and damages arising, directly or indirectly,
+ out of its utilization of rights under this License and You agree to
+ work with Initial Developer and Contributors to distribute such
+ responsibility on an equitable basis. Nothing herein is intended or
+ shall be deemed to constitute any admission of liability.
+
+13. MULTIPLE-LICENSED CODE.
+
+ Initial Developer may designate portions of the Covered Code as
+ "Multiple-Licensed". "Multiple-Licensed" means that the Initial
+ Developer permits you to utilize portions of the Covered Code under
+ Your choice of the NPL or the alternative licenses, if any, specified
+ by the Initial Developer in the file described in Exhibit A.
+
+EXHIBIT A -Mozilla Public License.
+
+ ``The contents of this file are subject to the Mozilla Public License
+ Version 1.1 (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.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ License for the specific language governing rights and limitations
+ under the License.
+
+ The Original Code is ______________________________________.
+
+ The Initial Developer of the Original Code is ________________________.
+ Portions created by ______________________ are Copyright (C) ______
+ _______________________. All Rights Reserved.
+
+ Contributor(s): ______________________________________.
+
+ Alternatively, the contents of this file may be used under the terms
+ of the _____ license (the "[___] License"), in which case the
+ provisions of [______] License are applicable instead of those
+ above. If you wish to allow use of your version of this file only
+ under the terms of the [____] License and not to allow others to use
+ your version of this file under the MPL, indicate your decision by
+ deleting the provisions above and replace them with the notice and
+ other provisions required by the [___] License. If you do not delete
+ the provisions above, a recipient may use your version of this file
+ under either the MPL or the [___] License."
+
+ [NOTE: The text of this Exhibit A may differ slightly from the text of
+ the notices in the Source Code files of the Original Code. You should
+ use the text of this Exhibit A rather than the text found in the
+ Original Code Source Code for Your Modifications.]
+
+ ----------------------------------------------------------------------
+
+ AMENDMENTS
+
+ The Netscape Public License Version 1.1 ("NPL") consists of the
+ Mozilla Public License Version 1.1 with the following Amendments,
+ including Exhibit A-Netscape Public License. Files identified with
+ "Exhibit A-Netscape Public License" are governed by the Netscape
+ Public License Version 1.1.
+
+ Additional Terms applicable to the Netscape Public License.
+ I. Effect.
+ These additional terms described in this Netscape Public
+ License -- Amendments shall apply to the Mozilla Communicator
+ client code and to all Covered Code under this License.
+
+ II. "Netscape's Branded Code" means Covered Code that Netscape
+ distributes and/or permits others to distribute under one or more
+ trademark(s) which are controlled by Netscape but which are not
+ licensed for use under this License.
+
+ III. Netscape and logo.
+ This License does not grant any rights to use the trademarks
+ "Netscape", the "Netscape N and horizon" logo or the "Netscape
+ lighthouse" logo, "Netcenter", "Gecko", "Java" or "JavaScript",
+ "Smart Browsing" even if such marks are included in the Original
+ Code or Modifications.
+
+ IV. Inability to Comply Due to Contractual Obligation.
+ Prior to licensing the Original Code under this License, Netscape
+ has licensed third party code for use in Netscape's Branded Code.
+ To the extent that Netscape is limited contractually from making
+ such third party code available under this License, Netscape may
+ choose to reintegrate such code into Covered Code without being
+ required to distribute such code in Source Code form, even if
+ such code would otherwise be considered "Modifications" under
+ this License.
+
+ V. Use of Modifications and Covered Code by Initial Developer.
+ V.1. In General.
+ The obligations of Section 3 apply to Netscape, except to
+ the extent specified in this Amendment, Section V.2 and V.3.
+
+ V.2. Other Products.
+ Netscape may include Covered Code in products other than the
+ Netscape's Branded Code which are released by Netscape
+ during the two (2) years following the release date of the
+ Original Code, without such additional products becoming
+ subject to the terms of this License, and may license such
+ additional products on different terms from those contained
+ in this License.
+
+ V.3. Alternative Licensing.
+ Netscape may license the Source Code of Netscape's Branded
+ Code, including Modifications incorporated therein, without
+ such Netscape Branded Code becoming subject to the terms of
+ this License, and may license such Netscape Branded Code on
+ different terms from those contained in this License.
+
+ VI. Litigation.
+ Notwithstanding the limitations of Section 11 above, the
+ provisions regarding litigation in Section 11(a), (b) and (c) of
+ the License shall apply to all disputes relating to this License.
+
+ EXHIBIT A-Netscape Public License.
+
+ "The contents of this file are subject to the Netscape Public
+ License Version 1.1 (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.mozilla.org/NPL/
+
+ Software distributed under the License is distributed on an "AS
+ IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ implied. See the License for the specific language governing
+ rights and limitations under the License.
+
+ The Original Code is Mozilla Communicator client code, released
+ March 31, 1998.
+
+ The Initial Developer of the Original Code is Netscape
+ Communications Corporation. Portions created by Netscape are
+ Copyright (C) 1998-1999 Netscape Communications Corporation. All
+ Rights Reserved.
+
+ Contributor(s): ______________________________________.
+
+ Alternatively, the contents of this file may be used under the
+ terms of the _____ license (the "[___] License"), in which case
+ the provisions of [______] License are applicable instead of
+ those above. If you wish to allow use of your version of this
+ file only under the terms of the [____] License and not to allow
+ others to use your version of this file under the NPL, indicate
+ your decision by deleting the provisions above and replace them
+ with the notice and other provisions required by the [___]
+ License. If you do not delete the provisions above, a recipient
+ may use your version of this file under either the NPL or the
+ [___] License."
+
+Copyright (c) 2010 Jonathan Hartley
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holders, nor those of its contributors
+ may be used to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+Copyright (c) 2010-2014, Michael Bostock
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* The name Michael Bostock may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Extracted from mac/include/DeckLinkAPI.h:
+
+** Copyright (c) 2014 Blackmagic Design
+**
+** Permission is hereby granted, free of charge, to any person or organization
+** obtaining a copy of the software and accompanying documentation covered by
+** this license (the "Software") to use, reproduce, display, distribute,
+** execute, and transmit the Software, and to prepare derivative works of the
+** Software, and to permit third-parties to whom the Software is furnished to
+** do so, all subject to the following:
+**
+** The copyright notices in the Software and this entire statement, including
+** the above license grant, this restriction and the following disclaimer,
+** must be included in all copies of the Software, in whole or in part, and
+** all derivative works of the Software, unless such copies or derivative
+** works are solely in the form of machine-executable object code generated by
+** a source language processor.
+**
+** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+** FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+** DEALINGS IN THE SOFTWARE.
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
+Copyright 2014 The Chromium Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+
+Parts of the following directories are available under Apache v2.0
+
+src/de
+Copyright (c) 2009-2011 Christian Kohlschütter
+
+third_party/gwt_exporter
+Copyright 2007 Timepedia.org
+
+third_party/gwt-2.5.1
+Copyright 2008 Google
+
+Apache License
+
+Version 2.0, January 2004
+
+http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
+
+"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
+
+"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
+
+"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
+
+"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
+
+"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
+
+"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
+
+"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
+
+"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
+
+You must give any other recipients of the Work or Derivative Works a copy of this License; and
+You must cause any modified files to carry prominent notices stating that You changed the files; and
+You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
+If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
+
+You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
+5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
+ and Clark Cooper
+Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2011 Google Inc. All Rights Reserved.
+
+ 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.
+
+
+Copyright (c) 1999, 2000, 2001, 2002
+Adel I. Mirzazhanov. All rights reserved
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+ 1.Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ 2.Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3.The name of the author may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Copyright (c) 2007-2013 IOLA and Ole Laursen
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+This software is based in part on the work of the FreeType Team.
+
+----------------------
+
+ The FreeType Project LICENSE
+ ----------------------------
+
+ 2006-Jan-27
+
+ Copyright 1996-2002, 2006 by
+ David Turner, Robert Wilhelm, and Werner Lemberg
+
+
+
+Introduction
+============
+
+ The FreeType Project is distributed in several archive packages;
+ some of them may contain, in addition to the FreeType font engine,
+ various tools and contributions which rely on, or relate to, the
+ FreeType Project.
+
+ This license applies to all files found in such packages, and
+ which do not fall under their own explicit license. The license
+ affects thus the FreeType font engine, the test programs,
+ documentation and makefiles, at the very least.
+
+ This license was inspired by the BSD, Artistic, and IJG
+ (Independent JPEG Group) licenses, which all encourage inclusion
+ and use of free software in commercial and freeware products
+ alike. As a consequence, its main points are that:
+
+ o We don't promise that this software works. However, we will be
+ interested in any kind of bug reports. (`as is' distribution)
+
+ o You can use this software for whatever you want, in parts or
+ full form, without having to pay us. (`royalty-free' usage)
+
+ o You may not pretend that you wrote this software. If you use
+ it, or only parts of it, in a program, you must acknowledge
+ somewhere in your documentation that you have used the
+ FreeType code. (`credits')
+
+ We specifically permit and encourage the inclusion of this
+ software, with or without modifications, in commercial products.
+ We disclaim all warranties covering The FreeType Project and
+ assume no liability related to The FreeType Project.
+
+
+ Finally, many people asked us for a preferred form for a
+ credit/disclaimer to use in compliance with this license. We thus
+ encourage you to use the following text:
+
+ """
+ Portions of this software are copyright <year> The FreeType
+ Project (www.freetype.org). All rights reserved.
+ """
+
+ Please replace <year> with the value from the FreeType version you
+ actually use.
+
+
+Legal Terms
+===========
+
+0. Definitions
+--------------
+
+ Throughout this license, the terms `package', `FreeType Project',
+ and `FreeType archive' refer to the set of files originally
+ distributed by the authors (David Turner, Robert Wilhelm, and
+ Werner Lemberg) as the `FreeType Project', be they named as alpha,
+ beta or final release.
+
+ `You' refers to the licensee, or person using the project, where
+ `using' is a generic term including compiling the project's source
+ code as well as linking it to form a `program' or `executable'.
+ This program is referred to as `a program using the FreeType
+ engine'.
+
+ This license applies to all files distributed in the original
+ FreeType Project, including all source code, binaries and
+ documentation, unless otherwise stated in the file in its
+ original, unmodified form as distributed in the original archive.
+ If you are unsure whether or not a particular file is covered by
+ this license, you must contact us to verify this.
+
+ The FreeType Project is copyright (C) 1996-2000 by David Turner,
+ Robert Wilhelm, and Werner Lemberg. All rights reserved except as
+ specified below.
+
+1. No Warranty
+--------------
+
+ THE FREETYPE PROJECT IS PROVIDED `AS IS' WITHOUT WARRANTY OF ANY
+ KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS
+ BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO
+ USE, OF THE FREETYPE PROJECT.
+
+2. Redistribution
+-----------------
+
+ This license grants a worldwide, royalty-free, perpetual and
+ irrevocable right and license to use, execute, perform, compile,
+ display, copy, create derivative works of, distribute and
+ sublicense the FreeType Project (in both source and object code
+ forms) and derivative works thereof for any purpose; and to
+ authorize others to exercise some or all of the rights granted
+ herein, subject to the following conditions:
+
+ o Redistribution of source code must retain this license file
+ (`FTL.TXT') unaltered; any additions, deletions or changes to
+ the original files must be clearly indicated in accompanying
+ documentation. The copyright notices of the unaltered,
+ original files must be preserved in all copies of source
+ files.
+
+ o Redistribution in binary form must provide a disclaimer that
+ states that the software is based in part of the work of the
+ FreeType Team, in the distribution documentation. We also
+ encourage you to put an URL to the FreeType web page in your
+ documentation, though this isn't mandatory.
+
+ These conditions apply to any software derived from or based on
+ the FreeType Project, not just the unmodified files. If you use
+ our work, you must acknowledge us. However, no fee need be paid
+ to us.
+
+3. Advertising
+--------------
+
+ Neither the FreeType authors and contributors nor you shall use
+ the name of the other for commercial, advertising, or promotional
+ purposes without specific prior written permission.
+
+ We suggest, but do not require, that you use one or more of the
+ following phrases to refer to this software in your documentation
+ or advertising materials: `FreeType Project', `FreeType Engine',
+ `FreeType library', or `FreeType Distribution'.
+
+ As you have not signed this license, you are not required to
+ accept it. However, as the FreeType Project is copyrighted
+ material, only this license, or another one contracted with the
+ authors, grants you the right to use, distribute, and modify it.
+ Therefore, by using, distributing, or modifying the FreeType
+ Project, you indicate that you understand and accept all the terms
+ of this license.
+
+4. Contacts
+-----------
+
+ There are two mailing lists related to FreeType:
+
+ o freetype@nongnu.org
+
+ Discusses general use and applications of FreeType, as well as
+ future and wanted additions to the library and distribution.
+ If you are looking for support, start in this list if you
+ haven't found anything to help you in the documentation.
+
+ o freetype-devel@nongnu.org
+
+ Discusses bugs, as well as engine internals, design issues,
+ specific licenses, porting, etc.
+
+ Our home page can be found at
+
+ http://www.freetype.org
+
+
+--- end of FTL.TXT ---
+
+// Copyright 2014 The Chromium Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+See src/COPYING
+
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL. It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it. You can use it for
+your libraries, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library. If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software. To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+ Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs. This
+license, the GNU Library General Public License, applies to certain
+designated libraries. This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+ The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it. Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program. However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+ Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries. We
+concluded that weaker conditions might promote sharing better.
+
+ However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves. This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them. (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.) The hope is that this
+will lead to faster development of free libraries.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+ Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License"). Each licensee is
+addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ c) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ d) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+HarfBuzz is licensed under the so-called "Old MIT" license. Details follow.
+For parts of HarfBuzz that are licensed under different licenses see individual
+files names COPYING in subdirectories where applicable.
+
+Copyright © 2010,2011,2012 Google, Inc.
+Copyright © 2012 Mozilla Foundation
+Copyright © 2011 Codethink Limited
+Copyright © 2008,2010 Nokia Corporation and/or its subsidiary(-ies)
+Copyright © 2009 Keith Stribley
+Copyright © 2009 Martin Hosken and SIL International
+Copyright © 2007 Chris Wilson
+Copyright © 2006 Behdad Esfahbod
+Copyright © 2005 David Turner
+Copyright © 2004,2007,2008,2009,2010 Red Hat, Inc.
+Copyright © 1998-2004 David Turner and Werner Lemberg
+
+For full copyright notices consult the individual files in the package.
+
+
+Permission is hereby granted, without written agreement and without
+license or royalty fees, to use, copy, modify, and distribute this
+software and its documentation for any purpose, provided that the
+above copyright notice and the following two paragraphs appear in
+all copies of this software.
+
+IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
+
+THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+
+// Copyright 2014 The Chromium Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+/*************************************************************************
+ *
+ * IAccessible2 IDL Specification
+ *
+ * Copyright (c) 2007, 2010 Linux Foundation
+ * Copyright (c) 2006 IBM Corporation
+ * Copyright (c) 2000, 2006 Sun Microsystems, Inc.
+ * All rights reserved.
+ *
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * 3. Neither the name of the Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products
+ * derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This BSD License conforms to the Open Source Initiative "Simplified
+ * BSD License" as published at:
+ * http://www.opensource.org/licenses/bsd-license.php
+ *
+ * IAccessible2 is a trademark of the Linux Foundation. The IAccessible2
+ * mark may be used in accordance with the Linux Foundation Trademark
+ * Policy to indicate compliance with the IAccessible2 specification.
+ *
+ ************************************************************************/
+
+LICENSE extracted from IJG's jpeg distribution:
+-----------------------------------------------
+
+In plain English:
+
+1. We don't promise that this software works. (But if you find any bugs,
+ please let us know!)
+2. You can use this software for whatever you want. You don't have to pay us.
+3. You may not pretend that you wrote this software. If you use it in a
+ program, you must acknowledge somewhere in your documentation that
+ you've used the IJG code.
+
+In legalese:
+
+The authors make NO WARRANTY or representation, either express or implied,
+with respect to this software, its quality, accuracy, merchantability, or
+fitness for a particular purpose. This software is provided "AS IS", and you,
+its user, assume the entire risk as to its quality and accuracy.
+
+This software is copyright (C) 1991-1998, Thomas G. Lane.
+All Rights Reserved except as specified below.
+
+Permission is hereby granted to use, copy, modify, and distribute this
+software (or portions thereof) for any purpose, without fee, subject to these
+conditions:
+(1) If any part of the source code for this software is distributed, then this
+README file must be included, with this copyright and no-warranty notice
+unaltered; and any additions, deletions, or changes to the original files
+must be clearly indicated in accompanying documentation.
+(2) If only executable code is distributed, then the accompanying
+documentation must state that "this software is based in part on the work of
+the Independent JPEG Group".
+(3) Permission for use of this software is granted only if the user accepts
+full responsibility for any undesirable consequences; the authors accept
+NO LIABILITY for damages of any kind.
+
+These conditions apply to any software derived from or based on the IJG code,
+not just to the unmodified library. If you use our work, you ought to
+acknowledge us.
+
+Permission is NOT granted for the use of any IJG author's name or company name
+in advertising or publicity relating to this software or products derived from
+it. This software may be referred to only as "the Independent JPEG Group's
+software".
+
+We specifically permit and encourage the use of this software as the basis of
+commercial products, provided that all warranty or liability claims are
+assumed by the product vendor.
+
+
+ICU License - ICU 1.8.1 and later
+
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright (c) 1995-2013 International Business Machines Corporation and
+others
+
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, and/or sell copies of the Software, and to permit persons
+to whom the Software is furnished to do so, provided that the above
+copyright notice(s) and this permission notice appear in all copies of
+the Software and that both the above copyright notice(s) and this
+permission notice appear in supporting documentation.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder
+shall not be used in advertising or otherwise to promote the sale, use
+or other dealings in this Software without prior written authorization
+of the copyright holder.
+ __________________________________________________________________
+
+All trademarks and registered trademarks mentioned herein are the
+property of their respective owners.
+ __________________________________________________________________
+
+Third-Party Software Licenses
+
+ This section contains third-party software notices and/or additional
+ terms for licensed third-party software components included within ICU
+ libraries.
+
+1. Unicode Data Files and Software
+
+ EXHIBIT 1
+ UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE
+
+ Unicode Data Files include all data files under the directories
+ http://www.unicode.org/Public/, http://www.unicode.org/reports/, and
+ http://www.unicode.org/cldr/data/. Unicode Data Files do not include
+ PDF online code charts under the directory
+ http://www.unicode.org/Public/. Software includes any source code
+ published in the Unicode Standard or under the directories
+ http://www.unicode.org/Public/, http://www.unicode.org/reports/, and
+ http://www.unicode.org/cldr/data/.
+
+ NOTICE TO USER: Carefully read the following legal agreement. BY
+ DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S
+ DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), YOU
+ UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE TERMS AND
+ CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT AGREE, DO NOT DOWNLOAD,
+ INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR SOFTWARE.
+
+ COPYRIGHT AND PERMISSION NOTICE
+
+ Copyright © 1991-2013 Unicode, Inc. All rights reserved. Distributed
+ under the Terms of Use in http://www.unicode.org/copyright.html.
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of the Unicode data files and any associated
+ documentation (the "Data Files") or Unicode software and any
+ associated documentation (the "Software") to deal in the Data Files
+ or Software without restriction, including without limitation the
+ rights to use, copy, modify, merge, publish, distribute, and/or sell
+ copies of the Data Files or Software, and to permit persons to whom
+ the Data Files or Software are furnished to do so, provided that (a)
+ the above copyright notice(s) and this permission notice appear with
+ all copies of the Data Files or Software, (b) both the above
+ copyright notice(s) and this permission notice appear in associated
+ documentation, and (c) there is clear notice in each modified Data
+ File or in the Software as well as in the documentation associated
+ with the Data File(s) or Software that the data or software has been
+ modified.
+
+ THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY
+ OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE
+ COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR
+ ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY
+ DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ OF THE DATA FILES OR SOFTWARE.
+
+ Except as contained in this notice, the name of a copyright holder
+ shall not be used in advertising or otherwise to promote the sale,
+ use or other dealings in these Data Files or Software without prior
+ written authorization of the copyright holder.
+ ______________________________________________________
+
+ Unicode and the Unicode logo are trademarks of Unicode, Inc. in the
+ United States and other countries. All third party trademarks
+ referenced herein are the property of their respective owners.
+
+2. Chinese/Japanese Word Break Dictionary Data (cjdict.txt)
+
+ # The Google Chrome software developed by Google is licensed under the BSD l
+icense. Other software included in this distribution is provided under other lic
+enses, as set forth below.
+ #
+ # The BSD License
+ # http://opensource.org/licenses/bsd-license.php
+ # Copyright (C) 2006-2008, Google Inc.
+ #
+ # All rights reserved.
+ #
+ # Redistribution and use in source and binary forms, with or without modif
+ication, are permitted provided that the following conditions are met:
+ #
+ # Redistributions of source code must retain the above copyright notice, t
+his list of conditions and the following disclaimer.
+ # Redistributions in binary form must reproduce the above copyright notice
+, this list of conditions and the following disclaimer in the documentation and/
+or other materials provided with the distribution.
+ # Neither the name of Google Inc. nor the names of its contributors may b
+e used to endorse or promote products derived from this software without specifi
+c prior written permission.
+ #
+ #
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IM
+PLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DIS
+CLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INC
+LUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEO
+RY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLI
+GENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ #
+ #
+ # The word list in cjdict.txt are generated by combining three word lists
+listed
+ # below with further processing for compound word breaking. The frequency
+is generated
+ # with an iterative training against Google web corpora.
+ #
+ # * Libtabe (Chinese)
+ # - https://sourceforge.net/project/?group_id=1519
+ # - Its license terms and conditions are shown below.
+ #
+ # * IPADIC (Japanese)
+ # - http://chasen.aist-nara.ac.jp/chasen/distribution.html
+ # - Its license terms and conditions are shown below.
+ #
+ # ---------COPYING.libtabe ---- BEGIN--------------------
+ #
+ # /*
+ # * Copyrighy (c) 1999 TaBE Project.
+ # * Copyright (c) 1999 Pai-Hsiang Hsiao.
+ # * All rights reserved.
+ # *
+ # * Redistribution and use in source and binary forms, with or without
+ # * modification, are permitted provided that the following conditions
+ # * are met:
+ # *
+ # * . Redistributions of source code must retain the above copyright
+ # * notice, this list of conditions and the following disclaimer.
+ # * . Redistributions in binary form must reproduce the above copyright
+ # * notice, this list of conditions and the following disclaimer in
+ # * the documentation and/or other materials provided with the
+ # * distribution.
+ # * . Neither the name of the TaBE Project nor the names of its
+ # * contributors may be used to endorse or promote products derived
+ # * from this software without specific prior written permission.
+ # *
+ # * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ # * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ # * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ # * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ # * REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ # * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ # * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ # * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ # * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ # * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ # * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ # * OF THE POSSIBILITY OF SUCH DAMAGE.
+ # */
+ #
+ # /*
+ # * Copyright (c) 1999 Computer Systems and Communication Lab,
+ # * Institute of Information Science, Academia Sinica.
+ # * All rights reserved.
+ # *
+ # * Redistribution and use in source and binary forms, with or without
+ # * modification, are permitted provided that the following conditions
+ # * are met:
+ # *
+ # * . Redistributions of source code must retain the above copyright
+ # * notice, this list of conditions and the following disclaimer.
+ # * . Redistributions in binary form must reproduce the above copyright
+ # * notice, this list of conditions and the following disclaimer in
+ # * the documentation and/or other materials provided with the
+ # * distribution.
+ # * . Neither the name of the Computer Systems and Communication Lab
+ # * nor the names of its contributors may be used to endorse or
+ # * promote products derived from this software without specific
+ # * prior written permission.
+ # *
+ # * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ # * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ # * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ # * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ # * REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ # * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ # * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ # * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ # * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ # * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ # * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ # * OF THE POSSIBILITY OF SUCH DAMAGE.
+ # */
+ #
+ # Copyright 1996 Chih-Hao Tsai @ Beckman Institute, University of Illinois
+ # c-tsai4@uiuc.edu http://casper.beckman.uiuc.edu/~c-tsai4
+ #
+ # ---------------COPYING.libtabe-----END----------------------------------
+--
+ #
+ #
+ # ---------------COPYING.ipadic-----BEGIN---------------------------------
+---
+ #
+ # Copyright 2000, 2001, 2002, 2003 Nara Institute of Science
+ # and Technology. All Rights Reserved.
+ #
+ # Use, reproduction, and distribution of this software is permitted.
+ # Any copy of this software, whether in its original form or modified,
+ # must include both the above copyright notice and the following
+ # paragraphs.
+ #
+ # Nara Institute of Science and Technology (NAIST),
+ # the copyright holders, disclaims all warranties with regard to this
+ # software, including all implied warranties of merchantability and
+ # fitness, in no event shall NAIST be liable for
+ # any special, indirect or consequential damages or any damages
+ # whatsoever resulting from loss of use, data or profits, whether in an
+ # action of contract, negligence or other tortuous action, arising out
+ # of or in connection with the use or performance of this software.
+ #
+ # A large portion of the dictionary entries
+ # originate from ICOT Free Software. The following conditions for ICOT
+ # Free Software applies to the current dictionary as well.
+ #
+ # Each User may also freely distribute the Program, whether in its
+ # original form or modified, to any third party or parties, PROVIDED
+ # that the provisions of Section 3 ("NO WARRANTY") will ALWAYS appear
+ # on, or be attached to, the Program, which is distributed substantially
+ # in the same form as set out herein and that such intended
+ # distribution, if actually made, will neither violate or otherwise
+ # contravene any of the laws and regulations of the countries having
+ # jurisdiction over the User or the intended distribution itself.
+ #
+ # NO WARRANTY
+ #
+ # The program was produced on an experimental basis in the course of the
+ # research and development conducted during the project and is provided
+ # to users as so produced on an experimental basis. Accordingly, the
+ # program is provided without any warranty whatsoever, whether express,
+ # implied, statutory or otherwise. The term "warranty" used herein
+ # includes, but is not limited to, any warranty of the quality,
+ # performance, merchantability and fitness for a particular purpose of
+ # the program and the nonexistence of any infringement or violation of
+ # any right of any third party.
+ #
+ # Each user of the program will agree and understand, and be deemed to
+ # have agreed and understood, that there is no warranty whatsoever for
+ # the program and, accordingly, the entire risk arising from or
+ # otherwise connected with the program is assumed by the user.
+ #
+ # Therefore, neither ICOT, the copyright holder, or any other
+ # organization that participated in or was otherwise related to the
+ # development of the program and their respective officials, directors,
+ # officers and other employees shall be held liable for any and all
+ # damages, including, without limitation, general, special, incidental
+ # and consequential damages, arising out of or otherwise in connection
+ # with the use or inability to use the program or any product, material
+ # or result produced or otherwise obtained by using the program,
+ # regardless of whether they have been advised of, or otherwise had
+ # knowledge of, the possibility of such damages at any time during the
+ # project or thereafter. Each user will be deemed to have agreed to the
+ # foregoing by his or her commencement of use of the program. The term
+ # "use" as used herein includes, but is not limited to, the use,
+ # modification, copying and distribution of the program and the
+ # production of secondary products from the program.
+ #
+ # In the case where the program, whether in its original form or
+ # modified, was distributed or delivered to or received by a user from
+ # any person, organization or entity other than ICOT, unless it makes or
+ # grants independently of ICOT any specific warranty to the user in
+ # writing, such person, organization or entity, will also be exempted
+ # from and not be held liable to the user for any such damages as noted
+ # above as far as the program is concerned.
+ #
+ # ---------------COPYING.ipadic-----END-----------------------------------
+-
+
+3. Lao Word Break Dictionary Data (laodict.txt)
+
+ # Copyright (c) 2013 International Business Machines Corporation
+ # and others. All Rights Reserved.
+ #
+ # Project: http://code.google.com/p/lao-dictionary/
+ # Dictionary: http://lao-dictionary.googlecode.com/git/Lao-Dictionary.txt
+ # License: http://lao-dictionary.googlecode.com/git/Lao-Dictionary-LICE
+NSE.txt
+ # (copied below)
+ #
+ # This file is derived from the above dictionary, with slight modification
+s.
+ # ------------------------------------------------------------------------
+--------
+ # Copyright (C) 2013 Brian Eugene Wilson, Robert Martin Campbell.
+ # All rights reserved.
+ #
+ # Redistribution and use in source and binary forms, with or without modif
+ication,
+ # are permitted provided that the following conditions are met:
+ #
+ # Redistributions of source code must retain the above copyright n
+otice, this
+ # list of conditions and the following disclaimer. Redistributions
+ in binary
+ # form must reproduce the above copyright notice, this list of con
+ditions and
+ # the following disclaimer in the documentation and/or other mater
+ials
+ # provided with the distribution.
+ #
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND
+ # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IM
+PLIED
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LI
+ABLE FOR
+ # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL D
+AMAGES
+ # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVI
+CES;
+ # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+AND ON
+ # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS
+ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ # ------------------------------------------------------------------------
+--------
+
+4. Time Zone Database
+
+ ICU uses the public domain data and code derived from Time Zone
+ Database for its time zone support. The ownership of the TZ database is
+ explained in BCP 175: Procedure for Maintaining the Time Zone Database
+ section 7.
+
+ 7. Database Ownership
+
+ The TZ database itself is not an IETF Contribution or an IETF
+ document. Rather it is a pre-existing and regularly updated work
+ that is in the public domain, and is intended to remain in the public
+ domain. Therefore, BCPs 78 [RFC5378] and 79 [RFC3979] do not apply
+ to the TZ Database or contributions that individuals make to it.
+ Should any claims be made and substantiated against the TZ Database,
+ the organization that is providing the IANA Considerations defined in
+ this RFC, under the memorandum of understanding with the IETF,
+ currently ICANN, may act in accordance with all competent court
+ orders. No ownership claims will be made by ICANN or the IETF Trust
+ on the database or the code. Any person making a contribution to the
+ database or code waives all rights to future claims in that
+ contribution or in the TZ Database.
+
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (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.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is mozilla.org code.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2002
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+The JsonCpp library's source code, including accompanying documentation,
+tests and demonstration applications, are licensed under the following
+conditions...
+
+The author (Baptiste Lepilleur) explicitly disclaims copyright in all
+jurisdictions which recognize such a disclaimer. In such jurisdictions,
+this software is released into the Public Domain.
+
+In jurisdictions which do not recognize Public Domain property (e.g. Germany as of
+2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is
+released under the terms of the MIT License (see below).
+
+In jurisdictions which recognize Public Domain property, the user of this
+software may choose to accept it either as 1) Public Domain, 2) under the
+conditions of the MIT License (see below), or 3) under the terms of dual
+Public Domain/MIT License conditions described here, as they choose.
+
+The MIT License is about as close to Public Domain as a license can get, and is
+described in clear, concise terms at:
+
+ http://en.wikipedia.org/wiki/MIT_License
+
+The full text of the MIT License follows:
+
+========================================================================
+Copyright (c) 2007-2010 Baptiste Lepilleur
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use, copy,
+modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+========================================================================
+(END LICENSE TEXT)
+
+The MIT license is compatible with both the GPL and commercial
+software, affording one all of the rights of Public Domain with the
+minor nuisance of being required to keep the above copyright notice
+and license text in the source code. Note also that by accepting the
+Public Domain "license" you can re-license your copy using whatever
+license you like.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
+
+Copyright (c) 2007-2010 The Khronos Group Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and/or associated documentation files (the
+"Materials"), to deal in the Materials without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Materials, and to
+permit persons to whom the Materials are furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Materials.
+
+THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+
+
+SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
+
+Copyright (C) 1992 Silicon Graphics, Inc. All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice including the dates of first publication and either
+this permission notice or a reference to http://oss.sgi.com/projects/FreeB/
+shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL SILICON
+GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of Silicon Graphics, Inc. shall
+not be used in advertising or otherwise to promote the sale, use or other
+dealings in this Software without prior written authorization from Silicon
+Graphics, Inc.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+
+ * Neither the name of the copyright holders nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
+
+Copyright (c) 2011 The LevelDB Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+/*
+ * Copyright (c) 2008 NVIDIA, Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
+
+Copyright 2000-2007 Niels Provos <provos@citi.umich.edu>
+Copyright 2007-2009 Niels Provos and Nick Mathewson
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+3. The name of the author may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Copyright (c) 2013, Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * The name of the author may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+(Copied from the README.)
+
+--------------------------------------------------------------------------------
+
+The authors make NO WARRANTY or representation, either express or implied,
+with respect to this software, its quality, accuracy, merchantability, or
+fitness for a particular purpose. This software is provided "AS IS", and you,
+its user, assume the entire risk as to its quality and accuracy.
+
+This software is copyright (C) 1991-1998, Thomas G. Lane.
+All Rights Reserved except as specified below.
+
+Permission is hereby granted to use, copy, modify, and distribute this
+software (or portions thereof) for any purpose, without fee, subject to these
+conditions:
+(1) If any part of the source code for this software is distributed, then this
+README file must be included, with this copyright and no-warranty notice
+unaltered; and any additions, deletions, or changes to the original files
+must be clearly indicated in accompanying documentation.
+(2) If only executable code is distributed, then the accompanying
+documentation must state that "this software is based in part on the work of
+the Independent JPEG Group".
+(3) Permission for use of this software is granted only if the user accepts
+full responsibility for any undesirable consequences; the authors accept
+NO LIABILITY for damages of any kind.
+
+These conditions apply to any software derived from or based on the IJG code,
+not just to the unmodified library. If you use our work, you ought to
+acknowledge us.
+
+Permission is NOT granted for the use of any IJG author's name or company name
+in advertising or publicity relating to this software or products derived from
+it. This software may be referred to only as "the Independent JPEG Group's
+software".
+
+We specifically permit and encourage the use of this software as the basis of
+commercial products, provided that all warranty or liability claims are
+assumed by the product vendor.
+
+
+ansi2knr.c is included in this distribution by permission of L. Peter Deutsch,
+sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA.
+ansi2knr.c is NOT covered by the above copyright and conditions, but instead
+by the usual distribution terms of the Free Software Foundation; principally,
+that you must include source code if you redistribute it. (See the file
+ansi2knr.c for full details.) However, since ansi2knr.c is not needed as part
+of any program generated from the IJG code, this does not limit you more than
+the foregoing paragraphs do.
+
+The Unix configuration script "configure" was produced with GNU Autoconf.
+It is copyright by the Free Software Foundation but is freely distributable.
+The same holds for its supporting scripts (config.guess, config.sub,
+ltconfig, ltmain.sh). Another support script, install-sh, is copyright
+by M.I.T. but is also freely distributable.
+
+It appears that the arithmetic coding option of the JPEG spec is covered by
+patents owned by IBM, AT&T, and Mitsubishi. Hence arithmetic coding cannot
+legally be used without obtaining one or more licenses. For this reason,
+support for arithmetic coding has been removed from the free JPEG software.
+(Since arithmetic coding provides only a marginal gain over the unpatented
+Huffman mode, it is unlikely that very many implementations will support it.)
+So far as we are aware, there are no patent restrictions on the remaining
+code.
+
+The IJG distribution formerly included code to read and write GIF files.
+To avoid entanglement with the Unisys LZW patent, GIF reading support has
+been removed altogether, and the GIF writer has been simplified to produce
+"uncompressed GIFs". This technique does not use the LZW algorithm; the
+resulting GIF files are larger than usual, but are readable by all standard
+GIF decoders.
+
+We are required to state that
+ "The Graphics Interchange Format(c) is the Copyright property of
+ CompuServe Incorporated. GIF(sm) is a Service Mark property of
+ CompuServe Incorporated."
+
+libjpeg-turbo is licensed under a non-restrictive, BSD-style license
+(see README.) The TurboJPEG/OSS wrapper (both C and Java versions) and
+associated test programs bear a similar license, which is reproduced below:
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+- Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+- Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+- Neither the name of the libjpeg-turbo Project nor the names of its
+ contributors may be used to endorse or promote products derived from this
+ software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS",
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+Copyright (C) 2011 Google Inc.
+
+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 copy of the libpng notices is provided for your convenience. In case of
+any discrepancy between this copy and the notices in the file png.h that is
+included in the libpng distribution, the latter shall prevail.
+
+COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
+
+If you modify libpng you may insert additional notices immediately following
+this sentence.
+
+This code is released under the libpng license.
+
+libpng versions 1.2.6, August 15, 2004, through 1.2.45, July 7, 2011, are
+Copyright (c) 2004, 2006-2009 Glenn Randers-Pehrson, and are
+distributed according to the same disclaimer and license as libpng-1.2.5
+with the following individual added to the list of Contributing Authors
+
+ Cosmin Truta
+
+libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
+Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
+distributed according to the same disclaimer and license as libpng-1.0.6
+with the following individuals added to the list of Contributing Authors
+
+ Simon-Pierre Cadieux
+ Eric S. Raymond
+ Gilles Vollant
+
+and with the following additions to the disclaimer:
+
+ There is no warranty against interference with your enjoyment of the
+ library or against infringement. There is no warranty that our
+ efforts or the library will fulfill any of your particular purposes
+ or needs. This library is provided with all faults, and the entire
+ risk of satisfactory quality, performance, accuracy, and effort is with
+ the user.
+
+libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
+Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are
+distributed according to the same disclaimer and license as libpng-0.96,
+with the following individuals added to the list of Contributing Authors:
+
+ Tom Lane
+ Glenn Randers-Pehrson
+ Willem van Schaik
+
+libpng versions 0.89, June 1996, through 0.96, May 1997, are
+Copyright (c) 1996, 1997 Andreas Dilger
+Distributed according to the same disclaimer and license as libpng-0.88,
+with the following individuals added to the list of Contributing Authors:
+
+ John Bowler
+ Kevin Bracey
+ Sam Bushell
+ Magnus Holmgren
+ Greg Roelofs
+ Tom Tanner
+
+libpng versions 0.5, May 1995, through 0.88, January 1996, are
+Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
+
+For the purposes of this copyright and license, "Contributing Authors"
+is defined as the following set of individuals:
+
+ Andreas Dilger
+ Dave Martindale
+ Guy Eric Schalnat
+ Paul Schmidt
+ Tim Wegner
+
+The PNG Reference Library is supplied "AS IS". The Contributing Authors
+and Group 42, Inc. disclaim all warranties, expressed or implied,
+including, without limitation, the warranties of merchantability and of
+fitness for any purpose. The Contributing Authors and Group 42, Inc.
+assume no liability for direct, indirect, incidental, special, exemplary,
+or consequential damages, which may result from the use of the PNG
+Reference Library, even if advised of the possibility of such damage.
+
+Permission is hereby granted to use, copy, modify, and distribute this
+source code, or portions hereof, for any purpose, without fee, subject
+to the following restrictions:
+
+1. The origin of this source code must not be misrepresented.
+
+2. Altered versions must be plainly marked as such and must not
+ be misrepresented as being the original source.
+
+3. This Copyright notice may not be removed or altered from any
+ source or altered source distribution.
+
+The Contributing Authors and Group 42, Inc. specifically permit, without
+fee, and encourage the use of this source code as a component to
+supporting the PNG file format in commercial products. If you use this
+source code in a product, acknowledgment is not required but would be
+appreciated.
+
+
+A "png_get_copyright" function is available, for convenient use in "about"
+boxes and the like:
+
+ printf("%s",png_get_copyright(NULL));
+
+Also, the PNG logo (in PNG format, of course) is supplied in the
+files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
+
+Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a
+certification mark of the Open Source Initiative.
+
+Glenn Randers-Pehrson
+glennrp at users.sourceforge.net
+July 7, 2011
+
+/*
+ *
+ * Copyright (c) 2001-2006 Cisco Systems, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ *
+ * Neither the name of the Cisco Systems, Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sub license, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice (including the
+ next paragraph) shall be included in all copies or substantial portions
+ of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Copyright (c) 2010, The WebM Project authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ * Neither the name of Google, nor the WebM Project, nor the names
+ of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written
+ permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+Copyright (c) 2010, Google Inc. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ * Neither the name of Google nor the names of its contributors may
+ be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Additional IP Rights Grant (Patents)
+
+"This implementation" means the copyrightable works distributed by
+Google as part of the WebM Project.
+
+Google hereby grants to you a perpetual, worldwide, non-exclusive,
+no-charge, royalty-free, irrevocable (except as stated in this section)
+patent license to make, have made, use, offer to sell, sell, import,
+transfer, and otherwise run, modify and propagate the contents of this
+implementation of VP8, where such license applies only to those patent
+claims, both currently owned by Google and acquired in the future,
+licensable by Google that are necessarily infringed by this
+implementation of VP8. This grant does not include claims that would be
+infringed only as a consequence of further modification of this
+implementation. If you or your agent or exclusive licensee institute or
+order or agree to the institution of patent litigation against any
+entity (including a cross-claim or counterclaim in a lawsuit) alleging
+that this implementation of VP8 or any code incorporated within this
+implementation of VP8 constitutes direct or contributory patent
+infringement, or inducement of patent infringement, then any patent
+rights granted to you under this License for this implementation of VP8
+shall terminate as of the date such litigation is filed.
+
+Except where otherwise noted in the source code (e.g. the files hash.c,
+list.c and the trio files, which are covered by a similar licence but
+with different Copyright notices) all the files are:
+
+ Copyright (C) 1998-2003 Daniel Veillard. All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is fur-
+nished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
+NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+DANIEL VEILLARD BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON-
+NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of Daniel Veillard shall not
+be used in advertising or otherwise to promote the sale, use or other deal-
+ings in this Software without prior written authorization from him.
+
+
+Licence for libxslt except libexslt
+----------------------------------------------------------------------
+ Copyright (C) 2001-2002 Daniel Veillard. All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is fur-
+nished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
+NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+DANIEL VEILLARD BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON-
+NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of Daniel Veillard shall not
+be used in advertising or otherwise to promote the sale, use or other deal-
+ings in this Software without prior written authorization from him.
+
+----------------------------------------------------------------------
+
+Licence for libexslt
+----------------------------------------------------------------------
+ Copyright (C) 2001-2002 Thomas Broyer, Charlie Bozeman and Daniel Veillard.
+ All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is fur-
+nished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
+NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON-
+NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the authors shall not
+be used in advertising or otherwise to promote the sale, use or other deal-
+ings in this Software without prior written authorization from him.
+----------------------------------------------------------------------
+
+Copyright 2011 The LibYuv Project Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ * Neither the name of Google nor the names of its contributors may
+ be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+LZMA SDK is placed in the public domain.
+
+Copyright (c) 2003-2012 Jonathan 'Wolf' Rentzsch: http://rentzsch.com
+Some rights reserved: http://opensource.org/licenses/mit
+
+mach_override includes a copy of libudis86, licensed as follows:
+
+Copyright (c) 2002-2009 Vivek Thampi
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Copyright 2007, 2008 The Python Markdown Project (v. 1.7 and later)
+Copyright 2004, 2005, 2006 Yuri Takhteyev (v. 0.2-1.6b)
+Copyright 2004 Manfred Stienstra (the original version)
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+* Neither the name of the <organization> nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE PYTHON MARKDOWN PROJECT ''AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL ANY CONTRIBUTORS TO THE PYTHON MARKDOWN PROJECT
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+
+The default Mesa license is as follows:
+
+Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+
+Some parts of Mesa are copyrighted under the GNU LGPL. See the
+Mesa/docs/COPYRIGHT file for details.
+
+The following is the standard GNU copyright file.
+----------------------------------------------------------------------
+
+
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL. It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it. You can use it for
+your libraries, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library. If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software. To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+ Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs. This
+license, the GNU Library General Public License, applies to certain
+designated libraries. This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+ The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it. Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program. However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+ Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries. We
+concluded that weaker conditions might promote sharing better.
+
+ However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves. This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them. (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.) The hope is that this
+will lead to faster development of free libraries.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+ Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License"). Each licensee is
+addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ c) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ d) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free
+ Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
+ * MODP_B64 - High performance base64 encoder/decoder
+ * Version 1.3 -- 17-Mar-2006
+ * http://modp.com/release/base64
+ *
+ * Copyright (c) 2005, 2006 Nick Galbreath -- nickg [at] modp [dot] com
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * Neither the name of the modp.com nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Copyright 2008 MolokoCacao
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted providing that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+Copyright 2010-2011, Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+* Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (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.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is mozilla.org code.
+ *
+ * The Initial Developer of the Original Code is
+ * Netscape Communications Corporation.
+ * Portions created by the Initial Developer are Copyright (C) 2002
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+ A C-program for MT19937, with initialization improved 2002/1/26.
+ Coded by Takuji Nishimura and Makoto Matsumoto.
+
+ Before using, initialize the state by using init_genrand(seed)
+ or init_by_array(init_key, key_length).
+
+ Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ 3. The names of its contributors may not be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Version: MPL 1.1/GPL 2.0/LGPL 2.1
+
+The contents of this file are subject to the Mozilla Public License Version
+1.1 (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.mozilla.org/MPL/
+
+Software distributed under the License is distributed on an "AS IS" basis,
+WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+for the specific language governing rights and limitations under the
+License.
+
+The Original Code is mozilla.org code.
+
+The Initial Developer of the Original Code is
+Netscape Communications Corporation.
+Portions created by the Initial Developer are Copyright (C) 1998
+the Initial Developer. All Rights Reserved.
+
+Contributor(s):
+
+Alternatively, the contents of this file may be used under the terms of
+either the GNU General Public License Version 2 or later (the "GPL"), or
+the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+in which case the provisions of the GPL or the LGPL are applicable instead
+of those above. If you wish to allow use of your version of this file only
+under the terms of either the GPL or the LGPL, and not to allow others to
+use your version of this file under the terms of the MPL, indicate your
+decision by deleting the provisions above and replace them with the notice
+and other provisions required by the GPL or the LGPL. If you do not delete
+the provisions above, a recipient may use your version of this file under
+the terms of any one of the MPL, the GPL or the LGPL.
+
+
+ Copyright (c) 2004-2012 by Mulle Kybernetik. All rights reserved.
+
+ Permission to use, copy, modify and distribute this software and its documentation
+ is hereby granted, provided that both the copyright notice and this permission
+ notice appear in all copies of the software, derivative works or modified versions,
+ and any portions thereof, and that both notices appear in supporting documentation,
+ and that credit is given to Mulle Kybernetik in all documents and publicity
+ pertaining to direct or indirect use of this code or its derivatives.
+
+ THIS IS EXPERIMENTAL SOFTWARE AND IT IS KNOWN TO HAVE BUGS, SOME OF WHICH MAY HAVE
+ SERIOUS CONSEQUENCES. THE COPYRIGHT HOLDER ALLOWS FREE USE OF THIS SOFTWARE IN ITS
+ "AS IS" CONDITION. THE COPYRIGHT HOLDER DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY
+ DAMAGES WHATSOEVER RESULTING DIRECTLY OR INDIRECTLY FROM THE USE OF THIS SOFTWARE
+ OR OF ANY DERIVATIVE WORK.
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file in the root of the source tree. All
+contributing project authors may be found in the AUTHORS file in the
+root of the source tree.
+
+The files were originally licensed by ARM Limited.
+
+The following files:
+
+ * dl/api/omxtypes.h
+ * dl/sp/api/omxSP.h
+
+are licensed by Khronos:
+
+Copyright © 2005-2008 The Khronos Group Inc. All Rights Reserved.
+
+These materials are protected by copyright laws and contain material
+proprietary to the Khronos Group, Inc. You may use these materials
+for implementing Khronos specifications, without altering or removing
+any trademark, copyright or other notice from the specification.
+
+Khronos Group makes no, and expressly disclaims any, representations
+or warranties, express or implied, regarding these materials, including,
+without limitation, any implied warranties of merchantability or fitness
+for a particular purpose or non-infringement of any intellectual property.
+Khronos Group makes no, and expressly disclaims any, warranties, express
+or implied, regarding the correctness, accuracy, completeness, timeliness,
+and reliability of these materials.
+
+Under no circumstances will the Khronos Group, or any of its Promoters,
+Contributors or Members or their respective partners, officers, directors,
+employees, agents or representatives be liable for any damages, whether
+direct, indirect, special or consequential damages for lost revenues,
+lost profits, or otherwise, arising from or in connection with these
+materials.
+
+Khronos and OpenMAX are trademarks of the Khronos Group Inc.
+
+Copyright 2001-2011 Xiph.Org, Skype Limited, Octasic,
+ Jean-Marc Valin, Timothy B. Terriberry,
+ CSIRO, Gregory Maxwell, Mark Borgerding,
+ Erik de Castro Lopo
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+- Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+- Neither the name of Internet Society, IETF or IETF Trust, nor the
+names of specific contributors, may be used to endorse or promote
+products derived from this software without specific prior written
+permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Opus is subject to the royalty-free patent licenses which are
+specified at:
+
+Xiph.Org Foundation:
+https://datatracker.ietf.org/ipr/1524/
+
+Microsoft Corporation:
+https://datatracker.ietf.org/ipr/1914/
+
+Broadcom Corporation:
+https://datatracker.ietf.org/ipr/1526/
+
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+PLY (Python Lex-Yacc) Version 3.4
+
+Copyright (C) 2001-2011,
+David M. Beazley (Dabeaz LLC)
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of the David Beazley or Dabeaz LLC may be used to
+ endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+// Copyright (c) 2012 The Polymer Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Copyright (c) 2012 The Polymer Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Copyright (c) 2014, Intel Corporation
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Intel Corporation nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+Copyright 2008, Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Code generated by the Protocol Buffer compiler is owned by the owner
+of the input file used when generating it. This code is not
+standalone and requires a support library to be linked with it. This
+support library is itself covered by the above license.
+
+Copyright (c) 2003-2012, Michael Foord
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+qcms
+Copyright (C) 2009 Mozilla Corporation
+Copyright (C) 1998-2007 Marti Maria
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Copyright 2014 jQuery Foundation and other contributors
+http://jquery.com/
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+// Copyright (c) 2009 The RE2 Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Copyright 2010 Arc90 Inc
+
+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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2011 Google Inc. All Rights Reserved.
+
+ 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.
+
+
+Copyright (c) 2006 Bob Ippolito
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+(The BSD License)
+
+Copyright (c) 2010-2014, Christian Johansen, christian@cjohansen.no
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the name of Christian Johansen nor the names of his contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Copyright (c) 2011 Google Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+All MurmurHash source files are placed in the public domain.
+
+The license below applies to all other code in SMHasher:
+
+Copyright (c) 2011 Google, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+Copyright 2002-2008 Xiph.org Foundation
+Copyright 2002-2008 Jean-Marc Valin
+Copyright 2005-2007 Analog Devices Inc.
+Copyright 2005-2008 Commonwealth Scientific and Industrial Research
+ Organisation (CSIRO)
+Copyright 1993, 2002, 2006 David Rowe
+Copyright 2003 EpicGames
+Copyright 1992-1994 Jutta Degener, Carsten Bormann
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+- Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+- Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+- Neither the name of the Xiph.org Foundation nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+The author disclaims copyright to this source code. In place of
+a legal notice, here is a blessing:
+
+ May you do good and not evil.
+ May you find forgiveness for yourself and forgive others.
+ May you share freely, never taking more than you give.
+
+SWIG is distributed under the following terms:
+
+I.
+
+Copyright (c) 1995-1998
+The University of Utah and the Regents of the University of California
+All Rights Reserved
+
+Permission is hereby granted, without written agreement and without
+license or royalty fees, to use, copy, modify, and distribute this
+software and its documentation for any purpose, provided that
+(1) The above copyright notice and the following two paragraphs
+appear in all copies of the source code and (2) redistributions
+including binaries reproduces these notices in the supporting
+documentation. Substantial modifications to this software may be
+copyrighted by their authors and need not follow the licensing terms
+described here, provided that the new terms are clearly indicated in
+all files where they apply.
+
+IN NO EVENT SHALL THE AUTHOR, THE UNIVERSITY OF CALIFORNIA, THE
+UNIVERSITY OF UTAH OR DISTRIBUTORS OF THIS SOFTWARE BE LIABLE TO ANY
+PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION,
+EVEN IF THE AUTHORS OR ANY OF THE ABOVE PARTIES HAVE BEEN ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGE.
+
+THE AUTHOR, THE UNIVERSITY OF CALIFORNIA, AND THE UNIVERSITY OF UTAH
+SPECIFICALLY DISCLAIM ANY WARRANTIES,INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND
+THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+
+
+II.
+
+This software includes contributions that are Copyright (c) 1998-2005
+University of Chicago.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer. Redistributions
+in binary form must reproduce the above copyright notice, this list of
+conditions and the following disclaimer in the documentation and/or
+other materials provided with the distribution. Neither the name of
+the University of Chicago nor the names of its contributors may be
+used to endorse or promote products derived from this software without
+specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF CHICAGO AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF
+CHICAGO OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+III.
+
+This software includes contributions that are Copyright (c) 2005-2006
+Arizona Board of Regents (University of Arizona).
+All Rights Reserved
+
+Permission is hereby granted, without written agreement and without
+license or royalty fees, to use, copy, modify, and distribute this
+software and its documentation for any purpose, provided that
+(1) The above copyright notice and the following two paragraphs
+appear in all copies of the source code and (2) redistributions
+including binaries reproduces these notices in the supporting
+documentation. Substantial modifications to this software may be
+copyrighted by their authors and need not follow the licensing terms
+described here, provided that the new terms are clearly indicated in
+all files where they apply.
+
+THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF ARIZONA AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF
+ARIZONA OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+// Copyright (c) 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+TLS Lite includes code from different sources. All code is either dedicated to
+the public domain by its authors, or available under a BSD-style license. In
+particular:
+
+-
+
+Code written by Trevor Perrin, Kees Bos, Sam Rushing, Dimitris Moraitis,
+Marcelo Fernandez, Martin von Loewis, and Dave Baggett is available under the
+following terms:
+
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or distribute
+this software, either in source code form or as a compiled binary, for any
+purpose, commercial or non-commercial, and by any means.
+
+In jurisdictions that recognize copyright laws, the author or authors of this
+software dedicate any and all copyright interest in the software to the public
+domain. We make this dedication for the benefit of the public at large and to
+the detriment of our heirs and successors. We intend this dedication to be an
+overt act of relinquishment in perpetuity of all present and future rights to
+this software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+-
+
+Code written by Bram Cohen (rijndael.py) was dedicated to the public domain by
+its author. See rijndael.py for details.
+
+-
+
+Code written by Google is available under the following terms:
+
+Copyright (c) 2008, The Chromium Authors
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ * Neither the name of the Google Inc. nor the names of its contributors may
+ be used to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Copyright (c) 2012, Linux USB Project
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+o Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+o Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+o Neither the name of the Linux USB Project nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+(Copied from the COPYRIGHT file of
+https://code.google.com/p/sctp-refimpl/source/browse/trunk/COPYRIGHT)
+--------------------------------------------------------------------------------
+
+Copyright (c) 2001, 2002 Cisco Systems, Inc.
+Copyright (c) 2002-12 Randall R. Stewart
+Copyright (c) 2002-12 Michael Tuexen
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+Copyright (c) 2011, The WebRTC project authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ * Neither the name of Google nor the names of its contributors may
+ be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+ Apache License
+ Version 2.0, January 2010
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
+
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+;*****************************************************************************
+;* x86inc.asm
+;*****************************************************************************
+;* Copyright (C) 2005-2011 x264 project
+;*
+;* Authors: Loren Merritt <lorenm@u.washington.edu>
+;* Anton Mitrofanov <BugMaster@narod.ru>
+;* Jason Garrett-Glaser <darkshikari@gmail.com>
+;*
+;* Permission to use, copy, modify, and/or distribute this software for any
+;* purpose with or without fee is hereby granted, provided that the above
+;* copyright notice and this permission notice appear in all copies.
+;*
+;* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+;* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+;* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+;* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+;* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+;* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+;* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+;*****************************************************************************
+
+; This is a header file for the x264ASM assembly language, which uses
+; NASM/YASM syntax combined with a large number of macros to provide easy
+; abstraction between different calling conventions (x86_32, win64, linux64).
+; It also has various other useful features to simplify writing the kind of
+; DSP functions that are most often used in x264.
+
+; Unlike the rest of x264, this file is available under an ISC license, as it
+; has significant usefulness outside of x264 and we want it to be available
+; to the largest audience possible. Of course, if you modify it for your own
+; purposes to add a new feature, we strongly encourage contributing a patch
+; as this feature might be useful for others as well. Send patches or ideas
+; to x264-devel@videolan.org .
+
+Yasm is Copyright (c) 2001-2010 Peter Johnson and other Yasm developers.
+
+Yasm developers and/or contributors include:
+ Peter Johnson
+ Michael Urman
+ Brian Gladman (Visual Studio build files, other fixes)
+ Stanislav Karchebny (options parser)
+ Mathieu Monnier (SSE4 instruction patches, NASM preprocessor additions)
+ Anonymous "NASM64" developer (NASM preprocessor fixes)
+ Stephen Polkowski (x86 instruction patches)
+ Henryk Richter (Mach-O object format)
+ Ben Skeggs (patches, bug reports)
+ Alexei Svitkine (GAS preprocessor)
+ Samuel Thibault (TASM parser and frontend)
+
+-----------------------------------
+Yasm licensing overview and summary
+-----------------------------------
+
+Note: This document does not provide legal advice nor is it the actual
+license of any part of Yasm. See the individual licenses for complete
+details. Consult a lawyer for legal advice.
+
+The primary license of Yasm is the 2-clause BSD license. Please use this
+license if you plan on submitting code to the project.
+
+Yasm has absolutely no warranty; not even for merchantibility or fitness
+for a particular purpose.
+
+-------
+Libyasm
+-------
+Libyasm is 2-clause or 3-clause BSD licensed, with the exception of
+bitvect, which is triple-licensed under the Artistic license, GPL, and
+LGPL. Libyasm is thus GPL and LGPL compatible. In addition, this also
+means that libyasm is free for binary-only distribution as long as the
+terms of the 3-clause BSD license and Artistic license (as it applies to
+bitvect) are fulfilled.
+
+-------
+Modules
+-------
+The modules are 2-clause or 3-clause BSD licensed.
+
+---------
+Frontends
+---------
+The frontends are 2-clause BSD licensed.
+
+-------------
+License Texts
+-------------
+The full text of all licenses are provided in separate files in the source
+distribution. Each source file may include the entire license (in the case
+of the BSD and Artistic licenses), or may reference the GPL or LGPL license
+file.
+
+BSD.txt - 2-clause and 3-clause BSD licenses
+Artistic.txt - Artistic license
+GNU_GPL-2.0 - GNU General Public License
+GNU_LGPL-2.0 - GNU Library General Public License
+
+/* zlib.h -- interface of the 'zlib' general purpose compression library
+ version 1.2.4, March 14th, 2010
+
+ Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jean-loup Gailly
+ Mark Adler
+
+*/
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2011 Marco Braak
+
+ 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.
+
+Copyright (c) 2011, The WebRTC project authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ * Neither the name of Google nor the names of its contributors may
+ be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+Copyright (c) 2001-2013 Chris Liechti <cliechti@gmx.net>;
+All Rights Reserved.
+
+This is the Python license. In short, you can use this product in
+commercial and non-commercial applications, modify it, redistribute it.
+A notification to the author when you use and/or modify it is welcome.
+
+
+TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING THIS SOFTWARE
+===================================================================
+
+LICENSE AGREEMENT
+-----------------
+
+1. This LICENSE AGREEMENT is between the copyright holder of this
+product, and the Individual or Organization ("Licensee") accessing
+and otherwise using this product in source or binary form and its
+associated documentation.
+
+2. Subject to the terms and conditions of this License Agreement,
+the copyright holder hereby grants Licensee a nonexclusive,
+royalty-free, world-wide license to reproduce, analyze, test,
+perform and/or display publicly, prepare derivative works, distribute,
+and otherwise use this product alone or in any derivative version,
+provided, however, that copyright holders License Agreement and
+copyright holders notice of copyright are retained in this product
+alone or in any derivative version prepared by Licensee.
+
+3. In the event Licensee prepares a derivative work that is based on
+or incorporates this product or any part thereof, and wants to make
+the derivative work available to others as provided herein, then
+Licensee hereby agrees to include in any such work a brief summary of
+the changes made to this product.
+
+4. The copyright holder is making this product available to Licensee on
+an "AS IS" basis. THE COPYRIGHT HOLDER MAKES NO REPRESENTATIONS OR
+WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION,
+THE COPYRIGHT HOLDER MAKES NO AND DISCLAIMS ANY REPRESENTATION OR
+WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR
+THAT THE USE OF THIS PRODUCT WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
+
+5. THE COPYRIGHT HOLDER SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER
+USERS OF THIS PRODUCT FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL
+DAMAGES OR LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE
+USING THIS PRODUCT, OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE
+POSSIBILITY THEREOF.
+
+6. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
+
+7. Nothing in this License Agreement shall be deemed to create any
+relationship of agency, partnership, or joint venture between the
+copyright holder and Licensee. This License Agreement does not grant
+permission to use trademarks or trade names from the copyright holder
+in a trademark sense to endorse or promote products or services of
+Licensee, or any third party.
+
+8. By copying, installing or otherwise using this product, Licensee
+agrees to be bound by the terms and conditions of this License
+Agreement.
+
+
+Copyright 2007, Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+-------------------------------------------------------------------------------
+
+The file url_parse.cc is based on nsURLParsers.cc from Mozilla. This file is
+licensed separately as follows:
+
+The contents of this file are subject to the Mozilla Public License Version
+1.1 (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.mozilla.org/MPL/
+
+Software distributed under the License is distributed on an "AS IS" basis,
+WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+for the specific language governing rights and limitations under the
+License.
+
+The Original Code is mozilla.org code.
+
+The Initial Developer of the Original Code is
+Netscape Communications Corporation.
+Portions created by the Initial Developer are Copyright (C) 1998
+the Initial Developer. All Rights Reserved.
+
+Contributor(s):
+ Darin Fisher (original author)
+
+Alternatively, the contents of this file may be used under the terms of
+either the GNU General Public License Version 2 or later (the "GPL"), or
+the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+in which case the provisions of the GPL or the LGPL are applicable instead
+of those above. If you wish to allow use of your version of this file only
+under the terms of either the GPL or the LGPL, and not to allow others to
+use your version of this file under the terms of the MPL, indicate your
+decision by deleting the provisions above and replace them with the notice
+and other provisions required by the GPL or the LGPL. If you do not delete
+the provisions above, a recipient may use your version of this file under
+the terms of any one of the MPL, the GPL or the LGPL.
+
+This license applies to all parts of V8 that are not externally
+maintained libraries. The externally maintained libraries used by V8
+are:
+
+ - PCRE test suite, located in
+ test/mjsunit/third_party/regexp-pcre.js. This is based on the
+ test suite from PCRE-7.3, which is copyrighted by the University
+ of Cambridge and Google, Inc. The copyright notice and license
+ are embedded in regexp-pcre.js.
+
+ - Layout tests, located in test/mjsunit/third_party. These are
+ based on layout tests from webkit.org which are copyrighted by
+ Apple Computer, Inc. and released under a 3-clause BSD license.
+
+ - Strongtalk assembler, the basis of the files assembler-arm-inl.h,
+ assembler-arm.cc, assembler-arm.h, assembler-ia32-inl.h,
+ assembler-ia32.cc, assembler-ia32.h, assembler-x64-inl.h,
+ assembler-x64.cc, assembler-x64.h, assembler-mips-inl.h,
+ assembler-mips.cc, assembler-mips.h, assembler.cc and assembler.h.
+ This code is copyrighted by Sun Microsystems Inc. and released
+ under a 3-clause BSD license.
+
+ - Valgrind client API header, located at third_party/valgrind/valgrind.h
+ This is release under the BSD license.
+
+These libraries have their own licenses; we recommend you read them,
+as their terms may differ from the terms below.
+
+Copyright 2014, the V8 project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Copyright (C) 1993-2004 by Sun Microsystems, Inc. All rights reserved.
+
+Developed at SunSoft, a Sun Microsystems, Inc. business.
+Permission to use, copy, modify, and distribute this
+software is freely granted, provided that this notice
+is preserved.
+
+============================================================
+Notices for file(s):
+/lib/libpng.a
+------------------------------------------------------------
+
+This copy of the libpng notices is provided for your convenience. In case of
+any discrepancy between this copy and the notices in the file png.h that is
+included in the libpng distribution, the latter shall prevail.
+
+COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
+
+If you modify libpng you may insert additional notices immediately following
+this sentence.
+
+This code is released under the libpng license.
+
+libpng versions 1.2.6, August 15, 2004, through 1.6.3, July 18, 2013, are
+Copyright (c) 2004, 2006-2013 Glenn Randers-Pehrson, and are
+distributed according to the same disclaimer and license as libpng-1.2.5
+with the following individual added to the list of Contributing Authors
+
+ Cosmin Truta
+
+libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
+Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
+distributed according to the same disclaimer and license as libpng-1.0.6
+with the following individuals added to the list of Contributing Authors
+
+ Simon-Pierre Cadieux
+ Eric S. Raymond
+ Gilles Vollant
+
+and with the following additions to the disclaimer:
+
+ There is no warranty against interference with your enjoyment of the
+ library or against infringement. There is no warranty that our
+ efforts or the library will fulfill any of your particular purposes
+ or needs. This library is provided with all faults, and the entire
+ risk of satisfactory quality, performance, accuracy, and effort is with
+ the user.
+
+libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
+Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are
+distributed according to the same disclaimer and license as libpng-0.96,
+with the following individuals added to the list of Contributing Authors:
+
+ Tom Lane
+ Glenn Randers-Pehrson
+ Willem van Schaik
+
+libpng versions 0.89, June 1996, through 0.96, May 1997, are
+Copyright (c) 1996, 1997 Andreas Dilger
+Distributed according to the same disclaimer and license as libpng-0.88,
+with the following individuals added to the list of Contributing Authors:
+
+ John Bowler
+ Kevin Bracey
+ Sam Bushell
+ Magnus Holmgren
+ Greg Roelofs
+ Tom Tanner
+
+libpng versions 0.5, May 1995, through 0.88, January 1996, are
+Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
+
+For the purposes of this copyright and license, "Contributing Authors"
+is defined as the following set of individuals:
+
+ Andreas Dilger
+ Dave Martindale
+ Guy Eric Schalnat
+ Paul Schmidt
+ Tim Wegner
+
+The PNG Reference Library is supplied "AS IS". The Contributing Authors
+and Group 42, Inc. disclaim all warranties, expressed or implied,
+including, without limitation, the warranties of merchantability and of
+fitness for any purpose. The Contributing Authors and Group 42, Inc.
+assume no liability for direct, indirect, incidental, special, exemplary,
+or consequential damages, which may result from the use of the PNG
+Reference Library, even if advised of the possibility of such damage.
+
+Permission is hereby granted to use, copy, modify, and distribute this
+source code, or portions hereof, for any purpose, without fee, subject
+to the following restrictions:
+
+1. The origin of this source code must not be misrepresented.
+
+2. Altered versions must be plainly marked as such and must not
+ be misrepresented as being the original source.
+
+3. This Copyright notice may not be removed or altered from any
+ source or altered source distribution.
+
+The Contributing Authors and Group 42, Inc. specifically permit, without
+fee, and encourage the use of this source code as a component to
+supporting the PNG file format in commercial products. If you use this
+source code in a product, acknowledgment is not required but would be
+appreciated.
+
+
+A "png_get_copyright" function is available, for convenient use in "about"
+boxes and the like:
+
+ printf("%s",png_get_copyright(NULL));
+
+Also, the PNG logo (in PNG format, of course) is supplied in the
+files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
+
+Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a
+certification mark of the Open Source Initiative.
+
+Glenn Randers-Pehrson
+glennrp at users.sourceforge.net
+July 18, 2013
+
+============================================================
+Notices for file(s):
+/lib/libf2fs_fmt_host_dyn.so
+------------------------------------------------------------
+The tools for F2FS are covered by GNU Public License version 2.
+Exceptionally, the following files are also covered by the GNU Lesser General
+Public License Version 2.1 as the dual licenses.
+- include/f2fs_fs.h
+- lib/libf2fs.c
+- lib/libf2fs_io.c
+- mkfs/f2fs_format.c
+- mkfs/f2fs_format_main.c
+- mkfs/f2fs_format_utils.c
+- mkfs/f2fs_format_utils.h
+
+================================================================================
+Copyright (c) 2012 Samsung Electronics Co., Ltd.
+ http://www.samsung.com/
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License version 2 as
+published by the Free Software Foundation.
+
+================================================================================
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
+================================================================================
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+============================================================
+Notices for file(s):
+/framework/doclava.jar
+------------------------------------------------------------
+
+ Copyright (C) 2010 Google Inc.
+
+ 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.
+
+
+======================================================================
+
+jQuery 1.2.6 - New Wave Javascript
+
+Copyright (c) 2008 John Resig (jquery.com)
+Dual licensed under the MIT (MIT-LICENSE.txt)
+and GPL (GPL-LICENSE.txt) licenses.
+
+Copyright (c) 2009 John Resig, http://jquery.com/
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+============================================================
+Notices for file(s):
+/bin/sqlite3
+/lib/libsqlite.so
+------------------------------------------------------------
+2001 September 15
+
+The author disclaims copyright to this source code. In place of
+a legal notice, here is a blessing:
+
+ May you do good and not evil.
+ May you find forgiveness for yourself and forgive others.
+ May you share freely, never taking more than you give.
+
+
+============================================================
+Notices for file(s):
+/lib/libcrypto-host.so
+/lib/libcrypto_static.a
+/lib/libssl-host.so
+/lib64/libcrypto-host.so
+------------------------------------------------------------
+
+ LICENSE ISSUES
+ ==============
+
+ The OpenSSL toolkit stays under a dual license, i.e. both the conditions of
+ the OpenSSL License and the original SSLeay license apply to the toolkit.
+ See below for the actual license texts. Actually both licenses are BSD-style
+ Open Source licenses. In case of any license issues related to OpenSSL
+ please contact openssl-core@openssl.org.
+
+ OpenSSL License
+ ---------------
+
+/* ====================================================================
+ * Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this
+ * software must display the following acknowledgment:
+ * "This product includes software developed by the OpenSSL Project
+ * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
+ *
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
+ * endorse or promote products derived from this software without
+ * prior written permission. For written permission, please contact
+ * openssl-core@openssl.org.
+ *
+ * 5. Products derived from this software may not be called "OpenSSL"
+ * nor may "OpenSSL" appear in their names without prior written
+ * permission of the OpenSSL Project.
+ *
+ * 6. Redistributions of any form whatsoever must retain the following
+ * acknowledgment:
+ * "This product includes software developed by the OpenSSL Project
+ * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This product includes cryptographic software written by Eric Young
+ * (eay@cryptsoft.com). This product includes software written by Tim
+ * Hudson (tjh@cryptsoft.com).
+ *
+ */
+
+ Original SSLeay License
+ -----------------------
+
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ *
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to. The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code. The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ *
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * "This product includes cryptographic software written by
+ * Eric Young (eay@cryptsoft.com)"
+ * The word 'cryptographic' can be left out if the rouines from the library
+ * being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from
+ * the apps directory (application code) you must include an acknowledgement:
+ * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed. i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ */
+
+
+============================================================
+Notices for file(s):
+/lib/libexpat-host.so
+/lib/libexpat.a
+/lib64/libexpat-host.so
+------------------------------------------------------------
+Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
+ and Clark Cooper
+Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+============================================================
+Notices for file(s):
+/framework/emmalib.jar
+------------------------------------------------------------
+Common Public License - v 1.0
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S
+ACCEPTANCE OF THIS AGREEMENT.
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+ a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
+ b) in the case of each subsequent Contributor:
+
+ i) changes to the Program, and
+
+ ii) additions to the Program;
+
+ where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was
+added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules
+of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
+
+"Program" means the Contributions distributed in accordance with this Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
+
+2. GRANT OF RIGHTS
+
+ a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative
+works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
+
+ b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make,
+use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the
+combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
+
+ c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the
+Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other
+entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole
+responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the
+Program, it is Recipient's responsibility to acquire that license before distributing the Program.
+
+ d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this
+Agreement.
+
+3. REQUIREMENTS
+
+A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
+
+ a) it complies with the terms and conditions of this Agreement; and
+
+ b) its license agreement:
+
+ i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement,
+and implied warranties or conditions of merchantability and fitness for a particular purpose;
+
+ ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost
+profits;
+
+ iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
+
+ iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium
+customarily used for software exchange.
+
+When the Program is made available in source code form:
+
+ a) it must be made available under this Agreement; and
+
+ b) a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained within the Program.
+
+Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the
+Contribution.
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the
+commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other
+Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify
+every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a
+third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a
+commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to
+qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate
+with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor
+then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this
+section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
+WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for
+determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to
+the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this
+Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
+
+If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any
+patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes
+patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a
+reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the
+Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and
+survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following
+manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the
+right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new
+version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under
+which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new
+version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement,
+whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
+
+This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal
+action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
+
+============================================================
+Notices for file(s):
+/lib/liblog.a
+/lib/liblog.so
+/lib64/liblog.a
+/lib64/liblog.so
+------------------------------------------------------------
+
+ Copyright (c) 2005-2014, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+
+============================================================
+Notices for file(s):
+/lib/libselinux.a
+------------------------------------------------------------
+This library (libselinux) is public domain software, i.e. not copyrighted.
+
+Warranty Exclusion
+------------------
+You agree that this software is a
+non-commercially developed program that may contain "bugs" (as that
+term is used in the industry) and that it may not function as intended.
+The software is licensed "as is". NSA makes no, and hereby expressly
+disclaims all, warranties, express, implied, statutory, or otherwise
+with respect to the software, including noninfringement and the implied
+warranties of merchantability and fitness for a particular purpose.
+
+Limitation of Liability
+-----------------------
+In no event will NSA be liable for any damages, including loss of data,
+lost profits, cost of cover, or other special, incidental,
+consequential, direct or indirect damages arising from the software or
+the use thereof, however caused and on any theory of liability. This
+limitation will apply even if NSA has been advised of the possibility
+of such damage. You acknowledge that this is a reasonable allocation of
+risk.
+
+============================================================
+Notices for file(s):
+/framework/org-netbeans-api-visual.jar
+/framework/org-openide-util.jar
+------------------------------------------------------------
+The GNU General Public License (GPL) Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+
+59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away
+your freedom to share and change it. By contrast, the GNU
+General Public License is intended to guarantee your freedom
+to share and change free software--to make sure the software
+is free for all its users. This General Public License
+applies to most of the Free Software Foundation's software
+and to any other program whose authors commit to using it.
+(Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can
+apply it to your programs, too. When we speak of free
+software, we are referring to freedom, not price. Our
+General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and
+charge for this service if you wish), that you receive
+source code or can get it if you want it, that you can
+change the software or use pieces of it in new free
+programs; and that you know you can do these things. To
+protect your rights, we need to make restrictions that
+forbid anyone to deny you these rights or to ask you to
+surrender the rights. These restrictions translate to
+certain responsibilities for you if you distribute copies of
+the software, or if you modify it.
+
+For example, if you distribute copies of such a program,
+whether gratis or for a fee, you must give the recipients
+all the rights that you have. You must make sure that they,
+too, receive or can get the source code. And you must show
+them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the
+software, and (2) offer you this license which gives you
+legal permission to copy, distribute and/or modify the
+software.
+
+Also, for each author's protection and ours, we want to make
+certain that everyone understands that there is no warranty
+for this free software. If the software is modified by
+someone else and passed on, we want its recipients to know
+that what they have is not the original, so that any
+problems introduced by others will not reflect on the
+original authors' reputations.
+
+Finally, any free program is threatened constantly by
+software patents. We wish to avoid the danger that
+redistributors of a free program will individually obtain
+patent licenses, in effect making the program proprietary.
+To prevent this, we have made it clear that any patent must
+be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution
+and modification follow.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND
+MODIFICATION
+
+0. This License applies to any program or other work which
+contains a notice placed by the copyright holder saying it
+may be distributed under the terms of this General Public
+License. The "Program", below, refers to any such program or
+work, and a "work based on the Program" means either the
+Program or any derivative work under copyright law: that is
+to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into
+another language. (Hereinafter, translation is included
+without limitation in the term "modification".) Each
+licensee is addressed as "you".
+
+Activities other than copying, distribution and modification
+are not covered by this License; they are outside its scope.
+The act of running the Program is not restricted, and the
+output from the Program is covered only if its contents
+constitute a work based on the Program (independent of
+having been made by running the Program). Whether that is
+true depends on what the Program does.
+
+1. You may copy and distribute verbatim copies of the
+Program's source code as you receive it, in any medium,
+provided that you conspicuously and appropriately publish on
+each copy an appropriate copyright notice and disclaimer of
+warranty; keep intact all the notices that refer to this
+License and to the absence of any warranty; and give any
+other recipients of the Program a copy of this License along
+with the Program.
+
+You may charge a fee for the physical act of transferring a
+copy, and you may at your option offer warranty protection
+in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any
+portion of it, thus forming a work based on the Program, and
+copy and distribute such modifications or work under the
+terms of Section 1 above, provided that you also meet all of
+these conditions:
+
+a) You must cause the modified files to carry prominent
+notices stating that you changed the files and the date of
+any change.
+
+b) You must cause any work that you distribute or publish,
+that in whole or in part contains or is derived from the
+Program or any part thereof, to be licensed as a whole at no
+charge to all third parties under the terms of this License.
+
+c) If the modified program normally reads commands
+interactively when run, you must cause it, when started
+running for such interactive use in the most ordinary way,
+to print or display an announcement including an appropriate
+copyright notice and a notice that there is no warranty (or
+else, saying that you provide a warranty) and that users may
+redistribute the program under these conditions, and telling
+the user how to view a copy of this License. (Exception: if
+the Program itself is interactive but does not normally
+print such an announcement, your work based on the Program
+is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the
+Program, and can be reasonably considered independent and
+separate works in themselves, then this License, and its
+terms, do not apply to those sections when you distribute
+them as separate works. But when you distribute the same
+sections as part of a whole which is a work based on the
+Program, the distribution of the whole must be on the terms
+of this License, whose permissions for other licensees
+extend to the entire whole, and thus to each and every part
+regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights
+or contest your rights to work written entirely by you;
+rather, the intent is to exercise the right to control the
+distribution of derivative or collective works based on the
+Program. In addition, mere aggregation of another work not
+based on the Program with the Program (or with a work based
+on the Program) on a volume of a storage or distribution
+medium does not bring the other work under the scope of this
+License.
+
+3. You may copy and distribute the Program (or a work based
+on it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you
+also do one of the following:
+
+a) Accompany it with the complete corresponding
+machine-readable source code, which must be distributed
+under the terms of Sections 1 and 2 above on a medium
+customarily used for software interchange; or,
+
+b) Accompany it with a written offer, valid for at least
+three years, to give any third party, for a charge no more
+than your cost of physically performing source distribution,
+a complete machine-readable copy of the corresponding source
+code, to be distributed under the terms of Sections 1 and 2
+above on a medium customarily used for software interchange;
+or,
+
+c) Accompany it with the information you received as to the
+offer to distribute corresponding source code. (This
+alternative is allowed only for noncommercial distribution
+and only if you received the program in object code or
+executable form with such an offer, in accord with
+Subsection b above.)
+
+The source code for a work means the preferred form of the
+work for making modifications to it. For an executable work,
+complete source code means all the source code for all
+modules it contains, plus any associated interface
+definition files, plus the scripts used to control
+compilation and installation of the executable. However, as
+a special exception, the source code distributed need not
+include anything that is normally distributed (in either
+source or binary form) with the major components (compiler,
+kernel, and so on) of the operating system on which the
+executable runs, unless that component itself accompanies
+the executable. If distribution of executable or object code
+is made by offering access to copy from a designated place,
+then offering equivalent access to copy the source code from
+the same place counts as distribution of the source code,
+even though third parties are not compelled to copy the
+source along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the
+Program except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense or distribute
+the Program is void, and will automatically terminate your
+rights under this License. However, parties who have
+received copies, or rights, from you under this License will
+not have their licenses terminated so long as such parties
+remain in full compliance.
+
+5. You are not required to accept this License, since you
+have not signed it. However, nothing else grants you
+permission to modify or distribute the Program or its
+derivative works. These actions are prohibited by law if you
+do not accept this License. Therefore, by modifying or
+distributing the Program (or any work based on the Program),
+you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or
+modifying the Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based
+on the Program), the recipient automatically receives a
+license from the original licensor to copy, distribute or
+modify the Program subject to these terms and conditions.
+You may not impose any further restrictions on the
+recipients' exercise of the rights granted herein. You are
+not responsible for enforcing compliance by third parties to
+this License.
+
+7. If, as a consequence of a court judgment or allegation of
+patent infringement or for any other reason (not limited to
+patent issues), conditions are imposed on you (whether by
+court order, agreement or otherwise) that contradict the
+conditions of this License, they do not excuse you from the
+conditions of this License. If you cannot distribute so as
+to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a
+consequence you may not distribute the Program at all. For
+example, if a patent license would not permit royalty-free
+redistribution of the Program by all those who receive
+copies directly or indirectly through you, then the only way
+you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or
+unenforceable under any particular circumstance, the balance
+of the section is intended to apply and the section as a
+whole is intended to apply in other circumstances. It is not
+the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest
+validity of any such claims; this section has the sole
+purpose of protecting the integrity of the free software
+distribution system, which is implemented by public license
+practices. Many people have made generous contributions to
+the wide range of software distributed through that system
+in reliance on consistent application of that system; it is
+up to the author/donor to decide if he or she is willing to
+distribute software through any other system and a licensee
+cannot impose that choice.
+
+This section is intended to make thoroughly clear what is
+believed to be a consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is
+restricted in certain countries either by patents or by
+copyrighted interfaces, the original copyright holder who
+places the Program under this License may add an explicit
+geographical distribution limitation excluding those
+countries, so that distribution is permitted only in or
+among countries not thus excluded. In such case, this
+License incorporates the limitation as if written in the
+body of this License.
+
+9. The Free Software Foundation may publish revised and/or
+new versions of the General Public License from time to
+time. Such new versions will be similar in spirit to the
+present version, but may differ in detail to address new
+problems or concerns.
+
+Each version is given a distinguishing version number. If
+the Program specifies a version number of this License which
+applies to it and "any later version", you have the option
+of following the terms and conditions either of that version
+or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number
+of this License, you may choose any version ever published
+by the Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program into
+other free programs whose distribution conditions are
+different, write to the author to ask for permission. For
+software which is copyrighted by the Free Software
+Foundation, write to the Free Software Foundation; we
+sometimes make exceptions for this. Our decision will be
+guided by the two goals of preserving the free status of all
+derivatives of our free software and of promoting the
+sharing and reuse of software generally.
+
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS
+NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE
+COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM
+"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR
+IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE
+OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE
+DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED
+TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY
+WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED
+ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL,
+SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF
+THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT
+LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR
+LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE
+PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH
+HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the
+greatest possible use to the public, the best way to achieve
+this is to make it free software which everyone can
+redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is
+safest to attach them to the start of each source file to
+most effectively convey the exclusion of warranty; and each
+file should have at least the "copyright" line and a pointer
+to where the full notice is found.
+
+One line to give the program's name and a brief idea of what
+it does.
+
+Copyright (C) <year> <name of author>
+This program is free software; you can redistribute it
+and/or modify it under the terms of the GNU General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later
+version. This program is distributed in the hope that it
+will be useful, but WITHOUT ANY WARRANTY; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A
+PARTICULAR PURPOSE. See the GNU General Public License for
+more details. You should have received a copy of the GNU
+General Public License along with this program; if not,
+write to the Free Software Foundation, Inc., 59 Temple
+Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and
+paper mail. If the program is interactive, make it output a
+short notice like this when it starts in an interactive
+mode:
+
+Gnomovision version 69, Copyright (C) year name of author
+Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
+type `show w'. This is free software, and you are welcome to
+redistribute it under certain conditions; type `show c' for
+details. The hypothetical commands `show w' and `show c'
+should show the appropriate parts of the General Public
+License. Of course, the commands you use may be called
+something other than `show w' and `show c'; they could even
+be mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a
+programmer) or your school, if any, to sign a "copyright
+disclaimer" for the program, if necessary. Here is a sample;
+alter the names:
+
+Yoyodyne, Inc., hereby disclaims all copyright interest in
+the program `Gnomovision' (which makes passes at compilers)
+written by James Hacker.
+
+signature of Ty Coon, 1 April 1989
+Ty Coon, President of Vice
+This General Public License does not permit incorporating
+your program into proprietary programs. If your program is a
+subroutine library, you may consider it more useful to
+permit linking proprietary applications with the library. If
+this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
+"CLASSPATH" EXCEPTION TO THE GPL VERSION 2
+
+Certain source files distributed by Sun Microsystems, Inc.
+are subject to the following clarification and special
+exception to the GPL Version 2, but only where Sun has
+expressly included in the particular source file's header
+the words "Sun designates this particular file as subject
+to the "Classpath" exception as provided by Sun in the
+License file that accompanied this code."
+
+ Linking this library statically or dynamically with other
+modules is making a combined work based on this library.
+Thus, the terms and conditions of the GNU General Public
+License Version 2 cover the whole combination.
+
+ As a special exception, the copyright holders of this
+library give you permission to link this library with
+independent modules to produce an executable, regardless of
+the license terms of these independent modules, and to copy
+and distribute the resulting executable under terms of your
+choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license
+of that module. An independent module is a module which is
+not derived from or based on this library. If you modify
+this library, you may extend this exception to your version
+of the library, but you are not obligated to do so. If you
+do not wish to do so, delete this exception statement from
+your version.
+============================================================
+Notices for file(s):
+/bin/adb
+------------------------------------------------------------
+
+ Copyright (c) 2006-2009, The Android Open Source Project
+ Copyright 2006, Brian Swetland <swetland@frotz.net>
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+
+============================================================
+Notices for file(s):
+/bin/llvm-rs-cc
+/lib/libslang.a
+------------------------------------------------------------
+=========================
+NOTICE file for slang.git
+=========================
+
+ Copyright (c) 2005-2011, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+
+
+===========================================
+NOTICE file for external/clang (clang.git).
+Note: libclang*.a are statically linked.
+===========================================
+
+==============================================================================
+LLVM Release License
+==============================================================================
+University of Illinois/NCSA
+Open Source License
+
+Copyright (c) 2007-2011 University of Illinois at Urbana-Champaign.
+All rights reserved.
+
+Developed by:
+
+ LLVM Team
+
+ University of Illinois at Urbana-Champaign
+
+ http://llvm.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal with
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimers.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimers in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the names of the LLVM Team, University of Illinois at
+ Urbana-Champaign, nor the names of its contributors may be used to
+ endorse or promote products derived from this Software without specific
+ prior written permission.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
+SOFTWARE.
+
+==============================================================================
+The LLVM software contains code written by third parties. Such software will
+have its own individual LICENSE.TXT file in the directory in which it appears.
+This file will describe the copyrights, license, and restrictions which apply
+to that code.
+
+The disclaimer of warranty in the University of Illinois Open Source License
+applies to all code in the LLVM Distribution, and nothing in any of the
+other licenses gives permission to use the names of the LLVM Team or the
+University of Illinois to endorse or promote products derived from this
+Software.
+
+The following pieces of software have additional or alternate copyrights,
+licenses, and/or restrictions:
+
+Program Directory
+------- ---------
+<none yet>
+
+
+
+=========================================
+NOTICE file for external/llvm (llvm.git).
+Note: libLLVM*.a are statically linked.
+=========================================
+
+==============================================================================
+LLVM Release License
+==============================================================================
+University of Illinois/NCSA
+Open Source License
+
+Copyright (c) 2003-2011 University of Illinois at Urbana-Champaign.
+All rights reserved.
+
+Developed by:
+
+ LLVM Team
+
+ University of Illinois at Urbana-Champaign
+
+ http://llvm.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal with
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimers.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimers in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the names of the LLVM Team, University of Illinois at
+ Urbana-Champaign, nor the names of its contributors may be used to
+ endorse or promote products derived from this Software without specific
+ prior written permission.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
+SOFTWARE.
+
+==============================================================================
+Copyrights and Licenses for Third Party Software Distributed with LLVM:
+==============================================================================
+The LLVM software contains code written by third parties. Such software will
+have its own individual LICENSE.TXT file in the directory in which it appears.
+This file will describe the copyrights, license, and restrictions which apply
+to that code.
+
+The disclaimer of warranty in the University of Illinois Open Source License
+applies to all code in the LLVM Distribution, and nothing in any of the
+other licenses gives permission to use the names of the LLVM Team or the
+University of Illinois to endorse or promote products derived from this
+Software.
+
+The following pieces of software have additional or alternate copyrights,
+licenses, and/or restrictions:
+
+Program Directory
+------- ---------
+Autoconf llvm/autoconf
+ llvm/projects/ModuleMaker/autoconf
+ llvm/projects/sample/autoconf
+CellSPU backend llvm/lib/Target/CellSPU/README.txt
+Google Test llvm/utils/unittest/googletest
+OpenBSD regex llvm/lib/Support/{reg*, COPYRIGHT.regex}
+
+============================================================
+Notices for file(s):
+/bin/minigzip
+/lib/libunz.a
+/lib/libz-host.so
+/lib/libz.a
+/lib64/libunz.a
+/lib64/libz-host.so
+/lib64/libz.a
+------------------------------------------------------------
+ (C) 1995-2013 Jean-loup Gailly and Mark Adler
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jean-loup Gailly Mark Adler
+ jloup@gzip.org madler@alumni.caltech.edu
+
+============================================================
+Notices for file(s):
+/framework/antlr-runtime.jar
+------------------------------------------------------------
+[The "BSD license"]
+Copyright (c) 201 Terence Parr
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. The name of the author may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+============================================================
+Notices for file(s):
+/framework/junit.jar
+------------------------------------------------------------
+Common Public License - v 1.0
+
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
+b) in the case of each subsequent Contributor:
+i) changes to the Program, and
+ii) additions to the Program;
+where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+
+"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
+
+
+"Program" means the Contributions distributed in accordance with this Agreement.
+
+
+"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
+
+
+2. GRANT OF RIGHTS
+
+a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
+b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
+c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.
+d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
+3. REQUIREMENTS
+
+A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
+
+a) it complies with the terms and conditions of this Agreement; and
+b) its license agreement:
+i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
+ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
+iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
+iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.
+When the Program is made available in source code form:
+
+a) it must be made available under this Agreement; and
+b) a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained within the Program.
+
+
+Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.
+
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
+
+
+For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
+
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
+
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
+
+
+If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
+
+
+All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.
+
+
+Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
+
+
+This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
+============================================================
+Notices for file(s):
+/framework/bouncycastle-host.jar
+------------------------------------------------------------
+Copyright (c) 2000-2013 The Legion of the Bouncy Castle Inc. (http://www.bouncycastle.org)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
+associated documentation files (the "Software"), to deal in the Software without restriction,
+including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial
+portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
+LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
diff --git a/love2dToAPK/tools/tools/android-win/platform-tools/adb.exe b/love2dToAPK/tools/tools/android-win/platform-tools/adb.exe
new file mode 100644
index 0000000..6717685
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/platform-tools/adb.exe
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/platform-tools/api/api-versions.xml b/love2dToAPK/tools/tools/android-win/platform-tools/api/api-versions.xml
new file mode 100644
index 0000000..5738759
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/platform-tools/api/api-versions.xml
@@ -0,0 +1,57543 @@
+<?xml version="1.0" encoding="utf-8"?>
+<api version="1">
+ <class name="android/Manifest" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/Manifest$permission" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="ACCESS_CHECKIN_PROPERTIES" />
+ <field name="ACCESS_COARSE_LOCATION" />
+ <field name="ACCESS_FINE_LOCATION" />
+ <field name="ACCESS_LOCATION_EXTRA_COMMANDS" />
+ <field name="ACCESS_MOCK_LOCATION" />
+ <field name="ACCESS_NETWORK_STATE" />
+ <field name="ACCESS_SURFACE_FLINGER" />
+ <field name="ACCESS_WIFI_STATE" />
+ <field name="ACCOUNT_MANAGER" since="5" />
+ <field name="ADD_SYSTEM_SERVICE" />
+ <field name="ADD_VOICEMAIL" since="14" />
+ <field name="AUTHENTICATE_ACCOUNTS" since="5" />
+ <field name="BATTERY_STATS" />
+ <field name="BIND_ACCESSIBILITY_SERVICE" since="16" />
+ <field name="BIND_APPWIDGET" since="3" />
+ <field name="BIND_DEVICE_ADMIN" since="8" />
+ <field name="BIND_DREAM_SERVICE" since="21" />
+ <field name="BIND_INPUT_METHOD" since="3" />
+ <field name="BIND_NFC_SERVICE" since="19" />
+ <field name="BIND_NOTIFICATION_LISTENER_SERVICE" since="18" />
+ <field name="BIND_PRINT_SERVICE" since="19" />
+ <field name="BIND_REMOTEVIEWS" since="11" />
+ <field name="BIND_TEXT_SERVICE" since="14" />
+ <field name="BIND_TV_INPUT" since="21" />
+ <field name="BIND_VOICE_INTERACTION" since="21" />
+ <field name="BIND_VPN_SERVICE" since="14" />
+ <field name="BIND_WALLPAPER" since="8" />
+ <field name="BLUETOOTH" />
+ <field name="BLUETOOTH_ADMIN" />
+ <field name="BLUETOOTH_PRIVILEGED" since="19" />
+ <field name="BODY_SENSORS" since="20" />
+ <field name="BRICK" />
+ <field name="BROADCAST_PACKAGE_REMOVED" />
+ <field name="BROADCAST_SMS" since="2" />
+ <field name="BROADCAST_STICKY" />
+ <field name="BROADCAST_WAP_PUSH" since="2" />
+ <field name="CALL_PHONE" />
+ <field name="CALL_PRIVILEGED" />
+ <field name="CAMERA" />
+ <field name="CAPTURE_AUDIO_OUTPUT" since="19" />
+ <field name="CAPTURE_SECURE_VIDEO_OUTPUT" since="19" />
+ <field name="CAPTURE_VIDEO_OUTPUT" since="19" />
+ <field name="CHANGE_COMPONENT_ENABLED_STATE" />
+ <field name="CHANGE_CONFIGURATION" />
+ <field name="CHANGE_NETWORK_STATE" />
+ <field name="CHANGE_WIFI_MULTICAST_STATE" since="4" />
+ <field name="CHANGE_WIFI_STATE" />
+ <field name="CLEAR_APP_CACHE" />
+ <field name="CLEAR_APP_USER_DATA" />
+ <field name="CONTROL_LOCATION_UPDATES" />
+ <field name="DELETE_CACHE_FILES" />
+ <field name="DELETE_PACKAGES" />
+ <field name="DEVICE_POWER" />
+ <field name="DIAGNOSTIC" />
+ <field name="DISABLE_KEYGUARD" />
+ <field name="DUMP" />
+ <field name="EXPAND_STATUS_BAR" />
+ <field name="FACTORY_TEST" />
+ <field name="FLASHLIGHT" />
+ <field name="FORCE_BACK" />
+ <field name="FOTA_UPDATE" />
+ <field name="GET_ACCOUNTS" />
+ <field name="GET_PACKAGE_SIZE" />
+ <field name="GET_TASKS" />
+ <field name="GET_TOP_ACTIVITY_INFO" since="18" />
+ <field name="GLOBAL_SEARCH" since="4" />
+ <field name="HARDWARE_TEST" />
+ <field name="INJECT_EVENTS" />
+ <field name="INSTALL_LOCATION_PROVIDER" since="4" />
+ <field name="INSTALL_PACKAGES" />
+ <field name="INSTALL_SHORTCUT" since="19" />
+ <field name="INTERNAL_SYSTEM_WINDOW" />
+ <field name="INTERNET" />
+ <field name="KILL_BACKGROUND_PROCESSES" since="8" />
+ <field name="LOCATION_HARDWARE" since="18" />
+ <field name="MANAGE_ACCOUNTS" since="5" />
+ <field name="MANAGE_APP_TOKENS" />
+ <field name="MANAGE_DOCUMENTS" since="19" />
+ <field name="MASTER_CLEAR" />
+ <field name="MEDIA_CONTENT_CONTROL" since="19" />
+ <field name="MODIFY_AUDIO_SETTINGS" />
+ <field name="MODIFY_PHONE_STATE" />
+ <field name="MOUNT_FORMAT_FILESYSTEMS" since="3" />
+ <field name="MOUNT_UNMOUNT_FILESYSTEMS" />
+ <field name="NFC" since="9" />
+ <field name="PERSISTENT_ACTIVITY" />
+ <field name="PROCESS_OUTGOING_CALLS" />
+ <field name="READ_CALENDAR" />
+ <field name="READ_CALL_LOG" since="16" />
+ <field name="READ_CONTACTS" />
+ <field name="READ_EXTERNAL_STORAGE" since="16" />
+ <field name="READ_FRAME_BUFFER" />
+ <field name="READ_HISTORY_BOOKMARKS" since="4" />
+ <field name="READ_INPUT_STATE" />
+ <field name="READ_LOGS" />
+ <field name="READ_OWNER_DATA" />
+ <field name="READ_PHONE_STATE" />
+ <field name="READ_PROFILE" since="14" />
+ <field name="READ_SMS" />
+ <field name="READ_SOCIAL_STREAM" since="15" />
+ <field name="READ_SYNC_SETTINGS" />
+ <field name="READ_SYNC_STATS" />
+ <field name="READ_USER_DICTIONARY" since="16" />
+ <field name="READ_VOICEMAIL" since="21" />
+ <field name="REBOOT" />
+ <field name="RECEIVE_BOOT_COMPLETED" />
+ <field name="RECEIVE_MMS" />
+ <field name="RECEIVE_SMS" />
+ <field name="RECEIVE_WAP_PUSH" />
+ <field name="RECORD_AUDIO" />
+ <field name="REORDER_TASKS" />
+ <field name="RESTART_PACKAGES" />
+ <field name="SEND_RESPOND_VIA_MESSAGE" since="18" />
+ <field name="SEND_SMS" />
+ <field name="SET_ACTIVITY_WATCHER" />
+ <field name="SET_ALARM" since="9" />
+ <field name="SET_ALWAYS_FINISH" />
+ <field name="SET_ANIMATION_SCALE" />
+ <field name="SET_DEBUG_APP" />
+ <field name="SET_ORIENTATION" />
+ <field name="SET_POINTER_SPEED" since="13" />
+ <field name="SET_PREFERRED_APPLICATIONS" />
+ <field name="SET_PROCESS_FOREGROUND" />
+ <field name="SET_PROCESS_LIMIT" />
+ <field name="SET_TIME" since="8" />
+ <field name="SET_TIME_ZONE" />
+ <field name="SET_WALLPAPER" />
+ <field name="SET_WALLPAPER_HINTS" />
+ <field name="SIGNAL_PERSISTENT_PROCESSES" />
+ <field name="STATUS_BAR" />
+ <field name="SUBSCRIBED_FEEDS_READ" />
+ <field name="SUBSCRIBED_FEEDS_WRITE" />
+ <field name="SYSTEM_ALERT_WINDOW" />
+ <field name="TRANSMIT_IR" since="19" />
+ <field name="UNINSTALL_SHORTCUT" since="19" />
+ <field name="UPDATE_DEVICE_STATS" since="3" />
+ <field name="USE_CREDENTIALS" since="5" />
+ <field name="USE_SIP" since="9" />
+ <field name="VIBRATE" />
+ <field name="WAKE_LOCK" />
+ <field name="WRITE_APN_SETTINGS" />
+ <field name="WRITE_CALENDAR" />
+ <field name="WRITE_CALL_LOG" since="16" />
+ <field name="WRITE_CONTACTS" />
+ <field name="WRITE_EXTERNAL_STORAGE" since="4" />
+ <field name="WRITE_GSERVICES" />
+ <field name="WRITE_HISTORY_BOOKMARKS" since="4" />
+ <field name="WRITE_OWNER_DATA" />
+ <field name="WRITE_PROFILE" since="14" />
+ <field name="WRITE_SECURE_SETTINGS" since="3" />
+ <field name="WRITE_SETTINGS" />
+ <field name="WRITE_SMS" />
+ <field name="WRITE_SOCIAL_STREAM" since="15" />
+ <field name="WRITE_SYNC_SETTINGS" />
+ <field name="WRITE_USER_DICTIONARY" since="16" />
+ <field name="WRITE_VOICEMAIL" since="21" />
+ </class>
+ <class name="android/Manifest$permission_group" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="ACCESSIBILITY_FEATURES" since="18" />
+ <field name="ACCOUNTS" />
+ <field name="AFFECTS_BATTERY" since="17" />
+ <field name="APP_INFO" since="17" />
+ <field name="AUDIO_SETTINGS" since="17" />
+ <field name="BLUETOOTH_NETWORK" since="17" />
+ <field name="BOOKMARKS" since="17" />
+ <field name="CALENDAR" since="17" />
+ <field name="CAMERA" since="17" />
+ <field name="COST_MONEY" />
+ <field name="DEVELOPMENT_TOOLS" />
+ <field name="DEVICE_ALARMS" since="17" />
+ <field name="DISPLAY" since="17" />
+ <field name="HARDWARE_CONTROLS" />
+ <field name="LOCATION" />
+ <field name="MESSAGES" />
+ <field name="MICROPHONE" since="17" />
+ <field name="NETWORK" />
+ <field name="PERSONAL_INFO" />
+ <field name="PHONE_CALLS" />
+ <field name="SCREENLOCK" since="17" />
+ <field name="SOCIAL_INFO" since="17" />
+ <field name="STATUS_BAR" since="17" />
+ <field name="STORAGE" since="4" />
+ <field name="SYNC_SETTINGS" since="17" />
+ <field name="SYSTEM_CLOCK" since="17" />
+ <field name="SYSTEM_TOOLS" />
+ <field name="USER_DICTIONARY" since="17" />
+ <field name="VOICEMAIL" since="17" />
+ <field name="WALLPAPER" since="17" />
+ <field name="WRITE_USER_DICTIONARY" since="17" />
+ </class>
+ <class name="android/R" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/R$anim" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="accelerate_decelerate_interpolator" />
+ <field name="accelerate_interpolator" />
+ <field name="anticipate_interpolator" since="4" />
+ <field name="anticipate_overshoot_interpolator" since="4" />
+ <field name="bounce_interpolator" since="4" />
+ <field name="cycle_interpolator" since="8" />
+ <field name="decelerate_interpolator" />
+ <field name="fade_in" />
+ <field name="fade_out" />
+ <field name="linear_interpolator" since="4" />
+ <field name="overshoot_interpolator" since="4" />
+ <field name="slide_in_left" />
+ <field name="slide_out_right" />
+ </class>
+ <class name="android/R$animator" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="fade_in" />
+ <field name="fade_out" />
+ </class>
+ <class name="android/R$array" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="emailAddressTypes" />
+ <field name="imProtocols" />
+ <field name="organizationTypes" />
+ <field name="phoneTypes" />
+ <field name="postalAddressTypes" />
+ </class>
+ <class name="android/R$attr" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="absListViewStyle" />
+ <field name="accessibilityEventTypes" since="14" />
+ <field name="accessibilityFeedbackType" since="14" />
+ <field name="accessibilityFlags" since="14" />
+ <field name="accessibilityLiveRegion" since="19" />
+ <field name="accountPreferences" since="5" />
+ <field name="accountType" since="5" />
+ <field name="action" />
+ <field name="actionBarDivider" since="14" />
+ <field name="actionBarItemBackground" since="14" />
+ <field name="actionBarPopupTheme" since="21" />
+ <field name="actionBarSize" since="11" />
+ <field name="actionBarSplitStyle" since="14" />
+ <field name="actionBarStyle" since="11" />
+ <field name="actionBarTabBarStyle" since="11" />
+ <field name="actionBarTabStyle" since="11" />
+ <field name="actionBarTabTextStyle" since="11" />
+ <field name="actionBarTheme" since="21" />
+ <field name="actionBarWidgetTheme" since="14" />
+ <field name="actionButtonStyle" since="11" />
+ <field name="actionDropDownStyle" since="11" />
+ <field name="actionLayout" since="11" />
+ <field name="actionMenuTextAppearance" since="11" />
+ <field name="actionMenuTextColor" since="11" />
+ <field name="actionModeBackground" since="11" />
+ <field name="actionModeCloseButtonStyle" since="11" />
+ <field name="actionModeCloseDrawable" since="11" />
+ <field name="actionModeCopyDrawable" since="11" />
+ <field name="actionModeCutDrawable" since="11" />
+ <field name="actionModeFindDrawable" since="21" />
+ <field name="actionModePasteDrawable" since="11" />
+ <field name="actionModeSelectAllDrawable" since="14" />
+ <field name="actionModeShareDrawable" since="21" />
+ <field name="actionModeSplitBackground" since="14" />
+ <field name="actionModeStyle" since="14" />
+ <field name="actionModeWebSearchDrawable" since="21" />
+ <field name="actionOverflowButtonStyle" since="11" />
+ <field name="actionOverflowMenuStyle" since="21" />
+ <field name="actionProviderClass" since="14" />
+ <field name="actionViewClass" since="11" />
+ <field name="activatedBackgroundIndicator" since="11" />
+ <field name="activityCloseEnterAnimation" />
+ <field name="activityCloseExitAnimation" />
+ <field name="activityOpenEnterAnimation" />
+ <field name="activityOpenExitAnimation" />
+ <field name="addPrintersActivity" since="19" />
+ <field name="addStatesFromChildren" />
+ <field name="adjustViewBounds" />
+ <field name="advancedPrintOptionsActivity" since="19" />
+ <field name="alertDialogIcon" since="11" />
+ <field name="alertDialogStyle" />
+ <field name="alertDialogTheme" since="11" />
+ <field name="alignmentMode" since="14" />
+ <field name="allContactsName" since="11" />
+ <field name="allowBackup" since="4" />
+ <field name="allowClearUserData" />
+ <field name="allowEmbedded" since="20" />
+ <field name="allowParallelSyncs" since="11" />
+ <field name="allowSingleTap" since="3" />
+ <field name="allowTaskReparenting" />
+ <field name="alpha" since="11" />
+ <field name="alphabeticShortcut" />
+ <field name="alwaysDrawnWithCache" />
+ <field name="alwaysRetainTaskState" />
+ <field name="amPmBackgroundColor" since="21" />
+ <field name="amPmTextColor" since="21" />
+ <field name="ambientShadowAlpha" since="21" />
+ <field name="angle" />
+ <field name="animateFirstView" since="11" />
+ <field name="animateLayoutChanges" since="11" />
+ <field name="animateOnClick" since="3" />
+ <field name="animation" />
+ <field name="animationCache" />
+ <field name="animationDuration" />
+ <field name="animationOrder" />
+ <field name="animationResolution" since="11" />
+ <field name="antialias" />
+ <field name="anyDensity" since="4" />
+ <field name="apduServiceBanner" since="19" />
+ <field name="apiKey" />
+ <field name="author" since="7" />
+ <field name="authorities" />
+ <field name="autoAdvanceViewId" since="11" />
+ <field name="autoCompleteTextViewStyle" />
+ <field name="autoLink" />
+ <field name="autoMirrored" since="19" />
+ <field name="autoRemoveFromRecents" since="21" />
+ <field name="autoStart" since="7" />
+ <field name="autoText" />
+ <field name="autoUrlDetect" since="4" />
+ <field name="background" />
+ <field name="backgroundDimAmount" />
+ <field name="backgroundDimEnabled" since="3" />
+ <field name="backgroundSplit" since="14" />
+ <field name="backgroundStacked" since="14" />
+ <field name="backgroundTint" since="21" />
+ <field name="backgroundTintMode" since="21" />
+ <field name="backupAgent" since="4" />
+ <field name="banner" since="21" />
+ <field name="baseline" since="11" />
+ <field name="baselineAlignBottom" />
+ <field name="baselineAligned" />
+ <field name="baselineAlignedChildIndex" />
+ <field name="borderlessButtonStyle" since="11" />
+ <field name="bottom" />
+ <field name="bottomBright" />
+ <field name="bottomDark" />
+ <field name="bottomLeftRadius" />
+ <field name="bottomMedium" />
+ <field name="bottomOffset" since="3" />
+ <field name="bottomRightRadius" />
+ <field name="breadCrumbShortTitle" since="11" />
+ <field name="breadCrumbTitle" since="11" />
+ <field name="bufferType" />
+ <field name="button" />
+ <field name="buttonBarButtonStyle" since="11" />
+ <field name="buttonBarNegativeButtonStyle" since="21" />
+ <field name="buttonBarNeutralButtonStyle" since="21" />
+ <field name="buttonBarPositiveButtonStyle" since="21" />
+ <field name="buttonBarStyle" since="11" />
+ <field name="buttonStyle" />
+ <field name="buttonStyleInset" />
+ <field name="buttonStyleSmall" />
+ <field name="buttonStyleToggle" />
+ <field name="buttonTint" since="21" />
+ <field name="buttonTintMode" since="21" />
+ <field name="cacheColorHint" />
+ <field name="calendarTextColor" since="21" />
+ <field name="calendarViewShown" since="11" />
+ <field name="calendarViewStyle" since="11" />
+ <field name="canRequestEnhancedWebAccessibility" since="18" />
+ <field name="canRequestFilterKeyEvents" since="18" />
+ <field name="canRequestTouchExplorationMode" since="18" />
+ <field name="canRetrieveWindowContent" since="14" />
+ <field name="candidatesTextStyleSpans" since="3" />
+ <field name="capitalize" />
+ <field name="category" since="19" />
+ <field name="centerBright" />
+ <field name="centerColor" />
+ <field name="centerDark" />
+ <field name="centerMedium" />
+ <field name="centerX" />
+ <field name="centerY" />
+ <field name="checkBoxPreferenceStyle" />
+ <field name="checkMark" />
+ <field name="checkMarkTint" since="21" />
+ <field name="checkMarkTintMode" since="21" />
+ <field name="checkable" />
+ <field name="checkableBehavior" />
+ <field name="checkboxStyle" />
+ <field name="checked" />
+ <field name="checkedButton" />
+ <field name="checkedTextViewStyle" since="17" />
+ <field name="childDivider" />
+ <field name="childIndicator" />
+ <field name="childIndicatorEnd" since="18" />
+ <field name="childIndicatorLeft" />
+ <field name="childIndicatorRight" />
+ <field name="childIndicatorStart" since="18" />
+ <field name="choiceMode" />
+ <field name="clearTaskOnLaunch" />
+ <field name="clickable" />
+ <field name="clipChildren" />
+ <field name="clipOrientation" />
+ <field name="clipToPadding" />
+ <field name="closeIcon" since="21" />
+ <field name="codes" since="3" />
+ <field name="collapseColumns" />
+ <field name="color" />
+ <field name="colorAccent" since="21" />
+ <field name="colorActivatedHighlight" since="14" />
+ <field name="colorBackground" />
+ <field name="colorBackgroundCacheHint" since="5" />
+ <field name="colorButtonNormal" since="21" />
+ <field name="colorControlActivated" since="21" />
+ <field name="colorControlHighlight" since="21" />
+ <field name="colorControlNormal" since="21" />
+ <field name="colorEdgeEffect" since="21" />
+ <field name="colorFocusedHighlight" since="14" />
+ <field name="colorForeground" />
+ <field name="colorForegroundInverse" />
+ <field name="colorLongPressedHighlight" since="14" />
+ <field name="colorMultiSelectHighlight" since="14" />
+ <field name="colorPressedHighlight" since="14" />
+ <field name="colorPrimary" since="21" />
+ <field name="colorPrimaryDark" since="21" />
+ <field name="columnCount" since="14" />
+ <field name="columnDelay" />
+ <field name="columnOrderPreserved" since="14" />
+ <field name="columnWidth" />
+ <field name="commitIcon" since="21" />
+ <field name="compatibleWidthLimitDp" since="13" />
+ <field name="completionHint" />
+ <field name="completionHintView" />
+ <field name="completionThreshold" />
+ <field name="configChanges" />
+ <field name="configure" since="3" />
+ <field name="constantSize" />
+ <field name="content" since="3" />
+ <field name="contentAgeHint" since="21" />
+ <field name="contentAuthority" since="5" />
+ <field name="contentDescription" since="4" />
+ <field name="contentInsetEnd" since="21" />
+ <field name="contentInsetLeft" since="21" />
+ <field name="contentInsetRight" since="21" />
+ <field name="contentInsetStart" since="21" />
+ <field name="controlX1" since="21" />
+ <field name="controlX2" since="21" />
+ <field name="controlY1" since="21" />
+ <field name="controlY2" since="21" />
+ <field name="country" since="21" />
+ <field name="cropToPadding" />
+ <field name="cursorVisible" />
+ <field name="customNavigationLayout" since="11" />
+ <field name="customTokens" since="11" />
+ <field name="cycles" />
+ <field name="dashGap" />
+ <field name="dashWidth" />
+ <field name="data" />
+ <field name="datePickerDialogTheme" since="21" />
+ <field name="datePickerMode" since="21" />
+ <field name="datePickerStyle" since="11" />
+ <field name="dateTextAppearance" since="11" />
+ <field name="dayOfWeekBackground" since="21" />
+ <field name="dayOfWeekTextAppearance" since="21" />
+ <field name="debuggable" />
+ <field name="defaultValue" />
+ <field name="delay" />
+ <field name="dependency" />
+ <field name="descendantFocusability" />
+ <field name="description" />
+ <field name="detachWallpaper" since="5" />
+ <field name="detailColumn" since="5" />
+ <field name="detailSocialSummary" since="5" />
+ <field name="detailsElementBackground" since="11" />
+ <field name="dial" />
+ <field name="dialogIcon" />
+ <field name="dialogLayout" />
+ <field name="dialogMessage" />
+ <field name="dialogPreferenceStyle" />
+ <field name="dialogTheme" since="11" />
+ <field name="dialogTitle" />
+ <field name="digits" />
+ <field name="direction" />
+ <field name="directionDescriptions" since="14" />
+ <field name="directionPriority" />
+ <field name="disableDependentsState" />
+ <field name="disabledAlpha" />
+ <field name="displayOptions" since="11" />
+ <field name="dither" />
+ <field name="divider" />
+ <field name="dividerHeight" />
+ <field name="dividerHorizontal" since="11" />
+ <field name="dividerPadding" since="11" />
+ <field name="dividerVertical" since="11" />
+ <field name="documentLaunchMode" since="21" />
+ <field name="drawSelectorOnTop" />
+ <field name="drawable" />
+ <field name="drawableBottom" />
+ <field name="drawableEnd" since="14" />
+ <field name="drawableLeft" />
+ <field name="drawablePadding" />
+ <field name="drawableRight" />
+ <field name="drawableStart" since="14" />
+ <field name="drawableTop" />
+ <field name="drawingCacheQuality" />
+ <field name="dropDownAnchor" since="3" />
+ <field name="dropDownHeight" since="4" />
+ <field name="dropDownHintAppearance" />
+ <field name="dropDownHorizontalOffset" since="5" />
+ <field name="dropDownItemStyle" />
+ <field name="dropDownListViewStyle" />
+ <field name="dropDownSelector" />
+ <field name="dropDownSpinnerStyle" since="11" />
+ <field name="dropDownVerticalOffset" since="5" />
+ <field name="dropDownWidth" since="3" />
+ <field name="duplicateParentState" />
+ <field name="duration" />
+ <field name="editTextBackground" since="11" />
+ <field name="editTextColor" since="11" />
+ <field name="editTextPreferenceStyle" />
+ <field name="editTextStyle" />
+ <field name="editable" />
+ <field name="editorExtras" since="3" />
+ <field name="elegantTextHeight" since="21" />
+ <field name="elevation" since="21" />
+ <field name="ellipsize" />
+ <field name="ems" />
+ <field name="enabled" />
+ <field name="endColor" />
+ <field name="endYear" />
+ <field name="enterFadeDuration" since="11" />
+ <field name="entries" />
+ <field name="entryValues" />
+ <field name="eventsInterceptionEnabled" since="4" />
+ <field name="excludeClass" since="21" />
+ <field name="excludeFromRecents" />
+ <field name="excludeId" since="21" />
+ <field name="excludeName" since="21" />
+ <field name="exitFadeDuration" since="11" />
+ <field name="expandableListPreferredChildIndicatorLeft" />
+ <field name="expandableListPreferredChildIndicatorRight" />
+ <field name="expandableListPreferredChildPaddingLeft" />
+ <field name="expandableListPreferredItemIndicatorLeft" />
+ <field name="expandableListPreferredItemIndicatorRight" />
+ <field name="expandableListPreferredItemPaddingLeft" />
+ <field name="expandableListViewStyle" />
+ <field name="expandableListViewWhiteStyle" since="8" />
+ <field name="exported" />
+ <field name="extraTension" since="4" />
+ <field name="factor" />
+ <field name="fadeDuration" since="4" />
+ <field name="fadeEnabled" since="4" />
+ <field name="fadeOffset" since="4" />
+ <field name="fadeScrollbars" since="5" />
+ <field name="fadingEdge" />
+ <field name="fadingEdgeLength" />
+ <field name="fadingMode" since="19" />
+ <field name="fastScrollAlwaysVisible" since="11" />
+ <field name="fastScrollEnabled" since="3" />
+ <field name="fastScrollOverlayPosition" since="11" />
+ <field name="fastScrollPreviewBackgroundLeft" since="11" />
+ <field name="fastScrollPreviewBackgroundRight" since="11" />
+ <field name="fastScrollStyle" since="21" />
+ <field name="fastScrollTextColor" since="11" />
+ <field name="fastScrollThumbDrawable" since="11" />
+ <field name="fastScrollTrackDrawable" since="11" />
+ <field name="fillAfter" />
+ <field name="fillAlpha" since="21" />
+ <field name="fillBefore" />
+ <field name="fillColor" since="21" />
+ <field name="fillEnabled" since="3" />
+ <field name="fillViewport" />
+ <field name="filter" />
+ <field name="filterTouchesWhenObscured" since="9" />
+ <field name="finishOnCloseSystemDialogs" since="5" />
+ <field name="finishOnTaskLaunch" />
+ <field name="firstDayOfWeek" since="11" />
+ <field name="fitsSystemWindows" />
+ <field name="flipInterval" />
+ <field name="focusable" />
+ <field name="focusableInTouchMode" />
+ <field name="focusedMonthDateColor" since="11" />
+ <field name="fontFamily" since="16" />
+ <field name="fontFeatureSettings" since="21" />
+ <field name="footerDividersEnabled" since="3" />
+ <field name="foreground" />
+ <field name="foregroundGravity" />
+ <field name="foregroundTint" since="21" />
+ <field name="foregroundTintMode" since="21" />
+ <field name="format" />
+ <field name="format12Hour" since="17" />
+ <field name="format24Hour" since="17" />
+ <field name="fragment" since="11" />
+ <field name="fragmentAllowEnterTransitionOverlap" since="21" />
+ <field name="fragmentAllowReturnTransitionOverlap" since="21" />
+ <field name="fragmentCloseEnterAnimation" since="11" />
+ <field name="fragmentCloseExitAnimation" since="11" />
+ <field name="fragmentEnterTransition" since="21" />
+ <field name="fragmentExitTransition" since="21" />
+ <field name="fragmentFadeEnterAnimation" since="11" />
+ <field name="fragmentFadeExitAnimation" since="11" />
+ <field name="fragmentOpenEnterAnimation" since="11" />
+ <field name="fragmentOpenExitAnimation" since="11" />
+ <field name="fragmentReenterTransition" since="21" />
+ <field name="fragmentReturnTransition" since="21" />
+ <field name="fragmentSharedElementEnterTransition" since="21" />
+ <field name="fragmentSharedElementReturnTransition" since="21" />
+ <field name="freezesText" />
+ <field name="fromAlpha" />
+ <field name="fromDegrees" />
+ <field name="fromId" since="21" />
+ <field name="fromScene" since="19" />
+ <field name="fromXDelta" />
+ <field name="fromXScale" />
+ <field name="fromYDelta" />
+ <field name="fromYScale" />
+ <field name="fullBackupOnly" since="21" />
+ <field name="fullBright" />
+ <field name="fullDark" />
+ <field name="functionalTest" />
+ <field name="galleryItemBackground" />
+ <field name="galleryStyle" />
+ <field name="gestureColor" since="4" />
+ <field name="gestureStrokeAngleThreshold" since="4" />
+ <field name="gestureStrokeLengthThreshold" since="4" />
+ <field name="gestureStrokeSquarenessThreshold" since="4" />
+ <field name="gestureStrokeType" since="4" />
+ <field name="gestureStrokeWidth" since="4" />
+ <field name="glEsVersion" since="4" />
+ <field name="goIcon" since="21" />
+ <field name="gradientRadius" />
+ <field name="grantUriPermissions" />
+ <field name="gravity" />
+ <field name="gridViewStyle" />
+ <field name="groupIndicator" />
+ <field name="hand_hour" />
+ <field name="hand_minute" />
+ <field name="handle" since="3" />
+ <field name="handleProfiling" />
+ <field name="hapticFeedbackEnabled" since="3" />
+ <field name="hardwareAccelerated" since="11" />
+ <field name="hasCode" />
+ <field name="headerAmPmTextAppearance" since="21" />
+ <field name="headerBackground" />
+ <field name="headerDayOfMonthTextAppearance" since="21" />
+ <field name="headerDividersEnabled" since="3" />
+ <field name="headerMonthTextAppearance" since="21" />
+ <field name="headerTimeTextAppearance" since="21" />
+ <field name="headerYearTextAppearance" since="21" />
+ <field name="height" />
+ <field name="hideOnContentScroll" since="21" />
+ <field name="hint" />
+ <field name="homeAsUpIndicator" since="11" />
+ <field name="homeLayout" since="11" />
+ <field name="horizontalDivider" />
+ <field name="horizontalGap" since="3" />
+ <field name="horizontalScrollViewStyle" since="11" />
+ <field name="horizontalSpacing" />
+ <field name="host" />
+ <field name="icon" />
+ <field name="iconPreview" since="3" />
+ <field name="iconifiedByDefault" since="11" />
+ <field name="id" />
+ <field name="ignoreGravity" />
+ <field name="imageButtonStyle" />
+ <field name="imageWellStyle" />
+ <field name="imeActionId" since="3" />
+ <field name="imeActionLabel" since="3" />
+ <field name="imeExtractEnterAnimation" since="3" />
+ <field name="imeExtractExitAnimation" since="3" />
+ <field name="imeFullscreenBackground" since="3" />
+ <field name="imeOptions" since="3" />
+ <field name="imeSubtypeExtraValue" since="11" />
+ <field name="imeSubtypeLocale" since="11" />
+ <field name="imeSubtypeMode" since="11" />
+ <field name="immersive" since="11" />
+ <field name="importantForAccessibility" since="16" />
+ <field name="inAnimation" />
+ <field name="includeFontPadding" />
+ <field name="includeInGlobalSearch" since="4" />
+ <field name="indeterminate" />
+ <field name="indeterminateBehavior" />
+ <field name="indeterminateDrawable" />
+ <field name="indeterminateDuration" />
+ <field name="indeterminateOnly" />
+ <field name="indeterminateProgressStyle" since="11" />
+ <field name="indeterminateTint" since="21" />
+ <field name="indeterminateTintMode" since="21" />
+ <field name="indicatorEnd" since="18" />
+ <field name="indicatorLeft" />
+ <field name="indicatorRight" />
+ <field name="indicatorStart" since="18" />
+ <field name="inflatedId" />
+ <field name="initOrder" />
+ <field name="initialKeyguardLayout" since="17" />
+ <field name="initialLayout" since="3" />
+ <field name="innerRadius" since="3" />
+ <field name="innerRadiusRatio" />
+ <field name="inputMethod" />
+ <field name="inputType" since="3" />
+ <field name="inset" since="21" />
+ <field name="insetBottom" />
+ <field name="insetLeft" />
+ <field name="insetRight" />
+ <field name="insetTop" />
+ <field name="installLocation" since="8" />
+ <field name="interpolator" />
+ <field name="isAlwaysSyncable" since="11" />
+ <field name="isAsciiCapable" since="19" />
+ <field name="isAuxiliary" since="14" />
+ <field name="isDefault" since="3" />
+ <field name="isGame" since="21" />
+ <field name="isIndicator" />
+ <field name="isModifier" since="3" />
+ <field name="isRepeatable" since="3" />
+ <field name="isScrollContainer" since="3" />
+ <field name="isSticky" since="3" />
+ <field name="isolatedProcess" since="16" />
+ <field name="itemBackground" />
+ <field name="itemIconDisabledAlpha" />
+ <field name="itemPadding" since="11" />
+ <field name="itemTextAppearance" />
+ <field name="keepScreenOn" />
+ <field name="key" />
+ <field name="keyBackground" since="3" />
+ <field name="keyEdgeFlags" since="3" />
+ <field name="keyHeight" since="3" />
+ <field name="keyIcon" since="3" />
+ <field name="keyLabel" since="3" />
+ <field name="keyOutputText" since="3" />
+ <field name="keyPreviewHeight" since="3" />
+ <field name="keyPreviewLayout" since="3" />
+ <field name="keyPreviewOffset" since="3" />
+ <field name="keySet" since="19" />
+ <field name="keyTextColor" since="3" />
+ <field name="keyTextSize" since="3" />
+ <field name="keyWidth" since="3" />
+ <field name="keyboardLayout" since="16" />
+ <field name="keyboardMode" since="3" />
+ <field name="keycode" />
+ <field name="killAfterRestore" since="5" />
+ <field name="label" />
+ <field name="labelFor" since="17" />
+ <field name="labelTextSize" since="3" />
+ <field name="largeHeap" since="11" />
+ <field name="largeScreens" since="4" />
+ <field name="largestWidthLimitDp" since="13" />
+ <field name="launchMode" />
+ <field name="launchTaskBehindSourceAnimation" since="21" />
+ <field name="launchTaskBehindTargetAnimation" since="21" />
+ <field name="layerType" since="11" />
+ <field name="layout" />
+ <field name="layoutAnimation" />
+ <field name="layoutDirection" since="17" />
+ <field name="layoutMode" since="18" />
+ <field name="layout_above" />
+ <field name="layout_alignBaseline" />
+ <field name="layout_alignBottom" />
+ <field name="layout_alignEnd" since="17" />
+ <field name="layout_alignLeft" />
+ <field name="layout_alignParentBottom" />
+ <field name="layout_alignParentEnd" since="17" />
+ <field name="layout_alignParentLeft" />
+ <field name="layout_alignParentRight" />
+ <field name="layout_alignParentStart" since="17" />
+ <field name="layout_alignParentTop" />
+ <field name="layout_alignRight" />
+ <field name="layout_alignStart" since="17" />
+ <field name="layout_alignTop" />
+ <field name="layout_alignWithParentIfMissing" />
+ <field name="layout_below" />
+ <field name="layout_centerHorizontal" />
+ <field name="layout_centerInParent" />
+ <field name="layout_centerVertical" />
+ <field name="layout_column" />
+ <field name="layout_columnSpan" since="14" />
+ <field name="layout_columnWeight" since="21" />
+ <field name="layout_gravity" />
+ <field name="layout_height" />
+ <field name="layout_margin" />
+ <field name="layout_marginBottom" />
+ <field name="layout_marginEnd" since="17" />
+ <field name="layout_marginLeft" />
+ <field name="layout_marginRight" />
+ <field name="layout_marginStart" since="17" />
+ <field name="layout_marginTop" />
+ <field name="layout_row" since="14" />
+ <field name="layout_rowSpan" since="14" />
+ <field name="layout_rowWeight" since="21" />
+ <field name="layout_scale" />
+ <field name="layout_span" />
+ <field name="layout_toEndOf" since="17" />
+ <field name="layout_toLeftOf" />
+ <field name="layout_toRightOf" />
+ <field name="layout_toStartOf" since="17" />
+ <field name="layout_weight" />
+ <field name="layout_width" />
+ <field name="layout_x" />
+ <field name="layout_y" />
+ <field name="left" />
+ <field name="letterSpacing" since="21" />
+ <field name="lineSpacingExtra" />
+ <field name="lineSpacingMultiplier" />
+ <field name="lines" />
+ <field name="linksClickable" />
+ <field name="listChoiceBackgroundIndicator" since="11" />
+ <field name="listChoiceIndicatorMultiple" />
+ <field name="listChoiceIndicatorSingle" />
+ <field name="listDivider" />
+ <field name="listDividerAlertDialog" since="11" />
+ <field name="listPopupWindowStyle" since="11" />
+ <field name="listPreferredItemHeight" />
+ <field name="listPreferredItemHeightLarge" since="14" />
+ <field name="listPreferredItemHeightSmall" since="14" />
+ <field name="listPreferredItemPaddingEnd" since="17" />
+ <field name="listPreferredItemPaddingLeft" since="14" />
+ <field name="listPreferredItemPaddingRight" since="14" />
+ <field name="listPreferredItemPaddingStart" since="17" />
+ <field name="listSelector" />
+ <field name="listSeparatorTextViewStyle" />
+ <field name="listViewStyle" />
+ <field name="listViewWhiteStyle" />
+ <field name="logo" since="11" />
+ <field name="longClickable" />
+ <field name="loopViews" since="11" />
+ <field name="manageSpaceActivity" />
+ <field name="mapViewStyle" />
+ <field name="marqueeRepeatLimit" since="2" />
+ <field name="matchOrder" since="21" />
+ <field name="max" />
+ <field name="maxDate" since="11" />
+ <field name="maxEms" />
+ <field name="maxHeight" />
+ <field name="maxItemsPerRow" />
+ <field name="maxLength" />
+ <field name="maxLevel" />
+ <field name="maxLines" />
+ <field name="maxRecents" since="21" />
+ <field name="maxRows" />
+ <field name="maxSdkVersion" since="4" />
+ <field name="maxWidth" />
+ <field name="maximumAngle" since="21" />
+ <field name="measureAllChildren" />
+ <field name="measureWithLargestChild" since="11" />
+ <field name="mediaRouteButtonStyle" since="16" />
+ <field name="mediaRouteTypes" since="16" />
+ <field name="menuCategory" />
+ <field name="mimeType" />
+ <field name="minDate" since="11" />
+ <field name="minEms" />
+ <field name="minHeight" />
+ <field name="minLevel" />
+ <field name="minLines" />
+ <field name="minResizeHeight" since="14" />
+ <field name="minResizeWidth" since="14" />
+ <field name="minSdkVersion" />
+ <field name="minWidth" />
+ <field name="minimumHorizontalAngle" since="21" />
+ <field name="minimumVerticalAngle" since="21" />
+ <field name="mipMap" since="18" />
+ <field name="mirrorForRtl" since="18" />
+ <field name="mode" />
+ <field name="moreIcon" />
+ <field name="multiArch" since="21" />
+ <field name="multiprocess" />
+ <field name="name" />
+ <field name="navigationBarColor" since="21" />
+ <field name="navigationContentDescription" since="21" />
+ <field name="navigationIcon" since="21" />
+ <field name="navigationMode" since="11" />
+ <field name="negativeButtonText" />
+ <field name="nestedScrollingEnabled" since="21" />
+ <field name="nextFocusDown" />
+ <field name="nextFocusForward" since="11" />
+ <field name="nextFocusLeft" />
+ <field name="nextFocusRight" />
+ <field name="nextFocusUp" />
+ <field name="noHistory" since="3" />
+ <field name="normalScreens" since="4" />
+ <field name="notificationTimeout" since="14" />
+ <field name="numColumns" />
+ <field name="numStars" />
+ <field name="numbersBackgroundColor" since="21" />
+ <field name="numbersSelectorColor" since="21" />
+ <field name="numbersTextColor" since="21" />
+ <field name="numeric" />
+ <field name="numericShortcut" />
+ <field name="onClick" since="4" />
+ <field name="oneshot" />
+ <field name="opacity" since="11" />
+ <field name="order" />
+ <field name="orderInCategory" />
+ <field name="ordering" since="11" />
+ <field name="orderingFromXml" />
+ <field name="orientation" />
+ <field name="outAnimation" />
+ <field name="outlineProvider" since="21" />
+ <field name="overScrollFooter" since="9" />
+ <field name="overScrollHeader" since="9" />
+ <field name="overScrollMode" since="9" />
+ <field name="overlapAnchor" since="21" />
+ <field name="overridesImplicitlyEnabledSubtype" since="14" />
+ <field name="packageNames" since="14" />
+ <field name="padding" />
+ <field name="paddingBottom" />
+ <field name="paddingEnd" since="17" />
+ <field name="paddingLeft" />
+ <field name="paddingMode" since="21" />
+ <field name="paddingRight" />
+ <field name="paddingStart" since="17" />
+ <field name="paddingTop" />
+ <field name="panelBackground" />
+ <field name="panelColorBackground" />
+ <field name="panelColorForeground" />
+ <field name="panelFullBackground" />
+ <field name="panelTextAppearance" />
+ <field name="parentActivityName" since="16" />
+ <field name="password" />
+ <field name="path" />
+ <field name="pathData" since="21" />
+ <field name="pathPattern" />
+ <field name="pathPrefix" />
+ <field name="patternPathData" since="21" />
+ <field name="permission" />
+ <field name="permissionFlags" since="17" />
+ <field name="permissionGroup" />
+ <field name="permissionGroupFlags" since="17" />
+ <field name="persistableMode" since="21" />
+ <field name="persistent" />
+ <field name="persistentDrawingCache" />
+ <field name="phoneNumber" />
+ <field name="pivotX" />
+ <field name="pivotY" />
+ <field name="popupAnimationStyle" since="9" />
+ <field name="popupBackground" />
+ <field name="popupCharacters" since="3" />
+ <field name="popupElevation" since="21" />
+ <field name="popupKeyboard" since="3" />
+ <field name="popupLayout" since="3" />
+ <field name="popupMenuStyle" since="11" />
+ <field name="popupTheme" since="21" />
+ <field name="popupWindowStyle" />
+ <field name="port" />
+ <field name="positiveButtonText" />
+ <field name="preferenceCategoryStyle" />
+ <field name="preferenceInformationStyle" />
+ <field name="preferenceLayoutChild" />
+ <field name="preferenceScreenStyle" />
+ <field name="preferenceStyle" />
+ <field name="presentationTheme" since="17" />
+ <field name="previewImage" since="11" />
+ <field name="priority" />
+ <field name="privateImeOptions" since="3" />
+ <field name="process" />
+ <field name="progress" />
+ <field name="progressBackgroundTint" since="21" />
+ <field name="progressBackgroundTintMode" since="21" />
+ <field name="progressBarPadding" since="11" />
+ <field name="progressBarStyle" />
+ <field name="progressBarStyleHorizontal" />
+ <field name="progressBarStyleInverse" since="4" />
+ <field name="progressBarStyleLarge" />
+ <field name="progressBarStyleLargeInverse" since="4" />
+ <field name="progressBarStyleSmall" />
+ <field name="progressBarStyleSmallInverse" since="4" />
+ <field name="progressBarStyleSmallTitle" />
+ <field name="progressDrawable" />
+ <field name="progressTint" since="21" />
+ <field name="progressTintMode" since="21" />
+ <field name="prompt" />
+ <field name="propertyName" since="11" />
+ <field name="propertyXName" since="21" />
+ <field name="propertyYName" since="21" />
+ <field name="protectionLevel" />
+ <field name="publicKey" since="14" />
+ <field name="queryActionMsg" />
+ <field name="queryAfterZeroResults" since="4" />
+ <field name="queryBackground" since="21" />
+ <field name="queryHint" since="11" />
+ <field name="quickContactBadgeStyleSmallWindowLarge" since="6" />
+ <field name="quickContactBadgeStyleSmallWindowMedium" since="6" />
+ <field name="quickContactBadgeStyleSmallWindowSmall" since="6" />
+ <field name="quickContactBadgeStyleWindowLarge" since="6" />
+ <field name="quickContactBadgeStyleWindowMedium" since="6" />
+ <field name="quickContactBadgeStyleWindowSmall" since="6" />
+ <field name="radioButtonStyle" />
+ <field name="radius" />
+ <field name="rating" />
+ <field name="ratingBarStyle" />
+ <field name="ratingBarStyleIndicator" />
+ <field name="ratingBarStyleSmall" />
+ <field name="readPermission" />
+ <field name="recognitionService" since="21" />
+ <field name="relinquishTaskIdentity" since="21" />
+ <field name="reparent" since="21" />
+ <field name="reparentWithOverlay" since="21" />
+ <field name="repeatCount" />
+ <field name="repeatMode" />
+ <field name="reqFiveWayNav" since="3" />
+ <field name="reqHardKeyboard" since="3" />
+ <field name="reqKeyboardType" since="3" />
+ <field name="reqNavigation" since="3" />
+ <field name="reqTouchScreen" since="3" />
+ <field name="requireDeviceUnlock" since="19" />
+ <field name="required" since="5" />
+ <field name="requiredAccountType" since="18" />
+ <field name="requiredForAllUsers" since="18" />
+ <field name="requiresFadingEdge" since="14" />
+ <field name="requiresSmallestWidthDp" since="13" />
+ <field name="resizeMode" since="12" />
+ <field name="resizeable" since="4" />
+ <field name="resource" />
+ <field name="restoreAnyVersion" since="8" />
+ <field name="restoreNeedsApplication" since="5" />
+ <field name="restrictedAccountType" since="18" />
+ <field name="restrictionType" since="21" />
+ <field name="resumeWhilePausing" since="21" />
+ <field name="reversible" since="21" />
+ <field name="right" />
+ <field name="ringtonePreferenceStyle" />
+ <field name="ringtoneType" />
+ <field name="rotation" since="11" />
+ <field name="rotationX" since="11" />
+ <field name="rotationY" since="11" />
+ <field name="rowCount" since="14" />
+ <field name="rowDelay" />
+ <field name="rowEdgeFlags" since="3" />
+ <field name="rowHeight" />
+ <field name="rowOrderPreserved" since="14" />
+ <field name="saveEnabled" />
+ <field name="scaleGravity" />
+ <field name="scaleHeight" />
+ <field name="scaleType" />
+ <field name="scaleWidth" />
+ <field name="scaleX" since="11" />
+ <field name="scaleY" since="11" />
+ <field name="scheme" />
+ <field name="screenDensity" since="9" />
+ <field name="screenOrientation" />
+ <field name="screenSize" since="9" />
+ <field name="scrollHorizontally" />
+ <field name="scrollViewStyle" />
+ <field name="scrollX" />
+ <field name="scrollY" />
+ <field name="scrollbarAlwaysDrawHorizontalTrack" />
+ <field name="scrollbarAlwaysDrawVerticalTrack" />
+ <field name="scrollbarDefaultDelayBeforeFade" since="5" />
+ <field name="scrollbarFadeDuration" since="5" />
+ <field name="scrollbarSize" />
+ <field name="scrollbarStyle" />
+ <field name="scrollbarThumbHorizontal" />
+ <field name="scrollbarThumbVertical" />
+ <field name="scrollbarTrackHorizontal" />
+ <field name="scrollbarTrackVertical" />
+ <field name="scrollbars" />
+ <field name="scrollingCache" />
+ <field name="searchButtonText" />
+ <field name="searchIcon" since="21" />
+ <field name="searchMode" />
+ <field name="searchSettingsDescription" since="4" />
+ <field name="searchSuggestAuthority" />
+ <field name="searchSuggestIntentAction" />
+ <field name="searchSuggestIntentData" />
+ <field name="searchSuggestPath" />
+ <field name="searchSuggestSelection" />
+ <field name="searchSuggestThreshold" since="4" />
+ <field name="searchViewStyle" since="21" />
+ <field name="secondaryProgress" />
+ <field name="secondaryProgressTint" since="21" />
+ <field name="secondaryProgressTintMode" since="21" />
+ <field name="seekBarStyle" />
+ <field name="segmentedButtonStyle" since="11" />
+ <field name="selectAllOnFocus" />
+ <field name="selectable" />
+ <field name="selectableItemBackground" since="11" />
+ <field name="selectableItemBackgroundBorderless" since="21" />
+ <field name="selectedDateVerticalBar" since="11" />
+ <field name="selectedWeekBackgroundColor" since="11" />
+ <field name="sessionService" since="21" />
+ <field name="settingsActivity" since="3" />
+ <field name="setupActivity" since="21" />
+ <field name="shadowColor" />
+ <field name="shadowDx" />
+ <field name="shadowDy" />
+ <field name="shadowRadius" />
+ <field name="shape" />
+ <field name="shareInterpolator" />
+ <field name="sharedUserId" />
+ <field name="sharedUserLabel" since="3" />
+ <field name="shouldDisableView" />
+ <field name="showAsAction" since="11" />
+ <field name="showDefault" />
+ <field name="showDividers" since="11" />
+ <field name="showOnLockScreen" since="17" />
+ <field name="showSilent" />
+ <field name="showText" since="21" />
+ <field name="showWeekNumber" since="11" />
+ <field name="shownWeekCount" since="11" />
+ <field name="shrinkColumns" />
+ <field name="singleLine" />
+ <field name="singleUser" since="17" />
+ <field name="slideEdge" since="21" />
+ <field name="smallIcon" since="5" />
+ <field name="smallScreens" since="4" />
+ <field name="smoothScrollbar" since="3" />
+ <field name="soundEffectsEnabled" />
+ <field name="spacing" />
+ <field name="spinnerDropDownItemStyle" />
+ <field name="spinnerItemStyle" />
+ <field name="spinnerMode" since="11" />
+ <field name="spinnerStyle" />
+ <field name="spinnersShown" since="11" />
+ <field name="splitMotionEvents" since="11" />
+ <field name="splitTrack" since="21" />
+ <field name="spotShadowAlpha" since="21" />
+ <field name="src" />
+ <field name="ssp" since="19" />
+ <field name="sspPattern" since="19" />
+ <field name="sspPrefix" since="19" />
+ <field name="stackFromBottom" />
+ <field name="stackViewStyle" since="21" />
+ <field name="starStyle" />
+ <field name="startColor" />
+ <field name="startDelay" since="19" />
+ <field name="startOffset" />
+ <field name="startYear" />
+ <field name="stateListAnimator" since="21" />
+ <field name="stateNotNeeded" />
+ <field name="state_above_anchor" />
+ <field name="state_accelerated" since="11" />
+ <field name="state_activated" since="11" />
+ <field name="state_active" />
+ <field name="state_checkable" />
+ <field name="state_checked" />
+ <field name="state_drag_can_accept" since="14" />
+ <field name="state_drag_hovered" since="14" />
+ <field name="state_empty" />
+ <field name="state_enabled" />
+ <field name="state_expanded" />
+ <field name="state_first" />
+ <field name="state_focused" />
+ <field name="state_hovered" since="14" />
+ <field name="state_last" />
+ <field name="state_long_pressable" since="3" />
+ <field name="state_middle" />
+ <field name="state_multiline" since="11" />
+ <field name="state_pressed" />
+ <field name="state_selected" />
+ <field name="state_single" />
+ <field name="state_window_focused" />
+ <field name="staticWallpaperPreview" since="11" />
+ <field name="statusBarColor" since="21" />
+ <field name="stepSize" />
+ <field name="stopWithTask" since="14" />
+ <field name="streamType" />
+ <field name="stretchColumns" />
+ <field name="stretchMode" />
+ <field name="strokeAlpha" since="21" />
+ <field name="strokeColor" since="21" />
+ <field name="strokeLineCap" since="21" />
+ <field name="strokeLineJoin" since="21" />
+ <field name="strokeMiterLimit" since="21" />
+ <field name="strokeWidth" since="21" />
+ <field name="submitBackground" since="21" />
+ <field name="subtitle" since="11" />
+ <field name="subtitleTextAppearance" since="21" />
+ <field name="subtitleTextStyle" since="11" />
+ <field name="subtypeExtraValue" since="14" />
+ <field name="subtypeId" since="17" />
+ <field name="subtypeLocale" since="14" />
+ <field name="suggestActionMsg" />
+ <field name="suggestActionMsgColumn" />
+ <field name="suggestionRowLayout" since="21" />
+ <field name="summary" />
+ <field name="summaryColumn" since="5" />
+ <field name="summaryOff" />
+ <field name="summaryOn" />
+ <field name="supportsRtl" since="17" />
+ <field name="supportsSwitchingToNextInputMethod" since="19" />
+ <field name="supportsUploading" since="5" />
+ <field name="switchMinWidth" since="14" />
+ <field name="switchPadding" since="14" />
+ <field name="switchPreferenceStyle" since="14" />
+ <field name="switchStyle" since="21" />
+ <field name="switchTextAppearance" since="14" />
+ <field name="switchTextOff" since="14" />
+ <field name="switchTextOn" since="14" />
+ <field name="syncable" />
+ <field name="tabStripEnabled" since="8" />
+ <field name="tabStripLeft" since="8" />
+ <field name="tabStripRight" since="8" />
+ <field name="tabWidgetStyle" />
+ <field name="tag" />
+ <field name="targetActivity" />
+ <field name="targetClass" />
+ <field name="targetDescriptions" since="14" />
+ <field name="targetId" since="19" />
+ <field name="targetName" since="21" />
+ <field name="targetPackage" />
+ <field name="targetSdkVersion" since="4" />
+ <field name="taskAffinity" />
+ <field name="taskCloseEnterAnimation" />
+ <field name="taskCloseExitAnimation" />
+ <field name="taskOpenEnterAnimation" />
+ <field name="taskOpenExitAnimation" />
+ <field name="taskToBackEnterAnimation" />
+ <field name="taskToBackExitAnimation" />
+ <field name="taskToFrontEnterAnimation" />
+ <field name="taskToFrontExitAnimation" />
+ <field name="tension" since="4" />
+ <field name="testOnly" since="4" />
+ <field name="text" />
+ <field name="textAlignment" since="17" />
+ <field name="textAllCaps" since="14" />
+ <field name="textAppearance" />
+ <field name="textAppearanceButton" />
+ <field name="textAppearanceInverse" />
+ <field name="textAppearanceLarge" />
+ <field name="textAppearanceLargeInverse" />
+ <field name="textAppearanceLargePopupMenu" since="11" />
+ <field name="textAppearanceListItem" since="14" />
+ <field name="textAppearanceListItemSecondary" since="21" />
+ <field name="textAppearanceListItemSmall" since="14" />
+ <field name="textAppearanceMedium" />
+ <field name="textAppearanceMediumInverse" />
+ <field name="textAppearanceSearchResultSubtitle" since="5" />
+ <field name="textAppearanceSearchResultTitle" since="5" />
+ <field name="textAppearanceSmall" />
+ <field name="textAppearanceSmallInverse" />
+ <field name="textAppearanceSmallPopupMenu" since="11" />
+ <field name="textCheckMark" />
+ <field name="textCheckMarkInverse" />
+ <field name="textColor" />
+ <field name="textColorAlertDialogListItem" since="11" />
+ <field name="textColorHighlight" />
+ <field name="textColorHighlightInverse" since="11" />
+ <field name="textColorHint" />
+ <field name="textColorHintInverse" />
+ <field name="textColorLink" />
+ <field name="textColorLinkInverse" since="11" />
+ <field name="textColorPrimary" />
+ <field name="textColorPrimaryDisableOnly" />
+ <field name="textColorPrimaryInverse" />
+ <field name="textColorPrimaryInverseDisableOnly" since="4" />
+ <field name="textColorPrimaryInverseNoDisable" />
+ <field name="textColorPrimaryNoDisable" />
+ <field name="textColorSecondary" />
+ <field name="textColorSecondaryInverse" />
+ <field name="textColorSecondaryInverseNoDisable" />
+ <field name="textColorSecondaryNoDisable" />
+ <field name="textColorTertiary" />
+ <field name="textColorTertiaryInverse" />
+ <field name="textCursorDrawable" since="12" />
+ <field name="textDirection" since="17" />
+ <field name="textEditNoPasteWindowLayout" since="11" />
+ <field name="textEditPasteWindowLayout" since="11" />
+ <field name="textEditSideNoPasteWindowLayout" since="11" />
+ <field name="textEditSidePasteWindowLayout" since="11" />
+ <field name="textEditSuggestionItemLayout" since="14" />
+ <field name="textFilterEnabled" />
+ <field name="textIsSelectable" since="11" />
+ <field name="textOff" />
+ <field name="textOn" />
+ <field name="textScaleX" />
+ <field name="textSelectHandle" since="9" />
+ <field name="textSelectHandleLeft" since="9" />
+ <field name="textSelectHandleRight" since="9" />
+ <field name="textSelectHandleWindowStyle" since="9" />
+ <field name="textSize" />
+ <field name="textStyle" />
+ <field name="textSuggestionsWindowStyle" since="14" />
+ <field name="textViewStyle" />
+ <field name="theme" />
+ <field name="thickness" since="3" />
+ <field name="thicknessRatio" />
+ <field name="thumb" />
+ <field name="thumbOffset" />
+ <field name="thumbTextPadding" since="14" />
+ <field name="thumbTint" since="21" />
+ <field name="thumbTintMode" since="21" />
+ <field name="thumbnail" since="5" />
+ <field name="tileMode" />
+ <field name="tileModeX" since="21" />
+ <field name="tileModeY" since="21" />
+ <field name="timePickerDialogTheme" since="21" />
+ <field name="timePickerMode" since="21" />
+ <field name="timePickerStyle" since="21" />
+ <field name="timeZone" since="17" />
+ <field name="tint" />
+ <field name="tintMode" since="21" />
+ <field name="title" />
+ <field name="titleCondensed" />
+ <field name="titleTextAppearance" since="21" />
+ <field name="titleTextStyle" since="11" />
+ <field name="toAlpha" />
+ <field name="toDegrees" />
+ <field name="toId" since="21" />
+ <field name="toScene" since="19" />
+ <field name="toXDelta" />
+ <field name="toXScale" />
+ <field name="toYDelta" />
+ <field name="toYScale" />
+ <field name="toolbarStyle" since="21" />
+ <field name="top" />
+ <field name="topBright" />
+ <field name="topDark" />
+ <field name="topLeftRadius" />
+ <field name="topOffset" since="3" />
+ <field name="topRightRadius" />
+ <field name="touchscreenBlocksFocus" since="21" />
+ <field name="track" since="14" />
+ <field name="transcriptMode" />
+ <field name="transformPivotX" since="11" />
+ <field name="transformPivotY" since="11" />
+ <field name="transition" since="19" />
+ <field name="transitionGroup" since="21" />
+ <field name="transitionName" since="21" />
+ <field name="transitionOrdering" since="19" />
+ <field name="transitionVisibilityMode" since="21" />
+ <field name="translateX" since="21" />
+ <field name="translateY" since="21" />
+ <field name="translationX" since="11" />
+ <field name="translationY" since="11" />
+ <field name="translationZ" since="21" />
+ <field name="trimPathEnd" since="21" />
+ <field name="trimPathOffset" since="21" />
+ <field name="trimPathStart" since="21" />
+ <field name="type" />
+ <field name="typeface" />
+ <field name="uiOptions" since="14" />
+ <field name="uncertainGestureColor" since="4" />
+ <field name="unfocusedMonthDateColor" since="11" />
+ <field name="unselectedAlpha" />
+ <field name="updatePeriodMillis" since="3" />
+ <field name="useDefaultMargins" since="14" />
+ <field name="useIntrinsicSizeAsMinimum" since="11" />
+ <field name="useLevel" />
+ <field name="userVisible" since="5" />
+ <field name="value" />
+ <field name="valueFrom" since="11" />
+ <field name="valueTo" since="11" />
+ <field name="valueType" since="11" />
+ <field name="variablePadding" />
+ <field name="vendor" since="19" />
+ <field name="versionCode" />
+ <field name="versionName" />
+ <field name="verticalCorrection" since="3" />
+ <field name="verticalDivider" />
+ <field name="verticalGap" since="3" />
+ <field name="verticalScrollbarPosition" since="11" />
+ <field name="verticalSpacing" />
+ <field name="viewportHeight" since="21" />
+ <field name="viewportWidth" since="21" />
+ <field name="visibility" />
+ <field name="visible" />
+ <field name="vmSafeMode" since="8" />
+ <field name="voiceIcon" since="21" />
+ <field name="voiceLanguage" since="3" />
+ <field name="voiceLanguageModel" since="3" />
+ <field name="voiceMaxResults" since="3" />
+ <field name="voicePromptText" since="3" />
+ <field name="voiceSearchMode" since="3" />
+ <field name="wallpaperCloseEnterAnimation" since="5" />
+ <field name="wallpaperCloseExitAnimation" since="5" />
+ <field name="wallpaperIntraCloseEnterAnimation" since="5" />
+ <field name="wallpaperIntraCloseExitAnimation" since="5" />
+ <field name="wallpaperIntraOpenEnterAnimation" since="5" />
+ <field name="wallpaperIntraOpenExitAnimation" since="5" />
+ <field name="wallpaperOpenEnterAnimation" since="5" />
+ <field name="wallpaperOpenExitAnimation" since="5" />
+ <field name="webTextViewStyle" since="8" />
+ <field name="webViewStyle" />
+ <field name="weekDayTextAppearance" since="11" />
+ <field name="weekNumberColor" since="11" />
+ <field name="weekSeparatorLineColor" since="11" />
+ <field name="weightSum" />
+ <field name="widgetCategory" since="17" />
+ <field name="widgetLayout" />
+ <field name="width" />
+ <field name="windowActionBar" since="11" />
+ <field name="windowActionBarOverlay" since="11" />
+ <field name="windowActionModeOverlay" since="11" />
+ <field name="windowActivityTransitions" since="21" />
+ <field name="windowAllowEnterTransitionOverlap" since="21" />
+ <field name="windowAllowReturnTransitionOverlap" since="21" />
+ <field name="windowAnimationStyle" />
+ <field name="windowBackground" />
+ <field name="windowClipToOutline" since="21" />
+ <field name="windowCloseOnTouchOutside" since="11" />
+ <field name="windowContentOverlay" />
+ <field name="windowContentTransitionManager" since="21" />
+ <field name="windowContentTransitions" since="21" />
+ <field name="windowDisablePreview" since="3" />
+ <field name="windowDrawsSystemBarBackgrounds" since="21" />
+ <field name="windowElevation" since="21" />
+ <field name="windowEnableSplitTouch" since="11" />
+ <field name="windowEnterAnimation" />
+ <field name="windowEnterTransition" since="21" />
+ <field name="windowExitAnimation" />
+ <field name="windowExitTransition" since="21" />
+ <field name="windowFrame" />
+ <field name="windowFullscreen" />
+ <field name="windowHideAnimation" />
+ <field name="windowIsFloating" />
+ <field name="windowIsTranslucent" />
+ <field name="windowMinWidthMajor" since="11" />
+ <field name="windowMinWidthMinor" since="11" />
+ <field name="windowNoDisplay" since="3" />
+ <field name="windowNoTitle" />
+ <field name="windowOverscan" since="18" />
+ <field name="windowReenterTransition" since="21" />
+ <field name="windowReturnTransition" since="21" />
+ <field name="windowSharedElementEnterTransition" since="21" />
+ <field name="windowSharedElementExitTransition" since="21" />
+ <field name="windowSharedElementReenterTransition" since="21" />
+ <field name="windowSharedElementReturnTransition" since="21" />
+ <field name="windowSharedElementsUseOverlay" since="21" />
+ <field name="windowShowAnimation" />
+ <field name="windowShowWallpaper" since="5" />
+ <field name="windowSoftInputMode" since="3" />
+ <field name="windowSwipeToDismiss" since="20" />
+ <field name="windowTitleBackgroundStyle" />
+ <field name="windowTitleSize" />
+ <field name="windowTitleStyle" />
+ <field name="windowTransitionBackgroundFadeDuration" since="21" />
+ <field name="windowTranslucentNavigation" since="19" />
+ <field name="windowTranslucentStatus" since="19" />
+ <field name="writePermission" />
+ <field name="x" />
+ <field name="xlargeScreens" since="9" />
+ <field name="y" />
+ <field name="yearListItemTextAppearance" since="21" />
+ <field name="yearListSelectorColor" since="21" />
+ <field name="yesNoPreferenceStyle" />
+ <field name="zAdjustment" />
+ </class>
+ <class name="android/R$bool" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/R$color" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="background_dark" />
+ <field name="background_light" />
+ <field name="black" />
+ <field name="darker_gray" />
+ <field name="holo_blue_bright" since="14" />
+ <field name="holo_blue_dark" since="14" />
+ <field name="holo_blue_light" since="14" />
+ <field name="holo_green_dark" since="14" />
+ <field name="holo_green_light" since="14" />
+ <field name="holo_orange_dark" since="14" />
+ <field name="holo_orange_light" since="14" />
+ <field name="holo_purple" since="14" />
+ <field name="holo_red_dark" since="14" />
+ <field name="holo_red_light" since="14" />
+ <field name="primary_text_dark" />
+ <field name="primary_text_dark_nodisable" />
+ <field name="primary_text_light" />
+ <field name="primary_text_light_nodisable" />
+ <field name="secondary_text_dark" />
+ <field name="secondary_text_dark_nodisable" />
+ <field name="secondary_text_light" />
+ <field name="secondary_text_light_nodisable" />
+ <field name="tab_indicator_text" />
+ <field name="tertiary_text_dark" />
+ <field name="tertiary_text_light" />
+ <field name="transparent" />
+ <field name="white" />
+ <field name="widget_edittext_dark" />
+ </class>
+ <class name="android/R$dimen" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="app_icon_size" />
+ <field name="dialog_min_width_major" since="11" />
+ <field name="dialog_min_width_minor" since="11" />
+ <field name="notification_large_icon_height" since="11" />
+ <field name="notification_large_icon_width" since="11" />
+ <field name="thumbnail_height" />
+ <field name="thumbnail_width" />
+ </class>
+ <class name="android/R$drawable" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="alert_dark_frame" />
+ <field name="alert_light_frame" />
+ <field name="arrow_down_float" />
+ <field name="arrow_up_float" />
+ <field name="bottom_bar" />
+ <field name="btn_default" />
+ <field name="btn_default_small" />
+ <field name="btn_dialog" />
+ <field name="btn_dropdown" />
+ <field name="btn_minus" />
+ <field name="btn_plus" />
+ <field name="btn_radio" />
+ <field name="btn_star" />
+ <field name="btn_star_big_off" />
+ <field name="btn_star_big_on" />
+ <field name="button_onoff_indicator_off" />
+ <field name="button_onoff_indicator_on" />
+ <field name="checkbox_off_background" />
+ <field name="checkbox_on_background" />
+ <field name="dark_header" since="3" />
+ <field name="dialog_frame" />
+ <field name="dialog_holo_dark_frame" since="11" />
+ <field name="dialog_holo_light_frame" since="11" />
+ <field name="divider_horizontal_bright" />
+ <field name="divider_horizontal_dark" />
+ <field name="divider_horizontal_dim_dark" />
+ <field name="divider_horizontal_textfield" />
+ <field name="edit_text" />
+ <field name="editbox_background" />
+ <field name="editbox_background_normal" />
+ <field name="editbox_dropdown_dark_frame" />
+ <field name="editbox_dropdown_light_frame" />
+ <field name="gallery_thumb" />
+ <field name="ic_btn_speak_now" since="3" />
+ <field name="ic_delete" />
+ <field name="ic_dialog_alert" />
+ <field name="ic_dialog_dialer" />
+ <field name="ic_dialog_email" />
+ <field name="ic_dialog_info" />
+ <field name="ic_dialog_map" />
+ <field name="ic_input_add" />
+ <field name="ic_input_delete" />
+ <field name="ic_input_get" />
+ <field name="ic_lock_idle_alarm" />
+ <field name="ic_lock_idle_charging" />
+ <field name="ic_lock_idle_lock" />
+ <field name="ic_lock_idle_low_battery" />
+ <field name="ic_lock_lock" />
+ <field name="ic_lock_power_off" />
+ <field name="ic_lock_silent_mode" />
+ <field name="ic_lock_silent_mode_off" />
+ <field name="ic_media_ff" />
+ <field name="ic_media_next" />
+ <field name="ic_media_pause" />
+ <field name="ic_media_play" />
+ <field name="ic_media_previous" />
+ <field name="ic_media_rew" />
+ <field name="ic_menu_add" />
+ <field name="ic_menu_agenda" />
+ <field name="ic_menu_always_landscape_portrait" />
+ <field name="ic_menu_call" />
+ <field name="ic_menu_camera" />
+ <field name="ic_menu_close_clear_cancel" />
+ <field name="ic_menu_compass" />
+ <field name="ic_menu_crop" />
+ <field name="ic_menu_day" />
+ <field name="ic_menu_delete" />
+ <field name="ic_menu_directions" />
+ <field name="ic_menu_edit" />
+ <field name="ic_menu_gallery" />
+ <field name="ic_menu_help" />
+ <field name="ic_menu_info_details" />
+ <field name="ic_menu_manage" />
+ <field name="ic_menu_mapmode" />
+ <field name="ic_menu_month" />
+ <field name="ic_menu_more" />
+ <field name="ic_menu_my_calendar" />
+ <field name="ic_menu_mylocation" />
+ <field name="ic_menu_myplaces" />
+ <field name="ic_menu_preferences" />
+ <field name="ic_menu_recent_history" />
+ <field name="ic_menu_report_image" />
+ <field name="ic_menu_revert" />
+ <field name="ic_menu_rotate" />
+ <field name="ic_menu_save" />
+ <field name="ic_menu_search" />
+ <field name="ic_menu_send" />
+ <field name="ic_menu_set_as" />
+ <field name="ic_menu_share" />
+ <field name="ic_menu_slideshow" />
+ <field name="ic_menu_sort_alphabetically" />
+ <field name="ic_menu_sort_by_size" />
+ <field name="ic_menu_today" />
+ <field name="ic_menu_upload" />
+ <field name="ic_menu_upload_you_tube" />
+ <field name="ic_menu_view" />
+ <field name="ic_menu_week" />
+ <field name="ic_menu_zoom" />
+ <field name="ic_notification_clear_all" />
+ <field name="ic_notification_overlay" />
+ <field name="ic_partial_secure" />
+ <field name="ic_popup_disk_full" />
+ <field name="ic_popup_reminder" />
+ <field name="ic_popup_sync" />
+ <field name="ic_search_category_default" />
+ <field name="ic_secure" />
+ <field name="list_selector_background" />
+ <field name="menu_frame" />
+ <field name="menu_full_frame" />
+ <field name="menuitem_background" />
+ <field name="picture_frame" />
+ <field name="presence_audio_away" since="9" />
+ <field name="presence_audio_busy" since="9" />
+ <field name="presence_audio_online" since="9" />
+ <field name="presence_away" />
+ <field name="presence_busy" />
+ <field name="presence_invisible" />
+ <field name="presence_offline" />
+ <field name="presence_online" />
+ <field name="presence_video_away" since="9" />
+ <field name="presence_video_busy" since="9" />
+ <field name="presence_video_online" since="9" />
+ <field name="progress_horizontal" />
+ <field name="progress_indeterminate_horizontal" />
+ <field name="radiobutton_off_background" />
+ <field name="radiobutton_on_background" />
+ <field name="screen_background_dark" />
+ <field name="screen_background_dark_transparent" since="5" />
+ <field name="screen_background_light" />
+ <field name="screen_background_light_transparent" since="5" />
+ <field name="spinner_background" />
+ <field name="spinner_dropdown_background" />
+ <field name="star_big_off" />
+ <field name="star_big_on" />
+ <field name="star_off" />
+ <field name="star_on" />
+ <field name="stat_notify_call_mute" />
+ <field name="stat_notify_chat" />
+ <field name="stat_notify_error" />
+ <field name="stat_notify_missed_call" />
+ <field name="stat_notify_more" />
+ <field name="stat_notify_sdcard" />
+ <field name="stat_notify_sdcard_prepare" since="5" />
+ <field name="stat_notify_sdcard_usb" />
+ <field name="stat_notify_sync" />
+ <field name="stat_notify_sync_noanim" />
+ <field name="stat_notify_voicemail" />
+ <field name="stat_sys_data_bluetooth" />
+ <field name="stat_sys_download" />
+ <field name="stat_sys_download_done" />
+ <field name="stat_sys_headset" />
+ <field name="stat_sys_phone_call" />
+ <field name="stat_sys_phone_call_forward" />
+ <field name="stat_sys_phone_call_on_hold" />
+ <field name="stat_sys_speakerphone" />
+ <field name="stat_sys_upload" />
+ <field name="stat_sys_upload_done" />
+ <field name="stat_sys_vp_phone_call" since="4" />
+ <field name="stat_sys_vp_phone_call_on_hold" since="4" />
+ <field name="stat_sys_warning" />
+ <field name="status_bar_item_app_background" />
+ <field name="status_bar_item_background" />
+ <field name="sym_action_call" />
+ <field name="sym_action_chat" />
+ <field name="sym_action_email" />
+ <field name="sym_call_incoming" />
+ <field name="sym_call_missed" />
+ <field name="sym_call_outgoing" />
+ <field name="sym_contact_card" />
+ <field name="sym_def_app_icon" />
+ <field name="title_bar" />
+ <field name="title_bar_tall" since="3" />
+ <field name="toast_frame" />
+ <field name="zoom_plate" />
+ </class>
+ <class name="android/R$fraction" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/R$id" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="addToDictionary" since="3" />
+ <field name="background" />
+ <field name="button1" />
+ <field name="button2" />
+ <field name="button3" />
+ <field name="candidatesArea" since="3" />
+ <field name="checkbox" />
+ <field name="closeButton" since="3" />
+ <field name="content" />
+ <field name="copy" since="3" />
+ <field name="copyUrl" since="3" />
+ <field name="custom" since="8" />
+ <field name="cut" since="3" />
+ <field name="edit" />
+ <field name="empty" />
+ <field name="extractArea" since="3" />
+ <field name="hint" />
+ <field name="home" since="11" />
+ <field name="icon" />
+ <field name="icon1" />
+ <field name="icon2" />
+ <field name="input" />
+ <field name="inputArea" since="3" />
+ <field name="inputExtractEditText" since="3" />
+ <field name="keyboardView" since="3" />
+ <field name="list" />
+ <field name="mask" since="21" />
+ <field name="message" />
+ <field name="navigationBarBackground" since="21" />
+ <field name="paste" since="3" />
+ <field name="primary" />
+ <field name="progress" />
+ <field name="secondaryProgress" />
+ <field name="selectAll" since="3" />
+ <field name="selectTextMode" since="11" />
+ <field name="selectedIcon" />
+ <field name="startSelectingText" since="3" />
+ <field name="statusBarBackground" since="21" />
+ <field name="stopSelectingText" since="3" />
+ <field name="summary" />
+ <field name="switchInputMethod" since="3" />
+ <field name="tabcontent" />
+ <field name="tabhost" />
+ <field name="tabs" />
+ <field name="text1" />
+ <field name="text2" />
+ <field name="title" />
+ <field name="toggle" />
+ <field name="widget_frame" />
+ </class>
+ <class name="android/R$integer" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="config_longAnimTime" />
+ <field name="config_mediumAnimTime" />
+ <field name="config_shortAnimTime" />
+ <field name="status_bar_notification_info_maxnum" since="14" />
+ </class>
+ <class name="android/R$interpolator" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="accelerate_cubic" />
+ <field name="accelerate_decelerate" />
+ <field name="accelerate_quad" />
+ <field name="accelerate_quint" />
+ <field name="anticipate" />
+ <field name="anticipate_overshoot" />
+ <field name="bounce" />
+ <field name="cycle" />
+ <field name="decelerate_cubic" />
+ <field name="decelerate_quad" />
+ <field name="decelerate_quint" />
+ <field name="fast_out_linear_in" since="21" />
+ <field name="fast_out_slow_in" since="21" />
+ <field name="linear" />
+ <field name="linear_out_slow_in" since="21" />
+ <field name="overshoot" />
+ </class>
+ <class name="android/R$layout" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="activity_list_item" />
+ <field name="browser_link_context_header" />
+ <field name="expandable_list_content" />
+ <field name="list_content" since="11" />
+ <field name="preference_category" />
+ <field name="select_dialog_item" />
+ <field name="select_dialog_multichoice" />
+ <field name="select_dialog_singlechoice" />
+ <field name="simple_dropdown_item_1line" />
+ <field name="simple_expandable_list_item_1" />
+ <field name="simple_expandable_list_item_2" />
+ <field name="simple_gallery_item" />
+ <field name="simple_list_item_1" />
+ <field name="simple_list_item_2" />
+ <field name="simple_list_item_activated_1" since="11" />
+ <field name="simple_list_item_activated_2" since="11" />
+ <field name="simple_list_item_checked" />
+ <field name="simple_list_item_multiple_choice" />
+ <field name="simple_list_item_single_choice" />
+ <field name="simple_selectable_list_item" since="11" />
+ <field name="simple_spinner_dropdown_item" />
+ <field name="simple_spinner_item" />
+ <field name="test_list_item" />
+ <field name="two_line_list_item" />
+ </class>
+ <class name="android/R$menu" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/R$mipmap" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="sym_def_app_icon" />
+ </class>
+ <class name="android/R$plurals" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/R$raw" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/R$string" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="VideoView_error_button" />
+ <field name="VideoView_error_text_invalid_progressive_playback" since="3" />
+ <field name="VideoView_error_text_unknown" />
+ <field name="VideoView_error_title" />
+ <field name="cancel" />
+ <field name="copy" />
+ <field name="copyUrl" />
+ <field name="cut" />
+ <field name="defaultMsisdnAlphaTag" />
+ <field name="defaultVoiceMailAlphaTag" />
+ <field name="dialog_alert_title" since="3" />
+ <field name="emptyPhoneNumber" />
+ <field name="httpErrorBadUrl" />
+ <field name="httpErrorUnsupportedScheme" />
+ <field name="no" />
+ <field name="ok" />
+ <field name="paste" />
+ <field name="search_go" />
+ <field name="selectAll" />
+ <field name="selectTextMode" since="11" />
+ <field name="status_bar_notification_info_overflow" since="14" />
+ <field name="unknownName" />
+ <field name="untitled" />
+ <field name="yes" />
+ </class>
+ <class name="android/R$style" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="Animation" />
+ <field name="Animation_Activity" />
+ <field name="Animation_Dialog" />
+ <field name="Animation_InputMethod" since="5" />
+ <field name="Animation_Toast" />
+ <field name="Animation_Translucent" />
+ <field name="DeviceDefault_ButtonBar" since="14" />
+ <field name="DeviceDefault_ButtonBar_AlertDialog" since="14" />
+ <field name="DeviceDefault_Light_ButtonBar" since="14" />
+ <field name="DeviceDefault_Light_ButtonBar_AlertDialog" since="14" />
+ <field name="DeviceDefault_Light_SegmentedButton" since="14" />
+ <field name="DeviceDefault_SegmentedButton" since="14" />
+ <field name="Holo_ButtonBar" since="11" />
+ <field name="Holo_ButtonBar_AlertDialog" since="11" />
+ <field name="Holo_Light_ButtonBar" since="11" />
+ <field name="Holo_Light_ButtonBar_AlertDialog" since="11" />
+ <field name="Holo_Light_SegmentedButton" since="11" />
+ <field name="Holo_SegmentedButton" since="11" />
+ <field name="MediaButton" />
+ <field name="MediaButton_Ffwd" />
+ <field name="MediaButton_Next" />
+ <field name="MediaButton_Pause" />
+ <field name="MediaButton_Play" />
+ <field name="MediaButton_Previous" />
+ <field name="MediaButton_Rew" />
+ <field name="TextAppearance" />
+ <field name="TextAppearance_DeviceDefault" since="14" />
+ <field name="TextAppearance_DeviceDefault_DialogWindowTitle" since="14" />
+ <field name="TextAppearance_DeviceDefault_Inverse" since="14" />
+ <field name="TextAppearance_DeviceDefault_Large" since="14" />
+ <field name="TextAppearance_DeviceDefault_Large_Inverse" since="14" />
+ <field name="TextAppearance_DeviceDefault_Medium" since="14" />
+ <field name="TextAppearance_DeviceDefault_Medium_Inverse" since="14" />
+ <field name="TextAppearance_DeviceDefault_SearchResult_Subtitle" since="14" />
+ <field name="TextAppearance_DeviceDefault_SearchResult_Title" since="14" />
+ <field name="TextAppearance_DeviceDefault_Small" since="14" />
+ <field name="TextAppearance_DeviceDefault_Small_Inverse" since="14" />
+ <field name="TextAppearance_DeviceDefault_Widget" since="14" />
+ <field name="TextAppearance_DeviceDefault_Widget_ActionBar_Menu" since="14" />
+ <field name="TextAppearance_DeviceDefault_Widget_ActionBar_Subtitle" since="14" />
+ <field name="TextAppearance_DeviceDefault_Widget_ActionBar_Subtitle_Inverse" since="14" />
+ <field name="TextAppearance_DeviceDefault_Widget_ActionBar_Title" since="14" />
+ <field name="TextAppearance_DeviceDefault_Widget_ActionBar_Title_Inverse" since="14" />
+ <field name="TextAppearance_DeviceDefault_Widget_ActionMode_Subtitle" since="14" />
+ <field name="TextAppearance_DeviceDefault_Widget_ActionMode_Subtitle_Inverse" since="14" />
+ <field name="TextAppearance_DeviceDefault_Widget_ActionMode_Title" since="14" />
+ <field name="TextAppearance_DeviceDefault_Widget_ActionMode_Title_Inverse" since="14" />
+ <field name="TextAppearance_DeviceDefault_Widget_Button" since="14" />
+ <field name="TextAppearance_DeviceDefault_Widget_DropDownHint" since="14" />
+ <field name="TextAppearance_DeviceDefault_Widget_DropDownItem" since="14" />
+ <field name="TextAppearance_DeviceDefault_Widget_EditText" since="14" />
+ <field name="TextAppearance_DeviceDefault_Widget_IconMenu_Item" since="14" />
+ <field name="TextAppearance_DeviceDefault_Widget_PopupMenu" since="14" />
+ <field name="TextAppearance_DeviceDefault_Widget_PopupMenu_Large" since="14" />
+ <field name="TextAppearance_DeviceDefault_Widget_PopupMenu_Small" since="14" />
+ <field name="TextAppearance_DeviceDefault_Widget_TabWidget" since="14" />
+ <field name="TextAppearance_DeviceDefault_Widget_TextView" since="14" />
+ <field name="TextAppearance_DeviceDefault_Widget_TextView_PopupMenu" since="14" />
+ <field name="TextAppearance_DeviceDefault_Widget_TextView_SpinnerItem" since="14" />
+ <field name="TextAppearance_DeviceDefault_WindowTitle" since="14" />
+ <field name="TextAppearance_DialogWindowTitle" />
+ <field name="TextAppearance_Holo" since="13" />
+ <field name="TextAppearance_Holo_DialogWindowTitle" since="13" />
+ <field name="TextAppearance_Holo_Inverse" since="13" />
+ <field name="TextAppearance_Holo_Large" since="13" />
+ <field name="TextAppearance_Holo_Large_Inverse" since="13" />
+ <field name="TextAppearance_Holo_Medium" since="13" />
+ <field name="TextAppearance_Holo_Medium_Inverse" since="13" />
+ <field name="TextAppearance_Holo_SearchResult_Subtitle" since="13" />
+ <field name="TextAppearance_Holo_SearchResult_Title" since="13" />
+ <field name="TextAppearance_Holo_Small" since="13" />
+ <field name="TextAppearance_Holo_Small_Inverse" since="13" />
+ <field name="TextAppearance_Holo_Widget" since="13" />
+ <field name="TextAppearance_Holo_Widget_ActionBar_Menu" since="14" />
+ <field name="TextAppearance_Holo_Widget_ActionBar_Subtitle" since="13" />
+ <field name="TextAppearance_Holo_Widget_ActionBar_Subtitle_Inverse" since="14" />
+ <field name="TextAppearance_Holo_Widget_ActionBar_Title" since="13" />
+ <field name="TextAppearance_Holo_Widget_ActionBar_Title_Inverse" since="14" />
+ <field name="TextAppearance_Holo_Widget_ActionMode_Subtitle" since="13" />
+ <field name="TextAppearance_Holo_Widget_ActionMode_Subtitle_Inverse" since="14" />
+ <field name="TextAppearance_Holo_Widget_ActionMode_Title" since="13" />
+ <field name="TextAppearance_Holo_Widget_ActionMode_Title_Inverse" since="14" />
+ <field name="TextAppearance_Holo_Widget_Button" since="13" />
+ <field name="TextAppearance_Holo_Widget_DropDownHint" since="13" />
+ <field name="TextAppearance_Holo_Widget_DropDownItem" since="13" />
+ <field name="TextAppearance_Holo_Widget_EditText" since="13" />
+ <field name="TextAppearance_Holo_Widget_IconMenu_Item" since="13" />
+ <field name="TextAppearance_Holo_Widget_PopupMenu" since="13" />
+ <field name="TextAppearance_Holo_Widget_PopupMenu_Large" since="13" />
+ <field name="TextAppearance_Holo_Widget_PopupMenu_Small" since="13" />
+ <field name="TextAppearance_Holo_Widget_TabWidget" since="13" />
+ <field name="TextAppearance_Holo_Widget_TextView" since="13" />
+ <field name="TextAppearance_Holo_Widget_TextView_PopupMenu" since="13" />
+ <field name="TextAppearance_Holo_Widget_TextView_SpinnerItem" since="13" />
+ <field name="TextAppearance_Holo_WindowTitle" since="13" />
+ <field name="TextAppearance_Inverse" />
+ <field name="TextAppearance_Large" />
+ <field name="TextAppearance_Large_Inverse" />
+ <field name="TextAppearance_Material" since="21" />
+ <field name="TextAppearance_Material_Body1" since="21" />
+ <field name="TextAppearance_Material_Body2" since="21" />
+ <field name="TextAppearance_Material_Button" since="21" />
+ <field name="TextAppearance_Material_Caption" since="21" />
+ <field name="TextAppearance_Material_DialogWindowTitle" since="21" />
+ <field name="TextAppearance_Material_Display1" since="21" />
+ <field name="TextAppearance_Material_Display2" since="21" />
+ <field name="TextAppearance_Material_Display3" since="21" />
+ <field name="TextAppearance_Material_Display4" since="21" />
+ <field name="TextAppearance_Material_Headline" since="21" />
+ <field name="TextAppearance_Material_Inverse" since="21" />
+ <field name="TextAppearance_Material_Large" since="21" />
+ <field name="TextAppearance_Material_Large_Inverse" since="21" />
+ <field name="TextAppearance_Material_Medium" since="21" />
+ <field name="TextAppearance_Material_Medium_Inverse" since="21" />
+ <field name="TextAppearance_Material_Menu" since="21" />
+ <field name="TextAppearance_Material_Notification" since="21" />
+ <field name="TextAppearance_Material_Notification_Emphasis" since="21" />
+ <field name="TextAppearance_Material_Notification_Info" since="21" />
+ <field name="TextAppearance_Material_Notification_Line2" since="21" />
+ <field name="TextAppearance_Material_Notification_Time" since="21" />
+ <field name="TextAppearance_Material_Notification_Title" since="21" />
+ <field name="TextAppearance_Material_SearchResult_Subtitle" since="21" />
+ <field name="TextAppearance_Material_SearchResult_Title" since="21" />
+ <field name="TextAppearance_Material_Small" since="21" />
+ <field name="TextAppearance_Material_Small_Inverse" since="21" />
+ <field name="TextAppearance_Material_Subhead" since="21" />
+ <field name="TextAppearance_Material_Title" since="21" />
+ <field name="TextAppearance_Material_Widget" since="21" />
+ <field name="TextAppearance_Material_Widget_ActionBar_Menu" since="21" />
+ <field name="TextAppearance_Material_Widget_ActionBar_Subtitle" since="21" />
+ <field name="TextAppearance_Material_Widget_ActionBar_Subtitle_Inverse" since="21" />
+ <field name="TextAppearance_Material_Widget_ActionBar_Title" since="21" />
+ <field name="TextAppearance_Material_Widget_ActionBar_Title_Inverse" since="21" />
+ <field name="TextAppearance_Material_Widget_ActionMode_Subtitle" since="21" />
+ <field name="TextAppearance_Material_Widget_ActionMode_Subtitle_Inverse" since="21" />
+ <field name="TextAppearance_Material_Widget_ActionMode_Title" since="21" />
+ <field name="TextAppearance_Material_Widget_ActionMode_Title_Inverse" since="21" />
+ <field name="TextAppearance_Material_Widget_Button" since="21" />
+ <field name="TextAppearance_Material_Widget_DropDownHint" since="21" />
+ <field name="TextAppearance_Material_Widget_DropDownItem" since="21" />
+ <field name="TextAppearance_Material_Widget_EditText" since="21" />
+ <field name="TextAppearance_Material_Widget_IconMenu_Item" since="21" />
+ <field name="TextAppearance_Material_Widget_PopupMenu" since="21" />
+ <field name="TextAppearance_Material_Widget_PopupMenu_Large" since="21" />
+ <field name="TextAppearance_Material_Widget_PopupMenu_Small" since="21" />
+ <field name="TextAppearance_Material_Widget_TabWidget" since="21" />
+ <field name="TextAppearance_Material_Widget_TextView" since="21" />
+ <field name="TextAppearance_Material_Widget_TextView_PopupMenu" since="21" />
+ <field name="TextAppearance_Material_Widget_TextView_SpinnerItem" since="21" />
+ <field name="TextAppearance_Material_Widget_Toolbar_Subtitle" since="21" />
+ <field name="TextAppearance_Material_Widget_Toolbar_Title" since="21" />
+ <field name="TextAppearance_Material_WindowTitle" since="21" />
+ <field name="TextAppearance_Medium" />
+ <field name="TextAppearance_Medium_Inverse" />
+ <field name="TextAppearance_Small" />
+ <field name="TextAppearance_Small_Inverse" />
+ <field name="TextAppearance_StatusBar_EventContent" since="9" />
+ <field name="TextAppearance_StatusBar_EventContent_Title" since="9" />
+ <field name="TextAppearance_StatusBar_Icon" since="9" />
+ <field name="TextAppearance_StatusBar_Title" since="9" />
+ <field name="TextAppearance_SuggestionHighlight" since="14" />
+ <field name="TextAppearance_Theme" />
+ <field name="TextAppearance_Theme_Dialog" />
+ <field name="TextAppearance_Widget" />
+ <field name="TextAppearance_Widget_Button" />
+ <field name="TextAppearance_Widget_DropDownHint" />
+ <field name="TextAppearance_Widget_DropDownItem" />
+ <field name="TextAppearance_Widget_EditText" />
+ <field name="TextAppearance_Widget_IconMenu_Item" />
+ <field name="TextAppearance_Widget_PopupMenu_Large" since="11" />
+ <field name="TextAppearance_Widget_PopupMenu_Small" since="11" />
+ <field name="TextAppearance_Widget_TabWidget" />
+ <field name="TextAppearance_Widget_TextView" />
+ <field name="TextAppearance_Widget_TextView_PopupMenu" />
+ <field name="TextAppearance_Widget_TextView_SpinnerItem" />
+ <field name="TextAppearance_WindowTitle" />
+ <field name="Theme" />
+ <field name="ThemeOverlay" since="21" />
+ <field name="ThemeOverlay_Material" since="21" />
+ <field name="ThemeOverlay_Material_ActionBar" since="21" />
+ <field name="ThemeOverlay_Material_Dark" since="21" />
+ <field name="ThemeOverlay_Material_Dark_ActionBar" since="21" />
+ <field name="ThemeOverlay_Material_Light" since="21" />
+ <field name="Theme_Black" />
+ <field name="Theme_Black_NoTitleBar" />
+ <field name="Theme_Black_NoTitleBar_Fullscreen" />
+ <field name="Theme_DeviceDefault" since="14" />
+ <field name="Theme_DeviceDefault_Dialog" since="14" />
+ <field name="Theme_DeviceDefault_DialogWhenLarge" since="14" />
+ <field name="Theme_DeviceDefault_DialogWhenLarge_NoActionBar" since="14" />
+ <field name="Theme_DeviceDefault_Dialog_MinWidth" since="14" />
+ <field name="Theme_DeviceDefault_Dialog_NoActionBar" since="14" />
+ <field name="Theme_DeviceDefault_Dialog_NoActionBar_MinWidth" since="14" />
+ <field name="Theme_DeviceDefault_InputMethod" since="14" />
+ <field name="Theme_DeviceDefault_Light" since="14" />
+ <field name="Theme_DeviceDefault_Light_DarkActionBar" since="14" />
+ <field name="Theme_DeviceDefault_Light_Dialog" since="14" />
+ <field name="Theme_DeviceDefault_Light_DialogWhenLarge" since="14" />
+ <field name="Theme_DeviceDefault_Light_DialogWhenLarge_NoActionBar" since="14" />
+ <field name="Theme_DeviceDefault_Light_Dialog_MinWidth" since="14" />
+ <field name="Theme_DeviceDefault_Light_Dialog_NoActionBar" since="14" />
+ <field name="Theme_DeviceDefault_Light_Dialog_NoActionBar_MinWidth" since="14" />
+ <field name="Theme_DeviceDefault_Light_NoActionBar" since="14" />
+ <field name="Theme_DeviceDefault_Light_NoActionBar_Fullscreen" since="14" />
+ <field name="Theme_DeviceDefault_Light_NoActionBar_Overscan" since="18" />
+ <field name="Theme_DeviceDefault_Light_NoActionBar_TranslucentDecor" since="19" />
+ <field name="Theme_DeviceDefault_Light_Panel" since="14" />
+ <field name="Theme_DeviceDefault_NoActionBar" since="14" />
+ <field name="Theme_DeviceDefault_NoActionBar_Fullscreen" since="14" />
+ <field name="Theme_DeviceDefault_NoActionBar_Overscan" since="18" />
+ <field name="Theme_DeviceDefault_NoActionBar_TranslucentDecor" since="19" />
+ <field name="Theme_DeviceDefault_Panel" since="14" />
+ <field name="Theme_DeviceDefault_Settings" since="21" />
+ <field name="Theme_DeviceDefault_Wallpaper" since="14" />
+ <field name="Theme_DeviceDefault_Wallpaper_NoTitleBar" since="14" />
+ <field name="Theme_Dialog" />
+ <field name="Theme_Holo" since="11" />
+ <field name="Theme_Holo_Dialog" since="11" />
+ <field name="Theme_Holo_DialogWhenLarge" since="11" />
+ <field name="Theme_Holo_DialogWhenLarge_NoActionBar" since="11" />
+ <field name="Theme_Holo_Dialog_MinWidth" since="11" />
+ <field name="Theme_Holo_Dialog_NoActionBar" since="11" />
+ <field name="Theme_Holo_Dialog_NoActionBar_MinWidth" since="11" />
+ <field name="Theme_Holo_InputMethod" since="11" />
+ <field name="Theme_Holo_Light" since="11" />
+ <field name="Theme_Holo_Light_DarkActionBar" since="14" />
+ <field name="Theme_Holo_Light_Dialog" since="11" />
+ <field name="Theme_Holo_Light_DialogWhenLarge" since="11" />
+ <field name="Theme_Holo_Light_DialogWhenLarge_NoActionBar" since="11" />
+ <field name="Theme_Holo_Light_Dialog_MinWidth" since="11" />
+ <field name="Theme_Holo_Light_Dialog_NoActionBar" since="11" />
+ <field name="Theme_Holo_Light_Dialog_NoActionBar_MinWidth" since="11" />
+ <field name="Theme_Holo_Light_NoActionBar" since="13" />
+ <field name="Theme_Holo_Light_NoActionBar_Fullscreen" since="13" />
+ <field name="Theme_Holo_Light_NoActionBar_Overscan" since="18" />
+ <field name="Theme_Holo_Light_NoActionBar_TranslucentDecor" since="19" />
+ <field name="Theme_Holo_Light_Panel" since="11" />
+ <field name="Theme_Holo_NoActionBar" since="11" />
+ <field name="Theme_Holo_NoActionBar_Fullscreen" since="11" />
+ <field name="Theme_Holo_NoActionBar_Overscan" since="18" />
+ <field name="Theme_Holo_NoActionBar_TranslucentDecor" since="19" />
+ <field name="Theme_Holo_Panel" since="11" />
+ <field name="Theme_Holo_Wallpaper" since="11" />
+ <field name="Theme_Holo_Wallpaper_NoTitleBar" since="11" />
+ <field name="Theme_InputMethod" since="3" />
+ <field name="Theme_Light" />
+ <field name="Theme_Light_NoTitleBar" />
+ <field name="Theme_Light_NoTitleBar_Fullscreen" />
+ <field name="Theme_Light_Panel" since="3" />
+ <field name="Theme_Light_WallpaperSettings" since="5" />
+ <field name="Theme_Material" since="21" />
+ <field name="Theme_Material_Dialog" since="21" />
+ <field name="Theme_Material_DialogWhenLarge" since="21" />
+ <field name="Theme_Material_DialogWhenLarge_NoActionBar" since="21" />
+ <field name="Theme_Material_Dialog_Alert" since="21" />
+ <field name="Theme_Material_Dialog_MinWidth" since="21" />
+ <field name="Theme_Material_Dialog_NoActionBar" since="21" />
+ <field name="Theme_Material_Dialog_NoActionBar_MinWidth" since="21" />
+ <field name="Theme_Material_Dialog_Presentation" since="21" />
+ <field name="Theme_Material_InputMethod" since="21" />
+ <field name="Theme_Material_Light" since="21" />
+ <field name="Theme_Material_Light_DarkActionBar" since="21" />
+ <field name="Theme_Material_Light_Dialog" since="21" />
+ <field name="Theme_Material_Light_DialogWhenLarge" since="21" />
+ <field name="Theme_Material_Light_DialogWhenLarge_NoActionBar" since="21" />
+ <field name="Theme_Material_Light_Dialog_Alert" since="21" />
+ <field name="Theme_Material_Light_Dialog_MinWidth" since="21" />
+ <field name="Theme_Material_Light_Dialog_NoActionBar" since="21" />
+ <field name="Theme_Material_Light_Dialog_NoActionBar_MinWidth" since="21" />
+ <field name="Theme_Material_Light_Dialog_Presentation" since="21" />
+ <field name="Theme_Material_Light_NoActionBar" since="21" />
+ <field name="Theme_Material_Light_NoActionBar_Fullscreen" since="21" />
+ <field name="Theme_Material_Light_NoActionBar_Overscan" since="21" />
+ <field name="Theme_Material_Light_NoActionBar_TranslucentDecor" since="21" />
+ <field name="Theme_Material_Light_Panel" since="21" />
+ <field name="Theme_Material_Light_Voice" since="21" />
+ <field name="Theme_Material_NoActionBar" since="21" />
+ <field name="Theme_Material_NoActionBar_Fullscreen" since="21" />
+ <field name="Theme_Material_NoActionBar_Overscan" since="21" />
+ <field name="Theme_Material_NoActionBar_TranslucentDecor" since="21" />
+ <field name="Theme_Material_Panel" since="21" />
+ <field name="Theme_Material_Settings" since="21" />
+ <field name="Theme_Material_Voice" since="21" />
+ <field name="Theme_Material_Wallpaper" since="21" />
+ <field name="Theme_Material_Wallpaper_NoTitleBar" since="21" />
+ <field name="Theme_NoDisplay" since="3" />
+ <field name="Theme_NoTitleBar" />
+ <field name="Theme_NoTitleBar_Fullscreen" />
+ <field name="Theme_NoTitleBar_OverlayActionModes" since="11" />
+ <field name="Theme_Panel" since="3" />
+ <field name="Theme_Translucent" />
+ <field name="Theme_Translucent_NoTitleBar" />
+ <field name="Theme_Translucent_NoTitleBar_Fullscreen" />
+ <field name="Theme_Wallpaper" since="5" />
+ <field name="Theme_WallpaperSettings" since="5" />
+ <field name="Theme_Wallpaper_NoTitleBar" since="5" />
+ <field name="Theme_Wallpaper_NoTitleBar_Fullscreen" since="5" />
+ <field name="Theme_WithActionBar" since="11" />
+ <field name="Widget" />
+ <field name="Widget_AbsListView" />
+ <field name="Widget_ActionBar" since="11" />
+ <field name="Widget_ActionBar_TabBar" since="13" />
+ <field name="Widget_ActionBar_TabText" since="13" />
+ <field name="Widget_ActionBar_TabView" since="13" />
+ <field name="Widget_ActionButton" since="11" />
+ <field name="Widget_ActionButton_CloseMode" since="11" />
+ <field name="Widget_ActionButton_Overflow" since="11" />
+ <field name="Widget_AutoCompleteTextView" />
+ <field name="Widget_Button" />
+ <field name="Widget_Button_Inset" />
+ <field name="Widget_Button_Small" />
+ <field name="Widget_Button_Toggle" />
+ <field name="Widget_CalendarView" since="11" />
+ <field name="Widget_CompoundButton" />
+ <field name="Widget_CompoundButton_CheckBox" />
+ <field name="Widget_CompoundButton_RadioButton" />
+ <field name="Widget_CompoundButton_Star" />
+ <field name="Widget_DatePicker" since="11" />
+ <field name="Widget_DeviceDefault" since="14" />
+ <field name="Widget_DeviceDefault_ActionBar" since="14" />
+ <field name="Widget_DeviceDefault_ActionBar_Solid" since="14" />
+ <field name="Widget_DeviceDefault_ActionBar_TabBar" since="14" />
+ <field name="Widget_DeviceDefault_ActionBar_TabText" since="14" />
+ <field name="Widget_DeviceDefault_ActionBar_TabView" since="14" />
+ <field name="Widget_DeviceDefault_ActionButton" since="14" />
+ <field name="Widget_DeviceDefault_ActionButton_CloseMode" since="14" />
+ <field name="Widget_DeviceDefault_ActionButton_Overflow" since="14" />
+ <field name="Widget_DeviceDefault_ActionButton_TextButton" since="14" />
+ <field name="Widget_DeviceDefault_ActionMode" since="14" />
+ <field name="Widget_DeviceDefault_AutoCompleteTextView" since="14" />
+ <field name="Widget_DeviceDefault_Button" since="14" />
+ <field name="Widget_DeviceDefault_Button_Borderless" since="14" />
+ <field name="Widget_DeviceDefault_Button_Borderless_Small" since="14" />
+ <field name="Widget_DeviceDefault_Button_Inset" since="14" />
+ <field name="Widget_DeviceDefault_Button_Small" since="14" />
+ <field name="Widget_DeviceDefault_Button_Toggle" since="14" />
+ <field name="Widget_DeviceDefault_CalendarView" since="14" />
+ <field name="Widget_DeviceDefault_CheckedTextView" since="17" />
+ <field name="Widget_DeviceDefault_CompoundButton_CheckBox" since="14" />
+ <field name="Widget_DeviceDefault_CompoundButton_RadioButton" since="14" />
+ <field name="Widget_DeviceDefault_CompoundButton_Star" since="14" />
+ <field name="Widget_DeviceDefault_DatePicker" since="14" />
+ <field name="Widget_DeviceDefault_DropDownItem" since="14" />
+ <field name="Widget_DeviceDefault_DropDownItem_Spinner" since="14" />
+ <field name="Widget_DeviceDefault_EditText" since="14" />
+ <field name="Widget_DeviceDefault_ExpandableListView" since="14" />
+ <field name="Widget_DeviceDefault_FastScroll" since="21" />
+ <field name="Widget_DeviceDefault_GridView" since="14" />
+ <field name="Widget_DeviceDefault_HorizontalScrollView" since="14" />
+ <field name="Widget_DeviceDefault_ImageButton" since="14" />
+ <field name="Widget_DeviceDefault_Light" since="14" />
+ <field name="Widget_DeviceDefault_Light_ActionBar" since="14" />
+ <field name="Widget_DeviceDefault_Light_ActionBar_Solid" since="14" />
+ <field name="Widget_DeviceDefault_Light_ActionBar_Solid_Inverse" since="14" />
+ <field name="Widget_DeviceDefault_Light_ActionBar_TabBar" since="14" />
+ <field name="Widget_DeviceDefault_Light_ActionBar_TabBar_Inverse" since="14" />
+ <field name="Widget_DeviceDefault_Light_ActionBar_TabText" since="14" />
+ <field name="Widget_DeviceDefault_Light_ActionBar_TabText_Inverse" since="14" />
+ <field name="Widget_DeviceDefault_Light_ActionBar_TabView" since="14" />
+ <field name="Widget_DeviceDefault_Light_ActionBar_TabView_Inverse" since="14" />
+ <field name="Widget_DeviceDefault_Light_ActionButton" since="14" />
+ <field name="Widget_DeviceDefault_Light_ActionButton_CloseMode" since="14" />
+ <field name="Widget_DeviceDefault_Light_ActionButton_Overflow" since="14" />
+ <field name="Widget_DeviceDefault_Light_ActionMode" since="14" />
+ <field name="Widget_DeviceDefault_Light_ActionMode_Inverse" since="14" />
+ <field name="Widget_DeviceDefault_Light_AutoCompleteTextView" since="14" />
+ <field name="Widget_DeviceDefault_Light_Button" since="14" />
+ <field name="Widget_DeviceDefault_Light_Button_Borderless_Small" since="14" />
+ <field name="Widget_DeviceDefault_Light_Button_Inset" since="14" />
+ <field name="Widget_DeviceDefault_Light_Button_Small" since="14" />
+ <field name="Widget_DeviceDefault_Light_Button_Toggle" since="14" />
+ <field name="Widget_DeviceDefault_Light_CalendarView" since="14" />
+ <field name="Widget_DeviceDefault_Light_CheckedTextView" since="17" />
+ <field name="Widget_DeviceDefault_Light_CompoundButton_CheckBox" since="14" />
+ <field name="Widget_DeviceDefault_Light_CompoundButton_RadioButton" since="14" />
+ <field name="Widget_DeviceDefault_Light_CompoundButton_Star" since="14" />
+ <field name="Widget_DeviceDefault_Light_DropDownItem" since="14" />
+ <field name="Widget_DeviceDefault_Light_DropDownItem_Spinner" since="14" />
+ <field name="Widget_DeviceDefault_Light_EditText" since="14" />
+ <field name="Widget_DeviceDefault_Light_ExpandableListView" since="14" />
+ <field name="Widget_DeviceDefault_Light_FastScroll" since="21" />
+ <field name="Widget_DeviceDefault_Light_GridView" since="14" />
+ <field name="Widget_DeviceDefault_Light_HorizontalScrollView" since="14" />
+ <field name="Widget_DeviceDefault_Light_ImageButton" since="14" />
+ <field name="Widget_DeviceDefault_Light_ListPopupWindow" since="14" />
+ <field name="Widget_DeviceDefault_Light_ListView" since="14" />
+ <field name="Widget_DeviceDefault_Light_ListView_DropDown" since="14" />
+ <field name="Widget_DeviceDefault_Light_MediaRouteButton" since="16" />
+ <field name="Widget_DeviceDefault_Light_PopupMenu" since="14" />
+ <field name="Widget_DeviceDefault_Light_PopupWindow" since="14" />
+ <field name="Widget_DeviceDefault_Light_ProgressBar" since="14" />
+ <field name="Widget_DeviceDefault_Light_ProgressBar_Horizontal" since="14" />
+ <field name="Widget_DeviceDefault_Light_ProgressBar_Inverse" since="14" />
+ <field name="Widget_DeviceDefault_Light_ProgressBar_Large" since="14" />
+ <field name="Widget_DeviceDefault_Light_ProgressBar_Large_Inverse" since="14" />
+ <field name="Widget_DeviceDefault_Light_ProgressBar_Small" since="14" />
+ <field name="Widget_DeviceDefault_Light_ProgressBar_Small_Inverse" since="14" />
+ <field name="Widget_DeviceDefault_Light_ProgressBar_Small_Title" since="14" />
+ <field name="Widget_DeviceDefault_Light_RatingBar" since="14" />
+ <field name="Widget_DeviceDefault_Light_RatingBar_Indicator" since="14" />
+ <field name="Widget_DeviceDefault_Light_RatingBar_Small" since="14" />
+ <field name="Widget_DeviceDefault_Light_ScrollView" since="14" />
+ <field name="Widget_DeviceDefault_Light_SeekBar" since="14" />
+ <field name="Widget_DeviceDefault_Light_Spinner" since="14" />
+ <field name="Widget_DeviceDefault_Light_StackView" since="21" />
+ <field name="Widget_DeviceDefault_Light_Tab" since="14" />
+ <field name="Widget_DeviceDefault_Light_TabWidget" since="14" />
+ <field name="Widget_DeviceDefault_Light_TextView" since="14" />
+ <field name="Widget_DeviceDefault_Light_TextView_SpinnerItem" since="14" />
+ <field name="Widget_DeviceDefault_Light_WebTextView" since="14" />
+ <field name="Widget_DeviceDefault_Light_WebView" since="14" />
+ <field name="Widget_DeviceDefault_ListPopupWindow" since="14" />
+ <field name="Widget_DeviceDefault_ListView" since="14" />
+ <field name="Widget_DeviceDefault_ListView_DropDown" since="14" />
+ <field name="Widget_DeviceDefault_MediaRouteButton" since="16" />
+ <field name="Widget_DeviceDefault_PopupMenu" since="14" />
+ <field name="Widget_DeviceDefault_PopupWindow" since="14" />
+ <field name="Widget_DeviceDefault_ProgressBar" since="14" />
+ <field name="Widget_DeviceDefault_ProgressBar_Horizontal" since="14" />
+ <field name="Widget_DeviceDefault_ProgressBar_Large" since="14" />
+ <field name="Widget_DeviceDefault_ProgressBar_Small" since="14" />
+ <field name="Widget_DeviceDefault_ProgressBar_Small_Title" since="14" />
+ <field name="Widget_DeviceDefault_RatingBar" since="14" />
+ <field name="Widget_DeviceDefault_RatingBar_Indicator" since="14" />
+ <field name="Widget_DeviceDefault_RatingBar_Small" since="14" />
+ <field name="Widget_DeviceDefault_ScrollView" since="14" />
+ <field name="Widget_DeviceDefault_SeekBar" since="14" />
+ <field name="Widget_DeviceDefault_Spinner" since="14" />
+ <field name="Widget_DeviceDefault_StackView" since="21" />
+ <field name="Widget_DeviceDefault_Tab" since="14" />
+ <field name="Widget_DeviceDefault_TabWidget" since="14" />
+ <field name="Widget_DeviceDefault_TextView" since="14" />
+ <field name="Widget_DeviceDefault_TextView_SpinnerItem" since="14" />
+ <field name="Widget_DeviceDefault_WebTextView" since="14" />
+ <field name="Widget_DeviceDefault_WebView" since="14" />
+ <field name="Widget_DropDownItem" />
+ <field name="Widget_DropDownItem_Spinner" />
+ <field name="Widget_EditText" />
+ <field name="Widget_ExpandableListView" />
+ <field name="Widget_FastScroll" since="21" />
+ <field name="Widget_FragmentBreadCrumbs" since="11" />
+ <field name="Widget_Gallery" />
+ <field name="Widget_GridView" />
+ <field name="Widget_Holo" since="11" />
+ <field name="Widget_Holo_ActionBar" since="11" />
+ <field name="Widget_Holo_ActionBar_Solid" since="14" />
+ <field name="Widget_Holo_ActionBar_TabBar" since="13" />
+ <field name="Widget_Holo_ActionBar_TabText" since="13" />
+ <field name="Widget_Holo_ActionBar_TabView" since="13" />
+ <field name="Widget_Holo_ActionButton" since="11" />
+ <field name="Widget_Holo_ActionButton_CloseMode" since="11" />
+ <field name="Widget_Holo_ActionButton_Overflow" since="11" />
+ <field name="Widget_Holo_ActionButton_TextButton" since="11" />
+ <field name="Widget_Holo_ActionMode" since="11" />
+ <field name="Widget_Holo_AutoCompleteTextView" since="11" />
+ <field name="Widget_Holo_Button" since="11" />
+ <field name="Widget_Holo_Button_Borderless" since="11" />
+ <field name="Widget_Holo_Button_Borderless_Small" since="14" />
+ <field name="Widget_Holo_Button_Inset" since="11" />
+ <field name="Widget_Holo_Button_Small" since="11" />
+ <field name="Widget_Holo_Button_Toggle" since="11" />
+ <field name="Widget_Holo_CalendarView" since="11" />
+ <field name="Widget_Holo_CheckedTextView" since="17" />
+ <field name="Widget_Holo_CompoundButton_CheckBox" since="11" />
+ <field name="Widget_Holo_CompoundButton_RadioButton" since="11" />
+ <field name="Widget_Holo_CompoundButton_Star" since="11" />
+ <field name="Widget_Holo_DatePicker" since="11" />
+ <field name="Widget_Holo_DropDownItem" since="11" />
+ <field name="Widget_Holo_DropDownItem_Spinner" since="11" />
+ <field name="Widget_Holo_EditText" since="11" />
+ <field name="Widget_Holo_ExpandableListView" since="11" />
+ <field name="Widget_Holo_GridView" since="11" />
+ <field name="Widget_Holo_HorizontalScrollView" since="11" />
+ <field name="Widget_Holo_ImageButton" since="11" />
+ <field name="Widget_Holo_Light" since="11" />
+ <field name="Widget_Holo_Light_ActionBar" since="11" />
+ <field name="Widget_Holo_Light_ActionBar_Solid" since="14" />
+ <field name="Widget_Holo_Light_ActionBar_Solid_Inverse" since="14" />
+ <field name="Widget_Holo_Light_ActionBar_TabBar" since="13" />
+ <field name="Widget_Holo_Light_ActionBar_TabBar_Inverse" since="14" />
+ <field name="Widget_Holo_Light_ActionBar_TabText" since="13" />
+ <field name="Widget_Holo_Light_ActionBar_TabText_Inverse" since="14" />
+ <field name="Widget_Holo_Light_ActionBar_TabView" since="13" />
+ <field name="Widget_Holo_Light_ActionBar_TabView_Inverse" since="14" />
+ <field name="Widget_Holo_Light_ActionButton" since="11" />
+ <field name="Widget_Holo_Light_ActionButton_CloseMode" since="11" />
+ <field name="Widget_Holo_Light_ActionButton_Overflow" since="11" />
+ <field name="Widget_Holo_Light_ActionMode" since="11" />
+ <field name="Widget_Holo_Light_ActionMode_Inverse" since="14" />
+ <field name="Widget_Holo_Light_AutoCompleteTextView" since="11" />
+ <field name="Widget_Holo_Light_Button" since="11" />
+ <field name="Widget_Holo_Light_Button_Borderless_Small" since="14" />
+ <field name="Widget_Holo_Light_Button_Inset" since="11" />
+ <field name="Widget_Holo_Light_Button_Small" since="11" />
+ <field name="Widget_Holo_Light_Button_Toggle" since="11" />
+ <field name="Widget_Holo_Light_CalendarView" since="11" />
+ <field name="Widget_Holo_Light_CheckedTextView" since="17" />
+ <field name="Widget_Holo_Light_CompoundButton_CheckBox" since="11" />
+ <field name="Widget_Holo_Light_CompoundButton_RadioButton" since="11" />
+ <field name="Widget_Holo_Light_CompoundButton_Star" since="11" />
+ <field name="Widget_Holo_Light_DropDownItem" since="11" />
+ <field name="Widget_Holo_Light_DropDownItem_Spinner" since="11" />
+ <field name="Widget_Holo_Light_EditText" since="11" />
+ <field name="Widget_Holo_Light_ExpandableListView" since="11" />
+ <field name="Widget_Holo_Light_GridView" since="11" />
+ <field name="Widget_Holo_Light_HorizontalScrollView" since="11" />
+ <field name="Widget_Holo_Light_ImageButton" since="11" />
+ <field name="Widget_Holo_Light_ListPopupWindow" since="11" />
+ <field name="Widget_Holo_Light_ListView" since="11" />
+ <field name="Widget_Holo_Light_ListView_DropDown" since="11" />
+ <field name="Widget_Holo_Light_MediaRouteButton" since="16" />
+ <field name="Widget_Holo_Light_PopupMenu" since="11" />
+ <field name="Widget_Holo_Light_PopupWindow" since="11" />
+ <field name="Widget_Holo_Light_ProgressBar" since="11" />
+ <field name="Widget_Holo_Light_ProgressBar_Horizontal" since="11" />
+ <field name="Widget_Holo_Light_ProgressBar_Inverse" since="11" />
+ <field name="Widget_Holo_Light_ProgressBar_Large" since="11" />
+ <field name="Widget_Holo_Light_ProgressBar_Large_Inverse" since="11" />
+ <field name="Widget_Holo_Light_ProgressBar_Small" since="11" />
+ <field name="Widget_Holo_Light_ProgressBar_Small_Inverse" since="11" />
+ <field name="Widget_Holo_Light_ProgressBar_Small_Title" since="11" />
+ <field name="Widget_Holo_Light_RatingBar" since="11" />
+ <field name="Widget_Holo_Light_RatingBar_Indicator" since="11" />
+ <field name="Widget_Holo_Light_RatingBar_Small" since="11" />
+ <field name="Widget_Holo_Light_ScrollView" since="11" />
+ <field name="Widget_Holo_Light_SeekBar" since="11" />
+ <field name="Widget_Holo_Light_Spinner" since="11" />
+ <field name="Widget_Holo_Light_Tab" since="11" />
+ <field name="Widget_Holo_Light_TabWidget" since="11" />
+ <field name="Widget_Holo_Light_TextView" since="11" />
+ <field name="Widget_Holo_Light_TextView_SpinnerItem" since="11" />
+ <field name="Widget_Holo_Light_WebTextView" since="11" />
+ <field name="Widget_Holo_Light_WebView" since="11" />
+ <field name="Widget_Holo_ListPopupWindow" since="11" />
+ <field name="Widget_Holo_ListView" since="11" />
+ <field name="Widget_Holo_ListView_DropDown" since="11" />
+ <field name="Widget_Holo_MediaRouteButton" since="16" />
+ <field name="Widget_Holo_PopupMenu" since="11" />
+ <field name="Widget_Holo_PopupWindow" since="11" />
+ <field name="Widget_Holo_ProgressBar" since="11" />
+ <field name="Widget_Holo_ProgressBar_Horizontal" since="11" />
+ <field name="Widget_Holo_ProgressBar_Large" since="11" />
+ <field name="Widget_Holo_ProgressBar_Small" since="11" />
+ <field name="Widget_Holo_ProgressBar_Small_Title" since="11" />
+ <field name="Widget_Holo_RatingBar" since="11" />
+ <field name="Widget_Holo_RatingBar_Indicator" since="11" />
+ <field name="Widget_Holo_RatingBar_Small" since="11" />
+ <field name="Widget_Holo_ScrollView" since="11" />
+ <field name="Widget_Holo_SeekBar" since="11" />
+ <field name="Widget_Holo_Spinner" since="11" />
+ <field name="Widget_Holo_Tab" since="11" />
+ <field name="Widget_Holo_TabWidget" since="11" />
+ <field name="Widget_Holo_TextView" since="11" />
+ <field name="Widget_Holo_TextView_SpinnerItem" since="11" />
+ <field name="Widget_Holo_WebTextView" since="11" />
+ <field name="Widget_Holo_WebView" since="11" />
+ <field name="Widget_ImageButton" />
+ <field name="Widget_ImageWell" />
+ <field name="Widget_KeyboardView" since="3" />
+ <field name="Widget_ListPopupWindow" since="11" />
+ <field name="Widget_ListView" />
+ <field name="Widget_ListView_DropDown" />
+ <field name="Widget_ListView_Menu" />
+ <field name="Widget_ListView_White" />
+ <field name="Widget_Material" since="21" />
+ <field name="Widget_Material_ActionBar" since="21" />
+ <field name="Widget_Material_ActionBar_Solid" since="21" />
+ <field name="Widget_Material_ActionBar_TabBar" since="21" />
+ <field name="Widget_Material_ActionBar_TabText" since="21" />
+ <field name="Widget_Material_ActionBar_TabView" since="21" />
+ <field name="Widget_Material_ActionButton" since="21" />
+ <field name="Widget_Material_ActionButton_CloseMode" since="21" />
+ <field name="Widget_Material_ActionButton_Overflow" since="21" />
+ <field name="Widget_Material_ActionMode" since="21" />
+ <field name="Widget_Material_AutoCompleteTextView" since="21" />
+ <field name="Widget_Material_Button" since="21" />
+ <field name="Widget_Material_ButtonBar" since="21" />
+ <field name="Widget_Material_ButtonBar_AlertDialog" since="21" />
+ <field name="Widget_Material_Button_Borderless" since="21" />
+ <field name="Widget_Material_Button_Borderless_Colored" since="21" />
+ <field name="Widget_Material_Button_Borderless_Small" since="21" />
+ <field name="Widget_Material_Button_Inset" since="21" />
+ <field name="Widget_Material_Button_Small" since="21" />
+ <field name="Widget_Material_Button_Toggle" since="21" />
+ <field name="Widget_Material_CalendarView" since="21" />
+ <field name="Widget_Material_CheckedTextView" since="21" />
+ <field name="Widget_Material_CompoundButton_CheckBox" since="21" />
+ <field name="Widget_Material_CompoundButton_RadioButton" since="21" />
+ <field name="Widget_Material_CompoundButton_Star" since="21" />
+ <field name="Widget_Material_DatePicker" since="21" />
+ <field name="Widget_Material_DropDownItem" since="21" />
+ <field name="Widget_Material_DropDownItem_Spinner" since="21" />
+ <field name="Widget_Material_EditText" since="21" />
+ <field name="Widget_Material_ExpandableListView" since="21" />
+ <field name="Widget_Material_FastScroll" since="21" />
+ <field name="Widget_Material_GridView" since="21" />
+ <field name="Widget_Material_HorizontalScrollView" since="21" />
+ <field name="Widget_Material_ImageButton" since="21" />
+ <field name="Widget_Material_Light" since="21" />
+ <field name="Widget_Material_Light_ActionBar" since="21" />
+ <field name="Widget_Material_Light_ActionBar_Solid" since="21" />
+ <field name="Widget_Material_Light_ActionBar_TabBar" since="21" />
+ <field name="Widget_Material_Light_ActionBar_TabText" since="21" />
+ <field name="Widget_Material_Light_ActionBar_TabView" since="21" />
+ <field name="Widget_Material_Light_ActionButton" since="21" />
+ <field name="Widget_Material_Light_ActionButton_CloseMode" since="21" />
+ <field name="Widget_Material_Light_ActionButton_Overflow" since="21" />
+ <field name="Widget_Material_Light_ActionMode" since="21" />
+ <field name="Widget_Material_Light_AutoCompleteTextView" since="21" />
+ <field name="Widget_Material_Light_Button" since="21" />
+ <field name="Widget_Material_Light_ButtonBar" since="21" />
+ <field name="Widget_Material_Light_ButtonBar_AlertDialog" since="21" />
+ <field name="Widget_Material_Light_Button_Borderless" since="21" />
+ <field name="Widget_Material_Light_Button_Borderless_Colored" since="21" />
+ <field name="Widget_Material_Light_Button_Borderless_Small" since="21" />
+ <field name="Widget_Material_Light_Button_Inset" since="21" />
+ <field name="Widget_Material_Light_Button_Small" since="21" />
+ <field name="Widget_Material_Light_Button_Toggle" since="21" />
+ <field name="Widget_Material_Light_CalendarView" since="21" />
+ <field name="Widget_Material_Light_CheckedTextView" since="21" />
+ <field name="Widget_Material_Light_CompoundButton_CheckBox" since="21" />
+ <field name="Widget_Material_Light_CompoundButton_RadioButton" since="21" />
+ <field name="Widget_Material_Light_CompoundButton_Star" since="21" />
+ <field name="Widget_Material_Light_DatePicker" since="21" />
+ <field name="Widget_Material_Light_DropDownItem" since="21" />
+ <field name="Widget_Material_Light_DropDownItem_Spinner" since="21" />
+ <field name="Widget_Material_Light_EditText" since="21" />
+ <field name="Widget_Material_Light_ExpandableListView" since="21" />
+ <field name="Widget_Material_Light_FastScroll" since="21" />
+ <field name="Widget_Material_Light_GridView" since="21" />
+ <field name="Widget_Material_Light_HorizontalScrollView" since="21" />
+ <field name="Widget_Material_Light_ImageButton" since="21" />
+ <field name="Widget_Material_Light_ListPopupWindow" since="21" />
+ <field name="Widget_Material_Light_ListView" since="21" />
+ <field name="Widget_Material_Light_ListView_DropDown" since="21" />
+ <field name="Widget_Material_Light_MediaRouteButton" since="21" />
+ <field name="Widget_Material_Light_PopupMenu" since="21" />
+ <field name="Widget_Material_Light_PopupMenu_Overflow" since="21" />
+ <field name="Widget_Material_Light_PopupWindow" since="21" />
+ <field name="Widget_Material_Light_ProgressBar" since="21" />
+ <field name="Widget_Material_Light_ProgressBar_Horizontal" since="21" />
+ <field name="Widget_Material_Light_ProgressBar_Inverse" since="21" />
+ <field name="Widget_Material_Light_ProgressBar_Large" since="21" />
+ <field name="Widget_Material_Light_ProgressBar_Large_Inverse" since="21" />
+ <field name="Widget_Material_Light_ProgressBar_Small" since="21" />
+ <field name="Widget_Material_Light_ProgressBar_Small_Inverse" since="21" />
+ <field name="Widget_Material_Light_ProgressBar_Small_Title" since="21" />
+ <field name="Widget_Material_Light_RatingBar" since="21" />
+ <field name="Widget_Material_Light_RatingBar_Indicator" since="21" />
+ <field name="Widget_Material_Light_RatingBar_Small" since="21" />
+ <field name="Widget_Material_Light_ScrollView" since="21" />
+ <field name="Widget_Material_Light_SearchView" since="21" />
+ <field name="Widget_Material_Light_SeekBar" since="21" />
+ <field name="Widget_Material_Light_SegmentedButton" since="21" />
+ <field name="Widget_Material_Light_Spinner" since="21" />
+ <field name="Widget_Material_Light_Spinner_Underlined" since="21" />
+ <field name="Widget_Material_Light_StackView" since="21" />
+ <field name="Widget_Material_Light_Tab" since="21" />
+ <field name="Widget_Material_Light_TabWidget" since="21" />
+ <field name="Widget_Material_Light_TextView" since="21" />
+ <field name="Widget_Material_Light_TextView_SpinnerItem" since="21" />
+ <field name="Widget_Material_Light_TimePicker" since="21" />
+ <field name="Widget_Material_Light_WebTextView" since="21" />
+ <field name="Widget_Material_Light_WebView" since="21" />
+ <field name="Widget_Material_ListPopupWindow" since="21" />
+ <field name="Widget_Material_ListView" since="21" />
+ <field name="Widget_Material_ListView_DropDown" since="21" />
+ <field name="Widget_Material_MediaRouteButton" since="21" />
+ <field name="Widget_Material_PopupMenu" since="21" />
+ <field name="Widget_Material_PopupMenu_Overflow" since="21" />
+ <field name="Widget_Material_PopupWindow" since="21" />
+ <field name="Widget_Material_ProgressBar" since="21" />
+ <field name="Widget_Material_ProgressBar_Horizontal" since="21" />
+ <field name="Widget_Material_ProgressBar_Large" since="21" />
+ <field name="Widget_Material_ProgressBar_Small" since="21" />
+ <field name="Widget_Material_ProgressBar_Small_Title" since="21" />
+ <field name="Widget_Material_RatingBar" since="21" />
+ <field name="Widget_Material_RatingBar_Indicator" since="21" />
+ <field name="Widget_Material_RatingBar_Small" since="21" />
+ <field name="Widget_Material_ScrollView" since="21" />
+ <field name="Widget_Material_SearchView" since="21" />
+ <field name="Widget_Material_SeekBar" since="21" />
+ <field name="Widget_Material_SegmentedButton" since="21" />
+ <field name="Widget_Material_Spinner" since="21" />
+ <field name="Widget_Material_Spinner_Underlined" since="21" />
+ <field name="Widget_Material_StackView" since="21" />
+ <field name="Widget_Material_Tab" since="21" />
+ <field name="Widget_Material_TabWidget" since="21" />
+ <field name="Widget_Material_TextView" since="21" />
+ <field name="Widget_Material_TextView_SpinnerItem" since="21" />
+ <field name="Widget_Material_TimePicker" since="21" />
+ <field name="Widget_Material_Toolbar" since="21" />
+ <field name="Widget_Material_Toolbar_Button_Navigation" since="21" />
+ <field name="Widget_Material_WebTextView" since="21" />
+ <field name="Widget_Material_WebView" since="21" />
+ <field name="Widget_PopupMenu" since="11" />
+ <field name="Widget_PopupWindow" />
+ <field name="Widget_ProgressBar" />
+ <field name="Widget_ProgressBar_Horizontal" />
+ <field name="Widget_ProgressBar_Inverse" since="4" />
+ <field name="Widget_ProgressBar_Large" />
+ <field name="Widget_ProgressBar_Large_Inverse" since="4" />
+ <field name="Widget_ProgressBar_Small" />
+ <field name="Widget_ProgressBar_Small_Inverse" since="4" />
+ <field name="Widget_RatingBar" />
+ <field name="Widget_ScrollView" />
+ <field name="Widget_SeekBar" />
+ <field name="Widget_Spinner" />
+ <field name="Widget_Spinner_DropDown" since="11" />
+ <field name="Widget_StackView" since="21" />
+ <field name="Widget_TabWidget" />
+ <field name="Widget_TextView" />
+ <field name="Widget_TextView_PopupMenu" />
+ <field name="Widget_TextView_SpinnerItem" />
+ <field name="Widget_Toolbar" since="21" />
+ <field name="Widget_Toolbar_Button_Navigation" since="21" />
+ <field name="Widget_WebView" />
+ </class>
+ <class name="android/R$transition" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="explode" />
+ <field name="fade" />
+ <field name="move" />
+ <field name="no_transition" />
+ <field name="slide_bottom" />
+ <field name="slide_left" />
+ <field name="slide_right" />
+ <field name="slide_top" />
+ </class>
+ <class name="android/R$xml" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/accessibilityservice/AccessibilityService" since="4">
+ <extends name="android/app/Service" />
+ <method name="&lt;init>()V" />
+ <method name="findFocus(I)Landroid/view/accessibility/AccessibilityNodeInfo;" since="21" />
+ <method name="getRootInActiveWindow()Landroid/view/accessibility/AccessibilityNodeInfo;" since="16" />
+ <method name="getServiceInfo()Landroid/accessibilityservice/AccessibilityServiceInfo;" since="16" />
+ <method name="getWindows()Ljava/util/List;" since="21" />
+ <method name="onAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V" />
+ <method name="onGesture(I)Z" since="16" />
+ <method name="onInterrupt()V" />
+ <method name="onKeyEvent(Landroid/view/KeyEvent;)Z" since="18" />
+ <method name="onServiceConnected()V" />
+ <method name="performGlobalAction(I)Z" since="16" />
+ <method name="setServiceInfo(Landroid/accessibilityservice/AccessibilityServiceInfo;)V" />
+ <field name="GESTURE_SWIPE_DOWN" since="16" />
+ <field name="GESTURE_SWIPE_DOWN_AND_LEFT" since="16" />
+ <field name="GESTURE_SWIPE_DOWN_AND_RIGHT" since="16" />
+ <field name="GESTURE_SWIPE_DOWN_AND_UP" since="16" />
+ <field name="GESTURE_SWIPE_LEFT" since="16" />
+ <field name="GESTURE_SWIPE_LEFT_AND_DOWN" since="16" />
+ <field name="GESTURE_SWIPE_LEFT_AND_RIGHT" since="16" />
+ <field name="GESTURE_SWIPE_LEFT_AND_UP" since="16" />
+ <field name="GESTURE_SWIPE_RIGHT" since="16" />
+ <field name="GESTURE_SWIPE_RIGHT_AND_DOWN" since="16" />
+ <field name="GESTURE_SWIPE_RIGHT_AND_LEFT" since="16" />
+ <field name="GESTURE_SWIPE_RIGHT_AND_UP" since="16" />
+ <field name="GESTURE_SWIPE_UP" since="16" />
+ <field name="GESTURE_SWIPE_UP_AND_DOWN" since="16" />
+ <field name="GESTURE_SWIPE_UP_AND_LEFT" since="16" />
+ <field name="GESTURE_SWIPE_UP_AND_RIGHT" since="16" />
+ <field name="GLOBAL_ACTION_BACK" since="16" />
+ <field name="GLOBAL_ACTION_HOME" since="16" />
+ <field name="GLOBAL_ACTION_NOTIFICATIONS" since="16" />
+ <field name="GLOBAL_ACTION_POWER_DIALOG" since="21" />
+ <field name="GLOBAL_ACTION_QUICK_SETTINGS" since="17" />
+ <field name="GLOBAL_ACTION_RECENTS" since="16" />
+ <field name="SERVICE_INTERFACE" />
+ <field name="SERVICE_META_DATA" since="14" />
+ </class>
+ <class name="android/accessibilityservice/AccessibilityServiceInfo" since="4">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="capabilityToString(I)Ljava/lang/String;" since="18" />
+ <method name="feedbackTypeToString(I)Ljava/lang/String;" since="14" />
+ <method name="flagToString(I)Ljava/lang/String;" since="14" />
+ <method name="getCanRetrieveWindowContent()Z" since="14" />
+ <method name="getCapabilities()I" since="18" />
+ <method name="getDescription()Ljava/lang/String;" since="14" />
+ <method name="getId()Ljava/lang/String;" since="14" />
+ <method name="getResolveInfo()Landroid/content/pm/ResolveInfo;" since="14" />
+ <method name="getSettingsActivityName()Ljava/lang/String;" since="14" />
+ <method name="loadDescription(Landroid/content/pm/PackageManager;)Ljava/lang/String;" since="16" />
+ <field name="CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY" since="18" />
+ <field name="CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS" since="18" />
+ <field name="CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION" since="18" />
+ <field name="CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT" since="18" />
+ <field name="CREATOR" />
+ <field name="DEFAULT" />
+ <field name="FEEDBACK_ALL_MASK" since="14" />
+ <field name="FEEDBACK_AUDIBLE" />
+ <field name="FEEDBACK_BRAILLE" since="17" />
+ <field name="FEEDBACK_GENERIC" />
+ <field name="FEEDBACK_HAPTIC" />
+ <field name="FEEDBACK_SPOKEN" />
+ <field name="FEEDBACK_VISUAL" />
+ <field name="FLAG_INCLUDE_NOT_IMPORTANT_VIEWS" since="16" />
+ <field name="FLAG_REPORT_VIEW_IDS" since="18" />
+ <field name="FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY" since="18" />
+ <field name="FLAG_REQUEST_FILTER_KEY_EVENTS" since="18" />
+ <field name="FLAG_REQUEST_TOUCH_EXPLORATION_MODE" since="16" />
+ <field name="FLAG_RETRIEVE_INTERACTIVE_WINDOWS" since="21" />
+ <field name="eventTypes" />
+ <field name="feedbackType" />
+ <field name="flags" />
+ <field name="notificationTimeout" />
+ <field name="packageNames" />
+ </class>
+ <class name="android/accounts/AbstractAccountAuthenticator" since="5">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="addAccount(Landroid/accounts/AccountAuthenticatorResponse;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;" />
+ <method name="addAccountFromCredentials(Landroid/accounts/AccountAuthenticatorResponse;Landroid/accounts/Account;Landroid/os/Bundle;)Landroid/os/Bundle;" since="18" />
+ <method name="confirmCredentials(Landroid/accounts/AccountAuthenticatorResponse;Landroid/accounts/Account;Landroid/os/Bundle;)Landroid/os/Bundle;" />
+ <method name="editProperties(Landroid/accounts/AccountAuthenticatorResponse;Ljava/lang/String;)Landroid/os/Bundle;" />
+ <method name="getAccountCredentialsForCloning(Landroid/accounts/AccountAuthenticatorResponse;Landroid/accounts/Account;)Landroid/os/Bundle;" since="18" />
+ <method name="getAccountRemovalAllowed(Landroid/accounts/AccountAuthenticatorResponse;Landroid/accounts/Account;)Landroid/os/Bundle;" />
+ <method name="getAuthToken(Landroid/accounts/AccountAuthenticatorResponse;Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;" />
+ <method name="getAuthTokenLabel(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getIBinder()Landroid/os/IBinder;" />
+ <method name="hasFeatures(Landroid/accounts/AccountAuthenticatorResponse;Landroid/accounts/Account;[Ljava/lang/String;)Landroid/os/Bundle;" />
+ <method name="updateCredentials(Landroid/accounts/AccountAuthenticatorResponse;Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;" />
+ </class>
+ <class name="android/accounts/Account" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <field name="CREATOR" />
+ <field name="name" />
+ <field name="type" />
+ </class>
+ <class name="android/accounts/AccountAuthenticatorActivity" since="5">
+ <extends name="android/app/Activity" />
+ <method name="&lt;init>()V" />
+ <method name="setAccountAuthenticatorResult(Landroid/os/Bundle;)V" />
+ </class>
+ <class name="android/accounts/AccountAuthenticatorResponse" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="onError(ILjava/lang/String;)V" />
+ <method name="onRequestContinued()V" />
+ <method name="onResult(Landroid/os/Bundle;)V" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/accounts/AccountManager" since="5">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addAccount(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Landroid/os/Bundle;Landroid/app/Activity;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;" />
+ <method name="addAccountExplicitly(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)Z" />
+ <method name="addOnAccountsUpdatedListener(Landroid/accounts/OnAccountsUpdateListener;Landroid/os/Handler;Z)V" />
+ <method name="blockingGetAuthToken(Landroid/accounts/Account;Ljava/lang/String;Z)Ljava/lang/String;" />
+ <method name="clearPassword(Landroid/accounts/Account;)V" />
+ <method name="confirmCredentials(Landroid/accounts/Account;Landroid/os/Bundle;Landroid/app/Activity;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;" />
+ <method name="editProperties(Ljava/lang/String;Landroid/app/Activity;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;" />
+ <method name="get(Landroid/content/Context;)Landroid/accounts/AccountManager;" />
+ <method name="getAccounts()[Landroid/accounts/Account;" />
+ <method name="getAccountsByType(Ljava/lang/String;)[Landroid/accounts/Account;" />
+ <method name="getAccountsByTypeAndFeatures(Ljava/lang/String;[Ljava/lang/String;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;" />
+ <method name="getAccountsByTypeForPackage(Ljava/lang/String;Ljava/lang/String;)[Landroid/accounts/Account;" since="18" />
+ <method name="getAuthToken(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;Landroid/app/Activity;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;" />
+ <method name="getAuthToken(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;ZLandroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;" since="14" />
+ <method name="getAuthToken(Landroid/accounts/Account;Ljava/lang/String;ZLandroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;" />
+ <method name="getAuthTokenByFeatures(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Landroid/app/Activity;Landroid/os/Bundle;Landroid/os/Bundle;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;" />
+ <method name="getAuthenticatorTypes()[Landroid/accounts/AuthenticatorDescription;" />
+ <method name="getPassword(Landroid/accounts/Account;)Ljava/lang/String;" />
+ <method name="getPreviousName(Landroid/accounts/Account;)Ljava/lang/String;" since="21" />
+ <method name="getUserData(Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="hasFeatures(Landroid/accounts/Account;[Ljava/lang/String;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;" since="8" />
+ <method name="invalidateAuthToken(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="newChooseAccountIntent(Landroid/accounts/Account;Ljava/util/ArrayList;[Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Landroid/os/Bundle;)Landroid/content/Intent;" since="14" />
+ <method name="peekAuthToken(Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="removeAccount(Landroid/accounts/Account;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;" />
+ <method name="removeOnAccountsUpdatedListener(Landroid/accounts/OnAccountsUpdateListener;)V" />
+ <method name="renameAccount(Landroid/accounts/Account;Ljava/lang/String;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;" since="21" />
+ <method name="setAuthToken(Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="setPassword(Landroid/accounts/Account;Ljava/lang/String;)V" />
+ <method name="setUserData(Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="updateCredentials(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;Landroid/app/Activity;Landroid/accounts/AccountManagerCallback;Landroid/os/Handler;)Landroid/accounts/AccountManagerFuture;" />
+ <field name="ACTION_AUTHENTICATOR_INTENT" />
+ <field name="AUTHENTICATOR_ATTRIBUTES_NAME" />
+ <field name="AUTHENTICATOR_META_DATA_NAME" />
+ <field name="ERROR_CODE_BAD_ARGUMENTS" />
+ <field name="ERROR_CODE_BAD_AUTHENTICATION" since="18" />
+ <field name="ERROR_CODE_BAD_REQUEST" />
+ <field name="ERROR_CODE_CANCELED" />
+ <field name="ERROR_CODE_INVALID_RESPONSE" />
+ <field name="ERROR_CODE_NETWORK_ERROR" />
+ <field name="ERROR_CODE_REMOTE_EXCEPTION" />
+ <field name="ERROR_CODE_UNSUPPORTED_OPERATION" />
+ <field name="KEY_ACCOUNTS" />
+ <field name="KEY_ACCOUNT_AUTHENTICATOR_RESPONSE" />
+ <field name="KEY_ACCOUNT_MANAGER_RESPONSE" />
+ <field name="KEY_ACCOUNT_NAME" />
+ <field name="KEY_ACCOUNT_TYPE" />
+ <field name="KEY_ANDROID_PACKAGE_NAME" since="14" />
+ <field name="KEY_AUTHENTICATOR_TYPES" />
+ <field name="KEY_AUTHTOKEN" />
+ <field name="KEY_AUTH_FAILED_MESSAGE" />
+ <field name="KEY_AUTH_TOKEN_LABEL" />
+ <field name="KEY_BOOLEAN_RESULT" />
+ <field name="KEY_CALLER_PID" since="11" />
+ <field name="KEY_CALLER_UID" since="11" />
+ <field name="KEY_ERROR_CODE" />
+ <field name="KEY_ERROR_MESSAGE" />
+ <field name="KEY_INTENT" />
+ <field name="KEY_PASSWORD" />
+ <field name="KEY_USERDATA" />
+ <field name="LOGIN_ACCOUNTS_CHANGED_ACTION" />
+ </class>
+ <class name="android/accounts/AccountManagerCallback" since="5">
+ <extends name="java/lang/Object" />
+ <method name="run(Landroid/accounts/AccountManagerFuture;)V" />
+ </class>
+ <class name="android/accounts/AccountManagerFuture" since="5">
+ <extends name="java/lang/Object" />
+ <method name="cancel(Z)Z" />
+ <method name="getResult()Ljava/lang/Object;" />
+ <method name="getResult(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;" />
+ <method name="isCancelled()Z" />
+ <method name="isDone()Z" />
+ </class>
+ <class name="android/accounts/AccountsException" since="5">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="android/accounts/AuthenticatorDescription" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;IIII)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;IIIIZ)V" since="11" />
+ <method name="newKey(Ljava/lang/String;)Landroid/accounts/AuthenticatorDescription;" />
+ <field name="CREATOR" />
+ <field name="accountPreferencesId" />
+ <field name="customTokens" since="11" />
+ <field name="iconId" />
+ <field name="labelId" />
+ <field name="packageName" />
+ <field name="smallIconId" />
+ <field name="type" />
+ </class>
+ <class name="android/accounts/AuthenticatorException" since="5">
+ <extends name="android/accounts/AccountsException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="android/accounts/NetworkErrorException" since="5">
+ <extends name="android/accounts/AccountsException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="android/accounts/OnAccountsUpdateListener" since="5">
+ <extends name="java/lang/Object" />
+ <method name="onAccountsUpdated([Landroid/accounts/Account;)V" />
+ </class>
+ <class name="android/accounts/OperationCanceledException" since="5">
+ <extends name="android/accounts/AccountsException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="android/animation/Animator" since="11">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>()V" />
+ <method name="addListener(Landroid/animation/Animator$AnimatorListener;)V" />
+ <method name="addPauseListener(Landroid/animation/Animator$AnimatorPauseListener;)V" since="19" />
+ <method name="cancel()V" />
+ <method name="clone()Landroid/animation/Animator;" />
+ <method name="end()V" />
+ <method name="getDuration()J" />
+ <method name="getInterpolator()Landroid/animation/TimeInterpolator;" since="18" />
+ <method name="getListeners()Ljava/util/ArrayList;" />
+ <method name="getStartDelay()J" />
+ <method name="isPaused()Z" since="19" />
+ <method name="isRunning()Z" />
+ <method name="isStarted()Z" since="14" />
+ <method name="pause()V" since="19" />
+ <method name="removeAllListeners()V" />
+ <method name="removeListener(Landroid/animation/Animator$AnimatorListener;)V" />
+ <method name="removePauseListener(Landroid/animation/Animator$AnimatorPauseListener;)V" since="19" />
+ <method name="resume()V" since="19" />
+ <method name="setDuration(J)Landroid/animation/Animator;" />
+ <method name="setInterpolator(Landroid/animation/TimeInterpolator;)V" />
+ <method name="setStartDelay(J)V" />
+ <method name="setTarget(Ljava/lang/Object;)V" />
+ <method name="setupEndValues()V" />
+ <method name="setupStartValues()V" />
+ <method name="start()V" />
+ </class>
+ <class name="android/animation/Animator$AnimatorListener" since="11">
+ <extends name="java/lang/Object" />
+ <method name="onAnimationCancel(Landroid/animation/Animator;)V" />
+ <method name="onAnimationEnd(Landroid/animation/Animator;)V" />
+ <method name="onAnimationRepeat(Landroid/animation/Animator;)V" />
+ <method name="onAnimationStart(Landroid/animation/Animator;)V" />
+ </class>
+ <class name="android/animation/Animator$AnimatorPauseListener" since="19">
+ <extends name="java/lang/Object" />
+ <method name="onAnimationPause(Landroid/animation/Animator;)V" />
+ <method name="onAnimationResume(Landroid/animation/Animator;)V" />
+ </class>
+ <class name="android/animation/AnimatorInflater" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="loadAnimator(Landroid/content/Context;I)Landroid/animation/Animator;" />
+ <method name="loadStateListAnimator(Landroid/content/Context;I)Landroid/animation/StateListAnimator;" since="21" />
+ </class>
+ <class name="android/animation/AnimatorListenerAdapter" since="11">
+ <extends name="java/lang/Object" />
+ <implements name="android/animation/Animator$AnimatorListener" />
+ <implements name="android/animation/Animator$AnimatorPauseListener" since="19" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/animation/AnimatorSet" since="11">
+ <extends name="android/animation/Animator" />
+ <method name="&lt;init>()V" />
+ <method name="clone()Landroid/animation/AnimatorSet;" />
+ <method name="getChildAnimations()Ljava/util/ArrayList;" />
+ <method name="play(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Builder;" />
+ <method name="playSequentially(Ljava/util/List;)V" />
+ <method name="playSequentially([Landroid/animation/Animator;)V" />
+ <method name="playTogether(Ljava/util/Collection;)V" />
+ <method name="playTogether([Landroid/animation/Animator;)V" />
+ <method name="setDuration(J)Landroid/animation/AnimatorSet;" />
+ </class>
+ <class name="android/animation/AnimatorSet$Builder" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/animation/AnimatorSet;)V" />
+ <method name="after(J)Landroid/animation/AnimatorSet$Builder;" />
+ <method name="after(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Builder;" />
+ <method name="before(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Builder;" />
+ <method name="with(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Builder;" />
+ </class>
+ <class name="android/animation/ArgbEvaluator" since="11">
+ <extends name="java/lang/Object" />
+ <implements name="android/animation/TypeEvaluator" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/animation/BidirectionalTypeConverter" since="21">
+ <extends name="android/animation/TypeConverter" />
+ <method name="&lt;init>(Ljava/lang/Class;Ljava/lang/Class;)V" />
+ <method name="convertBack(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="invert()Landroid/animation/BidirectionalTypeConverter;" />
+ </class>
+ <class name="android/animation/FloatArrayEvaluator" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/animation/TypeEvaluator" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>([F)V" />
+ <method name="evaluate(F[F[F)[F" />
+ </class>
+ <class name="android/animation/FloatEvaluator" since="11">
+ <extends name="java/lang/Object" />
+ <implements name="android/animation/TypeEvaluator" />
+ <method name="&lt;init>()V" />
+ <method name="evaluate(FLjava/lang/Number;Ljava/lang/Number;)Ljava/lang/Float;" since="14" />
+ </class>
+ <class name="android/animation/IntArrayEvaluator" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/animation/TypeEvaluator" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>([I)V" />
+ <method name="evaluate(F[I[I)[I" />
+ </class>
+ <class name="android/animation/IntEvaluator" since="11">
+ <extends name="java/lang/Object" />
+ <implements name="android/animation/TypeEvaluator" />
+ <method name="&lt;init>()V" />
+ <method name="evaluate(FLjava/lang/Integer;Ljava/lang/Integer;)Ljava/lang/Integer;" since="14" />
+ </class>
+ <class name="android/animation/Keyframe" since="11">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>()V" />
+ <method name="clone()Landroid/animation/Keyframe;" />
+ <method name="getFraction()F" />
+ <method name="getInterpolator()Landroid/animation/TimeInterpolator;" />
+ <method name="getType()Ljava/lang/Class;" />
+ <method name="getValue()Ljava/lang/Object;" />
+ <method name="hasValue()Z" />
+ <method name="ofFloat(F)Landroid/animation/Keyframe;" />
+ <method name="ofFloat(FF)Landroid/animation/Keyframe;" />
+ <method name="ofInt(F)Landroid/animation/Keyframe;" />
+ <method name="ofInt(FI)Landroid/animation/Keyframe;" />
+ <method name="ofObject(F)Landroid/animation/Keyframe;" />
+ <method name="ofObject(FLjava/lang/Object;)Landroid/animation/Keyframe;" />
+ <method name="setFraction(F)V" />
+ <method name="setInterpolator(Landroid/animation/TimeInterpolator;)V" />
+ <method name="setValue(Ljava/lang/Object;)V" />
+ </class>
+ <class name="android/animation/LayoutTransition" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addChild(Landroid/view/ViewGroup;Landroid/view/View;)V" />
+ <method name="addTransitionListener(Landroid/animation/LayoutTransition$TransitionListener;)V" />
+ <method name="disableTransitionType(I)V" since="16" />
+ <method name="enableTransitionType(I)V" since="16" />
+ <method name="getAnimator(I)Landroid/animation/Animator;" />
+ <method name="getDuration(I)J" />
+ <method name="getInterpolator(I)Landroid/animation/TimeInterpolator;" />
+ <method name="getStagger(I)J" />
+ <method name="getStartDelay(I)J" />
+ <method name="getTransitionListeners()Ljava/util/List;" />
+ <method name="hideChild(Landroid/view/ViewGroup;Landroid/view/View;)V" />
+ <method name="hideChild(Landroid/view/ViewGroup;Landroid/view/View;I)V" since="16" />
+ <method name="isChangingLayout()Z" />
+ <method name="isRunning()Z" />
+ <method name="isTransitionTypeEnabled(I)Z" since="16" />
+ <method name="removeChild(Landroid/view/ViewGroup;Landroid/view/View;)V" />
+ <method name="removeTransitionListener(Landroid/animation/LayoutTransition$TransitionListener;)V" />
+ <method name="setAnimateParentHierarchy(Z)V" since="14" />
+ <method name="setAnimator(ILandroid/animation/Animator;)V" />
+ <method name="setDuration(IJ)V" />
+ <method name="setDuration(J)V" />
+ <method name="setInterpolator(ILandroid/animation/TimeInterpolator;)V" />
+ <method name="setStagger(IJ)V" />
+ <method name="setStartDelay(IJ)V" />
+ <method name="showChild(Landroid/view/ViewGroup;Landroid/view/View;)V" />
+ <method name="showChild(Landroid/view/ViewGroup;Landroid/view/View;I)V" since="16" />
+ <field name="APPEARING" />
+ <field name="CHANGE_APPEARING" />
+ <field name="CHANGE_DISAPPEARING" />
+ <field name="CHANGING" since="16" />
+ <field name="DISAPPEARING" />
+ </class>
+ <class name="android/animation/LayoutTransition$TransitionListener" since="11">
+ <extends name="java/lang/Object" />
+ <method name="endTransition(Landroid/animation/LayoutTransition;Landroid/view/ViewGroup;Landroid/view/View;I)V" />
+ <method name="startTransition(Landroid/animation/LayoutTransition;Landroid/view/ViewGroup;Landroid/view/View;I)V" />
+ </class>
+ <class name="android/animation/ObjectAnimator" since="11">
+ <extends name="android/animation/ValueAnimator" />
+ <method name="&lt;init>()V" />
+ <method name="clone()Landroid/animation/ObjectAnimator;" />
+ <method name="getPropertyName()Ljava/lang/String;" />
+ <method name="getTarget()Ljava/lang/Object;" />
+ <method name="ofArgb(Ljava/lang/Object;Landroid/util/Property;[I)Landroid/animation/ObjectAnimator;" since="21" />
+ <method name="ofArgb(Ljava/lang/Object;Ljava/lang/String;[I)Landroid/animation/ObjectAnimator;" since="21" />
+ <method name="ofFloat(Ljava/lang/Object;Landroid/util/Property;Landroid/util/Property;Landroid/graphics/Path;)Landroid/animation/ObjectAnimator;" since="21" />
+ <method name="ofFloat(Ljava/lang/Object;Landroid/util/Property;[F)Landroid/animation/ObjectAnimator;" since="14" />
+ <method name="ofFloat(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;Landroid/graphics/Path;)Landroid/animation/ObjectAnimator;" since="21" />
+ <method name="ofFloat(Ljava/lang/Object;Ljava/lang/String;[F)Landroid/animation/ObjectAnimator;" />
+ <method name="ofInt(Ljava/lang/Object;Landroid/util/Property;Landroid/util/Property;Landroid/graphics/Path;)Landroid/animation/ObjectAnimator;" since="21" />
+ <method name="ofInt(Ljava/lang/Object;Landroid/util/Property;[I)Landroid/animation/ObjectAnimator;" since="14" />
+ <method name="ofInt(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;Landroid/graphics/Path;)Landroid/animation/ObjectAnimator;" since="21" />
+ <method name="ofInt(Ljava/lang/Object;Ljava/lang/String;[I)Landroid/animation/ObjectAnimator;" />
+ <method name="ofMultiFloat(Ljava/lang/Object;Ljava/lang/String;Landroid/animation/TypeConverter;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/ObjectAnimator;" since="21" />
+ <method name="ofMultiFloat(Ljava/lang/Object;Ljava/lang/String;Landroid/graphics/Path;)Landroid/animation/ObjectAnimator;" since="21" />
+ <method name="ofMultiFloat(Ljava/lang/Object;Ljava/lang/String;[[F)Landroid/animation/ObjectAnimator;" since="21" />
+ <method name="ofMultiInt(Ljava/lang/Object;Ljava/lang/String;Landroid/animation/TypeConverter;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/ObjectAnimator;" since="21" />
+ <method name="ofMultiInt(Ljava/lang/Object;Ljava/lang/String;Landroid/graphics/Path;)Landroid/animation/ObjectAnimator;" since="21" />
+ <method name="ofMultiInt(Ljava/lang/Object;Ljava/lang/String;[[I)Landroid/animation/ObjectAnimator;" since="21" />
+ <method name="ofObject(Ljava/lang/Object;Landroid/util/Property;Landroid/animation/TypeConverter;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/ObjectAnimator;" since="21" />
+ <method name="ofObject(Ljava/lang/Object;Landroid/util/Property;Landroid/animation/TypeConverter;Landroid/graphics/Path;)Landroid/animation/ObjectAnimator;" since="21" />
+ <method name="ofObject(Ljava/lang/Object;Landroid/util/Property;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/ObjectAnimator;" since="14" />
+ <method name="ofObject(Ljava/lang/Object;Ljava/lang/String;Landroid/animation/TypeConverter;Landroid/graphics/Path;)Landroid/animation/ObjectAnimator;" since="21" />
+ <method name="ofObject(Ljava/lang/Object;Ljava/lang/String;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/ObjectAnimator;" />
+ <method name="ofPropertyValuesHolder(Ljava/lang/Object;[Landroid/animation/PropertyValuesHolder;)Landroid/animation/ObjectAnimator;" />
+ <method name="setAutoCancel(Z)V" since="18" />
+ <method name="setDuration(J)Landroid/animation/ObjectAnimator;" />
+ <method name="setProperty(Landroid/util/Property;)V" since="14" />
+ <method name="setPropertyName(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/animation/PointFEvaluator" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/animation/TypeEvaluator" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/graphics/PointF;)V" />
+ <method name="evaluate(FLandroid/graphics/PointF;Landroid/graphics/PointF;)Landroid/graphics/PointF;" />
+ </class>
+ <class name="android/animation/PropertyValuesHolder" since="11">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>()V" />
+ <method name="clone()Landroid/animation/PropertyValuesHolder;" />
+ <method name="getPropertyName()Ljava/lang/String;" />
+ <method name="ofFloat(Landroid/util/Property;[F)Landroid/animation/PropertyValuesHolder;" since="14" />
+ <method name="ofFloat(Ljava/lang/String;[F)Landroid/animation/PropertyValuesHolder;" />
+ <method name="ofInt(Landroid/util/Property;[I)Landroid/animation/PropertyValuesHolder;" since="14" />
+ <method name="ofInt(Ljava/lang/String;[I)Landroid/animation/PropertyValuesHolder;" />
+ <method name="ofKeyframe(Landroid/util/Property;[Landroid/animation/Keyframe;)Landroid/animation/PropertyValuesHolder;" since="14" />
+ <method name="ofKeyframe(Ljava/lang/String;[Landroid/animation/Keyframe;)Landroid/animation/PropertyValuesHolder;" />
+ <method name="ofMultiFloat(Ljava/lang/String;Landroid/animation/TypeConverter;Landroid/animation/TypeEvaluator;[Landroid/animation/Keyframe;)Landroid/animation/PropertyValuesHolder;" since="21" />
+ <method name="ofMultiFloat(Ljava/lang/String;Landroid/animation/TypeConverter;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/PropertyValuesHolder;" since="21" />
+ <method name="ofMultiFloat(Ljava/lang/String;Landroid/graphics/Path;)Landroid/animation/PropertyValuesHolder;" since="21" />
+ <method name="ofMultiFloat(Ljava/lang/String;[[F)Landroid/animation/PropertyValuesHolder;" since="21" />
+ <method name="ofMultiInt(Ljava/lang/String;Landroid/animation/TypeConverter;Landroid/animation/TypeEvaluator;[Landroid/animation/Keyframe;)Landroid/animation/PropertyValuesHolder;" since="21" />
+ <method name="ofMultiInt(Ljava/lang/String;Landroid/animation/TypeConverter;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/PropertyValuesHolder;" since="21" />
+ <method name="ofMultiInt(Ljava/lang/String;Landroid/graphics/Path;)Landroid/animation/PropertyValuesHolder;" since="21" />
+ <method name="ofMultiInt(Ljava/lang/String;[[I)Landroid/animation/PropertyValuesHolder;" since="21" />
+ <method name="ofObject(Landroid/util/Property;Landroid/animation/TypeConverter;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/PropertyValuesHolder;" since="21" />
+ <method name="ofObject(Landroid/util/Property;Landroid/animation/TypeConverter;Landroid/graphics/Path;)Landroid/animation/PropertyValuesHolder;" since="21" />
+ <method name="ofObject(Landroid/util/Property;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/PropertyValuesHolder;" since="14" />
+ <method name="ofObject(Ljava/lang/String;Landroid/animation/TypeConverter;Landroid/graphics/Path;)Landroid/animation/PropertyValuesHolder;" since="21" />
+ <method name="ofObject(Ljava/lang/String;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/PropertyValuesHolder;" />
+ <method name="setConverter(Landroid/animation/TypeConverter;)V" since="21" />
+ <method name="setEvaluator(Landroid/animation/TypeEvaluator;)V" />
+ <method name="setFloatValues([F)V" />
+ <method name="setIntValues([I)V" />
+ <method name="setKeyframes([Landroid/animation/Keyframe;)V" />
+ <method name="setObjectValues([Ljava/lang/Object;)V" />
+ <method name="setProperty(Landroid/util/Property;)V" since="14" />
+ <method name="setPropertyName(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/animation/RectEvaluator" since="18">
+ <extends name="java/lang/Object" />
+ <implements name="android/animation/TypeEvaluator" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/graphics/Rect;)V" since="21" />
+ <method name="evaluate(FLandroid/graphics/Rect;Landroid/graphics/Rect;)Landroid/graphics/Rect;" />
+ </class>
+ <class name="android/animation/StateListAnimator" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addState([ILandroid/animation/Animator;)V" />
+ <method name="jumpToCurrentState()V" />
+ </class>
+ <class name="android/animation/TimeAnimator" since="16">
+ <extends name="android/animation/ValueAnimator" />
+ <method name="&lt;init>()V" />
+ <method name="setTimeListener(Landroid/animation/TimeAnimator$TimeListener;)V" />
+ </class>
+ <class name="android/animation/TimeAnimator$TimeListener" since="16">
+ <extends name="java/lang/Object" />
+ <method name="onTimeUpdate(Landroid/animation/TimeAnimator;JJ)V" />
+ </class>
+ <class name="android/animation/TimeInterpolator" since="11">
+ <extends name="java/lang/Object" />
+ <method name="getInterpolation(F)F" />
+ </class>
+ <class name="android/animation/TypeConverter" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/Class;Ljava/lang/Class;)V" />
+ <method name="convert(Ljava/lang/Object;)Ljava/lang/Object;" />
+ </class>
+ <class name="android/animation/TypeEvaluator" since="11">
+ <extends name="java/lang/Object" />
+ <method name="evaluate(FLjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;" />
+ </class>
+ <class name="android/animation/ValueAnimator" since="11">
+ <extends name="android/animation/Animator" />
+ <method name="&lt;init>()V" />
+ <method name="addUpdateListener(Landroid/animation/ValueAnimator$AnimatorUpdateListener;)V" />
+ <method name="clone()Landroid/animation/ValueAnimator;" />
+ <method name="getAnimatedFraction()F" since="12" />
+ <method name="getAnimatedValue()Ljava/lang/Object;" />
+ <method name="getAnimatedValue(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="getCurrentPlayTime()J" />
+ <method name="getFrameDelay()J" />
+ <method name="getInterpolator()Landroid/animation/TimeInterpolator;" />
+ <method name="getRepeatCount()I" />
+ <method name="getRepeatMode()I" />
+ <method name="getValues()[Landroid/animation/PropertyValuesHolder;" />
+ <method name="ofArgb([I)Landroid/animation/ValueAnimator;" since="21" />
+ <method name="ofFloat([F)Landroid/animation/ValueAnimator;" />
+ <method name="ofInt([I)Landroid/animation/ValueAnimator;" />
+ <method name="ofObject(Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/ValueAnimator;" />
+ <method name="ofPropertyValuesHolder([Landroid/animation/PropertyValuesHolder;)Landroid/animation/ValueAnimator;" />
+ <method name="removeAllUpdateListeners()V" />
+ <method name="removeUpdateListener(Landroid/animation/ValueAnimator$AnimatorUpdateListener;)V" />
+ <method name="reverse()V" />
+ <method name="setCurrentPlayTime(J)V" />
+ <method name="setDuration(J)Landroid/animation/ValueAnimator;" />
+ <method name="setEvaluator(Landroid/animation/TypeEvaluator;)V" />
+ <method name="setFloatValues([F)V" />
+ <method name="setFrameDelay(J)V" />
+ <method name="setIntValues([I)V" />
+ <method name="setObjectValues([Ljava/lang/Object;)V" />
+ <method name="setRepeatCount(I)V" />
+ <method name="setRepeatMode(I)V" />
+ <method name="setValues([Landroid/animation/PropertyValuesHolder;)V" />
+ <field name="INFINITE" />
+ <field name="RESTART" />
+ <field name="REVERSE" />
+ </class>
+ <class name="android/animation/ValueAnimator$AnimatorUpdateListener" since="11">
+ <extends name="java/lang/Object" />
+ <method name="onAnimationUpdate(Landroid/animation/ValueAnimator;)V" />
+ </class>
+ <class name="android/annotation/SuppressLint" since="16">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/annotation/Annotation" />
+ <method name="value()[Ljava/lang/String;" />
+ </class>
+ <class name="android/annotation/TargetApi" since="16">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/annotation/Annotation" />
+ <method name="value()I" />
+ </class>
+ <class name="android/app/ActionBar" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addOnMenuVisibilityListener(Landroid/app/ActionBar$OnMenuVisibilityListener;)V" />
+ <method name="addTab(Landroid/app/ActionBar$Tab;)V" />
+ <method name="addTab(Landroid/app/ActionBar$Tab;I)V" />
+ <method name="addTab(Landroid/app/ActionBar$Tab;IZ)V" />
+ <method name="addTab(Landroid/app/ActionBar$Tab;Z)V" />
+ <method name="getCustomView()Landroid/view/View;" />
+ <method name="getDisplayOptions()I" />
+ <method name="getElevation()F" since="21" />
+ <method name="getHeight()I" />
+ <method name="getHideOffset()I" since="21" />
+ <method name="getNavigationItemCount()I" />
+ <method name="getNavigationMode()I" />
+ <method name="getSelectedNavigationIndex()I" />
+ <method name="getSelectedTab()Landroid/app/ActionBar$Tab;" />
+ <method name="getSubtitle()Ljava/lang/CharSequence;" />
+ <method name="getTabAt(I)Landroid/app/ActionBar$Tab;" />
+ <method name="getTabCount()I" />
+ <method name="getThemedContext()Landroid/content/Context;" since="14" />
+ <method name="getTitle()Ljava/lang/CharSequence;" />
+ <method name="hide()V" />
+ <method name="isHideOnContentScrollEnabled()Z" since="21" />
+ <method name="isShowing()Z" />
+ <method name="newTab()Landroid/app/ActionBar$Tab;" />
+ <method name="removeAllTabs()V" />
+ <method name="removeOnMenuVisibilityListener(Landroid/app/ActionBar$OnMenuVisibilityListener;)V" />
+ <method name="removeTab(Landroid/app/ActionBar$Tab;)V" />
+ <method name="removeTabAt(I)V" />
+ <method name="selectTab(Landroid/app/ActionBar$Tab;)V" />
+ <method name="setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setCustomView(I)V" />
+ <method name="setCustomView(Landroid/view/View;)V" />
+ <method name="setCustomView(Landroid/view/View;Landroid/app/ActionBar$LayoutParams;)V" />
+ <method name="setDisplayHomeAsUpEnabled(Z)V" />
+ <method name="setDisplayOptions(I)V" />
+ <method name="setDisplayOptions(II)V" />
+ <method name="setDisplayShowCustomEnabled(Z)V" />
+ <method name="setDisplayShowHomeEnabled(Z)V" />
+ <method name="setDisplayShowTitleEnabled(Z)V" />
+ <method name="setDisplayUseLogoEnabled(Z)V" />
+ <method name="setElevation(F)V" since="21" />
+ <method name="setHideOffset(I)V" since="21" />
+ <method name="setHideOnContentScrollEnabled(Z)V" since="21" />
+ <method name="setHomeActionContentDescription(I)V" since="18" />
+ <method name="setHomeActionContentDescription(Ljava/lang/CharSequence;)V" since="18" />
+ <method name="setHomeAsUpIndicator(I)V" since="18" />
+ <method name="setHomeAsUpIndicator(Landroid/graphics/drawable/Drawable;)V" since="18" />
+ <method name="setHomeButtonEnabled(Z)V" since="14" />
+ <method name="setIcon(I)V" since="14" />
+ <method name="setIcon(Landroid/graphics/drawable/Drawable;)V" since="14" />
+ <method name="setListNavigationCallbacks(Landroid/widget/SpinnerAdapter;Landroid/app/ActionBar$OnNavigationListener;)V" />
+ <method name="setLogo(I)V" since="14" />
+ <method name="setLogo(Landroid/graphics/drawable/Drawable;)V" since="14" />
+ <method name="setNavigationMode(I)V" />
+ <method name="setSelectedNavigationItem(I)V" />
+ <method name="setSplitBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V" since="14" />
+ <method name="setStackedBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V" since="14" />
+ <method name="setSubtitle(I)V" />
+ <method name="setSubtitle(Ljava/lang/CharSequence;)V" />
+ <method name="setTitle(I)V" />
+ <method name="setTitle(Ljava/lang/CharSequence;)V" />
+ <method name="show()V" />
+ <field name="DISPLAY_HOME_AS_UP" />
+ <field name="DISPLAY_SHOW_CUSTOM" />
+ <field name="DISPLAY_SHOW_HOME" />
+ <field name="DISPLAY_SHOW_TITLE" />
+ <field name="DISPLAY_USE_LOGO" />
+ <field name="NAVIGATION_MODE_LIST" />
+ <field name="NAVIGATION_MODE_STANDARD" />
+ <field name="NAVIGATION_MODE_TABS" />
+ </class>
+ <class name="android/app/ActionBar$LayoutParams" since="11">
+ <extends name="android/view/ViewGroup$MarginLayoutParams" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(II)V" />
+ <method name="&lt;init>(III)V" />
+ <method name="&lt;init>(Landroid/app/ActionBar$LayoutParams;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V" />
+ <field name="gravity" />
+ </class>
+ <class name="android/app/ActionBar$OnMenuVisibilityListener" since="11">
+ <extends name="java/lang/Object" />
+ <method name="onMenuVisibilityChanged(Z)V" />
+ </class>
+ <class name="android/app/ActionBar$OnNavigationListener" since="11">
+ <extends name="java/lang/Object" />
+ <method name="onNavigationItemSelected(IJ)Z" />
+ </class>
+ <class name="android/app/ActionBar$Tab" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getContentDescription()Ljava/lang/CharSequence;" since="14" />
+ <method name="getCustomView()Landroid/view/View;" />
+ <method name="getIcon()Landroid/graphics/drawable/Drawable;" />
+ <method name="getPosition()I" />
+ <method name="getTag()Ljava/lang/Object;" />
+ <method name="getText()Ljava/lang/CharSequence;" />
+ <method name="select()V" />
+ <method name="setContentDescription(I)Landroid/app/ActionBar$Tab;" since="14" />
+ <method name="setContentDescription(Ljava/lang/CharSequence;)Landroid/app/ActionBar$Tab;" since="14" />
+ <method name="setCustomView(I)Landroid/app/ActionBar$Tab;" />
+ <method name="setCustomView(Landroid/view/View;)Landroid/app/ActionBar$Tab;" />
+ <method name="setIcon(I)Landroid/app/ActionBar$Tab;" />
+ <method name="setIcon(Landroid/graphics/drawable/Drawable;)Landroid/app/ActionBar$Tab;" />
+ <method name="setTabListener(Landroid/app/ActionBar$TabListener;)Landroid/app/ActionBar$Tab;" />
+ <method name="setTag(Ljava/lang/Object;)Landroid/app/ActionBar$Tab;" />
+ <method name="setText(I)Landroid/app/ActionBar$Tab;" />
+ <method name="setText(Ljava/lang/CharSequence;)Landroid/app/ActionBar$Tab;" />
+ <field name="INVALID_POSITION" />
+ </class>
+ <class name="android/app/ActionBar$TabListener" since="11">
+ <extends name="java/lang/Object" />
+ <method name="onTabReselected(Landroid/app/ActionBar$Tab;Landroid/app/FragmentTransaction;)V" />
+ <method name="onTabSelected(Landroid/app/ActionBar$Tab;Landroid/app/FragmentTransaction;)V" />
+ <method name="onTabUnselected(Landroid/app/ActionBar$Tab;Landroid/app/FragmentTransaction;)V" />
+ </class>
+ <class name="android/app/Activity" since="1">
+ <extends name="android/view/ContextThemeWrapper" />
+ <implements name="android/content/ComponentCallbacks" />
+ <implements name="android/content/ComponentCallbacks2" since="14" />
+ <implements name="android/view/KeyEvent$Callback" />
+ <implements name="android/view/LayoutInflater$Factory" />
+ <implements name="android/view/LayoutInflater$Factory2" since="11" />
+ <implements name="android/view/View$OnCreateContextMenuListener" />
+ <implements name="android/view/Window$Callback" />
+ <method name="&lt;init>()V" />
+ <method name="addContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V" />
+ <method name="closeContextMenu()V" since="3" />
+ <method name="closeOptionsMenu()V" />
+ <method name="createPendingResult(ILandroid/content/Intent;I)Landroid/app/PendingIntent;" />
+ <method name="dismissDialog(I)V" />
+ <method name="dump(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V" since="11" />
+ <method name="findViewById(I)Landroid/view/View;" />
+ <method name="finish()V" />
+ <method name="finishActivity(I)V" />
+ <method name="finishActivityFromChild(Landroid/app/Activity;I)V" />
+ <method name="finishAffinity()V" since="16" />
+ <method name="finishAfterTransition()V" since="21" />
+ <method name="finishAndRemoveTask()V" since="21" />
+ <method name="finishFromChild(Landroid/app/Activity;)V" />
+ <method name="getActionBar()Landroid/app/ActionBar;" since="11" />
+ <method name="getApplication()Landroid/app/Application;" />
+ <method name="getCallingActivity()Landroid/content/ComponentName;" />
+ <method name="getCallingPackage()Ljava/lang/String;" />
+ <method name="getChangingConfigurations()I" />
+ <method name="getComponentName()Landroid/content/ComponentName;" />
+ <method name="getContentScene()Landroid/transition/Scene;" since="21" />
+ <method name="getContentTransitionManager()Landroid/transition/TransitionManager;" since="21" />
+ <method name="getCurrentFocus()Landroid/view/View;" />
+ <method name="getFragmentManager()Landroid/app/FragmentManager;" since="11" />
+ <method name="getInstanceCount()J" />
+ <method name="getIntent()Landroid/content/Intent;" />
+ <method name="getLastNonConfigurationInstance()Ljava/lang/Object;" />
+ <method name="getLayoutInflater()Landroid/view/LayoutInflater;" />
+ <method name="getLoaderManager()Landroid/app/LoaderManager;" since="11" />
+ <method name="getLocalClassName()Ljava/lang/String;" />
+ <method name="getMediaController()Landroid/media/session/MediaController;" since="21" />
+ <method name="getMenuInflater()Landroid/view/MenuInflater;" />
+ <method name="getParent()Landroid/app/Activity;" />
+ <method name="getParentActivityIntent()Landroid/content/Intent;" since="16" />
+ <method name="getPreferences(I)Landroid/content/SharedPreferences;" />
+ <method name="getRequestedOrientation()I" />
+ <method name="getTaskId()I" />
+ <method name="getTitle()Ljava/lang/CharSequence;" />
+ <method name="getTitleColor()I" />
+ <method name="getVolumeControlStream()I" />
+ <method name="getWindow()Landroid/view/Window;" />
+ <method name="getWindowManager()Landroid/view/WindowManager;" />
+ <method name="hasWindowFocus()Z" since="3" />
+ <method name="invalidateOptionsMenu()V" since="11" />
+ <method name="isChangingConfigurations()Z" since="11" />
+ <method name="isChild()Z" />
+ <method name="isDestroyed()Z" since="17" />
+ <method name="isFinishing()Z" />
+ <method name="isImmersive()Z" since="18" />
+ <method name="isTaskRoot()Z" />
+ <method name="managedQuery(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;" />
+ <method name="moveTaskToBack(Z)Z" />
+ <method name="navigateUpTo(Landroid/content/Intent;)Z" since="16" />
+ <method name="navigateUpToFromChild(Landroid/app/Activity;Landroid/content/Intent;)Z" since="16" />
+ <method name="onActivityReenter(ILandroid/content/Intent;)V" since="21" />
+ <method name="onActivityResult(IILandroid/content/Intent;)V" />
+ <method name="onAttachFragment(Landroid/app/Fragment;)V" since="11" />
+ <method name="onBackPressed()V" since="5" />
+ <method name="onChildTitleChanged(Landroid/app/Activity;Ljava/lang/CharSequence;)V" />
+ <method name="onContextItemSelected(Landroid/view/MenuItem;)Z" />
+ <method name="onContextMenuClosed(Landroid/view/Menu;)V" />
+ <method name="onCreate(Landroid/os/Bundle;)V" />
+ <method name="onCreate(Landroid/os/Bundle;Landroid/os/PersistableBundle;)V" since="21" />
+ <method name="onCreateDescription()Ljava/lang/CharSequence;" />
+ <method name="onCreateDialog(I)Landroid/app/Dialog;" />
+ <method name="onCreateDialog(ILandroid/os/Bundle;)Landroid/app/Dialog;" since="8" />
+ <method name="onCreateNavigateUpTaskStack(Landroid/app/TaskStackBuilder;)V" since="16" />
+ <method name="onCreateOptionsMenu(Landroid/view/Menu;)Z" />
+ <method name="onCreateThumbnail(Landroid/graphics/Bitmap;Landroid/graphics/Canvas;)Z" />
+ <method name="onDestroy()V" />
+ <method name="onEnterAnimationComplete()V" since="21" />
+ <method name="onGenericMotionEvent(Landroid/view/MotionEvent;)Z" since="12" />
+ <method name="onKeyShortcut(ILandroid/view/KeyEvent;)Z" since="11" />
+ <method name="onNavigateUp()Z" since="16" />
+ <method name="onNavigateUpFromChild(Landroid/app/Activity;)Z" since="16" />
+ <method name="onNewIntent(Landroid/content/Intent;)V" />
+ <method name="onOptionsItemSelected(Landroid/view/MenuItem;)Z" />
+ <method name="onOptionsMenuClosed(Landroid/view/Menu;)V" />
+ <method name="onPause()V" />
+ <method name="onPostCreate(Landroid/os/Bundle;)V" />
+ <method name="onPostCreate(Landroid/os/Bundle;Landroid/os/PersistableBundle;)V" since="21" />
+ <method name="onPostResume()V" />
+ <method name="onPrepareDialog(ILandroid/app/Dialog;)V" />
+ <method name="onPrepareDialog(ILandroid/app/Dialog;Landroid/os/Bundle;)V" since="8" />
+ <method name="onPrepareNavigateUpTaskStack(Landroid/app/TaskStackBuilder;)V" since="16" />
+ <method name="onPrepareOptionsMenu(Landroid/view/Menu;)Z" />
+ <method name="onProvideAssistData(Landroid/os/Bundle;)V" since="18" />
+ <method name="onRestart()V" />
+ <method name="onRestoreInstanceState(Landroid/os/Bundle;)V" />
+ <method name="onRestoreInstanceState(Landroid/os/Bundle;Landroid/os/PersistableBundle;)V" since="21" />
+ <method name="onResume()V" />
+ <method name="onRetainNonConfigurationInstance()Ljava/lang/Object;" />
+ <method name="onSaveInstanceState(Landroid/os/Bundle;)V" />
+ <method name="onSaveInstanceState(Landroid/os/Bundle;Landroid/os/PersistableBundle;)V" since="21" />
+ <method name="onStart()V" />
+ <method name="onStop()V" />
+ <method name="onTitleChanged(Ljava/lang/CharSequence;I)V" />
+ <method name="onTouchEvent(Landroid/view/MotionEvent;)Z" />
+ <method name="onTrackballEvent(Landroid/view/MotionEvent;)Z" />
+ <method name="onUserInteraction()V" since="3" />
+ <method name="onUserLeaveHint()V" since="3" />
+ <method name="onVisibleBehindCanceled()V" since="21" />
+ <method name="openContextMenu(Landroid/view/View;)V" />
+ <method name="openOptionsMenu()V" />
+ <method name="overridePendingTransition(II)V" since="5" />
+ <method name="postponeEnterTransition()V" since="21" />
+ <method name="recreate()V" since="11" />
+ <method name="registerForContextMenu(Landroid/view/View;)V" />
+ <method name="releaseInstance()Z" since="21" />
+ <method name="removeDialog(I)V" />
+ <method name="reportFullyDrawn()V" since="19" />
+ <method name="requestVisibleBehind(Z)Z" since="21" />
+ <method name="requestWindowFeature(I)Z" />
+ <method name="runOnUiThread(Ljava/lang/Runnable;)V" />
+ <method name="setActionBar(Landroid/widget/Toolbar;)V" since="21" />
+ <method name="setContentTransitionManager(Landroid/transition/TransitionManager;)V" since="21" />
+ <method name="setContentView(I)V" />
+ <method name="setContentView(Landroid/view/View;)V" />
+ <method name="setContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V" />
+ <method name="setDefaultKeyMode(I)V" />
+ <method name="setEnterSharedElementCallback(Landroid/app/SharedElementCallback;)V" since="21" />
+ <method name="setExitSharedElementCallback(Landroid/app/SharedElementCallback;)V" since="21" />
+ <method name="setFeatureDrawable(ILandroid/graphics/drawable/Drawable;)V" />
+ <method name="setFeatureDrawableAlpha(II)V" />
+ <method name="setFeatureDrawableResource(II)V" />
+ <method name="setFeatureDrawableUri(ILandroid/net/Uri;)V" />
+ <method name="setFinishOnTouchOutside(Z)V" since="11" />
+ <method name="setImmersive(Z)V" since="18" />
+ <method name="setIntent(Landroid/content/Intent;)V" />
+ <method name="setMediaController(Landroid/media/session/MediaController;)V" since="21" />
+ <method name="setPersistent(Z)V" />
+ <method name="setProgress(I)V" />
+ <method name="setProgressBarIndeterminate(Z)V" />
+ <method name="setProgressBarIndeterminateVisibility(Z)V" />
+ <method name="setProgressBarVisibility(Z)V" />
+ <method name="setRequestedOrientation(I)V" />
+ <method name="setResult(I)V" />
+ <method name="setResult(ILandroid/content/Intent;)V" />
+ <method name="setSecondaryProgress(I)V" />
+ <method name="setTaskDescription(Landroid/app/ActivityManager$TaskDescription;)V" since="21" />
+ <method name="setTitle(I)V" />
+ <method name="setTitle(Ljava/lang/CharSequence;)V" />
+ <method name="setTitleColor(I)V" />
+ <method name="setVisible(Z)V" since="3" />
+ <method name="setVolumeControlStream(I)V" />
+ <method name="shouldUpRecreateTask(Landroid/content/Intent;)Z" since="16" />
+ <method name="showDialog(I)V" />
+ <method name="showDialog(ILandroid/os/Bundle;)Z" since="8" />
+ <method name="startActionMode(Landroid/view/ActionMode$Callback;)Landroid/view/ActionMode;" since="11" />
+ <method name="startActivityForResult(Landroid/content/Intent;I)V" />
+ <method name="startActivityForResult(Landroid/content/Intent;ILandroid/os/Bundle;)V" since="16" />
+ <method name="startActivityFromChild(Landroid/app/Activity;Landroid/content/Intent;I)V" />
+ <method name="startActivityFromChild(Landroid/app/Activity;Landroid/content/Intent;ILandroid/os/Bundle;)V" since="16" />
+ <method name="startActivityFromFragment(Landroid/app/Fragment;Landroid/content/Intent;I)V" since="11" />
+ <method name="startActivityFromFragment(Landroid/app/Fragment;Landroid/content/Intent;ILandroid/os/Bundle;)V" since="16" />
+ <method name="startActivityIfNeeded(Landroid/content/Intent;I)Z" />
+ <method name="startActivityIfNeeded(Landroid/content/Intent;ILandroid/os/Bundle;)Z" since="16" />
+ <method name="startIntentSenderForResult(Landroid/content/IntentSender;ILandroid/content/Intent;III)V" since="5" />
+ <method name="startIntentSenderForResult(Landroid/content/IntentSender;ILandroid/content/Intent;IIILandroid/os/Bundle;)V" since="16" />
+ <method name="startIntentSenderFromChild(Landroid/app/Activity;Landroid/content/IntentSender;ILandroid/content/Intent;III)V" since="5" />
+ <method name="startIntentSenderFromChild(Landroid/app/Activity;Landroid/content/IntentSender;ILandroid/content/Intent;IIILandroid/os/Bundle;)V" since="16" />
+ <method name="startLockTask()V" since="21" />
+ <method name="startManagingCursor(Landroid/database/Cursor;)V" />
+ <method name="startNextMatchingActivity(Landroid/content/Intent;)Z" />
+ <method name="startNextMatchingActivity(Landroid/content/Intent;Landroid/os/Bundle;)Z" since="16" />
+ <method name="startPostponedEnterTransition()V" since="21" />
+ <method name="startSearch(Ljava/lang/String;ZLandroid/os/Bundle;Z)V" />
+ <method name="stopLockTask()V" since="21" />
+ <method name="stopManagingCursor(Landroid/database/Cursor;)V" />
+ <method name="takeKeyEvents(Z)V" />
+ <method name="triggerSearch(Ljava/lang/String;Landroid/os/Bundle;)V" since="5" />
+ <method name="unregisterForContextMenu(Landroid/view/View;)V" />
+ <field name="DEFAULT_KEYS_DIALER" />
+ <field name="DEFAULT_KEYS_DISABLE" />
+ <field name="DEFAULT_KEYS_SEARCH_GLOBAL" />
+ <field name="DEFAULT_KEYS_SEARCH_LOCAL" />
+ <field name="DEFAULT_KEYS_SHORTCUT" />
+ <field name="FOCUSED_STATE_SET" />
+ <field name="RESULT_CANCELED" />
+ <field name="RESULT_FIRST_USER" />
+ <field name="RESULT_OK" />
+ </class>
+ <class name="android/app/ActivityGroup" since="1">
+ <extends name="android/app/Activity" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Z)V" />
+ <method name="getCurrentActivity()Landroid/app/Activity;" />
+ <method name="getLocalActivityManager()Landroid/app/LocalActivityManager;" />
+ </class>
+ <class name="android/app/ActivityManager" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addAppTask(Landroid/app/Activity;Landroid/content/Intent;Landroid/app/ActivityManager$TaskDescription;Landroid/graphics/Bitmap;)I" since="21" />
+ <method name="clearApplicationUserData()Z" since="19" />
+ <method name="dumpPackageState(Ljava/io/FileDescriptor;Ljava/lang/String;)V" since="19" />
+ <method name="getAppTaskThumbnailSize()Landroid/util/Size;" since="21" />
+ <method name="getAppTasks()Ljava/util/List;" since="21" />
+ <method name="getDeviceConfigurationInfo()Landroid/content/pm/ConfigurationInfo;" since="3" />
+ <method name="getLargeMemoryClass()I" since="11" />
+ <method name="getLauncherLargeIconDensity()I" since="11" />
+ <method name="getLauncherLargeIconSize()I" since="11" />
+ <method name="getMemoryClass()I" since="5" />
+ <method name="getMemoryInfo(Landroid/app/ActivityManager$MemoryInfo;)V" />
+ <method name="getMyMemoryState(Landroid/app/ActivityManager$RunningAppProcessInfo;)V" since="16" />
+ <method name="getProcessMemoryInfo([I)[Landroid/os/Debug$MemoryInfo;" since="5" />
+ <method name="getProcessesInErrorState()Ljava/util/List;" />
+ <method name="getRecentTasks(II)Ljava/util/List;" />
+ <method name="getRunningAppProcesses()Ljava/util/List;" since="3" />
+ <method name="getRunningServiceControlPanel(Landroid/content/ComponentName;)Landroid/app/PendingIntent;" since="5" />
+ <method name="getRunningServices(I)Ljava/util/List;" />
+ <method name="getRunningTasks(I)Ljava/util/List;" />
+ <method name="isInLockTaskMode()Z" since="21" />
+ <method name="isLowRamDevice()Z" since="19" />
+ <method name="isRunningInTestHarness()Z" since="11" />
+ <method name="isUserAMonkey()Z" since="8" />
+ <method name="killBackgroundProcesses(Ljava/lang/String;)V" since="8" />
+ <method name="moveTaskToFront(II)V" since="11" />
+ <method name="moveTaskToFront(IILandroid/os/Bundle;)V" since="16" />
+ <method name="restartPackage(Ljava/lang/String;)V" since="3" />
+ <field name="META_HOME_ALTERNATE" since="19" />
+ <field name="MOVE_TASK_NO_USER_ACTION" since="12" />
+ <field name="MOVE_TASK_WITH_HOME" since="11" />
+ <field name="RECENT_IGNORE_UNAVAILABLE" since="11" />
+ <field name="RECENT_WITH_EXCLUDED" />
+ </class>
+ <class name="android/app/ActivityManager$AppTask" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="finishAndRemoveTask()V" />
+ <method name="getTaskInfo()Landroid/app/ActivityManager$RecentTaskInfo;" />
+ <method name="moveToFront()V" />
+ <method name="setExcludeFromRecents(Z)V" />
+ <method name="startActivity(Landroid/content/Context;Landroid/content/Intent;Landroid/os/Bundle;)V" />
+ </class>
+ <class name="android/app/ActivityManager$MemoryInfo" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="readFromParcel(Landroid/os/Parcel;)V" />
+ <field name="CREATOR" />
+ <field name="availMem" />
+ <field name="lowMemory" />
+ <field name="threshold" />
+ <field name="totalMem" since="16" />
+ </class>
+ <class name="android/app/ActivityManager$ProcessErrorStateInfo" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="readFromParcel(Landroid/os/Parcel;)V" />
+ <field name="CRASHED" />
+ <field name="CREATOR" />
+ <field name="NOT_RESPONDING" />
+ <field name="NO_ERROR" />
+ <field name="condition" />
+ <field name="crashData" />
+ <field name="longMsg" />
+ <field name="pid" />
+ <field name="processName" />
+ <field name="shortMsg" />
+ <field name="stackTrace" since="8" />
+ <field name="tag" />
+ <field name="uid" />
+ </class>
+ <class name="android/app/ActivityManager$RecentTaskInfo" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="readFromParcel(Landroid/os/Parcel;)V" />
+ <field name="CREATOR" />
+ <field name="affiliatedTaskId" since="21" />
+ <field name="baseIntent" />
+ <field name="description" since="11" />
+ <field name="id" />
+ <field name="origActivity" />
+ <field name="persistentId" since="12" />
+ <field name="taskDescription" since="21" />
+ </class>
+ <class name="android/app/ActivityManager$RunningAppProcessInfo" since="3">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;I[Ljava/lang/String;)V" />
+ <method name="readFromParcel(Landroid/os/Parcel;)V" />
+ <field name="CREATOR" />
+ <field name="IMPORTANCE_BACKGROUND" />
+ <field name="IMPORTANCE_EMPTY" />
+ <field name="IMPORTANCE_FOREGROUND" />
+ <field name="IMPORTANCE_GONE" since="21" />
+ <field name="IMPORTANCE_PERCEPTIBLE" since="9" />
+ <field name="IMPORTANCE_SERVICE" />
+ <field name="IMPORTANCE_VISIBLE" />
+ <field name="REASON_PROVIDER_IN_USE" since="5" />
+ <field name="REASON_SERVICE_IN_USE" since="5" />
+ <field name="REASON_UNKNOWN" since="5" />
+ <field name="importance" />
+ <field name="importanceReasonCode" since="5" />
+ <field name="importanceReasonComponent" since="5" />
+ <field name="importanceReasonPid" since="5" />
+ <field name="lastTrimLevel" since="16" />
+ <field name="lru" />
+ <field name="pid" />
+ <field name="pkgList" />
+ <field name="processName" />
+ <field name="uid" since="5" />
+ </class>
+ <class name="android/app/ActivityManager$RunningServiceInfo" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="readFromParcel(Landroid/os/Parcel;)V" />
+ <field name="CREATOR" />
+ <field name="FLAG_FOREGROUND" since="5" />
+ <field name="FLAG_PERSISTENT_PROCESS" since="5" />
+ <field name="FLAG_STARTED" since="5" />
+ <field name="FLAG_SYSTEM_PROCESS" since="5" />
+ <field name="activeSince" />
+ <field name="clientCount" />
+ <field name="clientLabel" since="5" />
+ <field name="clientPackage" since="5" />
+ <field name="crashCount" />
+ <field name="flags" since="5" />
+ <field name="foreground" />
+ <field name="lastActivityTime" />
+ <field name="pid" />
+ <field name="process" />
+ <field name="restarting" />
+ <field name="service" />
+ <field name="started" />
+ <field name="uid" since="5" />
+ </class>
+ <class name="android/app/ActivityManager$RunningTaskInfo" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="readFromParcel(Landroid/os/Parcel;)V" />
+ <field name="CREATOR" />
+ <field name="baseActivity" />
+ <field name="description" />
+ <field name="id" />
+ <field name="numActivities" />
+ <field name="numRunning" />
+ <field name="thumbnail" />
+ <field name="topActivity" />
+ </class>
+ <class name="android/app/ActivityManager$TaskDescription" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/app/ActivityManager$TaskDescription;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Landroid/graphics/Bitmap;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Landroid/graphics/Bitmap;I)V" />
+ <method name="getIcon()Landroid/graphics/Bitmap;" />
+ <method name="getLabel()Ljava/lang/String;" />
+ <method name="getPrimaryColor()I" />
+ <method name="readFromParcel(Landroid/os/Parcel;)V" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/app/ActivityOptions" since="16">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="makeCustomAnimation(Landroid/content/Context;II)Landroid/app/ActivityOptions;" />
+ <method name="makeScaleUpAnimation(Landroid/view/View;IIII)Landroid/app/ActivityOptions;" />
+ <method name="makeSceneTransitionAnimation(Landroid/app/Activity;Landroid/view/View;Ljava/lang/String;)Landroid/app/ActivityOptions;" since="21" />
+ <method name="makeSceneTransitionAnimation(Landroid/app/Activity;[Landroid/util/Pair;)Landroid/app/ActivityOptions;" since="21" />
+ <method name="makeTaskLaunchBehind()Landroid/app/ActivityOptions;" since="21" />
+ <method name="makeThumbnailScaleUpAnimation(Landroid/view/View;Landroid/graphics/Bitmap;II)Landroid/app/ActivityOptions;" />
+ <method name="toBundle()Landroid/os/Bundle;" />
+ <method name="update(Landroid/app/ActivityOptions;)V" />
+ </class>
+ <class name="android/app/AlarmManager" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="cancel(Landroid/app/PendingIntent;)V" />
+ <method name="getNextAlarmClock()Landroid/app/AlarmManager$AlarmClockInfo;" since="21" />
+ <method name="set(IJLandroid/app/PendingIntent;)V" />
+ <method name="setAlarmClock(Landroid/app/AlarmManager$AlarmClockInfo;Landroid/app/PendingIntent;)V" since="21" />
+ <method name="setExact(IJLandroid/app/PendingIntent;)V" since="19" />
+ <method name="setInexactRepeating(IJJLandroid/app/PendingIntent;)V" since="3" />
+ <method name="setRepeating(IJJLandroid/app/PendingIntent;)V" />
+ <method name="setTime(J)V" since="8" />
+ <method name="setTimeZone(Ljava/lang/String;)V" />
+ <method name="setWindow(IJJLandroid/app/PendingIntent;)V" since="19" />
+ <field name="ACTION_NEXT_ALARM_CLOCK_CHANGED" since="21" />
+ <field name="ELAPSED_REALTIME" />
+ <field name="ELAPSED_REALTIME_WAKEUP" />
+ <field name="INTERVAL_DAY" since="3" />
+ <field name="INTERVAL_FIFTEEN_MINUTES" since="3" />
+ <field name="INTERVAL_HALF_DAY" since="3" />
+ <field name="INTERVAL_HALF_HOUR" since="3" />
+ <field name="INTERVAL_HOUR" since="3" />
+ <field name="RTC" />
+ <field name="RTC_WAKEUP" />
+ </class>
+ <class name="android/app/AlarmManager$AlarmClockInfo" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(JLandroid/app/PendingIntent;)V" />
+ <method name="getShowIntent()Landroid/app/PendingIntent;" />
+ <method name="getTriggerTime()J" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/app/AlertDialog" since="1">
+ <extends name="android/app/Dialog" />
+ <implements name="android/content/DialogInterface" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;ZLandroid/content/DialogInterface$OnCancelListener;)V" />
+ <method name="getButton(I)Landroid/widget/Button;" since="3" />
+ <method name="getListView()Landroid/widget/ListView;" since="3" />
+ <method name="setButton(ILjava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)V" since="3" />
+ <method name="setButton(ILjava/lang/CharSequence;Landroid/os/Message;)V" since="3" />
+ <method name="setButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)V" />
+ <method name="setButton(Ljava/lang/CharSequence;Landroid/os/Message;)V" />
+ <method name="setButton2(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)V" />
+ <method name="setButton2(Ljava/lang/CharSequence;Landroid/os/Message;)V" />
+ <method name="setButton3(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)V" />
+ <method name="setButton3(Ljava/lang/CharSequence;Landroid/os/Message;)V" />
+ <method name="setCustomTitle(Landroid/view/View;)V" />
+ <method name="setIcon(I)V" />
+ <method name="setIcon(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setIconAttribute(I)V" since="11" />
+ <method name="setInverseBackgroundForced(Z)V" />
+ <method name="setMessage(Ljava/lang/CharSequence;)V" />
+ <method name="setView(Landroid/view/View;)V" />
+ <method name="setView(Landroid/view/View;IIII)V" since="3" />
+ <field name="THEME_DEVICE_DEFAULT_DARK" since="14" />
+ <field name="THEME_DEVICE_DEFAULT_LIGHT" since="14" />
+ <field name="THEME_HOLO_DARK" since="11" />
+ <field name="THEME_HOLO_LIGHT" since="11" />
+ <field name="THEME_TRADITIONAL" since="11" />
+ </class>
+ <class name="android/app/AlertDialog$Builder" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;I)V" since="11" />
+ <method name="create()Landroid/app/AlertDialog;" />
+ <method name="getContext()Landroid/content/Context;" since="11" />
+ <method name="setAdapter(Landroid/widget/ListAdapter;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;" />
+ <method name="setCancelable(Z)Landroid/app/AlertDialog$Builder;" />
+ <method name="setCursor(Landroid/database/Cursor;Landroid/content/DialogInterface$OnClickListener;Ljava/lang/String;)Landroid/app/AlertDialog$Builder;" />
+ <method name="setCustomTitle(Landroid/view/View;)Landroid/app/AlertDialog$Builder;" />
+ <method name="setIcon(I)Landroid/app/AlertDialog$Builder;" />
+ <method name="setIcon(Landroid/graphics/drawable/Drawable;)Landroid/app/AlertDialog$Builder;" />
+ <method name="setIconAttribute(I)Landroid/app/AlertDialog$Builder;" since="11" />
+ <method name="setInverseBackgroundForced(Z)Landroid/app/AlertDialog$Builder;" />
+ <method name="setItems(ILandroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;" />
+ <method name="setItems([Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;" />
+ <method name="setMessage(I)Landroid/app/AlertDialog$Builder;" />
+ <method name="setMessage(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;" />
+ <method name="setMultiChoiceItems(I[ZLandroid/content/DialogInterface$OnMultiChoiceClickListener;)Landroid/app/AlertDialog$Builder;" />
+ <method name="setMultiChoiceItems(Landroid/database/Cursor;Ljava/lang/String;Ljava/lang/String;Landroid/content/DialogInterface$OnMultiChoiceClickListener;)Landroid/app/AlertDialog$Builder;" />
+ <method name="setMultiChoiceItems([Ljava/lang/CharSequence;[ZLandroid/content/DialogInterface$OnMultiChoiceClickListener;)Landroid/app/AlertDialog$Builder;" />
+ <method name="setNegativeButton(ILandroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;" />
+ <method name="setNegativeButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;" />
+ <method name="setNeutralButton(ILandroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;" />
+ <method name="setNeutralButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;" />
+ <method name="setOnCancelListener(Landroid/content/DialogInterface$OnCancelListener;)Landroid/app/AlertDialog$Builder;" />
+ <method name="setOnDismissListener(Landroid/content/DialogInterface$OnDismissListener;)Landroid/app/AlertDialog$Builder;" since="17" />
+ <method name="setOnItemSelectedListener(Landroid/widget/AdapterView$OnItemSelectedListener;)Landroid/app/AlertDialog$Builder;" />
+ <method name="setOnKeyListener(Landroid/content/DialogInterface$OnKeyListener;)Landroid/app/AlertDialog$Builder;" />
+ <method name="setPositiveButton(ILandroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;" />
+ <method name="setPositiveButton(Ljava/lang/CharSequence;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;" />
+ <method name="setSingleChoiceItems(IILandroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;" />
+ <method name="setSingleChoiceItems(Landroid/database/Cursor;ILjava/lang/String;Landroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;" />
+ <method name="setSingleChoiceItems(Landroid/widget/ListAdapter;ILandroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;" />
+ <method name="setSingleChoiceItems([Ljava/lang/CharSequence;ILandroid/content/DialogInterface$OnClickListener;)Landroid/app/AlertDialog$Builder;" />
+ <method name="setTitle(I)Landroid/app/AlertDialog$Builder;" />
+ <method name="setTitle(Ljava/lang/CharSequence;)Landroid/app/AlertDialog$Builder;" />
+ <method name="setView(I)Landroid/app/AlertDialog$Builder;" since="21" />
+ <method name="setView(Landroid/view/View;)Landroid/app/AlertDialog$Builder;" />
+ <method name="show()Landroid/app/AlertDialog;" />
+ </class>
+ <class name="android/app/AliasActivity" since="1">
+ <extends name="android/app/Activity" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/app/AppOpsManager" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="checkOp(Ljava/lang/String;ILjava/lang/String;)I" />
+ <method name="checkOpNoThrow(Ljava/lang/String;ILjava/lang/String;)I" />
+ <method name="checkPackage(ILjava/lang/String;)V" />
+ <method name="finishOp(Ljava/lang/String;ILjava/lang/String;)V" />
+ <method name="noteOp(Ljava/lang/String;ILjava/lang/String;)I" />
+ <method name="noteOpNoThrow(Ljava/lang/String;ILjava/lang/String;)I" />
+ <method name="startOp(Ljava/lang/String;ILjava/lang/String;)I" />
+ <method name="startOpNoThrow(Ljava/lang/String;ILjava/lang/String;)I" />
+ <method name="startWatchingMode(Ljava/lang/String;Ljava/lang/String;Landroid/app/AppOpsManager$OnOpChangedListener;)V" />
+ <method name="stopWatchingMode(Landroid/app/AppOpsManager$OnOpChangedListener;)V" />
+ <field name="MODE_ALLOWED" />
+ <field name="MODE_DEFAULT" since="21" />
+ <field name="MODE_ERRORED" />
+ <field name="MODE_IGNORED" />
+ <field name="OPSTR_COARSE_LOCATION" />
+ <field name="OPSTR_FINE_LOCATION" />
+ <field name="OPSTR_GET_USAGE_STATS" since="21" />
+ <field name="OPSTR_MONITOR_HIGH_POWER_LOCATION" />
+ <field name="OPSTR_MONITOR_LOCATION" />
+ </class>
+ <class name="android/app/AppOpsManager$OnOpChangedListener" since="19">
+ <extends name="java/lang/Object" />
+ <method name="onOpChanged(Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="android/app/Application" since="1">
+ <extends name="android/content/ContextWrapper" />
+ <implements name="android/content/ComponentCallbacks" />
+ <implements name="android/content/ComponentCallbacks2" since="14" />
+ <method name="&lt;init>()V" />
+ <method name="onCreate()V" />
+ <method name="onTerminate()V" />
+ <method name="registerActivityLifecycleCallbacks(Landroid/app/Application$ActivityLifecycleCallbacks;)V" since="14" />
+ <method name="registerOnProvideAssistDataListener(Landroid/app/Application$OnProvideAssistDataListener;)V" since="18" />
+ <method name="unregisterActivityLifecycleCallbacks(Landroid/app/Application$ActivityLifecycleCallbacks;)V" since="14" />
+ <method name="unregisterOnProvideAssistDataListener(Landroid/app/Application$OnProvideAssistDataListener;)V" since="18" />
+ </class>
+ <class name="android/app/Application$ActivityLifecycleCallbacks" since="14">
+ <extends name="java/lang/Object" />
+ <method name="onActivityCreated(Landroid/app/Activity;Landroid/os/Bundle;)V" />
+ <method name="onActivityDestroyed(Landroid/app/Activity;)V" />
+ <method name="onActivityPaused(Landroid/app/Activity;)V" />
+ <method name="onActivityResumed(Landroid/app/Activity;)V" />
+ <method name="onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V" />
+ <method name="onActivityStarted(Landroid/app/Activity;)V" />
+ <method name="onActivityStopped(Landroid/app/Activity;)V" />
+ </class>
+ <class name="android/app/Application$OnProvideAssistDataListener" since="18">
+ <extends name="java/lang/Object" />
+ <method name="onProvideAssistData(Landroid/app/Activity;Landroid/os/Bundle;)V" />
+ </class>
+ <class name="android/app/ApplicationErrorReport" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V" />
+ <method name="getErrorReportReceiver(Landroid/content/Context;Ljava/lang/String;I)Landroid/content/ComponentName;" />
+ <method name="readFromParcel(Landroid/os/Parcel;)V" />
+ <field name="CREATOR" />
+ <field name="TYPE_ANR" />
+ <field name="TYPE_BATTERY" />
+ <field name="TYPE_CRASH" />
+ <field name="TYPE_NONE" />
+ <field name="TYPE_RUNNING_SERVICE" />
+ <field name="anrInfo" />
+ <field name="batteryInfo" />
+ <field name="crashInfo" />
+ <field name="installerPackageName" />
+ <field name="packageName" />
+ <field name="processName" />
+ <field name="runningServiceInfo" />
+ <field name="systemApp" />
+ <field name="time" />
+ <field name="type" />
+ </class>
+ <class name="android/app/ApplicationErrorReport$AnrInfo" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V" />
+ <method name="writeToParcel(Landroid/os/Parcel;I)V" />
+ <field name="activity" />
+ <field name="cause" />
+ <field name="info" />
+ </class>
+ <class name="android/app/ApplicationErrorReport$BatteryInfo" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V" />
+ <method name="writeToParcel(Landroid/os/Parcel;I)V" />
+ <field name="checkinDetails" />
+ <field name="durationMicros" />
+ <field name="usageDetails" />
+ <field name="usagePercent" />
+ </class>
+ <class name="android/app/ApplicationErrorReport$CrashInfo" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V" />
+ <method name="writeToParcel(Landroid/os/Parcel;I)V" />
+ <field name="exceptionClassName" />
+ <field name="exceptionMessage" />
+ <field name="stackTrace" />
+ <field name="throwClassName" />
+ <field name="throwFileName" />
+ <field name="throwLineNumber" />
+ <field name="throwMethodName" />
+ </class>
+ <class name="android/app/ApplicationErrorReport$RunningServiceInfo" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V" />
+ <method name="writeToParcel(Landroid/os/Parcel;I)V" />
+ <field name="durationMillis" />
+ <field name="serviceDetails" />
+ </class>
+ <class name="android/app/DatePickerDialog" since="1">
+ <extends name="android/app/AlertDialog" />
+ <implements name="android/content/DialogInterface$OnClickListener" />
+ <implements name="android/widget/DatePicker$OnDateChangedListener" />
+ <method name="&lt;init>(Landroid/content/Context;ILandroid/app/DatePickerDialog$OnDateSetListener;III)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/app/DatePickerDialog$OnDateSetListener;III)V" />
+ <method name="getDatePicker()Landroid/widget/DatePicker;" since="11" />
+ <method name="updateDate(III)V" />
+ </class>
+ <class name="android/app/DatePickerDialog$OnDateSetListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onDateSet(Landroid/widget/DatePicker;III)V" />
+ </class>
+ <class name="android/app/Dialog" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/content/DialogInterface" />
+ <implements name="android/view/KeyEvent$Callback" />
+ <implements name="android/view/View$OnCreateContextMenuListener" />
+ <implements name="android/view/Window$Callback" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;ZLandroid/content/DialogInterface$OnCancelListener;)V" />
+ <method name="addContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V" />
+ <method name="closeOptionsMenu()V" />
+ <method name="create()V" since="21" />
+ <method name="findViewById(I)Landroid/view/View;" />
+ <method name="getActionBar()Landroid/app/ActionBar;" since="11" />
+ <method name="getContext()Landroid/content/Context;" />
+ <method name="getCurrentFocus()Landroid/view/View;" />
+ <method name="getLayoutInflater()Landroid/view/LayoutInflater;" />
+ <method name="getOwnerActivity()Landroid/app/Activity;" />
+ <method name="getVolumeControlStream()I" />
+ <method name="getWindow()Landroid/view/Window;" />
+ <method name="hide()V" />
+ <method name="invalidateOptionsMenu()V" since="11" />
+ <method name="isShowing()Z" />
+ <method name="onBackPressed()V" since="5" />
+ <method name="onContextItemSelected(Landroid/view/MenuItem;)Z" />
+ <method name="onContextMenuClosed(Landroid/view/Menu;)V" />
+ <method name="onCreate(Landroid/os/Bundle;)V" />
+ <method name="onCreateOptionsMenu(Landroid/view/Menu;)Z" />
+ <method name="onGenericMotionEvent(Landroid/view/MotionEvent;)Z" since="12" />
+ <method name="onKeyShortcut(ILandroid/view/KeyEvent;)Z" since="11" />
+ <method name="onOptionsItemSelected(Landroid/view/MenuItem;)Z" />
+ <method name="onOptionsMenuClosed(Landroid/view/Menu;)V" />
+ <method name="onPrepareOptionsMenu(Landroid/view/Menu;)Z" />
+ <method name="onRestoreInstanceState(Landroid/os/Bundle;)V" />
+ <method name="onSaveInstanceState()Landroid/os/Bundle;" />
+ <method name="onStart()V" />
+ <method name="onStop()V" />
+ <method name="onTouchEvent(Landroid/view/MotionEvent;)Z" />
+ <method name="onTrackballEvent(Landroid/view/MotionEvent;)Z" />
+ <method name="openContextMenu(Landroid/view/View;)V" />
+ <method name="openOptionsMenu()V" />
+ <method name="registerForContextMenu(Landroid/view/View;)V" />
+ <method name="requestWindowFeature(I)Z" />
+ <method name="setCancelMessage(Landroid/os/Message;)V" />
+ <method name="setCancelable(Z)V" />
+ <method name="setCanceledOnTouchOutside(Z)V" />
+ <method name="setContentView(I)V" />
+ <method name="setContentView(Landroid/view/View;)V" />
+ <method name="setContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V" />
+ <method name="setDismissMessage(Landroid/os/Message;)V" />
+ <method name="setFeatureDrawable(ILandroid/graphics/drawable/Drawable;)V" />
+ <method name="setFeatureDrawableAlpha(II)V" />
+ <method name="setFeatureDrawableResource(II)V" />
+ <method name="setFeatureDrawableUri(ILandroid/net/Uri;)V" />
+ <method name="setOnCancelListener(Landroid/content/DialogInterface$OnCancelListener;)V" />
+ <method name="setOnDismissListener(Landroid/content/DialogInterface$OnDismissListener;)V" />
+ <method name="setOnKeyListener(Landroid/content/DialogInterface$OnKeyListener;)V" />
+ <method name="setOnShowListener(Landroid/content/DialogInterface$OnShowListener;)V" since="8" />
+ <method name="setOwnerActivity(Landroid/app/Activity;)V" />
+ <method name="setTitle(I)V" />
+ <method name="setTitle(Ljava/lang/CharSequence;)V" />
+ <method name="setVolumeControlStream(I)V" />
+ <method name="show()V" />
+ <method name="takeKeyEvents(Z)V" />
+ <method name="unregisterForContextMenu(Landroid/view/View;)V" />
+ </class>
+ <class name="android/app/DialogFragment" since="11">
+ <extends name="android/app/Fragment" />
+ <implements name="android/content/DialogInterface$OnCancelListener" />
+ <implements name="android/content/DialogInterface$OnDismissListener" />
+ <method name="&lt;init>()V" />
+ <method name="dismiss()V" />
+ <method name="dismissAllowingStateLoss()V" since="12" />
+ <method name="getDialog()Landroid/app/Dialog;" />
+ <method name="getShowsDialog()Z" />
+ <method name="getTheme()I" />
+ <method name="isCancelable()Z" />
+ <method name="onCreateDialog(Landroid/os/Bundle;)Landroid/app/Dialog;" />
+ <method name="setCancelable(Z)V" />
+ <method name="setShowsDialog(Z)V" />
+ <method name="setStyle(II)V" />
+ <method name="show(Landroid/app/FragmentManager;Ljava/lang/String;)V" />
+ <method name="show(Landroid/app/FragmentTransaction;Ljava/lang/String;)I" />
+ <field name="STYLE_NORMAL" />
+ <field name="STYLE_NO_FRAME" />
+ <field name="STYLE_NO_INPUT" />
+ <field name="STYLE_NO_TITLE" />
+ </class>
+ <class name="android/app/DownloadManager" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addCompletedDownload(Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;JZ)J" since="12" />
+ <method name="enqueue(Landroid/app/DownloadManager$Request;)J" />
+ <method name="getMaxBytesOverMobile(Landroid/content/Context;)Ljava/lang/Long;" since="11" />
+ <method name="getMimeTypeForDownloadedFile(J)Ljava/lang/String;" since="11" />
+ <method name="getRecommendedMaxBytesOverMobile(Landroid/content/Context;)Ljava/lang/Long;" since="11" />
+ <method name="getUriForDownloadedFile(J)Landroid/net/Uri;" since="11" />
+ <method name="openDownloadedFile(J)Landroid/os/ParcelFileDescriptor;" />
+ <method name="query(Landroid/app/DownloadManager$Query;)Landroid/database/Cursor;" />
+ <method name="remove([J)I" />
+ <field name="ACTION_DOWNLOAD_COMPLETE" />
+ <field name="ACTION_NOTIFICATION_CLICKED" />
+ <field name="ACTION_VIEW_DOWNLOADS" />
+ <field name="COLUMN_BYTES_DOWNLOADED_SO_FAR" />
+ <field name="COLUMN_DESCRIPTION" />
+ <field name="COLUMN_ID" />
+ <field name="COLUMN_LAST_MODIFIED_TIMESTAMP" />
+ <field name="COLUMN_LOCAL_FILENAME" since="11" />
+ <field name="COLUMN_LOCAL_URI" />
+ <field name="COLUMN_MEDIAPROVIDER_URI" />
+ <field name="COLUMN_MEDIA_TYPE" />
+ <field name="COLUMN_REASON" />
+ <field name="COLUMN_STATUS" />
+ <field name="COLUMN_TITLE" />
+ <field name="COLUMN_TOTAL_SIZE_BYTES" />
+ <field name="COLUMN_URI" />
+ <field name="ERROR_CANNOT_RESUME" />
+ <field name="ERROR_DEVICE_NOT_FOUND" />
+ <field name="ERROR_FILE_ALREADY_EXISTS" />
+ <field name="ERROR_FILE_ERROR" />
+ <field name="ERROR_HTTP_DATA_ERROR" />
+ <field name="ERROR_INSUFFICIENT_SPACE" />
+ <field name="ERROR_TOO_MANY_REDIRECTS" />
+ <field name="ERROR_UNHANDLED_HTTP_CODE" />
+ <field name="ERROR_UNKNOWN" />
+ <field name="EXTRA_DOWNLOAD_ID" />
+ <field name="EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS" since="11" />
+ <field name="INTENT_EXTRAS_SORT_BY_SIZE" since="12" />
+ <field name="PAUSED_QUEUED_FOR_WIFI" />
+ <field name="PAUSED_UNKNOWN" />
+ <field name="PAUSED_WAITING_FOR_NETWORK" />
+ <field name="PAUSED_WAITING_TO_RETRY" />
+ <field name="STATUS_FAILED" />
+ <field name="STATUS_PAUSED" />
+ <field name="STATUS_PENDING" />
+ <field name="STATUS_RUNNING" />
+ <field name="STATUS_SUCCESSFUL" />
+ </class>
+ <class name="android/app/DownloadManager$Query" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="setFilterById([J)Landroid/app/DownloadManager$Query;" />
+ <method name="setFilterByStatus(I)Landroid/app/DownloadManager$Query;" />
+ </class>
+ <class name="android/app/DownloadManager$Request" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/net/Uri;)V" />
+ <method name="addRequestHeader(Ljava/lang/String;Ljava/lang/String;)Landroid/app/DownloadManager$Request;" />
+ <method name="allowScanningByMediaScanner()V" since="11" />
+ <method name="setAllowedNetworkTypes(I)Landroid/app/DownloadManager$Request;" />
+ <method name="setAllowedOverMetered(Z)Landroid/app/DownloadManager$Request;" since="16" />
+ <method name="setAllowedOverRoaming(Z)Landroid/app/DownloadManager$Request;" />
+ <method name="setDescription(Ljava/lang/CharSequence;)Landroid/app/DownloadManager$Request;" />
+ <method name="setDestinationInExternalFilesDir(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)Landroid/app/DownloadManager$Request;" />
+ <method name="setDestinationInExternalPublicDir(Ljava/lang/String;Ljava/lang/String;)Landroid/app/DownloadManager$Request;" />
+ <method name="setDestinationUri(Landroid/net/Uri;)Landroid/app/DownloadManager$Request;" />
+ <method name="setMimeType(Ljava/lang/String;)Landroid/app/DownloadManager$Request;" />
+ <method name="setNotificationVisibility(I)Landroid/app/DownloadManager$Request;" since="11" />
+ <method name="setShowRunningNotification(Z)Landroid/app/DownloadManager$Request;" />
+ <method name="setTitle(Ljava/lang/CharSequence;)Landroid/app/DownloadManager$Request;" />
+ <method name="setVisibleInDownloadsUi(Z)Landroid/app/DownloadManager$Request;" />
+ <field name="NETWORK_MOBILE" />
+ <field name="NETWORK_WIFI" />
+ <field name="VISIBILITY_HIDDEN" since="11" />
+ <field name="VISIBILITY_VISIBLE" since="11" />
+ <field name="VISIBILITY_VISIBLE_NOTIFY_COMPLETED" since="11" />
+ <field name="VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION" since="12" />
+ </class>
+ <class name="android/app/ExpandableListActivity" since="1">
+ <extends name="android/app/Activity" />
+ <implements name="android/view/View$OnCreateContextMenuListener" />
+ <implements name="android/widget/ExpandableListView$OnChildClickListener" />
+ <implements name="android/widget/ExpandableListView$OnGroupCollapseListener" />
+ <implements name="android/widget/ExpandableListView$OnGroupExpandListener" />
+ <method name="&lt;init>()V" />
+ <method name="getExpandableListAdapter()Landroid/widget/ExpandableListAdapter;" />
+ <method name="getExpandableListView()Landroid/widget/ExpandableListView;" />
+ <method name="getSelectedId()J" />
+ <method name="getSelectedPosition()J" />
+ <method name="setListAdapter(Landroid/widget/ExpandableListAdapter;)V" />
+ <method name="setSelectedChild(IIZ)Z" />
+ <method name="setSelectedGroup(I)V" />
+ </class>
+ <class name="android/app/Fragment" since="11">
+ <extends name="java/lang/Object" />
+ <implements name="android/content/ComponentCallbacks" />
+ <implements name="android/content/ComponentCallbacks2" since="14" />
+ <implements name="android/view/View$OnCreateContextMenuListener" />
+ <method name="&lt;init>()V" />
+ <method name="dump(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V" />
+ <method name="getActivity()Landroid/app/Activity;" />
+ <method name="getAllowEnterTransitionOverlap()Z" since="21" />
+ <method name="getAllowReturnTransitionOverlap()Z" since="21" />
+ <method name="getArguments()Landroid/os/Bundle;" />
+ <method name="getChildFragmentManager()Landroid/app/FragmentManager;" since="17" />
+ <method name="getEnterTransition()Landroid/transition/Transition;" since="21" />
+ <method name="getExitTransition()Landroid/transition/Transition;" since="21" />
+ <method name="getFragmentManager()Landroid/app/FragmentManager;" />
+ <method name="getId()I" />
+ <method name="getLoaderManager()Landroid/app/LoaderManager;" />
+ <method name="getParentFragment()Landroid/app/Fragment;" since="17" />
+ <method name="getReenterTransition()Landroid/transition/Transition;" since="21" />
+ <method name="getResources()Landroid/content/res/Resources;" />
+ <method name="getRetainInstance()Z" />
+ <method name="getReturnTransition()Landroid/transition/Transition;" since="21" />
+ <method name="getSharedElementEnterTransition()Landroid/transition/Transition;" since="21" />
+ <method name="getSharedElementReturnTransition()Landroid/transition/Transition;" since="21" />
+ <method name="getString(I)Ljava/lang/String;" />
+ <method name="getString(I[Ljava/lang/Object;)Ljava/lang/String;" />
+ <method name="getTag()Ljava/lang/String;" />
+ <method name="getTargetFragment()Landroid/app/Fragment;" />
+ <method name="getTargetRequestCode()I" />
+ <method name="getText(I)Ljava/lang/CharSequence;" />
+ <method name="getUserVisibleHint()Z" since="15" />
+ <method name="getView()Landroid/view/View;" />
+ <method name="instantiate(Landroid/content/Context;Ljava/lang/String;)Landroid/app/Fragment;" />
+ <method name="instantiate(Landroid/content/Context;Ljava/lang/String;Landroid/os/Bundle;)Landroid/app/Fragment;" />
+ <method name="isAdded()Z" />
+ <method name="isDetached()Z" since="13" />
+ <method name="isHidden()Z" />
+ <method name="isInLayout()Z" />
+ <method name="isRemoving()Z" />
+ <method name="isResumed()Z" />
+ <method name="isVisible()Z" />
+ <method name="onActivityCreated(Landroid/os/Bundle;)V" />
+ <method name="onActivityResult(IILandroid/content/Intent;)V" />
+ <method name="onAttach(Landroid/app/Activity;)V" />
+ <method name="onContextItemSelected(Landroid/view/MenuItem;)Z" />
+ <method name="onCreate(Landroid/os/Bundle;)V" />
+ <method name="onCreateAnimator(IZI)Landroid/animation/Animator;" />
+ <method name="onCreateOptionsMenu(Landroid/view/Menu;Landroid/view/MenuInflater;)V" />
+ <method name="onCreateView(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)Landroid/view/View;" />
+ <method name="onDestroy()V" />
+ <method name="onDestroyOptionsMenu()V" />
+ <method name="onDestroyView()V" />
+ <method name="onDetach()V" />
+ <method name="onHiddenChanged(Z)V" />
+ <method name="onInflate(Landroid/app/Activity;Landroid/util/AttributeSet;Landroid/os/Bundle;)V" since="12" />
+ <method name="onInflate(Landroid/util/AttributeSet;Landroid/os/Bundle;)V" />
+ <method name="onOptionsItemSelected(Landroid/view/MenuItem;)Z" />
+ <method name="onOptionsMenuClosed(Landroid/view/Menu;)V" />
+ <method name="onPause()V" />
+ <method name="onPrepareOptionsMenu(Landroid/view/Menu;)V" />
+ <method name="onResume()V" />
+ <method name="onSaveInstanceState(Landroid/os/Bundle;)V" />
+ <method name="onStart()V" />
+ <method name="onStop()V" />
+ <method name="onViewCreated(Landroid/view/View;Landroid/os/Bundle;)V" since="13" />
+ <method name="onViewStateRestored(Landroid/os/Bundle;)V" since="17" />
+ <method name="registerForContextMenu(Landroid/view/View;)V" />
+ <method name="setAllowEnterTransitionOverlap(Z)V" since="21" />
+ <method name="setAllowReturnTransitionOverlap(Z)V" since="21" />
+ <method name="setArguments(Landroid/os/Bundle;)V" />
+ <method name="setEnterSharedElementCallback(Landroid/app/SharedElementCallback;)V" since="21" />
+ <method name="setEnterTransition(Landroid/transition/Transition;)V" since="21" />
+ <method name="setExitSharedElementCallback(Landroid/app/SharedElementCallback;)V" since="21" />
+ <method name="setExitTransition(Landroid/transition/Transition;)V" since="21" />
+ <method name="setHasOptionsMenu(Z)V" />
+ <method name="setInitialSavedState(Landroid/app/Fragment$SavedState;)V" since="13" />
+ <method name="setMenuVisibility(Z)V" since="14" />
+ <method name="setReenterTransition(Landroid/transition/Transition;)V" since="21" />
+ <method name="setRetainInstance(Z)V" />
+ <method name="setReturnTransition(Landroid/transition/Transition;)V" since="21" />
+ <method name="setSharedElementEnterTransition(Landroid/transition/Transition;)V" since="21" />
+ <method name="setSharedElementReturnTransition(Landroid/transition/Transition;)V" since="21" />
+ <method name="setTargetFragment(Landroid/app/Fragment;I)V" />
+ <method name="setUserVisibleHint(Z)V" since="15" />
+ <method name="startActivity(Landroid/content/Intent;)V" />
+ <method name="startActivity(Landroid/content/Intent;Landroid/os/Bundle;)V" since="16" />
+ <method name="startActivityForResult(Landroid/content/Intent;I)V" />
+ <method name="startActivityForResult(Landroid/content/Intent;ILandroid/os/Bundle;)V" since="16" />
+ <method name="unregisterForContextMenu(Landroid/view/View;)V" />
+ </class>
+ <class name="android/app/Fragment$InstantiationException" since="11">
+ <extends name="android/util/AndroidRuntimeException" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Exception;)V" />
+ </class>
+ <class name="android/app/Fragment$SavedState" since="13">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/app/FragmentBreadCrumbs" since="11">
+ <extends name="android/view/ViewGroup" />
+ <implements name="android/app/FragmentManager$OnBackStackChangedListener" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="setActivity(Landroid/app/Activity;)V" />
+ <method name="setMaxVisible(I)V" />
+ <method name="setOnBreadCrumbClickListener(Landroid/app/FragmentBreadCrumbs$OnBreadCrumbClickListener;)V" since="12" />
+ <method name="setParentTitle(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/view/View$OnClickListener;)V" />
+ <method name="setTitle(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)V" />
+ </class>
+ <class name="android/app/FragmentBreadCrumbs$OnBreadCrumbClickListener" since="12">
+ <extends name="java/lang/Object" />
+ <method name="onBreadCrumbClick(Landroid/app/FragmentManager$BackStackEntry;I)Z" />
+ </class>
+ <class name="android/app/FragmentManager" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addOnBackStackChangedListener(Landroid/app/FragmentManager$OnBackStackChangedListener;)V" />
+ <method name="beginTransaction()Landroid/app/FragmentTransaction;" />
+ <method name="dump(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V" />
+ <method name="enableDebugLogging(Z)V" />
+ <method name="executePendingTransactions()Z" />
+ <method name="findFragmentById(I)Landroid/app/Fragment;" />
+ <method name="findFragmentByTag(Ljava/lang/String;)Landroid/app/Fragment;" />
+ <method name="getBackStackEntryAt(I)Landroid/app/FragmentManager$BackStackEntry;" />
+ <method name="getBackStackEntryCount()I" />
+ <method name="getFragment(Landroid/os/Bundle;Ljava/lang/String;)Landroid/app/Fragment;" />
+ <method name="invalidateOptionsMenu()V" since="14" />
+ <method name="isDestroyed()Z" since="17" />
+ <method name="popBackStack()V" />
+ <method name="popBackStack(II)V" />
+ <method name="popBackStack(Ljava/lang/String;I)V" />
+ <method name="popBackStackImmediate()Z" />
+ <method name="popBackStackImmediate(II)Z" />
+ <method name="popBackStackImmediate(Ljava/lang/String;I)Z" />
+ <method name="putFragment(Landroid/os/Bundle;Ljava/lang/String;Landroid/app/Fragment;)V" />
+ <method name="removeOnBackStackChangedListener(Landroid/app/FragmentManager$OnBackStackChangedListener;)V" />
+ <method name="saveFragmentInstanceState(Landroid/app/Fragment;)Landroid/app/Fragment$SavedState;" since="13" />
+ <field name="POP_BACK_STACK_INCLUSIVE" />
+ </class>
+ <class name="android/app/FragmentManager$BackStackEntry" since="11">
+ <extends name="java/lang/Object" />
+ <method name="getBreadCrumbShortTitle()Ljava/lang/CharSequence;" />
+ <method name="getBreadCrumbShortTitleRes()I" />
+ <method name="getBreadCrumbTitle()Ljava/lang/CharSequence;" />
+ <method name="getBreadCrumbTitleRes()I" />
+ <method name="getId()I" />
+ <method name="getName()Ljava/lang/String;" since="14" />
+ </class>
+ <class name="android/app/FragmentManager$OnBackStackChangedListener" since="11">
+ <extends name="java/lang/Object" />
+ <method name="onBackStackChanged()V" />
+ </class>
+ <class name="android/app/FragmentTransaction" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="add(ILandroid/app/Fragment;)Landroid/app/FragmentTransaction;" />
+ <method name="add(ILandroid/app/Fragment;Ljava/lang/String;)Landroid/app/FragmentTransaction;" />
+ <method name="add(Landroid/app/Fragment;Ljava/lang/String;)Landroid/app/FragmentTransaction;" />
+ <method name="addSharedElement(Landroid/view/View;Ljava/lang/String;)Landroid/app/FragmentTransaction;" since="21" />
+ <method name="addToBackStack(Ljava/lang/String;)Landroid/app/FragmentTransaction;" />
+ <method name="attach(Landroid/app/Fragment;)Landroid/app/FragmentTransaction;" since="13" />
+ <method name="commit()I" />
+ <method name="commitAllowingStateLoss()I" />
+ <method name="detach(Landroid/app/Fragment;)Landroid/app/FragmentTransaction;" since="13" />
+ <method name="disallowAddToBackStack()Landroid/app/FragmentTransaction;" />
+ <method name="hide(Landroid/app/Fragment;)Landroid/app/FragmentTransaction;" />
+ <method name="isAddToBackStackAllowed()Z" />
+ <method name="isEmpty()Z" />
+ <method name="remove(Landroid/app/Fragment;)Landroid/app/FragmentTransaction;" />
+ <method name="replace(ILandroid/app/Fragment;)Landroid/app/FragmentTransaction;" />
+ <method name="replace(ILandroid/app/Fragment;Ljava/lang/String;)Landroid/app/FragmentTransaction;" />
+ <method name="setBreadCrumbShortTitle(I)Landroid/app/FragmentTransaction;" />
+ <method name="setBreadCrumbShortTitle(Ljava/lang/CharSequence;)Landroid/app/FragmentTransaction;" />
+ <method name="setBreadCrumbTitle(I)Landroid/app/FragmentTransaction;" />
+ <method name="setBreadCrumbTitle(Ljava/lang/CharSequence;)Landroid/app/FragmentTransaction;" />
+ <method name="setCustomAnimations(II)Landroid/app/FragmentTransaction;" />
+ <method name="setCustomAnimations(IIII)Landroid/app/FragmentTransaction;" since="13" />
+ <method name="setTransition(I)Landroid/app/FragmentTransaction;" />
+ <method name="setTransitionStyle(I)Landroid/app/FragmentTransaction;" />
+ <method name="show(Landroid/app/Fragment;)Landroid/app/FragmentTransaction;" />
+ <field name="TRANSIT_ENTER_MASK" />
+ <field name="TRANSIT_EXIT_MASK" />
+ <field name="TRANSIT_FRAGMENT_CLOSE" />
+ <field name="TRANSIT_FRAGMENT_FADE" />
+ <field name="TRANSIT_FRAGMENT_OPEN" />
+ <field name="TRANSIT_NONE" />
+ <field name="TRANSIT_UNSET" />
+ </class>
+ <class name="android/app/Instrumentation" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addMonitor(Landroid/app/Instrumentation$ActivityMonitor;)V" />
+ <method name="addMonitor(Landroid/content/IntentFilter;Landroid/app/Instrumentation$ActivityResult;Z)Landroid/app/Instrumentation$ActivityMonitor;" />
+ <method name="addMonitor(Ljava/lang/String;Landroid/app/Instrumentation$ActivityResult;Z)Landroid/app/Instrumentation$ActivityMonitor;" />
+ <method name="callActivityOnCreate(Landroid/app/Activity;Landroid/os/Bundle;)V" />
+ <method name="callActivityOnCreate(Landroid/app/Activity;Landroid/os/Bundle;Landroid/os/PersistableBundle;)V" since="21" />
+ <method name="callActivityOnDestroy(Landroid/app/Activity;)V" />
+ <method name="callActivityOnNewIntent(Landroid/app/Activity;Landroid/content/Intent;)V" />
+ <method name="callActivityOnPause(Landroid/app/Activity;)V" />
+ <method name="callActivityOnPostCreate(Landroid/app/Activity;Landroid/os/Bundle;)V" />
+ <method name="callActivityOnPostCreate(Landroid/app/Activity;Landroid/os/Bundle;Landroid/os/PersistableBundle;)V" since="21" />
+ <method name="callActivityOnRestart(Landroid/app/Activity;)V" />
+ <method name="callActivityOnRestoreInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V" />
+ <method name="callActivityOnRestoreInstanceState(Landroid/app/Activity;Landroid/os/Bundle;Landroid/os/PersistableBundle;)V" since="21" />
+ <method name="callActivityOnResume(Landroid/app/Activity;)V" />
+ <method name="callActivityOnSaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V" />
+ <method name="callActivityOnSaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;Landroid/os/PersistableBundle;)V" since="21" />
+ <method name="callActivityOnStart(Landroid/app/Activity;)V" />
+ <method name="callActivityOnStop(Landroid/app/Activity;)V" />
+ <method name="callActivityOnUserLeaving(Landroid/app/Activity;)V" since="3" />
+ <method name="callApplicationOnCreate(Landroid/app/Application;)V" />
+ <method name="checkMonitorHit(Landroid/app/Instrumentation$ActivityMonitor;I)Z" />
+ <method name="endPerformanceSnapshot()V" />
+ <method name="finish(ILandroid/os/Bundle;)V" />
+ <method name="getAllocCounts()Landroid/os/Bundle;" />
+ <method name="getBinderCounts()Landroid/os/Bundle;" />
+ <method name="getComponentName()Landroid/content/ComponentName;" />
+ <method name="getContext()Landroid/content/Context;" />
+ <method name="getTargetContext()Landroid/content/Context;" />
+ <method name="getUiAutomation()Landroid/app/UiAutomation;" since="18" />
+ <method name="invokeContextMenuAction(Landroid/app/Activity;II)Z" />
+ <method name="invokeMenuActionSync(Landroid/app/Activity;II)Z" />
+ <method name="isProfiling()Z" />
+ <method name="newActivity(Ljava/lang/Class;Landroid/content/Context;Landroid/os/IBinder;Landroid/app/Application;Landroid/content/Intent;Landroid/content/pm/ActivityInfo;Ljava/lang/CharSequence;Landroid/app/Activity;Ljava/lang/String;Ljava/lang/Object;)Landroid/app/Activity;" />
+ <method name="newActivity(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Activity;" />
+ <method name="newApplication(Ljava/lang/Class;Landroid/content/Context;)Landroid/app/Application;" />
+ <method name="newApplication(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Context;)Landroid/app/Application;" />
+ <method name="onCreate(Landroid/os/Bundle;)V" />
+ <method name="onDestroy()V" />
+ <method name="onException(Ljava/lang/Object;Ljava/lang/Throwable;)Z" />
+ <method name="onStart()V" />
+ <method name="removeMonitor(Landroid/app/Instrumentation$ActivityMonitor;)V" />
+ <method name="runOnMainSync(Ljava/lang/Runnable;)V" />
+ <method name="sendCharacterSync(I)V" />
+ <method name="sendKeyDownUpSync(I)V" />
+ <method name="sendKeySync(Landroid/view/KeyEvent;)V" />
+ <method name="sendPointerSync(Landroid/view/MotionEvent;)V" />
+ <method name="sendStatus(ILandroid/os/Bundle;)V" />
+ <method name="sendStringSync(Ljava/lang/String;)V" />
+ <method name="sendTrackballEventSync(Landroid/view/MotionEvent;)V" />
+ <method name="setAutomaticPerformanceSnapshots()V" />
+ <method name="setInTouchMode(Z)V" />
+ <method name="start()V" />
+ <method name="startActivitySync(Landroid/content/Intent;)Landroid/app/Activity;" />
+ <method name="startAllocCounting()V" />
+ <method name="startPerformanceSnapshot()V" />
+ <method name="startProfiling()V" />
+ <method name="stopAllocCounting()V" />
+ <method name="stopProfiling()V" />
+ <method name="waitForIdle(Ljava/lang/Runnable;)V" />
+ <method name="waitForIdleSync()V" />
+ <method name="waitForMonitor(Landroid/app/Instrumentation$ActivityMonitor;)Landroid/app/Activity;" />
+ <method name="waitForMonitorWithTimeout(Landroid/app/Instrumentation$ActivityMonitor;J)Landroid/app/Activity;" />
+ <field name="REPORT_KEY_IDENTIFIER" />
+ <field name="REPORT_KEY_STREAMRESULT" />
+ </class>
+ <class name="android/app/Instrumentation$ActivityMonitor" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/IntentFilter;Landroid/app/Instrumentation$ActivityResult;Z)V" />
+ <method name="&lt;init>(Ljava/lang/String;Landroid/app/Instrumentation$ActivityResult;Z)V" />
+ <method name="getFilter()Landroid/content/IntentFilter;" />
+ <method name="getHits()I" />
+ <method name="getLastActivity()Landroid/app/Activity;" />
+ <method name="getResult()Landroid/app/Instrumentation$ActivityResult;" />
+ <method name="isBlocking()Z" />
+ <method name="waitForActivity()Landroid/app/Activity;" />
+ <method name="waitForActivityWithTimeout(J)Landroid/app/Activity;" />
+ </class>
+ <class name="android/app/Instrumentation$ActivityResult" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(ILandroid/content/Intent;)V" />
+ <method name="getResultCode()I" />
+ <method name="getResultData()Landroid/content/Intent;" />
+ </class>
+ <class name="android/app/IntentService" since="3">
+ <extends name="android/app/Service" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="onHandleIntent(Landroid/content/Intent;)V" />
+ <method name="setIntentRedelivery(Z)V" since="5" />
+ </class>
+ <class name="android/app/KeyguardManager" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="createConfirmDeviceCredentialIntent(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Landroid/content/Intent;" since="21" />
+ <method name="exitKeyguardSecurely(Landroid/app/KeyguardManager$OnKeyguardExitResult;)V" />
+ <method name="inKeyguardRestrictedInputMode()Z" />
+ <method name="isKeyguardLocked()Z" since="16" />
+ <method name="isKeyguardSecure()Z" since="16" />
+ <method name="newKeyguardLock(Ljava/lang/String;)Landroid/app/KeyguardManager$KeyguardLock;" />
+ </class>
+ <class name="android/app/KeyguardManager$KeyguardLock" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/app/KeyguardManager;)V" />
+ <method name="disableKeyguard()V" />
+ <method name="reenableKeyguard()V" />
+ </class>
+ <class name="android/app/KeyguardManager$OnKeyguardExitResult" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onKeyguardExitResult(Z)V" />
+ </class>
+ <class name="android/app/LauncherActivity" since="1">
+ <extends name="android/app/ListActivity" />
+ <method name="&lt;init>()V" />
+ <method name="getTargetIntent()Landroid/content/Intent;" />
+ <method name="intentForPosition(I)Landroid/content/Intent;" since="3" />
+ <method name="itemForPosition(I)Landroid/app/LauncherActivity$ListItem;" since="4" />
+ <method name="makeListItems()Ljava/util/List;" since="3" />
+ <method name="onQueryPackageManager(Landroid/content/Intent;)Ljava/util/List;" since="5" />
+ <method name="onSetContentView()V" since="5" />
+ </class>
+ <class name="android/app/LauncherActivity$IconResizer" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/app/LauncherActivity;)V" />
+ <method name="createIconThumbnail(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable;" />
+ </class>
+ <class name="android/app/LauncherActivity$ListItem" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="className" />
+ <field name="extras" />
+ <field name="icon" />
+ <field name="label" />
+ <field name="packageName" />
+ <field name="resolveInfo" since="4" />
+ </class>
+ <class name="android/app/ListActivity" since="1">
+ <extends name="android/app/Activity" />
+ <method name="&lt;init>()V" />
+ <method name="getListAdapter()Landroid/widget/ListAdapter;" />
+ <method name="getListView()Landroid/widget/ListView;" />
+ <method name="getSelectedItemId()J" />
+ <method name="getSelectedItemPosition()I" />
+ <method name="onListItemClick(Landroid/widget/ListView;Landroid/view/View;IJ)V" />
+ <method name="setListAdapter(Landroid/widget/ListAdapter;)V" />
+ <method name="setSelection(I)V" />
+ </class>
+ <class name="android/app/ListFragment" since="11">
+ <extends name="android/app/Fragment" />
+ <method name="&lt;init>()V" />
+ <method name="getListAdapter()Landroid/widget/ListAdapter;" />
+ <method name="getListView()Landroid/widget/ListView;" />
+ <method name="getSelectedItemId()J" />
+ <method name="getSelectedItemPosition()I" />
+ <method name="onListItemClick(Landroid/widget/ListView;Landroid/view/View;IJ)V" />
+ <method name="setEmptyText(Ljava/lang/CharSequence;)V" />
+ <method name="setListAdapter(Landroid/widget/ListAdapter;)V" />
+ <method name="setListShown(Z)V" />
+ <method name="setListShownNoAnimation(Z)V" />
+ <method name="setSelection(I)V" />
+ </class>
+ <class name="android/app/LoaderManager" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="destroyLoader(I)V" />
+ <method name="dump(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V" />
+ <method name="enableDebugLogging(Z)V" />
+ <method name="getLoader(I)Landroid/content/Loader;" />
+ <method name="initLoader(ILandroid/os/Bundle;Landroid/app/LoaderManager$LoaderCallbacks;)Landroid/content/Loader;" />
+ <method name="restartLoader(ILandroid/os/Bundle;Landroid/app/LoaderManager$LoaderCallbacks;)Landroid/content/Loader;" />
+ </class>
+ <class name="android/app/LoaderManager$LoaderCallbacks" since="11">
+ <extends name="java/lang/Object" />
+ <method name="onCreateLoader(ILandroid/os/Bundle;)Landroid/content/Loader;" />
+ <method name="onLoadFinished(Landroid/content/Loader;Ljava/lang/Object;)V" />
+ <method name="onLoaderReset(Landroid/content/Loader;)V" />
+ </class>
+ <class name="android/app/LocalActivityManager" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/app/Activity;Z)V" />
+ <method name="destroyActivity(Ljava/lang/String;Z)Landroid/view/Window;" />
+ <method name="dispatchCreate(Landroid/os/Bundle;)V" />
+ <method name="dispatchDestroy(Z)V" />
+ <method name="dispatchPause(Z)V" />
+ <method name="dispatchResume()V" />
+ <method name="dispatchStop()V" />
+ <method name="getActivity(Ljava/lang/String;)Landroid/app/Activity;" />
+ <method name="getCurrentActivity()Landroid/app/Activity;" />
+ <method name="getCurrentId()Ljava/lang/String;" />
+ <method name="removeAllActivities()V" />
+ <method name="saveInstanceState()Landroid/os/Bundle;" />
+ <method name="startActivity(Ljava/lang/String;Landroid/content/Intent;)Landroid/view/Window;" />
+ </class>
+ <class name="android/app/MediaRouteActionProvider" since="16">
+ <extends name="android/view/ActionProvider" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="setExtendedSettingsClickListener(Landroid/view/View$OnClickListener;)V" />
+ <method name="setRouteTypes(I)V" />
+ </class>
+ <class name="android/app/MediaRouteButton" since="16">
+ <extends name="android/view/View" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getRouteTypes()I" />
+ <method name="setExtendedSettingsClickListener(Landroid/view/View$OnClickListener;)V" />
+ <method name="setRouteTypes(I)V" />
+ <method name="showDialog()V" />
+ </class>
+ <class name="android/app/NativeActivity" since="9">
+ <extends name="android/app/Activity" />
+ <implements name="android/view/InputQueue$Callback" />
+ <implements name="android/view/SurfaceHolder$Callback2" />
+ <implements name="android/view/ViewTreeObserver$OnGlobalLayoutListener" />
+ <method name="&lt;init>()V" />
+ <field name="META_DATA_FUNC_NAME" />
+ <field name="META_DATA_LIB_NAME" />
+ </class>
+ <class name="android/app/Notification" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(ILjava/lang/CharSequence;J)V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="clone()Landroid/app/Notification;" since="9" />
+ <method name="getGroup()Ljava/lang/String;" since="20" />
+ <method name="getSortKey()Ljava/lang/String;" since="20" />
+ <method name="setLatestEventInfo(Landroid/content/Context;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/app/PendingIntent;)V" />
+ <field name="AUDIO_ATTRIBUTES_DEFAULT" since="21" />
+ <field name="CATEGORY_ALARM" since="21" />
+ <field name="CATEGORY_CALL" since="21" />
+ <field name="CATEGORY_EMAIL" since="21" />
+ <field name="CATEGORY_ERROR" since="21" />
+ <field name="CATEGORY_EVENT" since="21" />
+ <field name="CATEGORY_MESSAGE" since="21" />
+ <field name="CATEGORY_PROGRESS" since="21" />
+ <field name="CATEGORY_PROMO" since="21" />
+ <field name="CATEGORY_RECOMMENDATION" since="21" />
+ <field name="CATEGORY_SERVICE" since="21" />
+ <field name="CATEGORY_SOCIAL" since="21" />
+ <field name="CATEGORY_STATUS" since="21" />
+ <field name="CATEGORY_SYSTEM" since="21" />
+ <field name="CATEGORY_TRANSPORT" since="21" />
+ <field name="COLOR_DEFAULT" since="21" />
+ <field name="CREATOR" />
+ <field name="DEFAULT_ALL" />
+ <field name="DEFAULT_LIGHTS" />
+ <field name="DEFAULT_SOUND" />
+ <field name="DEFAULT_VIBRATE" />
+ <field name="EXTRA_BACKGROUND_IMAGE_URI" since="21" />
+ <field name="EXTRA_BIG_TEXT" since="21" />
+ <field name="EXTRA_COMPACT_ACTIONS" since="21" />
+ <field name="EXTRA_INFO_TEXT" since="19" />
+ <field name="EXTRA_LARGE_ICON" since="19" />
+ <field name="EXTRA_LARGE_ICON_BIG" since="19" />
+ <field name="EXTRA_MEDIA_SESSION" since="21" />
+ <field name="EXTRA_PEOPLE" since="19" />
+ <field name="EXTRA_PICTURE" since="19" />
+ <field name="EXTRA_PROGRESS" since="19" />
+ <field name="EXTRA_PROGRESS_INDETERMINATE" since="19" />
+ <field name="EXTRA_PROGRESS_MAX" since="19" />
+ <field name="EXTRA_SHOW_CHRONOMETER" since="19" />
+ <field name="EXTRA_SHOW_WHEN" since="19" />
+ <field name="EXTRA_SMALL_ICON" since="19" />
+ <field name="EXTRA_SUB_TEXT" since="19" />
+ <field name="EXTRA_SUMMARY_TEXT" since="19" />
+ <field name="EXTRA_TEMPLATE" since="21" />
+ <field name="EXTRA_TEXT" since="19" />
+ <field name="EXTRA_TEXT_LINES" since="19" />
+ <field name="EXTRA_TITLE" since="19" />
+ <field name="EXTRA_TITLE_BIG" since="19" />
+ <field name="FLAG_AUTO_CANCEL" />
+ <field name="FLAG_FOREGROUND_SERVICE" since="5" />
+ <field name="FLAG_GROUP_SUMMARY" since="20" />
+ <field name="FLAG_HIGH_PRIORITY" since="11" />
+ <field name="FLAG_INSISTENT" />
+ <field name="FLAG_LOCAL_ONLY" since="20" />
+ <field name="FLAG_NO_CLEAR" />
+ <field name="FLAG_ONGOING_EVENT" />
+ <field name="FLAG_ONLY_ALERT_ONCE" />
+ <field name="FLAG_SHOW_LIGHTS" />
+ <field name="INTENT_CATEGORY_NOTIFICATION_PREFERENCES" since="21" />
+ <field name="PRIORITY_DEFAULT" since="16" />
+ <field name="PRIORITY_HIGH" since="16" />
+ <field name="PRIORITY_LOW" since="16" />
+ <field name="PRIORITY_MAX" since="16" />
+ <field name="PRIORITY_MIN" since="16" />
+ <field name="STREAM_DEFAULT" />
+ <field name="VISIBILITY_PRIVATE" since="21" />
+ <field name="VISIBILITY_PUBLIC" since="21" />
+ <field name="VISIBILITY_SECRET" since="21" />
+ <field name="actions" since="19" />
+ <field name="audioAttributes" since="21" />
+ <field name="audioStreamType" />
+ <field name="bigContentView" since="16" />
+ <field name="category" since="21" />
+ <field name="color" since="21" />
+ <field name="contentIntent" />
+ <field name="contentView" />
+ <field name="defaults" />
+ <field name="deleteIntent" />
+ <field name="extras" since="19" />
+ <field name="flags" />
+ <field name="fullScreenIntent" since="9" />
+ <field name="headsUpContentView" since="21" />
+ <field name="icon" />
+ <field name="iconLevel" />
+ <field name="largeIcon" since="11" />
+ <field name="ledARGB" />
+ <field name="ledOffMS" />
+ <field name="ledOnMS" />
+ <field name="number" />
+ <field name="priority" since="16" />
+ <field name="publicVersion" since="21" />
+ <field name="sound" />
+ <field name="tickerText" />
+ <field name="tickerView" since="11" />
+ <field name="vibrate" />
+ <field name="visibility" since="21" />
+ <field name="when" />
+ </class>
+ <class name="android/app/Notification$Action" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(ILjava/lang/CharSequence;Landroid/app/PendingIntent;)V" />
+ <method name="clone()Landroid/app/Notification$Action;" />
+ <method name="getExtras()Landroid/os/Bundle;" since="20" />
+ <method name="getRemoteInputs()[Landroid/app/RemoteInput;" since="20" />
+ <field name="CREATOR" />
+ <field name="actionIntent" />
+ <field name="icon" />
+ <field name="title" />
+ </class>
+ <class name="android/app/Notification$Action$Builder" since="20">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(ILjava/lang/CharSequence;Landroid/app/PendingIntent;)V" />
+ <method name="&lt;init>(Landroid/app/Notification$Action;)V" />
+ <method name="addExtras(Landroid/os/Bundle;)Landroid/app/Notification$Action$Builder;" />
+ <method name="addRemoteInput(Landroid/app/RemoteInput;)Landroid/app/Notification$Action$Builder;" />
+ <method name="build()Landroid/app/Notification$Action;" />
+ <method name="extend(Landroid/app/Notification$Action$Extender;)Landroid/app/Notification$Action$Builder;" />
+ <method name="getExtras()Landroid/os/Bundle;" />
+ </class>
+ <class name="android/app/Notification$Action$Extender" since="20">
+ <extends name="java/lang/Object" />
+ <method name="extend(Landroid/app/Notification$Action$Builder;)Landroid/app/Notification$Action$Builder;" />
+ </class>
+ <class name="android/app/Notification$Action$WearableExtender" since="20">
+ <extends name="java/lang/Object" />
+ <implements name="android/app/Notification$Action$Extender" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/app/Notification$Action;)V" />
+ <method name="clone()Landroid/app/Notification$Action$WearableExtender;" />
+ <method name="isAvailableOffline()Z" />
+ <method name="setAvailableOffline(Z)Landroid/app/Notification$Action$WearableExtender;" />
+ </class>
+ <class name="android/app/Notification$BigPictureStyle" since="16">
+ <extends name="android/app/Notification$Style" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/app/Notification$Builder;)V" />
+ <method name="bigLargeIcon(Landroid/graphics/Bitmap;)Landroid/app/Notification$BigPictureStyle;" />
+ <method name="bigPicture(Landroid/graphics/Bitmap;)Landroid/app/Notification$BigPictureStyle;" />
+ <method name="setBigContentTitle(Ljava/lang/CharSequence;)Landroid/app/Notification$BigPictureStyle;" />
+ <method name="setSummaryText(Ljava/lang/CharSequence;)Landroid/app/Notification$BigPictureStyle;" />
+ </class>
+ <class name="android/app/Notification$BigTextStyle" since="16">
+ <extends name="android/app/Notification$Style" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/app/Notification$Builder;)V" />
+ <method name="bigText(Ljava/lang/CharSequence;)Landroid/app/Notification$BigTextStyle;" />
+ <method name="setBigContentTitle(Ljava/lang/CharSequence;)Landroid/app/Notification$BigTextStyle;" />
+ <method name="setSummaryText(Ljava/lang/CharSequence;)Landroid/app/Notification$BigTextStyle;" />
+ </class>
+ <class name="android/app/Notification$Builder" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="addAction(ILjava/lang/CharSequence;Landroid/app/PendingIntent;)Landroid/app/Notification$Builder;" since="16" />
+ <method name="addAction(Landroid/app/Notification$Action;)Landroid/app/Notification$Builder;" since="20" />
+ <method name="addExtras(Landroid/os/Bundle;)Landroid/app/Notification$Builder;" since="20" />
+ <method name="addPerson(Ljava/lang/String;)Landroid/app/Notification$Builder;" since="21" />
+ <method name="build()Landroid/app/Notification;" since="16" />
+ <method name="extend(Landroid/app/Notification$Extender;)Landroid/app/Notification$Builder;" since="20" />
+ <method name="getExtras()Landroid/os/Bundle;" since="20" />
+ <method name="getNotification()Landroid/app/Notification;" />
+ <method name="setAutoCancel(Z)Landroid/app/Notification$Builder;" />
+ <method name="setCategory(Ljava/lang/String;)Landroid/app/Notification$Builder;" since="21" />
+ <method name="setColor(I)Landroid/app/Notification$Builder;" since="21" />
+ <method name="setContent(Landroid/widget/RemoteViews;)Landroid/app/Notification$Builder;" />
+ <method name="setContentInfo(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;" />
+ <method name="setContentIntent(Landroid/app/PendingIntent;)Landroid/app/Notification$Builder;" />
+ <method name="setContentText(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;" />
+ <method name="setContentTitle(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;" />
+ <method name="setDefaults(I)Landroid/app/Notification$Builder;" />
+ <method name="setDeleteIntent(Landroid/app/PendingIntent;)Landroid/app/Notification$Builder;" />
+ <method name="setExtras(Landroid/os/Bundle;)Landroid/app/Notification$Builder;" since="19" />
+ <method name="setFullScreenIntent(Landroid/app/PendingIntent;Z)Landroid/app/Notification$Builder;" />
+ <method name="setGroup(Ljava/lang/String;)Landroid/app/Notification$Builder;" since="20" />
+ <method name="setGroupSummary(Z)Landroid/app/Notification$Builder;" since="20" />
+ <method name="setLargeIcon(Landroid/graphics/Bitmap;)Landroid/app/Notification$Builder;" />
+ <method name="setLights(III)Landroid/app/Notification$Builder;" />
+ <method name="setLocalOnly(Z)Landroid/app/Notification$Builder;" since="20" />
+ <method name="setNumber(I)Landroid/app/Notification$Builder;" />
+ <method name="setOngoing(Z)Landroid/app/Notification$Builder;" />
+ <method name="setOnlyAlertOnce(Z)Landroid/app/Notification$Builder;" />
+ <method name="setPriority(I)Landroid/app/Notification$Builder;" since="16" />
+ <method name="setProgress(IIZ)Landroid/app/Notification$Builder;" since="14" />
+ <method name="setPublicVersion(Landroid/app/Notification;)Landroid/app/Notification$Builder;" since="21" />
+ <method name="setShowWhen(Z)Landroid/app/Notification$Builder;" since="17" />
+ <method name="setSmallIcon(I)Landroid/app/Notification$Builder;" />
+ <method name="setSmallIcon(II)Landroid/app/Notification$Builder;" />
+ <method name="setSortKey(Ljava/lang/String;)Landroid/app/Notification$Builder;" since="20" />
+ <method name="setSound(Landroid/net/Uri;)Landroid/app/Notification$Builder;" />
+ <method name="setSound(Landroid/net/Uri;I)Landroid/app/Notification$Builder;" />
+ <method name="setSound(Landroid/net/Uri;Landroid/media/AudioAttributes;)Landroid/app/Notification$Builder;" since="21" />
+ <method name="setStyle(Landroid/app/Notification$Style;)Landroid/app/Notification$Builder;" since="16" />
+ <method name="setSubText(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;" since="16" />
+ <method name="setTicker(Ljava/lang/CharSequence;)Landroid/app/Notification$Builder;" />
+ <method name="setTicker(Ljava/lang/CharSequence;Landroid/widget/RemoteViews;)Landroid/app/Notification$Builder;" />
+ <method name="setUsesChronometer(Z)Landroid/app/Notification$Builder;" since="16" />
+ <method name="setVibrate([J)Landroid/app/Notification$Builder;" />
+ <method name="setVisibility(I)Landroid/app/Notification$Builder;" since="21" />
+ <method name="setWhen(J)Landroid/app/Notification$Builder;" />
+ </class>
+ <class name="android/app/Notification$Extender" since="20">
+ <extends name="java/lang/Object" />
+ <method name="extend(Landroid/app/Notification$Builder;)Landroid/app/Notification$Builder;" />
+ </class>
+ <class name="android/app/Notification$InboxStyle" since="16">
+ <extends name="android/app/Notification$Style" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/app/Notification$Builder;)V" />
+ <method name="addLine(Ljava/lang/CharSequence;)Landroid/app/Notification$InboxStyle;" />
+ <method name="setBigContentTitle(Ljava/lang/CharSequence;)Landroid/app/Notification$InboxStyle;" />
+ <method name="setSummaryText(Ljava/lang/CharSequence;)Landroid/app/Notification$InboxStyle;" />
+ </class>
+ <class name="android/app/Notification$MediaStyle" since="21">
+ <extends name="android/app/Notification$Style" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/app/Notification$Builder;)V" />
+ <method name="setMediaSession(Landroid/media/session/MediaSession$Token;)Landroid/app/Notification$MediaStyle;" />
+ <method name="setShowActionsInCompactView([I)Landroid/app/Notification$MediaStyle;" />
+ </class>
+ <class name="android/app/Notification$Style" since="16">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="build()Landroid/app/Notification;" />
+ <method name="checkBuilder()V" />
+ <method name="getStandardView(I)Landroid/widget/RemoteViews;" />
+ <method name="internalSetBigContentTitle(Ljava/lang/CharSequence;)V" />
+ <method name="internalSetSummaryText(Ljava/lang/CharSequence;)V" />
+ <method name="setBuilder(Landroid/app/Notification$Builder;)V" />
+ <field name="mBuilder" />
+ </class>
+ <class name="android/app/Notification$WearableExtender" since="20">
+ <extends name="java/lang/Object" />
+ <implements name="android/app/Notification$Extender" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/app/Notification;)V" />
+ <method name="addAction(Landroid/app/Notification$Action;)Landroid/app/Notification$WearableExtender;" />
+ <method name="addActions(Ljava/util/List;)Landroid/app/Notification$WearableExtender;" />
+ <method name="addPage(Landroid/app/Notification;)Landroid/app/Notification$WearableExtender;" />
+ <method name="addPages(Ljava/util/List;)Landroid/app/Notification$WearableExtender;" />
+ <method name="clearActions()Landroid/app/Notification$WearableExtender;" />
+ <method name="clearPages()Landroid/app/Notification$WearableExtender;" />
+ <method name="clone()Landroid/app/Notification$WearableExtender;" />
+ <method name="getActions()Ljava/util/List;" />
+ <method name="getBackground()Landroid/graphics/Bitmap;" />
+ <method name="getContentAction()I" />
+ <method name="getContentIcon()I" />
+ <method name="getContentIconGravity()I" />
+ <method name="getContentIntentAvailableOffline()Z" />
+ <method name="getCustomContentHeight()I" />
+ <method name="getCustomSizePreset()I" />
+ <method name="getDisplayIntent()Landroid/app/PendingIntent;" />
+ <method name="getGravity()I" />
+ <method name="getHintHideIcon()Z" />
+ <method name="getHintShowBackgroundOnly()Z" />
+ <method name="getPages()Ljava/util/List;" />
+ <method name="getStartScrollBottom()Z" />
+ <method name="setBackground(Landroid/graphics/Bitmap;)Landroid/app/Notification$WearableExtender;" />
+ <method name="setContentAction(I)Landroid/app/Notification$WearableExtender;" />
+ <method name="setContentIcon(I)Landroid/app/Notification$WearableExtender;" />
+ <method name="setContentIconGravity(I)Landroid/app/Notification$WearableExtender;" />
+ <method name="setContentIntentAvailableOffline(Z)Landroid/app/Notification$WearableExtender;" />
+ <method name="setCustomContentHeight(I)Landroid/app/Notification$WearableExtender;" />
+ <method name="setCustomSizePreset(I)Landroid/app/Notification$WearableExtender;" />
+ <method name="setDisplayIntent(Landroid/app/PendingIntent;)Landroid/app/Notification$WearableExtender;" />
+ <method name="setGravity(I)Landroid/app/Notification$WearableExtender;" />
+ <method name="setHintHideIcon(Z)Landroid/app/Notification$WearableExtender;" />
+ <method name="setHintShowBackgroundOnly(Z)Landroid/app/Notification$WearableExtender;" />
+ <method name="setStartScrollBottom(Z)Landroid/app/Notification$WearableExtender;" />
+ <field name="SIZE_DEFAULT" />
+ <field name="SIZE_FULL_SCREEN" />
+ <field name="SIZE_LARGE" />
+ <field name="SIZE_MEDIUM" />
+ <field name="SIZE_SMALL" />
+ <field name="SIZE_XSMALL" />
+ <field name="UNSET_ACTION_INDEX" />
+ </class>
+ <class name="android/app/NotificationManager" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="cancel(I)V" />
+ <method name="cancel(Ljava/lang/String;I)V" since="5" />
+ <method name="cancelAll()V" />
+ <method name="notify(ILandroid/app/Notification;)V" />
+ <method name="notify(Ljava/lang/String;ILandroid/app/Notification;)V" since="5" />
+ </class>
+ <class name="android/app/PendingIntent" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="cancel()V" />
+ <method name="getActivities(Landroid/content/Context;I[Landroid/content/Intent;I)Landroid/app/PendingIntent;" since="11" />
+ <method name="getActivities(Landroid/content/Context;I[Landroid/content/Intent;ILandroid/os/Bundle;)Landroid/app/PendingIntent;" since="16" />
+ <method name="getActivity(Landroid/content/Context;ILandroid/content/Intent;I)Landroid/app/PendingIntent;" />
+ <method name="getActivity(Landroid/content/Context;ILandroid/content/Intent;ILandroid/os/Bundle;)Landroid/app/PendingIntent;" since="16" />
+ <method name="getBroadcast(Landroid/content/Context;ILandroid/content/Intent;I)Landroid/app/PendingIntent;" />
+ <method name="getCreatorPackage()Ljava/lang/String;" since="17" />
+ <method name="getCreatorUid()I" since="17" />
+ <method name="getCreatorUserHandle()Landroid/os/UserHandle;" since="17" />
+ <method name="getIntentSender()Landroid/content/IntentSender;" since="4" />
+ <method name="getService(Landroid/content/Context;ILandroid/content/Intent;I)Landroid/app/PendingIntent;" />
+ <method name="getTargetPackage()Ljava/lang/String;" />
+ <method name="readPendingIntentOrNullFromParcel(Landroid/os/Parcel;)Landroid/app/PendingIntent;" />
+ <method name="send()V" />
+ <method name="send(I)V" />
+ <method name="send(ILandroid/app/PendingIntent$OnFinished;Landroid/os/Handler;)V" />
+ <method name="send(Landroid/content/Context;ILandroid/content/Intent;)V" />
+ <method name="send(Landroid/content/Context;ILandroid/content/Intent;Landroid/app/PendingIntent$OnFinished;Landroid/os/Handler;)V" />
+ <method name="send(Landroid/content/Context;ILandroid/content/Intent;Landroid/app/PendingIntent$OnFinished;Landroid/os/Handler;Ljava/lang/String;)V" since="14" />
+ <method name="writePendingIntentOrNullToParcel(Landroid/app/PendingIntent;Landroid/os/Parcel;)V" />
+ <field name="CREATOR" />
+ <field name="FLAG_CANCEL_CURRENT" />
+ <field name="FLAG_NO_CREATE" />
+ <field name="FLAG_ONE_SHOT" />
+ <field name="FLAG_UPDATE_CURRENT" since="3" />
+ </class>
+ <class name="android/app/PendingIntent$CanceledException" since="1">
+ <extends name="android/util/AndroidException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/Exception;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/app/PendingIntent$OnFinished" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onSendFinished(Landroid/app/PendingIntent;Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;)V" />
+ </class>
+ <class name="android/app/Presentation" since="17">
+ <extends name="android/app/Dialog" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/Display;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/Display;I)V" />
+ <method name="getDisplay()Landroid/view/Display;" />
+ <method name="getResources()Landroid/content/res/Resources;" />
+ <method name="onDisplayChanged()V" />
+ <method name="onDisplayRemoved()V" />
+ </class>
+ <class name="android/app/ProgressDialog" since="1">
+ <extends name="android/app/AlertDialog" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;I)V" />
+ <method name="getMax()I" />
+ <method name="getProgress()I" />
+ <method name="getSecondaryProgress()I" />
+ <method name="incrementProgressBy(I)V" />
+ <method name="incrementSecondaryProgressBy(I)V" />
+ <method name="isIndeterminate()Z" />
+ <method name="setIndeterminate(Z)V" />
+ <method name="setIndeterminateDrawable(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setMax(I)V" />
+ <method name="setProgress(I)V" />
+ <method name="setProgressDrawable(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setProgressNumberFormat(Ljava/lang/String;)V" since="11" />
+ <method name="setProgressPercentFormat(Ljava/text/NumberFormat;)V" since="11" />
+ <method name="setProgressStyle(I)V" />
+ <method name="setSecondaryProgress(I)V" />
+ <method name="show(Landroid/content/Context;Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Landroid/app/ProgressDialog;" />
+ <method name="show(Landroid/content/Context;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Z)Landroid/app/ProgressDialog;" />
+ <method name="show(Landroid/content/Context;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZZ)Landroid/app/ProgressDialog;" />
+ <method name="show(Landroid/content/Context;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZZLandroid/content/DialogInterface$OnCancelListener;)Landroid/app/ProgressDialog;" />
+ <field name="STYLE_HORIZONTAL" />
+ <field name="STYLE_SPINNER" />
+ </class>
+ <class name="android/app/RemoteInput" since="20">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="addResultsToIntent([Landroid/app/RemoteInput;Landroid/content/Intent;Landroid/os/Bundle;)V" />
+ <method name="getAllowFreeFormInput()Z" />
+ <method name="getChoices()[Ljava/lang/CharSequence;" />
+ <method name="getExtras()Landroid/os/Bundle;" />
+ <method name="getLabel()Ljava/lang/CharSequence;" />
+ <method name="getResultKey()Ljava/lang/String;" />
+ <method name="getResultsFromIntent(Landroid/content/Intent;)Landroid/os/Bundle;" />
+ <field name="CREATOR" />
+ <field name="EXTRA_RESULTS_DATA" />
+ <field name="RESULTS_CLIP_LABEL" />
+ </class>
+ <class name="android/app/RemoteInput$Builder" since="20">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="addExtras(Landroid/os/Bundle;)Landroid/app/RemoteInput$Builder;" />
+ <method name="build()Landroid/app/RemoteInput;" />
+ <method name="getExtras()Landroid/os/Bundle;" />
+ <method name="setAllowFreeFormInput(Z)Landroid/app/RemoteInput$Builder;" />
+ <method name="setChoices([Ljava/lang/CharSequence;)Landroid/app/RemoteInput$Builder;" />
+ <method name="setLabel(Ljava/lang/CharSequence;)Landroid/app/RemoteInput$Builder;" />
+ </class>
+ <class name="android/app/SearchManager" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/content/DialogInterface$OnCancelListener" />
+ <implements name="android/content/DialogInterface$OnDismissListener" />
+ <method name="&lt;init>()V" />
+ <method name="getGlobalSearchActivity()Landroid/content/ComponentName;" since="16" />
+ <method name="getSearchableInfo(Landroid/content/ComponentName;)Landroid/app/SearchableInfo;" since="8" />
+ <method name="getSearchablesInGlobalSearch()Ljava/util/List;" since="8" />
+ <method name="setOnCancelListener(Landroid/app/SearchManager$OnCancelListener;)V" />
+ <method name="setOnDismissListener(Landroid/app/SearchManager$OnDismissListener;)V" />
+ <method name="startSearch(Ljava/lang/String;ZLandroid/content/ComponentName;Landroid/os/Bundle;Z)V" />
+ <method name="stopSearch()V" />
+ <method name="triggerSearch(Ljava/lang/String;Landroid/content/ComponentName;Landroid/os/Bundle;)V" since="5" />
+ <field name="ACTION_KEY" />
+ <field name="ACTION_MSG" />
+ <field name="APP_DATA" />
+ <field name="CURSOR_EXTRA_KEY_IN_PROGRESS" since="8" />
+ <field name="EXTRA_DATA_KEY" since="4" />
+ <field name="EXTRA_NEW_SEARCH" since="12" />
+ <field name="EXTRA_SELECT_QUERY" since="8" />
+ <field name="EXTRA_WEB_SEARCH_PENDINGINTENT" since="14" />
+ <field name="FLAG_QUERY_REFINEMENT" since="11" />
+ <field name="INTENT_ACTION_GLOBAL_SEARCH" since="8" />
+ <field name="INTENT_ACTION_SEARCHABLES_CHANGED" since="4" />
+ <field name="INTENT_ACTION_SEARCH_SETTINGS" since="8" />
+ <field name="INTENT_ACTION_SEARCH_SETTINGS_CHANGED" since="4" />
+ <field name="INTENT_ACTION_WEB_SEARCH_SETTINGS" since="4" />
+ <field name="INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED" since="16" />
+ <field name="MENU_KEY" />
+ <field name="MENU_KEYCODE" />
+ <field name="QUERY" />
+ <field name="SHORTCUT_MIME_TYPE" since="4" />
+ <field name="SUGGEST_COLUMN_AUDIO_CHANNEL_CONFIG" since="21" />
+ <field name="SUGGEST_COLUMN_CONTENT_TYPE" since="21" />
+ <field name="SUGGEST_COLUMN_DURATION" since="21" />
+ <field name="SUGGEST_COLUMN_FLAGS" since="11" />
+ <field name="SUGGEST_COLUMN_FORMAT" />
+ <field name="SUGGEST_COLUMN_ICON_1" />
+ <field name="SUGGEST_COLUMN_ICON_2" />
+ <field name="SUGGEST_COLUMN_INTENT_ACTION" />
+ <field name="SUGGEST_COLUMN_INTENT_DATA" />
+ <field name="SUGGEST_COLUMN_INTENT_DATA_ID" />
+ <field name="SUGGEST_COLUMN_INTENT_EXTRA_DATA" since="4" />
+ <field name="SUGGEST_COLUMN_IS_LIVE" since="21" />
+ <field name="SUGGEST_COLUMN_LAST_ACCESS_HINT" since="14" />
+ <field name="SUGGEST_COLUMN_PRODUCTION_YEAR" since="21" />
+ <field name="SUGGEST_COLUMN_PURCHASE_PRICE" since="21" />
+ <field name="SUGGEST_COLUMN_QUERY" />
+ <field name="SUGGEST_COLUMN_RATING_SCORE" since="21" />
+ <field name="SUGGEST_COLUMN_RATING_STYLE" since="21" />
+ <field name="SUGGEST_COLUMN_RENTAL_PRICE" since="21" />
+ <field name="SUGGEST_COLUMN_RESULT_CARD_IMAGE" since="21" />
+ <field name="SUGGEST_COLUMN_SHORTCUT_ID" since="4" />
+ <field name="SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING" since="4" />
+ <field name="SUGGEST_COLUMN_TEXT_1" />
+ <field name="SUGGEST_COLUMN_TEXT_2" />
+ <field name="SUGGEST_COLUMN_TEXT_2_URL" since="8" />
+ <field name="SUGGEST_COLUMN_VIDEO_HEIGHT" since="21" />
+ <field name="SUGGEST_COLUMN_VIDEO_WIDTH" since="21" />
+ <field name="SUGGEST_MIME_TYPE" />
+ <field name="SUGGEST_NEVER_MAKE_SHORTCUT" since="4" />
+ <field name="SUGGEST_PARAMETER_LIMIT" since="5" />
+ <field name="SUGGEST_URI_PATH_QUERY" />
+ <field name="SUGGEST_URI_PATH_SHORTCUT" since="4" />
+ <field name="USER_QUERY" since="4" />
+ </class>
+ <class name="android/app/SearchManager$OnCancelListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onCancel()V" />
+ </class>
+ <class name="android/app/SearchManager$OnDismissListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onDismiss()V" />
+ </class>
+ <class name="android/app/SearchableInfo" since="8">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="autoUrlDetect()Z" />
+ <method name="getHintId()I" />
+ <method name="getImeOptions()I" />
+ <method name="getInputType()I" />
+ <method name="getSearchActivity()Landroid/content/ComponentName;" />
+ <method name="getSettingsDescriptionId()I" />
+ <method name="getSuggestAuthority()Ljava/lang/String;" />
+ <method name="getSuggestIntentAction()Ljava/lang/String;" />
+ <method name="getSuggestIntentData()Ljava/lang/String;" />
+ <method name="getSuggestPackage()Ljava/lang/String;" />
+ <method name="getSuggestPath()Ljava/lang/String;" />
+ <method name="getSuggestSelection()Ljava/lang/String;" />
+ <method name="getSuggestThreshold()I" />
+ <method name="getVoiceLanguageId()I" />
+ <method name="getVoiceLanguageModeId()I" />
+ <method name="getVoiceMaxResults()I" />
+ <method name="getVoicePromptTextId()I" />
+ <method name="getVoiceSearchEnabled()Z" />
+ <method name="getVoiceSearchLaunchRecognizer()Z" />
+ <method name="getVoiceSearchLaunchWebSearch()Z" />
+ <method name="queryAfterZeroResults()Z" />
+ <method name="shouldIncludeInGlobalSearch()Z" />
+ <method name="shouldRewriteQueryFromData()Z" />
+ <method name="shouldRewriteQueryFromText()Z" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/app/Service" since="1">
+ <extends name="android/content/ContextWrapper" />
+ <implements name="android/content/ComponentCallbacks" />
+ <implements name="android/content/ComponentCallbacks2" since="14" />
+ <method name="&lt;init>()V" />
+ <method name="dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V" />
+ <method name="getApplication()Landroid/app/Application;" />
+ <method name="onBind(Landroid/content/Intent;)Landroid/os/IBinder;" />
+ <method name="onCreate()V" />
+ <method name="onDestroy()V" />
+ <method name="onRebind(Landroid/content/Intent;)V" />
+ <method name="onStart(Landroid/content/Intent;I)V" />
+ <method name="onStartCommand(Landroid/content/Intent;II)I" since="5" />
+ <method name="onTaskRemoved(Landroid/content/Intent;)V" since="14" />
+ <method name="onUnbind(Landroid/content/Intent;)Z" />
+ <method name="setForeground(Z)V" />
+ <method name="startForeground(ILandroid/app/Notification;)V" since="5" />
+ <method name="stopForeground(Z)V" since="5" />
+ <method name="stopSelf()V" />
+ <method name="stopSelf(I)V" />
+ <method name="stopSelfResult(I)Z" />
+ <field name="START_CONTINUATION_MASK" since="5" />
+ <field name="START_FLAG_REDELIVERY" since="5" />
+ <field name="START_FLAG_RETRY" since="5" />
+ <field name="START_NOT_STICKY" since="5" />
+ <field name="START_REDELIVER_INTENT" since="5" />
+ <field name="START_STICKY" since="5" />
+ <field name="START_STICKY_COMPATIBILITY" since="5" />
+ </class>
+ <class name="android/app/SharedElementCallback" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onCaptureSharedElementSnapshot(Landroid/view/View;Landroid/graphics/Matrix;Landroid/graphics/RectF;)Landroid/os/Parcelable;" />
+ <method name="onCreateSnapshotView(Landroid/content/Context;Landroid/os/Parcelable;)Landroid/view/View;" />
+ <method name="onMapSharedElements(Ljava/util/List;Ljava/util/Map;)V" />
+ <method name="onRejectSharedElements(Ljava/util/List;)V" />
+ <method name="onSharedElementEnd(Ljava/util/List;Ljava/util/List;Ljava/util/List;)V" />
+ <method name="onSharedElementStart(Ljava/util/List;Ljava/util/List;Ljava/util/List;)V" />
+ </class>
+ <class name="android/app/TabActivity" since="1">
+ <extends name="android/app/ActivityGroup" />
+ <method name="&lt;init>()V" />
+ <method name="getTabHost()Landroid/widget/TabHost;" />
+ <method name="getTabWidget()Landroid/widget/TabWidget;" />
+ <method name="setDefaultTab(I)V" />
+ <method name="setDefaultTab(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/app/TaskStackBuilder" since="16">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addNextIntent(Landroid/content/Intent;)Landroid/app/TaskStackBuilder;" />
+ <method name="addNextIntentWithParentStack(Landroid/content/Intent;)Landroid/app/TaskStackBuilder;" />
+ <method name="addParentStack(Landroid/app/Activity;)Landroid/app/TaskStackBuilder;" />
+ <method name="addParentStack(Landroid/content/ComponentName;)Landroid/app/TaskStackBuilder;" />
+ <method name="addParentStack(Ljava/lang/Class;)Landroid/app/TaskStackBuilder;" />
+ <method name="create(Landroid/content/Context;)Landroid/app/TaskStackBuilder;" />
+ <method name="editIntentAt(I)Landroid/content/Intent;" />
+ <method name="getIntentCount()I" />
+ <method name="getIntents()[Landroid/content/Intent;" />
+ <method name="getPendingIntent(II)Landroid/app/PendingIntent;" />
+ <method name="getPendingIntent(IILandroid/os/Bundle;)Landroid/app/PendingIntent;" />
+ <method name="startActivities()V" />
+ <method name="startActivities(Landroid/os/Bundle;)V" />
+ </class>
+ <class name="android/app/TimePickerDialog" since="1">
+ <extends name="android/app/AlertDialog" />
+ <implements name="android/content/DialogInterface$OnClickListener" />
+ <implements name="android/widget/TimePicker$OnTimeChangedListener" />
+ <method name="&lt;init>(Landroid/content/Context;ILandroid/app/TimePickerDialog$OnTimeSetListener;IIZ)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/app/TimePickerDialog$OnTimeSetListener;IIZ)V" />
+ <method name="updateTime(II)V" />
+ </class>
+ <class name="android/app/TimePickerDialog$OnTimeSetListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onTimeSet(Landroid/widget/TimePicker;II)V" />
+ </class>
+ <class name="android/app/UiAutomation" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="clearWindowAnimationFrameStats()V" since="21" />
+ <method name="clearWindowContentFrameStats(I)Z" since="21" />
+ <method name="executeAndWaitForEvent(Ljava/lang/Runnable;Landroid/app/UiAutomation$AccessibilityEventFilter;J)Landroid/view/accessibility/AccessibilityEvent;" />
+ <method name="executeShellCommand(Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;" since="21" />
+ <method name="findFocus(I)Landroid/view/accessibility/AccessibilityNodeInfo;" since="21" />
+ <method name="getRootInActiveWindow()Landroid/view/accessibility/AccessibilityNodeInfo;" />
+ <method name="getServiceInfo()Landroid/accessibilityservice/AccessibilityServiceInfo;" />
+ <method name="getWindowAnimationFrameStats()Landroid/view/WindowAnimationFrameStats;" since="21" />
+ <method name="getWindowContentFrameStats(I)Landroid/view/WindowContentFrameStats;" since="21" />
+ <method name="getWindows()Ljava/util/List;" since="21" />
+ <method name="injectInputEvent(Landroid/view/InputEvent;Z)Z" />
+ <method name="performGlobalAction(I)Z" />
+ <method name="setOnAccessibilityEventListener(Landroid/app/UiAutomation$OnAccessibilityEventListener;)V" />
+ <method name="setRotation(I)Z" />
+ <method name="setRunAsMonkey(Z)V" />
+ <method name="setServiceInfo(Landroid/accessibilityservice/AccessibilityServiceInfo;)V" />
+ <method name="takeScreenshot()Landroid/graphics/Bitmap;" />
+ <method name="waitForIdle(JJ)V" />
+ <field name="ROTATION_FREEZE_0" />
+ <field name="ROTATION_FREEZE_180" />
+ <field name="ROTATION_FREEZE_270" />
+ <field name="ROTATION_FREEZE_90" />
+ <field name="ROTATION_FREEZE_CURRENT" />
+ <field name="ROTATION_UNFREEZE" />
+ </class>
+ <class name="android/app/UiAutomation$AccessibilityEventFilter" since="18">
+ <extends name="java/lang/Object" />
+ <method name="accept(Landroid/view/accessibility/AccessibilityEvent;)Z" />
+ </class>
+ <class name="android/app/UiAutomation$OnAccessibilityEventListener" since="18">
+ <extends name="java/lang/Object" />
+ <method name="onAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V" />
+ </class>
+ <class name="android/app/UiModeManager" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="disableCarMode(I)V" />
+ <method name="enableCarMode(I)V" />
+ <method name="getCurrentModeType()I" />
+ <method name="getNightMode()I" />
+ <method name="setNightMode(I)V" />
+ <field name="ACTION_ENTER_CAR_MODE" />
+ <field name="ACTION_ENTER_DESK_MODE" />
+ <field name="ACTION_EXIT_CAR_MODE" />
+ <field name="ACTION_EXIT_DESK_MODE" />
+ <field name="DISABLE_CAR_MODE_GO_HOME" />
+ <field name="ENABLE_CAR_MODE_ALLOW_SLEEP" since="21" />
+ <field name="ENABLE_CAR_MODE_GO_CAR_HOME" />
+ <field name="MODE_NIGHT_AUTO" />
+ <field name="MODE_NIGHT_NO" />
+ <field name="MODE_NIGHT_YES" />
+ </class>
+ <class name="android/app/WallpaperInfo" since="7">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/content/pm/ResolveInfo;)V" />
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V" />
+ <method name="getComponent()Landroid/content/ComponentName;" />
+ <method name="getPackageName()Ljava/lang/String;" />
+ <method name="getServiceInfo()Landroid/content/pm/ServiceInfo;" />
+ <method name="getServiceName()Ljava/lang/String;" />
+ <method name="getSettingsActivity()Ljava/lang/String;" />
+ <method name="loadAuthor(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;" />
+ <method name="loadDescription(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;" />
+ <method name="loadIcon(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;" />
+ <method name="loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;" />
+ <method name="loadThumbnail(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/app/WallpaperManager" since="5">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="clear()V" />
+ <method name="clearWallpaperOffsets(Landroid/os/IBinder;)V" />
+ <method name="forgetLoadedWallpaper()V" since="14" />
+ <method name="getBuiltInDrawable()Landroid/graphics/drawable/Drawable;" since="19" />
+ <method name="getBuiltInDrawable(IIZFF)Landroid/graphics/drawable/Drawable;" since="19" />
+ <method name="getCropAndSetWallpaperIntent(Landroid/net/Uri;)Landroid/content/Intent;" since="19" />
+ <method name="getDesiredMinimumHeight()I" />
+ <method name="getDesiredMinimumWidth()I" />
+ <method name="getDrawable()Landroid/graphics/drawable/Drawable;" />
+ <method name="getFastDrawable()Landroid/graphics/drawable/Drawable;" />
+ <method name="getInstance(Landroid/content/Context;)Landroid/app/WallpaperManager;" />
+ <method name="getWallpaperInfo()Landroid/app/WallpaperInfo;" since="7" />
+ <method name="hasResourceWallpaper(I)Z" since="17" />
+ <method name="peekDrawable()Landroid/graphics/drawable/Drawable;" />
+ <method name="peekFastDrawable()Landroid/graphics/drawable/Drawable;" />
+ <method name="sendWallpaperCommand(Landroid/os/IBinder;Ljava/lang/String;IIILandroid/os/Bundle;)V" since="7" />
+ <method name="setBitmap(Landroid/graphics/Bitmap;)V" />
+ <method name="setResource(I)V" />
+ <method name="setStream(Ljava/io/InputStream;)V" />
+ <method name="setWallpaperOffsetSteps(FF)V" since="7" />
+ <method name="setWallpaperOffsets(Landroid/os/IBinder;FF)V" />
+ <method name="suggestDesiredDimensions(II)V" />
+ <field name="ACTION_CHANGE_LIVE_WALLPAPER" since="16" />
+ <field name="ACTION_CROP_AND_SET_WALLPAPER" since="19" />
+ <field name="ACTION_LIVE_WALLPAPER_CHOOSER" since="7" />
+ <field name="COMMAND_DROP" since="7" />
+ <field name="COMMAND_SECONDARY_TAP" since="11" />
+ <field name="COMMAND_TAP" since="7" />
+ <field name="EXTRA_LIVE_WALLPAPER_COMPONENT" since="16" />
+ <field name="WALLPAPER_PREVIEW_META_DATA" since="11" />
+ </class>
+ <class name="android/app/admin/DeviceAdminInfo" since="8">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/content/pm/ResolveInfo;)V" />
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V" />
+ <method name="getActivityInfo()Landroid/content/pm/ActivityInfo;" />
+ <method name="getComponent()Landroid/content/ComponentName;" />
+ <method name="getPackageName()Ljava/lang/String;" />
+ <method name="getReceiverName()Ljava/lang/String;" />
+ <method name="getTagForPolicy(I)Ljava/lang/String;" />
+ <method name="isVisible()Z" />
+ <method name="loadDescription(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;" />
+ <method name="loadIcon(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;" />
+ <method name="loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;" />
+ <method name="usesPolicy(I)Z" />
+ <field name="CREATOR" />
+ <field name="USES_ENCRYPTED_STORAGE" since="11" />
+ <field name="USES_POLICY_DISABLE_CAMERA" since="14" />
+ <field name="USES_POLICY_DISABLE_KEYGUARD_FEATURES" since="17" />
+ <field name="USES_POLICY_EXPIRE_PASSWORD" since="11" />
+ <field name="USES_POLICY_FORCE_LOCK" />
+ <field name="USES_POLICY_LIMIT_PASSWORD" />
+ <field name="USES_POLICY_RESET_PASSWORD" />
+ <field name="USES_POLICY_WATCH_LOGIN" />
+ <field name="USES_POLICY_WIPE_DATA" />
+ </class>
+ <class name="android/app/admin/DeviceAdminReceiver" since="8">
+ <extends name="android/content/BroadcastReceiver" />
+ <method name="&lt;init>()V" />
+ <method name="getManager(Landroid/content/Context;)Landroid/app/admin/DevicePolicyManager;" />
+ <method name="getWho(Landroid/content/Context;)Landroid/content/ComponentName;" />
+ <method name="onDisableRequested(Landroid/content/Context;Landroid/content/Intent;)Ljava/lang/CharSequence;" />
+ <method name="onDisabled(Landroid/content/Context;Landroid/content/Intent;)V" />
+ <method name="onEnabled(Landroid/content/Context;Landroid/content/Intent;)V" />
+ <method name="onLockTaskModeEntering(Landroid/content/Context;Landroid/content/Intent;Ljava/lang/String;)V" since="21" />
+ <method name="onLockTaskModeExiting(Landroid/content/Context;Landroid/content/Intent;)V" since="21" />
+ <method name="onPasswordChanged(Landroid/content/Context;Landroid/content/Intent;)V" />
+ <method name="onPasswordExpiring(Landroid/content/Context;Landroid/content/Intent;)V" since="11" />
+ <method name="onPasswordFailed(Landroid/content/Context;Landroid/content/Intent;)V" />
+ <method name="onPasswordSucceeded(Landroid/content/Context;Landroid/content/Intent;)V" />
+ <method name="onProfileProvisioningComplete(Landroid/content/Context;Landroid/content/Intent;)V" since="21" />
+ <field name="ACTION_DEVICE_ADMIN_DISABLED" />
+ <field name="ACTION_DEVICE_ADMIN_DISABLE_REQUESTED" />
+ <field name="ACTION_DEVICE_ADMIN_ENABLED" />
+ <field name="ACTION_LOCK_TASK_ENTERING" since="21" />
+ <field name="ACTION_LOCK_TASK_EXITING" since="21" />
+ <field name="ACTION_PASSWORD_CHANGED" />
+ <field name="ACTION_PASSWORD_EXPIRING" since="11" />
+ <field name="ACTION_PASSWORD_FAILED" />
+ <field name="ACTION_PASSWORD_SUCCEEDED" />
+ <field name="ACTION_PROFILE_PROVISIONING_COMPLETE" since="21" />
+ <field name="DEVICE_ADMIN_META_DATA" />
+ <field name="EXTRA_DISABLE_WARNING" />
+ <field name="EXTRA_LOCK_TASK_PACKAGE" since="21" />
+ </class>
+ <class name="android/app/admin/DevicePolicyManager" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addCrossProfileIntentFilter(Landroid/content/ComponentName;Landroid/content/IntentFilter;I)V" since="21" />
+ <method name="addCrossProfileWidgetProvider(Landroid/content/ComponentName;Ljava/lang/String;)Z" since="21" />
+ <method name="addPersistentPreferredActivity(Landroid/content/ComponentName;Landroid/content/IntentFilter;Landroid/content/ComponentName;)V" since="21" />
+ <method name="addUserRestriction(Landroid/content/ComponentName;Ljava/lang/String;)V" since="21" />
+ <method name="clearCrossProfileIntentFilters(Landroid/content/ComponentName;)V" since="21" />
+ <method name="clearDeviceOwnerApp(Ljava/lang/String;)V" since="21" />
+ <method name="clearPackagePersistentPreferredActivities(Landroid/content/ComponentName;Ljava/lang/String;)V" since="21" />
+ <method name="clearUserRestriction(Landroid/content/ComponentName;Ljava/lang/String;)V" since="21" />
+ <method name="createAndInitializeUser(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;Landroid/content/ComponentName;Landroid/os/Bundle;)Landroid/os/UserHandle;" since="21" />
+ <method name="createUser(Landroid/content/ComponentName;Ljava/lang/String;)Landroid/os/UserHandle;" since="21" />
+ <method name="enableSystemApp(Landroid/content/ComponentName;Landroid/content/Intent;)I" since="21" />
+ <method name="enableSystemApp(Landroid/content/ComponentName;Ljava/lang/String;)V" since="21" />
+ <method name="getAccountTypesWithManagementDisabled()[Ljava/lang/String;" since="21" />
+ <method name="getActiveAdmins()Ljava/util/List;" />
+ <method name="getApplicationRestrictions(Landroid/content/ComponentName;Ljava/lang/String;)Landroid/os/Bundle;" since="21" />
+ <method name="getAutoTimeRequired()Z" since="21" />
+ <method name="getCameraDisabled(Landroid/content/ComponentName;)Z" since="14" />
+ <method name="getCrossProfileCallerIdDisabled(Landroid/content/ComponentName;)Z" since="21" />
+ <method name="getCrossProfileWidgetProviders(Landroid/content/ComponentName;)Ljava/util/List;" since="21" />
+ <method name="getCurrentFailedPasswordAttempts()I" />
+ <method name="getInstalledCaCerts(Landroid/content/ComponentName;)Ljava/util/List;" since="21" />
+ <method name="getKeyguardDisabledFeatures(Landroid/content/ComponentName;)I" since="17" />
+ <method name="getMaximumFailedPasswordsForWipe(Landroid/content/ComponentName;)I" />
+ <method name="getMaximumTimeToLock(Landroid/content/ComponentName;)J" />
+ <method name="getPasswordExpiration(Landroid/content/ComponentName;)J" since="11" />
+ <method name="getPasswordExpirationTimeout(Landroid/content/ComponentName;)J" since="11" />
+ <method name="getPasswordHistoryLength(Landroid/content/ComponentName;)I" since="11" />
+ <method name="getPasswordMaximumLength(I)I" />
+ <method name="getPasswordMinimumLength(Landroid/content/ComponentName;)I" />
+ <method name="getPasswordMinimumLetters(Landroid/content/ComponentName;)I" since="11" />
+ <method name="getPasswordMinimumLowerCase(Landroid/content/ComponentName;)I" since="11" />
+ <method name="getPasswordMinimumNonLetter(Landroid/content/ComponentName;)I" since="11" />
+ <method name="getPasswordMinimumNumeric(Landroid/content/ComponentName;)I" since="11" />
+ <method name="getPasswordMinimumSymbols(Landroid/content/ComponentName;)I" since="11" />
+ <method name="getPasswordMinimumUpperCase(Landroid/content/ComponentName;)I" since="11" />
+ <method name="getPasswordQuality(Landroid/content/ComponentName;)I" />
+ <method name="getPermittedAccessibilityServices(Landroid/content/ComponentName;)Ljava/util/List;" since="21" />
+ <method name="getPermittedInputMethods(Landroid/content/ComponentName;)Ljava/util/List;" since="21" />
+ <method name="getScreenCaptureDisabled(Landroid/content/ComponentName;)Z" since="21" />
+ <method name="getStorageEncryption(Landroid/content/ComponentName;)Z" since="11" />
+ <method name="getStorageEncryptionStatus()I" since="11" />
+ <method name="hasCaCertInstalled(Landroid/content/ComponentName;[B)Z" since="21" />
+ <method name="hasGrantedPolicy(Landroid/content/ComponentName;I)Z" since="11" />
+ <method name="installCaCert(Landroid/content/ComponentName;[B)Z" since="21" />
+ <method name="installKeyPair(Landroid/content/ComponentName;Ljava/security/PrivateKey;Ljava/security/cert/Certificate;Ljava/lang/String;)Z" since="21" />
+ <method name="isActivePasswordSufficient()Z" />
+ <method name="isAdminActive(Landroid/content/ComponentName;)Z" />
+ <method name="isApplicationHidden(Landroid/content/ComponentName;Ljava/lang/String;)Z" since="21" />
+ <method name="isDeviceOwnerApp(Ljava/lang/String;)Z" since="18" />
+ <method name="isLockTaskPermitted(Ljava/lang/String;)Z" since="21" />
+ <method name="isMasterVolumeMuted(Landroid/content/ComponentName;)Z" since="21" />
+ <method name="isProfileOwnerApp(Ljava/lang/String;)Z" since="21" />
+ <method name="isUninstallBlocked(Landroid/content/ComponentName;Ljava/lang/String;)Z" since="21" />
+ <method name="lockNow()V" />
+ <method name="removeActiveAdmin(Landroid/content/ComponentName;)V" />
+ <method name="removeCrossProfileWidgetProvider(Landroid/content/ComponentName;Ljava/lang/String;)Z" since="21" />
+ <method name="removeUser(Landroid/content/ComponentName;Landroid/os/UserHandle;)Z" since="21" />
+ <method name="resetPassword(Ljava/lang/String;I)Z" />
+ <method name="setAccountManagementDisabled(Landroid/content/ComponentName;Ljava/lang/String;Z)V" since="21" />
+ <method name="setApplicationHidden(Landroid/content/ComponentName;Ljava/lang/String;Z)Z" since="21" />
+ <method name="setApplicationRestrictions(Landroid/content/ComponentName;Ljava/lang/String;Landroid/os/Bundle;)V" since="21" />
+ <method name="setAutoTimeRequired(Landroid/content/ComponentName;Z)V" since="21" />
+ <method name="setCameraDisabled(Landroid/content/ComponentName;Z)V" since="14" />
+ <method name="setCrossProfileCallerIdDisabled(Landroid/content/ComponentName;Z)V" since="21" />
+ <method name="setGlobalSetting(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;)V" since="21" />
+ <method name="setKeyguardDisabledFeatures(Landroid/content/ComponentName;I)V" since="17" />
+ <method name="setLockTaskPackages(Landroid/content/ComponentName;[Ljava/lang/String;)V" since="21" />
+ <method name="setMasterVolumeMuted(Landroid/content/ComponentName;Z)V" since="21" />
+ <method name="setMaximumFailedPasswordsForWipe(Landroid/content/ComponentName;I)V" />
+ <method name="setMaximumTimeToLock(Landroid/content/ComponentName;J)V" />
+ <method name="setPasswordExpirationTimeout(Landroid/content/ComponentName;J)V" since="11" />
+ <method name="setPasswordHistoryLength(Landroid/content/ComponentName;I)V" since="11" />
+ <method name="setPasswordMinimumLength(Landroid/content/ComponentName;I)V" />
+ <method name="setPasswordMinimumLetters(Landroid/content/ComponentName;I)V" since="11" />
+ <method name="setPasswordMinimumLowerCase(Landroid/content/ComponentName;I)V" since="11" />
+ <method name="setPasswordMinimumNonLetter(Landroid/content/ComponentName;I)V" since="11" />
+ <method name="setPasswordMinimumNumeric(Landroid/content/ComponentName;I)V" since="11" />
+ <method name="setPasswordMinimumSymbols(Landroid/content/ComponentName;I)V" since="11" />
+ <method name="setPasswordMinimumUpperCase(Landroid/content/ComponentName;I)V" since="11" />
+ <method name="setPasswordQuality(Landroid/content/ComponentName;I)V" />
+ <method name="setPermittedAccessibilityServices(Landroid/content/ComponentName;Ljava/util/List;)Z" since="21" />
+ <method name="setPermittedInputMethods(Landroid/content/ComponentName;Ljava/util/List;)Z" since="21" />
+ <method name="setProfileEnabled(Landroid/content/ComponentName;)V" since="21" />
+ <method name="setProfileName(Landroid/content/ComponentName;Ljava/lang/String;)V" since="21" />
+ <method name="setRecommendedGlobalProxy(Landroid/content/ComponentName;Landroid/net/ProxyInfo;)V" since="21" />
+ <method name="setRestrictionsProvider(Landroid/content/ComponentName;Landroid/content/ComponentName;)V" since="21" />
+ <method name="setScreenCaptureDisabled(Landroid/content/ComponentName;Z)V" since="21" />
+ <method name="setSecureSetting(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;)V" since="21" />
+ <method name="setStorageEncryption(Landroid/content/ComponentName;Z)I" since="11" />
+ <method name="setUninstallBlocked(Landroid/content/ComponentName;Ljava/lang/String;Z)V" since="21" />
+ <method name="switchUser(Landroid/content/ComponentName;Landroid/os/UserHandle;)Z" since="21" />
+ <method name="uninstallAllUserCaCerts(Landroid/content/ComponentName;)V" since="21" />
+ <method name="uninstallCaCert(Landroid/content/ComponentName;[B)V" since="21" />
+ <method name="wipeData(I)V" />
+ <field name="ACTION_ADD_DEVICE_ADMIN" />
+ <field name="ACTION_PROVISION_MANAGED_PROFILE" since="21" />
+ <field name="ACTION_SET_NEW_PASSWORD" />
+ <field name="ACTION_START_ENCRYPTION" since="11" />
+ <field name="ENCRYPTION_STATUS_ACTIVATING" since="11" />
+ <field name="ENCRYPTION_STATUS_ACTIVE" since="11" />
+ <field name="ENCRYPTION_STATUS_INACTIVE" since="11" />
+ <field name="ENCRYPTION_STATUS_UNSUPPORTED" since="11" />
+ <field name="EXTRA_ADD_EXPLANATION" />
+ <field name="EXTRA_DEVICE_ADMIN" />
+ <field name="EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE" since="21" />
+ <field name="EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM" since="21" />
+ <field name="EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER" since="21" />
+ <field name="EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION" since="21" />
+ <field name="EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME" since="21" />
+ <field name="EXTRA_PROVISIONING_EMAIL_ADDRESS" since="21" />
+ <field name="EXTRA_PROVISIONING_LOCALE" since="21" />
+ <field name="EXTRA_PROVISIONING_LOCAL_TIME" since="21" />
+ <field name="EXTRA_PROVISIONING_TIME_ZONE" since="21" />
+ <field name="EXTRA_PROVISIONING_WIFI_HIDDEN" since="21" />
+ <field name="EXTRA_PROVISIONING_WIFI_PAC_URL" since="21" />
+ <field name="EXTRA_PROVISIONING_WIFI_PASSWORD" since="21" />
+ <field name="EXTRA_PROVISIONING_WIFI_PROXY_BYPASS" since="21" />
+ <field name="EXTRA_PROVISIONING_WIFI_PROXY_HOST" since="21" />
+ <field name="EXTRA_PROVISIONING_WIFI_PROXY_PORT" since="21" />
+ <field name="EXTRA_PROVISIONING_WIFI_SECURITY_TYPE" since="21" />
+ <field name="EXTRA_PROVISIONING_WIFI_SSID" since="21" />
+ <field name="FLAG_MANAGED_CAN_ACCESS_PARENT" since="21" />
+ <field name="FLAG_PARENT_CAN_ACCESS_MANAGED" since="21" />
+ <field name="KEYGUARD_DISABLE_FEATURES_ALL" since="17" />
+ <field name="KEYGUARD_DISABLE_FEATURES_NONE" since="17" />
+ <field name="KEYGUARD_DISABLE_FINGERPRINT" since="21" />
+ <field name="KEYGUARD_DISABLE_SECURE_CAMERA" since="17" />
+ <field name="KEYGUARD_DISABLE_SECURE_NOTIFICATIONS" since="21" />
+ <field name="KEYGUARD_DISABLE_TRUST_AGENTS" since="21" />
+ <field name="KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS" since="21" />
+ <field name="KEYGUARD_DISABLE_WIDGETS_ALL" since="17" />
+ <field name="MIME_TYPE_PROVISIONING_NFC" since="21" />
+ <field name="PASSWORD_QUALITY_ALPHABETIC" />
+ <field name="PASSWORD_QUALITY_ALPHANUMERIC" />
+ <field name="PASSWORD_QUALITY_BIOMETRIC_WEAK" since="14" />
+ <field name="PASSWORD_QUALITY_COMPLEX" since="11" />
+ <field name="PASSWORD_QUALITY_NUMERIC" />
+ <field name="PASSWORD_QUALITY_NUMERIC_COMPLEX" since="21" />
+ <field name="PASSWORD_QUALITY_SOMETHING" />
+ <field name="PASSWORD_QUALITY_UNSPECIFIED" />
+ <field name="RESET_PASSWORD_REQUIRE_ENTRY" />
+ <field name="WIPE_EXTERNAL_STORAGE" since="9" />
+ </class>
+ <class name="android/app/backup/BackupAgent" since="8">
+ <extends name="android/content/ContextWrapper" />
+ <method name="&lt;init>()V" />
+ <method name="fullBackupFile(Ljava/io/File;Landroid/app/backup/FullBackupDataOutput;)V" since="14" />
+ <method name="onBackup(Landroid/os/ParcelFileDescriptor;Landroid/app/backup/BackupDataOutput;Landroid/os/ParcelFileDescriptor;)V" />
+ <method name="onCreate()V" />
+ <method name="onDestroy()V" />
+ <method name="onFullBackup(Landroid/app/backup/FullBackupDataOutput;)V" since="14" />
+ <method name="onRestore(Landroid/app/backup/BackupDataInput;ILandroid/os/ParcelFileDescriptor;)V" />
+ <method name="onRestoreFile(Landroid/os/ParcelFileDescriptor;JLjava/io/File;IJJ)V" since="14" />
+ <method name="onRestoreFinished()V" since="21" />
+ <field name="TYPE_DIRECTORY" since="14" />
+ <field name="TYPE_FILE" since="14" />
+ </class>
+ <class name="android/app/backup/BackupAgentHelper" since="8">
+ <extends name="android/app/backup/BackupAgent" />
+ <method name="&lt;init>()V" />
+ <method name="addHelper(Ljava/lang/String;Landroid/app/backup/BackupHelper;)V" />
+ </class>
+ <class name="android/app/backup/BackupDataInput" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getDataSize()I" />
+ <method name="getKey()Ljava/lang/String;" />
+ <method name="readEntityData([BII)I" />
+ <method name="readNextHeader()Z" />
+ <method name="skipEntityData()V" />
+ </class>
+ <class name="android/app/backup/BackupDataInputStream" since="8">
+ <extends name="java/io/InputStream" />
+ <method name="&lt;init>()V" />
+ <method name="getKey()Ljava/lang/String;" />
+ <method name="size()I" />
+ </class>
+ <class name="android/app/backup/BackupDataOutput" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="writeEntityData([BI)I" />
+ <method name="writeEntityHeader(Ljava/lang/String;I)I" />
+ </class>
+ <class name="android/app/backup/BackupHelper" since="8">
+ <extends name="java/lang/Object" />
+ <method name="performBackup(Landroid/os/ParcelFileDescriptor;Landroid/app/backup/BackupDataOutput;Landroid/os/ParcelFileDescriptor;)V" />
+ <method name="restoreEntity(Landroid/app/backup/BackupDataInputStream;)V" />
+ <method name="writeNewStateDescription(Landroid/os/ParcelFileDescriptor;)V" />
+ </class>
+ <class name="android/app/backup/BackupManager" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="dataChanged()V" />
+ <method name="dataChanged(Ljava/lang/String;)V" />
+ <method name="requestRestore(Landroid/app/backup/RestoreObserver;)I" />
+ </class>
+ <class name="android/app/backup/FileBackupHelper" since="8">
+ <extends name="android/app/backup/FileBackupHelperBase" />
+ <implements name="android/app/backup/BackupHelper" />
+ <method name="&lt;init>(Landroid/content/Context;[Ljava/lang/String;)V" />
+ </class>
+ <class name="android/app/backup/FileBackupHelperBase" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="writeNewStateDescription(Landroid/os/ParcelFileDescriptor;)V" />
+ </class>
+ <class name="android/app/backup/FullBackupDataOutput" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/app/backup/RestoreObserver" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onUpdate(ILjava/lang/String;)V" />
+ <method name="restoreFinished(I)V" />
+ <method name="restoreStarting(I)V" />
+ </class>
+ <class name="android/app/backup/SharedPreferencesBackupHelper" since="8">
+ <extends name="android/app/backup/FileBackupHelperBase" />
+ <implements name="android/app/backup/BackupHelper" />
+ <method name="&lt;init>(Landroid/content/Context;[Ljava/lang/String;)V" />
+ </class>
+ <class name="android/app/job/JobInfo" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getBackoffPolicy()I" />
+ <method name="getExtras()Landroid/os/PersistableBundle;" />
+ <method name="getId()I" />
+ <method name="getInitialBackoffMillis()J" />
+ <method name="getIntervalMillis()J" />
+ <method name="getMaxExecutionDelayMillis()J" />
+ <method name="getMinLatencyMillis()J" />
+ <method name="getNetworkType()I" />
+ <method name="getService()Landroid/content/ComponentName;" />
+ <method name="isPeriodic()Z" />
+ <method name="isPersisted()Z" />
+ <method name="isRequireCharging()Z" />
+ <method name="isRequireDeviceIdle()Z" />
+ <field name="BACKOFF_POLICY_EXPONENTIAL" />
+ <field name="BACKOFF_POLICY_LINEAR" />
+ <field name="CREATOR" />
+ <field name="DEFAULT_INITIAL_BACKOFF_MILLIS" />
+ <field name="MAX_BACKOFF_DELAY_MILLIS" />
+ <field name="NETWORK_TYPE_ANY" />
+ <field name="NETWORK_TYPE_NONE" />
+ <field name="NETWORK_TYPE_UNMETERED" />
+ </class>
+ <class name="android/app/job/JobInfo$Builder" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(ILandroid/content/ComponentName;)V" />
+ <method name="build()Landroid/app/job/JobInfo;" />
+ <method name="setBackoffCriteria(JI)Landroid/app/job/JobInfo$Builder;" />
+ <method name="setExtras(Landroid/os/PersistableBundle;)Landroid/app/job/JobInfo$Builder;" />
+ <method name="setMinimumLatency(J)Landroid/app/job/JobInfo$Builder;" />
+ <method name="setOverrideDeadline(J)Landroid/app/job/JobInfo$Builder;" />
+ <method name="setPeriodic(J)Landroid/app/job/JobInfo$Builder;" />
+ <method name="setPersisted(Z)Landroid/app/job/JobInfo$Builder;" />
+ <method name="setRequiredNetworkType(I)Landroid/app/job/JobInfo$Builder;" />
+ <method name="setRequiresCharging(Z)Landroid/app/job/JobInfo$Builder;" />
+ <method name="setRequiresDeviceIdle(Z)Landroid/app/job/JobInfo$Builder;" />
+ </class>
+ <class name="android/app/job/JobParameters" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getExtras()Landroid/os/PersistableBundle;" />
+ <method name="getJobId()I" />
+ <method name="isOverrideDeadlineExpired()Z" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/app/job/JobScheduler" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="cancel(I)V" />
+ <method name="cancelAll()V" />
+ <method name="getAllPendingJobs()Ljava/util/List;" />
+ <method name="schedule(Landroid/app/job/JobInfo;)I" />
+ <field name="RESULT_FAILURE" />
+ <field name="RESULT_SUCCESS" />
+ </class>
+ <class name="android/app/job/JobService" since="21">
+ <extends name="android/app/Service" />
+ <method name="&lt;init>()V" />
+ <method name="jobFinished(Landroid/app/job/JobParameters;Z)V" />
+ <method name="onStartJob(Landroid/app/job/JobParameters;)Z" />
+ <method name="onStopJob(Landroid/app/job/JobParameters;)Z" />
+ <field name="PERMISSION_BIND" />
+ </class>
+ <class name="android/app/usage/ConfigurationStats" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/app/usage/ConfigurationStats;)V" />
+ <method name="getActivationCount()I" />
+ <method name="getConfiguration()Landroid/content/res/Configuration;" />
+ <method name="getFirstTimeStamp()J" />
+ <method name="getLastTimeActive()J" />
+ <method name="getLastTimeStamp()J" />
+ <method name="getTotalTimeActive()J" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/app/usage/UsageEvents" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getNextEvent(Landroid/app/usage/UsageEvents$Event;)Z" />
+ <method name="hasNextEvent()Z" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/app/usage/UsageEvents$Event" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getClassName()Ljava/lang/String;" />
+ <method name="getConfiguration()Landroid/content/res/Configuration;" />
+ <method name="getEventType()I" />
+ <method name="getPackageName()Ljava/lang/String;" />
+ <method name="getTimeStamp()J" />
+ <field name="CONFIGURATION_CHANGE" />
+ <field name="MOVE_TO_BACKGROUND" />
+ <field name="MOVE_TO_FOREGROUND" />
+ <field name="NONE" />
+ </class>
+ <class name="android/app/usage/UsageStats" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/app/usage/UsageStats;)V" />
+ <method name="add(Landroid/app/usage/UsageStats;)V" />
+ <method name="getFirstTimeStamp()J" />
+ <method name="getLastTimeStamp()J" />
+ <method name="getLastTimeUsed()J" />
+ <method name="getPackageName()Ljava/lang/String;" />
+ <method name="getTotalTimeInForeground()J" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/app/usage/UsageStatsManager" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="queryAndAggregateUsageStats(JJ)Ljava/util/Map;" />
+ <method name="queryConfigurations(IJJ)Ljava/util/List;" />
+ <method name="queryEvents(JJ)Landroid/app/usage/UsageEvents;" />
+ <method name="queryUsageStats(IJJ)Ljava/util/List;" />
+ <field name="INTERVAL_BEST" />
+ <field name="INTERVAL_DAILY" />
+ <field name="INTERVAL_MONTHLY" />
+ <field name="INTERVAL_WEEKLY" />
+ <field name="INTERVAL_YEARLY" />
+ </class>
+ <class name="android/appwidget/AppWidgetHost" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;I)V" />
+ <method name="allocateAppWidgetId()I" />
+ <method name="clearViews()V" since="11" />
+ <method name="createView(Landroid/content/Context;ILandroid/appwidget/AppWidgetProviderInfo;)Landroid/appwidget/AppWidgetHostView;" />
+ <method name="deleteAllHosts()V" />
+ <method name="deleteAppWidgetId(I)V" />
+ <method name="deleteHost()V" />
+ <method name="onCreateView(Landroid/content/Context;ILandroid/appwidget/AppWidgetProviderInfo;)Landroid/appwidget/AppWidgetHostView;" />
+ <method name="onProviderChanged(ILandroid/appwidget/AppWidgetProviderInfo;)V" />
+ <method name="onProvidersChanged()V" since="17" />
+ <method name="startAppWidgetConfigureActivityForResult(Landroid/app/Activity;IIILandroid/os/Bundle;)V" since="21" />
+ <method name="startListening()V" />
+ <method name="stopListening()V" />
+ </class>
+ <class name="android/appwidget/AppWidgetHostView" since="3">
+ <extends name="android/widget/FrameLayout" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;II)V" />
+ <method name="getAppWidgetId()I" />
+ <method name="getAppWidgetInfo()Landroid/appwidget/AppWidgetProviderInfo;" />
+ <method name="getDefaultPaddingForWidget(Landroid/content/Context;Landroid/content/ComponentName;Landroid/graphics/Rect;)Landroid/graphics/Rect;" since="15" />
+ <method name="getDefaultView()Landroid/view/View;" />
+ <method name="getErrorView()Landroid/view/View;" />
+ <method name="prepareView(Landroid/view/View;)V" />
+ <method name="setAppWidget(ILandroid/appwidget/AppWidgetProviderInfo;)V" />
+ <method name="updateAppWidget(Landroid/widget/RemoteViews;)V" />
+ <method name="updateAppWidgetOptions(Landroid/os/Bundle;)V" since="16" />
+ <method name="updateAppWidgetSize(Landroid/os/Bundle;IIII)V" since="16" />
+ </class>
+ <class name="android/appwidget/AppWidgetManager" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="bindAppWidgetId(ILandroid/content/ComponentName;)V" />
+ <method name="bindAppWidgetIdIfAllowed(ILandroid/content/ComponentName;)Z" since="16" />
+ <method name="bindAppWidgetIdIfAllowed(ILandroid/content/ComponentName;Landroid/os/Bundle;)Z" since="17" />
+ <method name="bindAppWidgetIdIfAllowed(ILandroid/os/UserHandle;Landroid/content/ComponentName;Landroid/os/Bundle;)Z" since="21" />
+ <method name="getAppWidgetIds(Landroid/content/ComponentName;)[I" />
+ <method name="getAppWidgetInfo(I)Landroid/appwidget/AppWidgetProviderInfo;" />
+ <method name="getAppWidgetOptions(I)Landroid/os/Bundle;" since="16" />
+ <method name="getInstalledProviders()Ljava/util/List;" />
+ <method name="getInstalledProvidersForProfile(Landroid/os/UserHandle;)Ljava/util/List;" since="21" />
+ <method name="getInstance(Landroid/content/Context;)Landroid/appwidget/AppWidgetManager;" />
+ <method name="notifyAppWidgetViewDataChanged(II)V" since="11" />
+ <method name="notifyAppWidgetViewDataChanged([II)V" since="11" />
+ <method name="partiallyUpdateAppWidget(ILandroid/widget/RemoteViews;)V" since="11" />
+ <method name="partiallyUpdateAppWidget([ILandroid/widget/RemoteViews;)V" since="11" />
+ <method name="updateAppWidget(ILandroid/widget/RemoteViews;)V" />
+ <method name="updateAppWidget(Landroid/content/ComponentName;Landroid/widget/RemoteViews;)V" />
+ <method name="updateAppWidget([ILandroid/widget/RemoteViews;)V" />
+ <method name="updateAppWidgetOptions(ILandroid/os/Bundle;)V" since="16" />
+ <field name="ACTION_APPWIDGET_BIND" since="16" />
+ <field name="ACTION_APPWIDGET_CONFIGURE" />
+ <field name="ACTION_APPWIDGET_DELETED" />
+ <field name="ACTION_APPWIDGET_DISABLED" />
+ <field name="ACTION_APPWIDGET_ENABLED" />
+ <field name="ACTION_APPWIDGET_HOST_RESTORED" since="21" />
+ <field name="ACTION_APPWIDGET_OPTIONS_CHANGED" since="16" />
+ <field name="ACTION_APPWIDGET_PICK" />
+ <field name="ACTION_APPWIDGET_RESTORED" since="21" />
+ <field name="ACTION_APPWIDGET_UPDATE" />
+ <field name="EXTRA_APPWIDGET_ID" />
+ <field name="EXTRA_APPWIDGET_IDS" />
+ <field name="EXTRA_APPWIDGET_OLD_IDS" since="21" />
+ <field name="EXTRA_APPWIDGET_OPTIONS" since="16" />
+ <field name="EXTRA_APPWIDGET_PROVIDER" since="16" />
+ <field name="EXTRA_APPWIDGET_PROVIDER_PROFILE" since="21" />
+ <field name="EXTRA_CUSTOM_EXTRAS" />
+ <field name="EXTRA_CUSTOM_INFO" />
+ <field name="EXTRA_HOST_ID" since="21" />
+ <field name="INVALID_APPWIDGET_ID" />
+ <field name="META_DATA_APPWIDGET_PROVIDER" />
+ <field name="OPTION_APPWIDGET_HOST_CATEGORY" since="17" />
+ <field name="OPTION_APPWIDGET_MAX_HEIGHT" since="16" />
+ <field name="OPTION_APPWIDGET_MAX_WIDTH" since="16" />
+ <field name="OPTION_APPWIDGET_MIN_HEIGHT" since="16" />
+ <field name="OPTION_APPWIDGET_MIN_WIDTH" since="16" />
+ </class>
+ <class name="android/appwidget/AppWidgetProvider" since="3">
+ <extends name="android/content/BroadcastReceiver" />
+ <method name="&lt;init>()V" />
+ <method name="onAppWidgetOptionsChanged(Landroid/content/Context;Landroid/appwidget/AppWidgetManager;ILandroid/os/Bundle;)V" since="16" />
+ <method name="onDeleted(Landroid/content/Context;[I)V" />
+ <method name="onDisabled(Landroid/content/Context;)V" />
+ <method name="onEnabled(Landroid/content/Context;)V" />
+ <method name="onRestored(Landroid/content/Context;[I[I)V" since="21" />
+ <method name="onUpdate(Landroid/content/Context;Landroid/appwidget/AppWidgetManager;[I)V" />
+ </class>
+ <class name="android/appwidget/AppWidgetProviderInfo" since="3">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="clone()Landroid/appwidget/AppWidgetProviderInfo;" since="17" />
+ <method name="getProfile()Landroid/os/UserHandle;" since="21" />
+ <method name="loadIcon(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable;" since="21" />
+ <method name="loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/String;" since="21" />
+ <method name="loadPreviewImage(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable;" since="21" />
+ <field name="CREATOR" />
+ <field name="RESIZE_BOTH" since="12" />
+ <field name="RESIZE_HORIZONTAL" since="12" />
+ <field name="RESIZE_NONE" since="12" />
+ <field name="RESIZE_VERTICAL" since="12" />
+ <field name="WIDGET_CATEGORY_HOME_SCREEN" since="17" />
+ <field name="WIDGET_CATEGORY_KEYGUARD" since="17" />
+ <field name="WIDGET_CATEGORY_SEARCHBOX" since="21" />
+ <field name="autoAdvanceViewId" since="11" />
+ <field name="configure" />
+ <field name="icon" />
+ <field name="initialKeyguardLayout" since="17" />
+ <field name="initialLayout" />
+ <field name="label" />
+ <field name="minHeight" />
+ <field name="minResizeHeight" since="14" />
+ <field name="minResizeWidth" since="14" />
+ <field name="minWidth" />
+ <field name="previewImage" since="11" />
+ <field name="provider" />
+ <field name="resizeMode" since="12" />
+ <field name="updatePeriodMillis" />
+ <field name="widgetCategory" since="17" />
+ </class>
+ <class name="android/bluetooth/BluetoothA2dp" since="11">
+ <extends name="java/lang/Object" />
+ <implements name="android/bluetooth/BluetoothProfile" />
+ <method name="&lt;init>()V" />
+ <method name="isA2dpPlaying(Landroid/bluetooth/BluetoothDevice;)Z" />
+ <field name="ACTION_CONNECTION_STATE_CHANGED" />
+ <field name="ACTION_PLAYING_STATE_CHANGED" />
+ <field name="STATE_NOT_PLAYING" />
+ <field name="STATE_PLAYING" />
+ </class>
+ <class name="android/bluetooth/BluetoothAdapter" since="5">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="cancelDiscovery()Z" />
+ <method name="checkBluetoothAddress(Ljava/lang/String;)Z" />
+ <method name="closeProfileProxy(ILandroid/bluetooth/BluetoothProfile;)V" since="11" />
+ <method name="disable()Z" />
+ <method name="enable()Z" />
+ <method name="getAddress()Ljava/lang/String;" />
+ <method name="getBluetoothLeAdvertiser()Landroid/bluetooth/le/BluetoothLeAdvertiser;" since="21" />
+ <method name="getBluetoothLeScanner()Landroid/bluetooth/le/BluetoothLeScanner;" since="21" />
+ <method name="getBondedDevices()Ljava/util/Set;" />
+ <method name="getDefaultAdapter()Landroid/bluetooth/BluetoothAdapter;" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getProfileConnectionState(I)I" since="14" />
+ <method name="getProfileProxy(Landroid/content/Context;Landroid/bluetooth/BluetoothProfile$ServiceListener;I)Z" since="11" />
+ <method name="getRemoteDevice(Ljava/lang/String;)Landroid/bluetooth/BluetoothDevice;" />
+ <method name="getRemoteDevice([B)Landroid/bluetooth/BluetoothDevice;" since="16" />
+ <method name="getScanMode()I" />
+ <method name="getState()I" />
+ <method name="isDiscovering()Z" />
+ <method name="isEnabled()Z" />
+ <method name="isMultipleAdvertisementSupported()Z" since="21" />
+ <method name="isOffloadedFilteringSupported()Z" since="21" />
+ <method name="isOffloadedScanBatchingSupported()Z" since="21" />
+ <method name="listenUsingInsecureRfcommWithServiceRecord(Ljava/lang/String;Ljava/util/UUID;)Landroid/bluetooth/BluetoothServerSocket;" since="10" />
+ <method name="listenUsingRfcommWithServiceRecord(Ljava/lang/String;Ljava/util/UUID;)Landroid/bluetooth/BluetoothServerSocket;" />
+ <method name="setName(Ljava/lang/String;)Z" />
+ <method name="startDiscovery()Z" />
+ <method name="startLeScan(Landroid/bluetooth/BluetoothAdapter$LeScanCallback;)Z" since="18" />
+ <method name="startLeScan([Ljava/util/UUID;Landroid/bluetooth/BluetoothAdapter$LeScanCallback;)Z" since="18" />
+ <method name="stopLeScan(Landroid/bluetooth/BluetoothAdapter$LeScanCallback;)V" since="18" />
+ <field name="ACTION_CONNECTION_STATE_CHANGED" since="11" />
+ <field name="ACTION_DISCOVERY_FINISHED" />
+ <field name="ACTION_DISCOVERY_STARTED" />
+ <field name="ACTION_LOCAL_NAME_CHANGED" />
+ <field name="ACTION_REQUEST_DISCOVERABLE" />
+ <field name="ACTION_REQUEST_ENABLE" />
+ <field name="ACTION_SCAN_MODE_CHANGED" />
+ <field name="ACTION_STATE_CHANGED" />
+ <field name="ERROR" />
+ <field name="EXTRA_CONNECTION_STATE" since="11" />
+ <field name="EXTRA_DISCOVERABLE_DURATION" />
+ <field name="EXTRA_LOCAL_NAME" />
+ <field name="EXTRA_PREVIOUS_CONNECTION_STATE" since="11" />
+ <field name="EXTRA_PREVIOUS_SCAN_MODE" />
+ <field name="EXTRA_PREVIOUS_STATE" />
+ <field name="EXTRA_SCAN_MODE" />
+ <field name="EXTRA_STATE" />
+ <field name="SCAN_MODE_CONNECTABLE" />
+ <field name="SCAN_MODE_CONNECTABLE_DISCOVERABLE" />
+ <field name="SCAN_MODE_NONE" />
+ <field name="STATE_CONNECTED" since="11" />
+ <field name="STATE_CONNECTING" since="11" />
+ <field name="STATE_DISCONNECTED" since="11" />
+ <field name="STATE_DISCONNECTING" since="11" />
+ <field name="STATE_OFF" />
+ <field name="STATE_ON" />
+ <field name="STATE_TURNING_OFF" />
+ <field name="STATE_TURNING_ON" />
+ </class>
+ <class name="android/bluetooth/BluetoothAdapter$LeScanCallback" since="18">
+ <extends name="java/lang/Object" />
+ <method name="onLeScan(Landroid/bluetooth/BluetoothDevice;I[B)V" />
+ </class>
+ <class name="android/bluetooth/BluetoothAssignedNumbers" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="AAMP_OF_AMERICA" since="19" />
+ <field name="ACCEL_SEMICONDUCTOR" />
+ <field name="ACE_SENSOR" since="19" />
+ <field name="ADIDAS" since="19" />
+ <field name="ADVANCED_PANMOBIL_SYSTEMS" since="19" />
+ <field name="AIROHA_TECHNOLOGY" since="19" />
+ <field name="ALCATEL" />
+ <field name="ALPWISE" since="19" />
+ <field name="AMICCOM_ELECTRONICS" since="19" />
+ <field name="APLIX" since="19" />
+ <field name="APPLE" />
+ <field name="APT_LICENSING" />
+ <field name="ARCHOS" since="19" />
+ <field name="ARP_DEVICES" since="19" />
+ <field name="ATHEROS_COMMUNICATIONS" />
+ <field name="ATMEL" />
+ <field name="AUSTCO_COMMUNICATION_SYSTEMS" since="19" />
+ <field name="AUTONET_MOBILE" since="19" />
+ <field name="AVAGO" />
+ <field name="AVM_BERLIN" />
+ <field name="A_AND_D_ENGINEERING" since="19" />
+ <field name="A_AND_R_CAMBRIDGE" since="19" />
+ <field name="BANDSPEED" />
+ <field name="BAND_XI_INTERNATIONAL" since="19" />
+ <field name="BDE_TECHNOLOGY" since="19" />
+ <field name="BEATS_ELECTRONICS" since="19" />
+ <field name="BEAUTIFUL_ENTERPRISE" since="19" />
+ <field name="BEKEY" since="19" />
+ <field name="BELKIN_INTERNATIONAL" />
+ <field name="BINAURIC" since="19" />
+ <field name="BIOSENTRONICS" since="19" />
+ <field name="BLUEGIGA" />
+ <field name="BLUERADIOS" since="19" />
+ <field name="BLUETOOTH_SIG" />
+ <field name="BLUETREK_TECHNOLOGIES" since="19" />
+ <field name="BOSE" since="19" />
+ <field name="BRIARTEK" since="19" />
+ <field name="BROADCOM" />
+ <field name="CAEN_RFID" since="19" />
+ <field name="CAMBRIDGE_SILICON_RADIO" />
+ <field name="CATC" />
+ <field name="CINETIX" since="19" />
+ <field name="CLARINOX_TECHNOLOGIES" since="19" />
+ <field name="COLORFY" since="19" />
+ <field name="COMMIL" />
+ <field name="CONEXANT_SYSTEMS" />
+ <field name="CONNECTBLUE" since="19" />
+ <field name="CONTINENTAL_AUTOMOTIVE" />
+ <field name="CONWISE_TECHNOLOGY" />
+ <field name="CREATIVE_TECHNOLOGY" since="19" />
+ <field name="C_TECHNOLOGIES" />
+ <field name="DANLERS" since="19" />
+ <field name="DELORME_PUBLISHING_COMPANY" since="19" />
+ <field name="DEXCOM" since="19" />
+ <field name="DIALOG_SEMICONDUCTOR" since="19" />
+ <field name="DIGIANSWER" />
+ <field name="ECLIPSE" />
+ <field name="ECOTEST" since="19" />
+ <field name="ELGATO_SYSTEMS" since="19" />
+ <field name="EM_MICROELECTRONIC_MARIN" />
+ <field name="EQUINOX_AG" since="19" />
+ <field name="ERICSSON_TECHNOLOGY" />
+ <field name="EVLUMA" since="19" />
+ <field name="FREE2MOVE" />
+ <field name="FUNAI_ELECTRIC" since="19" />
+ <field name="GARMIN_INTERNATIONAL" since="19" />
+ <field name="GCT_SEMICONDUCTOR" />
+ <field name="GELO" since="19" />
+ <field name="GENEQ" since="19" />
+ <field name="GENERAL_MOTORS" since="19" />
+ <field name="GENNUM" />
+ <field name="GEOFORCE" since="19" />
+ <field name="GIBSON_GUITARS" since="19" />
+ <field name="GN_NETCOM" since="19" />
+ <field name="GN_RESOUND" since="19" />
+ <field name="GOOGLE" since="19" />
+ <field name="GREEN_THROTTLE_GAMES" since="19" />
+ <field name="GROUP_SENSE" since="19" />
+ <field name="HANLYNN_TECHNOLOGIES" since="19" />
+ <field name="HARMAN_INTERNATIONAL" />
+ <field name="HEWLETT_PACKARD" since="19" />
+ <field name="HITACHI" />
+ <field name="HOSIDEN" since="19" />
+ <field name="IBM" />
+ <field name="INFINEON_TECHNOLOGIES" />
+ <field name="INGENIEUR_SYSTEMGRUPPE_ZAHN" since="19" />
+ <field name="INTEGRATED_SILICON_SOLUTION" />
+ <field name="INTEGRATED_SYSTEM_SOLUTION" />
+ <field name="INTEL" />
+ <field name="INVENTEL" />
+ <field name="IPEXTREME" />
+ <field name="I_TECH_DYNAMIC_GLOBAL_DISTRIBUTION" since="19" />
+ <field name="JAWBONE" since="19" />
+ <field name="JIANGSU_TOPPOWER_AUTOMOTIVE_ELECTRONICS" since="19" />
+ <field name="JOHNSON_CONTROLS" since="19" />
+ <field name="J_AND_M" />
+ <field name="KAWANTECH" since="19" />
+ <field name="KC_TECHNOLOGY" />
+ <field name="KENSINGTON_COMPUTER_PRODUCTS_GROUP" since="19" />
+ <field name="LAIRD_TECHNOLOGIES" since="19" />
+ <field name="LESSWIRE" since="19" />
+ <field name="LG_ELECTRONICS" since="19" />
+ <field name="LINAK" since="19" />
+ <field name="LUCENT" />
+ <field name="LUDUS_HELSINKI" since="19" />
+ <field name="MACRONIX" />
+ <field name="MAGNETI_MARELLI" since="19" />
+ <field name="MANSELLA" />
+ <field name="MARVELL" />
+ <field name="MATSUSHITA_ELECTRIC" />
+ <field name="MC10" since="19" />
+ <field name="MEDIATEK" />
+ <field name="MESO_INTERNATIONAL" since="19" />
+ <field name="META_WATCH" since="19" />
+ <field name="MEWTEL_TECHNOLOGY" />
+ <field name="MICOMMAND" since="19" />
+ <field name="MICROCHIP_TECHNOLOGY" since="19" />
+ <field name="MICROSOFT" />
+ <field name="MINDTREE" since="19" />
+ <field name="MISFIT_WEARABLES" since="19" />
+ <field name="MITEL_SEMICONDUCTOR" />
+ <field name="MITSUBISHI_ELECTRIC" />
+ <field name="MOBILIAN_CORPORATION" />
+ <field name="MONSTER" since="19" />
+ <field name="MOTOROLA" />
+ <field name="MSTAR_SEMICONDUCTOR" since="19" />
+ <field name="MUZIK" since="19" />
+ <field name="NEC" />
+ <field name="NEC_LIGHTING" since="19" />
+ <field name="NEWLOGIC" />
+ <field name="NIKE" since="19" />
+ <field name="NINE_SOLUTIONS" since="19" />
+ <field name="NOKIA_MOBILE_PHONES" />
+ <field name="NORDIC_SEMICONDUCTOR" />
+ <field name="NORWOOD_SYSTEMS" />
+ <field name="ODM_TECHNOLOGY" since="19" />
+ <field name="OMEGAWAVE" since="19" />
+ <field name="ONSET_COMPUTER" since="19" />
+ <field name="OPEN_INTERFACE" />
+ <field name="OTL_DYNAMICS" since="19" />
+ <field name="PANDA_OCEAN" since="19" />
+ <field name="PARROT" />
+ <field name="PARTHUS_TECHNOLOGIES" />
+ <field name="PASSIF_SEMICONDUCTOR" since="19" />
+ <field name="PETER_SYSTEMTECHNIK" since="19" />
+ <field name="PHILIPS_SEMICONDUCTORS" />
+ <field name="PLANTRONICS" />
+ <field name="POLAR_ELECTRO" since="19" />
+ <field name="POLAR_ELECTRO_EUROPE" since="19" />
+ <field name="PROCTER_AND_GAMBLE" since="19" />
+ <field name="QUALCOMM" />
+ <field name="QUALCOMM_CONNECTED_EXPERIENCES" since="19" />
+ <field name="QUALCOMM_INNOVATION_CENTER" since="19" />
+ <field name="QUALCOMM_LABS" since="19" />
+ <field name="QUALCOMM_TECHNOLOGIES" since="19" />
+ <field name="QUINTIC" since="19" />
+ <field name="QUUPPA" since="19" />
+ <field name="RALINK_TECHNOLOGY" />
+ <field name="RDA_MICROELECTRONICS" since="19" />
+ <field name="REALTEK_SEMICONDUCTOR" />
+ <field name="RED_M" />
+ <field name="RENESAS_TECHNOLOGY" />
+ <field name="RESEARCH_IN_MOTION" />
+ <field name="RF_MICRO_DEVICES" />
+ <field name="RIVIERAWAVES" />
+ <field name="ROHDE_AND_SCHWARZ" />
+ <field name="RTX_TELECOM" />
+ <field name="SAMSUNG_ELECTRONICS" since="19" />
+ <field name="SARIS_CYCLING_GROUP" since="19" />
+ <field name="SEERS_TECHNOLOGY" since="19" />
+ <field name="SEIKO_EPSON" />
+ <field name="SELFLY" since="19" />
+ <field name="SEMILINK" since="19" />
+ <field name="SENNHEISER_COMMUNICATIONS" since="19" />
+ <field name="SHANGHAI_SUPER_SMART_ELECTRONICS" since="19" />
+ <field name="SHENZHEN_EXCELSECU_DATA_TECHNOLOGY" since="19" />
+ <field name="SIGNIA_TECHNOLOGIES" />
+ <field name="SILICON_WAVE" />
+ <field name="SIRF_TECHNOLOGY" />
+ <field name="SOCKET_MOBILE" />
+ <field name="SONY_ERICSSON" />
+ <field name="SOUND_ID" since="19" />
+ <field name="SPORTS_TRACKING_TECHNOLOGIES" since="19" />
+ <field name="SR_MEDIZINELEKTRONIK" since="19" />
+ <field name="STACCATO_COMMUNICATIONS" />
+ <field name="STALMART_TECHNOLOGY" since="19" />
+ <field name="STARKEY_LABORATORIES" since="19" />
+ <field name="STOLLMAN_E_PLUS_V" since="19" />
+ <field name="STONESTREET_ONE" />
+ <field name="ST_MICROELECTRONICS" />
+ <field name="SUMMIT_DATA_COMMUNICATIONS" since="19" />
+ <field name="SUUNTO" since="19" />
+ <field name="SWIRL_NETWORKS" since="19" />
+ <field name="SYMBOL_TECHNOLOGIES" />
+ <field name="SYNOPSYS" />
+ <field name="SYSTEMS_AND_CHIPS" />
+ <field name="S_POWER_ELECTRONICS" since="19" />
+ <field name="TAIXINGBANG_TECHNOLOGY" since="19" />
+ <field name="TENOVIS" />
+ <field name="TERAX" />
+ <field name="TEXAS_INSTRUMENTS" />
+ <field name="THINKOPTICS" since="19" />
+ <field name="THREECOM" />
+ <field name="THREE_DIJOY" />
+ <field name="THREE_DSP" />
+ <field name="TIMEKEEPING_SYSTEMS" since="19" />
+ <field name="TIMEX_GROUP_USA" since="19" />
+ <field name="TOPCORN_POSITIONING_SYSTEMS" since="19" />
+ <field name="TOSHIBA" />
+ <field name="TRANSILICA" />
+ <field name="TRELAB" since="19" />
+ <field name="TTPCOM" />
+ <field name="TXTR" since="19" />
+ <field name="TZERO_TECHNOLOGIES" />
+ <field name="UNIVERSAL_ELECTRONICS" since="19" />
+ <field name="VERTU" since="19" />
+ <field name="VISTEON" since="19" />
+ <field name="VIZIO" />
+ <field name="VOYETRA_TURTLE_BEACH" since="19" />
+ <field name="WAVEPLUS_TECHNOLOGY" />
+ <field name="WICENTRIC" />
+ <field name="WIDCOMM" />
+ <field name="WUXI_VIMICRO" since="19" />
+ <field name="ZEEVO" />
+ <field name="ZER01_TV" since="19" />
+ <field name="ZOMM" since="19" />
+ <field name="ZSCAN_SOFTWARE" since="19" />
+ </class>
+ <class name="android/bluetooth/BluetoothClass" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getDeviceClass()I" />
+ <method name="getMajorDeviceClass()I" />
+ <method name="hasService(I)Z" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/bluetooth/BluetoothClass$Device" since="5">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="AUDIO_VIDEO_CAMCORDER" />
+ <field name="AUDIO_VIDEO_CAR_AUDIO" />
+ <field name="AUDIO_VIDEO_HANDSFREE" />
+ <field name="AUDIO_VIDEO_HEADPHONES" />
+ <field name="AUDIO_VIDEO_HIFI_AUDIO" />
+ <field name="AUDIO_VIDEO_LOUDSPEAKER" />
+ <field name="AUDIO_VIDEO_MICROPHONE" />
+ <field name="AUDIO_VIDEO_PORTABLE_AUDIO" />
+ <field name="AUDIO_VIDEO_SET_TOP_BOX" />
+ <field name="AUDIO_VIDEO_UNCATEGORIZED" />
+ <field name="AUDIO_VIDEO_VCR" />
+ <field name="AUDIO_VIDEO_VIDEO_CAMERA" />
+ <field name="AUDIO_VIDEO_VIDEO_CONFERENCING" />
+ <field name="AUDIO_VIDEO_VIDEO_DISPLAY_AND_LOUDSPEAKER" />
+ <field name="AUDIO_VIDEO_VIDEO_GAMING_TOY" />
+ <field name="AUDIO_VIDEO_VIDEO_MONITOR" />
+ <field name="AUDIO_VIDEO_WEARABLE_HEADSET" />
+ <field name="COMPUTER_DESKTOP" />
+ <field name="COMPUTER_HANDHELD_PC_PDA" />
+ <field name="COMPUTER_LAPTOP" />
+ <field name="COMPUTER_PALM_SIZE_PC_PDA" />
+ <field name="COMPUTER_SERVER" />
+ <field name="COMPUTER_UNCATEGORIZED" />
+ <field name="COMPUTER_WEARABLE" />
+ <field name="HEALTH_BLOOD_PRESSURE" />
+ <field name="HEALTH_DATA_DISPLAY" />
+ <field name="HEALTH_GLUCOSE" />
+ <field name="HEALTH_PULSE_OXIMETER" />
+ <field name="HEALTH_PULSE_RATE" />
+ <field name="HEALTH_THERMOMETER" />
+ <field name="HEALTH_UNCATEGORIZED" />
+ <field name="HEALTH_WEIGHING" />
+ <field name="PHONE_CELLULAR" />
+ <field name="PHONE_CORDLESS" />
+ <field name="PHONE_ISDN" />
+ <field name="PHONE_MODEM_OR_GATEWAY" />
+ <field name="PHONE_SMART" />
+ <field name="PHONE_UNCATEGORIZED" />
+ <field name="TOY_CONTROLLER" />
+ <field name="TOY_DOLL_ACTION_FIGURE" />
+ <field name="TOY_GAME" />
+ <field name="TOY_ROBOT" />
+ <field name="TOY_UNCATEGORIZED" />
+ <field name="TOY_VEHICLE" />
+ <field name="WEARABLE_GLASSES" />
+ <field name="WEARABLE_HELMET" />
+ <field name="WEARABLE_JACKET" />
+ <field name="WEARABLE_PAGER" />
+ <field name="WEARABLE_UNCATEGORIZED" />
+ <field name="WEARABLE_WRIST_WATCH" />
+ </class>
+ <class name="android/bluetooth/BluetoothClass$Device$Major" since="5">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="AUDIO_VIDEO" />
+ <field name="COMPUTER" />
+ <field name="HEALTH" />
+ <field name="IMAGING" />
+ <field name="MISC" />
+ <field name="NETWORKING" />
+ <field name="PERIPHERAL" />
+ <field name="PHONE" />
+ <field name="TOY" />
+ <field name="UNCATEGORIZED" />
+ <field name="WEARABLE" />
+ </class>
+ <class name="android/bluetooth/BluetoothClass$Service" since="5">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="AUDIO" />
+ <field name="CAPTURE" />
+ <field name="INFORMATION" />
+ <field name="LIMITED_DISCOVERABILITY" />
+ <field name="NETWORKING" />
+ <field name="OBJECT_TRANSFER" />
+ <field name="POSITIONING" />
+ <field name="RENDER" />
+ <field name="TELEPHONY" />
+ </class>
+ <class name="android/bluetooth/BluetoothDevice" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="connectGatt(Landroid/content/Context;ZLandroid/bluetooth/BluetoothGattCallback;)Landroid/bluetooth/BluetoothGatt;" since="18" />
+ <method name="createBond()Z" since="19" />
+ <method name="createInsecureRfcommSocketToServiceRecord(Ljava/util/UUID;)Landroid/bluetooth/BluetoothSocket;" since="10" />
+ <method name="createRfcommSocketToServiceRecord(Ljava/util/UUID;)Landroid/bluetooth/BluetoothSocket;" />
+ <method name="fetchUuidsWithSdp()Z" since="15" />
+ <method name="getAddress()Ljava/lang/String;" />
+ <method name="getBluetoothClass()Landroid/bluetooth/BluetoothClass;" />
+ <method name="getBondState()I" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getType()I" since="18" />
+ <method name="getUuids()[Landroid/os/ParcelUuid;" since="15" />
+ <method name="setPairingConfirmation(Z)Z" since="19" />
+ <method name="setPin([B)Z" since="19" />
+ <field name="ACTION_ACL_CONNECTED" />
+ <field name="ACTION_ACL_DISCONNECTED" />
+ <field name="ACTION_ACL_DISCONNECT_REQUESTED" />
+ <field name="ACTION_BOND_STATE_CHANGED" />
+ <field name="ACTION_CLASS_CHANGED" />
+ <field name="ACTION_FOUND" />
+ <field name="ACTION_NAME_CHANGED" />
+ <field name="ACTION_PAIRING_REQUEST" since="19" />
+ <field name="ACTION_UUID" since="15" />
+ <field name="BOND_BONDED" />
+ <field name="BOND_BONDING" />
+ <field name="BOND_NONE" />
+ <field name="CREATOR" />
+ <field name="DEVICE_TYPE_CLASSIC" since="18" />
+ <field name="DEVICE_TYPE_DUAL" since="18" />
+ <field name="DEVICE_TYPE_LE" since="18" />
+ <field name="DEVICE_TYPE_UNKNOWN" since="18" />
+ <field name="ERROR" />
+ <field name="EXTRA_BOND_STATE" />
+ <field name="EXTRA_CLASS" />
+ <field name="EXTRA_DEVICE" />
+ <field name="EXTRA_NAME" />
+ <field name="EXTRA_PAIRING_KEY" since="19" />
+ <field name="EXTRA_PAIRING_VARIANT" since="19" />
+ <field name="EXTRA_PREVIOUS_BOND_STATE" />
+ <field name="EXTRA_RSSI" />
+ <field name="EXTRA_UUID" since="15" />
+ <field name="PAIRING_VARIANT_PASSKEY_CONFIRMATION" since="19" />
+ <field name="PAIRING_VARIANT_PIN" since="19" />
+ </class>
+ <class name="android/bluetooth/BluetoothGatt" since="18">
+ <extends name="java/lang/Object" />
+ <implements name="android/bluetooth/BluetoothProfile" />
+ <method name="&lt;init>()V" />
+ <method name="abortReliableWrite()V" since="19" />
+ <method name="abortReliableWrite(Landroid/bluetooth/BluetoothDevice;)V" />
+ <method name="beginReliableWrite()Z" />
+ <method name="close()V" />
+ <method name="connect()Z" />
+ <method name="disconnect()V" />
+ <method name="discoverServices()Z" />
+ <method name="executeReliableWrite()Z" />
+ <method name="getDevice()Landroid/bluetooth/BluetoothDevice;" />
+ <method name="getService(Ljava/util/UUID;)Landroid/bluetooth/BluetoothGattService;" />
+ <method name="getServices()Ljava/util/List;" />
+ <method name="readCharacteristic(Landroid/bluetooth/BluetoothGattCharacteristic;)Z" />
+ <method name="readDescriptor(Landroid/bluetooth/BluetoothGattDescriptor;)Z" />
+ <method name="readRemoteRssi()Z" />
+ <method name="requestConnectionPriority(I)Z" since="21" />
+ <method name="requestMtu(I)Z" since="21" />
+ <method name="setCharacteristicNotification(Landroid/bluetooth/BluetoothGattCharacteristic;Z)Z" />
+ <method name="writeCharacteristic(Landroid/bluetooth/BluetoothGattCharacteristic;)Z" />
+ <method name="writeDescriptor(Landroid/bluetooth/BluetoothGattDescriptor;)Z" />
+ <field name="CONNECTION_PRIORITY_BALANCED" since="21" />
+ <field name="CONNECTION_PRIORITY_HIGH" since="21" />
+ <field name="CONNECTION_PRIORITY_LOW_POWER" since="21" />
+ <field name="GATT_CONNECTION_CONGESTED" since="21" />
+ <field name="GATT_FAILURE" />
+ <field name="GATT_INSUFFICIENT_AUTHENTICATION" />
+ <field name="GATT_INSUFFICIENT_ENCRYPTION" />
+ <field name="GATT_INVALID_ATTRIBUTE_LENGTH" />
+ <field name="GATT_INVALID_OFFSET" />
+ <field name="GATT_READ_NOT_PERMITTED" />
+ <field name="GATT_REQUEST_NOT_SUPPORTED" />
+ <field name="GATT_SUCCESS" />
+ <field name="GATT_WRITE_NOT_PERMITTED" />
+ </class>
+ <class name="android/bluetooth/BluetoothGattCallback" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onCharacteristicChanged(Landroid/bluetooth/BluetoothGatt;Landroid/bluetooth/BluetoothGattCharacteristic;)V" />
+ <method name="onCharacteristicRead(Landroid/bluetooth/BluetoothGatt;Landroid/bluetooth/BluetoothGattCharacteristic;I)V" />
+ <method name="onCharacteristicWrite(Landroid/bluetooth/BluetoothGatt;Landroid/bluetooth/BluetoothGattCharacteristic;I)V" />
+ <method name="onConnectionStateChange(Landroid/bluetooth/BluetoothGatt;II)V" />
+ <method name="onDescriptorRead(Landroid/bluetooth/BluetoothGatt;Landroid/bluetooth/BluetoothGattDescriptor;I)V" />
+ <method name="onDescriptorWrite(Landroid/bluetooth/BluetoothGatt;Landroid/bluetooth/BluetoothGattDescriptor;I)V" />
+ <method name="onMtuChanged(Landroid/bluetooth/BluetoothGatt;II)V" since="21" />
+ <method name="onReadRemoteRssi(Landroid/bluetooth/BluetoothGatt;II)V" />
+ <method name="onReliableWriteCompleted(Landroid/bluetooth/BluetoothGatt;I)V" />
+ <method name="onServicesDiscovered(Landroid/bluetooth/BluetoothGatt;I)V" />
+ </class>
+ <class name="android/bluetooth/BluetoothGattCharacteristic" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/util/UUID;II)V" />
+ <method name="addDescriptor(Landroid/bluetooth/BluetoothGattDescriptor;)Z" />
+ <method name="getDescriptor(Ljava/util/UUID;)Landroid/bluetooth/BluetoothGattDescriptor;" />
+ <method name="getDescriptors()Ljava/util/List;" />
+ <method name="getFloatValue(II)Ljava/lang/Float;" />
+ <method name="getInstanceId()I" />
+ <method name="getIntValue(II)Ljava/lang/Integer;" />
+ <method name="getPermissions()I" />
+ <method name="getProperties()I" />
+ <method name="getService()Landroid/bluetooth/BluetoothGattService;" />
+ <method name="getStringValue(I)Ljava/lang/String;" />
+ <method name="getUuid()Ljava/util/UUID;" />
+ <method name="getValue()[B" />
+ <method name="getWriteType()I" />
+ <method name="setValue(III)Z" />
+ <method name="setValue(IIII)Z" />
+ <method name="setValue(Ljava/lang/String;)Z" />
+ <method name="setValue([B)Z" />
+ <method name="setWriteType(I)V" />
+ <field name="FORMAT_FLOAT" />
+ <field name="FORMAT_SFLOAT" />
+ <field name="FORMAT_SINT16" />
+ <field name="FORMAT_SINT32" />
+ <field name="FORMAT_SINT8" />
+ <field name="FORMAT_UINT16" />
+ <field name="FORMAT_UINT32" />
+ <field name="FORMAT_UINT8" />
+ <field name="PERMISSION_READ" />
+ <field name="PERMISSION_READ_ENCRYPTED" />
+ <field name="PERMISSION_READ_ENCRYPTED_MITM" />
+ <field name="PERMISSION_WRITE" />
+ <field name="PERMISSION_WRITE_ENCRYPTED" />
+ <field name="PERMISSION_WRITE_ENCRYPTED_MITM" />
+ <field name="PERMISSION_WRITE_SIGNED" />
+ <field name="PERMISSION_WRITE_SIGNED_MITM" />
+ <field name="PROPERTY_BROADCAST" />
+ <field name="PROPERTY_EXTENDED_PROPS" />
+ <field name="PROPERTY_INDICATE" />
+ <field name="PROPERTY_NOTIFY" />
+ <field name="PROPERTY_READ" />
+ <field name="PROPERTY_SIGNED_WRITE" />
+ <field name="PROPERTY_WRITE" />
+ <field name="PROPERTY_WRITE_NO_RESPONSE" />
+ <field name="WRITE_TYPE_DEFAULT" />
+ <field name="WRITE_TYPE_NO_RESPONSE" />
+ <field name="WRITE_TYPE_SIGNED" />
+ <field name="mDescriptors" />
+ </class>
+ <class name="android/bluetooth/BluetoothGattDescriptor" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/util/UUID;I)V" />
+ <method name="getCharacteristic()Landroid/bluetooth/BluetoothGattCharacteristic;" />
+ <method name="getPermissions()I" />
+ <method name="getUuid()Ljava/util/UUID;" />
+ <method name="getValue()[B" />
+ <method name="setValue([B)Z" />
+ <field name="DISABLE_NOTIFICATION_VALUE" />
+ <field name="ENABLE_INDICATION_VALUE" />
+ <field name="ENABLE_NOTIFICATION_VALUE" />
+ <field name="PERMISSION_READ" />
+ <field name="PERMISSION_READ_ENCRYPTED" />
+ <field name="PERMISSION_READ_ENCRYPTED_MITM" />
+ <field name="PERMISSION_WRITE" />
+ <field name="PERMISSION_WRITE_ENCRYPTED" />
+ <field name="PERMISSION_WRITE_ENCRYPTED_MITM" />
+ <field name="PERMISSION_WRITE_SIGNED" />
+ <field name="PERMISSION_WRITE_SIGNED_MITM" />
+ </class>
+ <class name="android/bluetooth/BluetoothGattServer" since="18">
+ <extends name="java/lang/Object" />
+ <implements name="android/bluetooth/BluetoothProfile" />
+ <method name="&lt;init>()V" />
+ <method name="addService(Landroid/bluetooth/BluetoothGattService;)Z" />
+ <method name="cancelConnection(Landroid/bluetooth/BluetoothDevice;)V" />
+ <method name="clearServices()V" />
+ <method name="close()V" />
+ <method name="connect(Landroid/bluetooth/BluetoothDevice;Z)Z" />
+ <method name="getService(Ljava/util/UUID;)Landroid/bluetooth/BluetoothGattService;" />
+ <method name="getServices()Ljava/util/List;" />
+ <method name="notifyCharacteristicChanged(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothGattCharacteristic;Z)Z" />
+ <method name="removeService(Landroid/bluetooth/BluetoothGattService;)Z" />
+ <method name="sendResponse(Landroid/bluetooth/BluetoothDevice;III[B)Z" />
+ </class>
+ <class name="android/bluetooth/BluetoothGattServerCallback" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onCharacteristicReadRequest(Landroid/bluetooth/BluetoothDevice;IILandroid/bluetooth/BluetoothGattCharacteristic;)V" />
+ <method name="onCharacteristicWriteRequest(Landroid/bluetooth/BluetoothDevice;ILandroid/bluetooth/BluetoothGattCharacteristic;ZZI[B)V" />
+ <method name="onConnectionStateChange(Landroid/bluetooth/BluetoothDevice;II)V" />
+ <method name="onDescriptorReadRequest(Landroid/bluetooth/BluetoothDevice;IILandroid/bluetooth/BluetoothGattDescriptor;)V" />
+ <method name="onDescriptorWriteRequest(Landroid/bluetooth/BluetoothDevice;ILandroid/bluetooth/BluetoothGattDescriptor;ZZI[B)V" />
+ <method name="onExecuteWrite(Landroid/bluetooth/BluetoothDevice;IZ)V" />
+ <method name="onNotificationSent(Landroid/bluetooth/BluetoothDevice;I)V" since="21" />
+ <method name="onServiceAdded(ILandroid/bluetooth/BluetoothGattService;)V" />
+ </class>
+ <class name="android/bluetooth/BluetoothGattService" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/util/UUID;I)V" />
+ <method name="addCharacteristic(Landroid/bluetooth/BluetoothGattCharacteristic;)Z" />
+ <method name="addService(Landroid/bluetooth/BluetoothGattService;)Z" />
+ <method name="getCharacteristic(Ljava/util/UUID;)Landroid/bluetooth/BluetoothGattCharacteristic;" />
+ <method name="getCharacteristics()Ljava/util/List;" />
+ <method name="getIncludedServices()Ljava/util/List;" />
+ <method name="getInstanceId()I" />
+ <method name="getType()I" />
+ <method name="getUuid()Ljava/util/UUID;" />
+ <field name="SERVICE_TYPE_PRIMARY" />
+ <field name="SERVICE_TYPE_SECONDARY" />
+ <field name="mCharacteristics" />
+ <field name="mIncludedServices" />
+ </class>
+ <class name="android/bluetooth/BluetoothHeadset" since="11">
+ <extends name="java/lang/Object" />
+ <implements name="android/bluetooth/BluetoothProfile" />
+ <method name="&lt;init>()V" />
+ <method name="isAudioConnected(Landroid/bluetooth/BluetoothDevice;)Z" />
+ <method name="sendVendorSpecificResultCode(Landroid/bluetooth/BluetoothDevice;Ljava/lang/String;Ljava/lang/String;)Z" since="19" />
+ <method name="startVoiceRecognition(Landroid/bluetooth/BluetoothDevice;)Z" />
+ <method name="stopVoiceRecognition(Landroid/bluetooth/BluetoothDevice;)Z" />
+ <field name="ACTION_AUDIO_STATE_CHANGED" />
+ <field name="ACTION_CONNECTION_STATE_CHANGED" />
+ <field name="ACTION_VENDOR_SPECIFIC_HEADSET_EVENT" />
+ <field name="AT_CMD_TYPE_ACTION" />
+ <field name="AT_CMD_TYPE_BASIC" />
+ <field name="AT_CMD_TYPE_READ" />
+ <field name="AT_CMD_TYPE_SET" />
+ <field name="AT_CMD_TYPE_TEST" />
+ <field name="EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_ARGS" />
+ <field name="EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD" />
+ <field name="EXTRA_VENDOR_SPECIFIC_HEADSET_EVENT_CMD_TYPE" />
+ <field name="STATE_AUDIO_CONNECTED" />
+ <field name="STATE_AUDIO_CONNECTING" />
+ <field name="STATE_AUDIO_DISCONNECTED" />
+ <field name="VENDOR_RESULT_CODE_COMMAND_ANDROID" since="19" />
+ <field name="VENDOR_SPECIFIC_HEADSET_EVENT_COMPANY_ID_CATEGORY" />
+ </class>
+ <class name="android/bluetooth/BluetoothHealth" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/bluetooth/BluetoothProfile" />
+ <method name="&lt;init>()V" />
+ <method name="connectChannelToSource(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHealthAppConfiguration;)Z" />
+ <method name="disconnectChannel(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHealthAppConfiguration;I)Z" />
+ <method name="getMainChannelFd(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/BluetoothHealthAppConfiguration;)Landroid/os/ParcelFileDescriptor;" />
+ <method name="registerSinkAppConfiguration(Ljava/lang/String;ILandroid/bluetooth/BluetoothHealthCallback;)Z" />
+ <method name="unregisterAppConfiguration(Landroid/bluetooth/BluetoothHealthAppConfiguration;)Z" />
+ <field name="APP_CONFIG_REGISTRATION_FAILURE" />
+ <field name="APP_CONFIG_REGISTRATION_SUCCESS" />
+ <field name="APP_CONFIG_UNREGISTRATION_FAILURE" />
+ <field name="APP_CONFIG_UNREGISTRATION_SUCCESS" />
+ <field name="CHANNEL_TYPE_RELIABLE" />
+ <field name="CHANNEL_TYPE_STREAMING" />
+ <field name="SINK_ROLE" />
+ <field name="SOURCE_ROLE" />
+ <field name="STATE_CHANNEL_CONNECTED" />
+ <field name="STATE_CHANNEL_CONNECTING" />
+ <field name="STATE_CHANNEL_DISCONNECTED" />
+ <field name="STATE_CHANNEL_DISCONNECTING" />
+ </class>
+ <class name="android/bluetooth/BluetoothHealthAppConfiguration" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getDataType()I" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getRole()I" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/bluetooth/BluetoothHealthCallback" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onHealthAppConfigurationStatusChange(Landroid/bluetooth/BluetoothHealthAppConfiguration;I)V" />
+ <method name="onHealthChannelStateChange(Landroid/bluetooth/BluetoothHealthAppConfiguration;Landroid/bluetooth/BluetoothDevice;IILandroid/os/ParcelFileDescriptor;I)V" />
+ </class>
+ <class name="android/bluetooth/BluetoothManager" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getAdapter()Landroid/bluetooth/BluetoothAdapter;" />
+ <method name="getConnectedDevices(I)Ljava/util/List;" />
+ <method name="getConnectionState(Landroid/bluetooth/BluetoothDevice;I)I" />
+ <method name="getDevicesMatchingConnectionStates(I[I)Ljava/util/List;" />
+ <method name="openGattServer(Landroid/content/Context;Landroid/bluetooth/BluetoothGattServerCallback;)Landroid/bluetooth/BluetoothGattServer;" />
+ </class>
+ <class name="android/bluetooth/BluetoothProfile" since="11">
+ <extends name="java/lang/Object" />
+ <method name="getConnectedDevices()Ljava/util/List;" />
+ <method name="getConnectionState(Landroid/bluetooth/BluetoothDevice;)I" />
+ <method name="getDevicesMatchingConnectionStates([I)Ljava/util/List;" />
+ <field name="A2DP" />
+ <field name="EXTRA_PREVIOUS_STATE" />
+ <field name="EXTRA_STATE" />
+ <field name="GATT" since="18" />
+ <field name="GATT_SERVER" since="18" />
+ <field name="HEADSET" />
+ <field name="HEALTH" since="14" />
+ <field name="STATE_CONNECTED" />
+ <field name="STATE_CONNECTING" />
+ <field name="STATE_DISCONNECTED" />
+ <field name="STATE_DISCONNECTING" />
+ </class>
+ <class name="android/bluetooth/BluetoothProfile$ServiceListener" since="11">
+ <extends name="java/lang/Object" />
+ <method name="onServiceConnected(ILandroid/bluetooth/BluetoothProfile;)V" />
+ <method name="onServiceDisconnected(I)V" />
+ </class>
+ <class name="android/bluetooth/BluetoothServerSocket" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Closeable" />
+ <method name="&lt;init>()V" />
+ <method name="accept()Landroid/bluetooth/BluetoothSocket;" />
+ <method name="accept(I)Landroid/bluetooth/BluetoothSocket;" />
+ </class>
+ <class name="android/bluetooth/BluetoothSocket" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Closeable" />
+ <method name="&lt;init>()V" />
+ <method name="connect()V" />
+ <method name="getInputStream()Ljava/io/InputStream;" />
+ <method name="getOutputStream()Ljava/io/OutputStream;" />
+ <method name="getRemoteDevice()Landroid/bluetooth/BluetoothDevice;" />
+ <method name="isConnected()Z" since="14" />
+ </class>
+ <class name="android/bluetooth/le/AdvertiseCallback" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onStartFailure(I)V" />
+ <method name="onStartSuccess(Landroid/bluetooth/le/AdvertiseSettings;)V" />
+ <field name="ADVERTISE_FAILED_ALREADY_STARTED" />
+ <field name="ADVERTISE_FAILED_DATA_TOO_LARGE" />
+ <field name="ADVERTISE_FAILED_FEATURE_UNSUPPORTED" />
+ <field name="ADVERTISE_FAILED_INTERNAL_ERROR" />
+ <field name="ADVERTISE_FAILED_TOO_MANY_ADVERTISERS" />
+ </class>
+ <class name="android/bluetooth/le/AdvertiseData" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getIncludeDeviceName()Z" />
+ <method name="getIncludeTxPowerLevel()Z" />
+ <method name="getManufacturerSpecificData()Landroid/util/SparseArray;" />
+ <method name="getServiceData()Ljava/util/Map;" />
+ <method name="getServiceUuids()Ljava/util/List;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/bluetooth/le/AdvertiseData$Builder" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addManufacturerData(I[B)Landroid/bluetooth/le/AdvertiseData$Builder;" />
+ <method name="addServiceData(Landroid/os/ParcelUuid;[B)Landroid/bluetooth/le/AdvertiseData$Builder;" />
+ <method name="addServiceUuid(Landroid/os/ParcelUuid;)Landroid/bluetooth/le/AdvertiseData$Builder;" />
+ <method name="build()Landroid/bluetooth/le/AdvertiseData;" />
+ <method name="setIncludeDeviceName(Z)Landroid/bluetooth/le/AdvertiseData$Builder;" />
+ <method name="setIncludeTxPowerLevel(Z)Landroid/bluetooth/le/AdvertiseData$Builder;" />
+ </class>
+ <class name="android/bluetooth/le/AdvertiseSettings" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getMode()I" />
+ <method name="getTimeout()I" />
+ <method name="getTxPowerLevel()I" />
+ <method name="isConnectable()Z" />
+ <field name="ADVERTISE_MODE_BALANCED" />
+ <field name="ADVERTISE_MODE_LOW_LATENCY" />
+ <field name="ADVERTISE_MODE_LOW_POWER" />
+ <field name="ADVERTISE_TX_POWER_HIGH" />
+ <field name="ADVERTISE_TX_POWER_LOW" />
+ <field name="ADVERTISE_TX_POWER_MEDIUM" />
+ <field name="ADVERTISE_TX_POWER_ULTRA_LOW" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/bluetooth/le/AdvertiseSettings$Builder" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="build()Landroid/bluetooth/le/AdvertiseSettings;" />
+ <method name="setAdvertiseMode(I)Landroid/bluetooth/le/AdvertiseSettings$Builder;" />
+ <method name="setConnectable(Z)Landroid/bluetooth/le/AdvertiseSettings$Builder;" />
+ <method name="setTimeout(I)Landroid/bluetooth/le/AdvertiseSettings$Builder;" />
+ <method name="setTxPowerLevel(I)Landroid/bluetooth/le/AdvertiseSettings$Builder;" />
+ </class>
+ <class name="android/bluetooth/le/BluetoothLeAdvertiser" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="startAdvertising(Landroid/bluetooth/le/AdvertiseSettings;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertiseCallback;)V" />
+ <method name="startAdvertising(Landroid/bluetooth/le/AdvertiseSettings;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertiseData;Landroid/bluetooth/le/AdvertiseCallback;)V" />
+ <method name="stopAdvertising(Landroid/bluetooth/le/AdvertiseCallback;)V" />
+ </class>
+ <class name="android/bluetooth/le/BluetoothLeScanner" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="flushPendingScanResults(Landroid/bluetooth/le/ScanCallback;)V" />
+ <method name="startScan(Landroid/bluetooth/le/ScanCallback;)V" />
+ <method name="startScan(Ljava/util/List;Landroid/bluetooth/le/ScanSettings;Landroid/bluetooth/le/ScanCallback;)V" />
+ <method name="stopScan(Landroid/bluetooth/le/ScanCallback;)V" />
+ </class>
+ <class name="android/bluetooth/le/ScanCallback" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onBatchScanResults(Ljava/util/List;)V" />
+ <method name="onScanFailed(I)V" />
+ <method name="onScanResult(ILandroid/bluetooth/le/ScanResult;)V" />
+ <field name="SCAN_FAILED_ALREADY_STARTED" />
+ <field name="SCAN_FAILED_APPLICATION_REGISTRATION_FAILED" />
+ <field name="SCAN_FAILED_FEATURE_UNSUPPORTED" />
+ <field name="SCAN_FAILED_INTERNAL_ERROR" />
+ </class>
+ <class name="android/bluetooth/le/ScanFilter" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getDeviceAddress()Ljava/lang/String;" />
+ <method name="getDeviceName()Ljava/lang/String;" />
+ <method name="getManufacturerData()[B" />
+ <method name="getManufacturerDataMask()[B" />
+ <method name="getManufacturerId()I" />
+ <method name="getServiceData()[B" />
+ <method name="getServiceDataMask()[B" />
+ <method name="getServiceDataUuid()Landroid/os/ParcelUuid;" />
+ <method name="getServiceUuid()Landroid/os/ParcelUuid;" />
+ <method name="getServiceUuidMask()Landroid/os/ParcelUuid;" />
+ <method name="matches(Landroid/bluetooth/le/ScanResult;)Z" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/bluetooth/le/ScanFilter$Builder" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="build()Landroid/bluetooth/le/ScanFilter;" />
+ <method name="setDeviceAddress(Ljava/lang/String;)Landroid/bluetooth/le/ScanFilter$Builder;" />
+ <method name="setDeviceName(Ljava/lang/String;)Landroid/bluetooth/le/ScanFilter$Builder;" />
+ <method name="setManufacturerData(I[B)Landroid/bluetooth/le/ScanFilter$Builder;" />
+ <method name="setManufacturerData(I[B[B)Landroid/bluetooth/le/ScanFilter$Builder;" />
+ <method name="setServiceData(Landroid/os/ParcelUuid;[B)Landroid/bluetooth/le/ScanFilter$Builder;" />
+ <method name="setServiceData(Landroid/os/ParcelUuid;[B[B)Landroid/bluetooth/le/ScanFilter$Builder;" />
+ <method name="setServiceUuid(Landroid/os/ParcelUuid;)Landroid/bluetooth/le/ScanFilter$Builder;" />
+ <method name="setServiceUuid(Landroid/os/ParcelUuid;Landroid/os/ParcelUuid;)Landroid/bluetooth/le/ScanFilter$Builder;" />
+ </class>
+ <class name="android/bluetooth/le/ScanRecord" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getAdvertiseFlags()I" />
+ <method name="getBytes()[B" />
+ <method name="getDeviceName()Ljava/lang/String;" />
+ <method name="getManufacturerSpecificData()Landroid/util/SparseArray;" />
+ <method name="getManufacturerSpecificData(I)[B" />
+ <method name="getServiceData()Ljava/util/Map;" />
+ <method name="getServiceData(Landroid/os/ParcelUuid;)[B" />
+ <method name="getServiceUuids()Ljava/util/List;" />
+ <method name="getTxPowerLevel()I" />
+ </class>
+ <class name="android/bluetooth/le/ScanResult" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/bluetooth/BluetoothDevice;Landroid/bluetooth/le/ScanRecord;IJ)V" />
+ <method name="getDevice()Landroid/bluetooth/BluetoothDevice;" />
+ <method name="getRssi()I" />
+ <method name="getScanRecord()Landroid/bluetooth/le/ScanRecord;" />
+ <method name="getTimestampNanos()J" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/bluetooth/le/ScanSettings" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getCallbackType()I" />
+ <method name="getReportDelayMillis()J" />
+ <method name="getScanMode()I" />
+ <method name="getScanResultType()I" />
+ <field name="CALLBACK_TYPE_ALL_MATCHES" />
+ <field name="CREATOR" />
+ <field name="SCAN_MODE_BALANCED" />
+ <field name="SCAN_MODE_LOW_LATENCY" />
+ <field name="SCAN_MODE_LOW_POWER" />
+ </class>
+ <class name="android/bluetooth/le/ScanSettings$Builder" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="build()Landroid/bluetooth/le/ScanSettings;" />
+ <method name="setReportDelay(J)Landroid/bluetooth/le/ScanSettings$Builder;" />
+ <method name="setScanMode(I)Landroid/bluetooth/le/ScanSettings$Builder;" />
+ </class>
+ <class name="android/content/AbstractThreadedSyncAdapter" since="5">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;Z)V" />
+ <method name="&lt;init>(Landroid/content/Context;ZZ)V" since="11" />
+ <method name="getContext()Landroid/content/Context;" />
+ <method name="getSyncAdapterBinder()Landroid/os/IBinder;" />
+ <method name="onPerformSync(Landroid/accounts/Account;Landroid/os/Bundle;Ljava/lang/String;Landroid/content/ContentProviderClient;Landroid/content/SyncResult;)V" />
+ <method name="onSyncCanceled()V" since="8" />
+ <method name="onSyncCanceled(Ljava/lang/Thread;)V" since="11" />
+ <field name="LOG_SYNC_DETAILS" />
+ </class>
+ <class name="android/content/ActivityNotFoundException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/content/AsyncQueryHandler" since="1">
+ <extends name="android/os/Handler" />
+ <method name="&lt;init>(Landroid/content/ContentResolver;)V" />
+ <method name="cancelOperation(I)V" />
+ <method name="createHandler(Landroid/os/Looper;)Landroid/os/Handler;" />
+ <method name="onDeleteComplete(ILjava/lang/Object;I)V" />
+ <method name="onInsertComplete(ILjava/lang/Object;Landroid/net/Uri;)V" />
+ <method name="onQueryComplete(ILjava/lang/Object;Landroid/database/Cursor;)V" />
+ <method name="onUpdateComplete(ILjava/lang/Object;I)V" />
+ <method name="startDelete(ILjava/lang/Object;Landroid/net/Uri;Ljava/lang/String;[Ljava/lang/String;)V" />
+ <method name="startInsert(ILjava/lang/Object;Landroid/net/Uri;Landroid/content/ContentValues;)V" />
+ <method name="startQuery(ILjava/lang/Object;Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="startUpdate(ILjava/lang/Object;Landroid/net/Uri;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;)V" />
+ </class>
+ <class name="android/content/AsyncQueryHandler$WorkerArgs" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="cookie" />
+ <field name="handler" />
+ <field name="orderBy" />
+ <field name="projection" />
+ <field name="result" />
+ <field name="selection" />
+ <field name="selectionArgs" />
+ <field name="uri" />
+ <field name="values" />
+ </class>
+ <class name="android/content/AsyncQueryHandler$WorkerHandler" since="1">
+ <extends name="android/os/Handler" />
+ <method name="&lt;init>(Landroid/content/AsyncQueryHandler;Landroid/os/Looper;)V" />
+ </class>
+ <class name="android/content/AsyncTaskLoader" since="11">
+ <extends name="android/content/Loader" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="cancelLoad()Z" />
+ <method name="cancelLoadInBackground()V" since="16" />
+ <method name="isLoadInBackgroundCanceled()Z" since="16" />
+ <method name="loadInBackground()Ljava/lang/Object;" />
+ <method name="onCanceled(Ljava/lang/Object;)V" />
+ <method name="onLoadInBackground()Ljava/lang/Object;" />
+ <method name="setUpdateThrottle(J)V" />
+ </class>
+ <class name="android/content/BroadcastReceiver" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="abortBroadcast()V" />
+ <method name="clearAbortBroadcast()V" />
+ <method name="getAbortBroadcast()Z" />
+ <method name="getDebugUnregister()Z" />
+ <method name="getResultCode()I" />
+ <method name="getResultData()Ljava/lang/String;" />
+ <method name="getResultExtras(Z)Landroid/os/Bundle;" />
+ <method name="goAsync()Landroid/content/BroadcastReceiver$PendingResult;" since="11" />
+ <method name="isInitialStickyBroadcast()Z" since="5" />
+ <method name="isOrderedBroadcast()Z" since="5" />
+ <method name="onReceive(Landroid/content/Context;Landroid/content/Intent;)V" />
+ <method name="peekService(Landroid/content/Context;Landroid/content/Intent;)Landroid/os/IBinder;" since="3" />
+ <method name="setDebugUnregister(Z)V" />
+ <method name="setOrderedHint(Z)V" />
+ <method name="setResult(ILjava/lang/String;Landroid/os/Bundle;)V" />
+ <method name="setResultCode(I)V" />
+ <method name="setResultData(Ljava/lang/String;)V" />
+ <method name="setResultExtras(Landroid/os/Bundle;)V" />
+ </class>
+ <class name="android/content/BroadcastReceiver$PendingResult" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="abortBroadcast()V" />
+ <method name="clearAbortBroadcast()V" />
+ <method name="finish()V" />
+ <method name="getAbortBroadcast()Z" />
+ <method name="getResultCode()I" />
+ <method name="getResultData()Ljava/lang/String;" />
+ <method name="getResultExtras(Z)Landroid/os/Bundle;" />
+ <method name="setResult(ILjava/lang/String;Landroid/os/Bundle;)V" />
+ <method name="setResultCode(I)V" />
+ <method name="setResultData(Ljava/lang/String;)V" />
+ <method name="setResultExtras(Landroid/os/Bundle;)V" />
+ </class>
+ <class name="android/content/ClipData" since="11">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/content/ClipData;)V" since="16" />
+ <method name="&lt;init>(Landroid/content/ClipDescription;Landroid/content/ClipData$Item;)V" />
+ <method name="&lt;init>(Ljava/lang/CharSequence;[Ljava/lang/String;Landroid/content/ClipData$Item;)V" />
+ <method name="addItem(Landroid/content/ClipData$Item;)V" />
+ <method name="getDescription()Landroid/content/ClipDescription;" />
+ <method name="getItemAt(I)Landroid/content/ClipData$Item;" />
+ <method name="getItemCount()I" />
+ <method name="newHtmlText(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/String;)Landroid/content/ClipData;" since="16" />
+ <method name="newIntent(Ljava/lang/CharSequence;Landroid/content/Intent;)Landroid/content/ClipData;" />
+ <method name="newPlainText(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Landroid/content/ClipData;" />
+ <method name="newRawUri(Ljava/lang/CharSequence;Landroid/net/Uri;)Landroid/content/ClipData;" />
+ <method name="newUri(Landroid/content/ContentResolver;Ljava/lang/CharSequence;Landroid/net/Uri;)Landroid/content/ClipData;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/content/ClipData$Item" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Intent;)V" />
+ <method name="&lt;init>(Landroid/net/Uri;)V" />
+ <method name="&lt;init>(Ljava/lang/CharSequence;)V" />
+ <method name="&lt;init>(Ljava/lang/CharSequence;Landroid/content/Intent;Landroid/net/Uri;)V" />
+ <method name="&lt;init>(Ljava/lang/CharSequence;Ljava/lang/String;)V" since="16" />
+ <method name="&lt;init>(Ljava/lang/CharSequence;Ljava/lang/String;Landroid/content/Intent;Landroid/net/Uri;)V" since="16" />
+ <method name="coerceToHtmlText(Landroid/content/Context;)Ljava/lang/String;" since="16" />
+ <method name="coerceToStyledText(Landroid/content/Context;)Ljava/lang/CharSequence;" since="16" />
+ <method name="coerceToText(Landroid/content/Context;)Ljava/lang/CharSequence;" />
+ <method name="getHtmlText()Ljava/lang/String;" since="16" />
+ <method name="getIntent()Landroid/content/Intent;" />
+ <method name="getText()Ljava/lang/CharSequence;" />
+ <method name="getUri()Landroid/net/Uri;" />
+ </class>
+ <class name="android/content/ClipDescription" since="11">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/content/ClipDescription;)V" />
+ <method name="&lt;init>(Ljava/lang/CharSequence;[Ljava/lang/String;)V" />
+ <method name="compareMimeTypes(Ljava/lang/String;Ljava/lang/String;)Z" />
+ <method name="filterMimeTypes(Ljava/lang/String;)[Ljava/lang/String;" />
+ <method name="getLabel()Ljava/lang/CharSequence;" />
+ <method name="getMimeType(I)Ljava/lang/String;" />
+ <method name="getMimeTypeCount()I" />
+ <method name="hasMimeType(Ljava/lang/String;)Z" />
+ <field name="CREATOR" />
+ <field name="MIMETYPE_TEXT_HTML" since="16" />
+ <field name="MIMETYPE_TEXT_INTENT" />
+ <field name="MIMETYPE_TEXT_PLAIN" />
+ <field name="MIMETYPE_TEXT_URILIST" />
+ </class>
+ <class name="android/content/ClipboardManager" since="11">
+ <extends name="android/text/ClipboardManager" />
+ <method name="&lt;init>()V" />
+ <method name="addPrimaryClipChangedListener(Landroid/content/ClipboardManager$OnPrimaryClipChangedListener;)V" />
+ <method name="getPrimaryClip()Landroid/content/ClipData;" />
+ <method name="getPrimaryClipDescription()Landroid/content/ClipDescription;" />
+ <method name="hasPrimaryClip()Z" />
+ <method name="removePrimaryClipChangedListener(Landroid/content/ClipboardManager$OnPrimaryClipChangedListener;)V" />
+ <method name="setPrimaryClip(Landroid/content/ClipData;)V" />
+ </class>
+ <class name="android/content/ClipboardManager$OnPrimaryClipChangedListener" since="11">
+ <extends name="java/lang/Object" />
+ <method name="onPrimaryClipChanged()V" />
+ </class>
+ <class name="android/content/ComponentCallbacks" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onConfigurationChanged(Landroid/content/res/Configuration;)V" />
+ <method name="onLowMemory()V" />
+ </class>
+ <class name="android/content/ComponentCallbacks2" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/content/ComponentCallbacks" />
+ <method name="onTrimMemory(I)V" />
+ <field name="TRIM_MEMORY_BACKGROUND" />
+ <field name="TRIM_MEMORY_COMPLETE" />
+ <field name="TRIM_MEMORY_MODERATE" />
+ <field name="TRIM_MEMORY_RUNNING_CRITICAL" since="16" />
+ <field name="TRIM_MEMORY_RUNNING_LOW" since="16" />
+ <field name="TRIM_MEMORY_RUNNING_MODERATE" since="16" />
+ <field name="TRIM_MEMORY_UI_HIDDEN" />
+ </class>
+ <class name="android/content/ComponentName" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <implements name="java/lang/Cloneable" since="8" />
+ <implements name="java/lang/Comparable" since="4" />
+ <method name="&lt;init>(Landroid/content/Context;Ljava/lang/Class;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="clone()Landroid/content/ComponentName;" since="8" />
+ <method name="compareTo(Landroid/content/ComponentName;)I" since="4" />
+ <method name="flattenToShortString()Ljava/lang/String;" />
+ <method name="flattenToString()Ljava/lang/String;" />
+ <method name="getClassName()Ljava/lang/String;" />
+ <method name="getPackageName()Ljava/lang/String;" />
+ <method name="getShortClassName()Ljava/lang/String;" />
+ <method name="readFromParcel(Landroid/os/Parcel;)Landroid/content/ComponentName;" />
+ <method name="toShortString()Ljava/lang/String;" />
+ <method name="unflattenFromString(Ljava/lang/String;)Landroid/content/ComponentName;" />
+ <method name="writeToParcel(Landroid/content/ComponentName;Landroid/os/Parcel;)V" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/content/ContentProvider" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/content/ComponentCallbacks" />
+ <implements name="android/content/ComponentCallbacks2" since="14" />
+ <method name="&lt;init>()V" />
+ <method name="applyBatch(Ljava/util/ArrayList;)[Landroid/content/ContentProviderResult;" since="5" />
+ <method name="attachInfo(Landroid/content/Context;Landroid/content/pm/ProviderInfo;)V" />
+ <method name="bulkInsert(Landroid/net/Uri;[Landroid/content/ContentValues;)I" />
+ <method name="call(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;" since="11" />
+ <method name="canonicalize(Landroid/net/Uri;)Landroid/net/Uri;" since="19" />
+ <method name="delete(Landroid/net/Uri;Ljava/lang/String;[Ljava/lang/String;)I" />
+ <method name="dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V" since="18" />
+ <method name="getCallingPackage()Ljava/lang/String;" since="19" />
+ <method name="getContext()Landroid/content/Context;" />
+ <method name="getPathPermissions()[Landroid/content/pm/PathPermission;" since="4" />
+ <method name="getReadPermission()Ljava/lang/String;" />
+ <method name="getStreamTypes(Landroid/net/Uri;Ljava/lang/String;)[Ljava/lang/String;" since="11" />
+ <method name="getType(Landroid/net/Uri;)Ljava/lang/String;" />
+ <method name="getWritePermission()Ljava/lang/String;" />
+ <method name="insert(Landroid/net/Uri;Landroid/content/ContentValues;)Landroid/net/Uri;" />
+ <method name="isTemporary()Z" />
+ <method name="onCreate()Z" />
+ <method name="openAssetFile(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/res/AssetFileDescriptor;" since="3" />
+ <method name="openAssetFile(Landroid/net/Uri;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;" since="19" />
+ <method name="openFile(Landroid/net/Uri;Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;" />
+ <method name="openFile(Landroid/net/Uri;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/os/ParcelFileDescriptor;" since="19" />
+ <method name="openFileHelper(Landroid/net/Uri;Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;" />
+ <method name="openPipeHelper(Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;Ljava/lang/Object;Landroid/content/ContentProvider$PipeDataWriter;)Landroid/os/ParcelFileDescriptor;" since="11" />
+ <method name="openTypedAssetFile(Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;)Landroid/content/res/AssetFileDescriptor;" since="11" />
+ <method name="openTypedAssetFile(Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;" since="19" />
+ <method name="query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;" />
+ <method name="query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;" since="16" />
+ <method name="setPathPermissions([Landroid/content/pm/PathPermission;)V" since="4" />
+ <method name="setReadPermission(Ljava/lang/String;)V" />
+ <method name="setWritePermission(Ljava/lang/String;)V" />
+ <method name="shutdown()V" since="11" />
+ <method name="uncanonicalize(Landroid/net/Uri;)Landroid/net/Uri;" since="19" />
+ <method name="update(Landroid/net/Uri;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;)I" />
+ </class>
+ <class name="android/content/ContentProvider$PipeDataWriter" since="11">
+ <extends name="java/lang/Object" />
+ <method name="writeDataToPipe(Landroid/os/ParcelFileDescriptor;Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;Ljava/lang/Object;)V" />
+ </class>
+ <class name="android/content/ContentProviderClient" since="5">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="applyBatch(Ljava/util/ArrayList;)[Landroid/content/ContentProviderResult;" />
+ <method name="bulkInsert(Landroid/net/Uri;[Landroid/content/ContentValues;)I" />
+ <method name="call(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;" since="17" />
+ <method name="canonicalize(Landroid/net/Uri;)Landroid/net/Uri;" since="19" />
+ <method name="delete(Landroid/net/Uri;Ljava/lang/String;[Ljava/lang/String;)I" />
+ <method name="getLocalContentProvider()Landroid/content/ContentProvider;" />
+ <method name="getStreamTypes(Landroid/net/Uri;Ljava/lang/String;)[Ljava/lang/String;" since="11" />
+ <method name="getType(Landroid/net/Uri;)Ljava/lang/String;" />
+ <method name="insert(Landroid/net/Uri;Landroid/content/ContentValues;)Landroid/net/Uri;" />
+ <method name="openAssetFile(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/res/AssetFileDescriptor;" />
+ <method name="openAssetFile(Landroid/net/Uri;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;" since="19" />
+ <method name="openFile(Landroid/net/Uri;Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;" />
+ <method name="openFile(Landroid/net/Uri;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/os/ParcelFileDescriptor;" since="19" />
+ <method name="openTypedAssetFileDescriptor(Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;)Landroid/content/res/AssetFileDescriptor;" since="11" />
+ <method name="openTypedAssetFileDescriptor(Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;" since="19" />
+ <method name="query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;" />
+ <method name="query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;" since="16" />
+ <method name="release()Z" />
+ <method name="uncanonicalize(Landroid/net/Uri;)Landroid/net/Uri;" since="19" />
+ <method name="update(Landroid/net/Uri;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;)I" />
+ </class>
+ <class name="android/content/ContentProviderOperation" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="apply(Landroid/content/ContentProvider;[Landroid/content/ContentProviderResult;I)Landroid/content/ContentProviderResult;" />
+ <method name="getUri()Landroid/net/Uri;" />
+ <method name="isReadOperation()Z" />
+ <method name="isWriteOperation()Z" />
+ <method name="isYieldAllowed()Z" />
+ <method name="newAssertQuery(Landroid/net/Uri;)Landroid/content/ContentProviderOperation$Builder;" />
+ <method name="newDelete(Landroid/net/Uri;)Landroid/content/ContentProviderOperation$Builder;" />
+ <method name="newInsert(Landroid/net/Uri;)Landroid/content/ContentProviderOperation$Builder;" />
+ <method name="newUpdate(Landroid/net/Uri;)Landroid/content/ContentProviderOperation$Builder;" />
+ <method name="resolveSelectionArgsBackReferences([Landroid/content/ContentProviderResult;I)[Ljava/lang/String;" />
+ <method name="resolveValueBackReferences([Landroid/content/ContentProviderResult;I)Landroid/content/ContentValues;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/content/ContentProviderOperation$Builder" since="5">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="build()Landroid/content/ContentProviderOperation;" />
+ <method name="withExpectedCount(I)Landroid/content/ContentProviderOperation$Builder;" />
+ <method name="withSelection(Ljava/lang/String;[Ljava/lang/String;)Landroid/content/ContentProviderOperation$Builder;" />
+ <method name="withSelectionBackReference(II)Landroid/content/ContentProviderOperation$Builder;" />
+ <method name="withValue(Ljava/lang/String;Ljava/lang/Object;)Landroid/content/ContentProviderOperation$Builder;" />
+ <method name="withValueBackReference(Ljava/lang/String;I)Landroid/content/ContentProviderOperation$Builder;" />
+ <method name="withValueBackReferences(Landroid/content/ContentValues;)Landroid/content/ContentProviderOperation$Builder;" />
+ <method name="withValues(Landroid/content/ContentValues;)Landroid/content/ContentProviderOperation$Builder;" />
+ <method name="withYieldAllowed(Z)Landroid/content/ContentProviderOperation$Builder;" />
+ </class>
+ <class name="android/content/ContentProviderResult" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Landroid/net/Uri;)V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <field name="CREATOR" />
+ <field name="count" />
+ <field name="uri" />
+ </class>
+ <class name="android/content/ContentQueryMap" since="1">
+ <extends name="java/util/Observable" />
+ <method name="&lt;init>(Landroid/database/Cursor;Ljava/lang/String;ZLandroid/os/Handler;)V" />
+ <method name="close()V" />
+ <method name="getRows()Ljava/util/Map;" />
+ <method name="getValues(Ljava/lang/String;)Landroid/content/ContentValues;" />
+ <method name="requery()V" />
+ <method name="setKeepUpdated(Z)V" />
+ </class>
+ <class name="android/content/ContentResolver" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="acquireContentProviderClient(Landroid/net/Uri;)Landroid/content/ContentProviderClient;" since="5" />
+ <method name="acquireContentProviderClient(Ljava/lang/String;)Landroid/content/ContentProviderClient;" since="5" />
+ <method name="acquireUnstableContentProviderClient(Landroid/net/Uri;)Landroid/content/ContentProviderClient;" since="16" />
+ <method name="acquireUnstableContentProviderClient(Ljava/lang/String;)Landroid/content/ContentProviderClient;" since="16" />
+ <method name="addPeriodicSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;J)V" since="8" />
+ <method name="addStatusChangeListener(ILandroid/content/SyncStatusObserver;)Ljava/lang/Object;" since="5" />
+ <method name="applyBatch(Ljava/lang/String;Ljava/util/ArrayList;)[Landroid/content/ContentProviderResult;" since="5" />
+ <method name="bulkInsert(Landroid/net/Uri;[Landroid/content/ContentValues;)I" />
+ <method name="call(Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;" since="11" />
+ <method name="cancelSync(Landroid/accounts/Account;Ljava/lang/String;)V" since="5" />
+ <method name="cancelSync(Landroid/content/SyncRequest;)V" since="21" />
+ <method name="cancelSync(Landroid/net/Uri;)V" />
+ <method name="canonicalize(Landroid/net/Uri;)Landroid/net/Uri;" since="19" />
+ <method name="delete(Landroid/net/Uri;Ljava/lang/String;[Ljava/lang/String;)I" />
+ <method name="getCurrentSync()Landroid/content/SyncInfo;" since="8" />
+ <method name="getCurrentSyncs()Ljava/util/List;" since="11" />
+ <method name="getIsSyncable(Landroid/accounts/Account;Ljava/lang/String;)I" since="5" />
+ <method name="getMasterSyncAutomatically()Z" since="5" />
+ <method name="getOutgoingPersistedUriPermissions()Ljava/util/List;" since="19" />
+ <method name="getPeriodicSyncs(Landroid/accounts/Account;Ljava/lang/String;)Ljava/util/List;" since="8" />
+ <method name="getPersistedUriPermissions()Ljava/util/List;" since="19" />
+ <method name="getStreamTypes(Landroid/net/Uri;Ljava/lang/String;)[Ljava/lang/String;" since="11" />
+ <method name="getSyncAdapterTypes()[Landroid/content/SyncAdapterType;" since="5" />
+ <method name="getSyncAutomatically(Landroid/accounts/Account;Ljava/lang/String;)Z" since="5" />
+ <method name="getType(Landroid/net/Uri;)Ljava/lang/String;" />
+ <method name="insert(Landroid/net/Uri;Landroid/content/ContentValues;)Landroid/net/Uri;" />
+ <method name="isSyncActive(Landroid/accounts/Account;Ljava/lang/String;)Z" since="5" />
+ <method name="isSyncPending(Landroid/accounts/Account;Ljava/lang/String;)Z" since="5" />
+ <method name="notifyChange(Landroid/net/Uri;Landroid/database/ContentObserver;)V" />
+ <method name="notifyChange(Landroid/net/Uri;Landroid/database/ContentObserver;Z)V" />
+ <method name="openAssetFileDescriptor(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/res/AssetFileDescriptor;" since="3" />
+ <method name="openAssetFileDescriptor(Landroid/net/Uri;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;" since="19" />
+ <method name="openFileDescriptor(Landroid/net/Uri;Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;" />
+ <method name="openFileDescriptor(Landroid/net/Uri;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/os/ParcelFileDescriptor;" since="19" />
+ <method name="openInputStream(Landroid/net/Uri;)Ljava/io/InputStream;" />
+ <method name="openOutputStream(Landroid/net/Uri;)Ljava/io/OutputStream;" />
+ <method name="openOutputStream(Landroid/net/Uri;Ljava/lang/String;)Ljava/io/OutputStream;" since="3" />
+ <method name="openTypedAssetFileDescriptor(Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;)Landroid/content/res/AssetFileDescriptor;" since="11" />
+ <method name="openTypedAssetFileDescriptor(Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;" since="19" />
+ <method name="query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;" />
+ <method name="query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;" since="16" />
+ <method name="registerContentObserver(Landroid/net/Uri;ZLandroid/database/ContentObserver;)V" />
+ <method name="releasePersistableUriPermission(Landroid/net/Uri;I)V" since="19" />
+ <method name="removePeriodicSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)V" since="8" />
+ <method name="removeStatusChangeListener(Ljava/lang/Object;)V" since="5" />
+ <method name="requestSync(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;)V" since="5" />
+ <method name="requestSync(Landroid/content/SyncRequest;)V" since="19" />
+ <method name="setIsSyncable(Landroid/accounts/Account;Ljava/lang/String;I)V" since="5" />
+ <method name="setMasterSyncAutomatically(Z)V" since="5" />
+ <method name="setSyncAutomatically(Landroid/accounts/Account;Ljava/lang/String;Z)V" since="5" />
+ <method name="startSync(Landroid/net/Uri;Landroid/os/Bundle;)V" />
+ <method name="takePersistableUriPermission(Landroid/net/Uri;I)V" since="19" />
+ <method name="uncanonicalize(Landroid/net/Uri;)Landroid/net/Uri;" since="19" />
+ <method name="unregisterContentObserver(Landroid/database/ContentObserver;)V" />
+ <method name="update(Landroid/net/Uri;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;)I" />
+ <method name="validateSyncExtrasBundle(Landroid/os/Bundle;)V" />
+ <field name="ANY_CURSOR_ITEM_TYPE" since="21" />
+ <field name="CURSOR_DIR_BASE_TYPE" />
+ <field name="CURSOR_ITEM_BASE_TYPE" />
+ <field name="EXTRA_SIZE" since="21" />
+ <field name="SCHEME_ANDROID_RESOURCE" />
+ <field name="SCHEME_CONTENT" />
+ <field name="SCHEME_FILE" />
+ <field name="SYNC_EXTRAS_ACCOUNT" />
+ <field name="SYNC_EXTRAS_DISCARD_LOCAL_DELETIONS" />
+ <field name="SYNC_EXTRAS_DO_NOT_RETRY" since="8" />
+ <field name="SYNC_EXTRAS_EXPEDITED" />
+ <field name="SYNC_EXTRAS_FORCE" />
+ <field name="SYNC_EXTRAS_IGNORE_BACKOFF" since="8" />
+ <field name="SYNC_EXTRAS_IGNORE_SETTINGS" since="8" />
+ <field name="SYNC_EXTRAS_INITIALIZE" since="5" />
+ <field name="SYNC_EXTRAS_MANUAL" since="5" />
+ <field name="SYNC_EXTRAS_OVERRIDE_TOO_MANY_DELETIONS" />
+ <field name="SYNC_EXTRAS_UPLOAD" />
+ <field name="SYNC_OBSERVER_TYPE_ACTIVE" since="8" />
+ <field name="SYNC_OBSERVER_TYPE_PENDING" since="8" />
+ <field name="SYNC_OBSERVER_TYPE_SETTINGS" since="8" />
+ </class>
+ <class name="android/content/ContentUris" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="appendId(Landroid/net/Uri$Builder;J)Landroid/net/Uri$Builder;" />
+ <method name="parseId(Landroid/net/Uri;)J" />
+ <method name="withAppendedId(Landroid/net/Uri;J)Landroid/net/Uri;" />
+ </class>
+ <class name="android/content/ContentValues" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Landroid/content/ContentValues;)V" />
+ <method name="clear()V" />
+ <method name="containsKey(Ljava/lang/String;)Z" />
+ <method name="get(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="getAsBoolean(Ljava/lang/String;)Ljava/lang/Boolean;" />
+ <method name="getAsByte(Ljava/lang/String;)Ljava/lang/Byte;" />
+ <method name="getAsByteArray(Ljava/lang/String;)[B" />
+ <method name="getAsDouble(Ljava/lang/String;)Ljava/lang/Double;" />
+ <method name="getAsFloat(Ljava/lang/String;)Ljava/lang/Float;" />
+ <method name="getAsInteger(Ljava/lang/String;)Ljava/lang/Integer;" />
+ <method name="getAsLong(Ljava/lang/String;)Ljava/lang/Long;" />
+ <method name="getAsShort(Ljava/lang/String;)Ljava/lang/Short;" />
+ <method name="getAsString(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="keySet()Ljava/util/Set;" since="11" />
+ <method name="put(Ljava/lang/String;Ljava/lang/Boolean;)V" />
+ <method name="put(Ljava/lang/String;Ljava/lang/Byte;)V" />
+ <method name="put(Ljava/lang/String;Ljava/lang/Double;)V" />
+ <method name="put(Ljava/lang/String;Ljava/lang/Float;)V" />
+ <method name="put(Ljava/lang/String;Ljava/lang/Integer;)V" />
+ <method name="put(Ljava/lang/String;Ljava/lang/Long;)V" />
+ <method name="put(Ljava/lang/String;Ljava/lang/Short;)V" />
+ <method name="put(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="put(Ljava/lang/String;[B)V" />
+ <method name="putAll(Landroid/content/ContentValues;)V" />
+ <method name="putNull(Ljava/lang/String;)V" />
+ <method name="remove(Ljava/lang/String;)V" />
+ <method name="size()I" />
+ <method name="valueSet()Ljava/util/Set;" />
+ <field name="CREATOR" />
+ <field name="TAG" />
+ </class>
+ <class name="android/content/Context" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="bindService(Landroid/content/Intent;Landroid/content/ServiceConnection;I)Z" />
+ <method name="checkCallingOrSelfPermission(Ljava/lang/String;)I" />
+ <method name="checkCallingOrSelfUriPermission(Landroid/net/Uri;I)I" />
+ <method name="checkCallingPermission(Ljava/lang/String;)I" />
+ <method name="checkCallingUriPermission(Landroid/net/Uri;I)I" />
+ <method name="checkPermission(Ljava/lang/String;II)I" />
+ <method name="checkUriPermission(Landroid/net/Uri;III)I" />
+ <method name="checkUriPermission(Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;III)I" />
+ <method name="clearWallpaper()V" />
+ <method name="createConfigurationContext(Landroid/content/res/Configuration;)Landroid/content/Context;" since="17" />
+ <method name="createDisplayContext(Landroid/view/Display;)Landroid/content/Context;" since="17" />
+ <method name="createPackageContext(Ljava/lang/String;I)Landroid/content/Context;" />
+ <method name="databaseList()[Ljava/lang/String;" />
+ <method name="deleteDatabase(Ljava/lang/String;)Z" />
+ <method name="deleteFile(Ljava/lang/String;)Z" />
+ <method name="enforceCallingOrSelfPermission(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="enforceCallingOrSelfUriPermission(Landroid/net/Uri;ILjava/lang/String;)V" />
+ <method name="enforceCallingPermission(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="enforceCallingUriPermission(Landroid/net/Uri;ILjava/lang/String;)V" />
+ <method name="enforcePermission(Ljava/lang/String;IILjava/lang/String;)V" />
+ <method name="enforceUriPermission(Landroid/net/Uri;IIILjava/lang/String;)V" />
+ <method name="enforceUriPermission(Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;IIILjava/lang/String;)V" />
+ <method name="fileList()[Ljava/lang/String;" />
+ <method name="getApplicationContext()Landroid/content/Context;" />
+ <method name="getApplicationInfo()Landroid/content/pm/ApplicationInfo;" since="4" />
+ <method name="getAssets()Landroid/content/res/AssetManager;" />
+ <method name="getCacheDir()Ljava/io/File;" />
+ <method name="getClassLoader()Ljava/lang/ClassLoader;" />
+ <method name="getCodeCacheDir()Ljava/io/File;" since="21" />
+ <method name="getContentResolver()Landroid/content/ContentResolver;" />
+ <method name="getDatabasePath(Ljava/lang/String;)Ljava/io/File;" />
+ <method name="getDir(Ljava/lang/String;I)Ljava/io/File;" />
+ <method name="getDrawable(I)Landroid/graphics/drawable/Drawable;" since="21" />
+ <method name="getExternalCacheDir()Ljava/io/File;" since="8" />
+ <method name="getExternalCacheDirs()[Ljava/io/File;" since="19" />
+ <method name="getExternalFilesDir(Ljava/lang/String;)Ljava/io/File;" since="8" />
+ <method name="getExternalFilesDirs(Ljava/lang/String;)[Ljava/io/File;" since="19" />
+ <method name="getExternalMediaDirs()[Ljava/io/File;" since="21" />
+ <method name="getFileStreamPath(Ljava/lang/String;)Ljava/io/File;" />
+ <method name="getFilesDir()Ljava/io/File;" />
+ <method name="getMainLooper()Landroid/os/Looper;" />
+ <method name="getNoBackupFilesDir()Ljava/io/File;" since="21" />
+ <method name="getObbDir()Ljava/io/File;" since="11" />
+ <method name="getObbDirs()[Ljava/io/File;" since="19" />
+ <method name="getPackageCodePath()Ljava/lang/String;" since="8" />
+ <method name="getPackageManager()Landroid/content/pm/PackageManager;" />
+ <method name="getPackageName()Ljava/lang/String;" />
+ <method name="getPackageResourcePath()Ljava/lang/String;" since="8" />
+ <method name="getResources()Landroid/content/res/Resources;" />
+ <method name="getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences;" />
+ <method name="getString(I)Ljava/lang/String;" />
+ <method name="getString(I[Ljava/lang/Object;)Ljava/lang/String;" />
+ <method name="getSystemService(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="getText(I)Ljava/lang/CharSequence;" />
+ <method name="getTheme()Landroid/content/res/Resources$Theme;" />
+ <method name="getWallpaper()Landroid/graphics/drawable/Drawable;" />
+ <method name="getWallpaperDesiredMinimumHeight()I" />
+ <method name="getWallpaperDesiredMinimumWidth()I" />
+ <method name="grantUriPermission(Ljava/lang/String;Landroid/net/Uri;I)V" />
+ <method name="isRestricted()Z" since="4" />
+ <method name="obtainStyledAttributes(I[I)Landroid/content/res/TypedArray;" />
+ <method name="obtainStyledAttributes(Landroid/util/AttributeSet;[I)Landroid/content/res/TypedArray;" />
+ <method name="obtainStyledAttributes(Landroid/util/AttributeSet;[III)Landroid/content/res/TypedArray;" />
+ <method name="obtainStyledAttributes([I)Landroid/content/res/TypedArray;" />
+ <method name="openFileInput(Ljava/lang/String;)Ljava/io/FileInputStream;" />
+ <method name="openFileOutput(Ljava/lang/String;I)Ljava/io/FileOutputStream;" />
+ <method name="openOrCreateDatabase(Ljava/lang/String;ILandroid/database/sqlite/SQLiteDatabase$CursorFactory;)Landroid/database/sqlite/SQLiteDatabase;" />
+ <method name="openOrCreateDatabase(Ljava/lang/String;ILandroid/database/sqlite/SQLiteDatabase$CursorFactory;Landroid/database/DatabaseErrorHandler;)Landroid/database/sqlite/SQLiteDatabase;" since="11" />
+ <method name="peekWallpaper()Landroid/graphics/drawable/Drawable;" />
+ <method name="registerComponentCallbacks(Landroid/content/ComponentCallbacks;)V" since="14" />
+ <method name="registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;)Landroid/content/Intent;" />
+ <method name="registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;)Landroid/content/Intent;" />
+ <method name="removeStickyBroadcast(Landroid/content/Intent;)V" />
+ <method name="removeStickyBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V" since="17" />
+ <method name="revokeUriPermission(Landroid/net/Uri;I)V" />
+ <method name="sendBroadcast(Landroid/content/Intent;)V" />
+ <method name="sendBroadcast(Landroid/content/Intent;Ljava/lang/String;)V" />
+ <method name="sendBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V" since="17" />
+ <method name="sendBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/lang/String;)V" since="17" />
+ <method name="sendOrderedBroadcast(Landroid/content/Intent;Ljava/lang/String;)V" />
+ <method name="sendOrderedBroadcast(Landroid/content/Intent;Ljava/lang/String;Landroid/content/BroadcastReceiver;Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;)V" />
+ <method name="sendOrderedBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Ljava/lang/String;Landroid/content/BroadcastReceiver;Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;)V" since="17" />
+ <method name="sendStickyBroadcast(Landroid/content/Intent;)V" />
+ <method name="sendStickyBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;)V" since="17" />
+ <method name="sendStickyOrderedBroadcast(Landroid/content/Intent;Landroid/content/BroadcastReceiver;Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;)V" since="5" />
+ <method name="sendStickyOrderedBroadcastAsUser(Landroid/content/Intent;Landroid/os/UserHandle;Landroid/content/BroadcastReceiver;Landroid/os/Handler;ILjava/lang/String;Landroid/os/Bundle;)V" since="17" />
+ <method name="setTheme(I)V" />
+ <method name="setWallpaper(Landroid/graphics/Bitmap;)V" />
+ <method name="setWallpaper(Ljava/io/InputStream;)V" />
+ <method name="startActivities([Landroid/content/Intent;)V" since="11" />
+ <method name="startActivities([Landroid/content/Intent;Landroid/os/Bundle;)V" since="16" />
+ <method name="startActivity(Landroid/content/Intent;)V" />
+ <method name="startActivity(Landroid/content/Intent;Landroid/os/Bundle;)V" since="16" />
+ <method name="startInstrumentation(Landroid/content/ComponentName;Ljava/lang/String;Landroid/os/Bundle;)Z" />
+ <method name="startIntentSender(Landroid/content/IntentSender;Landroid/content/Intent;III)V" since="5" />
+ <method name="startIntentSender(Landroid/content/IntentSender;Landroid/content/Intent;IIILandroid/os/Bundle;)V" since="16" />
+ <method name="startService(Landroid/content/Intent;)Landroid/content/ComponentName;" />
+ <method name="stopService(Landroid/content/Intent;)Z" />
+ <method name="unbindService(Landroid/content/ServiceConnection;)V" />
+ <method name="unregisterComponentCallbacks(Landroid/content/ComponentCallbacks;)V" since="14" />
+ <method name="unregisterReceiver(Landroid/content/BroadcastReceiver;)V" />
+ <field name="ACCESSIBILITY_SERVICE" since="4" />
+ <field name="ACCOUNT_SERVICE" since="5" />
+ <field name="ACTIVITY_SERVICE" />
+ <field name="ALARM_SERVICE" />
+ <field name="APPWIDGET_SERVICE" since="21" />
+ <field name="APP_OPS_SERVICE" since="19" />
+ <field name="AUDIO_SERVICE" />
+ <field name="BATTERY_SERVICE" since="21" />
+ <field name="BIND_ABOVE_CLIENT" since="14" />
+ <field name="BIND_ADJUST_WITH_ACTIVITY" since="14" />
+ <field name="BIND_ALLOW_OOM_MANAGEMENT" since="14" />
+ <field name="BIND_AUTO_CREATE" />
+ <field name="BIND_DEBUG_UNBIND" />
+ <field name="BIND_IMPORTANT" since="14" />
+ <field name="BIND_NOT_FOREGROUND" since="8" />
+ <field name="BIND_WAIVE_PRIORITY" since="14" />
+ <field name="BLUETOOTH_SERVICE" since="18" />
+ <field name="CAMERA_SERVICE" since="21" />
+ <field name="CAPTIONING_SERVICE" since="19" />
+ <field name="CLIPBOARD_SERVICE" />
+ <field name="CONNECTIVITY_SERVICE" />
+ <field name="CONSUMER_IR_SERVICE" since="19" />
+ <field name="CONTEXT_IGNORE_SECURITY" />
+ <field name="CONTEXT_INCLUDE_CODE" />
+ <field name="CONTEXT_RESTRICTED" since="4" />
+ <field name="DEVICE_POLICY_SERVICE" since="8" />
+ <field name="DISPLAY_SERVICE" since="17" />
+ <field name="DOWNLOAD_SERVICE" since="9" />
+ <field name="DROPBOX_SERVICE" since="8" />
+ <field name="INPUT_METHOD_SERVICE" since="3" />
+ <field name="INPUT_SERVICE" since="16" />
+ <field name="JOB_SCHEDULER_SERVICE" since="21" />
+ <field name="KEYGUARD_SERVICE" />
+ <field name="LAUNCHER_APPS_SERVICE" since="21" />
+ <field name="LAYOUT_INFLATER_SERVICE" />
+ <field name="LOCATION_SERVICE" />
+ <field name="MEDIA_PROJECTION_SERVICE" since="21" />
+ <field name="MEDIA_ROUTER_SERVICE" since="16" />
+ <field name="MEDIA_SESSION_SERVICE" since="21" />
+ <field name="MODE_APPEND" />
+ <field name="MODE_ENABLE_WRITE_AHEAD_LOGGING" since="16" />
+ <field name="MODE_MULTI_PROCESS" since="11" />
+ <field name="MODE_PRIVATE" />
+ <field name="MODE_WORLD_READABLE" />
+ <field name="MODE_WORLD_WRITEABLE" />
+ <field name="NFC_SERVICE" since="10" />
+ <field name="NOTIFICATION_SERVICE" />
+ <field name="NSD_SERVICE" since="16" />
+ <field name="POWER_SERVICE" />
+ <field name="PRINT_SERVICE" since="19" />
+ <field name="RESTRICTIONS_SERVICE" since="21" />
+ <field name="SEARCH_SERVICE" />
+ <field name="SENSOR_SERVICE" />
+ <field name="STORAGE_SERVICE" since="9" />
+ <field name="TELECOM_SERVICE" since="21" />
+ <field name="TELEPHONY_SERVICE" />
+ <field name="TEXT_SERVICES_MANAGER_SERVICE" since="14" />
+ <field name="TV_INPUT_SERVICE" since="21" />
+ <field name="UI_MODE_SERVICE" since="8" />
+ <field name="USB_SERVICE" since="12" />
+ <field name="USER_SERVICE" since="17" />
+ <field name="VIBRATOR_SERVICE" />
+ <field name="WALLPAPER_SERVICE" />
+ <field name="WIFI_P2P_SERVICE" since="14" />
+ <field name="WIFI_SERVICE" />
+ <field name="WINDOW_SERVICE" />
+ </class>
+ <class name="android/content/ContextWrapper" since="1">
+ <extends name="android/content/Context" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="attachBaseContext(Landroid/content/Context;)V" />
+ <method name="getBaseContext()Landroid/content/Context;" />
+ <method name="getPackageCodePath()Ljava/lang/String;" />
+ <method name="getPackageResourcePath()Ljava/lang/String;" />
+ </class>
+ <class name="android/content/CursorLoader" since="11">
+ <extends name="android/content/AsyncTaskLoader" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="deliverResult(Landroid/database/Cursor;)V" />
+ <method name="getProjection()[Ljava/lang/String;" />
+ <method name="getSelection()Ljava/lang/String;" />
+ <method name="getSelectionArgs()[Ljava/lang/String;" />
+ <method name="getSortOrder()Ljava/lang/String;" />
+ <method name="getUri()Landroid/net/Uri;" />
+ <method name="loadInBackground()Landroid/database/Cursor;" />
+ <method name="onCanceled(Landroid/database/Cursor;)V" />
+ <method name="setProjection([Ljava/lang/String;)V" />
+ <method name="setSelection(Ljava/lang/String;)V" />
+ <method name="setSelectionArgs([Ljava/lang/String;)V" />
+ <method name="setSortOrder(Ljava/lang/String;)V" />
+ <method name="setUri(Landroid/net/Uri;)V" />
+ </class>
+ <class name="android/content/DialogInterface" since="1">
+ <extends name="java/lang/Object" />
+ <method name="cancel()V" />
+ <method name="dismiss()V" />
+ <field name="BUTTON1" />
+ <field name="BUTTON2" />
+ <field name="BUTTON3" />
+ <field name="BUTTON_NEGATIVE" since="3" />
+ <field name="BUTTON_NEUTRAL" since="3" />
+ <field name="BUTTON_POSITIVE" since="3" />
+ </class>
+ <class name="android/content/DialogInterface$OnCancelListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onCancel(Landroid/content/DialogInterface;)V" />
+ </class>
+ <class name="android/content/DialogInterface$OnClickListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onClick(Landroid/content/DialogInterface;I)V" />
+ </class>
+ <class name="android/content/DialogInterface$OnDismissListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onDismiss(Landroid/content/DialogInterface;)V" />
+ </class>
+ <class name="android/content/DialogInterface$OnKeyListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onKey(Landroid/content/DialogInterface;ILandroid/view/KeyEvent;)Z" />
+ </class>
+ <class name="android/content/DialogInterface$OnMultiChoiceClickListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onClick(Landroid/content/DialogInterface;IZ)V" />
+ </class>
+ <class name="android/content/DialogInterface$OnShowListener" since="8">
+ <extends name="java/lang/Object" />
+ <method name="onShow(Landroid/content/DialogInterface;)V" />
+ </class>
+ <class name="android/content/Entity" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/ContentValues;)V" />
+ <method name="addSubValue(Landroid/net/Uri;Landroid/content/ContentValues;)V" />
+ <method name="getEntityValues()Landroid/content/ContentValues;" />
+ <method name="getSubValues()Ljava/util/ArrayList;" />
+ </class>
+ <class name="android/content/Entity$NamedContentValues" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/net/Uri;Landroid/content/ContentValues;)V" />
+ <field name="uri" />
+ <field name="values" />
+ </class>
+ <class name="android/content/EntityIterator" since="8">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/Iterator" />
+ <method name="close()V" />
+ <method name="reset()V" />
+ </class>
+ <class name="android/content/Intent" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <implements name="java/lang/Cloneable" since="8" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/Context;Ljava/lang/Class;)V" />
+ <method name="&lt;init>(Landroid/content/Intent;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Landroid/net/Uri;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Landroid/net/Uri;Landroid/content/Context;Ljava/lang/Class;)V" />
+ <method name="addCategory(Ljava/lang/String;)Landroid/content/Intent;" />
+ <method name="addFlags(I)Landroid/content/Intent;" />
+ <method name="cloneFilter()Landroid/content/Intent;" />
+ <method name="createChooser(Landroid/content/Intent;Ljava/lang/CharSequence;)Landroid/content/Intent;" />
+ <method name="fillIn(Landroid/content/Intent;I)I" />
+ <method name="filterEquals(Landroid/content/Intent;)Z" />
+ <method name="filterHashCode()I" />
+ <method name="getAction()Ljava/lang/String;" />
+ <method name="getBooleanArrayExtra(Ljava/lang/String;)[Z" />
+ <method name="getBooleanExtra(Ljava/lang/String;Z)Z" />
+ <method name="getBundleExtra(Ljava/lang/String;)Landroid/os/Bundle;" />
+ <method name="getByteArrayExtra(Ljava/lang/String;)[B" />
+ <method name="getByteExtra(Ljava/lang/String;B)B" />
+ <method name="getCategories()Ljava/util/Set;" />
+ <method name="getCharArrayExtra(Ljava/lang/String;)[C" />
+ <method name="getCharExtra(Ljava/lang/String;C)C" />
+ <method name="getCharSequenceArrayExtra(Ljava/lang/String;)[Ljava/lang/CharSequence;" since="8" />
+ <method name="getCharSequenceArrayListExtra(Ljava/lang/String;)Ljava/util/ArrayList;" since="8" />
+ <method name="getCharSequenceExtra(Ljava/lang/String;)Ljava/lang/CharSequence;" />
+ <method name="getClipData()Landroid/content/ClipData;" since="16" />
+ <method name="getComponent()Landroid/content/ComponentName;" />
+ <method name="getData()Landroid/net/Uri;" />
+ <method name="getDataString()Ljava/lang/String;" />
+ <method name="getDoubleArrayExtra(Ljava/lang/String;)[D" />
+ <method name="getDoubleExtra(Ljava/lang/String;D)D" />
+ <method name="getExtras()Landroid/os/Bundle;" />
+ <method name="getFlags()I" />
+ <method name="getFloatArrayExtra(Ljava/lang/String;)[F" />
+ <method name="getFloatExtra(Ljava/lang/String;F)F" />
+ <method name="getIntArrayExtra(Ljava/lang/String;)[I" />
+ <method name="getIntExtra(Ljava/lang/String;I)I" />
+ <method name="getIntegerArrayListExtra(Ljava/lang/String;)Ljava/util/ArrayList;" />
+ <method name="getIntent(Ljava/lang/String;)Landroid/content/Intent;" />
+ <method name="getIntentOld(Ljava/lang/String;)Landroid/content/Intent;" />
+ <method name="getLongArrayExtra(Ljava/lang/String;)[J" />
+ <method name="getLongExtra(Ljava/lang/String;J)J" />
+ <method name="getPackage()Ljava/lang/String;" since="4" />
+ <method name="getParcelableArrayExtra(Ljava/lang/String;)[Landroid/os/Parcelable;" />
+ <method name="getParcelableArrayListExtra(Ljava/lang/String;)Ljava/util/ArrayList;" />
+ <method name="getParcelableExtra(Ljava/lang/String;)Landroid/os/Parcelable;" />
+ <method name="getScheme()Ljava/lang/String;" />
+ <method name="getSelector()Landroid/content/Intent;" since="15" />
+ <method name="getSerializableExtra(Ljava/lang/String;)Ljava/io/Serializable;" />
+ <method name="getShortArrayExtra(Ljava/lang/String;)[S" />
+ <method name="getShortExtra(Ljava/lang/String;S)S" />
+ <method name="getSourceBounds()Landroid/graphics/Rect;" since="7" />
+ <method name="getStringArrayExtra(Ljava/lang/String;)[Ljava/lang/String;" />
+ <method name="getStringArrayListExtra(Ljava/lang/String;)Ljava/util/ArrayList;" />
+ <method name="getStringExtra(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getType()Ljava/lang/String;" />
+ <method name="hasCategory(Ljava/lang/String;)Z" />
+ <method name="hasExtra(Ljava/lang/String;)Z" />
+ <method name="hasFileDescriptors()Z" />
+ <method name="makeMainActivity(Landroid/content/ComponentName;)Landroid/content/Intent;" since="11" />
+ <method name="makeMainSelectorActivity(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;" since="15" />
+ <method name="makeRestartActivityTask(Landroid/content/ComponentName;)Landroid/content/Intent;" since="11" />
+ <method name="normalizeMimeType(Ljava/lang/String;)Ljava/lang/String;" since="16" />
+ <method name="parseIntent(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;)Landroid/content/Intent;" />
+ <method name="parseUri(Ljava/lang/String;I)Landroid/content/Intent;" since="4" />
+ <method name="putCharSequenceArrayListExtra(Ljava/lang/String;Ljava/util/ArrayList;)Landroid/content/Intent;" since="8" />
+ <method name="putExtra(Ljava/lang/String;B)Landroid/content/Intent;" />
+ <method name="putExtra(Ljava/lang/String;C)Landroid/content/Intent;" />
+ <method name="putExtra(Ljava/lang/String;D)Landroid/content/Intent;" />
+ <method name="putExtra(Ljava/lang/String;F)Landroid/content/Intent;" />
+ <method name="putExtra(Ljava/lang/String;I)Landroid/content/Intent;" />
+ <method name="putExtra(Ljava/lang/String;J)Landroid/content/Intent;" />
+ <method name="putExtra(Ljava/lang/String;Landroid/os/Bundle;)Landroid/content/Intent;" />
+ <method name="putExtra(Ljava/lang/String;Landroid/os/Parcelable;)Landroid/content/Intent;" />
+ <method name="putExtra(Ljava/lang/String;Ljava/io/Serializable;)Landroid/content/Intent;" />
+ <method name="putExtra(Ljava/lang/String;Ljava/lang/CharSequence;)Landroid/content/Intent;" />
+ <method name="putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;" />
+ <method name="putExtra(Ljava/lang/String;S)Landroid/content/Intent;" />
+ <method name="putExtra(Ljava/lang/String;Z)Landroid/content/Intent;" />
+ <method name="putExtra(Ljava/lang/String;[B)Landroid/content/Intent;" />
+ <method name="putExtra(Ljava/lang/String;[C)Landroid/content/Intent;" />
+ <method name="putExtra(Ljava/lang/String;[D)Landroid/content/Intent;" />
+ <method name="putExtra(Ljava/lang/String;[F)Landroid/content/Intent;" />
+ <method name="putExtra(Ljava/lang/String;[I)Landroid/content/Intent;" />
+ <method name="putExtra(Ljava/lang/String;[J)Landroid/content/Intent;" />
+ <method name="putExtra(Ljava/lang/String;[Landroid/os/Parcelable;)Landroid/content/Intent;" />
+ <method name="putExtra(Ljava/lang/String;[Ljava/lang/CharSequence;)Landroid/content/Intent;" since="8" />
+ <method name="putExtra(Ljava/lang/String;[Ljava/lang/String;)Landroid/content/Intent;" />
+ <method name="putExtra(Ljava/lang/String;[S)Landroid/content/Intent;" />
+ <method name="putExtra(Ljava/lang/String;[Z)Landroid/content/Intent;" />
+ <method name="putExtras(Landroid/content/Intent;)Landroid/content/Intent;" />
+ <method name="putExtras(Landroid/os/Bundle;)Landroid/content/Intent;" />
+ <method name="putIntegerArrayListExtra(Ljava/lang/String;Ljava/util/ArrayList;)Landroid/content/Intent;" />
+ <method name="putParcelableArrayListExtra(Ljava/lang/String;Ljava/util/ArrayList;)Landroid/content/Intent;" />
+ <method name="putStringArrayListExtra(Ljava/lang/String;Ljava/util/ArrayList;)Landroid/content/Intent;" />
+ <method name="readFromParcel(Landroid/os/Parcel;)V" />
+ <method name="removeCategory(Ljava/lang/String;)V" />
+ <method name="removeExtra(Ljava/lang/String;)V" />
+ <method name="replaceExtras(Landroid/content/Intent;)Landroid/content/Intent;" since="3" />
+ <method name="replaceExtras(Landroid/os/Bundle;)Landroid/content/Intent;" since="3" />
+ <method name="resolveActivity(Landroid/content/pm/PackageManager;)Landroid/content/ComponentName;" />
+ <method name="resolveActivityInfo(Landroid/content/pm/PackageManager;I)Landroid/content/pm/ActivityInfo;" />
+ <method name="resolveType(Landroid/content/ContentResolver;)Ljava/lang/String;" />
+ <method name="resolveType(Landroid/content/Context;)Ljava/lang/String;" />
+ <method name="resolveTypeIfNeeded(Landroid/content/ContentResolver;)Ljava/lang/String;" />
+ <method name="setAction(Ljava/lang/String;)Landroid/content/Intent;" />
+ <method name="setClass(Landroid/content/Context;Ljava/lang/Class;)Landroid/content/Intent;" />
+ <method name="setClassName(Landroid/content/Context;Ljava/lang/String;)Landroid/content/Intent;" />
+ <method name="setClassName(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;" />
+ <method name="setClipData(Landroid/content/ClipData;)V" since="16" />
+ <method name="setComponent(Landroid/content/ComponentName;)Landroid/content/Intent;" />
+ <method name="setData(Landroid/net/Uri;)Landroid/content/Intent;" />
+ <method name="setDataAndNormalize(Landroid/net/Uri;)Landroid/content/Intent;" since="16" />
+ <method name="setDataAndType(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/Intent;" />
+ <method name="setDataAndTypeAndNormalize(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/Intent;" since="16" />
+ <method name="setExtrasClassLoader(Ljava/lang/ClassLoader;)V" />
+ <method name="setFlags(I)Landroid/content/Intent;" />
+ <method name="setPackage(Ljava/lang/String;)Landroid/content/Intent;" since="4" />
+ <method name="setSelector(Landroid/content/Intent;)V" since="15" />
+ <method name="setSourceBounds(Landroid/graphics/Rect;)V" since="7" />
+ <method name="setType(Ljava/lang/String;)Landroid/content/Intent;" />
+ <method name="setTypeAndNormalize(Ljava/lang/String;)Landroid/content/Intent;" since="16" />
+ <method name="toURI()Ljava/lang/String;" />
+ <method name="toUri(I)Ljava/lang/String;" since="4" />
+ <field name="ACTION_AIRPLANE_MODE_CHANGED" />
+ <field name="ACTION_ALL_APPS" />
+ <field name="ACTION_ANSWER" />
+ <field name="ACTION_APPLICATION_RESTRICTIONS_CHANGED" since="21" />
+ <field name="ACTION_APP_ERROR" since="14" />
+ <field name="ACTION_ASSIST" since="16" />
+ <field name="ACTION_ATTACH_DATA" />
+ <field name="ACTION_BATTERY_CHANGED" />
+ <field name="ACTION_BATTERY_LOW" />
+ <field name="ACTION_BATTERY_OKAY" since="4" />
+ <field name="ACTION_BOOT_COMPLETED" />
+ <field name="ACTION_BUG_REPORT" />
+ <field name="ACTION_CALL" />
+ <field name="ACTION_CALL_BUTTON" />
+ <field name="ACTION_CAMERA_BUTTON" />
+ <field name="ACTION_CHOOSER" />
+ <field name="ACTION_CLOSE_SYSTEM_DIALOGS" />
+ <field name="ACTION_CONFIGURATION_CHANGED" />
+ <field name="ACTION_CREATE_DOCUMENT" since="19" />
+ <field name="ACTION_CREATE_SHORTCUT" />
+ <field name="ACTION_DATE_CHANGED" />
+ <field name="ACTION_DEFAULT" />
+ <field name="ACTION_DELETE" />
+ <field name="ACTION_DEVICE_STORAGE_LOW" />
+ <field name="ACTION_DEVICE_STORAGE_OK" />
+ <field name="ACTION_DIAL" />
+ <field name="ACTION_DOCK_EVENT" since="5" />
+ <field name="ACTION_DREAMING_STARTED" since="17" />
+ <field name="ACTION_DREAMING_STOPPED" since="17" />
+ <field name="ACTION_EDIT" />
+ <field name="ACTION_EXTERNAL_APPLICATIONS_AVAILABLE" since="8" />
+ <field name="ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE" since="8" />
+ <field name="ACTION_FACTORY_TEST" />
+ <field name="ACTION_GET_CONTENT" />
+ <field name="ACTION_GET_RESTRICTION_ENTRIES" since="18" />
+ <field name="ACTION_GTALK_SERVICE_CONNECTED" />
+ <field name="ACTION_GTALK_SERVICE_DISCONNECTED" />
+ <field name="ACTION_HEADSET_PLUG" />
+ <field name="ACTION_INPUT_METHOD_CHANGED" since="3" />
+ <field name="ACTION_INSERT" />
+ <field name="ACTION_INSERT_OR_EDIT" />
+ <field name="ACTION_INSTALL_PACKAGE" since="14" />
+ <field name="ACTION_LOCALE_CHANGED" since="7" />
+ <field name="ACTION_MAIN" />
+ <field name="ACTION_MANAGED_PROFILE_ADDED" since="21" />
+ <field name="ACTION_MANAGED_PROFILE_REMOVED" since="21" />
+ <field name="ACTION_MANAGE_NETWORK_USAGE" since="14" />
+ <field name="ACTION_MANAGE_PACKAGE_STORAGE" />
+ <field name="ACTION_MEDIA_BAD_REMOVAL" />
+ <field name="ACTION_MEDIA_BUTTON" />
+ <field name="ACTION_MEDIA_CHECKING" since="3" />
+ <field name="ACTION_MEDIA_EJECT" />
+ <field name="ACTION_MEDIA_MOUNTED" />
+ <field name="ACTION_MEDIA_NOFS" since="3" />
+ <field name="ACTION_MEDIA_REMOVED" />
+ <field name="ACTION_MEDIA_SCANNER_FINISHED" />
+ <field name="ACTION_MEDIA_SCANNER_SCAN_FILE" />
+ <field name="ACTION_MEDIA_SCANNER_STARTED" />
+ <field name="ACTION_MEDIA_SHARED" />
+ <field name="ACTION_MEDIA_UNMOUNTABLE" />
+ <field name="ACTION_MEDIA_UNMOUNTED" />
+ <field name="ACTION_MY_PACKAGE_REPLACED" since="12" />
+ <field name="ACTION_NEW_OUTGOING_CALL" />
+ <field name="ACTION_OPEN_DOCUMENT" since="19" />
+ <field name="ACTION_OPEN_DOCUMENT_TREE" since="21" />
+ <field name="ACTION_PACKAGE_ADDED" />
+ <field name="ACTION_PACKAGE_CHANGED" />
+ <field name="ACTION_PACKAGE_DATA_CLEARED" since="3" />
+ <field name="ACTION_PACKAGE_FIRST_LAUNCH" since="12" />
+ <field name="ACTION_PACKAGE_FULLY_REMOVED" since="14" />
+ <field name="ACTION_PACKAGE_INSTALL" />
+ <field name="ACTION_PACKAGE_NEEDS_VERIFICATION" since="14" />
+ <field name="ACTION_PACKAGE_REMOVED" />
+ <field name="ACTION_PACKAGE_REPLACED" since="3" />
+ <field name="ACTION_PACKAGE_RESTARTED" />
+ <field name="ACTION_PACKAGE_VERIFIED" since="17" />
+ <field name="ACTION_PASTE" since="11" />
+ <field name="ACTION_PICK" />
+ <field name="ACTION_PICK_ACTIVITY" />
+ <field name="ACTION_POWER_CONNECTED" since="4" />
+ <field name="ACTION_POWER_DISCONNECTED" since="4" />
+ <field name="ACTION_POWER_USAGE_SUMMARY" since="4" />
+ <field name="ACTION_PROVIDER_CHANGED" />
+ <field name="ACTION_QUICK_CLOCK" since="17" />
+ <field name="ACTION_REBOOT" />
+ <field name="ACTION_RUN" />
+ <field name="ACTION_SCREEN_OFF" />
+ <field name="ACTION_SCREEN_ON" />
+ <field name="ACTION_SEARCH" />
+ <field name="ACTION_SEARCH_LONG_PRESS" since="3" />
+ <field name="ACTION_SEND" />
+ <field name="ACTION_SENDTO" />
+ <field name="ACTION_SEND_MULTIPLE" since="4" />
+ <field name="ACTION_SET_WALLPAPER" />
+ <field name="ACTION_SHUTDOWN" since="4" />
+ <field name="ACTION_SYNC" />
+ <field name="ACTION_SYSTEM_TUTORIAL" since="3" />
+ <field name="ACTION_TIMEZONE_CHANGED" />
+ <field name="ACTION_TIME_CHANGED" />
+ <field name="ACTION_TIME_TICK" />
+ <field name="ACTION_UID_REMOVED" />
+ <field name="ACTION_UMS_CONNECTED" />
+ <field name="ACTION_UMS_DISCONNECTED" />
+ <field name="ACTION_UNINSTALL_PACKAGE" since="14" />
+ <field name="ACTION_USER_BACKGROUND" since="17" />
+ <field name="ACTION_USER_FOREGROUND" since="17" />
+ <field name="ACTION_USER_INITIALIZE" since="17" />
+ <field name="ACTION_USER_PRESENT" since="3" />
+ <field name="ACTION_VIEW" />
+ <field name="ACTION_VOICE_COMMAND" />
+ <field name="ACTION_WALLPAPER_CHANGED" />
+ <field name="ACTION_WEB_SEARCH" />
+ <field name="CATEGORY_ALTERNATIVE" />
+ <field name="CATEGORY_APP_BROWSER" since="15" />
+ <field name="CATEGORY_APP_CALCULATOR" since="15" />
+ <field name="CATEGORY_APP_CALENDAR" since="15" />
+ <field name="CATEGORY_APP_CONTACTS" since="15" />
+ <field name="CATEGORY_APP_EMAIL" since="15" />
+ <field name="CATEGORY_APP_GALLERY" since="15" />
+ <field name="CATEGORY_APP_MAPS" since="15" />
+ <field name="CATEGORY_APP_MARKET" since="11" />
+ <field name="CATEGORY_APP_MESSAGING" since="15" />
+ <field name="CATEGORY_APP_MUSIC" since="15" />
+ <field name="CATEGORY_BROWSABLE" />
+ <field name="CATEGORY_CAR_DOCK" since="5" />
+ <field name="CATEGORY_CAR_MODE" since="8" />
+ <field name="CATEGORY_DEFAULT" />
+ <field name="CATEGORY_DESK_DOCK" since="5" />
+ <field name="CATEGORY_DEVELOPMENT_PREFERENCE" />
+ <field name="CATEGORY_EMBED" />
+ <field name="CATEGORY_FRAMEWORK_INSTRUMENTATION_TEST" />
+ <field name="CATEGORY_GADGET" />
+ <field name="CATEGORY_HE_DESK_DOCK" since="11" />
+ <field name="CATEGORY_HOME" />
+ <field name="CATEGORY_INFO" since="3" />
+ <field name="CATEGORY_LAUNCHER" />
+ <field name="CATEGORY_LEANBACK_LAUNCHER" since="21" />
+ <field name="CATEGORY_LE_DESK_DOCK" since="11" />
+ <field name="CATEGORY_MONKEY" />
+ <field name="CATEGORY_OPENABLE" />
+ <field name="CATEGORY_PREFERENCE" />
+ <field name="CATEGORY_SAMPLE_CODE" />
+ <field name="CATEGORY_SELECTED_ALTERNATIVE" />
+ <field name="CATEGORY_TAB" />
+ <field name="CATEGORY_TEST" />
+ <field name="CATEGORY_UNIT_TEST" />
+ <field name="CREATOR" />
+ <field name="EXTRA_ALARM_COUNT" />
+ <field name="EXTRA_ALLOW_MULTIPLE" since="18" />
+ <field name="EXTRA_ALLOW_REPLACE" since="14" />
+ <field name="EXTRA_ASSIST_CONTEXT" since="18" />
+ <field name="EXTRA_ASSIST_INPUT_HINT_KEYBOARD" since="21" />
+ <field name="EXTRA_ASSIST_PACKAGE" since="18" />
+ <field name="EXTRA_BCC" />
+ <field name="EXTRA_BUG_REPORT" since="14" />
+ <field name="EXTRA_CC" />
+ <field name="EXTRA_CHANGED_COMPONENT_NAME" since="5" />
+ <field name="EXTRA_CHANGED_COMPONENT_NAME_LIST" since="7" />
+ <field name="EXTRA_CHANGED_PACKAGE_LIST" since="8" />
+ <field name="EXTRA_CHANGED_UID_LIST" since="8" />
+ <field name="EXTRA_DATA_REMOVED" since="3" />
+ <field name="EXTRA_DOCK_STATE" since="5" />
+ <field name="EXTRA_DOCK_STATE_CAR" since="5" />
+ <field name="EXTRA_DOCK_STATE_DESK" since="5" />
+ <field name="EXTRA_DOCK_STATE_HE_DESK" since="11" />
+ <field name="EXTRA_DOCK_STATE_LE_DESK" since="11" />
+ <field name="EXTRA_DOCK_STATE_UNDOCKED" since="5" />
+ <field name="EXTRA_DONT_KILL_APP" />
+ <field name="EXTRA_EMAIL" />
+ <field name="EXTRA_HTML_TEXT" since="16" />
+ <field name="EXTRA_INITIAL_INTENTS" since="5" />
+ <field name="EXTRA_INSTALLER_PACKAGE_NAME" since="14" />
+ <field name="EXTRA_INTENT" />
+ <field name="EXTRA_KEY_EVENT" />
+ <field name="EXTRA_LOCAL_ONLY" since="11" />
+ <field name="EXTRA_MIME_TYPES" since="19" />
+ <field name="EXTRA_NOT_UNKNOWN_SOURCE" since="14" />
+ <field name="EXTRA_ORIGINATING_URI" since="17" />
+ <field name="EXTRA_PHONE_NUMBER" />
+ <field name="EXTRA_REFERRER" since="17" />
+ <field name="EXTRA_REMOTE_INTENT_TOKEN" since="5" />
+ <field name="EXTRA_REPLACEMENT_EXTRAS" since="21" />
+ <field name="EXTRA_REPLACING" since="3" />
+ <field name="EXTRA_RESTRICTIONS_BUNDLE" since="18" />
+ <field name="EXTRA_RESTRICTIONS_INTENT" since="18" />
+ <field name="EXTRA_RESTRICTIONS_LIST" since="18" />
+ <field name="EXTRA_RETURN_RESULT" since="14" />
+ <field name="EXTRA_SHORTCUT_ICON" />
+ <field name="EXTRA_SHORTCUT_ICON_RESOURCE" />
+ <field name="EXTRA_SHORTCUT_INTENT" />
+ <field name="EXTRA_SHORTCUT_NAME" />
+ <field name="EXTRA_SHUTDOWN_USERSPACE_ONLY" since="19" />
+ <field name="EXTRA_STREAM" />
+ <field name="EXTRA_SUBJECT" />
+ <field name="EXTRA_TEMPLATE" />
+ <field name="EXTRA_TEXT" />
+ <field name="EXTRA_TITLE" />
+ <field name="EXTRA_UID" />
+ <field name="EXTRA_USER" since="21" />
+ <field name="FILL_IN_ACTION" />
+ <field name="FILL_IN_CATEGORIES" />
+ <field name="FILL_IN_CLIP_DATA" since="16" />
+ <field name="FILL_IN_COMPONENT" />
+ <field name="FILL_IN_DATA" />
+ <field name="FILL_IN_PACKAGE" since="4" />
+ <field name="FILL_IN_SELECTOR" since="15" />
+ <field name="FILL_IN_SOURCE_BOUNDS" since="7" />
+ <field name="FLAG_ACTIVITY_BROUGHT_TO_FRONT" />
+ <field name="FLAG_ACTIVITY_CLEAR_TASK" since="11" />
+ <field name="FLAG_ACTIVITY_CLEAR_TOP" />
+ <field name="FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET" since="3" />
+ <field name="FLAG_ACTIVITY_CLOSE_SYSTEM_DIALOGS" since="16" />
+ <field name="FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS" />
+ <field name="FLAG_ACTIVITY_FORWARD_RESULT" />
+ <field name="FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY" />
+ <field name="FLAG_ACTIVITY_MULTIPLE_TASK" />
+ <field name="FLAG_ACTIVITY_NEW_DOCUMENT" since="21" />
+ <field name="FLAG_ACTIVITY_NEW_TASK" />
+ <field name="FLAG_ACTIVITY_NO_ANIMATION" since="5" />
+ <field name="FLAG_ACTIVITY_NO_HISTORY" />
+ <field name="FLAG_ACTIVITY_NO_USER_ACTION" since="3" />
+ <field name="FLAG_ACTIVITY_PREVIOUS_IS_TOP" />
+ <field name="FLAG_ACTIVITY_REORDER_TO_FRONT" since="3" />
+ <field name="FLAG_ACTIVITY_RESET_TASK_IF_NEEDED" />
+ <field name="FLAG_ACTIVITY_RETAIN_IN_RECENTS" since="21" />
+ <field name="FLAG_ACTIVITY_SINGLE_TOP" />
+ <field name="FLAG_ACTIVITY_TASK_ON_HOME" since="11" />
+ <field name="FLAG_DEBUG_LOG_RESOLUTION" />
+ <field name="FLAG_EXCLUDE_STOPPED_PACKAGES" since="12" />
+ <field name="FLAG_FROM_BACKGROUND" />
+ <field name="FLAG_GRANT_PERSISTABLE_URI_PERMISSION" since="19" />
+ <field name="FLAG_GRANT_PREFIX_URI_PERMISSION" since="21" />
+ <field name="FLAG_GRANT_READ_URI_PERMISSION" />
+ <field name="FLAG_GRANT_WRITE_URI_PERMISSION" />
+ <field name="FLAG_INCLUDE_STOPPED_PACKAGES" since="12" />
+ <field name="FLAG_RECEIVER_FOREGROUND" since="16" />
+ <field name="FLAG_RECEIVER_NO_ABORT" since="19" />
+ <field name="FLAG_RECEIVER_REGISTERED_ONLY" />
+ <field name="FLAG_RECEIVER_REPLACE_PENDING" since="8" />
+ <field name="METADATA_DOCK_HOME" since="5" />
+ <field name="URI_INTENT_SCHEME" since="4" />
+ </class>
+ <class name="android/content/Intent$FilterComparison" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Intent;)V" />
+ <method name="getIntent()Landroid/content/Intent;" />
+ </class>
+ <class name="android/content/Intent$ShortcutIconResource" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="fromContext(Landroid/content/Context;I)Landroid/content/Intent$ShortcutIconResource;" />
+ <field name="CREATOR" />
+ <field name="packageName" />
+ <field name="resourceName" />
+ </class>
+ <class name="android/content/IntentFilter" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/IntentFilter;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="actionsIterator()Ljava/util/Iterator;" />
+ <method name="addAction(Ljava/lang/String;)V" />
+ <method name="addCategory(Ljava/lang/String;)V" />
+ <method name="addDataAuthority(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="addDataPath(Ljava/lang/String;I)V" />
+ <method name="addDataScheme(Ljava/lang/String;)V" />
+ <method name="addDataSchemeSpecificPart(Ljava/lang/String;I)V" since="19" />
+ <method name="addDataType(Ljava/lang/String;)V" />
+ <method name="authoritiesIterator()Ljava/util/Iterator;" />
+ <method name="categoriesIterator()Ljava/util/Iterator;" />
+ <method name="countActions()I" />
+ <method name="countCategories()I" />
+ <method name="countDataAuthorities()I" />
+ <method name="countDataPaths()I" />
+ <method name="countDataSchemeSpecificParts()I" since="19" />
+ <method name="countDataSchemes()I" />
+ <method name="countDataTypes()I" />
+ <method name="create(Ljava/lang/String;Ljava/lang/String;)Landroid/content/IntentFilter;" />
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V" />
+ <method name="getAction(I)Ljava/lang/String;" />
+ <method name="getCategory(I)Ljava/lang/String;" />
+ <method name="getDataAuthority(I)Landroid/content/IntentFilter$AuthorityEntry;" />
+ <method name="getDataPath(I)Landroid/os/PatternMatcher;" />
+ <method name="getDataScheme(I)Ljava/lang/String;" />
+ <method name="getDataSchemeSpecificPart(I)Landroid/os/PatternMatcher;" since="19" />
+ <method name="getDataType(I)Ljava/lang/String;" />
+ <method name="getPriority()I" />
+ <method name="hasAction(Ljava/lang/String;)Z" />
+ <method name="hasCategory(Ljava/lang/String;)Z" />
+ <method name="hasDataAuthority(Landroid/net/Uri;)Z" />
+ <method name="hasDataPath(Ljava/lang/String;)Z" />
+ <method name="hasDataScheme(Ljava/lang/String;)Z" />
+ <method name="hasDataSchemeSpecificPart(Ljava/lang/String;)Z" since="19" />
+ <method name="hasDataType(Ljava/lang/String;)Z" />
+ <method name="match(Landroid/content/ContentResolver;Landroid/content/Intent;ZLjava/lang/String;)I" />
+ <method name="match(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;Ljava/util/Set;Ljava/lang/String;)I" />
+ <method name="matchAction(Ljava/lang/String;)Z" />
+ <method name="matchCategories(Ljava/util/Set;)Ljava/lang/String;" />
+ <method name="matchData(Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;)I" />
+ <method name="matchDataAuthority(Landroid/net/Uri;)I" />
+ <method name="pathsIterator()Ljava/util/Iterator;" />
+ <method name="readFromXml(Lorg/xmlpull/v1/XmlPullParser;)V" />
+ <method name="schemeSpecificPartsIterator()Ljava/util/Iterator;" since="19" />
+ <method name="schemesIterator()Ljava/util/Iterator;" />
+ <method name="setPriority(I)V" />
+ <method name="typesIterator()Ljava/util/Iterator;" />
+ <method name="writeToXml(Lorg/xmlpull/v1/XmlSerializer;)V" />
+ <field name="CREATOR" />
+ <field name="MATCH_ADJUSTMENT_MASK" />
+ <field name="MATCH_ADJUSTMENT_NORMAL" />
+ <field name="MATCH_CATEGORY_EMPTY" />
+ <field name="MATCH_CATEGORY_HOST" />
+ <field name="MATCH_CATEGORY_MASK" />
+ <field name="MATCH_CATEGORY_PATH" />
+ <field name="MATCH_CATEGORY_PORT" />
+ <field name="MATCH_CATEGORY_SCHEME" />
+ <field name="MATCH_CATEGORY_SCHEME_SPECIFIC_PART" since="19" />
+ <field name="MATCH_CATEGORY_TYPE" />
+ <field name="NO_MATCH_ACTION" />
+ <field name="NO_MATCH_CATEGORY" />
+ <field name="NO_MATCH_DATA" />
+ <field name="NO_MATCH_TYPE" />
+ <field name="SYSTEM_HIGH_PRIORITY" />
+ <field name="SYSTEM_LOW_PRIORITY" />
+ </class>
+ <class name="android/content/IntentFilter$AuthorityEntry" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="getHost()Ljava/lang/String;" />
+ <method name="getPort()I" />
+ <method name="match(Landroid/net/Uri;)I" />
+ </class>
+ <class name="android/content/IntentFilter$MalformedMimeTypeException" since="1">
+ <extends name="android/util/AndroidException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/content/IntentSender" since="4">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getCreatorPackage()Ljava/lang/String;" since="17" />
+ <method name="getCreatorUid()I" since="17" />
+ <method name="getCreatorUserHandle()Landroid/os/UserHandle;" since="17" />
+ <method name="getTargetPackage()Ljava/lang/String;" since="9" />
+ <method name="readIntentSenderOrNullFromParcel(Landroid/os/Parcel;)Landroid/content/IntentSender;" />
+ <method name="sendIntent(Landroid/content/Context;ILandroid/content/Intent;Landroid/content/IntentSender$OnFinished;Landroid/os/Handler;)V" />
+ <method name="sendIntent(Landroid/content/Context;ILandroid/content/Intent;Landroid/content/IntentSender$OnFinished;Landroid/os/Handler;Ljava/lang/String;)V" since="14" />
+ <method name="writeIntentSenderOrNullToParcel(Landroid/content/IntentSender;Landroid/os/Parcel;)V" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/content/IntentSender$OnFinished" since="4">
+ <extends name="java/lang/Object" />
+ <method name="onSendFinished(Landroid/content/IntentSender;Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;)V" />
+ </class>
+ <class name="android/content/IntentSender$SendIntentException" since="4">
+ <extends name="android/util/AndroidException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/Exception;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/content/Loader" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="abandon()V" />
+ <method name="cancelLoad()Z" since="16" />
+ <method name="commitContentChanged()V" since="18" />
+ <method name="dataToString(Ljava/lang/Object;)Ljava/lang/String;" />
+ <method name="deliverCancellation()V" since="16" />
+ <method name="deliverResult(Ljava/lang/Object;)V" />
+ <method name="dump(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V" />
+ <method name="forceLoad()V" />
+ <method name="getContext()Landroid/content/Context;" />
+ <method name="getId()I" />
+ <method name="isAbandoned()Z" />
+ <method name="isReset()Z" />
+ <method name="isStarted()Z" />
+ <method name="onAbandon()V" />
+ <method name="onCancelLoad()Z" since="16" />
+ <method name="onContentChanged()V" />
+ <method name="onForceLoad()V" />
+ <method name="onReset()V" />
+ <method name="onStartLoading()V" />
+ <method name="onStopLoading()V" />
+ <method name="registerListener(ILandroid/content/Loader$OnLoadCompleteListener;)V" />
+ <method name="registerOnLoadCanceledListener(Landroid/content/Loader$OnLoadCanceledListener;)V" since="16" />
+ <method name="reset()V" />
+ <method name="rollbackContentChanged()V" since="18" />
+ <method name="startLoading()V" />
+ <method name="stopLoading()V" />
+ <method name="takeContentChanged()Z" />
+ <method name="unregisterListener(Landroid/content/Loader$OnLoadCompleteListener;)V" />
+ <method name="unregisterOnLoadCanceledListener(Landroid/content/Loader$OnLoadCanceledListener;)V" since="16" />
+ </class>
+ <class name="android/content/Loader$ForceLoadContentObserver" since="11">
+ <extends name="android/database/ContentObserver" />
+ <method name="&lt;init>(Landroid/content/Loader;)V" />
+ </class>
+ <class name="android/content/Loader$OnLoadCanceledListener" since="16">
+ <extends name="java/lang/Object" />
+ <method name="onLoadCanceled(Landroid/content/Loader;)V" />
+ </class>
+ <class name="android/content/Loader$OnLoadCompleteListener" since="11">
+ <extends name="java/lang/Object" />
+ <method name="onLoadComplete(Landroid/content/Loader;Ljava/lang/Object;)V" />
+ </class>
+ <class name="android/content/MutableContextWrapper" since="1">
+ <extends name="android/content/ContextWrapper" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="setBaseContext(Landroid/content/Context;)V" />
+ </class>
+ <class name="android/content/OperationApplicationException" since="5">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ <method name="getNumSuccessfulYieldPoints()I" />
+ </class>
+ <class name="android/content/PeriodicSync" since="8">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/Bundle;J)V" />
+ <field name="CREATOR" />
+ <field name="account" />
+ <field name="authority" />
+ <field name="extras" />
+ <field name="period" />
+ </class>
+ <class name="android/content/ReceiverCallNotAllowedException" since="1">
+ <extends name="android/util/AndroidRuntimeException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/content/RestrictionEntry" since="18">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(ILjava/lang/String;)V" since="21" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="&lt;init>(Ljava/lang/String;I)V" since="21" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Z)V" />
+ <method name="&lt;init>(Ljava/lang/String;[Ljava/lang/String;)V" />
+ <method name="getAllSelectedStrings()[Ljava/lang/String;" />
+ <method name="getChoiceEntries()[Ljava/lang/String;" />
+ <method name="getChoiceValues()[Ljava/lang/String;" />
+ <method name="getDescription()Ljava/lang/String;" />
+ <method name="getIntValue()I" since="21" />
+ <method name="getKey()Ljava/lang/String;" />
+ <method name="getSelectedState()Z" />
+ <method name="getSelectedString()Ljava/lang/String;" />
+ <method name="getTitle()Ljava/lang/String;" />
+ <method name="getType()I" />
+ <method name="setAllSelectedStrings([Ljava/lang/String;)V" />
+ <method name="setChoiceEntries(Landroid/content/Context;I)V" />
+ <method name="setChoiceEntries([Ljava/lang/String;)V" />
+ <method name="setChoiceValues(Landroid/content/Context;I)V" />
+ <method name="setChoiceValues([Ljava/lang/String;)V" />
+ <method name="setDescription(Ljava/lang/String;)V" />
+ <method name="setIntValue(I)V" since="21" />
+ <method name="setSelectedState(Z)V" />
+ <method name="setSelectedString(Ljava/lang/String;)V" />
+ <method name="setTitle(Ljava/lang/String;)V" />
+ <method name="setType(I)V" />
+ <field name="CREATOR" />
+ <field name="TYPE_BOOLEAN" />
+ <field name="TYPE_CHOICE" />
+ <field name="TYPE_INTEGER" since="21" />
+ <field name="TYPE_MULTI_SELECT" />
+ <field name="TYPE_NULL" />
+ <field name="TYPE_STRING" since="21" />
+ </class>
+ <class name="android/content/RestrictionsManager" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="createLocalApprovalIntent()Landroid/content/Intent;" />
+ <method name="getApplicationRestrictions()Landroid/os/Bundle;" />
+ <method name="getManifestRestrictions(Ljava/lang/String;)Ljava/util/List;" />
+ <method name="hasRestrictionsProvider()Z" />
+ <method name="notifyPermissionResponse(Ljava/lang/String;Landroid/os/PersistableBundle;)V" />
+ <method name="requestPermission(Ljava/lang/String;Ljava/lang/String;Landroid/os/PersistableBundle;)V" />
+ <field name="ACTION_PERMISSION_RESPONSE_RECEIVED" />
+ <field name="ACTION_REQUEST_LOCAL_APPROVAL" />
+ <field name="ACTION_REQUEST_PERMISSION" />
+ <field name="EXTRA_PACKAGE_NAME" />
+ <field name="EXTRA_REQUEST_BUNDLE" />
+ <field name="EXTRA_REQUEST_ID" />
+ <field name="EXTRA_REQUEST_TYPE" />
+ <field name="EXTRA_RESPONSE_BUNDLE" />
+ <field name="META_DATA_APP_RESTRICTIONS" />
+ <field name="REQUEST_KEY_APPROVE_LABEL" />
+ <field name="REQUEST_KEY_DATA" />
+ <field name="REQUEST_KEY_DENY_LABEL" />
+ <field name="REQUEST_KEY_ICON" />
+ <field name="REQUEST_KEY_ID" />
+ <field name="REQUEST_KEY_MESSAGE" />
+ <field name="REQUEST_KEY_NEW_REQUEST" />
+ <field name="REQUEST_KEY_TITLE" />
+ <field name="REQUEST_TYPE_APPROVAL" />
+ <field name="RESPONSE_KEY_ERROR_CODE" />
+ <field name="RESPONSE_KEY_MESSAGE" />
+ <field name="RESPONSE_KEY_RESPONSE_TIMESTAMP" />
+ <field name="RESPONSE_KEY_RESULT" />
+ <field name="RESULT_APPROVED" />
+ <field name="RESULT_DENIED" />
+ <field name="RESULT_ERROR" />
+ <field name="RESULT_ERROR_BAD_REQUEST" />
+ <field name="RESULT_ERROR_INTERNAL" />
+ <field name="RESULT_ERROR_NETWORK" />
+ <field name="RESULT_NO_RESPONSE" />
+ <field name="RESULT_UNKNOWN_REQUEST" />
+ </class>
+ <class name="android/content/SearchRecentSuggestionsProvider" since="1">
+ <extends name="android/content/ContentProvider" />
+ <method name="&lt;init>()V" />
+ <method name="setupSuggestions(Ljava/lang/String;I)V" />
+ <field name="DATABASE_MODE_2LINES" />
+ <field name="DATABASE_MODE_QUERIES" />
+ </class>
+ <class name="android/content/ServiceConnection" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V" />
+ <method name="onServiceDisconnected(Landroid/content/ComponentName;)V" />
+ </class>
+ <class name="android/content/SharedPreferences" since="1">
+ <extends name="java/lang/Object" />
+ <method name="contains(Ljava/lang/String;)Z" />
+ <method name="edit()Landroid/content/SharedPreferences$Editor;" />
+ <method name="getAll()Ljava/util/Map;" />
+ <method name="getBoolean(Ljava/lang/String;Z)Z" />
+ <method name="getFloat(Ljava/lang/String;F)F" />
+ <method name="getInt(Ljava/lang/String;I)I" />
+ <method name="getLong(Ljava/lang/String;J)J" />
+ <method name="getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getStringSet(Ljava/lang/String;Ljava/util/Set;)Ljava/util/Set;" since="11" />
+ <method name="registerOnSharedPreferenceChangeListener(Landroid/content/SharedPreferences$OnSharedPreferenceChangeListener;)V" />
+ <method name="unregisterOnSharedPreferenceChangeListener(Landroid/content/SharedPreferences$OnSharedPreferenceChangeListener;)V" />
+ </class>
+ <class name="android/content/SharedPreferences$Editor" since="1">
+ <extends name="java/lang/Object" />
+ <method name="apply()V" since="9" />
+ <method name="clear()Landroid/content/SharedPreferences$Editor;" />
+ <method name="commit()Z" />
+ <method name="putBoolean(Ljava/lang/String;Z)Landroid/content/SharedPreferences$Editor;" />
+ <method name="putFloat(Ljava/lang/String;F)Landroid/content/SharedPreferences$Editor;" />
+ <method name="putInt(Ljava/lang/String;I)Landroid/content/SharedPreferences$Editor;" />
+ <method name="putLong(Ljava/lang/String;J)Landroid/content/SharedPreferences$Editor;" />
+ <method name="putString(Ljava/lang/String;Ljava/lang/String;)Landroid/content/SharedPreferences$Editor;" />
+ <method name="putStringSet(Ljava/lang/String;Ljava/util/Set;)Landroid/content/SharedPreferences$Editor;" since="11" />
+ <method name="remove(Ljava/lang/String;)Landroid/content/SharedPreferences$Editor;" />
+ </class>
+ <class name="android/content/SharedPreferences$OnSharedPreferenceChangeListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onSharedPreferenceChanged(Landroid/content/SharedPreferences;Ljava/lang/String;)V" />
+ </class>
+ <class name="android/content/SyncAdapterType" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ZZ)V" />
+ <method name="allowParallelSyncs()Z" since="11" />
+ <method name="getSettingsActivity()Ljava/lang/String;" since="14" />
+ <method name="isAlwaysSyncable()Z" since="11" />
+ <method name="isUserVisible()Z" />
+ <method name="newKey(Ljava/lang/String;Ljava/lang/String;)Landroid/content/SyncAdapterType;" />
+ <method name="supportsUploading()Z" />
+ <field name="CREATOR" />
+ <field name="accountType" />
+ <field name="authority" />
+ <field name="isKey" />
+ </class>
+ <class name="android/content/SyncContext" since="5">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getSyncContextBinder()Landroid/os/IBinder;" />
+ <method name="onFinished(Landroid/content/SyncResult;)V" />
+ </class>
+ <class name="android/content/SyncInfo" since="8">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" since="11" />
+ <method name="&lt;init>()V" />
+ <field name="account" />
+ <field name="authority" />
+ <field name="startTime" />
+ </class>
+ <class name="android/content/SyncRequest" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/content/SyncRequest$Builder" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="build()Landroid/content/SyncRequest;" />
+ <method name="setDisallowMetered(Z)Landroid/content/SyncRequest$Builder;" />
+ <method name="setExpedited(Z)Landroid/content/SyncRequest$Builder;" />
+ <method name="setExtras(Landroid/os/Bundle;)Landroid/content/SyncRequest$Builder;" />
+ <method name="setIgnoreBackoff(Z)Landroid/content/SyncRequest$Builder;" />
+ <method name="setIgnoreSettings(Z)Landroid/content/SyncRequest$Builder;" />
+ <method name="setManual(Z)Landroid/content/SyncRequest$Builder;" />
+ <method name="setNoRetry(Z)Landroid/content/SyncRequest$Builder;" />
+ <method name="setSyncAdapter(Landroid/accounts/Account;Ljava/lang/String;)Landroid/content/SyncRequest$Builder;" />
+ <method name="syncOnce()Landroid/content/SyncRequest$Builder;" />
+ <method name="syncPeriodic(JJ)Landroid/content/SyncRequest$Builder;" />
+ </class>
+ <class name="android/content/SyncResult" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="clear()V" />
+ <method name="hasError()Z" />
+ <method name="hasHardError()Z" />
+ <method name="hasSoftError()Z" />
+ <method name="madeSomeProgress()Z" />
+ <method name="toDebugString()Ljava/lang/String;" />
+ <field name="ALREADY_IN_PROGRESS" />
+ <field name="CREATOR" />
+ <field name="databaseError" />
+ <field name="delayUntil" since="8" />
+ <field name="fullSyncRequested" />
+ <field name="moreRecordsToGet" />
+ <field name="partialSyncUnavailable" />
+ <field name="stats" />
+ <field name="syncAlreadyInProgress" />
+ <field name="tooManyDeletions" />
+ <field name="tooManyRetries" />
+ </class>
+ <class name="android/content/SyncStats" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="clear()V" />
+ <field name="CREATOR" />
+ <field name="numAuthExceptions" />
+ <field name="numConflictDetectedExceptions" />
+ <field name="numDeletes" />
+ <field name="numEntries" />
+ <field name="numInserts" />
+ <field name="numIoExceptions" />
+ <field name="numParseExceptions" />
+ <field name="numSkippedEntries" />
+ <field name="numUpdates" />
+ </class>
+ <class name="android/content/SyncStatusObserver" since="5">
+ <extends name="java/lang/Object" />
+ <method name="onStatusChanged(I)V" />
+ </class>
+ <class name="android/content/UriMatcher" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(I)V" />
+ <method name="addURI(Ljava/lang/String;Ljava/lang/String;I)V" />
+ <method name="match(Landroid/net/Uri;)I" />
+ <field name="NO_MATCH" />
+ </class>
+ <class name="android/content/UriPermission" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getPersistedTime()J" />
+ <method name="getUri()Landroid/net/Uri;" />
+ <method name="isReadPermission()Z" />
+ <method name="isWritePermission()Z" />
+ <field name="CREATOR" />
+ <field name="INVALID_TIME" />
+ </class>
+ <class name="android/content/pm/ActivityInfo" since="1">
+ <extends name="android/content/pm/ComponentInfo" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/pm/ActivityInfo;)V" />
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V" />
+ <method name="getThemeResource()I" />
+ <field name="CONFIG_DENSITY" since="17" />
+ <field name="CONFIG_FONT_SCALE" />
+ <field name="CONFIG_KEYBOARD" />
+ <field name="CONFIG_KEYBOARD_HIDDEN" />
+ <field name="CONFIG_LAYOUT_DIRECTION" since="17" />
+ <field name="CONFIG_LOCALE" />
+ <field name="CONFIG_MCC" />
+ <field name="CONFIG_MNC" />
+ <field name="CONFIG_NAVIGATION" />
+ <field name="CONFIG_ORIENTATION" />
+ <field name="CONFIG_SCREEN_LAYOUT" since="4" />
+ <field name="CONFIG_SCREEN_SIZE" since="13" />
+ <field name="CONFIG_SMALLEST_SCREEN_SIZE" since="13" />
+ <field name="CONFIG_TOUCHSCREEN" />
+ <field name="CONFIG_UI_MODE" since="8" />
+ <field name="CREATOR" />
+ <field name="DOCUMENT_LAUNCH_ALWAYS" since="21" />
+ <field name="DOCUMENT_LAUNCH_INTO_EXISTING" since="21" />
+ <field name="DOCUMENT_LAUNCH_NEVER" since="21" />
+ <field name="DOCUMENT_LAUNCH_NONE" since="21" />
+ <field name="FLAG_ALLOW_TASK_REPARENTING" />
+ <field name="FLAG_ALWAYS_RETAIN_TASK_STATE" />
+ <field name="FLAG_AUTO_REMOVE_FROM_RECENTS" since="21" />
+ <field name="FLAG_CLEAR_TASK_ON_LAUNCH" />
+ <field name="FLAG_EXCLUDE_FROM_RECENTS" />
+ <field name="FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS" since="5" />
+ <field name="FLAG_FINISH_ON_TASK_LAUNCH" />
+ <field name="FLAG_HARDWARE_ACCELERATED" since="11" />
+ <field name="FLAG_IMMERSIVE" since="18" />
+ <field name="FLAG_MULTIPROCESS" />
+ <field name="FLAG_NO_HISTORY" since="3" />
+ <field name="FLAG_RELINQUISH_TASK_IDENTITY" since="21" />
+ <field name="FLAG_RESUME_WHILE_PAUSING" since="21" />
+ <field name="FLAG_SINGLE_USER" since="17" />
+ <field name="FLAG_STATE_NOT_NEEDED" />
+ <field name="LAUNCH_MULTIPLE" />
+ <field name="LAUNCH_SINGLE_INSTANCE" />
+ <field name="LAUNCH_SINGLE_TASK" />
+ <field name="LAUNCH_SINGLE_TOP" />
+ <field name="PERSIST_ACROSS_REBOOTS" since="21" />
+ <field name="PERSIST_NEVER" since="21" />
+ <field name="PERSIST_ROOT_ONLY" since="21" />
+ <field name="SCREEN_ORIENTATION_BEHIND" />
+ <field name="SCREEN_ORIENTATION_FULL_SENSOR" since="9" />
+ <field name="SCREEN_ORIENTATION_FULL_USER" since="18" />
+ <field name="SCREEN_ORIENTATION_LANDSCAPE" />
+ <field name="SCREEN_ORIENTATION_LOCKED" since="18" />
+ <field name="SCREEN_ORIENTATION_NOSENSOR" />
+ <field name="SCREEN_ORIENTATION_PORTRAIT" />
+ <field name="SCREEN_ORIENTATION_REVERSE_LANDSCAPE" since="9" />
+ <field name="SCREEN_ORIENTATION_REVERSE_PORTRAIT" since="9" />
+ <field name="SCREEN_ORIENTATION_SENSOR" />
+ <field name="SCREEN_ORIENTATION_SENSOR_LANDSCAPE" since="9" />
+ <field name="SCREEN_ORIENTATION_SENSOR_PORTRAIT" since="9" />
+ <field name="SCREEN_ORIENTATION_UNSPECIFIED" />
+ <field name="SCREEN_ORIENTATION_USER" />
+ <field name="SCREEN_ORIENTATION_USER_LANDSCAPE" since="18" />
+ <field name="SCREEN_ORIENTATION_USER_PORTRAIT" since="18" />
+ <field name="UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW" since="14" />
+ <field name="configChanges" />
+ <field name="documentLaunchMode" since="21" />
+ <field name="flags" />
+ <field name="launchMode" />
+ <field name="maxRecents" since="21" />
+ <field name="parentActivityName" since="16" />
+ <field name="permission" />
+ <field name="persistableMode" since="21" />
+ <field name="screenOrientation" />
+ <field name="softInputMode" since="3" />
+ <field name="targetActivity" />
+ <field name="taskAffinity" />
+ <field name="theme" />
+ <field name="uiOptions" since="14" />
+ </class>
+ <class name="android/content/pm/ApplicationInfo" since="1">
+ <extends name="android/content/pm/PackageItemInfo" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/pm/ApplicationInfo;)V" />
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V" />
+ <method name="loadDescription(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;" />
+ <field name="CREATOR" />
+ <field name="FLAG_ALLOW_BACKUP" since="8" />
+ <field name="FLAG_ALLOW_CLEAR_USER_DATA" />
+ <field name="FLAG_ALLOW_TASK_REPARENTING" />
+ <field name="FLAG_DEBUGGABLE" />
+ <field name="FLAG_EXTERNAL_STORAGE" since="8" />
+ <field name="FLAG_FACTORY_TEST" />
+ <field name="FLAG_FULL_BACKUP_ONLY" since="21" />
+ <field name="FLAG_HAS_CODE" />
+ <field name="FLAG_INSTALLED" since="17" />
+ <field name="FLAG_IS_DATA_ONLY" since="17" />
+ <field name="FLAG_IS_GAME" since="21" />
+ <field name="FLAG_KILL_AFTER_RESTORE" since="8" />
+ <field name="FLAG_LARGE_HEAP" since="11" />
+ <field name="FLAG_MULTIARCH" since="21" />
+ <field name="FLAG_PERSISTENT" />
+ <field name="FLAG_RESIZEABLE_FOR_SCREENS" since="4" />
+ <field name="FLAG_RESTORE_ANY_VERSION" since="8" />
+ <field name="FLAG_STOPPED" since="12" />
+ <field name="FLAG_SUPPORTS_LARGE_SCREENS" since="4" />
+ <field name="FLAG_SUPPORTS_NORMAL_SCREENS" since="4" />
+ <field name="FLAG_SUPPORTS_RTL" since="17" />
+ <field name="FLAG_SUPPORTS_SCREEN_DENSITIES" since="4" />
+ <field name="FLAG_SUPPORTS_SMALL_SCREENS" since="4" />
+ <field name="FLAG_SUPPORTS_XLARGE_SCREENS" since="11" />
+ <field name="FLAG_SYSTEM" />
+ <field name="FLAG_TEST_ONLY" since="4" />
+ <field name="FLAG_UPDATED_SYSTEM_APP" since="4" />
+ <field name="FLAG_VM_SAFE_MODE" since="8" />
+ <field name="backupAgentName" since="8" />
+ <field name="className" />
+ <field name="compatibleWidthLimitDp" since="13" />
+ <field name="dataDir" />
+ <field name="descriptionRes" />
+ <field name="enabled" />
+ <field name="flags" />
+ <field name="largestWidthLimitDp" since="13" />
+ <field name="manageSpaceActivityName" />
+ <field name="nativeLibraryDir" since="9" />
+ <field name="permission" />
+ <field name="processName" />
+ <field name="publicSourceDir" />
+ <field name="requiresSmallestWidthDp" since="13" />
+ <field name="sharedLibraryFiles" />
+ <field name="sourceDir" />
+ <field name="splitPublicSourceDirs" since="21" />
+ <field name="splitSourceDirs" since="21" />
+ <field name="targetSdkVersion" since="4" />
+ <field name="taskAffinity" />
+ <field name="theme" />
+ <field name="uiOptions" since="14" />
+ <field name="uid" />
+ </class>
+ <class name="android/content/pm/ApplicationInfo$DisplayNameComparator" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/Comparator" />
+ <method name="&lt;init>(Landroid/content/pm/PackageManager;)V" />
+ <method name="compare(Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;)I" />
+ </class>
+ <class name="android/content/pm/ComponentInfo" since="1">
+ <extends name="android/content/pm/PackageItemInfo" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/pm/ComponentInfo;)V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="getBannerResource()I" since="20" />
+ <method name="getIconResource()I" />
+ <method name="getLogoResource()I" since="19" />
+ <method name="isEnabled()Z" since="11" />
+ <field name="applicationInfo" />
+ <field name="descriptionRes" since="8" />
+ <field name="enabled" />
+ <field name="exported" />
+ <field name="processName" />
+ </class>
+ <class name="android/content/pm/ConfigurationInfo" since="3">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/pm/ConfigurationInfo;)V" />
+ <method name="getGlEsVersion()Ljava/lang/String;" since="4" />
+ <field name="CREATOR" />
+ <field name="GL_ES_VERSION_UNDEFINED" since="4" />
+ <field name="INPUT_FEATURE_FIVE_WAY_NAV" />
+ <field name="INPUT_FEATURE_HARD_KEYBOARD" />
+ <field name="reqGlEsVersion" since="4" />
+ <field name="reqInputFeatures" />
+ <field name="reqKeyboardType" />
+ <field name="reqNavigation" />
+ <field name="reqTouchScreen" />
+ </class>
+ <class name="android/content/pm/FeatureGroupInfo" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/pm/FeatureGroupInfo;)V" />
+ <field name="CREATOR" />
+ <field name="features" />
+ </class>
+ <class name="android/content/pm/FeatureInfo" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/pm/FeatureInfo;)V" />
+ <method name="getGlEsVersion()Ljava/lang/String;" />
+ <field name="CREATOR" />
+ <field name="FLAG_REQUIRED" />
+ <field name="GL_ES_VERSION_UNDEFINED" />
+ <field name="flags" />
+ <field name="name" />
+ <field name="reqGlEsVersion" />
+ </class>
+ <class name="android/content/pm/IPackageInstallObserver" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/IInterface" />
+ <method name="packageInstalled(Ljava/lang/String;I)V" />
+ </class>
+ <class name="android/content/pm/IPackageInstallObserver$Stub" since="1">
+ <extends name="android/os/Binder" />
+ <implements name="android/content/pm/IPackageInstallObserver" />
+ <method name="&lt;init>()V" />
+ <method name="asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageInstallObserver;" />
+ </class>
+ <class name="android/content/pm/InstrumentationInfo" since="1">
+ <extends name="android/content/pm/PackageItemInfo" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/pm/InstrumentationInfo;)V" />
+ <field name="CREATOR" />
+ <field name="dataDir" />
+ <field name="functionalTest" />
+ <field name="handleProfiling" />
+ <field name="publicSourceDir" />
+ <field name="sourceDir" />
+ <field name="splitPublicSourceDirs" since="21" />
+ <field name="splitSourceDirs" since="21" />
+ <field name="targetPackage" />
+ </class>
+ <class name="android/content/pm/LabeledIntent" since="5">
+ <extends name="android/content/Intent" />
+ <method name="&lt;init>(Landroid/content/Intent;Ljava/lang/String;II)V" />
+ <method name="&lt;init>(Landroid/content/Intent;Ljava/lang/String;Ljava/lang/CharSequence;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;II)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/CharSequence;I)V" />
+ <method name="getIconResource()I" />
+ <method name="getLabelResource()I" />
+ <method name="getNonLocalizedLabel()Ljava/lang/CharSequence;" />
+ <method name="getSourcePackage()Ljava/lang/String;" />
+ <method name="loadIcon(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;" />
+ <method name="loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/content/pm/LauncherActivityInfo" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getApplicationInfo()Landroid/content/pm/ApplicationInfo;" />
+ <method name="getBadgedIcon(I)Landroid/graphics/drawable/Drawable;" />
+ <method name="getComponentName()Landroid/content/ComponentName;" />
+ <method name="getFirstInstallTime()J" />
+ <method name="getIcon(I)Landroid/graphics/drawable/Drawable;" />
+ <method name="getLabel()Ljava/lang/CharSequence;" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getUser()Landroid/os/UserHandle;" />
+ </class>
+ <class name="android/content/pm/LauncherApps" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getActivityList(Ljava/lang/String;Landroid/os/UserHandle;)Ljava/util/List;" />
+ <method name="isActivityEnabled(Landroid/content/ComponentName;Landroid/os/UserHandle;)Z" />
+ <method name="isPackageEnabled(Ljava/lang/String;Landroid/os/UserHandle;)Z" />
+ <method name="registerCallback(Landroid/content/pm/LauncherApps$Callback;)V" />
+ <method name="registerCallback(Landroid/content/pm/LauncherApps$Callback;Landroid/os/Handler;)V" />
+ <method name="resolveActivity(Landroid/content/Intent;Landroid/os/UserHandle;)Landroid/content/pm/LauncherActivityInfo;" />
+ <method name="startAppDetailsActivity(Landroid/content/ComponentName;Landroid/os/UserHandle;Landroid/graphics/Rect;Landroid/os/Bundle;)V" />
+ <method name="startMainActivity(Landroid/content/ComponentName;Landroid/os/UserHandle;Landroid/graphics/Rect;Landroid/os/Bundle;)V" />
+ <method name="unregisterCallback(Landroid/content/pm/LauncherApps$Callback;)V" />
+ </class>
+ <class name="android/content/pm/LauncherApps$Callback" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onPackageAdded(Ljava/lang/String;Landroid/os/UserHandle;)V" />
+ <method name="onPackageChanged(Ljava/lang/String;Landroid/os/UserHandle;)V" />
+ <method name="onPackageRemoved(Ljava/lang/String;Landroid/os/UserHandle;)V" />
+ <method name="onPackagesAvailable([Ljava/lang/String;Landroid/os/UserHandle;Z)V" />
+ <method name="onPackagesUnavailable([Ljava/lang/String;Landroid/os/UserHandle;Z)V" />
+ </class>
+ <class name="android/content/pm/PackageInfo" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <field name="CREATOR" />
+ <field name="INSTALL_LOCATION_AUTO" since="21" />
+ <field name="INSTALL_LOCATION_INTERNAL_ONLY" since="21" />
+ <field name="INSTALL_LOCATION_PREFER_EXTERNAL" since="21" />
+ <field name="REQUESTED_PERMISSION_GRANTED" since="16" />
+ <field name="REQUESTED_PERMISSION_REQUIRED" since="16" />
+ <field name="activities" />
+ <field name="applicationInfo" />
+ <field name="configPreferences" since="3" />
+ <field name="featureGroups" since="21" />
+ <field name="firstInstallTime" since="9" />
+ <field name="gids" />
+ <field name="installLocation" since="21" />
+ <field name="instrumentation" />
+ <field name="lastUpdateTime" since="9" />
+ <field name="packageName" />
+ <field name="permissions" />
+ <field name="providers" />
+ <field name="receivers" />
+ <field name="reqFeatures" since="5" />
+ <field name="requestedPermissions" />
+ <field name="requestedPermissionsFlags" since="16" />
+ <field name="services" />
+ <field name="sharedUserId" since="3" />
+ <field name="sharedUserLabel" since="3" />
+ <field name="signatures" />
+ <field name="splitNames" since="21" />
+ <field name="versionCode" />
+ <field name="versionName" />
+ </class>
+ <class name="android/content/pm/PackageInstaller" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="abandonSession(I)V" />
+ <method name="createSession(Landroid/content/pm/PackageInstaller$SessionParams;)I" />
+ <method name="getAllSessions()Ljava/util/List;" />
+ <method name="getMySessions()Ljava/util/List;" />
+ <method name="getSessionInfo(I)Landroid/content/pm/PackageInstaller$SessionInfo;" />
+ <method name="openSession(I)Landroid/content/pm/PackageInstaller$Session;" />
+ <method name="registerSessionCallback(Landroid/content/pm/PackageInstaller$SessionCallback;)V" />
+ <method name="registerSessionCallback(Landroid/content/pm/PackageInstaller$SessionCallback;Landroid/os/Handler;)V" />
+ <method name="uninstall(Ljava/lang/String;Landroid/content/IntentSender;)V" />
+ <method name="unregisterSessionCallback(Landroid/content/pm/PackageInstaller$SessionCallback;)V" />
+ <method name="updateSessionAppIcon(ILandroid/graphics/Bitmap;)V" />
+ <method name="updateSessionAppLabel(ILjava/lang/CharSequence;)V" />
+ <field name="ACTION_SESSION_DETAILS" />
+ <field name="EXTRA_OTHER_PACKAGE_NAME" />
+ <field name="EXTRA_PACKAGE_NAME" />
+ <field name="EXTRA_SESSION_ID" />
+ <field name="EXTRA_STATUS" />
+ <field name="EXTRA_STATUS_MESSAGE" />
+ <field name="EXTRA_STORAGE_PATH" />
+ <field name="STATUS_FAILURE" />
+ <field name="STATUS_FAILURE_ABORTED" />
+ <field name="STATUS_FAILURE_BLOCKED" />
+ <field name="STATUS_FAILURE_CONFLICT" />
+ <field name="STATUS_FAILURE_INCOMPATIBLE" />
+ <field name="STATUS_FAILURE_INVALID" />
+ <field name="STATUS_FAILURE_STORAGE" />
+ <field name="STATUS_PENDING_USER_ACTION" />
+ <field name="STATUS_SUCCESS" />
+ </class>
+ <class name="android/content/pm/PackageInstaller$Session" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Closeable" />
+ <method name="&lt;init>()V" />
+ <method name="abandon()V" />
+ <method name="commit(Landroid/content/IntentSender;)V" />
+ <method name="fsync(Ljava/io/OutputStream;)V" />
+ <method name="getNames()[Ljava/lang/String;" />
+ <method name="openRead(Ljava/lang/String;)Ljava/io/InputStream;" />
+ <method name="openWrite(Ljava/lang/String;JJ)Ljava/io/OutputStream;" />
+ <method name="setStagingProgress(F)V" />
+ </class>
+ <class name="android/content/pm/PackageInstaller$SessionCallback" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onActiveChanged(IZ)V" />
+ <method name="onBadgingChanged(I)V" />
+ <method name="onCreated(I)V" />
+ <method name="onFinished(IZ)V" />
+ <method name="onProgressChanged(IF)V" />
+ </class>
+ <class name="android/content/pm/PackageInstaller$SessionInfo" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="createDetailsIntent()Landroid/content/Intent;" />
+ <method name="getAppIcon()Landroid/graphics/Bitmap;" />
+ <method name="getAppLabel()Ljava/lang/CharSequence;" />
+ <method name="getAppPackageName()Ljava/lang/String;" />
+ <method name="getInstallerPackageName()Ljava/lang/String;" />
+ <method name="getProgress()F" />
+ <method name="getSessionId()I" />
+ <method name="isActive()Z" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/content/pm/PackageInstaller$SessionParams" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(I)V" />
+ <method name="setAppIcon(Landroid/graphics/Bitmap;)V" />
+ <method name="setAppLabel(Ljava/lang/CharSequence;)V" />
+ <method name="setAppPackageName(Ljava/lang/String;)V" />
+ <method name="setInstallLocation(I)V" />
+ <method name="setOriginatingUri(Landroid/net/Uri;)V" />
+ <method name="setReferrerUri(Landroid/net/Uri;)V" />
+ <method name="setSize(J)V" />
+ <field name="CREATOR" />
+ <field name="MODE_FULL_INSTALL" />
+ <field name="MODE_INHERIT_EXISTING" />
+ </class>
+ <class name="android/content/pm/PackageItemInfo" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/pm/PackageItemInfo;)V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="dumpBack(Landroid/util/Printer;Ljava/lang/String;)V" />
+ <method name="dumpFront(Landroid/util/Printer;Ljava/lang/String;)V" />
+ <method name="loadBanner(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;" since="20" />
+ <method name="loadIcon(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;" />
+ <method name="loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;" />
+ <method name="loadLogo(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;" since="9" />
+ <method name="loadXmlMetaData(Landroid/content/pm/PackageManager;Ljava/lang/String;)Landroid/content/res/XmlResourceParser;" />
+ <method name="writeToParcel(Landroid/os/Parcel;I)V" />
+ <field name="banner" since="20" />
+ <field name="icon" />
+ <field name="labelRes" />
+ <field name="logo" since="9" />
+ <field name="metaData" />
+ <field name="name" />
+ <field name="nonLocalizedLabel" />
+ <field name="packageName" />
+ </class>
+ <class name="android/content/pm/PackageItemInfo$DisplayNameComparator" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/Comparator" />
+ <method name="&lt;init>(Landroid/content/pm/PackageManager;)V" />
+ <method name="compare(Landroid/content/pm/PackageItemInfo;Landroid/content/pm/PackageItemInfo;)I" />
+ </class>
+ <class name="android/content/pm/PackageManager" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addPackageToPreferred(Ljava/lang/String;)V" />
+ <method name="addPermission(Landroid/content/pm/PermissionInfo;)Z" />
+ <method name="addPermissionAsync(Landroid/content/pm/PermissionInfo;)Z" since="8" />
+ <method name="addPreferredActivity(Landroid/content/IntentFilter;I[Landroid/content/ComponentName;Landroid/content/ComponentName;)V" />
+ <method name="canonicalToCurrentPackageNames([Ljava/lang/String;)[Ljava/lang/String;" since="8" />
+ <method name="checkPermission(Ljava/lang/String;Ljava/lang/String;)I" />
+ <method name="checkSignatures(II)I" since="5" />
+ <method name="checkSignatures(Ljava/lang/String;Ljava/lang/String;)I" />
+ <method name="clearPackagePreferredActivities(Ljava/lang/String;)V" />
+ <method name="currentToCanonicalPackageNames([Ljava/lang/String;)[Ljava/lang/String;" since="8" />
+ <method name="extendVerificationTimeout(IIJ)V" since="17" />
+ <method name="getActivityBanner(Landroid/content/ComponentName;)Landroid/graphics/drawable/Drawable;" since="20" />
+ <method name="getActivityBanner(Landroid/content/Intent;)Landroid/graphics/drawable/Drawable;" since="20" />
+ <method name="getActivityIcon(Landroid/content/ComponentName;)Landroid/graphics/drawable/Drawable;" />
+ <method name="getActivityIcon(Landroid/content/Intent;)Landroid/graphics/drawable/Drawable;" />
+ <method name="getActivityInfo(Landroid/content/ComponentName;I)Landroid/content/pm/ActivityInfo;" />
+ <method name="getActivityLogo(Landroid/content/ComponentName;)Landroid/graphics/drawable/Drawable;" since="9" />
+ <method name="getActivityLogo(Landroid/content/Intent;)Landroid/graphics/drawable/Drawable;" since="9" />
+ <method name="getAllPermissionGroups(I)Ljava/util/List;" />
+ <method name="getApplicationBanner(Landroid/content/pm/ApplicationInfo;)Landroid/graphics/drawable/Drawable;" since="20" />
+ <method name="getApplicationBanner(Ljava/lang/String;)Landroid/graphics/drawable/Drawable;" since="20" />
+ <method name="getApplicationEnabledSetting(Ljava/lang/String;)I" />
+ <method name="getApplicationIcon(Landroid/content/pm/ApplicationInfo;)Landroid/graphics/drawable/Drawable;" />
+ <method name="getApplicationIcon(Ljava/lang/String;)Landroid/graphics/drawable/Drawable;" />
+ <method name="getApplicationInfo(Ljava/lang/String;I)Landroid/content/pm/ApplicationInfo;" />
+ <method name="getApplicationLabel(Landroid/content/pm/ApplicationInfo;)Ljava/lang/CharSequence;" />
+ <method name="getApplicationLogo(Landroid/content/pm/ApplicationInfo;)Landroid/graphics/drawable/Drawable;" since="9" />
+ <method name="getApplicationLogo(Ljava/lang/String;)Landroid/graphics/drawable/Drawable;" since="9" />
+ <method name="getComponentEnabledSetting(Landroid/content/ComponentName;)I" />
+ <method name="getDefaultActivityIcon()Landroid/graphics/drawable/Drawable;" />
+ <method name="getDrawable(Ljava/lang/String;ILandroid/content/pm/ApplicationInfo;)Landroid/graphics/drawable/Drawable;" />
+ <method name="getInstalledApplications(I)Ljava/util/List;" />
+ <method name="getInstalledPackages(I)Ljava/util/List;" />
+ <method name="getInstallerPackageName(Ljava/lang/String;)Ljava/lang/String;" since="5" />
+ <method name="getInstrumentationInfo(Landroid/content/ComponentName;I)Landroid/content/pm/InstrumentationInfo;" />
+ <method name="getLaunchIntentForPackage(Ljava/lang/String;)Landroid/content/Intent;" since="3" />
+ <method name="getLeanbackLaunchIntentForPackage(Ljava/lang/String;)Landroid/content/Intent;" since="21" />
+ <method name="getNameForUid(I)Ljava/lang/String;" />
+ <method name="getPackageArchiveInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;" />
+ <method name="getPackageGids(Ljava/lang/String;)[I" />
+ <method name="getPackageInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;" />
+ <method name="getPackageInstaller()Landroid/content/pm/PackageInstaller;" since="21" />
+ <method name="getPackagesForUid(I)[Ljava/lang/String;" />
+ <method name="getPackagesHoldingPermissions([Ljava/lang/String;I)Ljava/util/List;" since="18" />
+ <method name="getPermissionGroupInfo(Ljava/lang/String;I)Landroid/content/pm/PermissionGroupInfo;" />
+ <method name="getPermissionInfo(Ljava/lang/String;I)Landroid/content/pm/PermissionInfo;" />
+ <method name="getPreferredActivities(Ljava/util/List;Ljava/util/List;Ljava/lang/String;)I" />
+ <method name="getPreferredPackages(I)Ljava/util/List;" />
+ <method name="getProviderInfo(Landroid/content/ComponentName;I)Landroid/content/pm/ProviderInfo;" since="9" />
+ <method name="getReceiverInfo(Landroid/content/ComponentName;I)Landroid/content/pm/ActivityInfo;" />
+ <method name="getResourcesForActivity(Landroid/content/ComponentName;)Landroid/content/res/Resources;" />
+ <method name="getResourcesForApplication(Landroid/content/pm/ApplicationInfo;)Landroid/content/res/Resources;" />
+ <method name="getResourcesForApplication(Ljava/lang/String;)Landroid/content/res/Resources;" />
+ <method name="getServiceInfo(Landroid/content/ComponentName;I)Landroid/content/pm/ServiceInfo;" />
+ <method name="getSystemAvailableFeatures()[Landroid/content/pm/FeatureInfo;" since="5" />
+ <method name="getSystemSharedLibraryNames()[Ljava/lang/String;" since="3" />
+ <method name="getText(Ljava/lang/String;ILandroid/content/pm/ApplicationInfo;)Ljava/lang/CharSequence;" />
+ <method name="getUserBadgedDrawableForDensity(Landroid/graphics/drawable/Drawable;Landroid/os/UserHandle;Landroid/graphics/Rect;I)Landroid/graphics/drawable/Drawable;" since="21" />
+ <method name="getUserBadgedIcon(Landroid/graphics/drawable/Drawable;Landroid/os/UserHandle;)Landroid/graphics/drawable/Drawable;" since="21" />
+ <method name="getUserBadgedLabel(Ljava/lang/CharSequence;Landroid/os/UserHandle;)Ljava/lang/CharSequence;" since="21" />
+ <method name="getXml(Ljava/lang/String;ILandroid/content/pm/ApplicationInfo;)Landroid/content/res/XmlResourceParser;" />
+ <method name="hasSystemFeature(Ljava/lang/String;)Z" since="5" />
+ <method name="installPackage(Landroid/net/Uri;)V" />
+ <method name="installPackage(Landroid/net/Uri;Landroid/content/pm/IPackageInstallObserver;I)V" />
+ <method name="isSafeMode()Z" since="3" />
+ <method name="queryBroadcastReceivers(Landroid/content/Intent;I)Ljava/util/List;" />
+ <method name="queryContentProviders(Ljava/lang/String;II)Ljava/util/List;" />
+ <method name="queryInstrumentation(Ljava/lang/String;I)Ljava/util/List;" />
+ <method name="queryIntentActivities(Landroid/content/Intent;I)Ljava/util/List;" />
+ <method name="queryIntentActivityOptions(Landroid/content/ComponentName;[Landroid/content/Intent;Landroid/content/Intent;I)Ljava/util/List;" />
+ <method name="queryIntentContentProviders(Landroid/content/Intent;I)Ljava/util/List;" since="19" />
+ <method name="queryIntentServices(Landroid/content/Intent;I)Ljava/util/List;" />
+ <method name="queryPermissionsByGroup(Ljava/lang/String;I)Ljava/util/List;" />
+ <method name="removePackageFromPreferred(Ljava/lang/String;)V" />
+ <method name="removePermission(Ljava/lang/String;)V" />
+ <method name="resolveActivity(Landroid/content/Intent;I)Landroid/content/pm/ResolveInfo;" />
+ <method name="resolveContentProvider(Ljava/lang/String;I)Landroid/content/pm/ProviderInfo;" />
+ <method name="resolveService(Landroid/content/Intent;I)Landroid/content/pm/ResolveInfo;" />
+ <method name="setApplicationEnabledSetting(Ljava/lang/String;II)V" />
+ <method name="setComponentEnabledSetting(Landroid/content/ComponentName;II)V" />
+ <method name="setInstallerPackageName(Ljava/lang/String;Ljava/lang/String;)V" since="11" />
+ <method name="verifyPendingInstall(II)V" since="14" />
+ <field name="COMPONENT_ENABLED_STATE_DEFAULT" />
+ <field name="COMPONENT_ENABLED_STATE_DISABLED" />
+ <field name="COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED" since="18" />
+ <field name="COMPONENT_ENABLED_STATE_DISABLED_USER" since="14" />
+ <field name="COMPONENT_ENABLED_STATE_ENABLED" />
+ <field name="DONT_KILL_APP" />
+ <field name="EXTRA_VERIFICATION_ID" since="14" />
+ <field name="EXTRA_VERIFICATION_RESULT" since="17" />
+ <field name="FEATURE_APP_WIDGETS" since="18" />
+ <field name="FEATURE_AUDIO_LOW_LATENCY" since="9" />
+ <field name="FEATURE_AUDIO_OUTPUT" since="21" />
+ <field name="FEATURE_BACKUP" since="20" />
+ <field name="FEATURE_BLUETOOTH" since="8" />
+ <field name="FEATURE_BLUETOOTH_LE" since="18" />
+ <field name="FEATURE_CAMERA" since="7" />
+ <field name="FEATURE_CAMERA_ANY" since="17" />
+ <field name="FEATURE_CAMERA_AUTOFOCUS" since="7" />
+ <field name="FEATURE_CAMERA_CAPABILITY_MANUAL_POST_PROCESSING" since="21" />
+ <field name="FEATURE_CAMERA_CAPABILITY_MANUAL_SENSOR" since="21" />
+ <field name="FEATURE_CAMERA_CAPABILITY_RAW" since="21" />
+ <field name="FEATURE_CAMERA_EXTERNAL" since="20" />
+ <field name="FEATURE_CAMERA_FLASH" since="7" />
+ <field name="FEATURE_CAMERA_FRONT" since="9" />
+ <field name="FEATURE_CAMERA_LEVEL_FULL" since="21" />
+ <field name="FEATURE_CONNECTION_SERVICE" since="21" />
+ <field name="FEATURE_CONSUMER_IR" since="19" />
+ <field name="FEATURE_DEVICE_ADMIN" since="19" />
+ <field name="FEATURE_FAKETOUCH" since="11" />
+ <field name="FEATURE_FAKETOUCH_MULTITOUCH_DISTINCT" since="13" />
+ <field name="FEATURE_FAKETOUCH_MULTITOUCH_JAZZHAND" since="13" />
+ <field name="FEATURE_GAMEPAD" since="21" />
+ <field name="FEATURE_HOME_SCREEN" since="18" />
+ <field name="FEATURE_INPUT_METHODS" since="18" />
+ <field name="FEATURE_LEANBACK" since="21" />
+ <field name="FEATURE_LIVE_TV" since="21" />
+ <field name="FEATURE_LIVE_WALLPAPER" since="7" />
+ <field name="FEATURE_LOCATION" since="8" />
+ <field name="FEATURE_LOCATION_GPS" since="8" />
+ <field name="FEATURE_LOCATION_NETWORK" since="8" />
+ <field name="FEATURE_MANAGED_USERS" since="21" />
+ <field name="FEATURE_MICROPHONE" since="8" />
+ <field name="FEATURE_NFC" since="9" />
+ <field name="FEATURE_NFC_HOST_CARD_EMULATION" since="19" />
+ <field name="FEATURE_OPENGLES_EXTENSION_PACK" since="21" />
+ <field name="FEATURE_PRINTING" since="20" />
+ <field name="FEATURE_SCREEN_LANDSCAPE" since="13" />
+ <field name="FEATURE_SCREEN_PORTRAIT" since="13" />
+ <field name="FEATURE_SECURELY_REMOVES_USERS" since="21" />
+ <field name="FEATURE_SENSOR_ACCELEROMETER" since="8" />
+ <field name="FEATURE_SENSOR_AMBIENT_TEMPERATURE" since="21" />
+ <field name="FEATURE_SENSOR_BAROMETER" since="9" />
+ <field name="FEATURE_SENSOR_COMPASS" since="8" />
+ <field name="FEATURE_SENSOR_GYROSCOPE" since="9" />
+ <field name="FEATURE_SENSOR_HEART_RATE" since="20" />
+ <field name="FEATURE_SENSOR_HEART_RATE_ECG" since="21" />
+ <field name="FEATURE_SENSOR_LIGHT" since="7" />
+ <field name="FEATURE_SENSOR_PROXIMITY" since="7" />
+ <field name="FEATURE_SENSOR_RELATIVE_HUMIDITY" since="21" />
+ <field name="FEATURE_SENSOR_STEP_COUNTER" since="19" />
+ <field name="FEATURE_SENSOR_STEP_DETECTOR" since="19" />
+ <field name="FEATURE_SIP" since="9" />
+ <field name="FEATURE_SIP_VOIP" since="9" />
+ <field name="FEATURE_TELEPHONY" since="7" />
+ <field name="FEATURE_TELEPHONY_CDMA" since="7" />
+ <field name="FEATURE_TELEPHONY_GSM" since="7" />
+ <field name="FEATURE_TELEVISION" since="16" />
+ <field name="FEATURE_TOUCHSCREEN" since="8" />
+ <field name="FEATURE_TOUCHSCREEN_MULTITOUCH" since="7" />
+ <field name="FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT" since="8" />
+ <field name="FEATURE_TOUCHSCREEN_MULTITOUCH_JAZZHAND" since="9" />
+ <field name="FEATURE_USB_ACCESSORY" since="12" />
+ <field name="FEATURE_USB_HOST" since="12" />
+ <field name="FEATURE_VERIFIED_BOOT" since="21" />
+ <field name="FEATURE_WATCH" since="20" />
+ <field name="FEATURE_WEBVIEW" since="20" />
+ <field name="FEATURE_WIFI" since="8" />
+ <field name="FEATURE_WIFI_DIRECT" since="14" />
+ <field name="FORWARD_LOCK_PACKAGE" />
+ <field name="GET_ACTIVITIES" />
+ <field name="GET_CONFIGURATIONS" since="3" />
+ <field name="GET_DISABLED_COMPONENTS" />
+ <field name="GET_DISABLED_UNTIL_USED_COMPONENTS" since="18" />
+ <field name="GET_GIDS" />
+ <field name="GET_INSTRUMENTATION" />
+ <field name="GET_INTENT_FILTERS" />
+ <field name="GET_META_DATA" />
+ <field name="GET_PERMISSIONS" />
+ <field name="GET_PROVIDERS" />
+ <field name="GET_RECEIVERS" />
+ <field name="GET_RESOLVED_FILTER" />
+ <field name="GET_SERVICES" />
+ <field name="GET_SHARED_LIBRARY_FILES" />
+ <field name="GET_SIGNATURES" />
+ <field name="GET_UNINSTALLED_PACKAGES" since="3" />
+ <field name="GET_URI_PERMISSION_PATTERNS" />
+ <field name="INSTALL_FAILED_ALREADY_EXISTS" />
+ <field name="INSTALL_FAILED_CONFLICTING_PROVIDER" since="3" />
+ <field name="INSTALL_FAILED_DEXOPT" />
+ <field name="INSTALL_FAILED_DUPLICATE_PACKAGE" />
+ <field name="INSTALL_FAILED_INSUFFICIENT_STORAGE" />
+ <field name="INSTALL_FAILED_INVALID_APK" />
+ <field name="INSTALL_FAILED_INVALID_URI" />
+ <field name="INSTALL_FAILED_MISSING_SHARED_LIBRARY" />
+ <field name="INSTALL_FAILED_NO_SHARED_USER" />
+ <field name="INSTALL_FAILED_OLDER_SDK" />
+ <field name="INSTALL_FAILED_REPLACE_COULDNT_DELETE" />
+ <field name="INSTALL_FAILED_SHARED_USER_INCOMPATIBLE" />
+ <field name="INSTALL_FAILED_UPDATE_INCOMPATIBLE" />
+ <field name="INSTALL_PARSE_FAILED_BAD_MANIFEST" />
+ <field name="INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME" />
+ <field name="INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID" />
+ <field name="INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING" />
+ <field name="INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES" />
+ <field name="INSTALL_PARSE_FAILED_MANIFEST_EMPTY" />
+ <field name="INSTALL_PARSE_FAILED_MANIFEST_MALFORMED" />
+ <field name="INSTALL_PARSE_FAILED_NOT_APK" />
+ <field name="INSTALL_PARSE_FAILED_NO_CERTIFICATES" />
+ <field name="INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION" />
+ <field name="INSTALL_SUCCEEDED" />
+ <field name="MATCH_DEFAULT_ONLY" />
+ <field name="MAXIMUM_VERIFICATION_TIMEOUT" since="17" />
+ <field name="PERMISSION_DENIED" />
+ <field name="PERMISSION_GRANTED" />
+ <field name="PKG_INSTALL_COMPLETE" />
+ <field name="PKG_INSTALL_INCOMPLETE" />
+ <field name="REPLACE_EXISTING_PACKAGE" />
+ <field name="SIGNATURE_FIRST_NOT_SIGNED" />
+ <field name="SIGNATURE_MATCH" />
+ <field name="SIGNATURE_NEITHER_SIGNED" />
+ <field name="SIGNATURE_NO_MATCH" />
+ <field name="SIGNATURE_SECOND_NOT_SIGNED" />
+ <field name="SIGNATURE_UNKNOWN_PACKAGE" />
+ <field name="VERIFICATION_ALLOW" since="14" />
+ <field name="VERIFICATION_REJECT" since="14" />
+ </class>
+ <class name="android/content/pm/PackageManager$NameNotFoundException" since="1">
+ <extends name="android/util/AndroidException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/content/pm/PackageStats" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/content/pm/PackageStats;)V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <field name="CREATOR" />
+ <field name="cacheSize" />
+ <field name="codeSize" />
+ <field name="dataSize" />
+ <field name="externalCacheSize" since="11" />
+ <field name="externalCodeSize" since="14" />
+ <field name="externalDataSize" since="11" />
+ <field name="externalMediaSize" since="11" />
+ <field name="externalObbSize" since="11" />
+ <field name="packageName" />
+ </class>
+ <class name="android/content/pm/PathPermission" since="4">
+ <extends name="android/os/PatternMatcher" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="&lt;init>(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V" />
+ <method name="getReadPermission()Ljava/lang/String;" />
+ <method name="getWritePermission()Ljava/lang/String;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/content/pm/PermissionGroupInfo" since="1">
+ <extends name="android/content/pm/PackageItemInfo" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/pm/PermissionGroupInfo;)V" />
+ <method name="loadDescription(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;" />
+ <field name="CREATOR" />
+ <field name="FLAG_PERSONAL_INFO" since="17" />
+ <field name="descriptionRes" />
+ <field name="flags" since="17" />
+ <field name="nonLocalizedDescription" />
+ <field name="priority" since="17" />
+ </class>
+ <class name="android/content/pm/PermissionInfo" since="1">
+ <extends name="android/content/pm/PackageItemInfo" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/pm/PermissionInfo;)V" />
+ <method name="loadDescription(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;" />
+ <field name="CREATOR" />
+ <field name="FLAG_COSTS_MONEY" since="17" />
+ <field name="PROTECTION_DANGEROUS" />
+ <field name="PROTECTION_FLAG_APPOP" since="21" />
+ <field name="PROTECTION_FLAG_DEVELOPMENT" since="16" />
+ <field name="PROTECTION_FLAG_SYSTEM" since="16" />
+ <field name="PROTECTION_MASK_BASE" since="16" />
+ <field name="PROTECTION_MASK_FLAGS" since="16" />
+ <field name="PROTECTION_NORMAL" />
+ <field name="PROTECTION_SIGNATURE" />
+ <field name="PROTECTION_SIGNATURE_OR_SYSTEM" />
+ <field name="descriptionRes" />
+ <field name="flags" since="17" />
+ <field name="group" />
+ <field name="nonLocalizedDescription" />
+ <field name="protectionLevel" />
+ </class>
+ <class name="android/content/pm/ProviderInfo" since="1">
+ <extends name="android/content/pm/ComponentInfo" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/pm/ProviderInfo;)V" />
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V" since="19" />
+ <field name="CREATOR" />
+ <field name="FLAG_SINGLE_USER" since="17" />
+ <field name="authority" />
+ <field name="flags" since="17" />
+ <field name="grantUriPermissions" />
+ <field name="initOrder" />
+ <field name="isSyncable" />
+ <field name="multiprocess" />
+ <field name="pathPermissions" since="4" />
+ <field name="readPermission" />
+ <field name="uriPermissionPatterns" />
+ <field name="writePermission" />
+ </class>
+ <class name="android/content/pm/ResolveInfo" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/pm/ResolveInfo;)V" since="17" />
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V" />
+ <method name="getIconResource()I" />
+ <method name="loadIcon(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;" />
+ <method name="loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;" />
+ <field name="CREATOR" />
+ <field name="activityInfo" />
+ <field name="filter" />
+ <field name="icon" />
+ <field name="isDefault" />
+ <field name="labelRes" />
+ <field name="match" />
+ <field name="nonLocalizedLabel" />
+ <field name="preferredOrder" />
+ <field name="priority" />
+ <field name="providerInfo" since="19" />
+ <field name="resolvePackageName" since="5" />
+ <field name="serviceInfo" />
+ <field name="specificIndex" />
+ </class>
+ <class name="android/content/pm/ResolveInfo$DisplayNameComparator" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/Comparator" />
+ <method name="&lt;init>(Landroid/content/pm/PackageManager;)V" />
+ <method name="compare(Landroid/content/pm/ResolveInfo;Landroid/content/pm/ResolveInfo;)I" />
+ </class>
+ <class name="android/content/pm/ServiceInfo" since="1">
+ <extends name="android/content/pm/ComponentInfo" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/pm/ServiceInfo;)V" />
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V" since="5" />
+ <field name="CREATOR" />
+ <field name="FLAG_ISOLATED_PROCESS" since="16" />
+ <field name="FLAG_SINGLE_USER" since="17" />
+ <field name="FLAG_STOP_WITH_TASK" since="14" />
+ <field name="flags" since="14" />
+ <field name="permission" />
+ </class>
+ <class name="android/content/pm/Signature" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>([B)V" />
+ <method name="toByteArray()[B" />
+ <method name="toChars()[C" />
+ <method name="toChars([C[I)[C" />
+ <method name="toCharsString()Ljava/lang/String;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/content/res/AssetFileDescriptor" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" since="3" />
+ <implements name="java/io/Closeable" since="19" />
+ <method name="&lt;init>(Landroid/os/ParcelFileDescriptor;JJ)V" />
+ <method name="&lt;init>(Landroid/os/ParcelFileDescriptor;JJLandroid/os/Bundle;)V" since="19" />
+ <method name="close()V" />
+ <method name="createInputStream()Ljava/io/FileInputStream;" since="3" />
+ <method name="createOutputStream()Ljava/io/FileOutputStream;" since="3" />
+ <method name="getDeclaredLength()J" since="3" />
+ <method name="getExtras()Landroid/os/Bundle;" since="19" />
+ <method name="getFileDescriptor()Ljava/io/FileDescriptor;" />
+ <method name="getLength()J" />
+ <method name="getParcelFileDescriptor()Landroid/os/ParcelFileDescriptor;" />
+ <method name="getStartOffset()J" />
+ <field name="CREATOR" since="3" />
+ <field name="UNKNOWN_LENGTH" since="3" />
+ </class>
+ <class name="android/content/res/AssetFileDescriptor$AutoCloseInputStream" since="3">
+ <extends name="android/os/ParcelFileDescriptor$AutoCloseInputStream" />
+ <method name="&lt;init>(Landroid/content/res/AssetFileDescriptor;)V" />
+ </class>
+ <class name="android/content/res/AssetFileDescriptor$AutoCloseOutputStream" since="3">
+ <extends name="android/os/ParcelFileDescriptor$AutoCloseOutputStream" />
+ <method name="&lt;init>(Landroid/content/res/AssetFileDescriptor;)V" />
+ </class>
+ <class name="android/content/res/AssetManager" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/AutoCloseable" since="21" />
+ <method name="&lt;init>()V" />
+ <method name="close()V" />
+ <method name="getLocales()[Ljava/lang/String;" />
+ <method name="list(Ljava/lang/String;)[Ljava/lang/String;" />
+ <method name="open(Ljava/lang/String;)Ljava/io/InputStream;" />
+ <method name="open(Ljava/lang/String;I)Ljava/io/InputStream;" />
+ <method name="openFd(Ljava/lang/String;)Landroid/content/res/AssetFileDescriptor;" />
+ <method name="openNonAssetFd(ILjava/lang/String;)Landroid/content/res/AssetFileDescriptor;" />
+ <method name="openNonAssetFd(Ljava/lang/String;)Landroid/content/res/AssetFileDescriptor;" />
+ <method name="openXmlResourceParser(ILjava/lang/String;)Landroid/content/res/XmlResourceParser;" />
+ <method name="openXmlResourceParser(Ljava/lang/String;)Landroid/content/res/XmlResourceParser;" />
+ <field name="ACCESS_BUFFER" />
+ <field name="ACCESS_RANDOM" />
+ <field name="ACCESS_STREAMING" />
+ <field name="ACCESS_UNKNOWN" />
+ </class>
+ <class name="android/content/res/AssetManager$AssetInputStream" since="1">
+ <extends name="java/io/InputStream" />
+ <method name="&lt;init>(Landroid/content/res/AssetManager;)V" />
+ <method name="getAssetInt()I" />
+ </class>
+ <class name="android/content/res/ColorStateList" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>([[I[I)V" />
+ <method name="createFromXml(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;)Landroid/content/res/ColorStateList;" />
+ <method name="getColorForState([II)I" />
+ <method name="getDefaultColor()I" />
+ <method name="isOpaque()Z" since="21" />
+ <method name="isStateful()Z" />
+ <method name="valueOf(I)Landroid/content/res/ColorStateList;" />
+ <method name="withAlpha(I)Landroid/content/res/ColorStateList;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/content/res/Configuration" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/res/Configuration;)V" />
+ <method name="compareTo(Landroid/content/res/Configuration;)I" />
+ <method name="diff(Landroid/content/res/Configuration;)I" />
+ <method name="equals(Landroid/content/res/Configuration;)Z" />
+ <method name="getLayoutDirection()I" since="17" />
+ <method name="isLayoutSizeAtLeast(I)Z" since="11" />
+ <method name="needNewResources(II)Z" />
+ <method name="readFromParcel(Landroid/os/Parcel;)V" since="8" />
+ <method name="setLayoutDirection(Ljava/util/Locale;)V" since="17" />
+ <method name="setLocale(Ljava/util/Locale;)V" since="17" />
+ <method name="setTo(Landroid/content/res/Configuration;)V" since="8" />
+ <method name="setToDefaults()V" />
+ <method name="updateFrom(Landroid/content/res/Configuration;)I" />
+ <field name="CREATOR" />
+ <field name="DENSITY_DPI_UNDEFINED" since="17" />
+ <field name="HARDKEYBOARDHIDDEN_NO" since="3" />
+ <field name="HARDKEYBOARDHIDDEN_UNDEFINED" since="3" />
+ <field name="HARDKEYBOARDHIDDEN_YES" since="3" />
+ <field name="KEYBOARDHIDDEN_NO" />
+ <field name="KEYBOARDHIDDEN_UNDEFINED" />
+ <field name="KEYBOARDHIDDEN_YES" />
+ <field name="KEYBOARD_12KEY" />
+ <field name="KEYBOARD_NOKEYS" />
+ <field name="KEYBOARD_QWERTY" />
+ <field name="KEYBOARD_UNDEFINED" />
+ <field name="MNC_ZERO" since="19" />
+ <field name="NAVIGATIONHIDDEN_NO" since="5" />
+ <field name="NAVIGATIONHIDDEN_UNDEFINED" since="5" />
+ <field name="NAVIGATIONHIDDEN_YES" since="5" />
+ <field name="NAVIGATION_DPAD" />
+ <field name="NAVIGATION_NONAV" />
+ <field name="NAVIGATION_TRACKBALL" />
+ <field name="NAVIGATION_UNDEFINED" />
+ <field name="NAVIGATION_WHEEL" />
+ <field name="ORIENTATION_LANDSCAPE" />
+ <field name="ORIENTATION_PORTRAIT" />
+ <field name="ORIENTATION_SQUARE" />
+ <field name="ORIENTATION_UNDEFINED" />
+ <field name="SCREENLAYOUT_LAYOUTDIR_LTR" since="17" />
+ <field name="SCREENLAYOUT_LAYOUTDIR_MASK" since="17" />
+ <field name="SCREENLAYOUT_LAYOUTDIR_RTL" since="17" />
+ <field name="SCREENLAYOUT_LAYOUTDIR_SHIFT" since="17" />
+ <field name="SCREENLAYOUT_LAYOUTDIR_UNDEFINED" since="17" />
+ <field name="SCREENLAYOUT_LONG_MASK" since="4" />
+ <field name="SCREENLAYOUT_LONG_NO" since="4" />
+ <field name="SCREENLAYOUT_LONG_UNDEFINED" since="4" />
+ <field name="SCREENLAYOUT_LONG_YES" since="4" />
+ <field name="SCREENLAYOUT_SIZE_LARGE" since="4" />
+ <field name="SCREENLAYOUT_SIZE_MASK" since="4" />
+ <field name="SCREENLAYOUT_SIZE_NORMAL" since="4" />
+ <field name="SCREENLAYOUT_SIZE_SMALL" since="4" />
+ <field name="SCREENLAYOUT_SIZE_UNDEFINED" since="4" />
+ <field name="SCREENLAYOUT_SIZE_XLARGE" since="9" />
+ <field name="SCREENLAYOUT_UNDEFINED" since="17" />
+ <field name="SCREEN_HEIGHT_DP_UNDEFINED" since="13" />
+ <field name="SCREEN_WIDTH_DP_UNDEFINED" since="13" />
+ <field name="SMALLEST_SCREEN_WIDTH_DP_UNDEFINED" since="13" />
+ <field name="TOUCHSCREEN_FINGER" />
+ <field name="TOUCHSCREEN_NOTOUCH" />
+ <field name="TOUCHSCREEN_STYLUS" />
+ <field name="TOUCHSCREEN_UNDEFINED" />
+ <field name="UI_MODE_NIGHT_MASK" since="8" />
+ <field name="UI_MODE_NIGHT_NO" since="8" />
+ <field name="UI_MODE_NIGHT_UNDEFINED" since="8" />
+ <field name="UI_MODE_NIGHT_YES" since="8" />
+ <field name="UI_MODE_TYPE_APPLIANCE" since="16" />
+ <field name="UI_MODE_TYPE_CAR" since="8" />
+ <field name="UI_MODE_TYPE_DESK" since="8" />
+ <field name="UI_MODE_TYPE_MASK" since="8" />
+ <field name="UI_MODE_TYPE_NORMAL" since="8" />
+ <field name="UI_MODE_TYPE_TELEVISION" since="13" />
+ <field name="UI_MODE_TYPE_UNDEFINED" since="8" />
+ <field name="UI_MODE_TYPE_WATCH" since="20" />
+ <field name="densityDpi" since="17" />
+ <field name="fontScale" />
+ <field name="hardKeyboardHidden" since="3" />
+ <field name="keyboard" />
+ <field name="keyboardHidden" />
+ <field name="locale" />
+ <field name="mcc" />
+ <field name="mnc" />
+ <field name="navigation" />
+ <field name="navigationHidden" since="5" />
+ <field name="orientation" />
+ <field name="screenHeightDp" since="13" />
+ <field name="screenLayout" since="4" />
+ <field name="screenWidthDp" since="13" />
+ <field name="smallestScreenWidthDp" since="13" />
+ <field name="touchscreen" />
+ <field name="uiMode" since="8" />
+ </class>
+ <class name="android/content/res/ObbInfo" since="9">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <field name="CREATOR" />
+ <field name="OBB_OVERLAY" />
+ <field name="filename" />
+ <field name="flags" />
+ <field name="packageName" />
+ <field name="version" />
+ </class>
+ <class name="android/content/res/ObbScanner" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getObbInfo(Ljava/lang/String;)Landroid/content/res/ObbInfo;" />
+ </class>
+ <class name="android/content/res/Resources" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/res/AssetManager;Landroid/util/DisplayMetrics;Landroid/content/res/Configuration;)V" />
+ <method name="finishPreloading()V" />
+ <method name="flushLayoutCache()V" />
+ <method name="getAnimation(I)Landroid/content/res/XmlResourceParser;" />
+ <method name="getAssets()Landroid/content/res/AssetManager;" />
+ <method name="getBoolean(I)Z" since="3" />
+ <method name="getColor(I)I" />
+ <method name="getColorStateList(I)Landroid/content/res/ColorStateList;" />
+ <method name="getConfiguration()Landroid/content/res/Configuration;" />
+ <method name="getDimension(I)F" />
+ <method name="getDimensionPixelOffset(I)I" />
+ <method name="getDimensionPixelSize(I)I" />
+ <method name="getDisplayMetrics()Landroid/util/DisplayMetrics;" />
+ <method name="getDrawable(I)Landroid/graphics/drawable/Drawable;" />
+ <method name="getDrawable(ILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;" since="21" />
+ <method name="getDrawableForDensity(II)Landroid/graphics/drawable/Drawable;" since="15" />
+ <method name="getDrawableForDensity(IILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;" since="21" />
+ <method name="getFraction(III)F" since="3" />
+ <method name="getIdentifier(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I" />
+ <method name="getIntArray(I)[I" />
+ <method name="getInteger(I)I" />
+ <method name="getLayout(I)Landroid/content/res/XmlResourceParser;" />
+ <method name="getMovie(I)Landroid/graphics/Movie;" />
+ <method name="getQuantityString(II)Ljava/lang/String;" />
+ <method name="getQuantityString(II[Ljava/lang/Object;)Ljava/lang/String;" />
+ <method name="getQuantityText(II)Ljava/lang/CharSequence;" />
+ <method name="getResourceEntryName(I)Ljava/lang/String;" />
+ <method name="getResourceName(I)Ljava/lang/String;" />
+ <method name="getResourcePackageName(I)Ljava/lang/String;" />
+ <method name="getResourceTypeName(I)Ljava/lang/String;" />
+ <method name="getString(I)Ljava/lang/String;" />
+ <method name="getString(I[Ljava/lang/Object;)Ljava/lang/String;" />
+ <method name="getStringArray(I)[Ljava/lang/String;" />
+ <method name="getSystem()Landroid/content/res/Resources;" />
+ <method name="getText(I)Ljava/lang/CharSequence;" />
+ <method name="getText(ILjava/lang/CharSequence;)Ljava/lang/CharSequence;" />
+ <method name="getTextArray(I)[Ljava/lang/CharSequence;" />
+ <method name="getValue(ILandroid/util/TypedValue;Z)V" />
+ <method name="getValue(Ljava/lang/String;Landroid/util/TypedValue;Z)V" />
+ <method name="getValueForDensity(IILandroid/util/TypedValue;Z)V" since="15" />
+ <method name="getXml(I)Landroid/content/res/XmlResourceParser;" />
+ <method name="newTheme()Landroid/content/res/Resources$Theme;" />
+ <method name="obtainAttributes(Landroid/util/AttributeSet;[I)Landroid/content/res/TypedArray;" />
+ <method name="obtainTypedArray(I)Landroid/content/res/TypedArray;" />
+ <method name="openRawResource(I)Ljava/io/InputStream;" />
+ <method name="openRawResource(ILandroid/util/TypedValue;)Ljava/io/InputStream;" since="3" />
+ <method name="openRawResourceFd(I)Landroid/content/res/AssetFileDescriptor;" />
+ <method name="parseBundleExtra(Ljava/lang/String;Landroid/util/AttributeSet;Landroid/os/Bundle;)V" since="3" />
+ <method name="parseBundleExtras(Landroid/content/res/XmlResourceParser;Landroid/os/Bundle;)V" since="3" />
+ <method name="updateConfiguration(Landroid/content/res/Configuration;Landroid/util/DisplayMetrics;)V" />
+ </class>
+ <class name="android/content/res/Resources$NotFoundException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/content/res/Resources$Theme" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/res/Resources;)V" />
+ <method name="applyStyle(IZ)V" />
+ <method name="dump(ILjava/lang/String;Ljava/lang/String;)V" />
+ <method name="getDrawable(I)Landroid/graphics/drawable/Drawable;" since="21" />
+ <method name="getResources()Landroid/content/res/Resources;" since="21" />
+ <method name="obtainStyledAttributes(I[I)Landroid/content/res/TypedArray;" />
+ <method name="obtainStyledAttributes(Landroid/util/AttributeSet;[III)Landroid/content/res/TypedArray;" />
+ <method name="obtainStyledAttributes([I)Landroid/content/res/TypedArray;" />
+ <method name="resolveAttribute(ILandroid/util/TypedValue;Z)Z" />
+ <method name="setTo(Landroid/content/res/Resources$Theme;)V" />
+ </class>
+ <class name="android/content/res/TypedArray" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getBoolean(IZ)Z" />
+ <method name="getChangingConfigurations()I" since="21" />
+ <method name="getColor(II)I" />
+ <method name="getColorStateList(I)Landroid/content/res/ColorStateList;" />
+ <method name="getDimension(IF)F" />
+ <method name="getDimensionPixelOffset(II)I" />
+ <method name="getDimensionPixelSize(II)I" />
+ <method name="getDrawable(I)Landroid/graphics/drawable/Drawable;" />
+ <method name="getFloat(IF)F" />
+ <method name="getFraction(IIIF)F" />
+ <method name="getIndex(I)I" />
+ <method name="getIndexCount()I" />
+ <method name="getInt(II)I" />
+ <method name="getInteger(II)I" />
+ <method name="getLayoutDimension(II)I" since="3" />
+ <method name="getLayoutDimension(ILjava/lang/String;)I" />
+ <method name="getNonResourceString(I)Ljava/lang/String;" />
+ <method name="getPositionDescription()Ljava/lang/String;" />
+ <method name="getResourceId(II)I" />
+ <method name="getResources()Landroid/content/res/Resources;" />
+ <method name="getString(I)Ljava/lang/String;" />
+ <method name="getText(I)Ljava/lang/CharSequence;" />
+ <method name="getTextArray(I)[Ljava/lang/CharSequence;" />
+ <method name="getType(I)I" since="21" />
+ <method name="getValue(ILandroid/util/TypedValue;)Z" />
+ <method name="hasValue(I)Z" />
+ <method name="length()I" />
+ <method name="peekValue(I)Landroid/util/TypedValue;" />
+ <method name="recycle()V" />
+ </class>
+ <class name="android/content/res/XmlResourceParser" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/util/AttributeSet" />
+ <implements name="java/lang/AutoCloseable" since="19" />
+ <implements name="org/xmlpull/v1/XmlPullParser" />
+ <method name="close()V" />
+ </class>
+ <class name="android/database/AbstractCursor" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/database/CrossProcessCursor" />
+ <method name="&lt;init>()V" />
+ <method name="checkPosition()V" />
+ <method name="getNotificationUri()Landroid/net/Uri;" since="11" />
+ <method name="getUpdatedField(I)Ljava/lang/Object;" />
+ <method name="isFieldUpdated(I)Z" />
+ <method name="onChange(Z)V" />
+ <field name="mClosed" />
+ <field name="mContentResolver" />
+ <field name="mCurrentRowID" />
+ <field name="mPos" />
+ <field name="mRowIdColumnIndex" />
+ <field name="mUpdatedRows" />
+ </class>
+ <class name="android/database/AbstractCursor$SelfContentObserver" since="1">
+ <extends name="android/database/ContentObserver" />
+ <method name="&lt;init>(Landroid/database/AbstractCursor;)V" />
+ </class>
+ <class name="android/database/AbstractWindowedCursor" since="1">
+ <extends name="android/database/AbstractCursor" />
+ <method name="&lt;init>()V" />
+ <method name="hasWindow()Z" />
+ <method name="isBlob(I)Z" />
+ <method name="isFloat(I)Z" since="5" />
+ <method name="isLong(I)Z" since="5" />
+ <method name="isString(I)Z" since="5" />
+ <method name="setWindow(Landroid/database/CursorWindow;)V" />
+ <field name="mWindow" />
+ </class>
+ <class name="android/database/CharArrayBuffer" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>([C)V" />
+ <field name="data" />
+ <field name="sizeCopied" />
+ </class>
+ <class name="android/database/ContentObservable" since="1">
+ <extends name="android/database/Observable" />
+ <method name="&lt;init>()V" />
+ <method name="dispatchChange(Z)V" />
+ <method name="dispatchChange(ZLandroid/net/Uri;)V" since="16" />
+ <method name="notifyChange(Z)V" />
+ <method name="registerObserver(Landroid/database/ContentObserver;)V" />
+ </class>
+ <class name="android/database/ContentObserver" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/os/Handler;)V" />
+ <method name="deliverSelfNotifications()Z" />
+ <method name="dispatchChange(Z)V" />
+ <method name="dispatchChange(ZLandroid/net/Uri;)V" since="16" />
+ <method name="onChange(Z)V" />
+ <method name="onChange(ZLandroid/net/Uri;)V" since="16" />
+ </class>
+ <class name="android/database/CrossProcessCursor" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/database/Cursor" />
+ <method name="fillWindow(ILandroid/database/CursorWindow;)V" />
+ <method name="getWindow()Landroid/database/CursorWindow;" />
+ <method name="onMove(II)Z" />
+ </class>
+ <class name="android/database/CrossProcessCursorWrapper" since="15">
+ <extends name="android/database/CursorWrapper" />
+ <implements name="android/database/CrossProcessCursor" />
+ <method name="&lt;init>(Landroid/database/Cursor;)V" />
+ </class>
+ <class name="android/database/Cursor" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Closeable" since="16" />
+ <method name="close()V" />
+ <method name="copyStringToBuffer(ILandroid/database/CharArrayBuffer;)V" />
+ <method name="deactivate()V" />
+ <method name="getBlob(I)[B" />
+ <method name="getColumnCount()I" />
+ <method name="getColumnIndex(Ljava/lang/String;)I" />
+ <method name="getColumnIndexOrThrow(Ljava/lang/String;)I" />
+ <method name="getColumnName(I)Ljava/lang/String;" />
+ <method name="getColumnNames()[Ljava/lang/String;" />
+ <method name="getCount()I" />
+ <method name="getDouble(I)D" />
+ <method name="getExtras()Landroid/os/Bundle;" />
+ <method name="getFloat(I)F" />
+ <method name="getInt(I)I" />
+ <method name="getLong(I)J" />
+ <method name="getNotificationUri()Landroid/net/Uri;" since="19" />
+ <method name="getPosition()I" />
+ <method name="getShort(I)S" />
+ <method name="getString(I)Ljava/lang/String;" />
+ <method name="getType(I)I" since="11" />
+ <method name="getWantsAllOnMoveCalls()Z" />
+ <method name="isAfterLast()Z" />
+ <method name="isBeforeFirst()Z" />
+ <method name="isClosed()Z" />
+ <method name="isFirst()Z" />
+ <method name="isLast()Z" />
+ <method name="isNull(I)Z" />
+ <method name="move(I)Z" />
+ <method name="moveToFirst()Z" />
+ <method name="moveToLast()Z" />
+ <method name="moveToNext()Z" />
+ <method name="moveToPosition(I)Z" />
+ <method name="moveToPrevious()Z" />
+ <method name="registerContentObserver(Landroid/database/ContentObserver;)V" />
+ <method name="registerDataSetObserver(Landroid/database/DataSetObserver;)V" />
+ <method name="requery()Z" />
+ <method name="respond(Landroid/os/Bundle;)Landroid/os/Bundle;" />
+ <method name="setNotificationUri(Landroid/content/ContentResolver;Landroid/net/Uri;)V" />
+ <method name="unregisterContentObserver(Landroid/database/ContentObserver;)V" />
+ <method name="unregisterDataSetObserver(Landroid/database/DataSetObserver;)V" />
+ <field name="FIELD_TYPE_BLOB" since="11" />
+ <field name="FIELD_TYPE_FLOAT" since="11" />
+ <field name="FIELD_TYPE_INTEGER" since="11" />
+ <field name="FIELD_TYPE_NULL" since="11" />
+ <field name="FIELD_TYPE_STRING" since="11" />
+ </class>
+ <class name="android/database/CursorIndexOutOfBoundsException" since="1">
+ <extends name="java/lang/IndexOutOfBoundsException" />
+ <method name="&lt;init>(II)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/database/CursorJoiner" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Iterable" />
+ <implements name="java/util/Iterator" />
+ <method name="&lt;init>(Landroid/database/Cursor;[Ljava/lang/String;Landroid/database/Cursor;[Ljava/lang/String;)V" />
+ <method name="next()Landroid/database/CursorJoiner$Result;" />
+ </class>
+ <class name="android/database/CursorJoiner$Result" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/database/CursorJoiner$Result;" />
+ <method name="values()[Landroid/database/CursorJoiner$Result;" />
+ <field name="BOTH" />
+ <field name="LEFT" />
+ <field name="RIGHT" />
+ </class>
+ <class name="android/database/CursorWindow" since="1">
+ <extends name="android/database/sqlite/SQLiteClosable" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Ljava/lang/String;)V" since="15" />
+ <method name="&lt;init>(Z)V" />
+ <method name="allocRow()Z" />
+ <method name="clear()V" />
+ <method name="close()V" />
+ <method name="copyStringToBuffer(IILandroid/database/CharArrayBuffer;)V" />
+ <method name="freeLastRow()V" />
+ <method name="getBlob(II)[B" />
+ <method name="getDouble(II)D" />
+ <method name="getFloat(II)F" />
+ <method name="getInt(II)I" />
+ <method name="getLong(II)J" />
+ <method name="getNumRows()I" />
+ <method name="getShort(II)S" />
+ <method name="getStartPosition()I" />
+ <method name="getString(II)Ljava/lang/String;" />
+ <method name="getType(II)I" since="11" />
+ <method name="isBlob(II)Z" />
+ <method name="isFloat(II)Z" since="5" />
+ <method name="isLong(II)Z" since="5" />
+ <method name="isNull(II)Z" />
+ <method name="isString(II)Z" since="5" />
+ <method name="newFromParcel(Landroid/os/Parcel;)Landroid/database/CursorWindow;" />
+ <method name="putBlob([BII)Z" />
+ <method name="putDouble(DII)Z" />
+ <method name="putLong(JII)Z" />
+ <method name="putNull(II)Z" />
+ <method name="putString(Ljava/lang/String;II)Z" />
+ <method name="setNumColumns(I)Z" />
+ <method name="setStartPosition(I)V" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/database/CursorWrapper" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/database/Cursor" />
+ <method name="&lt;init>(Landroid/database/Cursor;)V" />
+ <method name="getWrappedCursor()Landroid/database/Cursor;" since="11" />
+ </class>
+ <class name="android/database/DataSetObservable" since="1">
+ <extends name="android/database/Observable" />
+ <method name="&lt;init>()V" />
+ <method name="notifyChanged()V" />
+ <method name="notifyInvalidated()V" />
+ </class>
+ <class name="android/database/DataSetObserver" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onChanged()V" />
+ <method name="onInvalidated()V" />
+ </class>
+ <class name="android/database/DatabaseErrorHandler" since="11">
+ <extends name="java/lang/Object" />
+ <method name="onCorruption(Landroid/database/sqlite/SQLiteDatabase;)V" />
+ </class>
+ <class name="android/database/DatabaseUtils" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="appendEscapedSQLString(Ljava/lang/StringBuilder;Ljava/lang/String;)V" />
+ <method name="appendSelectionArgs([Ljava/lang/String;[Ljava/lang/String;)[Ljava/lang/String;" since="11" />
+ <method name="appendValueToSql(Ljava/lang/StringBuilder;Ljava/lang/Object;)V" />
+ <method name="bindObjectToProgram(Landroid/database/sqlite/SQLiteProgram;ILjava/lang/Object;)V" />
+ <method name="blobFileDescriptorForQuery(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;" since="11" />
+ <method name="blobFileDescriptorForQuery(Landroid/database/sqlite/SQLiteStatement;[Ljava/lang/String;)Landroid/os/ParcelFileDescriptor;" since="11" />
+ <method name="concatenateWhere(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" since="11" />
+ <method name="createDbFromSqlStatements(Landroid/content/Context;Ljava/lang/String;ILjava/lang/String;)V" />
+ <method name="cursorDoubleToContentValues(Landroid/database/Cursor;Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;)V" />
+ <method name="cursorDoubleToContentValuesIfPresent(Landroid/database/Cursor;Landroid/content/ContentValues;Ljava/lang/String;)V" since="8" />
+ <method name="cursorDoubleToCursorValues(Landroid/database/Cursor;Ljava/lang/String;Landroid/content/ContentValues;)V" />
+ <method name="cursorFloatToContentValuesIfPresent(Landroid/database/Cursor;Landroid/content/ContentValues;Ljava/lang/String;)V" since="8" />
+ <method name="cursorIntToContentValues(Landroid/database/Cursor;Ljava/lang/String;Landroid/content/ContentValues;)V" />
+ <method name="cursorIntToContentValues(Landroid/database/Cursor;Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;)V" />
+ <method name="cursorIntToContentValuesIfPresent(Landroid/database/Cursor;Landroid/content/ContentValues;Ljava/lang/String;)V" since="8" />
+ <method name="cursorLongToContentValues(Landroid/database/Cursor;Ljava/lang/String;Landroid/content/ContentValues;)V" />
+ <method name="cursorLongToContentValues(Landroid/database/Cursor;Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;)V" />
+ <method name="cursorLongToContentValuesIfPresent(Landroid/database/Cursor;Landroid/content/ContentValues;Ljava/lang/String;)V" since="8" />
+ <method name="cursorRowToContentValues(Landroid/database/Cursor;Landroid/content/ContentValues;)V" />
+ <method name="cursorShortToContentValuesIfPresent(Landroid/database/Cursor;Landroid/content/ContentValues;Ljava/lang/String;)V" since="8" />
+ <method name="cursorStringToContentValues(Landroid/database/Cursor;Ljava/lang/String;Landroid/content/ContentValues;)V" />
+ <method name="cursorStringToContentValues(Landroid/database/Cursor;Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;)V" />
+ <method name="cursorStringToContentValuesIfPresent(Landroid/database/Cursor;Landroid/content/ContentValues;Ljava/lang/String;)V" since="8" />
+ <method name="cursorStringToInsertHelper(Landroid/database/Cursor;Ljava/lang/String;Landroid/database/DatabaseUtils$InsertHelper;I)V" />
+ <method name="dumpCurrentRow(Landroid/database/Cursor;)V" />
+ <method name="dumpCurrentRow(Landroid/database/Cursor;Ljava/io/PrintStream;)V" />
+ <method name="dumpCurrentRow(Landroid/database/Cursor;Ljava/lang/StringBuilder;)V" />
+ <method name="dumpCurrentRowToString(Landroid/database/Cursor;)Ljava/lang/String;" />
+ <method name="dumpCursor(Landroid/database/Cursor;)V" />
+ <method name="dumpCursor(Landroid/database/Cursor;Ljava/io/PrintStream;)V" />
+ <method name="dumpCursor(Landroid/database/Cursor;Ljava/lang/StringBuilder;)V" />
+ <method name="dumpCursorToString(Landroid/database/Cursor;)Ljava/lang/String;" />
+ <method name="getCollationKey(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getHexCollationKey(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getSqlStatementType(Ljava/lang/String;)I" since="11" />
+ <method name="longForQuery(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/String;)J" />
+ <method name="longForQuery(Landroid/database/sqlite/SQLiteStatement;[Ljava/lang/String;)J" />
+ <method name="queryNumEntries(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;)J" />
+ <method name="queryNumEntries(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;Ljava/lang/String;)J" since="11" />
+ <method name="queryNumEntries(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)J" since="11" />
+ <method name="readExceptionFromParcel(Landroid/os/Parcel;)V" />
+ <method name="readExceptionWithFileNotFoundExceptionFromParcel(Landroid/os/Parcel;)V" />
+ <method name="readExceptionWithOperationApplicationExceptionFromParcel(Landroid/os/Parcel;)V" since="5" />
+ <method name="sqlEscapeString(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="stringForQuery(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="stringForQuery(Landroid/database/sqlite/SQLiteStatement;[Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="writeExceptionToParcel(Landroid/os/Parcel;Ljava/lang/Exception;)V" />
+ <field name="STATEMENT_ABORT" since="11" />
+ <field name="STATEMENT_ATTACH" since="11" />
+ <field name="STATEMENT_BEGIN" since="11" />
+ <field name="STATEMENT_COMMIT" since="11" />
+ <field name="STATEMENT_DDL" since="11" />
+ <field name="STATEMENT_OTHER" since="11" />
+ <field name="STATEMENT_PRAGMA" since="11" />
+ <field name="STATEMENT_SELECT" since="11" />
+ <field name="STATEMENT_UNPREPARED" since="11" />
+ <field name="STATEMENT_UPDATE" since="11" />
+ </class>
+ <class name="android/database/DatabaseUtils$InsertHelper" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;)V" />
+ <method name="bind(ID)V" />
+ <method name="bind(IF)V" />
+ <method name="bind(II)V" />
+ <method name="bind(IJ)V" />
+ <method name="bind(ILjava/lang/String;)V" />
+ <method name="bind(IZ)V" />
+ <method name="bind(I[B)V" />
+ <method name="bindNull(I)V" />
+ <method name="close()V" />
+ <method name="execute()J" />
+ <method name="getColumnIndex(Ljava/lang/String;)I" />
+ <method name="insert(Landroid/content/ContentValues;)J" />
+ <method name="prepareForInsert()V" />
+ <method name="prepareForReplace()V" />
+ <method name="replace(Landroid/content/ContentValues;)J" />
+ <field name="TABLE_INFO_PRAGMA_DEFAULT_INDEX" />
+ </class>
+ <class name="android/database/DefaultDatabaseErrorHandler" since="11">
+ <extends name="java/lang/Object" />
+ <implements name="android/database/DatabaseErrorHandler" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/database/MatrixCursor" since="1">
+ <extends name="android/database/AbstractCursor" />
+ <method name="&lt;init>([Ljava/lang/String;)V" />
+ <method name="&lt;init>([Ljava/lang/String;I)V" />
+ <method name="addRow(Ljava/lang/Iterable;)V" />
+ <method name="addRow([Ljava/lang/Object;)V" />
+ <method name="newRow()Landroid/database/MatrixCursor$RowBuilder;" />
+ </class>
+ <class name="android/database/MatrixCursor$RowBuilder" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/database/MatrixCursor;)V" />
+ <method name="add(Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;" />
+ <method name="add(Ljava/lang/String;Ljava/lang/Object;)Landroid/database/MatrixCursor$RowBuilder;" since="19" />
+ </class>
+ <class name="android/database/MergeCursor" since="1">
+ <extends name="android/database/AbstractCursor" />
+ <method name="&lt;init>([Landroid/database/Cursor;)V" />
+ </class>
+ <class name="android/database/Observable" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="registerObserver(Ljava/lang/Object;)V" />
+ <method name="unregisterAll()V" />
+ <method name="unregisterObserver(Ljava/lang/Object;)V" />
+ <field name="mObservers" />
+ </class>
+ <class name="android/database/SQLException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" since="16" />
+ </class>
+ <class name="android/database/StaleDataException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/database/sqlite/SQLiteAbortException" since="1">
+ <extends name="android/database/sqlite/SQLiteException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/database/sqlite/SQLiteAccessPermException" since="11">
+ <extends name="android/database/sqlite/SQLiteException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/database/sqlite/SQLiteBindOrColumnIndexOutOfRangeException" since="11">
+ <extends name="android/database/sqlite/SQLiteException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/database/sqlite/SQLiteBlobTooBigException" since="11">
+ <extends name="android/database/sqlite/SQLiteException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/database/sqlite/SQLiteCantOpenDatabaseException" since="11">
+ <extends name="android/database/sqlite/SQLiteException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/database/sqlite/SQLiteClosable" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Closeable" since="16" />
+ <method name="&lt;init>()V" />
+ <method name="acquireReference()V" />
+ <method name="onAllReferencesReleased()V" />
+ <method name="onAllReferencesReleasedFromContainer()V" />
+ <method name="releaseReference()V" />
+ <method name="releaseReferenceFromContainer()V" />
+ </class>
+ <class name="android/database/sqlite/SQLiteConstraintException" since="1">
+ <extends name="android/database/sqlite/SQLiteException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/database/sqlite/SQLiteCursor" since="1">
+ <extends name="android/database/AbstractWindowedCursor" />
+ <method name="&lt;init>(Landroid/database/sqlite/SQLiteCursorDriver;Ljava/lang/String;Landroid/database/sqlite/SQLiteQuery;)V" since="11" />
+ <method name="&lt;init>(Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteCursorDriver;Ljava/lang/String;Landroid/database/sqlite/SQLiteQuery;)V" />
+ <method name="getDatabase()Landroid/database/sqlite/SQLiteDatabase;" />
+ <method name="setSelectionArguments([Ljava/lang/String;)V" />
+ </class>
+ <class name="android/database/sqlite/SQLiteCursorDriver" since="1">
+ <extends name="java/lang/Object" />
+ <method name="cursorClosed()V" />
+ <method name="cursorDeactivated()V" />
+ <method name="cursorRequeried(Landroid/database/Cursor;)V" />
+ <method name="query(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;[Ljava/lang/String;)Landroid/database/Cursor;" />
+ <method name="setBindArguments([Ljava/lang/String;)V" />
+ </class>
+ <class name="android/database/sqlite/SQLiteDatabase" since="1">
+ <extends name="android/database/sqlite/SQLiteClosable" />
+ <method name="&lt;init>()V" />
+ <method name="beginTransaction()V" />
+ <method name="beginTransactionNonExclusive()V" since="11" />
+ <method name="beginTransactionWithListener(Landroid/database/sqlite/SQLiteTransactionListener;)V" since="5" />
+ <method name="beginTransactionWithListenerNonExclusive(Landroid/database/sqlite/SQLiteTransactionListener;)V" since="11" />
+ <method name="close()V" />
+ <method name="compileStatement(Ljava/lang/String;)Landroid/database/sqlite/SQLiteStatement;" />
+ <method name="create(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;)Landroid/database/sqlite/SQLiteDatabase;" />
+ <method name="delete(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)I" />
+ <method name="deleteDatabase(Ljava/io/File;)Z" since="16" />
+ <method name="disableWriteAheadLogging()V" since="16" />
+ <method name="enableWriteAheadLogging()Z" since="11" />
+ <method name="endTransaction()V" />
+ <method name="execSQL(Ljava/lang/String;)V" />
+ <method name="execSQL(Ljava/lang/String;[Ljava/lang/Object;)V" />
+ <method name="findEditTable(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getAttachedDbs()Ljava/util/List;" since="11" />
+ <method name="getMaximumSize()J" />
+ <method name="getPageSize()J" />
+ <method name="getPath()Ljava/lang/String;" />
+ <method name="getSyncedTables()Ljava/util/Map;" />
+ <method name="getVersion()I" />
+ <method name="inTransaction()Z" />
+ <method name="insert(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;)J" />
+ <method name="insertOrThrow(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;)J" />
+ <method name="insertWithOnConflict(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;I)J" since="8" />
+ <method name="isDatabaseIntegrityOk()Z" since="11" />
+ <method name="isDbLockedByCurrentThread()Z" />
+ <method name="isDbLockedByOtherThreads()Z" />
+ <method name="isOpen()Z" />
+ <method name="isReadOnly()Z" />
+ <method name="isWriteAheadLoggingEnabled()Z" since="16" />
+ <method name="markTableSyncable(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="markTableSyncable(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="needUpgrade(I)Z" />
+ <method name="openDatabase(Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;I)Landroid/database/sqlite/SQLiteDatabase;" />
+ <method name="openDatabase(Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;ILandroid/database/DatabaseErrorHandler;)Landroid/database/sqlite/SQLiteDatabase;" since="11" />
+ <method name="openOrCreateDatabase(Ljava/io/File;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;)Landroid/database/sqlite/SQLiteDatabase;" />
+ <method name="openOrCreateDatabase(Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;)Landroid/database/sqlite/SQLiteDatabase;" />
+ <method name="openOrCreateDatabase(Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;Landroid/database/DatabaseErrorHandler;)Landroid/database/sqlite/SQLiteDatabase;" since="11" />
+ <method name="query(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;" />
+ <method name="query(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;" />
+ <method name="query(ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;" />
+ <method name="query(ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;" since="16" />
+ <method name="queryWithFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;" />
+ <method name="queryWithFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;" since="16" />
+ <method name="rawQuery(Ljava/lang/String;[Ljava/lang/String;)Landroid/database/Cursor;" />
+ <method name="rawQuery(Ljava/lang/String;[Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;" since="16" />
+ <method name="rawQueryWithFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;" />
+ <method name="rawQueryWithFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;" since="16" />
+ <method name="releaseMemory()I" />
+ <method name="replace(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;)J" />
+ <method name="replaceOrThrow(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;)J" />
+ <method name="setForeignKeyConstraintsEnabled(Z)V" since="16" />
+ <method name="setLocale(Ljava/util/Locale;)V" />
+ <method name="setLockingEnabled(Z)V" />
+ <method name="setMaxSqlCacheSize(I)V" since="11" />
+ <method name="setMaximumSize(J)J" />
+ <method name="setPageSize(J)V" />
+ <method name="setTransactionSuccessful()V" />
+ <method name="setVersion(I)V" />
+ <method name="update(Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;)I" />
+ <method name="updateWithOnConflict(Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;I)I" since="8" />
+ <method name="yieldIfContended()Z" />
+ <method name="yieldIfContendedSafely()Z" since="3" />
+ <method name="yieldIfContendedSafely(J)Z" since="5" />
+ <field name="CONFLICT_ABORT" since="8" />
+ <field name="CONFLICT_FAIL" since="8" />
+ <field name="CONFLICT_IGNORE" since="8" />
+ <field name="CONFLICT_NONE" since="8" />
+ <field name="CONFLICT_REPLACE" since="8" />
+ <field name="CONFLICT_ROLLBACK" since="8" />
+ <field name="CREATE_IF_NECESSARY" />
+ <field name="ENABLE_WRITE_AHEAD_LOGGING" since="16" />
+ <field name="MAX_SQL_CACHE_SIZE" since="11" />
+ <field name="NO_LOCALIZED_COLLATORS" />
+ <field name="OPEN_READONLY" />
+ <field name="OPEN_READWRITE" />
+ <field name="SQLITE_MAX_LIKE_PATTERN_LENGTH" />
+ </class>
+ <class name="android/database/sqlite/SQLiteDatabase$CursorFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="newCursor(Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteCursorDriver;Ljava/lang/String;Landroid/database/sqlite/SQLiteQuery;)Landroid/database/Cursor;" />
+ </class>
+ <class name="android/database/sqlite/SQLiteDatabaseCorruptException" since="1">
+ <extends name="android/database/sqlite/SQLiteException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/database/sqlite/SQLiteDatabaseLockedException" since="11">
+ <extends name="android/database/sqlite/SQLiteException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/database/sqlite/SQLiteDatatypeMismatchException" since="11">
+ <extends name="android/database/sqlite/SQLiteException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/database/sqlite/SQLiteDiskIOException" since="1">
+ <extends name="android/database/sqlite/SQLiteException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/database/sqlite/SQLiteDoneException" since="1">
+ <extends name="android/database/sqlite/SQLiteException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/database/sqlite/SQLiteException" since="1">
+ <extends name="android/database/SQLException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" since="16" />
+ </class>
+ <class name="android/database/sqlite/SQLiteFullException" since="1">
+ <extends name="android/database/sqlite/SQLiteException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/database/sqlite/SQLiteMisuseException" since="1">
+ <extends name="android/database/sqlite/SQLiteException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/database/sqlite/SQLiteOpenHelper" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;ILandroid/database/DatabaseErrorHandler;)V" since="11" />
+ <method name="close()V" />
+ <method name="getDatabaseName()Ljava/lang/String;" since="14" />
+ <method name="getReadableDatabase()Landroid/database/sqlite/SQLiteDatabase;" />
+ <method name="getWritableDatabase()Landroid/database/sqlite/SQLiteDatabase;" />
+ <method name="onConfigure(Landroid/database/sqlite/SQLiteDatabase;)V" since="16" />
+ <method name="onCreate(Landroid/database/sqlite/SQLiteDatabase;)V" />
+ <method name="onDowngrade(Landroid/database/sqlite/SQLiteDatabase;II)V" since="11" />
+ <method name="onOpen(Landroid/database/sqlite/SQLiteDatabase;)V" />
+ <method name="onUpgrade(Landroid/database/sqlite/SQLiteDatabase;II)V" />
+ <method name="setWriteAheadLoggingEnabled(Z)V" since="16" />
+ </class>
+ <class name="android/database/sqlite/SQLiteOutOfMemoryException" since="11">
+ <extends name="android/database/sqlite/SQLiteException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/database/sqlite/SQLiteProgram" since="1">
+ <extends name="android/database/sqlite/SQLiteClosable" />
+ <method name="&lt;init>()V" />
+ <method name="bindAllArgsAsStrings([Ljava/lang/String;)V" since="11" />
+ <method name="bindBlob(I[B)V" />
+ <method name="bindDouble(ID)V" />
+ <method name="bindLong(IJ)V" />
+ <method name="bindNull(I)V" />
+ <method name="bindString(ILjava/lang/String;)V" />
+ <method name="clearBindings()V" />
+ <method name="close()V" />
+ <method name="compile(Ljava/lang/String;Z)V" />
+ <method name="getUniqueId()I" />
+ <method name="native_bind_blob(I[B)V" />
+ <method name="native_bind_double(ID)V" />
+ <method name="native_bind_long(IJ)V" />
+ <method name="native_bind_null(I)V" />
+ <method name="native_bind_string(ILjava/lang/String;)V" />
+ <method name="native_compile(Ljava/lang/String;)V" />
+ <method name="native_finalize()V" />
+ <field name="mDatabase" />
+ <field name="nHandle" />
+ <field name="nStatement" />
+ </class>
+ <class name="android/database/sqlite/SQLiteQuery" since="1">
+ <extends name="android/database/sqlite/SQLiteProgram" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/database/sqlite/SQLiteQueryBuilder" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="appendColumns(Ljava/lang/StringBuilder;[Ljava/lang/String;)V" />
+ <method name="appendWhere(Ljava/lang/CharSequence;)V" />
+ <method name="appendWhereEscapeString(Ljava/lang/String;)V" />
+ <method name="buildQuery([Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" since="11" />
+ <method name="buildQuery([Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="buildQueryString(ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="buildUnionQuery([Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="buildUnionSubQuery(Ljava/lang/String;[Ljava/lang/String;Ljava/util/Set;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" since="11" />
+ <method name="buildUnionSubQuery(Ljava/lang/String;[Ljava/lang/String;Ljava/util/Set;ILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getTables()Ljava/lang/String;" />
+ <method name="query(Landroid/database/sqlite/SQLiteDatabase;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;" />
+ <method name="query(Landroid/database/sqlite/SQLiteDatabase;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;" />
+ <method name="query(Landroid/database/sqlite/SQLiteDatabase;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;" since="16" />
+ <method name="setCursorFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;)V" />
+ <method name="setDistinct(Z)V" />
+ <method name="setProjectionMap(Ljava/util/Map;)V" />
+ <method name="setStrict(Z)V" since="14" />
+ <method name="setTables(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/database/sqlite/SQLiteReadOnlyDatabaseException" since="11">
+ <extends name="android/database/sqlite/SQLiteException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/database/sqlite/SQLiteStatement" since="1">
+ <extends name="android/database/sqlite/SQLiteProgram" />
+ <method name="&lt;init>()V" />
+ <method name="execute()V" />
+ <method name="executeInsert()J" />
+ <method name="executeUpdateDelete()I" since="11" />
+ <method name="simpleQueryForBlobFileDescriptor()Landroid/os/ParcelFileDescriptor;" since="11" />
+ <method name="simpleQueryForLong()J" />
+ <method name="simpleQueryForString()Ljava/lang/String;" />
+ </class>
+ <class name="android/database/sqlite/SQLiteTableLockedException" since="11">
+ <extends name="android/database/sqlite/SQLiteException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/database/sqlite/SQLiteTransactionListener" since="5">
+ <extends name="java/lang/Object" />
+ <method name="onBegin()V" />
+ <method name="onCommit()V" />
+ <method name="onRollback()V" />
+ </class>
+ <class name="android/drm/DrmConvertedStatus" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(I[BI)V" />
+ <field name="STATUS_ERROR" />
+ <field name="STATUS_INPUTDATA_ERROR" />
+ <field name="STATUS_OK" />
+ <field name="convertedData" />
+ <field name="offset" />
+ <field name="statusCode" />
+ </class>
+ <class name="android/drm/DrmErrorEvent" since="11">
+ <extends name="android/drm/DrmEvent" />
+ <method name="&lt;init>(IILjava/lang/String;)V" />
+ <method name="&lt;init>(IILjava/lang/String;Ljava/util/HashMap;)V" since="12" />
+ <field name="TYPE_ACQUIRE_DRM_INFO_FAILED" since="12" />
+ <field name="TYPE_NOT_SUPPORTED" />
+ <field name="TYPE_NO_INTERNET_CONNECTION" />
+ <field name="TYPE_OUT_OF_MEMORY" />
+ <field name="TYPE_PROCESS_DRM_INFO_FAILED" />
+ <field name="TYPE_REMOVE_ALL_RIGHTS_FAILED" />
+ <field name="TYPE_RIGHTS_NOT_INSTALLED" />
+ <field name="TYPE_RIGHTS_RENEWAL_NOT_ALLOWED" />
+ </class>
+ <class name="android/drm/DrmEvent" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(IILjava/lang/String;)V" />
+ <method name="&lt;init>(IILjava/lang/String;Ljava/util/HashMap;)V" since="12" />
+ <method name="getAttribute(Ljava/lang/String;)Ljava/lang/Object;" since="12" />
+ <method name="getMessage()Ljava/lang/String;" />
+ <method name="getType()I" />
+ <method name="getUniqueId()I" />
+ <field name="DRM_INFO_OBJECT" since="12" />
+ <field name="DRM_INFO_STATUS_OBJECT" />
+ <field name="TYPE_ALL_RIGHTS_REMOVED" />
+ <field name="TYPE_DRM_INFO_PROCESSED" />
+ </class>
+ <class name="android/drm/DrmInfo" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(ILjava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(I[BLjava/lang/String;)V" />
+ <method name="get(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="getData()[B" />
+ <method name="getInfoType()I" />
+ <method name="getMimeType()Ljava/lang/String;" />
+ <method name="iterator()Ljava/util/Iterator;" />
+ <method name="keyIterator()Ljava/util/Iterator;" />
+ <method name="put(Ljava/lang/String;Ljava/lang/Object;)V" />
+ </class>
+ <class name="android/drm/DrmInfoEvent" since="11">
+ <extends name="android/drm/DrmEvent" />
+ <method name="&lt;init>(IILjava/lang/String;)V" />
+ <method name="&lt;init>(IILjava/lang/String;Ljava/util/HashMap;)V" since="12" />
+ <field name="TYPE_ACCOUNT_ALREADY_REGISTERED" />
+ <field name="TYPE_ALREADY_REGISTERED_BY_ANOTHER_ACCOUNT" />
+ <field name="TYPE_REMOVE_RIGHTS" />
+ <field name="TYPE_RIGHTS_INSTALLED" />
+ <field name="TYPE_RIGHTS_REMOVED" since="12" />
+ <field name="TYPE_WAIT_FOR_RIGHTS" />
+ </class>
+ <class name="android/drm/DrmInfoRequest" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(ILjava/lang/String;)V" />
+ <method name="get(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="getInfoType()I" />
+ <method name="getMimeType()Ljava/lang/String;" />
+ <method name="iterator()Ljava/util/Iterator;" />
+ <method name="keyIterator()Ljava/util/Iterator;" />
+ <method name="put(Ljava/lang/String;Ljava/lang/Object;)V" />
+ <field name="ACCOUNT_ID" />
+ <field name="SUBSCRIPTION_ID" />
+ <field name="TYPE_REGISTRATION_INFO" />
+ <field name="TYPE_RIGHTS_ACQUISITION_INFO" />
+ <field name="TYPE_RIGHTS_ACQUISITION_PROGRESS_INFO" />
+ <field name="TYPE_UNREGISTRATION_INFO" />
+ </class>
+ <class name="android/drm/DrmInfoStatus" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(IILandroid/drm/ProcessedData;Ljava/lang/String;)V" />
+ <field name="STATUS_ERROR" />
+ <field name="STATUS_OK" />
+ <field name="data" />
+ <field name="infoType" />
+ <field name="mimeType" />
+ <field name="statusCode" />
+ </class>
+ <class name="android/drm/DrmManagerClient" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="acquireDrmInfo(Landroid/drm/DrmInfoRequest;)Landroid/drm/DrmInfo;" />
+ <method name="acquireRights(Landroid/drm/DrmInfoRequest;)I" />
+ <method name="canHandle(Landroid/net/Uri;Ljava/lang/String;)Z" />
+ <method name="canHandle(Ljava/lang/String;Ljava/lang/String;)Z" />
+ <method name="checkRightsStatus(Landroid/net/Uri;)I" />
+ <method name="checkRightsStatus(Landroid/net/Uri;I)I" />
+ <method name="checkRightsStatus(Ljava/lang/String;)I" />
+ <method name="checkRightsStatus(Ljava/lang/String;I)I" />
+ <method name="closeConvertSession(I)Landroid/drm/DrmConvertedStatus;" />
+ <method name="convertData(I[B)Landroid/drm/DrmConvertedStatus;" />
+ <method name="getAvailableDrmEngines()[Ljava/lang/String;" />
+ <method name="getConstraints(Landroid/net/Uri;I)Landroid/content/ContentValues;" />
+ <method name="getConstraints(Ljava/lang/String;I)Landroid/content/ContentValues;" />
+ <method name="getDrmObjectType(Landroid/net/Uri;Ljava/lang/String;)I" />
+ <method name="getDrmObjectType(Ljava/lang/String;Ljava/lang/String;)I" />
+ <method name="getMetadata(Landroid/net/Uri;)Landroid/content/ContentValues;" />
+ <method name="getMetadata(Ljava/lang/String;)Landroid/content/ContentValues;" />
+ <method name="getOriginalMimeType(Landroid/net/Uri;)Ljava/lang/String;" />
+ <method name="getOriginalMimeType(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="openConvertSession(Ljava/lang/String;)I" />
+ <method name="processDrmInfo(Landroid/drm/DrmInfo;)I" />
+ <method name="release()V" since="16" />
+ <method name="removeAllRights()I" />
+ <method name="removeRights(Landroid/net/Uri;)I" />
+ <method name="removeRights(Ljava/lang/String;)I" />
+ <method name="saveRights(Landroid/drm/DrmRights;Ljava/lang/String;Ljava/lang/String;)I" />
+ <method name="setOnErrorListener(Landroid/drm/DrmManagerClient$OnErrorListener;)V" />
+ <method name="setOnEventListener(Landroid/drm/DrmManagerClient$OnEventListener;)V" />
+ <method name="setOnInfoListener(Landroid/drm/DrmManagerClient$OnInfoListener;)V" />
+ <field name="ERROR_NONE" />
+ <field name="ERROR_UNKNOWN" />
+ </class>
+ <class name="android/drm/DrmManagerClient$OnErrorListener" since="11">
+ <extends name="java/lang/Object" />
+ <method name="onError(Landroid/drm/DrmManagerClient;Landroid/drm/DrmErrorEvent;)V" />
+ </class>
+ <class name="android/drm/DrmManagerClient$OnEventListener" since="11">
+ <extends name="java/lang/Object" />
+ <method name="onEvent(Landroid/drm/DrmManagerClient;Landroid/drm/DrmEvent;)V" since="12" />
+ <method name="onEvent(Landroid/drm/DrmManagerClient;Landroid/drm/DrmEvent;Ljava/util/HashMap;)V" />
+ </class>
+ <class name="android/drm/DrmManagerClient$OnInfoListener" since="11">
+ <extends name="java/lang/Object" />
+ <method name="onInfo(Landroid/drm/DrmManagerClient;Landroid/drm/DrmInfoEvent;)V" />
+ </class>
+ <class name="android/drm/DrmRights" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/drm/ProcessedData;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/io/File;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="getAccountId()Ljava/lang/String;" />
+ <method name="getData()[B" />
+ <method name="getMimeType()Ljava/lang/String;" />
+ <method name="getSubscriptionId()Ljava/lang/String;" />
+ </class>
+ <class name="android/drm/DrmStore" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/drm/DrmStore$Action" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="DEFAULT" />
+ <field name="DISPLAY" />
+ <field name="EXECUTE" />
+ <field name="OUTPUT" />
+ <field name="PLAY" />
+ <field name="PREVIEW" />
+ <field name="RINGTONE" />
+ <field name="TRANSFER" />
+ </class>
+ <class name="android/drm/DrmStore$ConstraintsColumns" since="11">
+ <extends name="java/lang/Object" />
+ <field name="EXTENDED_METADATA" />
+ <field name="LICENSE_AVAILABLE_TIME" />
+ <field name="LICENSE_EXPIRY_TIME" />
+ <field name="LICENSE_START_TIME" />
+ <field name="MAX_REPEAT_COUNT" />
+ <field name="REMAINING_REPEAT_COUNT" />
+ </class>
+ <class name="android/drm/DrmStore$DrmObjectType" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT" />
+ <field name="RIGHTS_OBJECT" />
+ <field name="TRIGGER_OBJECT" />
+ <field name="UNKNOWN" />
+ </class>
+ <class name="android/drm/DrmStore$Playback" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="PAUSE" />
+ <field name="RESUME" />
+ <field name="START" />
+ <field name="STOP" />
+ </class>
+ <class name="android/drm/DrmStore$RightsStatus" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="RIGHTS_EXPIRED" />
+ <field name="RIGHTS_INVALID" />
+ <field name="RIGHTS_NOT_ACQUIRED" />
+ <field name="RIGHTS_VALID" />
+ </class>
+ <class name="android/drm/DrmSupportInfo" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addFileSuffix(Ljava/lang/String;)V" />
+ <method name="addMimeType(Ljava/lang/String;)V" />
+ <method name="getDescriprition()Ljava/lang/String;" />
+ <method name="getDescription()Ljava/lang/String;" since="16" />
+ <method name="getFileSuffixIterator()Ljava/util/Iterator;" />
+ <method name="getMimeTypeIterator()Ljava/util/Iterator;" />
+ <method name="setDescription(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/drm/DrmUtils" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getExtendedMetadataParser([B)Landroid/drm/DrmUtils$ExtendedMetadataParser;" />
+ </class>
+ <class name="android/drm/DrmUtils$ExtendedMetadataParser" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="get(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="iterator()Ljava/util/Iterator;" />
+ <method name="keyIterator()Ljava/util/Iterator;" />
+ </class>
+ <class name="android/drm/ProcessedData" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getAccountId()Ljava/lang/String;" />
+ <method name="getData()[B" />
+ <method name="getSubscriptionId()Ljava/lang/String;" />
+ </class>
+ <class name="android/gesture/Gesture" since="4">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="addStroke(Landroid/gesture/GestureStroke;)V" />
+ <method name="getBoundingBox()Landroid/graphics/RectF;" />
+ <method name="getID()J" />
+ <method name="getLength()F" />
+ <method name="getStrokes()Ljava/util/ArrayList;" />
+ <method name="getStrokesCount()I" />
+ <method name="toBitmap(IIII)Landroid/graphics/Bitmap;" />
+ <method name="toBitmap(IIIII)Landroid/graphics/Bitmap;" />
+ <method name="toPath()Landroid/graphics/Path;" />
+ <method name="toPath(IIII)Landroid/graphics/Path;" />
+ <method name="toPath(Landroid/graphics/Path;)Landroid/graphics/Path;" />
+ <method name="toPath(Landroid/graphics/Path;IIII)Landroid/graphics/Path;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/gesture/GestureLibraries" since="4">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="fromFile(Ljava/io/File;)Landroid/gesture/GestureLibrary;" />
+ <method name="fromFile(Ljava/lang/String;)Landroid/gesture/GestureLibrary;" />
+ <method name="fromPrivateFile(Landroid/content/Context;Ljava/lang/String;)Landroid/gesture/GestureLibrary;" />
+ <method name="fromRawResource(Landroid/content/Context;I)Landroid/gesture/GestureLibrary;" />
+ </class>
+ <class name="android/gesture/GestureLibrary" since="4">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addGesture(Ljava/lang/String;Landroid/gesture/Gesture;)V" />
+ <method name="getGestureEntries()Ljava/util/Set;" />
+ <method name="getGestures(Ljava/lang/String;)Ljava/util/ArrayList;" />
+ <method name="getOrientationStyle()I" />
+ <method name="getSequenceType()I" />
+ <method name="isReadOnly()Z" />
+ <method name="load()Z" />
+ <method name="recognize(Landroid/gesture/Gesture;)Ljava/util/ArrayList;" />
+ <method name="removeEntry(Ljava/lang/String;)V" />
+ <method name="removeGesture(Ljava/lang/String;Landroid/gesture/Gesture;)V" />
+ <method name="save()Z" />
+ <method name="setOrientationStyle(I)V" />
+ <method name="setSequenceType(I)V" />
+ <field name="mStore" />
+ </class>
+ <class name="android/gesture/GestureOverlayView" since="4">
+ <extends name="android/widget/FrameLayout" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="addOnGestureListener(Landroid/gesture/GestureOverlayView$OnGestureListener;)V" />
+ <method name="addOnGesturePerformedListener(Landroid/gesture/GestureOverlayView$OnGesturePerformedListener;)V" />
+ <method name="addOnGesturingListener(Landroid/gesture/GestureOverlayView$OnGesturingListener;)V" />
+ <method name="cancelClearAnimation()V" />
+ <method name="cancelGesture()V" />
+ <method name="clear(Z)V" />
+ <method name="getCurrentStroke()Ljava/util/ArrayList;" />
+ <method name="getFadeOffset()J" />
+ <method name="getGesture()Landroid/gesture/Gesture;" />
+ <method name="getGestureColor()I" />
+ <method name="getGesturePath()Landroid/graphics/Path;" />
+ <method name="getGesturePath(Landroid/graphics/Path;)Landroid/graphics/Path;" />
+ <method name="getGestureStrokeAngleThreshold()F" />
+ <method name="getGestureStrokeLengthThreshold()F" />
+ <method name="getGestureStrokeSquarenessTreshold()F" />
+ <method name="getGestureStrokeType()I" />
+ <method name="getGestureStrokeWidth()F" />
+ <method name="getOrientation()I" />
+ <method name="getUncertainGestureColor()I" />
+ <method name="isEventsInterceptionEnabled()Z" />
+ <method name="isFadeEnabled()Z" />
+ <method name="isGestureVisible()Z" />
+ <method name="isGesturing()Z" />
+ <method name="removeAllOnGestureListeners()V" />
+ <method name="removeAllOnGesturePerformedListeners()V" />
+ <method name="removeAllOnGesturingListeners()V" />
+ <method name="removeOnGestureListener(Landroid/gesture/GestureOverlayView$OnGestureListener;)V" />
+ <method name="removeOnGesturePerformedListener(Landroid/gesture/GestureOverlayView$OnGesturePerformedListener;)V" />
+ <method name="removeOnGesturingListener(Landroid/gesture/GestureOverlayView$OnGesturingListener;)V" />
+ <method name="setEventsInterceptionEnabled(Z)V" />
+ <method name="setFadeEnabled(Z)V" />
+ <method name="setFadeOffset(J)V" />
+ <method name="setGesture(Landroid/gesture/Gesture;)V" />
+ <method name="setGestureColor(I)V" />
+ <method name="setGestureStrokeAngleThreshold(F)V" />
+ <method name="setGestureStrokeLengthThreshold(F)V" />
+ <method name="setGestureStrokeSquarenessTreshold(F)V" />
+ <method name="setGestureStrokeType(I)V" />
+ <method name="setGestureStrokeWidth(F)V" />
+ <method name="setGestureVisible(Z)V" />
+ <method name="setOrientation(I)V" />
+ <method name="setUncertainGestureColor(I)V" />
+ <field name="GESTURE_STROKE_TYPE_MULTIPLE" />
+ <field name="GESTURE_STROKE_TYPE_SINGLE" />
+ <field name="ORIENTATION_HORIZONTAL" />
+ <field name="ORIENTATION_VERTICAL" />
+ </class>
+ <class name="android/gesture/GestureOverlayView$OnGestureListener" since="4">
+ <extends name="java/lang/Object" />
+ <method name="onGesture(Landroid/gesture/GestureOverlayView;Landroid/view/MotionEvent;)V" />
+ <method name="onGestureCancelled(Landroid/gesture/GestureOverlayView;Landroid/view/MotionEvent;)V" />
+ <method name="onGestureEnded(Landroid/gesture/GestureOverlayView;Landroid/view/MotionEvent;)V" />
+ <method name="onGestureStarted(Landroid/gesture/GestureOverlayView;Landroid/view/MotionEvent;)V" />
+ </class>
+ <class name="android/gesture/GestureOverlayView$OnGesturePerformedListener" since="4">
+ <extends name="java/lang/Object" />
+ <method name="onGesturePerformed(Landroid/gesture/GestureOverlayView;Landroid/gesture/Gesture;)V" />
+ </class>
+ <class name="android/gesture/GestureOverlayView$OnGesturingListener" since="4">
+ <extends name="java/lang/Object" />
+ <method name="onGesturingEnded(Landroid/gesture/GestureOverlayView;)V" />
+ <method name="onGesturingStarted(Landroid/gesture/GestureOverlayView;)V" />
+ </class>
+ <class name="android/gesture/GesturePoint" since="4">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(FFJ)V" />
+ <field name="timestamp" />
+ <field name="x" />
+ <field name="y" />
+ </class>
+ <class name="android/gesture/GestureStore" since="4">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addGesture(Ljava/lang/String;Landroid/gesture/Gesture;)V" />
+ <method name="getGestureEntries()Ljava/util/Set;" />
+ <method name="getGestures(Ljava/lang/String;)Ljava/util/ArrayList;" />
+ <method name="getOrientationStyle()I" />
+ <method name="getSequenceType()I" />
+ <method name="hasChanged()Z" />
+ <method name="load(Ljava/io/InputStream;)V" />
+ <method name="load(Ljava/io/InputStream;Z)V" />
+ <method name="recognize(Landroid/gesture/Gesture;)Ljava/util/ArrayList;" />
+ <method name="removeEntry(Ljava/lang/String;)V" />
+ <method name="removeGesture(Ljava/lang/String;Landroid/gesture/Gesture;)V" />
+ <method name="save(Ljava/io/OutputStream;)V" />
+ <method name="save(Ljava/io/OutputStream;Z)V" />
+ <method name="setOrientationStyle(I)V" />
+ <method name="setSequenceType(I)V" />
+ <field name="ORIENTATION_INVARIANT" />
+ <field name="ORIENTATION_SENSITIVE" />
+ <field name="SEQUENCE_INVARIANT" />
+ <field name="SEQUENCE_SENSITIVE" />
+ </class>
+ <class name="android/gesture/GestureStroke" since="4">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/util/ArrayList;)V" />
+ <method name="clearPath()V" />
+ <method name="computeOrientedBoundingBox()Landroid/gesture/OrientedBoundingBox;" />
+ <method name="getPath()Landroid/graphics/Path;" />
+ <method name="toPath(FFI)Landroid/graphics/Path;" />
+ <field name="boundingBox" />
+ <field name="length" />
+ <field name="points" />
+ </class>
+ <class name="android/gesture/GestureUtils" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="computeOrientedBoundingBox(Ljava/util/ArrayList;)Landroid/gesture/OrientedBoundingBox;" />
+ <method name="computeOrientedBoundingBox([F)Landroid/gesture/OrientedBoundingBox;" />
+ <method name="spatialSampling(Landroid/gesture/Gesture;I)[F" />
+ <method name="spatialSampling(Landroid/gesture/Gesture;IZ)[F" />
+ <method name="temporalSampling(Landroid/gesture/GestureStroke;I)[F" />
+ </class>
+ <class name="android/gesture/OrientedBoundingBox" since="4">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="centerX" />
+ <field name="centerY" />
+ <field name="height" />
+ <field name="orientation" />
+ <field name="squareness" />
+ <field name="width" />
+ </class>
+ <class name="android/gesture/Prediction" since="4">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="name" />
+ <field name="score" />
+ </class>
+ <class name="android/graphics/AvoidXfermode" since="1">
+ <extends name="android/graphics/Xfermode" />
+ <method name="&lt;init>(IILandroid/graphics/AvoidXfermode$Mode;)V" />
+ </class>
+ <class name="android/graphics/AvoidXfermode$Mode" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/AvoidXfermode$Mode;" />
+ <method name="values()[Landroid/graphics/AvoidXfermode$Mode;" />
+ <field name="AVOID" />
+ <field name="TARGET" />
+ </class>
+ <class name="android/graphics/Bitmap" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="compress(Landroid/graphics/Bitmap$CompressFormat;ILjava/io/OutputStream;)Z" />
+ <method name="copy(Landroid/graphics/Bitmap$Config;Z)Landroid/graphics/Bitmap;" />
+ <method name="copyPixelsFromBuffer(Ljava/nio/Buffer;)V" since="3" />
+ <method name="copyPixelsToBuffer(Ljava/nio/Buffer;)V" />
+ <method name="createBitmap(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;" />
+ <method name="createBitmap(Landroid/graphics/Bitmap;)Landroid/graphics/Bitmap;" />
+ <method name="createBitmap(Landroid/graphics/Bitmap;IIII)Landroid/graphics/Bitmap;" />
+ <method name="createBitmap(Landroid/graphics/Bitmap;IIIILandroid/graphics/Matrix;Z)Landroid/graphics/Bitmap;" />
+ <method name="createBitmap(Landroid/util/DisplayMetrics;IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;" since="17" />
+ <method name="createBitmap(Landroid/util/DisplayMetrics;[IIIIILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;" since="17" />
+ <method name="createBitmap(Landroid/util/DisplayMetrics;[IIILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;" since="17" />
+ <method name="createBitmap([IIIIILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;" />
+ <method name="createBitmap([IIILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;" />
+ <method name="createScaledBitmap(Landroid/graphics/Bitmap;IIZ)Landroid/graphics/Bitmap;" />
+ <method name="eraseColor(I)V" />
+ <method name="extractAlpha()Landroid/graphics/Bitmap;" />
+ <method name="extractAlpha(Landroid/graphics/Paint;[I)Landroid/graphics/Bitmap;" />
+ <method name="getAllocationByteCount()I" since="19" />
+ <method name="getByteCount()I" since="12" />
+ <method name="getConfig()Landroid/graphics/Bitmap$Config;" />
+ <method name="getDensity()I" since="4" />
+ <method name="getGenerationId()I" since="12" />
+ <method name="getHeight()I" />
+ <method name="getNinePatchChunk()[B" />
+ <method name="getPixel(II)I" />
+ <method name="getPixels([IIIIIII)V" />
+ <method name="getRowBytes()I" />
+ <method name="getScaledHeight(I)I" since="4" />
+ <method name="getScaledHeight(Landroid/graphics/Canvas;)I" since="4" />
+ <method name="getScaledHeight(Landroid/util/DisplayMetrics;)I" since="4" />
+ <method name="getScaledWidth(I)I" since="4" />
+ <method name="getScaledWidth(Landroid/graphics/Canvas;)I" since="4" />
+ <method name="getScaledWidth(Landroid/util/DisplayMetrics;)I" since="4" />
+ <method name="getWidth()I" />
+ <method name="hasAlpha()Z" />
+ <method name="hasMipMap()Z" since="17" />
+ <method name="isMutable()Z" />
+ <method name="isPremultiplied()Z" since="17" />
+ <method name="isRecycled()Z" />
+ <method name="prepareToDraw()V" since="4" />
+ <method name="reconfigure(IILandroid/graphics/Bitmap$Config;)V" since="19" />
+ <method name="recycle()V" />
+ <method name="sameAs(Landroid/graphics/Bitmap;)Z" since="12" />
+ <method name="setConfig(Landroid/graphics/Bitmap$Config;)V" since="19" />
+ <method name="setDensity(I)V" since="4" />
+ <method name="setHasAlpha(Z)V" since="12" />
+ <method name="setHasMipMap(Z)V" since="17" />
+ <method name="setHeight(I)V" since="19" />
+ <method name="setPixel(III)V" />
+ <method name="setPixels([IIIIIII)V" />
+ <method name="setPremultiplied(Z)V" since="19" />
+ <method name="setWidth(I)V" since="19" />
+ <field name="CREATOR" />
+ <field name="DENSITY_NONE" since="4" />
+ </class>
+ <class name="android/graphics/Bitmap$CompressFormat" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Bitmap$CompressFormat;" />
+ <method name="values()[Landroid/graphics/Bitmap$CompressFormat;" />
+ <field name="JPEG" />
+ <field name="PNG" />
+ <field name="WEBP" since="14" />
+ </class>
+ <class name="android/graphics/Bitmap$Config" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Bitmap$Config;" />
+ <method name="values()[Landroid/graphics/Bitmap$Config;" />
+ <field name="ALPHA_8" />
+ <field name="ARGB_4444" />
+ <field name="ARGB_8888" />
+ <field name="RGB_565" />
+ </class>
+ <class name="android/graphics/BitmapFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="decodeByteArray([BII)Landroid/graphics/Bitmap;" />
+ <method name="decodeByteArray([BIILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;" />
+ <method name="decodeFile(Ljava/lang/String;)Landroid/graphics/Bitmap;" />
+ <method name="decodeFile(Ljava/lang/String;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;" />
+ <method name="decodeFileDescriptor(Ljava/io/FileDescriptor;)Landroid/graphics/Bitmap;" />
+ <method name="decodeFileDescriptor(Ljava/io/FileDescriptor;Landroid/graphics/Rect;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;" />
+ <method name="decodeResource(Landroid/content/res/Resources;I)Landroid/graphics/Bitmap;" />
+ <method name="decodeResource(Landroid/content/res/Resources;ILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;" />
+ <method name="decodeResourceStream(Landroid/content/res/Resources;Landroid/util/TypedValue;Ljava/io/InputStream;Landroid/graphics/Rect;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;" since="4" />
+ <method name="decodeStream(Ljava/io/InputStream;)Landroid/graphics/Bitmap;" />
+ <method name="decodeStream(Ljava/io/InputStream;Landroid/graphics/Rect;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;" />
+ </class>
+ <class name="android/graphics/BitmapFactory$Options" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="requestCancelDecode()V" />
+ <field name="inBitmap" since="11" />
+ <field name="inDensity" since="4" />
+ <field name="inDither" />
+ <field name="inInputShareable" since="4" />
+ <field name="inJustDecodeBounds" />
+ <field name="inMutable" since="11" />
+ <field name="inPreferQualityOverSpeed" since="10" />
+ <field name="inPreferredConfig" />
+ <field name="inPremultiplied" since="19" />
+ <field name="inPurgeable" since="4" />
+ <field name="inSampleSize" />
+ <field name="inScaled" since="4" />
+ <field name="inScreenDensity" since="4" />
+ <field name="inTargetDensity" since="4" />
+ <field name="inTempStorage" />
+ <field name="mCancel" />
+ <field name="outHeight" />
+ <field name="outMimeType" />
+ <field name="outWidth" />
+ </class>
+ <class name="android/graphics/BitmapRegionDecoder" since="10">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="decodeRegion(Landroid/graphics/Rect;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;" />
+ <method name="getHeight()I" />
+ <method name="getWidth()I" />
+ <method name="isRecycled()Z" />
+ <method name="newInstance(Ljava/io/FileDescriptor;Z)Landroid/graphics/BitmapRegionDecoder;" />
+ <method name="newInstance(Ljava/io/InputStream;Z)Landroid/graphics/BitmapRegionDecoder;" />
+ <method name="newInstance(Ljava/lang/String;Z)Landroid/graphics/BitmapRegionDecoder;" />
+ <method name="newInstance([BIIZ)Landroid/graphics/BitmapRegionDecoder;" />
+ <method name="recycle()V" />
+ </class>
+ <class name="android/graphics/BitmapShader" since="1">
+ <extends name="android/graphics/Shader" />
+ <method name="&lt;init>(Landroid/graphics/Bitmap;Landroid/graphics/Shader$TileMode;Landroid/graphics/Shader$TileMode;)V" />
+ </class>
+ <class name="android/graphics/BlurMaskFilter" since="1">
+ <extends name="android/graphics/MaskFilter" />
+ <method name="&lt;init>(FLandroid/graphics/BlurMaskFilter$Blur;)V" />
+ </class>
+ <class name="android/graphics/BlurMaskFilter$Blur" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/BlurMaskFilter$Blur;" />
+ <method name="values()[Landroid/graphics/BlurMaskFilter$Blur;" />
+ <field name="INNER" />
+ <field name="NORMAL" />
+ <field name="OUTER" />
+ <field name="SOLID" />
+ </class>
+ <class name="android/graphics/Camera" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="applyToCanvas(Landroid/graphics/Canvas;)V" />
+ <method name="dotWithNormal(FFF)F" />
+ <method name="getLocationX()F" since="16" />
+ <method name="getLocationY()F" since="16" />
+ <method name="getLocationZ()F" since="16" />
+ <method name="getMatrix(Landroid/graphics/Matrix;)V" />
+ <method name="restore()V" />
+ <method name="rotate(FFF)V" since="12" />
+ <method name="rotateX(F)V" />
+ <method name="rotateY(F)V" />
+ <method name="rotateZ(F)V" />
+ <method name="save()V" />
+ <method name="setLocation(FFF)V" since="12" />
+ <method name="translate(FFF)V" />
+ </class>
+ <class name="android/graphics/Canvas" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/graphics/Bitmap;)V" />
+ <method name="&lt;init>(Ljavax/microedition/khronos/opengles/GL;)V" />
+ <method name="clipPath(Landroid/graphics/Path;)Z" />
+ <method name="clipPath(Landroid/graphics/Path;Landroid/graphics/Region$Op;)Z" />
+ <method name="clipRect(FFFF)Z" />
+ <method name="clipRect(FFFFLandroid/graphics/Region$Op;)Z" />
+ <method name="clipRect(IIII)Z" />
+ <method name="clipRect(Landroid/graphics/Rect;)Z" />
+ <method name="clipRect(Landroid/graphics/Rect;Landroid/graphics/Region$Op;)Z" />
+ <method name="clipRect(Landroid/graphics/RectF;)Z" />
+ <method name="clipRect(Landroid/graphics/RectF;Landroid/graphics/Region$Op;)Z" />
+ <method name="clipRegion(Landroid/graphics/Region;)Z" />
+ <method name="clipRegion(Landroid/graphics/Region;Landroid/graphics/Region$Op;)Z" />
+ <method name="concat(Landroid/graphics/Matrix;)V" />
+ <method name="drawARGB(IIII)V" />
+ <method name="drawArc(FFFFFFZLandroid/graphics/Paint;)V" since="21" />
+ <method name="drawArc(Landroid/graphics/RectF;FFZLandroid/graphics/Paint;)V" />
+ <method name="drawBitmap(Landroid/graphics/Bitmap;FFLandroid/graphics/Paint;)V" />
+ <method name="drawBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Matrix;Landroid/graphics/Paint;)V" />
+ <method name="drawBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Paint;)V" />
+ <method name="drawBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Rect;Landroid/graphics/RectF;Landroid/graphics/Paint;)V" />
+ <method name="drawBitmap([IIIFFIIZLandroid/graphics/Paint;)V" since="3" />
+ <method name="drawBitmap([IIIIIIIZLandroid/graphics/Paint;)V" />
+ <method name="drawBitmapMesh(Landroid/graphics/Bitmap;II[FI[IILandroid/graphics/Paint;)V" />
+ <method name="drawCircle(FFFLandroid/graphics/Paint;)V" />
+ <method name="drawColor(I)V" />
+ <method name="drawColor(ILandroid/graphics/PorterDuff$Mode;)V" />
+ <method name="drawLine(FFFFLandroid/graphics/Paint;)V" />
+ <method name="drawLines([FIILandroid/graphics/Paint;)V" />
+ <method name="drawLines([FLandroid/graphics/Paint;)V" />
+ <method name="drawOval(FFFFLandroid/graphics/Paint;)V" since="21" />
+ <method name="drawOval(Landroid/graphics/RectF;Landroid/graphics/Paint;)V" />
+ <method name="drawPaint(Landroid/graphics/Paint;)V" />
+ <method name="drawPath(Landroid/graphics/Path;Landroid/graphics/Paint;)V" />
+ <method name="drawPicture(Landroid/graphics/Picture;)V" />
+ <method name="drawPicture(Landroid/graphics/Picture;Landroid/graphics/Rect;)V" />
+ <method name="drawPicture(Landroid/graphics/Picture;Landroid/graphics/RectF;)V" />
+ <method name="drawPoint(FFLandroid/graphics/Paint;)V" />
+ <method name="drawPoints([FIILandroid/graphics/Paint;)V" />
+ <method name="drawPoints([FLandroid/graphics/Paint;)V" />
+ <method name="drawPosText(Ljava/lang/String;[FLandroid/graphics/Paint;)V" />
+ <method name="drawPosText([CII[FLandroid/graphics/Paint;)V" />
+ <method name="drawRGB(III)V" />
+ <method name="drawRect(FFFFLandroid/graphics/Paint;)V" />
+ <method name="drawRect(Landroid/graphics/Rect;Landroid/graphics/Paint;)V" />
+ <method name="drawRect(Landroid/graphics/RectF;Landroid/graphics/Paint;)V" />
+ <method name="drawRoundRect(FFFFFFLandroid/graphics/Paint;)V" since="21" />
+ <method name="drawRoundRect(Landroid/graphics/RectF;FFLandroid/graphics/Paint;)V" />
+ <method name="drawText(Ljava/lang/CharSequence;IIFFLandroid/graphics/Paint;)V" />
+ <method name="drawText(Ljava/lang/String;FFLandroid/graphics/Paint;)V" />
+ <method name="drawText(Ljava/lang/String;IIFFLandroid/graphics/Paint;)V" />
+ <method name="drawText([CIIFFLandroid/graphics/Paint;)V" />
+ <method name="drawTextOnPath(Ljava/lang/String;Landroid/graphics/Path;FFLandroid/graphics/Paint;)V" />
+ <method name="drawTextOnPath([CIILandroid/graphics/Path;FFLandroid/graphics/Paint;)V" />
+ <method name="drawVertices(Landroid/graphics/Canvas$VertexMode;I[FI[FI[II[SIILandroid/graphics/Paint;)V" />
+ <method name="freeGlCaches()V" />
+ <method name="getClipBounds()Landroid/graphics/Rect;" />
+ <method name="getClipBounds(Landroid/graphics/Rect;)Z" />
+ <method name="getDensity()I" since="4" />
+ <method name="getDrawFilter()Landroid/graphics/DrawFilter;" />
+ <method name="getGL()Ljavax/microedition/khronos/opengles/GL;" />
+ <method name="getHeight()I" />
+ <method name="getMatrix()Landroid/graphics/Matrix;" />
+ <method name="getMatrix(Landroid/graphics/Matrix;)V" />
+ <method name="getMaximumBitmapHeight()I" since="14" />
+ <method name="getMaximumBitmapWidth()I" since="14" />
+ <method name="getSaveCount()I" />
+ <method name="getWidth()I" />
+ <method name="isHardwareAccelerated()Z" since="11" />
+ <method name="isOpaque()Z" />
+ <method name="quickReject(FFFFLandroid/graphics/Canvas$EdgeType;)Z" />
+ <method name="quickReject(Landroid/graphics/Path;Landroid/graphics/Canvas$EdgeType;)Z" />
+ <method name="quickReject(Landroid/graphics/RectF;Landroid/graphics/Canvas$EdgeType;)Z" />
+ <method name="restore()V" />
+ <method name="restoreToCount(I)V" />
+ <method name="rotate(F)V" />
+ <method name="rotate(FFF)V" />
+ <method name="save()I" />
+ <method name="save(I)I" />
+ <method name="saveLayer(FFFFLandroid/graphics/Paint;)I" since="21" />
+ <method name="saveLayer(FFFFLandroid/graphics/Paint;I)I" />
+ <method name="saveLayer(Landroid/graphics/RectF;Landroid/graphics/Paint;)I" since="21" />
+ <method name="saveLayer(Landroid/graphics/RectF;Landroid/graphics/Paint;I)I" />
+ <method name="saveLayerAlpha(FFFFI)I" since="21" />
+ <method name="saveLayerAlpha(FFFFII)I" />
+ <method name="saveLayerAlpha(Landroid/graphics/RectF;I)I" since="21" />
+ <method name="saveLayerAlpha(Landroid/graphics/RectF;II)I" />
+ <method name="scale(FF)V" />
+ <method name="scale(FFFF)V" />
+ <method name="setBitmap(Landroid/graphics/Bitmap;)V" />
+ <method name="setDensity(I)V" since="4" />
+ <method name="setDrawFilter(Landroid/graphics/DrawFilter;)V" />
+ <method name="setMatrix(Landroid/graphics/Matrix;)V" />
+ <method name="setViewport(II)V" />
+ <method name="skew(FF)V" />
+ <method name="translate(FF)V" />
+ <field name="ALL_SAVE_FLAG" />
+ <field name="CLIP_SAVE_FLAG" />
+ <field name="CLIP_TO_LAYER_SAVE_FLAG" />
+ <field name="FULL_COLOR_LAYER_SAVE_FLAG" />
+ <field name="HAS_ALPHA_LAYER_SAVE_FLAG" />
+ <field name="MATRIX_SAVE_FLAG" />
+ </class>
+ <class name="android/graphics/Canvas$EdgeType" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Canvas$EdgeType;" />
+ <method name="values()[Landroid/graphics/Canvas$EdgeType;" />
+ <field name="AA" />
+ <field name="BW" />
+ </class>
+ <class name="android/graphics/Canvas$VertexMode" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Canvas$VertexMode;" />
+ <method name="values()[Landroid/graphics/Canvas$VertexMode;" />
+ <field name="TRIANGLES" />
+ <field name="TRIANGLE_FAN" />
+ <field name="TRIANGLE_STRIP" />
+ </class>
+ <class name="android/graphics/Color" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="HSVToColor(I[F)I" />
+ <method name="HSVToColor([F)I" />
+ <method name="RGBToHSV(III[F)V" />
+ <method name="alpha(I)I" />
+ <method name="argb(IIII)I" />
+ <method name="blue(I)I" />
+ <method name="colorToHSV(I[F)V" />
+ <method name="green(I)I" />
+ <method name="parseColor(Ljava/lang/String;)I" />
+ <method name="red(I)I" />
+ <method name="rgb(III)I" />
+ <field name="BLACK" />
+ <field name="BLUE" />
+ <field name="CYAN" />
+ <field name="DKGRAY" />
+ <field name="GRAY" />
+ <field name="GREEN" />
+ <field name="LTGRAY" />
+ <field name="MAGENTA" />
+ <field name="RED" />
+ <field name="TRANSPARENT" />
+ <field name="WHITE" />
+ <field name="YELLOW" />
+ </class>
+ <class name="android/graphics/ColorFilter" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/graphics/ColorMatrix" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/graphics/ColorMatrix;)V" />
+ <method name="&lt;init>([F)V" />
+ <method name="getArray()[F" />
+ <method name="postConcat(Landroid/graphics/ColorMatrix;)V" />
+ <method name="preConcat(Landroid/graphics/ColorMatrix;)V" />
+ <method name="reset()V" />
+ <method name="set(Landroid/graphics/ColorMatrix;)V" />
+ <method name="set([F)V" />
+ <method name="setConcat(Landroid/graphics/ColorMatrix;Landroid/graphics/ColorMatrix;)V" />
+ <method name="setRGB2YUV()V" />
+ <method name="setRotate(IF)V" />
+ <method name="setSaturation(F)V" />
+ <method name="setScale(FFFF)V" />
+ <method name="setYUV2RGB()V" />
+ </class>
+ <class name="android/graphics/ColorMatrixColorFilter" since="1">
+ <extends name="android/graphics/ColorFilter" />
+ <method name="&lt;init>(Landroid/graphics/ColorMatrix;)V" />
+ <method name="&lt;init>([F)V" />
+ </class>
+ <class name="android/graphics/ComposePathEffect" since="1">
+ <extends name="android/graphics/PathEffect" />
+ <method name="&lt;init>(Landroid/graphics/PathEffect;Landroid/graphics/PathEffect;)V" />
+ </class>
+ <class name="android/graphics/ComposeShader" since="1">
+ <extends name="android/graphics/Shader" />
+ <method name="&lt;init>(Landroid/graphics/Shader;Landroid/graphics/Shader;Landroid/graphics/PorterDuff$Mode;)V" />
+ <method name="&lt;init>(Landroid/graphics/Shader;Landroid/graphics/Shader;Landroid/graphics/Xfermode;)V" />
+ </class>
+ <class name="android/graphics/CornerPathEffect" since="1">
+ <extends name="android/graphics/PathEffect" />
+ <method name="&lt;init>(F)V" />
+ </class>
+ <class name="android/graphics/DashPathEffect" since="1">
+ <extends name="android/graphics/PathEffect" />
+ <method name="&lt;init>([FF)V" />
+ </class>
+ <class name="android/graphics/DiscretePathEffect" since="1">
+ <extends name="android/graphics/PathEffect" />
+ <method name="&lt;init>(FF)V" />
+ </class>
+ <class name="android/graphics/DrawFilter" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/graphics/EmbossMaskFilter" since="1">
+ <extends name="android/graphics/MaskFilter" />
+ <method name="&lt;init>([FFFF)V" />
+ </class>
+ <class name="android/graphics/ImageFormat" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getBitsPerPixel(I)I" />
+ <field name="JPEG" />
+ <field name="NV16" />
+ <field name="NV21" />
+ <field name="RAW10" since="21" />
+ <field name="RAW_SENSOR" since="21" />
+ <field name="RGB_565" />
+ <field name="UNKNOWN" />
+ <field name="YUV_420_888" since="19" />
+ <field name="YUY2" />
+ <field name="YV12" since="9" />
+ </class>
+ <class name="android/graphics/Interpolator" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(II)V" />
+ <method name="getKeyFrameCount()I" />
+ <method name="getValueCount()I" />
+ <method name="reset(I)V" />
+ <method name="reset(II)V" />
+ <method name="setKeyFrame(II[F)V" />
+ <method name="setKeyFrame(II[F[F)V" />
+ <method name="setRepeatMirror(FZ)V" />
+ <method name="timeToValues(I[F)Landroid/graphics/Interpolator$Result;" />
+ <method name="timeToValues([F)Landroid/graphics/Interpolator$Result;" />
+ </class>
+ <class name="android/graphics/Interpolator$Result" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Interpolator$Result;" />
+ <method name="values()[Landroid/graphics/Interpolator$Result;" />
+ <field name="FREEZE_END" />
+ <field name="FREEZE_START" />
+ <field name="NORMAL" />
+ </class>
+ <class name="android/graphics/LayerRasterizer" since="1">
+ <extends name="android/graphics/Rasterizer" />
+ <method name="&lt;init>()V" />
+ <method name="addLayer(Landroid/graphics/Paint;)V" />
+ <method name="addLayer(Landroid/graphics/Paint;FF)V" />
+ </class>
+ <class name="android/graphics/LightingColorFilter" since="1">
+ <extends name="android/graphics/ColorFilter" />
+ <method name="&lt;init>(II)V" />
+ </class>
+ <class name="android/graphics/LinearGradient" since="1">
+ <extends name="android/graphics/Shader" />
+ <method name="&lt;init>(FFFFIILandroid/graphics/Shader$TileMode;)V" />
+ <method name="&lt;init>(FFFF[I[FLandroid/graphics/Shader$TileMode;)V" />
+ </class>
+ <class name="android/graphics/MaskFilter" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/graphics/Matrix" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/graphics/Matrix;)V" />
+ <method name="getValues([F)V" />
+ <method name="invert(Landroid/graphics/Matrix;)Z" />
+ <method name="isAffine()Z" since="21" />
+ <method name="isIdentity()Z" />
+ <method name="mapPoints([F)V" />
+ <method name="mapPoints([FI[FII)V" />
+ <method name="mapPoints([F[F)V" />
+ <method name="mapRadius(F)F" />
+ <method name="mapRect(Landroid/graphics/RectF;)Z" />
+ <method name="mapRect(Landroid/graphics/RectF;Landroid/graphics/RectF;)Z" />
+ <method name="mapVectors([F)V" />
+ <method name="mapVectors([FI[FII)V" />
+ <method name="mapVectors([F[F)V" />
+ <method name="postConcat(Landroid/graphics/Matrix;)Z" />
+ <method name="postRotate(F)Z" />
+ <method name="postRotate(FFF)Z" />
+ <method name="postScale(FF)Z" />
+ <method name="postScale(FFFF)Z" />
+ <method name="postSkew(FF)Z" />
+ <method name="postSkew(FFFF)Z" />
+ <method name="postTranslate(FF)Z" />
+ <method name="preConcat(Landroid/graphics/Matrix;)Z" />
+ <method name="preRotate(F)Z" />
+ <method name="preRotate(FFF)Z" />
+ <method name="preScale(FF)Z" />
+ <method name="preScale(FFFF)Z" />
+ <method name="preSkew(FF)Z" />
+ <method name="preSkew(FFFF)Z" />
+ <method name="preTranslate(FF)Z" />
+ <method name="rectStaysRect()Z" />
+ <method name="reset()V" />
+ <method name="set(Landroid/graphics/Matrix;)V" />
+ <method name="setConcat(Landroid/graphics/Matrix;Landroid/graphics/Matrix;)Z" />
+ <method name="setPolyToPoly([FI[FII)Z" />
+ <method name="setRectToRect(Landroid/graphics/RectF;Landroid/graphics/RectF;Landroid/graphics/Matrix$ScaleToFit;)Z" />
+ <method name="setRotate(F)V" />
+ <method name="setRotate(FFF)V" />
+ <method name="setScale(FF)V" />
+ <method name="setScale(FFFF)V" />
+ <method name="setSinCos(FF)V" />
+ <method name="setSinCos(FFFF)V" />
+ <method name="setSkew(FF)V" />
+ <method name="setSkew(FFFF)V" />
+ <method name="setTranslate(FF)V" />
+ <method name="setValues([F)V" />
+ <method name="toShortString()Ljava/lang/String;" />
+ <field name="MPERSP_0" />
+ <field name="MPERSP_1" />
+ <field name="MPERSP_2" />
+ <field name="MSCALE_X" />
+ <field name="MSCALE_Y" />
+ <field name="MSKEW_X" />
+ <field name="MSKEW_Y" />
+ <field name="MTRANS_X" />
+ <field name="MTRANS_Y" />
+ </class>
+ <class name="android/graphics/Matrix$ScaleToFit" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Matrix$ScaleToFit;" />
+ <method name="values()[Landroid/graphics/Matrix$ScaleToFit;" />
+ <field name="CENTER" />
+ <field name="END" />
+ <field name="FILL" />
+ <field name="START" />
+ </class>
+ <class name="android/graphics/Movie" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="decodeByteArray([BII)Landroid/graphics/Movie;" />
+ <method name="decodeFile(Ljava/lang/String;)Landroid/graphics/Movie;" />
+ <method name="decodeStream(Ljava/io/InputStream;)Landroid/graphics/Movie;" />
+ <method name="draw(Landroid/graphics/Canvas;FF)V" />
+ <method name="draw(Landroid/graphics/Canvas;FFLandroid/graphics/Paint;)V" />
+ <method name="duration()I" />
+ <method name="height()I" />
+ <method name="isOpaque()Z" />
+ <method name="setTime(I)Z" />
+ <method name="width()I" />
+ </class>
+ <class name="android/graphics/NinePatch" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/graphics/Bitmap;[B)V" since="19" />
+ <method name="&lt;init>(Landroid/graphics/Bitmap;[BLjava/lang/String;)V" />
+ <method name="draw(Landroid/graphics/Canvas;Landroid/graphics/Rect;)V" />
+ <method name="draw(Landroid/graphics/Canvas;Landroid/graphics/Rect;Landroid/graphics/Paint;)V" />
+ <method name="draw(Landroid/graphics/Canvas;Landroid/graphics/RectF;)V" />
+ <method name="getBitmap()Landroid/graphics/Bitmap;" since="19" />
+ <method name="getDensity()I" since="4" />
+ <method name="getHeight()I" />
+ <method name="getName()Ljava/lang/String;" since="19" />
+ <method name="getPaint()Landroid/graphics/Paint;" since="19" />
+ <method name="getTransparentRegion(Landroid/graphics/Rect;)Landroid/graphics/Region;" />
+ <method name="getWidth()I" />
+ <method name="hasAlpha()Z" />
+ <method name="isNinePatchChunk([B)Z" />
+ <method name="setPaint(Landroid/graphics/Paint;)V" />
+ </class>
+ <class name="android/graphics/Outline" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/graphics/Outline;)V" />
+ <method name="canClip()Z" />
+ <method name="getAlpha()F" />
+ <method name="isEmpty()Z" />
+ <method name="set(Landroid/graphics/Outline;)V" />
+ <method name="setAlpha(F)V" />
+ <method name="setConvexPath(Landroid/graphics/Path;)V" />
+ <method name="setEmpty()V" />
+ <method name="setOval(IIII)V" />
+ <method name="setOval(Landroid/graphics/Rect;)V" />
+ <method name="setRect(IIII)V" />
+ <method name="setRect(Landroid/graphics/Rect;)V" />
+ <method name="setRoundRect(IIIIF)V" />
+ <method name="setRoundRect(Landroid/graphics/Rect;F)V" />
+ </class>
+ <class name="android/graphics/Paint" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Landroid/graphics/Paint;)V" />
+ <method name="ascent()F" />
+ <method name="breakText(Ljava/lang/CharSequence;IIZF[F)I" />
+ <method name="breakText(Ljava/lang/String;ZF[F)I" />
+ <method name="breakText([CIIF[F)I" />
+ <method name="clearShadowLayer()V" />
+ <method name="descent()F" />
+ <method name="getAlpha()I" />
+ <method name="getColor()I" />
+ <method name="getColorFilter()Landroid/graphics/ColorFilter;" />
+ <method name="getFillPath(Landroid/graphics/Path;Landroid/graphics/Path;)Z" />
+ <method name="getFlags()I" />
+ <method name="getFontFeatureSettings()Ljava/lang/String;" since="21" />
+ <method name="getFontMetrics()Landroid/graphics/Paint$FontMetrics;" />
+ <method name="getFontMetrics(Landroid/graphics/Paint$FontMetrics;)F" />
+ <method name="getFontMetricsInt()Landroid/graphics/Paint$FontMetricsInt;" />
+ <method name="getFontMetricsInt(Landroid/graphics/Paint$FontMetricsInt;)I" />
+ <method name="getFontSpacing()F" />
+ <method name="getHinting()I" since="14" />
+ <method name="getLetterSpacing()F" since="21" />
+ <method name="getMaskFilter()Landroid/graphics/MaskFilter;" />
+ <method name="getPathEffect()Landroid/graphics/PathEffect;" />
+ <method name="getRasterizer()Landroid/graphics/Rasterizer;" />
+ <method name="getShader()Landroid/graphics/Shader;" />
+ <method name="getStrokeCap()Landroid/graphics/Paint$Cap;" />
+ <method name="getStrokeJoin()Landroid/graphics/Paint$Join;" />
+ <method name="getStrokeMiter()F" />
+ <method name="getStrokeWidth()F" />
+ <method name="getStyle()Landroid/graphics/Paint$Style;" />
+ <method name="getTextAlign()Landroid/graphics/Paint$Align;" />
+ <method name="getTextBounds(Ljava/lang/String;IILandroid/graphics/Rect;)V" />
+ <method name="getTextBounds([CIILandroid/graphics/Rect;)V" />
+ <method name="getTextLocale()Ljava/util/Locale;" since="17" />
+ <method name="getTextPath(Ljava/lang/String;IIFFLandroid/graphics/Path;)V" />
+ <method name="getTextPath([CIIFFLandroid/graphics/Path;)V" />
+ <method name="getTextScaleX()F" />
+ <method name="getTextSize()F" />
+ <method name="getTextSkewX()F" />
+ <method name="getTextWidths(Ljava/lang/CharSequence;II[F)I" />
+ <method name="getTextWidths(Ljava/lang/String;II[F)I" />
+ <method name="getTextWidths(Ljava/lang/String;[F)I" />
+ <method name="getTextWidths([CII[F)I" />
+ <method name="getTypeface()Landroid/graphics/Typeface;" />
+ <method name="getXfermode()Landroid/graphics/Xfermode;" />
+ <method name="isAntiAlias()Z" />
+ <method name="isDither()Z" />
+ <method name="isElegantTextHeight()Z" since="21" />
+ <method name="isFakeBoldText()Z" />
+ <method name="isFilterBitmap()Z" />
+ <method name="isLinearText()Z" />
+ <method name="isStrikeThruText()Z" />
+ <method name="isSubpixelText()Z" />
+ <method name="isUnderlineText()Z" />
+ <method name="measureText(Ljava/lang/CharSequence;II)F" />
+ <method name="measureText(Ljava/lang/String;)F" />
+ <method name="measureText(Ljava/lang/String;II)F" />
+ <method name="measureText([CII)F" />
+ <method name="reset()V" />
+ <method name="set(Landroid/graphics/Paint;)V" />
+ <method name="setARGB(IIII)V" />
+ <method name="setAlpha(I)V" />
+ <method name="setAntiAlias(Z)V" />
+ <method name="setColor(I)V" />
+ <method name="setColorFilter(Landroid/graphics/ColorFilter;)Landroid/graphics/ColorFilter;" />
+ <method name="setDither(Z)V" />
+ <method name="setElegantTextHeight(Z)V" since="21" />
+ <method name="setFakeBoldText(Z)V" />
+ <method name="setFilterBitmap(Z)V" />
+ <method name="setFlags(I)V" />
+ <method name="setFontFeatureSettings(Ljava/lang/String;)V" since="21" />
+ <method name="setHinting(I)V" since="14" />
+ <method name="setLetterSpacing(F)V" since="21" />
+ <method name="setLinearText(Z)V" />
+ <method name="setMaskFilter(Landroid/graphics/MaskFilter;)Landroid/graphics/MaskFilter;" />
+ <method name="setPathEffect(Landroid/graphics/PathEffect;)Landroid/graphics/PathEffect;" />
+ <method name="setRasterizer(Landroid/graphics/Rasterizer;)Landroid/graphics/Rasterizer;" />
+ <method name="setShader(Landroid/graphics/Shader;)Landroid/graphics/Shader;" />
+ <method name="setShadowLayer(FFFI)V" />
+ <method name="setStrikeThruText(Z)V" />
+ <method name="setStrokeCap(Landroid/graphics/Paint$Cap;)V" />
+ <method name="setStrokeJoin(Landroid/graphics/Paint$Join;)V" />
+ <method name="setStrokeMiter(F)V" />
+ <method name="setStrokeWidth(F)V" />
+ <method name="setStyle(Landroid/graphics/Paint$Style;)V" />
+ <method name="setSubpixelText(Z)V" />
+ <method name="setTextAlign(Landroid/graphics/Paint$Align;)V" />
+ <method name="setTextLocale(Ljava/util/Locale;)V" since="17" />
+ <method name="setTextScaleX(F)V" />
+ <method name="setTextSize(F)V" />
+ <method name="setTextSkewX(F)V" />
+ <method name="setTypeface(Landroid/graphics/Typeface;)Landroid/graphics/Typeface;" />
+ <method name="setUnderlineText(Z)V" />
+ <method name="setXfermode(Landroid/graphics/Xfermode;)Landroid/graphics/Xfermode;" />
+ <field name="ANTI_ALIAS_FLAG" />
+ <field name="DEV_KERN_TEXT_FLAG" />
+ <field name="DITHER_FLAG" />
+ <field name="EMBEDDED_BITMAP_TEXT_FLAG" since="19" />
+ <field name="FAKE_BOLD_TEXT_FLAG" />
+ <field name="FILTER_BITMAP_FLAG" />
+ <field name="HINTING_OFF" since="14" />
+ <field name="HINTING_ON" since="14" />
+ <field name="LINEAR_TEXT_FLAG" />
+ <field name="STRIKE_THRU_TEXT_FLAG" />
+ <field name="SUBPIXEL_TEXT_FLAG" />
+ <field name="UNDERLINE_TEXT_FLAG" />
+ </class>
+ <class name="android/graphics/Paint$Align" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Paint$Align;" />
+ <method name="values()[Landroid/graphics/Paint$Align;" />
+ <field name="CENTER" />
+ <field name="LEFT" />
+ <field name="RIGHT" />
+ </class>
+ <class name="android/graphics/Paint$Cap" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Paint$Cap;" />
+ <method name="values()[Landroid/graphics/Paint$Cap;" />
+ <field name="BUTT" />
+ <field name="ROUND" />
+ <field name="SQUARE" />
+ </class>
+ <class name="android/graphics/Paint$FontMetrics" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="ascent" />
+ <field name="bottom" />
+ <field name="descent" />
+ <field name="leading" />
+ <field name="top" />
+ </class>
+ <class name="android/graphics/Paint$FontMetricsInt" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="ascent" />
+ <field name="bottom" />
+ <field name="descent" />
+ <field name="leading" />
+ <field name="top" />
+ </class>
+ <class name="android/graphics/Paint$Join" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Paint$Join;" />
+ <method name="values()[Landroid/graphics/Paint$Join;" />
+ <field name="BEVEL" />
+ <field name="MITER" />
+ <field name="ROUND" />
+ </class>
+ <class name="android/graphics/Paint$Style" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Paint$Style;" />
+ <method name="values()[Landroid/graphics/Paint$Style;" />
+ <field name="FILL" />
+ <field name="FILL_AND_STROKE" />
+ <field name="STROKE" />
+ </class>
+ <class name="android/graphics/PaintFlagsDrawFilter" since="1">
+ <extends name="android/graphics/DrawFilter" />
+ <method name="&lt;init>(II)V" />
+ </class>
+ <class name="android/graphics/Path" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/graphics/Path;)V" />
+ <method name="addArc(FFFFFF)V" since="21" />
+ <method name="addArc(Landroid/graphics/RectF;FF)V" />
+ <method name="addCircle(FFFLandroid/graphics/Path$Direction;)V" />
+ <method name="addOval(FFFFLandroid/graphics/Path$Direction;)V" since="21" />
+ <method name="addOval(Landroid/graphics/RectF;Landroid/graphics/Path$Direction;)V" />
+ <method name="addPath(Landroid/graphics/Path;)V" />
+ <method name="addPath(Landroid/graphics/Path;FF)V" />
+ <method name="addPath(Landroid/graphics/Path;Landroid/graphics/Matrix;)V" />
+ <method name="addRect(FFFFLandroid/graphics/Path$Direction;)V" />
+ <method name="addRect(Landroid/graphics/RectF;Landroid/graphics/Path$Direction;)V" />
+ <method name="addRoundRect(FFFFFFLandroid/graphics/Path$Direction;)V" since="21" />
+ <method name="addRoundRect(FFFF[FLandroid/graphics/Path$Direction;)V" since="21" />
+ <method name="addRoundRect(Landroid/graphics/RectF;FFLandroid/graphics/Path$Direction;)V" />
+ <method name="addRoundRect(Landroid/graphics/RectF;[FLandroid/graphics/Path$Direction;)V" />
+ <method name="arcTo(FFFFFFZ)V" since="21" />
+ <method name="arcTo(Landroid/graphics/RectF;FF)V" />
+ <method name="arcTo(Landroid/graphics/RectF;FFZ)V" />
+ <method name="close()V" />
+ <method name="computeBounds(Landroid/graphics/RectF;Z)V" />
+ <method name="cubicTo(FFFFFF)V" />
+ <method name="getFillType()Landroid/graphics/Path$FillType;" />
+ <method name="incReserve(I)V" />
+ <method name="isConvex()Z" since="21" />
+ <method name="isEmpty()Z" />
+ <method name="isInverseFillType()Z" />
+ <method name="isRect(Landroid/graphics/RectF;)Z" />
+ <method name="lineTo(FF)V" />
+ <method name="moveTo(FF)V" />
+ <method name="offset(FF)V" />
+ <method name="offset(FFLandroid/graphics/Path;)V" />
+ <method name="op(Landroid/graphics/Path;Landroid/graphics/Path$Op;)Z" since="19" />
+ <method name="op(Landroid/graphics/Path;Landroid/graphics/Path;Landroid/graphics/Path$Op;)Z" since="19" />
+ <method name="quadTo(FFFF)V" />
+ <method name="rCubicTo(FFFFFF)V" />
+ <method name="rLineTo(FF)V" />
+ <method name="rMoveTo(FF)V" />
+ <method name="rQuadTo(FFFF)V" />
+ <method name="reset()V" />
+ <method name="rewind()V" />
+ <method name="set(Landroid/graphics/Path;)V" />
+ <method name="setFillType(Landroid/graphics/Path$FillType;)V" />
+ <method name="setLastPoint(FF)V" />
+ <method name="toggleInverseFillType()V" />
+ <method name="transform(Landroid/graphics/Matrix;)V" />
+ <method name="transform(Landroid/graphics/Matrix;Landroid/graphics/Path;)V" />
+ </class>
+ <class name="android/graphics/Path$Direction" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Path$Direction;" />
+ <method name="values()[Landroid/graphics/Path$Direction;" />
+ <field name="CCW" />
+ <field name="CW" />
+ </class>
+ <class name="android/graphics/Path$FillType" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Path$FillType;" />
+ <method name="values()[Landroid/graphics/Path$FillType;" />
+ <field name="EVEN_ODD" />
+ <field name="INVERSE_EVEN_ODD" />
+ <field name="INVERSE_WINDING" />
+ <field name="WINDING" />
+ </class>
+ <class name="android/graphics/Path$Op" since="19">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Path$Op;" />
+ <method name="values()[Landroid/graphics/Path$Op;" />
+ <field name="DIFFERENCE" />
+ <field name="INTERSECT" />
+ <field name="REVERSE_DIFFERENCE" />
+ <field name="UNION" />
+ <field name="XOR" />
+ </class>
+ <class name="android/graphics/PathDashPathEffect" since="1">
+ <extends name="android/graphics/PathEffect" />
+ <method name="&lt;init>(Landroid/graphics/Path;FFLandroid/graphics/PathDashPathEffect$Style;)V" />
+ </class>
+ <class name="android/graphics/PathDashPathEffect$Style" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/PathDashPathEffect$Style;" />
+ <method name="values()[Landroid/graphics/PathDashPathEffect$Style;" />
+ <field name="MORPH" />
+ <field name="ROTATE" />
+ <field name="TRANSLATE" />
+ </class>
+ <class name="android/graphics/PathEffect" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/graphics/PathMeasure" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/graphics/Path;Z)V" />
+ <method name="getLength()F" />
+ <method name="getMatrix(FLandroid/graphics/Matrix;I)Z" />
+ <method name="getPosTan(F[F[F)Z" />
+ <method name="getSegment(FFLandroid/graphics/Path;Z)Z" />
+ <method name="isClosed()Z" />
+ <method name="nextContour()Z" />
+ <method name="setPath(Landroid/graphics/Path;Z)V" />
+ <field name="POSITION_MATRIX_FLAG" />
+ <field name="TANGENT_MATRIX_FLAG" />
+ </class>
+ <class name="android/graphics/Picture" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/graphics/Picture;)V" />
+ <method name="beginRecording(II)Landroid/graphics/Canvas;" />
+ <method name="createFromStream(Ljava/io/InputStream;)Landroid/graphics/Picture;" />
+ <method name="draw(Landroid/graphics/Canvas;)V" />
+ <method name="endRecording()V" />
+ <method name="getHeight()I" />
+ <method name="getWidth()I" />
+ <method name="writeToStream(Ljava/io/OutputStream;)V" />
+ </class>
+ <class name="android/graphics/PixelFormat" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="formatHasAlpha(I)Z" />
+ <method name="getPixelFormatInfo(ILandroid/graphics/PixelFormat;)V" />
+ <field name="A_8" />
+ <field name="JPEG" />
+ <field name="LA_88" />
+ <field name="L_8" />
+ <field name="OPAQUE" />
+ <field name="RGBA_4444" />
+ <field name="RGBA_5551" />
+ <field name="RGBA_8888" />
+ <field name="RGBX_8888" />
+ <field name="RGB_332" />
+ <field name="RGB_565" />
+ <field name="RGB_888" />
+ <field name="TRANSLUCENT" />
+ <field name="TRANSPARENT" />
+ <field name="UNKNOWN" />
+ <field name="YCbCr_420_SP" />
+ <field name="YCbCr_422_I" since="5" />
+ <field name="YCbCr_422_SP" />
+ <field name="bitsPerPixel" />
+ <field name="bytesPerPixel" />
+ </class>
+ <class name="android/graphics/PixelXorXfermode" since="1">
+ <extends name="android/graphics/Xfermode" />
+ <method name="&lt;init>(I)V" />
+ </class>
+ <class name="android/graphics/Point" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" since="13" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(II)V" />
+ <method name="&lt;init>(Landroid/graphics/Point;)V" />
+ <method name="equals(II)Z" />
+ <method name="negate()V" />
+ <method name="offset(II)V" />
+ <method name="readFromParcel(Landroid/os/Parcel;)V" since="13" />
+ <method name="set(II)V" />
+ <field name="CREATOR" since="13" />
+ <field name="x" />
+ <field name="y" />
+ </class>
+ <class name="android/graphics/PointF" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" since="13" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(FF)V" />
+ <method name="&lt;init>(Landroid/graphics/Point;)V" />
+ <method name="equals(FF)Z" />
+ <method name="length()F" />
+ <method name="length(FF)F" />
+ <method name="negate()V" />
+ <method name="offset(FF)V" />
+ <method name="readFromParcel(Landroid/os/Parcel;)V" since="13" />
+ <method name="set(FF)V" />
+ <method name="set(Landroid/graphics/PointF;)V" />
+ <field name="CREATOR" since="13" />
+ <field name="x" />
+ <field name="y" />
+ </class>
+ <class name="android/graphics/PorterDuff" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/graphics/PorterDuff$Mode" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/PorterDuff$Mode;" />
+ <method name="values()[Landroid/graphics/PorterDuff$Mode;" />
+ <field name="ADD" since="11" />
+ <field name="CLEAR" />
+ <field name="DARKEN" />
+ <field name="DST" />
+ <field name="DST_ATOP" />
+ <field name="DST_IN" />
+ <field name="DST_OUT" />
+ <field name="DST_OVER" />
+ <field name="LIGHTEN" />
+ <field name="MULTIPLY" />
+ <field name="OVERLAY" since="11" />
+ <field name="SCREEN" />
+ <field name="SRC" />
+ <field name="SRC_ATOP" />
+ <field name="SRC_IN" />
+ <field name="SRC_OUT" />
+ <field name="SRC_OVER" />
+ <field name="XOR" />
+ </class>
+ <class name="android/graphics/PorterDuffColorFilter" since="1">
+ <extends name="android/graphics/ColorFilter" />
+ <method name="&lt;init>(ILandroid/graphics/PorterDuff$Mode;)V" />
+ </class>
+ <class name="android/graphics/PorterDuffXfermode" since="1">
+ <extends name="android/graphics/Xfermode" />
+ <method name="&lt;init>(Landroid/graphics/PorterDuff$Mode;)V" />
+ </class>
+ <class name="android/graphics/RadialGradient" since="1">
+ <extends name="android/graphics/Shader" />
+ <method name="&lt;init>(FFFIILandroid/graphics/Shader$TileMode;)V" />
+ <method name="&lt;init>(FFF[I[FLandroid/graphics/Shader$TileMode;)V" />
+ </class>
+ <class name="android/graphics/Rasterizer" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/graphics/Rect" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(IIII)V" />
+ <method name="&lt;init>(Landroid/graphics/Rect;)V" />
+ <method name="centerX()I" />
+ <method name="centerY()I" />
+ <method name="contains(II)Z" />
+ <method name="contains(IIII)Z" />
+ <method name="contains(Landroid/graphics/Rect;)Z" />
+ <method name="exactCenterX()F" />
+ <method name="exactCenterY()F" />
+ <method name="flattenToString()Ljava/lang/String;" since="7" />
+ <method name="height()I" />
+ <method name="inset(II)V" />
+ <method name="intersect(IIII)Z" />
+ <method name="intersect(Landroid/graphics/Rect;)Z" />
+ <method name="intersects(IIII)Z" />
+ <method name="intersects(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z" />
+ <method name="isEmpty()Z" />
+ <method name="offset(II)V" />
+ <method name="offsetTo(II)V" />
+ <method name="readFromParcel(Landroid/os/Parcel;)V" />
+ <method name="set(IIII)V" />
+ <method name="set(Landroid/graphics/Rect;)V" />
+ <method name="setEmpty()V" />
+ <method name="setIntersect(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z" />
+ <method name="sort()V" />
+ <method name="toShortString()Ljava/lang/String;" since="3" />
+ <method name="unflattenFromString(Ljava/lang/String;)Landroid/graphics/Rect;" since="7" />
+ <method name="union(II)V" />
+ <method name="union(IIII)V" />
+ <method name="union(Landroid/graphics/Rect;)V" />
+ <method name="width()I" />
+ <field name="CREATOR" />
+ <field name="bottom" />
+ <field name="left" />
+ <field name="right" />
+ <field name="top" />
+ </class>
+ <class name="android/graphics/RectF" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" since="3" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(FFFF)V" />
+ <method name="&lt;init>(Landroid/graphics/Rect;)V" />
+ <method name="&lt;init>(Landroid/graphics/RectF;)V" />
+ <method name="centerX()F" />
+ <method name="centerY()F" />
+ <method name="contains(FF)Z" />
+ <method name="contains(FFFF)Z" />
+ <method name="contains(Landroid/graphics/RectF;)Z" />
+ <method name="height()F" />
+ <method name="inset(FF)V" />
+ <method name="intersect(FFFF)Z" />
+ <method name="intersect(Landroid/graphics/RectF;)Z" />
+ <method name="intersects(FFFF)Z" />
+ <method name="intersects(Landroid/graphics/RectF;Landroid/graphics/RectF;)Z" />
+ <method name="isEmpty()Z" />
+ <method name="offset(FF)V" />
+ <method name="offsetTo(FF)V" />
+ <method name="readFromParcel(Landroid/os/Parcel;)V" since="3" />
+ <method name="round(Landroid/graphics/Rect;)V" />
+ <method name="roundOut(Landroid/graphics/Rect;)V" />
+ <method name="set(FFFF)V" />
+ <method name="set(Landroid/graphics/Rect;)V" />
+ <method name="set(Landroid/graphics/RectF;)V" />
+ <method name="setEmpty()V" />
+ <method name="setIntersect(Landroid/graphics/RectF;Landroid/graphics/RectF;)Z" />
+ <method name="sort()V" />
+ <method name="toShortString()Ljava/lang/String;" since="14" />
+ <method name="union(FF)V" />
+ <method name="union(FFFF)V" />
+ <method name="union(Landroid/graphics/RectF;)V" />
+ <method name="width()F" />
+ <field name="CREATOR" since="3" />
+ <field name="bottom" />
+ <field name="left" />
+ <field name="right" />
+ <field name="top" />
+ </class>
+ <class name="android/graphics/Region" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(IIII)V" />
+ <method name="&lt;init>(Landroid/graphics/Rect;)V" />
+ <method name="&lt;init>(Landroid/graphics/Region;)V" />
+ <method name="contains(II)Z" />
+ <method name="getBoundaryPath()Landroid/graphics/Path;" />
+ <method name="getBoundaryPath(Landroid/graphics/Path;)Z" />
+ <method name="getBounds()Landroid/graphics/Rect;" />
+ <method name="getBounds(Landroid/graphics/Rect;)Z" />
+ <method name="isComplex()Z" />
+ <method name="isEmpty()Z" />
+ <method name="isRect()Z" />
+ <method name="op(IIIILandroid/graphics/Region$Op;)Z" />
+ <method name="op(Landroid/graphics/Rect;Landroid/graphics/Region$Op;)Z" />
+ <method name="op(Landroid/graphics/Rect;Landroid/graphics/Region;Landroid/graphics/Region$Op;)Z" />
+ <method name="op(Landroid/graphics/Region;Landroid/graphics/Region$Op;)Z" />
+ <method name="op(Landroid/graphics/Region;Landroid/graphics/Region;Landroid/graphics/Region$Op;)Z" />
+ <method name="quickContains(IIII)Z" />
+ <method name="quickContains(Landroid/graphics/Rect;)Z" />
+ <method name="quickReject(IIII)Z" />
+ <method name="quickReject(Landroid/graphics/Rect;)Z" />
+ <method name="quickReject(Landroid/graphics/Region;)Z" />
+ <method name="set(IIII)Z" />
+ <method name="set(Landroid/graphics/Rect;)Z" />
+ <method name="set(Landroid/graphics/Region;)Z" />
+ <method name="setEmpty()V" />
+ <method name="setPath(Landroid/graphics/Path;Landroid/graphics/Region;)Z" />
+ <method name="translate(II)V" />
+ <method name="translate(IILandroid/graphics/Region;)V" />
+ <method name="union(Landroid/graphics/Rect;)Z" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/graphics/Region$Op" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Region$Op;" />
+ <method name="values()[Landroid/graphics/Region$Op;" />
+ <field name="DIFFERENCE" />
+ <field name="INTERSECT" />
+ <field name="REPLACE" />
+ <field name="REVERSE_DIFFERENCE" />
+ <field name="UNION" />
+ <field name="XOR" />
+ </class>
+ <class name="android/graphics/RegionIterator" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/graphics/Region;)V" />
+ <method name="next(Landroid/graphics/Rect;)Z" />
+ </class>
+ <class name="android/graphics/Shader" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getLocalMatrix(Landroid/graphics/Matrix;)Z" />
+ <method name="setLocalMatrix(Landroid/graphics/Matrix;)V" />
+ </class>
+ <class name="android/graphics/Shader$TileMode" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/Shader$TileMode;" />
+ <method name="values()[Landroid/graphics/Shader$TileMode;" />
+ <field name="CLAMP" />
+ <field name="MIRROR" />
+ <field name="REPEAT" />
+ </class>
+ <class name="android/graphics/SumPathEffect" since="1">
+ <extends name="android/graphics/PathEffect" />
+ <method name="&lt;init>(Landroid/graphics/PathEffect;Landroid/graphics/PathEffect;)V" />
+ </class>
+ <class name="android/graphics/SurfaceTexture" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(IZ)V" since="19" />
+ <method name="attachToGLContext(I)V" since="16" />
+ <method name="detachFromGLContext()V" since="16" />
+ <method name="getTimestamp()J" since="14" />
+ <method name="getTransformMatrix([F)V" />
+ <method name="release()V" since="14" />
+ <method name="releaseTexImage()V" since="19" />
+ <method name="setDefaultBufferSize(II)V" since="15" />
+ <method name="setOnFrameAvailableListener(Landroid/graphics/SurfaceTexture$OnFrameAvailableListener;)V" />
+ <method name="setOnFrameAvailableListener(Landroid/graphics/SurfaceTexture$OnFrameAvailableListener;Landroid/os/Handler;)V" since="21" />
+ <method name="updateTexImage()V" />
+ </class>
+ <class name="android/graphics/SurfaceTexture$OnFrameAvailableListener" since="11">
+ <extends name="java/lang/Object" />
+ <method name="onFrameAvailable(Landroid/graphics/SurfaceTexture;)V" />
+ </class>
+ <class name="android/graphics/SurfaceTexture$OutOfResourcesException" since="11">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/graphics/SweepGradient" since="1">
+ <extends name="android/graphics/Shader" />
+ <method name="&lt;init>(FFII)V" />
+ <method name="&lt;init>(FF[I[F)V" />
+ </class>
+ <class name="android/graphics/Typeface" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="create(Landroid/graphics/Typeface;I)Landroid/graphics/Typeface;" />
+ <method name="create(Ljava/lang/String;I)Landroid/graphics/Typeface;" />
+ <method name="createFromAsset(Landroid/content/res/AssetManager;Ljava/lang/String;)Landroid/graphics/Typeface;" />
+ <method name="createFromFile(Ljava/io/File;)Landroid/graphics/Typeface;" since="4" />
+ <method name="createFromFile(Ljava/lang/String;)Landroid/graphics/Typeface;" since="4" />
+ <method name="defaultFromStyle(I)Landroid/graphics/Typeface;" />
+ <method name="getStyle()I" />
+ <method name="isBold()Z" />
+ <method name="isItalic()Z" />
+ <field name="BOLD" />
+ <field name="BOLD_ITALIC" />
+ <field name="DEFAULT" />
+ <field name="DEFAULT_BOLD" />
+ <field name="ITALIC" />
+ <field name="MONOSPACE" />
+ <field name="NORMAL" />
+ <field name="SANS_SERIF" />
+ <field name="SERIF" />
+ </class>
+ <class name="android/graphics/Xfermode" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/graphics/YuvImage" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>([BIII[I)V" />
+ <method name="compressToJpeg(Landroid/graphics/Rect;ILjava/io/OutputStream;)Z" />
+ <method name="getHeight()I" />
+ <method name="getStrides()[I" />
+ <method name="getWidth()I" />
+ <method name="getYuvData()[B" />
+ <method name="getYuvFormat()I" />
+ </class>
+ <class name="android/graphics/drawable/Animatable" since="4">
+ <extends name="java/lang/Object" />
+ <method name="isRunning()Z" />
+ <method name="start()V" />
+ <method name="stop()V" />
+ </class>
+ <class name="android/graphics/drawable/AnimatedStateListDrawable" since="21">
+ <extends name="android/graphics/drawable/StateListDrawable" />
+ <method name="&lt;init>()V" />
+ <method name="addState([ILandroid/graphics/drawable/Drawable;I)V" />
+ <method name="addTransition(IILandroid/graphics/drawable/Drawable;Z)V" />
+ </class>
+ <class name="android/graphics/drawable/AnimatedVectorDrawable" since="21">
+ <extends name="android/graphics/drawable/Drawable" />
+ <implements name="android/graphics/drawable/Animatable" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/graphics/drawable/AnimationDrawable" since="1">
+ <extends name="android/graphics/drawable/DrawableContainer" />
+ <implements name="android/graphics/drawable/Animatable" since="4" />
+ <implements name="java/lang/Runnable" />
+ <method name="&lt;init>()V" />
+ <method name="addFrame(Landroid/graphics/drawable/Drawable;I)V" />
+ <method name="getDuration(I)I" />
+ <method name="getFrame(I)Landroid/graphics/drawable/Drawable;" />
+ <method name="getNumberOfFrames()I" />
+ <method name="isOneShot()Z" />
+ <method name="isRunning()Z" />
+ <method name="setOneShot(Z)V" />
+ <method name="start()V" />
+ <method name="stop()V" />
+ </class>
+ <class name="android/graphics/drawable/BitmapDrawable" since="1">
+ <extends name="android/graphics/drawable/Drawable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/res/Resources;)V" since="4" />
+ <method name="&lt;init>(Landroid/content/res/Resources;Landroid/graphics/Bitmap;)V" since="4" />
+ <method name="&lt;init>(Landroid/content/res/Resources;Ljava/io/InputStream;)V" since="5" />
+ <method name="&lt;init>(Landroid/content/res/Resources;Ljava/lang/String;)V" since="5" />
+ <method name="&lt;init>(Landroid/graphics/Bitmap;)V" />
+ <method name="&lt;init>(Ljava/io/InputStream;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getBitmap()Landroid/graphics/Bitmap;" />
+ <method name="getGravity()I" />
+ <method name="getPaint()Landroid/graphics/Paint;" />
+ <method name="getTileModeX()Landroid/graphics/Shader$TileMode;" />
+ <method name="getTileModeY()Landroid/graphics/Shader$TileMode;" />
+ <method name="hasAntiAlias()Z" since="18" />
+ <method name="hasMipMap()Z" since="18" />
+ <method name="setAntiAlias(Z)V" />
+ <method name="setGravity(I)V" />
+ <method name="setMipMap(Z)V" since="18" />
+ <method name="setTargetDensity(I)V" since="4" />
+ <method name="setTargetDensity(Landroid/graphics/Canvas;)V" since="4" />
+ <method name="setTargetDensity(Landroid/util/DisplayMetrics;)V" since="4" />
+ <method name="setTileModeX(Landroid/graphics/Shader$TileMode;)V" />
+ <method name="setTileModeXY(Landroid/graphics/Shader$TileMode;Landroid/graphics/Shader$TileMode;)V" />
+ <method name="setTileModeY(Landroid/graphics/Shader$TileMode;)V" />
+ </class>
+ <class name="android/graphics/drawable/ClipDrawable" since="1">
+ <extends name="android/graphics/drawable/Drawable" />
+ <implements name="android/graphics/drawable/Drawable$Callback" />
+ <method name="&lt;init>(Landroid/graphics/drawable/Drawable;II)V" />
+ <field name="HORIZONTAL" />
+ <field name="VERTICAL" />
+ </class>
+ <class name="android/graphics/drawable/ColorDrawable" since="1">
+ <extends name="android/graphics/drawable/Drawable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="getAlpha()I" />
+ <method name="getColor()I" since="11" />
+ <method name="setColor(I)V" since="11" />
+ </class>
+ <class name="android/graphics/drawable/Drawable" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="applyTheme(Landroid/content/res/Resources$Theme;)V" since="21" />
+ <method name="canApplyTheme()Z" since="21" />
+ <method name="clearColorFilter()V" />
+ <method name="copyBounds()Landroid/graphics/Rect;" />
+ <method name="copyBounds(Landroid/graphics/Rect;)V" />
+ <method name="createFromPath(Ljava/lang/String;)Landroid/graphics/drawable/Drawable;" />
+ <method name="createFromResourceStream(Landroid/content/res/Resources;Landroid/util/TypedValue;Ljava/io/InputStream;Ljava/lang/String;)Landroid/graphics/drawable/Drawable;" since="4" />
+ <method name="createFromResourceStream(Landroid/content/res/Resources;Landroid/util/TypedValue;Ljava/io/InputStream;Ljava/lang/String;Landroid/graphics/BitmapFactory$Options;)Landroid/graphics/drawable/Drawable;" since="5" />
+ <method name="createFromStream(Ljava/io/InputStream;Ljava/lang/String;)Landroid/graphics/drawable/Drawable;" />
+ <method name="createFromXml(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;)Landroid/graphics/drawable/Drawable;" />
+ <method name="createFromXml(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;" since="21" />
+ <method name="createFromXmlInner(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;)Landroid/graphics/drawable/Drawable;" />
+ <method name="createFromXmlInner(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;" since="21" />
+ <method name="draw(Landroid/graphics/Canvas;)V" />
+ <method name="getAlpha()I" since="19" />
+ <method name="getBounds()Landroid/graphics/Rect;" />
+ <method name="getCallback()Landroid/graphics/drawable/Drawable$Callback;" since="11" />
+ <method name="getChangingConfigurations()I" />
+ <method name="getColorFilter()Landroid/graphics/ColorFilter;" since="21" />
+ <method name="getConstantState()Landroid/graphics/drawable/Drawable$ConstantState;" />
+ <method name="getCurrent()Landroid/graphics/drawable/Drawable;" />
+ <method name="getDirtyBounds()Landroid/graphics/Rect;" since="21" />
+ <method name="getIntrinsicHeight()I" />
+ <method name="getIntrinsicWidth()I" />
+ <method name="getLevel()I" />
+ <method name="getMinimumHeight()I" />
+ <method name="getMinimumWidth()I" />
+ <method name="getOpacity()I" />
+ <method name="getOutline(Landroid/graphics/Outline;)V" since="21" />
+ <method name="getPadding(Landroid/graphics/Rect;)Z" />
+ <method name="getState()[I" />
+ <method name="getTransparentRegion()Landroid/graphics/Region;" />
+ <method name="inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;)V" />
+ <method name="inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V" since="21" />
+ <method name="invalidateSelf()V" />
+ <method name="isAutoMirrored()Z" since="19" />
+ <method name="isStateful()Z" />
+ <method name="isVisible()Z" />
+ <method name="jumpToCurrentState()V" since="11" />
+ <method name="mutate()Landroid/graphics/drawable/Drawable;" since="3" />
+ <method name="onBoundsChange(Landroid/graphics/Rect;)V" />
+ <method name="onLevelChange(I)Z" />
+ <method name="onStateChange([I)Z" />
+ <method name="resolveOpacity(II)I" />
+ <method name="scheduleSelf(Ljava/lang/Runnable;J)V" />
+ <method name="setAlpha(I)V" />
+ <method name="setAutoMirrored(Z)V" since="19" />
+ <method name="setBounds(IIII)V" />
+ <method name="setBounds(Landroid/graphics/Rect;)V" />
+ <method name="setCallback(Landroid/graphics/drawable/Drawable$Callback;)V" />
+ <method name="setChangingConfigurations(I)V" />
+ <method name="setColorFilter(ILandroid/graphics/PorterDuff$Mode;)V" />
+ <method name="setColorFilter(Landroid/graphics/ColorFilter;)V" />
+ <method name="setDither(Z)V" />
+ <method name="setFilterBitmap(Z)V" />
+ <method name="setHotspot(FF)V" since="21" />
+ <method name="setHotspotBounds(IIII)V" since="21" />
+ <method name="setLevel(I)Z" />
+ <method name="setState([I)Z" />
+ <method name="setTint(I)V" since="21" />
+ <method name="setTintList(Landroid/content/res/ColorStateList;)V" since="21" />
+ <method name="setTintMode(Landroid/graphics/PorterDuff$Mode;)V" since="21" />
+ <method name="setVisible(ZZ)Z" />
+ <method name="unscheduleSelf(Ljava/lang/Runnable;)V" />
+ </class>
+ <class name="android/graphics/drawable/Drawable$Callback" since="1">
+ <extends name="java/lang/Object" />
+ <method name="invalidateDrawable(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="scheduleDrawable(Landroid/graphics/drawable/Drawable;Ljava/lang/Runnable;J)V" />
+ <method name="unscheduleDrawable(Landroid/graphics/drawable/Drawable;Ljava/lang/Runnable;)V" />
+ </class>
+ <class name="android/graphics/drawable/Drawable$ConstantState" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="canApplyTheme()Z" since="21" />
+ <method name="getChangingConfigurations()I" />
+ <method name="newDrawable()Landroid/graphics/drawable/Drawable;" />
+ <method name="newDrawable(Landroid/content/res/Resources;)Landroid/graphics/drawable/Drawable;" since="5" />
+ <method name="newDrawable(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;" since="21" />
+ </class>
+ <class name="android/graphics/drawable/DrawableContainer" since="1">
+ <extends name="android/graphics/drawable/Drawable" />
+ <implements name="android/graphics/drawable/Drawable$Callback" />
+ <method name="&lt;init>()V" />
+ <method name="selectDrawable(I)Z" />
+ <method name="setConstantState(Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;)V" />
+ <method name="setEnterFadeDuration(I)V" since="11" />
+ <method name="setExitFadeDuration(I)V" since="11" />
+ </class>
+ <class name="android/graphics/drawable/DrawableContainer$DrawableContainerState" since="1">
+ <extends name="android/graphics/drawable/Drawable$ConstantState" />
+ <method name="&lt;init>()V" />
+ <method name="addChild(Landroid/graphics/drawable/Drawable;)I" />
+ <method name="canConstantState()Z" />
+ <method name="computeConstantSize()V" since="11" />
+ <method name="getChild(I)Landroid/graphics/drawable/Drawable;" since="19" />
+ <method name="getChildCount()I" />
+ <method name="getChildren()[Landroid/graphics/drawable/Drawable;" />
+ <method name="getConstantHeight()I" />
+ <method name="getConstantMinimumHeight()I" />
+ <method name="getConstantMinimumWidth()I" />
+ <method name="getConstantPadding()Landroid/graphics/Rect;" />
+ <method name="getConstantWidth()I" />
+ <method name="getEnterFadeDuration()I" since="11" />
+ <method name="getExitFadeDuration()I" since="11" />
+ <method name="getOpacity()I" />
+ <method name="growArray(II)V" />
+ <method name="isConstantSize()Z" />
+ <method name="isStateful()Z" />
+ <method name="setConstantSize(Z)V" />
+ <method name="setEnterFadeDuration(I)V" since="11" />
+ <method name="setExitFadeDuration(I)V" since="11" />
+ <method name="setVariablePadding(Z)V" />
+ </class>
+ <class name="android/graphics/drawable/GradientDrawable" since="1">
+ <extends name="android/graphics/drawable/Drawable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/graphics/drawable/GradientDrawable$Orientation;[I)V" />
+ <method name="getGradientRadius()F" since="21" />
+ <method name="getOrientation()Landroid/graphics/drawable/GradientDrawable$Orientation;" since="16" />
+ <method name="setColor(I)V" />
+ <method name="setColor(Landroid/content/res/ColorStateList;)V" since="21" />
+ <method name="setColors([I)V" since="16" />
+ <method name="setCornerRadii([F)V" />
+ <method name="setCornerRadius(F)V" />
+ <method name="setGradientCenter(FF)V" />
+ <method name="setGradientRadius(F)V" />
+ <method name="setGradientType(I)V" />
+ <method name="setOrientation(Landroid/graphics/drawable/GradientDrawable$Orientation;)V" since="16" />
+ <method name="setShape(I)V" />
+ <method name="setSize(II)V" />
+ <method name="setStroke(II)V" />
+ <method name="setStroke(IIFF)V" />
+ <method name="setStroke(ILandroid/content/res/ColorStateList;)V" since="21" />
+ <method name="setStroke(ILandroid/content/res/ColorStateList;FF)V" since="21" />
+ <method name="setUseLevel(Z)V" />
+ <field name="LINE" />
+ <field name="LINEAR_GRADIENT" />
+ <field name="OVAL" />
+ <field name="RADIAL_GRADIENT" />
+ <field name="RECTANGLE" />
+ <field name="RING" />
+ <field name="SWEEP_GRADIENT" />
+ </class>
+ <class name="android/graphics/drawable/GradientDrawable$Orientation" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/graphics/drawable/GradientDrawable$Orientation;" />
+ <method name="values()[Landroid/graphics/drawable/GradientDrawable$Orientation;" />
+ <field name="BL_TR" />
+ <field name="BOTTOM_TOP" />
+ <field name="BR_TL" />
+ <field name="LEFT_RIGHT" />
+ <field name="RIGHT_LEFT" />
+ <field name="TL_BR" />
+ <field name="TOP_BOTTOM" />
+ <field name="TR_BL" />
+ </class>
+ <class name="android/graphics/drawable/InsetDrawable" since="1">
+ <extends name="android/graphics/drawable/Drawable" />
+ <implements name="android/graphics/drawable/Drawable$Callback" />
+ <method name="&lt;init>(Landroid/graphics/drawable/Drawable;I)V" />
+ <method name="&lt;init>(Landroid/graphics/drawable/Drawable;IIII)V" />
+ <method name="getDrawable()Landroid/graphics/drawable/Drawable;" since="19" />
+ </class>
+ <class name="android/graphics/drawable/LayerDrawable" since="1">
+ <extends name="android/graphics/drawable/Drawable" />
+ <implements name="android/graphics/drawable/Drawable$Callback" />
+ <method name="&lt;init>([Landroid/graphics/drawable/Drawable;)V" />
+ <method name="findDrawableByLayerId(I)Landroid/graphics/drawable/Drawable;" />
+ <method name="getDrawable(I)Landroid/graphics/drawable/Drawable;" />
+ <method name="getId(I)I" />
+ <method name="getNumberOfLayers()I" />
+ <method name="getPaddingMode()I" since="21" />
+ <method name="setDrawableByLayerId(ILandroid/graphics/drawable/Drawable;)Z" />
+ <method name="setId(II)V" />
+ <method name="setLayerInset(IIIII)V" />
+ <method name="setOpacity(I)V" since="11" />
+ <method name="setPaddingMode(I)V" since="21" />
+ <field name="PADDING_MODE_NEST" since="21" />
+ <field name="PADDING_MODE_STACK" since="21" />
+ </class>
+ <class name="android/graphics/drawable/LevelListDrawable" since="1">
+ <extends name="android/graphics/drawable/DrawableContainer" />
+ <method name="&lt;init>()V" />
+ <method name="addLevel(IILandroid/graphics/drawable/Drawable;)V" />
+ </class>
+ <class name="android/graphics/drawable/NinePatchDrawable" since="1">
+ <extends name="android/graphics/drawable/Drawable" />
+ <method name="&lt;init>(Landroid/content/res/Resources;Landroid/graphics/Bitmap;[BLandroid/graphics/Rect;Ljava/lang/String;)V" since="4" />
+ <method name="&lt;init>(Landroid/content/res/Resources;Landroid/graphics/NinePatch;)V" since="4" />
+ <method name="&lt;init>(Landroid/graphics/Bitmap;[BLandroid/graphics/Rect;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Landroid/graphics/NinePatch;)V" />
+ <method name="getPaint()Landroid/graphics/Paint;" />
+ <method name="setTargetDensity(I)V" since="4" />
+ <method name="setTargetDensity(Landroid/graphics/Canvas;)V" since="4" />
+ <method name="setTargetDensity(Landroid/util/DisplayMetrics;)V" since="4" />
+ </class>
+ <class name="android/graphics/drawable/PaintDrawable" since="1">
+ <extends name="android/graphics/drawable/ShapeDrawable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="setCornerRadii([F)V" />
+ <method name="setCornerRadius(F)V" />
+ </class>
+ <class name="android/graphics/drawable/PictureDrawable" since="1">
+ <extends name="android/graphics/drawable/Drawable" />
+ <method name="&lt;init>(Landroid/graphics/Picture;)V" />
+ <method name="getPicture()Landroid/graphics/Picture;" />
+ <method name="setPicture(Landroid/graphics/Picture;)V" />
+ </class>
+ <class name="android/graphics/drawable/RippleDrawable" since="21">
+ <extends name="android/graphics/drawable/LayerDrawable" />
+ <method name="&lt;init>(Landroid/content/res/ColorStateList;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setColor(Landroid/content/res/ColorStateList;)V" />
+ </class>
+ <class name="android/graphics/drawable/RotateDrawable" since="1">
+ <extends name="android/graphics/drawable/Drawable" />
+ <implements name="android/graphics/drawable/Drawable$Callback" />
+ <method name="&lt;init>()V" />
+ <method name="getDrawable()Landroid/graphics/drawable/Drawable;" since="3" />
+ <method name="getFromDegrees()F" since="21" />
+ <method name="getPivotX()F" since="21" />
+ <method name="getPivotY()F" since="21" />
+ <method name="getToDegrees()F" since="21" />
+ <method name="isPivotXRelative()Z" since="21" />
+ <method name="isPivotYRelative()Z" since="21" />
+ <method name="setDrawable(Landroid/graphics/drawable/Drawable;)V" since="21" />
+ <method name="setFromDegrees(F)V" since="21" />
+ <method name="setPivotX(F)V" since="21" />
+ <method name="setPivotXRelative(Z)V" since="21" />
+ <method name="setPivotY(F)V" since="21" />
+ <method name="setPivotYRelative(Z)V" since="21" />
+ <method name="setToDegrees(F)V" since="21" />
+ </class>
+ <class name="android/graphics/drawable/ScaleDrawable" since="1">
+ <extends name="android/graphics/drawable/Drawable" />
+ <implements name="android/graphics/drawable/Drawable$Callback" />
+ <method name="&lt;init>(Landroid/graphics/drawable/Drawable;IFF)V" />
+ <method name="getDrawable()Landroid/graphics/drawable/Drawable;" since="3" />
+ </class>
+ <class name="android/graphics/drawable/ShapeDrawable" since="1">
+ <extends name="android/graphics/drawable/Drawable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/graphics/drawable/shapes/Shape;)V" />
+ <method name="getPaint()Landroid/graphics/Paint;" />
+ <method name="getShaderFactory()Landroid/graphics/drawable/ShapeDrawable$ShaderFactory;" />
+ <method name="getShape()Landroid/graphics/drawable/shapes/Shape;" />
+ <method name="inflateTag(Ljava/lang/String;Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;)Z" />
+ <method name="onDraw(Landroid/graphics/drawable/shapes/Shape;Landroid/graphics/Canvas;Landroid/graphics/Paint;)V" />
+ <method name="setIntrinsicHeight(I)V" />
+ <method name="setIntrinsicWidth(I)V" />
+ <method name="setPadding(IIII)V" />
+ <method name="setPadding(Landroid/graphics/Rect;)V" />
+ <method name="setShaderFactory(Landroid/graphics/drawable/ShapeDrawable$ShaderFactory;)V" />
+ <method name="setShape(Landroid/graphics/drawable/shapes/Shape;)V" />
+ </class>
+ <class name="android/graphics/drawable/ShapeDrawable$ShaderFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="resize(II)Landroid/graphics/Shader;" />
+ </class>
+ <class name="android/graphics/drawable/StateListDrawable" since="1">
+ <extends name="android/graphics/drawable/DrawableContainer" />
+ <method name="&lt;init>()V" />
+ <method name="addState([ILandroid/graphics/drawable/Drawable;)V" />
+ </class>
+ <class name="android/graphics/drawable/TransitionDrawable" since="1">
+ <extends name="android/graphics/drawable/LayerDrawable" />
+ <implements name="android/graphics/drawable/Drawable$Callback" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>([Landroid/graphics/drawable/Drawable;)V" since="3" />
+ <method name="isCrossFadeEnabled()Z" />
+ <method name="resetTransition()V" />
+ <method name="reverseTransition(I)V" />
+ <method name="setCrossFadeEnabled(Z)V" />
+ <method name="startTransition(I)V" />
+ </class>
+ <class name="android/graphics/drawable/VectorDrawable" since="21">
+ <extends name="android/graphics/drawable/Drawable" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/graphics/drawable/shapes/ArcShape" since="1">
+ <extends name="android/graphics/drawable/shapes/RectShape" />
+ <method name="&lt;init>(FF)V" />
+ </class>
+ <class name="android/graphics/drawable/shapes/OvalShape" since="1">
+ <extends name="android/graphics/drawable/shapes/RectShape" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/graphics/drawable/shapes/PathShape" since="1">
+ <extends name="android/graphics/drawable/shapes/Shape" />
+ <method name="&lt;init>(Landroid/graphics/Path;FF)V" />
+ <method name="clone()Landroid/graphics/drawable/shapes/PathShape;" since="3" />
+ </class>
+ <class name="android/graphics/drawable/shapes/RectShape" since="1">
+ <extends name="android/graphics/drawable/shapes/Shape" />
+ <method name="&lt;init>()V" />
+ <method name="clone()Landroid/graphics/drawable/shapes/RectShape;" since="3" />
+ <method name="rect()Landroid/graphics/RectF;" />
+ </class>
+ <class name="android/graphics/drawable/shapes/RoundRectShape" since="1">
+ <extends name="android/graphics/drawable/shapes/RectShape" />
+ <method name="&lt;init>([FLandroid/graphics/RectF;[F)V" />
+ <method name="clone()Landroid/graphics/drawable/shapes/RoundRectShape;" since="3" />
+ </class>
+ <class name="android/graphics/drawable/shapes/Shape" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" since="3" />
+ <method name="&lt;init>()V" />
+ <method name="clone()Landroid/graphics/drawable/shapes/Shape;" since="3" />
+ <method name="draw(Landroid/graphics/Canvas;Landroid/graphics/Paint;)V" />
+ <method name="getHeight()F" />
+ <method name="getOutline(Landroid/graphics/Outline;)V" since="21" />
+ <method name="getWidth()F" />
+ <method name="hasAlpha()Z" />
+ <method name="onResize(FF)V" />
+ <method name="resize(FF)V" />
+ </class>
+ <class name="android/graphics/pdf/PdfDocument" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="close()V" />
+ <method name="finishPage(Landroid/graphics/pdf/PdfDocument$Page;)V" />
+ <method name="getPages()Ljava/util/List;" />
+ <method name="startPage(Landroid/graphics/pdf/PdfDocument$PageInfo;)Landroid/graphics/pdf/PdfDocument$Page;" />
+ <method name="writeTo(Ljava/io/OutputStream;)V" />
+ </class>
+ <class name="android/graphics/pdf/PdfDocument$Page" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getCanvas()Landroid/graphics/Canvas;" />
+ <method name="getInfo()Landroid/graphics/pdf/PdfDocument$PageInfo;" />
+ </class>
+ <class name="android/graphics/pdf/PdfDocument$PageInfo" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getContentRect()Landroid/graphics/Rect;" />
+ <method name="getPageHeight()I" />
+ <method name="getPageNumber()I" />
+ <method name="getPageWidth()I" />
+ </class>
+ <class name="android/graphics/pdf/PdfDocument$PageInfo$Builder" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(III)V" />
+ <method name="create()Landroid/graphics/pdf/PdfDocument$PageInfo;" />
+ <method name="setContentRect(Landroid/graphics/Rect;)Landroid/graphics/pdf/PdfDocument$PageInfo$Builder;" />
+ </class>
+ <class name="android/graphics/pdf/PdfRenderer" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/AutoCloseable" />
+ <method name="&lt;init>(Landroid/os/ParcelFileDescriptor;)V" />
+ <method name="getPageCount()I" />
+ <method name="openPage(I)Landroid/graphics/pdf/PdfRenderer$Page;" />
+ <method name="shouldScaleForPrinting()Z" />
+ </class>
+ <class name="android/graphics/pdf/PdfRenderer$Page" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/AutoCloseable" />
+ <method name="&lt;init>(Landroid/graphics/pdf/PdfRenderer;)V" />
+ <method name="getHeight()I" />
+ <method name="getIndex()I" />
+ <method name="getWidth()I" />
+ <method name="render(Landroid/graphics/Bitmap;Landroid/graphics/Rect;Landroid/graphics/Matrix;I)V" />
+ <field name="RENDER_MODE_FOR_DISPLAY" />
+ <field name="RENDER_MODE_FOR_PRINT" />
+ </class>
+ <class name="android/hardware/Camera" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addCallbackBuffer([B)V" since="8" />
+ <method name="autoFocus(Landroid/hardware/Camera$AutoFocusCallback;)V" />
+ <method name="cancelAutoFocus()V" since="5" />
+ <method name="enableShutterSound(Z)Z" since="17" />
+ <method name="getCameraInfo(ILandroid/hardware/Camera$CameraInfo;)V" since="9" />
+ <method name="getNumberOfCameras()I" since="9" />
+ <method name="getParameters()Landroid/hardware/Camera$Parameters;" />
+ <method name="lock()V" since="5" />
+ <method name="open()Landroid/hardware/Camera;" />
+ <method name="open(I)Landroid/hardware/Camera;" since="9" />
+ <method name="reconnect()V" since="8" />
+ <method name="release()V" />
+ <method name="setAutoFocusMoveCallback(Landroid/hardware/Camera$AutoFocusMoveCallback;)V" since="16" />
+ <method name="setDisplayOrientation(I)V" since="8" />
+ <method name="setErrorCallback(Landroid/hardware/Camera$ErrorCallback;)V" />
+ <method name="setFaceDetectionListener(Landroid/hardware/Camera$FaceDetectionListener;)V" since="14" />
+ <method name="setOneShotPreviewCallback(Landroid/hardware/Camera$PreviewCallback;)V" since="3" />
+ <method name="setParameters(Landroid/hardware/Camera$Parameters;)V" />
+ <method name="setPreviewCallback(Landroid/hardware/Camera$PreviewCallback;)V" />
+ <method name="setPreviewCallbackWithBuffer(Landroid/hardware/Camera$PreviewCallback;)V" since="8" />
+ <method name="setPreviewDisplay(Landroid/view/SurfaceHolder;)V" />
+ <method name="setPreviewTexture(Landroid/graphics/SurfaceTexture;)V" since="11" />
+ <method name="setZoomChangeListener(Landroid/hardware/Camera$OnZoomChangeListener;)V" since="8" />
+ <method name="startFaceDetection()V" since="14" />
+ <method name="startPreview()V" />
+ <method name="startSmoothZoom(I)V" since="8" />
+ <method name="stopFaceDetection()V" since="14" />
+ <method name="stopPreview()V" />
+ <method name="stopSmoothZoom()V" since="8" />
+ <method name="takePicture(Landroid/hardware/Camera$ShutterCallback;Landroid/hardware/Camera$PictureCallback;Landroid/hardware/Camera$PictureCallback;)V" />
+ <method name="takePicture(Landroid/hardware/Camera$ShutterCallback;Landroid/hardware/Camera$PictureCallback;Landroid/hardware/Camera$PictureCallback;Landroid/hardware/Camera$PictureCallback;)V" since="5" />
+ <method name="unlock()V" since="5" />
+ <field name="ACTION_NEW_PICTURE" since="14" />
+ <field name="ACTION_NEW_VIDEO" since="14" />
+ <field name="CAMERA_ERROR_SERVER_DIED" />
+ <field name="CAMERA_ERROR_UNKNOWN" />
+ </class>
+ <class name="android/hardware/Camera$Area" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/graphics/Rect;I)V" />
+ <field name="rect" />
+ <field name="weight" />
+ </class>
+ <class name="android/hardware/Camera$AutoFocusCallback" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onAutoFocus(ZLandroid/hardware/Camera;)V" />
+ </class>
+ <class name="android/hardware/Camera$AutoFocusMoveCallback" since="16">
+ <extends name="java/lang/Object" />
+ <method name="onAutoFocusMoving(ZLandroid/hardware/Camera;)V" />
+ </class>
+ <class name="android/hardware/Camera$CameraInfo" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="CAMERA_FACING_BACK" />
+ <field name="CAMERA_FACING_FRONT" />
+ <field name="canDisableShutterSound" since="17" />
+ <field name="facing" />
+ <field name="orientation" />
+ </class>
+ <class name="android/hardware/Camera$ErrorCallback" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onError(ILandroid/hardware/Camera;)V" />
+ </class>
+ <class name="android/hardware/Camera$Face" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="id" />
+ <field name="leftEye" />
+ <field name="mouth" />
+ <field name="rect" />
+ <field name="rightEye" />
+ <field name="score" />
+ </class>
+ <class name="android/hardware/Camera$FaceDetectionListener" since="14">
+ <extends name="java/lang/Object" />
+ <method name="onFaceDetection([Landroid/hardware/Camera$Face;Landroid/hardware/Camera;)V" />
+ </class>
+ <class name="android/hardware/Camera$OnZoomChangeListener" since="8">
+ <extends name="java/lang/Object" />
+ <method name="onZoomChange(IZLandroid/hardware/Camera;)V" />
+ </class>
+ <class name="android/hardware/Camera$Parameters" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/hardware/Camera;)V" />
+ <method name="flatten()Ljava/lang/String;" />
+ <method name="get(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getAntibanding()Ljava/lang/String;" since="5" />
+ <method name="getAutoExposureLock()Z" since="14" />
+ <method name="getAutoWhiteBalanceLock()Z" since="14" />
+ <method name="getColorEffect()Ljava/lang/String;" since="5" />
+ <method name="getExposureCompensation()I" since="8" />
+ <method name="getExposureCompensationStep()F" since="8" />
+ <method name="getFlashMode()Ljava/lang/String;" since="5" />
+ <method name="getFocalLength()F" since="8" />
+ <method name="getFocusAreas()Ljava/util/List;" since="14" />
+ <method name="getFocusDistances([F)V" since="9" />
+ <method name="getFocusMode()Ljava/lang/String;" since="5" />
+ <method name="getHorizontalViewAngle()F" since="8" />
+ <method name="getInt(Ljava/lang/String;)I" />
+ <method name="getJpegQuality()I" since="5" />
+ <method name="getJpegThumbnailQuality()I" since="5" />
+ <method name="getJpegThumbnailSize()Landroid/hardware/Camera$Size;" since="5" />
+ <method name="getMaxExposureCompensation()I" since="8" />
+ <method name="getMaxNumDetectedFaces()I" since="14" />
+ <method name="getMaxNumFocusAreas()I" since="14" />
+ <method name="getMaxNumMeteringAreas()I" since="14" />
+ <method name="getMaxZoom()I" since="8" />
+ <method name="getMeteringAreas()Ljava/util/List;" since="14" />
+ <method name="getMinExposureCompensation()I" since="8" />
+ <method name="getPictureFormat()I" />
+ <method name="getPictureSize()Landroid/hardware/Camera$Size;" />
+ <method name="getPreferredPreviewSizeForVideo()Landroid/hardware/Camera$Size;" since="11" />
+ <method name="getPreviewFormat()I" />
+ <method name="getPreviewFpsRange([I)V" since="9" />
+ <method name="getPreviewFrameRate()I" />
+ <method name="getPreviewSize()Landroid/hardware/Camera$Size;" />
+ <method name="getSceneMode()Ljava/lang/String;" since="5" />
+ <method name="getSupportedAntibanding()Ljava/util/List;" since="5" />
+ <method name="getSupportedColorEffects()Ljava/util/List;" since="5" />
+ <method name="getSupportedFlashModes()Ljava/util/List;" since="5" />
+ <method name="getSupportedFocusModes()Ljava/util/List;" since="5" />
+ <method name="getSupportedJpegThumbnailSizes()Ljava/util/List;" since="8" />
+ <method name="getSupportedPictureFormats()Ljava/util/List;" since="5" />
+ <method name="getSupportedPictureSizes()Ljava/util/List;" since="5" />
+ <method name="getSupportedPreviewFormats()Ljava/util/List;" since="5" />
+ <method name="getSupportedPreviewFpsRange()Ljava/util/List;" since="9" />
+ <method name="getSupportedPreviewFrameRates()Ljava/util/List;" since="5" />
+ <method name="getSupportedPreviewSizes()Ljava/util/List;" since="5" />
+ <method name="getSupportedSceneModes()Ljava/util/List;" since="5" />
+ <method name="getSupportedVideoSizes()Ljava/util/List;" since="11" />
+ <method name="getSupportedWhiteBalance()Ljava/util/List;" since="5" />
+ <method name="getVerticalViewAngle()F" since="8" />
+ <method name="getVideoStabilization()Z" since="15" />
+ <method name="getWhiteBalance()Ljava/lang/String;" since="5" />
+ <method name="getZoom()I" since="8" />
+ <method name="getZoomRatios()Ljava/util/List;" since="8" />
+ <method name="isAutoExposureLockSupported()Z" since="14" />
+ <method name="isAutoWhiteBalanceLockSupported()Z" since="14" />
+ <method name="isSmoothZoomSupported()Z" since="8" />
+ <method name="isVideoSnapshotSupported()Z" since="14" />
+ <method name="isVideoStabilizationSupported()Z" since="15" />
+ <method name="isZoomSupported()Z" since="8" />
+ <method name="remove(Ljava/lang/String;)V" />
+ <method name="removeGpsData()V" since="5" />
+ <method name="set(Ljava/lang/String;I)V" />
+ <method name="set(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="setAntibanding(Ljava/lang/String;)V" since="5" />
+ <method name="setAutoExposureLock(Z)V" since="14" />
+ <method name="setAutoWhiteBalanceLock(Z)V" since="14" />
+ <method name="setColorEffect(Ljava/lang/String;)V" since="5" />
+ <method name="setExposureCompensation(I)V" since="8" />
+ <method name="setFlashMode(Ljava/lang/String;)V" since="5" />
+ <method name="setFocusAreas(Ljava/util/List;)V" since="14" />
+ <method name="setFocusMode(Ljava/lang/String;)V" since="5" />
+ <method name="setGpsAltitude(D)V" since="5" />
+ <method name="setGpsLatitude(D)V" since="5" />
+ <method name="setGpsLongitude(D)V" since="5" />
+ <method name="setGpsProcessingMethod(Ljava/lang/String;)V" since="8" />
+ <method name="setGpsTimestamp(J)V" since="5" />
+ <method name="setJpegQuality(I)V" since="5" />
+ <method name="setJpegThumbnailQuality(I)V" since="5" />
+ <method name="setJpegThumbnailSize(II)V" since="5" />
+ <method name="setMeteringAreas(Ljava/util/List;)V" since="14" />
+ <method name="setPictureFormat(I)V" />
+ <method name="setPictureSize(II)V" />
+ <method name="setPreviewFormat(I)V" />
+ <method name="setPreviewFpsRange(II)V" since="9" />
+ <method name="setPreviewFrameRate(I)V" />
+ <method name="setPreviewSize(II)V" />
+ <method name="setRecordingHint(Z)V" since="14" />
+ <method name="setRotation(I)V" since="5" />
+ <method name="setSceneMode(Ljava/lang/String;)V" since="5" />
+ <method name="setVideoStabilization(Z)V" since="15" />
+ <method name="setWhiteBalance(Ljava/lang/String;)V" since="5" />
+ <method name="setZoom(I)V" since="8" />
+ <method name="unflatten(Ljava/lang/String;)V" />
+ <field name="ANTIBANDING_50HZ" since="5" />
+ <field name="ANTIBANDING_60HZ" since="5" />
+ <field name="ANTIBANDING_AUTO" since="5" />
+ <field name="ANTIBANDING_OFF" since="5" />
+ <field name="EFFECT_AQUA" since="5" />
+ <field name="EFFECT_BLACKBOARD" since="5" />
+ <field name="EFFECT_MONO" since="5" />
+ <field name="EFFECT_NEGATIVE" since="5" />
+ <field name="EFFECT_NONE" since="5" />
+ <field name="EFFECT_POSTERIZE" since="5" />
+ <field name="EFFECT_SEPIA" since="5" />
+ <field name="EFFECT_SOLARIZE" since="5" />
+ <field name="EFFECT_WHITEBOARD" since="5" />
+ <field name="FLASH_MODE_AUTO" since="5" />
+ <field name="FLASH_MODE_OFF" since="5" />
+ <field name="FLASH_MODE_ON" since="5" />
+ <field name="FLASH_MODE_RED_EYE" since="5" />
+ <field name="FLASH_MODE_TORCH" since="5" />
+ <field name="FOCUS_DISTANCE_FAR_INDEX" since="9" />
+ <field name="FOCUS_DISTANCE_NEAR_INDEX" since="9" />
+ <field name="FOCUS_DISTANCE_OPTIMAL_INDEX" since="9" />
+ <field name="FOCUS_MODE_AUTO" since="5" />
+ <field name="FOCUS_MODE_CONTINUOUS_PICTURE" since="14" />
+ <field name="FOCUS_MODE_CONTINUOUS_VIDEO" since="9" />
+ <field name="FOCUS_MODE_EDOF" since="8" />
+ <field name="FOCUS_MODE_FIXED" since="5" />
+ <field name="FOCUS_MODE_INFINITY" since="5" />
+ <field name="FOCUS_MODE_MACRO" since="5" />
+ <field name="PREVIEW_FPS_MAX_INDEX" since="9" />
+ <field name="PREVIEW_FPS_MIN_INDEX" since="9" />
+ <field name="SCENE_MODE_ACTION" since="5" />
+ <field name="SCENE_MODE_AUTO" since="5" />
+ <field name="SCENE_MODE_BARCODE" since="8" />
+ <field name="SCENE_MODE_BEACH" since="5" />
+ <field name="SCENE_MODE_CANDLELIGHT" since="5" />
+ <field name="SCENE_MODE_FIREWORKS" since="5" />
+ <field name="SCENE_MODE_HDR" since="17" />
+ <field name="SCENE_MODE_LANDSCAPE" since="5" />
+ <field name="SCENE_MODE_NIGHT" since="5" />
+ <field name="SCENE_MODE_NIGHT_PORTRAIT" since="5" />
+ <field name="SCENE_MODE_PARTY" since="5" />
+ <field name="SCENE_MODE_PORTRAIT" since="5" />
+ <field name="SCENE_MODE_SNOW" since="5" />
+ <field name="SCENE_MODE_SPORTS" since="5" />
+ <field name="SCENE_MODE_STEADYPHOTO" since="5" />
+ <field name="SCENE_MODE_SUNSET" since="5" />
+ <field name="SCENE_MODE_THEATRE" since="5" />
+ <field name="WHITE_BALANCE_AUTO" since="5" />
+ <field name="WHITE_BALANCE_CLOUDY_DAYLIGHT" since="5" />
+ <field name="WHITE_BALANCE_DAYLIGHT" since="5" />
+ <field name="WHITE_BALANCE_FLUORESCENT" since="5" />
+ <field name="WHITE_BALANCE_INCANDESCENT" since="5" />
+ <field name="WHITE_BALANCE_SHADE" since="5" />
+ <field name="WHITE_BALANCE_TWILIGHT" since="5" />
+ <field name="WHITE_BALANCE_WARM_FLUORESCENT" since="5" />
+ </class>
+ <class name="android/hardware/Camera$PictureCallback" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onPictureTaken([BLandroid/hardware/Camera;)V" />
+ </class>
+ <class name="android/hardware/Camera$PreviewCallback" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onPreviewFrame([BLandroid/hardware/Camera;)V" />
+ </class>
+ <class name="android/hardware/Camera$ShutterCallback" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onShutter()V" />
+ </class>
+ <class name="android/hardware/Camera$Size" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/hardware/Camera;II)V" />
+ <field name="height" />
+ <field name="width" />
+ </class>
+ <class name="android/hardware/ConsumerIrManager" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getCarrierFrequencies()[Landroid/hardware/ConsumerIrManager$CarrierFrequencyRange;" />
+ <method name="hasIrEmitter()Z" />
+ <method name="transmit(I[I)V" />
+ </class>
+ <class name="android/hardware/ConsumerIrManager$CarrierFrequencyRange" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/hardware/ConsumerIrManager;II)V" />
+ <method name="getMaxFrequency()I" />
+ <method name="getMinFrequency()I" />
+ </class>
+ <class name="android/hardware/GeomagneticField" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(FFFJ)V" />
+ <method name="getDeclination()F" />
+ <method name="getFieldStrength()F" />
+ <method name="getHorizontalStrength()F" />
+ <method name="getInclination()F" />
+ <method name="getX()F" />
+ <method name="getY()F" />
+ <method name="getZ()F" />
+ </class>
+ <class name="android/hardware/Sensor" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getFifoMaxEventCount()I" since="19" />
+ <method name="getFifoReservedEventCount()I" since="19" />
+ <method name="getMaxDelay()I" since="21" />
+ <method name="getMaximumRange()F" />
+ <method name="getMinDelay()I" since="9" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getPower()F" />
+ <method name="getReportingMode()I" since="21" />
+ <method name="getResolution()F" />
+ <method name="getStringType()Ljava/lang/String;" since="20" />
+ <method name="getType()I" />
+ <method name="getVendor()Ljava/lang/String;" />
+ <method name="getVersion()I" />
+ <method name="isWakeUpSensor()Z" since="21" />
+ <field name="REPORTING_MODE_CONTINUOUS" since="21" />
+ <field name="REPORTING_MODE_ONE_SHOT" since="21" />
+ <field name="REPORTING_MODE_ON_CHANGE" since="21" />
+ <field name="REPORTING_MODE_SPECIAL_TRIGGER" since="21" />
+ <field name="STRING_TYPE_ACCELEROMETER" since="20" />
+ <field name="STRING_TYPE_AMBIENT_TEMPERATURE" since="20" />
+ <field name="STRING_TYPE_GAME_ROTATION_VECTOR" since="20" />
+ <field name="STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR" since="20" />
+ <field name="STRING_TYPE_GRAVITY" since="20" />
+ <field name="STRING_TYPE_GYROSCOPE" since="20" />
+ <field name="STRING_TYPE_GYROSCOPE_UNCALIBRATED" since="20" />
+ <field name="STRING_TYPE_HEART_RATE" since="20" />
+ <field name="STRING_TYPE_LIGHT" since="20" />
+ <field name="STRING_TYPE_LINEAR_ACCELERATION" since="20" />
+ <field name="STRING_TYPE_MAGNETIC_FIELD" since="20" />
+ <field name="STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED" since="20" />
+ <field name="STRING_TYPE_ORIENTATION" since="20" />
+ <field name="STRING_TYPE_PRESSURE" since="20" />
+ <field name="STRING_TYPE_PROXIMITY" since="20" />
+ <field name="STRING_TYPE_RELATIVE_HUMIDITY" since="20" />
+ <field name="STRING_TYPE_ROTATION_VECTOR" since="20" />
+ <field name="STRING_TYPE_SIGNIFICANT_MOTION" since="20" />
+ <field name="STRING_TYPE_STEP_COUNTER" since="20" />
+ <field name="STRING_TYPE_STEP_DETECTOR" since="20" />
+ <field name="STRING_TYPE_TEMPERATURE" since="20" />
+ <field name="TYPE_ACCELEROMETER" />
+ <field name="TYPE_ALL" />
+ <field name="TYPE_AMBIENT_TEMPERATURE" since="14" />
+ <field name="TYPE_GAME_ROTATION_VECTOR" since="18" />
+ <field name="TYPE_GEOMAGNETIC_ROTATION_VECTOR" since="19" />
+ <field name="TYPE_GRAVITY" since="9" />
+ <field name="TYPE_GYROSCOPE" />
+ <field name="TYPE_GYROSCOPE_UNCALIBRATED" since="18" />
+ <field name="TYPE_HEART_RATE" since="20" />
+ <field name="TYPE_LIGHT" />
+ <field name="TYPE_LINEAR_ACCELERATION" since="9" />
+ <field name="TYPE_MAGNETIC_FIELD" />
+ <field name="TYPE_MAGNETIC_FIELD_UNCALIBRATED" since="18" />
+ <field name="TYPE_ORIENTATION" />
+ <field name="TYPE_PRESSURE" />
+ <field name="TYPE_PROXIMITY" />
+ <field name="TYPE_RELATIVE_HUMIDITY" since="14" />
+ <field name="TYPE_ROTATION_VECTOR" since="9" />
+ <field name="TYPE_SIGNIFICANT_MOTION" since="18" />
+ <field name="TYPE_STEP_COUNTER" since="19" />
+ <field name="TYPE_STEP_DETECTOR" since="19" />
+ <field name="TYPE_TEMPERATURE" />
+ </class>
+ <class name="android/hardware/SensorEvent" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="accuracy" />
+ <field name="sensor" />
+ <field name="timestamp" />
+ <field name="values" />
+ </class>
+ <class name="android/hardware/SensorEventListener" since="3">
+ <extends name="java/lang/Object" />
+ <method name="onAccuracyChanged(Landroid/hardware/Sensor;I)V" />
+ <method name="onSensorChanged(Landroid/hardware/SensorEvent;)V" />
+ </class>
+ <class name="android/hardware/SensorEventListener2" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/hardware/SensorEventListener" />
+ <method name="onFlushCompleted(Landroid/hardware/Sensor;)V" />
+ </class>
+ <class name="android/hardware/SensorListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onAccuracyChanged(II)V" />
+ <method name="onSensorChanged(I[F)V" />
+ </class>
+ <class name="android/hardware/SensorManager" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="cancelTriggerSensor(Landroid/hardware/TriggerEventListener;Landroid/hardware/Sensor;)Z" since="18" />
+ <method name="flush(Landroid/hardware/SensorEventListener;)Z" since="19" />
+ <method name="getAltitude(FF)F" since="9" />
+ <method name="getAngleChange([F[F[F)V" since="9" />
+ <method name="getDefaultSensor(I)Landroid/hardware/Sensor;" since="3" />
+ <method name="getDefaultSensor(IZ)Landroid/hardware/Sensor;" since="21" />
+ <method name="getInclination([F)F" since="3" />
+ <method name="getOrientation([F[F)[F" since="3" />
+ <method name="getQuaternionFromVector([F[F)V" since="9" />
+ <method name="getRotationMatrix([F[F[F[F)Z" since="3" />
+ <method name="getRotationMatrixFromVector([F[F)V" since="9" />
+ <method name="getSensorList(I)Ljava/util/List;" since="3" />
+ <method name="getSensors()I" />
+ <method name="registerListener(Landroid/hardware/SensorEventListener;Landroid/hardware/Sensor;I)Z" since="3" />
+ <method name="registerListener(Landroid/hardware/SensorEventListener;Landroid/hardware/Sensor;II)Z" since="19" />
+ <method name="registerListener(Landroid/hardware/SensorEventListener;Landroid/hardware/Sensor;IILandroid/os/Handler;)Z" since="19" />
+ <method name="registerListener(Landroid/hardware/SensorEventListener;Landroid/hardware/Sensor;ILandroid/os/Handler;)Z" since="3" />
+ <method name="registerListener(Landroid/hardware/SensorListener;I)Z" />
+ <method name="registerListener(Landroid/hardware/SensorListener;II)Z" />
+ <method name="remapCoordinateSystem([FII[F)Z" since="3" />
+ <method name="requestTriggerSensor(Landroid/hardware/TriggerEventListener;Landroid/hardware/Sensor;)Z" since="18" />
+ <method name="unregisterListener(Landroid/hardware/SensorEventListener;)V" since="3" />
+ <method name="unregisterListener(Landroid/hardware/SensorEventListener;Landroid/hardware/Sensor;)V" since="3" />
+ <method name="unregisterListener(Landroid/hardware/SensorListener;)V" />
+ <method name="unregisterListener(Landroid/hardware/SensorListener;I)V" />
+ <field name="AXIS_MINUS_X" since="3" />
+ <field name="AXIS_MINUS_Y" since="3" />
+ <field name="AXIS_MINUS_Z" since="3" />
+ <field name="AXIS_X" since="3" />
+ <field name="AXIS_Y" since="3" />
+ <field name="AXIS_Z" since="3" />
+ <field name="DATA_X" />
+ <field name="DATA_Y" />
+ <field name="DATA_Z" />
+ <field name="GRAVITY_DEATH_STAR_I" />
+ <field name="GRAVITY_EARTH" />
+ <field name="GRAVITY_JUPITER" />
+ <field name="GRAVITY_MARS" />
+ <field name="GRAVITY_MERCURY" />
+ <field name="GRAVITY_MOON" />
+ <field name="GRAVITY_NEPTUNE" />
+ <field name="GRAVITY_PLUTO" />
+ <field name="GRAVITY_SATURN" />
+ <field name="GRAVITY_SUN" />
+ <field name="GRAVITY_THE_ISLAND" />
+ <field name="GRAVITY_URANUS" />
+ <field name="GRAVITY_VENUS" />
+ <field name="LIGHT_CLOUDY" />
+ <field name="LIGHT_FULLMOON" />
+ <field name="LIGHT_NO_MOON" />
+ <field name="LIGHT_OVERCAST" />
+ <field name="LIGHT_SHADE" />
+ <field name="LIGHT_SUNLIGHT" />
+ <field name="LIGHT_SUNLIGHT_MAX" />
+ <field name="LIGHT_SUNRISE" />
+ <field name="MAGNETIC_FIELD_EARTH_MAX" />
+ <field name="MAGNETIC_FIELD_EARTH_MIN" />
+ <field name="PRESSURE_STANDARD_ATMOSPHERE" since="9" />
+ <field name="RAW_DATA_INDEX" />
+ <field name="RAW_DATA_X" />
+ <field name="RAW_DATA_Y" />
+ <field name="RAW_DATA_Z" />
+ <field name="SENSOR_ACCELEROMETER" />
+ <field name="SENSOR_ALL" />
+ <field name="SENSOR_DELAY_FASTEST" />
+ <field name="SENSOR_DELAY_GAME" />
+ <field name="SENSOR_DELAY_NORMAL" />
+ <field name="SENSOR_DELAY_UI" />
+ <field name="SENSOR_LIGHT" />
+ <field name="SENSOR_MAGNETIC_FIELD" />
+ <field name="SENSOR_MAX" />
+ <field name="SENSOR_MIN" />
+ <field name="SENSOR_ORIENTATION" />
+ <field name="SENSOR_ORIENTATION_RAW" />
+ <field name="SENSOR_PROXIMITY" />
+ <field name="SENSOR_STATUS_ACCURACY_HIGH" />
+ <field name="SENSOR_STATUS_ACCURACY_LOW" />
+ <field name="SENSOR_STATUS_ACCURACY_MEDIUM" />
+ <field name="SENSOR_STATUS_NO_CONTACT" since="20" />
+ <field name="SENSOR_STATUS_UNRELIABLE" />
+ <field name="SENSOR_TEMPERATURE" />
+ <field name="SENSOR_TRICORDER" />
+ <field name="STANDARD_GRAVITY" />
+ </class>
+ <class name="android/hardware/TriggerEvent" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="sensor" />
+ <field name="timestamp" />
+ <field name="values" />
+ </class>
+ <class name="android/hardware/TriggerEventListener" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onTrigger(Landroid/hardware/TriggerEvent;)V" />
+ </class>
+ <class name="android/hardware/camera2/CameraAccessException" since="21">
+ <extends name="android/util/AndroidException" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(ILjava/lang/String;)V" />
+ <method name="&lt;init>(ILjava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(ILjava/lang/Throwable;)V" />
+ <method name="getReason()I" />
+ <field name="CAMERA_DISABLED" />
+ <field name="CAMERA_DISCONNECTED" />
+ <field name="CAMERA_ERROR" />
+ </class>
+ <class name="android/hardware/camera2/CameraCaptureSession" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/AutoCloseable" />
+ <method name="&lt;init>()V" />
+ <method name="abortCaptures()V" />
+ <method name="capture(Landroid/hardware/camera2/CaptureRequest;Landroid/hardware/camera2/CameraCaptureSession$CaptureCallback;Landroid/os/Handler;)I" />
+ <method name="captureBurst(Ljava/util/List;Landroid/hardware/camera2/CameraCaptureSession$CaptureCallback;Landroid/os/Handler;)I" />
+ <method name="getDevice()Landroid/hardware/camera2/CameraDevice;" />
+ <method name="setRepeatingBurst(Ljava/util/List;Landroid/hardware/camera2/CameraCaptureSession$CaptureCallback;Landroid/os/Handler;)I" />
+ <method name="setRepeatingRequest(Landroid/hardware/camera2/CaptureRequest;Landroid/hardware/camera2/CameraCaptureSession$CaptureCallback;Landroid/os/Handler;)I" />
+ <method name="stopRepeating()V" />
+ </class>
+ <class name="android/hardware/camera2/CameraCaptureSession$CaptureCallback" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onCaptureCompleted(Landroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;Landroid/hardware/camera2/TotalCaptureResult;)V" />
+ <method name="onCaptureFailed(Landroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;Landroid/hardware/camera2/CaptureFailure;)V" />
+ <method name="onCaptureProgressed(Landroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;Landroid/hardware/camera2/CaptureResult;)V" />
+ <method name="onCaptureSequenceAborted(Landroid/hardware/camera2/CameraCaptureSession;I)V" />
+ <method name="onCaptureSequenceCompleted(Landroid/hardware/camera2/CameraCaptureSession;IJ)V" />
+ <method name="onCaptureStarted(Landroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;JJ)V" />
+ </class>
+ <class name="android/hardware/camera2/CameraCaptureSession$StateCallback" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onActive(Landroid/hardware/camera2/CameraCaptureSession;)V" />
+ <method name="onClosed(Landroid/hardware/camera2/CameraCaptureSession;)V" />
+ <method name="onConfigureFailed(Landroid/hardware/camera2/CameraCaptureSession;)V" />
+ <method name="onConfigured(Landroid/hardware/camera2/CameraCaptureSession;)V" />
+ <method name="onReady(Landroid/hardware/camera2/CameraCaptureSession;)V" />
+ </class>
+ <class name="android/hardware/camera2/CameraCharacteristics" since="21">
+ <extends name="android/hardware/camera2/CameraMetadata" />
+ <method name="&lt;init>()V" />
+ <method name="get(Landroid/hardware/camera2/CameraCharacteristics$Key;)Ljava/lang/Object;" />
+ <method name="getAvailableCaptureRequestKeys()Ljava/util/List;" />
+ <method name="getAvailableCaptureResultKeys()Ljava/util/List;" />
+ <field name="COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES" />
+ <field name="CONTROL_AE_AVAILABLE_ANTIBANDING_MODES" />
+ <field name="CONTROL_AE_AVAILABLE_MODES" />
+ <field name="CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES" />
+ <field name="CONTROL_AE_COMPENSATION_RANGE" />
+ <field name="CONTROL_AE_COMPENSATION_STEP" />
+ <field name="CONTROL_AF_AVAILABLE_MODES" />
+ <field name="CONTROL_AVAILABLE_EFFECTS" />
+ <field name="CONTROL_AVAILABLE_SCENE_MODES" />
+ <field name="CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES" />
+ <field name="CONTROL_AWB_AVAILABLE_MODES" />
+ <field name="CONTROL_MAX_REGIONS_AE" />
+ <field name="CONTROL_MAX_REGIONS_AF" />
+ <field name="CONTROL_MAX_REGIONS_AWB" />
+ <field name="EDGE_AVAILABLE_EDGE_MODES" />
+ <field name="FLASH_INFO_AVAILABLE" />
+ <field name="HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES" />
+ <field name="INFO_SUPPORTED_HARDWARE_LEVEL" />
+ <field name="JPEG_AVAILABLE_THUMBNAIL_SIZES" />
+ <field name="LENS_FACING" />
+ <field name="LENS_INFO_AVAILABLE_APERTURES" />
+ <field name="LENS_INFO_AVAILABLE_FILTER_DENSITIES" />
+ <field name="LENS_INFO_AVAILABLE_FOCAL_LENGTHS" />
+ <field name="LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION" />
+ <field name="LENS_INFO_FOCUS_DISTANCE_CALIBRATION" />
+ <field name="LENS_INFO_HYPERFOCAL_DISTANCE" />
+ <field name="LENS_INFO_MINIMUM_FOCUS_DISTANCE" />
+ <field name="NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES" />
+ <field name="REQUEST_AVAILABLE_CAPABILITIES" />
+ <field name="REQUEST_MAX_NUM_OUTPUT_PROC" />
+ <field name="REQUEST_MAX_NUM_OUTPUT_PROC_STALLING" />
+ <field name="REQUEST_MAX_NUM_OUTPUT_RAW" />
+ <field name="REQUEST_PARTIAL_RESULT_COUNT" />
+ <field name="REQUEST_PIPELINE_MAX_DEPTH" />
+ <field name="SCALER_AVAILABLE_MAX_DIGITAL_ZOOM" />
+ <field name="SCALER_CROPPING_TYPE" />
+ <field name="SCALER_STREAM_CONFIGURATION_MAP" />
+ <field name="SENSOR_AVAILABLE_TEST_PATTERN_MODES" />
+ <field name="SENSOR_BLACK_LEVEL_PATTERN" />
+ <field name="SENSOR_CALIBRATION_TRANSFORM1" />
+ <field name="SENSOR_CALIBRATION_TRANSFORM2" />
+ <field name="SENSOR_COLOR_TRANSFORM1" />
+ <field name="SENSOR_COLOR_TRANSFORM2" />
+ <field name="SENSOR_FORWARD_MATRIX1" />
+ <field name="SENSOR_FORWARD_MATRIX2" />
+ <field name="SENSOR_INFO_ACTIVE_ARRAY_SIZE" />
+ <field name="SENSOR_INFO_COLOR_FILTER_ARRANGEMENT" />
+ <field name="SENSOR_INFO_EXPOSURE_TIME_RANGE" />
+ <field name="SENSOR_INFO_MAX_FRAME_DURATION" />
+ <field name="SENSOR_INFO_PHYSICAL_SIZE" />
+ <field name="SENSOR_INFO_PIXEL_ARRAY_SIZE" />
+ <field name="SENSOR_INFO_SENSITIVITY_RANGE" />
+ <field name="SENSOR_INFO_TIMESTAMP_SOURCE" />
+ <field name="SENSOR_INFO_WHITE_LEVEL" />
+ <field name="SENSOR_MAX_ANALOG_SENSITIVITY" />
+ <field name="SENSOR_ORIENTATION" />
+ <field name="SENSOR_REFERENCE_ILLUMINANT1" />
+ <field name="SENSOR_REFERENCE_ILLUMINANT2" />
+ <field name="STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES" />
+ <field name="STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES" />
+ <field name="STATISTICS_INFO_MAX_FACE_COUNT" />
+ <field name="SYNC_MAX_LATENCY" />
+ <field name="TONEMAP_AVAILABLE_TONE_MAP_MODES" />
+ <field name="TONEMAP_MAX_CURVE_POINTS" />
+ </class>
+ <class name="android/hardware/camera2/CameraCharacteristics$Key" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getName()Ljava/lang/String;" />
+ </class>
+ <class name="android/hardware/camera2/CameraDevice" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/AutoCloseable" />
+ <method name="&lt;init>()V" />
+ <method name="createCaptureRequest(I)Landroid/hardware/camera2/CaptureRequest$Builder;" />
+ <method name="createCaptureSession(Ljava/util/List;Landroid/hardware/camera2/CameraCaptureSession$StateCallback;Landroid/os/Handler;)V" />
+ <method name="getId()Ljava/lang/String;" />
+ <field name="TEMPLATE_MANUAL" />
+ <field name="TEMPLATE_PREVIEW" />
+ <field name="TEMPLATE_RECORD" />
+ <field name="TEMPLATE_STILL_CAPTURE" />
+ <field name="TEMPLATE_VIDEO_SNAPSHOT" />
+ <field name="TEMPLATE_ZERO_SHUTTER_LAG" />
+ </class>
+ <class name="android/hardware/camera2/CameraDevice$StateCallback" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onClosed(Landroid/hardware/camera2/CameraDevice;)V" />
+ <method name="onDisconnected(Landroid/hardware/camera2/CameraDevice;)V" />
+ <method name="onError(Landroid/hardware/camera2/CameraDevice;I)V" />
+ <method name="onOpened(Landroid/hardware/camera2/CameraDevice;)V" />
+ <field name="ERROR_CAMERA_DEVICE" />
+ <field name="ERROR_CAMERA_DISABLED" />
+ <field name="ERROR_CAMERA_IN_USE" />
+ <field name="ERROR_CAMERA_SERVICE" />
+ <field name="ERROR_MAX_CAMERAS_IN_USE" />
+ </class>
+ <class name="android/hardware/camera2/CameraManager" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getCameraCharacteristics(Ljava/lang/String;)Landroid/hardware/camera2/CameraCharacteristics;" />
+ <method name="getCameraIdList()[Ljava/lang/String;" />
+ <method name="openCamera(Ljava/lang/String;Landroid/hardware/camera2/CameraDevice$StateCallback;Landroid/os/Handler;)V" />
+ <method name="registerAvailabilityCallback(Landroid/hardware/camera2/CameraManager$AvailabilityCallback;Landroid/os/Handler;)V" />
+ <method name="unregisterAvailabilityCallback(Landroid/hardware/camera2/CameraManager$AvailabilityCallback;)V" />
+ </class>
+ <class name="android/hardware/camera2/CameraManager$AvailabilityCallback" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onCameraAvailable(Ljava/lang/String;)V" />
+ <method name="onCameraUnavailable(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/hardware/camera2/CameraMetadata" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getKeys()Ljava/util/List;" />
+ <field name="COLOR_CORRECTION_ABERRATION_MODE_FAST" />
+ <field name="COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY" />
+ <field name="COLOR_CORRECTION_ABERRATION_MODE_OFF" />
+ <field name="COLOR_CORRECTION_MODE_FAST" />
+ <field name="COLOR_CORRECTION_MODE_HIGH_QUALITY" />
+ <field name="COLOR_CORRECTION_MODE_TRANSFORM_MATRIX" />
+ <field name="CONTROL_AE_ANTIBANDING_MODE_50HZ" />
+ <field name="CONTROL_AE_ANTIBANDING_MODE_60HZ" />
+ <field name="CONTROL_AE_ANTIBANDING_MODE_AUTO" />
+ <field name="CONTROL_AE_ANTIBANDING_MODE_OFF" />
+ <field name="CONTROL_AE_MODE_OFF" />
+ <field name="CONTROL_AE_MODE_ON" />
+ <field name="CONTROL_AE_MODE_ON_ALWAYS_FLASH" />
+ <field name="CONTROL_AE_MODE_ON_AUTO_FLASH" />
+ <field name="CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE" />
+ <field name="CONTROL_AE_PRECAPTURE_TRIGGER_IDLE" />
+ <field name="CONTROL_AE_PRECAPTURE_TRIGGER_START" />
+ <field name="CONTROL_AE_STATE_CONVERGED" />
+ <field name="CONTROL_AE_STATE_FLASH_REQUIRED" />
+ <field name="CONTROL_AE_STATE_INACTIVE" />
+ <field name="CONTROL_AE_STATE_LOCKED" />
+ <field name="CONTROL_AE_STATE_PRECAPTURE" />
+ <field name="CONTROL_AE_STATE_SEARCHING" />
+ <field name="CONTROL_AF_MODE_AUTO" />
+ <field name="CONTROL_AF_MODE_CONTINUOUS_PICTURE" />
+ <field name="CONTROL_AF_MODE_CONTINUOUS_VIDEO" />
+ <field name="CONTROL_AF_MODE_EDOF" />
+ <field name="CONTROL_AF_MODE_MACRO" />
+ <field name="CONTROL_AF_MODE_OFF" />
+ <field name="CONTROL_AF_STATE_ACTIVE_SCAN" />
+ <field name="CONTROL_AF_STATE_FOCUSED_LOCKED" />
+ <field name="CONTROL_AF_STATE_INACTIVE" />
+ <field name="CONTROL_AF_STATE_NOT_FOCUSED_LOCKED" />
+ <field name="CONTROL_AF_STATE_PASSIVE_FOCUSED" />
+ <field name="CONTROL_AF_STATE_PASSIVE_SCAN" />
+ <field name="CONTROL_AF_STATE_PASSIVE_UNFOCUSED" />
+ <field name="CONTROL_AF_TRIGGER_CANCEL" />
+ <field name="CONTROL_AF_TRIGGER_IDLE" />
+ <field name="CONTROL_AF_TRIGGER_START" />
+ <field name="CONTROL_AWB_MODE_AUTO" />
+ <field name="CONTROL_AWB_MODE_CLOUDY_DAYLIGHT" />
+ <field name="CONTROL_AWB_MODE_DAYLIGHT" />
+ <field name="CONTROL_AWB_MODE_FLUORESCENT" />
+ <field name="CONTROL_AWB_MODE_INCANDESCENT" />
+ <field name="CONTROL_AWB_MODE_OFF" />
+ <field name="CONTROL_AWB_MODE_SHADE" />
+ <field name="CONTROL_AWB_MODE_TWILIGHT" />
+ <field name="CONTROL_AWB_MODE_WARM_FLUORESCENT" />
+ <field name="CONTROL_AWB_STATE_CONVERGED" />
+ <field name="CONTROL_AWB_STATE_INACTIVE" />
+ <field name="CONTROL_AWB_STATE_LOCKED" />
+ <field name="CONTROL_AWB_STATE_SEARCHING" />
+ <field name="CONTROL_CAPTURE_INTENT_CUSTOM" />
+ <field name="CONTROL_CAPTURE_INTENT_MANUAL" />
+ <field name="CONTROL_CAPTURE_INTENT_PREVIEW" />
+ <field name="CONTROL_CAPTURE_INTENT_STILL_CAPTURE" />
+ <field name="CONTROL_CAPTURE_INTENT_VIDEO_RECORD" />
+ <field name="CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT" />
+ <field name="CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG" />
+ <field name="CONTROL_EFFECT_MODE_AQUA" />
+ <field name="CONTROL_EFFECT_MODE_BLACKBOARD" />
+ <field name="CONTROL_EFFECT_MODE_MONO" />
+ <field name="CONTROL_EFFECT_MODE_NEGATIVE" />
+ <field name="CONTROL_EFFECT_MODE_OFF" />
+ <field name="CONTROL_EFFECT_MODE_POSTERIZE" />
+ <field name="CONTROL_EFFECT_MODE_SEPIA" />
+ <field name="CONTROL_EFFECT_MODE_SOLARIZE" />
+ <field name="CONTROL_EFFECT_MODE_WHITEBOARD" />
+ <field name="CONTROL_MODE_AUTO" />
+ <field name="CONTROL_MODE_OFF" />
+ <field name="CONTROL_MODE_OFF_KEEP_STATE" />
+ <field name="CONTROL_MODE_USE_SCENE_MODE" />
+ <field name="CONTROL_SCENE_MODE_ACTION" />
+ <field name="CONTROL_SCENE_MODE_BARCODE" />
+ <field name="CONTROL_SCENE_MODE_BEACH" />
+ <field name="CONTROL_SCENE_MODE_CANDLELIGHT" />
+ <field name="CONTROL_SCENE_MODE_DISABLED" />
+ <field name="CONTROL_SCENE_MODE_FACE_PRIORITY" />
+ <field name="CONTROL_SCENE_MODE_FIREWORKS" />
+ <field name="CONTROL_SCENE_MODE_HIGH_SPEED_VIDEO" />
+ <field name="CONTROL_SCENE_MODE_LANDSCAPE" />
+ <field name="CONTROL_SCENE_MODE_NIGHT" />
+ <field name="CONTROL_SCENE_MODE_NIGHT_PORTRAIT" />
+ <field name="CONTROL_SCENE_MODE_PARTY" />
+ <field name="CONTROL_SCENE_MODE_PORTRAIT" />
+ <field name="CONTROL_SCENE_MODE_SNOW" />
+ <field name="CONTROL_SCENE_MODE_SPORTS" />
+ <field name="CONTROL_SCENE_MODE_STEADYPHOTO" />
+ <field name="CONTROL_SCENE_MODE_SUNSET" />
+ <field name="CONTROL_SCENE_MODE_THEATRE" />
+ <field name="CONTROL_VIDEO_STABILIZATION_MODE_OFF" />
+ <field name="CONTROL_VIDEO_STABILIZATION_MODE_ON" />
+ <field name="EDGE_MODE_FAST" />
+ <field name="EDGE_MODE_HIGH_QUALITY" />
+ <field name="EDGE_MODE_OFF" />
+ <field name="FLASH_MODE_OFF" />
+ <field name="FLASH_MODE_SINGLE" />
+ <field name="FLASH_MODE_TORCH" />
+ <field name="FLASH_STATE_CHARGING" />
+ <field name="FLASH_STATE_FIRED" />
+ <field name="FLASH_STATE_PARTIAL" />
+ <field name="FLASH_STATE_READY" />
+ <field name="FLASH_STATE_UNAVAILABLE" />
+ <field name="HOT_PIXEL_MODE_FAST" />
+ <field name="HOT_PIXEL_MODE_HIGH_QUALITY" />
+ <field name="HOT_PIXEL_MODE_OFF" />
+ <field name="INFO_SUPPORTED_HARDWARE_LEVEL_FULL" />
+ <field name="INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY" />
+ <field name="INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED" />
+ <field name="LENS_FACING_BACK" />
+ <field name="LENS_FACING_FRONT" />
+ <field name="LENS_INFO_FOCUS_DISTANCE_CALIBRATION_APPROXIMATE" />
+ <field name="LENS_INFO_FOCUS_DISTANCE_CALIBRATION_CALIBRATED" />
+ <field name="LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED" />
+ <field name="LENS_OPTICAL_STABILIZATION_MODE_OFF" />
+ <field name="LENS_OPTICAL_STABILIZATION_MODE_ON" />
+ <field name="LENS_STATE_MOVING" />
+ <field name="LENS_STATE_STATIONARY" />
+ <field name="NOISE_REDUCTION_MODE_FAST" />
+ <field name="NOISE_REDUCTION_MODE_HIGH_QUALITY" />
+ <field name="NOISE_REDUCTION_MODE_OFF" />
+ <field name="REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE" />
+ <field name="REQUEST_AVAILABLE_CAPABILITIES_MANUAL_POST_PROCESSING" />
+ <field name="REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR" />
+ <field name="REQUEST_AVAILABLE_CAPABILITIES_RAW" />
+ <field name="SCALER_CROPPING_TYPE_CENTER_ONLY" />
+ <field name="SCALER_CROPPING_TYPE_FREEFORM" />
+ <field name="SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_BGGR" />
+ <field name="SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GBRG" />
+ <field name="SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_GRBG" />
+ <field name="SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGB" />
+ <field name="SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_RGGB" />
+ <field name="SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME" />
+ <field name="SENSOR_INFO_TIMESTAMP_SOURCE_UNKNOWN" />
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_CLOUDY_WEATHER" />
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_COOL_WHITE_FLUORESCENT" />
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_D50" />
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_D55" />
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_D65" />
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_D75" />
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT" />
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_DAYLIGHT_FLUORESCENT" />
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_DAY_WHITE_FLUORESCENT" />
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_FINE_WEATHER" />
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_FLASH" />
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_FLUORESCENT" />
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_ISO_STUDIO_TUNGSTEN" />
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_SHADE" />
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_STANDARD_A" />
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_STANDARD_B" />
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_STANDARD_C" />
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_TUNGSTEN" />
+ <field name="SENSOR_REFERENCE_ILLUMINANT1_WHITE_FLUORESCENT" />
+ <field name="SENSOR_TEST_PATTERN_MODE_COLOR_BARS" />
+ <field name="SENSOR_TEST_PATTERN_MODE_COLOR_BARS_FADE_TO_GRAY" />
+ <field name="SENSOR_TEST_PATTERN_MODE_CUSTOM1" />
+ <field name="SENSOR_TEST_PATTERN_MODE_OFF" />
+ <field name="SENSOR_TEST_PATTERN_MODE_PN9" />
+ <field name="SENSOR_TEST_PATTERN_MODE_SOLID_COLOR" />
+ <field name="SHADING_MODE_FAST" />
+ <field name="SHADING_MODE_HIGH_QUALITY" />
+ <field name="SHADING_MODE_OFF" />
+ <field name="STATISTICS_FACE_DETECT_MODE_FULL" />
+ <field name="STATISTICS_FACE_DETECT_MODE_OFF" />
+ <field name="STATISTICS_FACE_DETECT_MODE_SIMPLE" />
+ <field name="STATISTICS_LENS_SHADING_MAP_MODE_OFF" />
+ <field name="STATISTICS_LENS_SHADING_MAP_MODE_ON" />
+ <field name="STATISTICS_SCENE_FLICKER_50HZ" />
+ <field name="STATISTICS_SCENE_FLICKER_60HZ" />
+ <field name="STATISTICS_SCENE_FLICKER_NONE" />
+ <field name="SYNC_MAX_LATENCY_PER_FRAME_CONTROL" />
+ <field name="SYNC_MAX_LATENCY_UNKNOWN" />
+ <field name="TONEMAP_MODE_CONTRAST_CURVE" />
+ <field name="TONEMAP_MODE_FAST" />
+ <field name="TONEMAP_MODE_HIGH_QUALITY" />
+ </class>
+ <class name="android/hardware/camera2/CaptureFailure" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getFrameNumber()J" />
+ <method name="getReason()I" />
+ <method name="getRequest()Landroid/hardware/camera2/CaptureRequest;" />
+ <method name="getSequenceId()I" />
+ <method name="wasImageCaptured()Z" />
+ <field name="REASON_ERROR" />
+ <field name="REASON_FLUSHED" />
+ </class>
+ <class name="android/hardware/camera2/CaptureRequest" since="21">
+ <extends name="android/hardware/camera2/CameraMetadata" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="get(Landroid/hardware/camera2/CaptureRequest$Key;)Ljava/lang/Object;" />
+ <method name="getTag()Ljava/lang/Object;" />
+ <field name="BLACK_LEVEL_LOCK" />
+ <field name="COLOR_CORRECTION_ABERRATION_MODE" />
+ <field name="COLOR_CORRECTION_GAINS" />
+ <field name="COLOR_CORRECTION_MODE" />
+ <field name="COLOR_CORRECTION_TRANSFORM" />
+ <field name="CONTROL_AE_ANTIBANDING_MODE" />
+ <field name="CONTROL_AE_EXPOSURE_COMPENSATION" />
+ <field name="CONTROL_AE_LOCK" />
+ <field name="CONTROL_AE_MODE" />
+ <field name="CONTROL_AE_PRECAPTURE_TRIGGER" />
+ <field name="CONTROL_AE_REGIONS" />
+ <field name="CONTROL_AE_TARGET_FPS_RANGE" />
+ <field name="CONTROL_AF_MODE" />
+ <field name="CONTROL_AF_REGIONS" />
+ <field name="CONTROL_AF_TRIGGER" />
+ <field name="CONTROL_AWB_LOCK" />
+ <field name="CONTROL_AWB_MODE" />
+ <field name="CONTROL_AWB_REGIONS" />
+ <field name="CONTROL_CAPTURE_INTENT" />
+ <field name="CONTROL_EFFECT_MODE" />
+ <field name="CONTROL_MODE" />
+ <field name="CONTROL_SCENE_MODE" />
+ <field name="CONTROL_VIDEO_STABILIZATION_MODE" />
+ <field name="CREATOR" />
+ <field name="EDGE_MODE" />
+ <field name="FLASH_MODE" />
+ <field name="HOT_PIXEL_MODE" />
+ <field name="JPEG_GPS_LOCATION" />
+ <field name="JPEG_ORIENTATION" />
+ <field name="JPEG_QUALITY" />
+ <field name="JPEG_THUMBNAIL_QUALITY" />
+ <field name="JPEG_THUMBNAIL_SIZE" />
+ <field name="LENS_APERTURE" />
+ <field name="LENS_FILTER_DENSITY" />
+ <field name="LENS_FOCAL_LENGTH" />
+ <field name="LENS_FOCUS_DISTANCE" />
+ <field name="LENS_OPTICAL_STABILIZATION_MODE" />
+ <field name="NOISE_REDUCTION_MODE" />
+ <field name="SCALER_CROP_REGION" />
+ <field name="SENSOR_EXPOSURE_TIME" />
+ <field name="SENSOR_FRAME_DURATION" />
+ <field name="SENSOR_SENSITIVITY" />
+ <field name="SENSOR_TEST_PATTERN_DATA" />
+ <field name="SENSOR_TEST_PATTERN_MODE" />
+ <field name="SHADING_MODE" />
+ <field name="STATISTICS_FACE_DETECT_MODE" />
+ <field name="STATISTICS_HOT_PIXEL_MAP_MODE" />
+ <field name="STATISTICS_LENS_SHADING_MAP_MODE" />
+ <field name="TONEMAP_CURVE" />
+ <field name="TONEMAP_MODE" />
+ </class>
+ <class name="android/hardware/camera2/CaptureRequest$Builder" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addTarget(Landroid/view/Surface;)V" />
+ <method name="build()Landroid/hardware/camera2/CaptureRequest;" />
+ <method name="get(Landroid/hardware/camera2/CaptureRequest$Key;)Ljava/lang/Object;" />
+ <method name="removeTarget(Landroid/view/Surface;)V" />
+ <method name="set(Landroid/hardware/camera2/CaptureRequest$Key;Ljava/lang/Object;)V" />
+ <method name="setTag(Ljava/lang/Object;)V" />
+ </class>
+ <class name="android/hardware/camera2/CaptureRequest$Key" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getName()Ljava/lang/String;" />
+ </class>
+ <class name="android/hardware/camera2/CaptureResult" since="21">
+ <extends name="android/hardware/camera2/CameraMetadata" />
+ <method name="&lt;init>()V" />
+ <method name="get(Landroid/hardware/camera2/CaptureResult$Key;)Ljava/lang/Object;" />
+ <method name="getFrameNumber()J" />
+ <method name="getRequest()Landroid/hardware/camera2/CaptureRequest;" />
+ <method name="getSequenceId()I" />
+ <field name="BLACK_LEVEL_LOCK" />
+ <field name="COLOR_CORRECTION_ABERRATION_MODE" />
+ <field name="COLOR_CORRECTION_GAINS" />
+ <field name="COLOR_CORRECTION_MODE" />
+ <field name="COLOR_CORRECTION_TRANSFORM" />
+ <field name="CONTROL_AE_ANTIBANDING_MODE" />
+ <field name="CONTROL_AE_EXPOSURE_COMPENSATION" />
+ <field name="CONTROL_AE_LOCK" />
+ <field name="CONTROL_AE_MODE" />
+ <field name="CONTROL_AE_PRECAPTURE_TRIGGER" />
+ <field name="CONTROL_AE_REGIONS" />
+ <field name="CONTROL_AE_STATE" />
+ <field name="CONTROL_AE_TARGET_FPS_RANGE" />
+ <field name="CONTROL_AF_MODE" />
+ <field name="CONTROL_AF_REGIONS" />
+ <field name="CONTROL_AF_STATE" />
+ <field name="CONTROL_AF_TRIGGER" />
+ <field name="CONTROL_AWB_LOCK" />
+ <field name="CONTROL_AWB_MODE" />
+ <field name="CONTROL_AWB_REGIONS" />
+ <field name="CONTROL_AWB_STATE" />
+ <field name="CONTROL_CAPTURE_INTENT" />
+ <field name="CONTROL_EFFECT_MODE" />
+ <field name="CONTROL_MODE" />
+ <field name="CONTROL_SCENE_MODE" />
+ <field name="CONTROL_VIDEO_STABILIZATION_MODE" />
+ <field name="EDGE_MODE" />
+ <field name="FLASH_MODE" />
+ <field name="FLASH_STATE" />
+ <field name="HOT_PIXEL_MODE" />
+ <field name="JPEG_GPS_LOCATION" />
+ <field name="JPEG_ORIENTATION" />
+ <field name="JPEG_QUALITY" />
+ <field name="JPEG_THUMBNAIL_QUALITY" />
+ <field name="JPEG_THUMBNAIL_SIZE" />
+ <field name="LENS_APERTURE" />
+ <field name="LENS_FILTER_DENSITY" />
+ <field name="LENS_FOCAL_LENGTH" />
+ <field name="LENS_FOCUS_DISTANCE" />
+ <field name="LENS_FOCUS_RANGE" />
+ <field name="LENS_OPTICAL_STABILIZATION_MODE" />
+ <field name="LENS_STATE" />
+ <field name="NOISE_REDUCTION_MODE" />
+ <field name="REQUEST_PIPELINE_DEPTH" />
+ <field name="SCALER_CROP_REGION" />
+ <field name="SENSOR_EXPOSURE_TIME" />
+ <field name="SENSOR_FRAME_DURATION" />
+ <field name="SENSOR_GREEN_SPLIT" />
+ <field name="SENSOR_NEUTRAL_COLOR_POINT" />
+ <field name="SENSOR_NOISE_PROFILE" />
+ <field name="SENSOR_ROLLING_SHUTTER_SKEW" />
+ <field name="SENSOR_SENSITIVITY" />
+ <field name="SENSOR_TEST_PATTERN_DATA" />
+ <field name="SENSOR_TEST_PATTERN_MODE" />
+ <field name="SENSOR_TIMESTAMP" />
+ <field name="SHADING_MODE" />
+ <field name="STATISTICS_FACES" />
+ <field name="STATISTICS_FACE_DETECT_MODE" />
+ <field name="STATISTICS_HOT_PIXEL_MAP" />
+ <field name="STATISTICS_HOT_PIXEL_MAP_MODE" />
+ <field name="STATISTICS_LENS_SHADING_CORRECTION_MAP" />
+ <field name="STATISTICS_LENS_SHADING_MAP_MODE" />
+ <field name="STATISTICS_SCENE_FLICKER" />
+ <field name="TONEMAP_CURVE" />
+ <field name="TONEMAP_MODE" />
+ </class>
+ <class name="android/hardware/camera2/CaptureResult$Key" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getName()Ljava/lang/String;" />
+ </class>
+ <class name="android/hardware/camera2/DngCreator" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/AutoCloseable" />
+ <method name="&lt;init>(Landroid/hardware/camera2/CameraCharacteristics;Landroid/hardware/camera2/CaptureResult;)V" />
+ <method name="setDescription(Ljava/lang/String;)Landroid/hardware/camera2/DngCreator;" />
+ <method name="setLocation(Landroid/location/Location;)Landroid/hardware/camera2/DngCreator;" />
+ <method name="setOrientation(I)Landroid/hardware/camera2/DngCreator;" />
+ <method name="setThumbnail(Landroid/graphics/Bitmap;)Landroid/hardware/camera2/DngCreator;" />
+ <method name="setThumbnail(Landroid/media/Image;)Landroid/hardware/camera2/DngCreator;" />
+ <method name="writeByteBuffer(Ljava/io/OutputStream;Landroid/util/Size;Ljava/nio/ByteBuffer;J)V" />
+ <method name="writeImage(Ljava/io/OutputStream;Landroid/media/Image;)V" />
+ <method name="writeInputStream(Ljava/io/OutputStream;Landroid/util/Size;Ljava/io/InputStream;J)V" />
+ <field name="MAX_THUMBNAIL_DIMENSION" />
+ </class>
+ <class name="android/hardware/camera2/TotalCaptureResult" since="21">
+ <extends name="android/hardware/camera2/CaptureResult" />
+ <method name="&lt;init>()V" />
+ <method name="getPartialResults()Ljava/util/List;" />
+ </class>
+ <class name="android/hardware/camera2/params/BlackLevelPattern" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="copyTo([II)V" />
+ <method name="getOffsetForIndex(II)I" />
+ <field name="COUNT" />
+ </class>
+ <class name="android/hardware/camera2/params/ColorSpaceTransform" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>([I)V" />
+ <method name="&lt;init>([Landroid/util/Rational;)V" />
+ <method name="copyElements([II)V" />
+ <method name="copyElements([Landroid/util/Rational;I)V" />
+ <method name="getElement(II)Landroid/util/Rational;" />
+ </class>
+ <class name="android/hardware/camera2/params/Face" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getBounds()Landroid/graphics/Rect;" />
+ <method name="getId()I" />
+ <method name="getLeftEyePosition()Landroid/graphics/Point;" />
+ <method name="getMouthPosition()Landroid/graphics/Point;" />
+ <method name="getRightEyePosition()Landroid/graphics/Point;" />
+ <method name="getScore()I" />
+ <field name="ID_UNSUPPORTED" />
+ <field name="SCORE_MAX" />
+ <field name="SCORE_MIN" />
+ </class>
+ <class name="android/hardware/camera2/params/LensShadingMap" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="copyGainFactors([FI)V" />
+ <method name="getColumnCount()I" />
+ <method name="getGainFactor(III)F" />
+ <method name="getGainFactorCount()I" />
+ <method name="getGainFactorVector(II)Landroid/hardware/camera2/params/RggbChannelVector;" />
+ <method name="getRowCount()I" />
+ <field name="MINIMUM_GAIN_FACTOR" />
+ </class>
+ <class name="android/hardware/camera2/params/MeteringRectangle" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(IIIII)V" />
+ <method name="&lt;init>(Landroid/graphics/Point;Landroid/util/Size;I)V" />
+ <method name="&lt;init>(Landroid/graphics/Rect;I)V" />
+ <method name="equals(Landroid/hardware/camera2/params/MeteringRectangle;)Z" />
+ <method name="getHeight()I" />
+ <method name="getMeteringWeight()I" />
+ <method name="getRect()Landroid/graphics/Rect;" />
+ <method name="getSize()Landroid/util/Size;" />
+ <method name="getUpperLeftPoint()Landroid/graphics/Point;" />
+ <method name="getWidth()I" />
+ <method name="getX()I" />
+ <method name="getY()I" />
+ <field name="METERING_WEIGHT_DONT_CARE" />
+ <field name="METERING_WEIGHT_MAX" />
+ <field name="METERING_WEIGHT_MIN" />
+ </class>
+ <class name="android/hardware/camera2/params/RggbChannelVector" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(FFFF)V" />
+ <method name="copyTo([FI)V" />
+ <method name="getBlue()F" />
+ <method name="getComponent(I)F" />
+ <method name="getGreenEven()F" />
+ <method name="getGreenOdd()F" />
+ <method name="getRed()F" />
+ <field name="BLUE" />
+ <field name="COUNT" />
+ <field name="GREEN_EVEN" />
+ <field name="GREEN_ODD" />
+ <field name="RED" />
+ </class>
+ <class name="android/hardware/camera2/params/StreamConfigurationMap" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getHighSpeedVideoFpsRanges()[Landroid/util/Range;" />
+ <method name="getHighSpeedVideoFpsRangesFor(Landroid/util/Size;)[Landroid/util/Range;" />
+ <method name="getHighSpeedVideoSizes()[Landroid/util/Size;" />
+ <method name="getHighSpeedVideoSizesFor(Landroid/util/Range;)[Landroid/util/Size;" />
+ <method name="getOutputFormats()[I" />
+ <method name="getOutputMinFrameDuration(ILandroid/util/Size;)J" />
+ <method name="getOutputMinFrameDuration(Ljava/lang/Class;Landroid/util/Size;)J" />
+ <method name="getOutputSizes(I)[Landroid/util/Size;" />
+ <method name="getOutputSizes(Ljava/lang/Class;)[Landroid/util/Size;" />
+ <method name="getOutputStallDuration(ILandroid/util/Size;)J" />
+ <method name="getOutputStallDuration(Ljava/lang/Class;Landroid/util/Size;)J" />
+ <method name="isOutputSupportedFor(I)Z" />
+ <method name="isOutputSupportedFor(Landroid/view/Surface;)Z" />
+ <method name="isOutputSupportedFor(Ljava/lang/Class;)Z" />
+ </class>
+ <class name="android/hardware/camera2/params/TonemapCurve" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>([F[F[F)V" />
+ <method name="copyColorCurve(I[FI)V" />
+ <method name="getPoint(II)Landroid/graphics/PointF;" />
+ <method name="getPointCount(I)I" />
+ <field name="CHANNEL_BLUE" />
+ <field name="CHANNEL_GREEN" />
+ <field name="CHANNEL_RED" />
+ <field name="LEVEL_BLACK" />
+ <field name="LEVEL_WHITE" />
+ <field name="POINT_SIZE" />
+ </class>
+ <class name="android/hardware/display/DisplayManager" since="17">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="createVirtualDisplay(Ljava/lang/String;IIILandroid/view/Surface;I)Landroid/hardware/display/VirtualDisplay;" since="19" />
+ <method name="createVirtualDisplay(Ljava/lang/String;IIILandroid/view/Surface;ILandroid/hardware/display/VirtualDisplay$Callback;Landroid/os/Handler;)Landroid/hardware/display/VirtualDisplay;" since="21" />
+ <method name="getDisplay(I)Landroid/view/Display;" />
+ <method name="getDisplays()[Landroid/view/Display;" />
+ <method name="getDisplays(Ljava/lang/String;)[Landroid/view/Display;" />
+ <method name="registerDisplayListener(Landroid/hardware/display/DisplayManager$DisplayListener;Landroid/os/Handler;)V" />
+ <method name="unregisterDisplayListener(Landroid/hardware/display/DisplayManager$DisplayListener;)V" />
+ <field name="DISPLAY_CATEGORY_PRESENTATION" />
+ <field name="VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR" since="21" />
+ <field name="VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY" since="20" />
+ <field name="VIRTUAL_DISPLAY_FLAG_PRESENTATION" since="19" />
+ <field name="VIRTUAL_DISPLAY_FLAG_PUBLIC" since="19" />
+ <field name="VIRTUAL_DISPLAY_FLAG_SECURE" since="19" />
+ </class>
+ <class name="android/hardware/display/DisplayManager$DisplayListener" since="17">
+ <extends name="java/lang/Object" />
+ <method name="onDisplayAdded(I)V" />
+ <method name="onDisplayChanged(I)V" />
+ <method name="onDisplayRemoved(I)V" />
+ </class>
+ <class name="android/hardware/display/VirtualDisplay" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getDisplay()Landroid/view/Display;" />
+ <method name="getSurface()Landroid/view/Surface;" since="20" />
+ <method name="release()V" />
+ <method name="resize(III)V" since="21" />
+ <method name="setSurface(Landroid/view/Surface;)V" since="20" />
+ </class>
+ <class name="android/hardware/display/VirtualDisplay$Callback" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onPaused()V" />
+ <method name="onResumed()V" />
+ <method name="onStopped()V" />
+ </class>
+ <class name="android/hardware/input/InputManager" since="16">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getInputDevice(I)Landroid/view/InputDevice;" />
+ <method name="getInputDeviceIds()[I" />
+ <method name="registerInputDeviceListener(Landroid/hardware/input/InputManager$InputDeviceListener;Landroid/os/Handler;)V" />
+ <method name="unregisterInputDeviceListener(Landroid/hardware/input/InputManager$InputDeviceListener;)V" />
+ <field name="ACTION_QUERY_KEYBOARD_LAYOUTS" />
+ <field name="META_DATA_KEYBOARD_LAYOUTS" />
+ </class>
+ <class name="android/hardware/input/InputManager$InputDeviceListener" since="16">
+ <extends name="java/lang/Object" />
+ <method name="onInputDeviceAdded(I)V" />
+ <method name="onInputDeviceChanged(I)V" />
+ <method name="onInputDeviceRemoved(I)V" />
+ </class>
+ <class name="android/hardware/location/GeofenceHardware" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addGeofence(IILandroid/hardware/location/GeofenceHardwareRequest;Landroid/hardware/location/GeofenceHardwareCallback;)Z" />
+ <method name="getMonitoringTypes()[I" />
+ <method name="getStatusOfMonitoringType(I)I" />
+ <method name="pauseGeofence(II)Z" />
+ <method name="registerForMonitorStateChangeCallback(ILandroid/hardware/location/GeofenceHardwareMonitorCallback;)Z" />
+ <method name="removeGeofence(II)Z" />
+ <method name="resumeGeofence(III)Z" />
+ <method name="unregisterForMonitorStateChangeCallback(ILandroid/hardware/location/GeofenceHardwareMonitorCallback;)Z" />
+ <field name="GEOFENCE_ENTERED" />
+ <field name="GEOFENCE_ERROR_ID_EXISTS" />
+ <field name="GEOFENCE_ERROR_ID_UNKNOWN" />
+ <field name="GEOFENCE_ERROR_INVALID_TRANSITION" />
+ <field name="GEOFENCE_ERROR_TOO_MANY_GEOFENCES" />
+ <field name="GEOFENCE_EXITED" />
+ <field name="GEOFENCE_FAILURE" />
+ <field name="GEOFENCE_SUCCESS" />
+ <field name="GEOFENCE_UNCERTAIN" />
+ <field name="MONITORING_TYPE_GPS_HARDWARE" />
+ <field name="MONITOR_CURRENTLY_AVAILABLE" />
+ <field name="MONITOR_CURRENTLY_UNAVAILABLE" />
+ <field name="MONITOR_UNSUPPORTED" />
+ </class>
+ <class name="android/hardware/location/GeofenceHardwareCallback" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onGeofenceAdd(II)V" />
+ <method name="onGeofencePause(II)V" />
+ <method name="onGeofenceRemove(II)V" />
+ <method name="onGeofenceResume(II)V" />
+ <method name="onGeofenceTransition(IILandroid/location/Location;JI)V" />
+ </class>
+ <class name="android/hardware/location/GeofenceHardwareMonitorCallback" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onMonitoringSystemChange(IZLandroid/location/Location;)V" />
+ </class>
+ <class name="android/hardware/location/GeofenceHardwareRequest" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="createCircularGeofence(DDD)Landroid/hardware/location/GeofenceHardwareRequest;" />
+ <method name="getLastTransition()I" />
+ <method name="getLatitude()D" />
+ <method name="getLongitude()D" />
+ <method name="getMonitorTransitions()I" />
+ <method name="getNotificationResponsiveness()I" />
+ <method name="getRadius()D" />
+ <method name="getUnknownTimer()I" />
+ <method name="setLastTransition(I)V" />
+ <method name="setMonitorTransitions(I)V" />
+ <method name="setNotificationResponsiveness(I)V" />
+ <method name="setUnknownTimer(I)V" />
+ </class>
+ <class name="android/hardware/usb/UsbAccessory" since="12">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getDescription()Ljava/lang/String;" />
+ <method name="getManufacturer()Ljava/lang/String;" />
+ <method name="getModel()Ljava/lang/String;" />
+ <method name="getSerial()Ljava/lang/String;" />
+ <method name="getUri()Ljava/lang/String;" />
+ <method name="getVersion()Ljava/lang/String;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/hardware/usb/UsbConfiguration" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getId()I" />
+ <method name="getInterface(I)Landroid/hardware/usb/UsbInterface;" />
+ <method name="getInterfaceCount()I" />
+ <method name="getMaxPower()I" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="isRemoteWakeup()Z" />
+ <method name="isSelfPowered()Z" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/hardware/usb/UsbConstants" since="12">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="USB_CLASS_APP_SPEC" />
+ <field name="USB_CLASS_AUDIO" />
+ <field name="USB_CLASS_CDC_DATA" />
+ <field name="USB_CLASS_COMM" />
+ <field name="USB_CLASS_CONTENT_SEC" />
+ <field name="USB_CLASS_CSCID" />
+ <field name="USB_CLASS_HID" />
+ <field name="USB_CLASS_HUB" />
+ <field name="USB_CLASS_MASS_STORAGE" />
+ <field name="USB_CLASS_MISC" />
+ <field name="USB_CLASS_PER_INTERFACE" />
+ <field name="USB_CLASS_PHYSICA" />
+ <field name="USB_CLASS_PRINTER" />
+ <field name="USB_CLASS_STILL_IMAGE" />
+ <field name="USB_CLASS_VENDOR_SPEC" />
+ <field name="USB_CLASS_VIDEO" />
+ <field name="USB_CLASS_WIRELESS_CONTROLLER" />
+ <field name="USB_DIR_IN" />
+ <field name="USB_DIR_OUT" />
+ <field name="USB_ENDPOINT_DIR_MASK" />
+ <field name="USB_ENDPOINT_NUMBER_MASK" />
+ <field name="USB_ENDPOINT_XFERTYPE_MASK" />
+ <field name="USB_ENDPOINT_XFER_BULK" />
+ <field name="USB_ENDPOINT_XFER_CONTROL" />
+ <field name="USB_ENDPOINT_XFER_INT" />
+ <field name="USB_ENDPOINT_XFER_ISOC" />
+ <field name="USB_INTERFACE_SUBCLASS_BOOT" />
+ <field name="USB_SUBCLASS_VENDOR_SPEC" />
+ <field name="USB_TYPE_CLASS" />
+ <field name="USB_TYPE_MASK" />
+ <field name="USB_TYPE_RESERVED" />
+ <field name="USB_TYPE_STANDARD" />
+ <field name="USB_TYPE_VENDOR" />
+ </class>
+ <class name="android/hardware/usb/UsbDevice" since="12">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getConfiguration(I)Landroid/hardware/usb/UsbConfiguration;" since="21" />
+ <method name="getConfigurationCount()I" since="21" />
+ <method name="getDeviceClass()I" />
+ <method name="getDeviceId()I" />
+ <method name="getDeviceId(Ljava/lang/String;)I" />
+ <method name="getDeviceName()Ljava/lang/String;" />
+ <method name="getDeviceName(I)Ljava/lang/String;" />
+ <method name="getDeviceProtocol()I" />
+ <method name="getDeviceSubclass()I" />
+ <method name="getInterface(I)Landroid/hardware/usb/UsbInterface;" />
+ <method name="getInterfaceCount()I" />
+ <method name="getManufacturerName()Ljava/lang/String;" since="21" />
+ <method name="getProductId()I" />
+ <method name="getProductName()Ljava/lang/String;" since="21" />
+ <method name="getSerialNumber()Ljava/lang/String;" since="21" />
+ <method name="getVendorId()I" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/hardware/usb/UsbDeviceConnection" since="12">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="bulkTransfer(Landroid/hardware/usb/UsbEndpoint;[BII)I" />
+ <method name="bulkTransfer(Landroid/hardware/usb/UsbEndpoint;[BIII)I" since="18" />
+ <method name="claimInterface(Landroid/hardware/usb/UsbInterface;Z)Z" />
+ <method name="close()V" />
+ <method name="controlTransfer(IIII[BII)I" />
+ <method name="controlTransfer(IIII[BIII)I" since="18" />
+ <method name="getFileDescriptor()I" />
+ <method name="getRawDescriptors()[B" since="13" />
+ <method name="getSerial()Ljava/lang/String;" />
+ <method name="releaseInterface(Landroid/hardware/usb/UsbInterface;)Z" />
+ <method name="requestWait()Landroid/hardware/usb/UsbRequest;" />
+ <method name="setConfiguration(Landroid/hardware/usb/UsbConfiguration;)Z" since="21" />
+ <method name="setInterface(Landroid/hardware/usb/UsbInterface;)Z" since="21" />
+ </class>
+ <class name="android/hardware/usb/UsbEndpoint" since="12">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getAddress()I" />
+ <method name="getAttributes()I" />
+ <method name="getDirection()I" />
+ <method name="getEndpointNumber()I" />
+ <method name="getInterval()I" />
+ <method name="getMaxPacketSize()I" />
+ <method name="getType()I" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/hardware/usb/UsbInterface" since="12">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getAlternateSetting()I" since="21" />
+ <method name="getEndpoint(I)Landroid/hardware/usb/UsbEndpoint;" />
+ <method name="getEndpointCount()I" />
+ <method name="getId()I" />
+ <method name="getInterfaceClass()I" />
+ <method name="getInterfaceProtocol()I" />
+ <method name="getInterfaceSubclass()I" />
+ <method name="getName()Ljava/lang/String;" since="21" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/hardware/usb/UsbManager" since="12">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getAccessoryList()[Landroid/hardware/usb/UsbAccessory;" />
+ <method name="getDeviceList()Ljava/util/HashMap;" />
+ <method name="hasPermission(Landroid/hardware/usb/UsbAccessory;)Z" />
+ <method name="hasPermission(Landroid/hardware/usb/UsbDevice;)Z" />
+ <method name="openAccessory(Landroid/hardware/usb/UsbAccessory;)Landroid/os/ParcelFileDescriptor;" />
+ <method name="openDevice(Landroid/hardware/usb/UsbDevice;)Landroid/hardware/usb/UsbDeviceConnection;" />
+ <method name="requestPermission(Landroid/hardware/usb/UsbAccessory;Landroid/app/PendingIntent;)V" />
+ <method name="requestPermission(Landroid/hardware/usb/UsbDevice;Landroid/app/PendingIntent;)V" />
+ <field name="ACTION_USB_ACCESSORY_ATTACHED" />
+ <field name="ACTION_USB_ACCESSORY_DETACHED" />
+ <field name="ACTION_USB_DEVICE_ATTACHED" />
+ <field name="ACTION_USB_DEVICE_DETACHED" />
+ <field name="EXTRA_ACCESSORY" />
+ <field name="EXTRA_DEVICE" />
+ <field name="EXTRA_PERMISSION_GRANTED" />
+ </class>
+ <class name="android/hardware/usb/UsbRequest" since="12">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="cancel()Z" />
+ <method name="close()V" />
+ <method name="getClientData()Ljava/lang/Object;" />
+ <method name="getEndpoint()Landroid/hardware/usb/UsbEndpoint;" />
+ <method name="initialize(Landroid/hardware/usb/UsbDeviceConnection;Landroid/hardware/usb/UsbEndpoint;)Z" />
+ <method name="queue(Ljava/nio/ByteBuffer;I)Z" />
+ <method name="setClientData(Ljava/lang/Object;)V" />
+ </class>
+ <class name="android/inputmethodservice/AbstractInputMethodService" since="3">
+ <extends name="android/app/Service" />
+ <implements name="android/view/KeyEvent$Callback" />
+ <method name="&lt;init>()V" />
+ <method name="getKeyDispatcherState()Landroid/view/KeyEvent$DispatcherState;" since="5" />
+ <method name="onCreateInputMethodInterface()Landroid/inputmethodservice/AbstractInputMethodService$AbstractInputMethodImpl;" />
+ <method name="onCreateInputMethodSessionInterface()Landroid/inputmethodservice/AbstractInputMethodService$AbstractInputMethodSessionImpl;" />
+ <method name="onGenericMotionEvent(Landroid/view/MotionEvent;)Z" since="17" />
+ <method name="onTrackballEvent(Landroid/view/MotionEvent;)Z" />
+ </class>
+ <class name="android/inputmethodservice/AbstractInputMethodService$AbstractInputMethodImpl" since="3">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/inputmethod/InputMethod" />
+ <method name="&lt;init>(Landroid/inputmethodservice/AbstractInputMethodService;)V" />
+ </class>
+ <class name="android/inputmethodservice/AbstractInputMethodService$AbstractInputMethodSessionImpl" since="3">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/inputmethod/InputMethodSession" />
+ <method name="&lt;init>(Landroid/inputmethodservice/AbstractInputMethodService;)V" />
+ <method name="isEnabled()Z" />
+ <method name="isRevoked()Z" />
+ <method name="revokeSelf()V" />
+ <method name="setEnabled(Z)V" />
+ </class>
+ <class name="android/inputmethodservice/ExtractEditText" since="3">
+ <extends name="android/widget/EditText" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="finishInternalChanges()V" />
+ <method name="hasVerticalScrollBar()Z" />
+ <method name="startInternalChanges()V" />
+ </class>
+ <class name="android/inputmethodservice/InputMethodService" since="3">
+ <extends name="android/inputmethodservice/AbstractInputMethodService" />
+ <method name="&lt;init>()V" />
+ <method name="enableHardwareAcceleration()Z" since="17" />
+ <method name="getBackDisposition()I" since="11" />
+ <method name="getCandidatesHiddenVisibility()I" />
+ <method name="getCurrentInputBinding()Landroid/view/inputmethod/InputBinding;" />
+ <method name="getCurrentInputConnection()Landroid/view/inputmethod/InputConnection;" />
+ <method name="getCurrentInputEditorInfo()Landroid/view/inputmethod/EditorInfo;" />
+ <method name="getCurrentInputStarted()Z" />
+ <method name="getInputMethodWindowRecommendedHeight()I" since="21" />
+ <method name="getLayoutInflater()Landroid/view/LayoutInflater;" />
+ <method name="getMaxWidth()I" />
+ <method name="getTextForImeAction(I)Ljava/lang/CharSequence;" />
+ <method name="getWindow()Landroid/app/Dialog;" />
+ <method name="hideStatusIcon()V" />
+ <method name="hideWindow()V" />
+ <method name="isExtractViewShown()Z" />
+ <method name="isFullscreenMode()Z" />
+ <method name="isInputViewShown()Z" />
+ <method name="isShowInputRequested()Z" />
+ <method name="onAppPrivateCommand(Ljava/lang/String;Landroid/os/Bundle;)V" />
+ <method name="onBindInput()V" />
+ <method name="onComputeInsets(Landroid/inputmethodservice/InputMethodService$Insets;)V" />
+ <method name="onConfigureWindow(Landroid/view/Window;ZZ)V" />
+ <method name="onCreateCandidatesView()Landroid/view/View;" />
+ <method name="onCreateExtractTextView()Landroid/view/View;" />
+ <method name="onCreateInputView()Landroid/view/View;" />
+ <method name="onCurrentInputMethodSubtypeChanged(Landroid/view/inputmethod/InputMethodSubtype;)V" since="11" />
+ <method name="onDisplayCompletions([Landroid/view/inputmethod/CompletionInfo;)V" />
+ <method name="onEvaluateFullscreenMode()Z" />
+ <method name="onEvaluateInputViewShown()Z" />
+ <method name="onExtractTextContextMenuItem(I)Z" />
+ <method name="onExtractedCursorMovement(II)V" />
+ <method name="onExtractedSelectionChanged(II)V" />
+ <method name="onExtractedTextClicked()V" />
+ <method name="onExtractingInputChanged(Landroid/view/inputmethod/EditorInfo;)V" />
+ <method name="onFinishCandidatesView(Z)V" />
+ <method name="onFinishInput()V" />
+ <method name="onFinishInputView(Z)V" />
+ <method name="onInitializeInterface()V" />
+ <method name="onShowInputRequested(IZ)Z" />
+ <method name="onStartCandidatesView(Landroid/view/inputmethod/EditorInfo;Z)V" />
+ <method name="onStartInput(Landroid/view/inputmethod/EditorInfo;Z)V" />
+ <method name="onStartInputView(Landroid/view/inputmethod/EditorInfo;Z)V" />
+ <method name="onUnbindInput()V" />
+ <method name="onUpdateCursor(Landroid/graphics/Rect;)V" />
+ <method name="onUpdateCursorAnchorInfo(Landroid/view/inputmethod/CursorAnchorInfo;)V" since="21" />
+ <method name="onUpdateExtractedText(ILandroid/view/inputmethod/ExtractedText;)V" />
+ <method name="onUpdateExtractingViews(Landroid/view/inputmethod/EditorInfo;)V" />
+ <method name="onUpdateExtractingVisibility(Landroid/view/inputmethod/EditorInfo;)V" />
+ <method name="onUpdateSelection(IIIIII)V" />
+ <method name="onViewClicked(Z)V" since="14" />
+ <method name="onWindowHidden()V" />
+ <method name="onWindowShown()V" />
+ <method name="requestHideSelf(I)V" />
+ <method name="sendDefaultEditorAction(Z)Z" />
+ <method name="sendDownUpKeyEvents(I)V" />
+ <method name="sendKeyChar(C)V" />
+ <method name="setBackDisposition(I)V" since="11" />
+ <method name="setCandidatesView(Landroid/view/View;)V" />
+ <method name="setCandidatesViewShown(Z)V" />
+ <method name="setExtractView(Landroid/view/View;)V" />
+ <method name="setExtractViewShown(Z)V" />
+ <method name="setInputView(Landroid/view/View;)V" />
+ <method name="showStatusIcon(I)V" />
+ <method name="showWindow(Z)V" />
+ <method name="switchInputMethod(Ljava/lang/String;)V" />
+ <method name="updateFullscreenMode()V" />
+ <method name="updateInputViewShown()V" />
+ <field name="BACK_DISPOSITION_DEFAULT" since="11" />
+ <field name="BACK_DISPOSITION_WILL_DISMISS" since="11" />
+ <field name="BACK_DISPOSITION_WILL_NOT_DISMISS" since="11" />
+ </class>
+ <class name="android/inputmethodservice/InputMethodService$InputMethodImpl" since="3">
+ <extends name="android/inputmethodservice/AbstractInputMethodService$AbstractInputMethodImpl" />
+ <method name="&lt;init>(Landroid/inputmethodservice/InputMethodService;)V" />
+ </class>
+ <class name="android/inputmethodservice/InputMethodService$InputMethodSessionImpl" since="3">
+ <extends name="android/inputmethodservice/AbstractInputMethodService$AbstractInputMethodSessionImpl" />
+ <method name="&lt;init>(Landroid/inputmethodservice/InputMethodService;)V" />
+ </class>
+ <class name="android/inputmethodservice/InputMethodService$Insets" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="TOUCHABLE_INSETS_CONTENT" />
+ <field name="TOUCHABLE_INSETS_FRAME" />
+ <field name="TOUCHABLE_INSETS_REGION" since="11" />
+ <field name="TOUCHABLE_INSETS_VISIBLE" />
+ <field name="contentTopInsets" />
+ <field name="touchableInsets" />
+ <field name="touchableRegion" since="11" />
+ <field name="visibleTopInsets" />
+ </class>
+ <class name="android/inputmethodservice/Keyboard" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;II)V" />
+ <method name="&lt;init>(Landroid/content/Context;IIII)V" since="11" />
+ <method name="&lt;init>(Landroid/content/Context;ILjava/lang/CharSequence;II)V" />
+ <method name="createKeyFromXml(Landroid/content/res/Resources;Landroid/inputmethodservice/Keyboard$Row;IILandroid/content/res/XmlResourceParser;)Landroid/inputmethodservice/Keyboard$Key;" />
+ <method name="createRowFromXml(Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;)Landroid/inputmethodservice/Keyboard$Row;" />
+ <method name="getHeight()I" />
+ <method name="getHorizontalGap()I" />
+ <method name="getKeyHeight()I" />
+ <method name="getKeyWidth()I" />
+ <method name="getKeys()Ljava/util/List;" />
+ <method name="getMinWidth()I" />
+ <method name="getModifierKeys()Ljava/util/List;" />
+ <method name="getNearestKeys(II)[I" />
+ <method name="getShiftKeyIndex()I" />
+ <method name="getVerticalGap()I" />
+ <method name="isShifted()Z" />
+ <method name="setHorizontalGap(I)V" />
+ <method name="setKeyHeight(I)V" />
+ <method name="setKeyWidth(I)V" />
+ <method name="setShifted(Z)Z" />
+ <method name="setVerticalGap(I)V" />
+ <field name="EDGE_BOTTOM" />
+ <field name="EDGE_LEFT" />
+ <field name="EDGE_RIGHT" />
+ <field name="EDGE_TOP" />
+ <field name="KEYCODE_ALT" />
+ <field name="KEYCODE_CANCEL" />
+ <field name="KEYCODE_DELETE" />
+ <field name="KEYCODE_DONE" />
+ <field name="KEYCODE_MODE_CHANGE" />
+ <field name="KEYCODE_SHIFT" />
+ </class>
+ <class name="android/inputmethodservice/Keyboard$Key" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/res/Resources;Landroid/inputmethodservice/Keyboard$Row;IILandroid/content/res/XmlResourceParser;)V" />
+ <method name="&lt;init>(Landroid/inputmethodservice/Keyboard$Row;)V" />
+ <method name="getCurrentDrawableState()[I" />
+ <method name="isInside(II)Z" />
+ <method name="onPressed()V" />
+ <method name="onReleased(Z)V" />
+ <method name="squaredDistanceFrom(II)I" />
+ <field name="codes" />
+ <field name="edgeFlags" />
+ <field name="gap" />
+ <field name="height" />
+ <field name="icon" />
+ <field name="iconPreview" />
+ <field name="label" />
+ <field name="modifier" />
+ <field name="on" />
+ <field name="popupCharacters" />
+ <field name="popupResId" />
+ <field name="pressed" />
+ <field name="repeatable" />
+ <field name="sticky" />
+ <field name="text" />
+ <field name="width" />
+ <field name="x" />
+ <field name="y" />
+ </class>
+ <class name="android/inputmethodservice/Keyboard$Row" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/res/Resources;Landroid/inputmethodservice/Keyboard;Landroid/content/res/XmlResourceParser;)V" />
+ <method name="&lt;init>(Landroid/inputmethodservice/Keyboard;)V" />
+ <field name="defaultHeight" />
+ <field name="defaultHorizontalGap" />
+ <field name="defaultWidth" />
+ <field name="mode" />
+ <field name="rowEdgeFlags" />
+ <field name="verticalGap" />
+ </class>
+ <class name="android/inputmethodservice/KeyboardView" since="3">
+ <extends name="android/view/View" />
+ <implements name="android/view/View$OnClickListener" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="closing()V" />
+ <method name="getKeyboard()Landroid/inputmethodservice/Keyboard;" />
+ <method name="getOnKeyboardActionListener()Landroid/inputmethodservice/KeyboardView$OnKeyboardActionListener;" />
+ <method name="handleBack()Z" />
+ <method name="invalidateAllKeys()V" since="4" />
+ <method name="invalidateKey(I)V" since="4" />
+ <method name="isPreviewEnabled()Z" />
+ <method name="isProximityCorrectionEnabled()Z" />
+ <method name="isShifted()Z" />
+ <method name="onLongPress(Landroid/inputmethodservice/Keyboard$Key;)Z" />
+ <method name="setKeyboard(Landroid/inputmethodservice/Keyboard;)V" />
+ <method name="setOnKeyboardActionListener(Landroid/inputmethodservice/KeyboardView$OnKeyboardActionListener;)V" />
+ <method name="setPopupOffset(II)V" />
+ <method name="setPopupParent(Landroid/view/View;)V" />
+ <method name="setPreviewEnabled(Z)V" />
+ <method name="setProximityCorrectionEnabled(Z)V" />
+ <method name="setShifted(Z)Z" />
+ <method name="setVerticalCorrection(I)V" />
+ <method name="swipeDown()V" />
+ <method name="swipeLeft()V" />
+ <method name="swipeRight()V" />
+ <method name="swipeUp()V" />
+ </class>
+ <class name="android/inputmethodservice/KeyboardView$OnKeyboardActionListener" since="3">
+ <extends name="java/lang/Object" />
+ <method name="onKey(I[I)V" />
+ <method name="onPress(I)V" />
+ <method name="onRelease(I)V" />
+ <method name="onText(Ljava/lang/CharSequence;)V" />
+ <method name="swipeDown()V" />
+ <method name="swipeLeft()V" />
+ <method name="swipeRight()V" />
+ <method name="swipeUp()V" />
+ </class>
+ <class name="android/location/Address" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Ljava/util/Locale;)V" />
+ <method name="clearLatitude()V" />
+ <method name="clearLongitude()V" />
+ <method name="getAddressLine(I)Ljava/lang/String;" />
+ <method name="getAdminArea()Ljava/lang/String;" />
+ <method name="getCountryCode()Ljava/lang/String;" />
+ <method name="getCountryName()Ljava/lang/String;" />
+ <method name="getExtras()Landroid/os/Bundle;" />
+ <method name="getFeatureName()Ljava/lang/String;" />
+ <method name="getLatitude()D" />
+ <method name="getLocale()Ljava/util/Locale;" />
+ <method name="getLocality()Ljava/lang/String;" />
+ <method name="getLongitude()D" />
+ <method name="getMaxAddressLineIndex()I" />
+ <method name="getPhone()Ljava/lang/String;" />
+ <method name="getPostalCode()Ljava/lang/String;" />
+ <method name="getPremises()Ljava/lang/String;" since="4" />
+ <method name="getSubAdminArea()Ljava/lang/String;" />
+ <method name="getSubLocality()Ljava/lang/String;" since="4" />
+ <method name="getSubThoroughfare()Ljava/lang/String;" since="4" />
+ <method name="getThoroughfare()Ljava/lang/String;" />
+ <method name="getUrl()Ljava/lang/String;" />
+ <method name="hasLatitude()Z" />
+ <method name="hasLongitude()Z" />
+ <method name="setAddressLine(ILjava/lang/String;)V" />
+ <method name="setAdminArea(Ljava/lang/String;)V" />
+ <method name="setCountryCode(Ljava/lang/String;)V" />
+ <method name="setCountryName(Ljava/lang/String;)V" />
+ <method name="setExtras(Landroid/os/Bundle;)V" />
+ <method name="setFeatureName(Ljava/lang/String;)V" />
+ <method name="setLatitude(D)V" />
+ <method name="setLocality(Ljava/lang/String;)V" />
+ <method name="setLongitude(D)V" />
+ <method name="setPhone(Ljava/lang/String;)V" />
+ <method name="setPostalCode(Ljava/lang/String;)V" />
+ <method name="setPremises(Ljava/lang/String;)V" since="4" />
+ <method name="setSubAdminArea(Ljava/lang/String;)V" />
+ <method name="setSubLocality(Ljava/lang/String;)V" since="4" />
+ <method name="setSubThoroughfare(Ljava/lang/String;)V" since="4" />
+ <method name="setThoroughfare(Ljava/lang/String;)V" />
+ <method name="setUrl(Ljava/lang/String;)V" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/location/Criteria" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/location/Criteria;)V" />
+ <method name="getAccuracy()I" />
+ <method name="getBearingAccuracy()I" since="9" />
+ <method name="getHorizontalAccuracy()I" since="9" />
+ <method name="getPowerRequirement()I" />
+ <method name="getSpeedAccuracy()I" since="9" />
+ <method name="getVerticalAccuracy()I" since="9" />
+ <method name="isAltitudeRequired()Z" />
+ <method name="isBearingRequired()Z" />
+ <method name="isCostAllowed()Z" />
+ <method name="isSpeedRequired()Z" />
+ <method name="setAccuracy(I)V" />
+ <method name="setAltitudeRequired(Z)V" />
+ <method name="setBearingAccuracy(I)V" since="9" />
+ <method name="setBearingRequired(Z)V" />
+ <method name="setCostAllowed(Z)V" />
+ <method name="setHorizontalAccuracy(I)V" since="9" />
+ <method name="setPowerRequirement(I)V" />
+ <method name="setSpeedAccuracy(I)V" since="9" />
+ <method name="setSpeedRequired(Z)V" />
+ <method name="setVerticalAccuracy(I)V" since="9" />
+ <field name="ACCURACY_COARSE" />
+ <field name="ACCURACY_FINE" />
+ <field name="ACCURACY_HIGH" since="9" />
+ <field name="ACCURACY_LOW" since="9" />
+ <field name="ACCURACY_MEDIUM" since="9" />
+ <field name="CREATOR" />
+ <field name="NO_REQUIREMENT" />
+ <field name="POWER_HIGH" />
+ <field name="POWER_LOW" />
+ <field name="POWER_MEDIUM" />
+ </class>
+ <class name="android/location/Geocoder" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Ljava/util/Locale;)V" />
+ <method name="getFromLocation(DDI)Ljava/util/List;" />
+ <method name="getFromLocationName(Ljava/lang/String;I)Ljava/util/List;" />
+ <method name="getFromLocationName(Ljava/lang/String;IDDDD)Ljava/util/List;" />
+ <method name="isPresent()Z" since="9" />
+ </class>
+ <class name="android/location/GpsSatellite" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getAzimuth()F" />
+ <method name="getElevation()F" />
+ <method name="getPrn()I" />
+ <method name="getSnr()F" />
+ <method name="hasAlmanac()Z" />
+ <method name="hasEphemeris()Z" />
+ <method name="usedInFix()Z" />
+ </class>
+ <class name="android/location/GpsStatus" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getMaxSatellites()I" />
+ <method name="getSatellites()Ljava/lang/Iterable;" />
+ <method name="getTimeToFirstFix()I" />
+ <field name="GPS_EVENT_FIRST_FIX" />
+ <field name="GPS_EVENT_SATELLITE_STATUS" />
+ <field name="GPS_EVENT_STARTED" />
+ <field name="GPS_EVENT_STOPPED" />
+ </class>
+ <class name="android/location/GpsStatus$Listener" since="3">
+ <extends name="java/lang/Object" />
+ <method name="onGpsStatusChanged(I)V" />
+ </class>
+ <class name="android/location/GpsStatus$NmeaListener" since="5">
+ <extends name="java/lang/Object" />
+ <method name="onNmeaReceived(JLjava/lang/String;)V" />
+ </class>
+ <class name="android/location/Location" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/location/Location;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="bearingTo(Landroid/location/Location;)F" />
+ <method name="convert(DI)Ljava/lang/String;" />
+ <method name="convert(Ljava/lang/String;)D" />
+ <method name="distanceBetween(DDDD[F)V" />
+ <method name="distanceTo(Landroid/location/Location;)F" />
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V" since="3" />
+ <method name="getAccuracy()F" />
+ <method name="getAltitude()D" />
+ <method name="getBearing()F" />
+ <method name="getElapsedRealtimeNanos()J" since="17" />
+ <method name="getExtras()Landroid/os/Bundle;" />
+ <method name="getLatitude()D" />
+ <method name="getLongitude()D" />
+ <method name="getProvider()Ljava/lang/String;" />
+ <method name="getSpeed()F" />
+ <method name="getTime()J" />
+ <method name="hasAccuracy()Z" />
+ <method name="hasAltitude()Z" />
+ <method name="hasBearing()Z" />
+ <method name="hasSpeed()Z" />
+ <method name="isFromMockProvider()Z" since="18" />
+ <method name="removeAccuracy()V" />
+ <method name="removeAltitude()V" />
+ <method name="removeBearing()V" />
+ <method name="removeSpeed()V" />
+ <method name="reset()V" />
+ <method name="set(Landroid/location/Location;)V" />
+ <method name="setAccuracy(F)V" />
+ <method name="setAltitude(D)V" />
+ <method name="setBearing(F)V" />
+ <method name="setElapsedRealtimeNanos(J)V" since="17" />
+ <method name="setExtras(Landroid/os/Bundle;)V" />
+ <method name="setLatitude(D)V" />
+ <method name="setLongitude(D)V" />
+ <method name="setProvider(Ljava/lang/String;)V" />
+ <method name="setSpeed(F)V" />
+ <method name="setTime(J)V" />
+ <field name="CREATOR" />
+ <field name="FORMAT_DEGREES" />
+ <field name="FORMAT_MINUTES" />
+ <field name="FORMAT_SECONDS" />
+ </class>
+ <class name="android/location/LocationListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onLocationChanged(Landroid/location/Location;)V" />
+ <method name="onProviderDisabled(Ljava/lang/String;)V" />
+ <method name="onProviderEnabled(Ljava/lang/String;)V" />
+ <method name="onStatusChanged(Ljava/lang/String;ILandroid/os/Bundle;)V" />
+ </class>
+ <class name="android/location/LocationManager" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addGpsStatusListener(Landroid/location/GpsStatus$Listener;)Z" since="3" />
+ <method name="addNmeaListener(Landroid/location/GpsStatus$NmeaListener;)Z" since="5" />
+ <method name="addProximityAlert(DDFJLandroid/app/PendingIntent;)V" />
+ <method name="addTestProvider(Ljava/lang/String;ZZZZZZZII)V" since="3" />
+ <method name="clearTestProviderEnabled(Ljava/lang/String;)V" since="3" />
+ <method name="clearTestProviderLocation(Ljava/lang/String;)V" since="3" />
+ <method name="clearTestProviderStatus(Ljava/lang/String;)V" since="3" />
+ <method name="getAllProviders()Ljava/util/List;" />
+ <method name="getBestProvider(Landroid/location/Criteria;Z)Ljava/lang/String;" />
+ <method name="getGpsStatus(Landroid/location/GpsStatus;)Landroid/location/GpsStatus;" since="3" />
+ <method name="getLastKnownLocation(Ljava/lang/String;)Landroid/location/Location;" />
+ <method name="getProvider(Ljava/lang/String;)Landroid/location/LocationProvider;" />
+ <method name="getProviders(Landroid/location/Criteria;Z)Ljava/util/List;" />
+ <method name="getProviders(Z)Ljava/util/List;" />
+ <method name="isProviderEnabled(Ljava/lang/String;)Z" />
+ <method name="removeGpsStatusListener(Landroid/location/GpsStatus$Listener;)V" since="3" />
+ <method name="removeNmeaListener(Landroid/location/GpsStatus$NmeaListener;)V" since="5" />
+ <method name="removeProximityAlert(Landroid/app/PendingIntent;)V" />
+ <method name="removeTestProvider(Ljava/lang/String;)V" since="3" />
+ <method name="removeUpdates(Landroid/app/PendingIntent;)V" since="3" />
+ <method name="removeUpdates(Landroid/location/LocationListener;)V" />
+ <method name="requestLocationUpdates(JFLandroid/location/Criteria;Landroid/app/PendingIntent;)V" since="9" />
+ <method name="requestLocationUpdates(JFLandroid/location/Criteria;Landroid/location/LocationListener;Landroid/os/Looper;)V" since="9" />
+ <method name="requestLocationUpdates(Ljava/lang/String;JFLandroid/app/PendingIntent;)V" since="3" />
+ <method name="requestLocationUpdates(Ljava/lang/String;JFLandroid/location/LocationListener;)V" />
+ <method name="requestLocationUpdates(Ljava/lang/String;JFLandroid/location/LocationListener;Landroid/os/Looper;)V" />
+ <method name="requestSingleUpdate(Landroid/location/Criteria;Landroid/app/PendingIntent;)V" since="9" />
+ <method name="requestSingleUpdate(Landroid/location/Criteria;Landroid/location/LocationListener;Landroid/os/Looper;)V" since="9" />
+ <method name="requestSingleUpdate(Ljava/lang/String;Landroid/app/PendingIntent;)V" since="9" />
+ <method name="requestSingleUpdate(Ljava/lang/String;Landroid/location/LocationListener;Landroid/os/Looper;)V" since="9" />
+ <method name="sendExtraCommand(Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Z" since="3" />
+ <method name="setTestProviderEnabled(Ljava/lang/String;Z)V" since="3" />
+ <method name="setTestProviderLocation(Ljava/lang/String;Landroid/location/Location;)V" since="3" />
+ <method name="setTestProviderStatus(Ljava/lang/String;ILandroid/os/Bundle;J)V" since="3" />
+ <field name="GPS_PROVIDER" />
+ <field name="KEY_LOCATION_CHANGED" since="3" />
+ <field name="KEY_PROVIDER_ENABLED" since="3" />
+ <field name="KEY_PROXIMITY_ENTERING" />
+ <field name="KEY_STATUS_CHANGED" since="3" />
+ <field name="MODE_CHANGED_ACTION" since="19" />
+ <field name="NETWORK_PROVIDER" />
+ <field name="PASSIVE_PROVIDER" since="8" />
+ <field name="PROVIDERS_CHANGED_ACTION" since="9" />
+ </class>
+ <class name="android/location/LocationProvider" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getAccuracy()I" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getPowerRequirement()I" />
+ <method name="hasMonetaryCost()Z" />
+ <method name="meetsCriteria(Landroid/location/Criteria;)Z" />
+ <method name="requiresCell()Z" />
+ <method name="requiresNetwork()Z" />
+ <method name="requiresSatellite()Z" />
+ <method name="supportsAltitude()Z" />
+ <method name="supportsBearing()Z" />
+ <method name="supportsSpeed()Z" />
+ <field name="AVAILABLE" />
+ <field name="OUT_OF_SERVICE" />
+ <field name="TEMPORARILY_UNAVAILABLE" />
+ </class>
+ <class name="android/location/SettingInjectorService" since="19">
+ <extends name="android/app/Service" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="onGetEnabled()Z" />
+ <method name="onGetSummary()Ljava/lang/String;" />
+ <field name="ACTION_INJECTED_SETTING_CHANGED" />
+ <field name="ACTION_SERVICE_INTENT" />
+ <field name="ATTRIBUTES_NAME" />
+ <field name="META_DATA_NAME" />
+ </class>
+ <class name="android/media/AsyncPlayer" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="play(Landroid/content/Context;Landroid/net/Uri;ZI)V" />
+ <method name="stop()V" />
+ </class>
+ <class name="android/media/AudioAttributes" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getContentType()I" />
+ <method name="getFlags()I" />
+ <method name="getUsage()I" />
+ <field name="CONTENT_TYPE_MOVIE" />
+ <field name="CONTENT_TYPE_MUSIC" />
+ <field name="CONTENT_TYPE_SONIFICATION" />
+ <field name="CONTENT_TYPE_SPEECH" />
+ <field name="CONTENT_TYPE_UNKNOWN" />
+ <field name="CREATOR" />
+ <field name="FLAG_AUDIBILITY_ENFORCED" />
+ <field name="FLAG_HW_AV_SYNC" />
+ <field name="USAGE_ALARM" />
+ <field name="USAGE_ASSISTANCE_ACCESSIBILITY" />
+ <field name="USAGE_ASSISTANCE_NAVIGATION_GUIDANCE" />
+ <field name="USAGE_ASSISTANCE_SONIFICATION" />
+ <field name="USAGE_GAME" />
+ <field name="USAGE_MEDIA" />
+ <field name="USAGE_NOTIFICATION" />
+ <field name="USAGE_NOTIFICATION_COMMUNICATION_DELAYED" />
+ <field name="USAGE_NOTIFICATION_COMMUNICATION_INSTANT" />
+ <field name="USAGE_NOTIFICATION_COMMUNICATION_REQUEST" />
+ <field name="USAGE_NOTIFICATION_EVENT" />
+ <field name="USAGE_NOTIFICATION_RINGTONE" />
+ <field name="USAGE_UNKNOWN" />
+ <field name="USAGE_VOICE_COMMUNICATION" />
+ <field name="USAGE_VOICE_COMMUNICATION_SIGNALLING" />
+ </class>
+ <class name="android/media/AudioAttributes$Builder" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/media/AudioAttributes;)V" />
+ <method name="build()Landroid/media/AudioAttributes;" />
+ <method name="setContentType(I)Landroid/media/AudioAttributes$Builder;" />
+ <method name="setFlags(I)Landroid/media/AudioAttributes$Builder;" />
+ <method name="setLegacyStreamType(I)Landroid/media/AudioAttributes$Builder;" />
+ <method name="setUsage(I)Landroid/media/AudioAttributes$Builder;" />
+ </class>
+ <class name="android/media/AudioFormat" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getChannelMask()I" since="21" />
+ <method name="getEncoding()I" since="21" />
+ <method name="getSampleRate()I" since="21" />
+ <field name="CHANNEL_CONFIGURATION_DEFAULT" />
+ <field name="CHANNEL_CONFIGURATION_INVALID" />
+ <field name="CHANNEL_CONFIGURATION_MONO" />
+ <field name="CHANNEL_CONFIGURATION_STEREO" />
+ <field name="CHANNEL_INVALID" since="5" />
+ <field name="CHANNEL_IN_BACK" since="5" />
+ <field name="CHANNEL_IN_BACK_PROCESSED" since="5" />
+ <field name="CHANNEL_IN_DEFAULT" since="5" />
+ <field name="CHANNEL_IN_FRONT" since="5" />
+ <field name="CHANNEL_IN_FRONT_PROCESSED" since="5" />
+ <field name="CHANNEL_IN_LEFT" since="5" />
+ <field name="CHANNEL_IN_LEFT_PROCESSED" since="5" />
+ <field name="CHANNEL_IN_MONO" since="5" />
+ <field name="CHANNEL_IN_PRESSURE" since="5" />
+ <field name="CHANNEL_IN_RIGHT" since="5" />
+ <field name="CHANNEL_IN_RIGHT_PROCESSED" since="5" />
+ <field name="CHANNEL_IN_STEREO" since="5" />
+ <field name="CHANNEL_IN_VOICE_DNLINK" since="5" />
+ <field name="CHANNEL_IN_VOICE_UPLINK" since="5" />
+ <field name="CHANNEL_IN_X_AXIS" since="5" />
+ <field name="CHANNEL_IN_Y_AXIS" since="5" />
+ <field name="CHANNEL_IN_Z_AXIS" since="5" />
+ <field name="CHANNEL_OUT_5POINT1" since="5" />
+ <field name="CHANNEL_OUT_7POINT1" since="5" />
+ <field name="CHANNEL_OUT_BACK_CENTER" since="5" />
+ <field name="CHANNEL_OUT_BACK_LEFT" since="5" />
+ <field name="CHANNEL_OUT_BACK_RIGHT" since="5" />
+ <field name="CHANNEL_OUT_DEFAULT" since="5" />
+ <field name="CHANNEL_OUT_FRONT_CENTER" since="5" />
+ <field name="CHANNEL_OUT_FRONT_LEFT" since="5" />
+ <field name="CHANNEL_OUT_FRONT_LEFT_OF_CENTER" since="5" />
+ <field name="CHANNEL_OUT_FRONT_RIGHT" since="5" />
+ <field name="CHANNEL_OUT_FRONT_RIGHT_OF_CENTER" since="5" />
+ <field name="CHANNEL_OUT_LOW_FREQUENCY" since="5" />
+ <field name="CHANNEL_OUT_MONO" since="5" />
+ <field name="CHANNEL_OUT_QUAD" since="5" />
+ <field name="CHANNEL_OUT_SIDE_LEFT" since="21" />
+ <field name="CHANNEL_OUT_SIDE_RIGHT" since="21" />
+ <field name="CHANNEL_OUT_STEREO" since="5" />
+ <field name="CHANNEL_OUT_SURROUND" since="5" />
+ <field name="ENCODING_AC3" since="21" />
+ <field name="ENCODING_DEFAULT" />
+ <field name="ENCODING_E_AC3" since="21" />
+ <field name="ENCODING_INVALID" />
+ <field name="ENCODING_PCM_16BIT" />
+ <field name="ENCODING_PCM_8BIT" />
+ <field name="ENCODING_PCM_FLOAT" since="21" />
+ </class>
+ <class name="android/media/AudioFormat$Builder" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/media/AudioFormat;)V" />
+ <method name="build()Landroid/media/AudioFormat;" />
+ <method name="setChannelMask(I)Landroid/media/AudioFormat$Builder;" />
+ <method name="setEncoding(I)Landroid/media/AudioFormat$Builder;" />
+ <method name="setSampleRate(I)Landroid/media/AudioFormat$Builder;" />
+ </class>
+ <class name="android/media/AudioManager" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="abandonAudioFocus(Landroid/media/AudioManager$OnAudioFocusChangeListener;)I" since="8" />
+ <method name="adjustStreamVolume(III)V" />
+ <method name="adjustSuggestedStreamVolume(III)V" />
+ <method name="adjustVolume(II)V" />
+ <method name="dispatchMediaKeyEvent(Landroid/view/KeyEvent;)V" since="19" />
+ <method name="generateAudioSessionId()I" since="21" />
+ <method name="getMode()I" />
+ <method name="getParameters(Ljava/lang/String;)Ljava/lang/String;" since="5" />
+ <method name="getProperty(Ljava/lang/String;)Ljava/lang/String;" since="17" />
+ <method name="getRingerMode()I" />
+ <method name="getRouting(I)I" />
+ <method name="getStreamMaxVolume(I)I" />
+ <method name="getStreamVolume(I)I" />
+ <method name="getVibrateSetting(I)I" />
+ <method name="isBluetoothA2dpOn()Z" since="3" />
+ <method name="isBluetoothScoAvailableOffCall()Z" since="8" />
+ <method name="isBluetoothScoOn()Z" />
+ <method name="isMicrophoneMute()Z" />
+ <method name="isMusicActive()Z" />
+ <method name="isSpeakerphoneOn()Z" />
+ <method name="isVolumeFixed()Z" since="21" />
+ <method name="isWiredHeadsetOn()Z" since="5" />
+ <method name="loadSoundEffects()V" />
+ <method name="playSoundEffect(I)V" />
+ <method name="playSoundEffect(IF)V" since="3" />
+ <method name="registerMediaButtonEventReceiver(Landroid/app/PendingIntent;)V" since="18" />
+ <method name="registerMediaButtonEventReceiver(Landroid/content/ComponentName;)V" since="8" />
+ <method name="registerRemoteControlClient(Landroid/media/RemoteControlClient;)V" since="14" />
+ <method name="registerRemoteController(Landroid/media/RemoteController;)Z" since="19" />
+ <method name="requestAudioFocus(Landroid/media/AudioManager$OnAudioFocusChangeListener;II)I" since="8" />
+ <method name="setBluetoothA2dpOn(Z)V" since="3" />
+ <method name="setBluetoothScoOn(Z)V" />
+ <method name="setMicrophoneMute(Z)V" />
+ <method name="setMode(I)V" />
+ <method name="setParameters(Ljava/lang/String;)V" since="5" />
+ <method name="setRingerMode(I)V" />
+ <method name="setRouting(III)V" />
+ <method name="setSpeakerphoneOn(Z)V" />
+ <method name="setStreamMute(IZ)V" />
+ <method name="setStreamSolo(IZ)V" />
+ <method name="setStreamVolume(III)V" />
+ <method name="setVibrateSetting(II)V" />
+ <method name="setWiredHeadsetOn(Z)V" since="5" />
+ <method name="shouldVibrate(I)Z" />
+ <method name="startBluetoothSco()V" since="8" />
+ <method name="stopBluetoothSco()V" since="8" />
+ <method name="unloadSoundEffects()V" />
+ <method name="unregisterMediaButtonEventReceiver(Landroid/app/PendingIntent;)V" since="18" />
+ <method name="unregisterMediaButtonEventReceiver(Landroid/content/ComponentName;)V" since="8" />
+ <method name="unregisterRemoteControlClient(Landroid/media/RemoteControlClient;)V" since="14" />
+ <method name="unregisterRemoteController(Landroid/media/RemoteController;)V" since="19" />
+ <field name="ACTION_AUDIO_BECOMING_NOISY" since="3" />
+ <field name="ACTION_HDMI_AUDIO_PLUG" since="21" />
+ <field name="ACTION_HEADSET_PLUG" since="21" />
+ <field name="ACTION_SCO_AUDIO_STATE_CHANGED" since="8" />
+ <field name="ACTION_SCO_AUDIO_STATE_UPDATED" since="14" />
+ <field name="ADJUST_LOWER" />
+ <field name="ADJUST_RAISE" />
+ <field name="ADJUST_SAME" />
+ <field name="AUDIOFOCUS_GAIN" since="8" />
+ <field name="AUDIOFOCUS_GAIN_TRANSIENT" since="8" />
+ <field name="AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE" since="19" />
+ <field name="AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK" since="8" />
+ <field name="AUDIOFOCUS_LOSS" since="8" />
+ <field name="AUDIOFOCUS_LOSS_TRANSIENT" since="8" />
+ <field name="AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK" since="8" />
+ <field name="AUDIOFOCUS_REQUEST_FAILED" since="8" />
+ <field name="AUDIOFOCUS_REQUEST_GRANTED" since="8" />
+ <field name="AUDIO_SESSION_ID_GENERATE" since="21" />
+ <field name="ERROR" since="21" />
+ <field name="ERROR_DEAD_OBJECT" since="21" />
+ <field name="EXTRA_AUDIO_PLUG_STATE" since="21" />
+ <field name="EXTRA_ENCODINGS" since="21" />
+ <field name="EXTRA_MAX_CHANNEL_COUNT" since="21" />
+ <field name="EXTRA_RINGER_MODE" />
+ <field name="EXTRA_SCO_AUDIO_PREVIOUS_STATE" since="14" />
+ <field name="EXTRA_SCO_AUDIO_STATE" since="8" />
+ <field name="EXTRA_VIBRATE_SETTING" />
+ <field name="EXTRA_VIBRATE_TYPE" />
+ <field name="FLAG_ALLOW_RINGER_MODES" />
+ <field name="FLAG_PLAY_SOUND" />
+ <field name="FLAG_REMOVE_SOUND_AND_VIBRATE" />
+ <field name="FLAG_SHOW_UI" />
+ <field name="FLAG_VIBRATE" />
+ <field name="FX_FOCUS_NAVIGATION_DOWN" />
+ <field name="FX_FOCUS_NAVIGATION_LEFT" />
+ <field name="FX_FOCUS_NAVIGATION_RIGHT" />
+ <field name="FX_FOCUS_NAVIGATION_UP" />
+ <field name="FX_KEYPRESS_DELETE" since="3" />
+ <field name="FX_KEYPRESS_INVALID" since="19" />
+ <field name="FX_KEYPRESS_RETURN" since="3" />
+ <field name="FX_KEYPRESS_SPACEBAR" since="3" />
+ <field name="FX_KEYPRESS_STANDARD" since="3" />
+ <field name="FX_KEY_CLICK" />
+ <field name="MODE_CURRENT" />
+ <field name="MODE_INVALID" />
+ <field name="MODE_IN_CALL" />
+ <field name="MODE_IN_COMMUNICATION" since="11" />
+ <field name="MODE_NORMAL" />
+ <field name="MODE_RINGTONE" />
+ <field name="NUM_STREAMS" />
+ <field name="PROPERTY_OUTPUT_FRAMES_PER_BUFFER" since="17" />
+ <field name="PROPERTY_OUTPUT_SAMPLE_RATE" since="17" />
+ <field name="RINGER_MODE_CHANGED_ACTION" />
+ <field name="RINGER_MODE_NORMAL" />
+ <field name="RINGER_MODE_SILENT" />
+ <field name="RINGER_MODE_VIBRATE" />
+ <field name="ROUTE_ALL" />
+ <field name="ROUTE_BLUETOOTH" />
+ <field name="ROUTE_BLUETOOTH_A2DP" since="3" />
+ <field name="ROUTE_BLUETOOTH_SCO" since="3" />
+ <field name="ROUTE_EARPIECE" />
+ <field name="ROUTE_HEADSET" />
+ <field name="ROUTE_SPEAKER" />
+ <field name="SCO_AUDIO_STATE_CONNECTED" since="8" />
+ <field name="SCO_AUDIO_STATE_CONNECTING" since="14" />
+ <field name="SCO_AUDIO_STATE_DISCONNECTED" since="8" />
+ <field name="SCO_AUDIO_STATE_ERROR" since="8" />
+ <field name="STREAM_ALARM" />
+ <field name="STREAM_DTMF" since="5" />
+ <field name="STREAM_MUSIC" />
+ <field name="STREAM_NOTIFICATION" since="3" />
+ <field name="STREAM_RING" />
+ <field name="STREAM_SYSTEM" />
+ <field name="STREAM_VOICE_CALL" />
+ <field name="USE_DEFAULT_STREAM_TYPE" />
+ <field name="VIBRATE_SETTING_CHANGED_ACTION" />
+ <field name="VIBRATE_SETTING_OFF" />
+ <field name="VIBRATE_SETTING_ON" />
+ <field name="VIBRATE_SETTING_ONLY_SILENT" />
+ <field name="VIBRATE_TYPE_NOTIFICATION" />
+ <field name="VIBRATE_TYPE_RINGER" />
+ </class>
+ <class name="android/media/AudioManager$OnAudioFocusChangeListener" since="8">
+ <extends name="java/lang/Object" />
+ <method name="onAudioFocusChange(I)V" />
+ </class>
+ <class name="android/media/AudioRecord" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(IIIII)V" />
+ <method name="getAudioFormat()I" />
+ <method name="getAudioSessionId()I" since="16" />
+ <method name="getAudioSource()I" />
+ <method name="getChannelConfiguration()I" />
+ <method name="getChannelCount()I" />
+ <method name="getMinBufferSize(III)I" />
+ <method name="getNotificationMarkerPosition()I" />
+ <method name="getPositionNotificationPeriod()I" />
+ <method name="getRecordingState()I" />
+ <method name="getSampleRate()I" />
+ <method name="getState()I" />
+ <method name="read(Ljava/nio/ByteBuffer;I)I" />
+ <method name="read([BII)I" />
+ <method name="read([SII)I" />
+ <method name="release()V" />
+ <method name="setNotificationMarkerPosition(I)I" />
+ <method name="setPositionNotificationPeriod(I)I" />
+ <method name="setRecordPositionUpdateListener(Landroid/media/AudioRecord$OnRecordPositionUpdateListener;)V" />
+ <method name="setRecordPositionUpdateListener(Landroid/media/AudioRecord$OnRecordPositionUpdateListener;Landroid/os/Handler;)V" />
+ <method name="startRecording()V" />
+ <method name="startRecording(Landroid/media/MediaSyncEvent;)V" since="16" />
+ <method name="stop()V" />
+ <field name="ERROR" />
+ <field name="ERROR_BAD_VALUE" />
+ <field name="ERROR_INVALID_OPERATION" />
+ <field name="RECORDSTATE_RECORDING" />
+ <field name="RECORDSTATE_STOPPED" />
+ <field name="STATE_INITIALIZED" />
+ <field name="STATE_UNINITIALIZED" />
+ <field name="SUCCESS" />
+ </class>
+ <class name="android/media/AudioRecord$OnRecordPositionUpdateListener" since="3">
+ <extends name="java/lang/Object" />
+ <method name="onMarkerReached(Landroid/media/AudioRecord;)V" />
+ <method name="onPeriodicNotification(Landroid/media/AudioRecord;)V" />
+ </class>
+ <class name="android/media/AudioTimestamp" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="framePosition" />
+ <field name="nanoTime" />
+ </class>
+ <class name="android/media/AudioTrack" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(IIIIII)V" />
+ <method name="&lt;init>(IIIIIII)V" since="9" />
+ <method name="&lt;init>(Landroid/media/AudioAttributes;Landroid/media/AudioFormat;III)V" since="21" />
+ <method name="attachAuxEffect(I)I" since="9" />
+ <method name="flush()V" />
+ <method name="getAudioFormat()I" />
+ <method name="getAudioSessionId()I" since="9" />
+ <method name="getChannelConfiguration()I" />
+ <method name="getChannelCount()I" />
+ <method name="getMaxVolume()F" />
+ <method name="getMinBufferSize(III)I" />
+ <method name="getMinVolume()F" />
+ <method name="getNativeFrameCount()I" />
+ <method name="getNativeOutputSampleRate(I)I" />
+ <method name="getNotificationMarkerPosition()I" />
+ <method name="getPlayState()I" />
+ <method name="getPlaybackHeadPosition()I" />
+ <method name="getPlaybackRate()I" />
+ <method name="getPositionNotificationPeriod()I" />
+ <method name="getSampleRate()I" />
+ <method name="getState()I" />
+ <method name="getStreamType()I" />
+ <method name="getTimestamp(Landroid/media/AudioTimestamp;)Z" since="19" />
+ <method name="pause()V" />
+ <method name="play()V" />
+ <method name="release()V" />
+ <method name="reloadStaticData()I" />
+ <method name="setAuxEffectSendLevel(F)I" since="9" />
+ <method name="setLoopPoints(III)I" />
+ <method name="setNotificationMarkerPosition(I)I" />
+ <method name="setPlaybackHeadPosition(I)I" />
+ <method name="setPlaybackPositionUpdateListener(Landroid/media/AudioTrack$OnPlaybackPositionUpdateListener;)V" />
+ <method name="setPlaybackPositionUpdateListener(Landroid/media/AudioTrack$OnPlaybackPositionUpdateListener;Landroid/os/Handler;)V" />
+ <method name="setPlaybackRate(I)I" />
+ <method name="setPositionNotificationPeriod(I)I" />
+ <method name="setState(I)V" />
+ <method name="setStereoVolume(FF)I" />
+ <method name="setVolume(F)I" since="21" />
+ <method name="stop()V" />
+ <method name="write(Ljava/nio/ByteBuffer;II)I" since="21" />
+ <method name="write([BII)I" />
+ <method name="write([FIII)I" since="21" />
+ <method name="write([SII)I" />
+ <field name="ERROR" />
+ <field name="ERROR_BAD_VALUE" />
+ <field name="ERROR_INVALID_OPERATION" />
+ <field name="MODE_STATIC" />
+ <field name="MODE_STREAM" />
+ <field name="PLAYSTATE_PAUSED" />
+ <field name="PLAYSTATE_PLAYING" />
+ <field name="PLAYSTATE_STOPPED" />
+ <field name="STATE_INITIALIZED" />
+ <field name="STATE_NO_STATIC_DATA" />
+ <field name="STATE_UNINITIALIZED" />
+ <field name="SUCCESS" />
+ <field name="WRITE_BLOCKING" since="21" />
+ <field name="WRITE_NON_BLOCKING" since="21" />
+ </class>
+ <class name="android/media/AudioTrack$OnPlaybackPositionUpdateListener" since="3">
+ <extends name="java/lang/Object" />
+ <method name="onMarkerReached(Landroid/media/AudioTrack;)V" />
+ <method name="onPeriodicNotification(Landroid/media/AudioTrack;)V" />
+ </class>
+ <class name="android/media/CamcorderProfile" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="get(I)Landroid/media/CamcorderProfile;" />
+ <method name="get(II)Landroid/media/CamcorderProfile;" since="9" />
+ <method name="hasProfile(I)Z" since="11" />
+ <method name="hasProfile(II)Z" since="11" />
+ <field name="QUALITY_1080P" since="11" />
+ <field name="QUALITY_2160P" since="21" />
+ <field name="QUALITY_480P" since="11" />
+ <field name="QUALITY_720P" since="11" />
+ <field name="QUALITY_CIF" since="11" />
+ <field name="QUALITY_HIGH" />
+ <field name="QUALITY_HIGH_SPEED_1080P" since="21" />
+ <field name="QUALITY_HIGH_SPEED_2160P" since="21" />
+ <field name="QUALITY_HIGH_SPEED_480P" since="21" />
+ <field name="QUALITY_HIGH_SPEED_720P" since="21" />
+ <field name="QUALITY_HIGH_SPEED_HIGH" since="21" />
+ <field name="QUALITY_HIGH_SPEED_LOW" since="21" />
+ <field name="QUALITY_LOW" />
+ <field name="QUALITY_QCIF" since="11" />
+ <field name="QUALITY_QVGA" since="15" />
+ <field name="QUALITY_TIME_LAPSE_1080P" since="11" />
+ <field name="QUALITY_TIME_LAPSE_2160P" since="21" />
+ <field name="QUALITY_TIME_LAPSE_480P" since="11" />
+ <field name="QUALITY_TIME_LAPSE_720P" since="11" />
+ <field name="QUALITY_TIME_LAPSE_CIF" since="11" />
+ <field name="QUALITY_TIME_LAPSE_HIGH" since="11" />
+ <field name="QUALITY_TIME_LAPSE_LOW" since="11" />
+ <field name="QUALITY_TIME_LAPSE_QCIF" since="11" />
+ <field name="QUALITY_TIME_LAPSE_QVGA" since="15" />
+ <field name="audioBitRate" />
+ <field name="audioChannels" />
+ <field name="audioCodec" />
+ <field name="audioSampleRate" />
+ <field name="duration" />
+ <field name="fileFormat" />
+ <field name="quality" />
+ <field name="videoBitRate" />
+ <field name="videoCodec" />
+ <field name="videoFrameHeight" />
+ <field name="videoFrameRate" />
+ <field name="videoFrameWidth" />
+ </class>
+ <class name="android/media/CameraProfile" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getJpegEncodingQualityParameter(I)I" />
+ <method name="getJpegEncodingQualityParameter(II)I" since="9" />
+ <field name="QUALITY_HIGH" />
+ <field name="QUALITY_LOW" />
+ <field name="QUALITY_MEDIUM" />
+ </class>
+ <class name="android/media/DeniedByServerException" since="18">
+ <extends name="android/media/MediaDrmException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/media/ExifInterface" since="5">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getAltitude(D)D" since="9" />
+ <method name="getAttribute(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getAttributeDouble(Ljava/lang/String;D)D" since="8" />
+ <method name="getAttributeInt(Ljava/lang/String;I)I" />
+ <method name="getLatLong([F)Z" />
+ <method name="getThumbnail()[B" />
+ <method name="hasThumbnail()Z" />
+ <method name="saveAttributes()V" />
+ <method name="setAttribute(Ljava/lang/String;Ljava/lang/String;)V" />
+ <field name="ORIENTATION_FLIP_HORIZONTAL" />
+ <field name="ORIENTATION_FLIP_VERTICAL" />
+ <field name="ORIENTATION_NORMAL" />
+ <field name="ORIENTATION_ROTATE_180" />
+ <field name="ORIENTATION_ROTATE_270" />
+ <field name="ORIENTATION_ROTATE_90" />
+ <field name="ORIENTATION_TRANSPOSE" />
+ <field name="ORIENTATION_TRANSVERSE" />
+ <field name="ORIENTATION_UNDEFINED" />
+ <field name="TAG_APERTURE" since="11" />
+ <field name="TAG_DATETIME" />
+ <field name="TAG_EXPOSURE_TIME" since="11" />
+ <field name="TAG_FLASH" />
+ <field name="TAG_FOCAL_LENGTH" since="8" />
+ <field name="TAG_GPS_ALTITUDE" since="9" />
+ <field name="TAG_GPS_ALTITUDE_REF" since="9" />
+ <field name="TAG_GPS_DATESTAMP" since="8" />
+ <field name="TAG_GPS_LATITUDE" />
+ <field name="TAG_GPS_LATITUDE_REF" />
+ <field name="TAG_GPS_LONGITUDE" />
+ <field name="TAG_GPS_LONGITUDE_REF" />
+ <field name="TAG_GPS_PROCESSING_METHOD" since="8" />
+ <field name="TAG_GPS_TIMESTAMP" since="8" />
+ <field name="TAG_IMAGE_LENGTH" />
+ <field name="TAG_IMAGE_WIDTH" />
+ <field name="TAG_ISO" since="11" />
+ <field name="TAG_MAKE" />
+ <field name="TAG_MODEL" />
+ <field name="TAG_ORIENTATION" />
+ <field name="TAG_WHITE_BALANCE" />
+ <field name="WHITEBALANCE_AUTO" />
+ <field name="WHITEBALANCE_MANUAL" />
+ </class>
+ <class name="android/media/FaceDetector" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(III)V" />
+ <method name="findFaces(Landroid/graphics/Bitmap;[Landroid/media/FaceDetector$Face;)I" />
+ </class>
+ <class name="android/media/FaceDetector$Face" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/media/FaceDetector;)V" />
+ <method name="confidence()F" />
+ <method name="eyesDistance()F" />
+ <method name="getMidPoint(Landroid/graphics/PointF;)V" />
+ <method name="pose(I)F" />
+ <field name="CONFIDENCE_THRESHOLD" />
+ <field name="EULER_X" />
+ <field name="EULER_Y" />
+ <field name="EULER_Z" />
+ </class>
+ <class name="android/media/Image" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/AutoCloseable" />
+ <method name="&lt;init>()V" />
+ <method name="getCropRect()Landroid/graphics/Rect;" since="21" />
+ <method name="getFormat()I" />
+ <method name="getHeight()I" />
+ <method name="getPlanes()[Landroid/media/Image$Plane;" />
+ <method name="getTimestamp()J" />
+ <method name="getWidth()I" />
+ <method name="setCropRect(Landroid/graphics/Rect;)V" since="21" />
+ </class>
+ <class name="android/media/Image$Plane" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getBuffer()Ljava/nio/ByteBuffer;" />
+ <method name="getPixelStride()I" />
+ <method name="getRowStride()I" />
+ </class>
+ <class name="android/media/ImageReader" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/AutoCloseable" />
+ <method name="&lt;init>()V" />
+ <method name="acquireLatestImage()Landroid/media/Image;" />
+ <method name="acquireNextImage()Landroid/media/Image;" />
+ <method name="getHeight()I" />
+ <method name="getImageFormat()I" />
+ <method name="getMaxImages()I" />
+ <method name="getSurface()Landroid/view/Surface;" />
+ <method name="getWidth()I" />
+ <method name="newInstance(IIII)Landroid/media/ImageReader;" />
+ <method name="setOnImageAvailableListener(Landroid/media/ImageReader$OnImageAvailableListener;Landroid/os/Handler;)V" />
+ </class>
+ <class name="android/media/ImageReader$OnImageAvailableListener" since="19">
+ <extends name="java/lang/Object" />
+ <method name="onImageAvailable(Landroid/media/ImageReader;)V" />
+ </class>
+ <class name="android/media/JetPlayer" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="clearQueue()Z" />
+ <method name="closeJetFile()Z" />
+ <method name="getJetPlayer()Landroid/media/JetPlayer;" />
+ <method name="getMaxTracks()I" />
+ <method name="loadJetFile(Landroid/content/res/AssetFileDescriptor;)Z" />
+ <method name="loadJetFile(Ljava/lang/String;)Z" />
+ <method name="pause()Z" />
+ <method name="play()Z" />
+ <method name="queueJetSegment(IIIIIB)Z" />
+ <method name="queueJetSegmentMuteArray(IIII[ZB)Z" />
+ <method name="release()V" />
+ <method name="setEventListener(Landroid/media/JetPlayer$OnJetEventListener;)V" />
+ <method name="setEventListener(Landroid/media/JetPlayer$OnJetEventListener;Landroid/os/Handler;)V" />
+ <method name="setMuteArray([ZZ)Z" />
+ <method name="setMuteFlag(IZZ)Z" />
+ <method name="setMuteFlags(IZ)Z" />
+ <method name="triggerClip(I)Z" />
+ </class>
+ <class name="android/media/JetPlayer$OnJetEventListener" since="3">
+ <extends name="java/lang/Object" />
+ <method name="onJetEvent(Landroid/media/JetPlayer;SBBBB)V" />
+ <method name="onJetNumQueuedSegmentUpdate(Landroid/media/JetPlayer;I)V" />
+ <method name="onJetPauseUpdate(Landroid/media/JetPlayer;I)V" />
+ <method name="onJetUserIdUpdate(Landroid/media/JetPlayer;II)V" />
+ </class>
+ <class name="android/media/MediaActionSound" since="16">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="load(I)V" />
+ <method name="play(I)V" />
+ <method name="release()V" />
+ <field name="FOCUS_COMPLETE" />
+ <field name="SHUTTER_CLICK" />
+ <field name="START_VIDEO_RECORDING" />
+ <field name="STOP_VIDEO_RECORDING" />
+ </class>
+ <class name="android/media/MediaCodec" since="16">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="configure(Landroid/media/MediaFormat;Landroid/view/Surface;Landroid/media/MediaCrypto;I)V" />
+ <method name="createByCodecName(Ljava/lang/String;)Landroid/media/MediaCodec;" />
+ <method name="createDecoderByType(Ljava/lang/String;)Landroid/media/MediaCodec;" />
+ <method name="createEncoderByType(Ljava/lang/String;)Landroid/media/MediaCodec;" />
+ <method name="createInputSurface()Landroid/view/Surface;" since="18" />
+ <method name="dequeueInputBuffer(J)I" />
+ <method name="dequeueOutputBuffer(Landroid/media/MediaCodec$BufferInfo;J)I" />
+ <method name="flush()V" />
+ <method name="getCodecInfo()Landroid/media/MediaCodecInfo;" since="18" />
+ <method name="getInputBuffer(I)Ljava/nio/ByteBuffer;" since="21" />
+ <method name="getInputBuffers()[Ljava/nio/ByteBuffer;" />
+ <method name="getInputFormat()Landroid/media/MediaFormat;" since="21" />
+ <method name="getInputImage(I)Landroid/media/Image;" since="21" />
+ <method name="getName()Ljava/lang/String;" since="18" />
+ <method name="getOutputBuffer(I)Ljava/nio/ByteBuffer;" since="21" />
+ <method name="getOutputBuffers()[Ljava/nio/ByteBuffer;" />
+ <method name="getOutputFormat()Landroid/media/MediaFormat;" />
+ <method name="getOutputFormat(I)Landroid/media/MediaFormat;" since="21" />
+ <method name="getOutputImage(I)Landroid/media/Image;" since="21" />
+ <method name="queueInputBuffer(IIIJI)V" />
+ <method name="queueSecureInputBuffer(IILandroid/media/MediaCodec$CryptoInfo;JI)V" />
+ <method name="release()V" />
+ <method name="releaseOutputBuffer(IJ)V" since="21" />
+ <method name="releaseOutputBuffer(IZ)V" />
+ <method name="reset()V" since="21" />
+ <method name="setCallback(Landroid/media/MediaCodec$Callback;)V" since="21" />
+ <method name="setParameters(Landroid/os/Bundle;)V" since="19" />
+ <method name="setVideoScalingMode(I)V" />
+ <method name="signalEndOfInputStream()V" since="18" />
+ <method name="start()V" />
+ <method name="stop()V" />
+ <field name="BUFFER_FLAG_CODEC_CONFIG" />
+ <field name="BUFFER_FLAG_END_OF_STREAM" />
+ <field name="BUFFER_FLAG_KEY_FRAME" since="21" />
+ <field name="BUFFER_FLAG_SYNC_FRAME" />
+ <field name="CONFIGURE_FLAG_ENCODE" />
+ <field name="CRYPTO_MODE_AES_CTR" />
+ <field name="CRYPTO_MODE_UNENCRYPTED" />
+ <field name="INFO_OUTPUT_BUFFERS_CHANGED" />
+ <field name="INFO_OUTPUT_FORMAT_CHANGED" />
+ <field name="INFO_TRY_AGAIN_LATER" />
+ <field name="PARAMETER_KEY_REQUEST_SYNC_FRAME" since="19" />
+ <field name="PARAMETER_KEY_SUSPEND" since="19" />
+ <field name="PARAMETER_KEY_VIDEO_BITRATE" since="19" />
+ <field name="VIDEO_SCALING_MODE_SCALE_TO_FIT" />
+ <field name="VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING" />
+ </class>
+ <class name="android/media/MediaCodec$BufferInfo" since="16">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="set(IIJI)V" />
+ <field name="flags" />
+ <field name="offset" />
+ <field name="presentationTimeUs" />
+ <field name="size" />
+ </class>
+ <class name="android/media/MediaCodec$Callback" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onError(Landroid/media/MediaCodec;Landroid/media/MediaCodec$CodecException;)V" />
+ <method name="onInputBufferAvailable(Landroid/media/MediaCodec;I)V" />
+ <method name="onOutputBufferAvailable(Landroid/media/MediaCodec;ILandroid/media/MediaCodec$BufferInfo;)V" />
+ <method name="onOutputFormatChanged(Landroid/media/MediaCodec;Landroid/media/MediaFormat;)V" />
+ </class>
+ <class name="android/media/MediaCodec$CodecException" since="21">
+ <extends name="java/lang/IllegalStateException" />
+ <method name="&lt;init>()V" />
+ <method name="getDiagnosticInfo()Ljava/lang/String;" />
+ <method name="isRecoverable()Z" />
+ <method name="isTransient()Z" />
+ </class>
+ <class name="android/media/MediaCodec$CryptoException" since="16">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>(ILjava/lang/String;)V" />
+ <method name="getErrorCode()I" />
+ <field name="ERROR_INSUFFICIENT_OUTPUT_PROTECTION" since="21" />
+ <field name="ERROR_KEY_EXPIRED" since="19" />
+ <field name="ERROR_NO_KEY" since="19" />
+ <field name="ERROR_RESOURCE_BUSY" since="19" />
+ </class>
+ <class name="android/media/MediaCodec$CryptoInfo" since="16">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="set(I[I[I[B[BI)V" />
+ <field name="iv" />
+ <field name="key" />
+ <field name="mode" />
+ <field name="numBytesOfClearData" />
+ <field name="numBytesOfEncryptedData" />
+ <field name="numSubSamples" />
+ </class>
+ <class name="android/media/MediaCodecInfo" since="16">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getCapabilitiesForType(Ljava/lang/String;)Landroid/media/MediaCodecInfo$CodecCapabilities;" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getSupportedTypes()[Ljava/lang/String;" />
+ <method name="isEncoder()Z" />
+ </class>
+ <class name="android/media/MediaCodecInfo$AudioCapabilities" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getBitrateRange()Landroid/util/Range;" />
+ <method name="getMaxInputChannelCount()I" />
+ <method name="getSupportedSampleRateRanges()[Landroid/util/Range;" />
+ <method name="getSupportedSampleRates()[I" />
+ <method name="isSampleRateSupported(I)Z" />
+ </class>
+ <class name="android/media/MediaCodecInfo$CodecCapabilities" since="16">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="createFromProfileLevel(Ljava/lang/String;II)Landroid/media/MediaCodecInfo$CodecCapabilities;" since="21" />
+ <method name="getAudioCapabilities()Landroid/media/MediaCodecInfo$AudioCapabilities;" since="21" />
+ <method name="getDefaultFormat()Landroid/media/MediaFormat;" since="21" />
+ <method name="getEncoderCapabilities()Landroid/media/MediaCodecInfo$EncoderCapabilities;" since="21" />
+ <method name="getMimeType()Ljava/lang/String;" since="21" />
+ <method name="getVideoCapabilities()Landroid/media/MediaCodecInfo$VideoCapabilities;" since="21" />
+ <method name="isFeatureRequired(Ljava/lang/String;)Z" since="21" />
+ <method name="isFeatureSupported(Ljava/lang/String;)Z" since="19" />
+ <method name="isFormatSupported(Landroid/media/MediaFormat;)Z" since="21" />
+ <field name="COLOR_Format12bitRGB444" />
+ <field name="COLOR_Format16bitARGB1555" />
+ <field name="COLOR_Format16bitARGB4444" />
+ <field name="COLOR_Format16bitBGR565" />
+ <field name="COLOR_Format16bitRGB565" />
+ <field name="COLOR_Format18BitBGR666" />
+ <field name="COLOR_Format18bitARGB1665" />
+ <field name="COLOR_Format18bitRGB666" />
+ <field name="COLOR_Format19bitARGB1666" />
+ <field name="COLOR_Format24BitABGR6666" />
+ <field name="COLOR_Format24BitARGB6666" />
+ <field name="COLOR_Format24bitARGB1887" />
+ <field name="COLOR_Format24bitBGR888" />
+ <field name="COLOR_Format24bitRGB888" />
+ <field name="COLOR_Format25bitARGB1888" />
+ <field name="COLOR_Format32bitARGB8888" />
+ <field name="COLOR_Format32bitBGRA8888" />
+ <field name="COLOR_Format8bitRGB332" />
+ <field name="COLOR_FormatCbYCrY" />
+ <field name="COLOR_FormatCrYCbY" />
+ <field name="COLOR_FormatL16" />
+ <field name="COLOR_FormatL2" />
+ <field name="COLOR_FormatL24" />
+ <field name="COLOR_FormatL32" />
+ <field name="COLOR_FormatL4" />
+ <field name="COLOR_FormatL8" />
+ <field name="COLOR_FormatMonochrome" />
+ <field name="COLOR_FormatRawBayer10bit" />
+ <field name="COLOR_FormatRawBayer8bit" />
+ <field name="COLOR_FormatRawBayer8bitcompressed" />
+ <field name="COLOR_FormatSurface" since="18" />
+ <field name="COLOR_FormatYCbYCr" />
+ <field name="COLOR_FormatYCrYCb" />
+ <field name="COLOR_FormatYUV411PackedPlanar" />
+ <field name="COLOR_FormatYUV411Planar" />
+ <field name="COLOR_FormatYUV420Flexible" since="21" />
+ <field name="COLOR_FormatYUV420PackedPlanar" />
+ <field name="COLOR_FormatYUV420PackedSemiPlanar" />
+ <field name="COLOR_FormatYUV420Planar" />
+ <field name="COLOR_FormatYUV420SemiPlanar" />
+ <field name="COLOR_FormatYUV422PackedPlanar" />
+ <field name="COLOR_FormatYUV422PackedSemiPlanar" />
+ <field name="COLOR_FormatYUV422Planar" />
+ <field name="COLOR_FormatYUV422SemiPlanar" />
+ <field name="COLOR_FormatYUV444Interleaved" />
+ <field name="COLOR_QCOM_FormatYUV420SemiPlanar" />
+ <field name="COLOR_TI_FormatYUV420PackedSemiPlanar" />
+ <field name="FEATURE_AdaptivePlayback" since="19" />
+ <field name="FEATURE_SecurePlayback" since="21" />
+ <field name="FEATURE_TunneledPlayback" since="21" />
+ <field name="colorFormats" />
+ <field name="profileLevels" />
+ </class>
+ <class name="android/media/MediaCodecInfo$CodecProfileLevel" since="16">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="AACObjectELD" />
+ <field name="AACObjectERLC" />
+ <field name="AACObjectHE" />
+ <field name="AACObjectHE_PS" />
+ <field name="AACObjectLC" />
+ <field name="AACObjectLD" />
+ <field name="AACObjectLTP" />
+ <field name="AACObjectMain" />
+ <field name="AACObjectSSR" />
+ <field name="AACObjectScalable" />
+ <field name="AVCLevel1" />
+ <field name="AVCLevel11" />
+ <field name="AVCLevel12" />
+ <field name="AVCLevel13" />
+ <field name="AVCLevel1b" />
+ <field name="AVCLevel2" />
+ <field name="AVCLevel21" />
+ <field name="AVCLevel22" />
+ <field name="AVCLevel3" />
+ <field name="AVCLevel31" />
+ <field name="AVCLevel32" />
+ <field name="AVCLevel4" />
+ <field name="AVCLevel41" />
+ <field name="AVCLevel42" />
+ <field name="AVCLevel5" />
+ <field name="AVCLevel51" />
+ <field name="AVCLevel52" since="21" />
+ <field name="AVCProfileBaseline" />
+ <field name="AVCProfileExtended" />
+ <field name="AVCProfileHigh" />
+ <field name="AVCProfileHigh10" />
+ <field name="AVCProfileHigh422" />
+ <field name="AVCProfileHigh444" />
+ <field name="AVCProfileMain" />
+ <field name="H263Level10" />
+ <field name="H263Level20" />
+ <field name="H263Level30" />
+ <field name="H263Level40" />
+ <field name="H263Level45" />
+ <field name="H263Level50" />
+ <field name="H263Level60" />
+ <field name="H263Level70" />
+ <field name="H263ProfileBackwardCompatible" />
+ <field name="H263ProfileBaseline" />
+ <field name="H263ProfileH320Coding" />
+ <field name="H263ProfileHighCompression" />
+ <field name="H263ProfileHighLatency" />
+ <field name="H263ProfileISWV2" />
+ <field name="H263ProfileISWV3" />
+ <field name="H263ProfileInterlace" />
+ <field name="H263ProfileInternet" />
+ <field name="HEVCHighTierLevel1" since="21" />
+ <field name="HEVCHighTierLevel2" since="21" />
+ <field name="HEVCHighTierLevel21" since="21" />
+ <field name="HEVCHighTierLevel3" since="21" />
+ <field name="HEVCHighTierLevel31" since="21" />
+ <field name="HEVCHighTierLevel4" since="21" />
+ <field name="HEVCHighTierLevel41" since="21" />
+ <field name="HEVCHighTierLevel5" since="21" />
+ <field name="HEVCHighTierLevel51" since="21" />
+ <field name="HEVCHighTierLevel52" since="21" />
+ <field name="HEVCHighTierLevel6" since="21" />
+ <field name="HEVCHighTierLevel61" since="21" />
+ <field name="HEVCHighTierLevel62" since="21" />
+ <field name="HEVCMainTierLevel1" since="21" />
+ <field name="HEVCMainTierLevel2" since="21" />
+ <field name="HEVCMainTierLevel21" since="21" />
+ <field name="HEVCMainTierLevel3" since="21" />
+ <field name="HEVCMainTierLevel31" since="21" />
+ <field name="HEVCMainTierLevel4" since="21" />
+ <field name="HEVCMainTierLevel41" since="21" />
+ <field name="HEVCMainTierLevel5" since="21" />
+ <field name="HEVCMainTierLevel51" since="21" />
+ <field name="HEVCMainTierLevel52" since="21" />
+ <field name="HEVCMainTierLevel6" since="21" />
+ <field name="HEVCMainTierLevel61" since="21" />
+ <field name="HEVCMainTierLevel62" since="21" />
+ <field name="HEVCProfileMain" since="21" />
+ <field name="HEVCProfileMain10" since="21" />
+ <field name="MPEG4Level0" />
+ <field name="MPEG4Level0b" />
+ <field name="MPEG4Level1" />
+ <field name="MPEG4Level2" />
+ <field name="MPEG4Level3" />
+ <field name="MPEG4Level4" />
+ <field name="MPEG4Level4a" />
+ <field name="MPEG4Level5" />
+ <field name="MPEG4ProfileAdvancedCoding" />
+ <field name="MPEG4ProfileAdvancedCore" />
+ <field name="MPEG4ProfileAdvancedRealTime" />
+ <field name="MPEG4ProfileAdvancedScalable" />
+ <field name="MPEG4ProfileAdvancedSimple" />
+ <field name="MPEG4ProfileBasicAnimated" />
+ <field name="MPEG4ProfileCore" />
+ <field name="MPEG4ProfileCoreScalable" />
+ <field name="MPEG4ProfileHybrid" />
+ <field name="MPEG4ProfileMain" />
+ <field name="MPEG4ProfileNbit" />
+ <field name="MPEG4ProfileScalableTexture" />
+ <field name="MPEG4ProfileSimple" />
+ <field name="MPEG4ProfileSimpleFBA" />
+ <field name="MPEG4ProfileSimpleFace" />
+ <field name="MPEG4ProfileSimpleScalable" />
+ <field name="VP8Level_Version0" since="18" />
+ <field name="VP8Level_Version1" since="18" />
+ <field name="VP8Level_Version2" since="18" />
+ <field name="VP8Level_Version3" since="18" />
+ <field name="VP8ProfileMain" since="18" />
+ <field name="level" />
+ <field name="profile" />
+ </class>
+ <class name="android/media/MediaCodecInfo$EncoderCapabilities" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getComplexityRange()Landroid/util/Range;" />
+ <method name="isBitrateModeSupported(I)Z" />
+ <field name="BITRATE_MODE_CBR" />
+ <field name="BITRATE_MODE_CQ" />
+ <field name="BITRATE_MODE_VBR" />
+ </class>
+ <class name="android/media/MediaCodecInfo$VideoCapabilities" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="areSizeAndRateSupported(IID)Z" />
+ <method name="getBitrateRange()Landroid/util/Range;" />
+ <method name="getHeightAlignment()I" />
+ <method name="getSupportedFrameRates()Landroid/util/Range;" />
+ <method name="getSupportedFrameRatesFor(II)Landroid/util/Range;" />
+ <method name="getSupportedHeights()Landroid/util/Range;" />
+ <method name="getSupportedHeightsFor(I)Landroid/util/Range;" />
+ <method name="getSupportedWidths()Landroid/util/Range;" />
+ <method name="getSupportedWidthsFor(I)Landroid/util/Range;" />
+ <method name="getWidthAlignment()I" />
+ <method name="isSizeSupported(II)Z" />
+ </class>
+ <class name="android/media/MediaCodecList" since="16">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" since="21" />
+ <method name="findDecoderForFormat(Landroid/media/MediaFormat;)Ljava/lang/String;" since="21" />
+ <method name="findEncoderForFormat(Landroid/media/MediaFormat;)Ljava/lang/String;" since="21" />
+ <method name="getCodecCount()I" />
+ <method name="getCodecInfoAt(I)Landroid/media/MediaCodecInfo;" />
+ <method name="getCodecInfos()[Landroid/media/MediaCodecInfo;" since="21" />
+ <field name="ALL_CODECS" since="21" />
+ <field name="REGULAR_CODECS" since="21" />
+ </class>
+ <class name="android/media/MediaCrypto" since="16">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/util/UUID;[B)V" />
+ <method name="isCryptoSchemeSupported(Ljava/util/UUID;)Z" />
+ <method name="release()V" />
+ <method name="requiresSecureDecoderComponent(Ljava/lang/String;)Z" />
+ </class>
+ <class name="android/media/MediaCryptoException" since="16">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/media/MediaDescription" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getDescription()Ljava/lang/CharSequence;" />
+ <method name="getExtras()Landroid/os/Bundle;" />
+ <method name="getIconBitmap()Landroid/graphics/Bitmap;" />
+ <method name="getIconUri()Landroid/net/Uri;" />
+ <method name="getMediaId()Ljava/lang/String;" />
+ <method name="getSubtitle()Ljava/lang/CharSequence;" />
+ <method name="getTitle()Ljava/lang/CharSequence;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/media/MediaDescription$Builder" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="build()Landroid/media/MediaDescription;" />
+ <method name="setDescription(Ljava/lang/CharSequence;)Landroid/media/MediaDescription$Builder;" />
+ <method name="setExtras(Landroid/os/Bundle;)Landroid/media/MediaDescription$Builder;" />
+ <method name="setIconBitmap(Landroid/graphics/Bitmap;)Landroid/media/MediaDescription$Builder;" />
+ <method name="setIconUri(Landroid/net/Uri;)Landroid/media/MediaDescription$Builder;" />
+ <method name="setMediaId(Ljava/lang/String;)Landroid/media/MediaDescription$Builder;" />
+ <method name="setSubtitle(Ljava/lang/CharSequence;)Landroid/media/MediaDescription$Builder;" />
+ <method name="setTitle(Ljava/lang/CharSequence;)Landroid/media/MediaDescription$Builder;" />
+ </class>
+ <class name="android/media/MediaDrm" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/util/UUID;)V" />
+ <method name="closeSession([B)V" />
+ <method name="getCryptoSession([BLjava/lang/String;Ljava/lang/String;)Landroid/media/MediaDrm$CryptoSession;" />
+ <method name="getKeyRequest([B[BLjava/lang/String;ILjava/util/HashMap;)Landroid/media/MediaDrm$KeyRequest;" />
+ <method name="getPropertyByteArray(Ljava/lang/String;)[B" />
+ <method name="getPropertyString(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getProvisionRequest()Landroid/media/MediaDrm$ProvisionRequest;" />
+ <method name="getSecureStops()Ljava/util/List;" />
+ <method name="isCryptoSchemeSupported(Ljava/util/UUID;)Z" />
+ <method name="isCryptoSchemeSupported(Ljava/util/UUID;Ljava/lang/String;)Z" since="19" />
+ <method name="openSession()[B" />
+ <method name="provideKeyResponse([B[B)[B" />
+ <method name="provideProvisionResponse([B)V" />
+ <method name="queryKeyStatus([B)Ljava/util/HashMap;" />
+ <method name="release()V" />
+ <method name="releaseSecureStops([B)V" />
+ <method name="removeKeys([B)V" />
+ <method name="restoreKeys([B[B)V" />
+ <method name="setOnEventListener(Landroid/media/MediaDrm$OnEventListener;)V" />
+ <method name="setPropertyByteArray(Ljava/lang/String;[B)V" />
+ <method name="setPropertyString(Ljava/lang/String;Ljava/lang/String;)V" />
+ <field name="EVENT_KEY_EXPIRED" />
+ <field name="EVENT_KEY_REQUIRED" />
+ <field name="EVENT_PROVISION_REQUIRED" />
+ <field name="EVENT_VENDOR_DEFINED" />
+ <field name="KEY_TYPE_OFFLINE" />
+ <field name="KEY_TYPE_RELEASE" />
+ <field name="KEY_TYPE_STREAMING" />
+ <field name="PROPERTY_ALGORITHMS" />
+ <field name="PROPERTY_DESCRIPTION" />
+ <field name="PROPERTY_DEVICE_UNIQUE_ID" />
+ <field name="PROPERTY_VENDOR" />
+ <field name="PROPERTY_VERSION" />
+ </class>
+ <class name="android/media/MediaDrm$CryptoSession" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/media/MediaDrm;)V" />
+ <method name="decrypt([B[B[B)[B" />
+ <method name="encrypt([B[B[B)[B" />
+ <method name="sign([B[B)[B" />
+ <method name="verify([B[B[B)Z" />
+ </class>
+ <class name="android/media/MediaDrm$KeyRequest" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getData()[B" />
+ <method name="getDefaultUrl()Ljava/lang/String;" />
+ </class>
+ <class name="android/media/MediaDrm$MediaDrmStateException" since="21">
+ <extends name="java/lang/IllegalStateException" />
+ <method name="&lt;init>()V" />
+ <method name="getDiagnosticInfo()Ljava/lang/String;" />
+ </class>
+ <class name="android/media/MediaDrm$OnEventListener" since="18">
+ <extends name="java/lang/Object" />
+ <method name="onEvent(Landroid/media/MediaDrm;[BII[B)V" />
+ </class>
+ <class name="android/media/MediaDrm$ProvisionRequest" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getData()[B" />
+ <method name="getDefaultUrl()Ljava/lang/String;" />
+ </class>
+ <class name="android/media/MediaDrmException" since="18">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/media/MediaExtractor" since="16">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="advance()Z" />
+ <method name="getCachedDuration()J" />
+ <method name="getPsshInfo()Ljava/util/Map;" since="18" />
+ <method name="getSampleCryptoInfo(Landroid/media/MediaCodec$CryptoInfo;)Z" />
+ <method name="getSampleFlags()I" />
+ <method name="getSampleTime()J" />
+ <method name="getSampleTrackIndex()I" />
+ <method name="getTrackCount()I" />
+ <method name="getTrackFormat(I)Landroid/media/MediaFormat;" />
+ <method name="hasCacheReachedEndOfStream()Z" />
+ <method name="readSampleData(Ljava/nio/ByteBuffer;I)I" />
+ <method name="release()V" />
+ <method name="seekTo(JI)V" />
+ <method name="selectTrack(I)V" />
+ <method name="setDataSource(Landroid/content/Context;Landroid/net/Uri;Ljava/util/Map;)V" />
+ <method name="setDataSource(Ljava/io/FileDescriptor;)V" />
+ <method name="setDataSource(Ljava/io/FileDescriptor;JJ)V" />
+ <method name="setDataSource(Ljava/lang/String;)V" />
+ <method name="setDataSource(Ljava/lang/String;Ljava/util/Map;)V" />
+ <method name="unselectTrack(I)V" />
+ <field name="SAMPLE_FLAG_ENCRYPTED" />
+ <field name="SAMPLE_FLAG_SYNC" />
+ <field name="SEEK_TO_CLOSEST_SYNC" />
+ <field name="SEEK_TO_NEXT_SYNC" />
+ <field name="SEEK_TO_PREVIOUS_SYNC" />
+ </class>
+ <class name="android/media/MediaFormat" since="16">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="containsKey(Ljava/lang/String;)Z" />
+ <method name="createAudioFormat(Ljava/lang/String;II)Landroid/media/MediaFormat;" />
+ <method name="createSubtitleFormat(Ljava/lang/String;Ljava/lang/String;)Landroid/media/MediaFormat;" since="19" />
+ <method name="createVideoFormat(Ljava/lang/String;II)Landroid/media/MediaFormat;" />
+ <method name="getByteBuffer(Ljava/lang/String;)Ljava/nio/ByteBuffer;" />
+ <method name="getFeatureEnabled(Ljava/lang/String;)Z" since="21" />
+ <method name="getFloat(Ljava/lang/String;)F" />
+ <method name="getInteger(Ljava/lang/String;)I" />
+ <method name="getLong(Ljava/lang/String;)J" />
+ <method name="getString(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="setByteBuffer(Ljava/lang/String;Ljava/nio/ByteBuffer;)V" />
+ <method name="setFeatureEnabled(Ljava/lang/String;Z)V" since="21" />
+ <method name="setFloat(Ljava/lang/String;F)V" />
+ <method name="setInteger(Ljava/lang/String;I)V" />
+ <method name="setLong(Ljava/lang/String;J)V" />
+ <method name="setString(Ljava/lang/String;Ljava/lang/String;)V" />
+ <field name="KEY_AAC_DRC_ATTENUATION_FACTOR" since="21" />
+ <field name="KEY_AAC_DRC_BOOST_FACTOR" since="21" />
+ <field name="KEY_AAC_DRC_HEAVY_COMPRESSION" since="21" />
+ <field name="KEY_AAC_DRC_TARGET_REFERENCE_LEVEL" since="21" />
+ <field name="KEY_AAC_ENCODED_TARGET_LEVEL" since="21" />
+ <field name="KEY_AAC_MAX_OUTPUT_CHANNEL_COUNT" since="21" />
+ <field name="KEY_AAC_PROFILE" />
+ <field name="KEY_AAC_SBR_MODE" since="21" />
+ <field name="KEY_AUDIO_SESSION_ID" since="21" />
+ <field name="KEY_BITRATE_MODE" since="21" />
+ <field name="KEY_BIT_RATE" />
+ <field name="KEY_CAPTURE_RATE" since="21" />
+ <field name="KEY_CHANNEL_COUNT" />
+ <field name="KEY_CHANNEL_MASK" />
+ <field name="KEY_COLOR_FORMAT" />
+ <field name="KEY_COMPLEXITY" since="21" />
+ <field name="KEY_DURATION" />
+ <field name="KEY_FLAC_COMPRESSION_LEVEL" />
+ <field name="KEY_FRAME_RATE" />
+ <field name="KEY_HEIGHT" />
+ <field name="KEY_IS_ADTS" />
+ <field name="KEY_IS_AUTOSELECT" since="19" />
+ <field name="KEY_IS_DEFAULT" since="19" />
+ <field name="KEY_IS_FORCED_SUBTITLE" since="19" />
+ <field name="KEY_I_FRAME_INTERVAL" />
+ <field name="KEY_LANGUAGE" since="19" />
+ <field name="KEY_MAX_HEIGHT" since="19" />
+ <field name="KEY_MAX_INPUT_SIZE" />
+ <field name="KEY_MAX_WIDTH" since="19" />
+ <field name="KEY_MIME" />
+ <field name="KEY_PROFILE" since="21" />
+ <field name="KEY_PUSH_BLANK_BUFFERS_ON_STOP" since="19" />
+ <field name="KEY_REPEAT_PREVIOUS_FRAME_AFTER" since="19" />
+ <field name="KEY_SAMPLE_RATE" />
+ <field name="KEY_TEMPORAL_LAYERING" since="21" />
+ <field name="KEY_WIDTH" />
+ <field name="MIMETYPE_AUDIO_AAC" since="21" />
+ <field name="MIMETYPE_AUDIO_AC3" since="21" />
+ <field name="MIMETYPE_AUDIO_AMR_NB" since="21" />
+ <field name="MIMETYPE_AUDIO_AMR_WB" since="21" />
+ <field name="MIMETYPE_AUDIO_FLAC" since="21" />
+ <field name="MIMETYPE_AUDIO_G711_ALAW" since="21" />
+ <field name="MIMETYPE_AUDIO_G711_MLAW" since="21" />
+ <field name="MIMETYPE_AUDIO_MPEG" since="21" />
+ <field name="MIMETYPE_AUDIO_MSGSM" since="21" />
+ <field name="MIMETYPE_AUDIO_OPUS" since="21" />
+ <field name="MIMETYPE_AUDIO_QCELP" since="21" />
+ <field name="MIMETYPE_AUDIO_RAW" since="21" />
+ <field name="MIMETYPE_AUDIO_VORBIS" since="21" />
+ <field name="MIMETYPE_TEXT_CEA_608" since="21" />
+ <field name="MIMETYPE_TEXT_VTT" since="21" />
+ <field name="MIMETYPE_VIDEO_AVC" since="21" />
+ <field name="MIMETYPE_VIDEO_H263" since="21" />
+ <field name="MIMETYPE_VIDEO_HEVC" since="21" />
+ <field name="MIMETYPE_VIDEO_MPEG2" since="21" />
+ <field name="MIMETYPE_VIDEO_MPEG4" since="21" />
+ <field name="MIMETYPE_VIDEO_RAW" since="21" />
+ <field name="MIMETYPE_VIDEO_VP8" since="21" />
+ <field name="MIMETYPE_VIDEO_VP9" since="21" />
+ </class>
+ <class name="android/media/MediaMetadata" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="containsKey(Ljava/lang/String;)Z" />
+ <method name="getBitmap(Ljava/lang/String;)Landroid/graphics/Bitmap;" />
+ <method name="getDescription()Landroid/media/MediaDescription;" />
+ <method name="getLong(Ljava/lang/String;)J" />
+ <method name="getRating(Ljava/lang/String;)Landroid/media/Rating;" />
+ <method name="getString(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getText(Ljava/lang/String;)Ljava/lang/CharSequence;" />
+ <method name="keySet()Ljava/util/Set;" />
+ <method name="size()I" />
+ <field name="CREATOR" />
+ <field name="METADATA_KEY_ALBUM" />
+ <field name="METADATA_KEY_ALBUM_ART" />
+ <field name="METADATA_KEY_ALBUM_ARTIST" />
+ <field name="METADATA_KEY_ALBUM_ART_URI" />
+ <field name="METADATA_KEY_ART" />
+ <field name="METADATA_KEY_ARTIST" />
+ <field name="METADATA_KEY_ART_URI" />
+ <field name="METADATA_KEY_AUTHOR" />
+ <field name="METADATA_KEY_COMPILATION" />
+ <field name="METADATA_KEY_COMPOSER" />
+ <field name="METADATA_KEY_DATE" />
+ <field name="METADATA_KEY_DISC_NUMBER" />
+ <field name="METADATA_KEY_DISPLAY_DESCRIPTION" />
+ <field name="METADATA_KEY_DISPLAY_ICON" />
+ <field name="METADATA_KEY_DISPLAY_ICON_URI" />
+ <field name="METADATA_KEY_DISPLAY_SUBTITLE" />
+ <field name="METADATA_KEY_DISPLAY_TITLE" />
+ <field name="METADATA_KEY_DURATION" />
+ <field name="METADATA_KEY_GENRE" />
+ <field name="METADATA_KEY_MEDIA_ID" />
+ <field name="METADATA_KEY_NUM_TRACKS" />
+ <field name="METADATA_KEY_RATING" />
+ <field name="METADATA_KEY_TITLE" />
+ <field name="METADATA_KEY_TRACK_NUMBER" />
+ <field name="METADATA_KEY_USER_RATING" />
+ <field name="METADATA_KEY_WRITER" />
+ <field name="METADATA_KEY_YEAR" />
+ </class>
+ <class name="android/media/MediaMetadata$Builder" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/media/MediaMetadata;)V" />
+ <method name="build()Landroid/media/MediaMetadata;" />
+ <method name="putBitmap(Ljava/lang/String;Landroid/graphics/Bitmap;)Landroid/media/MediaMetadata$Builder;" />
+ <method name="putLong(Ljava/lang/String;J)Landroid/media/MediaMetadata$Builder;" />
+ <method name="putRating(Ljava/lang/String;Landroid/media/Rating;)Landroid/media/MediaMetadata$Builder;" />
+ <method name="putString(Ljava/lang/String;Ljava/lang/String;)Landroid/media/MediaMetadata$Builder;" />
+ <method name="putText(Ljava/lang/String;Ljava/lang/CharSequence;)Landroid/media/MediaMetadata$Builder;" />
+ </class>
+ <class name="android/media/MediaMetadataEditor" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addEditableKey(I)V" />
+ <method name="apply()V" />
+ <method name="clear()V" />
+ <method name="getBitmap(ILandroid/graphics/Bitmap;)Landroid/graphics/Bitmap;" />
+ <method name="getEditableKeys()[I" />
+ <method name="getLong(IJ)J" />
+ <method name="getObject(ILjava/lang/Object;)Ljava/lang/Object;" />
+ <method name="getString(ILjava/lang/String;)Ljava/lang/String;" />
+ <method name="putBitmap(ILandroid/graphics/Bitmap;)Landroid/media/MediaMetadataEditor;" />
+ <method name="putLong(IJ)Landroid/media/MediaMetadataEditor;" />
+ <method name="putObject(ILjava/lang/Object;)Landroid/media/MediaMetadataEditor;" />
+ <method name="putString(ILjava/lang/String;)Landroid/media/MediaMetadataEditor;" />
+ <method name="removeEditableKeys()V" />
+ <field name="BITMAP_KEY_ARTWORK" />
+ <field name="RATING_KEY_BY_OTHERS" />
+ <field name="RATING_KEY_BY_USER" />
+ </class>
+ <class name="android/media/MediaMetadataRetriever" since="10">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="extractMetadata(I)Ljava/lang/String;" />
+ <method name="getEmbeddedPicture()[B" />
+ <method name="getFrameAtTime()Landroid/graphics/Bitmap;" />
+ <method name="getFrameAtTime(J)Landroid/graphics/Bitmap;" />
+ <method name="getFrameAtTime(JI)Landroid/graphics/Bitmap;" />
+ <method name="release()V" />
+ <method name="setDataSource(Landroid/content/Context;Landroid/net/Uri;)V" />
+ <method name="setDataSource(Ljava/io/FileDescriptor;)V" />
+ <method name="setDataSource(Ljava/io/FileDescriptor;JJ)V" />
+ <method name="setDataSource(Ljava/lang/String;)V" />
+ <method name="setDataSource(Ljava/lang/String;Ljava/util/Map;)V" since="14" />
+ <field name="METADATA_KEY_ALBUM" />
+ <field name="METADATA_KEY_ALBUMARTIST" />
+ <field name="METADATA_KEY_ARTIST" />
+ <field name="METADATA_KEY_AUTHOR" />
+ <field name="METADATA_KEY_BITRATE" since="14" />
+ <field name="METADATA_KEY_CD_TRACK_NUMBER" />
+ <field name="METADATA_KEY_COMPILATION" />
+ <field name="METADATA_KEY_COMPOSER" />
+ <field name="METADATA_KEY_DATE" />
+ <field name="METADATA_KEY_DISC_NUMBER" />
+ <field name="METADATA_KEY_DURATION" />
+ <field name="METADATA_KEY_GENRE" />
+ <field name="METADATA_KEY_HAS_AUDIO" since="14" />
+ <field name="METADATA_KEY_HAS_VIDEO" since="14" />
+ <field name="METADATA_KEY_LOCATION" since="15" />
+ <field name="METADATA_KEY_MIMETYPE" />
+ <field name="METADATA_KEY_NUM_TRACKS" />
+ <field name="METADATA_KEY_TITLE" />
+ <field name="METADATA_KEY_VIDEO_HEIGHT" since="14" />
+ <field name="METADATA_KEY_VIDEO_ROTATION" since="17" />
+ <field name="METADATA_KEY_VIDEO_WIDTH" since="14" />
+ <field name="METADATA_KEY_WRITER" />
+ <field name="METADATA_KEY_YEAR" />
+ <field name="OPTION_CLOSEST" />
+ <field name="OPTION_CLOSEST_SYNC" />
+ <field name="OPTION_NEXT_SYNC" />
+ <field name="OPTION_PREVIOUS_SYNC" />
+ </class>
+ <class name="android/media/MediaMuxer" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;I)V" />
+ <method name="addTrack(Landroid/media/MediaFormat;)I" />
+ <method name="release()V" />
+ <method name="setLocation(FF)V" since="19" />
+ <method name="setOrientationHint(I)V" />
+ <method name="start()V" />
+ <method name="stop()V" />
+ <method name="writeSampleData(ILjava/nio/ByteBuffer;Landroid/media/MediaCodec$BufferInfo;)V" />
+ </class>
+ <class name="android/media/MediaMuxer$OutputFormat" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="MUXER_OUTPUT_MPEG_4" />
+ <field name="MUXER_OUTPUT_WEBM" since="21" />
+ </class>
+ <class name="android/media/MediaPlayer" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addTimedTextSource(Landroid/content/Context;Landroid/net/Uri;Ljava/lang/String;)V" since="16" />
+ <method name="addTimedTextSource(Ljava/io/FileDescriptor;JJLjava/lang/String;)V" since="16" />
+ <method name="addTimedTextSource(Ljava/io/FileDescriptor;Ljava/lang/String;)V" since="16" />
+ <method name="addTimedTextSource(Ljava/lang/String;Ljava/lang/String;)V" since="16" />
+ <method name="attachAuxEffect(I)V" since="9" />
+ <method name="create(Landroid/content/Context;I)Landroid/media/MediaPlayer;" />
+ <method name="create(Landroid/content/Context;ILandroid/media/AudioAttributes;I)Landroid/media/MediaPlayer;" since="21" />
+ <method name="create(Landroid/content/Context;Landroid/net/Uri;)Landroid/media/MediaPlayer;" />
+ <method name="create(Landroid/content/Context;Landroid/net/Uri;Landroid/view/SurfaceHolder;)Landroid/media/MediaPlayer;" />
+ <method name="create(Landroid/content/Context;Landroid/net/Uri;Landroid/view/SurfaceHolder;Landroid/media/AudioAttributes;I)Landroid/media/MediaPlayer;" since="21" />
+ <method name="deselectTrack(I)V" since="16" />
+ <method name="getAudioSessionId()I" since="9" />
+ <method name="getCurrentPosition()I" />
+ <method name="getDuration()I" />
+ <method name="getSelectedTrack(I)I" since="21" />
+ <method name="getTrackInfo()[Landroid/media/MediaPlayer$TrackInfo;" since="16" />
+ <method name="getVideoHeight()I" />
+ <method name="getVideoWidth()I" />
+ <method name="isLooping()Z" since="3" />
+ <method name="isPlaying()Z" />
+ <method name="pause()V" />
+ <method name="prepare()V" />
+ <method name="prepareAsync()V" />
+ <method name="release()V" />
+ <method name="reset()V" />
+ <method name="seekTo(I)V" />
+ <method name="selectTrack(I)V" since="16" />
+ <method name="setAudioAttributes(Landroid/media/AudioAttributes;)V" since="21" />
+ <method name="setAudioSessionId(I)V" since="9" />
+ <method name="setAudioStreamType(I)V" />
+ <method name="setAuxEffectSendLevel(F)V" since="9" />
+ <method name="setDataSource(Landroid/content/Context;Landroid/net/Uri;)V" />
+ <method name="setDataSource(Landroid/content/Context;Landroid/net/Uri;Ljava/util/Map;)V" since="14" />
+ <method name="setDataSource(Ljava/io/FileDescriptor;)V" />
+ <method name="setDataSource(Ljava/io/FileDescriptor;JJ)V" />
+ <method name="setDataSource(Ljava/lang/String;)V" />
+ <method name="setDisplay(Landroid/view/SurfaceHolder;)V" />
+ <method name="setLooping(Z)V" />
+ <method name="setNextMediaPlayer(Landroid/media/MediaPlayer;)V" since="16" />
+ <method name="setOnBufferingUpdateListener(Landroid/media/MediaPlayer$OnBufferingUpdateListener;)V" />
+ <method name="setOnCompletionListener(Landroid/media/MediaPlayer$OnCompletionListener;)V" />
+ <method name="setOnErrorListener(Landroid/media/MediaPlayer$OnErrorListener;)V" />
+ <method name="setOnInfoListener(Landroid/media/MediaPlayer$OnInfoListener;)V" since="3" />
+ <method name="setOnPreparedListener(Landroid/media/MediaPlayer$OnPreparedListener;)V" />
+ <method name="setOnSeekCompleteListener(Landroid/media/MediaPlayer$OnSeekCompleteListener;)V" />
+ <method name="setOnTimedTextListener(Landroid/media/MediaPlayer$OnTimedTextListener;)V" since="16" />
+ <method name="setOnVideoSizeChangedListener(Landroid/media/MediaPlayer$OnVideoSizeChangedListener;)V" since="3" />
+ <method name="setScreenOnWhilePlaying(Z)V" />
+ <method name="setSurface(Landroid/view/Surface;)V" since="14" />
+ <method name="setVideoScalingMode(I)V" since="16" />
+ <method name="setVolume(FF)V" />
+ <method name="setWakeMode(Landroid/content/Context;I)V" />
+ <method name="start()V" />
+ <method name="stop()V" />
+ <field name="MEDIA_ERROR_IO" since="17" />
+ <field name="MEDIA_ERROR_MALFORMED" since="17" />
+ <field name="MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK" since="3" />
+ <field name="MEDIA_ERROR_SERVER_DIED" />
+ <field name="MEDIA_ERROR_TIMED_OUT" since="17" />
+ <field name="MEDIA_ERROR_UNKNOWN" />
+ <field name="MEDIA_ERROR_UNSUPPORTED" since="17" />
+ <field name="MEDIA_INFO_BAD_INTERLEAVING" since="3" />
+ <field name="MEDIA_INFO_BUFFERING_END" since="9" />
+ <field name="MEDIA_INFO_BUFFERING_START" since="9" />
+ <field name="MEDIA_INFO_METADATA_UPDATE" since="5" />
+ <field name="MEDIA_INFO_NOT_SEEKABLE" since="3" />
+ <field name="MEDIA_INFO_SUBTITLE_TIMED_OUT" since="19" />
+ <field name="MEDIA_INFO_UNKNOWN" since="3" />
+ <field name="MEDIA_INFO_UNSUPPORTED_SUBTITLE" since="19" />
+ <field name="MEDIA_INFO_VIDEO_RENDERING_START" since="17" />
+ <field name="MEDIA_INFO_VIDEO_TRACK_LAGGING" since="3" />
+ <field name="MEDIA_MIMETYPE_TEXT_SUBRIP" since="16" />
+ <field name="VIDEO_SCALING_MODE_SCALE_TO_FIT" since="16" />
+ <field name="VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING" since="16" />
+ </class>
+ <class name="android/media/MediaPlayer$OnBufferingUpdateListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onBufferingUpdate(Landroid/media/MediaPlayer;I)V" />
+ </class>
+ <class name="android/media/MediaPlayer$OnCompletionListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onCompletion(Landroid/media/MediaPlayer;)V" />
+ </class>
+ <class name="android/media/MediaPlayer$OnErrorListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onError(Landroid/media/MediaPlayer;II)Z" />
+ </class>
+ <class name="android/media/MediaPlayer$OnInfoListener" since="3">
+ <extends name="java/lang/Object" />
+ <method name="onInfo(Landroid/media/MediaPlayer;II)Z" />
+ </class>
+ <class name="android/media/MediaPlayer$OnPreparedListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onPrepared(Landroid/media/MediaPlayer;)V" />
+ </class>
+ <class name="android/media/MediaPlayer$OnSeekCompleteListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onSeekComplete(Landroid/media/MediaPlayer;)V" />
+ </class>
+ <class name="android/media/MediaPlayer$OnTimedTextListener" since="16">
+ <extends name="java/lang/Object" />
+ <method name="onTimedText(Landroid/media/MediaPlayer;Landroid/media/TimedText;)V" />
+ </class>
+ <class name="android/media/MediaPlayer$OnVideoSizeChangedListener" since="3">
+ <extends name="java/lang/Object" />
+ <method name="onVideoSizeChanged(Landroid/media/MediaPlayer;II)V" />
+ </class>
+ <class name="android/media/MediaPlayer$TrackInfo" since="16">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getFormat()Landroid/media/MediaFormat;" since="19" />
+ <method name="getLanguage()Ljava/lang/String;" />
+ <method name="getTrackType()I" />
+ <field name="MEDIA_TRACK_TYPE_AUDIO" />
+ <field name="MEDIA_TRACK_TYPE_SUBTITLE" since="21" />
+ <field name="MEDIA_TRACK_TYPE_TIMEDTEXT" />
+ <field name="MEDIA_TRACK_TYPE_UNKNOWN" />
+ <field name="MEDIA_TRACK_TYPE_VIDEO" />
+ </class>
+ <class name="android/media/MediaRecorder" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getAudioSourceMax()I" since="4" />
+ <method name="getMaxAmplitude()I" />
+ <method name="getSurface()Landroid/view/Surface;" since="21" />
+ <method name="prepare()V" />
+ <method name="release()V" />
+ <method name="reset()V" />
+ <method name="setAudioChannels(I)V" since="8" />
+ <method name="setAudioEncoder(I)V" />
+ <method name="setAudioEncodingBitRate(I)V" since="8" />
+ <method name="setAudioSamplingRate(I)V" since="8" />
+ <method name="setAudioSource(I)V" />
+ <method name="setAuxiliaryOutputFile(Ljava/io/FileDescriptor;)V" since="11" />
+ <method name="setAuxiliaryOutputFile(Ljava/lang/String;)V" since="11" />
+ <method name="setCamera(Landroid/hardware/Camera;)V" since="3" />
+ <method name="setCaptureRate(D)V" since="11" />
+ <method name="setLocation(FF)V" since="14" />
+ <method name="setMaxDuration(I)V" since="3" />
+ <method name="setMaxFileSize(J)V" since="3" />
+ <method name="setOnErrorListener(Landroid/media/MediaRecorder$OnErrorListener;)V" since="3" />
+ <method name="setOnInfoListener(Landroid/media/MediaRecorder$OnInfoListener;)V" since="3" />
+ <method name="setOrientationHint(I)V" since="9" />
+ <method name="setOutputFile(Ljava/io/FileDescriptor;)V" since="3" />
+ <method name="setOutputFile(Ljava/lang/String;)V" />
+ <method name="setOutputFormat(I)V" />
+ <method name="setPreviewDisplay(Landroid/view/Surface;)V" />
+ <method name="setProfile(Landroid/media/CamcorderProfile;)V" since="8" />
+ <method name="setVideoEncoder(I)V" since="3" />
+ <method name="setVideoEncodingBitRate(I)V" since="8" />
+ <method name="setVideoFrameRate(I)V" since="3" />
+ <method name="setVideoSize(II)V" since="3" />
+ <method name="setVideoSource(I)V" since="3" />
+ <method name="start()V" />
+ <method name="stop()V" />
+ <field name="MEDIA_ERROR_SERVER_DIED" since="17" />
+ <field name="MEDIA_RECORDER_ERROR_UNKNOWN" since="3" />
+ <field name="MEDIA_RECORDER_INFO_MAX_DURATION_REACHED" since="3" />
+ <field name="MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED" since="3" />
+ <field name="MEDIA_RECORDER_INFO_UNKNOWN" since="3" />
+ </class>
+ <class name="android/media/MediaRecorder$AudioEncoder" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/media/MediaRecorder;)V" />
+ <field name="AAC" since="10" />
+ <field name="AAC_ELD" since="16" />
+ <field name="AMR_NB" />
+ <field name="AMR_WB" since="10" />
+ <field name="DEFAULT" />
+ <field name="HE_AAC" since="16" />
+ <field name="VORBIS" since="21" />
+ </class>
+ <class name="android/media/MediaRecorder$AudioSource" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/media/MediaRecorder;)V" />
+ <field name="CAMCORDER" since="7" />
+ <field name="DEFAULT" />
+ <field name="MIC" />
+ <field name="REMOTE_SUBMIX" since="19" />
+ <field name="VOICE_CALL" since="4" />
+ <field name="VOICE_COMMUNICATION" since="11" />
+ <field name="VOICE_DOWNLINK" since="4" />
+ <field name="VOICE_RECOGNITION" since="7" />
+ <field name="VOICE_UPLINK" since="4" />
+ </class>
+ <class name="android/media/MediaRecorder$OnErrorListener" since="3">
+ <extends name="java/lang/Object" />
+ <method name="onError(Landroid/media/MediaRecorder;II)V" />
+ </class>
+ <class name="android/media/MediaRecorder$OnInfoListener" since="3">
+ <extends name="java/lang/Object" />
+ <method name="onInfo(Landroid/media/MediaRecorder;II)V" />
+ </class>
+ <class name="android/media/MediaRecorder$OutputFormat" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/media/MediaRecorder;)V" />
+ <field name="AAC_ADTS" since="16" />
+ <field name="AMR_NB" since="10" />
+ <field name="AMR_WB" since="10" />
+ <field name="DEFAULT" />
+ <field name="MPEG_4" />
+ <field name="RAW_AMR" since="3" />
+ <field name="THREE_GPP" />
+ <field name="WEBM" since="21" />
+ </class>
+ <class name="android/media/MediaRecorder$VideoEncoder" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/media/MediaRecorder;)V" />
+ <field name="DEFAULT" />
+ <field name="H263" />
+ <field name="H264" />
+ <field name="MPEG_4_SP" />
+ <field name="VP8" since="21" />
+ </class>
+ <class name="android/media/MediaRecorder$VideoSource" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/media/MediaRecorder;)V" />
+ <field name="CAMERA" />
+ <field name="DEFAULT" />
+ <field name="SURFACE" since="21" />
+ </class>
+ <class name="android/media/MediaRouter" since="16">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addCallback(ILandroid/media/MediaRouter$Callback;)V" />
+ <method name="addCallback(ILandroid/media/MediaRouter$Callback;I)V" since="18" />
+ <method name="addUserRoute(Landroid/media/MediaRouter$UserRouteInfo;)V" />
+ <method name="clearUserRoutes()V" />
+ <method name="createRouteCategory(IZ)Landroid/media/MediaRouter$RouteCategory;" />
+ <method name="createRouteCategory(Ljava/lang/CharSequence;Z)Landroid/media/MediaRouter$RouteCategory;" />
+ <method name="createUserRoute(Landroid/media/MediaRouter$RouteCategory;)Landroid/media/MediaRouter$UserRouteInfo;" />
+ <method name="getCategoryAt(I)Landroid/media/MediaRouter$RouteCategory;" />
+ <method name="getCategoryCount()I" />
+ <method name="getDefaultRoute()Landroid/media/MediaRouter$RouteInfo;" since="18" />
+ <method name="getRouteAt(I)Landroid/media/MediaRouter$RouteInfo;" />
+ <method name="getRouteCount()I" />
+ <method name="getSelectedRoute(I)Landroid/media/MediaRouter$RouteInfo;" />
+ <method name="removeCallback(Landroid/media/MediaRouter$Callback;)V" />
+ <method name="removeUserRoute(Landroid/media/MediaRouter$UserRouteInfo;)V" />
+ <method name="selectRoute(ILandroid/media/MediaRouter$RouteInfo;)V" />
+ <field name="CALLBACK_FLAG_PERFORM_ACTIVE_SCAN" since="18" />
+ <field name="CALLBACK_FLAG_UNFILTERED_EVENTS" since="18" />
+ <field name="ROUTE_TYPE_LIVE_AUDIO" />
+ <field name="ROUTE_TYPE_LIVE_VIDEO" since="17" />
+ <field name="ROUTE_TYPE_USER" />
+ </class>
+ <class name="android/media/MediaRouter$Callback" since="16">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onRouteAdded(Landroid/media/MediaRouter;Landroid/media/MediaRouter$RouteInfo;)V" />
+ <method name="onRouteChanged(Landroid/media/MediaRouter;Landroid/media/MediaRouter$RouteInfo;)V" />
+ <method name="onRouteGrouped(Landroid/media/MediaRouter;Landroid/media/MediaRouter$RouteInfo;Landroid/media/MediaRouter$RouteGroup;I)V" />
+ <method name="onRoutePresentationDisplayChanged(Landroid/media/MediaRouter;Landroid/media/MediaRouter$RouteInfo;)V" since="17" />
+ <method name="onRouteRemoved(Landroid/media/MediaRouter;Landroid/media/MediaRouter$RouteInfo;)V" />
+ <method name="onRouteSelected(Landroid/media/MediaRouter;ILandroid/media/MediaRouter$RouteInfo;)V" />
+ <method name="onRouteUngrouped(Landroid/media/MediaRouter;Landroid/media/MediaRouter$RouteInfo;Landroid/media/MediaRouter$RouteGroup;)V" />
+ <method name="onRouteUnselected(Landroid/media/MediaRouter;ILandroid/media/MediaRouter$RouteInfo;)V" />
+ <method name="onRouteVolumeChanged(Landroid/media/MediaRouter;Landroid/media/MediaRouter$RouteInfo;)V" />
+ </class>
+ <class name="android/media/MediaRouter$RouteCategory" since="16">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getName()Ljava/lang/CharSequence;" />
+ <method name="getName(Landroid/content/Context;)Ljava/lang/CharSequence;" />
+ <method name="getRoutes(Ljava/util/List;)Ljava/util/List;" />
+ <method name="getSupportedTypes()I" />
+ <method name="isGroupable()Z" />
+ </class>
+ <class name="android/media/MediaRouter$RouteGroup" since="16">
+ <extends name="android/media/MediaRouter$RouteInfo" />
+ <method name="&lt;init>()V" />
+ <method name="addRoute(Landroid/media/MediaRouter$RouteInfo;)V" />
+ <method name="addRoute(Landroid/media/MediaRouter$RouteInfo;I)V" />
+ <method name="getRouteAt(I)Landroid/media/MediaRouter$RouteInfo;" />
+ <method name="getRouteCount()I" />
+ <method name="removeRoute(I)V" />
+ <method name="removeRoute(Landroid/media/MediaRouter$RouteInfo;)V" />
+ <method name="setIconDrawable(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setIconResource(I)V" />
+ </class>
+ <class name="android/media/MediaRouter$RouteInfo" since="16">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getCategory()Landroid/media/MediaRouter$RouteCategory;" />
+ <method name="getDescription()Ljava/lang/CharSequence;" since="18" />
+ <method name="getGroup()Landroid/media/MediaRouter$RouteGroup;" />
+ <method name="getIconDrawable()Landroid/graphics/drawable/Drawable;" />
+ <method name="getName()Ljava/lang/CharSequence;" />
+ <method name="getName(Landroid/content/Context;)Ljava/lang/CharSequence;" />
+ <method name="getPlaybackStream()I" />
+ <method name="getPlaybackType()I" />
+ <method name="getPresentationDisplay()Landroid/view/Display;" since="17" />
+ <method name="getStatus()Ljava/lang/CharSequence;" />
+ <method name="getSupportedTypes()I" />
+ <method name="getTag()Ljava/lang/Object;" />
+ <method name="getVolume()I" />
+ <method name="getVolumeHandling()I" />
+ <method name="getVolumeMax()I" />
+ <method name="isConnecting()Z" since="18" />
+ <method name="isEnabled()Z" since="17" />
+ <method name="requestSetVolume(I)V" />
+ <method name="requestUpdateVolume(I)V" />
+ <method name="setTag(Ljava/lang/Object;)V" />
+ <field name="PLAYBACK_TYPE_LOCAL" />
+ <field name="PLAYBACK_TYPE_REMOTE" />
+ <field name="PLAYBACK_VOLUME_FIXED" />
+ <field name="PLAYBACK_VOLUME_VARIABLE" />
+ </class>
+ <class name="android/media/MediaRouter$SimpleCallback" since="16">
+ <extends name="android/media/MediaRouter$Callback" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/media/MediaRouter$UserRouteInfo" since="16">
+ <extends name="android/media/MediaRouter$RouteInfo" />
+ <method name="&lt;init>()V" />
+ <method name="getRemoteControlClient()Landroid/media/RemoteControlClient;" />
+ <method name="setDescription(Ljava/lang/CharSequence;)V" since="18" />
+ <method name="setIconDrawable(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setIconResource(I)V" />
+ <method name="setName(I)V" />
+ <method name="setName(Ljava/lang/CharSequence;)V" />
+ <method name="setPlaybackStream(I)V" />
+ <method name="setPlaybackType(I)V" />
+ <method name="setRemoteControlClient(Landroid/media/RemoteControlClient;)V" />
+ <method name="setStatus(Ljava/lang/CharSequence;)V" />
+ <method name="setVolume(I)V" />
+ <method name="setVolumeCallback(Landroid/media/MediaRouter$VolumeCallback;)V" />
+ <method name="setVolumeHandling(I)V" />
+ <method name="setVolumeMax(I)V" />
+ </class>
+ <class name="android/media/MediaRouter$VolumeCallback" since="16">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onVolumeSetRequest(Landroid/media/MediaRouter$RouteInfo;I)V" />
+ <method name="onVolumeUpdateRequest(Landroid/media/MediaRouter$RouteInfo;I)V" />
+ </class>
+ <class name="android/media/MediaScannerConnection" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/content/ServiceConnection" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/media/MediaScannerConnection$MediaScannerConnectionClient;)V" />
+ <method name="connect()V" />
+ <method name="disconnect()V" />
+ <method name="isConnected()Z" />
+ <method name="scanFile(Landroid/content/Context;[Ljava/lang/String;[Ljava/lang/String;Landroid/media/MediaScannerConnection$OnScanCompletedListener;)V" since="8" />
+ <method name="scanFile(Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="android/media/MediaScannerConnection$MediaScannerConnectionClient" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/media/MediaScannerConnection$OnScanCompletedListener" since="8" />
+ <method name="onMediaScannerConnected()V" />
+ <method name="onScanCompleted(Ljava/lang/String;Landroid/net/Uri;)V" />
+ </class>
+ <class name="android/media/MediaScannerConnection$OnScanCompletedListener" since="8">
+ <extends name="java/lang/Object" />
+ <method name="onScanCompleted(Ljava/lang/String;Landroid/net/Uri;)V" />
+ </class>
+ <class name="android/media/MediaSyncEvent" since="16">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="createEvent(I)Landroid/media/MediaSyncEvent;" />
+ <method name="getAudioSessionId()I" />
+ <method name="getType()I" />
+ <method name="setAudioSessionId(I)Landroid/media/MediaSyncEvent;" />
+ <field name="SYNC_EVENT_NONE" />
+ <field name="SYNC_EVENT_PRESENTATION_COMPLETE" />
+ </class>
+ <class name="android/media/NotProvisionedException" since="18">
+ <extends name="android/media/MediaDrmException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/media/Rating" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getPercentRating()F" />
+ <method name="getRatingStyle()I" />
+ <method name="getStarRating()F" />
+ <method name="hasHeart()Z" />
+ <method name="isRated()Z" />
+ <method name="isThumbUp()Z" />
+ <method name="newHeartRating(Z)Landroid/media/Rating;" />
+ <method name="newPercentageRating(F)Landroid/media/Rating;" />
+ <method name="newStarRating(IF)Landroid/media/Rating;" />
+ <method name="newThumbRating(Z)Landroid/media/Rating;" />
+ <method name="newUnratedRating(I)Landroid/media/Rating;" />
+ <field name="CREATOR" />
+ <field name="RATING_3_STARS" />
+ <field name="RATING_4_STARS" />
+ <field name="RATING_5_STARS" />
+ <field name="RATING_HEART" />
+ <field name="RATING_NONE" since="21" />
+ <field name="RATING_PERCENTAGE" />
+ <field name="RATING_THUMB_UP_DOWN" />
+ </class>
+ <class name="android/media/RemoteControlClient" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/app/PendingIntent;)V" />
+ <method name="&lt;init>(Landroid/app/PendingIntent;Landroid/os/Looper;)V" />
+ <method name="editMetadata(Z)Landroid/media/RemoteControlClient$MetadataEditor;" />
+ <method name="getMediaSession()Landroid/media/session/MediaSession;" since="21" />
+ <method name="setMetadataUpdateListener(Landroid/media/RemoteControlClient$OnMetadataUpdateListener;)V" since="19" />
+ <method name="setOnGetPlaybackPositionListener(Landroid/media/RemoteControlClient$OnGetPlaybackPositionListener;)V" since="18" />
+ <method name="setPlaybackPositionUpdateListener(Landroid/media/RemoteControlClient$OnPlaybackPositionUpdateListener;)V" since="18" />
+ <method name="setPlaybackState(I)V" />
+ <method name="setPlaybackState(IJF)V" since="18" />
+ <method name="setTransportControlFlags(I)V" />
+ <field name="FLAG_KEY_MEDIA_FAST_FORWARD" />
+ <field name="FLAG_KEY_MEDIA_NEXT" />
+ <field name="FLAG_KEY_MEDIA_PAUSE" />
+ <field name="FLAG_KEY_MEDIA_PLAY" />
+ <field name="FLAG_KEY_MEDIA_PLAY_PAUSE" />
+ <field name="FLAG_KEY_MEDIA_POSITION_UPDATE" since="18" />
+ <field name="FLAG_KEY_MEDIA_PREVIOUS" />
+ <field name="FLAG_KEY_MEDIA_RATING" since="19" />
+ <field name="FLAG_KEY_MEDIA_REWIND" />
+ <field name="FLAG_KEY_MEDIA_STOP" />
+ <field name="PLAYSTATE_BUFFERING" />
+ <field name="PLAYSTATE_ERROR" />
+ <field name="PLAYSTATE_FAST_FORWARDING" />
+ <field name="PLAYSTATE_PAUSED" />
+ <field name="PLAYSTATE_PLAYING" />
+ <field name="PLAYSTATE_REWINDING" />
+ <field name="PLAYSTATE_SKIPPING_BACKWARDS" />
+ <field name="PLAYSTATE_SKIPPING_FORWARDS" />
+ <field name="PLAYSTATE_STOPPED" />
+ </class>
+ <class name="android/media/RemoteControlClient$MetadataEditor" since="14">
+ <extends name="android/media/MediaMetadataEditor" since="19" />
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/media/RemoteControlClient;)V" />
+ <method name="apply()V" />
+ <method name="clear()V" />
+ <method name="putBitmap(ILandroid/graphics/Bitmap;)Landroid/media/RemoteControlClient$MetadataEditor;" />
+ <method name="putLong(IJ)Landroid/media/RemoteControlClient$MetadataEditor;" />
+ <method name="putString(ILjava/lang/String;)Landroid/media/RemoteControlClient$MetadataEditor;" />
+ <field name="BITMAP_KEY_ARTWORK" />
+ </class>
+ <class name="android/media/RemoteControlClient$OnGetPlaybackPositionListener" since="18">
+ <extends name="java/lang/Object" />
+ <method name="onGetPlaybackPosition()J" />
+ </class>
+ <class name="android/media/RemoteControlClient$OnMetadataUpdateListener" since="19">
+ <extends name="java/lang/Object" />
+ <method name="onMetadataUpdate(ILjava/lang/Object;)V" />
+ </class>
+ <class name="android/media/RemoteControlClient$OnPlaybackPositionUpdateListener" since="18">
+ <extends name="java/lang/Object" />
+ <method name="onPlaybackPositionUpdate(J)V" />
+ </class>
+ <class name="android/media/RemoteController" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/media/RemoteController$OnClientUpdateListener;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/media/RemoteController$OnClientUpdateListener;Landroid/os/Looper;)V" />
+ <method name="clearArtworkConfiguration()Z" />
+ <method name="editMetadata()Landroid/media/RemoteController$MetadataEditor;" />
+ <method name="getEstimatedMediaPosition()J" />
+ <method name="seekTo(J)Z" />
+ <method name="sendMediaKeyEvent(Landroid/view/KeyEvent;)Z" />
+ <method name="setArtworkConfiguration(II)Z" />
+ <method name="setSynchronizationMode(I)Z" />
+ <field name="POSITION_SYNCHRONIZATION_CHECK" />
+ <field name="POSITION_SYNCHRONIZATION_NONE" />
+ </class>
+ <class name="android/media/RemoteController$MetadataEditor" since="19">
+ <extends name="android/media/MediaMetadataEditor" />
+ <method name="&lt;init>(Landroid/media/RemoteController;)V" />
+ </class>
+ <class name="android/media/RemoteController$OnClientUpdateListener" since="19">
+ <extends name="java/lang/Object" />
+ <method name="onClientChange(Z)V" />
+ <method name="onClientMetadataUpdate(Landroid/media/RemoteController$MetadataEditor;)V" />
+ <method name="onClientPlaybackStateUpdate(I)V" />
+ <method name="onClientPlaybackStateUpdate(IJJF)V" />
+ <method name="onClientTransportControlUpdate(I)V" />
+ </class>
+ <class name="android/media/ResourceBusyException" since="19">
+ <extends name="android/media/MediaDrmException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/media/Ringtone" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getAudioAttributes()Landroid/media/AudioAttributes;" since="21" />
+ <method name="getStreamType()I" />
+ <method name="getTitle(Landroid/content/Context;)Ljava/lang/String;" />
+ <method name="isPlaying()Z" />
+ <method name="play()V" />
+ <method name="setAudioAttributes(Landroid/media/AudioAttributes;)V" since="21" />
+ <method name="setStreamType(I)V" />
+ <method name="stop()V" />
+ </class>
+ <class name="android/media/RingtoneManager" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/app/Activity;)V" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="getActualDefaultRingtoneUri(Landroid/content/Context;I)Landroid/net/Uri;" />
+ <method name="getCursor()Landroid/database/Cursor;" />
+ <method name="getDefaultType(Landroid/net/Uri;)I" />
+ <method name="getDefaultUri(I)Landroid/net/Uri;" />
+ <method name="getIncludeDrm()Z" />
+ <method name="getRingtone(I)Landroid/media/Ringtone;" />
+ <method name="getRingtone(Landroid/content/Context;Landroid/net/Uri;)Landroid/media/Ringtone;" />
+ <method name="getRingtonePosition(Landroid/net/Uri;)I" />
+ <method name="getRingtoneUri(I)Landroid/net/Uri;" />
+ <method name="getStopPreviousRingtone()Z" />
+ <method name="getValidRingtoneUri(Landroid/content/Context;)Landroid/net/Uri;" />
+ <method name="inferStreamType()I" since="3" />
+ <method name="isDefault(Landroid/net/Uri;)Z" />
+ <method name="setActualDefaultRingtoneUri(Landroid/content/Context;ILandroid/net/Uri;)V" />
+ <method name="setIncludeDrm(Z)V" />
+ <method name="setStopPreviousRingtone(Z)V" />
+ <method name="setType(I)V" />
+ <method name="stopPreviousRingtone()V" />
+ <field name="ACTION_RINGTONE_PICKER" />
+ <field name="EXTRA_RINGTONE_DEFAULT_URI" />
+ <field name="EXTRA_RINGTONE_EXISTING_URI" />
+ <field name="EXTRA_RINGTONE_INCLUDE_DRM" />
+ <field name="EXTRA_RINGTONE_PICKED_URI" />
+ <field name="EXTRA_RINGTONE_SHOW_DEFAULT" />
+ <field name="EXTRA_RINGTONE_SHOW_SILENT" />
+ <field name="EXTRA_RINGTONE_TITLE" />
+ <field name="EXTRA_RINGTONE_TYPE" />
+ <field name="ID_COLUMN_INDEX" />
+ <field name="TITLE_COLUMN_INDEX" />
+ <field name="TYPE_ALARM" />
+ <field name="TYPE_ALL" />
+ <field name="TYPE_NOTIFICATION" />
+ <field name="TYPE_RINGTONE" />
+ <field name="URI_COLUMN_INDEX" />
+ </class>
+ <class name="android/media/SoundPool" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(III)V" />
+ <method name="autoPause()V" since="8" />
+ <method name="autoResume()V" since="8" />
+ <method name="load(Landroid/content/Context;II)I" />
+ <method name="load(Landroid/content/res/AssetFileDescriptor;I)I" since="3" />
+ <method name="load(Ljava/io/FileDescriptor;JJI)I" since="3" />
+ <method name="load(Ljava/lang/String;I)I" />
+ <method name="pause(I)V" />
+ <method name="play(IFFIIF)I" />
+ <method name="release()V" />
+ <method name="resume(I)V" />
+ <method name="setLoop(II)V" />
+ <method name="setOnLoadCompleteListener(Landroid/media/SoundPool$OnLoadCompleteListener;)V" since="8" />
+ <method name="setPriority(II)V" />
+ <method name="setRate(IF)V" />
+ <method name="setVolume(IFF)V" />
+ <method name="stop(I)V" />
+ <method name="unload(I)Z" />
+ </class>
+ <class name="android/media/SoundPool$Builder" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="build()Landroid/media/SoundPool;" />
+ <method name="setAudioAttributes(Landroid/media/AudioAttributes;)Landroid/media/SoundPool$Builder;" />
+ <method name="setMaxStreams(I)Landroid/media/SoundPool$Builder;" />
+ </class>
+ <class name="android/media/SoundPool$OnLoadCompleteListener" since="8">
+ <extends name="java/lang/Object" />
+ <method name="onLoadComplete(Landroid/media/SoundPool;II)V" />
+ </class>
+ <class name="android/media/ThumbnailUtils" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="createVideoThumbnail(Ljava/lang/String;I)Landroid/graphics/Bitmap;" />
+ <method name="extractThumbnail(Landroid/graphics/Bitmap;II)Landroid/graphics/Bitmap;" />
+ <method name="extractThumbnail(Landroid/graphics/Bitmap;III)Landroid/graphics/Bitmap;" />
+ <field name="OPTIONS_RECYCLE_INPUT" />
+ </class>
+ <class name="android/media/TimedText" since="16">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getBounds()Landroid/graphics/Rect;" />
+ <method name="getText()Ljava/lang/String;" />
+ </class>
+ <class name="android/media/ToneGenerator" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(II)V" />
+ <method name="getAudioSessionId()I" since="16" />
+ <method name="release()V" />
+ <method name="startTone(I)Z" />
+ <method name="startTone(II)Z" since="5" />
+ <method name="stopTone()V" />
+ <field name="MAX_VOLUME" />
+ <field name="MIN_VOLUME" />
+ <field name="TONE_CDMA_ABBR_ALERT" since="4" />
+ <field name="TONE_CDMA_ABBR_INTERCEPT" since="4" />
+ <field name="TONE_CDMA_ABBR_REORDER" since="4" />
+ <field name="TONE_CDMA_ALERT_AUTOREDIAL_LITE" since="4" />
+ <field name="TONE_CDMA_ALERT_CALL_GUARD" since="4" />
+ <field name="TONE_CDMA_ALERT_INCALL_LITE" since="4" />
+ <field name="TONE_CDMA_ALERT_NETWORK_LITE" since="4" />
+ <field name="TONE_CDMA_ANSWER" since="4" />
+ <field name="TONE_CDMA_CALLDROP_LITE" since="4" />
+ <field name="TONE_CDMA_CALL_SIGNAL_ISDN_INTERGROUP" since="4" />
+ <field name="TONE_CDMA_CALL_SIGNAL_ISDN_NORMAL" since="4" />
+ <field name="TONE_CDMA_CALL_SIGNAL_ISDN_PAT3" since="4" />
+ <field name="TONE_CDMA_CALL_SIGNAL_ISDN_PAT5" since="4" />
+ <field name="TONE_CDMA_CALL_SIGNAL_ISDN_PAT6" since="4" />
+ <field name="TONE_CDMA_CALL_SIGNAL_ISDN_PAT7" since="4" />
+ <field name="TONE_CDMA_CALL_SIGNAL_ISDN_PING_RING" since="4" />
+ <field name="TONE_CDMA_CALL_SIGNAL_ISDN_SP_PRI" since="4" />
+ <field name="TONE_CDMA_CONFIRM" since="4" />
+ <field name="TONE_CDMA_DIAL_TONE_LITE" since="4" />
+ <field name="TONE_CDMA_EMERGENCY_RINGBACK" since="4" />
+ <field name="TONE_CDMA_HIGH_L" since="4" />
+ <field name="TONE_CDMA_HIGH_PBX_L" since="4" />
+ <field name="TONE_CDMA_HIGH_PBX_SLS" since="4" />
+ <field name="TONE_CDMA_HIGH_PBX_SS" since="4" />
+ <field name="TONE_CDMA_HIGH_PBX_SSL" since="4" />
+ <field name="TONE_CDMA_HIGH_PBX_S_X4" since="4" />
+ <field name="TONE_CDMA_HIGH_SLS" since="4" />
+ <field name="TONE_CDMA_HIGH_SS" since="4" />
+ <field name="TONE_CDMA_HIGH_SSL" since="4" />
+ <field name="TONE_CDMA_HIGH_SS_2" since="4" />
+ <field name="TONE_CDMA_HIGH_S_X4" since="4" />
+ <field name="TONE_CDMA_INTERCEPT" since="4" />
+ <field name="TONE_CDMA_KEYPAD_VOLUME_KEY_LITE" since="4" />
+ <field name="TONE_CDMA_LOW_L" since="4" />
+ <field name="TONE_CDMA_LOW_PBX_L" since="4" />
+ <field name="TONE_CDMA_LOW_PBX_SLS" since="4" />
+ <field name="TONE_CDMA_LOW_PBX_SS" since="4" />
+ <field name="TONE_CDMA_LOW_PBX_SSL" since="4" />
+ <field name="TONE_CDMA_LOW_PBX_S_X4" since="4" />
+ <field name="TONE_CDMA_LOW_SLS" since="4" />
+ <field name="TONE_CDMA_LOW_SS" since="4" />
+ <field name="TONE_CDMA_LOW_SSL" since="4" />
+ <field name="TONE_CDMA_LOW_SS_2" since="4" />
+ <field name="TONE_CDMA_LOW_S_X4" since="4" />
+ <field name="TONE_CDMA_MED_L" since="4" />
+ <field name="TONE_CDMA_MED_PBX_L" since="4" />
+ <field name="TONE_CDMA_MED_PBX_SLS" since="4" />
+ <field name="TONE_CDMA_MED_PBX_SS" since="4" />
+ <field name="TONE_CDMA_MED_PBX_SSL" since="4" />
+ <field name="TONE_CDMA_MED_PBX_S_X4" since="4" />
+ <field name="TONE_CDMA_MED_SLS" since="4" />
+ <field name="TONE_CDMA_MED_SS" since="4" />
+ <field name="TONE_CDMA_MED_SSL" since="4" />
+ <field name="TONE_CDMA_MED_SS_2" since="4" />
+ <field name="TONE_CDMA_MED_S_X4" since="4" />
+ <field name="TONE_CDMA_NETWORK_BUSY" since="4" />
+ <field name="TONE_CDMA_NETWORK_BUSY_ONE_SHOT" since="4" />
+ <field name="TONE_CDMA_NETWORK_CALLWAITING" since="4" />
+ <field name="TONE_CDMA_NETWORK_USA_RINGBACK" since="4" />
+ <field name="TONE_CDMA_ONE_MIN_BEEP" since="4" />
+ <field name="TONE_CDMA_PIP" since="4" />
+ <field name="TONE_CDMA_PRESSHOLDKEY_LITE" since="4" />
+ <field name="TONE_CDMA_REORDER" since="4" />
+ <field name="TONE_CDMA_SIGNAL_OFF" since="4" />
+ <field name="TONE_CDMA_SOFT_ERROR_LITE" since="4" />
+ <field name="TONE_DTMF_0" />
+ <field name="TONE_DTMF_1" />
+ <field name="TONE_DTMF_2" />
+ <field name="TONE_DTMF_3" />
+ <field name="TONE_DTMF_4" />
+ <field name="TONE_DTMF_5" />
+ <field name="TONE_DTMF_6" />
+ <field name="TONE_DTMF_7" />
+ <field name="TONE_DTMF_8" />
+ <field name="TONE_DTMF_9" />
+ <field name="TONE_DTMF_A" />
+ <field name="TONE_DTMF_B" />
+ <field name="TONE_DTMF_C" />
+ <field name="TONE_DTMF_D" />
+ <field name="TONE_DTMF_P" />
+ <field name="TONE_DTMF_S" />
+ <field name="TONE_PROP_ACK" />
+ <field name="TONE_PROP_BEEP" />
+ <field name="TONE_PROP_BEEP2" />
+ <field name="TONE_PROP_NACK" />
+ <field name="TONE_PROP_PROMPT" />
+ <field name="TONE_SUP_BUSY" />
+ <field name="TONE_SUP_CALL_WAITING" />
+ <field name="TONE_SUP_CONFIRM" since="4" />
+ <field name="TONE_SUP_CONGESTION" />
+ <field name="TONE_SUP_CONGESTION_ABBREV" since="4" />
+ <field name="TONE_SUP_DIAL" />
+ <field name="TONE_SUP_ERROR" />
+ <field name="TONE_SUP_INTERCEPT" since="4" />
+ <field name="TONE_SUP_INTERCEPT_ABBREV" since="4" />
+ <field name="TONE_SUP_PIP" since="4" />
+ <field name="TONE_SUP_RADIO_ACK" />
+ <field name="TONE_SUP_RADIO_NOTAVAIL" />
+ <field name="TONE_SUP_RINGTONE" />
+ </class>
+ <class name="android/media/UnsupportedSchemeException" since="18">
+ <extends name="android/media/MediaDrmException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/media/VolumeProvider" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(III)V" />
+ <method name="getCurrentVolume()I" />
+ <method name="getMaxVolume()I" />
+ <method name="getVolumeControl()I" />
+ <method name="onAdjustVolume(I)V" />
+ <method name="onSetVolumeTo(I)V" />
+ <method name="setCurrentVolume(I)V" />
+ <field name="VOLUME_CONTROL_ABSOLUTE" />
+ <field name="VOLUME_CONTROL_FIXED" />
+ <field name="VOLUME_CONTROL_RELATIVE" />
+ </class>
+ <class name="android/media/audiofx/AcousticEchoCanceler" since="16">
+ <extends name="android/media/audiofx/AudioEffect" />
+ <method name="&lt;init>()V" />
+ <method name="create(I)Landroid/media/audiofx/AcousticEchoCanceler;" />
+ <method name="isAvailable()Z" />
+ </class>
+ <class name="android/media/audiofx/AudioEffect" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getDescriptor()Landroid/media/audiofx/AudioEffect$Descriptor;" />
+ <method name="getEnabled()Z" />
+ <method name="getId()I" />
+ <method name="hasControl()Z" />
+ <method name="queryEffects()[Landroid/media/audiofx/AudioEffect$Descriptor;" />
+ <method name="release()V" />
+ <method name="setControlStatusListener(Landroid/media/audiofx/AudioEffect$OnControlStatusChangeListener;)V" />
+ <method name="setEnableStatusListener(Landroid/media/audiofx/AudioEffect$OnEnableStatusChangeListener;)V" />
+ <method name="setEnabled(Z)I" />
+ <field name="ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION" />
+ <field name="ACTION_DISPLAY_AUDIO_EFFECT_CONTROL_PANEL" />
+ <field name="ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION" />
+ <field name="ALREADY_EXISTS" />
+ <field name="CONTENT_TYPE_GAME" />
+ <field name="CONTENT_TYPE_MOVIE" />
+ <field name="CONTENT_TYPE_MUSIC" />
+ <field name="CONTENT_TYPE_VOICE" />
+ <field name="EFFECT_AUXILIARY" />
+ <field name="EFFECT_INSERT" />
+ <field name="EFFECT_TYPE_AEC" since="18" />
+ <field name="EFFECT_TYPE_AGC" since="18" />
+ <field name="EFFECT_TYPE_BASS_BOOST" since="18" />
+ <field name="EFFECT_TYPE_ENV_REVERB" since="18" />
+ <field name="EFFECT_TYPE_EQUALIZER" since="18" />
+ <field name="EFFECT_TYPE_LOUDNESS_ENHANCER" since="19" />
+ <field name="EFFECT_TYPE_NS" since="18" />
+ <field name="EFFECT_TYPE_PRESET_REVERB" since="18" />
+ <field name="EFFECT_TYPE_VIRTUALIZER" since="18" />
+ <field name="ERROR" />
+ <field name="ERROR_BAD_VALUE" />
+ <field name="ERROR_DEAD_OBJECT" />
+ <field name="ERROR_INVALID_OPERATION" />
+ <field name="ERROR_NO_INIT" />
+ <field name="ERROR_NO_MEMORY" />
+ <field name="EXTRA_AUDIO_SESSION" />
+ <field name="EXTRA_CONTENT_TYPE" />
+ <field name="EXTRA_PACKAGE_NAME" />
+ <field name="SUCCESS" />
+ </class>
+ <class name="android/media/audiofx/AudioEffect$Descriptor" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <field name="connectMode" />
+ <field name="implementor" />
+ <field name="name" />
+ <field name="type" />
+ <field name="uuid" />
+ </class>
+ <class name="android/media/audiofx/AudioEffect$OnControlStatusChangeListener" since="9">
+ <extends name="java/lang/Object" />
+ <method name="onControlStatusChange(Landroid/media/audiofx/AudioEffect;Z)V" />
+ </class>
+ <class name="android/media/audiofx/AudioEffect$OnEnableStatusChangeListener" since="9">
+ <extends name="java/lang/Object" />
+ <method name="onEnableStatusChange(Landroid/media/audiofx/AudioEffect;Z)V" />
+ </class>
+ <class name="android/media/audiofx/AutomaticGainControl" since="16">
+ <extends name="android/media/audiofx/AudioEffect" />
+ <method name="&lt;init>()V" />
+ <method name="create(I)Landroid/media/audiofx/AutomaticGainControl;" />
+ <method name="isAvailable()Z" />
+ </class>
+ <class name="android/media/audiofx/BassBoost" since="9">
+ <extends name="android/media/audiofx/AudioEffect" />
+ <method name="&lt;init>(II)V" />
+ <method name="getProperties()Landroid/media/audiofx/BassBoost$Settings;" />
+ <method name="getRoundedStrength()S" />
+ <method name="getStrengthSupported()Z" />
+ <method name="setParameterListener(Landroid/media/audiofx/BassBoost$OnParameterChangeListener;)V" />
+ <method name="setProperties(Landroid/media/audiofx/BassBoost$Settings;)V" />
+ <method name="setStrength(S)V" />
+ <field name="PARAM_STRENGTH" />
+ <field name="PARAM_STRENGTH_SUPPORTED" />
+ </class>
+ <class name="android/media/audiofx/BassBoost$OnParameterChangeListener" since="9">
+ <extends name="java/lang/Object" />
+ <method name="onParameterChange(Landroid/media/audiofx/BassBoost;IIS)V" />
+ </class>
+ <class name="android/media/audiofx/BassBoost$Settings" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <field name="strength" />
+ </class>
+ <class name="android/media/audiofx/EnvironmentalReverb" since="9">
+ <extends name="android/media/audiofx/AudioEffect" />
+ <method name="&lt;init>(II)V" />
+ <method name="getDecayHFRatio()S" />
+ <method name="getDecayTime()I" />
+ <method name="getDensity()S" />
+ <method name="getDiffusion()S" />
+ <method name="getProperties()Landroid/media/audiofx/EnvironmentalReverb$Settings;" />
+ <method name="getReflectionsDelay()I" />
+ <method name="getReflectionsLevel()S" />
+ <method name="getReverbDelay()I" />
+ <method name="getReverbLevel()S" />
+ <method name="getRoomHFLevel()S" />
+ <method name="getRoomLevel()S" />
+ <method name="setDecayHFRatio(S)V" />
+ <method name="setDecayTime(I)V" />
+ <method name="setDensity(S)V" />
+ <method name="setDiffusion(S)V" />
+ <method name="setParameterListener(Landroid/media/audiofx/EnvironmentalReverb$OnParameterChangeListener;)V" />
+ <method name="setProperties(Landroid/media/audiofx/EnvironmentalReverb$Settings;)V" />
+ <method name="setReflectionsDelay(I)V" />
+ <method name="setReflectionsLevel(S)V" />
+ <method name="setReverbDelay(I)V" />
+ <method name="setReverbLevel(S)V" />
+ <method name="setRoomHFLevel(S)V" />
+ <method name="setRoomLevel(S)V" />
+ <field name="PARAM_DECAY_HF_RATIO" />
+ <field name="PARAM_DECAY_TIME" />
+ <field name="PARAM_DENSITY" />
+ <field name="PARAM_DIFFUSION" />
+ <field name="PARAM_REFLECTIONS_DELAY" />
+ <field name="PARAM_REFLECTIONS_LEVEL" />
+ <field name="PARAM_REVERB_DELAY" />
+ <field name="PARAM_REVERB_LEVEL" />
+ <field name="PARAM_ROOM_HF_LEVEL" />
+ <field name="PARAM_ROOM_LEVEL" />
+ </class>
+ <class name="android/media/audiofx/EnvironmentalReverb$OnParameterChangeListener" since="9">
+ <extends name="java/lang/Object" />
+ <method name="onParameterChange(Landroid/media/audiofx/EnvironmentalReverb;III)V" />
+ </class>
+ <class name="android/media/audiofx/EnvironmentalReverb$Settings" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <field name="decayHFRatio" />
+ <field name="decayTime" />
+ <field name="density" />
+ <field name="diffusion" />
+ <field name="reflectionsDelay" />
+ <field name="reflectionsLevel" />
+ <field name="reverbDelay" />
+ <field name="reverbLevel" />
+ <field name="roomHFLevel" />
+ <field name="roomLevel" />
+ </class>
+ <class name="android/media/audiofx/Equalizer" since="9">
+ <extends name="android/media/audiofx/AudioEffect" />
+ <method name="&lt;init>(II)V" />
+ <method name="getBand(I)S" />
+ <method name="getBandFreqRange(S)[I" />
+ <method name="getBandLevel(S)S" />
+ <method name="getBandLevelRange()[S" />
+ <method name="getCenterFreq(S)I" />
+ <method name="getCurrentPreset()S" />
+ <method name="getNumberOfBands()S" />
+ <method name="getNumberOfPresets()S" />
+ <method name="getPresetName(S)Ljava/lang/String;" />
+ <method name="getProperties()Landroid/media/audiofx/Equalizer$Settings;" />
+ <method name="setBandLevel(SS)V" />
+ <method name="setParameterListener(Landroid/media/audiofx/Equalizer$OnParameterChangeListener;)V" />
+ <method name="setProperties(Landroid/media/audiofx/Equalizer$Settings;)V" />
+ <method name="usePreset(S)V" />
+ <field name="PARAM_BAND_FREQ_RANGE" />
+ <field name="PARAM_BAND_LEVEL" />
+ <field name="PARAM_CENTER_FREQ" />
+ <field name="PARAM_CURRENT_PRESET" />
+ <field name="PARAM_GET_BAND" />
+ <field name="PARAM_GET_NUM_OF_PRESETS" />
+ <field name="PARAM_GET_PRESET_NAME" />
+ <field name="PARAM_LEVEL_RANGE" />
+ <field name="PARAM_NUM_BANDS" />
+ <field name="PARAM_STRING_SIZE_MAX" />
+ </class>
+ <class name="android/media/audiofx/Equalizer$OnParameterChangeListener" since="9">
+ <extends name="java/lang/Object" />
+ <method name="onParameterChange(Landroid/media/audiofx/Equalizer;IIII)V" />
+ </class>
+ <class name="android/media/audiofx/Equalizer$Settings" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <field name="bandLevels" />
+ <field name="curPreset" />
+ <field name="numBands" />
+ </class>
+ <class name="android/media/audiofx/LoudnessEnhancer" since="19">
+ <extends name="android/media/audiofx/AudioEffect" />
+ <method name="&lt;init>(I)V" />
+ <method name="getTargetGain()F" />
+ <method name="setTargetGain(I)V" />
+ <field name="PARAM_TARGET_GAIN_MB" />
+ </class>
+ <class name="android/media/audiofx/NoiseSuppressor" since="16">
+ <extends name="android/media/audiofx/AudioEffect" />
+ <method name="&lt;init>()V" />
+ <method name="create(I)Landroid/media/audiofx/NoiseSuppressor;" />
+ <method name="isAvailable()Z" />
+ </class>
+ <class name="android/media/audiofx/PresetReverb" since="9">
+ <extends name="android/media/audiofx/AudioEffect" />
+ <method name="&lt;init>(II)V" />
+ <method name="getPreset()S" />
+ <method name="getProperties()Landroid/media/audiofx/PresetReverb$Settings;" />
+ <method name="setParameterListener(Landroid/media/audiofx/PresetReverb$OnParameterChangeListener;)V" />
+ <method name="setPreset(S)V" />
+ <method name="setProperties(Landroid/media/audiofx/PresetReverb$Settings;)V" />
+ <field name="PARAM_PRESET" />
+ <field name="PRESET_LARGEHALL" />
+ <field name="PRESET_LARGEROOM" />
+ <field name="PRESET_MEDIUMHALL" />
+ <field name="PRESET_MEDIUMROOM" />
+ <field name="PRESET_NONE" />
+ <field name="PRESET_PLATE" />
+ <field name="PRESET_SMALLROOM" />
+ </class>
+ <class name="android/media/audiofx/PresetReverb$OnParameterChangeListener" since="9">
+ <extends name="java/lang/Object" />
+ <method name="onParameterChange(Landroid/media/audiofx/PresetReverb;IIS)V" />
+ </class>
+ <class name="android/media/audiofx/PresetReverb$Settings" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <field name="preset" />
+ </class>
+ <class name="android/media/audiofx/Virtualizer" since="9">
+ <extends name="android/media/audiofx/AudioEffect" />
+ <method name="&lt;init>(II)V" />
+ <method name="canVirtualize(II)Z" since="21" />
+ <method name="forceVirtualizationMode(I)Z" since="21" />
+ <method name="getProperties()Landroid/media/audiofx/Virtualizer$Settings;" />
+ <method name="getRoundedStrength()S" />
+ <method name="getSpeakerAngles(II[I)Z" since="21" />
+ <method name="getStrengthSupported()Z" />
+ <method name="getVirtualizationMode()I" since="21" />
+ <method name="setParameterListener(Landroid/media/audiofx/Virtualizer$OnParameterChangeListener;)V" />
+ <method name="setProperties(Landroid/media/audiofx/Virtualizer$Settings;)V" />
+ <method name="setStrength(S)V" />
+ <field name="PARAM_STRENGTH" />
+ <field name="PARAM_STRENGTH_SUPPORTED" />
+ <field name="VIRTUALIZATION_MODE_AUTO" since="21" />
+ <field name="VIRTUALIZATION_MODE_BINAURAL" since="21" />
+ <field name="VIRTUALIZATION_MODE_OFF" since="21" />
+ <field name="VIRTUALIZATION_MODE_TRANSAURAL" since="21" />
+ </class>
+ <class name="android/media/audiofx/Virtualizer$OnParameterChangeListener" since="9">
+ <extends name="java/lang/Object" />
+ <method name="onParameterChange(Landroid/media/audiofx/Virtualizer;IIS)V" />
+ </class>
+ <class name="android/media/audiofx/Virtualizer$Settings" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <field name="strength" />
+ </class>
+ <class name="android/media/audiofx/Visualizer" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(I)V" />
+ <method name="getCaptureSize()I" />
+ <method name="getCaptureSizeRange()[I" />
+ <method name="getEnabled()Z" />
+ <method name="getFft([B)I" />
+ <method name="getMaxCaptureRate()I" />
+ <method name="getMeasurementMode()I" since="19" />
+ <method name="getMeasurementPeakRms(Landroid/media/audiofx/Visualizer$MeasurementPeakRms;)I" since="19" />
+ <method name="getSamplingRate()I" />
+ <method name="getScalingMode()I" since="16" />
+ <method name="getWaveForm([B)I" />
+ <method name="release()V" />
+ <method name="setCaptureSize(I)I" />
+ <method name="setDataCaptureListener(Landroid/media/audiofx/Visualizer$OnDataCaptureListener;IZZ)I" />
+ <method name="setEnabled(Z)I" />
+ <method name="setMeasurementMode(I)I" since="19" />
+ <method name="setScalingMode(I)I" since="16" />
+ <field name="ALREADY_EXISTS" />
+ <field name="ERROR" />
+ <field name="ERROR_BAD_VALUE" />
+ <field name="ERROR_DEAD_OBJECT" />
+ <field name="ERROR_INVALID_OPERATION" />
+ <field name="ERROR_NO_INIT" />
+ <field name="ERROR_NO_MEMORY" />
+ <field name="MEASUREMENT_MODE_NONE" since="19" />
+ <field name="MEASUREMENT_MODE_PEAK_RMS" since="19" />
+ <field name="SCALING_MODE_AS_PLAYED" since="16" />
+ <field name="SCALING_MODE_NORMALIZED" since="16" />
+ <field name="STATE_ENABLED" />
+ <field name="STATE_INITIALIZED" />
+ <field name="STATE_UNINITIALIZED" />
+ <field name="SUCCESS" />
+ </class>
+ <class name="android/media/audiofx/Visualizer$MeasurementPeakRms" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="mPeak" />
+ <field name="mRms" />
+ </class>
+ <class name="android/media/audiofx/Visualizer$OnDataCaptureListener" since="9">
+ <extends name="java/lang/Object" />
+ <method name="onFftDataCapture(Landroid/media/audiofx/Visualizer;[BI)V" />
+ <method name="onWaveFormDataCapture(Landroid/media/audiofx/Visualizer;[BI)V" />
+ </class>
+ <class name="android/media/browse/MediaBrowser" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/content/ComponentName;Landroid/media/browse/MediaBrowser$ConnectionCallback;Landroid/os/Bundle;)V" />
+ <method name="connect()V" />
+ <method name="disconnect()V" />
+ <method name="getExtras()Landroid/os/Bundle;" />
+ <method name="getRoot()Ljava/lang/String;" />
+ <method name="getServiceComponent()Landroid/content/ComponentName;" />
+ <method name="getSessionToken()Landroid/media/session/MediaSession$Token;" />
+ <method name="isConnected()Z" />
+ <method name="subscribe(Ljava/lang/String;Landroid/media/browse/MediaBrowser$SubscriptionCallback;)V" />
+ <method name="unsubscribe(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/media/browse/MediaBrowser$ConnectionCallback" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onConnected()V" />
+ <method name="onConnectionFailed()V" />
+ <method name="onConnectionSuspended()V" />
+ </class>
+ <class name="android/media/browse/MediaBrowser$MediaItem" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/media/MediaDescription;I)V" />
+ <method name="getDescription()Landroid/media/MediaDescription;" />
+ <method name="getFlags()I" />
+ <method name="getMediaId()Ljava/lang/String;" />
+ <method name="isBrowsable()Z" />
+ <method name="isPlayable()Z" />
+ <field name="CREATOR" />
+ <field name="FLAG_BROWSABLE" />
+ <field name="FLAG_PLAYABLE" />
+ </class>
+ <class name="android/media/browse/MediaBrowser$SubscriptionCallback" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onChildrenLoaded(Ljava/lang/String;Ljava/util/List;)V" />
+ <method name="onError(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/media/effect/Effect" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="apply(IIII)V" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="release()V" />
+ <method name="setParameter(Ljava/lang/String;Ljava/lang/Object;)V" />
+ <method name="setUpdateListener(Landroid/media/effect/EffectUpdateListener;)V" />
+ </class>
+ <class name="android/media/effect/EffectContext" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="createWithCurrentGlContext()Landroid/media/effect/EffectContext;" />
+ <method name="getFactory()Landroid/media/effect/EffectFactory;" />
+ <method name="release()V" />
+ </class>
+ <class name="android/media/effect/EffectFactory" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="createEffect(Ljava/lang/String;)Landroid/media/effect/Effect;" />
+ <method name="isEffectSupported(Ljava/lang/String;)Z" />
+ <field name="EFFECT_AUTOFIX" />
+ <field name="EFFECT_BACKDROPPER" />
+ <field name="EFFECT_BITMAPOVERLAY" />
+ <field name="EFFECT_BLACKWHITE" />
+ <field name="EFFECT_BRIGHTNESS" />
+ <field name="EFFECT_CONTRAST" />
+ <field name="EFFECT_CROP" />
+ <field name="EFFECT_CROSSPROCESS" />
+ <field name="EFFECT_DOCUMENTARY" />
+ <field name="EFFECT_DUOTONE" />
+ <field name="EFFECT_FILLLIGHT" />
+ <field name="EFFECT_FISHEYE" />
+ <field name="EFFECT_FLIP" />
+ <field name="EFFECT_GRAIN" />
+ <field name="EFFECT_GRAYSCALE" />
+ <field name="EFFECT_LOMOISH" />
+ <field name="EFFECT_NEGATIVE" />
+ <field name="EFFECT_POSTERIZE" />
+ <field name="EFFECT_REDEYE" />
+ <field name="EFFECT_ROTATE" />
+ <field name="EFFECT_SATURATE" />
+ <field name="EFFECT_SEPIA" />
+ <field name="EFFECT_SHARPEN" />
+ <field name="EFFECT_STRAIGHTEN" />
+ <field name="EFFECT_TEMPERATURE" />
+ <field name="EFFECT_TINT" />
+ <field name="EFFECT_VIGNETTE" />
+ </class>
+ <class name="android/media/effect/EffectUpdateListener" since="14">
+ <extends name="java/lang/Object" />
+ <method name="onEffectUpdated(Landroid/media/effect/Effect;Ljava/lang/Object;)V" />
+ </class>
+ <class name="android/media/projection/MediaProjection" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="createVirtualDisplay(Ljava/lang/String;IIIILandroid/view/Surface;Landroid/hardware/display/VirtualDisplay$Callback;Landroid/os/Handler;)Landroid/hardware/display/VirtualDisplay;" />
+ <method name="registerCallback(Landroid/media/projection/MediaProjection$Callback;Landroid/os/Handler;)V" />
+ <method name="stop()V" />
+ <method name="unregisterCallback(Landroid/media/projection/MediaProjection$Callback;)V" />
+ </class>
+ <class name="android/media/projection/MediaProjection$Callback" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onStop()V" />
+ </class>
+ <class name="android/media/projection/MediaProjectionManager" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="createScreenCaptureIntent()Landroid/content/Intent;" />
+ <method name="getMediaProjection(ILandroid/content/Intent;)Landroid/media/projection/MediaProjection;" />
+ </class>
+ <class name="android/media/session/MediaController" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/media/session/MediaSession$Token;)V" />
+ <method name="adjustVolume(II)V" />
+ <method name="dispatchMediaButtonEvent(Landroid/view/KeyEvent;)Z" />
+ <method name="getExtras()Landroid/os/Bundle;" />
+ <method name="getFlags()J" />
+ <method name="getMetadata()Landroid/media/MediaMetadata;" />
+ <method name="getPackageName()Ljava/lang/String;" />
+ <method name="getPlaybackInfo()Landroid/media/session/MediaController$PlaybackInfo;" />
+ <method name="getPlaybackState()Landroid/media/session/PlaybackState;" />
+ <method name="getQueue()Ljava/util/List;" />
+ <method name="getQueueTitle()Ljava/lang/CharSequence;" />
+ <method name="getRatingType()I" />
+ <method name="getSessionActivity()Landroid/app/PendingIntent;" />
+ <method name="getSessionToken()Landroid/media/session/MediaSession$Token;" />
+ <method name="getTransportControls()Landroid/media/session/MediaController$TransportControls;" />
+ <method name="registerCallback(Landroid/media/session/MediaController$Callback;)V" />
+ <method name="registerCallback(Landroid/media/session/MediaController$Callback;Landroid/os/Handler;)V" />
+ <method name="sendCommand(Ljava/lang/String;Landroid/os/Bundle;Landroid/os/ResultReceiver;)V" />
+ <method name="setVolumeTo(II)V" />
+ <method name="unregisterCallback(Landroid/media/session/MediaController$Callback;)V" />
+ </class>
+ <class name="android/media/session/MediaController$Callback" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onAudioInfoChanged(Landroid/media/session/MediaController$PlaybackInfo;)V" />
+ <method name="onExtrasChanged(Landroid/os/Bundle;)V" />
+ <method name="onMetadataChanged(Landroid/media/MediaMetadata;)V" />
+ <method name="onPlaybackStateChanged(Landroid/media/session/PlaybackState;)V" />
+ <method name="onQueueChanged(Ljava/util/List;)V" />
+ <method name="onQueueTitleChanged(Ljava/lang/CharSequence;)V" />
+ <method name="onSessionDestroyed()V" />
+ <method name="onSessionEvent(Ljava/lang/String;Landroid/os/Bundle;)V" />
+ </class>
+ <class name="android/media/session/MediaController$PlaybackInfo" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getAudioAttributes()Landroid/media/AudioAttributes;" />
+ <method name="getCurrentVolume()I" />
+ <method name="getMaxVolume()I" />
+ <method name="getPlaybackType()I" />
+ <method name="getVolumeControl()I" />
+ <field name="PLAYBACK_TYPE_LOCAL" />
+ <field name="PLAYBACK_TYPE_REMOTE" />
+ </class>
+ <class name="android/media/session/MediaController$TransportControls" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/media/session/MediaController;)V" />
+ <method name="fastForward()V" />
+ <method name="pause()V" />
+ <method name="play()V" />
+ <method name="playFromMediaId(Ljava/lang/String;Landroid/os/Bundle;)V" />
+ <method name="playFromSearch(Ljava/lang/String;Landroid/os/Bundle;)V" />
+ <method name="rewind()V" />
+ <method name="seekTo(J)V" />
+ <method name="sendCustomAction(Landroid/media/session/PlaybackState$CustomAction;Landroid/os/Bundle;)V" />
+ <method name="sendCustomAction(Ljava/lang/String;Landroid/os/Bundle;)V" />
+ <method name="setRating(Landroid/media/Rating;)V" />
+ <method name="skipToNext()V" />
+ <method name="skipToPrevious()V" />
+ <method name="skipToQueueItem(J)V" />
+ <method name="stop()V" />
+ </class>
+ <class name="android/media/session/MediaSession" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;Ljava/lang/String;)V" />
+ <method name="getController()Landroid/media/session/MediaController;" />
+ <method name="getSessionToken()Landroid/media/session/MediaSession$Token;" />
+ <method name="isActive()Z" />
+ <method name="release()V" />
+ <method name="sendSessionEvent(Ljava/lang/String;Landroid/os/Bundle;)V" />
+ <method name="setActive(Z)V" />
+ <method name="setCallback(Landroid/media/session/MediaSession$Callback;)V" />
+ <method name="setCallback(Landroid/media/session/MediaSession$Callback;Landroid/os/Handler;)V" />
+ <method name="setExtras(Landroid/os/Bundle;)V" />
+ <method name="setFlags(I)V" />
+ <method name="setMediaButtonReceiver(Landroid/app/PendingIntent;)V" />
+ <method name="setMetadata(Landroid/media/MediaMetadata;)V" />
+ <method name="setPlaybackState(Landroid/media/session/PlaybackState;)V" />
+ <method name="setPlaybackToLocal(Landroid/media/AudioAttributes;)V" />
+ <method name="setPlaybackToRemote(Landroid/media/VolumeProvider;)V" />
+ <method name="setQueue(Ljava/util/List;)V" />
+ <method name="setQueueTitle(Ljava/lang/CharSequence;)V" />
+ <method name="setSessionActivity(Landroid/app/PendingIntent;)V" />
+ <field name="FLAG_HANDLES_MEDIA_BUTTONS" />
+ <field name="FLAG_HANDLES_TRANSPORT_CONTROLS" />
+ </class>
+ <class name="android/media/session/MediaSession$Callback" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onCommand(Ljava/lang/String;Landroid/os/Bundle;Landroid/os/ResultReceiver;)V" />
+ <method name="onCustomAction(Ljava/lang/String;Landroid/os/Bundle;)V" />
+ <method name="onFastForward()V" />
+ <method name="onMediaButtonEvent(Landroid/content/Intent;)Z" />
+ <method name="onPause()V" />
+ <method name="onPlay()V" />
+ <method name="onPlayFromMediaId(Ljava/lang/String;Landroid/os/Bundle;)V" />
+ <method name="onPlayFromSearch(Ljava/lang/String;Landroid/os/Bundle;)V" />
+ <method name="onRewind()V" />
+ <method name="onSeekTo(J)V" />
+ <method name="onSetRating(Landroid/media/Rating;)V" />
+ <method name="onSkipToNext()V" />
+ <method name="onSkipToPrevious()V" />
+ <method name="onSkipToQueueItem(J)V" />
+ <method name="onStop()V" />
+ </class>
+ <class name="android/media/session/MediaSession$QueueItem" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/media/MediaDescription;J)V" />
+ <method name="getDescription()Landroid/media/MediaDescription;" />
+ <method name="getQueueId()J" />
+ <field name="CREATOR" />
+ <field name="UNKNOWN_ID" />
+ </class>
+ <class name="android/media/session/MediaSession$Token" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/media/session/MediaSessionManager" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addOnActiveSessionsChangedListener(Landroid/media/session/MediaSessionManager$OnActiveSessionsChangedListener;Landroid/content/ComponentName;)V" />
+ <method name="addOnActiveSessionsChangedListener(Landroid/media/session/MediaSessionManager$OnActiveSessionsChangedListener;Landroid/content/ComponentName;Landroid/os/Handler;)V" />
+ <method name="getActiveSessions(Landroid/content/ComponentName;)Ljava/util/List;" />
+ <method name="removeOnActiveSessionsChangedListener(Landroid/media/session/MediaSessionManager$OnActiveSessionsChangedListener;)V" />
+ </class>
+ <class name="android/media/session/MediaSessionManager$OnActiveSessionsChangedListener" since="21">
+ <extends name="java/lang/Object" />
+ <method name="onActiveSessionsChanged(Ljava/util/List;)V" />
+ </class>
+ <class name="android/media/session/PlaybackState" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getActions()J" />
+ <method name="getActiveQueueItemId()J" />
+ <method name="getBufferedPosition()J" />
+ <method name="getCustomActions()Ljava/util/List;" />
+ <method name="getErrorMessage()Ljava/lang/CharSequence;" />
+ <method name="getLastPositionUpdateTime()J" />
+ <method name="getPlaybackSpeed()F" />
+ <method name="getPosition()J" />
+ <method name="getState()I" />
+ <field name="ACTION_FAST_FORWARD" />
+ <field name="ACTION_PAUSE" />
+ <field name="ACTION_PLAY" />
+ <field name="ACTION_PLAY_FROM_MEDIA_ID" />
+ <field name="ACTION_PLAY_FROM_SEARCH" />
+ <field name="ACTION_PLAY_PAUSE" />
+ <field name="ACTION_REWIND" />
+ <field name="ACTION_SEEK_TO" />
+ <field name="ACTION_SET_RATING" />
+ <field name="ACTION_SKIP_TO_NEXT" />
+ <field name="ACTION_SKIP_TO_PREVIOUS" />
+ <field name="ACTION_SKIP_TO_QUEUE_ITEM" />
+ <field name="ACTION_STOP" />
+ <field name="CREATOR" />
+ <field name="PLAYBACK_POSITION_UNKNOWN" />
+ <field name="STATE_BUFFERING" />
+ <field name="STATE_CONNECTING" />
+ <field name="STATE_ERROR" />
+ <field name="STATE_FAST_FORWARDING" />
+ <field name="STATE_NONE" />
+ <field name="STATE_PAUSED" />
+ <field name="STATE_PLAYING" />
+ <field name="STATE_REWINDING" />
+ <field name="STATE_SKIPPING_TO_NEXT" />
+ <field name="STATE_SKIPPING_TO_PREVIOUS" />
+ <field name="STATE_SKIPPING_TO_QUEUE_ITEM" />
+ <field name="STATE_STOPPED" />
+ </class>
+ <class name="android/media/session/PlaybackState$Builder" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/media/session/PlaybackState;)V" />
+ <method name="addCustomAction(Landroid/media/session/PlaybackState$CustomAction;)Landroid/media/session/PlaybackState$Builder;" />
+ <method name="addCustomAction(Ljava/lang/String;Ljava/lang/String;I)Landroid/media/session/PlaybackState$Builder;" />
+ <method name="build()Landroid/media/session/PlaybackState;" />
+ <method name="setActions(J)Landroid/media/session/PlaybackState$Builder;" />
+ <method name="setActiveQueueItemId(J)Landroid/media/session/PlaybackState$Builder;" />
+ <method name="setBufferedPosition(J)Landroid/media/session/PlaybackState$Builder;" />
+ <method name="setErrorMessage(Ljava/lang/CharSequence;)Landroid/media/session/PlaybackState$Builder;" />
+ <method name="setState(IJF)Landroid/media/session/PlaybackState$Builder;" />
+ <method name="setState(IJFJ)Landroid/media/session/PlaybackState$Builder;" />
+ </class>
+ <class name="android/media/session/PlaybackState$CustomAction" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getAction()Ljava/lang/String;" />
+ <method name="getExtras()Landroid/os/Bundle;" />
+ <method name="getIcon()I" />
+ <method name="getName()Ljava/lang/CharSequence;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/media/session/PlaybackState$CustomAction$Builder" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/CharSequence;I)V" />
+ <method name="build()Landroid/media/session/PlaybackState$CustomAction;" />
+ <method name="setExtras(Landroid/os/Bundle;)Landroid/media/session/PlaybackState$CustomAction$Builder;" />
+ </class>
+ <class name="android/media/tv/TvContentRating" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="createRating(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)Landroid/media/tv/TvContentRating;" />
+ <method name="flattenToString()Ljava/lang/String;" />
+ <method name="getDomain()Ljava/lang/String;" />
+ <method name="getMainRating()Ljava/lang/String;" />
+ <method name="getRatingSystem()Ljava/lang/String;" />
+ <method name="getSubRatings()Ljava/util/List;" />
+ <method name="unflattenFromString(Ljava/lang/String;)Landroid/media/tv/TvContentRating;" />
+ </class>
+ <class name="android/media/tv/TvContract" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="buildChannelLogoUri(J)Landroid/net/Uri;" />
+ <method name="buildChannelLogoUri(Landroid/net/Uri;)Landroid/net/Uri;" />
+ <method name="buildChannelUri(J)Landroid/net/Uri;" />
+ <method name="buildChannelUriForPassthroughInput(Ljava/lang/String;)Landroid/net/Uri;" />
+ <method name="buildChannelsUriForInput(Ljava/lang/String;)Landroid/net/Uri;" />
+ <method name="buildInputId(Landroid/content/ComponentName;)Ljava/lang/String;" />
+ <method name="buildProgramUri(J)Landroid/net/Uri;" />
+ <method name="buildProgramsUriForChannel(J)Landroid/net/Uri;" />
+ <method name="buildProgramsUriForChannel(JJJ)Landroid/net/Uri;" />
+ <method name="buildProgramsUriForChannel(Landroid/net/Uri;)Landroid/net/Uri;" />
+ <method name="buildProgramsUriForChannel(Landroid/net/Uri;JJ)Landroid/net/Uri;" />
+ <field name="AUTHORITY" />
+ </class>
+ <class name="android/media/tv/TvContract$BaseTvColumns" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <field name="COLUMN_PACKAGE_NAME" />
+ </class>
+ <class name="android/media/tv/TvContract$Channels" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/media/tv/TvContract$BaseTvColumns" />
+ <method name="&lt;init>()V" />
+ <method name="getVideoResolution(Ljava/lang/String;)Ljava/lang/String;" />
+ <field name="COLUMN_DESCRIPTION" />
+ <field name="COLUMN_DISPLAY_NAME" />
+ <field name="COLUMN_DISPLAY_NUMBER" />
+ <field name="COLUMN_INPUT_ID" />
+ <field name="COLUMN_INTERNAL_PROVIDER_DATA" />
+ <field name="COLUMN_NETWORK_AFFILIATION" />
+ <field name="COLUMN_ORIGINAL_NETWORK_ID" />
+ <field name="COLUMN_SEARCHABLE" />
+ <field name="COLUMN_SERVICE_ID" />
+ <field name="COLUMN_SERVICE_TYPE" />
+ <field name="COLUMN_TRANSPORT_STREAM_ID" />
+ <field name="COLUMN_TYPE" />
+ <field name="COLUMN_VERSION_NUMBER" />
+ <field name="COLUMN_VIDEO_FORMAT" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="CONTENT_TYPE" />
+ <field name="CONTENT_URI" />
+ <field name="SERVICE_TYPE_AUDIO" />
+ <field name="SERVICE_TYPE_AUDIO_VIDEO" />
+ <field name="SERVICE_TYPE_OTHER" />
+ <field name="TYPE_1SEG" />
+ <field name="TYPE_ATSC_C" />
+ <field name="TYPE_ATSC_M_H" />
+ <field name="TYPE_ATSC_T" />
+ <field name="TYPE_CMMB" />
+ <field name="TYPE_DTMB" />
+ <field name="TYPE_DVB_C" />
+ <field name="TYPE_DVB_C2" />
+ <field name="TYPE_DVB_H" />
+ <field name="TYPE_DVB_S" />
+ <field name="TYPE_DVB_S2" />
+ <field name="TYPE_DVB_SH" />
+ <field name="TYPE_DVB_T" />
+ <field name="TYPE_DVB_T2" />
+ <field name="TYPE_ISDB_C" />
+ <field name="TYPE_ISDB_S" />
+ <field name="TYPE_ISDB_T" />
+ <field name="TYPE_ISDB_TB" />
+ <field name="TYPE_NTSC" />
+ <field name="TYPE_OTHER" />
+ <field name="TYPE_PAL" />
+ <field name="TYPE_SECAM" />
+ <field name="TYPE_S_DMB" />
+ <field name="TYPE_T_DMB" />
+ <field name="VIDEO_FORMAT_1080I" />
+ <field name="VIDEO_FORMAT_1080P" />
+ <field name="VIDEO_FORMAT_2160P" />
+ <field name="VIDEO_FORMAT_240P" />
+ <field name="VIDEO_FORMAT_360P" />
+ <field name="VIDEO_FORMAT_4320P" />
+ <field name="VIDEO_FORMAT_480I" />
+ <field name="VIDEO_FORMAT_480P" />
+ <field name="VIDEO_FORMAT_576I" />
+ <field name="VIDEO_FORMAT_576P" />
+ <field name="VIDEO_FORMAT_720P" />
+ <field name="VIDEO_RESOLUTION_ED" />
+ <field name="VIDEO_RESOLUTION_FHD" />
+ <field name="VIDEO_RESOLUTION_HD" />
+ <field name="VIDEO_RESOLUTION_SD" />
+ <field name="VIDEO_RESOLUTION_UHD" />
+ </class>
+ <class name="android/media/tv/TvContract$Channels$Logo" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_DIRECTORY" />
+ </class>
+ <class name="android/media/tv/TvContract$Programs" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/media/tv/TvContract$BaseTvColumns" />
+ <method name="&lt;init>()V" />
+ <field name="COLUMN_AUDIO_LANGUAGE" />
+ <field name="COLUMN_BROADCAST_GENRE" />
+ <field name="COLUMN_CANONICAL_GENRE" />
+ <field name="COLUMN_CHANNEL_ID" />
+ <field name="COLUMN_CONTENT_RATING" />
+ <field name="COLUMN_END_TIME_UTC_MILLIS" />
+ <field name="COLUMN_EPISODE_NUMBER" />
+ <field name="COLUMN_EPISODE_TITLE" />
+ <field name="COLUMN_INTERNAL_PROVIDER_DATA" />
+ <field name="COLUMN_LONG_DESCRIPTION" />
+ <field name="COLUMN_POSTER_ART_URI" />
+ <field name="COLUMN_SEASON_NUMBER" />
+ <field name="COLUMN_SHORT_DESCRIPTION" />
+ <field name="COLUMN_START_TIME_UTC_MILLIS" />
+ <field name="COLUMN_THUMBNAIL_URI" />
+ <field name="COLUMN_TITLE" />
+ <field name="COLUMN_VERSION_NUMBER" />
+ <field name="COLUMN_VIDEO_HEIGHT" />
+ <field name="COLUMN_VIDEO_WIDTH" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="CONTENT_TYPE" />
+ <field name="CONTENT_URI" />
+ </class>
+ <class name="android/media/tv/TvContract$Programs$Genres" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="decode(Ljava/lang/String;)[Ljava/lang/String;" />
+ <method name="encode([Ljava/lang/String;)Ljava/lang/String;" />
+ <field name="ANIMAL_WILDLIFE" />
+ <field name="COMEDY" />
+ <field name="DRAMA" />
+ <field name="EDUCATION" />
+ <field name="FAMILY_KIDS" />
+ <field name="GAMING" />
+ <field name="MOVIES" />
+ <field name="NEWS" />
+ <field name="SHOPPING" />
+ <field name="SPORTS" />
+ <field name="TRAVEL" />
+ </class>
+ <class name="android/media/tv/TvInputInfo" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="createSettingsIntent()Landroid/content/Intent;" />
+ <method name="createSetupIntent()Landroid/content/Intent;" />
+ <method name="getId()Ljava/lang/String;" />
+ <method name="getParentId()Ljava/lang/String;" />
+ <method name="getServiceInfo()Landroid/content/pm/ServiceInfo;" />
+ <method name="getType()I" />
+ <method name="isPassthroughInput()Z" />
+ <method name="loadIcon(Landroid/content/Context;)Landroid/graphics/drawable/Drawable;" />
+ <method name="loadLabel(Landroid/content/Context;)Ljava/lang/CharSequence;" />
+ <field name="CREATOR" />
+ <field name="EXTRA_INPUT_ID" />
+ <field name="TYPE_COMPONENT" />
+ <field name="TYPE_COMPOSITE" />
+ <field name="TYPE_DISPLAY_PORT" />
+ <field name="TYPE_DVI" />
+ <field name="TYPE_HDMI" />
+ <field name="TYPE_OTHER" />
+ <field name="TYPE_SCART" />
+ <field name="TYPE_SVIDEO" />
+ <field name="TYPE_TUNER" />
+ <field name="TYPE_VGA" />
+ </class>
+ <class name="android/media/tv/TvInputManager" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getInputState(Ljava/lang/String;)I" />
+ <method name="getTvInputInfo(Ljava/lang/String;)Landroid/media/tv/TvInputInfo;" />
+ <method name="getTvInputList()Ljava/util/List;" />
+ <method name="isParentalControlsEnabled()Z" />
+ <method name="isRatingBlocked(Landroid/media/tv/TvContentRating;)Z" />
+ <method name="registerCallback(Landroid/media/tv/TvInputManager$TvInputCallback;Landroid/os/Handler;)V" />
+ <method name="unregisterCallback(Landroid/media/tv/TvInputManager$TvInputCallback;)V" />
+ <field name="ACTION_BLOCKED_RATINGS_CHANGED" />
+ <field name="ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED" />
+ <field name="ACTION_QUERY_CONTENT_RATING_SYSTEMS" />
+ <field name="INPUT_STATE_CONNECTED" />
+ <field name="INPUT_STATE_CONNECTED_STANDBY" />
+ <field name="INPUT_STATE_DISCONNECTED" />
+ <field name="META_DATA_CONTENT_RATING_SYSTEMS" />
+ <field name="VIDEO_UNAVAILABLE_REASON_BUFFERING" />
+ <field name="VIDEO_UNAVAILABLE_REASON_TUNING" />
+ <field name="VIDEO_UNAVAILABLE_REASON_UNKNOWN" />
+ <field name="VIDEO_UNAVAILABLE_REASON_WEAK_SIGNAL" />
+ </class>
+ <class name="android/media/tv/TvInputManager$TvInputCallback" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onInputAdded(Ljava/lang/String;)V" />
+ <method name="onInputRemoved(Ljava/lang/String;)V" />
+ <method name="onInputStateChanged(Ljava/lang/String;I)V" />
+ </class>
+ <class name="android/media/tv/TvInputService" since="21">
+ <extends name="android/app/Service" />
+ <method name="&lt;init>()V" />
+ <method name="onCreateSession(Ljava/lang/String;)Landroid/media/tv/TvInputService$Session;" />
+ <field name="SERVICE_INTERFACE" />
+ <field name="SERVICE_META_DATA" />
+ </class>
+ <class name="android/media/tv/TvInputService$HardwareSession" since="21">
+ <extends name="android/media/tv/TvInputService$Session" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="getHardwareInputId()Ljava/lang/String;" />
+ <method name="onHardwareVideoAvailable()V" />
+ <method name="onHardwareVideoUnavailable(I)V" />
+ </class>
+ <class name="android/media/tv/TvInputService$Session" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/KeyEvent$Callback" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="notifyChannelRetuned(Landroid/net/Uri;)V" />
+ <method name="notifyContentAllowed()V" />
+ <method name="notifyContentBlocked(Landroid/media/tv/TvContentRating;)V" />
+ <method name="notifyTrackSelected(ILjava/lang/String;)V" />
+ <method name="notifyTracksChanged(Ljava/util/List;)V" />
+ <method name="notifyVideoAvailable()V" />
+ <method name="notifyVideoUnavailable(I)V" />
+ <method name="onCreateOverlayView()Landroid/view/View;" />
+ <method name="onGenericMotionEvent(Landroid/view/MotionEvent;)Z" />
+ <method name="onRelease()V" />
+ <method name="onSelectTrack(ILjava/lang/String;)Z" />
+ <method name="onSetCaptionEnabled(Z)V" />
+ <method name="onSetStreamVolume(F)V" />
+ <method name="onSetSurface(Landroid/view/Surface;)Z" />
+ <method name="onSurfaceChanged(III)V" />
+ <method name="onTouchEvent(Landroid/view/MotionEvent;)Z" />
+ <method name="onTrackballEvent(Landroid/view/MotionEvent;)Z" />
+ <method name="onTune(Landroid/net/Uri;)Z" />
+ <method name="onUnblockContent(Landroid/media/tv/TvContentRating;)V" />
+ <method name="setOverlayViewEnabled(Z)V" />
+ </class>
+ <class name="android/media/tv/TvTrackInfo" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getAudioChannelCount()I" />
+ <method name="getAudioSampleRate()I" />
+ <method name="getExtra()Landroid/os/Bundle;" />
+ <method name="getId()Ljava/lang/String;" />
+ <method name="getLanguage()Ljava/lang/String;" />
+ <method name="getType()I" />
+ <method name="getVideoFrameRate()F" />
+ <method name="getVideoHeight()I" />
+ <method name="getVideoWidth()I" />
+ <field name="CREATOR" />
+ <field name="TYPE_AUDIO" />
+ <field name="TYPE_SUBTITLE" />
+ <field name="TYPE_VIDEO" />
+ </class>
+ <class name="android/media/tv/TvTrackInfo$Builder" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(ILjava/lang/String;)V" />
+ <method name="build()Landroid/media/tv/TvTrackInfo;" />
+ <method name="setAudioChannelCount(I)Landroid/media/tv/TvTrackInfo$Builder;" />
+ <method name="setAudioSampleRate(I)Landroid/media/tv/TvTrackInfo$Builder;" />
+ <method name="setExtra(Landroid/os/Bundle;)Landroid/media/tv/TvTrackInfo$Builder;" />
+ <method name="setLanguage(Ljava/lang/String;)Landroid/media/tv/TvTrackInfo$Builder;" />
+ <method name="setVideoFrameRate(F)Landroid/media/tv/TvTrackInfo$Builder;" />
+ <method name="setVideoHeight(I)Landroid/media/tv/TvTrackInfo$Builder;" />
+ <method name="setVideoWidth(I)Landroid/media/tv/TvTrackInfo$Builder;" />
+ </class>
+ <class name="android/media/tv/TvView" since="21">
+ <extends name="android/view/ViewGroup" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="dispatchUnhandledInputEvent(Landroid/view/InputEvent;)Z" />
+ <method name="getSelectedTrack(I)Ljava/lang/String;" />
+ <method name="getTracks(I)Ljava/util/List;" />
+ <method name="onUnhandledInputEvent(Landroid/view/InputEvent;)Z" />
+ <method name="reset()V" />
+ <method name="selectTrack(ILjava/lang/String;)V" />
+ <method name="setCallback(Landroid/media/tv/TvView$TvInputCallback;)V" />
+ <method name="setCaptionEnabled(Z)V" />
+ <method name="setOnUnhandledInputEventListener(Landroid/media/tv/TvView$OnUnhandledInputEventListener;)V" />
+ <method name="setStreamVolume(F)V" />
+ <method name="tune(Ljava/lang/String;Landroid/net/Uri;)V" />
+ </class>
+ <class name="android/media/tv/TvView$OnUnhandledInputEventListener" since="21">
+ <extends name="java/lang/Object" />
+ <method name="onUnhandledInputEvent(Landroid/view/InputEvent;)Z" />
+ </class>
+ <class name="android/media/tv/TvView$TvInputCallback" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onChannelRetuned(Ljava/lang/String;Landroid/net/Uri;)V" />
+ <method name="onConnectionFailed(Ljava/lang/String;)V" />
+ <method name="onContentAllowed(Ljava/lang/String;)V" />
+ <method name="onContentBlocked(Ljava/lang/String;Landroid/media/tv/TvContentRating;)V" />
+ <method name="onDisconnected(Ljava/lang/String;)V" />
+ <method name="onTrackSelected(Ljava/lang/String;ILjava/lang/String;)V" />
+ <method name="onTracksChanged(Ljava/lang/String;Ljava/util/List;)V" />
+ <method name="onVideoAvailable(Ljava/lang/String;)V" />
+ <method name="onVideoSizeChanged(Ljava/lang/String;II)V" />
+ <method name="onVideoUnavailable(Ljava/lang/String;I)V" />
+ </class>
+ <class name="android/mtp/MtpConstants" since="12">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="isAbstractObject(I)Z" />
+ <field name="ASSOCIATION_TYPE_GENERIC_FOLDER" />
+ <field name="FORMAT_3GP_CONTAINER" />
+ <field name="FORMAT_AAC" />
+ <field name="FORMAT_ABSTRACT_AUDIO_ALBUM" />
+ <field name="FORMAT_ABSTRACT_AUDIO_PLAYLIST" />
+ <field name="FORMAT_ABSTRACT_AV_PLAYLIST" />
+ <field name="FORMAT_ABSTRACT_DOCUMENT" />
+ <field name="FORMAT_ABSTRACT_IMAGE_ALBUM" />
+ <field name="FORMAT_ABSTRACT_MEDIACAST" />
+ <field name="FORMAT_ABSTRACT_MULTIMEDIA_ALBUM" />
+ <field name="FORMAT_ABSTRACT_VIDEO_ALBUM" />
+ <field name="FORMAT_ABSTRACT_VIDEO_PLAYLIST" />
+ <field name="FORMAT_AIFF" />
+ <field name="FORMAT_ASF" />
+ <field name="FORMAT_ASSOCIATION" />
+ <field name="FORMAT_ASX_PLAYLIST" />
+ <field name="FORMAT_AUDIBLE" />
+ <field name="FORMAT_AVI" />
+ <field name="FORMAT_BMP" />
+ <field name="FORMAT_DPOF" />
+ <field name="FORMAT_EXECUTABLE" />
+ <field name="FORMAT_EXIF_JPEG" />
+ <field name="FORMAT_FLAC" />
+ <field name="FORMAT_GIF" />
+ <field name="FORMAT_HTML" />
+ <field name="FORMAT_JFIF" />
+ <field name="FORMAT_JP2" />
+ <field name="FORMAT_JPX" />
+ <field name="FORMAT_M3U_PLAYLIST" />
+ <field name="FORMAT_MP2" />
+ <field name="FORMAT_MP3" />
+ <field name="FORMAT_MP4_CONTAINER" />
+ <field name="FORMAT_MPEG" />
+ <field name="FORMAT_MPL_PLAYLIST" />
+ <field name="FORMAT_MS_EXCEL_SPREADSHEET" />
+ <field name="FORMAT_MS_POWERPOINT_PRESENTATION" />
+ <field name="FORMAT_MS_WORD_DOCUMENT" />
+ <field name="FORMAT_OGG" />
+ <field name="FORMAT_PICT" />
+ <field name="FORMAT_PLS_PLAYLIST" />
+ <field name="FORMAT_PNG" />
+ <field name="FORMAT_SCRIPT" />
+ <field name="FORMAT_TEXT" />
+ <field name="FORMAT_TIFF" />
+ <field name="FORMAT_TIFF_EP" />
+ <field name="FORMAT_UNDEFINED" />
+ <field name="FORMAT_UNDEFINED_AUDIO" />
+ <field name="FORMAT_UNDEFINED_COLLECTION" />
+ <field name="FORMAT_UNDEFINED_DOCUMENT" />
+ <field name="FORMAT_UNDEFINED_FIRMWARE" />
+ <field name="FORMAT_UNDEFINED_VIDEO" />
+ <field name="FORMAT_WAV" />
+ <field name="FORMAT_WINDOWS_IMAGE_FORMAT" />
+ <field name="FORMAT_WMA" />
+ <field name="FORMAT_WMV" />
+ <field name="FORMAT_WPL_PLAYLIST" />
+ <field name="FORMAT_XML_DOCUMENT" />
+ <field name="PROTECTION_STATUS_NONE" />
+ <field name="PROTECTION_STATUS_NON_TRANSFERABLE_DATA" />
+ <field name="PROTECTION_STATUS_READ_ONLY" />
+ <field name="PROTECTION_STATUS_READ_ONLY_DATA" />
+ </class>
+ <class name="android/mtp/MtpDevice" since="12">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/hardware/usb/UsbDevice;)V" />
+ <method name="close()V" />
+ <method name="deleteObject(I)Z" />
+ <method name="getDeviceId()I" />
+ <method name="getDeviceInfo()Landroid/mtp/MtpDeviceInfo;" />
+ <method name="getDeviceName()Ljava/lang/String;" />
+ <method name="getObject(II)[B" />
+ <method name="getObjectHandles(III)[I" />
+ <method name="getObjectInfo(I)Landroid/mtp/MtpObjectInfo;" />
+ <method name="getParent(I)J" />
+ <method name="getStorageId(I)J" />
+ <method name="getStorageIds()[I" />
+ <method name="getStorageInfo(I)Landroid/mtp/MtpStorageInfo;" />
+ <method name="getThumbnail(I)[B" />
+ <method name="importFile(ILjava/lang/String;)Z" />
+ <method name="open(Landroid/hardware/usb/UsbDeviceConnection;)Z" />
+ </class>
+ <class name="android/mtp/MtpDeviceInfo" since="12">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getManufacturer()Ljava/lang/String;" />
+ <method name="getModel()Ljava/lang/String;" />
+ <method name="getSerialNumber()Ljava/lang/String;" />
+ <method name="getVersion()Ljava/lang/String;" />
+ </class>
+ <class name="android/mtp/MtpObjectInfo" since="12">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getAssociationDesc()I" />
+ <method name="getAssociationType()I" />
+ <method name="getCompressedSize()I" />
+ <method name="getDateCreated()J" />
+ <method name="getDateModified()J" />
+ <method name="getFormat()I" />
+ <method name="getImagePixDepth()I" />
+ <method name="getImagePixHeight()I" />
+ <method name="getImagePixWidth()I" />
+ <method name="getKeywords()Ljava/lang/String;" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getObjectHandle()I" />
+ <method name="getParent()I" />
+ <method name="getProtectionStatus()I" />
+ <method name="getSequenceNumber()I" />
+ <method name="getStorageId()I" />
+ <method name="getThumbCompressedSize()I" />
+ <method name="getThumbFormat()I" />
+ <method name="getThumbPixHeight()I" />
+ <method name="getThumbPixWidth()I" />
+ </class>
+ <class name="android/mtp/MtpStorageInfo" since="12">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getDescription()Ljava/lang/String;" />
+ <method name="getFreeSpace()J" />
+ <method name="getMaxCapacity()J" />
+ <method name="getStorageId()I" />
+ <method name="getVolumeIdentifier()Ljava/lang/String;" />
+ </class>
+ <class name="android/net/ConnectivityManager" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addDefaultNetworkActiveListener(Landroid/net/ConnectivityManager$OnNetworkActiveListener;)V" since="21" />
+ <method name="getActiveNetworkInfo()Landroid/net/NetworkInfo;" />
+ <method name="getAllNetworkInfo()[Landroid/net/NetworkInfo;" />
+ <method name="getAllNetworks()[Landroid/net/Network;" since="21" />
+ <method name="getBackgroundDataSetting()Z" since="3" />
+ <method name="getLinkProperties(Landroid/net/Network;)Landroid/net/LinkProperties;" since="21" />
+ <method name="getNetworkCapabilities(Landroid/net/Network;)Landroid/net/NetworkCapabilities;" since="21" />
+ <method name="getNetworkInfo(I)Landroid/net/NetworkInfo;" />
+ <method name="getNetworkInfo(Landroid/net/Network;)Landroid/net/NetworkInfo;" since="21" />
+ <method name="getNetworkPreference()I" />
+ <method name="getProcessDefaultNetwork()Landroid/net/Network;" since="21" />
+ <method name="isActiveNetworkMetered()Z" since="16" />
+ <method name="isDefaultNetworkActive()Z" since="21" />
+ <method name="isNetworkTypeValid(I)Z" />
+ <method name="registerNetworkCallback(Landroid/net/NetworkRequest;Landroid/net/ConnectivityManager$NetworkCallback;)V" since="21" />
+ <method name="removeDefaultNetworkActiveListener(Landroid/net/ConnectivityManager$OnNetworkActiveListener;)V" since="21" />
+ <method name="reportBadNetwork(Landroid/net/Network;)V" since="21" />
+ <method name="requestNetwork(Landroid/net/NetworkRequest;Landroid/net/ConnectivityManager$NetworkCallback;)V" since="21" />
+ <method name="requestRouteToHost(II)Z" />
+ <method name="setNetworkPreference(I)V" />
+ <method name="setProcessDefaultNetwork(Landroid/net/Network;)Z" since="21" />
+ <method name="startUsingNetworkFeature(ILjava/lang/String;)I" />
+ <method name="stopUsingNetworkFeature(ILjava/lang/String;)I" />
+ <method name="unregisterNetworkCallback(Landroid/net/ConnectivityManager$NetworkCallback;)V" since="21" />
+ <field name="ACTION_BACKGROUND_DATA_SETTING_CHANGED" since="3" />
+ <field name="CONNECTIVITY_ACTION" />
+ <field name="DEFAULT_NETWORK_PREFERENCE" />
+ <field name="EXTRA_EXTRA_INFO" />
+ <field name="EXTRA_IS_FAILOVER" />
+ <field name="EXTRA_NETWORK_INFO" />
+ <field name="EXTRA_NETWORK_TYPE" since="17" />
+ <field name="EXTRA_NO_CONNECTIVITY" />
+ <field name="EXTRA_OTHER_NETWORK_INFO" />
+ <field name="EXTRA_REASON" />
+ <field name="TYPE_BLUETOOTH" since="13" />
+ <field name="TYPE_DUMMY" since="14" />
+ <field name="TYPE_ETHERNET" since="13" />
+ <field name="TYPE_MOBILE" />
+ <field name="TYPE_MOBILE_DUN" since="8" />
+ <field name="TYPE_MOBILE_HIPRI" since="8" />
+ <field name="TYPE_MOBILE_MMS" since="8" />
+ <field name="TYPE_MOBILE_SUPL" since="8" />
+ <field name="TYPE_VPN" since="21" />
+ <field name="TYPE_WIFI" />
+ <field name="TYPE_WIMAX" since="8" />
+ </class>
+ <class name="android/net/ConnectivityManager$NetworkCallback" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onAvailable(Landroid/net/Network;)V" />
+ <method name="onCapabilitiesChanged(Landroid/net/Network;Landroid/net/NetworkCapabilities;)V" />
+ <method name="onLinkPropertiesChanged(Landroid/net/Network;Landroid/net/LinkProperties;)V" />
+ <method name="onLosing(Landroid/net/Network;I)V" />
+ <method name="onLost(Landroid/net/Network;)V" />
+ </class>
+ <class name="android/net/ConnectivityManager$OnNetworkActiveListener" since="21">
+ <extends name="java/lang/Object" />
+ <method name="onNetworkActive()V" />
+ </class>
+ <class name="android/net/Credentials" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(III)V" />
+ <method name="getGid()I" />
+ <method name="getPid()I" />
+ <method name="getUid()I" />
+ </class>
+ <class name="android/net/DhcpInfo" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <field name="dns1" />
+ <field name="dns2" />
+ <field name="gateway" />
+ <field name="ipAddress" />
+ <field name="leaseDuration" />
+ <field name="netmask" />
+ <field name="serverAddress" />
+ </class>
+ <class name="android/net/IpPrefix" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getAddress()Ljava/net/InetAddress;" />
+ <method name="getPrefixLength()I" />
+ <method name="getRawAddress()[B" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/net/LinkAddress" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getAddress()Ljava/net/InetAddress;" />
+ <method name="getFlags()I" />
+ <method name="getPrefixLength()I" />
+ <method name="getScope()I" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/net/LinkProperties" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getDnsServers()Ljava/util/List;" />
+ <method name="getDomains()Ljava/lang/String;" />
+ <method name="getHttpProxy()Landroid/net/ProxyInfo;" />
+ <method name="getInterfaceName()Ljava/lang/String;" />
+ <method name="getLinkAddresses()Ljava/util/List;" />
+ <method name="getRoutes()Ljava/util/List;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/net/LocalServerSocket" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/io/FileDescriptor;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="accept()Landroid/net/LocalSocket;" />
+ <method name="close()V" />
+ <method name="getFileDescriptor()Ljava/io/FileDescriptor;" />
+ <method name="getLocalSocketAddress()Landroid/net/LocalSocketAddress;" />
+ </class>
+ <class name="android/net/LocalSocket" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Closeable" since="17" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" since="19" />
+ <method name="bind(Landroid/net/LocalSocketAddress;)V" />
+ <method name="close()V" />
+ <method name="connect(Landroid/net/LocalSocketAddress;)V" />
+ <method name="connect(Landroid/net/LocalSocketAddress;I)V" />
+ <method name="getAncillaryFileDescriptors()[Ljava/io/FileDescriptor;" />
+ <method name="getFileDescriptor()Ljava/io/FileDescriptor;" />
+ <method name="getInputStream()Ljava/io/InputStream;" />
+ <method name="getLocalSocketAddress()Landroid/net/LocalSocketAddress;" />
+ <method name="getOutputStream()Ljava/io/OutputStream;" />
+ <method name="getPeerCredentials()Landroid/net/Credentials;" />
+ <method name="getReceiveBufferSize()I" />
+ <method name="getRemoteSocketAddress()Landroid/net/LocalSocketAddress;" />
+ <method name="getSendBufferSize()I" />
+ <method name="getSoTimeout()I" />
+ <method name="isBound()Z" />
+ <method name="isClosed()Z" />
+ <method name="isConnected()Z" />
+ <method name="isInputShutdown()Z" />
+ <method name="isOutputShutdown()Z" />
+ <method name="setFileDescriptorsForSend([Ljava/io/FileDescriptor;)V" />
+ <method name="setReceiveBufferSize(I)V" />
+ <method name="setSendBufferSize(I)V" />
+ <method name="setSoTimeout(I)V" />
+ <method name="shutdownInput()V" />
+ <method name="shutdownOutput()V" />
+ <field name="SOCKET_DGRAM" since="19" />
+ <field name="SOCKET_SEQPACKET" since="19" />
+ <field name="SOCKET_STREAM" since="19" />
+ </class>
+ <class name="android/net/LocalSocketAddress" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Landroid/net/LocalSocketAddress$Namespace;)V" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getNamespace()Landroid/net/LocalSocketAddress$Namespace;" />
+ </class>
+ <class name="android/net/LocalSocketAddress$Namespace" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/net/LocalSocketAddress$Namespace;" />
+ <method name="values()[Landroid/net/LocalSocketAddress$Namespace;" />
+ <field name="ABSTRACT" />
+ <field name="FILESYSTEM" />
+ <field name="RESERVED" />
+ </class>
+ <class name="android/net/MailTo" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getBody()Ljava/lang/String;" />
+ <method name="getCc()Ljava/lang/String;" />
+ <method name="getHeaders()Ljava/util/Map;" />
+ <method name="getSubject()Ljava/lang/String;" />
+ <method name="getTo()Ljava/lang/String;" />
+ <method name="isMailTo(Ljava/lang/String;)Z" />
+ <method name="parse(Ljava/lang/String;)Landroid/net/MailTo;" />
+ <field name="MAILTO_SCHEME" />
+ </class>
+ <class name="android/net/Network" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="bindSocket(Ljava/net/Socket;)V" />
+ <method name="getAllByName(Ljava/lang/String;)[Ljava/net/InetAddress;" />
+ <method name="getByName(Ljava/lang/String;)Ljava/net/InetAddress;" />
+ <method name="getSocketFactory()Ljavax/net/SocketFactory;" />
+ <method name="openConnection(Ljava/net/URL;)Ljava/net/URLConnection;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/net/NetworkCapabilities" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/net/NetworkCapabilities;)V" />
+ <method name="getLinkDownstreamBandwidthKbps()I" />
+ <method name="getLinkUpstreamBandwidthKbps()I" />
+ <method name="hasCapability(I)Z" />
+ <method name="hasTransport(I)Z" />
+ <field name="CREATOR" />
+ <field name="NET_CAPABILITY_CBS" />
+ <field name="NET_CAPABILITY_DUN" />
+ <field name="NET_CAPABILITY_EIMS" />
+ <field name="NET_CAPABILITY_FOTA" />
+ <field name="NET_CAPABILITY_IA" />
+ <field name="NET_CAPABILITY_IMS" />
+ <field name="NET_CAPABILITY_INTERNET" />
+ <field name="NET_CAPABILITY_MMS" />
+ <field name="NET_CAPABILITY_NOT_METERED" />
+ <field name="NET_CAPABILITY_NOT_RESTRICTED" />
+ <field name="NET_CAPABILITY_NOT_VPN" />
+ <field name="NET_CAPABILITY_RCS" />
+ <field name="NET_CAPABILITY_SUPL" />
+ <field name="NET_CAPABILITY_TRUSTED" />
+ <field name="NET_CAPABILITY_WIFI_P2P" />
+ <field name="NET_CAPABILITY_XCAP" />
+ <field name="TRANSPORT_BLUETOOTH" />
+ <field name="TRANSPORT_CELLULAR" />
+ <field name="TRANSPORT_ETHERNET" />
+ <field name="TRANSPORT_VPN" />
+ <field name="TRANSPORT_WIFI" />
+ </class>
+ <class name="android/net/NetworkInfo" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" since="3" />
+ <method name="&lt;init>(I)V" />
+ <method name="getDetailedState()Landroid/net/NetworkInfo$DetailedState;" />
+ <method name="getExtraInfo()Ljava/lang/String;" />
+ <method name="getReason()Ljava/lang/String;" />
+ <method name="getState()Landroid/net/NetworkInfo$State;" />
+ <method name="getSubtype()I" since="3" />
+ <method name="getSubtypeName()Ljava/lang/String;" since="3" />
+ <method name="getType()I" />
+ <method name="getTypeName()Ljava/lang/String;" />
+ <method name="isAvailable()Z" />
+ <method name="isConnected()Z" />
+ <method name="isConnectedOrConnecting()Z" />
+ <method name="isFailover()Z" />
+ <method name="isRoaming()Z" since="3" />
+ </class>
+ <class name="android/net/NetworkInfo$DetailedState" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/net/NetworkInfo$DetailedState;" />
+ <method name="values()[Landroid/net/NetworkInfo$DetailedState;" />
+ <field name="AUTHENTICATING" />
+ <field name="BLOCKED" since="14" />
+ <field name="CAPTIVE_PORTAL_CHECK" since="17" />
+ <field name="CONNECTED" />
+ <field name="CONNECTING" />
+ <field name="DISCONNECTED" />
+ <field name="DISCONNECTING" />
+ <field name="FAILED" />
+ <field name="IDLE" />
+ <field name="OBTAINING_IPADDR" />
+ <field name="SCANNING" />
+ <field name="SUSPENDED" />
+ <field name="VERIFYING_POOR_LINK" since="16" />
+ </class>
+ <class name="android/net/NetworkInfo$State" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/net/NetworkInfo$State;" />
+ <method name="values()[Landroid/net/NetworkInfo$State;" />
+ <field name="CONNECTED" />
+ <field name="CONNECTING" />
+ <field name="DISCONNECTED" />
+ <field name="DISCONNECTING" />
+ <field name="SUSPENDED" />
+ <field name="UNKNOWN" />
+ </class>
+ <class name="android/net/NetworkRequest" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/net/NetworkRequest$Builder" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addCapability(I)Landroid/net/NetworkRequest$Builder;" />
+ <method name="addTransportType(I)Landroid/net/NetworkRequest$Builder;" />
+ <method name="build()Landroid/net/NetworkRequest;" />
+ <method name="removeCapability(I)Landroid/net/NetworkRequest$Builder;" />
+ <method name="removeTransportType(I)Landroid/net/NetworkRequest$Builder;" />
+ <method name="setNetworkSpecifier(Ljava/lang/String;)Landroid/net/NetworkRequest$Builder;" />
+ </class>
+ <class name="android/net/ParseException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <field name="response" />
+ </class>
+ <class name="android/net/Proxy" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getDefaultHost()Ljava/lang/String;" />
+ <method name="getDefaultPort()I" />
+ <method name="getHost(Landroid/content/Context;)Ljava/lang/String;" />
+ <method name="getPort(Landroid/content/Context;)I" />
+ <field name="EXTRA_PROXY_INFO" since="21" />
+ <field name="PROXY_CHANGE_ACTION" />
+ </class>
+ <class name="android/net/ProxyInfo" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="buildDirectProxy(Ljava/lang/String;I)Landroid/net/ProxyInfo;" />
+ <method name="buildDirectProxy(Ljava/lang/String;ILjava/util/List;)Landroid/net/ProxyInfo;" />
+ <method name="buildPacProxy(Landroid/net/Uri;)Landroid/net/ProxyInfo;" />
+ <method name="getExclusionList()[Ljava/lang/String;" />
+ <method name="getHost()Ljava/lang/String;" />
+ <method name="getPacFileUrl()Landroid/net/Uri;" />
+ <method name="getPort()I" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/net/PskKeyManager" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="chooseClientKeyIdentity(Ljava/lang/String;Ljava/net/Socket;)Ljava/lang/String;" />
+ <method name="chooseClientKeyIdentity(Ljava/lang/String;Ljavax/net/ssl/SSLEngine;)Ljava/lang/String;" />
+ <method name="chooseServerKeyIdentityHint(Ljava/net/Socket;)Ljava/lang/String;" />
+ <method name="chooseServerKeyIdentityHint(Ljavax/net/ssl/SSLEngine;)Ljava/lang/String;" />
+ <method name="getKey(Ljava/lang/String;Ljava/lang/String;Ljava/net/Socket;)Ljavax/crypto/SecretKey;" />
+ <method name="getKey(Ljava/lang/String;Ljava/lang/String;Ljavax/net/ssl/SSLEngine;)Ljavax/crypto/SecretKey;" />
+ <field name="MAX_IDENTITY_HINT_LENGTH_BYTES" />
+ <field name="MAX_IDENTITY_LENGTH_BYTES" />
+ <field name="MAX_KEY_LENGTH_BYTES" />
+ </class>
+ <class name="android/net/RouteInfo" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getDestination()Landroid/net/IpPrefix;" />
+ <method name="getGateway()Ljava/net/InetAddress;" />
+ <method name="getInterface()Ljava/lang/String;" />
+ <method name="isDefaultRoute()Z" />
+ <method name="matches(Ljava/net/InetAddress;)Z" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/net/SSLCertificateSocketFactory" since="1">
+ <extends name="javax/net/ssl/SSLSocketFactory" />
+ <method name="&lt;init>(I)V" />
+ <method name="getDefault(I)Ljavax/net/SocketFactory;" />
+ <method name="getDefault(ILandroid/net/SSLSessionCache;)Ljavax/net/ssl/SSLSocketFactory;" since="8" />
+ <method name="getHttpSocketFactory(ILandroid/net/SSLSessionCache;)Lorg/apache/http/conn/ssl/SSLSocketFactory;" since="8" />
+ <method name="getInsecure(ILandroid/net/SSLSessionCache;)Ljavax/net/ssl/SSLSocketFactory;" since="8" />
+ <method name="getNpnSelectedProtocol(Ljava/net/Socket;)[B" since="16" />
+ <method name="setHostname(Ljava/net/Socket;Ljava/lang/String;)V" since="17" />
+ <method name="setKeyManagers([Ljavax/net/ssl/KeyManager;)V" since="14" />
+ <method name="setNpnProtocols([[B)V" since="16" />
+ <method name="setTrustManagers([Ljavax/net/ssl/TrustManager;)V" since="14" />
+ <method name="setUseSessionTickets(Ljava/net/Socket;Z)V" since="17" />
+ </class>
+ <class name="android/net/SSLSessionCache" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Ljava/io/File;)V" />
+ </class>
+ <class name="android/net/TrafficStats" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="clearThreadStatsTag()V" since="14" />
+ <method name="getMobileRxBytes()J" />
+ <method name="getMobileRxPackets()J" />
+ <method name="getMobileTxBytes()J" />
+ <method name="getMobileTxPackets()J" />
+ <method name="getThreadStatsTag()I" since="14" />
+ <method name="getTotalRxBytes()J" />
+ <method name="getTotalRxPackets()J" />
+ <method name="getTotalTxBytes()J" />
+ <method name="getTotalTxPackets()J" />
+ <method name="getUidRxBytes(I)J" />
+ <method name="getUidRxPackets(I)J" since="12" />
+ <method name="getUidTcpRxBytes(I)J" since="12" />
+ <method name="getUidTcpRxSegments(I)J" since="12" />
+ <method name="getUidTcpTxBytes(I)J" since="12" />
+ <method name="getUidTcpTxSegments(I)J" since="12" />
+ <method name="getUidTxBytes(I)J" />
+ <method name="getUidTxPackets(I)J" since="12" />
+ <method name="getUidUdpRxBytes(I)J" since="12" />
+ <method name="getUidUdpRxPackets(I)J" since="12" />
+ <method name="getUidUdpTxBytes(I)J" since="12" />
+ <method name="getUidUdpTxPackets(I)J" since="12" />
+ <method name="incrementOperationCount(I)V" since="14" />
+ <method name="incrementOperationCount(II)V" since="14" />
+ <method name="setThreadStatsTag(I)V" since="14" />
+ <method name="tagSocket(Ljava/net/Socket;)V" since="14" />
+ <method name="untagSocket(Ljava/net/Socket;)V" since="14" />
+ <field name="UNSUPPORTED" />
+ </class>
+ <class name="android/net/Uri" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>()V" />
+ <method name="buildUpon()Landroid/net/Uri$Builder;" />
+ <method name="compareTo(Landroid/net/Uri;)I" />
+ <method name="decode(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="encode(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="encode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="fromFile(Ljava/io/File;)Landroid/net/Uri;" />
+ <method name="fromParts(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;" />
+ <method name="getAuthority()Ljava/lang/String;" />
+ <method name="getBooleanQueryParameter(Ljava/lang/String;Z)Z" since="11" />
+ <method name="getEncodedAuthority()Ljava/lang/String;" />
+ <method name="getEncodedFragment()Ljava/lang/String;" />
+ <method name="getEncodedPath()Ljava/lang/String;" />
+ <method name="getEncodedQuery()Ljava/lang/String;" />
+ <method name="getEncodedSchemeSpecificPart()Ljava/lang/String;" />
+ <method name="getEncodedUserInfo()Ljava/lang/String;" />
+ <method name="getFragment()Ljava/lang/String;" />
+ <method name="getHost()Ljava/lang/String;" />
+ <method name="getLastPathSegment()Ljava/lang/String;" />
+ <method name="getPath()Ljava/lang/String;" />
+ <method name="getPathSegments()Ljava/util/List;" />
+ <method name="getPort()I" />
+ <method name="getQuery()Ljava/lang/String;" />
+ <method name="getQueryParameter(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getQueryParameterNames()Ljava/util/Set;" since="11" />
+ <method name="getQueryParameters(Ljava/lang/String;)Ljava/util/List;" />
+ <method name="getScheme()Ljava/lang/String;" />
+ <method name="getSchemeSpecificPart()Ljava/lang/String;" />
+ <method name="getUserInfo()Ljava/lang/String;" />
+ <method name="isAbsolute()Z" />
+ <method name="isHierarchical()Z" />
+ <method name="isOpaque()Z" />
+ <method name="isRelative()Z" />
+ <method name="normalizeScheme()Landroid/net/Uri;" since="16" />
+ <method name="parse(Ljava/lang/String;)Landroid/net/Uri;" />
+ <method name="withAppendedPath(Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;" />
+ <method name="writeToParcel(Landroid/os/Parcel;Landroid/net/Uri;)V" />
+ <field name="CREATOR" />
+ <field name="EMPTY" />
+ </class>
+ <class name="android/net/Uri$Builder" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="appendEncodedPath(Ljava/lang/String;)Landroid/net/Uri$Builder;" />
+ <method name="appendPath(Ljava/lang/String;)Landroid/net/Uri$Builder;" />
+ <method name="appendQueryParameter(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri$Builder;" />
+ <method name="authority(Ljava/lang/String;)Landroid/net/Uri$Builder;" />
+ <method name="build()Landroid/net/Uri;" />
+ <method name="clearQuery()Landroid/net/Uri$Builder;" since="11" />
+ <method name="encodedAuthority(Ljava/lang/String;)Landroid/net/Uri$Builder;" />
+ <method name="encodedFragment(Ljava/lang/String;)Landroid/net/Uri$Builder;" />
+ <method name="encodedOpaquePart(Ljava/lang/String;)Landroid/net/Uri$Builder;" />
+ <method name="encodedPath(Ljava/lang/String;)Landroid/net/Uri$Builder;" />
+ <method name="encodedQuery(Ljava/lang/String;)Landroid/net/Uri$Builder;" />
+ <method name="fragment(Ljava/lang/String;)Landroid/net/Uri$Builder;" />
+ <method name="opaquePart(Ljava/lang/String;)Landroid/net/Uri$Builder;" />
+ <method name="path(Ljava/lang/String;)Landroid/net/Uri$Builder;" />
+ <method name="query(Ljava/lang/String;)Landroid/net/Uri$Builder;" />
+ <method name="scheme(Ljava/lang/String;)Landroid/net/Uri$Builder;" />
+ </class>
+ <class name="android/net/UrlQuerySanitizer" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="addSanitizedEntry(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="clear()V" />
+ <method name="decodeHexDigit(C)I" />
+ <method name="getAllButNulAndAngleBracketsLegal()Landroid/net/UrlQuerySanitizer$ValueSanitizer;" />
+ <method name="getAllButNulLegal()Landroid/net/UrlQuerySanitizer$ValueSanitizer;" />
+ <method name="getAllButWhitespaceLegal()Landroid/net/UrlQuerySanitizer$ValueSanitizer;" />
+ <method name="getAllIllegal()Landroid/net/UrlQuerySanitizer$ValueSanitizer;" />
+ <method name="getAllowUnregisteredParamaters()Z" />
+ <method name="getAmpAndSpaceLegal()Landroid/net/UrlQuerySanitizer$ValueSanitizer;" />
+ <method name="getAmpLegal()Landroid/net/UrlQuerySanitizer$ValueSanitizer;" />
+ <method name="getEffectiveValueSanitizer(Ljava/lang/String;)Landroid/net/UrlQuerySanitizer$ValueSanitizer;" />
+ <method name="getParameterList()Ljava/util/List;" />
+ <method name="getParameterSet()Ljava/util/Set;" />
+ <method name="getPreferFirstRepeatedParameter()Z" />
+ <method name="getSpaceLegal()Landroid/net/UrlQuerySanitizer$ValueSanitizer;" />
+ <method name="getUnregisteredParameterValueSanitizer()Landroid/net/UrlQuerySanitizer$ValueSanitizer;" />
+ <method name="getUrlAndSpaceLegal()Landroid/net/UrlQuerySanitizer$ValueSanitizer;" />
+ <method name="getUrlLegal()Landroid/net/UrlQuerySanitizer$ValueSanitizer;" />
+ <method name="getValue(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getValueSanitizer(Ljava/lang/String;)Landroid/net/UrlQuerySanitizer$ValueSanitizer;" />
+ <method name="hasParameter(Ljava/lang/String;)Z" />
+ <method name="isHexDigit(C)Z" />
+ <method name="parseEntry(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="parseQuery(Ljava/lang/String;)V" />
+ <method name="parseUrl(Ljava/lang/String;)V" />
+ <method name="registerParameter(Ljava/lang/String;Landroid/net/UrlQuerySanitizer$ValueSanitizer;)V" />
+ <method name="registerParameters([Ljava/lang/String;Landroid/net/UrlQuerySanitizer$ValueSanitizer;)V" />
+ <method name="setAllowUnregisteredParamaters(Z)V" />
+ <method name="setPreferFirstRepeatedParameter(Z)V" />
+ <method name="setUnregisteredParameterValueSanitizer(Landroid/net/UrlQuerySanitizer$ValueSanitizer;)V" />
+ <method name="unescape(Ljava/lang/String;)Ljava/lang/String;" />
+ </class>
+ <class name="android/net/UrlQuerySanitizer$IllegalCharacterValueSanitizer" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/net/UrlQuerySanitizer$ValueSanitizer" />
+ <method name="&lt;init>(I)V" />
+ <field name="ALL_BUT_NUL_AND_ANGLE_BRACKETS_LEGAL" />
+ <field name="ALL_BUT_NUL_LEGAL" />
+ <field name="ALL_BUT_WHITESPACE_LEGAL" />
+ <field name="ALL_ILLEGAL" />
+ <field name="ALL_OK" />
+ <field name="ALL_WHITESPACE_OK" />
+ <field name="AMP_AND_SPACE_LEGAL" />
+ <field name="AMP_LEGAL" />
+ <field name="AMP_OK" />
+ <field name="DQUOTE_OK" />
+ <field name="GT_OK" />
+ <field name="LT_OK" />
+ <field name="NON_7_BIT_ASCII_OK" />
+ <field name="NUL_OK" />
+ <field name="OTHER_WHITESPACE_OK" />
+ <field name="PCT_OK" />
+ <field name="SCRIPT_URL_OK" />
+ <field name="SPACE_LEGAL" />
+ <field name="SPACE_OK" />
+ <field name="SQUOTE_OK" />
+ <field name="URL_AND_SPACE_LEGAL" />
+ <field name="URL_LEGAL" />
+ </class>
+ <class name="android/net/UrlQuerySanitizer$ParameterValuePair" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/net/UrlQuerySanitizer;Ljava/lang/String;Ljava/lang/String;)V" />
+ <field name="mParameter" />
+ <field name="mValue" />
+ </class>
+ <class name="android/net/UrlQuerySanitizer$ValueSanitizer" since="1">
+ <extends name="java/lang/Object" />
+ <method name="sanitize(Ljava/lang/String;)Ljava/lang/String;" />
+ </class>
+ <class name="android/net/VpnService" since="14">
+ <extends name="android/app/Service" />
+ <method name="&lt;init>()V" />
+ <method name="onRevoke()V" />
+ <method name="prepare(Landroid/content/Context;)Landroid/content/Intent;" />
+ <method name="protect(I)Z" />
+ <method name="protect(Ljava/net/DatagramSocket;)Z" />
+ <method name="protect(Ljava/net/Socket;)Z" />
+ <field name="SERVICE_INTERFACE" />
+ </class>
+ <class name="android/net/VpnService$Builder" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/net/VpnService;)V" />
+ <method name="addAddress(Ljava/lang/String;I)Landroid/net/VpnService$Builder;" />
+ <method name="addAddress(Ljava/net/InetAddress;I)Landroid/net/VpnService$Builder;" />
+ <method name="addAllowedApplication(Ljava/lang/String;)Landroid/net/VpnService$Builder;" since="21" />
+ <method name="addDisallowedApplication(Ljava/lang/String;)Landroid/net/VpnService$Builder;" since="21" />
+ <method name="addDnsServer(Ljava/lang/String;)Landroid/net/VpnService$Builder;" />
+ <method name="addDnsServer(Ljava/net/InetAddress;)Landroid/net/VpnService$Builder;" />
+ <method name="addRoute(Ljava/lang/String;I)Landroid/net/VpnService$Builder;" />
+ <method name="addRoute(Ljava/net/InetAddress;I)Landroid/net/VpnService$Builder;" />
+ <method name="addSearchDomain(Ljava/lang/String;)Landroid/net/VpnService$Builder;" />
+ <method name="allowBypass()Landroid/net/VpnService$Builder;" since="21" />
+ <method name="allowFamily(I)Landroid/net/VpnService$Builder;" since="21" />
+ <method name="establish()Landroid/os/ParcelFileDescriptor;" />
+ <method name="setBlocking(Z)Landroid/net/VpnService$Builder;" since="21" />
+ <method name="setConfigureIntent(Landroid/app/PendingIntent;)Landroid/net/VpnService$Builder;" />
+ <method name="setMtu(I)Landroid/net/VpnService$Builder;" />
+ <method name="setSession(Ljava/lang/String;)Landroid/net/VpnService$Builder;" />
+ </class>
+ <class name="android/net/http/AndroidHttpClient" since="8">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/client/HttpClient" />
+ <method name="&lt;init>()V" />
+ <method name="close()V" />
+ <method name="disableCurlLogging()V" />
+ <method name="enableCurlLogging(Ljava/lang/String;I)V" />
+ <method name="getCompressedEntity([BLandroid/content/ContentResolver;)Lorg/apache/http/entity/AbstractHttpEntity;" />
+ <method name="getMinGzipSize(Landroid/content/ContentResolver;)J" />
+ <method name="getUngzippedContent(Lorg/apache/http/HttpEntity;)Ljava/io/InputStream;" />
+ <method name="modifyRequestToAcceptGzipResponse(Lorg/apache/http/HttpRequest;)V" />
+ <method name="newInstance(Ljava/lang/String;)Landroid/net/http/AndroidHttpClient;" />
+ <method name="newInstance(Ljava/lang/String;Landroid/content/Context;)Landroid/net/http/AndroidHttpClient;" />
+ <method name="parseDate(Ljava/lang/String;)J" />
+ <field name="DEFAULT_SYNC_MIN_GZIP_BYTES" />
+ </class>
+ <class name="android/net/http/HttpResponseCache" since="14">
+ <extends name="java/net/ResponseCache" />
+ <implements name="java/io/Closeable" />
+ <method name="&lt;init>()V" />
+ <method name="delete()V" />
+ <method name="flush()V" />
+ <method name="getHitCount()I" />
+ <method name="getInstalled()Landroid/net/http/HttpResponseCache;" />
+ <method name="getNetworkCount()I" />
+ <method name="getRequestCount()I" />
+ <method name="install(Ljava/io/File;J)Landroid/net/http/HttpResponseCache;" />
+ <method name="maxSize()J" />
+ <method name="size()J" />
+ </class>
+ <class name="android/net/http/SslCertificate" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/util/Date;Ljava/util/Date;)V" since="8" />
+ <method name="&lt;init>(Ljava/security/cert/X509Certificate;)V" />
+ <method name="getIssuedBy()Landroid/net/http/SslCertificate$DName;" />
+ <method name="getIssuedTo()Landroid/net/http/SslCertificate$DName;" />
+ <method name="getValidNotAfter()Ljava/lang/String;" />
+ <method name="getValidNotAfterDate()Ljava/util/Date;" since="8" />
+ <method name="getValidNotBefore()Ljava/lang/String;" />
+ <method name="getValidNotBeforeDate()Ljava/util/Date;" since="8" />
+ <method name="restoreState(Landroid/os/Bundle;)Landroid/net/http/SslCertificate;" />
+ <method name="saveState(Landroid/net/http/SslCertificate;)Landroid/os/Bundle;" />
+ </class>
+ <class name="android/net/http/SslCertificate$DName" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/net/http/SslCertificate;Ljava/lang/String;)V" />
+ <method name="getCName()Ljava/lang/String;" />
+ <method name="getDName()Ljava/lang/String;" />
+ <method name="getOName()Ljava/lang/String;" />
+ <method name="getUName()Ljava/lang/String;" />
+ </class>
+ <class name="android/net/http/SslError" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(ILandroid/net/http/SslCertificate;)V" />
+ <method name="&lt;init>(ILandroid/net/http/SslCertificate;Ljava/lang/String;)V" since="14" />
+ <method name="&lt;init>(ILjava/security/cert/X509Certificate;)V" />
+ <method name="&lt;init>(ILjava/security/cert/X509Certificate;Ljava/lang/String;)V" since="14" />
+ <method name="addError(I)Z" />
+ <method name="getCertificate()Landroid/net/http/SslCertificate;" />
+ <method name="getPrimaryError()I" />
+ <method name="getUrl()Ljava/lang/String;" since="14" />
+ <method name="hasError(I)Z" />
+ <field name="SSL_DATE_INVALID" since="14" />
+ <field name="SSL_EXPIRED" />
+ <field name="SSL_IDMISMATCH" />
+ <field name="SSL_INVALID" since="14" />
+ <field name="SSL_MAX_ERROR" />
+ <field name="SSL_NOTYETVALID" />
+ <field name="SSL_UNTRUSTED" />
+ </class>
+ <class name="android/net/http/X509TrustManagerExtensions" since="17">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljavax/net/ssl/X509TrustManager;)V" />
+ <method name="checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;" />
+ <method name="isUserAddedCertificate(Ljava/security/cert/X509Certificate;)Z" since="21" />
+ </class>
+ <class name="android/net/nsd/NsdManager" since="16">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="discoverServices(Ljava/lang/String;ILandroid/net/nsd/NsdManager$DiscoveryListener;)V" />
+ <method name="registerService(Landroid/net/nsd/NsdServiceInfo;ILandroid/net/nsd/NsdManager$RegistrationListener;)V" />
+ <method name="resolveService(Landroid/net/nsd/NsdServiceInfo;Landroid/net/nsd/NsdManager$ResolveListener;)V" />
+ <method name="stopServiceDiscovery(Landroid/net/nsd/NsdManager$DiscoveryListener;)V" />
+ <method name="unregisterService(Landroid/net/nsd/NsdManager$RegistrationListener;)V" />
+ <field name="ACTION_NSD_STATE_CHANGED" />
+ <field name="EXTRA_NSD_STATE" />
+ <field name="FAILURE_ALREADY_ACTIVE" />
+ <field name="FAILURE_INTERNAL_ERROR" />
+ <field name="FAILURE_MAX_LIMIT" />
+ <field name="NSD_STATE_DISABLED" />
+ <field name="NSD_STATE_ENABLED" />
+ <field name="PROTOCOL_DNS_SD" />
+ </class>
+ <class name="android/net/nsd/NsdManager$DiscoveryListener" since="16">
+ <extends name="java/lang/Object" />
+ <method name="onDiscoveryStarted(Ljava/lang/String;)V" />
+ <method name="onDiscoveryStopped(Ljava/lang/String;)V" />
+ <method name="onServiceFound(Landroid/net/nsd/NsdServiceInfo;)V" />
+ <method name="onServiceLost(Landroid/net/nsd/NsdServiceInfo;)V" />
+ <method name="onStartDiscoveryFailed(Ljava/lang/String;I)V" />
+ <method name="onStopDiscoveryFailed(Ljava/lang/String;I)V" />
+ </class>
+ <class name="android/net/nsd/NsdManager$RegistrationListener" since="16">
+ <extends name="java/lang/Object" />
+ <method name="onRegistrationFailed(Landroid/net/nsd/NsdServiceInfo;I)V" />
+ <method name="onServiceRegistered(Landroid/net/nsd/NsdServiceInfo;)V" />
+ <method name="onServiceUnregistered(Landroid/net/nsd/NsdServiceInfo;)V" />
+ <method name="onUnregistrationFailed(Landroid/net/nsd/NsdServiceInfo;I)V" />
+ </class>
+ <class name="android/net/nsd/NsdManager$ResolveListener" since="16">
+ <extends name="java/lang/Object" />
+ <method name="onResolveFailed(Landroid/net/nsd/NsdServiceInfo;I)V" />
+ <method name="onServiceResolved(Landroid/net/nsd/NsdServiceInfo;)V" />
+ </class>
+ <class name="android/net/nsd/NsdServiceInfo" since="16">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getAttributes()Ljava/util/Map;" since="21" />
+ <method name="getHost()Ljava/net/InetAddress;" />
+ <method name="getPort()I" />
+ <method name="getServiceName()Ljava/lang/String;" />
+ <method name="getServiceType()Ljava/lang/String;" />
+ <method name="removeAttribute(Ljava/lang/String;)V" since="21" />
+ <method name="setAttribute(Ljava/lang/String;Ljava/lang/String;)V" since="21" />
+ <method name="setHost(Ljava/net/InetAddress;)V" />
+ <method name="setPort(I)V" />
+ <method name="setServiceName(Ljava/lang/String;)V" />
+ <method name="setServiceType(Ljava/lang/String;)V" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/net/rtp/AudioCodec" since="12">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getCodec(ILjava/lang/String;Ljava/lang/String;)Landroid/net/rtp/AudioCodec;" />
+ <method name="getCodecs()[Landroid/net/rtp/AudioCodec;" />
+ <field name="AMR" />
+ <field name="GSM" />
+ <field name="GSM_EFR" />
+ <field name="PCMA" />
+ <field name="PCMU" />
+ <field name="fmtp" />
+ <field name="rtpmap" />
+ <field name="type" />
+ </class>
+ <class name="android/net/rtp/AudioGroup" since="12">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="clear()V" />
+ <method name="getMode()I" />
+ <method name="getStreams()[Landroid/net/rtp/AudioStream;" />
+ <method name="sendDtmf(I)V" />
+ <method name="setMode(I)V" />
+ <field name="MODE_ECHO_SUPPRESSION" />
+ <field name="MODE_MUTED" />
+ <field name="MODE_NORMAL" />
+ <field name="MODE_ON_HOLD" />
+ </class>
+ <class name="android/net/rtp/AudioStream" since="12">
+ <extends name="android/net/rtp/RtpStream" />
+ <method name="&lt;init>(Ljava/net/InetAddress;)V" />
+ <method name="getCodec()Landroid/net/rtp/AudioCodec;" />
+ <method name="getDtmfType()I" />
+ <method name="getGroup()Landroid/net/rtp/AudioGroup;" />
+ <method name="join(Landroid/net/rtp/AudioGroup;)V" />
+ <method name="setCodec(Landroid/net/rtp/AudioCodec;)V" />
+ <method name="setDtmfType(I)V" />
+ </class>
+ <class name="android/net/rtp/RtpStream" since="12">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="associate(Ljava/net/InetAddress;I)V" />
+ <method name="getLocalAddress()Ljava/net/InetAddress;" />
+ <method name="getLocalPort()I" />
+ <method name="getMode()I" />
+ <method name="getRemoteAddress()Ljava/net/InetAddress;" />
+ <method name="getRemotePort()I" />
+ <method name="isBusy()Z" />
+ <method name="release()V" />
+ <method name="setMode(I)V" />
+ <field name="MODE_NORMAL" />
+ <field name="MODE_RECEIVE_ONLY" />
+ <field name="MODE_SEND_ONLY" />
+ </class>
+ <class name="android/net/sip/SipAudioCall" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/net/sip/SipProfile;)V" />
+ <method name="answerCall(I)V" />
+ <method name="attachCall(Landroid/net/sip/SipSession;Ljava/lang/String;)V" />
+ <method name="close()V" />
+ <method name="continueCall(I)V" />
+ <method name="endCall()V" />
+ <method name="getLocalProfile()Landroid/net/sip/SipProfile;" />
+ <method name="getPeerProfile()Landroid/net/sip/SipProfile;" />
+ <method name="getState()I" />
+ <method name="holdCall(I)V" />
+ <method name="isInCall()Z" />
+ <method name="isMuted()Z" />
+ <method name="isOnHold()Z" />
+ <method name="makeCall(Landroid/net/sip/SipProfile;Landroid/net/sip/SipSession;I)V" />
+ <method name="sendDtmf(I)V" />
+ <method name="sendDtmf(ILandroid/os/Message;)V" />
+ <method name="setListener(Landroid/net/sip/SipAudioCall$Listener;)V" />
+ <method name="setListener(Landroid/net/sip/SipAudioCall$Listener;Z)V" />
+ <method name="setSpeakerMode(Z)V" />
+ <method name="startAudio()V" />
+ <method name="toggleMute()V" />
+ </class>
+ <class name="android/net/sip/SipAudioCall$Listener" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onCallBusy(Landroid/net/sip/SipAudioCall;)V" />
+ <method name="onCallEnded(Landroid/net/sip/SipAudioCall;)V" />
+ <method name="onCallEstablished(Landroid/net/sip/SipAudioCall;)V" />
+ <method name="onCallHeld(Landroid/net/sip/SipAudioCall;)V" />
+ <method name="onCalling(Landroid/net/sip/SipAudioCall;)V" />
+ <method name="onChanged(Landroid/net/sip/SipAudioCall;)V" />
+ <method name="onError(Landroid/net/sip/SipAudioCall;ILjava/lang/String;)V" />
+ <method name="onReadyToCall(Landroid/net/sip/SipAudioCall;)V" />
+ <method name="onRinging(Landroid/net/sip/SipAudioCall;Landroid/net/sip/SipProfile;)V" />
+ <method name="onRingingBack(Landroid/net/sip/SipAudioCall;)V" />
+ </class>
+ <class name="android/net/sip/SipErrorCode" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="toString(I)Ljava/lang/String;" />
+ <field name="CLIENT_ERROR" />
+ <field name="CROSS_DOMAIN_AUTHENTICATION" />
+ <field name="DATA_CONNECTION_LOST" />
+ <field name="INVALID_CREDENTIALS" />
+ <field name="INVALID_REMOTE_URI" />
+ <field name="IN_PROGRESS" />
+ <field name="NO_ERROR" />
+ <field name="PEER_NOT_REACHABLE" />
+ <field name="SERVER_ERROR" />
+ <field name="SERVER_UNREACHABLE" />
+ <field name="SOCKET_ERROR" />
+ <field name="TIME_OUT" />
+ <field name="TRANSACTION_TERMINTED" />
+ </class>
+ <class name="android/net/sip/SipException" since="9">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="android/net/sip/SipManager" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="close(Ljava/lang/String;)V" />
+ <method name="createSipSession(Landroid/net/sip/SipProfile;Landroid/net/sip/SipSession$Listener;)Landroid/net/sip/SipSession;" />
+ <method name="getCallId(Landroid/content/Intent;)Ljava/lang/String;" />
+ <method name="getOfferSessionDescription(Landroid/content/Intent;)Ljava/lang/String;" />
+ <method name="getSessionFor(Landroid/content/Intent;)Landroid/net/sip/SipSession;" />
+ <method name="isApiSupported(Landroid/content/Context;)Z" />
+ <method name="isIncomingCallIntent(Landroid/content/Intent;)Z" />
+ <method name="isOpened(Ljava/lang/String;)Z" />
+ <method name="isRegistered(Ljava/lang/String;)Z" />
+ <method name="isSipWifiOnly(Landroid/content/Context;)Z" />
+ <method name="isVoipSupported(Landroid/content/Context;)Z" />
+ <method name="makeAudioCall(Landroid/net/sip/SipProfile;Landroid/net/sip/SipProfile;Landroid/net/sip/SipAudioCall$Listener;I)Landroid/net/sip/SipAudioCall;" />
+ <method name="makeAudioCall(Ljava/lang/String;Ljava/lang/String;Landroid/net/sip/SipAudioCall$Listener;I)Landroid/net/sip/SipAudioCall;" />
+ <method name="newInstance(Landroid/content/Context;)Landroid/net/sip/SipManager;" />
+ <method name="open(Landroid/net/sip/SipProfile;)V" />
+ <method name="open(Landroid/net/sip/SipProfile;Landroid/app/PendingIntent;Landroid/net/sip/SipRegistrationListener;)V" />
+ <method name="register(Landroid/net/sip/SipProfile;ILandroid/net/sip/SipRegistrationListener;)V" />
+ <method name="setRegistrationListener(Ljava/lang/String;Landroid/net/sip/SipRegistrationListener;)V" />
+ <method name="takeAudioCall(Landroid/content/Intent;Landroid/net/sip/SipAudioCall$Listener;)Landroid/net/sip/SipAudioCall;" />
+ <method name="unregister(Landroid/net/sip/SipProfile;Landroid/net/sip/SipRegistrationListener;)V" />
+ <field name="EXTRA_CALL_ID" />
+ <field name="EXTRA_OFFER_SD" />
+ <field name="INCOMING_CALL_RESULT_CODE" />
+ </class>
+ <class name="android/net/sip/SipProfile" since="9">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>()V" />
+ <method name="getAuthUserName()Ljava/lang/String;" since="12" />
+ <method name="getAutoRegistration()Z" />
+ <method name="getDisplayName()Ljava/lang/String;" />
+ <method name="getPassword()Ljava/lang/String;" />
+ <method name="getPort()I" />
+ <method name="getProfileName()Ljava/lang/String;" />
+ <method name="getProtocol()Ljava/lang/String;" />
+ <method name="getProxyAddress()Ljava/lang/String;" />
+ <method name="getSendKeepAlive()Z" />
+ <method name="getSipDomain()Ljava/lang/String;" />
+ <method name="getUriString()Ljava/lang/String;" />
+ <method name="getUserName()Ljava/lang/String;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/net/sip/SipProfile$Builder" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/net/sip/SipProfile;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="build()Landroid/net/sip/SipProfile;" />
+ <method name="setAuthUserName(Ljava/lang/String;)Landroid/net/sip/SipProfile$Builder;" since="12" />
+ <method name="setAutoRegistration(Z)Landroid/net/sip/SipProfile$Builder;" />
+ <method name="setDisplayName(Ljava/lang/String;)Landroid/net/sip/SipProfile$Builder;" />
+ <method name="setOutboundProxy(Ljava/lang/String;)Landroid/net/sip/SipProfile$Builder;" />
+ <method name="setPassword(Ljava/lang/String;)Landroid/net/sip/SipProfile$Builder;" />
+ <method name="setPort(I)Landroid/net/sip/SipProfile$Builder;" />
+ <method name="setProfileName(Ljava/lang/String;)Landroid/net/sip/SipProfile$Builder;" />
+ <method name="setProtocol(Ljava/lang/String;)Landroid/net/sip/SipProfile$Builder;" />
+ <method name="setSendKeepAlive(Z)Landroid/net/sip/SipProfile$Builder;" />
+ </class>
+ <class name="android/net/sip/SipRegistrationListener" since="9">
+ <extends name="java/lang/Object" />
+ <method name="onRegistering(Ljava/lang/String;)V" />
+ <method name="onRegistrationDone(Ljava/lang/String;J)V" />
+ <method name="onRegistrationFailed(Ljava/lang/String;ILjava/lang/String;)V" />
+ </class>
+ <class name="android/net/sip/SipSession" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="answerCall(Ljava/lang/String;I)V" />
+ <method name="changeCall(Ljava/lang/String;I)V" />
+ <method name="endCall()V" />
+ <method name="getCallId()Ljava/lang/String;" />
+ <method name="getLocalIp()Ljava/lang/String;" />
+ <method name="getLocalProfile()Landroid/net/sip/SipProfile;" />
+ <method name="getPeerProfile()Landroid/net/sip/SipProfile;" />
+ <method name="getState()I" />
+ <method name="isInCall()Z" />
+ <method name="makeCall(Landroid/net/sip/SipProfile;Ljava/lang/String;I)V" />
+ <method name="register(I)V" />
+ <method name="setListener(Landroid/net/sip/SipSession$Listener;)V" />
+ <method name="unregister()V" />
+ </class>
+ <class name="android/net/sip/SipSession$Listener" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onCallBusy(Landroid/net/sip/SipSession;)V" />
+ <method name="onCallChangeFailed(Landroid/net/sip/SipSession;ILjava/lang/String;)V" />
+ <method name="onCallEnded(Landroid/net/sip/SipSession;)V" />
+ <method name="onCallEstablished(Landroid/net/sip/SipSession;Ljava/lang/String;)V" />
+ <method name="onCalling(Landroid/net/sip/SipSession;)V" />
+ <method name="onError(Landroid/net/sip/SipSession;ILjava/lang/String;)V" />
+ <method name="onRegistering(Landroid/net/sip/SipSession;)V" />
+ <method name="onRegistrationDone(Landroid/net/sip/SipSession;I)V" />
+ <method name="onRegistrationFailed(Landroid/net/sip/SipSession;ILjava/lang/String;)V" />
+ <method name="onRegistrationTimeout(Landroid/net/sip/SipSession;)V" />
+ <method name="onRinging(Landroid/net/sip/SipSession;Landroid/net/sip/SipProfile;Ljava/lang/String;)V" />
+ <method name="onRingingBack(Landroid/net/sip/SipSession;)V" />
+ </class>
+ <class name="android/net/sip/SipSession$State" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="toString(I)Ljava/lang/String;" />
+ <field name="DEREGISTERING" />
+ <field name="INCOMING_CALL" />
+ <field name="INCOMING_CALL_ANSWERING" />
+ <field name="IN_CALL" />
+ <field name="NOT_DEFINED" />
+ <field name="OUTGOING_CALL" />
+ <field name="OUTGOING_CALL_CANCELING" />
+ <field name="OUTGOING_CALL_RING_BACK" />
+ <field name="PINGING" />
+ <field name="READY_TO_CALL" />
+ <field name="REGISTERING" />
+ </class>
+ <class name="android/net/wifi/ScanResult" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <field name="BSSID" />
+ <field name="SSID" />
+ <field name="capabilities" />
+ <field name="frequency" />
+ <field name="level" />
+ <field name="timestamp" since="17" />
+ </class>
+ <class name="android/net/wifi/SupplicantState" since="1">
+ <extends name="java/lang/Enum" />
+ <implements name="android/os/Parcelable" />
+ <method name="isValidState(Landroid/net/wifi/SupplicantState;)Z" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/net/wifi/SupplicantState;" />
+ <method name="values()[Landroid/net/wifi/SupplicantState;" />
+ <field name="ASSOCIATED" />
+ <field name="ASSOCIATING" />
+ <field name="AUTHENTICATING" since="14" />
+ <field name="COMPLETED" />
+ <field name="DISCONNECTED" />
+ <field name="DORMANT" />
+ <field name="FOUR_WAY_HANDSHAKE" />
+ <field name="GROUP_HANDSHAKE" />
+ <field name="INACTIVE" />
+ <field name="INTERFACE_DISABLED" since="14" />
+ <field name="INVALID" />
+ <field name="SCANNING" />
+ <field name="UNINITIALIZED" />
+ </class>
+ <class name="android/net/wifi/WifiConfiguration" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <field name="BSSID" />
+ <field name="FQDN" since="21" />
+ <field name="SSID" />
+ <field name="allowedAuthAlgorithms" />
+ <field name="allowedGroupCiphers" />
+ <field name="allowedKeyManagement" />
+ <field name="allowedPairwiseCiphers" />
+ <field name="allowedProtocols" />
+ <field name="enterpriseConfig" since="18" />
+ <field name="hiddenSSID" />
+ <field name="networkId" />
+ <field name="preSharedKey" />
+ <field name="priority" />
+ <field name="status" />
+ <field name="wepKeys" />
+ <field name="wepTxKeyIndex" />
+ </class>
+ <class name="android/net/wifi/WifiConfiguration$AuthAlgorithm" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="LEAP" />
+ <field name="OPEN" />
+ <field name="SHARED" />
+ <field name="strings" />
+ <field name="varName" />
+ </class>
+ <class name="android/net/wifi/WifiConfiguration$GroupCipher" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="CCMP" />
+ <field name="TKIP" />
+ <field name="WEP104" />
+ <field name="WEP40" />
+ <field name="strings" />
+ <field name="varName" />
+ </class>
+ <class name="android/net/wifi/WifiConfiguration$KeyMgmt" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="IEEE8021X" />
+ <field name="NONE" />
+ <field name="WPA_EAP" />
+ <field name="WPA_PSK" />
+ <field name="strings" />
+ <field name="varName" />
+ </class>
+ <class name="android/net/wifi/WifiConfiguration$PairwiseCipher" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="CCMP" />
+ <field name="NONE" />
+ <field name="TKIP" />
+ <field name="strings" />
+ <field name="varName" />
+ </class>
+ <class name="android/net/wifi/WifiConfiguration$Protocol" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="RSN" />
+ <field name="WPA" />
+ <field name="strings" />
+ <field name="varName" />
+ </class>
+ <class name="android/net/wifi/WifiConfiguration$Status" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="CURRENT" />
+ <field name="DISABLED" />
+ <field name="ENABLED" />
+ <field name="strings" />
+ </class>
+ <class name="android/net/wifi/WifiEnterpriseConfig" since="18">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/net/wifi/WifiEnterpriseConfig;)V" />
+ <method name="getAnonymousIdentity()Ljava/lang/String;" />
+ <method name="getCaCertificate()Ljava/security/cert/X509Certificate;" />
+ <method name="getClientCertificate()Ljava/security/cert/X509Certificate;" />
+ <method name="getEapMethod()I" />
+ <method name="getIdentity()Ljava/lang/String;" />
+ <method name="getPassword()Ljava/lang/String;" />
+ <method name="getPhase2Method()I" />
+ <method name="getSubjectMatch()Ljava/lang/String;" />
+ <method name="setAnonymousIdentity(Ljava/lang/String;)V" />
+ <method name="setCaCertificate(Ljava/security/cert/X509Certificate;)V" />
+ <method name="setClientKeyEntry(Ljava/security/PrivateKey;Ljava/security/cert/X509Certificate;)V" />
+ <method name="setEapMethod(I)V" />
+ <method name="setIdentity(Ljava/lang/String;)V" />
+ <method name="setPassword(Ljava/lang/String;)V" />
+ <method name="setPhase2Method(I)V" />
+ <method name="setSubjectMatch(Ljava/lang/String;)V" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/net/wifi/WifiEnterpriseConfig$Eap" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="AKA" since="21" />
+ <field name="NONE" />
+ <field name="PEAP" />
+ <field name="PWD" />
+ <field name="SIM" since="21" />
+ <field name="TLS" />
+ <field name="TTLS" />
+ </class>
+ <class name="android/net/wifi/WifiEnterpriseConfig$Phase2" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="GTC" />
+ <field name="MSCHAP" />
+ <field name="MSCHAPV2" />
+ <field name="NONE" />
+ <field name="PAP" />
+ </class>
+ <class name="android/net/wifi/WifiInfo" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getBSSID()Ljava/lang/String;" />
+ <method name="getDetailedStateOf(Landroid/net/wifi/SupplicantState;)Landroid/net/NetworkInfo$DetailedState;" />
+ <method name="getFrequency()I" since="21" />
+ <method name="getHiddenSSID()Z" />
+ <method name="getIpAddress()I" />
+ <method name="getLinkSpeed()I" />
+ <method name="getMacAddress()Ljava/lang/String;" />
+ <method name="getNetworkId()I" />
+ <method name="getRssi()I" />
+ <method name="getSSID()Ljava/lang/String;" />
+ <method name="getSupplicantState()Landroid/net/wifi/SupplicantState;" />
+ <field name="FREQUENCY_UNITS" since="21" />
+ <field name="LINK_SPEED_UNITS" />
+ </class>
+ <class name="android/net/wifi/WifiManager" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addNetwork(Landroid/net/wifi/WifiConfiguration;)I" />
+ <method name="calculateSignalLevel(II)I" />
+ <method name="cancelWps(Landroid/net/wifi/WifiManager$WpsCallback;)V" since="21" />
+ <method name="compareSignalLevel(II)I" />
+ <method name="createMulticastLock(Ljava/lang/String;)Landroid/net/wifi/WifiManager$MulticastLock;" since="4" />
+ <method name="createWifiLock(ILjava/lang/String;)Landroid/net/wifi/WifiManager$WifiLock;" since="3" />
+ <method name="createWifiLock(Ljava/lang/String;)Landroid/net/wifi/WifiManager$WifiLock;" />
+ <method name="disableNetwork(I)Z" />
+ <method name="disconnect()Z" />
+ <method name="enableNetwork(IZ)Z" />
+ <method name="getConfiguredNetworks()Ljava/util/List;" />
+ <method name="getConnectionInfo()Landroid/net/wifi/WifiInfo;" />
+ <method name="getDhcpInfo()Landroid/net/DhcpInfo;" />
+ <method name="getScanResults()Ljava/util/List;" />
+ <method name="getWifiState()I" />
+ <method name="is5GHzBandSupported()Z" since="21" />
+ <method name="isDeviceToApRttSupported()Z" since="21" />
+ <method name="isEnhancedPowerReportingSupported()Z" since="21" />
+ <method name="isP2pSupported()Z" since="21" />
+ <method name="isPreferredNetworkOffloadSupported()Z" since="21" />
+ <method name="isScanAlwaysAvailable()Z" since="18" />
+ <method name="isTdlsSupported()Z" since="21" />
+ <method name="isWifiEnabled()Z" />
+ <method name="pingSupplicant()Z" />
+ <method name="reassociate()Z" />
+ <method name="reconnect()Z" />
+ <method name="removeNetwork(I)Z" />
+ <method name="saveConfiguration()Z" />
+ <method name="setTdlsEnabled(Ljava/net/InetAddress;Z)V" since="19" />
+ <method name="setTdlsEnabledWithMacAddress(Ljava/lang/String;Z)V" since="19" />
+ <method name="setWifiEnabled(Z)Z" />
+ <method name="startScan()Z" />
+ <method name="startWps(Landroid/net/wifi/WpsInfo;Landroid/net/wifi/WifiManager$WpsCallback;)V" since="21" />
+ <method name="updateNetwork(Landroid/net/wifi/WifiConfiguration;)I" />
+ <field name="ACTION_PICK_WIFI_NETWORK" />
+ <field name="ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE" since="18" />
+ <field name="ERROR_AUTHENTICATING" />
+ <field name="EXTRA_BSSID" />
+ <field name="EXTRA_NETWORK_INFO" />
+ <field name="EXTRA_NEW_RSSI" />
+ <field name="EXTRA_NEW_STATE" />
+ <field name="EXTRA_PREVIOUS_WIFI_STATE" />
+ <field name="EXTRA_SUPPLICANT_CONNECTED" />
+ <field name="EXTRA_SUPPLICANT_ERROR" />
+ <field name="EXTRA_WIFI_INFO" since="14" />
+ <field name="EXTRA_WIFI_STATE" />
+ <field name="NETWORK_IDS_CHANGED_ACTION" />
+ <field name="NETWORK_STATE_CHANGED_ACTION" />
+ <field name="RSSI_CHANGED_ACTION" />
+ <field name="SCAN_RESULTS_AVAILABLE_ACTION" />
+ <field name="SUPPLICANT_CONNECTION_CHANGE_ACTION" />
+ <field name="SUPPLICANT_STATE_CHANGED_ACTION" />
+ <field name="WIFI_MODE_FULL" since="3" />
+ <field name="WIFI_MODE_FULL_HIGH_PERF" since="12" />
+ <field name="WIFI_MODE_SCAN_ONLY" since="3" />
+ <field name="WIFI_STATE_CHANGED_ACTION" />
+ <field name="WIFI_STATE_DISABLED" />
+ <field name="WIFI_STATE_DISABLING" />
+ <field name="WIFI_STATE_ENABLED" />
+ <field name="WIFI_STATE_ENABLING" />
+ <field name="WIFI_STATE_UNKNOWN" />
+ <field name="WPS_AUTH_FAILURE" since="21" />
+ <field name="WPS_OVERLAP_ERROR" since="21" />
+ <field name="WPS_TIMED_OUT" since="21" />
+ <field name="WPS_TKIP_ONLY_PROHIBITED" since="21" />
+ <field name="WPS_WEP_PROHIBITED" since="21" />
+ </class>
+ <class name="android/net/wifi/WifiManager$MulticastLock" since="4">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/net/wifi/WifiManager;)V" />
+ <method name="acquire()V" />
+ <method name="isHeld()Z" />
+ <method name="release()V" />
+ <method name="setReferenceCounted(Z)V" />
+ </class>
+ <class name="android/net/wifi/WifiManager$WifiLock" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/net/wifi/WifiManager;)V" />
+ <method name="acquire()V" />
+ <method name="isHeld()Z" />
+ <method name="release()V" />
+ <method name="setReferenceCounted(Z)V" />
+ <method name="setWorkSource(Landroid/os/WorkSource;)V" since="9" />
+ </class>
+ <class name="android/net/wifi/WifiManager$WpsCallback" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onFailed(I)V" />
+ <method name="onStarted(Ljava/lang/String;)V" />
+ <method name="onSucceeded()V" />
+ </class>
+ <class name="android/net/wifi/WpsInfo" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/net/wifi/WpsInfo;)V" />
+ <field name="BSSID" since="21" />
+ <field name="CREATOR" />
+ <field name="DISPLAY" />
+ <field name="INVALID" />
+ <field name="KEYPAD" />
+ <field name="LABEL" />
+ <field name="PBC" />
+ <field name="pin" />
+ <field name="setup" />
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pConfig" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/net/wifi/p2p/WifiP2pConfig;)V" />
+ <field name="CREATOR" />
+ <field name="deviceAddress" />
+ <field name="groupOwnerIntent" />
+ <field name="wps" />
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pDevice" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/net/wifi/p2p/WifiP2pDevice;)V" />
+ <method name="isGroupOwner()Z" />
+ <method name="isServiceDiscoveryCapable()Z" />
+ <method name="wpsDisplaySupported()Z" />
+ <method name="wpsKeypadSupported()Z" />
+ <method name="wpsPbcSupported()Z" />
+ <field name="AVAILABLE" />
+ <field name="CONNECTED" />
+ <field name="CREATOR" />
+ <field name="FAILED" />
+ <field name="INVITED" />
+ <field name="UNAVAILABLE" />
+ <field name="deviceAddress" />
+ <field name="deviceName" />
+ <field name="primaryDeviceType" />
+ <field name="secondaryDeviceType" />
+ <field name="status" />
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pDeviceList" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/net/wifi/p2p/WifiP2pDeviceList;)V" />
+ <method name="get(Ljava/lang/String;)Landroid/net/wifi/p2p/WifiP2pDevice;" since="18" />
+ <method name="getDeviceList()Ljava/util/Collection;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pGroup" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/net/wifi/p2p/WifiP2pGroup;)V" />
+ <method name="getClientList()Ljava/util/Collection;" />
+ <method name="getInterface()Ljava/lang/String;" />
+ <method name="getNetworkName()Ljava/lang/String;" />
+ <method name="getOwner()Landroid/net/wifi/p2p/WifiP2pDevice;" />
+ <method name="getPassphrase()Ljava/lang/String;" />
+ <method name="isGroupOwner()Z" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pInfo" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/net/wifi/p2p/WifiP2pInfo;)V" />
+ <field name="CREATOR" />
+ <field name="groupFormed" />
+ <field name="groupOwnerAddress" />
+ <field name="isGroupOwner" />
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pManager" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addLocalService(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/nsd/WifiP2pServiceInfo;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V" since="16" />
+ <method name="addServiceRequest(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V" since="16" />
+ <method name="cancelConnect(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V" />
+ <method name="clearLocalServices(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V" since="16" />
+ <method name="clearServiceRequests(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V" since="16" />
+ <method name="connect(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pConfig;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V" />
+ <method name="createGroup(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V" />
+ <method name="discoverPeers(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V" />
+ <method name="discoverServices(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V" since="16" />
+ <method name="initialize(Landroid/content/Context;Landroid/os/Looper;Landroid/net/wifi/p2p/WifiP2pManager$ChannelListener;)Landroid/net/wifi/p2p/WifiP2pManager$Channel;" />
+ <method name="removeGroup(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V" />
+ <method name="removeLocalService(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/nsd/WifiP2pServiceInfo;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V" since="16" />
+ <method name="removeServiceRequest(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V" since="16" />
+ <method name="requestConnectionInfo(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ConnectionInfoListener;)V" />
+ <method name="requestGroupInfo(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$GroupInfoListener;)V" />
+ <method name="requestPeers(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$PeerListListener;)V" />
+ <method name="setDnsSdResponseListeners(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$DnsSdServiceResponseListener;Landroid/net/wifi/p2p/WifiP2pManager$DnsSdTxtRecordListener;)V" since="16" />
+ <method name="setServiceResponseListener(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ServiceResponseListener;)V" since="16" />
+ <method name="setUpnpServiceResponseListener(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$UpnpServiceResponseListener;)V" since="16" />
+ <method name="stopPeerDiscovery(Landroid/net/wifi/p2p/WifiP2pManager$Channel;Landroid/net/wifi/p2p/WifiP2pManager$ActionListener;)V" since="16" />
+ <field name="BUSY" />
+ <field name="ERROR" />
+ <field name="EXTRA_DISCOVERY_STATE" since="16" />
+ <field name="EXTRA_NETWORK_INFO" />
+ <field name="EXTRA_P2P_DEVICE_LIST" since="18" />
+ <field name="EXTRA_WIFI_P2P_DEVICE" />
+ <field name="EXTRA_WIFI_P2P_GROUP" since="18" />
+ <field name="EXTRA_WIFI_P2P_INFO" />
+ <field name="EXTRA_WIFI_STATE" />
+ <field name="NO_SERVICE_REQUESTS" since="16" />
+ <field name="P2P_UNSUPPORTED" />
+ <field name="WIFI_P2P_CONNECTION_CHANGED_ACTION" />
+ <field name="WIFI_P2P_DISCOVERY_CHANGED_ACTION" since="16" />
+ <field name="WIFI_P2P_DISCOVERY_STARTED" since="16" />
+ <field name="WIFI_P2P_DISCOVERY_STOPPED" since="16" />
+ <field name="WIFI_P2P_PEERS_CHANGED_ACTION" />
+ <field name="WIFI_P2P_STATE_CHANGED_ACTION" />
+ <field name="WIFI_P2P_STATE_DISABLED" />
+ <field name="WIFI_P2P_STATE_ENABLED" />
+ <field name="WIFI_P2P_THIS_DEVICE_CHANGED_ACTION" />
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pManager$ActionListener" since="14">
+ <extends name="java/lang/Object" />
+ <method name="onFailure(I)V" />
+ <method name="onSuccess()V" />
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pManager$Channel" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pManager$ChannelListener" since="14">
+ <extends name="java/lang/Object" />
+ <method name="onChannelDisconnected()V" />
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pManager$ConnectionInfoListener" since="14">
+ <extends name="java/lang/Object" />
+ <method name="onConnectionInfoAvailable(Landroid/net/wifi/p2p/WifiP2pInfo;)V" />
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pManager$DnsSdServiceResponseListener" since="16">
+ <extends name="java/lang/Object" />
+ <method name="onDnsSdServiceAvailable(Ljava/lang/String;Ljava/lang/String;Landroid/net/wifi/p2p/WifiP2pDevice;)V" />
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pManager$DnsSdTxtRecordListener" since="16">
+ <extends name="java/lang/Object" />
+ <method name="onDnsSdTxtRecordAvailable(Ljava/lang/String;Ljava/util/Map;Landroid/net/wifi/p2p/WifiP2pDevice;)V" />
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pManager$GroupInfoListener" since="14">
+ <extends name="java/lang/Object" />
+ <method name="onGroupInfoAvailable(Landroid/net/wifi/p2p/WifiP2pGroup;)V" />
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pManager$PeerListListener" since="14">
+ <extends name="java/lang/Object" />
+ <method name="onPeersAvailable(Landroid/net/wifi/p2p/WifiP2pDeviceList;)V" />
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pManager$ServiceResponseListener" since="16">
+ <extends name="java/lang/Object" />
+ <method name="onServiceAvailable(I[BLandroid/net/wifi/p2p/WifiP2pDevice;)V" />
+ </class>
+ <class name="android/net/wifi/p2p/WifiP2pManager$UpnpServiceResponseListener" since="16">
+ <extends name="java/lang/Object" />
+ <method name="onUpnpServiceAvailable(Ljava/util/List;Landroid/net/wifi/p2p/WifiP2pDevice;)V" />
+ </class>
+ <class name="android/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfo" since="16">
+ <extends name="android/net/wifi/p2p/nsd/WifiP2pServiceInfo" />
+ <method name="&lt;init>()V" />
+ <method name="newInstance(Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfo;" />
+ </class>
+ <class name="android/net/wifi/p2p/nsd/WifiP2pDnsSdServiceRequest" since="16">
+ <extends name="android/net/wifi/p2p/nsd/WifiP2pServiceRequest" />
+ <method name="&lt;init>()V" />
+ <method name="newInstance()Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceRequest;" />
+ <method name="newInstance(Ljava/lang/String;)Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceRequest;" />
+ <method name="newInstance(Ljava/lang/String;Ljava/lang/String;)Landroid/net/wifi/p2p/nsd/WifiP2pDnsSdServiceRequest;" />
+ </class>
+ <class name="android/net/wifi/p2p/nsd/WifiP2pServiceInfo" since="16">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <field name="SERVICE_TYPE_ALL" />
+ <field name="SERVICE_TYPE_BONJOUR" />
+ <field name="SERVICE_TYPE_UPNP" />
+ <field name="SERVICE_TYPE_VENDOR_SPECIFIC" />
+ </class>
+ <class name="android/net/wifi/p2p/nsd/WifiP2pServiceRequest" since="16">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="newInstance(I)Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;" />
+ <method name="newInstance(ILjava/lang/String;)Landroid/net/wifi/p2p/nsd/WifiP2pServiceRequest;" />
+ </class>
+ <class name="android/net/wifi/p2p/nsd/WifiP2pUpnpServiceInfo" since="16">
+ <extends name="android/net/wifi/p2p/nsd/WifiP2pServiceInfo" />
+ <method name="&lt;init>()V" />
+ <method name="newInstance(Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceInfo;" />
+ </class>
+ <class name="android/net/wifi/p2p/nsd/WifiP2pUpnpServiceRequest" since="16">
+ <extends name="android/net/wifi/p2p/nsd/WifiP2pServiceRequest" />
+ <method name="&lt;init>()V" />
+ <method name="newInstance()Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceRequest;" />
+ <method name="newInstance(Ljava/lang/String;)Landroid/net/wifi/p2p/nsd/WifiP2pUpnpServiceRequest;" />
+ </class>
+ <class name="android/nfc/FormatException" since="9">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" since="16" />
+ </class>
+ <class name="android/nfc/NdefMessage" since="9">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/nfc/NdefRecord;[Landroid/nfc/NdefRecord;)V" since="16" />
+ <method name="&lt;init>([B)V" />
+ <method name="&lt;init>([Landroid/nfc/NdefRecord;)V" />
+ <method name="getByteArrayLength()I" since="16" />
+ <method name="getRecords()[Landroid/nfc/NdefRecord;" />
+ <method name="toByteArray()[B" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/nfc/NdefRecord" since="9">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(S[B[B[B)V" />
+ <method name="&lt;init>([B)V" />
+ <method name="createApplicationRecord(Ljava/lang/String;)Landroid/nfc/NdefRecord;" since="14" />
+ <method name="createExternal(Ljava/lang/String;Ljava/lang/String;[B)Landroid/nfc/NdefRecord;" since="16" />
+ <method name="createMime(Ljava/lang/String;[B)Landroid/nfc/NdefRecord;" since="16" />
+ <method name="createTextRecord(Ljava/lang/String;Ljava/lang/String;)Landroid/nfc/NdefRecord;" since="21" />
+ <method name="createUri(Landroid/net/Uri;)Landroid/nfc/NdefRecord;" since="14" />
+ <method name="createUri(Ljava/lang/String;)Landroid/nfc/NdefRecord;" since="14" />
+ <method name="getId()[B" />
+ <method name="getPayload()[B" />
+ <method name="getTnf()S" />
+ <method name="getType()[B" />
+ <method name="toByteArray()[B" />
+ <method name="toMimeType()Ljava/lang/String;" since="16" />
+ <method name="toUri()Landroid/net/Uri;" since="16" />
+ <field name="CREATOR" />
+ <field name="RTD_ALTERNATIVE_CARRIER" />
+ <field name="RTD_HANDOVER_CARRIER" />
+ <field name="RTD_HANDOVER_REQUEST" />
+ <field name="RTD_HANDOVER_SELECT" />
+ <field name="RTD_SMART_POSTER" />
+ <field name="RTD_TEXT" />
+ <field name="RTD_URI" />
+ <field name="TNF_ABSOLUTE_URI" />
+ <field name="TNF_EMPTY" />
+ <field name="TNF_EXTERNAL_TYPE" />
+ <field name="TNF_MIME_MEDIA" />
+ <field name="TNF_UNCHANGED" />
+ <field name="TNF_UNKNOWN" />
+ <field name="TNF_WELL_KNOWN" />
+ </class>
+ <class name="android/nfc/NfcAdapter" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="disableForegroundDispatch(Landroid/app/Activity;)V" since="10" />
+ <method name="disableForegroundNdefPush(Landroid/app/Activity;)V" since="10" />
+ <method name="disableReaderMode(Landroid/app/Activity;)V" since="19" />
+ <method name="enableForegroundDispatch(Landroid/app/Activity;Landroid/app/PendingIntent;[Landroid/content/IntentFilter;[[Ljava/lang/String;)V" since="10" />
+ <method name="enableForegroundNdefPush(Landroid/app/Activity;Landroid/nfc/NdefMessage;)V" since="10" />
+ <method name="enableReaderMode(Landroid/app/Activity;Landroid/nfc/NfcAdapter$ReaderCallback;ILandroid/os/Bundle;)V" since="19" />
+ <method name="getDefaultAdapter()Landroid/nfc/NfcAdapter;" />
+ <method name="getDefaultAdapter(Landroid/content/Context;)Landroid/nfc/NfcAdapter;" since="10" />
+ <method name="invokeBeam(Landroid/app/Activity;)Z" since="21" />
+ <method name="isEnabled()Z" />
+ <method name="isNdefPushEnabled()Z" since="16" />
+ <method name="setBeamPushUris([Landroid/net/Uri;Landroid/app/Activity;)V" since="16" />
+ <method name="setBeamPushUrisCallback(Landroid/nfc/NfcAdapter$CreateBeamUrisCallback;Landroid/app/Activity;)V" since="16" />
+ <method name="setNdefPushMessage(Landroid/nfc/NdefMessage;Landroid/app/Activity;[Landroid/app/Activity;)V" since="14" />
+ <method name="setNdefPushMessageCallback(Landroid/nfc/NfcAdapter$CreateNdefMessageCallback;Landroid/app/Activity;[Landroid/app/Activity;)V" since="14" />
+ <method name="setOnNdefPushCompleteCallback(Landroid/nfc/NfcAdapter$OnNdefPushCompleteCallback;Landroid/app/Activity;[Landroid/app/Activity;)V" since="14" />
+ <field name="ACTION_ADAPTER_STATE_CHANGED" since="18" />
+ <field name="ACTION_NDEF_DISCOVERED" since="10" />
+ <field name="ACTION_TAG_DISCOVERED" />
+ <field name="ACTION_TECH_DISCOVERED" since="10" />
+ <field name="EXTRA_ADAPTER_STATE" since="18" />
+ <field name="EXTRA_ID" />
+ <field name="EXTRA_NDEF_MESSAGES" />
+ <field name="EXTRA_READER_PRESENCE_CHECK_DELAY" since="19" />
+ <field name="EXTRA_TAG" since="10" />
+ <field name="FLAG_READER_NFC_A" since="19" />
+ <field name="FLAG_READER_NFC_B" since="19" />
+ <field name="FLAG_READER_NFC_BARCODE" since="19" />
+ <field name="FLAG_READER_NFC_F" since="19" />
+ <field name="FLAG_READER_NFC_V" since="19" />
+ <field name="FLAG_READER_NO_PLATFORM_SOUNDS" since="19" />
+ <field name="FLAG_READER_SKIP_NDEF_CHECK" since="19" />
+ <field name="STATE_OFF" since="18" />
+ <field name="STATE_ON" since="18" />
+ <field name="STATE_TURNING_OFF" since="18" />
+ <field name="STATE_TURNING_ON" since="18" />
+ </class>
+ <class name="android/nfc/NfcAdapter$CreateBeamUrisCallback" since="16">
+ <extends name="java/lang/Object" />
+ <method name="createBeamUris(Landroid/nfc/NfcEvent;)[Landroid/net/Uri;" />
+ </class>
+ <class name="android/nfc/NfcAdapter$CreateNdefMessageCallback" since="14">
+ <extends name="java/lang/Object" />
+ <method name="createNdefMessage(Landroid/nfc/NfcEvent;)Landroid/nfc/NdefMessage;" />
+ </class>
+ <class name="android/nfc/NfcAdapter$OnNdefPushCompleteCallback" since="14">
+ <extends name="java/lang/Object" />
+ <method name="onNdefPushComplete(Landroid/nfc/NfcEvent;)V" />
+ </class>
+ <class name="android/nfc/NfcAdapter$ReaderCallback" since="19">
+ <extends name="java/lang/Object" />
+ <method name="onTagDiscovered(Landroid/nfc/Tag;)V" />
+ </class>
+ <class name="android/nfc/NfcEvent" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="nfcAdapter" />
+ </class>
+ <class name="android/nfc/NfcManager" since="10">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getDefaultAdapter()Landroid/nfc/NfcAdapter;" />
+ </class>
+ <class name="android/nfc/Tag" since="10">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getId()[B" />
+ <method name="getTechList()[Ljava/lang/String;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/nfc/TagLostException" since="10">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/nfc/cardemulation/CardEmulation" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="categoryAllowsForegroundPreference(Ljava/lang/String;)Z" since="21" />
+ <method name="getAidsForService(Landroid/content/ComponentName;Ljava/lang/String;)Ljava/util/List;" since="21" />
+ <method name="getInstance(Landroid/nfc/NfcAdapter;)Landroid/nfc/cardemulation/CardEmulation;" />
+ <method name="getSelectionModeForCategory(Ljava/lang/String;)I" />
+ <method name="isDefaultServiceForAid(Landroid/content/ComponentName;Ljava/lang/String;)Z" />
+ <method name="isDefaultServiceForCategory(Landroid/content/ComponentName;Ljava/lang/String;)Z" />
+ <method name="registerAidsForService(Landroid/content/ComponentName;Ljava/lang/String;Ljava/util/List;)Z" since="21" />
+ <method name="removeAidsForService(Landroid/content/ComponentName;Ljava/lang/String;)Z" since="21" />
+ <method name="setPreferredService(Landroid/app/Activity;Landroid/content/ComponentName;)Z" since="21" />
+ <method name="supportsAidPrefixRegistration()Z" since="21" />
+ <method name="unsetPreferredService(Landroid/app/Activity;)Z" since="21" />
+ <field name="ACTION_CHANGE_DEFAULT" />
+ <field name="CATEGORY_OTHER" />
+ <field name="CATEGORY_PAYMENT" />
+ <field name="EXTRA_CATEGORY" />
+ <field name="EXTRA_SERVICE_COMPONENT" />
+ <field name="SELECTION_MODE_ALWAYS_ASK" />
+ <field name="SELECTION_MODE_ASK_IF_CONFLICT" />
+ <field name="SELECTION_MODE_PREFER_DEFAULT" />
+ </class>
+ <class name="android/nfc/cardemulation/HostApduService" since="19">
+ <extends name="android/app/Service" />
+ <method name="&lt;init>()V" />
+ <method name="notifyUnhandled()V" />
+ <method name="onDeactivated(I)V" />
+ <method name="processCommandApdu([BLandroid/os/Bundle;)[B" />
+ <method name="sendResponseApdu([B)V" />
+ <field name="DEACTIVATION_DESELECTED" />
+ <field name="DEACTIVATION_LINK_LOSS" />
+ <field name="SERVICE_INTERFACE" />
+ <field name="SERVICE_META_DATA" />
+ </class>
+ <class name="android/nfc/cardemulation/OffHostApduService" since="19">
+ <extends name="android/app/Service" />
+ <method name="&lt;init>()V" />
+ <field name="SERVICE_INTERFACE" />
+ <field name="SERVICE_META_DATA" />
+ </class>
+ <class name="android/nfc/tech/BasicTagTechnology" since="10">
+ <extends name="java/lang/Object" />
+ <implements name="android/nfc/tech/TagTechnology" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/nfc/tech/IsoDep" since="10">
+ <extends name="android/nfc/tech/BasicTagTechnology" />
+ <method name="&lt;init>()V" />
+ <method name="get(Landroid/nfc/Tag;)Landroid/nfc/tech/IsoDep;" />
+ <method name="getHiLayerResponse()[B" />
+ <method name="getHistoricalBytes()[B" />
+ <method name="getMaxTransceiveLength()I" since="14" />
+ <method name="getTimeout()I" since="14" />
+ <method name="isExtendedLengthApduSupported()Z" since="16" />
+ <method name="setTimeout(I)V" />
+ <method name="transceive([B)[B" />
+ </class>
+ <class name="android/nfc/tech/MifareClassic" since="10">
+ <extends name="android/nfc/tech/BasicTagTechnology" />
+ <method name="&lt;init>()V" />
+ <method name="authenticateSectorWithKeyA(I[B)Z" />
+ <method name="authenticateSectorWithKeyB(I[B)Z" />
+ <method name="blockToSector(I)I" />
+ <method name="decrement(II)V" />
+ <method name="get(Landroid/nfc/Tag;)Landroid/nfc/tech/MifareClassic;" />
+ <method name="getBlockCount()I" />
+ <method name="getBlockCountInSector(I)I" />
+ <method name="getMaxTransceiveLength()I" since="14" />
+ <method name="getSectorCount()I" />
+ <method name="getSize()I" />
+ <method name="getTimeout()I" since="14" />
+ <method name="getType()I" />
+ <method name="increment(II)V" />
+ <method name="readBlock(I)[B" />
+ <method name="restore(I)V" />
+ <method name="sectorToBlock(I)I" />
+ <method name="setTimeout(I)V" since="14" />
+ <method name="transceive([B)[B" />
+ <method name="transfer(I)V" />
+ <method name="writeBlock(I[B)V" />
+ <field name="BLOCK_SIZE" />
+ <field name="KEY_DEFAULT" />
+ <field name="KEY_MIFARE_APPLICATION_DIRECTORY" />
+ <field name="KEY_NFC_FORUM" />
+ <field name="SIZE_1K" />
+ <field name="SIZE_2K" />
+ <field name="SIZE_4K" />
+ <field name="SIZE_MINI" />
+ <field name="TYPE_CLASSIC" />
+ <field name="TYPE_PLUS" />
+ <field name="TYPE_PRO" />
+ <field name="TYPE_UNKNOWN" />
+ </class>
+ <class name="android/nfc/tech/MifareUltralight" since="10">
+ <extends name="android/nfc/tech/BasicTagTechnology" />
+ <method name="&lt;init>()V" />
+ <method name="get(Landroid/nfc/Tag;)Landroid/nfc/tech/MifareUltralight;" />
+ <method name="getMaxTransceiveLength()I" since="14" />
+ <method name="getTimeout()I" since="14" />
+ <method name="getType()I" />
+ <method name="readPages(I)[B" />
+ <method name="setTimeout(I)V" since="14" />
+ <method name="transceive([B)[B" />
+ <method name="writePage(I[B)V" />
+ <field name="PAGE_SIZE" />
+ <field name="TYPE_ULTRALIGHT" />
+ <field name="TYPE_ULTRALIGHT_C" />
+ <field name="TYPE_UNKNOWN" />
+ </class>
+ <class name="android/nfc/tech/Ndef" since="10">
+ <extends name="android/nfc/tech/BasicTagTechnology" />
+ <method name="&lt;init>()V" />
+ <method name="canMakeReadOnly()Z" />
+ <method name="get(Landroid/nfc/Tag;)Landroid/nfc/tech/Ndef;" />
+ <method name="getCachedNdefMessage()Landroid/nfc/NdefMessage;" />
+ <method name="getMaxSize()I" />
+ <method name="getNdefMessage()Landroid/nfc/NdefMessage;" />
+ <method name="getType()Ljava/lang/String;" />
+ <method name="isWritable()Z" />
+ <method name="makeReadOnly()Z" />
+ <method name="writeNdefMessage(Landroid/nfc/NdefMessage;)V" />
+ <field name="MIFARE_CLASSIC" />
+ <field name="NFC_FORUM_TYPE_1" />
+ <field name="NFC_FORUM_TYPE_2" />
+ <field name="NFC_FORUM_TYPE_3" />
+ <field name="NFC_FORUM_TYPE_4" />
+ </class>
+ <class name="android/nfc/tech/NdefFormatable" since="10">
+ <extends name="android/nfc/tech/BasicTagTechnology" />
+ <method name="&lt;init>()V" />
+ <method name="format(Landroid/nfc/NdefMessage;)V" />
+ <method name="formatReadOnly(Landroid/nfc/NdefMessage;)V" />
+ <method name="get(Landroid/nfc/Tag;)Landroid/nfc/tech/NdefFormatable;" />
+ </class>
+ <class name="android/nfc/tech/NfcA" since="10">
+ <extends name="android/nfc/tech/BasicTagTechnology" />
+ <method name="&lt;init>()V" />
+ <method name="get(Landroid/nfc/Tag;)Landroid/nfc/tech/NfcA;" />
+ <method name="getAtqa()[B" />
+ <method name="getMaxTransceiveLength()I" since="14" />
+ <method name="getSak()S" />
+ <method name="getTimeout()I" since="14" />
+ <method name="setTimeout(I)V" since="14" />
+ <method name="transceive([B)[B" />
+ </class>
+ <class name="android/nfc/tech/NfcB" since="10">
+ <extends name="android/nfc/tech/BasicTagTechnology" />
+ <method name="&lt;init>()V" />
+ <method name="get(Landroid/nfc/Tag;)Landroid/nfc/tech/NfcB;" />
+ <method name="getApplicationData()[B" />
+ <method name="getMaxTransceiveLength()I" since="14" />
+ <method name="getProtocolInfo()[B" />
+ <method name="transceive([B)[B" />
+ </class>
+ <class name="android/nfc/tech/NfcBarcode" since="17">
+ <extends name="android/nfc/tech/BasicTagTechnology" />
+ <method name="&lt;init>()V" />
+ <method name="get(Landroid/nfc/Tag;)Landroid/nfc/tech/NfcBarcode;" />
+ <method name="getBarcode()[B" />
+ <method name="getType()I" />
+ <field name="TYPE_KOVIO" />
+ <field name="TYPE_UNKNOWN" />
+ </class>
+ <class name="android/nfc/tech/NfcF" since="10">
+ <extends name="android/nfc/tech/BasicTagTechnology" />
+ <method name="&lt;init>()V" />
+ <method name="get(Landroid/nfc/Tag;)Landroid/nfc/tech/NfcF;" />
+ <method name="getManufacturer()[B" />
+ <method name="getMaxTransceiveLength()I" since="14" />
+ <method name="getSystemCode()[B" />
+ <method name="getTimeout()I" since="14" />
+ <method name="setTimeout(I)V" since="14" />
+ <method name="transceive([B)[B" />
+ </class>
+ <class name="android/nfc/tech/NfcV" since="10">
+ <extends name="android/nfc/tech/BasicTagTechnology" />
+ <method name="&lt;init>()V" />
+ <method name="get(Landroid/nfc/Tag;)Landroid/nfc/tech/NfcV;" />
+ <method name="getDsfId()B" />
+ <method name="getMaxTransceiveLength()I" since="14" />
+ <method name="getResponseFlags()B" />
+ <method name="transceive([B)[B" />
+ </class>
+ <class name="android/nfc/tech/TagTechnology" since="10">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Closeable" />
+ <method name="connect()V" />
+ <method name="getTag()Landroid/nfc/Tag;" />
+ <method name="isConnected()Z" />
+ </class>
+ <class name="android/opengl/EGL14" since="17">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="eglBindAPI(I)Z" />
+ <method name="eglBindTexImage(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;I)Z" />
+ <method name="eglChooseConfig(Landroid/opengl/EGLDisplay;[II[Landroid/opengl/EGLConfig;II[II)Z" />
+ <method name="eglCopyBuffers(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;I)Z" />
+ <method name="eglCreateContext(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;Landroid/opengl/EGLContext;[II)Landroid/opengl/EGLContext;" />
+ <method name="eglCreatePbufferFromClientBuffer(Landroid/opengl/EGLDisplay;IILandroid/opengl/EGLConfig;[II)Landroid/opengl/EGLSurface;" />
+ <method name="eglCreatePbufferSurface(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;[II)Landroid/opengl/EGLSurface;" />
+ <method name="eglCreatePixmapSurface(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;I[II)Landroid/opengl/EGLSurface;" />
+ <method name="eglCreateWindowSurface(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;Ljava/lang/Object;[II)Landroid/opengl/EGLSurface;" />
+ <method name="eglDestroyContext(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLContext;)Z" />
+ <method name="eglDestroySurface(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;)Z" />
+ <method name="eglGetConfigAttrib(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLConfig;I[II)Z" />
+ <method name="eglGetConfigs(Landroid/opengl/EGLDisplay;[Landroid/opengl/EGLConfig;II[II)Z" />
+ <method name="eglGetCurrentContext()Landroid/opengl/EGLContext;" />
+ <method name="eglGetCurrentDisplay()Landroid/opengl/EGLDisplay;" />
+ <method name="eglGetCurrentSurface(I)Landroid/opengl/EGLSurface;" />
+ <method name="eglGetDisplay(I)Landroid/opengl/EGLDisplay;" />
+ <method name="eglGetError()I" />
+ <method name="eglInitialize(Landroid/opengl/EGLDisplay;[II[II)Z" />
+ <method name="eglMakeCurrent(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;Landroid/opengl/EGLSurface;Landroid/opengl/EGLContext;)Z" />
+ <method name="eglQueryAPI()I" />
+ <method name="eglQueryContext(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLContext;I[II)Z" />
+ <method name="eglQueryString(Landroid/opengl/EGLDisplay;I)Ljava/lang/String;" />
+ <method name="eglQuerySurface(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;I[II)Z" />
+ <method name="eglReleaseTexImage(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;I)Z" />
+ <method name="eglReleaseThread()Z" />
+ <method name="eglSurfaceAttrib(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;II)Z" />
+ <method name="eglSwapBuffers(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;)Z" />
+ <method name="eglSwapInterval(Landroid/opengl/EGLDisplay;I)Z" />
+ <method name="eglTerminate(Landroid/opengl/EGLDisplay;)Z" />
+ <method name="eglWaitClient()Z" />
+ <method name="eglWaitGL()Z" />
+ <method name="eglWaitNative(I)Z" />
+ <field name="EGL_ALPHA_MASK_SIZE" />
+ <field name="EGL_ALPHA_SIZE" />
+ <field name="EGL_BACK_BUFFER" />
+ <field name="EGL_BAD_ACCESS" />
+ <field name="EGL_BAD_ALLOC" />
+ <field name="EGL_BAD_ATTRIBUTE" />
+ <field name="EGL_BAD_CONFIG" />
+ <field name="EGL_BAD_CONTEXT" />
+ <field name="EGL_BAD_CURRENT_SURFACE" />
+ <field name="EGL_BAD_DISPLAY" />
+ <field name="EGL_BAD_MATCH" />
+ <field name="EGL_BAD_NATIVE_PIXMAP" />
+ <field name="EGL_BAD_NATIVE_WINDOW" />
+ <field name="EGL_BAD_PARAMETER" />
+ <field name="EGL_BAD_SURFACE" />
+ <field name="EGL_BIND_TO_TEXTURE_RGB" />
+ <field name="EGL_BIND_TO_TEXTURE_RGBA" />
+ <field name="EGL_BLUE_SIZE" />
+ <field name="EGL_BUFFER_DESTROYED" />
+ <field name="EGL_BUFFER_PRESERVED" />
+ <field name="EGL_BUFFER_SIZE" />
+ <field name="EGL_CLIENT_APIS" />
+ <field name="EGL_COLOR_BUFFER_TYPE" />
+ <field name="EGL_CONFIG_CAVEAT" />
+ <field name="EGL_CONFIG_ID" />
+ <field name="EGL_CONFORMANT" />
+ <field name="EGL_CONTEXT_CLIENT_TYPE" />
+ <field name="EGL_CONTEXT_CLIENT_VERSION" />
+ <field name="EGL_CONTEXT_LOST" />
+ <field name="EGL_CORE_NATIVE_ENGINE" />
+ <field name="EGL_DEFAULT_DISPLAY" />
+ <field name="EGL_DEPTH_SIZE" />
+ <field name="EGL_DISPLAY_SCALING" />
+ <field name="EGL_DRAW" />
+ <field name="EGL_EXTENSIONS" />
+ <field name="EGL_FALSE" />
+ <field name="EGL_GREEN_SIZE" />
+ <field name="EGL_HEIGHT" />
+ <field name="EGL_HORIZONTAL_RESOLUTION" />
+ <field name="EGL_LARGEST_PBUFFER" />
+ <field name="EGL_LEVEL" />
+ <field name="EGL_LUMINANCE_BUFFER" />
+ <field name="EGL_LUMINANCE_SIZE" />
+ <field name="EGL_MATCH_NATIVE_PIXMAP" />
+ <field name="EGL_MAX_PBUFFER_HEIGHT" />
+ <field name="EGL_MAX_PBUFFER_PIXELS" />
+ <field name="EGL_MAX_PBUFFER_WIDTH" />
+ <field name="EGL_MAX_SWAP_INTERVAL" />
+ <field name="EGL_MIN_SWAP_INTERVAL" />
+ <field name="EGL_MIPMAP_LEVEL" />
+ <field name="EGL_MIPMAP_TEXTURE" />
+ <field name="EGL_MULTISAMPLE_RESOLVE" />
+ <field name="EGL_MULTISAMPLE_RESOLVE_BOX" />
+ <field name="EGL_MULTISAMPLE_RESOLVE_BOX_BIT" />
+ <field name="EGL_MULTISAMPLE_RESOLVE_DEFAULT" />
+ <field name="EGL_NATIVE_RENDERABLE" />
+ <field name="EGL_NATIVE_VISUAL_ID" />
+ <field name="EGL_NATIVE_VISUAL_TYPE" />
+ <field name="EGL_NONE" />
+ <field name="EGL_NON_CONFORMANT_CONFIG" />
+ <field name="EGL_NOT_INITIALIZED" />
+ <field name="EGL_NO_CONTEXT" />
+ <field name="EGL_NO_DISPLAY" />
+ <field name="EGL_NO_SURFACE" />
+ <field name="EGL_NO_TEXTURE" />
+ <field name="EGL_OPENGL_API" />
+ <field name="EGL_OPENGL_BIT" />
+ <field name="EGL_OPENGL_ES2_BIT" />
+ <field name="EGL_OPENGL_ES_API" />
+ <field name="EGL_OPENGL_ES_BIT" />
+ <field name="EGL_OPENVG_API" />
+ <field name="EGL_OPENVG_BIT" />
+ <field name="EGL_OPENVG_IMAGE" />
+ <field name="EGL_PBUFFER_BIT" />
+ <field name="EGL_PIXEL_ASPECT_RATIO" />
+ <field name="EGL_PIXMAP_BIT" />
+ <field name="EGL_READ" />
+ <field name="EGL_RED_SIZE" />
+ <field name="EGL_RENDERABLE_TYPE" />
+ <field name="EGL_RENDER_BUFFER" />
+ <field name="EGL_RGB_BUFFER" />
+ <field name="EGL_SAMPLES" />
+ <field name="EGL_SAMPLE_BUFFERS" />
+ <field name="EGL_SINGLE_BUFFER" />
+ <field name="EGL_SLOW_CONFIG" />
+ <field name="EGL_STENCIL_SIZE" />
+ <field name="EGL_SUCCESS" />
+ <field name="EGL_SURFACE_TYPE" />
+ <field name="EGL_SWAP_BEHAVIOR" />
+ <field name="EGL_SWAP_BEHAVIOR_PRESERVED_BIT" />
+ <field name="EGL_TEXTURE_2D" />
+ <field name="EGL_TEXTURE_FORMAT" />
+ <field name="EGL_TEXTURE_RGB" />
+ <field name="EGL_TEXTURE_RGBA" />
+ <field name="EGL_TEXTURE_TARGET" />
+ <field name="EGL_TRANSPARENT_BLUE_VALUE" />
+ <field name="EGL_TRANSPARENT_GREEN_VALUE" />
+ <field name="EGL_TRANSPARENT_RED_VALUE" />
+ <field name="EGL_TRANSPARENT_RGB" />
+ <field name="EGL_TRANSPARENT_TYPE" />
+ <field name="EGL_TRUE" />
+ <field name="EGL_VENDOR" />
+ <field name="EGL_VERSION" />
+ <field name="EGL_VERTICAL_RESOLUTION" />
+ <field name="EGL_VG_ALPHA_FORMAT" />
+ <field name="EGL_VG_ALPHA_FORMAT_NONPRE" />
+ <field name="EGL_VG_ALPHA_FORMAT_PRE" />
+ <field name="EGL_VG_ALPHA_FORMAT_PRE_BIT" />
+ <field name="EGL_VG_COLORSPACE" />
+ <field name="EGL_VG_COLORSPACE_LINEAR" />
+ <field name="EGL_VG_COLORSPACE_LINEAR_BIT" />
+ <field name="EGL_VG_COLORSPACE_sRGB" />
+ <field name="EGL_WIDTH" />
+ <field name="EGL_WINDOW_BIT" />
+ </class>
+ <class name="android/opengl/EGLConfig" since="17">
+ <extends name="android/opengl/EGLObjectHandle" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/opengl/EGLContext" since="17">
+ <extends name="android/opengl/EGLObjectHandle" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/opengl/EGLDisplay" since="17">
+ <extends name="android/opengl/EGLObjectHandle" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/opengl/EGLExt" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="eglPresentationTimeANDROID(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;J)Z" />
+ <field name="EGL_CONTEXT_FLAGS_KHR" />
+ <field name="EGL_CONTEXT_MAJOR_VERSION_KHR" />
+ <field name="EGL_CONTEXT_MINOR_VERSION_KHR" />
+ <field name="EGL_OPENGL_ES3_BIT_KHR" />
+ </class>
+ <class name="android/opengl/EGLObjectHandle" since="17">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(J)V" since="21" />
+ <method name="getHandle()I" />
+ <method name="getNativeHandle()J" since="21" />
+ </class>
+ <class name="android/opengl/EGLSurface" since="17">
+ <extends name="android/opengl/EGLObjectHandle" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/opengl/ETC1" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="decodeBlock(Ljava/nio/Buffer;Ljava/nio/Buffer;)V" />
+ <method name="decodeImage(Ljava/nio/Buffer;Ljava/nio/Buffer;IIII)V" />
+ <method name="encodeBlock(Ljava/nio/Buffer;ILjava/nio/Buffer;)V" />
+ <method name="encodeImage(Ljava/nio/Buffer;IIIILjava/nio/Buffer;)V" />
+ <method name="formatHeader(Ljava/nio/Buffer;II)V" />
+ <method name="getEncodedDataSize(II)I" />
+ <method name="getHeight(Ljava/nio/Buffer;)I" />
+ <method name="getWidth(Ljava/nio/Buffer;)I" />
+ <method name="isValid(Ljava/nio/Buffer;)Z" />
+ <field name="DECODED_BLOCK_SIZE" />
+ <field name="ENCODED_BLOCK_SIZE" />
+ <field name="ETC1_RGB8_OES" />
+ <field name="ETC_PKM_HEADER_SIZE" />
+ </class>
+ <class name="android/opengl/ETC1Util" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="compressTexture(Ljava/nio/Buffer;IIII)Landroid/opengl/ETC1Util$ETC1Texture;" />
+ <method name="createTexture(Ljava/io/InputStream;)Landroid/opengl/ETC1Util$ETC1Texture;" />
+ <method name="isETC1Supported()Z" />
+ <method name="loadTexture(IIIIILandroid/opengl/ETC1Util$ETC1Texture;)V" />
+ <method name="loadTexture(IIIIILjava/io/InputStream;)V" />
+ <method name="writeTexture(Landroid/opengl/ETC1Util$ETC1Texture;Ljava/io/OutputStream;)V" />
+ </class>
+ <class name="android/opengl/ETC1Util$ETC1Texture" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(IILjava/nio/ByteBuffer;)V" />
+ <method name="getData()Ljava/nio/ByteBuffer;" />
+ <method name="getHeight()I" />
+ <method name="getWidth()I" />
+ </class>
+ <class name="android/opengl/GLDebugHelper" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="wrap(Ljavax/microedition/khronos/egl/EGL;ILjava/io/Writer;)Ljavax/microedition/khronos/egl/EGL;" />
+ <method name="wrap(Ljavax/microedition/khronos/opengles/GL;ILjava/io/Writer;)Ljavax/microedition/khronos/opengles/GL;" />
+ <field name="CONFIG_CHECK_GL_ERROR" />
+ <field name="CONFIG_CHECK_THREAD" />
+ <field name="CONFIG_LOG_ARGUMENT_NAMES" />
+ <field name="ERROR_WRONG_THREAD" />
+ </class>
+ <class name="android/opengl/GLES10" since="4">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="glActiveTexture(I)V" />
+ <method name="glAlphaFunc(IF)V" />
+ <method name="glAlphaFuncx(II)V" />
+ <method name="glBindTexture(II)V" />
+ <method name="glBlendFunc(II)V" />
+ <method name="glClear(I)V" />
+ <method name="glClearColor(FFFF)V" />
+ <method name="glClearColorx(IIII)V" />
+ <method name="glClearDepthf(F)V" />
+ <method name="glClearDepthx(I)V" />
+ <method name="glClearStencil(I)V" />
+ <method name="glClientActiveTexture(I)V" />
+ <method name="glColor4f(FFFF)V" />
+ <method name="glColor4x(IIII)V" />
+ <method name="glColorMask(ZZZZ)V" />
+ <method name="glColorPointer(IIILjava/nio/Buffer;)V" />
+ <method name="glCompressedTexImage2D(IIIIIIILjava/nio/Buffer;)V" />
+ <method name="glCompressedTexSubImage2D(IIIIIIIILjava/nio/Buffer;)V" />
+ <method name="glCopyTexImage2D(IIIIIIII)V" />
+ <method name="glCopyTexSubImage2D(IIIIIIII)V" />
+ <method name="glCullFace(I)V" />
+ <method name="glDeleteTextures(ILjava/nio/IntBuffer;)V" />
+ <method name="glDeleteTextures(I[II)V" />
+ <method name="glDepthFunc(I)V" />
+ <method name="glDepthMask(Z)V" />
+ <method name="glDepthRangef(FF)V" />
+ <method name="glDepthRangex(II)V" />
+ <method name="glDisable(I)V" />
+ <method name="glDisableClientState(I)V" />
+ <method name="glDrawArrays(III)V" />
+ <method name="glDrawElements(IIILjava/nio/Buffer;)V" />
+ <method name="glEnable(I)V" />
+ <method name="glEnableClientState(I)V" />
+ <method name="glFinish()V" />
+ <method name="glFlush()V" />
+ <method name="glFogf(IF)V" />
+ <method name="glFogfv(ILjava/nio/FloatBuffer;)V" />
+ <method name="glFogfv(I[FI)V" />
+ <method name="glFogx(II)V" />
+ <method name="glFogxv(ILjava/nio/IntBuffer;)V" />
+ <method name="glFogxv(I[II)V" />
+ <method name="glFrontFace(I)V" />
+ <method name="glFrustumf(FFFFFF)V" />
+ <method name="glFrustumx(IIIIII)V" />
+ <method name="glGenTextures(ILjava/nio/IntBuffer;)V" />
+ <method name="glGenTextures(I[II)V" />
+ <method name="glGetError()I" />
+ <method name="glGetIntegerv(ILjava/nio/IntBuffer;)V" />
+ <method name="glGetIntegerv(I[II)V" />
+ <method name="glGetString(I)Ljava/lang/String;" />
+ <method name="glHint(II)V" />
+ <method name="glLightModelf(IF)V" />
+ <method name="glLightModelfv(ILjava/nio/FloatBuffer;)V" />
+ <method name="glLightModelfv(I[FI)V" />
+ <method name="glLightModelx(II)V" />
+ <method name="glLightModelxv(ILjava/nio/IntBuffer;)V" />
+ <method name="glLightModelxv(I[II)V" />
+ <method name="glLightf(IIF)V" />
+ <method name="glLightfv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glLightfv(II[FI)V" />
+ <method name="glLightx(III)V" />
+ <method name="glLightxv(IILjava/nio/IntBuffer;)V" />
+ <method name="glLightxv(II[II)V" />
+ <method name="glLineWidth(F)V" />
+ <method name="glLineWidthx(I)V" />
+ <method name="glLoadIdentity()V" />
+ <method name="glLoadMatrixf(Ljava/nio/FloatBuffer;)V" />
+ <method name="glLoadMatrixf([FI)V" />
+ <method name="glLoadMatrixx(Ljava/nio/IntBuffer;)V" />
+ <method name="glLoadMatrixx([II)V" />
+ <method name="glLogicOp(I)V" />
+ <method name="glMaterialf(IIF)V" />
+ <method name="glMaterialfv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glMaterialfv(II[FI)V" />
+ <method name="glMaterialx(III)V" />
+ <method name="glMaterialxv(IILjava/nio/IntBuffer;)V" />
+ <method name="glMaterialxv(II[II)V" />
+ <method name="glMatrixMode(I)V" />
+ <method name="glMultMatrixf(Ljava/nio/FloatBuffer;)V" />
+ <method name="glMultMatrixf([FI)V" />
+ <method name="glMultMatrixx(Ljava/nio/IntBuffer;)V" />
+ <method name="glMultMatrixx([II)V" />
+ <method name="glMultiTexCoord4f(IFFFF)V" />
+ <method name="glMultiTexCoord4x(IIIII)V" />
+ <method name="glNormal3f(FFF)V" />
+ <method name="glNormal3x(III)V" />
+ <method name="glNormalPointer(IILjava/nio/Buffer;)V" />
+ <method name="glOrthof(FFFFFF)V" />
+ <method name="glOrthox(IIIIII)V" />
+ <method name="glPixelStorei(II)V" />
+ <method name="glPointSize(F)V" />
+ <method name="glPointSizex(I)V" />
+ <method name="glPolygonOffset(FF)V" />
+ <method name="glPolygonOffsetx(II)V" />
+ <method name="glPopMatrix()V" />
+ <method name="glPushMatrix()V" />
+ <method name="glReadPixels(IIIIIILjava/nio/Buffer;)V" />
+ <method name="glRotatef(FFFF)V" />
+ <method name="glRotatex(IIII)V" />
+ <method name="glSampleCoverage(FZ)V" />
+ <method name="glSampleCoveragex(IZ)V" />
+ <method name="glScalef(FFF)V" />
+ <method name="glScalex(III)V" />
+ <method name="glScissor(IIII)V" />
+ <method name="glShadeModel(I)V" />
+ <method name="glStencilFunc(III)V" />
+ <method name="glStencilMask(I)V" />
+ <method name="glStencilOp(III)V" />
+ <method name="glTexCoordPointer(IIILjava/nio/Buffer;)V" />
+ <method name="glTexEnvf(IIF)V" />
+ <method name="glTexEnvfv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glTexEnvfv(II[FI)V" />
+ <method name="glTexEnvx(III)V" />
+ <method name="glTexEnvxv(IILjava/nio/IntBuffer;)V" />
+ <method name="glTexEnvxv(II[II)V" />
+ <method name="glTexImage2D(IIIIIIIILjava/nio/Buffer;)V" />
+ <method name="glTexParameterf(IIF)V" />
+ <method name="glTexParameterx(III)V" />
+ <method name="glTexSubImage2D(IIIIIIIILjava/nio/Buffer;)V" />
+ <method name="glTranslatef(FFF)V" />
+ <method name="glTranslatex(III)V" />
+ <method name="glVertexPointer(IIILjava/nio/Buffer;)V" />
+ <method name="glViewport(IIII)V" />
+ <field name="GL_ADD" />
+ <field name="GL_ALIASED_LINE_WIDTH_RANGE" />
+ <field name="GL_ALIASED_POINT_SIZE_RANGE" />
+ <field name="GL_ALPHA" />
+ <field name="GL_ALPHA_BITS" />
+ <field name="GL_ALPHA_TEST" />
+ <field name="GL_ALWAYS" />
+ <field name="GL_AMBIENT" />
+ <field name="GL_AMBIENT_AND_DIFFUSE" />
+ <field name="GL_AND" />
+ <field name="GL_AND_INVERTED" />
+ <field name="GL_AND_REVERSE" />
+ <field name="GL_BACK" />
+ <field name="GL_BLEND" />
+ <field name="GL_BLUE_BITS" />
+ <field name="GL_BYTE" />
+ <field name="GL_CCW" />
+ <field name="GL_CLAMP_TO_EDGE" />
+ <field name="GL_CLEAR" />
+ <field name="GL_COLOR_ARRAY" />
+ <field name="GL_COLOR_BUFFER_BIT" />
+ <field name="GL_COLOR_LOGIC_OP" />
+ <field name="GL_COLOR_MATERIAL" />
+ <field name="GL_COMPRESSED_TEXTURE_FORMATS" />
+ <field name="GL_CONSTANT_ATTENUATION" />
+ <field name="GL_COPY" />
+ <field name="GL_COPY_INVERTED" />
+ <field name="GL_CULL_FACE" />
+ <field name="GL_CW" />
+ <field name="GL_DECAL" />
+ <field name="GL_DECR" />
+ <field name="GL_DEPTH_BITS" />
+ <field name="GL_DEPTH_BUFFER_BIT" />
+ <field name="GL_DEPTH_TEST" />
+ <field name="GL_DIFFUSE" />
+ <field name="GL_DITHER" />
+ <field name="GL_DONT_CARE" />
+ <field name="GL_DST_ALPHA" />
+ <field name="GL_DST_COLOR" />
+ <field name="GL_EMISSION" />
+ <field name="GL_EQUAL" />
+ <field name="GL_EQUIV" />
+ <field name="GL_EXP" />
+ <field name="GL_EXP2" />
+ <field name="GL_EXTENSIONS" />
+ <field name="GL_FALSE" />
+ <field name="GL_FASTEST" />
+ <field name="GL_FIXED" />
+ <field name="GL_FLAT" />
+ <field name="GL_FLOAT" />
+ <field name="GL_FOG" />
+ <field name="GL_FOG_COLOR" />
+ <field name="GL_FOG_DENSITY" />
+ <field name="GL_FOG_END" />
+ <field name="GL_FOG_HINT" />
+ <field name="GL_FOG_MODE" />
+ <field name="GL_FOG_START" />
+ <field name="GL_FRONT" />
+ <field name="GL_FRONT_AND_BACK" />
+ <field name="GL_GEQUAL" />
+ <field name="GL_GREATER" />
+ <field name="GL_GREEN_BITS" />
+ <field name="GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES" />
+ <field name="GL_IMPLEMENTATION_COLOR_READ_TYPE_OES" />
+ <field name="GL_INCR" />
+ <field name="GL_INVALID_ENUM" />
+ <field name="GL_INVALID_OPERATION" />
+ <field name="GL_INVALID_VALUE" />
+ <field name="GL_INVERT" />
+ <field name="GL_KEEP" />
+ <field name="GL_LEQUAL" />
+ <field name="GL_LESS" />
+ <field name="GL_LIGHT0" />
+ <field name="GL_LIGHT1" />
+ <field name="GL_LIGHT2" />
+ <field name="GL_LIGHT3" />
+ <field name="GL_LIGHT4" />
+ <field name="GL_LIGHT5" />
+ <field name="GL_LIGHT6" />
+ <field name="GL_LIGHT7" />
+ <field name="GL_LIGHTING" />
+ <field name="GL_LIGHT_MODEL_AMBIENT" />
+ <field name="GL_LIGHT_MODEL_TWO_SIDE" />
+ <field name="GL_LINEAR" />
+ <field name="GL_LINEAR_ATTENUATION" />
+ <field name="GL_LINEAR_MIPMAP_LINEAR" />
+ <field name="GL_LINEAR_MIPMAP_NEAREST" />
+ <field name="GL_LINES" />
+ <field name="GL_LINE_LOOP" />
+ <field name="GL_LINE_SMOOTH" />
+ <field name="GL_LINE_SMOOTH_HINT" />
+ <field name="GL_LINE_STRIP" />
+ <field name="GL_LUMINANCE" />
+ <field name="GL_LUMINANCE_ALPHA" />
+ <field name="GL_MAX_ELEMENTS_INDICES" />
+ <field name="GL_MAX_ELEMENTS_VERTICES" />
+ <field name="GL_MAX_LIGHTS" />
+ <field name="GL_MAX_MODELVIEW_STACK_DEPTH" />
+ <field name="GL_MAX_PROJECTION_STACK_DEPTH" />
+ <field name="GL_MAX_TEXTURE_SIZE" />
+ <field name="GL_MAX_TEXTURE_STACK_DEPTH" />
+ <field name="GL_MAX_TEXTURE_UNITS" />
+ <field name="GL_MAX_VIEWPORT_DIMS" />
+ <field name="GL_MODELVIEW" />
+ <field name="GL_MODULATE" />
+ <field name="GL_MULTISAMPLE" />
+ <field name="GL_NAND" />
+ <field name="GL_NEAREST" />
+ <field name="GL_NEAREST_MIPMAP_LINEAR" />
+ <field name="GL_NEAREST_MIPMAP_NEAREST" />
+ <field name="GL_NEVER" />
+ <field name="GL_NICEST" />
+ <field name="GL_NOOP" />
+ <field name="GL_NOR" />
+ <field name="GL_NORMALIZE" />
+ <field name="GL_NORMAL_ARRAY" />
+ <field name="GL_NOTEQUAL" />
+ <field name="GL_NO_ERROR" />
+ <field name="GL_NUM_COMPRESSED_TEXTURE_FORMATS" />
+ <field name="GL_ONE" />
+ <field name="GL_ONE_MINUS_DST_ALPHA" />
+ <field name="GL_ONE_MINUS_DST_COLOR" />
+ <field name="GL_ONE_MINUS_SRC_ALPHA" />
+ <field name="GL_ONE_MINUS_SRC_COLOR" />
+ <field name="GL_OR" />
+ <field name="GL_OR_INVERTED" />
+ <field name="GL_OR_REVERSE" />
+ <field name="GL_OUT_OF_MEMORY" />
+ <field name="GL_PACK_ALIGNMENT" />
+ <field name="GL_PALETTE4_R5_G6_B5_OES" />
+ <field name="GL_PALETTE4_RGB5_A1_OES" />
+ <field name="GL_PALETTE4_RGB8_OES" />
+ <field name="GL_PALETTE4_RGBA4_OES" />
+ <field name="GL_PALETTE4_RGBA8_OES" />
+ <field name="GL_PALETTE8_R5_G6_B5_OES" />
+ <field name="GL_PALETTE8_RGB5_A1_OES" />
+ <field name="GL_PALETTE8_RGB8_OES" />
+ <field name="GL_PALETTE8_RGBA4_OES" />
+ <field name="GL_PALETTE8_RGBA8_OES" />
+ <field name="GL_PERSPECTIVE_CORRECTION_HINT" />
+ <field name="GL_POINTS" />
+ <field name="GL_POINT_FADE_THRESHOLD_SIZE" />
+ <field name="GL_POINT_SIZE" />
+ <field name="GL_POINT_SMOOTH" />
+ <field name="GL_POINT_SMOOTH_HINT" />
+ <field name="GL_POLYGON_OFFSET_FILL" />
+ <field name="GL_POLYGON_SMOOTH_HINT" />
+ <field name="GL_POSITION" />
+ <field name="GL_PROJECTION" />
+ <field name="GL_QUADRATIC_ATTENUATION" />
+ <field name="GL_RED_BITS" />
+ <field name="GL_RENDERER" />
+ <field name="GL_REPEAT" />
+ <field name="GL_REPLACE" />
+ <field name="GL_RESCALE_NORMAL" />
+ <field name="GL_RGB" />
+ <field name="GL_RGBA" />
+ <field name="GL_SAMPLE_ALPHA_TO_COVERAGE" />
+ <field name="GL_SAMPLE_ALPHA_TO_ONE" />
+ <field name="GL_SAMPLE_COVERAGE" />
+ <field name="GL_SCISSOR_TEST" />
+ <field name="GL_SET" />
+ <field name="GL_SHININESS" />
+ <field name="GL_SHORT" />
+ <field name="GL_SMOOTH" />
+ <field name="GL_SMOOTH_LINE_WIDTH_RANGE" />
+ <field name="GL_SMOOTH_POINT_SIZE_RANGE" />
+ <field name="GL_SPECULAR" />
+ <field name="GL_SPOT_CUTOFF" />
+ <field name="GL_SPOT_DIRECTION" />
+ <field name="GL_SPOT_EXPONENT" />
+ <field name="GL_SRC_ALPHA" />
+ <field name="GL_SRC_ALPHA_SATURATE" />
+ <field name="GL_SRC_COLOR" />
+ <field name="GL_STACK_OVERFLOW" />
+ <field name="GL_STACK_UNDERFLOW" />
+ <field name="GL_STENCIL_BITS" />
+ <field name="GL_STENCIL_BUFFER_BIT" />
+ <field name="GL_STENCIL_TEST" />
+ <field name="GL_SUBPIXEL_BITS" />
+ <field name="GL_TEXTURE" />
+ <field name="GL_TEXTURE0" />
+ <field name="GL_TEXTURE1" />
+ <field name="GL_TEXTURE10" />
+ <field name="GL_TEXTURE11" />
+ <field name="GL_TEXTURE12" />
+ <field name="GL_TEXTURE13" />
+ <field name="GL_TEXTURE14" />
+ <field name="GL_TEXTURE15" />
+ <field name="GL_TEXTURE16" />
+ <field name="GL_TEXTURE17" />
+ <field name="GL_TEXTURE18" />
+ <field name="GL_TEXTURE19" />
+ <field name="GL_TEXTURE2" />
+ <field name="GL_TEXTURE20" />
+ <field name="GL_TEXTURE21" />
+ <field name="GL_TEXTURE22" />
+ <field name="GL_TEXTURE23" />
+ <field name="GL_TEXTURE24" />
+ <field name="GL_TEXTURE25" />
+ <field name="GL_TEXTURE26" />
+ <field name="GL_TEXTURE27" />
+ <field name="GL_TEXTURE28" />
+ <field name="GL_TEXTURE29" />
+ <field name="GL_TEXTURE3" />
+ <field name="GL_TEXTURE30" />
+ <field name="GL_TEXTURE31" />
+ <field name="GL_TEXTURE4" />
+ <field name="GL_TEXTURE5" />
+ <field name="GL_TEXTURE6" />
+ <field name="GL_TEXTURE7" />
+ <field name="GL_TEXTURE8" />
+ <field name="GL_TEXTURE9" />
+ <field name="GL_TEXTURE_2D" />
+ <field name="GL_TEXTURE_COORD_ARRAY" />
+ <field name="GL_TEXTURE_ENV" />
+ <field name="GL_TEXTURE_ENV_COLOR" />
+ <field name="GL_TEXTURE_ENV_MODE" />
+ <field name="GL_TEXTURE_MAG_FILTER" />
+ <field name="GL_TEXTURE_MIN_FILTER" />
+ <field name="GL_TEXTURE_WRAP_S" />
+ <field name="GL_TEXTURE_WRAP_T" />
+ <field name="GL_TRIANGLES" />
+ <field name="GL_TRIANGLE_FAN" />
+ <field name="GL_TRIANGLE_STRIP" />
+ <field name="GL_TRUE" />
+ <field name="GL_UNPACK_ALIGNMENT" />
+ <field name="GL_UNSIGNED_BYTE" />
+ <field name="GL_UNSIGNED_SHORT" />
+ <field name="GL_UNSIGNED_SHORT_4_4_4_4" />
+ <field name="GL_UNSIGNED_SHORT_5_5_5_1" />
+ <field name="GL_UNSIGNED_SHORT_5_6_5" />
+ <field name="GL_VENDOR" />
+ <field name="GL_VERSION" />
+ <field name="GL_VERTEX_ARRAY" />
+ <field name="GL_XOR" />
+ <field name="GL_ZERO" />
+ </class>
+ <class name="android/opengl/GLES10Ext" since="4">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="glQueryMatrixxOES(Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;)I" />
+ <method name="glQueryMatrixxOES([II[II)I" />
+ </class>
+ <class name="android/opengl/GLES11" since="4">
+ <extends name="android/opengl/GLES10" />
+ <method name="&lt;init>()V" />
+ <method name="glBindBuffer(II)V" />
+ <method name="glBufferData(IILjava/nio/Buffer;I)V" />
+ <method name="glBufferSubData(IIILjava/nio/Buffer;)V" />
+ <method name="glClipPlanef(ILjava/nio/FloatBuffer;)V" />
+ <method name="glClipPlanef(I[FI)V" />
+ <method name="glClipPlanex(ILjava/nio/IntBuffer;)V" />
+ <method name="glClipPlanex(I[II)V" />
+ <method name="glColor4ub(BBBB)V" />
+ <method name="glColorPointer(IIII)V" />
+ <method name="glDeleteBuffers(ILjava/nio/IntBuffer;)V" />
+ <method name="glDeleteBuffers(I[II)V" />
+ <method name="glDrawElements(IIII)V" />
+ <method name="glGenBuffers(ILjava/nio/IntBuffer;)V" />
+ <method name="glGenBuffers(I[II)V" />
+ <method name="glGetBooleanv(ILjava/nio/IntBuffer;)V" />
+ <method name="glGetBooleanv(I[ZI)V" />
+ <method name="glGetBufferParameteriv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetBufferParameteriv(II[II)V" />
+ <method name="glGetClipPlanef(ILjava/nio/FloatBuffer;)V" />
+ <method name="glGetClipPlanef(I[FI)V" />
+ <method name="glGetClipPlanex(ILjava/nio/IntBuffer;)V" />
+ <method name="glGetClipPlanex(I[II)V" />
+ <method name="glGetFixedv(ILjava/nio/IntBuffer;)V" />
+ <method name="glGetFixedv(I[II)V" />
+ <method name="glGetFloatv(ILjava/nio/FloatBuffer;)V" />
+ <method name="glGetFloatv(I[FI)V" />
+ <method name="glGetLightfv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glGetLightfv(II[FI)V" />
+ <method name="glGetLightxv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetLightxv(II[II)V" />
+ <method name="glGetMaterialfv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glGetMaterialfv(II[FI)V" />
+ <method name="glGetMaterialxv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetMaterialxv(II[II)V" />
+ <method name="glGetTexEnvfv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glGetTexEnvfv(II[FI)V" />
+ <method name="glGetTexEnviv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetTexEnviv(II[II)V" />
+ <method name="glGetTexEnvxv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetTexEnvxv(II[II)V" />
+ <method name="glGetTexParameterfv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glGetTexParameterfv(II[FI)V" />
+ <method name="glGetTexParameteriv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetTexParameteriv(II[II)V" />
+ <method name="glGetTexParameterxv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetTexParameterxv(II[II)V" />
+ <method name="glIsBuffer(I)Z" />
+ <method name="glIsEnabled(I)Z" />
+ <method name="glIsTexture(I)Z" />
+ <method name="glNormalPointer(III)V" />
+ <method name="glPointParameterf(IF)V" />
+ <method name="glPointParameterfv(ILjava/nio/FloatBuffer;)V" />
+ <method name="glPointParameterfv(I[FI)V" />
+ <method name="glPointParameterx(II)V" />
+ <method name="glPointParameterxv(ILjava/nio/IntBuffer;)V" />
+ <method name="glPointParameterxv(I[II)V" />
+ <method name="glPointSizePointerOES(IILjava/nio/Buffer;)V" />
+ <method name="glTexCoordPointer(IIII)V" />
+ <method name="glTexEnvi(III)V" />
+ <method name="glTexEnviv(IILjava/nio/IntBuffer;)V" />
+ <method name="glTexEnviv(II[II)V" />
+ <method name="glTexParameterfv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glTexParameterfv(II[FI)V" />
+ <method name="glTexParameteri(III)V" />
+ <method name="glTexParameteriv(IILjava/nio/IntBuffer;)V" />
+ <method name="glTexParameteriv(II[II)V" />
+ <method name="glTexParameterxv(IILjava/nio/IntBuffer;)V" />
+ <method name="glTexParameterxv(II[II)V" />
+ <method name="glVertexPointer(IIII)V" />
+ <field name="GL_ACTIVE_TEXTURE" />
+ <field name="GL_ADD_SIGNED" />
+ <field name="GL_ALPHA_SCALE" />
+ <field name="GL_ALPHA_TEST_FUNC" />
+ <field name="GL_ALPHA_TEST_REF" />
+ <field name="GL_ARRAY_BUFFER" />
+ <field name="GL_ARRAY_BUFFER_BINDING" />
+ <field name="GL_BLEND_DST" />
+ <field name="GL_BLEND_SRC" />
+ <field name="GL_BUFFER_ACCESS" />
+ <field name="GL_BUFFER_SIZE" />
+ <field name="GL_BUFFER_USAGE" />
+ <field name="GL_CLIENT_ACTIVE_TEXTURE" />
+ <field name="GL_CLIP_PLANE0" />
+ <field name="GL_CLIP_PLANE1" />
+ <field name="GL_CLIP_PLANE2" />
+ <field name="GL_CLIP_PLANE3" />
+ <field name="GL_CLIP_PLANE4" />
+ <field name="GL_CLIP_PLANE5" />
+ <field name="GL_COLOR_ARRAY_BUFFER_BINDING" />
+ <field name="GL_COLOR_ARRAY_POINTER" />
+ <field name="GL_COLOR_ARRAY_SIZE" />
+ <field name="GL_COLOR_ARRAY_STRIDE" />
+ <field name="GL_COLOR_ARRAY_TYPE" />
+ <field name="GL_COLOR_CLEAR_VALUE" />
+ <field name="GL_COLOR_WRITEMASK" />
+ <field name="GL_COMBINE" />
+ <field name="GL_COMBINE_ALPHA" />
+ <field name="GL_COMBINE_RGB" />
+ <field name="GL_CONSTANT" />
+ <field name="GL_COORD_REPLACE_OES" />
+ <field name="GL_CULL_FACE_MODE" />
+ <field name="GL_CURRENT_COLOR" />
+ <field name="GL_CURRENT_NORMAL" />
+ <field name="GL_CURRENT_TEXTURE_COORDS" />
+ <field name="GL_DEPTH_CLEAR_VALUE" />
+ <field name="GL_DEPTH_FUNC" />
+ <field name="GL_DEPTH_RANGE" />
+ <field name="GL_DEPTH_WRITEMASK" />
+ <field name="GL_DOT3_RGB" />
+ <field name="GL_DOT3_RGBA" />
+ <field name="GL_DYNAMIC_DRAW" />
+ <field name="GL_ELEMENT_ARRAY_BUFFER" />
+ <field name="GL_ELEMENT_ARRAY_BUFFER_BINDING" />
+ <field name="GL_FRONT_FACE" />
+ <field name="GL_GENERATE_MIPMAP" />
+ <field name="GL_GENERATE_MIPMAP_HINT" />
+ <field name="GL_INTERPOLATE" />
+ <field name="GL_LINE_WIDTH" />
+ <field name="GL_LOGIC_OP_MODE" />
+ <field name="GL_MATRIX_MODE" />
+ <field name="GL_MAX_CLIP_PLANES" />
+ <field name="GL_MODELVIEW_MATRIX" />
+ <field name="GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES" />
+ <field name="GL_MODELVIEW_STACK_DEPTH" />
+ <field name="GL_NORMAL_ARRAY_BUFFER_BINDING" />
+ <field name="GL_NORMAL_ARRAY_POINTER" />
+ <field name="GL_NORMAL_ARRAY_STRIDE" />
+ <field name="GL_NORMAL_ARRAY_TYPE" />
+ <field name="GL_OPERAND0_ALPHA" />
+ <field name="GL_OPERAND0_RGB" />
+ <field name="GL_OPERAND1_ALPHA" />
+ <field name="GL_OPERAND1_RGB" />
+ <field name="GL_OPERAND2_ALPHA" />
+ <field name="GL_OPERAND2_RGB" />
+ <field name="GL_POINT_DISTANCE_ATTENUATION" />
+ <field name="GL_POINT_FADE_THRESHOLD_SIZE" />
+ <field name="GL_POINT_SIZE" />
+ <field name="GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES" />
+ <field name="GL_POINT_SIZE_ARRAY_OES" />
+ <field name="GL_POINT_SIZE_ARRAY_POINTER_OES" />
+ <field name="GL_POINT_SIZE_ARRAY_STRIDE_OES" />
+ <field name="GL_POINT_SIZE_ARRAY_TYPE_OES" />
+ <field name="GL_POINT_SIZE_MAX" />
+ <field name="GL_POINT_SIZE_MIN" />
+ <field name="GL_POINT_SPRITE_OES" />
+ <field name="GL_POLYGON_OFFSET_FACTOR" />
+ <field name="GL_POLYGON_OFFSET_UNITS" />
+ <field name="GL_PREVIOUS" />
+ <field name="GL_PRIMARY_COLOR" />
+ <field name="GL_PROJECTION_MATRIX" />
+ <field name="GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES" />
+ <field name="GL_PROJECTION_STACK_DEPTH" />
+ <field name="GL_RGB_SCALE" />
+ <field name="GL_SAMPLES" />
+ <field name="GL_SAMPLE_BUFFERS" />
+ <field name="GL_SAMPLE_COVERAGE_INVERT" />
+ <field name="GL_SAMPLE_COVERAGE_VALUE" />
+ <field name="GL_SCISSOR_BOX" />
+ <field name="GL_SHADE_MODEL" />
+ <field name="GL_SRC0_ALPHA" />
+ <field name="GL_SRC0_RGB" />
+ <field name="GL_SRC1_ALPHA" />
+ <field name="GL_SRC1_RGB" />
+ <field name="GL_SRC2_ALPHA" />
+ <field name="GL_SRC2_RGB" />
+ <field name="GL_STATIC_DRAW" />
+ <field name="GL_STENCIL_CLEAR_VALUE" />
+ <field name="GL_STENCIL_FAIL" />
+ <field name="GL_STENCIL_FUNC" />
+ <field name="GL_STENCIL_PASS_DEPTH_FAIL" />
+ <field name="GL_STENCIL_PASS_DEPTH_PASS" />
+ <field name="GL_STENCIL_REF" />
+ <field name="GL_STENCIL_VALUE_MASK" />
+ <field name="GL_STENCIL_WRITEMASK" />
+ <field name="GL_SUBTRACT" />
+ <field name="GL_TEXTURE_BINDING_2D" />
+ <field name="GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING" />
+ <field name="GL_TEXTURE_COORD_ARRAY_POINTER" />
+ <field name="GL_TEXTURE_COORD_ARRAY_SIZE" />
+ <field name="GL_TEXTURE_COORD_ARRAY_STRIDE" />
+ <field name="GL_TEXTURE_COORD_ARRAY_TYPE" />
+ <field name="GL_TEXTURE_MATRIX" />
+ <field name="GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES" />
+ <field name="GL_TEXTURE_STACK_DEPTH" />
+ <field name="GL_VERTEX_ARRAY_BUFFER_BINDING" />
+ <field name="GL_VERTEX_ARRAY_POINTER" />
+ <field name="GL_VERTEX_ARRAY_SIZE" />
+ <field name="GL_VERTEX_ARRAY_STRIDE" />
+ <field name="GL_VERTEX_ARRAY_TYPE" />
+ <field name="GL_VIEWPORT" />
+ <field name="GL_WRITE_ONLY" />
+ </class>
+ <class name="android/opengl/GLES11Ext" since="4">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="glAlphaFuncxOES(II)V" />
+ <method name="glBindFramebufferOES(II)V" />
+ <method name="glBindRenderbufferOES(II)V" />
+ <method name="glBlendEquationOES(I)V" />
+ <method name="glBlendEquationSeparateOES(II)V" />
+ <method name="glBlendFuncSeparateOES(IIII)V" />
+ <method name="glCheckFramebufferStatusOES(I)I" />
+ <method name="glClearColorxOES(IIII)V" />
+ <method name="glClearDepthfOES(F)V" />
+ <method name="glClearDepthxOES(I)V" />
+ <method name="glClipPlanefOES(ILjava/nio/FloatBuffer;)V" />
+ <method name="glClipPlanefOES(I[FI)V" />
+ <method name="glClipPlanexOES(ILjava/nio/IntBuffer;)V" />
+ <method name="glClipPlanexOES(I[II)V" />
+ <method name="glColor4xOES(IIII)V" />
+ <method name="glCurrentPaletteMatrixOES(I)V" />
+ <method name="glDeleteFramebuffersOES(ILjava/nio/IntBuffer;)V" />
+ <method name="glDeleteFramebuffersOES(I[II)V" />
+ <method name="glDeleteRenderbuffersOES(ILjava/nio/IntBuffer;)V" />
+ <method name="glDeleteRenderbuffersOES(I[II)V" />
+ <method name="glDepthRangefOES(FF)V" />
+ <method name="glDepthRangexOES(II)V" />
+ <method name="glDrawTexfOES(FFFFF)V" />
+ <method name="glDrawTexfvOES(Ljava/nio/FloatBuffer;)V" />
+ <method name="glDrawTexfvOES([FI)V" />
+ <method name="glDrawTexiOES(IIIII)V" />
+ <method name="glDrawTexivOES(Ljava/nio/IntBuffer;)V" />
+ <method name="glDrawTexivOES([II)V" />
+ <method name="glDrawTexsOES(SSSSS)V" />
+ <method name="glDrawTexsvOES(Ljava/nio/ShortBuffer;)V" />
+ <method name="glDrawTexsvOES([SI)V" />
+ <method name="glDrawTexxOES(IIIII)V" />
+ <method name="glDrawTexxvOES(Ljava/nio/IntBuffer;)V" />
+ <method name="glDrawTexxvOES([II)V" />
+ <method name="glEGLImageTargetRenderbufferStorageOES(ILjava/nio/Buffer;)V" />
+ <method name="glEGLImageTargetTexture2DOES(ILjava/nio/Buffer;)V" />
+ <method name="glFogxOES(II)V" />
+ <method name="glFogxvOES(ILjava/nio/IntBuffer;)V" />
+ <method name="glFogxvOES(I[II)V" />
+ <method name="glFramebufferRenderbufferOES(IIII)V" />
+ <method name="glFramebufferTexture2DOES(IIIII)V" />
+ <method name="glFrustumfOES(FFFFFF)V" />
+ <method name="glFrustumxOES(IIIIII)V" />
+ <method name="glGenFramebuffersOES(ILjava/nio/IntBuffer;)V" />
+ <method name="glGenFramebuffersOES(I[II)V" />
+ <method name="glGenRenderbuffersOES(ILjava/nio/IntBuffer;)V" />
+ <method name="glGenRenderbuffersOES(I[II)V" />
+ <method name="glGenerateMipmapOES(I)V" />
+ <method name="glGetClipPlanefOES(ILjava/nio/FloatBuffer;)V" />
+ <method name="glGetClipPlanefOES(I[FI)V" />
+ <method name="glGetClipPlanexOES(ILjava/nio/IntBuffer;)V" />
+ <method name="glGetClipPlanexOES(I[II)V" />
+ <method name="glGetFixedvOES(ILjava/nio/IntBuffer;)V" />
+ <method name="glGetFixedvOES(I[II)V" />
+ <method name="glGetFramebufferAttachmentParameterivOES(IIILjava/nio/IntBuffer;)V" />
+ <method name="glGetFramebufferAttachmentParameterivOES(III[II)V" />
+ <method name="glGetLightxvOES(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetLightxvOES(II[II)V" />
+ <method name="glGetMaterialxvOES(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetMaterialxvOES(II[II)V" />
+ <method name="glGetRenderbufferParameterivOES(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetRenderbufferParameterivOES(II[II)V" />
+ <method name="glGetTexEnvxvOES(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetTexEnvxvOES(II[II)V" />
+ <method name="glGetTexGenfvOES(IILjava/nio/FloatBuffer;)V" />
+ <method name="glGetTexGenfvOES(II[FI)V" />
+ <method name="glGetTexGenivOES(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetTexGenivOES(II[II)V" />
+ <method name="glGetTexGenxvOES(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetTexGenxvOES(II[II)V" />
+ <method name="glGetTexParameterxvOES(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetTexParameterxvOES(II[II)V" />
+ <method name="glIsFramebufferOES(I)Z" />
+ <method name="glIsRenderbufferOES(I)Z" />
+ <method name="glLightModelxOES(II)V" />
+ <method name="glLightModelxvOES(ILjava/nio/IntBuffer;)V" />
+ <method name="glLightModelxvOES(I[II)V" />
+ <method name="glLightxOES(III)V" />
+ <method name="glLightxvOES(IILjava/nio/IntBuffer;)V" />
+ <method name="glLightxvOES(II[II)V" />
+ <method name="glLineWidthxOES(I)V" />
+ <method name="glLoadMatrixxOES(Ljava/nio/IntBuffer;)V" />
+ <method name="glLoadMatrixxOES([II)V" />
+ <method name="glLoadPaletteFromModelViewMatrixOES()V" />
+ <method name="glMaterialxOES(III)V" />
+ <method name="glMaterialxvOES(IILjava/nio/IntBuffer;)V" />
+ <method name="glMaterialxvOES(II[II)V" />
+ <method name="glMatrixIndexPointerOES(IIILjava/nio/Buffer;)V" />
+ <method name="glMultMatrixxOES(Ljava/nio/IntBuffer;)V" />
+ <method name="glMultMatrixxOES([II)V" />
+ <method name="glMultiTexCoord4xOES(IIIII)V" />
+ <method name="glNormal3xOES(III)V" />
+ <method name="glOrthofOES(FFFFFF)V" />
+ <method name="glOrthoxOES(IIIIII)V" />
+ <method name="glPointParameterxOES(II)V" />
+ <method name="glPointParameterxvOES(ILjava/nio/IntBuffer;)V" />
+ <method name="glPointParameterxvOES(I[II)V" />
+ <method name="glPointSizexOES(I)V" />
+ <method name="glPolygonOffsetxOES(II)V" />
+ <method name="glRenderbufferStorageOES(IIII)V" />
+ <method name="glRotatexOES(IIII)V" />
+ <method name="glSampleCoveragexOES(IZ)V" />
+ <method name="glScalexOES(III)V" />
+ <method name="glTexEnvxOES(III)V" />
+ <method name="glTexEnvxvOES(IILjava/nio/IntBuffer;)V" />
+ <method name="glTexEnvxvOES(II[II)V" />
+ <method name="glTexGenfOES(IIF)V" />
+ <method name="glTexGenfvOES(IILjava/nio/FloatBuffer;)V" />
+ <method name="glTexGenfvOES(II[FI)V" />
+ <method name="glTexGeniOES(III)V" />
+ <method name="glTexGenivOES(IILjava/nio/IntBuffer;)V" />
+ <method name="glTexGenivOES(II[II)V" />
+ <method name="glTexGenxOES(III)V" />
+ <method name="glTexGenxvOES(IILjava/nio/IntBuffer;)V" />
+ <method name="glTexGenxvOES(II[II)V" />
+ <method name="glTexParameterxOES(III)V" />
+ <method name="glTexParameterxvOES(IILjava/nio/IntBuffer;)V" />
+ <method name="glTexParameterxvOES(II[II)V" />
+ <method name="glTranslatexOES(III)V" />
+ <method name="glWeightPointerOES(IIILjava/nio/Buffer;)V" />
+ <field name="GL_3DC_XY_AMD" />
+ <field name="GL_3DC_X_AMD" />
+ <field name="GL_ATC_RGBA_EXPLICIT_ALPHA_AMD" />
+ <field name="GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD" />
+ <field name="GL_ATC_RGB_AMD" />
+ <field name="GL_BGRA" />
+ <field name="GL_BLEND_DST_ALPHA_OES" />
+ <field name="GL_BLEND_DST_RGB_OES" />
+ <field name="GL_BLEND_EQUATION_ALPHA_OES" />
+ <field name="GL_BLEND_EQUATION_OES" />
+ <field name="GL_BLEND_EQUATION_RGB_OES" />
+ <field name="GL_BLEND_SRC_ALPHA_OES" />
+ <field name="GL_BLEND_SRC_RGB_OES" />
+ <field name="GL_BUFFER_ACCESS_OES" />
+ <field name="GL_BUFFER_MAPPED_OES" />
+ <field name="GL_BUFFER_MAP_POINTER_OES" />
+ <field name="GL_COLOR_ATTACHMENT0_OES" />
+ <field name="GL_CURRENT_PALETTE_MATRIX_OES" />
+ <field name="GL_DECR_WRAP_OES" />
+ <field name="GL_DEPTH24_STENCIL8_OES" />
+ <field name="GL_DEPTH_ATTACHMENT_OES" />
+ <field name="GL_DEPTH_COMPONENT16_OES" />
+ <field name="GL_DEPTH_COMPONENT24_OES" />
+ <field name="GL_DEPTH_COMPONENT32_OES" />
+ <field name="GL_DEPTH_STENCIL_OES" />
+ <field name="GL_ETC1_RGB8_OES" />
+ <field name="GL_FIXED_OES" />
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES" />
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES" />
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES" />
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES" />
+ <field name="GL_FRAMEBUFFER_BINDING_OES" />
+ <field name="GL_FRAMEBUFFER_COMPLETE_OES" />
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES" />
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES" />
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES" />
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES" />
+ <field name="GL_FRAMEBUFFER_OES" />
+ <field name="GL_FRAMEBUFFER_UNSUPPORTED_OES" />
+ <field name="GL_FUNC_ADD_OES" />
+ <field name="GL_FUNC_REVERSE_SUBTRACT_OES" />
+ <field name="GL_FUNC_SUBTRACT_OES" />
+ <field name="GL_INCR_WRAP_OES" />
+ <field name="GL_INVALID_FRAMEBUFFER_OPERATION_OES" />
+ <field name="GL_MATRIX_INDEX_ARRAY_BUFFER_BINDING_OES" />
+ <field name="GL_MATRIX_INDEX_ARRAY_OES" />
+ <field name="GL_MATRIX_INDEX_ARRAY_POINTER_OES" />
+ <field name="GL_MATRIX_INDEX_ARRAY_SIZE_OES" />
+ <field name="GL_MATRIX_INDEX_ARRAY_STRIDE_OES" />
+ <field name="GL_MATRIX_INDEX_ARRAY_TYPE_OES" />
+ <field name="GL_MATRIX_PALETTE_OES" />
+ <field name="GL_MAX_CUBE_MAP_TEXTURE_SIZE_OES" />
+ <field name="GL_MAX_PALETTE_MATRICES_OES" />
+ <field name="GL_MAX_RENDERBUFFER_SIZE_OES" />
+ <field name="GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT" />
+ <field name="GL_MAX_VERTEX_UNITS_OES" />
+ <field name="GL_MIRRORED_REPEAT_OES" />
+ <field name="GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES" />
+ <field name="GL_NONE_OES" />
+ <field name="GL_NORMAL_MAP_OES" />
+ <field name="GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES" />
+ <field name="GL_REFLECTION_MAP_OES" />
+ <field name="GL_RENDERBUFFER_ALPHA_SIZE_OES" />
+ <field name="GL_RENDERBUFFER_BINDING_OES" />
+ <field name="GL_RENDERBUFFER_BLUE_SIZE_OES" />
+ <field name="GL_RENDERBUFFER_DEPTH_SIZE_OES" />
+ <field name="GL_RENDERBUFFER_GREEN_SIZE_OES" />
+ <field name="GL_RENDERBUFFER_HEIGHT_OES" />
+ <field name="GL_RENDERBUFFER_INTERNAL_FORMAT_OES" />
+ <field name="GL_RENDERBUFFER_OES" />
+ <field name="GL_RENDERBUFFER_RED_SIZE_OES" />
+ <field name="GL_RENDERBUFFER_STENCIL_SIZE_OES" />
+ <field name="GL_RENDERBUFFER_WIDTH_OES" />
+ <field name="GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES" since="15" />
+ <field name="GL_RGB565_OES" />
+ <field name="GL_RGB5_A1_OES" />
+ <field name="GL_RGB8_OES" />
+ <field name="GL_RGBA4_OES" />
+ <field name="GL_RGBA8_OES" />
+ <field name="GL_SAMPLER_EXTERNAL_OES" since="15" />
+ <field name="GL_STENCIL_ATTACHMENT_OES" />
+ <field name="GL_STENCIL_INDEX1_OES" />
+ <field name="GL_STENCIL_INDEX4_OES" />
+ <field name="GL_STENCIL_INDEX8_OES" />
+ <field name="GL_TEXTURE_BINDING_CUBE_MAP_OES" />
+ <field name="GL_TEXTURE_BINDING_EXTERNAL_OES" since="15" />
+ <field name="GL_TEXTURE_CROP_RECT_OES" />
+ <field name="GL_TEXTURE_CUBE_MAP_NEGATIVE_X_OES" />
+ <field name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_OES" />
+ <field name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_OES" />
+ <field name="GL_TEXTURE_CUBE_MAP_OES" />
+ <field name="GL_TEXTURE_CUBE_MAP_POSITIVE_X_OES" />
+ <field name="GL_TEXTURE_CUBE_MAP_POSITIVE_Y_OES" />
+ <field name="GL_TEXTURE_CUBE_MAP_POSITIVE_Z_OES" />
+ <field name="GL_TEXTURE_EXTERNAL_OES" since="15" />
+ <field name="GL_TEXTURE_GEN_MODE_OES" />
+ <field name="GL_TEXTURE_GEN_STR_OES" />
+ <field name="GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES" />
+ <field name="GL_TEXTURE_MAX_ANISOTROPY_EXT" />
+ <field name="GL_UNSIGNED_INT_24_8_OES" />
+ <field name="GL_WEIGHT_ARRAY_BUFFER_BINDING_OES" />
+ <field name="GL_WEIGHT_ARRAY_OES" />
+ <field name="GL_WEIGHT_ARRAY_POINTER_OES" />
+ <field name="GL_WEIGHT_ARRAY_SIZE_OES" />
+ <field name="GL_WEIGHT_ARRAY_STRIDE_OES" />
+ <field name="GL_WEIGHT_ARRAY_TYPE_OES" />
+ <field name="GL_WRITE_ONLY_OES" />
+ </class>
+ <class name="android/opengl/GLES20" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="glActiveTexture(I)V" />
+ <method name="glAttachShader(II)V" />
+ <method name="glBindAttribLocation(IILjava/lang/String;)V" />
+ <method name="glBindBuffer(II)V" />
+ <method name="glBindFramebuffer(II)V" />
+ <method name="glBindRenderbuffer(II)V" />
+ <method name="glBindTexture(II)V" />
+ <method name="glBlendColor(FFFF)V" />
+ <method name="glBlendEquation(I)V" />
+ <method name="glBlendEquationSeparate(II)V" />
+ <method name="glBlendFunc(II)V" />
+ <method name="glBlendFuncSeparate(IIII)V" />
+ <method name="glBufferData(IILjava/nio/Buffer;I)V" />
+ <method name="glBufferSubData(IIILjava/nio/Buffer;)V" />
+ <method name="glCheckFramebufferStatus(I)I" />
+ <method name="glClear(I)V" />
+ <method name="glClearColor(FFFF)V" />
+ <method name="glClearDepthf(F)V" />
+ <method name="glClearStencil(I)V" />
+ <method name="glColorMask(ZZZZ)V" />
+ <method name="glCompileShader(I)V" />
+ <method name="glCompressedTexImage2D(IIIIIIILjava/nio/Buffer;)V" />
+ <method name="glCompressedTexSubImage2D(IIIIIIIILjava/nio/Buffer;)V" />
+ <method name="glCopyTexImage2D(IIIIIIII)V" />
+ <method name="glCopyTexSubImage2D(IIIIIIII)V" />
+ <method name="glCreateProgram()I" />
+ <method name="glCreateShader(I)I" />
+ <method name="glCullFace(I)V" />
+ <method name="glDeleteBuffers(ILjava/nio/IntBuffer;)V" />
+ <method name="glDeleteBuffers(I[II)V" />
+ <method name="glDeleteFramebuffers(ILjava/nio/IntBuffer;)V" />
+ <method name="glDeleteFramebuffers(I[II)V" />
+ <method name="glDeleteProgram(I)V" />
+ <method name="glDeleteRenderbuffers(ILjava/nio/IntBuffer;)V" />
+ <method name="glDeleteRenderbuffers(I[II)V" />
+ <method name="glDeleteShader(I)V" />
+ <method name="glDeleteTextures(ILjava/nio/IntBuffer;)V" />
+ <method name="glDeleteTextures(I[II)V" />
+ <method name="glDepthFunc(I)V" />
+ <method name="glDepthMask(Z)V" />
+ <method name="glDepthRangef(FF)V" />
+ <method name="glDetachShader(II)V" />
+ <method name="glDisable(I)V" />
+ <method name="glDisableVertexAttribArray(I)V" />
+ <method name="glDrawArrays(III)V" />
+ <method name="glDrawElements(IIII)V" since="9" />
+ <method name="glDrawElements(IIILjava/nio/Buffer;)V" />
+ <method name="glEnable(I)V" />
+ <method name="glEnableVertexAttribArray(I)V" />
+ <method name="glFinish()V" />
+ <method name="glFlush()V" />
+ <method name="glFramebufferRenderbuffer(IIII)V" />
+ <method name="glFramebufferTexture2D(IIIII)V" />
+ <method name="glFrontFace(I)V" />
+ <method name="glGenBuffers(ILjava/nio/IntBuffer;)V" />
+ <method name="glGenBuffers(I[II)V" />
+ <method name="glGenFramebuffers(ILjava/nio/IntBuffer;)V" />
+ <method name="glGenFramebuffers(I[II)V" />
+ <method name="glGenRenderbuffers(ILjava/nio/IntBuffer;)V" />
+ <method name="glGenRenderbuffers(I[II)V" />
+ <method name="glGenTextures(ILjava/nio/IntBuffer;)V" />
+ <method name="glGenTextures(I[II)V" />
+ <method name="glGenerateMipmap(I)V" />
+ <method name="glGetActiveAttrib(IIILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;B)V" />
+ <method name="glGetActiveAttrib(III[II[II[II[BI)V" />
+ <method name="glGetActiveAttrib(IILjava/nio/IntBuffer;Ljava/nio/IntBuffer;)Ljava/lang/String;" since="17" />
+ <method name="glGetActiveAttrib(II[II[II)Ljava/lang/String;" since="17" />
+ <method name="glGetActiveUniform(IIILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;B)V" />
+ <method name="glGetActiveUniform(III[II[II[II[BI)V" />
+ <method name="glGetActiveUniform(IILjava/nio/IntBuffer;Ljava/nio/IntBuffer;)Ljava/lang/String;" since="17" />
+ <method name="glGetActiveUniform(II[II[II)Ljava/lang/String;" since="17" />
+ <method name="glGetAttachedShaders(IILjava/nio/IntBuffer;Ljava/nio/IntBuffer;)V" />
+ <method name="glGetAttachedShaders(II[II[II)V" />
+ <method name="glGetAttribLocation(ILjava/lang/String;)I" />
+ <method name="glGetBooleanv(ILjava/nio/IntBuffer;)V" />
+ <method name="glGetBooleanv(I[ZI)V" />
+ <method name="glGetBufferParameteriv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetBufferParameteriv(II[II)V" />
+ <method name="glGetError()I" />
+ <method name="glGetFloatv(ILjava/nio/FloatBuffer;)V" />
+ <method name="glGetFloatv(I[FI)V" />
+ <method name="glGetFramebufferAttachmentParameteriv(IIILjava/nio/IntBuffer;)V" />
+ <method name="glGetFramebufferAttachmentParameteriv(III[II)V" />
+ <method name="glGetIntegerv(ILjava/nio/IntBuffer;)V" />
+ <method name="glGetIntegerv(I[II)V" />
+ <method name="glGetProgramInfoLog(I)Ljava/lang/String;" />
+ <method name="glGetProgramiv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetProgramiv(II[II)V" />
+ <method name="glGetRenderbufferParameteriv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetRenderbufferParameteriv(II[II)V" />
+ <method name="glGetShaderInfoLog(I)Ljava/lang/String;" />
+ <method name="glGetShaderPrecisionFormat(IILjava/nio/IntBuffer;Ljava/nio/IntBuffer;)V" />
+ <method name="glGetShaderPrecisionFormat(II[II[II)V" />
+ <method name="glGetShaderSource(I)Ljava/lang/String;" since="17" />
+ <method name="glGetShaderSource(IILjava/nio/IntBuffer;B)V" />
+ <method name="glGetShaderSource(II[II[BI)V" />
+ <method name="glGetShaderiv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetShaderiv(II[II)V" />
+ <method name="glGetString(I)Ljava/lang/String;" />
+ <method name="glGetTexParameterfv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glGetTexParameterfv(II[FI)V" />
+ <method name="glGetTexParameteriv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetTexParameteriv(II[II)V" />
+ <method name="glGetUniformLocation(ILjava/lang/String;)I" />
+ <method name="glGetUniformfv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glGetUniformfv(II[FI)V" />
+ <method name="glGetUniformiv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetUniformiv(II[II)V" />
+ <method name="glGetVertexAttribfv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glGetVertexAttribfv(II[FI)V" />
+ <method name="glGetVertexAttribiv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetVertexAttribiv(II[II)V" />
+ <method name="glHint(II)V" />
+ <method name="glIsBuffer(I)Z" />
+ <method name="glIsEnabled(I)Z" />
+ <method name="glIsFramebuffer(I)Z" />
+ <method name="glIsProgram(I)Z" />
+ <method name="glIsRenderbuffer(I)Z" />
+ <method name="glIsShader(I)Z" />
+ <method name="glIsTexture(I)Z" />
+ <method name="glLineWidth(F)V" />
+ <method name="glLinkProgram(I)V" />
+ <method name="glPixelStorei(II)V" />
+ <method name="glPolygonOffset(FF)V" />
+ <method name="glReadPixels(IIIIIILjava/nio/Buffer;)V" />
+ <method name="glReleaseShaderCompiler()V" />
+ <method name="glRenderbufferStorage(IIII)V" />
+ <method name="glSampleCoverage(FZ)V" />
+ <method name="glScissor(IIII)V" />
+ <method name="glShaderBinary(ILjava/nio/IntBuffer;ILjava/nio/Buffer;I)V" />
+ <method name="glShaderBinary(I[IIILjava/nio/Buffer;I)V" />
+ <method name="glShaderSource(ILjava/lang/String;)V" />
+ <method name="glStencilFunc(III)V" />
+ <method name="glStencilFuncSeparate(IIII)V" />
+ <method name="glStencilMask(I)V" />
+ <method name="glStencilMaskSeparate(II)V" />
+ <method name="glStencilOp(III)V" />
+ <method name="glStencilOpSeparate(IIII)V" />
+ <method name="glTexImage2D(IIIIIIIILjava/nio/Buffer;)V" />
+ <method name="glTexParameterf(IIF)V" />
+ <method name="glTexParameterfv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glTexParameterfv(II[FI)V" />
+ <method name="glTexParameteri(III)V" />
+ <method name="glTexParameteriv(IILjava/nio/IntBuffer;)V" />
+ <method name="glTexParameteriv(II[II)V" />
+ <method name="glTexSubImage2D(IIIIIIIILjava/nio/Buffer;)V" />
+ <method name="glUniform1f(IF)V" />
+ <method name="glUniform1fv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glUniform1fv(II[FI)V" />
+ <method name="glUniform1i(II)V" />
+ <method name="glUniform1iv(IILjava/nio/IntBuffer;)V" />
+ <method name="glUniform1iv(II[II)V" />
+ <method name="glUniform2f(IFF)V" />
+ <method name="glUniform2fv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glUniform2fv(II[FI)V" />
+ <method name="glUniform2i(III)V" />
+ <method name="glUniform2iv(IILjava/nio/IntBuffer;)V" />
+ <method name="glUniform2iv(II[II)V" />
+ <method name="glUniform3f(IFFF)V" />
+ <method name="glUniform3fv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glUniform3fv(II[FI)V" />
+ <method name="glUniform3i(IIII)V" />
+ <method name="glUniform3iv(IILjava/nio/IntBuffer;)V" />
+ <method name="glUniform3iv(II[II)V" />
+ <method name="glUniform4f(IFFFF)V" />
+ <method name="glUniform4fv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glUniform4fv(II[FI)V" />
+ <method name="glUniform4i(IIIII)V" />
+ <method name="glUniform4iv(IILjava/nio/IntBuffer;)V" />
+ <method name="glUniform4iv(II[II)V" />
+ <method name="glUniformMatrix2fv(IIZLjava/nio/FloatBuffer;)V" />
+ <method name="glUniformMatrix2fv(IIZ[FI)V" />
+ <method name="glUniformMatrix3fv(IIZLjava/nio/FloatBuffer;)V" />
+ <method name="glUniformMatrix3fv(IIZ[FI)V" />
+ <method name="glUniformMatrix4fv(IIZLjava/nio/FloatBuffer;)V" />
+ <method name="glUniformMatrix4fv(IIZ[FI)V" />
+ <method name="glUseProgram(I)V" />
+ <method name="glValidateProgram(I)V" />
+ <method name="glVertexAttrib1f(IF)V" />
+ <method name="glVertexAttrib1fv(ILjava/nio/FloatBuffer;)V" />
+ <method name="glVertexAttrib1fv(I[FI)V" />
+ <method name="glVertexAttrib2f(IFF)V" />
+ <method name="glVertexAttrib2fv(ILjava/nio/FloatBuffer;)V" />
+ <method name="glVertexAttrib2fv(I[FI)V" />
+ <method name="glVertexAttrib3f(IFFF)V" />
+ <method name="glVertexAttrib3fv(ILjava/nio/FloatBuffer;)V" />
+ <method name="glVertexAttrib3fv(I[FI)V" />
+ <method name="glVertexAttrib4f(IFFFF)V" />
+ <method name="glVertexAttrib4fv(ILjava/nio/FloatBuffer;)V" />
+ <method name="glVertexAttrib4fv(I[FI)V" />
+ <method name="glVertexAttribPointer(IIIZII)V" since="9" />
+ <method name="glVertexAttribPointer(IIIZILjava/nio/Buffer;)V" />
+ <method name="glViewport(IIII)V" />
+ <field name="GL_ACTIVE_ATTRIBUTES" />
+ <field name="GL_ACTIVE_ATTRIBUTE_MAX_LENGTH" />
+ <field name="GL_ACTIVE_TEXTURE" />
+ <field name="GL_ACTIVE_UNIFORMS" />
+ <field name="GL_ACTIVE_UNIFORM_MAX_LENGTH" />
+ <field name="GL_ALIASED_LINE_WIDTH_RANGE" />
+ <field name="GL_ALIASED_POINT_SIZE_RANGE" />
+ <field name="GL_ALPHA" />
+ <field name="GL_ALPHA_BITS" />
+ <field name="GL_ALWAYS" />
+ <field name="GL_ARRAY_BUFFER" />
+ <field name="GL_ARRAY_BUFFER_BINDING" />
+ <field name="GL_ATTACHED_SHADERS" />
+ <field name="GL_BACK" />
+ <field name="GL_BLEND" />
+ <field name="GL_BLEND_COLOR" />
+ <field name="GL_BLEND_DST_ALPHA" />
+ <field name="GL_BLEND_DST_RGB" />
+ <field name="GL_BLEND_EQUATION" />
+ <field name="GL_BLEND_EQUATION_ALPHA" />
+ <field name="GL_BLEND_EQUATION_RGB" />
+ <field name="GL_BLEND_SRC_ALPHA" />
+ <field name="GL_BLEND_SRC_RGB" />
+ <field name="GL_BLUE_BITS" />
+ <field name="GL_BOOL" />
+ <field name="GL_BOOL_VEC2" />
+ <field name="GL_BOOL_VEC3" />
+ <field name="GL_BOOL_VEC4" />
+ <field name="GL_BUFFER_SIZE" />
+ <field name="GL_BUFFER_USAGE" />
+ <field name="GL_BYTE" />
+ <field name="GL_CCW" />
+ <field name="GL_CLAMP_TO_EDGE" />
+ <field name="GL_COLOR_ATTACHMENT0" />
+ <field name="GL_COLOR_BUFFER_BIT" />
+ <field name="GL_COLOR_CLEAR_VALUE" />
+ <field name="GL_COLOR_WRITEMASK" />
+ <field name="GL_COMPILE_STATUS" />
+ <field name="GL_COMPRESSED_TEXTURE_FORMATS" />
+ <field name="GL_CONSTANT_ALPHA" />
+ <field name="GL_CONSTANT_COLOR" />
+ <field name="GL_CULL_FACE" />
+ <field name="GL_CULL_FACE_MODE" />
+ <field name="GL_CURRENT_PROGRAM" />
+ <field name="GL_CURRENT_VERTEX_ATTRIB" />
+ <field name="GL_CW" />
+ <field name="GL_DECR" />
+ <field name="GL_DECR_WRAP" />
+ <field name="GL_DELETE_STATUS" />
+ <field name="GL_DEPTH_ATTACHMENT" />
+ <field name="GL_DEPTH_BITS" />
+ <field name="GL_DEPTH_BUFFER_BIT" />
+ <field name="GL_DEPTH_CLEAR_VALUE" />
+ <field name="GL_DEPTH_COMPONENT" />
+ <field name="GL_DEPTH_COMPONENT16" />
+ <field name="GL_DEPTH_FUNC" />
+ <field name="GL_DEPTH_RANGE" />
+ <field name="GL_DEPTH_TEST" />
+ <field name="GL_DEPTH_WRITEMASK" />
+ <field name="GL_DITHER" />
+ <field name="GL_DONT_CARE" />
+ <field name="GL_DST_ALPHA" />
+ <field name="GL_DST_COLOR" />
+ <field name="GL_DYNAMIC_DRAW" />
+ <field name="GL_ELEMENT_ARRAY_BUFFER" />
+ <field name="GL_ELEMENT_ARRAY_BUFFER_BINDING" />
+ <field name="GL_EQUAL" />
+ <field name="GL_EXTENSIONS" />
+ <field name="GL_FALSE" />
+ <field name="GL_FASTEST" />
+ <field name="GL_FIXED" />
+ <field name="GL_FLOAT" />
+ <field name="GL_FLOAT_MAT2" />
+ <field name="GL_FLOAT_MAT3" />
+ <field name="GL_FLOAT_MAT4" />
+ <field name="GL_FLOAT_VEC2" />
+ <field name="GL_FLOAT_VEC3" />
+ <field name="GL_FLOAT_VEC4" />
+ <field name="GL_FRAGMENT_SHADER" />
+ <field name="GL_FRAMEBUFFER" />
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME" />
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE" />
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE" />
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL" />
+ <field name="GL_FRAMEBUFFER_BINDING" />
+ <field name="GL_FRAMEBUFFER_COMPLETE" />
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT" />
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS" />
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT" />
+ <field name="GL_FRAMEBUFFER_UNSUPPORTED" />
+ <field name="GL_FRONT" />
+ <field name="GL_FRONT_AND_BACK" />
+ <field name="GL_FRONT_FACE" />
+ <field name="GL_FUNC_ADD" />
+ <field name="GL_FUNC_REVERSE_SUBTRACT" />
+ <field name="GL_FUNC_SUBTRACT" />
+ <field name="GL_GENERATE_MIPMAP_HINT" />
+ <field name="GL_GEQUAL" />
+ <field name="GL_GREATER" />
+ <field name="GL_GREEN_BITS" />
+ <field name="GL_HIGH_FLOAT" />
+ <field name="GL_HIGH_INT" />
+ <field name="GL_IMPLEMENTATION_COLOR_READ_FORMAT" />
+ <field name="GL_IMPLEMENTATION_COLOR_READ_TYPE" />
+ <field name="GL_INCR" />
+ <field name="GL_INCR_WRAP" />
+ <field name="GL_INFO_LOG_LENGTH" />
+ <field name="GL_INT" />
+ <field name="GL_INT_VEC2" />
+ <field name="GL_INT_VEC3" />
+ <field name="GL_INT_VEC4" />
+ <field name="GL_INVALID_ENUM" />
+ <field name="GL_INVALID_FRAMEBUFFER_OPERATION" />
+ <field name="GL_INVALID_OPERATION" />
+ <field name="GL_INVALID_VALUE" />
+ <field name="GL_INVERT" />
+ <field name="GL_KEEP" />
+ <field name="GL_LEQUAL" />
+ <field name="GL_LESS" />
+ <field name="GL_LINEAR" />
+ <field name="GL_LINEAR_MIPMAP_LINEAR" />
+ <field name="GL_LINEAR_MIPMAP_NEAREST" />
+ <field name="GL_LINES" />
+ <field name="GL_LINE_LOOP" />
+ <field name="GL_LINE_STRIP" />
+ <field name="GL_LINE_WIDTH" />
+ <field name="GL_LINK_STATUS" />
+ <field name="GL_LOW_FLOAT" />
+ <field name="GL_LOW_INT" />
+ <field name="GL_LUMINANCE" />
+ <field name="GL_LUMINANCE_ALPHA" />
+ <field name="GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS" />
+ <field name="GL_MAX_CUBE_MAP_TEXTURE_SIZE" />
+ <field name="GL_MAX_FRAGMENT_UNIFORM_VECTORS" />
+ <field name="GL_MAX_RENDERBUFFER_SIZE" />
+ <field name="GL_MAX_TEXTURE_IMAGE_UNITS" />
+ <field name="GL_MAX_TEXTURE_SIZE" />
+ <field name="GL_MAX_VARYING_VECTORS" />
+ <field name="GL_MAX_VERTEX_ATTRIBS" />
+ <field name="GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS" />
+ <field name="GL_MAX_VERTEX_UNIFORM_VECTORS" />
+ <field name="GL_MAX_VIEWPORT_DIMS" />
+ <field name="GL_MEDIUM_FLOAT" />
+ <field name="GL_MEDIUM_INT" />
+ <field name="GL_MIRRORED_REPEAT" />
+ <field name="GL_NEAREST" />
+ <field name="GL_NEAREST_MIPMAP_LINEAR" />
+ <field name="GL_NEAREST_MIPMAP_NEAREST" />
+ <field name="GL_NEVER" />
+ <field name="GL_NICEST" />
+ <field name="GL_NONE" />
+ <field name="GL_NOTEQUAL" />
+ <field name="GL_NO_ERROR" />
+ <field name="GL_NUM_COMPRESSED_TEXTURE_FORMATS" />
+ <field name="GL_NUM_SHADER_BINARY_FORMATS" />
+ <field name="GL_ONE" />
+ <field name="GL_ONE_MINUS_CONSTANT_ALPHA" />
+ <field name="GL_ONE_MINUS_CONSTANT_COLOR" />
+ <field name="GL_ONE_MINUS_DST_ALPHA" />
+ <field name="GL_ONE_MINUS_DST_COLOR" />
+ <field name="GL_ONE_MINUS_SRC_ALPHA" />
+ <field name="GL_ONE_MINUS_SRC_COLOR" />
+ <field name="GL_OUT_OF_MEMORY" />
+ <field name="GL_PACK_ALIGNMENT" />
+ <field name="GL_POINTS" />
+ <field name="GL_POLYGON_OFFSET_FACTOR" />
+ <field name="GL_POLYGON_OFFSET_FILL" />
+ <field name="GL_POLYGON_OFFSET_UNITS" />
+ <field name="GL_RED_BITS" />
+ <field name="GL_RENDERBUFFER" />
+ <field name="GL_RENDERBUFFER_ALPHA_SIZE" />
+ <field name="GL_RENDERBUFFER_BINDING" />
+ <field name="GL_RENDERBUFFER_BLUE_SIZE" />
+ <field name="GL_RENDERBUFFER_DEPTH_SIZE" />
+ <field name="GL_RENDERBUFFER_GREEN_SIZE" />
+ <field name="GL_RENDERBUFFER_HEIGHT" />
+ <field name="GL_RENDERBUFFER_INTERNAL_FORMAT" />
+ <field name="GL_RENDERBUFFER_RED_SIZE" />
+ <field name="GL_RENDERBUFFER_STENCIL_SIZE" />
+ <field name="GL_RENDERBUFFER_WIDTH" />
+ <field name="GL_RENDERER" />
+ <field name="GL_REPEAT" />
+ <field name="GL_REPLACE" />
+ <field name="GL_RGB" />
+ <field name="GL_RGB565" />
+ <field name="GL_RGB5_A1" />
+ <field name="GL_RGBA" />
+ <field name="GL_RGBA4" />
+ <field name="GL_SAMPLER_2D" />
+ <field name="GL_SAMPLER_CUBE" />
+ <field name="GL_SAMPLES" />
+ <field name="GL_SAMPLE_ALPHA_TO_COVERAGE" />
+ <field name="GL_SAMPLE_BUFFERS" />
+ <field name="GL_SAMPLE_COVERAGE" />
+ <field name="GL_SAMPLE_COVERAGE_INVERT" />
+ <field name="GL_SAMPLE_COVERAGE_VALUE" />
+ <field name="GL_SCISSOR_BOX" />
+ <field name="GL_SCISSOR_TEST" />
+ <field name="GL_SHADER_BINARY_FORMATS" />
+ <field name="GL_SHADER_COMPILER" />
+ <field name="GL_SHADER_SOURCE_LENGTH" />
+ <field name="GL_SHADER_TYPE" />
+ <field name="GL_SHADING_LANGUAGE_VERSION" />
+ <field name="GL_SHORT" />
+ <field name="GL_SRC_ALPHA" />
+ <field name="GL_SRC_ALPHA_SATURATE" />
+ <field name="GL_SRC_COLOR" />
+ <field name="GL_STATIC_DRAW" />
+ <field name="GL_STENCIL_ATTACHMENT" />
+ <field name="GL_STENCIL_BACK_FAIL" />
+ <field name="GL_STENCIL_BACK_FUNC" />
+ <field name="GL_STENCIL_BACK_PASS_DEPTH_FAIL" />
+ <field name="GL_STENCIL_BACK_PASS_DEPTH_PASS" />
+ <field name="GL_STENCIL_BACK_REF" />
+ <field name="GL_STENCIL_BACK_VALUE_MASK" />
+ <field name="GL_STENCIL_BACK_WRITEMASK" />
+ <field name="GL_STENCIL_BITS" />
+ <field name="GL_STENCIL_BUFFER_BIT" />
+ <field name="GL_STENCIL_CLEAR_VALUE" />
+ <field name="GL_STENCIL_FAIL" />
+ <field name="GL_STENCIL_FUNC" />
+ <field name="GL_STENCIL_INDEX" />
+ <field name="GL_STENCIL_INDEX8" />
+ <field name="GL_STENCIL_PASS_DEPTH_FAIL" />
+ <field name="GL_STENCIL_PASS_DEPTH_PASS" />
+ <field name="GL_STENCIL_REF" />
+ <field name="GL_STENCIL_TEST" />
+ <field name="GL_STENCIL_VALUE_MASK" />
+ <field name="GL_STENCIL_WRITEMASK" />
+ <field name="GL_STREAM_DRAW" />
+ <field name="GL_SUBPIXEL_BITS" />
+ <field name="GL_TEXTURE" />
+ <field name="GL_TEXTURE0" />
+ <field name="GL_TEXTURE1" />
+ <field name="GL_TEXTURE10" />
+ <field name="GL_TEXTURE11" />
+ <field name="GL_TEXTURE12" />
+ <field name="GL_TEXTURE13" />
+ <field name="GL_TEXTURE14" />
+ <field name="GL_TEXTURE15" />
+ <field name="GL_TEXTURE16" />
+ <field name="GL_TEXTURE17" />
+ <field name="GL_TEXTURE18" />
+ <field name="GL_TEXTURE19" />
+ <field name="GL_TEXTURE2" />
+ <field name="GL_TEXTURE20" />
+ <field name="GL_TEXTURE21" />
+ <field name="GL_TEXTURE22" />
+ <field name="GL_TEXTURE23" />
+ <field name="GL_TEXTURE24" />
+ <field name="GL_TEXTURE25" />
+ <field name="GL_TEXTURE26" />
+ <field name="GL_TEXTURE27" />
+ <field name="GL_TEXTURE28" />
+ <field name="GL_TEXTURE29" />
+ <field name="GL_TEXTURE3" />
+ <field name="GL_TEXTURE30" />
+ <field name="GL_TEXTURE31" />
+ <field name="GL_TEXTURE4" />
+ <field name="GL_TEXTURE5" />
+ <field name="GL_TEXTURE6" />
+ <field name="GL_TEXTURE7" />
+ <field name="GL_TEXTURE8" />
+ <field name="GL_TEXTURE9" />
+ <field name="GL_TEXTURE_2D" />
+ <field name="GL_TEXTURE_BINDING_2D" />
+ <field name="GL_TEXTURE_BINDING_CUBE_MAP" />
+ <field name="GL_TEXTURE_CUBE_MAP" />
+ <field name="GL_TEXTURE_CUBE_MAP_NEGATIVE_X" />
+ <field name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Y" />
+ <field name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Z" />
+ <field name="GL_TEXTURE_CUBE_MAP_POSITIVE_X" />
+ <field name="GL_TEXTURE_CUBE_MAP_POSITIVE_Y" />
+ <field name="GL_TEXTURE_CUBE_MAP_POSITIVE_Z" />
+ <field name="GL_TEXTURE_MAG_FILTER" />
+ <field name="GL_TEXTURE_MIN_FILTER" />
+ <field name="GL_TEXTURE_WRAP_S" />
+ <field name="GL_TEXTURE_WRAP_T" />
+ <field name="GL_TRIANGLES" />
+ <field name="GL_TRIANGLE_FAN" />
+ <field name="GL_TRIANGLE_STRIP" />
+ <field name="GL_TRUE" />
+ <field name="GL_UNPACK_ALIGNMENT" />
+ <field name="GL_UNSIGNED_BYTE" />
+ <field name="GL_UNSIGNED_INT" />
+ <field name="GL_UNSIGNED_SHORT" />
+ <field name="GL_UNSIGNED_SHORT_4_4_4_4" />
+ <field name="GL_UNSIGNED_SHORT_5_5_5_1" />
+ <field name="GL_UNSIGNED_SHORT_5_6_5" />
+ <field name="GL_VALIDATE_STATUS" />
+ <field name="GL_VENDOR" />
+ <field name="GL_VERSION" />
+ <field name="GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING" />
+ <field name="GL_VERTEX_ATTRIB_ARRAY_ENABLED" />
+ <field name="GL_VERTEX_ATTRIB_ARRAY_NORMALIZED" />
+ <field name="GL_VERTEX_ATTRIB_ARRAY_POINTER" />
+ <field name="GL_VERTEX_ATTRIB_ARRAY_SIZE" />
+ <field name="GL_VERTEX_ATTRIB_ARRAY_STRIDE" />
+ <field name="GL_VERTEX_ATTRIB_ARRAY_TYPE" />
+ <field name="GL_VERTEX_SHADER" />
+ <field name="GL_VIEWPORT" />
+ <field name="GL_ZERO" />
+ </class>
+ <class name="android/opengl/GLES30" since="18">
+ <extends name="android/opengl/GLES20" />
+ <method name="&lt;init>()V" />
+ <method name="glBeginQuery(II)V" />
+ <method name="glBeginTransformFeedback(I)V" />
+ <method name="glBindBufferBase(III)V" />
+ <method name="glBindBufferRange(IIIII)V" />
+ <method name="glBindSampler(II)V" />
+ <method name="glBindTransformFeedback(II)V" />
+ <method name="glBindVertexArray(I)V" />
+ <method name="glBlitFramebuffer(IIIIIIIIII)V" />
+ <method name="glClearBufferfi(IIFI)V" />
+ <method name="glClearBufferfv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glClearBufferfv(II[FI)V" />
+ <method name="glClearBufferiv(IILjava/nio/IntBuffer;)V" />
+ <method name="glClearBufferiv(II[II)V" />
+ <method name="glClearBufferuiv(IILjava/nio/IntBuffer;)V" />
+ <method name="glClearBufferuiv(II[II)V" />
+ <method name="glClientWaitSync(JIJ)I" />
+ <method name="glCompressedTexImage3D(IIIIIIIII)V" />
+ <method name="glCompressedTexImage3D(IIIIIIIILjava/nio/Buffer;)V" />
+ <method name="glCompressedTexSubImage3D(IIIIIIIIIII)V" />
+ <method name="glCompressedTexSubImage3D(IIIIIIIIIILjava/nio/Buffer;)V" />
+ <method name="glCopyBufferSubData(IIIII)V" />
+ <method name="glCopyTexSubImage3D(IIIIIIIII)V" />
+ <method name="glDeleteQueries(ILjava/nio/IntBuffer;)V" />
+ <method name="glDeleteQueries(I[II)V" />
+ <method name="glDeleteSamplers(ILjava/nio/IntBuffer;)V" />
+ <method name="glDeleteSamplers(I[II)V" />
+ <method name="glDeleteSync(J)V" />
+ <method name="glDeleteTransformFeedbacks(ILjava/nio/IntBuffer;)V" />
+ <method name="glDeleteTransformFeedbacks(I[II)V" />
+ <method name="glDeleteVertexArrays(ILjava/nio/IntBuffer;)V" />
+ <method name="glDeleteVertexArrays(I[II)V" />
+ <method name="glDrawArraysInstanced(IIII)V" />
+ <method name="glDrawBuffers(ILjava/nio/IntBuffer;)V" />
+ <method name="glDrawBuffers(I[II)V" />
+ <method name="glDrawElementsInstanced(IIIII)V" />
+ <method name="glDrawElementsInstanced(IIILjava/nio/Buffer;I)V" />
+ <method name="glDrawRangeElements(IIIIII)V" />
+ <method name="glDrawRangeElements(IIIIILjava/nio/Buffer;)V" />
+ <method name="glEndQuery(I)V" />
+ <method name="glEndTransformFeedback()V" />
+ <method name="glFenceSync(II)J" />
+ <method name="glFlushMappedBufferRange(III)V" />
+ <method name="glFramebufferTextureLayer(IIIII)V" />
+ <method name="glGenQueries(ILjava/nio/IntBuffer;)V" />
+ <method name="glGenQueries(I[II)V" />
+ <method name="glGenSamplers(ILjava/nio/IntBuffer;)V" />
+ <method name="glGenSamplers(I[II)V" />
+ <method name="glGenTransformFeedbacks(ILjava/nio/IntBuffer;)V" />
+ <method name="glGenTransformFeedbacks(I[II)V" />
+ <method name="glGenVertexArrays(ILjava/nio/IntBuffer;)V" />
+ <method name="glGenVertexArrays(I[II)V" />
+ <method name="glGetActiveUniformBlockName(II)Ljava/lang/String;" />
+ <method name="glGetActiveUniformBlockName(III[II[BI)V" />
+ <method name="glGetActiveUniformBlockName(IILjava/nio/Buffer;Ljava/nio/Buffer;)V" />
+ <method name="glGetActiveUniformBlockiv(IIILjava/nio/IntBuffer;)V" />
+ <method name="glGetActiveUniformBlockiv(III[II)V" />
+ <method name="glGetActiveUniformsiv(IILjava/nio/IntBuffer;ILjava/nio/IntBuffer;)V" />
+ <method name="glGetActiveUniformsiv(II[III[II)V" />
+ <method name="glGetBufferParameteri64v(IILjava/nio/LongBuffer;)V" />
+ <method name="glGetBufferParameteri64v(II[JI)V" />
+ <method name="glGetBufferPointerv(II)Ljava/nio/Buffer;" />
+ <method name="glGetFragDataLocation(ILjava/lang/String;)I" />
+ <method name="glGetInteger64i_v(IILjava/nio/LongBuffer;)V" />
+ <method name="glGetInteger64i_v(II[JI)V" />
+ <method name="glGetInteger64v(ILjava/nio/LongBuffer;)V" />
+ <method name="glGetInteger64v(I[JI)V" />
+ <method name="glGetIntegeri_v(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetIntegeri_v(II[II)V" />
+ <method name="glGetInternalformativ(IIIILjava/nio/IntBuffer;)V" />
+ <method name="glGetInternalformativ(IIII[II)V" />
+ <method name="glGetProgramBinary(IILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/Buffer;)V" />
+ <method name="glGetProgramBinary(II[II[IILjava/nio/Buffer;)V" />
+ <method name="glGetQueryObjectuiv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetQueryObjectuiv(II[II)V" />
+ <method name="glGetQueryiv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetQueryiv(II[II)V" />
+ <method name="glGetSamplerParameterfv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glGetSamplerParameterfv(II[FI)V" />
+ <method name="glGetSamplerParameteriv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetSamplerParameteriv(II[II)V" />
+ <method name="glGetStringi(II)Ljava/lang/String;" />
+ <method name="glGetSynciv(JIILjava/nio/IntBuffer;Ljava/nio/IntBuffer;)V" />
+ <method name="glGetSynciv(JII[II[II)V" />
+ <method name="glGetTransformFeedbackVarying(IIILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;B)V" />
+ <method name="glGetTransformFeedbackVarying(III[II[II[II[BI)V" />
+ <method name="glGetTransformFeedbackVarying(IILjava/nio/IntBuffer;Ljava/nio/IntBuffer;)Ljava/lang/String;" />
+ <method name="glGetTransformFeedbackVarying(II[II[II)Ljava/lang/String;" />
+ <method name="glGetUniformBlockIndex(ILjava/lang/String;)I" />
+ <method name="glGetUniformIndices(I[Ljava/lang/String;Ljava/nio/IntBuffer;)V" />
+ <method name="glGetUniformIndices(I[Ljava/lang/String;[II)V" />
+ <method name="glGetUniformuiv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetUniformuiv(II[II)V" />
+ <method name="glGetVertexAttribIiv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetVertexAttribIiv(II[II)V" />
+ <method name="glGetVertexAttribIuiv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetVertexAttribIuiv(II[II)V" />
+ <method name="glInvalidateFramebuffer(IILjava/nio/IntBuffer;)V" />
+ <method name="glInvalidateFramebuffer(II[II)V" />
+ <method name="glInvalidateSubFramebuffer(IILjava/nio/IntBuffer;IIII)V" />
+ <method name="glInvalidateSubFramebuffer(II[IIIIII)V" />
+ <method name="glIsQuery(I)Z" />
+ <method name="glIsSampler(I)Z" />
+ <method name="glIsSync(J)Z" />
+ <method name="glIsTransformFeedback(I)Z" />
+ <method name="glIsVertexArray(I)Z" />
+ <method name="glMapBufferRange(IIII)Ljava/nio/Buffer;" />
+ <method name="glPauseTransformFeedback()V" />
+ <method name="glProgramBinary(IILjava/nio/Buffer;I)V" />
+ <method name="glProgramParameteri(III)V" />
+ <method name="glReadBuffer(I)V" />
+ <method name="glRenderbufferStorageMultisample(IIIII)V" />
+ <method name="glResumeTransformFeedback()V" />
+ <method name="glSamplerParameterf(IIF)V" />
+ <method name="glSamplerParameterfv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glSamplerParameterfv(II[FI)V" />
+ <method name="glSamplerParameteri(III)V" />
+ <method name="glSamplerParameteriv(IILjava/nio/IntBuffer;)V" />
+ <method name="glSamplerParameteriv(II[II)V" />
+ <method name="glTexImage3D(IIIIIIIIII)V" />
+ <method name="glTexImage3D(IIIIIIIIILjava/nio/Buffer;)V" />
+ <method name="glTexStorage2D(IIIII)V" />
+ <method name="glTexStorage3D(IIIIII)V" />
+ <method name="glTexSubImage3D(IIIIIIIIIII)V" />
+ <method name="glTexSubImage3D(IIIIIIIIIILjava/nio/Buffer;)V" />
+ <method name="glTransformFeedbackVaryings(I[Ljava/lang/String;I)V" />
+ <method name="glUniform1ui(II)V" />
+ <method name="glUniform1uiv(IILjava/nio/IntBuffer;)V" />
+ <method name="glUniform1uiv(II[II)V" />
+ <method name="glUniform2ui(III)V" />
+ <method name="glUniform2uiv(IILjava/nio/IntBuffer;)V" />
+ <method name="glUniform2uiv(II[II)V" />
+ <method name="glUniform3ui(IIII)V" />
+ <method name="glUniform3uiv(IILjava/nio/IntBuffer;)V" />
+ <method name="glUniform3uiv(II[II)V" />
+ <method name="glUniform4ui(IIIII)V" />
+ <method name="glUniform4uiv(IILjava/nio/IntBuffer;)V" />
+ <method name="glUniform4uiv(II[II)V" />
+ <method name="glUniformBlockBinding(III)V" />
+ <method name="glUniformMatrix2x3fv(IIZLjava/nio/FloatBuffer;)V" />
+ <method name="glUniformMatrix2x3fv(IIZ[FI)V" />
+ <method name="glUniformMatrix2x4fv(IIZLjava/nio/FloatBuffer;)V" />
+ <method name="glUniformMatrix2x4fv(IIZ[FI)V" />
+ <method name="glUniformMatrix3x2fv(IIZLjava/nio/FloatBuffer;)V" />
+ <method name="glUniformMatrix3x2fv(IIZ[FI)V" />
+ <method name="glUniformMatrix3x4fv(IIZLjava/nio/FloatBuffer;)V" />
+ <method name="glUniformMatrix3x4fv(IIZ[FI)V" />
+ <method name="glUniformMatrix4x2fv(IIZLjava/nio/FloatBuffer;)V" />
+ <method name="glUniformMatrix4x2fv(IIZ[FI)V" />
+ <method name="glUniformMatrix4x3fv(IIZLjava/nio/FloatBuffer;)V" />
+ <method name="glUniformMatrix4x3fv(IIZ[FI)V" />
+ <method name="glUnmapBuffer(I)Z" />
+ <method name="glVertexAttribDivisor(II)V" />
+ <method name="glVertexAttribI4i(IIIII)V" />
+ <method name="glVertexAttribI4iv(ILjava/nio/IntBuffer;)V" />
+ <method name="glVertexAttribI4iv(I[II)V" />
+ <method name="glVertexAttribI4ui(IIIII)V" />
+ <method name="glVertexAttribI4uiv(ILjava/nio/IntBuffer;)V" />
+ <method name="glVertexAttribI4uiv(I[II)V" />
+ <method name="glVertexAttribIPointer(IIIII)V" />
+ <method name="glVertexAttribIPointer(IIIILjava/nio/Buffer;)V" />
+ <method name="glWaitSync(JIJ)V" />
+ <field name="GL_ACTIVE_UNIFORM_BLOCKS" />
+ <field name="GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH" />
+ <field name="GL_ALREADY_SIGNALED" />
+ <field name="GL_ANY_SAMPLES_PASSED" />
+ <field name="GL_ANY_SAMPLES_PASSED_CONSERVATIVE" />
+ <field name="GL_BLUE" />
+ <field name="GL_BUFFER_ACCESS_FLAGS" />
+ <field name="GL_BUFFER_MAPPED" />
+ <field name="GL_BUFFER_MAP_LENGTH" />
+ <field name="GL_BUFFER_MAP_OFFSET" />
+ <field name="GL_BUFFER_MAP_POINTER" />
+ <field name="GL_COLOR" />
+ <field name="GL_COLOR_ATTACHMENT1" />
+ <field name="GL_COLOR_ATTACHMENT10" />
+ <field name="GL_COLOR_ATTACHMENT11" />
+ <field name="GL_COLOR_ATTACHMENT12" />
+ <field name="GL_COLOR_ATTACHMENT13" />
+ <field name="GL_COLOR_ATTACHMENT14" />
+ <field name="GL_COLOR_ATTACHMENT15" />
+ <field name="GL_COLOR_ATTACHMENT2" />
+ <field name="GL_COLOR_ATTACHMENT3" />
+ <field name="GL_COLOR_ATTACHMENT4" />
+ <field name="GL_COLOR_ATTACHMENT5" />
+ <field name="GL_COLOR_ATTACHMENT6" />
+ <field name="GL_COLOR_ATTACHMENT7" />
+ <field name="GL_COLOR_ATTACHMENT8" />
+ <field name="GL_COLOR_ATTACHMENT9" />
+ <field name="GL_COMPARE_REF_TO_TEXTURE" />
+ <field name="GL_COMPRESSED_R11_EAC" />
+ <field name="GL_COMPRESSED_RG11_EAC" />
+ <field name="GL_COMPRESSED_RGB8_ETC2" />
+ <field name="GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2" />
+ <field name="GL_COMPRESSED_RGBA8_ETC2_EAC" />
+ <field name="GL_COMPRESSED_SIGNED_R11_EAC" />
+ <field name="GL_COMPRESSED_SIGNED_RG11_EAC" />
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC" />
+ <field name="GL_COMPRESSED_SRGB8_ETC2" />
+ <field name="GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2" />
+ <field name="GL_CONDITION_SATISFIED" />
+ <field name="GL_COPY_READ_BUFFER" />
+ <field name="GL_COPY_READ_BUFFER_BINDING" />
+ <field name="GL_COPY_WRITE_BUFFER" />
+ <field name="GL_COPY_WRITE_BUFFER_BINDING" />
+ <field name="GL_CURRENT_QUERY" />
+ <field name="GL_DEPTH" />
+ <field name="GL_DEPTH24_STENCIL8" />
+ <field name="GL_DEPTH32F_STENCIL8" />
+ <field name="GL_DEPTH_COMPONENT24" />
+ <field name="GL_DEPTH_COMPONENT32F" />
+ <field name="GL_DEPTH_STENCIL" />
+ <field name="GL_DEPTH_STENCIL_ATTACHMENT" />
+ <field name="GL_DRAW_BUFFER0" />
+ <field name="GL_DRAW_BUFFER1" />
+ <field name="GL_DRAW_BUFFER10" />
+ <field name="GL_DRAW_BUFFER11" />
+ <field name="GL_DRAW_BUFFER12" />
+ <field name="GL_DRAW_BUFFER13" />
+ <field name="GL_DRAW_BUFFER14" />
+ <field name="GL_DRAW_BUFFER15" />
+ <field name="GL_DRAW_BUFFER2" />
+ <field name="GL_DRAW_BUFFER3" />
+ <field name="GL_DRAW_BUFFER4" />
+ <field name="GL_DRAW_BUFFER5" />
+ <field name="GL_DRAW_BUFFER6" />
+ <field name="GL_DRAW_BUFFER7" />
+ <field name="GL_DRAW_BUFFER8" />
+ <field name="GL_DRAW_BUFFER9" />
+ <field name="GL_DRAW_FRAMEBUFFER" />
+ <field name="GL_DRAW_FRAMEBUFFER_BINDING" />
+ <field name="GL_DYNAMIC_COPY" />
+ <field name="GL_DYNAMIC_READ" />
+ <field name="GL_FLOAT_32_UNSIGNED_INT_24_8_REV" />
+ <field name="GL_FLOAT_MAT2x3" />
+ <field name="GL_FLOAT_MAT2x4" />
+ <field name="GL_FLOAT_MAT3x2" />
+ <field name="GL_FLOAT_MAT3x4" />
+ <field name="GL_FLOAT_MAT4x2" />
+ <field name="GL_FLOAT_MAT4x3" />
+ <field name="GL_FRAGMENT_SHADER_DERIVATIVE_HINT" />
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE" />
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE" />
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING" />
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE" />
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE" />
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE" />
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE" />
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE" />
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER" />
+ <field name="GL_FRAMEBUFFER_DEFAULT" />
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE" />
+ <field name="GL_FRAMEBUFFER_UNDEFINED" />
+ <field name="GL_GREEN" />
+ <field name="GL_HALF_FLOAT" />
+ <field name="GL_INTERLEAVED_ATTRIBS" />
+ <field name="GL_INT_2_10_10_10_REV" />
+ <field name="GL_INT_SAMPLER_2D" />
+ <field name="GL_INT_SAMPLER_2D_ARRAY" />
+ <field name="GL_INT_SAMPLER_3D" />
+ <field name="GL_INT_SAMPLER_CUBE" />
+ <field name="GL_INVALID_INDEX" />
+ <field name="GL_MAJOR_VERSION" />
+ <field name="GL_MAP_FLUSH_EXPLICIT_BIT" />
+ <field name="GL_MAP_INVALIDATE_BUFFER_BIT" />
+ <field name="GL_MAP_INVALIDATE_RANGE_BIT" />
+ <field name="GL_MAP_READ_BIT" />
+ <field name="GL_MAP_UNSYNCHRONIZED_BIT" />
+ <field name="GL_MAP_WRITE_BIT" />
+ <field name="GL_MAX" />
+ <field name="GL_MAX_3D_TEXTURE_SIZE" />
+ <field name="GL_MAX_ARRAY_TEXTURE_LAYERS" />
+ <field name="GL_MAX_COLOR_ATTACHMENTS" />
+ <field name="GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS" />
+ <field name="GL_MAX_COMBINED_UNIFORM_BLOCKS" />
+ <field name="GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS" />
+ <field name="GL_MAX_DRAW_BUFFERS" />
+ <field name="GL_MAX_ELEMENTS_INDICES" />
+ <field name="GL_MAX_ELEMENTS_VERTICES" />
+ <field name="GL_MAX_ELEMENT_INDEX" />
+ <field name="GL_MAX_FRAGMENT_INPUT_COMPONENTS" />
+ <field name="GL_MAX_FRAGMENT_UNIFORM_BLOCKS" />
+ <field name="GL_MAX_FRAGMENT_UNIFORM_COMPONENTS" />
+ <field name="GL_MAX_PROGRAM_TEXEL_OFFSET" />
+ <field name="GL_MAX_SAMPLES" />
+ <field name="GL_MAX_SERVER_WAIT_TIMEOUT" />
+ <field name="GL_MAX_TEXTURE_LOD_BIAS" />
+ <field name="GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS" />
+ <field name="GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS" />
+ <field name="GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS" />
+ <field name="GL_MAX_UNIFORM_BLOCK_SIZE" />
+ <field name="GL_MAX_UNIFORM_BUFFER_BINDINGS" />
+ <field name="GL_MAX_VARYING_COMPONENTS" />
+ <field name="GL_MAX_VERTEX_OUTPUT_COMPONENTS" />
+ <field name="GL_MAX_VERTEX_UNIFORM_BLOCKS" />
+ <field name="GL_MAX_VERTEX_UNIFORM_COMPONENTS" />
+ <field name="GL_MIN" />
+ <field name="GL_MINOR_VERSION" />
+ <field name="GL_MIN_PROGRAM_TEXEL_OFFSET" />
+ <field name="GL_NUM_EXTENSIONS" />
+ <field name="GL_NUM_PROGRAM_BINARY_FORMATS" />
+ <field name="GL_NUM_SAMPLE_COUNTS" />
+ <field name="GL_OBJECT_TYPE" />
+ <field name="GL_PACK_ROW_LENGTH" />
+ <field name="GL_PACK_SKIP_PIXELS" />
+ <field name="GL_PACK_SKIP_ROWS" />
+ <field name="GL_PIXEL_PACK_BUFFER" />
+ <field name="GL_PIXEL_PACK_BUFFER_BINDING" />
+ <field name="GL_PIXEL_UNPACK_BUFFER" />
+ <field name="GL_PIXEL_UNPACK_BUFFER_BINDING" />
+ <field name="GL_PRIMITIVE_RESTART_FIXED_INDEX" />
+ <field name="GL_PROGRAM_BINARY_FORMATS" />
+ <field name="GL_PROGRAM_BINARY_LENGTH" />
+ <field name="GL_PROGRAM_BINARY_RETRIEVABLE_HINT" />
+ <field name="GL_QUERY_RESULT" />
+ <field name="GL_QUERY_RESULT_AVAILABLE" />
+ <field name="GL_R11F_G11F_B10F" />
+ <field name="GL_R16F" />
+ <field name="GL_R16I" />
+ <field name="GL_R16UI" />
+ <field name="GL_R32F" />
+ <field name="GL_R32I" />
+ <field name="GL_R32UI" />
+ <field name="GL_R8" />
+ <field name="GL_R8I" />
+ <field name="GL_R8UI" />
+ <field name="GL_R8_SNORM" />
+ <field name="GL_RASTERIZER_DISCARD" />
+ <field name="GL_READ_BUFFER" />
+ <field name="GL_READ_FRAMEBUFFER" />
+ <field name="GL_READ_FRAMEBUFFER_BINDING" />
+ <field name="GL_RED" />
+ <field name="GL_RED_INTEGER" />
+ <field name="GL_RENDERBUFFER_SAMPLES" />
+ <field name="GL_RG" />
+ <field name="GL_RG16F" />
+ <field name="GL_RG16I" />
+ <field name="GL_RG16UI" />
+ <field name="GL_RG32F" />
+ <field name="GL_RG32I" />
+ <field name="GL_RG32UI" />
+ <field name="GL_RG8" />
+ <field name="GL_RG8I" />
+ <field name="GL_RG8UI" />
+ <field name="GL_RG8_SNORM" />
+ <field name="GL_RGB10_A2" />
+ <field name="GL_RGB10_A2UI" />
+ <field name="GL_RGB16F" />
+ <field name="GL_RGB16I" />
+ <field name="GL_RGB16UI" />
+ <field name="GL_RGB32F" />
+ <field name="GL_RGB32I" />
+ <field name="GL_RGB32UI" />
+ <field name="GL_RGB8" />
+ <field name="GL_RGB8I" />
+ <field name="GL_RGB8UI" />
+ <field name="GL_RGB8_SNORM" />
+ <field name="GL_RGB9_E5" />
+ <field name="GL_RGBA16F" />
+ <field name="GL_RGBA16I" />
+ <field name="GL_RGBA16UI" />
+ <field name="GL_RGBA32F" />
+ <field name="GL_RGBA32I" />
+ <field name="GL_RGBA32UI" />
+ <field name="GL_RGBA8" />
+ <field name="GL_RGBA8I" />
+ <field name="GL_RGBA8UI" />
+ <field name="GL_RGBA8_SNORM" />
+ <field name="GL_RGBA_INTEGER" />
+ <field name="GL_RGB_INTEGER" />
+ <field name="GL_RG_INTEGER" />
+ <field name="GL_SAMPLER_2D_ARRAY" />
+ <field name="GL_SAMPLER_2D_ARRAY_SHADOW" />
+ <field name="GL_SAMPLER_2D_SHADOW" />
+ <field name="GL_SAMPLER_3D" />
+ <field name="GL_SAMPLER_BINDING" />
+ <field name="GL_SAMPLER_CUBE_SHADOW" />
+ <field name="GL_SEPARATE_ATTRIBS" />
+ <field name="GL_SIGNALED" />
+ <field name="GL_SIGNED_NORMALIZED" />
+ <field name="GL_SRGB" />
+ <field name="GL_SRGB8" />
+ <field name="GL_SRGB8_ALPHA8" />
+ <field name="GL_STATIC_COPY" />
+ <field name="GL_STATIC_READ" />
+ <field name="GL_STENCIL" />
+ <field name="GL_STREAM_COPY" />
+ <field name="GL_STREAM_READ" />
+ <field name="GL_SYNC_CONDITION" />
+ <field name="GL_SYNC_FENCE" />
+ <field name="GL_SYNC_FLAGS" />
+ <field name="GL_SYNC_FLUSH_COMMANDS_BIT" />
+ <field name="GL_SYNC_GPU_COMMANDS_COMPLETE" />
+ <field name="GL_SYNC_STATUS" />
+ <field name="GL_TEXTURE_2D_ARRAY" />
+ <field name="GL_TEXTURE_3D" />
+ <field name="GL_TEXTURE_BASE_LEVEL" />
+ <field name="GL_TEXTURE_BINDING_2D_ARRAY" />
+ <field name="GL_TEXTURE_BINDING_3D" />
+ <field name="GL_TEXTURE_COMPARE_FUNC" />
+ <field name="GL_TEXTURE_COMPARE_MODE" />
+ <field name="GL_TEXTURE_IMMUTABLE_FORMAT" />
+ <field name="GL_TEXTURE_IMMUTABLE_LEVELS" />
+ <field name="GL_TEXTURE_MAX_LEVEL" />
+ <field name="GL_TEXTURE_MAX_LOD" />
+ <field name="GL_TEXTURE_MIN_LOD" />
+ <field name="GL_TEXTURE_SWIZZLE_A" />
+ <field name="GL_TEXTURE_SWIZZLE_B" />
+ <field name="GL_TEXTURE_SWIZZLE_G" />
+ <field name="GL_TEXTURE_SWIZZLE_R" />
+ <field name="GL_TEXTURE_WRAP_R" />
+ <field name="GL_TIMEOUT_EXPIRED" />
+ <field name="GL_TIMEOUT_IGNORED" />
+ <field name="GL_TRANSFORM_FEEDBACK" />
+ <field name="GL_TRANSFORM_FEEDBACK_ACTIVE" />
+ <field name="GL_TRANSFORM_FEEDBACK_BINDING" />
+ <field name="GL_TRANSFORM_FEEDBACK_BUFFER" />
+ <field name="GL_TRANSFORM_FEEDBACK_BUFFER_BINDING" />
+ <field name="GL_TRANSFORM_FEEDBACK_BUFFER_MODE" />
+ <field name="GL_TRANSFORM_FEEDBACK_BUFFER_SIZE" />
+ <field name="GL_TRANSFORM_FEEDBACK_BUFFER_START" />
+ <field name="GL_TRANSFORM_FEEDBACK_PAUSED" />
+ <field name="GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN" />
+ <field name="GL_TRANSFORM_FEEDBACK_VARYINGS" />
+ <field name="GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH" />
+ <field name="GL_UNIFORM_ARRAY_STRIDE" />
+ <field name="GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS" />
+ <field name="GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES" />
+ <field name="GL_UNIFORM_BLOCK_BINDING" />
+ <field name="GL_UNIFORM_BLOCK_DATA_SIZE" />
+ <field name="GL_UNIFORM_BLOCK_INDEX" />
+ <field name="GL_UNIFORM_BLOCK_NAME_LENGTH" />
+ <field name="GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER" />
+ <field name="GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER" />
+ <field name="GL_UNIFORM_BUFFER" />
+ <field name="GL_UNIFORM_BUFFER_BINDING" />
+ <field name="GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT" />
+ <field name="GL_UNIFORM_BUFFER_SIZE" />
+ <field name="GL_UNIFORM_BUFFER_START" />
+ <field name="GL_UNIFORM_IS_ROW_MAJOR" />
+ <field name="GL_UNIFORM_MATRIX_STRIDE" />
+ <field name="GL_UNIFORM_NAME_LENGTH" />
+ <field name="GL_UNIFORM_OFFSET" />
+ <field name="GL_UNIFORM_SIZE" />
+ <field name="GL_UNIFORM_TYPE" />
+ <field name="GL_UNPACK_IMAGE_HEIGHT" />
+ <field name="GL_UNPACK_ROW_LENGTH" />
+ <field name="GL_UNPACK_SKIP_IMAGES" />
+ <field name="GL_UNPACK_SKIP_PIXELS" />
+ <field name="GL_UNPACK_SKIP_ROWS" />
+ <field name="GL_UNSIGNALED" />
+ <field name="GL_UNSIGNED_INT_10F_11F_11F_REV" />
+ <field name="GL_UNSIGNED_INT_24_8" />
+ <field name="GL_UNSIGNED_INT_2_10_10_10_REV" />
+ <field name="GL_UNSIGNED_INT_5_9_9_9_REV" />
+ <field name="GL_UNSIGNED_INT_SAMPLER_2D" />
+ <field name="GL_UNSIGNED_INT_SAMPLER_2D_ARRAY" />
+ <field name="GL_UNSIGNED_INT_SAMPLER_3D" />
+ <field name="GL_UNSIGNED_INT_SAMPLER_CUBE" />
+ <field name="GL_UNSIGNED_INT_VEC2" />
+ <field name="GL_UNSIGNED_INT_VEC3" />
+ <field name="GL_UNSIGNED_INT_VEC4" />
+ <field name="GL_UNSIGNED_NORMALIZED" />
+ <field name="GL_VERTEX_ARRAY_BINDING" />
+ <field name="GL_VERTEX_ATTRIB_ARRAY_DIVISOR" />
+ <field name="GL_VERTEX_ATTRIB_ARRAY_INTEGER" />
+ <field name="GL_WAIT_FAILED" />
+ </class>
+ <class name="android/opengl/GLES31" since="21">
+ <extends name="android/opengl/GLES30" />
+ <method name="&lt;init>()V" />
+ <method name="glActiveShaderProgram(II)V" />
+ <method name="glBindImageTexture(IIIZIII)V" />
+ <method name="glBindProgramPipeline(I)V" />
+ <method name="glBindVertexBuffer(IIJI)V" />
+ <method name="glCreateShaderProgramv(I[Ljava/lang/String;)I" />
+ <method name="glDeleteProgramPipelines(ILjava/nio/IntBuffer;)V" />
+ <method name="glDeleteProgramPipelines(I[II)V" />
+ <method name="glDispatchCompute(III)V" />
+ <method name="glDispatchComputeIndirect(J)V" />
+ <method name="glDrawArraysIndirect(IJ)V" />
+ <method name="glDrawElementsIndirect(IIJ)V" />
+ <method name="glFramebufferParameteri(III)V" />
+ <method name="glGenProgramPipelines(ILjava/nio/IntBuffer;)V" />
+ <method name="glGenProgramPipelines(I[II)V" />
+ <method name="glGetBooleani_v(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetBooleani_v(II[ZI)V" />
+ <method name="glGetFramebufferParameteriv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetFramebufferParameteriv(II[II)V" />
+ <method name="glGetMultisamplefv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glGetMultisamplefv(II[FI)V" />
+ <method name="glGetProgramInterfaceiv(IIILjava/nio/IntBuffer;)V" />
+ <method name="glGetProgramInterfaceiv(III[II)V" />
+ <method name="glGetProgramPipelineInfoLog(I)Ljava/lang/String;" />
+ <method name="glGetProgramPipelineiv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetProgramPipelineiv(II[II)V" />
+ <method name="glGetProgramResourceIndex(IILjava/lang/String;)I" />
+ <method name="glGetProgramResourceLocation(IILjava/lang/String;)I" />
+ <method name="glGetProgramResourceName(III)Ljava/lang/String;" />
+ <method name="glGetProgramResourceiv(IIIILjava/nio/IntBuffer;ILjava/nio/IntBuffer;Ljava/nio/IntBuffer;)V" />
+ <method name="glGetProgramResourceiv(IIII[III[II[II)V" />
+ <method name="glGetTexLevelParameterfv(IIILjava/nio/FloatBuffer;)V" />
+ <method name="glGetTexLevelParameterfv(III[FI)V" />
+ <method name="glGetTexLevelParameteriv(IIILjava/nio/IntBuffer;)V" />
+ <method name="glGetTexLevelParameteriv(III[II)V" />
+ <method name="glIsProgramPipeline(I)Z" />
+ <method name="glMemoryBarrier(I)V" />
+ <method name="glMemoryBarrierByRegion(I)V" />
+ <method name="glProgramUniform1f(IIF)V" />
+ <method name="glProgramUniform1fv(IIILjava/nio/FloatBuffer;)V" />
+ <method name="glProgramUniform1fv(III[FI)V" />
+ <method name="glProgramUniform1i(III)V" />
+ <method name="glProgramUniform1iv(IIILjava/nio/IntBuffer;)V" />
+ <method name="glProgramUniform1iv(III[II)V" />
+ <method name="glProgramUniform1ui(III)V" />
+ <method name="glProgramUniform1uiv(IIILjava/nio/IntBuffer;)V" />
+ <method name="glProgramUniform1uiv(III[II)V" />
+ <method name="glProgramUniform2f(IIFF)V" />
+ <method name="glProgramUniform2fv(IIILjava/nio/FloatBuffer;)V" />
+ <method name="glProgramUniform2fv(III[FI)V" />
+ <method name="glProgramUniform2i(IIII)V" />
+ <method name="glProgramUniform2iv(IIILjava/nio/IntBuffer;)V" />
+ <method name="glProgramUniform2iv(III[II)V" />
+ <method name="glProgramUniform2ui(IIII)V" />
+ <method name="glProgramUniform2uiv(IIILjava/nio/IntBuffer;)V" />
+ <method name="glProgramUniform2uiv(III[II)V" />
+ <method name="glProgramUniform3f(IIFFF)V" />
+ <method name="glProgramUniform3fv(IIILjava/nio/FloatBuffer;)V" />
+ <method name="glProgramUniform3fv(III[FI)V" />
+ <method name="glProgramUniform3i(IIIII)V" />
+ <method name="glProgramUniform3iv(IIILjava/nio/IntBuffer;)V" />
+ <method name="glProgramUniform3iv(III[II)V" />
+ <method name="glProgramUniform3ui(IIIII)V" />
+ <method name="glProgramUniform3uiv(IIILjava/nio/IntBuffer;)V" />
+ <method name="glProgramUniform3uiv(III[II)V" />
+ <method name="glProgramUniform4f(IIFFFF)V" />
+ <method name="glProgramUniform4fv(IIILjava/nio/FloatBuffer;)V" />
+ <method name="glProgramUniform4fv(III[FI)V" />
+ <method name="glProgramUniform4i(IIIIII)V" />
+ <method name="glProgramUniform4iv(IIILjava/nio/IntBuffer;)V" />
+ <method name="glProgramUniform4iv(III[II)V" />
+ <method name="glProgramUniform4ui(IIIIII)V" />
+ <method name="glProgramUniform4uiv(IIILjava/nio/IntBuffer;)V" />
+ <method name="glProgramUniform4uiv(III[II)V" />
+ <method name="glProgramUniformMatrix2fv(IIIZLjava/nio/FloatBuffer;)V" />
+ <method name="glProgramUniformMatrix2fv(IIIZ[FI)V" />
+ <method name="glProgramUniformMatrix2x3fv(IIIZLjava/nio/FloatBuffer;)V" />
+ <method name="glProgramUniformMatrix2x3fv(IIIZ[FI)V" />
+ <method name="glProgramUniformMatrix2x4fv(IIIZLjava/nio/FloatBuffer;)V" />
+ <method name="glProgramUniformMatrix2x4fv(IIIZ[FI)V" />
+ <method name="glProgramUniformMatrix3fv(IIIZLjava/nio/FloatBuffer;)V" />
+ <method name="glProgramUniformMatrix3fv(IIIZ[FI)V" />
+ <method name="glProgramUniformMatrix3x2fv(IIIZLjava/nio/FloatBuffer;)V" />
+ <method name="glProgramUniformMatrix3x2fv(IIIZ[FI)V" />
+ <method name="glProgramUniformMatrix3x4fv(IIIZLjava/nio/FloatBuffer;)V" />
+ <method name="glProgramUniformMatrix3x4fv(IIIZ[FI)V" />
+ <method name="glProgramUniformMatrix4fv(IIIZLjava/nio/FloatBuffer;)V" />
+ <method name="glProgramUniformMatrix4fv(IIIZ[FI)V" />
+ <method name="glProgramUniformMatrix4x2fv(IIIZLjava/nio/FloatBuffer;)V" />
+ <method name="glProgramUniformMatrix4x2fv(IIIZ[FI)V" />
+ <method name="glProgramUniformMatrix4x3fv(IIIZLjava/nio/FloatBuffer;)V" />
+ <method name="glProgramUniformMatrix4x3fv(IIIZ[FI)V" />
+ <method name="glSampleMaski(II)V" />
+ <method name="glTexStorage2DMultisample(IIIIIZ)V" />
+ <method name="glUseProgramStages(III)V" />
+ <method name="glValidateProgramPipeline(I)V" />
+ <method name="glVertexAttribBinding(II)V" />
+ <method name="glVertexAttribFormat(IIIZI)V" />
+ <method name="glVertexAttribIFormat(IIII)V" />
+ <method name="glVertexBindingDivisor(II)V" />
+ <field name="GL_ACTIVE_ATOMIC_COUNTER_BUFFERS" />
+ <field name="GL_ACTIVE_PROGRAM" />
+ <field name="GL_ACTIVE_RESOURCES" />
+ <field name="GL_ACTIVE_VARIABLES" />
+ <field name="GL_ALL_SHADER_BITS" />
+ <field name="GL_ARRAY_SIZE" />
+ <field name="GL_ARRAY_STRIDE" />
+ <field name="GL_ATOMIC_COUNTER_BARRIER_BIT" />
+ <field name="GL_ATOMIC_COUNTER_BUFFER" />
+ <field name="GL_ATOMIC_COUNTER_BUFFER_BINDING" />
+ <field name="GL_ATOMIC_COUNTER_BUFFER_INDEX" />
+ <field name="GL_ATOMIC_COUNTER_BUFFER_SIZE" />
+ <field name="GL_ATOMIC_COUNTER_BUFFER_START" />
+ <field name="GL_BLOCK_INDEX" />
+ <field name="GL_BUFFER_BINDING" />
+ <field name="GL_BUFFER_DATA_SIZE" />
+ <field name="GL_BUFFER_UPDATE_BARRIER_BIT" />
+ <field name="GL_BUFFER_VARIABLE" />
+ <field name="GL_COMMAND_BARRIER_BIT" />
+ <field name="GL_COMPUTE_SHADER" />
+ <field name="GL_COMPUTE_SHADER_BIT" />
+ <field name="GL_COMPUTE_WORK_GROUP_SIZE" />
+ <field name="GL_DEPTH_STENCIL_TEXTURE_MODE" />
+ <field name="GL_DISPATCH_INDIRECT_BUFFER" />
+ <field name="GL_DISPATCH_INDIRECT_BUFFER_BINDING" />
+ <field name="GL_DRAW_INDIRECT_BUFFER" />
+ <field name="GL_DRAW_INDIRECT_BUFFER_BINDING" />
+ <field name="GL_FRAGMENT_SHADER_BIT" />
+ <field name="GL_FRAMEBUFFER_BARRIER_BIT" />
+ <field name="GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS" />
+ <field name="GL_FRAMEBUFFER_DEFAULT_HEIGHT" />
+ <field name="GL_FRAMEBUFFER_DEFAULT_SAMPLES" />
+ <field name="GL_FRAMEBUFFER_DEFAULT_WIDTH" />
+ <field name="GL_IMAGE_2D" />
+ <field name="GL_IMAGE_2D_ARRAY" />
+ <field name="GL_IMAGE_3D" />
+ <field name="GL_IMAGE_BINDING_ACCESS" />
+ <field name="GL_IMAGE_BINDING_FORMAT" />
+ <field name="GL_IMAGE_BINDING_LAYER" />
+ <field name="GL_IMAGE_BINDING_LAYERED" />
+ <field name="GL_IMAGE_BINDING_LEVEL" />
+ <field name="GL_IMAGE_BINDING_NAME" />
+ <field name="GL_IMAGE_CUBE" />
+ <field name="GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS" />
+ <field name="GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE" />
+ <field name="GL_IMAGE_FORMAT_COMPATIBILITY_TYPE" />
+ <field name="GL_INT_IMAGE_2D" />
+ <field name="GL_INT_IMAGE_2D_ARRAY" />
+ <field name="GL_INT_IMAGE_3D" />
+ <field name="GL_INT_IMAGE_CUBE" />
+ <field name="GL_INT_SAMPLER_2D_MULTISAMPLE" />
+ <field name="GL_IS_ROW_MAJOR" />
+ <field name="GL_LOCATION" />
+ <field name="GL_MATRIX_STRIDE" />
+ <field name="GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS" />
+ <field name="GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE" />
+ <field name="GL_MAX_COLOR_TEXTURE_SAMPLES" />
+ <field name="GL_MAX_COMBINED_ATOMIC_COUNTERS" />
+ <field name="GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS" />
+ <field name="GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS" />
+ <field name="GL_MAX_COMBINED_IMAGE_UNIFORMS" />
+ <field name="GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES" />
+ <field name="GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS" />
+ <field name="GL_MAX_COMPUTE_ATOMIC_COUNTERS" />
+ <field name="GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS" />
+ <field name="GL_MAX_COMPUTE_IMAGE_UNIFORMS" />
+ <field name="GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS" />
+ <field name="GL_MAX_COMPUTE_SHARED_MEMORY_SIZE" />
+ <field name="GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS" />
+ <field name="GL_MAX_COMPUTE_UNIFORM_BLOCKS" />
+ <field name="GL_MAX_COMPUTE_UNIFORM_COMPONENTS" />
+ <field name="GL_MAX_COMPUTE_WORK_GROUP_COUNT" />
+ <field name="GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS" />
+ <field name="GL_MAX_COMPUTE_WORK_GROUP_SIZE" />
+ <field name="GL_MAX_DEPTH_TEXTURE_SAMPLES" />
+ <field name="GL_MAX_FRAGMENT_ATOMIC_COUNTERS" />
+ <field name="GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS" />
+ <field name="GL_MAX_FRAGMENT_IMAGE_UNIFORMS" />
+ <field name="GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS" />
+ <field name="GL_MAX_FRAMEBUFFER_HEIGHT" />
+ <field name="GL_MAX_FRAMEBUFFER_SAMPLES" />
+ <field name="GL_MAX_FRAMEBUFFER_WIDTH" />
+ <field name="GL_MAX_IMAGE_UNITS" />
+ <field name="GL_MAX_INTEGER_SAMPLES" />
+ <field name="GL_MAX_NAME_LENGTH" />
+ <field name="GL_MAX_NUM_ACTIVE_VARIABLES" />
+ <field name="GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET" />
+ <field name="GL_MAX_SAMPLE_MASK_WORDS" />
+ <field name="GL_MAX_SHADER_STORAGE_BLOCK_SIZE" />
+ <field name="GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS" />
+ <field name="GL_MAX_UNIFORM_LOCATIONS" />
+ <field name="GL_MAX_VERTEX_ATOMIC_COUNTERS" />
+ <field name="GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS" />
+ <field name="GL_MAX_VERTEX_ATTRIB_BINDINGS" />
+ <field name="GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET" />
+ <field name="GL_MAX_VERTEX_ATTRIB_STRIDE" />
+ <field name="GL_MAX_VERTEX_IMAGE_UNIFORMS" />
+ <field name="GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS" />
+ <field name="GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET" />
+ <field name="GL_NAME_LENGTH" />
+ <field name="GL_NUM_ACTIVE_VARIABLES" />
+ <field name="GL_OFFSET" />
+ <field name="GL_PIXEL_BUFFER_BARRIER_BIT" />
+ <field name="GL_PROGRAM_INPUT" />
+ <field name="GL_PROGRAM_OUTPUT" />
+ <field name="GL_PROGRAM_PIPELINE_BINDING" />
+ <field name="GL_PROGRAM_SEPARABLE" />
+ <field name="GL_READ_ONLY" />
+ <field name="GL_READ_WRITE" />
+ <field name="GL_REFERENCED_BY_COMPUTE_SHADER" />
+ <field name="GL_REFERENCED_BY_FRAGMENT_SHADER" />
+ <field name="GL_REFERENCED_BY_VERTEX_SHADER" />
+ <field name="GL_SAMPLER_2D_MULTISAMPLE" />
+ <field name="GL_SAMPLE_MASK" />
+ <field name="GL_SAMPLE_MASK_VALUE" />
+ <field name="GL_SAMPLE_POSITION" />
+ <field name="GL_SHADER_STORAGE_BARRIER_BIT" />
+ <field name="GL_SHADER_STORAGE_BLOCK" />
+ <field name="GL_SHADER_STORAGE_BUFFER" />
+ <field name="GL_SHADER_STORAGE_BUFFER_BINDING" />
+ <field name="GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT" />
+ <field name="GL_SHADER_STORAGE_BUFFER_SIZE" />
+ <field name="GL_SHADER_STORAGE_BUFFER_START" />
+ <field name="GL_STENCIL_INDEX" />
+ <field name="GL_TEXTURE_2D_MULTISAMPLE" />
+ <field name="GL_TEXTURE_ALPHA_SIZE" />
+ <field name="GL_TEXTURE_ALPHA_TYPE" />
+ <field name="GL_TEXTURE_BINDING_2D_MULTISAMPLE" />
+ <field name="GL_TEXTURE_BLUE_SIZE" />
+ <field name="GL_TEXTURE_BLUE_TYPE" />
+ <field name="GL_TEXTURE_COMPRESSED" />
+ <field name="GL_TEXTURE_DEPTH" />
+ <field name="GL_TEXTURE_DEPTH_SIZE" />
+ <field name="GL_TEXTURE_DEPTH_TYPE" />
+ <field name="GL_TEXTURE_FETCH_BARRIER_BIT" />
+ <field name="GL_TEXTURE_FIXED_SAMPLE_LOCATIONS" />
+ <field name="GL_TEXTURE_GREEN_SIZE" />
+ <field name="GL_TEXTURE_GREEN_TYPE" />
+ <field name="GL_TEXTURE_HEIGHT" />
+ <field name="GL_TEXTURE_INTERNAL_FORMAT" />
+ <field name="GL_TEXTURE_RED_SIZE" />
+ <field name="GL_TEXTURE_RED_TYPE" />
+ <field name="GL_TEXTURE_SAMPLES" />
+ <field name="GL_TEXTURE_SHARED_SIZE" />
+ <field name="GL_TEXTURE_STENCIL_SIZE" />
+ <field name="GL_TEXTURE_UPDATE_BARRIER_BIT" />
+ <field name="GL_TEXTURE_WIDTH" />
+ <field name="GL_TOP_LEVEL_ARRAY_SIZE" />
+ <field name="GL_TOP_LEVEL_ARRAY_STRIDE" />
+ <field name="GL_TRANSFORM_FEEDBACK_BARRIER_BIT" />
+ <field name="GL_TRANSFORM_FEEDBACK_VARYING" />
+ <field name="GL_TYPE" />
+ <field name="GL_UNIFORM" />
+ <field name="GL_UNIFORM_BARRIER_BIT" />
+ <field name="GL_UNIFORM_BLOCK" />
+ <field name="GL_UNSIGNED_INT_ATOMIC_COUNTER" />
+ <field name="GL_UNSIGNED_INT_IMAGE_2D" />
+ <field name="GL_UNSIGNED_INT_IMAGE_2D_ARRAY" />
+ <field name="GL_UNSIGNED_INT_IMAGE_3D" />
+ <field name="GL_UNSIGNED_INT_IMAGE_CUBE" />
+ <field name="GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE" />
+ <field name="GL_VERTEX_ATTRIB_BINDING" />
+ <field name="GL_VERTEX_ATTRIB_RELATIVE_OFFSET" />
+ <field name="GL_VERTEX_BINDING_BUFFER" />
+ <field name="GL_VERTEX_BINDING_DIVISOR" />
+ <field name="GL_VERTEX_BINDING_OFFSET" />
+ <field name="GL_VERTEX_BINDING_STRIDE" />
+ <field name="GL_VERTEX_SHADER_BIT" />
+ <field name="GL_WRITE_ONLY" />
+ </class>
+ <class name="android/opengl/GLES31Ext" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="glBlendBarrierKHR()V" />
+ <method name="glBlendEquationSeparateiEXT(III)V" />
+ <method name="glBlendEquationiEXT(II)V" />
+ <method name="glBlendFuncSeparateiEXT(IIIII)V" />
+ <method name="glBlendFunciEXT(III)V" />
+ <method name="glColorMaskiEXT(IZZZZ)V" />
+ <method name="glCopyImageSubDataEXT(IIIIIIIIIIIIIII)V" />
+ <method name="glDebugMessageCallbackKHR(Landroid/opengl/GLES31Ext$DebugProcKHR;)V" />
+ <method name="glDebugMessageControlKHR(IIIILjava/nio/IntBuffer;Z)V" />
+ <method name="glDebugMessageControlKHR(IIII[IIZ)V" />
+ <method name="glDebugMessageInsertKHR(IIIILjava/lang/String;)V" />
+ <method name="glDisableiEXT(II)V" />
+ <method name="glEnableiEXT(II)V" />
+ <method name="glFramebufferTextureEXT(IIII)V" />
+ <method name="glGetDebugMessageCallbackKHR()Landroid/opengl/GLES31Ext$DebugProcKHR;" />
+ <method name="glGetDebugMessageLogKHR(II[II[II[II[II[II[BI)I" />
+ <method name="glGetDebugMessageLogKHR(ILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;)[Ljava/lang/String;" />
+ <method name="glGetDebugMessageLogKHR(ILjava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;Ljava/nio/ByteBuffer;)I" />
+ <method name="glGetDebugMessageLogKHR(I[II[II[II[II)[Ljava/lang/String;" />
+ <method name="glGetObjectLabelKHR(II)Ljava/lang/String;" />
+ <method name="glGetObjectPtrLabelKHR(J)Ljava/lang/String;" />
+ <method name="glGetSamplerParameterIivEXT(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetSamplerParameterIivEXT(II[II)V" />
+ <method name="glGetSamplerParameterIuivEXT(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetSamplerParameterIuivEXT(II[II)V" />
+ <method name="glGetTexParameterIivEXT(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetTexParameterIivEXT(II[II)V" />
+ <method name="glGetTexParameterIuivEXT(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetTexParameterIuivEXT(II[II)V" />
+ <method name="glIsEnablediEXT(II)Z" />
+ <method name="glMinSampleShadingOES(F)V" />
+ <method name="glObjectLabelKHR(IIILjava/lang/String;)V" />
+ <method name="glObjectPtrLabelKHR(JLjava/lang/String;)V" />
+ <method name="glPatchParameteriEXT(II)V" />
+ <method name="glPopDebugGroupKHR()V" />
+ <method name="glPrimitiveBoundingBoxEXT(FFFFFFFF)V" />
+ <method name="glPushDebugGroupKHR(IIILjava/lang/String;)V" />
+ <method name="glSamplerParameterIivEXT(IILjava/nio/IntBuffer;)V" />
+ <method name="glSamplerParameterIivEXT(II[II)V" />
+ <method name="glSamplerParameterIuivEXT(IILjava/nio/IntBuffer;)V" />
+ <method name="glSamplerParameterIuivEXT(II[II)V" />
+ <method name="glTexBufferEXT(III)V" />
+ <method name="glTexBufferRangeEXT(IIIII)V" />
+ <method name="glTexParameterIivEXT(IILjava/nio/IntBuffer;)V" />
+ <method name="glTexParameterIivEXT(II[II)V" />
+ <method name="glTexParameterIuivEXT(IILjava/nio/IntBuffer;)V" />
+ <method name="glTexParameterIuivEXT(II[II)V" />
+ <method name="glTexStorage3DMultisampleOES(IIIIIIZ)V" />
+ <field name="GL_BLEND_ADVANCED_COHERENT_KHR" />
+ <field name="GL_BUFFER_KHR" />
+ <field name="GL_CLAMP_TO_BORDER_EXT" />
+ <field name="GL_COLORBURN_KHR" />
+ <field name="GL_COLORDODGE_KHR" />
+ <field name="GL_COMPRESSED_RGBA_ASTC_10x10_KHR" />
+ <field name="GL_COMPRESSED_RGBA_ASTC_10x5_KHR" />
+ <field name="GL_COMPRESSED_RGBA_ASTC_10x6_KHR" />
+ <field name="GL_COMPRESSED_RGBA_ASTC_10x8_KHR" />
+ <field name="GL_COMPRESSED_RGBA_ASTC_12x10_KHR" />
+ <field name="GL_COMPRESSED_RGBA_ASTC_12x12_KHR" />
+ <field name="GL_COMPRESSED_RGBA_ASTC_4x4_KHR" />
+ <field name="GL_COMPRESSED_RGBA_ASTC_5x4_KHR" />
+ <field name="GL_COMPRESSED_RGBA_ASTC_5x5_KHR" />
+ <field name="GL_COMPRESSED_RGBA_ASTC_6x5_KHR" />
+ <field name="GL_COMPRESSED_RGBA_ASTC_6x6_KHR" />
+ <field name="GL_COMPRESSED_RGBA_ASTC_8x5_KHR" />
+ <field name="GL_COMPRESSED_RGBA_ASTC_8x6_KHR" />
+ <field name="GL_COMPRESSED_RGBA_ASTC_8x8_KHR" />
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR" />
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR" />
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR" />
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR" />
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR" />
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR" />
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR" />
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR" />
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR" />
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR" />
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR" />
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR" />
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR" />
+ <field name="GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR" />
+ <field name="GL_CONTEXT_FLAG_DEBUG_BIT_KHR" />
+ <field name="GL_DARKEN_KHR" />
+ <field name="GL_DEBUG_CALLBACK_FUNCTION_KHR" />
+ <field name="GL_DEBUG_CALLBACK_USER_PARAM_KHR" />
+ <field name="GL_DEBUG_GROUP_STACK_DEPTH_KHR" />
+ <field name="GL_DEBUG_LOGGED_MESSAGES_KHR" />
+ <field name="GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_KHR" />
+ <field name="GL_DEBUG_OUTPUT_KHR" />
+ <field name="GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR" />
+ <field name="GL_DEBUG_SEVERITY_HIGH_KHR" />
+ <field name="GL_DEBUG_SEVERITY_LOW_KHR" />
+ <field name="GL_DEBUG_SEVERITY_MEDIUM_KHR" />
+ <field name="GL_DEBUG_SEVERITY_NOTIFICATION_KHR" />
+ <field name="GL_DEBUG_SOURCE_API_KHR" />
+ <field name="GL_DEBUG_SOURCE_APPLICATION_KHR" />
+ <field name="GL_DEBUG_SOURCE_OTHER_KHR" />
+ <field name="GL_DEBUG_SOURCE_SHADER_COMPILER_KHR" />
+ <field name="GL_DEBUG_SOURCE_THIRD_PARTY_KHR" />
+ <field name="GL_DEBUG_SOURCE_WINDOW_SYSTEM_KHR" />
+ <field name="GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR" />
+ <field name="GL_DEBUG_TYPE_ERROR_KHR" />
+ <field name="GL_DEBUG_TYPE_MARKER_KHR" />
+ <field name="GL_DEBUG_TYPE_OTHER_KHR" />
+ <field name="GL_DEBUG_TYPE_PERFORMANCE_KHR" />
+ <field name="GL_DEBUG_TYPE_POP_GROUP_KHR" />
+ <field name="GL_DEBUG_TYPE_PORTABILITY_KHR" />
+ <field name="GL_DEBUG_TYPE_PUSH_GROUP_KHR" />
+ <field name="GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR" />
+ <field name="GL_DECODE_EXT" />
+ <field name="GL_DIFFERENCE_KHR" />
+ <field name="GL_EXCLUSION_KHR" />
+ <field name="GL_FIRST_VERTEX_CONVENTION_EXT" />
+ <field name="GL_FRACTIONAL_EVEN_EXT" />
+ <field name="GL_FRACTIONAL_ODD_EXT" />
+ <field name="GL_FRAGMENT_INTERPOLATION_OFFSET_BITS_OES" />
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT" />
+ <field name="GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT" />
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT" />
+ <field name="GL_GEOMETRY_LINKED_INPUT_TYPE_EXT" />
+ <field name="GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT" />
+ <field name="GL_GEOMETRY_LINKED_VERTICES_OUT_EXT" />
+ <field name="GL_GEOMETRY_SHADER_BIT_EXT" />
+ <field name="GL_GEOMETRY_SHADER_EXT" />
+ <field name="GL_GEOMETRY_SHADER_INVOCATIONS_EXT" />
+ <field name="GL_HARDLIGHT_KHR" />
+ <field name="GL_HSL_COLOR_KHR" />
+ <field name="GL_HSL_HUE_KHR" />
+ <field name="GL_HSL_LUMINOSITY_KHR" />
+ <field name="GL_HSL_SATURATION_KHR" />
+ <field name="GL_IMAGE_BUFFER_EXT" />
+ <field name="GL_IMAGE_CUBE_MAP_ARRAY_EXT" />
+ <field name="GL_INT_IMAGE_BUFFER_EXT" />
+ <field name="GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT" />
+ <field name="GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES" />
+ <field name="GL_INT_SAMPLER_BUFFER_EXT" />
+ <field name="GL_INT_SAMPLER_CUBE_MAP_ARRAY_EXT" />
+ <field name="GL_ISOLINES_EXT" />
+ <field name="GL_IS_PER_PATCH_EXT" />
+ <field name="GL_LAST_VERTEX_CONVENTION_EXT" />
+ <field name="GL_LAYER_PROVOKING_VERTEX_EXT" />
+ <field name="GL_LIGHTEN_KHR" />
+ <field name="GL_LINES_ADJACENCY_EXT" />
+ <field name="GL_LINE_STRIP_ADJACENCY_EXT" />
+ <field name="GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT" />
+ <field name="GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_EXT" />
+ <field name="GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT" />
+ <field name="GL_MAX_DEBUG_GROUP_STACK_DEPTH_KHR" />
+ <field name="GL_MAX_DEBUG_LOGGED_MESSAGES_KHR" />
+ <field name="GL_MAX_DEBUG_MESSAGE_LENGTH_KHR" />
+ <field name="GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_OES" />
+ <field name="GL_MAX_FRAMEBUFFER_LAYERS_EXT" />
+ <field name="GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT" />
+ <field name="GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT" />
+ <field name="GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT" />
+ <field name="GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT" />
+ <field name="GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT" />
+ <field name="GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT" />
+ <field name="GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT" />
+ <field name="GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT" />
+ <field name="GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT" />
+ <field name="GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT" />
+ <field name="GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT" />
+ <field name="GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT" />
+ <field name="GL_MAX_LABEL_LENGTH_KHR" />
+ <field name="GL_MAX_PATCH_VERTICES_EXT" />
+ <field name="GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_EXT" />
+ <field name="GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_EXT" />
+ <field name="GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_EXT" />
+ <field name="GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_EXT" />
+ <field name="GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_EXT" />
+ <field name="GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_EXT" />
+ <field name="GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_EXT" />
+ <field name="GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_EXT" />
+ <field name="GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_EXT" />
+ <field name="GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_EXT" />
+ <field name="GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_EXT" />
+ <field name="GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_EXT" />
+ <field name="GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_EXT" />
+ <field name="GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_EXT" />
+ <field name="GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_EXT" />
+ <field name="GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_EXT" />
+ <field name="GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_EXT" />
+ <field name="GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_EXT" />
+ <field name="GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT" />
+ <field name="GL_MAX_TESS_GEN_LEVEL_EXT" />
+ <field name="GL_MAX_TESS_PATCH_COMPONENTS_EXT" />
+ <field name="GL_MAX_TEXTURE_BUFFER_SIZE_EXT" />
+ <field name="GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_OES" />
+ <field name="GL_MIN_SAMPLE_SHADING_VALUE_OES" />
+ <field name="GL_MULTIPLY_KHR" />
+ <field name="GL_OVERLAY_KHR" />
+ <field name="GL_PATCHES_EXT" />
+ <field name="GL_PATCH_VERTICES_EXT" />
+ <field name="GL_PRIMITIVES_GENERATED_EXT" />
+ <field name="GL_PRIMITIVE_BOUNDING_BOX_EXT" />
+ <field name="GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED" />
+ <field name="GL_PROGRAM_KHR" />
+ <field name="GL_QUADS_EXT" />
+ <field name="GL_QUERY_KHR" />
+ <field name="GL_REFERENCED_BY_GEOMETRY_SHADER_EXT" />
+ <field name="GL_REFERENCED_BY_TESS_CONTROL_SHADER_EXT" />
+ <field name="GL_REFERENCED_BY_TESS_EVALUATION_SHADER_EXT" />
+ <field name="GL_SAMPLER_2D_MULTISAMPLE_ARRAY_OES" />
+ <field name="GL_SAMPLER_BUFFER_EXT" />
+ <field name="GL_SAMPLER_CUBE_MAP_ARRAY_EXT" />
+ <field name="GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_EXT" />
+ <field name="GL_SAMPLER_KHR" />
+ <field name="GL_SAMPLE_SHADING_OES" />
+ <field name="GL_SCREEN_KHR" />
+ <field name="GL_SHADER_KHR" />
+ <field name="GL_SKIP_DECODE_EXT" />
+ <field name="GL_SOFTLIGHT_KHR" />
+ <field name="GL_STACK_OVERFLOW_KHR" />
+ <field name="GL_STACK_UNDERFLOW_KHR" />
+ <field name="GL_STENCIL_INDEX8_OES" />
+ <field name="GL_STENCIL_INDEX_OES" />
+ <field name="GL_TESS_CONTROL_OUTPUT_VERTICES_EXT" />
+ <field name="GL_TESS_CONTROL_SHADER_BIT_EXT" />
+ <field name="GL_TESS_CONTROL_SHADER_EXT" />
+ <field name="GL_TESS_EVALUATION_SHADER_BIT_EXT" />
+ <field name="GL_TESS_EVALUATION_SHADER_EXT" />
+ <field name="GL_TESS_GEN_MODE_EXT" />
+ <field name="GL_TESS_GEN_POINT_MODE_EXT" />
+ <field name="GL_TESS_GEN_SPACING_EXT" />
+ <field name="GL_TESS_GEN_VERTEX_ORDER_EXT" />
+ <field name="GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES" />
+ <field name="GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY_OES" />
+ <field name="GL_TEXTURE_BINDING_BUFFER_EXT" />
+ <field name="GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_EXT" />
+ <field name="GL_TEXTURE_BORDER_COLOR_EXT" />
+ <field name="GL_TEXTURE_BUFFER_BINDING_EXT" />
+ <field name="GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT" />
+ <field name="GL_TEXTURE_BUFFER_EXT" />
+ <field name="GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_EXT" />
+ <field name="GL_TEXTURE_BUFFER_OFFSET_EXT" />
+ <field name="GL_TEXTURE_BUFFER_SIZE_EXT" />
+ <field name="GL_TEXTURE_CUBE_MAP_ARRAY_EXT" />
+ <field name="GL_TEXTURE_SRGB_DECODE_EXT" />
+ <field name="GL_TRIANGLES_ADJACENCY_EXT" />
+ <field name="GL_TRIANGLE_STRIP_ADJACENCY_EXT" />
+ <field name="GL_UNDEFINED_VERTEX_EXT" />
+ <field name="GL_UNSIGNED_INT_IMAGE_BUFFER_EXT" />
+ <field name="GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT" />
+ <field name="GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES" />
+ <field name="GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT" />
+ <field name="GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_EXT" />
+ <field name="GL_VERTEX_ARRAY_KHR" />
+ </class>
+ <class name="android/opengl/GLES31Ext$DebugProcKHR" since="21">
+ <extends name="java/lang/Object" />
+ <method name="onMessage(IIIILjava/lang/String;)V" />
+ </class>
+ <class name="android/opengl/GLException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(ILjava/lang/String;)V" />
+ </class>
+ <class name="android/opengl/GLSurfaceView" since="3">
+ <extends name="android/view/SurfaceView" />
+ <implements name="android/view/SurfaceHolder$Callback" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="getDebugFlags()I" />
+ <method name="getPreserveEGLContextOnPause()Z" since="11" />
+ <method name="getRenderMode()I" />
+ <method name="onPause()V" />
+ <method name="onResume()V" />
+ <method name="queueEvent(Ljava/lang/Runnable;)V" />
+ <method name="requestRender()V" />
+ <method name="setDebugFlags(I)V" />
+ <method name="setEGLConfigChooser(IIIIII)V" />
+ <method name="setEGLConfigChooser(Landroid/opengl/GLSurfaceView$EGLConfigChooser;)V" />
+ <method name="setEGLConfigChooser(Z)V" />
+ <method name="setEGLContextClientVersion(I)V" since="8" />
+ <method name="setEGLContextFactory(Landroid/opengl/GLSurfaceView$EGLContextFactory;)V" since="5" />
+ <method name="setEGLWindowSurfaceFactory(Landroid/opengl/GLSurfaceView$EGLWindowSurfaceFactory;)V" since="5" />
+ <method name="setGLWrapper(Landroid/opengl/GLSurfaceView$GLWrapper;)V" />
+ <method name="setPreserveEGLContextOnPause(Z)V" since="11" />
+ <method name="setRenderMode(I)V" />
+ <method name="setRenderer(Landroid/opengl/GLSurfaceView$Renderer;)V" />
+ <field name="DEBUG_CHECK_GL_ERROR" />
+ <field name="DEBUG_LOG_GL_CALLS" />
+ <field name="RENDERMODE_CONTINUOUSLY" />
+ <field name="RENDERMODE_WHEN_DIRTY" />
+ </class>
+ <class name="android/opengl/GLSurfaceView$EGLConfigChooser" since="3">
+ <extends name="java/lang/Object" />
+ <method name="chooseConfig(Ljavax/microedition/khronos/egl/EGL10;Ljavax/microedition/khronos/egl/EGLDisplay;)Ljavax/microedition/khronos/egl/EGLConfig;" />
+ </class>
+ <class name="android/opengl/GLSurfaceView$EGLContextFactory" since="5">
+ <extends name="java/lang/Object" />
+ <method name="createContext(Ljavax/microedition/khronos/egl/EGL10;Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLConfig;)Ljavax/microedition/khronos/egl/EGLContext;" />
+ <method name="destroyContext(Ljavax/microedition/khronos/egl/EGL10;Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLContext;)V" />
+ </class>
+ <class name="android/opengl/GLSurfaceView$EGLWindowSurfaceFactory" since="5">
+ <extends name="java/lang/Object" />
+ <method name="createWindowSurface(Ljavax/microedition/khronos/egl/EGL10;Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLConfig;Ljava/lang/Object;)Ljavax/microedition/khronos/egl/EGLSurface;" />
+ <method name="destroySurface(Ljavax/microedition/khronos/egl/EGL10;Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLSurface;)V" />
+ </class>
+ <class name="android/opengl/GLSurfaceView$GLWrapper" since="3">
+ <extends name="java/lang/Object" />
+ <method name="wrap(Ljavax/microedition/khronos/opengles/GL;)Ljavax/microedition/khronos/opengles/GL;" />
+ </class>
+ <class name="android/opengl/GLSurfaceView$Renderer" since="3">
+ <extends name="java/lang/Object" />
+ <method name="onDrawFrame(Ljavax/microedition/khronos/opengles/GL10;)V" />
+ <method name="onSurfaceChanged(Ljavax/microedition/khronos/opengles/GL10;II)V" />
+ <method name="onSurfaceCreated(Ljavax/microedition/khronos/opengles/GL10;Ljavax/microedition/khronos/egl/EGLConfig;)V" />
+ </class>
+ <class name="android/opengl/GLU" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="gluErrorString(I)Ljava/lang/String;" />
+ <method name="gluLookAt(Ljavax/microedition/khronos/opengles/GL10;FFFFFFFFF)V" />
+ <method name="gluOrtho2D(Ljavax/microedition/khronos/opengles/GL10;FFFF)V" />
+ <method name="gluPerspective(Ljavax/microedition/khronos/opengles/GL10;FFFF)V" />
+ <method name="gluProject(FFF[FI[FI[II[FI)I" />
+ <method name="gluUnProject(FFF[FI[FI[II[FI)I" />
+ </class>
+ <class name="android/opengl/GLUtils" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getEGLErrorString(I)Ljava/lang/String;" since="14" />
+ <method name="getInternalFormat(Landroid/graphics/Bitmap;)I" />
+ <method name="getType(Landroid/graphics/Bitmap;)I" />
+ <method name="texImage2D(IIILandroid/graphics/Bitmap;I)V" />
+ <method name="texImage2D(IIILandroid/graphics/Bitmap;II)V" />
+ <method name="texImage2D(IILandroid/graphics/Bitmap;I)V" />
+ <method name="texSubImage2D(IIIILandroid/graphics/Bitmap;)V" />
+ <method name="texSubImage2D(IIIILandroid/graphics/Bitmap;II)V" />
+ </class>
+ <class name="android/opengl/Matrix" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="frustumM([FIFFFFFF)V" />
+ <method name="invertM([FI[FI)Z" />
+ <method name="length(FFF)F" />
+ <method name="multiplyMM([FI[FI[FI)V" />
+ <method name="multiplyMV([FI[FI[FI)V" />
+ <method name="orthoM([FIFFFFFF)V" />
+ <method name="perspectiveM([FIFFFF)V" since="14" />
+ <method name="rotateM([FIFFFF)V" />
+ <method name="rotateM([FI[FIFFFF)V" />
+ <method name="scaleM([FIFFF)V" />
+ <method name="scaleM([FI[FIFFF)V" />
+ <method name="setIdentityM([FI)V" />
+ <method name="setLookAtM([FIFFFFFFFFF)V" since="8" />
+ <method name="setRotateEulerM([FIFFF)V" />
+ <method name="setRotateM([FIFFFF)V" />
+ <method name="translateM([FIFFF)V" />
+ <method name="translateM([FI[FIFFF)V" />
+ <method name="transposeM([FI[FI)V" />
+ </class>
+ <class name="android/opengl/Visibility" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="computeBoundingSphere([FII[FI)V" />
+ <method name="frustumCullSpheres([FI[FII[III)I" />
+ <method name="visibilityTest([FI[FI[CII)I" />
+ </class>
+ <class name="android/os/AsyncTask" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="cancel(Z)Z" />
+ <method name="doInBackground([Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="execute(Ljava/lang/Runnable;)V" since="11" />
+ <method name="execute([Ljava/lang/Object;)Landroid/os/AsyncTask;" />
+ <method name="executeOnExecutor(Ljava/util/concurrent/Executor;[Ljava/lang/Object;)Landroid/os/AsyncTask;" since="11" />
+ <method name="get()Ljava/lang/Object;" />
+ <method name="get(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;" />
+ <method name="getStatus()Landroid/os/AsyncTask$Status;" />
+ <method name="isCancelled()Z" />
+ <method name="onCancelled()V" />
+ <method name="onCancelled(Ljava/lang/Object;)V" since="11" />
+ <method name="onPostExecute(Ljava/lang/Object;)V" />
+ <method name="onPreExecute()V" />
+ <method name="onProgressUpdate([Ljava/lang/Object;)V" />
+ <method name="publishProgress([Ljava/lang/Object;)V" />
+ <field name="SERIAL_EXECUTOR" since="11" />
+ <field name="THREAD_POOL_EXECUTOR" since="11" />
+ </class>
+ <class name="android/os/AsyncTask$Status" since="3">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/os/AsyncTask$Status;" />
+ <method name="values()[Landroid/os/AsyncTask$Status;" />
+ <field name="FINISHED" />
+ <field name="PENDING" />
+ <field name="RUNNING" />
+ </class>
+ <class name="android/os/BadParcelableException" since="1">
+ <extends name="android/util/AndroidRuntimeException" />
+ <method name="&lt;init>(Ljava/lang/Exception;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/os/BaseBundle" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="clear()V" />
+ <method name="containsKey(Ljava/lang/String;)Z" />
+ <method name="get(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="getDouble(Ljava/lang/String;)D" />
+ <method name="getDouble(Ljava/lang/String;D)D" />
+ <method name="getDoubleArray(Ljava/lang/String;)[D" />
+ <method name="getInt(Ljava/lang/String;)I" />
+ <method name="getInt(Ljava/lang/String;I)I" />
+ <method name="getIntArray(Ljava/lang/String;)[I" />
+ <method name="getLong(Ljava/lang/String;)J" />
+ <method name="getLong(Ljava/lang/String;J)J" />
+ <method name="getLongArray(Ljava/lang/String;)[J" />
+ <method name="getString(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getStringArray(Ljava/lang/String;)[Ljava/lang/String;" />
+ <method name="isEmpty()Z" />
+ <method name="keySet()Ljava/util/Set;" />
+ <method name="putAll(Landroid/os/PersistableBundle;)V" />
+ <method name="putDouble(Ljava/lang/String;D)V" />
+ <method name="putDoubleArray(Ljava/lang/String;[D)V" />
+ <method name="putInt(Ljava/lang/String;I)V" />
+ <method name="putIntArray(Ljava/lang/String;[I)V" />
+ <method name="putLong(Ljava/lang/String;J)V" />
+ <method name="putLongArray(Ljava/lang/String;[J)V" />
+ <method name="putString(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="putStringArray(Ljava/lang/String;[Ljava/lang/String;)V" />
+ <method name="remove(Ljava/lang/String;)V" />
+ <method name="size()I" />
+ </class>
+ <class name="android/os/BatteryManager" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getIntProperty(I)I" since="21" />
+ <method name="getLongProperty(I)J" since="21" />
+ <field name="BATTERY_HEALTH_COLD" since="11" />
+ <field name="BATTERY_HEALTH_DEAD" />
+ <field name="BATTERY_HEALTH_GOOD" />
+ <field name="BATTERY_HEALTH_OVERHEAT" />
+ <field name="BATTERY_HEALTH_OVER_VOLTAGE" />
+ <field name="BATTERY_HEALTH_UNKNOWN" />
+ <field name="BATTERY_HEALTH_UNSPECIFIED_FAILURE" />
+ <field name="BATTERY_PLUGGED_AC" />
+ <field name="BATTERY_PLUGGED_USB" />
+ <field name="BATTERY_PLUGGED_WIRELESS" since="17" />
+ <field name="BATTERY_PROPERTY_CAPACITY" since="21" />
+ <field name="BATTERY_PROPERTY_CHARGE_COUNTER" since="21" />
+ <field name="BATTERY_PROPERTY_CURRENT_AVERAGE" since="21" />
+ <field name="BATTERY_PROPERTY_CURRENT_NOW" since="21" />
+ <field name="BATTERY_PROPERTY_ENERGY_COUNTER" since="21" />
+ <field name="BATTERY_STATUS_CHARGING" />
+ <field name="BATTERY_STATUS_DISCHARGING" />
+ <field name="BATTERY_STATUS_FULL" />
+ <field name="BATTERY_STATUS_NOT_CHARGING" />
+ <field name="BATTERY_STATUS_UNKNOWN" />
+ <field name="EXTRA_HEALTH" since="5" />
+ <field name="EXTRA_ICON_SMALL" since="5" />
+ <field name="EXTRA_LEVEL" since="5" />
+ <field name="EXTRA_PLUGGED" since="5" />
+ <field name="EXTRA_PRESENT" since="5" />
+ <field name="EXTRA_SCALE" since="5" />
+ <field name="EXTRA_STATUS" since="5" />
+ <field name="EXTRA_TECHNOLOGY" since="5" />
+ <field name="EXTRA_TEMPERATURE" since="5" />
+ <field name="EXTRA_VOLTAGE" since="5" />
+ </class>
+ <class name="android/os/Binder" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/IBinder" />
+ <method name="&lt;init>()V" />
+ <method name="attachInterface(Landroid/os/IInterface;Ljava/lang/String;)V" />
+ <method name="clearCallingIdentity()J" />
+ <method name="dump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V" />
+ <method name="flushPendingCommands()V" />
+ <method name="getCallingPid()I" />
+ <method name="getCallingUid()I" />
+ <method name="getCallingUserHandle()Landroid/os/UserHandle;" since="17" />
+ <method name="joinThreadPool()V" />
+ <method name="onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z" />
+ <method name="restoreCallingIdentity(J)V" />
+ </class>
+ <class name="android/os/Build" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getRadioVersion()Ljava/lang/String;" since="14" />
+ <field name="BOARD" />
+ <field name="BOOTLOADER" since="8" />
+ <field name="BRAND" />
+ <field name="CPU_ABI" since="4" />
+ <field name="CPU_ABI2" since="8" />
+ <field name="DEVICE" />
+ <field name="DISPLAY" since="3" />
+ <field name="FINGERPRINT" />
+ <field name="HARDWARE" since="8" />
+ <field name="HOST" />
+ <field name="ID" />
+ <field name="MANUFACTURER" since="4" />
+ <field name="MODEL" />
+ <field name="PRODUCT" />
+ <field name="RADIO" since="8" />
+ <field name="SERIAL" since="9" />
+ <field name="SUPPORTED_32_BIT_ABIS" since="21" />
+ <field name="SUPPORTED_64_BIT_ABIS" since="21" />
+ <field name="SUPPORTED_ABIS" since="21" />
+ <field name="TAGS" />
+ <field name="TIME" />
+ <field name="TYPE" />
+ <field name="UNKNOWN" since="8" />
+ <field name="USER" />
+ </class>
+ <class name="android/os/Build$VERSION" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="CODENAME" since="4" />
+ <field name="INCREMENTAL" />
+ <field name="RELEASE" />
+ <field name="SDK" />
+ <field name="SDK_INT" since="4" />
+ </class>
+ <class name="android/os/Build$VERSION_CODES" since="4">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="BASE" />
+ <field name="BASE_1_1" />
+ <field name="CUPCAKE" />
+ <field name="CUR_DEVELOPMENT" />
+ <field name="DONUT" />
+ <field name="ECLAIR" since="5" />
+ <field name="ECLAIR_0_1" since="6" />
+ <field name="ECLAIR_MR1" since="7" />
+ <field name="FROYO" since="8" />
+ <field name="GINGERBREAD" since="9" />
+ <field name="GINGERBREAD_MR1" since="10" />
+ <field name="HONEYCOMB" since="11" />
+ <field name="HONEYCOMB_MR1" since="12" />
+ <field name="HONEYCOMB_MR2" since="13" />
+ <field name="ICE_CREAM_SANDWICH" since="14" />
+ <field name="ICE_CREAM_SANDWICH_MR1" since="15" />
+ <field name="JELLY_BEAN" since="16" />
+ <field name="JELLY_BEAN_MR1" since="17" />
+ <field name="JELLY_BEAN_MR2" since="18" />
+ <field name="KITKAT" since="19" />
+ <field name="KITKAT_WATCH" since="20" />
+ <field name="L" since="21" />
+ <field name="LOLLIPOP" since="21" />
+ </class>
+ <class name="android/os/Bundle" since="1">
+ <extends name="android/os/BaseBundle" since="21" />
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Landroid/os/Bundle;)V" />
+ <method name="&lt;init>(Landroid/os/PersistableBundle;)V" since="21" />
+ <method name="&lt;init>(Ljava/lang/ClassLoader;)V" />
+ <method name="clear()V" />
+ <method name="containsKey(Ljava/lang/String;)Z" />
+ <method name="get(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="getBinder(Ljava/lang/String;)Landroid/os/IBinder;" since="18" />
+ <method name="getBoolean(Ljava/lang/String;)Z" />
+ <method name="getBoolean(Ljava/lang/String;Z)Z" />
+ <method name="getBooleanArray(Ljava/lang/String;)[Z" />
+ <method name="getBundle(Ljava/lang/String;)Landroid/os/Bundle;" />
+ <method name="getByte(Ljava/lang/String;)B" />
+ <method name="getByte(Ljava/lang/String;B)Ljava/lang/Byte;" />
+ <method name="getByteArray(Ljava/lang/String;)[B" />
+ <method name="getChar(Ljava/lang/String;)C" />
+ <method name="getChar(Ljava/lang/String;C)C" />
+ <method name="getCharArray(Ljava/lang/String;)[C" />
+ <method name="getCharSequence(Ljava/lang/String;)Ljava/lang/CharSequence;" />
+ <method name="getCharSequence(Ljava/lang/String;Ljava/lang/CharSequence;)Ljava/lang/CharSequence;" since="12" />
+ <method name="getCharSequenceArray(Ljava/lang/String;)[Ljava/lang/CharSequence;" since="8" />
+ <method name="getCharSequenceArrayList(Ljava/lang/String;)Ljava/util/ArrayList;" since="8" />
+ <method name="getClassLoader()Ljava/lang/ClassLoader;" since="11" />
+ <method name="getDouble(Ljava/lang/String;)D" />
+ <method name="getDouble(Ljava/lang/String;D)D" />
+ <method name="getDoubleArray(Ljava/lang/String;)[D" />
+ <method name="getFloat(Ljava/lang/String;)F" />
+ <method name="getFloat(Ljava/lang/String;F)F" />
+ <method name="getFloatArray(Ljava/lang/String;)[F" />
+ <method name="getInt(Ljava/lang/String;)I" />
+ <method name="getInt(Ljava/lang/String;I)I" />
+ <method name="getIntArray(Ljava/lang/String;)[I" />
+ <method name="getIntegerArrayList(Ljava/lang/String;)Ljava/util/ArrayList;" />
+ <method name="getLong(Ljava/lang/String;)J" />
+ <method name="getLong(Ljava/lang/String;J)J" />
+ <method name="getLongArray(Ljava/lang/String;)[J" />
+ <method name="getParcelable(Ljava/lang/String;)Landroid/os/Parcelable;" />
+ <method name="getParcelableArray(Ljava/lang/String;)[Landroid/os/Parcelable;" />
+ <method name="getParcelableArrayList(Ljava/lang/String;)Ljava/util/ArrayList;" />
+ <method name="getSerializable(Ljava/lang/String;)Ljava/io/Serializable;" />
+ <method name="getShort(Ljava/lang/String;)S" />
+ <method name="getShort(Ljava/lang/String;S)S" />
+ <method name="getShortArray(Ljava/lang/String;)[S" />
+ <method name="getSize(Ljava/lang/String;)Landroid/util/Size;" since="21" />
+ <method name="getSizeF(Ljava/lang/String;)Landroid/util/SizeF;" since="21" />
+ <method name="getSparseParcelableArray(Ljava/lang/String;)Landroid/util/SparseArray;" />
+ <method name="getString(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" since="12" />
+ <method name="getStringArray(Ljava/lang/String;)[Ljava/lang/String;" />
+ <method name="getStringArrayList(Ljava/lang/String;)Ljava/util/ArrayList;" />
+ <method name="hasFileDescriptors()Z" />
+ <method name="isEmpty()Z" />
+ <method name="keySet()Ljava/util/Set;" />
+ <method name="putAll(Landroid/os/Bundle;)V" />
+ <method name="putBinder(Ljava/lang/String;Landroid/os/IBinder;)V" since="18" />
+ <method name="putBoolean(Ljava/lang/String;Z)V" />
+ <method name="putBooleanArray(Ljava/lang/String;[Z)V" />
+ <method name="putBundle(Ljava/lang/String;Landroid/os/Bundle;)V" />
+ <method name="putByte(Ljava/lang/String;B)V" />
+ <method name="putByteArray(Ljava/lang/String;[B)V" />
+ <method name="putChar(Ljava/lang/String;C)V" />
+ <method name="putCharArray(Ljava/lang/String;[C)V" />
+ <method name="putCharSequence(Ljava/lang/String;Ljava/lang/CharSequence;)V" />
+ <method name="putCharSequenceArray(Ljava/lang/String;[Ljava/lang/CharSequence;)V" since="8" />
+ <method name="putCharSequenceArrayList(Ljava/lang/String;Ljava/util/ArrayList;)V" since="8" />
+ <method name="putDouble(Ljava/lang/String;D)V" />
+ <method name="putDoubleArray(Ljava/lang/String;[D)V" />
+ <method name="putFloat(Ljava/lang/String;F)V" />
+ <method name="putFloatArray(Ljava/lang/String;[F)V" />
+ <method name="putInt(Ljava/lang/String;I)V" />
+ <method name="putIntArray(Ljava/lang/String;[I)V" />
+ <method name="putIntegerArrayList(Ljava/lang/String;Ljava/util/ArrayList;)V" />
+ <method name="putLong(Ljava/lang/String;J)V" />
+ <method name="putLongArray(Ljava/lang/String;[J)V" />
+ <method name="putParcelable(Ljava/lang/String;Landroid/os/Parcelable;)V" />
+ <method name="putParcelableArray(Ljava/lang/String;[Landroid/os/Parcelable;)V" />
+ <method name="putParcelableArrayList(Ljava/lang/String;Ljava/util/ArrayList;)V" />
+ <method name="putSerializable(Ljava/lang/String;Ljava/io/Serializable;)V" />
+ <method name="putShort(Ljava/lang/String;S)V" />
+ <method name="putShortArray(Ljava/lang/String;[S)V" />
+ <method name="putSize(Ljava/lang/String;Landroid/util/Size;)V" since="21" />
+ <method name="putSizeF(Ljava/lang/String;Landroid/util/SizeF;)V" since="21" />
+ <method name="putSparseParcelableArray(Ljava/lang/String;Landroid/util/SparseArray;)V" />
+ <method name="putString(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="putStringArray(Ljava/lang/String;[Ljava/lang/String;)V" />
+ <method name="putStringArrayList(Ljava/lang/String;Ljava/util/ArrayList;)V" />
+ <method name="readFromParcel(Landroid/os/Parcel;)V" />
+ <method name="remove(Ljava/lang/String;)V" />
+ <method name="setClassLoader(Ljava/lang/ClassLoader;)V" />
+ <method name="size()I" />
+ <field name="CREATOR" />
+ <field name="EMPTY" />
+ </class>
+ <class name="android/os/CancellationSignal" since="16">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="cancel()V" />
+ <method name="isCanceled()Z" />
+ <method name="setOnCancelListener(Landroid/os/CancellationSignal$OnCancelListener;)V" />
+ <method name="throwIfCanceled()V" />
+ </class>
+ <class name="android/os/CancellationSignal$OnCancelListener" since="16">
+ <extends name="java/lang/Object" />
+ <method name="onCancel()V" />
+ </class>
+ <class name="android/os/ConditionVariable" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Z)V" />
+ <method name="block()V" />
+ <method name="block(J)Z" />
+ <method name="close()V" />
+ <method name="open()V" />
+ </class>
+ <class name="android/os/CountDownTimer" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(JJ)V" />
+ <method name="cancel()V" />
+ <method name="onFinish()V" />
+ <method name="onTick(J)V" />
+ <method name="start()Landroid/os/CountDownTimer;" />
+ </class>
+ <class name="android/os/DeadObjectException" since="1">
+ <extends name="android/os/RemoteException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/os/Debug" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="changeDebugPort(I)V" />
+ <method name="dumpHprofData(Ljava/lang/String;)V" since="3" />
+ <method name="dumpService(Ljava/lang/String;Ljava/io/FileDescriptor;[Ljava/lang/String;)Z" since="8" />
+ <method name="enableEmulatorTraceOutput()V" />
+ <method name="getBinderDeathObjectCount()I" />
+ <method name="getBinderLocalObjectCount()I" />
+ <method name="getBinderProxyObjectCount()I" />
+ <method name="getBinderReceivedTransactions()I" />
+ <method name="getBinderSentTransactions()I" />
+ <method name="getGlobalAllocCount()I" />
+ <method name="getGlobalAllocSize()I" />
+ <method name="getGlobalClassInitCount()I" since="8" />
+ <method name="getGlobalClassInitTime()I" since="8" />
+ <method name="getGlobalExternalAllocCount()I" />
+ <method name="getGlobalExternalAllocSize()I" />
+ <method name="getGlobalExternalFreedCount()I" />
+ <method name="getGlobalExternalFreedSize()I" />
+ <method name="getGlobalFreedCount()I" />
+ <method name="getGlobalFreedSize()I" />
+ <method name="getGlobalGcInvocationCount()I" />
+ <method name="getLoadedClassCount()I" />
+ <method name="getMemoryInfo(Landroid/os/Debug$MemoryInfo;)V" />
+ <method name="getNativeHeapAllocatedSize()J" />
+ <method name="getNativeHeapFreeSize()J" />
+ <method name="getNativeHeapSize()J" />
+ <method name="getPss()J" since="14" />
+ <method name="getThreadAllocCount()I" />
+ <method name="getThreadAllocSize()I" />
+ <method name="getThreadExternalAllocCount()I" />
+ <method name="getThreadExternalAllocSize()I" />
+ <method name="getThreadGcInvocationCount()I" />
+ <method name="isDebuggerConnected()Z" />
+ <method name="printLoadedClasses(I)V" />
+ <method name="resetAllCounts()V" />
+ <method name="resetGlobalAllocCount()V" />
+ <method name="resetGlobalAllocSize()V" />
+ <method name="resetGlobalClassInitCount()V" since="8" />
+ <method name="resetGlobalClassInitTime()V" since="8" />
+ <method name="resetGlobalExternalAllocCount()V" />
+ <method name="resetGlobalExternalAllocSize()V" />
+ <method name="resetGlobalExternalFreedCount()V" />
+ <method name="resetGlobalExternalFreedSize()V" />
+ <method name="resetGlobalFreedCount()V" />
+ <method name="resetGlobalFreedSize()V" />
+ <method name="resetGlobalGcInvocationCount()V" />
+ <method name="resetThreadAllocCount()V" />
+ <method name="resetThreadAllocSize()V" />
+ <method name="resetThreadExternalAllocCount()V" />
+ <method name="resetThreadExternalAllocSize()V" />
+ <method name="resetThreadGcInvocationCount()V" />
+ <method name="setAllocationLimit(I)I" />
+ <method name="setGlobalAllocationLimit(I)I" />
+ <method name="startAllocCounting()V" />
+ <method name="startMethodTracing()V" />
+ <method name="startMethodTracing(Ljava/lang/String;)V" />
+ <method name="startMethodTracing(Ljava/lang/String;I)V" />
+ <method name="startMethodTracing(Ljava/lang/String;II)V" />
+ <method name="startMethodTracingSampling(Ljava/lang/String;II)V" since="21" />
+ <method name="startNativeTracing()V" />
+ <method name="stopAllocCounting()V" />
+ <method name="stopMethodTracing()V" />
+ <method name="stopNativeTracing()V" />
+ <method name="threadCpuTimeNanos()J" />
+ <method name="waitForDebugger()V" />
+ <method name="waitingForDebugger()Z" />
+ <field name="SHOW_CLASSLOADER" />
+ <field name="SHOW_FULL_DETAIL" />
+ <field name="SHOW_INITIALIZED" />
+ <field name="TRACE_COUNT_ALLOCS" />
+ </class>
+ <class name="android/os/Debug$InstructionCount" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="collect()Z" />
+ <method name="globalMethodInvocations()I" />
+ <method name="globalTotal()I" />
+ <method name="resetAndStart()Z" />
+ </class>
+ <class name="android/os/Debug$MemoryInfo" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" since="5" />
+ <method name="&lt;init>()V" />
+ <method name="getOtherLabel(I)Ljava/lang/String;" since="14" />
+ <method name="getOtherPrivateDirty(I)I" since="14" />
+ <method name="getOtherPss(I)I" since="14" />
+ <method name="getOtherSharedDirty(I)I" since="14" />
+ <method name="getTotalPrivateClean()I" since="19" />
+ <method name="getTotalPrivateDirty()I" since="5" />
+ <method name="getTotalPss()I" since="5" />
+ <method name="getTotalSharedClean()I" since="19" />
+ <method name="getTotalSharedDirty()I" since="5" />
+ <method name="getTotalSwappablePss()I" since="19" />
+ <method name="readFromParcel(Landroid/os/Parcel;)V" since="5" />
+ <field name="CREATOR" since="5" />
+ <field name="dalvikPrivateDirty" />
+ <field name="dalvikPss" />
+ <field name="dalvikSharedDirty" />
+ <field name="nativePrivateDirty" />
+ <field name="nativePss" />
+ <field name="nativeSharedDirty" />
+ <field name="otherPrivateDirty" />
+ <field name="otherPss" />
+ <field name="otherSharedDirty" />
+ </class>
+ <class name="android/os/DropBoxManager" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addData(Ljava/lang/String;[BI)V" />
+ <method name="addFile(Ljava/lang/String;Ljava/io/File;I)V" />
+ <method name="addText(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="getNextEntry(Ljava/lang/String;J)Landroid/os/DropBoxManager$Entry;" />
+ <method name="isTagEnabled(Ljava/lang/String;)Z" />
+ <field name="ACTION_DROPBOX_ENTRY_ADDED" since="11" />
+ <field name="EXTRA_TAG" since="11" />
+ <field name="EXTRA_TIME" since="11" />
+ <field name="IS_EMPTY" />
+ <field name="IS_GZIPPED" />
+ <field name="IS_TEXT" />
+ </class>
+ <class name="android/os/DropBoxManager$Entry" since="8">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <implements name="java/io/Closeable" since="9" />
+ <method name="&lt;init>(Ljava/lang/String;J)V" />
+ <method name="&lt;init>(Ljava/lang/String;JLandroid/os/ParcelFileDescriptor;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;JLjava/io/File;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;JLjava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;J[BI)V" />
+ <method name="close()V" />
+ <method name="getFlags()I" />
+ <method name="getInputStream()Ljava/io/InputStream;" />
+ <method name="getTag()Ljava/lang/String;" />
+ <method name="getText(I)Ljava/lang/String;" />
+ <method name="getTimeMillis()J" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/os/Environment" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getDataDirectory()Ljava/io/File;" />
+ <method name="getDownloadCacheDirectory()Ljava/io/File;" />
+ <method name="getExternalStorageDirectory()Ljava/io/File;" />
+ <method name="getExternalStoragePublicDirectory(Ljava/lang/String;)Ljava/io/File;" since="8" />
+ <method name="getExternalStorageState()Ljava/lang/String;" />
+ <method name="getExternalStorageState(Ljava/io/File;)Ljava/lang/String;" since="21" />
+ <method name="getRootDirectory()Ljava/io/File;" />
+ <method name="getStorageState(Ljava/io/File;)Ljava/lang/String;" since="19" />
+ <method name="isExternalStorageEmulated()Z" since="11" />
+ <method name="isExternalStorageEmulated(Ljava/io/File;)Z" since="21" />
+ <method name="isExternalStorageRemovable()Z" since="9" />
+ <method name="isExternalStorageRemovable(Ljava/io/File;)Z" since="21" />
+ <field name="DIRECTORY_ALARMS" since="8" />
+ <field name="DIRECTORY_DCIM" since="8" />
+ <field name="DIRECTORY_DOCUMENTS" since="19" />
+ <field name="DIRECTORY_DOWNLOADS" since="8" />
+ <field name="DIRECTORY_MOVIES" since="8" />
+ <field name="DIRECTORY_MUSIC" since="8" />
+ <field name="DIRECTORY_NOTIFICATIONS" since="8" />
+ <field name="DIRECTORY_PICTURES" since="8" />
+ <field name="DIRECTORY_PODCASTS" since="8" />
+ <field name="DIRECTORY_RINGTONES" since="8" />
+ <field name="MEDIA_BAD_REMOVAL" />
+ <field name="MEDIA_CHECKING" since="3" />
+ <field name="MEDIA_MOUNTED" />
+ <field name="MEDIA_MOUNTED_READ_ONLY" />
+ <field name="MEDIA_NOFS" since="3" />
+ <field name="MEDIA_REMOVED" />
+ <field name="MEDIA_SHARED" />
+ <field name="MEDIA_UNKNOWN" since="19" />
+ <field name="MEDIA_UNMOUNTABLE" />
+ <field name="MEDIA_UNMOUNTED" />
+ </class>
+ <class name="android/os/FileObserver" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;I)V" />
+ <method name="onEvent(ILjava/lang/String;)V" />
+ <method name="startWatching()V" />
+ <method name="stopWatching()V" />
+ <field name="ACCESS" />
+ <field name="ALL_EVENTS" />
+ <field name="ATTRIB" />
+ <field name="CLOSE_NOWRITE" />
+ <field name="CLOSE_WRITE" />
+ <field name="CREATE" />
+ <field name="DELETE" />
+ <field name="DELETE_SELF" />
+ <field name="MODIFY" />
+ <field name="MOVED_FROM" />
+ <field name="MOVED_TO" />
+ <field name="MOVE_SELF" />
+ <field name="OPEN" />
+ </class>
+ <class name="android/os/Handler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/os/Handler$Callback;)V" since="3" />
+ <method name="&lt;init>(Landroid/os/Looper;)V" />
+ <method name="&lt;init>(Landroid/os/Looper;Landroid/os/Handler$Callback;)V" since="3" />
+ <method name="dispatchMessage(Landroid/os/Message;)V" />
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V" />
+ <method name="getLooper()Landroid/os/Looper;" />
+ <method name="getMessageName(Landroid/os/Message;)Ljava/lang/String;" since="14" />
+ <method name="handleMessage(Landroid/os/Message;)V" />
+ <method name="hasMessages(I)Z" />
+ <method name="hasMessages(ILjava/lang/Object;)Z" />
+ <method name="obtainMessage()Landroid/os/Message;" />
+ <method name="obtainMessage(I)Landroid/os/Message;" />
+ <method name="obtainMessage(III)Landroid/os/Message;" />
+ <method name="obtainMessage(IIILjava/lang/Object;)Landroid/os/Message;" />
+ <method name="obtainMessage(ILjava/lang/Object;)Landroid/os/Message;" />
+ <method name="post(Ljava/lang/Runnable;)Z" />
+ <method name="postAtFrontOfQueue(Ljava/lang/Runnable;)Z" />
+ <method name="postAtTime(Ljava/lang/Runnable;J)Z" />
+ <method name="postAtTime(Ljava/lang/Runnable;Ljava/lang/Object;J)Z" />
+ <method name="postDelayed(Ljava/lang/Runnable;J)Z" />
+ <method name="removeCallbacks(Ljava/lang/Runnable;)V" />
+ <method name="removeCallbacks(Ljava/lang/Runnable;Ljava/lang/Object;)V" />
+ <method name="removeCallbacksAndMessages(Ljava/lang/Object;)V" />
+ <method name="removeMessages(I)V" />
+ <method name="removeMessages(ILjava/lang/Object;)V" />
+ <method name="sendEmptyMessage(I)Z" />
+ <method name="sendEmptyMessageAtTime(IJ)Z" />
+ <method name="sendEmptyMessageDelayed(IJ)Z" />
+ <method name="sendMessage(Landroid/os/Message;)Z" />
+ <method name="sendMessageAtFrontOfQueue(Landroid/os/Message;)Z" />
+ <method name="sendMessageAtTime(Landroid/os/Message;J)Z" />
+ <method name="sendMessageDelayed(Landroid/os/Message;J)Z" />
+ </class>
+ <class name="android/os/Handler$Callback" since="3">
+ <extends name="java/lang/Object" />
+ <method name="handleMessage(Landroid/os/Message;)Z" />
+ </class>
+ <class name="android/os/HandlerThread" since="1">
+ <extends name="java/lang/Thread" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;I)V" />
+ <method name="getLooper()Landroid/os/Looper;" />
+ <method name="getThreadId()I" />
+ <method name="onLooperPrepared()V" />
+ <method name="quit()Z" since="5" />
+ <method name="quitSafely()Z" since="18" />
+ </class>
+ <class name="android/os/IBinder" since="1">
+ <extends name="java/lang/Object" />
+ <method name="dump(Ljava/io/FileDescriptor;[Ljava/lang/String;)V" since="3" />
+ <method name="dumpAsync(Ljava/io/FileDescriptor;[Ljava/lang/String;)V" since="13" />
+ <method name="getInterfaceDescriptor()Ljava/lang/String;" />
+ <method name="isBinderAlive()Z" />
+ <method name="linkToDeath(Landroid/os/IBinder$DeathRecipient;I)V" />
+ <method name="pingBinder()Z" />
+ <method name="queryLocalInterface(Ljava/lang/String;)Landroid/os/IInterface;" />
+ <method name="transact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z" />
+ <method name="unlinkToDeath(Landroid/os/IBinder$DeathRecipient;I)Z" />
+ <field name="DUMP_TRANSACTION" />
+ <field name="FIRST_CALL_TRANSACTION" />
+ <field name="FLAG_ONEWAY" />
+ <field name="INTERFACE_TRANSACTION" />
+ <field name="LAST_CALL_TRANSACTION" />
+ <field name="LIKE_TRANSACTION" since="15" />
+ <field name="PING_TRANSACTION" />
+ <field name="TWEET_TRANSACTION" since="13" />
+ </class>
+ <class name="android/os/IBinder$DeathRecipient" since="1">
+ <extends name="java/lang/Object" />
+ <method name="binderDied()V" />
+ </class>
+ <class name="android/os/IInterface" since="1">
+ <extends name="java/lang/Object" />
+ <method name="asBinder()Landroid/os/IBinder;" />
+ </class>
+ <class name="android/os/Looper" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V" />
+ <method name="getMainLooper()Landroid/os/Looper;" />
+ <method name="getThread()Ljava/lang/Thread;" since="3" />
+ <method name="loop()V" />
+ <method name="myLooper()Landroid/os/Looper;" />
+ <method name="myQueue()Landroid/os/MessageQueue;" />
+ <method name="prepare()V" />
+ <method name="prepareMainLooper()V" />
+ <method name="quit()V" />
+ <method name="quitSafely()V" since="18" />
+ <method name="setMessageLogging(Landroid/util/Printer;)V" />
+ </class>
+ <class name="android/os/MemoryFile" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;I)V" />
+ <method name="allowPurging(Z)Z" />
+ <method name="close()V" />
+ <method name="getInputStream()Ljava/io/InputStream;" />
+ <method name="getOutputStream()Ljava/io/OutputStream;" />
+ <method name="isPurgingAllowed()Z" />
+ <method name="length()I" />
+ <method name="readBytes([BIII)I" />
+ <method name="writeBytes([BIII)V" />
+ </class>
+ <class name="android/os/Message" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="copyFrom(Landroid/os/Message;)V" />
+ <method name="getCallback()Ljava/lang/Runnable;" />
+ <method name="getData()Landroid/os/Bundle;" />
+ <method name="getTarget()Landroid/os/Handler;" />
+ <method name="getWhen()J" />
+ <method name="obtain()Landroid/os/Message;" />
+ <method name="obtain(Landroid/os/Handler;)Landroid/os/Message;" />
+ <method name="obtain(Landroid/os/Handler;I)Landroid/os/Message;" />
+ <method name="obtain(Landroid/os/Handler;III)Landroid/os/Message;" />
+ <method name="obtain(Landroid/os/Handler;IIILjava/lang/Object;)Landroid/os/Message;" />
+ <method name="obtain(Landroid/os/Handler;ILjava/lang/Object;)Landroid/os/Message;" />
+ <method name="obtain(Landroid/os/Handler;Ljava/lang/Runnable;)Landroid/os/Message;" />
+ <method name="obtain(Landroid/os/Message;)Landroid/os/Message;" />
+ <method name="peekData()Landroid/os/Bundle;" />
+ <method name="recycle()V" />
+ <method name="sendToTarget()V" />
+ <method name="setData(Landroid/os/Bundle;)V" />
+ <method name="setTarget(Landroid/os/Handler;)V" />
+ <field name="CREATOR" />
+ <field name="arg1" />
+ <field name="arg2" />
+ <field name="obj" />
+ <field name="replyTo" />
+ <field name="sendingUid" since="21" />
+ <field name="what" />
+ </class>
+ <class name="android/os/MessageQueue" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addIdleHandler(Landroid/os/MessageQueue$IdleHandler;)V" />
+ <method name="removeIdleHandler(Landroid/os/MessageQueue$IdleHandler;)V" />
+ </class>
+ <class name="android/os/MessageQueue$IdleHandler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="queueIdle()Z" />
+ </class>
+ <class name="android/os/Messenger" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/os/Handler;)V" />
+ <method name="&lt;init>(Landroid/os/IBinder;)V" />
+ <method name="getBinder()Landroid/os/IBinder;" />
+ <method name="readMessengerOrNullFromParcel(Landroid/os/Parcel;)Landroid/os/Messenger;" />
+ <method name="send(Landroid/os/Message;)V" />
+ <method name="writeMessengerOrNullToParcel(Landroid/os/Messenger;Landroid/os/Parcel;)V" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/os/NetworkOnMainThreadException" since="11">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/os/OperationCanceledException" since="16">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/os/Parcel" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="appendFrom(Landroid/os/Parcel;II)V" />
+ <method name="createBinderArray()[Landroid/os/IBinder;" />
+ <method name="createBinderArrayList()Ljava/util/ArrayList;" />
+ <method name="createBooleanArray()[Z" />
+ <method name="createByteArray()[B" />
+ <method name="createCharArray()[C" />
+ <method name="createDoubleArray()[D" />
+ <method name="createFloatArray()[F" />
+ <method name="createIntArray()[I" />
+ <method name="createLongArray()[J" />
+ <method name="createStringArray()[Ljava/lang/String;" />
+ <method name="createStringArrayList()Ljava/util/ArrayList;" />
+ <method name="createTypedArray(Landroid/os/Parcelable$Creator;)[Ljava/lang/Object;" />
+ <method name="createTypedArrayList(Landroid/os/Parcelable$Creator;)Ljava/util/ArrayList;" />
+ <method name="dataAvail()I" />
+ <method name="dataCapacity()I" />
+ <method name="dataPosition()I" />
+ <method name="dataSize()I" />
+ <method name="enforceInterface(Ljava/lang/String;)V" />
+ <method name="hasFileDescriptors()Z" />
+ <method name="marshall()[B" />
+ <method name="obtain()Landroid/os/Parcel;" />
+ <method name="obtain(I)Landroid/os/Parcel;" />
+ <method name="readArray(Ljava/lang/ClassLoader;)[Ljava/lang/Object;" />
+ <method name="readArrayList(Ljava/lang/ClassLoader;)Ljava/util/ArrayList;" />
+ <method name="readBinderArray([Landroid/os/IBinder;)V" />
+ <method name="readBinderList(Ljava/util/List;)V" />
+ <method name="readBooleanArray([Z)V" />
+ <method name="readBundle()Landroid/os/Bundle;" />
+ <method name="readBundle(Ljava/lang/ClassLoader;)Landroid/os/Bundle;" />
+ <method name="readByte()B" />
+ <method name="readByteArray([B)V" />
+ <method name="readCharArray([C)V" />
+ <method name="readDouble()D" />
+ <method name="readDoubleArray([D)V" />
+ <method name="readException()V" />
+ <method name="readException(ILjava/lang/String;)V" />
+ <method name="readFileDescriptor()Landroid/os/ParcelFileDescriptor;" />
+ <method name="readFloat()F" />
+ <method name="readFloatArray([F)V" />
+ <method name="readHashMap(Ljava/lang/ClassLoader;)Ljava/util/HashMap;" />
+ <method name="readInt()I" />
+ <method name="readIntArray([I)V" />
+ <method name="readList(Ljava/util/List;Ljava/lang/ClassLoader;)V" />
+ <method name="readLong()J" />
+ <method name="readLongArray([J)V" />
+ <method name="readMap(Ljava/util/Map;Ljava/lang/ClassLoader;)V" />
+ <method name="readParcelable(Ljava/lang/ClassLoader;)Landroid/os/Parcelable;" />
+ <method name="readParcelableArray(Ljava/lang/ClassLoader;)[Landroid/os/Parcelable;" />
+ <method name="readPersistableBundle()Landroid/os/PersistableBundle;" since="21" />
+ <method name="readPersistableBundle(Ljava/lang/ClassLoader;)Landroid/os/PersistableBundle;" since="21" />
+ <method name="readSerializable()Ljava/io/Serializable;" />
+ <method name="readSize()Landroid/util/Size;" since="21" />
+ <method name="readSizeF()Landroid/util/SizeF;" since="21" />
+ <method name="readSparseArray(Ljava/lang/ClassLoader;)Landroid/util/SparseArray;" />
+ <method name="readSparseBooleanArray()Landroid/util/SparseBooleanArray;" />
+ <method name="readString()Ljava/lang/String;" />
+ <method name="readStringArray([Ljava/lang/String;)V" />
+ <method name="readStringList(Ljava/util/List;)V" />
+ <method name="readStrongBinder()Landroid/os/IBinder;" />
+ <method name="readTypedArray([Ljava/lang/Object;Landroid/os/Parcelable$Creator;)V" />
+ <method name="readTypedList(Ljava/util/List;Landroid/os/Parcelable$Creator;)V" />
+ <method name="readValue(Ljava/lang/ClassLoader;)Ljava/lang/Object;" />
+ <method name="recycle()V" />
+ <method name="setDataCapacity(I)V" />
+ <method name="setDataPosition(I)V" />
+ <method name="setDataSize(I)V" />
+ <method name="unmarshall([BII)V" />
+ <method name="writeArray([Ljava/lang/Object;)V" />
+ <method name="writeBinderArray([Landroid/os/IBinder;)V" />
+ <method name="writeBinderList(Ljava/util/List;)V" />
+ <method name="writeBooleanArray([Z)V" />
+ <method name="writeBundle(Landroid/os/Bundle;)V" />
+ <method name="writeByte(B)V" />
+ <method name="writeByteArray([B)V" />
+ <method name="writeByteArray([BII)V" />
+ <method name="writeCharArray([C)V" />
+ <method name="writeDouble(D)V" />
+ <method name="writeDoubleArray([D)V" />
+ <method name="writeException(Ljava/lang/Exception;)V" />
+ <method name="writeFileDescriptor(Ljava/io/FileDescriptor;)V" />
+ <method name="writeFloat(F)V" />
+ <method name="writeFloatArray([F)V" />
+ <method name="writeInt(I)V" />
+ <method name="writeIntArray([I)V" />
+ <method name="writeInterfaceToken(Ljava/lang/String;)V" />
+ <method name="writeList(Ljava/util/List;)V" />
+ <method name="writeLong(J)V" />
+ <method name="writeLongArray([J)V" />
+ <method name="writeMap(Ljava/util/Map;)V" />
+ <method name="writeNoException()V" />
+ <method name="writeParcelable(Landroid/os/Parcelable;I)V" />
+ <method name="writeParcelableArray([Landroid/os/Parcelable;I)V" />
+ <method name="writePersistableBundle(Landroid/os/PersistableBundle;)V" since="21" />
+ <method name="writeSerializable(Ljava/io/Serializable;)V" />
+ <method name="writeSize(Landroid/util/Size;)V" since="21" />
+ <method name="writeSizeF(Landroid/util/SizeF;)V" since="21" />
+ <method name="writeSparseArray(Landroid/util/SparseArray;)V" />
+ <method name="writeSparseBooleanArray(Landroid/util/SparseBooleanArray;)V" />
+ <method name="writeString(Ljava/lang/String;)V" />
+ <method name="writeStringArray([Ljava/lang/String;)V" />
+ <method name="writeStringList(Ljava/util/List;)V" />
+ <method name="writeStrongBinder(Landroid/os/IBinder;)V" />
+ <method name="writeStrongInterface(Landroid/os/IInterface;)V" />
+ <method name="writeTypedArray([Landroid/os/Parcelable;I)V" />
+ <method name="writeTypedList(Ljava/util/List;)V" />
+ <method name="writeValue(Ljava/lang/Object;)V" />
+ <field name="STRING_CREATOR" />
+ </class>
+ <class name="android/os/ParcelFileDescriptor" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <implements name="java/io/Closeable" since="16" />
+ <method name="&lt;init>(Landroid/os/ParcelFileDescriptor;)V" />
+ <method name="adoptFd(I)Landroid/os/ParcelFileDescriptor;" since="13" />
+ <method name="canDetectErrors()Z" since="19" />
+ <method name="checkError()V" since="19" />
+ <method name="close()V" />
+ <method name="closeWithError(Ljava/lang/String;)V" since="19" />
+ <method name="createPipe()[Landroid/os/ParcelFileDescriptor;" since="9" />
+ <method name="createReliablePipe()[Landroid/os/ParcelFileDescriptor;" since="19" />
+ <method name="createReliableSocketPair()[Landroid/os/ParcelFileDescriptor;" since="19" />
+ <method name="createSocketPair()[Landroid/os/ParcelFileDescriptor;" since="19" />
+ <method name="detachFd()I" since="12" />
+ <method name="dup()Landroid/os/ParcelFileDescriptor;" since="14" />
+ <method name="dup(Ljava/io/FileDescriptor;)Landroid/os/ParcelFileDescriptor;" since="13" />
+ <method name="fromDatagramSocket(Ljava/net/DatagramSocket;)Landroid/os/ParcelFileDescriptor;" since="14" />
+ <method name="fromFd(I)Landroid/os/ParcelFileDescriptor;" since="13" />
+ <method name="fromSocket(Ljava/net/Socket;)Landroid/os/ParcelFileDescriptor;" />
+ <method name="getFd()I" since="12" />
+ <method name="getFileDescriptor()Ljava/io/FileDescriptor;" />
+ <method name="getStatSize()J" since="3" />
+ <method name="open(Ljava/io/File;I)Landroid/os/ParcelFileDescriptor;" />
+ <method name="open(Ljava/io/File;ILandroid/os/Handler;Landroid/os/ParcelFileDescriptor$OnCloseListener;)Landroid/os/ParcelFileDescriptor;" since="19" />
+ <method name="parseMode(Ljava/lang/String;)I" since="19" />
+ <field name="CREATOR" />
+ <field name="MODE_APPEND" since="3" />
+ <field name="MODE_CREATE" />
+ <field name="MODE_READ_ONLY" />
+ <field name="MODE_READ_WRITE" />
+ <field name="MODE_TRUNCATE" />
+ <field name="MODE_WORLD_READABLE" />
+ <field name="MODE_WORLD_WRITEABLE" />
+ <field name="MODE_WRITE_ONLY" />
+ </class>
+ <class name="android/os/ParcelFileDescriptor$AutoCloseInputStream" since="1">
+ <extends name="java/io/FileInputStream" />
+ <method name="&lt;init>(Landroid/os/ParcelFileDescriptor;)V" />
+ </class>
+ <class name="android/os/ParcelFileDescriptor$AutoCloseOutputStream" since="1">
+ <extends name="java/io/FileOutputStream" />
+ <method name="&lt;init>(Landroid/os/ParcelFileDescriptor;)V" />
+ </class>
+ <class name="android/os/ParcelFileDescriptor$FileDescriptorDetachedException" since="19">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/os/ParcelFileDescriptor$OnCloseListener" since="19">
+ <extends name="java/lang/Object" />
+ <method name="onClose(Ljava/io/IOException;)V" />
+ </class>
+ <class name="android/os/ParcelFormatException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/os/ParcelUuid" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Ljava/util/UUID;)V" />
+ <method name="fromString(Ljava/lang/String;)Landroid/os/ParcelUuid;" />
+ <method name="getUuid()Ljava/util/UUID;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/os/Parcelable" since="1">
+ <extends name="java/lang/Object" />
+ <method name="describeContents()I" />
+ <method name="writeToParcel(Landroid/os/Parcel;I)V" />
+ <field name="CONTENTS_FILE_DESCRIPTOR" />
+ <field name="PARCELABLE_WRITE_RETURN_VALUE" />
+ </class>
+ <class name="android/os/Parcelable$ClassLoaderCreator" since="13">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable$Creator" />
+ <method name="createFromParcel(Landroid/os/Parcel;Ljava/lang/ClassLoader;)Ljava/lang/Object;" />
+ </class>
+ <class name="android/os/Parcelable$Creator" since="1">
+ <extends name="java/lang/Object" />
+ <method name="createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;" />
+ <method name="newArray(I)[Ljava/lang/Object;" />
+ </class>
+ <class name="android/os/PatternMatcher" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="&lt;init>(Ljava/lang/String;I)V" />
+ <method name="getPath()Ljava/lang/String;" />
+ <method name="getType()I" />
+ <method name="match(Ljava/lang/String;)Z" />
+ <field name="CREATOR" />
+ <field name="PATTERN_LITERAL" />
+ <field name="PATTERN_PREFIX" />
+ <field name="PATTERN_SIMPLE_GLOB" />
+ </class>
+ <class name="android/os/PersistableBundle" since="21">
+ <extends name="android/os/BaseBundle" />
+ <implements name="android/os/Parcelable" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Landroid/os/PersistableBundle;)V" />
+ <method name="getPersistableBundle(Ljava/lang/String;)Landroid/os/PersistableBundle;" />
+ <method name="putPersistableBundle(Ljava/lang/String;Landroid/os/PersistableBundle;)V" />
+ <field name="CREATOR" />
+ <field name="EMPTY" />
+ </class>
+ <class name="android/os/PowerManager" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="goToSleep(J)V" />
+ <method name="isInteractive()Z" since="20" />
+ <method name="isPowerSaveMode()Z" since="21" />
+ <method name="isScreenOn()Z" since="7" />
+ <method name="isWakeLockLevelSupported(I)Z" since="21" />
+ <method name="newWakeLock(ILjava/lang/String;)Landroid/os/PowerManager$WakeLock;" />
+ <method name="reboot(Ljava/lang/String;)V" since="8" />
+ <method name="userActivity(JZ)V" />
+ <method name="wakeUp(J)V" since="17" />
+ <field name="ACQUIRE_CAUSES_WAKEUP" />
+ <field name="ACTION_POWER_SAVE_MODE_CHANGED" since="21" />
+ <field name="FULL_WAKE_LOCK" />
+ <field name="ON_AFTER_RELEASE" />
+ <field name="PARTIAL_WAKE_LOCK" />
+ <field name="PROXIMITY_SCREEN_OFF_WAKE_LOCK" since="21" />
+ <field name="RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY" since="21" />
+ <field name="SCREEN_BRIGHT_WAKE_LOCK" />
+ <field name="SCREEN_DIM_WAKE_LOCK" />
+ </class>
+ <class name="android/os/PowerManager$WakeLock" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/os/PowerManager;)V" />
+ <method name="acquire()V" />
+ <method name="acquire(J)V" />
+ <method name="isHeld()Z" />
+ <method name="release()V" />
+ <method name="release(I)V" since="21" />
+ <method name="setReferenceCounted(Z)V" />
+ <method name="setWorkSource(Landroid/os/WorkSource;)V" since="9" />
+ </class>
+ <class name="android/os/Process" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getElapsedCpuTime()J" />
+ <method name="getGidForName(Ljava/lang/String;)I" />
+ <method name="getThreadPriority(I)I" />
+ <method name="getUidForName(Ljava/lang/String;)I" />
+ <method name="killProcess(I)V" />
+ <method name="myPid()I" />
+ <method name="myTid()I" />
+ <method name="myUid()I" since="2" />
+ <method name="myUserHandle()Landroid/os/UserHandle;" since="17" />
+ <method name="sendSignal(II)V" />
+ <method name="setThreadPriority(I)V" />
+ <method name="setThreadPriority(II)V" />
+ <method name="supportsProcesses()Z" />
+ <field name="BLUETOOTH_GID" />
+ <field name="FIRST_APPLICATION_UID" />
+ <field name="LAST_APPLICATION_UID" />
+ <field name="PHONE_UID" />
+ <field name="SIGNAL_KILL" />
+ <field name="SIGNAL_QUIT" />
+ <field name="SIGNAL_USR1" />
+ <field name="SYSTEM_UID" />
+ <field name="THREAD_PRIORITY_AUDIO" />
+ <field name="THREAD_PRIORITY_BACKGROUND" />
+ <field name="THREAD_PRIORITY_DEFAULT" />
+ <field name="THREAD_PRIORITY_DISPLAY" />
+ <field name="THREAD_PRIORITY_FOREGROUND" />
+ <field name="THREAD_PRIORITY_LESS_FAVORABLE" />
+ <field name="THREAD_PRIORITY_LOWEST" />
+ <field name="THREAD_PRIORITY_MORE_FAVORABLE" />
+ <field name="THREAD_PRIORITY_URGENT_AUDIO" />
+ <field name="THREAD_PRIORITY_URGENT_DISPLAY" />
+ </class>
+ <class name="android/os/RecoverySystem" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="installPackage(Landroid/content/Context;Ljava/io/File;)V" />
+ <method name="rebootWipeCache(Landroid/content/Context;)V" since="14" />
+ <method name="rebootWipeUserData(Landroid/content/Context;)V" />
+ <method name="verifyPackage(Ljava/io/File;Landroid/os/RecoverySystem$ProgressListener;Ljava/io/File;)V" />
+ </class>
+ <class name="android/os/RecoverySystem$ProgressListener" since="8">
+ <extends name="java/lang/Object" />
+ <method name="onProgress(I)V" />
+ </class>
+ <class name="android/os/RemoteCallbackList" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="beginBroadcast()I" />
+ <method name="finishBroadcast()V" />
+ <method name="getBroadcastCookie(I)Ljava/lang/Object;" since="4" />
+ <method name="getBroadcastItem(I)Landroid/os/IInterface;" />
+ <method name="getRegisteredCallbackCount()I" since="17" />
+ <method name="kill()V" />
+ <method name="onCallbackDied(Landroid/os/IInterface;)V" />
+ <method name="onCallbackDied(Landroid/os/IInterface;Ljava/lang/Object;)V" since="4" />
+ <method name="register(Landroid/os/IInterface;)Z" />
+ <method name="register(Landroid/os/IInterface;Ljava/lang/Object;)Z" since="4" />
+ <method name="unregister(Landroid/os/IInterface;)Z" />
+ </class>
+ <class name="android/os/RemoteException" since="1">
+ <extends name="android/util/AndroidException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" since="15" />
+ </class>
+ <class name="android/os/ResultReceiver" since="3">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/os/Handler;)V" />
+ <method name="onReceiveResult(ILandroid/os/Bundle;)V" />
+ <method name="send(ILandroid/os/Bundle;)V" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/os/StatFs" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getAvailableBlocks()I" />
+ <method name="getAvailableBlocksLong()J" since="18" />
+ <method name="getAvailableBytes()J" since="18" />
+ <method name="getBlockCount()I" />
+ <method name="getBlockCountLong()J" since="18" />
+ <method name="getBlockSize()I" />
+ <method name="getBlockSizeLong()J" since="18" />
+ <method name="getFreeBlocks()I" />
+ <method name="getFreeBlocksLong()J" since="18" />
+ <method name="getFreeBytes()J" since="18" />
+ <method name="getTotalBytes()J" since="18" />
+ <method name="restat(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/os/StrictMode" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="allowThreadDiskReads()Landroid/os/StrictMode$ThreadPolicy;" />
+ <method name="allowThreadDiskWrites()Landroid/os/StrictMode$ThreadPolicy;" />
+ <method name="enableDefaults()V" />
+ <method name="getThreadPolicy()Landroid/os/StrictMode$ThreadPolicy;" />
+ <method name="getVmPolicy()Landroid/os/StrictMode$VmPolicy;" />
+ <method name="noteSlowCall(Ljava/lang/String;)V" since="11" />
+ <method name="setThreadPolicy(Landroid/os/StrictMode$ThreadPolicy;)V" />
+ <method name="setVmPolicy(Landroid/os/StrictMode$VmPolicy;)V" />
+ </class>
+ <class name="android/os/StrictMode$ThreadPolicy" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="LAX" />
+ </class>
+ <class name="android/os/StrictMode$ThreadPolicy$Builder" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/os/StrictMode$ThreadPolicy;)V" />
+ <method name="build()Landroid/os/StrictMode$ThreadPolicy;" />
+ <method name="detectAll()Landroid/os/StrictMode$ThreadPolicy$Builder;" />
+ <method name="detectCustomSlowCalls()Landroid/os/StrictMode$ThreadPolicy$Builder;" since="11" />
+ <method name="detectDiskReads()Landroid/os/StrictMode$ThreadPolicy$Builder;" />
+ <method name="detectDiskWrites()Landroid/os/StrictMode$ThreadPolicy$Builder;" />
+ <method name="detectNetwork()Landroid/os/StrictMode$ThreadPolicy$Builder;" />
+ <method name="penaltyDeath()Landroid/os/StrictMode$ThreadPolicy$Builder;" />
+ <method name="penaltyDeathOnNetwork()Landroid/os/StrictMode$ThreadPolicy$Builder;" since="11" />
+ <method name="penaltyDialog()Landroid/os/StrictMode$ThreadPolicy$Builder;" />
+ <method name="penaltyDropBox()Landroid/os/StrictMode$ThreadPolicy$Builder;" />
+ <method name="penaltyFlashScreen()Landroid/os/StrictMode$ThreadPolicy$Builder;" since="11" />
+ <method name="penaltyLog()Landroid/os/StrictMode$ThreadPolicy$Builder;" />
+ <method name="permitAll()Landroid/os/StrictMode$ThreadPolicy$Builder;" />
+ <method name="permitCustomSlowCalls()Landroid/os/StrictMode$ThreadPolicy$Builder;" since="11" />
+ <method name="permitDiskReads()Landroid/os/StrictMode$ThreadPolicy$Builder;" />
+ <method name="permitDiskWrites()Landroid/os/StrictMode$ThreadPolicy$Builder;" />
+ <method name="permitNetwork()Landroid/os/StrictMode$ThreadPolicy$Builder;" />
+ </class>
+ <class name="android/os/StrictMode$VmPolicy" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="LAX" />
+ </class>
+ <class name="android/os/StrictMode$VmPolicy$Builder" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/os/StrictMode$VmPolicy;)V" since="11" />
+ <method name="build()Landroid/os/StrictMode$VmPolicy;" />
+ <method name="detectActivityLeaks()Landroid/os/StrictMode$VmPolicy$Builder;" since="11" />
+ <method name="detectAll()Landroid/os/StrictMode$VmPolicy$Builder;" />
+ <method name="detectFileUriExposure()Landroid/os/StrictMode$VmPolicy$Builder;" since="18" />
+ <method name="detectLeakedClosableObjects()Landroid/os/StrictMode$VmPolicy$Builder;" since="11" />
+ <method name="detectLeakedRegistrationObjects()Landroid/os/StrictMode$VmPolicy$Builder;" since="16" />
+ <method name="detectLeakedSqlLiteObjects()Landroid/os/StrictMode$VmPolicy$Builder;" />
+ <method name="penaltyDeath()Landroid/os/StrictMode$VmPolicy$Builder;" />
+ <method name="penaltyDropBox()Landroid/os/StrictMode$VmPolicy$Builder;" />
+ <method name="penaltyLog()Landroid/os/StrictMode$VmPolicy$Builder;" />
+ <method name="setClassInstanceLimit(Ljava/lang/Class;I)Landroid/os/StrictMode$VmPolicy$Builder;" since="11" />
+ </class>
+ <class name="android/os/SystemClock" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="currentThreadTimeMillis()J" />
+ <method name="elapsedRealtime()J" />
+ <method name="elapsedRealtimeNanos()J" since="17" />
+ <method name="setCurrentTimeMillis(J)Z" />
+ <method name="sleep(J)V" />
+ <method name="uptimeMillis()J" />
+ </class>
+ <class name="android/os/TokenWatcher" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/os/Handler;Ljava/lang/String;)V" />
+ <method name="acquire(Landroid/os/IBinder;Ljava/lang/String;)V" />
+ <method name="acquired()V" />
+ <method name="cleanup(Landroid/os/IBinder;Z)V" />
+ <method name="dump()V" />
+ <method name="dump(Ljava/io/PrintWriter;)V" since="16" />
+ <method name="isAcquired()Z" />
+ <method name="release(Landroid/os/IBinder;)V" />
+ <method name="released()V" />
+ </class>
+ <class name="android/os/Trace" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="beginSection(Ljava/lang/String;)V" />
+ <method name="endSection()V" />
+ </class>
+ <class name="android/os/TransactionTooLargeException" since="15">
+ <extends name="android/os/RemoteException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/os/UserHandle" since="17">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="readFromParcel(Landroid/os/Parcel;)Landroid/os/UserHandle;" />
+ <method name="writeToParcel(Landroid/os/UserHandle;Landroid/os/Parcel;)V" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/os/UserManager" since="17">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getApplicationRestrictions(Ljava/lang/String;)Landroid/os/Bundle;" since="18" />
+ <method name="getSerialNumberForUser(Landroid/os/UserHandle;)J" />
+ <method name="getUserCount()I" />
+ <method name="getUserForSerialNumber(J)Landroid/os/UserHandle;" />
+ <method name="getUserName()Ljava/lang/String;" />
+ <method name="getUserProfiles()Ljava/util/List;" since="21" />
+ <method name="getUserRestrictions()Landroid/os/Bundle;" since="18" />
+ <method name="getUserRestrictions(Landroid/os/UserHandle;)Landroid/os/Bundle;" since="18" />
+ <method name="hasUserRestriction(Ljava/lang/String;)Z" since="21" />
+ <method name="isUserAGoat()Z" />
+ <method name="isUserRunning(Landroid/os/UserHandle;)Z" />
+ <method name="isUserRunningOrStopping(Landroid/os/UserHandle;)Z" />
+ <method name="setRestrictionsChallenge(Ljava/lang/String;)Z" since="19" />
+ <method name="setUserRestriction(Ljava/lang/String;Z)V" since="18" />
+ <method name="setUserRestrictions(Landroid/os/Bundle;)V" since="18" />
+ <method name="setUserRestrictions(Landroid/os/Bundle;Landroid/os/UserHandle;)V" since="18" />
+ <field name="DISALLOW_ADD_USER" since="21" />
+ <field name="DISALLOW_ADJUST_VOLUME" since="21" />
+ <field name="DISALLOW_APPS_CONTROL" since="21" />
+ <field name="DISALLOW_CONFIG_BLUETOOTH" since="18" />
+ <field name="DISALLOW_CONFIG_CELL_BROADCASTS" since="21" />
+ <field name="DISALLOW_CONFIG_CREDENTIALS" since="18" />
+ <field name="DISALLOW_CONFIG_MOBILE_NETWORKS" since="21" />
+ <field name="DISALLOW_CONFIG_TETHERING" since="21" />
+ <field name="DISALLOW_CONFIG_VPN" since="21" />
+ <field name="DISALLOW_CONFIG_WIFI" since="18" />
+ <field name="DISALLOW_CREATE_WINDOWS" since="21" />
+ <field name="DISALLOW_CROSS_PROFILE_COPY_PASTE" since="21" />
+ <field name="DISALLOW_DEBUGGING_FEATURES" since="21" />
+ <field name="DISALLOW_FACTORY_RESET" since="21" />
+ <field name="DISALLOW_INSTALL_APPS" since="18" />
+ <field name="DISALLOW_INSTALL_UNKNOWN_SOURCES" since="18" />
+ <field name="DISALLOW_MODIFY_ACCOUNTS" since="18" />
+ <field name="DISALLOW_MOUNT_PHYSICAL_MEDIA" since="21" />
+ <field name="DISALLOW_OUTGOING_BEAM" since="21" />
+ <field name="DISALLOW_OUTGOING_CALLS" since="21" />
+ <field name="DISALLOW_REMOVE_USER" since="18" />
+ <field name="DISALLOW_SHARE_LOCATION" since="18" />
+ <field name="DISALLOW_SMS" since="21" />
+ <field name="DISALLOW_UNINSTALL_APPS" since="18" />
+ <field name="DISALLOW_UNMUTE_MICROPHONE" since="21" />
+ <field name="DISALLOW_USB_FILE_TRANSFER" since="18" />
+ <field name="ENSURE_VERIFY_APPS" since="21" />
+ </class>
+ <class name="android/os/Vibrator" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="cancel()V" />
+ <method name="hasVibrator()Z" since="11" />
+ <method name="vibrate(J)V" />
+ <method name="vibrate(JLandroid/media/AudioAttributes;)V" since="21" />
+ <method name="vibrate([JI)V" />
+ <method name="vibrate([JILandroid/media/AudioAttributes;)V" since="21" />
+ </class>
+ <class name="android/os/WorkSource" since="9">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/os/WorkSource;)V" />
+ <method name="add(Landroid/os/WorkSource;)Z" />
+ <method name="clear()V" />
+ <method name="diff(Landroid/os/WorkSource;)Z" />
+ <method name="remove(Landroid/os/WorkSource;)Z" />
+ <method name="set(Landroid/os/WorkSource;)V" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/os/storage/OnObbStateChangeListener" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onObbStateChange(Ljava/lang/String;I)V" />
+ <field name="ERROR_ALREADY_MOUNTED" />
+ <field name="ERROR_COULD_NOT_MOUNT" />
+ <field name="ERROR_COULD_NOT_UNMOUNT" />
+ <field name="ERROR_INTERNAL" />
+ <field name="ERROR_NOT_MOUNTED" />
+ <field name="ERROR_PERMISSION_DENIED" />
+ <field name="MOUNTED" />
+ <field name="UNMOUNTED" />
+ </class>
+ <class name="android/os/storage/StorageManager" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getMountedObbPath(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="isObbMounted(Ljava/lang/String;)Z" />
+ <method name="mountObb(Ljava/lang/String;Ljava/lang/String;Landroid/os/storage/OnObbStateChangeListener;)Z" />
+ <method name="unmountObb(Ljava/lang/String;ZLandroid/os/storage/OnObbStateChangeListener;)Z" />
+ </class>
+ <class name="android/preference/CheckBoxPreference" since="1">
+ <extends name="android/preference/Preference" />
+ <extends name="android/preference/TwoStatePreference" since="14" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getDisableDependentsState()Z" />
+ <method name="getSummaryOff()Ljava/lang/CharSequence;" />
+ <method name="getSummaryOn()Ljava/lang/CharSequence;" />
+ <method name="isChecked()Z" />
+ <method name="setChecked(Z)V" />
+ <method name="setDisableDependentsState(Z)V" />
+ <method name="setSummaryOff(I)V" />
+ <method name="setSummaryOff(Ljava/lang/CharSequence;)V" />
+ <method name="setSummaryOn(I)V" />
+ <method name="setSummaryOn(Ljava/lang/CharSequence;)V" />
+ </class>
+ <class name="android/preference/DialogPreference" since="1">
+ <extends name="android/preference/Preference" />
+ <implements name="android/content/DialogInterface$OnClickListener" />
+ <implements name="android/content/DialogInterface$OnDismissListener" />
+ <implements name="android/preference/PreferenceManager$OnActivityDestroyListener" />
+ <method name="&lt;init>(Landroid/content/Context;)V" since="21" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getDialog()Landroid/app/Dialog;" since="3" />
+ <method name="getDialogIcon()Landroid/graphics/drawable/Drawable;" />
+ <method name="getDialogLayoutResource()I" />
+ <method name="getDialogMessage()Ljava/lang/CharSequence;" />
+ <method name="getDialogTitle()Ljava/lang/CharSequence;" />
+ <method name="getNegativeButtonText()Ljava/lang/CharSequence;" />
+ <method name="getPositiveButtonText()Ljava/lang/CharSequence;" />
+ <method name="onBindDialogView(Landroid/view/View;)V" />
+ <method name="onCreateDialogView()Landroid/view/View;" />
+ <method name="onDialogClosed(Z)V" />
+ <method name="onPrepareDialogBuilder(Landroid/app/AlertDialog$Builder;)V" />
+ <method name="setDialogIcon(I)V" />
+ <method name="setDialogIcon(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setDialogLayoutResource(I)V" />
+ <method name="setDialogMessage(I)V" />
+ <method name="setDialogMessage(Ljava/lang/CharSequence;)V" />
+ <method name="setDialogTitle(I)V" />
+ <method name="setDialogTitle(Ljava/lang/CharSequence;)V" />
+ <method name="setNegativeButtonText(I)V" />
+ <method name="setNegativeButtonText(Ljava/lang/CharSequence;)V" />
+ <method name="setPositiveButtonText(I)V" />
+ <method name="setPositiveButtonText(Ljava/lang/CharSequence;)V" />
+ <method name="showDialog(Landroid/os/Bundle;)V" />
+ </class>
+ <class name="android/preference/EditTextPreference" since="1">
+ <extends name="android/preference/DialogPreference" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getEditText()Landroid/widget/EditText;" />
+ <method name="getText()Ljava/lang/String;" />
+ <method name="onAddEditTextToDialogView(Landroid/view/View;Landroid/widget/EditText;)V" />
+ <method name="setText(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/preference/ListPreference" since="1">
+ <extends name="android/preference/DialogPreference" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" since="21" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="findIndexOfValue(Ljava/lang/String;)I" />
+ <method name="getEntries()[Ljava/lang/CharSequence;" />
+ <method name="getEntry()Ljava/lang/CharSequence;" />
+ <method name="getEntryValues()[Ljava/lang/CharSequence;" />
+ <method name="getValue()Ljava/lang/String;" />
+ <method name="setEntries(I)V" />
+ <method name="setEntries([Ljava/lang/CharSequence;)V" />
+ <method name="setEntryValues(I)V" />
+ <method name="setEntryValues([Ljava/lang/CharSequence;)V" />
+ <method name="setValue(Ljava/lang/String;)V" />
+ <method name="setValueIndex(I)V" />
+ </class>
+ <class name="android/preference/MultiSelectListPreference" since="11">
+ <extends name="android/preference/DialogPreference" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" since="21" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="findIndexOfValue(Ljava/lang/String;)I" />
+ <method name="getEntries()[Ljava/lang/CharSequence;" />
+ <method name="getEntryValues()[Ljava/lang/CharSequence;" />
+ <method name="getValues()Ljava/util/Set;" />
+ <method name="setEntries(I)V" />
+ <method name="setEntries([Ljava/lang/CharSequence;)V" />
+ <method name="setEntryValues(I)V" />
+ <method name="setEntryValues([Ljava/lang/CharSequence;)V" />
+ <method name="setValues(Ljava/util/Set;)V" />
+ </class>
+ <class name="android/preference/Preference" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="callChangeListener(Ljava/lang/Object;)Z" />
+ <method name="compareTo(Landroid/preference/Preference;)I" />
+ <method name="findPreferenceInHierarchy(Ljava/lang/String;)Landroid/preference/Preference;" />
+ <method name="getContext()Landroid/content/Context;" />
+ <method name="getDependency()Ljava/lang/String;" />
+ <method name="getEditor()Landroid/content/SharedPreferences$Editor;" />
+ <method name="getExtras()Landroid/os/Bundle;" since="11" />
+ <method name="getFragment()Ljava/lang/String;" since="11" />
+ <method name="getIcon()Landroid/graphics/drawable/Drawable;" since="11" />
+ <method name="getIntent()Landroid/content/Intent;" />
+ <method name="getKey()Ljava/lang/String;" />
+ <method name="getLayoutResource()I" />
+ <method name="getOnPreferenceChangeListener()Landroid/preference/Preference$OnPreferenceChangeListener;" />
+ <method name="getOnPreferenceClickListener()Landroid/preference/Preference$OnPreferenceClickListener;" />
+ <method name="getOrder()I" />
+ <method name="getPersistedBoolean(Z)Z" />
+ <method name="getPersistedFloat(F)F" />
+ <method name="getPersistedInt(I)I" />
+ <method name="getPersistedLong(J)J" />
+ <method name="getPersistedString(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getPreferenceManager()Landroid/preference/PreferenceManager;" />
+ <method name="getSharedPreferences()Landroid/content/SharedPreferences;" />
+ <method name="getShouldDisableView()Z" />
+ <method name="getSummary()Ljava/lang/CharSequence;" />
+ <method name="getTitle()Ljava/lang/CharSequence;" />
+ <method name="getTitleRes()I" since="14" />
+ <method name="getView(Landroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View;" />
+ <method name="getWidgetLayoutResource()I" />
+ <method name="hasKey()Z" />
+ <method name="isEnabled()Z" />
+ <method name="isPersistent()Z" />
+ <method name="isSelectable()Z" />
+ <method name="notifyChanged()V" />
+ <method name="notifyDependencyChange(Z)V" />
+ <method name="notifyHierarchyChanged()V" />
+ <method name="onAttachedToActivity()V" />
+ <method name="onAttachedToHierarchy(Landroid/preference/PreferenceManager;)V" />
+ <method name="onBindView(Landroid/view/View;)V" />
+ <method name="onClick()V" />
+ <method name="onCreateView(Landroid/view/ViewGroup;)Landroid/view/View;" />
+ <method name="onDependencyChanged(Landroid/preference/Preference;Z)V" />
+ <method name="onGetDefaultValue(Landroid/content/res/TypedArray;I)Ljava/lang/Object;" />
+ <method name="onParentChanged(Landroid/preference/Preference;Z)V" since="19" />
+ <method name="onPrepareForRemoval()V" />
+ <method name="onRestoreInstanceState(Landroid/os/Parcelable;)V" />
+ <method name="onSaveInstanceState()Landroid/os/Parcelable;" />
+ <method name="onSetInitialValue(ZLjava/lang/Object;)V" />
+ <method name="peekExtras()Landroid/os/Bundle;" since="11" />
+ <method name="persistBoolean(Z)Z" />
+ <method name="persistFloat(F)Z" />
+ <method name="persistInt(I)Z" />
+ <method name="persistLong(J)Z" />
+ <method name="persistString(Ljava/lang/String;)Z" />
+ <method name="restoreHierarchyState(Landroid/os/Bundle;)V" />
+ <method name="saveHierarchyState(Landroid/os/Bundle;)V" />
+ <method name="setDefaultValue(Ljava/lang/Object;)V" />
+ <method name="setDependency(Ljava/lang/String;)V" />
+ <method name="setEnabled(Z)V" />
+ <method name="setFragment(Ljava/lang/String;)V" since="11" />
+ <method name="setIcon(I)V" since="11" />
+ <method name="setIcon(Landroid/graphics/drawable/Drawable;)V" since="11" />
+ <method name="setIntent(Landroid/content/Intent;)V" />
+ <method name="setKey(Ljava/lang/String;)V" />
+ <method name="setLayoutResource(I)V" />
+ <method name="setOnPreferenceChangeListener(Landroid/preference/Preference$OnPreferenceChangeListener;)V" />
+ <method name="setOnPreferenceClickListener(Landroid/preference/Preference$OnPreferenceClickListener;)V" />
+ <method name="setOrder(I)V" />
+ <method name="setPersistent(Z)V" />
+ <method name="setSelectable(Z)V" />
+ <method name="setShouldDisableView(Z)V" />
+ <method name="setSummary(I)V" />
+ <method name="setSummary(Ljava/lang/CharSequence;)V" />
+ <method name="setTitle(I)V" />
+ <method name="setTitle(Ljava/lang/CharSequence;)V" />
+ <method name="setWidgetLayoutResource(I)V" />
+ <method name="shouldCommit()Z" />
+ <method name="shouldDisableDependents()Z" />
+ <method name="shouldPersist()Z" />
+ <field name="DEFAULT_ORDER" />
+ </class>
+ <class name="android/preference/Preference$BaseSavedState" since="1">
+ <extends name="android/view/AbsSavedState" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="&lt;init>(Landroid/os/Parcelable;)V" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/preference/Preference$OnPreferenceChangeListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onPreferenceChange(Landroid/preference/Preference;Ljava/lang/Object;)Z" />
+ </class>
+ <class name="android/preference/Preference$OnPreferenceClickListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onPreferenceClick(Landroid/preference/Preference;)Z" />
+ </class>
+ <class name="android/preference/PreferenceActivity" since="1">
+ <extends name="android/app/ListActivity" />
+ <implements name="android/preference/PreferenceFragment$OnPreferenceStartFragmentCallback" since="11" />
+ <method name="&lt;init>()V" />
+ <method name="addPreferencesFromIntent(Landroid/content/Intent;)V" />
+ <method name="addPreferencesFromResource(I)V" />
+ <method name="findPreference(Ljava/lang/CharSequence;)Landroid/preference/Preference;" />
+ <method name="finishPreferencePanel(Landroid/app/Fragment;ILandroid/content/Intent;)V" since="11" />
+ <method name="getPreferenceManager()Landroid/preference/PreferenceManager;" />
+ <method name="getPreferenceScreen()Landroid/preference/PreferenceScreen;" />
+ <method name="hasHeaders()Z" since="11" />
+ <method name="invalidateHeaders()V" since="11" />
+ <method name="isMultiPane()Z" since="11" />
+ <method name="isValidFragment(Ljava/lang/String;)Z" since="19" />
+ <method name="loadHeadersFromResource(ILjava/util/List;)V" since="11" />
+ <method name="onBuildHeaders(Ljava/util/List;)V" since="11" />
+ <method name="onBuildStartFragmentIntent(Ljava/lang/String;Landroid/os/Bundle;II)Landroid/content/Intent;" since="14" />
+ <method name="onGetInitialHeader()Landroid/preference/PreferenceActivity$Header;" since="11" />
+ <method name="onGetNewHeader()Landroid/preference/PreferenceActivity$Header;" since="11" />
+ <method name="onHeaderClick(Landroid/preference/PreferenceActivity$Header;I)V" since="11" />
+ <method name="onIsHidingHeaders()Z" since="11" />
+ <method name="onIsMultiPane()Z" since="11" />
+ <method name="onPreferenceTreeClick(Landroid/preference/PreferenceScreen;Landroid/preference/Preference;)Z" />
+ <method name="setListFooter(Landroid/view/View;)V" since="11" />
+ <method name="setParentTitle(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/view/View$OnClickListener;)V" since="11" />
+ <method name="setPreferenceScreen(Landroid/preference/PreferenceScreen;)V" />
+ <method name="showBreadCrumbs(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)V" since="11" />
+ <method name="startPreferenceFragment(Landroid/app/Fragment;Z)V" since="11" />
+ <method name="startPreferencePanel(Ljava/lang/String;Landroid/os/Bundle;ILjava/lang/CharSequence;Landroid/app/Fragment;I)V" since="11" />
+ <method name="startWithFragment(Ljava/lang/String;Landroid/os/Bundle;Landroid/app/Fragment;I)V" since="11" />
+ <method name="startWithFragment(Ljava/lang/String;Landroid/os/Bundle;Landroid/app/Fragment;III)V" since="14" />
+ <method name="switchToHeader(Landroid/preference/PreferenceActivity$Header;)V" since="11" />
+ <method name="switchToHeader(Ljava/lang/String;Landroid/os/Bundle;)V" since="11" />
+ <field name="EXTRA_NO_HEADERS" since="11" />
+ <field name="EXTRA_SHOW_FRAGMENT" since="11" />
+ <field name="EXTRA_SHOW_FRAGMENT_ARGUMENTS" since="11" />
+ <field name="EXTRA_SHOW_FRAGMENT_SHORT_TITLE" since="14" />
+ <field name="EXTRA_SHOW_FRAGMENT_TITLE" since="14" />
+ <field name="HEADER_ID_UNDEFINED" since="11" />
+ </class>
+ <class name="android/preference/PreferenceActivity$Header" since="11">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getBreadCrumbShortTitle(Landroid/content/res/Resources;)Ljava/lang/CharSequence;" />
+ <method name="getBreadCrumbTitle(Landroid/content/res/Resources;)Ljava/lang/CharSequence;" />
+ <method name="getSummary(Landroid/content/res/Resources;)Ljava/lang/CharSequence;" />
+ <method name="getTitle(Landroid/content/res/Resources;)Ljava/lang/CharSequence;" />
+ <method name="readFromParcel(Landroid/os/Parcel;)V" />
+ <field name="CREATOR" />
+ <field name="breadCrumbShortTitle" />
+ <field name="breadCrumbShortTitleRes" />
+ <field name="breadCrumbTitle" />
+ <field name="breadCrumbTitleRes" />
+ <field name="extras" />
+ <field name="fragment" />
+ <field name="fragmentArguments" />
+ <field name="iconRes" />
+ <field name="id" />
+ <field name="intent" />
+ <field name="summary" />
+ <field name="summaryRes" />
+ <field name="title" />
+ <field name="titleRes" />
+ </class>
+ <class name="android/preference/PreferenceCategory" since="1">
+ <extends name="android/preference/PreferenceGroup" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ </class>
+ <class name="android/preference/PreferenceFragment" since="11">
+ <extends name="android/app/Fragment" />
+ <method name="&lt;init>()V" />
+ <method name="addPreferencesFromIntent(Landroid/content/Intent;)V" />
+ <method name="addPreferencesFromResource(I)V" />
+ <method name="findPreference(Ljava/lang/CharSequence;)Landroid/preference/Preference;" />
+ <method name="getPreferenceManager()Landroid/preference/PreferenceManager;" />
+ <method name="getPreferenceScreen()Landroid/preference/PreferenceScreen;" />
+ <method name="onPreferenceTreeClick(Landroid/preference/PreferenceScreen;Landroid/preference/Preference;)Z" />
+ <method name="setPreferenceScreen(Landroid/preference/PreferenceScreen;)V" />
+ </class>
+ <class name="android/preference/PreferenceFragment$OnPreferenceStartFragmentCallback" since="11">
+ <extends name="java/lang/Object" />
+ <method name="onPreferenceStartFragment(Landroid/preference/PreferenceFragment;Landroid/preference/Preference;)Z" />
+ </class>
+ <class name="android/preference/PreferenceGroup" since="1">
+ <extends name="android/preference/Preference" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="addItemFromInflater(Landroid/preference/Preference;)V" />
+ <method name="addPreference(Landroid/preference/Preference;)Z" />
+ <method name="dispatchRestoreInstanceState(Landroid/os/Bundle;)V" />
+ <method name="dispatchSaveInstanceState(Landroid/os/Bundle;)V" />
+ <method name="findPreference(Ljava/lang/CharSequence;)Landroid/preference/Preference;" />
+ <method name="getPreference(I)Landroid/preference/Preference;" />
+ <method name="getPreferenceCount()I" />
+ <method name="isOnSameScreenAsChildren()Z" />
+ <method name="isOrderingAsAdded()Z" />
+ <method name="onPrepareAddPreference(Landroid/preference/Preference;)Z" />
+ <method name="removeAll()V" />
+ <method name="removePreference(Landroid/preference/Preference;)Z" />
+ <method name="setOrderingAsAdded(Z)V" />
+ </class>
+ <class name="android/preference/PreferenceManager" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="createPreferenceScreen(Landroid/content/Context;)Landroid/preference/PreferenceScreen;" />
+ <method name="findPreference(Ljava/lang/CharSequence;)Landroid/preference/Preference;" />
+ <method name="getDefaultSharedPreferences(Landroid/content/Context;)Landroid/content/SharedPreferences;" />
+ <method name="getSharedPreferences()Landroid/content/SharedPreferences;" />
+ <method name="getSharedPreferencesMode()I" />
+ <method name="getSharedPreferencesName()Ljava/lang/String;" />
+ <method name="setDefaultValues(Landroid/content/Context;IZ)V" />
+ <method name="setDefaultValues(Landroid/content/Context;Ljava/lang/String;IIZ)V" />
+ <method name="setSharedPreferencesMode(I)V" />
+ <method name="setSharedPreferencesName(Ljava/lang/String;)V" />
+ <field name="KEY_HAS_SET_DEFAULT_VALUES" />
+ <field name="METADATA_KEY_PREFERENCES" />
+ </class>
+ <class name="android/preference/PreferenceManager$OnActivityDestroyListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onActivityDestroy()V" />
+ </class>
+ <class name="android/preference/PreferenceManager$OnActivityResultListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onActivityResult(IILandroid/content/Intent;)Z" />
+ </class>
+ <class name="android/preference/PreferenceManager$OnActivityStopListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onActivityStop()V" />
+ </class>
+ <class name="android/preference/PreferenceScreen" since="1">
+ <extends name="android/preference/PreferenceGroup" />
+ <implements name="android/content/DialogInterface$OnDismissListener" />
+ <implements name="android/widget/AdapterView$OnItemClickListener" />
+ <method name="&lt;init>()V" />
+ <method name="bind(Landroid/widget/ListView;)V" />
+ <method name="getDialog()Landroid/app/Dialog;" />
+ <method name="getRootAdapter()Landroid/widget/ListAdapter;" />
+ <method name="onCreateRootAdapter()Landroid/widget/ListAdapter;" />
+ </class>
+ <class name="android/preference/RingtonePreference" since="1">
+ <extends name="android/preference/Preference" />
+ <implements name="android/preference/PreferenceManager$OnActivityResultListener" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getRingtoneType()I" />
+ <method name="getShowDefault()Z" />
+ <method name="getShowSilent()Z" />
+ <method name="onPrepareRingtonePickerIntent(Landroid/content/Intent;)V" />
+ <method name="onRestoreRingtone()Landroid/net/Uri;" />
+ <method name="onSaveRingtone(Landroid/net/Uri;)V" />
+ <method name="setRingtoneType(I)V" />
+ <method name="setShowDefault(Z)V" />
+ <method name="setShowSilent(Z)V" />
+ </class>
+ <class name="android/preference/SwitchPreference" since="14">
+ <extends name="android/preference/TwoStatePreference" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getSwitchTextOff()Ljava/lang/CharSequence;" />
+ <method name="getSwitchTextOn()Ljava/lang/CharSequence;" />
+ <method name="setSwitchTextOff(I)V" />
+ <method name="setSwitchTextOff(Ljava/lang/CharSequence;)V" />
+ <method name="setSwitchTextOn(I)V" />
+ <method name="setSwitchTextOn(Ljava/lang/CharSequence;)V" />
+ </class>
+ <class name="android/preference/TwoStatePreference" since="14">
+ <extends name="android/preference/Preference" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getDisableDependentsState()Z" />
+ <method name="getSummaryOff()Ljava/lang/CharSequence;" />
+ <method name="getSummaryOn()Ljava/lang/CharSequence;" />
+ <method name="isChecked()Z" />
+ <method name="setChecked(Z)V" />
+ <method name="setDisableDependentsState(Z)V" />
+ <method name="setSummaryOff(I)V" />
+ <method name="setSummaryOff(Ljava/lang/CharSequence;)V" />
+ <method name="setSummaryOn(I)V" />
+ <method name="setSummaryOn(Ljava/lang/CharSequence;)V" />
+ </class>
+ <class name="android/print/PageRange" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(II)V" />
+ <method name="getEnd()I" />
+ <method name="getStart()I" />
+ <field name="ALL_PAGES" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/print/PrintAttributes" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getColorMode()I" />
+ <method name="getMediaSize()Landroid/print/PrintAttributes$MediaSize;" />
+ <method name="getMinMargins()Landroid/print/PrintAttributes$Margins;" />
+ <method name="getResolution()Landroid/print/PrintAttributes$Resolution;" />
+ <field name="COLOR_MODE_COLOR" />
+ <field name="COLOR_MODE_MONOCHROME" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/print/PrintAttributes$Builder" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="build()Landroid/print/PrintAttributes;" />
+ <method name="setColorMode(I)Landroid/print/PrintAttributes$Builder;" />
+ <method name="setMediaSize(Landroid/print/PrintAttributes$MediaSize;)Landroid/print/PrintAttributes$Builder;" />
+ <method name="setMinMargins(Landroid/print/PrintAttributes$Margins;)Landroid/print/PrintAttributes$Builder;" />
+ <method name="setResolution(Landroid/print/PrintAttributes$Resolution;)Landroid/print/PrintAttributes$Builder;" />
+ </class>
+ <class name="android/print/PrintAttributes$Margins" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(IIII)V" />
+ <method name="getBottomMils()I" />
+ <method name="getLeftMils()I" />
+ <method name="getRightMils()I" />
+ <method name="getTopMils()I" />
+ <field name="NO_MARGINS" />
+ </class>
+ <class name="android/print/PrintAttributes$MediaSize" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;II)V" />
+ <method name="asLandscape()Landroid/print/PrintAttributes$MediaSize;" />
+ <method name="asPortrait()Landroid/print/PrintAttributes$MediaSize;" />
+ <method name="getHeightMils()I" />
+ <method name="getId()Ljava/lang/String;" />
+ <method name="getLabel(Landroid/content/pm/PackageManager;)Ljava/lang/String;" />
+ <method name="getWidthMils()I" />
+ <method name="isPortrait()Z" />
+ <field name="ISO_A0" />
+ <field name="ISO_A1" />
+ <field name="ISO_A10" />
+ <field name="ISO_A2" />
+ <field name="ISO_A3" />
+ <field name="ISO_A4" />
+ <field name="ISO_A5" />
+ <field name="ISO_A6" />
+ <field name="ISO_A7" />
+ <field name="ISO_A8" />
+ <field name="ISO_A9" />
+ <field name="ISO_B0" />
+ <field name="ISO_B1" />
+ <field name="ISO_B10" />
+ <field name="ISO_B2" />
+ <field name="ISO_B3" />
+ <field name="ISO_B4" />
+ <field name="ISO_B5" />
+ <field name="ISO_B6" />
+ <field name="ISO_B7" />
+ <field name="ISO_B8" />
+ <field name="ISO_B9" />
+ <field name="ISO_C0" />
+ <field name="ISO_C1" />
+ <field name="ISO_C10" />
+ <field name="ISO_C2" />
+ <field name="ISO_C3" />
+ <field name="ISO_C4" />
+ <field name="ISO_C5" />
+ <field name="ISO_C6" />
+ <field name="ISO_C7" />
+ <field name="ISO_C8" />
+ <field name="ISO_C9" />
+ <field name="JIS_B0" />
+ <field name="JIS_B1" />
+ <field name="JIS_B10" />
+ <field name="JIS_B2" />
+ <field name="JIS_B3" />
+ <field name="JIS_B4" />
+ <field name="JIS_B5" />
+ <field name="JIS_B6" />
+ <field name="JIS_B7" />
+ <field name="JIS_B8" />
+ <field name="JIS_B9" />
+ <field name="JIS_EXEC" />
+ <field name="JPN_CHOU2" />
+ <field name="JPN_CHOU3" />
+ <field name="JPN_CHOU4" />
+ <field name="JPN_HAGAKI" />
+ <field name="JPN_KAHU" />
+ <field name="JPN_KAKU2" />
+ <field name="JPN_OUFUKU" />
+ <field name="JPN_YOU4" />
+ <field name="NA_FOOLSCAP" />
+ <field name="NA_GOVT_LETTER" />
+ <field name="NA_INDEX_3X5" />
+ <field name="NA_INDEX_4X6" />
+ <field name="NA_INDEX_5X8" />
+ <field name="NA_JUNIOR_LEGAL" />
+ <field name="NA_LEDGER" />
+ <field name="NA_LEGAL" />
+ <field name="NA_LETTER" />
+ <field name="NA_MONARCH" />
+ <field name="NA_QUARTO" />
+ <field name="NA_TABLOID" />
+ <field name="OM_DAI_PA_KAI" />
+ <field name="OM_JUURO_KU_KAI" />
+ <field name="OM_PA_KAI" />
+ <field name="PRC_1" />
+ <field name="PRC_10" />
+ <field name="PRC_16K" />
+ <field name="PRC_2" />
+ <field name="PRC_3" />
+ <field name="PRC_4" />
+ <field name="PRC_5" />
+ <field name="PRC_6" />
+ <field name="PRC_7" />
+ <field name="PRC_8" />
+ <field name="PRC_9" />
+ <field name="ROC_16K" />
+ <field name="ROC_8K" />
+ <field name="UNKNOWN_LANDSCAPE" />
+ <field name="UNKNOWN_PORTRAIT" />
+ </class>
+ <class name="android/print/PrintAttributes$Resolution" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;II)V" />
+ <method name="getHorizontalDpi()I" />
+ <method name="getId()Ljava/lang/String;" />
+ <method name="getLabel()Ljava/lang/String;" />
+ <method name="getVerticalDpi()I" />
+ </class>
+ <class name="android/print/PrintDocumentAdapter" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onFinish()V" />
+ <method name="onLayout(Landroid/print/PrintAttributes;Landroid/print/PrintAttributes;Landroid/os/CancellationSignal;Landroid/print/PrintDocumentAdapter$LayoutResultCallback;Landroid/os/Bundle;)V" />
+ <method name="onStart()V" />
+ <method name="onWrite([Landroid/print/PageRange;Landroid/os/ParcelFileDescriptor;Landroid/os/CancellationSignal;Landroid/print/PrintDocumentAdapter$WriteResultCallback;)V" />
+ <field name="EXTRA_PRINT_PREVIEW" />
+ </class>
+ <class name="android/print/PrintDocumentAdapter$LayoutResultCallback" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onLayoutCancelled()V" />
+ <method name="onLayoutFailed(Ljava/lang/CharSequence;)V" />
+ <method name="onLayoutFinished(Landroid/print/PrintDocumentInfo;Z)V" />
+ </class>
+ <class name="android/print/PrintDocumentAdapter$WriteResultCallback" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onWriteCancelled()V" />
+ <method name="onWriteFailed(Ljava/lang/CharSequence;)V" />
+ <method name="onWriteFinished([Landroid/print/PageRange;)V" />
+ </class>
+ <class name="android/print/PrintDocumentInfo" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getContentType()I" />
+ <method name="getDataSize()J" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getPageCount()I" />
+ <field name="CONTENT_TYPE_DOCUMENT" />
+ <field name="CONTENT_TYPE_PHOTO" />
+ <field name="CONTENT_TYPE_UNKNOWN" />
+ <field name="CREATOR" />
+ <field name="PAGE_COUNT_UNKNOWN" />
+ </class>
+ <class name="android/print/PrintDocumentInfo$Builder" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="build()Landroid/print/PrintDocumentInfo;" />
+ <method name="setContentType(I)Landroid/print/PrintDocumentInfo$Builder;" />
+ <method name="setPageCount(I)Landroid/print/PrintDocumentInfo$Builder;" />
+ </class>
+ <class name="android/print/PrintJob" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="cancel()V" />
+ <method name="getId()Landroid/print/PrintJobId;" />
+ <method name="getInfo()Landroid/print/PrintJobInfo;" />
+ <method name="isBlocked()Z" />
+ <method name="isCancelled()Z" />
+ <method name="isCompleted()Z" />
+ <method name="isFailed()Z" />
+ <method name="isQueued()Z" />
+ <method name="isStarted()Z" />
+ <method name="restart()V" />
+ </class>
+ <class name="android/print/PrintJobId" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/print/PrintJobInfo" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getAttributes()Landroid/print/PrintAttributes;" />
+ <method name="getCopies()I" />
+ <method name="getCreationTime()J" />
+ <method name="getId()Landroid/print/PrintJobId;" />
+ <method name="getLabel()Ljava/lang/String;" />
+ <method name="getPages()[Landroid/print/PageRange;" />
+ <method name="getPrinterId()Landroid/print/PrinterId;" />
+ <method name="getState()I" />
+ <field name="CREATOR" />
+ <field name="STATE_BLOCKED" />
+ <field name="STATE_CANCELED" />
+ <field name="STATE_COMPLETED" />
+ <field name="STATE_CREATED" />
+ <field name="STATE_FAILED" />
+ <field name="STATE_QUEUED" />
+ <field name="STATE_STARTED" />
+ </class>
+ <class name="android/print/PrintJobInfo$Builder" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/print/PrintJobInfo;)V" />
+ <method name="build()Landroid/print/PrintJobInfo;" />
+ <method name="putAdvancedOption(Ljava/lang/String;I)V" />
+ <method name="putAdvancedOption(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="setAttributes(Landroid/print/PrintAttributes;)V" />
+ <method name="setCopies(I)V" />
+ <method name="setPages([Landroid/print/PageRange;)V" />
+ </class>
+ <class name="android/print/PrintManager" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getPrintJobs()Ljava/util/List;" />
+ <method name="print(Ljava/lang/String;Landroid/print/PrintDocumentAdapter;Landroid/print/PrintAttributes;)Landroid/print/PrintJob;" />
+ </class>
+ <class name="android/print/PrinterCapabilitiesInfo" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getColorModes()I" />
+ <method name="getDefaults()Landroid/print/PrintAttributes;" />
+ <method name="getMediaSizes()Ljava/util/List;" />
+ <method name="getMinMargins()Landroid/print/PrintAttributes$Margins;" />
+ <method name="getResolutions()Ljava/util/List;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/print/PrinterCapabilitiesInfo$Builder" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/print/PrinterId;)V" />
+ <method name="addMediaSize(Landroid/print/PrintAttributes$MediaSize;Z)Landroid/print/PrinterCapabilitiesInfo$Builder;" />
+ <method name="addResolution(Landroid/print/PrintAttributes$Resolution;Z)Landroid/print/PrinterCapabilitiesInfo$Builder;" />
+ <method name="build()Landroid/print/PrinterCapabilitiesInfo;" />
+ <method name="setColorModes(II)Landroid/print/PrinterCapabilitiesInfo$Builder;" />
+ <method name="setMinMargins(Landroid/print/PrintAttributes$Margins;)Landroid/print/PrinterCapabilitiesInfo$Builder;" />
+ </class>
+ <class name="android/print/PrinterId" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getLocalId()Ljava/lang/String;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/print/PrinterInfo" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getCapabilities()Landroid/print/PrinterCapabilitiesInfo;" />
+ <method name="getDescription()Ljava/lang/String;" />
+ <method name="getId()Landroid/print/PrinterId;" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getStatus()I" />
+ <field name="CREATOR" />
+ <field name="STATUS_BUSY" />
+ <field name="STATUS_IDLE" />
+ <field name="STATUS_UNAVAILABLE" />
+ </class>
+ <class name="android/print/PrinterInfo$Builder" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/print/PrinterId;Ljava/lang/String;I)V" />
+ <method name="&lt;init>(Landroid/print/PrinterInfo;)V" />
+ <method name="build()Landroid/print/PrinterInfo;" />
+ <method name="setCapabilities(Landroid/print/PrinterCapabilitiesInfo;)Landroid/print/PrinterInfo$Builder;" />
+ <method name="setDescription(Ljava/lang/String;)Landroid/print/PrinterInfo$Builder;" />
+ <method name="setName(Ljava/lang/String;)Landroid/print/PrinterInfo$Builder;" />
+ <method name="setStatus(I)Landroid/print/PrinterInfo$Builder;" />
+ </class>
+ <class name="android/print/pdf/PrintedPdfDocument" since="19">
+ <extends name="android/graphics/pdf/PdfDocument" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/print/PrintAttributes;)V" />
+ <method name="getPageContentRect()Landroid/graphics/Rect;" />
+ <method name="getPageHeight()I" />
+ <method name="getPageWidth()I" />
+ <method name="startPage(I)Landroid/graphics/pdf/PdfDocument$Page;" />
+ </class>
+ <class name="android/printservice/PrintDocument" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getData()Landroid/os/ParcelFileDescriptor;" />
+ <method name="getInfo()Landroid/print/PrintDocumentInfo;" />
+ </class>
+ <class name="android/printservice/PrintJob" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="block(Ljava/lang/String;)Z" />
+ <method name="cancel()Z" />
+ <method name="complete()Z" />
+ <method name="fail(Ljava/lang/String;)Z" />
+ <method name="getAdvancedIntOption(Ljava/lang/String;)I" />
+ <method name="getAdvancedStringOption(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getDocument()Landroid/printservice/PrintDocument;" />
+ <method name="getId()Landroid/print/PrintJobId;" />
+ <method name="getInfo()Landroid/print/PrintJobInfo;" />
+ <method name="getTag()Ljava/lang/String;" />
+ <method name="hasAdvancedOption(Ljava/lang/String;)Z" />
+ <method name="isBlocked()Z" />
+ <method name="isCancelled()Z" />
+ <method name="isCompleted()Z" />
+ <method name="isFailed()Z" />
+ <method name="isQueued()Z" />
+ <method name="isStarted()Z" />
+ <method name="setTag(Ljava/lang/String;)Z" />
+ <method name="start()Z" />
+ </class>
+ <class name="android/printservice/PrintService" since="19">
+ <extends name="android/app/Service" />
+ <method name="&lt;init>()V" />
+ <method name="generatePrinterId(Ljava/lang/String;)Landroid/print/PrinterId;" />
+ <method name="getActivePrintJobs()Ljava/util/List;" />
+ <method name="onConnected()V" />
+ <method name="onCreatePrinterDiscoverySession()Landroid/printservice/PrinterDiscoverySession;" />
+ <method name="onDisconnected()V" />
+ <method name="onPrintJobQueued(Landroid/printservice/PrintJob;)V" />
+ <method name="onRequestCancelPrintJob(Landroid/printservice/PrintJob;)V" />
+ <field name="EXTRA_PRINTER_INFO" since="21" />
+ <field name="EXTRA_PRINT_JOB_INFO" />
+ <field name="SERVICE_INTERFACE" />
+ <field name="SERVICE_META_DATA" />
+ </class>
+ <class name="android/printservice/PrinterDiscoverySession" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addPrinters(Ljava/util/List;)V" />
+ <method name="getPrinters()Ljava/util/List;" />
+ <method name="getTrackedPrinters()Ljava/util/List;" />
+ <method name="isDestroyed()Z" />
+ <method name="isPrinterDiscoveryStarted()Z" />
+ <method name="onDestroy()V" />
+ <method name="onStartPrinterDiscovery(Ljava/util/List;)V" />
+ <method name="onStartPrinterStateTracking(Landroid/print/PrinterId;)V" />
+ <method name="onStopPrinterDiscovery()V" />
+ <method name="onStopPrinterStateTracking(Landroid/print/PrinterId;)V" />
+ <method name="onValidatePrinters(Ljava/util/List;)V" />
+ <method name="removePrinters(Ljava/util/List;)V" />
+ </class>
+ <class name="android/provider/AlarmClock" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="ACTION_SET_ALARM" />
+ <field name="ACTION_SET_TIMER" since="19" />
+ <field name="ACTION_SHOW_ALARMS" since="19" />
+ <field name="EXTRA_DAYS" since="19" />
+ <field name="EXTRA_HOUR" />
+ <field name="EXTRA_LENGTH" since="19" />
+ <field name="EXTRA_MESSAGE" />
+ <field name="EXTRA_MINUTES" />
+ <field name="EXTRA_RINGTONE" since="19" />
+ <field name="EXTRA_SKIP_UI" since="11" />
+ <field name="EXTRA_VIBRATE" since="19" />
+ <field name="VALUE_RINGTONE_SILENT" since="19" />
+ </class>
+ <class name="android/provider/BaseColumns" since="1">
+ <extends name="java/lang/Object" />
+ <field name="_COUNT" />
+ <field name="_ID" />
+ </class>
+ <class name="android/provider/Browser" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addSearchUrl(Landroid/content/ContentResolver;Ljava/lang/String;)V" />
+ <method name="canClearHistory(Landroid/content/ContentResolver;)Z" />
+ <method name="clearHistory(Landroid/content/ContentResolver;)V" />
+ <method name="clearSearches(Landroid/content/ContentResolver;)V" />
+ <method name="deleteFromHistory(Landroid/content/ContentResolver;Ljava/lang/String;)V" />
+ <method name="deleteHistoryTimeFrame(Landroid/content/ContentResolver;JJ)V" />
+ <method name="getAllBookmarks(Landroid/content/ContentResolver;)Landroid/database/Cursor;" />
+ <method name="getAllVisitedUrls(Landroid/content/ContentResolver;)Landroid/database/Cursor;" />
+ <method name="requestAllIcons(Landroid/content/ContentResolver;Ljava/lang/String;Landroid/webkit/WebIconDatabase$IconListener;)V" />
+ <method name="saveBookmark(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="sendString(Landroid/content/Context;Ljava/lang/String;)V" />
+ <method name="truncateHistory(Landroid/content/ContentResolver;)V" />
+ <method name="updateVisitedHistory(Landroid/content/ContentResolver;Ljava/lang/String;Z)V" />
+ <field name="BOOKMARKS_URI" />
+ <field name="EXTRA_APPLICATION_ID" since="3" />
+ <field name="EXTRA_CREATE_NEW_TAB" since="12" />
+ <field name="EXTRA_HEADERS" since="8" />
+ <field name="HISTORY_PROJECTION" />
+ <field name="HISTORY_PROJECTION_BOOKMARK_INDEX" />
+ <field name="HISTORY_PROJECTION_DATE_INDEX" />
+ <field name="HISTORY_PROJECTION_FAVICON_INDEX" />
+ <field name="HISTORY_PROJECTION_ID_INDEX" />
+ <field name="HISTORY_PROJECTION_TITLE_INDEX" />
+ <field name="HISTORY_PROJECTION_URL_INDEX" />
+ <field name="HISTORY_PROJECTION_VISITS_INDEX" />
+ <field name="INITIAL_ZOOM_LEVEL" />
+ <field name="SEARCHES_PROJECTION" />
+ <field name="SEARCHES_PROJECTION_DATE_INDEX" />
+ <field name="SEARCHES_PROJECTION_SEARCH_INDEX" />
+ <field name="SEARCHES_URI" />
+ <field name="TRUNCATE_HISTORY_PROJECTION" />
+ <field name="TRUNCATE_HISTORY_PROJECTION_ID_INDEX" />
+ <field name="TRUNCATE_N_OLDEST" />
+ </class>
+ <class name="android/provider/Browser$BookmarkColumns" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <method name="&lt;init>()V" />
+ <field name="BOOKMARK" />
+ <field name="CREATED" />
+ <field name="DATE" />
+ <field name="FAVICON" />
+ <field name="TITLE" />
+ <field name="URL" />
+ <field name="VISITS" />
+ </class>
+ <class name="android/provider/Browser$SearchColumns" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <method name="&lt;init>()V" />
+ <field name="DATE" />
+ <field name="SEARCH" />
+ <field name="URL" />
+ </class>
+ <class name="android/provider/CalendarContract" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="ACCOUNT_TYPE_LOCAL" />
+ <field name="ACTION_EVENT_REMINDER" />
+ <field name="ACTION_HANDLE_CUSTOM_EVENT" since="16" />
+ <field name="AUTHORITY" />
+ <field name="CALLER_IS_SYNCADAPTER" />
+ <field name="CONTENT_URI" />
+ <field name="EXTRA_CUSTOM_APP_URI" since="16" />
+ <field name="EXTRA_EVENT_ALL_DAY" />
+ <field name="EXTRA_EVENT_BEGIN_TIME" />
+ <field name="EXTRA_EVENT_END_TIME" />
+ </class>
+ <class name="android/provider/CalendarContract$Attendees" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/CalendarContract$AttendeesColumns" />
+ <implements name="android/provider/CalendarContract$EventsColumns" />
+ <method name="&lt;init>()V" />
+ <method name="query(Landroid/content/ContentResolver;J[Ljava/lang/String;)Landroid/database/Cursor;" />
+ <field name="CONTENT_URI" />
+ </class>
+ <class name="android/provider/CalendarContract$AttendeesColumns" since="14">
+ <extends name="java/lang/Object" />
+ <field name="ATTENDEE_EMAIL" />
+ <field name="ATTENDEE_IDENTITY" since="16" />
+ <field name="ATTENDEE_ID_NAMESPACE" since="16" />
+ <field name="ATTENDEE_NAME" />
+ <field name="ATTENDEE_RELATIONSHIP" />
+ <field name="ATTENDEE_STATUS" />
+ <field name="ATTENDEE_STATUS_ACCEPTED" />
+ <field name="ATTENDEE_STATUS_DECLINED" />
+ <field name="ATTENDEE_STATUS_INVITED" />
+ <field name="ATTENDEE_STATUS_NONE" />
+ <field name="ATTENDEE_STATUS_TENTATIVE" />
+ <field name="ATTENDEE_TYPE" />
+ <field name="EVENT_ID" />
+ <field name="RELATIONSHIP_ATTENDEE" />
+ <field name="RELATIONSHIP_NONE" />
+ <field name="RELATIONSHIP_ORGANIZER" />
+ <field name="RELATIONSHIP_PERFORMER" />
+ <field name="RELATIONSHIP_SPEAKER" />
+ <field name="TYPE_NONE" />
+ <field name="TYPE_OPTIONAL" />
+ <field name="TYPE_REQUIRED" />
+ <field name="TYPE_RESOURCE" since="15" />
+ </class>
+ <class name="android/provider/CalendarContract$CalendarAlerts" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/CalendarContract$CalendarAlertsColumns" />
+ <implements name="android/provider/CalendarContract$CalendarColumns" />
+ <implements name="android/provider/CalendarContract$EventsColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_URI" />
+ <field name="CONTENT_URI_BY_INSTANCE" />
+ </class>
+ <class name="android/provider/CalendarContract$CalendarAlertsColumns" since="14">
+ <extends name="java/lang/Object" />
+ <field name="ALARM_TIME" />
+ <field name="BEGIN" />
+ <field name="CREATION_TIME" />
+ <field name="DEFAULT_SORT_ORDER" />
+ <field name="END" />
+ <field name="EVENT_ID" />
+ <field name="MINUTES" />
+ <field name="NOTIFY_TIME" />
+ <field name="RECEIVED_TIME" />
+ <field name="STATE" />
+ <field name="STATE_DISMISSED" />
+ <field name="STATE_FIRED" />
+ <field name="STATE_SCHEDULED" />
+ </class>
+ <class name="android/provider/CalendarContract$CalendarCache" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/CalendarContract$CalendarCacheColumns" />
+ <method name="&lt;init>()V" />
+ <field name="KEY_TIMEZONE_INSTANCES" />
+ <field name="KEY_TIMEZONE_INSTANCES_PREVIOUS" />
+ <field name="KEY_TIMEZONE_TYPE" />
+ <field name="TIMEZONE_TYPE_AUTO" />
+ <field name="TIMEZONE_TYPE_HOME" />
+ <field name="URI" />
+ </class>
+ <class name="android/provider/CalendarContract$CalendarCacheColumns" since="14">
+ <extends name="java/lang/Object" />
+ <field name="KEY" />
+ <field name="VALUE" />
+ </class>
+ <class name="android/provider/CalendarContract$CalendarColumns" since="14">
+ <extends name="java/lang/Object" />
+ <field name="ALLOWED_ATTENDEE_TYPES" since="15" />
+ <field name="ALLOWED_AVAILABILITY" since="15" />
+ <field name="ALLOWED_REMINDERS" />
+ <field name="CALENDAR_ACCESS_LEVEL" />
+ <field name="CALENDAR_COLOR" />
+ <field name="CALENDAR_COLOR_KEY" since="15" />
+ <field name="CALENDAR_DISPLAY_NAME" />
+ <field name="CALENDAR_TIME_ZONE" />
+ <field name="CAL_ACCESS_CONTRIBUTOR" />
+ <field name="CAL_ACCESS_EDITOR" />
+ <field name="CAL_ACCESS_FREEBUSY" />
+ <field name="CAL_ACCESS_NONE" />
+ <field name="CAL_ACCESS_OVERRIDE" />
+ <field name="CAL_ACCESS_OWNER" />
+ <field name="CAL_ACCESS_READ" />
+ <field name="CAL_ACCESS_RESPOND" />
+ <field name="CAL_ACCESS_ROOT" />
+ <field name="CAN_MODIFY_TIME_ZONE" />
+ <field name="CAN_ORGANIZER_RESPOND" />
+ <field name="IS_PRIMARY" since="17" />
+ <field name="MAX_REMINDERS" />
+ <field name="OWNER_ACCOUNT" />
+ <field name="SYNC_EVENTS" />
+ <field name="VISIBLE" />
+ </class>
+ <class name="android/provider/CalendarContract$CalendarEntity" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/CalendarContract$CalendarColumns" />
+ <implements name="android/provider/CalendarContract$SyncColumns" />
+ <method name="&lt;init>()V" />
+ <method name="newEntityIterator(Landroid/database/Cursor;)Landroid/content/EntityIterator;" />
+ <field name="CONTENT_URI" />
+ </class>
+ <class name="android/provider/CalendarContract$CalendarSyncColumns" since="14">
+ <extends name="java/lang/Object" />
+ <field name="CAL_SYNC1" />
+ <field name="CAL_SYNC10" />
+ <field name="CAL_SYNC2" />
+ <field name="CAL_SYNC3" />
+ <field name="CAL_SYNC4" />
+ <field name="CAL_SYNC5" />
+ <field name="CAL_SYNC6" />
+ <field name="CAL_SYNC7" />
+ <field name="CAL_SYNC8" />
+ <field name="CAL_SYNC9" />
+ </class>
+ <class name="android/provider/CalendarContract$Calendars" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/CalendarContract$CalendarColumns" />
+ <implements name="android/provider/CalendarContract$SyncColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CALENDAR_LOCATION" />
+ <field name="CONTENT_URI" />
+ <field name="DEFAULT_SORT_ORDER" />
+ <field name="NAME" />
+ </class>
+ <class name="android/provider/CalendarContract$Colors" since="15">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/CalendarContract$ColorsColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_URI" />
+ </class>
+ <class name="android/provider/CalendarContract$ColorsColumns" since="15">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/SyncStateContract$Columns" />
+ <field name="COLOR" />
+ <field name="COLOR_KEY" />
+ <field name="COLOR_TYPE" />
+ <field name="TYPE_CALENDAR" />
+ <field name="TYPE_EVENT" />
+ </class>
+ <class name="android/provider/CalendarContract$EventDays" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/CalendarContract$EventDaysColumns" />
+ <method name="&lt;init>()V" />
+ <method name="query(Landroid/content/ContentResolver;II[Ljava/lang/String;)Landroid/database/Cursor;" />
+ <field name="CONTENT_URI" />
+ </class>
+ <class name="android/provider/CalendarContract$EventDaysColumns" since="14">
+ <extends name="java/lang/Object" />
+ <field name="ENDDAY" />
+ <field name="STARTDAY" />
+ </class>
+ <class name="android/provider/CalendarContract$Events" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/CalendarContract$CalendarColumns" />
+ <implements name="android/provider/CalendarContract$EventsColumns" />
+ <implements name="android/provider/CalendarContract$SyncColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_EXCEPTION_URI" />
+ <field name="CONTENT_URI" />
+ </class>
+ <class name="android/provider/CalendarContract$EventsColumns" since="14">
+ <extends name="java/lang/Object" />
+ <field name="ACCESS_CONFIDENTIAL" />
+ <field name="ACCESS_DEFAULT" />
+ <field name="ACCESS_LEVEL" />
+ <field name="ACCESS_PRIVATE" />
+ <field name="ACCESS_PUBLIC" />
+ <field name="ALL_DAY" />
+ <field name="AVAILABILITY" />
+ <field name="AVAILABILITY_BUSY" />
+ <field name="AVAILABILITY_FREE" />
+ <field name="AVAILABILITY_TENTATIVE" since="15" />
+ <field name="CALENDAR_ID" />
+ <field name="CAN_INVITE_OTHERS" />
+ <field name="CUSTOM_APP_PACKAGE" since="16" />
+ <field name="CUSTOM_APP_URI" since="16" />
+ <field name="DESCRIPTION" />
+ <field name="DISPLAY_COLOR" since="16" />
+ <field name="DTEND" />
+ <field name="DTSTART" />
+ <field name="DURATION" />
+ <field name="EVENT_COLOR" />
+ <field name="EVENT_COLOR_KEY" since="15" />
+ <field name="EVENT_END_TIMEZONE" />
+ <field name="EVENT_LOCATION" />
+ <field name="EVENT_TIMEZONE" />
+ <field name="EXDATE" />
+ <field name="EXRULE" />
+ <field name="GUESTS_CAN_INVITE_OTHERS" />
+ <field name="GUESTS_CAN_MODIFY" />
+ <field name="GUESTS_CAN_SEE_GUESTS" />
+ <field name="HAS_ALARM" />
+ <field name="HAS_ATTENDEE_DATA" />
+ <field name="HAS_EXTENDED_PROPERTIES" />
+ <field name="IS_ORGANIZER" since="17" />
+ <field name="LAST_DATE" />
+ <field name="LAST_SYNCED" />
+ <field name="ORGANIZER" />
+ <field name="ORIGINAL_ALL_DAY" />
+ <field name="ORIGINAL_ID" />
+ <field name="ORIGINAL_INSTANCE_TIME" />
+ <field name="ORIGINAL_SYNC_ID" />
+ <field name="RDATE" />
+ <field name="RRULE" />
+ <field name="SELF_ATTENDEE_STATUS" />
+ <field name="STATUS" />
+ <field name="STATUS_CANCELED" />
+ <field name="STATUS_CONFIRMED" />
+ <field name="STATUS_TENTATIVE" />
+ <field name="SYNC_DATA1" />
+ <field name="SYNC_DATA10" />
+ <field name="SYNC_DATA2" />
+ <field name="SYNC_DATA3" />
+ <field name="SYNC_DATA4" />
+ <field name="SYNC_DATA5" />
+ <field name="SYNC_DATA6" />
+ <field name="SYNC_DATA7" />
+ <field name="SYNC_DATA8" />
+ <field name="SYNC_DATA9" />
+ <field name="TITLE" />
+ <field name="UID_2445" since="17" />
+ </class>
+ <class name="android/provider/CalendarContract$EventsEntity" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/CalendarContract$EventsColumns" />
+ <implements name="android/provider/CalendarContract$SyncColumns" />
+ <method name="&lt;init>()V" />
+ <method name="newEntityIterator(Landroid/database/Cursor;Landroid/content/ContentProviderClient;)Landroid/content/EntityIterator;" />
+ <method name="newEntityIterator(Landroid/database/Cursor;Landroid/content/ContentResolver;)Landroid/content/EntityIterator;" />
+ <field name="CONTENT_URI" />
+ </class>
+ <class name="android/provider/CalendarContract$ExtendedProperties" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/CalendarContract$EventsColumns" />
+ <implements name="android/provider/CalendarContract$ExtendedPropertiesColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_URI" />
+ </class>
+ <class name="android/provider/CalendarContract$ExtendedPropertiesColumns" since="14">
+ <extends name="java/lang/Object" />
+ <field name="EVENT_ID" />
+ <field name="NAME" />
+ <field name="VALUE" />
+ </class>
+ <class name="android/provider/CalendarContract$Instances" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/CalendarContract$CalendarColumns" />
+ <implements name="android/provider/CalendarContract$EventsColumns" />
+ <method name="&lt;init>()V" />
+ <method name="query(Landroid/content/ContentResolver;[Ljava/lang/String;JJ)Landroid/database/Cursor;" />
+ <method name="query(Landroid/content/ContentResolver;[Ljava/lang/String;JJLjava/lang/String;)Landroid/database/Cursor;" />
+ <field name="BEGIN" />
+ <field name="CONTENT_BY_DAY_URI" />
+ <field name="CONTENT_SEARCH_BY_DAY_URI" />
+ <field name="CONTENT_SEARCH_URI" />
+ <field name="CONTENT_URI" />
+ <field name="END" />
+ <field name="END_DAY" />
+ <field name="END_MINUTE" />
+ <field name="EVENT_ID" />
+ <field name="START_DAY" />
+ <field name="START_MINUTE" />
+ </class>
+ <class name="android/provider/CalendarContract$Reminders" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/CalendarContract$EventsColumns" />
+ <implements name="android/provider/CalendarContract$RemindersColumns" />
+ <method name="&lt;init>()V" />
+ <method name="query(Landroid/content/ContentResolver;J[Ljava/lang/String;)Landroid/database/Cursor;" />
+ <field name="CONTENT_URI" />
+ </class>
+ <class name="android/provider/CalendarContract$RemindersColumns" since="14">
+ <extends name="java/lang/Object" />
+ <field name="EVENT_ID" />
+ <field name="METHOD" />
+ <field name="METHOD_ALARM" since="16" />
+ <field name="METHOD_ALERT" />
+ <field name="METHOD_DEFAULT" />
+ <field name="METHOD_EMAIL" />
+ <field name="METHOD_SMS" />
+ <field name="MINUTES" />
+ <field name="MINUTES_DEFAULT" />
+ </class>
+ <class name="android/provider/CalendarContract$SyncColumns" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/CalendarContract$CalendarSyncColumns" />
+ <field name="ACCOUNT_NAME" />
+ <field name="ACCOUNT_TYPE" />
+ <field name="CAN_PARTIALLY_UPDATE" />
+ <field name="DELETED" />
+ <field name="DIRTY" />
+ <field name="MUTATORS" since="18" />
+ <field name="_SYNC_ID" />
+ </class>
+ <class name="android/provider/CalendarContract$SyncState" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/SyncStateContract$Columns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_URI" />
+ </class>
+ <class name="android/provider/CallLog" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="AUTHORITY" />
+ <field name="CONTENT_URI" />
+ </class>
+ <class name="android/provider/CallLog$Calls" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <method name="&lt;init>()V" />
+ <method name="getLastOutgoingCall(Landroid/content/Context;)Ljava/lang/String;" since="8" />
+ <field name="CACHED_FORMATTED_NUMBER" since="21" />
+ <field name="CACHED_LOOKUP_URI" since="21" />
+ <field name="CACHED_MATCHED_NUMBER" since="21" />
+ <field name="CACHED_NAME" />
+ <field name="CACHED_NORMALIZED_NUMBER" since="21" />
+ <field name="CACHED_NUMBER_LABEL" />
+ <field name="CACHED_NUMBER_TYPE" />
+ <field name="CACHED_PHOTO_ID" since="21" />
+ <field name="CONTENT_FILTER_URI" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="CONTENT_TYPE" />
+ <field name="CONTENT_URI" />
+ <field name="CONTENT_URI_WITH_VOICEMAIL" since="21" />
+ <field name="COUNTRY_ISO" since="21" />
+ <field name="DATA_USAGE" since="21" />
+ <field name="DATE" />
+ <field name="DEFAULT_SORT_ORDER" />
+ <field name="DURATION" />
+ <field name="EXTRA_CALL_TYPE_FILTER" since="21" />
+ <field name="FEATURES" since="21" />
+ <field name="FEATURES_VIDEO" since="21" />
+ <field name="GEOCODED_LOCATION" since="21" />
+ <field name="INCOMING_TYPE" />
+ <field name="IS_READ" since="14" />
+ <field name="LIMIT_PARAM_KEY" since="17" />
+ <field name="MISSED_TYPE" />
+ <field name="NEW" />
+ <field name="NUMBER" />
+ <field name="NUMBER_PRESENTATION" since="19" />
+ <field name="OFFSET_PARAM_KEY" since="17" />
+ <field name="OUTGOING_TYPE" />
+ <field name="PHONE_ACCOUNT_COMPONENT_NAME" since="21" />
+ <field name="PHONE_ACCOUNT_ID" since="21" />
+ <field name="PRESENTATION_ALLOWED" since="19" />
+ <field name="PRESENTATION_PAYPHONE" since="19" />
+ <field name="PRESENTATION_RESTRICTED" since="19" />
+ <field name="PRESENTATION_UNKNOWN" since="19" />
+ <field name="TRANSCRIPTION" since="21" />
+ <field name="TYPE" />
+ <field name="VOICEMAIL_TYPE" since="21" />
+ <field name="VOICEMAIL_URI" since="21" />
+ </class>
+ <class name="android/provider/Contacts" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="AUTHORITY" />
+ <field name="CONTENT_URI" />
+ <field name="KIND_EMAIL" />
+ <field name="KIND_IM" />
+ <field name="KIND_ORGANIZATION" />
+ <field name="KIND_PHONE" />
+ <field name="KIND_POSTAL" />
+ </class>
+ <class name="android/provider/Contacts$ContactMethods" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/Contacts$ContactMethodsColumns" />
+ <implements name="android/provider/Contacts$PeopleColumns" />
+ <method name="&lt;init>()V" />
+ <method name="addPostalLocation(Landroid/content/Context;JDD)V" />
+ <method name="decodeImProtocol(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="encodeCustomImProtocol(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="encodePredefinedImProtocol(I)Ljava/lang/String;" />
+ <method name="getDisplayLabel(Landroid/content/Context;IILjava/lang/CharSequence;)Ljava/lang/CharSequence;" />
+ <field name="CONTENT_EMAIL_ITEM_TYPE" />
+ <field name="CONTENT_EMAIL_TYPE" />
+ <field name="CONTENT_EMAIL_URI" />
+ <field name="CONTENT_IM_ITEM_TYPE" />
+ <field name="CONTENT_POSTAL_ITEM_TYPE" />
+ <field name="CONTENT_POSTAL_TYPE" />
+ <field name="CONTENT_TYPE" />
+ <field name="CONTENT_URI" />
+ <field name="DEFAULT_SORT_ORDER" />
+ <field name="PERSON_ID" />
+ <field name="POSTAL_LOCATION_LATITUDE" />
+ <field name="POSTAL_LOCATION_LONGITUDE" />
+ <field name="PROTOCOL_AIM" />
+ <field name="PROTOCOL_GOOGLE_TALK" />
+ <field name="PROTOCOL_ICQ" />
+ <field name="PROTOCOL_JABBER" />
+ <field name="PROTOCOL_MSN" />
+ <field name="PROTOCOL_QQ" />
+ <field name="PROTOCOL_SKYPE" />
+ <field name="PROTOCOL_YAHOO" />
+ </class>
+ <class name="android/provider/Contacts$ContactMethodsColumns" since="1">
+ <extends name="java/lang/Object" />
+ <field name="AUX_DATA" />
+ <field name="DATA" />
+ <field name="ISPRIMARY" />
+ <field name="KIND" />
+ <field name="LABEL" />
+ <field name="TYPE" />
+ <field name="TYPE_CUSTOM" />
+ <field name="TYPE_HOME" />
+ <field name="TYPE_OTHER" />
+ <field name="TYPE_WORK" />
+ </class>
+ <class name="android/provider/Contacts$Extensions" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/Contacts$ExtensionsColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="CONTENT_TYPE" />
+ <field name="CONTENT_URI" />
+ <field name="DEFAULT_SORT_ORDER" />
+ <field name="PERSON_ID" />
+ </class>
+ <class name="android/provider/Contacts$ExtensionsColumns" since="1">
+ <extends name="java/lang/Object" />
+ <field name="NAME" />
+ <field name="VALUE" />
+ </class>
+ <class name="android/provider/Contacts$GroupMembership" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/Contacts$GroupsColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_DIRECTORY" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="CONTENT_TYPE" />
+ <field name="CONTENT_URI" />
+ <field name="DEFAULT_SORT_ORDER" />
+ <field name="GROUP_ID" />
+ <field name="GROUP_SYNC_ACCOUNT" />
+ <field name="GROUP_SYNC_ACCOUNT_TYPE" since="5" />
+ <field name="GROUP_SYNC_ID" />
+ <field name="PERSON_ID" />
+ <field name="RAW_CONTENT_URI" />
+ </class>
+ <class name="android/provider/Contacts$Groups" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/Contacts$GroupsColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="CONTENT_TYPE" />
+ <field name="CONTENT_URI" />
+ <field name="DEFAULT_SORT_ORDER" />
+ <field name="DELETED_CONTENT_URI" />
+ <field name="GROUP_ANDROID_STARRED" />
+ <field name="GROUP_MY_CONTACTS" />
+ </class>
+ <class name="android/provider/Contacts$GroupsColumns" since="1">
+ <extends name="java/lang/Object" />
+ <field name="NAME" />
+ <field name="NOTES" />
+ <field name="SHOULD_SYNC" />
+ <field name="SYSTEM_ID" />
+ </class>
+ <class name="android/provider/Contacts$Intents" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="ATTACH_IMAGE" />
+ <field name="EXTRA_CREATE_DESCRIPTION" since="3" />
+ <field name="EXTRA_FORCE_CREATE" since="3" />
+ <field name="SEARCH_SUGGESTION_CLICKED" />
+ <field name="SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED" />
+ <field name="SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED" />
+ <field name="SHOW_OR_CREATE_CONTACT" since="3" />
+ </class>
+ <class name="android/provider/Contacts$Intents$Insert" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="ACTION" />
+ <field name="COMPANY" />
+ <field name="EMAIL" />
+ <field name="EMAIL_ISPRIMARY" />
+ <field name="EMAIL_TYPE" />
+ <field name="FULL_MODE" />
+ <field name="IM_HANDLE" />
+ <field name="IM_ISPRIMARY" />
+ <field name="IM_PROTOCOL" />
+ <field name="JOB_TITLE" />
+ <field name="NAME" />
+ <field name="NOTES" />
+ <field name="PHONE" />
+ <field name="PHONETIC_NAME" since="3" />
+ <field name="PHONE_ISPRIMARY" />
+ <field name="PHONE_TYPE" />
+ <field name="POSTAL" />
+ <field name="POSTAL_ISPRIMARY" />
+ <field name="POSTAL_TYPE" />
+ <field name="SECONDARY_EMAIL" since="3" />
+ <field name="SECONDARY_EMAIL_TYPE" since="3" />
+ <field name="SECONDARY_PHONE" since="3" />
+ <field name="SECONDARY_PHONE_TYPE" since="3" />
+ <field name="TERTIARY_EMAIL" since="3" />
+ <field name="TERTIARY_EMAIL_TYPE" since="3" />
+ <field name="TERTIARY_PHONE" since="3" />
+ <field name="TERTIARY_PHONE_TYPE" since="3" />
+ </class>
+ <class name="android/provider/Contacts$Intents$UI" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="FILTER_CONTACTS_ACTION" />
+ <field name="FILTER_TEXT_EXTRA_KEY" />
+ <field name="GROUP_NAME_EXTRA_KEY" />
+ <field name="LIST_ALL_CONTACTS_ACTION" />
+ <field name="LIST_CONTACTS_WITH_PHONES_ACTION" />
+ <field name="LIST_DEFAULT" />
+ <field name="LIST_FREQUENT_ACTION" />
+ <field name="LIST_GROUP_ACTION" />
+ <field name="LIST_STARRED_ACTION" />
+ <field name="LIST_STREQUENT_ACTION" />
+ <field name="TITLE_EXTRA_KEY" />
+ </class>
+ <class name="android/provider/Contacts$OrganizationColumns" since="1">
+ <extends name="java/lang/Object" />
+ <field name="COMPANY" />
+ <field name="ISPRIMARY" />
+ <field name="LABEL" />
+ <field name="PERSON_ID" />
+ <field name="TITLE" />
+ <field name="TYPE" />
+ <field name="TYPE_CUSTOM" />
+ <field name="TYPE_OTHER" />
+ <field name="TYPE_WORK" />
+ </class>
+ <class name="android/provider/Contacts$Organizations" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/Contacts$OrganizationColumns" />
+ <method name="&lt;init>()V" />
+ <method name="getDisplayLabel(Landroid/content/Context;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;" />
+ <field name="CONTENT_DIRECTORY" />
+ <field name="CONTENT_URI" />
+ <field name="DEFAULT_SORT_ORDER" />
+ </class>
+ <class name="android/provider/Contacts$People" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/Contacts$PeopleColumns" />
+ <implements name="android/provider/Contacts$PhonesColumns" />
+ <implements name="android/provider/Contacts$PresenceColumns" />
+ <method name="&lt;init>()V" />
+ <method name="addToGroup(Landroid/content/ContentResolver;JJ)Landroid/net/Uri;" />
+ <method name="addToGroup(Landroid/content/ContentResolver;JLjava/lang/String;)Landroid/net/Uri;" />
+ <method name="addToMyContactsGroup(Landroid/content/ContentResolver;J)Landroid/net/Uri;" />
+ <method name="createPersonInMyContactsGroup(Landroid/content/ContentResolver;Landroid/content/ContentValues;)Landroid/net/Uri;" />
+ <method name="loadContactPhoto(Landroid/content/Context;Landroid/net/Uri;ILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;" />
+ <method name="markAsContacted(Landroid/content/ContentResolver;J)V" />
+ <method name="openContactPhotoInputStream(Landroid/content/ContentResolver;Landroid/net/Uri;)Ljava/io/InputStream;" />
+ <method name="queryGroups(Landroid/content/ContentResolver;J)Landroid/database/Cursor;" />
+ <method name="setPhotoData(Landroid/content/ContentResolver;Landroid/net/Uri;[B)V" />
+ <field name="CONTENT_FILTER_URI" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="CONTENT_TYPE" />
+ <field name="CONTENT_URI" />
+ <field name="DEFAULT_SORT_ORDER" />
+ <field name="DELETED_CONTENT_URI" />
+ <field name="PRIMARY_EMAIL_ID" />
+ <field name="PRIMARY_ORGANIZATION_ID" />
+ <field name="PRIMARY_PHONE_ID" />
+ </class>
+ <class name="android/provider/Contacts$People$ContactMethods" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/Contacts$ContactMethodsColumns" />
+ <implements name="android/provider/Contacts$PeopleColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_DIRECTORY" />
+ <field name="DEFAULT_SORT_ORDER" />
+ </class>
+ <class name="android/provider/Contacts$People$Extensions" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/Contacts$ExtensionsColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_DIRECTORY" />
+ <field name="DEFAULT_SORT_ORDER" />
+ <field name="PERSON_ID" />
+ </class>
+ <class name="android/provider/Contacts$People$Phones" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/Contacts$PeopleColumns" />
+ <implements name="android/provider/Contacts$PhonesColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_DIRECTORY" />
+ <field name="DEFAULT_SORT_ORDER" />
+ </class>
+ <class name="android/provider/Contacts$PeopleColumns" since="1">
+ <extends name="java/lang/Object" />
+ <field name="CUSTOM_RINGTONE" />
+ <field name="DISPLAY_NAME" />
+ <field name="LAST_TIME_CONTACTED" />
+ <field name="NAME" />
+ <field name="NOTES" />
+ <field name="PHONETIC_NAME" since="3" />
+ <field name="PHOTO_VERSION" />
+ <field name="SEND_TO_VOICEMAIL" />
+ <field name="STARRED" />
+ <field name="TIMES_CONTACTED" />
+ </class>
+ <class name="android/provider/Contacts$Phones" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/Contacts$PeopleColumns" />
+ <implements name="android/provider/Contacts$PhonesColumns" />
+ <method name="&lt;init>()V" />
+ <method name="getDisplayLabel(Landroid/content/Context;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;" />
+ <method name="getDisplayLabel(Landroid/content/Context;ILjava/lang/CharSequence;[Ljava/lang/CharSequence;)Ljava/lang/CharSequence;" />
+ <field name="CONTENT_FILTER_URL" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="CONTENT_TYPE" />
+ <field name="CONTENT_URI" />
+ <field name="DEFAULT_SORT_ORDER" />
+ <field name="PERSON_ID" />
+ </class>
+ <class name="android/provider/Contacts$PhonesColumns" since="1">
+ <extends name="java/lang/Object" />
+ <field name="ISPRIMARY" />
+ <field name="LABEL" />
+ <field name="NUMBER" />
+ <field name="NUMBER_KEY" />
+ <field name="TYPE" />
+ <field name="TYPE_CUSTOM" />
+ <field name="TYPE_FAX_HOME" />
+ <field name="TYPE_FAX_WORK" />
+ <field name="TYPE_HOME" />
+ <field name="TYPE_MOBILE" />
+ <field name="TYPE_OTHER" />
+ <field name="TYPE_PAGER" />
+ <field name="TYPE_WORK" />
+ </class>
+ <class name="android/provider/Contacts$Photos" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/Contacts$PhotosColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_DIRECTORY" />
+ <field name="CONTENT_URI" />
+ <field name="DEFAULT_SORT_ORDER" />
+ </class>
+ <class name="android/provider/Contacts$PhotosColumns" since="1">
+ <extends name="java/lang/Object" />
+ <field name="DATA" />
+ <field name="DOWNLOAD_REQUIRED" />
+ <field name="EXISTS_ON_SERVER" />
+ <field name="LOCAL_VERSION" />
+ <field name="PERSON_ID" />
+ <field name="SYNC_ERROR" />
+ </class>
+ <class name="android/provider/Contacts$PresenceColumns" since="1">
+ <extends name="java/lang/Object" />
+ <field name="AVAILABLE" since="8" />
+ <field name="AWAY" since="8" />
+ <field name="DO_NOT_DISTURB" since="8" />
+ <field name="IDLE" since="8" />
+ <field name="IM_ACCOUNT" />
+ <field name="IM_HANDLE" />
+ <field name="IM_PROTOCOL" />
+ <field name="INVISIBLE" since="8" />
+ <field name="OFFLINE" since="8" />
+ <field name="PRESENCE_CUSTOM_STATUS" since="8" />
+ <field name="PRESENCE_STATUS" since="8" />
+ <field name="PRIORITY" since="8" />
+ </class>
+ <class name="android/provider/Contacts$Settings" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/Contacts$SettingsColumns" />
+ <method name="&lt;init>()V" />
+ <method name="getSetting(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="setSetting(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <field name="CONTENT_DIRECTORY" />
+ <field name="CONTENT_URI" />
+ <field name="DEFAULT_SORT_ORDER" />
+ <field name="SYNC_EVERYTHING" />
+ </class>
+ <class name="android/provider/Contacts$SettingsColumns" since="1">
+ <extends name="java/lang/Object" />
+ <field name="KEY" />
+ <field name="VALUE" />
+ <field name="_SYNC_ACCOUNT" />
+ <field name="_SYNC_ACCOUNT_TYPE" since="5" />
+ </class>
+ <class name="android/provider/ContactsContract" since="5">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="isProfileId(J)Z" since="14" />
+ <field name="AUTHORITY" />
+ <field name="AUTHORITY_URI" />
+ <field name="CALLER_IS_SYNCADAPTER" />
+ <field name="DEFERRED_SNIPPETING" since="21" />
+ <field name="DEFERRED_SNIPPETING_QUERY" since="21" />
+ <field name="DIRECTORY_PARAM_KEY" since="11" />
+ <field name="LIMIT_PARAM_KEY" since="11" />
+ <field name="PRIMARY_ACCOUNT_NAME" since="14" />
+ <field name="PRIMARY_ACCOUNT_TYPE" since="14" />
+ <field name="REMOVE_DUPLICATE_ENTRIES" since="21" />
+ <field name="STREQUENT_PHONE_ONLY" since="21" />
+ </class>
+ <class name="android/provider/ContactsContract$AggregationExceptions" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="CONTENT_TYPE" />
+ <field name="CONTENT_URI" />
+ <field name="RAW_CONTACT_ID1" />
+ <field name="RAW_CONTACT_ID2" />
+ <field name="TYPE" />
+ <field name="TYPE_AUTOMATIC" />
+ <field name="TYPE_KEEP_SEPARATE" />
+ <field name="TYPE_KEEP_TOGETHER" />
+ </class>
+ <class name="android/provider/ContactsContract$BaseSyncColumns" since="5">
+ <extends name="java/lang/Object" />
+ <field name="SYNC1" />
+ <field name="SYNC2" />
+ <field name="SYNC3" />
+ <field name="SYNC4" />
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds" since="5">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$BaseTypes" since="5">
+ <extends name="java/lang/Object" />
+ <field name="TYPE_CUSTOM" />
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$Callable" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/ContactsContract$CommonDataKinds$CommonColumns" />
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_FILTER_URI" />
+ <field name="CONTENT_URI" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" />
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$CommonColumns" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/ContactsContract$CommonDataKinds$BaseTypes" />
+ <field name="DATA" />
+ <field name="LABEL" />
+ <field name="TYPE" />
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$Contactables" since="18">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/ContactsContract$CommonDataKinds$CommonColumns" />
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_FILTER_URI" />
+ <field name="CONTENT_URI" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21" />
+ <field name="VISIBLE_CONTACTS_ONLY" />
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$Email" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/ContactsContract$CommonDataKinds$CommonColumns" />
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins" />
+ <method name="&lt;init>()V" />
+ <method name="getTypeLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;" />
+ <method name="getTypeLabelResource(I)I" />
+ <field name="ADDRESS" since="11" />
+ <field name="CONTENT_FILTER_URI" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="CONTENT_LOOKUP_URI" />
+ <field name="CONTENT_TYPE" />
+ <field name="CONTENT_URI" />
+ <field name="DISPLAY_NAME" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21" />
+ <field name="TYPE_HOME" />
+ <field name="TYPE_MOBILE" />
+ <field name="TYPE_OTHER" />
+ <field name="TYPE_WORK" />
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$Event" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/ContactsContract$CommonDataKinds$CommonColumns" />
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins" />
+ <method name="&lt;init>()V" />
+ <method name="getTypeLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;" since="21" />
+ <method name="getTypeResource(Ljava/lang/Integer;)I" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21" />
+ <field name="START_DATE" />
+ <field name="TYPE_ANNIVERSARY" />
+ <field name="TYPE_BIRTHDAY" />
+ <field name="TYPE_OTHER" />
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$GroupMembership" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21" />
+ <field name="GROUP_ROW_ID" />
+ <field name="GROUP_SOURCE_ID" />
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$Identity" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21" />
+ <field name="IDENTITY" />
+ <field name="NAMESPACE" />
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$Im" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/ContactsContract$CommonDataKinds$CommonColumns" />
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins" />
+ <method name="&lt;init>()V" />
+ <method name="getProtocolLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;" />
+ <method name="getProtocolLabelResource(I)I" />
+ <method name="getTypeLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;" />
+ <method name="getTypeLabelResource(I)I" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="CUSTOM_PROTOCOL" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21" />
+ <field name="PROTOCOL" />
+ <field name="PROTOCOL_AIM" />
+ <field name="PROTOCOL_CUSTOM" />
+ <field name="PROTOCOL_GOOGLE_TALK" />
+ <field name="PROTOCOL_ICQ" />
+ <field name="PROTOCOL_JABBER" />
+ <field name="PROTOCOL_MSN" />
+ <field name="PROTOCOL_NETMEETING" />
+ <field name="PROTOCOL_QQ" />
+ <field name="PROTOCOL_SKYPE" />
+ <field name="PROTOCOL_YAHOO" />
+ <field name="TYPE_HOME" />
+ <field name="TYPE_OTHER" />
+ <field name="TYPE_WORK" />
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$Nickname" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/ContactsContract$CommonDataKinds$CommonColumns" />
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21" />
+ <field name="NAME" />
+ <field name="TYPE_DEFAULT" />
+ <field name="TYPE_INITIALS" />
+ <field name="TYPE_MAIDEN_NAME" since="9" />
+ <field name="TYPE_MAINDEN_NAME" />
+ <field name="TYPE_OTHER_NAME" />
+ <field name="TYPE_SHORT_NAME" />
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$Note" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21" />
+ <field name="NOTE" />
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$Organization" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/ContactsContract$CommonDataKinds$CommonColumns" />
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins" />
+ <method name="&lt;init>()V" />
+ <method name="getTypeLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;" />
+ <method name="getTypeLabelResource(I)I" />
+ <field name="COMPANY" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="DEPARTMENT" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21" />
+ <field name="JOB_DESCRIPTION" />
+ <field name="OFFICE_LOCATION" />
+ <field name="PHONETIC_NAME" />
+ <field name="SYMBOL" />
+ <field name="TITLE" />
+ <field name="TYPE_OTHER" />
+ <field name="TYPE_WORK" />
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$Phone" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/ContactsContract$CommonDataKinds$CommonColumns" />
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins" />
+ <method name="&lt;init>()V" />
+ <method name="getTypeLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;" />
+ <method name="getTypeLabelResource(I)I" />
+ <field name="CONTENT_FILTER_URI" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="CONTENT_TYPE" />
+ <field name="CONTENT_URI" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21" />
+ <field name="NORMALIZED_NUMBER" since="16" />
+ <field name="NUMBER" />
+ <field name="SEARCH_DISPLAY_NAME_KEY" since="16" />
+ <field name="SEARCH_PHONE_NUMBER_KEY" since="16" />
+ <field name="TYPE_ASSISTANT" />
+ <field name="TYPE_CALLBACK" />
+ <field name="TYPE_CAR" />
+ <field name="TYPE_COMPANY_MAIN" />
+ <field name="TYPE_FAX_HOME" />
+ <field name="TYPE_FAX_WORK" />
+ <field name="TYPE_HOME" />
+ <field name="TYPE_ISDN" />
+ <field name="TYPE_MAIN" />
+ <field name="TYPE_MMS" />
+ <field name="TYPE_MOBILE" />
+ <field name="TYPE_OTHER" />
+ <field name="TYPE_OTHER_FAX" />
+ <field name="TYPE_PAGER" />
+ <field name="TYPE_RADIO" />
+ <field name="TYPE_TELEX" />
+ <field name="TYPE_TTY_TDD" />
+ <field name="TYPE_WORK" />
+ <field name="TYPE_WORK_MOBILE" />
+ <field name="TYPE_WORK_PAGER" />
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$Photo" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21" />
+ <field name="PHOTO" />
+ <field name="PHOTO_FILE_ID" since="14" />
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$Relation" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/ContactsContract$CommonDataKinds$CommonColumns" />
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins" />
+ <method name="&lt;init>()V" />
+ <method name="getTypeLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;" since="11" />
+ <method name="getTypeLabelResource(I)I" since="11" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21" />
+ <field name="NAME" />
+ <field name="TYPE_ASSISTANT" />
+ <field name="TYPE_BROTHER" />
+ <field name="TYPE_CHILD" />
+ <field name="TYPE_DOMESTIC_PARTNER" />
+ <field name="TYPE_FATHER" />
+ <field name="TYPE_FRIEND" />
+ <field name="TYPE_MANAGER" />
+ <field name="TYPE_MOTHER" />
+ <field name="TYPE_PARENT" />
+ <field name="TYPE_PARTNER" />
+ <field name="TYPE_REFERRED_BY" />
+ <field name="TYPE_RELATIVE" />
+ <field name="TYPE_SISTER" />
+ <field name="TYPE_SPOUSE" />
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$SipAddress" since="9">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/ContactsContract$CommonDataKinds$CommonColumns" />
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins" />
+ <method name="&lt;init>()V" />
+ <method name="getTypeLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;" />
+ <method name="getTypeLabelResource(I)I" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21" />
+ <field name="SIP_ADDRESS" />
+ <field name="TYPE_HOME" />
+ <field name="TYPE_OTHER" />
+ <field name="TYPE_WORK" />
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$StructuredName" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="DISPLAY_NAME" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21" />
+ <field name="FAMILY_NAME" />
+ <field name="FULL_NAME_STYLE" since="21" />
+ <field name="GIVEN_NAME" />
+ <field name="MIDDLE_NAME" />
+ <field name="PHONETIC_FAMILY_NAME" />
+ <field name="PHONETIC_GIVEN_NAME" />
+ <field name="PHONETIC_MIDDLE_NAME" />
+ <field name="PREFIX" />
+ <field name="SUFFIX" />
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$StructuredPostal" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/ContactsContract$CommonDataKinds$CommonColumns" />
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins" />
+ <method name="&lt;init>()V" />
+ <method name="getTypeLabel(Landroid/content/res/Resources;ILjava/lang/CharSequence;)Ljava/lang/CharSequence;" />
+ <method name="getTypeLabelResource(I)I" />
+ <field name="CITY" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="CONTENT_TYPE" />
+ <field name="CONTENT_URI" />
+ <field name="COUNTRY" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21" />
+ <field name="FORMATTED_ADDRESS" />
+ <field name="NEIGHBORHOOD" />
+ <field name="POBOX" />
+ <field name="POSTCODE" />
+ <field name="REGION" />
+ <field name="STREET" />
+ <field name="TYPE_HOME" />
+ <field name="TYPE_OTHER" />
+ <field name="TYPE_WORK" />
+ </class>
+ <class name="android/provider/ContactsContract$CommonDataKinds$Website" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/ContactsContract$CommonDataKinds$CommonColumns" />
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21" />
+ <field name="TYPE_BLOG" />
+ <field name="TYPE_FTP" />
+ <field name="TYPE_HOME" />
+ <field name="TYPE_HOMEPAGE" />
+ <field name="TYPE_OTHER" />
+ <field name="TYPE_PROFILE" />
+ <field name="TYPE_WORK" />
+ <field name="URL" />
+ </class>
+ <class name="android/provider/ContactsContract$ContactNameColumns" since="11">
+ <extends name="java/lang/Object" />
+ <field name="DISPLAY_NAME_ALTERNATIVE" />
+ <field name="DISPLAY_NAME_PRIMARY" />
+ <field name="DISPLAY_NAME_SOURCE" />
+ <field name="PHONETIC_NAME" />
+ <field name="PHONETIC_NAME_STYLE" />
+ <field name="SORT_KEY_ALTERNATIVE" />
+ <field name="SORT_KEY_PRIMARY" />
+ </class>
+ <class name="android/provider/ContactsContract$ContactOptionsColumns" since="5">
+ <extends name="java/lang/Object" />
+ <field name="CUSTOM_RINGTONE" />
+ <field name="LAST_TIME_CONTACTED" />
+ <field name="PINNED" since="21" />
+ <field name="SEND_TO_VOICEMAIL" />
+ <field name="STARRED" />
+ <field name="TIMES_CONTACTED" />
+ </class>
+ <class name="android/provider/ContactsContract$ContactStatusColumns" since="5">
+ <extends name="java/lang/Object" />
+ <field name="CONTACT_CHAT_CAPABILITY" since="11" />
+ <field name="CONTACT_PRESENCE" />
+ <field name="CONTACT_STATUS" />
+ <field name="CONTACT_STATUS_ICON" />
+ <field name="CONTACT_STATUS_LABEL" />
+ <field name="CONTACT_STATUS_RES_PACKAGE" />
+ <field name="CONTACT_STATUS_TIMESTAMP" />
+ </class>
+ <class name="android/provider/ContactsContract$Contacts" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/ContactsContract$ContactNameColumns" since="11" />
+ <implements name="android/provider/ContactsContract$ContactOptionsColumns" />
+ <implements name="android/provider/ContactsContract$ContactStatusColumns" />
+ <implements name="android/provider/ContactsContract$ContactsColumns" />
+ <method name="&lt;init>()V" />
+ <method name="getLookupUri(JLjava/lang/String;)Landroid/net/Uri;" />
+ <method name="getLookupUri(Landroid/content/ContentResolver;Landroid/net/Uri;)Landroid/net/Uri;" />
+ <method name="isEnterpriseContactId(J)Z" since="21" />
+ <method name="lookupContact(Landroid/content/ContentResolver;Landroid/net/Uri;)Landroid/net/Uri;" />
+ <method name="markAsContacted(Landroid/content/ContentResolver;J)V" />
+ <method name="openContactPhotoInputStream(Landroid/content/ContentResolver;Landroid/net/Uri;)Ljava/io/InputStream;" />
+ <method name="openContactPhotoInputStream(Landroid/content/ContentResolver;Landroid/net/Uri;Z)Ljava/io/InputStream;" since="14" />
+ <field name="CONTENT_FILTER_URI" />
+ <field name="CONTENT_FREQUENT_URI" since="21" />
+ <field name="CONTENT_GROUP_URI" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="CONTENT_LOOKUP_URI" />
+ <field name="CONTENT_MULTI_VCARD_URI" since="21" />
+ <field name="CONTENT_STREQUENT_FILTER_URI" />
+ <field name="CONTENT_STREQUENT_URI" />
+ <field name="CONTENT_TYPE" />
+ <field name="CONTENT_URI" />
+ <field name="CONTENT_VCARD_TYPE" />
+ <field name="CONTENT_VCARD_URI" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21" />
+ </class>
+ <class name="android/provider/ContactsContract$Contacts$AggregationSuggestions" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/ContactsContract$ContactOptionsColumns" since="11" />
+ <implements name="android/provider/ContactsContract$ContactStatusColumns" since="11" />
+ <implements name="android/provider/ContactsContract$ContactsColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_DIRECTORY" />
+ </class>
+ <class name="android/provider/ContactsContract$Contacts$Data" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/ContactsContract$DataColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_DIRECTORY" />
+ </class>
+ <class name="android/provider/ContactsContract$Contacts$Entity" since="11">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/ContactsContract$BaseSyncColumns" />
+ <implements name="android/provider/ContactsContract$ContactNameColumns" />
+ <implements name="android/provider/ContactsContract$ContactOptionsColumns" />
+ <implements name="android/provider/ContactsContract$ContactStatusColumns" />
+ <implements name="android/provider/ContactsContract$ContactsColumns" />
+ <implements name="android/provider/ContactsContract$DataColumns" />
+ <implements name="android/provider/ContactsContract$DataUsageStatColumns" since="21" />
+ <implements name="android/provider/ContactsContract$RawContactsColumns" />
+ <implements name="android/provider/ContactsContract$StatusColumns" />
+ <implements name="android/provider/ContactsContract$SyncColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_DIRECTORY" />
+ <field name="DATA_ID" />
+ <field name="RAW_CONTACT_ID" />
+ </class>
+ <class name="android/provider/ContactsContract$Contacts$Photo" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/ContactsContract$DataColumns" />
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins" since="11" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_DIRECTORY" />
+ <field name="DISPLAY_PHOTO" since="14" />
+ <field name="PHOTO" since="11" />
+ <field name="PHOTO_FILE_ID" since="14" />
+ </class>
+ <class name="android/provider/ContactsContract$Contacts$StreamItems" since="15">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/ContactsContract$StreamItemsColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_DIRECTORY" />
+ </class>
+ <class name="android/provider/ContactsContract$ContactsColumns" since="5">
+ <extends name="java/lang/Object" />
+ <field name="CONTACT_LAST_UPDATED_TIMESTAMP" since="18" />
+ <field name="DISPLAY_NAME" />
+ <field name="HAS_PHONE_NUMBER" />
+ <field name="IN_DEFAULT_DIRECTORY" since="21" />
+ <field name="IN_VISIBLE_GROUP" />
+ <field name="IS_USER_PROFILE" since="14" />
+ <field name="LOOKUP_KEY" />
+ <field name="NAME_RAW_CONTACT_ID" since="21" />
+ <field name="PHOTO_FILE_ID" since="14" />
+ <field name="PHOTO_ID" />
+ <field name="PHOTO_THUMBNAIL_URI" since="11" />
+ <field name="PHOTO_URI" since="11" />
+ </class>
+ <class name="android/provider/ContactsContract$Data" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/ContactsContract$DataColumnsWithJoins" />
+ <method name="&lt;init>()V" />
+ <method name="getContactLookupUri(Landroid/content/ContentResolver;Landroid/net/Uri;)Landroid/net/Uri;" />
+ <field name="CONTENT_TYPE" />
+ <field name="CONTENT_URI" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_COUNTS" since="21" />
+ <field name="EXTRA_ADDRESS_BOOK_INDEX_TITLES" since="21" />
+ <field name="VISIBLE_CONTACTS_ONLY" since="18" />
+ </class>
+ <class name="android/provider/ContactsContract$DataColumns" since="5">
+ <extends name="java/lang/Object" />
+ <field name="DATA1" />
+ <field name="DATA10" />
+ <field name="DATA11" />
+ <field name="DATA12" />
+ <field name="DATA13" />
+ <field name="DATA14" />
+ <field name="DATA15" />
+ <field name="DATA2" />
+ <field name="DATA3" />
+ <field name="DATA4" />
+ <field name="DATA5" />
+ <field name="DATA6" />
+ <field name="DATA7" />
+ <field name="DATA8" />
+ <field name="DATA9" />
+ <field name="DATA_VERSION" />
+ <field name="IS_PRIMARY" />
+ <field name="IS_READ_ONLY" since="11" />
+ <field name="IS_SUPER_PRIMARY" />
+ <field name="MIMETYPE" />
+ <field name="RAW_CONTACT_ID" />
+ <field name="RES_PACKAGE" since="21" />
+ <field name="SYNC1" />
+ <field name="SYNC2" />
+ <field name="SYNC3" />
+ <field name="SYNC4" />
+ </class>
+ <class name="android/provider/ContactsContract$DataColumnsWithJoins" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/ContactsContract$ContactNameColumns" since="11" />
+ <implements name="android/provider/ContactsContract$ContactOptionsColumns" />
+ <implements name="android/provider/ContactsContract$ContactStatusColumns" />
+ <implements name="android/provider/ContactsContract$ContactsColumns" />
+ <implements name="android/provider/ContactsContract$DataColumns" />
+ <implements name="android/provider/ContactsContract$DataUsageStatColumns" since="18" />
+ <implements name="android/provider/ContactsContract$RawContactsColumns" />
+ <implements name="android/provider/ContactsContract$StatusColumns" />
+ </class>
+ <class name="android/provider/ContactsContract$DataUsageFeedback" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="DELETE_USAGE_URI" since="16" />
+ <field name="FEEDBACK_URI" />
+ <field name="USAGE_TYPE" />
+ <field name="USAGE_TYPE_CALL" />
+ <field name="USAGE_TYPE_LONG_TEXT" />
+ <field name="USAGE_TYPE_SHORT_TEXT" />
+ </class>
+ <class name="android/provider/ContactsContract$DataUsageStatColumns" since="18">
+ <extends name="java/lang/Object" />
+ <field name="LAST_TIME_USED" />
+ <field name="TIMES_USED" />
+ </class>
+ <class name="android/provider/ContactsContract$DeletedContacts" since="18">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/ContactsContract$DeletedContactsColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_URI" />
+ <field name="DAYS_KEPT_MILLISECONDS" />
+ </class>
+ <class name="android/provider/ContactsContract$DeletedContactsColumns" since="18">
+ <extends name="java/lang/Object" />
+ <field name="CONTACT_DELETED_TIMESTAMP" />
+ <field name="CONTACT_ID" />
+ </class>
+ <class name="android/provider/ContactsContract$Directory" since="11">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <method name="&lt;init>()V" />
+ <method name="notifyDirectoryChange(Landroid/content/ContentResolver;)V" />
+ <field name="ACCOUNT_NAME" />
+ <field name="ACCOUNT_TYPE" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="CONTENT_TYPE" />
+ <field name="CONTENT_URI" />
+ <field name="DEFAULT" />
+ <field name="DIRECTORY_AUTHORITY" />
+ <field name="DISPLAY_NAME" />
+ <field name="EXPORT_SUPPORT" />
+ <field name="EXPORT_SUPPORT_ANY_ACCOUNT" />
+ <field name="EXPORT_SUPPORT_NONE" />
+ <field name="EXPORT_SUPPORT_SAME_ACCOUNT_ONLY" />
+ <field name="LOCAL_INVISIBLE" />
+ <field name="PACKAGE_NAME" />
+ <field name="PHOTO_SUPPORT" />
+ <field name="PHOTO_SUPPORT_FULL" />
+ <field name="PHOTO_SUPPORT_FULL_SIZE_ONLY" />
+ <field name="PHOTO_SUPPORT_NONE" />
+ <field name="PHOTO_SUPPORT_THUMBNAIL_ONLY" />
+ <field name="SHORTCUT_SUPPORT" />
+ <field name="SHORTCUT_SUPPORT_DATA_ITEMS_ONLY" />
+ <field name="SHORTCUT_SUPPORT_FULL" />
+ <field name="SHORTCUT_SUPPORT_NONE" />
+ <field name="TYPE_RESOURCE_ID" />
+ </class>
+ <class name="android/provider/ContactsContract$DisplayNameSources" since="11">
+ <extends name="java/lang/Object" />
+ <field name="EMAIL" />
+ <field name="NICKNAME" />
+ <field name="ORGANIZATION" />
+ <field name="PHONE" />
+ <field name="STRUCTURED_NAME" />
+ <field name="UNDEFINED" />
+ </class>
+ <class name="android/provider/ContactsContract$DisplayPhoto" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_MAX_DIMENSIONS_URI" />
+ <field name="CONTENT_URI" />
+ <field name="DISPLAY_MAX_DIM" />
+ <field name="THUMBNAIL_MAX_DIM" />
+ </class>
+ <class name="android/provider/ContactsContract$FullNameStyle" since="11">
+ <extends name="java/lang/Object" />
+ <field name="CHINESE" />
+ <field name="CJK" />
+ <field name="JAPANESE" />
+ <field name="KOREAN" />
+ <field name="UNDEFINED" />
+ <field name="WESTERN" />
+ </class>
+ <class name="android/provider/ContactsContract$Groups" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/ContactsContract$GroupsColumns" />
+ <implements name="android/provider/ContactsContract$SyncColumns" />
+ <method name="&lt;init>()V" />
+ <method name="newEntityIterator(Landroid/database/Cursor;)Landroid/content/EntityIterator;" since="8" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="CONTENT_SUMMARY_URI" />
+ <field name="CONTENT_TYPE" />
+ <field name="CONTENT_URI" />
+ </class>
+ <class name="android/provider/ContactsContract$GroupsColumns" since="5">
+ <extends name="java/lang/Object" />
+ <field name="AUTO_ADD" since="11" />
+ <field name="DATA_SET" since="14" />
+ <field name="DELETED" />
+ <field name="FAVORITES" since="11" />
+ <field name="GROUP_IS_READ_ONLY" since="11" />
+ <field name="GROUP_VISIBLE" />
+ <field name="NOTES" />
+ <field name="RES_PACKAGE" since="21" />
+ <field name="SHOULD_SYNC" />
+ <field name="SUMMARY_COUNT" />
+ <field name="SUMMARY_WITH_PHONES" />
+ <field name="SYSTEM_ID" />
+ <field name="TITLE" />
+ <field name="TITLE_RES" since="21" />
+ </class>
+ <class name="android/provider/ContactsContract$Intents" since="5">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="ATTACH_IMAGE" />
+ <field name="CONTACTS_DATABASE_CREATED" since="18" />
+ <field name="EXTRA_CREATE_DESCRIPTION" />
+ <field name="EXTRA_FORCE_CREATE" />
+ <field name="INVITE_CONTACT" since="14" />
+ <field name="SEARCH_SUGGESTION_CLICKED" />
+ <field name="SEARCH_SUGGESTION_CREATE_CONTACT_CLICKED" />
+ <field name="SEARCH_SUGGESTION_DIAL_NUMBER_CLICKED" />
+ <field name="SHOW_OR_CREATE_CONTACT" />
+ </class>
+ <class name="android/provider/ContactsContract$Intents$Insert" since="5">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="ACTION" />
+ <field name="COMPANY" />
+ <field name="DATA" since="11" />
+ <field name="EMAIL" />
+ <field name="EMAIL_ISPRIMARY" />
+ <field name="EMAIL_TYPE" />
+ <field name="FULL_MODE" />
+ <field name="IM_HANDLE" />
+ <field name="IM_ISPRIMARY" />
+ <field name="IM_PROTOCOL" />
+ <field name="JOB_TITLE" />
+ <field name="NAME" />
+ <field name="NOTES" />
+ <field name="PHONE" />
+ <field name="PHONETIC_NAME" />
+ <field name="PHONE_ISPRIMARY" />
+ <field name="PHONE_TYPE" />
+ <field name="POSTAL" />
+ <field name="POSTAL_ISPRIMARY" />
+ <field name="POSTAL_TYPE" />
+ <field name="SECONDARY_EMAIL" />
+ <field name="SECONDARY_EMAIL_TYPE" />
+ <field name="SECONDARY_PHONE" />
+ <field name="SECONDARY_PHONE_TYPE" />
+ <field name="TERTIARY_EMAIL" />
+ <field name="TERTIARY_EMAIL_TYPE" />
+ <field name="TERTIARY_PHONE" />
+ <field name="TERTIARY_PHONE_TYPE" />
+ </class>
+ <class name="android/provider/ContactsContract$PhoneLookup" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/ContactsContract$ContactOptionsColumns" />
+ <implements name="android/provider/ContactsContract$ContactsColumns" />
+ <implements name="android/provider/ContactsContract$PhoneLookupColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_FILTER_URI" />
+ <field name="ENTERPRISE_CONTENT_FILTER_URI" since="21" />
+ <field name="QUERY_PARAMETER_SIP_ADDRESS" since="21" />
+ </class>
+ <class name="android/provider/ContactsContract$PhoneLookupColumns" since="5">
+ <extends name="java/lang/Object" />
+ <field name="LABEL" />
+ <field name="NORMALIZED_NUMBER" since="16" />
+ <field name="NUMBER" />
+ <field name="TYPE" />
+ </class>
+ <class name="android/provider/ContactsContract$PhoneticNameStyle" since="11">
+ <extends name="java/lang/Object" />
+ <field name="JAPANESE" />
+ <field name="KOREAN" />
+ <field name="PINYIN" />
+ <field name="UNDEFINED" />
+ </class>
+ <class name="android/provider/ContactsContract$PinnedPositions" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="pin(Landroid/content/ContentResolver;JI)V" />
+ <method name="undemote(Landroid/content/ContentResolver;J)V" />
+ <field name="DEMOTED" />
+ <field name="UNPINNED" />
+ </class>
+ <class name="android/provider/ContactsContract$Presence" since="5">
+ <extends name="android/provider/ContactsContract$StatusUpdates" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/provider/ContactsContract$PresenceColumns" since="5">
+ <extends name="java/lang/Object" />
+ <field name="CUSTOM_PROTOCOL" />
+ <field name="DATA_ID" />
+ <field name="IM_ACCOUNT" />
+ <field name="IM_HANDLE" />
+ <field name="PROTOCOL" />
+ </class>
+ <class name="android/provider/ContactsContract$Profile" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/ContactsContract$ContactNameColumns" />
+ <implements name="android/provider/ContactsContract$ContactOptionsColumns" />
+ <implements name="android/provider/ContactsContract$ContactStatusColumns" />
+ <implements name="android/provider/ContactsContract$ContactsColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_RAW_CONTACTS_URI" />
+ <field name="CONTENT_URI" />
+ <field name="CONTENT_VCARD_URI" />
+ <field name="MIN_ID" />
+ </class>
+ <class name="android/provider/ContactsContract$ProfileSyncState" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/SyncStateContract$Columns" />
+ <method name="&lt;init>()V" />
+ <method name="get(Landroid/content/ContentProviderClient;Landroid/accounts/Account;)[B" />
+ <method name="getWithUri(Landroid/content/ContentProviderClient;Landroid/accounts/Account;)Landroid/util/Pair;" />
+ <method name="newSetOperation(Landroid/accounts/Account;[B)Landroid/content/ContentProviderOperation;" />
+ <method name="set(Landroid/content/ContentProviderClient;Landroid/accounts/Account;[B)V" />
+ <field name="CONTENT_DIRECTORY" />
+ <field name="CONTENT_URI" />
+ </class>
+ <class name="android/provider/ContactsContract$QuickContact" since="5">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="showQuickContact(Landroid/content/Context;Landroid/graphics/Rect;Landroid/net/Uri;I[Ljava/lang/String;)V" />
+ <method name="showQuickContact(Landroid/content/Context;Landroid/view/View;Landroid/net/Uri;I[Ljava/lang/String;)V" />
+ <field name="ACTION_QUICK_CONTACT" since="21" />
+ <field name="EXTRA_EXCLUDE_MIMES" since="21" />
+ <field name="MODE_LARGE" />
+ <field name="MODE_MEDIUM" />
+ <field name="MODE_SMALL" />
+ </class>
+ <class name="android/provider/ContactsContract$RawContacts" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/ContactsContract$ContactNameColumns" since="11" />
+ <implements name="android/provider/ContactsContract$ContactOptionsColumns" />
+ <implements name="android/provider/ContactsContract$RawContactsColumns" />
+ <implements name="android/provider/ContactsContract$SyncColumns" />
+ <method name="&lt;init>()V" />
+ <method name="getContactLookupUri(Landroid/content/ContentResolver;Landroid/net/Uri;)Landroid/net/Uri;" />
+ <method name="newEntityIterator(Landroid/database/Cursor;)Landroid/content/EntityIterator;" since="8" />
+ <field name="AGGREGATION_MODE_DEFAULT" />
+ <field name="AGGREGATION_MODE_DISABLED" />
+ <field name="AGGREGATION_MODE_IMMEDIATE" />
+ <field name="AGGREGATION_MODE_SUSPENDED" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="CONTENT_TYPE" />
+ <field name="CONTENT_URI" />
+ </class>
+ <class name="android/provider/ContactsContract$RawContacts$Data" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/ContactsContract$DataColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_DIRECTORY" />
+ </class>
+ <class name="android/provider/ContactsContract$RawContacts$DisplayPhoto" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_DIRECTORY" />
+ </class>
+ <class name="android/provider/ContactsContract$RawContacts$Entity" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/ContactsContract$DataColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_DIRECTORY" />
+ <field name="DATA_ID" />
+ </class>
+ <class name="android/provider/ContactsContract$RawContacts$StreamItems" since="15">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/ContactsContract$StreamItemsColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_DIRECTORY" />
+ </class>
+ <class name="android/provider/ContactsContract$RawContactsColumns" since="5">
+ <extends name="java/lang/Object" />
+ <field name="ACCOUNT_TYPE_AND_DATA_SET" since="21" />
+ <field name="AGGREGATION_MODE" />
+ <field name="CONTACT_ID" />
+ <field name="DATA_SET" since="14" />
+ <field name="DELETED" />
+ <field name="RAW_CONTACT_IS_READ_ONLY" since="11" />
+ <field name="RAW_CONTACT_IS_USER_PROFILE" since="14" />
+ </class>
+ <class name="android/provider/ContactsContract$RawContactsEntity" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/ContactsContract$DataColumns" />
+ <implements name="android/provider/ContactsContract$RawContactsColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_TYPE" />
+ <field name="CONTENT_URI" />
+ <field name="DATA_ID" />
+ <field name="PROFILE_CONTENT_URI" since="14" />
+ </class>
+ <class name="android/provider/ContactsContract$SearchSnippets" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="DEFERRED_SNIPPETING_KEY" />
+ <field name="SNIPPET" />
+ </class>
+ <class name="android/provider/ContactsContract$Settings" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/ContactsContract$SettingsColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="CONTENT_TYPE" />
+ <field name="CONTENT_URI" />
+ </class>
+ <class name="android/provider/ContactsContract$SettingsColumns" since="5">
+ <extends name="java/lang/Object" />
+ <field name="ACCOUNT_NAME" />
+ <field name="ACCOUNT_TYPE" />
+ <field name="ANY_UNSYNCED" />
+ <field name="DATA_SET" since="14" />
+ <field name="SHOULD_SYNC" />
+ <field name="UNGROUPED_COUNT" />
+ <field name="UNGROUPED_VISIBLE" />
+ <field name="UNGROUPED_WITH_PHONES" />
+ </class>
+ <class name="android/provider/ContactsContract$StatusColumns" since="5">
+ <extends name="java/lang/Object" />
+ <field name="AVAILABLE" since="8" />
+ <field name="AWAY" since="8" />
+ <field name="CAPABILITY_HAS_CAMERA" since="11" />
+ <field name="CAPABILITY_HAS_VIDEO" since="11" />
+ <field name="CAPABILITY_HAS_VOICE" since="11" />
+ <field name="CHAT_CAPABILITY" since="11" />
+ <field name="DO_NOT_DISTURB" since="8" />
+ <field name="IDLE" since="8" />
+ <field name="INVISIBLE" since="8" />
+ <field name="OFFLINE" since="8" />
+ <field name="PRESENCE" />
+ <field name="PRESENCE_CUSTOM_STATUS" since="8" />
+ <field name="PRESENCE_STATUS" since="8" />
+ <field name="STATUS" />
+ <field name="STATUS_ICON" />
+ <field name="STATUS_LABEL" />
+ <field name="STATUS_RES_PACKAGE" />
+ <field name="STATUS_TIMESTAMP" />
+ </class>
+ <class name="android/provider/ContactsContract$StatusUpdates" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/ContactsContract$PresenceColumns" />
+ <implements name="android/provider/ContactsContract$StatusColumns" />
+ <method name="&lt;init>()V" />
+ <method name="getPresenceIconResourceId(I)I" />
+ <method name="getPresencePrecedence(I)I" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="CONTENT_TYPE" />
+ <field name="CONTENT_URI" />
+ <field name="PROFILE_CONTENT_URI" since="14" />
+ </class>
+ <class name="android/provider/ContactsContract$StreamItemPhotos" since="15">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/ContactsContract$StreamItemPhotosColumns" />
+ <method name="&lt;init>()V" />
+ <field name="PHOTO" />
+ </class>
+ <class name="android/provider/ContactsContract$StreamItemPhotosColumns" since="15">
+ <extends name="java/lang/Object" />
+ <field name="PHOTO_FILE_ID" />
+ <field name="PHOTO_URI" />
+ <field name="SORT_INDEX" />
+ <field name="STREAM_ITEM_ID" />
+ <field name="SYNC1" />
+ <field name="SYNC2" />
+ <field name="SYNC3" />
+ <field name="SYNC4" />
+ </class>
+ <class name="android/provider/ContactsContract$StreamItems" since="15">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/ContactsContract$StreamItemsColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="CONTENT_LIMIT_URI" />
+ <field name="CONTENT_PHOTO_URI" />
+ <field name="CONTENT_TYPE" />
+ <field name="CONTENT_URI" />
+ <field name="MAX_ITEMS" />
+ </class>
+ <class name="android/provider/ContactsContract$StreamItems$StreamItemPhotos" since="15">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/ContactsContract$StreamItemPhotosColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_DIRECTORY" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="CONTENT_TYPE" />
+ </class>
+ <class name="android/provider/ContactsContract$StreamItemsColumns" since="15">
+ <extends name="java/lang/Object" />
+ <field name="ACCOUNT_NAME" />
+ <field name="ACCOUNT_TYPE" />
+ <field name="COMMENTS" />
+ <field name="CONTACT_ID" />
+ <field name="CONTACT_LOOKUP_KEY" />
+ <field name="DATA_SET" />
+ <field name="RAW_CONTACT_ID" />
+ <field name="RAW_CONTACT_SOURCE_ID" />
+ <field name="RES_ICON" />
+ <field name="RES_LABEL" />
+ <field name="RES_PACKAGE" />
+ <field name="SYNC1" />
+ <field name="SYNC2" />
+ <field name="SYNC3" />
+ <field name="SYNC4" />
+ <field name="TEXT" />
+ <field name="TIMESTAMP" />
+ </class>
+ <class name="android/provider/ContactsContract$SyncColumns" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/ContactsContract$BaseSyncColumns" />
+ <field name="ACCOUNT_NAME" />
+ <field name="ACCOUNT_TYPE" />
+ <field name="DIRTY" />
+ <field name="SOURCE_ID" />
+ <field name="VERSION" />
+ </class>
+ <class name="android/provider/ContactsContract$SyncState" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/SyncStateContract$Columns" />
+ <method name="&lt;init>()V" />
+ <method name="get(Landroid/content/ContentProviderClient;Landroid/accounts/Account;)[B" />
+ <method name="getWithUri(Landroid/content/ContentProviderClient;Landroid/accounts/Account;)Landroid/util/Pair;" />
+ <method name="newSetOperation(Landroid/accounts/Account;[B)Landroid/content/ContentProviderOperation;" />
+ <method name="set(Landroid/content/ContentProviderClient;Landroid/accounts/Account;[B)V" />
+ <field name="CONTENT_DIRECTORY" />
+ <field name="CONTENT_URI" />
+ </class>
+ <class name="android/provider/DocumentsContract" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="buildChildDocumentsUri(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;" />
+ <method name="buildChildDocumentsUriUsingTree(Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;" since="21" />
+ <method name="buildDocumentUri(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;" />
+ <method name="buildDocumentUriUsingTree(Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;" since="21" />
+ <method name="buildRecentDocumentsUri(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;" />
+ <method name="buildRootUri(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;" />
+ <method name="buildRootsUri(Ljava/lang/String;)Landroid/net/Uri;" />
+ <method name="buildSearchDocumentsUri(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;" />
+ <method name="buildTreeDocumentUri(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;" since="21" />
+ <method name="createDocument(Landroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri;" since="21" />
+ <method name="deleteDocument(Landroid/content/ContentResolver;Landroid/net/Uri;)Z" />
+ <method name="getDocumentId(Landroid/net/Uri;)Ljava/lang/String;" />
+ <method name="getDocumentThumbnail(Landroid/content/ContentResolver;Landroid/net/Uri;Landroid/graphics/Point;Landroid/os/CancellationSignal;)Landroid/graphics/Bitmap;" />
+ <method name="getRootId(Landroid/net/Uri;)Ljava/lang/String;" />
+ <method name="getSearchDocumentsQuery(Landroid/net/Uri;)Ljava/lang/String;" />
+ <method name="getTreeDocumentId(Landroid/net/Uri;)Ljava/lang/String;" since="21" />
+ <method name="isDocumentUri(Landroid/content/Context;Landroid/net/Uri;)Z" />
+ <method name="renameDocument(Landroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;" since="21" />
+ <field name="EXTRA_ERROR" />
+ <field name="EXTRA_INFO" />
+ <field name="EXTRA_LOADING" />
+ <field name="PROVIDER_INTERFACE" />
+ </class>
+ <class name="android/provider/DocumentsContract$Document" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="COLUMN_DISPLAY_NAME" />
+ <field name="COLUMN_DOCUMENT_ID" />
+ <field name="COLUMN_FLAGS" />
+ <field name="COLUMN_ICON" />
+ <field name="COLUMN_LAST_MODIFIED" />
+ <field name="COLUMN_MIME_TYPE" />
+ <field name="COLUMN_SIZE" />
+ <field name="COLUMN_SUMMARY" />
+ <field name="FLAG_DIR_PREFERS_GRID" />
+ <field name="FLAG_DIR_PREFERS_LAST_MODIFIED" />
+ <field name="FLAG_DIR_SUPPORTS_CREATE" />
+ <field name="FLAG_SUPPORTS_DELETE" />
+ <field name="FLAG_SUPPORTS_RENAME" since="21" />
+ <field name="FLAG_SUPPORTS_THUMBNAIL" />
+ <field name="FLAG_SUPPORTS_WRITE" />
+ <field name="MIME_TYPE_DIR" />
+ </class>
+ <class name="android/provider/DocumentsContract$Root" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="COLUMN_AVAILABLE_BYTES" />
+ <field name="COLUMN_DOCUMENT_ID" />
+ <field name="COLUMN_FLAGS" />
+ <field name="COLUMN_ICON" />
+ <field name="COLUMN_MIME_TYPES" />
+ <field name="COLUMN_ROOT_ID" />
+ <field name="COLUMN_SUMMARY" />
+ <field name="COLUMN_TITLE" />
+ <field name="FLAG_LOCAL_ONLY" />
+ <field name="FLAG_SUPPORTS_CREATE" />
+ <field name="FLAG_SUPPORTS_IS_CHILD" since="21" />
+ <field name="FLAG_SUPPORTS_RECENTS" />
+ <field name="FLAG_SUPPORTS_SEARCH" />
+ </class>
+ <class name="android/provider/DocumentsProvider" since="19">
+ <extends name="android/content/ContentProvider" />
+ <method name="&lt;init>()V" />
+ <method name="createDocument(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="deleteDocument(Ljava/lang/String;)V" />
+ <method name="getDocumentType(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="isChildDocument(Ljava/lang/String;Ljava/lang/String;)Z" since="21" />
+ <method name="openDocument(Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/os/ParcelFileDescriptor;" />
+ <method name="openDocumentThumbnail(Ljava/lang/String;Landroid/graphics/Point;Landroid/os/CancellationSignal;)Landroid/content/res/AssetFileDescriptor;" />
+ <method name="queryChildDocuments(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;" />
+ <method name="queryDocument(Ljava/lang/String;[Ljava/lang/String;)Landroid/database/Cursor;" />
+ <method name="queryRecentDocuments(Ljava/lang/String;[Ljava/lang/String;)Landroid/database/Cursor;" />
+ <method name="queryRoots([Ljava/lang/String;)Landroid/database/Cursor;" />
+ <method name="querySearchDocuments(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)Landroid/database/Cursor;" />
+ <method name="renameDocument(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" since="21" />
+ <method name="revokeDocumentPermission(Ljava/lang/String;)V" since="21" />
+ </class>
+ <class name="android/provider/LiveFolders" since="3">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <method name="&lt;init>()V" />
+ <field name="ACTION_CREATE_LIVE_FOLDER" />
+ <field name="DESCRIPTION" />
+ <field name="DISPLAY_MODE_GRID" />
+ <field name="DISPLAY_MODE_LIST" />
+ <field name="EXTRA_LIVE_FOLDER_BASE_INTENT" />
+ <field name="EXTRA_LIVE_FOLDER_DISPLAY_MODE" />
+ <field name="EXTRA_LIVE_FOLDER_ICON" />
+ <field name="EXTRA_LIVE_FOLDER_NAME" />
+ <field name="ICON_BITMAP" />
+ <field name="ICON_PACKAGE" />
+ <field name="ICON_RESOURCE" />
+ <field name="INTENT" />
+ <field name="NAME" />
+ </class>
+ <class name="android/provider/MediaStore" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getMediaScannerUri()Landroid/net/Uri;" />
+ <method name="getVersion(Landroid/content/Context;)Ljava/lang/String;" since="12" />
+ <field name="ACTION_IMAGE_CAPTURE" since="3" />
+ <field name="ACTION_IMAGE_CAPTURE_SECURE" since="17" />
+ <field name="ACTION_VIDEO_CAPTURE" since="3" />
+ <field name="AUTHORITY" />
+ <field name="EXTRA_DURATION_LIMIT" since="8" />
+ <field name="EXTRA_FINISH_ON_COMPLETION" since="3" />
+ <field name="EXTRA_FULL_SCREEN" since="8" />
+ <field name="EXTRA_MEDIA_ALBUM" since="3" />
+ <field name="EXTRA_MEDIA_ARTIST" since="3" />
+ <field name="EXTRA_MEDIA_FOCUS" since="3" />
+ <field name="EXTRA_MEDIA_GENRE" since="21" />
+ <field name="EXTRA_MEDIA_PLAYLIST" since="21" />
+ <field name="EXTRA_MEDIA_RADIO_CHANNEL" since="21" />
+ <field name="EXTRA_MEDIA_TITLE" since="3" />
+ <field name="EXTRA_OUTPUT" since="3" />
+ <field name="EXTRA_SCREEN_ORIENTATION" since="3" />
+ <field name="EXTRA_SHOW_ACTION_ICONS" since="8" />
+ <field name="EXTRA_SIZE_LIMIT" since="8" />
+ <field name="EXTRA_VIDEO_QUALITY" since="3" />
+ <field name="INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH" since="9" />
+ <field name="INTENT_ACTION_MEDIA_SEARCH" since="3" />
+ <field name="INTENT_ACTION_MUSIC_PLAYER" since="8" />
+ <field name="INTENT_ACTION_STILL_IMAGE_CAMERA" since="3" />
+ <field name="INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE" since="17" />
+ <field name="INTENT_ACTION_TEXT_OPEN_FROM_SEARCH" since="17" />
+ <field name="INTENT_ACTION_VIDEO_CAMERA" since="3" />
+ <field name="INTENT_ACTION_VIDEO_PLAY_FROM_SEARCH" since="17" />
+ <field name="MEDIA_IGNORE_FILENAME" since="9" />
+ <field name="MEDIA_SCANNER_VOLUME" />
+ <field name="UNKNOWN_STRING" since="8" />
+ </class>
+ <class name="android/provider/MediaStore$Audio" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="keyFor(Ljava/lang/String;)Ljava/lang/String;" />
+ </class>
+ <class name="android/provider/MediaStore$Audio$AlbumColumns" since="1">
+ <extends name="java/lang/Object" />
+ <field name="ALBUM" />
+ <field name="ALBUM_ART" />
+ <field name="ALBUM_ID" />
+ <field name="ALBUM_KEY" />
+ <field name="ARTIST" />
+ <field name="FIRST_YEAR" />
+ <field name="LAST_YEAR" />
+ <field name="NUMBER_OF_SONGS" />
+ <field name="NUMBER_OF_SONGS_FOR_ARTIST" since="3" />
+ </class>
+ <class name="android/provider/MediaStore$Audio$Albums" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/MediaStore$Audio$AlbumColumns" />
+ <method name="&lt;init>()V" />
+ <method name="getContentUri(Ljava/lang/String;)Landroid/net/Uri;" />
+ <field name="CONTENT_TYPE" />
+ <field name="DEFAULT_SORT_ORDER" />
+ <field name="ENTRY_CONTENT_TYPE" />
+ <field name="EXTERNAL_CONTENT_URI" />
+ <field name="INTERNAL_CONTENT_URI" />
+ </class>
+ <class name="android/provider/MediaStore$Audio$ArtistColumns" since="1">
+ <extends name="java/lang/Object" />
+ <field name="ARTIST" />
+ <field name="ARTIST_KEY" />
+ <field name="NUMBER_OF_ALBUMS" />
+ <field name="NUMBER_OF_TRACKS" />
+ </class>
+ <class name="android/provider/MediaStore$Audio$Artists" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/MediaStore$Audio$ArtistColumns" />
+ <method name="&lt;init>()V" />
+ <method name="getContentUri(Ljava/lang/String;)Landroid/net/Uri;" />
+ <field name="CONTENT_TYPE" />
+ <field name="DEFAULT_SORT_ORDER" />
+ <field name="ENTRY_CONTENT_TYPE" />
+ <field name="EXTERNAL_CONTENT_URI" />
+ <field name="INTERNAL_CONTENT_URI" />
+ </class>
+ <class name="android/provider/MediaStore$Audio$Artists$Albums" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/MediaStore$Audio$AlbumColumns" />
+ <method name="&lt;init>()V" />
+ <method name="getContentUri(Ljava/lang/String;J)Landroid/net/Uri;" />
+ </class>
+ <class name="android/provider/MediaStore$Audio$AudioColumns" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/MediaStore$MediaColumns" />
+ <field name="ALBUM" />
+ <field name="ALBUM_ART" />
+ <field name="ALBUM_ID" />
+ <field name="ALBUM_KEY" />
+ <field name="ARTIST" />
+ <field name="ARTIST_ID" />
+ <field name="ARTIST_KEY" />
+ <field name="BOOKMARK" since="8" />
+ <field name="COMPOSER" />
+ <field name="DURATION" />
+ <field name="IS_ALARM" />
+ <field name="IS_MUSIC" />
+ <field name="IS_NOTIFICATION" />
+ <field name="IS_PODCAST" since="8" />
+ <field name="IS_RINGTONE" />
+ <field name="TITLE_KEY" />
+ <field name="TRACK" />
+ <field name="YEAR" />
+ </class>
+ <class name="android/provider/MediaStore$Audio$Genres" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/MediaStore$Audio$GenresColumns" />
+ <method name="&lt;init>()V" />
+ <method name="getContentUri(Ljava/lang/String;)Landroid/net/Uri;" />
+ <method name="getContentUriForAudioId(Ljava/lang/String;I)Landroid/net/Uri;" since="11" />
+ <field name="CONTENT_TYPE" />
+ <field name="DEFAULT_SORT_ORDER" />
+ <field name="ENTRY_CONTENT_TYPE" />
+ <field name="EXTERNAL_CONTENT_URI" />
+ <field name="INTERNAL_CONTENT_URI" />
+ </class>
+ <class name="android/provider/MediaStore$Audio$Genres$Members" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/MediaStore$Audio$AudioColumns" />
+ <method name="&lt;init>()V" />
+ <method name="getContentUri(Ljava/lang/String;J)Landroid/net/Uri;" />
+ <field name="AUDIO_ID" />
+ <field name="CONTENT_DIRECTORY" />
+ <field name="DEFAULT_SORT_ORDER" />
+ <field name="GENRE_ID" />
+ </class>
+ <class name="android/provider/MediaStore$Audio$GenresColumns" since="1">
+ <extends name="java/lang/Object" />
+ <field name="NAME" />
+ </class>
+ <class name="android/provider/MediaStore$Audio$Media" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/MediaStore$Audio$AudioColumns" />
+ <method name="&lt;init>()V" />
+ <method name="getContentUri(Ljava/lang/String;)Landroid/net/Uri;" />
+ <method name="getContentUriForPath(Ljava/lang/String;)Landroid/net/Uri;" />
+ <field name="CONTENT_TYPE" />
+ <field name="DEFAULT_SORT_ORDER" />
+ <field name="ENTRY_CONTENT_TYPE" since="21" />
+ <field name="EXTERNAL_CONTENT_URI" />
+ <field name="EXTRA_MAX_BYTES" since="3" />
+ <field name="INTERNAL_CONTENT_URI" />
+ <field name="RECORD_SOUND_ACTION" />
+ </class>
+ <class name="android/provider/MediaStore$Audio$Playlists" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/MediaStore$Audio$PlaylistsColumns" />
+ <method name="&lt;init>()V" />
+ <method name="getContentUri(Ljava/lang/String;)Landroid/net/Uri;" />
+ <field name="CONTENT_TYPE" />
+ <field name="DEFAULT_SORT_ORDER" />
+ <field name="ENTRY_CONTENT_TYPE" />
+ <field name="EXTERNAL_CONTENT_URI" />
+ <field name="INTERNAL_CONTENT_URI" />
+ </class>
+ <class name="android/provider/MediaStore$Audio$Playlists$Members" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/MediaStore$Audio$AudioColumns" />
+ <method name="&lt;init>()V" />
+ <method name="getContentUri(Ljava/lang/String;J)Landroid/net/Uri;" />
+ <method name="moveItem(Landroid/content/ContentResolver;JII)Z" since="8" />
+ <field name="AUDIO_ID" />
+ <field name="CONTENT_DIRECTORY" />
+ <field name="DEFAULT_SORT_ORDER" />
+ <field name="PLAYLIST_ID" />
+ <field name="PLAY_ORDER" />
+ <field name="_ID" />
+ </class>
+ <class name="android/provider/MediaStore$Audio$PlaylistsColumns" since="1">
+ <extends name="java/lang/Object" />
+ <field name="DATA" />
+ <field name="DATE_ADDED" />
+ <field name="DATE_MODIFIED" />
+ <field name="NAME" />
+ </class>
+ <class name="android/provider/MediaStore$Audio$Radio" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="ENTRY_CONTENT_TYPE" />
+ </class>
+ <class name="android/provider/MediaStore$Files" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getContentUri(Ljava/lang/String;)Landroid/net/Uri;" />
+ <method name="getContentUri(Ljava/lang/String;J)Landroid/net/Uri;" />
+ </class>
+ <class name="android/provider/MediaStore$Files$FileColumns" since="11">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/MediaStore$MediaColumns" />
+ <field name="MEDIA_TYPE" />
+ <field name="MEDIA_TYPE_AUDIO" />
+ <field name="MEDIA_TYPE_IMAGE" />
+ <field name="MEDIA_TYPE_NONE" />
+ <field name="MEDIA_TYPE_PLAYLIST" />
+ <field name="MEDIA_TYPE_VIDEO" />
+ <field name="MIME_TYPE" />
+ <field name="PARENT" />
+ <field name="TITLE" />
+ </class>
+ <class name="android/provider/MediaStore$Images" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/provider/MediaStore$Images$ImageColumns" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/MediaStore$MediaColumns" />
+ <field name="BUCKET_DISPLAY_NAME" />
+ <field name="BUCKET_ID" />
+ <field name="DATE_TAKEN" />
+ <field name="DESCRIPTION" />
+ <field name="IS_PRIVATE" />
+ <field name="LATITUDE" />
+ <field name="LONGITUDE" />
+ <field name="MINI_THUMB_MAGIC" />
+ <field name="ORIENTATION" />
+ <field name="PICASA_ID" />
+ </class>
+ <class name="android/provider/MediaStore$Images$Media" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/MediaStore$Images$ImageColumns" />
+ <method name="&lt;init>()V" />
+ <method name="getBitmap(Landroid/content/ContentResolver;Landroid/net/Uri;)Landroid/graphics/Bitmap;" />
+ <method name="getContentUri(Ljava/lang/String;)Landroid/net/Uri;" />
+ <method name="insertImage(Landroid/content/ContentResolver;Landroid/graphics/Bitmap;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="insertImage(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="query(Landroid/content/ContentResolver;Landroid/net/Uri;[Ljava/lang/String;)Landroid/database/Cursor;" />
+ <method name="query(Landroid/content/ContentResolver;Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;" />
+ <method name="query(Landroid/content/ContentResolver;Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;" />
+ <field name="CONTENT_TYPE" />
+ <field name="DEFAULT_SORT_ORDER" />
+ <field name="EXTERNAL_CONTENT_URI" />
+ <field name="INTERNAL_CONTENT_URI" />
+ </class>
+ <class name="android/provider/MediaStore$Images$Thumbnails" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <method name="&lt;init>()V" />
+ <method name="cancelThumbnailRequest(Landroid/content/ContentResolver;J)V" since="5" />
+ <method name="cancelThumbnailRequest(Landroid/content/ContentResolver;JJ)V" since="8" />
+ <method name="getContentUri(Ljava/lang/String;)Landroid/net/Uri;" />
+ <method name="getThumbnail(Landroid/content/ContentResolver;JILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;" since="5" />
+ <method name="getThumbnail(Landroid/content/ContentResolver;JJILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;" since="8" />
+ <method name="query(Landroid/content/ContentResolver;Landroid/net/Uri;[Ljava/lang/String;)Landroid/database/Cursor;" />
+ <method name="queryMiniThumbnail(Landroid/content/ContentResolver;JI[Ljava/lang/String;)Landroid/database/Cursor;" />
+ <method name="queryMiniThumbnails(Landroid/content/ContentResolver;Landroid/net/Uri;I[Ljava/lang/String;)Landroid/database/Cursor;" />
+ <field name="DATA" />
+ <field name="DEFAULT_SORT_ORDER" />
+ <field name="EXTERNAL_CONTENT_URI" />
+ <field name="FULL_SCREEN_KIND" />
+ <field name="HEIGHT" />
+ <field name="IMAGE_ID" />
+ <field name="INTERNAL_CONTENT_URI" />
+ <field name="KIND" />
+ <field name="MICRO_KIND" />
+ <field name="MINI_KIND" />
+ <field name="THUMB_DATA" since="5" />
+ <field name="WIDTH" />
+ </class>
+ <class name="android/provider/MediaStore$MediaColumns" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <field name="DATA" />
+ <field name="DATE_ADDED" />
+ <field name="DATE_MODIFIED" />
+ <field name="DISPLAY_NAME" />
+ <field name="HEIGHT" since="16" />
+ <field name="MIME_TYPE" />
+ <field name="SIZE" />
+ <field name="TITLE" />
+ <field name="WIDTH" since="16" />
+ </class>
+ <class name="android/provider/MediaStore$Video" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="query(Landroid/content/ContentResolver;Landroid/net/Uri;[Ljava/lang/String;)Landroid/database/Cursor;" />
+ <field name="DEFAULT_SORT_ORDER" />
+ </class>
+ <class name="android/provider/MediaStore$Video$Media" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/MediaStore$Video$VideoColumns" />
+ <method name="&lt;init>()V" />
+ <method name="getContentUri(Ljava/lang/String;)Landroid/net/Uri;" />
+ <field name="CONTENT_TYPE" />
+ <field name="DEFAULT_SORT_ORDER" />
+ <field name="EXTERNAL_CONTENT_URI" />
+ <field name="INTERNAL_CONTENT_URI" />
+ </class>
+ <class name="android/provider/MediaStore$Video$Thumbnails" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <method name="&lt;init>()V" />
+ <method name="cancelThumbnailRequest(Landroid/content/ContentResolver;J)V" />
+ <method name="cancelThumbnailRequest(Landroid/content/ContentResolver;JJ)V" since="8" />
+ <method name="getContentUri(Ljava/lang/String;)Landroid/net/Uri;" />
+ <method name="getThumbnail(Landroid/content/ContentResolver;JILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;" />
+ <method name="getThumbnail(Landroid/content/ContentResolver;JJILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;" since="8" />
+ <field name="DATA" />
+ <field name="DEFAULT_SORT_ORDER" />
+ <field name="EXTERNAL_CONTENT_URI" />
+ <field name="FULL_SCREEN_KIND" />
+ <field name="HEIGHT" />
+ <field name="INTERNAL_CONTENT_URI" />
+ <field name="KIND" />
+ <field name="MICRO_KIND" />
+ <field name="MINI_KIND" />
+ <field name="VIDEO_ID" />
+ <field name="WIDTH" />
+ </class>
+ <class name="android/provider/MediaStore$Video$VideoColumns" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/MediaStore$MediaColumns" />
+ <field name="ALBUM" />
+ <field name="ARTIST" />
+ <field name="BOOKMARK" since="3" />
+ <field name="BUCKET_DISPLAY_NAME" since="3" />
+ <field name="BUCKET_ID" since="3" />
+ <field name="CATEGORY" />
+ <field name="DATE_TAKEN" />
+ <field name="DESCRIPTION" />
+ <field name="DURATION" />
+ <field name="IS_PRIVATE" />
+ <field name="LANGUAGE" />
+ <field name="LATITUDE" />
+ <field name="LONGITUDE" />
+ <field name="MINI_THUMB_MAGIC" />
+ <field name="RESOLUTION" />
+ <field name="TAGS" />
+ </class>
+ <class name="android/provider/OpenableColumns" since="1">
+ <extends name="java/lang/Object" />
+ <field name="DISPLAY_NAME" />
+ <field name="SIZE" />
+ </class>
+ <class name="android/provider/SearchRecentSuggestions" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;Ljava/lang/String;I)V" />
+ <method name="clearHistory()V" />
+ <method name="saveRecentQuery(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="truncateHistory(Landroid/content/ContentResolver;I)V" />
+ <field name="QUERIES_PROJECTION_1LINE" />
+ <field name="QUERIES_PROJECTION_2LINE" />
+ <field name="QUERIES_PROJECTION_DATE_INDEX" />
+ <field name="QUERIES_PROJECTION_DISPLAY1_INDEX" />
+ <field name="QUERIES_PROJECTION_DISPLAY2_INDEX" />
+ <field name="QUERIES_PROJECTION_QUERY_INDEX" />
+ </class>
+ <class name="android/provider/Settings" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="ACTION_ACCESSIBILITY_SETTINGS" since="5" />
+ <field name="ACTION_ADD_ACCOUNT" since="8" />
+ <field name="ACTION_AIRPLANE_MODE_SETTINGS" since="3" />
+ <field name="ACTION_APN_SETTINGS" />
+ <field name="ACTION_APPLICATION_DETAILS_SETTINGS" since="9" />
+ <field name="ACTION_APPLICATION_DEVELOPMENT_SETTINGS" since="3" />
+ <field name="ACTION_APPLICATION_SETTINGS" />
+ <field name="ACTION_BLUETOOTH_SETTINGS" />
+ <field name="ACTION_CAPTIONING_SETTINGS" since="19" />
+ <field name="ACTION_CAST_SETTINGS" since="21" />
+ <field name="ACTION_DATA_ROAMING_SETTINGS" since="3" />
+ <field name="ACTION_DATE_SETTINGS" />
+ <field name="ACTION_DEVICE_INFO_SETTINGS" since="8" />
+ <field name="ACTION_DISPLAY_SETTINGS" />
+ <field name="ACTION_DREAM_SETTINGS" since="18" />
+ <field name="ACTION_HOME_SETTINGS" since="21" />
+ <field name="ACTION_INPUT_METHOD_SETTINGS" since="3" />
+ <field name="ACTION_INPUT_METHOD_SUBTYPE_SETTINGS" since="11" />
+ <field name="ACTION_INTERNAL_STORAGE_SETTINGS" since="3" />
+ <field name="ACTION_LOCALE_SETTINGS" />
+ <field name="ACTION_LOCATION_SOURCE_SETTINGS" />
+ <field name="ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS" since="9" />
+ <field name="ACTION_MANAGE_APPLICATIONS_SETTINGS" since="3" />
+ <field name="ACTION_MEMORY_CARD_SETTINGS" since="3" />
+ <field name="ACTION_NETWORK_OPERATOR_SETTINGS" since="3" />
+ <field name="ACTION_NFCSHARING_SETTINGS" since="14" />
+ <field name="ACTION_NFC_PAYMENT_SETTINGS" since="19" />
+ <field name="ACTION_NFC_SETTINGS" since="16" />
+ <field name="ACTION_PRINT_SETTINGS" since="19" />
+ <field name="ACTION_PRIVACY_SETTINGS" since="5" />
+ <field name="ACTION_QUICK_LAUNCH_SETTINGS" since="3" />
+ <field name="ACTION_SEARCH_SETTINGS" since="8" />
+ <field name="ACTION_SECURITY_SETTINGS" />
+ <field name="ACTION_SETTINGS" />
+ <field name="ACTION_SHOW_REGULATORY_INFO" since="21" />
+ <field name="ACTION_SOUND_SETTINGS" />
+ <field name="ACTION_SYNC_SETTINGS" since="3" />
+ <field name="ACTION_USAGE_ACCESS_SETTINGS" since="21" />
+ <field name="ACTION_USER_DICTIONARY_SETTINGS" since="3" />
+ <field name="ACTION_VOICE_INPUT_SETTINGS" since="21" />
+ <field name="ACTION_WIFI_IP_SETTINGS" since="3" />
+ <field name="ACTION_WIFI_SETTINGS" />
+ <field name="ACTION_WIRELESS_SETTINGS" />
+ <field name="AUTHORITY" />
+ <field name="EXTRA_ACCOUNT_TYPES" since="18" />
+ <field name="EXTRA_AUTHORITIES" since="8" />
+ <field name="EXTRA_INPUT_METHOD_ID" since="11" />
+ </class>
+ <class name="android/provider/Settings$Global" since="17">
+ <extends name="android/provider/Settings$NameValueTable" />
+ <method name="&lt;init>()V" />
+ <method name="getFloat(Landroid/content/ContentResolver;Ljava/lang/String;)F" />
+ <method name="getFloat(Landroid/content/ContentResolver;Ljava/lang/String;F)F" />
+ <method name="getInt(Landroid/content/ContentResolver;Ljava/lang/String;)I" />
+ <method name="getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I" />
+ <method name="getLong(Landroid/content/ContentResolver;Ljava/lang/String;)J" />
+ <method name="getLong(Landroid/content/ContentResolver;Ljava/lang/String;J)J" />
+ <method name="getString(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getUriFor(Ljava/lang/String;)Landroid/net/Uri;" />
+ <method name="putFloat(Landroid/content/ContentResolver;Ljava/lang/String;F)Z" />
+ <method name="putInt(Landroid/content/ContentResolver;Ljava/lang/String;I)Z" />
+ <method name="putLong(Landroid/content/ContentResolver;Ljava/lang/String;J)Z" />
+ <method name="putString(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;)Z" />
+ <field name="ADB_ENABLED" />
+ <field name="AIRPLANE_MODE_ON" />
+ <field name="AIRPLANE_MODE_RADIOS" />
+ <field name="ALWAYS_FINISH_ACTIVITIES" />
+ <field name="ANIMATOR_DURATION_SCALE" />
+ <field name="AUTO_TIME" />
+ <field name="AUTO_TIME_ZONE" />
+ <field name="BLUETOOTH_ON" />
+ <field name="CONTENT_URI" />
+ <field name="DATA_ROAMING" />
+ <field name="DEBUG_APP" />
+ <field name="DEVELOPMENT_SETTINGS_ENABLED" />
+ <field name="DEVICE_PROVISIONED" />
+ <field name="HTTP_PROXY" />
+ <field name="INSTALL_NON_MARKET_APPS" />
+ <field name="MODE_RINGER" />
+ <field name="NETWORK_PREFERENCE" />
+ <field name="RADIO_BLUETOOTH" />
+ <field name="RADIO_CELL" />
+ <field name="RADIO_NFC" />
+ <field name="RADIO_WIFI" />
+ <field name="SHOW_PROCESSES" />
+ <field name="STAY_ON_WHILE_PLUGGED_IN" />
+ <field name="SYS_PROP_SETTING_VERSION" />
+ <field name="TRANSITION_ANIMATION_SCALE" />
+ <field name="USB_MASS_STORAGE_ENABLED" />
+ <field name="USE_GOOGLE_MAIL" />
+ <field name="WAIT_FOR_DEBUGGER" />
+ <field name="WIFI_MAX_DHCP_RETRY_COUNT" />
+ <field name="WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS" />
+ <field name="WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON" />
+ <field name="WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY" />
+ <field name="WIFI_NUM_OPEN_NETWORKS_KEPT" />
+ <field name="WIFI_ON" />
+ <field name="WIFI_SLEEP_POLICY" />
+ <field name="WIFI_SLEEP_POLICY_DEFAULT" />
+ <field name="WIFI_SLEEP_POLICY_NEVER" />
+ <field name="WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED" />
+ <field name="WIFI_WATCHDOG_ON" />
+ <field name="WINDOW_ANIMATION_SCALE" />
+ </class>
+ <class name="android/provider/Settings$NameValueTable" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <method name="&lt;init>()V" />
+ <method name="getUriFor(Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;" />
+ <method name="putString(Landroid/content/ContentResolver;Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;)Z" />
+ <field name="NAME" />
+ <field name="VALUE" />
+ </class>
+ <class name="android/provider/Settings$Secure" since="3">
+ <extends name="android/provider/Settings$NameValueTable" />
+ <method name="&lt;init>()V" />
+ <method name="getFloat(Landroid/content/ContentResolver;Ljava/lang/String;)F" />
+ <method name="getFloat(Landroid/content/ContentResolver;Ljava/lang/String;F)F" />
+ <method name="getInt(Landroid/content/ContentResolver;Ljava/lang/String;)I" />
+ <method name="getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I" />
+ <method name="getLong(Landroid/content/ContentResolver;Ljava/lang/String;)J" />
+ <method name="getLong(Landroid/content/ContentResolver;Ljava/lang/String;J)J" />
+ <method name="getString(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getUriFor(Ljava/lang/String;)Landroid/net/Uri;" />
+ <method name="isLocationProviderEnabled(Landroid/content/ContentResolver;Ljava/lang/String;)Z" since="8" />
+ <method name="putFloat(Landroid/content/ContentResolver;Ljava/lang/String;F)Z" />
+ <method name="putInt(Landroid/content/ContentResolver;Ljava/lang/String;I)Z" />
+ <method name="putLong(Landroid/content/ContentResolver;Ljava/lang/String;J)Z" />
+ <method name="putString(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;)Z" />
+ <method name="setLocationProviderEnabled(Landroid/content/ContentResolver;Ljava/lang/String;Z)V" since="8" />
+ <field name="ACCESSIBILITY_DISPLAY_INVERSION_ENABLED" since="21" />
+ <field name="ACCESSIBILITY_ENABLED" since="4" />
+ <field name="ACCESSIBILITY_SPEAK_PASSWORD" since="15" />
+ <field name="ADB_ENABLED" />
+ <field name="ALLOWED_GEOLOCATION_ORIGINS" since="8" />
+ <field name="ALLOW_MOCK_LOCATION" />
+ <field name="ANDROID_ID" />
+ <field name="BACKGROUND_DATA" />
+ <field name="BLUETOOTH_ON" />
+ <field name="CONTENT_URI" />
+ <field name="DATA_ROAMING" />
+ <field name="DEFAULT_INPUT_METHOD" />
+ <field name="DEVELOPMENT_SETTINGS_ENABLED" since="16" />
+ <field name="DEVICE_PROVISIONED" />
+ <field name="ENABLED_ACCESSIBILITY_SERVICES" since="4" />
+ <field name="ENABLED_INPUT_METHODS" />
+ <field name="HTTP_PROXY" />
+ <field name="INPUT_METHOD_SELECTOR_VISIBILITY" since="11" />
+ <field name="INSTALL_NON_MARKET_APPS" />
+ <field name="LOCATION_MODE" since="19" />
+ <field name="LOCATION_MODE_BATTERY_SAVING" since="19" />
+ <field name="LOCATION_MODE_HIGH_ACCURACY" since="19" />
+ <field name="LOCATION_MODE_OFF" since="19" />
+ <field name="LOCATION_MODE_SENSORS_ONLY" since="19" />
+ <field name="LOCATION_PROVIDERS_ALLOWED" />
+ <field name="LOCK_PATTERN_ENABLED" since="8" />
+ <field name="LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED" since="8" />
+ <field name="LOCK_PATTERN_VISIBLE" since="8" />
+ <field name="LOGGING_ID" />
+ <field name="NETWORK_PREFERENCE" />
+ <field name="PARENTAL_CONTROL_ENABLED" />
+ <field name="PARENTAL_CONTROL_LAST_UPDATE" />
+ <field name="PARENTAL_CONTROL_REDIRECT_URL" />
+ <field name="SELECTED_INPUT_METHOD_SUBTYPE" since="11" />
+ <field name="SETTINGS_CLASSNAME" />
+ <field name="SKIP_FIRST_USE_HINTS" since="21" />
+ <field name="SYS_PROP_SETTING_VERSION" />
+ <field name="TOUCH_EXPLORATION_ENABLED" since="14" />
+ <field name="TTS_DEFAULT_COUNTRY" since="4" />
+ <field name="TTS_DEFAULT_LANG" since="4" />
+ <field name="TTS_DEFAULT_PITCH" since="4" />
+ <field name="TTS_DEFAULT_RATE" since="4" />
+ <field name="TTS_DEFAULT_SYNTH" since="4" />
+ <field name="TTS_DEFAULT_VARIANT" since="4" />
+ <field name="TTS_ENABLED_PLUGINS" since="8" />
+ <field name="TTS_USE_DEFAULTS" since="4" />
+ <field name="USB_MASS_STORAGE_ENABLED" />
+ <field name="USE_GOOGLE_MAIL" />
+ <field name="WIFI_MAX_DHCP_RETRY_COUNT" />
+ <field name="WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS" />
+ <field name="WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON" />
+ <field name="WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY" />
+ <field name="WIFI_NUM_OPEN_NETWORKS_KEPT" />
+ <field name="WIFI_ON" />
+ <field name="WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE" />
+ <field name="WIFI_WATCHDOG_AP_COUNT" />
+ <field name="WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS" />
+ <field name="WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED" />
+ <field name="WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS" />
+ <field name="WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT" />
+ <field name="WIFI_WATCHDOG_MAX_AP_CHECKS" />
+ <field name="WIFI_WATCHDOG_ON" />
+ <field name="WIFI_WATCHDOG_PING_COUNT" />
+ <field name="WIFI_WATCHDOG_PING_DELAY_MS" />
+ <field name="WIFI_WATCHDOG_PING_TIMEOUT_MS" />
+ <field name="WIFI_WATCHDOG_WATCH_LIST" />
+ </class>
+ <class name="android/provider/Settings$SettingNotFoundException" since="1">
+ <extends name="android/util/AndroidException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/provider/Settings$System" since="1">
+ <extends name="android/provider/Settings$NameValueTable" />
+ <method name="&lt;init>()V" />
+ <method name="getConfiguration(Landroid/content/ContentResolver;Landroid/content/res/Configuration;)V" />
+ <method name="getFloat(Landroid/content/ContentResolver;Ljava/lang/String;)F" />
+ <method name="getFloat(Landroid/content/ContentResolver;Ljava/lang/String;F)F" />
+ <method name="getInt(Landroid/content/ContentResolver;Ljava/lang/String;)I" />
+ <method name="getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I" />
+ <method name="getLong(Landroid/content/ContentResolver;Ljava/lang/String;)J" since="3" />
+ <method name="getLong(Landroid/content/ContentResolver;Ljava/lang/String;J)J" since="3" />
+ <method name="getShowGTalkServiceStatus(Landroid/content/ContentResolver;)Z" />
+ <method name="getString(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getUriFor(Ljava/lang/String;)Landroid/net/Uri;" />
+ <method name="putConfiguration(Landroid/content/ContentResolver;Landroid/content/res/Configuration;)Z" />
+ <method name="putFloat(Landroid/content/ContentResolver;Ljava/lang/String;F)Z" />
+ <method name="putInt(Landroid/content/ContentResolver;Ljava/lang/String;I)Z" />
+ <method name="putLong(Landroid/content/ContentResolver;Ljava/lang/String;J)Z" since="3" />
+ <method name="putString(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;)Z" />
+ <method name="setShowGTalkServiceStatus(Landroid/content/ContentResolver;Z)V" />
+ <field name="ACCELEROMETER_ROTATION" since="3" />
+ <field name="ADB_ENABLED" />
+ <field name="AIRPLANE_MODE_ON" />
+ <field name="AIRPLANE_MODE_RADIOS" />
+ <field name="ALARM_ALERT" since="5" />
+ <field name="ALWAYS_FINISH_ACTIVITIES" />
+ <field name="ANDROID_ID" />
+ <field name="ANIMATOR_DURATION_SCALE" since="16" />
+ <field name="APPEND_FOR_LAST_AUDIBLE" />
+ <field name="AUTO_TIME" />
+ <field name="AUTO_TIME_ZONE" since="11" />
+ <field name="BLUETOOTH_DISCOVERABILITY" />
+ <field name="BLUETOOTH_DISCOVERABILITY_TIMEOUT" />
+ <field name="BLUETOOTH_ON" />
+ <field name="CONTENT_URI" />
+ <field name="DATA_ROAMING" />
+ <field name="DATE_FORMAT" />
+ <field name="DEBUG_APP" />
+ <field name="DEFAULT_ALARM_ALERT_URI" since="5" />
+ <field name="DEFAULT_NOTIFICATION_URI" />
+ <field name="DEFAULT_RINGTONE_URI" />
+ <field name="DEVICE_PROVISIONED" />
+ <field name="DIM_SCREEN" />
+ <field name="DTMF_TONE_WHEN_DIALING" />
+ <field name="END_BUTTON_BEHAVIOR" />
+ <field name="FONT_SCALE" />
+ <field name="HAPTIC_FEEDBACK_ENABLED" since="3" />
+ <field name="HTTP_PROXY" />
+ <field name="INSTALL_NON_MARKET_APPS" />
+ <field name="LOCATION_PROVIDERS_ALLOWED" />
+ <field name="LOCK_PATTERN_ENABLED" />
+ <field name="LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED" since="3" />
+ <field name="LOCK_PATTERN_VISIBLE" />
+ <field name="LOGGING_ID" />
+ <field name="MODE_RINGER" />
+ <field name="MODE_RINGER_STREAMS_AFFECTED" />
+ <field name="MUTE_STREAMS_AFFECTED" />
+ <field name="NETWORK_PREFERENCE" />
+ <field name="NEXT_ALARM_FORMATTED" />
+ <field name="NOTIFICATION_SOUND" />
+ <field name="PARENTAL_CONTROL_ENABLED" />
+ <field name="PARENTAL_CONTROL_LAST_UPDATE" />
+ <field name="PARENTAL_CONTROL_REDIRECT_URL" />
+ <field name="RADIO_BLUETOOTH" />
+ <field name="RADIO_CELL" />
+ <field name="RADIO_NFC" since="14" />
+ <field name="RADIO_WIFI" />
+ <field name="RINGTONE" />
+ <field name="SCREEN_BRIGHTNESS" />
+ <field name="SCREEN_BRIGHTNESS_MODE" since="8" />
+ <field name="SCREEN_BRIGHTNESS_MODE_AUTOMATIC" since="8" />
+ <field name="SCREEN_BRIGHTNESS_MODE_MANUAL" since="8" />
+ <field name="SCREEN_OFF_TIMEOUT" />
+ <field name="SETTINGS_CLASSNAME" />
+ <field name="SETUP_WIZARD_HAS_RUN" />
+ <field name="SHOW_GTALK_SERVICE_STATUS" />
+ <field name="SHOW_PROCESSES" />
+ <field name="SHOW_WEB_SUGGESTIONS" since="4" />
+ <field name="SOUND_EFFECTS_ENABLED" />
+ <field name="STAY_ON_WHILE_PLUGGED_IN" />
+ <field name="SYS_PROP_SETTING_VERSION" />
+ <field name="TEXT_AUTO_CAPS" />
+ <field name="TEXT_AUTO_PUNCTUATE" />
+ <field name="TEXT_AUTO_REPLACE" />
+ <field name="TEXT_SHOW_PASSWORD" />
+ <field name="TIME_12_24" />
+ <field name="TRANSITION_ANIMATION_SCALE" />
+ <field name="USB_MASS_STORAGE_ENABLED" />
+ <field name="USER_ROTATION" since="11" />
+ <field name="USE_GOOGLE_MAIL" />
+ <field name="VIBRATE_ON" />
+ <field name="VOLUME_ALARM" />
+ <field name="VOLUME_BLUETOOTH_SCO" since="8" />
+ <field name="VOLUME_MUSIC" />
+ <field name="VOLUME_NOTIFICATION" since="3" />
+ <field name="VOLUME_RING" />
+ <field name="VOLUME_SETTINGS" />
+ <field name="VOLUME_SYSTEM" />
+ <field name="VOLUME_VOICE" />
+ <field name="WAIT_FOR_DEBUGGER" />
+ <field name="WALLPAPER_ACTIVITY" />
+ <field name="WIFI_MAX_DHCP_RETRY_COUNT" since="3" />
+ <field name="WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS" since="3" />
+ <field name="WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON" />
+ <field name="WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY" />
+ <field name="WIFI_NUM_OPEN_NETWORKS_KEPT" />
+ <field name="WIFI_ON" />
+ <field name="WIFI_SLEEP_POLICY" since="3" />
+ <field name="WIFI_SLEEP_POLICY_DEFAULT" since="3" />
+ <field name="WIFI_SLEEP_POLICY_NEVER" since="3" />
+ <field name="WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED" since="3" />
+ <field name="WIFI_STATIC_DNS1" />
+ <field name="WIFI_STATIC_DNS2" />
+ <field name="WIFI_STATIC_GATEWAY" />
+ <field name="WIFI_STATIC_IP" />
+ <field name="WIFI_STATIC_NETMASK" />
+ <field name="WIFI_USE_STATIC_IP" />
+ <field name="WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE" />
+ <field name="WIFI_WATCHDOG_AP_COUNT" />
+ <field name="WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS" />
+ <field name="WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED" />
+ <field name="WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS" />
+ <field name="WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT" />
+ <field name="WIFI_WATCHDOG_MAX_AP_CHECKS" />
+ <field name="WIFI_WATCHDOG_ON" />
+ <field name="WIFI_WATCHDOG_PING_COUNT" />
+ <field name="WIFI_WATCHDOG_PING_DELAY_MS" />
+ <field name="WIFI_WATCHDOG_PING_TIMEOUT_MS" />
+ <field name="WINDOW_ANIMATION_SCALE" />
+ </class>
+ <class name="android/provider/SyncStateContract" since="5">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/provider/SyncStateContract$Columns" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <field name="ACCOUNT_NAME" />
+ <field name="ACCOUNT_TYPE" />
+ <field name="DATA" />
+ </class>
+ <class name="android/provider/SyncStateContract$Constants" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/SyncStateContract$Columns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_DIRECTORY" />
+ </class>
+ <class name="android/provider/SyncStateContract$Helpers" since="5">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="get(Landroid/content/ContentProviderClient;Landroid/net/Uri;Landroid/accounts/Account;)[B" />
+ <method name="getWithUri(Landroid/content/ContentProviderClient;Landroid/net/Uri;Landroid/accounts/Account;)Landroid/util/Pair;" />
+ <method name="insert(Landroid/content/ContentProviderClient;Landroid/net/Uri;Landroid/accounts/Account;[B)Landroid/net/Uri;" />
+ <method name="newSetOperation(Landroid/net/Uri;Landroid/accounts/Account;[B)Landroid/content/ContentProviderOperation;" />
+ <method name="newUpdateOperation(Landroid/net/Uri;[B)Landroid/content/ContentProviderOperation;" />
+ <method name="set(Landroid/content/ContentProviderClient;Landroid/net/Uri;Landroid/accounts/Account;[B)V" />
+ <method name="update(Landroid/content/ContentProviderClient;Landroid/net/Uri;[B)V" />
+ </class>
+ <class name="android/provider/Telephony" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/provider/Telephony$BaseMmsColumns" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <field name="CONTENT_CLASS" />
+ <field name="CONTENT_LOCATION" />
+ <field name="CONTENT_TYPE" />
+ <field name="CREATOR" since="21" />
+ <field name="DATE" />
+ <field name="DATE_SENT" />
+ <field name="DELIVERY_REPORT" />
+ <field name="DELIVERY_TIME" />
+ <field name="EXPIRY" />
+ <field name="LOCKED" />
+ <field name="MESSAGE_BOX" />
+ <field name="MESSAGE_BOX_ALL" />
+ <field name="MESSAGE_BOX_DRAFTS" />
+ <field name="MESSAGE_BOX_FAILED" since="21" />
+ <field name="MESSAGE_BOX_INBOX" />
+ <field name="MESSAGE_BOX_OUTBOX" />
+ <field name="MESSAGE_BOX_SENT" />
+ <field name="MESSAGE_CLASS" />
+ <field name="MESSAGE_ID" />
+ <field name="MESSAGE_SIZE" />
+ <field name="MESSAGE_TYPE" />
+ <field name="MMS_VERSION" />
+ <field name="PRIORITY" />
+ <field name="READ" />
+ <field name="READ_REPORT" />
+ <field name="READ_STATUS" />
+ <field name="REPORT_ALLOWED" />
+ <field name="RESPONSE_STATUS" />
+ <field name="RESPONSE_TEXT" />
+ <field name="RETRIEVE_STATUS" />
+ <field name="RETRIEVE_TEXT" />
+ <field name="RETRIEVE_TEXT_CHARSET" />
+ <field name="SEEN" />
+ <field name="STATUS" />
+ <field name="SUBJECT" />
+ <field name="SUBJECT_CHARSET" />
+ <field name="TEXT_ONLY" />
+ <field name="THREAD_ID" />
+ <field name="TRANSACTION_ID" />
+ </class>
+ <class name="android/provider/Telephony$CanonicalAddressesColumns" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <field name="ADDRESS" />
+ </class>
+ <class name="android/provider/Telephony$Carriers" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <method name="&lt;init>()V" />
+ <field name="APN" />
+ <field name="AUTH_TYPE" />
+ <field name="BEARER" />
+ <field name="CARRIER_ENABLED" />
+ <field name="CONTENT_URI" />
+ <field name="CURRENT" />
+ <field name="DEFAULT_SORT_ORDER" />
+ <field name="MCC" />
+ <field name="MMSC" />
+ <field name="MMSPORT" />
+ <field name="MMSPROXY" />
+ <field name="MNC" />
+ <field name="MVNO_MATCH_DATA" />
+ <field name="MVNO_TYPE" />
+ <field name="NAME" />
+ <field name="NUMERIC" />
+ <field name="PASSWORD" />
+ <field name="PORT" />
+ <field name="PROTOCOL" />
+ <field name="PROXY" />
+ <field name="ROAMING_PROTOCOL" />
+ <field name="SERVER" />
+ <field name="TYPE" />
+ <field name="USER" />
+ </class>
+ <class name="android/provider/Telephony$Mms" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/Telephony$BaseMmsColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_URI" />
+ <field name="DEFAULT_SORT_ORDER" />
+ <field name="REPORT_REQUEST_URI" />
+ <field name="REPORT_STATUS_URI" />
+ </class>
+ <class name="android/provider/Telephony$Mms$Addr" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <method name="&lt;init>()V" />
+ <field name="ADDRESS" />
+ <field name="CHARSET" />
+ <field name="CONTACT_ID" />
+ <field name="MSG_ID" />
+ <field name="TYPE" />
+ </class>
+ <class name="android/provider/Telephony$Mms$Draft" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/Telephony$BaseMmsColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_URI" />
+ <field name="DEFAULT_SORT_ORDER" />
+ </class>
+ <class name="android/provider/Telephony$Mms$Inbox" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/Telephony$BaseMmsColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_URI" />
+ <field name="DEFAULT_SORT_ORDER" />
+ </class>
+ <class name="android/provider/Telephony$Mms$Intents" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_CHANGED_ACTION" />
+ <field name="DELETED_CONTENTS" />
+ </class>
+ <class name="android/provider/Telephony$Mms$Outbox" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/Telephony$BaseMmsColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_URI" />
+ <field name="DEFAULT_SORT_ORDER" />
+ </class>
+ <class name="android/provider/Telephony$Mms$Part" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CHARSET" />
+ <field name="CONTENT_DISPOSITION" />
+ <field name="CONTENT_ID" />
+ <field name="CONTENT_LOCATION" />
+ <field name="CONTENT_TYPE" />
+ <field name="CT_START" />
+ <field name="CT_TYPE" />
+ <field name="FILENAME" />
+ <field name="MSG_ID" />
+ <field name="NAME" />
+ <field name="SEQ" />
+ <field name="TEXT" />
+ <field name="_DATA" />
+ </class>
+ <class name="android/provider/Telephony$Mms$Rate" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_URI" />
+ <field name="SENT_TIME" />
+ </class>
+ <class name="android/provider/Telephony$Mms$Sent" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/Telephony$BaseMmsColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_URI" />
+ <field name="DEFAULT_SORT_ORDER" />
+ </class>
+ <class name="android/provider/Telephony$MmsSms" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_CONVERSATIONS_URI" />
+ <field name="CONTENT_DRAFT_URI" />
+ <field name="CONTENT_FILTER_BYPHONE_URI" />
+ <field name="CONTENT_LOCKED_URI" />
+ <field name="CONTENT_UNDELIVERED_URI" />
+ <field name="CONTENT_URI" />
+ <field name="ERR_TYPE_GENERIC" />
+ <field name="ERR_TYPE_GENERIC_PERMANENT" />
+ <field name="ERR_TYPE_MMS_PROTO_PERMANENT" />
+ <field name="ERR_TYPE_MMS_PROTO_TRANSIENT" />
+ <field name="ERR_TYPE_SMS_PROTO_PERMANENT" />
+ <field name="ERR_TYPE_SMS_PROTO_TRANSIENT" />
+ <field name="ERR_TYPE_TRANSPORT_FAILURE" />
+ <field name="MMS_PROTO" />
+ <field name="NO_ERROR" />
+ <field name="SEARCH_URI" />
+ <field name="SMS_PROTO" />
+ <field name="TYPE_DISCRIMINATOR_COLUMN" />
+ </class>
+ <class name="android/provider/Telephony$MmsSms$PendingMessages" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_URI" />
+ <field name="DUE_TIME" />
+ <field name="ERROR_CODE" />
+ <field name="ERROR_TYPE" />
+ <field name="LAST_TRY" />
+ <field name="MSG_ID" />
+ <field name="MSG_TYPE" />
+ <field name="PROTO_TYPE" />
+ <field name="RETRY_INDEX" />
+ </class>
+ <class name="android/provider/Telephony$Sms" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/Telephony$TextBasedSmsColumns" />
+ <method name="&lt;init>()V" />
+ <method name="getDefaultSmsPackage(Landroid/content/Context;)Ljava/lang/String;" />
+ <field name="CONTENT_URI" />
+ <field name="DEFAULT_SORT_ORDER" />
+ </class>
+ <class name="android/provider/Telephony$Sms$Conversations" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/Telephony$TextBasedSmsColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_URI" />
+ <field name="DEFAULT_SORT_ORDER" />
+ <field name="MESSAGE_COUNT" />
+ <field name="SNIPPET" />
+ </class>
+ <class name="android/provider/Telephony$Sms$Draft" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/Telephony$TextBasedSmsColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_URI" />
+ <field name="DEFAULT_SORT_ORDER" />
+ </class>
+ <class name="android/provider/Telephony$Sms$Inbox" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/Telephony$TextBasedSmsColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_URI" />
+ <field name="DEFAULT_SORT_ORDER" />
+ </class>
+ <class name="android/provider/Telephony$Sms$Intents" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getMessagesFromIntent(Landroid/content/Intent;)[Landroid/telephony/SmsMessage;" />
+ <field name="ACTION_CHANGE_DEFAULT" />
+ <field name="DATA_SMS_RECEIVED_ACTION" />
+ <field name="EXTRA_PACKAGE_NAME" />
+ <field name="RESULT_SMS_DUPLICATED" />
+ <field name="RESULT_SMS_GENERIC_ERROR" />
+ <field name="RESULT_SMS_HANDLED" />
+ <field name="RESULT_SMS_OUT_OF_MEMORY" />
+ <field name="RESULT_SMS_UNSUPPORTED" />
+ <field name="SIM_FULL_ACTION" />
+ <field name="SMS_CB_RECEIVED_ACTION" />
+ <field name="SMS_DELIVER_ACTION" />
+ <field name="SMS_EMERGENCY_CB_RECEIVED_ACTION" />
+ <field name="SMS_RECEIVED_ACTION" />
+ <field name="SMS_REJECTED_ACTION" />
+ <field name="SMS_SERVICE_CATEGORY_PROGRAM_DATA_RECEIVED_ACTION" />
+ <field name="WAP_PUSH_DELIVER_ACTION" />
+ <field name="WAP_PUSH_RECEIVED_ACTION" />
+ </class>
+ <class name="android/provider/Telephony$Sms$Outbox" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/Telephony$TextBasedSmsColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_URI" />
+ <field name="DEFAULT_SORT_ORDER" />
+ </class>
+ <class name="android/provider/Telephony$Sms$Sent" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/Telephony$TextBasedSmsColumns" />
+ <method name="&lt;init>()V" />
+ <field name="CONTENT_URI" />
+ <field name="DEFAULT_SORT_ORDER" />
+ </class>
+ <class name="android/provider/Telephony$TextBasedSmsColumns" since="19">
+ <extends name="java/lang/Object" />
+ <field name="ADDRESS" />
+ <field name="BODY" />
+ <field name="CREATOR" since="21" />
+ <field name="DATE" />
+ <field name="DATE_SENT" />
+ <field name="ERROR_CODE" />
+ <field name="LOCKED" />
+ <field name="MESSAGE_TYPE_ALL" />
+ <field name="MESSAGE_TYPE_DRAFT" />
+ <field name="MESSAGE_TYPE_FAILED" />
+ <field name="MESSAGE_TYPE_INBOX" />
+ <field name="MESSAGE_TYPE_OUTBOX" />
+ <field name="MESSAGE_TYPE_QUEUED" />
+ <field name="MESSAGE_TYPE_SENT" />
+ <field name="PERSON" />
+ <field name="PROTOCOL" />
+ <field name="READ" />
+ <field name="REPLY_PATH_PRESENT" />
+ <field name="SEEN" />
+ <field name="SERVICE_CENTER" />
+ <field name="STATUS" />
+ <field name="STATUS_COMPLETE" />
+ <field name="STATUS_FAILED" />
+ <field name="STATUS_NONE" />
+ <field name="STATUS_PENDING" />
+ <field name="SUBJECT" />
+ <field name="THREAD_ID" />
+ <field name="TYPE" />
+ </class>
+ <class name="android/provider/Telephony$Threads" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/Telephony$ThreadsColumns" />
+ <method name="&lt;init>()V" />
+ <field name="BROADCAST_THREAD" />
+ <field name="COMMON_THREAD" />
+ <field name="CONTENT_URI" />
+ <field name="OBSOLETE_THREADS_URI" />
+ </class>
+ <class name="android/provider/Telephony$ThreadsColumns" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <field name="ARCHIVED" since="21" />
+ <field name="DATE" />
+ <field name="ERROR" />
+ <field name="HAS_ATTACHMENT" />
+ <field name="MESSAGE_COUNT" />
+ <field name="READ" />
+ <field name="RECIPIENT_IDS" />
+ <field name="SNIPPET" />
+ <field name="SNIPPET_CHARSET" />
+ <field name="TYPE" />
+ </class>
+ <class name="android/provider/UserDictionary" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="AUTHORITY" />
+ <field name="CONTENT_URI" />
+ </class>
+ <class name="android/provider/UserDictionary$Words" since="3">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <method name="&lt;init>()V" />
+ <method name="addWord(Landroid/content/Context;Ljava/lang/String;II)V" />
+ <method name="addWord(Landroid/content/Context;Ljava/lang/String;ILjava/lang/String;Ljava/util/Locale;)V" since="16" />
+ <field name="APP_ID" />
+ <field name="CONTENT_ITEM_TYPE" />
+ <field name="CONTENT_TYPE" />
+ <field name="CONTENT_URI" />
+ <field name="DEFAULT_SORT_ORDER" />
+ <field name="FREQUENCY" />
+ <field name="LOCALE" />
+ <field name="LOCALE_TYPE_ALL" />
+ <field name="LOCALE_TYPE_CURRENT" />
+ <field name="SHORTCUT" since="16" />
+ <field name="WORD" />
+ <field name="_ID" />
+ </class>
+ <class name="android/provider/VoicemailContract" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="ACTION_FETCH_VOICEMAIL" />
+ <field name="ACTION_NEW_VOICEMAIL" />
+ <field name="AUTHORITY" />
+ <field name="EXTRA_SELF_CHANGE" />
+ <field name="PARAM_KEY_SOURCE_PACKAGE" />
+ </class>
+ <class name="android/provider/VoicemailContract$Status" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <method name="&lt;init>()V" />
+ <method name="buildSourceUri(Ljava/lang/String;)Landroid/net/Uri;" />
+ <field name="CONFIGURATION_STATE" />
+ <field name="CONFIGURATION_STATE_CAN_BE_CONFIGURED" />
+ <field name="CONFIGURATION_STATE_NOT_CONFIGURED" />
+ <field name="CONFIGURATION_STATE_OK" />
+ <field name="CONTENT_URI" />
+ <field name="DATA_CHANNEL_STATE" />
+ <field name="DATA_CHANNEL_STATE_NO_CONNECTION" />
+ <field name="DATA_CHANNEL_STATE_OK" />
+ <field name="DIR_TYPE" />
+ <field name="ITEM_TYPE" />
+ <field name="NOTIFICATION_CHANNEL_STATE" />
+ <field name="NOTIFICATION_CHANNEL_STATE_MESSAGE_WAITING" />
+ <field name="NOTIFICATION_CHANNEL_STATE_NO_CONNECTION" />
+ <field name="NOTIFICATION_CHANNEL_STATE_OK" />
+ <field name="SETTINGS_URI" />
+ <field name="SOURCE_PACKAGE" />
+ <field name="VOICEMAIL_ACCESS_URI" />
+ </class>
+ <class name="android/provider/VoicemailContract$Voicemails" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/provider/BaseColumns" />
+ <implements name="android/provider/OpenableColumns" />
+ <method name="&lt;init>()V" />
+ <method name="buildSourceUri(Ljava/lang/String;)Landroid/net/Uri;" />
+ <field name="CONTENT_URI" />
+ <field name="DATE" />
+ <field name="DIR_TYPE" />
+ <field name="DURATION" />
+ <field name="HAS_CONTENT" />
+ <field name="IS_READ" />
+ <field name="ITEM_TYPE" />
+ <field name="MIME_TYPE" />
+ <field name="NUMBER" />
+ <field name="SOURCE_DATA" />
+ <field name="SOURCE_PACKAGE" />
+ <field name="TRANSCRIPTION" since="21" />
+ </class>
+ <class name="android/renderscript/Allocation" since="11">
+ <extends name="android/renderscript/BaseObj" />
+ <method name="&lt;init>()V" />
+ <method name="copy1DRangeFrom(IILandroid/renderscript/Allocation;I)V" since="14" />
+ <method name="copy1DRangeFrom(IILjava/lang/Object;)V" since="21" />
+ <method name="copy1DRangeFrom(II[B)V" />
+ <method name="copy1DRangeFrom(II[F)V" />
+ <method name="copy1DRangeFrom(II[I)V" />
+ <method name="copy1DRangeFrom(II[S)V" />
+ <method name="copy1DRangeFromUnchecked(IILjava/lang/Object;)V" since="21" />
+ <method name="copy1DRangeFromUnchecked(II[B)V" />
+ <method name="copy1DRangeFromUnchecked(II[F)V" />
+ <method name="copy1DRangeFromUnchecked(II[I)V" />
+ <method name="copy1DRangeFromUnchecked(II[S)V" />
+ <method name="copy2DRangeFrom(IIIILandroid/renderscript/Allocation;II)V" since="14" />
+ <method name="copy2DRangeFrom(IIIILjava/lang/Object;)V" since="21" />
+ <method name="copy2DRangeFrom(IIII[B)V" />
+ <method name="copy2DRangeFrom(IIII[F)V" />
+ <method name="copy2DRangeFrom(IIII[I)V" />
+ <method name="copy2DRangeFrom(IIII[S)V" />
+ <method name="copy2DRangeFrom(IILandroid/graphics/Bitmap;)V" />
+ <method name="copyFrom(Landroid/graphics/Bitmap;)V" />
+ <method name="copyFrom(Landroid/renderscript/Allocation;)V" since="18" />
+ <method name="copyFrom(Ljava/lang/Object;)V" since="21" />
+ <method name="copyFrom([B)V" />
+ <method name="copyFrom([F)V" />
+ <method name="copyFrom([I)V" />
+ <method name="copyFrom([Landroid/renderscript/BaseObj;)V" />
+ <method name="copyFrom([S)V" />
+ <method name="copyFromUnchecked(Ljava/lang/Object;)V" since="21" />
+ <method name="copyFromUnchecked([B)V" />
+ <method name="copyFromUnchecked([F)V" />
+ <method name="copyFromUnchecked([I)V" />
+ <method name="copyFromUnchecked([S)V" />
+ <method name="copyTo(Landroid/graphics/Bitmap;)V" />
+ <method name="copyTo(Ljava/lang/Object;)V" since="21" />
+ <method name="copyTo([B)V" />
+ <method name="copyTo([F)V" />
+ <method name="copyTo([I)V" />
+ <method name="copyTo([S)V" />
+ <method name="createCubemapFromBitmap(Landroid/renderscript/RenderScript;Landroid/graphics/Bitmap;)Landroid/renderscript/Allocation;" />
+ <method name="createCubemapFromBitmap(Landroid/renderscript/RenderScript;Landroid/graphics/Bitmap;Landroid/renderscript/Allocation$MipmapControl;I)Landroid/renderscript/Allocation;" />
+ <method name="createCubemapFromCubeFaces(Landroid/renderscript/RenderScript;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;)Landroid/renderscript/Allocation;" />
+ <method name="createCubemapFromCubeFaces(Landroid/renderscript/RenderScript;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;Landroid/graphics/Bitmap;Landroid/renderscript/Allocation$MipmapControl;I)Landroid/renderscript/Allocation;" />
+ <method name="createFromBitmap(Landroid/renderscript/RenderScript;Landroid/graphics/Bitmap;)Landroid/renderscript/Allocation;" />
+ <method name="createFromBitmap(Landroid/renderscript/RenderScript;Landroid/graphics/Bitmap;Landroid/renderscript/Allocation$MipmapControl;I)Landroid/renderscript/Allocation;" />
+ <method name="createFromBitmapResource(Landroid/renderscript/RenderScript;Landroid/content/res/Resources;I)Landroid/renderscript/Allocation;" />
+ <method name="createFromBitmapResource(Landroid/renderscript/RenderScript;Landroid/content/res/Resources;ILandroid/renderscript/Allocation$MipmapControl;I)Landroid/renderscript/Allocation;" />
+ <method name="createFromString(Landroid/renderscript/RenderScript;Ljava/lang/String;I)Landroid/renderscript/Allocation;" />
+ <method name="createSized(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;I)Landroid/renderscript/Allocation;" />
+ <method name="createSized(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;II)Landroid/renderscript/Allocation;" />
+ <method name="createTyped(Landroid/renderscript/RenderScript;Landroid/renderscript/Type;)Landroid/renderscript/Allocation;" />
+ <method name="createTyped(Landroid/renderscript/RenderScript;Landroid/renderscript/Type;I)Landroid/renderscript/Allocation;" />
+ <method name="createTyped(Landroid/renderscript/RenderScript;Landroid/renderscript/Type;Landroid/renderscript/Allocation$MipmapControl;I)Landroid/renderscript/Allocation;" />
+ <method name="generateMipmaps()V" />
+ <method name="getBytesSize()I" since="16" />
+ <method name="getElement()Landroid/renderscript/Element;" since="16" />
+ <method name="getSurface()Landroid/view/Surface;" since="16" />
+ <method name="getType()Landroid/renderscript/Type;" />
+ <method name="getUsage()I" since="16" />
+ <method name="ioReceive()V" since="16" />
+ <method name="ioSend()V" since="16" />
+ <method name="resize(I)V" />
+ <method name="setFromFieldPacker(IILandroid/renderscript/FieldPacker;)V" />
+ <method name="setFromFieldPacker(ILandroid/renderscript/FieldPacker;)V" />
+ <method name="setOnBufferAvailableListener(Landroid/renderscript/Allocation$OnBufferAvailableListener;)V" since="19" />
+ <method name="setSurface(Landroid/view/Surface;)V" since="16" />
+ <method name="syncAll(I)V" />
+ <field name="USAGE_GRAPHICS_CONSTANTS" />
+ <field name="USAGE_GRAPHICS_RENDER_TARGET" since="14" />
+ <field name="USAGE_GRAPHICS_TEXTURE" />
+ <field name="USAGE_GRAPHICS_VERTEX" />
+ <field name="USAGE_IO_INPUT" since="16" />
+ <field name="USAGE_IO_OUTPUT" since="16" />
+ <field name="USAGE_SCRIPT" />
+ <field name="USAGE_SHARED" since="18" />
+ </class>
+ <class name="android/renderscript/Allocation$MipmapControl" since="11">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/Allocation$MipmapControl;" />
+ <method name="values()[Landroid/renderscript/Allocation$MipmapControl;" />
+ <field name="MIPMAP_FULL" />
+ <field name="MIPMAP_NONE" />
+ <field name="MIPMAP_ON_SYNC_TO_TEXTURE" />
+ </class>
+ <class name="android/renderscript/Allocation$OnBufferAvailableListener" since="19">
+ <extends name="java/lang/Object" />
+ <method name="onBufferAvailable(Landroid/renderscript/Allocation;)V" />
+ </class>
+ <class name="android/renderscript/AllocationAdapter" since="11">
+ <extends name="android/renderscript/Allocation" />
+ <method name="&lt;init>()V" />
+ <method name="create1D(Landroid/renderscript/RenderScript;Landroid/renderscript/Allocation;)Landroid/renderscript/AllocationAdapter;" since="14" />
+ <method name="create2D(Landroid/renderscript/RenderScript;Landroid/renderscript/Allocation;)Landroid/renderscript/AllocationAdapter;" />
+ <method name="readData([F)V" />
+ <method name="readData([I)V" />
+ <method name="setFace(Landroid/renderscript/Type$CubemapFace;)V" />
+ <method name="setLOD(I)V" />
+ <method name="setY(I)V" />
+ <method name="setZ(I)V" />
+ <method name="subData(ILandroid/renderscript/FieldPacker;)V" />
+ <method name="subData1D(II[B)V" />
+ <method name="subData1D(II[F)V" />
+ <method name="subData1D(II[I)V" />
+ <method name="subData1D(II[S)V" />
+ <method name="subData2D(IIII[F)V" />
+ <method name="subData2D(IIII[I)V" />
+ <method name="subElementData(IILandroid/renderscript/FieldPacker;)V" />
+ </class>
+ <class name="android/renderscript/BaseObj" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="destroy()V" />
+ <method name="getName()Ljava/lang/String;" since="14" />
+ <method name="setName(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/renderscript/Byte2" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(BB)V" since="14" />
+ <field name="x" />
+ <field name="y" />
+ </class>
+ <class name="android/renderscript/Byte3" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(BBB)V" since="14" />
+ <field name="x" />
+ <field name="y" />
+ <field name="z" />
+ </class>
+ <class name="android/renderscript/Byte4" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(BBBB)V" since="14" />
+ <field name="w" />
+ <field name="x" />
+ <field name="y" />
+ <field name="z" />
+ </class>
+ <class name="android/renderscript/Double2" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(DD)V" />
+ <field name="x" />
+ <field name="y" />
+ </class>
+ <class name="android/renderscript/Double3" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(DDD)V" />
+ <field name="x" />
+ <field name="y" />
+ <field name="z" />
+ </class>
+ <class name="android/renderscript/Double4" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(DDDD)V" />
+ <field name="w" />
+ <field name="x" />
+ <field name="y" />
+ <field name="z" />
+ </class>
+ <class name="android/renderscript/Element" since="11">
+ <extends name="android/renderscript/BaseObj" />
+ <method name="&lt;init>()V" />
+ <method name="ALLOCATION(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="A_8(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="BOOLEAN(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="ELEMENT(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="F32(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="F32_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="F32_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="F32_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="F64(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="F64_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14" />
+ <method name="F64_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14" />
+ <method name="F64_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14" />
+ <method name="FONT(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="16" />
+ <method name="I16(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="I16_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14" />
+ <method name="I16_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14" />
+ <method name="I16_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14" />
+ <method name="I32(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="I32_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14" />
+ <method name="I32_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14" />
+ <method name="I32_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14" />
+ <method name="I64(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="I64_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14" />
+ <method name="I64_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14" />
+ <method name="I64_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14" />
+ <method name="I8(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="I8_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14" />
+ <method name="I8_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14" />
+ <method name="I8_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14" />
+ <method name="MATRIX4X4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="MATRIX_2X2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="MATRIX_3X3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="MATRIX_4X4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="MESH(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="PROGRAM_FRAGMENT(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="PROGRAM_RASTER(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="PROGRAM_STORE(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="PROGRAM_VERTEX(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="RGBA_4444(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="RGBA_5551(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="RGBA_8888(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="RGB_565(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="RGB_888(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="SAMPLER(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="SCRIPT(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="TYPE(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="U16(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="U16_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14" />
+ <method name="U16_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14" />
+ <method name="U16_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14" />
+ <method name="U32(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="U32_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14" />
+ <method name="U32_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14" />
+ <method name="U32_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14" />
+ <method name="U64(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="U64_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14" />
+ <method name="U64_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14" />
+ <method name="U64_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14" />
+ <method name="U8(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="U8_2(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14" />
+ <method name="U8_3(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="14" />
+ <method name="U8_4(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" />
+ <method name="YUV(Landroid/renderscript/RenderScript;)Landroid/renderscript/Element;" since="19" />
+ <method name="createPixel(Landroid/renderscript/RenderScript;Landroid/renderscript/Element$DataType;Landroid/renderscript/Element$DataKind;)Landroid/renderscript/Element;" />
+ <method name="createVector(Landroid/renderscript/RenderScript;Landroid/renderscript/Element$DataType;I)Landroid/renderscript/Element;" />
+ <method name="getBytesSize()I" since="16" />
+ <method name="getDataKind()Landroid/renderscript/Element$DataKind;" since="16" />
+ <method name="getDataType()Landroid/renderscript/Element$DataType;" since="16" />
+ <method name="getSubElement(I)Landroid/renderscript/Element;" since="16" />
+ <method name="getSubElementArraySize(I)I" since="16" />
+ <method name="getSubElementCount()I" since="16" />
+ <method name="getSubElementName(I)Ljava/lang/String;" since="16" />
+ <method name="getSubElementOffsetBytes(I)I" since="16" />
+ <method name="getVectorSize()I" since="16" />
+ <method name="isCompatible(Landroid/renderscript/Element;)Z" since="14" />
+ <method name="isComplex()Z" />
+ </class>
+ <class name="android/renderscript/Element$Builder" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;)V" />
+ <method name="add(Landroid/renderscript/Element;Ljava/lang/String;)Landroid/renderscript/Element$Builder;" />
+ <method name="add(Landroid/renderscript/Element;Ljava/lang/String;I)Landroid/renderscript/Element$Builder;" />
+ <method name="create()Landroid/renderscript/Element;" />
+ </class>
+ <class name="android/renderscript/Element$DataKind" since="11">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/Element$DataKind;" />
+ <method name="values()[Landroid/renderscript/Element$DataKind;" />
+ <field name="PIXEL_A" />
+ <field name="PIXEL_DEPTH" since="14" />
+ <field name="PIXEL_L" />
+ <field name="PIXEL_LA" />
+ <field name="PIXEL_RGB" />
+ <field name="PIXEL_RGBA" />
+ <field name="PIXEL_YUV" since="18" />
+ <field name="USER" />
+ </class>
+ <class name="android/renderscript/Element$DataType" since="11">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/Element$DataType;" />
+ <method name="values()[Landroid/renderscript/Element$DataType;" />
+ <field name="BOOLEAN" />
+ <field name="FLOAT_32" />
+ <field name="FLOAT_64" />
+ <field name="MATRIX_2X2" />
+ <field name="MATRIX_3X3" />
+ <field name="MATRIX_4X4" />
+ <field name="NONE" since="16" />
+ <field name="RS_ALLOCATION" />
+ <field name="RS_ELEMENT" />
+ <field name="RS_FONT" since="16" />
+ <field name="RS_MESH" />
+ <field name="RS_PROGRAM_FRAGMENT" />
+ <field name="RS_PROGRAM_RASTER" />
+ <field name="RS_PROGRAM_STORE" />
+ <field name="RS_PROGRAM_VERTEX" />
+ <field name="RS_SAMPLER" />
+ <field name="RS_SCRIPT" />
+ <field name="RS_TYPE" />
+ <field name="SIGNED_16" />
+ <field name="SIGNED_32" />
+ <field name="SIGNED_64" />
+ <field name="SIGNED_8" />
+ <field name="UNSIGNED_16" />
+ <field name="UNSIGNED_32" />
+ <field name="UNSIGNED_4_4_4_4" />
+ <field name="UNSIGNED_5_5_5_1" />
+ <field name="UNSIGNED_5_6_5" />
+ <field name="UNSIGNED_64" />
+ <field name="UNSIGNED_8" />
+ </class>
+ <class name="android/renderscript/FieldPacker" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>([B)V" since="18" />
+ <method name="addBoolean(Z)V" />
+ <method name="addF32(F)V" />
+ <method name="addF32(Landroid/renderscript/Float2;)V" />
+ <method name="addF32(Landroid/renderscript/Float3;)V" />
+ <method name="addF32(Landroid/renderscript/Float4;)V" />
+ <method name="addF64(D)V" />
+ <method name="addF64(Landroid/renderscript/Double2;)V" since="14" />
+ <method name="addF64(Landroid/renderscript/Double3;)V" since="14" />
+ <method name="addF64(Landroid/renderscript/Double4;)V" since="14" />
+ <method name="addI16(Landroid/renderscript/Short2;)V" />
+ <method name="addI16(Landroid/renderscript/Short3;)V" />
+ <method name="addI16(Landroid/renderscript/Short4;)V" />
+ <method name="addI16(S)V" />
+ <method name="addI32(I)V" />
+ <method name="addI32(Landroid/renderscript/Int2;)V" />
+ <method name="addI32(Landroid/renderscript/Int3;)V" />
+ <method name="addI32(Landroid/renderscript/Int4;)V" />
+ <method name="addI64(J)V" />
+ <method name="addI64(Landroid/renderscript/Long2;)V" since="14" />
+ <method name="addI64(Landroid/renderscript/Long3;)V" since="14" />
+ <method name="addI64(Landroid/renderscript/Long4;)V" since="14" />
+ <method name="addI8(B)V" />
+ <method name="addI8(Landroid/renderscript/Byte2;)V" />
+ <method name="addI8(Landroid/renderscript/Byte3;)V" />
+ <method name="addI8(Landroid/renderscript/Byte4;)V" />
+ <method name="addMatrix(Landroid/renderscript/Matrix2f;)V" />
+ <method name="addMatrix(Landroid/renderscript/Matrix3f;)V" />
+ <method name="addMatrix(Landroid/renderscript/Matrix4f;)V" />
+ <method name="addObj(Landroid/renderscript/BaseObj;)V" />
+ <method name="addU16(I)V" />
+ <method name="addU16(Landroid/renderscript/Int2;)V" />
+ <method name="addU16(Landroid/renderscript/Int3;)V" />
+ <method name="addU16(Landroid/renderscript/Int4;)V" />
+ <method name="addU32(J)V" />
+ <method name="addU32(Landroid/renderscript/Long2;)V" />
+ <method name="addU32(Landroid/renderscript/Long3;)V" />
+ <method name="addU32(Landroid/renderscript/Long4;)V" />
+ <method name="addU64(J)V" />
+ <method name="addU64(Landroid/renderscript/Long2;)V" since="14" />
+ <method name="addU64(Landroid/renderscript/Long3;)V" since="14" />
+ <method name="addU64(Landroid/renderscript/Long4;)V" since="14" />
+ <method name="addU8(Landroid/renderscript/Short2;)V" />
+ <method name="addU8(Landroid/renderscript/Short3;)V" />
+ <method name="addU8(Landroid/renderscript/Short4;)V" />
+ <method name="addU8(S)V" />
+ <method name="align(I)V" />
+ <method name="getData()[B" />
+ <method name="reset()V" />
+ <method name="reset(I)V" />
+ <method name="skip(I)V" />
+ <method name="subBoolean()Z" since="18" />
+ <method name="subByte2()Landroid/renderscript/Byte2;" since="18" />
+ <method name="subByte3()Landroid/renderscript/Byte3;" since="18" />
+ <method name="subByte4()Landroid/renderscript/Byte4;" since="18" />
+ <method name="subDouble2()Landroid/renderscript/Double2;" since="18" />
+ <method name="subDouble3()Landroid/renderscript/Double3;" since="18" />
+ <method name="subDouble4()Landroid/renderscript/Double4;" since="18" />
+ <method name="subF32()F" since="18" />
+ <method name="subF64()D" since="18" />
+ <method name="subFloat2()Landroid/renderscript/Float2;" since="18" />
+ <method name="subFloat3()Landroid/renderscript/Float3;" since="18" />
+ <method name="subFloat4()Landroid/renderscript/Float4;" since="18" />
+ <method name="subI16()S" since="18" />
+ <method name="subI32()I" since="18" />
+ <method name="subI64()J" since="18" />
+ <method name="subI8()B" since="18" />
+ <method name="subInt2()Landroid/renderscript/Int2;" since="18" />
+ <method name="subInt3()Landroid/renderscript/Int3;" since="18" />
+ <method name="subInt4()Landroid/renderscript/Int4;" since="18" />
+ <method name="subLong2()Landroid/renderscript/Long2;" since="18" />
+ <method name="subLong3()Landroid/renderscript/Long3;" since="18" />
+ <method name="subLong4()Landroid/renderscript/Long4;" since="18" />
+ <method name="subMatrix2f()Landroid/renderscript/Matrix2f;" since="18" />
+ <method name="subMatrix3f()Landroid/renderscript/Matrix3f;" since="18" />
+ <method name="subMatrix4f()Landroid/renderscript/Matrix4f;" since="18" />
+ <method name="subShort2()Landroid/renderscript/Short2;" since="18" />
+ <method name="subShort3()Landroid/renderscript/Short3;" since="18" />
+ <method name="subShort4()Landroid/renderscript/Short4;" since="18" />
+ <method name="subalign(I)V" since="18" />
+ </class>
+ <class name="android/renderscript/FileA3D" since="11">
+ <extends name="android/renderscript/BaseObj" />
+ <method name="&lt;init>()V" />
+ <method name="createFromAsset(Landroid/renderscript/RenderScript;Landroid/content/res/AssetManager;Ljava/lang/String;)Landroid/renderscript/FileA3D;" />
+ <method name="createFromFile(Landroid/renderscript/RenderScript;Ljava/io/File;)Landroid/renderscript/FileA3D;" />
+ <method name="createFromFile(Landroid/renderscript/RenderScript;Ljava/lang/String;)Landroid/renderscript/FileA3D;" />
+ <method name="createFromResource(Landroid/renderscript/RenderScript;Landroid/content/res/Resources;I)Landroid/renderscript/FileA3D;" />
+ <method name="getIndexEntry(I)Landroid/renderscript/FileA3D$IndexEntry;" />
+ <method name="getIndexEntryCount()I" />
+ </class>
+ <class name="android/renderscript/FileA3D$EntryType" since="11">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/FileA3D$EntryType;" />
+ <method name="values()[Landroid/renderscript/FileA3D$EntryType;" />
+ <field name="MESH" />
+ <field name="UNKNOWN" />
+ </class>
+ <class name="android/renderscript/FileA3D$IndexEntry" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getEntryType()Landroid/renderscript/FileA3D$EntryType;" />
+ <method name="getMesh()Landroid/renderscript/Mesh;" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getObject()Landroid/renderscript/BaseObj;" />
+ </class>
+ <class name="android/renderscript/Float2" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(FF)V" />
+ <field name="x" />
+ <field name="y" />
+ </class>
+ <class name="android/renderscript/Float3" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(FFF)V" />
+ <field name="x" />
+ <field name="y" />
+ <field name="z" />
+ </class>
+ <class name="android/renderscript/Float4" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(FFFF)V" />
+ <field name="w" />
+ <field name="x" />
+ <field name="y" />
+ <field name="z" />
+ </class>
+ <class name="android/renderscript/Font" since="11">
+ <extends name="android/renderscript/BaseObj" />
+ <method name="&lt;init>()V" />
+ <method name="create(Landroid/renderscript/RenderScript;Landroid/content/res/Resources;Ljava/lang/String;Landroid/renderscript/Font$Style;F)Landroid/renderscript/Font;" />
+ <method name="createFromAsset(Landroid/renderscript/RenderScript;Landroid/content/res/Resources;Ljava/lang/String;F)Landroid/renderscript/Font;" />
+ <method name="createFromFile(Landroid/renderscript/RenderScript;Landroid/content/res/Resources;Ljava/io/File;F)Landroid/renderscript/Font;" />
+ <method name="createFromFile(Landroid/renderscript/RenderScript;Landroid/content/res/Resources;Ljava/lang/String;F)Landroid/renderscript/Font;" />
+ <method name="createFromResource(Landroid/renderscript/RenderScript;Landroid/content/res/Resources;IF)Landroid/renderscript/Font;" />
+ </class>
+ <class name="android/renderscript/Font$Style" since="11">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/Font$Style;" />
+ <method name="values()[Landroid/renderscript/Font$Style;" />
+ <field name="BOLD" />
+ <field name="BOLD_ITALIC" />
+ <field name="ITALIC" />
+ <field name="NORMAL" />
+ </class>
+ <class name="android/renderscript/Int2" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(II)V" since="14" />
+ <field name="x" />
+ <field name="y" />
+ </class>
+ <class name="android/renderscript/Int3" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(III)V" since="14" />
+ <field name="x" />
+ <field name="y" />
+ <field name="z" />
+ </class>
+ <class name="android/renderscript/Int4" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(IIII)V" since="14" />
+ <field name="w" />
+ <field name="x" />
+ <field name="y" />
+ <field name="z" />
+ </class>
+ <class name="android/renderscript/Long2" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(JJ)V" since="14" />
+ <field name="x" />
+ <field name="y" />
+ </class>
+ <class name="android/renderscript/Long3" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(JJJ)V" since="14" />
+ <field name="x" />
+ <field name="y" />
+ <field name="z" />
+ </class>
+ <class name="android/renderscript/Long4" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(JJJJ)V" since="14" />
+ <field name="w" />
+ <field name="x" />
+ <field name="y" />
+ <field name="z" />
+ </class>
+ <class name="android/renderscript/Matrix2f" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>([F)V" />
+ <method name="get(II)F" />
+ <method name="getArray()[F" />
+ <method name="load(Landroid/renderscript/Matrix2f;)V" />
+ <method name="loadIdentity()V" />
+ <method name="loadMultiply(Landroid/renderscript/Matrix2f;Landroid/renderscript/Matrix2f;)V" />
+ <method name="loadRotate(F)V" />
+ <method name="loadScale(FF)V" />
+ <method name="multiply(Landroid/renderscript/Matrix2f;)V" />
+ <method name="rotate(F)V" />
+ <method name="scale(FF)V" />
+ <method name="set(IIF)V" />
+ <method name="transpose()V" />
+ </class>
+ <class name="android/renderscript/Matrix3f" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>([F)V" />
+ <method name="get(II)F" />
+ <method name="getArray()[F" />
+ <method name="load(Landroid/renderscript/Matrix3f;)V" />
+ <method name="loadIdentity()V" />
+ <method name="loadMultiply(Landroid/renderscript/Matrix3f;Landroid/renderscript/Matrix3f;)V" />
+ <method name="loadRotate(F)V" />
+ <method name="loadRotate(FFFF)V" />
+ <method name="loadScale(FF)V" />
+ <method name="loadScale(FFF)V" />
+ <method name="loadTranslate(FF)V" />
+ <method name="multiply(Landroid/renderscript/Matrix3f;)V" />
+ <method name="rotate(F)V" />
+ <method name="rotate(FFFF)V" />
+ <method name="scale(FF)V" />
+ <method name="scale(FFF)V" />
+ <method name="set(IIF)V" />
+ <method name="translate(FF)V" />
+ <method name="transpose()V" />
+ </class>
+ <class name="android/renderscript/Matrix4f" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>([F)V" />
+ <method name="get(II)F" />
+ <method name="getArray()[F" />
+ <method name="inverse()Z" />
+ <method name="inverseTranspose()Z" />
+ <method name="load(Landroid/renderscript/Matrix4f;)V" />
+ <method name="loadFrustum(FFFFFF)V" />
+ <method name="loadIdentity()V" />
+ <method name="loadMultiply(Landroid/renderscript/Matrix4f;Landroid/renderscript/Matrix4f;)V" />
+ <method name="loadOrtho(FFFFFF)V" />
+ <method name="loadOrthoWindow(II)V" />
+ <method name="loadPerspective(FFFF)V" />
+ <method name="loadProjectionNormalized(II)V" />
+ <method name="loadRotate(FFFF)V" />
+ <method name="loadScale(FFF)V" />
+ <method name="loadTranslate(FFF)V" />
+ <method name="multiply(Landroid/renderscript/Matrix4f;)V" />
+ <method name="rotate(FFFF)V" />
+ <method name="scale(FFF)V" />
+ <method name="set(IIF)V" />
+ <method name="translate(FFF)V" />
+ <method name="transpose()V" />
+ </class>
+ <class name="android/renderscript/Mesh" since="11">
+ <extends name="android/renderscript/BaseObj" />
+ <method name="&lt;init>()V" />
+ <method name="getIndexSetAllocation(I)Landroid/renderscript/Allocation;" />
+ <method name="getPrimitive(I)Landroid/renderscript/Mesh$Primitive;" />
+ <method name="getPrimitiveCount()I" />
+ <method name="getVertexAllocation(I)Landroid/renderscript/Allocation;" />
+ <method name="getVertexAllocationCount()I" />
+ </class>
+ <class name="android/renderscript/Mesh$AllocationBuilder" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;)V" />
+ <method name="addIndexSetAllocation(Landroid/renderscript/Allocation;Landroid/renderscript/Mesh$Primitive;)Landroid/renderscript/Mesh$AllocationBuilder;" />
+ <method name="addIndexSetType(Landroid/renderscript/Mesh$Primitive;)Landroid/renderscript/Mesh$AllocationBuilder;" />
+ <method name="addVertexAllocation(Landroid/renderscript/Allocation;)Landroid/renderscript/Mesh$AllocationBuilder;" />
+ <method name="create()Landroid/renderscript/Mesh;" />
+ <method name="getCurrentIndexSetIndex()I" />
+ <method name="getCurrentVertexTypeIndex()I" />
+ </class>
+ <class name="android/renderscript/Mesh$Builder" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;I)V" />
+ <method name="addIndexSetType(Landroid/renderscript/Element;ILandroid/renderscript/Mesh$Primitive;)Landroid/renderscript/Mesh$Builder;" />
+ <method name="addIndexSetType(Landroid/renderscript/Mesh$Primitive;)Landroid/renderscript/Mesh$Builder;" />
+ <method name="addIndexSetType(Landroid/renderscript/Type;Landroid/renderscript/Mesh$Primitive;)Landroid/renderscript/Mesh$Builder;" />
+ <method name="addVertexType(Landroid/renderscript/Element;I)Landroid/renderscript/Mesh$Builder;" />
+ <method name="addVertexType(Landroid/renderscript/Type;)Landroid/renderscript/Mesh$Builder;" />
+ <method name="create()Landroid/renderscript/Mesh;" />
+ <method name="getCurrentIndexSetIndex()I" />
+ <method name="getCurrentVertexTypeIndex()I" />
+ </class>
+ <class name="android/renderscript/Mesh$Primitive" since="11">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/Mesh$Primitive;" />
+ <method name="values()[Landroid/renderscript/Mesh$Primitive;" />
+ <field name="LINE" />
+ <field name="LINE_STRIP" />
+ <field name="POINT" />
+ <field name="TRIANGLE" />
+ <field name="TRIANGLE_FAN" />
+ <field name="TRIANGLE_STRIP" />
+ </class>
+ <class name="android/renderscript/Mesh$TriangleMeshBuilder" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;II)V" />
+ <method name="addTriangle(III)Landroid/renderscript/Mesh$TriangleMeshBuilder;" />
+ <method name="addVertex(FF)Landroid/renderscript/Mesh$TriangleMeshBuilder;" />
+ <method name="addVertex(FFF)Landroid/renderscript/Mesh$TriangleMeshBuilder;" />
+ <method name="create(Z)Landroid/renderscript/Mesh;" />
+ <method name="setColor(FFFF)Landroid/renderscript/Mesh$TriangleMeshBuilder;" />
+ <method name="setNormal(FFF)Landroid/renderscript/Mesh$TriangleMeshBuilder;" />
+ <method name="setTexture(FF)Landroid/renderscript/Mesh$TriangleMeshBuilder;" />
+ <field name="COLOR" />
+ <field name="NORMAL" />
+ <field name="TEXTURE_0" />
+ </class>
+ <class name="android/renderscript/Program" since="11">
+ <extends name="android/renderscript/BaseObj" />
+ <method name="&lt;init>()V" />
+ <method name="bindConstants(Landroid/renderscript/Allocation;I)V" />
+ <method name="bindSampler(Landroid/renderscript/Sampler;I)V" />
+ <method name="bindTexture(Landroid/renderscript/Allocation;I)V" />
+ <method name="getConstant(I)Landroid/renderscript/Type;" since="16" />
+ <method name="getConstantCount()I" since="16" />
+ <method name="getTextureCount()I" since="16" />
+ <method name="getTextureName(I)Ljava/lang/String;" since="16" />
+ <method name="getTextureType(I)Landroid/renderscript/Program$TextureType;" since="16" />
+ </class>
+ <class name="android/renderscript/Program$BaseProgramBuilder" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;)V" />
+ <method name="addConstant(Landroid/renderscript/Type;)Landroid/renderscript/Program$BaseProgramBuilder;" />
+ <method name="addTexture(Landroid/renderscript/Program$TextureType;)Landroid/renderscript/Program$BaseProgramBuilder;" />
+ <method name="addTexture(Landroid/renderscript/Program$TextureType;Ljava/lang/String;)Landroid/renderscript/Program$BaseProgramBuilder;" since="16" />
+ <method name="getCurrentConstantIndex()I" />
+ <method name="getCurrentTextureIndex()I" />
+ <method name="initProgram(Landroid/renderscript/Program;)V" />
+ <method name="setShader(Landroid/content/res/Resources;I)Landroid/renderscript/Program$BaseProgramBuilder;" />
+ <method name="setShader(Ljava/lang/String;)Landroid/renderscript/Program$BaseProgramBuilder;" />
+ </class>
+ <class name="android/renderscript/Program$TextureType" since="11">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/Program$TextureType;" />
+ <method name="values()[Landroid/renderscript/Program$TextureType;" />
+ <field name="TEXTURE_2D" />
+ <field name="TEXTURE_CUBE" />
+ </class>
+ <class name="android/renderscript/ProgramFragment" since="11">
+ <extends name="android/renderscript/Program" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/renderscript/ProgramFragment$Builder" since="11">
+ <extends name="android/renderscript/Program$BaseProgramBuilder" />
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;)V" />
+ <method name="create()Landroid/renderscript/ProgramFragment;" />
+ </class>
+ <class name="android/renderscript/ProgramFragmentFixedFunction" since="11">
+ <extends name="android/renderscript/ProgramFragment" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/renderscript/ProgramFragmentFixedFunction$Builder" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;)V" />
+ <method name="create()Landroid/renderscript/ProgramFragmentFixedFunction;" />
+ <method name="setPointSpriteTexCoordinateReplacement(Z)Landroid/renderscript/ProgramFragmentFixedFunction$Builder;" />
+ <method name="setTexture(Landroid/renderscript/ProgramFragmentFixedFunction$Builder$EnvMode;Landroid/renderscript/ProgramFragmentFixedFunction$Builder$Format;I)Landroid/renderscript/ProgramFragmentFixedFunction$Builder;" />
+ <method name="setVaryingColor(Z)Landroid/renderscript/ProgramFragmentFixedFunction$Builder;" />
+ <field name="MAX_TEXTURE" />
+ </class>
+ <class name="android/renderscript/ProgramFragmentFixedFunction$Builder$EnvMode" since="11">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/ProgramFragmentFixedFunction$Builder$EnvMode;" />
+ <method name="values()[Landroid/renderscript/ProgramFragmentFixedFunction$Builder$EnvMode;" />
+ <field name="DECAL" />
+ <field name="MODULATE" />
+ <field name="REPLACE" />
+ </class>
+ <class name="android/renderscript/ProgramFragmentFixedFunction$Builder$Format" since="11">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/ProgramFragmentFixedFunction$Builder$Format;" />
+ <method name="values()[Landroid/renderscript/ProgramFragmentFixedFunction$Builder$Format;" />
+ <field name="ALPHA" />
+ <field name="LUMINANCE_ALPHA" />
+ <field name="RGB" />
+ <field name="RGBA" />
+ </class>
+ <class name="android/renderscript/ProgramRaster" since="11">
+ <extends name="android/renderscript/BaseObj" />
+ <method name="&lt;init>()V" />
+ <method name="CULL_BACK(Landroid/renderscript/RenderScript;)Landroid/renderscript/ProgramRaster;" />
+ <method name="CULL_FRONT(Landroid/renderscript/RenderScript;)Landroid/renderscript/ProgramRaster;" />
+ <method name="CULL_NONE(Landroid/renderscript/RenderScript;)Landroid/renderscript/ProgramRaster;" />
+ <method name="getCullMode()Landroid/renderscript/ProgramRaster$CullMode;" since="16" />
+ <method name="isPointSpriteEnabled()Z" since="16" />
+ </class>
+ <class name="android/renderscript/ProgramRaster$Builder" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;)V" />
+ <method name="create()Landroid/renderscript/ProgramRaster;" />
+ <method name="setCullMode(Landroid/renderscript/ProgramRaster$CullMode;)Landroid/renderscript/ProgramRaster$Builder;" />
+ <method name="setPointSpriteEnabled(Z)Landroid/renderscript/ProgramRaster$Builder;" />
+ </class>
+ <class name="android/renderscript/ProgramRaster$CullMode" since="11">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/ProgramRaster$CullMode;" />
+ <method name="values()[Landroid/renderscript/ProgramRaster$CullMode;" />
+ <field name="BACK" />
+ <field name="FRONT" />
+ <field name="NONE" />
+ </class>
+ <class name="android/renderscript/ProgramStore" since="11">
+ <extends name="android/renderscript/BaseObj" />
+ <method name="&lt;init>()V" />
+ <method name="BLEND_ALPHA_DEPTH_NONE(Landroid/renderscript/RenderScript;)Landroid/renderscript/ProgramStore;" />
+ <method name="BLEND_ALPHA_DEPTH_TEST(Landroid/renderscript/RenderScript;)Landroid/renderscript/ProgramStore;" />
+ <method name="BLEND_NONE_DEPTH_NONE(Landroid/renderscript/RenderScript;)Landroid/renderscript/ProgramStore;" />
+ <method name="BLEND_NONE_DEPTH_TEST(Landroid/renderscript/RenderScript;)Landroid/renderscript/ProgramStore;" />
+ <method name="getBlendDstFunc()Landroid/renderscript/ProgramStore$BlendDstFunc;" since="16" />
+ <method name="getBlendSrcFunc()Landroid/renderscript/ProgramStore$BlendSrcFunc;" since="16" />
+ <method name="getDepthFunc()Landroid/renderscript/ProgramStore$DepthFunc;" since="16" />
+ <method name="isColorMaskAlphaEnabled()Z" since="16" />
+ <method name="isColorMaskBlueEnabled()Z" since="16" />
+ <method name="isColorMaskGreenEnabled()Z" since="16" />
+ <method name="isColorMaskRedEnabled()Z" since="16" />
+ <method name="isDepthMaskEnabled()Z" since="16" />
+ <method name="isDitherEnabled()Z" since="16" />
+ </class>
+ <class name="android/renderscript/ProgramStore$BlendDstFunc" since="11">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/ProgramStore$BlendDstFunc;" />
+ <method name="values()[Landroid/renderscript/ProgramStore$BlendDstFunc;" />
+ <field name="DST_ALPHA" />
+ <field name="ONE" />
+ <field name="ONE_MINUS_DST_ALPHA" />
+ <field name="ONE_MINUS_SRC_ALPHA" />
+ <field name="ONE_MINUS_SRC_COLOR" />
+ <field name="SRC_ALPHA" />
+ <field name="SRC_COLOR" />
+ <field name="ZERO" />
+ </class>
+ <class name="android/renderscript/ProgramStore$BlendSrcFunc" since="11">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/ProgramStore$BlendSrcFunc;" />
+ <method name="values()[Landroid/renderscript/ProgramStore$BlendSrcFunc;" />
+ <field name="DST_ALPHA" />
+ <field name="DST_COLOR" />
+ <field name="ONE" />
+ <field name="ONE_MINUS_DST_ALPHA" />
+ <field name="ONE_MINUS_DST_COLOR" />
+ <field name="ONE_MINUS_SRC_ALPHA" />
+ <field name="SRC_ALPHA" />
+ <field name="SRC_ALPHA_SATURATE" />
+ <field name="ZERO" />
+ </class>
+ <class name="android/renderscript/ProgramStore$Builder" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;)V" />
+ <method name="create()Landroid/renderscript/ProgramStore;" />
+ <method name="setBlendFunc(Landroid/renderscript/ProgramStore$BlendSrcFunc;Landroid/renderscript/ProgramStore$BlendDstFunc;)Landroid/renderscript/ProgramStore$Builder;" />
+ <method name="setColorMaskEnabled(ZZZZ)Landroid/renderscript/ProgramStore$Builder;" />
+ <method name="setDepthFunc(Landroid/renderscript/ProgramStore$DepthFunc;)Landroid/renderscript/ProgramStore$Builder;" />
+ <method name="setDepthMaskEnabled(Z)Landroid/renderscript/ProgramStore$Builder;" />
+ <method name="setDitherEnabled(Z)Landroid/renderscript/ProgramStore$Builder;" />
+ </class>
+ <class name="android/renderscript/ProgramStore$DepthFunc" since="11">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/ProgramStore$DepthFunc;" />
+ <method name="values()[Landroid/renderscript/ProgramStore$DepthFunc;" />
+ <field name="ALWAYS" />
+ <field name="EQUAL" />
+ <field name="GREATER" />
+ <field name="GREATER_OR_EQUAL" />
+ <field name="LESS" />
+ <field name="LESS_OR_EQUAL" />
+ <field name="NOT_EQUAL" />
+ </class>
+ <class name="android/renderscript/ProgramVertex" since="11">
+ <extends name="android/renderscript/Program" />
+ <method name="&lt;init>()V" />
+ <method name="getInput(I)Landroid/renderscript/Element;" since="16" />
+ <method name="getInputCount()I" since="16" />
+ </class>
+ <class name="android/renderscript/ProgramVertex$Builder" since="11">
+ <extends name="android/renderscript/Program$BaseProgramBuilder" />
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;)V" />
+ <method name="addInput(Landroid/renderscript/Element;)Landroid/renderscript/ProgramVertex$Builder;" />
+ <method name="create()Landroid/renderscript/ProgramVertex;" />
+ </class>
+ <class name="android/renderscript/ProgramVertexFixedFunction" since="11">
+ <extends name="android/renderscript/ProgramVertex" />
+ <method name="&lt;init>()V" />
+ <method name="bindConstants(Landroid/renderscript/ProgramVertexFixedFunction$Constants;)V" />
+ </class>
+ <class name="android/renderscript/ProgramVertexFixedFunction$Builder" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;)V" />
+ <method name="create()Landroid/renderscript/ProgramVertexFixedFunction;" />
+ <method name="setTextureMatrixEnable(Z)Landroid/renderscript/ProgramVertexFixedFunction$Builder;" />
+ </class>
+ <class name="android/renderscript/ProgramVertexFixedFunction$Constants" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;)V" />
+ <method name="destroy()V" />
+ <method name="setModelview(Landroid/renderscript/Matrix4f;)V" />
+ <method name="setProjection(Landroid/renderscript/Matrix4f;)V" />
+ <method name="setTexture(Landroid/renderscript/Matrix4f;)V" />
+ </class>
+ <class name="android/renderscript/RSDriverException" since="11">
+ <extends name="android/renderscript/RSRuntimeException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/renderscript/RSIllegalArgumentException" since="11">
+ <extends name="android/renderscript/RSRuntimeException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/renderscript/RSInvalidStateException" since="11">
+ <extends name="android/renderscript/RSRuntimeException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/renderscript/RSRuntimeException" since="11">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/renderscript/RSSurfaceView" since="11">
+ <extends name="android/view/SurfaceView" />
+ <implements name="android/view/SurfaceHolder$Callback" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="createRenderScriptGL(Landroid/renderscript/RenderScriptGL$SurfaceConfig;)Landroid/renderscript/RenderScriptGL;" />
+ <method name="destroyRenderScriptGL()V" />
+ <method name="getRenderScriptGL()Landroid/renderscript/RenderScriptGL;" />
+ <method name="pause()V" />
+ <method name="resume()V" />
+ <method name="setRenderScriptGL(Landroid/renderscript/RenderScriptGL;)V" />
+ </class>
+ <class name="android/renderscript/RSTextureView" since="14">
+ <extends name="android/view/TextureView" />
+ <implements name="android/view/TextureView$SurfaceTextureListener" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="createRenderScriptGL(Landroid/renderscript/RenderScriptGL$SurfaceConfig;)Landroid/renderscript/RenderScriptGL;" />
+ <method name="destroyRenderScriptGL()V" />
+ <method name="getRenderScriptGL()Landroid/renderscript/RenderScriptGL;" />
+ <method name="pause()V" />
+ <method name="resume()V" />
+ <method name="setRenderScriptGL(Landroid/renderscript/RenderScriptGL;)V" />
+ </class>
+ <class name="android/renderscript/RenderScript" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="contextDump()V" />
+ <method name="create(Landroid/content/Context;)Landroid/renderscript/RenderScript;" />
+ <method name="create(Landroid/content/Context;Landroid/renderscript/RenderScript$ContextType;)Landroid/renderscript/RenderScript;" since="18" />
+ <method name="create(Landroid/content/Context;Landroid/renderscript/RenderScript$ContextType;I)Landroid/renderscript/RenderScript;" since="21" />
+ <method name="destroy()V" />
+ <method name="finish()V" />
+ <method name="getApplicationContext()Landroid/content/Context;" />
+ <method name="getErrorHandler()Landroid/renderscript/RenderScript$RSErrorHandler;" />
+ <method name="getMessageHandler()Landroid/renderscript/RenderScript$RSMessageHandler;" />
+ <method name="sendMessage(I[I)V" since="18" />
+ <method name="setErrorHandler(Landroid/renderscript/RenderScript$RSErrorHandler;)V" />
+ <method name="setMessageHandler(Landroid/renderscript/RenderScript$RSMessageHandler;)V" />
+ <method name="setPriority(Landroid/renderscript/RenderScript$Priority;)V" />
+ <field name="CREATE_FLAG_LOW_LATENCY" since="21" />
+ <field name="CREATE_FLAG_LOW_POWER" since="21" />
+ <field name="CREATE_FLAG_NONE" since="21" />
+ </class>
+ <class name="android/renderscript/RenderScript$ContextType" since="18">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/RenderScript$ContextType;" />
+ <method name="values()[Landroid/renderscript/RenderScript$ContextType;" />
+ <field name="DEBUG" />
+ <field name="NORMAL" />
+ <field name="PROFILE" />
+ </class>
+ <class name="android/renderscript/RenderScript$Priority" since="11">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/RenderScript$Priority;" />
+ <method name="values()[Landroid/renderscript/RenderScript$Priority;" />
+ <field name="LOW" />
+ <field name="NORMAL" />
+ </class>
+ <class name="android/renderscript/RenderScript$RSErrorHandler" since="11">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Runnable" />
+ <method name="&lt;init>()V" />
+ <field name="mErrorMessage" />
+ <field name="mErrorNum" />
+ </class>
+ <class name="android/renderscript/RenderScript$RSMessageHandler" since="11">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Runnable" />
+ <method name="&lt;init>()V" />
+ <field name="mData" />
+ <field name="mID" />
+ <field name="mLength" />
+ </class>
+ <class name="android/renderscript/RenderScriptGL" since="11">
+ <extends name="android/renderscript/RenderScript" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/renderscript/RenderScriptGL$SurfaceConfig;)V" />
+ <method name="bindProgramFragment(Landroid/renderscript/ProgramFragment;)V" />
+ <method name="bindProgramRaster(Landroid/renderscript/ProgramRaster;)V" />
+ <method name="bindProgramStore(Landroid/renderscript/ProgramStore;)V" />
+ <method name="bindProgramVertex(Landroid/renderscript/ProgramVertex;)V" />
+ <method name="bindRootScript(Landroid/renderscript/Script;)V" />
+ <method name="getHeight()I" />
+ <method name="getWidth()I" />
+ <method name="pause()V" />
+ <method name="resume()V" />
+ <method name="setSurface(Landroid/view/SurfaceHolder;II)V" />
+ <method name="setSurfaceTexture(Landroid/graphics/SurfaceTexture;II)V" since="14" />
+ </class>
+ <class name="android/renderscript/RenderScriptGL$SurfaceConfig" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/renderscript/RenderScriptGL$SurfaceConfig;)V" />
+ <method name="setAlpha(II)V" />
+ <method name="setColor(II)V" />
+ <method name="setDepth(II)V" />
+ <method name="setSamples(IIF)V" />
+ </class>
+ <class name="android/renderscript/Sampler" since="11">
+ <extends name="android/renderscript/BaseObj" />
+ <method name="&lt;init>()V" />
+ <method name="CLAMP_LINEAR(Landroid/renderscript/RenderScript;)Landroid/renderscript/Sampler;" />
+ <method name="CLAMP_LINEAR_MIP_LINEAR(Landroid/renderscript/RenderScript;)Landroid/renderscript/Sampler;" />
+ <method name="CLAMP_NEAREST(Landroid/renderscript/RenderScript;)Landroid/renderscript/Sampler;" />
+ <method name="MIRRORED_REPEAT_LINEAR(Landroid/renderscript/RenderScript;)Landroid/renderscript/Sampler;" since="18" />
+ <method name="MIRRORED_REPEAT_LINEAR_MIP_LINEAR(Landroid/renderscript/RenderScript;)Landroid/renderscript/Sampler;" since="18" />
+ <method name="MIRRORED_REPEAT_NEAREST(Landroid/renderscript/RenderScript;)Landroid/renderscript/Sampler;" since="18" />
+ <method name="WRAP_LINEAR(Landroid/renderscript/RenderScript;)Landroid/renderscript/Sampler;" />
+ <method name="WRAP_LINEAR_MIP_LINEAR(Landroid/renderscript/RenderScript;)Landroid/renderscript/Sampler;" />
+ <method name="WRAP_NEAREST(Landroid/renderscript/RenderScript;)Landroid/renderscript/Sampler;" />
+ <method name="getAnisotropy()F" since="16" />
+ <method name="getMagnification()Landroid/renderscript/Sampler$Value;" since="16" />
+ <method name="getMinification()Landroid/renderscript/Sampler$Value;" since="16" />
+ <method name="getWrapS()Landroid/renderscript/Sampler$Value;" since="16" />
+ <method name="getWrapT()Landroid/renderscript/Sampler$Value;" since="16" />
+ </class>
+ <class name="android/renderscript/Sampler$Builder" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;)V" />
+ <method name="create()Landroid/renderscript/Sampler;" />
+ <method name="setAnisotropy(F)V" />
+ <method name="setMagnification(Landroid/renderscript/Sampler$Value;)V" />
+ <method name="setMinification(Landroid/renderscript/Sampler$Value;)V" />
+ <method name="setWrapS(Landroid/renderscript/Sampler$Value;)V" />
+ <method name="setWrapT(Landroid/renderscript/Sampler$Value;)V" />
+ </class>
+ <class name="android/renderscript/Sampler$Value" since="11">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/Sampler$Value;" />
+ <method name="values()[Landroid/renderscript/Sampler$Value;" />
+ <field name="CLAMP" />
+ <field name="LINEAR" />
+ <field name="LINEAR_MIP_LINEAR" />
+ <field name="LINEAR_MIP_NEAREST" />
+ <field name="MIRRORED_REPEAT" since="18" />
+ <field name="NEAREST" />
+ <field name="WRAP" />
+ </class>
+ <class name="android/renderscript/Script" since="11">
+ <extends name="android/renderscript/BaseObj" />
+ <method name="&lt;init>()V" />
+ <method name="bindAllocation(Landroid/renderscript/Allocation;I)V" />
+ <method name="createFieldID(ILandroid/renderscript/Element;)Landroid/renderscript/Script$FieldID;" since="17" />
+ <method name="createKernelID(IILandroid/renderscript/Element;Landroid/renderscript/Element;)Landroid/renderscript/Script$KernelID;" since="17" />
+ <method name="forEach(ILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/FieldPacker;)V" since="14" />
+ <method name="forEach(ILandroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/FieldPacker;Landroid/renderscript/Script$LaunchOptions;)V" since="18" />
+ <method name="getVarB(I)Z" since="18" />
+ <method name="getVarD(I)D" since="18" />
+ <method name="getVarF(I)F" since="18" />
+ <method name="getVarI(I)I" since="18" />
+ <method name="getVarJ(I)J" since="18" />
+ <method name="getVarV(ILandroid/renderscript/FieldPacker;)V" since="18" />
+ <method name="invoke(I)V" />
+ <method name="invoke(ILandroid/renderscript/FieldPacker;)V" />
+ <method name="setTimeZone(Ljava/lang/String;)V" />
+ <method name="setVar(ID)V" />
+ <method name="setVar(IF)V" />
+ <method name="setVar(II)V" />
+ <method name="setVar(IJ)V" />
+ <method name="setVar(ILandroid/renderscript/BaseObj;)V" />
+ <method name="setVar(ILandroid/renderscript/FieldPacker;)V" />
+ <method name="setVar(ILandroid/renderscript/FieldPacker;Landroid/renderscript/Element;[I)V" since="16" />
+ <method name="setVar(IZ)V" />
+ </class>
+ <class name="android/renderscript/Script$Builder" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/renderscript/Script$FieldBase" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getAllocation()Landroid/renderscript/Allocation;" />
+ <method name="getElement()Landroid/renderscript/Element;" />
+ <method name="getType()Landroid/renderscript/Type;" />
+ <method name="init(Landroid/renderscript/RenderScript;I)V" />
+ <method name="init(Landroid/renderscript/RenderScript;II)V" />
+ <method name="updateAllocation()V" />
+ <field name="mAllocation" />
+ <field name="mElement" />
+ </class>
+ <class name="android/renderscript/Script$FieldID" since="17">
+ <extends name="android/renderscript/BaseObj" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/renderscript/Script$KernelID" since="17">
+ <extends name="android/renderscript/BaseObj" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/renderscript/Script$LaunchOptions" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getXEnd()I" />
+ <method name="getXStart()I" />
+ <method name="getYEnd()I" />
+ <method name="getYStart()I" />
+ <method name="getZEnd()I" />
+ <method name="getZStart()I" />
+ <method name="setX(II)Landroid/renderscript/Script$LaunchOptions;" />
+ <method name="setY(II)Landroid/renderscript/Script$LaunchOptions;" />
+ <method name="setZ(II)Landroid/renderscript/Script$LaunchOptions;" />
+ </class>
+ <class name="android/renderscript/ScriptC" since="11">
+ <extends name="android/renderscript/Script" />
+ <method name="&lt;init>(ILandroid/renderscript/RenderScript;)V" />
+ <method name="&lt;init>(JLandroid/renderscript/RenderScript;)V" since="21" />
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;Landroid/content/res/Resources;I)V" />
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;Ljava/lang/String;[B[B)V" since="21" />
+ </class>
+ <class name="android/renderscript/ScriptGroup" since="17">
+ <extends name="android/renderscript/BaseObj" />
+ <method name="&lt;init>()V" />
+ <method name="execute()V" />
+ <method name="setInput(Landroid/renderscript/Script$KernelID;Landroid/renderscript/Allocation;)V" />
+ <method name="setOutput(Landroid/renderscript/Script$KernelID;Landroid/renderscript/Allocation;)V" />
+ </class>
+ <class name="android/renderscript/ScriptGroup$Builder" since="17">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;)V" />
+ <method name="addConnection(Landroid/renderscript/Type;Landroid/renderscript/Script$KernelID;Landroid/renderscript/Script$FieldID;)Landroid/renderscript/ScriptGroup$Builder;" />
+ <method name="addConnection(Landroid/renderscript/Type;Landroid/renderscript/Script$KernelID;Landroid/renderscript/Script$KernelID;)Landroid/renderscript/ScriptGroup$Builder;" />
+ <method name="addKernel(Landroid/renderscript/Script$KernelID;)Landroid/renderscript/ScriptGroup$Builder;" />
+ <method name="create()Landroid/renderscript/ScriptGroup;" />
+ </class>
+ <class name="android/renderscript/ScriptIntrinsic" since="17">
+ <extends name="android/renderscript/Script" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/renderscript/ScriptIntrinsic3DLUT" since="18">
+ <extends name="android/renderscript/ScriptIntrinsic" />
+ <method name="&lt;init>()V" />
+ <method name="create(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)Landroid/renderscript/ScriptIntrinsic3DLUT;" />
+ <method name="forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V" />
+ <method name="forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21" />
+ <method name="getKernelID()Landroid/renderscript/Script$KernelID;" />
+ <method name="setLUT(Landroid/renderscript/Allocation;)V" />
+ </class>
+ <class name="android/renderscript/ScriptIntrinsicBlend" since="17">
+ <extends name="android/renderscript/ScriptIntrinsic" />
+ <method name="&lt;init>()V" />
+ <method name="create(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)Landroid/renderscript/ScriptIntrinsicBlend;" />
+ <method name="forEachAdd(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V" />
+ <method name="forEachAdd(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21" />
+ <method name="forEachClear(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V" />
+ <method name="forEachClear(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21" />
+ <method name="forEachDst(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V" />
+ <method name="forEachDst(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21" />
+ <method name="forEachDstAtop(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V" />
+ <method name="forEachDstAtop(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21" />
+ <method name="forEachDstIn(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V" />
+ <method name="forEachDstIn(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21" />
+ <method name="forEachDstOut(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V" />
+ <method name="forEachDstOut(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21" />
+ <method name="forEachDstOver(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V" />
+ <method name="forEachDstOver(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21" />
+ <method name="forEachMultiply(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V" />
+ <method name="forEachMultiply(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21" />
+ <method name="forEachSrc(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V" />
+ <method name="forEachSrc(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21" />
+ <method name="forEachSrcAtop(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V" />
+ <method name="forEachSrcAtop(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21" />
+ <method name="forEachSrcIn(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V" />
+ <method name="forEachSrcIn(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21" />
+ <method name="forEachSrcOut(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V" />
+ <method name="forEachSrcOut(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21" />
+ <method name="forEachSrcOver(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V" />
+ <method name="forEachSrcOver(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21" />
+ <method name="forEachSubtract(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V" />
+ <method name="forEachSubtract(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21" />
+ <method name="forEachXor(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V" />
+ <method name="forEachXor(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21" />
+ <method name="getKernelIDAdd()Landroid/renderscript/Script$KernelID;" />
+ <method name="getKernelIDClear()Landroid/renderscript/Script$KernelID;" />
+ <method name="getKernelIDDst()Landroid/renderscript/Script$KernelID;" />
+ <method name="getKernelIDDstAtop()Landroid/renderscript/Script$KernelID;" />
+ <method name="getKernelIDDstIn()Landroid/renderscript/Script$KernelID;" />
+ <method name="getKernelIDDstOut()Landroid/renderscript/Script$KernelID;" />
+ <method name="getKernelIDDstOver()Landroid/renderscript/Script$KernelID;" />
+ <method name="getKernelIDMultiply()Landroid/renderscript/Script$KernelID;" />
+ <method name="getKernelIDSrc()Landroid/renderscript/Script$KernelID;" />
+ <method name="getKernelIDSrcAtop()Landroid/renderscript/Script$KernelID;" />
+ <method name="getKernelIDSrcIn()Landroid/renderscript/Script$KernelID;" />
+ <method name="getKernelIDSrcOut()Landroid/renderscript/Script$KernelID;" />
+ <method name="getKernelIDSrcOver()Landroid/renderscript/Script$KernelID;" />
+ <method name="getKernelIDSubtract()Landroid/renderscript/Script$KernelID;" />
+ <method name="getKernelIDXor()Landroid/renderscript/Script$KernelID;" />
+ </class>
+ <class name="android/renderscript/ScriptIntrinsicBlur" since="17">
+ <extends name="android/renderscript/ScriptIntrinsic" />
+ <method name="&lt;init>()V" />
+ <method name="create(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)Landroid/renderscript/ScriptIntrinsicBlur;" />
+ <method name="forEach(Landroid/renderscript/Allocation;)V" />
+ <method name="forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21" />
+ <method name="getFieldID_Input()Landroid/renderscript/Script$FieldID;" />
+ <method name="getKernelID()Landroid/renderscript/Script$KernelID;" />
+ <method name="setInput(Landroid/renderscript/Allocation;)V" />
+ <method name="setRadius(F)V" />
+ </class>
+ <class name="android/renderscript/ScriptIntrinsicColorMatrix" since="17">
+ <extends name="android/renderscript/ScriptIntrinsic" />
+ <method name="&lt;init>()V" />
+ <method name="create(Landroid/renderscript/RenderScript;)Landroid/renderscript/ScriptIntrinsicColorMatrix;" since="19" />
+ <method name="create(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)Landroid/renderscript/ScriptIntrinsicColorMatrix;" />
+ <method name="forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V" />
+ <method name="forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21" />
+ <method name="getKernelID()Landroid/renderscript/Script$KernelID;" />
+ <method name="setAdd(FFFF)V" since="19" />
+ <method name="setAdd(Landroid/renderscript/Float4;)V" since="19" />
+ <method name="setColorMatrix(Landroid/renderscript/Matrix3f;)V" />
+ <method name="setColorMatrix(Landroid/renderscript/Matrix4f;)V" />
+ <method name="setGreyscale()V" />
+ <method name="setRGBtoYUV()V" />
+ <method name="setYUVtoRGB()V" />
+ </class>
+ <class name="android/renderscript/ScriptIntrinsicConvolve3x3" since="17">
+ <extends name="android/renderscript/ScriptIntrinsic" />
+ <method name="&lt;init>()V" />
+ <method name="create(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)Landroid/renderscript/ScriptIntrinsicConvolve3x3;" />
+ <method name="forEach(Landroid/renderscript/Allocation;)V" />
+ <method name="forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21" />
+ <method name="getFieldID_Input()Landroid/renderscript/Script$FieldID;" />
+ <method name="getKernelID()Landroid/renderscript/Script$KernelID;" />
+ <method name="setCoefficients([F)V" />
+ <method name="setInput(Landroid/renderscript/Allocation;)V" />
+ </class>
+ <class name="android/renderscript/ScriptIntrinsicConvolve5x5" since="17">
+ <extends name="android/renderscript/ScriptIntrinsic" />
+ <method name="&lt;init>()V" />
+ <method name="create(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)Landroid/renderscript/ScriptIntrinsicConvolve5x5;" />
+ <method name="forEach(Landroid/renderscript/Allocation;)V" />
+ <method name="forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21" />
+ <method name="getFieldID_Input()Landroid/renderscript/Script$FieldID;" />
+ <method name="getKernelID()Landroid/renderscript/Script$KernelID;" />
+ <method name="setCoefficients([F)V" />
+ <method name="setInput(Landroid/renderscript/Allocation;)V" />
+ </class>
+ <class name="android/renderscript/ScriptIntrinsicHistogram" since="19">
+ <extends name="android/renderscript/ScriptIntrinsic" />
+ <method name="&lt;init>()V" />
+ <method name="create(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)Landroid/renderscript/ScriptIntrinsicHistogram;" />
+ <method name="forEach(Landroid/renderscript/Allocation;)V" />
+ <method name="forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21" />
+ <method name="forEach_Dot(Landroid/renderscript/Allocation;)V" />
+ <method name="forEach_Dot(Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21" />
+ <method name="getFieldID_Input()Landroid/renderscript/Script$FieldID;" />
+ <method name="getKernelID_Separate()Landroid/renderscript/Script$KernelID;" />
+ <method name="setDotCoefficients(FFFF)V" />
+ <method name="setOutput(Landroid/renderscript/Allocation;)V" />
+ </class>
+ <class name="android/renderscript/ScriptIntrinsicLUT" since="17">
+ <extends name="android/renderscript/ScriptIntrinsic" />
+ <method name="&lt;init>()V" />
+ <method name="create(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)Landroid/renderscript/ScriptIntrinsicLUT;" />
+ <method name="forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;)V" />
+ <method name="forEach(Landroid/renderscript/Allocation;Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" since="21" />
+ <method name="getKernelID()Landroid/renderscript/Script$KernelID;" />
+ <method name="setAlpha(II)V" />
+ <method name="setBlue(II)V" />
+ <method name="setGreen(II)V" />
+ <method name="setRed(II)V" />
+ </class>
+ <class name="android/renderscript/ScriptIntrinsicResize" since="20">
+ <extends name="android/renderscript/ScriptIntrinsic" />
+ <method name="&lt;init>()V" />
+ <method name="create(Landroid/renderscript/RenderScript;)Landroid/renderscript/ScriptIntrinsicResize;" />
+ <method name="forEach_bicubic(Landroid/renderscript/Allocation;)V" />
+ <method name="forEach_bicubic(Landroid/renderscript/Allocation;Landroid/renderscript/Script$LaunchOptions;)V" />
+ <method name="getFieldID_Input()Landroid/renderscript/Script$FieldID;" />
+ <method name="getKernelID_bicubic()Landroid/renderscript/Script$KernelID;" />
+ <method name="setInput(Landroid/renderscript/Allocation;)V" />
+ </class>
+ <class name="android/renderscript/ScriptIntrinsicYuvToRGB" since="17">
+ <extends name="android/renderscript/ScriptIntrinsic" />
+ <method name="&lt;init>()V" />
+ <method name="create(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)Landroid/renderscript/ScriptIntrinsicYuvToRGB;" />
+ <method name="forEach(Landroid/renderscript/Allocation;)V" />
+ <method name="getFieldID_Input()Landroid/renderscript/Script$FieldID;" />
+ <method name="getKernelID()Landroid/renderscript/Script$KernelID;" />
+ <method name="setInput(Landroid/renderscript/Allocation;)V" />
+ </class>
+ <class name="android/renderscript/Short2" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(SS)V" since="14" />
+ <field name="x" />
+ <field name="y" />
+ </class>
+ <class name="android/renderscript/Short3" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(SSS)V" since="14" />
+ <field name="x" />
+ <field name="y" />
+ <field name="z" />
+ </class>
+ <class name="android/renderscript/Short4" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(SSSS)V" since="14" />
+ <field name="w" />
+ <field name="x" />
+ <field name="y" />
+ <field name="z" />
+ </class>
+ <class name="android/renderscript/Type" since="11">
+ <extends name="android/renderscript/BaseObj" />
+ <method name="&lt;init>()V" />
+ <method name="createX(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;I)Landroid/renderscript/Type;" since="21" />
+ <method name="createXY(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;II)Landroid/renderscript/Type;" since="21" />
+ <method name="createXYZ(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;III)Landroid/renderscript/Type;" since="21" />
+ <method name="getCount()I" />
+ <method name="getElement()Landroid/renderscript/Element;" />
+ <method name="getX()I" />
+ <method name="getY()I" />
+ <method name="getYuv()I" since="18" />
+ <method name="getZ()I" />
+ <method name="hasFaces()Z" />
+ <method name="hasMipmaps()Z" />
+ </class>
+ <class name="android/renderscript/Type$Builder" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/renderscript/RenderScript;Landroid/renderscript/Element;)V" />
+ <method name="create()Landroid/renderscript/Type;" />
+ <method name="setFaces(Z)Landroid/renderscript/Type$Builder;" />
+ <method name="setMipmaps(Z)Landroid/renderscript/Type$Builder;" />
+ <method name="setX(I)Landroid/renderscript/Type$Builder;" />
+ <method name="setY(I)Landroid/renderscript/Type$Builder;" />
+ <method name="setYuvFormat(I)Landroid/renderscript/Type$Builder;" since="18" />
+ <method name="setZ(I)Landroid/renderscript/Type$Builder;" since="18" />
+ </class>
+ <class name="android/renderscript/Type$CubemapFace" since="11">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/renderscript/Type$CubemapFace;" />
+ <method name="values()[Landroid/renderscript/Type$CubemapFace;" />
+ <field name="NEGATIVE_X" />
+ <field name="NEGATIVE_Y" />
+ <field name="NEGATIVE_Z" />
+ <field name="POSITIVE_X" since="14" />
+ <field name="POSITIVE_Y" since="14" />
+ <field name="POSITIVE_Z" since="14" />
+ <field name="POSITVE_X" />
+ <field name="POSITVE_Y" />
+ <field name="POSITVE_Z" />
+ </class>
+ <class name="android/sax/Element" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getChild(Ljava/lang/String;)Landroid/sax/Element;" />
+ <method name="getChild(Ljava/lang/String;Ljava/lang/String;)Landroid/sax/Element;" />
+ <method name="requireChild(Ljava/lang/String;)Landroid/sax/Element;" />
+ <method name="requireChild(Ljava/lang/String;Ljava/lang/String;)Landroid/sax/Element;" />
+ <method name="setElementListener(Landroid/sax/ElementListener;)V" />
+ <method name="setEndElementListener(Landroid/sax/EndElementListener;)V" />
+ <method name="setEndTextElementListener(Landroid/sax/EndTextElementListener;)V" />
+ <method name="setStartElementListener(Landroid/sax/StartElementListener;)V" />
+ <method name="setTextElementListener(Landroid/sax/TextElementListener;)V" />
+ </class>
+ <class name="android/sax/ElementListener" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/sax/EndElementListener" />
+ <implements name="android/sax/StartElementListener" />
+ </class>
+ <class name="android/sax/EndElementListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="end()V" />
+ </class>
+ <class name="android/sax/EndTextElementListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="end(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/sax/RootElement" since="1">
+ <extends name="android/sax/Element" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="getContentHandler()Lorg/xml/sax/ContentHandler;" />
+ </class>
+ <class name="android/sax/StartElementListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="start(Lorg/xml/sax/Attributes;)V" />
+ </class>
+ <class name="android/sax/TextElementListener" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/sax/EndTextElementListener" />
+ <implements name="android/sax/StartElementListener" />
+ </class>
+ <class name="android/security/KeyChain" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="choosePrivateKeyAlias(Landroid/app/Activity;Landroid/security/KeyChainAliasCallback;[Ljava/lang/String;[Ljava/security/Principal;Ljava/lang/String;ILjava/lang/String;)V" />
+ <method name="createInstallIntent()Landroid/content/Intent;" />
+ <method name="getCertificateChain(Landroid/content/Context;Ljava/lang/String;)[Ljava/security/cert/X509Certificate;" />
+ <method name="getPrivateKey(Landroid/content/Context;Ljava/lang/String;)Ljava/security/PrivateKey;" />
+ <method name="isBoundKeyAlgorithm(Ljava/lang/String;)Z" since="18" />
+ <method name="isKeyAlgorithmSupported(Ljava/lang/String;)Z" since="18" />
+ <field name="ACTION_STORAGE_CHANGED" since="16" />
+ <field name="EXTRA_CERTIFICATE" />
+ <field name="EXTRA_NAME" />
+ <field name="EXTRA_PKCS12" />
+ </class>
+ <class name="android/security/KeyChainAliasCallback" since="14">
+ <extends name="java/lang/Object" />
+ <method name="alias(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/security/KeyChainException" since="14">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="android/security/KeyPairGeneratorSpec" since="18">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/AlgorithmParameterSpec" />
+ <method name="&lt;init>()V" />
+ <method name="getAlgorithmParameterSpec()Ljava/security/spec/AlgorithmParameterSpec;" since="19" />
+ <method name="getContext()Landroid/content/Context;" />
+ <method name="getEndDate()Ljava/util/Date;" />
+ <method name="getKeySize()I" since="19" />
+ <method name="getKeyType()Ljava/lang/String;" since="19" />
+ <method name="getKeystoreAlias()Ljava/lang/String;" />
+ <method name="getSerialNumber()Ljava/math/BigInteger;" />
+ <method name="getStartDate()Ljava/util/Date;" />
+ <method name="getSubjectDN()Ljavax/security/auth/x500/X500Principal;" />
+ <method name="isEncryptionRequired()Z" />
+ </class>
+ <class name="android/security/KeyPairGeneratorSpec$Builder" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="build()Landroid/security/KeyPairGeneratorSpec;" />
+ <method name="setAlgorithmParameterSpec(Ljava/security/spec/AlgorithmParameterSpec;)Landroid/security/KeyPairGeneratorSpec$Builder;" since="19" />
+ <method name="setAlias(Ljava/lang/String;)Landroid/security/KeyPairGeneratorSpec$Builder;" />
+ <method name="setEncryptionRequired()Landroid/security/KeyPairGeneratorSpec$Builder;" />
+ <method name="setEndDate(Ljava/util/Date;)Landroid/security/KeyPairGeneratorSpec$Builder;" />
+ <method name="setKeySize(I)Landroid/security/KeyPairGeneratorSpec$Builder;" since="19" />
+ <method name="setKeyType(Ljava/lang/String;)Landroid/security/KeyPairGeneratorSpec$Builder;" since="19" />
+ <method name="setSerialNumber(Ljava/math/BigInteger;)Landroid/security/KeyPairGeneratorSpec$Builder;" />
+ <method name="setStartDate(Ljava/util/Date;)Landroid/security/KeyPairGeneratorSpec$Builder;" />
+ <method name="setSubject(Ljavax/security/auth/x500/X500Principal;)Landroid/security/KeyPairGeneratorSpec$Builder;" />
+ </class>
+ <class name="android/security/KeyStoreParameter" since="18">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/KeyStore$ProtectionParameter" />
+ <method name="&lt;init>()V" />
+ <method name="isEncryptionRequired()Z" />
+ </class>
+ <class name="android/security/KeyStoreParameter$Builder" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="build()Landroid/security/KeyStoreParameter;" />
+ <method name="setEncryptionRequired(Z)Landroid/security/KeyStoreParameter$Builder;" />
+ </class>
+ <class name="android/service/dreams/DreamService" since="17">
+ <extends name="android/app/Service" />
+ <implements name="android/view/Window$Callback" />
+ <method name="&lt;init>()V" />
+ <method name="addContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V" />
+ <method name="findViewById(I)Landroid/view/View;" />
+ <method name="finish()V" />
+ <method name="getWindow()Landroid/view/Window;" />
+ <method name="getWindowManager()Landroid/view/WindowManager;" />
+ <method name="isFullscreen()Z" />
+ <method name="isInteractive()Z" />
+ <method name="isScreenBright()Z" />
+ <method name="onDreamingStarted()V" />
+ <method name="onDreamingStopped()V" />
+ <method name="onWakeUp()V" since="21" />
+ <method name="setContentView(I)V" />
+ <method name="setContentView(Landroid/view/View;)V" />
+ <method name="setContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V" />
+ <method name="setFullscreen(Z)V" />
+ <method name="setInteractive(Z)V" />
+ <method name="setScreenBright(Z)V" />
+ <method name="wakeUp()V" since="21" />
+ <field name="DREAM_META_DATA" />
+ <field name="SERVICE_INTERFACE" />
+ </class>
+ <class name="android/service/media/MediaBrowserService" since="21">
+ <extends name="android/app/Service" />
+ <method name="&lt;init>()V" />
+ <method name="getSessionToken()Landroid/media/session/MediaSession$Token;" />
+ <method name="notifyChildrenChanged(Ljava/lang/String;)V" />
+ <method name="onGetRoot(Ljava/lang/String;ILandroid/os/Bundle;)Landroid/service/media/MediaBrowserService$BrowserRoot;" />
+ <method name="onLoadChildren(Ljava/lang/String;Landroid/service/media/MediaBrowserService$Result;)V" />
+ <method name="setSessionToken(Landroid/media/session/MediaSession$Token;)V" />
+ <field name="SERVICE_INTERFACE" />
+ </class>
+ <class name="android/service/media/MediaBrowserService$BrowserRoot" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;Landroid/os/Bundle;)V" />
+ <method name="getExtras()Landroid/os/Bundle;" />
+ <method name="getRootId()Ljava/lang/String;" />
+ </class>
+ <class name="android/service/media/MediaBrowserService$Result" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/service/media/MediaBrowserService;)V" />
+ <method name="detach()V" />
+ <method name="sendResult(Ljava/lang/Object;)V" />
+ </class>
+ <class name="android/service/notification/NotificationListenerService" since="18">
+ <extends name="android/app/Service" />
+ <method name="&lt;init>()V" />
+ <method name="cancelAllNotifications()V" />
+ <method name="cancelNotification(Ljava/lang/String;)V" since="21" />
+ <method name="cancelNotification(Ljava/lang/String;Ljava/lang/String;I)V" />
+ <method name="cancelNotifications([Ljava/lang/String;)V" since="21" />
+ <method name="getActiveNotifications()[Landroid/service/notification/StatusBarNotification;" />
+ <method name="getActiveNotifications([Ljava/lang/String;)[Landroid/service/notification/StatusBarNotification;" since="21" />
+ <method name="getCurrentInterruptionFilter()I" since="21" />
+ <method name="getCurrentListenerHints()I" since="21" />
+ <method name="getCurrentRanking()Landroid/service/notification/NotificationListenerService$RankingMap;" since="21" />
+ <method name="onInterruptionFilterChanged(I)V" since="21" />
+ <method name="onListenerConnected()V" since="21" />
+ <method name="onListenerHintsChanged(I)V" since="21" />
+ <method name="onNotificationPosted(Landroid/service/notification/StatusBarNotification;)V" />
+ <method name="onNotificationPosted(Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationListenerService$RankingMap;)V" since="21" />
+ <method name="onNotificationRankingUpdate(Landroid/service/notification/NotificationListenerService$RankingMap;)V" since="21" />
+ <method name="onNotificationRemoved(Landroid/service/notification/StatusBarNotification;)V" />
+ <method name="onNotificationRemoved(Landroid/service/notification/StatusBarNotification;Landroid/service/notification/NotificationListenerService$RankingMap;)V" since="21" />
+ <method name="requestInterruptionFilter(I)V" since="21" />
+ <method name="requestListenerHints(I)V" since="21" />
+ <field name="HINT_HOST_DISABLE_EFFECTS" since="21" />
+ <field name="INTERRUPTION_FILTER_ALL" since="21" />
+ <field name="INTERRUPTION_FILTER_NONE" since="21" />
+ <field name="INTERRUPTION_FILTER_PRIORITY" since="21" />
+ <field name="SERVICE_INTERFACE" />
+ </class>
+ <class name="android/service/notification/NotificationListenerService$Ranking" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getKey()Ljava/lang/String;" />
+ <method name="getRank()I" />
+ <method name="isAmbient()Z" />
+ <method name="matchesInterruptionFilter()Z" />
+ </class>
+ <class name="android/service/notification/NotificationListenerService$RankingMap" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getOrderedKeys()[Ljava/lang/String;" />
+ <method name="getRanking(Ljava/lang/String;Landroid/service/notification/NotificationListenerService$Ranking;)Z" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/service/notification/StatusBarNotification" since="18">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;IIILandroid/app/Notification;Landroid/os/UserHandle;J)V" />
+ <method name="clone()Landroid/service/notification/StatusBarNotification;" />
+ <method name="getGroupKey()Ljava/lang/String;" since="21" />
+ <method name="getId()I" />
+ <method name="getKey()Ljava/lang/String;" since="20" />
+ <method name="getNotification()Landroid/app/Notification;" />
+ <method name="getPackageName()Ljava/lang/String;" />
+ <method name="getPostTime()J" />
+ <method name="getTag()Ljava/lang/String;" />
+ <method name="getUser()Landroid/os/UserHandle;" since="21" />
+ <method name="getUserId()I" />
+ <method name="isClearable()Z" />
+ <method name="isOngoing()Z" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/service/restrictions/RestrictionsReceiver" since="21">
+ <extends name="android/content/BroadcastReceiver" />
+ <method name="&lt;init>()V" />
+ <method name="onRequestPermission(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/PersistableBundle;)V" />
+ </class>
+ <class name="android/service/textservice/SpellCheckerService" since="14">
+ <extends name="android/app/Service" />
+ <method name="&lt;init>()V" />
+ <method name="createSession()Landroid/service/textservice/SpellCheckerService$Session;" />
+ <field name="SERVICE_INTERFACE" />
+ </class>
+ <class name="android/service/textservice/SpellCheckerService$Session" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getBundle()Landroid/os/Bundle;" />
+ <method name="getLocale()Ljava/lang/String;" />
+ <method name="onCancel()V" />
+ <method name="onClose()V" since="15" />
+ <method name="onCreate()V" />
+ <method name="onGetSentenceSuggestionsMultiple([Landroid/view/textservice/TextInfo;I)[Landroid/view/textservice/SentenceSuggestionsInfo;" since="16" />
+ <method name="onGetSuggestions(Landroid/view/textservice/TextInfo;I)Landroid/view/textservice/SuggestionsInfo;" />
+ <method name="onGetSuggestionsMultiple([Landroid/view/textservice/TextInfo;IZ)[Landroid/view/textservice/SuggestionsInfo;" />
+ </class>
+ <class name="android/service/voice/AlwaysOnHotwordDetector" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="createEnrollIntent()Landroid/content/Intent;" />
+ <method name="createReEnrollIntent()Landroid/content/Intent;" />
+ <method name="createUnEnrollIntent()Landroid/content/Intent;" />
+ <method name="getSupportedRecognitionModes()I" />
+ <method name="startRecognition(I)Z" />
+ <method name="stopRecognition()Z" />
+ <field name="RECOGNITION_FLAG_ALLOW_MULTIPLE_TRIGGERS" />
+ <field name="RECOGNITION_FLAG_CAPTURE_TRIGGER_AUDIO" />
+ <field name="RECOGNITION_MODE_USER_IDENTIFICATION" />
+ <field name="RECOGNITION_MODE_VOICE_TRIGGER" />
+ <field name="STATE_HARDWARE_UNAVAILABLE" />
+ <field name="STATE_KEYPHRASE_ENROLLED" />
+ <field name="STATE_KEYPHRASE_UNENROLLED" />
+ <field name="STATE_KEYPHRASE_UNSUPPORTED" />
+ </class>
+ <class name="android/service/voice/AlwaysOnHotwordDetector$Callback" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onAvailabilityChanged(I)V" />
+ <method name="onDetected(Landroid/service/voice/AlwaysOnHotwordDetector$EventPayload;)V" />
+ <method name="onError()V" />
+ <method name="onRecognitionPaused()V" />
+ <method name="onRecognitionResumed()V" />
+ </class>
+ <class name="android/service/voice/AlwaysOnHotwordDetector$EventPayload" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getCaptureAudioFormat()Landroid/media/AudioFormat;" />
+ <method name="getTriggerAudio()[B" />
+ </class>
+ <class name="android/service/voice/VoiceInteractionService" since="21">
+ <extends name="android/app/Service" />
+ <method name="&lt;init>()V" />
+ <method name="createAlwaysOnHotwordDetector(Ljava/lang/String;Ljava/util/Locale;Landroid/service/voice/AlwaysOnHotwordDetector$Callback;)Landroid/service/voice/AlwaysOnHotwordDetector;" />
+ <method name="isActiveService(Landroid/content/Context;Landroid/content/ComponentName;)Z" />
+ <method name="onReady()V" />
+ <method name="onShutdown()V" />
+ <method name="startSession(Landroid/os/Bundle;)V" />
+ <field name="SERVICE_INTERFACE" />
+ <field name="SERVICE_META_DATA" />
+ </class>
+ <class name="android/service/voice/VoiceInteractionSession" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/KeyEvent$Callback" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/os/Handler;)V" />
+ <method name="finish()V" />
+ <method name="onCloseSystemDialogs()V" />
+ <method name="onCreate(Landroid/os/Bundle;)V" />
+ <method name="onDestroy()V" />
+ <method name="setContentView(Landroid/view/View;)V" />
+ </class>
+ <class name="android/service/voice/VoiceInteractionSessionService" since="21">
+ <extends name="android/app/Service" />
+ <method name="&lt;init>()V" />
+ <method name="onNewSession(Landroid/os/Bundle;)Landroid/service/voice/VoiceInteractionSession;" />
+ </class>
+ <class name="android/service/wallpaper/WallpaperService" since="7">
+ <extends name="android/app/Service" />
+ <method name="&lt;init>()V" />
+ <method name="onCreateEngine()Landroid/service/wallpaper/WallpaperService$Engine;" />
+ <field name="SERVICE_INTERFACE" />
+ <field name="SERVICE_META_DATA" />
+ </class>
+ <class name="android/service/wallpaper/WallpaperService$Engine" since="7">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/service/wallpaper/WallpaperService;)V" />
+ <method name="dump(Ljava/lang/String;Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V" since="14" />
+ <method name="getDesiredMinimumHeight()I" />
+ <method name="getDesiredMinimumWidth()I" />
+ <method name="getSurfaceHolder()Landroid/view/SurfaceHolder;" />
+ <method name="isPreview()Z" />
+ <method name="isVisible()Z" />
+ <method name="onApplyWindowInsets(Landroid/view/WindowInsets;)V" since="21" />
+ <method name="onCommand(Ljava/lang/String;IIILandroid/os/Bundle;Z)Landroid/os/Bundle;" />
+ <method name="onCreate(Landroid/view/SurfaceHolder;)V" />
+ <method name="onDesiredSizeChanged(II)V" />
+ <method name="onDestroy()V" />
+ <method name="onOffsetsChanged(FFFFII)V" />
+ <method name="onSurfaceChanged(Landroid/view/SurfaceHolder;III)V" />
+ <method name="onSurfaceCreated(Landroid/view/SurfaceHolder;)V" />
+ <method name="onSurfaceDestroyed(Landroid/view/SurfaceHolder;)V" />
+ <method name="onSurfaceRedrawNeeded(Landroid/view/SurfaceHolder;)V" since="9" />
+ <method name="onTouchEvent(Landroid/view/MotionEvent;)V" />
+ <method name="onVisibilityChanged(Z)V" />
+ <method name="setOffsetNotificationsEnabled(Z)V" since="15" />
+ <method name="setTouchEventsEnabled(Z)V" />
+ </class>
+ <class name="android/speech/RecognitionListener" since="8">
+ <extends name="java/lang/Object" />
+ <method name="onBeginningOfSpeech()V" />
+ <method name="onBufferReceived([B)V" />
+ <method name="onEndOfSpeech()V" />
+ <method name="onError(I)V" />
+ <method name="onEvent(ILandroid/os/Bundle;)V" />
+ <method name="onPartialResults(Landroid/os/Bundle;)V" />
+ <method name="onReadyForSpeech(Landroid/os/Bundle;)V" />
+ <method name="onResults(Landroid/os/Bundle;)V" />
+ <method name="onRmsChanged(F)V" />
+ </class>
+ <class name="android/speech/RecognitionService" since="8">
+ <extends name="android/app/Service" />
+ <method name="&lt;init>()V" />
+ <method name="onCancel(Landroid/speech/RecognitionService$Callback;)V" />
+ <method name="onStartListening(Landroid/content/Intent;Landroid/speech/RecognitionService$Callback;)V" />
+ <method name="onStopListening(Landroid/speech/RecognitionService$Callback;)V" />
+ <field name="SERVICE_INTERFACE" />
+ <field name="SERVICE_META_DATA" />
+ </class>
+ <class name="android/speech/RecognitionService$Callback" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/speech/RecognitionService;)V" />
+ <method name="beginningOfSpeech()V" />
+ <method name="bufferReceived([B)V" />
+ <method name="endOfSpeech()V" />
+ <method name="error(I)V" />
+ <method name="partialResults(Landroid/os/Bundle;)V" />
+ <method name="readyForSpeech(Landroid/os/Bundle;)V" />
+ <method name="results(Landroid/os/Bundle;)V" />
+ <method name="rmsChanged(F)V" />
+ </class>
+ <class name="android/speech/RecognizerIntent" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getVoiceDetailsIntent(Landroid/content/Context;)Landroid/content/Intent;" since="8" />
+ <field name="ACTION_GET_LANGUAGE_DETAILS" since="8" />
+ <field name="ACTION_RECOGNIZE_SPEECH" />
+ <field name="ACTION_VOICE_SEARCH_HANDS_FREE" since="16" />
+ <field name="ACTION_WEB_SEARCH" />
+ <field name="DETAILS_META_DATA" since="8" />
+ <field name="EXTRA_CALLING_PACKAGE" since="8" />
+ <field name="EXTRA_CONFIDENCE_SCORES" since="14" />
+ <field name="EXTRA_LANGUAGE" />
+ <field name="EXTRA_LANGUAGE_MODEL" />
+ <field name="EXTRA_LANGUAGE_PREFERENCE" since="8" />
+ <field name="EXTRA_MAX_RESULTS" />
+ <field name="EXTRA_ONLY_RETURN_LANGUAGE_PREFERENCE" since="8" />
+ <field name="EXTRA_ORIGIN" since="14" />
+ <field name="EXTRA_PARTIAL_RESULTS" since="8" />
+ <field name="EXTRA_PROMPT" />
+ <field name="EXTRA_RESULTS" />
+ <field name="EXTRA_RESULTS_PENDINGINTENT" />
+ <field name="EXTRA_RESULTS_PENDINGINTENT_BUNDLE" />
+ <field name="EXTRA_SECURE" since="16" />
+ <field name="EXTRA_SPEECH_INPUT_COMPLETE_SILENCE_LENGTH_MILLIS" since="8" />
+ <field name="EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS" since="8" />
+ <field name="EXTRA_SPEECH_INPUT_POSSIBLY_COMPLETE_SILENCE_LENGTH_MILLIS" since="8" />
+ <field name="EXTRA_SUPPORTED_LANGUAGES" since="8" />
+ <field name="EXTRA_WEB_SEARCH_ONLY" since="11" />
+ <field name="LANGUAGE_MODEL_FREE_FORM" />
+ <field name="LANGUAGE_MODEL_WEB_SEARCH" />
+ <field name="RESULT_AUDIO_ERROR" />
+ <field name="RESULT_CLIENT_ERROR" />
+ <field name="RESULT_NETWORK_ERROR" />
+ <field name="RESULT_NO_MATCH" />
+ <field name="RESULT_SERVER_ERROR" />
+ </class>
+ <class name="android/speech/RecognizerResultsIntent" since="10">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="ACTION_VOICE_SEARCH_RESULTS" />
+ <field name="EXTRA_VOICE_SEARCH_RESULT_HTML" />
+ <field name="EXTRA_VOICE_SEARCH_RESULT_HTML_BASE_URLS" />
+ <field name="EXTRA_VOICE_SEARCH_RESULT_HTTP_HEADERS" />
+ <field name="EXTRA_VOICE_SEARCH_RESULT_STRINGS" />
+ <field name="EXTRA_VOICE_SEARCH_RESULT_URLS" />
+ <field name="URI_SCHEME_INLINE" />
+ </class>
+ <class name="android/speech/SpeechRecognizer" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="cancel()V" />
+ <method name="createSpeechRecognizer(Landroid/content/Context;)Landroid/speech/SpeechRecognizer;" />
+ <method name="createSpeechRecognizer(Landroid/content/Context;Landroid/content/ComponentName;)Landroid/speech/SpeechRecognizer;" />
+ <method name="destroy()V" />
+ <method name="isRecognitionAvailable(Landroid/content/Context;)Z" />
+ <method name="setRecognitionListener(Landroid/speech/RecognitionListener;)V" />
+ <method name="startListening(Landroid/content/Intent;)V" />
+ <method name="stopListening()V" />
+ <field name="CONFIDENCE_SCORES" since="14" />
+ <field name="ERROR_AUDIO" />
+ <field name="ERROR_CLIENT" />
+ <field name="ERROR_INSUFFICIENT_PERMISSIONS" />
+ <field name="ERROR_NETWORK" />
+ <field name="ERROR_NETWORK_TIMEOUT" />
+ <field name="ERROR_NO_MATCH" />
+ <field name="ERROR_RECOGNIZER_BUSY" />
+ <field name="ERROR_SERVER" />
+ <field name="ERROR_SPEECH_TIMEOUT" />
+ <field name="RESULTS_RECOGNITION" />
+ </class>
+ <class name="android/speech/tts/SynthesisCallback" since="14">
+ <extends name="java/lang/Object" />
+ <method name="audioAvailable([BII)I" />
+ <method name="done()I" />
+ <method name="error()V" />
+ <method name="error(I)V" since="21" />
+ <method name="getMaxBufferSize()I" />
+ <method name="hasFinished()Z" since="21" />
+ <method name="hasStarted()Z" since="21" />
+ <method name="start(III)I" />
+ </class>
+ <class name="android/speech/tts/SynthesisRequest" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/CharSequence;Landroid/os/Bundle;)V" since="21" />
+ <method name="&lt;init>(Ljava/lang/String;Landroid/os/Bundle;)V" />
+ <method name="getCallerUid()I" since="19" />
+ <method name="getCharSequenceText()Ljava/lang/CharSequence;" since="21" />
+ <method name="getCountry()Ljava/lang/String;" />
+ <method name="getLanguage()Ljava/lang/String;" />
+ <method name="getParams()Landroid/os/Bundle;" />
+ <method name="getPitch()I" />
+ <method name="getSpeechRate()I" />
+ <method name="getText()Ljava/lang/String;" />
+ <method name="getVariant()Ljava/lang/String;" />
+ <method name="getVoiceName()Ljava/lang/String;" since="21" />
+ </class>
+ <class name="android/speech/tts/TextToSpeech" since="4">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/speech/tts/TextToSpeech$OnInitListener;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/speech/tts/TextToSpeech$OnInitListener;Ljava/lang/String;)V" since="14" />
+ <method name="addEarcon(Ljava/lang/String;Ljava/io/File;)I" since="21" />
+ <method name="addEarcon(Ljava/lang/String;Ljava/lang/String;)I" />
+ <method name="addEarcon(Ljava/lang/String;Ljava/lang/String;I)I" />
+ <method name="addSpeech(Ljava/lang/CharSequence;Ljava/io/File;)I" since="21" />
+ <method name="addSpeech(Ljava/lang/CharSequence;Ljava/lang/String;I)I" since="21" />
+ <method name="addSpeech(Ljava/lang/String;Ljava/lang/String;)I" />
+ <method name="addSpeech(Ljava/lang/String;Ljava/lang/String;I)I" />
+ <method name="areDefaultsEnforced()Z" since="8" />
+ <method name="getAvailableLanguages()Ljava/util/Set;" since="21" />
+ <method name="getDefaultEngine()Ljava/lang/String;" since="8" />
+ <method name="getDefaultLanguage()Ljava/util/Locale;" since="18" />
+ <method name="getDefaultVoice()Landroid/speech/tts/Voice;" since="21" />
+ <method name="getEngines()Ljava/util/List;" since="14" />
+ <method name="getFeatures(Ljava/util/Locale;)Ljava/util/Set;" since="15" />
+ <method name="getLanguage()Ljava/util/Locale;" />
+ <method name="getMaxSpeechInputLength()I" since="18" />
+ <method name="getVoice()Landroid/speech/tts/Voice;" since="21" />
+ <method name="getVoices()Ljava/util/Set;" since="21" />
+ <method name="isLanguageAvailable(Ljava/util/Locale;)I" />
+ <method name="isSpeaking()Z" />
+ <method name="playEarcon(Ljava/lang/String;ILandroid/os/Bundle;Ljava/lang/String;)I" since="21" />
+ <method name="playEarcon(Ljava/lang/String;ILjava/util/HashMap;)I" />
+ <method name="playSilence(JILjava/util/HashMap;)I" />
+ <method name="playSilentUtterance(JILjava/lang/String;)I" since="21" />
+ <method name="setAudioAttributes(Landroid/media/AudioAttributes;)I" since="21" />
+ <method name="setEngineByPackageName(Ljava/lang/String;)I" since="8" />
+ <method name="setLanguage(Ljava/util/Locale;)I" />
+ <method name="setOnUtteranceCompletedListener(Landroid/speech/tts/TextToSpeech$OnUtteranceCompletedListener;)I" />
+ <method name="setOnUtteranceProgressListener(Landroid/speech/tts/UtteranceProgressListener;)I" since="15" />
+ <method name="setPitch(F)I" />
+ <method name="setSpeechRate(F)I" />
+ <method name="setVoice(Landroid/speech/tts/Voice;)I" since="21" />
+ <method name="shutdown()V" />
+ <method name="speak(Ljava/lang/CharSequence;ILandroid/os/Bundle;Ljava/lang/String;)I" since="21" />
+ <method name="speak(Ljava/lang/String;ILjava/util/HashMap;)I" />
+ <method name="stop()I" />
+ <method name="synthesizeToFile(Ljava/lang/CharSequence;Landroid/os/Bundle;Ljava/io/File;Ljava/lang/String;)I" since="21" />
+ <method name="synthesizeToFile(Ljava/lang/String;Ljava/util/HashMap;Ljava/lang/String;)I" />
+ <field name="ACTION_TTS_QUEUE_PROCESSING_COMPLETED" />
+ <field name="ERROR" />
+ <field name="ERROR_INVALID_REQUEST" since="21" />
+ <field name="ERROR_NETWORK" since="21" />
+ <field name="ERROR_NETWORK_TIMEOUT" since="21" />
+ <field name="ERROR_NOT_INSTALLED_YET" since="21" />
+ <field name="ERROR_OUTPUT" since="21" />
+ <field name="ERROR_SERVICE" since="21" />
+ <field name="ERROR_SYNTHESIS" since="21" />
+ <field name="LANG_AVAILABLE" />
+ <field name="LANG_COUNTRY_AVAILABLE" />
+ <field name="LANG_COUNTRY_VAR_AVAILABLE" />
+ <field name="LANG_MISSING_DATA" />
+ <field name="LANG_NOT_SUPPORTED" />
+ <field name="QUEUE_ADD" />
+ <field name="QUEUE_FLUSH" />
+ <field name="STOPPED" since="21" />
+ <field name="SUCCESS" />
+ </class>
+ <class name="android/speech/tts/TextToSpeech$Engine" since="4">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/speech/tts/TextToSpeech;)V" />
+ <field name="ACTION_CHECK_TTS_DATA" />
+ <field name="ACTION_GET_SAMPLE_TEXT" since="18" />
+ <field name="ACTION_INSTALL_TTS_DATA" />
+ <field name="ACTION_TTS_DATA_INSTALLED" />
+ <field name="CHECK_VOICE_DATA_BAD_DATA" />
+ <field name="CHECK_VOICE_DATA_FAIL" />
+ <field name="CHECK_VOICE_DATA_MISSING_DATA" />
+ <field name="CHECK_VOICE_DATA_MISSING_VOLUME" />
+ <field name="CHECK_VOICE_DATA_PASS" />
+ <field name="DEFAULT_STREAM" />
+ <field name="EXTRA_AVAILABLE_VOICES" since="8" />
+ <field name="EXTRA_CHECK_VOICE_DATA_FOR" since="8" />
+ <field name="EXTRA_SAMPLE_TEXT" since="18" />
+ <field name="EXTRA_TTS_DATA_INSTALLED" />
+ <field name="EXTRA_UNAVAILABLE_VOICES" since="8" />
+ <field name="EXTRA_VOICE_DATA_FILES" />
+ <field name="EXTRA_VOICE_DATA_FILES_INFO" />
+ <field name="EXTRA_VOICE_DATA_ROOT_DIRECTORY" />
+ <field name="INTENT_ACTION_TTS_SERVICE" since="14" />
+ <field name="KEY_FEATURE_EMBEDDED_SYNTHESIS" since="15" />
+ <field name="KEY_FEATURE_NETWORK_RETRIES_COUNT" since="21" />
+ <field name="KEY_FEATURE_NETWORK_SYNTHESIS" since="15" />
+ <field name="KEY_FEATURE_NETWORK_TIMEOUT_MS" since="21" />
+ <field name="KEY_FEATURE_NOT_INSTALLED" since="21" />
+ <field name="KEY_PARAM_PAN" since="11" />
+ <field name="KEY_PARAM_SESSION_ID" since="21" />
+ <field name="KEY_PARAM_STREAM" />
+ <field name="KEY_PARAM_UTTERANCE_ID" />
+ <field name="KEY_PARAM_VOLUME" since="11" />
+ <field name="SERVICE_META_DATA" since="14" />
+ </class>
+ <class name="android/speech/tts/TextToSpeech$EngineInfo" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="icon" />
+ <field name="label" />
+ <field name="name" />
+ </class>
+ <class name="android/speech/tts/TextToSpeech$OnInitListener" since="4">
+ <extends name="java/lang/Object" />
+ <method name="onInit(I)V" />
+ </class>
+ <class name="android/speech/tts/TextToSpeech$OnUtteranceCompletedListener" since="4">
+ <extends name="java/lang/Object" />
+ <method name="onUtteranceCompleted(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/speech/tts/TextToSpeechService" since="14">
+ <extends name="android/app/Service" />
+ <method name="&lt;init>()V" />
+ <method name="onGetDefaultVoiceNameFor(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" since="21" />
+ <method name="onGetFeaturesForLanguage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/util/Set;" since="15" />
+ <method name="onGetLanguage()[Ljava/lang/String;" />
+ <method name="onGetVoices()Ljava/util/List;" since="21" />
+ <method name="onIsLanguageAvailable(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I" />
+ <method name="onIsValidVoiceName(Ljava/lang/String;)I" since="21" />
+ <method name="onLoadLanguage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I" />
+ <method name="onLoadVoice(Ljava/lang/String;)I" since="21" />
+ <method name="onStop()V" />
+ <method name="onSynthesizeText(Landroid/speech/tts/SynthesisRequest;Landroid/speech/tts/SynthesisCallback;)V" />
+ </class>
+ <class name="android/speech/tts/UtteranceProgressListener" since="15">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onDone(Ljava/lang/String;)V" />
+ <method name="onError(Ljava/lang/String;)V" />
+ <method name="onError(Ljava/lang/String;I)V" since="21" />
+ <method name="onStart(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/speech/tts/Voice" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/util/Locale;IIZLjava/util/Set;)V" />
+ <method name="getFeatures()Ljava/util/Set;" />
+ <method name="getLatency()I" />
+ <method name="getLocale()Ljava/util/Locale;" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getQuality()I" />
+ <method name="isNetworkConnectionRequired()Z" />
+ <field name="CREATOR" />
+ <field name="LATENCY_HIGH" />
+ <field name="LATENCY_LOW" />
+ <field name="LATENCY_NORMAL" />
+ <field name="LATENCY_VERY_HIGH" />
+ <field name="LATENCY_VERY_LOW" />
+ <field name="QUALITY_HIGH" />
+ <field name="QUALITY_LOW" />
+ <field name="QUALITY_NORMAL" />
+ <field name="QUALITY_VERY_HIGH" />
+ <field name="QUALITY_VERY_LOW" />
+ </class>
+ <class name="android/system/ErrnoException" since="21">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>(Ljava/lang/String;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;ILjava/lang/Throwable;)V" />
+ <field name="errno" />
+ </class>
+ <class name="android/system/Os" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="accept(Ljava/io/FileDescriptor;Ljava/net/InetSocketAddress;)Ljava/io/FileDescriptor;" />
+ <method name="access(Ljava/lang/String;I)Z" />
+ <method name="bind(Ljava/io/FileDescriptor;Ljava/net/InetAddress;I)V" />
+ <method name="chmod(Ljava/lang/String;I)V" />
+ <method name="chown(Ljava/lang/String;II)V" />
+ <method name="close(Ljava/io/FileDescriptor;)V" />
+ <method name="connect(Ljava/io/FileDescriptor;Ljava/net/InetAddress;I)V" />
+ <method name="dup(Ljava/io/FileDescriptor;)Ljava/io/FileDescriptor;" />
+ <method name="dup2(Ljava/io/FileDescriptor;I)Ljava/io/FileDescriptor;" />
+ <method name="environ()[Ljava/lang/String;" />
+ <method name="execv(Ljava/lang/String;[Ljava/lang/String;)V" />
+ <method name="execve(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;)V" />
+ <method name="fchmod(Ljava/io/FileDescriptor;I)V" />
+ <method name="fchown(Ljava/io/FileDescriptor;II)V" />
+ <method name="fdatasync(Ljava/io/FileDescriptor;)V" />
+ <method name="fstat(Ljava/io/FileDescriptor;)Landroid/system/StructStat;" />
+ <method name="fstatvfs(Ljava/io/FileDescriptor;)Landroid/system/StructStatVfs;" />
+ <method name="fsync(Ljava/io/FileDescriptor;)V" />
+ <method name="ftruncate(Ljava/io/FileDescriptor;J)V" />
+ <method name="gai_strerror(I)Ljava/lang/String;" />
+ <method name="getegid()I" />
+ <method name="getenv(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="geteuid()I" />
+ <method name="getgid()I" />
+ <method name="getpeername(Ljava/io/FileDescriptor;)Ljava/net/SocketAddress;" />
+ <method name="getpid()I" />
+ <method name="getppid()I" />
+ <method name="getsockname(Ljava/io/FileDescriptor;)Ljava/net/SocketAddress;" />
+ <method name="gettid()I" />
+ <method name="getuid()I" />
+ <method name="if_indextoname(I)Ljava/lang/String;" />
+ <method name="inet_pton(ILjava/lang/String;)Ljava/net/InetAddress;" />
+ <method name="isatty(Ljava/io/FileDescriptor;)Z" />
+ <method name="kill(II)V" />
+ <method name="lchown(Ljava/lang/String;II)V" />
+ <method name="link(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="listen(Ljava/io/FileDescriptor;I)V" />
+ <method name="lseek(Ljava/io/FileDescriptor;JI)J" />
+ <method name="lstat(Ljava/lang/String;)Landroid/system/StructStat;" />
+ <method name="mincore(JJ[B)V" />
+ <method name="mkdir(Ljava/lang/String;I)V" />
+ <method name="mkfifo(Ljava/lang/String;I)V" />
+ <method name="mlock(JJ)V" />
+ <method name="mmap(JJIILjava/io/FileDescriptor;J)J" />
+ <method name="msync(JJI)V" />
+ <method name="munlock(JJ)V" />
+ <method name="munmap(JJ)V" />
+ <method name="open(Ljava/lang/String;II)Ljava/io/FileDescriptor;" />
+ <method name="pipe()[Ljava/io/FileDescriptor;" />
+ <method name="poll([Landroid/system/StructPollfd;I)I" />
+ <method name="posix_fallocate(Ljava/io/FileDescriptor;JJ)V" />
+ <method name="prctl(IJJJJ)I" />
+ <method name="pread(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;J)I" />
+ <method name="pread(Ljava/io/FileDescriptor;[BIIJ)I" />
+ <method name="pwrite(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;J)I" />
+ <method name="pwrite(Ljava/io/FileDescriptor;[BIIJ)I" />
+ <method name="read(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;)I" />
+ <method name="read(Ljava/io/FileDescriptor;[BII)I" />
+ <method name="readlink(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="readv(Ljava/io/FileDescriptor;[Ljava/lang/Object;[I[I)I" />
+ <method name="recvfrom(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;ILjava/net/InetSocketAddress;)I" />
+ <method name="recvfrom(Ljava/io/FileDescriptor;[BIIILjava/net/InetSocketAddress;)I" />
+ <method name="remove(Ljava/lang/String;)V" />
+ <method name="rename(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="sendfile(Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;Landroid/util/MutableLong;J)J" />
+ <method name="sendto(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;ILjava/net/InetAddress;I)I" />
+ <method name="sendto(Ljava/io/FileDescriptor;[BIIILjava/net/InetAddress;I)I" />
+ <method name="setegid(I)V" />
+ <method name="setenv(Ljava/lang/String;Ljava/lang/String;Z)V" />
+ <method name="seteuid(I)V" />
+ <method name="setgid(I)V" />
+ <method name="setsid()I" />
+ <method name="setuid(I)V" />
+ <method name="shutdown(Ljava/io/FileDescriptor;I)V" />
+ <method name="socket(III)Ljava/io/FileDescriptor;" />
+ <method name="socketpair(IIILjava/io/FileDescriptor;Ljava/io/FileDescriptor;)V" />
+ <method name="stat(Ljava/lang/String;)Landroid/system/StructStat;" />
+ <method name="statvfs(Ljava/lang/String;)Landroid/system/StructStatVfs;" />
+ <method name="strerror(I)Ljava/lang/String;" />
+ <method name="strsignal(I)Ljava/lang/String;" />
+ <method name="symlink(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="sysconf(I)J" />
+ <method name="tcdrain(Ljava/io/FileDescriptor;)V" />
+ <method name="tcsendbreak(Ljava/io/FileDescriptor;I)V" />
+ <method name="umask(I)I" />
+ <method name="uname()Landroid/system/StructUtsname;" />
+ <method name="unsetenv(Ljava/lang/String;)V" />
+ <method name="waitpid(ILandroid/util/MutableInt;I)I" />
+ <method name="write(Ljava/io/FileDescriptor;Ljava/nio/ByteBuffer;)I" />
+ <method name="write(Ljava/io/FileDescriptor;[BII)I" />
+ <method name="writev(Ljava/io/FileDescriptor;[Ljava/lang/Object;[I[I)I" />
+ </class>
+ <class name="android/system/OsConstants" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="S_ISBLK(I)Z" />
+ <method name="S_ISCHR(I)Z" />
+ <method name="S_ISDIR(I)Z" />
+ <method name="S_ISFIFO(I)Z" />
+ <method name="S_ISLNK(I)Z" />
+ <method name="S_ISREG(I)Z" />
+ <method name="S_ISSOCK(I)Z" />
+ <method name="WCOREDUMP(I)Z" />
+ <method name="WEXITSTATUS(I)I" />
+ <method name="WIFEXITED(I)Z" />
+ <method name="WIFSIGNALED(I)Z" />
+ <method name="WIFSTOPPED(I)Z" />
+ <method name="WSTOPSIG(I)I" />
+ <method name="WTERMSIG(I)I" />
+ <method name="errnoName(I)Ljava/lang/String;" />
+ <method name="gaiName(I)Ljava/lang/String;" />
+ <field name="AF_INET" />
+ <field name="AF_INET6" />
+ <field name="AF_UNIX" />
+ <field name="AF_UNSPEC" />
+ <field name="AI_ADDRCONFIG" />
+ <field name="AI_ALL" />
+ <field name="AI_CANONNAME" />
+ <field name="AI_NUMERICHOST" />
+ <field name="AI_NUMERICSERV" />
+ <field name="AI_PASSIVE" />
+ <field name="AI_V4MAPPED" />
+ <field name="CAP_AUDIT_CONTROL" />
+ <field name="CAP_AUDIT_WRITE" />
+ <field name="CAP_BLOCK_SUSPEND" />
+ <field name="CAP_CHOWN" />
+ <field name="CAP_DAC_OVERRIDE" />
+ <field name="CAP_DAC_READ_SEARCH" />
+ <field name="CAP_FOWNER" />
+ <field name="CAP_FSETID" />
+ <field name="CAP_IPC_LOCK" />
+ <field name="CAP_IPC_OWNER" />
+ <field name="CAP_KILL" />
+ <field name="CAP_LAST_CAP" />
+ <field name="CAP_LEASE" />
+ <field name="CAP_LINUX_IMMUTABLE" />
+ <field name="CAP_MAC_ADMIN" />
+ <field name="CAP_MAC_OVERRIDE" />
+ <field name="CAP_MKNOD" />
+ <field name="CAP_NET_ADMIN" />
+ <field name="CAP_NET_BIND_SERVICE" />
+ <field name="CAP_NET_BROADCAST" />
+ <field name="CAP_NET_RAW" />
+ <field name="CAP_SETFCAP" />
+ <field name="CAP_SETGID" />
+ <field name="CAP_SETPCAP" />
+ <field name="CAP_SETUID" />
+ <field name="CAP_SYSLOG" />
+ <field name="CAP_SYS_ADMIN" />
+ <field name="CAP_SYS_BOOT" />
+ <field name="CAP_SYS_CHROOT" />
+ <field name="CAP_SYS_MODULE" />
+ <field name="CAP_SYS_NICE" />
+ <field name="CAP_SYS_PACCT" />
+ <field name="CAP_SYS_PTRACE" />
+ <field name="CAP_SYS_RAWIO" />
+ <field name="CAP_SYS_RESOURCE" />
+ <field name="CAP_SYS_TIME" />
+ <field name="CAP_SYS_TTY_CONFIG" />
+ <field name="CAP_WAKE_ALARM" />
+ <field name="E2BIG" />
+ <field name="EACCES" />
+ <field name="EADDRINUSE" />
+ <field name="EADDRNOTAVAIL" />
+ <field name="EAFNOSUPPORT" />
+ <field name="EAGAIN" />
+ <field name="EAI_AGAIN" />
+ <field name="EAI_BADFLAGS" />
+ <field name="EAI_FAIL" />
+ <field name="EAI_FAMILY" />
+ <field name="EAI_MEMORY" />
+ <field name="EAI_NODATA" />
+ <field name="EAI_NONAME" />
+ <field name="EAI_OVERFLOW" />
+ <field name="EAI_SERVICE" />
+ <field name="EAI_SOCKTYPE" />
+ <field name="EAI_SYSTEM" />
+ <field name="EALREADY" />
+ <field name="EBADF" />
+ <field name="EBADMSG" />
+ <field name="EBUSY" />
+ <field name="ECANCELED" />
+ <field name="ECHILD" />
+ <field name="ECONNABORTED" />
+ <field name="ECONNREFUSED" />
+ <field name="ECONNRESET" />
+ <field name="EDEADLK" />
+ <field name="EDESTADDRREQ" />
+ <field name="EDOM" />
+ <field name="EDQUOT" />
+ <field name="EEXIST" />
+ <field name="EFAULT" />
+ <field name="EFBIG" />
+ <field name="EHOSTUNREACH" />
+ <field name="EIDRM" />
+ <field name="EILSEQ" />
+ <field name="EINPROGRESS" />
+ <field name="EINTR" />
+ <field name="EINVAL" />
+ <field name="EIO" />
+ <field name="EISCONN" />
+ <field name="EISDIR" />
+ <field name="ELOOP" />
+ <field name="EMFILE" />
+ <field name="EMLINK" />
+ <field name="EMSGSIZE" />
+ <field name="EMULTIHOP" />
+ <field name="ENAMETOOLONG" />
+ <field name="ENETDOWN" />
+ <field name="ENETRESET" />
+ <field name="ENETUNREACH" />
+ <field name="ENFILE" />
+ <field name="ENOBUFS" />
+ <field name="ENODATA" />
+ <field name="ENODEV" />
+ <field name="ENOENT" />
+ <field name="ENOEXEC" />
+ <field name="ENOLCK" />
+ <field name="ENOLINK" />
+ <field name="ENOMEM" />
+ <field name="ENOMSG" />
+ <field name="ENOPROTOOPT" />
+ <field name="ENOSPC" />
+ <field name="ENOSR" />
+ <field name="ENOSTR" />
+ <field name="ENOSYS" />
+ <field name="ENOTCONN" />
+ <field name="ENOTDIR" />
+ <field name="ENOTEMPTY" />
+ <field name="ENOTSOCK" />
+ <field name="ENOTSUP" />
+ <field name="ENOTTY" />
+ <field name="ENXIO" />
+ <field name="EOPNOTSUPP" />
+ <field name="EOVERFLOW" />
+ <field name="EPERM" />
+ <field name="EPIPE" />
+ <field name="EPROTO" />
+ <field name="EPROTONOSUPPORT" />
+ <field name="EPROTOTYPE" />
+ <field name="ERANGE" />
+ <field name="EROFS" />
+ <field name="ESPIPE" />
+ <field name="ESRCH" />
+ <field name="ESTALE" />
+ <field name="ETIME" />
+ <field name="ETIMEDOUT" />
+ <field name="ETXTBSY" />
+ <field name="EXDEV" />
+ <field name="EXIT_FAILURE" />
+ <field name="EXIT_SUCCESS" />
+ <field name="FD_CLOEXEC" />
+ <field name="FIONREAD" />
+ <field name="F_DUPFD" />
+ <field name="F_GETFD" />
+ <field name="F_GETFL" />
+ <field name="F_GETLK" />
+ <field name="F_GETLK64" />
+ <field name="F_GETOWN" />
+ <field name="F_OK" />
+ <field name="F_RDLCK" />
+ <field name="F_SETFD" />
+ <field name="F_SETFL" />
+ <field name="F_SETLK" />
+ <field name="F_SETLK64" />
+ <field name="F_SETLKW" />
+ <field name="F_SETLKW64" />
+ <field name="F_SETOWN" />
+ <field name="F_UNLCK" />
+ <field name="F_WRLCK" />
+ <field name="IFA_F_DADFAILED" />
+ <field name="IFA_F_DEPRECATED" />
+ <field name="IFA_F_HOMEADDRESS" />
+ <field name="IFA_F_NODAD" />
+ <field name="IFA_F_OPTIMISTIC" />
+ <field name="IFA_F_PERMANENT" />
+ <field name="IFA_F_SECONDARY" />
+ <field name="IFA_F_TEMPORARY" />
+ <field name="IFA_F_TENTATIVE" />
+ <field name="IFF_ALLMULTI" />
+ <field name="IFF_AUTOMEDIA" />
+ <field name="IFF_BROADCAST" />
+ <field name="IFF_DEBUG" />
+ <field name="IFF_DYNAMIC" />
+ <field name="IFF_LOOPBACK" />
+ <field name="IFF_MASTER" />
+ <field name="IFF_MULTICAST" />
+ <field name="IFF_NOARP" />
+ <field name="IFF_NOTRAILERS" />
+ <field name="IFF_POINTOPOINT" />
+ <field name="IFF_PORTSEL" />
+ <field name="IFF_PROMISC" />
+ <field name="IFF_RUNNING" />
+ <field name="IFF_SLAVE" />
+ <field name="IFF_UP" />
+ <field name="IPPROTO_ICMP" />
+ <field name="IPPROTO_ICMPV6" />
+ <field name="IPPROTO_IP" />
+ <field name="IPPROTO_IPV6" />
+ <field name="IPPROTO_RAW" />
+ <field name="IPPROTO_TCP" />
+ <field name="IPPROTO_UDP" />
+ <field name="IPV6_CHECKSUM" />
+ <field name="IPV6_MULTICAST_HOPS" />
+ <field name="IPV6_MULTICAST_IF" />
+ <field name="IPV6_MULTICAST_LOOP" />
+ <field name="IPV6_RECVDSTOPTS" />
+ <field name="IPV6_RECVHOPLIMIT" />
+ <field name="IPV6_RECVHOPOPTS" />
+ <field name="IPV6_RECVPKTINFO" />
+ <field name="IPV6_RECVRTHDR" />
+ <field name="IPV6_RECVTCLASS" />
+ <field name="IPV6_TCLASS" />
+ <field name="IPV6_UNICAST_HOPS" />
+ <field name="IPV6_V6ONLY" />
+ <field name="IP_MULTICAST_IF" />
+ <field name="IP_MULTICAST_LOOP" />
+ <field name="IP_MULTICAST_TTL" />
+ <field name="IP_TOS" />
+ <field name="IP_TTL" />
+ <field name="MAP_FIXED" />
+ <field name="MAP_PRIVATE" />
+ <field name="MAP_SHARED" />
+ <field name="MCAST_BLOCK_SOURCE" />
+ <field name="MCAST_JOIN_GROUP" />
+ <field name="MCAST_JOIN_SOURCE_GROUP" />
+ <field name="MCAST_LEAVE_GROUP" />
+ <field name="MCAST_LEAVE_SOURCE_GROUP" />
+ <field name="MCAST_UNBLOCK_SOURCE" />
+ <field name="MCL_CURRENT" />
+ <field name="MCL_FUTURE" />
+ <field name="MSG_CTRUNC" />
+ <field name="MSG_DONTROUTE" />
+ <field name="MSG_EOR" />
+ <field name="MSG_OOB" />
+ <field name="MSG_PEEK" />
+ <field name="MSG_TRUNC" />
+ <field name="MSG_WAITALL" />
+ <field name="MS_ASYNC" />
+ <field name="MS_INVALIDATE" />
+ <field name="MS_SYNC" />
+ <field name="NI_DGRAM" />
+ <field name="NI_NAMEREQD" />
+ <field name="NI_NOFQDN" />
+ <field name="NI_NUMERICHOST" />
+ <field name="NI_NUMERICSERV" />
+ <field name="O_ACCMODE" />
+ <field name="O_APPEND" />
+ <field name="O_CREAT" />
+ <field name="O_EXCL" />
+ <field name="O_NOCTTY" />
+ <field name="O_NOFOLLOW" />
+ <field name="O_NONBLOCK" />
+ <field name="O_RDONLY" />
+ <field name="O_RDWR" />
+ <field name="O_SYNC" />
+ <field name="O_TRUNC" />
+ <field name="O_WRONLY" />
+ <field name="POLLERR" />
+ <field name="POLLHUP" />
+ <field name="POLLIN" />
+ <field name="POLLNVAL" />
+ <field name="POLLOUT" />
+ <field name="POLLPRI" />
+ <field name="POLLRDBAND" />
+ <field name="POLLRDNORM" />
+ <field name="POLLWRBAND" />
+ <field name="POLLWRNORM" />
+ <field name="PROT_EXEC" />
+ <field name="PROT_NONE" />
+ <field name="PROT_READ" />
+ <field name="PROT_WRITE" />
+ <field name="PR_GET_DUMPABLE" />
+ <field name="PR_SET_DUMPABLE" />
+ <field name="PR_SET_NO_NEW_PRIVS" />
+ <field name="RT_SCOPE_HOST" />
+ <field name="RT_SCOPE_LINK" />
+ <field name="RT_SCOPE_NOWHERE" />
+ <field name="RT_SCOPE_SITE" />
+ <field name="RT_SCOPE_UNIVERSE" />
+ <field name="R_OK" />
+ <field name="SEEK_CUR" />
+ <field name="SEEK_END" />
+ <field name="SEEK_SET" />
+ <field name="SHUT_RD" />
+ <field name="SHUT_RDWR" />
+ <field name="SHUT_WR" />
+ <field name="SIGABRT" />
+ <field name="SIGALRM" />
+ <field name="SIGBUS" />
+ <field name="SIGCHLD" />
+ <field name="SIGCONT" />
+ <field name="SIGFPE" />
+ <field name="SIGHUP" />
+ <field name="SIGILL" />
+ <field name="SIGINT" />
+ <field name="SIGIO" />
+ <field name="SIGKILL" />
+ <field name="SIGPIPE" />
+ <field name="SIGPROF" />
+ <field name="SIGPWR" />
+ <field name="SIGQUIT" />
+ <field name="SIGRTMAX" />
+ <field name="SIGRTMIN" />
+ <field name="SIGSEGV" />
+ <field name="SIGSTKFLT" />
+ <field name="SIGSTOP" />
+ <field name="SIGSYS" />
+ <field name="SIGTERM" />
+ <field name="SIGTRAP" />
+ <field name="SIGTSTP" />
+ <field name="SIGTTIN" />
+ <field name="SIGTTOU" />
+ <field name="SIGURG" />
+ <field name="SIGUSR1" />
+ <field name="SIGUSR2" />
+ <field name="SIGVTALRM" />
+ <field name="SIGWINCH" />
+ <field name="SIGXCPU" />
+ <field name="SIGXFSZ" />
+ <field name="SIOCGIFADDR" />
+ <field name="SIOCGIFBRDADDR" />
+ <field name="SIOCGIFDSTADDR" />
+ <field name="SIOCGIFNETMASK" />
+ <field name="SOCK_DGRAM" />
+ <field name="SOCK_RAW" />
+ <field name="SOCK_SEQPACKET" />
+ <field name="SOCK_STREAM" />
+ <field name="SOL_SOCKET" />
+ <field name="SO_BINDTODEVICE" />
+ <field name="SO_BROADCAST" />
+ <field name="SO_DEBUG" />
+ <field name="SO_DONTROUTE" />
+ <field name="SO_ERROR" />
+ <field name="SO_KEEPALIVE" />
+ <field name="SO_LINGER" />
+ <field name="SO_OOBINLINE" />
+ <field name="SO_PASSCRED" />
+ <field name="SO_PEERCRED" />
+ <field name="SO_RCVBUF" />
+ <field name="SO_RCVLOWAT" />
+ <field name="SO_RCVTIMEO" />
+ <field name="SO_REUSEADDR" />
+ <field name="SO_SNDBUF" />
+ <field name="SO_SNDLOWAT" />
+ <field name="SO_SNDTIMEO" />
+ <field name="SO_TYPE" />
+ <field name="STDERR_FILENO" />
+ <field name="STDIN_FILENO" />
+ <field name="STDOUT_FILENO" />
+ <field name="S_IFBLK" />
+ <field name="S_IFCHR" />
+ <field name="S_IFDIR" />
+ <field name="S_IFIFO" />
+ <field name="S_IFLNK" />
+ <field name="S_IFMT" />
+ <field name="S_IFREG" />
+ <field name="S_IFSOCK" />
+ <field name="S_IRGRP" />
+ <field name="S_IROTH" />
+ <field name="S_IRUSR" />
+ <field name="S_IRWXG" />
+ <field name="S_IRWXO" />
+ <field name="S_IRWXU" />
+ <field name="S_ISGID" />
+ <field name="S_ISUID" />
+ <field name="S_ISVTX" />
+ <field name="S_IWGRP" />
+ <field name="S_IWOTH" />
+ <field name="S_IWUSR" />
+ <field name="S_IXGRP" />
+ <field name="S_IXOTH" />
+ <field name="S_IXUSR" />
+ <field name="TCP_NODELAY" />
+ <field name="WCONTINUED" />
+ <field name="WEXITED" />
+ <field name="WNOHANG" />
+ <field name="WNOWAIT" />
+ <field name="WSTOPPED" />
+ <field name="WUNTRACED" />
+ <field name="W_OK" />
+ <field name="X_OK" />
+ <field name="_SC_2_CHAR_TERM" />
+ <field name="_SC_2_C_BIND" />
+ <field name="_SC_2_C_DEV" />
+ <field name="_SC_2_C_VERSION" />
+ <field name="_SC_2_FORT_DEV" />
+ <field name="_SC_2_FORT_RUN" />
+ <field name="_SC_2_LOCALEDEF" />
+ <field name="_SC_2_SW_DEV" />
+ <field name="_SC_2_UPE" />
+ <field name="_SC_2_VERSION" />
+ <field name="_SC_AIO_LISTIO_MAX" />
+ <field name="_SC_AIO_MAX" />
+ <field name="_SC_AIO_PRIO_DELTA_MAX" />
+ <field name="_SC_ARG_MAX" />
+ <field name="_SC_ASYNCHRONOUS_IO" />
+ <field name="_SC_ATEXIT_MAX" />
+ <field name="_SC_AVPHYS_PAGES" />
+ <field name="_SC_BC_BASE_MAX" />
+ <field name="_SC_BC_DIM_MAX" />
+ <field name="_SC_BC_SCALE_MAX" />
+ <field name="_SC_BC_STRING_MAX" />
+ <field name="_SC_CHILD_MAX" />
+ <field name="_SC_CLK_TCK" />
+ <field name="_SC_COLL_WEIGHTS_MAX" />
+ <field name="_SC_DELAYTIMER_MAX" />
+ <field name="_SC_EXPR_NEST_MAX" />
+ <field name="_SC_FSYNC" />
+ <field name="_SC_GETGR_R_SIZE_MAX" />
+ <field name="_SC_GETPW_R_SIZE_MAX" />
+ <field name="_SC_IOV_MAX" />
+ <field name="_SC_JOB_CONTROL" />
+ <field name="_SC_LINE_MAX" />
+ <field name="_SC_LOGIN_NAME_MAX" />
+ <field name="_SC_MAPPED_FILES" />
+ <field name="_SC_MEMLOCK" />
+ <field name="_SC_MEMLOCK_RANGE" />
+ <field name="_SC_MEMORY_PROTECTION" />
+ <field name="_SC_MESSAGE_PASSING" />
+ <field name="_SC_MQ_OPEN_MAX" />
+ <field name="_SC_MQ_PRIO_MAX" />
+ <field name="_SC_NGROUPS_MAX" />
+ <field name="_SC_NPROCESSORS_CONF" />
+ <field name="_SC_NPROCESSORS_ONLN" />
+ <field name="_SC_OPEN_MAX" />
+ <field name="_SC_PAGESIZE" />
+ <field name="_SC_PAGE_SIZE" />
+ <field name="_SC_PASS_MAX" />
+ <field name="_SC_PHYS_PAGES" />
+ <field name="_SC_PRIORITIZED_IO" />
+ <field name="_SC_PRIORITY_SCHEDULING" />
+ <field name="_SC_REALTIME_SIGNALS" />
+ <field name="_SC_RE_DUP_MAX" />
+ <field name="_SC_RTSIG_MAX" />
+ <field name="_SC_SAVED_IDS" />
+ <field name="_SC_SEMAPHORES" />
+ <field name="_SC_SEM_NSEMS_MAX" />
+ <field name="_SC_SEM_VALUE_MAX" />
+ <field name="_SC_SHARED_MEMORY_OBJECTS" />
+ <field name="_SC_SIGQUEUE_MAX" />
+ <field name="_SC_STREAM_MAX" />
+ <field name="_SC_SYNCHRONIZED_IO" />
+ <field name="_SC_THREADS" />
+ <field name="_SC_THREAD_ATTR_STACKADDR" />
+ <field name="_SC_THREAD_ATTR_STACKSIZE" />
+ <field name="_SC_THREAD_DESTRUCTOR_ITERATIONS" />
+ <field name="_SC_THREAD_KEYS_MAX" />
+ <field name="_SC_THREAD_PRIORITY_SCHEDULING" />
+ <field name="_SC_THREAD_PRIO_INHERIT" />
+ <field name="_SC_THREAD_PRIO_PROTECT" />
+ <field name="_SC_THREAD_SAFE_FUNCTIONS" />
+ <field name="_SC_THREAD_STACK_MIN" />
+ <field name="_SC_THREAD_THREADS_MAX" />
+ <field name="_SC_TIMERS" />
+ <field name="_SC_TIMER_MAX" />
+ <field name="_SC_TTY_NAME_MAX" />
+ <field name="_SC_TZNAME_MAX" />
+ <field name="_SC_VERSION" />
+ <field name="_SC_XBS5_ILP32_OFF32" />
+ <field name="_SC_XBS5_ILP32_OFFBIG" />
+ <field name="_SC_XBS5_LP64_OFF64" />
+ <field name="_SC_XBS5_LPBIG_OFFBIG" />
+ <field name="_SC_XOPEN_CRYPT" />
+ <field name="_SC_XOPEN_ENH_I18N" />
+ <field name="_SC_XOPEN_LEGACY" />
+ <field name="_SC_XOPEN_REALTIME" />
+ <field name="_SC_XOPEN_REALTIME_THREADS" />
+ <field name="_SC_XOPEN_SHM" />
+ <field name="_SC_XOPEN_UNIX" />
+ <field name="_SC_XOPEN_VERSION" />
+ <field name="_SC_XOPEN_XCU_VERSION" />
+ </class>
+ <class name="android/system/StructPollfd" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="events" />
+ <field name="fd" />
+ <field name="revents" />
+ <field name="userData" />
+ </class>
+ <class name="android/system/StructStat" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(JJIJIIJJJJJJJ)V" />
+ <field name="st_atime" />
+ <field name="st_blksize" />
+ <field name="st_blocks" />
+ <field name="st_ctime" />
+ <field name="st_dev" />
+ <field name="st_gid" />
+ <field name="st_ino" />
+ <field name="st_mode" />
+ <field name="st_mtime" />
+ <field name="st_nlink" />
+ <field name="st_rdev" />
+ <field name="st_size" />
+ <field name="st_uid" />
+ </class>
+ <class name="android/system/StructStatVfs" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(JJJJJJJJJJJ)V" />
+ <field name="f_bavail" />
+ <field name="f_bfree" />
+ <field name="f_blocks" />
+ <field name="f_bsize" />
+ <field name="f_favail" />
+ <field name="f_ffree" />
+ <field name="f_files" />
+ <field name="f_flag" />
+ <field name="f_frsize" />
+ <field name="f_fsid" />
+ <field name="f_namemax" />
+ </class>
+ <class name="android/system/StructUtsname" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <field name="machine" />
+ <field name="nodename" />
+ <field name="release" />
+ <field name="sysname" />
+ <field name="version" />
+ </class>
+ <class name="android/telecom/TelecomManager" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="cancelMissedCallsNotification()V" />
+ <method name="handleMmi(Ljava/lang/String;)Z" />
+ <method name="isInCall()Z" />
+ <method name="showInCallScreen(Z)V" />
+ <field name="ACTION_SHOW_CALL_SETTINGS" />
+ <field name="DTMF_CHARACTER_PAUSE" />
+ <field name="DTMF_CHARACTER_WAIT" />
+ <field name="EXTRA_CALL_DISCONNECT_CAUSE" />
+ <field name="EXTRA_CALL_DISCONNECT_MESSAGE" />
+ <field name="EXTRA_START_CALL_WITH_SPEAKERPHONE" />
+ <field name="GATEWAY_ORIGINAL_ADDRESS" />
+ <field name="GATEWAY_PROVIDER_PACKAGE" />
+ <field name="PRESENTATION_ALLOWED" />
+ <field name="PRESENTATION_PAYPHONE" />
+ <field name="PRESENTATION_RESTRICTED" />
+ <field name="PRESENTATION_UNKNOWN" />
+ </class>
+ <class name="android/telephony/CellIdentityCdma" since="17">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getBasestationId()I" />
+ <method name="getLatitude()I" />
+ <method name="getLongitude()I" />
+ <method name="getNetworkId()I" />
+ <method name="getSystemId()I" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/telephony/CellIdentityGsm" since="17">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getCid()I" />
+ <method name="getLac()I" />
+ <method name="getMcc()I" />
+ <method name="getMnc()I" />
+ <method name="getPsc()I" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/telephony/CellIdentityLte" since="17">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getCi()I" />
+ <method name="getMcc()I" />
+ <method name="getMnc()I" />
+ <method name="getPci()I" />
+ <method name="getTac()I" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/telephony/CellIdentityWcdma" since="18">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getCid()I" />
+ <method name="getLac()I" />
+ <method name="getMcc()I" />
+ <method name="getMnc()I" />
+ <method name="getPsc()I" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/telephony/CellInfo" since="17">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getTimeStamp()J" />
+ <method name="isRegistered()Z" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/telephony/CellInfoCdma" since="17">
+ <extends name="android/telephony/CellInfo" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getCellIdentity()Landroid/telephony/CellIdentityCdma;" />
+ <method name="getCellSignalStrength()Landroid/telephony/CellSignalStrengthCdma;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/telephony/CellInfoGsm" since="17">
+ <extends name="android/telephony/CellInfo" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getCellIdentity()Landroid/telephony/CellIdentityGsm;" />
+ <method name="getCellSignalStrength()Landroid/telephony/CellSignalStrengthGsm;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/telephony/CellInfoLte" since="17">
+ <extends name="android/telephony/CellInfo" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getCellIdentity()Landroid/telephony/CellIdentityLte;" />
+ <method name="getCellSignalStrength()Landroid/telephony/CellSignalStrengthLte;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/telephony/CellInfoWcdma" since="18">
+ <extends name="android/telephony/CellInfo" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getCellIdentity()Landroid/telephony/CellIdentityWcdma;" />
+ <method name="getCellSignalStrength()Landroid/telephony/CellSignalStrengthWcdma;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/telephony/CellLocation" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getEmpty()Landroid/telephony/CellLocation;" />
+ <method name="requestLocationUpdate()V" />
+ </class>
+ <class name="android/telephony/CellSignalStrength" since="17">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getAsuLevel()I" />
+ <method name="getDbm()I" />
+ <method name="getLevel()I" />
+ </class>
+ <class name="android/telephony/CellSignalStrengthCdma" since="17">
+ <extends name="android/telephony/CellSignalStrength" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getCdmaDbm()I" />
+ <method name="getCdmaEcio()I" />
+ <method name="getCdmaLevel()I" />
+ <method name="getEvdoDbm()I" />
+ <method name="getEvdoEcio()I" />
+ <method name="getEvdoLevel()I" />
+ <method name="getEvdoSnr()I" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/telephony/CellSignalStrengthGsm" since="17">
+ <extends name="android/telephony/CellSignalStrength" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/telephony/CellSignalStrengthLte" since="17">
+ <extends name="android/telephony/CellSignalStrength" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getTimingAdvance()I" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/telephony/CellSignalStrengthWcdma" since="18">
+ <extends name="android/telephony/CellSignalStrength" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/telephony/IccOpenLogicalChannelResponse" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getChannel()I" />
+ <method name="getSelectResponse()[B" />
+ <method name="getStatus()I" />
+ <field name="CREATOR" />
+ <field name="INVALID_CHANNEL" />
+ <field name="STATUS_MISSING_RESOURCE" />
+ <field name="STATUS_NO_ERROR" />
+ <field name="STATUS_NO_SUCH_ELEMENT" />
+ <field name="STATUS_UNKNOWN_ERROR" />
+ </class>
+ <class name="android/telephony/NeighboringCellInfo" since="3">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(II)V" />
+ <method name="&lt;init>(ILjava/lang/String;I)V" since="7" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="getCid()I" />
+ <method name="getLac()I" since="5" />
+ <method name="getNetworkType()I" since="5" />
+ <method name="getPsc()I" since="5" />
+ <method name="getRssi()I" />
+ <method name="setCid(I)V" />
+ <method name="setRssi(I)V" />
+ <field name="CREATOR" />
+ <field name="UNKNOWN_CID" />
+ <field name="UNKNOWN_RSSI" />
+ </class>
+ <class name="android/telephony/PhoneNumberFormattingTextWatcher" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/TextWatcher" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" since="21" />
+ </class>
+ <class name="android/telephony/PhoneNumberUtils" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="calledPartyBCDFragmentToString([BII)Ljava/lang/String;" />
+ <method name="calledPartyBCDToString([BII)Ljava/lang/String;" />
+ <method name="compare(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)Z" since="5" />
+ <method name="compare(Ljava/lang/String;Ljava/lang/String;)Z" />
+ <method name="convertKeypadLettersToDigits(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="extractNetworkPortion(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="extractPostDialPortion(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="formatJapaneseNumber(Landroid/text/Editable;)V" since="3" />
+ <method name="formatNanpNumber(Landroid/text/Editable;)V" />
+ <method name="formatNumber(Landroid/text/Editable;I)V" />
+ <method name="formatNumber(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="formatNumber(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" since="21" />
+ <method name="formatNumber(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" since="21" />
+ <method name="formatNumberToE164(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" since="21" />
+ <method name="getFormatTypeForLocale(Ljava/util/Locale;)I" />
+ <method name="getNumberFromIntent(Landroid/content/Intent;Landroid/content/Context;)Ljava/lang/String;" />
+ <method name="getStrippedReversed(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="is12Key(C)Z" />
+ <method name="isDialable(C)Z" />
+ <method name="isEmergencyNumber(Ljava/lang/String;)Z" />
+ <method name="isGlobalPhoneNumber(Ljava/lang/String;)Z" />
+ <method name="isISODigit(C)Z" />
+ <method name="isLocalEmergencyNumber(Landroid/content/Context;Ljava/lang/String;)Z" since="21" />
+ <method name="isNonSeparator(C)Z" />
+ <method name="isReallyDialable(C)Z" />
+ <method name="isStartsPostDial(C)Z" />
+ <method name="isVoiceMailNumber(Ljava/lang/String;)Z" since="21" />
+ <method name="isWellFormedSmsAddress(Ljava/lang/String;)Z" />
+ <method name="networkPortionToCalledPartyBCD(Ljava/lang/String;)[B" />
+ <method name="networkPortionToCalledPartyBCDWithLength(Ljava/lang/String;)[B" />
+ <method name="normalizeNumber(Ljava/lang/String;)Ljava/lang/String;" since="21" />
+ <method name="numberToCalledPartyBCD(Ljava/lang/String;)[B" />
+ <method name="replaceUnicodeDigits(Ljava/lang/String;)Ljava/lang/String;" since="21" />
+ <method name="stringFromStringAndTOA(Ljava/lang/String;I)Ljava/lang/String;" />
+ <method name="stripSeparators(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="toCallerIDMinMatch(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="toaFromString(Ljava/lang/String;)I" />
+ <field name="FORMAT_JAPAN" since="3" />
+ <field name="FORMAT_NANP" />
+ <field name="FORMAT_UNKNOWN" />
+ <field name="PAUSE" />
+ <field name="TOA_International" />
+ <field name="TOA_Unknown" />
+ <field name="WAIT" />
+ <field name="WILD" />
+ </class>
+ <class name="android/telephony/PhoneStateListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onCallForwardingIndicatorChanged(Z)V" />
+ <method name="onCallStateChanged(ILjava/lang/String;)V" />
+ <method name="onCellInfoChanged(Ljava/util/List;)V" since="17" />
+ <method name="onCellLocationChanged(Landroid/telephony/CellLocation;)V" />
+ <method name="onDataActivity(I)V" />
+ <method name="onDataConnectionStateChanged(I)V" />
+ <method name="onDataConnectionStateChanged(II)V" since="7" />
+ <method name="onMessageWaitingIndicatorChanged(Z)V" />
+ <method name="onServiceStateChanged(Landroid/telephony/ServiceState;)V" />
+ <method name="onSignalStrengthChanged(I)V" />
+ <method name="onSignalStrengthsChanged(Landroid/telephony/SignalStrength;)V" since="7" />
+ <field name="LISTEN_CALL_FORWARDING_INDICATOR" />
+ <field name="LISTEN_CALL_STATE" />
+ <field name="LISTEN_CELL_INFO" since="17" />
+ <field name="LISTEN_CELL_LOCATION" />
+ <field name="LISTEN_DATA_ACTIVITY" />
+ <field name="LISTEN_DATA_CONNECTION_STATE" />
+ <field name="LISTEN_MESSAGE_WAITING_INDICATOR" />
+ <field name="LISTEN_NONE" />
+ <field name="LISTEN_SERVICE_STATE" />
+ <field name="LISTEN_SIGNAL_STRENGTH" />
+ <field name="LISTEN_SIGNAL_STRENGTHS" since="7" />
+ </class>
+ <class name="android/telephony/ServiceState" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="&lt;init>(Landroid/telephony/ServiceState;)V" />
+ <method name="copyFrom(Landroid/telephony/ServiceState;)V" />
+ <method name="getIsManualSelection()Z" />
+ <method name="getOperatorAlphaLong()Ljava/lang/String;" />
+ <method name="getOperatorAlphaShort()Ljava/lang/String;" />
+ <method name="getOperatorNumeric()Ljava/lang/String;" />
+ <method name="getRoaming()Z" />
+ <method name="getState()I" />
+ <method name="setIsManualSelection(Z)V" />
+ <method name="setOperatorName(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="setRoaming(Z)V" />
+ <method name="setState(I)V" />
+ <method name="setStateOff()V" />
+ <method name="setStateOutOfService()V" />
+ <field name="CREATOR" />
+ <field name="STATE_EMERGENCY_ONLY" />
+ <field name="STATE_IN_SERVICE" />
+ <field name="STATE_OUT_OF_SERVICE" />
+ <field name="STATE_POWER_OFF" />
+ </class>
+ <class name="android/telephony/SignalStrength" since="7">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getCdmaDbm()I" />
+ <method name="getCdmaEcio()I" />
+ <method name="getEvdoDbm()I" />
+ <method name="getEvdoEcio()I" />
+ <method name="getEvdoSnr()I" />
+ <method name="getGsmBitErrorRate()I" />
+ <method name="getGsmSignalStrength()I" />
+ <method name="isGsm()Z" />
+ </class>
+ <class name="android/telephony/SmsManager" since="4">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="divideMessage(Ljava/lang/String;)Ljava/util/ArrayList;" />
+ <method name="downloadMultimediaMessage(Landroid/content/Context;Ljava/lang/String;Landroid/net/Uri;Landroid/os/Bundle;Landroid/app/PendingIntent;)V" since="21" />
+ <method name="getCarrierConfigValues()Landroid/os/Bundle;" since="21" />
+ <method name="getDefault()Landroid/telephony/SmsManager;" />
+ <method name="sendDataMessage(Ljava/lang/String;Ljava/lang/String;S[BLandroid/app/PendingIntent;Landroid/app/PendingIntent;)V" />
+ <method name="sendMultimediaMessage(Landroid/content/Context;Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;Landroid/app/PendingIntent;)V" since="21" />
+ <method name="sendMultipartTextMessage(Ljava/lang/String;Ljava/lang/String;Ljava/util/ArrayList;Ljava/util/ArrayList;Ljava/util/ArrayList;)V" />
+ <method name="sendTextMessage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/app/PendingIntent;Landroid/app/PendingIntent;)V" />
+ <field name="EXTRA_MMS_DATA" since="21" />
+ <field name="MMS_CONFIG_ALIAS_ENABLED" since="21" />
+ <field name="MMS_CONFIG_ALIAS_MAX_CHARS" since="21" />
+ <field name="MMS_CONFIG_ALIAS_MIN_CHARS" since="21" />
+ <field name="MMS_CONFIG_ALLOW_ATTACH_AUDIO" since="21" />
+ <field name="MMS_CONFIG_APPEND_TRANSACTION_ID" since="21" />
+ <field name="MMS_CONFIG_EMAIL_GATEWAY_NUMBER" since="21" />
+ <field name="MMS_CONFIG_GROUP_MMS_ENABLED" since="21" />
+ <field name="MMS_CONFIG_HTTP_PARAMS" since="21" />
+ <field name="MMS_CONFIG_HTTP_SOCKET_TIMEOUT" since="21" />
+ <field name="MMS_CONFIG_MAX_IMAGE_HEIGHT" since="21" />
+ <field name="MMS_CONFIG_MAX_IMAGE_WIDTH" since="21" />
+ <field name="MMS_CONFIG_MAX_MESSAGE_SIZE" since="21" />
+ <field name="MMS_CONFIG_MESSAGE_TEXT_MAX_SIZE" since="21" />
+ <field name="MMS_CONFIG_MMS_DELIVERY_REPORT_ENABLED" since="21" />
+ <field name="MMS_CONFIG_MMS_ENABLED" since="21" />
+ <field name="MMS_CONFIG_MMS_READ_REPORT_ENABLED" since="21" />
+ <field name="MMS_CONFIG_MULTIPART_SMS_ENABLED" since="21" />
+ <field name="MMS_CONFIG_NAI_SUFFIX" since="21" />
+ <field name="MMS_CONFIG_NOTIFY_WAP_MMSC_ENABLED" since="21" />
+ <field name="MMS_CONFIG_RECIPIENT_LIMIT" since="21" />
+ <field name="MMS_CONFIG_SEND_MULTIPART_SMS_AS_SEPARATE_MESSAGES" since="21" />
+ <field name="MMS_CONFIG_SMS_DELIVERY_REPORT_ENABLED" since="21" />
+ <field name="MMS_CONFIG_SMS_TO_MMS_TEXT_LENGTH_THRESHOLD" since="21" />
+ <field name="MMS_CONFIG_SMS_TO_MMS_TEXT_THRESHOLD" since="21" />
+ <field name="MMS_CONFIG_SUBJECT_MAX_LENGTH" since="21" />
+ <field name="MMS_CONFIG_SUPPORT_MMS_CONTENT_DISPOSITION" since="21" />
+ <field name="MMS_CONFIG_UA_PROF_TAG_NAME" since="21" />
+ <field name="MMS_CONFIG_UA_PROF_URL" since="21" />
+ <field name="MMS_CONFIG_USER_AGENT" since="21" />
+ <field name="MMS_ERROR_CONFIGURATION_ERROR" since="21" />
+ <field name="MMS_ERROR_HTTP_FAILURE" since="21" />
+ <field name="MMS_ERROR_INVALID_APN" since="21" />
+ <field name="MMS_ERROR_IO_ERROR" since="21" />
+ <field name="MMS_ERROR_RETRY" since="21" />
+ <field name="MMS_ERROR_UNABLE_CONNECT_MMS" since="21" />
+ <field name="MMS_ERROR_UNSPECIFIED" since="21" />
+ <field name="RESULT_ERROR_GENERIC_FAILURE" />
+ <field name="RESULT_ERROR_NO_SERVICE" />
+ <field name="RESULT_ERROR_NULL_PDU" />
+ <field name="RESULT_ERROR_RADIO_OFF" />
+ <field name="STATUS_ON_ICC_FREE" />
+ <field name="STATUS_ON_ICC_READ" />
+ <field name="STATUS_ON_ICC_SENT" />
+ <field name="STATUS_ON_ICC_UNREAD" />
+ <field name="STATUS_ON_ICC_UNSENT" />
+ </class>
+ <class name="android/telephony/SmsMessage" since="4">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="calculateLength(Ljava/lang/CharSequence;Z)[I" />
+ <method name="calculateLength(Ljava/lang/String;Z)[I" />
+ <method name="createFromPdu([B)Landroid/telephony/SmsMessage;" />
+ <method name="getDisplayMessageBody()Ljava/lang/String;" />
+ <method name="getDisplayOriginatingAddress()Ljava/lang/String;" />
+ <method name="getEmailBody()Ljava/lang/String;" />
+ <method name="getEmailFrom()Ljava/lang/String;" />
+ <method name="getIndexOnIcc()I" />
+ <method name="getIndexOnSim()I" />
+ <method name="getMessageBody()Ljava/lang/String;" />
+ <method name="getMessageClass()Landroid/telephony/SmsMessage$MessageClass;" />
+ <method name="getOriginatingAddress()Ljava/lang/String;" />
+ <method name="getPdu()[B" />
+ <method name="getProtocolIdentifier()I" />
+ <method name="getPseudoSubject()Ljava/lang/String;" />
+ <method name="getServiceCenterAddress()Ljava/lang/String;" />
+ <method name="getStatus()I" />
+ <method name="getStatusOnIcc()I" />
+ <method name="getStatusOnSim()I" />
+ <method name="getSubmitPdu(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)Landroid/telephony/SmsMessage$SubmitPdu;" />
+ <method name="getSubmitPdu(Ljava/lang/String;Ljava/lang/String;S[BZ)Landroid/telephony/SmsMessage$SubmitPdu;" />
+ <method name="getTPLayerLengthForPDU(Ljava/lang/String;)I" />
+ <method name="getTimestampMillis()J" />
+ <method name="getUserData()[B" />
+ <method name="isCphsMwiMessage()Z" />
+ <method name="isEmail()Z" />
+ <method name="isMWIClearMessage()Z" />
+ <method name="isMWISetMessage()Z" />
+ <method name="isMwiDontStore()Z" />
+ <method name="isReplace()Z" />
+ <method name="isReplyPathPresent()Z" />
+ <method name="isStatusReportMessage()Z" />
+ <field name="ENCODING_16BIT" />
+ <field name="ENCODING_7BIT" />
+ <field name="ENCODING_8BIT" />
+ <field name="ENCODING_UNKNOWN" />
+ <field name="MAX_USER_DATA_BYTES" />
+ <field name="MAX_USER_DATA_BYTES_WITH_HEADER" />
+ <field name="MAX_USER_DATA_SEPTETS" />
+ <field name="MAX_USER_DATA_SEPTETS_WITH_HEADER" />
+ </class>
+ <class name="android/telephony/SmsMessage$MessageClass" since="4">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/telephony/SmsMessage$MessageClass;" />
+ <method name="values()[Landroid/telephony/SmsMessage$MessageClass;" />
+ <field name="CLASS_0" />
+ <field name="CLASS_1" />
+ <field name="CLASS_2" />
+ <field name="CLASS_3" />
+ <field name="UNKNOWN" />
+ </class>
+ <class name="android/telephony/SmsMessage$SubmitPdu" since="4">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="encodedMessage" />
+ <field name="encodedScAddress" />
+ </class>
+ <class name="android/telephony/TelephonyManager" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getAllCellInfo()Ljava/util/List;" since="17" />
+ <method name="getCallState()I" />
+ <method name="getCellLocation()Landroid/telephony/CellLocation;" />
+ <method name="getDataActivity()I" />
+ <method name="getDataState()I" />
+ <method name="getDeviceId()Ljava/lang/String;" />
+ <method name="getDeviceSoftwareVersion()Ljava/lang/String;" />
+ <method name="getGroupIdLevel1()Ljava/lang/String;" since="18" />
+ <method name="getLine1Number()Ljava/lang/String;" />
+ <method name="getMmsUAProfUrl()Ljava/lang/String;" since="19" />
+ <method name="getMmsUserAgent()Ljava/lang/String;" since="19" />
+ <method name="getNeighboringCellInfo()Ljava/util/List;" since="3" />
+ <method name="getNetworkCountryIso()Ljava/lang/String;" />
+ <method name="getNetworkOperator()Ljava/lang/String;" />
+ <method name="getNetworkOperatorName()Ljava/lang/String;" />
+ <method name="getNetworkType()I" />
+ <method name="getPhoneType()I" />
+ <method name="getSimCountryIso()Ljava/lang/String;" />
+ <method name="getSimOperator()Ljava/lang/String;" />
+ <method name="getSimOperatorName()Ljava/lang/String;" />
+ <method name="getSimSerialNumber()Ljava/lang/String;" />
+ <method name="getSimState()I" />
+ <method name="getSubscriberId()Ljava/lang/String;" />
+ <method name="getVoiceMailAlphaTag()Ljava/lang/String;" />
+ <method name="getVoiceMailNumber()Ljava/lang/String;" />
+ <method name="hasIccCard()Z" since="5" />
+ <method name="iccCloseLogicalChannel(I)Z" since="21" />
+ <method name="iccExchangeSimIO(IIIIILjava/lang/String;)[B" since="21" />
+ <method name="iccOpenLogicalChannel(Ljava/lang/String;)Landroid/telephony/IccOpenLogicalChannelResponse;" since="21" />
+ <method name="iccTransmitApduBasicChannel(IIIIILjava/lang/String;)Ljava/lang/String;" since="21" />
+ <method name="iccTransmitApduLogicalChannel(IIIIIILjava/lang/String;)Ljava/lang/String;" since="21" />
+ <method name="isNetworkRoaming()Z" />
+ <method name="isSmsCapable()Z" since="21" />
+ <method name="listen(Landroid/telephony/PhoneStateListener;I)V" />
+ <method name="sendEnvelopeWithStatus(Ljava/lang/String;)Ljava/lang/String;" since="21" />
+ <field name="ACTION_PHONE_STATE_CHANGED" since="3" />
+ <field name="ACTION_RESPOND_VIA_MESSAGE" since="18" />
+ <field name="CALL_STATE_IDLE" />
+ <field name="CALL_STATE_OFFHOOK" />
+ <field name="CALL_STATE_RINGING" />
+ <field name="DATA_ACTIVITY_DORMANT" since="4" />
+ <field name="DATA_ACTIVITY_IN" />
+ <field name="DATA_ACTIVITY_INOUT" />
+ <field name="DATA_ACTIVITY_NONE" />
+ <field name="DATA_ACTIVITY_OUT" />
+ <field name="DATA_CONNECTED" />
+ <field name="DATA_CONNECTING" />
+ <field name="DATA_DISCONNECTED" />
+ <field name="DATA_SUSPENDED" />
+ <field name="EXTRA_INCOMING_NUMBER" since="3" />
+ <field name="EXTRA_STATE" since="3" />
+ <field name="EXTRA_STATE_IDLE" since="3" />
+ <field name="EXTRA_STATE_OFFHOOK" since="3" />
+ <field name="EXTRA_STATE_RINGING" since="3" />
+ <field name="NETWORK_TYPE_1xRTT" since="4" />
+ <field name="NETWORK_TYPE_CDMA" since="4" />
+ <field name="NETWORK_TYPE_EDGE" />
+ <field name="NETWORK_TYPE_EHRPD" since="11" />
+ <field name="NETWORK_TYPE_EVDO_0" since="4" />
+ <field name="NETWORK_TYPE_EVDO_A" since="4" />
+ <field name="NETWORK_TYPE_EVDO_B" since="9" />
+ <field name="NETWORK_TYPE_GPRS" />
+ <field name="NETWORK_TYPE_HSDPA" since="5" />
+ <field name="NETWORK_TYPE_HSPA" since="5" />
+ <field name="NETWORK_TYPE_HSPAP" since="13" />
+ <field name="NETWORK_TYPE_HSUPA" since="5" />
+ <field name="NETWORK_TYPE_IDEN" since="8" />
+ <field name="NETWORK_TYPE_LTE" since="11" />
+ <field name="NETWORK_TYPE_UMTS" />
+ <field name="NETWORK_TYPE_UNKNOWN" />
+ <field name="PHONE_TYPE_CDMA" since="4" />
+ <field name="PHONE_TYPE_GSM" />
+ <field name="PHONE_TYPE_NONE" />
+ <field name="PHONE_TYPE_SIP" since="11" />
+ <field name="SIM_STATE_ABSENT" />
+ <field name="SIM_STATE_NETWORK_LOCKED" />
+ <field name="SIM_STATE_PIN_REQUIRED" />
+ <field name="SIM_STATE_PUK_REQUIRED" />
+ <field name="SIM_STATE_READY" />
+ <field name="SIM_STATE_UNKNOWN" />
+ </class>
+ <class name="android/telephony/cdma/CdmaCellLocation" since="5">
+ <extends name="android/telephony/CellLocation" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/os/Bundle;)V" />
+ <method name="convertQuartSecToDecDegrees(I)D" since="17" />
+ <method name="fillInNotifierBundle(Landroid/os/Bundle;)V" />
+ <method name="getBaseStationId()I" />
+ <method name="getBaseStationLatitude()I" />
+ <method name="getBaseStationLongitude()I" />
+ <method name="getNetworkId()I" />
+ <method name="getSystemId()I" />
+ <method name="setCellLocationData(III)V" />
+ <method name="setCellLocationData(IIIII)V" />
+ <method name="setStateInvalid()V" />
+ </class>
+ <class name="android/telephony/gsm/GsmCellLocation" since="1">
+ <extends name="android/telephony/CellLocation" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/os/Bundle;)V" />
+ <method name="fillInNotifierBundle(Landroid/os/Bundle;)V" />
+ <method name="getCid()I" />
+ <method name="getLac()I" />
+ <method name="getPsc()I" since="9" />
+ <method name="setLacAndCid(II)V" />
+ <method name="setStateInvalid()V" />
+ </class>
+ <class name="android/telephony/gsm/SmsManager" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="divideMessage(Ljava/lang/String;)Ljava/util/ArrayList;" />
+ <method name="getDefault()Landroid/telephony/gsm/SmsManager;" />
+ <method name="sendDataMessage(Ljava/lang/String;Ljava/lang/String;S[BLandroid/app/PendingIntent;Landroid/app/PendingIntent;)V" />
+ <method name="sendMultipartTextMessage(Ljava/lang/String;Ljava/lang/String;Ljava/util/ArrayList;Ljava/util/ArrayList;Ljava/util/ArrayList;)V" />
+ <method name="sendTextMessage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/app/PendingIntent;Landroid/app/PendingIntent;)V" />
+ <field name="RESULT_ERROR_GENERIC_FAILURE" />
+ <field name="RESULT_ERROR_NO_SERVICE" />
+ <field name="RESULT_ERROR_NULL_PDU" />
+ <field name="RESULT_ERROR_RADIO_OFF" />
+ <field name="STATUS_ON_SIM_FREE" />
+ <field name="STATUS_ON_SIM_READ" />
+ <field name="STATUS_ON_SIM_SENT" />
+ <field name="STATUS_ON_SIM_UNREAD" />
+ <field name="STATUS_ON_SIM_UNSENT" />
+ </class>
+ <class name="android/telephony/gsm/SmsMessage" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="calculateLength(Ljava/lang/CharSequence;Z)[I" since="3" />
+ <method name="calculateLength(Ljava/lang/String;Z)[I" />
+ <method name="createFromPdu([B)Landroid/telephony/gsm/SmsMessage;" />
+ <method name="getDisplayMessageBody()Ljava/lang/String;" />
+ <method name="getDisplayOriginatingAddress()Ljava/lang/String;" />
+ <method name="getEmailBody()Ljava/lang/String;" />
+ <method name="getEmailFrom()Ljava/lang/String;" />
+ <method name="getIndexOnSim()I" />
+ <method name="getMessageBody()Ljava/lang/String;" />
+ <method name="getMessageClass()Landroid/telephony/gsm/SmsMessage$MessageClass;" />
+ <method name="getOriginatingAddress()Ljava/lang/String;" />
+ <method name="getPdu()[B" />
+ <method name="getProtocolIdentifier()I" />
+ <method name="getPseudoSubject()Ljava/lang/String;" />
+ <method name="getServiceCenterAddress()Ljava/lang/String;" />
+ <method name="getStatus()I" />
+ <method name="getStatusOnSim()I" />
+ <method name="getSubmitPdu(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)Landroid/telephony/gsm/SmsMessage$SubmitPdu;" />
+ <method name="getSubmitPdu(Ljava/lang/String;Ljava/lang/String;S[BZ)Landroid/telephony/gsm/SmsMessage$SubmitPdu;" />
+ <method name="getTPLayerLengthForPDU(Ljava/lang/String;)I" />
+ <method name="getTimestampMillis()J" />
+ <method name="getUserData()[B" />
+ <method name="isCphsMwiMessage()Z" />
+ <method name="isEmail()Z" />
+ <method name="isMWIClearMessage()Z" />
+ <method name="isMWISetMessage()Z" />
+ <method name="isMwiDontStore()Z" />
+ <method name="isReplace()Z" />
+ <method name="isReplyPathPresent()Z" />
+ <method name="isStatusReportMessage()Z" />
+ <field name="ENCODING_16BIT" />
+ <field name="ENCODING_7BIT" />
+ <field name="ENCODING_8BIT" />
+ <field name="ENCODING_UNKNOWN" />
+ <field name="MAX_USER_DATA_BYTES" />
+ <field name="MAX_USER_DATA_SEPTETS" />
+ <field name="MAX_USER_DATA_SEPTETS_WITH_HEADER" />
+ </class>
+ <class name="android/telephony/gsm/SmsMessage$MessageClass" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/telephony/gsm/SmsMessage$MessageClass;" />
+ <method name="values()[Landroid/telephony/gsm/SmsMessage$MessageClass;" />
+ <field name="CLASS_0" />
+ <field name="CLASS_1" />
+ <field name="CLASS_2" />
+ <field name="CLASS_3" />
+ <field name="UNKNOWN" />
+ </class>
+ <class name="android/telephony/gsm/SmsMessage$SubmitPdu" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="encodedMessage" />
+ <field name="encodedScAddress" />
+ </class>
+ <class name="android/test/ActivityInstrumentationTestCase" since="1">
+ <extends name="android/test/ActivityTestCase" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Class;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Class;Z)V" />
+ <method name="testActivityTestCaseSetUpProperly()V" />
+ </class>
+ <class name="android/test/ActivityInstrumentationTestCase2" since="3">
+ <extends name="android/test/ActivityTestCase" />
+ <method name="&lt;init>(Ljava/lang/Class;)V" since="8" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Class;)V" />
+ <method name="setActivityInitialTouchMode(Z)V" />
+ <method name="setActivityIntent(Landroid/content/Intent;)V" />
+ </class>
+ <class name="android/test/ActivityTestCase" since="1">
+ <extends name="android/test/InstrumentationTestCase" />
+ <method name="&lt;init>()V" />
+ <method name="getActivity()Landroid/app/Activity;" />
+ <method name="scrubClass(Ljava/lang/Class;)V" />
+ <method name="setActivity(Landroid/app/Activity;)V" />
+ </class>
+ <class name="android/test/ActivityUnitTestCase" since="1">
+ <extends name="android/test/ActivityTestCase" />
+ <method name="&lt;init>(Ljava/lang/Class;)V" />
+ <method name="getFinishedActivityRequest()I" />
+ <method name="getRequestedOrientation()I" />
+ <method name="getStartedActivityIntent()Landroid/content/Intent;" />
+ <method name="getStartedActivityRequest()I" />
+ <method name="isFinishCalled()Z" />
+ <method name="setActivityContext(Landroid/content/Context;)V" />
+ <method name="setApplication(Landroid/app/Application;)V" />
+ <method name="startActivity(Landroid/content/Intent;Landroid/os/Bundle;Ljava/lang/Object;)Landroid/app/Activity;" />
+ </class>
+ <class name="android/test/AndroidTestCase" since="1">
+ <extends name="junit/framework/TestCase" />
+ <method name="&lt;init>()V" />
+ <method name="assertActivityRequiresPermission(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" since="4" />
+ <method name="assertReadingContentUriRequiresPermission(Landroid/net/Uri;Ljava/lang/String;)V" since="4" />
+ <method name="assertWritingContentUriRequiresPermission(Landroid/net/Uri;Ljava/lang/String;)V" since="4" />
+ <method name="getContext()Landroid/content/Context;" />
+ <method name="scrubClass(Ljava/lang/Class;)V" />
+ <method name="setContext(Landroid/content/Context;)V" />
+ <method name="testAndroidTestCaseSetupProperly()V" />
+ <field name="mContext" />
+ </class>
+ <class name="android/test/AndroidTestRunner" since="1">
+ <extends name="junit/runner/BaseTestRunner" />
+ <method name="&lt;init>()V" />
+ <method name="addTestListener(Ljunit/framework/TestListener;)V" />
+ <method name="clearTestListeners()V" />
+ <method name="createTestResult()Ljunit/framework/TestResult;" />
+ <method name="getTestCases()Ljava/util/List;" />
+ <method name="getTestClassName()Ljava/lang/String;" />
+ <method name="getTestResult()Ljunit/framework/TestResult;" />
+ <method name="runTest()V" />
+ <method name="runTest(Ljunit/framework/TestResult;)V" />
+ <method name="setContext(Landroid/content/Context;)V" />
+ <method name="setInstrumentaiton(Landroid/app/Instrumentation;)V" />
+ <method name="setInstrumentation(Landroid/app/Instrumentation;)V" since="5" />
+ <method name="setTest(Ljunit/framework/Test;)V" />
+ <method name="setTestClassName(Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="android/test/ApplicationTestCase" since="1">
+ <extends name="android/test/AndroidTestCase" />
+ <method name="&lt;init>(Ljava/lang/Class;)V" />
+ <method name="createApplication()V" />
+ <method name="getApplication()Landroid/app/Application;" />
+ <method name="getSystemContext()Landroid/content/Context;" />
+ <method name="terminateApplication()V" />
+ <method name="testApplicationTestCaseSetUpProperly()V" />
+ </class>
+ <class name="android/test/AssertionFailedError" since="1">
+ <extends name="java/lang/Error" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/test/ComparisonFailure" since="1">
+ <extends name="android/test/AssertionFailedError" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="android/test/FlakyTest" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/annotation/Annotation" />
+ <method name="tolerance()I" />
+ </class>
+ <class name="android/test/InstrumentationTestCase" since="1">
+ <extends name="junit/framework/TestCase" />
+ <method name="&lt;init>()V" />
+ <method name="getInstrumentation()Landroid/app/Instrumentation;" />
+ <method name="injectInsrumentation(Landroid/app/Instrumentation;)V" />
+ <method name="injectInstrumentation(Landroid/app/Instrumentation;)V" since="5" />
+ <method name="launchActivity(Ljava/lang/String;Ljava/lang/Class;Landroid/os/Bundle;)Landroid/app/Activity;" />
+ <method name="launchActivityWithIntent(Ljava/lang/String;Ljava/lang/Class;Landroid/content/Intent;)Landroid/app/Activity;" since="3" />
+ <method name="runTestOnUiThread(Ljava/lang/Runnable;)V" since="3" />
+ <method name="sendKeys(Ljava/lang/String;)V" />
+ <method name="sendKeys([I)V" />
+ <method name="sendRepeatedKeys([I)V" />
+ </class>
+ <class name="android/test/InstrumentationTestRunner" since="1">
+ <extends name="android/app/Instrumentation" />
+ <implements name="android/test/TestSuiteProvider" />
+ <method name="&lt;init>()V" />
+ <method name="getAllTests()Ljunit/framework/TestSuite;" />
+ <method name="getAndroidTestRunner()Landroid/test/AndroidTestRunner;" />
+ <method name="getArguments()Landroid/os/Bundle;" since="18" />
+ <method name="getLoader()Ljava/lang/ClassLoader;" />
+ <field name="REPORT_KEY_NAME_CLASS" />
+ <field name="REPORT_KEY_NAME_TEST" />
+ <field name="REPORT_KEY_NUM_CURRENT" />
+ <field name="REPORT_KEY_NUM_TOTAL" />
+ <field name="REPORT_KEY_STACK" />
+ <field name="REPORT_VALUE_ID" />
+ <field name="REPORT_VALUE_RESULT_ERROR" />
+ <field name="REPORT_VALUE_RESULT_FAILURE" />
+ <field name="REPORT_VALUE_RESULT_OK" />
+ <field name="REPORT_VALUE_RESULT_START" />
+ </class>
+ <class name="android/test/InstrumentationTestSuite" since="1">
+ <extends name="junit/framework/TestSuite" />
+ <method name="&lt;init>(Landroid/app/Instrumentation;)V" />
+ <method name="&lt;init>(Ljava/lang/Class;Landroid/app/Instrumentation;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Landroid/app/Instrumentation;)V" />
+ </class>
+ <class name="android/test/IsolatedContext" since="1">
+ <extends name="android/content/ContextWrapper" />
+ <method name="&lt;init>(Landroid/content/ContentResolver;Landroid/content/Context;)V" />
+ <method name="getAndClearBroadcastIntents()Ljava/util/List;" />
+ </class>
+ <class name="android/test/LoaderTestCase" since="11">
+ <extends name="android/test/AndroidTestCase" />
+ <method name="&lt;init>()V" />
+ <method name="getLoaderResultSynchronously(Landroid/content/Loader;)Ljava/lang/Object;" />
+ </class>
+ <class name="android/test/MoreAsserts" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="assertAssignableFrom(Ljava/lang/Class;Ljava/lang/Class;)V" />
+ <method name="assertAssignableFrom(Ljava/lang/Class;Ljava/lang/Object;)V" />
+ <method name="assertContainsRegex(Ljava/lang/String;Ljava/lang/String;)Ljava/util/regex/MatchResult;" />
+ <method name="assertContainsRegex(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/util/regex/MatchResult;" />
+ <method name="assertContentsInAnyOrder(Ljava/lang/Iterable;[Ljava/lang/Object;)V" />
+ <method name="assertContentsInAnyOrder(Ljava/lang/String;Ljava/lang/Iterable;[Ljava/lang/Object;)V" />
+ <method name="assertContentsInOrder(Ljava/lang/Iterable;[Ljava/lang/Object;)V" />
+ <method name="assertContentsInOrder(Ljava/lang/String;Ljava/lang/Iterable;[Ljava/lang/Object;)V" />
+ <method name="assertEmpty(Ljava/lang/Iterable;)V" />
+ <method name="assertEmpty(Ljava/lang/String;Ljava/lang/Iterable;)V" />
+ <method name="assertEmpty(Ljava/lang/String;Ljava/util/Map;)V" />
+ <method name="assertEmpty(Ljava/util/Map;)V" />
+ <method name="assertEquals(Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;)V" />
+ <method name="assertEquals(Ljava/lang/String;[B[B)V" />
+ <method name="assertEquals(Ljava/lang/String;[D[D)V" />
+ <method name="assertEquals(Ljava/lang/String;[I[I)V" />
+ <method name="assertEquals(Ljava/lang/String;[Ljava/lang/Object;[Ljava/lang/Object;)V" />
+ <method name="assertEquals(Ljava/util/Set;Ljava/util/Set;)V" />
+ <method name="assertEquals([B[B)V" />
+ <method name="assertEquals([D[D)V" />
+ <method name="assertEquals([I[I)V" />
+ <method name="assertEquals([Ljava/lang/Object;[Ljava/lang/Object;)V" />
+ <method name="assertMatchesRegex(Ljava/lang/String;Ljava/lang/String;)Ljava/util/regex/MatchResult;" />
+ <method name="assertMatchesRegex(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/util/regex/MatchResult;" />
+ <method name="assertNotContainsRegex(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="assertNotContainsRegex(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="assertNotEmpty(Ljava/lang/Iterable;)V" />
+ <method name="assertNotEmpty(Ljava/lang/String;Ljava/lang/Iterable;)V" />
+ <method name="assertNotEmpty(Ljava/lang/String;Ljava/util/Map;)V" />
+ <method name="assertNotEmpty(Ljava/util/Map;)V" />
+ <method name="assertNotEqual(Ljava/lang/Object;Ljava/lang/Object;)V" />
+ <method name="assertNotEqual(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V" />
+ <method name="assertNotMatchesRegex(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="assertNotMatchesRegex(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="checkEqualsAndHashCodeMethods(Ljava/lang/Object;Ljava/lang/Object;Z)V" />
+ <method name="checkEqualsAndHashCodeMethods(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;Z)V" />
+ </class>
+ <class name="android/test/PerformanceTestCase" since="1">
+ <extends name="java/lang/Object" />
+ <method name="isPerformanceOnly()Z" />
+ <method name="startPerformance(Landroid/test/PerformanceTestCase$Intermediates;)I" />
+ </class>
+ <class name="android/test/PerformanceTestCase$Intermediates" since="1">
+ <extends name="java/lang/Object" />
+ <method name="addIntermediate(Ljava/lang/String;)V" />
+ <method name="addIntermediate(Ljava/lang/String;J)V" />
+ <method name="finishTiming(Z)V" />
+ <method name="setInternalIterations(I)V" />
+ <method name="startTiming(Z)V" />
+ </class>
+ <class name="android/test/ProviderTestCase" since="1">
+ <extends name="android/test/InstrumentationTestCase" />
+ <method name="&lt;init>(Ljava/lang/Class;Ljava/lang/String;)V" />
+ <method name="getMockContentResolver()Landroid/test/mock/MockContentResolver;" />
+ <method name="getMockContext()Landroid/test/IsolatedContext;" />
+ <method name="getProvider()Landroid/content/ContentProvider;" />
+ <method name="newResolverWithContentProviderFromSql(Landroid/content/Context;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)Landroid/content/ContentResolver;" />
+ </class>
+ <class name="android/test/ProviderTestCase2" since="3">
+ <extends name="android/test/AndroidTestCase" />
+ <method name="&lt;init>(Ljava/lang/Class;Ljava/lang/String;)V" />
+ <method name="getMockContentResolver()Landroid/test/mock/MockContentResolver;" />
+ <method name="getMockContext()Landroid/test/IsolatedContext;" />
+ <method name="getProvider()Landroid/content/ContentProvider;" />
+ <method name="newResolverWithContentProviderFromSql(Landroid/content/Context;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)Landroid/content/ContentResolver;" />
+ </class>
+ <class name="android/test/RenamingDelegatingContext" since="1">
+ <extends name="android/content/ContextWrapper" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/content/Context;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Ljava/lang/String;)V" />
+ <method name="getDatabasePrefix()Ljava/lang/String;" />
+ <method name="makeExistingFilesAndDbsAccessible()V" />
+ <method name="providerWithRenamedContext(Ljava/lang/Class;Landroid/content/Context;Ljava/lang/String;)Landroid/content/ContentProvider;" />
+ <method name="providerWithRenamedContext(Ljava/lang/Class;Landroid/content/Context;Ljava/lang/String;Z)Landroid/content/ContentProvider;" />
+ </class>
+ <class name="android/test/ServiceTestCase" since="1">
+ <extends name="android/test/AndroidTestCase" />
+ <method name="&lt;init>(Ljava/lang/Class;)V" />
+ <method name="bindService(Landroid/content/Intent;)Landroid/os/IBinder;" />
+ <method name="getApplication()Landroid/app/Application;" />
+ <method name="getService()Landroid/app/Service;" />
+ <method name="getSystemContext()Landroid/content/Context;" />
+ <method name="setApplication(Landroid/app/Application;)V" />
+ <method name="setupService()V" />
+ <method name="shutdownService()V" />
+ <method name="startService(Landroid/content/Intent;)V" />
+ <method name="testServiceTestCaseSetUpProperly()V" />
+ </class>
+ <class name="android/test/SingleLaunchActivityTestCase" since="1">
+ <extends name="android/test/InstrumentationTestCase" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Class;)V" />
+ <method name="getActivity()Landroid/app/Activity;" />
+ <method name="testActivityTestCaseSetUpProperly()V" />
+ </class>
+ <class name="android/test/SyncBaseInstrumentation" since="1">
+ <extends name="android/test/InstrumentationTestCase" />
+ <method name="&lt;init>()V" />
+ <method name="cancelSyncsandDisableAutoSync()V" />
+ <method name="syncProvider(Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="android/test/TestSuiteProvider" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getTestSuite()Ljunit/framework/TestSuite;" />
+ </class>
+ <class name="android/test/TouchUtils" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="clickView(Landroid/test/InstrumentationTestCase;Landroid/view/View;)V" />
+ <method name="drag(Landroid/test/ActivityInstrumentationTestCase;FFFFI)V" />
+ <method name="drag(Landroid/test/InstrumentationTestCase;FFFFI)V" since="3" />
+ <method name="dragQuarterScreenDown(Landroid/test/ActivityInstrumentationTestCase;)V" />
+ <method name="dragQuarterScreenDown(Landroid/test/InstrumentationTestCase;Landroid/app/Activity;)V" since="3" />
+ <method name="dragQuarterScreenUp(Landroid/test/ActivityInstrumentationTestCase;)V" />
+ <method name="dragQuarterScreenUp(Landroid/test/InstrumentationTestCase;Landroid/app/Activity;)V" since="3" />
+ <method name="dragViewBy(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/View;III)I" />
+ <method name="dragViewBy(Landroid/test/InstrumentationTestCase;Landroid/view/View;III)I" since="3" />
+ <method name="dragViewTo(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/View;III)I" />
+ <method name="dragViewTo(Landroid/test/InstrumentationTestCase;Landroid/view/View;III)I" since="3" />
+ <method name="dragViewToBottom(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/View;)V" />
+ <method name="dragViewToBottom(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/View;I)V" />
+ <method name="dragViewToBottom(Landroid/test/InstrumentationTestCase;Landroid/app/Activity;Landroid/view/View;)V" since="3" />
+ <method name="dragViewToBottom(Landroid/test/InstrumentationTestCase;Landroid/app/Activity;Landroid/view/View;I)V" since="3" />
+ <method name="dragViewToTop(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/View;)V" />
+ <method name="dragViewToTop(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/View;I)V" />
+ <method name="dragViewToTop(Landroid/test/InstrumentationTestCase;Landroid/view/View;)V" since="3" />
+ <method name="dragViewToTop(Landroid/test/InstrumentationTestCase;Landroid/view/View;I)V" since="3" />
+ <method name="dragViewToX(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/View;II)I" />
+ <method name="dragViewToX(Landroid/test/InstrumentationTestCase;Landroid/view/View;II)I" since="3" />
+ <method name="dragViewToY(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/View;II)I" />
+ <method name="dragViewToY(Landroid/test/InstrumentationTestCase;Landroid/view/View;II)I" since="3" />
+ <method name="longClickView(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/View;)V" />
+ <method name="longClickView(Landroid/test/InstrumentationTestCase;Landroid/view/View;)V" since="3" />
+ <method name="scrollToBottom(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/ViewGroup;)V" />
+ <method name="scrollToBottom(Landroid/test/InstrumentationTestCase;Landroid/app/Activity;Landroid/view/ViewGroup;)V" since="3" />
+ <method name="scrollToTop(Landroid/test/ActivityInstrumentationTestCase;Landroid/view/ViewGroup;)V" />
+ <method name="scrollToTop(Landroid/test/InstrumentationTestCase;Landroid/app/Activity;Landroid/view/ViewGroup;)V" since="3" />
+ <method name="tapView(Landroid/test/InstrumentationTestCase;Landroid/view/View;)V" />
+ <method name="touchAndCancelView(Landroid/test/InstrumentationTestCase;Landroid/view/View;)V" />
+ </class>
+ <class name="android/test/UiThreadTest" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/annotation/Annotation" />
+ </class>
+ <class name="android/test/ViewAsserts" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="assertBaselineAligned(Landroid/view/View;Landroid/view/View;)V" />
+ <method name="assertBottomAligned(Landroid/view/View;Landroid/view/View;)V" />
+ <method name="assertBottomAligned(Landroid/view/View;Landroid/view/View;I)V" />
+ <method name="assertGroupContains(Landroid/view/ViewGroup;Landroid/view/View;)V" />
+ <method name="assertGroupIntegrity(Landroid/view/ViewGroup;)V" />
+ <method name="assertGroupNotContains(Landroid/view/ViewGroup;Landroid/view/View;)V" />
+ <method name="assertHasScreenCoordinates(Landroid/view/View;Landroid/view/View;II)V" />
+ <method name="assertHorizontalCenterAligned(Landroid/view/View;Landroid/view/View;)V" />
+ <method name="assertLeftAligned(Landroid/view/View;Landroid/view/View;)V" />
+ <method name="assertLeftAligned(Landroid/view/View;Landroid/view/View;I)V" />
+ <method name="assertOffScreenAbove(Landroid/view/View;Landroid/view/View;)V" />
+ <method name="assertOffScreenBelow(Landroid/view/View;Landroid/view/View;)V" />
+ <method name="assertOnScreen(Landroid/view/View;Landroid/view/View;)V" />
+ <method name="assertRightAligned(Landroid/view/View;Landroid/view/View;)V" />
+ <method name="assertRightAligned(Landroid/view/View;Landroid/view/View;I)V" />
+ <method name="assertTopAligned(Landroid/view/View;Landroid/view/View;)V" />
+ <method name="assertTopAligned(Landroid/view/View;Landroid/view/View;I)V" />
+ <method name="assertVerticalCenterAligned(Landroid/view/View;Landroid/view/View;)V" />
+ </class>
+ <class name="android/test/mock/MockApplication" since="1">
+ <extends name="android/app/Application" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/test/mock/MockContentProvider" since="8">
+ <extends name="android/content/ContentProvider" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;[Landroid/content/pm/PathPermission;)V" />
+ </class>
+ <class name="android/test/mock/MockContentResolver" since="1">
+ <extends name="android/content/ContentResolver" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/Context;)V" since="18" />
+ <method name="addProvider(Ljava/lang/String;Landroid/content/ContentProvider;)V" />
+ </class>
+ <class name="android/test/mock/MockContext" since="1">
+ <extends name="android/content/Context" />
+ <method name="&lt;init>()V" />
+ <method name="getPackageCodePath()Ljava/lang/String;" />
+ <method name="getPackageResourcePath()Ljava/lang/String;" />
+ </class>
+ <class name="android/test/mock/MockCursor" since="8">
+ <extends name="java/lang/Object" />
+ <implements name="android/database/Cursor" />
+ <method name="&lt;init>()V" />
+ <method name="abortUpdates()V" />
+ <method name="commitUpdates()Z" />
+ <method name="commitUpdates(Ljava/util/Map;)Z" />
+ <method name="deleteRow()Z" />
+ <method name="hasUpdates()Z" />
+ <method name="supportsUpdates()Z" />
+ <method name="updateBlob(I[B)Z" />
+ <method name="updateDouble(ID)Z" />
+ <method name="updateFloat(IF)Z" />
+ <method name="updateInt(II)Z" />
+ <method name="updateLong(IJ)Z" />
+ <method name="updateShort(IS)Z" />
+ <method name="updateString(ILjava/lang/String;)Z" />
+ <method name="updateToNull(I)Z" />
+ </class>
+ <class name="android/test/mock/MockDialogInterface" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/content/DialogInterface" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/test/mock/MockPackageManager" since="1">
+ <extends name="android/content/pm/PackageManager" />
+ <method name="&lt;init>()V" />
+ <method name="setPackageObbPath(Ljava/lang/String;Ljava/lang/String;)V" since="9" />
+ </class>
+ <class name="android/test/mock/MockResources" since="1">
+ <extends name="android/content/res/Resources" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/test/suitebuilder/TestMethod" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Class;)V" since="3" />
+ <method name="&lt;init>(Ljava/lang/reflect/Method;Ljava/lang/Class;)V" />
+ <method name="&lt;init>(Ljunit/framework/TestCase;)V" since="3" />
+ <method name="createTest()Ljunit/framework/TestCase;" />
+ <method name="getAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;" />
+ <method name="getEnclosingClass()Ljava/lang/Class;" />
+ <method name="getEnclosingClassname()Ljava/lang/String;" />
+ <method name="getName()Ljava/lang/String;" />
+ </class>
+ <class name="android/test/suitebuilder/TestSuiteBuilder" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/Class;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/ClassLoader;)V" />
+ <method name="addRequirements(Ljava/util/List;)Landroid/test/suitebuilder/TestSuiteBuilder;" />
+ <method name="addRequirements([Lcom/android/internal/util/Predicate;)Landroid/test/suitebuilder/TestSuiteBuilder;" />
+ <method name="build()Ljunit/framework/TestSuite;" />
+ <method name="excludePackages([Ljava/lang/String;)Landroid/test/suitebuilder/TestSuiteBuilder;" />
+ <method name="getSuiteName()Ljava/lang/String;" />
+ <method name="includeAllPackagesUnderHere()Landroid/test/suitebuilder/TestSuiteBuilder;" />
+ <method name="includePackages([Ljava/lang/String;)Landroid/test/suitebuilder/TestSuiteBuilder;" />
+ <method name="named(Ljava/lang/String;)Landroid/test/suitebuilder/TestSuiteBuilder;" />
+ </class>
+ <class name="android/test/suitebuilder/TestSuiteBuilder$FailedToCreateTests" since="1">
+ <extends name="junit/framework/TestCase" />
+ <method name="&lt;init>(Ljava/lang/Exception;)V" />
+ <method name="testSuiteConstructionFailed()V" />
+ </class>
+ <class name="android/test/suitebuilder/annotation/LargeTest" since="2">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/annotation/Annotation" />
+ </class>
+ <class name="android/test/suitebuilder/annotation/MediumTest" since="2">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/annotation/Annotation" />
+ </class>
+ <class name="android/test/suitebuilder/annotation/SmallTest" since="2">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/annotation/Annotation" />
+ </class>
+ <class name="android/test/suitebuilder/annotation/Smoke" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/annotation/Annotation" />
+ </class>
+ <class name="android/test/suitebuilder/annotation/Suppress" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/annotation/Annotation" />
+ </class>
+ <class name="android/text/AlteredCharSequence" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/GetChars" />
+ <implements name="java/lang/CharSequence" />
+ <method name="&lt;init>()V" />
+ <method name="make(Ljava/lang/CharSequence;[CII)Landroid/text/AlteredCharSequence;" />
+ </class>
+ <class name="android/text/AndroidCharacter" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getDirectionalities([C[BI)V" />
+ <method name="getEastAsianWidth(C)I" since="8" />
+ <method name="getEastAsianWidths([CII[B)V" since="8" />
+ <method name="getMirror(C)C" />
+ <method name="mirror([CII)Z" />
+ <field name="EAST_ASIAN_WIDTH_AMBIGUOUS" since="8" />
+ <field name="EAST_ASIAN_WIDTH_FULL_WIDTH" since="8" />
+ <field name="EAST_ASIAN_WIDTH_HALF_WIDTH" since="8" />
+ <field name="EAST_ASIAN_WIDTH_NARROW" since="8" />
+ <field name="EAST_ASIAN_WIDTH_NEUTRAL" since="8" />
+ <field name="EAST_ASIAN_WIDTH_WIDE" since="8" />
+ </class>
+ <class name="android/text/Annotation" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/ParcelableSpan" since="3" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="getKey()Ljava/lang/String;" />
+ <method name="getValue()Ljava/lang/String;" />
+ </class>
+ <class name="android/text/AutoText" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="get(Ljava/lang/CharSequence;IILandroid/view/View;)Ljava/lang/String;" />
+ <method name="getSize(Landroid/view/View;)I" since="3" />
+ </class>
+ <class name="android/text/BidiFormatter" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getInstance()Landroid/text/BidiFormatter;" />
+ <method name="getInstance(Ljava/util/Locale;)Landroid/text/BidiFormatter;" />
+ <method name="getInstance(Z)Landroid/text/BidiFormatter;" />
+ <method name="getStereoReset()Z" />
+ <method name="isRtl(Ljava/lang/String;)Z" />
+ <method name="isRtlContext()Z" />
+ <method name="unicodeWrap(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="unicodeWrap(Ljava/lang/String;Landroid/text/TextDirectionHeuristic;)Ljava/lang/String;" />
+ <method name="unicodeWrap(Ljava/lang/String;Landroid/text/TextDirectionHeuristic;Z)Ljava/lang/String;" />
+ <method name="unicodeWrap(Ljava/lang/String;Z)Ljava/lang/String;" />
+ </class>
+ <class name="android/text/BidiFormatter$Builder" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/util/Locale;)V" />
+ <method name="&lt;init>(Z)V" />
+ <method name="build()Landroid/text/BidiFormatter;" />
+ <method name="setTextDirectionHeuristic(Landroid/text/TextDirectionHeuristic;)Landroid/text/BidiFormatter$Builder;" />
+ <method name="stereoReset(Z)Landroid/text/BidiFormatter$Builder;" />
+ </class>
+ <class name="android/text/BoringLayout" since="1">
+ <extends name="android/text/Layout" />
+ <implements name="android/text/TextUtils$EllipsizeCallback" />
+ <method name="&lt;init>(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;Z)V" />
+ <method name="&lt;init>(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;ZLandroid/text/TextUtils$TruncateAt;I)V" />
+ <method name="isBoring(Ljava/lang/CharSequence;Landroid/text/TextPaint;)Landroid/text/BoringLayout$Metrics;" />
+ <method name="isBoring(Ljava/lang/CharSequence;Landroid/text/TextPaint;Landroid/text/BoringLayout$Metrics;)Landroid/text/BoringLayout$Metrics;" />
+ <method name="make(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;Z)Landroid/text/BoringLayout;" />
+ <method name="make(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;ZLandroid/text/TextUtils$TruncateAt;I)Landroid/text/BoringLayout;" />
+ <method name="replaceOrMake(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;Z)Landroid/text/BoringLayout;" />
+ <method name="replaceOrMake(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;ZLandroid/text/TextUtils$TruncateAt;I)Landroid/text/BoringLayout;" />
+ </class>
+ <class name="android/text/BoringLayout$Metrics" since="1">
+ <extends name="android/graphics/Paint$FontMetricsInt" />
+ <method name="&lt;init>()V" />
+ <field name="width" />
+ </class>
+ <class name="android/text/ClipboardManager" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getText()Ljava/lang/CharSequence;" />
+ <method name="hasText()Z" />
+ <method name="setText(Ljava/lang/CharSequence;)V" />
+ </class>
+ <class name="android/text/DynamicLayout" since="1">
+ <extends name="android/text/Layout" />
+ <method name="&lt;init>(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFZ)V" />
+ <method name="&lt;init>(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFZ)V" />
+ <method name="&lt;init>(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFZLandroid/text/TextUtils$TruncateAt;I)V" />
+ </class>
+ <class name="android/text/Editable" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/GetChars" />
+ <implements name="android/text/Spannable" />
+ <implements name="java/lang/Appendable" />
+ <implements name="java/lang/CharSequence" />
+ <method name="append(C)Landroid/text/Editable;" />
+ <method name="append(Ljava/lang/CharSequence;)Landroid/text/Editable;" />
+ <method name="append(Ljava/lang/CharSequence;II)Landroid/text/Editable;" />
+ <method name="clear()V" />
+ <method name="clearSpans()V" />
+ <method name="delete(II)Landroid/text/Editable;" />
+ <method name="getFilters()[Landroid/text/InputFilter;" />
+ <method name="insert(ILjava/lang/CharSequence;)Landroid/text/Editable;" />
+ <method name="insert(ILjava/lang/CharSequence;II)Landroid/text/Editable;" />
+ <method name="replace(IILjava/lang/CharSequence;)Landroid/text/Editable;" />
+ <method name="replace(IILjava/lang/CharSequence;II)Landroid/text/Editable;" />
+ <method name="setFilters([Landroid/text/InputFilter;)V" />
+ </class>
+ <class name="android/text/Editable$Factory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getInstance()Landroid/text/Editable$Factory;" />
+ <method name="newEditable(Ljava/lang/CharSequence;)Landroid/text/Editable;" />
+ </class>
+ <class name="android/text/GetChars" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/CharSequence" />
+ <method name="getChars(II[CI)V" />
+ </class>
+ <class name="android/text/Html" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="escapeHtml(Ljava/lang/CharSequence;)Ljava/lang/String;" since="16" />
+ <method name="fromHtml(Ljava/lang/String;)Landroid/text/Spanned;" />
+ <method name="fromHtml(Ljava/lang/String;Landroid/text/Html$ImageGetter;Landroid/text/Html$TagHandler;)Landroid/text/Spanned;" />
+ <method name="toHtml(Landroid/text/Spanned;)Ljava/lang/String;" />
+ </class>
+ <class name="android/text/Html$ImageGetter" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getDrawable(Ljava/lang/String;)Landroid/graphics/drawable/Drawable;" />
+ </class>
+ <class name="android/text/Html$TagHandler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="handleTag(ZLjava/lang/String;Landroid/text/Editable;Lorg/xml/sax/XMLReader;)V" />
+ </class>
+ <class name="android/text/InputFilter" since="1">
+ <extends name="java/lang/Object" />
+ <method name="filter(Ljava/lang/CharSequence;IILandroid/text/Spanned;II)Ljava/lang/CharSequence;" />
+ </class>
+ <class name="android/text/InputFilter$AllCaps" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/InputFilter" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/text/InputFilter$LengthFilter" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/InputFilter" />
+ <method name="&lt;init>(I)V" />
+ <method name="getMax()I" since="21" />
+ </class>
+ <class name="android/text/InputType" since="3">
+ <extends name="java/lang/Object" />
+ <field name="TYPE_CLASS_DATETIME" />
+ <field name="TYPE_CLASS_NUMBER" />
+ <field name="TYPE_CLASS_PHONE" />
+ <field name="TYPE_CLASS_TEXT" />
+ <field name="TYPE_DATETIME_VARIATION_DATE" />
+ <field name="TYPE_DATETIME_VARIATION_NORMAL" />
+ <field name="TYPE_DATETIME_VARIATION_TIME" />
+ <field name="TYPE_MASK_CLASS" />
+ <field name="TYPE_MASK_FLAGS" />
+ <field name="TYPE_MASK_VARIATION" />
+ <field name="TYPE_NULL" />
+ <field name="TYPE_NUMBER_FLAG_DECIMAL" />
+ <field name="TYPE_NUMBER_FLAG_SIGNED" />
+ <field name="TYPE_NUMBER_VARIATION_NORMAL" since="11" />
+ <field name="TYPE_NUMBER_VARIATION_PASSWORD" since="11" />
+ <field name="TYPE_TEXT_FLAG_AUTO_COMPLETE" />
+ <field name="TYPE_TEXT_FLAG_AUTO_CORRECT" />
+ <field name="TYPE_TEXT_FLAG_CAP_CHARACTERS" />
+ <field name="TYPE_TEXT_FLAG_CAP_SENTENCES" />
+ <field name="TYPE_TEXT_FLAG_CAP_WORDS" />
+ <field name="TYPE_TEXT_FLAG_IME_MULTI_LINE" />
+ <field name="TYPE_TEXT_FLAG_MULTI_LINE" />
+ <field name="TYPE_TEXT_FLAG_NO_SUGGESTIONS" since="5" />
+ <field name="TYPE_TEXT_VARIATION_EMAIL_ADDRESS" />
+ <field name="TYPE_TEXT_VARIATION_EMAIL_SUBJECT" />
+ <field name="TYPE_TEXT_VARIATION_FILTER" />
+ <field name="TYPE_TEXT_VARIATION_LONG_MESSAGE" />
+ <field name="TYPE_TEXT_VARIATION_NORMAL" />
+ <field name="TYPE_TEXT_VARIATION_PASSWORD" />
+ <field name="TYPE_TEXT_VARIATION_PERSON_NAME" />
+ <field name="TYPE_TEXT_VARIATION_PHONETIC" />
+ <field name="TYPE_TEXT_VARIATION_POSTAL_ADDRESS" />
+ <field name="TYPE_TEXT_VARIATION_SHORT_MESSAGE" />
+ <field name="TYPE_TEXT_VARIATION_URI" />
+ <field name="TYPE_TEXT_VARIATION_VISIBLE_PASSWORD" />
+ <field name="TYPE_TEXT_VARIATION_WEB_EDIT_TEXT" />
+ <field name="TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS" since="11" />
+ <field name="TYPE_TEXT_VARIATION_WEB_PASSWORD" since="11" />
+ </class>
+ <class name="android/text/Layout" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FF)V" />
+ <method name="draw(Landroid/graphics/Canvas;)V" />
+ <method name="draw(Landroid/graphics/Canvas;Landroid/graphics/Path;Landroid/graphics/Paint;I)V" />
+ <method name="getAlignment()Landroid/text/Layout$Alignment;" />
+ <method name="getBottomPadding()I" />
+ <method name="getCursorPath(ILandroid/graphics/Path;Ljava/lang/CharSequence;)V" />
+ <method name="getDesiredWidth(Ljava/lang/CharSequence;IILandroid/text/TextPaint;)F" />
+ <method name="getDesiredWidth(Ljava/lang/CharSequence;Landroid/text/TextPaint;)F" />
+ <method name="getEllipsisCount(I)I" />
+ <method name="getEllipsisStart(I)I" />
+ <method name="getEllipsizedWidth()I" />
+ <method name="getHeight()I" />
+ <method name="getLineAscent(I)I" />
+ <method name="getLineBaseline(I)I" />
+ <method name="getLineBottom(I)I" />
+ <method name="getLineBounds(ILandroid/graphics/Rect;)I" />
+ <method name="getLineContainsTab(I)Z" />
+ <method name="getLineCount()I" />
+ <method name="getLineDescent(I)I" />
+ <method name="getLineDirections(I)Landroid/text/Layout$Directions;" />
+ <method name="getLineEnd(I)I" />
+ <method name="getLineForOffset(I)I" />
+ <method name="getLineForVertical(I)I" />
+ <method name="getLineLeft(I)F" />
+ <method name="getLineMax(I)F" />
+ <method name="getLineRight(I)F" />
+ <method name="getLineStart(I)I" />
+ <method name="getLineTop(I)I" />
+ <method name="getLineVisibleEnd(I)I" />
+ <method name="getLineWidth(I)F" />
+ <method name="getOffsetForHorizontal(IF)I" />
+ <method name="getOffsetToLeftOf(I)I" />
+ <method name="getOffsetToRightOf(I)I" />
+ <method name="getPaint()Landroid/text/TextPaint;" />
+ <method name="getParagraphAlignment(I)Landroid/text/Layout$Alignment;" />
+ <method name="getParagraphDirection(I)I" />
+ <method name="getParagraphLeft(I)I" />
+ <method name="getParagraphRight(I)I" />
+ <method name="getPrimaryHorizontal(I)F" />
+ <method name="getSecondaryHorizontal(I)F" />
+ <method name="getSelectionPath(IILandroid/graphics/Path;)V" />
+ <method name="getSpacingAdd()F" />
+ <method name="getSpacingMultiplier()F" />
+ <method name="getText()Ljava/lang/CharSequence;" />
+ <method name="getTopPadding()I" />
+ <method name="getWidth()I" />
+ <method name="increaseWidthTo(I)V" />
+ <method name="isRtlCharAt(I)Z" since="14" />
+ <method name="isSpanned()Z" />
+ <field name="DIR_LEFT_TO_RIGHT" />
+ <field name="DIR_RIGHT_TO_LEFT" />
+ </class>
+ <class name="android/text/Layout$Alignment" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/text/Layout$Alignment;" />
+ <method name="values()[Landroid/text/Layout$Alignment;" />
+ <field name="ALIGN_CENTER" />
+ <field name="ALIGN_NORMAL" />
+ <field name="ALIGN_OPPOSITE" />
+ </class>
+ <class name="android/text/Layout$Directions" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/text/LoginFilter" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/InputFilter" />
+ <method name="&lt;init>()V" />
+ <method name="isAllowed(C)Z" />
+ <method name="onInvalidCharacter(C)V" />
+ <method name="onStart()V" />
+ <method name="onStop()V" />
+ </class>
+ <class name="android/text/LoginFilter$PasswordFilterGMail" since="1">
+ <extends name="android/text/LoginFilter" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Z)V" />
+ </class>
+ <class name="android/text/LoginFilter$UsernameFilterGMail" since="1">
+ <extends name="android/text/LoginFilter" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Z)V" />
+ </class>
+ <class name="android/text/LoginFilter$UsernameFilterGeneric" since="1">
+ <extends name="android/text/LoginFilter" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Z)V" />
+ </class>
+ <class name="android/text/NoCopySpan" since="3">
+ <extends name="java/lang/Object" />
+ </class>
+ <class name="android/text/NoCopySpan$Concrete" since="3">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/NoCopySpan" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/text/ParcelableSpan" since="3">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="getSpanTypeId()I" />
+ </class>
+ <class name="android/text/Selection" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="extendDown(Landroid/text/Spannable;Landroid/text/Layout;)Z" />
+ <method name="extendLeft(Landroid/text/Spannable;Landroid/text/Layout;)Z" />
+ <method name="extendRight(Landroid/text/Spannable;Landroid/text/Layout;)Z" />
+ <method name="extendSelection(Landroid/text/Spannable;I)V" />
+ <method name="extendToLeftEdge(Landroid/text/Spannable;Landroid/text/Layout;)Z" />
+ <method name="extendToRightEdge(Landroid/text/Spannable;Landroid/text/Layout;)Z" />
+ <method name="extendUp(Landroid/text/Spannable;Landroid/text/Layout;)Z" />
+ <method name="getSelectionEnd(Ljava/lang/CharSequence;)I" />
+ <method name="getSelectionStart(Ljava/lang/CharSequence;)I" />
+ <method name="moveDown(Landroid/text/Spannable;Landroid/text/Layout;)Z" />
+ <method name="moveLeft(Landroid/text/Spannable;Landroid/text/Layout;)Z" />
+ <method name="moveRight(Landroid/text/Spannable;Landroid/text/Layout;)Z" />
+ <method name="moveToLeftEdge(Landroid/text/Spannable;Landroid/text/Layout;)Z" />
+ <method name="moveToRightEdge(Landroid/text/Spannable;Landroid/text/Layout;)Z" />
+ <method name="moveUp(Landroid/text/Spannable;Landroid/text/Layout;)Z" />
+ <method name="removeSelection(Landroid/text/Spannable;)V" />
+ <method name="selectAll(Landroid/text/Spannable;)V" />
+ <method name="setSelection(Landroid/text/Spannable;I)V" />
+ <method name="setSelection(Landroid/text/Spannable;II)V" />
+ <field name="SELECTION_END" />
+ <field name="SELECTION_START" />
+ </class>
+ <class name="android/text/SpanWatcher" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/NoCopySpan" since="3" />
+ <method name="onSpanAdded(Landroid/text/Spannable;Ljava/lang/Object;II)V" />
+ <method name="onSpanChanged(Landroid/text/Spannable;Ljava/lang/Object;IIII)V" />
+ <method name="onSpanRemoved(Landroid/text/Spannable;Ljava/lang/Object;II)V" />
+ </class>
+ <class name="android/text/Spannable" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/Spanned" />
+ <method name="removeSpan(Ljava/lang/Object;)V" />
+ <method name="setSpan(Ljava/lang/Object;III)V" />
+ </class>
+ <class name="android/text/Spannable$Factory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getInstance()Landroid/text/Spannable$Factory;" />
+ <method name="newSpannable(Ljava/lang/CharSequence;)Landroid/text/Spannable;" />
+ </class>
+ <class name="android/text/SpannableString" since="1">
+ <extends name="android/text/SpannableStringInternal" />
+ <implements name="android/text/GetChars" />
+ <implements name="android/text/Spannable" />
+ <implements name="java/lang/CharSequence" />
+ <method name="&lt;init>(Ljava/lang/CharSequence;)V" />
+ <method name="valueOf(Ljava/lang/CharSequence;)Landroid/text/SpannableString;" />
+ </class>
+ <class name="android/text/SpannableStringBuilder" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/Editable" />
+ <implements name="android/text/GetChars" />
+ <implements name="android/text/Spannable" />
+ <implements name="java/lang/Appendable" />
+ <implements name="java/lang/CharSequence" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/CharSequence;)V" />
+ <method name="&lt;init>(Ljava/lang/CharSequence;II)V" />
+ <method name="append(C)Landroid/text/SpannableStringBuilder;" />
+ <method name="append(Ljava/lang/CharSequence;)Landroid/text/SpannableStringBuilder;" />
+ <method name="append(Ljava/lang/CharSequence;II)Landroid/text/SpannableStringBuilder;" />
+ <method name="append(Ljava/lang/CharSequence;Ljava/lang/Object;I)Landroid/text/SpannableStringBuilder;" since="21" />
+ <method name="delete(II)Landroid/text/SpannableStringBuilder;" />
+ <method name="getTextRunCursor(IIIIILandroid/graphics/Paint;)I" since="11" />
+ <method name="insert(ILjava/lang/CharSequence;)Landroid/text/SpannableStringBuilder;" />
+ <method name="insert(ILjava/lang/CharSequence;II)Landroid/text/SpannableStringBuilder;" />
+ <method name="replace(IILjava/lang/CharSequence;)Landroid/text/SpannableStringBuilder;" />
+ <method name="replace(IILjava/lang/CharSequence;II)Landroid/text/SpannableStringBuilder;" />
+ <method name="valueOf(Ljava/lang/CharSequence;)Landroid/text/SpannableStringBuilder;" />
+ </class>
+ <class name="android/text/SpannableStringInternal" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="charAt(I)C" />
+ <method name="getChars(II[CI)V" />
+ <method name="getSpanEnd(Ljava/lang/Object;)I" />
+ <method name="getSpanFlags(Ljava/lang/Object;)I" />
+ <method name="getSpanStart(Ljava/lang/Object;)I" />
+ <method name="getSpans(IILjava/lang/Class;)[Ljava/lang/Object;" />
+ <method name="length()I" />
+ <method name="nextSpanTransition(IILjava/lang/Class;)I" />
+ </class>
+ <class name="android/text/Spanned" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/CharSequence" />
+ <method name="getSpanEnd(Ljava/lang/Object;)I" />
+ <method name="getSpanFlags(Ljava/lang/Object;)I" />
+ <method name="getSpanStart(Ljava/lang/Object;)I" />
+ <method name="getSpans(IILjava/lang/Class;)[Ljava/lang/Object;" />
+ <method name="nextSpanTransition(IILjava/lang/Class;)I" />
+ <field name="SPAN_COMPOSING" since="3" />
+ <field name="SPAN_EXCLUSIVE_EXCLUSIVE" />
+ <field name="SPAN_EXCLUSIVE_INCLUSIVE" />
+ <field name="SPAN_INCLUSIVE_EXCLUSIVE" />
+ <field name="SPAN_INCLUSIVE_INCLUSIVE" />
+ <field name="SPAN_INTERMEDIATE" since="3" />
+ <field name="SPAN_MARK_MARK" />
+ <field name="SPAN_MARK_POINT" />
+ <field name="SPAN_PARAGRAPH" />
+ <field name="SPAN_POINT_MARK" />
+ <field name="SPAN_POINT_MARK_MASK" since="3" />
+ <field name="SPAN_POINT_POINT" />
+ <field name="SPAN_PRIORITY" />
+ <field name="SPAN_PRIORITY_SHIFT" />
+ <field name="SPAN_USER" />
+ <field name="SPAN_USER_SHIFT" />
+ </class>
+ <class name="android/text/SpannedString" since="1">
+ <extends name="android/text/SpannableStringInternal" />
+ <implements name="android/text/GetChars" />
+ <implements name="android/text/Spanned" />
+ <implements name="java/lang/CharSequence" />
+ <method name="&lt;init>(Ljava/lang/CharSequence;)V" />
+ <method name="valueOf(Ljava/lang/CharSequence;)Landroid/text/SpannedString;" />
+ </class>
+ <class name="android/text/StaticLayout" since="1">
+ <extends name="android/text/Layout" />
+ <method name="&lt;init>(Ljava/lang/CharSequence;IILandroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFZ)V" />
+ <method name="&lt;init>(Ljava/lang/CharSequence;IILandroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFZLandroid/text/TextUtils$TruncateAt;I)V" />
+ <method name="&lt;init>(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFZ)V" />
+ </class>
+ <class name="android/text/TextDirectionHeuristic" since="18">
+ <extends name="java/lang/Object" />
+ <method name="isRtl(Ljava/lang/CharSequence;II)Z" />
+ <method name="isRtl([CII)Z" />
+ </class>
+ <class name="android/text/TextDirectionHeuristics" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="ANYRTL_LTR" />
+ <field name="FIRSTSTRONG_LTR" />
+ <field name="FIRSTSTRONG_RTL" />
+ <field name="LOCALE" />
+ <field name="LTR" />
+ <field name="RTL" />
+ </class>
+ <class name="android/text/TextPaint" since="1">
+ <extends name="android/graphics/Paint" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Landroid/graphics/Paint;)V" />
+ <method name="set(Landroid/text/TextPaint;)V" />
+ <field name="baselineShift" />
+ <field name="bgColor" />
+ <field name="density" since="5" />
+ <field name="drawableState" />
+ <field name="linkColor" />
+ </class>
+ <class name="android/text/TextUtils" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="commaEllipsize(Ljava/lang/CharSequence;Landroid/text/TextPaint;FLjava/lang/String;Ljava/lang/String;)Ljava/lang/CharSequence;" />
+ <method name="concat([Ljava/lang/CharSequence;)Ljava/lang/CharSequence;" />
+ <method name="copySpansFrom(Landroid/text/Spanned;IILjava/lang/Class;Landroid/text/Spannable;I)V" />
+ <method name="dumpSpans(Ljava/lang/CharSequence;Landroid/util/Printer;Ljava/lang/String;)V" since="3" />
+ <method name="ellipsize(Ljava/lang/CharSequence;Landroid/text/TextPaint;FLandroid/text/TextUtils$TruncateAt;)Ljava/lang/CharSequence;" />
+ <method name="ellipsize(Ljava/lang/CharSequence;Landroid/text/TextPaint;FLandroid/text/TextUtils$TruncateAt;ZLandroid/text/TextUtils$EllipsizeCallback;)Ljava/lang/CharSequence;" />
+ <method name="equals(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Z" />
+ <method name="expandTemplate(Ljava/lang/CharSequence;[Ljava/lang/CharSequence;)Ljava/lang/CharSequence;" />
+ <method name="getCapsMode(Ljava/lang/CharSequence;II)I" since="3" />
+ <method name="getChars(Ljava/lang/CharSequence;II[CI)V" />
+ <method name="getLayoutDirectionFromLocale(Ljava/util/Locale;)I" since="17" />
+ <method name="getOffsetAfter(Ljava/lang/CharSequence;I)I" />
+ <method name="getOffsetBefore(Ljava/lang/CharSequence;I)I" />
+ <method name="getReverse(Ljava/lang/CharSequence;II)Ljava/lang/CharSequence;" />
+ <method name="getTrimmedLength(Ljava/lang/CharSequence;)I" />
+ <method name="htmlEncode(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="indexOf(Ljava/lang/CharSequence;C)I" />
+ <method name="indexOf(Ljava/lang/CharSequence;CI)I" />
+ <method name="indexOf(Ljava/lang/CharSequence;CII)I" />
+ <method name="indexOf(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)I" />
+ <method name="indexOf(Ljava/lang/CharSequence;Ljava/lang/CharSequence;I)I" />
+ <method name="indexOf(Ljava/lang/CharSequence;Ljava/lang/CharSequence;II)I" />
+ <method name="isDigitsOnly(Ljava/lang/CharSequence;)Z" />
+ <method name="isEmpty(Ljava/lang/CharSequence;)Z" />
+ <method name="isGraphic(C)Z" />
+ <method name="isGraphic(Ljava/lang/CharSequence;)Z" />
+ <method name="join(Ljava/lang/CharSequence;Ljava/lang/Iterable;)Ljava/lang/String;" />
+ <method name="join(Ljava/lang/CharSequence;[Ljava/lang/Object;)Ljava/lang/String;" />
+ <method name="lastIndexOf(Ljava/lang/CharSequence;C)I" />
+ <method name="lastIndexOf(Ljava/lang/CharSequence;CI)I" />
+ <method name="lastIndexOf(Ljava/lang/CharSequence;CII)I" />
+ <method name="regionMatches(Ljava/lang/CharSequence;ILjava/lang/CharSequence;II)Z" />
+ <method name="replace(Ljava/lang/CharSequence;[Ljava/lang/String;[Ljava/lang/CharSequence;)Ljava/lang/CharSequence;" />
+ <method name="split(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;" />
+ <method name="split(Ljava/lang/String;Ljava/util/regex/Pattern;)[Ljava/lang/String;" />
+ <method name="stringOrSpannedString(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;" />
+ <method name="substring(Ljava/lang/CharSequence;II)Ljava/lang/String;" />
+ <method name="writeToParcel(Ljava/lang/CharSequence;Landroid/os/Parcel;I)V" />
+ <field name="CAP_MODE_CHARACTERS" since="3" />
+ <field name="CAP_MODE_SENTENCES" since="3" />
+ <field name="CAP_MODE_WORDS" since="3" />
+ <field name="CHAR_SEQUENCE_CREATOR" />
+ </class>
+ <class name="android/text/TextUtils$EllipsizeCallback" since="1">
+ <extends name="java/lang/Object" />
+ <method name="ellipsized(II)V" />
+ </class>
+ <class name="android/text/TextUtils$SimpleStringSplitter" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/TextUtils$StringSplitter" />
+ <implements name="java/util/Iterator" />
+ <method name="&lt;init>(C)V" />
+ <method name="next()Ljava/lang/String;" />
+ </class>
+ <class name="android/text/TextUtils$StringSplitter" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Iterable" />
+ <method name="setString(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/text/TextUtils$TruncateAt" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/text/TextUtils$TruncateAt;" />
+ <method name="values()[Landroid/text/TextUtils$TruncateAt;" />
+ <field name="END" />
+ <field name="MARQUEE" since="2" />
+ <field name="MIDDLE" />
+ <field name="START" />
+ </class>
+ <class name="android/text/TextWatcher" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/NoCopySpan" since="3" />
+ <method name="afterTextChanged(Landroid/text/Editable;)V" />
+ <method name="beforeTextChanged(Ljava/lang/CharSequence;III)V" />
+ <method name="onTextChanged(Ljava/lang/CharSequence;III)V" />
+ </class>
+ <class name="android/text/format/DateFormat" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="format(Ljava/lang/CharSequence;J)Ljava/lang/CharSequence;" />
+ <method name="format(Ljava/lang/CharSequence;Ljava/util/Calendar;)Ljava/lang/CharSequence;" />
+ <method name="format(Ljava/lang/CharSequence;Ljava/util/Date;)Ljava/lang/CharSequence;" />
+ <method name="getBestDateTimePattern(Ljava/util/Locale;Ljava/lang/String;)Ljava/lang/String;" since="18" />
+ <method name="getDateFormat(Landroid/content/Context;)Ljava/text/DateFormat;" />
+ <method name="getDateFormatOrder(Landroid/content/Context;)[C" />
+ <method name="getLongDateFormat(Landroid/content/Context;)Ljava/text/DateFormat;" />
+ <method name="getMediumDateFormat(Landroid/content/Context;)Ljava/text/DateFormat;" />
+ <method name="getTimeFormat(Landroid/content/Context;)Ljava/text/DateFormat;" />
+ <method name="is24HourFormat(Landroid/content/Context;)Z" />
+ <field name="AM_PM" />
+ <field name="CAPITAL_AM_PM" />
+ <field name="DATE" />
+ <field name="DAY" />
+ <field name="HOUR" />
+ <field name="HOUR_OF_DAY" />
+ <field name="MINUTE" />
+ <field name="MONTH" />
+ <field name="QUOTE" />
+ <field name="SECONDS" />
+ <field name="STANDALONE_MONTH" since="17" />
+ <field name="TIME_ZONE" />
+ <field name="YEAR" />
+ </class>
+ <class name="android/text/format/DateUtils" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="formatDateRange(Landroid/content/Context;JJI)Ljava/lang/String;" />
+ <method name="formatDateRange(Landroid/content/Context;Ljava/util/Formatter;JJI)Ljava/util/Formatter;" since="5" />
+ <method name="formatDateRange(Landroid/content/Context;Ljava/util/Formatter;JJILjava/lang/String;)Ljava/util/Formatter;" since="9" />
+ <method name="formatDateTime(Landroid/content/Context;JI)Ljava/lang/String;" />
+ <method name="formatElapsedTime(J)Ljava/lang/String;" />
+ <method name="formatElapsedTime(Ljava/lang/StringBuilder;J)Ljava/lang/String;" />
+ <method name="formatSameDayTime(JJII)Ljava/lang/CharSequence;" />
+ <method name="getAMPMString(I)Ljava/lang/String;" />
+ <method name="getDayOfWeekString(II)Ljava/lang/String;" />
+ <method name="getMonthString(II)Ljava/lang/String;" />
+ <method name="getRelativeDateTimeString(Landroid/content/Context;JJJI)Ljava/lang/CharSequence;" />
+ <method name="getRelativeTimeSpanString(J)Ljava/lang/CharSequence;" />
+ <method name="getRelativeTimeSpanString(JJJ)Ljava/lang/CharSequence;" />
+ <method name="getRelativeTimeSpanString(JJJI)Ljava/lang/CharSequence;" />
+ <method name="getRelativeTimeSpanString(Landroid/content/Context;J)Ljava/lang/CharSequence;" />
+ <method name="getRelativeTimeSpanString(Landroid/content/Context;JZ)Ljava/lang/CharSequence;" />
+ <method name="isToday(J)Z" />
+ <field name="ABBREV_MONTH_FORMAT" />
+ <field name="ABBREV_WEEKDAY_FORMAT" />
+ <field name="DAY_IN_MILLIS" />
+ <field name="FORMAT_12HOUR" />
+ <field name="FORMAT_24HOUR" />
+ <field name="FORMAT_ABBREV_ALL" />
+ <field name="FORMAT_ABBREV_MONTH" />
+ <field name="FORMAT_ABBREV_RELATIVE" />
+ <field name="FORMAT_ABBREV_TIME" />
+ <field name="FORMAT_ABBREV_WEEKDAY" />
+ <field name="FORMAT_CAP_AMPM" />
+ <field name="FORMAT_CAP_MIDNIGHT" />
+ <field name="FORMAT_CAP_NOON" />
+ <field name="FORMAT_CAP_NOON_MIDNIGHT" />
+ <field name="FORMAT_NO_MIDNIGHT" />
+ <field name="FORMAT_NO_MONTH_DAY" />
+ <field name="FORMAT_NO_NOON" />
+ <field name="FORMAT_NO_NOON_MIDNIGHT" />
+ <field name="FORMAT_NO_YEAR" />
+ <field name="FORMAT_NUMERIC_DATE" />
+ <field name="FORMAT_SHOW_DATE" />
+ <field name="FORMAT_SHOW_TIME" />
+ <field name="FORMAT_SHOW_WEEKDAY" />
+ <field name="FORMAT_SHOW_YEAR" />
+ <field name="FORMAT_UTC" />
+ <field name="HOUR_IN_MILLIS" />
+ <field name="HOUR_MINUTE_24" />
+ <field name="LENGTH_LONG" />
+ <field name="LENGTH_MEDIUM" />
+ <field name="LENGTH_SHORT" />
+ <field name="LENGTH_SHORTER" />
+ <field name="LENGTH_SHORTEST" />
+ <field name="MINUTE_IN_MILLIS" />
+ <field name="MONTH_DAY_FORMAT" />
+ <field name="MONTH_FORMAT" />
+ <field name="NUMERIC_MONTH_FORMAT" />
+ <field name="SECOND_IN_MILLIS" />
+ <field name="WEEKDAY_FORMAT" />
+ <field name="WEEK_IN_MILLIS" />
+ <field name="YEAR_FORMAT" />
+ <field name="YEAR_FORMAT_TWO_DIGITS" />
+ <field name="YEAR_IN_MILLIS" />
+ <field name="sameMonthTable" />
+ <field name="sameYearTable" />
+ </class>
+ <class name="android/text/format/Formatter" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="formatFileSize(Landroid/content/Context;J)Ljava/lang/String;" />
+ <method name="formatIpAddress(I)Ljava/lang/String;" />
+ <method name="formatShortFileSize(Landroid/content/Context;J)Ljava/lang/String;" since="5" />
+ </class>
+ <class name="android/text/format/Time" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/text/format/Time;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="after(Landroid/text/format/Time;)Z" />
+ <method name="before(Landroid/text/format/Time;)Z" />
+ <method name="clear(Ljava/lang/String;)V" />
+ <method name="compare(Landroid/text/format/Time;Landroid/text/format/Time;)I" />
+ <method name="format(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="format2445()Ljava/lang/String;" />
+ <method name="format3339(Z)Ljava/lang/String;" />
+ <method name="getActualMaximum(I)I" />
+ <method name="getCurrentTimezone()Ljava/lang/String;" />
+ <method name="getJulianDay(JJ)I" />
+ <method name="getJulianMondayFromWeeksSinceEpoch(I)I" since="11" />
+ <method name="getWeekNumber()I" />
+ <method name="getWeeksSinceEpochFromJulianDay(II)I" since="11" />
+ <method name="isEpoch(Landroid/text/format/Time;)Z" />
+ <method name="normalize(Z)J" />
+ <method name="parse(Ljava/lang/String;)Z" />
+ <method name="parse3339(Ljava/lang/String;)Z" />
+ <method name="set(III)V" />
+ <method name="set(IIIIII)V" />
+ <method name="set(J)V" />
+ <method name="set(Landroid/text/format/Time;)V" />
+ <method name="setJulianDay(I)J" />
+ <method name="setToNow()V" />
+ <method name="switchTimezone(Ljava/lang/String;)V" />
+ <method name="toMillis(Z)J" />
+ <field name="EPOCH_JULIAN_DAY" />
+ <field name="FRIDAY" />
+ <field name="HOUR" />
+ <field name="MINUTE" />
+ <field name="MONDAY" />
+ <field name="MONDAY_BEFORE_JULIAN_EPOCH" since="11" />
+ <field name="MONTH" />
+ <field name="MONTH_DAY" />
+ <field name="SATURDAY" />
+ <field name="SECOND" />
+ <field name="SUNDAY" />
+ <field name="THURSDAY" />
+ <field name="TIMEZONE_UTC" />
+ <field name="TUESDAY" />
+ <field name="WEDNESDAY" />
+ <field name="WEEK_DAY" />
+ <field name="WEEK_NUM" />
+ <field name="YEAR" />
+ <field name="YEAR_DAY" />
+ <field name="allDay" />
+ <field name="gmtoff" />
+ <field name="hour" />
+ <field name="isDst" />
+ <field name="minute" />
+ <field name="month" />
+ <field name="monthDay" />
+ <field name="second" />
+ <field name="timezone" />
+ <field name="weekDay" />
+ <field name="year" />
+ <field name="yearDay" />
+ </class>
+ <class name="android/text/method/ArrowKeyMovementMethod" since="1">
+ <extends name="android/text/method/BaseMovementMethod" since="11" />
+ <extends name="java/lang/Object" />
+ <implements name="android/text/method/MovementMethod" />
+ <method name="&lt;init>()V" />
+ <method name="getInstance()Landroid/text/method/MovementMethod;" />
+ </class>
+ <class name="android/text/method/BaseKeyListener" since="1">
+ <extends name="android/text/method/MetaKeyKeyListener" />
+ <implements name="android/text/method/KeyListener" />
+ <method name="&lt;init>()V" />
+ <method name="backspace(Landroid/view/View;Landroid/text/Editable;ILandroid/view/KeyEvent;)Z" />
+ <method name="forwardDelete(Landroid/view/View;Landroid/text/Editable;ILandroid/view/KeyEvent;)Z" since="11" />
+ </class>
+ <class name="android/text/method/BaseMovementMethod" since="11">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/method/MovementMethod" />
+ <method name="&lt;init>()V" />
+ <method name="bottom(Landroid/widget/TextView;Landroid/text/Spannable;)Z" />
+ <method name="down(Landroid/widget/TextView;Landroid/text/Spannable;)Z" />
+ <method name="end(Landroid/widget/TextView;Landroid/text/Spannable;)Z" />
+ <method name="getMovementMetaState(Landroid/text/Spannable;Landroid/view/KeyEvent;)I" />
+ <method name="handleMovementKey(Landroid/widget/TextView;Landroid/text/Spannable;IILandroid/view/KeyEvent;)Z" />
+ <method name="home(Landroid/widget/TextView;Landroid/text/Spannable;)Z" />
+ <method name="left(Landroid/widget/TextView;Landroid/text/Spannable;)Z" />
+ <method name="lineEnd(Landroid/widget/TextView;Landroid/text/Spannable;)Z" />
+ <method name="lineStart(Landroid/widget/TextView;Landroid/text/Spannable;)Z" />
+ <method name="pageDown(Landroid/widget/TextView;Landroid/text/Spannable;)Z" />
+ <method name="pageUp(Landroid/widget/TextView;Landroid/text/Spannable;)Z" />
+ <method name="right(Landroid/widget/TextView;Landroid/text/Spannable;)Z" />
+ <method name="top(Landroid/widget/TextView;Landroid/text/Spannable;)Z" />
+ <method name="up(Landroid/widget/TextView;Landroid/text/Spannable;)Z" />
+ </class>
+ <class name="android/text/method/CharacterPickerDialog" since="1">
+ <extends name="android/app/Dialog" />
+ <implements name="android/view/View$OnClickListener" />
+ <implements name="android/widget/AdapterView$OnItemClickListener" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/View;Landroid/text/Editable;Ljava/lang/String;Z)V" />
+ </class>
+ <class name="android/text/method/DateKeyListener" since="1">
+ <extends name="android/text/method/NumberKeyListener" />
+ <method name="&lt;init>()V" />
+ <method name="getInstance()Landroid/text/method/DateKeyListener;" />
+ <field name="CHARACTERS" />
+ </class>
+ <class name="android/text/method/DateTimeKeyListener" since="1">
+ <extends name="android/text/method/NumberKeyListener" />
+ <method name="&lt;init>()V" />
+ <method name="getInstance()Landroid/text/method/DateTimeKeyListener;" />
+ <field name="CHARACTERS" />
+ </class>
+ <class name="android/text/method/DialerKeyListener" since="1">
+ <extends name="android/text/method/NumberKeyListener" />
+ <method name="&lt;init>()V" />
+ <method name="getInstance()Landroid/text/method/DialerKeyListener;" />
+ <field name="CHARACTERS" />
+ </class>
+ <class name="android/text/method/DigitsKeyListener" since="1">
+ <extends name="android/text/method/NumberKeyListener" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(ZZ)V" />
+ <method name="getInstance()Landroid/text/method/DigitsKeyListener;" />
+ <method name="getInstance(Ljava/lang/String;)Landroid/text/method/DigitsKeyListener;" />
+ <method name="getInstance(ZZ)Landroid/text/method/DigitsKeyListener;" />
+ </class>
+ <class name="android/text/method/HideReturnsTransformationMethod" since="1">
+ <extends name="android/text/method/ReplacementTransformationMethod" />
+ <method name="&lt;init>()V" />
+ <method name="getInstance()Landroid/text/method/HideReturnsTransformationMethod;" />
+ </class>
+ <class name="android/text/method/KeyListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="clearMetaKeyState(Landroid/view/View;Landroid/text/Editable;I)V" since="3" />
+ <method name="getInputType()I" since="3" />
+ <method name="onKeyDown(Landroid/view/View;Landroid/text/Editable;ILandroid/view/KeyEvent;)Z" />
+ <method name="onKeyOther(Landroid/view/View;Landroid/text/Editable;Landroid/view/KeyEvent;)Z" since="3" />
+ <method name="onKeyUp(Landroid/view/View;Landroid/text/Editable;ILandroid/view/KeyEvent;)Z" />
+ </class>
+ <class name="android/text/method/LinkMovementMethod" since="1">
+ <extends name="android/text/method/ScrollingMovementMethod" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/text/method/MetaKeyKeyListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="adjustMetaAfterKeypress(J)J" since="3" />
+ <method name="adjustMetaAfterKeypress(Landroid/text/Spannable;)V" />
+ <method name="clearMetaKeyState(JI)J" since="3" />
+ <method name="clearMetaKeyState(Landroid/text/Editable;I)V" since="3" />
+ <method name="clearMetaKeyState(Landroid/view/View;Landroid/text/Editable;I)V" since="3" />
+ <method name="getMetaState(J)I" since="3" />
+ <method name="getMetaState(JI)I" since="3" />
+ <method name="getMetaState(Ljava/lang/CharSequence;)I" />
+ <method name="getMetaState(Ljava/lang/CharSequence;I)I" />
+ <method name="getMetaState(Ljava/lang/CharSequence;ILandroid/view/KeyEvent;)I" since="19" />
+ <method name="getMetaState(Ljava/lang/CharSequence;Landroid/view/KeyEvent;)I" since="19" />
+ <method name="handleKeyDown(JILandroid/view/KeyEvent;)J" since="3" />
+ <method name="handleKeyUp(JILandroid/view/KeyEvent;)J" since="3" />
+ <method name="isMetaTracker(Ljava/lang/CharSequence;Ljava/lang/Object;)Z" />
+ <method name="isSelectingMetaTracker(Ljava/lang/CharSequence;Ljava/lang/Object;)Z" since="3" />
+ <method name="onKeyDown(Landroid/view/View;Landroid/text/Editable;ILandroid/view/KeyEvent;)Z" />
+ <method name="onKeyUp(Landroid/view/View;Landroid/text/Editable;ILandroid/view/KeyEvent;)Z" />
+ <method name="resetLockedMeta(J)J" since="3" />
+ <method name="resetLockedMeta(Landroid/text/Spannable;)V" />
+ <method name="resetMetaState(Landroid/text/Spannable;)V" />
+ <field name="META_ALT_LOCKED" />
+ <field name="META_ALT_ON" />
+ <field name="META_CAP_LOCKED" />
+ <field name="META_SHIFT_ON" />
+ <field name="META_SYM_LOCKED" />
+ <field name="META_SYM_ON" />
+ </class>
+ <class name="android/text/method/MovementMethod" since="1">
+ <extends name="java/lang/Object" />
+ <method name="canSelectArbitrarily()Z" />
+ <method name="initialize(Landroid/widget/TextView;Landroid/text/Spannable;)V" />
+ <method name="onGenericMotionEvent(Landroid/widget/TextView;Landroid/text/Spannable;Landroid/view/MotionEvent;)Z" since="12" />
+ <method name="onKeyDown(Landroid/widget/TextView;Landroid/text/Spannable;ILandroid/view/KeyEvent;)Z" />
+ <method name="onKeyOther(Landroid/widget/TextView;Landroid/text/Spannable;Landroid/view/KeyEvent;)Z" since="3" />
+ <method name="onKeyUp(Landroid/widget/TextView;Landroid/text/Spannable;ILandroid/view/KeyEvent;)Z" />
+ <method name="onTakeFocus(Landroid/widget/TextView;Landroid/text/Spannable;I)V" />
+ <method name="onTouchEvent(Landroid/widget/TextView;Landroid/text/Spannable;Landroid/view/MotionEvent;)Z" />
+ <method name="onTrackballEvent(Landroid/widget/TextView;Landroid/text/Spannable;Landroid/view/MotionEvent;)Z" />
+ </class>
+ <class name="android/text/method/MultiTapKeyListener" since="1">
+ <extends name="android/text/method/BaseKeyListener" />
+ <implements name="android/text/SpanWatcher" />
+ <method name="&lt;init>(Landroid/text/method/TextKeyListener$Capitalize;Z)V" />
+ <method name="getInstance(ZLandroid/text/method/TextKeyListener$Capitalize;)Landroid/text/method/MultiTapKeyListener;" />
+ </class>
+ <class name="android/text/method/NumberKeyListener" since="1">
+ <extends name="android/text/method/BaseKeyListener" />
+ <implements name="android/text/InputFilter" />
+ <method name="&lt;init>()V" />
+ <method name="getAcceptedChars()[C" />
+ <method name="lookup(Landroid/view/KeyEvent;Landroid/text/Spannable;)I" />
+ <method name="ok([CC)Z" />
+ </class>
+ <class name="android/text/method/PasswordTransformationMethod" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/TextWatcher" />
+ <implements name="android/text/method/TransformationMethod" />
+ <method name="&lt;init>()V" />
+ <method name="getInstance()Landroid/text/method/PasswordTransformationMethod;" />
+ </class>
+ <class name="android/text/method/QwertyKeyListener" since="1">
+ <extends name="android/text/method/BaseKeyListener" />
+ <method name="&lt;init>(Landroid/text/method/TextKeyListener$Capitalize;Z)V" />
+ <method name="getInstance(ZLandroid/text/method/TextKeyListener$Capitalize;)Landroid/text/method/QwertyKeyListener;" />
+ <method name="getInstanceForFullKeyboard()Landroid/text/method/QwertyKeyListener;" since="11" />
+ <method name="markAsReplaced(Landroid/text/Spannable;IILjava/lang/String;)V" />
+ </class>
+ <class name="android/text/method/ReplacementTransformationMethod" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/method/TransformationMethod" />
+ <method name="&lt;init>()V" />
+ <method name="getOriginal()[C" />
+ <method name="getReplacement()[C" />
+ </class>
+ <class name="android/text/method/ScrollingMovementMethod" since="1">
+ <extends name="android/text/method/BaseMovementMethod" since="11" />
+ <extends name="java/lang/Object" />
+ <implements name="android/text/method/MovementMethod" />
+ <method name="&lt;init>()V" />
+ <method name="down(Landroid/widget/TextView;Landroid/text/Spannable;)Z" />
+ <method name="getInstance()Landroid/text/method/MovementMethod;" />
+ <method name="left(Landroid/widget/TextView;Landroid/text/Spannable;)Z" />
+ <method name="right(Landroid/widget/TextView;Landroid/text/Spannable;)Z" />
+ <method name="up(Landroid/widget/TextView;Landroid/text/Spannable;)Z" />
+ </class>
+ <class name="android/text/method/SingleLineTransformationMethod" since="1">
+ <extends name="android/text/method/ReplacementTransformationMethod" />
+ <method name="&lt;init>()V" />
+ <method name="getInstance()Landroid/text/method/SingleLineTransformationMethod;" />
+ </class>
+ <class name="android/text/method/TextKeyListener" since="1">
+ <extends name="android/text/method/BaseKeyListener" />
+ <implements name="android/text/SpanWatcher" />
+ <method name="&lt;init>(Landroid/text/method/TextKeyListener$Capitalize;Z)V" />
+ <method name="clear(Landroid/text/Editable;)V" />
+ <method name="getInstance()Landroid/text/method/TextKeyListener;" />
+ <method name="getInstance(ZLandroid/text/method/TextKeyListener$Capitalize;)Landroid/text/method/TextKeyListener;" />
+ <method name="release()V" />
+ <method name="shouldCap(Landroid/text/method/TextKeyListener$Capitalize;Ljava/lang/CharSequence;I)Z" />
+ </class>
+ <class name="android/text/method/TextKeyListener$Capitalize" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/text/method/TextKeyListener$Capitalize;" />
+ <method name="values()[Landroid/text/method/TextKeyListener$Capitalize;" />
+ <field name="CHARACTERS" />
+ <field name="NONE" />
+ <field name="SENTENCES" />
+ <field name="WORDS" />
+ </class>
+ <class name="android/text/method/TimeKeyListener" since="1">
+ <extends name="android/text/method/NumberKeyListener" />
+ <method name="&lt;init>()V" />
+ <method name="getInstance()Landroid/text/method/TimeKeyListener;" />
+ <field name="CHARACTERS" />
+ </class>
+ <class name="android/text/method/Touch" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getInitialScrollX(Landroid/widget/TextView;Landroid/text/Spannable;)I" since="3" />
+ <method name="getInitialScrollY(Landroid/widget/TextView;Landroid/text/Spannable;)I" since="3" />
+ <method name="onTouchEvent(Landroid/widget/TextView;Landroid/text/Spannable;Landroid/view/MotionEvent;)Z" />
+ <method name="scrollTo(Landroid/widget/TextView;Landroid/text/Layout;II)V" />
+ </class>
+ <class name="android/text/method/TransformationMethod" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getTransformation(Ljava/lang/CharSequence;Landroid/view/View;)Ljava/lang/CharSequence;" />
+ <method name="onFocusChanged(Landroid/view/View;Ljava/lang/CharSequence;ZILandroid/graphics/Rect;)V" />
+ </class>
+ <class name="android/text/style/AbsoluteSizeSpan" since="1">
+ <extends name="android/text/style/MetricAffectingSpan" />
+ <implements name="android/text/ParcelableSpan" since="3" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(IZ)V" since="5" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3" />
+ <method name="getDip()Z" since="5" />
+ <method name="getSize()I" />
+ </class>
+ <class name="android/text/style/AlignmentSpan" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/style/ParagraphStyle" />
+ <method name="getAlignment()Landroid/text/Layout$Alignment;" />
+ </class>
+ <class name="android/text/style/AlignmentSpan$Standard" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/ParcelableSpan" since="3" />
+ <implements name="android/text/style/AlignmentSpan" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3" />
+ <method name="&lt;init>(Landroid/text/Layout$Alignment;)V" />
+ </class>
+ <class name="android/text/style/BackgroundColorSpan" since="1">
+ <extends name="android/text/style/CharacterStyle" />
+ <implements name="android/text/ParcelableSpan" since="3" />
+ <implements name="android/text/style/UpdateAppearance" since="3" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3" />
+ <method name="getBackgroundColor()I" />
+ </class>
+ <class name="android/text/style/BulletSpan" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/ParcelableSpan" since="3" />
+ <implements name="android/text/style/LeadingMarginSpan" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(II)V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3" />
+ <field name="STANDARD_GAP_WIDTH" />
+ </class>
+ <class name="android/text/style/CharacterStyle" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getUnderlying()Landroid/text/style/CharacterStyle;" />
+ <method name="updateDrawState(Landroid/text/TextPaint;)V" />
+ <method name="wrap(Landroid/text/style/CharacterStyle;)Landroid/text/style/CharacterStyle;" />
+ </class>
+ <class name="android/text/style/ClickableSpan" since="1">
+ <extends name="android/text/style/CharacterStyle" />
+ <implements name="android/text/style/UpdateAppearance" since="3" />
+ <method name="&lt;init>()V" />
+ <method name="onClick(Landroid/view/View;)V" />
+ </class>
+ <class name="android/text/style/DrawableMarginSpan" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/style/LeadingMarginSpan" />
+ <implements name="android/text/style/LineHeightSpan" />
+ <method name="&lt;init>(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="&lt;init>(Landroid/graphics/drawable/Drawable;I)V" />
+ </class>
+ <class name="android/text/style/DynamicDrawableSpan" since="1">
+ <extends name="android/text/style/ReplacementSpan" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" since="3" />
+ <method name="getDrawable()Landroid/graphics/drawable/Drawable;" />
+ <method name="getVerticalAlignment()I" since="3" />
+ <field name="ALIGN_BASELINE" since="3" />
+ <field name="ALIGN_BOTTOM" since="3" />
+ <field name="mVerticalAlignment" since="3" />
+ </class>
+ <class name="android/text/style/EasyEditSpan" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/ParcelableSpan" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/app/PendingIntent;)V" since="18" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="18" />
+ <field name="EXTRA_TEXT_CHANGED_TYPE" since="18" />
+ <field name="TEXT_DELETED" since="18" />
+ <field name="TEXT_MODIFIED" since="18" />
+ </class>
+ <class name="android/text/style/ForegroundColorSpan" since="1">
+ <extends name="android/text/style/CharacterStyle" />
+ <implements name="android/text/ParcelableSpan" since="3" />
+ <implements name="android/text/style/UpdateAppearance" since="3" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3" />
+ <method name="getForegroundColor()I" />
+ </class>
+ <class name="android/text/style/IconMarginSpan" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/style/LeadingMarginSpan" />
+ <implements name="android/text/style/LineHeightSpan" />
+ <method name="&lt;init>(Landroid/graphics/Bitmap;)V" />
+ <method name="&lt;init>(Landroid/graphics/Bitmap;I)V" />
+ </class>
+ <class name="android/text/style/ImageSpan" since="1">
+ <extends name="android/text/style/DynamicDrawableSpan" />
+ <method name="&lt;init>(Landroid/content/Context;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;II)V" since="3" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/graphics/Bitmap;)V" since="4" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/graphics/Bitmap;I)V" since="4" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/net/Uri;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/net/Uri;I)V" since="3" />
+ <method name="&lt;init>(Landroid/graphics/Bitmap;)V" />
+ <method name="&lt;init>(Landroid/graphics/Bitmap;I)V" since="3" />
+ <method name="&lt;init>(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="&lt;init>(Landroid/graphics/drawable/Drawable;I)V" since="3" />
+ <method name="&lt;init>(Landroid/graphics/drawable/Drawable;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Landroid/graphics/drawable/Drawable;Ljava/lang/String;I)V" since="3" />
+ <method name="getSource()Ljava/lang/String;" />
+ </class>
+ <class name="android/text/style/LeadingMarginSpan" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/style/ParagraphStyle" />
+ <method name="drawLeadingMargin(Landroid/graphics/Canvas;Landroid/graphics/Paint;IIIIILjava/lang/CharSequence;IIZLandroid/text/Layout;)V" />
+ <method name="getLeadingMargin(Z)I" />
+ </class>
+ <class name="android/text/style/LeadingMarginSpan$LeadingMarginSpan2" since="8">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/style/LeadingMarginSpan" />
+ <implements name="android/text/style/WrapTogetherSpan" />
+ <method name="getLeadingMarginLineCount()I" />
+ </class>
+ <class name="android/text/style/LeadingMarginSpan$Standard" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/ParcelableSpan" since="3" />
+ <implements name="android/text/style/LeadingMarginSpan" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(II)V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3" />
+ </class>
+ <class name="android/text/style/LineBackgroundSpan" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/style/ParagraphStyle" />
+ <method name="drawBackground(Landroid/graphics/Canvas;Landroid/graphics/Paint;IIIIILjava/lang/CharSequence;III)V" />
+ </class>
+ <class name="android/text/style/LineHeightSpan" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/style/ParagraphStyle" />
+ <implements name="android/text/style/WrapTogetherSpan" />
+ <method name="chooseHeight(Ljava/lang/CharSequence;IIIILandroid/graphics/Paint$FontMetricsInt;)V" />
+ </class>
+ <class name="android/text/style/LineHeightSpan$WithDensity" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/style/LineHeightSpan" />
+ <method name="chooseHeight(Ljava/lang/CharSequence;IIIILandroid/graphics/Paint$FontMetricsInt;Landroid/text/TextPaint;)V" />
+ </class>
+ <class name="android/text/style/LocaleSpan" since="17">
+ <extends name="android/text/style/MetricAffectingSpan" />
+ <implements name="android/text/ParcelableSpan" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="&lt;init>(Ljava/util/Locale;)V" />
+ <method name="getLocale()Ljava/util/Locale;" />
+ </class>
+ <class name="android/text/style/MaskFilterSpan" since="1">
+ <extends name="android/text/style/CharacterStyle" />
+ <implements name="android/text/style/UpdateAppearance" since="3" />
+ <method name="&lt;init>(Landroid/graphics/MaskFilter;)V" />
+ <method name="getMaskFilter()Landroid/graphics/MaskFilter;" />
+ </class>
+ <class name="android/text/style/MetricAffectingSpan" since="1">
+ <extends name="android/text/style/CharacterStyle" />
+ <implements name="android/text/style/UpdateLayout" />
+ <method name="&lt;init>()V" />
+ <method name="getUnderlying()Landroid/text/style/MetricAffectingSpan;" />
+ <method name="updateMeasureState(Landroid/text/TextPaint;)V" />
+ </class>
+ <class name="android/text/style/ParagraphStyle" since="1">
+ <extends name="java/lang/Object" />
+ </class>
+ <class name="android/text/style/QuoteSpan" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/ParcelableSpan" since="3" />
+ <implements name="android/text/style/LeadingMarginSpan" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3" />
+ <method name="getColor()I" />
+ </class>
+ <class name="android/text/style/RasterizerSpan" since="1">
+ <extends name="android/text/style/CharacterStyle" />
+ <implements name="android/text/style/UpdateAppearance" since="3" />
+ <method name="&lt;init>(Landroid/graphics/Rasterizer;)V" />
+ <method name="getRasterizer()Landroid/graphics/Rasterizer;" />
+ </class>
+ <class name="android/text/style/RelativeSizeSpan" since="1">
+ <extends name="android/text/style/MetricAffectingSpan" />
+ <implements name="android/text/ParcelableSpan" since="3" />
+ <method name="&lt;init>(F)V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3" />
+ <method name="getSizeChange()F" />
+ </class>
+ <class name="android/text/style/ReplacementSpan" since="1">
+ <extends name="android/text/style/MetricAffectingSpan" />
+ <method name="&lt;init>()V" />
+ <method name="draw(Landroid/graphics/Canvas;Ljava/lang/CharSequence;IIFIIILandroid/graphics/Paint;)V" />
+ <method name="getSize(Landroid/graphics/Paint;Ljava/lang/CharSequence;IILandroid/graphics/Paint$FontMetricsInt;)I" />
+ </class>
+ <class name="android/text/style/ScaleXSpan" since="1">
+ <extends name="android/text/style/MetricAffectingSpan" />
+ <implements name="android/text/ParcelableSpan" since="3" />
+ <method name="&lt;init>(F)V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3" />
+ <method name="getScaleX()F" />
+ </class>
+ <class name="android/text/style/StrikethroughSpan" since="1">
+ <extends name="android/text/style/CharacterStyle" />
+ <implements name="android/text/ParcelableSpan" since="3" />
+ <implements name="android/text/style/UpdateAppearance" since="3" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3" />
+ </class>
+ <class name="android/text/style/StyleSpan" since="1">
+ <extends name="android/text/style/MetricAffectingSpan" />
+ <implements name="android/text/ParcelableSpan" since="3" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3" />
+ <method name="getStyle()I" />
+ </class>
+ <class name="android/text/style/SubscriptSpan" since="1">
+ <extends name="android/text/style/MetricAffectingSpan" />
+ <implements name="android/text/ParcelableSpan" since="3" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3" />
+ </class>
+ <class name="android/text/style/SuggestionSpan" since="14">
+ <extends name="android/text/style/CharacterStyle" />
+ <implements name="android/text/ParcelableSpan" />
+ <method name="&lt;init>(Landroid/content/Context;Ljava/util/Locale;[Ljava/lang/String;ILjava/lang/Class;)V" />
+ <method name="&lt;init>(Landroid/content/Context;[Ljava/lang/String;I)V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="&lt;init>(Ljava/util/Locale;[Ljava/lang/String;I)V" />
+ <method name="getFlags()I" />
+ <method name="getLocale()Ljava/lang/String;" />
+ <method name="getSuggestions()[Ljava/lang/String;" />
+ <method name="setFlags(I)V" />
+ <field name="ACTION_SUGGESTION_PICKED" />
+ <field name="CREATOR" />
+ <field name="FLAG_AUTO_CORRECTION" since="15" />
+ <field name="FLAG_EASY_CORRECT" />
+ <field name="FLAG_MISSPELLED" />
+ <field name="SUGGESTIONS_MAX_SIZE" />
+ <field name="SUGGESTION_SPAN_PICKED_AFTER" />
+ <field name="SUGGESTION_SPAN_PICKED_BEFORE" />
+ <field name="SUGGESTION_SPAN_PICKED_HASHCODE" />
+ </class>
+ <class name="android/text/style/SuperscriptSpan" since="1">
+ <extends name="android/text/style/MetricAffectingSpan" />
+ <implements name="android/text/ParcelableSpan" since="3" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3" />
+ </class>
+ <class name="android/text/style/TabStopSpan" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/style/ParagraphStyle" />
+ <method name="getTabStop()I" />
+ </class>
+ <class name="android/text/style/TabStopSpan$Standard" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/style/TabStopSpan" />
+ <method name="&lt;init>(I)V" />
+ </class>
+ <class name="android/text/style/TextAppearanceSpan" since="1">
+ <extends name="android/text/style/MetricAffectingSpan" />
+ <implements name="android/text/ParcelableSpan" since="3" />
+ <method name="&lt;init>(Landroid/content/Context;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;II)V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3" />
+ <method name="&lt;init>(Ljava/lang/String;IILandroid/content/res/ColorStateList;Landroid/content/res/ColorStateList;)V" />
+ <method name="getFamily()Ljava/lang/String;" />
+ <method name="getLinkTextColor()Landroid/content/res/ColorStateList;" />
+ <method name="getTextColor()Landroid/content/res/ColorStateList;" />
+ <method name="getTextSize()I" />
+ <method name="getTextStyle()I" />
+ </class>
+ <class name="android/text/style/TtsSpan" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/ParcelableSpan" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Landroid/os/PersistableBundle;)V" />
+ <method name="getArgs()Landroid/os/PersistableBundle;" />
+ <method name="getType()Ljava/lang/String;" />
+ <field name="ANIMACY_ANIMATE" />
+ <field name="ANIMACY_INANIMATE" />
+ <field name="ARG_ANIMACY" />
+ <field name="ARG_CASE" />
+ <field name="ARG_COUNTRY_CODE" />
+ <field name="ARG_CURRENCY" />
+ <field name="ARG_DAY" />
+ <field name="ARG_DENOMINATOR" />
+ <field name="ARG_DIGITS" />
+ <field name="ARG_DOMAIN" />
+ <field name="ARG_EXTENSION" />
+ <field name="ARG_FRACTIONAL_PART" />
+ <field name="ARG_FRAGMENT_ID" />
+ <field name="ARG_GENDER" />
+ <field name="ARG_HOURS" />
+ <field name="ARG_INTEGER_PART" />
+ <field name="ARG_MINUTES" />
+ <field name="ARG_MONTH" />
+ <field name="ARG_MULTIPLICITY" />
+ <field name="ARG_NUMBER" />
+ <field name="ARG_NUMBER_PARTS" />
+ <field name="ARG_NUMERATOR" />
+ <field name="ARG_PASSWORD" />
+ <field name="ARG_PATH" />
+ <field name="ARG_PORT" />
+ <field name="ARG_PROTOCOL" />
+ <field name="ARG_QUANTITY" />
+ <field name="ARG_QUERY_STRING" />
+ <field name="ARG_TEXT" />
+ <field name="ARG_UNIT" />
+ <field name="ARG_USERNAME" />
+ <field name="ARG_VERBATIM" />
+ <field name="ARG_WEEKDAY" />
+ <field name="ARG_YEAR" />
+ <field name="CASE_ABLATIVE" />
+ <field name="CASE_ACCUSATIVE" />
+ <field name="CASE_DATIVE" />
+ <field name="CASE_GENITIVE" />
+ <field name="CASE_INSTRUMENTAL" />
+ <field name="CASE_LOCATIVE" />
+ <field name="CASE_NOMINATIVE" />
+ <field name="CASE_VOCATIVE" />
+ <field name="GENDER_FEMALE" />
+ <field name="GENDER_MALE" />
+ <field name="GENDER_NEUTRAL" />
+ <field name="MONTH_APRIL" />
+ <field name="MONTH_AUGUST" />
+ <field name="MONTH_DECEMBER" />
+ <field name="MONTH_FEBRUARY" />
+ <field name="MONTH_JANUARY" />
+ <field name="MONTH_JULY" />
+ <field name="MONTH_JUNE" />
+ <field name="MONTH_MARCH" />
+ <field name="MONTH_MAY" />
+ <field name="MONTH_NOVEMBER" />
+ <field name="MONTH_OCTOBER" />
+ <field name="MONTH_SEPTEMBER" />
+ <field name="MULTIPLICITY_DUAL" />
+ <field name="MULTIPLICITY_PLURAL" />
+ <field name="MULTIPLICITY_SINGLE" />
+ <field name="TYPE_CARDINAL" />
+ <field name="TYPE_DATE" />
+ <field name="TYPE_DECIMAL" />
+ <field name="TYPE_DIGITS" />
+ <field name="TYPE_ELECTRONIC" />
+ <field name="TYPE_FRACTION" />
+ <field name="TYPE_MEASURE" />
+ <field name="TYPE_MONEY" />
+ <field name="TYPE_ORDINAL" />
+ <field name="TYPE_TELEPHONE" />
+ <field name="TYPE_TEXT" />
+ <field name="TYPE_TIME" />
+ <field name="TYPE_VERBATIM" />
+ <field name="WEEKDAY_FRIDAY" />
+ <field name="WEEKDAY_MONDAY" />
+ <field name="WEEKDAY_SATURDAY" />
+ <field name="WEEKDAY_SUNDAY" />
+ <field name="WEEKDAY_THURSDAY" />
+ <field name="WEEKDAY_TUESDAY" />
+ <field name="WEEKDAY_WEDNESDAY" />
+ </class>
+ <class name="android/text/style/TtsSpan$Builder" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="build()Landroid/text/style/TtsSpan;" />
+ <method name="setIntArgument(Ljava/lang/String;I)Landroid/text/style/TtsSpan$Builder;" />
+ <method name="setLongArgument(Ljava/lang/String;J)Landroid/text/style/TtsSpan$Builder;" />
+ <method name="setStringArgument(Ljava/lang/String;Ljava/lang/String;)Landroid/text/style/TtsSpan$Builder;" />
+ </class>
+ <class name="android/text/style/TtsSpan$CardinalBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$SemioticClassBuilder" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(J)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="setNumber(J)Landroid/text/style/TtsSpan$CardinalBuilder;" />
+ <method name="setNumber(Ljava/lang/String;)Landroid/text/style/TtsSpan$CardinalBuilder;" />
+ </class>
+ <class name="android/text/style/TtsSpan$DateBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$SemioticClassBuilder" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;)V" />
+ <method name="setDay(I)Landroid/text/style/TtsSpan$DateBuilder;" />
+ <method name="setMonth(I)Landroid/text/style/TtsSpan$DateBuilder;" />
+ <method name="setWeekday(I)Landroid/text/style/TtsSpan$DateBuilder;" />
+ <method name="setYear(I)Landroid/text/style/TtsSpan$DateBuilder;" />
+ </class>
+ <class name="android/text/style/TtsSpan$DecimalBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$SemioticClassBuilder" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(DII)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="setArgumentsFromDouble(DII)Landroid/text/style/TtsSpan$DecimalBuilder;" />
+ <method name="setFractionalPart(Ljava/lang/String;)Landroid/text/style/TtsSpan$DecimalBuilder;" />
+ <method name="setIntegerPart(J)Landroid/text/style/TtsSpan$DecimalBuilder;" />
+ <method name="setIntegerPart(Ljava/lang/String;)Landroid/text/style/TtsSpan$DecimalBuilder;" />
+ </class>
+ <class name="android/text/style/TtsSpan$DigitsBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$SemioticClassBuilder" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="setDigits(Ljava/lang/String;)Landroid/text/style/TtsSpan$DigitsBuilder;" />
+ </class>
+ <class name="android/text/style/TtsSpan$ElectronicBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$SemioticClassBuilder" />
+ <method name="&lt;init>()V" />
+ <method name="setDomain(Ljava/lang/String;)Landroid/text/style/TtsSpan$ElectronicBuilder;" />
+ <method name="setEmailArguments(Ljava/lang/String;Ljava/lang/String;)Landroid/text/style/TtsSpan$ElectronicBuilder;" />
+ <method name="setFragmentId(Ljava/lang/String;)Landroid/text/style/TtsSpan$ElectronicBuilder;" />
+ <method name="setPassword(Ljava/lang/String;)Landroid/text/style/TtsSpan$ElectronicBuilder;" />
+ <method name="setPath(Ljava/lang/String;)Landroid/text/style/TtsSpan$ElectronicBuilder;" />
+ <method name="setPort(I)Landroid/text/style/TtsSpan$ElectronicBuilder;" />
+ <method name="setProtocol(Ljava/lang/String;)Landroid/text/style/TtsSpan$ElectronicBuilder;" />
+ <method name="setQueryString(Ljava/lang/String;)Landroid/text/style/TtsSpan$ElectronicBuilder;" />
+ <method name="setUsername(Ljava/lang/String;)Landroid/text/style/TtsSpan$ElectronicBuilder;" />
+ </class>
+ <class name="android/text/style/TtsSpan$FractionBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$SemioticClassBuilder" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(JJJ)V" />
+ <method name="setDenominator(J)Landroid/text/style/TtsSpan$FractionBuilder;" />
+ <method name="setDenominator(Ljava/lang/String;)Landroid/text/style/TtsSpan$FractionBuilder;" />
+ <method name="setIntegerPart(J)Landroid/text/style/TtsSpan$FractionBuilder;" />
+ <method name="setIntegerPart(Ljava/lang/String;)Landroid/text/style/TtsSpan$FractionBuilder;" />
+ <method name="setNumerator(J)Landroid/text/style/TtsSpan$FractionBuilder;" />
+ <method name="setNumerator(Ljava/lang/String;)Landroid/text/style/TtsSpan$FractionBuilder;" />
+ </class>
+ <class name="android/text/style/TtsSpan$MeasureBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$SemioticClassBuilder" />
+ <method name="&lt;init>()V" />
+ <method name="setDenominator(J)Landroid/text/style/TtsSpan$MeasureBuilder;" />
+ <method name="setDenominator(Ljava/lang/String;)Landroid/text/style/TtsSpan$MeasureBuilder;" />
+ <method name="setFractionalPart(Ljava/lang/String;)Landroid/text/style/TtsSpan$MeasureBuilder;" />
+ <method name="setIntegerPart(J)Landroid/text/style/TtsSpan$MeasureBuilder;" />
+ <method name="setIntegerPart(Ljava/lang/String;)Landroid/text/style/TtsSpan$MeasureBuilder;" />
+ <method name="setNumber(J)Landroid/text/style/TtsSpan$MeasureBuilder;" />
+ <method name="setNumber(Ljava/lang/String;)Landroid/text/style/TtsSpan$MeasureBuilder;" />
+ <method name="setNumerator(J)Landroid/text/style/TtsSpan$MeasureBuilder;" />
+ <method name="setNumerator(Ljava/lang/String;)Landroid/text/style/TtsSpan$MeasureBuilder;" />
+ <method name="setUnit(Ljava/lang/String;)Landroid/text/style/TtsSpan$MeasureBuilder;" />
+ </class>
+ <class name="android/text/style/TtsSpan$MoneyBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$SemioticClassBuilder" />
+ <method name="&lt;init>()V" />
+ <method name="setCurrency(Ljava/lang/String;)Landroid/text/style/TtsSpan$MoneyBuilder;" />
+ <method name="setFractionalPart(Ljava/lang/String;)Landroid/text/style/TtsSpan$MoneyBuilder;" />
+ <method name="setIntegerPart(J)Landroid/text/style/TtsSpan$MoneyBuilder;" />
+ <method name="setIntegerPart(Ljava/lang/String;)Landroid/text/style/TtsSpan$MoneyBuilder;" />
+ <method name="setQuantity(Ljava/lang/String;)Landroid/text/style/TtsSpan$MoneyBuilder;" />
+ </class>
+ <class name="android/text/style/TtsSpan$OrdinalBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$SemioticClassBuilder" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(J)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="setNumber(J)Landroid/text/style/TtsSpan$OrdinalBuilder;" />
+ <method name="setNumber(Ljava/lang/String;)Landroid/text/style/TtsSpan$OrdinalBuilder;" />
+ </class>
+ <class name="android/text/style/TtsSpan$SemioticClassBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$Builder" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="setAnimacy(Ljava/lang/String;)Landroid/text/style/TtsSpan$SemioticClassBuilder;" />
+ <method name="setCase(Ljava/lang/String;)Landroid/text/style/TtsSpan$SemioticClassBuilder;" />
+ <method name="setGender(Ljava/lang/String;)Landroid/text/style/TtsSpan$SemioticClassBuilder;" />
+ <method name="setMultiplicity(Ljava/lang/String;)Landroid/text/style/TtsSpan$SemioticClassBuilder;" />
+ </class>
+ <class name="android/text/style/TtsSpan$TelephoneBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$SemioticClassBuilder" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="setCountryCode(Ljava/lang/String;)Landroid/text/style/TtsSpan$TelephoneBuilder;" />
+ <method name="setExtension(Ljava/lang/String;)Landroid/text/style/TtsSpan$TelephoneBuilder;" />
+ <method name="setNumberParts(Ljava/lang/String;)Landroid/text/style/TtsSpan$TelephoneBuilder;" />
+ </class>
+ <class name="android/text/style/TtsSpan$TextBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$SemioticClassBuilder" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="setText(Ljava/lang/String;)Landroid/text/style/TtsSpan$TextBuilder;" />
+ </class>
+ <class name="android/text/style/TtsSpan$TimeBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$SemioticClassBuilder" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(II)V" />
+ <method name="setHours(I)Landroid/text/style/TtsSpan$TimeBuilder;" />
+ <method name="setMinutes(I)Landroid/text/style/TtsSpan$TimeBuilder;" />
+ </class>
+ <class name="android/text/style/TtsSpan$VerbatimBuilder" since="21">
+ <extends name="android/text/style/TtsSpan$SemioticClassBuilder" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="setVerbatim(Ljava/lang/String;)Landroid/text/style/TtsSpan$VerbatimBuilder;" />
+ </class>
+ <class name="android/text/style/TypefaceSpan" since="1">
+ <extends name="android/text/style/MetricAffectingSpan" />
+ <implements name="android/text/ParcelableSpan" since="3" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getFamily()Ljava/lang/String;" />
+ </class>
+ <class name="android/text/style/URLSpan" since="1">
+ <extends name="android/text/style/ClickableSpan" />
+ <implements name="android/text/ParcelableSpan" since="3" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getURL()Ljava/lang/String;" />
+ </class>
+ <class name="android/text/style/UnderlineSpan" since="1">
+ <extends name="android/text/style/CharacterStyle" />
+ <implements name="android/text/ParcelableSpan" since="3" />
+ <implements name="android/text/style/UpdateAppearance" since="3" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" since="3" />
+ </class>
+ <class name="android/text/style/UpdateAppearance" since="3">
+ <extends name="java/lang/Object" />
+ </class>
+ <class name="android/text/style/UpdateLayout" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/style/UpdateAppearance" since="3" />
+ </class>
+ <class name="android/text/style/WrapTogetherSpan" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/text/style/ParagraphStyle" />
+ </class>
+ <class name="android/text/util/Linkify" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addLinks(Landroid/text/Spannable;I)Z" />
+ <method name="addLinks(Landroid/text/Spannable;Ljava/util/regex/Pattern;Ljava/lang/String;)Z" />
+ <method name="addLinks(Landroid/text/Spannable;Ljava/util/regex/Pattern;Ljava/lang/String;Landroid/text/util/Linkify$MatchFilter;Landroid/text/util/Linkify$TransformFilter;)Z" />
+ <method name="addLinks(Landroid/widget/TextView;I)Z" />
+ <method name="addLinks(Landroid/widget/TextView;Ljava/util/regex/Pattern;Ljava/lang/String;)V" />
+ <method name="addLinks(Landroid/widget/TextView;Ljava/util/regex/Pattern;Ljava/lang/String;Landroid/text/util/Linkify$MatchFilter;Landroid/text/util/Linkify$TransformFilter;)V" />
+ <field name="ALL" />
+ <field name="EMAIL_ADDRESSES" />
+ <field name="MAP_ADDRESSES" />
+ <field name="PHONE_NUMBERS" />
+ <field name="WEB_URLS" />
+ <field name="sPhoneNumberMatchFilter" />
+ <field name="sPhoneNumberTransformFilter" />
+ <field name="sUrlMatchFilter" />
+ </class>
+ <class name="android/text/util/Linkify$MatchFilter" since="1">
+ <extends name="java/lang/Object" />
+ <method name="acceptMatch(Ljava/lang/CharSequence;II)Z" />
+ </class>
+ <class name="android/text/util/Linkify$TransformFilter" since="1">
+ <extends name="java/lang/Object" />
+ <method name="transformUrl(Ljava/util/regex/Matcher;Ljava/lang/String;)Ljava/lang/String;" />
+ </class>
+ <class name="android/text/util/Rfc822Token" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="getAddress()Ljava/lang/String;" />
+ <method name="getComment()Ljava/lang/String;" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="quoteComment(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="quoteName(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="quoteNameIfNecessary(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="setAddress(Ljava/lang/String;)V" />
+ <method name="setComment(Ljava/lang/String;)V" />
+ <method name="setName(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/text/util/Rfc822Tokenizer" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/widget/MultiAutoCompleteTextView$Tokenizer" />
+ <method name="&lt;init>()V" />
+ <method name="tokenize(Ljava/lang/CharSequence;)[Landroid/text/util/Rfc822Token;" />
+ <method name="tokenize(Ljava/lang/CharSequence;Ljava/util/Collection;)V" since="8" />
+ </class>
+ <class name="android/transition/ArcMotion" since="21">
+ <extends name="android/transition/PathMotion" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="getMaximumAngle()F" />
+ <method name="getMinimumHorizontalAngle()F" />
+ <method name="getMinimumVerticalAngle()F" />
+ <method name="setMaximumAngle(F)V" />
+ <method name="setMinimumHorizontalAngle(F)V" />
+ <method name="setMinimumVerticalAngle(F)V" />
+ </class>
+ <class name="android/transition/AutoTransition" since="19">
+ <extends name="android/transition/TransitionSet" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" since="21" />
+ </class>
+ <class name="android/transition/ChangeBounds" since="19">
+ <extends name="android/transition/Transition" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" since="21" />
+ <method name="setReparent(Z)V" />
+ <method name="setResizeClip(Z)V" />
+ </class>
+ <class name="android/transition/ChangeClipBounds" since="21">
+ <extends name="android/transition/Transition" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ </class>
+ <class name="android/transition/ChangeImageTransform" since="21">
+ <extends name="android/transition/Transition" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ </class>
+ <class name="android/transition/ChangeTransform" since="21">
+ <extends name="android/transition/Transition" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="getReparent()Z" />
+ <method name="getReparentWithOverlay()Z" />
+ <method name="setReparent(Z)V" />
+ <method name="setReparentWithOverlay(Z)V" />
+ </class>
+ <class name="android/transition/CircularPropagation" since="21">
+ <extends name="android/transition/VisibilityPropagation" />
+ <method name="&lt;init>()V" />
+ <method name="setPropagationSpeed(F)V" />
+ </class>
+ <class name="android/transition/Explode" since="21">
+ <extends name="android/transition/Visibility" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ </class>
+ <class name="android/transition/Fade" since="19">
+ <extends name="android/transition/Visibility" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" since="21" />
+ <field name="IN" />
+ <field name="OUT" />
+ </class>
+ <class name="android/transition/PathMotion" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="getPath(FFFF)Landroid/graphics/Path;" />
+ </class>
+ <class name="android/transition/PatternPathMotion" since="21">
+ <extends name="android/transition/PathMotion" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/graphics/Path;)V" />
+ <method name="getPatternPath()Landroid/graphics/Path;" />
+ <method name="setPatternPath(Landroid/graphics/Path;)V" />
+ </class>
+ <class name="android/transition/Scene" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/view/ViewGroup;)V" />
+ <method name="&lt;init>(Landroid/view/ViewGroup;Landroid/view/View;)V" since="21" />
+ <method name="&lt;init>(Landroid/view/ViewGroup;Landroid/view/ViewGroup;)V" />
+ <method name="enter()V" />
+ <method name="exit()V" />
+ <method name="getSceneForLayout(Landroid/view/ViewGroup;ILandroid/content/Context;)Landroid/transition/Scene;" />
+ <method name="getSceneRoot()Landroid/view/ViewGroup;" />
+ <method name="setEnterAction(Ljava/lang/Runnable;)V" />
+ <method name="setExitAction(Ljava/lang/Runnable;)V" />
+ </class>
+ <class name="android/transition/SidePropagation" since="21">
+ <extends name="android/transition/VisibilityPropagation" />
+ <method name="&lt;init>()V" />
+ <method name="setPropagationSpeed(F)V" />
+ <method name="setSide(I)V" />
+ </class>
+ <class name="android/transition/Slide" since="21">
+ <extends name="android/transition/Visibility" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="getSlideEdge()I" />
+ <method name="setSlideEdge(I)V" />
+ </class>
+ <class name="android/transition/Transition" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" since="21" />
+ <method name="addListener(Landroid/transition/Transition$TransitionListener;)Landroid/transition/Transition;" />
+ <method name="addTarget(I)Landroid/transition/Transition;" />
+ <method name="addTarget(Landroid/view/View;)Landroid/transition/Transition;" />
+ <method name="addTarget(Ljava/lang/Class;)Landroid/transition/Transition;" since="21" />
+ <method name="addTarget(Ljava/lang/String;)Landroid/transition/Transition;" since="21" />
+ <method name="canRemoveViews()Z" since="21" />
+ <method name="captureEndValues(Landroid/transition/TransitionValues;)V" />
+ <method name="captureStartValues(Landroid/transition/TransitionValues;)V" />
+ <method name="clone()Landroid/transition/Transition;" />
+ <method name="createAnimator(Landroid/view/ViewGroup;Landroid/transition/TransitionValues;Landroid/transition/TransitionValues;)Landroid/animation/Animator;" />
+ <method name="excludeChildren(IZ)Landroid/transition/Transition;" />
+ <method name="excludeChildren(Landroid/view/View;Z)Landroid/transition/Transition;" />
+ <method name="excludeChildren(Ljava/lang/Class;Z)Landroid/transition/Transition;" />
+ <method name="excludeTarget(IZ)Landroid/transition/Transition;" />
+ <method name="excludeTarget(Landroid/view/View;Z)Landroid/transition/Transition;" />
+ <method name="excludeTarget(Ljava/lang/Class;Z)Landroid/transition/Transition;" />
+ <method name="excludeTarget(Ljava/lang/String;Z)Landroid/transition/Transition;" since="21" />
+ <method name="getDuration()J" />
+ <method name="getEpicenter()Landroid/graphics/Rect;" since="21" />
+ <method name="getEpicenterCallback()Landroid/transition/Transition$EpicenterCallback;" since="21" />
+ <method name="getInterpolator()Landroid/animation/TimeInterpolator;" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getPathMotion()Landroid/transition/PathMotion;" since="21" />
+ <method name="getPropagation()Landroid/transition/TransitionPropagation;" since="21" />
+ <method name="getStartDelay()J" />
+ <method name="getTargetIds()Ljava/util/List;" />
+ <method name="getTargetNames()Ljava/util/List;" since="21" />
+ <method name="getTargetTypes()Ljava/util/List;" since="21" />
+ <method name="getTargets()Ljava/util/List;" />
+ <method name="getTransitionProperties()[Ljava/lang/String;" />
+ <method name="getTransitionValues(Landroid/view/View;Z)Landroid/transition/TransitionValues;" />
+ <method name="removeListener(Landroid/transition/Transition$TransitionListener;)Landroid/transition/Transition;" />
+ <method name="removeTarget(I)Landroid/transition/Transition;" />
+ <method name="removeTarget(Landroid/view/View;)Landroid/transition/Transition;" />
+ <method name="removeTarget(Ljava/lang/Class;)Landroid/transition/Transition;" since="21" />
+ <method name="removeTarget(Ljava/lang/String;)Landroid/transition/Transition;" since="21" />
+ <method name="setDuration(J)Landroid/transition/Transition;" />
+ <method name="setEpicenterCallback(Landroid/transition/Transition$EpicenterCallback;)V" since="21" />
+ <method name="setInterpolator(Landroid/animation/TimeInterpolator;)Landroid/transition/Transition;" />
+ <method name="setMatchOrder([I)V" since="21" />
+ <method name="setPathMotion(Landroid/transition/PathMotion;)V" since="21" />
+ <method name="setPropagation(Landroid/transition/TransitionPropagation;)V" since="21" />
+ <method name="setStartDelay(J)Landroid/transition/Transition;" />
+ <field name="MATCH_ID" since="21" />
+ <field name="MATCH_INSTANCE" since="21" />
+ <field name="MATCH_ITEM_ID" since="21" />
+ <field name="MATCH_NAME" since="21" />
+ </class>
+ <class name="android/transition/Transition$EpicenterCallback" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onGetEpicenter(Landroid/transition/Transition;)Landroid/graphics/Rect;" />
+ </class>
+ <class name="android/transition/Transition$TransitionListener" since="19">
+ <extends name="java/lang/Object" />
+ <method name="onTransitionCancel(Landroid/transition/Transition;)V" />
+ <method name="onTransitionEnd(Landroid/transition/Transition;)V" />
+ <method name="onTransitionPause(Landroid/transition/Transition;)V" />
+ <method name="onTransitionResume(Landroid/transition/Transition;)V" />
+ <method name="onTransitionStart(Landroid/transition/Transition;)V" />
+ </class>
+ <class name="android/transition/TransitionInflater" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="from(Landroid/content/Context;)Landroid/transition/TransitionInflater;" />
+ <method name="inflateTransition(I)Landroid/transition/Transition;" />
+ <method name="inflateTransitionManager(ILandroid/view/ViewGroup;)Landroid/transition/TransitionManager;" />
+ </class>
+ <class name="android/transition/TransitionManager" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="beginDelayedTransition(Landroid/view/ViewGroup;)V" />
+ <method name="beginDelayedTransition(Landroid/view/ViewGroup;Landroid/transition/Transition;)V" />
+ <method name="go(Landroid/transition/Scene;)V" />
+ <method name="go(Landroid/transition/Scene;Landroid/transition/Transition;)V" />
+ <method name="setTransition(Landroid/transition/Scene;Landroid/transition/Scene;Landroid/transition/Transition;)V" />
+ <method name="setTransition(Landroid/transition/Scene;Landroid/transition/Transition;)V" />
+ <method name="transitionTo(Landroid/transition/Scene;)V" />
+ </class>
+ <class name="android/transition/TransitionPropagation" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="captureValues(Landroid/transition/TransitionValues;)V" />
+ <method name="getPropagationProperties()[Ljava/lang/String;" />
+ <method name="getStartDelay(Landroid/view/ViewGroup;Landroid/transition/Transition;Landroid/transition/TransitionValues;Landroid/transition/TransitionValues;)J" />
+ </class>
+ <class name="android/transition/TransitionSet" since="19">
+ <extends name="android/transition/Transition" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" since="21" />
+ <method name="addListener(Landroid/transition/Transition$TransitionListener;)Landroid/transition/TransitionSet;" />
+ <method name="addTarget(I)Landroid/transition/TransitionSet;" />
+ <method name="addTarget(Landroid/view/View;)Landroid/transition/TransitionSet;" />
+ <method name="addTarget(Ljava/lang/Class;)Landroid/transition/TransitionSet;" since="21" />
+ <method name="addTarget(Ljava/lang/String;)Landroid/transition/TransitionSet;" since="21" />
+ <method name="addTransition(Landroid/transition/Transition;)Landroid/transition/TransitionSet;" />
+ <method name="clone()Landroid/transition/TransitionSet;" />
+ <method name="getOrdering()I" />
+ <method name="getTransitionAt(I)Landroid/transition/Transition;" since="21" />
+ <method name="getTransitionCount()I" since="21" />
+ <method name="removeListener(Landroid/transition/Transition$TransitionListener;)Landroid/transition/TransitionSet;" />
+ <method name="removeTarget(I)Landroid/transition/TransitionSet;" />
+ <method name="removeTarget(Landroid/view/View;)Landroid/transition/TransitionSet;" />
+ <method name="removeTarget(Ljava/lang/Class;)Landroid/transition/TransitionSet;" since="21" />
+ <method name="removeTarget(Ljava/lang/String;)Landroid/transition/TransitionSet;" since="21" />
+ <method name="removeTransition(Landroid/transition/Transition;)Landroid/transition/TransitionSet;" />
+ <method name="setDuration(J)Landroid/transition/TransitionSet;" />
+ <method name="setInterpolator(Landroid/animation/TimeInterpolator;)Landroid/transition/TransitionSet;" />
+ <method name="setOrdering(I)Landroid/transition/TransitionSet;" />
+ <method name="setStartDelay(J)Landroid/transition/TransitionSet;" />
+ <field name="ORDERING_SEQUENTIAL" />
+ <field name="ORDERING_TOGETHER" />
+ </class>
+ <class name="android/transition/TransitionValues" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="values" />
+ <field name="view" />
+ </class>
+ <class name="android/transition/Visibility" since="19">
+ <extends name="android/transition/Transition" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" since="21" />
+ <method name="getMode()I" since="21" />
+ <method name="isVisible(Landroid/transition/TransitionValues;)Z" />
+ <method name="onAppear(Landroid/view/ViewGroup;Landroid/transition/TransitionValues;ILandroid/transition/TransitionValues;I)Landroid/animation/Animator;" />
+ <method name="onAppear(Landroid/view/ViewGroup;Landroid/view/View;Landroid/transition/TransitionValues;Landroid/transition/TransitionValues;)Landroid/animation/Animator;" since="21" />
+ <method name="onDisappear(Landroid/view/ViewGroup;Landroid/transition/TransitionValues;ILandroid/transition/TransitionValues;I)Landroid/animation/Animator;" />
+ <method name="onDisappear(Landroid/view/ViewGroup;Landroid/view/View;Landroid/transition/TransitionValues;Landroid/transition/TransitionValues;)Landroid/animation/Animator;" since="21" />
+ <method name="setMode(I)V" since="21" />
+ <field name="MODE_IN" since="21" />
+ <field name="MODE_OUT" since="21" />
+ </class>
+ <class name="android/transition/VisibilityPropagation" since="21">
+ <extends name="android/transition/TransitionPropagation" />
+ <method name="&lt;init>()V" />
+ <method name="getViewVisibility(Landroid/transition/TransitionValues;)I" />
+ <method name="getViewX(Landroid/transition/TransitionValues;)I" />
+ <method name="getViewY(Landroid/transition/TransitionValues;)I" />
+ </class>
+ <class name="android/util/AndroidException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/Exception;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" since="11" />
+ </class>
+ <class name="android/util/AndroidRuntimeException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/Exception;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" since="11" />
+ </class>
+ <class name="android/util/ArrayMap" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/Map" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Landroid/util/ArrayMap;)V" />
+ <method name="containsAll(Ljava/util/Collection;)Z" />
+ <method name="ensureCapacity(I)V" />
+ <method name="indexOfKey(Ljava/lang/Object;)I" since="21" />
+ <method name="keyAt(I)Ljava/lang/Object;" />
+ <method name="putAll(Landroid/util/ArrayMap;)V" />
+ <method name="removeAll(Ljava/util/Collection;)Z" />
+ <method name="removeAt(I)Ljava/lang/Object;" />
+ <method name="retainAll(Ljava/util/Collection;)Z" />
+ <method name="setValueAt(ILjava/lang/Object;)Ljava/lang/Object;" />
+ <method name="valueAt(I)Ljava/lang/Object;" />
+ </class>
+ <class name="android/util/AtomicFile" since="17">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/io/File;)V" />
+ <method name="delete()V" />
+ <method name="failWrite(Ljava/io/FileOutputStream;)V" />
+ <method name="finishWrite(Ljava/io/FileOutputStream;)V" />
+ <method name="getBaseFile()Ljava/io/File;" />
+ <method name="openRead()Ljava/io/FileInputStream;" />
+ <method name="readFully()[B" />
+ <method name="startWrite()Ljava/io/FileOutputStream;" />
+ </class>
+ <class name="android/util/AttributeSet" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getAttributeBooleanValue(IZ)Z" />
+ <method name="getAttributeBooleanValue(Ljava/lang/String;Ljava/lang/String;Z)Z" />
+ <method name="getAttributeCount()I" />
+ <method name="getAttributeFloatValue(IF)F" />
+ <method name="getAttributeFloatValue(Ljava/lang/String;Ljava/lang/String;F)F" />
+ <method name="getAttributeIntValue(II)I" />
+ <method name="getAttributeIntValue(Ljava/lang/String;Ljava/lang/String;I)I" />
+ <method name="getAttributeListValue(I[Ljava/lang/String;I)I" />
+ <method name="getAttributeListValue(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;I)I" />
+ <method name="getAttributeName(I)Ljava/lang/String;" />
+ <method name="getAttributeNameResource(I)I" />
+ <method name="getAttributeResourceValue(II)I" />
+ <method name="getAttributeResourceValue(Ljava/lang/String;Ljava/lang/String;I)I" />
+ <method name="getAttributeUnsignedIntValue(II)I" />
+ <method name="getAttributeUnsignedIntValue(Ljava/lang/String;Ljava/lang/String;I)I" />
+ <method name="getAttributeValue(I)Ljava/lang/String;" />
+ <method name="getAttributeValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getClassAttribute()Ljava/lang/String;" />
+ <method name="getIdAttribute()Ljava/lang/String;" />
+ <method name="getIdAttributeResourceValue(I)I" />
+ <method name="getPositionDescription()Ljava/lang/String;" />
+ <method name="getStyleAttribute()I" />
+ </class>
+ <class name="android/util/Base64" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="decode(Ljava/lang/String;I)[B" />
+ <method name="decode([BI)[B" />
+ <method name="decode([BIII)[B" />
+ <method name="encode([BI)[B" />
+ <method name="encode([BIII)[B" />
+ <method name="encodeToString([BI)Ljava/lang/String;" />
+ <method name="encodeToString([BIII)Ljava/lang/String;" />
+ <field name="CRLF" />
+ <field name="DEFAULT" />
+ <field name="NO_CLOSE" />
+ <field name="NO_PADDING" />
+ <field name="NO_WRAP" />
+ <field name="URL_SAFE" />
+ </class>
+ <class name="android/util/Base64DataException" since="11">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/util/Base64InputStream" since="8">
+ <extends name="java/io/FilterInputStream" />
+ <method name="&lt;init>(Ljava/io/InputStream;I)V" />
+ </class>
+ <class name="android/util/Base64OutputStream" since="8">
+ <extends name="java/io/FilterOutputStream" />
+ <method name="&lt;init>(Ljava/io/OutputStream;I)V" />
+ </class>
+ <class name="android/util/Config" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="DEBUG" />
+ <field name="LOGD" />
+ <field name="LOGV" />
+ <field name="PROFILE" />
+ <field name="RELEASE" />
+ </class>
+ <class name="android/util/DebugUtils" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="isObjectSelected(Ljava/lang/Object;)Z" />
+ </class>
+ <class name="android/util/DisplayMetrics" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="equals(Landroid/util/DisplayMetrics;)Z" since="17" />
+ <method name="setTo(Landroid/util/DisplayMetrics;)V" />
+ <method name="setToDefaults()V" />
+ <field name="DENSITY_400" since="19" />
+ <field name="DENSITY_560" since="21" />
+ <field name="DENSITY_DEFAULT" since="4" />
+ <field name="DENSITY_HIGH" since="4" />
+ <field name="DENSITY_LOW" since="4" />
+ <field name="DENSITY_MEDIUM" since="4" />
+ <field name="DENSITY_TV" since="13" />
+ <field name="DENSITY_XHIGH" since="9" />
+ <field name="DENSITY_XXHIGH" since="16" />
+ <field name="DENSITY_XXXHIGH" since="18" />
+ <field name="density" />
+ <field name="densityDpi" since="4" />
+ <field name="heightPixels" />
+ <field name="scaledDensity" />
+ <field name="widthPixels" />
+ <field name="xdpi" />
+ <field name="ydpi" />
+ </class>
+ <class name="android/util/EventLog" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getTagCode(Ljava/lang/String;)I" />
+ <method name="getTagName(I)Ljava/lang/String;" />
+ <method name="readEvents([ILjava/util/Collection;)V" />
+ <method name="writeEvent(II)I" />
+ <method name="writeEvent(IJ)I" />
+ <method name="writeEvent(ILjava/lang/String;)I" />
+ <method name="writeEvent(I[Ljava/lang/Object;)I" />
+ </class>
+ <class name="android/util/EventLog$Event" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getData()Ljava/lang/Object;" />
+ <method name="getProcessId()I" />
+ <method name="getTag()I" />
+ <method name="getThreadId()I" />
+ <method name="getTimeNanos()J" />
+ </class>
+ <class name="android/util/EventLogTags" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/io/BufferedReader;)V" />
+ <method name="get(I)Landroid/util/EventLogTags$Description;" />
+ <method name="get(Ljava/lang/String;)Landroid/util/EventLogTags$Description;" />
+ </class>
+ <class name="android/util/EventLogTags$Description" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="mName" />
+ <field name="mTag" />
+ </class>
+ <class name="android/util/FloatMath" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="ceil(F)F" />
+ <method name="cos(F)F" />
+ <method name="exp(F)F" since="17" />
+ <method name="floor(F)F" />
+ <method name="hypot(FF)F" since="17" />
+ <method name="pow(FF)F" since="17" />
+ <method name="sin(F)F" />
+ <method name="sqrt(F)F" />
+ </class>
+ <class name="android/util/JsonReader" since="11">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Closeable" />
+ <method name="&lt;init>(Ljava/io/Reader;)V" />
+ <method name="beginArray()V" />
+ <method name="beginObject()V" />
+ <method name="endArray()V" />
+ <method name="endObject()V" />
+ <method name="hasNext()Z" />
+ <method name="isLenient()Z" />
+ <method name="nextBoolean()Z" />
+ <method name="nextDouble()D" />
+ <method name="nextInt()I" />
+ <method name="nextLong()J" />
+ <method name="nextName()Ljava/lang/String;" />
+ <method name="nextNull()V" />
+ <method name="nextString()Ljava/lang/String;" />
+ <method name="peek()Landroid/util/JsonToken;" />
+ <method name="setLenient(Z)V" />
+ <method name="skipValue()V" />
+ </class>
+ <class name="android/util/JsonToken" since="11">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/util/JsonToken;" />
+ <method name="values()[Landroid/util/JsonToken;" />
+ <field name="BEGIN_ARRAY" />
+ <field name="BEGIN_OBJECT" />
+ <field name="BOOLEAN" />
+ <field name="END_ARRAY" />
+ <field name="END_DOCUMENT" />
+ <field name="END_OBJECT" />
+ <field name="NAME" />
+ <field name="NULL" />
+ <field name="NUMBER" />
+ <field name="STRING" />
+ </class>
+ <class name="android/util/JsonWriter" since="11">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Closeable" />
+ <method name="&lt;init>(Ljava/io/Writer;)V" />
+ <method name="beginArray()Landroid/util/JsonWriter;" />
+ <method name="beginObject()Landroid/util/JsonWriter;" />
+ <method name="endArray()Landroid/util/JsonWriter;" />
+ <method name="endObject()Landroid/util/JsonWriter;" />
+ <method name="flush()V" />
+ <method name="isLenient()Z" />
+ <method name="name(Ljava/lang/String;)Landroid/util/JsonWriter;" />
+ <method name="nullValue()Landroid/util/JsonWriter;" />
+ <method name="setIndent(Ljava/lang/String;)V" />
+ <method name="setLenient(Z)V" />
+ <method name="value(D)Landroid/util/JsonWriter;" />
+ <method name="value(J)Landroid/util/JsonWriter;" />
+ <method name="value(Ljava/lang/Number;)Landroid/util/JsonWriter;" />
+ <method name="value(Ljava/lang/String;)Landroid/util/JsonWriter;" />
+ <method name="value(Z)Landroid/util/JsonWriter;" />
+ </class>
+ <class name="android/util/LayoutDirection" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="INHERIT" />
+ <field name="LOCALE" />
+ <field name="LTR" />
+ <field name="RTL" />
+ </class>
+ <class name="android/util/Log" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="d(Ljava/lang/String;Ljava/lang/String;)I" />
+ <method name="d(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I" />
+ <method name="e(Ljava/lang/String;Ljava/lang/String;)I" />
+ <method name="e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I" />
+ <method name="getStackTraceString(Ljava/lang/Throwable;)Ljava/lang/String;" />
+ <method name="i(Ljava/lang/String;Ljava/lang/String;)I" />
+ <method name="i(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I" />
+ <method name="isLoggable(Ljava/lang/String;I)Z" />
+ <method name="println(ILjava/lang/String;Ljava/lang/String;)I" />
+ <method name="v(Ljava/lang/String;Ljava/lang/String;)I" />
+ <method name="v(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I" />
+ <method name="w(Ljava/lang/String;Ljava/lang/String;)I" />
+ <method name="w(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I" />
+ <method name="w(Ljava/lang/String;Ljava/lang/Throwable;)I" />
+ <method name="wtf(Ljava/lang/String;Ljava/lang/String;)I" since="8" />
+ <method name="wtf(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I" since="8" />
+ <method name="wtf(Ljava/lang/String;Ljava/lang/Throwable;)I" since="8" />
+ <field name="ASSERT" />
+ <field name="DEBUG" />
+ <field name="ERROR" />
+ <field name="INFO" />
+ <field name="VERBOSE" />
+ <field name="WARN" />
+ </class>
+ <class name="android/util/LogPrinter" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/util/Printer" />
+ <method name="&lt;init>(ILjava/lang/String;)V" />
+ </class>
+ <class name="android/util/LongSparseArray" since="16">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="append(JLjava/lang/Object;)V" />
+ <method name="clear()V" />
+ <method name="clone()Landroid/util/LongSparseArray;" />
+ <method name="delete(J)V" />
+ <method name="get(J)Ljava/lang/Object;" />
+ <method name="get(JLjava/lang/Object;)Ljava/lang/Object;" />
+ <method name="indexOfKey(J)I" />
+ <method name="indexOfValue(Ljava/lang/Object;)I" />
+ <method name="keyAt(I)J" />
+ <method name="put(JLjava/lang/Object;)V" />
+ <method name="remove(J)V" />
+ <method name="removeAt(I)V" />
+ <method name="setValueAt(ILjava/lang/Object;)V" />
+ <method name="size()I" />
+ <method name="valueAt(I)Ljava/lang/Object;" />
+ </class>
+ <class name="android/util/LruCache" since="12">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(I)V" />
+ <method name="create(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="createCount()I" />
+ <method name="entryRemoved(ZLjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V" />
+ <method name="evictAll()V" />
+ <method name="evictionCount()I" />
+ <method name="get(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="hitCount()I" />
+ <method name="maxSize()I" />
+ <method name="missCount()I" />
+ <method name="put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="putCount()I" />
+ <method name="remove(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="resize(I)V" since="21" />
+ <method name="size()I" />
+ <method name="sizeOf(Ljava/lang/Object;Ljava/lang/Object;)I" />
+ <method name="snapshot()Ljava/util/Map;" />
+ <method name="trimToSize(I)V" since="17" />
+ </class>
+ <class name="android/util/MalformedJsonException" since="11">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/util/MonthDisplayHelper" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(II)V" />
+ <method name="&lt;init>(III)V" />
+ <method name="getColumnOf(I)I" />
+ <method name="getDayAt(II)I" />
+ <method name="getDigitsForRow(I)[I" />
+ <method name="getFirstDayOfMonth()I" />
+ <method name="getMonth()I" />
+ <method name="getNumberOfDaysInMonth()I" />
+ <method name="getOffset()I" />
+ <method name="getRowOf(I)I" />
+ <method name="getWeekStartDay()I" />
+ <method name="getYear()I" />
+ <method name="isWithinCurrentMonth(II)Z" />
+ <method name="nextMonth()V" />
+ <method name="previousMonth()V" />
+ </class>
+ <class name="android/util/MutableBoolean" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Z)V" />
+ <field name="value" />
+ </class>
+ <class name="android/util/MutableByte" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(B)V" />
+ <field name="value" />
+ </class>
+ <class name="android/util/MutableChar" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(C)V" />
+ <field name="value" />
+ </class>
+ <class name="android/util/MutableDouble" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(D)V" />
+ <field name="value" />
+ </class>
+ <class name="android/util/MutableFloat" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(F)V" />
+ <field name="value" />
+ </class>
+ <class name="android/util/MutableInt" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(I)V" />
+ <field name="value" />
+ </class>
+ <class name="android/util/MutableLong" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(J)V" />
+ <field name="value" />
+ </class>
+ <class name="android/util/MutableShort" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(S)V" />
+ <field name="value" />
+ </class>
+ <class name="android/util/NoSuchPropertyException" since="14">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/util/Pair" since="5">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/Object;Ljava/lang/Object;)V" />
+ <method name="create(Ljava/lang/Object;Ljava/lang/Object;)Landroid/util/Pair;" />
+ <field name="first" />
+ <field name="second" />
+ </class>
+ <class name="android/util/Patterns" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="concatGroups(Ljava/util/regex/Matcher;)Ljava/lang/String;" />
+ <method name="digitsAndPlusOnly(Ljava/util/regex/Matcher;)Ljava/lang/String;" />
+ <field name="DOMAIN_NAME" />
+ <field name="EMAIL_ADDRESS" />
+ <field name="GOOD_IRI_CHAR" />
+ <field name="IP_ADDRESS" />
+ <field name="PHONE" />
+ <field name="TOP_LEVEL_DOMAIN" />
+ <field name="TOP_LEVEL_DOMAIN_STR" />
+ <field name="TOP_LEVEL_DOMAIN_STR_FOR_WEB_URL" />
+ <field name="WEB_URL" />
+ </class>
+ <class name="android/util/PrintStreamPrinter" since="3">
+ <extends name="java/lang/Object" />
+ <implements name="android/util/Printer" />
+ <method name="&lt;init>(Ljava/io/PrintStream;)V" />
+ </class>
+ <class name="android/util/PrintWriterPrinter" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/util/Printer" />
+ <method name="&lt;init>(Ljava/io/PrintWriter;)V" />
+ </class>
+ <class name="android/util/Printer" since="1">
+ <extends name="java/lang/Object" />
+ <method name="println(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/util/Property" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/Class;Ljava/lang/String;)V" />
+ <method name="get(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getType()Ljava/lang/Class;" />
+ <method name="isReadOnly()Z" />
+ <method name="of(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/String;)Landroid/util/Property;" />
+ <method name="set(Ljava/lang/Object;Ljava/lang/Object;)V" />
+ </class>
+ <class name="android/util/Range" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/Comparable;Ljava/lang/Comparable;)V" />
+ <method name="clamp(Ljava/lang/Comparable;)Ljava/lang/Comparable;" />
+ <method name="contains(Landroid/util/Range;)Z" />
+ <method name="contains(Ljava/lang/Comparable;)Z" />
+ <method name="create(Ljava/lang/Comparable;Ljava/lang/Comparable;)Landroid/util/Range;" />
+ <method name="extend(Landroid/util/Range;)Landroid/util/Range;" />
+ <method name="extend(Ljava/lang/Comparable;)Landroid/util/Range;" />
+ <method name="extend(Ljava/lang/Comparable;Ljava/lang/Comparable;)Landroid/util/Range;" />
+ <method name="getLower()Ljava/lang/Comparable;" />
+ <method name="getUpper()Ljava/lang/Comparable;" />
+ <method name="intersect(Landroid/util/Range;)Landroid/util/Range;" />
+ <method name="intersect(Ljava/lang/Comparable;Ljava/lang/Comparable;)Landroid/util/Range;" />
+ </class>
+ <class name="android/util/Rational" since="21">
+ <extends name="java/lang/Number" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>(II)V" />
+ <method name="compareTo(Landroid/util/Rational;)I" />
+ <method name="getDenominator()I" />
+ <method name="getNumerator()I" />
+ <method name="isFinite()Z" />
+ <method name="isInfinite()Z" />
+ <method name="isNaN()Z" />
+ <method name="isZero()Z" />
+ <method name="parseRational(Ljava/lang/String;)Landroid/util/Rational;" />
+ <field name="NEGATIVE_INFINITY" />
+ <field name="NaN" />
+ <field name="POSITIVE_INFINITY" />
+ <field name="ZERO" />
+ </class>
+ <class name="android/util/Size" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(II)V" />
+ <method name="getHeight()I" />
+ <method name="getWidth()I" />
+ <method name="parseSize(Ljava/lang/String;)Landroid/util/Size;" />
+ </class>
+ <class name="android/util/SizeF" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(FF)V" />
+ <method name="getHeight()F" />
+ <method name="getWidth()F" />
+ <method name="parseSizeF(Ljava/lang/String;)Landroid/util/SizeF;" />
+ </class>
+ <class name="android/util/SparseArray" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" since="14" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="append(ILjava/lang/Object;)V" />
+ <method name="clear()V" />
+ <method name="clone()Landroid/util/SparseArray;" since="14" />
+ <method name="delete(I)V" />
+ <method name="get(I)Ljava/lang/Object;" />
+ <method name="get(ILjava/lang/Object;)Ljava/lang/Object;" />
+ <method name="indexOfKey(I)I" />
+ <method name="indexOfValue(Ljava/lang/Object;)I" />
+ <method name="keyAt(I)I" />
+ <method name="put(ILjava/lang/Object;)V" />
+ <method name="remove(I)V" />
+ <method name="removeAt(I)V" since="11" />
+ <method name="removeAtRange(II)V" since="19" />
+ <method name="setValueAt(ILjava/lang/Object;)V" />
+ <method name="size()I" />
+ <method name="valueAt(I)Ljava/lang/Object;" />
+ </class>
+ <class name="android/util/SparseBooleanArray" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" since="14" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="append(IZ)V" />
+ <method name="clear()V" />
+ <method name="clone()Landroid/util/SparseBooleanArray;" since="14" />
+ <method name="delete(I)V" />
+ <method name="get(I)Z" />
+ <method name="get(IZ)Z" />
+ <method name="indexOfKey(I)I" />
+ <method name="indexOfValue(Z)I" />
+ <method name="keyAt(I)I" />
+ <method name="put(IZ)V" />
+ <method name="size()I" />
+ <method name="valueAt(I)Z" />
+ </class>
+ <class name="android/util/SparseIntArray" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" since="14" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="append(II)V" />
+ <method name="clear()V" />
+ <method name="clone()Landroid/util/SparseIntArray;" since="14" />
+ <method name="delete(I)V" />
+ <method name="get(I)I" />
+ <method name="get(II)I" />
+ <method name="indexOfKey(I)I" />
+ <method name="indexOfValue(I)I" />
+ <method name="keyAt(I)I" />
+ <method name="put(II)V" />
+ <method name="removeAt(I)V" since="3" />
+ <method name="size()I" />
+ <method name="valueAt(I)I" />
+ </class>
+ <class name="android/util/SparseLongArray" since="18">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="append(IJ)V" />
+ <method name="clear()V" />
+ <method name="clone()Landroid/util/SparseLongArray;" />
+ <method name="delete(I)V" />
+ <method name="get(I)J" />
+ <method name="get(IJ)J" />
+ <method name="indexOfKey(I)I" />
+ <method name="indexOfValue(J)I" />
+ <method name="keyAt(I)I" />
+ <method name="put(IJ)V" />
+ <method name="removeAt(I)V" />
+ <method name="size()I" />
+ <method name="valueAt(I)J" />
+ </class>
+ <class name="android/util/StateSet" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="dump([I)Ljava/lang/String;" />
+ <method name="isWildCard([I)Z" />
+ <method name="stateSetMatches([II)Z" />
+ <method name="stateSetMatches([I[I)Z" />
+ <method name="trimStateSet([II)[I" />
+ <field name="NOTHING" since="11" />
+ <field name="WILD_CARD" />
+ </class>
+ <class name="android/util/StringBuilderPrinter" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/util/Printer" />
+ <method name="&lt;init>(Ljava/lang/StringBuilder;)V" />
+ </class>
+ <class name="android/util/TimeFormatException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/util/TimeUtils" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getTimeZone(IZJLjava/lang/String;)Ljava/util/TimeZone;" />
+ <method name="getTimeZoneDatabaseVersion()Ljava/lang/String;" since="3" />
+ </class>
+ <class name="android/util/TimingLogger" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="addSplit(Ljava/lang/String;)V" />
+ <method name="dumpToLog()V" />
+ <method name="reset()V" />
+ <method name="reset(Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="android/util/TypedValue" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="applyDimension(IFLandroid/util/DisplayMetrics;)F" />
+ <method name="coerceToString()Ljava/lang/CharSequence;" />
+ <method name="coerceToString(II)Ljava/lang/String;" />
+ <method name="complexToDimension(ILandroid/util/DisplayMetrics;)F" />
+ <method name="complexToDimensionNoisy(ILandroid/util/DisplayMetrics;)F" />
+ <method name="complexToDimensionPixelOffset(ILandroid/util/DisplayMetrics;)I" />
+ <method name="complexToDimensionPixelSize(ILandroid/util/DisplayMetrics;)I" />
+ <method name="complexToFloat(I)F" />
+ <method name="complexToFraction(IFF)F" />
+ <method name="getDimension(Landroid/util/DisplayMetrics;)F" />
+ <method name="getFloat()F" />
+ <method name="getFraction(FF)F" />
+ <method name="setTo(Landroid/util/TypedValue;)V" />
+ <field name="COMPLEX_MANTISSA_MASK" />
+ <field name="COMPLEX_MANTISSA_SHIFT" />
+ <field name="COMPLEX_RADIX_0p23" />
+ <field name="COMPLEX_RADIX_16p7" />
+ <field name="COMPLEX_RADIX_23p0" />
+ <field name="COMPLEX_RADIX_8p15" />
+ <field name="COMPLEX_RADIX_MASK" />
+ <field name="COMPLEX_RADIX_SHIFT" />
+ <field name="COMPLEX_UNIT_DIP" />
+ <field name="COMPLEX_UNIT_FRACTION" />
+ <field name="COMPLEX_UNIT_FRACTION_PARENT" />
+ <field name="COMPLEX_UNIT_IN" />
+ <field name="COMPLEX_UNIT_MASK" />
+ <field name="COMPLEX_UNIT_MM" />
+ <field name="COMPLEX_UNIT_PT" />
+ <field name="COMPLEX_UNIT_PX" />
+ <field name="COMPLEX_UNIT_SHIFT" />
+ <field name="COMPLEX_UNIT_SP" />
+ <field name="DENSITY_DEFAULT" since="4" />
+ <field name="DENSITY_NONE" since="4" />
+ <field name="TYPE_ATTRIBUTE" />
+ <field name="TYPE_DIMENSION" />
+ <field name="TYPE_FIRST_COLOR_INT" />
+ <field name="TYPE_FIRST_INT" />
+ <field name="TYPE_FLOAT" />
+ <field name="TYPE_FRACTION" />
+ <field name="TYPE_INT_BOOLEAN" />
+ <field name="TYPE_INT_COLOR_ARGB4" />
+ <field name="TYPE_INT_COLOR_ARGB8" />
+ <field name="TYPE_INT_COLOR_RGB4" />
+ <field name="TYPE_INT_COLOR_RGB8" />
+ <field name="TYPE_INT_DEC" />
+ <field name="TYPE_INT_HEX" />
+ <field name="TYPE_LAST_COLOR_INT" />
+ <field name="TYPE_LAST_INT" />
+ <field name="TYPE_NULL" />
+ <field name="TYPE_REFERENCE" />
+ <field name="TYPE_STRING" />
+ <field name="assetCookie" />
+ <field name="changingConfigurations" />
+ <field name="data" />
+ <field name="density" since="4" />
+ <field name="resourceId" />
+ <field name="string" />
+ <field name="type" />
+ </class>
+ <class name="android/util/Xml" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="asAttributeSet(Lorg/xmlpull/v1/XmlPullParser;)Landroid/util/AttributeSet;" />
+ <method name="findEncodingByName(Ljava/lang/String;)Landroid/util/Xml$Encoding;" />
+ <method name="newPullParser()Lorg/xmlpull/v1/XmlPullParser;" />
+ <method name="newSerializer()Lorg/xmlpull/v1/XmlSerializer;" />
+ <method name="parse(Ljava/io/InputStream;Landroid/util/Xml$Encoding;Lorg/xml/sax/ContentHandler;)V" />
+ <method name="parse(Ljava/io/Reader;Lorg/xml/sax/ContentHandler;)V" />
+ <method name="parse(Ljava/lang/String;Lorg/xml/sax/ContentHandler;)V" />
+ <field name="FEATURE_RELAXED" />
+ </class>
+ <class name="android/util/Xml$Encoding" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/util/Xml$Encoding;" />
+ <method name="values()[Landroid/util/Xml$Encoding;" />
+ <field name="ISO_8859_1" />
+ <field name="US_ASCII" />
+ <field name="UTF_16" />
+ <field name="UTF_8" />
+ </class>
+ <class name="android/view/AbsSavedState" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="&lt;init>(Landroid/os/Parcelable;)V" />
+ <method name="getSuperState()Landroid/os/Parcelable;" />
+ <field name="CREATOR" />
+ <field name="EMPTY_STATE" />
+ </class>
+ <class name="android/view/ActionMode" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="finish()V" />
+ <method name="getCustomView()Landroid/view/View;" />
+ <method name="getMenu()Landroid/view/Menu;" />
+ <method name="getMenuInflater()Landroid/view/MenuInflater;" />
+ <method name="getSubtitle()Ljava/lang/CharSequence;" />
+ <method name="getTag()Ljava/lang/Object;" since="14" />
+ <method name="getTitle()Ljava/lang/CharSequence;" />
+ <method name="getTitleOptionalHint()Z" since="16" />
+ <method name="invalidate()V" />
+ <method name="isTitleOptional()Z" since="16" />
+ <method name="setCustomView(Landroid/view/View;)V" />
+ <method name="setSubtitle(I)V" />
+ <method name="setSubtitle(Ljava/lang/CharSequence;)V" />
+ <method name="setTag(Ljava/lang/Object;)V" since="14" />
+ <method name="setTitle(I)V" />
+ <method name="setTitle(Ljava/lang/CharSequence;)V" />
+ <method name="setTitleOptionalHint(Z)V" since="16" />
+ </class>
+ <class name="android/view/ActionMode$Callback" since="11">
+ <extends name="java/lang/Object" />
+ <method name="onActionItemClicked(Landroid/view/ActionMode;Landroid/view/MenuItem;)Z" />
+ <method name="onCreateActionMode(Landroid/view/ActionMode;Landroid/view/Menu;)Z" />
+ <method name="onDestroyActionMode(Landroid/view/ActionMode;)V" />
+ <method name="onPrepareActionMode(Landroid/view/ActionMode;Landroid/view/Menu;)Z" />
+ </class>
+ <class name="android/view/ActionProvider" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="hasSubMenu()Z" />
+ <method name="isVisible()Z" since="16" />
+ <method name="onCreateActionView()Landroid/view/View;" />
+ <method name="onCreateActionView(Landroid/view/MenuItem;)Landroid/view/View;" since="16" />
+ <method name="onPerformDefaultAction()Z" />
+ <method name="onPrepareSubMenu(Landroid/view/SubMenu;)V" />
+ <method name="overridesItemVisibility()Z" since="16" />
+ <method name="refreshVisibility()V" since="16" />
+ <method name="setVisibilityListener(Landroid/view/ActionProvider$VisibilityListener;)V" since="16" />
+ </class>
+ <class name="android/view/ActionProvider$VisibilityListener" since="16">
+ <extends name="java/lang/Object" />
+ <method name="onActionProviderVisibilityChanged(Z)V" />
+ </class>
+ <class name="android/view/Choreographer" since="16">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getInstance()Landroid/view/Choreographer;" />
+ <method name="postFrameCallback(Landroid/view/Choreographer$FrameCallback;)V" />
+ <method name="postFrameCallbackDelayed(Landroid/view/Choreographer$FrameCallback;J)V" />
+ <method name="removeFrameCallback(Landroid/view/Choreographer$FrameCallback;)V" />
+ </class>
+ <class name="android/view/Choreographer$FrameCallback" since="16">
+ <extends name="java/lang/Object" />
+ <method name="doFrame(J)V" />
+ </class>
+ <class name="android/view/CollapsibleActionView" since="14">
+ <extends name="java/lang/Object" />
+ <method name="onActionViewCollapsed()V" />
+ <method name="onActionViewExpanded()V" />
+ </class>
+ <class name="android/view/ContextMenu" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/Menu" />
+ <method name="clearHeader()V" />
+ <method name="setHeaderIcon(I)Landroid/view/ContextMenu;" />
+ <method name="setHeaderIcon(Landroid/graphics/drawable/Drawable;)Landroid/view/ContextMenu;" />
+ <method name="setHeaderTitle(I)Landroid/view/ContextMenu;" />
+ <method name="setHeaderTitle(Ljava/lang/CharSequence;)Landroid/view/ContextMenu;" />
+ <method name="setHeaderView(Landroid/view/View;)Landroid/view/ContextMenu;" />
+ </class>
+ <class name="android/view/ContextMenu$ContextMenuInfo" since="1">
+ <extends name="java/lang/Object" />
+ </class>
+ <class name="android/view/ContextThemeWrapper" since="1">
+ <extends name="android/content/ContextWrapper" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/Context;I)V" />
+ <method name="applyOverrideConfiguration(Landroid/content/res/Configuration;)V" since="17" />
+ <method name="onApplyThemeResource(Landroid/content/res/Resources$Theme;IZ)V" />
+ </class>
+ <class name="android/view/Display" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getAppVsyncOffsetNanos()J" since="21" />
+ <method name="getCurrentSizeRange(Landroid/graphics/Point;Landroid/graphics/Point;)V" since="16" />
+ <method name="getDisplayId()I" />
+ <method name="getFlags()I" since="17" />
+ <method name="getHeight()I" />
+ <method name="getMetrics(Landroid/util/DisplayMetrics;)V" />
+ <method name="getName()Ljava/lang/String;" since="17" />
+ <method name="getOrientation()I" />
+ <method name="getPixelFormat()I" />
+ <method name="getPresentationDeadlineNanos()J" since="21" />
+ <method name="getRealMetrics(Landroid/util/DisplayMetrics;)V" since="17" />
+ <method name="getRealSize(Landroid/graphics/Point;)V" since="17" />
+ <method name="getRectSize(Landroid/graphics/Rect;)V" since="13" />
+ <method name="getRefreshRate()F" />
+ <method name="getRotation()I" since="8" />
+ <method name="getSize(Landroid/graphics/Point;)V" since="13" />
+ <method name="getState()I" since="20" />
+ <method name="getSupportedRefreshRates()[F" since="21" />
+ <method name="getWidth()I" />
+ <method name="isValid()Z" since="17" />
+ <field name="DEFAULT_DISPLAY" />
+ <field name="FLAG_PRESENTATION" since="19" />
+ <field name="FLAG_PRIVATE" since="19" />
+ <field name="FLAG_SECURE" since="17" />
+ <field name="FLAG_SUPPORTS_PROTECTED_BUFFERS" since="17" />
+ <field name="STATE_DOZE" since="21" />
+ <field name="STATE_DOZE_SUSPEND" since="21" />
+ <field name="STATE_DOZING" since="20" />
+ <field name="STATE_OFF" since="20" />
+ <field name="STATE_ON" since="20" />
+ <field name="STATE_UNKNOWN" since="20" />
+ </class>
+ <class name="android/view/DragEvent" since="11">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getAction()I" />
+ <method name="getClipData()Landroid/content/ClipData;" />
+ <method name="getClipDescription()Landroid/content/ClipDescription;" />
+ <method name="getLocalState()Ljava/lang/Object;" />
+ <method name="getResult()Z" />
+ <method name="getX()F" />
+ <method name="getY()F" />
+ <field name="ACTION_DRAG_ENDED" />
+ <field name="ACTION_DRAG_ENTERED" />
+ <field name="ACTION_DRAG_EXITED" />
+ <field name="ACTION_DRAG_LOCATION" />
+ <field name="ACTION_DRAG_STARTED" />
+ <field name="ACTION_DROP" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/view/FocusFinder" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="findNearestTouchable(Landroid/view/ViewGroup;III[I)Landroid/view/View;" />
+ <method name="findNextFocus(Landroid/view/ViewGroup;Landroid/view/View;I)Landroid/view/View;" />
+ <method name="findNextFocusFromRect(Landroid/view/ViewGroup;Landroid/graphics/Rect;I)Landroid/view/View;" />
+ <method name="getInstance()Landroid/view/FocusFinder;" />
+ </class>
+ <class name="android/view/FrameStats" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getEndTimeNano()J" />
+ <method name="getFrameCount()I" />
+ <method name="getFramePresentedTimeNano(I)J" />
+ <method name="getRefreshPeriodNano()J" />
+ <method name="getStartTimeNano()J" />
+ <field name="UNDEFINED_TIME_NANO" />
+ </class>
+ <class name="android/view/GestureDetector" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/GestureDetector$OnGestureListener;)V" since="3" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/GestureDetector$OnGestureListener;Landroid/os/Handler;)V" since="3" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/GestureDetector$OnGestureListener;Landroid/os/Handler;Z)V" since="8" />
+ <method name="&lt;init>(Landroid/view/GestureDetector$OnGestureListener;)V" />
+ <method name="&lt;init>(Landroid/view/GestureDetector$OnGestureListener;Landroid/os/Handler;)V" />
+ <method name="isLongpressEnabled()Z" />
+ <method name="onTouchEvent(Landroid/view/MotionEvent;)Z" />
+ <method name="setIsLongpressEnabled(Z)V" />
+ <method name="setOnDoubleTapListener(Landroid/view/GestureDetector$OnDoubleTapListener;)V" since="3" />
+ </class>
+ <class name="android/view/GestureDetector$OnDoubleTapListener" since="3">
+ <extends name="java/lang/Object" />
+ <method name="onDoubleTap(Landroid/view/MotionEvent;)Z" />
+ <method name="onDoubleTapEvent(Landroid/view/MotionEvent;)Z" />
+ <method name="onSingleTapConfirmed(Landroid/view/MotionEvent;)Z" />
+ </class>
+ <class name="android/view/GestureDetector$OnGestureListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onDown(Landroid/view/MotionEvent;)Z" />
+ <method name="onFling(Landroid/view/MotionEvent;Landroid/view/MotionEvent;FF)Z" />
+ <method name="onLongPress(Landroid/view/MotionEvent;)V" />
+ <method name="onScroll(Landroid/view/MotionEvent;Landroid/view/MotionEvent;FF)Z" />
+ <method name="onShowPress(Landroid/view/MotionEvent;)V" />
+ <method name="onSingleTapUp(Landroid/view/MotionEvent;)Z" />
+ </class>
+ <class name="android/view/GestureDetector$SimpleOnGestureListener" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/GestureDetector$OnDoubleTapListener" since="3" />
+ <implements name="android/view/GestureDetector$OnGestureListener" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/view/Gravity" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="apply(IIILandroid/graphics/Rect;IILandroid/graphics/Rect;)V" />
+ <method name="apply(IIILandroid/graphics/Rect;IILandroid/graphics/Rect;I)V" since="17" />
+ <method name="apply(IIILandroid/graphics/Rect;Landroid/graphics/Rect;)V" />
+ <method name="apply(IIILandroid/graphics/Rect;Landroid/graphics/Rect;I)V" since="17" />
+ <method name="applyDisplay(ILandroid/graphics/Rect;Landroid/graphics/Rect;)V" since="3" />
+ <method name="applyDisplay(ILandroid/graphics/Rect;Landroid/graphics/Rect;I)V" since="17" />
+ <method name="getAbsoluteGravity(II)I" since="14" />
+ <method name="isHorizontal(I)Z" />
+ <method name="isVertical(I)Z" />
+ <field name="AXIS_CLIP" since="3" />
+ <field name="AXIS_PULL_AFTER" />
+ <field name="AXIS_PULL_BEFORE" />
+ <field name="AXIS_SPECIFIED" />
+ <field name="AXIS_X_SHIFT" />
+ <field name="AXIS_Y_SHIFT" />
+ <field name="BOTTOM" />
+ <field name="CENTER" />
+ <field name="CENTER_HORIZONTAL" />
+ <field name="CENTER_VERTICAL" />
+ <field name="CLIP_HORIZONTAL" since="3" />
+ <field name="CLIP_VERTICAL" since="3" />
+ <field name="DISPLAY_CLIP_HORIZONTAL" since="3" />
+ <field name="DISPLAY_CLIP_VERTICAL" since="3" />
+ <field name="END" since="14" />
+ <field name="FILL" />
+ <field name="FILL_HORIZONTAL" />
+ <field name="FILL_VERTICAL" />
+ <field name="HORIZONTAL_GRAVITY_MASK" />
+ <field name="LEFT" />
+ <field name="NO_GRAVITY" />
+ <field name="RELATIVE_HORIZONTAL_GRAVITY_MASK" since="14" />
+ <field name="RELATIVE_LAYOUT_DIRECTION" since="14" />
+ <field name="RIGHT" />
+ <field name="START" since="14" />
+ <field name="TOP" />
+ <field name="VERTICAL_GRAVITY_MASK" />
+ </class>
+ <class name="android/view/HapticFeedbackConstants" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="CLOCK_TICK" since="21" />
+ <field name="FLAG_IGNORE_GLOBAL_SETTING" />
+ <field name="FLAG_IGNORE_VIEW_SETTING" />
+ <field name="KEYBOARD_TAP" since="8" />
+ <field name="LONG_PRESS" />
+ <field name="VIRTUAL_KEY" since="5" />
+ </class>
+ <class name="android/view/InflateException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="android/view/InputDevice" since="9">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getControllerNumber()I" since="19" />
+ <method name="getDescriptor()Ljava/lang/String;" since="16" />
+ <method name="getDevice(I)Landroid/view/InputDevice;" />
+ <method name="getDeviceIds()[I" />
+ <method name="getId()I" />
+ <method name="getKeyCharacterMap()Landroid/view/KeyCharacterMap;" />
+ <method name="getKeyboardType()I" />
+ <method name="getMotionRange(I)Landroid/view/InputDevice$MotionRange;" />
+ <method name="getMotionRange(II)Landroid/view/InputDevice$MotionRange;" since="12" />
+ <method name="getMotionRanges()Ljava/util/List;" since="12" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getProductId()I" since="19" />
+ <method name="getSources()I" />
+ <method name="getVendorId()I" since="19" />
+ <method name="getVibrator()Landroid/os/Vibrator;" since="16" />
+ <method name="hasKeys([I)[Z" since="19" />
+ <method name="isVirtual()Z" since="16" />
+ <method name="supportsSource(I)Z" since="21" />
+ <field name="CREATOR" />
+ <field name="KEYBOARD_TYPE_ALPHABETIC" />
+ <field name="KEYBOARD_TYPE_NONE" />
+ <field name="KEYBOARD_TYPE_NON_ALPHABETIC" />
+ <field name="MOTION_RANGE_ORIENTATION" />
+ <field name="MOTION_RANGE_PRESSURE" />
+ <field name="MOTION_RANGE_SIZE" />
+ <field name="MOTION_RANGE_TOOL_MAJOR" />
+ <field name="MOTION_RANGE_TOOL_MINOR" />
+ <field name="MOTION_RANGE_TOUCH_MAJOR" />
+ <field name="MOTION_RANGE_TOUCH_MINOR" />
+ <field name="MOTION_RANGE_X" />
+ <field name="MOTION_RANGE_Y" />
+ <field name="SOURCE_ANY" />
+ <field name="SOURCE_CLASS_BUTTON" />
+ <field name="SOURCE_CLASS_JOYSTICK" since="12" />
+ <field name="SOURCE_CLASS_MASK" />
+ <field name="SOURCE_CLASS_NONE" since="18" />
+ <field name="SOURCE_CLASS_POINTER" />
+ <field name="SOURCE_CLASS_POSITION" />
+ <field name="SOURCE_CLASS_TRACKBALL" />
+ <field name="SOURCE_DPAD" />
+ <field name="SOURCE_GAMEPAD" since="12" />
+ <field name="SOURCE_HDMI" since="21" />
+ <field name="SOURCE_JOYSTICK" since="12" />
+ <field name="SOURCE_KEYBOARD" />
+ <field name="SOURCE_MOUSE" />
+ <field name="SOURCE_STYLUS" since="14" />
+ <field name="SOURCE_TOUCHPAD" />
+ <field name="SOURCE_TOUCHSCREEN" />
+ <field name="SOURCE_TOUCH_NAVIGATION" since="18" />
+ <field name="SOURCE_TRACKBALL" />
+ <field name="SOURCE_UNKNOWN" />
+ </class>
+ <class name="android/view/InputDevice$MotionRange" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getAxis()I" since="12" />
+ <method name="getFlat()F" />
+ <method name="getFuzz()F" />
+ <method name="getMax()F" />
+ <method name="getMin()F" />
+ <method name="getRange()F" />
+ <method name="getResolution()F" since="18" />
+ <method name="getSource()I" since="12" />
+ <method name="isFromSource(I)Z" since="18" />
+ </class>
+ <class name="android/view/InputEvent" since="9">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getDevice()Landroid/view/InputDevice;" />
+ <method name="getDeviceId()I" />
+ <method name="getEventTime()J" since="16" />
+ <method name="getSource()I" />
+ <method name="isFromSource(I)Z" since="18" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/view/InputQueue" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/view/InputQueue$Callback" since="9">
+ <extends name="java/lang/Object" />
+ <method name="onInputQueueCreated(Landroid/view/InputQueue;)V" />
+ <method name="onInputQueueDestroyed(Landroid/view/InputQueue;)V" />
+ </class>
+ <class name="android/view/KeyCharacterMap" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" since="16" />
+ <method name="&lt;init>()V" />
+ <method name="deviceHasKey(I)Z" since="3" />
+ <method name="deviceHasKeys([I)[Z" since="3" />
+ <method name="get(II)I" />
+ <method name="getDeadChar(II)I" />
+ <method name="getDisplayLabel(I)C" />
+ <method name="getEvents([C)[Landroid/view/KeyEvent;" />
+ <method name="getKeyData(ILandroid/view/KeyCharacterMap$KeyData;)Z" />
+ <method name="getKeyboardType()I" />
+ <method name="getMatch(I[C)C" />
+ <method name="getMatch(I[CI)C" />
+ <method name="getModifierBehavior()I" since="11" />
+ <method name="getNumber(I)C" />
+ <method name="isPrintingKey(I)Z" />
+ <method name="load(I)Landroid/view/KeyCharacterMap;" />
+ <field name="ALPHA" />
+ <field name="BUILT_IN_KEYBOARD" />
+ <field name="COMBINING_ACCENT" />
+ <field name="COMBINING_ACCENT_MASK" />
+ <field name="CREATOR" since="16" />
+ <field name="FULL" since="11" />
+ <field name="HEX_INPUT" />
+ <field name="MODIFIER_BEHAVIOR_CHORDED" since="11" />
+ <field name="MODIFIER_BEHAVIOR_CHORDED_OR_TOGGLED" since="11" />
+ <field name="NUMERIC" />
+ <field name="PICKER_DIALOG_INPUT" />
+ <field name="PREDICTIVE" />
+ <field name="SPECIAL_FUNCTION" since="11" />
+ <field name="VIRTUAL_KEYBOARD" since="11" />
+ </class>
+ <class name="android/view/KeyCharacterMap$KeyData" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="META_LENGTH" />
+ <field name="displayLabel" />
+ <field name="meta" />
+ <field name="number" />
+ </class>
+ <class name="android/view/KeyCharacterMap$UnavailableException" since="11">
+ <extends name="android/util/AndroidRuntimeException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/view/KeyEvent" since="1">
+ <extends name="android/view/InputEvent" since="9" />
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(II)V" />
+ <method name="&lt;init>(JJIII)V" />
+ <method name="&lt;init>(JJIIII)V" />
+ <method name="&lt;init>(JJIIIIII)V" />
+ <method name="&lt;init>(JJIIIIIII)V" />
+ <method name="&lt;init>(JJIIIIIIII)V" since="9" />
+ <method name="&lt;init>(JLjava/lang/String;II)V" since="3" />
+ <method name="&lt;init>(Landroid/view/KeyEvent;)V" since="3" />
+ <method name="&lt;init>(Landroid/view/KeyEvent;JI)V" />
+ <method name="changeAction(Landroid/view/KeyEvent;I)Landroid/view/KeyEvent;" since="3" />
+ <method name="changeFlags(Landroid/view/KeyEvent;I)Landroid/view/KeyEvent;" since="3" />
+ <method name="changeTimeRepeat(Landroid/view/KeyEvent;JI)Landroid/view/KeyEvent;" since="3" />
+ <method name="changeTimeRepeat(Landroid/view/KeyEvent;JII)Landroid/view/KeyEvent;" since="5" />
+ <method name="dispatch(Landroid/view/KeyEvent$Callback;)Z" />
+ <method name="dispatch(Landroid/view/KeyEvent$Callback;Landroid/view/KeyEvent$DispatcherState;Ljava/lang/Object;)Z" since="5" />
+ <method name="getAction()I" />
+ <method name="getCharacters()Ljava/lang/String;" since="3" />
+ <method name="getDeadChar(II)I" />
+ <method name="getDeviceId()I" />
+ <method name="getDisplayLabel()C" />
+ <method name="getDownTime()J" />
+ <method name="getEventTime()J" />
+ <method name="getFlags()I" />
+ <method name="getKeyCharacterMap()Landroid/view/KeyCharacterMap;" since="11" />
+ <method name="getKeyCode()I" />
+ <method name="getKeyData(Landroid/view/KeyCharacterMap$KeyData;)Z" />
+ <method name="getMatch([C)C" />
+ <method name="getMatch([CI)C" />
+ <method name="getMaxKeyCode()I" since="3" />
+ <method name="getMetaState()I" />
+ <method name="getModifierMetaStateMask()I" since="11" />
+ <method name="getModifiers()I" since="13" />
+ <method name="getNumber()C" />
+ <method name="getRepeatCount()I" />
+ <method name="getScanCode()I" />
+ <method name="getUnicodeChar()I" />
+ <method name="getUnicodeChar(I)I" />
+ <method name="hasModifiers(I)Z" since="11" />
+ <method name="hasNoModifiers()Z" since="11" />
+ <method name="isAltPressed()Z" />
+ <method name="isCanceled()Z" since="5" />
+ <method name="isCapsLockOn()Z" since="11" />
+ <method name="isCtrlPressed()Z" since="11" />
+ <method name="isFunctionPressed()Z" since="11" />
+ <method name="isGamepadButton(I)Z" since="12" />
+ <method name="isLongPress()Z" since="5" />
+ <method name="isMetaPressed()Z" since="11" />
+ <method name="isModifierKey(I)Z" />
+ <method name="isNumLockOn()Z" since="11" />
+ <method name="isPrintingKey()Z" />
+ <method name="isScrollLockOn()Z" since="11" />
+ <method name="isShiftPressed()Z" />
+ <method name="isSymPressed()Z" />
+ <method name="isSystem()Z" />
+ <method name="isTracking()Z" since="5" />
+ <method name="keyCodeFromString(Ljava/lang/String;)I" since="12" />
+ <method name="keyCodeToString(I)Ljava/lang/String;" since="12" />
+ <method name="metaStateHasModifiers(II)Z" since="11" />
+ <method name="metaStateHasNoModifiers(I)Z" since="11" />
+ <method name="normalizeMetaState(I)I" since="11" />
+ <method name="setSource(I)V" since="12" />
+ <method name="startTracking()V" since="5" />
+ <field name="ACTION_DOWN" />
+ <field name="ACTION_MULTIPLE" />
+ <field name="ACTION_UP" />
+ <field name="CREATOR" />
+ <field name="FLAG_CANCELED" since="5" />
+ <field name="FLAG_CANCELED_LONG_PRESS" since="5" />
+ <field name="FLAG_EDITOR_ACTION" since="3" />
+ <field name="FLAG_FALLBACK" since="11" />
+ <field name="FLAG_FROM_SYSTEM" since="3" />
+ <field name="FLAG_KEEP_TOUCH_MODE" since="3" />
+ <field name="FLAG_LONG_PRESS" since="5" />
+ <field name="FLAG_SOFT_KEYBOARD" since="3" />
+ <field name="FLAG_TRACKING" since="5" />
+ <field name="FLAG_VIRTUAL_HARD_KEY" since="5" />
+ <field name="FLAG_WOKE_HERE" />
+ <field name="KEYCODE_0" />
+ <field name="KEYCODE_1" />
+ <field name="KEYCODE_11" since="21" />
+ <field name="KEYCODE_12" since="21" />
+ <field name="KEYCODE_2" />
+ <field name="KEYCODE_3" />
+ <field name="KEYCODE_3D_MODE" since="14" />
+ <field name="KEYCODE_4" />
+ <field name="KEYCODE_5" />
+ <field name="KEYCODE_6" />
+ <field name="KEYCODE_7" />
+ <field name="KEYCODE_8" />
+ <field name="KEYCODE_9" />
+ <field name="KEYCODE_A" />
+ <field name="KEYCODE_ALT_LEFT" />
+ <field name="KEYCODE_ALT_RIGHT" />
+ <field name="KEYCODE_APOSTROPHE" />
+ <field name="KEYCODE_APP_SWITCH" since="11" />
+ <field name="KEYCODE_ASSIST" since="16" />
+ <field name="KEYCODE_AT" />
+ <field name="KEYCODE_AVR_INPUT" since="11" />
+ <field name="KEYCODE_AVR_POWER" since="11" />
+ <field name="KEYCODE_B" />
+ <field name="KEYCODE_BACK" />
+ <field name="KEYCODE_BACKSLASH" />
+ <field name="KEYCODE_BOOKMARK" since="11" />
+ <field name="KEYCODE_BREAK" since="11" />
+ <field name="KEYCODE_BRIGHTNESS_DOWN" since="18" />
+ <field name="KEYCODE_BRIGHTNESS_UP" since="18" />
+ <field name="KEYCODE_BUTTON_1" since="12" />
+ <field name="KEYCODE_BUTTON_10" since="12" />
+ <field name="KEYCODE_BUTTON_11" since="12" />
+ <field name="KEYCODE_BUTTON_12" since="12" />
+ <field name="KEYCODE_BUTTON_13" since="12" />
+ <field name="KEYCODE_BUTTON_14" since="12" />
+ <field name="KEYCODE_BUTTON_15" since="12" />
+ <field name="KEYCODE_BUTTON_16" since="12" />
+ <field name="KEYCODE_BUTTON_2" since="12" />
+ <field name="KEYCODE_BUTTON_3" since="12" />
+ <field name="KEYCODE_BUTTON_4" since="12" />
+ <field name="KEYCODE_BUTTON_5" since="12" />
+ <field name="KEYCODE_BUTTON_6" since="12" />
+ <field name="KEYCODE_BUTTON_7" since="12" />
+ <field name="KEYCODE_BUTTON_8" since="12" />
+ <field name="KEYCODE_BUTTON_9" since="12" />
+ <field name="KEYCODE_BUTTON_A" since="9" />
+ <field name="KEYCODE_BUTTON_B" since="9" />
+ <field name="KEYCODE_BUTTON_C" since="9" />
+ <field name="KEYCODE_BUTTON_L1" since="9" />
+ <field name="KEYCODE_BUTTON_L2" since="9" />
+ <field name="KEYCODE_BUTTON_MODE" since="9" />
+ <field name="KEYCODE_BUTTON_R1" since="9" />
+ <field name="KEYCODE_BUTTON_R2" since="9" />
+ <field name="KEYCODE_BUTTON_SELECT" since="9" />
+ <field name="KEYCODE_BUTTON_START" since="9" />
+ <field name="KEYCODE_BUTTON_THUMBL" since="9" />
+ <field name="KEYCODE_BUTTON_THUMBR" since="9" />
+ <field name="KEYCODE_BUTTON_X" since="9" />
+ <field name="KEYCODE_BUTTON_Y" since="9" />
+ <field name="KEYCODE_BUTTON_Z" since="9" />
+ <field name="KEYCODE_C" />
+ <field name="KEYCODE_CALCULATOR" since="15" />
+ <field name="KEYCODE_CALENDAR" since="15" />
+ <field name="KEYCODE_CALL" />
+ <field name="KEYCODE_CAMERA" />
+ <field name="KEYCODE_CAPS_LOCK" since="11" />
+ <field name="KEYCODE_CAPTIONS" since="11" />
+ <field name="KEYCODE_CHANNEL_DOWN" since="11" />
+ <field name="KEYCODE_CHANNEL_UP" since="11" />
+ <field name="KEYCODE_CLEAR" />
+ <field name="KEYCODE_COMMA" />
+ <field name="KEYCODE_CONTACTS" since="15" />
+ <field name="KEYCODE_CTRL_LEFT" since="11" />
+ <field name="KEYCODE_CTRL_RIGHT" since="11" />
+ <field name="KEYCODE_D" />
+ <field name="KEYCODE_DEL" />
+ <field name="KEYCODE_DPAD_CENTER" />
+ <field name="KEYCODE_DPAD_DOWN" />
+ <field name="KEYCODE_DPAD_LEFT" />
+ <field name="KEYCODE_DPAD_RIGHT" />
+ <field name="KEYCODE_DPAD_UP" />
+ <field name="KEYCODE_DVR" since="11" />
+ <field name="KEYCODE_E" />
+ <field name="KEYCODE_EISU" since="16" />
+ <field name="KEYCODE_ENDCALL" />
+ <field name="KEYCODE_ENTER" />
+ <field name="KEYCODE_ENVELOPE" />
+ <field name="KEYCODE_EQUALS" />
+ <field name="KEYCODE_ESCAPE" since="11" />
+ <field name="KEYCODE_EXPLORER" />
+ <field name="KEYCODE_F" />
+ <field name="KEYCODE_F1" since="11" />
+ <field name="KEYCODE_F10" since="11" />
+ <field name="KEYCODE_F11" since="11" />
+ <field name="KEYCODE_F12" since="11" />
+ <field name="KEYCODE_F2" since="11" />
+ <field name="KEYCODE_F3" since="11" />
+ <field name="KEYCODE_F4" since="11" />
+ <field name="KEYCODE_F5" since="11" />
+ <field name="KEYCODE_F6" since="11" />
+ <field name="KEYCODE_F7" since="11" />
+ <field name="KEYCODE_F8" since="11" />
+ <field name="KEYCODE_F9" since="11" />
+ <field name="KEYCODE_FOCUS" />
+ <field name="KEYCODE_FORWARD" since="11" />
+ <field name="KEYCODE_FORWARD_DEL" since="11" />
+ <field name="KEYCODE_FUNCTION" since="11" />
+ <field name="KEYCODE_G" />
+ <field name="KEYCODE_GRAVE" />
+ <field name="KEYCODE_GUIDE" since="11" />
+ <field name="KEYCODE_H" />
+ <field name="KEYCODE_HEADSETHOOK" />
+ <field name="KEYCODE_HELP" since="21" />
+ <field name="KEYCODE_HENKAN" since="16" />
+ <field name="KEYCODE_HOME" />
+ <field name="KEYCODE_I" />
+ <field name="KEYCODE_INFO" since="11" />
+ <field name="KEYCODE_INSERT" since="11" />
+ <field name="KEYCODE_J" />
+ <field name="KEYCODE_K" />
+ <field name="KEYCODE_KANA" since="16" />
+ <field name="KEYCODE_KATAKANA_HIRAGANA" since="16" />
+ <field name="KEYCODE_L" />
+ <field name="KEYCODE_LANGUAGE_SWITCH" since="14" />
+ <field name="KEYCODE_LAST_CHANNEL" since="21" />
+ <field name="KEYCODE_LEFT_BRACKET" />
+ <field name="KEYCODE_M" />
+ <field name="KEYCODE_MANNER_MODE" since="14" />
+ <field name="KEYCODE_MEDIA_AUDIO_TRACK" since="19" />
+ <field name="KEYCODE_MEDIA_CLOSE" since="11" />
+ <field name="KEYCODE_MEDIA_EJECT" since="11" />
+ <field name="KEYCODE_MEDIA_FAST_FORWARD" since="3" />
+ <field name="KEYCODE_MEDIA_NEXT" since="3" />
+ <field name="KEYCODE_MEDIA_PAUSE" since="11" />
+ <field name="KEYCODE_MEDIA_PLAY" since="11" />
+ <field name="KEYCODE_MEDIA_PLAY_PAUSE" since="3" />
+ <field name="KEYCODE_MEDIA_PREVIOUS" since="3" />
+ <field name="KEYCODE_MEDIA_RECORD" since="11" />
+ <field name="KEYCODE_MEDIA_REWIND" since="3" />
+ <field name="KEYCODE_MEDIA_STOP" since="3" />
+ <field name="KEYCODE_MEDIA_TOP_MENU" since="21" />
+ <field name="KEYCODE_MENU" />
+ <field name="KEYCODE_META_LEFT" since="11" />
+ <field name="KEYCODE_META_RIGHT" since="11" />
+ <field name="KEYCODE_MINUS" />
+ <field name="KEYCODE_MOVE_END" since="11" />
+ <field name="KEYCODE_MOVE_HOME" since="11" />
+ <field name="KEYCODE_MUHENKAN" since="16" />
+ <field name="KEYCODE_MUSIC" since="15" />
+ <field name="KEYCODE_MUTE" since="3" />
+ <field name="KEYCODE_N" />
+ <field name="KEYCODE_NOTIFICATION" />
+ <field name="KEYCODE_NUM" />
+ <field name="KEYCODE_NUMPAD_0" since="11" />
+ <field name="KEYCODE_NUMPAD_1" since="11" />
+ <field name="KEYCODE_NUMPAD_2" since="11" />
+ <field name="KEYCODE_NUMPAD_3" since="11" />
+ <field name="KEYCODE_NUMPAD_4" since="11" />
+ <field name="KEYCODE_NUMPAD_5" since="11" />
+ <field name="KEYCODE_NUMPAD_6" since="11" />
+ <field name="KEYCODE_NUMPAD_7" since="11" />
+ <field name="KEYCODE_NUMPAD_8" since="11" />
+ <field name="KEYCODE_NUMPAD_9" since="11" />
+ <field name="KEYCODE_NUMPAD_ADD" since="11" />
+ <field name="KEYCODE_NUMPAD_COMMA" since="11" />
+ <field name="KEYCODE_NUMPAD_DIVIDE" since="11" />
+ <field name="KEYCODE_NUMPAD_DOT" since="11" />
+ <field name="KEYCODE_NUMPAD_ENTER" since="11" />
+ <field name="KEYCODE_NUMPAD_EQUALS" since="11" />
+ <field name="KEYCODE_NUMPAD_LEFT_PAREN" since="11" />
+ <field name="KEYCODE_NUMPAD_MULTIPLY" since="11" />
+ <field name="KEYCODE_NUMPAD_RIGHT_PAREN" since="11" />
+ <field name="KEYCODE_NUMPAD_SUBTRACT" since="11" />
+ <field name="KEYCODE_NUM_LOCK" since="11" />
+ <field name="KEYCODE_O" />
+ <field name="KEYCODE_P" />
+ <field name="KEYCODE_PAGE_DOWN" since="9" />
+ <field name="KEYCODE_PAGE_UP" since="9" />
+ <field name="KEYCODE_PAIRING" since="21" />
+ <field name="KEYCODE_PERIOD" />
+ <field name="KEYCODE_PICTSYMBOLS" since="9" />
+ <field name="KEYCODE_PLUS" />
+ <field name="KEYCODE_POUND" />
+ <field name="KEYCODE_POWER" />
+ <field name="KEYCODE_PROG_BLUE" since="11" />
+ <field name="KEYCODE_PROG_GREEN" since="11" />
+ <field name="KEYCODE_PROG_RED" since="11" />
+ <field name="KEYCODE_PROG_YELLOW" since="11" />
+ <field name="KEYCODE_Q" />
+ <field name="KEYCODE_R" />
+ <field name="KEYCODE_RIGHT_BRACKET" />
+ <field name="KEYCODE_RO" since="16" />
+ <field name="KEYCODE_S" />
+ <field name="KEYCODE_SCROLL_LOCK" since="11" />
+ <field name="KEYCODE_SEARCH" />
+ <field name="KEYCODE_SEMICOLON" />
+ <field name="KEYCODE_SETTINGS" since="11" />
+ <field name="KEYCODE_SHIFT_LEFT" />
+ <field name="KEYCODE_SHIFT_RIGHT" />
+ <field name="KEYCODE_SLASH" />
+ <field name="KEYCODE_SLEEP" since="20" />
+ <field name="KEYCODE_SOFT_LEFT" />
+ <field name="KEYCODE_SOFT_RIGHT" />
+ <field name="KEYCODE_SPACE" />
+ <field name="KEYCODE_STAR" />
+ <field name="KEYCODE_STB_INPUT" since="11" />
+ <field name="KEYCODE_STB_POWER" since="11" />
+ <field name="KEYCODE_SWITCH_CHARSET" since="9" />
+ <field name="KEYCODE_SYM" />
+ <field name="KEYCODE_SYSRQ" since="11" />
+ <field name="KEYCODE_T" />
+ <field name="KEYCODE_TAB" />
+ <field name="KEYCODE_TV" since="11" />
+ <field name="KEYCODE_TV_ANTENNA_CABLE" since="21" />
+ <field name="KEYCODE_TV_AUDIO_DESCRIPTION" since="21" />
+ <field name="KEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN" since="21" />
+ <field name="KEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP" since="21" />
+ <field name="KEYCODE_TV_CONTENTS_MENU" since="21" />
+ <field name="KEYCODE_TV_DATA_SERVICE" since="21" />
+ <field name="KEYCODE_TV_INPUT" since="11" />
+ <field name="KEYCODE_TV_INPUT_COMPONENT_1" since="21" />
+ <field name="KEYCODE_TV_INPUT_COMPONENT_2" since="21" />
+ <field name="KEYCODE_TV_INPUT_COMPOSITE_1" since="21" />
+ <field name="KEYCODE_TV_INPUT_COMPOSITE_2" since="21" />
+ <field name="KEYCODE_TV_INPUT_HDMI_1" since="21" />
+ <field name="KEYCODE_TV_INPUT_HDMI_2" since="21" />
+ <field name="KEYCODE_TV_INPUT_HDMI_3" since="21" />
+ <field name="KEYCODE_TV_INPUT_HDMI_4" since="21" />
+ <field name="KEYCODE_TV_INPUT_VGA_1" since="21" />
+ <field name="KEYCODE_TV_MEDIA_CONTEXT_MENU" since="21" />
+ <field name="KEYCODE_TV_NETWORK" since="21" />
+ <field name="KEYCODE_TV_NUMBER_ENTRY" since="21" />
+ <field name="KEYCODE_TV_POWER" since="11" />
+ <field name="KEYCODE_TV_RADIO_SERVICE" since="21" />
+ <field name="KEYCODE_TV_SATELLITE" since="21" />
+ <field name="KEYCODE_TV_SATELLITE_BS" since="21" />
+ <field name="KEYCODE_TV_SATELLITE_CS" since="21" />
+ <field name="KEYCODE_TV_SATELLITE_SERVICE" since="21" />
+ <field name="KEYCODE_TV_TELETEXT" since="21" />
+ <field name="KEYCODE_TV_TERRESTRIAL_ANALOG" since="21" />
+ <field name="KEYCODE_TV_TERRESTRIAL_DIGITAL" since="21" />
+ <field name="KEYCODE_TV_TIMER_PROGRAMMING" since="21" />
+ <field name="KEYCODE_TV_ZOOM_MODE" since="21" />
+ <field name="KEYCODE_U" />
+ <field name="KEYCODE_UNKNOWN" />
+ <field name="KEYCODE_V" />
+ <field name="KEYCODE_VOICE_ASSIST" since="21" />
+ <field name="KEYCODE_VOLUME_DOWN" />
+ <field name="KEYCODE_VOLUME_MUTE" since="11" />
+ <field name="KEYCODE_VOLUME_UP" />
+ <field name="KEYCODE_W" />
+ <field name="KEYCODE_WAKEUP" since="20" />
+ <field name="KEYCODE_WINDOW" since="11" />
+ <field name="KEYCODE_X" />
+ <field name="KEYCODE_Y" />
+ <field name="KEYCODE_YEN" since="16" />
+ <field name="KEYCODE_Z" />
+ <field name="KEYCODE_ZENKAKU_HANKAKU" since="16" />
+ <field name="KEYCODE_ZOOM_IN" since="11" />
+ <field name="KEYCODE_ZOOM_OUT" since="11" />
+ <field name="MAX_KEYCODE" />
+ <field name="META_ALT_LEFT_ON" />
+ <field name="META_ALT_MASK" since="11" />
+ <field name="META_ALT_ON" />
+ <field name="META_ALT_RIGHT_ON" />
+ <field name="META_CAPS_LOCK_ON" since="11" />
+ <field name="META_CTRL_LEFT_ON" since="11" />
+ <field name="META_CTRL_MASK" since="11" />
+ <field name="META_CTRL_ON" since="11" />
+ <field name="META_CTRL_RIGHT_ON" since="11" />
+ <field name="META_FUNCTION_ON" since="11" />
+ <field name="META_META_LEFT_ON" since="11" />
+ <field name="META_META_MASK" since="11" />
+ <field name="META_META_ON" since="11" />
+ <field name="META_META_RIGHT_ON" since="11" />
+ <field name="META_NUM_LOCK_ON" since="11" />
+ <field name="META_SCROLL_LOCK_ON" since="11" />
+ <field name="META_SHIFT_LEFT_ON" />
+ <field name="META_SHIFT_MASK" since="11" />
+ <field name="META_SHIFT_ON" />
+ <field name="META_SHIFT_RIGHT_ON" />
+ <field name="META_SYM_ON" />
+ </class>
+ <class name="android/view/KeyEvent$Callback" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onKeyDown(ILandroid/view/KeyEvent;)Z" />
+ <method name="onKeyLongPress(ILandroid/view/KeyEvent;)Z" since="5" />
+ <method name="onKeyMultiple(IILandroid/view/KeyEvent;)Z" />
+ <method name="onKeyUp(ILandroid/view/KeyEvent;)Z" />
+ </class>
+ <class name="android/view/KeyEvent$DispatcherState" since="5">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="handleUpEvent(Landroid/view/KeyEvent;)V" />
+ <method name="isTracking(Landroid/view/KeyEvent;)Z" />
+ <method name="performedLongPress(Landroid/view/KeyEvent;)V" />
+ <method name="reset()V" />
+ <method name="reset(Ljava/lang/Object;)V" />
+ <method name="startTracking(Landroid/view/KeyEvent;Ljava/lang/Object;)V" />
+ </class>
+ <class name="android/view/LayoutInflater" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/view/LayoutInflater;Landroid/content/Context;)V" />
+ <method name="cloneInContext(Landroid/content/Context;)Landroid/view/LayoutInflater;" />
+ <method name="createView(Ljava/lang/String;Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/view/View;" />
+ <method name="from(Landroid/content/Context;)Landroid/view/LayoutInflater;" />
+ <method name="getContext()Landroid/content/Context;" />
+ <method name="getFactory()Landroid/view/LayoutInflater$Factory;" />
+ <method name="getFactory2()Landroid/view/LayoutInflater$Factory2;" since="11" />
+ <method name="getFilter()Landroid/view/LayoutInflater$Filter;" />
+ <method name="inflate(ILandroid/view/ViewGroup;)Landroid/view/View;" />
+ <method name="inflate(ILandroid/view/ViewGroup;Z)Landroid/view/View;" />
+ <method name="inflate(Lorg/xmlpull/v1/XmlPullParser;Landroid/view/ViewGroup;)Landroid/view/View;" />
+ <method name="inflate(Lorg/xmlpull/v1/XmlPullParser;Landroid/view/ViewGroup;Z)Landroid/view/View;" />
+ <method name="onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/view/View;" since="11" />
+ <method name="onCreateView(Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/view/View;" />
+ <method name="setFactory(Landroid/view/LayoutInflater$Factory;)V" />
+ <method name="setFactory2(Landroid/view/LayoutInflater$Factory2;)V" since="11" />
+ <method name="setFilter(Landroid/view/LayoutInflater$Filter;)V" />
+ </class>
+ <class name="android/view/LayoutInflater$Factory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onCreateView(Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;" />
+ </class>
+ <class name="android/view/LayoutInflater$Factory2" since="11">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/LayoutInflater$Factory" />
+ <method name="onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/content/Context;Landroid/util/AttributeSet;)Landroid/view/View;" />
+ </class>
+ <class name="android/view/LayoutInflater$Filter" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onLoadClass(Ljava/lang/Class;)Z" />
+ </class>
+ <class name="android/view/Menu" since="1">
+ <extends name="java/lang/Object" />
+ <method name="add(I)Landroid/view/MenuItem;" />
+ <method name="add(IIII)Landroid/view/MenuItem;" />
+ <method name="add(IIILjava/lang/CharSequence;)Landroid/view/MenuItem;" />
+ <method name="add(Ljava/lang/CharSequence;)Landroid/view/MenuItem;" />
+ <method name="addIntentOptions(IIILandroid/content/ComponentName;[Landroid/content/Intent;Landroid/content/Intent;I[Landroid/view/MenuItem;)I" />
+ <method name="addSubMenu(I)Landroid/view/SubMenu;" />
+ <method name="addSubMenu(IIII)Landroid/view/SubMenu;" />
+ <method name="addSubMenu(IIILjava/lang/CharSequence;)Landroid/view/SubMenu;" />
+ <method name="addSubMenu(Ljava/lang/CharSequence;)Landroid/view/SubMenu;" />
+ <method name="clear()V" />
+ <method name="close()V" since="3" />
+ <method name="findItem(I)Landroid/view/MenuItem;" />
+ <method name="getItem(I)Landroid/view/MenuItem;" since="3" />
+ <method name="hasVisibleItems()Z" />
+ <method name="isShortcutKey(ILandroid/view/KeyEvent;)Z" />
+ <method name="performIdentifierAction(II)Z" />
+ <method name="performShortcut(ILandroid/view/KeyEvent;I)Z" />
+ <method name="removeGroup(I)V" />
+ <method name="removeItem(I)V" />
+ <method name="setGroupCheckable(IZZ)V" />
+ <method name="setGroupEnabled(IZ)V" />
+ <method name="setGroupVisible(IZ)V" />
+ <method name="setQwertyMode(Z)V" />
+ <method name="size()I" />
+ <field name="CATEGORY_ALTERNATIVE" />
+ <field name="CATEGORY_CONTAINER" />
+ <field name="CATEGORY_SECONDARY" />
+ <field name="CATEGORY_SYSTEM" />
+ <field name="FIRST" />
+ <field name="FLAG_ALWAYS_PERFORM_CLOSE" />
+ <field name="FLAG_APPEND_TO_GROUP" />
+ <field name="FLAG_PERFORM_NO_CLOSE" />
+ <field name="NONE" />
+ </class>
+ <class name="android/view/MenuInflater" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="inflate(ILandroid/view/Menu;)V" />
+ </class>
+ <class name="android/view/MenuItem" since="1">
+ <extends name="java/lang/Object" />
+ <method name="collapseActionView()Z" since="14" />
+ <method name="expandActionView()Z" since="14" />
+ <method name="getActionProvider()Landroid/view/ActionProvider;" since="14" />
+ <method name="getActionView()Landroid/view/View;" since="11" />
+ <method name="getAlphabeticShortcut()C" />
+ <method name="getGroupId()I" />
+ <method name="getIcon()Landroid/graphics/drawable/Drawable;" />
+ <method name="getIntent()Landroid/content/Intent;" />
+ <method name="getItemId()I" />
+ <method name="getMenuInfo()Landroid/view/ContextMenu$ContextMenuInfo;" />
+ <method name="getNumericShortcut()C" />
+ <method name="getOrder()I" />
+ <method name="getSubMenu()Landroid/view/SubMenu;" />
+ <method name="getTitle()Ljava/lang/CharSequence;" />
+ <method name="getTitleCondensed()Ljava/lang/CharSequence;" />
+ <method name="hasSubMenu()Z" />
+ <method name="isActionViewExpanded()Z" since="14" />
+ <method name="isCheckable()Z" />
+ <method name="isChecked()Z" />
+ <method name="isEnabled()Z" />
+ <method name="isVisible()Z" />
+ <method name="setActionProvider(Landroid/view/ActionProvider;)Landroid/view/MenuItem;" since="14" />
+ <method name="setActionView(I)Landroid/view/MenuItem;" since="11" />
+ <method name="setActionView(Landroid/view/View;)Landroid/view/MenuItem;" since="11" />
+ <method name="setAlphabeticShortcut(C)Landroid/view/MenuItem;" />
+ <method name="setCheckable(Z)Landroid/view/MenuItem;" />
+ <method name="setChecked(Z)Landroid/view/MenuItem;" />
+ <method name="setEnabled(Z)Landroid/view/MenuItem;" />
+ <method name="setIcon(I)Landroid/view/MenuItem;" />
+ <method name="setIcon(Landroid/graphics/drawable/Drawable;)Landroid/view/MenuItem;" />
+ <method name="setIntent(Landroid/content/Intent;)Landroid/view/MenuItem;" />
+ <method name="setNumericShortcut(C)Landroid/view/MenuItem;" />
+ <method name="setOnActionExpandListener(Landroid/view/MenuItem$OnActionExpandListener;)Landroid/view/MenuItem;" since="14" />
+ <method name="setOnMenuItemClickListener(Landroid/view/MenuItem$OnMenuItemClickListener;)Landroid/view/MenuItem;" />
+ <method name="setShortcut(CC)Landroid/view/MenuItem;" />
+ <method name="setShowAsAction(I)V" since="11" />
+ <method name="setShowAsActionFlags(I)Landroid/view/MenuItem;" since="14" />
+ <method name="setTitle(I)Landroid/view/MenuItem;" />
+ <method name="setTitle(Ljava/lang/CharSequence;)Landroid/view/MenuItem;" />
+ <method name="setTitleCondensed(Ljava/lang/CharSequence;)Landroid/view/MenuItem;" />
+ <method name="setVisible(Z)Landroid/view/MenuItem;" />
+ <field name="SHOW_AS_ACTION_ALWAYS" since="11" />
+ <field name="SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW" since="14" />
+ <field name="SHOW_AS_ACTION_IF_ROOM" since="11" />
+ <field name="SHOW_AS_ACTION_NEVER" since="11" />
+ <field name="SHOW_AS_ACTION_WITH_TEXT" since="11" />
+ </class>
+ <class name="android/view/MenuItem$OnActionExpandListener" since="14">
+ <extends name="java/lang/Object" />
+ <method name="onMenuItemActionCollapse(Landroid/view/MenuItem;)Z" />
+ <method name="onMenuItemActionExpand(Landroid/view/MenuItem;)Z" />
+ </class>
+ <class name="android/view/MenuItem$OnMenuItemClickListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onMenuItemClick(Landroid/view/MenuItem;)Z" />
+ </class>
+ <class name="android/view/MotionEvent" since="1">
+ <extends name="android/view/InputEvent" since="9" />
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="actionToString(I)Ljava/lang/String;" since="19" />
+ <method name="addBatch(JFFFFI)V" />
+ <method name="addBatch(J[Landroid/view/MotionEvent$PointerCoords;I)V" since="9" />
+ <method name="axisFromString(Ljava/lang/String;)I" since="12" />
+ <method name="axisToString(I)Ljava/lang/String;" since="12" />
+ <method name="findPointerIndex(I)I" since="5" />
+ <method name="getAction()I" />
+ <method name="getActionIndex()I" since="8" />
+ <method name="getActionMasked()I" since="8" />
+ <method name="getAxisValue(I)F" since="12" />
+ <method name="getAxisValue(II)F" since="12" />
+ <method name="getButtonState()I" since="14" />
+ <method name="getDeviceId()I" />
+ <method name="getDownTime()J" />
+ <method name="getEdgeFlags()I" />
+ <method name="getEventTime()J" />
+ <method name="getFlags()I" since="9" />
+ <method name="getHistoricalAxisValue(II)F" since="12" />
+ <method name="getHistoricalAxisValue(III)F" since="12" />
+ <method name="getHistoricalEventTime(I)J" />
+ <method name="getHistoricalOrientation(I)F" since="9" />
+ <method name="getHistoricalOrientation(II)F" since="9" />
+ <method name="getHistoricalPointerCoords(IILandroid/view/MotionEvent$PointerCoords;)V" since="9" />
+ <method name="getHistoricalPressure(I)F" />
+ <method name="getHistoricalPressure(II)F" since="5" />
+ <method name="getHistoricalSize(I)F" />
+ <method name="getHistoricalSize(II)F" since="5" />
+ <method name="getHistoricalToolMajor(I)F" since="9" />
+ <method name="getHistoricalToolMajor(II)F" since="9" />
+ <method name="getHistoricalToolMinor(I)F" since="9" />
+ <method name="getHistoricalToolMinor(II)F" since="9" />
+ <method name="getHistoricalTouchMajor(I)F" since="9" />
+ <method name="getHistoricalTouchMajor(II)F" since="9" />
+ <method name="getHistoricalTouchMinor(I)F" since="9" />
+ <method name="getHistoricalTouchMinor(II)F" since="9" />
+ <method name="getHistoricalX(I)F" />
+ <method name="getHistoricalX(II)F" since="5" />
+ <method name="getHistoricalY(I)F" />
+ <method name="getHistoricalY(II)F" since="5" />
+ <method name="getHistorySize()I" />
+ <method name="getMetaState()I" />
+ <method name="getOrientation()F" since="9" />
+ <method name="getOrientation(I)F" since="9" />
+ <method name="getPointerCoords(ILandroid/view/MotionEvent$PointerCoords;)V" since="9" />
+ <method name="getPointerCount()I" since="5" />
+ <method name="getPointerId(I)I" since="5" />
+ <method name="getPointerProperties(ILandroid/view/MotionEvent$PointerProperties;)V" since="14" />
+ <method name="getPressure()F" />
+ <method name="getPressure(I)F" since="5" />
+ <method name="getRawX()F" />
+ <method name="getRawY()F" />
+ <method name="getSize()F" />
+ <method name="getSize(I)F" since="5" />
+ <method name="getToolMajor()F" since="9" />
+ <method name="getToolMajor(I)F" since="9" />
+ <method name="getToolMinor()F" since="9" />
+ <method name="getToolMinor(I)F" since="9" />
+ <method name="getToolType(I)I" since="14" />
+ <method name="getTouchMajor()F" since="9" />
+ <method name="getTouchMajor(I)F" since="9" />
+ <method name="getTouchMinor()F" since="9" />
+ <method name="getTouchMinor(I)F" since="9" />
+ <method name="getX()F" />
+ <method name="getX(I)F" since="5" />
+ <method name="getXPrecision()F" />
+ <method name="getY()F" />
+ <method name="getY(I)F" since="5" />
+ <method name="getYPrecision()F" />
+ <method name="isButtonPressed(I)Z" since="21" />
+ <method name="obtain(JJIFFFFIFFII)Landroid/view/MotionEvent;" />
+ <method name="obtain(JJIFFI)Landroid/view/MotionEvent;" />
+ <method name="obtain(JJIIFFFFIFFII)Landroid/view/MotionEvent;" since="5" />
+ <method name="obtain(JJII[I[Landroid/view/MotionEvent$PointerCoords;IFFIIII)Landroid/view/MotionEvent;" since="9" />
+ <method name="obtain(JJII[Landroid/view/MotionEvent$PointerProperties;[Landroid/view/MotionEvent$PointerCoords;IIFFIIII)Landroid/view/MotionEvent;" since="14" />
+ <method name="obtain(Landroid/view/MotionEvent;)Landroid/view/MotionEvent;" />
+ <method name="obtainNoHistory(Landroid/view/MotionEvent;)Landroid/view/MotionEvent;" since="5" />
+ <method name="offsetLocation(FF)V" />
+ <method name="recycle()V" />
+ <method name="setAction(I)V" />
+ <method name="setEdgeFlags(I)V" />
+ <method name="setLocation(FF)V" />
+ <method name="setSource(I)V" since="12" />
+ <method name="transform(Landroid/graphics/Matrix;)V" since="11" />
+ <field name="ACTION_CANCEL" />
+ <field name="ACTION_DOWN" />
+ <field name="ACTION_HOVER_ENTER" since="14" />
+ <field name="ACTION_HOVER_EXIT" since="14" />
+ <field name="ACTION_HOVER_MOVE" since="12" />
+ <field name="ACTION_MASK" since="5" />
+ <field name="ACTION_MOVE" />
+ <field name="ACTION_OUTSIDE" since="3" />
+ <field name="ACTION_POINTER_1_DOWN" since="5" />
+ <field name="ACTION_POINTER_1_UP" since="5" />
+ <field name="ACTION_POINTER_2_DOWN" since="5" />
+ <field name="ACTION_POINTER_2_UP" since="5" />
+ <field name="ACTION_POINTER_3_DOWN" since="5" />
+ <field name="ACTION_POINTER_3_UP" since="5" />
+ <field name="ACTION_POINTER_DOWN" since="5" />
+ <field name="ACTION_POINTER_ID_MASK" since="5" />
+ <field name="ACTION_POINTER_ID_SHIFT" since="5" />
+ <field name="ACTION_POINTER_INDEX_MASK" since="8" />
+ <field name="ACTION_POINTER_INDEX_SHIFT" since="8" />
+ <field name="ACTION_POINTER_UP" since="5" />
+ <field name="ACTION_SCROLL" since="12" />
+ <field name="ACTION_UP" />
+ <field name="AXIS_BRAKE" since="12" />
+ <field name="AXIS_DISTANCE" since="14" />
+ <field name="AXIS_GAS" since="12" />
+ <field name="AXIS_GENERIC_1" since="12" />
+ <field name="AXIS_GENERIC_10" since="12" />
+ <field name="AXIS_GENERIC_11" since="12" />
+ <field name="AXIS_GENERIC_12" since="12" />
+ <field name="AXIS_GENERIC_13" since="12" />
+ <field name="AXIS_GENERIC_14" since="12" />
+ <field name="AXIS_GENERIC_15" since="12" />
+ <field name="AXIS_GENERIC_16" since="12" />
+ <field name="AXIS_GENERIC_2" since="12" />
+ <field name="AXIS_GENERIC_3" since="12" />
+ <field name="AXIS_GENERIC_4" since="12" />
+ <field name="AXIS_GENERIC_5" since="12" />
+ <field name="AXIS_GENERIC_6" since="12" />
+ <field name="AXIS_GENERIC_7" since="12" />
+ <field name="AXIS_GENERIC_8" since="12" />
+ <field name="AXIS_GENERIC_9" since="12" />
+ <field name="AXIS_HAT_X" since="12" />
+ <field name="AXIS_HAT_Y" since="12" />
+ <field name="AXIS_HSCROLL" since="12" />
+ <field name="AXIS_LTRIGGER" since="12" />
+ <field name="AXIS_ORIENTATION" since="12" />
+ <field name="AXIS_PRESSURE" since="12" />
+ <field name="AXIS_RTRIGGER" since="12" />
+ <field name="AXIS_RUDDER" since="12" />
+ <field name="AXIS_RX" since="12" />
+ <field name="AXIS_RY" since="12" />
+ <field name="AXIS_RZ" since="12" />
+ <field name="AXIS_SIZE" since="12" />
+ <field name="AXIS_THROTTLE" since="12" />
+ <field name="AXIS_TILT" since="14" />
+ <field name="AXIS_TOOL_MAJOR" since="12" />
+ <field name="AXIS_TOOL_MINOR" since="12" />
+ <field name="AXIS_TOUCH_MAJOR" since="12" />
+ <field name="AXIS_TOUCH_MINOR" since="12" />
+ <field name="AXIS_VSCROLL" since="12" />
+ <field name="AXIS_WHEEL" since="12" />
+ <field name="AXIS_X" since="12" />
+ <field name="AXIS_Y" since="12" />
+ <field name="AXIS_Z" since="12" />
+ <field name="BUTTON_BACK" since="14" />
+ <field name="BUTTON_FORWARD" since="14" />
+ <field name="BUTTON_PRIMARY" since="14" />
+ <field name="BUTTON_SECONDARY" since="14" />
+ <field name="BUTTON_TERTIARY" since="14" />
+ <field name="CREATOR" />
+ <field name="EDGE_BOTTOM" />
+ <field name="EDGE_LEFT" />
+ <field name="EDGE_RIGHT" />
+ <field name="EDGE_TOP" />
+ <field name="FLAG_WINDOW_IS_OBSCURED" since="9" />
+ <field name="INVALID_POINTER_ID" since="14" />
+ <field name="TOOL_TYPE_ERASER" since="14" />
+ <field name="TOOL_TYPE_FINGER" since="14" />
+ <field name="TOOL_TYPE_MOUSE" since="14" />
+ <field name="TOOL_TYPE_STYLUS" since="14" />
+ <field name="TOOL_TYPE_UNKNOWN" since="14" />
+ </class>
+ <class name="android/view/MotionEvent$PointerCoords" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/view/MotionEvent$PointerCoords;)V" since="12" />
+ <method name="clear()V" since="12" />
+ <method name="copyFrom(Landroid/view/MotionEvent$PointerCoords;)V" since="12" />
+ <method name="getAxisValue(I)F" since="12" />
+ <method name="setAxisValue(IF)V" since="12" />
+ <field name="orientation" />
+ <field name="pressure" />
+ <field name="size" />
+ <field name="toolMajor" />
+ <field name="toolMinor" />
+ <field name="touchMajor" />
+ <field name="touchMinor" />
+ <field name="x" />
+ <field name="y" />
+ </class>
+ <class name="android/view/MotionEvent$PointerProperties" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/view/MotionEvent$PointerProperties;)V" />
+ <method name="clear()V" />
+ <method name="copyFrom(Landroid/view/MotionEvent$PointerProperties;)V" />
+ <field name="id" />
+ <field name="toolType" />
+ </class>
+ <class name="android/view/OrientationEventListener" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;I)V" />
+ <method name="canDetectOrientation()Z" />
+ <method name="disable()V" />
+ <method name="enable()V" />
+ <method name="onOrientationChanged(I)V" />
+ <field name="ORIENTATION_UNKNOWN" />
+ </class>
+ <class name="android/view/OrientationListener" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/hardware/SensorListener" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;I)V" since="3" />
+ <method name="disable()V" />
+ <method name="enable()V" />
+ <method name="onOrientationChanged(I)V" />
+ <field name="ORIENTATION_UNKNOWN" />
+ </class>
+ <class name="android/view/ScaleGestureDetector" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/ScaleGestureDetector$OnScaleGestureListener;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/ScaleGestureDetector$OnScaleGestureListener;Landroid/os/Handler;)V" since="19" />
+ <method name="getCurrentSpan()F" />
+ <method name="getCurrentSpanX()F" since="11" />
+ <method name="getCurrentSpanY()F" since="11" />
+ <method name="getEventTime()J" />
+ <method name="getFocusX()F" />
+ <method name="getFocusY()F" />
+ <method name="getPreviousSpan()F" />
+ <method name="getPreviousSpanX()F" since="11" />
+ <method name="getPreviousSpanY()F" since="11" />
+ <method name="getScaleFactor()F" />
+ <method name="getTimeDelta()J" />
+ <method name="isInProgress()Z" />
+ <method name="isQuickScaleEnabled()Z" since="19" />
+ <method name="onTouchEvent(Landroid/view/MotionEvent;)Z" />
+ <method name="setQuickScaleEnabled(Z)V" since="19" />
+ </class>
+ <class name="android/view/ScaleGestureDetector$OnScaleGestureListener" since="8">
+ <extends name="java/lang/Object" />
+ <method name="onScale(Landroid/view/ScaleGestureDetector;)Z" />
+ <method name="onScaleBegin(Landroid/view/ScaleGestureDetector;)Z" />
+ <method name="onScaleEnd(Landroid/view/ScaleGestureDetector;)V" />
+ </class>
+ <class name="android/view/ScaleGestureDetector$SimpleOnScaleGestureListener" since="8">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/ScaleGestureDetector$OnScaleGestureListener" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/view/SoundEffectConstants" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getContantForFocusDirection(I)I" />
+ <field name="CLICK" />
+ <field name="NAVIGATION_DOWN" />
+ <field name="NAVIGATION_LEFT" />
+ <field name="NAVIGATION_RIGHT" />
+ <field name="NAVIGATION_UP" />
+ </class>
+ <class name="android/view/SubMenu" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/Menu" />
+ <method name="clearHeader()V" />
+ <method name="getItem()Landroid/view/MenuItem;" />
+ <method name="setHeaderIcon(I)Landroid/view/SubMenu;" />
+ <method name="setHeaderIcon(Landroid/graphics/drawable/Drawable;)Landroid/view/SubMenu;" />
+ <method name="setHeaderTitle(I)Landroid/view/SubMenu;" />
+ <method name="setHeaderTitle(Ljava/lang/CharSequence;)Landroid/view/SubMenu;" />
+ <method name="setHeaderView(Landroid/view/View;)Landroid/view/SubMenu;" />
+ <method name="setIcon(I)Landroid/view/SubMenu;" />
+ <method name="setIcon(Landroid/graphics/drawable/Drawable;)Landroid/view/SubMenu;" />
+ </class>
+ <class name="android/view/Surface" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/graphics/SurfaceTexture;)V" since="14" />
+ <method name="freeze()V" />
+ <method name="hide()V" />
+ <method name="isValid()Z" />
+ <method name="lockCanvas(Landroid/graphics/Rect;)Landroid/graphics/Canvas;" />
+ <method name="readFromParcel(Landroid/os/Parcel;)V" />
+ <method name="release()V" since="14" />
+ <method name="setAlpha(F)V" />
+ <method name="setFlags(II)V" />
+ <method name="setFreezeTint(I)V" />
+ <method name="setLayer(I)V" />
+ <method name="setMatrix(FFFF)V" />
+ <method name="setOrientation(II)V" />
+ <method name="setPosition(II)V" />
+ <method name="setSize(II)V" />
+ <method name="setTransparentRegionHint(Landroid/graphics/Region;)V" />
+ <method name="show()V" />
+ <method name="unfreeze()V" />
+ <method name="unlockCanvas(Landroid/graphics/Canvas;)V" />
+ <method name="unlockCanvasAndPost(Landroid/graphics/Canvas;)V" />
+ <field name="CREATOR" />
+ <field name="FX_SURFACE_BLUR" />
+ <field name="FX_SURFACE_DIM" />
+ <field name="FX_SURFACE_MASK" />
+ <field name="FX_SURFACE_NORMAL" />
+ <field name="GPU" />
+ <field name="HARDWARE" />
+ <field name="HIDDEN" />
+ <field name="NON_PREMULTIPLIED" />
+ <field name="PUSH_BUFFERS" />
+ <field name="ROTATION_0" />
+ <field name="ROTATION_180" />
+ <field name="ROTATION_270" />
+ <field name="ROTATION_90" />
+ <field name="SECURE" />
+ <field name="SURACE_FROZEN" />
+ <field name="SURFACE_BLUR_FREEZE" />
+ <field name="SURFACE_DITHER" />
+ <field name="SURFACE_FROZEN" since="4" />
+ <field name="SURFACE_HIDDEN" />
+ </class>
+ <class name="android/view/Surface$OutOfResourcesException" since="1">
+ <extends name="java/lang/Exception" />
+ <extends name="java/lang/RuntimeException" since="19" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/view/SurfaceHolder" since="1">
+ <extends name="java/lang/Object" />
+ <method name="addCallback(Landroid/view/SurfaceHolder$Callback;)V" />
+ <method name="getSurface()Landroid/view/Surface;" />
+ <method name="getSurfaceFrame()Landroid/graphics/Rect;" />
+ <method name="isCreating()Z" />
+ <method name="lockCanvas()Landroid/graphics/Canvas;" />
+ <method name="lockCanvas(Landroid/graphics/Rect;)Landroid/graphics/Canvas;" />
+ <method name="removeCallback(Landroid/view/SurfaceHolder$Callback;)V" />
+ <method name="setFixedSize(II)V" />
+ <method name="setFormat(I)V" />
+ <method name="setKeepScreenOn(Z)V" />
+ <method name="setSizeFromLayout()V" />
+ <method name="setType(I)V" />
+ <method name="unlockCanvasAndPost(Landroid/graphics/Canvas;)V" />
+ <field name="SURFACE_TYPE_GPU" />
+ <field name="SURFACE_TYPE_HARDWARE" />
+ <field name="SURFACE_TYPE_NORMAL" />
+ <field name="SURFACE_TYPE_PUSH_BUFFERS" />
+ </class>
+ <class name="android/view/SurfaceHolder$BadSurfaceTypeException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/view/SurfaceHolder$Callback" since="1">
+ <extends name="java/lang/Object" />
+ <method name="surfaceChanged(Landroid/view/SurfaceHolder;III)V" />
+ <method name="surfaceCreated(Landroid/view/SurfaceHolder;)V" />
+ <method name="surfaceDestroyed(Landroid/view/SurfaceHolder;)V" />
+ </class>
+ <class name="android/view/SurfaceHolder$Callback2" since="9">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/SurfaceHolder$Callback" />
+ <method name="surfaceRedrawNeeded(Landroid/view/SurfaceHolder;)V" />
+ </class>
+ <class name="android/view/SurfaceView" since="1">
+ <extends name="android/view/View" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="gatherTransparentRegion(Landroid/graphics/Region;)Z" />
+ <method name="getHolder()Landroid/view/SurfaceHolder;" />
+ <method name="setSecure(Z)V" since="17" />
+ <method name="setZOrderMediaOverlay(Z)V" since="5" />
+ <method name="setZOrderOnTop(Z)V" since="5" />
+ </class>
+ <class name="android/view/TextureView" since="14">
+ <extends name="android/view/View" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getBitmap()Landroid/graphics/Bitmap;" />
+ <method name="getBitmap(II)Landroid/graphics/Bitmap;" />
+ <method name="getBitmap(Landroid/graphics/Bitmap;)Landroid/graphics/Bitmap;" />
+ <method name="getSurfaceTexture()Landroid/graphics/SurfaceTexture;" />
+ <method name="getSurfaceTextureListener()Landroid/view/TextureView$SurfaceTextureListener;" />
+ <method name="getTransform(Landroid/graphics/Matrix;)Landroid/graphics/Matrix;" />
+ <method name="isAvailable()Z" />
+ <method name="lockCanvas()Landroid/graphics/Canvas;" />
+ <method name="lockCanvas(Landroid/graphics/Rect;)Landroid/graphics/Canvas;" />
+ <method name="setOpaque(Z)V" />
+ <method name="setSurfaceTexture(Landroid/graphics/SurfaceTexture;)V" since="16" />
+ <method name="setSurfaceTextureListener(Landroid/view/TextureView$SurfaceTextureListener;)V" />
+ <method name="setTransform(Landroid/graphics/Matrix;)V" />
+ <method name="unlockCanvasAndPost(Landroid/graphics/Canvas;)V" />
+ </class>
+ <class name="android/view/TextureView$SurfaceTextureListener" since="14">
+ <extends name="java/lang/Object" />
+ <method name="onSurfaceTextureAvailable(Landroid/graphics/SurfaceTexture;II)V" />
+ <method name="onSurfaceTextureDestroyed(Landroid/graphics/SurfaceTexture;)Z" />
+ <method name="onSurfaceTextureSizeChanged(Landroid/graphics/SurfaceTexture;II)V" />
+ <method name="onSurfaceTextureUpdated(Landroid/graphics/SurfaceTexture;)V" />
+ </class>
+ <class name="android/view/TouchDelegate" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/graphics/Rect;Landroid/view/View;)V" />
+ <method name="onTouchEvent(Landroid/view/MotionEvent;)Z" />
+ <field name="ABOVE" />
+ <field name="BELOW" />
+ <field name="TO_LEFT" />
+ <field name="TO_RIGHT" />
+ </class>
+ <class name="android/view/VelocityTracker" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addMovement(Landroid/view/MotionEvent;)V" />
+ <method name="clear()V" />
+ <method name="computeCurrentVelocity(I)V" />
+ <method name="computeCurrentVelocity(IF)V" since="4" />
+ <method name="getXVelocity()F" />
+ <method name="getXVelocity(I)F" since="8" />
+ <method name="getYVelocity()F" />
+ <method name="getYVelocity(I)F" since="8" />
+ <method name="obtain()Landroid/view/VelocityTracker;" />
+ <method name="recycle()V" />
+ </class>
+ <class name="android/view/View" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/graphics/drawable/Drawable$Callback" />
+ <implements name="android/view/KeyEvent$Callback" />
+ <implements name="android/view/accessibility/AccessibilityEventSource" since="4" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="addChildrenForAccessibility(Ljava/util/ArrayList;)V" since="16" />
+ <method name="addFocusables(Ljava/util/ArrayList;I)V" />
+ <method name="addFocusables(Ljava/util/ArrayList;II)V" since="4" />
+ <method name="addOnAttachStateChangeListener(Landroid/view/View$OnAttachStateChangeListener;)V" since="12" />
+ <method name="addOnLayoutChangeListener(Landroid/view/View$OnLayoutChangeListener;)V" since="11" />
+ <method name="addTouchables(Ljava/util/ArrayList;)V" />
+ <method name="animate()Landroid/view/ViewPropertyAnimator;" since="12" />
+ <method name="announceForAccessibility(Ljava/lang/CharSequence;)V" since="16" />
+ <method name="awakenScrollBars()Z" since="5" />
+ <method name="awakenScrollBars(I)Z" since="5" />
+ <method name="awakenScrollBars(IZ)Z" since="5" />
+ <method name="bringToFront()V" />
+ <method name="buildDrawingCache()V" />
+ <method name="buildDrawingCache(Z)V" since="4" />
+ <method name="buildLayer()V" since="12" />
+ <method name="callOnClick()Z" since="15" />
+ <method name="canResolveLayoutDirection()Z" since="19" />
+ <method name="canResolveTextAlignment()Z" since="19" />
+ <method name="canResolveTextDirection()Z" since="19" />
+ <method name="canScrollHorizontally(I)Z" since="14" />
+ <method name="canScrollVertically(I)Z" since="14" />
+ <method name="cancelLongPress()V" />
+ <method name="cancelPendingInputEvents()V" since="19" />
+ <method name="checkInputConnectionProxy(Landroid/view/View;)Z" since="3" />
+ <method name="clearAnimation()V" />
+ <method name="clearFocus()V" />
+ <method name="combineMeasuredStates(II)I" since="11" />
+ <method name="computeHorizontalScrollExtent()I" />
+ <method name="computeHorizontalScrollOffset()I" />
+ <method name="computeHorizontalScrollRange()I" />
+ <method name="computeScroll()V" />
+ <method name="computeSystemWindowInsets(Landroid/view/WindowInsets;Landroid/graphics/Rect;)Landroid/view/WindowInsets;" since="21" />
+ <method name="computeVerticalScrollExtent()I" />
+ <method name="computeVerticalScrollOffset()I" />
+ <method name="computeVerticalScrollRange()I" />
+ <method name="createAccessibilityNodeInfo()Landroid/view/accessibility/AccessibilityNodeInfo;" since="14" />
+ <method name="createContextMenu(Landroid/view/ContextMenu;)V" />
+ <method name="destroyDrawingCache()V" />
+ <method name="dispatchApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets;" since="20" />
+ <method name="dispatchConfigurationChanged(Landroid/content/res/Configuration;)V" since="8" />
+ <method name="dispatchDisplayHint(I)V" since="8" />
+ <method name="dispatchDragEvent(Landroid/view/DragEvent;)Z" since="11" />
+ <method name="dispatchDraw(Landroid/graphics/Canvas;)V" />
+ <method name="dispatchGenericFocusedEvent(Landroid/view/MotionEvent;)Z" since="14" />
+ <method name="dispatchGenericMotionEvent(Landroid/view/MotionEvent;)Z" since="12" />
+ <method name="dispatchGenericPointerEvent(Landroid/view/MotionEvent;)Z" since="14" />
+ <method name="dispatchHoverEvent(Landroid/view/MotionEvent;)Z" since="14" />
+ <method name="dispatchKeyEvent(Landroid/view/KeyEvent;)Z" />
+ <method name="dispatchKeyEventPreIme(Landroid/view/KeyEvent;)Z" since="3" />
+ <method name="dispatchKeyShortcutEvent(Landroid/view/KeyEvent;)Z" />
+ <method name="dispatchNestedFling(FFZ)Z" since="21" />
+ <method name="dispatchNestedPreFling(FF)Z" since="21" />
+ <method name="dispatchNestedPreScroll(II[I[I)Z" since="21" />
+ <method name="dispatchNestedScroll(IIII[I)Z" since="21" />
+ <method name="dispatchPopulateAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)Z" since="4" />
+ <method name="dispatchRestoreInstanceState(Landroid/util/SparseArray;)V" />
+ <method name="dispatchSaveInstanceState(Landroid/util/SparseArray;)V" />
+ <method name="dispatchSetActivated(Z)V" since="11" />
+ <method name="dispatchSetPressed(Z)V" />
+ <method name="dispatchSetSelected(Z)V" />
+ <method name="dispatchSystemUiVisibilityChanged(I)V" since="11" />
+ <method name="dispatchTouchEvent(Landroid/view/MotionEvent;)Z" />
+ <method name="dispatchTrackballEvent(Landroid/view/MotionEvent;)Z" />
+ <method name="dispatchUnhandledMove(Landroid/view/View;I)Z" />
+ <method name="dispatchVisibilityChanged(Landroid/view/View;I)V" since="8" />
+ <method name="dispatchWindowFocusChanged(Z)V" />
+ <method name="dispatchWindowSystemUiVisiblityChanged(I)V" since="16" />
+ <method name="dispatchWindowVisibilityChanged(I)V" />
+ <method name="draw(Landroid/graphics/Canvas;)V" />
+ <method name="drawableHotspotChanged(FF)V" since="21" />
+ <method name="drawableStateChanged()V" />
+ <method name="findFocus()Landroid/view/View;" />
+ <method name="findViewById(I)Landroid/view/View;" />
+ <method name="findViewWithTag(Ljava/lang/Object;)Landroid/view/View;" />
+ <method name="findViewsWithText(Ljava/util/ArrayList;Ljava/lang/CharSequence;I)V" since="14" />
+ <method name="fitSystemWindows(Landroid/graphics/Rect;)Z" />
+ <method name="fitsSystemWindows()Z" since="14" />
+ <method name="focusSearch(I)Landroid/view/View;" />
+ <method name="forceLayout()V" />
+ <method name="generateViewId()I" since="17" />
+ <method name="getAccessibilityLiveRegion()I" since="19" />
+ <method name="getAccessibilityNodeProvider()Landroid/view/accessibility/AccessibilityNodeProvider;" since="16" />
+ <method name="getAlpha()F" since="11" />
+ <method name="getAnimation()Landroid/view/animation/Animation;" />
+ <method name="getApplicationWindowToken()Landroid/os/IBinder;" />
+ <method name="getBackground()Landroid/graphics/drawable/Drawable;" />
+ <method name="getBackgroundTintList()Landroid/content/res/ColorStateList;" since="21" />
+ <method name="getBackgroundTintMode()Landroid/graphics/PorterDuff$Mode;" since="21" />
+ <method name="getBaseline()I" />
+ <method name="getBottom()I" />
+ <method name="getBottomFadingEdgeStrength()F" />
+ <method name="getBottomPaddingOffset()I" since="2" />
+ <method name="getCameraDistance()F" since="16" />
+ <method name="getClipBounds()Landroid/graphics/Rect;" since="18" />
+ <method name="getClipToOutline()Z" since="21" />
+ <method name="getContentDescription()Ljava/lang/CharSequence;" since="4" />
+ <method name="getContext()Landroid/content/Context;" />
+ <method name="getContextMenuInfo()Landroid/view/ContextMenu$ContextMenuInfo;" />
+ <method name="getDefaultSize(II)I" />
+ <method name="getDisplay()Landroid/view/Display;" since="17" />
+ <method name="getDrawableState()[I" />
+ <method name="getDrawingCache()Landroid/graphics/Bitmap;" />
+ <method name="getDrawingCache(Z)Landroid/graphics/Bitmap;" since="4" />
+ <method name="getDrawingCacheBackgroundColor()I" />
+ <method name="getDrawingCacheQuality()I" />
+ <method name="getDrawingRect(Landroid/graphics/Rect;)V" />
+ <method name="getDrawingTime()J" />
+ <method name="getElevation()F" since="21" />
+ <method name="getFilterTouchesWhenObscured()Z" since="9" />
+ <method name="getFitsSystemWindows()Z" since="16" />
+ <method name="getFocusables(I)Ljava/util/ArrayList;" />
+ <method name="getFocusedRect(Landroid/graphics/Rect;)V" />
+ <method name="getGlobalVisibleRect(Landroid/graphics/Rect;)Z" />
+ <method name="getGlobalVisibleRect(Landroid/graphics/Rect;Landroid/graphics/Point;)Z" />
+ <method name="getHandler()Landroid/os/Handler;" />
+ <method name="getHeight()I" />
+ <method name="getHitRect(Landroid/graphics/Rect;)V" />
+ <method name="getHorizontalFadingEdgeLength()I" />
+ <method name="getHorizontalScrollbarHeight()I" />
+ <method name="getId()I" />
+ <method name="getImportantForAccessibility()I" since="16" />
+ <method name="getKeepScreenOn()Z" />
+ <method name="getKeyDispatcherState()Landroid/view/KeyEvent$DispatcherState;" since="5" />
+ <method name="getLabelFor()I" since="17" />
+ <method name="getLayerType()I" since="11" />
+ <method name="getLayoutDirection()I" since="17" />
+ <method name="getLayoutParams()Landroid/view/ViewGroup$LayoutParams;" />
+ <method name="getLeft()I" />
+ <method name="getLeftFadingEdgeStrength()F" />
+ <method name="getLeftPaddingOffset()I" since="2" />
+ <method name="getLocalVisibleRect(Landroid/graphics/Rect;)Z" />
+ <method name="getLocationInWindow([I)V" />
+ <method name="getLocationOnScreen([I)V" />
+ <method name="getMatrix()Landroid/graphics/Matrix;" since="11" />
+ <method name="getMeasuredHeight()I" />
+ <method name="getMeasuredHeightAndState()I" since="11" />
+ <method name="getMeasuredState()I" since="11" />
+ <method name="getMeasuredWidth()I" />
+ <method name="getMeasuredWidthAndState()I" since="11" />
+ <method name="getMinimumHeight()I" since="16" />
+ <method name="getMinimumWidth()I" since="16" />
+ <method name="getNextFocusDownId()I" />
+ <method name="getNextFocusForwardId()I" since="11" />
+ <method name="getNextFocusLeftId()I" />
+ <method name="getNextFocusRightId()I" />
+ <method name="getNextFocusUpId()I" />
+ <method name="getOnFocusChangeListener()Landroid/view/View$OnFocusChangeListener;" />
+ <method name="getOutlineProvider()Landroid/view/ViewOutlineProvider;" since="21" />
+ <method name="getOverScrollMode()I" since="9" />
+ <method name="getOverlay()Landroid/view/ViewOverlay;" since="18" />
+ <method name="getPaddingBottom()I" />
+ <method name="getPaddingEnd()I" since="17" />
+ <method name="getPaddingLeft()I" />
+ <method name="getPaddingRight()I" />
+ <method name="getPaddingStart()I" since="17" />
+ <method name="getPaddingTop()I" />
+ <method name="getParent()Landroid/view/ViewParent;" />
+ <method name="getParentForAccessibility()Landroid/view/ViewParent;" since="16" />
+ <method name="getPivotX()F" since="11" />
+ <method name="getPivotY()F" since="11" />
+ <method name="getResources()Landroid/content/res/Resources;" />
+ <method name="getRight()I" />
+ <method name="getRightFadingEdgeStrength()F" />
+ <method name="getRightPaddingOffset()I" since="2" />
+ <method name="getRootView()Landroid/view/View;" />
+ <method name="getRotation()F" since="11" />
+ <method name="getRotationX()F" since="11" />
+ <method name="getRotationY()F" since="11" />
+ <method name="getScaleX()F" since="11" />
+ <method name="getScaleY()F" since="11" />
+ <method name="getScrollBarDefaultDelayBeforeFade()I" since="16" />
+ <method name="getScrollBarFadeDuration()I" since="16" />
+ <method name="getScrollBarSize()I" since="16" />
+ <method name="getScrollBarStyle()I" />
+ <method name="getScrollX()I" />
+ <method name="getScrollY()I" />
+ <method name="getSolidColor()I" />
+ <method name="getStateListAnimator()Landroid/animation/StateListAnimator;" since="21" />
+ <method name="getSuggestedMinimumHeight()I" />
+ <method name="getSuggestedMinimumWidth()I" />
+ <method name="getSystemUiVisibility()I" since="11" />
+ <method name="getTag()Ljava/lang/Object;" />
+ <method name="getTag(I)Ljava/lang/Object;" since="4" />
+ <method name="getTextAlignment()I" since="17" />
+ <method name="getTextDirection()I" since="17" />
+ <method name="getTop()I" />
+ <method name="getTopFadingEdgeStrength()F" />
+ <method name="getTopPaddingOffset()I" since="2" />
+ <method name="getTouchDelegate()Landroid/view/TouchDelegate;" />
+ <method name="getTouchables()Ljava/util/ArrayList;" />
+ <method name="getTransitionName()Ljava/lang/String;" since="21" />
+ <method name="getTranslationX()F" since="11" />
+ <method name="getTranslationY()F" since="11" />
+ <method name="getTranslationZ()F" since="21" />
+ <method name="getVerticalFadingEdgeLength()I" />
+ <method name="getVerticalScrollbarPosition()I" since="11" />
+ <method name="getVerticalScrollbarWidth()I" />
+ <method name="getViewTreeObserver()Landroid/view/ViewTreeObserver;" />
+ <method name="getVisibility()I" />
+ <method name="getWidth()I" />
+ <method name="getWindowAttachCount()I" />
+ <method name="getWindowId()Landroid/view/WindowId;" since="18" />
+ <method name="getWindowSystemUiVisibility()I" since="16" />
+ <method name="getWindowToken()Landroid/os/IBinder;" />
+ <method name="getWindowVisibility()I" />
+ <method name="getWindowVisibleDisplayFrame(Landroid/graphics/Rect;)V" since="3" />
+ <method name="getX()F" since="11" />
+ <method name="getY()F" since="11" />
+ <method name="getZ()F" since="21" />
+ <method name="hasFocus()Z" />
+ <method name="hasFocusable()Z" />
+ <method name="hasNestedScrollingParent()Z" since="21" />
+ <method name="hasOnClickListeners()Z" since="15" />
+ <method name="hasOverlappingRendering()Z" since="16" />
+ <method name="hasTransientState()Z" since="16" />
+ <method name="hasWindowFocus()Z" />
+ <method name="inflate(Landroid/content/Context;ILandroid/view/ViewGroup;)Landroid/view/View;" />
+ <method name="initializeFadingEdge(Landroid/content/res/TypedArray;)V" />
+ <method name="initializeScrollbars(Landroid/content/res/TypedArray;)V" />
+ <method name="invalidate()V" />
+ <method name="invalidate(IIII)V" />
+ <method name="invalidate(Landroid/graphics/Rect;)V" />
+ <method name="invalidateOutline()V" since="21" />
+ <method name="isAccessibilityFocused()Z" since="21" />
+ <method name="isActivated()Z" since="11" />
+ <method name="isAttachedToWindow()Z" since="19" />
+ <method name="isClickable()Z" />
+ <method name="isDirty()Z" since="11" />
+ <method name="isDrawingCacheEnabled()Z" />
+ <method name="isDuplicateParentStateEnabled()Z" />
+ <method name="isEnabled()Z" />
+ <method name="isFocusable()Z" />
+ <method name="isFocusableInTouchMode()Z" />
+ <method name="isFocused()Z" />
+ <method name="isHapticFeedbackEnabled()Z" since="3" />
+ <method name="isHardwareAccelerated()Z" since="11" />
+ <method name="isHorizontalFadingEdgeEnabled()Z" />
+ <method name="isHorizontalScrollBarEnabled()Z" />
+ <method name="isHovered()Z" since="14" />
+ <method name="isImportantForAccessibility()Z" since="21" />
+ <method name="isInEditMode()Z" since="3" />
+ <method name="isInLayout()Z" since="18" />
+ <method name="isInTouchMode()Z" />
+ <method name="isLaidOut()Z" since="19" />
+ <method name="isLayoutDirectionResolved()Z" since="19" />
+ <method name="isLayoutRequested()Z" />
+ <method name="isLongClickable()Z" />
+ <method name="isNestedScrollingEnabled()Z" since="21" />
+ <method name="isOpaque()Z" since="7" />
+ <method name="isPaddingOffsetRequired()Z" since="2" />
+ <method name="isPaddingRelative()Z" since="17" />
+ <method name="isPressed()Z" />
+ <method name="isSaveEnabled()Z" />
+ <method name="isSaveFromParentEnabled()Z" since="11" />
+ <method name="isScrollContainer()Z" since="16" />
+ <method name="isScrollbarFadingEnabled()Z" since="5" />
+ <method name="isSelected()Z" />
+ <method name="isShown()Z" />
+ <method name="isSoundEffectsEnabled()Z" />
+ <method name="isTextAlignmentResolved()Z" since="19" />
+ <method name="isTextDirectionResolved()Z" since="19" />
+ <method name="isVerticalFadingEdgeEnabled()Z" />
+ <method name="isVerticalScrollBarEnabled()Z" />
+ <method name="jumpDrawablesToCurrentState()V" since="11" />
+ <method name="layout(IIII)V" />
+ <method name="measure(II)V" />
+ <method name="mergeDrawableStates([I[I)[I" />
+ <method name="offsetLeftAndRight(I)V" />
+ <method name="offsetTopAndBottom(I)V" />
+ <method name="onAnimationEnd()V" />
+ <method name="onAnimationStart()V" />
+ <method name="onApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets;" since="20" />
+ <method name="onAttachedToWindow()V" />
+ <method name="onCancelPendingInputEvents()V" since="19" />
+ <method name="onCheckIsTextEditor()Z" since="3" />
+ <method name="onConfigurationChanged(Landroid/content/res/Configuration;)V" since="8" />
+ <method name="onCreateContextMenu(Landroid/view/ContextMenu;)V" />
+ <method name="onCreateDrawableState(I)[I" />
+ <method name="onCreateInputConnection(Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection;" since="3" />
+ <method name="onDetachedFromWindow()V" />
+ <method name="onDisplayHint(I)V" since="8" />
+ <method name="onDragEvent(Landroid/view/DragEvent;)Z" since="11" />
+ <method name="onDraw(Landroid/graphics/Canvas;)V" />
+ <method name="onDrawScrollBars(Landroid/graphics/Canvas;)V" since="7" />
+ <method name="onFilterTouchEventForSecurity(Landroid/view/MotionEvent;)Z" since="9" />
+ <method name="onFinishInflate()V" />
+ <method name="onFinishTemporaryDetach()V" since="3" />
+ <method name="onFocusChanged(ZILandroid/graphics/Rect;)V" />
+ <method name="onGenericMotionEvent(Landroid/view/MotionEvent;)Z" since="12" />
+ <method name="onHoverChanged(Z)V" since="14" />
+ <method name="onHoverEvent(Landroid/view/MotionEvent;)Z" since="14" />
+ <method name="onInitializeAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V" since="14" />
+ <method name="onInitializeAccessibilityNodeInfo(Landroid/view/accessibility/AccessibilityNodeInfo;)V" since="14" />
+ <method name="onKeyPreIme(ILandroid/view/KeyEvent;)Z" since="3" />
+ <method name="onKeyShortcut(ILandroid/view/KeyEvent;)Z" />
+ <method name="onLayout(ZIIII)V" />
+ <method name="onMeasure(II)V" />
+ <method name="onOverScrolled(IIZZ)V" since="9" />
+ <method name="onPopulateAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V" since="14" />
+ <method name="onRestoreInstanceState(Landroid/os/Parcelable;)V" />
+ <method name="onRtlPropertiesChanged(I)V" since="17" />
+ <method name="onSaveInstanceState()Landroid/os/Parcelable;" />
+ <method name="onScreenStateChanged(I)V" since="16" />
+ <method name="onScrollChanged(IIII)V" />
+ <method name="onSetAlpha(I)Z" />
+ <method name="onSizeChanged(IIII)V" />
+ <method name="onStartTemporaryDetach()V" since="3" />
+ <method name="onTouchEvent(Landroid/view/MotionEvent;)Z" />
+ <method name="onTrackballEvent(Landroid/view/MotionEvent;)Z" />
+ <method name="onVisibilityChanged(Landroid/view/View;I)V" since="8" />
+ <method name="onWindowFocusChanged(Z)V" />
+ <method name="onWindowSystemUiVisibilityChanged(I)V" since="16" />
+ <method name="onWindowVisibilityChanged(I)V" />
+ <method name="overScrollBy(IIIIIIIIZ)Z" since="9" />
+ <method name="performAccessibilityAction(ILandroid/os/Bundle;)Z" since="16" />
+ <method name="performClick()Z" />
+ <method name="performHapticFeedback(I)Z" since="3" />
+ <method name="performHapticFeedback(II)Z" since="3" />
+ <method name="performLongClick()Z" />
+ <method name="playSoundEffect(I)V" />
+ <method name="post(Ljava/lang/Runnable;)Z" />
+ <method name="postDelayed(Ljava/lang/Runnable;J)Z" />
+ <method name="postInvalidate()V" />
+ <method name="postInvalidate(IIII)V" />
+ <method name="postInvalidateDelayed(J)V" />
+ <method name="postInvalidateDelayed(JIIII)V" />
+ <method name="postInvalidateOnAnimation()V" since="16" />
+ <method name="postInvalidateOnAnimation(IIII)V" since="16" />
+ <method name="postOnAnimation(Ljava/lang/Runnable;)V" since="16" />
+ <method name="postOnAnimationDelayed(Ljava/lang/Runnable;J)V" since="16" />
+ <method name="refreshDrawableState()V" />
+ <method name="removeCallbacks(Ljava/lang/Runnable;)Z" />
+ <method name="removeOnAttachStateChangeListener(Landroid/view/View$OnAttachStateChangeListener;)V" since="12" />
+ <method name="removeOnLayoutChangeListener(Landroid/view/View$OnLayoutChangeListener;)V" since="11" />
+ <method name="requestApplyInsets()V" since="20" />
+ <method name="requestFitSystemWindows()V" since="16" />
+ <method name="requestFocus()Z" />
+ <method name="requestFocus(I)Z" />
+ <method name="requestFocus(ILandroid/graphics/Rect;)Z" />
+ <method name="requestFocusFromTouch()Z" />
+ <method name="requestLayout()V" />
+ <method name="requestRectangleOnScreen(Landroid/graphics/Rect;)Z" />
+ <method name="requestRectangleOnScreen(Landroid/graphics/Rect;Z)Z" />
+ <method name="requestUnbufferedDispatch(Landroid/view/MotionEvent;)V" since="21" />
+ <method name="resolveSize(II)I" />
+ <method name="resolveSizeAndState(III)I" since="11" />
+ <method name="restoreHierarchyState(Landroid/util/SparseArray;)V" />
+ <method name="saveHierarchyState(Landroid/util/SparseArray;)V" />
+ <method name="scrollBy(II)V" />
+ <method name="scrollTo(II)V" />
+ <method name="setAccessibilityDelegate(Landroid/view/View$AccessibilityDelegate;)V" since="14" />
+ <method name="setAccessibilityLiveRegion(I)V" since="19" />
+ <method name="setActivated(Z)V" since="11" />
+ <method name="setAlpha(F)V" since="11" />
+ <method name="setAnimation(Landroid/view/animation/Animation;)V" />
+ <method name="setBackground(Landroid/graphics/drawable/Drawable;)V" since="16" />
+ <method name="setBackgroundColor(I)V" />
+ <method name="setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setBackgroundResource(I)V" />
+ <method name="setBackgroundTintList(Landroid/content/res/ColorStateList;)V" since="21" />
+ <method name="setBackgroundTintMode(Landroid/graphics/PorterDuff$Mode;)V" since="21" />
+ <method name="setBottom(I)V" since="11" />
+ <method name="setCameraDistance(F)V" since="12" />
+ <method name="setClickable(Z)V" />
+ <method name="setClipBounds(Landroid/graphics/Rect;)V" since="18" />
+ <method name="setClipToOutline(Z)V" since="21" />
+ <method name="setContentDescription(Ljava/lang/CharSequence;)V" since="4" />
+ <method name="setDrawingCacheBackgroundColor(I)V" />
+ <method name="setDrawingCacheEnabled(Z)V" />
+ <method name="setDrawingCacheQuality(I)V" />
+ <method name="setDuplicateParentStateEnabled(Z)V" />
+ <method name="setElevation(F)V" since="21" />
+ <method name="setEnabled(Z)V" />
+ <method name="setFadingEdgeLength(I)V" />
+ <method name="setFilterTouchesWhenObscured(Z)V" since="9" />
+ <method name="setFitsSystemWindows(Z)V" since="14" />
+ <method name="setFocusable(Z)V" />
+ <method name="setFocusableInTouchMode(Z)V" />
+ <method name="setHapticFeedbackEnabled(Z)V" since="3" />
+ <method name="setHasTransientState(Z)V" since="16" />
+ <method name="setHorizontalFadingEdgeEnabled(Z)V" />
+ <method name="setHorizontalScrollBarEnabled(Z)V" />
+ <method name="setHovered(Z)V" since="14" />
+ <method name="setId(I)V" />
+ <method name="setImportantForAccessibility(I)V" since="16" />
+ <method name="setKeepScreenOn(Z)V" />
+ <method name="setLabelFor(I)V" since="17" />
+ <method name="setLayerPaint(Landroid/graphics/Paint;)V" since="17" />
+ <method name="setLayerType(ILandroid/graphics/Paint;)V" since="11" />
+ <method name="setLayoutDirection(I)V" since="17" />
+ <method name="setLayoutParams(Landroid/view/ViewGroup$LayoutParams;)V" />
+ <method name="setLeft(I)V" since="11" />
+ <method name="setLongClickable(Z)V" />
+ <method name="setMeasuredDimension(II)V" />
+ <method name="setMinimumHeight(I)V" />
+ <method name="setMinimumWidth(I)V" />
+ <method name="setNestedScrollingEnabled(Z)V" since="21" />
+ <method name="setNextFocusDownId(I)V" />
+ <method name="setNextFocusForwardId(I)V" since="11" />
+ <method name="setNextFocusLeftId(I)V" />
+ <method name="setNextFocusRightId(I)V" />
+ <method name="setNextFocusUpId(I)V" />
+ <method name="setOnApplyWindowInsetsListener(Landroid/view/View$OnApplyWindowInsetsListener;)V" since="20" />
+ <method name="setOnClickListener(Landroid/view/View$OnClickListener;)V" />
+ <method name="setOnCreateContextMenuListener(Landroid/view/View$OnCreateContextMenuListener;)V" />
+ <method name="setOnDragListener(Landroid/view/View$OnDragListener;)V" since="11" />
+ <method name="setOnFocusChangeListener(Landroid/view/View$OnFocusChangeListener;)V" />
+ <method name="setOnGenericMotionListener(Landroid/view/View$OnGenericMotionListener;)V" since="12" />
+ <method name="setOnHoverListener(Landroid/view/View$OnHoverListener;)V" since="14" />
+ <method name="setOnKeyListener(Landroid/view/View$OnKeyListener;)V" />
+ <method name="setOnLongClickListener(Landroid/view/View$OnLongClickListener;)V" />
+ <method name="setOnSystemUiVisibilityChangeListener(Landroid/view/View$OnSystemUiVisibilityChangeListener;)V" since="11" />
+ <method name="setOnTouchListener(Landroid/view/View$OnTouchListener;)V" />
+ <method name="setOutlineProvider(Landroid/view/ViewOutlineProvider;)V" since="21" />
+ <method name="setOverScrollMode(I)V" since="9" />
+ <method name="setPadding(IIII)V" />
+ <method name="setPaddingRelative(IIII)V" since="17" />
+ <method name="setPivotX(F)V" since="11" />
+ <method name="setPivotY(F)V" since="11" />
+ <method name="setPressed(Z)V" />
+ <method name="setRight(I)V" since="11" />
+ <method name="setRotation(F)V" since="11" />
+ <method name="setRotationX(F)V" since="11" />
+ <method name="setRotationY(F)V" since="11" />
+ <method name="setSaveEnabled(Z)V" />
+ <method name="setSaveFromParentEnabled(Z)V" since="11" />
+ <method name="setScaleX(F)V" since="11" />
+ <method name="setScaleY(F)V" since="11" />
+ <method name="setScrollBarDefaultDelayBeforeFade(I)V" since="16" />
+ <method name="setScrollBarFadeDuration(I)V" since="16" />
+ <method name="setScrollBarSize(I)V" since="16" />
+ <method name="setScrollBarStyle(I)V" />
+ <method name="setScrollContainer(Z)V" since="3" />
+ <method name="setScrollX(I)V" since="14" />
+ <method name="setScrollY(I)V" since="14" />
+ <method name="setScrollbarFadingEnabled(Z)V" since="5" />
+ <method name="setSelected(Z)V" />
+ <method name="setSoundEffectsEnabled(Z)V" />
+ <method name="setStateListAnimator(Landroid/animation/StateListAnimator;)V" since="21" />
+ <method name="setSystemUiVisibility(I)V" since="11" />
+ <method name="setTag(ILjava/lang/Object;)V" since="4" />
+ <method name="setTag(Ljava/lang/Object;)V" />
+ <method name="setTextAlignment(I)V" since="17" />
+ <method name="setTextDirection(I)V" since="17" />
+ <method name="setTop(I)V" since="11" />
+ <method name="setTouchDelegate(Landroid/view/TouchDelegate;)V" />
+ <method name="setTransitionName(Ljava/lang/String;)V" since="21" />
+ <method name="setTranslationX(F)V" since="11" />
+ <method name="setTranslationY(F)V" since="11" />
+ <method name="setTranslationZ(F)V" since="21" />
+ <method name="setVerticalFadingEdgeEnabled(Z)V" />
+ <method name="setVerticalScrollBarEnabled(Z)V" />
+ <method name="setVerticalScrollbarPosition(I)V" since="11" />
+ <method name="setVisibility(I)V" />
+ <method name="setWillNotCacheDrawing(Z)V" />
+ <method name="setWillNotDraw(Z)V" />
+ <method name="setX(F)V" since="11" />
+ <method name="setY(F)V" since="11" />
+ <method name="setZ(F)V" since="21" />
+ <method name="showContextMenu()Z" />
+ <method name="startActionMode(Landroid/view/ActionMode$Callback;)Landroid/view/ActionMode;" since="11" />
+ <method name="startAnimation(Landroid/view/animation/Animation;)V" />
+ <method name="startDrag(Landroid/content/ClipData;Landroid/view/View$DragShadowBuilder;Ljava/lang/Object;I)Z" since="11" />
+ <method name="startNestedScroll(I)Z" since="21" />
+ <method name="stopNestedScroll()V" since="21" />
+ <method name="unscheduleDrawable(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="verifyDrawable(Landroid/graphics/drawable/Drawable;)Z" />
+ <method name="willNotCacheDrawing()Z" />
+ <method name="willNotDraw()Z" />
+ <field name="ACCESSIBILITY_LIVE_REGION_ASSERTIVE" since="19" />
+ <field name="ACCESSIBILITY_LIVE_REGION_NONE" since="19" />
+ <field name="ACCESSIBILITY_LIVE_REGION_POLITE" since="19" />
+ <field name="ALPHA" since="14" />
+ <field name="DRAWING_CACHE_QUALITY_AUTO" />
+ <field name="DRAWING_CACHE_QUALITY_HIGH" />
+ <field name="DRAWING_CACHE_QUALITY_LOW" />
+ <field name="EMPTY_STATE_SET" />
+ <field name="ENABLED_FOCUSED_SELECTED_STATE_SET" />
+ <field name="ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET" />
+ <field name="ENABLED_FOCUSED_STATE_SET" />
+ <field name="ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET" />
+ <field name="ENABLED_SELECTED_STATE_SET" />
+ <field name="ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET" />
+ <field name="ENABLED_STATE_SET" />
+ <field name="ENABLED_WINDOW_FOCUSED_STATE_SET" />
+ <field name="FIND_VIEWS_WITH_CONTENT_DESCRIPTION" since="14" />
+ <field name="FIND_VIEWS_WITH_TEXT" since="14" />
+ <field name="FOCUSABLES_ALL" since="4" />
+ <field name="FOCUSABLES_TOUCH_MODE" since="4" />
+ <field name="FOCUSED_SELECTED_STATE_SET" />
+ <field name="FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET" />
+ <field name="FOCUSED_STATE_SET" />
+ <field name="FOCUSED_WINDOW_FOCUSED_STATE_SET" />
+ <field name="FOCUS_BACKWARD" />
+ <field name="FOCUS_DOWN" />
+ <field name="FOCUS_FORWARD" />
+ <field name="FOCUS_LEFT" />
+ <field name="FOCUS_RIGHT" />
+ <field name="FOCUS_UP" />
+ <field name="GONE" />
+ <field name="HAPTIC_FEEDBACK_ENABLED" since="3" />
+ <field name="IMPORTANT_FOR_ACCESSIBILITY_AUTO" since="16" />
+ <field name="IMPORTANT_FOR_ACCESSIBILITY_NO" since="16" />
+ <field name="IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS" since="19" />
+ <field name="IMPORTANT_FOR_ACCESSIBILITY_YES" since="16" />
+ <field name="INVISIBLE" />
+ <field name="KEEP_SCREEN_ON" />
+ <field name="LAYER_TYPE_HARDWARE" since="11" />
+ <field name="LAYER_TYPE_NONE" since="11" />
+ <field name="LAYER_TYPE_SOFTWARE" since="11" />
+ <field name="LAYOUT_DIRECTION_INHERIT" since="17" />
+ <field name="LAYOUT_DIRECTION_LOCALE" since="17" />
+ <field name="LAYOUT_DIRECTION_LTR" since="17" />
+ <field name="LAYOUT_DIRECTION_RTL" since="17" />
+ <field name="MEASURED_HEIGHT_STATE_SHIFT" since="11" />
+ <field name="MEASURED_SIZE_MASK" since="11" />
+ <field name="MEASURED_STATE_MASK" since="11" />
+ <field name="MEASURED_STATE_TOO_SMALL" since="11" />
+ <field name="NO_ID" />
+ <field name="OVER_SCROLL_ALWAYS" since="9" />
+ <field name="OVER_SCROLL_IF_CONTENT_SCROLLS" since="9" />
+ <field name="OVER_SCROLL_NEVER" since="9" />
+ <field name="PRESSED_ENABLED_FOCUSED_SELECTED_STATE_SET" />
+ <field name="PRESSED_ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET" />
+ <field name="PRESSED_ENABLED_FOCUSED_STATE_SET" />
+ <field name="PRESSED_ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET" />
+ <field name="PRESSED_ENABLED_SELECTED_STATE_SET" />
+ <field name="PRESSED_ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET" />
+ <field name="PRESSED_ENABLED_STATE_SET" />
+ <field name="PRESSED_ENABLED_WINDOW_FOCUSED_STATE_SET" />
+ <field name="PRESSED_FOCUSED_SELECTED_STATE_SET" />
+ <field name="PRESSED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET" />
+ <field name="PRESSED_FOCUSED_STATE_SET" />
+ <field name="PRESSED_FOCUSED_WINDOW_FOCUSED_STATE_SET" />
+ <field name="PRESSED_SELECTED_STATE_SET" />
+ <field name="PRESSED_SELECTED_WINDOW_FOCUSED_STATE_SET" />
+ <field name="PRESSED_STATE_SET" since="19" />
+ <field name="PRESSED_WINDOW_FOCUSED_STATE_SET" />
+ <field name="ROTATION" since="14" />
+ <field name="ROTATION_X" since="14" />
+ <field name="ROTATION_Y" since="14" />
+ <field name="SCALE_X" since="14" />
+ <field name="SCALE_Y" since="14" />
+ <field name="SCREEN_STATE_OFF" since="16" />
+ <field name="SCREEN_STATE_ON" since="16" />
+ <field name="SCROLLBARS_INSIDE_INSET" />
+ <field name="SCROLLBARS_INSIDE_OVERLAY" />
+ <field name="SCROLLBARS_OUTSIDE_INSET" />
+ <field name="SCROLLBARS_OUTSIDE_OVERLAY" />
+ <field name="SCROLLBAR_POSITION_DEFAULT" since="11" />
+ <field name="SCROLLBAR_POSITION_LEFT" since="11" />
+ <field name="SCROLLBAR_POSITION_RIGHT" since="11" />
+ <field name="SCROLL_AXIS_HORIZONTAL" since="21" />
+ <field name="SCROLL_AXIS_NONE" since="21" />
+ <field name="SCROLL_AXIS_VERTICAL" since="21" />
+ <field name="SELECTED_STATE_SET" />
+ <field name="SELECTED_WINDOW_FOCUSED_STATE_SET" />
+ <field name="SOUND_EFFECTS_ENABLED" />
+ <field name="STATUS_BAR_HIDDEN" since="11" />
+ <field name="STATUS_BAR_VISIBLE" since="11" />
+ <field name="SYSTEM_UI_FLAG_FULLSCREEN" since="16" />
+ <field name="SYSTEM_UI_FLAG_HIDE_NAVIGATION" since="14" />
+ <field name="SYSTEM_UI_FLAG_IMMERSIVE" since="19" />
+ <field name="SYSTEM_UI_FLAG_IMMERSIVE_STICKY" since="19" />
+ <field name="SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN" since="16" />
+ <field name="SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION" since="16" />
+ <field name="SYSTEM_UI_FLAG_LAYOUT_STABLE" since="16" />
+ <field name="SYSTEM_UI_FLAG_LOW_PROFILE" since="14" />
+ <field name="SYSTEM_UI_FLAG_VISIBLE" since="14" />
+ <field name="SYSTEM_UI_LAYOUT_FLAGS" since="16" />
+ <field name="TEXT_ALIGNMENT_CENTER" since="17" />
+ <field name="TEXT_ALIGNMENT_GRAVITY" since="17" />
+ <field name="TEXT_ALIGNMENT_INHERIT" since="16" />
+ <field name="TEXT_ALIGNMENT_RESOLVED_DEFAULT" since="16" />
+ <field name="TEXT_ALIGNMENT_TEXT_END" since="17" />
+ <field name="TEXT_ALIGNMENT_TEXT_START" since="17" />
+ <field name="TEXT_ALIGNMENT_VIEW_END" since="17" />
+ <field name="TEXT_ALIGNMENT_VIEW_START" since="17" />
+ <field name="TEXT_DIRECTION_ANY_RTL" since="17" />
+ <field name="TEXT_DIRECTION_FIRST_STRONG" since="17" />
+ <field name="TEXT_DIRECTION_INHERIT" since="17" />
+ <field name="TEXT_DIRECTION_LOCALE" since="17" />
+ <field name="TEXT_DIRECTION_LTR" since="17" />
+ <field name="TEXT_DIRECTION_RTL" since="17" />
+ <field name="TRANSLATION_X" since="14" />
+ <field name="TRANSLATION_Y" since="14" />
+ <field name="TRANSLATION_Z" since="21" />
+ <field name="VIEW_LOG_TAG" />
+ <field name="VISIBLE" />
+ <field name="WINDOW_FOCUSED_STATE_SET" />
+ <field name="X" since="14" />
+ <field name="Y" since="14" />
+ <field name="Z" since="21" />
+ </class>
+ <class name="android/view/View$AccessibilityDelegate" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="dispatchPopulateAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z" />
+ <method name="getAccessibilityNodeProvider(Landroid/view/View;)Landroid/view/accessibility/AccessibilityNodeProvider;" since="16" />
+ <method name="onInitializeAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V" />
+ <method name="onInitializeAccessibilityNodeInfo(Landroid/view/View;Landroid/view/accessibility/AccessibilityNodeInfo;)V" />
+ <method name="onPopulateAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V" />
+ <method name="onRequestSendAccessibilityEvent(Landroid/view/ViewGroup;Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z" />
+ <method name="performAccessibilityAction(Landroid/view/View;ILandroid/os/Bundle;)Z" since="16" />
+ <method name="sendAccessibilityEvent(Landroid/view/View;I)V" />
+ <method name="sendAccessibilityEventUnchecked(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)V" />
+ </class>
+ <class name="android/view/View$BaseSavedState" since="1">
+ <extends name="android/view/AbsSavedState" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="&lt;init>(Landroid/os/Parcelable;)V" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/view/View$DragShadowBuilder" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/view/View;)V" />
+ <method name="getView()Landroid/view/View;" />
+ <method name="onDrawShadow(Landroid/graphics/Canvas;)V" />
+ <method name="onProvideShadowMetrics(Landroid/graphics/Point;Landroid/graphics/Point;)V" />
+ </class>
+ <class name="android/view/View$MeasureSpec" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getMode(I)I" />
+ <method name="getSize(I)I" />
+ <method name="makeMeasureSpec(II)I" />
+ <method name="toString(I)Ljava/lang/String;" />
+ <field name="AT_MOST" />
+ <field name="EXACTLY" />
+ <field name="UNSPECIFIED" />
+ </class>
+ <class name="android/view/View$OnApplyWindowInsetsListener" since="20">
+ <extends name="java/lang/Object" />
+ <method name="onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets;" />
+ </class>
+ <class name="android/view/View$OnAttachStateChangeListener" since="12">
+ <extends name="java/lang/Object" />
+ <method name="onViewAttachedToWindow(Landroid/view/View;)V" />
+ <method name="onViewDetachedFromWindow(Landroid/view/View;)V" />
+ </class>
+ <class name="android/view/View$OnClickListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onClick(Landroid/view/View;)V" />
+ </class>
+ <class name="android/view/View$OnCreateContextMenuListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onCreateContextMenu(Landroid/view/ContextMenu;Landroid/view/View;Landroid/view/ContextMenu$ContextMenuInfo;)V" />
+ </class>
+ <class name="android/view/View$OnDragListener" since="11">
+ <extends name="java/lang/Object" />
+ <method name="onDrag(Landroid/view/View;Landroid/view/DragEvent;)Z" />
+ </class>
+ <class name="android/view/View$OnFocusChangeListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onFocusChange(Landroid/view/View;Z)V" />
+ </class>
+ <class name="android/view/View$OnGenericMotionListener" since="12">
+ <extends name="java/lang/Object" />
+ <method name="onGenericMotion(Landroid/view/View;Landroid/view/MotionEvent;)Z" />
+ </class>
+ <class name="android/view/View$OnHoverListener" since="14">
+ <extends name="java/lang/Object" />
+ <method name="onHover(Landroid/view/View;Landroid/view/MotionEvent;)Z" />
+ </class>
+ <class name="android/view/View$OnKeyListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onKey(Landroid/view/View;ILandroid/view/KeyEvent;)Z" />
+ </class>
+ <class name="android/view/View$OnLayoutChangeListener" since="11">
+ <extends name="java/lang/Object" />
+ <method name="onLayoutChange(Landroid/view/View;IIIIIIII)V" />
+ </class>
+ <class name="android/view/View$OnLongClickListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onLongClick(Landroid/view/View;)Z" />
+ </class>
+ <class name="android/view/View$OnSystemUiVisibilityChangeListener" since="11">
+ <extends name="java/lang/Object" />
+ <method name="onSystemUiVisibilityChange(I)V" />
+ </class>
+ <class name="android/view/View$OnTouchListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onTouch(Landroid/view/View;Landroid/view/MotionEvent;)Z" />
+ </class>
+ <class name="android/view/ViewAnimationUtils" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="createCircularReveal(Landroid/view/View;IIFF)Landroid/animation/Animator;" />
+ </class>
+ <class name="android/view/ViewConfiguration" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="get(Landroid/content/Context;)Landroid/view/ViewConfiguration;" since="3" />
+ <method name="getDoubleTapTimeout()I" since="3" />
+ <method name="getEdgeSlop()I" />
+ <method name="getFadingEdgeLength()I" />
+ <method name="getGlobalActionKeyTimeout()J" />
+ <method name="getJumpTapTimeout()I" />
+ <method name="getKeyRepeatDelay()I" since="12" />
+ <method name="getKeyRepeatTimeout()I" since="12" />
+ <method name="getLongPressTimeout()I" />
+ <method name="getMaximumDrawingCacheSize()I" />
+ <method name="getMaximumFlingVelocity()I" since="4" />
+ <method name="getMinimumFlingVelocity()I" />
+ <method name="getPressedStateDuration()I" />
+ <method name="getScaledDoubleTapSlop()I" since="3" />
+ <method name="getScaledEdgeSlop()I" since="3" />
+ <method name="getScaledFadingEdgeLength()I" since="3" />
+ <method name="getScaledMaximumDrawingCacheSize()I" since="3" />
+ <method name="getScaledMaximumFlingVelocity()I" since="4" />
+ <method name="getScaledMinimumFlingVelocity()I" since="3" />
+ <method name="getScaledOverflingDistance()I" since="9" />
+ <method name="getScaledOverscrollDistance()I" since="9" />
+ <method name="getScaledPagingTouchSlop()I" since="8" />
+ <method name="getScaledScrollBarSize()I" since="3" />
+ <method name="getScaledTouchSlop()I" since="3" />
+ <method name="getScaledWindowTouchSlop()I" since="3" />
+ <method name="getScrollBarFadeDuration()I" since="5" />
+ <method name="getScrollBarSize()I" />
+ <method name="getScrollDefaultDelay()I" since="5" />
+ <method name="getScrollFriction()F" />
+ <method name="getTapTimeout()I" />
+ <method name="getTouchSlop()I" />
+ <method name="getWindowTouchSlop()I" />
+ <method name="getZoomControlsTimeout()J" />
+ <method name="hasPermanentMenuKey()Z" since="14" />
+ </class>
+ <class name="android/view/ViewDebug" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="dumpCapturedView(Ljava/lang/String;Ljava/lang/Object;)V" since="3" />
+ <method name="startHierarchyTracing(Ljava/lang/String;Landroid/view/View;)V" />
+ <method name="startRecyclerTracing(Ljava/lang/String;Landroid/view/View;)V" />
+ <method name="stopHierarchyTracing()V" />
+ <method name="stopRecyclerTracing()V" />
+ <method name="trace(Landroid/view/View;Landroid/view/ViewDebug$HierarchyTraceType;)V" />
+ <method name="trace(Landroid/view/View;Landroid/view/ViewDebug$RecyclerTraceType;[I)V" />
+ <field name="TRACE_HIERARCHY" />
+ <field name="TRACE_RECYCLER" />
+ </class>
+ <class name="android/view/ViewDebug$CapturedViewProperty" since="3">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/annotation/Annotation" />
+ <method name="retrieveReturn()Z" />
+ </class>
+ <class name="android/view/ViewDebug$ExportedProperty" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/annotation/Annotation" />
+ <method name="category()Ljava/lang/String;" since="9" />
+ <method name="deepExport()Z" />
+ <method name="flagMapping()[Landroid/view/ViewDebug$FlagToString;" since="4" />
+ <method name="formatToHexString()Z" since="21" />
+ <method name="hasAdjacentMapping()Z" since="21" />
+ <method name="indexMapping()[Landroid/view/ViewDebug$IntToString;" since="3" />
+ <method name="mapping()[Landroid/view/ViewDebug$IntToString;" />
+ <method name="prefix()Ljava/lang/String;" />
+ <method name="resolveId()Z" />
+ </class>
+ <class name="android/view/ViewDebug$FlagToString" since="4">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/annotation/Annotation" />
+ <method name="equals()I" />
+ <method name="mask()I" />
+ <method name="name()Ljava/lang/String;" />
+ <method name="outputIf()Z" />
+ </class>
+ <class name="android/view/ViewDebug$HierarchyTraceType" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/view/ViewDebug$HierarchyTraceType;" />
+ <method name="values()[Landroid/view/ViewDebug$HierarchyTraceType;" />
+ <field name="BUILD_CACHE" />
+ <field name="DRAW" />
+ <field name="INVALIDATE" />
+ <field name="INVALIDATE_CHILD" />
+ <field name="INVALIDATE_CHILD_IN_PARENT" />
+ <field name="ON_LAYOUT" />
+ <field name="ON_MEASURE" />
+ <field name="REQUEST_LAYOUT" />
+ </class>
+ <class name="android/view/ViewDebug$IntToString" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/annotation/Annotation" />
+ <method name="from()I" />
+ <method name="to()Ljava/lang/String;" />
+ </class>
+ <class name="android/view/ViewDebug$RecyclerTraceType" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/view/ViewDebug$RecyclerTraceType;" />
+ <method name="values()[Landroid/view/ViewDebug$RecyclerTraceType;" />
+ <field name="BIND_VIEW" />
+ <field name="MOVE_FROM_ACTIVE_TO_SCRAP_HEAP" />
+ <field name="MOVE_TO_ACTIVE_HEAP" />
+ <field name="MOVE_TO_SCRAP_HEAP" />
+ <field name="NEW_VIEW" />
+ <field name="RECYCLE_FROM_ACTIVE_HEAP" />
+ <field name="RECYCLE_FROM_SCRAP_HEAP" />
+ </class>
+ <class name="android/view/ViewGroup" since="1">
+ <extends name="android/view/View" />
+ <implements name="android/view/ViewManager" />
+ <implements name="android/view/ViewParent" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="addStatesFromChildren()Z" />
+ <method name="addView(Landroid/view/View;)V" />
+ <method name="addView(Landroid/view/View;I)V" />
+ <method name="addView(Landroid/view/View;II)V" />
+ <method name="addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V" />
+ <method name="addViewInLayout(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)Z" />
+ <method name="addViewInLayout(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;Z)Z" />
+ <method name="attachLayoutAnimationParameters(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;II)V" />
+ <method name="attachViewToParent(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V" />
+ <method name="canAnimate()Z" />
+ <method name="checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z" />
+ <method name="cleanupLayoutState(Landroid/view/View;)V" />
+ <method name="clearDisappearingChildren()V" />
+ <method name="debug(I)V" />
+ <method name="detachAllViewsFromParent()V" />
+ <method name="detachViewFromParent(I)V" />
+ <method name="detachViewFromParent(Landroid/view/View;)V" />
+ <method name="detachViewsFromParent(II)V" />
+ <method name="dispatchFreezeSelfOnly(Landroid/util/SparseArray;)V" />
+ <method name="dispatchThawSelfOnly(Landroid/util/SparseArray;)V" />
+ <method name="drawChild(Landroid/graphics/Canvas;Landroid/view/View;J)Z" />
+ <method name="endViewTransition(Landroid/view/View;)V" since="11" />
+ <method name="gatherTransparentRegion(Landroid/graphics/Region;)Z" />
+ <method name="generateDefaultLayoutParams()Landroid/view/ViewGroup$LayoutParams;" />
+ <method name="generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams;" />
+ <method name="generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroid/view/ViewGroup$LayoutParams;" />
+ <method name="getChildAt(I)Landroid/view/View;" />
+ <method name="getChildCount()I" />
+ <method name="getChildDrawingOrder(II)I" />
+ <method name="getChildMeasureSpec(III)I" />
+ <method name="getChildStaticTransformation(Landroid/view/View;Landroid/view/animation/Transformation;)Z" />
+ <method name="getClipChildren()Z" since="18" />
+ <method name="getClipToPadding()Z" since="21" />
+ <method name="getDescendantFocusability()I" />
+ <method name="getFocusedChild()Landroid/view/View;" />
+ <method name="getLayoutAnimation()Landroid/view/animation/LayoutAnimationController;" />
+ <method name="getLayoutAnimationListener()Landroid/view/animation/Animation$AnimationListener;" />
+ <method name="getLayoutMode()I" since="18" />
+ <method name="getLayoutTransition()Landroid/animation/LayoutTransition;" since="11" />
+ <method name="getNestedScrollAxes()I" since="21" />
+ <method name="getOverlay()Landroid/view/ViewGroupOverlay;" since="18" />
+ <method name="getPersistentDrawingCache()I" />
+ <method name="getTouchscreenBlocksFocus()Z" since="21" />
+ <method name="indexOfChild(Landroid/view/View;)I" />
+ <method name="isAlwaysDrawnWithCacheEnabled()Z" />
+ <method name="isAnimationCacheEnabled()Z" />
+ <method name="isChildrenDrawingOrderEnabled()Z" since="7" />
+ <method name="isChildrenDrawnWithCacheEnabled()Z" />
+ <method name="isMotionEventSplittingEnabled()Z" since="11" />
+ <method name="isTransitionGroup()Z" since="21" />
+ <method name="measureChild(Landroid/view/View;II)V" />
+ <method name="measureChildWithMargins(Landroid/view/View;IIII)V" />
+ <method name="measureChildren(II)V" />
+ <method name="offsetDescendantRectToMyCoords(Landroid/view/View;Landroid/graphics/Rect;)V" />
+ <method name="offsetRectIntoDescendantCoords(Landroid/view/View;Landroid/graphics/Rect;)V" />
+ <method name="onInterceptHoverEvent(Landroid/view/MotionEvent;)Z" since="14" />
+ <method name="onInterceptTouchEvent(Landroid/view/MotionEvent;)Z" />
+ <method name="onRequestFocusInDescendants(ILandroid/graphics/Rect;)Z" />
+ <method name="onRequestSendAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z" since="14" />
+ <method name="removeAllViews()V" />
+ <method name="removeAllViewsInLayout()V" />
+ <method name="removeDetachedView(Landroid/view/View;Z)V" />
+ <method name="removeViewAt(I)V" />
+ <method name="removeViewInLayout(Landroid/view/View;)V" />
+ <method name="removeViews(II)V" />
+ <method name="removeViewsInLayout(II)V" />
+ <method name="requestChildRectangleOnScreen(Landroid/view/View;Landroid/graphics/Rect;Z)Z" />
+ <method name="resetResolvedLayoutDirection()V" since="14" />
+ <method name="resetResolvedTextDirection()V" since="14" />
+ <method name="scheduleLayoutAnimation()V" />
+ <method name="setAddStatesFromChildren(Z)V" />
+ <method name="setAlwaysDrawnWithCacheEnabled(Z)V" />
+ <method name="setAnimationCacheEnabled(Z)V" />
+ <method name="setChildrenDrawingCacheEnabled(Z)V" />
+ <method name="setChildrenDrawingOrderEnabled(Z)V" since="7" />
+ <method name="setChildrenDrawnWithCacheEnabled(Z)V" />
+ <method name="setClipChildren(Z)V" />
+ <method name="setClipToPadding(Z)V" />
+ <method name="setDescendantFocusability(I)V" />
+ <method name="setLayoutAnimation(Landroid/view/animation/LayoutAnimationController;)V" />
+ <method name="setLayoutAnimationListener(Landroid/view/animation/Animation$AnimationListener;)V" />
+ <method name="setLayoutMode(I)V" since="18" />
+ <method name="setLayoutTransition(Landroid/animation/LayoutTransition;)V" since="11" />
+ <method name="setMotionEventSplittingEnabled(Z)V" since="11" />
+ <method name="setOnHierarchyChangeListener(Landroid/view/ViewGroup$OnHierarchyChangeListener;)V" />
+ <method name="setPersistentDrawingCache(I)V" />
+ <method name="setStaticTransformationsEnabled(Z)V" since="3" />
+ <method name="setTouchscreenBlocksFocus(Z)V" since="21" />
+ <method name="setTransitionGroup(Z)V" since="21" />
+ <method name="shouldDelayChildPressedState()Z" since="14" />
+ <method name="startLayoutAnimation()V" />
+ <method name="startViewTransition(Landroid/view/View;)V" since="11" />
+ <field name="CLIP_TO_PADDING_MASK" />
+ <field name="FLAG_USE_CHILD_DRAWING_ORDER" />
+ <field name="FOCUS_AFTER_DESCENDANTS" />
+ <field name="FOCUS_BEFORE_DESCENDANTS" />
+ <field name="FOCUS_BLOCK_DESCENDANTS" />
+ <field name="LAYOUT_MODE_CLIP_BOUNDS" since="18" />
+ <field name="LAYOUT_MODE_OPTICAL_BOUNDS" since="18" />
+ <field name="PERSISTENT_ALL_CACHES" />
+ <field name="PERSISTENT_ANIMATION_CACHE" />
+ <field name="PERSISTENT_NO_CACHE" />
+ <field name="PERSISTENT_SCROLLING_CACHE" />
+ </class>
+ <class name="android/view/ViewGroup$LayoutParams" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(II)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V" />
+ <method name="resolveLayoutDirection(I)V" since="17" />
+ <method name="setBaseAttributes(Landroid/content/res/TypedArray;II)V" />
+ <field name="FILL_PARENT" />
+ <field name="MATCH_PARENT" since="8" />
+ <field name="WRAP_CONTENT" />
+ <field name="height" />
+ <field name="layoutAnimationParameters" />
+ <field name="width" />
+ </class>
+ <class name="android/view/ViewGroup$MarginLayoutParams" since="1">
+ <extends name="android/view/ViewGroup$LayoutParams" />
+ <method name="&lt;init>(II)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V" />
+ <method name="&lt;init>(Landroid/view/ViewGroup$MarginLayoutParams;)V" />
+ <method name="getLayoutDirection()I" since="17" />
+ <method name="getMarginEnd()I" since="17" />
+ <method name="getMarginStart()I" since="17" />
+ <method name="isMarginRelative()Z" since="17" />
+ <method name="setLayoutDirection(I)V" since="17" />
+ <method name="setMarginEnd(I)V" since="17" />
+ <method name="setMarginStart(I)V" since="17" />
+ <method name="setMargins(IIII)V" />
+ <field name="bottomMargin" />
+ <field name="leftMargin" />
+ <field name="rightMargin" />
+ <field name="topMargin" />
+ </class>
+ <class name="android/view/ViewGroup$OnHierarchyChangeListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onChildViewAdded(Landroid/view/View;Landroid/view/View;)V" />
+ <method name="onChildViewRemoved(Landroid/view/View;Landroid/view/View;)V" />
+ </class>
+ <class name="android/view/ViewGroupOverlay" since="18">
+ <extends name="android/view/ViewOverlay" />
+ <method name="&lt;init>()V" />
+ <method name="add(Landroid/view/View;)V" />
+ <method name="remove(Landroid/view/View;)V" />
+ </class>
+ <class name="android/view/ViewManager" since="1">
+ <extends name="java/lang/Object" />
+ <method name="addView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V" />
+ <method name="removeView(Landroid/view/View;)V" />
+ <method name="updateViewLayout(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V" />
+ </class>
+ <class name="android/view/ViewOutlineProvider" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getOutline(Landroid/view/View;Landroid/graphics/Outline;)V" />
+ <field name="BACKGROUND" />
+ <field name="BOUNDS" />
+ <field name="PADDED_BOUNDS" />
+ </class>
+ <class name="android/view/ViewOverlay" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="add(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="clear()V" />
+ <method name="remove(Landroid/graphics/drawable/Drawable;)V" />
+ </class>
+ <class name="android/view/ViewParent" since="1">
+ <extends name="java/lang/Object" />
+ <method name="bringChildToFront(Landroid/view/View;)V" />
+ <method name="canResolveLayoutDirection()Z" since="19" />
+ <method name="canResolveTextAlignment()Z" since="19" />
+ <method name="canResolveTextDirection()Z" since="19" />
+ <method name="childDrawableStateChanged(Landroid/view/View;)V" />
+ <method name="childHasTransientStateChanged(Landroid/view/View;Z)V" since="19" />
+ <method name="clearChildFocus(Landroid/view/View;)V" />
+ <method name="createContextMenu(Landroid/view/ContextMenu;)V" />
+ <method name="focusSearch(Landroid/view/View;I)Landroid/view/View;" />
+ <method name="focusableViewAvailable(Landroid/view/View;)V" />
+ <method name="getChildVisibleRect(Landroid/view/View;Landroid/graphics/Rect;Landroid/graphics/Point;)Z" />
+ <method name="getLayoutDirection()I" since="19" />
+ <method name="getParent()Landroid/view/ViewParent;" />
+ <method name="getParentForAccessibility()Landroid/view/ViewParent;" since="16" />
+ <method name="getTextAlignment()I" since="19" />
+ <method name="getTextDirection()I" since="19" />
+ <method name="invalidateChild(Landroid/view/View;Landroid/graphics/Rect;)V" />
+ <method name="invalidateChildInParent([ILandroid/graphics/Rect;)Landroid/view/ViewParent;" />
+ <method name="isLayoutDirectionResolved()Z" since="19" />
+ <method name="isLayoutRequested()Z" />
+ <method name="isTextAlignmentResolved()Z" since="19" />
+ <method name="isTextDirectionResolved()Z" since="19" />
+ <method name="notifySubtreeAccessibilityStateChanged(Landroid/view/View;Landroid/view/View;I)V" since="19" />
+ <method name="onNestedFling(Landroid/view/View;FFZ)Z" since="21" />
+ <method name="onNestedPreFling(Landroid/view/View;FF)Z" since="21" />
+ <method name="onNestedPreScroll(Landroid/view/View;II[I)V" since="21" />
+ <method name="onNestedScroll(Landroid/view/View;IIII)V" since="21" />
+ <method name="onNestedScrollAccepted(Landroid/view/View;Landroid/view/View;I)V" since="21" />
+ <method name="onStartNestedScroll(Landroid/view/View;Landroid/view/View;I)Z" since="21" />
+ <method name="onStopNestedScroll(Landroid/view/View;)V" since="21" />
+ <method name="recomputeViewAttributes(Landroid/view/View;)V" />
+ <method name="requestChildFocus(Landroid/view/View;Landroid/view/View;)V" />
+ <method name="requestChildRectangleOnScreen(Landroid/view/View;Landroid/graphics/Rect;Z)Z" since="3" />
+ <method name="requestDisallowInterceptTouchEvent(Z)V" />
+ <method name="requestFitSystemWindows()V" since="16" />
+ <method name="requestLayout()V" />
+ <method name="requestSendAccessibilityEvent(Landroid/view/View;Landroid/view/accessibility/AccessibilityEvent;)Z" since="14" />
+ <method name="requestTransparentRegion(Landroid/view/View;)V" />
+ <method name="showContextMenuForChild(Landroid/view/View;)Z" />
+ <method name="startActionModeForChild(Landroid/view/View;Landroid/view/ActionMode$Callback;)Landroid/view/ActionMode;" since="11" />
+ </class>
+ <class name="android/view/ViewPropertyAnimator" since="12">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="alpha(F)Landroid/view/ViewPropertyAnimator;" />
+ <method name="alphaBy(F)Landroid/view/ViewPropertyAnimator;" />
+ <method name="cancel()V" since="14" />
+ <method name="getDuration()J" since="14" />
+ <method name="getInterpolator()Landroid/animation/TimeInterpolator;" since="18" />
+ <method name="getStartDelay()J" since="14" />
+ <method name="rotation(F)Landroid/view/ViewPropertyAnimator;" />
+ <method name="rotationBy(F)Landroid/view/ViewPropertyAnimator;" />
+ <method name="rotationX(F)Landroid/view/ViewPropertyAnimator;" />
+ <method name="rotationXBy(F)Landroid/view/ViewPropertyAnimator;" />
+ <method name="rotationY(F)Landroid/view/ViewPropertyAnimator;" />
+ <method name="rotationYBy(F)Landroid/view/ViewPropertyAnimator;" />
+ <method name="scaleX(F)Landroid/view/ViewPropertyAnimator;" />
+ <method name="scaleXBy(F)Landroid/view/ViewPropertyAnimator;" />
+ <method name="scaleY(F)Landroid/view/ViewPropertyAnimator;" />
+ <method name="scaleYBy(F)Landroid/view/ViewPropertyAnimator;" />
+ <method name="setDuration(J)Landroid/view/ViewPropertyAnimator;" />
+ <method name="setInterpolator(Landroid/animation/TimeInterpolator;)Landroid/view/ViewPropertyAnimator;" />
+ <method name="setListener(Landroid/animation/Animator$AnimatorListener;)Landroid/view/ViewPropertyAnimator;" />
+ <method name="setStartDelay(J)Landroid/view/ViewPropertyAnimator;" since="14" />
+ <method name="setUpdateListener(Landroid/animation/ValueAnimator$AnimatorUpdateListener;)Landroid/view/ViewPropertyAnimator;" since="19" />
+ <method name="start()V" since="14" />
+ <method name="translationX(F)Landroid/view/ViewPropertyAnimator;" />
+ <method name="translationXBy(F)Landroid/view/ViewPropertyAnimator;" />
+ <method name="translationY(F)Landroid/view/ViewPropertyAnimator;" />
+ <method name="translationYBy(F)Landroid/view/ViewPropertyAnimator;" />
+ <method name="translationZ(F)Landroid/view/ViewPropertyAnimator;" since="21" />
+ <method name="translationZBy(F)Landroid/view/ViewPropertyAnimator;" since="21" />
+ <method name="withEndAction(Ljava/lang/Runnable;)Landroid/view/ViewPropertyAnimator;" since="16" />
+ <method name="withLayer()Landroid/view/ViewPropertyAnimator;" since="16" />
+ <method name="withStartAction(Ljava/lang/Runnable;)Landroid/view/ViewPropertyAnimator;" since="16" />
+ <method name="x(F)Landroid/view/ViewPropertyAnimator;" />
+ <method name="xBy(F)Landroid/view/ViewPropertyAnimator;" />
+ <method name="y(F)Landroid/view/ViewPropertyAnimator;" />
+ <method name="yBy(F)Landroid/view/ViewPropertyAnimator;" />
+ <method name="z(F)Landroid/view/ViewPropertyAnimator;" since="21" />
+ <method name="zBy(F)Landroid/view/ViewPropertyAnimator;" since="21" />
+ </class>
+ <class name="android/view/ViewStub" since="1">
+ <extends name="android/view/View" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getInflatedId()I" />
+ <method name="getLayoutInflater()Landroid/view/LayoutInflater;" since="16" />
+ <method name="getLayoutResource()I" />
+ <method name="inflate()Landroid/view/View;" />
+ <method name="setInflatedId(I)V" />
+ <method name="setLayoutInflater(Landroid/view/LayoutInflater;)V" since="16" />
+ <method name="setLayoutResource(I)V" />
+ <method name="setOnInflateListener(Landroid/view/ViewStub$OnInflateListener;)V" />
+ </class>
+ <class name="android/view/ViewStub$OnInflateListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onInflate(Landroid/view/ViewStub;Landroid/view/View;)V" />
+ </class>
+ <class name="android/view/ViewTreeObserver" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addOnDrawListener(Landroid/view/ViewTreeObserver$OnDrawListener;)V" since="16" />
+ <method name="addOnGlobalFocusChangeListener(Landroid/view/ViewTreeObserver$OnGlobalFocusChangeListener;)V" />
+ <method name="addOnGlobalLayoutListener(Landroid/view/ViewTreeObserver$OnGlobalLayoutListener;)V" />
+ <method name="addOnPreDrawListener(Landroid/view/ViewTreeObserver$OnPreDrawListener;)V" />
+ <method name="addOnScrollChangedListener(Landroid/view/ViewTreeObserver$OnScrollChangedListener;)V" since="3" />
+ <method name="addOnTouchModeChangeListener(Landroid/view/ViewTreeObserver$OnTouchModeChangeListener;)V" />
+ <method name="addOnWindowAttachListener(Landroid/view/ViewTreeObserver$OnWindowAttachListener;)V" since="18" />
+ <method name="addOnWindowFocusChangeListener(Landroid/view/ViewTreeObserver$OnWindowFocusChangeListener;)V" since="18" />
+ <method name="dispatchOnDraw()V" since="16" />
+ <method name="dispatchOnGlobalLayout()V" />
+ <method name="dispatchOnPreDraw()Z" />
+ <method name="isAlive()Z" />
+ <method name="removeGlobalOnLayoutListener(Landroid/view/ViewTreeObserver$OnGlobalLayoutListener;)V" />
+ <method name="removeOnDrawListener(Landroid/view/ViewTreeObserver$OnDrawListener;)V" since="16" />
+ <method name="removeOnGlobalFocusChangeListener(Landroid/view/ViewTreeObserver$OnGlobalFocusChangeListener;)V" />
+ <method name="removeOnGlobalLayoutListener(Landroid/view/ViewTreeObserver$OnGlobalLayoutListener;)V" since="16" />
+ <method name="removeOnPreDrawListener(Landroid/view/ViewTreeObserver$OnPreDrawListener;)V" />
+ <method name="removeOnScrollChangedListener(Landroid/view/ViewTreeObserver$OnScrollChangedListener;)V" since="3" />
+ <method name="removeOnTouchModeChangeListener(Landroid/view/ViewTreeObserver$OnTouchModeChangeListener;)V" />
+ <method name="removeOnWindowAttachListener(Landroid/view/ViewTreeObserver$OnWindowAttachListener;)V" since="18" />
+ <method name="removeOnWindowFocusChangeListener(Landroid/view/ViewTreeObserver$OnWindowFocusChangeListener;)V" since="18" />
+ </class>
+ <class name="android/view/ViewTreeObserver$OnDrawListener" since="16">
+ <extends name="java/lang/Object" />
+ <method name="onDraw()V" />
+ </class>
+ <class name="android/view/ViewTreeObserver$OnGlobalFocusChangeListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onGlobalFocusChanged(Landroid/view/View;Landroid/view/View;)V" />
+ </class>
+ <class name="android/view/ViewTreeObserver$OnGlobalLayoutListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onGlobalLayout()V" />
+ </class>
+ <class name="android/view/ViewTreeObserver$OnPreDrawListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onPreDraw()Z" />
+ </class>
+ <class name="android/view/ViewTreeObserver$OnScrollChangedListener" since="3">
+ <extends name="java/lang/Object" />
+ <method name="onScrollChanged()V" />
+ </class>
+ <class name="android/view/ViewTreeObserver$OnTouchModeChangeListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onTouchModeChanged(Z)V" />
+ </class>
+ <class name="android/view/ViewTreeObserver$OnWindowAttachListener" since="18">
+ <extends name="java/lang/Object" />
+ <method name="onWindowAttached()V" />
+ <method name="onWindowDetached()V" />
+ </class>
+ <class name="android/view/ViewTreeObserver$OnWindowFocusChangeListener" since="18">
+ <extends name="java/lang/Object" />
+ <method name="onWindowFocusChanged(Z)V" />
+ </class>
+ <class name="android/view/Window" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="addContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V" />
+ <method name="addFlags(I)V" />
+ <method name="clearFlags(I)V" />
+ <method name="closeAllPanels()V" />
+ <method name="closePanel(I)V" />
+ <method name="findViewById(I)Landroid/view/View;" />
+ <method name="getAllowEnterTransitionOverlap()Z" since="21" />
+ <method name="getAllowReturnTransitionOverlap()Z" since="21" />
+ <method name="getAttributes()Landroid/view/WindowManager$LayoutParams;" />
+ <method name="getCallback()Landroid/view/Window$Callback;" />
+ <method name="getContainer()Landroid/view/Window;" />
+ <method name="getContentScene()Landroid/transition/Scene;" since="21" />
+ <method name="getContext()Landroid/content/Context;" />
+ <method name="getCurrentFocus()Landroid/view/View;" />
+ <method name="getDecorView()Landroid/view/View;" />
+ <method name="getEnterTransition()Landroid/transition/Transition;" since="21" />
+ <method name="getExitTransition()Landroid/transition/Transition;" since="21" />
+ <method name="getFeatures()I" />
+ <method name="getForcedWindowFlags()I" />
+ <method name="getLayoutInflater()Landroid/view/LayoutInflater;" />
+ <method name="getLocalFeatures()I" />
+ <method name="getMediaController()Landroid/media/session/MediaController;" since="21" />
+ <method name="getNavigationBarColor()I" since="21" />
+ <method name="getReenterTransition()Landroid/transition/Transition;" since="21" />
+ <method name="getReturnTransition()Landroid/transition/Transition;" since="21" />
+ <method name="getSharedElementEnterTransition()Landroid/transition/Transition;" since="21" />
+ <method name="getSharedElementExitTransition()Landroid/transition/Transition;" since="21" />
+ <method name="getSharedElementReenterTransition()Landroid/transition/Transition;" since="21" />
+ <method name="getSharedElementReturnTransition()Landroid/transition/Transition;" since="21" />
+ <method name="getSharedElementsUseOverlay()Z" since="21" />
+ <method name="getStatusBarColor()I" since="21" />
+ <method name="getTransitionBackgroundFadeDuration()J" since="21" />
+ <method name="getTransitionManager()Landroid/transition/TransitionManager;" since="21" />
+ <method name="getVolumeControlStream()I" />
+ <method name="getWindowManager()Landroid/view/WindowManager;" />
+ <method name="getWindowStyle()Landroid/content/res/TypedArray;" />
+ <method name="hasChildren()Z" />
+ <method name="hasFeature(I)Z" since="11" />
+ <method name="hasSoftInputMode()Z" since="3" />
+ <method name="injectInputEvent(Landroid/view/InputEvent;)V" since="19" />
+ <method name="invalidatePanelMenu(I)V" since="11" />
+ <method name="isActive()Z" />
+ <method name="isFloating()Z" />
+ <method name="isShortcutKey(ILandroid/view/KeyEvent;)Z" />
+ <method name="makeActive()V" />
+ <method name="onActive()V" />
+ <method name="onConfigurationChanged(Landroid/content/res/Configuration;)V" />
+ <method name="openPanel(ILandroid/view/KeyEvent;)V" />
+ <method name="peekDecorView()Landroid/view/View;" />
+ <method name="performContextMenuIdentifierAction(II)Z" />
+ <method name="performPanelIdentifierAction(III)Z" />
+ <method name="performPanelShortcut(IILandroid/view/KeyEvent;I)Z" />
+ <method name="requestFeature(I)Z" />
+ <method name="restoreHierarchyState(Landroid/os/Bundle;)V" />
+ <method name="saveHierarchyState()Landroid/os/Bundle;" />
+ <method name="setAllowEnterTransitionOverlap(Z)V" since="21" />
+ <method name="setAllowReturnTransitionOverlap(Z)V" since="21" />
+ <method name="setAttributes(Landroid/view/WindowManager$LayoutParams;)V" />
+ <method name="setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setBackgroundDrawableResource(I)V" />
+ <method name="setCallback(Landroid/view/Window$Callback;)V" />
+ <method name="setChildDrawable(ILandroid/graphics/drawable/Drawable;)V" />
+ <method name="setChildInt(II)V" />
+ <method name="setContainer(Landroid/view/Window;)V" />
+ <method name="setContentView(I)V" />
+ <method name="setContentView(Landroid/view/View;)V" />
+ <method name="setContentView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V" />
+ <method name="setDefaultWindowFormat(I)V" />
+ <method name="setDimAmount(F)V" since="14" />
+ <method name="setEnterTransition(Landroid/transition/Transition;)V" since="21" />
+ <method name="setExitTransition(Landroid/transition/Transition;)V" since="21" />
+ <method name="setFeatureDrawable(ILandroid/graphics/drawable/Drawable;)V" />
+ <method name="setFeatureDrawableAlpha(II)V" />
+ <method name="setFeatureDrawableResource(II)V" />
+ <method name="setFeatureDrawableUri(ILandroid/net/Uri;)V" />
+ <method name="setFeatureInt(II)V" />
+ <method name="setFlags(II)V" />
+ <method name="setFormat(I)V" />
+ <method name="setGravity(I)V" />
+ <method name="setIcon(I)V" since="19" />
+ <method name="setLayout(II)V" />
+ <method name="setLocalFocus(ZZ)V" since="19" />
+ <method name="setLogo(I)V" since="19" />
+ <method name="setMediaController(Landroid/media/session/MediaController;)V" since="21" />
+ <method name="setNavigationBarColor(I)V" since="21" />
+ <method name="setReenterTransition(Landroid/transition/Transition;)V" since="21" />
+ <method name="setReturnTransition(Landroid/transition/Transition;)V" since="21" />
+ <method name="setSharedElementEnterTransition(Landroid/transition/Transition;)V" since="21" />
+ <method name="setSharedElementExitTransition(Landroid/transition/Transition;)V" since="21" />
+ <method name="setSharedElementReenterTransition(Landroid/transition/Transition;)V" since="21" />
+ <method name="setSharedElementReturnTransition(Landroid/transition/Transition;)V" since="21" />
+ <method name="setSharedElementsUseOverlay(Z)V" since="21" />
+ <method name="setSoftInputMode(I)V" since="3" />
+ <method name="setStatusBarColor(I)V" since="21" />
+ <method name="setTitle(Ljava/lang/CharSequence;)V" />
+ <method name="setTitleColor(I)V" />
+ <method name="setTransitionBackgroundFadeDuration(J)V" since="21" />
+ <method name="setTransitionManager(Landroid/transition/TransitionManager;)V" since="21" />
+ <method name="setType(I)V" />
+ <method name="setUiOptions(I)V" since="14" />
+ <method name="setUiOptions(II)V" since="14" />
+ <method name="setVolumeControlStream(I)V" />
+ <method name="setWindowAnimations(I)V" since="3" />
+ <method name="setWindowManager(Landroid/view/WindowManager;Landroid/os/IBinder;Ljava/lang/String;)V" />
+ <method name="setWindowManager(Landroid/view/WindowManager;Landroid/os/IBinder;Ljava/lang/String;Z)V" since="11" />
+ <method name="superDispatchGenericMotionEvent(Landroid/view/MotionEvent;)Z" since="12" />
+ <method name="superDispatchKeyEvent(Landroid/view/KeyEvent;)Z" />
+ <method name="superDispatchKeyShortcutEvent(Landroid/view/KeyEvent;)Z" since="11" />
+ <method name="superDispatchTouchEvent(Landroid/view/MotionEvent;)Z" />
+ <method name="superDispatchTrackballEvent(Landroid/view/MotionEvent;)Z" />
+ <method name="takeInputQueue(Landroid/view/InputQueue$Callback;)V" since="9" />
+ <method name="takeKeyEvents(Z)V" />
+ <method name="takeSurface(Landroid/view/SurfaceHolder$Callback2;)V" since="9" />
+ <method name="togglePanel(ILandroid/view/KeyEvent;)V" />
+ <field name="DEFAULT_FEATURES" />
+ <field name="FEATURE_ACTION_BAR" since="11" />
+ <field name="FEATURE_ACTION_BAR_OVERLAY" since="11" />
+ <field name="FEATURE_ACTION_MODE_OVERLAY" since="11" />
+ <field name="FEATURE_ACTIVITY_TRANSITIONS" since="21" />
+ <field name="FEATURE_CONTENT_TRANSITIONS" since="21" />
+ <field name="FEATURE_CONTEXT_MENU" />
+ <field name="FEATURE_CUSTOM_TITLE" />
+ <field name="FEATURE_INDETERMINATE_PROGRESS" />
+ <field name="FEATURE_LEFT_ICON" />
+ <field name="FEATURE_NO_TITLE" />
+ <field name="FEATURE_OPTIONS_PANEL" />
+ <field name="FEATURE_PROGRESS" />
+ <field name="FEATURE_RIGHT_ICON" />
+ <field name="FEATURE_SWIPE_TO_DISMISS" since="20" />
+ <field name="ID_ANDROID_CONTENT" />
+ <field name="NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME" since="21" />
+ <field name="PROGRESS_END" />
+ <field name="PROGRESS_INDETERMINATE_OFF" />
+ <field name="PROGRESS_INDETERMINATE_ON" />
+ <field name="PROGRESS_SECONDARY_END" />
+ <field name="PROGRESS_SECONDARY_START" />
+ <field name="PROGRESS_START" />
+ <field name="PROGRESS_VISIBILITY_OFF" />
+ <field name="PROGRESS_VISIBILITY_ON" />
+ <field name="STATUS_BAR_BACKGROUND_TRANSITION_NAME" since="21" />
+ </class>
+ <class name="android/view/Window$Callback" since="1">
+ <extends name="java/lang/Object" />
+ <method name="dispatchGenericMotionEvent(Landroid/view/MotionEvent;)Z" since="12" />
+ <method name="dispatchKeyEvent(Landroid/view/KeyEvent;)Z" />
+ <method name="dispatchKeyShortcutEvent(Landroid/view/KeyEvent;)Z" since="11" />
+ <method name="dispatchPopulateAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)Z" since="4" />
+ <method name="dispatchTouchEvent(Landroid/view/MotionEvent;)Z" />
+ <method name="dispatchTrackballEvent(Landroid/view/MotionEvent;)Z" />
+ <method name="onActionModeFinished(Landroid/view/ActionMode;)V" since="11" />
+ <method name="onActionModeStarted(Landroid/view/ActionMode;)V" since="11" />
+ <method name="onAttachedToWindow()V" since="5" />
+ <method name="onContentChanged()V" />
+ <method name="onCreatePanelMenu(ILandroid/view/Menu;)Z" />
+ <method name="onCreatePanelView(I)Landroid/view/View;" />
+ <method name="onDetachedFromWindow()V" since="5" />
+ <method name="onMenuItemSelected(ILandroid/view/MenuItem;)Z" />
+ <method name="onMenuOpened(ILandroid/view/Menu;)Z" />
+ <method name="onPanelClosed(ILandroid/view/Menu;)V" />
+ <method name="onPreparePanel(ILandroid/view/View;Landroid/view/Menu;)Z" />
+ <method name="onSearchRequested()Z" />
+ <method name="onWindowAttributesChanged(Landroid/view/WindowManager$LayoutParams;)V" />
+ <method name="onWindowFocusChanged(Z)V" />
+ <method name="onWindowStartingActionMode(Landroid/view/ActionMode$Callback;)Landroid/view/ActionMode;" since="11" />
+ </class>
+ <class name="android/view/WindowAnimationFrameStats" since="21">
+ <extends name="android/view/FrameStats" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/view/WindowContentFrameStats" since="21">
+ <extends name="android/view/FrameStats" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getFramePostedTimeNano(I)J" />
+ <method name="getFrameReadyTimeNano(I)J" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/view/WindowId" since="18">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="isFocused()Z" />
+ <method name="registerFocusObserver(Landroid/view/WindowId$FocusObserver;)V" />
+ <method name="unregisterFocusObserver(Landroid/view/WindowId$FocusObserver;)V" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/view/WindowId$FocusObserver" since="18">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onFocusGained(Landroid/view/WindowId;)V" />
+ <method name="onFocusLost(Landroid/view/WindowId;)V" />
+ </class>
+ <class name="android/view/WindowInsets" since="20">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/view/WindowInsets;)V" />
+ <method name="consumeStableInsets()Landroid/view/WindowInsets;" since="21" />
+ <method name="consumeSystemWindowInsets()Landroid/view/WindowInsets;" />
+ <method name="getStableInsetBottom()I" since="21" />
+ <method name="getStableInsetLeft()I" since="21" />
+ <method name="getStableInsetRight()I" since="21" />
+ <method name="getStableInsetTop()I" since="21" />
+ <method name="getSystemWindowInsetBottom()I" />
+ <method name="getSystemWindowInsetLeft()I" />
+ <method name="getSystemWindowInsetRight()I" />
+ <method name="getSystemWindowInsetTop()I" />
+ <method name="hasInsets()Z" />
+ <method name="hasStableInsets()Z" since="21" />
+ <method name="hasSystemWindowInsets()Z" />
+ <method name="isConsumed()Z" since="21" />
+ <method name="isRound()Z" />
+ <method name="replaceSystemWindowInsets(IIII)Landroid/view/WindowInsets;" />
+ <method name="replaceSystemWindowInsets(Landroid/graphics/Rect;)Landroid/view/WindowInsets;" since="21" />
+ </class>
+ <class name="android/view/WindowManager" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/ViewManager" />
+ <method name="getDefaultDisplay()Landroid/view/Display;" />
+ <method name="removeViewImmediate(Landroid/view/View;)V" />
+ </class>
+ <class name="android/view/WindowManager$BadTokenException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/view/WindowManager$InvalidDisplayException" since="17">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/view/WindowManager$LayoutParams" since="1">
+ <extends name="android/view/ViewGroup$LayoutParams" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(II)V" />
+ <method name="&lt;init>(III)V" />
+ <method name="&lt;init>(IIIII)V" />
+ <method name="&lt;init>(IIIIIII)V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="copyFrom(Landroid/view/WindowManager$LayoutParams;)I" />
+ <method name="debug(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getTitle()Ljava/lang/CharSequence;" />
+ <method name="mayUseInputMethod(I)Z" since="3" />
+ <method name="setTitle(Ljava/lang/CharSequence;)V" />
+ <field name="ALPHA_CHANGED" />
+ <field name="ANIMATION_CHANGED" />
+ <field name="BRIGHTNESS_OVERRIDE_FULL" since="8" />
+ <field name="BRIGHTNESS_OVERRIDE_NONE" since="8" />
+ <field name="BRIGHTNESS_OVERRIDE_OFF" since="8" />
+ <field name="CREATOR" />
+ <field name="DIM_AMOUNT_CHANGED" />
+ <field name="FIRST_APPLICATION_WINDOW" />
+ <field name="FIRST_SUB_WINDOW" />
+ <field name="FIRST_SYSTEM_WINDOW" />
+ <field name="FLAGS_CHANGED" />
+ <field name="FLAG_ALLOW_LOCK_WHILE_SCREEN_ON" since="8" />
+ <field name="FLAG_ALT_FOCUSABLE_IM" since="3" />
+ <field name="FLAG_BLUR_BEHIND" />
+ <field name="FLAG_DIM_BEHIND" />
+ <field name="FLAG_DISMISS_KEYGUARD" since="5" />
+ <field name="FLAG_DITHER" />
+ <field name="FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS" since="21" />
+ <field name="FLAG_FORCE_NOT_FULLSCREEN" />
+ <field name="FLAG_FULLSCREEN" />
+ <field name="FLAG_HARDWARE_ACCELERATED" since="11" />
+ <field name="FLAG_IGNORE_CHEEK_PRESSES" />
+ <field name="FLAG_KEEP_SCREEN_ON" />
+ <field name="FLAG_LAYOUT_INSET_DECOR" />
+ <field name="FLAG_LAYOUT_IN_OVERSCAN" since="18" />
+ <field name="FLAG_LAYOUT_IN_SCREEN" />
+ <field name="FLAG_LAYOUT_NO_LIMITS" />
+ <field name="FLAG_LOCAL_FOCUS_MODE" since="19" />
+ <field name="FLAG_NOT_FOCUSABLE" />
+ <field name="FLAG_NOT_TOUCHABLE" />
+ <field name="FLAG_NOT_TOUCH_MODAL" />
+ <field name="FLAG_SCALED" />
+ <field name="FLAG_SECURE" />
+ <field name="FLAG_SHOW_WALLPAPER" since="5" />
+ <field name="FLAG_SHOW_WHEN_LOCKED" since="5" />
+ <field name="FLAG_SPLIT_TOUCH" since="11" />
+ <field name="FLAG_TOUCHABLE_WHEN_WAKING" />
+ <field name="FLAG_TRANSLUCENT_NAVIGATION" since="19" />
+ <field name="FLAG_TRANSLUCENT_STATUS" since="19" />
+ <field name="FLAG_TURN_SCREEN_ON" since="5" />
+ <field name="FLAG_WATCH_OUTSIDE_TOUCH" since="3" />
+ <field name="FORMAT_CHANGED" />
+ <field name="LAST_APPLICATION_WINDOW" />
+ <field name="LAST_SUB_WINDOW" />
+ <field name="LAST_SYSTEM_WINDOW" />
+ <field name="LAYOUT_CHANGED" />
+ <field name="MEMORY_TYPE_CHANGED" />
+ <field name="MEMORY_TYPE_GPU" />
+ <field name="MEMORY_TYPE_HARDWARE" />
+ <field name="MEMORY_TYPE_NORMAL" />
+ <field name="MEMORY_TYPE_PUSH_BUFFERS" />
+ <field name="ROTATION_ANIMATION_CHANGED" since="18" />
+ <field name="ROTATION_ANIMATION_CROSSFADE" since="18" />
+ <field name="ROTATION_ANIMATION_JUMPCUT" since="18" />
+ <field name="ROTATION_ANIMATION_ROTATE" since="18" />
+ <field name="SCREEN_BRIGHTNESS_CHANGED" since="3" />
+ <field name="SCREEN_ORIENTATION_CHANGED" since="3" />
+ <field name="SOFT_INPUT_ADJUST_NOTHING" since="11" />
+ <field name="SOFT_INPUT_ADJUST_PAN" since="3" />
+ <field name="SOFT_INPUT_ADJUST_RESIZE" since="3" />
+ <field name="SOFT_INPUT_ADJUST_UNSPECIFIED" since="3" />
+ <field name="SOFT_INPUT_IS_FORWARD_NAVIGATION" since="3" />
+ <field name="SOFT_INPUT_MASK_ADJUST" since="3" />
+ <field name="SOFT_INPUT_MASK_STATE" since="3" />
+ <field name="SOFT_INPUT_MODE_CHANGED" since="3" />
+ <field name="SOFT_INPUT_STATE_ALWAYS_HIDDEN" since="3" />
+ <field name="SOFT_INPUT_STATE_ALWAYS_VISIBLE" since="3" />
+ <field name="SOFT_INPUT_STATE_HIDDEN" since="3" />
+ <field name="SOFT_INPUT_STATE_UNCHANGED" since="3" />
+ <field name="SOFT_INPUT_STATE_UNSPECIFIED" since="3" />
+ <field name="SOFT_INPUT_STATE_VISIBLE" since="3" />
+ <field name="TITLE_CHANGED" />
+ <field name="TYPE_APPLICATION" />
+ <field name="TYPE_APPLICATION_ATTACHED_DIALOG" since="3" />
+ <field name="TYPE_APPLICATION_MEDIA" />
+ <field name="TYPE_APPLICATION_PANEL" />
+ <field name="TYPE_APPLICATION_STARTING" />
+ <field name="TYPE_APPLICATION_SUB_PANEL" />
+ <field name="TYPE_BASE_APPLICATION" />
+ <field name="TYPE_CHANGED" />
+ <field name="TYPE_INPUT_METHOD" since="3" />
+ <field name="TYPE_INPUT_METHOD_DIALOG" since="3" />
+ <field name="TYPE_KEYGUARD" />
+ <field name="TYPE_KEYGUARD_DIALOG" />
+ <field name="TYPE_PHONE" />
+ <field name="TYPE_PRIORITY_PHONE" />
+ <field name="TYPE_PRIVATE_PRESENTATION" since="19" />
+ <field name="TYPE_SEARCH_BAR" />
+ <field name="TYPE_STATUS_BAR" />
+ <field name="TYPE_STATUS_BAR_PANEL" />
+ <field name="TYPE_SYSTEM_ALERT" />
+ <field name="TYPE_SYSTEM_DIALOG" />
+ <field name="TYPE_SYSTEM_ERROR" />
+ <field name="TYPE_SYSTEM_OVERLAY" />
+ <field name="TYPE_TOAST" />
+ <field name="TYPE_WALLPAPER" since="5" />
+ <field name="alpha" />
+ <field name="buttonBrightness" since="8" />
+ <field name="dimAmount" />
+ <field name="flags" />
+ <field name="format" />
+ <field name="gravity" />
+ <field name="horizontalMargin" />
+ <field name="horizontalWeight" />
+ <field name="memoryType" />
+ <field name="packageName" />
+ <field name="preferredRefreshRate" since="21" />
+ <field name="rotationAnimation" since="18" />
+ <field name="screenBrightness" since="3" />
+ <field name="screenOrientation" since="3" />
+ <field name="softInputMode" since="3" />
+ <field name="systemUiVisibility" since="11" />
+ <field name="token" />
+ <field name="type" />
+ <field name="verticalMargin" />
+ <field name="verticalWeight" />
+ <field name="windowAnimations" />
+ <field name="x" />
+ <field name="y" />
+ </class>
+ <class name="android/view/accessibility/AccessibilityEvent" since="4">
+ <extends name="android/view/accessibility/AccessibilityRecord" since="14" />
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="appendRecord(Landroid/view/accessibility/AccessibilityRecord;)V" since="14" />
+ <method name="eventTypeToString(I)Ljava/lang/String;" since="14" />
+ <method name="getAction()I" since="16" />
+ <method name="getAddedCount()I" />
+ <method name="getBeforeText()Ljava/lang/CharSequence;" />
+ <method name="getClassName()Ljava/lang/CharSequence;" />
+ <method name="getContentChangeTypes()I" since="19" />
+ <method name="getContentDescription()Ljava/lang/CharSequence;" />
+ <method name="getCurrentItemIndex()I" />
+ <method name="getEventTime()J" />
+ <method name="getEventType()I" />
+ <method name="getFromIndex()I" />
+ <method name="getItemCount()I" />
+ <method name="getMovementGranularity()I" since="16" />
+ <method name="getPackageName()Ljava/lang/CharSequence;" />
+ <method name="getParcelableData()Landroid/os/Parcelable;" />
+ <method name="getRecord(I)Landroid/view/accessibility/AccessibilityRecord;" since="14" />
+ <method name="getRecordCount()I" since="14" />
+ <method name="getRemovedCount()I" />
+ <method name="getText()Ljava/util/List;" />
+ <method name="initFromParcel(Landroid/os/Parcel;)V" />
+ <method name="isChecked()Z" />
+ <method name="isEnabled()Z" />
+ <method name="isFullScreen()Z" />
+ <method name="isPassword()Z" />
+ <method name="obtain()Landroid/view/accessibility/AccessibilityEvent;" />
+ <method name="obtain(I)Landroid/view/accessibility/AccessibilityEvent;" />
+ <method name="obtain(Landroid/view/accessibility/AccessibilityEvent;)Landroid/view/accessibility/AccessibilityEvent;" since="14" />
+ <method name="recycle()V" />
+ <method name="setAction(I)V" since="16" />
+ <method name="setAddedCount(I)V" />
+ <method name="setBeforeText(Ljava/lang/CharSequence;)V" />
+ <method name="setChecked(Z)V" />
+ <method name="setClassName(Ljava/lang/CharSequence;)V" />
+ <method name="setContentChangeTypes(I)V" since="19" />
+ <method name="setContentDescription(Ljava/lang/CharSequence;)V" />
+ <method name="setCurrentItemIndex(I)V" />
+ <method name="setEnabled(Z)V" />
+ <method name="setEventTime(J)V" />
+ <method name="setEventType(I)V" />
+ <method name="setFromIndex(I)V" />
+ <method name="setFullScreen(Z)V" />
+ <method name="setItemCount(I)V" />
+ <method name="setMovementGranularity(I)V" since="16" />
+ <method name="setPackageName(Ljava/lang/CharSequence;)V" />
+ <method name="setParcelableData(Landroid/os/Parcelable;)V" />
+ <method name="setPassword(Z)V" />
+ <method name="setRemovedCount(I)V" />
+ <field name="CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION" since="19" />
+ <field name="CONTENT_CHANGE_TYPE_SUBTREE" since="19" />
+ <field name="CONTENT_CHANGE_TYPE_TEXT" since="19" />
+ <field name="CONTENT_CHANGE_TYPE_UNDEFINED" since="19" />
+ <field name="CREATOR" />
+ <field name="INVALID_POSITION" />
+ <field name="MAX_TEXT_LENGTH" />
+ <field name="TYPES_ALL_MASK" />
+ <field name="TYPE_ANNOUNCEMENT" since="16" />
+ <field name="TYPE_GESTURE_DETECTION_END" since="17" />
+ <field name="TYPE_GESTURE_DETECTION_START" since="17" />
+ <field name="TYPE_NOTIFICATION_STATE_CHANGED" />
+ <field name="TYPE_TOUCH_EXPLORATION_GESTURE_END" since="14" />
+ <field name="TYPE_TOUCH_EXPLORATION_GESTURE_START" since="14" />
+ <field name="TYPE_TOUCH_INTERACTION_END" since="17" />
+ <field name="TYPE_TOUCH_INTERACTION_START" since="17" />
+ <field name="TYPE_VIEW_ACCESSIBILITY_FOCUSED" since="16" />
+ <field name="TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED" since="16" />
+ <field name="TYPE_VIEW_CLICKED" />
+ <field name="TYPE_VIEW_FOCUSED" />
+ <field name="TYPE_VIEW_HOVER_ENTER" since="14" />
+ <field name="TYPE_VIEW_HOVER_EXIT" since="14" />
+ <field name="TYPE_VIEW_LONG_CLICKED" />
+ <field name="TYPE_VIEW_SCROLLED" since="14" />
+ <field name="TYPE_VIEW_SELECTED" />
+ <field name="TYPE_VIEW_TEXT_CHANGED" />
+ <field name="TYPE_VIEW_TEXT_SELECTION_CHANGED" since="14" />
+ <field name="TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY" since="16" />
+ <field name="TYPE_WINDOWS_CHANGED" since="21" />
+ <field name="TYPE_WINDOW_CONTENT_CHANGED" since="14" />
+ <field name="TYPE_WINDOW_STATE_CHANGED" />
+ </class>
+ <class name="android/view/accessibility/AccessibilityEventSource" since="4">
+ <extends name="java/lang/Object" />
+ <method name="sendAccessibilityEvent(I)V" />
+ <method name="sendAccessibilityEventUnchecked(Landroid/view/accessibility/AccessibilityEvent;)V" />
+ </class>
+ <class name="android/view/accessibility/AccessibilityManager" since="4">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addAccessibilityStateChangeListener(Landroid/view/accessibility/AccessibilityManager$AccessibilityStateChangeListener;)Z" since="14" />
+ <method name="addTouchExplorationStateChangeListener(Landroid/view/accessibility/AccessibilityManager$TouchExplorationStateChangeListener;)Z" since="19" />
+ <method name="getAccessibilityServiceList()Ljava/util/List;" />
+ <method name="getEnabledAccessibilityServiceList(I)Ljava/util/List;" since="14" />
+ <method name="getInstalledAccessibilityServiceList()Ljava/util/List;" since="14" />
+ <method name="interrupt()V" />
+ <method name="isEnabled()Z" />
+ <method name="isTouchExplorationEnabled()Z" since="14" />
+ <method name="removeAccessibilityStateChangeListener(Landroid/view/accessibility/AccessibilityManager$AccessibilityStateChangeListener;)Z" since="14" />
+ <method name="removeTouchExplorationStateChangeListener(Landroid/view/accessibility/AccessibilityManager$TouchExplorationStateChangeListener;)Z" since="19" />
+ <method name="sendAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V" />
+ </class>
+ <class name="android/view/accessibility/AccessibilityManager$AccessibilityStateChangeListener" since="14">
+ <extends name="java/lang/Object" />
+ <method name="onAccessibilityStateChanged(Z)V" />
+ </class>
+ <class name="android/view/accessibility/AccessibilityManager$TouchExplorationStateChangeListener" since="19">
+ <extends name="java/lang/Object" />
+ <method name="onTouchExplorationStateChanged(Z)V" />
+ </class>
+ <class name="android/view/accessibility/AccessibilityNodeInfo" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="addAction(I)V" />
+ <method name="addAction(Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction;)V" since="21" />
+ <method name="addChild(Landroid/view/View;)V" />
+ <method name="addChild(Landroid/view/View;I)V" since="16" />
+ <method name="canOpenPopup()Z" since="19" />
+ <method name="findAccessibilityNodeInfosByText(Ljava/lang/String;)Ljava/util/List;" />
+ <method name="findAccessibilityNodeInfosByViewId(Ljava/lang/String;)Ljava/util/List;" since="18" />
+ <method name="findFocus(I)Landroid/view/accessibility/AccessibilityNodeInfo;" since="16" />
+ <method name="focusSearch(I)Landroid/view/accessibility/AccessibilityNodeInfo;" since="16" />
+ <method name="getActionList()Ljava/util/List;" since="21" />
+ <method name="getActions()I" />
+ <method name="getBoundsInParent(Landroid/graphics/Rect;)V" />
+ <method name="getBoundsInScreen(Landroid/graphics/Rect;)V" />
+ <method name="getChild(I)Landroid/view/accessibility/AccessibilityNodeInfo;" />
+ <method name="getChildCount()I" />
+ <method name="getClassName()Ljava/lang/CharSequence;" />
+ <method name="getCollectionInfo()Landroid/view/accessibility/AccessibilityNodeInfo$CollectionInfo;" since="19" />
+ <method name="getCollectionItemInfo()Landroid/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo;" since="19" />
+ <method name="getContentDescription()Ljava/lang/CharSequence;" />
+ <method name="getError()Ljava/lang/CharSequence;" since="21" />
+ <method name="getExtras()Landroid/os/Bundle;" since="19" />
+ <method name="getInputType()I" since="19" />
+ <method name="getLabelFor()Landroid/view/accessibility/AccessibilityNodeInfo;" since="17" />
+ <method name="getLabeledBy()Landroid/view/accessibility/AccessibilityNodeInfo;" since="17" />
+ <method name="getLiveRegion()I" since="19" />
+ <method name="getMaxTextLength()I" since="21" />
+ <method name="getMovementGranularities()I" since="16" />
+ <method name="getPackageName()Ljava/lang/CharSequence;" />
+ <method name="getParent()Landroid/view/accessibility/AccessibilityNodeInfo;" />
+ <method name="getRangeInfo()Landroid/view/accessibility/AccessibilityNodeInfo$RangeInfo;" since="19" />
+ <method name="getText()Ljava/lang/CharSequence;" />
+ <method name="getTextSelectionEnd()I" since="18" />
+ <method name="getTextSelectionStart()I" since="18" />
+ <method name="getViewIdResourceName()Ljava/lang/String;" since="18" />
+ <method name="getWindow()Landroid/view/accessibility/AccessibilityWindowInfo;" since="21" />
+ <method name="getWindowId()I" />
+ <method name="isAccessibilityFocused()Z" since="16" />
+ <method name="isCheckable()Z" />
+ <method name="isChecked()Z" />
+ <method name="isClickable()Z" />
+ <method name="isContentInvalid()Z" since="19" />
+ <method name="isDismissable()Z" since="19" />
+ <method name="isEditable()Z" since="18" />
+ <method name="isEnabled()Z" />
+ <method name="isFocusable()Z" />
+ <method name="isFocused()Z" />
+ <method name="isLongClickable()Z" />
+ <method name="isMultiLine()Z" since="19" />
+ <method name="isPassword()Z" />
+ <method name="isScrollable()Z" />
+ <method name="isSelected()Z" />
+ <method name="isVisibleToUser()Z" since="16" />
+ <method name="obtain()Landroid/view/accessibility/AccessibilityNodeInfo;" />
+ <method name="obtain(Landroid/view/View;)Landroid/view/accessibility/AccessibilityNodeInfo;" />
+ <method name="obtain(Landroid/view/View;I)Landroid/view/accessibility/AccessibilityNodeInfo;" since="16" />
+ <method name="obtain(Landroid/view/accessibility/AccessibilityNodeInfo;)Landroid/view/accessibility/AccessibilityNodeInfo;" />
+ <method name="performAction(I)Z" />
+ <method name="performAction(ILandroid/os/Bundle;)Z" since="16" />
+ <method name="recycle()V" />
+ <method name="refresh()Z" since="18" />
+ <method name="removeAction(I)V" since="21" />
+ <method name="removeAction(Landroid/view/accessibility/AccessibilityNodeInfo$AccessibilityAction;)Z" since="21" />
+ <method name="removeChild(Landroid/view/View;)Z" since="21" />
+ <method name="removeChild(Landroid/view/View;I)Z" since="21" />
+ <method name="setAccessibilityFocused(Z)V" since="16" />
+ <method name="setBoundsInParent(Landroid/graphics/Rect;)V" />
+ <method name="setBoundsInScreen(Landroid/graphics/Rect;)V" />
+ <method name="setCanOpenPopup(Z)V" since="19" />
+ <method name="setCheckable(Z)V" />
+ <method name="setChecked(Z)V" />
+ <method name="setClassName(Ljava/lang/CharSequence;)V" />
+ <method name="setClickable(Z)V" />
+ <method name="setCollectionInfo(Landroid/view/accessibility/AccessibilityNodeInfo$CollectionInfo;)V" since="19" />
+ <method name="setCollectionItemInfo(Landroid/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo;)V" since="19" />
+ <method name="setContentDescription(Ljava/lang/CharSequence;)V" />
+ <method name="setContentInvalid(Z)V" since="19" />
+ <method name="setDismissable(Z)V" since="19" />
+ <method name="setEditable(Z)V" since="18" />
+ <method name="setEnabled(Z)V" />
+ <method name="setError(Ljava/lang/CharSequence;)V" since="21" />
+ <method name="setFocusable(Z)V" />
+ <method name="setFocused(Z)V" />
+ <method name="setInputType(I)V" since="19" />
+ <method name="setLabelFor(Landroid/view/View;)V" since="17" />
+ <method name="setLabelFor(Landroid/view/View;I)V" since="17" />
+ <method name="setLabeledBy(Landroid/view/View;)V" since="17" />
+ <method name="setLabeledBy(Landroid/view/View;I)V" since="17" />
+ <method name="setLiveRegion(I)V" since="19" />
+ <method name="setLongClickable(Z)V" />
+ <method name="setMaxTextLength(I)V" since="21" />
+ <method name="setMovementGranularities(I)V" since="16" />
+ <method name="setMultiLine(Z)V" since="19" />
+ <method name="setPackageName(Ljava/lang/CharSequence;)V" />
+ <method name="setParent(Landroid/view/View;)V" />
+ <method name="setParent(Landroid/view/View;I)V" since="16" />
+ <method name="setPassword(Z)V" />
+ <method name="setRangeInfo(Landroid/view/accessibility/AccessibilityNodeInfo$RangeInfo;)V" since="19" />
+ <method name="setScrollable(Z)V" />
+ <method name="setSelected(Z)V" />
+ <method name="setSource(Landroid/view/View;)V" />
+ <method name="setSource(Landroid/view/View;I)V" since="16" />
+ <method name="setText(Ljava/lang/CharSequence;)V" />
+ <method name="setTextSelection(II)V" since="18" />
+ <method name="setViewIdResourceName(Ljava/lang/String;)V" since="18" />
+ <method name="setVisibleToUser(Z)V" since="16" />
+ <field name="ACTION_ACCESSIBILITY_FOCUS" since="16" />
+ <field name="ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN" since="18" />
+ <field name="ACTION_ARGUMENT_HTML_ELEMENT_STRING" since="16" />
+ <field name="ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT" since="16" />
+ <field name="ACTION_ARGUMENT_SELECTION_END_INT" since="18" />
+ <field name="ACTION_ARGUMENT_SELECTION_START_INT" since="18" />
+ <field name="ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE" since="21" />
+ <field name="ACTION_CLEAR_ACCESSIBILITY_FOCUS" since="16" />
+ <field name="ACTION_CLEAR_FOCUS" />
+ <field name="ACTION_CLEAR_SELECTION" />
+ <field name="ACTION_CLICK" since="16" />
+ <field name="ACTION_COLLAPSE" since="19" />
+ <field name="ACTION_COPY" since="18" />
+ <field name="ACTION_CUT" since="18" />
+ <field name="ACTION_DISMISS" since="19" />
+ <field name="ACTION_EXPAND" since="19" />
+ <field name="ACTION_FOCUS" />
+ <field name="ACTION_LONG_CLICK" since="16" />
+ <field name="ACTION_NEXT_AT_MOVEMENT_GRANULARITY" since="16" />
+ <field name="ACTION_NEXT_HTML_ELEMENT" since="16" />
+ <field name="ACTION_PASTE" since="18" />
+ <field name="ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY" since="16" />
+ <field name="ACTION_PREVIOUS_HTML_ELEMENT" since="16" />
+ <field name="ACTION_SCROLL_BACKWARD" since="16" />
+ <field name="ACTION_SCROLL_FORWARD" since="16" />
+ <field name="ACTION_SELECT" />
+ <field name="ACTION_SET_SELECTION" since="18" />
+ <field name="ACTION_SET_TEXT" since="21" />
+ <field name="CREATOR" />
+ <field name="FOCUS_ACCESSIBILITY" since="16" />
+ <field name="FOCUS_INPUT" since="16" />
+ <field name="MOVEMENT_GRANULARITY_CHARACTER" since="16" />
+ <field name="MOVEMENT_GRANULARITY_LINE" since="16" />
+ <field name="MOVEMENT_GRANULARITY_PAGE" since="16" />
+ <field name="MOVEMENT_GRANULARITY_PARAGRAPH" since="16" />
+ <field name="MOVEMENT_GRANULARITY_WORD" since="16" />
+ </class>
+ <class name="android/view/accessibility/AccessibilityNodeInfo$AccessibilityAction" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(ILjava/lang/CharSequence;)V" />
+ <method name="getId()I" />
+ <method name="getLabel()Ljava/lang/CharSequence;" />
+ <field name="ACTION_ACCESSIBILITY_FOCUS" />
+ <field name="ACTION_CLEAR_ACCESSIBILITY_FOCUS" />
+ <field name="ACTION_CLEAR_FOCUS" />
+ <field name="ACTION_CLEAR_SELECTION" />
+ <field name="ACTION_CLICK" />
+ <field name="ACTION_COLLAPSE" />
+ <field name="ACTION_COPY" />
+ <field name="ACTION_CUT" />
+ <field name="ACTION_DISMISS" />
+ <field name="ACTION_EXPAND" />
+ <field name="ACTION_FOCUS" />
+ <field name="ACTION_LONG_CLICK" />
+ <field name="ACTION_NEXT_AT_MOVEMENT_GRANULARITY" />
+ <field name="ACTION_NEXT_HTML_ELEMENT" />
+ <field name="ACTION_PASTE" />
+ <field name="ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY" />
+ <field name="ACTION_PREVIOUS_HTML_ELEMENT" />
+ <field name="ACTION_SCROLL_BACKWARD" />
+ <field name="ACTION_SCROLL_FORWARD" />
+ <field name="ACTION_SELECT" />
+ <field name="ACTION_SET_SELECTION" />
+ <field name="ACTION_SET_TEXT" />
+ </class>
+ <class name="android/view/accessibility/AccessibilityNodeInfo$CollectionInfo" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getColumnCount()I" />
+ <method name="getRowCount()I" />
+ <method name="getSelectionMode()I" since="21" />
+ <method name="isHierarchical()Z" />
+ <method name="obtain(IIZ)Landroid/view/accessibility/AccessibilityNodeInfo$CollectionInfo;" />
+ <method name="obtain(IIZI)Landroid/view/accessibility/AccessibilityNodeInfo$CollectionInfo;" since="21" />
+ <field name="SELECTION_MODE_MULTIPLE" since="21" />
+ <field name="SELECTION_MODE_NONE" since="21" />
+ <field name="SELECTION_MODE_SINGLE" since="21" />
+ </class>
+ <class name="android/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getColumnIndex()I" />
+ <method name="getColumnSpan()I" />
+ <method name="getRowIndex()I" />
+ <method name="getRowSpan()I" />
+ <method name="isHeading()Z" />
+ <method name="isSelected()Z" since="21" />
+ <method name="obtain(IIIIZ)Landroid/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo;" />
+ <method name="obtain(IIIIZZ)Landroid/view/accessibility/AccessibilityNodeInfo$CollectionItemInfo;" since="21" />
+ </class>
+ <class name="android/view/accessibility/AccessibilityNodeInfo$RangeInfo" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getCurrent()F" />
+ <method name="getMax()F" />
+ <method name="getMin()F" />
+ <method name="getType()I" />
+ <method name="obtain(IFFF)Landroid/view/accessibility/AccessibilityNodeInfo$RangeInfo;" />
+ <field name="RANGE_TYPE_FLOAT" />
+ <field name="RANGE_TYPE_INT" />
+ <field name="RANGE_TYPE_PERCENT" />
+ </class>
+ <class name="android/view/accessibility/AccessibilityNodeProvider" since="16">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="createAccessibilityNodeInfo(I)Landroid/view/accessibility/AccessibilityNodeInfo;" />
+ <method name="findAccessibilityNodeInfosByText(Ljava/lang/String;I)Ljava/util/List;" />
+ <method name="findFocus(I)Landroid/view/accessibility/AccessibilityNodeInfo;" since="19" />
+ <method name="performAction(IILandroid/os/Bundle;)Z" />
+ <field name="HOST_VIEW_ID" since="21" />
+ </class>
+ <class name="android/view/accessibility/AccessibilityRecord" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getAddedCount()I" />
+ <method name="getBeforeText()Ljava/lang/CharSequence;" />
+ <method name="getClassName()Ljava/lang/CharSequence;" />
+ <method name="getContentDescription()Ljava/lang/CharSequence;" />
+ <method name="getCurrentItemIndex()I" />
+ <method name="getFromIndex()I" />
+ <method name="getItemCount()I" />
+ <method name="getMaxScrollX()I" since="15" />
+ <method name="getMaxScrollY()I" since="15" />
+ <method name="getParcelableData()Landroid/os/Parcelable;" />
+ <method name="getRemovedCount()I" />
+ <method name="getScrollX()I" />
+ <method name="getScrollY()I" />
+ <method name="getSource()Landroid/view/accessibility/AccessibilityNodeInfo;" />
+ <method name="getText()Ljava/util/List;" />
+ <method name="getToIndex()I" />
+ <method name="getWindowId()I" />
+ <method name="isChecked()Z" />
+ <method name="isEnabled()Z" />
+ <method name="isFullScreen()Z" />
+ <method name="isPassword()Z" />
+ <method name="isScrollable()Z" />
+ <method name="obtain()Landroid/view/accessibility/AccessibilityRecord;" />
+ <method name="obtain(Landroid/view/accessibility/AccessibilityRecord;)Landroid/view/accessibility/AccessibilityRecord;" />
+ <method name="recycle()V" />
+ <method name="setAddedCount(I)V" />
+ <method name="setBeforeText(Ljava/lang/CharSequence;)V" />
+ <method name="setChecked(Z)V" />
+ <method name="setClassName(Ljava/lang/CharSequence;)V" />
+ <method name="setContentDescription(Ljava/lang/CharSequence;)V" />
+ <method name="setCurrentItemIndex(I)V" />
+ <method name="setEnabled(Z)V" />
+ <method name="setFromIndex(I)V" />
+ <method name="setFullScreen(Z)V" />
+ <method name="setItemCount(I)V" />
+ <method name="setMaxScrollX(I)V" since="15" />
+ <method name="setMaxScrollY(I)V" since="15" />
+ <method name="setParcelableData(Landroid/os/Parcelable;)V" />
+ <method name="setPassword(Z)V" />
+ <method name="setRemovedCount(I)V" />
+ <method name="setScrollX(I)V" />
+ <method name="setScrollY(I)V" />
+ <method name="setScrollable(Z)V" />
+ <method name="setSource(Landroid/view/View;)V" />
+ <method name="setSource(Landroid/view/View;I)V" since="16" />
+ <method name="setToIndex(I)V" />
+ </class>
+ <class name="android/view/accessibility/AccessibilityWindowInfo" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getBoundsInScreen(Landroid/graphics/Rect;)V" />
+ <method name="getChild(I)Landroid/view/accessibility/AccessibilityWindowInfo;" />
+ <method name="getChildCount()I" />
+ <method name="getId()I" />
+ <method name="getLayer()I" />
+ <method name="getParent()Landroid/view/accessibility/AccessibilityWindowInfo;" />
+ <method name="getRoot()Landroid/view/accessibility/AccessibilityNodeInfo;" />
+ <method name="getType()I" />
+ <method name="isAccessibilityFocused()Z" />
+ <method name="isActive()Z" />
+ <method name="isFocused()Z" />
+ <method name="obtain()Landroid/view/accessibility/AccessibilityWindowInfo;" />
+ <method name="obtain(Landroid/view/accessibility/AccessibilityWindowInfo;)Landroid/view/accessibility/AccessibilityWindowInfo;" />
+ <method name="recycle()V" />
+ <field name="CREATOR" />
+ <field name="TYPE_APPLICATION" />
+ <field name="TYPE_INPUT_METHOD" />
+ <field name="TYPE_SYSTEM" />
+ </class>
+ <class name="android/view/accessibility/CaptioningManager" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addCaptioningChangeListener(Landroid/view/accessibility/CaptioningManager$CaptioningChangeListener;)V" />
+ <method name="getFontScale()F" />
+ <method name="getLocale()Ljava/util/Locale;" />
+ <method name="getUserStyle()Landroid/view/accessibility/CaptioningManager$CaptionStyle;" />
+ <method name="isEnabled()Z" />
+ <method name="removeCaptioningChangeListener(Landroid/view/accessibility/CaptioningManager$CaptioningChangeListener;)V" />
+ </class>
+ <class name="android/view/accessibility/CaptioningManager$CaptionStyle" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getTypeface()Landroid/graphics/Typeface;" />
+ <method name="hasBackgroundColor()Z" since="21" />
+ <method name="hasEdgeColor()Z" since="21" />
+ <method name="hasEdgeType()Z" since="21" />
+ <method name="hasForegroundColor()Z" since="21" />
+ <method name="hasWindowColor()Z" since="21" />
+ <field name="EDGE_TYPE_DEPRESSED" since="21" />
+ <field name="EDGE_TYPE_DROP_SHADOW" />
+ <field name="EDGE_TYPE_NONE" />
+ <field name="EDGE_TYPE_OUTLINE" />
+ <field name="EDGE_TYPE_RAISED" since="21" />
+ <field name="EDGE_TYPE_UNSPECIFIED" since="21" />
+ <field name="backgroundColor" />
+ <field name="edgeColor" />
+ <field name="edgeType" />
+ <field name="foregroundColor" />
+ <field name="windowColor" since="21" />
+ </class>
+ <class name="android/view/accessibility/CaptioningManager$CaptioningChangeListener" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="onEnabledChanged(Z)V" />
+ <method name="onFontScaleChanged(F)V" />
+ <method name="onLocaleChanged(Ljava/util/Locale;)V" />
+ <method name="onUserStyleChanged(Landroid/view/accessibility/CaptioningManager$CaptionStyle;)V" />
+ </class>
+ <class name="android/view/animation/AccelerateDecelerateInterpolator" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/animation/Interpolator" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ </class>
+ <class name="android/view/animation/AccelerateInterpolator" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/animation/Interpolator" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(F)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ </class>
+ <class name="android/view/animation/AlphaAnimation" since="1">
+ <extends name="android/view/animation/Animation" />
+ <method name="&lt;init>(FF)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ </class>
+ <class name="android/view/animation/Animation" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" since="3" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="applyTransformation(FLandroid/view/animation/Transformation;)V" />
+ <method name="cancel()V" since="8" />
+ <method name="clone()Landroid/view/animation/Animation;" since="3" />
+ <method name="computeDurationHint()J" since="3" />
+ <method name="ensureInterpolator()V" />
+ <method name="getBackgroundColor()I" since="12" />
+ <method name="getDetachWallpaper()Z" since="5" />
+ <method name="getDuration()J" />
+ <method name="getFillAfter()Z" />
+ <method name="getFillBefore()Z" />
+ <method name="getInterpolator()Landroid/view/animation/Interpolator;" />
+ <method name="getRepeatCount()I" />
+ <method name="getRepeatMode()I" />
+ <method name="getScaleFactor()F" since="11" />
+ <method name="getStartOffset()J" />
+ <method name="getStartTime()J" />
+ <method name="getTransformation(JLandroid/view/animation/Transformation;)Z" />
+ <method name="getTransformation(JLandroid/view/animation/Transformation;F)Z" since="11" />
+ <method name="getZAdjustment()I" />
+ <method name="hasEnded()Z" />
+ <method name="hasStarted()Z" />
+ <method name="initialize(IIII)V" />
+ <method name="isFillEnabled()Z" since="3" />
+ <method name="isInitialized()Z" />
+ <method name="reset()V" />
+ <method name="resolveSize(IFII)F" />
+ <method name="restrictDuration(J)V" />
+ <method name="scaleCurrentDuration(F)V" />
+ <method name="setAnimationListener(Landroid/view/animation/Animation$AnimationListener;)V" />
+ <method name="setBackgroundColor(I)V" since="12" />
+ <method name="setDetachWallpaper(Z)V" since="5" />
+ <method name="setDuration(J)V" />
+ <method name="setFillAfter(Z)V" />
+ <method name="setFillBefore(Z)V" />
+ <method name="setFillEnabled(Z)V" since="3" />
+ <method name="setInterpolator(Landroid/content/Context;I)V" />
+ <method name="setInterpolator(Landroid/view/animation/Interpolator;)V" />
+ <method name="setRepeatCount(I)V" />
+ <method name="setRepeatMode(I)V" />
+ <method name="setStartOffset(J)V" />
+ <method name="setStartTime(J)V" />
+ <method name="setZAdjustment(I)V" />
+ <method name="start()V" />
+ <method name="startNow()V" />
+ <method name="willChangeBounds()Z" />
+ <method name="willChangeTransformationMatrix()Z" />
+ <field name="ABSOLUTE" />
+ <field name="INFINITE" />
+ <field name="RELATIVE_TO_PARENT" />
+ <field name="RELATIVE_TO_SELF" />
+ <field name="RESTART" />
+ <field name="REVERSE" />
+ <field name="START_ON_FIRST_FRAME" />
+ <field name="ZORDER_BOTTOM" />
+ <field name="ZORDER_NORMAL" />
+ <field name="ZORDER_TOP" />
+ </class>
+ <class name="android/view/animation/Animation$AnimationListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onAnimationEnd(Landroid/view/animation/Animation;)V" />
+ <method name="onAnimationRepeat(Landroid/view/animation/Animation;)V" />
+ <method name="onAnimationStart(Landroid/view/animation/Animation;)V" />
+ </class>
+ <class name="android/view/animation/Animation$Description" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="type" />
+ <field name="value" />
+ </class>
+ <class name="android/view/animation/AnimationSet" since="1">
+ <extends name="android/view/animation/Animation" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Z)V" />
+ <method name="addAnimation(Landroid/view/animation/Animation;)V" />
+ <method name="clone()Landroid/view/animation/AnimationSet;" since="3" />
+ <method name="getAnimations()Ljava/util/List;" />
+ </class>
+ <class name="android/view/animation/AnimationUtils" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="currentAnimationTimeMillis()J" />
+ <method name="loadAnimation(Landroid/content/Context;I)Landroid/view/animation/Animation;" />
+ <method name="loadInterpolator(Landroid/content/Context;I)Landroid/view/animation/Interpolator;" />
+ <method name="loadLayoutAnimation(Landroid/content/Context;I)Landroid/view/animation/LayoutAnimationController;" />
+ <method name="makeInAnimation(Landroid/content/Context;Z)Landroid/view/animation/Animation;" />
+ <method name="makeInChildBottomAnimation(Landroid/content/Context;)Landroid/view/animation/Animation;" />
+ <method name="makeOutAnimation(Landroid/content/Context;Z)Landroid/view/animation/Animation;" />
+ </class>
+ <class name="android/view/animation/AnticipateInterpolator" since="4">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/animation/Interpolator" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(F)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ </class>
+ <class name="android/view/animation/AnticipateOvershootInterpolator" since="4">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/animation/Interpolator" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(F)V" />
+ <method name="&lt;init>(FF)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ </class>
+ <class name="android/view/animation/BounceInterpolator" since="4">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/animation/Interpolator" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ </class>
+ <class name="android/view/animation/CycleInterpolator" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/animation/Interpolator" />
+ <method name="&lt;init>(F)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ </class>
+ <class name="android/view/animation/DecelerateInterpolator" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/animation/Interpolator" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(F)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ </class>
+ <class name="android/view/animation/GridLayoutAnimationController" since="1">
+ <extends name="android/view/animation/LayoutAnimationController" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/view/animation/Animation;)V" />
+ <method name="&lt;init>(Landroid/view/animation/Animation;FF)V" />
+ <method name="getColumnDelay()F" />
+ <method name="getDirection()I" />
+ <method name="getDirectionPriority()I" />
+ <method name="getRowDelay()F" />
+ <method name="setColumnDelay(F)V" />
+ <method name="setDirection(I)V" />
+ <method name="setDirectionPriority(I)V" />
+ <method name="setRowDelay(F)V" />
+ <field name="DIRECTION_BOTTOM_TO_TOP" />
+ <field name="DIRECTION_HORIZONTAL_MASK" />
+ <field name="DIRECTION_LEFT_TO_RIGHT" />
+ <field name="DIRECTION_RIGHT_TO_LEFT" />
+ <field name="DIRECTION_TOP_TO_BOTTOM" />
+ <field name="DIRECTION_VERTICAL_MASK" />
+ <field name="PRIORITY_COLUMN" />
+ <field name="PRIORITY_NONE" />
+ <field name="PRIORITY_ROW" />
+ </class>
+ <class name="android/view/animation/GridLayoutAnimationController$AnimationParameters" since="1">
+ <extends name="android/view/animation/LayoutAnimationController$AnimationParameters" />
+ <method name="&lt;init>()V" />
+ <field name="column" />
+ <field name="columnsCount" />
+ <field name="row" />
+ <field name="rowsCount" />
+ </class>
+ <class name="android/view/animation/Interpolator" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/animation/TimeInterpolator" since="11" />
+ <method name="getInterpolation(F)F" />
+ </class>
+ <class name="android/view/animation/LayoutAnimationController" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/view/animation/Animation;)V" />
+ <method name="&lt;init>(Landroid/view/animation/Animation;F)V" />
+ <method name="getAnimation()Landroid/view/animation/Animation;" />
+ <method name="getAnimationForView(Landroid/view/View;)Landroid/view/animation/Animation;" />
+ <method name="getDelay()F" />
+ <method name="getDelayForView(Landroid/view/View;)J" />
+ <method name="getInterpolator()Landroid/view/animation/Interpolator;" />
+ <method name="getOrder()I" />
+ <method name="getTransformedIndex(Landroid/view/animation/LayoutAnimationController$AnimationParameters;)I" />
+ <method name="isDone()Z" />
+ <method name="setAnimation(Landroid/content/Context;I)V" />
+ <method name="setAnimation(Landroid/view/animation/Animation;)V" />
+ <method name="setDelay(F)V" />
+ <method name="setInterpolator(Landroid/content/Context;I)V" />
+ <method name="setInterpolator(Landroid/view/animation/Interpolator;)V" />
+ <method name="setOrder(I)V" />
+ <method name="start()V" />
+ <method name="willOverlap()Z" />
+ <field name="ORDER_NORMAL" />
+ <field name="ORDER_RANDOM" />
+ <field name="ORDER_REVERSE" />
+ <field name="mAnimation" />
+ <field name="mInterpolator" />
+ <field name="mRandomizer" />
+ </class>
+ <class name="android/view/animation/LayoutAnimationController$AnimationParameters" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="count" />
+ <field name="index" />
+ </class>
+ <class name="android/view/animation/LinearInterpolator" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/animation/Interpolator" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ </class>
+ <class name="android/view/animation/OvershootInterpolator" since="4">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/animation/Interpolator" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(F)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ </class>
+ <class name="android/view/animation/PathInterpolator" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/animation/Interpolator" />
+ <method name="&lt;init>(FF)V" />
+ <method name="&lt;init>(FFFF)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/graphics/Path;)V" />
+ </class>
+ <class name="android/view/animation/RotateAnimation" since="1">
+ <extends name="android/view/animation/Animation" />
+ <method name="&lt;init>(FF)V" />
+ <method name="&lt;init>(FFFF)V" />
+ <method name="&lt;init>(FFIFIF)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ </class>
+ <class name="android/view/animation/ScaleAnimation" since="1">
+ <extends name="android/view/animation/Animation" />
+ <method name="&lt;init>(FFFF)V" />
+ <method name="&lt;init>(FFFFFF)V" />
+ <method name="&lt;init>(FFFFIFIF)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ </class>
+ <class name="android/view/animation/Transformation" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="clear()V" />
+ <method name="compose(Landroid/view/animation/Transformation;)V" />
+ <method name="getAlpha()F" />
+ <method name="getMatrix()Landroid/graphics/Matrix;" />
+ <method name="getTransformationType()I" />
+ <method name="set(Landroid/view/animation/Transformation;)V" />
+ <method name="setAlpha(F)V" />
+ <method name="setTransformationType(I)V" />
+ <method name="toShortString()Ljava/lang/String;" since="3" />
+ <field name="TYPE_ALPHA" />
+ <field name="TYPE_BOTH" />
+ <field name="TYPE_IDENTITY" />
+ <field name="TYPE_MATRIX" />
+ <field name="mAlpha" />
+ <field name="mMatrix" />
+ <field name="mTransformationType" />
+ </class>
+ <class name="android/view/animation/TranslateAnimation" since="1">
+ <extends name="android/view/animation/Animation" />
+ <method name="&lt;init>(FFFF)V" />
+ <method name="&lt;init>(IFIFIFIF)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ </class>
+ <class name="android/view/inputmethod/BaseInputConnection" since="3">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/inputmethod/InputConnection" />
+ <method name="&lt;init>(Landroid/view/View;Z)V" />
+ <method name="getComposingSpanEnd(Landroid/text/Spannable;)I" />
+ <method name="getComposingSpanStart(Landroid/text/Spannable;)I" />
+ <method name="getEditable()Landroid/text/Editable;" />
+ <method name="removeComposingSpans(Landroid/text/Spannable;)V" />
+ <method name="setComposingSpans(Landroid/text/Spannable;)V" />
+ </class>
+ <class name="android/view/inputmethod/CompletionInfo" since="3">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(JILjava/lang/CharSequence;)V" />
+ <method name="&lt;init>(JILjava/lang/CharSequence;Ljava/lang/CharSequence;)V" />
+ <method name="getId()J" />
+ <method name="getLabel()Ljava/lang/CharSequence;" />
+ <method name="getPosition()I" />
+ <method name="getText()Ljava/lang/CharSequence;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/view/inputmethod/CorrectionInfo" since="11">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(ILjava/lang/CharSequence;Ljava/lang/CharSequence;)V" />
+ <method name="getNewText()Ljava/lang/CharSequence;" />
+ <method name="getOffset()I" />
+ <method name="getOldText()Ljava/lang/CharSequence;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/view/inputmethod/CursorAnchorInfo" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="getCharacterBounds(I)Landroid/graphics/RectF;" />
+ <method name="getCharacterBoundsFlags(I)I" />
+ <method name="getComposingText()Ljava/lang/CharSequence;" />
+ <method name="getComposingTextStart()I" />
+ <method name="getInsertionMarkerBaseline()F" />
+ <method name="getInsertionMarkerBottom()F" />
+ <method name="getInsertionMarkerFlags()I" />
+ <method name="getInsertionMarkerHorizontal()F" />
+ <method name="getInsertionMarkerTop()F" />
+ <method name="getMatrix()Landroid/graphics/Matrix;" />
+ <method name="getSelectionEnd()I" />
+ <method name="getSelectionStart()I" />
+ <field name="CREATOR" />
+ <field name="FLAG_HAS_INVISIBLE_REGION" />
+ <field name="FLAG_HAS_VISIBLE_REGION" />
+ <field name="FLAG_IS_RTL" />
+ </class>
+ <class name="android/view/inputmethod/CursorAnchorInfo$Builder" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addCharacterBounds(IFFFFI)Landroid/view/inputmethod/CursorAnchorInfo$Builder;" />
+ <method name="build()Landroid/view/inputmethod/CursorAnchorInfo;" />
+ <method name="reset()V" />
+ <method name="setComposingText(ILjava/lang/CharSequence;)Landroid/view/inputmethod/CursorAnchorInfo$Builder;" />
+ <method name="setInsertionMarkerLocation(FFFFI)Landroid/view/inputmethod/CursorAnchorInfo$Builder;" />
+ <method name="setMatrix(Landroid/graphics/Matrix;)Landroid/view/inputmethod/CursorAnchorInfo$Builder;" />
+ <method name="setSelectionRange(II)Landroid/view/inputmethod/CursorAnchorInfo$Builder;" />
+ </class>
+ <class name="android/view/inputmethod/EditorInfo" since="3">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <implements name="android/text/InputType" />
+ <method name="&lt;init>()V" />
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V" />
+ <method name="makeCompatible(I)V" since="11" />
+ <field name="CREATOR" />
+ <field name="IME_ACTION_DONE" />
+ <field name="IME_ACTION_GO" />
+ <field name="IME_ACTION_NEXT" />
+ <field name="IME_ACTION_NONE" />
+ <field name="IME_ACTION_PREVIOUS" since="11" />
+ <field name="IME_ACTION_SEARCH" />
+ <field name="IME_ACTION_SEND" />
+ <field name="IME_ACTION_UNSPECIFIED" />
+ <field name="IME_FLAG_FORCE_ASCII" since="16" />
+ <field name="IME_FLAG_NAVIGATE_NEXT" since="11" />
+ <field name="IME_FLAG_NAVIGATE_PREVIOUS" since="11" />
+ <field name="IME_FLAG_NO_ACCESSORY_ACTION" />
+ <field name="IME_FLAG_NO_ENTER_ACTION" />
+ <field name="IME_FLAG_NO_EXTRACT_UI" />
+ <field name="IME_FLAG_NO_FULLSCREEN" since="11" />
+ <field name="IME_MASK_ACTION" />
+ <field name="IME_NULL" />
+ <field name="actionId" />
+ <field name="actionLabel" />
+ <field name="extras" />
+ <field name="fieldId" />
+ <field name="fieldName" />
+ <field name="hintText" />
+ <field name="imeOptions" />
+ <field name="initialCapsMode" />
+ <field name="initialSelEnd" />
+ <field name="initialSelStart" />
+ <field name="inputType" />
+ <field name="label" />
+ <field name="packageName" />
+ <field name="privateImeOptions" />
+ </class>
+ <class name="android/view/inputmethod/ExtractedText" since="3">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <field name="CREATOR" />
+ <field name="FLAG_SELECTING" />
+ <field name="FLAG_SINGLE_LINE" />
+ <field name="flags" />
+ <field name="partialEndOffset" />
+ <field name="partialStartOffset" />
+ <field name="selectionEnd" />
+ <field name="selectionStart" />
+ <field name="startOffset" />
+ <field name="text" />
+ </class>
+ <class name="android/view/inputmethod/ExtractedTextRequest" since="3">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <field name="CREATOR" />
+ <field name="flags" />
+ <field name="hintMaxChars" />
+ <field name="hintMaxLines" />
+ <field name="token" />
+ </class>
+ <class name="android/view/inputmethod/InputBinding" since="3">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/view/inputmethod/InputConnection;Landroid/os/IBinder;II)V" />
+ <method name="&lt;init>(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/InputBinding;)V" />
+ <method name="getConnection()Landroid/view/inputmethod/InputConnection;" />
+ <method name="getConnectionToken()Landroid/os/IBinder;" />
+ <method name="getPid()I" />
+ <method name="getUid()I" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/view/inputmethod/InputConnection" since="3">
+ <extends name="java/lang/Object" />
+ <method name="beginBatchEdit()Z" />
+ <method name="clearMetaKeyStates(I)Z" />
+ <method name="commitCompletion(Landroid/view/inputmethod/CompletionInfo;)Z" />
+ <method name="commitCorrection(Landroid/view/inputmethod/CorrectionInfo;)Z" since="11" />
+ <method name="commitText(Ljava/lang/CharSequence;I)Z" />
+ <method name="deleteSurroundingText(II)Z" />
+ <method name="endBatchEdit()Z" />
+ <method name="finishComposingText()Z" />
+ <method name="getCursorCapsMode(I)I" />
+ <method name="getExtractedText(Landroid/view/inputmethod/ExtractedTextRequest;I)Landroid/view/inputmethod/ExtractedText;" />
+ <method name="getSelectedText(I)Ljava/lang/CharSequence;" since="9" />
+ <method name="getTextAfterCursor(II)Ljava/lang/CharSequence;" />
+ <method name="getTextBeforeCursor(II)Ljava/lang/CharSequence;" />
+ <method name="performContextMenuAction(I)Z" />
+ <method name="performEditorAction(I)Z" />
+ <method name="performPrivateCommand(Ljava/lang/String;Landroid/os/Bundle;)Z" />
+ <method name="reportFullscreenMode(Z)Z" />
+ <method name="requestCursorUpdates(I)Z" since="21" />
+ <method name="sendKeyEvent(Landroid/view/KeyEvent;)Z" />
+ <method name="setComposingRegion(II)Z" since="9" />
+ <method name="setComposingText(Ljava/lang/CharSequence;I)Z" />
+ <method name="setSelection(II)Z" />
+ <field name="CURSOR_UPDATE_IMMEDIATE" since="21" />
+ <field name="CURSOR_UPDATE_MONITOR" since="21" />
+ <field name="GET_EXTRACTED_TEXT_MONITOR" />
+ <field name="GET_TEXT_WITH_STYLES" />
+ </class>
+ <class name="android/view/inputmethod/InputConnectionWrapper" since="3">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/inputmethod/InputConnection" />
+ <method name="&lt;init>(Landroid/view/inputmethod/InputConnection;Z)V" />
+ <method name="setTarget(Landroid/view/inputmethod/InputConnection;)V" />
+ </class>
+ <class name="android/view/inputmethod/InputMethod" since="3">
+ <extends name="java/lang/Object" />
+ <method name="attachToken(Landroid/os/IBinder;)V" />
+ <method name="bindInput(Landroid/view/inputmethod/InputBinding;)V" />
+ <method name="changeInputMethodSubtype(Landroid/view/inputmethod/InputMethodSubtype;)V" since="11" />
+ <method name="createSession(Landroid/view/inputmethod/InputMethod$SessionCallback;)V" />
+ <method name="hideSoftInput(ILandroid/os/ResultReceiver;)V" />
+ <method name="restartInput(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;)V" />
+ <method name="revokeSession(Landroid/view/inputmethod/InputMethodSession;)V" />
+ <method name="setSessionEnabled(Landroid/view/inputmethod/InputMethodSession;Z)V" />
+ <method name="showSoftInput(ILandroid/os/ResultReceiver;)V" />
+ <method name="startInput(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;)V" />
+ <method name="unbindInput()V" />
+ <field name="SERVICE_INTERFACE" />
+ <field name="SERVICE_META_DATA" />
+ <field name="SHOW_EXPLICIT" />
+ <field name="SHOW_FORCED" />
+ </class>
+ <class name="android/view/inputmethod/InputMethod$SessionCallback" since="3">
+ <extends name="java/lang/Object" />
+ <method name="sessionCreated(Landroid/view/inputmethod/InputMethodSession;)V" />
+ </class>
+ <class name="android/view/inputmethod/InputMethodInfo" since="3">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/content/pm/ResolveInfo;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/CharSequence;Ljava/lang/String;)V" />
+ <method name="dump(Landroid/util/Printer;Ljava/lang/String;)V" />
+ <method name="getComponent()Landroid/content/ComponentName;" />
+ <method name="getId()Ljava/lang/String;" />
+ <method name="getIsDefaultResourceId()I" />
+ <method name="getPackageName()Ljava/lang/String;" />
+ <method name="getServiceInfo()Landroid/content/pm/ServiceInfo;" />
+ <method name="getServiceName()Ljava/lang/String;" />
+ <method name="getSettingsActivity()Ljava/lang/String;" />
+ <method name="getSubtypeAt(I)Landroid/view/inputmethod/InputMethodSubtype;" since="11" />
+ <method name="getSubtypeCount()I" since="11" />
+ <method name="loadIcon(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;" />
+ <method name="loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/view/inputmethod/InputMethodManager" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="displayCompletions(Landroid/view/View;[Landroid/view/inputmethod/CompletionInfo;)V" />
+ <method name="getCurrentInputMethodSubtype()Landroid/view/inputmethod/InputMethodSubtype;" since="11" />
+ <method name="getEnabledInputMethodList()Ljava/util/List;" />
+ <method name="getEnabledInputMethodSubtypeList(Landroid/view/inputmethod/InputMethodInfo;Z)Ljava/util/List;" since="11" />
+ <method name="getInputMethodList()Ljava/util/List;" />
+ <method name="getLastInputMethodSubtype()Landroid/view/inputmethod/InputMethodSubtype;" since="14" />
+ <method name="getShortcutInputMethodsAndSubtypes()Ljava/util/Map;" since="11" />
+ <method name="hideSoftInputFromInputMethod(Landroid/os/IBinder;I)V" />
+ <method name="hideSoftInputFromWindow(Landroid/os/IBinder;I)Z" />
+ <method name="hideSoftInputFromWindow(Landroid/os/IBinder;ILandroid/os/ResultReceiver;)Z" />
+ <method name="hideStatusIcon(Landroid/os/IBinder;)V" />
+ <method name="isAcceptingText()Z" />
+ <method name="isActive()Z" />
+ <method name="isActive(Landroid/view/View;)Z" />
+ <method name="isFullscreenMode()Z" />
+ <method name="isWatchingCursor(Landroid/view/View;)Z" />
+ <method name="restartInput(Landroid/view/View;)V" />
+ <method name="sendAppPrivateCommand(Landroid/view/View;Ljava/lang/String;Landroid/os/Bundle;)V" />
+ <method name="setAdditionalInputMethodSubtypes(Ljava/lang/String;[Landroid/view/inputmethod/InputMethodSubtype;)V" since="14" />
+ <method name="setCurrentInputMethodSubtype(Landroid/view/inputmethod/InputMethodSubtype;)Z" since="11" />
+ <method name="setInputMethod(Landroid/os/IBinder;Ljava/lang/String;)V" />
+ <method name="setInputMethodAndSubtype(Landroid/os/IBinder;Ljava/lang/String;Landroid/view/inputmethod/InputMethodSubtype;)V" since="11" />
+ <method name="shouldOfferSwitchingToNextInputMethod(Landroid/os/IBinder;)Z" since="19" />
+ <method name="showInputMethodAndSubtypeEnabler(Ljava/lang/String;)V" since="11" />
+ <method name="showInputMethodPicker()V" />
+ <method name="showSoftInput(Landroid/view/View;I)Z" />
+ <method name="showSoftInput(Landroid/view/View;ILandroid/os/ResultReceiver;)Z" />
+ <method name="showSoftInputFromInputMethod(Landroid/os/IBinder;I)V" />
+ <method name="showStatusIcon(Landroid/os/IBinder;Ljava/lang/String;I)V" />
+ <method name="switchToLastInputMethod(Landroid/os/IBinder;)Z" since="11" />
+ <method name="switchToNextInputMethod(Landroid/os/IBinder;Z)Z" since="16" />
+ <method name="toggleSoftInput(II)V" />
+ <method name="toggleSoftInputFromWindow(Landroid/os/IBinder;II)V" />
+ <method name="updateCursor(Landroid/view/View;IIII)V" />
+ <method name="updateCursorAnchorInfo(Landroid/view/View;Landroid/view/inputmethod/CursorAnchorInfo;)V" since="21" />
+ <method name="updateExtractedText(Landroid/view/View;ILandroid/view/inputmethod/ExtractedText;)V" />
+ <method name="updateSelection(Landroid/view/View;IIII)V" />
+ <method name="viewClicked(Landroid/view/View;)V" since="14" />
+ <field name="HIDE_IMPLICIT_ONLY" />
+ <field name="HIDE_NOT_ALWAYS" />
+ <field name="RESULT_HIDDEN" />
+ <field name="RESULT_SHOWN" />
+ <field name="RESULT_UNCHANGED_HIDDEN" />
+ <field name="RESULT_UNCHANGED_SHOWN" />
+ <field name="SHOW_FORCED" />
+ <field name="SHOW_IMPLICIT" />
+ </class>
+ <class name="android/view/inputmethod/InputMethodSession" since="3">
+ <extends name="java/lang/Object" />
+ <method name="appPrivateCommand(Ljava/lang/String;Landroid/os/Bundle;)V" />
+ <method name="dispatchGenericMotionEvent(ILandroid/view/MotionEvent;Landroid/view/inputmethod/InputMethodSession$EventCallback;)V" since="17" />
+ <method name="dispatchKeyEvent(ILandroid/view/KeyEvent;Landroid/view/inputmethod/InputMethodSession$EventCallback;)V" />
+ <method name="dispatchTrackballEvent(ILandroid/view/MotionEvent;Landroid/view/inputmethod/InputMethodSession$EventCallback;)V" />
+ <method name="displayCompletions([Landroid/view/inputmethod/CompletionInfo;)V" />
+ <method name="finishInput()V" />
+ <method name="toggleSoftInput(II)V" />
+ <method name="updateCursor(Landroid/graphics/Rect;)V" />
+ <method name="updateCursorAnchorInfo(Landroid/view/inputmethod/CursorAnchorInfo;)V" since="21" />
+ <method name="updateExtractedText(ILandroid/view/inputmethod/ExtractedText;)V" />
+ <method name="updateSelection(IIIIII)V" />
+ <method name="viewClicked(Z)V" since="14" />
+ </class>
+ <class name="android/view/inputmethod/InputMethodSession$EventCallback" since="3">
+ <extends name="java/lang/Object" />
+ <method name="finishedEvent(IZ)V" />
+ </class>
+ <class name="android/view/inputmethod/InputMethodSubtype" since="11">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZ)V" since="14" />
+ <method name="&lt;init>(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZI)V" since="17" />
+ <method name="containsExtraValueKey(Ljava/lang/String;)Z" since="12" />
+ <method name="getDisplayName(Landroid/content/Context;Ljava/lang/String;Landroid/content/pm/ApplicationInfo;)Ljava/lang/CharSequence;" since="14" />
+ <method name="getExtraValue()Ljava/lang/String;" />
+ <method name="getExtraValueOf(Ljava/lang/String;)Ljava/lang/String;" since="12" />
+ <method name="getIconResId()I" />
+ <method name="getLocale()Ljava/lang/String;" />
+ <method name="getMode()Ljava/lang/String;" />
+ <method name="getNameResId()I" />
+ <method name="isAsciiCapable()Z" since="19" />
+ <method name="isAuxiliary()Z" since="14" />
+ <method name="overridesImplicitlyEnabledSubtype()Z" since="14" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="build()Landroid/view/inputmethod/InputMethodSubtype;" />
+ <method name="setIsAsciiCapable(Z)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;" />
+ <method name="setIsAuxiliary(Z)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;" />
+ <method name="setOverridesImplicitlyEnabledSubtype(Z)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;" />
+ <method name="setSubtypeExtraValue(Ljava/lang/String;)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;" />
+ <method name="setSubtypeIconResId(I)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;" />
+ <method name="setSubtypeId(I)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;" />
+ <method name="setSubtypeLocale(Ljava/lang/String;)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;" />
+ <method name="setSubtypeMode(Ljava/lang/String;)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;" />
+ <method name="setSubtypeNameResId(I)Landroid/view/inputmethod/InputMethodSubtype$InputMethodSubtypeBuilder;" />
+ </class>
+ <class name="android/view/textservice/SentenceSuggestionsInfo" since="16">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="&lt;init>([Landroid/view/textservice/SuggestionsInfo;[I[I)V" />
+ <method name="getLengthAt(I)I" />
+ <method name="getOffsetAt(I)I" />
+ <method name="getSuggestionsCount()I" />
+ <method name="getSuggestionsInfoAt(I)Landroid/view/textservice/SuggestionsInfo;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/view/textservice/SpellCheckerInfo" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>()V" />
+ <method name="getComponent()Landroid/content/ComponentName;" />
+ <method name="getId()Ljava/lang/String;" />
+ <method name="getPackageName()Ljava/lang/String;" />
+ <method name="getServiceInfo()Landroid/content/pm/ServiceInfo;" />
+ <method name="getSettingsActivity()Ljava/lang/String;" />
+ <method name="getSubtypeAt(I)Landroid/view/textservice/SpellCheckerSubtype;" />
+ <method name="getSubtypeCount()I" />
+ <method name="loadIcon(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable;" />
+ <method name="loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/view/textservice/SpellCheckerSession" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="cancel()V" since="15" />
+ <method name="close()V" />
+ <method name="getSentenceSuggestions([Landroid/view/textservice/TextInfo;I)V" since="16" />
+ <method name="getSpellChecker()Landroid/view/textservice/SpellCheckerInfo;" />
+ <method name="getSuggestions(Landroid/view/textservice/TextInfo;I)V" />
+ <method name="getSuggestions([Landroid/view/textservice/TextInfo;IZ)V" />
+ <method name="isSessionDisconnected()Z" />
+ <field name="SERVICE_META_DATA" />
+ </class>
+ <class name="android/view/textservice/SpellCheckerSession$SpellCheckerSessionListener" since="14">
+ <extends name="java/lang/Object" />
+ <method name="onGetSentenceSuggestions([Landroid/view/textservice/SentenceSuggestionsInfo;)V" since="16" />
+ <method name="onGetSuggestions([Landroid/view/textservice/SuggestionsInfo;)V" />
+ </class>
+ <class name="android/view/textservice/SpellCheckerSubtype" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(ILjava/lang/String;Ljava/lang/String;)V" />
+ <method name="containsExtraValueKey(Ljava/lang/String;)Z" since="16" />
+ <method name="getDisplayName(Landroid/content/Context;Ljava/lang/String;Landroid/content/pm/ApplicationInfo;)Ljava/lang/CharSequence;" />
+ <method name="getExtraValue()Ljava/lang/String;" />
+ <method name="getExtraValueOf(Ljava/lang/String;)Ljava/lang/String;" since="16" />
+ <method name="getLocale()Ljava/lang/String;" />
+ <method name="getNameResId()I" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/view/textservice/SuggestionsInfo" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(I[Ljava/lang/String;)V" />
+ <method name="&lt;init>(I[Ljava/lang/String;II)V" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="getCookie()I" />
+ <method name="getSequence()I" />
+ <method name="getSuggestionAt(I)Ljava/lang/String;" />
+ <method name="getSuggestionsAttributes()I" />
+ <method name="getSuggestionsCount()I" />
+ <method name="setCookieAndSequence(II)V" />
+ <field name="CREATOR" />
+ <field name="RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS" since="15" />
+ <field name="RESULT_ATTR_IN_THE_DICTIONARY" />
+ <field name="RESULT_ATTR_LOOKS_LIKE_TYPO" />
+ </class>
+ <class name="android/view/textservice/TextInfo" since="14">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="&lt;init>(Ljava/lang/CharSequence;IIII)V" since="21" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;II)V" />
+ <method name="getCharSequence()Ljava/lang/CharSequence;" since="21" />
+ <method name="getCookie()I" />
+ <method name="getSequence()I" />
+ <method name="getText()Ljava/lang/String;" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/view/textservice/TextServicesManager" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="newSpellCheckerSession(Landroid/os/Bundle;Ljava/util/Locale;Landroid/view/textservice/SpellCheckerSession$SpellCheckerSessionListener;Z)Landroid/view/textservice/SpellCheckerSession;" />
+ </class>
+ <class name="android/webkit/CacheManager" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="cacheDisabled()Z" />
+ <method name="endCacheTransaction()Z" />
+ <method name="getCacheFile(Ljava/lang/String;Ljava/util/Map;)Landroid/webkit/CacheManager$CacheResult;" />
+ <method name="getCacheFileBaseDir()Ljava/io/File;" />
+ <method name="saveCacheFile(Ljava/lang/String;Landroid/webkit/CacheManager$CacheResult;)V" />
+ <method name="startCacheTransaction()Z" />
+ </class>
+ <class name="android/webkit/CacheManager$CacheResult" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getContentDisposition()Ljava/lang/String;" since="7" />
+ <method name="getContentLength()J" />
+ <method name="getETag()Ljava/lang/String;" />
+ <method name="getEncoding()Ljava/lang/String;" />
+ <method name="getExpires()J" />
+ <method name="getExpiresString()Ljava/lang/String;" since="7" />
+ <method name="getHttpStatusCode()I" />
+ <method name="getInputStream()Ljava/io/InputStream;" />
+ <method name="getLastModified()Ljava/lang/String;" />
+ <method name="getLocalPath()Ljava/lang/String;" />
+ <method name="getLocation()Ljava/lang/String;" />
+ <method name="getMimeType()Ljava/lang/String;" />
+ <method name="getOutputStream()Ljava/io/OutputStream;" />
+ <method name="setEncoding(Ljava/lang/String;)V" />
+ <method name="setInputStream(Ljava/io/InputStream;)V" />
+ </class>
+ <class name="android/webkit/CallbackProxy" since="1">
+ <extends name="android/os/Handler" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/webkit/WebView;)V" />
+ <method name="addMessageToConsole(Ljava/lang/String;ILjava/lang/String;)V" since="7" />
+ <method name="createWindow(ZZ)Landroid/webkit/WebView;" />
+ <method name="doUpdateVisitedHistory(Ljava/lang/String;Z)V" />
+ <method name="getBackForwardList()Landroid/webkit/WebBackForwardList;" />
+ <method name="getProgress()I" />
+ <method name="getVisitedHistory(Landroid/webkit/ValueCallback;)V" since="7" />
+ <method name="getWebChromeClient()Landroid/webkit/WebChromeClient;" since="7" />
+ <method name="onCloseWindow(Landroid/webkit/WebView;)V" />
+ <method name="onDownloadStart(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;J)Z" />
+ <method name="onExceededDatabaseQuota(Ljava/lang/String;Ljava/lang/String;JJJLandroid/webkit/WebStorage$QuotaUpdater;)V" since="5" />
+ <method name="onFormResubmission(Landroid/os/Message;Landroid/os/Message;)V" />
+ <method name="onGeolocationPermissionsHidePrompt()V" since="7" />
+ <method name="onGeolocationPermissionsShowPrompt(Ljava/lang/String;Landroid/webkit/GeolocationPermissions$Callback;)V" since="7" />
+ <method name="onJsAlert(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="onJsBeforeUnload(Ljava/lang/String;Ljava/lang/String;)Z" />
+ <method name="onJsConfirm(Ljava/lang/String;Ljava/lang/String;)Z" />
+ <method name="onJsPrompt(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="onJsTimeout()Z" since="7" />
+ <method name="onLoadResource(Ljava/lang/String;)V" />
+ <method name="onPageFinished(Ljava/lang/String;)V" />
+ <method name="onPageStarted(Ljava/lang/String;Landroid/graphics/Bitmap;)V" />
+ <method name="onProgressChanged(I)V" />
+ <method name="onReachedMaxAppCacheSize(JJLandroid/webkit/WebStorage$QuotaUpdater;)V" since="7" />
+ <method name="onReceivedError(ILjava/lang/String;Ljava/lang/String;)V" />
+ <method name="onReceivedHttpAuthRequest(Landroid/webkit/HttpAuthHandler;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="onReceivedIcon(Landroid/graphics/Bitmap;)V" />
+ <method name="onReceivedTitle(Ljava/lang/String;)V" />
+ <method name="onRequestFocus()V" />
+ <method name="onSavePassword(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Message;)Z" />
+ <method name="onScaleChanged(FF)V" />
+ <method name="onTooManyRedirects(Landroid/os/Message;Landroid/os/Message;)V" />
+ <method name="onUnhandledKeyEvent(Landroid/view/KeyEvent;)V" />
+ <method name="setDownloadListener(Landroid/webkit/DownloadListener;)V" />
+ <method name="setWebChromeClient(Landroid/webkit/WebChromeClient;)V" />
+ <method name="setWebViewClient(Landroid/webkit/WebViewClient;)V" />
+ <method name="shouldOverrideUrlLoading(Ljava/lang/String;)Z" />
+ <method name="uiOverrideKeyEvent(Landroid/view/KeyEvent;)Z" />
+ <method name="uiOverrideUrlLoading(Ljava/lang/String;)Z" />
+ </class>
+ <class name="android/webkit/ClientCertRequest" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="cancel()V" />
+ <method name="getHost()Ljava/lang/String;" />
+ <method name="getKeyTypes()[Ljava/lang/String;" />
+ <method name="getPort()I" />
+ <method name="getPrincipals()[Ljava/security/Principal;" />
+ <method name="ignore()V" />
+ <method name="proceed(Ljava/security/PrivateKey;[Ljava/security/cert/X509Certificate;)V" />
+ </class>
+ <class name="android/webkit/ConsoleMessage" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILandroid/webkit/ConsoleMessage$MessageLevel;)V" />
+ <method name="lineNumber()I" />
+ <method name="message()Ljava/lang/String;" />
+ <method name="messageLevel()Landroid/webkit/ConsoleMessage$MessageLevel;" />
+ <method name="sourceId()Ljava/lang/String;" />
+ </class>
+ <class name="android/webkit/ConsoleMessage$MessageLevel" since="8">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/webkit/ConsoleMessage$MessageLevel;" />
+ <method name="values()[Landroid/webkit/ConsoleMessage$MessageLevel;" />
+ <field name="DEBUG" />
+ <field name="ERROR" />
+ <field name="LOG" />
+ <field name="TIP" />
+ <field name="WARNING" />
+ </class>
+ <class name="android/webkit/CookieManager" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="acceptCookie()Z" />
+ <method name="acceptThirdPartyCookies(Landroid/webkit/WebView;)Z" since="21" />
+ <method name="allowFileSchemeCookies()Z" since="12" />
+ <method name="flush()V" since="21" />
+ <method name="getCookie(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getInstance()Landroid/webkit/CookieManager;" />
+ <method name="hasCookies()Z" />
+ <method name="removeAllCookie()V" />
+ <method name="removeAllCookies(Landroid/webkit/ValueCallback;)V" since="21" />
+ <method name="removeExpiredCookie()V" />
+ <method name="removeSessionCookie()V" />
+ <method name="removeSessionCookies(Landroid/webkit/ValueCallback;)V" since="21" />
+ <method name="setAcceptCookie(Z)V" />
+ <method name="setAcceptFileSchemeCookies(Z)V" since="12" />
+ <method name="setAcceptThirdPartyCookies(Landroid/webkit/WebView;Z)V" since="21" />
+ <method name="setCookie(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="setCookie(Ljava/lang/String;Ljava/lang/String;Landroid/webkit/ValueCallback;)V" since="21" />
+ </class>
+ <class name="android/webkit/CookieSyncManager" since="1">
+ <extends name="android/webkit/WebSyncManager" />
+ <method name="&lt;init>()V" />
+ <method name="createInstance(Landroid/content/Context;)Landroid/webkit/CookieSyncManager;" />
+ <method name="getInstance()Landroid/webkit/CookieSyncManager;" />
+ <method name="syncFromRamToFlash()V" />
+ <field name="LOGTAG" since="21" />
+ <field name="mDataBase" since="21" />
+ <field name="mHandler" since="21" />
+ </class>
+ <class name="android/webkit/DateSorter" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="getBoundary(I)J" />
+ <method name="getIndex(J)I" />
+ <method name="getLabel(I)Ljava/lang/String;" />
+ <field name="DAY_COUNT" />
+ </class>
+ <class name="android/webkit/DownloadListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onDownloadStart(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;J)V" />
+ </class>
+ <class name="android/webkit/GeolocationPermissions" since="5">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="allow(Ljava/lang/String;)V" since="7" />
+ <method name="clear(Ljava/lang/String;)V" since="7" />
+ <method name="clearAll()V" since="7" />
+ <method name="getAllowed(Ljava/lang/String;Landroid/webkit/ValueCallback;)V" since="7" />
+ <method name="getInstance()Landroid/webkit/GeolocationPermissions;" since="7" />
+ <method name="getOrigins(Landroid/webkit/ValueCallback;)V" since="7" />
+ </class>
+ <class name="android/webkit/GeolocationPermissions$Callback" since="5">
+ <extends name="java/lang/Object" />
+ <method name="invoke(Ljava/lang/String;ZZ)V" />
+ </class>
+ <class name="android/webkit/HttpAuthHandler" since="1">
+ <extends name="android/os/Handler" />
+ <method name="&lt;init>()V" />
+ <method name="cancel()V" />
+ <method name="proceed(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="useHttpAuthUsernamePassword()Z" />
+ </class>
+ <class name="android/webkit/JavascriptInterface" since="17">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/annotation/Annotation" />
+ </class>
+ <class name="android/webkit/JsPromptResult" since="1">
+ <extends name="android/webkit/JsResult" />
+ <method name="&lt;init>()V" />
+ <method name="confirm(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/webkit/JsResult" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="cancel()V" />
+ <method name="confirm()V" />
+ <method name="wakeUp()V" />
+ <field name="mProxy" />
+ <field name="mResult" />
+ </class>
+ <class name="android/webkit/MimeTypeMap" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getExtensionFromMimeType(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getFileExtensionFromUrl(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getMimeTypeFromExtension(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getSingleton()Landroid/webkit/MimeTypeMap;" />
+ <method name="hasExtension(Ljava/lang/String;)Z" />
+ <method name="hasMimeType(Ljava/lang/String;)Z" />
+ </class>
+ <class name="android/webkit/PermissionRequest" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="deny()V" />
+ <method name="getOrigin()Landroid/net/Uri;" />
+ <method name="getResources()[Ljava/lang/String;" />
+ <method name="grant([Ljava/lang/String;)V" />
+ <field name="RESOURCE_AUDIO_CAPTURE" />
+ <field name="RESOURCE_PROTECTED_MEDIA_ID" />
+ <field name="RESOURCE_VIDEO_CAPTURE" />
+ </class>
+ <class name="android/webkit/Plugin" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="dispatchClickEvent(Landroid/content/Context;)V" />
+ <method name="getDescription()Ljava/lang/String;" />
+ <method name="getFileName()Ljava/lang/String;" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getPath()Ljava/lang/String;" />
+ <method name="setClickHandler(Landroid/webkit/Plugin$PreferencesClickHandler;)V" />
+ <method name="setDescription(Ljava/lang/String;)V" />
+ <method name="setFileName(Ljava/lang/String;)V" />
+ <method name="setName(Ljava/lang/String;)V" />
+ <method name="setPath(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/webkit/Plugin$PreferencesClickHandler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="handleClickEvent(Landroid/content/Context;)V" />
+ </class>
+ <class name="android/webkit/PluginData" since="3">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/io/InputStream;JLjava/util/Map;I)V" />
+ <method name="getContentLength()J" />
+ <method name="getHeaders()Ljava/util/Map;" />
+ <method name="getInputStream()Ljava/io/InputStream;" />
+ <method name="getStatusCode()I" />
+ </class>
+ <class name="android/webkit/PluginList" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addPlugin(Landroid/webkit/Plugin;)V" />
+ <method name="clear()V" />
+ <method name="getList()Ljava/util/List;" />
+ <method name="pluginClicked(Landroid/content/Context;I)V" />
+ <method name="removePlugin(Landroid/webkit/Plugin;)V" />
+ </class>
+ <class name="android/webkit/PluginStub" since="5">
+ <extends name="java/lang/Object" />
+ <method name="getEmbeddedView(ILandroid/content/Context;)Landroid/view/View;" />
+ <method name="getFullScreenView(ILandroid/content/Context;)Landroid/view/View;" />
+ </class>
+ <class name="android/webkit/SslErrorHandler" since="1">
+ <extends name="android/os/Handler" />
+ <method name="&lt;init>()V" />
+ <method name="cancel()V" />
+ <method name="proceed()V" />
+ </class>
+ <class name="android/webkit/URLUtil" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="composeSearchUrl(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="decode([B)[B" />
+ <method name="guessFileName(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="guessUrl(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="isAboutUrl(Ljava/lang/String;)Z" />
+ <method name="isAssetUrl(Ljava/lang/String;)Z" />
+ <method name="isContentUrl(Ljava/lang/String;)Z" />
+ <method name="isCookielessProxyUrl(Ljava/lang/String;)Z" />
+ <method name="isDataUrl(Ljava/lang/String;)Z" />
+ <method name="isFileUrl(Ljava/lang/String;)Z" />
+ <method name="isHttpUrl(Ljava/lang/String;)Z" />
+ <method name="isHttpsUrl(Ljava/lang/String;)Z" />
+ <method name="isJavaScriptUrl(Ljava/lang/String;)Z" />
+ <method name="isNetworkUrl(Ljava/lang/String;)Z" />
+ <method name="isValidUrl(Ljava/lang/String;)Z" />
+ <method name="stripAnchor(Ljava/lang/String;)Ljava/lang/String;" />
+ </class>
+ <class name="android/webkit/UrlInterceptHandler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getPluginData(Ljava/lang/String;Ljava/util/Map;)Landroid/webkit/PluginData;" since="3" />
+ <method name="service(Ljava/lang/String;Ljava/util/Map;)Landroid/webkit/CacheManager$CacheResult;" />
+ </class>
+ <class name="android/webkit/UrlInterceptRegistry" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getPluginData(Ljava/lang/String;Ljava/util/Map;)Landroid/webkit/PluginData;" since="3" />
+ <method name="getSurrogate(Ljava/lang/String;Ljava/util/Map;)Landroid/webkit/CacheManager$CacheResult;" />
+ <method name="registerHandler(Landroid/webkit/UrlInterceptHandler;)Z" />
+ <method name="setUrlInterceptDisabled(Z)V" />
+ <method name="unregisterHandler(Landroid/webkit/UrlInterceptHandler;)Z" />
+ <method name="urlInterceptDisabled()Z" />
+ </class>
+ <class name="android/webkit/ValueCallback" since="7">
+ <extends name="java/lang/Object" />
+ <method name="onReceiveValue(Ljava/lang/Object;)V" />
+ </class>
+ <class name="android/webkit/WebBackForwardList" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>()V" />
+ <method name="clone()Landroid/webkit/WebBackForwardList;" />
+ <method name="getCurrentIndex()I" />
+ <method name="getCurrentItem()Landroid/webkit/WebHistoryItem;" />
+ <method name="getItemAtIndex(I)Landroid/webkit/WebHistoryItem;" />
+ <method name="getSize()I" />
+ </class>
+ <class name="android/webkit/WebChromeClient" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getDefaultVideoPoster()Landroid/graphics/Bitmap;" since="7" />
+ <method name="getVideoLoadingProgressView()Landroid/view/View;" since="7" />
+ <method name="getVisitedHistory(Landroid/webkit/ValueCallback;)V" since="7" />
+ <method name="onCloseWindow(Landroid/webkit/WebView;)V" />
+ <method name="onConsoleMessage(Landroid/webkit/ConsoleMessage;)Z" since="8" />
+ <method name="onConsoleMessage(Ljava/lang/String;ILjava/lang/String;)V" since="7" />
+ <method name="onCreateWindow(Landroid/webkit/WebView;ZZLandroid/os/Message;)Z" />
+ <method name="onExceededDatabaseQuota(Ljava/lang/String;Ljava/lang/String;JJJLandroid/webkit/WebStorage$QuotaUpdater;)V" since="5" />
+ <method name="onGeolocationPermissionsHidePrompt()V" since="5" />
+ <method name="onGeolocationPermissionsShowPrompt(Ljava/lang/String;Landroid/webkit/GeolocationPermissions$Callback;)V" since="5" />
+ <method name="onHideCustomView()V" since="7" />
+ <method name="onJsAlert(Landroid/webkit/WebView;Ljava/lang/String;Ljava/lang/String;Landroid/webkit/JsResult;)Z" />
+ <method name="onJsBeforeUnload(Landroid/webkit/WebView;Ljava/lang/String;Ljava/lang/String;Landroid/webkit/JsResult;)Z" />
+ <method name="onJsConfirm(Landroid/webkit/WebView;Ljava/lang/String;Ljava/lang/String;Landroid/webkit/JsResult;)Z" />
+ <method name="onJsPrompt(Landroid/webkit/WebView;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/webkit/JsPromptResult;)Z" />
+ <method name="onJsTimeout()Z" since="7" />
+ <method name="onPermissionRequest(Landroid/webkit/PermissionRequest;)V" since="21" />
+ <method name="onPermissionRequestCanceled(Landroid/webkit/PermissionRequest;)V" since="21" />
+ <method name="onProgressChanged(Landroid/webkit/WebView;I)V" />
+ <method name="onReachedMaxAppCacheSize(JJLandroid/webkit/WebStorage$QuotaUpdater;)V" since="7" />
+ <method name="onReceivedIcon(Landroid/webkit/WebView;Landroid/graphics/Bitmap;)V" />
+ <method name="onReceivedTitle(Landroid/webkit/WebView;Ljava/lang/String;)V" />
+ <method name="onReceivedTouchIconUrl(Landroid/webkit/WebView;Ljava/lang/String;Z)V" since="7" />
+ <method name="onRequestFocus(Landroid/webkit/WebView;)V" />
+ <method name="onShowCustomView(Landroid/view/View;ILandroid/webkit/WebChromeClient$CustomViewCallback;)V" since="14" />
+ <method name="onShowCustomView(Landroid/view/View;Landroid/webkit/WebChromeClient$CustomViewCallback;)V" since="7" />
+ <method name="onShowFileChooser(Landroid/webkit/WebView;Landroid/webkit/ValueCallback;Landroid/webkit/WebChromeClient$FileChooserParams;)Z" since="21" />
+ </class>
+ <class name="android/webkit/WebChromeClient$CustomViewCallback" since="7">
+ <extends name="java/lang/Object" />
+ <method name="onCustomViewHidden()V" />
+ </class>
+ <class name="android/webkit/WebChromeClient$FileChooserParams" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="createIntent()Landroid/content/Intent;" />
+ <method name="getAcceptTypes()[Ljava/lang/String;" />
+ <method name="getFilenameHint()Ljava/lang/String;" />
+ <method name="getMode()I" />
+ <method name="getTitle()Ljava/lang/CharSequence;" />
+ <method name="isCaptureEnabled()Z" />
+ <method name="parseResult(ILandroid/content/Intent;)[Landroid/net/Uri;" />
+ <field name="MODE_OPEN" />
+ <field name="MODE_OPEN_MULTIPLE" />
+ <field name="MODE_SAVE" />
+ </class>
+ <class name="android/webkit/WebHistoryItem" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>()V" />
+ <method name="clone()Landroid/webkit/WebHistoryItem;" />
+ <method name="getFavicon()Landroid/graphics/Bitmap;" />
+ <method name="getId()I" />
+ <method name="getOriginalUrl()Ljava/lang/String;" since="3" />
+ <method name="getTitle()Ljava/lang/String;" />
+ <method name="getUrl()Ljava/lang/String;" />
+ </class>
+ <class name="android/webkit/WebIconDatabase" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="close()V" />
+ <method name="getInstance()Landroid/webkit/WebIconDatabase;" />
+ <method name="open(Ljava/lang/String;)V" />
+ <method name="releaseIconForPageUrl(Ljava/lang/String;)V" />
+ <method name="removeAllIcons()V" />
+ <method name="requestIconForPageUrl(Ljava/lang/String;Landroid/webkit/WebIconDatabase$IconListener;)V" />
+ <method name="retainIconForPageUrl(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/webkit/WebIconDatabase$IconListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onReceivedIcon(Ljava/lang/String;Landroid/graphics/Bitmap;)V" />
+ </class>
+ <class name="android/webkit/WebResourceRequest" since="21">
+ <extends name="java/lang/Object" />
+ <method name="getMethod()Ljava/lang/String;" />
+ <method name="getRequestHeaders()Ljava/util/Map;" />
+ <method name="getUrl()Landroid/net/Uri;" />
+ <method name="hasGesture()Z" />
+ <method name="isForMainFrame()Z" />
+ </class>
+ <class name="android/webkit/WebResourceResponse" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/util/Map;Ljava/io/InputStream;)V" since="21" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/io/InputStream;)V" />
+ <method name="getData()Ljava/io/InputStream;" />
+ <method name="getEncoding()Ljava/lang/String;" />
+ <method name="getMimeType()Ljava/lang/String;" />
+ <method name="getReasonPhrase()Ljava/lang/String;" since="21" />
+ <method name="getResponseHeaders()Ljava/util/Map;" since="21" />
+ <method name="getStatusCode()I" since="21" />
+ <method name="setData(Ljava/io/InputStream;)V" />
+ <method name="setEncoding(Ljava/lang/String;)V" />
+ <method name="setMimeType(Ljava/lang/String;)V" />
+ <method name="setResponseHeaders(Ljava/util/Map;)V" since="21" />
+ <method name="setStatusCodeAndReasonPhrase(ILjava/lang/String;)V" since="21" />
+ </class>
+ <class name="android/webkit/WebSettings" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="enableSmoothTransition()Z" since="11" />
+ <method name="getAllowContentAccess()Z" since="11" />
+ <method name="getAllowFileAccess()Z" since="3" />
+ <method name="getAllowFileAccessFromFileURLs()Z" since="16" />
+ <method name="getAllowUniversalAccessFromFileURLs()Z" since="16" />
+ <method name="getBlockNetworkImage()Z" />
+ <method name="getBlockNetworkLoads()Z" since="8" />
+ <method name="getBuiltInZoomControls()Z" since="3" />
+ <method name="getCacheMode()I" />
+ <method name="getCursiveFontFamily()Ljava/lang/String;" />
+ <method name="getDatabaseEnabled()Z" since="5" />
+ <method name="getDatabasePath()Ljava/lang/String;" since="5" />
+ <method name="getDefaultFixedFontSize()I" />
+ <method name="getDefaultFontSize()I" />
+ <method name="getDefaultTextEncodingName()Ljava/lang/String;" />
+ <method name="getDefaultUserAgent(Landroid/content/Context;)Ljava/lang/String;" since="17" />
+ <method name="getDefaultZoom()Landroid/webkit/WebSettings$ZoomDensity;" since="7" />
+ <method name="getDisplayZoomControls()Z" since="11" />
+ <method name="getDomStorageEnabled()Z" since="7" />
+ <method name="getFantasyFontFamily()Ljava/lang/String;" />
+ <method name="getFixedFontFamily()Ljava/lang/String;" />
+ <method name="getJavaScriptCanOpenWindowsAutomatically()Z" />
+ <method name="getJavaScriptEnabled()Z" />
+ <method name="getLayoutAlgorithm()Landroid/webkit/WebSettings$LayoutAlgorithm;" />
+ <method name="getLightTouchEnabled()Z" />
+ <method name="getLoadWithOverviewMode()Z" since="7" />
+ <method name="getLoadsImagesAutomatically()Z" />
+ <method name="getMediaPlaybackRequiresUserGesture()Z" since="17" />
+ <method name="getMinimumFontSize()I" />
+ <method name="getMinimumLogicalFontSize()I" />
+ <method name="getMixedContentMode()I" since="21" />
+ <method name="getNavDump()Z" />
+ <method name="getPluginState()Landroid/webkit/WebSettings$PluginState;" since="8" />
+ <method name="getPluginsEnabled()Z" />
+ <method name="getPluginsPath()Ljava/lang/String;" />
+ <method name="getSansSerifFontFamily()Ljava/lang/String;" />
+ <method name="getSaveFormData()Z" />
+ <method name="getSavePassword()Z" />
+ <method name="getSerifFontFamily()Ljava/lang/String;" />
+ <method name="getStandardFontFamily()Ljava/lang/String;" />
+ <method name="getTextSize()Landroid/webkit/WebSettings$TextSize;" />
+ <method name="getTextZoom()I" since="14" />
+ <method name="getUseDoubleTree()Z" />
+ <method name="getUseWebViewBackgroundForOverscrollBackground()Z" since="9" />
+ <method name="getUseWideViewPort()Z" />
+ <method name="getUserAgent()I" />
+ <method name="getUserAgentString()Ljava/lang/String;" since="3" />
+ <method name="setAllowContentAccess(Z)V" since="11" />
+ <method name="setAllowFileAccess(Z)V" since="3" />
+ <method name="setAllowFileAccessFromFileURLs(Z)V" since="16" />
+ <method name="setAllowUniversalAccessFromFileURLs(Z)V" since="16" />
+ <method name="setAppCacheEnabled(Z)V" since="7" />
+ <method name="setAppCacheMaxSize(J)V" since="7" />
+ <method name="setAppCachePath(Ljava/lang/String;)V" since="7" />
+ <method name="setBlockNetworkImage(Z)V" />
+ <method name="setBlockNetworkLoads(Z)V" since="8" />
+ <method name="setBuiltInZoomControls(Z)V" since="3" />
+ <method name="setCacheMode(I)V" />
+ <method name="setCursiveFontFamily(Ljava/lang/String;)V" />
+ <method name="setDatabaseEnabled(Z)V" since="5" />
+ <method name="setDatabasePath(Ljava/lang/String;)V" since="5" />
+ <method name="setDefaultFixedFontSize(I)V" />
+ <method name="setDefaultFontSize(I)V" />
+ <method name="setDefaultTextEncodingName(Ljava/lang/String;)V" />
+ <method name="setDefaultZoom(Landroid/webkit/WebSettings$ZoomDensity;)V" since="7" />
+ <method name="setDisplayZoomControls(Z)V" since="11" />
+ <method name="setDomStorageEnabled(Z)V" since="7" />
+ <method name="setEnableSmoothTransition(Z)V" since="11" />
+ <method name="setFantasyFontFamily(Ljava/lang/String;)V" />
+ <method name="setFixedFontFamily(Ljava/lang/String;)V" />
+ <method name="setGeolocationDatabasePath(Ljava/lang/String;)V" since="5" />
+ <method name="setGeolocationEnabled(Z)V" since="5" />
+ <method name="setJavaScriptCanOpenWindowsAutomatically(Z)V" />
+ <method name="setJavaScriptEnabled(Z)V" />
+ <method name="setLayoutAlgorithm(Landroid/webkit/WebSettings$LayoutAlgorithm;)V" />
+ <method name="setLightTouchEnabled(Z)V" />
+ <method name="setLoadWithOverviewMode(Z)V" since="7" />
+ <method name="setLoadsImagesAutomatically(Z)V" />
+ <method name="setMediaPlaybackRequiresUserGesture(Z)V" since="17" />
+ <method name="setMinimumFontSize(I)V" />
+ <method name="setMinimumLogicalFontSize(I)V" />
+ <method name="setMixedContentMode(I)V" since="21" />
+ <method name="setNavDump(Z)V" />
+ <method name="setNeedInitialFocus(Z)V" />
+ <method name="setPluginState(Landroid/webkit/WebSettings$PluginState;)V" since="8" />
+ <method name="setPluginsEnabled(Z)V" />
+ <method name="setPluginsPath(Ljava/lang/String;)V" />
+ <method name="setRenderPriority(Landroid/webkit/WebSettings$RenderPriority;)V" />
+ <method name="setSansSerifFontFamily(Ljava/lang/String;)V" />
+ <method name="setSaveFormData(Z)V" />
+ <method name="setSavePassword(Z)V" />
+ <method name="setSerifFontFamily(Ljava/lang/String;)V" />
+ <method name="setStandardFontFamily(Ljava/lang/String;)V" />
+ <method name="setSupportMultipleWindows(Z)V" />
+ <method name="setSupportZoom(Z)V" />
+ <method name="setTextSize(Landroid/webkit/WebSettings$TextSize;)V" />
+ <method name="setTextZoom(I)V" since="14" />
+ <method name="setUseDoubleTree(Z)V" />
+ <method name="setUseWebViewBackgroundForOverscrollBackground(Z)V" since="9" />
+ <method name="setUseWideViewPort(Z)V" />
+ <method name="setUserAgent(I)V" />
+ <method name="setUserAgentString(Ljava/lang/String;)V" since="3" />
+ <method name="supportMultipleWindows()Z" />
+ <method name="supportZoom()Z" />
+ <field name="LOAD_CACHE_ELSE_NETWORK" />
+ <field name="LOAD_CACHE_ONLY" />
+ <field name="LOAD_DEFAULT" />
+ <field name="LOAD_NORMAL" />
+ <field name="LOAD_NO_CACHE" />
+ <field name="MIXED_CONTENT_ALWAYS_ALLOW" since="21" />
+ <field name="MIXED_CONTENT_COMPATIBILITY_MODE" since="21" />
+ <field name="MIXED_CONTENT_NEVER_ALLOW" since="21" />
+ </class>
+ <class name="android/webkit/WebSettings$LayoutAlgorithm" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/webkit/WebSettings$LayoutAlgorithm;" />
+ <method name="values()[Landroid/webkit/WebSettings$LayoutAlgorithm;" />
+ <field name="NARROW_COLUMNS" />
+ <field name="NORMAL" />
+ <field name="SINGLE_COLUMN" />
+ <field name="TEXT_AUTOSIZING" since="19" />
+ </class>
+ <class name="android/webkit/WebSettings$PluginState" since="8">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/webkit/WebSettings$PluginState;" />
+ <method name="values()[Landroid/webkit/WebSettings$PluginState;" />
+ <field name="OFF" />
+ <field name="ON" />
+ <field name="ON_DEMAND" />
+ </class>
+ <class name="android/webkit/WebSettings$RenderPriority" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/webkit/WebSettings$RenderPriority;" />
+ <method name="values()[Landroid/webkit/WebSettings$RenderPriority;" />
+ <field name="HIGH" />
+ <field name="LOW" />
+ <field name="NORMAL" />
+ </class>
+ <class name="android/webkit/WebSettings$TextSize" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/webkit/WebSettings$TextSize;" />
+ <method name="values()[Landroid/webkit/WebSettings$TextSize;" />
+ <field name="LARGER" />
+ <field name="LARGEST" />
+ <field name="NORMAL" />
+ <field name="SMALLER" />
+ <field name="SMALLEST" />
+ </class>
+ <class name="android/webkit/WebSettings$ZoomDensity" since="7">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/webkit/WebSettings$ZoomDensity;" />
+ <method name="values()[Landroid/webkit/WebSettings$ZoomDensity;" />
+ <field name="CLOSE" />
+ <field name="FAR" />
+ <field name="MEDIUM" />
+ </class>
+ <class name="android/webkit/WebStorage" since="5">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="deleteAllData()V" since="7" />
+ <method name="deleteOrigin(Ljava/lang/String;)V" since="7" />
+ <method name="getInstance()Landroid/webkit/WebStorage;" since="7" />
+ <method name="getOrigins(Landroid/webkit/ValueCallback;)V" since="7" />
+ <method name="getQuotaForOrigin(Ljava/lang/String;Landroid/webkit/ValueCallback;)V" since="7" />
+ <method name="getUsageForOrigin(Ljava/lang/String;Landroid/webkit/ValueCallback;)V" since="7" />
+ <method name="setQuotaForOrigin(Ljava/lang/String;J)V" since="7" />
+ </class>
+ <class name="android/webkit/WebStorage$Origin" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getOrigin()Ljava/lang/String;" />
+ <method name="getQuota()J" />
+ <method name="getUsage()J" />
+ </class>
+ <class name="android/webkit/WebStorage$QuotaUpdater" since="5">
+ <extends name="java/lang/Object" />
+ <method name="updateQuota(J)V" />
+ </class>
+ <class name="android/webkit/WebSyncManager" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Runnable" />
+ <method name="&lt;init>(Landroid/content/Context;Ljava/lang/String;)V" />
+ <method name="onSyncInit()V" />
+ <method name="resetSync()V" />
+ <method name="startSync()V" />
+ <method name="stopSync()V" />
+ <method name="sync()V" />
+ <field name="LOGTAG" />
+ <field name="mDataBase" />
+ <field name="mHandler" />
+ </class>
+ <class name="android/webkit/WebView" since="1">
+ <extends name="android/widget/AbsoluteLayout" />
+ <implements name="android/view/ViewGroup$OnHierarchyChangeListener" />
+ <implements name="android/view/ViewTreeObserver$OnGlobalFocusChangeListener" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;IZ)V" since="11" />
+ <method name="addJavascriptInterface(Ljava/lang/Object;Ljava/lang/String;)V" />
+ <method name="canGoBack()Z" />
+ <method name="canGoBackOrForward(I)Z" />
+ <method name="canGoForward()Z" />
+ <method name="canZoomIn()Z" since="11" />
+ <method name="canZoomOut()Z" since="11" />
+ <method name="capturePicture()Landroid/graphics/Picture;" />
+ <method name="clearCache(Z)V" />
+ <method name="clearClientCertPreferences(Ljava/lang/Runnable;)V" since="21" />
+ <method name="clearFormData()V" />
+ <method name="clearHistory()V" />
+ <method name="clearMatches()V" since="3" />
+ <method name="clearSslPreferences()V" />
+ <method name="clearView()V" />
+ <method name="copyBackForwardList()Landroid/webkit/WebBackForwardList;" />
+ <method name="createPrintDocumentAdapter()Landroid/print/PrintDocumentAdapter;" since="19" />
+ <method name="createPrintDocumentAdapter(Ljava/lang/String;)Landroid/print/PrintDocumentAdapter;" since="21" />
+ <method name="debugDump()V" />
+ <method name="destroy()V" />
+ <method name="disablePlatformNotifications()V" />
+ <method name="documentHasImages(Landroid/os/Message;)V" />
+ <method name="emulateShiftHeld()V" since="8" />
+ <method name="enablePlatformNotifications()V" />
+ <method name="enableSlowWholeDocumentDraw()V" since="21" />
+ <method name="evaluateJavascript(Ljava/lang/String;Landroid/webkit/ValueCallback;)V" since="19" />
+ <method name="findAddress(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="findAll(Ljava/lang/String;)I" since="3" />
+ <method name="findAllAsync(Ljava/lang/String;)V" since="16" />
+ <method name="findNext(Z)V" since="3" />
+ <method name="flingScroll(II)V" />
+ <method name="freeMemory()V" since="7" />
+ <method name="getCertificate()Landroid/net/http/SslCertificate;" />
+ <method name="getContentHeight()I" />
+ <method name="getFavicon()Landroid/graphics/Bitmap;" />
+ <method name="getHitTestResult()Landroid/webkit/WebView$HitTestResult;" />
+ <method name="getHttpAuthUsernamePassword(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;" />
+ <method name="getOriginalUrl()Ljava/lang/String;" since="3" />
+ <method name="getPluginList()Landroid/webkit/PluginList;" />
+ <method name="getProgress()I" />
+ <method name="getScale()F" />
+ <method name="getSettings()Landroid/webkit/WebSettings;" />
+ <method name="getTitle()Ljava/lang/String;" />
+ <method name="getUrl()Ljava/lang/String;" />
+ <method name="getVisibleTitleHeight()I" since="11" />
+ <method name="getZoomControls()Landroid/view/View;" />
+ <method name="goBack()V" />
+ <method name="goBackOrForward(I)V" />
+ <method name="goForward()V" />
+ <method name="invokeZoomPicker()V" />
+ <method name="isPrivateBrowsingEnabled()Z" since="11" />
+ <method name="loadData(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="loadDataWithBaseURL(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="loadUrl(Ljava/lang/String;)V" />
+ <method name="loadUrl(Ljava/lang/String;Ljava/util/Map;)V" since="8" />
+ <method name="onPause()V" since="11" />
+ <method name="onResume()V" since="11" />
+ <method name="overlayHorizontalScrollbar()Z" />
+ <method name="overlayVerticalScrollbar()Z" />
+ <method name="pageDown(Z)Z" />
+ <method name="pageUp(Z)Z" />
+ <method name="pauseTimers()V" />
+ <method name="postUrl(Ljava/lang/String;[B)V" since="5" />
+ <method name="refreshPlugins(Z)V" />
+ <method name="reload()V" />
+ <method name="removeJavascriptInterface(Ljava/lang/String;)V" since="11" />
+ <method name="requestFocusNodeHref(Landroid/os/Message;)V" />
+ <method name="requestImageRef(Landroid/os/Message;)V" />
+ <method name="restorePicture(Landroid/os/Bundle;Ljava/io/File;)Z" since="3" />
+ <method name="restoreState(Landroid/os/Bundle;)Landroid/webkit/WebBackForwardList;" />
+ <method name="resumeTimers()V" />
+ <method name="savePassword(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="savePicture(Landroid/os/Bundle;Ljava/io/File;)Z" since="3" />
+ <method name="saveState(Landroid/os/Bundle;)Landroid/webkit/WebBackForwardList;" />
+ <method name="saveWebArchive(Ljava/lang/String;)V" since="11" />
+ <method name="saveWebArchive(Ljava/lang/String;ZLandroid/webkit/ValueCallback;)V" since="11" />
+ <method name="setCertificate(Landroid/net/http/SslCertificate;)V" />
+ <method name="setDownloadListener(Landroid/webkit/DownloadListener;)V" />
+ <method name="setFindListener(Landroid/webkit/WebView$FindListener;)V" since="16" />
+ <method name="setHorizontalScrollbarOverlay(Z)V" />
+ <method name="setHttpAuthUsernamePassword(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="setInitialScale(I)V" />
+ <method name="setMapTrackballToArrowKeys(Z)V" />
+ <method name="setNetworkAvailable(Z)V" since="3" />
+ <method name="setPictureListener(Landroid/webkit/WebView$PictureListener;)V" />
+ <method name="setVerticalScrollbarOverlay(Z)V" />
+ <method name="setWebChromeClient(Landroid/webkit/WebChromeClient;)V" />
+ <method name="setWebContentsDebuggingEnabled(Z)V" since="19" />
+ <method name="setWebViewClient(Landroid/webkit/WebViewClient;)V" />
+ <method name="showFindDialog(Ljava/lang/String;Z)Z" since="11" />
+ <method name="stopLoading()V" />
+ <method name="zoomBy(F)V" since="21" />
+ <method name="zoomIn()Z" />
+ <method name="zoomOut()Z" />
+ <field name="SCHEME_GEO" />
+ <field name="SCHEME_MAILTO" />
+ <field name="SCHEME_TEL" />
+ </class>
+ <class name="android/webkit/WebView$FindListener" since="16">
+ <extends name="java/lang/Object" />
+ <method name="onFindResultReceived(IIZ)V" />
+ </class>
+ <class name="android/webkit/WebView$HitTestResult" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" since="16" />
+ <method name="&lt;init>(Landroid/webkit/WebView;)V" />
+ <method name="getExtra()Ljava/lang/String;" />
+ <method name="getType()I" />
+ <field name="ANCHOR_TYPE" />
+ <field name="EDIT_TEXT_TYPE" />
+ <field name="EMAIL_TYPE" />
+ <field name="GEO_TYPE" />
+ <field name="IMAGE_ANCHOR_TYPE" />
+ <field name="IMAGE_TYPE" />
+ <field name="PHONE_TYPE" />
+ <field name="SRC_ANCHOR_TYPE" />
+ <field name="SRC_IMAGE_ANCHOR_TYPE" />
+ <field name="UNKNOWN_TYPE" />
+ </class>
+ <class name="android/webkit/WebView$PictureListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onNewPicture(Landroid/webkit/WebView;Landroid/graphics/Picture;)V" />
+ </class>
+ <class name="android/webkit/WebView$WebViewTransport" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/webkit/WebView;)V" />
+ <method name="getWebView()Landroid/webkit/WebView;" />
+ <method name="setWebView(Landroid/webkit/WebView;)V" />
+ </class>
+ <class name="android/webkit/WebViewClient" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="doUpdateVisitedHistory(Landroid/webkit/WebView;Ljava/lang/String;Z)V" />
+ <method name="onFormResubmission(Landroid/webkit/WebView;Landroid/os/Message;Landroid/os/Message;)V" />
+ <method name="onLoadResource(Landroid/webkit/WebView;Ljava/lang/String;)V" />
+ <method name="onPageFinished(Landroid/webkit/WebView;Ljava/lang/String;)V" />
+ <method name="onPageStarted(Landroid/webkit/WebView;Ljava/lang/String;Landroid/graphics/Bitmap;)V" />
+ <method name="onReceivedClientCertRequest(Landroid/webkit/WebView;Landroid/webkit/ClientCertRequest;)V" since="21" />
+ <method name="onReceivedError(Landroid/webkit/WebView;ILjava/lang/String;Ljava/lang/String;)V" />
+ <method name="onReceivedHttpAuthRequest(Landroid/webkit/WebView;Landroid/webkit/HttpAuthHandler;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="onReceivedLoginRequest(Landroid/webkit/WebView;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" since="12" />
+ <method name="onReceivedSslError(Landroid/webkit/WebView;Landroid/webkit/SslErrorHandler;Landroid/net/http/SslError;)V" since="8" />
+ <method name="onScaleChanged(Landroid/webkit/WebView;FF)V" />
+ <method name="onTooManyRedirects(Landroid/webkit/WebView;Landroid/os/Message;Landroid/os/Message;)V" />
+ <method name="onUnhandledInputEvent(Landroid/webkit/WebView;Landroid/view/InputEvent;)V" since="21" />
+ <method name="onUnhandledKeyEvent(Landroid/webkit/WebView;Landroid/view/KeyEvent;)V" />
+ <method name="shouldInterceptRequest(Landroid/webkit/WebView;Landroid/webkit/WebResourceRequest;)Landroid/webkit/WebResourceResponse;" since="21" />
+ <method name="shouldInterceptRequest(Landroid/webkit/WebView;Ljava/lang/String;)Landroid/webkit/WebResourceResponse;" since="11" />
+ <method name="shouldOverrideKeyEvent(Landroid/webkit/WebView;Landroid/view/KeyEvent;)Z" />
+ <method name="shouldOverrideUrlLoading(Landroid/webkit/WebView;Ljava/lang/String;)Z" />
+ <field name="ERROR_AUTHENTICATION" since="5" />
+ <field name="ERROR_BAD_URL" since="5" />
+ <field name="ERROR_CONNECT" since="5" />
+ <field name="ERROR_FAILED_SSL_HANDSHAKE" since="5" />
+ <field name="ERROR_FILE" since="5" />
+ <field name="ERROR_FILE_NOT_FOUND" since="5" />
+ <field name="ERROR_HOST_LOOKUP" since="5" />
+ <field name="ERROR_IO" since="5" />
+ <field name="ERROR_PROXY_AUTHENTICATION" since="5" />
+ <field name="ERROR_REDIRECT_LOOP" since="5" />
+ <field name="ERROR_TIMEOUT" since="5" />
+ <field name="ERROR_TOO_MANY_REQUESTS" since="5" />
+ <field name="ERROR_UNKNOWN" since="5" />
+ <field name="ERROR_UNSUPPORTED_AUTH_SCHEME" since="5" />
+ <field name="ERROR_UNSUPPORTED_SCHEME" since="5" />
+ </class>
+ <class name="android/webkit/WebViewDatabase" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="clearFormData()V" />
+ <method name="clearHttpAuthUsernamePassword()V" />
+ <method name="clearUsernamePassword()V" />
+ <method name="getInstance(Landroid/content/Context;)Landroid/webkit/WebViewDatabase;" />
+ <method name="hasFormData()Z" />
+ <method name="hasHttpAuthUsernamePassword()Z" />
+ <method name="hasUsernamePassword()Z" />
+ <field name="LOGTAG" />
+ </class>
+ <class name="android/webkit/WebViewFragment" since="11">
+ <extends name="android/app/Fragment" />
+ <method name="&lt;init>()V" />
+ <method name="getWebView()Landroid/webkit/WebView;" />
+ </class>
+ <class name="android/widget/AbsListView" since="1">
+ <extends name="android/widget/AdapterView" />
+ <implements name="android/text/TextWatcher" />
+ <implements name="android/view/ViewTreeObserver$OnGlobalLayoutListener" />
+ <implements name="android/view/ViewTreeObserver$OnTouchModeChangeListener" />
+ <implements name="android/widget/Filter$FilterListener" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="canScrollList(I)Z" since="19" />
+ <method name="clearChoices()V" since="11" />
+ <method name="clearTextFilter()V" />
+ <method name="deferNotifyDataSetChanged()V" since="14" />
+ <method name="fling(I)V" since="21" />
+ <method name="generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/AbsListView$LayoutParams;" />
+ <method name="getCacheColorHint()I" />
+ <method name="getCheckedItemCount()I" since="11" />
+ <method name="getCheckedItemIds()[J" since="11" />
+ <method name="getCheckedItemPosition()I" since="11" />
+ <method name="getCheckedItemPositions()Landroid/util/SparseBooleanArray;" since="11" />
+ <method name="getChoiceMode()I" since="11" />
+ <method name="getListPaddingBottom()I" />
+ <method name="getListPaddingLeft()I" />
+ <method name="getListPaddingRight()I" />
+ <method name="getListPaddingTop()I" />
+ <method name="getSelector()Landroid/graphics/drawable/Drawable;" />
+ <method name="getTextFilter()Ljava/lang/CharSequence;" since="3" />
+ <method name="getTranscriptMode()I" />
+ <method name="handleDataChanged()V" />
+ <method name="hasTextFilter()Z" />
+ <method name="invalidateViews()V" />
+ <method name="isFastScrollAlwaysVisible()Z" since="11" />
+ <method name="isFastScrollEnabled()Z" since="3" />
+ <method name="isInFilterMode()Z" />
+ <method name="isItemChecked(I)Z" since="11" />
+ <method name="isScrollingCacheEnabled()Z" />
+ <method name="isSmoothScrollbarEnabled()Z" since="3" />
+ <method name="isStackFromBottom()Z" />
+ <method name="isTextFilterEnabled()Z" />
+ <method name="layoutChildren()V" />
+ <method name="onInitializeAccessibilityNodeInfoForItem(Landroid/view/View;ILandroid/view/accessibility/AccessibilityNodeInfo;)V" since="19" />
+ <method name="onRemoteAdapterConnected()Z" since="11" />
+ <method name="onRemoteAdapterDisconnected()V" since="11" />
+ <method name="pointToPosition(II)I" />
+ <method name="pointToRowId(II)J" />
+ <method name="reclaimViews(Ljava/util/List;)V" />
+ <method name="scrollListBy(I)V" since="19" />
+ <method name="setAdapter(Landroid/widget/ListAdapter;)V" since="11" />
+ <method name="setCacheColorHint(I)V" />
+ <method name="setChoiceMode(I)V" since="11" />
+ <method name="setDrawSelectorOnTop(Z)V" />
+ <method name="setFastScrollAlwaysVisible(Z)V" since="11" />
+ <method name="setFastScrollEnabled(Z)V" since="3" />
+ <method name="setFastScrollStyle(I)V" since="21" />
+ <method name="setFilterText(Ljava/lang/String;)V" />
+ <method name="setFriction(F)V" since="11" />
+ <method name="setItemChecked(IZ)V" since="11" />
+ <method name="setMultiChoiceModeListener(Landroid/widget/AbsListView$MultiChoiceModeListener;)V" since="11" />
+ <method name="setOnScrollListener(Landroid/widget/AbsListView$OnScrollListener;)V" />
+ <method name="setRecyclerListener(Landroid/widget/AbsListView$RecyclerListener;)V" />
+ <method name="setRemoteViewsAdapter(Landroid/content/Intent;)V" since="11" />
+ <method name="setScrollIndicators(Landroid/view/View;Landroid/view/View;)V" />
+ <method name="setScrollingCacheEnabled(Z)V" />
+ <method name="setSelectionFromTop(II)V" since="21" />
+ <method name="setSelector(I)V" />
+ <method name="setSelector(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setSmoothScrollbarEnabled(Z)V" since="3" />
+ <method name="setStackFromBottom(Z)V" />
+ <method name="setTextFilterEnabled(Z)V" />
+ <method name="setTranscriptMode(I)V" />
+ <method name="setVelocityScale(F)V" since="11" />
+ <method name="smoothScrollBy(II)V" since="8" />
+ <method name="smoothScrollToPosition(I)V" since="8" />
+ <method name="smoothScrollToPosition(II)V" since="8" />
+ <method name="smoothScrollToPositionFromTop(II)V" since="11" />
+ <method name="smoothScrollToPositionFromTop(III)V" since="11" />
+ <field name="CHOICE_MODE_MULTIPLE" since="11" />
+ <field name="CHOICE_MODE_MULTIPLE_MODAL" since="11" />
+ <field name="CHOICE_MODE_NONE" since="11" />
+ <field name="CHOICE_MODE_SINGLE" since="11" />
+ <field name="TRANSCRIPT_MODE_ALWAYS_SCROLL" />
+ <field name="TRANSCRIPT_MODE_DISABLED" />
+ <field name="TRANSCRIPT_MODE_NORMAL" />
+ </class>
+ <class name="android/widget/AbsListView$LayoutParams" since="1">
+ <extends name="android/view/ViewGroup$LayoutParams" />
+ <method name="&lt;init>(II)V" />
+ <method name="&lt;init>(III)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V" />
+ </class>
+ <class name="android/widget/AbsListView$MultiChoiceModeListener" since="11">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/ActionMode$Callback" />
+ <method name="onItemCheckedStateChanged(Landroid/view/ActionMode;IJZ)V" />
+ </class>
+ <class name="android/widget/AbsListView$OnScrollListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onScroll(Landroid/widget/AbsListView;III)V" />
+ <method name="onScrollStateChanged(Landroid/widget/AbsListView;I)V" />
+ <field name="SCROLL_STATE_FLING" />
+ <field name="SCROLL_STATE_IDLE" />
+ <field name="SCROLL_STATE_TOUCH_SCROLL" />
+ </class>
+ <class name="android/widget/AbsListView$RecyclerListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onMovedToScrapHeap(Landroid/view/View;)V" />
+ </class>
+ <class name="android/widget/AbsListView$SelectionBoundsAdjuster" since="11">
+ <extends name="java/lang/Object" />
+ <method name="adjustListItemSelectionBounds(Landroid/graphics/Rect;)V" />
+ </class>
+ <class name="android/widget/AbsSeekBar" since="1">
+ <extends name="android/widget/ProgressBar" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getKeyProgressIncrement()I" since="3" />
+ <method name="getSplitTrack()Z" since="21" />
+ <method name="getThumb()Landroid/graphics/drawable/Drawable;" since="16" />
+ <method name="getThumbOffset()I" />
+ <method name="getThumbTintList()Landroid/content/res/ColorStateList;" since="21" />
+ <method name="getThumbTintMode()Landroid/graphics/PorterDuff$Mode;" since="21" />
+ <method name="setKeyProgressIncrement(I)V" since="3" />
+ <method name="setSplitTrack(Z)V" since="21" />
+ <method name="setThumb(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setThumbOffset(I)V" />
+ <method name="setThumbTintList(Landroid/content/res/ColorStateList;)V" since="21" />
+ <method name="setThumbTintMode(Landroid/graphics/PorterDuff$Mode;)V" since="21" />
+ </class>
+ <class name="android/widget/AbsSpinner" since="1">
+ <extends name="android/widget/AdapterView" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getAdapter()Landroid/widget/SpinnerAdapter;" />
+ <method name="pointToPosition(II)I" />
+ <method name="setAdapter(Landroid/widget/SpinnerAdapter;)V" />
+ <method name="setSelection(IZ)V" />
+ </class>
+ <class name="android/widget/AbsoluteLayout" since="1">
+ <extends name="android/view/ViewGroup" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ </class>
+ <class name="android/widget/AbsoluteLayout$LayoutParams" since="1">
+ <extends name="android/view/ViewGroup$LayoutParams" />
+ <method name="&lt;init>(IIII)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V" />
+ <method name="debug(Ljava/lang/String;)Ljava/lang/String;" />
+ <field name="x" />
+ <field name="y" />
+ </class>
+ <class name="android/widget/ActionMenuView" since="21">
+ <extends name="android/widget/LinearLayout" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="dismissPopupMenus()V" />
+ <method name="generateDefaultLayoutParams()Landroid/widget/ActionMenuView$LayoutParams;" />
+ <method name="generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/ActionMenuView$LayoutParams;" />
+ <method name="generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroid/widget/ActionMenuView$LayoutParams;" />
+ <method name="getMenu()Landroid/view/Menu;" />
+ <method name="getPopupTheme()I" />
+ <method name="hideOverflowMenu()Z" />
+ <method name="isOverflowMenuShowing()Z" />
+ <method name="setOnMenuItemClickListener(Landroid/widget/ActionMenuView$OnMenuItemClickListener;)V" />
+ <method name="setPopupTheme(I)V" />
+ <method name="showOverflowMenu()Z" />
+ </class>
+ <class name="android/widget/ActionMenuView$LayoutParams" since="21">
+ <extends name="android/widget/LinearLayout$LayoutParams" />
+ <method name="&lt;init>(II)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V" />
+ <method name="&lt;init>(Landroid/widget/ActionMenuView$LayoutParams;)V" />
+ </class>
+ <class name="android/widget/ActionMenuView$OnMenuItemClickListener" since="21">
+ <extends name="java/lang/Object" />
+ <method name="onMenuItemClick(Landroid/view/MenuItem;)Z" />
+ </class>
+ <class name="android/widget/Adapter" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getCount()I" />
+ <method name="getItem(I)Ljava/lang/Object;" />
+ <method name="getItemId(I)J" />
+ <method name="getItemViewType(I)I" />
+ <method name="getView(ILandroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View;" />
+ <method name="getViewTypeCount()I" />
+ <method name="hasStableIds()Z" />
+ <method name="isEmpty()Z" />
+ <method name="registerDataSetObserver(Landroid/database/DataSetObserver;)V" />
+ <method name="unregisterDataSetObserver(Landroid/database/DataSetObserver;)V" />
+ <field name="IGNORE_ITEM_VIEW_TYPE" />
+ <field name="NO_SELECTION" />
+ </class>
+ <class name="android/widget/AdapterView" since="1">
+ <extends name="android/view/ViewGroup" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getAdapter()Landroid/widget/Adapter;" />
+ <method name="getCount()I" />
+ <method name="getEmptyView()Landroid/view/View;" />
+ <method name="getFirstVisiblePosition()I" />
+ <method name="getItemAtPosition(I)Ljava/lang/Object;" />
+ <method name="getItemIdAtPosition(I)J" />
+ <method name="getLastVisiblePosition()I" />
+ <method name="getOnItemClickListener()Landroid/widget/AdapterView$OnItemClickListener;" />
+ <method name="getOnItemLongClickListener()Landroid/widget/AdapterView$OnItemLongClickListener;" />
+ <method name="getOnItemSelectedListener()Landroid/widget/AdapterView$OnItemSelectedListener;" />
+ <method name="getPositionForView(Landroid/view/View;)I" />
+ <method name="getSelectedItem()Ljava/lang/Object;" />
+ <method name="getSelectedItemId()J" />
+ <method name="getSelectedItemPosition()I" />
+ <method name="getSelectedView()Landroid/view/View;" />
+ <method name="performItemClick(Landroid/view/View;IJ)Z" />
+ <method name="setAdapter(Landroid/widget/Adapter;)V" />
+ <method name="setEmptyView(Landroid/view/View;)V" />
+ <method name="setOnItemClickListener(Landroid/widget/AdapterView$OnItemClickListener;)V" />
+ <method name="setOnItemLongClickListener(Landroid/widget/AdapterView$OnItemLongClickListener;)V" />
+ <method name="setOnItemSelectedListener(Landroid/widget/AdapterView$OnItemSelectedListener;)V" />
+ <method name="setSelection(I)V" />
+ <field name="INVALID_POSITION" />
+ <field name="INVALID_ROW_ID" />
+ <field name="ITEM_VIEW_TYPE_HEADER_OR_FOOTER" />
+ <field name="ITEM_VIEW_TYPE_IGNORE" />
+ </class>
+ <class name="android/widget/AdapterView$AdapterContextMenuInfo" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/ContextMenu$ContextMenuInfo" />
+ <method name="&lt;init>(Landroid/view/View;IJ)V" />
+ <field name="id" />
+ <field name="position" />
+ <field name="targetView" />
+ </class>
+ <class name="android/widget/AdapterView$OnItemClickListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onItemClick(Landroid/widget/AdapterView;Landroid/view/View;IJ)V" />
+ </class>
+ <class name="android/widget/AdapterView$OnItemLongClickListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onItemLongClick(Landroid/widget/AdapterView;Landroid/view/View;IJ)Z" />
+ </class>
+ <class name="android/widget/AdapterView$OnItemSelectedListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onItemSelected(Landroid/widget/AdapterView;Landroid/view/View;IJ)V" />
+ <method name="onNothingSelected(Landroid/widget/AdapterView;)V" />
+ </class>
+ <class name="android/widget/AdapterViewAnimator" since="11">
+ <extends name="android/widget/AdapterView" />
+ <implements name="android/widget/Advanceable" since="16" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" since="14" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="advance()V" />
+ <method name="deferNotifyDataSetChanged()V" since="14" />
+ <method name="fyiWillBeAdvancedByHostKThx()V" />
+ <method name="getCurrentView()Landroid/view/View;" />
+ <method name="getDisplayedChild()I" />
+ <method name="getInAnimation()Landroid/animation/ObjectAnimator;" />
+ <method name="getOutAnimation()Landroid/animation/ObjectAnimator;" />
+ <method name="onRemoteAdapterConnected()Z" />
+ <method name="onRemoteAdapterDisconnected()V" />
+ <method name="setAnimateFirstView(Z)V" />
+ <method name="setDisplayedChild(I)V" />
+ <method name="setInAnimation(Landroid/animation/ObjectAnimator;)V" />
+ <method name="setInAnimation(Landroid/content/Context;I)V" />
+ <method name="setOutAnimation(Landroid/animation/ObjectAnimator;)V" />
+ <method name="setOutAnimation(Landroid/content/Context;I)V" />
+ <method name="setRemoteViewsAdapter(Landroid/content/Intent;)V" />
+ <method name="showNext()V" />
+ <method name="showPrevious()V" />
+ </class>
+ <class name="android/widget/AdapterViewFlipper" since="11">
+ <extends name="android/widget/AdapterViewAnimator" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" since="21" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getFlipInterval()I" since="16" />
+ <method name="isAutoStart()Z" />
+ <method name="isFlipping()Z" />
+ <method name="setAutoStart(Z)V" />
+ <method name="setFlipInterval(I)V" />
+ <method name="startFlipping()V" />
+ <method name="stopFlipping()V" />
+ </class>
+ <class name="android/widget/Advanceable" since="16">
+ <extends name="java/lang/Object" />
+ <method name="advance()V" />
+ <method name="fyiWillBeAdvancedByHostKThx()V" />
+ </class>
+ <class name="android/widget/AlphabetIndexer" since="3">
+ <extends name="android/database/DataSetObserver" />
+ <implements name="android/widget/SectionIndexer" />
+ <method name="&lt;init>(Landroid/database/Cursor;ILjava/lang/CharSequence;)V" />
+ <method name="compare(Ljava/lang/String;Ljava/lang/String;)I" />
+ <method name="setCursor(Landroid/database/Cursor;)V" />
+ <field name="mAlphabet" />
+ <field name="mColumnIndex" />
+ <field name="mDataCursor" />
+ </class>
+ <class name="android/widget/AnalogClock" since="1">
+ <extends name="android/view/View" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ </class>
+ <class name="android/widget/ArrayAdapter" since="1">
+ <extends name="android/widget/BaseAdapter" />
+ <implements name="android/widget/Filterable" />
+ <method name="&lt;init>(Landroid/content/Context;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;II)V" />
+ <method name="&lt;init>(Landroid/content/Context;IILjava/util/List;)V" />
+ <method name="&lt;init>(Landroid/content/Context;II[Ljava/lang/Object;)V" />
+ <method name="&lt;init>(Landroid/content/Context;ILjava/util/List;)V" />
+ <method name="&lt;init>(Landroid/content/Context;I[Ljava/lang/Object;)V" />
+ <method name="add(Ljava/lang/Object;)V" />
+ <method name="addAll(Ljava/util/Collection;)V" since="11" />
+ <method name="addAll([Ljava/lang/Object;)V" since="11" />
+ <method name="clear()V" />
+ <method name="createFromResource(Landroid/content/Context;II)Landroid/widget/ArrayAdapter;" />
+ <method name="getContext()Landroid/content/Context;" />
+ <method name="getPosition(Ljava/lang/Object;)I" />
+ <method name="insert(Ljava/lang/Object;I)V" />
+ <method name="remove(Ljava/lang/Object;)V" />
+ <method name="setDropDownViewResource(I)V" />
+ <method name="setNotifyOnChange(Z)V" />
+ <method name="sort(Ljava/util/Comparator;)V" since="3" />
+ </class>
+ <class name="android/widget/AutoCompleteTextView" since="1">
+ <extends name="android/widget/EditText" />
+ <implements name="android/widget/Filter$FilterListener" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="clearListSelection()V" since="3" />
+ <method name="convertSelectionToString(Ljava/lang/Object;)Ljava/lang/CharSequence;" />
+ <method name="dismissDropDown()V" />
+ <method name="enoughToFilter()Z" />
+ <method name="getAdapter()Landroid/widget/ListAdapter;" />
+ <method name="getCompletionHint()Ljava/lang/CharSequence;" since="16" />
+ <method name="getDropDownAnchor()I" since="3" />
+ <method name="getDropDownBackground()Landroid/graphics/drawable/Drawable;" since="5" />
+ <method name="getDropDownHeight()I" since="4" />
+ <method name="getDropDownHorizontalOffset()I" since="5" />
+ <method name="getDropDownVerticalOffset()I" since="5" />
+ <method name="getDropDownWidth()I" since="3" />
+ <method name="getFilter()Landroid/widget/Filter;" />
+ <method name="getItemClickListener()Landroid/widget/AdapterView$OnItemClickListener;" />
+ <method name="getItemSelectedListener()Landroid/widget/AdapterView$OnItemSelectedListener;" />
+ <method name="getListSelection()I" since="3" />
+ <method name="getOnItemClickListener()Landroid/widget/AdapterView$OnItemClickListener;" since="3" />
+ <method name="getOnItemSelectedListener()Landroid/widget/AdapterView$OnItemSelectedListener;" since="3" />
+ <method name="getThreshold()I" />
+ <method name="getValidator()Landroid/widget/AutoCompleteTextView$Validator;" />
+ <method name="isPerformingCompletion()Z" since="3" />
+ <method name="isPopupShowing()Z" />
+ <method name="performCompletion()V" />
+ <method name="performFiltering(Ljava/lang/CharSequence;I)V" />
+ <method name="performValidation()V" />
+ <method name="replaceText(Ljava/lang/CharSequence;)V" />
+ <method name="setAdapter(Landroid/widget/ListAdapter;)V" />
+ <method name="setCompletionHint(Ljava/lang/CharSequence;)V" />
+ <method name="setDropDownAnchor(I)V" since="3" />
+ <method name="setDropDownBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V" since="5" />
+ <method name="setDropDownBackgroundResource(I)V" since="5" />
+ <method name="setDropDownHeight(I)V" since="4" />
+ <method name="setDropDownHorizontalOffset(I)V" since="5" />
+ <method name="setDropDownVerticalOffset(I)V" since="5" />
+ <method name="setDropDownWidth(I)V" since="3" />
+ <method name="setListSelection(I)V" since="3" />
+ <method name="setOnDismissListener(Landroid/widget/AutoCompleteTextView$OnDismissListener;)V" since="17" />
+ <method name="setOnItemClickListener(Landroid/widget/AdapterView$OnItemClickListener;)V" />
+ <method name="setOnItemSelectedListener(Landroid/widget/AdapterView$OnItemSelectedListener;)V" />
+ <method name="setText(Ljava/lang/CharSequence;Z)V" since="17" />
+ <method name="setThreshold(I)V" />
+ <method name="setValidator(Landroid/widget/AutoCompleteTextView$Validator;)V" />
+ <method name="showDropDown()V" />
+ </class>
+ <class name="android/widget/AutoCompleteTextView$OnDismissListener" since="17">
+ <extends name="java/lang/Object" />
+ <method name="onDismiss()V" />
+ </class>
+ <class name="android/widget/AutoCompleteTextView$Validator" since="1">
+ <extends name="java/lang/Object" />
+ <method name="fixText(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;" />
+ <method name="isValid(Ljava/lang/CharSequence;)Z" />
+ </class>
+ <class name="android/widget/BaseAdapter" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/widget/ListAdapter" />
+ <implements name="android/widget/SpinnerAdapter" />
+ <method name="&lt;init>()V" />
+ <method name="notifyDataSetChanged()V" />
+ <method name="notifyDataSetInvalidated()V" />
+ </class>
+ <class name="android/widget/BaseExpandableListAdapter" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/widget/ExpandableListAdapter" />
+ <implements name="android/widget/HeterogeneousExpandableList" since="8" />
+ <method name="&lt;init>()V" />
+ <method name="notifyDataSetChanged()V" />
+ <method name="notifyDataSetInvalidated()V" />
+ </class>
+ <class name="android/widget/Button" since="1">
+ <extends name="android/widget/TextView" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ </class>
+ <class name="android/widget/CalendarView" since="11">
+ <extends name="android/widget/FrameLayout" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getDate()J" />
+ <method name="getDateTextAppearance()I" since="16" />
+ <method name="getFirstDayOfWeek()I" />
+ <method name="getFocusedMonthDateColor()I" since="16" />
+ <method name="getMaxDate()J" />
+ <method name="getMinDate()J" />
+ <method name="getSelectedDateVerticalBar()Landroid/graphics/drawable/Drawable;" since="16" />
+ <method name="getSelectedWeekBackgroundColor()I" since="16" />
+ <method name="getShowWeekNumber()Z" />
+ <method name="getShownWeekCount()I" since="16" />
+ <method name="getUnfocusedMonthDateColor()I" since="16" />
+ <method name="getWeekDayTextAppearance()I" since="16" />
+ <method name="getWeekNumberColor()I" since="16" />
+ <method name="getWeekSeparatorLineColor()I" since="16" />
+ <method name="setDate(J)V" />
+ <method name="setDate(JZZ)V" />
+ <method name="setDateTextAppearance(I)V" since="16" />
+ <method name="setFirstDayOfWeek(I)V" />
+ <method name="setFocusedMonthDateColor(I)V" since="16" />
+ <method name="setMaxDate(J)V" />
+ <method name="setMinDate(J)V" />
+ <method name="setOnDateChangeListener(Landroid/widget/CalendarView$OnDateChangeListener;)V" />
+ <method name="setSelectedDateVerticalBar(I)V" since="16" />
+ <method name="setSelectedDateVerticalBar(Landroid/graphics/drawable/Drawable;)V" since="16" />
+ <method name="setSelectedWeekBackgroundColor(I)V" since="16" />
+ <method name="setShowWeekNumber(Z)V" />
+ <method name="setShownWeekCount(I)V" since="16" />
+ <method name="setUnfocusedMonthDateColor(I)V" since="16" />
+ <method name="setWeekDayTextAppearance(I)V" since="16" />
+ <method name="setWeekNumberColor(I)V" since="16" />
+ <method name="setWeekSeparatorLineColor(I)V" since="16" />
+ </class>
+ <class name="android/widget/CalendarView$OnDateChangeListener" since="11">
+ <extends name="java/lang/Object" />
+ <method name="onSelectedDayChange(Landroid/widget/CalendarView;III)V" />
+ </class>
+ <class name="android/widget/CheckBox" since="1">
+ <extends name="android/widget/CompoundButton" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ </class>
+ <class name="android/widget/Checkable" since="1">
+ <extends name="java/lang/Object" />
+ <method name="isChecked()Z" />
+ <method name="setChecked(Z)V" />
+ <method name="toggle()V" />
+ </class>
+ <class name="android/widget/CheckedTextView" since="1">
+ <extends name="android/widget/TextView" />
+ <implements name="android/widget/Checkable" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getCheckMarkDrawable()Landroid/graphics/drawable/Drawable;" since="16" />
+ <method name="getCheckMarkTintList()Landroid/content/res/ColorStateList;" since="21" />
+ <method name="getCheckMarkTintMode()Landroid/graphics/PorterDuff$Mode;" since="21" />
+ <method name="onPaddingChanged(I)V" since="16" />
+ <method name="setCheckMarkDrawable(I)V" />
+ <method name="setCheckMarkDrawable(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setCheckMarkTintList(Landroid/content/res/ColorStateList;)V" since="21" />
+ <method name="setCheckMarkTintMode(Landroid/graphics/PorterDuff$Mode;)V" since="21" />
+ </class>
+ <class name="android/widget/Chronometer" since="1">
+ <extends name="android/widget/TextView" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getBase()J" />
+ <method name="getFormat()Ljava/lang/String;" />
+ <method name="getOnChronometerTickListener()Landroid/widget/Chronometer$OnChronometerTickListener;" since="3" />
+ <method name="setBase(J)V" />
+ <method name="setFormat(Ljava/lang/String;)V" />
+ <method name="setOnChronometerTickListener(Landroid/widget/Chronometer$OnChronometerTickListener;)V" since="3" />
+ <method name="start()V" />
+ <method name="stop()V" />
+ </class>
+ <class name="android/widget/Chronometer$OnChronometerTickListener" since="3">
+ <extends name="java/lang/Object" />
+ <method name="onChronometerTick(Landroid/widget/Chronometer;)V" />
+ </class>
+ <class name="android/widget/CompoundButton" since="1">
+ <extends name="android/widget/Button" />
+ <implements name="android/widget/Checkable" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getButtonTintList()Landroid/content/res/ColorStateList;" since="21" />
+ <method name="getButtonTintMode()Landroid/graphics/PorterDuff$Mode;" since="21" />
+ <method name="setButtonDrawable(I)V" />
+ <method name="setButtonDrawable(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setButtonTintList(Landroid/content/res/ColorStateList;)V" since="21" />
+ <method name="setButtonTintMode(Landroid/graphics/PorterDuff$Mode;)V" since="21" />
+ <method name="setOnCheckedChangeListener(Landroid/widget/CompoundButton$OnCheckedChangeListener;)V" />
+ </class>
+ <class name="android/widget/CompoundButton$OnCheckedChangeListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onCheckedChanged(Landroid/widget/CompoundButton;Z)V" />
+ </class>
+ <class name="android/widget/CursorAdapter" since="1">
+ <extends name="android/widget/BaseAdapter" />
+ <implements name="android/widget/Filterable" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/database/Cursor;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/database/Cursor;I)V" since="11" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/database/Cursor;Z)V" />
+ <method name="bindView(Landroid/view/View;Landroid/content/Context;Landroid/database/Cursor;)V" />
+ <method name="changeCursor(Landroid/database/Cursor;)V" />
+ <method name="convertToString(Landroid/database/Cursor;)Ljava/lang/CharSequence;" />
+ <method name="getCursor()Landroid/database/Cursor;" />
+ <method name="getFilterQueryProvider()Landroid/widget/FilterQueryProvider;" />
+ <method name="init(Landroid/content/Context;Landroid/database/Cursor;Z)V" />
+ <method name="newDropDownView(Landroid/content/Context;Landroid/database/Cursor;Landroid/view/ViewGroup;)Landroid/view/View;" />
+ <method name="newView(Landroid/content/Context;Landroid/database/Cursor;Landroid/view/ViewGroup;)Landroid/view/View;" />
+ <method name="onContentChanged()V" since="3" />
+ <method name="runQueryOnBackgroundThread(Ljava/lang/CharSequence;)Landroid/database/Cursor;" />
+ <method name="setFilterQueryProvider(Landroid/widget/FilterQueryProvider;)V" />
+ <method name="swapCursor(Landroid/database/Cursor;)Landroid/database/Cursor;" since="11" />
+ <field name="FLAG_AUTO_REQUERY" since="11" />
+ <field name="FLAG_REGISTER_CONTENT_OBSERVER" since="11" />
+ </class>
+ <class name="android/widget/CursorTreeAdapter" since="1">
+ <extends name="android/widget/BaseExpandableListAdapter" />
+ <implements name="android/widget/Filterable" />
+ <method name="&lt;init>(Landroid/database/Cursor;Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/database/Cursor;Landroid/content/Context;Z)V" />
+ <method name="bindChildView(Landroid/view/View;Landroid/content/Context;Landroid/database/Cursor;Z)V" />
+ <method name="bindGroupView(Landroid/view/View;Landroid/content/Context;Landroid/database/Cursor;Z)V" />
+ <method name="changeCursor(Landroid/database/Cursor;)V" />
+ <method name="convertToString(Landroid/database/Cursor;)Ljava/lang/String;" />
+ <method name="getChild(II)Landroid/database/Cursor;" />
+ <method name="getChildrenCursor(Landroid/database/Cursor;)Landroid/database/Cursor;" />
+ <method name="getCursor()Landroid/database/Cursor;" />
+ <method name="getFilterQueryProvider()Landroid/widget/FilterQueryProvider;" />
+ <method name="getGroup(I)Landroid/database/Cursor;" />
+ <method name="newChildView(Landroid/content/Context;Landroid/database/Cursor;ZLandroid/view/ViewGroup;)Landroid/view/View;" />
+ <method name="newGroupView(Landroid/content/Context;Landroid/database/Cursor;ZLandroid/view/ViewGroup;)Landroid/view/View;" />
+ <method name="notifyDataSetChanged(Z)V" />
+ <method name="runQueryOnBackgroundThread(Ljava/lang/CharSequence;)Landroid/database/Cursor;" />
+ <method name="setChildrenCursor(ILandroid/database/Cursor;)V" />
+ <method name="setFilterQueryProvider(Landroid/widget/FilterQueryProvider;)V" />
+ <method name="setGroupCursor(Landroid/database/Cursor;)V" />
+ </class>
+ <class name="android/widget/DatePicker" since="1">
+ <extends name="android/widget/FrameLayout" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getCalendarView()Landroid/widget/CalendarView;" since="12" />
+ <method name="getCalendarViewShown()Z" since="11" />
+ <method name="getDayOfMonth()I" />
+ <method name="getFirstDayOfWeek()I" since="21" />
+ <method name="getMaxDate()J" since="11" />
+ <method name="getMinDate()J" since="11" />
+ <method name="getMonth()I" />
+ <method name="getSpinnersShown()Z" since="11" />
+ <method name="getYear()I" />
+ <method name="init(IIILandroid/widget/DatePicker$OnDateChangedListener;)V" />
+ <method name="setCalendarViewShown(Z)V" since="11" />
+ <method name="setFirstDayOfWeek(I)V" since="21" />
+ <method name="setMaxDate(J)V" since="11" />
+ <method name="setMinDate(J)V" since="11" />
+ <method name="setSpinnersShown(Z)V" since="11" />
+ <method name="updateDate(III)V" />
+ </class>
+ <class name="android/widget/DatePicker$OnDateChangedListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onDateChanged(Landroid/widget/DatePicker;III)V" />
+ </class>
+ <class name="android/widget/DialerFilter" since="1">
+ <extends name="android/widget/RelativeLayout" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="append(Ljava/lang/String;)V" />
+ <method name="clearText()V" />
+ <method name="getDigits()Ljava/lang/CharSequence;" />
+ <method name="getFilterText()Ljava/lang/CharSequence;" />
+ <method name="getLetters()Ljava/lang/CharSequence;" />
+ <method name="getMode()I" />
+ <method name="isQwertyKeyboard()Z" />
+ <method name="onModeChange(II)V" />
+ <method name="removeFilterWatcher(Landroid/text/TextWatcher;)V" />
+ <method name="setDigitsWatcher(Landroid/text/TextWatcher;)V" />
+ <method name="setFilterWatcher(Landroid/text/TextWatcher;)V" />
+ <method name="setLettersWatcher(Landroid/text/TextWatcher;)V" />
+ <method name="setMode(I)V" />
+ <field name="DIGITS_AND_LETTERS" />
+ <field name="DIGITS_AND_LETTERS_NO_DIGITS" />
+ <field name="DIGITS_AND_LETTERS_NO_LETTERS" />
+ <field name="DIGITS_ONLY" />
+ <field name="LETTERS_ONLY" />
+ </class>
+ <class name="android/widget/DigitalClock" since="1">
+ <extends name="android/widget/TextView" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ </class>
+ <class name="android/widget/EdgeEffect" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="draw(Landroid/graphics/Canvas;)Z" />
+ <method name="finish()V" />
+ <method name="getColor()I" since="21" />
+ <method name="getMaxHeight()I" since="21" />
+ <method name="isFinished()Z" />
+ <method name="onAbsorb(I)V" />
+ <method name="onPull(F)V" />
+ <method name="onPull(FF)V" since="21" />
+ <method name="onRelease()V" />
+ <method name="setColor(I)V" since="21" />
+ <method name="setSize(II)V" />
+ </class>
+ <class name="android/widget/EditText" since="1">
+ <extends name="android/widget/TextView" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="extendSelection(I)V" />
+ <method name="getText()Landroid/text/Editable;" />
+ <method name="selectAll()V" />
+ <method name="setSelection(I)V" />
+ <method name="setSelection(II)V" />
+ </class>
+ <class name="android/widget/ExpandableListAdapter" since="1">
+ <extends name="java/lang/Object" />
+ <method name="areAllItemsEnabled()Z" />
+ <method name="getChild(II)Ljava/lang/Object;" />
+ <method name="getChildId(II)J" />
+ <method name="getChildView(IIZLandroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View;" />
+ <method name="getChildrenCount(I)I" />
+ <method name="getCombinedChildId(JJ)J" />
+ <method name="getCombinedGroupId(J)J" />
+ <method name="getGroup(I)Ljava/lang/Object;" />
+ <method name="getGroupCount()I" />
+ <method name="getGroupId(I)J" />
+ <method name="getGroupView(IZLandroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View;" />
+ <method name="hasStableIds()Z" />
+ <method name="isChildSelectable(II)Z" />
+ <method name="isEmpty()Z" />
+ <method name="onGroupCollapsed(I)V" />
+ <method name="onGroupExpanded(I)V" />
+ <method name="registerDataSetObserver(Landroid/database/DataSetObserver;)V" />
+ <method name="unregisterDataSetObserver(Landroid/database/DataSetObserver;)V" />
+ </class>
+ <class name="android/widget/ExpandableListView" since="1">
+ <extends name="android/widget/ListView" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="collapseGroup(I)Z" />
+ <method name="expandGroup(I)Z" />
+ <method name="expandGroup(IZ)Z" since="14" />
+ <method name="getExpandableListAdapter()Landroid/widget/ExpandableListAdapter;" />
+ <method name="getExpandableListPosition(I)J" />
+ <method name="getFlatListPosition(J)I" />
+ <method name="getPackedPositionChild(J)I" />
+ <method name="getPackedPositionForChild(II)J" />
+ <method name="getPackedPositionForGroup(I)J" />
+ <method name="getPackedPositionGroup(J)I" />
+ <method name="getPackedPositionType(J)I" />
+ <method name="getSelectedId()J" />
+ <method name="getSelectedPosition()J" />
+ <method name="isGroupExpanded(I)Z" />
+ <method name="setAdapter(Landroid/widget/ExpandableListAdapter;)V" />
+ <method name="setChildDivider(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setChildIndicator(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setChildIndicatorBounds(II)V" />
+ <method name="setChildIndicatorBoundsRelative(II)V" since="18" />
+ <method name="setGroupIndicator(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setIndicatorBounds(II)V" />
+ <method name="setIndicatorBoundsRelative(II)V" since="18" />
+ <method name="setOnChildClickListener(Landroid/widget/ExpandableListView$OnChildClickListener;)V" />
+ <method name="setOnGroupClickListener(Landroid/widget/ExpandableListView$OnGroupClickListener;)V" />
+ <method name="setOnGroupCollapseListener(Landroid/widget/ExpandableListView$OnGroupCollapseListener;)V" />
+ <method name="setOnGroupExpandListener(Landroid/widget/ExpandableListView$OnGroupExpandListener;)V" />
+ <method name="setSelectedChild(IIZ)Z" />
+ <method name="setSelectedGroup(I)V" />
+ <field name="CHILD_INDICATOR_INHERIT" />
+ <field name="PACKED_POSITION_TYPE_CHILD" />
+ <field name="PACKED_POSITION_TYPE_GROUP" />
+ <field name="PACKED_POSITION_TYPE_NULL" />
+ <field name="PACKED_POSITION_VALUE_NULL" />
+ </class>
+ <class name="android/widget/ExpandableListView$ExpandableListContextMenuInfo" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/ContextMenu$ContextMenuInfo" />
+ <method name="&lt;init>(Landroid/view/View;JJ)V" />
+ <field name="id" />
+ <field name="packedPosition" />
+ <field name="targetView" />
+ </class>
+ <class name="android/widget/ExpandableListView$OnChildClickListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onChildClick(Landroid/widget/ExpandableListView;Landroid/view/View;IIJ)Z" />
+ </class>
+ <class name="android/widget/ExpandableListView$OnGroupClickListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onGroupClick(Landroid/widget/ExpandableListView;Landroid/view/View;IJ)Z" />
+ </class>
+ <class name="android/widget/ExpandableListView$OnGroupCollapseListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onGroupCollapse(I)V" />
+ </class>
+ <class name="android/widget/ExpandableListView$OnGroupExpandListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onGroupExpand(I)V" />
+ </class>
+ <class name="android/widget/Filter" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="convertResultToString(Ljava/lang/Object;)Ljava/lang/CharSequence;" />
+ <method name="filter(Ljava/lang/CharSequence;)V" />
+ <method name="filter(Ljava/lang/CharSequence;Landroid/widget/Filter$FilterListener;)V" />
+ <method name="performFiltering(Ljava/lang/CharSequence;)Landroid/widget/Filter$FilterResults;" />
+ <method name="publishResults(Ljava/lang/CharSequence;Landroid/widget/Filter$FilterResults;)V" />
+ </class>
+ <class name="android/widget/Filter$FilterListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onFilterComplete(I)V" />
+ </class>
+ <class name="android/widget/Filter$FilterResults" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="count" />
+ <field name="values" />
+ </class>
+ <class name="android/widget/FilterQueryProvider" since="1">
+ <extends name="java/lang/Object" />
+ <method name="runQuery(Ljava/lang/CharSequence;)Landroid/database/Cursor;" />
+ </class>
+ <class name="android/widget/Filterable" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getFilter()Landroid/widget/Filter;" />
+ </class>
+ <class name="android/widget/FrameLayout" since="1">
+ <extends name="android/view/ViewGroup" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="generateDefaultLayoutParams()Landroid/widget/FrameLayout$LayoutParams;" />
+ <method name="generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/FrameLayout$LayoutParams;" />
+ <method name="getConsiderGoneChildrenWhenMeasuring()Z" />
+ <method name="getForeground()Landroid/graphics/drawable/Drawable;" />
+ <method name="getForegroundGravity()I" since="16" />
+ <method name="getForegroundTintList()Landroid/content/res/ColorStateList;" since="21" />
+ <method name="getForegroundTintMode()Landroid/graphics/PorterDuff$Mode;" since="21" />
+ <method name="getMeasureAllChildren()Z" since="14" />
+ <method name="setForeground(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setForegroundGravity(I)V" />
+ <method name="setForegroundTintList(Landroid/content/res/ColorStateList;)V" since="21" />
+ <method name="setForegroundTintMode(Landroid/graphics/PorterDuff$Mode;)V" since="21" />
+ <method name="setMeasureAllChildren(Z)V" />
+ </class>
+ <class name="android/widget/FrameLayout$LayoutParams" since="1">
+ <extends name="android/view/ViewGroup$MarginLayoutParams" />
+ <method name="&lt;init>(II)V" />
+ <method name="&lt;init>(III)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V" />
+ <method name="&lt;init>(Landroid/view/ViewGroup$MarginLayoutParams;)V" />
+ <method name="&lt;init>(Landroid/widget/FrameLayout$LayoutParams;)V" since="19" />
+ <field name="gravity" />
+ </class>
+ <class name="android/widget/Gallery" since="1">
+ <extends name="android/widget/AbsSpinner" />
+ <implements name="android/view/GestureDetector$OnGestureListener" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="setAnimationDuration(I)V" />
+ <method name="setCallbackDuringFling(Z)V" />
+ <method name="setGravity(I)V" />
+ <method name="setSpacing(I)V" />
+ <method name="setUnselectedAlpha(F)V" />
+ </class>
+ <class name="android/widget/Gallery$LayoutParams" since="1">
+ <extends name="android/view/ViewGroup$LayoutParams" />
+ <method name="&lt;init>(II)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V" />
+ </class>
+ <class name="android/widget/GridLayout" since="14">
+ <extends name="android/view/ViewGroup" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="generateDefaultLayoutParams()Landroid/widget/GridLayout$LayoutParams;" />
+ <method name="generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/GridLayout$LayoutParams;" />
+ <method name="generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroid/widget/GridLayout$LayoutParams;" />
+ <method name="getAlignmentMode()I" />
+ <method name="getColumnCount()I" />
+ <method name="getOrientation()I" />
+ <method name="getRowCount()I" />
+ <method name="getUseDefaultMargins()Z" />
+ <method name="isColumnOrderPreserved()Z" />
+ <method name="isRowOrderPreserved()Z" />
+ <method name="setAlignmentMode(I)V" />
+ <method name="setColumnCount(I)V" />
+ <method name="setColumnOrderPreserved(Z)V" />
+ <method name="setOrientation(I)V" />
+ <method name="setRowCount(I)V" />
+ <method name="setRowOrderPreserved(Z)V" />
+ <method name="setUseDefaultMargins(Z)V" />
+ <method name="spec(I)Landroid/widget/GridLayout$Spec;" />
+ <method name="spec(IF)Landroid/widget/GridLayout$Spec;" since="21" />
+ <method name="spec(II)Landroid/widget/GridLayout$Spec;" />
+ <method name="spec(IIF)Landroid/widget/GridLayout$Spec;" since="21" />
+ <method name="spec(IILandroid/widget/GridLayout$Alignment;)Landroid/widget/GridLayout$Spec;" />
+ <method name="spec(IILandroid/widget/GridLayout$Alignment;F)Landroid/widget/GridLayout$Spec;" since="21" />
+ <method name="spec(ILandroid/widget/GridLayout$Alignment;)Landroid/widget/GridLayout$Spec;" />
+ <method name="spec(ILandroid/widget/GridLayout$Alignment;F)Landroid/widget/GridLayout$Spec;" since="21" />
+ <field name="ALIGN_BOUNDS" />
+ <field name="ALIGN_MARGINS" />
+ <field name="BASELINE" />
+ <field name="BOTTOM" />
+ <field name="CENTER" />
+ <field name="END" since="16" />
+ <field name="FILL" />
+ <field name="HORIZONTAL" />
+ <field name="LEFT" />
+ <field name="RIGHT" />
+ <field name="START" since="16" />
+ <field name="TOP" />
+ <field name="UNDEFINED" />
+ <field name="VERTICAL" />
+ </class>
+ <class name="android/widget/GridLayout$Alignment" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/widget/GridLayout$LayoutParams" since="14">
+ <extends name="android/view/ViewGroup$MarginLayoutParams" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V" />
+ <method name="&lt;init>(Landroid/view/ViewGroup$MarginLayoutParams;)V" />
+ <method name="&lt;init>(Landroid/widget/GridLayout$LayoutParams;)V" />
+ <method name="&lt;init>(Landroid/widget/GridLayout$Spec;Landroid/widget/GridLayout$Spec;)V" />
+ <method name="setGravity(I)V" />
+ <field name="columnSpec" />
+ <field name="rowSpec" />
+ </class>
+ <class name="android/widget/GridLayout$Spec" since="14">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/widget/GridView" since="1">
+ <extends name="android/widget/AbsListView" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getAdapter()Landroid/widget/ListAdapter;" />
+ <method name="getColumnWidth()I" since="16" />
+ <method name="getGravity()I" since="16" />
+ <method name="getHorizontalSpacing()I" since="16" />
+ <method name="getNumColumns()I" since="11" />
+ <method name="getRequestedColumnWidth()I" since="16" />
+ <method name="getRequestedHorizontalSpacing()I" since="16" />
+ <method name="getStretchMode()I" />
+ <method name="getVerticalSpacing()I" since="16" />
+ <method name="setAdapter(Landroid/widget/ListAdapter;)V" />
+ <method name="setColumnWidth(I)V" />
+ <method name="setGravity(I)V" />
+ <method name="setHorizontalSpacing(I)V" />
+ <method name="setNumColumns(I)V" />
+ <method name="setStretchMode(I)V" />
+ <method name="setVerticalSpacing(I)V" />
+ <method name="smoothScrollByOffset(I)V" since="11" />
+ <field name="AUTO_FIT" />
+ <field name="NO_STRETCH" />
+ <field name="STRETCH_COLUMN_WIDTH" />
+ <field name="STRETCH_SPACING" />
+ <field name="STRETCH_SPACING_UNIFORM" since="3" />
+ </class>
+ <class name="android/widget/HeaderViewListAdapter" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/widget/Filterable" />
+ <implements name="android/widget/WrapperListAdapter" />
+ <method name="&lt;init>(Ljava/util/ArrayList;Ljava/util/ArrayList;Landroid/widget/ListAdapter;)V" />
+ <method name="getFootersCount()I" />
+ <method name="getHeadersCount()I" />
+ <method name="removeFooter(Landroid/view/View;)Z" />
+ <method name="removeHeader(Landroid/view/View;)Z" />
+ </class>
+ <class name="android/widget/HeterogeneousExpandableList" since="8">
+ <extends name="java/lang/Object" />
+ <method name="getChildType(II)I" />
+ <method name="getChildTypeCount()I" />
+ <method name="getGroupType(I)I" />
+ <method name="getGroupTypeCount()I" />
+ </class>
+ <class name="android/widget/HorizontalScrollView" since="3">
+ <extends name="android/widget/FrameLayout" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="arrowScroll(I)Z" />
+ <method name="computeScrollDeltaToGetChildRectOnScreen(Landroid/graphics/Rect;)I" />
+ <method name="executeKeyEvent(Landroid/view/KeyEvent;)Z" />
+ <method name="fling(I)V" />
+ <method name="fullScroll(I)Z" />
+ <method name="getMaxScrollAmount()I" />
+ <method name="isFillViewport()Z" />
+ <method name="isSmoothScrollingEnabled()Z" />
+ <method name="pageScroll(I)Z" />
+ <method name="setFillViewport(Z)V" />
+ <method name="setSmoothScrollingEnabled(Z)V" />
+ <method name="smoothScrollBy(II)V" />
+ <method name="smoothScrollTo(II)V" />
+ </class>
+ <class name="android/widget/ImageButton" since="1">
+ <extends name="android/widget/ImageView" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ </class>
+ <class name="android/widget/ImageSwitcher" since="1">
+ <extends name="android/widget/ViewSwitcher" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="setImageDrawable(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setImageResource(I)V" />
+ <method name="setImageURI(Landroid/net/Uri;)V" />
+ </class>
+ <class name="android/widget/ImageView" since="1">
+ <extends name="android/view/View" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="clearColorFilter()V" />
+ <method name="getAdjustViewBounds()Z" since="16" />
+ <method name="getBaselineAlignBottom()Z" since="11" />
+ <method name="getColorFilter()Landroid/graphics/ColorFilter;" since="16" />
+ <method name="getCropToPadding()Z" since="16" />
+ <method name="getDrawable()Landroid/graphics/drawable/Drawable;" />
+ <method name="getImageAlpha()I" since="16" />
+ <method name="getImageMatrix()Landroid/graphics/Matrix;" />
+ <method name="getImageTintList()Landroid/content/res/ColorStateList;" since="21" />
+ <method name="getImageTintMode()Landroid/graphics/PorterDuff$Mode;" since="21" />
+ <method name="getMaxHeight()I" since="16" />
+ <method name="getMaxWidth()I" since="16" />
+ <method name="getScaleType()Landroid/widget/ImageView$ScaleType;" />
+ <method name="setAdjustViewBounds(Z)V" />
+ <method name="setAlpha(I)V" />
+ <method name="setBaseline(I)V" since="11" />
+ <method name="setBaselineAlignBottom(Z)V" since="11" />
+ <method name="setColorFilter(I)V" since="8" />
+ <method name="setColorFilter(ILandroid/graphics/PorterDuff$Mode;)V" />
+ <method name="setColorFilter(Landroid/graphics/ColorFilter;)V" />
+ <method name="setCropToPadding(Z)V" since="16" />
+ <method name="setFrame(IIII)Z" />
+ <method name="setImageAlpha(I)V" since="16" />
+ <method name="setImageBitmap(Landroid/graphics/Bitmap;)V" />
+ <method name="setImageDrawable(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setImageLevel(I)V" />
+ <method name="setImageMatrix(Landroid/graphics/Matrix;)V" />
+ <method name="setImageResource(I)V" />
+ <method name="setImageState([IZ)V" />
+ <method name="setImageTintList(Landroid/content/res/ColorStateList;)V" since="21" />
+ <method name="setImageTintMode(Landroid/graphics/PorterDuff$Mode;)V" since="21" />
+ <method name="setImageURI(Landroid/net/Uri;)V" />
+ <method name="setMaxHeight(I)V" />
+ <method name="setMaxWidth(I)V" />
+ <method name="setScaleType(Landroid/widget/ImageView$ScaleType;)V" />
+ </class>
+ <class name="android/widget/ImageView$ScaleType" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/widget/ImageView$ScaleType;" />
+ <method name="values()[Landroid/widget/ImageView$ScaleType;" />
+ <field name="CENTER" />
+ <field name="CENTER_CROP" />
+ <field name="CENTER_INSIDE" />
+ <field name="FIT_CENTER" />
+ <field name="FIT_END" />
+ <field name="FIT_START" />
+ <field name="FIT_XY" />
+ <field name="MATRIX" />
+ </class>
+ <class name="android/widget/LinearLayout" since="1">
+ <extends name="android/view/ViewGroup" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" since="11" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="generateDefaultLayoutParams()Landroid/widget/LinearLayout$LayoutParams;" />
+ <method name="generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/LinearLayout$LayoutParams;" />
+ <method name="generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroid/widget/LinearLayout$LayoutParams;" />
+ <method name="getBaselineAlignedChildIndex()I" />
+ <method name="getDividerDrawable()Landroid/graphics/drawable/Drawable;" since="16" />
+ <method name="getDividerPadding()I" since="14" />
+ <method name="getOrientation()I" />
+ <method name="getShowDividers()I" since="11" />
+ <method name="getWeightSum()F" />
+ <method name="isBaselineAligned()Z" />
+ <method name="isMeasureWithLargestChildEnabled()Z" since="11" />
+ <method name="setBaselineAligned(Z)V" />
+ <method name="setBaselineAlignedChildIndex(I)V" />
+ <method name="setDividerDrawable(Landroid/graphics/drawable/Drawable;)V" since="11" />
+ <method name="setDividerPadding(I)V" since="14" />
+ <method name="setGravity(I)V" />
+ <method name="setHorizontalGravity(I)V" />
+ <method name="setMeasureWithLargestChildEnabled(Z)V" since="11" />
+ <method name="setOrientation(I)V" />
+ <method name="setShowDividers(I)V" since="11" />
+ <method name="setVerticalGravity(I)V" />
+ <method name="setWeightSum(F)V" />
+ <field name="HORIZONTAL" />
+ <field name="SHOW_DIVIDER_BEGINNING" since="11" />
+ <field name="SHOW_DIVIDER_END" since="11" />
+ <field name="SHOW_DIVIDER_MIDDLE" since="11" />
+ <field name="SHOW_DIVIDER_NONE" since="11" />
+ <field name="VERTICAL" />
+ </class>
+ <class name="android/widget/LinearLayout$LayoutParams" since="1">
+ <extends name="android/view/ViewGroup$MarginLayoutParams" />
+ <method name="&lt;init>(II)V" />
+ <method name="&lt;init>(IIF)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V" />
+ <method name="&lt;init>(Landroid/view/ViewGroup$MarginLayoutParams;)V" />
+ <method name="&lt;init>(Landroid/widget/LinearLayout$LayoutParams;)V" since="19" />
+ <method name="debug(Ljava/lang/String;)Ljava/lang/String;" />
+ <field name="gravity" />
+ <field name="weight" />
+ </class>
+ <class name="android/widget/ListAdapter" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/widget/Adapter" />
+ <method name="areAllItemsEnabled()Z" />
+ <method name="isEnabled(I)Z" />
+ </class>
+ <class name="android/widget/ListPopupWindow" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" />
+ <method name="clearListSelection()V" />
+ <method name="createDragToOpenListener(Landroid/view/View;)Landroid/view/View$OnTouchListener;" since="19" />
+ <method name="dismiss()V" />
+ <method name="getAnchorView()Landroid/view/View;" />
+ <method name="getAnimationStyle()I" />
+ <method name="getBackground()Landroid/graphics/drawable/Drawable;" />
+ <method name="getHeight()I" />
+ <method name="getHorizontalOffset()I" />
+ <method name="getInputMethodMode()I" />
+ <method name="getListView()Landroid/widget/ListView;" />
+ <method name="getPromptPosition()I" />
+ <method name="getSelectedItem()Ljava/lang/Object;" />
+ <method name="getSelectedItemId()J" />
+ <method name="getSelectedItemPosition()I" />
+ <method name="getSelectedView()Landroid/view/View;" />
+ <method name="getSoftInputMode()I" />
+ <method name="getVerticalOffset()I" />
+ <method name="getWidth()I" />
+ <method name="isInputMethodNotNeeded()Z" />
+ <method name="isModal()Z" />
+ <method name="isShowing()Z" />
+ <method name="onKeyDown(ILandroid/view/KeyEvent;)Z" />
+ <method name="onKeyPreIme(ILandroid/view/KeyEvent;)Z" />
+ <method name="onKeyUp(ILandroid/view/KeyEvent;)Z" />
+ <method name="performItemClick(I)Z" />
+ <method name="postShow()V" />
+ <method name="setAdapter(Landroid/widget/ListAdapter;)V" />
+ <method name="setAnchorView(Landroid/view/View;)V" />
+ <method name="setAnimationStyle(I)V" />
+ <method name="setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setContentWidth(I)V" />
+ <method name="setDropDownGravity(I)V" since="19" />
+ <method name="setHeight(I)V" />
+ <method name="setHorizontalOffset(I)V" />
+ <method name="setInputMethodMode(I)V" />
+ <method name="setListSelector(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setModal(Z)V" />
+ <method name="setOnDismissListener(Landroid/widget/PopupWindow$OnDismissListener;)V" />
+ <method name="setOnItemClickListener(Landroid/widget/AdapterView$OnItemClickListener;)V" />
+ <method name="setOnItemSelectedListener(Landroid/widget/AdapterView$OnItemSelectedListener;)V" />
+ <method name="setPromptPosition(I)V" />
+ <method name="setPromptView(Landroid/view/View;)V" />
+ <method name="setSelection(I)V" />
+ <method name="setSoftInputMode(I)V" />
+ <method name="setVerticalOffset(I)V" />
+ <method name="setWidth(I)V" />
+ <method name="show()V" />
+ <field name="INPUT_METHOD_FROM_FOCUSABLE" />
+ <field name="INPUT_METHOD_NEEDED" />
+ <field name="INPUT_METHOD_NOT_NEEDED" />
+ <field name="MATCH_PARENT" />
+ <field name="POSITION_PROMPT_ABOVE" />
+ <field name="POSITION_PROMPT_BELOW" />
+ <field name="WRAP_CONTENT" />
+ </class>
+ <class name="android/widget/ListView" since="1">
+ <extends name="android/widget/AbsListView" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="addFooterView(Landroid/view/View;)V" />
+ <method name="addFooterView(Landroid/view/View;Ljava/lang/Object;Z)V" />
+ <method name="addHeaderView(Landroid/view/View;)V" />
+ <method name="addHeaderView(Landroid/view/View;Ljava/lang/Object;Z)V" />
+ <method name="areFooterDividersEnabled()Z" since="19" />
+ <method name="areHeaderDividersEnabled()Z" since="19" />
+ <method name="clearChoices()V" />
+ <method name="findViewTraversal(I)Landroid/view/View;" />
+ <method name="findViewWithTagTraversal(Ljava/lang/Object;)Landroid/view/View;" />
+ <method name="getAdapter()Landroid/widget/ListAdapter;" />
+ <method name="getCheckItemIds()[J" since="4" />
+ <method name="getCheckedItemIds()[J" since="8" />
+ <method name="getCheckedItemPosition()I" />
+ <method name="getCheckedItemPositions()Landroid/util/SparseBooleanArray;" />
+ <method name="getChoiceMode()I" />
+ <method name="getDivider()Landroid/graphics/drawable/Drawable;" />
+ <method name="getDividerHeight()I" />
+ <method name="getFooterViewsCount()I" />
+ <method name="getHeaderViewsCount()I" />
+ <method name="getItemsCanFocus()Z" />
+ <method name="getMaxScrollAmount()I" />
+ <method name="getOverscrollFooter()Landroid/graphics/drawable/Drawable;" since="9" />
+ <method name="getOverscrollHeader()Landroid/graphics/drawable/Drawable;" since="9" />
+ <method name="isItemChecked(I)Z" />
+ <method name="removeFooterView(Landroid/view/View;)Z" />
+ <method name="removeHeaderView(Landroid/view/View;)Z" />
+ <method name="setAdapter(Landroid/widget/ListAdapter;)V" />
+ <method name="setChoiceMode(I)V" />
+ <method name="setDivider(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setDividerHeight(I)V" />
+ <method name="setFooterDividersEnabled(Z)V" since="3" />
+ <method name="setHeaderDividersEnabled(Z)V" since="3" />
+ <method name="setItemChecked(IZ)V" />
+ <method name="setItemsCanFocus(Z)V" />
+ <method name="setOverscrollFooter(Landroid/graphics/drawable/Drawable;)V" since="9" />
+ <method name="setOverscrollHeader(Landroid/graphics/drawable/Drawable;)V" since="9" />
+ <method name="setSelectionAfterHeaderView()V" />
+ <method name="setSelectionFromTop(II)V" />
+ <method name="smoothScrollByOffset(I)V" since="11" />
+ <field name="CHOICE_MODE_MULTIPLE" />
+ <field name="CHOICE_MODE_NONE" />
+ <field name="CHOICE_MODE_SINGLE" />
+ </class>
+ <class name="android/widget/ListView$FixedViewInfo" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/widget/ListView;)V" />
+ <field name="data" />
+ <field name="isSelectable" />
+ <field name="view" />
+ </class>
+ <class name="android/widget/MediaController" since="1">
+ <extends name="android/widget/FrameLayout" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Z)V" />
+ <method name="hide()V" />
+ <method name="isShowing()Z" />
+ <method name="setAnchorView(Landroid/view/View;)V" />
+ <method name="setMediaPlayer(Landroid/widget/MediaController$MediaPlayerControl;)V" />
+ <method name="setPrevNextListeners(Landroid/view/View$OnClickListener;Landroid/view/View$OnClickListener;)V" />
+ <method name="show()V" />
+ <method name="show(I)V" />
+ </class>
+ <class name="android/widget/MediaController$MediaPlayerControl" since="1">
+ <extends name="java/lang/Object" />
+ <method name="canPause()Z" since="5" />
+ <method name="canSeekBackward()Z" since="5" />
+ <method name="canSeekForward()Z" since="5" />
+ <method name="getAudioSessionId()I" since="18" />
+ <method name="getBufferPercentage()I" />
+ <method name="getCurrentPosition()I" />
+ <method name="getDuration()I" />
+ <method name="isPlaying()Z" />
+ <method name="pause()V" />
+ <method name="seekTo(I)V" />
+ <method name="start()V" />
+ </class>
+ <class name="android/widget/MultiAutoCompleteTextView" since="1">
+ <extends name="android/widget/AutoCompleteTextView" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="performFiltering(Ljava/lang/CharSequence;III)V" />
+ <method name="setTokenizer(Landroid/widget/MultiAutoCompleteTextView$Tokenizer;)V" />
+ </class>
+ <class name="android/widget/MultiAutoCompleteTextView$CommaTokenizer" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/widget/MultiAutoCompleteTextView$Tokenizer" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="android/widget/MultiAutoCompleteTextView$Tokenizer" since="1">
+ <extends name="java/lang/Object" />
+ <method name="findTokenEnd(Ljava/lang/CharSequence;I)I" />
+ <method name="findTokenStart(Ljava/lang/CharSequence;I)I" />
+ <method name="terminateToken(Ljava/lang/CharSequence;)Ljava/lang/CharSequence;" />
+ </class>
+ <class name="android/widget/NumberPicker" since="11">
+ <extends name="android/widget/LinearLayout" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getDisplayedValues()[Ljava/lang/String;" />
+ <method name="getMaxValue()I" />
+ <method name="getMinValue()I" />
+ <method name="getValue()I" />
+ <method name="getWrapSelectorWheel()Z" />
+ <method name="setDisplayedValues([Ljava/lang/String;)V" />
+ <method name="setFormatter(Landroid/widget/NumberPicker$Formatter;)V" />
+ <method name="setMaxValue(I)V" />
+ <method name="setMinValue(I)V" />
+ <method name="setOnLongPressUpdateInterval(J)V" />
+ <method name="setOnScrollListener(Landroid/widget/NumberPicker$OnScrollListener;)V" />
+ <method name="setOnValueChangedListener(Landroid/widget/NumberPicker$OnValueChangeListener;)V" />
+ <method name="setValue(I)V" />
+ <method name="setWrapSelectorWheel(Z)V" />
+ </class>
+ <class name="android/widget/NumberPicker$Formatter" since="11">
+ <extends name="java/lang/Object" />
+ <method name="format(I)Ljava/lang/String;" />
+ </class>
+ <class name="android/widget/NumberPicker$OnScrollListener" since="11">
+ <extends name="java/lang/Object" />
+ <method name="onScrollStateChange(Landroid/widget/NumberPicker;I)V" />
+ <field name="SCROLL_STATE_FLING" />
+ <field name="SCROLL_STATE_IDLE" />
+ <field name="SCROLL_STATE_TOUCH_SCROLL" />
+ </class>
+ <class name="android/widget/NumberPicker$OnValueChangeListener" since="11">
+ <extends name="java/lang/Object" />
+ <method name="onValueChange(Landroid/widget/NumberPicker;II)V" />
+ </class>
+ <class name="android/widget/OverScroller" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/animation/Interpolator;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/animation/Interpolator;FF)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/animation/Interpolator;FFZ)V" since="11" />
+ <method name="abortAnimation()V" />
+ <method name="computeScrollOffset()Z" />
+ <method name="fling(IIIIIIII)V" />
+ <method name="fling(IIIIIIIIII)V" />
+ <method name="forceFinished(Z)V" />
+ <method name="getCurrVelocity()F" since="14" />
+ <method name="getCurrX()I" />
+ <method name="getCurrY()I" />
+ <method name="getFinalX()I" />
+ <method name="getFinalY()I" />
+ <method name="getStartX()I" />
+ <method name="getStartY()I" />
+ <method name="isFinished()Z" />
+ <method name="isOverScrolled()Z" />
+ <method name="notifyHorizontalEdgeReached(III)V" />
+ <method name="notifyVerticalEdgeReached(III)V" />
+ <method name="setFriction(F)V" since="11" />
+ <method name="springBack(IIIIII)Z" />
+ <method name="startScroll(IIII)V" />
+ <method name="startScroll(IIIII)V" />
+ </class>
+ <class name="android/widget/PopupMenu" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/View;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/View;I)V" since="19" />
+ <method name="dismiss()V" />
+ <method name="getDragToOpenListener()Landroid/view/View$OnTouchListener;" since="19" />
+ <method name="getMenu()Landroid/view/Menu;" />
+ <method name="getMenuInflater()Landroid/view/MenuInflater;" />
+ <method name="inflate(I)V" since="14" />
+ <method name="setOnDismissListener(Landroid/widget/PopupMenu$OnDismissListener;)V" since="14" />
+ <method name="setOnMenuItemClickListener(Landroid/widget/PopupMenu$OnMenuItemClickListener;)V" />
+ <method name="show()V" />
+ </class>
+ <class name="android/widget/PopupMenu$OnDismissListener" since="14">
+ <extends name="java/lang/Object" />
+ <method name="onDismiss(Landroid/widget/PopupMenu;)V" />
+ </class>
+ <class name="android/widget/PopupMenu$OnMenuItemClickListener" since="11">
+ <extends name="java/lang/Object" />
+ <method name="onMenuItemClick(Landroid/view/MenuItem;)Z" />
+ </class>
+ <class name="android/widget/PopupWindow" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(II)V" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="11" />
+ <method name="&lt;init>(Landroid/view/View;)V" />
+ <method name="&lt;init>(Landroid/view/View;II)V" />
+ <method name="&lt;init>(Landroid/view/View;IIZ)V" />
+ <method name="dismiss()V" />
+ <method name="getAnimationStyle()I" />
+ <method name="getBackground()Landroid/graphics/drawable/Drawable;" />
+ <method name="getContentView()Landroid/view/View;" />
+ <method name="getElevation()F" since="21" />
+ <method name="getHeight()I" />
+ <method name="getInputMethodMode()I" since="3" />
+ <method name="getMaxAvailableHeight(Landroid/view/View;)I" />
+ <method name="getMaxAvailableHeight(Landroid/view/View;I)I" since="3" />
+ <method name="getSoftInputMode()I" since="4" />
+ <method name="getWidth()I" />
+ <method name="isAboveAnchor()Z" since="3" />
+ <method name="isClippingEnabled()Z" since="3" />
+ <method name="isFocusable()Z" />
+ <method name="isOutsideTouchable()Z" since="3" />
+ <method name="isShowing()Z" />
+ <method name="isSplitTouchEnabled()Z" since="11" />
+ <method name="isTouchable()Z" since="3" />
+ <method name="setAnimationStyle(I)V" />
+ <method name="setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setClippingEnabled(Z)V" since="3" />
+ <method name="setContentView(Landroid/view/View;)V" />
+ <method name="setElevation(F)V" since="21" />
+ <method name="setFocusable(Z)V" />
+ <method name="setHeight(I)V" />
+ <method name="setIgnoreCheekPress()V" />
+ <method name="setInputMethodMode(I)V" since="3" />
+ <method name="setOnDismissListener(Landroid/widget/PopupWindow$OnDismissListener;)V" />
+ <method name="setOutsideTouchable(Z)V" since="3" />
+ <method name="setSoftInputMode(I)V" since="4" />
+ <method name="setSplitTouchEnabled(Z)V" since="11" />
+ <method name="setTouchInterceptor(Landroid/view/View$OnTouchListener;)V" since="3" />
+ <method name="setTouchable(Z)V" since="3" />
+ <method name="setWidth(I)V" />
+ <method name="setWindowLayoutMode(II)V" since="3" />
+ <method name="showAsDropDown(Landroid/view/View;)V" />
+ <method name="showAsDropDown(Landroid/view/View;II)V" />
+ <method name="showAsDropDown(Landroid/view/View;III)V" since="19" />
+ <method name="showAtLocation(Landroid/view/View;III)V" />
+ <method name="update()V" since="3" />
+ <method name="update(II)V" since="4" />
+ <method name="update(IIII)V" />
+ <method name="update(IIIIZ)V" since="3" />
+ <method name="update(Landroid/view/View;II)V" />
+ <method name="update(Landroid/view/View;IIII)V" />
+ <field name="INPUT_METHOD_FROM_FOCUSABLE" since="3" />
+ <field name="INPUT_METHOD_NEEDED" since="3" />
+ <field name="INPUT_METHOD_NOT_NEEDED" since="3" />
+ </class>
+ <class name="android/widget/PopupWindow$OnDismissListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onDismiss()V" />
+ </class>
+ <class name="android/widget/ProgressBar" since="1">
+ <extends name="android/view/View" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getIndeterminateDrawable()Landroid/graphics/drawable/Drawable;" />
+ <method name="getIndeterminateTintList()Landroid/content/res/ColorStateList;" since="21" />
+ <method name="getIndeterminateTintMode()Landroid/graphics/PorterDuff$Mode;" since="21" />
+ <method name="getInterpolator()Landroid/view/animation/Interpolator;" />
+ <method name="getMax()I" />
+ <method name="getProgress()I" />
+ <method name="getProgressBackgroundTintList()Landroid/content/res/ColorStateList;" since="21" />
+ <method name="getProgressBackgroundTintMode()Landroid/graphics/PorterDuff$Mode;" since="21" />
+ <method name="getProgressDrawable()Landroid/graphics/drawable/Drawable;" />
+ <method name="getProgressTintList()Landroid/content/res/ColorStateList;" since="21" />
+ <method name="getProgressTintMode()Landroid/graphics/PorterDuff$Mode;" since="21" />
+ <method name="getSecondaryProgress()I" />
+ <method name="getSecondaryProgressTintList()Landroid/content/res/ColorStateList;" since="21" />
+ <method name="getSecondaryProgressTintMode()Landroid/graphics/PorterDuff$Mode;" since="21" />
+ <method name="incrementProgressBy(I)V" />
+ <method name="incrementSecondaryProgressBy(I)V" />
+ <method name="isIndeterminate()Z" />
+ <method name="setIndeterminate(Z)V" />
+ <method name="setIndeterminateDrawable(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setIndeterminateDrawableTiled(Landroid/graphics/drawable/Drawable;)V" since="21" />
+ <method name="setIndeterminateTintList(Landroid/content/res/ColorStateList;)V" since="21" />
+ <method name="setIndeterminateTintMode(Landroid/graphics/PorterDuff$Mode;)V" since="21" />
+ <method name="setInterpolator(Landroid/content/Context;I)V" />
+ <method name="setInterpolator(Landroid/view/animation/Interpolator;)V" />
+ <method name="setMax(I)V" />
+ <method name="setProgress(I)V" />
+ <method name="setProgressBackgroundTintList(Landroid/content/res/ColorStateList;)V" since="21" />
+ <method name="setProgressBackgroundTintMode(Landroid/graphics/PorterDuff$Mode;)V" since="21" />
+ <method name="setProgressDrawable(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setProgressDrawableTiled(Landroid/graphics/drawable/Drawable;)V" since="21" />
+ <method name="setProgressTintList(Landroid/content/res/ColorStateList;)V" since="21" />
+ <method name="setProgressTintMode(Landroid/graphics/PorterDuff$Mode;)V" since="21" />
+ <method name="setSecondaryProgress(I)V" />
+ <method name="setSecondaryProgressTintList(Landroid/content/res/ColorStateList;)V" since="21" />
+ <method name="setSecondaryProgressTintMode(Landroid/graphics/PorterDuff$Mode;)V" since="21" />
+ </class>
+ <class name="android/widget/QuickContactBadge" since="5">
+ <extends name="android/widget/ImageView" />
+ <implements name="android/view/View$OnClickListener" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="assignContactFromEmail(Ljava/lang/String;Z)V" />
+ <method name="assignContactFromEmail(Ljava/lang/String;ZLandroid/os/Bundle;)V" since="18" />
+ <method name="assignContactFromPhone(Ljava/lang/String;Z)V" />
+ <method name="assignContactFromPhone(Ljava/lang/String;ZLandroid/os/Bundle;)V" since="18" />
+ <method name="assignContactUri(Landroid/net/Uri;)V" />
+ <method name="setExcludeMimes([Ljava/lang/String;)V" />
+ <method name="setImageToDefault()V" since="11" />
+ <method name="setMode(I)V" />
+ <method name="setOverlay(Landroid/graphics/drawable/Drawable;)V" since="21" />
+ <field name="mExcludeMimes" />
+ </class>
+ <class name="android/widget/RadioButton" since="1">
+ <extends name="android/widget/CompoundButton" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ </class>
+ <class name="android/widget/RadioGroup" since="1">
+ <extends name="android/widget/LinearLayout" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="check(I)V" />
+ <method name="clearCheck()V" />
+ <method name="generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/RadioGroup$LayoutParams;" />
+ <method name="getCheckedRadioButtonId()I" />
+ <method name="setOnCheckedChangeListener(Landroid/widget/RadioGroup$OnCheckedChangeListener;)V" />
+ </class>
+ <class name="android/widget/RadioGroup$LayoutParams" since="1">
+ <extends name="android/widget/LinearLayout$LayoutParams" />
+ <method name="&lt;init>(II)V" />
+ <method name="&lt;init>(IIF)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V" />
+ <method name="&lt;init>(Landroid/view/ViewGroup$MarginLayoutParams;)V" />
+ </class>
+ <class name="android/widget/RadioGroup$OnCheckedChangeListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onCheckedChanged(Landroid/widget/RadioGroup;I)V" />
+ </class>
+ <class name="android/widget/RatingBar" since="1">
+ <extends name="android/widget/AbsSeekBar" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getNumStars()I" />
+ <method name="getOnRatingBarChangeListener()Landroid/widget/RatingBar$OnRatingBarChangeListener;" />
+ <method name="getRating()F" />
+ <method name="getStepSize()F" />
+ <method name="isIndicator()Z" />
+ <method name="setIsIndicator(Z)V" />
+ <method name="setNumStars(I)V" />
+ <method name="setOnRatingBarChangeListener(Landroid/widget/RatingBar$OnRatingBarChangeListener;)V" />
+ <method name="setRating(F)V" />
+ <method name="setStepSize(F)V" />
+ </class>
+ <class name="android/widget/RatingBar$OnRatingBarChangeListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onRatingChanged(Landroid/widget/RatingBar;FZ)V" />
+ </class>
+ <class name="android/widget/RelativeLayout" since="1">
+ <extends name="android/view/ViewGroup" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/RelativeLayout$LayoutParams;" />
+ <method name="getGravity()I" since="16" />
+ <method name="setGravity(I)V" />
+ <method name="setHorizontalGravity(I)V" />
+ <method name="setIgnoreGravity(I)V" />
+ <method name="setVerticalGravity(I)V" />
+ <field name="ABOVE" />
+ <field name="ALIGN_BASELINE" />
+ <field name="ALIGN_BOTTOM" />
+ <field name="ALIGN_END" since="17" />
+ <field name="ALIGN_LEFT" />
+ <field name="ALIGN_PARENT_BOTTOM" />
+ <field name="ALIGN_PARENT_END" since="17" />
+ <field name="ALIGN_PARENT_LEFT" />
+ <field name="ALIGN_PARENT_RIGHT" />
+ <field name="ALIGN_PARENT_START" since="17" />
+ <field name="ALIGN_PARENT_TOP" />
+ <field name="ALIGN_RIGHT" />
+ <field name="ALIGN_START" since="17" />
+ <field name="ALIGN_TOP" />
+ <field name="BELOW" />
+ <field name="CENTER_HORIZONTAL" />
+ <field name="CENTER_IN_PARENT" />
+ <field name="CENTER_VERTICAL" />
+ <field name="END_OF" since="17" />
+ <field name="LEFT_OF" />
+ <field name="RIGHT_OF" />
+ <field name="START_OF" since="17" />
+ <field name="TRUE" />
+ </class>
+ <class name="android/widget/RelativeLayout$LayoutParams" since="1">
+ <extends name="android/view/ViewGroup$MarginLayoutParams" />
+ <method name="&lt;init>(II)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V" />
+ <method name="&lt;init>(Landroid/view/ViewGroup$MarginLayoutParams;)V" />
+ <method name="&lt;init>(Landroid/widget/RelativeLayout$LayoutParams;)V" since="19" />
+ <method name="addRule(I)V" />
+ <method name="addRule(II)V" />
+ <method name="debug(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getRules()[I" />
+ <method name="removeRule(I)V" since="17" />
+ <field name="alignWithParent" />
+ </class>
+ <class name="android/widget/RemoteViews" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/os/Parcelable" />
+ <implements name="android/view/LayoutInflater$Filter" />
+ <method name="&lt;init>(Landroid/os/Parcel;)V" />
+ <method name="&lt;init>(Landroid/widget/RemoteViews;Landroid/widget/RemoteViews;)V" since="16" />
+ <method name="&lt;init>(Ljava/lang/String;I)V" />
+ <method name="addView(ILandroid/widget/RemoteViews;)V" since="7" />
+ <method name="apply(Landroid/content/Context;Landroid/view/ViewGroup;)Landroid/view/View;" />
+ <method name="clone()Landroid/widget/RemoteViews;" since="9" />
+ <method name="getLayoutId()I" />
+ <method name="getPackage()Ljava/lang/String;" />
+ <method name="reapply(Landroid/content/Context;Landroid/view/View;)V" />
+ <method name="removeAllViews(I)V" since="7" />
+ <method name="setBitmap(ILjava/lang/String;Landroid/graphics/Bitmap;)V" since="3" />
+ <method name="setBoolean(ILjava/lang/String;Z)V" since="3" />
+ <method name="setBundle(ILjava/lang/String;Landroid/os/Bundle;)V" since="8" />
+ <method name="setByte(ILjava/lang/String;B)V" since="3" />
+ <method name="setChar(ILjava/lang/String;C)V" since="3" />
+ <method name="setCharSequence(ILjava/lang/String;Ljava/lang/CharSequence;)V" since="3" />
+ <method name="setChronometer(IJLjava/lang/String;Z)V" />
+ <method name="setContentDescription(ILjava/lang/CharSequence;)V" since="15" />
+ <method name="setDisplayedChild(II)V" since="12" />
+ <method name="setDouble(ILjava/lang/String;D)V" since="3" />
+ <method name="setEmptyView(II)V" since="11" />
+ <method name="setFloat(ILjava/lang/String;F)V" since="3" />
+ <method name="setImageViewBitmap(ILandroid/graphics/Bitmap;)V" since="3" />
+ <method name="setImageViewResource(II)V" />
+ <method name="setImageViewUri(ILandroid/net/Uri;)V" />
+ <method name="setInt(ILjava/lang/String;I)V" since="3" />
+ <method name="setIntent(ILjava/lang/String;Landroid/content/Intent;)V" since="11" />
+ <method name="setLabelFor(II)V" since="17" />
+ <method name="setLong(ILjava/lang/String;J)V" since="3" />
+ <method name="setOnClickFillInIntent(ILandroid/content/Intent;)V" since="11" />
+ <method name="setOnClickPendingIntent(ILandroid/app/PendingIntent;)V" since="3" />
+ <method name="setPendingIntentTemplate(ILandroid/app/PendingIntent;)V" since="11" />
+ <method name="setProgressBar(IIIZ)V" />
+ <method name="setRelativeScrollPosition(II)V" since="11" />
+ <method name="setRemoteAdapter(IILandroid/content/Intent;)V" since="11" />
+ <method name="setRemoteAdapter(ILandroid/content/Intent;)V" since="14" />
+ <method name="setScrollPosition(II)V" since="11" />
+ <method name="setShort(ILjava/lang/String;S)V" since="3" />
+ <method name="setString(ILjava/lang/String;Ljava/lang/String;)V" since="3" />
+ <method name="setTextColor(II)V" since="3" />
+ <method name="setTextViewCompoundDrawables(IIIII)V" since="16" />
+ <method name="setTextViewCompoundDrawablesRelative(IIIII)V" since="16" />
+ <method name="setTextViewText(ILjava/lang/CharSequence;)V" />
+ <method name="setTextViewTextSize(IIF)V" since="16" />
+ <method name="setUri(ILjava/lang/String;Landroid/net/Uri;)V" since="3" />
+ <method name="setViewPadding(IIIII)V" since="16" />
+ <method name="setViewVisibility(II)V" />
+ <method name="showNext(I)V" since="11" />
+ <method name="showPrevious(I)V" since="11" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/widget/RemoteViews$ActionException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>(Ljava/lang/Exception;)V" since="3" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/widget/RemoteViews$RemoteView" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/annotation/Annotation" />
+ </class>
+ <class name="android/widget/RemoteViewsService" since="11">
+ <extends name="android/app/Service" />
+ <method name="&lt;init>()V" />
+ <method name="onGetViewFactory(Landroid/content/Intent;)Landroid/widget/RemoteViewsService$RemoteViewsFactory;" />
+ </class>
+ <class name="android/widget/RemoteViewsService$RemoteViewsFactory" since="11">
+ <extends name="java/lang/Object" />
+ <method name="getCount()I" />
+ <method name="getItemId(I)J" />
+ <method name="getLoadingView()Landroid/widget/RemoteViews;" />
+ <method name="getViewAt(I)Landroid/widget/RemoteViews;" />
+ <method name="getViewTypeCount()I" />
+ <method name="hasStableIds()Z" />
+ <method name="onCreate()V" />
+ <method name="onDataSetChanged()V" />
+ <method name="onDestroy()V" />
+ </class>
+ <class name="android/widget/ResourceCursorAdapter" since="1">
+ <extends name="android/widget/CursorAdapter" />
+ <method name="&lt;init>(Landroid/content/Context;ILandroid/database/Cursor;)V" />
+ <method name="&lt;init>(Landroid/content/Context;ILandroid/database/Cursor;I)V" since="11" />
+ <method name="&lt;init>(Landroid/content/Context;ILandroid/database/Cursor;Z)V" since="3" />
+ <method name="setDropDownViewResource(I)V" />
+ <method name="setViewResource(I)V" since="3" />
+ </class>
+ <class name="android/widget/ResourceCursorTreeAdapter" since="1">
+ <extends name="android/widget/CursorTreeAdapter" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/database/Cursor;II)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/database/Cursor;III)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/database/Cursor;IIII)V" />
+ </class>
+ <class name="android/widget/ScrollView" since="1">
+ <extends name="android/widget/FrameLayout" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="arrowScroll(I)Z" />
+ <method name="computeScrollDeltaToGetChildRectOnScreen(Landroid/graphics/Rect;)I" />
+ <method name="executeKeyEvent(Landroid/view/KeyEvent;)Z" />
+ <method name="fling(I)V" />
+ <method name="fullScroll(I)Z" />
+ <method name="getMaxScrollAmount()I" />
+ <method name="isFillViewport()Z" />
+ <method name="isSmoothScrollingEnabled()Z" />
+ <method name="pageScroll(I)Z" />
+ <method name="setFillViewport(Z)V" />
+ <method name="setSmoothScrollingEnabled(Z)V" />
+ <method name="smoothScrollBy(II)V" />
+ <method name="smoothScrollTo(II)V" />
+ </class>
+ <class name="android/widget/Scroller" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/animation/Interpolator;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/view/animation/Interpolator;Z)V" since="11" />
+ <method name="abortAnimation()V" />
+ <method name="computeScrollOffset()Z" />
+ <method name="extendDuration(I)V" />
+ <method name="fling(IIIIIIII)V" />
+ <method name="forceFinished(Z)V" />
+ <method name="getCurrVelocity()F" since="14" />
+ <method name="getCurrX()I" />
+ <method name="getCurrY()I" />
+ <method name="getDuration()I" />
+ <method name="getFinalX()I" />
+ <method name="getFinalY()I" />
+ <method name="getStartX()I" since="3" />
+ <method name="getStartY()I" since="3" />
+ <method name="isFinished()Z" />
+ <method name="setFinalX(I)V" />
+ <method name="setFinalY(I)V" />
+ <method name="setFriction(F)V" since="11" />
+ <method name="startScroll(IIII)V" />
+ <method name="startScroll(IIIII)V" />
+ <method name="timePassed()I" />
+ </class>
+ <class name="android/widget/SearchView" since="11">
+ <extends name="android/widget/LinearLayout" />
+ <implements name="android/view/CollapsibleActionView" since="14" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" since="21" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getImeOptions()I" since="16" />
+ <method name="getInputType()I" since="16" />
+ <method name="getMaxWidth()I" since="16" />
+ <method name="getQuery()Ljava/lang/CharSequence;" />
+ <method name="getQueryHint()Ljava/lang/CharSequence;" since="16" />
+ <method name="getSuggestionsAdapter()Landroid/widget/CursorAdapter;" />
+ <method name="isIconfiedByDefault()Z" />
+ <method name="isIconified()Z" />
+ <method name="isQueryRefinementEnabled()Z" />
+ <method name="isSubmitButtonEnabled()Z" />
+ <method name="setIconified(Z)V" />
+ <method name="setIconifiedByDefault(Z)V" />
+ <method name="setImeOptions(I)V" since="14" />
+ <method name="setInputType(I)V" since="14" />
+ <method name="setMaxWidth(I)V" />
+ <method name="setOnCloseListener(Landroid/widget/SearchView$OnCloseListener;)V" />
+ <method name="setOnQueryTextFocusChangeListener(Landroid/view/View$OnFocusChangeListener;)V" />
+ <method name="setOnQueryTextListener(Landroid/widget/SearchView$OnQueryTextListener;)V" />
+ <method name="setOnSearchClickListener(Landroid/view/View$OnClickListener;)V" />
+ <method name="setOnSuggestionListener(Landroid/widget/SearchView$OnSuggestionListener;)V" />
+ <method name="setQuery(Ljava/lang/CharSequence;Z)V" />
+ <method name="setQueryHint(Ljava/lang/CharSequence;)V" />
+ <method name="setQueryRefinementEnabled(Z)V" />
+ <method name="setSearchableInfo(Landroid/app/SearchableInfo;)V" />
+ <method name="setSubmitButtonEnabled(Z)V" />
+ <method name="setSuggestionsAdapter(Landroid/widget/CursorAdapter;)V" />
+ </class>
+ <class name="android/widget/SearchView$OnCloseListener" since="11">
+ <extends name="java/lang/Object" />
+ <method name="onClose()Z" />
+ </class>
+ <class name="android/widget/SearchView$OnQueryTextListener" since="11">
+ <extends name="java/lang/Object" />
+ <method name="onQueryTextChange(Ljava/lang/String;)Z" />
+ <method name="onQueryTextSubmit(Ljava/lang/String;)Z" />
+ </class>
+ <class name="android/widget/SearchView$OnSuggestionListener" since="11">
+ <extends name="java/lang/Object" />
+ <method name="onSuggestionClick(I)Z" />
+ <method name="onSuggestionSelect(I)Z" />
+ </class>
+ <class name="android/widget/SectionIndexer" since="3">
+ <extends name="java/lang/Object" />
+ <method name="getPositionForSection(I)I" />
+ <method name="getSectionForPosition(I)I" />
+ <method name="getSections()[Ljava/lang/Object;" />
+ </class>
+ <class name="android/widget/SeekBar" since="1">
+ <extends name="android/widget/AbsSeekBar" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="setOnSeekBarChangeListener(Landroid/widget/SeekBar$OnSeekBarChangeListener;)V" />
+ </class>
+ <class name="android/widget/SeekBar$OnSeekBarChangeListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onProgressChanged(Landroid/widget/SeekBar;IZ)V" />
+ <method name="onStartTrackingTouch(Landroid/widget/SeekBar;)V" />
+ <method name="onStopTrackingTouch(Landroid/widget/SeekBar;)V" />
+ </class>
+ <class name="android/widget/ShareActionProvider" since="14">
+ <extends name="android/view/ActionProvider" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="setOnShareTargetSelectedListener(Landroid/widget/ShareActionProvider$OnShareTargetSelectedListener;)V" />
+ <method name="setShareHistoryFileName(Ljava/lang/String;)V" />
+ <method name="setShareIntent(Landroid/content/Intent;)V" />
+ <field name="DEFAULT_SHARE_HISTORY_FILE_NAME" />
+ </class>
+ <class name="android/widget/ShareActionProvider$OnShareTargetSelectedListener" since="14">
+ <extends name="java/lang/Object" />
+ <method name="onShareTargetSelected(Landroid/widget/ShareActionProvider;Landroid/content/Intent;)Z" />
+ </class>
+ <class name="android/widget/SimpleAdapter" since="1">
+ <extends name="android/widget/BaseAdapter" />
+ <implements name="android/widget/Filterable" />
+ <method name="&lt;init>(Landroid/content/Context;Ljava/util/List;I[Ljava/lang/String;[I)V" />
+ <method name="getViewBinder()Landroid/widget/SimpleAdapter$ViewBinder;" />
+ <method name="setDropDownViewResource(I)V" />
+ <method name="setViewBinder(Landroid/widget/SimpleAdapter$ViewBinder;)V" />
+ <method name="setViewImage(Landroid/widget/ImageView;I)V" />
+ <method name="setViewImage(Landroid/widget/ImageView;Ljava/lang/String;)V" />
+ <method name="setViewText(Landroid/widget/TextView;Ljava/lang/String;)V" />
+ </class>
+ <class name="android/widget/SimpleAdapter$ViewBinder" since="1">
+ <extends name="java/lang/Object" />
+ <method name="setViewValue(Landroid/view/View;Ljava/lang/Object;Ljava/lang/String;)Z" />
+ </class>
+ <class name="android/widget/SimpleCursorAdapter" since="1">
+ <extends name="android/widget/ResourceCursorAdapter" />
+ <method name="&lt;init>(Landroid/content/Context;ILandroid/database/Cursor;[Ljava/lang/String;[I)V" />
+ <method name="&lt;init>(Landroid/content/Context;ILandroid/database/Cursor;[Ljava/lang/String;[II)V" since="11" />
+ <method name="changeCursorAndColumns(Landroid/database/Cursor;[Ljava/lang/String;[I)V" since="3" />
+ <method name="getCursorToStringConverter()Landroid/widget/SimpleCursorAdapter$CursorToStringConverter;" />
+ <method name="getStringConversionColumn()I" />
+ <method name="getViewBinder()Landroid/widget/SimpleCursorAdapter$ViewBinder;" />
+ <method name="setCursorToStringConverter(Landroid/widget/SimpleCursorAdapter$CursorToStringConverter;)V" />
+ <method name="setStringConversionColumn(I)V" />
+ <method name="setViewBinder(Landroid/widget/SimpleCursorAdapter$ViewBinder;)V" />
+ <method name="setViewImage(Landroid/widget/ImageView;Ljava/lang/String;)V" />
+ <method name="setViewText(Landroid/widget/TextView;Ljava/lang/String;)V" />
+ </class>
+ <class name="android/widget/SimpleCursorAdapter$CursorToStringConverter" since="1">
+ <extends name="java/lang/Object" />
+ <method name="convertToString(Landroid/database/Cursor;)Ljava/lang/CharSequence;" />
+ </class>
+ <class name="android/widget/SimpleCursorAdapter$ViewBinder" since="1">
+ <extends name="java/lang/Object" />
+ <method name="setViewValue(Landroid/view/View;Landroid/database/Cursor;I)Z" />
+ </class>
+ <class name="android/widget/SimpleCursorTreeAdapter" since="1">
+ <extends name="android/widget/ResourceCursorTreeAdapter" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/database/Cursor;II[Ljava/lang/String;[III[Ljava/lang/String;[I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/database/Cursor;II[Ljava/lang/String;[II[Ljava/lang/String;[I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/database/Cursor;I[Ljava/lang/String;[II[Ljava/lang/String;[I)V" />
+ <method name="getViewBinder()Landroid/widget/SimpleCursorTreeAdapter$ViewBinder;" since="5" />
+ <method name="setViewBinder(Landroid/widget/SimpleCursorTreeAdapter$ViewBinder;)V" since="5" />
+ <method name="setViewImage(Landroid/widget/ImageView;Ljava/lang/String;)V" />
+ <method name="setViewText(Landroid/widget/TextView;Ljava/lang/String;)V" since="5" />
+ </class>
+ <class name="android/widget/SimpleCursorTreeAdapter$ViewBinder" since="5">
+ <extends name="java/lang/Object" />
+ <method name="setViewValue(Landroid/view/View;Landroid/database/Cursor;I)Z" />
+ </class>
+ <class name="android/widget/SimpleExpandableListAdapter" since="1">
+ <extends name="android/widget/BaseExpandableListAdapter" />
+ <method name="&lt;init>(Landroid/content/Context;Ljava/util/List;II[Ljava/lang/String;[ILjava/util/List;II[Ljava/lang/String;[I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Ljava/util/List;II[Ljava/lang/String;[ILjava/util/List;I[Ljava/lang/String;[I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Ljava/util/List;I[Ljava/lang/String;[ILjava/util/List;I[Ljava/lang/String;[I)V" />
+ <method name="newChildView(ZLandroid/view/ViewGroup;)Landroid/view/View;" />
+ <method name="newGroupView(ZLandroid/view/ViewGroup;)Landroid/view/View;" />
+ </class>
+ <class name="android/widget/SlidingDrawer" since="3">
+ <extends name="android/view/ViewGroup" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="animateClose()V" />
+ <method name="animateOpen()V" />
+ <method name="animateToggle()V" />
+ <method name="close()V" />
+ <method name="getContent()Landroid/view/View;" />
+ <method name="getHandle()Landroid/view/View;" />
+ <method name="isMoving()Z" />
+ <method name="isOpened()Z" />
+ <method name="lock()V" />
+ <method name="open()V" />
+ <method name="setOnDrawerCloseListener(Landroid/widget/SlidingDrawer$OnDrawerCloseListener;)V" />
+ <method name="setOnDrawerOpenListener(Landroid/widget/SlidingDrawer$OnDrawerOpenListener;)V" />
+ <method name="setOnDrawerScrollListener(Landroid/widget/SlidingDrawer$OnDrawerScrollListener;)V" />
+ <method name="toggle()V" />
+ <method name="unlock()V" />
+ <field name="ORIENTATION_HORIZONTAL" />
+ <field name="ORIENTATION_VERTICAL" />
+ </class>
+ <class name="android/widget/SlidingDrawer$OnDrawerCloseListener" since="3">
+ <extends name="java/lang/Object" />
+ <method name="onDrawerClosed()V" />
+ </class>
+ <class name="android/widget/SlidingDrawer$OnDrawerOpenListener" since="3">
+ <extends name="java/lang/Object" />
+ <method name="onDrawerOpened()V" />
+ </class>
+ <class name="android/widget/SlidingDrawer$OnDrawerScrollListener" since="3">
+ <extends name="java/lang/Object" />
+ <method name="onScrollEnded()V" />
+ <method name="onScrollStarted()V" />
+ </class>
+ <class name="android/widget/Space" since="14">
+ <extends name="android/view/View" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ </class>
+ <class name="android/widget/Spinner" since="1">
+ <extends name="android/widget/AbsSpinner" />
+ <implements name="android/content/DialogInterface$OnClickListener" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;I)V" since="11" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="11" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;III)V" since="21" />
+ <method name="getDropDownHorizontalOffset()I" since="16" />
+ <method name="getDropDownVerticalOffset()I" since="16" />
+ <method name="getDropDownWidth()I" since="16" />
+ <method name="getGravity()I" since="16" />
+ <method name="getPopupBackground()Landroid/graphics/drawable/Drawable;" since="16" />
+ <method name="getPrompt()Ljava/lang/CharSequence;" />
+ <method name="setDropDownHorizontalOffset(I)V" since="16" />
+ <method name="setDropDownVerticalOffset(I)V" since="16" />
+ <method name="setDropDownWidth(I)V" since="16" />
+ <method name="setGravity(I)V" since="11" />
+ <method name="setPopupBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V" since="16" />
+ <method name="setPopupBackgroundResource(I)V" since="16" />
+ <method name="setPrompt(Ljava/lang/CharSequence;)V" />
+ <method name="setPromptId(I)V" />
+ <field name="MODE_DIALOG" since="11" />
+ <field name="MODE_DROPDOWN" since="11" />
+ </class>
+ <class name="android/widget/SpinnerAdapter" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/widget/Adapter" />
+ <method name="getDropDownView(ILandroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View;" />
+ </class>
+ <class name="android/widget/StackView" since="11">
+ <extends name="android/widget/AdapterViewAnimator" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" since="14" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ </class>
+ <class name="android/widget/Switch" since="14">
+ <extends name="android/widget/CompoundButton" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getShowText()Z" since="21" />
+ <method name="getSplitTrack()Z" since="21" />
+ <method name="getSwitchMinWidth()I" since="16" />
+ <method name="getSwitchPadding()I" since="16" />
+ <method name="getTextOff()Ljava/lang/CharSequence;" />
+ <method name="getTextOn()Ljava/lang/CharSequence;" />
+ <method name="getThumbDrawable()Landroid/graphics/drawable/Drawable;" since="16" />
+ <method name="getThumbTextPadding()I" since="16" />
+ <method name="getTrackDrawable()Landroid/graphics/drawable/Drawable;" since="16" />
+ <method name="setShowText(Z)V" since="21" />
+ <method name="setSplitTrack(Z)V" since="21" />
+ <method name="setSwitchMinWidth(I)V" since="16" />
+ <method name="setSwitchPadding(I)V" since="16" />
+ <method name="setSwitchTextAppearance(Landroid/content/Context;I)V" />
+ <method name="setSwitchTypeface(Landroid/graphics/Typeface;)V" />
+ <method name="setSwitchTypeface(Landroid/graphics/Typeface;I)V" />
+ <method name="setTextOff(Ljava/lang/CharSequence;)V" />
+ <method name="setTextOn(Ljava/lang/CharSequence;)V" />
+ <method name="setThumbDrawable(Landroid/graphics/drawable/Drawable;)V" since="16" />
+ <method name="setThumbResource(I)V" since="16" />
+ <method name="setThumbTextPadding(I)V" since="16" />
+ <method name="setTrackDrawable(Landroid/graphics/drawable/Drawable;)V" since="16" />
+ <method name="setTrackResource(I)V" since="16" />
+ </class>
+ <class name="android/widget/TabHost" since="1">
+ <extends name="android/widget/FrameLayout" />
+ <implements name="android/view/ViewTreeObserver$OnTouchModeChangeListener" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" since="21" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="addTab(Landroid/widget/TabHost$TabSpec;)V" />
+ <method name="clearAllTabs()V" />
+ <method name="getCurrentTab()I" />
+ <method name="getCurrentTabTag()Ljava/lang/String;" />
+ <method name="getCurrentTabView()Landroid/view/View;" />
+ <method name="getCurrentView()Landroid/view/View;" />
+ <method name="getTabContentView()Landroid/widget/FrameLayout;" />
+ <method name="getTabWidget()Landroid/widget/TabWidget;" />
+ <method name="newTabSpec(Ljava/lang/String;)Landroid/widget/TabHost$TabSpec;" />
+ <method name="setCurrentTab(I)V" />
+ <method name="setCurrentTabByTag(Ljava/lang/String;)V" />
+ <method name="setOnTabChangedListener(Landroid/widget/TabHost$OnTabChangeListener;)V" />
+ <method name="setup()V" />
+ <method name="setup(Landroid/app/LocalActivityManager;)V" />
+ </class>
+ <class name="android/widget/TabHost$OnTabChangeListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onTabChanged(Ljava/lang/String;)V" />
+ </class>
+ <class name="android/widget/TabHost$TabContentFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="createTabContent(Ljava/lang/String;)Landroid/view/View;" />
+ </class>
+ <class name="android/widget/TabHost$TabSpec" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/widget/TabHost;)V" />
+ <method name="getTag()Ljava/lang/String;" since="4" />
+ <method name="setContent(I)Landroid/widget/TabHost$TabSpec;" />
+ <method name="setContent(Landroid/content/Intent;)Landroid/widget/TabHost$TabSpec;" />
+ <method name="setContent(Landroid/widget/TabHost$TabContentFactory;)Landroid/widget/TabHost$TabSpec;" />
+ <method name="setIndicator(Landroid/view/View;)Landroid/widget/TabHost$TabSpec;" since="4" />
+ <method name="setIndicator(Ljava/lang/CharSequence;)Landroid/widget/TabHost$TabSpec;" />
+ <method name="setIndicator(Ljava/lang/CharSequence;Landroid/graphics/drawable/Drawable;)Landroid/widget/TabHost$TabSpec;" />
+ </class>
+ <class name="android/widget/TabWidget" since="1">
+ <extends name="android/widget/LinearLayout" />
+ <implements name="android/view/View$OnFocusChangeListener" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="focusCurrentTab(I)V" />
+ <method name="getChildTabViewAt(I)Landroid/view/View;" since="4" />
+ <method name="getTabCount()I" since="4" />
+ <method name="isStripEnabled()Z" since="8" />
+ <method name="setCurrentTab(I)V" />
+ <method name="setDividerDrawable(I)V" since="4" />
+ <method name="setDividerDrawable(Landroid/graphics/drawable/Drawable;)V" since="4" />
+ <method name="setLeftStripDrawable(I)V" since="8" />
+ <method name="setLeftStripDrawable(Landroid/graphics/drawable/Drawable;)V" since="8" />
+ <method name="setRightStripDrawable(I)V" since="8" />
+ <method name="setRightStripDrawable(Landroid/graphics/drawable/Drawable;)V" since="8" />
+ <method name="setStripEnabled(Z)V" since="8" />
+ </class>
+ <class name="android/widget/TableLayout" since="1">
+ <extends name="android/widget/LinearLayout" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/TableLayout$LayoutParams;" />
+ <method name="isColumnCollapsed(I)Z" />
+ <method name="isColumnShrinkable(I)Z" />
+ <method name="isColumnStretchable(I)Z" />
+ <method name="isShrinkAllColumns()Z" />
+ <method name="isStretchAllColumns()Z" />
+ <method name="setColumnCollapsed(IZ)V" />
+ <method name="setColumnShrinkable(IZ)V" />
+ <method name="setColumnStretchable(IZ)V" />
+ <method name="setShrinkAllColumns(Z)V" />
+ <method name="setStretchAllColumns(Z)V" />
+ </class>
+ <class name="android/widget/TableLayout$LayoutParams" since="1">
+ <extends name="android/widget/LinearLayout$LayoutParams" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(II)V" />
+ <method name="&lt;init>(IIF)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V" />
+ <method name="&lt;init>(Landroid/view/ViewGroup$MarginLayoutParams;)V" />
+ </class>
+ <class name="android/widget/TableRow" since="1">
+ <extends name="android/widget/LinearLayout" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/TableRow$LayoutParams;" />
+ <method name="getVirtualChildAt(I)Landroid/view/View;" />
+ <method name="getVirtualChildCount()I" />
+ </class>
+ <class name="android/widget/TableRow$LayoutParams" since="1">
+ <extends name="android/widget/LinearLayout$LayoutParams" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(II)V" />
+ <method name="&lt;init>(IIF)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V" />
+ <method name="&lt;init>(Landroid/view/ViewGroup$MarginLayoutParams;)V" />
+ <field name="column" />
+ <field name="span" />
+ </class>
+ <class name="android/widget/TextClock" since="17">
+ <extends name="android/widget/TextView" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getFormat12Hour()Ljava/lang/CharSequence;" />
+ <method name="getFormat24Hour()Ljava/lang/CharSequence;" />
+ <method name="getTimeZone()Ljava/lang/String;" />
+ <method name="is24HourModeEnabled()Z" />
+ <method name="setFormat12Hour(Ljava/lang/CharSequence;)V" />
+ <method name="setFormat24Hour(Ljava/lang/CharSequence;)V" />
+ <method name="setTimeZone(Ljava/lang/String;)V" />
+ <field name="DEFAULT_FORMAT_12_HOUR" />
+ <field name="DEFAULT_FORMAT_24_HOUR" />
+ </class>
+ <class name="android/widget/TextSwitcher" since="1">
+ <extends name="android/widget/ViewSwitcher" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="setCurrentText(Ljava/lang/CharSequence;)V" />
+ <method name="setText(Ljava/lang/CharSequence;)V" />
+ </class>
+ <class name="android/widget/TextView" since="1">
+ <extends name="android/view/View" />
+ <implements name="android/view/ViewTreeObserver$OnPreDrawListener" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="addTextChangedListener(Landroid/text/TextWatcher;)V" />
+ <method name="append(Ljava/lang/CharSequence;)V" />
+ <method name="append(Ljava/lang/CharSequence;II)V" />
+ <method name="beginBatchEdit()V" since="3" />
+ <method name="bringPointIntoView(I)Z" since="3" />
+ <method name="clearComposingText()V" since="3" />
+ <method name="debug(I)V" />
+ <method name="didTouchFocusSelect()Z" since="3" />
+ <method name="endBatchEdit()V" since="3" />
+ <method name="extractText(Landroid/view/inputmethod/ExtractedTextRequest;Landroid/view/inputmethod/ExtractedText;)Z" since="3" />
+ <method name="getAutoLinkMask()I" />
+ <method name="getCompoundDrawablePadding()I" />
+ <method name="getCompoundDrawables()[Landroid/graphics/drawable/Drawable;" />
+ <method name="getCompoundDrawablesRelative()[Landroid/graphics/drawable/Drawable;" since="17" />
+ <method name="getCompoundPaddingBottom()I" />
+ <method name="getCompoundPaddingEnd()I" since="17" />
+ <method name="getCompoundPaddingLeft()I" />
+ <method name="getCompoundPaddingRight()I" />
+ <method name="getCompoundPaddingStart()I" since="17" />
+ <method name="getCompoundPaddingTop()I" />
+ <method name="getCurrentHintTextColor()I" />
+ <method name="getCurrentTextColor()I" />
+ <method name="getCustomSelectionActionModeCallback()Landroid/view/ActionMode$Callback;" since="11" />
+ <method name="getDefaultEditable()Z" />
+ <method name="getDefaultMovementMethod()Landroid/text/method/MovementMethod;" />
+ <method name="getEditableText()Landroid/text/Editable;" since="3" />
+ <method name="getEllipsize()Landroid/text/TextUtils$TruncateAt;" />
+ <method name="getError()Ljava/lang/CharSequence;" />
+ <method name="getExtendedPaddingBottom()I" />
+ <method name="getExtendedPaddingTop()I" />
+ <method name="getFilters()[Landroid/text/InputFilter;" />
+ <method name="getFontFeatureSettings()Ljava/lang/String;" since="21" />
+ <method name="getFreezesText()Z" />
+ <method name="getGravity()I" />
+ <method name="getHighlightColor()I" since="16" />
+ <method name="getHint()Ljava/lang/CharSequence;" />
+ <method name="getHintTextColors()Landroid/content/res/ColorStateList;" />
+ <method name="getImeActionId()I" since="3" />
+ <method name="getImeActionLabel()Ljava/lang/CharSequence;" since="3" />
+ <method name="getImeOptions()I" since="3" />
+ <method name="getIncludeFontPadding()Z" since="16" />
+ <method name="getInputExtras(Z)Landroid/os/Bundle;" since="3" />
+ <method name="getInputType()I" since="3" />
+ <method name="getKeyListener()Landroid/text/method/KeyListener;" />
+ <method name="getLayout()Landroid/text/Layout;" />
+ <method name="getLetterSpacing()F" since="21" />
+ <method name="getLineBounds(ILandroid/graphics/Rect;)I" />
+ <method name="getLineCount()I" />
+ <method name="getLineHeight()I" />
+ <method name="getLineSpacingExtra()F" since="16" />
+ <method name="getLineSpacingMultiplier()F" since="16" />
+ <method name="getLinkTextColors()Landroid/content/res/ColorStateList;" />
+ <method name="getLinksClickable()Z" />
+ <method name="getMarqueeRepeatLimit()I" since="16" />
+ <method name="getMaxEms()I" since="16" />
+ <method name="getMaxHeight()I" since="16" />
+ <method name="getMaxLines()I" since="16" />
+ <method name="getMaxWidth()I" since="16" />
+ <method name="getMinEms()I" since="16" />
+ <method name="getMinHeight()I" since="16" />
+ <method name="getMinLines()I" since="16" />
+ <method name="getMinWidth()I" since="16" />
+ <method name="getMovementMethod()Landroid/text/method/MovementMethod;" />
+ <method name="getOffsetForPosition(FF)I" since="14" />
+ <method name="getPaint()Landroid/text/TextPaint;" />
+ <method name="getPaintFlags()I" />
+ <method name="getPrivateImeOptions()Ljava/lang/String;" since="3" />
+ <method name="getSelectionEnd()I" />
+ <method name="getSelectionStart()I" />
+ <method name="getShadowColor()I" since="16" />
+ <method name="getShadowDx()F" since="16" />
+ <method name="getShadowDy()F" since="16" />
+ <method name="getShadowRadius()F" since="16" />
+ <method name="getShowSoftInputOnFocus()Z" since="21" />
+ <method name="getText()Ljava/lang/CharSequence;" />
+ <method name="getTextColor(Landroid/content/Context;Landroid/content/res/TypedArray;I)I" />
+ <method name="getTextColors()Landroid/content/res/ColorStateList;" />
+ <method name="getTextColors(Landroid/content/Context;Landroid/content/res/TypedArray;)Landroid/content/res/ColorStateList;" />
+ <method name="getTextLocale()Ljava/util/Locale;" since="17" />
+ <method name="getTextScaleX()F" />
+ <method name="getTextSize()F" />
+ <method name="getTotalPaddingBottom()I" />
+ <method name="getTotalPaddingEnd()I" since="17" />
+ <method name="getTotalPaddingLeft()I" />
+ <method name="getTotalPaddingRight()I" />
+ <method name="getTotalPaddingStart()I" since="17" />
+ <method name="getTotalPaddingTop()I" />
+ <method name="getTransformationMethod()Landroid/text/method/TransformationMethod;" />
+ <method name="getTypeface()Landroid/graphics/Typeface;" />
+ <method name="getUrls()[Landroid/text/style/URLSpan;" />
+ <method name="hasSelection()Z" />
+ <method name="isCursorVisible()Z" since="16" />
+ <method name="isInputMethodTarget()Z" since="3" />
+ <method name="isSuggestionsEnabled()Z" since="14" />
+ <method name="isTextSelectable()Z" since="11" />
+ <method name="length()I" />
+ <method name="moveCursorToVisibleOffset()Z" since="3" />
+ <method name="onBeginBatchEdit()V" since="3" />
+ <method name="onCommitCompletion(Landroid/view/inputmethod/CompletionInfo;)V" since="3" />
+ <method name="onCommitCorrection(Landroid/view/inputmethod/CorrectionInfo;)V" since="11" />
+ <method name="onEditorAction(I)V" since="3" />
+ <method name="onEndBatchEdit()V" since="3" />
+ <method name="onPrivateIMECommand(Ljava/lang/String;Landroid/os/Bundle;)Z" since="3" />
+ <method name="onSelectionChanged(II)V" since="3" />
+ <method name="onTextChanged(Ljava/lang/CharSequence;III)V" />
+ <method name="onTextContextMenuItem(I)Z" since="3" />
+ <method name="removeTextChangedListener(Landroid/text/TextWatcher;)V" />
+ <method name="resetResolvedDrawables()V" since="14" />
+ <method name="resetResolvedLayoutDirection()V" since="14" />
+ <method name="resolveDrawables()V" since="14" />
+ <method name="resolveTextDirection()V" since="14" />
+ <method name="setAllCaps(Z)V" since="14" />
+ <method name="setAutoLinkMask(I)V" />
+ <method name="setCompoundDrawablePadding(I)V" />
+ <method name="setCompoundDrawables(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setCompoundDrawablesRelative(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V" since="17" />
+ <method name="setCompoundDrawablesRelativeWithIntrinsicBounds(IIII)V" since="17" />
+ <method name="setCompoundDrawablesRelativeWithIntrinsicBounds(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V" since="17" />
+ <method name="setCompoundDrawablesWithIntrinsicBounds(IIII)V" since="3" />
+ <method name="setCompoundDrawablesWithIntrinsicBounds(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setCursorVisible(Z)V" />
+ <method name="setCustomSelectionActionModeCallback(Landroid/view/ActionMode$Callback;)V" since="11" />
+ <method name="setEditableFactory(Landroid/text/Editable$Factory;)V" />
+ <method name="setElegantTextHeight(Z)V" since="21" />
+ <method name="setEllipsize(Landroid/text/TextUtils$TruncateAt;)V" />
+ <method name="setEms(I)V" />
+ <method name="setError(Ljava/lang/CharSequence;)V" />
+ <method name="setError(Ljava/lang/CharSequence;Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setExtractedText(Landroid/view/inputmethod/ExtractedText;)V" since="3" />
+ <method name="setFilters([Landroid/text/InputFilter;)V" />
+ <method name="setFontFeatureSettings(Ljava/lang/String;)V" since="21" />
+ <method name="setFrame(IIII)Z" />
+ <method name="setFreezesText(Z)V" />
+ <method name="setGravity(I)V" />
+ <method name="setHeight(I)V" />
+ <method name="setHighlightColor(I)V" />
+ <method name="setHint(I)V" />
+ <method name="setHint(Ljava/lang/CharSequence;)V" />
+ <method name="setHintTextColor(I)V" />
+ <method name="setHintTextColor(Landroid/content/res/ColorStateList;)V" />
+ <method name="setHorizontallyScrolling(Z)V" />
+ <method name="setImeActionLabel(Ljava/lang/CharSequence;I)V" since="3" />
+ <method name="setImeOptions(I)V" since="3" />
+ <method name="setIncludeFontPadding(Z)V" />
+ <method name="setInputExtras(I)V" since="3" />
+ <method name="setInputType(I)V" since="3" />
+ <method name="setKeyListener(Landroid/text/method/KeyListener;)V" />
+ <method name="setLetterSpacing(F)V" since="21" />
+ <method name="setLineSpacing(FF)V" />
+ <method name="setLines(I)V" />
+ <method name="setLinkTextColor(I)V" />
+ <method name="setLinkTextColor(Landroid/content/res/ColorStateList;)V" />
+ <method name="setLinksClickable(Z)V" />
+ <method name="setMarqueeRepeatLimit(I)V" since="2" />
+ <method name="setMaxEms(I)V" />
+ <method name="setMaxHeight(I)V" />
+ <method name="setMaxLines(I)V" />
+ <method name="setMaxWidth(I)V" />
+ <method name="setMinEms(I)V" />
+ <method name="setMinHeight(I)V" />
+ <method name="setMinLines(I)V" />
+ <method name="setMinWidth(I)V" />
+ <method name="setMovementMethod(Landroid/text/method/MovementMethod;)V" />
+ <method name="setOnEditorActionListener(Landroid/widget/TextView$OnEditorActionListener;)V" since="3" />
+ <method name="setPaddingRelative(IIII)V" since="16" />
+ <method name="setPaintFlags(I)V" />
+ <method name="setPrivateImeOptions(Ljava/lang/String;)V" since="3" />
+ <method name="setRawInputType(I)V" since="3" />
+ <method name="setScroller(Landroid/widget/Scroller;)V" />
+ <method name="setSelectAllOnFocus(Z)V" />
+ <method name="setShadowLayer(FFFI)V" />
+ <method name="setShowSoftInputOnFocus(Z)V" since="21" />
+ <method name="setSingleLine()V" />
+ <method name="setSingleLine(Z)V" />
+ <method name="setSpannableFactory(Landroid/text/Spannable$Factory;)V" />
+ <method name="setText(I)V" />
+ <method name="setText(ILandroid/widget/TextView$BufferType;)V" />
+ <method name="setText(Ljava/lang/CharSequence;)V" />
+ <method name="setText(Ljava/lang/CharSequence;Landroid/widget/TextView$BufferType;)V" />
+ <method name="setText([CII)V" />
+ <method name="setTextAppearance(Landroid/content/Context;I)V" />
+ <method name="setTextColor(I)V" />
+ <method name="setTextColor(Landroid/content/res/ColorStateList;)V" />
+ <method name="setTextIsSelectable(Z)V" since="11" />
+ <method name="setTextKeepState(Ljava/lang/CharSequence;)V" />
+ <method name="setTextKeepState(Ljava/lang/CharSequence;Landroid/widget/TextView$BufferType;)V" />
+ <method name="setTextLocale(Ljava/util/Locale;)V" since="17" />
+ <method name="setTextScaleX(F)V" />
+ <method name="setTextSize(F)V" />
+ <method name="setTextSize(IF)V" />
+ <method name="setTransformationMethod(Landroid/text/method/TransformationMethod;)V" />
+ <method name="setTypeface(Landroid/graphics/Typeface;)V" />
+ <method name="setTypeface(Landroid/graphics/Typeface;I)V" />
+ <method name="setWidth(I)V" />
+ </class>
+ <class name="android/widget/TextView$BufferType" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Landroid/widget/TextView$BufferType;" />
+ <method name="values()[Landroid/widget/TextView$BufferType;" />
+ <field name="EDITABLE" />
+ <field name="NORMAL" />
+ <field name="SPANNABLE" />
+ </class>
+ <class name="android/widget/TextView$OnEditorActionListener" since="3">
+ <extends name="java/lang/Object" />
+ <method name="onEditorAction(Landroid/widget/TextView;ILandroid/view/KeyEvent;)Z" />
+ </class>
+ <class name="android/widget/TextView$SavedState" since="1">
+ <extends name="android/view/View$BaseSavedState" />
+ <method name="&lt;init>()V" />
+ <field name="CREATOR" />
+ </class>
+ <class name="android/widget/TimePicker" since="1">
+ <extends name="android/widget/FrameLayout" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getCurrentHour()Ljava/lang/Integer;" />
+ <method name="getCurrentMinute()Ljava/lang/Integer;" />
+ <method name="is24HourView()Z" />
+ <method name="setCurrentHour(Ljava/lang/Integer;)V" />
+ <method name="setCurrentMinute(Ljava/lang/Integer;)V" />
+ <method name="setIs24HourView(Ljava/lang/Boolean;)V" />
+ <method name="setOnTimeChangedListener(Landroid/widget/TimePicker$OnTimeChangedListener;)V" />
+ </class>
+ <class name="android/widget/TimePicker$OnTimeChangedListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onTimeChanged(Landroid/widget/TimePicker;II)V" />
+ </class>
+ <class name="android/widget/Toast" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="cancel()V" />
+ <method name="getDuration()I" />
+ <method name="getGravity()I" />
+ <method name="getHorizontalMargin()F" />
+ <method name="getVerticalMargin()F" />
+ <method name="getView()Landroid/view/View;" />
+ <method name="getXOffset()I" />
+ <method name="getYOffset()I" />
+ <method name="makeText(Landroid/content/Context;II)Landroid/widget/Toast;" />
+ <method name="makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;" />
+ <method name="setDuration(I)V" />
+ <method name="setGravity(III)V" />
+ <method name="setMargin(FF)V" />
+ <method name="setText(I)V" />
+ <method name="setText(Ljava/lang/CharSequence;)V" />
+ <method name="setView(Landroid/view/View;)V" />
+ <method name="show()V" />
+ <field name="LENGTH_LONG" />
+ <field name="LENGTH_SHORT" />
+ </class>
+ <class name="android/widget/ToggleButton" since="1">
+ <extends name="android/widget/CompoundButton" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getTextOff()Ljava/lang/CharSequence;" />
+ <method name="getTextOn()Ljava/lang/CharSequence;" />
+ <method name="setTextOff(Ljava/lang/CharSequence;)V" />
+ <method name="setTextOn(Ljava/lang/CharSequence;)V" />
+ </class>
+ <class name="android/widget/Toolbar" since="21">
+ <extends name="android/view/ViewGroup" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" />
+ <method name="collapseActionView()V" />
+ <method name="dismissPopupMenus()V" />
+ <method name="generateDefaultLayoutParams()Landroid/widget/Toolbar$LayoutParams;" />
+ <method name="generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/Toolbar$LayoutParams;" />
+ <method name="generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroid/widget/Toolbar$LayoutParams;" />
+ <method name="getContentInsetEnd()I" />
+ <method name="getContentInsetLeft()I" />
+ <method name="getContentInsetRight()I" />
+ <method name="getContentInsetStart()I" />
+ <method name="getLogo()Landroid/graphics/drawable/Drawable;" />
+ <method name="getLogoDescription()Ljava/lang/CharSequence;" />
+ <method name="getMenu()Landroid/view/Menu;" />
+ <method name="getNavigationContentDescription()Ljava/lang/CharSequence;" />
+ <method name="getNavigationIcon()Landroid/graphics/drawable/Drawable;" />
+ <method name="getPopupTheme()I" />
+ <method name="getSubtitle()Ljava/lang/CharSequence;" />
+ <method name="getTitle()Ljava/lang/CharSequence;" />
+ <method name="hasExpandedActionView()Z" />
+ <method name="hideOverflowMenu()Z" />
+ <method name="inflateMenu(I)V" />
+ <method name="isOverflowMenuShowing()Z" />
+ <method name="setContentInsetsAbsolute(II)V" />
+ <method name="setContentInsetsRelative(II)V" />
+ <method name="setLogo(I)V" />
+ <method name="setLogo(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setLogoDescription(I)V" />
+ <method name="setLogoDescription(Ljava/lang/CharSequence;)V" />
+ <method name="setNavigationContentDescription(I)V" />
+ <method name="setNavigationContentDescription(Ljava/lang/CharSequence;)V" />
+ <method name="setNavigationIcon(I)V" />
+ <method name="setNavigationIcon(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setNavigationOnClickListener(Landroid/view/View$OnClickListener;)V" />
+ <method name="setOnMenuItemClickListener(Landroid/widget/Toolbar$OnMenuItemClickListener;)V" />
+ <method name="setPopupTheme(I)V" />
+ <method name="setSubtitle(I)V" />
+ <method name="setSubtitle(Ljava/lang/CharSequence;)V" />
+ <method name="setSubtitleTextAppearance(Landroid/content/Context;I)V" />
+ <method name="setSubtitleTextColor(I)V" />
+ <method name="setTitle(I)V" />
+ <method name="setTitle(Ljava/lang/CharSequence;)V" />
+ <method name="setTitleTextAppearance(Landroid/content/Context;I)V" />
+ <method name="setTitleTextColor(I)V" />
+ <method name="showOverflowMenu()Z" />
+ </class>
+ <class name="android/widget/Toolbar$LayoutParams" since="21">
+ <extends name="android/app/ActionBar$LayoutParams" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(II)V" />
+ <method name="&lt;init>(III)V" />
+ <method name="&lt;init>(Landroid/app/ActionBar$LayoutParams;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V" />
+ <method name="&lt;init>(Landroid/view/ViewGroup$MarginLayoutParams;)V" />
+ <method name="&lt;init>(Landroid/widget/Toolbar$LayoutParams;)V" />
+ </class>
+ <class name="android/widget/Toolbar$OnMenuItemClickListener" since="21">
+ <extends name="java/lang/Object" />
+ <method name="onMenuItemClick(Landroid/view/MenuItem;)Z" />
+ </class>
+ <class name="android/widget/TwoLineListItem" since="1">
+ <extends name="android/widget/RelativeLayout" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="getText1()Landroid/widget/TextView;" />
+ <method name="getText2()Landroid/widget/TextView;" />
+ </class>
+ <class name="android/widget/VideoView" since="1">
+ <extends name="android/view/SurfaceView" />
+ <implements name="android/widget/MediaController$MediaPlayerControl" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="addSubtitleSource(Ljava/io/InputStream;Landroid/media/MediaFormat;)V" since="19" />
+ <method name="resolveAdjustedSize(II)I" />
+ <method name="resume()V" since="8" />
+ <method name="setMediaController(Landroid/widget/MediaController;)V" />
+ <method name="setOnCompletionListener(Landroid/media/MediaPlayer$OnCompletionListener;)V" />
+ <method name="setOnErrorListener(Landroid/media/MediaPlayer$OnErrorListener;)V" />
+ <method name="setOnInfoListener(Landroid/media/MediaPlayer$OnInfoListener;)V" since="17" />
+ <method name="setOnPreparedListener(Landroid/media/MediaPlayer$OnPreparedListener;)V" />
+ <method name="setVideoPath(Ljava/lang/String;)V" />
+ <method name="setVideoURI(Landroid/net/Uri;)V" />
+ <method name="setVideoURI(Landroid/net/Uri;Ljava/util/Map;)V" since="21" />
+ <method name="stopPlayback()V" />
+ <method name="suspend()V" since="8" />
+ </class>
+ <class name="android/widget/ViewAnimator" since="1">
+ <extends name="android/widget/FrameLayout" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="getAnimateFirstView()Z" since="17" />
+ <method name="getCurrentView()Landroid/view/View;" />
+ <method name="getDisplayedChild()I" />
+ <method name="getInAnimation()Landroid/view/animation/Animation;" />
+ <method name="getOutAnimation()Landroid/view/animation/Animation;" />
+ <method name="setAnimateFirstView(Z)V" />
+ <method name="setDisplayedChild(I)V" />
+ <method name="setInAnimation(Landroid/content/Context;I)V" />
+ <method name="setInAnimation(Landroid/view/animation/Animation;)V" />
+ <method name="setOutAnimation(Landroid/content/Context;I)V" />
+ <method name="setOutAnimation(Landroid/view/animation/Animation;)V" />
+ <method name="showNext()V" />
+ <method name="showPrevious()V" />
+ </class>
+ <class name="android/widget/ViewFlipper" since="1">
+ <extends name="android/widget/ViewAnimator" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="isAutoStart()Z" since="7" />
+ <method name="isFlipping()Z" />
+ <method name="setAutoStart(Z)V" since="7" />
+ <method name="setFlipInterval(I)V" />
+ <method name="startFlipping()V" />
+ <method name="stopFlipping()V" />
+ </class>
+ <class name="android/widget/ViewSwitcher" since="1">
+ <extends name="android/widget/ViewAnimator" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="getNextView()Landroid/view/View;" />
+ <method name="reset()V" />
+ <method name="setFactory(Landroid/widget/ViewSwitcher$ViewFactory;)V" />
+ </class>
+ <class name="android/widget/ViewSwitcher$ViewFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="makeView()Landroid/view/View;" />
+ </class>
+ <class name="android/widget/WrapperListAdapter" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/widget/ListAdapter" />
+ <method name="getWrappedAdapter()Landroid/widget/ListAdapter;" />
+ </class>
+ <class name="android/widget/ZoomButton" since="1">
+ <extends name="android/widget/ImageButton" />
+ <implements name="android/view/View$OnLongClickListener" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;II)V" since="21" />
+ <method name="setZoomSpeed(J)V" />
+ </class>
+ <class name="android/widget/ZoomButtonsController" since="4">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/View$OnTouchListener" />
+ <method name="&lt;init>(Landroid/view/View;)V" />
+ <method name="getContainer()Landroid/view/ViewGroup;" />
+ <method name="getZoomControls()Landroid/view/View;" />
+ <method name="isAutoDismissed()Z" />
+ <method name="isVisible()Z" />
+ <method name="setAutoDismissed(Z)V" />
+ <method name="setFocusable(Z)V" />
+ <method name="setOnZoomListener(Landroid/widget/ZoomButtonsController$OnZoomListener;)V" />
+ <method name="setVisible(Z)V" />
+ <method name="setZoomInEnabled(Z)V" />
+ <method name="setZoomOutEnabled(Z)V" />
+ <method name="setZoomSpeed(J)V" />
+ </class>
+ <class name="android/widget/ZoomButtonsController$OnZoomListener" since="4">
+ <extends name="java/lang/Object" />
+ <method name="onVisibilityChanged(Z)V" />
+ <method name="onZoom(Z)V" />
+ </class>
+ <class name="android/widget/ZoomControls" since="1">
+ <extends name="android/widget/LinearLayout" />
+ <method name="&lt;init>(Landroid/content/Context;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="hide()V" />
+ <method name="setIsZoomInEnabled(Z)V" />
+ <method name="setIsZoomOutEnabled(Z)V" />
+ <method name="setOnZoomInClickListener(Landroid/view/View$OnClickListener;)V" />
+ <method name="setOnZoomOutClickListener(Landroid/view/View$OnClickListener;)V" />
+ <method name="setZoomSpeed(J)V" />
+ <method name="show()V" />
+ </class>
+ <class name="com/android/internal/util/Predicate" since="1">
+ <extends name="java/lang/Object" />
+ <method name="apply(Ljava/lang/Object;)Z" />
+ </class>
+ <class name="com/google/android/maps/GeoPoint" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(II)V" />
+ <method name="getLatitudeE6()I" />
+ <method name="getLongitudeE6()I" />
+ </class>
+ <class name="com/google/android/maps/ItemizedOverlay" since="1">
+ <extends name="com/google/android/maps/Overlay" />
+ <method name="&lt;init>(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="boundCenter(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable;" />
+ <method name="boundCenterBottom(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable;" />
+ <method name="createItem(I)Lcom/google/android/maps/OverlayItem;" />
+ <method name="getCenter()Lcom/google/android/maps/GeoPoint;" />
+ <method name="getFocus()Lcom/google/android/maps/OverlayItem;" />
+ <method name="getIndexToDraw(I)I" />
+ <method name="getItem(I)Lcom/google/android/maps/OverlayItem;" />
+ <method name="getLastFocusedIndex()I" />
+ <method name="getLatSpanE6()I" />
+ <method name="getLonSpanE6()I" />
+ <method name="hitTest(Lcom/google/android/maps/OverlayItem;Landroid/graphics/drawable/Drawable;II)Z" />
+ <method name="nextFocus(Z)Lcom/google/android/maps/OverlayItem;" />
+ <method name="onTap(I)Z" />
+ <method name="populate()V" />
+ <method name="setDrawFocusedItem(Z)V" />
+ <method name="setFocus(Lcom/google/android/maps/OverlayItem;)V" />
+ <method name="setLastFocusedIndex(I)V" />
+ <method name="setOnFocusChangeListener(Lcom/google/android/maps/ItemizedOverlay$OnFocusChangeListener;)V" />
+ <method name="size()I" />
+ </class>
+ <class name="com/google/android/maps/ItemizedOverlay$OnFocusChangeListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="onFocusChanged(Lcom/google/android/maps/ItemizedOverlay;Lcom/google/android/maps/OverlayItem;)V" />
+ </class>
+ <class name="com/google/android/maps/MapActivity" since="1">
+ <extends name="android/app/Activity" />
+ <method name="&lt;init>()V" />
+ <method name="isLocationDisplayed()Z" />
+ <method name="isRouteDisplayed()Z" />
+ </class>
+ <class name="com/google/android/maps/MapController" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="android/view/View$OnKeyListener" />
+ <method name="&lt;init>()V" />
+ <method name="animateTo(Lcom/google/android/maps/GeoPoint;)V" />
+ <method name="animateTo(Lcom/google/android/maps/GeoPoint;Landroid/os/Message;)V" />
+ <method name="animateTo(Lcom/google/android/maps/GeoPoint;Ljava/lang/Runnable;)V" />
+ <method name="scrollBy(II)V" />
+ <method name="setCenter(Lcom/google/android/maps/GeoPoint;)V" />
+ <method name="setZoom(I)I" />
+ <method name="stopAnimation(Z)V" />
+ <method name="stopPanning()V" />
+ <method name="zoomIn()Z" />
+ <method name="zoomInFixing(II)Z" />
+ <method name="zoomOut()Z" />
+ <method name="zoomOutFixing(II)Z" />
+ <method name="zoomToSpan(II)V" />
+ </class>
+ <class name="com/google/android/maps/MapView" since="1">
+ <extends name="android/view/ViewGroup" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;I)V" />
+ <method name="&lt;init>(Landroid/content/Context;Ljava/lang/String;)V" />
+ <method name="canCoverCenter()Z" />
+ <method name="displayZoomControls(Z)V" />
+ <method name="generateDefaultLayoutParams()Lcom/google/android/maps/MapView$LayoutParams;" />
+ <method name="getController()Lcom/google/android/maps/MapController;" />
+ <method name="getLatitudeSpan()I" />
+ <method name="getLongitudeSpan()I" />
+ <method name="getMapCenter()Lcom/google/android/maps/GeoPoint;" />
+ <method name="getMaxZoomLevel()I" />
+ <method name="getOverlays()Ljava/util/List;" />
+ <method name="getProjection()Lcom/google/android/maps/Projection;" />
+ <method name="getZoomControls()Landroid/view/View;" />
+ <method name="getZoomLevel()I" />
+ <method name="isSatellite()Z" />
+ <method name="isStreetView()Z" />
+ <method name="isTraffic()Z" />
+ <method name="onRestoreInstanceState(Landroid/os/Bundle;)V" />
+ <method name="onSaveInstanceState(Landroid/os/Bundle;)V" />
+ <method name="preLoad()V" />
+ <method name="setReticleDrawMode(Lcom/google/android/maps/MapView$ReticleDrawMode;)V" />
+ <method name="setSatellite(Z)V" />
+ <method name="setStreetView(Z)V" />
+ <method name="setTraffic(Z)V" />
+ </class>
+ <class name="com/google/android/maps/MapView$LayoutParams" since="1">
+ <extends name="android/view/ViewGroup$LayoutParams" />
+ <method name="&lt;init>(IIIII)V" />
+ <method name="&lt;init>(IILcom/google/android/maps/GeoPoint;I)V" />
+ <method name="&lt;init>(IILcom/google/android/maps/GeoPoint;III)V" />
+ <method name="&lt;init>(Landroid/content/Context;Landroid/util/AttributeSet;)V" />
+ <method name="&lt;init>(Landroid/view/ViewGroup$LayoutParams;)V" />
+ <method name="debug(Ljava/lang/String;)Ljava/lang/String;" />
+ <field name="BOTTOM" />
+ <field name="BOTTOM_CENTER" />
+ <field name="CENTER" />
+ <field name="CENTER_HORIZONTAL" />
+ <field name="CENTER_VERTICAL" />
+ <field name="LEFT" />
+ <field name="MODE_MAP" />
+ <field name="MODE_VIEW" />
+ <field name="RIGHT" />
+ <field name="TOP" />
+ <field name="TOP_LEFT" />
+ <field name="alignment" />
+ <field name="mode" />
+ <field name="point" />
+ <field name="x" />
+ <field name="y" />
+ </class>
+ <class name="com/google/android/maps/MapView$ReticleDrawMode" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Lcom/google/android/maps/MapView$ReticleDrawMode;" />
+ <method name="values()[Lcom/google/android/maps/MapView$ReticleDrawMode;" />
+ <field name="DRAW_RETICLE_NEVER" />
+ <field name="DRAW_RETICLE_OVER" />
+ <field name="DRAW_RETICLE_UNDER" />
+ </class>
+ <class name="com/google/android/maps/MyLocationOverlay" since="1">
+ <extends name="com/google/android/maps/Overlay" />
+ <implements name="android/hardware/SensorListener" />
+ <implements name="android/location/LocationListener" />
+ <method name="&lt;init>(Landroid/content/Context;Lcom/google/android/maps/MapView;)V" />
+ <method name="disableCompass()V" />
+ <method name="disableMyLocation()V" />
+ <method name="dispatchTap()Z" />
+ <method name="drawCompass(Landroid/graphics/Canvas;F)V" />
+ <method name="drawMyLocation(Landroid/graphics/Canvas;Lcom/google/android/maps/MapView;Landroid/location/Location;Lcom/google/android/maps/GeoPoint;J)V" />
+ <method name="enableCompass()Z" />
+ <method name="enableMyLocation()Z" />
+ <method name="getLastFix()Landroid/location/Location;" />
+ <method name="getMyLocation()Lcom/google/android/maps/GeoPoint;" />
+ <method name="getOrientation()F" />
+ <method name="isCompassEnabled()Z" />
+ <method name="isMyLocationEnabled()Z" />
+ <method name="runOnFirstFix(Ljava/lang/Runnable;)Z" />
+ </class>
+ <class name="com/google/android/maps/Overlay" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="draw(Landroid/graphics/Canvas;Lcom/google/android/maps/MapView;Z)V" />
+ <method name="draw(Landroid/graphics/Canvas;Lcom/google/android/maps/MapView;ZJ)Z" />
+ <method name="drawAt(Landroid/graphics/Canvas;Landroid/graphics/drawable/Drawable;IIZ)V" />
+ <method name="onKeyDown(ILandroid/view/KeyEvent;Lcom/google/android/maps/MapView;)Z" />
+ <method name="onKeyUp(ILandroid/view/KeyEvent;Lcom/google/android/maps/MapView;)Z" />
+ <method name="onTap(Lcom/google/android/maps/GeoPoint;Lcom/google/android/maps/MapView;)Z" />
+ <method name="onTouchEvent(Landroid/view/MotionEvent;Lcom/google/android/maps/MapView;)Z" />
+ <method name="onTrackballEvent(Landroid/view/MotionEvent;Lcom/google/android/maps/MapView;)Z" />
+ <field name="SHADOW_X_SKEW" />
+ <field name="SHADOW_Y_SCALE" />
+ </class>
+ <class name="com/google/android/maps/OverlayItem" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Lcom/google/android/maps/GeoPoint;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="getMarker(I)Landroid/graphics/drawable/Drawable;" />
+ <method name="getPoint()Lcom/google/android/maps/GeoPoint;" />
+ <method name="getSnippet()Ljava/lang/String;" />
+ <method name="getTitle()Ljava/lang/String;" />
+ <method name="routableAddress()Ljava/lang/String;" />
+ <method name="setMarker(Landroid/graphics/drawable/Drawable;)V" />
+ <method name="setState(Landroid/graphics/drawable/Drawable;I)V" />
+ <field name="ITEM_STATE_FOCUSED_MASK" />
+ <field name="ITEM_STATE_PRESSED_MASK" />
+ <field name="ITEM_STATE_SELECTED_MASK" />
+ <field name="mMarker" />
+ <field name="mPoint" />
+ <field name="mSnippet" />
+ <field name="mTitle" />
+ </class>
+ <class name="com/google/android/maps/Projection" since="1">
+ <extends name="java/lang/Object" />
+ <method name="fromPixels(II)Lcom/google/android/maps/GeoPoint;" />
+ <method name="metersToEquatorPixels(F)F" />
+ <method name="toPixels(Lcom/google/android/maps/GeoPoint;Landroid/graphics/Point;)Landroid/graphics/Point;" />
+ </class>
+ <class name="com/google/android/maps/TrackballGestureDetector" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="analyze(Landroid/view/MotionEvent;)V" />
+ <method name="getCurrentDownX()F" />
+ <method name="getCurrentDownY()F" />
+ <method name="getFirstDownX()F" />
+ <method name="getFirstDownY()F" />
+ <method name="isDoubleTap()Z" />
+ <method name="isScroll()Z" />
+ <method name="isTap()Z" />
+ <method name="registerLongPressCallback(Ljava/lang/Runnable;)V" />
+ <method name="scrollX()F" />
+ <method name="scrollY()F" />
+ </class>
+ <class name="dalvik/annotation/TestTarget" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/annotation/Annotation" />
+ <method name="conceptName()Ljava/lang/String;" since="3" />
+ <method name="methodArgs()[Ljava/lang/Class;" />
+ <method name="methodName()Ljava/lang/String;" />
+ </class>
+ <class name="dalvik/annotation/TestTargetClass" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/annotation/Annotation" />
+ <method name="value()Ljava/lang/Class;" />
+ </class>
+ <class name="dalvik/bytecode/OpcodeInfo" since="11">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="MAXIMUM_PACKED_VALUE" />
+ <field name="MAXIMUM_VALUE" />
+ </class>
+ <class name="dalvik/bytecode/Opcodes" since="1">
+ <extends name="java/lang/Object" />
+ <field name="OP_ADD_DOUBLE" />
+ <field name="OP_ADD_DOUBLE_2ADDR" />
+ <field name="OP_ADD_FLOAT" />
+ <field name="OP_ADD_FLOAT_2ADDR" />
+ <field name="OP_ADD_INT" />
+ <field name="OP_ADD_INT_2ADDR" />
+ <field name="OP_ADD_INT_LIT16" />
+ <field name="OP_ADD_INT_LIT8" />
+ <field name="OP_ADD_LONG" />
+ <field name="OP_ADD_LONG_2ADDR" />
+ <field name="OP_AGET" />
+ <field name="OP_AGET_BOOLEAN" />
+ <field name="OP_AGET_BYTE" />
+ <field name="OP_AGET_CHAR" />
+ <field name="OP_AGET_OBJECT" />
+ <field name="OP_AGET_SHORT" />
+ <field name="OP_AGET_WIDE" />
+ <field name="OP_AND_INT" />
+ <field name="OP_AND_INT_2ADDR" />
+ <field name="OP_AND_INT_LIT16" />
+ <field name="OP_AND_INT_LIT8" />
+ <field name="OP_AND_LONG" />
+ <field name="OP_AND_LONG_2ADDR" />
+ <field name="OP_APUT" />
+ <field name="OP_APUT_BOOLEAN" />
+ <field name="OP_APUT_BYTE" />
+ <field name="OP_APUT_CHAR" />
+ <field name="OP_APUT_OBJECT" />
+ <field name="OP_APUT_SHORT" />
+ <field name="OP_APUT_WIDE" />
+ <field name="OP_ARRAY_LENGTH" />
+ <field name="OP_BREAKPOINT" since="8" />
+ <field name="OP_CHECK_CAST" />
+ <field name="OP_CHECK_CAST_JUMBO" since="11" />
+ <field name="OP_CMPG_DOUBLE" />
+ <field name="OP_CMPG_FLOAT" />
+ <field name="OP_CMPL_DOUBLE" />
+ <field name="OP_CMPL_FLOAT" />
+ <field name="OP_CMP_LONG" />
+ <field name="OP_CONST" />
+ <field name="OP_CONST_16" />
+ <field name="OP_CONST_4" />
+ <field name="OP_CONST_CLASS" />
+ <field name="OP_CONST_CLASS_JUMBO" since="11" />
+ <field name="OP_CONST_HIGH16" />
+ <field name="OP_CONST_STRING" />
+ <field name="OP_CONST_STRING_JUMBO" />
+ <field name="OP_CONST_WIDE" />
+ <field name="OP_CONST_WIDE_16" />
+ <field name="OP_CONST_WIDE_32" />
+ <field name="OP_CONST_WIDE_HIGH16" />
+ <field name="OP_DIV_DOUBLE" />
+ <field name="OP_DIV_DOUBLE_2ADDR" />
+ <field name="OP_DIV_FLOAT" />
+ <field name="OP_DIV_FLOAT_2ADDR" />
+ <field name="OP_DIV_INT" />
+ <field name="OP_DIV_INT_2ADDR" />
+ <field name="OP_DIV_INT_LIT16" />
+ <field name="OP_DIV_INT_LIT8" />
+ <field name="OP_DIV_LONG" />
+ <field name="OP_DIV_LONG_2ADDR" />
+ <field name="OP_DOUBLE_TO_FLOAT" />
+ <field name="OP_DOUBLE_TO_INT" />
+ <field name="OP_DOUBLE_TO_LONG" />
+ <field name="OP_EXECUTE_INLINE" />
+ <field name="OP_EXECUTE_INLINE_RANGE" since="8" />
+ <field name="OP_FILLED_NEW_ARRAY" />
+ <field name="OP_FILLED_NEW_ARRAY_JUMBO" since="11" />
+ <field name="OP_FILLED_NEW_ARRAY_RANGE" />
+ <field name="OP_FILL_ARRAY_DATA" />
+ <field name="OP_FLOAT_TO_DOUBLE" />
+ <field name="OP_FLOAT_TO_INT" />
+ <field name="OP_FLOAT_TO_LONG" />
+ <field name="OP_GOTO" />
+ <field name="OP_GOTO_16" />
+ <field name="OP_GOTO_32" />
+ <field name="OP_IF_EQ" />
+ <field name="OP_IF_EQZ" />
+ <field name="OP_IF_GE" />
+ <field name="OP_IF_GEZ" />
+ <field name="OP_IF_GT" />
+ <field name="OP_IF_GTZ" />
+ <field name="OP_IF_LE" />
+ <field name="OP_IF_LEZ" />
+ <field name="OP_IF_LT" />
+ <field name="OP_IF_LTZ" />
+ <field name="OP_IF_NE" />
+ <field name="OP_IF_NEZ" />
+ <field name="OP_IGET" />
+ <field name="OP_IGET_BOOLEAN" />
+ <field name="OP_IGET_BOOLEAN_JUMBO" since="11" />
+ <field name="OP_IGET_BYTE" />
+ <field name="OP_IGET_BYTE_JUMBO" since="11" />
+ <field name="OP_IGET_CHAR" />
+ <field name="OP_IGET_CHAR_JUMBO" since="11" />
+ <field name="OP_IGET_JUMBO" since="11" />
+ <field name="OP_IGET_OBJECT" />
+ <field name="OP_IGET_OBJECT_JUMBO" since="11" />
+ <field name="OP_IGET_OBJECT_QUICK" />
+ <field name="OP_IGET_QUICK" />
+ <field name="OP_IGET_SHORT" />
+ <field name="OP_IGET_SHORT_JUMBO" since="11" />
+ <field name="OP_IGET_WIDE" />
+ <field name="OP_IGET_WIDE_JUMBO" since="11" />
+ <field name="OP_IGET_WIDE_QUICK" />
+ <field name="OP_IGET_WIDE_VOLATILE" since="9" />
+ <field name="OP_INSTANCE_OF" />
+ <field name="OP_INSTANCE_OF_JUMBO" since="11" />
+ <field name="OP_INT_TO_BYTE" />
+ <field name="OP_INT_TO_CHAR" />
+ <field name="OP_INT_TO_DOUBLE" />
+ <field name="OP_INT_TO_FLOAT" />
+ <field name="OP_INT_TO_LONG" />
+ <field name="OP_INT_TO_SHORT" />
+ <field name="OP_INVOKE_DIRECT" />
+ <field name="OP_INVOKE_DIRECT_EMPTY" />
+ <field name="OP_INVOKE_DIRECT_JUMBO" since="11" />
+ <field name="OP_INVOKE_DIRECT_RANGE" />
+ <field name="OP_INVOKE_INTERFACE" />
+ <field name="OP_INVOKE_INTERFACE_JUMBO" since="11" />
+ <field name="OP_INVOKE_INTERFACE_RANGE" />
+ <field name="OP_INVOKE_STATIC" />
+ <field name="OP_INVOKE_STATIC_JUMBO" since="11" />
+ <field name="OP_INVOKE_STATIC_RANGE" />
+ <field name="OP_INVOKE_SUPER" />
+ <field name="OP_INVOKE_SUPER_JUMBO" since="11" />
+ <field name="OP_INVOKE_SUPER_QUICK" />
+ <field name="OP_INVOKE_SUPER_QUICK_RANGE" />
+ <field name="OP_INVOKE_SUPER_RANGE" />
+ <field name="OP_INVOKE_VIRTUAL" />
+ <field name="OP_INVOKE_VIRTUAL_JUMBO" since="11" />
+ <field name="OP_INVOKE_VIRTUAL_QUICK" />
+ <field name="OP_INVOKE_VIRTUAL_QUICK_RANGE" />
+ <field name="OP_INVOKE_VIRTUAL_RANGE" />
+ <field name="OP_IPUT" />
+ <field name="OP_IPUT_BOOLEAN" />
+ <field name="OP_IPUT_BOOLEAN_JUMBO" since="11" />
+ <field name="OP_IPUT_BYTE" />
+ <field name="OP_IPUT_BYTE_JUMBO" since="11" />
+ <field name="OP_IPUT_CHAR" />
+ <field name="OP_IPUT_CHAR_JUMBO" since="11" />
+ <field name="OP_IPUT_JUMBO" since="11" />
+ <field name="OP_IPUT_OBJECT" />
+ <field name="OP_IPUT_OBJECT_JUMBO" since="11" />
+ <field name="OP_IPUT_OBJECT_QUICK" />
+ <field name="OP_IPUT_QUICK" />
+ <field name="OP_IPUT_SHORT" />
+ <field name="OP_IPUT_SHORT_JUMBO" since="11" />
+ <field name="OP_IPUT_WIDE" />
+ <field name="OP_IPUT_WIDE_JUMBO" since="11" />
+ <field name="OP_IPUT_WIDE_QUICK" />
+ <field name="OP_IPUT_WIDE_VOLATILE" since="9" />
+ <field name="OP_LONG_TO_DOUBLE" />
+ <field name="OP_LONG_TO_FLOAT" />
+ <field name="OP_LONG_TO_INT" />
+ <field name="OP_MONITOR_ENTER" />
+ <field name="OP_MONITOR_EXIT" />
+ <field name="OP_MOVE" />
+ <field name="OP_MOVE_16" />
+ <field name="OP_MOVE_EXCEPTION" />
+ <field name="OP_MOVE_FROM16" />
+ <field name="OP_MOVE_OBJECT" />
+ <field name="OP_MOVE_OBJECT_16" />
+ <field name="OP_MOVE_OBJECT_FROM16" />
+ <field name="OP_MOVE_RESULT" />
+ <field name="OP_MOVE_RESULT_OBJECT" />
+ <field name="OP_MOVE_RESULT_WIDE" />
+ <field name="OP_MOVE_WIDE" />
+ <field name="OP_MOVE_WIDE_16" />
+ <field name="OP_MOVE_WIDE_FROM16" />
+ <field name="OP_MUL_DOUBLE" />
+ <field name="OP_MUL_DOUBLE_2ADDR" />
+ <field name="OP_MUL_FLOAT" />
+ <field name="OP_MUL_FLOAT_2ADDR" />
+ <field name="OP_MUL_INT" />
+ <field name="OP_MUL_INT_2ADDR" />
+ <field name="OP_MUL_INT_LIT16" />
+ <field name="OP_MUL_INT_LIT8" />
+ <field name="OP_MUL_LONG" />
+ <field name="OP_MUL_LONG_2ADDR" />
+ <field name="OP_NEG_DOUBLE" />
+ <field name="OP_NEG_FLOAT" />
+ <field name="OP_NEG_INT" />
+ <field name="OP_NEG_LONG" />
+ <field name="OP_NEW_ARRAY" />
+ <field name="OP_NEW_ARRAY_JUMBO" since="11" />
+ <field name="OP_NEW_INSTANCE" />
+ <field name="OP_NEW_INSTANCE_JUMBO" since="11" />
+ <field name="OP_NOP" />
+ <field name="OP_NOT_INT" />
+ <field name="OP_NOT_LONG" />
+ <field name="OP_OR_INT" />
+ <field name="OP_OR_INT_2ADDR" />
+ <field name="OP_OR_INT_LIT16" />
+ <field name="OP_OR_INT_LIT8" />
+ <field name="OP_OR_LONG" />
+ <field name="OP_OR_LONG_2ADDR" />
+ <field name="OP_PACKED_SWITCH" />
+ <field name="OP_REM_DOUBLE" />
+ <field name="OP_REM_DOUBLE_2ADDR" />
+ <field name="OP_REM_FLOAT" />
+ <field name="OP_REM_FLOAT_2ADDR" />
+ <field name="OP_REM_INT" />
+ <field name="OP_REM_INT_2ADDR" />
+ <field name="OP_REM_INT_LIT16" />
+ <field name="OP_REM_INT_LIT8" />
+ <field name="OP_REM_LONG" />
+ <field name="OP_REM_LONG_2ADDR" />
+ <field name="OP_RETURN" />
+ <field name="OP_RETURN_OBJECT" />
+ <field name="OP_RETURN_VOID" />
+ <field name="OP_RETURN_WIDE" />
+ <field name="OP_RSUB_INT" />
+ <field name="OP_RSUB_INT_LIT8" />
+ <field name="OP_SGET" />
+ <field name="OP_SGET_BOOLEAN" />
+ <field name="OP_SGET_BOOLEAN_JUMBO" since="11" />
+ <field name="OP_SGET_BYTE" />
+ <field name="OP_SGET_BYTE_JUMBO" since="11" />
+ <field name="OP_SGET_CHAR" />
+ <field name="OP_SGET_CHAR_JUMBO" since="11" />
+ <field name="OP_SGET_JUMBO" since="11" />
+ <field name="OP_SGET_OBJECT" />
+ <field name="OP_SGET_OBJECT_JUMBO" since="11" />
+ <field name="OP_SGET_SHORT" />
+ <field name="OP_SGET_SHORT_JUMBO" since="11" />
+ <field name="OP_SGET_WIDE" />
+ <field name="OP_SGET_WIDE_JUMBO" since="11" />
+ <field name="OP_SGET_WIDE_VOLATILE" since="9" />
+ <field name="OP_SHL_INT" />
+ <field name="OP_SHL_INT_2ADDR" />
+ <field name="OP_SHL_INT_LIT8" />
+ <field name="OP_SHL_LONG" />
+ <field name="OP_SHL_LONG_2ADDR" />
+ <field name="OP_SHR_INT" />
+ <field name="OP_SHR_INT_2ADDR" />
+ <field name="OP_SHR_INT_LIT8" />
+ <field name="OP_SHR_LONG" />
+ <field name="OP_SHR_LONG_2ADDR" />
+ <field name="OP_SPARSE_SWITCH" />
+ <field name="OP_SPUT" />
+ <field name="OP_SPUT_BOOLEAN" />
+ <field name="OP_SPUT_BOOLEAN_JUMBO" since="11" />
+ <field name="OP_SPUT_BYTE" />
+ <field name="OP_SPUT_BYTE_JUMBO" since="11" />
+ <field name="OP_SPUT_CHAR" />
+ <field name="OP_SPUT_CHAR_JUMBO" since="11" />
+ <field name="OP_SPUT_JUMBO" since="11" />
+ <field name="OP_SPUT_OBJECT" />
+ <field name="OP_SPUT_OBJECT_JUMBO" since="11" />
+ <field name="OP_SPUT_SHORT" />
+ <field name="OP_SPUT_SHORT_JUMBO" since="11" />
+ <field name="OP_SPUT_WIDE" />
+ <field name="OP_SPUT_WIDE_JUMBO" since="11" />
+ <field name="OP_SPUT_WIDE_VOLATILE" since="9" />
+ <field name="OP_SUB_DOUBLE" />
+ <field name="OP_SUB_DOUBLE_2ADDR" />
+ <field name="OP_SUB_FLOAT" />
+ <field name="OP_SUB_FLOAT_2ADDR" />
+ <field name="OP_SUB_INT" />
+ <field name="OP_SUB_INT_2ADDR" />
+ <field name="OP_SUB_LONG" />
+ <field name="OP_SUB_LONG_2ADDR" />
+ <field name="OP_THROW" />
+ <field name="OP_THROW_VERIFICATION_ERROR" since="8" />
+ <field name="OP_UNUSED_3e" />
+ <field name="OP_UNUSED_3f" />
+ <field name="OP_UNUSED_40" />
+ <field name="OP_UNUSED_41" />
+ <field name="OP_UNUSED_42" />
+ <field name="OP_UNUSED_43" />
+ <field name="OP_UNUSED_73" />
+ <field name="OP_UNUSED_79" />
+ <field name="OP_UNUSED_7A" />
+ <field name="OP_UNUSED_E3" />
+ <field name="OP_UNUSED_E4" />
+ <field name="OP_UNUSED_E5" />
+ <field name="OP_UNUSED_E6" />
+ <field name="OP_UNUSED_E7" />
+ <field name="OP_UNUSED_E8" />
+ <field name="OP_UNUSED_E9" />
+ <field name="OP_UNUSED_EA" />
+ <field name="OP_UNUSED_EB" />
+ <field name="OP_UNUSED_EC" />
+ <field name="OP_UNUSED_ED" />
+ <field name="OP_UNUSED_EF" />
+ <field name="OP_UNUSED_F1" />
+ <field name="OP_UNUSED_FC" />
+ <field name="OP_UNUSED_FD" />
+ <field name="OP_UNUSED_FE" />
+ <field name="OP_UNUSED_FF" />
+ <field name="OP_USHR_INT" />
+ <field name="OP_USHR_INT_2ADDR" />
+ <field name="OP_USHR_INT_LIT8" />
+ <field name="OP_USHR_LONG" />
+ <field name="OP_USHR_LONG_2ADDR" />
+ <field name="OP_XOR_INT" />
+ <field name="OP_XOR_INT_2ADDR" />
+ <field name="OP_XOR_INT_LIT16" />
+ <field name="OP_XOR_INT_LIT8" />
+ <field name="OP_XOR_LONG" />
+ <field name="OP_XOR_LONG_2ADDR" />
+ </class>
+ <class name="dalvik/system/AllocationLimitError" since="1">
+ <extends name="java/lang/VirtualMachineError" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="dalvik/system/BaseDexClassLoader" since="14">
+ <extends name="java/lang/ClassLoader" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/io/File;Ljava/lang/String;Ljava/lang/ClassLoader;)V" />
+ </class>
+ <class name="dalvik/system/DexClassLoader" since="3">
+ <extends name="dalvik/system/BaseDexClassLoader" since="14" />
+ <extends name="java/lang/ClassLoader" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)V" />
+ </class>
+ <class name="dalvik/system/DexFile" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/io/File;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="close()V" />
+ <method name="entries()Ljava/util/Enumeration;" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="isDexOptNeeded(Ljava/lang/String;)Z" />
+ <method name="loadClass(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/lang/Class;" />
+ <method name="loadDex(Ljava/lang/String;Ljava/lang/String;I)Ldalvik/system/DexFile;" since="3" />
+ </class>
+ <class name="dalvik/system/PathClassLoader" since="1">
+ <extends name="dalvik/system/BaseDexClassLoader" since="14" />
+ <extends name="java/lang/ClassLoader" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/ClassLoader;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)V" />
+ </class>
+ <class name="dalvik/system/PotentialDeadlockError" since="1">
+ <extends name="java/lang/VirtualMachineError" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="dalvik/system/StaleDexCacheError" since="1">
+ <extends name="java/lang/VirtualMachineError" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="dalvik/system/TemporaryDirectory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="setUpDirectory(Ljava/io/File;)V" />
+ <method name="setUpDirectory(Ljava/lang/String;)V" />
+ </class>
+ <class name="dalvik/system/TouchDex" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="main([Ljava/lang/String;)V" />
+ <method name="start(Ljava/lang/String;)I" />
+ </class>
+ <class name="dalvik/system/VMDebug" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="dumpHprofData(Ljava/lang/String;)V" since="3" />
+ <method name="getAllocCount(I)I" />
+ <method name="getInstructionCount([I)V" />
+ <method name="getLoadedClassCount()I" />
+ <method name="isDebuggerConnected()Z" />
+ <method name="isDebuggingEnabled()Z" since="3" />
+ <method name="lastDebuggerActivity()J" />
+ <method name="printLoadedClasses(I)V" />
+ <method name="resetAllocCount(I)V" />
+ <method name="resetInstructionCount()V" />
+ <method name="setAllocationLimit(I)I" />
+ <method name="setGlobalAllocationLimit(I)I" />
+ <method name="startAllocCounting()V" />
+ <method name="startEmulatorTracing()V" />
+ <method name="startInstructionCounting()V" />
+ <method name="startMethodTracing()V" />
+ <method name="startMethodTracing(Ljava/lang/String;II)V" />
+ <method name="stopAllocCounting()V" />
+ <method name="stopEmulatorTracing()V" />
+ <method name="stopInstructionCounting()V" />
+ <method name="stopMethodTracing()V" />
+ <method name="threadCpuTimeNanos()J" />
+ <field name="DEFAULT_METHOD_TRACE_FILE_NAME" />
+ <field name="KIND_ALL_COUNTS" />
+ <field name="KIND_GLOBAL_ALLOCATED_BYTES" />
+ <field name="KIND_GLOBAL_ALLOCATED_OBJECTS" />
+ <field name="KIND_GLOBAL_CLASS_INIT_COUNT" since="8" />
+ <field name="KIND_GLOBAL_CLASS_INIT_TIME" since="8" />
+ <field name="KIND_GLOBAL_EXT_ALLOCATED_BYTES" />
+ <field name="KIND_GLOBAL_EXT_ALLOCATED_OBJECTS" />
+ <field name="KIND_GLOBAL_EXT_FREED_BYTES" />
+ <field name="KIND_GLOBAL_EXT_FREED_OBJECTS" />
+ <field name="KIND_GLOBAL_FREED_BYTES" />
+ <field name="KIND_GLOBAL_FREED_OBJECTS" />
+ <field name="KIND_GLOBAL_GC_INVOCATIONS" />
+ <field name="KIND_THREAD_ALLOCATED_BYTES" />
+ <field name="KIND_THREAD_ALLOCATED_OBJECTS" />
+ <field name="KIND_THREAD_CLASS_INIT_COUNT" since="8" />
+ <field name="KIND_THREAD_CLASS_INIT_TIME" since="8" />
+ <field name="KIND_THREAD_EXT_ALLOCATED_BYTES" />
+ <field name="KIND_THREAD_EXT_ALLOCATED_OBJECTS" />
+ <field name="KIND_THREAD_EXT_FREED_BYTES" />
+ <field name="KIND_THREAD_EXT_FREED_OBJECTS" />
+ <field name="KIND_THREAD_FREED_BYTES" />
+ <field name="KIND_THREAD_FREED_OBJECTS" />
+ <field name="KIND_THREAD_GC_INVOCATIONS" />
+ <field name="TRACE_COUNT_ALLOCS" />
+ </class>
+ <class name="dalvik/system/VMRuntime" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="gcSoftReferences()V" />
+ <method name="getExternalBytesAllocated()J" />
+ <method name="getMinimumHeapSize()J" />
+ <method name="getRuntime()Ldalvik/system/VMRuntime;" />
+ <method name="getTargetHeapUtilization()F" />
+ <method name="runFinalizationSync()V" />
+ <method name="setMinimumHeapSize(J)J" />
+ <method name="setTargetHeapUtilization(F)F" />
+ </class>
+ <class name="dalvik/system/VMStack" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getCallingClassLoader()Ljava/lang/ClassLoader;" />
+ <method name="getCallingClassLoader2()Ljava/lang/ClassLoader;" />
+ <method name="getClasses(IZ)[Ljava/lang/Class;" />
+ <method name="getThreadStackTrace(Ljava/lang/Thread;)[Ljava/lang/StackTraceElement;" />
+ </class>
+ <class name="dalvik/system/Zygote" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="fork()I" />
+ <method name="forkAndSpecialize(II[II[[I)I" since="3" />
+ <method name="forkAndSpecialize(II[IZ[[I)I" />
+ <method name="forkSystemServer(II[II[[I)I" since="3" />
+ <method name="forkSystemServer(II[IZ[[I)I" />
+ <field name="DEBUG_ENABLE_ASSERT" since="3" />
+ <field name="DEBUG_ENABLE_CHECKJNI" since="3" />
+ <field name="DEBUG_ENABLE_DEBUGGER" since="3" />
+ <field name="DEBUG_ENABLE_SAFEMODE" since="8" />
+ </class>
+ <class name="java/awt/font/NumericShaper" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>()V" />
+ <method name="getContextualShaper(I)Ljava/awt/font/NumericShaper;" />
+ <method name="getContextualShaper(II)Ljava/awt/font/NumericShaper;" />
+ <method name="getRanges()I" />
+ <method name="getShaper(I)Ljava/awt/font/NumericShaper;" />
+ <method name="isContextual()Z" />
+ <method name="shape([CII)V" />
+ <method name="shape([CIII)V" />
+ <field name="ALL_RANGES" />
+ <field name="ARABIC" />
+ <field name="BENGALI" />
+ <field name="DEVANAGARI" />
+ <field name="EASTERN_ARABIC" />
+ <field name="ETHIOPIC" />
+ <field name="EUROPEAN" />
+ <field name="GUJARATI" />
+ <field name="GURMUKHI" />
+ <field name="KANNADA" />
+ <field name="KHMER" />
+ <field name="LAO" />
+ <field name="MALAYALAM" />
+ <field name="MONGOLIAN" />
+ <field name="MYANMAR" />
+ <field name="ORIYA" />
+ <field name="TAMIL" />
+ <field name="TELUGU" />
+ <field name="THAI" />
+ <field name="TIBETAN" />
+ </class>
+ <class name="java/awt/font/TextAttribute" since="1">
+ <extends name="java/text/AttributedCharacterIterator$Attribute" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <field name="BACKGROUND" />
+ <field name="BIDI_EMBEDDING" />
+ <field name="CHAR_REPLACEMENT" />
+ <field name="FAMILY" />
+ <field name="FONT" />
+ <field name="FOREGROUND" />
+ <field name="INPUT_METHOD_HIGHLIGHT" />
+ <field name="INPUT_METHOD_UNDERLINE" />
+ <field name="JUSTIFICATION" />
+ <field name="JUSTIFICATION_FULL" />
+ <field name="JUSTIFICATION_NONE" />
+ <field name="KERNING" since="9" />
+ <field name="KERNING_ON" since="9" />
+ <field name="LIGATURES" since="9" />
+ <field name="LIGATURES_ON" since="9" />
+ <field name="NUMERIC_SHAPING" />
+ <field name="POSTURE" />
+ <field name="POSTURE_OBLIQUE" />
+ <field name="POSTURE_REGULAR" />
+ <field name="RUN_DIRECTION" />
+ <field name="RUN_DIRECTION_LTR" />
+ <field name="RUN_DIRECTION_RTL" />
+ <field name="SIZE" />
+ <field name="STRIKETHROUGH" />
+ <field name="STRIKETHROUGH_ON" />
+ <field name="SUPERSCRIPT" />
+ <field name="SUPERSCRIPT_SUB" />
+ <field name="SUPERSCRIPT_SUPER" />
+ <field name="SWAP_COLORS" />
+ <field name="SWAP_COLORS_ON" />
+ <field name="TRACKING" since="9" />
+ <field name="TRACKING_LOOSE" since="9" />
+ <field name="TRACKING_TIGHT" since="9" />
+ <field name="TRANSFORM" />
+ <field name="UNDERLINE" />
+ <field name="UNDERLINE_LOW_DASHED" />
+ <field name="UNDERLINE_LOW_DOTTED" />
+ <field name="UNDERLINE_LOW_GRAY" />
+ <field name="UNDERLINE_LOW_ONE_PIXEL" />
+ <field name="UNDERLINE_LOW_TWO_PIXEL" />
+ <field name="UNDERLINE_ON" />
+ <field name="WEIGHT" />
+ <field name="WEIGHT_BOLD" />
+ <field name="WEIGHT_DEMIBOLD" />
+ <field name="WEIGHT_DEMILIGHT" />
+ <field name="WEIGHT_EXTRABOLD" />
+ <field name="WEIGHT_EXTRA_LIGHT" />
+ <field name="WEIGHT_HEAVY" />
+ <field name="WEIGHT_LIGHT" />
+ <field name="WEIGHT_MEDIUM" />
+ <field name="WEIGHT_REGULAR" />
+ <field name="WEIGHT_SEMIBOLD" />
+ <field name="WEIGHT_ULTRABOLD" />
+ <field name="WIDTH" />
+ <field name="WIDTH_CONDENSED" />
+ <field name="WIDTH_EXTENDED" />
+ <field name="WIDTH_REGULAR" />
+ <field name="WIDTH_SEMI_CONDENSED" />
+ <field name="WIDTH_SEMI_EXTENDED" />
+ </class>
+ <class name="java/beans/IndexedPropertyChangeEvent" since="3">
+ <extends name="java/beans/PropertyChangeEvent" />
+ <method name="&lt;init>(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;I)V" />
+ <method name="getIndex()I" />
+ </class>
+ <class name="java/beans/PropertyChangeEvent" since="3">
+ <extends name="java/util/EventObject" />
+ <method name="&lt;init>(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V" />
+ <method name="getNewValue()Ljava/lang/Object;" />
+ <method name="getOldValue()Ljava/lang/Object;" />
+ <method name="getPropagationId()Ljava/lang/Object;" />
+ <method name="getPropertyName()Ljava/lang/String;" />
+ <method name="setPropagationId(Ljava/lang/Object;)V" />
+ </class>
+ <class name="java/beans/PropertyChangeListener" since="3">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/EventListener" />
+ <method name="propertyChange(Ljava/beans/PropertyChangeEvent;)V" />
+ </class>
+ <class name="java/beans/PropertyChangeListenerProxy" since="3">
+ <extends name="java/util/EventListenerProxy" />
+ <implements name="java/beans/PropertyChangeListener" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/beans/PropertyChangeListener;)V" />
+ <method name="getPropertyName()Ljava/lang/String;" />
+ </class>
+ <class name="java/beans/PropertyChangeSupport" since="3">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/lang/Object;)V" />
+ <method name="addPropertyChangeListener(Ljava/beans/PropertyChangeListener;)V" />
+ <method name="addPropertyChangeListener(Ljava/lang/String;Ljava/beans/PropertyChangeListener;)V" />
+ <method name="fireIndexedPropertyChange(Ljava/lang/String;III)V" />
+ <method name="fireIndexedPropertyChange(Ljava/lang/String;ILjava/lang/Object;Ljava/lang/Object;)V" />
+ <method name="fireIndexedPropertyChange(Ljava/lang/String;IZZ)V" />
+ <method name="firePropertyChange(Ljava/beans/PropertyChangeEvent;)V" />
+ <method name="firePropertyChange(Ljava/lang/String;II)V" />
+ <method name="firePropertyChange(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V" />
+ <method name="firePropertyChange(Ljava/lang/String;ZZ)V" />
+ <method name="getPropertyChangeListeners()[Ljava/beans/PropertyChangeListener;" />
+ <method name="getPropertyChangeListeners(Ljava/lang/String;)[Ljava/beans/PropertyChangeListener;" />
+ <method name="hasListeners(Ljava/lang/String;)Z" />
+ <method name="removePropertyChangeListener(Ljava/beans/PropertyChangeListener;)V" />
+ <method name="removePropertyChangeListener(Ljava/lang/String;Ljava/beans/PropertyChangeListener;)V" />
+ </class>
+ <class name="java/io/BufferedInputStream" since="1">
+ <extends name="java/io/FilterInputStream" />
+ <method name="&lt;init>(Ljava/io/InputStream;)V" />
+ <method name="&lt;init>(Ljava/io/InputStream;I)V" />
+ <field name="buf" />
+ <field name="count" />
+ <field name="marklimit" />
+ <field name="markpos" />
+ <field name="pos" />
+ </class>
+ <class name="java/io/BufferedOutputStream" since="1">
+ <extends name="java/io/FilterOutputStream" />
+ <method name="&lt;init>(Ljava/io/OutputStream;)V" />
+ <method name="&lt;init>(Ljava/io/OutputStream;I)V" />
+ <field name="buf" />
+ <field name="count" />
+ </class>
+ <class name="java/io/BufferedReader" since="1">
+ <extends name="java/io/Reader" />
+ <method name="&lt;init>(Ljava/io/Reader;)V" />
+ <method name="&lt;init>(Ljava/io/Reader;I)V" />
+ <method name="readLine()Ljava/lang/String;" />
+ </class>
+ <class name="java/io/BufferedWriter" since="1">
+ <extends name="java/io/Writer" />
+ <method name="&lt;init>(Ljava/io/Writer;)V" />
+ <method name="&lt;init>(Ljava/io/Writer;I)V" />
+ <method name="newLine()V" />
+ </class>
+ <class name="java/io/ByteArrayInputStream" since="1">
+ <extends name="java/io/InputStream" />
+ <method name="&lt;init>([B)V" />
+ <method name="&lt;init>([BII)V" />
+ <field name="buf" />
+ <field name="count" />
+ <field name="mark" />
+ <field name="pos" />
+ </class>
+ <class name="java/io/ByteArrayOutputStream" since="1">
+ <extends name="java/io/OutputStream" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="reset()V" />
+ <method name="size()I" />
+ <method name="toByteArray()[B" />
+ <method name="toString(I)Ljava/lang/String;" />
+ <method name="toString(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="writeTo(Ljava/io/OutputStream;)V" />
+ <field name="buf" />
+ <field name="count" />
+ </class>
+ <class name="java/io/CharArrayReader" since="1">
+ <extends name="java/io/Reader" />
+ <method name="&lt;init>([C)V" />
+ <method name="&lt;init>([CII)V" />
+ <field name="buf" />
+ <field name="count" />
+ <field name="markedPos" />
+ <field name="pos" />
+ </class>
+ <class name="java/io/CharArrayWriter" since="1">
+ <extends name="java/io/Writer" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="append(C)Ljava/io/CharArrayWriter;" />
+ <method name="append(Ljava/lang/CharSequence;)Ljava/io/CharArrayWriter;" />
+ <method name="append(Ljava/lang/CharSequence;II)Ljava/io/CharArrayWriter;" />
+ <method name="reset()V" />
+ <method name="size()I" />
+ <method name="toCharArray()[C" />
+ <method name="writeTo(Ljava/io/Writer;)V" />
+ <field name="buf" />
+ <field name="count" />
+ </class>
+ <class name="java/io/CharConversionException" since="1">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/io/Closeable" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/AutoCloseable" since="19" />
+ <method name="close()V" />
+ </class>
+ <class name="java/io/Console" since="9">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Flushable" />
+ <method name="&lt;init>()V" />
+ <method name="format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/Console;" />
+ <method name="printf(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/Console;" />
+ <method name="readLine()Ljava/lang/String;" />
+ <method name="readLine(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;" />
+ <method name="readPassword()[C" />
+ <method name="readPassword(Ljava/lang/String;[Ljava/lang/Object;)[C" />
+ <method name="reader()Ljava/io/Reader;" />
+ <method name="writer()Ljava/io/PrintWriter;" />
+ </class>
+ <class name="java/io/DataInput" since="1">
+ <extends name="java/lang/Object" />
+ <method name="readBoolean()Z" />
+ <method name="readByte()B" />
+ <method name="readChar()C" />
+ <method name="readDouble()D" />
+ <method name="readFloat()F" />
+ <method name="readFully([B)V" />
+ <method name="readFully([BII)V" />
+ <method name="readInt()I" />
+ <method name="readLine()Ljava/lang/String;" />
+ <method name="readLong()J" />
+ <method name="readShort()S" />
+ <method name="readUTF()Ljava/lang/String;" />
+ <method name="readUnsignedByte()I" />
+ <method name="readUnsignedShort()I" />
+ <method name="skipBytes(I)I" />
+ </class>
+ <class name="java/io/DataInputStream" since="1">
+ <extends name="java/io/FilterInputStream" />
+ <implements name="java/io/DataInput" />
+ <method name="&lt;init>(Ljava/io/InputStream;)V" />
+ <method name="readUTF(Ljava/io/DataInput;)Ljava/lang/String;" />
+ </class>
+ <class name="java/io/DataOutput" since="1">
+ <extends name="java/lang/Object" />
+ <method name="write(I)V" />
+ <method name="write([B)V" />
+ <method name="write([BII)V" />
+ <method name="writeBoolean(Z)V" />
+ <method name="writeByte(I)V" />
+ <method name="writeBytes(Ljava/lang/String;)V" />
+ <method name="writeChar(I)V" />
+ <method name="writeChars(Ljava/lang/String;)V" />
+ <method name="writeDouble(D)V" />
+ <method name="writeFloat(F)V" />
+ <method name="writeInt(I)V" />
+ <method name="writeLong(J)V" />
+ <method name="writeShort(I)V" />
+ <method name="writeUTF(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/io/DataOutputStream" since="1">
+ <extends name="java/io/FilterOutputStream" />
+ <implements name="java/io/DataOutput" />
+ <method name="&lt;init>(Ljava/io/OutputStream;)V" />
+ <method name="size()I" />
+ <field name="written" />
+ </class>
+ <class name="java/io/EOFException" since="1">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/io/Externalizable" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="readExternal(Ljava/io/ObjectInput;)V" />
+ <method name="writeExternal(Ljava/io/ObjectOutput;)V" />
+ </class>
+ <class name="java/io/File" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>(Ljava/io/File;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/net/URI;)V" />
+ <method name="canExecute()Z" since="9" />
+ <method name="canRead()Z" />
+ <method name="canWrite()Z" />
+ <method name="compareTo(Ljava/io/File;)I" />
+ <method name="createNewFile()Z" />
+ <method name="createTempFile(Ljava/lang/String;Ljava/lang/String;)Ljava/io/File;" />
+ <method name="createTempFile(Ljava/lang/String;Ljava/lang/String;Ljava/io/File;)Ljava/io/File;" />
+ <method name="delete()Z" />
+ <method name="deleteOnExit()V" />
+ <method name="exists()Z" />
+ <method name="getAbsoluteFile()Ljava/io/File;" />
+ <method name="getAbsolutePath()Ljava/lang/String;" />
+ <method name="getCanonicalFile()Ljava/io/File;" />
+ <method name="getCanonicalPath()Ljava/lang/String;" />
+ <method name="getFreeSpace()J" since="9" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getParent()Ljava/lang/String;" />
+ <method name="getParentFile()Ljava/io/File;" />
+ <method name="getPath()Ljava/lang/String;" />
+ <method name="getTotalSpace()J" since="9" />
+ <method name="getUsableSpace()J" since="9" />
+ <method name="isAbsolute()Z" />
+ <method name="isDirectory()Z" />
+ <method name="isFile()Z" />
+ <method name="isHidden()Z" />
+ <method name="lastModified()J" />
+ <method name="length()J" />
+ <method name="list()[Ljava/lang/String;" />
+ <method name="list(Ljava/io/FilenameFilter;)[Ljava/lang/String;" />
+ <method name="listFiles()[Ljava/io/File;" />
+ <method name="listFiles(Ljava/io/FileFilter;)[Ljava/io/File;" />
+ <method name="listFiles(Ljava/io/FilenameFilter;)[Ljava/io/File;" />
+ <method name="listRoots()[Ljava/io/File;" />
+ <method name="mkdir()Z" />
+ <method name="mkdirs()Z" />
+ <method name="renameTo(Ljava/io/File;)Z" />
+ <method name="setExecutable(Z)Z" since="9" />
+ <method name="setExecutable(ZZ)Z" since="9" />
+ <method name="setLastModified(J)Z" />
+ <method name="setReadOnly()Z" />
+ <method name="setReadable(Z)Z" since="9" />
+ <method name="setReadable(ZZ)Z" since="9" />
+ <method name="setWritable(Z)Z" since="9" />
+ <method name="setWritable(ZZ)Z" since="9" />
+ <method name="toURI()Ljava/net/URI;" />
+ <method name="toURL()Ljava/net/URL;" />
+ <field name="pathSeparator" />
+ <field name="pathSeparatorChar" />
+ <field name="separator" />
+ <field name="separatorChar" />
+ </class>
+ <class name="java/io/FileDescriptor" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="sync()V" />
+ <method name="valid()Z" />
+ <field name="err" />
+ <field name="in" />
+ <field name="out" />
+ </class>
+ <class name="java/io/FileFilter" since="1">
+ <extends name="java/lang/Object" />
+ <method name="accept(Ljava/io/File;)Z" />
+ </class>
+ <class name="java/io/FileInputStream" since="1">
+ <extends name="java/io/InputStream" />
+ <implements name="java/io/Closeable" />
+ <method name="&lt;init>(Ljava/io/File;)V" />
+ <method name="&lt;init>(Ljava/io/FileDescriptor;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getChannel()Ljava/nio/channels/FileChannel;" />
+ <method name="getFD()Ljava/io/FileDescriptor;" />
+ </class>
+ <class name="java/io/FileNotFoundException" since="1">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/io/FileOutputStream" since="1">
+ <extends name="java/io/OutputStream" />
+ <implements name="java/io/Closeable" />
+ <method name="&lt;init>(Ljava/io/File;)V" />
+ <method name="&lt;init>(Ljava/io/File;Z)V" />
+ <method name="&lt;init>(Ljava/io/FileDescriptor;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Z)V" />
+ <method name="getChannel()Ljava/nio/channels/FileChannel;" />
+ <method name="getFD()Ljava/io/FileDescriptor;" />
+ </class>
+ <class name="java/io/FilePermission" since="1">
+ <extends name="java/security/Permission" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="java/io/FileReader" since="1">
+ <extends name="java/io/InputStreamReader" />
+ <method name="&lt;init>(Ljava/io/File;)V" />
+ <method name="&lt;init>(Ljava/io/FileDescriptor;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/io/FileWriter" since="1">
+ <extends name="java/io/OutputStreamWriter" />
+ <method name="&lt;init>(Ljava/io/File;)V" />
+ <method name="&lt;init>(Ljava/io/File;Z)V" />
+ <method name="&lt;init>(Ljava/io/FileDescriptor;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Z)V" />
+ </class>
+ <class name="java/io/FilenameFilter" since="1">
+ <extends name="java/lang/Object" />
+ <method name="accept(Ljava/io/File;Ljava/lang/String;)Z" />
+ </class>
+ <class name="java/io/FilterInputStream" since="1">
+ <extends name="java/io/InputStream" />
+ <method name="&lt;init>(Ljava/io/InputStream;)V" />
+ <field name="in" />
+ </class>
+ <class name="java/io/FilterOutputStream" since="1">
+ <extends name="java/io/OutputStream" />
+ <method name="&lt;init>(Ljava/io/OutputStream;)V" />
+ <field name="out" />
+ </class>
+ <class name="java/io/FilterReader" since="1">
+ <extends name="java/io/Reader" />
+ <method name="&lt;init>(Ljava/io/Reader;)V" />
+ <field name="in" />
+ </class>
+ <class name="java/io/FilterWriter" since="1">
+ <extends name="java/io/Writer" />
+ <method name="&lt;init>(Ljava/io/Writer;)V" />
+ <field name="out" />
+ </class>
+ <class name="java/io/Flushable" since="1">
+ <extends name="java/lang/Object" />
+ <method name="flush()V" />
+ </class>
+ <class name="java/io/IOError" since="9">
+ <extends name="java/lang/Error" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/io/IOException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" since="9" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" since="9" />
+ </class>
+ <class name="java/io/InputStream" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Closeable" />
+ <method name="&lt;init>()V" />
+ <method name="available()I" />
+ <method name="mark(I)V" />
+ <method name="markSupported()Z" />
+ <method name="read()I" />
+ <method name="read([B)I" />
+ <method name="read([BII)I" />
+ <method name="reset()V" />
+ <method name="skip(J)J" />
+ </class>
+ <class name="java/io/InputStreamReader" since="1">
+ <extends name="java/io/Reader" />
+ <method name="&lt;init>(Ljava/io/InputStream;)V" />
+ <method name="&lt;init>(Ljava/io/InputStream;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/io/InputStream;Ljava/nio/charset/Charset;)V" />
+ <method name="&lt;init>(Ljava/io/InputStream;Ljava/nio/charset/CharsetDecoder;)V" />
+ <method name="getEncoding()Ljava/lang/String;" />
+ </class>
+ <class name="java/io/InterruptedIOException" since="1">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <field name="bytesTransferred" />
+ </class>
+ <class name="java/io/InvalidClassException" since="1">
+ <extends name="java/io/ObjectStreamException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <field name="classname" />
+ </class>
+ <class name="java/io/InvalidObjectException" since="1">
+ <extends name="java/io/ObjectStreamException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/io/LineNumberInputStream" since="1">
+ <extends name="java/io/FilterInputStream" />
+ <method name="&lt;init>(Ljava/io/InputStream;)V" />
+ <method name="getLineNumber()I" />
+ <method name="setLineNumber(I)V" />
+ </class>
+ <class name="java/io/LineNumberReader" since="1">
+ <extends name="java/io/BufferedReader" />
+ <method name="&lt;init>(Ljava/io/Reader;)V" />
+ <method name="&lt;init>(Ljava/io/Reader;I)V" />
+ <method name="getLineNumber()I" />
+ <method name="setLineNumber(I)V" />
+ </class>
+ <class name="java/io/NotActiveException" since="1">
+ <extends name="java/io/ObjectStreamException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/io/NotSerializableException" since="1">
+ <extends name="java/io/ObjectStreamException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/io/ObjectInput" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/DataInput" />
+ <implements name="java/lang/AutoCloseable" since="19" />
+ <method name="available()I" />
+ <method name="close()V" />
+ <method name="read()I" />
+ <method name="read([B)I" />
+ <method name="read([BII)I" />
+ <method name="readObject()Ljava/lang/Object;" />
+ <method name="skip(J)J" />
+ </class>
+ <class name="java/io/ObjectInputStream" since="1">
+ <extends name="java/io/InputStream" />
+ <implements name="java/io/ObjectInput" />
+ <implements name="java/io/ObjectStreamConstants" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/io/InputStream;)V" />
+ <method name="defaultReadObject()V" />
+ <method name="enableResolveObject(Z)Z" />
+ <method name="readClassDescriptor()Ljava/io/ObjectStreamClass;" />
+ <method name="readFields()Ljava/io/ObjectInputStream$GetField;" />
+ <method name="readObjectOverride()Ljava/lang/Object;" />
+ <method name="readStreamHeader()V" />
+ <method name="readUnshared()Ljava/lang/Object;" />
+ <method name="registerValidation(Ljava/io/ObjectInputValidation;I)V" />
+ <method name="resolveClass(Ljava/io/ObjectStreamClass;)Ljava/lang/Class;" />
+ <method name="resolveObject(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="resolveProxyClass([Ljava/lang/String;)Ljava/lang/Class;" />
+ </class>
+ <class name="java/io/ObjectInputStream$GetField" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="defaulted(Ljava/lang/String;)Z" />
+ <method name="get(Ljava/lang/String;B)B" />
+ <method name="get(Ljava/lang/String;C)C" />
+ <method name="get(Ljava/lang/String;D)D" />
+ <method name="get(Ljava/lang/String;F)F" />
+ <method name="get(Ljava/lang/String;I)I" />
+ <method name="get(Ljava/lang/String;J)J" />
+ <method name="get(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="get(Ljava/lang/String;S)S" />
+ <method name="get(Ljava/lang/String;Z)Z" />
+ <method name="getObjectStreamClass()Ljava/io/ObjectStreamClass;" />
+ </class>
+ <class name="java/io/ObjectInputValidation" since="1">
+ <extends name="java/lang/Object" />
+ <method name="validateObject()V" />
+ </class>
+ <class name="java/io/ObjectOutput" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/DataOutput" />
+ <implements name="java/lang/AutoCloseable" since="19" />
+ <method name="close()V" />
+ <method name="flush()V" />
+ <method name="writeObject(Ljava/lang/Object;)V" />
+ </class>
+ <class name="java/io/ObjectOutputStream" since="1">
+ <extends name="java/io/OutputStream" />
+ <implements name="java/io/ObjectOutput" />
+ <implements name="java/io/ObjectStreamConstants" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/io/OutputStream;)V" />
+ <method name="annotateClass(Ljava/lang/Class;)V" />
+ <method name="annotateProxyClass(Ljava/lang/Class;)V" />
+ <method name="defaultWriteObject()V" />
+ <method name="drain()V" />
+ <method name="enableReplaceObject(Z)Z" />
+ <method name="putFields()Ljava/io/ObjectOutputStream$PutField;" />
+ <method name="replaceObject(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="reset()V" />
+ <method name="useProtocolVersion(I)V" />
+ <method name="writeClassDescriptor(Ljava/io/ObjectStreamClass;)V" />
+ <method name="writeFields()V" />
+ <method name="writeObjectOverride(Ljava/lang/Object;)V" />
+ <method name="writeStreamHeader()V" />
+ <method name="writeUnshared(Ljava/lang/Object;)V" />
+ </class>
+ <class name="java/io/ObjectOutputStream$PutField" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="put(Ljava/lang/String;B)V" />
+ <method name="put(Ljava/lang/String;C)V" />
+ <method name="put(Ljava/lang/String;D)V" />
+ <method name="put(Ljava/lang/String;F)V" />
+ <method name="put(Ljava/lang/String;I)V" />
+ <method name="put(Ljava/lang/String;J)V" />
+ <method name="put(Ljava/lang/String;Ljava/lang/Object;)V" />
+ <method name="put(Ljava/lang/String;S)V" />
+ <method name="put(Ljava/lang/String;Z)V" />
+ <method name="write(Ljava/io/ObjectOutput;)V" />
+ </class>
+ <class name="java/io/ObjectStreamClass" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>()V" />
+ <method name="forClass()Ljava/lang/Class;" />
+ <method name="getField(Ljava/lang/String;)Ljava/io/ObjectStreamField;" />
+ <method name="getFields()[Ljava/io/ObjectStreamField;" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getSerialVersionUID()J" />
+ <method name="lookup(Ljava/lang/Class;)Ljava/io/ObjectStreamClass;" />
+ <method name="lookupAny(Ljava/lang/Class;)Ljava/io/ObjectStreamClass;" since="9" />
+ <field name="NO_FIELDS" />
+ </class>
+ <class name="java/io/ObjectStreamConstants" since="1">
+ <extends name="java/lang/Object" />
+ <field name="PROTOCOL_VERSION_1" />
+ <field name="PROTOCOL_VERSION_2" />
+ <field name="SC_BLOCK_DATA" />
+ <field name="SC_ENUM" />
+ <field name="SC_EXTERNALIZABLE" />
+ <field name="SC_SERIALIZABLE" />
+ <field name="SC_WRITE_METHOD" />
+ <field name="STREAM_MAGIC" />
+ <field name="STREAM_VERSION" />
+ <field name="SUBCLASS_IMPLEMENTATION_PERMISSION" />
+ <field name="SUBSTITUTION_PERMISSION" />
+ <field name="TC_ARRAY" />
+ <field name="TC_BASE" />
+ <field name="TC_BLOCKDATA" />
+ <field name="TC_BLOCKDATALONG" />
+ <field name="TC_CLASS" />
+ <field name="TC_CLASSDESC" />
+ <field name="TC_ENDBLOCKDATA" />
+ <field name="TC_ENUM" />
+ <field name="TC_EXCEPTION" />
+ <field name="TC_LONGSTRING" />
+ <field name="TC_MAX" />
+ <field name="TC_NULL" />
+ <field name="TC_OBJECT" />
+ <field name="TC_PROXYCLASSDESC" />
+ <field name="TC_REFERENCE" />
+ <field name="TC_RESET" />
+ <field name="TC_STRING" />
+ <field name="baseWireHandle" />
+ </class>
+ <class name="java/io/ObjectStreamException" since="1">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/io/ObjectStreamField" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Class;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Class;Z)V" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getOffset()I" />
+ <method name="getType()Ljava/lang/Class;" />
+ <method name="getTypeCode()C" />
+ <method name="getTypeString()Ljava/lang/String;" />
+ <method name="isPrimitive()Z" />
+ <method name="isUnshared()Z" />
+ <method name="setOffset(I)V" />
+ </class>
+ <class name="java/io/OptionalDataException" since="1">
+ <extends name="java/io/ObjectStreamException" />
+ <method name="&lt;init>()V" />
+ <field name="eof" />
+ <field name="length" />
+ </class>
+ <class name="java/io/OutputStream" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Closeable" />
+ <implements name="java/io/Flushable" />
+ <method name="&lt;init>()V" />
+ <method name="write(I)V" />
+ <method name="write([B)V" />
+ <method name="write([BII)V" />
+ </class>
+ <class name="java/io/OutputStreamWriter" since="1">
+ <extends name="java/io/Writer" />
+ <method name="&lt;init>(Ljava/io/OutputStream;)V" />
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/nio/charset/Charset;)V" />
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/nio/charset/CharsetEncoder;)V" />
+ <method name="getEncoding()Ljava/lang/String;" />
+ </class>
+ <class name="java/io/PipedInputStream" since="1">
+ <extends name="java/io/InputStream" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" since="9" />
+ <method name="&lt;init>(Ljava/io/PipedOutputStream;)V" />
+ <method name="&lt;init>(Ljava/io/PipedOutputStream;I)V" since="9" />
+ <method name="connect(Ljava/io/PipedOutputStream;)V" />
+ <method name="receive(I)V" />
+ <field name="PIPE_SIZE" />
+ <field name="buffer" />
+ <field name="in" />
+ <field name="out" />
+ </class>
+ <class name="java/io/PipedOutputStream" since="1">
+ <extends name="java/io/OutputStream" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/io/PipedInputStream;)V" />
+ <method name="connect(Ljava/io/PipedInputStream;)V" />
+ </class>
+ <class name="java/io/PipedReader" since="1">
+ <extends name="java/io/Reader" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" since="9" />
+ <method name="&lt;init>(Ljava/io/PipedWriter;)V" />
+ <method name="&lt;init>(Ljava/io/PipedWriter;I)V" since="9" />
+ <method name="connect(Ljava/io/PipedWriter;)V" />
+ </class>
+ <class name="java/io/PipedWriter" since="1">
+ <extends name="java/io/Writer" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/io/PipedReader;)V" />
+ <method name="connect(Ljava/io/PipedReader;)V" />
+ </class>
+ <class name="java/io/PrintStream" since="1">
+ <extends name="java/io/FilterOutputStream" />
+ <implements name="java/io/Closeable" />
+ <implements name="java/lang/Appendable" />
+ <method name="&lt;init>(Ljava/io/File;)V" />
+ <method name="&lt;init>(Ljava/io/File;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/io/OutputStream;)V" />
+ <method name="&lt;init>(Ljava/io/OutputStream;Z)V" />
+ <method name="&lt;init>(Ljava/io/OutputStream;ZLjava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="append(C)Ljava/io/PrintStream;" />
+ <method name="append(Ljava/lang/CharSequence;)Ljava/io/PrintStream;" />
+ <method name="append(Ljava/lang/CharSequence;II)Ljava/io/PrintStream;" />
+ <method name="checkError()Z" />
+ <method name="clearError()V" since="9" />
+ <method name="format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;" />
+ <method name="format(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;" />
+ <method name="print(C)V" />
+ <method name="print(D)V" />
+ <method name="print(F)V" />
+ <method name="print(I)V" />
+ <method name="print(J)V" />
+ <method name="print(Ljava/lang/Object;)V" />
+ <method name="print(Ljava/lang/String;)V" />
+ <method name="print(Z)V" />
+ <method name="print([C)V" />
+ <method name="printf(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;" />
+ <method name="printf(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream;" />
+ <method name="println()V" />
+ <method name="println(C)V" />
+ <method name="println(D)V" />
+ <method name="println(F)V" />
+ <method name="println(I)V" />
+ <method name="println(J)V" />
+ <method name="println(Ljava/lang/Object;)V" />
+ <method name="println(Ljava/lang/String;)V" />
+ <method name="println(Z)V" />
+ <method name="println([C)V" />
+ <method name="setError()V" />
+ </class>
+ <class name="java/io/PrintWriter" since="1">
+ <extends name="java/io/Writer" />
+ <method name="&lt;init>(Ljava/io/File;)V" />
+ <method name="&lt;init>(Ljava/io/File;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/io/OutputStream;)V" />
+ <method name="&lt;init>(Ljava/io/OutputStream;Z)V" />
+ <method name="&lt;init>(Ljava/io/Writer;)V" />
+ <method name="&lt;init>(Ljava/io/Writer;Z)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="append(C)Ljava/io/PrintWriter;" />
+ <method name="append(Ljava/lang/CharSequence;)Ljava/io/PrintWriter;" />
+ <method name="append(Ljava/lang/CharSequence;II)Ljava/io/PrintWriter;" />
+ <method name="checkError()Z" />
+ <method name="clearError()V" since="9" />
+ <method name="format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintWriter;" />
+ <method name="format(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintWriter;" />
+ <method name="print(C)V" />
+ <method name="print(D)V" />
+ <method name="print(F)V" />
+ <method name="print(I)V" />
+ <method name="print(J)V" />
+ <method name="print(Ljava/lang/Object;)V" />
+ <method name="print(Ljava/lang/String;)V" />
+ <method name="print(Z)V" />
+ <method name="print([C)V" />
+ <method name="printf(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintWriter;" />
+ <method name="printf(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintWriter;" />
+ <method name="println()V" />
+ <method name="println(C)V" />
+ <method name="println(D)V" />
+ <method name="println(F)V" />
+ <method name="println(I)V" />
+ <method name="println(J)V" />
+ <method name="println(Ljava/lang/Object;)V" />
+ <method name="println(Ljava/lang/String;)V" />
+ <method name="println(Z)V" />
+ <method name="println([C)V" />
+ <method name="setError()V" />
+ <field name="out" />
+ </class>
+ <class name="java/io/PushbackInputStream" since="1">
+ <extends name="java/io/FilterInputStream" />
+ <method name="&lt;init>(Ljava/io/InputStream;)V" />
+ <method name="&lt;init>(Ljava/io/InputStream;I)V" />
+ <method name="unread(I)V" />
+ <method name="unread([B)V" />
+ <method name="unread([BII)V" />
+ <field name="buf" />
+ <field name="pos" />
+ </class>
+ <class name="java/io/PushbackReader" since="1">
+ <extends name="java/io/FilterReader" />
+ <method name="&lt;init>(Ljava/io/Reader;)V" />
+ <method name="&lt;init>(Ljava/io/Reader;I)V" />
+ <method name="unread(I)V" />
+ <method name="unread([C)V" />
+ <method name="unread([CII)V" />
+ </class>
+ <class name="java/io/RandomAccessFile" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Closeable" />
+ <implements name="java/io/DataInput" />
+ <implements name="java/io/DataOutput" />
+ <method name="&lt;init>(Ljava/io/File;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="getChannel()Ljava/nio/channels/FileChannel;" />
+ <method name="getFD()Ljava/io/FileDescriptor;" />
+ <method name="getFilePointer()J" />
+ <method name="length()J" />
+ <method name="read()I" />
+ <method name="read([B)I" />
+ <method name="read([BII)I" />
+ <method name="seek(J)V" />
+ <method name="setLength(J)V" />
+ </class>
+ <class name="java/io/Reader" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Closeable" />
+ <implements name="java/lang/Readable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/Object;)V" />
+ <method name="mark(I)V" />
+ <method name="markSupported()Z" />
+ <method name="read()I" />
+ <method name="read([C)I" />
+ <method name="read([CII)I" />
+ <method name="ready()Z" />
+ <method name="reset()V" />
+ <method name="skip(J)J" />
+ <field name="lock" />
+ </class>
+ <class name="java/io/SequenceInputStream" since="1">
+ <extends name="java/io/InputStream" />
+ <method name="&lt;init>(Ljava/io/InputStream;Ljava/io/InputStream;)V" />
+ <method name="&lt;init>(Ljava/util/Enumeration;)V" />
+ </class>
+ <class name="java/io/Serializable" since="1">
+ <extends name="java/lang/Object" />
+ </class>
+ <class name="java/io/SerializablePermission" since="1">
+ <extends name="java/security/BasicPermission" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="java/io/StreamCorruptedException" since="1">
+ <extends name="java/io/ObjectStreamException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/io/StreamTokenizer" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/io/InputStream;)V" />
+ <method name="&lt;init>(Ljava/io/Reader;)V" />
+ <method name="commentChar(I)V" />
+ <method name="eolIsSignificant(Z)V" />
+ <method name="lineno()I" />
+ <method name="lowerCaseMode(Z)V" />
+ <method name="nextToken()I" />
+ <method name="ordinaryChar(I)V" />
+ <method name="ordinaryChars(II)V" />
+ <method name="parseNumbers()V" />
+ <method name="pushBack()V" />
+ <method name="quoteChar(I)V" />
+ <method name="resetSyntax()V" />
+ <method name="slashSlashComments(Z)V" />
+ <method name="slashStarComments(Z)V" />
+ <method name="whitespaceChars(II)V" />
+ <method name="wordChars(II)V" />
+ <field name="TT_EOF" />
+ <field name="TT_EOL" />
+ <field name="TT_NUMBER" />
+ <field name="TT_WORD" />
+ <field name="nval" />
+ <field name="sval" />
+ <field name="ttype" />
+ </class>
+ <class name="java/io/StringBufferInputStream" since="1">
+ <extends name="java/io/InputStream" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <field name="buffer" />
+ <field name="count" />
+ <field name="pos" />
+ </class>
+ <class name="java/io/StringReader" since="1">
+ <extends name="java/io/Reader" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/io/StringWriter" since="1">
+ <extends name="java/io/Writer" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="append(C)Ljava/io/StringWriter;" />
+ <method name="append(Ljava/lang/CharSequence;)Ljava/io/StringWriter;" />
+ <method name="append(Ljava/lang/CharSequence;II)Ljava/io/StringWriter;" />
+ <method name="getBuffer()Ljava/lang/StringBuffer;" />
+ </class>
+ <class name="java/io/SyncFailedException" since="1">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/io/UTFDataFormatException" since="1">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/io/UnsupportedEncodingException" since="1">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/io/WriteAbortedException" since="1">
+ <extends name="java/io/ObjectStreamException" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Exception;)V" />
+ <field name="detail" />
+ </class>
+ <class name="java/io/Writer" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Closeable" />
+ <implements name="java/io/Flushable" />
+ <implements name="java/lang/Appendable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/Object;)V" />
+ <method name="append(C)Ljava/io/Writer;" />
+ <method name="append(Ljava/lang/CharSequence;)Ljava/io/Writer;" />
+ <method name="append(Ljava/lang/CharSequence;II)Ljava/io/Writer;" />
+ <method name="write(I)V" />
+ <method name="write(Ljava/lang/String;)V" />
+ <method name="write(Ljava/lang/String;II)V" />
+ <method name="write([C)V" />
+ <method name="write([CII)V" />
+ <field name="lock" />
+ </class>
+ <class name="java/lang/AbstractMethodError" since="1">
+ <extends name="java/lang/IncompatibleClassChangeError" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/AbstractStringBuilder" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="capacity()I" />
+ <method name="charAt(I)C" />
+ <method name="codePointAt(I)I" />
+ <method name="codePointBefore(I)I" />
+ <method name="codePointCount(II)I" />
+ <method name="ensureCapacity(I)V" />
+ <method name="getChars(II[CI)V" />
+ <method name="indexOf(Ljava/lang/String;)I" />
+ <method name="indexOf(Ljava/lang/String;I)I" />
+ <method name="lastIndexOf(Ljava/lang/String;)I" />
+ <method name="lastIndexOf(Ljava/lang/String;I)I" />
+ <method name="length()I" />
+ <method name="offsetByCodePoints(II)I" />
+ <method name="setCharAt(IC)V" />
+ <method name="setLength(I)V" />
+ <method name="subSequence(II)Ljava/lang/CharSequence;" />
+ <method name="substring(I)Ljava/lang/String;" />
+ <method name="substring(II)Ljava/lang/String;" />
+ <method name="trimToSize()V" />
+ </class>
+ <class name="java/lang/Appendable" since="1">
+ <extends name="java/lang/Object" />
+ <method name="append(C)Ljava/lang/Appendable;" />
+ <method name="append(Ljava/lang/CharSequence;)Ljava/lang/Appendable;" />
+ <method name="append(Ljava/lang/CharSequence;II)Ljava/lang/Appendable;" />
+ </class>
+ <class name="java/lang/ArithmeticException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/ArrayIndexOutOfBoundsException" since="1">
+ <extends name="java/lang/IndexOutOfBoundsException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/ArrayStoreException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/AssertionError" since="1">
+ <extends name="java/lang/Error" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(C)V" />
+ <method name="&lt;init>(D)V" />
+ <method name="&lt;init>(F)V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(J)V" />
+ <method name="&lt;init>(Ljava/lang/Object;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" since="19" />
+ <method name="&lt;init>(Z)V" />
+ </class>
+ <class name="java/lang/AutoCloseable" since="19">
+ <extends name="java/lang/Object" />
+ <method name="close()V" />
+ </class>
+ <class name="java/lang/Boolean" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Z)V" />
+ <method name="booleanValue()Z" />
+ <method name="compare(ZZ)I" since="19" />
+ <method name="compareTo(Ljava/lang/Boolean;)I" />
+ <method name="getBoolean(Ljava/lang/String;)Z" />
+ <method name="parseBoolean(Ljava/lang/String;)Z" />
+ <method name="toString(Z)Ljava/lang/String;" />
+ <method name="valueOf(Ljava/lang/String;)Ljava/lang/Boolean;" />
+ <method name="valueOf(Z)Ljava/lang/Boolean;" />
+ <field name="FALSE" />
+ <field name="TRUE" />
+ <field name="TYPE" />
+ </class>
+ <class name="java/lang/Byte" since="1">
+ <extends name="java/lang/Number" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>(B)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="compare(BB)I" since="19" />
+ <method name="compareTo(Ljava/lang/Byte;)I" />
+ <method name="decode(Ljava/lang/String;)Ljava/lang/Byte;" />
+ <method name="parseByte(Ljava/lang/String;)B" />
+ <method name="parseByte(Ljava/lang/String;I)B" />
+ <method name="toString(B)Ljava/lang/String;" />
+ <method name="valueOf(B)Ljava/lang/Byte;" />
+ <method name="valueOf(Ljava/lang/String;)Ljava/lang/Byte;" />
+ <method name="valueOf(Ljava/lang/String;I)Ljava/lang/Byte;" />
+ <field name="MAX_VALUE" />
+ <field name="MIN_VALUE" />
+ <field name="SIZE" />
+ <field name="TYPE" />
+ </class>
+ <class name="java/lang/CharSequence" since="1">
+ <extends name="java/lang/Object" />
+ <method name="charAt(I)C" />
+ <method name="length()I" />
+ <method name="subSequence(II)Ljava/lang/CharSequence;" />
+ </class>
+ <class name="java/lang/Character" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>(C)V" />
+ <method name="charCount(I)I" />
+ <method name="charValue()C" />
+ <method name="codePointAt(Ljava/lang/CharSequence;I)I" />
+ <method name="codePointAt([CI)I" />
+ <method name="codePointAt([CII)I" />
+ <method name="codePointBefore(Ljava/lang/CharSequence;I)I" />
+ <method name="codePointBefore([CI)I" />
+ <method name="codePointBefore([CII)I" />
+ <method name="codePointCount(Ljava/lang/CharSequence;II)I" />
+ <method name="codePointCount([CII)I" />
+ <method name="compare(CC)I" since="19" />
+ <method name="compareTo(Ljava/lang/Character;)I" />
+ <method name="digit(CI)I" />
+ <method name="digit(II)I" />
+ <method name="forDigit(II)C" />
+ <method name="getDirectionality(C)B" />
+ <method name="getDirectionality(I)B" />
+ <method name="getName(I)Ljava/lang/String;" since="19" />
+ <method name="getNumericValue(C)I" />
+ <method name="getNumericValue(I)I" />
+ <method name="getType(C)I" />
+ <method name="getType(I)I" />
+ <method name="highSurrogate(I)C" since="19" />
+ <method name="isAlphabetic(I)Z" since="19" />
+ <method name="isBmpCodePoint(I)Z" since="19" />
+ <method name="isDefined(C)Z" />
+ <method name="isDefined(I)Z" />
+ <method name="isDigit(C)Z" />
+ <method name="isDigit(I)Z" />
+ <method name="isHighSurrogate(C)Z" />
+ <method name="isISOControl(C)Z" />
+ <method name="isISOControl(I)Z" />
+ <method name="isIdentifierIgnorable(C)Z" />
+ <method name="isIdentifierIgnorable(I)Z" />
+ <method name="isIdeographic(I)Z" since="19" />
+ <method name="isJavaIdentifierPart(C)Z" />
+ <method name="isJavaIdentifierPart(I)Z" />
+ <method name="isJavaIdentifierStart(C)Z" />
+ <method name="isJavaIdentifierStart(I)Z" />
+ <method name="isJavaLetter(C)Z" />
+ <method name="isJavaLetterOrDigit(C)Z" />
+ <method name="isLetter(C)Z" />
+ <method name="isLetter(I)Z" />
+ <method name="isLetterOrDigit(C)Z" />
+ <method name="isLetterOrDigit(I)Z" />
+ <method name="isLowSurrogate(C)Z" />
+ <method name="isLowerCase(C)Z" />
+ <method name="isLowerCase(I)Z" />
+ <method name="isMirrored(C)Z" />
+ <method name="isMirrored(I)Z" />
+ <method name="isSpace(C)Z" />
+ <method name="isSpaceChar(C)Z" />
+ <method name="isSpaceChar(I)Z" />
+ <method name="isSupplementaryCodePoint(I)Z" />
+ <method name="isSurrogate(C)Z" since="19" />
+ <method name="isSurrogatePair(CC)Z" />
+ <method name="isTitleCase(C)Z" />
+ <method name="isTitleCase(I)Z" />
+ <method name="isUnicodeIdentifierPart(C)Z" />
+ <method name="isUnicodeIdentifierPart(I)Z" />
+ <method name="isUnicodeIdentifierStart(C)Z" />
+ <method name="isUnicodeIdentifierStart(I)Z" />
+ <method name="isUpperCase(C)Z" />
+ <method name="isUpperCase(I)Z" />
+ <method name="isValidCodePoint(I)Z" />
+ <method name="isWhitespace(C)Z" />
+ <method name="isWhitespace(I)Z" />
+ <method name="lowSurrogate(I)C" since="19" />
+ <method name="offsetByCodePoints(Ljava/lang/CharSequence;II)I" />
+ <method name="offsetByCodePoints([CIIII)I" />
+ <method name="reverseBytes(C)C" />
+ <method name="toChars(I)[C" />
+ <method name="toChars(I[CI)I" />
+ <method name="toCodePoint(CC)I" />
+ <method name="toLowerCase(C)C" />
+ <method name="toLowerCase(I)I" />
+ <method name="toString(C)Ljava/lang/String;" />
+ <method name="toTitleCase(C)C" />
+ <method name="toTitleCase(I)I" />
+ <method name="toUpperCase(C)C" />
+ <method name="toUpperCase(I)I" />
+ <method name="valueOf(C)Ljava/lang/Character;" />
+ <field name="COMBINING_SPACING_MARK" />
+ <field name="CONNECTOR_PUNCTUATION" />
+ <field name="CONTROL" />
+ <field name="CURRENCY_SYMBOL" />
+ <field name="DASH_PUNCTUATION" />
+ <field name="DECIMAL_DIGIT_NUMBER" />
+ <field name="DIRECTIONALITY_ARABIC_NUMBER" />
+ <field name="DIRECTIONALITY_BOUNDARY_NEUTRAL" />
+ <field name="DIRECTIONALITY_COMMON_NUMBER_SEPARATOR" />
+ <field name="DIRECTIONALITY_EUROPEAN_NUMBER" />
+ <field name="DIRECTIONALITY_EUROPEAN_NUMBER_SEPARATOR" />
+ <field name="DIRECTIONALITY_EUROPEAN_NUMBER_TERMINATOR" />
+ <field name="DIRECTIONALITY_LEFT_TO_RIGHT" />
+ <field name="DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING" />
+ <field name="DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE" />
+ <field name="DIRECTIONALITY_NONSPACING_MARK" />
+ <field name="DIRECTIONALITY_OTHER_NEUTRALS" />
+ <field name="DIRECTIONALITY_PARAGRAPH_SEPARATOR" />
+ <field name="DIRECTIONALITY_POP_DIRECTIONAL_FORMAT" />
+ <field name="DIRECTIONALITY_RIGHT_TO_LEFT" />
+ <field name="DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC" />
+ <field name="DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING" />
+ <field name="DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE" />
+ <field name="DIRECTIONALITY_SEGMENT_SEPARATOR" />
+ <field name="DIRECTIONALITY_UNDEFINED" />
+ <field name="DIRECTIONALITY_WHITESPACE" />
+ <field name="ENCLOSING_MARK" />
+ <field name="END_PUNCTUATION" />
+ <field name="FINAL_QUOTE_PUNCTUATION" />
+ <field name="FORMAT" />
+ <field name="INITIAL_QUOTE_PUNCTUATION" />
+ <field name="LETTER_NUMBER" />
+ <field name="LINE_SEPARATOR" />
+ <field name="LOWERCASE_LETTER" />
+ <field name="MATH_SYMBOL" />
+ <field name="MAX_CODE_POINT" />
+ <field name="MAX_HIGH_SURROGATE" />
+ <field name="MAX_LOW_SURROGATE" />
+ <field name="MAX_RADIX" />
+ <field name="MAX_SURROGATE" />
+ <field name="MAX_VALUE" />
+ <field name="MIN_CODE_POINT" />
+ <field name="MIN_HIGH_SURROGATE" />
+ <field name="MIN_LOW_SURROGATE" />
+ <field name="MIN_RADIX" />
+ <field name="MIN_SUPPLEMENTARY_CODE_POINT" />
+ <field name="MIN_SURROGATE" />
+ <field name="MIN_VALUE" />
+ <field name="MODIFIER_LETTER" />
+ <field name="MODIFIER_SYMBOL" />
+ <field name="NON_SPACING_MARK" />
+ <field name="OTHER_LETTER" />
+ <field name="OTHER_NUMBER" />
+ <field name="OTHER_PUNCTUATION" />
+ <field name="OTHER_SYMBOL" />
+ <field name="PARAGRAPH_SEPARATOR" />
+ <field name="PRIVATE_USE" />
+ <field name="SIZE" />
+ <field name="SPACE_SEPARATOR" />
+ <field name="START_PUNCTUATION" />
+ <field name="SURROGATE" />
+ <field name="TITLECASE_LETTER" />
+ <field name="TYPE" />
+ <field name="UNASSIGNED" />
+ <field name="UPPERCASE_LETTER" />
+ </class>
+ <class name="java/lang/Character$Subset" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/Character$UnicodeBlock" since="1">
+ <extends name="java/lang/Character$Subset" />
+ <method name="&lt;init>()V" />
+ <method name="forName(Ljava/lang/String;)Ljava/lang/Character$UnicodeBlock;" />
+ <method name="of(C)Ljava/lang/Character$UnicodeBlock;" />
+ <method name="of(I)Ljava/lang/Character$UnicodeBlock;" />
+ <field name="AEGEAN_NUMBERS" />
+ <field name="ALCHEMICAL_SYMBOLS" since="19" />
+ <field name="ALPHABETIC_PRESENTATION_FORMS" />
+ <field name="ANCIENT_GREEK_MUSICAL_NOTATION" since="19" />
+ <field name="ANCIENT_GREEK_NUMBERS" since="19" />
+ <field name="ANCIENT_SYMBOLS" since="19" />
+ <field name="ARABIC" />
+ <field name="ARABIC_PRESENTATION_FORMS_A" />
+ <field name="ARABIC_PRESENTATION_FORMS_B" />
+ <field name="ARABIC_SUPPLEMENT" since="19" />
+ <field name="ARMENIAN" />
+ <field name="ARROWS" />
+ <field name="AVESTAN" since="19" />
+ <field name="BALINESE" since="19" />
+ <field name="BAMUM" since="19" />
+ <field name="BAMUM_SUPPLEMENT" since="19" />
+ <field name="BASIC_LATIN" />
+ <field name="BATAK" since="19" />
+ <field name="BENGALI" />
+ <field name="BLOCK_ELEMENTS" />
+ <field name="BOPOMOFO" />
+ <field name="BOPOMOFO_EXTENDED" />
+ <field name="BOX_DRAWING" />
+ <field name="BRAHMI" since="19" />
+ <field name="BRAILLE_PATTERNS" />
+ <field name="BUGINESE" since="19" />
+ <field name="BUHID" />
+ <field name="BYZANTINE_MUSICAL_SYMBOLS" />
+ <field name="CARIAN" since="19" />
+ <field name="CHAM" since="19" />
+ <field name="CHEROKEE" />
+ <field name="CJK_COMPATIBILITY" />
+ <field name="CJK_COMPATIBILITY_FORMS" />
+ <field name="CJK_COMPATIBILITY_IDEOGRAPHS" />
+ <field name="CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT" />
+ <field name="CJK_RADICALS_SUPPLEMENT" />
+ <field name="CJK_STROKES" since="19" />
+ <field name="CJK_SYMBOLS_AND_PUNCTUATION" />
+ <field name="CJK_UNIFIED_IDEOGRAPHS" />
+ <field name="CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A" />
+ <field name="CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B" />
+ <field name="CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C" since="19" />
+ <field name="CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D" since="19" />
+ <field name="COMBINING_DIACRITICAL_MARKS" />
+ <field name="COMBINING_DIACRITICAL_MARKS_SUPPLEMENT" since="19" />
+ <field name="COMBINING_HALF_MARKS" />
+ <field name="COMBINING_MARKS_FOR_SYMBOLS" />
+ <field name="COMMON_INDIC_NUMBER_FORMS" since="19" />
+ <field name="CONTROL_PICTURES" />
+ <field name="COPTIC" since="19" />
+ <field name="COUNTING_ROD_NUMERALS" since="19" />
+ <field name="CUNEIFORM" since="19" />
+ <field name="CUNEIFORM_NUMBERS_AND_PUNCTUATION" since="19" />
+ <field name="CURRENCY_SYMBOLS" />
+ <field name="CYPRIOT_SYLLABARY" />
+ <field name="CYRILLIC" />
+ <field name="CYRILLIC_EXTENDED_A" since="19" />
+ <field name="CYRILLIC_EXTENDED_B" since="19" />
+ <field name="CYRILLIC_SUPPLEMENTARY" />
+ <field name="DESERET" />
+ <field name="DEVANAGARI" />
+ <field name="DEVANAGARI_EXTENDED" since="19" />
+ <field name="DINGBATS" />
+ <field name="DOMINO_TILES" since="19" />
+ <field name="EGYPTIAN_HIEROGLYPHS" since="19" />
+ <field name="EMOTICONS" since="19" />
+ <field name="ENCLOSED_ALPHANUMERICS" />
+ <field name="ENCLOSED_ALPHANUMERIC_SUPPLEMENT" since="19" />
+ <field name="ENCLOSED_CJK_LETTERS_AND_MONTHS" />
+ <field name="ENCLOSED_IDEOGRAPHIC_SUPPLEMENT" since="19" />
+ <field name="ETHIOPIC" />
+ <field name="ETHIOPIC_EXTENDED" since="19" />
+ <field name="ETHIOPIC_EXTENDED_A" since="19" />
+ <field name="ETHIOPIC_SUPPLEMENT" since="19" />
+ <field name="GENERAL_PUNCTUATION" />
+ <field name="GEOMETRIC_SHAPES" />
+ <field name="GEORGIAN" />
+ <field name="GEORGIAN_SUPPLEMENT" since="19" />
+ <field name="GLAGOLITIC" since="19" />
+ <field name="GOTHIC" />
+ <field name="GREEK" />
+ <field name="GREEK_EXTENDED" />
+ <field name="GUJARATI" />
+ <field name="GURMUKHI" />
+ <field name="HALFWIDTH_AND_FULLWIDTH_FORMS" />
+ <field name="HANGUL_COMPATIBILITY_JAMO" />
+ <field name="HANGUL_JAMO" />
+ <field name="HANGUL_JAMO_EXTENDED_A" since="19" />
+ <field name="HANGUL_JAMO_EXTENDED_B" since="19" />
+ <field name="HANGUL_SYLLABLES" />
+ <field name="HANUNOO" />
+ <field name="HEBREW" />
+ <field name="HIGH_PRIVATE_USE_SURROGATES" />
+ <field name="HIGH_SURROGATES" />
+ <field name="HIRAGANA" />
+ <field name="IDEOGRAPHIC_DESCRIPTION_CHARACTERS" />
+ <field name="IMPERIAL_ARAMAIC" since="19" />
+ <field name="INSCRIPTIONAL_PAHLAVI" since="19" />
+ <field name="INSCRIPTIONAL_PARTHIAN" since="19" />
+ <field name="IPA_EXTENSIONS" />
+ <field name="JAVANESE" since="19" />
+ <field name="KAITHI" since="19" />
+ <field name="KANA_SUPPLEMENT" since="19" />
+ <field name="KANBUN" />
+ <field name="KANGXI_RADICALS" />
+ <field name="KANNADA" />
+ <field name="KATAKANA" />
+ <field name="KATAKANA_PHONETIC_EXTENSIONS" />
+ <field name="KAYAH_LI" since="19" />
+ <field name="KHAROSHTHI" since="19" />
+ <field name="KHMER" />
+ <field name="KHMER_SYMBOLS" />
+ <field name="LAO" />
+ <field name="LATIN_1_SUPPLEMENT" />
+ <field name="LATIN_EXTENDED_A" />
+ <field name="LATIN_EXTENDED_ADDITIONAL" />
+ <field name="LATIN_EXTENDED_B" />
+ <field name="LATIN_EXTENDED_C" since="19" />
+ <field name="LATIN_EXTENDED_D" since="19" />
+ <field name="LEPCHA" since="19" />
+ <field name="LETTERLIKE_SYMBOLS" />
+ <field name="LIMBU" />
+ <field name="LINEAR_B_IDEOGRAMS" />
+ <field name="LINEAR_B_SYLLABARY" />
+ <field name="LISU" since="19" />
+ <field name="LOW_SURROGATES" />
+ <field name="LYCIAN" since="19" />
+ <field name="LYDIAN" since="19" />
+ <field name="MAHJONG_TILES" since="19" />
+ <field name="MALAYALAM" />
+ <field name="MANDAIC" since="19" />
+ <field name="MATHEMATICAL_ALPHANUMERIC_SYMBOLS" />
+ <field name="MATHEMATICAL_OPERATORS" />
+ <field name="MEETEI_MAYEK" since="19" />
+ <field name="MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A" />
+ <field name="MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B" />
+ <field name="MISCELLANEOUS_SYMBOLS" />
+ <field name="MISCELLANEOUS_SYMBOLS_AND_ARROWS" />
+ <field name="MISCELLANEOUS_SYMBOLS_AND_PICTOGRAPHS" since="19" />
+ <field name="MISCELLANEOUS_TECHNICAL" />
+ <field name="MODIFIER_TONE_LETTERS" since="19" />
+ <field name="MONGOLIAN" />
+ <field name="MUSICAL_SYMBOLS" />
+ <field name="MYANMAR" />
+ <field name="MYANMAR_EXTENDED_A" since="19" />
+ <field name="NEW_TAI_LUE" since="19" />
+ <field name="NKO" since="19" />
+ <field name="NUMBER_FORMS" />
+ <field name="OGHAM" />
+ <field name="OLD_ITALIC" />
+ <field name="OLD_PERSIAN" since="19" />
+ <field name="OLD_SOUTH_ARABIAN" since="19" />
+ <field name="OLD_TURKIC" since="19" />
+ <field name="OL_CHIKI" since="19" />
+ <field name="OPTICAL_CHARACTER_RECOGNITION" />
+ <field name="ORIYA" />
+ <field name="OSMANYA" />
+ <field name="PHAGS_PA" since="19" />
+ <field name="PHAISTOS_DISC" since="19" />
+ <field name="PHOENICIAN" since="19" />
+ <field name="PHONETIC_EXTENSIONS" />
+ <field name="PHONETIC_EXTENSIONS_SUPPLEMENT" since="19" />
+ <field name="PLAYING_CARDS" since="19" />
+ <field name="PRIVATE_USE_AREA" />
+ <field name="REJANG" since="19" />
+ <field name="RUMI_NUMERAL_SYMBOLS" since="19" />
+ <field name="RUNIC" />
+ <field name="SAMARITAN" since="19" />
+ <field name="SAURASHTRA" since="19" />
+ <field name="SHAVIAN" />
+ <field name="SINHALA" />
+ <field name="SMALL_FORM_VARIANTS" />
+ <field name="SPACING_MODIFIER_LETTERS" />
+ <field name="SPECIALS" />
+ <field name="SUNDANESE" since="19" />
+ <field name="SUPERSCRIPTS_AND_SUBSCRIPTS" />
+ <field name="SUPPLEMENTAL_ARROWS_A" />
+ <field name="SUPPLEMENTAL_ARROWS_B" />
+ <field name="SUPPLEMENTAL_MATHEMATICAL_OPERATORS" />
+ <field name="SUPPLEMENTAL_PUNCTUATION" since="19" />
+ <field name="SUPPLEMENTARY_PRIVATE_USE_AREA_A" />
+ <field name="SUPPLEMENTARY_PRIVATE_USE_AREA_B" />
+ <field name="SURROGATES_AREA" />
+ <field name="SYLOTI_NAGRI" since="19" />
+ <field name="SYRIAC" />
+ <field name="TAGALOG" />
+ <field name="TAGBANWA" />
+ <field name="TAGS" />
+ <field name="TAI_LE" />
+ <field name="TAI_THAM" since="19" />
+ <field name="TAI_VIET" since="19" />
+ <field name="TAI_XUAN_JING_SYMBOLS" />
+ <field name="TAMIL" />
+ <field name="TELUGU" />
+ <field name="THAANA" />
+ <field name="THAI" />
+ <field name="TIBETAN" />
+ <field name="TIFINAGH" since="19" />
+ <field name="TRANSPORT_AND_MAP_SYMBOLS" since="19" />
+ <field name="UGARITIC" />
+ <field name="UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS" />
+ <field name="UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_EXTENDED" since="19" />
+ <field name="VAI" since="19" />
+ <field name="VARIATION_SELECTORS" />
+ <field name="VARIATION_SELECTORS_SUPPLEMENT" />
+ <field name="VEDIC_EXTENSIONS" since="19" />
+ <field name="VERTICAL_FORMS" since="19" />
+ <field name="YIJING_HEXAGRAM_SYMBOLS" />
+ <field name="YI_RADICALS" />
+ <field name="YI_SYLLABLES" />
+ </class>
+ <class name="java/lang/Class" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/reflect/AnnotatedElement" />
+ <implements name="java/lang/reflect/GenericDeclaration" />
+ <implements name="java/lang/reflect/Type" />
+ <method name="&lt;init>()V" />
+ <method name="asSubclass(Ljava/lang/Class;)Ljava/lang/Class;" />
+ <method name="cast(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="desiredAssertionStatus()Z" />
+ <method name="forName(Ljava/lang/String;)Ljava/lang/Class;" />
+ <method name="forName(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;" />
+ <method name="getCanonicalName()Ljava/lang/String;" />
+ <method name="getClassLoader()Ljava/lang/ClassLoader;" />
+ <method name="getClasses()[Ljava/lang/Class;" />
+ <method name="getComponentType()Ljava/lang/Class;" />
+ <method name="getConstructor([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;" />
+ <method name="getConstructors()[Ljava/lang/reflect/Constructor;" />
+ <method name="getDeclaredClasses()[Ljava/lang/Class;" />
+ <method name="getDeclaredConstructor([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;" />
+ <method name="getDeclaredConstructors()[Ljava/lang/reflect/Constructor;" />
+ <method name="getDeclaredField(Ljava/lang/String;)Ljava/lang/reflect/Field;" />
+ <method name="getDeclaredFields()[Ljava/lang/reflect/Field;" />
+ <method name="getDeclaredMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;" />
+ <method name="getDeclaredMethods()[Ljava/lang/reflect/Method;" />
+ <method name="getDeclaringClass()Ljava/lang/Class;" />
+ <method name="getEnclosingClass()Ljava/lang/Class;" />
+ <method name="getEnclosingConstructor()Ljava/lang/reflect/Constructor;" />
+ <method name="getEnclosingMethod()Ljava/lang/reflect/Method;" />
+ <method name="getEnumConstants()[Ljava/lang/Object;" />
+ <method name="getField(Ljava/lang/String;)Ljava/lang/reflect/Field;" />
+ <method name="getFields()[Ljava/lang/reflect/Field;" />
+ <method name="getGenericInterfaces()[Ljava/lang/reflect/Type;" />
+ <method name="getGenericSuperclass()Ljava/lang/reflect/Type;" />
+ <method name="getInterfaces()[Ljava/lang/Class;" />
+ <method name="getMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;" />
+ <method name="getMethods()[Ljava/lang/reflect/Method;" />
+ <method name="getModifiers()I" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getPackage()Ljava/lang/Package;" />
+ <method name="getProtectionDomain()Ljava/security/ProtectionDomain;" />
+ <method name="getResource(Ljava/lang/String;)Ljava/net/URL;" />
+ <method name="getResourceAsStream(Ljava/lang/String;)Ljava/io/InputStream;" />
+ <method name="getSigners()[Ljava/lang/Object;" />
+ <method name="getSimpleName()Ljava/lang/String;" />
+ <method name="getSuperclass()Ljava/lang/Class;" />
+ <method name="isAnnotation()Z" />
+ <method name="isAnonymousClass()Z" />
+ <method name="isArray()Z" />
+ <method name="isAssignableFrom(Ljava/lang/Class;)Z" />
+ <method name="isEnum()Z" />
+ <method name="isInstance(Ljava/lang/Object;)Z" />
+ <method name="isInterface()Z" />
+ <method name="isLocalClass()Z" />
+ <method name="isMemberClass()Z" />
+ <method name="isPrimitive()Z" />
+ <method name="isSynthetic()Z" />
+ <method name="newInstance()Ljava/lang/Object;" />
+ </class>
+ <class name="java/lang/ClassCastException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/ClassCircularityError" since="1">
+ <extends name="java/lang/LinkageError" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/ClassFormatError" since="1">
+ <extends name="java/lang/LinkageError" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/ClassLoader" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/ClassLoader;)V" />
+ <method name="clearAssertionStatus()V" />
+ <method name="defineClass(Ljava/lang/String;Ljava/nio/ByteBuffer;Ljava/security/ProtectionDomain;)Ljava/lang/Class;" />
+ <method name="defineClass(Ljava/lang/String;[BII)Ljava/lang/Class;" />
+ <method name="defineClass(Ljava/lang/String;[BIILjava/security/ProtectionDomain;)Ljava/lang/Class;" />
+ <method name="defineClass([BII)Ljava/lang/Class;" />
+ <method name="definePackage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/net/URL;)Ljava/lang/Package;" />
+ <method name="findClass(Ljava/lang/String;)Ljava/lang/Class;" />
+ <method name="findLibrary(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="findLoadedClass(Ljava/lang/String;)Ljava/lang/Class;" />
+ <method name="findResource(Ljava/lang/String;)Ljava/net/URL;" />
+ <method name="findResources(Ljava/lang/String;)Ljava/util/Enumeration;" />
+ <method name="findSystemClass(Ljava/lang/String;)Ljava/lang/Class;" />
+ <method name="getPackage(Ljava/lang/String;)Ljava/lang/Package;" />
+ <method name="getPackages()[Ljava/lang/Package;" />
+ <method name="getParent()Ljava/lang/ClassLoader;" />
+ <method name="getResource(Ljava/lang/String;)Ljava/net/URL;" />
+ <method name="getResourceAsStream(Ljava/lang/String;)Ljava/io/InputStream;" />
+ <method name="getResources(Ljava/lang/String;)Ljava/util/Enumeration;" />
+ <method name="getSystemClassLoader()Ljava/lang/ClassLoader;" />
+ <method name="getSystemResource(Ljava/lang/String;)Ljava/net/URL;" />
+ <method name="getSystemResourceAsStream(Ljava/lang/String;)Ljava/io/InputStream;" />
+ <method name="getSystemResources(Ljava/lang/String;)Ljava/util/Enumeration;" />
+ <method name="loadClass(Ljava/lang/String;)Ljava/lang/Class;" />
+ <method name="loadClass(Ljava/lang/String;Z)Ljava/lang/Class;" />
+ <method name="resolveClass(Ljava/lang/Class;)V" />
+ <method name="setClassAssertionStatus(Ljava/lang/String;Z)V" />
+ <method name="setDefaultAssertionStatus(Z)V" />
+ <method name="setPackageAssertionStatus(Ljava/lang/String;Z)V" />
+ <method name="setSigners(Ljava/lang/Class;[Ljava/lang/Object;)V" />
+ </class>
+ <class name="java/lang/ClassNotFoundException" since="1">
+ <extends name="java/lang/Exception" />
+ <extends name="java/lang/ReflectiveOperationException" since="19" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="getException()Ljava/lang/Throwable;" />
+ </class>
+ <class name="java/lang/CloneNotSupportedException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/Cloneable" since="1">
+ <extends name="java/lang/Object" />
+ </class>
+ <class name="java/lang/Comparable" since="1">
+ <extends name="java/lang/Object" />
+ <method name="compareTo(Ljava/lang/Object;)I" />
+ </class>
+ <class name="java/lang/Compiler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="command(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="compileClass(Ljava/lang/Class;)Z" />
+ <method name="compileClasses(Ljava/lang/String;)Z" />
+ <method name="disable()V" />
+ <method name="enable()V" />
+ </class>
+ <class name="java/lang/Deprecated" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/annotation/Annotation" />
+ </class>
+ <class name="java/lang/Double" since="1">
+ <extends name="java/lang/Number" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>(D)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="compare(DD)I" />
+ <method name="compareTo(Ljava/lang/Double;)I" />
+ <method name="doubleToLongBits(D)J" />
+ <method name="doubleToRawLongBits(D)J" />
+ <method name="isInfinite()Z" />
+ <method name="isInfinite(D)Z" />
+ <method name="isNaN()Z" />
+ <method name="isNaN(D)Z" />
+ <method name="longBitsToDouble(J)D" />
+ <method name="parseDouble(Ljava/lang/String;)D" />
+ <method name="toHexString(D)Ljava/lang/String;" />
+ <method name="toString(D)Ljava/lang/String;" />
+ <method name="valueOf(D)Ljava/lang/Double;" />
+ <method name="valueOf(Ljava/lang/String;)Ljava/lang/Double;" />
+ <field name="MAX_EXPONENT" since="9" />
+ <field name="MAX_VALUE" />
+ <field name="MIN_EXPONENT" since="9" />
+ <field name="MIN_NORMAL" since="9" />
+ <field name="MIN_VALUE" />
+ <field name="NEGATIVE_INFINITY" />
+ <field name="NaN" />
+ <field name="POSITIVE_INFINITY" />
+ <field name="SIZE" />
+ <field name="TYPE" />
+ </class>
+ <class name="java/lang/Enum" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>(Ljava/lang/String;I)V" />
+ <method name="compareTo(Ljava/lang/Enum;)I" />
+ <method name="getDeclaringClass()Ljava/lang/Class;" />
+ <method name="name()Ljava/lang/String;" />
+ <method name="ordinal()I" />
+ <method name="valueOf(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;" />
+ </class>
+ <class name="java/lang/EnumConstantNotPresentException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>(Ljava/lang/Class;Ljava/lang/String;)V" />
+ <method name="constantName()Ljava/lang/String;" />
+ <method name="enumType()Ljava/lang/Class;" />
+ </class>
+ <class name="java/lang/Error" since="1">
+ <extends name="java/lang/Throwable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/lang/Exception" since="1">
+ <extends name="java/lang/Throwable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/lang/ExceptionInInitializerError" since="1">
+ <extends name="java/lang/LinkageError" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ <method name="getException()Ljava/lang/Throwable;" />
+ </class>
+ <class name="java/lang/Float" since="1">
+ <extends name="java/lang/Number" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>(D)V" />
+ <method name="&lt;init>(F)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="compare(FF)I" />
+ <method name="compareTo(Ljava/lang/Float;)I" />
+ <method name="floatToIntBits(F)I" />
+ <method name="floatToRawIntBits(F)I" />
+ <method name="intBitsToFloat(I)F" />
+ <method name="isInfinite()Z" />
+ <method name="isInfinite(F)Z" />
+ <method name="isNaN()Z" />
+ <method name="isNaN(F)Z" />
+ <method name="parseFloat(Ljava/lang/String;)F" />
+ <method name="toHexString(F)Ljava/lang/String;" />
+ <method name="toString(F)Ljava/lang/String;" />
+ <method name="valueOf(F)Ljava/lang/Float;" />
+ <method name="valueOf(Ljava/lang/String;)Ljava/lang/Float;" />
+ <field name="MAX_EXPONENT" since="9" />
+ <field name="MAX_VALUE" />
+ <field name="MIN_EXPONENT" since="9" />
+ <field name="MIN_NORMAL" since="9" />
+ <field name="MIN_VALUE" />
+ <field name="NEGATIVE_INFINITY" />
+ <field name="NaN" />
+ <field name="POSITIVE_INFINITY" />
+ <field name="SIZE" />
+ <field name="TYPE" />
+ </class>
+ <class name="java/lang/IllegalAccessError" since="1">
+ <extends name="java/lang/IncompatibleClassChangeError" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/IllegalAccessException" since="1">
+ <extends name="java/lang/Exception" />
+ <extends name="java/lang/ReflectiveOperationException" since="19" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/IllegalArgumentException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/lang/IllegalMonitorStateException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/IllegalStateException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/lang/IllegalThreadStateException" since="1">
+ <extends name="java/lang/IllegalArgumentException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/IncompatibleClassChangeError" since="1">
+ <extends name="java/lang/LinkageError" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/IndexOutOfBoundsException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/InheritableThreadLocal" since="1">
+ <extends name="java/lang/ThreadLocal" />
+ <method name="&lt;init>()V" />
+ <method name="childValue(Ljava/lang/Object;)Ljava/lang/Object;" />
+ </class>
+ <class name="java/lang/InstantiationError" since="1">
+ <extends name="java/lang/IncompatibleClassChangeError" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/InstantiationException" since="1">
+ <extends name="java/lang/Exception" />
+ <extends name="java/lang/ReflectiveOperationException" since="19" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/Integer" since="1">
+ <extends name="java/lang/Number" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="bitCount(I)I" />
+ <method name="compare(II)I" since="19" />
+ <method name="compareTo(Ljava/lang/Integer;)I" />
+ <method name="decode(Ljava/lang/String;)Ljava/lang/Integer;" />
+ <method name="getInteger(Ljava/lang/String;)Ljava/lang/Integer;" />
+ <method name="getInteger(Ljava/lang/String;I)Ljava/lang/Integer;" />
+ <method name="getInteger(Ljava/lang/String;Ljava/lang/Integer;)Ljava/lang/Integer;" />
+ <method name="highestOneBit(I)I" />
+ <method name="lowestOneBit(I)I" />
+ <method name="numberOfLeadingZeros(I)I" />
+ <method name="numberOfTrailingZeros(I)I" />
+ <method name="parseInt(Ljava/lang/String;)I" />
+ <method name="parseInt(Ljava/lang/String;I)I" />
+ <method name="reverse(I)I" />
+ <method name="reverseBytes(I)I" />
+ <method name="rotateLeft(II)I" />
+ <method name="rotateRight(II)I" />
+ <method name="signum(I)I" />
+ <method name="toBinaryString(I)Ljava/lang/String;" />
+ <method name="toHexString(I)Ljava/lang/String;" />
+ <method name="toOctalString(I)Ljava/lang/String;" />
+ <method name="toString(I)Ljava/lang/String;" />
+ <method name="toString(II)Ljava/lang/String;" />
+ <method name="valueOf(I)Ljava/lang/Integer;" />
+ <method name="valueOf(Ljava/lang/String;)Ljava/lang/Integer;" />
+ <method name="valueOf(Ljava/lang/String;I)Ljava/lang/Integer;" />
+ <field name="MAX_VALUE" />
+ <field name="MIN_VALUE" />
+ <field name="SIZE" />
+ <field name="TYPE" />
+ </class>
+ <class name="java/lang/InternalError" since="1">
+ <extends name="java/lang/VirtualMachineError" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/InterruptedException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/Iterable" since="1">
+ <extends name="java/lang/Object" />
+ <method name="iterator()Ljava/util/Iterator;" />
+ </class>
+ <class name="java/lang/LinkageError" since="1">
+ <extends name="java/lang/Error" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" since="19" />
+ </class>
+ <class name="java/lang/Long" since="1">
+ <extends name="java/lang/Number" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>(J)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="bitCount(J)I" />
+ <method name="compare(JJ)I" since="19" />
+ <method name="compareTo(Ljava/lang/Long;)I" />
+ <method name="decode(Ljava/lang/String;)Ljava/lang/Long;" />
+ <method name="getLong(Ljava/lang/String;)Ljava/lang/Long;" />
+ <method name="getLong(Ljava/lang/String;J)Ljava/lang/Long;" />
+ <method name="getLong(Ljava/lang/String;Ljava/lang/Long;)Ljava/lang/Long;" />
+ <method name="highestOneBit(J)J" />
+ <method name="lowestOneBit(J)J" />
+ <method name="numberOfLeadingZeros(J)I" />
+ <method name="numberOfTrailingZeros(J)I" />
+ <method name="parseLong(Ljava/lang/String;)J" />
+ <method name="parseLong(Ljava/lang/String;I)J" />
+ <method name="reverse(J)J" />
+ <method name="reverseBytes(J)J" />
+ <method name="rotateLeft(JI)J" />
+ <method name="rotateRight(JI)J" />
+ <method name="signum(J)I" />
+ <method name="toBinaryString(J)Ljava/lang/String;" />
+ <method name="toHexString(J)Ljava/lang/String;" />
+ <method name="toOctalString(J)Ljava/lang/String;" />
+ <method name="toString(J)Ljava/lang/String;" />
+ <method name="toString(JI)Ljava/lang/String;" />
+ <method name="valueOf(J)Ljava/lang/Long;" />
+ <method name="valueOf(Ljava/lang/String;)Ljava/lang/Long;" />
+ <method name="valueOf(Ljava/lang/String;I)Ljava/lang/Long;" />
+ <field name="MAX_VALUE" />
+ <field name="MIN_VALUE" />
+ <field name="SIZE" />
+ <field name="TYPE" />
+ </class>
+ <class name="java/lang/Math" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="IEEEremainder(DD)D" />
+ <method name="abs(D)D" />
+ <method name="abs(F)F" />
+ <method name="abs(I)I" />
+ <method name="abs(J)J" />
+ <method name="acos(D)D" />
+ <method name="asin(D)D" />
+ <method name="atan(D)D" />
+ <method name="atan2(DD)D" />
+ <method name="cbrt(D)D" />
+ <method name="ceil(D)D" />
+ <method name="copySign(DD)D" since="9" />
+ <method name="copySign(FF)F" since="9" />
+ <method name="cos(D)D" />
+ <method name="cosh(D)D" />
+ <method name="exp(D)D" />
+ <method name="expm1(D)D" />
+ <method name="floor(D)D" />
+ <method name="getExponent(D)I" since="9" />
+ <method name="getExponent(F)I" since="9" />
+ <method name="hypot(DD)D" />
+ <method name="log(D)D" />
+ <method name="log10(D)D" />
+ <method name="log1p(D)D" />
+ <method name="max(DD)D" />
+ <method name="max(FF)F" />
+ <method name="max(II)I" />
+ <method name="max(JJ)J" />
+ <method name="min(DD)D" />
+ <method name="min(FF)F" />
+ <method name="min(II)I" />
+ <method name="min(JJ)J" />
+ <method name="nextAfter(DD)D" since="9" />
+ <method name="nextAfter(FD)F" since="9" />
+ <method name="nextUp(D)D" since="9" />
+ <method name="nextUp(F)F" since="9" />
+ <method name="pow(DD)D" />
+ <method name="random()D" />
+ <method name="rint(D)D" />
+ <method name="round(D)J" />
+ <method name="round(F)I" />
+ <method name="scalb(DI)D" since="9" />
+ <method name="scalb(FI)F" since="9" />
+ <method name="signum(D)D" />
+ <method name="signum(F)F" />
+ <method name="sin(D)D" />
+ <method name="sinh(D)D" />
+ <method name="sqrt(D)D" />
+ <method name="tan(D)D" />
+ <method name="tanh(D)D" />
+ <method name="toDegrees(D)D" />
+ <method name="toRadians(D)D" />
+ <method name="ulp(D)D" />
+ <method name="ulp(F)F" />
+ <field name="E" />
+ <field name="PI" />
+ </class>
+ <class name="java/lang/NegativeArraySizeException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/NoClassDefFoundError" since="1">
+ <extends name="java/lang/LinkageError" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/NoSuchFieldError" since="1">
+ <extends name="java/lang/IncompatibleClassChangeError" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/NoSuchFieldException" since="1">
+ <extends name="java/lang/Exception" />
+ <extends name="java/lang/ReflectiveOperationException" since="19" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/NoSuchMethodError" since="1">
+ <extends name="java/lang/IncompatibleClassChangeError" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/NoSuchMethodException" since="1">
+ <extends name="java/lang/Exception" />
+ <extends name="java/lang/ReflectiveOperationException" since="19" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/NullPointerException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/Number" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>()V" />
+ <method name="byteValue()B" />
+ <method name="doubleValue()D" />
+ <method name="floatValue()F" />
+ <method name="intValue()I" />
+ <method name="longValue()J" />
+ <method name="shortValue()S" />
+ </class>
+ <class name="java/lang/NumberFormatException" since="1">
+ <extends name="java/lang/IllegalArgumentException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/Object" since="1">
+ <method name="&lt;init>()V" />
+ <method name="clone()Ljava/lang/Object;" />
+ <method name="equals(Ljava/lang/Object;)Z" />
+ <method name="finalize()V" />
+ <method name="getClass()Ljava/lang/Class;" />
+ <method name="hashCode()I" />
+ <method name="notify()V" />
+ <method name="notifyAll()V" />
+ <method name="toString()Ljava/lang/String;" />
+ <method name="wait()V" />
+ <method name="wait(J)V" />
+ <method name="wait(JI)V" />
+ </class>
+ <class name="java/lang/OutOfMemoryError" since="1">
+ <extends name="java/lang/VirtualMachineError" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/Override" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/annotation/Annotation" />
+ </class>
+ <class name="java/lang/Package" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/reflect/AnnotatedElement" />
+ <method name="&lt;init>()V" />
+ <method name="getImplementationTitle()Ljava/lang/String;" />
+ <method name="getImplementationVendor()Ljava/lang/String;" />
+ <method name="getImplementationVersion()Ljava/lang/String;" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getPackage(Ljava/lang/String;)Ljava/lang/Package;" />
+ <method name="getPackages()[Ljava/lang/Package;" />
+ <method name="getSpecificationTitle()Ljava/lang/String;" />
+ <method name="getSpecificationVendor()Ljava/lang/String;" />
+ <method name="getSpecificationVersion()Ljava/lang/String;" />
+ <method name="isCompatibleWith(Ljava/lang/String;)Z" />
+ <method name="isSealed()Z" />
+ <method name="isSealed(Ljava/net/URL;)Z" />
+ </class>
+ <class name="java/lang/Process" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="destroy()V" />
+ <method name="exitValue()I" />
+ <method name="getErrorStream()Ljava/io/InputStream;" />
+ <method name="getInputStream()Ljava/io/InputStream;" />
+ <method name="getOutputStream()Ljava/io/OutputStream;" />
+ <method name="waitFor()I" />
+ </class>
+ <class name="java/lang/ProcessBuilder" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/util/List;)V" />
+ <method name="&lt;init>([Ljava/lang/String;)V" />
+ <method name="command()Ljava/util/List;" />
+ <method name="command(Ljava/util/List;)Ljava/lang/ProcessBuilder;" />
+ <method name="command([Ljava/lang/String;)Ljava/lang/ProcessBuilder;" />
+ <method name="directory()Ljava/io/File;" />
+ <method name="directory(Ljava/io/File;)Ljava/lang/ProcessBuilder;" />
+ <method name="environment()Ljava/util/Map;" />
+ <method name="redirectErrorStream()Z" />
+ <method name="redirectErrorStream(Z)Ljava/lang/ProcessBuilder;" />
+ <method name="start()Ljava/lang/Process;" />
+ </class>
+ <class name="java/lang/Readable" since="1">
+ <extends name="java/lang/Object" />
+ <method name="read(Ljava/nio/CharBuffer;)I" />
+ </class>
+ <class name="java/lang/ReflectiveOperationException" since="19">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/lang/Runnable" since="1">
+ <extends name="java/lang/Object" />
+ <method name="run()V" />
+ </class>
+ <class name="java/lang/Runtime" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addShutdownHook(Ljava/lang/Thread;)V" />
+ <method name="availableProcessors()I" />
+ <method name="exec(Ljava/lang/String;)Ljava/lang/Process;" />
+ <method name="exec(Ljava/lang/String;[Ljava/lang/String;)Ljava/lang/Process;" />
+ <method name="exec(Ljava/lang/String;[Ljava/lang/String;Ljava/io/File;)Ljava/lang/Process;" />
+ <method name="exec([Ljava/lang/String;)Ljava/lang/Process;" />
+ <method name="exec([Ljava/lang/String;[Ljava/lang/String;)Ljava/lang/Process;" />
+ <method name="exec([Ljava/lang/String;[Ljava/lang/String;Ljava/io/File;)Ljava/lang/Process;" />
+ <method name="exit(I)V" />
+ <method name="freeMemory()J" />
+ <method name="gc()V" />
+ <method name="getLocalizedInputStream(Ljava/io/InputStream;)Ljava/io/InputStream;" />
+ <method name="getLocalizedOutputStream(Ljava/io/OutputStream;)Ljava/io/OutputStream;" />
+ <method name="getRuntime()Ljava/lang/Runtime;" />
+ <method name="halt(I)V" />
+ <method name="load(Ljava/lang/String;)V" />
+ <method name="loadLibrary(Ljava/lang/String;)V" />
+ <method name="maxMemory()J" />
+ <method name="removeShutdownHook(Ljava/lang/Thread;)Z" />
+ <method name="runFinalization()V" />
+ <method name="runFinalizersOnExit(Z)V" />
+ <method name="totalMemory()J" />
+ <method name="traceInstructions(Z)V" />
+ <method name="traceMethodCalls(Z)V" />
+ </class>
+ <class name="java/lang/RuntimeException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/lang/RuntimePermission" since="1">
+ <extends name="java/security/BasicPermission" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/SafeVarargs" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/annotation/Annotation" />
+ </class>
+ <class name="java/lang/SecurityException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/lang/SecurityManager" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="checkAccept(Ljava/lang/String;I)V" />
+ <method name="checkAccess(Ljava/lang/Thread;)V" />
+ <method name="checkAccess(Ljava/lang/ThreadGroup;)V" />
+ <method name="checkAwtEventQueueAccess()V" />
+ <method name="checkConnect(Ljava/lang/String;I)V" />
+ <method name="checkConnect(Ljava/lang/String;ILjava/lang/Object;)V" />
+ <method name="checkCreateClassLoader()V" />
+ <method name="checkDelete(Ljava/lang/String;)V" />
+ <method name="checkExec(Ljava/lang/String;)V" />
+ <method name="checkExit(I)V" />
+ <method name="checkLink(Ljava/lang/String;)V" />
+ <method name="checkListen(I)V" />
+ <method name="checkMemberAccess(Ljava/lang/Class;I)V" />
+ <method name="checkMulticast(Ljava/net/InetAddress;)V" />
+ <method name="checkMulticast(Ljava/net/InetAddress;B)V" />
+ <method name="checkPackageAccess(Ljava/lang/String;)V" />
+ <method name="checkPackageDefinition(Ljava/lang/String;)V" />
+ <method name="checkPermission(Ljava/security/Permission;)V" />
+ <method name="checkPermission(Ljava/security/Permission;Ljava/lang/Object;)V" />
+ <method name="checkPrintJobAccess()V" />
+ <method name="checkPropertiesAccess()V" />
+ <method name="checkPropertyAccess(Ljava/lang/String;)V" />
+ <method name="checkRead(Ljava/io/FileDescriptor;)V" />
+ <method name="checkRead(Ljava/lang/String;)V" />
+ <method name="checkRead(Ljava/lang/String;Ljava/lang/Object;)V" />
+ <method name="checkSecurityAccess(Ljava/lang/String;)V" />
+ <method name="checkSetFactory()V" />
+ <method name="checkSystemClipboardAccess()V" />
+ <method name="checkTopLevelWindow(Ljava/lang/Object;)Z" />
+ <method name="checkWrite(Ljava/io/FileDescriptor;)V" />
+ <method name="checkWrite(Ljava/lang/String;)V" />
+ <method name="classDepth(Ljava/lang/String;)I" />
+ <method name="classLoaderDepth()I" />
+ <method name="currentClassLoader()Ljava/lang/ClassLoader;" />
+ <method name="currentLoadedClass()Ljava/lang/Class;" />
+ <method name="getClassContext()[Ljava/lang/Class;" />
+ <method name="getInCheck()Z" />
+ <method name="getSecurityContext()Ljava/lang/Object;" />
+ <method name="getThreadGroup()Ljava/lang/ThreadGroup;" />
+ <method name="inClass(Ljava/lang/String;)Z" />
+ <method name="inClassLoader()Z" />
+ <field name="inCheck" />
+ </class>
+ <class name="java/lang/Short" since="1">
+ <extends name="java/lang/Number" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(S)V" />
+ <method name="compare(SS)I" since="19" />
+ <method name="compareTo(Ljava/lang/Short;)I" />
+ <method name="decode(Ljava/lang/String;)Ljava/lang/Short;" />
+ <method name="parseShort(Ljava/lang/String;)S" />
+ <method name="parseShort(Ljava/lang/String;I)S" />
+ <method name="reverseBytes(S)S" />
+ <method name="toString(S)Ljava/lang/String;" />
+ <method name="valueOf(Ljava/lang/String;)Ljava/lang/Short;" />
+ <method name="valueOf(Ljava/lang/String;I)Ljava/lang/Short;" />
+ <method name="valueOf(S)Ljava/lang/Short;" />
+ <field name="MAX_VALUE" />
+ <field name="MIN_VALUE" />
+ <field name="SIZE" />
+ <field name="TYPE" />
+ </class>
+ <class name="java/lang/StackOverflowError" since="1">
+ <extends name="java/lang/VirtualMachineError" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/StackTraceElement" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V" />
+ <method name="getClassName()Ljava/lang/String;" />
+ <method name="getFileName()Ljava/lang/String;" />
+ <method name="getLineNumber()I" />
+ <method name="getMethodName()Ljava/lang/String;" />
+ <method name="isNativeMethod()Z" />
+ </class>
+ <class name="java/lang/StrictMath" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="IEEEremainder(DD)D" />
+ <method name="abs(D)D" />
+ <method name="abs(F)F" />
+ <method name="abs(I)I" />
+ <method name="abs(J)J" />
+ <method name="acos(D)D" />
+ <method name="asin(D)D" />
+ <method name="atan(D)D" />
+ <method name="atan2(DD)D" />
+ <method name="cbrt(D)D" />
+ <method name="ceil(D)D" />
+ <method name="copySign(DD)D" since="9" />
+ <method name="copySign(FF)F" since="9" />
+ <method name="cos(D)D" />
+ <method name="cosh(D)D" />
+ <method name="exp(D)D" />
+ <method name="expm1(D)D" />
+ <method name="floor(D)D" />
+ <method name="getExponent(D)I" since="9" />
+ <method name="getExponent(F)I" since="9" />
+ <method name="hypot(DD)D" />
+ <method name="log(D)D" />
+ <method name="log10(D)D" />
+ <method name="log1p(D)D" />
+ <method name="max(DD)D" />
+ <method name="max(FF)F" />
+ <method name="max(II)I" />
+ <method name="max(JJ)J" />
+ <method name="min(DD)D" />
+ <method name="min(FF)F" />
+ <method name="min(II)I" />
+ <method name="min(JJ)J" />
+ <method name="nextAfter(DD)D" since="9" />
+ <method name="nextAfter(FD)F" since="9" />
+ <method name="nextUp(D)D" since="9" />
+ <method name="nextUp(F)F" since="9" />
+ <method name="pow(DD)D" />
+ <method name="random()D" />
+ <method name="rint(D)D" />
+ <method name="round(D)J" />
+ <method name="round(F)I" />
+ <method name="scalb(DI)D" since="9" />
+ <method name="scalb(FI)F" since="9" />
+ <method name="signum(D)D" />
+ <method name="signum(F)F" />
+ <method name="sin(D)D" />
+ <method name="sinh(D)D" />
+ <method name="sqrt(D)D" />
+ <method name="tan(D)D" />
+ <method name="tanh(D)D" />
+ <method name="toDegrees(D)D" />
+ <method name="toRadians(D)D" />
+ <method name="ulp(D)D" />
+ <method name="ulp(F)F" />
+ <field name="E" />
+ <field name="PI" />
+ </class>
+ <class name="java/lang/String" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/CharSequence" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/StringBuffer;)V" />
+ <method name="&lt;init>(Ljava/lang/StringBuilder;)V" />
+ <method name="&lt;init>([B)V" />
+ <method name="&lt;init>([BI)V" />
+ <method name="&lt;init>([BII)V" />
+ <method name="&lt;init>([BIII)V" />
+ <method name="&lt;init>([BIILjava/lang/String;)V" />
+ <method name="&lt;init>([BIILjava/nio/charset/Charset;)V" since="9" />
+ <method name="&lt;init>([BLjava/lang/String;)V" />
+ <method name="&lt;init>([BLjava/nio/charset/Charset;)V" since="9" />
+ <method name="&lt;init>([C)V" />
+ <method name="&lt;init>([CII)V" />
+ <method name="&lt;init>([III)V" />
+ <method name="codePointAt(I)I" />
+ <method name="codePointBefore(I)I" />
+ <method name="codePointCount(II)I" />
+ <method name="compareTo(Ljava/lang/String;)I" />
+ <method name="compareToIgnoreCase(Ljava/lang/String;)I" />
+ <method name="concat(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="contains(Ljava/lang/CharSequence;)Z" />
+ <method name="contentEquals(Ljava/lang/CharSequence;)Z" />
+ <method name="contentEquals(Ljava/lang/StringBuffer;)Z" />
+ <method name="copyValueOf([C)Ljava/lang/String;" />
+ <method name="copyValueOf([CII)Ljava/lang/String;" />
+ <method name="endsWith(Ljava/lang/String;)Z" />
+ <method name="equalsIgnoreCase(Ljava/lang/String;)Z" />
+ <method name="format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;" />
+ <method name="format(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;" />
+ <method name="getBytes()[B" />
+ <method name="getBytes(II[BI)V" />
+ <method name="getBytes(Ljava/lang/String;)[B" />
+ <method name="getBytes(Ljava/nio/charset/Charset;)[B" since="9" />
+ <method name="getChars(II[CI)V" />
+ <method name="indexOf(I)I" />
+ <method name="indexOf(II)I" />
+ <method name="indexOf(Ljava/lang/String;)I" />
+ <method name="indexOf(Ljava/lang/String;I)I" />
+ <method name="intern()Ljava/lang/String;" />
+ <method name="isEmpty()Z" since="9" />
+ <method name="lastIndexOf(I)I" />
+ <method name="lastIndexOf(II)I" />
+ <method name="lastIndexOf(Ljava/lang/String;)I" />
+ <method name="lastIndexOf(Ljava/lang/String;I)I" />
+ <method name="matches(Ljava/lang/String;)Z" />
+ <method name="offsetByCodePoints(II)I" />
+ <method name="regionMatches(ILjava/lang/String;II)Z" />
+ <method name="regionMatches(ZILjava/lang/String;II)Z" />
+ <method name="replace(CC)Ljava/lang/String;" />
+ <method name="replace(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String;" />
+ <method name="replaceAll(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="replaceFirst(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="split(Ljava/lang/String;)[Ljava/lang/String;" />
+ <method name="split(Ljava/lang/String;I)[Ljava/lang/String;" />
+ <method name="startsWith(Ljava/lang/String;)Z" />
+ <method name="startsWith(Ljava/lang/String;I)Z" />
+ <method name="substring(I)Ljava/lang/String;" />
+ <method name="substring(II)Ljava/lang/String;" />
+ <method name="toCharArray()[C" />
+ <method name="toLowerCase()Ljava/lang/String;" />
+ <method name="toLowerCase(Ljava/util/Locale;)Ljava/lang/String;" />
+ <method name="toUpperCase()Ljava/lang/String;" />
+ <method name="toUpperCase(Ljava/util/Locale;)Ljava/lang/String;" />
+ <method name="trim()Ljava/lang/String;" />
+ <method name="valueOf(C)Ljava/lang/String;" />
+ <method name="valueOf(D)Ljava/lang/String;" />
+ <method name="valueOf(F)Ljava/lang/String;" />
+ <method name="valueOf(I)Ljava/lang/String;" />
+ <method name="valueOf(J)Ljava/lang/String;" />
+ <method name="valueOf(Ljava/lang/Object;)Ljava/lang/String;" />
+ <method name="valueOf(Z)Ljava/lang/String;" />
+ <method name="valueOf([C)Ljava/lang/String;" />
+ <method name="valueOf([CII)Ljava/lang/String;" />
+ <field name="CASE_INSENSITIVE_ORDER" />
+ </class>
+ <class name="java/lang/StringBuffer" since="1">
+ <extends name="java/lang/AbstractStringBuilder" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Appendable" />
+ <implements name="java/lang/CharSequence" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Ljava/lang/CharSequence;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="append(C)Ljava/lang/StringBuffer;" />
+ <method name="append(D)Ljava/lang/StringBuffer;" />
+ <method name="append(F)Ljava/lang/StringBuffer;" />
+ <method name="append(I)Ljava/lang/StringBuffer;" />
+ <method name="append(J)Ljava/lang/StringBuffer;" />
+ <method name="append(Ljava/lang/CharSequence;)Ljava/lang/StringBuffer;" />
+ <method name="append(Ljava/lang/CharSequence;II)Ljava/lang/StringBuffer;" />
+ <method name="append(Ljava/lang/Object;)Ljava/lang/StringBuffer;" />
+ <method name="append(Ljava/lang/String;)Ljava/lang/StringBuffer;" />
+ <method name="append(Ljava/lang/StringBuffer;)Ljava/lang/StringBuffer;" />
+ <method name="append(Z)Ljava/lang/StringBuffer;" />
+ <method name="append([C)Ljava/lang/StringBuffer;" />
+ <method name="append([CII)Ljava/lang/StringBuffer;" />
+ <method name="appendCodePoint(I)Ljava/lang/StringBuffer;" />
+ <method name="delete(II)Ljava/lang/StringBuffer;" />
+ <method name="deleteCharAt(I)Ljava/lang/StringBuffer;" />
+ <method name="insert(IC)Ljava/lang/StringBuffer;" />
+ <method name="insert(ID)Ljava/lang/StringBuffer;" />
+ <method name="insert(IF)Ljava/lang/StringBuffer;" />
+ <method name="insert(II)Ljava/lang/StringBuffer;" />
+ <method name="insert(IJ)Ljava/lang/StringBuffer;" />
+ <method name="insert(ILjava/lang/CharSequence;)Ljava/lang/StringBuffer;" />
+ <method name="insert(ILjava/lang/CharSequence;II)Ljava/lang/StringBuffer;" />
+ <method name="insert(ILjava/lang/Object;)Ljava/lang/StringBuffer;" />
+ <method name="insert(ILjava/lang/String;)Ljava/lang/StringBuffer;" />
+ <method name="insert(IZ)Ljava/lang/StringBuffer;" />
+ <method name="insert(I[C)Ljava/lang/StringBuffer;" />
+ <method name="insert(I[CII)Ljava/lang/StringBuffer;" />
+ <method name="replace(IILjava/lang/String;)Ljava/lang/StringBuffer;" />
+ <method name="reverse()Ljava/lang/StringBuffer;" />
+ </class>
+ <class name="java/lang/StringBuilder" since="1">
+ <extends name="java/lang/AbstractStringBuilder" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Appendable" />
+ <implements name="java/lang/CharSequence" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Ljava/lang/CharSequence;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="append(C)Ljava/lang/StringBuilder;" />
+ <method name="append(D)Ljava/lang/StringBuilder;" />
+ <method name="append(F)Ljava/lang/StringBuilder;" />
+ <method name="append(I)Ljava/lang/StringBuilder;" />
+ <method name="append(J)Ljava/lang/StringBuilder;" />
+ <method name="append(Ljava/lang/CharSequence;)Ljava/lang/StringBuilder;" />
+ <method name="append(Ljava/lang/CharSequence;II)Ljava/lang/StringBuilder;" />
+ <method name="append(Ljava/lang/Object;)Ljava/lang/StringBuilder;" />
+ <method name="append(Ljava/lang/String;)Ljava/lang/StringBuilder;" />
+ <method name="append(Ljava/lang/StringBuffer;)Ljava/lang/StringBuilder;" />
+ <method name="append(Z)Ljava/lang/StringBuilder;" />
+ <method name="append([C)Ljava/lang/StringBuilder;" />
+ <method name="append([CII)Ljava/lang/StringBuilder;" />
+ <method name="appendCodePoint(I)Ljava/lang/StringBuilder;" />
+ <method name="delete(II)Ljava/lang/StringBuilder;" />
+ <method name="deleteCharAt(I)Ljava/lang/StringBuilder;" />
+ <method name="insert(IC)Ljava/lang/StringBuilder;" />
+ <method name="insert(ID)Ljava/lang/StringBuilder;" />
+ <method name="insert(IF)Ljava/lang/StringBuilder;" />
+ <method name="insert(II)Ljava/lang/StringBuilder;" />
+ <method name="insert(IJ)Ljava/lang/StringBuilder;" />
+ <method name="insert(ILjava/lang/CharSequence;)Ljava/lang/StringBuilder;" />
+ <method name="insert(ILjava/lang/CharSequence;II)Ljava/lang/StringBuilder;" />
+ <method name="insert(ILjava/lang/Object;)Ljava/lang/StringBuilder;" />
+ <method name="insert(ILjava/lang/String;)Ljava/lang/StringBuilder;" />
+ <method name="insert(IZ)Ljava/lang/StringBuilder;" />
+ <method name="insert(I[C)Ljava/lang/StringBuilder;" />
+ <method name="insert(I[CII)Ljava/lang/StringBuilder;" />
+ <method name="replace(IILjava/lang/String;)Ljava/lang/StringBuilder;" />
+ <method name="reverse()Ljava/lang/StringBuilder;" />
+ </class>
+ <class name="java/lang/StringIndexOutOfBoundsException" since="1">
+ <extends name="java/lang/IndexOutOfBoundsException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/SuppressWarnings" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/annotation/Annotation" />
+ <method name="value()[Ljava/lang/String;" />
+ </class>
+ <class name="java/lang/System" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V" />
+ <method name="clearProperty(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="console()Ljava/io/Console;" since="9" />
+ <method name="currentTimeMillis()J" />
+ <method name="exit(I)V" />
+ <method name="gc()V" />
+ <method name="getProperties()Ljava/util/Properties;" />
+ <method name="getProperty(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getSecurityManager()Ljava/lang/SecurityManager;" />
+ <method name="getenv()Ljava/util/Map;" />
+ <method name="getenv(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="identityHashCode(Ljava/lang/Object;)I" />
+ <method name="inheritedChannel()Ljava/nio/channels/Channel;" />
+ <method name="lineSeparator()Ljava/lang/String;" since="19" />
+ <method name="load(Ljava/lang/String;)V" />
+ <method name="loadLibrary(Ljava/lang/String;)V" />
+ <method name="mapLibraryName(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="nanoTime()J" />
+ <method name="runFinalization()V" />
+ <method name="runFinalizersOnExit(Z)V" />
+ <method name="setErr(Ljava/io/PrintStream;)V" />
+ <method name="setIn(Ljava/io/InputStream;)V" />
+ <method name="setOut(Ljava/io/PrintStream;)V" />
+ <method name="setProperties(Ljava/util/Properties;)V" />
+ <method name="setProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="setSecurityManager(Ljava/lang/SecurityManager;)V" />
+ <field name="err" />
+ <field name="in" />
+ <field name="out" />
+ </class>
+ <class name="java/lang/Thread" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Runnable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/Runnable;)V" />
+ <method name="&lt;init>(Ljava/lang/Runnable;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/ThreadGroup;Ljava/lang/Runnable;)V" />
+ <method name="&lt;init>(Ljava/lang/ThreadGroup;Ljava/lang/Runnable;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/ThreadGroup;Ljava/lang/Runnable;Ljava/lang/String;J)V" />
+ <method name="&lt;init>(Ljava/lang/ThreadGroup;Ljava/lang/String;)V" />
+ <method name="activeCount()I" />
+ <method name="checkAccess()V" />
+ <method name="countStackFrames()I" />
+ <method name="currentThread()Ljava/lang/Thread;" />
+ <method name="destroy()V" />
+ <method name="dumpStack()V" />
+ <method name="enumerate([Ljava/lang/Thread;)I" />
+ <method name="getAllStackTraces()Ljava/util/Map;" />
+ <method name="getContextClassLoader()Ljava/lang/ClassLoader;" />
+ <method name="getDefaultUncaughtExceptionHandler()Ljava/lang/Thread$UncaughtExceptionHandler;" />
+ <method name="getId()J" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getPriority()I" />
+ <method name="getStackTrace()[Ljava/lang/StackTraceElement;" />
+ <method name="getState()Ljava/lang/Thread$State;" />
+ <method name="getThreadGroup()Ljava/lang/ThreadGroup;" />
+ <method name="getUncaughtExceptionHandler()Ljava/lang/Thread$UncaughtExceptionHandler;" />
+ <method name="holdsLock(Ljava/lang/Object;)Z" />
+ <method name="interrupt()V" />
+ <method name="interrupted()Z" />
+ <method name="isAlive()Z" />
+ <method name="isDaemon()Z" />
+ <method name="isInterrupted()Z" />
+ <method name="join()V" />
+ <method name="join(J)V" />
+ <method name="join(JI)V" />
+ <method name="resume()V" />
+ <method name="setContextClassLoader(Ljava/lang/ClassLoader;)V" />
+ <method name="setDaemon(Z)V" />
+ <method name="setDefaultUncaughtExceptionHandler(Ljava/lang/Thread$UncaughtExceptionHandler;)V" />
+ <method name="setName(Ljava/lang/String;)V" />
+ <method name="setPriority(I)V" />
+ <method name="setUncaughtExceptionHandler(Ljava/lang/Thread$UncaughtExceptionHandler;)V" />
+ <method name="sleep(J)V" />
+ <method name="sleep(JI)V" />
+ <method name="start()V" />
+ <method name="stop()V" />
+ <method name="stop(Ljava/lang/Throwable;)V" />
+ <method name="suspend()V" />
+ <method name="yield()V" />
+ <field name="MAX_PRIORITY" />
+ <field name="MIN_PRIORITY" />
+ <field name="NORM_PRIORITY" />
+ </class>
+ <class name="java/lang/Thread$State" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Ljava/lang/Thread$State;" />
+ <method name="values()[Ljava/lang/Thread$State;" />
+ <field name="BLOCKED" />
+ <field name="NEW" />
+ <field name="RUNNABLE" />
+ <field name="TERMINATED" />
+ <field name="TIMED_WAITING" />
+ <field name="WAITING" />
+ </class>
+ <class name="java/lang/Thread$UncaughtExceptionHandler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="uncaughtException(Ljava/lang/Thread;Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/lang/ThreadDeath" since="1">
+ <extends name="java/lang/Error" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/lang/ThreadGroup" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Thread$UncaughtExceptionHandler" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/ThreadGroup;Ljava/lang/String;)V" />
+ <method name="activeCount()I" />
+ <method name="activeGroupCount()I" />
+ <method name="allowThreadSuspension(Z)Z" />
+ <method name="checkAccess()V" />
+ <method name="destroy()V" />
+ <method name="enumerate([Ljava/lang/Thread;)I" />
+ <method name="enumerate([Ljava/lang/Thread;Z)I" />
+ <method name="enumerate([Ljava/lang/ThreadGroup;)I" />
+ <method name="enumerate([Ljava/lang/ThreadGroup;Z)I" />
+ <method name="getMaxPriority()I" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getParent()Ljava/lang/ThreadGroup;" />
+ <method name="interrupt()V" />
+ <method name="isDaemon()Z" />
+ <method name="isDestroyed()Z" />
+ <method name="list()V" />
+ <method name="parentOf(Ljava/lang/ThreadGroup;)Z" />
+ <method name="resume()V" />
+ <method name="setDaemon(Z)V" />
+ <method name="setMaxPriority(I)V" />
+ <method name="stop()V" />
+ <method name="suspend()V" />
+ </class>
+ <class name="java/lang/ThreadLocal" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="get()Ljava/lang/Object;" />
+ <method name="initialValue()Ljava/lang/Object;" />
+ <method name="remove()V" />
+ <method name="set(Ljava/lang/Object;)V" />
+ </class>
+ <class name="java/lang/Throwable" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;ZZ)V" since="19" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ <method name="addSuppressed(Ljava/lang/Throwable;)V" since="19" />
+ <method name="fillInStackTrace()Ljava/lang/Throwable;" />
+ <method name="getCause()Ljava/lang/Throwable;" />
+ <method name="getLocalizedMessage()Ljava/lang/String;" />
+ <method name="getMessage()Ljava/lang/String;" />
+ <method name="getStackTrace()[Ljava/lang/StackTraceElement;" />
+ <method name="getSuppressed()[Ljava/lang/Throwable;" since="19" />
+ <method name="initCause(Ljava/lang/Throwable;)Ljava/lang/Throwable;" />
+ <method name="printStackTrace()V" />
+ <method name="printStackTrace(Ljava/io/PrintStream;)V" />
+ <method name="printStackTrace(Ljava/io/PrintWriter;)V" />
+ <method name="setStackTrace([Ljava/lang/StackTraceElement;)V" />
+ </class>
+ <class name="java/lang/TypeNotPresentException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="typeName()Ljava/lang/String;" />
+ </class>
+ <class name="java/lang/UnknownError" since="1">
+ <extends name="java/lang/VirtualMachineError" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/UnsatisfiedLinkError" since="1">
+ <extends name="java/lang/LinkageError" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/UnsupportedClassVersionError" since="1">
+ <extends name="java/lang/ClassFormatError" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/UnsupportedOperationException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/lang/VerifyError" since="1">
+ <extends name="java/lang/LinkageError" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/VirtualMachineError" since="1">
+ <extends name="java/lang/Error" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/Void" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="TYPE" />
+ </class>
+ <class name="java/lang/annotation/Annotation" since="1">
+ <extends name="java/lang/Object" />
+ <method name="annotationType()Ljava/lang/Class;" />
+ </class>
+ <class name="java/lang/annotation/AnnotationFormatError" since="1">
+ <extends name="java/lang/Error" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/lang/annotation/AnnotationTypeMismatchException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>(Ljava/lang/reflect/Method;Ljava/lang/String;)V" />
+ <method name="element()Ljava/lang/reflect/Method;" />
+ <method name="foundType()Ljava/lang/String;" />
+ </class>
+ <class name="java/lang/annotation/Documented" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/annotation/Annotation" />
+ </class>
+ <class name="java/lang/annotation/ElementType" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Ljava/lang/annotation/ElementType;" />
+ <method name="values()[Ljava/lang/annotation/ElementType;" />
+ <field name="ANNOTATION_TYPE" />
+ <field name="CONSTRUCTOR" />
+ <field name="FIELD" />
+ <field name="LOCAL_VARIABLE" />
+ <field name="METHOD" />
+ <field name="PACKAGE" />
+ <field name="PARAMETER" />
+ <field name="TYPE" />
+ </class>
+ <class name="java/lang/annotation/IncompleteAnnotationException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>(Ljava/lang/Class;Ljava/lang/String;)V" />
+ <method name="annotationType()Ljava/lang/Class;" />
+ <method name="elementName()Ljava/lang/String;" />
+ </class>
+ <class name="java/lang/annotation/Inherited" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/annotation/Annotation" />
+ </class>
+ <class name="java/lang/annotation/Retention" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/annotation/Annotation" />
+ <method name="value()Ljava/lang/annotation/RetentionPolicy;" />
+ </class>
+ <class name="java/lang/annotation/RetentionPolicy" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Ljava/lang/annotation/RetentionPolicy;" />
+ <method name="values()[Ljava/lang/annotation/RetentionPolicy;" />
+ <field name="CLASS" />
+ <field name="RUNTIME" />
+ <field name="SOURCE" />
+ </class>
+ <class name="java/lang/annotation/Target" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/annotation/Annotation" />
+ <method name="value()[Ljava/lang/annotation/ElementType;" />
+ </class>
+ <class name="java/lang/ref/PhantomReference" since="1">
+ <extends name="java/lang/ref/Reference" />
+ <method name="&lt;init>(Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V" />
+ </class>
+ <class name="java/lang/ref/Reference" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="clear()V" />
+ <method name="enqueue()Z" />
+ <method name="get()Ljava/lang/Object;" />
+ <method name="isEnqueued()Z" />
+ </class>
+ <class name="java/lang/ref/ReferenceQueue" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="poll()Ljava/lang/ref/Reference;" />
+ <method name="remove()Ljava/lang/ref/Reference;" />
+ <method name="remove(J)Ljava/lang/ref/Reference;" />
+ </class>
+ <class name="java/lang/ref/SoftReference" since="1">
+ <extends name="java/lang/ref/Reference" />
+ <method name="&lt;init>(Ljava/lang/Object;)V" />
+ <method name="&lt;init>(Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V" />
+ </class>
+ <class name="java/lang/ref/WeakReference" since="1">
+ <extends name="java/lang/ref/Reference" />
+ <method name="&lt;init>(Ljava/lang/Object;)V" />
+ <method name="&lt;init>(Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V" />
+ </class>
+ <class name="java/lang/reflect/AccessibleObject" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/reflect/AnnotatedElement" />
+ <method name="&lt;init>()V" />
+ <method name="isAccessible()Z" />
+ <method name="setAccessible(Z)V" />
+ <method name="setAccessible([Ljava/lang/reflect/AccessibleObject;Z)V" />
+ </class>
+ <class name="java/lang/reflect/AnnotatedElement" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getAnnotation(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;" />
+ <method name="getAnnotations()[Ljava/lang/annotation/Annotation;" />
+ <method name="getDeclaredAnnotations()[Ljava/lang/annotation/Annotation;" />
+ <method name="isAnnotationPresent(Ljava/lang/Class;)Z" />
+ </class>
+ <class name="java/lang/reflect/Array" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="get(Ljava/lang/Object;I)Ljava/lang/Object;" />
+ <method name="getBoolean(Ljava/lang/Object;I)Z" />
+ <method name="getByte(Ljava/lang/Object;I)B" />
+ <method name="getChar(Ljava/lang/Object;I)C" />
+ <method name="getDouble(Ljava/lang/Object;I)D" />
+ <method name="getFloat(Ljava/lang/Object;I)F" />
+ <method name="getInt(Ljava/lang/Object;I)I" />
+ <method name="getLength(Ljava/lang/Object;)I" />
+ <method name="getLong(Ljava/lang/Object;I)J" />
+ <method name="getShort(Ljava/lang/Object;I)S" />
+ <method name="newInstance(Ljava/lang/Class;I)Ljava/lang/Object;" />
+ <method name="newInstance(Ljava/lang/Class;[I)Ljava/lang/Object;" />
+ <method name="set(Ljava/lang/Object;ILjava/lang/Object;)V" />
+ <method name="setBoolean(Ljava/lang/Object;IZ)V" />
+ <method name="setByte(Ljava/lang/Object;IB)V" />
+ <method name="setChar(Ljava/lang/Object;IC)V" />
+ <method name="setDouble(Ljava/lang/Object;ID)V" />
+ <method name="setFloat(Ljava/lang/Object;IF)V" />
+ <method name="setInt(Ljava/lang/Object;II)V" />
+ <method name="setLong(Ljava/lang/Object;IJ)V" />
+ <method name="setShort(Ljava/lang/Object;IS)V" />
+ </class>
+ <class name="java/lang/reflect/Constructor" since="1">
+ <extends name="java/lang/reflect/AccessibleObject" />
+ <implements name="java/lang/reflect/GenericDeclaration" />
+ <implements name="java/lang/reflect/Member" />
+ <method name="&lt;init>()V" />
+ <method name="getExceptionTypes()[Ljava/lang/Class;" />
+ <method name="getGenericExceptionTypes()[Ljava/lang/reflect/Type;" />
+ <method name="getGenericParameterTypes()[Ljava/lang/reflect/Type;" />
+ <method name="getParameterAnnotations()[[Ljava/lang/annotation/Annotation;" />
+ <method name="getParameterTypes()[Ljava/lang/Class;" />
+ <method name="isVarArgs()Z" />
+ <method name="newInstance([Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="toGenericString()Ljava/lang/String;" />
+ </class>
+ <class name="java/lang/reflect/Field" since="1">
+ <extends name="java/lang/reflect/AccessibleObject" />
+ <implements name="java/lang/reflect/Member" />
+ <method name="&lt;init>()V" />
+ <method name="get(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="getBoolean(Ljava/lang/Object;)Z" />
+ <method name="getByte(Ljava/lang/Object;)B" />
+ <method name="getChar(Ljava/lang/Object;)C" />
+ <method name="getDouble(Ljava/lang/Object;)D" />
+ <method name="getFloat(Ljava/lang/Object;)F" />
+ <method name="getGenericType()Ljava/lang/reflect/Type;" />
+ <method name="getInt(Ljava/lang/Object;)I" />
+ <method name="getLong(Ljava/lang/Object;)J" />
+ <method name="getShort(Ljava/lang/Object;)S" />
+ <method name="getType()Ljava/lang/Class;" />
+ <method name="isEnumConstant()Z" />
+ <method name="set(Ljava/lang/Object;Ljava/lang/Object;)V" />
+ <method name="setBoolean(Ljava/lang/Object;Z)V" />
+ <method name="setByte(Ljava/lang/Object;B)V" />
+ <method name="setChar(Ljava/lang/Object;C)V" />
+ <method name="setDouble(Ljava/lang/Object;D)V" />
+ <method name="setFloat(Ljava/lang/Object;F)V" />
+ <method name="setInt(Ljava/lang/Object;I)V" />
+ <method name="setLong(Ljava/lang/Object;J)V" />
+ <method name="setShort(Ljava/lang/Object;S)V" />
+ <method name="toGenericString()Ljava/lang/String;" />
+ </class>
+ <class name="java/lang/reflect/GenericArrayType" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/reflect/Type" />
+ <method name="getGenericComponentType()Ljava/lang/reflect/Type;" />
+ </class>
+ <class name="java/lang/reflect/GenericDeclaration" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getTypeParameters()[Ljava/lang/reflect/TypeVariable;" />
+ </class>
+ <class name="java/lang/reflect/GenericSignatureFormatError" since="1">
+ <extends name="java/lang/ClassFormatError" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/lang/reflect/InvocationHandler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="invoke(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;" />
+ </class>
+ <class name="java/lang/reflect/InvocationTargetException" since="1">
+ <extends name="java/lang/Exception" />
+ <extends name="java/lang/ReflectiveOperationException" since="19" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;Ljava/lang/String;)V" />
+ <method name="getTargetException()Ljava/lang/Throwable;" />
+ </class>
+ <class name="java/lang/reflect/MalformedParameterizedTypeException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/lang/reflect/Member" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getDeclaringClass()Ljava/lang/Class;" />
+ <method name="getModifiers()I" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="isSynthetic()Z" />
+ <field name="DECLARED" />
+ <field name="PUBLIC" />
+ </class>
+ <class name="java/lang/reflect/Method" since="1">
+ <extends name="java/lang/reflect/AccessibleObject" />
+ <implements name="java/lang/reflect/GenericDeclaration" />
+ <implements name="java/lang/reflect/Member" />
+ <method name="&lt;init>()V" />
+ <method name="getDefaultValue()Ljava/lang/Object;" />
+ <method name="getExceptionTypes()[Ljava/lang/Class;" />
+ <method name="getGenericExceptionTypes()[Ljava/lang/reflect/Type;" />
+ <method name="getGenericParameterTypes()[Ljava/lang/reflect/Type;" />
+ <method name="getGenericReturnType()Ljava/lang/reflect/Type;" />
+ <method name="getParameterAnnotations()[[Ljava/lang/annotation/Annotation;" />
+ <method name="getParameterTypes()[Ljava/lang/Class;" />
+ <method name="getReturnType()Ljava/lang/Class;" />
+ <method name="invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="isBridge()Z" />
+ <method name="isVarArgs()Z" />
+ <method name="toGenericString()Ljava/lang/String;" />
+ </class>
+ <class name="java/lang/reflect/Modifier" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="classModifiers()I" since="19" />
+ <method name="constructorModifiers()I" since="19" />
+ <method name="fieldModifiers()I" since="19" />
+ <method name="interfaceModifiers()I" since="19" />
+ <method name="isAbstract(I)Z" />
+ <method name="isFinal(I)Z" />
+ <method name="isInterface(I)Z" />
+ <method name="isNative(I)Z" />
+ <method name="isPrivate(I)Z" />
+ <method name="isProtected(I)Z" />
+ <method name="isPublic(I)Z" />
+ <method name="isStatic(I)Z" />
+ <method name="isStrict(I)Z" />
+ <method name="isSynchronized(I)Z" />
+ <method name="isTransient(I)Z" />
+ <method name="isVolatile(I)Z" />
+ <method name="methodModifiers()I" since="19" />
+ <method name="toString(I)Ljava/lang/String;" />
+ <field name="ABSTRACT" />
+ <field name="FINAL" />
+ <field name="INTERFACE" />
+ <field name="NATIVE" />
+ <field name="PRIVATE" />
+ <field name="PROTECTED" />
+ <field name="PUBLIC" />
+ <field name="STATIC" />
+ <field name="STRICT" />
+ <field name="SYNCHRONIZED" />
+ <field name="TRANSIENT" />
+ <field name="VOLATILE" />
+ </class>
+ <class name="java/lang/reflect/ParameterizedType" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/reflect/Type" />
+ <method name="getActualTypeArguments()[Ljava/lang/reflect/Type;" />
+ <method name="getOwnerType()Ljava/lang/reflect/Type;" />
+ <method name="getRawType()Ljava/lang/reflect/Type;" />
+ </class>
+ <class name="java/lang/reflect/Proxy" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/lang/reflect/InvocationHandler;)V" />
+ <method name="getInvocationHandler(Ljava/lang/Object;)Ljava/lang/reflect/InvocationHandler;" />
+ <method name="getProxyClass(Ljava/lang/ClassLoader;[Ljava/lang/Class;)Ljava/lang/Class;" />
+ <method name="isProxyClass(Ljava/lang/Class;)Z" />
+ <method name="newProxyInstance(Ljava/lang/ClassLoader;[Ljava/lang/Class;Ljava/lang/reflect/InvocationHandler;)Ljava/lang/Object;" />
+ <field name="h" />
+ </class>
+ <class name="java/lang/reflect/ReflectPermission" since="1">
+ <extends name="java/security/BasicPermission" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="java/lang/reflect/Type" since="1">
+ <extends name="java/lang/Object" />
+ </class>
+ <class name="java/lang/reflect/TypeVariable" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/reflect/Type" />
+ <method name="getBounds()[Ljava/lang/reflect/Type;" />
+ <method name="getGenericDeclaration()Ljava/lang/reflect/GenericDeclaration;" />
+ <method name="getName()Ljava/lang/String;" />
+ </class>
+ <class name="java/lang/reflect/UndeclaredThrowableException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;Ljava/lang/String;)V" />
+ <method name="getUndeclaredThrowable()Ljava/lang/Throwable;" />
+ </class>
+ <class name="java/lang/reflect/WildcardType" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/reflect/Type" />
+ <method name="getLowerBounds()[Ljava/lang/reflect/Type;" />
+ <method name="getUpperBounds()[Ljava/lang/reflect/Type;" />
+ </class>
+ <class name="java/math/BigDecimal" since="1">
+ <extends name="java/lang/Number" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>(D)V" />
+ <method name="&lt;init>(DLjava/math/MathContext;)V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(ILjava/math/MathContext;)V" />
+ <method name="&lt;init>(J)V" />
+ <method name="&lt;init>(JLjava/math/MathContext;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/math/MathContext;)V" />
+ <method name="&lt;init>(Ljava/math/BigInteger;)V" />
+ <method name="&lt;init>(Ljava/math/BigInteger;I)V" />
+ <method name="&lt;init>(Ljava/math/BigInteger;ILjava/math/MathContext;)V" />
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/MathContext;)V" />
+ <method name="&lt;init>([C)V" />
+ <method name="&lt;init>([CII)V" />
+ <method name="&lt;init>([CIILjava/math/MathContext;)V" />
+ <method name="&lt;init>([CLjava/math/MathContext;)V" />
+ <method name="abs()Ljava/math/BigDecimal;" />
+ <method name="abs(Ljava/math/MathContext;)Ljava/math/BigDecimal;" />
+ <method name="add(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;" />
+ <method name="add(Ljava/math/BigDecimal;Ljava/math/MathContext;)Ljava/math/BigDecimal;" />
+ <method name="byteValueExact()B" />
+ <method name="compareTo(Ljava/math/BigDecimal;)I" />
+ <method name="divide(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;" />
+ <method name="divide(Ljava/math/BigDecimal;I)Ljava/math/BigDecimal;" />
+ <method name="divide(Ljava/math/BigDecimal;II)Ljava/math/BigDecimal;" />
+ <method name="divide(Ljava/math/BigDecimal;ILjava/math/RoundingMode;)Ljava/math/BigDecimal;" />
+ <method name="divide(Ljava/math/BigDecimal;Ljava/math/MathContext;)Ljava/math/BigDecimal;" />
+ <method name="divide(Ljava/math/BigDecimal;Ljava/math/RoundingMode;)Ljava/math/BigDecimal;" />
+ <method name="divideAndRemainder(Ljava/math/BigDecimal;)[Ljava/math/BigDecimal;" />
+ <method name="divideAndRemainder(Ljava/math/BigDecimal;Ljava/math/MathContext;)[Ljava/math/BigDecimal;" />
+ <method name="divideToIntegralValue(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;" />
+ <method name="divideToIntegralValue(Ljava/math/BigDecimal;Ljava/math/MathContext;)Ljava/math/BigDecimal;" />
+ <method name="intValueExact()I" />
+ <method name="longValueExact()J" />
+ <method name="max(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;" />
+ <method name="min(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;" />
+ <method name="movePointLeft(I)Ljava/math/BigDecimal;" />
+ <method name="movePointRight(I)Ljava/math/BigDecimal;" />
+ <method name="multiply(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;" />
+ <method name="multiply(Ljava/math/BigDecimal;Ljava/math/MathContext;)Ljava/math/BigDecimal;" />
+ <method name="negate()Ljava/math/BigDecimal;" />
+ <method name="negate(Ljava/math/MathContext;)Ljava/math/BigDecimal;" />
+ <method name="plus()Ljava/math/BigDecimal;" />
+ <method name="plus(Ljava/math/MathContext;)Ljava/math/BigDecimal;" />
+ <method name="pow(I)Ljava/math/BigDecimal;" />
+ <method name="pow(ILjava/math/MathContext;)Ljava/math/BigDecimal;" />
+ <method name="precision()I" />
+ <method name="remainder(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;" />
+ <method name="remainder(Ljava/math/BigDecimal;Ljava/math/MathContext;)Ljava/math/BigDecimal;" />
+ <method name="round(Ljava/math/MathContext;)Ljava/math/BigDecimal;" />
+ <method name="scale()I" />
+ <method name="scaleByPowerOfTen(I)Ljava/math/BigDecimal;" />
+ <method name="setScale(I)Ljava/math/BigDecimal;" />
+ <method name="setScale(II)Ljava/math/BigDecimal;" />
+ <method name="setScale(ILjava/math/RoundingMode;)Ljava/math/BigDecimal;" />
+ <method name="shortValueExact()S" />
+ <method name="signum()I" />
+ <method name="stripTrailingZeros()Ljava/math/BigDecimal;" />
+ <method name="subtract(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;" />
+ <method name="subtract(Ljava/math/BigDecimal;Ljava/math/MathContext;)Ljava/math/BigDecimal;" />
+ <method name="toBigInteger()Ljava/math/BigInteger;" />
+ <method name="toBigIntegerExact()Ljava/math/BigInteger;" />
+ <method name="toEngineeringString()Ljava/lang/String;" />
+ <method name="toPlainString()Ljava/lang/String;" />
+ <method name="ulp()Ljava/math/BigDecimal;" />
+ <method name="unscaledValue()Ljava/math/BigInteger;" />
+ <method name="valueOf(D)Ljava/math/BigDecimal;" />
+ <method name="valueOf(J)Ljava/math/BigDecimal;" />
+ <method name="valueOf(JI)Ljava/math/BigDecimal;" />
+ <field name="ONE" />
+ <field name="ROUND_CEILING" />
+ <field name="ROUND_DOWN" />
+ <field name="ROUND_FLOOR" />
+ <field name="ROUND_HALF_DOWN" />
+ <field name="ROUND_HALF_EVEN" />
+ <field name="ROUND_HALF_UP" />
+ <field name="ROUND_UNNECESSARY" />
+ <field name="ROUND_UP" />
+ <field name="TEN" />
+ <field name="ZERO" />
+ </class>
+ <class name="java/math/BigInteger" since="1">
+ <extends name="java/lang/Number" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>(IILjava/util/Random;)V" />
+ <method name="&lt;init>(ILjava/util/Random;)V" />
+ <method name="&lt;init>(I[B)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;I)V" />
+ <method name="&lt;init>([B)V" />
+ <method name="abs()Ljava/math/BigInteger;" />
+ <method name="add(Ljava/math/BigInteger;)Ljava/math/BigInteger;" />
+ <method name="and(Ljava/math/BigInteger;)Ljava/math/BigInteger;" />
+ <method name="andNot(Ljava/math/BigInteger;)Ljava/math/BigInteger;" />
+ <method name="bitCount()I" />
+ <method name="bitLength()I" />
+ <method name="clearBit(I)Ljava/math/BigInteger;" />
+ <method name="compareTo(Ljava/math/BigInteger;)I" />
+ <method name="divide(Ljava/math/BigInteger;)Ljava/math/BigInteger;" />
+ <method name="divideAndRemainder(Ljava/math/BigInteger;)[Ljava/math/BigInteger;" />
+ <method name="flipBit(I)Ljava/math/BigInteger;" />
+ <method name="gcd(Ljava/math/BigInteger;)Ljava/math/BigInteger;" />
+ <method name="getLowestSetBit()I" />
+ <method name="isProbablePrime(I)Z" />
+ <method name="max(Ljava/math/BigInteger;)Ljava/math/BigInteger;" />
+ <method name="min(Ljava/math/BigInteger;)Ljava/math/BigInteger;" />
+ <method name="mod(Ljava/math/BigInteger;)Ljava/math/BigInteger;" />
+ <method name="modInverse(Ljava/math/BigInteger;)Ljava/math/BigInteger;" />
+ <method name="modPow(Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljava/math/BigInteger;" />
+ <method name="multiply(Ljava/math/BigInteger;)Ljava/math/BigInteger;" />
+ <method name="negate()Ljava/math/BigInteger;" />
+ <method name="nextProbablePrime()Ljava/math/BigInteger;" />
+ <method name="not()Ljava/math/BigInteger;" />
+ <method name="or(Ljava/math/BigInteger;)Ljava/math/BigInteger;" />
+ <method name="pow(I)Ljava/math/BigInteger;" />
+ <method name="probablePrime(ILjava/util/Random;)Ljava/math/BigInteger;" />
+ <method name="remainder(Ljava/math/BigInteger;)Ljava/math/BigInteger;" />
+ <method name="setBit(I)Ljava/math/BigInteger;" />
+ <method name="shiftLeft(I)Ljava/math/BigInteger;" />
+ <method name="shiftRight(I)Ljava/math/BigInteger;" />
+ <method name="signum()I" />
+ <method name="subtract(Ljava/math/BigInteger;)Ljava/math/BigInteger;" />
+ <method name="testBit(I)Z" />
+ <method name="toByteArray()[B" />
+ <method name="toString(I)Ljava/lang/String;" />
+ <method name="valueOf(J)Ljava/math/BigInteger;" />
+ <method name="xor(Ljava/math/BigInteger;)Ljava/math/BigInteger;" />
+ <field name="ONE" />
+ <field name="TEN" />
+ <field name="ZERO" />
+ </class>
+ <class name="java/math/MathContext" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(ILjava/math/RoundingMode;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getPrecision()I" />
+ <method name="getRoundingMode()Ljava/math/RoundingMode;" />
+ <field name="DECIMAL128" />
+ <field name="DECIMAL32" />
+ <field name="DECIMAL64" />
+ <field name="UNLIMITED" />
+ </class>
+ <class name="java/math/RoundingMode" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(I)Ljava/math/RoundingMode;" />
+ <method name="valueOf(Ljava/lang/String;)Ljava/math/RoundingMode;" />
+ <method name="values()[Ljava/math/RoundingMode;" />
+ <field name="CEILING" />
+ <field name="DOWN" />
+ <field name="FLOOR" />
+ <field name="HALF_DOWN" />
+ <field name="HALF_EVEN" />
+ <field name="HALF_UP" />
+ <field name="UNNECESSARY" />
+ <field name="UP" />
+ </class>
+ <class name="java/net/Authenticator" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getPasswordAuthentication()Ljava/net/PasswordAuthentication;" />
+ <method name="getRequestingHost()Ljava/lang/String;" />
+ <method name="getRequestingPort()I" />
+ <method name="getRequestingPrompt()Ljava/lang/String;" />
+ <method name="getRequestingProtocol()Ljava/lang/String;" />
+ <method name="getRequestingScheme()Ljava/lang/String;" />
+ <method name="getRequestingSite()Ljava/net/InetAddress;" />
+ <method name="getRequestingURL()Ljava/net/URL;" />
+ <method name="getRequestorType()Ljava/net/Authenticator$RequestorType;" />
+ <method name="requestPasswordAuthentication(Ljava/lang/String;Ljava/net/InetAddress;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/net/PasswordAuthentication;" />
+ <method name="requestPasswordAuthentication(Ljava/lang/String;Ljava/net/InetAddress;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/net/URL;Ljava/net/Authenticator$RequestorType;)Ljava/net/PasswordAuthentication;" />
+ <method name="requestPasswordAuthentication(Ljava/net/InetAddress;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/net/PasswordAuthentication;" />
+ <method name="setDefault(Ljava/net/Authenticator;)V" />
+ </class>
+ <class name="java/net/Authenticator$RequestorType" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Ljava/net/Authenticator$RequestorType;" />
+ <method name="values()[Ljava/net/Authenticator$RequestorType;" />
+ <field name="PROXY" />
+ <field name="SERVER" />
+ </class>
+ <class name="java/net/BindException" since="1">
+ <extends name="java/net/SocketException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/net/CacheRequest" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="abort()V" />
+ <method name="getBody()Ljava/io/OutputStream;" />
+ </class>
+ <class name="java/net/CacheResponse" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getBody()Ljava/io/InputStream;" />
+ <method name="getHeaders()Ljava/util/Map;" />
+ </class>
+ <class name="java/net/ConnectException" since="1">
+ <extends name="java/net/SocketException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/net/ContentHandler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getContent(Ljava/net/URLConnection;)Ljava/lang/Object;" />
+ <method name="getContent(Ljava/net/URLConnection;[Ljava/lang/Class;)Ljava/lang/Object;" />
+ </class>
+ <class name="java/net/ContentHandlerFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="createContentHandler(Ljava/lang/String;)Ljava/net/ContentHandler;" />
+ </class>
+ <class name="java/net/CookieHandler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="get(Ljava/net/URI;Ljava/util/Map;)Ljava/util/Map;" />
+ <method name="getDefault()Ljava/net/CookieHandler;" />
+ <method name="put(Ljava/net/URI;Ljava/util/Map;)V" />
+ <method name="setDefault(Ljava/net/CookieHandler;)V" />
+ </class>
+ <class name="java/net/CookieManager" since="9">
+ <extends name="java/net/CookieHandler" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/net/CookieStore;Ljava/net/CookiePolicy;)V" />
+ <method name="getCookieStore()Ljava/net/CookieStore;" />
+ <method name="setCookiePolicy(Ljava/net/CookiePolicy;)V" />
+ </class>
+ <class name="java/net/CookiePolicy" since="9">
+ <extends name="java/lang/Object" />
+ <method name="shouldAccept(Ljava/net/URI;Ljava/net/HttpCookie;)Z" />
+ <field name="ACCEPT_ALL" />
+ <field name="ACCEPT_NONE" />
+ <field name="ACCEPT_ORIGINAL_SERVER" />
+ </class>
+ <class name="java/net/CookieStore" since="9">
+ <extends name="java/lang/Object" />
+ <method name="add(Ljava/net/URI;Ljava/net/HttpCookie;)V" />
+ <method name="get(Ljava/net/URI;)Ljava/util/List;" />
+ <method name="getCookies()Ljava/util/List;" />
+ <method name="getURIs()Ljava/util/List;" />
+ <method name="remove(Ljava/net/URI;Ljava/net/HttpCookie;)Z" />
+ <method name="removeAll()Z" />
+ </class>
+ <class name="java/net/DatagramPacket" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>([BI)V" />
+ <method name="&lt;init>([BII)V" />
+ <method name="&lt;init>([BIILjava/net/InetAddress;I)V" />
+ <method name="&lt;init>([BIILjava/net/SocketAddress;)V" />
+ <method name="&lt;init>([BILjava/net/InetAddress;I)V" />
+ <method name="&lt;init>([BILjava/net/SocketAddress;)V" />
+ <method name="getAddress()Ljava/net/InetAddress;" />
+ <method name="getData()[B" />
+ <method name="getLength()I" />
+ <method name="getOffset()I" />
+ <method name="getPort()I" />
+ <method name="getSocketAddress()Ljava/net/SocketAddress;" />
+ <method name="setAddress(Ljava/net/InetAddress;)V" />
+ <method name="setData([B)V" />
+ <method name="setData([BII)V" />
+ <method name="setLength(I)V" />
+ <method name="setPort(I)V" />
+ <method name="setSocketAddress(Ljava/net/SocketAddress;)V" />
+ </class>
+ <class name="java/net/DatagramSocket" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Closeable" since="19" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(ILjava/net/InetAddress;)V" />
+ <method name="&lt;init>(Ljava/net/DatagramSocketImpl;)V" />
+ <method name="&lt;init>(Ljava/net/SocketAddress;)V" />
+ <method name="bind(Ljava/net/SocketAddress;)V" />
+ <method name="close()V" />
+ <method name="connect(Ljava/net/InetAddress;I)V" />
+ <method name="connect(Ljava/net/SocketAddress;)V" />
+ <method name="disconnect()V" />
+ <method name="getBroadcast()Z" />
+ <method name="getChannel()Ljava/nio/channels/DatagramChannel;" />
+ <method name="getInetAddress()Ljava/net/InetAddress;" />
+ <method name="getLocalAddress()Ljava/net/InetAddress;" />
+ <method name="getLocalPort()I" />
+ <method name="getLocalSocketAddress()Ljava/net/SocketAddress;" />
+ <method name="getPort()I" />
+ <method name="getReceiveBufferSize()I" />
+ <method name="getRemoteSocketAddress()Ljava/net/SocketAddress;" />
+ <method name="getReuseAddress()Z" />
+ <method name="getSendBufferSize()I" />
+ <method name="getSoTimeout()I" />
+ <method name="getTrafficClass()I" />
+ <method name="isBound()Z" />
+ <method name="isClosed()Z" />
+ <method name="isConnected()Z" />
+ <method name="receive(Ljava/net/DatagramPacket;)V" />
+ <method name="send(Ljava/net/DatagramPacket;)V" />
+ <method name="setBroadcast(Z)V" />
+ <method name="setDatagramSocketImplFactory(Ljava/net/DatagramSocketImplFactory;)V" />
+ <method name="setReceiveBufferSize(I)V" />
+ <method name="setReuseAddress(Z)V" />
+ <method name="setSendBufferSize(I)V" />
+ <method name="setSoTimeout(I)V" />
+ <method name="setTrafficClass(I)V" />
+ </class>
+ <class name="java/net/DatagramSocketImpl" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/net/SocketOptions" />
+ <method name="&lt;init>()V" />
+ <method name="bind(ILjava/net/InetAddress;)V" />
+ <method name="close()V" />
+ <method name="connect(Ljava/net/InetAddress;I)V" />
+ <method name="create()V" />
+ <method name="disconnect()V" />
+ <method name="getFileDescriptor()Ljava/io/FileDescriptor;" />
+ <method name="getLocalPort()I" />
+ <method name="getTTL()B" />
+ <method name="getTimeToLive()I" />
+ <method name="join(Ljava/net/InetAddress;)V" />
+ <method name="joinGroup(Ljava/net/SocketAddress;Ljava/net/NetworkInterface;)V" />
+ <method name="leave(Ljava/net/InetAddress;)V" />
+ <method name="leaveGroup(Ljava/net/SocketAddress;Ljava/net/NetworkInterface;)V" />
+ <method name="peek(Ljava/net/InetAddress;)I" />
+ <method name="peekData(Ljava/net/DatagramPacket;)I" />
+ <method name="receive(Ljava/net/DatagramPacket;)V" />
+ <method name="send(Ljava/net/DatagramPacket;)V" />
+ <method name="setTTL(B)V" />
+ <method name="setTimeToLive(I)V" />
+ <field name="fd" />
+ <field name="localPort" />
+ </class>
+ <class name="java/net/DatagramSocketImplFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="createDatagramSocketImpl()Ljava/net/DatagramSocketImpl;" />
+ </class>
+ <class name="java/net/FileNameMap" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getContentTypeFor(Ljava/lang/String;)Ljava/lang/String;" />
+ </class>
+ <class name="java/net/HttpCookie" since="9">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="domainMatches(Ljava/lang/String;Ljava/lang/String;)Z" />
+ <method name="getComment()Ljava/lang/String;" />
+ <method name="getCommentURL()Ljava/lang/String;" />
+ <method name="getDiscard()Z" />
+ <method name="getDomain()Ljava/lang/String;" />
+ <method name="getMaxAge()J" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getPath()Ljava/lang/String;" />
+ <method name="getPortlist()Ljava/lang/String;" />
+ <method name="getSecure()Z" />
+ <method name="getValue()Ljava/lang/String;" />
+ <method name="getVersion()I" />
+ <method name="hasExpired()Z" />
+ <method name="parse(Ljava/lang/String;)Ljava/util/List;" />
+ <method name="setComment(Ljava/lang/String;)V" />
+ <method name="setCommentURL(Ljava/lang/String;)V" />
+ <method name="setDiscard(Z)V" />
+ <method name="setDomain(Ljava/lang/String;)V" />
+ <method name="setMaxAge(J)V" />
+ <method name="setPath(Ljava/lang/String;)V" />
+ <method name="setPortlist(Ljava/lang/String;)V" />
+ <method name="setSecure(Z)V" />
+ <method name="setValue(Ljava/lang/String;)V" />
+ <method name="setVersion(I)V" />
+ </class>
+ <class name="java/net/HttpRetryException" since="1">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>(Ljava/lang/String;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;ILjava/lang/String;)V" />
+ <method name="getLocation()Ljava/lang/String;" />
+ <method name="getReason()Ljava/lang/String;" />
+ <method name="responseCode()I" />
+ </class>
+ <class name="java/net/HttpURLConnection" since="1">
+ <extends name="java/net/URLConnection" />
+ <method name="&lt;init>(Ljava/net/URL;)V" />
+ <method name="disconnect()V" />
+ <method name="getErrorStream()Ljava/io/InputStream;" />
+ <method name="getFollowRedirects()Z" />
+ <method name="getInstanceFollowRedirects()Z" />
+ <method name="getRequestMethod()Ljava/lang/String;" />
+ <method name="getResponseCode()I" />
+ <method name="getResponseMessage()Ljava/lang/String;" />
+ <method name="setChunkedStreamingMode(I)V" />
+ <method name="setFixedLengthStreamingMode(I)V" />
+ <method name="setFixedLengthStreamingMode(J)V" since="19" />
+ <method name="setFollowRedirects(Z)V" />
+ <method name="setInstanceFollowRedirects(Z)V" />
+ <method name="setRequestMethod(Ljava/lang/String;)V" />
+ <method name="usingProxy()Z" />
+ <field name="HTTP_ACCEPTED" />
+ <field name="HTTP_BAD_GATEWAY" />
+ <field name="HTTP_BAD_METHOD" />
+ <field name="HTTP_BAD_REQUEST" />
+ <field name="HTTP_CLIENT_TIMEOUT" />
+ <field name="HTTP_CONFLICT" />
+ <field name="HTTP_CREATED" />
+ <field name="HTTP_ENTITY_TOO_LARGE" />
+ <field name="HTTP_FORBIDDEN" />
+ <field name="HTTP_GATEWAY_TIMEOUT" />
+ <field name="HTTP_GONE" />
+ <field name="HTTP_INTERNAL_ERROR" />
+ <field name="HTTP_LENGTH_REQUIRED" />
+ <field name="HTTP_MOVED_PERM" />
+ <field name="HTTP_MOVED_TEMP" />
+ <field name="HTTP_MULT_CHOICE" />
+ <field name="HTTP_NOT_ACCEPTABLE" />
+ <field name="HTTP_NOT_AUTHORITATIVE" />
+ <field name="HTTP_NOT_FOUND" />
+ <field name="HTTP_NOT_IMPLEMENTED" />
+ <field name="HTTP_NOT_MODIFIED" />
+ <field name="HTTP_NO_CONTENT" />
+ <field name="HTTP_OK" />
+ <field name="HTTP_PARTIAL" />
+ <field name="HTTP_PAYMENT_REQUIRED" />
+ <field name="HTTP_PRECON_FAILED" />
+ <field name="HTTP_PROXY_AUTH" />
+ <field name="HTTP_REQ_TOO_LONG" />
+ <field name="HTTP_RESET" />
+ <field name="HTTP_SEE_OTHER" />
+ <field name="HTTP_SERVER_ERROR" />
+ <field name="HTTP_UNAUTHORIZED" />
+ <field name="HTTP_UNAVAILABLE" />
+ <field name="HTTP_UNSUPPORTED_TYPE" />
+ <field name="HTTP_USE_PROXY" />
+ <field name="HTTP_VERSION" />
+ <field name="chunkLength" />
+ <field name="fixedContentLength" />
+ <field name="fixedContentLengthLong" since="19" />
+ <field name="instanceFollowRedirects" />
+ <field name="method" />
+ <field name="responseCode" />
+ <field name="responseMessage" />
+ </class>
+ <class name="java/net/IDN" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="toASCII(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="toASCII(Ljava/lang/String;I)Ljava/lang/String;" />
+ <method name="toUnicode(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="toUnicode(Ljava/lang/String;I)Ljava/lang/String;" />
+ <field name="ALLOW_UNASSIGNED" />
+ <field name="USE_STD3_ASCII_RULES" />
+ </class>
+ <class name="java/net/Inet4Address" since="1">
+ <extends name="java/net/InetAddress" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/net/Inet6Address" since="1">
+ <extends name="java/net/InetAddress" />
+ <method name="&lt;init>()V" />
+ <method name="getByAddress(Ljava/lang/String;[BI)Ljava/net/Inet6Address;" />
+ <method name="getByAddress(Ljava/lang/String;[BLjava/net/NetworkInterface;)Ljava/net/Inet6Address;" />
+ <method name="getScopeId()I" />
+ <method name="getScopedInterface()Ljava/net/NetworkInterface;" />
+ <method name="isIPv4CompatibleAddress()Z" />
+ </class>
+ <class name="java/net/InetAddress" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>()V" />
+ <method name="getAddress()[B" />
+ <method name="getAllByName(Ljava/lang/String;)[Ljava/net/InetAddress;" />
+ <method name="getByAddress(Ljava/lang/String;[B)Ljava/net/InetAddress;" />
+ <method name="getByAddress([B)Ljava/net/InetAddress;" />
+ <method name="getByName(Ljava/lang/String;)Ljava/net/InetAddress;" />
+ <method name="getCanonicalHostName()Ljava/lang/String;" />
+ <method name="getHostAddress()Ljava/lang/String;" />
+ <method name="getHostName()Ljava/lang/String;" />
+ <method name="getLocalHost()Ljava/net/InetAddress;" />
+ <method name="getLoopbackAddress()Ljava/net/InetAddress;" since="19" />
+ <method name="isAnyLocalAddress()Z" />
+ <method name="isLinkLocalAddress()Z" />
+ <method name="isLoopbackAddress()Z" />
+ <method name="isMCGlobal()Z" />
+ <method name="isMCLinkLocal()Z" />
+ <method name="isMCNodeLocal()Z" />
+ <method name="isMCOrgLocal()Z" />
+ <method name="isMCSiteLocal()Z" />
+ <method name="isMulticastAddress()Z" />
+ <method name="isReachable(I)Z" />
+ <method name="isReachable(Ljava/net/NetworkInterface;II)Z" />
+ <method name="isSiteLocalAddress()Z" />
+ </class>
+ <class name="java/net/InetSocketAddress" since="1">
+ <extends name="java/net/SocketAddress" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Ljava/lang/String;I)V" />
+ <method name="&lt;init>(Ljava/net/InetAddress;I)V" />
+ <method name="createUnresolved(Ljava/lang/String;I)Ljava/net/InetSocketAddress;" />
+ <method name="getAddress()Ljava/net/InetAddress;" />
+ <method name="getHostName()Ljava/lang/String;" />
+ <method name="getHostString()Ljava/lang/String;" since="19" />
+ <method name="getPort()I" />
+ <method name="isUnresolved()Z" />
+ </class>
+ <class name="java/net/InterfaceAddress" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getAddress()Ljava/net/InetAddress;" />
+ <method name="getBroadcast()Ljava/net/InetAddress;" />
+ <method name="getNetworkPrefixLength()S" />
+ </class>
+ <class name="java/net/JarURLConnection" since="1">
+ <extends name="java/net/URLConnection" />
+ <method name="&lt;init>(Ljava/net/URL;)V" />
+ <method name="getAttributes()Ljava/util/jar/Attributes;" />
+ <method name="getCertificates()[Ljava/security/cert/Certificate;" />
+ <method name="getEntryName()Ljava/lang/String;" />
+ <method name="getJarEntry()Ljava/util/jar/JarEntry;" />
+ <method name="getJarFile()Ljava/util/jar/JarFile;" />
+ <method name="getJarFileURL()Ljava/net/URL;" />
+ <method name="getMainAttributes()Ljava/util/jar/Attributes;" />
+ <method name="getManifest()Ljava/util/jar/Manifest;" />
+ <field name="jarFileURLConnection" />
+ </class>
+ <class name="java/net/MalformedURLException" since="1">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/net/MulticastSocket" since="1">
+ <extends name="java/net/DatagramSocket" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Ljava/net/SocketAddress;)V" />
+ <method name="getInterface()Ljava/net/InetAddress;" />
+ <method name="getLoopbackMode()Z" />
+ <method name="getNetworkInterface()Ljava/net/NetworkInterface;" />
+ <method name="getTTL()B" />
+ <method name="getTimeToLive()I" />
+ <method name="joinGroup(Ljava/net/InetAddress;)V" />
+ <method name="joinGroup(Ljava/net/SocketAddress;Ljava/net/NetworkInterface;)V" />
+ <method name="leaveGroup(Ljava/net/InetAddress;)V" />
+ <method name="leaveGroup(Ljava/net/SocketAddress;Ljava/net/NetworkInterface;)V" />
+ <method name="send(Ljava/net/DatagramPacket;B)V" />
+ <method name="setInterface(Ljava/net/InetAddress;)V" />
+ <method name="setLoopbackMode(Z)V" />
+ <method name="setNetworkInterface(Ljava/net/NetworkInterface;)V" />
+ <method name="setTTL(B)V" />
+ <method name="setTimeToLive(I)V" />
+ </class>
+ <class name="java/net/NetPermission" since="1">
+ <extends name="java/security/BasicPermission" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="java/net/NetworkInterface" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getByIndex(I)Ljava/net/NetworkInterface;" since="19" />
+ <method name="getByInetAddress(Ljava/net/InetAddress;)Ljava/net/NetworkInterface;" />
+ <method name="getByName(Ljava/lang/String;)Ljava/net/NetworkInterface;" />
+ <method name="getDisplayName()Ljava/lang/String;" />
+ <method name="getHardwareAddress()[B" since="9" />
+ <method name="getIndex()I" since="19" />
+ <method name="getInetAddresses()Ljava/util/Enumeration;" />
+ <method name="getInterfaceAddresses()Ljava/util/List;" since="9" />
+ <method name="getMTU()I" since="9" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getNetworkInterfaces()Ljava/util/Enumeration;" />
+ <method name="getParent()Ljava/net/NetworkInterface;" since="9" />
+ <method name="getSubInterfaces()Ljava/util/Enumeration;" since="9" />
+ <method name="isLoopback()Z" since="9" />
+ <method name="isPointToPoint()Z" since="9" />
+ <method name="isUp()Z" since="9" />
+ <method name="isVirtual()Z" since="9" />
+ <method name="supportsMulticast()Z" since="9" />
+ </class>
+ <class name="java/net/NoRouteToHostException" since="1">
+ <extends name="java/net/SocketException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/net/PasswordAuthentication" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;[C)V" />
+ <method name="getPassword()[C" />
+ <method name="getUserName()Ljava/lang/String;" />
+ </class>
+ <class name="java/net/PortUnreachableException" since="1">
+ <extends name="java/net/SocketException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/net/ProtocolException" since="1">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/net/Proxy" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/net/Proxy$Type;Ljava/net/SocketAddress;)V" />
+ <method name="address()Ljava/net/SocketAddress;" />
+ <method name="type()Ljava/net/Proxy$Type;" />
+ <field name="NO_PROXY" />
+ </class>
+ <class name="java/net/Proxy$Type" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Ljava/net/Proxy$Type;" />
+ <method name="values()[Ljava/net/Proxy$Type;" />
+ <field name="DIRECT" />
+ <field name="HTTP" />
+ <field name="SOCKS" />
+ </class>
+ <class name="java/net/ProxySelector" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="connectFailed(Ljava/net/URI;Ljava/net/SocketAddress;Ljava/io/IOException;)V" />
+ <method name="getDefault()Ljava/net/ProxySelector;" />
+ <method name="select(Ljava/net/URI;)Ljava/util/List;" />
+ <method name="setDefault(Ljava/net/ProxySelector;)V" />
+ </class>
+ <class name="java/net/ResponseCache" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="get(Ljava/net/URI;Ljava/lang/String;Ljava/util/Map;)Ljava/net/CacheResponse;" />
+ <method name="getDefault()Ljava/net/ResponseCache;" />
+ <method name="put(Ljava/net/URI;Ljava/net/URLConnection;)Ljava/net/CacheRequest;" />
+ <method name="setDefault(Ljava/net/ResponseCache;)V" />
+ </class>
+ <class name="java/net/SecureCacheResponse" since="1">
+ <extends name="java/net/CacheResponse" />
+ <method name="&lt;init>()V" />
+ <method name="getCipherSuite()Ljava/lang/String;" />
+ <method name="getLocalCertificateChain()Ljava/util/List;" />
+ <method name="getLocalPrincipal()Ljava/security/Principal;" />
+ <method name="getPeerPrincipal()Ljava/security/Principal;" />
+ <method name="getServerCertificateChain()Ljava/util/List;" />
+ </class>
+ <class name="java/net/ServerSocket" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Closeable" since="19" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(II)V" />
+ <method name="&lt;init>(IILjava/net/InetAddress;)V" />
+ <method name="&lt;init>(Ljava/net/SocketImpl;)V" />
+ <method name="accept()Ljava/net/Socket;" />
+ <method name="bind(Ljava/net/SocketAddress;)V" />
+ <method name="bind(Ljava/net/SocketAddress;I)V" />
+ <method name="close()V" />
+ <method name="getChannel()Ljava/nio/channels/ServerSocketChannel;" />
+ <method name="getInetAddress()Ljava/net/InetAddress;" />
+ <method name="getLocalPort()I" />
+ <method name="getLocalSocketAddress()Ljava/net/SocketAddress;" />
+ <method name="getReceiveBufferSize()I" />
+ <method name="getReuseAddress()Z" />
+ <method name="getSoTimeout()I" />
+ <method name="implAccept(Ljava/net/Socket;)V" />
+ <method name="isBound()Z" />
+ <method name="isClosed()Z" />
+ <method name="setPerformancePreferences(III)V" />
+ <method name="setReceiveBufferSize(I)V" />
+ <method name="setReuseAddress(Z)V" />
+ <method name="setSoTimeout(I)V" />
+ <method name="setSocketFactory(Ljava/net/SocketImplFactory;)V" />
+ </class>
+ <class name="java/net/Socket" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Closeable" since="19" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;ILjava/net/InetAddress;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;IZ)V" />
+ <method name="&lt;init>(Ljava/net/InetAddress;I)V" />
+ <method name="&lt;init>(Ljava/net/InetAddress;ILjava/net/InetAddress;I)V" />
+ <method name="&lt;init>(Ljava/net/InetAddress;IZ)V" />
+ <method name="&lt;init>(Ljava/net/Proxy;)V" />
+ <method name="&lt;init>(Ljava/net/SocketImpl;)V" />
+ <method name="bind(Ljava/net/SocketAddress;)V" />
+ <method name="close()V" />
+ <method name="connect(Ljava/net/SocketAddress;)V" />
+ <method name="connect(Ljava/net/SocketAddress;I)V" />
+ <method name="getChannel()Ljava/nio/channels/SocketChannel;" />
+ <method name="getInetAddress()Ljava/net/InetAddress;" />
+ <method name="getInputStream()Ljava/io/InputStream;" />
+ <method name="getKeepAlive()Z" />
+ <method name="getLocalAddress()Ljava/net/InetAddress;" />
+ <method name="getLocalPort()I" />
+ <method name="getLocalSocketAddress()Ljava/net/SocketAddress;" />
+ <method name="getOOBInline()Z" />
+ <method name="getOutputStream()Ljava/io/OutputStream;" />
+ <method name="getPort()I" />
+ <method name="getReceiveBufferSize()I" />
+ <method name="getRemoteSocketAddress()Ljava/net/SocketAddress;" />
+ <method name="getReuseAddress()Z" />
+ <method name="getSendBufferSize()I" />
+ <method name="getSoLinger()I" />
+ <method name="getSoTimeout()I" />
+ <method name="getTcpNoDelay()Z" />
+ <method name="getTrafficClass()I" />
+ <method name="isBound()Z" />
+ <method name="isClosed()Z" />
+ <method name="isConnected()Z" />
+ <method name="isInputShutdown()Z" />
+ <method name="isOutputShutdown()Z" />
+ <method name="sendUrgentData(I)V" />
+ <method name="setKeepAlive(Z)V" />
+ <method name="setOOBInline(Z)V" />
+ <method name="setPerformancePreferences(III)V" />
+ <method name="setReceiveBufferSize(I)V" />
+ <method name="setReuseAddress(Z)V" />
+ <method name="setSendBufferSize(I)V" />
+ <method name="setSoLinger(ZI)V" />
+ <method name="setSoTimeout(I)V" />
+ <method name="setSocketImplFactory(Ljava/net/SocketImplFactory;)V" />
+ <method name="setTcpNoDelay(Z)V" />
+ <method name="setTrafficClass(I)V" />
+ <method name="shutdownInput()V" />
+ <method name="shutdownOutput()V" />
+ </class>
+ <class name="java/net/SocketAddress" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/net/SocketException" since="1">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/net/SocketImpl" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/net/SocketOptions" />
+ <method name="&lt;init>()V" />
+ <method name="accept(Ljava/net/SocketImpl;)V" />
+ <method name="available()I" />
+ <method name="bind(Ljava/net/InetAddress;I)V" />
+ <method name="close()V" />
+ <method name="connect(Ljava/lang/String;I)V" />
+ <method name="connect(Ljava/net/InetAddress;I)V" />
+ <method name="connect(Ljava/net/SocketAddress;I)V" />
+ <method name="create(Z)V" />
+ <method name="getFileDescriptor()Ljava/io/FileDescriptor;" />
+ <method name="getInetAddress()Ljava/net/InetAddress;" />
+ <method name="getInputStream()Ljava/io/InputStream;" />
+ <method name="getLocalPort()I" />
+ <method name="getOutputStream()Ljava/io/OutputStream;" />
+ <method name="getPort()I" />
+ <method name="listen(I)V" />
+ <method name="sendUrgentData(I)V" />
+ <method name="setPerformancePreferences(III)V" />
+ <method name="shutdownInput()V" />
+ <method name="shutdownOutput()V" />
+ <method name="supportsUrgentData()Z" />
+ <field name="address" />
+ <field name="fd" />
+ <field name="localport" />
+ <field name="port" />
+ </class>
+ <class name="java/net/SocketImplFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="createSocketImpl()Ljava/net/SocketImpl;" />
+ </class>
+ <class name="java/net/SocketOptions" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getOption(I)Ljava/lang/Object;" />
+ <method name="setOption(ILjava/lang/Object;)V" />
+ <field name="IP_MULTICAST_IF" />
+ <field name="IP_MULTICAST_IF2" />
+ <field name="IP_MULTICAST_LOOP" />
+ <field name="IP_TOS" />
+ <field name="SO_BINDADDR" />
+ <field name="SO_BROADCAST" />
+ <field name="SO_KEEPALIVE" />
+ <field name="SO_LINGER" />
+ <field name="SO_OOBINLINE" />
+ <field name="SO_RCVBUF" />
+ <field name="SO_REUSEADDR" />
+ <field name="SO_SNDBUF" />
+ <field name="SO_TIMEOUT" />
+ <field name="TCP_NODELAY" />
+ </class>
+ <class name="java/net/SocketPermission" since="1">
+ <extends name="java/security/Permission" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="java/net/SocketTimeoutException" since="1">
+ <extends name="java/io/InterruptedIOException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/net/URI" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="compareTo(Ljava/net/URI;)I" />
+ <method name="create(Ljava/lang/String;)Ljava/net/URI;" />
+ <method name="getAuthority()Ljava/lang/String;" />
+ <method name="getFragment()Ljava/lang/String;" />
+ <method name="getHost()Ljava/lang/String;" />
+ <method name="getPath()Ljava/lang/String;" />
+ <method name="getPort()I" />
+ <method name="getQuery()Ljava/lang/String;" />
+ <method name="getRawAuthority()Ljava/lang/String;" />
+ <method name="getRawFragment()Ljava/lang/String;" />
+ <method name="getRawPath()Ljava/lang/String;" />
+ <method name="getRawQuery()Ljava/lang/String;" />
+ <method name="getRawSchemeSpecificPart()Ljava/lang/String;" />
+ <method name="getRawUserInfo()Ljava/lang/String;" />
+ <method name="getScheme()Ljava/lang/String;" />
+ <method name="getSchemeSpecificPart()Ljava/lang/String;" />
+ <method name="getUserInfo()Ljava/lang/String;" />
+ <method name="isAbsolute()Z" />
+ <method name="isOpaque()Z" />
+ <method name="normalize()Ljava/net/URI;" />
+ <method name="parseServerAuthority()Ljava/net/URI;" />
+ <method name="relativize(Ljava/net/URI;)Ljava/net/URI;" />
+ <method name="resolve(Ljava/lang/String;)Ljava/net/URI;" />
+ <method name="resolve(Ljava/net/URI;)Ljava/net/URI;" />
+ <method name="toASCIIString()Ljava/lang/String;" />
+ <method name="toURL()Ljava/net/URL;" />
+ </class>
+ <class name="java/net/URISyntaxException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V" />
+ <method name="getIndex()I" />
+ <method name="getInput()Ljava/lang/String;" />
+ <method name="getReason()Ljava/lang/String;" />
+ </class>
+ <class name="java/net/URL" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/net/URLStreamHandler;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/net/URL;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/net/URL;Ljava/lang/String;Ljava/net/URLStreamHandler;)V" />
+ <method name="getAuthority()Ljava/lang/String;" />
+ <method name="getContent()Ljava/lang/Object;" />
+ <method name="getContent([Ljava/lang/Class;)Ljava/lang/Object;" />
+ <method name="getDefaultPort()I" />
+ <method name="getFile()Ljava/lang/String;" />
+ <method name="getHost()Ljava/lang/String;" />
+ <method name="getPath()Ljava/lang/String;" />
+ <method name="getPort()I" />
+ <method name="getProtocol()Ljava/lang/String;" />
+ <method name="getQuery()Ljava/lang/String;" />
+ <method name="getRef()Ljava/lang/String;" />
+ <method name="getUserInfo()Ljava/lang/String;" />
+ <method name="openConnection()Ljava/net/URLConnection;" />
+ <method name="openConnection(Ljava/net/Proxy;)Ljava/net/URLConnection;" />
+ <method name="openStream()Ljava/io/InputStream;" />
+ <method name="sameFile(Ljava/net/URL;)Z" />
+ <method name="set(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V" />
+ <method name="set(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="setURLStreamHandlerFactory(Ljava/net/URLStreamHandlerFactory;)V" />
+ <method name="toExternalForm()Ljava/lang/String;" />
+ <method name="toURI()Ljava/net/URI;" />
+ </class>
+ <class name="java/net/URLClassLoader" since="1">
+ <extends name="java/security/SecureClassLoader" />
+ <method name="&lt;init>([Ljava/net/URL;)V" />
+ <method name="&lt;init>([Ljava/net/URL;Ljava/lang/ClassLoader;)V" />
+ <method name="&lt;init>([Ljava/net/URL;Ljava/lang/ClassLoader;Ljava/net/URLStreamHandlerFactory;)V" />
+ <method name="addURL(Ljava/net/URL;)V" />
+ <method name="definePackage(Ljava/lang/String;Ljava/util/jar/Manifest;Ljava/net/URL;)Ljava/lang/Package;" />
+ <method name="getURLs()[Ljava/net/URL;" />
+ <method name="newInstance([Ljava/net/URL;)Ljava/net/URLClassLoader;" />
+ <method name="newInstance([Ljava/net/URL;Ljava/lang/ClassLoader;)Ljava/net/URLClassLoader;" />
+ </class>
+ <class name="java/net/URLConnection" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/net/URL;)V" />
+ <method name="addRequestProperty(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="connect()V" />
+ <method name="getAllowUserInteraction()Z" />
+ <method name="getConnectTimeout()I" />
+ <method name="getContent()Ljava/lang/Object;" />
+ <method name="getContent([Ljava/lang/Class;)Ljava/lang/Object;" />
+ <method name="getContentEncoding()Ljava/lang/String;" />
+ <method name="getContentLength()I" />
+ <method name="getContentType()Ljava/lang/String;" />
+ <method name="getDate()J" />
+ <method name="getDefaultAllowUserInteraction()Z" />
+ <method name="getDefaultRequestProperty(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getDefaultUseCaches()Z" />
+ <method name="getDoInput()Z" />
+ <method name="getDoOutput()Z" />
+ <method name="getExpiration()J" />
+ <method name="getFileNameMap()Ljava/net/FileNameMap;" />
+ <method name="getHeaderField(I)Ljava/lang/String;" />
+ <method name="getHeaderField(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getHeaderFieldDate(Ljava/lang/String;J)J" />
+ <method name="getHeaderFieldInt(Ljava/lang/String;I)I" />
+ <method name="getHeaderFieldKey(I)Ljava/lang/String;" />
+ <method name="getHeaderFields()Ljava/util/Map;" />
+ <method name="getIfModifiedSince()J" />
+ <method name="getInputStream()Ljava/io/InputStream;" />
+ <method name="getLastModified()J" />
+ <method name="getOutputStream()Ljava/io/OutputStream;" />
+ <method name="getPermission()Ljava/security/Permission;" />
+ <method name="getReadTimeout()I" />
+ <method name="getRequestProperties()Ljava/util/Map;" />
+ <method name="getRequestProperty(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getURL()Ljava/net/URL;" />
+ <method name="getUseCaches()Z" />
+ <method name="guessContentTypeFromName(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="guessContentTypeFromStream(Ljava/io/InputStream;)Ljava/lang/String;" />
+ <method name="setAllowUserInteraction(Z)V" />
+ <method name="setConnectTimeout(I)V" />
+ <method name="setContentHandlerFactory(Ljava/net/ContentHandlerFactory;)V" />
+ <method name="setDefaultAllowUserInteraction(Z)V" />
+ <method name="setDefaultRequestProperty(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="setDefaultUseCaches(Z)V" />
+ <method name="setDoInput(Z)V" />
+ <method name="setDoOutput(Z)V" />
+ <method name="setFileNameMap(Ljava/net/FileNameMap;)V" />
+ <method name="setIfModifiedSince(J)V" />
+ <method name="setReadTimeout(I)V" />
+ <method name="setRequestProperty(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="setUseCaches(Z)V" />
+ <field name="allowUserInteraction" />
+ <field name="connected" />
+ <field name="doInput" />
+ <field name="doOutput" />
+ <field name="ifModifiedSince" />
+ <field name="url" />
+ <field name="useCaches" />
+ </class>
+ <class name="java/net/URLDecoder" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="decode(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="decode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ </class>
+ <class name="java/net/URLEncoder" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="encode(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="encode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ </class>
+ <class name="java/net/URLStreamHandler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="equals(Ljava/net/URL;Ljava/net/URL;)Z" />
+ <method name="getDefaultPort()I" />
+ <method name="getHostAddress(Ljava/net/URL;)Ljava/net/InetAddress;" />
+ <method name="hashCode(Ljava/net/URL;)I" />
+ <method name="hostsEqual(Ljava/net/URL;Ljava/net/URL;)Z" />
+ <method name="openConnection(Ljava/net/URL;)Ljava/net/URLConnection;" />
+ <method name="openConnection(Ljava/net/URL;Ljava/net/Proxy;)Ljava/net/URLConnection;" />
+ <method name="parseURL(Ljava/net/URL;Ljava/lang/String;II)V" />
+ <method name="sameFile(Ljava/net/URL;Ljava/net/URL;)Z" />
+ <method name="setURL(Ljava/net/URL;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V" />
+ <method name="setURL(Ljava/net/URL;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="toExternalForm(Ljava/net/URL;)Ljava/lang/String;" />
+ </class>
+ <class name="java/net/URLStreamHandlerFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="createURLStreamHandler(Ljava/lang/String;)Ljava/net/URLStreamHandler;" />
+ </class>
+ <class name="java/net/UnknownHostException" since="1">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/net/UnknownServiceException" since="1">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/nio/Buffer" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="array()Ljava/lang/Object;" since="9" />
+ <method name="arrayOffset()I" since="9" />
+ <method name="capacity()I" />
+ <method name="clear()Ljava/nio/Buffer;" />
+ <method name="flip()Ljava/nio/Buffer;" />
+ <method name="hasArray()Z" since="9" />
+ <method name="hasRemaining()Z" />
+ <method name="isDirect()Z" since="9" />
+ <method name="isReadOnly()Z" />
+ <method name="limit()I" />
+ <method name="limit(I)Ljava/nio/Buffer;" />
+ <method name="mark()Ljava/nio/Buffer;" />
+ <method name="position()I" />
+ <method name="position(I)Ljava/nio/Buffer;" />
+ <method name="remaining()I" />
+ <method name="reset()Ljava/nio/Buffer;" />
+ <method name="rewind()Ljava/nio/Buffer;" />
+ </class>
+ <class name="java/nio/BufferOverflowException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/nio/BufferUnderflowException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/nio/ByteBuffer" since="1">
+ <extends name="java/nio/Buffer" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>()V" />
+ <method name="allocate(I)Ljava/nio/ByteBuffer;" />
+ <method name="allocateDirect(I)Ljava/nio/ByteBuffer;" />
+ <method name="array()[B" />
+ <method name="arrayOffset()I" />
+ <method name="asCharBuffer()Ljava/nio/CharBuffer;" />
+ <method name="asDoubleBuffer()Ljava/nio/DoubleBuffer;" />
+ <method name="asFloatBuffer()Ljava/nio/FloatBuffer;" />
+ <method name="asIntBuffer()Ljava/nio/IntBuffer;" />
+ <method name="asLongBuffer()Ljava/nio/LongBuffer;" />
+ <method name="asReadOnlyBuffer()Ljava/nio/ByteBuffer;" />
+ <method name="asShortBuffer()Ljava/nio/ShortBuffer;" />
+ <method name="compact()Ljava/nio/ByteBuffer;" />
+ <method name="compareTo(Ljava/nio/ByteBuffer;)I" />
+ <method name="duplicate()Ljava/nio/ByteBuffer;" />
+ <method name="get()B" />
+ <method name="get(I)B" />
+ <method name="get([B)Ljava/nio/ByteBuffer;" />
+ <method name="get([BII)Ljava/nio/ByteBuffer;" />
+ <method name="getChar()C" />
+ <method name="getChar(I)C" />
+ <method name="getDouble()D" />
+ <method name="getDouble(I)D" />
+ <method name="getFloat()F" />
+ <method name="getFloat(I)F" />
+ <method name="getInt()I" />
+ <method name="getInt(I)I" />
+ <method name="getLong()J" />
+ <method name="getLong(I)J" />
+ <method name="getShort()S" />
+ <method name="getShort(I)S" />
+ <method name="hasArray()Z" />
+ <method name="isDirect()Z" />
+ <method name="order()Ljava/nio/ByteOrder;" />
+ <method name="order(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;" />
+ <method name="put(B)Ljava/nio/ByteBuffer;" />
+ <method name="put(IB)Ljava/nio/ByteBuffer;" />
+ <method name="put(Ljava/nio/ByteBuffer;)Ljava/nio/ByteBuffer;" />
+ <method name="put([B)Ljava/nio/ByteBuffer;" />
+ <method name="put([BII)Ljava/nio/ByteBuffer;" />
+ <method name="putChar(C)Ljava/nio/ByteBuffer;" />
+ <method name="putChar(IC)Ljava/nio/ByteBuffer;" />
+ <method name="putDouble(D)Ljava/nio/ByteBuffer;" />
+ <method name="putDouble(ID)Ljava/nio/ByteBuffer;" />
+ <method name="putFloat(F)Ljava/nio/ByteBuffer;" />
+ <method name="putFloat(IF)Ljava/nio/ByteBuffer;" />
+ <method name="putInt(I)Ljava/nio/ByteBuffer;" />
+ <method name="putInt(II)Ljava/nio/ByteBuffer;" />
+ <method name="putLong(IJ)Ljava/nio/ByteBuffer;" />
+ <method name="putLong(J)Ljava/nio/ByteBuffer;" />
+ <method name="putShort(IS)Ljava/nio/ByteBuffer;" />
+ <method name="putShort(S)Ljava/nio/ByteBuffer;" />
+ <method name="slice()Ljava/nio/ByteBuffer;" />
+ <method name="wrap([B)Ljava/nio/ByteBuffer;" />
+ <method name="wrap([BII)Ljava/nio/ByteBuffer;" />
+ </class>
+ <class name="java/nio/ByteOrder" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="nativeOrder()Ljava/nio/ByteOrder;" />
+ <field name="BIG_ENDIAN" />
+ <field name="LITTLE_ENDIAN" />
+ </class>
+ <class name="java/nio/CharBuffer" since="1">
+ <extends name="java/nio/Buffer" />
+ <implements name="java/lang/Appendable" />
+ <implements name="java/lang/CharSequence" />
+ <implements name="java/lang/Comparable" />
+ <implements name="java/lang/Readable" />
+ <method name="&lt;init>()V" />
+ <method name="allocate(I)Ljava/nio/CharBuffer;" />
+ <method name="append(C)Ljava/nio/CharBuffer;" />
+ <method name="append(Ljava/lang/CharSequence;)Ljava/nio/CharBuffer;" />
+ <method name="append(Ljava/lang/CharSequence;II)Ljava/nio/CharBuffer;" />
+ <method name="array()[C" />
+ <method name="arrayOffset()I" />
+ <method name="asReadOnlyBuffer()Ljava/nio/CharBuffer;" />
+ <method name="compact()Ljava/nio/CharBuffer;" />
+ <method name="compareTo(Ljava/nio/CharBuffer;)I" />
+ <method name="duplicate()Ljava/nio/CharBuffer;" />
+ <method name="get()C" />
+ <method name="get(I)C" />
+ <method name="get([C)Ljava/nio/CharBuffer;" />
+ <method name="get([CII)Ljava/nio/CharBuffer;" />
+ <method name="hasArray()Z" />
+ <method name="isDirect()Z" />
+ <method name="order()Ljava/nio/ByteOrder;" />
+ <method name="put(C)Ljava/nio/CharBuffer;" />
+ <method name="put(IC)Ljava/nio/CharBuffer;" />
+ <method name="put(Ljava/lang/String;)Ljava/nio/CharBuffer;" />
+ <method name="put(Ljava/lang/String;II)Ljava/nio/CharBuffer;" />
+ <method name="put(Ljava/nio/CharBuffer;)Ljava/nio/CharBuffer;" />
+ <method name="put([C)Ljava/nio/CharBuffer;" />
+ <method name="put([CII)Ljava/nio/CharBuffer;" />
+ <method name="slice()Ljava/nio/CharBuffer;" />
+ <method name="subSequence(II)Ljava/nio/CharBuffer;" since="19" />
+ <method name="wrap(Ljava/lang/CharSequence;)Ljava/nio/CharBuffer;" />
+ <method name="wrap(Ljava/lang/CharSequence;II)Ljava/nio/CharBuffer;" />
+ <method name="wrap([C)Ljava/nio/CharBuffer;" />
+ <method name="wrap([CII)Ljava/nio/CharBuffer;" />
+ </class>
+ <class name="java/nio/DoubleBuffer" since="1">
+ <extends name="java/nio/Buffer" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>()V" />
+ <method name="allocate(I)Ljava/nio/DoubleBuffer;" />
+ <method name="array()[D" />
+ <method name="arrayOffset()I" />
+ <method name="asReadOnlyBuffer()Ljava/nio/DoubleBuffer;" />
+ <method name="compact()Ljava/nio/DoubleBuffer;" />
+ <method name="compareTo(Ljava/nio/DoubleBuffer;)I" />
+ <method name="duplicate()Ljava/nio/DoubleBuffer;" />
+ <method name="get()D" />
+ <method name="get(I)D" />
+ <method name="get([D)Ljava/nio/DoubleBuffer;" />
+ <method name="get([DII)Ljava/nio/DoubleBuffer;" />
+ <method name="hasArray()Z" />
+ <method name="isDirect()Z" />
+ <method name="order()Ljava/nio/ByteOrder;" />
+ <method name="put(D)Ljava/nio/DoubleBuffer;" />
+ <method name="put(ID)Ljava/nio/DoubleBuffer;" />
+ <method name="put(Ljava/nio/DoubleBuffer;)Ljava/nio/DoubleBuffer;" />
+ <method name="put([D)Ljava/nio/DoubleBuffer;" />
+ <method name="put([DII)Ljava/nio/DoubleBuffer;" />
+ <method name="slice()Ljava/nio/DoubleBuffer;" />
+ <method name="wrap([D)Ljava/nio/DoubleBuffer;" />
+ <method name="wrap([DII)Ljava/nio/DoubleBuffer;" />
+ </class>
+ <class name="java/nio/FloatBuffer" since="1">
+ <extends name="java/nio/Buffer" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>()V" />
+ <method name="allocate(I)Ljava/nio/FloatBuffer;" />
+ <method name="array()[F" />
+ <method name="arrayOffset()I" />
+ <method name="asReadOnlyBuffer()Ljava/nio/FloatBuffer;" />
+ <method name="compact()Ljava/nio/FloatBuffer;" />
+ <method name="compareTo(Ljava/nio/FloatBuffer;)I" />
+ <method name="duplicate()Ljava/nio/FloatBuffer;" />
+ <method name="get()F" />
+ <method name="get(I)F" />
+ <method name="get([F)Ljava/nio/FloatBuffer;" />
+ <method name="get([FII)Ljava/nio/FloatBuffer;" />
+ <method name="hasArray()Z" />
+ <method name="isDirect()Z" />
+ <method name="order()Ljava/nio/ByteOrder;" />
+ <method name="put(F)Ljava/nio/FloatBuffer;" />
+ <method name="put(IF)Ljava/nio/FloatBuffer;" />
+ <method name="put(Ljava/nio/FloatBuffer;)Ljava/nio/FloatBuffer;" />
+ <method name="put([F)Ljava/nio/FloatBuffer;" />
+ <method name="put([FII)Ljava/nio/FloatBuffer;" />
+ <method name="slice()Ljava/nio/FloatBuffer;" />
+ <method name="wrap([F)Ljava/nio/FloatBuffer;" />
+ <method name="wrap([FII)Ljava/nio/FloatBuffer;" />
+ </class>
+ <class name="java/nio/IntBuffer" since="1">
+ <extends name="java/nio/Buffer" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>()V" />
+ <method name="allocate(I)Ljava/nio/IntBuffer;" />
+ <method name="array()[I" />
+ <method name="arrayOffset()I" />
+ <method name="asReadOnlyBuffer()Ljava/nio/IntBuffer;" />
+ <method name="compact()Ljava/nio/IntBuffer;" />
+ <method name="compareTo(Ljava/nio/IntBuffer;)I" />
+ <method name="duplicate()Ljava/nio/IntBuffer;" />
+ <method name="get()I" />
+ <method name="get(I)I" />
+ <method name="get([I)Ljava/nio/IntBuffer;" />
+ <method name="get([III)Ljava/nio/IntBuffer;" />
+ <method name="hasArray()Z" />
+ <method name="isDirect()Z" />
+ <method name="order()Ljava/nio/ByteOrder;" />
+ <method name="put(I)Ljava/nio/IntBuffer;" />
+ <method name="put(II)Ljava/nio/IntBuffer;" />
+ <method name="put(Ljava/nio/IntBuffer;)Ljava/nio/IntBuffer;" />
+ <method name="put([I)Ljava/nio/IntBuffer;" />
+ <method name="put([III)Ljava/nio/IntBuffer;" />
+ <method name="slice()Ljava/nio/IntBuffer;" />
+ <method name="wrap([I)Ljava/nio/IntBuffer;" />
+ <method name="wrap([III)Ljava/nio/IntBuffer;" />
+ </class>
+ <class name="java/nio/InvalidMarkException" since="1">
+ <extends name="java/lang/IllegalStateException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/nio/LongBuffer" since="1">
+ <extends name="java/nio/Buffer" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>()V" />
+ <method name="allocate(I)Ljava/nio/LongBuffer;" />
+ <method name="array()[J" />
+ <method name="arrayOffset()I" />
+ <method name="asReadOnlyBuffer()Ljava/nio/LongBuffer;" />
+ <method name="compact()Ljava/nio/LongBuffer;" />
+ <method name="compareTo(Ljava/nio/LongBuffer;)I" />
+ <method name="duplicate()Ljava/nio/LongBuffer;" />
+ <method name="get()J" />
+ <method name="get(I)J" />
+ <method name="get([J)Ljava/nio/LongBuffer;" />
+ <method name="get([JII)Ljava/nio/LongBuffer;" />
+ <method name="hasArray()Z" />
+ <method name="isDirect()Z" />
+ <method name="order()Ljava/nio/ByteOrder;" />
+ <method name="put(IJ)Ljava/nio/LongBuffer;" />
+ <method name="put(J)Ljava/nio/LongBuffer;" />
+ <method name="put(Ljava/nio/LongBuffer;)Ljava/nio/LongBuffer;" />
+ <method name="put([J)Ljava/nio/LongBuffer;" />
+ <method name="put([JII)Ljava/nio/LongBuffer;" />
+ <method name="slice()Ljava/nio/LongBuffer;" />
+ <method name="wrap([J)Ljava/nio/LongBuffer;" />
+ <method name="wrap([JII)Ljava/nio/LongBuffer;" />
+ </class>
+ <class name="java/nio/MappedByteBuffer" since="1">
+ <extends name="java/nio/ByteBuffer" />
+ <method name="&lt;init>()V" />
+ <method name="force()Ljava/nio/MappedByteBuffer;" />
+ <method name="isLoaded()Z" />
+ <method name="load()Ljava/nio/MappedByteBuffer;" />
+ </class>
+ <class name="java/nio/ReadOnlyBufferException" since="1">
+ <extends name="java/lang/UnsupportedOperationException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/nio/ShortBuffer" since="1">
+ <extends name="java/nio/Buffer" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>()V" />
+ <method name="allocate(I)Ljava/nio/ShortBuffer;" />
+ <method name="array()[S" />
+ <method name="arrayOffset()I" />
+ <method name="asReadOnlyBuffer()Ljava/nio/ShortBuffer;" />
+ <method name="compact()Ljava/nio/ShortBuffer;" />
+ <method name="compareTo(Ljava/nio/ShortBuffer;)I" />
+ <method name="duplicate()Ljava/nio/ShortBuffer;" />
+ <method name="get()S" />
+ <method name="get(I)S" />
+ <method name="get([S)Ljava/nio/ShortBuffer;" />
+ <method name="get([SII)Ljava/nio/ShortBuffer;" />
+ <method name="hasArray()Z" />
+ <method name="isDirect()Z" />
+ <method name="order()Ljava/nio/ByteOrder;" />
+ <method name="put(IS)Ljava/nio/ShortBuffer;" />
+ <method name="put(Ljava/nio/ShortBuffer;)Ljava/nio/ShortBuffer;" />
+ <method name="put(S)Ljava/nio/ShortBuffer;" />
+ <method name="put([S)Ljava/nio/ShortBuffer;" />
+ <method name="put([SII)Ljava/nio/ShortBuffer;" />
+ <method name="slice()Ljava/nio/ShortBuffer;" />
+ <method name="wrap([S)Ljava/nio/ShortBuffer;" />
+ <method name="wrap([SII)Ljava/nio/ShortBuffer;" />
+ </class>
+ <class name="java/nio/channels/AlreadyConnectedException" since="1">
+ <extends name="java/lang/IllegalStateException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/nio/channels/AsynchronousCloseException" since="1">
+ <extends name="java/nio/channels/ClosedChannelException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/nio/channels/ByteChannel" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/nio/channels/ReadableByteChannel" />
+ <implements name="java/nio/channels/WritableByteChannel" />
+ </class>
+ <class name="java/nio/channels/CancelledKeyException" since="1">
+ <extends name="java/lang/IllegalStateException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/nio/channels/Channel" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Closeable" />
+ <method name="isOpen()Z" />
+ </class>
+ <class name="java/nio/channels/Channels" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="newChannel(Ljava/io/InputStream;)Ljava/nio/channels/ReadableByteChannel;" />
+ <method name="newChannel(Ljava/io/OutputStream;)Ljava/nio/channels/WritableByteChannel;" />
+ <method name="newInputStream(Ljava/nio/channels/ReadableByteChannel;)Ljava/io/InputStream;" />
+ <method name="newOutputStream(Ljava/nio/channels/WritableByteChannel;)Ljava/io/OutputStream;" />
+ <method name="newReader(Ljava/nio/channels/ReadableByteChannel;Ljava/lang/String;)Ljava/io/Reader;" />
+ <method name="newReader(Ljava/nio/channels/ReadableByteChannel;Ljava/nio/charset/CharsetDecoder;I)Ljava/io/Reader;" />
+ <method name="newWriter(Ljava/nio/channels/WritableByteChannel;Ljava/lang/String;)Ljava/io/Writer;" />
+ <method name="newWriter(Ljava/nio/channels/WritableByteChannel;Ljava/nio/charset/CharsetEncoder;I)Ljava/io/Writer;" />
+ </class>
+ <class name="java/nio/channels/ClosedByInterruptException" since="1">
+ <extends name="java/nio/channels/AsynchronousCloseException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/nio/channels/ClosedChannelException" since="1">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/nio/channels/ClosedSelectorException" since="1">
+ <extends name="java/lang/IllegalStateException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/nio/channels/ConnectionPendingException" since="1">
+ <extends name="java/lang/IllegalStateException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/nio/channels/DatagramChannel" since="1">
+ <extends name="java/nio/channels/spi/AbstractSelectableChannel" />
+ <implements name="java/nio/channels/ByteChannel" />
+ <implements name="java/nio/channels/GatheringByteChannel" />
+ <implements name="java/nio/channels/ScatteringByteChannel" />
+ <method name="&lt;init>(Ljava/nio/channels/spi/SelectorProvider;)V" />
+ <method name="connect(Ljava/net/SocketAddress;)Ljava/nio/channels/DatagramChannel;" />
+ <method name="disconnect()Ljava/nio/channels/DatagramChannel;" />
+ <method name="isConnected()Z" />
+ <method name="open()Ljava/nio/channels/DatagramChannel;" />
+ <method name="receive(Ljava/nio/ByteBuffer;)Ljava/net/SocketAddress;" />
+ <method name="send(Ljava/nio/ByteBuffer;Ljava/net/SocketAddress;)I" />
+ <method name="socket()Ljava/net/DatagramSocket;" />
+ </class>
+ <class name="java/nio/channels/FileChannel" since="1">
+ <extends name="java/nio/channels/spi/AbstractInterruptibleChannel" />
+ <implements name="java/nio/channels/ByteChannel" />
+ <implements name="java/nio/channels/GatheringByteChannel" />
+ <implements name="java/nio/channels/ScatteringByteChannel" />
+ <method name="&lt;init>()V" />
+ <method name="force(Z)V" />
+ <method name="lock()Ljava/nio/channels/FileLock;" />
+ <method name="lock(JJZ)Ljava/nio/channels/FileLock;" />
+ <method name="map(Ljava/nio/channels/FileChannel$MapMode;JJ)Ljava/nio/MappedByteBuffer;" />
+ <method name="position()J" />
+ <method name="position(J)Ljava/nio/channels/FileChannel;" />
+ <method name="read(Ljava/nio/ByteBuffer;J)I" />
+ <method name="size()J" />
+ <method name="transferFrom(Ljava/nio/channels/ReadableByteChannel;JJ)J" />
+ <method name="transferTo(JJLjava/nio/channels/WritableByteChannel;)J" />
+ <method name="truncate(J)Ljava/nio/channels/FileChannel;" />
+ <method name="tryLock()Ljava/nio/channels/FileLock;" />
+ <method name="tryLock(JJZ)Ljava/nio/channels/FileLock;" />
+ <method name="write(Ljava/nio/ByteBuffer;J)I" />
+ </class>
+ <class name="java/nio/channels/FileChannel$MapMode" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="PRIVATE" />
+ <field name="READ_ONLY" />
+ <field name="READ_WRITE" />
+ </class>
+ <class name="java/nio/channels/FileLock" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/AutoCloseable" since="19" />
+ <method name="&lt;init>(Ljava/nio/channels/FileChannel;JJZ)V" />
+ <method name="channel()Ljava/nio/channels/FileChannel;" />
+ <method name="isShared()Z" />
+ <method name="isValid()Z" />
+ <method name="overlaps(JJ)Z" />
+ <method name="position()J" />
+ <method name="release()V" />
+ <method name="size()J" />
+ </class>
+ <class name="java/nio/channels/FileLockInterruptionException" since="1">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/nio/channels/GatheringByteChannel" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/nio/channels/WritableByteChannel" />
+ <method name="write([Ljava/nio/ByteBuffer;)J" />
+ <method name="write([Ljava/nio/ByteBuffer;II)J" />
+ </class>
+ <class name="java/nio/channels/IllegalBlockingModeException" since="1">
+ <extends name="java/lang/IllegalStateException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/nio/channels/IllegalSelectorException" since="1">
+ <extends name="java/lang/IllegalArgumentException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/nio/channels/InterruptibleChannel" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/nio/channels/Channel" />
+ </class>
+ <class name="java/nio/channels/NoConnectionPendingException" since="1">
+ <extends name="java/lang/IllegalStateException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/nio/channels/NonReadableChannelException" since="1">
+ <extends name="java/lang/IllegalStateException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/nio/channels/NonWritableChannelException" since="1">
+ <extends name="java/lang/IllegalStateException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/nio/channels/NotYetBoundException" since="1">
+ <extends name="java/lang/IllegalStateException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/nio/channels/NotYetConnectedException" since="1">
+ <extends name="java/lang/IllegalStateException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/nio/channels/OverlappingFileLockException" since="1">
+ <extends name="java/lang/IllegalStateException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/nio/channels/Pipe" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="open()Ljava/nio/channels/Pipe;" />
+ <method name="sink()Ljava/nio/channels/Pipe$SinkChannel;" />
+ <method name="source()Ljava/nio/channels/Pipe$SourceChannel;" />
+ </class>
+ <class name="java/nio/channels/Pipe$SinkChannel" since="1">
+ <extends name="java/nio/channels/spi/AbstractSelectableChannel" />
+ <implements name="java/nio/channels/GatheringByteChannel" />
+ <implements name="java/nio/channels/WritableByteChannel" />
+ <method name="&lt;init>(Ljava/nio/channels/spi/SelectorProvider;)V" />
+ </class>
+ <class name="java/nio/channels/Pipe$SourceChannel" since="1">
+ <extends name="java/nio/channels/spi/AbstractSelectableChannel" />
+ <implements name="java/nio/channels/ReadableByteChannel" />
+ <implements name="java/nio/channels/ScatteringByteChannel" />
+ <method name="&lt;init>(Ljava/nio/channels/spi/SelectorProvider;)V" />
+ </class>
+ <class name="java/nio/channels/ReadableByteChannel" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/nio/channels/Channel" />
+ <method name="read(Ljava/nio/ByteBuffer;)I" />
+ </class>
+ <class name="java/nio/channels/ScatteringByteChannel" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/nio/channels/ReadableByteChannel" />
+ <method name="read([Ljava/nio/ByteBuffer;)J" />
+ <method name="read([Ljava/nio/ByteBuffer;II)J" />
+ </class>
+ <class name="java/nio/channels/SelectableChannel" since="1">
+ <extends name="java/nio/channels/spi/AbstractInterruptibleChannel" />
+ <implements name="java/nio/channels/Channel" />
+ <method name="&lt;init>()V" />
+ <method name="blockingLock()Ljava/lang/Object;" />
+ <method name="configureBlocking(Z)Ljava/nio/channels/SelectableChannel;" />
+ <method name="isBlocking()Z" />
+ <method name="isRegistered()Z" />
+ <method name="keyFor(Ljava/nio/channels/Selector;)Ljava/nio/channels/SelectionKey;" />
+ <method name="provider()Ljava/nio/channels/spi/SelectorProvider;" />
+ <method name="register(Ljava/nio/channels/Selector;I)Ljava/nio/channels/SelectionKey;" />
+ <method name="register(Ljava/nio/channels/Selector;ILjava/lang/Object;)Ljava/nio/channels/SelectionKey;" />
+ <method name="validOps()I" />
+ </class>
+ <class name="java/nio/channels/SelectionKey" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="attach(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="attachment()Ljava/lang/Object;" />
+ <method name="cancel()V" />
+ <method name="channel()Ljava/nio/channels/SelectableChannel;" />
+ <method name="interestOps()I" />
+ <method name="interestOps(I)Ljava/nio/channels/SelectionKey;" />
+ <method name="isAcceptable()Z" />
+ <method name="isConnectable()Z" />
+ <method name="isReadable()Z" />
+ <method name="isValid()Z" />
+ <method name="isWritable()Z" />
+ <method name="readyOps()I" />
+ <method name="selector()Ljava/nio/channels/Selector;" />
+ <field name="OP_ACCEPT" />
+ <field name="OP_CONNECT" />
+ <field name="OP_READ" />
+ <field name="OP_WRITE" />
+ </class>
+ <class name="java/nio/channels/Selector" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Closeable" since="19" />
+ <method name="&lt;init>()V" />
+ <method name="close()V" />
+ <method name="isOpen()Z" />
+ <method name="keys()Ljava/util/Set;" />
+ <method name="open()Ljava/nio/channels/Selector;" />
+ <method name="provider()Ljava/nio/channels/spi/SelectorProvider;" />
+ <method name="select()I" />
+ <method name="select(J)I" />
+ <method name="selectNow()I" />
+ <method name="selectedKeys()Ljava/util/Set;" />
+ <method name="wakeup()Ljava/nio/channels/Selector;" />
+ </class>
+ <class name="java/nio/channels/ServerSocketChannel" since="1">
+ <extends name="java/nio/channels/spi/AbstractSelectableChannel" />
+ <method name="&lt;init>(Ljava/nio/channels/spi/SelectorProvider;)V" />
+ <method name="accept()Ljava/nio/channels/SocketChannel;" />
+ <method name="open()Ljava/nio/channels/ServerSocketChannel;" />
+ <method name="socket()Ljava/net/ServerSocket;" />
+ </class>
+ <class name="java/nio/channels/SocketChannel" since="1">
+ <extends name="java/nio/channels/spi/AbstractSelectableChannel" />
+ <implements name="java/nio/channels/ByteChannel" />
+ <implements name="java/nio/channels/GatheringByteChannel" />
+ <implements name="java/nio/channels/ScatteringByteChannel" />
+ <method name="&lt;init>(Ljava/nio/channels/spi/SelectorProvider;)V" />
+ <method name="connect(Ljava/net/SocketAddress;)Z" />
+ <method name="finishConnect()Z" />
+ <method name="isConnected()Z" />
+ <method name="isConnectionPending()Z" />
+ <method name="open()Ljava/nio/channels/SocketChannel;" />
+ <method name="open(Ljava/net/SocketAddress;)Ljava/nio/channels/SocketChannel;" />
+ <method name="socket()Ljava/net/Socket;" />
+ </class>
+ <class name="java/nio/channels/UnresolvedAddressException" since="1">
+ <extends name="java/lang/IllegalArgumentException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/nio/channels/UnsupportedAddressTypeException" since="1">
+ <extends name="java/lang/IllegalArgumentException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/nio/channels/WritableByteChannel" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/nio/channels/Channel" />
+ <method name="write(Ljava/nio/ByteBuffer;)I" />
+ </class>
+ <class name="java/nio/channels/spi/AbstractInterruptibleChannel" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/nio/channels/Channel" />
+ <implements name="java/nio/channels/InterruptibleChannel" />
+ <method name="&lt;init>()V" />
+ <method name="begin()V" />
+ <method name="end(Z)V" />
+ <method name="implCloseChannel()V" />
+ </class>
+ <class name="java/nio/channels/spi/AbstractSelectableChannel" since="1">
+ <extends name="java/nio/channels/SelectableChannel" />
+ <method name="&lt;init>(Ljava/nio/channels/spi/SelectorProvider;)V" />
+ <method name="implCloseSelectableChannel()V" />
+ <method name="implConfigureBlocking(Z)V" />
+ </class>
+ <class name="java/nio/channels/spi/AbstractSelectionKey" since="1">
+ <extends name="java/nio/channels/SelectionKey" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/nio/channels/spi/AbstractSelector" since="1">
+ <extends name="java/nio/channels/Selector" />
+ <method name="&lt;init>(Ljava/nio/channels/spi/SelectorProvider;)V" />
+ <method name="begin()V" />
+ <method name="cancelledKeys()Ljava/util/Set;" />
+ <method name="deregister(Ljava/nio/channels/spi/AbstractSelectionKey;)V" />
+ <method name="end()V" />
+ <method name="implCloseSelector()V" />
+ <method name="register(Ljava/nio/channels/spi/AbstractSelectableChannel;ILjava/lang/Object;)Ljava/nio/channels/SelectionKey;" />
+ </class>
+ <class name="java/nio/channels/spi/SelectorProvider" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="inheritedChannel()Ljava/nio/channels/Channel;" />
+ <method name="openDatagramChannel()Ljava/nio/channels/DatagramChannel;" />
+ <method name="openPipe()Ljava/nio/channels/Pipe;" />
+ <method name="openSelector()Ljava/nio/channels/spi/AbstractSelector;" />
+ <method name="openServerSocketChannel()Ljava/nio/channels/ServerSocketChannel;" />
+ <method name="openSocketChannel()Ljava/nio/channels/SocketChannel;" />
+ <method name="provider()Ljava/nio/channels/spi/SelectorProvider;" />
+ </class>
+ <class name="java/nio/charset/CharacterCodingException" since="1">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/nio/charset/Charset" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>(Ljava/lang/String;[Ljava/lang/String;)V" />
+ <method name="aliases()Ljava/util/Set;" />
+ <method name="availableCharsets()Ljava/util/SortedMap;" />
+ <method name="canEncode()Z" />
+ <method name="compareTo(Ljava/nio/charset/Charset;)I" />
+ <method name="contains(Ljava/nio/charset/Charset;)Z" />
+ <method name="decode(Ljava/nio/ByteBuffer;)Ljava/nio/CharBuffer;" />
+ <method name="defaultCharset()Ljava/nio/charset/Charset;" />
+ <method name="displayName()Ljava/lang/String;" />
+ <method name="displayName(Ljava/util/Locale;)Ljava/lang/String;" />
+ <method name="encode(Ljava/lang/String;)Ljava/nio/ByteBuffer;" />
+ <method name="encode(Ljava/nio/CharBuffer;)Ljava/nio/ByteBuffer;" />
+ <method name="forName(Ljava/lang/String;)Ljava/nio/charset/Charset;" />
+ <method name="isRegistered()Z" />
+ <method name="isSupported(Ljava/lang/String;)Z" />
+ <method name="name()Ljava/lang/String;" />
+ <method name="newDecoder()Ljava/nio/charset/CharsetDecoder;" />
+ <method name="newEncoder()Ljava/nio/charset/CharsetEncoder;" />
+ </class>
+ <class name="java/nio/charset/CharsetDecoder" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/nio/charset/Charset;FF)V" />
+ <method name="averageCharsPerByte()F" />
+ <method name="charset()Ljava/nio/charset/Charset;" />
+ <method name="decode(Ljava/nio/ByteBuffer;)Ljava/nio/CharBuffer;" />
+ <method name="decode(Ljava/nio/ByteBuffer;Ljava/nio/CharBuffer;Z)Ljava/nio/charset/CoderResult;" />
+ <method name="decodeLoop(Ljava/nio/ByteBuffer;Ljava/nio/CharBuffer;)Ljava/nio/charset/CoderResult;" />
+ <method name="detectedCharset()Ljava/nio/charset/Charset;" />
+ <method name="flush(Ljava/nio/CharBuffer;)Ljava/nio/charset/CoderResult;" />
+ <method name="implFlush(Ljava/nio/CharBuffer;)Ljava/nio/charset/CoderResult;" />
+ <method name="implOnMalformedInput(Ljava/nio/charset/CodingErrorAction;)V" />
+ <method name="implOnUnmappableCharacter(Ljava/nio/charset/CodingErrorAction;)V" />
+ <method name="implReplaceWith(Ljava/lang/String;)V" />
+ <method name="implReset()V" />
+ <method name="isAutoDetecting()Z" />
+ <method name="isCharsetDetected()Z" />
+ <method name="malformedInputAction()Ljava/nio/charset/CodingErrorAction;" />
+ <method name="maxCharsPerByte()F" />
+ <method name="onMalformedInput(Ljava/nio/charset/CodingErrorAction;)Ljava/nio/charset/CharsetDecoder;" />
+ <method name="onUnmappableCharacter(Ljava/nio/charset/CodingErrorAction;)Ljava/nio/charset/CharsetDecoder;" />
+ <method name="replaceWith(Ljava/lang/String;)Ljava/nio/charset/CharsetDecoder;" />
+ <method name="replacement()Ljava/lang/String;" />
+ <method name="reset()Ljava/nio/charset/CharsetDecoder;" />
+ <method name="unmappableCharacterAction()Ljava/nio/charset/CodingErrorAction;" />
+ </class>
+ <class name="java/nio/charset/CharsetEncoder" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/nio/charset/Charset;FF)V" />
+ <method name="&lt;init>(Ljava/nio/charset/Charset;FF[B)V" />
+ <method name="averageBytesPerChar()F" />
+ <method name="canEncode(C)Z" />
+ <method name="canEncode(Ljava/lang/CharSequence;)Z" />
+ <method name="charset()Ljava/nio/charset/Charset;" />
+ <method name="encode(Ljava/nio/CharBuffer;)Ljava/nio/ByteBuffer;" />
+ <method name="encode(Ljava/nio/CharBuffer;Ljava/nio/ByteBuffer;Z)Ljava/nio/charset/CoderResult;" />
+ <method name="encodeLoop(Ljava/nio/CharBuffer;Ljava/nio/ByteBuffer;)Ljava/nio/charset/CoderResult;" />
+ <method name="flush(Ljava/nio/ByteBuffer;)Ljava/nio/charset/CoderResult;" />
+ <method name="implFlush(Ljava/nio/ByteBuffer;)Ljava/nio/charset/CoderResult;" />
+ <method name="implOnMalformedInput(Ljava/nio/charset/CodingErrorAction;)V" />
+ <method name="implOnUnmappableCharacter(Ljava/nio/charset/CodingErrorAction;)V" />
+ <method name="implReplaceWith([B)V" />
+ <method name="implReset()V" />
+ <method name="isLegalReplacement([B)Z" />
+ <method name="malformedInputAction()Ljava/nio/charset/CodingErrorAction;" />
+ <method name="maxBytesPerChar()F" />
+ <method name="onMalformedInput(Ljava/nio/charset/CodingErrorAction;)Ljava/nio/charset/CharsetEncoder;" />
+ <method name="onUnmappableCharacter(Ljava/nio/charset/CodingErrorAction;)Ljava/nio/charset/CharsetEncoder;" />
+ <method name="replaceWith([B)Ljava/nio/charset/CharsetEncoder;" />
+ <method name="replacement()[B" />
+ <method name="reset()Ljava/nio/charset/CharsetEncoder;" />
+ <method name="unmappableCharacterAction()Ljava/nio/charset/CodingErrorAction;" />
+ </class>
+ <class name="java/nio/charset/CoderMalfunctionError" since="1">
+ <extends name="java/lang/Error" />
+ <method name="&lt;init>(Ljava/lang/Exception;)V" />
+ </class>
+ <class name="java/nio/charset/CoderResult" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="isError()Z" />
+ <method name="isMalformed()Z" />
+ <method name="isOverflow()Z" />
+ <method name="isUnderflow()Z" />
+ <method name="isUnmappable()Z" />
+ <method name="length()I" />
+ <method name="malformedForLength(I)Ljava/nio/charset/CoderResult;" />
+ <method name="throwException()V" />
+ <method name="unmappableForLength(I)Ljava/nio/charset/CoderResult;" />
+ <field name="OVERFLOW" />
+ <field name="UNDERFLOW" />
+ </class>
+ <class name="java/nio/charset/CodingErrorAction" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="IGNORE" />
+ <field name="REPLACE" />
+ <field name="REPORT" />
+ </class>
+ <class name="java/nio/charset/IllegalCharsetNameException" since="1">
+ <extends name="java/lang/IllegalArgumentException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getCharsetName()Ljava/lang/String;" />
+ </class>
+ <class name="java/nio/charset/MalformedInputException" since="1">
+ <extends name="java/nio/charset/CharacterCodingException" />
+ <method name="&lt;init>(I)V" />
+ <method name="getInputLength()I" />
+ </class>
+ <class name="java/nio/charset/StandardCharsets" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="ISO_8859_1" />
+ <field name="US_ASCII" />
+ <field name="UTF_16" />
+ <field name="UTF_16BE" />
+ <field name="UTF_16LE" />
+ <field name="UTF_8" />
+ </class>
+ <class name="java/nio/charset/UnmappableCharacterException" since="1">
+ <extends name="java/nio/charset/CharacterCodingException" />
+ <method name="&lt;init>(I)V" />
+ <method name="getInputLength()I" />
+ </class>
+ <class name="java/nio/charset/UnsupportedCharsetException" since="1">
+ <extends name="java/lang/IllegalArgumentException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getCharsetName()Ljava/lang/String;" />
+ </class>
+ <class name="java/nio/charset/spi/CharsetProvider" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="charsetForName(Ljava/lang/String;)Ljava/nio/charset/Charset;" />
+ <method name="charsets()Ljava/util/Iterator;" />
+ </class>
+ <class name="java/security/AccessControlContext" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/security/AccessControlContext;Ljava/security/DomainCombiner;)V" />
+ <method name="&lt;init>([Ljava/security/ProtectionDomain;)V" />
+ <method name="checkPermission(Ljava/security/Permission;)V" />
+ <method name="getDomainCombiner()Ljava/security/DomainCombiner;" />
+ </class>
+ <class name="java/security/AccessControlException" since="1">
+ <extends name="java/lang/SecurityException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/security/Permission;)V" />
+ <method name="getPermission()Ljava/security/Permission;" />
+ </class>
+ <class name="java/security/AccessController" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="checkPermission(Ljava/security/Permission;)V" />
+ <method name="doPrivileged(Ljava/security/PrivilegedAction;)Ljava/lang/Object;" />
+ <method name="doPrivileged(Ljava/security/PrivilegedAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;" />
+ <method name="doPrivileged(Ljava/security/PrivilegedExceptionAction;)Ljava/lang/Object;" />
+ <method name="doPrivileged(Ljava/security/PrivilegedExceptionAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;" />
+ <method name="doPrivilegedWithCombiner(Ljava/security/PrivilegedAction;)Ljava/lang/Object;" since="9" />
+ <method name="doPrivilegedWithCombiner(Ljava/security/PrivilegedExceptionAction;)Ljava/lang/Object;" since="9" />
+ <method name="getContext()Ljava/security/AccessControlContext;" />
+ </class>
+ <class name="java/security/AlgorithmParameterGenerator" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/security/AlgorithmParameterGeneratorSpi;Ljava/security/Provider;Ljava/lang/String;)V" />
+ <method name="generateParameters()Ljava/security/AlgorithmParameters;" />
+ <method name="getAlgorithm()Ljava/lang/String;" />
+ <method name="getInstance(Ljava/lang/String;)Ljava/security/AlgorithmParameterGenerator;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/AlgorithmParameterGenerator;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/AlgorithmParameterGenerator;" />
+ <method name="getProvider()Ljava/security/Provider;" />
+ <method name="init(I)V" />
+ <method name="init(ILjava/security/SecureRandom;)V" />
+ <method name="init(Ljava/security/spec/AlgorithmParameterSpec;)V" />
+ <method name="init(Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V" />
+ </class>
+ <class name="java/security/AlgorithmParameterGeneratorSpi" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="engineGenerateParameters()Ljava/security/AlgorithmParameters;" />
+ <method name="engineInit(ILjava/security/SecureRandom;)V" />
+ <method name="engineInit(Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V" />
+ </class>
+ <class name="java/security/AlgorithmParameters" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/security/AlgorithmParametersSpi;Ljava/security/Provider;Ljava/lang/String;)V" />
+ <method name="getAlgorithm()Ljava/lang/String;" />
+ <method name="getEncoded()[B" />
+ <method name="getEncoded(Ljava/lang/String;)[B" />
+ <method name="getInstance(Ljava/lang/String;)Ljava/security/AlgorithmParameters;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/AlgorithmParameters;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/AlgorithmParameters;" />
+ <method name="getParameterSpec(Ljava/lang/Class;)Ljava/security/spec/AlgorithmParameterSpec;" />
+ <method name="getProvider()Ljava/security/Provider;" />
+ <method name="init(Ljava/security/spec/AlgorithmParameterSpec;)V" />
+ <method name="init([B)V" />
+ <method name="init([BLjava/lang/String;)V" />
+ </class>
+ <class name="java/security/AlgorithmParametersSpi" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="engineGetEncoded()[B" />
+ <method name="engineGetEncoded(Ljava/lang/String;)[B" />
+ <method name="engineGetParameterSpec(Ljava/lang/Class;)Ljava/security/spec/AlgorithmParameterSpec;" />
+ <method name="engineInit(Ljava/security/spec/AlgorithmParameterSpec;)V" />
+ <method name="engineInit([B)V" />
+ <method name="engineInit([BLjava/lang/String;)V" />
+ <method name="engineToString()Ljava/lang/String;" />
+ </class>
+ <class name="java/security/AllPermission" since="1">
+ <extends name="java/security/Permission" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="java/security/AuthProvider" since="1">
+ <extends name="java/security/Provider" />
+ <method name="&lt;init>(Ljava/lang/String;DLjava/lang/String;)V" />
+ <method name="login(Ljavax/security/auth/Subject;Ljavax/security/auth/callback/CallbackHandler;)V" />
+ <method name="logout()V" />
+ <method name="setCallbackHandler(Ljavax/security/auth/callback/CallbackHandler;)V" />
+ </class>
+ <class name="java/security/BasicPermission" since="1">
+ <extends name="java/security/Permission" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="java/security/Certificate" since="1">
+ <extends name="java/lang/Object" />
+ <method name="decode(Ljava/io/InputStream;)V" />
+ <method name="encode(Ljava/io/OutputStream;)V" />
+ <method name="getFormat()Ljava/lang/String;" />
+ <method name="getGuarantor()Ljava/security/Principal;" />
+ <method name="getPrincipal()Ljava/security/Principal;" />
+ <method name="getPublicKey()Ljava/security/PublicKey;" />
+ <method name="toString(Z)Ljava/lang/String;" />
+ </class>
+ <class name="java/security/CodeSigner" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/security/cert/CertPath;Ljava/security/Timestamp;)V" />
+ <method name="getSignerCertPath()Ljava/security/cert/CertPath;" />
+ <method name="getTimestamp()Ljava/security/Timestamp;" />
+ </class>
+ <class name="java/security/CodeSource" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/net/URL;[Ljava/security/CodeSigner;)V" />
+ <method name="&lt;init>(Ljava/net/URL;[Ljava/security/cert/Certificate;)V" />
+ <method name="getCertificates()[Ljava/security/cert/Certificate;" />
+ <method name="getCodeSigners()[Ljava/security/CodeSigner;" />
+ <method name="getLocation()Ljava/net/URL;" />
+ <method name="implies(Ljava/security/CodeSource;)Z" />
+ </class>
+ <class name="java/security/DigestException" since="1">
+ <extends name="java/security/GeneralSecurityException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/security/DigestInputStream" since="1">
+ <extends name="java/io/FilterInputStream" />
+ <method name="&lt;init>(Ljava/io/InputStream;Ljava/security/MessageDigest;)V" />
+ <method name="getMessageDigest()Ljava/security/MessageDigest;" />
+ <method name="on(Z)V" />
+ <method name="setMessageDigest(Ljava/security/MessageDigest;)V" />
+ <field name="digest" />
+ </class>
+ <class name="java/security/DigestOutputStream" since="1">
+ <extends name="java/io/FilterOutputStream" />
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/security/MessageDigest;)V" />
+ <method name="getMessageDigest()Ljava/security/MessageDigest;" />
+ <method name="on(Z)V" />
+ <method name="setMessageDigest(Ljava/security/MessageDigest;)V" />
+ <field name="digest" />
+ </class>
+ <class name="java/security/DomainCombiner" since="1">
+ <extends name="java/lang/Object" />
+ <method name="combine([Ljava/security/ProtectionDomain;[Ljava/security/ProtectionDomain;)[Ljava/security/ProtectionDomain;" />
+ </class>
+ <class name="java/security/GeneralSecurityException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/security/Guard" since="1">
+ <extends name="java/lang/Object" />
+ <method name="checkGuard(Ljava/lang/Object;)V" />
+ </class>
+ <class name="java/security/GuardedObject" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/lang/Object;Ljava/security/Guard;)V" />
+ <method name="getObject()Ljava/lang/Object;" />
+ </class>
+ <class name="java/security/Identity" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/security/Principal" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/security/IdentityScope;)V" />
+ <method name="addCertificate(Ljava/security/Certificate;)V" />
+ <method name="certificates()[Ljava/security/Certificate;" />
+ <method name="getInfo()Ljava/lang/String;" />
+ <method name="getPublicKey()Ljava/security/PublicKey;" />
+ <method name="getScope()Ljava/security/IdentityScope;" />
+ <method name="identityEquals(Ljava/security/Identity;)Z" />
+ <method name="removeCertificate(Ljava/security/Certificate;)V" />
+ <method name="setInfo(Ljava/lang/String;)V" />
+ <method name="setPublicKey(Ljava/security/PublicKey;)V" />
+ <method name="toString(Z)Ljava/lang/String;" />
+ </class>
+ <class name="java/security/IdentityScope" since="1">
+ <extends name="java/security/Identity" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/security/IdentityScope;)V" />
+ <method name="addIdentity(Ljava/security/Identity;)V" />
+ <method name="getIdentity(Ljava/lang/String;)Ljava/security/Identity;" />
+ <method name="getIdentity(Ljava/security/Principal;)Ljava/security/Identity;" />
+ <method name="getIdentity(Ljava/security/PublicKey;)Ljava/security/Identity;" />
+ <method name="getSystemScope()Ljava/security/IdentityScope;" />
+ <method name="identities()Ljava/util/Enumeration;" />
+ <method name="removeIdentity(Ljava/security/Identity;)V" />
+ <method name="setSystemScope(Ljava/security/IdentityScope;)V" />
+ <method name="size()I" />
+ </class>
+ <class name="java/security/InvalidAlgorithmParameterException" since="1">
+ <extends name="java/security/GeneralSecurityException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/security/InvalidKeyException" since="1">
+ <extends name="java/security/KeyException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/security/InvalidParameterException" since="1">
+ <extends name="java/lang/IllegalArgumentException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/security/Key" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="getAlgorithm()Ljava/lang/String;" />
+ <method name="getEncoded()[B" />
+ <method name="getFormat()Ljava/lang/String;" />
+ <field name="serialVersionUID" />
+ </class>
+ <class name="java/security/KeyException" since="1">
+ <extends name="java/security/GeneralSecurityException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/security/KeyFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/security/KeyFactorySpi;Ljava/security/Provider;Ljava/lang/String;)V" />
+ <method name="generatePrivate(Ljava/security/spec/KeySpec;)Ljava/security/PrivateKey;" />
+ <method name="generatePublic(Ljava/security/spec/KeySpec;)Ljava/security/PublicKey;" />
+ <method name="getAlgorithm()Ljava/lang/String;" />
+ <method name="getInstance(Ljava/lang/String;)Ljava/security/KeyFactory;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/KeyFactory;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/KeyFactory;" />
+ <method name="getKeySpec(Ljava/security/Key;Ljava/lang/Class;)Ljava/security/spec/KeySpec;" />
+ <method name="getProvider()Ljava/security/Provider;" />
+ <method name="translateKey(Ljava/security/Key;)Ljava/security/Key;" />
+ </class>
+ <class name="java/security/KeyFactorySpi" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="engineGeneratePrivate(Ljava/security/spec/KeySpec;)Ljava/security/PrivateKey;" />
+ <method name="engineGeneratePublic(Ljava/security/spec/KeySpec;)Ljava/security/PublicKey;" />
+ <method name="engineGetKeySpec(Ljava/security/Key;Ljava/lang/Class;)Ljava/security/spec/KeySpec;" />
+ <method name="engineTranslateKey(Ljava/security/Key;)Ljava/security/Key;" />
+ </class>
+ <class name="java/security/KeyManagementException" since="1">
+ <extends name="java/security/KeyException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/security/KeyPair" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/security/PublicKey;Ljava/security/PrivateKey;)V" />
+ <method name="getPrivate()Ljava/security/PrivateKey;" />
+ <method name="getPublic()Ljava/security/PublicKey;" />
+ </class>
+ <class name="java/security/KeyPairGenerator" since="1">
+ <extends name="java/security/KeyPairGeneratorSpi" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="genKeyPair()Ljava/security/KeyPair;" />
+ <method name="getAlgorithm()Ljava/lang/String;" />
+ <method name="getInstance(Ljava/lang/String;)Ljava/security/KeyPairGenerator;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/KeyPairGenerator;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/KeyPairGenerator;" />
+ <method name="getProvider()Ljava/security/Provider;" />
+ <method name="initialize(I)V" />
+ <method name="initialize(Ljava/security/spec/AlgorithmParameterSpec;)V" />
+ </class>
+ <class name="java/security/KeyPairGeneratorSpi" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="generateKeyPair()Ljava/security/KeyPair;" />
+ <method name="initialize(ILjava/security/SecureRandom;)V" />
+ <method name="initialize(Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V" />
+ </class>
+ <class name="java/security/KeyRep" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/security/KeyRep$Type;Ljava/lang/String;Ljava/lang/String;[B)V" />
+ <method name="readResolve()Ljava/lang/Object;" />
+ </class>
+ <class name="java/security/KeyRep$Type" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Ljava/security/KeyRep$Type;" />
+ <method name="values()[Ljava/security/KeyRep$Type;" />
+ <field name="PRIVATE" />
+ <field name="PUBLIC" />
+ <field name="SECRET" />
+ </class>
+ <class name="java/security/KeyStore" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/security/KeyStoreSpi;Ljava/security/Provider;Ljava/lang/String;)V" />
+ <method name="aliases()Ljava/util/Enumeration;" />
+ <method name="containsAlias(Ljava/lang/String;)Z" />
+ <method name="deleteEntry(Ljava/lang/String;)V" />
+ <method name="entryInstanceOf(Ljava/lang/String;Ljava/lang/Class;)Z" />
+ <method name="getCertificate(Ljava/lang/String;)Ljava/security/cert/Certificate;" />
+ <method name="getCertificateAlias(Ljava/security/cert/Certificate;)Ljava/lang/String;" />
+ <method name="getCertificateChain(Ljava/lang/String;)[Ljava/security/cert/Certificate;" />
+ <method name="getCreationDate(Ljava/lang/String;)Ljava/util/Date;" />
+ <method name="getDefaultType()Ljava/lang/String;" />
+ <method name="getEntry(Ljava/lang/String;Ljava/security/KeyStore$ProtectionParameter;)Ljava/security/KeyStore$Entry;" />
+ <method name="getInstance(Ljava/lang/String;)Ljava/security/KeyStore;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/KeyStore;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/KeyStore;" />
+ <method name="getKey(Ljava/lang/String;[C)Ljava/security/Key;" />
+ <method name="getProvider()Ljava/security/Provider;" />
+ <method name="getType()Ljava/lang/String;" />
+ <method name="isCertificateEntry(Ljava/lang/String;)Z" />
+ <method name="isKeyEntry(Ljava/lang/String;)Z" />
+ <method name="load(Ljava/io/InputStream;[C)V" />
+ <method name="load(Ljava/security/KeyStore$LoadStoreParameter;)V" />
+ <method name="setCertificateEntry(Ljava/lang/String;Ljava/security/cert/Certificate;)V" />
+ <method name="setEntry(Ljava/lang/String;Ljava/security/KeyStore$Entry;Ljava/security/KeyStore$ProtectionParameter;)V" />
+ <method name="setKeyEntry(Ljava/lang/String;Ljava/security/Key;[C[Ljava/security/cert/Certificate;)V" />
+ <method name="setKeyEntry(Ljava/lang/String;[B[Ljava/security/cert/Certificate;)V" />
+ <method name="size()I" />
+ <method name="store(Ljava/io/OutputStream;[C)V" />
+ <method name="store(Ljava/security/KeyStore$LoadStoreParameter;)V" />
+ </class>
+ <class name="java/security/KeyStore$Builder" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getKeyStore()Ljava/security/KeyStore;" />
+ <method name="getProtectionParameter(Ljava/lang/String;)Ljava/security/KeyStore$ProtectionParameter;" />
+ <method name="newInstance(Ljava/lang/String;Ljava/security/Provider;Ljava/io/File;Ljava/security/KeyStore$ProtectionParameter;)Ljava/security/KeyStore$Builder;" />
+ <method name="newInstance(Ljava/lang/String;Ljava/security/Provider;Ljava/security/KeyStore$ProtectionParameter;)Ljava/security/KeyStore$Builder;" />
+ <method name="newInstance(Ljava/security/KeyStore;Ljava/security/KeyStore$ProtectionParameter;)Ljava/security/KeyStore$Builder;" />
+ </class>
+ <class name="java/security/KeyStore$CallbackHandlerProtection" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/KeyStore$ProtectionParameter" />
+ <method name="&lt;init>(Ljavax/security/auth/callback/CallbackHandler;)V" />
+ <method name="getCallbackHandler()Ljavax/security/auth/callback/CallbackHandler;" />
+ </class>
+ <class name="java/security/KeyStore$Entry" since="1">
+ <extends name="java/lang/Object" />
+ </class>
+ <class name="java/security/KeyStore$LoadStoreParameter" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getProtectionParameter()Ljava/security/KeyStore$ProtectionParameter;" />
+ </class>
+ <class name="java/security/KeyStore$PasswordProtection" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/KeyStore$ProtectionParameter" />
+ <implements name="javax/security/auth/Destroyable" />
+ <method name="&lt;init>([C)V" />
+ <method name="getPassword()[C" />
+ </class>
+ <class name="java/security/KeyStore$PrivateKeyEntry" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/KeyStore$Entry" />
+ <method name="&lt;init>(Ljava/security/PrivateKey;[Ljava/security/cert/Certificate;)V" />
+ <method name="getCertificate()Ljava/security/cert/Certificate;" />
+ <method name="getCertificateChain()[Ljava/security/cert/Certificate;" />
+ <method name="getPrivateKey()Ljava/security/PrivateKey;" />
+ </class>
+ <class name="java/security/KeyStore$ProtectionParameter" since="1">
+ <extends name="java/lang/Object" />
+ </class>
+ <class name="java/security/KeyStore$SecretKeyEntry" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/KeyStore$Entry" />
+ <method name="&lt;init>(Ljavax/crypto/SecretKey;)V" />
+ <method name="getSecretKey()Ljavax/crypto/SecretKey;" />
+ </class>
+ <class name="java/security/KeyStore$TrustedCertificateEntry" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/KeyStore$Entry" />
+ <method name="&lt;init>(Ljava/security/cert/Certificate;)V" />
+ <method name="getTrustedCertificate()Ljava/security/cert/Certificate;" />
+ </class>
+ <class name="java/security/KeyStoreException" since="1">
+ <extends name="java/security/GeneralSecurityException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/security/KeyStoreSpi" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="engineAliases()Ljava/util/Enumeration;" />
+ <method name="engineContainsAlias(Ljava/lang/String;)Z" />
+ <method name="engineDeleteEntry(Ljava/lang/String;)V" />
+ <method name="engineEntryInstanceOf(Ljava/lang/String;Ljava/lang/Class;)Z" />
+ <method name="engineGetCertificate(Ljava/lang/String;)Ljava/security/cert/Certificate;" />
+ <method name="engineGetCertificateAlias(Ljava/security/cert/Certificate;)Ljava/lang/String;" />
+ <method name="engineGetCertificateChain(Ljava/lang/String;)[Ljava/security/cert/Certificate;" />
+ <method name="engineGetCreationDate(Ljava/lang/String;)Ljava/util/Date;" />
+ <method name="engineGetEntry(Ljava/lang/String;Ljava/security/KeyStore$ProtectionParameter;)Ljava/security/KeyStore$Entry;" />
+ <method name="engineGetKey(Ljava/lang/String;[C)Ljava/security/Key;" />
+ <method name="engineIsCertificateEntry(Ljava/lang/String;)Z" />
+ <method name="engineIsKeyEntry(Ljava/lang/String;)Z" />
+ <method name="engineLoad(Ljava/io/InputStream;[C)V" />
+ <method name="engineLoad(Ljava/security/KeyStore$LoadStoreParameter;)V" />
+ <method name="engineSetCertificateEntry(Ljava/lang/String;Ljava/security/cert/Certificate;)V" />
+ <method name="engineSetEntry(Ljava/lang/String;Ljava/security/KeyStore$Entry;Ljava/security/KeyStore$ProtectionParameter;)V" />
+ <method name="engineSetKeyEntry(Ljava/lang/String;Ljava/security/Key;[C[Ljava/security/cert/Certificate;)V" />
+ <method name="engineSetKeyEntry(Ljava/lang/String;[B[Ljava/security/cert/Certificate;)V" />
+ <method name="engineSize()I" />
+ <method name="engineStore(Ljava/io/OutputStream;[C)V" />
+ <method name="engineStore(Ljava/security/KeyStore$LoadStoreParameter;)V" />
+ </class>
+ <class name="java/security/MessageDigest" since="1">
+ <extends name="java/security/MessageDigestSpi" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="digest()[B" />
+ <method name="digest([B)[B" />
+ <method name="digest([BII)I" />
+ <method name="getAlgorithm()Ljava/lang/String;" />
+ <method name="getDigestLength()I" />
+ <method name="getInstance(Ljava/lang/String;)Ljava/security/MessageDigest;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/MessageDigest;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/MessageDigest;" />
+ <method name="getProvider()Ljava/security/Provider;" />
+ <method name="isEqual([B[B)Z" />
+ <method name="reset()V" />
+ <method name="update(B)V" />
+ <method name="update(Ljava/nio/ByteBuffer;)V" />
+ <method name="update([B)V" />
+ <method name="update([BII)V" />
+ </class>
+ <class name="java/security/MessageDigestSpi" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="engineDigest()[B" />
+ <method name="engineDigest([BII)I" />
+ <method name="engineGetDigestLength()I" />
+ <method name="engineReset()V" />
+ <method name="engineUpdate(B)V" />
+ <method name="engineUpdate(Ljava/nio/ByteBuffer;)V" />
+ <method name="engineUpdate([BII)V" />
+ </class>
+ <class name="java/security/NoSuchAlgorithmException" since="1">
+ <extends name="java/security/GeneralSecurityException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/security/NoSuchProviderException" since="1">
+ <extends name="java/security/GeneralSecurityException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/security/Permission" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/security/Guard" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getActions()Ljava/lang/String;" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="implies(Ljava/security/Permission;)Z" />
+ <method name="newPermissionCollection()Ljava/security/PermissionCollection;" />
+ </class>
+ <class name="java/security/PermissionCollection" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>()V" />
+ <method name="add(Ljava/security/Permission;)V" />
+ <method name="elements()Ljava/util/Enumeration;" />
+ <method name="implies(Ljava/security/Permission;)Z" />
+ <method name="isReadOnly()Z" />
+ <method name="setReadOnly()V" />
+ </class>
+ <class name="java/security/Permissions" since="1">
+ <extends name="java/security/PermissionCollection" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/security/Policy" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Policy$Parameters;)Ljava/security/Policy;" since="9" />
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Policy$Parameters;Ljava/lang/String;)Ljava/security/Policy;" since="9" />
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Policy$Parameters;Ljava/security/Provider;)Ljava/security/Policy;" since="9" />
+ <method name="getParameters()Ljava/security/Policy$Parameters;" since="9" />
+ <method name="getPermissions(Ljava/security/CodeSource;)Ljava/security/PermissionCollection;" />
+ <method name="getPermissions(Ljava/security/ProtectionDomain;)Ljava/security/PermissionCollection;" />
+ <method name="getPolicy()Ljava/security/Policy;" />
+ <method name="getProvider()Ljava/security/Provider;" since="9" />
+ <method name="getType()Ljava/lang/String;" since="9" />
+ <method name="implies(Ljava/security/ProtectionDomain;Ljava/security/Permission;)Z" />
+ <method name="refresh()V" />
+ <method name="setPolicy(Ljava/security/Policy;)V" />
+ <field name="UNSUPPORTED_EMPTY_COLLECTION" since="9" />
+ </class>
+ <class name="java/security/Policy$Parameters" since="9">
+ <extends name="java/lang/Object" />
+ </class>
+ <class name="java/security/PolicySpi" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="engineGetPermissions(Ljava/security/CodeSource;)Ljava/security/PermissionCollection;" />
+ <method name="engineGetPermissions(Ljava/security/ProtectionDomain;)Ljava/security/PermissionCollection;" />
+ <method name="engineImplies(Ljava/security/ProtectionDomain;Ljava/security/Permission;)Z" />
+ <method name="engineRefresh()V" />
+ </class>
+ <class name="java/security/Principal" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getName()Ljava/lang/String;" />
+ </class>
+ <class name="java/security/PrivateKey" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/Key" />
+ <field name="serialVersionUID" />
+ </class>
+ <class name="java/security/PrivilegedAction" since="1">
+ <extends name="java/lang/Object" />
+ <method name="run()Ljava/lang/Object;" />
+ </class>
+ <class name="java/security/PrivilegedActionException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>(Ljava/lang/Exception;)V" />
+ <method name="getException()Ljava/lang/Exception;" />
+ </class>
+ <class name="java/security/PrivilegedExceptionAction" since="1">
+ <extends name="java/lang/Object" />
+ <method name="run()Ljava/lang/Object;" />
+ </class>
+ <class name="java/security/ProtectionDomain" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/security/CodeSource;Ljava/security/PermissionCollection;)V" />
+ <method name="&lt;init>(Ljava/security/CodeSource;Ljava/security/PermissionCollection;Ljava/lang/ClassLoader;[Ljava/security/Principal;)V" />
+ <method name="getClassLoader()Ljava/lang/ClassLoader;" />
+ <method name="getCodeSource()Ljava/security/CodeSource;" />
+ <method name="getPermissions()Ljava/security/PermissionCollection;" />
+ <method name="getPrincipals()[Ljava/security/Principal;" />
+ <method name="implies(Ljava/security/Permission;)Z" />
+ </class>
+ <class name="java/security/Provider" since="1">
+ <extends name="java/util/Properties" />
+ <method name="&lt;init>(Ljava/lang/String;DLjava/lang/String;)V" />
+ <method name="getInfo()Ljava/lang/String;" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getService(Ljava/lang/String;Ljava/lang/String;)Ljava/security/Provider$Service;" />
+ <method name="getServices()Ljava/util/Set;" />
+ <method name="getVersion()D" />
+ <method name="putService(Ljava/security/Provider$Service;)V" />
+ <method name="removeService(Ljava/security/Provider$Service;)V" />
+ </class>
+ <class name="java/security/Provider$Service" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/security/Provider;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/Map;)V" />
+ <method name="getAlgorithm()Ljava/lang/String;" />
+ <method name="getAttribute(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getClassName()Ljava/lang/String;" />
+ <method name="getProvider()Ljava/security/Provider;" />
+ <method name="getType()Ljava/lang/String;" />
+ <method name="newInstance(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="supportsParameter(Ljava/lang/Object;)Z" />
+ </class>
+ <class name="java/security/ProviderException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/security/PublicKey" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/Key" />
+ <field name="serialVersionUID" />
+ </class>
+ <class name="java/security/SecureClassLoader" since="1">
+ <extends name="java/lang/ClassLoader" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/ClassLoader;)V" />
+ <method name="defineClass(Ljava/lang/String;Ljava/nio/ByteBuffer;Ljava/security/CodeSource;)Ljava/lang/Class;" />
+ <method name="defineClass(Ljava/lang/String;[BIILjava/security/CodeSource;)Ljava/lang/Class;" />
+ <method name="getPermissions(Ljava/security/CodeSource;)Ljava/security/PermissionCollection;" />
+ </class>
+ <class name="java/security/SecureRandom" since="1">
+ <extends name="java/util/Random" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/security/SecureRandomSpi;Ljava/security/Provider;)V" />
+ <method name="&lt;init>([B)V" />
+ <method name="generateSeed(I)[B" />
+ <method name="getAlgorithm()Ljava/lang/String;" />
+ <method name="getInstance(Ljava/lang/String;)Ljava/security/SecureRandom;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/SecureRandom;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/SecureRandom;" />
+ <method name="getProvider()Ljava/security/Provider;" />
+ <method name="getSeed(I)[B" />
+ <method name="setSeed([B)V" />
+ </class>
+ <class name="java/security/SecureRandomSpi" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>()V" />
+ <method name="engineGenerateSeed(I)[B" />
+ <method name="engineNextBytes([B)V" />
+ <method name="engineSetSeed([B)V" />
+ </class>
+ <class name="java/security/Security" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addProvider(Ljava/security/Provider;)I" />
+ <method name="getAlgorithmProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getAlgorithms(Ljava/lang/String;)Ljava/util/Set;" />
+ <method name="getProperty(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getProvider(Ljava/lang/String;)Ljava/security/Provider;" />
+ <method name="getProviders()[Ljava/security/Provider;" />
+ <method name="getProviders(Ljava/lang/String;)[Ljava/security/Provider;" />
+ <method name="getProviders(Ljava/util/Map;)[Ljava/security/Provider;" />
+ <method name="insertProviderAt(Ljava/security/Provider;I)I" />
+ <method name="removeProvider(Ljava/lang/String;)V" />
+ <method name="setProperty(Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="java/security/SecurityPermission" since="1">
+ <extends name="java/security/BasicPermission" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="java/security/Signature" since="1">
+ <extends name="java/security/SignatureSpi" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getAlgorithm()Ljava/lang/String;" />
+ <method name="getInstance(Ljava/lang/String;)Ljava/security/Signature;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/Signature;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/Signature;" />
+ <method name="getParameter(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="getParameters()Ljava/security/AlgorithmParameters;" />
+ <method name="getProvider()Ljava/security/Provider;" />
+ <method name="initSign(Ljava/security/PrivateKey;)V" />
+ <method name="initSign(Ljava/security/PrivateKey;Ljava/security/SecureRandom;)V" />
+ <method name="initVerify(Ljava/security/PublicKey;)V" />
+ <method name="initVerify(Ljava/security/cert/Certificate;)V" />
+ <method name="setParameter(Ljava/lang/String;Ljava/lang/Object;)V" />
+ <method name="setParameter(Ljava/security/spec/AlgorithmParameterSpec;)V" />
+ <method name="sign()[B" />
+ <method name="sign([BII)I" />
+ <method name="update(B)V" />
+ <method name="update(Ljava/nio/ByteBuffer;)V" />
+ <method name="update([B)V" />
+ <method name="update([BII)V" />
+ <method name="verify([B)Z" />
+ <method name="verify([BII)Z" />
+ <field name="SIGN" />
+ <field name="UNINITIALIZED" />
+ <field name="VERIFY" />
+ <field name="state" />
+ </class>
+ <class name="java/security/SignatureException" since="1">
+ <extends name="java/security/GeneralSecurityException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/security/SignatureSpi" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="engineGetParameter(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="engineGetParameters()Ljava/security/AlgorithmParameters;" />
+ <method name="engineInitSign(Ljava/security/PrivateKey;)V" />
+ <method name="engineInitSign(Ljava/security/PrivateKey;Ljava/security/SecureRandom;)V" />
+ <method name="engineInitVerify(Ljava/security/PublicKey;)V" />
+ <method name="engineSetParameter(Ljava/lang/String;Ljava/lang/Object;)V" />
+ <method name="engineSetParameter(Ljava/security/spec/AlgorithmParameterSpec;)V" />
+ <method name="engineSign()[B" />
+ <method name="engineSign([BII)I" />
+ <method name="engineUpdate(B)V" />
+ <method name="engineUpdate(Ljava/nio/ByteBuffer;)V" />
+ <method name="engineUpdate([BII)V" />
+ <method name="engineVerify([B)Z" />
+ <method name="engineVerify([BII)Z" />
+ <field name="appRandom" />
+ </class>
+ <class name="java/security/SignedObject" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/io/Serializable;Ljava/security/PrivateKey;Ljava/security/Signature;)V" />
+ <method name="getAlgorithm()Ljava/lang/String;" />
+ <method name="getObject()Ljava/lang/Object;" />
+ <method name="getSignature()[B" />
+ <method name="verify(Ljava/security/PublicKey;Ljava/security/Signature;)Z" />
+ </class>
+ <class name="java/security/Signer" since="1">
+ <extends name="java/security/Identity" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/security/IdentityScope;)V" />
+ <method name="getPrivateKey()Ljava/security/PrivateKey;" />
+ <method name="setKeyPair(Ljava/security/KeyPair;)V" />
+ </class>
+ <class name="java/security/Timestamp" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/util/Date;Ljava/security/cert/CertPath;)V" />
+ <method name="getSignerCertPath()Ljava/security/cert/CertPath;" />
+ <method name="getTimestamp()Ljava/util/Date;" />
+ </class>
+ <class name="java/security/UnrecoverableEntryException" since="1">
+ <extends name="java/security/GeneralSecurityException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/security/UnrecoverableKeyException" since="1">
+ <extends name="java/security/GeneralSecurityException" />
+ <extends name="java/security/UnrecoverableEntryException" since="9" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/security/UnresolvedPermission" since="1">
+ <extends name="java/security/Permission" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/security/cert/Certificate;)V" />
+ <method name="getUnresolvedActions()Ljava/lang/String;" />
+ <method name="getUnresolvedCerts()[Ljava/security/cert/Certificate;" />
+ <method name="getUnresolvedName()Ljava/lang/String;" />
+ <method name="getUnresolvedType()Ljava/lang/String;" />
+ </class>
+ <class name="java/security/acl/Acl" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/acl/Owner" />
+ <method name="addEntry(Ljava/security/Principal;Ljava/security/acl/AclEntry;)Z" />
+ <method name="checkPermission(Ljava/security/Principal;Ljava/security/acl/Permission;)Z" />
+ <method name="entries()Ljava/util/Enumeration;" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getPermissions(Ljava/security/Principal;)Ljava/util/Enumeration;" />
+ <method name="removeEntry(Ljava/security/Principal;Ljava/security/acl/AclEntry;)Z" />
+ <method name="setName(Ljava/security/Principal;Ljava/lang/String;)V" />
+ </class>
+ <class name="java/security/acl/AclEntry" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <method name="addPermission(Ljava/security/acl/Permission;)Z" />
+ <method name="checkPermission(Ljava/security/acl/Permission;)Z" />
+ <method name="getPrincipal()Ljava/security/Principal;" />
+ <method name="isNegative()Z" />
+ <method name="permissions()Ljava/util/Enumeration;" />
+ <method name="removePermission(Ljava/security/acl/Permission;)Z" />
+ <method name="setNegativePermissions()V" />
+ <method name="setPrincipal(Ljava/security/Principal;)Z" />
+ </class>
+ <class name="java/security/acl/AclNotFoundException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/security/acl/Group" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/Principal" />
+ <method name="addMember(Ljava/security/Principal;)Z" />
+ <method name="isMember(Ljava/security/Principal;)Z" />
+ <method name="members()Ljava/util/Enumeration;" />
+ <method name="removeMember(Ljava/security/Principal;)Z" />
+ </class>
+ <class name="java/security/acl/LastOwnerException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/security/acl/NotOwnerException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/security/acl/Owner" since="1">
+ <extends name="java/lang/Object" />
+ <method name="addOwner(Ljava/security/Principal;Ljava/security/Principal;)Z" />
+ <method name="deleteOwner(Ljava/security/Principal;Ljava/security/Principal;)Z" />
+ <method name="isOwner(Ljava/security/Principal;)Z" />
+ </class>
+ <class name="java/security/acl/Permission" since="1">
+ <extends name="java/lang/Object" />
+ </class>
+ <class name="java/security/cert/CRL" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getType()Ljava/lang/String;" />
+ <method name="isRevoked(Ljava/security/cert/Certificate;)Z" />
+ </class>
+ <class name="java/security/cert/CRLException" since="1">
+ <extends name="java/security/GeneralSecurityException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/security/cert/CRLSelector" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <method name="match(Ljava/security/cert/CRL;)Z" />
+ </class>
+ <class name="java/security/cert/CertPath" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getCertificates()Ljava/util/List;" />
+ <method name="getEncoded()[B" />
+ <method name="getEncoded(Ljava/lang/String;)[B" />
+ <method name="getEncodings()Ljava/util/Iterator;" />
+ <method name="getType()Ljava/lang/String;" />
+ <method name="writeReplace()Ljava/lang/Object;" />
+ </class>
+ <class name="java/security/cert/CertPath$CertPathRep" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/lang/String;[B)V" />
+ <method name="readResolve()Ljava/lang/Object;" />
+ </class>
+ <class name="java/security/cert/CertPathBuilder" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/security/cert/CertPathBuilderSpi;Ljava/security/Provider;Ljava/lang/String;)V" />
+ <method name="build(Ljava/security/cert/CertPathParameters;)Ljava/security/cert/CertPathBuilderResult;" />
+ <method name="getAlgorithm()Ljava/lang/String;" />
+ <method name="getDefaultType()Ljava/lang/String;" />
+ <method name="getInstance(Ljava/lang/String;)Ljava/security/cert/CertPathBuilder;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/cert/CertPathBuilder;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/cert/CertPathBuilder;" />
+ <method name="getProvider()Ljava/security/Provider;" />
+ </class>
+ <class name="java/security/cert/CertPathBuilderException" since="1">
+ <extends name="java/security/GeneralSecurityException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/security/cert/CertPathBuilderResult" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <method name="getCertPath()Ljava/security/cert/CertPath;" />
+ </class>
+ <class name="java/security/cert/CertPathBuilderSpi" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="engineBuild(Ljava/security/cert/CertPathParameters;)Ljava/security/cert/CertPathBuilderResult;" />
+ </class>
+ <class name="java/security/cert/CertPathParameters" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ </class>
+ <class name="java/security/cert/CertPathValidator" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/security/cert/CertPathValidatorSpi;Ljava/security/Provider;Ljava/lang/String;)V" />
+ <method name="getAlgorithm()Ljava/lang/String;" />
+ <method name="getDefaultType()Ljava/lang/String;" />
+ <method name="getInstance(Ljava/lang/String;)Ljava/security/cert/CertPathValidator;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/cert/CertPathValidator;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/cert/CertPathValidator;" />
+ <method name="getProvider()Ljava/security/Provider;" />
+ <method name="validate(Ljava/security/cert/CertPath;Ljava/security/cert/CertPathParameters;)Ljava/security/cert/CertPathValidatorResult;" />
+ </class>
+ <class name="java/security/cert/CertPathValidatorException" since="1">
+ <extends name="java/security/GeneralSecurityException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;Ljava/security/cert/CertPath;I)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ <method name="getCertPath()Ljava/security/cert/CertPath;" />
+ <method name="getIndex()I" />
+ </class>
+ <class name="java/security/cert/CertPathValidatorResult" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ </class>
+ <class name="java/security/cert/CertPathValidatorSpi" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="engineValidate(Ljava/security/cert/CertPath;Ljava/security/cert/CertPathParameters;)Ljava/security/cert/CertPathValidatorResult;" />
+ </class>
+ <class name="java/security/cert/CertSelector" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <method name="match(Ljava/security/cert/Certificate;)Z" />
+ </class>
+ <class name="java/security/cert/CertStore" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/security/cert/CertStoreSpi;Ljava/security/Provider;Ljava/lang/String;Ljava/security/cert/CertStoreParameters;)V" />
+ <method name="getCRLs(Ljava/security/cert/CRLSelector;)Ljava/util/Collection;" />
+ <method name="getCertStoreParameters()Ljava/security/cert/CertStoreParameters;" />
+ <method name="getCertificates(Ljava/security/cert/CertSelector;)Ljava/util/Collection;" />
+ <method name="getDefaultType()Ljava/lang/String;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/security/cert/CertStoreParameters;)Ljava/security/cert/CertStore;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/security/cert/CertStoreParameters;Ljava/lang/String;)Ljava/security/cert/CertStore;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/security/cert/CertStoreParameters;Ljava/security/Provider;)Ljava/security/cert/CertStore;" />
+ <method name="getProvider()Ljava/security/Provider;" />
+ <method name="getType()Ljava/lang/String;" />
+ </class>
+ <class name="java/security/cert/CertStoreException" since="1">
+ <extends name="java/security/GeneralSecurityException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/security/cert/CertStoreParameters" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ </class>
+ <class name="java/security/cert/CertStoreSpi" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/security/cert/CertStoreParameters;)V" />
+ <method name="engineGetCRLs(Ljava/security/cert/CRLSelector;)Ljava/util/Collection;" />
+ <method name="engineGetCertificates(Ljava/security/cert/CertSelector;)Ljava/util/Collection;" />
+ </class>
+ <class name="java/security/cert/Certificate" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getEncoded()[B" />
+ <method name="getPublicKey()Ljava/security/PublicKey;" />
+ <method name="getType()Ljava/lang/String;" />
+ <method name="verify(Ljava/security/PublicKey;)V" />
+ <method name="verify(Ljava/security/PublicKey;Ljava/lang/String;)V" />
+ <method name="writeReplace()Ljava/lang/Object;" />
+ </class>
+ <class name="java/security/cert/Certificate$CertificateRep" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/lang/String;[B)V" />
+ <method name="readResolve()Ljava/lang/Object;" />
+ </class>
+ <class name="java/security/cert/CertificateEncodingException" since="1">
+ <extends name="java/security/cert/CertificateException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/security/cert/CertificateException" since="1">
+ <extends name="java/security/GeneralSecurityException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/security/cert/CertificateExpiredException" since="1">
+ <extends name="java/security/cert/CertificateException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/security/cert/CertificateFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/security/cert/CertificateFactorySpi;Ljava/security/Provider;Ljava/lang/String;)V" />
+ <method name="generateCRL(Ljava/io/InputStream;)Ljava/security/cert/CRL;" />
+ <method name="generateCRLs(Ljava/io/InputStream;)Ljava/util/Collection;" />
+ <method name="generateCertPath(Ljava/io/InputStream;)Ljava/security/cert/CertPath;" />
+ <method name="generateCertPath(Ljava/io/InputStream;Ljava/lang/String;)Ljava/security/cert/CertPath;" />
+ <method name="generateCertPath(Ljava/util/List;)Ljava/security/cert/CertPath;" />
+ <method name="generateCertificate(Ljava/io/InputStream;)Ljava/security/cert/Certificate;" />
+ <method name="generateCertificates(Ljava/io/InputStream;)Ljava/util/Collection;" />
+ <method name="getCertPathEncodings()Ljava/util/Iterator;" />
+ <method name="getInstance(Ljava/lang/String;)Ljava/security/cert/CertificateFactory;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljava/security/cert/CertificateFactory;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljava/security/cert/CertificateFactory;" />
+ <method name="getProvider()Ljava/security/Provider;" />
+ <method name="getType()Ljava/lang/String;" />
+ </class>
+ <class name="java/security/cert/CertificateFactorySpi" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="engineGenerateCRL(Ljava/io/InputStream;)Ljava/security/cert/CRL;" />
+ <method name="engineGenerateCRLs(Ljava/io/InputStream;)Ljava/util/Collection;" />
+ <method name="engineGenerateCertPath(Ljava/io/InputStream;)Ljava/security/cert/CertPath;" />
+ <method name="engineGenerateCertPath(Ljava/io/InputStream;Ljava/lang/String;)Ljava/security/cert/CertPath;" />
+ <method name="engineGenerateCertPath(Ljava/util/List;)Ljava/security/cert/CertPath;" />
+ <method name="engineGenerateCertificate(Ljava/io/InputStream;)Ljava/security/cert/Certificate;" />
+ <method name="engineGenerateCertificates(Ljava/io/InputStream;)Ljava/util/Collection;" />
+ <method name="engineGetCertPathEncodings()Ljava/util/Iterator;" />
+ </class>
+ <class name="java/security/cert/CertificateNotYetValidException" since="1">
+ <extends name="java/security/cert/CertificateException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/security/cert/CertificateParsingException" since="1">
+ <extends name="java/security/cert/CertificateException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/security/cert/CollectionCertStoreParameters" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/cert/CertStoreParameters" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/util/Collection;)V" />
+ <method name="getCollection()Ljava/util/Collection;" />
+ </class>
+ <class name="java/security/cert/LDAPCertStoreParameters" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/cert/CertStoreParameters" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;I)V" />
+ <method name="getPort()I" />
+ <method name="getServerName()Ljava/lang/String;" />
+ </class>
+ <class name="java/security/cert/PKIXBuilderParameters" since="1">
+ <extends name="java/security/cert/PKIXParameters" />
+ <method name="&lt;init>(Ljava/security/KeyStore;Ljava/security/cert/CertSelector;)V" />
+ <method name="&lt;init>(Ljava/util/Set;Ljava/security/cert/CertSelector;)V" />
+ <method name="getMaxPathLength()I" />
+ <method name="setMaxPathLength(I)V" />
+ </class>
+ <class name="java/security/cert/PKIXCertPathBuilderResult" since="1">
+ <extends name="java/security/cert/PKIXCertPathValidatorResult" />
+ <implements name="java/security/cert/CertPathBuilderResult" />
+ <method name="&lt;init>(Ljava/security/cert/CertPath;Ljava/security/cert/TrustAnchor;Ljava/security/cert/PolicyNode;Ljava/security/PublicKey;)V" />
+ </class>
+ <class name="java/security/cert/PKIXCertPathChecker" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>()V" />
+ <method name="check(Ljava/security/cert/Certificate;Ljava/util/Collection;)V" />
+ <method name="getSupportedExtensions()Ljava/util/Set;" />
+ <method name="init(Z)V" />
+ <method name="isForwardCheckingSupported()Z" />
+ </class>
+ <class name="java/security/cert/PKIXCertPathValidatorResult" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/cert/CertPathValidatorResult" />
+ <method name="&lt;init>(Ljava/security/cert/TrustAnchor;Ljava/security/cert/PolicyNode;Ljava/security/PublicKey;)V" />
+ <method name="getPolicyTree()Ljava/security/cert/PolicyNode;" />
+ <method name="getPublicKey()Ljava/security/PublicKey;" />
+ <method name="getTrustAnchor()Ljava/security/cert/TrustAnchor;" />
+ </class>
+ <class name="java/security/cert/PKIXParameters" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/cert/CertPathParameters" />
+ <method name="&lt;init>(Ljava/security/KeyStore;)V" />
+ <method name="&lt;init>(Ljava/util/Set;)V" />
+ <method name="addCertPathChecker(Ljava/security/cert/PKIXCertPathChecker;)V" />
+ <method name="addCertStore(Ljava/security/cert/CertStore;)V" />
+ <method name="getCertPathCheckers()Ljava/util/List;" />
+ <method name="getCertStores()Ljava/util/List;" />
+ <method name="getDate()Ljava/util/Date;" />
+ <method name="getInitialPolicies()Ljava/util/Set;" />
+ <method name="getPolicyQualifiersRejected()Z" />
+ <method name="getSigProvider()Ljava/lang/String;" />
+ <method name="getTargetCertConstraints()Ljava/security/cert/CertSelector;" />
+ <method name="getTrustAnchors()Ljava/util/Set;" />
+ <method name="isAnyPolicyInhibited()Z" />
+ <method name="isExplicitPolicyRequired()Z" />
+ <method name="isPolicyMappingInhibited()Z" />
+ <method name="isRevocationEnabled()Z" />
+ <method name="setAnyPolicyInhibited(Z)V" />
+ <method name="setCertPathCheckers(Ljava/util/List;)V" />
+ <method name="setCertStores(Ljava/util/List;)V" />
+ <method name="setDate(Ljava/util/Date;)V" />
+ <method name="setExplicitPolicyRequired(Z)V" />
+ <method name="setInitialPolicies(Ljava/util/Set;)V" />
+ <method name="setPolicyMappingInhibited(Z)V" />
+ <method name="setPolicyQualifiersRejected(Z)V" />
+ <method name="setRevocationEnabled(Z)V" />
+ <method name="setSigProvider(Ljava/lang/String;)V" />
+ <method name="setTargetCertConstraints(Ljava/security/cert/CertSelector;)V" />
+ <method name="setTrustAnchors(Ljava/util/Set;)V" />
+ </class>
+ <class name="java/security/cert/PolicyNode" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getChildren()Ljava/util/Iterator;" />
+ <method name="getDepth()I" />
+ <method name="getExpectedPolicies()Ljava/util/Set;" />
+ <method name="getParent()Ljava/security/cert/PolicyNode;" />
+ <method name="getPolicyQualifiers()Ljava/util/Set;" />
+ <method name="getValidPolicy()Ljava/lang/String;" />
+ <method name="isCritical()Z" />
+ </class>
+ <class name="java/security/cert/PolicyQualifierInfo" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>([B)V" />
+ <method name="getEncoded()[B" />
+ <method name="getPolicyQualifier()[B" />
+ <method name="getPolicyQualifierId()Ljava/lang/String;" />
+ </class>
+ <class name="java/security/cert/TrustAnchor" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/security/PublicKey;[B)V" />
+ <method name="&lt;init>(Ljava/security/cert/X509Certificate;[B)V" />
+ <method name="&lt;init>(Ljavax/security/auth/x500/X500Principal;Ljava/security/PublicKey;[B)V" />
+ <method name="getCA()Ljavax/security/auth/x500/X500Principal;" />
+ <method name="getCAName()Ljava/lang/String;" />
+ <method name="getCAPublicKey()Ljava/security/PublicKey;" />
+ <method name="getNameConstraints()[B" />
+ <method name="getTrustedCert()Ljava/security/cert/X509Certificate;" />
+ </class>
+ <class name="java/security/cert/X509CRL" since="1">
+ <extends name="java/security/cert/CRL" />
+ <implements name="java/security/cert/X509Extension" />
+ <method name="&lt;init>()V" />
+ <method name="getEncoded()[B" />
+ <method name="getIssuerDN()Ljava/security/Principal;" />
+ <method name="getIssuerX500Principal()Ljavax/security/auth/x500/X500Principal;" />
+ <method name="getNextUpdate()Ljava/util/Date;" />
+ <method name="getRevokedCertificate(Ljava/math/BigInteger;)Ljava/security/cert/X509CRLEntry;" />
+ <method name="getRevokedCertificate(Ljava/security/cert/X509Certificate;)Ljava/security/cert/X509CRLEntry;" />
+ <method name="getRevokedCertificates()Ljava/util/Set;" />
+ <method name="getSigAlgName()Ljava/lang/String;" />
+ <method name="getSigAlgOID()Ljava/lang/String;" />
+ <method name="getSigAlgParams()[B" />
+ <method name="getSignature()[B" />
+ <method name="getTBSCertList()[B" />
+ <method name="getThisUpdate()Ljava/util/Date;" />
+ <method name="getVersion()I" />
+ <method name="verify(Ljava/security/PublicKey;)V" />
+ <method name="verify(Ljava/security/PublicKey;Ljava/lang/String;)V" />
+ </class>
+ <class name="java/security/cert/X509CRLEntry" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/cert/X509Extension" />
+ <method name="&lt;init>()V" />
+ <method name="getCertificateIssuer()Ljavax/security/auth/x500/X500Principal;" />
+ <method name="getEncoded()[B" />
+ <method name="getRevocationDate()Ljava/util/Date;" />
+ <method name="getSerialNumber()Ljava/math/BigInteger;" />
+ <method name="hasExtensions()Z" />
+ </class>
+ <class name="java/security/cert/X509CRLSelector" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/cert/CRLSelector" />
+ <method name="&lt;init>()V" />
+ <method name="addIssuer(Ljavax/security/auth/x500/X500Principal;)V" />
+ <method name="addIssuerName(Ljava/lang/String;)V" />
+ <method name="addIssuerName([B)V" />
+ <method name="getCertificateChecking()Ljava/security/cert/X509Certificate;" />
+ <method name="getDateAndTime()Ljava/util/Date;" />
+ <method name="getIssuerNames()Ljava/util/Collection;" />
+ <method name="getIssuers()Ljava/util/Collection;" />
+ <method name="getMaxCRL()Ljava/math/BigInteger;" />
+ <method name="getMinCRL()Ljava/math/BigInteger;" />
+ <method name="setCertificateChecking(Ljava/security/cert/X509Certificate;)V" />
+ <method name="setDateAndTime(Ljava/util/Date;)V" />
+ <method name="setIssuerNames(Ljava/util/Collection;)V" />
+ <method name="setIssuers(Ljava/util/Collection;)V" />
+ <method name="setMaxCRLNumber(Ljava/math/BigInteger;)V" />
+ <method name="setMinCRLNumber(Ljava/math/BigInteger;)V" />
+ </class>
+ <class name="java/security/cert/X509CertSelector" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/cert/CertSelector" />
+ <method name="&lt;init>()V" />
+ <method name="addPathToName(ILjava/lang/String;)V" />
+ <method name="addPathToName(I[B)V" />
+ <method name="addSubjectAlternativeName(ILjava/lang/String;)V" />
+ <method name="addSubjectAlternativeName(I[B)V" />
+ <method name="getAuthorityKeyIdentifier()[B" />
+ <method name="getBasicConstraints()I" />
+ <method name="getCertificate()Ljava/security/cert/X509Certificate;" />
+ <method name="getCertificateValid()Ljava/util/Date;" />
+ <method name="getExtendedKeyUsage()Ljava/util/Set;" />
+ <method name="getIssuer()Ljavax/security/auth/x500/X500Principal;" />
+ <method name="getIssuerAsBytes()[B" />
+ <method name="getIssuerAsString()Ljava/lang/String;" />
+ <method name="getKeyUsage()[Z" />
+ <method name="getMatchAllSubjectAltNames()Z" />
+ <method name="getNameConstraints()[B" />
+ <method name="getPathToNames()Ljava/util/Collection;" />
+ <method name="getPolicy()Ljava/util/Set;" />
+ <method name="getPrivateKeyValid()Ljava/util/Date;" />
+ <method name="getSerialNumber()Ljava/math/BigInteger;" />
+ <method name="getSubject()Ljavax/security/auth/x500/X500Principal;" />
+ <method name="getSubjectAlternativeNames()Ljava/util/Collection;" />
+ <method name="getSubjectAsBytes()[B" />
+ <method name="getSubjectAsString()Ljava/lang/String;" />
+ <method name="getSubjectKeyIdentifier()[B" />
+ <method name="getSubjectPublicKey()Ljava/security/PublicKey;" />
+ <method name="getSubjectPublicKeyAlgID()Ljava/lang/String;" />
+ <method name="setAuthorityKeyIdentifier([B)V" />
+ <method name="setBasicConstraints(I)V" />
+ <method name="setCertificate(Ljava/security/cert/X509Certificate;)V" />
+ <method name="setCertificateValid(Ljava/util/Date;)V" />
+ <method name="setExtendedKeyUsage(Ljava/util/Set;)V" />
+ <method name="setIssuer(Ljava/lang/String;)V" />
+ <method name="setIssuer(Ljavax/security/auth/x500/X500Principal;)V" />
+ <method name="setIssuer([B)V" />
+ <method name="setKeyUsage([Z)V" />
+ <method name="setMatchAllSubjectAltNames(Z)V" />
+ <method name="setNameConstraints([B)V" />
+ <method name="setPathToNames(Ljava/util/Collection;)V" />
+ <method name="setPolicy(Ljava/util/Set;)V" />
+ <method name="setPrivateKeyValid(Ljava/util/Date;)V" />
+ <method name="setSerialNumber(Ljava/math/BigInteger;)V" />
+ <method name="setSubject(Ljava/lang/String;)V" />
+ <method name="setSubject(Ljavax/security/auth/x500/X500Principal;)V" />
+ <method name="setSubject([B)V" />
+ <method name="setSubjectAlternativeNames(Ljava/util/Collection;)V" />
+ <method name="setSubjectKeyIdentifier([B)V" />
+ <method name="setSubjectPublicKey(Ljava/security/PublicKey;)V" />
+ <method name="setSubjectPublicKey([B)V" />
+ <method name="setSubjectPublicKeyAlgID(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/security/cert/X509Certificate" since="1">
+ <extends name="java/security/cert/Certificate" />
+ <implements name="java/security/cert/X509Extension" />
+ <method name="&lt;init>()V" />
+ <method name="checkValidity()V" />
+ <method name="checkValidity(Ljava/util/Date;)V" />
+ <method name="getBasicConstraints()I" />
+ <method name="getExtendedKeyUsage()Ljava/util/List;" />
+ <method name="getIssuerAlternativeNames()Ljava/util/Collection;" />
+ <method name="getIssuerDN()Ljava/security/Principal;" />
+ <method name="getIssuerUniqueID()[Z" />
+ <method name="getIssuerX500Principal()Ljavax/security/auth/x500/X500Principal;" />
+ <method name="getKeyUsage()[Z" />
+ <method name="getNotAfter()Ljava/util/Date;" />
+ <method name="getNotBefore()Ljava/util/Date;" />
+ <method name="getSerialNumber()Ljava/math/BigInteger;" />
+ <method name="getSigAlgName()Ljava/lang/String;" />
+ <method name="getSigAlgOID()Ljava/lang/String;" />
+ <method name="getSigAlgParams()[B" />
+ <method name="getSignature()[B" />
+ <method name="getSubjectAlternativeNames()Ljava/util/Collection;" />
+ <method name="getSubjectDN()Ljava/security/Principal;" />
+ <method name="getSubjectUniqueID()[Z" />
+ <method name="getSubjectX500Principal()Ljavax/security/auth/x500/X500Principal;" />
+ <method name="getTBSCertificate()[B" />
+ <method name="getVersion()I" />
+ </class>
+ <class name="java/security/cert/X509Extension" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getCriticalExtensionOIDs()Ljava/util/Set;" />
+ <method name="getExtensionValue(Ljava/lang/String;)[B" />
+ <method name="getNonCriticalExtensionOIDs()Ljava/util/Set;" />
+ <method name="hasUnsupportedCriticalExtension()Z" />
+ </class>
+ <class name="java/security/interfaces/DSAKey" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getParams()Ljava/security/interfaces/DSAParams;" />
+ </class>
+ <class name="java/security/interfaces/DSAKeyPairGenerator" since="1">
+ <extends name="java/lang/Object" />
+ <method name="initialize(IZLjava/security/SecureRandom;)V" />
+ <method name="initialize(Ljava/security/interfaces/DSAParams;Ljava/security/SecureRandom;)V" />
+ </class>
+ <class name="java/security/interfaces/DSAParams" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getG()Ljava/math/BigInteger;" />
+ <method name="getP()Ljava/math/BigInteger;" />
+ <method name="getQ()Ljava/math/BigInteger;" />
+ </class>
+ <class name="java/security/interfaces/DSAPrivateKey" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/PrivateKey" />
+ <implements name="java/security/interfaces/DSAKey" />
+ <method name="getX()Ljava/math/BigInteger;" />
+ <field name="serialVersionUID" />
+ </class>
+ <class name="java/security/interfaces/DSAPublicKey" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/PublicKey" />
+ <implements name="java/security/interfaces/DSAKey" />
+ <method name="getY()Ljava/math/BigInteger;" />
+ <field name="serialVersionUID" />
+ </class>
+ <class name="java/security/interfaces/ECKey" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getParams()Ljava/security/spec/ECParameterSpec;" />
+ </class>
+ <class name="java/security/interfaces/ECPrivateKey" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/PrivateKey" />
+ <implements name="java/security/interfaces/ECKey" />
+ <method name="getS()Ljava/math/BigInteger;" />
+ <field name="serialVersionUID" />
+ </class>
+ <class name="java/security/interfaces/ECPublicKey" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/PublicKey" />
+ <implements name="java/security/interfaces/ECKey" />
+ <method name="getW()Ljava/security/spec/ECPoint;" />
+ <field name="serialVersionUID" />
+ </class>
+ <class name="java/security/interfaces/RSAKey" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getModulus()Ljava/math/BigInteger;" />
+ </class>
+ <class name="java/security/interfaces/RSAMultiPrimePrivateCrtKey" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/interfaces/RSAPrivateKey" />
+ <method name="getCrtCoefficient()Ljava/math/BigInteger;" />
+ <method name="getOtherPrimeInfo()[Ljava/security/spec/RSAOtherPrimeInfo;" />
+ <method name="getPrimeExponentP()Ljava/math/BigInteger;" />
+ <method name="getPrimeExponentQ()Ljava/math/BigInteger;" />
+ <method name="getPrimeP()Ljava/math/BigInteger;" />
+ <method name="getPrimeQ()Ljava/math/BigInteger;" />
+ <method name="getPublicExponent()Ljava/math/BigInteger;" />
+ <field name="serialVersionUID" />
+ </class>
+ <class name="java/security/interfaces/RSAPrivateCrtKey" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/interfaces/RSAPrivateKey" />
+ <method name="getCrtCoefficient()Ljava/math/BigInteger;" />
+ <method name="getPrimeExponentP()Ljava/math/BigInteger;" />
+ <method name="getPrimeExponentQ()Ljava/math/BigInteger;" />
+ <method name="getPrimeP()Ljava/math/BigInteger;" />
+ <method name="getPrimeQ()Ljava/math/BigInteger;" />
+ <method name="getPublicExponent()Ljava/math/BigInteger;" />
+ <field name="serialVersionUID" />
+ </class>
+ <class name="java/security/interfaces/RSAPrivateKey" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/PrivateKey" />
+ <implements name="java/security/interfaces/RSAKey" />
+ <method name="getPrivateExponent()Ljava/math/BigInteger;" />
+ <field name="serialVersionUID" />
+ </class>
+ <class name="java/security/interfaces/RSAPublicKey" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/PublicKey" />
+ <implements name="java/security/interfaces/RSAKey" />
+ <method name="getPublicExponent()Ljava/math/BigInteger;" />
+ <field name="serialVersionUID" />
+ </class>
+ <class name="java/security/spec/AlgorithmParameterSpec" since="1">
+ <extends name="java/lang/Object" />
+ </class>
+ <class name="java/security/spec/DSAParameterSpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/interfaces/DSAParams" />
+ <implements name="java/security/spec/AlgorithmParameterSpec" />
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)V" />
+ </class>
+ <class name="java/security/spec/DSAPrivateKeySpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/KeySpec" />
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)V" />
+ <method name="getG()Ljava/math/BigInteger;" />
+ <method name="getP()Ljava/math/BigInteger;" />
+ <method name="getQ()Ljava/math/BigInteger;" />
+ <method name="getX()Ljava/math/BigInteger;" />
+ </class>
+ <class name="java/security/spec/DSAPublicKeySpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/KeySpec" />
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)V" />
+ <method name="getG()Ljava/math/BigInteger;" />
+ <method name="getP()Ljava/math/BigInteger;" />
+ <method name="getQ()Ljava/math/BigInteger;" />
+ <method name="getY()Ljava/math/BigInteger;" />
+ </class>
+ <class name="java/security/spec/ECField" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getFieldSize()I" />
+ </class>
+ <class name="java/security/spec/ECFieldF2m" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/ECField" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(ILjava/math/BigInteger;)V" />
+ <method name="&lt;init>(I[I)V" />
+ <method name="getM()I" />
+ <method name="getMidTermsOfReductionPolynomial()[I" />
+ <method name="getReductionPolynomial()Ljava/math/BigInteger;" />
+ </class>
+ <class name="java/security/spec/ECFieldFp" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/ECField" />
+ <method name="&lt;init>(Ljava/math/BigInteger;)V" />
+ <method name="getP()Ljava/math/BigInteger;" />
+ </class>
+ <class name="java/security/spec/ECGenParameterSpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/AlgorithmParameterSpec" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getName()Ljava/lang/String;" />
+ </class>
+ <class name="java/security/spec/ECParameterSpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/AlgorithmParameterSpec" />
+ <method name="&lt;init>(Ljava/security/spec/EllipticCurve;Ljava/security/spec/ECPoint;Ljava/math/BigInteger;I)V" />
+ <method name="getCofactor()I" />
+ <method name="getCurve()Ljava/security/spec/EllipticCurve;" />
+ <method name="getGenerator()Ljava/security/spec/ECPoint;" />
+ <method name="getOrder()Ljava/math/BigInteger;" />
+ </class>
+ <class name="java/security/spec/ECPoint" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;)V" />
+ <method name="getAffineX()Ljava/math/BigInteger;" />
+ <method name="getAffineY()Ljava/math/BigInteger;" />
+ <field name="POINT_INFINITY" />
+ </class>
+ <class name="java/security/spec/ECPrivateKeySpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/KeySpec" />
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/security/spec/ECParameterSpec;)V" />
+ <method name="getParams()Ljava/security/spec/ECParameterSpec;" />
+ <method name="getS()Ljava/math/BigInteger;" />
+ </class>
+ <class name="java/security/spec/ECPublicKeySpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/KeySpec" />
+ <method name="&lt;init>(Ljava/security/spec/ECPoint;Ljava/security/spec/ECParameterSpec;)V" />
+ <method name="getParams()Ljava/security/spec/ECParameterSpec;" />
+ <method name="getW()Ljava/security/spec/ECPoint;" />
+ </class>
+ <class name="java/security/spec/EllipticCurve" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/math/BigInteger;)V" />
+ <method name="&lt;init>(Ljava/security/spec/ECField;Ljava/math/BigInteger;Ljava/math/BigInteger;[B)V" />
+ <method name="getA()Ljava/math/BigInteger;" />
+ <method name="getB()Ljava/math/BigInteger;" />
+ <method name="getField()Ljava/security/spec/ECField;" />
+ <method name="getSeed()[B" />
+ </class>
+ <class name="java/security/spec/EncodedKeySpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/KeySpec" />
+ <method name="&lt;init>([B)V" />
+ <method name="getEncoded()[B" />
+ <method name="getFormat()Ljava/lang/String;" />
+ </class>
+ <class name="java/security/spec/InvalidKeySpecException" since="1">
+ <extends name="java/security/GeneralSecurityException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/security/spec/InvalidParameterSpecException" since="1">
+ <extends name="java/security/GeneralSecurityException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/security/spec/KeySpec" since="1">
+ <extends name="java/lang/Object" />
+ </class>
+ <class name="java/security/spec/MGF1ParameterSpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/AlgorithmParameterSpec" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getDigestAlgorithm()Ljava/lang/String;" />
+ <field name="SHA1" />
+ <field name="SHA256" />
+ <field name="SHA384" />
+ <field name="SHA512" />
+ </class>
+ <class name="java/security/spec/PKCS8EncodedKeySpec" since="1">
+ <extends name="java/security/spec/EncodedKeySpec" />
+ <method name="&lt;init>([B)V" />
+ </class>
+ <class name="java/security/spec/PSSParameterSpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/AlgorithmParameterSpec" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/security/spec/AlgorithmParameterSpec;II)V" />
+ <method name="getDigestAlgorithm()Ljava/lang/String;" />
+ <method name="getMGFAlgorithm()Ljava/lang/String;" />
+ <method name="getMGFParameters()Ljava/security/spec/AlgorithmParameterSpec;" />
+ <method name="getSaltLength()I" />
+ <method name="getTrailerField()I" />
+ <field name="DEFAULT" />
+ </class>
+ <class name="java/security/spec/RSAKeyGenParameterSpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/AlgorithmParameterSpec" />
+ <method name="&lt;init>(ILjava/math/BigInteger;)V" />
+ <method name="getKeysize()I" />
+ <method name="getPublicExponent()Ljava/math/BigInteger;" />
+ <field name="F0" />
+ <field name="F4" />
+ </class>
+ <class name="java/security/spec/RSAMultiPrimePrivateCrtKeySpec" since="1">
+ <extends name="java/security/spec/RSAPrivateKeySpec" />
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;[Ljava/security/spec/RSAOtherPrimeInfo;)V" />
+ <method name="getCrtCoefficient()Ljava/math/BigInteger;" />
+ <method name="getOtherPrimeInfo()[Ljava/security/spec/RSAOtherPrimeInfo;" />
+ <method name="getPrimeExponentP()Ljava/math/BigInteger;" />
+ <method name="getPrimeExponentQ()Ljava/math/BigInteger;" />
+ <method name="getPrimeP()Ljava/math/BigInteger;" />
+ <method name="getPrimeQ()Ljava/math/BigInteger;" />
+ <method name="getPublicExponent()Ljava/math/BigInteger;" />
+ </class>
+ <class name="java/security/spec/RSAOtherPrimeInfo" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)V" />
+ <method name="getCrtCoefficient()Ljava/math/BigInteger;" />
+ <method name="getExponent()Ljava/math/BigInteger;" />
+ <method name="getPrime()Ljava/math/BigInteger;" />
+ </class>
+ <class name="java/security/spec/RSAPrivateCrtKeySpec" since="1">
+ <extends name="java/security/spec/RSAPrivateKeySpec" />
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)V" />
+ <method name="getCrtCoefficient()Ljava/math/BigInteger;" />
+ <method name="getPrimeExponentP()Ljava/math/BigInteger;" />
+ <method name="getPrimeExponentQ()Ljava/math/BigInteger;" />
+ <method name="getPrimeP()Ljava/math/BigInteger;" />
+ <method name="getPrimeQ()Ljava/math/BigInteger;" />
+ <method name="getPublicExponent()Ljava/math/BigInteger;" />
+ </class>
+ <class name="java/security/spec/RSAPrivateKeySpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/KeySpec" />
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;)V" />
+ <method name="getModulus()Ljava/math/BigInteger;" />
+ <method name="getPrivateExponent()Ljava/math/BigInteger;" />
+ </class>
+ <class name="java/security/spec/RSAPublicKeySpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/KeySpec" />
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;)V" />
+ <method name="getModulus()Ljava/math/BigInteger;" />
+ <method name="getPublicExponent()Ljava/math/BigInteger;" />
+ </class>
+ <class name="java/security/spec/X509EncodedKeySpec" since="1">
+ <extends name="java/security/spec/EncodedKeySpec" />
+ <method name="&lt;init>([B)V" />
+ </class>
+ <class name="java/sql/Array" since="1">
+ <extends name="java/lang/Object" />
+ <method name="free()V" since="9" />
+ <method name="getArray()Ljava/lang/Object;" />
+ <method name="getArray(JI)Ljava/lang/Object;" />
+ <method name="getArray(JILjava/util/Map;)Ljava/lang/Object;" />
+ <method name="getArray(Ljava/util/Map;)Ljava/lang/Object;" />
+ <method name="getBaseType()I" />
+ <method name="getBaseTypeName()Ljava/lang/String;" />
+ <method name="getResultSet()Ljava/sql/ResultSet;" />
+ <method name="getResultSet(JI)Ljava/sql/ResultSet;" />
+ <method name="getResultSet(JILjava/util/Map;)Ljava/sql/ResultSet;" />
+ <method name="getResultSet(Ljava/util/Map;)Ljava/sql/ResultSet;" />
+ </class>
+ <class name="java/sql/BatchUpdateException" since="1">
+ <extends name="java/sql/SQLException" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I[I)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I[ILjava/lang/Throwable;)V" since="9" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;[I)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;[ILjava/lang/Throwable;)V" since="9" />
+ <method name="&lt;init>(Ljava/lang/String;[I)V" />
+ <method name="&lt;init>(Ljava/lang/String;[ILjava/lang/Throwable;)V" since="9" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" since="9" />
+ <method name="&lt;init>([I)V" />
+ <method name="&lt;init>([ILjava/lang/Throwable;)V" since="9" />
+ <method name="getUpdateCounts()[I" />
+ </class>
+ <class name="java/sql/Blob" since="1">
+ <extends name="java/lang/Object" />
+ <method name="free()V" since="9" />
+ <method name="getBinaryStream()Ljava/io/InputStream;" />
+ <method name="getBinaryStream(JJ)Ljava/io/InputStream;" since="9" />
+ <method name="getBytes(JI)[B" />
+ <method name="length()J" />
+ <method name="position(Ljava/sql/Blob;J)J" />
+ <method name="position([BJ)J" />
+ <method name="setBinaryStream(J)Ljava/io/OutputStream;" />
+ <method name="setBytes(J[B)I" />
+ <method name="setBytes(J[BII)I" />
+ <method name="truncate(J)V" />
+ </class>
+ <class name="java/sql/CallableStatement" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/sql/PreparedStatement" />
+ <method name="getArray(I)Ljava/sql/Array;" />
+ <method name="getArray(Ljava/lang/String;)Ljava/sql/Array;" />
+ <method name="getBigDecimal(I)Ljava/math/BigDecimal;" />
+ <method name="getBigDecimal(II)Ljava/math/BigDecimal;" />
+ <method name="getBigDecimal(Ljava/lang/String;)Ljava/math/BigDecimal;" />
+ <method name="getBlob(I)Ljava/sql/Blob;" />
+ <method name="getBlob(Ljava/lang/String;)Ljava/sql/Blob;" />
+ <method name="getBoolean(I)Z" />
+ <method name="getBoolean(Ljava/lang/String;)Z" />
+ <method name="getByte(I)B" />
+ <method name="getByte(Ljava/lang/String;)B" />
+ <method name="getBytes(I)[B" />
+ <method name="getBytes(Ljava/lang/String;)[B" />
+ <method name="getCharacterStream(I)Ljava/io/Reader;" since="9" />
+ <method name="getCharacterStream(Ljava/lang/String;)Ljava/io/Reader;" since="9" />
+ <method name="getClob(I)Ljava/sql/Clob;" />
+ <method name="getClob(Ljava/lang/String;)Ljava/sql/Clob;" />
+ <method name="getDate(I)Ljava/sql/Date;" />
+ <method name="getDate(ILjava/util/Calendar;)Ljava/sql/Date;" />
+ <method name="getDate(Ljava/lang/String;)Ljava/sql/Date;" />
+ <method name="getDate(Ljava/lang/String;Ljava/util/Calendar;)Ljava/sql/Date;" />
+ <method name="getDouble(I)D" />
+ <method name="getDouble(Ljava/lang/String;)D" />
+ <method name="getFloat(I)F" />
+ <method name="getFloat(Ljava/lang/String;)F" />
+ <method name="getInt(I)I" />
+ <method name="getInt(Ljava/lang/String;)I" />
+ <method name="getLong(I)J" />
+ <method name="getLong(Ljava/lang/String;)J" />
+ <method name="getNCharacterStream(I)Ljava/io/Reader;" since="9" />
+ <method name="getNCharacterStream(Ljava/lang/String;)Ljava/io/Reader;" since="9" />
+ <method name="getNClob(I)Ljava/sql/NClob;" since="9" />
+ <method name="getNClob(Ljava/lang/String;)Ljava/sql/NClob;" since="9" />
+ <method name="getNString(I)Ljava/lang/String;" since="9" />
+ <method name="getNString(Ljava/lang/String;)Ljava/lang/String;" since="9" />
+ <method name="getObject(I)Ljava/lang/Object;" />
+ <method name="getObject(ILjava/util/Map;)Ljava/lang/Object;" />
+ <method name="getObject(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="getObject(Ljava/lang/String;Ljava/util/Map;)Ljava/lang/Object;" />
+ <method name="getRef(I)Ljava/sql/Ref;" />
+ <method name="getRef(Ljava/lang/String;)Ljava/sql/Ref;" />
+ <method name="getRowId(I)Ljava/sql/RowId;" since="9" />
+ <method name="getRowId(Ljava/lang/String;)Ljava/sql/RowId;" since="9" />
+ <method name="getSQLXML(I)Ljava/sql/SQLXML;" since="9" />
+ <method name="getSQLXML(Ljava/lang/String;)Ljava/sql/SQLXML;" since="9" />
+ <method name="getShort(I)S" />
+ <method name="getShort(Ljava/lang/String;)S" />
+ <method name="getString(I)Ljava/lang/String;" />
+ <method name="getString(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getTime(I)Ljava/sql/Time;" />
+ <method name="getTime(ILjava/util/Calendar;)Ljava/sql/Time;" />
+ <method name="getTime(Ljava/lang/String;)Ljava/sql/Time;" />
+ <method name="getTime(Ljava/lang/String;Ljava/util/Calendar;)Ljava/sql/Time;" />
+ <method name="getTimestamp(I)Ljava/sql/Timestamp;" />
+ <method name="getTimestamp(ILjava/util/Calendar;)Ljava/sql/Timestamp;" />
+ <method name="getTimestamp(Ljava/lang/String;)Ljava/sql/Timestamp;" />
+ <method name="getTimestamp(Ljava/lang/String;Ljava/util/Calendar;)Ljava/sql/Timestamp;" />
+ <method name="getURL(I)Ljava/net/URL;" />
+ <method name="getURL(Ljava/lang/String;)Ljava/net/URL;" />
+ <method name="registerOutParameter(II)V" />
+ <method name="registerOutParameter(III)V" />
+ <method name="registerOutParameter(IILjava/lang/String;)V" />
+ <method name="registerOutParameter(Ljava/lang/String;I)V" />
+ <method name="registerOutParameter(Ljava/lang/String;II)V" />
+ <method name="registerOutParameter(Ljava/lang/String;ILjava/lang/String;)V" />
+ <method name="setAsciiStream(Ljava/lang/String;Ljava/io/InputStream;)V" since="9" />
+ <method name="setAsciiStream(Ljava/lang/String;Ljava/io/InputStream;I)V" />
+ <method name="setAsciiStream(Ljava/lang/String;Ljava/io/InputStream;J)V" since="9" />
+ <method name="setBigDecimal(Ljava/lang/String;Ljava/math/BigDecimal;)V" />
+ <method name="setBinaryStream(Ljava/lang/String;Ljava/io/InputStream;)V" since="9" />
+ <method name="setBinaryStream(Ljava/lang/String;Ljava/io/InputStream;I)V" />
+ <method name="setBinaryStream(Ljava/lang/String;Ljava/io/InputStream;J)V" since="9" />
+ <method name="setBlob(Ljava/lang/String;Ljava/io/InputStream;)V" since="9" />
+ <method name="setBlob(Ljava/lang/String;Ljava/io/InputStream;J)V" since="9" />
+ <method name="setBlob(Ljava/lang/String;Ljava/sql/Blob;)V" since="9" />
+ <method name="setBoolean(Ljava/lang/String;Z)V" />
+ <method name="setByte(Ljava/lang/String;B)V" />
+ <method name="setBytes(Ljava/lang/String;[B)V" />
+ <method name="setCharacterStream(Ljava/lang/String;Ljava/io/Reader;)V" since="9" />
+ <method name="setCharacterStream(Ljava/lang/String;Ljava/io/Reader;I)V" />
+ <method name="setCharacterStream(Ljava/lang/String;Ljava/io/Reader;J)V" since="9" />
+ <method name="setClob(Ljava/lang/String;Ljava/io/Reader;)V" since="9" />
+ <method name="setClob(Ljava/lang/String;Ljava/io/Reader;J)V" since="9" />
+ <method name="setClob(Ljava/lang/String;Ljava/sql/Clob;)V" since="9" />
+ <method name="setDate(Ljava/lang/String;Ljava/sql/Date;)V" />
+ <method name="setDate(Ljava/lang/String;Ljava/sql/Date;Ljava/util/Calendar;)V" />
+ <method name="setDouble(Ljava/lang/String;D)V" />
+ <method name="setFloat(Ljava/lang/String;F)V" />
+ <method name="setInt(Ljava/lang/String;I)V" />
+ <method name="setLong(Ljava/lang/String;J)V" />
+ <method name="setNCharacterStream(Ljava/lang/String;Ljava/io/Reader;)V" since="9" />
+ <method name="setNCharacterStream(Ljava/lang/String;Ljava/io/Reader;J)V" since="9" />
+ <method name="setNClob(Ljava/lang/String;Ljava/io/Reader;)V" since="9" />
+ <method name="setNClob(Ljava/lang/String;Ljava/io/Reader;J)V" since="9" />
+ <method name="setNClob(Ljava/lang/String;Ljava/sql/NClob;)V" since="9" />
+ <method name="setNString(Ljava/lang/String;Ljava/lang/String;)V" since="9" />
+ <method name="setNull(Ljava/lang/String;I)V" />
+ <method name="setNull(Ljava/lang/String;ILjava/lang/String;)V" />
+ <method name="setObject(Ljava/lang/String;Ljava/lang/Object;)V" />
+ <method name="setObject(Ljava/lang/String;Ljava/lang/Object;I)V" />
+ <method name="setObject(Ljava/lang/String;Ljava/lang/Object;II)V" />
+ <method name="setRowId(Ljava/lang/String;Ljava/sql/RowId;)V" since="9" />
+ <method name="setSQLXML(Ljava/lang/String;Ljava/sql/SQLXML;)V" since="9" />
+ <method name="setShort(Ljava/lang/String;S)V" />
+ <method name="setString(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="setTime(Ljava/lang/String;Ljava/sql/Time;)V" />
+ <method name="setTime(Ljava/lang/String;Ljava/sql/Time;Ljava/util/Calendar;)V" />
+ <method name="setTimestamp(Ljava/lang/String;Ljava/sql/Timestamp;)V" />
+ <method name="setTimestamp(Ljava/lang/String;Ljava/sql/Timestamp;Ljava/util/Calendar;)V" />
+ <method name="setURL(Ljava/lang/String;Ljava/net/URL;)V" />
+ <method name="wasNull()Z" />
+ </class>
+ <class name="java/sql/ClientInfoStatus" since="9">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Ljava/sql/ClientInfoStatus;" />
+ <method name="values()[Ljava/sql/ClientInfoStatus;" />
+ <field name="REASON_UNKNOWN" />
+ <field name="REASON_UNKNOWN_PROPERTY" />
+ <field name="REASON_VALUE_INVALID" />
+ <field name="REASON_VALUE_TRUNCATED" />
+ </class>
+ <class name="java/sql/Clob" since="1">
+ <extends name="java/lang/Object" />
+ <method name="free()V" since="9" />
+ <method name="getAsciiStream()Ljava/io/InputStream;" />
+ <method name="getCharacterStream()Ljava/io/Reader;" />
+ <method name="getCharacterStream(JJ)Ljava/io/Reader;" since="9" />
+ <method name="getSubString(JI)Ljava/lang/String;" />
+ <method name="length()J" />
+ <method name="position(Ljava/lang/String;J)J" />
+ <method name="position(Ljava/sql/Clob;J)J" />
+ <method name="setAsciiStream(J)Ljava/io/OutputStream;" />
+ <method name="setCharacterStream(J)Ljava/io/Writer;" />
+ <method name="setString(JLjava/lang/String;)I" />
+ <method name="setString(JLjava/lang/String;II)I" />
+ <method name="truncate(J)V" />
+ </class>
+ <class name="java/sql/Connection" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/AutoCloseable" since="19" />
+ <implements name="java/sql/Wrapper" since="9" />
+ <method name="clearWarnings()V" />
+ <method name="close()V" />
+ <method name="commit()V" />
+ <method name="createArrayOf(Ljava/lang/String;[Ljava/lang/Object;)Ljava/sql/Array;" since="9" />
+ <method name="createBlob()Ljava/sql/Blob;" since="9" />
+ <method name="createClob()Ljava/sql/Clob;" since="9" />
+ <method name="createNClob()Ljava/sql/NClob;" since="9" />
+ <method name="createSQLXML()Ljava/sql/SQLXML;" since="9" />
+ <method name="createStatement()Ljava/sql/Statement;" />
+ <method name="createStatement(II)Ljava/sql/Statement;" />
+ <method name="createStatement(III)Ljava/sql/Statement;" />
+ <method name="createStruct(Ljava/lang/String;[Ljava/lang/Object;)Ljava/sql/Struct;" since="9" />
+ <method name="getAutoCommit()Z" />
+ <method name="getCatalog()Ljava/lang/String;" />
+ <method name="getClientInfo()Ljava/util/Properties;" since="9" />
+ <method name="getClientInfo(Ljava/lang/String;)Ljava/lang/String;" since="9" />
+ <method name="getHoldability()I" />
+ <method name="getMetaData()Ljava/sql/DatabaseMetaData;" />
+ <method name="getTransactionIsolation()I" />
+ <method name="getTypeMap()Ljava/util/Map;" />
+ <method name="getWarnings()Ljava/sql/SQLWarning;" />
+ <method name="isClosed()Z" />
+ <method name="isReadOnly()Z" />
+ <method name="isValid(I)Z" since="9" />
+ <method name="nativeSQL(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="prepareCall(Ljava/lang/String;)Ljava/sql/CallableStatement;" />
+ <method name="prepareCall(Ljava/lang/String;II)Ljava/sql/CallableStatement;" />
+ <method name="prepareCall(Ljava/lang/String;III)Ljava/sql/CallableStatement;" />
+ <method name="prepareStatement(Ljava/lang/String;)Ljava/sql/PreparedStatement;" />
+ <method name="prepareStatement(Ljava/lang/String;I)Ljava/sql/PreparedStatement;" />
+ <method name="prepareStatement(Ljava/lang/String;II)Ljava/sql/PreparedStatement;" />
+ <method name="prepareStatement(Ljava/lang/String;III)Ljava/sql/PreparedStatement;" />
+ <method name="prepareStatement(Ljava/lang/String;[I)Ljava/sql/PreparedStatement;" />
+ <method name="prepareStatement(Ljava/lang/String;[Ljava/lang/String;)Ljava/sql/PreparedStatement;" />
+ <method name="releaseSavepoint(Ljava/sql/Savepoint;)V" />
+ <method name="rollback()V" />
+ <method name="rollback(Ljava/sql/Savepoint;)V" />
+ <method name="setAutoCommit(Z)V" />
+ <method name="setCatalog(Ljava/lang/String;)V" />
+ <method name="setClientInfo(Ljava/lang/String;Ljava/lang/String;)V" since="9" />
+ <method name="setClientInfo(Ljava/util/Properties;)V" since="9" />
+ <method name="setHoldability(I)V" />
+ <method name="setReadOnly(Z)V" />
+ <method name="setSavepoint()Ljava/sql/Savepoint;" />
+ <method name="setSavepoint(Ljava/lang/String;)Ljava/sql/Savepoint;" />
+ <method name="setTransactionIsolation(I)V" />
+ <method name="setTypeMap(Ljava/util/Map;)V" />
+ <field name="TRANSACTION_NONE" />
+ <field name="TRANSACTION_READ_COMMITTED" />
+ <field name="TRANSACTION_READ_UNCOMMITTED" />
+ <field name="TRANSACTION_REPEATABLE_READ" />
+ <field name="TRANSACTION_SERIALIZABLE" />
+ </class>
+ <class name="java/sql/DataTruncation" since="1">
+ <extends name="java/sql/SQLWarning" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(IZZII)V" />
+ <method name="&lt;init>(IZZIILjava/lang/Throwable;)V" since="9" />
+ <method name="getDataSize()I" />
+ <method name="getIndex()I" />
+ <method name="getParameter()Z" />
+ <method name="getRead()Z" />
+ <method name="getTransferSize()I" />
+ </class>
+ <class name="java/sql/DatabaseMetaData" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/sql/Wrapper" since="9" />
+ <method name="allProceduresAreCallable()Z" />
+ <method name="allTablesAreSelectable()Z" />
+ <method name="autoCommitFailureClosesAllResultSets()Z" since="9" />
+ <method name="dataDefinitionCausesTransactionCommit()Z" />
+ <method name="dataDefinitionIgnoredInTransactions()Z" />
+ <method name="deletesAreDetected(I)Z" />
+ <method name="doesMaxRowSizeIncludeBlobs()Z" />
+ <method name="getAttributes(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;" />
+ <method name="getBestRowIdentifier(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IZ)Ljava/sql/ResultSet;" />
+ <method name="getCatalogSeparator()Ljava/lang/String;" />
+ <method name="getCatalogTerm()Ljava/lang/String;" />
+ <method name="getCatalogs()Ljava/sql/ResultSet;" />
+ <method name="getClientInfoProperties()Ljava/sql/ResultSet;" since="9" />
+ <method name="getColumnPrivileges(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;" />
+ <method name="getColumns(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;" />
+ <method name="getConnection()Ljava/sql/Connection;" />
+ <method name="getCrossReference(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;" />
+ <method name="getDatabaseMajorVersion()I" />
+ <method name="getDatabaseMinorVersion()I" />
+ <method name="getDatabaseProductName()Ljava/lang/String;" />
+ <method name="getDatabaseProductVersion()Ljava/lang/String;" />
+ <method name="getDefaultTransactionIsolation()I" />
+ <method name="getDriverMajorVersion()I" />
+ <method name="getDriverMinorVersion()I" />
+ <method name="getDriverName()Ljava/lang/String;" />
+ <method name="getDriverVersion()Ljava/lang/String;" />
+ <method name="getExportedKeys(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;" />
+ <method name="getExtraNameCharacters()Ljava/lang/String;" />
+ <method name="getFunctionColumns(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;" since="9" />
+ <method name="getFunctions(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;" since="9" />
+ <method name="getIdentifierQuoteString()Ljava/lang/String;" />
+ <method name="getImportedKeys(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;" />
+ <method name="getIndexInfo(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZ)Ljava/sql/ResultSet;" />
+ <method name="getJDBCMajorVersion()I" />
+ <method name="getJDBCMinorVersion()I" />
+ <method name="getMaxBinaryLiteralLength()I" />
+ <method name="getMaxCatalogNameLength()I" />
+ <method name="getMaxCharLiteralLength()I" />
+ <method name="getMaxColumnNameLength()I" />
+ <method name="getMaxColumnsInGroupBy()I" />
+ <method name="getMaxColumnsInIndex()I" />
+ <method name="getMaxColumnsInOrderBy()I" />
+ <method name="getMaxColumnsInSelect()I" />
+ <method name="getMaxColumnsInTable()I" />
+ <method name="getMaxConnections()I" />
+ <method name="getMaxCursorNameLength()I" />
+ <method name="getMaxIndexLength()I" />
+ <method name="getMaxProcedureNameLength()I" />
+ <method name="getMaxRowSize()I" />
+ <method name="getMaxSchemaNameLength()I" />
+ <method name="getMaxStatementLength()I" />
+ <method name="getMaxStatements()I" />
+ <method name="getMaxTableNameLength()I" />
+ <method name="getMaxTablesInSelect()I" />
+ <method name="getMaxUserNameLength()I" />
+ <method name="getNumericFunctions()Ljava/lang/String;" />
+ <method name="getPrimaryKeys(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;" />
+ <method name="getProcedureColumns(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;" />
+ <method name="getProcedureTerm()Ljava/lang/String;" />
+ <method name="getProcedures(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;" />
+ <method name="getResultSetHoldability()I" />
+ <method name="getRowIdLifetime()Ljava/sql/RowIdLifetime;" since="9" />
+ <method name="getSQLKeywords()Ljava/lang/String;" />
+ <method name="getSQLStateType()I" />
+ <method name="getSchemaTerm()Ljava/lang/String;" />
+ <method name="getSchemas()Ljava/sql/ResultSet;" />
+ <method name="getSchemas(Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;" since="9" />
+ <method name="getSearchStringEscape()Ljava/lang/String;" />
+ <method name="getStringFunctions()Ljava/lang/String;" />
+ <method name="getSuperTables(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;" />
+ <method name="getSuperTypes(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;" />
+ <method name="getSystemFunctions()Ljava/lang/String;" />
+ <method name="getTablePrivileges(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;" />
+ <method name="getTableTypes()Ljava/sql/ResultSet;" />
+ <method name="getTables(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)Ljava/sql/ResultSet;" />
+ <method name="getTimeDateFunctions()Ljava/lang/String;" />
+ <method name="getTypeInfo()Ljava/sql/ResultSet;" />
+ <method name="getUDTs(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[I)Ljava/sql/ResultSet;" />
+ <method name="getURL()Ljava/lang/String;" />
+ <method name="getUserName()Ljava/lang/String;" />
+ <method name="getVersionColumns(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/ResultSet;" />
+ <method name="insertsAreDetected(I)Z" />
+ <method name="isCatalogAtStart()Z" />
+ <method name="isReadOnly()Z" />
+ <method name="locatorsUpdateCopy()Z" />
+ <method name="nullPlusNonNullIsNull()Z" />
+ <method name="nullsAreSortedAtEnd()Z" />
+ <method name="nullsAreSortedAtStart()Z" />
+ <method name="nullsAreSortedHigh()Z" />
+ <method name="nullsAreSortedLow()Z" />
+ <method name="othersDeletesAreVisible(I)Z" />
+ <method name="othersInsertsAreVisible(I)Z" />
+ <method name="othersUpdatesAreVisible(I)Z" />
+ <method name="ownDeletesAreVisible(I)Z" />
+ <method name="ownInsertsAreVisible(I)Z" />
+ <method name="ownUpdatesAreVisible(I)Z" />
+ <method name="storesLowerCaseIdentifiers()Z" />
+ <method name="storesLowerCaseQuotedIdentifiers()Z" />
+ <method name="storesMixedCaseIdentifiers()Z" />
+ <method name="storesMixedCaseQuotedIdentifiers()Z" />
+ <method name="storesUpperCaseIdentifiers()Z" />
+ <method name="storesUpperCaseQuotedIdentifiers()Z" />
+ <method name="supportsANSI92EntryLevelSQL()Z" />
+ <method name="supportsANSI92FullSQL()Z" />
+ <method name="supportsANSI92IntermediateSQL()Z" />
+ <method name="supportsAlterTableWithAddColumn()Z" />
+ <method name="supportsAlterTableWithDropColumn()Z" />
+ <method name="supportsBatchUpdates()Z" />
+ <method name="supportsCatalogsInDataManipulation()Z" />
+ <method name="supportsCatalogsInIndexDefinitions()Z" />
+ <method name="supportsCatalogsInPrivilegeDefinitions()Z" />
+ <method name="supportsCatalogsInProcedureCalls()Z" />
+ <method name="supportsCatalogsInTableDefinitions()Z" />
+ <method name="supportsColumnAliasing()Z" />
+ <method name="supportsConvert()Z" />
+ <method name="supportsConvert(II)Z" />
+ <method name="supportsCoreSQLGrammar()Z" />
+ <method name="supportsCorrelatedSubqueries()Z" />
+ <method name="supportsDataDefinitionAndDataManipulationTransactions()Z" />
+ <method name="supportsDataManipulationTransactionsOnly()Z" />
+ <method name="supportsDifferentTableCorrelationNames()Z" />
+ <method name="supportsExpressionsInOrderBy()Z" />
+ <method name="supportsExtendedSQLGrammar()Z" />
+ <method name="supportsFullOuterJoins()Z" />
+ <method name="supportsGetGeneratedKeys()Z" />
+ <method name="supportsGroupBy()Z" />
+ <method name="supportsGroupByBeyondSelect()Z" />
+ <method name="supportsGroupByUnrelated()Z" />
+ <method name="supportsIntegrityEnhancementFacility()Z" />
+ <method name="supportsLikeEscapeClause()Z" />
+ <method name="supportsLimitedOuterJoins()Z" />
+ <method name="supportsMinimumSQLGrammar()Z" />
+ <method name="supportsMixedCaseIdentifiers()Z" />
+ <method name="supportsMixedCaseQuotedIdentifiers()Z" />
+ <method name="supportsMultipleOpenResults()Z" />
+ <method name="supportsMultipleResultSets()Z" />
+ <method name="supportsMultipleTransactions()Z" />
+ <method name="supportsNamedParameters()Z" />
+ <method name="supportsNonNullableColumns()Z" />
+ <method name="supportsOpenCursorsAcrossCommit()Z" />
+ <method name="supportsOpenCursorsAcrossRollback()Z" />
+ <method name="supportsOpenStatementsAcrossCommit()Z" />
+ <method name="supportsOpenStatementsAcrossRollback()Z" />
+ <method name="supportsOrderByUnrelated()Z" />
+ <method name="supportsOuterJoins()Z" />
+ <method name="supportsPositionedDelete()Z" />
+ <method name="supportsPositionedUpdate()Z" />
+ <method name="supportsResultSetConcurrency(II)Z" />
+ <method name="supportsResultSetHoldability(I)Z" />
+ <method name="supportsResultSetType(I)Z" />
+ <method name="supportsSavepoints()Z" />
+ <method name="supportsSchemasInDataManipulation()Z" />
+ <method name="supportsSchemasInIndexDefinitions()Z" />
+ <method name="supportsSchemasInPrivilegeDefinitions()Z" />
+ <method name="supportsSchemasInProcedureCalls()Z" />
+ <method name="supportsSchemasInTableDefinitions()Z" />
+ <method name="supportsSelectForUpdate()Z" />
+ <method name="supportsStatementPooling()Z" />
+ <method name="supportsStoredFunctionsUsingCallSyntax()Z" since="9" />
+ <method name="supportsStoredProcedures()Z" />
+ <method name="supportsSubqueriesInComparisons()Z" />
+ <method name="supportsSubqueriesInExists()Z" />
+ <method name="supportsSubqueriesInIns()Z" />
+ <method name="supportsSubqueriesInQuantifieds()Z" />
+ <method name="supportsTableCorrelationNames()Z" />
+ <method name="supportsTransactionIsolationLevel(I)Z" />
+ <method name="supportsTransactions()Z" />
+ <method name="supportsUnion()Z" />
+ <method name="supportsUnionAll()Z" />
+ <method name="updatesAreDetected(I)Z" />
+ <method name="usesLocalFilePerTable()Z" />
+ <method name="usesLocalFiles()Z" />
+ <field name="attributeNoNulls" />
+ <field name="attributeNullable" />
+ <field name="attributeNullableUnknown" />
+ <field name="bestRowNotPseudo" />
+ <field name="bestRowPseudo" />
+ <field name="bestRowSession" />
+ <field name="bestRowTemporary" />
+ <field name="bestRowTransaction" />
+ <field name="bestRowUnknown" />
+ <field name="columnNoNulls" />
+ <field name="columnNullable" />
+ <field name="columnNullableUnknown" />
+ <field name="functionColumnIn" since="9" />
+ <field name="functionColumnInOut" since="9" />
+ <field name="functionColumnOut" since="9" />
+ <field name="functionColumnResult" since="9" />
+ <field name="functionColumnUnknown" since="9" />
+ <field name="functionNoNulls" since="9" />
+ <field name="functionNoTable" since="9" />
+ <field name="functionNullable" since="9" />
+ <field name="functionNullableUnknown" since="9" />
+ <field name="functionResultUnknown" since="9" />
+ <field name="functionReturn" since="9" />
+ <field name="functionReturnsTable" since="9" />
+ <field name="importedKeyCascade" />
+ <field name="importedKeyInitiallyDeferred" />
+ <field name="importedKeyInitiallyImmediate" />
+ <field name="importedKeyNoAction" />
+ <field name="importedKeyNotDeferrable" />
+ <field name="importedKeyRestrict" />
+ <field name="importedKeySetDefault" />
+ <field name="importedKeySetNull" />
+ <field name="procedureColumnIn" />
+ <field name="procedureColumnInOut" />
+ <field name="procedureColumnOut" />
+ <field name="procedureColumnResult" />
+ <field name="procedureColumnReturn" />
+ <field name="procedureColumnUnknown" />
+ <field name="procedureNoNulls" />
+ <field name="procedureNoResult" />
+ <field name="procedureNullable" />
+ <field name="procedureNullableUnknown" />
+ <field name="procedureResultUnknown" />
+ <field name="procedureReturnsResult" />
+ <field name="sqlStateSQL" since="9" />
+ <field name="sqlStateSQL99" />
+ <field name="sqlStateXOpen" />
+ <field name="tableIndexClustered" />
+ <field name="tableIndexHashed" />
+ <field name="tableIndexOther" />
+ <field name="tableIndexStatistic" />
+ <field name="typeNoNulls" />
+ <field name="typeNullable" />
+ <field name="typeNullableUnknown" />
+ <field name="typePredBasic" />
+ <field name="typePredChar" />
+ <field name="typePredNone" />
+ <field name="typeSearchable" />
+ <field name="versionColumnNotPseudo" />
+ <field name="versionColumnPseudo" />
+ <field name="versionColumnUnknown" />
+ </class>
+ <class name="java/sql/Date" since="1">
+ <extends name="java/util/Date" />
+ <method name="&lt;init>(III)V" />
+ <method name="&lt;init>(J)V" />
+ <method name="valueOf(Ljava/lang/String;)Ljava/sql/Date;" />
+ </class>
+ <class name="java/sql/Driver" since="1">
+ <extends name="java/lang/Object" />
+ <method name="acceptsURL(Ljava/lang/String;)Z" />
+ <method name="connect(Ljava/lang/String;Ljava/util/Properties;)Ljava/sql/Connection;" />
+ <method name="getMajorVersion()I" />
+ <method name="getMinorVersion()I" />
+ <method name="getPropertyInfo(Ljava/lang/String;Ljava/util/Properties;)[Ljava/sql/DriverPropertyInfo;" />
+ <method name="jdbcCompliant()Z" />
+ </class>
+ <class name="java/sql/DriverManager" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="deregisterDriver(Ljava/sql/Driver;)V" />
+ <method name="getConnection(Ljava/lang/String;)Ljava/sql/Connection;" />
+ <method name="getConnection(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/sql/Connection;" />
+ <method name="getConnection(Ljava/lang/String;Ljava/util/Properties;)Ljava/sql/Connection;" />
+ <method name="getDriver(Ljava/lang/String;)Ljava/sql/Driver;" />
+ <method name="getDrivers()Ljava/util/Enumeration;" />
+ <method name="getLogStream()Ljava/io/PrintStream;" />
+ <method name="getLogWriter()Ljava/io/PrintWriter;" />
+ <method name="getLoginTimeout()I" />
+ <method name="println(Ljava/lang/String;)V" />
+ <method name="registerDriver(Ljava/sql/Driver;)V" />
+ <method name="setLogStream(Ljava/io/PrintStream;)V" />
+ <method name="setLogWriter(Ljava/io/PrintWriter;)V" />
+ <method name="setLoginTimeout(I)V" />
+ </class>
+ <class name="java/sql/DriverPropertyInfo" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <field name="choices" />
+ <field name="description" />
+ <field name="name" />
+ <field name="required" />
+ <field name="value" />
+ </class>
+ <class name="java/sql/NClob" since="9">
+ <extends name="java/lang/Object" />
+ <implements name="java/sql/Clob" />
+ </class>
+ <class name="java/sql/ParameterMetaData" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/sql/Wrapper" since="9" />
+ <method name="getParameterClassName(I)Ljava/lang/String;" />
+ <method name="getParameterCount()I" />
+ <method name="getParameterMode(I)I" />
+ <method name="getParameterType(I)I" />
+ <method name="getParameterTypeName(I)Ljava/lang/String;" />
+ <method name="getPrecision(I)I" />
+ <method name="getScale(I)I" />
+ <method name="isNullable(I)I" />
+ <method name="isSigned(I)Z" />
+ <field name="parameterModeIn" />
+ <field name="parameterModeInOut" />
+ <field name="parameterModeOut" />
+ <field name="parameterModeUnknown" />
+ <field name="parameterNoNulls" />
+ <field name="parameterNullable" />
+ <field name="parameterNullableUnknown" />
+ </class>
+ <class name="java/sql/PreparedStatement" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/sql/Statement" />
+ <method name="addBatch()V" />
+ <method name="clearParameters()V" />
+ <method name="execute()Z" />
+ <method name="executeQuery()Ljava/sql/ResultSet;" />
+ <method name="executeUpdate()I" />
+ <method name="getMetaData()Ljava/sql/ResultSetMetaData;" />
+ <method name="getParameterMetaData()Ljava/sql/ParameterMetaData;" />
+ <method name="setArray(ILjava/sql/Array;)V" />
+ <method name="setAsciiStream(ILjava/io/InputStream;)V" since="9" />
+ <method name="setAsciiStream(ILjava/io/InputStream;I)V" />
+ <method name="setAsciiStream(ILjava/io/InputStream;J)V" since="9" />
+ <method name="setBigDecimal(ILjava/math/BigDecimal;)V" />
+ <method name="setBinaryStream(ILjava/io/InputStream;)V" since="9" />
+ <method name="setBinaryStream(ILjava/io/InputStream;I)V" />
+ <method name="setBinaryStream(ILjava/io/InputStream;J)V" since="9" />
+ <method name="setBlob(ILjava/io/InputStream;)V" since="9" />
+ <method name="setBlob(ILjava/io/InputStream;J)V" since="9" />
+ <method name="setBlob(ILjava/sql/Blob;)V" />
+ <method name="setBoolean(IZ)V" />
+ <method name="setByte(IB)V" />
+ <method name="setBytes(I[B)V" />
+ <method name="setCharacterStream(ILjava/io/Reader;)V" since="9" />
+ <method name="setCharacterStream(ILjava/io/Reader;I)V" />
+ <method name="setCharacterStream(ILjava/io/Reader;J)V" since="9" />
+ <method name="setClob(ILjava/io/Reader;)V" since="9" />
+ <method name="setClob(ILjava/io/Reader;J)V" since="9" />
+ <method name="setClob(ILjava/sql/Clob;)V" />
+ <method name="setDate(ILjava/sql/Date;)V" />
+ <method name="setDate(ILjava/sql/Date;Ljava/util/Calendar;)V" />
+ <method name="setDouble(ID)V" />
+ <method name="setFloat(IF)V" />
+ <method name="setInt(II)V" />
+ <method name="setLong(IJ)V" />
+ <method name="setNCharacterStream(ILjava/io/Reader;)V" since="9" />
+ <method name="setNCharacterStream(ILjava/io/Reader;J)V" since="9" />
+ <method name="setNClob(ILjava/io/Reader;)V" since="9" />
+ <method name="setNClob(ILjava/io/Reader;J)V" since="9" />
+ <method name="setNClob(ILjava/sql/NClob;)V" since="9" />
+ <method name="setNString(ILjava/lang/String;)V" since="9" />
+ <method name="setNull(II)V" />
+ <method name="setNull(IILjava/lang/String;)V" />
+ <method name="setObject(ILjava/lang/Object;)V" />
+ <method name="setObject(ILjava/lang/Object;I)V" />
+ <method name="setObject(ILjava/lang/Object;II)V" />
+ <method name="setRef(ILjava/sql/Ref;)V" />
+ <method name="setRowId(ILjava/sql/RowId;)V" since="9" />
+ <method name="setSQLXML(ILjava/sql/SQLXML;)V" since="9" />
+ <method name="setShort(IS)V" />
+ <method name="setString(ILjava/lang/String;)V" />
+ <method name="setTime(ILjava/sql/Time;)V" />
+ <method name="setTime(ILjava/sql/Time;Ljava/util/Calendar;)V" />
+ <method name="setTimestamp(ILjava/sql/Timestamp;)V" />
+ <method name="setTimestamp(ILjava/sql/Timestamp;Ljava/util/Calendar;)V" />
+ <method name="setURL(ILjava/net/URL;)V" />
+ <method name="setUnicodeStream(ILjava/io/InputStream;I)V" />
+ </class>
+ <class name="java/sql/Ref" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getBaseTypeName()Ljava/lang/String;" />
+ <method name="getObject()Ljava/lang/Object;" />
+ <method name="getObject(Ljava/util/Map;)Ljava/lang/Object;" />
+ <method name="setObject(Ljava/lang/Object;)V" />
+ </class>
+ <class name="java/sql/ResultSet" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/AutoCloseable" since="19" />
+ <implements name="java/sql/Wrapper" since="9" />
+ <method name="absolute(I)Z" />
+ <method name="afterLast()V" />
+ <method name="beforeFirst()V" />
+ <method name="cancelRowUpdates()V" />
+ <method name="clearWarnings()V" />
+ <method name="close()V" />
+ <method name="deleteRow()V" />
+ <method name="findColumn(Ljava/lang/String;)I" />
+ <method name="first()Z" />
+ <method name="getArray(I)Ljava/sql/Array;" />
+ <method name="getArray(Ljava/lang/String;)Ljava/sql/Array;" />
+ <method name="getAsciiStream(I)Ljava/io/InputStream;" />
+ <method name="getAsciiStream(Ljava/lang/String;)Ljava/io/InputStream;" />
+ <method name="getBigDecimal(I)Ljava/math/BigDecimal;" />
+ <method name="getBigDecimal(II)Ljava/math/BigDecimal;" />
+ <method name="getBigDecimal(Ljava/lang/String;)Ljava/math/BigDecimal;" />
+ <method name="getBigDecimal(Ljava/lang/String;I)Ljava/math/BigDecimal;" />
+ <method name="getBinaryStream(I)Ljava/io/InputStream;" />
+ <method name="getBinaryStream(Ljava/lang/String;)Ljava/io/InputStream;" />
+ <method name="getBlob(I)Ljava/sql/Blob;" />
+ <method name="getBlob(Ljava/lang/String;)Ljava/sql/Blob;" />
+ <method name="getBoolean(I)Z" />
+ <method name="getBoolean(Ljava/lang/String;)Z" />
+ <method name="getByte(I)B" />
+ <method name="getByte(Ljava/lang/String;)B" />
+ <method name="getBytes(I)[B" />
+ <method name="getBytes(Ljava/lang/String;)[B" />
+ <method name="getCharacterStream(I)Ljava/io/Reader;" />
+ <method name="getCharacterStream(Ljava/lang/String;)Ljava/io/Reader;" />
+ <method name="getClob(I)Ljava/sql/Clob;" />
+ <method name="getClob(Ljava/lang/String;)Ljava/sql/Clob;" />
+ <method name="getConcurrency()I" />
+ <method name="getCursorName()Ljava/lang/String;" />
+ <method name="getDate(I)Ljava/sql/Date;" />
+ <method name="getDate(ILjava/util/Calendar;)Ljava/sql/Date;" />
+ <method name="getDate(Ljava/lang/String;)Ljava/sql/Date;" />
+ <method name="getDate(Ljava/lang/String;Ljava/util/Calendar;)Ljava/sql/Date;" />
+ <method name="getDouble(I)D" />
+ <method name="getDouble(Ljava/lang/String;)D" />
+ <method name="getFetchDirection()I" />
+ <method name="getFetchSize()I" />
+ <method name="getFloat(I)F" />
+ <method name="getFloat(Ljava/lang/String;)F" />
+ <method name="getHoldability()I" since="9" />
+ <method name="getInt(I)I" />
+ <method name="getInt(Ljava/lang/String;)I" />
+ <method name="getLong(I)J" />
+ <method name="getLong(Ljava/lang/String;)J" />
+ <method name="getMetaData()Ljava/sql/ResultSetMetaData;" />
+ <method name="getNCharacterStream(I)Ljava/io/Reader;" since="9" />
+ <method name="getNCharacterStream(Ljava/lang/String;)Ljava/io/Reader;" since="9" />
+ <method name="getNClob(I)Ljava/sql/NClob;" since="9" />
+ <method name="getNClob(Ljava/lang/String;)Ljava/sql/NClob;" since="9" />
+ <method name="getNString(I)Ljava/lang/String;" since="9" />
+ <method name="getNString(Ljava/lang/String;)Ljava/lang/String;" since="9" />
+ <method name="getObject(I)Ljava/lang/Object;" />
+ <method name="getObject(ILjava/util/Map;)Ljava/lang/Object;" />
+ <method name="getObject(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="getObject(Ljava/lang/String;Ljava/util/Map;)Ljava/lang/Object;" />
+ <method name="getRef(I)Ljava/sql/Ref;" />
+ <method name="getRef(Ljava/lang/String;)Ljava/sql/Ref;" />
+ <method name="getRow()I" />
+ <method name="getRowId(I)Ljava/sql/RowId;" since="9" />
+ <method name="getRowId(Ljava/lang/String;)Ljava/sql/RowId;" since="9" />
+ <method name="getSQLXML(I)Ljava/sql/SQLXML;" since="9" />
+ <method name="getSQLXML(Ljava/lang/String;)Ljava/sql/SQLXML;" since="9" />
+ <method name="getShort(I)S" />
+ <method name="getShort(Ljava/lang/String;)S" />
+ <method name="getStatement()Ljava/sql/Statement;" />
+ <method name="getString(I)Ljava/lang/String;" />
+ <method name="getString(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getTime(I)Ljava/sql/Time;" />
+ <method name="getTime(ILjava/util/Calendar;)Ljava/sql/Time;" />
+ <method name="getTime(Ljava/lang/String;)Ljava/sql/Time;" />
+ <method name="getTime(Ljava/lang/String;Ljava/util/Calendar;)Ljava/sql/Time;" />
+ <method name="getTimestamp(I)Ljava/sql/Timestamp;" />
+ <method name="getTimestamp(ILjava/util/Calendar;)Ljava/sql/Timestamp;" />
+ <method name="getTimestamp(Ljava/lang/String;)Ljava/sql/Timestamp;" />
+ <method name="getTimestamp(Ljava/lang/String;Ljava/util/Calendar;)Ljava/sql/Timestamp;" />
+ <method name="getType()I" />
+ <method name="getURL(I)Ljava/net/URL;" />
+ <method name="getURL(Ljava/lang/String;)Ljava/net/URL;" />
+ <method name="getUnicodeStream(I)Ljava/io/InputStream;" />
+ <method name="getUnicodeStream(Ljava/lang/String;)Ljava/io/InputStream;" />
+ <method name="getWarnings()Ljava/sql/SQLWarning;" />
+ <method name="insertRow()V" />
+ <method name="isAfterLast()Z" />
+ <method name="isBeforeFirst()Z" />
+ <method name="isClosed()Z" since="9" />
+ <method name="isFirst()Z" />
+ <method name="isLast()Z" />
+ <method name="last()Z" />
+ <method name="moveToCurrentRow()V" />
+ <method name="moveToInsertRow()V" />
+ <method name="next()Z" />
+ <method name="previous()Z" />
+ <method name="refreshRow()V" />
+ <method name="relative(I)Z" />
+ <method name="rowDeleted()Z" />
+ <method name="rowInserted()Z" />
+ <method name="rowUpdated()Z" />
+ <method name="setFetchDirection(I)V" />
+ <method name="setFetchSize(I)V" />
+ <method name="updateArray(ILjava/sql/Array;)V" />
+ <method name="updateArray(Ljava/lang/String;Ljava/sql/Array;)V" />
+ <method name="updateAsciiStream(ILjava/io/InputStream;)V" since="9" />
+ <method name="updateAsciiStream(ILjava/io/InputStream;I)V" />
+ <method name="updateAsciiStream(ILjava/io/InputStream;J)V" since="9" />
+ <method name="updateAsciiStream(Ljava/lang/String;Ljava/io/InputStream;)V" since="9" />
+ <method name="updateAsciiStream(Ljava/lang/String;Ljava/io/InputStream;I)V" />
+ <method name="updateAsciiStream(Ljava/lang/String;Ljava/io/InputStream;J)V" since="9" />
+ <method name="updateBigDecimal(ILjava/math/BigDecimal;)V" />
+ <method name="updateBigDecimal(Ljava/lang/String;Ljava/math/BigDecimal;)V" />
+ <method name="updateBinaryStream(ILjava/io/InputStream;)V" since="9" />
+ <method name="updateBinaryStream(ILjava/io/InputStream;I)V" />
+ <method name="updateBinaryStream(ILjava/io/InputStream;J)V" since="9" />
+ <method name="updateBinaryStream(Ljava/lang/String;Ljava/io/InputStream;)V" since="9" />
+ <method name="updateBinaryStream(Ljava/lang/String;Ljava/io/InputStream;I)V" />
+ <method name="updateBinaryStream(Ljava/lang/String;Ljava/io/InputStream;J)V" since="9" />
+ <method name="updateBlob(ILjava/io/InputStream;)V" since="9" />
+ <method name="updateBlob(ILjava/io/InputStream;J)V" since="9" />
+ <method name="updateBlob(ILjava/sql/Blob;)V" />
+ <method name="updateBlob(Ljava/lang/String;Ljava/io/InputStream;)V" since="9" />
+ <method name="updateBlob(Ljava/lang/String;Ljava/io/InputStream;J)V" since="9" />
+ <method name="updateBlob(Ljava/lang/String;Ljava/sql/Blob;)V" />
+ <method name="updateBoolean(IZ)V" />
+ <method name="updateBoolean(Ljava/lang/String;Z)V" />
+ <method name="updateByte(IB)V" />
+ <method name="updateByte(Ljava/lang/String;B)V" />
+ <method name="updateBytes(I[B)V" />
+ <method name="updateBytes(Ljava/lang/String;[B)V" />
+ <method name="updateCharacterStream(ILjava/io/Reader;)V" since="9" />
+ <method name="updateCharacterStream(ILjava/io/Reader;I)V" />
+ <method name="updateCharacterStream(ILjava/io/Reader;J)V" since="9" />
+ <method name="updateCharacterStream(Ljava/lang/String;Ljava/io/Reader;)V" since="9" />
+ <method name="updateCharacterStream(Ljava/lang/String;Ljava/io/Reader;I)V" />
+ <method name="updateCharacterStream(Ljava/lang/String;Ljava/io/Reader;J)V" since="9" />
+ <method name="updateClob(ILjava/io/Reader;)V" since="9" />
+ <method name="updateClob(ILjava/io/Reader;J)V" since="9" />
+ <method name="updateClob(ILjava/sql/Clob;)V" />
+ <method name="updateClob(Ljava/lang/String;Ljava/io/Reader;)V" since="9" />
+ <method name="updateClob(Ljava/lang/String;Ljava/io/Reader;J)V" since="9" />
+ <method name="updateClob(Ljava/lang/String;Ljava/sql/Clob;)V" />
+ <method name="updateDate(ILjava/sql/Date;)V" />
+ <method name="updateDate(Ljava/lang/String;Ljava/sql/Date;)V" />
+ <method name="updateDouble(ID)V" />
+ <method name="updateDouble(Ljava/lang/String;D)V" />
+ <method name="updateFloat(IF)V" />
+ <method name="updateFloat(Ljava/lang/String;F)V" />
+ <method name="updateInt(II)V" />
+ <method name="updateInt(Ljava/lang/String;I)V" />
+ <method name="updateLong(IJ)V" />
+ <method name="updateLong(Ljava/lang/String;J)V" />
+ <method name="updateNCharacterStream(ILjava/io/Reader;)V" since="9" />
+ <method name="updateNCharacterStream(ILjava/io/Reader;J)V" since="9" />
+ <method name="updateNCharacterStream(Ljava/lang/String;Ljava/io/Reader;)V" since="9" />
+ <method name="updateNCharacterStream(Ljava/lang/String;Ljava/io/Reader;J)V" since="9" />
+ <method name="updateNClob(ILjava/io/Reader;)V" since="9" />
+ <method name="updateNClob(ILjava/io/Reader;J)V" since="9" />
+ <method name="updateNClob(ILjava/sql/NClob;)V" since="9" />
+ <method name="updateNClob(Ljava/lang/String;Ljava/io/Reader;)V" since="9" />
+ <method name="updateNClob(Ljava/lang/String;Ljava/io/Reader;J)V" since="9" />
+ <method name="updateNClob(Ljava/lang/String;Ljava/sql/NClob;)V" since="9" />
+ <method name="updateNString(ILjava/lang/String;)V" since="9" />
+ <method name="updateNString(Ljava/lang/String;Ljava/lang/String;)V" since="9" />
+ <method name="updateNull(I)V" />
+ <method name="updateNull(Ljava/lang/String;)V" />
+ <method name="updateObject(ILjava/lang/Object;)V" />
+ <method name="updateObject(ILjava/lang/Object;I)V" />
+ <method name="updateObject(Ljava/lang/String;Ljava/lang/Object;)V" />
+ <method name="updateObject(Ljava/lang/String;Ljava/lang/Object;I)V" />
+ <method name="updateRef(ILjava/sql/Ref;)V" />
+ <method name="updateRef(Ljava/lang/String;Ljava/sql/Ref;)V" />
+ <method name="updateRow()V" />
+ <method name="updateRowId(ILjava/sql/RowId;)V" since="9" />
+ <method name="updateRowId(Ljava/lang/String;Ljava/sql/RowId;)V" since="9" />
+ <method name="updateSQLXML(ILjava/sql/SQLXML;)V" since="9" />
+ <method name="updateSQLXML(Ljava/lang/String;Ljava/sql/SQLXML;)V" since="9" />
+ <method name="updateShort(IS)V" />
+ <method name="updateShort(Ljava/lang/String;S)V" />
+ <method name="updateString(ILjava/lang/String;)V" />
+ <method name="updateString(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="updateTime(ILjava/sql/Time;)V" />
+ <method name="updateTime(Ljava/lang/String;Ljava/sql/Time;)V" />
+ <method name="updateTimestamp(ILjava/sql/Timestamp;)V" />
+ <method name="updateTimestamp(Ljava/lang/String;Ljava/sql/Timestamp;)V" />
+ <method name="wasNull()Z" />
+ <field name="CLOSE_CURSORS_AT_COMMIT" />
+ <field name="CONCUR_READ_ONLY" />
+ <field name="CONCUR_UPDATABLE" />
+ <field name="FETCH_FORWARD" />
+ <field name="FETCH_REVERSE" />
+ <field name="FETCH_UNKNOWN" />
+ <field name="HOLD_CURSORS_OVER_COMMIT" />
+ <field name="TYPE_FORWARD_ONLY" />
+ <field name="TYPE_SCROLL_INSENSITIVE" />
+ <field name="TYPE_SCROLL_SENSITIVE" />
+ </class>
+ <class name="java/sql/ResultSetMetaData" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/sql/Wrapper" since="9" />
+ <method name="getCatalogName(I)Ljava/lang/String;" />
+ <method name="getColumnClassName(I)Ljava/lang/String;" />
+ <method name="getColumnCount()I" />
+ <method name="getColumnDisplaySize(I)I" />
+ <method name="getColumnLabel(I)Ljava/lang/String;" />
+ <method name="getColumnName(I)Ljava/lang/String;" />
+ <method name="getColumnType(I)I" />
+ <method name="getColumnTypeName(I)Ljava/lang/String;" />
+ <method name="getPrecision(I)I" />
+ <method name="getScale(I)I" />
+ <method name="getSchemaName(I)Ljava/lang/String;" />
+ <method name="getTableName(I)Ljava/lang/String;" />
+ <method name="isAutoIncrement(I)Z" />
+ <method name="isCaseSensitive(I)Z" />
+ <method name="isCurrency(I)Z" />
+ <method name="isDefinitelyWritable(I)Z" />
+ <method name="isNullable(I)I" />
+ <method name="isReadOnly(I)Z" />
+ <method name="isSearchable(I)Z" />
+ <method name="isSigned(I)Z" />
+ <method name="isWritable(I)Z" />
+ <field name="columnNoNulls" />
+ <field name="columnNullable" />
+ <field name="columnNullableUnknown" />
+ </class>
+ <class name="java/sql/RowId" since="9">
+ <extends name="java/lang/Object" />
+ <method name="getBytes()[B" />
+ </class>
+ <class name="java/sql/RowIdLifetime" since="9">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Ljava/sql/RowIdLifetime;" />
+ <method name="values()[Ljava/sql/RowIdLifetime;" />
+ <field name="ROWID_UNSUPPORTED" />
+ <field name="ROWID_VALID_FOREVER" />
+ <field name="ROWID_VALID_OTHER" />
+ <field name="ROWID_VALID_SESSION" />
+ <field name="ROWID_VALID_TRANSACTION" />
+ </class>
+ <class name="java/sql/SQLClientInfoException" since="9">
+ <extends name="java/sql/SQLException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/util/Map;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/util/Map;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/util/Map;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/util/Map;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/util/Map;)V" />
+ <method name="&lt;init>(Ljava/util/Map;Ljava/lang/Throwable;)V" />
+ <method name="getFailedProperties()Ljava/util/Map;" />
+ </class>
+ <class name="java/sql/SQLData" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getSQLTypeName()Ljava/lang/String;" />
+ <method name="readSQL(Ljava/sql/SQLInput;Ljava/lang/String;)V" />
+ <method name="writeSQL(Ljava/sql/SQLOutput;)V" />
+ </class>
+ <class name="java/sql/SQLDataException" since="9">
+ <extends name="java/sql/SQLNonTransientException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/sql/SQLException" since="1">
+ <extends name="java/lang/Exception" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Iterable" since="9" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V" since="9" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V" since="9" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" since="9" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" since="9" />
+ <method name="getErrorCode()I" />
+ <method name="getNextException()Ljava/sql/SQLException;" />
+ <method name="getSQLState()Ljava/lang/String;" />
+ <method name="setNextException(Ljava/sql/SQLException;)V" />
+ </class>
+ <class name="java/sql/SQLFeatureNotSupportedException" since="9">
+ <extends name="java/sql/SQLNonTransientException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/sql/SQLInput" since="1">
+ <extends name="java/lang/Object" />
+ <method name="readArray()Ljava/sql/Array;" />
+ <method name="readAsciiStream()Ljava/io/InputStream;" />
+ <method name="readBigDecimal()Ljava/math/BigDecimal;" />
+ <method name="readBinaryStream()Ljava/io/InputStream;" />
+ <method name="readBlob()Ljava/sql/Blob;" />
+ <method name="readBoolean()Z" />
+ <method name="readByte()B" />
+ <method name="readBytes()[B" />
+ <method name="readCharacterStream()Ljava/io/Reader;" />
+ <method name="readClob()Ljava/sql/Clob;" />
+ <method name="readDate()Ljava/sql/Date;" />
+ <method name="readDouble()D" />
+ <method name="readFloat()F" />
+ <method name="readInt()I" />
+ <method name="readLong()J" />
+ <method name="readNClob()Ljava/sql/NClob;" since="9" />
+ <method name="readNString()Ljava/lang/String;" since="9" />
+ <method name="readObject()Ljava/lang/Object;" />
+ <method name="readRef()Ljava/sql/Ref;" />
+ <method name="readRowId()Ljava/sql/RowId;" since="9" />
+ <method name="readSQLXML()Ljava/sql/SQLXML;" since="9" />
+ <method name="readShort()S" />
+ <method name="readString()Ljava/lang/String;" />
+ <method name="readTime()Ljava/sql/Time;" />
+ <method name="readTimestamp()Ljava/sql/Timestamp;" />
+ <method name="readURL()Ljava/net/URL;" />
+ <method name="wasNull()Z" />
+ </class>
+ <class name="java/sql/SQLIntegrityConstraintViolationException" since="9">
+ <extends name="java/sql/SQLNonTransientException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/sql/SQLInvalidAuthorizationSpecException" since="9">
+ <extends name="java/sql/SQLNonTransientException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/sql/SQLNonTransientConnectionException" since="9">
+ <extends name="java/sql/SQLNonTransientException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/sql/SQLNonTransientException" since="9">
+ <extends name="java/sql/SQLException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/sql/SQLOutput" since="1">
+ <extends name="java/lang/Object" />
+ <method name="writeArray(Ljava/sql/Array;)V" />
+ <method name="writeAsciiStream(Ljava/io/InputStream;)V" />
+ <method name="writeBigDecimal(Ljava/math/BigDecimal;)V" />
+ <method name="writeBinaryStream(Ljava/io/InputStream;)V" />
+ <method name="writeBlob(Ljava/sql/Blob;)V" />
+ <method name="writeBoolean(Z)V" />
+ <method name="writeByte(B)V" />
+ <method name="writeBytes([B)V" />
+ <method name="writeCharacterStream(Ljava/io/Reader;)V" />
+ <method name="writeClob(Ljava/sql/Clob;)V" />
+ <method name="writeDate(Ljava/sql/Date;)V" />
+ <method name="writeDouble(D)V" />
+ <method name="writeFloat(F)V" />
+ <method name="writeInt(I)V" />
+ <method name="writeLong(J)V" />
+ <method name="writeNClob(Ljava/sql/NClob;)V" since="9" />
+ <method name="writeNString(Ljava/lang/String;)V" since="9" />
+ <method name="writeObject(Ljava/sql/SQLData;)V" />
+ <method name="writeRef(Ljava/sql/Ref;)V" />
+ <method name="writeRowId(Ljava/sql/RowId;)V" since="9" />
+ <method name="writeSQLXML(Ljava/sql/SQLXML;)V" since="9" />
+ <method name="writeShort(S)V" />
+ <method name="writeString(Ljava/lang/String;)V" />
+ <method name="writeStruct(Ljava/sql/Struct;)V" />
+ <method name="writeTime(Ljava/sql/Time;)V" />
+ <method name="writeTimestamp(Ljava/sql/Timestamp;)V" />
+ <method name="writeURL(Ljava/net/URL;)V" />
+ </class>
+ <class name="java/sql/SQLPermission" since="1">
+ <extends name="java/security/BasicPermission" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/security/Guard" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="java/sql/SQLRecoverableException" since="9">
+ <extends name="java/sql/SQLException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/sql/SQLSyntaxErrorException" since="9">
+ <extends name="java/sql/SQLNonTransientException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/sql/SQLTimeoutException" since="9">
+ <extends name="java/sql/SQLTransientException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/sql/SQLTransactionRollbackException" since="9">
+ <extends name="java/sql/SQLTransientException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/sql/SQLTransientConnectionException" since="9">
+ <extends name="java/sql/SQLTransientException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/sql/SQLTransientException" since="9">
+ <extends name="java/sql/SQLException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/sql/SQLWarning" since="1">
+ <extends name="java/sql/SQLException" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/Throwable;)V" since="9" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V" since="9" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" since="9" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" since="9" />
+ <method name="getNextWarning()Ljava/sql/SQLWarning;" />
+ <method name="setNextWarning(Ljava/sql/SQLWarning;)V" />
+ </class>
+ <class name="java/sql/SQLXML" since="9">
+ <extends name="java/lang/Object" />
+ <method name="free()V" />
+ <method name="getBinaryStream()Ljava/io/InputStream;" />
+ <method name="getCharacterStream()Ljava/io/Reader;" />
+ <method name="getSource(Ljava/lang/Class;)Ljavax/xml/transform/Source;" />
+ <method name="getString()Ljava/lang/String;" />
+ <method name="setBinaryStream()Ljava/io/OutputStream;" />
+ <method name="setCharacterStream()Ljava/io/Writer;" />
+ <method name="setResult(Ljava/lang/Class;)Ljavax/xml/transform/Result;" />
+ <method name="setString(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/sql/Savepoint" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getSavepointId()I" />
+ <method name="getSavepointName()Ljava/lang/String;" />
+ </class>
+ <class name="java/sql/Statement" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/AutoCloseable" since="19" />
+ <implements name="java/sql/Wrapper" since="9" />
+ <method name="addBatch(Ljava/lang/String;)V" />
+ <method name="cancel()V" />
+ <method name="clearBatch()V" />
+ <method name="clearWarnings()V" />
+ <method name="close()V" />
+ <method name="execute(Ljava/lang/String;)Z" />
+ <method name="execute(Ljava/lang/String;I)Z" />
+ <method name="execute(Ljava/lang/String;[I)Z" />
+ <method name="execute(Ljava/lang/String;[Ljava/lang/String;)Z" />
+ <method name="executeBatch()[I" />
+ <method name="executeQuery(Ljava/lang/String;)Ljava/sql/ResultSet;" />
+ <method name="executeUpdate(Ljava/lang/String;)I" />
+ <method name="executeUpdate(Ljava/lang/String;I)I" />
+ <method name="executeUpdate(Ljava/lang/String;[I)I" />
+ <method name="executeUpdate(Ljava/lang/String;[Ljava/lang/String;)I" />
+ <method name="getConnection()Ljava/sql/Connection;" />
+ <method name="getFetchDirection()I" />
+ <method name="getFetchSize()I" />
+ <method name="getGeneratedKeys()Ljava/sql/ResultSet;" />
+ <method name="getMaxFieldSize()I" />
+ <method name="getMaxRows()I" />
+ <method name="getMoreResults()Z" />
+ <method name="getMoreResults(I)Z" />
+ <method name="getQueryTimeout()I" />
+ <method name="getResultSet()Ljava/sql/ResultSet;" />
+ <method name="getResultSetConcurrency()I" />
+ <method name="getResultSetHoldability()I" />
+ <method name="getResultSetType()I" />
+ <method name="getUpdateCount()I" />
+ <method name="getWarnings()Ljava/sql/SQLWarning;" />
+ <method name="isClosed()Z" since="9" />
+ <method name="isPoolable()Z" since="9" />
+ <method name="setCursorName(Ljava/lang/String;)V" />
+ <method name="setEscapeProcessing(Z)V" />
+ <method name="setFetchDirection(I)V" />
+ <method name="setFetchSize(I)V" />
+ <method name="setMaxFieldSize(I)V" />
+ <method name="setMaxRows(I)V" />
+ <method name="setPoolable(Z)V" since="9" />
+ <method name="setQueryTimeout(I)V" />
+ <field name="CLOSE_ALL_RESULTS" />
+ <field name="CLOSE_CURRENT_RESULT" />
+ <field name="EXECUTE_FAILED" />
+ <field name="KEEP_CURRENT_RESULT" />
+ <field name="NO_GENERATED_KEYS" />
+ <field name="RETURN_GENERATED_KEYS" />
+ <field name="SUCCESS_NO_INFO" />
+ </class>
+ <class name="java/sql/Struct" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getAttributes()[Ljava/lang/Object;" />
+ <method name="getAttributes(Ljava/util/Map;)[Ljava/lang/Object;" />
+ <method name="getSQLTypeName()Ljava/lang/String;" />
+ </class>
+ <class name="java/sql/Time" since="1">
+ <extends name="java/util/Date" />
+ <method name="&lt;init>(III)V" />
+ <method name="&lt;init>(J)V" />
+ <method name="valueOf(Ljava/lang/String;)Ljava/sql/Time;" />
+ </class>
+ <class name="java/sql/Timestamp" since="1">
+ <extends name="java/util/Date" />
+ <method name="&lt;init>(IIIIIII)V" />
+ <method name="&lt;init>(J)V" />
+ <method name="after(Ljava/sql/Timestamp;)Z" />
+ <method name="before(Ljava/sql/Timestamp;)Z" />
+ <method name="compareTo(Ljava/sql/Timestamp;)I" />
+ <method name="equals(Ljava/sql/Timestamp;)Z" />
+ <method name="getNanos()I" />
+ <method name="setNanos(I)V" />
+ <method name="valueOf(Ljava/lang/String;)Ljava/sql/Timestamp;" />
+ </class>
+ <class name="java/sql/Types" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="ARRAY" />
+ <field name="BIGINT" />
+ <field name="BINARY" />
+ <field name="BIT" />
+ <field name="BLOB" />
+ <field name="BOOLEAN" />
+ <field name="CHAR" />
+ <field name="CLOB" />
+ <field name="DATALINK" />
+ <field name="DATE" />
+ <field name="DECIMAL" />
+ <field name="DISTINCT" />
+ <field name="DOUBLE" />
+ <field name="FLOAT" />
+ <field name="INTEGER" />
+ <field name="JAVA_OBJECT" />
+ <field name="LONGNVARCHAR" since="9" />
+ <field name="LONGVARBINARY" />
+ <field name="LONGVARCHAR" />
+ <field name="NCHAR" since="9" />
+ <field name="NCLOB" since="9" />
+ <field name="NULL" />
+ <field name="NUMERIC" />
+ <field name="NVARCHAR" since="9" />
+ <field name="OTHER" />
+ <field name="REAL" />
+ <field name="REF" />
+ <field name="ROWID" since="9" />
+ <field name="SMALLINT" />
+ <field name="SQLXML" since="9" />
+ <field name="STRUCT" />
+ <field name="TIME" />
+ <field name="TIMESTAMP" />
+ <field name="TINYINT" />
+ <field name="VARBINARY" />
+ <field name="VARCHAR" />
+ </class>
+ <class name="java/sql/Wrapper" since="9">
+ <extends name="java/lang/Object" />
+ <method name="isWrapperFor(Ljava/lang/Class;)Z" />
+ <method name="unwrap(Ljava/lang/Class;)Ljava/lang/Object;" />
+ </class>
+ <class name="java/text/Annotation" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/Object;)V" />
+ <method name="getValue()Ljava/lang/Object;" />
+ </class>
+ <class name="java/text/AttributedCharacterIterator" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/text/CharacterIterator" />
+ <method name="getAllAttributeKeys()Ljava/util/Set;" />
+ <method name="getAttribute(Ljava/text/AttributedCharacterIterator$Attribute;)Ljava/lang/Object;" />
+ <method name="getAttributes()Ljava/util/Map;" />
+ <method name="getRunLimit()I" />
+ <method name="getRunLimit(Ljava/text/AttributedCharacterIterator$Attribute;)I" />
+ <method name="getRunLimit(Ljava/util/Set;)I" />
+ <method name="getRunStart()I" />
+ <method name="getRunStart(Ljava/text/AttributedCharacterIterator$Attribute;)I" />
+ <method name="getRunStart(Ljava/util/Set;)I" />
+ </class>
+ <class name="java/text/AttributedCharacterIterator$Attribute" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="readResolve()Ljava/lang/Object;" />
+ <field name="INPUT_METHOD_SEGMENT" />
+ <field name="LANGUAGE" />
+ <field name="READING" />
+ </class>
+ <class name="java/text/AttributedString" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/util/Map;)V" />
+ <method name="&lt;init>(Ljava/text/AttributedCharacterIterator;)V" />
+ <method name="&lt;init>(Ljava/text/AttributedCharacterIterator;II)V" />
+ <method name="&lt;init>(Ljava/text/AttributedCharacterIterator;II[Ljava/text/AttributedCharacterIterator$Attribute;)V" />
+ <method name="addAttribute(Ljava/text/AttributedCharacterIterator$Attribute;Ljava/lang/Object;)V" />
+ <method name="addAttribute(Ljava/text/AttributedCharacterIterator$Attribute;Ljava/lang/Object;II)V" />
+ <method name="addAttributes(Ljava/util/Map;II)V" />
+ <method name="getIterator()Ljava/text/AttributedCharacterIterator;" />
+ <method name="getIterator([Ljava/text/AttributedCharacterIterator$Attribute;)Ljava/text/AttributedCharacterIterator;" />
+ <method name="getIterator([Ljava/text/AttributedCharacterIterator$Attribute;II)Ljava/text/AttributedCharacterIterator;" />
+ </class>
+ <class name="java/text/Bidi" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;I)V" />
+ <method name="&lt;init>(Ljava/text/AttributedCharacterIterator;)V" />
+ <method name="&lt;init>([CI[BIII)V" />
+ <method name="baseIsLeftToRight()Z" />
+ <method name="createLineBidi(II)Ljava/text/Bidi;" />
+ <method name="getBaseLevel()I" />
+ <method name="getLength()I" />
+ <method name="getLevelAt(I)I" />
+ <method name="getRunCount()I" />
+ <method name="getRunLevel(I)I" />
+ <method name="getRunLimit(I)I" />
+ <method name="getRunStart(I)I" />
+ <method name="isLeftToRight()Z" />
+ <method name="isMixed()Z" />
+ <method name="isRightToLeft()Z" />
+ <method name="reorderVisually([BI[Ljava/lang/Object;II)V" />
+ <method name="requiresBidi([CII)Z" />
+ <field name="DIRECTION_DEFAULT_LEFT_TO_RIGHT" />
+ <field name="DIRECTION_DEFAULT_RIGHT_TO_LEFT" />
+ <field name="DIRECTION_LEFT_TO_RIGHT" />
+ <field name="DIRECTION_RIGHT_TO_LEFT" />
+ </class>
+ <class name="java/text/BreakIterator" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>()V" />
+ <method name="current()I" />
+ <method name="first()I" />
+ <method name="following(I)I" />
+ <method name="getAvailableLocales()[Ljava/util/Locale;" />
+ <method name="getCharacterInstance()Ljava/text/BreakIterator;" />
+ <method name="getCharacterInstance(Ljava/util/Locale;)Ljava/text/BreakIterator;" />
+ <method name="getInt([BI)I" />
+ <method name="getLineInstance()Ljava/text/BreakIterator;" />
+ <method name="getLineInstance(Ljava/util/Locale;)Ljava/text/BreakIterator;" />
+ <method name="getLong([BI)J" />
+ <method name="getSentenceInstance()Ljava/text/BreakIterator;" />
+ <method name="getSentenceInstance(Ljava/util/Locale;)Ljava/text/BreakIterator;" />
+ <method name="getShort([BI)S" />
+ <method name="getText()Ljava/text/CharacterIterator;" />
+ <method name="getWordInstance()Ljava/text/BreakIterator;" />
+ <method name="getWordInstance(Ljava/util/Locale;)Ljava/text/BreakIterator;" />
+ <method name="isBoundary(I)Z" />
+ <method name="last()I" />
+ <method name="next()I" />
+ <method name="next(I)I" />
+ <method name="preceding(I)I" />
+ <method name="previous()I" />
+ <method name="setText(Ljava/lang/String;)V" />
+ <method name="setText(Ljava/text/CharacterIterator;)V" />
+ <field name="DONE" />
+ </class>
+ <class name="java/text/CharacterIterator" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <method name="current()C" />
+ <method name="first()C" />
+ <method name="getBeginIndex()I" />
+ <method name="getEndIndex()I" />
+ <method name="getIndex()I" />
+ <method name="last()C" />
+ <method name="next()C" />
+ <method name="previous()C" />
+ <method name="setIndex(I)C" />
+ <field name="DONE" />
+ </class>
+ <class name="java/text/ChoiceFormat" since="1">
+ <extends name="java/text/NumberFormat" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>([D[Ljava/lang/String;)V" />
+ <method name="applyPattern(Ljava/lang/String;)V" />
+ <method name="getFormats()[Ljava/lang/Object;" />
+ <method name="getLimits()[D" />
+ <method name="nextDouble(D)D" />
+ <method name="nextDouble(DZ)D" />
+ <method name="previousDouble(D)D" />
+ <method name="setChoices([D[Ljava/lang/String;)V" />
+ <method name="toPattern()Ljava/lang/String;" />
+ </class>
+ <class name="java/text/CollationElementIterator" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getMaxExpansion(I)I" />
+ <method name="getOffset()I" />
+ <method name="next()I" />
+ <method name="previous()I" />
+ <method name="primaryOrder(I)I" />
+ <method name="reset()V" />
+ <method name="secondaryOrder(I)S" />
+ <method name="setOffset(I)V" />
+ <method name="setText(Ljava/lang/String;)V" />
+ <method name="setText(Ljava/text/CharacterIterator;)V" />
+ <method name="tertiaryOrder(I)S" />
+ <field name="NULLORDER" />
+ </class>
+ <class name="java/text/CollationKey" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" since="9" />
+ <method name="compareTo(Ljava/text/CollationKey;)I" />
+ <method name="getSourceString()Ljava/lang/String;" />
+ <method name="toByteArray()[B" />
+ </class>
+ <class name="java/text/Collator" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="java/util/Comparator" />
+ <method name="&lt;init>()V" />
+ <method name="compare(Ljava/lang/String;Ljava/lang/String;)I" />
+ <method name="equals(Ljava/lang/String;Ljava/lang/String;)Z" />
+ <method name="getAvailableLocales()[Ljava/util/Locale;" />
+ <method name="getCollationKey(Ljava/lang/String;)Ljava/text/CollationKey;" />
+ <method name="getDecomposition()I" />
+ <method name="getInstance()Ljava/text/Collator;" />
+ <method name="getInstance(Ljava/util/Locale;)Ljava/text/Collator;" />
+ <method name="getStrength()I" />
+ <method name="setDecomposition(I)V" />
+ <method name="setStrength(I)V" />
+ <field name="CANONICAL_DECOMPOSITION" />
+ <field name="FULL_DECOMPOSITION" />
+ <field name="IDENTICAL" />
+ <field name="NO_DECOMPOSITION" />
+ <field name="PRIMARY" />
+ <field name="SECONDARY" />
+ <field name="TERTIARY" />
+ </class>
+ <class name="java/text/DateFormat" since="1">
+ <extends name="java/text/Format" />
+ <method name="&lt;init>()V" />
+ <method name="format(Ljava/util/Date;)Ljava/lang/String;" />
+ <method name="format(Ljava/util/Date;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;" />
+ <method name="getAvailableLocales()[Ljava/util/Locale;" />
+ <method name="getCalendar()Ljava/util/Calendar;" />
+ <method name="getDateInstance()Ljava/text/DateFormat;" />
+ <method name="getDateInstance(I)Ljava/text/DateFormat;" />
+ <method name="getDateInstance(ILjava/util/Locale;)Ljava/text/DateFormat;" />
+ <method name="getDateTimeInstance()Ljava/text/DateFormat;" />
+ <method name="getDateTimeInstance(II)Ljava/text/DateFormat;" />
+ <method name="getDateTimeInstance(IILjava/util/Locale;)Ljava/text/DateFormat;" />
+ <method name="getInstance()Ljava/text/DateFormat;" />
+ <method name="getNumberFormat()Ljava/text/NumberFormat;" />
+ <method name="getTimeInstance()Ljava/text/DateFormat;" />
+ <method name="getTimeInstance(I)Ljava/text/DateFormat;" />
+ <method name="getTimeInstance(ILjava/util/Locale;)Ljava/text/DateFormat;" />
+ <method name="getTimeZone()Ljava/util/TimeZone;" />
+ <method name="isLenient()Z" />
+ <method name="parse(Ljava/lang/String;)Ljava/util/Date;" />
+ <method name="parse(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/util/Date;" />
+ <method name="setCalendar(Ljava/util/Calendar;)V" />
+ <method name="setLenient(Z)V" />
+ <method name="setNumberFormat(Ljava/text/NumberFormat;)V" />
+ <method name="setTimeZone(Ljava/util/TimeZone;)V" />
+ <field name="AM_PM_FIELD" />
+ <field name="DATE_FIELD" />
+ <field name="DAY_OF_WEEK_FIELD" />
+ <field name="DAY_OF_WEEK_IN_MONTH_FIELD" />
+ <field name="DAY_OF_YEAR_FIELD" />
+ <field name="DEFAULT" />
+ <field name="ERA_FIELD" />
+ <field name="FULL" />
+ <field name="HOUR0_FIELD" />
+ <field name="HOUR1_FIELD" />
+ <field name="HOUR_OF_DAY0_FIELD" />
+ <field name="HOUR_OF_DAY1_FIELD" />
+ <field name="LONG" />
+ <field name="MEDIUM" />
+ <field name="MILLISECOND_FIELD" />
+ <field name="MINUTE_FIELD" />
+ <field name="MONTH_FIELD" />
+ <field name="SECOND_FIELD" />
+ <field name="SHORT" />
+ <field name="TIMEZONE_FIELD" />
+ <field name="WEEK_OF_MONTH_FIELD" />
+ <field name="WEEK_OF_YEAR_FIELD" />
+ <field name="YEAR_FIELD" />
+ <field name="calendar" />
+ <field name="numberFormat" />
+ </class>
+ <class name="java/text/DateFormat$Field" since="1">
+ <extends name="java/text/Format$Field" />
+ <method name="&lt;init>(Ljava/lang/String;I)V" />
+ <method name="getCalendarField()I" />
+ <method name="ofCalendarField(I)Ljava/text/DateFormat$Field;" />
+ <field name="AM_PM" />
+ <field name="DAY_OF_MONTH" />
+ <field name="DAY_OF_WEEK" />
+ <field name="DAY_OF_WEEK_IN_MONTH" />
+ <field name="DAY_OF_YEAR" />
+ <field name="ERA" />
+ <field name="HOUR0" />
+ <field name="HOUR1" />
+ <field name="HOUR_OF_DAY0" />
+ <field name="HOUR_OF_DAY1" />
+ <field name="MILLISECOND" />
+ <field name="MINUTE" />
+ <field name="MONTH" />
+ <field name="SECOND" />
+ <field name="TIME_ZONE" />
+ <field name="WEEK_OF_MONTH" />
+ <field name="WEEK_OF_YEAR" />
+ <field name="YEAR" />
+ </class>
+ <class name="java/text/DateFormatSymbols" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/util/Locale;)V" />
+ <method name="getAmPmStrings()[Ljava/lang/String;" />
+ <method name="getAvailableLocales()[Ljava/util/Locale;" since="9" />
+ <method name="getEras()[Ljava/lang/String;" />
+ <method name="getInstance()Ljava/text/DateFormatSymbols;" since="9" />
+ <method name="getInstance(Ljava/util/Locale;)Ljava/text/DateFormatSymbols;" since="9" />
+ <method name="getLocalPatternChars()Ljava/lang/String;" />
+ <method name="getMonths()[Ljava/lang/String;" />
+ <method name="getShortMonths()[Ljava/lang/String;" />
+ <method name="getShortWeekdays()[Ljava/lang/String;" />
+ <method name="getWeekdays()[Ljava/lang/String;" />
+ <method name="getZoneStrings()[[Ljava/lang/String;" />
+ <method name="setAmPmStrings([Ljava/lang/String;)V" />
+ <method name="setEras([Ljava/lang/String;)V" />
+ <method name="setLocalPatternChars(Ljava/lang/String;)V" />
+ <method name="setMonths([Ljava/lang/String;)V" />
+ <method name="setShortMonths([Ljava/lang/String;)V" />
+ <method name="setShortWeekdays([Ljava/lang/String;)V" />
+ <method name="setWeekdays([Ljava/lang/String;)V" />
+ <method name="setZoneStrings([[Ljava/lang/String;)V" />
+ </class>
+ <class name="java/text/DecimalFormat" since="1">
+ <extends name="java/text/NumberFormat" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/text/DecimalFormatSymbols;)V" />
+ <method name="applyLocalizedPattern(Ljava/lang/String;)V" />
+ <method name="applyPattern(Ljava/lang/String;)V" />
+ <method name="getDecimalFormatSymbols()Ljava/text/DecimalFormatSymbols;" />
+ <method name="getGroupingSize()I" />
+ <method name="getMultiplier()I" />
+ <method name="getNegativePrefix()Ljava/lang/String;" />
+ <method name="getNegativeSuffix()Ljava/lang/String;" />
+ <method name="getPositivePrefix()Ljava/lang/String;" />
+ <method name="getPositiveSuffix()Ljava/lang/String;" />
+ <method name="isDecimalSeparatorAlwaysShown()Z" />
+ <method name="isParseBigDecimal()Z" />
+ <method name="setDecimalFormatSymbols(Ljava/text/DecimalFormatSymbols;)V" />
+ <method name="setDecimalSeparatorAlwaysShown(Z)V" />
+ <method name="setGroupingSize(I)V" />
+ <method name="setMultiplier(I)V" />
+ <method name="setNegativePrefix(Ljava/lang/String;)V" />
+ <method name="setNegativeSuffix(Ljava/lang/String;)V" />
+ <method name="setParseBigDecimal(Z)V" />
+ <method name="setPositivePrefix(Ljava/lang/String;)V" />
+ <method name="setPositiveSuffix(Ljava/lang/String;)V" />
+ <method name="toLocalizedPattern()Ljava/lang/String;" />
+ <method name="toPattern()Ljava/lang/String;" />
+ </class>
+ <class name="java/text/DecimalFormatSymbols" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/util/Locale;)V" />
+ <method name="getAvailableLocales()[Ljava/util/Locale;" since="9" />
+ <method name="getCurrency()Ljava/util/Currency;" />
+ <method name="getCurrencySymbol()Ljava/lang/String;" />
+ <method name="getDecimalSeparator()C" />
+ <method name="getDigit()C" />
+ <method name="getExponentSeparator()Ljava/lang/String;" since="9" />
+ <method name="getGroupingSeparator()C" />
+ <method name="getInfinity()Ljava/lang/String;" />
+ <method name="getInstance()Ljava/text/DecimalFormatSymbols;" since="9" />
+ <method name="getInstance(Ljava/util/Locale;)Ljava/text/DecimalFormatSymbols;" since="9" />
+ <method name="getInternationalCurrencySymbol()Ljava/lang/String;" />
+ <method name="getMinusSign()C" />
+ <method name="getMonetaryDecimalSeparator()C" />
+ <method name="getNaN()Ljava/lang/String;" />
+ <method name="getPatternSeparator()C" />
+ <method name="getPerMill()C" />
+ <method name="getPercent()C" />
+ <method name="getZeroDigit()C" />
+ <method name="setCurrency(Ljava/util/Currency;)V" />
+ <method name="setCurrencySymbol(Ljava/lang/String;)V" />
+ <method name="setDecimalSeparator(C)V" />
+ <method name="setDigit(C)V" />
+ <method name="setExponentSeparator(Ljava/lang/String;)V" since="9" />
+ <method name="setGroupingSeparator(C)V" />
+ <method name="setInfinity(Ljava/lang/String;)V" />
+ <method name="setInternationalCurrencySymbol(Ljava/lang/String;)V" />
+ <method name="setMinusSign(C)V" />
+ <method name="setMonetaryDecimalSeparator(C)V" />
+ <method name="setNaN(Ljava/lang/String;)V" />
+ <method name="setPatternSeparator(C)V" />
+ <method name="setPerMill(C)V" />
+ <method name="setPercent(C)V" />
+ <method name="setZeroDigit(C)V" />
+ </class>
+ <class name="java/text/FieldPosition" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Ljava/text/Format$Field;)V" />
+ <method name="&lt;init>(Ljava/text/Format$Field;I)V" />
+ <method name="getBeginIndex()I" />
+ <method name="getEndIndex()I" />
+ <method name="getField()I" />
+ <method name="getFieldAttribute()Ljava/text/Format$Field;" />
+ <method name="setBeginIndex(I)V" />
+ <method name="setEndIndex(I)V" />
+ </class>
+ <class name="java/text/Format" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>()V" />
+ <method name="format(Ljava/lang/Object;)Ljava/lang/String;" />
+ <method name="format(Ljava/lang/Object;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;" />
+ <method name="formatToCharacterIterator(Ljava/lang/Object;)Ljava/text/AttributedCharacterIterator;" />
+ <method name="parseObject(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="parseObject(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/lang/Object;" />
+ </class>
+ <class name="java/text/Format$Field" since="1">
+ <extends name="java/text/AttributedCharacterIterator$Attribute" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/text/MessageFormat" since="1">
+ <extends name="java/text/Format" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/util/Locale;)V" />
+ <method name="applyPattern(Ljava/lang/String;)V" />
+ <method name="format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;" />
+ <method name="format([Ljava/lang/Object;Ljava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;" />
+ <method name="getFormats()[Ljava/text/Format;" />
+ <method name="getFormatsByArgumentIndex()[Ljava/text/Format;" />
+ <method name="getLocale()Ljava/util/Locale;" />
+ <method name="parse(Ljava/lang/String;)[Ljava/lang/Object;" />
+ <method name="parse(Ljava/lang/String;Ljava/text/ParsePosition;)[Ljava/lang/Object;" />
+ <method name="setFormat(ILjava/text/Format;)V" />
+ <method name="setFormatByArgumentIndex(ILjava/text/Format;)V" />
+ <method name="setFormats([Ljava/text/Format;)V" />
+ <method name="setFormatsByArgumentIndex([Ljava/text/Format;)V" />
+ <method name="setLocale(Ljava/util/Locale;)V" />
+ <method name="toPattern()Ljava/lang/String;" />
+ </class>
+ <class name="java/text/MessageFormat$Field" since="1">
+ <extends name="java/text/Format$Field" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <field name="ARGUMENT" />
+ </class>
+ <class name="java/text/Normalizer" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="isNormalized(Ljava/lang/CharSequence;Ljava/text/Normalizer$Form;)Z" />
+ <method name="normalize(Ljava/lang/CharSequence;Ljava/text/Normalizer$Form;)Ljava/lang/String;" />
+ </class>
+ <class name="java/text/Normalizer$Form" since="9">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Ljava/text/Normalizer$Form;" />
+ <method name="values()[Ljava/text/Normalizer$Form;" />
+ <field name="NFC" />
+ <field name="NFD" />
+ <field name="NFKC" />
+ <field name="NFKD" />
+ </class>
+ <class name="java/text/NumberFormat" since="1">
+ <extends name="java/text/Format" />
+ <method name="&lt;init>()V" />
+ <method name="format(D)Ljava/lang/String;" />
+ <method name="format(DLjava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;" />
+ <method name="format(J)Ljava/lang/String;" />
+ <method name="format(JLjava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;" />
+ <method name="getAvailableLocales()[Ljava/util/Locale;" />
+ <method name="getCurrency()Ljava/util/Currency;" />
+ <method name="getCurrencyInstance()Ljava/text/NumberFormat;" />
+ <method name="getCurrencyInstance(Ljava/util/Locale;)Ljava/text/NumberFormat;" />
+ <method name="getInstance()Ljava/text/NumberFormat;" />
+ <method name="getInstance(Ljava/util/Locale;)Ljava/text/NumberFormat;" />
+ <method name="getIntegerInstance()Ljava/text/NumberFormat;" />
+ <method name="getIntegerInstance(Ljava/util/Locale;)Ljava/text/NumberFormat;" />
+ <method name="getMaximumFractionDigits()I" />
+ <method name="getMaximumIntegerDigits()I" />
+ <method name="getMinimumFractionDigits()I" />
+ <method name="getMinimumIntegerDigits()I" />
+ <method name="getNumberInstance()Ljava/text/NumberFormat;" />
+ <method name="getNumberInstance(Ljava/util/Locale;)Ljava/text/NumberFormat;" />
+ <method name="getPercentInstance()Ljava/text/NumberFormat;" />
+ <method name="getPercentInstance(Ljava/util/Locale;)Ljava/text/NumberFormat;" />
+ <method name="getRoundingMode()Ljava/math/RoundingMode;" since="9" />
+ <method name="isGroupingUsed()Z" />
+ <method name="isParseIntegerOnly()Z" />
+ <method name="parse(Ljava/lang/String;)Ljava/lang/Number;" />
+ <method name="parse(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/lang/Number;" />
+ <method name="setCurrency(Ljava/util/Currency;)V" />
+ <method name="setGroupingUsed(Z)V" />
+ <method name="setMaximumFractionDigits(I)V" />
+ <method name="setMaximumIntegerDigits(I)V" />
+ <method name="setMinimumFractionDigits(I)V" />
+ <method name="setMinimumIntegerDigits(I)V" />
+ <method name="setParseIntegerOnly(Z)V" />
+ <method name="setRoundingMode(Ljava/math/RoundingMode;)V" since="9" />
+ <field name="FRACTION_FIELD" />
+ <field name="INTEGER_FIELD" />
+ </class>
+ <class name="java/text/NumberFormat$Field" since="1">
+ <extends name="java/text/Format$Field" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <field name="CURRENCY" />
+ <field name="DECIMAL_SEPARATOR" />
+ <field name="EXPONENT" />
+ <field name="EXPONENT_SIGN" />
+ <field name="EXPONENT_SYMBOL" />
+ <field name="FRACTION" />
+ <field name="GROUPING_SEPARATOR" />
+ <field name="INTEGER" />
+ <field name="PERCENT" />
+ <field name="PERMILLE" />
+ <field name="SIGN" />
+ </class>
+ <class name="java/text/ParseException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>(Ljava/lang/String;I)V" />
+ <method name="getErrorOffset()I" />
+ </class>
+ <class name="java/text/ParsePosition" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(I)V" />
+ <method name="getErrorIndex()I" />
+ <method name="getIndex()I" />
+ <method name="setErrorIndex(I)V" />
+ <method name="setIndex(I)V" />
+ </class>
+ <class name="java/text/RuleBasedCollator" since="1">
+ <extends name="java/text/Collator" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getCollationElementIterator(Ljava/lang/String;)Ljava/text/CollationElementIterator;" />
+ <method name="getCollationElementIterator(Ljava/text/CharacterIterator;)Ljava/text/CollationElementIterator;" />
+ <method name="getRules()Ljava/lang/String;" />
+ </class>
+ <class name="java/text/SimpleDateFormat" since="1">
+ <extends name="java/text/DateFormat" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/text/DateFormatSymbols;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/util/Locale;)V" />
+ <method name="applyLocalizedPattern(Ljava/lang/String;)V" />
+ <method name="applyPattern(Ljava/lang/String;)V" />
+ <method name="get2DigitYearStart()Ljava/util/Date;" />
+ <method name="getDateFormatSymbols()Ljava/text/DateFormatSymbols;" />
+ <method name="set2DigitYearStart(Ljava/util/Date;)V" />
+ <method name="setDateFormatSymbols(Ljava/text/DateFormatSymbols;)V" />
+ <method name="toLocalizedPattern()Ljava/lang/String;" />
+ <method name="toPattern()Ljava/lang/String;" />
+ </class>
+ <class name="java/text/StringCharacterIterator" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/text/CharacterIterator" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;III)V" />
+ <method name="setText(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/util/AbstractCollection" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/Collection" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/util/AbstractList" since="1">
+ <extends name="java/util/AbstractCollection" />
+ <implements name="java/util/List" />
+ <method name="&lt;init>()V" />
+ <method name="removeRange(II)V" />
+ <field name="modCount" />
+ </class>
+ <class name="java/util/AbstractMap" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/Map" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/util/AbstractMap$SimpleEntry" since="9">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/util/Map$Entry" />
+ <method name="&lt;init>(Ljava/lang/Object;Ljava/lang/Object;)V" />
+ <method name="&lt;init>(Ljava/util/Map$Entry;)V" />
+ </class>
+ <class name="java/util/AbstractMap$SimpleImmutableEntry" since="9">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/util/Map$Entry" />
+ <method name="&lt;init>(Ljava/lang/Object;Ljava/lang/Object;)V" />
+ <method name="&lt;init>(Ljava/util/Map$Entry;)V" />
+ </class>
+ <class name="java/util/AbstractQueue" since="1">
+ <extends name="java/util/AbstractCollection" />
+ <implements name="java/util/Queue" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/util/AbstractSequentialList" since="1">
+ <extends name="java/util/AbstractList" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/util/AbstractSet" since="1">
+ <extends name="java/util/AbstractCollection" />
+ <implements name="java/util/Set" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/util/ArrayDeque" since="9">
+ <extends name="java/util/AbstractCollection" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="java/util/Deque" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Ljava/util/Collection;)V" />
+ <method name="clone()Ljava/util/ArrayDeque;" />
+ </class>
+ <class name="java/util/ArrayList" since="1">
+ <extends name="java/util/AbstractList" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="java/util/List" />
+ <implements name="java/util/RandomAccess" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Ljava/util/Collection;)V" />
+ <method name="ensureCapacity(I)V" />
+ <method name="trimToSize()V" />
+ </class>
+ <class name="java/util/Arrays" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="asList([Ljava/lang/Object;)Ljava/util/List;" />
+ <method name="binarySearch([BB)I" />
+ <method name="binarySearch([BIIB)I" since="9" />
+ <method name="binarySearch([CC)I" />
+ <method name="binarySearch([CIIC)I" since="9" />
+ <method name="binarySearch([DD)I" />
+ <method name="binarySearch([DIID)I" since="9" />
+ <method name="binarySearch([FF)I" />
+ <method name="binarySearch([FIIF)I" since="9" />
+ <method name="binarySearch([II)I" />
+ <method name="binarySearch([IIII)I" since="9" />
+ <method name="binarySearch([JIIJ)I" since="9" />
+ <method name="binarySearch([JJ)I" />
+ <method name="binarySearch([Ljava/lang/Object;IILjava/lang/Object;)I" since="9" />
+ <method name="binarySearch([Ljava/lang/Object;IILjava/lang/Object;Ljava/util/Comparator;)I" since="9" />
+ <method name="binarySearch([Ljava/lang/Object;Ljava/lang/Object;)I" />
+ <method name="binarySearch([Ljava/lang/Object;Ljava/lang/Object;Ljava/util/Comparator;)I" />
+ <method name="binarySearch([SIIS)I" since="9" />
+ <method name="binarySearch([SS)I" />
+ <method name="copyOf([BI)[B" since="9" />
+ <method name="copyOf([CI)[C" since="9" />
+ <method name="copyOf([DI)[D" since="9" />
+ <method name="copyOf([FI)[F" since="9" />
+ <method name="copyOf([II)[I" since="9" />
+ <method name="copyOf([JI)[J" since="9" />
+ <method name="copyOf([Ljava/lang/Object;I)[Ljava/lang/Object;" since="9" />
+ <method name="copyOf([Ljava/lang/Object;ILjava/lang/Class;)[Ljava/lang/Object;" since="9" />
+ <method name="copyOf([SI)[S" since="9" />
+ <method name="copyOf([ZI)[Z" since="9" />
+ <method name="copyOfRange([BII)[B" since="9" />
+ <method name="copyOfRange([CII)[C" since="9" />
+ <method name="copyOfRange([DII)[D" since="9" />
+ <method name="copyOfRange([FII)[F" since="9" />
+ <method name="copyOfRange([III)[I" since="9" />
+ <method name="copyOfRange([JII)[J" since="9" />
+ <method name="copyOfRange([Ljava/lang/Object;II)[Ljava/lang/Object;" since="9" />
+ <method name="copyOfRange([Ljava/lang/Object;IILjava/lang/Class;)[Ljava/lang/Object;" since="9" />
+ <method name="copyOfRange([SII)[S" since="9" />
+ <method name="copyOfRange([ZII)[Z" since="9" />
+ <method name="deepEquals([Ljava/lang/Object;[Ljava/lang/Object;)Z" />
+ <method name="deepHashCode([Ljava/lang/Object;)I" />
+ <method name="deepToString([Ljava/lang/Object;)Ljava/lang/String;" />
+ <method name="equals([B[B)Z" />
+ <method name="equals([C[C)Z" />
+ <method name="equals([D[D)Z" />
+ <method name="equals([F[F)Z" />
+ <method name="equals([I[I)Z" />
+ <method name="equals([J[J)Z" />
+ <method name="equals([Ljava/lang/Object;[Ljava/lang/Object;)Z" />
+ <method name="equals([S[S)Z" />
+ <method name="equals([Z[Z)Z" />
+ <method name="fill([BB)V" />
+ <method name="fill([BIIB)V" />
+ <method name="fill([CC)V" />
+ <method name="fill([CIIC)V" />
+ <method name="fill([DD)V" />
+ <method name="fill([DIID)V" />
+ <method name="fill([FF)V" />
+ <method name="fill([FIIF)V" />
+ <method name="fill([II)V" />
+ <method name="fill([IIII)V" />
+ <method name="fill([JIIJ)V" />
+ <method name="fill([JJ)V" />
+ <method name="fill([Ljava/lang/Object;IILjava/lang/Object;)V" />
+ <method name="fill([Ljava/lang/Object;Ljava/lang/Object;)V" />
+ <method name="fill([SIIS)V" />
+ <method name="fill([SS)V" />
+ <method name="fill([ZIIZ)V" />
+ <method name="fill([ZZ)V" />
+ <method name="hashCode([B)I" />
+ <method name="hashCode([C)I" />
+ <method name="hashCode([D)I" />
+ <method name="hashCode([F)I" />
+ <method name="hashCode([I)I" />
+ <method name="hashCode([J)I" />
+ <method name="hashCode([Ljava/lang/Object;)I" />
+ <method name="hashCode([S)I" />
+ <method name="hashCode([Z)I" />
+ <method name="sort([B)V" />
+ <method name="sort([BII)V" />
+ <method name="sort([C)V" />
+ <method name="sort([CII)V" />
+ <method name="sort([D)V" />
+ <method name="sort([DII)V" />
+ <method name="sort([F)V" />
+ <method name="sort([FII)V" />
+ <method name="sort([I)V" />
+ <method name="sort([III)V" />
+ <method name="sort([J)V" />
+ <method name="sort([JII)V" />
+ <method name="sort([Ljava/lang/Object;)V" />
+ <method name="sort([Ljava/lang/Object;II)V" />
+ <method name="sort([Ljava/lang/Object;IILjava/util/Comparator;)V" />
+ <method name="sort([Ljava/lang/Object;Ljava/util/Comparator;)V" />
+ <method name="sort([S)V" />
+ <method name="sort([SII)V" />
+ <method name="toString([B)Ljava/lang/String;" />
+ <method name="toString([C)Ljava/lang/String;" />
+ <method name="toString([D)Ljava/lang/String;" />
+ <method name="toString([F)Ljava/lang/String;" />
+ <method name="toString([I)Ljava/lang/String;" />
+ <method name="toString([J)Ljava/lang/String;" />
+ <method name="toString([Ljava/lang/Object;)Ljava/lang/String;" />
+ <method name="toString([S)Ljava/lang/String;" />
+ <method name="toString([Z)Ljava/lang/String;" />
+ </class>
+ <class name="java/util/BitSet" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="and(Ljava/util/BitSet;)V" />
+ <method name="andNot(Ljava/util/BitSet;)V" />
+ <method name="cardinality()I" />
+ <method name="clear()V" />
+ <method name="clear(I)V" />
+ <method name="clear(II)V" />
+ <method name="flip(I)V" />
+ <method name="flip(II)V" />
+ <method name="get(I)Z" />
+ <method name="get(II)Ljava/util/BitSet;" />
+ <method name="intersects(Ljava/util/BitSet;)Z" />
+ <method name="isEmpty()Z" />
+ <method name="length()I" />
+ <method name="nextClearBit(I)I" />
+ <method name="nextSetBit(I)I" />
+ <method name="or(Ljava/util/BitSet;)V" />
+ <method name="previousClearBit(I)I" since="19" />
+ <method name="previousSetBit(I)I" since="19" />
+ <method name="set(I)V" />
+ <method name="set(II)V" />
+ <method name="set(IIZ)V" />
+ <method name="set(IZ)V" />
+ <method name="size()I" />
+ <method name="toByteArray()[B" since="19" />
+ <method name="toLongArray()[J" since="19" />
+ <method name="valueOf(Ljava/nio/ByteBuffer;)Ljava/util/BitSet;" since="19" />
+ <method name="valueOf(Ljava/nio/LongBuffer;)Ljava/util/BitSet;" since="19" />
+ <method name="valueOf([B)Ljava/util/BitSet;" since="19" />
+ <method name="valueOf([J)Ljava/util/BitSet;" since="19" />
+ <method name="xor(Ljava/util/BitSet;)V" />
+ </class>
+ <class name="java/util/Calendar" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/util/TimeZone;Ljava/util/Locale;)V" />
+ <method name="add(II)V" />
+ <method name="after(Ljava/lang/Object;)Z" />
+ <method name="before(Ljava/lang/Object;)Z" />
+ <method name="clear()V" />
+ <method name="clear(I)V" />
+ <method name="compareTo(Ljava/util/Calendar;)I" />
+ <method name="complete()V" />
+ <method name="computeFields()V" />
+ <method name="computeTime()V" />
+ <method name="get(I)I" />
+ <method name="getActualMaximum(I)I" />
+ <method name="getActualMinimum(I)I" />
+ <method name="getAvailableLocales()[Ljava/util/Locale;" />
+ <method name="getDisplayName(IILjava/util/Locale;)Ljava/lang/String;" since="9" />
+ <method name="getDisplayNames(IILjava/util/Locale;)Ljava/util/Map;" since="9" />
+ <method name="getFirstDayOfWeek()I" />
+ <method name="getGreatestMinimum(I)I" />
+ <method name="getInstance()Ljava/util/Calendar;" />
+ <method name="getInstance(Ljava/util/Locale;)Ljava/util/Calendar;" />
+ <method name="getInstance(Ljava/util/TimeZone;)Ljava/util/Calendar;" />
+ <method name="getInstance(Ljava/util/TimeZone;Ljava/util/Locale;)Ljava/util/Calendar;" />
+ <method name="getLeastMaximum(I)I" />
+ <method name="getMaximum(I)I" />
+ <method name="getMinimalDaysInFirstWeek()I" />
+ <method name="getMinimum(I)I" />
+ <method name="getTime()Ljava/util/Date;" />
+ <method name="getTimeInMillis()J" />
+ <method name="getTimeZone()Ljava/util/TimeZone;" />
+ <method name="internalGet(I)I" />
+ <method name="isLenient()Z" />
+ <method name="isSet(I)Z" />
+ <method name="roll(II)V" />
+ <method name="roll(IZ)V" />
+ <method name="set(II)V" />
+ <method name="set(III)V" />
+ <method name="set(IIIII)V" />
+ <method name="set(IIIIII)V" />
+ <method name="setFirstDayOfWeek(I)V" />
+ <method name="setLenient(Z)V" />
+ <method name="setMinimalDaysInFirstWeek(I)V" />
+ <method name="setTime(Ljava/util/Date;)V" />
+ <method name="setTimeInMillis(J)V" />
+ <method name="setTimeZone(Ljava/util/TimeZone;)V" />
+ <field name="ALL_STYLES" since="9" />
+ <field name="AM" />
+ <field name="AM_PM" />
+ <field name="APRIL" />
+ <field name="AUGUST" />
+ <field name="DATE" />
+ <field name="DAY_OF_MONTH" />
+ <field name="DAY_OF_WEEK" />
+ <field name="DAY_OF_WEEK_IN_MONTH" />
+ <field name="DAY_OF_YEAR" />
+ <field name="DECEMBER" />
+ <field name="DST_OFFSET" />
+ <field name="ERA" />
+ <field name="FEBRUARY" />
+ <field name="FIELD_COUNT" />
+ <field name="FRIDAY" />
+ <field name="HOUR" />
+ <field name="HOUR_OF_DAY" />
+ <field name="JANUARY" />
+ <field name="JULY" />
+ <field name="JUNE" />
+ <field name="LONG" since="9" />
+ <field name="MARCH" />
+ <field name="MAY" />
+ <field name="MILLISECOND" />
+ <field name="MINUTE" />
+ <field name="MONDAY" />
+ <field name="MONTH" />
+ <field name="NOVEMBER" />
+ <field name="OCTOBER" />
+ <field name="PM" />
+ <field name="SATURDAY" />
+ <field name="SECOND" />
+ <field name="SEPTEMBER" />
+ <field name="SHORT" since="9" />
+ <field name="SUNDAY" />
+ <field name="THURSDAY" />
+ <field name="TUESDAY" />
+ <field name="UNDECIMBER" />
+ <field name="WEDNESDAY" />
+ <field name="WEEK_OF_MONTH" />
+ <field name="WEEK_OF_YEAR" />
+ <field name="YEAR" />
+ <field name="ZONE_OFFSET" />
+ <field name="areFieldsSet" />
+ <field name="fields" />
+ <field name="isSet" />
+ <field name="isTimeSet" />
+ <field name="time" />
+ </class>
+ <class name="java/util/Collection" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Iterable" />
+ <method name="add(Ljava/lang/Object;)Z" />
+ <method name="addAll(Ljava/util/Collection;)Z" />
+ <method name="clear()V" />
+ <method name="contains(Ljava/lang/Object;)Z" />
+ <method name="containsAll(Ljava/util/Collection;)Z" />
+ <method name="isEmpty()Z" />
+ <method name="remove(Ljava/lang/Object;)Z" />
+ <method name="removeAll(Ljava/util/Collection;)Z" />
+ <method name="retainAll(Ljava/util/Collection;)Z" />
+ <method name="size()I" />
+ <method name="toArray()[Ljava/lang/Object;" />
+ <method name="toArray([Ljava/lang/Object;)[Ljava/lang/Object;" />
+ </class>
+ <class name="java/util/Collections" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addAll(Ljava/util/Collection;[Ljava/lang/Object;)Z" />
+ <method name="asLifoQueue(Ljava/util/Deque;)Ljava/util/Queue;" since="9" />
+ <method name="binarySearch(Ljava/util/List;Ljava/lang/Object;)I" />
+ <method name="binarySearch(Ljava/util/List;Ljava/lang/Object;Ljava/util/Comparator;)I" />
+ <method name="checkedCollection(Ljava/util/Collection;Ljava/lang/Class;)Ljava/util/Collection;" />
+ <method name="checkedList(Ljava/util/List;Ljava/lang/Class;)Ljava/util/List;" />
+ <method name="checkedMap(Ljava/util/Map;Ljava/lang/Class;Ljava/lang/Class;)Ljava/util/Map;" />
+ <method name="checkedSet(Ljava/util/Set;Ljava/lang/Class;)Ljava/util/Set;" />
+ <method name="checkedSortedMap(Ljava/util/SortedMap;Ljava/lang/Class;Ljava/lang/Class;)Ljava/util/SortedMap;" />
+ <method name="checkedSortedSet(Ljava/util/SortedSet;Ljava/lang/Class;)Ljava/util/SortedSet;" />
+ <method name="copy(Ljava/util/List;Ljava/util/List;)V" />
+ <method name="disjoint(Ljava/util/Collection;Ljava/util/Collection;)Z" />
+ <method name="emptyEnumeration()Ljava/util/Enumeration;" since="19" />
+ <method name="emptyIterator()Ljava/util/Iterator;" since="19" />
+ <method name="emptyList()Ljava/util/List;" />
+ <method name="emptyListIterator()Ljava/util/ListIterator;" since="19" />
+ <method name="emptyMap()Ljava/util/Map;" />
+ <method name="emptySet()Ljava/util/Set;" />
+ <method name="enumeration(Ljava/util/Collection;)Ljava/util/Enumeration;" />
+ <method name="fill(Ljava/util/List;Ljava/lang/Object;)V" />
+ <method name="frequency(Ljava/util/Collection;Ljava/lang/Object;)I" />
+ <method name="indexOfSubList(Ljava/util/List;Ljava/util/List;)I" />
+ <method name="lastIndexOfSubList(Ljava/util/List;Ljava/util/List;)I" />
+ <method name="list(Ljava/util/Enumeration;)Ljava/util/ArrayList;" />
+ <method name="max(Ljava/util/Collection;)Ljava/lang/Object;" />
+ <method name="max(Ljava/util/Collection;Ljava/util/Comparator;)Ljava/lang/Object;" />
+ <method name="min(Ljava/util/Collection;)Ljava/lang/Object;" />
+ <method name="min(Ljava/util/Collection;Ljava/util/Comparator;)Ljava/lang/Object;" />
+ <method name="nCopies(ILjava/lang/Object;)Ljava/util/List;" />
+ <method name="newSetFromMap(Ljava/util/Map;)Ljava/util/Set;" since="9" />
+ <method name="replaceAll(Ljava/util/List;Ljava/lang/Object;Ljava/lang/Object;)Z" />
+ <method name="reverse(Ljava/util/List;)V" />
+ <method name="reverseOrder()Ljava/util/Comparator;" />
+ <method name="reverseOrder(Ljava/util/Comparator;)Ljava/util/Comparator;" />
+ <method name="rotate(Ljava/util/List;I)V" />
+ <method name="shuffle(Ljava/util/List;)V" />
+ <method name="shuffle(Ljava/util/List;Ljava/util/Random;)V" />
+ <method name="singleton(Ljava/lang/Object;)Ljava/util/Set;" />
+ <method name="singletonList(Ljava/lang/Object;)Ljava/util/List;" />
+ <method name="singletonMap(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;" />
+ <method name="sort(Ljava/util/List;)V" />
+ <method name="sort(Ljava/util/List;Ljava/util/Comparator;)V" />
+ <method name="swap(Ljava/util/List;II)V" />
+ <method name="synchronizedCollection(Ljava/util/Collection;)Ljava/util/Collection;" />
+ <method name="synchronizedList(Ljava/util/List;)Ljava/util/List;" />
+ <method name="synchronizedMap(Ljava/util/Map;)Ljava/util/Map;" />
+ <method name="synchronizedSet(Ljava/util/Set;)Ljava/util/Set;" />
+ <method name="synchronizedSortedMap(Ljava/util/SortedMap;)Ljava/util/SortedMap;" />
+ <method name="synchronizedSortedSet(Ljava/util/SortedSet;)Ljava/util/SortedSet;" />
+ <method name="unmodifiableCollection(Ljava/util/Collection;)Ljava/util/Collection;" />
+ <method name="unmodifiableList(Ljava/util/List;)Ljava/util/List;" />
+ <method name="unmodifiableMap(Ljava/util/Map;)Ljava/util/Map;" />
+ <method name="unmodifiableSet(Ljava/util/Set;)Ljava/util/Set;" />
+ <method name="unmodifiableSortedMap(Ljava/util/SortedMap;)Ljava/util/SortedMap;" />
+ <method name="unmodifiableSortedSet(Ljava/util/SortedSet;)Ljava/util/SortedSet;" />
+ <field name="EMPTY_LIST" />
+ <field name="EMPTY_MAP" />
+ <field name="EMPTY_SET" />
+ </class>
+ <class name="java/util/Comparator" since="1">
+ <extends name="java/lang/Object" />
+ <method name="compare(Ljava/lang/Object;Ljava/lang/Object;)I" />
+ </class>
+ <class name="java/util/ConcurrentModificationException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" since="19" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" since="19" />
+ </class>
+ <class name="java/util/Currency" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>()V" />
+ <method name="getAvailableCurrencies()Ljava/util/Set;" since="19" />
+ <method name="getCurrencyCode()Ljava/lang/String;" />
+ <method name="getDefaultFractionDigits()I" />
+ <method name="getDisplayName()Ljava/lang/String;" since="19" />
+ <method name="getDisplayName(Ljava/util/Locale;)Ljava/lang/String;" since="19" />
+ <method name="getInstance(Ljava/lang/String;)Ljava/util/Currency;" />
+ <method name="getInstance(Ljava/util/Locale;)Ljava/util/Currency;" />
+ <method name="getSymbol()Ljava/lang/String;" />
+ <method name="getSymbol(Ljava/util/Locale;)Ljava/lang/String;" />
+ </class>
+ <class name="java/util/Date" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(III)V" />
+ <method name="&lt;init>(IIIII)V" />
+ <method name="&lt;init>(IIIIII)V" />
+ <method name="&lt;init>(J)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="UTC(IIIIII)J" />
+ <method name="after(Ljava/util/Date;)Z" />
+ <method name="before(Ljava/util/Date;)Z" />
+ <method name="compareTo(Ljava/util/Date;)I" />
+ <method name="getDate()I" />
+ <method name="getDay()I" />
+ <method name="getHours()I" />
+ <method name="getMinutes()I" />
+ <method name="getMonth()I" />
+ <method name="getSeconds()I" />
+ <method name="getTime()J" />
+ <method name="getTimezoneOffset()I" />
+ <method name="getYear()I" />
+ <method name="parse(Ljava/lang/String;)J" />
+ <method name="setDate(I)V" />
+ <method name="setHours(I)V" />
+ <method name="setMinutes(I)V" />
+ <method name="setMonth(I)V" />
+ <method name="setSeconds(I)V" />
+ <method name="setTime(J)V" />
+ <method name="setYear(I)V" />
+ <method name="toGMTString()Ljava/lang/String;" />
+ <method name="toLocaleString()Ljava/lang/String;" />
+ </class>
+ <class name="java/util/Deque" since="9">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/Queue" />
+ <method name="addFirst(Ljava/lang/Object;)V" />
+ <method name="addLast(Ljava/lang/Object;)V" />
+ <method name="descendingIterator()Ljava/util/Iterator;" />
+ <method name="getFirst()Ljava/lang/Object;" />
+ <method name="getLast()Ljava/lang/Object;" />
+ <method name="offerFirst(Ljava/lang/Object;)Z" />
+ <method name="offerLast(Ljava/lang/Object;)Z" />
+ <method name="peekFirst()Ljava/lang/Object;" />
+ <method name="peekLast()Ljava/lang/Object;" />
+ <method name="pollFirst()Ljava/lang/Object;" />
+ <method name="pollLast()Ljava/lang/Object;" />
+ <method name="pop()Ljava/lang/Object;" />
+ <method name="push(Ljava/lang/Object;)V" />
+ <method name="removeFirst()Ljava/lang/Object;" />
+ <method name="removeFirstOccurrence(Ljava/lang/Object;)Z" />
+ <method name="removeLast()Ljava/lang/Object;" />
+ <method name="removeLastOccurrence(Ljava/lang/Object;)Z" />
+ </class>
+ <class name="java/util/Dictionary" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="elements()Ljava/util/Enumeration;" />
+ <method name="get(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="isEmpty()Z" />
+ <method name="keys()Ljava/util/Enumeration;" />
+ <method name="put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="remove(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="size()I" />
+ </class>
+ <class name="java/util/DuplicateFormatFlagsException" since="1">
+ <extends name="java/util/IllegalFormatException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getFlags()Ljava/lang/String;" />
+ </class>
+ <class name="java/util/EmptyStackException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/util/EnumMap" since="1">
+ <extends name="java/util/AbstractMap" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="java/util/Map" />
+ <method name="&lt;init>(Ljava/lang/Class;)V" />
+ <method name="&lt;init>(Ljava/util/EnumMap;)V" />
+ <method name="&lt;init>(Ljava/util/Map;)V" />
+ <method name="clone()Ljava/util/EnumMap;" />
+ <method name="put(Ljava/lang/Enum;Ljava/lang/Object;)Ljava/lang/Object;" />
+ </class>
+ <class name="java/util/EnumSet" since="1">
+ <extends name="java/util/AbstractSet" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>()V" />
+ <method name="allOf(Ljava/lang/Class;)Ljava/util/EnumSet;" />
+ <method name="clone()Ljava/util/EnumSet;" />
+ <method name="complementOf(Ljava/util/EnumSet;)Ljava/util/EnumSet;" />
+ <method name="copyOf(Ljava/util/Collection;)Ljava/util/EnumSet;" />
+ <method name="copyOf(Ljava/util/EnumSet;)Ljava/util/EnumSet;" />
+ <method name="noneOf(Ljava/lang/Class;)Ljava/util/EnumSet;" />
+ <method name="of(Ljava/lang/Enum;)Ljava/util/EnumSet;" />
+ <method name="of(Ljava/lang/Enum;Ljava/lang/Enum;)Ljava/util/EnumSet;" />
+ <method name="of(Ljava/lang/Enum;Ljava/lang/Enum;Ljava/lang/Enum;)Ljava/util/EnumSet;" />
+ <method name="of(Ljava/lang/Enum;Ljava/lang/Enum;Ljava/lang/Enum;Ljava/lang/Enum;)Ljava/util/EnumSet;" />
+ <method name="of(Ljava/lang/Enum;Ljava/lang/Enum;Ljava/lang/Enum;Ljava/lang/Enum;Ljava/lang/Enum;)Ljava/util/EnumSet;" />
+ <method name="of(Ljava/lang/Enum;[Ljava/lang/Enum;)Ljava/util/EnumSet;" />
+ <method name="range(Ljava/lang/Enum;Ljava/lang/Enum;)Ljava/util/EnumSet;" />
+ </class>
+ <class name="java/util/Enumeration" since="1">
+ <extends name="java/lang/Object" />
+ <method name="hasMoreElements()Z" />
+ <method name="nextElement()Ljava/lang/Object;" />
+ </class>
+ <class name="java/util/EventListener" since="1">
+ <extends name="java/lang/Object" />
+ </class>
+ <class name="java/util/EventListenerProxy" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/EventListener" />
+ <method name="&lt;init>(Ljava/util/EventListener;)V" />
+ <method name="getListener()Ljava/util/EventListener;" />
+ </class>
+ <class name="java/util/EventObject" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/lang/Object;)V" />
+ <method name="getSource()Ljava/lang/Object;" />
+ <field name="source" />
+ </class>
+ <class name="java/util/FormatFlagsConversionMismatchException" since="1">
+ <extends name="java/util/IllegalFormatException" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/lang/String;C)V" />
+ <method name="getConversion()C" />
+ <method name="getFlags()Ljava/lang/String;" />
+ </class>
+ <class name="java/util/Formattable" since="1">
+ <extends name="java/lang/Object" />
+ <method name="formatTo(Ljava/util/Formatter;III)V" />
+ </class>
+ <class name="java/util/FormattableFlags" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="ALTERNATE" />
+ <field name="LEFT_JUSTIFY" />
+ <field name="UPPERCASE" />
+ </class>
+ <class name="java/util/Formatter" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Closeable" />
+ <implements name="java/io/Flushable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/io/File;)V" />
+ <method name="&lt;init>(Ljava/io/File;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/io/File;Ljava/lang/String;Ljava/util/Locale;)V" />
+ <method name="&lt;init>(Ljava/io/OutputStream;)V" />
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/lang/String;Ljava/util/Locale;)V" />
+ <method name="&lt;init>(Ljava/io/PrintStream;)V" />
+ <method name="&lt;init>(Ljava/lang/Appendable;)V" />
+ <method name="&lt;init>(Ljava/lang/Appendable;Ljava/util/Locale;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/util/Locale;)V" />
+ <method name="&lt;init>(Ljava/util/Locale;)V" />
+ <method name="format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/util/Formatter;" />
+ <method name="format(Ljava/util/Locale;Ljava/lang/String;[Ljava/lang/Object;)Ljava/util/Formatter;" />
+ <method name="ioException()Ljava/io/IOException;" />
+ <method name="locale()Ljava/util/Locale;" />
+ <method name="out()Ljava/lang/Appendable;" />
+ </class>
+ <class name="java/util/Formatter$BigDecimalLayoutForm" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Ljava/util/Formatter$BigDecimalLayoutForm;" />
+ <method name="values()[Ljava/util/Formatter$BigDecimalLayoutForm;" />
+ <field name="DECIMAL_FLOAT" />
+ <field name="SCIENTIFIC" />
+ </class>
+ <class name="java/util/FormatterClosedException" since="1">
+ <extends name="java/lang/IllegalStateException" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/util/GregorianCalendar" since="1">
+ <extends name="java/util/Calendar" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(III)V" />
+ <method name="&lt;init>(IIIII)V" />
+ <method name="&lt;init>(IIIIII)V" />
+ <method name="&lt;init>(Ljava/util/Locale;)V" />
+ <method name="&lt;init>(Ljava/util/TimeZone;)V" />
+ <method name="&lt;init>(Ljava/util/TimeZone;Ljava/util/Locale;)V" />
+ <method name="getGregorianChange()Ljava/util/Date;" />
+ <method name="isLeapYear(I)Z" />
+ <method name="setGregorianChange(Ljava/util/Date;)V" />
+ <field name="AD" />
+ <field name="BC" />
+ </class>
+ <class name="java/util/HashMap" since="1">
+ <extends name="java/util/AbstractMap" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="java/util/Map" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(IF)V" />
+ <method name="&lt;init>(Ljava/util/Map;)V" />
+ </class>
+ <class name="java/util/HashSet" since="1">
+ <extends name="java/util/AbstractSet" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="java/util/Set" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(IF)V" />
+ <method name="&lt;init>(Ljava/util/Collection;)V" />
+ </class>
+ <class name="java/util/Hashtable" since="1">
+ <extends name="java/util/Dictionary" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="java/util/Map" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(IF)V" />
+ <method name="&lt;init>(Ljava/util/Map;)V" />
+ <method name="contains(Ljava/lang/Object;)Z" />
+ <method name="rehash()V" />
+ </class>
+ <class name="java/util/IdentityHashMap" since="1">
+ <extends name="java/util/AbstractMap" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="java/util/Map" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Ljava/util/Map;)V" />
+ </class>
+ <class name="java/util/IllegalFormatCodePointException" since="1">
+ <extends name="java/util/IllegalFormatException" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(I)V" />
+ <method name="getCodePoint()I" />
+ </class>
+ <class name="java/util/IllegalFormatConversionException" since="1">
+ <extends name="java/util/IllegalFormatException" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(CLjava/lang/Class;)V" />
+ <method name="getArgumentClass()Ljava/lang/Class;" />
+ <method name="getConversion()C" />
+ </class>
+ <class name="java/util/IllegalFormatException" since="1">
+ <extends name="java/lang/IllegalArgumentException" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/util/IllegalFormatFlagsException" since="1">
+ <extends name="java/util/IllegalFormatException" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getFlags()Ljava/lang/String;" />
+ </class>
+ <class name="java/util/IllegalFormatPrecisionException" since="1">
+ <extends name="java/util/IllegalFormatException" />
+ <method name="&lt;init>(I)V" />
+ <method name="getPrecision()I" />
+ </class>
+ <class name="java/util/IllegalFormatWidthException" since="1">
+ <extends name="java/util/IllegalFormatException" />
+ <method name="&lt;init>(I)V" />
+ <method name="getWidth()I" />
+ </class>
+ <class name="java/util/IllformedLocaleException" since="21">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;I)V" />
+ <method name="getErrorIndex()I" />
+ </class>
+ <class name="java/util/InputMismatchException" since="1">
+ <extends name="java/util/NoSuchElementException" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/util/InvalidPropertiesFormatException" since="1">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/util/Iterator" since="1">
+ <extends name="java/lang/Object" />
+ <method name="hasNext()Z" />
+ <method name="next()Ljava/lang/Object;" />
+ <method name="remove()V" />
+ </class>
+ <class name="java/util/LinkedHashMap" since="1">
+ <extends name="java/util/HashMap" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(IF)V" />
+ <method name="&lt;init>(IFZ)V" />
+ <method name="&lt;init>(Ljava/util/Map;)V" />
+ <method name="removeEldestEntry(Ljava/util/Map$Entry;)Z" />
+ </class>
+ <class name="java/util/LinkedHashSet" since="1">
+ <extends name="java/util/HashSet" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="java/util/Set" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(IF)V" />
+ <method name="&lt;init>(Ljava/util/Collection;)V" />
+ </class>
+ <class name="java/util/LinkedList" since="1">
+ <extends name="java/util/AbstractSequentialList" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="java/util/Deque" since="9" />
+ <implements name="java/util/List" />
+ <implements name="java/util/Queue" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/util/Collection;)V" />
+ <method name="addFirst(Ljava/lang/Object;)V" />
+ <method name="addLast(Ljava/lang/Object;)V" />
+ <method name="getFirst()Ljava/lang/Object;" />
+ <method name="getLast()Ljava/lang/Object;" />
+ <method name="removeFirst()Ljava/lang/Object;" />
+ <method name="removeLast()Ljava/lang/Object;" />
+ </class>
+ <class name="java/util/List" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/Collection" />
+ <method name="add(ILjava/lang/Object;)V" />
+ <method name="addAll(ILjava/util/Collection;)Z" />
+ <method name="get(I)Ljava/lang/Object;" />
+ <method name="indexOf(Ljava/lang/Object;)I" />
+ <method name="lastIndexOf(Ljava/lang/Object;)I" />
+ <method name="listIterator()Ljava/util/ListIterator;" />
+ <method name="listIterator(I)Ljava/util/ListIterator;" />
+ <method name="remove(I)Ljava/lang/Object;" />
+ <method name="set(ILjava/lang/Object;)Ljava/lang/Object;" />
+ <method name="subList(II)Ljava/util/List;" />
+ </class>
+ <class name="java/util/ListIterator" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/Iterator" />
+ <method name="add(Ljava/lang/Object;)V" />
+ <method name="hasPrevious()Z" />
+ <method name="nextIndex()I" />
+ <method name="previous()Ljava/lang/Object;" />
+ <method name="previousIndex()I" />
+ <method name="set(Ljava/lang/Object;)V" />
+ </class>
+ <class name="java/util/ListResourceBundle" since="1">
+ <extends name="java/util/ResourceBundle" />
+ <method name="&lt;init>()V" />
+ <method name="getContents()[[Ljava/lang/Object;" />
+ </class>
+ <class name="java/util/Locale" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="forLanguageTag(Ljava/lang/String;)Ljava/util/Locale;" since="21" />
+ <method name="getAvailableLocales()[Ljava/util/Locale;" />
+ <method name="getCountry()Ljava/lang/String;" />
+ <method name="getDefault()Ljava/util/Locale;" />
+ <method name="getDisplayCountry()Ljava/lang/String;" />
+ <method name="getDisplayCountry(Ljava/util/Locale;)Ljava/lang/String;" />
+ <method name="getDisplayLanguage()Ljava/lang/String;" />
+ <method name="getDisplayLanguage(Ljava/util/Locale;)Ljava/lang/String;" />
+ <method name="getDisplayName()Ljava/lang/String;" />
+ <method name="getDisplayName(Ljava/util/Locale;)Ljava/lang/String;" />
+ <method name="getDisplayScript()Ljava/lang/String;" since="21" />
+ <method name="getDisplayScript(Ljava/util/Locale;)Ljava/lang/String;" since="21" />
+ <method name="getDisplayVariant()Ljava/lang/String;" />
+ <method name="getDisplayVariant(Ljava/util/Locale;)Ljava/lang/String;" />
+ <method name="getExtension(C)Ljava/lang/String;" since="21" />
+ <method name="getExtensionKeys()Ljava/util/Set;" since="21" />
+ <method name="getISO3Country()Ljava/lang/String;" />
+ <method name="getISO3Language()Ljava/lang/String;" />
+ <method name="getISOCountries()[Ljava/lang/String;" />
+ <method name="getISOLanguages()[Ljava/lang/String;" />
+ <method name="getLanguage()Ljava/lang/String;" />
+ <method name="getScript()Ljava/lang/String;" since="21" />
+ <method name="getUnicodeLocaleAttributes()Ljava/util/Set;" since="21" />
+ <method name="getUnicodeLocaleKeys()Ljava/util/Set;" since="21" />
+ <method name="getUnicodeLocaleType(Ljava/lang/String;)Ljava/lang/String;" since="21" />
+ <method name="getVariant()Ljava/lang/String;" />
+ <method name="setDefault(Ljava/util/Locale;)V" />
+ <method name="toLanguageTag()Ljava/lang/String;" since="21" />
+ <field name="CANADA" />
+ <field name="CANADA_FRENCH" />
+ <field name="CHINA" />
+ <field name="CHINESE" />
+ <field name="ENGLISH" />
+ <field name="FRANCE" />
+ <field name="FRENCH" />
+ <field name="GERMAN" />
+ <field name="GERMANY" />
+ <field name="ITALIAN" />
+ <field name="ITALY" />
+ <field name="JAPAN" />
+ <field name="JAPANESE" />
+ <field name="KOREA" />
+ <field name="KOREAN" />
+ <field name="PRC" />
+ <field name="PRIVATE_USE_EXTENSION" since="21" />
+ <field name="ROOT" since="9" />
+ <field name="SIMPLIFIED_CHINESE" />
+ <field name="TAIWAN" />
+ <field name="TRADITIONAL_CHINESE" />
+ <field name="UK" />
+ <field name="UNICODE_LOCALE_EXTENSION" since="21" />
+ <field name="US" />
+ </class>
+ <class name="java/util/Locale$Builder" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addUnicodeLocaleAttribute(Ljava/lang/String;)Ljava/util/Locale$Builder;" />
+ <method name="build()Ljava/util/Locale;" />
+ <method name="clear()Ljava/util/Locale$Builder;" />
+ <method name="clearExtensions()Ljava/util/Locale$Builder;" />
+ <method name="removeUnicodeLocaleAttribute(Ljava/lang/String;)Ljava/util/Locale$Builder;" />
+ <method name="setExtension(CLjava/lang/String;)Ljava/util/Locale$Builder;" />
+ <method name="setLanguage(Ljava/lang/String;)Ljava/util/Locale$Builder;" />
+ <method name="setLanguageTag(Ljava/lang/String;)Ljava/util/Locale$Builder;" />
+ <method name="setLocale(Ljava/util/Locale;)Ljava/util/Locale$Builder;" />
+ <method name="setRegion(Ljava/lang/String;)Ljava/util/Locale$Builder;" />
+ <method name="setScript(Ljava/lang/String;)Ljava/util/Locale$Builder;" />
+ <method name="setUnicodeLocaleKeyword(Ljava/lang/String;Ljava/lang/String;)Ljava/util/Locale$Builder;" />
+ <method name="setVariant(Ljava/lang/String;)Ljava/util/Locale$Builder;" />
+ </class>
+ <class name="java/util/Map" since="1">
+ <extends name="java/lang/Object" />
+ <method name="clear()V" />
+ <method name="containsKey(Ljava/lang/Object;)Z" />
+ <method name="containsValue(Ljava/lang/Object;)Z" />
+ <method name="entrySet()Ljava/util/Set;" />
+ <method name="get(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="isEmpty()Z" />
+ <method name="keySet()Ljava/util/Set;" />
+ <method name="put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="putAll(Ljava/util/Map;)V" />
+ <method name="remove(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="size()I" />
+ <method name="values()Ljava/util/Collection;" />
+ </class>
+ <class name="java/util/Map$Entry" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getKey()Ljava/lang/Object;" />
+ <method name="getValue()Ljava/lang/Object;" />
+ <method name="setValue(Ljava/lang/Object;)Ljava/lang/Object;" />
+ </class>
+ <class name="java/util/MissingFormatArgumentException" since="1">
+ <extends name="java/util/IllegalFormatException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getFormatSpecifier()Ljava/lang/String;" />
+ </class>
+ <class name="java/util/MissingFormatWidthException" since="1">
+ <extends name="java/util/IllegalFormatException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getFormatSpecifier()Ljava/lang/String;" />
+ </class>
+ <class name="java/util/MissingResourceException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="getClassName()Ljava/lang/String;" />
+ <method name="getKey()Ljava/lang/String;" />
+ </class>
+ <class name="java/util/NavigableMap" since="9">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/SortedMap" />
+ <method name="ceilingEntry(Ljava/lang/Object;)Ljava/util/Map$Entry;" />
+ <method name="ceilingKey(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="descendingKeySet()Ljava/util/NavigableSet;" />
+ <method name="descendingMap()Ljava/util/NavigableMap;" />
+ <method name="firstEntry()Ljava/util/Map$Entry;" />
+ <method name="floorEntry(Ljava/lang/Object;)Ljava/util/Map$Entry;" />
+ <method name="floorKey(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="headMap(Ljava/lang/Object;Z)Ljava/util/NavigableMap;" />
+ <method name="higherEntry(Ljava/lang/Object;)Ljava/util/Map$Entry;" />
+ <method name="higherKey(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="lastEntry()Ljava/util/Map$Entry;" />
+ <method name="lowerEntry(Ljava/lang/Object;)Ljava/util/Map$Entry;" />
+ <method name="lowerKey(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="navigableKeySet()Ljava/util/NavigableSet;" />
+ <method name="pollFirstEntry()Ljava/util/Map$Entry;" />
+ <method name="pollLastEntry()Ljava/util/Map$Entry;" />
+ <method name="subMap(Ljava/lang/Object;ZLjava/lang/Object;Z)Ljava/util/NavigableMap;" />
+ <method name="tailMap(Ljava/lang/Object;Z)Ljava/util/NavigableMap;" />
+ </class>
+ <class name="java/util/NavigableSet" since="9">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/SortedSet" />
+ <method name="ceiling(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="descendingIterator()Ljava/util/Iterator;" />
+ <method name="descendingSet()Ljava/util/NavigableSet;" />
+ <method name="floor(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="headSet(Ljava/lang/Object;Z)Ljava/util/NavigableSet;" />
+ <method name="higher(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="lower(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="pollFirst()Ljava/lang/Object;" />
+ <method name="pollLast()Ljava/lang/Object;" />
+ <method name="subSet(Ljava/lang/Object;ZLjava/lang/Object;Z)Ljava/util/NavigableSet;" />
+ <method name="tailSet(Ljava/lang/Object;Z)Ljava/util/NavigableSet;" />
+ </class>
+ <class name="java/util/NoSuchElementException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/util/Objects" since="19">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="compare(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/Comparator;)I" />
+ <method name="deepEquals(Ljava/lang/Object;Ljava/lang/Object;)Z" />
+ <method name="equals(Ljava/lang/Object;Ljava/lang/Object;)Z" />
+ <method name="hash([Ljava/lang/Object;)I" />
+ <method name="hashCode(Ljava/lang/Object;)I" />
+ <method name="requireNonNull(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="requireNonNull(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="toString(Ljava/lang/Object;)Ljava/lang/String;" />
+ <method name="toString(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/String;" />
+ </class>
+ <class name="java/util/Observable" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addObserver(Ljava/util/Observer;)V" />
+ <method name="clearChanged()V" />
+ <method name="countObservers()I" />
+ <method name="deleteObserver(Ljava/util/Observer;)V" />
+ <method name="deleteObservers()V" />
+ <method name="hasChanged()Z" />
+ <method name="notifyObservers()V" />
+ <method name="notifyObservers(Ljava/lang/Object;)V" />
+ <method name="setChanged()V" />
+ </class>
+ <class name="java/util/Observer" since="1">
+ <extends name="java/lang/Object" />
+ <method name="update(Ljava/util/Observable;Ljava/lang/Object;)V" />
+ </class>
+ <class name="java/util/PriorityQueue" since="1">
+ <extends name="java/util/AbstractQueue" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(ILjava/util/Comparator;)V" />
+ <method name="&lt;init>(Ljava/util/Collection;)V" />
+ <method name="&lt;init>(Ljava/util/PriorityQueue;)V" />
+ <method name="&lt;init>(Ljava/util/SortedSet;)V" />
+ <method name="comparator()Ljava/util/Comparator;" />
+ </class>
+ <class name="java/util/Properties" since="1">
+ <extends name="java/util/Hashtable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/util/Properties;)V" />
+ <method name="getProperty(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="list(Ljava/io/PrintStream;)V" />
+ <method name="list(Ljava/io/PrintWriter;)V" />
+ <method name="load(Ljava/io/InputStream;)V" />
+ <method name="load(Ljava/io/Reader;)V" since="9" />
+ <method name="loadFromXML(Ljava/io/InputStream;)V" />
+ <method name="propertyNames()Ljava/util/Enumeration;" />
+ <method name="save(Ljava/io/OutputStream;Ljava/lang/String;)V" />
+ <method name="setProperty(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="store(Ljava/io/OutputStream;Ljava/lang/String;)V" />
+ <method name="store(Ljava/io/Writer;Ljava/lang/String;)V" since="9" />
+ <method name="storeToXML(Ljava/io/OutputStream;Ljava/lang/String;)V" />
+ <method name="storeToXML(Ljava/io/OutputStream;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="stringPropertyNames()Ljava/util/Set;" since="9" />
+ <field name="defaults" />
+ </class>
+ <class name="java/util/PropertyPermission" since="1">
+ <extends name="java/security/BasicPermission" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="java/util/PropertyResourceBundle" since="1">
+ <extends name="java/util/ResourceBundle" />
+ <method name="&lt;init>(Ljava/io/InputStream;)V" />
+ <method name="&lt;init>(Ljava/io/Reader;)V" since="9" />
+ </class>
+ <class name="java/util/Queue" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/Collection" />
+ <method name="element()Ljava/lang/Object;" />
+ <method name="offer(Ljava/lang/Object;)Z" />
+ <method name="peek()Ljava/lang/Object;" />
+ <method name="poll()Ljava/lang/Object;" />
+ <method name="remove()Ljava/lang/Object;" />
+ </class>
+ <class name="java/util/Random" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(J)V" />
+ <method name="next(I)I" />
+ <method name="nextBoolean()Z" />
+ <method name="nextBytes([B)V" />
+ <method name="nextDouble()D" />
+ <method name="nextFloat()F" />
+ <method name="nextGaussian()D" />
+ <method name="nextInt()I" />
+ <method name="nextInt(I)I" />
+ <method name="nextLong()J" />
+ <method name="setSeed(J)V" />
+ </class>
+ <class name="java/util/RandomAccess" since="1">
+ <extends name="java/lang/Object" />
+ </class>
+ <class name="java/util/ResourceBundle" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="clearCache()V" since="9" />
+ <method name="clearCache(Ljava/lang/ClassLoader;)V" since="9" />
+ <method name="containsKey(Ljava/lang/String;)Z" since="9" />
+ <method name="getBundle(Ljava/lang/String;)Ljava/util/ResourceBundle;" />
+ <method name="getBundle(Ljava/lang/String;Ljava/util/Locale;)Ljava/util/ResourceBundle;" />
+ <method name="getBundle(Ljava/lang/String;Ljava/util/Locale;Ljava/lang/ClassLoader;)Ljava/util/ResourceBundle;" />
+ <method name="getBundle(Ljava/lang/String;Ljava/util/Locale;Ljava/lang/ClassLoader;Ljava/util/ResourceBundle$Control;)Ljava/util/ResourceBundle;" since="9" />
+ <method name="getBundle(Ljava/lang/String;Ljava/util/Locale;Ljava/util/ResourceBundle$Control;)Ljava/util/ResourceBundle;" since="9" />
+ <method name="getBundle(Ljava/lang/String;Ljava/util/ResourceBundle$Control;)Ljava/util/ResourceBundle;" since="9" />
+ <method name="getKeys()Ljava/util/Enumeration;" />
+ <method name="getLocale()Ljava/util/Locale;" />
+ <method name="getObject(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="getString(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getStringArray(Ljava/lang/String;)[Ljava/lang/String;" />
+ <method name="handleGetObject(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="handleKeySet()Ljava/util/Set;" since="9" />
+ <method name="keySet()Ljava/util/Set;" since="9" />
+ <method name="setParent(Ljava/util/ResourceBundle;)V" />
+ <field name="parent" />
+ </class>
+ <class name="java/util/ResourceBundle$Control" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getCandidateLocales(Ljava/lang/String;Ljava/util/Locale;)Ljava/util/List;" />
+ <method name="getControl(Ljava/util/List;)Ljava/util/ResourceBundle$Control;" />
+ <method name="getFallbackLocale(Ljava/lang/String;Ljava/util/Locale;)Ljava/util/Locale;" />
+ <method name="getFormats(Ljava/lang/String;)Ljava/util/List;" />
+ <method name="getNoFallbackControl(Ljava/util/List;)Ljava/util/ResourceBundle$Control;" />
+ <method name="getTimeToLive(Ljava/lang/String;Ljava/util/Locale;)J" />
+ <method name="needsReload(Ljava/lang/String;Ljava/util/Locale;Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/util/ResourceBundle;J)Z" />
+ <method name="newBundle(Ljava/lang/String;Ljava/util/Locale;Ljava/lang/String;Ljava/lang/ClassLoader;Z)Ljava/util/ResourceBundle;" />
+ <method name="toBundleName(Ljava/lang/String;Ljava/util/Locale;)Ljava/lang/String;" />
+ <method name="toResourceName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <field name="FORMAT_CLASS" />
+ <field name="FORMAT_DEFAULT" />
+ <field name="FORMAT_PROPERTIES" />
+ <field name="TTL_DONT_CACHE" />
+ <field name="TTL_NO_EXPIRATION_CONTROL" />
+ </class>
+ <class name="java/util/Scanner" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Closeable" since="19" />
+ <implements name="java/util/Iterator" />
+ <method name="&lt;init>(Ljava/io/File;)V" />
+ <method name="&lt;init>(Ljava/io/File;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/io/InputStream;)V" />
+ <method name="&lt;init>(Ljava/io/InputStream;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/Readable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/nio/channels/ReadableByteChannel;)V" />
+ <method name="&lt;init>(Ljava/nio/channels/ReadableByteChannel;Ljava/lang/String;)V" />
+ <method name="close()V" />
+ <method name="delimiter()Ljava/util/regex/Pattern;" />
+ <method name="findInLine(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="findInLine(Ljava/util/regex/Pattern;)Ljava/lang/String;" />
+ <method name="findWithinHorizon(Ljava/lang/String;I)Ljava/lang/String;" />
+ <method name="findWithinHorizon(Ljava/util/regex/Pattern;I)Ljava/lang/String;" />
+ <method name="hasNext(Ljava/lang/String;)Z" />
+ <method name="hasNext(Ljava/util/regex/Pattern;)Z" />
+ <method name="hasNextBigDecimal()Z" />
+ <method name="hasNextBigInteger()Z" />
+ <method name="hasNextBigInteger(I)Z" />
+ <method name="hasNextBoolean()Z" />
+ <method name="hasNextByte()Z" />
+ <method name="hasNextByte(I)Z" />
+ <method name="hasNextDouble()Z" />
+ <method name="hasNextFloat()Z" />
+ <method name="hasNextInt()Z" />
+ <method name="hasNextInt(I)Z" />
+ <method name="hasNextLine()Z" />
+ <method name="hasNextLong()Z" />
+ <method name="hasNextLong(I)Z" />
+ <method name="hasNextShort()Z" />
+ <method name="hasNextShort(I)Z" />
+ <method name="ioException()Ljava/io/IOException;" />
+ <method name="locale()Ljava/util/Locale;" />
+ <method name="match()Ljava/util/regex/MatchResult;" />
+ <method name="next()Ljava/lang/String;" />
+ <method name="next(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="next(Ljava/util/regex/Pattern;)Ljava/lang/String;" />
+ <method name="nextBigDecimal()Ljava/math/BigDecimal;" />
+ <method name="nextBigInteger()Ljava/math/BigInteger;" />
+ <method name="nextBigInteger(I)Ljava/math/BigInteger;" />
+ <method name="nextBoolean()Z" />
+ <method name="nextByte()B" />
+ <method name="nextByte(I)B" />
+ <method name="nextDouble()D" />
+ <method name="nextFloat()F" />
+ <method name="nextInt()I" />
+ <method name="nextInt(I)I" />
+ <method name="nextLine()Ljava/lang/String;" />
+ <method name="nextLong()J" />
+ <method name="nextLong(I)J" />
+ <method name="nextShort()S" />
+ <method name="nextShort(I)S" />
+ <method name="radix()I" />
+ <method name="reset()Ljava/util/Scanner;" since="9" />
+ <method name="skip(Ljava/lang/String;)Ljava/util/Scanner;" />
+ <method name="skip(Ljava/util/regex/Pattern;)Ljava/util/Scanner;" />
+ <method name="useDelimiter(Ljava/lang/String;)Ljava/util/Scanner;" />
+ <method name="useDelimiter(Ljava/util/regex/Pattern;)Ljava/util/Scanner;" />
+ <method name="useLocale(Ljava/util/Locale;)Ljava/util/Scanner;" />
+ <method name="useRadix(I)Ljava/util/Scanner;" />
+ </class>
+ <class name="java/util/ServiceConfigurationError" since="9">
+ <extends name="java/lang/Error" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/util/ServiceLoader" since="9">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Iterable" />
+ <method name="&lt;init>()V" />
+ <method name="load(Ljava/lang/Class;)Ljava/util/ServiceLoader;" />
+ <method name="load(Ljava/lang/Class;Ljava/lang/ClassLoader;)Ljava/util/ServiceLoader;" />
+ <method name="loadInstalled(Ljava/lang/Class;)Ljava/util/ServiceLoader;" />
+ <method name="reload()V" />
+ </class>
+ <class name="java/util/Set" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/Collection" />
+ </class>
+ <class name="java/util/SimpleTimeZone" since="1">
+ <extends name="java/util/TimeZone" />
+ <method name="&lt;init>(ILjava/lang/String;)V" />
+ <method name="&lt;init>(ILjava/lang/String;IIIIIIII)V" />
+ <method name="&lt;init>(ILjava/lang/String;IIIIIIIII)V" />
+ <method name="&lt;init>(ILjava/lang/String;IIIIIIIIIII)V" />
+ <method name="setDSTSavings(I)V" />
+ <method name="setEndRule(III)V" />
+ <method name="setEndRule(IIII)V" />
+ <method name="setEndRule(IIIIZ)V" />
+ <method name="setStartRule(III)V" />
+ <method name="setStartRule(IIII)V" />
+ <method name="setStartRule(IIIIZ)V" />
+ <method name="setStartYear(I)V" />
+ <field name="STANDARD_TIME" />
+ <field name="UTC_TIME" />
+ <field name="WALL_TIME" />
+ </class>
+ <class name="java/util/SortedMap" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/Map" />
+ <method name="comparator()Ljava/util/Comparator;" />
+ <method name="firstKey()Ljava/lang/Object;" />
+ <method name="headMap(Ljava/lang/Object;)Ljava/util/SortedMap;" />
+ <method name="lastKey()Ljava/lang/Object;" />
+ <method name="subMap(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/SortedMap;" />
+ <method name="tailMap(Ljava/lang/Object;)Ljava/util/SortedMap;" />
+ </class>
+ <class name="java/util/SortedSet" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/Set" />
+ <method name="comparator()Ljava/util/Comparator;" />
+ <method name="first()Ljava/lang/Object;" />
+ <method name="headSet(Ljava/lang/Object;)Ljava/util/SortedSet;" />
+ <method name="last()Ljava/lang/Object;" />
+ <method name="subSet(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/SortedSet;" />
+ <method name="tailSet(Ljava/lang/Object;)Ljava/util/SortedSet;" />
+ </class>
+ <class name="java/util/Stack" since="1">
+ <extends name="java/util/Vector" />
+ <method name="&lt;init>()V" />
+ <method name="empty()Z" />
+ <method name="peek()Ljava/lang/Object;" />
+ <method name="pop()Ljava/lang/Object;" />
+ <method name="push(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="search(Ljava/lang/Object;)I" />
+ </class>
+ <class name="java/util/StringTokenizer" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/Enumeration" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Z)V" />
+ <method name="countTokens()I" />
+ <method name="hasMoreTokens()Z" />
+ <method name="nextToken()Ljava/lang/String;" />
+ <method name="nextToken(Ljava/lang/String;)Ljava/lang/String;" />
+ </class>
+ <class name="java/util/TimeZone" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>()V" />
+ <method name="getAvailableIDs()[Ljava/lang/String;" />
+ <method name="getAvailableIDs(I)[Ljava/lang/String;" />
+ <method name="getDSTSavings()I" />
+ <method name="getDefault()Ljava/util/TimeZone;" />
+ <method name="getDisplayName()Ljava/lang/String;" />
+ <method name="getDisplayName(Ljava/util/Locale;)Ljava/lang/String;" />
+ <method name="getDisplayName(ZI)Ljava/lang/String;" />
+ <method name="getDisplayName(ZILjava/util/Locale;)Ljava/lang/String;" />
+ <method name="getID()Ljava/lang/String;" />
+ <method name="getOffset(IIIIII)I" />
+ <method name="getOffset(J)I" />
+ <method name="getRawOffset()I" />
+ <method name="getTimeZone(Ljava/lang/String;)Ljava/util/TimeZone;" />
+ <method name="hasSameRules(Ljava/util/TimeZone;)Z" />
+ <method name="inDaylightTime(Ljava/util/Date;)Z" />
+ <method name="setDefault(Ljava/util/TimeZone;)V" />
+ <method name="setID(Ljava/lang/String;)V" />
+ <method name="setRawOffset(I)V" />
+ <method name="useDaylightTime()Z" />
+ <field name="LONG" />
+ <field name="SHORT" />
+ </class>
+ <class name="java/util/Timer" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Z)V" />
+ <method name="&lt;init>(Z)V" />
+ <method name="cancel()V" />
+ <method name="purge()I" />
+ <method name="schedule(Ljava/util/TimerTask;J)V" />
+ <method name="schedule(Ljava/util/TimerTask;JJ)V" />
+ <method name="schedule(Ljava/util/TimerTask;Ljava/util/Date;)V" />
+ <method name="schedule(Ljava/util/TimerTask;Ljava/util/Date;J)V" />
+ <method name="scheduleAtFixedRate(Ljava/util/TimerTask;JJ)V" />
+ <method name="scheduleAtFixedRate(Ljava/util/TimerTask;Ljava/util/Date;J)V" />
+ </class>
+ <class name="java/util/TimerTask" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Runnable" />
+ <method name="&lt;init>()V" />
+ <method name="cancel()Z" />
+ <method name="scheduledExecutionTime()J" />
+ </class>
+ <class name="java/util/TooManyListenersException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/util/TreeMap" since="1">
+ <extends name="java/util/AbstractMap" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="java/util/NavigableMap" since="9" />
+ <implements name="java/util/SortedMap" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/util/Comparator;)V" />
+ <method name="&lt;init>(Ljava/util/Map;)V" />
+ <method name="&lt;init>(Ljava/util/SortedMap;)V" />
+ </class>
+ <class name="java/util/TreeSet" since="1">
+ <extends name="java/util/AbstractSet" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="java/util/NavigableSet" since="9" />
+ <implements name="java/util/SortedSet" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/util/Collection;)V" />
+ <method name="&lt;init>(Ljava/util/Comparator;)V" />
+ <method name="&lt;init>(Ljava/util/SortedSet;)V" />
+ </class>
+ <class name="java/util/UUID" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Comparable" />
+ <method name="&lt;init>(JJ)V" />
+ <method name="clockSequence()I" />
+ <method name="compareTo(Ljava/util/UUID;)I" />
+ <method name="fromString(Ljava/lang/String;)Ljava/util/UUID;" />
+ <method name="getLeastSignificantBits()J" />
+ <method name="getMostSignificantBits()J" />
+ <method name="nameUUIDFromBytes([B)Ljava/util/UUID;" />
+ <method name="node()J" />
+ <method name="randomUUID()Ljava/util/UUID;" />
+ <method name="timestamp()J" />
+ <method name="variant()I" />
+ <method name="version()I" />
+ </class>
+ <class name="java/util/UnknownFormatConversionException" since="1">
+ <extends name="java/util/IllegalFormatException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getConversion()Ljava/lang/String;" />
+ </class>
+ <class name="java/util/UnknownFormatFlagsException" since="1">
+ <extends name="java/util/IllegalFormatException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getFlags()Ljava/lang/String;" />
+ </class>
+ <class name="java/util/Vector" since="1">
+ <extends name="java/util/AbstractList" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="java/util/List" />
+ <implements name="java/util/RandomAccess" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(II)V" />
+ <method name="&lt;init>(Ljava/util/Collection;)V" />
+ <method name="addElement(Ljava/lang/Object;)V" />
+ <method name="capacity()I" />
+ <method name="copyInto([Ljava/lang/Object;)V" />
+ <method name="elementAt(I)Ljava/lang/Object;" />
+ <method name="elements()Ljava/util/Enumeration;" />
+ <method name="ensureCapacity(I)V" />
+ <method name="firstElement()Ljava/lang/Object;" />
+ <method name="indexOf(Ljava/lang/Object;I)I" />
+ <method name="insertElementAt(Ljava/lang/Object;I)V" />
+ <method name="lastElement()Ljava/lang/Object;" />
+ <method name="lastIndexOf(Ljava/lang/Object;I)I" />
+ <method name="removeAllElements()V" />
+ <method name="removeElement(Ljava/lang/Object;)Z" />
+ <method name="removeElementAt(I)V" />
+ <method name="setElementAt(Ljava/lang/Object;I)V" />
+ <method name="setSize(I)V" />
+ <method name="trimToSize()V" />
+ <field name="capacityIncrement" />
+ <field name="elementCount" />
+ <field name="elementData" />
+ </class>
+ <class name="java/util/WeakHashMap" since="1">
+ <extends name="java/util/AbstractMap" />
+ <implements name="java/util/Map" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(IF)V" />
+ <method name="&lt;init>(Ljava/util/Map;)V" />
+ </class>
+ <class name="java/util/concurrent/AbstractExecutorService" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/concurrent/ExecutorService" />
+ <method name="&lt;init>()V" />
+ <method name="newTaskFor(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/RunnableFuture;" since="9" />
+ <method name="newTaskFor(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/RunnableFuture;" since="9" />
+ </class>
+ <class name="java/util/concurrent/ArrayBlockingQueue" since="1">
+ <extends name="java/util/AbstractQueue" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/util/concurrent/BlockingQueue" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(IZ)V" />
+ <method name="&lt;init>(IZLjava/util/Collection;)V" />
+ </class>
+ <class name="java/util/concurrent/BlockingDeque" since="9">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/Deque" />
+ <implements name="java/util/concurrent/BlockingQueue" />
+ <method name="offerFirst(Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;)Z" />
+ <method name="offerLast(Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;)Z" />
+ <method name="pollFirst(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;" />
+ <method name="pollLast(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;" />
+ <method name="putFirst(Ljava/lang/Object;)V" />
+ <method name="putLast(Ljava/lang/Object;)V" />
+ <method name="takeFirst()Ljava/lang/Object;" />
+ <method name="takeLast()Ljava/lang/Object;" />
+ </class>
+ <class name="java/util/concurrent/BlockingQueue" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/Queue" />
+ <method name="drainTo(Ljava/util/Collection;)I" />
+ <method name="drainTo(Ljava/util/Collection;I)I" />
+ <method name="offer(Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;)Z" />
+ <method name="poll(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;" />
+ <method name="put(Ljava/lang/Object;)V" />
+ <method name="remainingCapacity()I" />
+ <method name="take()Ljava/lang/Object;" />
+ </class>
+ <class name="java/util/concurrent/BrokenBarrierException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/util/concurrent/Callable" since="1">
+ <extends name="java/lang/Object" />
+ <method name="call()Ljava/lang/Object;" />
+ </class>
+ <class name="java/util/concurrent/CancellationException" since="1">
+ <extends name="java/lang/IllegalStateException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/util/concurrent/CompletionService" since="1">
+ <extends name="java/lang/Object" />
+ <method name="poll()Ljava/util/concurrent/Future;" />
+ <method name="poll(JLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/Future;" />
+ <method name="submit(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/Future;" />
+ <method name="submit(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/Future;" />
+ <method name="take()Ljava/util/concurrent/Future;" />
+ </class>
+ <class name="java/util/concurrent/ConcurrentHashMap" since="1">
+ <extends name="java/util/AbstractMap" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/util/concurrent/ConcurrentMap" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(IF)V" since="9" />
+ <method name="&lt;init>(IFI)V" />
+ <method name="&lt;init>(Ljava/util/Map;)V" />
+ <method name="contains(Ljava/lang/Object;)Z" />
+ <method name="elements()Ljava/util/Enumeration;" />
+ <method name="keys()Ljava/util/Enumeration;" />
+ </class>
+ <class name="java/util/concurrent/ConcurrentLinkedDeque" since="21">
+ <extends name="java/util/AbstractCollection" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/util/Deque" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/util/Collection;)V" />
+ </class>
+ <class name="java/util/concurrent/ConcurrentLinkedQueue" since="1">
+ <extends name="java/util/AbstractQueue" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/util/Queue" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/util/Collection;)V" />
+ </class>
+ <class name="java/util/concurrent/ConcurrentMap" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/Map" />
+ <method name="putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="remove(Ljava/lang/Object;Ljava/lang/Object;)Z" />
+ <method name="replace(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="replace(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z" />
+ </class>
+ <class name="java/util/concurrent/ConcurrentNavigableMap" since="9">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/NavigableMap" />
+ <implements name="java/util/concurrent/ConcurrentMap" />
+ <method name="descendingMap()Ljava/util/concurrent/ConcurrentNavigableMap;" />
+ <method name="headMap(Ljava/lang/Object;)Ljava/util/concurrent/ConcurrentNavigableMap;" />
+ <method name="headMap(Ljava/lang/Object;Z)Ljava/util/concurrent/ConcurrentNavigableMap;" />
+ <method name="keySet()Ljava/util/NavigableSet;" />
+ <method name="subMap(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/concurrent/ConcurrentNavigableMap;" />
+ <method name="subMap(Ljava/lang/Object;ZLjava/lang/Object;Z)Ljava/util/concurrent/ConcurrentNavigableMap;" />
+ <method name="tailMap(Ljava/lang/Object;)Ljava/util/concurrent/ConcurrentNavigableMap;" />
+ <method name="tailMap(Ljava/lang/Object;Z)Ljava/util/concurrent/ConcurrentNavigableMap;" />
+ </class>
+ <class name="java/util/concurrent/ConcurrentSkipListMap" since="9">
+ <extends name="java/util/AbstractMap" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="java/util/concurrent/ConcurrentNavigableMap" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/util/Comparator;)V" />
+ <method name="&lt;init>(Ljava/util/Map;)V" />
+ <method name="&lt;init>(Ljava/util/SortedMap;)V" />
+ <method name="clone()Ljava/util/concurrent/ConcurrentSkipListMap;" />
+ </class>
+ <class name="java/util/concurrent/ConcurrentSkipListSet" since="9">
+ <extends name="java/util/AbstractSet" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="java/util/NavigableSet" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/util/Collection;)V" />
+ <method name="&lt;init>(Ljava/util/Comparator;)V" />
+ <method name="&lt;init>(Ljava/util/SortedSet;)V" />
+ <method name="clone()Ljava/util/concurrent/ConcurrentSkipListSet;" />
+ <method name="headSet(Ljava/lang/Object;)Ljava/util/NavigableSet;" />
+ <method name="subSet(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/NavigableSet;" />
+ <method name="tailSet(Ljava/lang/Object;)Ljava/util/NavigableSet;" />
+ </class>
+ <class name="java/util/concurrent/CopyOnWriteArrayList" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="java/util/List" />
+ <implements name="java/util/RandomAccess" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/util/Collection;)V" />
+ <method name="&lt;init>([Ljava/lang/Object;)V" />
+ <method name="addAllAbsent(Ljava/util/Collection;)I" />
+ <method name="addIfAbsent(Ljava/lang/Object;)Z" />
+ <method name="indexOf(Ljava/lang/Object;I)I" />
+ <method name="lastIndexOf(Ljava/lang/Object;I)I" />
+ </class>
+ <class name="java/util/concurrent/CopyOnWriteArraySet" since="1">
+ <extends name="java/util/AbstractSet" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/util/Collection;)V" />
+ </class>
+ <class name="java/util/concurrent/CountDownLatch" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(I)V" />
+ <method name="await()V" />
+ <method name="await(JLjava/util/concurrent/TimeUnit;)Z" />
+ <method name="countDown()V" />
+ <method name="getCount()J" />
+ </class>
+ <class name="java/util/concurrent/CyclicBarrier" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(ILjava/lang/Runnable;)V" />
+ <method name="await()I" />
+ <method name="await(JLjava/util/concurrent/TimeUnit;)I" />
+ <method name="getNumberWaiting()I" />
+ <method name="getParties()I" />
+ <method name="isBroken()Z" />
+ <method name="reset()V" />
+ </class>
+ <class name="java/util/concurrent/DelayQueue" since="1">
+ <extends name="java/util/AbstractQueue" />
+ <implements name="java/util/concurrent/BlockingQueue" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/util/Collection;)V" />
+ <method name="add(Ljava/util/concurrent/Delayed;)Z" />
+ <method name="offer(Ljava/util/concurrent/Delayed;)Z" />
+ <method name="offer(Ljava/util/concurrent/Delayed;JLjava/util/concurrent/TimeUnit;)Z" />
+ <method name="peek()Ljava/util/concurrent/Delayed;" />
+ <method name="poll()Ljava/util/concurrent/Delayed;" />
+ <method name="poll(JLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/Delayed;" />
+ <method name="put(Ljava/util/concurrent/Delayed;)V" />
+ <method name="take()Ljava/util/concurrent/Delayed;" />
+ </class>
+ <class name="java/util/concurrent/Delayed" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Comparable" />
+ <method name="getDelay(Ljava/util/concurrent/TimeUnit;)J" />
+ </class>
+ <class name="java/util/concurrent/Exchanger" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="exchange(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="exchange(Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;" />
+ </class>
+ <class name="java/util/concurrent/ExecutionException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/util/concurrent/Executor" since="1">
+ <extends name="java/lang/Object" />
+ <method name="execute(Ljava/lang/Runnable;)V" />
+ </class>
+ <class name="java/util/concurrent/ExecutorCompletionService" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/concurrent/CompletionService" />
+ <method name="&lt;init>(Ljava/util/concurrent/Executor;)V" />
+ <method name="&lt;init>(Ljava/util/concurrent/Executor;Ljava/util/concurrent/BlockingQueue;)V" />
+ </class>
+ <class name="java/util/concurrent/ExecutorService" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/concurrent/Executor" />
+ <method name="awaitTermination(JLjava/util/concurrent/TimeUnit;)Z" />
+ <method name="invokeAll(Ljava/util/Collection;)Ljava/util/List;" />
+ <method name="invokeAll(Ljava/util/Collection;JLjava/util/concurrent/TimeUnit;)Ljava/util/List;" />
+ <method name="invokeAny(Ljava/util/Collection;)Ljava/lang/Object;" />
+ <method name="invokeAny(Ljava/util/Collection;JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;" />
+ <method name="isShutdown()Z" />
+ <method name="isTerminated()Z" />
+ <method name="shutdown()V" />
+ <method name="shutdownNow()Ljava/util/List;" />
+ <method name="submit(Ljava/lang/Runnable;)Ljava/util/concurrent/Future;" />
+ <method name="submit(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/Future;" />
+ <method name="submit(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/Future;" />
+ </class>
+ <class name="java/util/concurrent/Executors" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="callable(Ljava/lang/Runnable;)Ljava/util/concurrent/Callable;" />
+ <method name="callable(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/Callable;" />
+ <method name="callable(Ljava/security/PrivilegedAction;)Ljava/util/concurrent/Callable;" />
+ <method name="callable(Ljava/security/PrivilegedExceptionAction;)Ljava/util/concurrent/Callable;" />
+ <method name="defaultThreadFactory()Ljava/util/concurrent/ThreadFactory;" />
+ <method name="newCachedThreadPool()Ljava/util/concurrent/ExecutorService;" />
+ <method name="newCachedThreadPool(Ljava/util/concurrent/ThreadFactory;)Ljava/util/concurrent/ExecutorService;" />
+ <method name="newFixedThreadPool(I)Ljava/util/concurrent/ExecutorService;" />
+ <method name="newFixedThreadPool(ILjava/util/concurrent/ThreadFactory;)Ljava/util/concurrent/ExecutorService;" />
+ <method name="newScheduledThreadPool(I)Ljava/util/concurrent/ScheduledExecutorService;" />
+ <method name="newScheduledThreadPool(ILjava/util/concurrent/ThreadFactory;)Ljava/util/concurrent/ScheduledExecutorService;" />
+ <method name="newSingleThreadExecutor()Ljava/util/concurrent/ExecutorService;" />
+ <method name="newSingleThreadExecutor(Ljava/util/concurrent/ThreadFactory;)Ljava/util/concurrent/ExecutorService;" />
+ <method name="newSingleThreadScheduledExecutor()Ljava/util/concurrent/ScheduledExecutorService;" />
+ <method name="newSingleThreadScheduledExecutor(Ljava/util/concurrent/ThreadFactory;)Ljava/util/concurrent/ScheduledExecutorService;" />
+ <method name="privilegedCallable(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/Callable;" />
+ <method name="privilegedCallableUsingCurrentClassLoader(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/Callable;" />
+ <method name="privilegedThreadFactory()Ljava/util/concurrent/ThreadFactory;" />
+ <method name="unconfigurableExecutorService(Ljava/util/concurrent/ExecutorService;)Ljava/util/concurrent/ExecutorService;" />
+ <method name="unconfigurableScheduledExecutorService(Ljava/util/concurrent/ScheduledExecutorService;)Ljava/util/concurrent/ScheduledExecutorService;" />
+ </class>
+ <class name="java/util/concurrent/ForkJoinPool" since="21">
+ <extends name="java/util/concurrent/AbstractExecutorService" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(ILjava/util/concurrent/ForkJoinPool$ForkJoinWorkerThreadFactory;Ljava/lang/Thread$UncaughtExceptionHandler;Z)V" />
+ <method name="awaitQuiescence(JLjava/util/concurrent/TimeUnit;)Z" />
+ <method name="drainTasksTo(Ljava/util/Collection;)I" />
+ <method name="execute(Ljava/util/concurrent/ForkJoinTask;)V" />
+ <method name="getActiveThreadCount()I" />
+ <method name="getAsyncMode()Z" />
+ <method name="getFactory()Ljava/util/concurrent/ForkJoinPool$ForkJoinWorkerThreadFactory;" />
+ <method name="getParallelism()I" />
+ <method name="getPoolSize()I" />
+ <method name="getQueuedSubmissionCount()I" />
+ <method name="getQueuedTaskCount()J" />
+ <method name="getRunningThreadCount()I" />
+ <method name="getStealCount()J" />
+ <method name="getUncaughtExceptionHandler()Ljava/lang/Thread$UncaughtExceptionHandler;" />
+ <method name="hasQueuedSubmissions()Z" />
+ <method name="invoke(Ljava/util/concurrent/ForkJoinTask;)Ljava/lang/Object;" />
+ <method name="isQuiescent()Z" />
+ <method name="isTerminating()Z" />
+ <method name="managedBlock(Ljava/util/concurrent/ForkJoinPool$ManagedBlocker;)V" />
+ <method name="pollSubmission()Ljava/util/concurrent/ForkJoinTask;" />
+ <method name="submit(Ljava/lang/Runnable;)Ljava/util/concurrent/ForkJoinTask;" />
+ <method name="submit(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/ForkJoinTask;" />
+ <method name="submit(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/ForkJoinTask;" />
+ <method name="submit(Ljava/util/concurrent/ForkJoinTask;)Ljava/util/concurrent/ForkJoinTask;" />
+ <field name="defaultForkJoinWorkerThreadFactory" />
+ </class>
+ <class name="java/util/concurrent/ForkJoinPool$ForkJoinWorkerThreadFactory" since="21">
+ <extends name="java/lang/Object" />
+ <method name="newThread(Ljava/util/concurrent/ForkJoinPool;)Ljava/util/concurrent/ForkJoinWorkerThread;" />
+ </class>
+ <class name="java/util/concurrent/ForkJoinPool$ManagedBlocker" since="21">
+ <extends name="java/lang/Object" />
+ <method name="block()Z" />
+ <method name="isReleasable()Z" />
+ </class>
+ <class name="java/util/concurrent/ForkJoinTask" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/util/concurrent/Future" />
+ <method name="&lt;init>()V" />
+ <method name="adapt(Ljava/lang/Runnable;)Ljava/util/concurrent/ForkJoinTask;" />
+ <method name="adapt(Ljava/lang/Runnable;Ljava/lang/Object;)Ljava/util/concurrent/ForkJoinTask;" />
+ <method name="adapt(Ljava/util/concurrent/Callable;)Ljava/util/concurrent/ForkJoinTask;" />
+ <method name="complete(Ljava/lang/Object;)V" />
+ <method name="completeExceptionally(Ljava/lang/Throwable;)V" />
+ <method name="exec()Z" />
+ <method name="fork()Ljava/util/concurrent/ForkJoinTask;" />
+ <method name="getException()Ljava/lang/Throwable;" />
+ <method name="getPool()Ljava/util/concurrent/ForkJoinPool;" />
+ <method name="getQueuedTaskCount()I" />
+ <method name="getRawResult()Ljava/lang/Object;" />
+ <method name="getSurplusQueuedTaskCount()I" />
+ <method name="helpQuiesce()V" />
+ <method name="inForkJoinPool()Z" />
+ <method name="invoke()Ljava/lang/Object;" />
+ <method name="invokeAll(Ljava/util/Collection;)Ljava/util/Collection;" />
+ <method name="invokeAll(Ljava/util/concurrent/ForkJoinTask;Ljava/util/concurrent/ForkJoinTask;)V" />
+ <method name="invokeAll([Ljava/util/concurrent/ForkJoinTask;)V" />
+ <method name="isCompletedAbnormally()Z" />
+ <method name="isCompletedNormally()Z" />
+ <method name="join()Ljava/lang/Object;" />
+ <method name="peekNextLocalTask()Ljava/util/concurrent/ForkJoinTask;" />
+ <method name="pollNextLocalTask()Ljava/util/concurrent/ForkJoinTask;" />
+ <method name="pollTask()Ljava/util/concurrent/ForkJoinTask;" />
+ <method name="quietlyInvoke()V" />
+ <method name="quietlyJoin()V" />
+ <method name="reinitialize()V" />
+ <method name="setRawResult(Ljava/lang/Object;)V" />
+ <method name="tryUnfork()Z" />
+ </class>
+ <class name="java/util/concurrent/ForkJoinWorkerThread" since="21">
+ <extends name="java/lang/Thread" />
+ <method name="&lt;init>(Ljava/util/concurrent/ForkJoinPool;)V" />
+ <method name="getPool()Ljava/util/concurrent/ForkJoinPool;" />
+ <method name="getPoolIndex()I" />
+ <method name="onStart()V" />
+ <method name="onTermination(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/util/concurrent/Future" since="1">
+ <extends name="java/lang/Object" />
+ <method name="cancel(Z)Z" />
+ <method name="get()Ljava/lang/Object;" />
+ <method name="get(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object;" />
+ <method name="isCancelled()Z" />
+ <method name="isDone()Z" />
+ </class>
+ <class name="java/util/concurrent/FutureTask" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Runnable" />
+ <implements name="java/util/concurrent/Future" />
+ <implements name="java/util/concurrent/RunnableFuture" since="9" />
+ <method name="&lt;init>(Ljava/lang/Runnable;Ljava/lang/Object;)V" />
+ <method name="&lt;init>(Ljava/util/concurrent/Callable;)V" />
+ <method name="done()V" />
+ <method name="runAndReset()Z" />
+ <method name="set(Ljava/lang/Object;)V" />
+ <method name="setException(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/util/concurrent/LinkedBlockingDeque" since="9">
+ <extends name="java/util/AbstractQueue" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/util/concurrent/BlockingDeque" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Ljava/util/Collection;)V" />
+ </class>
+ <class name="java/util/concurrent/LinkedBlockingQueue" since="1">
+ <extends name="java/util/AbstractQueue" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/util/concurrent/BlockingQueue" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Ljava/util/Collection;)V" />
+ </class>
+ <class name="java/util/concurrent/LinkedTransferQueue" since="21">
+ <extends name="java/util/AbstractQueue" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/util/concurrent/TransferQueue" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/util/Collection;)V" />
+ </class>
+ <class name="java/util/concurrent/Phaser" since="21">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Ljava/util/concurrent/Phaser;)V" />
+ <method name="&lt;init>(Ljava/util/concurrent/Phaser;I)V" />
+ <method name="arrive()I" />
+ <method name="arriveAndAwaitAdvance()I" />
+ <method name="arriveAndDeregister()I" />
+ <method name="awaitAdvance(I)I" />
+ <method name="awaitAdvanceInterruptibly(I)I" />
+ <method name="awaitAdvanceInterruptibly(IJLjava/util/concurrent/TimeUnit;)I" />
+ <method name="bulkRegister(I)I" />
+ <method name="forceTermination()V" />
+ <method name="getArrivedParties()I" />
+ <method name="getParent()Ljava/util/concurrent/Phaser;" />
+ <method name="getPhase()I" />
+ <method name="getRegisteredParties()I" />
+ <method name="getRoot()Ljava/util/concurrent/Phaser;" />
+ <method name="getUnarrivedParties()I" />
+ <method name="isTerminated()Z" />
+ <method name="onAdvance(II)Z" />
+ <method name="register()I" />
+ </class>
+ <class name="java/util/concurrent/PriorityBlockingQueue" since="1">
+ <extends name="java/util/AbstractQueue" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/util/concurrent/BlockingQueue" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(ILjava/util/Comparator;)V" />
+ <method name="&lt;init>(Ljava/util/Collection;)V" />
+ <method name="comparator()Ljava/util/Comparator;" />
+ </class>
+ <class name="java/util/concurrent/RecursiveAction" since="21">
+ <extends name="java/util/concurrent/ForkJoinTask" />
+ <method name="&lt;init>()V" />
+ <method name="compute()V" />
+ <method name="getRawResult()Ljava/lang/Void;" />
+ <method name="setRawResult(Ljava/lang/Void;)V" />
+ </class>
+ <class name="java/util/concurrent/RecursiveTask" since="21">
+ <extends name="java/util/concurrent/ForkJoinTask" />
+ <method name="&lt;init>()V" />
+ <method name="compute()Ljava/lang/Object;" />
+ </class>
+ <class name="java/util/concurrent/RejectedExecutionException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/util/concurrent/RejectedExecutionHandler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="rejectedExecution(Ljava/lang/Runnable;Ljava/util/concurrent/ThreadPoolExecutor;)V" />
+ </class>
+ <class name="java/util/concurrent/RunnableFuture" since="9">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Runnable" />
+ <implements name="java/util/concurrent/Future" />
+ </class>
+ <class name="java/util/concurrent/RunnableScheduledFuture" since="9">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/concurrent/RunnableFuture" />
+ <implements name="java/util/concurrent/ScheduledFuture" />
+ <method name="isPeriodic()Z" />
+ </class>
+ <class name="java/util/concurrent/ScheduledExecutorService" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/concurrent/ExecutorService" />
+ <method name="schedule(Ljava/lang/Runnable;JLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/ScheduledFuture;" />
+ <method name="schedule(Ljava/util/concurrent/Callable;JLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/ScheduledFuture;" />
+ <method name="scheduleAtFixedRate(Ljava/lang/Runnable;JJLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/ScheduledFuture;" />
+ <method name="scheduleWithFixedDelay(Ljava/lang/Runnable;JJLjava/util/concurrent/TimeUnit;)Ljava/util/concurrent/ScheduledFuture;" />
+ </class>
+ <class name="java/util/concurrent/ScheduledFuture" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/concurrent/Delayed" />
+ <implements name="java/util/concurrent/Future" />
+ </class>
+ <class name="java/util/concurrent/ScheduledThreadPoolExecutor" since="1">
+ <extends name="java/util/concurrent/ThreadPoolExecutor" />
+ <implements name="java/util/concurrent/ScheduledExecutorService" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(ILjava/util/concurrent/RejectedExecutionHandler;)V" />
+ <method name="&lt;init>(ILjava/util/concurrent/ThreadFactory;)V" />
+ <method name="&lt;init>(ILjava/util/concurrent/ThreadFactory;Ljava/util/concurrent/RejectedExecutionHandler;)V" />
+ <method name="decorateTask(Ljava/lang/Runnable;Ljava/util/concurrent/RunnableScheduledFuture;)Ljava/util/concurrent/RunnableScheduledFuture;" since="9" />
+ <method name="decorateTask(Ljava/util/concurrent/Callable;Ljava/util/concurrent/RunnableScheduledFuture;)Ljava/util/concurrent/RunnableScheduledFuture;" since="9" />
+ <method name="getContinueExistingPeriodicTasksAfterShutdownPolicy()Z" />
+ <method name="getExecuteExistingDelayedTasksAfterShutdownPolicy()Z" />
+ <method name="getRemoveOnCancelPolicy()Z" since="21" />
+ <method name="setContinueExistingPeriodicTasksAfterShutdownPolicy(Z)V" />
+ <method name="setExecuteExistingDelayedTasksAfterShutdownPolicy(Z)V" />
+ <method name="setRemoveOnCancelPolicy(Z)V" since="21" />
+ </class>
+ <class name="java/util/concurrent/Semaphore" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(IZ)V" />
+ <method name="acquire()V" />
+ <method name="acquire(I)V" />
+ <method name="acquireUninterruptibly()V" />
+ <method name="acquireUninterruptibly(I)V" />
+ <method name="availablePermits()I" />
+ <method name="drainPermits()I" />
+ <method name="getQueueLength()I" />
+ <method name="getQueuedThreads()Ljava/util/Collection;" />
+ <method name="hasQueuedThreads()Z" />
+ <method name="isFair()Z" />
+ <method name="reducePermits(I)V" />
+ <method name="release()V" />
+ <method name="release(I)V" />
+ <method name="tryAcquire()Z" />
+ <method name="tryAcquire(I)Z" />
+ <method name="tryAcquire(IJLjava/util/concurrent/TimeUnit;)Z" />
+ <method name="tryAcquire(JLjava/util/concurrent/TimeUnit;)Z" />
+ </class>
+ <class name="java/util/concurrent/SynchronousQueue" since="1">
+ <extends name="java/util/AbstractQueue" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/util/concurrent/BlockingQueue" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Z)V" />
+ </class>
+ <class name="java/util/concurrent/ThreadFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="newThread(Ljava/lang/Runnable;)Ljava/lang/Thread;" />
+ </class>
+ <class name="java/util/concurrent/ThreadLocalRandom" since="21">
+ <extends name="java/util/Random" />
+ <method name="&lt;init>()V" />
+ <method name="current()Ljava/util/concurrent/ThreadLocalRandom;" />
+ <method name="nextDouble(D)D" />
+ <method name="nextDouble(DD)D" />
+ <method name="nextInt(II)I" />
+ <method name="nextLong(J)J" />
+ <method name="nextLong(JJ)J" />
+ </class>
+ <class name="java/util/concurrent/ThreadPoolExecutor" since="1">
+ <extends name="java/util/concurrent/AbstractExecutorService" />
+ <method name="&lt;init>(IIJLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/BlockingQueue;)V" />
+ <method name="&lt;init>(IIJLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/BlockingQueue;Ljava/util/concurrent/RejectedExecutionHandler;)V" />
+ <method name="&lt;init>(IIJLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/BlockingQueue;Ljava/util/concurrent/ThreadFactory;)V" />
+ <method name="&lt;init>(IIJLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/BlockingQueue;Ljava/util/concurrent/ThreadFactory;Ljava/util/concurrent/RejectedExecutionHandler;)V" />
+ <method name="afterExecute(Ljava/lang/Runnable;Ljava/lang/Throwable;)V" />
+ <method name="allowCoreThreadTimeOut(Z)V" since="9" />
+ <method name="allowsCoreThreadTimeOut()Z" since="9" />
+ <method name="beforeExecute(Ljava/lang/Thread;Ljava/lang/Runnable;)V" />
+ <method name="getActiveCount()I" />
+ <method name="getCompletedTaskCount()J" />
+ <method name="getCorePoolSize()I" />
+ <method name="getKeepAliveTime(Ljava/util/concurrent/TimeUnit;)J" />
+ <method name="getLargestPoolSize()I" />
+ <method name="getMaximumPoolSize()I" />
+ <method name="getPoolSize()I" />
+ <method name="getQueue()Ljava/util/concurrent/BlockingQueue;" />
+ <method name="getRejectedExecutionHandler()Ljava/util/concurrent/RejectedExecutionHandler;" />
+ <method name="getTaskCount()J" />
+ <method name="getThreadFactory()Ljava/util/concurrent/ThreadFactory;" />
+ <method name="isTerminating()Z" />
+ <method name="prestartAllCoreThreads()I" />
+ <method name="prestartCoreThread()Z" />
+ <method name="purge()V" />
+ <method name="remove(Ljava/lang/Runnable;)Z" />
+ <method name="setCorePoolSize(I)V" />
+ <method name="setKeepAliveTime(JLjava/util/concurrent/TimeUnit;)V" />
+ <method name="setMaximumPoolSize(I)V" />
+ <method name="setRejectedExecutionHandler(Ljava/util/concurrent/RejectedExecutionHandler;)V" />
+ <method name="setThreadFactory(Ljava/util/concurrent/ThreadFactory;)V" />
+ <method name="terminated()V" />
+ </class>
+ <class name="java/util/concurrent/ThreadPoolExecutor$AbortPolicy" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/concurrent/RejectedExecutionHandler" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/util/concurrent/ThreadPoolExecutor$CallerRunsPolicy" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/concurrent/RejectedExecutionHandler" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/util/concurrent/ThreadPoolExecutor$DiscardOldestPolicy" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/concurrent/RejectedExecutionHandler" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/util/concurrent/ThreadPoolExecutor$DiscardPolicy" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/concurrent/RejectedExecutionHandler" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/util/concurrent/TimeUnit" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="convert(JLjava/util/concurrent/TimeUnit;)J" />
+ <method name="sleep(J)V" />
+ <method name="timedJoin(Ljava/lang/Thread;J)V" />
+ <method name="timedWait(Ljava/lang/Object;J)V" />
+ <method name="toDays(J)J" since="9" />
+ <method name="toHours(J)J" since="9" />
+ <method name="toMicros(J)J" />
+ <method name="toMillis(J)J" />
+ <method name="toMinutes(J)J" since="9" />
+ <method name="toNanos(J)J" />
+ <method name="toSeconds(J)J" />
+ <method name="valueOf(Ljava/lang/String;)Ljava/util/concurrent/TimeUnit;" />
+ <method name="values()[Ljava/util/concurrent/TimeUnit;" />
+ <field name="DAYS" since="9" />
+ <field name="HOURS" since="9" />
+ <field name="MICROSECONDS" />
+ <field name="MILLISECONDS" />
+ <field name="MINUTES" since="9" />
+ <field name="NANOSECONDS" />
+ <field name="SECONDS" />
+ </class>
+ <class name="java/util/concurrent/TimeoutException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/util/concurrent/TransferQueue" since="21">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/concurrent/BlockingQueue" />
+ <method name="getWaitingConsumerCount()I" />
+ <method name="hasWaitingConsumer()Z" />
+ <method name="transfer(Ljava/lang/Object;)V" />
+ <method name="tryTransfer(Ljava/lang/Object;)Z" />
+ <method name="tryTransfer(Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;)Z" />
+ </class>
+ <class name="java/util/concurrent/atomic/AtomicBoolean" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Z)V" />
+ <method name="compareAndSet(ZZ)Z" />
+ <method name="get()Z" />
+ <method name="getAndSet(Z)Z" />
+ <method name="lazySet(Z)V" since="9" />
+ <method name="set(Z)V" />
+ <method name="weakCompareAndSet(ZZ)Z" />
+ </class>
+ <class name="java/util/concurrent/atomic/AtomicInteger" since="1">
+ <extends name="java/lang/Number" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="addAndGet(I)I" />
+ <method name="compareAndSet(II)Z" />
+ <method name="decrementAndGet()I" />
+ <method name="get()I" />
+ <method name="getAndAdd(I)I" />
+ <method name="getAndDecrement()I" />
+ <method name="getAndIncrement()I" />
+ <method name="getAndSet(I)I" />
+ <method name="incrementAndGet()I" />
+ <method name="lazySet(I)V" since="9" />
+ <method name="set(I)V" />
+ <method name="weakCompareAndSet(II)Z" />
+ </class>
+ <class name="java/util/concurrent/atomic/AtomicIntegerArray" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>([I)V" />
+ <method name="addAndGet(II)I" />
+ <method name="compareAndSet(III)Z" />
+ <method name="decrementAndGet(I)I" />
+ <method name="get(I)I" />
+ <method name="getAndAdd(II)I" />
+ <method name="getAndDecrement(I)I" />
+ <method name="getAndIncrement(I)I" />
+ <method name="getAndSet(II)I" />
+ <method name="incrementAndGet(I)I" />
+ <method name="lazySet(II)V" since="9" />
+ <method name="length()I" />
+ <method name="set(II)V" />
+ <method name="weakCompareAndSet(III)Z" />
+ </class>
+ <class name="java/util/concurrent/atomic/AtomicIntegerFieldUpdater" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addAndGet(Ljava/lang/Object;I)I" />
+ <method name="compareAndSet(Ljava/lang/Object;II)Z" />
+ <method name="decrementAndGet(Ljava/lang/Object;)I" />
+ <method name="get(Ljava/lang/Object;)I" />
+ <method name="getAndAdd(Ljava/lang/Object;I)I" />
+ <method name="getAndDecrement(Ljava/lang/Object;)I" />
+ <method name="getAndIncrement(Ljava/lang/Object;)I" />
+ <method name="getAndSet(Ljava/lang/Object;I)I" />
+ <method name="incrementAndGet(Ljava/lang/Object;)I" />
+ <method name="lazySet(Ljava/lang/Object;I)V" since="9" />
+ <method name="newUpdater(Ljava/lang/Class;Ljava/lang/String;)Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater;" />
+ <method name="set(Ljava/lang/Object;I)V" />
+ <method name="weakCompareAndSet(Ljava/lang/Object;II)Z" />
+ </class>
+ <class name="java/util/concurrent/atomic/AtomicLong" since="1">
+ <extends name="java/lang/Number" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(J)V" />
+ <method name="addAndGet(J)J" />
+ <method name="compareAndSet(JJ)Z" />
+ <method name="decrementAndGet()J" />
+ <method name="get()J" />
+ <method name="getAndAdd(J)J" />
+ <method name="getAndDecrement()J" />
+ <method name="getAndIncrement()J" />
+ <method name="getAndSet(J)J" />
+ <method name="incrementAndGet()J" />
+ <method name="lazySet(J)V" since="9" />
+ <method name="set(J)V" />
+ <method name="weakCompareAndSet(JJ)Z" />
+ </class>
+ <class name="java/util/concurrent/atomic/AtomicLongArray" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>([J)V" />
+ <method name="addAndGet(IJ)J" />
+ <method name="compareAndSet(IJJ)Z" />
+ <method name="decrementAndGet(I)J" />
+ <method name="get(I)J" />
+ <method name="getAndAdd(IJ)J" />
+ <method name="getAndDecrement(I)J" />
+ <method name="getAndIncrement(I)J" />
+ <method name="getAndSet(IJ)J" />
+ <method name="incrementAndGet(I)J" />
+ <method name="lazySet(IJ)V" since="9" />
+ <method name="length()I" />
+ <method name="set(IJ)V" />
+ <method name="weakCompareAndSet(IJJ)Z" />
+ </class>
+ <class name="java/util/concurrent/atomic/AtomicLongFieldUpdater" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addAndGet(Ljava/lang/Object;J)J" />
+ <method name="compareAndSet(Ljava/lang/Object;JJ)Z" />
+ <method name="decrementAndGet(Ljava/lang/Object;)J" />
+ <method name="get(Ljava/lang/Object;)J" />
+ <method name="getAndAdd(Ljava/lang/Object;J)J" />
+ <method name="getAndDecrement(Ljava/lang/Object;)J" />
+ <method name="getAndIncrement(Ljava/lang/Object;)J" />
+ <method name="getAndSet(Ljava/lang/Object;J)J" />
+ <method name="incrementAndGet(Ljava/lang/Object;)J" />
+ <method name="lazySet(Ljava/lang/Object;J)V" since="9" />
+ <method name="newUpdater(Ljava/lang/Class;Ljava/lang/String;)Ljava/util/concurrent/atomic/AtomicLongFieldUpdater;" />
+ <method name="set(Ljava/lang/Object;J)V" />
+ <method name="weakCompareAndSet(Ljava/lang/Object;JJ)Z" />
+ </class>
+ <class name="java/util/concurrent/atomic/AtomicMarkableReference" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/Object;Z)V" />
+ <method name="attemptMark(Ljava/lang/Object;Z)Z" />
+ <method name="compareAndSet(Ljava/lang/Object;Ljava/lang/Object;ZZ)Z" />
+ <method name="get([Z)Ljava/lang/Object;" />
+ <method name="getReference()Ljava/lang/Object;" />
+ <method name="isMarked()Z" />
+ <method name="set(Ljava/lang/Object;Z)V" />
+ <method name="weakCompareAndSet(Ljava/lang/Object;Ljava/lang/Object;ZZ)Z" />
+ </class>
+ <class name="java/util/concurrent/atomic/AtomicReference" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/Object;)V" />
+ <method name="compareAndSet(Ljava/lang/Object;Ljava/lang/Object;)Z" />
+ <method name="get()Ljava/lang/Object;" />
+ <method name="getAndSet(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="lazySet(Ljava/lang/Object;)V" since="9" />
+ <method name="set(Ljava/lang/Object;)V" />
+ <method name="weakCompareAndSet(Ljava/lang/Object;Ljava/lang/Object;)Z" />
+ </class>
+ <class name="java/util/concurrent/atomic/AtomicReferenceArray" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>([Ljava/lang/Object;)V" />
+ <method name="compareAndSet(ILjava/lang/Object;Ljava/lang/Object;)Z" />
+ <method name="get(I)Ljava/lang/Object;" />
+ <method name="getAndSet(ILjava/lang/Object;)Ljava/lang/Object;" />
+ <method name="lazySet(ILjava/lang/Object;)V" since="9" />
+ <method name="length()I" />
+ <method name="set(ILjava/lang/Object;)V" />
+ <method name="weakCompareAndSet(ILjava/lang/Object;Ljava/lang/Object;)Z" />
+ </class>
+ <class name="java/util/concurrent/atomic/AtomicReferenceFieldUpdater" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="compareAndSet(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z" />
+ <method name="get(Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="getAndSet(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;" />
+ <method name="lazySet(Ljava/lang/Object;Ljava/lang/Object;)V" since="9" />
+ <method name="newUpdater(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/String;)Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;" />
+ <method name="set(Ljava/lang/Object;Ljava/lang/Object;)V" />
+ <method name="weakCompareAndSet(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z" />
+ </class>
+ <class name="java/util/concurrent/atomic/AtomicStampedReference" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/Object;I)V" />
+ <method name="attemptStamp(Ljava/lang/Object;I)Z" />
+ <method name="compareAndSet(Ljava/lang/Object;Ljava/lang/Object;II)Z" />
+ <method name="get([I)Ljava/lang/Object;" />
+ <method name="getReference()Ljava/lang/Object;" />
+ <method name="getStamp()I" />
+ <method name="set(Ljava/lang/Object;I)V" />
+ <method name="weakCompareAndSet(Ljava/lang/Object;Ljava/lang/Object;II)Z" />
+ </class>
+ <class name="java/util/concurrent/locks/AbstractOwnableSynchronizer" since="5">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>()V" />
+ <method name="getExclusiveOwnerThread()Ljava/lang/Thread;" />
+ <method name="setExclusiveOwnerThread(Ljava/lang/Thread;)V" />
+ </class>
+ <class name="java/util/concurrent/locks/AbstractQueuedLongSynchronizer" since="9">
+ <extends name="java/util/concurrent/locks/AbstractOwnableSynchronizer" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>()V" />
+ <method name="acquire(J)V" />
+ <method name="acquireInterruptibly(J)V" />
+ <method name="acquireShared(J)V" />
+ <method name="acquireSharedInterruptibly(J)V" />
+ <method name="compareAndSetState(JJ)Z" />
+ <method name="getExclusiveQueuedThreads()Ljava/util/Collection;" />
+ <method name="getFirstQueuedThread()Ljava/lang/Thread;" />
+ <method name="getQueueLength()I" />
+ <method name="getQueuedThreads()Ljava/util/Collection;" />
+ <method name="getSharedQueuedThreads()Ljava/util/Collection;" />
+ <method name="getState()J" />
+ <method name="getWaitQueueLength(Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject;)I" />
+ <method name="getWaitingThreads(Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject;)Ljava/util/Collection;" />
+ <method name="hasContended()Z" />
+ <method name="hasQueuedPredecessors()Z" since="21" />
+ <method name="hasQueuedThreads()Z" />
+ <method name="hasWaiters(Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject;)Z" />
+ <method name="isHeldExclusively()Z" />
+ <method name="isQueued(Ljava/lang/Thread;)Z" />
+ <method name="owns(Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject;)Z" />
+ <method name="release(J)Z" />
+ <method name="releaseShared(J)Z" />
+ <method name="setState(J)V" />
+ <method name="tryAcquire(J)Z" />
+ <method name="tryAcquireNanos(JJ)Z" />
+ <method name="tryAcquireShared(J)J" />
+ <method name="tryAcquireSharedNanos(JJ)Z" />
+ <method name="tryRelease(J)Z" />
+ <method name="tryReleaseShared(J)Z" />
+ </class>
+ <class name="java/util/concurrent/locks/AbstractQueuedLongSynchronizer$ConditionObject" since="9">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/util/concurrent/locks/Condition" />
+ <method name="&lt;init>(Ljava/util/concurrent/locks/AbstractQueuedLongSynchronizer;)V" />
+ <method name="getWaitQueueLength()I" />
+ <method name="getWaitingThreads()Ljava/util/Collection;" />
+ <method name="hasWaiters()Z" />
+ </class>
+ <class name="java/util/concurrent/locks/AbstractQueuedSynchronizer" since="1">
+ <extends name="java/lang/Object" />
+ <extends name="java/util/concurrent/locks/AbstractOwnableSynchronizer" since="5" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>()V" />
+ <method name="acquire(I)V" />
+ <method name="acquireInterruptibly(I)V" />
+ <method name="acquireShared(I)V" />
+ <method name="acquireSharedInterruptibly(I)V" />
+ <method name="compareAndSetState(II)Z" />
+ <method name="getExclusiveQueuedThreads()Ljava/util/Collection;" />
+ <method name="getFirstQueuedThread()Ljava/lang/Thread;" />
+ <method name="getQueueLength()I" />
+ <method name="getQueuedThreads()Ljava/util/Collection;" />
+ <method name="getSharedQueuedThreads()Ljava/util/Collection;" />
+ <method name="getState()I" />
+ <method name="getWaitQueueLength(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;)I" />
+ <method name="getWaitingThreads(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;)Ljava/util/Collection;" />
+ <method name="hasContended()Z" />
+ <method name="hasQueuedPredecessors()Z" since="21" />
+ <method name="hasQueuedThreads()Z" />
+ <method name="hasWaiters(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;)Z" />
+ <method name="isHeldExclusively()Z" />
+ <method name="isQueued(Ljava/lang/Thread;)Z" />
+ <method name="owns(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject;)Z" />
+ <method name="release(I)Z" />
+ <method name="releaseShared(I)Z" />
+ <method name="setState(I)V" />
+ <method name="tryAcquire(I)Z" />
+ <method name="tryAcquireNanos(IJ)Z" />
+ <method name="tryAcquireShared(I)I" />
+ <method name="tryAcquireSharedNanos(IJ)Z" />
+ <method name="tryRelease(I)Z" />
+ <method name="tryReleaseShared(I)Z" />
+ </class>
+ <class name="java/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/util/concurrent/locks/Condition" />
+ <method name="&lt;init>(Ljava/util/concurrent/locks/AbstractQueuedSynchronizer;)V" />
+ <method name="getWaitQueueLength()I" />
+ <method name="getWaitingThreads()Ljava/util/Collection;" />
+ <method name="hasWaiters()Z" />
+ </class>
+ <class name="java/util/concurrent/locks/Condition" since="1">
+ <extends name="java/lang/Object" />
+ <method name="await()V" />
+ <method name="await(JLjava/util/concurrent/TimeUnit;)Z" />
+ <method name="awaitNanos(J)J" />
+ <method name="awaitUninterruptibly()V" />
+ <method name="awaitUntil(Ljava/util/Date;)Z" />
+ <method name="signal()V" />
+ <method name="signalAll()V" />
+ </class>
+ <class name="java/util/concurrent/locks/Lock" since="1">
+ <extends name="java/lang/Object" />
+ <method name="lock()V" />
+ <method name="lockInterruptibly()V" />
+ <method name="newCondition()Ljava/util/concurrent/locks/Condition;" />
+ <method name="tryLock()Z" />
+ <method name="tryLock(JLjava/util/concurrent/TimeUnit;)Z" />
+ <method name="unlock()V" />
+ </class>
+ <class name="java/util/concurrent/locks/LockSupport" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getBlocker(Ljava/lang/Thread;)Ljava/lang/Object;" since="9" />
+ <method name="park()V" />
+ <method name="park(Ljava/lang/Object;)V" since="9" />
+ <method name="parkNanos(J)V" />
+ <method name="parkNanos(Ljava/lang/Object;J)V" since="9" />
+ <method name="parkUntil(J)V" />
+ <method name="parkUntil(Ljava/lang/Object;J)V" since="9" />
+ <method name="unpark(Ljava/lang/Thread;)V" />
+ </class>
+ <class name="java/util/concurrent/locks/ReadWriteLock" since="1">
+ <extends name="java/lang/Object" />
+ <method name="readLock()Ljava/util/concurrent/locks/Lock;" />
+ <method name="writeLock()Ljava/util/concurrent/locks/Lock;" />
+ </class>
+ <class name="java/util/concurrent/locks/ReentrantLock" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/util/concurrent/locks/Lock" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Z)V" />
+ <method name="getHoldCount()I" />
+ <method name="getOwner()Ljava/lang/Thread;" />
+ <method name="getQueueLength()I" />
+ <method name="getQueuedThreads()Ljava/util/Collection;" />
+ <method name="getWaitQueueLength(Ljava/util/concurrent/locks/Condition;)I" />
+ <method name="getWaitingThreads(Ljava/util/concurrent/locks/Condition;)Ljava/util/Collection;" />
+ <method name="hasQueuedThread(Ljava/lang/Thread;)Z" />
+ <method name="hasQueuedThreads()Z" />
+ <method name="hasWaiters(Ljava/util/concurrent/locks/Condition;)Z" />
+ <method name="isFair()Z" />
+ <method name="isHeldByCurrentThread()Z" />
+ <method name="isLocked()Z" />
+ </class>
+ <class name="java/util/concurrent/locks/ReentrantReadWriteLock" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/util/concurrent/locks/ReadWriteLock" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Z)V" />
+ <method name="getOwner()Ljava/lang/Thread;" />
+ <method name="getQueueLength()I" />
+ <method name="getQueuedReaderThreads()Ljava/util/Collection;" />
+ <method name="getQueuedThreads()Ljava/util/Collection;" />
+ <method name="getQueuedWriterThreads()Ljava/util/Collection;" />
+ <method name="getReadHoldCount()I" since="9" />
+ <method name="getReadLockCount()I" />
+ <method name="getWaitQueueLength(Ljava/util/concurrent/locks/Condition;)I" />
+ <method name="getWaitingThreads(Ljava/util/concurrent/locks/Condition;)Ljava/util/Collection;" />
+ <method name="getWriteHoldCount()I" />
+ <method name="hasQueuedThread(Ljava/lang/Thread;)Z" />
+ <method name="hasQueuedThreads()Z" />
+ <method name="hasWaiters(Ljava/util/concurrent/locks/Condition;)Z" />
+ <method name="isFair()Z" />
+ <method name="isWriteLocked()Z" />
+ <method name="isWriteLockedByCurrentThread()Z" />
+ <method name="readLock()Ljava/util/concurrent/locks/ReentrantReadWriteLock$ReadLock;" />
+ <method name="writeLock()Ljava/util/concurrent/locks/ReentrantReadWriteLock$WriteLock;" />
+ </class>
+ <class name="java/util/concurrent/locks/ReentrantReadWriteLock$ReadLock" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/util/concurrent/locks/Lock" />
+ <method name="&lt;init>(Ljava/util/concurrent/locks/ReentrantReadWriteLock;)V" />
+ </class>
+ <class name="java/util/concurrent/locks/ReentrantReadWriteLock$WriteLock" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/util/concurrent/locks/Lock" />
+ <method name="&lt;init>(Ljava/util/concurrent/locks/ReentrantReadWriteLock;)V" />
+ <method name="getHoldCount()I" since="9" />
+ <method name="isHeldByCurrentThread()Z" since="9" />
+ </class>
+ <class name="java/util/jar/Attributes" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="java/util/Map" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(Ljava/util/jar/Attributes;)V" />
+ <method name="getValue(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getValue(Ljava/util/jar/Attributes$Name;)Ljava/lang/String;" />
+ <method name="putValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <field name="map" />
+ </class>
+ <class name="java/util/jar/Attributes$Name" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <field name="CLASS_PATH" />
+ <field name="CONTENT_TYPE" />
+ <field name="EXTENSION_INSTALLATION" />
+ <field name="EXTENSION_LIST" />
+ <field name="EXTENSION_NAME" />
+ <field name="IMPLEMENTATION_TITLE" />
+ <field name="IMPLEMENTATION_URL" />
+ <field name="IMPLEMENTATION_VENDOR" />
+ <field name="IMPLEMENTATION_VENDOR_ID" />
+ <field name="IMPLEMENTATION_VERSION" />
+ <field name="MAIN_CLASS" />
+ <field name="MANIFEST_VERSION" />
+ <field name="SEALED" />
+ <field name="SIGNATURE_VERSION" />
+ <field name="SPECIFICATION_TITLE" />
+ <field name="SPECIFICATION_VENDOR" />
+ <field name="SPECIFICATION_VERSION" />
+ </class>
+ <class name="java/util/jar/JarEntry" since="1">
+ <extends name="java/util/zip/ZipEntry" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/util/jar/JarEntry;)V" />
+ <method name="&lt;init>(Ljava/util/zip/ZipEntry;)V" />
+ <method name="getAttributes()Ljava/util/jar/Attributes;" />
+ <method name="getCertificates()[Ljava/security/cert/Certificate;" />
+ <method name="getCodeSigners()[Ljava/security/CodeSigner;" />
+ </class>
+ <class name="java/util/jar/JarException" since="1">
+ <extends name="java/util/zip/ZipException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/util/jar/JarFile" since="1">
+ <extends name="java/util/zip/ZipFile" />
+ <method name="&lt;init>(Ljava/io/File;)V" />
+ <method name="&lt;init>(Ljava/io/File;Z)V" />
+ <method name="&lt;init>(Ljava/io/File;ZI)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Z)V" />
+ <method name="getJarEntry(Ljava/lang/String;)Ljava/util/jar/JarEntry;" />
+ <method name="getManifest()Ljava/util/jar/Manifest;" />
+ <field name="MANIFEST_NAME" />
+ </class>
+ <class name="java/util/jar/JarInputStream" since="1">
+ <extends name="java/util/zip/ZipInputStream" />
+ <method name="&lt;init>(Ljava/io/InputStream;)V" />
+ <method name="&lt;init>(Ljava/io/InputStream;Z)V" />
+ <method name="getManifest()Ljava/util/jar/Manifest;" />
+ <method name="getNextJarEntry()Ljava/util/jar/JarEntry;" />
+ </class>
+ <class name="java/util/jar/JarOutputStream" since="1">
+ <extends name="java/util/zip/ZipOutputStream" />
+ <method name="&lt;init>(Ljava/io/OutputStream;)V" />
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/util/jar/Manifest;)V" />
+ </class>
+ <class name="java/util/jar/Manifest" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/io/InputStream;)V" />
+ <method name="&lt;init>(Ljava/util/jar/Manifest;)V" />
+ <method name="clear()V" />
+ <method name="getAttributes(Ljava/lang/String;)Ljava/util/jar/Attributes;" />
+ <method name="getEntries()Ljava/util/Map;" />
+ <method name="getMainAttributes()Ljava/util/jar/Attributes;" />
+ <method name="read(Ljava/io/InputStream;)V" />
+ <method name="write(Ljava/io/OutputStream;)V" />
+ </class>
+ <class name="java/util/jar/Pack200" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="newPacker()Ljava/util/jar/Pack200$Packer;" />
+ <method name="newUnpacker()Ljava/util/jar/Pack200$Unpacker;" />
+ </class>
+ <class name="java/util/jar/Pack200$Packer" since="1">
+ <extends name="java/lang/Object" />
+ <method name="addPropertyChangeListener(Ljava/beans/PropertyChangeListener;)V" since="3" />
+ <method name="pack(Ljava/util/jar/JarFile;Ljava/io/OutputStream;)V" />
+ <method name="pack(Ljava/util/jar/JarInputStream;Ljava/io/OutputStream;)V" />
+ <method name="properties()Ljava/util/SortedMap;" />
+ <method name="removePropertyChangeListener(Ljava/beans/PropertyChangeListener;)V" since="3" />
+ <field name="CLASS_ATTRIBUTE_PFX" />
+ <field name="CODE_ATTRIBUTE_PFX" />
+ <field name="DEFLATE_HINT" />
+ <field name="EFFORT" />
+ <field name="ERROR" />
+ <field name="FALSE" />
+ <field name="FIELD_ATTRIBUTE_PFX" />
+ <field name="KEEP" />
+ <field name="KEEP_FILE_ORDER" />
+ <field name="LATEST" />
+ <field name="METHOD_ATTRIBUTE_PFX" />
+ <field name="MODIFICATION_TIME" />
+ <field name="PASS" />
+ <field name="PASS_FILE_PFX" />
+ <field name="PROGRESS" />
+ <field name="SEGMENT_LIMIT" />
+ <field name="STRIP" />
+ <field name="TRUE" />
+ <field name="UNKNOWN_ATTRIBUTE" />
+ </class>
+ <class name="java/util/jar/Pack200$Unpacker" since="1">
+ <extends name="java/lang/Object" />
+ <method name="addPropertyChangeListener(Ljava/beans/PropertyChangeListener;)V" since="3" />
+ <method name="properties()Ljava/util/SortedMap;" />
+ <method name="removePropertyChangeListener(Ljava/beans/PropertyChangeListener;)V" since="3" />
+ <method name="unpack(Ljava/io/File;Ljava/util/jar/JarOutputStream;)V" />
+ <method name="unpack(Ljava/io/InputStream;Ljava/util/jar/JarOutputStream;)V" />
+ <field name="DEFLATE_HINT" />
+ <field name="FALSE" />
+ <field name="KEEP" />
+ <field name="PROGRESS" />
+ <field name="TRUE" />
+ </class>
+ <class name="java/util/logging/ConsoleHandler" since="1">
+ <extends name="java/util/logging/StreamHandler" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/util/logging/ErrorManager" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="error(Ljava/lang/String;Ljava/lang/Exception;I)V" />
+ <field name="CLOSE_FAILURE" />
+ <field name="FLUSH_FAILURE" />
+ <field name="FORMAT_FAILURE" />
+ <field name="GENERIC_FAILURE" />
+ <field name="OPEN_FAILURE" />
+ <field name="WRITE_FAILURE" />
+ </class>
+ <class name="java/util/logging/FileHandler" since="1">
+ <extends name="java/util/logging/StreamHandler" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;II)V" />
+ <method name="&lt;init>(Ljava/lang/String;IIZ)V" />
+ <method name="&lt;init>(Ljava/lang/String;Z)V" />
+ </class>
+ <class name="java/util/logging/Filter" since="1">
+ <extends name="java/lang/Object" />
+ <method name="isLoggable(Ljava/util/logging/LogRecord;)Z" />
+ </class>
+ <class name="java/util/logging/Formatter" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="format(Ljava/util/logging/LogRecord;)Ljava/lang/String;" />
+ <method name="formatMessage(Ljava/util/logging/LogRecord;)Ljava/lang/String;" />
+ <method name="getHead(Ljava/util/logging/Handler;)Ljava/lang/String;" />
+ <method name="getTail(Ljava/util/logging/Handler;)Ljava/lang/String;" />
+ </class>
+ <class name="java/util/logging/Handler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="close()V" />
+ <method name="flush()V" />
+ <method name="getEncoding()Ljava/lang/String;" />
+ <method name="getErrorManager()Ljava/util/logging/ErrorManager;" />
+ <method name="getFilter()Ljava/util/logging/Filter;" />
+ <method name="getFormatter()Ljava/util/logging/Formatter;" />
+ <method name="getLevel()Ljava/util/logging/Level;" />
+ <method name="isLoggable(Ljava/util/logging/LogRecord;)Z" />
+ <method name="publish(Ljava/util/logging/LogRecord;)V" />
+ <method name="reportError(Ljava/lang/String;Ljava/lang/Exception;I)V" />
+ <method name="setEncoding(Ljava/lang/String;)V" />
+ <method name="setErrorManager(Ljava/util/logging/ErrorManager;)V" />
+ <method name="setFilter(Ljava/util/logging/Filter;)V" />
+ <method name="setFormatter(Ljava/util/logging/Formatter;)V" />
+ <method name="setLevel(Ljava/util/logging/Level;)V" />
+ </class>
+ <class name="java/util/logging/Level" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/lang/String;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;ILjava/lang/String;)V" />
+ <method name="getLocalizedName()Ljava/lang/String;" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getResourceBundleName()Ljava/lang/String;" />
+ <method name="intValue()I" />
+ <method name="parse(Ljava/lang/String;)Ljava/util/logging/Level;" />
+ <field name="ALL" />
+ <field name="CONFIG" />
+ <field name="FINE" />
+ <field name="FINER" />
+ <field name="FINEST" />
+ <field name="INFO" />
+ <field name="OFF" />
+ <field name="SEVERE" />
+ <field name="WARNING" />
+ </class>
+ <class name="java/util/logging/LogManager" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addLogger(Ljava/util/logging/Logger;)Z" />
+ <method name="addPropertyChangeListener(Ljava/beans/PropertyChangeListener;)V" since="3" />
+ <method name="checkAccess()V" />
+ <method name="getLogManager()Ljava/util/logging/LogManager;" />
+ <method name="getLogger(Ljava/lang/String;)Ljava/util/logging/Logger;" />
+ <method name="getLoggerNames()Ljava/util/Enumeration;" />
+ <method name="getLoggingMXBean()Ljava/util/logging/LoggingMXBean;" since="3" />
+ <method name="getProperty(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="readConfiguration()V" />
+ <method name="readConfiguration(Ljava/io/InputStream;)V" />
+ <method name="removePropertyChangeListener(Ljava/beans/PropertyChangeListener;)V" since="3" />
+ <method name="reset()V" />
+ <field name="LOGGING_MXBEAN_NAME" />
+ </class>
+ <class name="java/util/logging/LogRecord" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/util/logging/Level;Ljava/lang/String;)V" />
+ <method name="getLevel()Ljava/util/logging/Level;" />
+ <method name="getLoggerName()Ljava/lang/String;" />
+ <method name="getMessage()Ljava/lang/String;" />
+ <method name="getMillis()J" />
+ <method name="getParameters()[Ljava/lang/Object;" />
+ <method name="getResourceBundle()Ljava/util/ResourceBundle;" />
+ <method name="getResourceBundleName()Ljava/lang/String;" />
+ <method name="getSequenceNumber()J" />
+ <method name="getSourceClassName()Ljava/lang/String;" />
+ <method name="getSourceMethodName()Ljava/lang/String;" />
+ <method name="getThreadID()I" />
+ <method name="getThrown()Ljava/lang/Throwable;" />
+ <method name="setLevel(Ljava/util/logging/Level;)V" />
+ <method name="setLoggerName(Ljava/lang/String;)V" />
+ <method name="setMessage(Ljava/lang/String;)V" />
+ <method name="setMillis(J)V" />
+ <method name="setParameters([Ljava/lang/Object;)V" />
+ <method name="setResourceBundle(Ljava/util/ResourceBundle;)V" />
+ <method name="setResourceBundleName(Ljava/lang/String;)V" />
+ <method name="setSequenceNumber(J)V" />
+ <method name="setSourceClassName(Ljava/lang/String;)V" />
+ <method name="setSourceMethodName(Ljava/lang/String;)V" />
+ <method name="setThreadID(I)V" />
+ <method name="setThrown(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/util/logging/Logger" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="addHandler(Ljava/util/logging/Handler;)V" />
+ <method name="config(Ljava/lang/String;)V" />
+ <method name="entering(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="entering(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V" />
+ <method name="entering(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V" />
+ <method name="exiting(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="exiting(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V" />
+ <method name="fine(Ljava/lang/String;)V" />
+ <method name="finer(Ljava/lang/String;)V" />
+ <method name="finest(Ljava/lang/String;)V" />
+ <method name="getAnonymousLogger()Ljava/util/logging/Logger;" />
+ <method name="getAnonymousLogger(Ljava/lang/String;)Ljava/util/logging/Logger;" />
+ <method name="getFilter()Ljava/util/logging/Filter;" />
+ <method name="getGlobal()Ljava/util/logging/Logger;" since="19" />
+ <method name="getHandlers()[Ljava/util/logging/Handler;" />
+ <method name="getLevel()Ljava/util/logging/Level;" />
+ <method name="getLogger(Ljava/lang/String;)Ljava/util/logging/Logger;" />
+ <method name="getLogger(Ljava/lang/String;Ljava/lang/String;)Ljava/util/logging/Logger;" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getParent()Ljava/util/logging/Logger;" />
+ <method name="getResourceBundle()Ljava/util/ResourceBundle;" />
+ <method name="getResourceBundleName()Ljava/lang/String;" />
+ <method name="getUseParentHandlers()Z" />
+ <method name="info(Ljava/lang/String;)V" />
+ <method name="isLoggable(Ljava/util/logging/Level;)Z" />
+ <method name="log(Ljava/util/logging/Level;Ljava/lang/String;)V" />
+ <method name="log(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/Object;)V" />
+ <method name="log(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="log(Ljava/util/logging/Level;Ljava/lang/String;[Ljava/lang/Object;)V" />
+ <method name="log(Ljava/util/logging/LogRecord;)V" />
+ <method name="logp(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="logp(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V" />
+ <method name="logp(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="logp(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V" />
+ <method name="logrb(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="logrb(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;)V" />
+ <method name="logrb(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="logrb(Ljava/util/logging/Level;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V" />
+ <method name="removeHandler(Ljava/util/logging/Handler;)V" />
+ <method name="setFilter(Ljava/util/logging/Filter;)V" />
+ <method name="setLevel(Ljava/util/logging/Level;)V" />
+ <method name="setParent(Ljava/util/logging/Logger;)V" />
+ <method name="setUseParentHandlers(Z)V" />
+ <method name="severe(Ljava/lang/String;)V" />
+ <method name="throwing(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="warning(Ljava/lang/String;)V" />
+ <field name="GLOBAL_LOGGER_NAME" since="9" />
+ <field name="global" />
+ </class>
+ <class name="java/util/logging/LoggingMXBean" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getLoggerLevel(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getLoggerNames()Ljava/util/List;" />
+ <method name="getParentLoggerName(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="setLoggerLevel(Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="java/util/logging/LoggingPermission" since="1">
+ <extends name="java/security/BasicPermission" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/security/Guard" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="java/util/logging/MemoryHandler" since="1">
+ <extends name="java/util/logging/Handler" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/util/logging/Handler;ILjava/util/logging/Level;)V" />
+ <method name="getPushLevel()Ljava/util/logging/Level;" />
+ <method name="push()V" />
+ <method name="setPushLevel(Ljava/util/logging/Level;)V" />
+ </class>
+ <class name="java/util/logging/SimpleFormatter" since="1">
+ <extends name="java/util/logging/Formatter" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/util/logging/SocketHandler" since="1">
+ <extends name="java/util/logging/StreamHandler" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;I)V" />
+ </class>
+ <class name="java/util/logging/StreamHandler" since="1">
+ <extends name="java/util/logging/Handler" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/util/logging/Formatter;)V" />
+ <method name="setOutputStream(Ljava/io/OutputStream;)V" />
+ </class>
+ <class name="java/util/logging/XMLFormatter" since="1">
+ <extends name="java/util/logging/Formatter" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="java/util/prefs/AbstractPreferences" since="1">
+ <extends name="java/util/prefs/Preferences" />
+ <method name="&lt;init>(Ljava/util/prefs/AbstractPreferences;Ljava/lang/String;)V" />
+ <method name="cachedChildren()[Ljava/util/prefs/AbstractPreferences;" />
+ <method name="childSpi(Ljava/lang/String;)Ljava/util/prefs/AbstractPreferences;" />
+ <method name="childrenNamesSpi()[Ljava/lang/String;" />
+ <method name="flushSpi()V" />
+ <method name="getChild(Ljava/lang/String;)Ljava/util/prefs/AbstractPreferences;" />
+ <method name="getSpi(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="isRemoved()Z" />
+ <method name="keysSpi()[Ljava/lang/String;" />
+ <method name="putSpi(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="removeNodeSpi()V" />
+ <method name="removeSpi(Ljava/lang/String;)V" />
+ <method name="syncSpi()V" />
+ <field name="lock" />
+ <field name="newNode" />
+ </class>
+ <class name="java/util/prefs/BackingStoreException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/util/prefs/InvalidPreferencesFormatException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="java/util/prefs/NodeChangeEvent" since="1">
+ <extends name="java/util/EventObject" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/util/prefs/Preferences;Ljava/util/prefs/Preferences;)V" />
+ <method name="getChild()Ljava/util/prefs/Preferences;" />
+ <method name="getParent()Ljava/util/prefs/Preferences;" />
+ </class>
+ <class name="java/util/prefs/NodeChangeListener" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/EventListener" />
+ <method name="childAdded(Ljava/util/prefs/NodeChangeEvent;)V" />
+ <method name="childRemoved(Ljava/util/prefs/NodeChangeEvent;)V" />
+ </class>
+ <class name="java/util/prefs/PreferenceChangeEvent" since="1">
+ <extends name="java/util/EventObject" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/util/prefs/Preferences;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="getKey()Ljava/lang/String;" />
+ <method name="getNewValue()Ljava/lang/String;" />
+ <method name="getNode()Ljava/util/prefs/Preferences;" />
+ </class>
+ <class name="java/util/prefs/PreferenceChangeListener" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/EventListener" />
+ <method name="preferenceChange(Ljava/util/prefs/PreferenceChangeEvent;)V" />
+ </class>
+ <class name="java/util/prefs/Preferences" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="absolutePath()Ljava/lang/String;" />
+ <method name="addNodeChangeListener(Ljava/util/prefs/NodeChangeListener;)V" />
+ <method name="addPreferenceChangeListener(Ljava/util/prefs/PreferenceChangeListener;)V" />
+ <method name="childrenNames()[Ljava/lang/String;" />
+ <method name="clear()V" />
+ <method name="exportNode(Ljava/io/OutputStream;)V" />
+ <method name="exportSubtree(Ljava/io/OutputStream;)V" />
+ <method name="flush()V" />
+ <method name="get(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getBoolean(Ljava/lang/String;Z)Z" />
+ <method name="getByteArray(Ljava/lang/String;[B)[B" />
+ <method name="getDouble(Ljava/lang/String;D)D" />
+ <method name="getFloat(Ljava/lang/String;F)F" />
+ <method name="getInt(Ljava/lang/String;I)I" />
+ <method name="getLong(Ljava/lang/String;J)J" />
+ <method name="importPreferences(Ljava/io/InputStream;)V" />
+ <method name="isUserNode()Z" />
+ <method name="keys()[Ljava/lang/String;" />
+ <method name="name()Ljava/lang/String;" />
+ <method name="node(Ljava/lang/String;)Ljava/util/prefs/Preferences;" />
+ <method name="nodeExists(Ljava/lang/String;)Z" />
+ <method name="parent()Ljava/util/prefs/Preferences;" />
+ <method name="put(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="putBoolean(Ljava/lang/String;Z)V" />
+ <method name="putByteArray(Ljava/lang/String;[B)V" />
+ <method name="putDouble(Ljava/lang/String;D)V" />
+ <method name="putFloat(Ljava/lang/String;F)V" />
+ <method name="putInt(Ljava/lang/String;I)V" />
+ <method name="putLong(Ljava/lang/String;J)V" />
+ <method name="remove(Ljava/lang/String;)V" />
+ <method name="removeNode()V" />
+ <method name="removeNodeChangeListener(Ljava/util/prefs/NodeChangeListener;)V" />
+ <method name="removePreferenceChangeListener(Ljava/util/prefs/PreferenceChangeListener;)V" />
+ <method name="sync()V" />
+ <method name="systemNodeForPackage(Ljava/lang/Class;)Ljava/util/prefs/Preferences;" />
+ <method name="systemRoot()Ljava/util/prefs/Preferences;" />
+ <method name="userNodeForPackage(Ljava/lang/Class;)Ljava/util/prefs/Preferences;" />
+ <method name="userRoot()Ljava/util/prefs/Preferences;" />
+ <field name="MAX_KEY_LENGTH" />
+ <field name="MAX_NAME_LENGTH" />
+ <field name="MAX_VALUE_LENGTH" />
+ </class>
+ <class name="java/util/prefs/PreferencesFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="systemRoot()Ljava/util/prefs/Preferences;" />
+ <method name="userRoot()Ljava/util/prefs/Preferences;" />
+ </class>
+ <class name="java/util/regex/MatchResult" since="1">
+ <extends name="java/lang/Object" />
+ <method name="end()I" />
+ <method name="end(I)I" />
+ <method name="group()Ljava/lang/String;" />
+ <method name="group(I)Ljava/lang/String;" />
+ <method name="groupCount()I" />
+ <method name="start()I" />
+ <method name="start(I)I" />
+ </class>
+ <class name="java/util/regex/Matcher" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/regex/MatchResult" />
+ <method name="&lt;init>()V" />
+ <method name="appendReplacement(Ljava/lang/StringBuffer;Ljava/lang/String;)Ljava/util/regex/Matcher;" />
+ <method name="appendTail(Ljava/lang/StringBuffer;)Ljava/lang/StringBuffer;" />
+ <method name="find()Z" />
+ <method name="find(I)Z" />
+ <method name="hasAnchoringBounds()Z" />
+ <method name="hasTransparentBounds()Z" />
+ <method name="hitEnd()Z" />
+ <method name="lookingAt()Z" />
+ <method name="matches()Z" />
+ <method name="pattern()Ljava/util/regex/Pattern;" />
+ <method name="quoteReplacement(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="region(II)Ljava/util/regex/Matcher;" />
+ <method name="regionEnd()I" />
+ <method name="regionStart()I" />
+ <method name="replaceAll(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="replaceFirst(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="requireEnd()Z" />
+ <method name="reset()Ljava/util/regex/Matcher;" />
+ <method name="reset(Ljava/lang/CharSequence;)Ljava/util/regex/Matcher;" />
+ <method name="toMatchResult()Ljava/util/regex/MatchResult;" />
+ <method name="useAnchoringBounds(Z)Ljava/util/regex/Matcher;" />
+ <method name="usePattern(Ljava/util/regex/Pattern;)Ljava/util/regex/Matcher;" />
+ <method name="useTransparentBounds(Z)Ljava/util/regex/Matcher;" />
+ </class>
+ <class name="java/util/regex/Pattern" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>()V" />
+ <method name="compile(Ljava/lang/String;)Ljava/util/regex/Pattern;" />
+ <method name="compile(Ljava/lang/String;I)Ljava/util/regex/Pattern;" />
+ <method name="flags()I" />
+ <method name="matcher(Ljava/lang/CharSequence;)Ljava/util/regex/Matcher;" />
+ <method name="matches(Ljava/lang/String;Ljava/lang/CharSequence;)Z" />
+ <method name="pattern()Ljava/lang/String;" />
+ <method name="quote(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="split(Ljava/lang/CharSequence;)[Ljava/lang/String;" />
+ <method name="split(Ljava/lang/CharSequence;I)[Ljava/lang/String;" />
+ <field name="CANON_EQ" />
+ <field name="CASE_INSENSITIVE" />
+ <field name="COMMENTS" />
+ <field name="DOTALL" />
+ <field name="LITERAL" />
+ <field name="MULTILINE" />
+ <field name="UNICODE_CASE" />
+ <field name="UNIX_LINES" />
+ </class>
+ <class name="java/util/regex/PatternSyntaxException" since="1">
+ <extends name="java/lang/IllegalArgumentException" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;I)V" />
+ <method name="getDescription()Ljava/lang/String;" />
+ <method name="getIndex()I" />
+ <method name="getPattern()Ljava/lang/String;" />
+ </class>
+ <class name="java/util/zip/Adler32" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/zip/Checksum" />
+ <method name="&lt;init>()V" />
+ <method name="update([B)V" />
+ </class>
+ <class name="java/util/zip/CRC32" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/zip/Checksum" />
+ <method name="&lt;init>()V" />
+ <method name="update([B)V" />
+ </class>
+ <class name="java/util/zip/CheckedInputStream" since="1">
+ <extends name="java/io/FilterInputStream" />
+ <method name="&lt;init>(Ljava/io/InputStream;Ljava/util/zip/Checksum;)V" />
+ <method name="getChecksum()Ljava/util/zip/Checksum;" />
+ </class>
+ <class name="java/util/zip/CheckedOutputStream" since="1">
+ <extends name="java/io/FilterOutputStream" />
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/util/zip/Checksum;)V" />
+ <method name="getChecksum()Ljava/util/zip/Checksum;" />
+ </class>
+ <class name="java/util/zip/Checksum" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getValue()J" />
+ <method name="reset()V" />
+ <method name="update(I)V" />
+ <method name="update([BII)V" />
+ </class>
+ <class name="java/util/zip/DataFormatException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/util/zip/Deflater" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(IZ)V" />
+ <method name="deflate([B)I" />
+ <method name="deflate([BII)I" />
+ <method name="deflate([BIII)I" since="19" />
+ <method name="end()V" />
+ <method name="finish()V" />
+ <method name="finished()Z" />
+ <method name="getAdler()I" />
+ <method name="getBytesRead()J" />
+ <method name="getBytesWritten()J" />
+ <method name="getTotalIn()I" />
+ <method name="getTotalOut()I" />
+ <method name="needsInput()Z" />
+ <method name="reset()V" />
+ <method name="setDictionary([B)V" />
+ <method name="setDictionary([BII)V" />
+ <method name="setInput([B)V" />
+ <method name="setInput([BII)V" />
+ <method name="setLevel(I)V" />
+ <method name="setStrategy(I)V" />
+ <field name="BEST_COMPRESSION" />
+ <field name="BEST_SPEED" />
+ <field name="DEFAULT_COMPRESSION" />
+ <field name="DEFAULT_STRATEGY" />
+ <field name="DEFLATED" />
+ <field name="FILTERED" />
+ <field name="FULL_FLUSH" since="19" />
+ <field name="HUFFMAN_ONLY" />
+ <field name="NO_COMPRESSION" />
+ <field name="NO_FLUSH" since="19" />
+ <field name="SYNC_FLUSH" since="19" />
+ </class>
+ <class name="java/util/zip/DeflaterInputStream" since="9">
+ <extends name="java/io/FilterInputStream" />
+ <method name="&lt;init>(Ljava/io/InputStream;)V" />
+ <method name="&lt;init>(Ljava/io/InputStream;Ljava/util/zip/Deflater;)V" />
+ <method name="&lt;init>(Ljava/io/InputStream;Ljava/util/zip/Deflater;I)V" />
+ <field name="buf" />
+ <field name="def" />
+ </class>
+ <class name="java/util/zip/DeflaterOutputStream" since="1">
+ <extends name="java/io/FilterOutputStream" />
+ <method name="&lt;init>(Ljava/io/OutputStream;)V" />
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/util/zip/Deflater;)V" />
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/util/zip/Deflater;I)V" />
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/util/zip/Deflater;IZ)V" since="19" />
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/util/zip/Deflater;Z)V" since="19" />
+ <method name="&lt;init>(Ljava/io/OutputStream;Z)V" since="19" />
+ <method name="deflate()V" />
+ <method name="finish()V" />
+ <field name="buf" />
+ <field name="def" />
+ </class>
+ <class name="java/util/zip/GZIPInputStream" since="1">
+ <extends name="java/util/zip/InflaterInputStream" />
+ <method name="&lt;init>(Ljava/io/InputStream;)V" />
+ <method name="&lt;init>(Ljava/io/InputStream;I)V" />
+ <field name="GZIP_MAGIC" />
+ <field name="crc" />
+ <field name="eos" />
+ </class>
+ <class name="java/util/zip/GZIPOutputStream" since="1">
+ <extends name="java/util/zip/DeflaterOutputStream" />
+ <method name="&lt;init>(Ljava/io/OutputStream;)V" />
+ <method name="&lt;init>(Ljava/io/OutputStream;I)V" />
+ <method name="&lt;init>(Ljava/io/OutputStream;IZ)V" since="19" />
+ <method name="&lt;init>(Ljava/io/OutputStream;Z)V" since="19" />
+ <field name="crc" />
+ </class>
+ <class name="java/util/zip/Inflater" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Z)V" />
+ <method name="end()V" />
+ <method name="finished()Z" />
+ <method name="getAdler()I" />
+ <method name="getBytesRead()J" />
+ <method name="getBytesWritten()J" />
+ <method name="getRemaining()I" />
+ <method name="getTotalIn()I" />
+ <method name="getTotalOut()I" />
+ <method name="inflate([B)I" />
+ <method name="inflate([BII)I" />
+ <method name="needsDictionary()Z" />
+ <method name="needsInput()Z" />
+ <method name="reset()V" />
+ <method name="setDictionary([B)V" />
+ <method name="setDictionary([BII)V" />
+ <method name="setInput([B)V" />
+ <method name="setInput([BII)V" />
+ </class>
+ <class name="java/util/zip/InflaterInputStream" since="1">
+ <extends name="java/io/FilterInputStream" />
+ <method name="&lt;init>(Ljava/io/InputStream;)V" />
+ <method name="&lt;init>(Ljava/io/InputStream;Ljava/util/zip/Inflater;)V" />
+ <method name="&lt;init>(Ljava/io/InputStream;Ljava/util/zip/Inflater;I)V" />
+ <method name="fill()V" />
+ <field name="buf" />
+ <field name="inf" />
+ <field name="len" />
+ </class>
+ <class name="java/util/zip/InflaterOutputStream" since="9">
+ <extends name="java/io/FilterOutputStream" />
+ <method name="&lt;init>(Ljava/io/OutputStream;)V" />
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/util/zip/Inflater;)V" />
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljava/util/zip/Inflater;I)V" />
+ <method name="finish()V" />
+ <field name="buf" />
+ <field name="inf" />
+ </class>
+ <class name="java/util/zip/ZipEntry" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/util/zip/ZipEntry;)V" />
+ <method name="getComment()Ljava/lang/String;" />
+ <method name="getCompressedSize()J" />
+ <method name="getCrc()J" />
+ <method name="getExtra()[B" />
+ <method name="getMethod()I" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getSize()J" />
+ <method name="getTime()J" />
+ <method name="isDirectory()Z" />
+ <method name="setComment(Ljava/lang/String;)V" />
+ <method name="setCompressedSize(J)V" />
+ <method name="setCrc(J)V" />
+ <method name="setExtra([B)V" />
+ <method name="setMethod(I)V" />
+ <method name="setSize(J)V" />
+ <method name="setTime(J)V" />
+ <field name="CENATT" since="21" />
+ <field name="CENATX" since="21" />
+ <field name="CENCOM" since="21" />
+ <field name="CENCRC" since="21" />
+ <field name="CENDSK" since="21" />
+ <field name="CENEXT" since="21" />
+ <field name="CENFLG" since="21" />
+ <field name="CENHDR" since="21" />
+ <field name="CENHOW" since="21" />
+ <field name="CENLEN" since="21" />
+ <field name="CENNAM" since="21" />
+ <field name="CENOFF" since="21" />
+ <field name="CENSIG" since="21" />
+ <field name="CENSIZ" since="21" />
+ <field name="CENTIM" since="21" />
+ <field name="CENVEM" since="21" />
+ <field name="CENVER" since="21" />
+ <field name="DEFLATED" />
+ <field name="ENDCOM" since="21" />
+ <field name="ENDHDR" since="21" />
+ <field name="ENDOFF" since="21" />
+ <field name="ENDSIG" since="21" />
+ <field name="ENDSIZ" since="21" />
+ <field name="ENDSUB" since="21" />
+ <field name="ENDTOT" since="21" />
+ <field name="EXTCRC" since="21" />
+ <field name="EXTHDR" since="21" />
+ <field name="EXTLEN" since="21" />
+ <field name="EXTSIG" since="21" />
+ <field name="EXTSIZ" since="21" />
+ <field name="LOCCRC" since="21" />
+ <field name="LOCEXT" since="21" />
+ <field name="LOCFLG" since="21" />
+ <field name="LOCHDR" since="21" />
+ <field name="LOCHOW" since="21" />
+ <field name="LOCLEN" since="21" />
+ <field name="LOCNAM" since="21" />
+ <field name="LOCSIG" since="21" />
+ <field name="LOCSIZ" since="21" />
+ <field name="LOCTIM" since="21" />
+ <field name="LOCVER" since="21" />
+ <field name="STORED" />
+ </class>
+ <class name="java/util/zip/ZipError" since="9">
+ <extends name="java/lang/InternalError" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/util/zip/ZipException" since="1">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="java/util/zip/ZipFile" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Closeable" since="19" />
+ <method name="&lt;init>(Ljava/io/File;)V" />
+ <method name="&lt;init>(Ljava/io/File;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="close()V" />
+ <method name="entries()Ljava/util/Enumeration;" />
+ <method name="getComment()Ljava/lang/String;" since="19" />
+ <method name="getEntry(Ljava/lang/String;)Ljava/util/zip/ZipEntry;" />
+ <method name="getInputStream(Ljava/util/zip/ZipEntry;)Ljava/io/InputStream;" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="size()I" />
+ <field name="CENATT" since="21" />
+ <field name="CENATX" since="21" />
+ <field name="CENCOM" since="21" />
+ <field name="CENCRC" since="21" />
+ <field name="CENDSK" since="21" />
+ <field name="CENEXT" since="21" />
+ <field name="CENFLG" since="21" />
+ <field name="CENHDR" since="21" />
+ <field name="CENHOW" since="21" />
+ <field name="CENLEN" since="21" />
+ <field name="CENNAM" since="21" />
+ <field name="CENOFF" since="21" />
+ <field name="CENSIG" since="21" />
+ <field name="CENSIZ" since="21" />
+ <field name="CENTIM" since="21" />
+ <field name="CENVEM" since="21" />
+ <field name="CENVER" since="21" />
+ <field name="ENDCOM" since="21" />
+ <field name="ENDHDR" since="21" />
+ <field name="ENDOFF" since="21" />
+ <field name="ENDSIG" since="21" />
+ <field name="ENDSIZ" since="21" />
+ <field name="ENDSUB" since="21" />
+ <field name="ENDTOT" since="21" />
+ <field name="EXTCRC" since="21" />
+ <field name="EXTHDR" since="21" />
+ <field name="EXTLEN" since="21" />
+ <field name="EXTSIG" since="21" />
+ <field name="EXTSIZ" since="21" />
+ <field name="LOCCRC" since="21" />
+ <field name="LOCEXT" since="21" />
+ <field name="LOCFLG" since="21" />
+ <field name="LOCHDR" since="21" />
+ <field name="LOCHOW" since="21" />
+ <field name="LOCLEN" since="21" />
+ <field name="LOCNAM" since="21" />
+ <field name="LOCSIG" since="21" />
+ <field name="LOCSIZ" since="21" />
+ <field name="LOCTIM" since="21" />
+ <field name="LOCVER" since="21" />
+ <field name="OPEN_DELETE" />
+ <field name="OPEN_READ" />
+ </class>
+ <class name="java/util/zip/ZipInputStream" since="1">
+ <extends name="java/util/zip/InflaterInputStream" />
+ <method name="&lt;init>(Ljava/io/InputStream;)V" />
+ <method name="closeEntry()V" />
+ <method name="createZipEntry(Ljava/lang/String;)Ljava/util/zip/ZipEntry;" />
+ <method name="getNextEntry()Ljava/util/zip/ZipEntry;" />
+ <field name="CENATT" since="21" />
+ <field name="CENATX" since="21" />
+ <field name="CENCOM" since="21" />
+ <field name="CENCRC" since="21" />
+ <field name="CENDSK" since="21" />
+ <field name="CENEXT" since="21" />
+ <field name="CENFLG" since="21" />
+ <field name="CENHDR" since="21" />
+ <field name="CENHOW" since="21" />
+ <field name="CENLEN" since="21" />
+ <field name="CENNAM" since="21" />
+ <field name="CENOFF" since="21" />
+ <field name="CENSIG" since="21" />
+ <field name="CENSIZ" since="21" />
+ <field name="CENTIM" since="21" />
+ <field name="CENVEM" since="21" />
+ <field name="CENVER" since="21" />
+ <field name="ENDCOM" since="21" />
+ <field name="ENDHDR" since="21" />
+ <field name="ENDOFF" since="21" />
+ <field name="ENDSIG" since="21" />
+ <field name="ENDSIZ" since="21" />
+ <field name="ENDSUB" since="21" />
+ <field name="ENDTOT" since="21" />
+ <field name="EXTCRC" since="21" />
+ <field name="EXTHDR" since="21" />
+ <field name="EXTLEN" since="21" />
+ <field name="EXTSIG" since="21" />
+ <field name="EXTSIZ" since="21" />
+ <field name="LOCCRC" since="21" />
+ <field name="LOCEXT" since="21" />
+ <field name="LOCFLG" since="21" />
+ <field name="LOCHDR" since="21" />
+ <field name="LOCHOW" since="21" />
+ <field name="LOCLEN" since="21" />
+ <field name="LOCNAM" since="21" />
+ <field name="LOCSIG" since="21" />
+ <field name="LOCSIZ" since="21" />
+ <field name="LOCTIM" since="21" />
+ <field name="LOCVER" since="21" />
+ </class>
+ <class name="java/util/zip/ZipOutputStream" since="1">
+ <extends name="java/util/zip/DeflaterOutputStream" />
+ <method name="&lt;init>(Ljava/io/OutputStream;)V" />
+ <method name="closeEntry()V" />
+ <method name="putNextEntry(Ljava/util/zip/ZipEntry;)V" />
+ <method name="setComment(Ljava/lang/String;)V" />
+ <method name="setLevel(I)V" />
+ <method name="setMethod(I)V" />
+ <field name="CENATT" since="21" />
+ <field name="CENATX" since="21" />
+ <field name="CENCOM" since="21" />
+ <field name="CENCRC" since="21" />
+ <field name="CENDSK" since="21" />
+ <field name="CENEXT" since="21" />
+ <field name="CENFLG" since="21" />
+ <field name="CENHDR" since="21" />
+ <field name="CENHOW" since="21" />
+ <field name="CENLEN" since="21" />
+ <field name="CENNAM" since="21" />
+ <field name="CENOFF" since="21" />
+ <field name="CENSIG" since="21" />
+ <field name="CENSIZ" since="21" />
+ <field name="CENTIM" since="21" />
+ <field name="CENVEM" since="21" />
+ <field name="CENVER" since="21" />
+ <field name="DEFLATED" />
+ <field name="ENDCOM" since="21" />
+ <field name="ENDHDR" since="21" />
+ <field name="ENDOFF" since="21" />
+ <field name="ENDSIG" since="21" />
+ <field name="ENDSIZ" since="21" />
+ <field name="ENDSUB" since="21" />
+ <field name="ENDTOT" since="21" />
+ <field name="EXTCRC" since="21" />
+ <field name="EXTHDR" since="21" />
+ <field name="EXTLEN" since="21" />
+ <field name="EXTSIG" since="21" />
+ <field name="EXTSIZ" since="21" />
+ <field name="LOCCRC" since="21" />
+ <field name="LOCEXT" since="21" />
+ <field name="LOCFLG" since="21" />
+ <field name="LOCHDR" since="21" />
+ <field name="LOCHOW" since="21" />
+ <field name="LOCLEN" since="21" />
+ <field name="LOCNAM" since="21" />
+ <field name="LOCSIG" since="21" />
+ <field name="LOCSIZ" since="21" />
+ <field name="LOCTIM" since="21" />
+ <field name="LOCVER" since="21" />
+ <field name="STORED" />
+ </class>
+ <class name="javax/crypto/AEADBadTagException" since="19">
+ <extends name="javax/crypto/BadPaddingException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="javax/crypto/BadPaddingException" since="1">
+ <extends name="java/security/GeneralSecurityException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="javax/crypto/Cipher" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljavax/crypto/CipherSpi;Ljava/security/Provider;Ljava/lang/String;)V" />
+ <method name="doFinal()[B" />
+ <method name="doFinal(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)I" />
+ <method name="doFinal([B)[B" />
+ <method name="doFinal([BI)I" />
+ <method name="doFinal([BII)[B" />
+ <method name="doFinal([BII[B)I" />
+ <method name="doFinal([BII[BI)I" />
+ <method name="getAlgorithm()Ljava/lang/String;" />
+ <method name="getBlockSize()I" />
+ <method name="getExemptionMechanism()Ljavax/crypto/ExemptionMechanism;" />
+ <method name="getIV()[B" />
+ <method name="getInstance(Ljava/lang/String;)Ljavax/crypto/Cipher;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/crypto/Cipher;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/crypto/Cipher;" />
+ <method name="getMaxAllowedKeyLength(Ljava/lang/String;)I" />
+ <method name="getMaxAllowedParameterSpec(Ljava/lang/String;)Ljava/security/spec/AlgorithmParameterSpec;" />
+ <method name="getOutputSize(I)I" />
+ <method name="getParameters()Ljava/security/AlgorithmParameters;" />
+ <method name="getProvider()Ljava/security/Provider;" />
+ <method name="init(ILjava/security/Key;)V" />
+ <method name="init(ILjava/security/Key;Ljava/security/AlgorithmParameters;)V" />
+ <method name="init(ILjava/security/Key;Ljava/security/AlgorithmParameters;Ljava/security/SecureRandom;)V" />
+ <method name="init(ILjava/security/Key;Ljava/security/SecureRandom;)V" />
+ <method name="init(ILjava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;)V" />
+ <method name="init(ILjava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V" />
+ <method name="init(ILjava/security/cert/Certificate;)V" />
+ <method name="init(ILjava/security/cert/Certificate;Ljava/security/SecureRandom;)V" />
+ <method name="unwrap([BLjava/lang/String;I)Ljava/security/Key;" />
+ <method name="update(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)I" />
+ <method name="update([B)[B" />
+ <method name="update([BII)[B" />
+ <method name="update([BII[B)I" />
+ <method name="update([BII[BI)I" />
+ <method name="updateAAD(Ljava/nio/ByteBuffer;)V" since="19" />
+ <method name="updateAAD([B)V" since="19" />
+ <method name="updateAAD([BII)V" since="19" />
+ <method name="wrap(Ljava/security/Key;)[B" />
+ <field name="DECRYPT_MODE" />
+ <field name="ENCRYPT_MODE" />
+ <field name="PRIVATE_KEY" />
+ <field name="PUBLIC_KEY" />
+ <field name="SECRET_KEY" />
+ <field name="UNWRAP_MODE" />
+ <field name="WRAP_MODE" />
+ </class>
+ <class name="javax/crypto/CipherInputStream" since="1">
+ <extends name="java/io/FilterInputStream" />
+ <method name="&lt;init>(Ljava/io/InputStream;)V" />
+ <method name="&lt;init>(Ljava/io/InputStream;Ljavax/crypto/Cipher;)V" />
+ </class>
+ <class name="javax/crypto/CipherOutputStream" since="1">
+ <extends name="java/io/FilterOutputStream" />
+ <method name="&lt;init>(Ljava/io/OutputStream;)V" />
+ <method name="&lt;init>(Ljava/io/OutputStream;Ljavax/crypto/Cipher;)V" />
+ </class>
+ <class name="javax/crypto/CipherSpi" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="engineDoFinal(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)I" />
+ <method name="engineDoFinal([BII)[B" />
+ <method name="engineDoFinal([BII[BI)I" />
+ <method name="engineGetBlockSize()I" />
+ <method name="engineGetIV()[B" />
+ <method name="engineGetKeySize(Ljava/security/Key;)I" />
+ <method name="engineGetOutputSize(I)I" />
+ <method name="engineGetParameters()Ljava/security/AlgorithmParameters;" />
+ <method name="engineInit(ILjava/security/Key;Ljava/security/AlgorithmParameters;Ljava/security/SecureRandom;)V" />
+ <method name="engineInit(ILjava/security/Key;Ljava/security/SecureRandom;)V" />
+ <method name="engineInit(ILjava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V" />
+ <method name="engineSetMode(Ljava/lang/String;)V" />
+ <method name="engineSetPadding(Ljava/lang/String;)V" />
+ <method name="engineUnwrap([BLjava/lang/String;I)Ljava/security/Key;" />
+ <method name="engineUpdate(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)I" />
+ <method name="engineUpdate([BII)[B" />
+ <method name="engineUpdate([BII[BI)I" />
+ <method name="engineUpdateAAD(Ljava/nio/ByteBuffer;)V" since="19" />
+ <method name="engineUpdateAAD([BII)V" since="19" />
+ <method name="engineWrap(Ljava/security/Key;)[B" />
+ </class>
+ <class name="javax/crypto/EncryptedPrivateKeyInfo" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;[B)V" />
+ <method name="&lt;init>(Ljava/security/AlgorithmParameters;[B)V" />
+ <method name="&lt;init>([B)V" />
+ <method name="getAlgName()Ljava/lang/String;" />
+ <method name="getAlgParameters()Ljava/security/AlgorithmParameters;" />
+ <method name="getEncoded()[B" />
+ <method name="getEncryptedData()[B" />
+ <method name="getKeySpec(Ljava/security/Key;)Ljava/security/spec/PKCS8EncodedKeySpec;" />
+ <method name="getKeySpec(Ljava/security/Key;Ljava/lang/String;)Ljava/security/spec/PKCS8EncodedKeySpec;" />
+ <method name="getKeySpec(Ljava/security/Key;Ljava/security/Provider;)Ljava/security/spec/PKCS8EncodedKeySpec;" />
+ <method name="getKeySpec(Ljavax/crypto/Cipher;)Ljava/security/spec/PKCS8EncodedKeySpec;" />
+ </class>
+ <class name="javax/crypto/ExemptionMechanism" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljavax/crypto/ExemptionMechanismSpi;Ljava/security/Provider;Ljava/lang/String;)V" />
+ <method name="genExemptionBlob()[B" />
+ <method name="genExemptionBlob([B)I" />
+ <method name="genExemptionBlob([BI)I" />
+ <method name="getInstance(Ljava/lang/String;)Ljavax/crypto/ExemptionMechanism;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/crypto/ExemptionMechanism;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/crypto/ExemptionMechanism;" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getOutputSize(I)I" />
+ <method name="getProvider()Ljava/security/Provider;" />
+ <method name="init(Ljava/security/Key;)V" />
+ <method name="init(Ljava/security/Key;Ljava/security/AlgorithmParameters;)V" />
+ <method name="init(Ljava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;)V" />
+ <method name="isCryptoAllowed(Ljava/security/Key;)Z" />
+ </class>
+ <class name="javax/crypto/ExemptionMechanismException" since="1">
+ <extends name="java/security/GeneralSecurityException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="javax/crypto/ExemptionMechanismSpi" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="engineGenExemptionBlob()[B" />
+ <method name="engineGenExemptionBlob([BI)I" />
+ <method name="engineGetOutputSize(I)I" />
+ <method name="engineInit(Ljava/security/Key;)V" />
+ <method name="engineInit(Ljava/security/Key;Ljava/security/AlgorithmParameters;)V" />
+ <method name="engineInit(Ljava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;)V" />
+ </class>
+ <class name="javax/crypto/IllegalBlockSizeException" since="1">
+ <extends name="java/security/GeneralSecurityException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="javax/crypto/KeyAgreement" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljavax/crypto/KeyAgreementSpi;Ljava/security/Provider;Ljava/lang/String;)V" />
+ <method name="doPhase(Ljava/security/Key;Z)Ljava/security/Key;" />
+ <method name="generateSecret()[B" />
+ <method name="generateSecret(Ljava/lang/String;)Ljavax/crypto/SecretKey;" />
+ <method name="generateSecret([BI)I" />
+ <method name="getAlgorithm()Ljava/lang/String;" />
+ <method name="getInstance(Ljava/lang/String;)Ljavax/crypto/KeyAgreement;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/crypto/KeyAgreement;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/crypto/KeyAgreement;" />
+ <method name="getProvider()Ljava/security/Provider;" />
+ <method name="init(Ljava/security/Key;)V" />
+ <method name="init(Ljava/security/Key;Ljava/security/SecureRandom;)V" />
+ <method name="init(Ljava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;)V" />
+ <method name="init(Ljava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V" />
+ </class>
+ <class name="javax/crypto/KeyAgreementSpi" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="engineDoPhase(Ljava/security/Key;Z)Ljava/security/Key;" />
+ <method name="engineGenerateSecret()[B" />
+ <method name="engineGenerateSecret(Ljava/lang/String;)Ljavax/crypto/SecretKey;" />
+ <method name="engineGenerateSecret([BI)I" />
+ <method name="engineInit(Ljava/security/Key;Ljava/security/SecureRandom;)V" />
+ <method name="engineInit(Ljava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V" />
+ </class>
+ <class name="javax/crypto/KeyGenerator" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljavax/crypto/KeyGeneratorSpi;Ljava/security/Provider;Ljava/lang/String;)V" />
+ <method name="generateKey()Ljavax/crypto/SecretKey;" />
+ <method name="getAlgorithm()Ljava/lang/String;" />
+ <method name="getInstance(Ljava/lang/String;)Ljavax/crypto/KeyGenerator;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/crypto/KeyGenerator;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/crypto/KeyGenerator;" />
+ <method name="getProvider()Ljava/security/Provider;" />
+ <method name="init(I)V" />
+ <method name="init(ILjava/security/SecureRandom;)V" />
+ <method name="init(Ljava/security/SecureRandom;)V" />
+ <method name="init(Ljava/security/spec/AlgorithmParameterSpec;)V" />
+ <method name="init(Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V" />
+ </class>
+ <class name="javax/crypto/KeyGeneratorSpi" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="engineGenerateKey()Ljavax/crypto/SecretKey;" />
+ <method name="engineInit(ILjava/security/SecureRandom;)V" />
+ <method name="engineInit(Ljava/security/SecureRandom;)V" />
+ <method name="engineInit(Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V" />
+ </class>
+ <class name="javax/crypto/Mac" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>(Ljavax/crypto/MacSpi;Ljava/security/Provider;Ljava/lang/String;)V" />
+ <method name="doFinal()[B" />
+ <method name="doFinal([B)[B" />
+ <method name="doFinal([BI)V" />
+ <method name="getAlgorithm()Ljava/lang/String;" />
+ <method name="getInstance(Ljava/lang/String;)Ljavax/crypto/Mac;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/crypto/Mac;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/crypto/Mac;" />
+ <method name="getMacLength()I" />
+ <method name="getProvider()Ljava/security/Provider;" />
+ <method name="init(Ljava/security/Key;)V" />
+ <method name="init(Ljava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;)V" />
+ <method name="reset()V" />
+ <method name="update(B)V" />
+ <method name="update(Ljava/nio/ByteBuffer;)V" />
+ <method name="update([B)V" />
+ <method name="update([BII)V" />
+ </class>
+ <class name="javax/crypto/MacSpi" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="engineDoFinal()[B" />
+ <method name="engineGetMacLength()I" />
+ <method name="engineInit(Ljava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;)V" />
+ <method name="engineReset()V" />
+ <method name="engineUpdate(B)V" />
+ <method name="engineUpdate(Ljava/nio/ByteBuffer;)V" />
+ <method name="engineUpdate([BII)V" />
+ </class>
+ <class name="javax/crypto/NoSuchPaddingException" since="1">
+ <extends name="java/security/GeneralSecurityException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="javax/crypto/NullCipher" since="1">
+ <extends name="javax/crypto/Cipher" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="javax/crypto/SealedObject" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/io/Serializable;Ljavax/crypto/Cipher;)V" />
+ <method name="&lt;init>(Ljavax/crypto/SealedObject;)V" />
+ <method name="getAlgorithm()Ljava/lang/String;" />
+ <method name="getObject(Ljava/security/Key;)Ljava/lang/Object;" />
+ <method name="getObject(Ljava/security/Key;Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="getObject(Ljavax/crypto/Cipher;)Ljava/lang/Object;" />
+ <field name="encodedParams" />
+ </class>
+ <class name="javax/crypto/SecretKey" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/Key" />
+ <field name="serialVersionUID" />
+ </class>
+ <class name="javax/crypto/SecretKeyFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljavax/crypto/SecretKeyFactorySpi;Ljava/security/Provider;Ljava/lang/String;)V" />
+ <method name="generateSecret(Ljava/security/spec/KeySpec;)Ljavax/crypto/SecretKey;" />
+ <method name="getAlgorithm()Ljava/lang/String;" />
+ <method name="getInstance(Ljava/lang/String;)Ljavax/crypto/SecretKeyFactory;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/crypto/SecretKeyFactory;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/crypto/SecretKeyFactory;" />
+ <method name="getKeySpec(Ljavax/crypto/SecretKey;Ljava/lang/Class;)Ljava/security/spec/KeySpec;" />
+ <method name="getProvider()Ljava/security/Provider;" />
+ <method name="translateKey(Ljavax/crypto/SecretKey;)Ljavax/crypto/SecretKey;" />
+ </class>
+ <class name="javax/crypto/SecretKeyFactorySpi" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="engineGenerateSecret(Ljava/security/spec/KeySpec;)Ljavax/crypto/SecretKey;" />
+ <method name="engineGetKeySpec(Ljavax/crypto/SecretKey;Ljava/lang/Class;)Ljava/security/spec/KeySpec;" />
+ <method name="engineTranslateKey(Ljavax/crypto/SecretKey;)Ljavax/crypto/SecretKey;" />
+ </class>
+ <class name="javax/crypto/ShortBufferException" since="1">
+ <extends name="java/security/GeneralSecurityException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="javax/crypto/interfaces/DHKey" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getParams()Ljavax/crypto/spec/DHParameterSpec;" />
+ </class>
+ <class name="javax/crypto/interfaces/DHPrivateKey" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/PrivateKey" />
+ <implements name="javax/crypto/interfaces/DHKey" />
+ <method name="getX()Ljava/math/BigInteger;" />
+ <field name="serialVersionUID" />
+ </class>
+ <class name="javax/crypto/interfaces/DHPublicKey" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/PublicKey" />
+ <implements name="javax/crypto/interfaces/DHKey" />
+ <method name="getY()Ljava/math/BigInteger;" />
+ <field name="serialVersionUID" />
+ </class>
+ <class name="javax/crypto/interfaces/PBEKey" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="javax/crypto/SecretKey" />
+ <method name="getIterationCount()I" />
+ <method name="getPassword()[C" />
+ <method name="getSalt()[B" />
+ <field name="serialVersionUID" />
+ </class>
+ <class name="javax/crypto/spec/DESKeySpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/KeySpec" />
+ <method name="&lt;init>([B)V" />
+ <method name="&lt;init>([BI)V" />
+ <method name="getKey()[B" />
+ <method name="isParityAdjusted([BI)Z" />
+ <method name="isWeak([BI)Z" />
+ <field name="DES_KEY_LEN" />
+ </class>
+ <class name="javax/crypto/spec/DESedeKeySpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/KeySpec" />
+ <method name="&lt;init>([B)V" />
+ <method name="&lt;init>([BI)V" />
+ <method name="getKey()[B" />
+ <method name="isParityAdjusted([BI)Z" />
+ <field name="DES_EDE_KEY_LEN" />
+ </class>
+ <class name="javax/crypto/spec/DHGenParameterSpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/AlgorithmParameterSpec" />
+ <method name="&lt;init>(II)V" />
+ <method name="getExponentSize()I" />
+ <method name="getPrimeSize()I" />
+ </class>
+ <class name="javax/crypto/spec/DHParameterSpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/AlgorithmParameterSpec" />
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;)V" />
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;I)V" />
+ <method name="getG()Ljava/math/BigInteger;" />
+ <method name="getL()I" />
+ <method name="getP()Ljava/math/BigInteger;" />
+ </class>
+ <class name="javax/crypto/spec/DHPrivateKeySpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/KeySpec" />
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)V" />
+ <method name="getG()Ljava/math/BigInteger;" />
+ <method name="getP()Ljava/math/BigInteger;" />
+ <method name="getX()Ljava/math/BigInteger;" />
+ </class>
+ <class name="javax/crypto/spec/DHPublicKeySpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/KeySpec" />
+ <method name="&lt;init>(Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)V" />
+ <method name="getG()Ljava/math/BigInteger;" />
+ <method name="getP()Ljava/math/BigInteger;" />
+ <method name="getY()Ljava/math/BigInteger;" />
+ </class>
+ <class name="javax/crypto/spec/GCMParameterSpec" since="19">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/AlgorithmParameterSpec" />
+ <method name="&lt;init>(I[B)V" />
+ <method name="&lt;init>(I[BII)V" />
+ <method name="getIV()[B" />
+ <method name="getTLen()I" />
+ </class>
+ <class name="javax/crypto/spec/IvParameterSpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/AlgorithmParameterSpec" />
+ <method name="&lt;init>([B)V" />
+ <method name="&lt;init>([BII)V" />
+ <method name="getIV()[B" />
+ </class>
+ <class name="javax/crypto/spec/OAEPParameterSpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/AlgorithmParameterSpec" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/security/spec/AlgorithmParameterSpec;Ljavax/crypto/spec/PSource;)V" />
+ <method name="getDigestAlgorithm()Ljava/lang/String;" />
+ <method name="getMGFAlgorithm()Ljava/lang/String;" />
+ <method name="getMGFParameters()Ljava/security/spec/AlgorithmParameterSpec;" />
+ <method name="getPSource()Ljavax/crypto/spec/PSource;" />
+ <field name="DEFAULT" />
+ </class>
+ <class name="javax/crypto/spec/PBEKeySpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/KeySpec" />
+ <method name="&lt;init>([C)V" />
+ <method name="&lt;init>([C[BI)V" />
+ <method name="&lt;init>([C[BII)V" />
+ <method name="clearPassword()V" />
+ <method name="getIterationCount()I" />
+ <method name="getKeyLength()I" />
+ <method name="getPassword()[C" />
+ <method name="getSalt()[B" />
+ </class>
+ <class name="javax/crypto/spec/PBEParameterSpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/AlgorithmParameterSpec" />
+ <method name="&lt;init>([BI)V" />
+ <method name="getIterationCount()I" />
+ <method name="getSalt()[B" />
+ </class>
+ <class name="javax/crypto/spec/PSource" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getAlgorithm()Ljava/lang/String;" />
+ </class>
+ <class name="javax/crypto/spec/PSource$PSpecified" since="1">
+ <extends name="javax/crypto/spec/PSource" />
+ <method name="&lt;init>([B)V" />
+ <method name="getValue()[B" />
+ <field name="DEFAULT" />
+ </class>
+ <class name="javax/crypto/spec/RC2ParameterSpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/AlgorithmParameterSpec" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(I[B)V" />
+ <method name="&lt;init>(I[BI)V" />
+ <method name="getEffectiveKeyBits()I" />
+ <method name="getIV()[B" />
+ </class>
+ <class name="javax/crypto/spec/RC5ParameterSpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/spec/AlgorithmParameterSpec" />
+ <method name="&lt;init>(III)V" />
+ <method name="&lt;init>(III[B)V" />
+ <method name="&lt;init>(III[BI)V" />
+ <method name="getIV()[B" />
+ <method name="getRounds()I" />
+ <method name="getVersion()I" />
+ <method name="getWordSize()I" />
+ </class>
+ <class name="javax/crypto/spec/SecretKeySpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/security/spec/KeySpec" />
+ <implements name="javax/crypto/SecretKey" />
+ <method name="&lt;init>([BIILjava/lang/String;)V" />
+ <method name="&lt;init>([BLjava/lang/String;)V" />
+ </class>
+ <class name="javax/microedition/khronos/egl/EGL" since="1">
+ <extends name="java/lang/Object" />
+ </class>
+ <class name="javax/microedition/khronos/egl/EGL10" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="javax/microedition/khronos/egl/EGL" />
+ <method name="eglChooseConfig(Ljavax/microedition/khronos/egl/EGLDisplay;[I[Ljavax/microedition/khronos/egl/EGLConfig;I[I)Z" />
+ <method name="eglCopyBuffers(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLSurface;Ljava/lang/Object;)Z" />
+ <method name="eglCreateContext(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLConfig;Ljavax/microedition/khronos/egl/EGLContext;[I)Ljavax/microedition/khronos/egl/EGLContext;" />
+ <method name="eglCreatePbufferSurface(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLConfig;[I)Ljavax/microedition/khronos/egl/EGLSurface;" />
+ <method name="eglCreatePixmapSurface(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLConfig;Ljava/lang/Object;[I)Ljavax/microedition/khronos/egl/EGLSurface;" />
+ <method name="eglCreateWindowSurface(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLConfig;Ljava/lang/Object;[I)Ljavax/microedition/khronos/egl/EGLSurface;" />
+ <method name="eglDestroyContext(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLContext;)Z" />
+ <method name="eglDestroySurface(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLSurface;)Z" />
+ <method name="eglGetConfigAttrib(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLConfig;I[I)Z" />
+ <method name="eglGetConfigs(Ljavax/microedition/khronos/egl/EGLDisplay;[Ljavax/microedition/khronos/egl/EGLConfig;I[I)Z" />
+ <method name="eglGetCurrentContext()Ljavax/microedition/khronos/egl/EGLContext;" />
+ <method name="eglGetCurrentDisplay()Ljavax/microedition/khronos/egl/EGLDisplay;" />
+ <method name="eglGetCurrentSurface(I)Ljavax/microedition/khronos/egl/EGLSurface;" />
+ <method name="eglGetDisplay(Ljava/lang/Object;)Ljavax/microedition/khronos/egl/EGLDisplay;" />
+ <method name="eglGetError()I" />
+ <method name="eglInitialize(Ljavax/microedition/khronos/egl/EGLDisplay;[I)Z" />
+ <method name="eglMakeCurrent(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLSurface;Ljavax/microedition/khronos/egl/EGLSurface;Ljavax/microedition/khronos/egl/EGLContext;)Z" />
+ <method name="eglQueryContext(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLContext;I[I)Z" />
+ <method name="eglQueryString(Ljavax/microedition/khronos/egl/EGLDisplay;I)Ljava/lang/String;" />
+ <method name="eglQuerySurface(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLSurface;I[I)Z" />
+ <method name="eglSwapBuffers(Ljavax/microedition/khronos/egl/EGLDisplay;Ljavax/microedition/khronos/egl/EGLSurface;)Z" />
+ <method name="eglTerminate(Ljavax/microedition/khronos/egl/EGLDisplay;)Z" />
+ <method name="eglWaitGL()Z" />
+ <method name="eglWaitNative(ILjava/lang/Object;)Z" />
+ <field name="EGL_ALPHA_FORMAT" />
+ <field name="EGL_ALPHA_MASK_SIZE" />
+ <field name="EGL_ALPHA_SIZE" />
+ <field name="EGL_BAD_ACCESS" />
+ <field name="EGL_BAD_ALLOC" />
+ <field name="EGL_BAD_ATTRIBUTE" />
+ <field name="EGL_BAD_CONFIG" />
+ <field name="EGL_BAD_CONTEXT" />
+ <field name="EGL_BAD_CURRENT_SURFACE" />
+ <field name="EGL_BAD_DISPLAY" />
+ <field name="EGL_BAD_MATCH" />
+ <field name="EGL_BAD_NATIVE_PIXMAP" />
+ <field name="EGL_BAD_NATIVE_WINDOW" />
+ <field name="EGL_BAD_PARAMETER" />
+ <field name="EGL_BAD_SURFACE" />
+ <field name="EGL_BLUE_SIZE" />
+ <field name="EGL_BUFFER_SIZE" />
+ <field name="EGL_COLORSPACE" />
+ <field name="EGL_COLOR_BUFFER_TYPE" />
+ <field name="EGL_CONFIG_CAVEAT" />
+ <field name="EGL_CONFIG_ID" />
+ <field name="EGL_CORE_NATIVE_ENGINE" />
+ <field name="EGL_DEFAULT_DISPLAY" />
+ <field name="EGL_DEPTH_SIZE" />
+ <field name="EGL_DONT_CARE" />
+ <field name="EGL_DRAW" />
+ <field name="EGL_EXTENSIONS" />
+ <field name="EGL_GREEN_SIZE" />
+ <field name="EGL_HEIGHT" />
+ <field name="EGL_HORIZONTAL_RESOLUTION" />
+ <field name="EGL_LARGEST_PBUFFER" />
+ <field name="EGL_LEVEL" />
+ <field name="EGL_LUMINANCE_BUFFER" />
+ <field name="EGL_LUMINANCE_SIZE" />
+ <field name="EGL_MAX_PBUFFER_HEIGHT" />
+ <field name="EGL_MAX_PBUFFER_PIXELS" />
+ <field name="EGL_MAX_PBUFFER_WIDTH" />
+ <field name="EGL_NATIVE_RENDERABLE" />
+ <field name="EGL_NATIVE_VISUAL_ID" />
+ <field name="EGL_NATIVE_VISUAL_TYPE" />
+ <field name="EGL_NONE" />
+ <field name="EGL_NON_CONFORMANT_CONFIG" />
+ <field name="EGL_NOT_INITIALIZED" />
+ <field name="EGL_NO_CONTEXT" />
+ <field name="EGL_NO_DISPLAY" />
+ <field name="EGL_NO_SURFACE" />
+ <field name="EGL_PBUFFER_BIT" />
+ <field name="EGL_PIXEL_ASPECT_RATIO" />
+ <field name="EGL_PIXMAP_BIT" />
+ <field name="EGL_READ" />
+ <field name="EGL_RED_SIZE" />
+ <field name="EGL_RENDERABLE_TYPE" />
+ <field name="EGL_RENDER_BUFFER" />
+ <field name="EGL_RGB_BUFFER" />
+ <field name="EGL_SAMPLES" />
+ <field name="EGL_SAMPLE_BUFFERS" />
+ <field name="EGL_SINGLE_BUFFER" />
+ <field name="EGL_SLOW_CONFIG" />
+ <field name="EGL_STENCIL_SIZE" />
+ <field name="EGL_SUCCESS" />
+ <field name="EGL_SURFACE_TYPE" />
+ <field name="EGL_TRANSPARENT_BLUE_VALUE" />
+ <field name="EGL_TRANSPARENT_GREEN_VALUE" />
+ <field name="EGL_TRANSPARENT_RED_VALUE" />
+ <field name="EGL_TRANSPARENT_RGB" />
+ <field name="EGL_TRANSPARENT_TYPE" />
+ <field name="EGL_VENDOR" />
+ <field name="EGL_VERSION" />
+ <field name="EGL_VERTICAL_RESOLUTION" />
+ <field name="EGL_WIDTH" />
+ <field name="EGL_WINDOW_BIT" />
+ </class>
+ <class name="javax/microedition/khronos/egl/EGL11" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="javax/microedition/khronos/egl/EGL10" />
+ <field name="EGL_CONTEXT_LOST" />
+ </class>
+ <class name="javax/microedition/khronos/egl/EGLConfig" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="javax/microedition/khronos/egl/EGLContext" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getEGL()Ljavax/microedition/khronos/egl/EGL;" />
+ <method name="getGL()Ljavax/microedition/khronos/opengles/GL;" />
+ </class>
+ <class name="javax/microedition/khronos/egl/EGLDisplay" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="javax/microedition/khronos/egl/EGLSurface" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="javax/microedition/khronos/opengles/GL" since="1">
+ <extends name="java/lang/Object" />
+ </class>
+ <class name="javax/microedition/khronos/opengles/GL10" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="javax/microedition/khronos/opengles/GL" />
+ <method name="glActiveTexture(I)V" />
+ <method name="glAlphaFunc(IF)V" />
+ <method name="glAlphaFuncx(II)V" />
+ <method name="glBindTexture(II)V" />
+ <method name="glBlendFunc(II)V" />
+ <method name="glClear(I)V" />
+ <method name="glClearColor(FFFF)V" />
+ <method name="glClearColorx(IIII)V" />
+ <method name="glClearDepthf(F)V" />
+ <method name="glClearDepthx(I)V" />
+ <method name="glClearStencil(I)V" />
+ <method name="glClientActiveTexture(I)V" />
+ <method name="glColor4f(FFFF)V" />
+ <method name="glColor4x(IIII)V" />
+ <method name="glColorMask(ZZZZ)V" />
+ <method name="glColorPointer(IIILjava/nio/Buffer;)V" />
+ <method name="glCompressedTexImage2D(IIIIIIILjava/nio/Buffer;)V" />
+ <method name="glCompressedTexSubImage2D(IIIIIIIILjava/nio/Buffer;)V" />
+ <method name="glCopyTexImage2D(IIIIIIII)V" />
+ <method name="glCopyTexSubImage2D(IIIIIIII)V" />
+ <method name="glCullFace(I)V" />
+ <method name="glDeleteTextures(ILjava/nio/IntBuffer;)V" />
+ <method name="glDeleteTextures(I[II)V" />
+ <method name="glDepthFunc(I)V" />
+ <method name="glDepthMask(Z)V" />
+ <method name="glDepthRangef(FF)V" />
+ <method name="glDepthRangex(II)V" />
+ <method name="glDisable(I)V" />
+ <method name="glDisableClientState(I)V" />
+ <method name="glDrawArrays(III)V" />
+ <method name="glDrawElements(IIILjava/nio/Buffer;)V" />
+ <method name="glEnable(I)V" />
+ <method name="glEnableClientState(I)V" />
+ <method name="glFinish()V" />
+ <method name="glFlush()V" />
+ <method name="glFogf(IF)V" />
+ <method name="glFogfv(ILjava/nio/FloatBuffer;)V" />
+ <method name="glFogfv(I[FI)V" />
+ <method name="glFogx(II)V" />
+ <method name="glFogxv(ILjava/nio/IntBuffer;)V" />
+ <method name="glFogxv(I[II)V" />
+ <method name="glFrontFace(I)V" />
+ <method name="glFrustumf(FFFFFF)V" />
+ <method name="glFrustumx(IIIIII)V" />
+ <method name="glGenTextures(ILjava/nio/IntBuffer;)V" />
+ <method name="glGenTextures(I[II)V" />
+ <method name="glGetError()I" />
+ <method name="glGetIntegerv(ILjava/nio/IntBuffer;)V" />
+ <method name="glGetIntegerv(I[II)V" />
+ <method name="glGetString(I)Ljava/lang/String;" />
+ <method name="glHint(II)V" />
+ <method name="glLightModelf(IF)V" />
+ <method name="glLightModelfv(ILjava/nio/FloatBuffer;)V" />
+ <method name="glLightModelfv(I[FI)V" />
+ <method name="glLightModelx(II)V" />
+ <method name="glLightModelxv(ILjava/nio/IntBuffer;)V" />
+ <method name="glLightModelxv(I[II)V" />
+ <method name="glLightf(IIF)V" />
+ <method name="glLightfv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glLightfv(II[FI)V" />
+ <method name="glLightx(III)V" />
+ <method name="glLightxv(IILjava/nio/IntBuffer;)V" />
+ <method name="glLightxv(II[II)V" />
+ <method name="glLineWidth(F)V" />
+ <method name="glLineWidthx(I)V" />
+ <method name="glLoadIdentity()V" />
+ <method name="glLoadMatrixf(Ljava/nio/FloatBuffer;)V" />
+ <method name="glLoadMatrixf([FI)V" />
+ <method name="glLoadMatrixx(Ljava/nio/IntBuffer;)V" />
+ <method name="glLoadMatrixx([II)V" />
+ <method name="glLogicOp(I)V" />
+ <method name="glMaterialf(IIF)V" />
+ <method name="glMaterialfv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glMaterialfv(II[FI)V" />
+ <method name="glMaterialx(III)V" />
+ <method name="glMaterialxv(IILjava/nio/IntBuffer;)V" />
+ <method name="glMaterialxv(II[II)V" />
+ <method name="glMatrixMode(I)V" />
+ <method name="glMultMatrixf(Ljava/nio/FloatBuffer;)V" />
+ <method name="glMultMatrixf([FI)V" />
+ <method name="glMultMatrixx(Ljava/nio/IntBuffer;)V" />
+ <method name="glMultMatrixx([II)V" />
+ <method name="glMultiTexCoord4f(IFFFF)V" />
+ <method name="glMultiTexCoord4x(IIIII)V" />
+ <method name="glNormal3f(FFF)V" />
+ <method name="glNormal3x(III)V" />
+ <method name="glNormalPointer(IILjava/nio/Buffer;)V" />
+ <method name="glOrthof(FFFFFF)V" />
+ <method name="glOrthox(IIIIII)V" />
+ <method name="glPixelStorei(II)V" />
+ <method name="glPointSize(F)V" />
+ <method name="glPointSizex(I)V" />
+ <method name="glPolygonOffset(FF)V" />
+ <method name="glPolygonOffsetx(II)V" />
+ <method name="glPopMatrix()V" />
+ <method name="glPushMatrix()V" />
+ <method name="glReadPixels(IIIIIILjava/nio/Buffer;)V" />
+ <method name="glRotatef(FFFF)V" />
+ <method name="glRotatex(IIII)V" />
+ <method name="glSampleCoverage(FZ)V" />
+ <method name="glSampleCoveragex(IZ)V" />
+ <method name="glScalef(FFF)V" />
+ <method name="glScalex(III)V" />
+ <method name="glScissor(IIII)V" />
+ <method name="glShadeModel(I)V" />
+ <method name="glStencilFunc(III)V" />
+ <method name="glStencilMask(I)V" />
+ <method name="glStencilOp(III)V" />
+ <method name="glTexCoordPointer(IIILjava/nio/Buffer;)V" />
+ <method name="glTexEnvf(IIF)V" />
+ <method name="glTexEnvfv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glTexEnvfv(II[FI)V" />
+ <method name="glTexEnvx(III)V" />
+ <method name="glTexEnvxv(IILjava/nio/IntBuffer;)V" />
+ <method name="glTexEnvxv(II[II)V" />
+ <method name="glTexImage2D(IIIIIIIILjava/nio/Buffer;)V" />
+ <method name="glTexParameterf(IIF)V" />
+ <method name="glTexParameterx(III)V" />
+ <method name="glTexSubImage2D(IIIIIIIILjava/nio/Buffer;)V" />
+ <method name="glTranslatef(FFF)V" />
+ <method name="glTranslatex(III)V" />
+ <method name="glVertexPointer(IIILjava/nio/Buffer;)V" />
+ <method name="glViewport(IIII)V" />
+ <field name="GL_ADD" />
+ <field name="GL_ALIASED_LINE_WIDTH_RANGE" />
+ <field name="GL_ALIASED_POINT_SIZE_RANGE" />
+ <field name="GL_ALPHA" />
+ <field name="GL_ALPHA_BITS" />
+ <field name="GL_ALPHA_TEST" />
+ <field name="GL_ALWAYS" />
+ <field name="GL_AMBIENT" />
+ <field name="GL_AMBIENT_AND_DIFFUSE" />
+ <field name="GL_AND" />
+ <field name="GL_AND_INVERTED" />
+ <field name="GL_AND_REVERSE" />
+ <field name="GL_BACK" />
+ <field name="GL_BLEND" />
+ <field name="GL_BLUE_BITS" />
+ <field name="GL_BYTE" />
+ <field name="GL_CCW" />
+ <field name="GL_CLAMP_TO_EDGE" />
+ <field name="GL_CLEAR" />
+ <field name="GL_COLOR_ARRAY" />
+ <field name="GL_COLOR_BUFFER_BIT" />
+ <field name="GL_COLOR_LOGIC_OP" />
+ <field name="GL_COLOR_MATERIAL" />
+ <field name="GL_COMPRESSED_TEXTURE_FORMATS" />
+ <field name="GL_CONSTANT_ATTENUATION" />
+ <field name="GL_COPY" />
+ <field name="GL_COPY_INVERTED" />
+ <field name="GL_CULL_FACE" />
+ <field name="GL_CW" />
+ <field name="GL_DECAL" />
+ <field name="GL_DECR" />
+ <field name="GL_DEPTH_BITS" />
+ <field name="GL_DEPTH_BUFFER_BIT" />
+ <field name="GL_DEPTH_TEST" />
+ <field name="GL_DIFFUSE" />
+ <field name="GL_DITHER" />
+ <field name="GL_DONT_CARE" />
+ <field name="GL_DST_ALPHA" />
+ <field name="GL_DST_COLOR" />
+ <field name="GL_EMISSION" />
+ <field name="GL_EQUAL" />
+ <field name="GL_EQUIV" />
+ <field name="GL_EXP" />
+ <field name="GL_EXP2" />
+ <field name="GL_EXTENSIONS" />
+ <field name="GL_FALSE" />
+ <field name="GL_FASTEST" />
+ <field name="GL_FIXED" />
+ <field name="GL_FLAT" />
+ <field name="GL_FLOAT" />
+ <field name="GL_FOG" />
+ <field name="GL_FOG_COLOR" />
+ <field name="GL_FOG_DENSITY" />
+ <field name="GL_FOG_END" />
+ <field name="GL_FOG_HINT" />
+ <field name="GL_FOG_MODE" />
+ <field name="GL_FOG_START" />
+ <field name="GL_FRONT" />
+ <field name="GL_FRONT_AND_BACK" />
+ <field name="GL_GEQUAL" />
+ <field name="GL_GREATER" />
+ <field name="GL_GREEN_BITS" />
+ <field name="GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES" />
+ <field name="GL_IMPLEMENTATION_COLOR_READ_TYPE_OES" />
+ <field name="GL_INCR" />
+ <field name="GL_INVALID_ENUM" />
+ <field name="GL_INVALID_OPERATION" />
+ <field name="GL_INVALID_VALUE" />
+ <field name="GL_INVERT" />
+ <field name="GL_KEEP" />
+ <field name="GL_LEQUAL" />
+ <field name="GL_LESS" />
+ <field name="GL_LIGHT0" />
+ <field name="GL_LIGHT1" />
+ <field name="GL_LIGHT2" />
+ <field name="GL_LIGHT3" />
+ <field name="GL_LIGHT4" />
+ <field name="GL_LIGHT5" />
+ <field name="GL_LIGHT6" />
+ <field name="GL_LIGHT7" />
+ <field name="GL_LIGHTING" />
+ <field name="GL_LIGHT_MODEL_AMBIENT" />
+ <field name="GL_LIGHT_MODEL_TWO_SIDE" />
+ <field name="GL_LINEAR" />
+ <field name="GL_LINEAR_ATTENUATION" />
+ <field name="GL_LINEAR_MIPMAP_LINEAR" />
+ <field name="GL_LINEAR_MIPMAP_NEAREST" />
+ <field name="GL_LINES" />
+ <field name="GL_LINE_LOOP" />
+ <field name="GL_LINE_SMOOTH" />
+ <field name="GL_LINE_SMOOTH_HINT" />
+ <field name="GL_LINE_STRIP" />
+ <field name="GL_LUMINANCE" />
+ <field name="GL_LUMINANCE_ALPHA" />
+ <field name="GL_MAX_ELEMENTS_INDICES" />
+ <field name="GL_MAX_ELEMENTS_VERTICES" />
+ <field name="GL_MAX_LIGHTS" />
+ <field name="GL_MAX_MODELVIEW_STACK_DEPTH" />
+ <field name="GL_MAX_PROJECTION_STACK_DEPTH" />
+ <field name="GL_MAX_TEXTURE_SIZE" />
+ <field name="GL_MAX_TEXTURE_STACK_DEPTH" />
+ <field name="GL_MAX_TEXTURE_UNITS" />
+ <field name="GL_MAX_VIEWPORT_DIMS" />
+ <field name="GL_MODELVIEW" />
+ <field name="GL_MODULATE" />
+ <field name="GL_MULTISAMPLE" />
+ <field name="GL_NAND" />
+ <field name="GL_NEAREST" />
+ <field name="GL_NEAREST_MIPMAP_LINEAR" />
+ <field name="GL_NEAREST_MIPMAP_NEAREST" />
+ <field name="GL_NEVER" />
+ <field name="GL_NICEST" />
+ <field name="GL_NOOP" />
+ <field name="GL_NOR" />
+ <field name="GL_NORMALIZE" />
+ <field name="GL_NORMAL_ARRAY" />
+ <field name="GL_NOTEQUAL" />
+ <field name="GL_NO_ERROR" />
+ <field name="GL_NUM_COMPRESSED_TEXTURE_FORMATS" />
+ <field name="GL_ONE" />
+ <field name="GL_ONE_MINUS_DST_ALPHA" />
+ <field name="GL_ONE_MINUS_DST_COLOR" />
+ <field name="GL_ONE_MINUS_SRC_ALPHA" />
+ <field name="GL_ONE_MINUS_SRC_COLOR" />
+ <field name="GL_OR" />
+ <field name="GL_OR_INVERTED" />
+ <field name="GL_OR_REVERSE" />
+ <field name="GL_OUT_OF_MEMORY" />
+ <field name="GL_PACK_ALIGNMENT" />
+ <field name="GL_PALETTE4_R5_G6_B5_OES" />
+ <field name="GL_PALETTE4_RGB5_A1_OES" />
+ <field name="GL_PALETTE4_RGB8_OES" />
+ <field name="GL_PALETTE4_RGBA4_OES" />
+ <field name="GL_PALETTE4_RGBA8_OES" />
+ <field name="GL_PALETTE8_R5_G6_B5_OES" />
+ <field name="GL_PALETTE8_RGB5_A1_OES" />
+ <field name="GL_PALETTE8_RGB8_OES" />
+ <field name="GL_PALETTE8_RGBA4_OES" />
+ <field name="GL_PALETTE8_RGBA8_OES" />
+ <field name="GL_PERSPECTIVE_CORRECTION_HINT" />
+ <field name="GL_POINTS" />
+ <field name="GL_POINT_FADE_THRESHOLD_SIZE" />
+ <field name="GL_POINT_SIZE" />
+ <field name="GL_POINT_SMOOTH" />
+ <field name="GL_POINT_SMOOTH_HINT" />
+ <field name="GL_POLYGON_OFFSET_FILL" />
+ <field name="GL_POLYGON_SMOOTH_HINT" />
+ <field name="GL_POSITION" />
+ <field name="GL_PROJECTION" />
+ <field name="GL_QUADRATIC_ATTENUATION" />
+ <field name="GL_RED_BITS" />
+ <field name="GL_RENDERER" />
+ <field name="GL_REPEAT" />
+ <field name="GL_REPLACE" />
+ <field name="GL_RESCALE_NORMAL" />
+ <field name="GL_RGB" />
+ <field name="GL_RGBA" />
+ <field name="GL_SAMPLE_ALPHA_TO_COVERAGE" />
+ <field name="GL_SAMPLE_ALPHA_TO_ONE" />
+ <field name="GL_SAMPLE_COVERAGE" />
+ <field name="GL_SCISSOR_TEST" />
+ <field name="GL_SET" />
+ <field name="GL_SHININESS" />
+ <field name="GL_SHORT" />
+ <field name="GL_SMOOTH" />
+ <field name="GL_SMOOTH_LINE_WIDTH_RANGE" />
+ <field name="GL_SMOOTH_POINT_SIZE_RANGE" />
+ <field name="GL_SPECULAR" />
+ <field name="GL_SPOT_CUTOFF" />
+ <field name="GL_SPOT_DIRECTION" />
+ <field name="GL_SPOT_EXPONENT" />
+ <field name="GL_SRC_ALPHA" />
+ <field name="GL_SRC_ALPHA_SATURATE" />
+ <field name="GL_SRC_COLOR" />
+ <field name="GL_STACK_OVERFLOW" />
+ <field name="GL_STACK_UNDERFLOW" />
+ <field name="GL_STENCIL_BITS" />
+ <field name="GL_STENCIL_BUFFER_BIT" />
+ <field name="GL_STENCIL_TEST" />
+ <field name="GL_SUBPIXEL_BITS" />
+ <field name="GL_TEXTURE" />
+ <field name="GL_TEXTURE0" />
+ <field name="GL_TEXTURE1" />
+ <field name="GL_TEXTURE10" />
+ <field name="GL_TEXTURE11" />
+ <field name="GL_TEXTURE12" />
+ <field name="GL_TEXTURE13" />
+ <field name="GL_TEXTURE14" />
+ <field name="GL_TEXTURE15" />
+ <field name="GL_TEXTURE16" />
+ <field name="GL_TEXTURE17" />
+ <field name="GL_TEXTURE18" />
+ <field name="GL_TEXTURE19" />
+ <field name="GL_TEXTURE2" />
+ <field name="GL_TEXTURE20" />
+ <field name="GL_TEXTURE21" />
+ <field name="GL_TEXTURE22" />
+ <field name="GL_TEXTURE23" />
+ <field name="GL_TEXTURE24" />
+ <field name="GL_TEXTURE25" />
+ <field name="GL_TEXTURE26" />
+ <field name="GL_TEXTURE27" />
+ <field name="GL_TEXTURE28" />
+ <field name="GL_TEXTURE29" />
+ <field name="GL_TEXTURE3" />
+ <field name="GL_TEXTURE30" />
+ <field name="GL_TEXTURE31" />
+ <field name="GL_TEXTURE4" />
+ <field name="GL_TEXTURE5" />
+ <field name="GL_TEXTURE6" />
+ <field name="GL_TEXTURE7" />
+ <field name="GL_TEXTURE8" />
+ <field name="GL_TEXTURE9" />
+ <field name="GL_TEXTURE_2D" />
+ <field name="GL_TEXTURE_COORD_ARRAY" />
+ <field name="GL_TEXTURE_ENV" />
+ <field name="GL_TEXTURE_ENV_COLOR" />
+ <field name="GL_TEXTURE_ENV_MODE" />
+ <field name="GL_TEXTURE_MAG_FILTER" />
+ <field name="GL_TEXTURE_MIN_FILTER" />
+ <field name="GL_TEXTURE_WRAP_S" />
+ <field name="GL_TEXTURE_WRAP_T" />
+ <field name="GL_TRIANGLES" />
+ <field name="GL_TRIANGLE_FAN" />
+ <field name="GL_TRIANGLE_STRIP" />
+ <field name="GL_TRUE" />
+ <field name="GL_UNPACK_ALIGNMENT" />
+ <field name="GL_UNSIGNED_BYTE" />
+ <field name="GL_UNSIGNED_SHORT" />
+ <field name="GL_UNSIGNED_SHORT_4_4_4_4" />
+ <field name="GL_UNSIGNED_SHORT_5_5_5_1" />
+ <field name="GL_UNSIGNED_SHORT_5_6_5" />
+ <field name="GL_VENDOR" />
+ <field name="GL_VERSION" />
+ <field name="GL_VERTEX_ARRAY" />
+ <field name="GL_XOR" />
+ <field name="GL_ZERO" />
+ </class>
+ <class name="javax/microedition/khronos/opengles/GL10Ext" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="javax/microedition/khronos/opengles/GL" />
+ <method name="glQueryMatrixxOES(Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;)I" />
+ <method name="glQueryMatrixxOES([II[II)I" />
+ </class>
+ <class name="javax/microedition/khronos/opengles/GL11" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="javax/microedition/khronos/opengles/GL10" />
+ <method name="glBindBuffer(II)V" />
+ <method name="glBufferData(IILjava/nio/Buffer;I)V" />
+ <method name="glBufferSubData(IIILjava/nio/Buffer;)V" />
+ <method name="glClipPlanef(ILjava/nio/FloatBuffer;)V" />
+ <method name="glClipPlanef(I[FI)V" />
+ <method name="glClipPlanex(ILjava/nio/IntBuffer;)V" />
+ <method name="glClipPlanex(I[II)V" />
+ <method name="glColor4ub(BBBB)V" />
+ <method name="glColorPointer(IIII)V" />
+ <method name="glDeleteBuffers(ILjava/nio/IntBuffer;)V" />
+ <method name="glDeleteBuffers(I[II)V" />
+ <method name="glDrawElements(IIII)V" />
+ <method name="glGenBuffers(ILjava/nio/IntBuffer;)V" />
+ <method name="glGenBuffers(I[II)V" />
+ <method name="glGetBooleanv(ILjava/nio/IntBuffer;)V" />
+ <method name="glGetBooleanv(I[ZI)V" />
+ <method name="glGetBufferParameteriv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetBufferParameteriv(II[II)V" />
+ <method name="glGetClipPlanef(ILjava/nio/FloatBuffer;)V" />
+ <method name="glGetClipPlanef(I[FI)V" />
+ <method name="glGetClipPlanex(ILjava/nio/IntBuffer;)V" />
+ <method name="glGetClipPlanex(I[II)V" />
+ <method name="glGetFixedv(ILjava/nio/IntBuffer;)V" />
+ <method name="glGetFixedv(I[II)V" />
+ <method name="glGetFloatv(ILjava/nio/FloatBuffer;)V" />
+ <method name="glGetFloatv(I[FI)V" />
+ <method name="glGetLightfv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glGetLightfv(II[FI)V" />
+ <method name="glGetLightxv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetLightxv(II[II)V" />
+ <method name="glGetMaterialfv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glGetMaterialfv(II[FI)V" />
+ <method name="glGetMaterialxv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetMaterialxv(II[II)V" />
+ <method name="glGetPointerv(I[Ljava/nio/Buffer;)V" />
+ <method name="glGetTexEnviv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetTexEnviv(II[II)V" />
+ <method name="glGetTexEnvxv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetTexEnvxv(II[II)V" />
+ <method name="glGetTexParameterfv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glGetTexParameterfv(II[FI)V" />
+ <method name="glGetTexParameteriv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetTexParameteriv(II[II)V" />
+ <method name="glGetTexParameterxv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetTexParameterxv(II[II)V" />
+ <method name="glIsBuffer(I)Z" />
+ <method name="glIsEnabled(I)Z" />
+ <method name="glIsTexture(I)Z" />
+ <method name="glNormalPointer(III)V" />
+ <method name="glPointParameterf(IF)V" />
+ <method name="glPointParameterfv(ILjava/nio/FloatBuffer;)V" />
+ <method name="glPointParameterfv(I[FI)V" />
+ <method name="glPointParameterx(II)V" />
+ <method name="glPointParameterxv(ILjava/nio/IntBuffer;)V" />
+ <method name="glPointParameterxv(I[II)V" />
+ <method name="glPointSizePointerOES(IILjava/nio/Buffer;)V" />
+ <method name="glTexCoordPointer(IIII)V" />
+ <method name="glTexEnvi(III)V" />
+ <method name="glTexEnviv(IILjava/nio/IntBuffer;)V" />
+ <method name="glTexEnviv(II[II)V" />
+ <method name="glTexParameterfv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glTexParameterfv(II[FI)V" />
+ <method name="glTexParameteri(III)V" />
+ <method name="glTexParameteriv(IILjava/nio/IntBuffer;)V" />
+ <method name="glTexParameteriv(II[II)V" />
+ <method name="glTexParameterxv(IILjava/nio/IntBuffer;)V" />
+ <method name="glTexParameterxv(II[II)V" />
+ <method name="glVertexPointer(IIII)V" />
+ <field name="GL_ACTIVE_TEXTURE" />
+ <field name="GL_ADD_SIGNED" />
+ <field name="GL_ALPHA_SCALE" />
+ <field name="GL_ALPHA_TEST_FUNC" />
+ <field name="GL_ALPHA_TEST_REF" />
+ <field name="GL_ARRAY_BUFFER" />
+ <field name="GL_ARRAY_BUFFER_BINDING" />
+ <field name="GL_BLEND_DST" />
+ <field name="GL_BLEND_SRC" />
+ <field name="GL_BUFFER_ACCESS" />
+ <field name="GL_BUFFER_SIZE" />
+ <field name="GL_BUFFER_USAGE" />
+ <field name="GL_CLIENT_ACTIVE_TEXTURE" />
+ <field name="GL_CLIP_PLANE0" />
+ <field name="GL_CLIP_PLANE1" />
+ <field name="GL_CLIP_PLANE2" />
+ <field name="GL_CLIP_PLANE3" />
+ <field name="GL_CLIP_PLANE4" />
+ <field name="GL_CLIP_PLANE5" />
+ <field name="GL_COLOR_ARRAY_BUFFER_BINDING" />
+ <field name="GL_COLOR_ARRAY_POINTER" />
+ <field name="GL_COLOR_ARRAY_SIZE" />
+ <field name="GL_COLOR_ARRAY_STRIDE" />
+ <field name="GL_COLOR_ARRAY_TYPE" />
+ <field name="GL_COLOR_CLEAR_VALUE" />
+ <field name="GL_COLOR_WRITEMASK" />
+ <field name="GL_COMBINE" />
+ <field name="GL_COMBINE_ALPHA" />
+ <field name="GL_COMBINE_RGB" />
+ <field name="GL_CONSTANT" />
+ <field name="GL_COORD_REPLACE_OES" />
+ <field name="GL_CULL_FACE_MODE" />
+ <field name="GL_CURRENT_COLOR" />
+ <field name="GL_CURRENT_NORMAL" />
+ <field name="GL_CURRENT_TEXTURE_COORDS" />
+ <field name="GL_DEPTH_CLEAR_VALUE" />
+ <field name="GL_DEPTH_FUNC" />
+ <field name="GL_DEPTH_RANGE" />
+ <field name="GL_DEPTH_WRITEMASK" />
+ <field name="GL_DOT3_RGB" />
+ <field name="GL_DOT3_RGBA" />
+ <field name="GL_DYNAMIC_DRAW" />
+ <field name="GL_ELEMENT_ARRAY_BUFFER" />
+ <field name="GL_ELEMENT_ARRAY_BUFFER_BINDING" />
+ <field name="GL_FRONT_FACE" />
+ <field name="GL_GENERATE_MIPMAP" />
+ <field name="GL_GENERATE_MIPMAP_HINT" />
+ <field name="GL_INTERPOLATE" />
+ <field name="GL_LINE_WIDTH" />
+ <field name="GL_LOGIC_OP_MODE" />
+ <field name="GL_MATRIX_MODE" />
+ <field name="GL_MAX_CLIP_PLANES" />
+ <field name="GL_MODELVIEW_MATRIX" />
+ <field name="GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES" />
+ <field name="GL_MODELVIEW_STACK_DEPTH" />
+ <field name="GL_NORMAL_ARRAY_BUFFER_BINDING" />
+ <field name="GL_NORMAL_ARRAY_POINTER" />
+ <field name="GL_NORMAL_ARRAY_STRIDE" />
+ <field name="GL_NORMAL_ARRAY_TYPE" />
+ <field name="GL_OPERAND0_ALPHA" />
+ <field name="GL_OPERAND0_RGB" />
+ <field name="GL_OPERAND1_ALPHA" />
+ <field name="GL_OPERAND1_RGB" />
+ <field name="GL_OPERAND2_ALPHA" />
+ <field name="GL_OPERAND2_RGB" />
+ <field name="GL_POINT_DISTANCE_ATTENUATION" />
+ <field name="GL_POINT_FADE_THRESHOLD_SIZE" />
+ <field name="GL_POINT_SIZE" />
+ <field name="GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES" />
+ <field name="GL_POINT_SIZE_ARRAY_OES" />
+ <field name="GL_POINT_SIZE_ARRAY_POINTER_OES" />
+ <field name="GL_POINT_SIZE_ARRAY_STRIDE_OES" />
+ <field name="GL_POINT_SIZE_ARRAY_TYPE_OES" />
+ <field name="GL_POINT_SIZE_MAX" />
+ <field name="GL_POINT_SIZE_MIN" />
+ <field name="GL_POINT_SPRITE_OES" />
+ <field name="GL_POLYGON_OFFSET_FACTOR" />
+ <field name="GL_POLYGON_OFFSET_UNITS" />
+ <field name="GL_PREVIOUS" />
+ <field name="GL_PRIMARY_COLOR" />
+ <field name="GL_PROJECTION_MATRIX" />
+ <field name="GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES" />
+ <field name="GL_PROJECTION_STACK_DEPTH" />
+ <field name="GL_RGB_SCALE" />
+ <field name="GL_SAMPLES" />
+ <field name="GL_SAMPLE_BUFFERS" />
+ <field name="GL_SAMPLE_COVERAGE_INVERT" />
+ <field name="GL_SAMPLE_COVERAGE_VALUE" />
+ <field name="GL_SCISSOR_BOX" />
+ <field name="GL_SHADE_MODEL" />
+ <field name="GL_SRC0_ALPHA" />
+ <field name="GL_SRC0_RGB" />
+ <field name="GL_SRC1_ALPHA" />
+ <field name="GL_SRC1_RGB" />
+ <field name="GL_SRC2_ALPHA" />
+ <field name="GL_SRC2_RGB" />
+ <field name="GL_STATIC_DRAW" />
+ <field name="GL_STENCIL_CLEAR_VALUE" />
+ <field name="GL_STENCIL_FAIL" />
+ <field name="GL_STENCIL_FUNC" />
+ <field name="GL_STENCIL_PASS_DEPTH_FAIL" />
+ <field name="GL_STENCIL_PASS_DEPTH_PASS" />
+ <field name="GL_STENCIL_REF" />
+ <field name="GL_STENCIL_VALUE_MASK" />
+ <field name="GL_STENCIL_WRITEMASK" />
+ <field name="GL_SUBTRACT" />
+ <field name="GL_TEXTURE_BINDING_2D" />
+ <field name="GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING" />
+ <field name="GL_TEXTURE_COORD_ARRAY_POINTER" />
+ <field name="GL_TEXTURE_COORD_ARRAY_SIZE" />
+ <field name="GL_TEXTURE_COORD_ARRAY_STRIDE" />
+ <field name="GL_TEXTURE_COORD_ARRAY_TYPE" />
+ <field name="GL_TEXTURE_MATRIX" />
+ <field name="GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES" />
+ <field name="GL_TEXTURE_STACK_DEPTH" />
+ <field name="GL_VERTEX_ARRAY_BUFFER_BINDING" />
+ <field name="GL_VERTEX_ARRAY_POINTER" />
+ <field name="GL_VERTEX_ARRAY_SIZE" />
+ <field name="GL_VERTEX_ARRAY_STRIDE" />
+ <field name="GL_VERTEX_ARRAY_TYPE" />
+ <field name="GL_VIEWPORT" />
+ <field name="GL_WRITE_ONLY" />
+ </class>
+ <class name="javax/microedition/khronos/opengles/GL11Ext" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="javax/microedition/khronos/opengles/GL" />
+ <method name="glCurrentPaletteMatrixOES(I)V" />
+ <method name="glDrawTexfOES(FFFFF)V" />
+ <method name="glDrawTexfvOES(Ljava/nio/FloatBuffer;)V" />
+ <method name="glDrawTexfvOES([FI)V" />
+ <method name="glDrawTexiOES(IIIII)V" />
+ <method name="glDrawTexivOES(Ljava/nio/IntBuffer;)V" />
+ <method name="glDrawTexivOES([II)V" />
+ <method name="glDrawTexsOES(SSSSS)V" />
+ <method name="glDrawTexsvOES(Ljava/nio/ShortBuffer;)V" />
+ <method name="glDrawTexsvOES([SI)V" />
+ <method name="glDrawTexxOES(IIIII)V" />
+ <method name="glDrawTexxvOES(Ljava/nio/IntBuffer;)V" />
+ <method name="glDrawTexxvOES([II)V" />
+ <method name="glEnable(I)V" />
+ <method name="glEnableClientState(I)V" />
+ <method name="glLoadPaletteFromModelViewMatrixOES()V" />
+ <method name="glMatrixIndexPointerOES(IIII)V" />
+ <method name="glMatrixIndexPointerOES(IIILjava/nio/Buffer;)V" />
+ <method name="glTexParameterfv(II[FI)V" />
+ <method name="glWeightPointerOES(IIII)V" />
+ <method name="glWeightPointerOES(IIILjava/nio/Buffer;)V" />
+ <field name="GL_MATRIX_INDEX_ARRAY_BUFFER_BINDING_OES" />
+ <field name="GL_MATRIX_INDEX_ARRAY_OES" />
+ <field name="GL_MATRIX_INDEX_ARRAY_POINTER_OES" />
+ <field name="GL_MATRIX_INDEX_ARRAY_SIZE_OES" />
+ <field name="GL_MATRIX_INDEX_ARRAY_STRIDE_OES" />
+ <field name="GL_MATRIX_INDEX_ARRAY_TYPE_OES" />
+ <field name="GL_MATRIX_PALETTE_OES" />
+ <field name="GL_MAX_PALETTE_MATRICES_OES" />
+ <field name="GL_MAX_VERTEX_UNITS_OES" />
+ <field name="GL_TEXTURE_CROP_RECT_OES" />
+ <field name="GL_WEIGHT_ARRAY_BUFFER_BINDING_OES" />
+ <field name="GL_WEIGHT_ARRAY_OES" />
+ <field name="GL_WEIGHT_ARRAY_POINTER_OES" />
+ <field name="GL_WEIGHT_ARRAY_SIZE_OES" />
+ <field name="GL_WEIGHT_ARRAY_STRIDE_OES" />
+ <field name="GL_WEIGHT_ARRAY_TYPE_OES" />
+ </class>
+ <class name="javax/microedition/khronos/opengles/GL11ExtensionPack" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="javax/microedition/khronos/opengles/GL" />
+ <method name="glBindFramebufferOES(II)V" />
+ <method name="glBindRenderbufferOES(II)V" />
+ <method name="glBindTexture(II)V" />
+ <method name="glBlendEquation(I)V" />
+ <method name="glBlendEquationSeparate(II)V" />
+ <method name="glBlendFuncSeparate(IIII)V" />
+ <method name="glCheckFramebufferStatusOES(I)I" />
+ <method name="glCompressedTexImage2D(IIIIIIILjava/nio/Buffer;)V" />
+ <method name="glCopyTexImage2D(IIIIIIII)V" />
+ <method name="glDeleteFramebuffersOES(ILjava/nio/IntBuffer;)V" />
+ <method name="glDeleteFramebuffersOES(I[II)V" />
+ <method name="glDeleteRenderbuffersOES(ILjava/nio/IntBuffer;)V" />
+ <method name="glDeleteRenderbuffersOES(I[II)V" />
+ <method name="glEnable(I)V" />
+ <method name="glFramebufferRenderbufferOES(IIII)V" />
+ <method name="glFramebufferTexture2DOES(IIIII)V" />
+ <method name="glGenFramebuffersOES(ILjava/nio/IntBuffer;)V" />
+ <method name="glGenFramebuffersOES(I[II)V" />
+ <method name="glGenRenderbuffersOES(ILjava/nio/IntBuffer;)V" />
+ <method name="glGenRenderbuffersOES(I[II)V" />
+ <method name="glGenerateMipmapOES(I)V" />
+ <method name="glGetFramebufferAttachmentParameterivOES(IIILjava/nio/IntBuffer;)V" />
+ <method name="glGetFramebufferAttachmentParameterivOES(III[II)V" />
+ <method name="glGetIntegerv(ILjava/nio/IntBuffer;)V" />
+ <method name="glGetIntegerv(I[II)V" />
+ <method name="glGetRenderbufferParameterivOES(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetRenderbufferParameterivOES(II[II)V" />
+ <method name="glGetTexGenfv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glGetTexGenfv(II[FI)V" />
+ <method name="glGetTexGeniv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetTexGeniv(II[II)V" />
+ <method name="glGetTexGenxv(IILjava/nio/IntBuffer;)V" />
+ <method name="glGetTexGenxv(II[II)V" />
+ <method name="glIsFramebufferOES(I)Z" />
+ <method name="glIsRenderbufferOES(I)Z" />
+ <method name="glRenderbufferStorageOES(IIII)V" />
+ <method name="glStencilOp(III)V" />
+ <method name="glTexEnvf(IIF)V" />
+ <method name="glTexEnvfv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glTexEnvfv(II[FI)V" />
+ <method name="glTexEnvx(III)V" />
+ <method name="glTexEnvxv(IILjava/nio/IntBuffer;)V" />
+ <method name="glTexEnvxv(II[II)V" />
+ <method name="glTexGenf(IIF)V" />
+ <method name="glTexGenfv(IILjava/nio/FloatBuffer;)V" />
+ <method name="glTexGenfv(II[FI)V" />
+ <method name="glTexGeni(III)V" />
+ <method name="glTexGeniv(IILjava/nio/IntBuffer;)V" />
+ <method name="glTexGeniv(II[II)V" />
+ <method name="glTexGenx(III)V" />
+ <method name="glTexGenxv(IILjava/nio/IntBuffer;)V" />
+ <method name="glTexGenxv(II[II)V" />
+ <method name="glTexParameterf(IIF)V" />
+ <field name="GL_BLEND_DST_ALPHA" />
+ <field name="GL_BLEND_DST_RGB" />
+ <field name="GL_BLEND_EQUATION" />
+ <field name="GL_BLEND_EQUATION_ALPHA" />
+ <field name="GL_BLEND_EQUATION_RGB" />
+ <field name="GL_BLEND_SRC_ALPHA" />
+ <field name="GL_BLEND_SRC_RGB" />
+ <field name="GL_COLOR_ATTACHMENT0_OES" />
+ <field name="GL_COLOR_ATTACHMENT10_OES" />
+ <field name="GL_COLOR_ATTACHMENT11_OES" />
+ <field name="GL_COLOR_ATTACHMENT12_OES" />
+ <field name="GL_COLOR_ATTACHMENT13_OES" />
+ <field name="GL_COLOR_ATTACHMENT14_OES" />
+ <field name="GL_COLOR_ATTACHMENT15_OES" />
+ <field name="GL_COLOR_ATTACHMENT1_OES" />
+ <field name="GL_COLOR_ATTACHMENT2_OES" />
+ <field name="GL_COLOR_ATTACHMENT3_OES" />
+ <field name="GL_COLOR_ATTACHMENT4_OES" />
+ <field name="GL_COLOR_ATTACHMENT5_OES" />
+ <field name="GL_COLOR_ATTACHMENT6_OES" />
+ <field name="GL_COLOR_ATTACHMENT7_OES" />
+ <field name="GL_COLOR_ATTACHMENT8_OES" />
+ <field name="GL_COLOR_ATTACHMENT9_OES" />
+ <field name="GL_DECR_WRAP" />
+ <field name="GL_DEPTH_ATTACHMENT_OES" />
+ <field name="GL_DEPTH_COMPONENT" />
+ <field name="GL_DEPTH_COMPONENT16" />
+ <field name="GL_DEPTH_COMPONENT24" />
+ <field name="GL_DEPTH_COMPONENT32" />
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES" />
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES" />
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES" />
+ <field name="GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES" />
+ <field name="GL_FRAMEBUFFER_BINDING_OES" />
+ <field name="GL_FRAMEBUFFER_COMPLETE_OES" />
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES" />
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES" />
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_OES" />
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES" />
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES" />
+ <field name="GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_OES" />
+ <field name="GL_FRAMEBUFFER_OES" />
+ <field name="GL_FRAMEBUFFER_UNSUPPORTED_OES" />
+ <field name="GL_FUNC_ADD" />
+ <field name="GL_FUNC_REVERSE_SUBTRACT" />
+ <field name="GL_FUNC_SUBTRACT" />
+ <field name="GL_INCR_WRAP" />
+ <field name="GL_INVALID_FRAMEBUFFER_OPERATION_OES" />
+ <field name="GL_MAX_COLOR_ATTACHMENTS_OES" />
+ <field name="GL_MAX_CUBE_MAP_TEXTURE_SIZE" />
+ <field name="GL_MAX_RENDERBUFFER_SIZE_OES" />
+ <field name="GL_MIRRORED_REPEAT" />
+ <field name="GL_NORMAL_MAP" />
+ <field name="GL_REFLECTION_MAP" />
+ <field name="GL_RENDERBUFFER_ALPHA_SIZE_OES" />
+ <field name="GL_RENDERBUFFER_BINDING_OES" />
+ <field name="GL_RENDERBUFFER_BLUE_SIZE_OES" />
+ <field name="GL_RENDERBUFFER_DEPTH_SIZE_OES" />
+ <field name="GL_RENDERBUFFER_GREEN_SIZE_OES" />
+ <field name="GL_RENDERBUFFER_HEIGHT_OES" />
+ <field name="GL_RENDERBUFFER_INTERNAL_FORMAT_OES" />
+ <field name="GL_RENDERBUFFER_OES" />
+ <field name="GL_RENDERBUFFER_RED_SIZE_OES" />
+ <field name="GL_RENDERBUFFER_STENCIL_SIZE_OES" />
+ <field name="GL_RENDERBUFFER_WIDTH_OES" />
+ <field name="GL_RGB565_OES" />
+ <field name="GL_RGB5_A1" />
+ <field name="GL_RGB8" />
+ <field name="GL_RGBA4" />
+ <field name="GL_RGBA8" />
+ <field name="GL_STENCIL_ATTACHMENT_OES" />
+ <field name="GL_STENCIL_INDEX" />
+ <field name="GL_STENCIL_INDEX1_OES" />
+ <field name="GL_STENCIL_INDEX4_OES" />
+ <field name="GL_STENCIL_INDEX8_OES" />
+ <field name="GL_STR" />
+ <field name="GL_TEXTURE_BINDING_CUBE_MAP" />
+ <field name="GL_TEXTURE_CUBE_MAP" />
+ <field name="GL_TEXTURE_CUBE_MAP_NEGATIVE_X" />
+ <field name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Y" />
+ <field name="GL_TEXTURE_CUBE_MAP_NEGATIVE_Z" />
+ <field name="GL_TEXTURE_CUBE_MAP_POSITIVE_X" />
+ <field name="GL_TEXTURE_CUBE_MAP_POSITIVE_Y" />
+ <field name="GL_TEXTURE_CUBE_MAP_POSITIVE_Z" />
+ <field name="GL_TEXTURE_GEN_MODE" />
+ <field name="GL_TEXTURE_GEN_STR" />
+ </class>
+ <class name="javax/net/ServerSocketFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="createServerSocket()Ljava/net/ServerSocket;" />
+ <method name="createServerSocket(I)Ljava/net/ServerSocket;" />
+ <method name="createServerSocket(II)Ljava/net/ServerSocket;" />
+ <method name="createServerSocket(IILjava/net/InetAddress;)Ljava/net/ServerSocket;" />
+ <method name="getDefault()Ljavax/net/ServerSocketFactory;" />
+ </class>
+ <class name="javax/net/SocketFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="createSocket()Ljava/net/Socket;" />
+ <method name="createSocket(Ljava/lang/String;I)Ljava/net/Socket;" />
+ <method name="createSocket(Ljava/lang/String;ILjava/net/InetAddress;I)Ljava/net/Socket;" />
+ <method name="createSocket(Ljava/net/InetAddress;I)Ljava/net/Socket;" />
+ <method name="createSocket(Ljava/net/InetAddress;ILjava/net/InetAddress;I)Ljava/net/Socket;" />
+ <method name="getDefault()Ljavax/net/SocketFactory;" />
+ </class>
+ <class name="javax/net/ssl/CertPathTrustManagerParameters" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="javax/net/ssl/ManagerFactoryParameters" />
+ <method name="&lt;init>(Ljava/security/cert/CertPathParameters;)V" />
+ <method name="getParameters()Ljava/security/cert/CertPathParameters;" />
+ </class>
+ <class name="javax/net/ssl/HandshakeCompletedEvent" since="1">
+ <extends name="java/util/EventObject" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljavax/net/ssl/SSLSocket;Ljavax/net/ssl/SSLSession;)V" />
+ <method name="getCipherSuite()Ljava/lang/String;" />
+ <method name="getLocalCertificates()[Ljava/security/cert/Certificate;" />
+ <method name="getLocalPrincipal()Ljava/security/Principal;" />
+ <method name="getPeerCertificateChain()[Ljavax/security/cert/X509Certificate;" />
+ <method name="getPeerCertificates()[Ljava/security/cert/Certificate;" />
+ <method name="getPeerPrincipal()Ljava/security/Principal;" />
+ <method name="getSession()Ljavax/net/ssl/SSLSession;" />
+ <method name="getSocket()Ljavax/net/ssl/SSLSocket;" />
+ </class>
+ <class name="javax/net/ssl/HandshakeCompletedListener" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/EventListener" />
+ <method name="handshakeCompleted(Ljavax/net/ssl/HandshakeCompletedEvent;)V" />
+ </class>
+ <class name="javax/net/ssl/HostnameVerifier" since="1">
+ <extends name="java/lang/Object" />
+ <method name="verify(Ljava/lang/String;Ljavax/net/ssl/SSLSession;)Z" />
+ </class>
+ <class name="javax/net/ssl/HttpsURLConnection" since="1">
+ <extends name="java/net/HttpURLConnection" />
+ <method name="&lt;init>(Ljava/net/URL;)V" />
+ <method name="getCipherSuite()Ljava/lang/String;" />
+ <method name="getDefaultHostnameVerifier()Ljavax/net/ssl/HostnameVerifier;" />
+ <method name="getDefaultSSLSocketFactory()Ljavax/net/ssl/SSLSocketFactory;" />
+ <method name="getHostnameVerifier()Ljavax/net/ssl/HostnameVerifier;" />
+ <method name="getLocalCertificates()[Ljava/security/cert/Certificate;" />
+ <method name="getLocalPrincipal()Ljava/security/Principal;" />
+ <method name="getPeerPrincipal()Ljava/security/Principal;" />
+ <method name="getSSLSocketFactory()Ljavax/net/ssl/SSLSocketFactory;" />
+ <method name="getServerCertificates()[Ljava/security/cert/Certificate;" />
+ <method name="setDefaultHostnameVerifier(Ljavax/net/ssl/HostnameVerifier;)V" />
+ <method name="setDefaultSSLSocketFactory(Ljavax/net/ssl/SSLSocketFactory;)V" />
+ <method name="setHostnameVerifier(Ljavax/net/ssl/HostnameVerifier;)V" />
+ <method name="setSSLSocketFactory(Ljavax/net/ssl/SSLSocketFactory;)V" />
+ <field name="hostnameVerifier" />
+ </class>
+ <class name="javax/net/ssl/KeyManager" since="1">
+ <extends name="java/lang/Object" />
+ </class>
+ <class name="javax/net/ssl/KeyManagerFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljavax/net/ssl/KeyManagerFactorySpi;Ljava/security/Provider;Ljava/lang/String;)V" />
+ <method name="getAlgorithm()Ljava/lang/String;" />
+ <method name="getDefaultAlgorithm()Ljava/lang/String;" />
+ <method name="getInstance(Ljava/lang/String;)Ljavax/net/ssl/KeyManagerFactory;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/net/ssl/KeyManagerFactory;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/net/ssl/KeyManagerFactory;" />
+ <method name="getKeyManagers()[Ljavax/net/ssl/KeyManager;" />
+ <method name="getProvider()Ljava/security/Provider;" />
+ <method name="init(Ljava/security/KeyStore;[C)V" />
+ <method name="init(Ljavax/net/ssl/ManagerFactoryParameters;)V" />
+ </class>
+ <class name="javax/net/ssl/KeyManagerFactorySpi" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="engineGetKeyManagers()[Ljavax/net/ssl/KeyManager;" />
+ <method name="engineInit(Ljava/security/KeyStore;[C)V" />
+ <method name="engineInit(Ljavax/net/ssl/ManagerFactoryParameters;)V" />
+ </class>
+ <class name="javax/net/ssl/KeyStoreBuilderParameters" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="javax/net/ssl/ManagerFactoryParameters" />
+ <method name="&lt;init>(Ljava/security/KeyStore$Builder;)V" />
+ <method name="&lt;init>(Ljava/util/List;)V" />
+ <method name="getParameters()Ljava/util/List;" />
+ </class>
+ <class name="javax/net/ssl/ManagerFactoryParameters" since="1">
+ <extends name="java/lang/Object" />
+ </class>
+ <class name="javax/net/ssl/SSLContext" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljavax/net/ssl/SSLContextSpi;Ljava/security/Provider;Ljava/lang/String;)V" />
+ <method name="createSSLEngine()Ljavax/net/ssl/SSLEngine;" />
+ <method name="createSSLEngine(Ljava/lang/String;I)Ljavax/net/ssl/SSLEngine;" />
+ <method name="getClientSessionContext()Ljavax/net/ssl/SSLSessionContext;" />
+ <method name="getDefault()Ljavax/net/ssl/SSLContext;" since="9" />
+ <method name="getDefaultSSLParameters()Ljavax/net/ssl/SSLParameters;" since="9" />
+ <method name="getInstance(Ljava/lang/String;)Ljavax/net/ssl/SSLContext;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/net/ssl/SSLContext;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/net/ssl/SSLContext;" />
+ <method name="getProtocol()Ljava/lang/String;" />
+ <method name="getProvider()Ljava/security/Provider;" />
+ <method name="getServerSessionContext()Ljavax/net/ssl/SSLSessionContext;" />
+ <method name="getServerSocketFactory()Ljavax/net/ssl/SSLServerSocketFactory;" />
+ <method name="getSocketFactory()Ljavax/net/ssl/SSLSocketFactory;" />
+ <method name="getSupportedSSLParameters()Ljavax/net/ssl/SSLParameters;" since="9" />
+ <method name="init([Ljavax/net/ssl/KeyManager;[Ljavax/net/ssl/TrustManager;Ljava/security/SecureRandom;)V" />
+ <method name="setDefault(Ljavax/net/ssl/SSLContext;)V" since="9" />
+ </class>
+ <class name="javax/net/ssl/SSLContextSpi" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="engineCreateSSLEngine()Ljavax/net/ssl/SSLEngine;" />
+ <method name="engineCreateSSLEngine(Ljava/lang/String;I)Ljavax/net/ssl/SSLEngine;" />
+ <method name="engineGetClientSessionContext()Ljavax/net/ssl/SSLSessionContext;" />
+ <method name="engineGetDefaultSSLParameters()Ljavax/net/ssl/SSLParameters;" since="9" />
+ <method name="engineGetServerSessionContext()Ljavax/net/ssl/SSLSessionContext;" />
+ <method name="engineGetServerSocketFactory()Ljavax/net/ssl/SSLServerSocketFactory;" />
+ <method name="engineGetSocketFactory()Ljavax/net/ssl/SSLSocketFactory;" />
+ <method name="engineGetSupportedSSLParameters()Ljavax/net/ssl/SSLParameters;" since="9" />
+ <method name="engineInit([Ljavax/net/ssl/KeyManager;[Ljavax/net/ssl/TrustManager;Ljava/security/SecureRandom;)V" />
+ </class>
+ <class name="javax/net/ssl/SSLEngine" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;I)V" />
+ <method name="beginHandshake()V" />
+ <method name="closeInbound()V" />
+ <method name="closeOutbound()V" />
+ <method name="getDelegatedTask()Ljava/lang/Runnable;" />
+ <method name="getEnableSessionCreation()Z" />
+ <method name="getEnabledCipherSuites()[Ljava/lang/String;" />
+ <method name="getEnabledProtocols()[Ljava/lang/String;" />
+ <method name="getHandshakeStatus()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;" />
+ <method name="getNeedClientAuth()Z" />
+ <method name="getPeerHost()Ljava/lang/String;" />
+ <method name="getPeerPort()I" />
+ <method name="getSSLParameters()Ljavax/net/ssl/SSLParameters;" since="9" />
+ <method name="getSession()Ljavax/net/ssl/SSLSession;" />
+ <method name="getSupportedCipherSuites()[Ljava/lang/String;" />
+ <method name="getSupportedProtocols()[Ljava/lang/String;" />
+ <method name="getUseClientMode()Z" />
+ <method name="getWantClientAuth()Z" />
+ <method name="isInboundDone()Z" />
+ <method name="isOutboundDone()Z" />
+ <method name="setEnableSessionCreation(Z)V" />
+ <method name="setEnabledCipherSuites([Ljava/lang/String;)V" />
+ <method name="setEnabledProtocols([Ljava/lang/String;)V" />
+ <method name="setNeedClientAuth(Z)V" />
+ <method name="setSSLParameters(Ljavax/net/ssl/SSLParameters;)V" since="9" />
+ <method name="setUseClientMode(Z)V" />
+ <method name="setWantClientAuth(Z)V" />
+ <method name="unwrap(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult;" />
+ <method name="unwrap(Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult;" />
+ <method name="unwrap(Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;II)Ljavax/net/ssl/SSLEngineResult;" />
+ <method name="wrap(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult;" />
+ <method name="wrap([Ljava/nio/ByteBuffer;IILjava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult;" />
+ <method name="wrap([Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult;" />
+ </class>
+ <class name="javax/net/ssl/SSLEngineResult" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljavax/net/ssl/SSLEngineResult$Status;Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;II)V" />
+ <method name="bytesConsumed()I" />
+ <method name="bytesProduced()I" />
+ <method name="getHandshakeStatus()Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;" />
+ <method name="getStatus()Ljavax/net/ssl/SSLEngineResult$Status;" />
+ </class>
+ <class name="javax/net/ssl/SSLEngineResult$HandshakeStatus" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;" />
+ <method name="values()[Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;" />
+ <field name="FINISHED" />
+ <field name="NEED_TASK" />
+ <field name="NEED_UNWRAP" />
+ <field name="NEED_WRAP" />
+ <field name="NOT_HANDSHAKING" />
+ </class>
+ <class name="javax/net/ssl/SSLEngineResult$Status" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Ljavax/net/ssl/SSLEngineResult$Status;" />
+ <method name="values()[Ljavax/net/ssl/SSLEngineResult$Status;" />
+ <field name="BUFFER_OVERFLOW" />
+ <field name="BUFFER_UNDERFLOW" />
+ <field name="CLOSED" />
+ <field name="OK" />
+ </class>
+ <class name="javax/net/ssl/SSLException" since="1">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="javax/net/ssl/SSLHandshakeException" since="1">
+ <extends name="javax/net/ssl/SSLException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="javax/net/ssl/SSLKeyException" since="1">
+ <extends name="javax/net/ssl/SSLException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="javax/net/ssl/SSLParameters" since="9">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>([Ljava/lang/String;)V" />
+ <method name="&lt;init>([Ljava/lang/String;[Ljava/lang/String;)V" />
+ <method name="getCipherSuites()[Ljava/lang/String;" />
+ <method name="getNeedClientAuth()Z" />
+ <method name="getProtocols()[Ljava/lang/String;" />
+ <method name="getWantClientAuth()Z" />
+ <method name="setCipherSuites([Ljava/lang/String;)V" />
+ <method name="setNeedClientAuth(Z)V" />
+ <method name="setProtocols([Ljava/lang/String;)V" />
+ <method name="setWantClientAuth(Z)V" />
+ </class>
+ <class name="javax/net/ssl/SSLPeerUnverifiedException" since="1">
+ <extends name="javax/net/ssl/SSLException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="javax/net/ssl/SSLPermission" since="1">
+ <extends name="java/security/BasicPermission" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="javax/net/ssl/SSLProtocolException" since="1">
+ <extends name="javax/net/ssl/SSLException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="javax/net/ssl/SSLServerSocket" since="1">
+ <extends name="java/net/ServerSocket" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="&lt;init>(II)V" />
+ <method name="&lt;init>(IILjava/net/InetAddress;)V" />
+ <method name="getEnableSessionCreation()Z" />
+ <method name="getEnabledCipherSuites()[Ljava/lang/String;" />
+ <method name="getEnabledProtocols()[Ljava/lang/String;" />
+ <method name="getNeedClientAuth()Z" />
+ <method name="getSupportedCipherSuites()[Ljava/lang/String;" />
+ <method name="getSupportedProtocols()[Ljava/lang/String;" />
+ <method name="getUseClientMode()Z" />
+ <method name="getWantClientAuth()Z" />
+ <method name="setEnableSessionCreation(Z)V" />
+ <method name="setEnabledCipherSuites([Ljava/lang/String;)V" />
+ <method name="setEnabledProtocols([Ljava/lang/String;)V" />
+ <method name="setNeedClientAuth(Z)V" />
+ <method name="setUseClientMode(Z)V" />
+ <method name="setWantClientAuth(Z)V" />
+ </class>
+ <class name="javax/net/ssl/SSLServerSocketFactory" since="1">
+ <extends name="javax/net/ServerSocketFactory" />
+ <method name="&lt;init>()V" />
+ <method name="getDefaultCipherSuites()[Ljava/lang/String;" />
+ <method name="getSupportedCipherSuites()[Ljava/lang/String;" />
+ </class>
+ <class name="javax/net/ssl/SSLSession" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getApplicationBufferSize()I" />
+ <method name="getCipherSuite()Ljava/lang/String;" />
+ <method name="getCreationTime()J" />
+ <method name="getId()[B" />
+ <method name="getLastAccessedTime()J" />
+ <method name="getLocalCertificates()[Ljava/security/cert/Certificate;" />
+ <method name="getLocalPrincipal()Ljava/security/Principal;" />
+ <method name="getPacketBufferSize()I" />
+ <method name="getPeerCertificateChain()[Ljavax/security/cert/X509Certificate;" />
+ <method name="getPeerCertificates()[Ljava/security/cert/Certificate;" />
+ <method name="getPeerHost()Ljava/lang/String;" />
+ <method name="getPeerPort()I" />
+ <method name="getPeerPrincipal()Ljava/security/Principal;" />
+ <method name="getProtocol()Ljava/lang/String;" />
+ <method name="getSessionContext()Ljavax/net/ssl/SSLSessionContext;" />
+ <method name="getValue(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="getValueNames()[Ljava/lang/String;" />
+ <method name="invalidate()V" />
+ <method name="isValid()Z" />
+ <method name="putValue(Ljava/lang/String;Ljava/lang/Object;)V" />
+ <method name="removeValue(Ljava/lang/String;)V" />
+ </class>
+ <class name="javax/net/ssl/SSLSessionBindingEvent" since="1">
+ <extends name="java/util/EventObject" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljavax/net/ssl/SSLSession;Ljava/lang/String;)V" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getSession()Ljavax/net/ssl/SSLSession;" />
+ </class>
+ <class name="javax/net/ssl/SSLSessionBindingListener" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/EventListener" />
+ <method name="valueBound(Ljavax/net/ssl/SSLSessionBindingEvent;)V" />
+ <method name="valueUnbound(Ljavax/net/ssl/SSLSessionBindingEvent;)V" />
+ </class>
+ <class name="javax/net/ssl/SSLSessionContext" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getIds()Ljava/util/Enumeration;" />
+ <method name="getSession([B)Ljavax/net/ssl/SSLSession;" />
+ <method name="getSessionCacheSize()I" />
+ <method name="getSessionTimeout()I" />
+ <method name="setSessionCacheSize(I)V" />
+ <method name="setSessionTimeout(I)V" />
+ </class>
+ <class name="javax/net/ssl/SSLSocket" since="1">
+ <extends name="java/net/Socket" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;ILjava/net/InetAddress;I)V" />
+ <method name="&lt;init>(Ljava/net/InetAddress;I)V" />
+ <method name="&lt;init>(Ljava/net/InetAddress;ILjava/net/InetAddress;I)V" />
+ <method name="addHandshakeCompletedListener(Ljavax/net/ssl/HandshakeCompletedListener;)V" />
+ <method name="getEnableSessionCreation()Z" />
+ <method name="getEnabledCipherSuites()[Ljava/lang/String;" />
+ <method name="getEnabledProtocols()[Ljava/lang/String;" />
+ <method name="getNeedClientAuth()Z" />
+ <method name="getSSLParameters()Ljavax/net/ssl/SSLParameters;" since="9" />
+ <method name="getSession()Ljavax/net/ssl/SSLSession;" />
+ <method name="getSupportedCipherSuites()[Ljava/lang/String;" />
+ <method name="getSupportedProtocols()[Ljava/lang/String;" />
+ <method name="getUseClientMode()Z" />
+ <method name="getWantClientAuth()Z" />
+ <method name="removeHandshakeCompletedListener(Ljavax/net/ssl/HandshakeCompletedListener;)V" />
+ <method name="setEnableSessionCreation(Z)V" />
+ <method name="setEnabledCipherSuites([Ljava/lang/String;)V" />
+ <method name="setEnabledProtocols([Ljava/lang/String;)V" />
+ <method name="setNeedClientAuth(Z)V" />
+ <method name="setSSLParameters(Ljavax/net/ssl/SSLParameters;)V" since="9" />
+ <method name="setUseClientMode(Z)V" />
+ <method name="setWantClientAuth(Z)V" />
+ <method name="startHandshake()V" />
+ </class>
+ <class name="javax/net/ssl/SSLSocketFactory" since="1">
+ <extends name="javax/net/SocketFactory" />
+ <method name="&lt;init>()V" />
+ <method name="createSocket(Ljava/net/Socket;Ljava/lang/String;IZ)Ljava/net/Socket;" />
+ <method name="getDefaultCipherSuites()[Ljava/lang/String;" />
+ <method name="getSupportedCipherSuites()[Ljava/lang/String;" />
+ </class>
+ <class name="javax/net/ssl/TrustManager" since="1">
+ <extends name="java/lang/Object" />
+ </class>
+ <class name="javax/net/ssl/TrustManagerFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljavax/net/ssl/TrustManagerFactorySpi;Ljava/security/Provider;Ljava/lang/String;)V" />
+ <method name="getAlgorithm()Ljava/lang/String;" />
+ <method name="getDefaultAlgorithm()Ljava/lang/String;" />
+ <method name="getInstance(Ljava/lang/String;)Ljavax/net/ssl/TrustManagerFactory;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/lang/String;)Ljavax/net/ssl/TrustManagerFactory;" />
+ <method name="getInstance(Ljava/lang/String;Ljava/security/Provider;)Ljavax/net/ssl/TrustManagerFactory;" />
+ <method name="getProvider()Ljava/security/Provider;" />
+ <method name="getTrustManagers()[Ljavax/net/ssl/TrustManager;" />
+ <method name="init(Ljava/security/KeyStore;)V" />
+ <method name="init(Ljavax/net/ssl/ManagerFactoryParameters;)V" />
+ </class>
+ <class name="javax/net/ssl/TrustManagerFactorySpi" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="engineGetTrustManagers()[Ljavax/net/ssl/TrustManager;" />
+ <method name="engineInit(Ljava/security/KeyStore;)V" />
+ <method name="engineInit(Ljavax/net/ssl/ManagerFactoryParameters;)V" />
+ </class>
+ <class name="javax/net/ssl/X509ExtendedKeyManager" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="javax/net/ssl/X509KeyManager" />
+ <method name="&lt;init>()V" />
+ <method name="chooseEngineClientAlias([Ljava/lang/String;[Ljava/security/Principal;Ljavax/net/ssl/SSLEngine;)Ljava/lang/String;" />
+ <method name="chooseEngineServerAlias(Ljava/lang/String;[Ljava/security/Principal;Ljavax/net/ssl/SSLEngine;)Ljava/lang/String;" />
+ </class>
+ <class name="javax/net/ssl/X509KeyManager" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="javax/net/ssl/KeyManager" />
+ <method name="chooseClientAlias([Ljava/lang/String;[Ljava/security/Principal;Ljava/net/Socket;)Ljava/lang/String;" />
+ <method name="chooseServerAlias(Ljava/lang/String;[Ljava/security/Principal;Ljava/net/Socket;)Ljava/lang/String;" />
+ <method name="getCertificateChain(Ljava/lang/String;)[Ljava/security/cert/X509Certificate;" />
+ <method name="getClientAliases(Ljava/lang/String;[Ljava/security/Principal;)[Ljava/lang/String;" />
+ <method name="getPrivateKey(Ljava/lang/String;)Ljava/security/PrivateKey;" />
+ <method name="getServerAliases(Ljava/lang/String;[Ljava/security/Principal;)[Ljava/lang/String;" />
+ </class>
+ <class name="javax/net/ssl/X509TrustManager" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="javax/net/ssl/TrustManager" />
+ <method name="checkClientTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;)V" />
+ <method name="checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;)V" />
+ <method name="getAcceptedIssuers()[Ljava/security/cert/X509Certificate;" />
+ </class>
+ <class name="javax/security/auth/AuthPermission" since="1">
+ <extends name="java/security/BasicPermission" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="javax/security/auth/DestroyFailedException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="javax/security/auth/Destroyable" since="1">
+ <extends name="java/lang/Object" />
+ <method name="destroy()V" />
+ <method name="isDestroyed()Z" />
+ </class>
+ <class name="javax/security/auth/PrivateCredentialPermission" since="1">
+ <extends name="java/security/Permission" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="getCredentialClass()Ljava/lang/String;" />
+ <method name="getPrincipals()[[Ljava/lang/String;" />
+ </class>
+ <class name="javax/security/auth/Subject" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(ZLjava/util/Set;Ljava/util/Set;Ljava/util/Set;)V" />
+ <method name="doAs(Ljavax/security/auth/Subject;Ljava/security/PrivilegedAction;)Ljava/lang/Object;" />
+ <method name="doAs(Ljavax/security/auth/Subject;Ljava/security/PrivilegedExceptionAction;)Ljava/lang/Object;" />
+ <method name="doAsPrivileged(Ljavax/security/auth/Subject;Ljava/security/PrivilegedAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;" />
+ <method name="doAsPrivileged(Ljavax/security/auth/Subject;Ljava/security/PrivilegedExceptionAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;" />
+ <method name="getPrincipals()Ljava/util/Set;" />
+ <method name="getPrincipals(Ljava/lang/Class;)Ljava/util/Set;" />
+ <method name="getPrivateCredentials()Ljava/util/Set;" />
+ <method name="getPrivateCredentials(Ljava/lang/Class;)Ljava/util/Set;" />
+ <method name="getPublicCredentials()Ljava/util/Set;" />
+ <method name="getPublicCredentials(Ljava/lang/Class;)Ljava/util/Set;" />
+ <method name="getSubject(Ljava/security/AccessControlContext;)Ljavax/security/auth/Subject;" />
+ <method name="isReadOnly()Z" />
+ <method name="setReadOnly()V" />
+ </class>
+ <class name="javax/security/auth/SubjectDomainCombiner" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/DomainCombiner" />
+ <method name="&lt;init>(Ljavax/security/auth/Subject;)V" />
+ <method name="getSubject()Ljavax/security/auth/Subject;" />
+ </class>
+ <class name="javax/security/auth/callback/Callback" since="1">
+ <extends name="java/lang/Object" />
+ </class>
+ <class name="javax/security/auth/callback/CallbackHandler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="handle([Ljavax/security/auth/callback/Callback;)V" />
+ </class>
+ <class name="javax/security/auth/callback/PasswordCallback" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="javax/security/auth/callback/Callback" />
+ <method name="&lt;init>(Ljava/lang/String;Z)V" />
+ <method name="clearPassword()V" />
+ <method name="getPassword()[C" />
+ <method name="getPrompt()Ljava/lang/String;" />
+ <method name="isEchoOn()Z" />
+ <method name="setPassword([C)V" />
+ </class>
+ <class name="javax/security/auth/callback/UnsupportedCallbackException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>(Ljavax/security/auth/callback/Callback;)V" />
+ <method name="&lt;init>(Ljavax/security/auth/callback/Callback;Ljava/lang/String;)V" />
+ <method name="getCallback()Ljavax/security/auth/callback/Callback;" />
+ </class>
+ <class name="javax/security/auth/login/LoginException" since="1">
+ <extends name="java/security/GeneralSecurityException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="javax/security/auth/x500/X500Principal" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/security/Principal" />
+ <method name="&lt;init>(Ljava/io/InputStream;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/util/Map;)V" since="9" />
+ <method name="&lt;init>([B)V" />
+ <method name="getEncoded()[B" />
+ <method name="getName(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getName(Ljava/lang/String;Ljava/util/Map;)Ljava/lang/String;" since="9" />
+ <field name="CANONICAL" />
+ <field name="RFC1779" />
+ <field name="RFC2253" />
+ </class>
+ <class name="javax/security/cert/Certificate" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getEncoded()[B" />
+ <method name="getPublicKey()Ljava/security/PublicKey;" />
+ <method name="verify(Ljava/security/PublicKey;)V" />
+ <method name="verify(Ljava/security/PublicKey;Ljava/lang/String;)V" />
+ </class>
+ <class name="javax/security/cert/CertificateEncodingException" since="1">
+ <extends name="javax/security/cert/CertificateException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="javax/security/cert/CertificateException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="javax/security/cert/CertificateExpiredException" since="1">
+ <extends name="javax/security/cert/CertificateException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="javax/security/cert/CertificateNotYetValidException" since="1">
+ <extends name="javax/security/cert/CertificateException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="javax/security/cert/CertificateParsingException" since="1">
+ <extends name="javax/security/cert/CertificateException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="javax/security/cert/X509Certificate" since="1">
+ <extends name="javax/security/cert/Certificate" />
+ <method name="&lt;init>()V" />
+ <method name="checkValidity()V" />
+ <method name="checkValidity(Ljava/util/Date;)V" />
+ <method name="getInstance(Ljava/io/InputStream;)Ljavax/security/cert/X509Certificate;" />
+ <method name="getInstance([B)Ljavax/security/cert/X509Certificate;" />
+ <method name="getIssuerDN()Ljava/security/Principal;" />
+ <method name="getNotAfter()Ljava/util/Date;" />
+ <method name="getNotBefore()Ljava/util/Date;" />
+ <method name="getSerialNumber()Ljava/math/BigInteger;" />
+ <method name="getSigAlgName()Ljava/lang/String;" />
+ <method name="getSigAlgOID()Ljava/lang/String;" />
+ <method name="getSigAlgParams()[B" />
+ <method name="getSubjectDN()Ljava/security/Principal;" />
+ <method name="getVersion()I" />
+ </class>
+ <class name="javax/sql/CommonDataSource" since="9">
+ <extends name="java/lang/Object" />
+ <method name="getLogWriter()Ljava/io/PrintWriter;" />
+ <method name="getLoginTimeout()I" />
+ <method name="setLogWriter(Ljava/io/PrintWriter;)V" />
+ <method name="setLoginTimeout(I)V" />
+ </class>
+ <class name="javax/sql/ConnectionEvent" since="1">
+ <extends name="java/util/EventObject" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljavax/sql/PooledConnection;)V" />
+ <method name="&lt;init>(Ljavax/sql/PooledConnection;Ljava/sql/SQLException;)V" />
+ <method name="getSQLException()Ljava/sql/SQLException;" />
+ </class>
+ <class name="javax/sql/ConnectionEventListener" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/EventListener" />
+ <method name="connectionClosed(Ljavax/sql/ConnectionEvent;)V" />
+ <method name="connectionErrorOccurred(Ljavax/sql/ConnectionEvent;)V" />
+ </class>
+ <class name="javax/sql/ConnectionPoolDataSource" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="javax/sql/CommonDataSource" since="9" />
+ <method name="getLogWriter()Ljava/io/PrintWriter;" />
+ <method name="getLoginTimeout()I" />
+ <method name="getPooledConnection()Ljavax/sql/PooledConnection;" />
+ <method name="getPooledConnection(Ljava/lang/String;Ljava/lang/String;)Ljavax/sql/PooledConnection;" />
+ <method name="setLogWriter(Ljava/io/PrintWriter;)V" />
+ <method name="setLoginTimeout(I)V" />
+ </class>
+ <class name="javax/sql/DataSource" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/sql/Wrapper" since="9" />
+ <implements name="javax/sql/CommonDataSource" since="9" />
+ <method name="getConnection()Ljava/sql/Connection;" />
+ <method name="getConnection(Ljava/lang/String;Ljava/lang/String;)Ljava/sql/Connection;" />
+ <method name="getLogWriter()Ljava/io/PrintWriter;" />
+ <method name="getLoginTimeout()I" />
+ <method name="setLogWriter(Ljava/io/PrintWriter;)V" />
+ <method name="setLoginTimeout(I)V" />
+ </class>
+ <class name="javax/sql/PooledConnection" since="1">
+ <extends name="java/lang/Object" />
+ <method name="addConnectionEventListener(Ljavax/sql/ConnectionEventListener;)V" />
+ <method name="addStatementEventListener(Ljavax/sql/StatementEventListener;)V" since="9" />
+ <method name="close()V" />
+ <method name="getConnection()Ljava/sql/Connection;" />
+ <method name="removeConnectionEventListener(Ljavax/sql/ConnectionEventListener;)V" />
+ <method name="removeStatementEventListener(Ljavax/sql/StatementEventListener;)V" since="9" />
+ </class>
+ <class name="javax/sql/RowSet" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/sql/ResultSet" />
+ <method name="addRowSetListener(Ljavax/sql/RowSetListener;)V" />
+ <method name="clearParameters()V" />
+ <method name="execute()V" />
+ <method name="getCommand()Ljava/lang/String;" />
+ <method name="getDataSourceName()Ljava/lang/String;" />
+ <method name="getEscapeProcessing()Z" />
+ <method name="getMaxFieldSize()I" />
+ <method name="getMaxRows()I" />
+ <method name="getPassword()Ljava/lang/String;" />
+ <method name="getQueryTimeout()I" />
+ <method name="getTransactionIsolation()I" />
+ <method name="getTypeMap()Ljava/util/Map;" />
+ <method name="getUrl()Ljava/lang/String;" />
+ <method name="getUsername()Ljava/lang/String;" />
+ <method name="isReadOnly()Z" />
+ <method name="removeRowSetListener(Ljavax/sql/RowSetListener;)V" />
+ <method name="setArray(ILjava/sql/Array;)V" />
+ <method name="setAsciiStream(ILjava/io/InputStream;)V" since="9" />
+ <method name="setAsciiStream(ILjava/io/InputStream;I)V" />
+ <method name="setAsciiStream(Ljava/lang/String;Ljava/io/InputStream;)V" since="9" />
+ <method name="setAsciiStream(Ljava/lang/String;Ljava/io/InputStream;I)V" since="9" />
+ <method name="setBigDecimal(ILjava/math/BigDecimal;)V" />
+ <method name="setBigDecimal(Ljava/lang/String;Ljava/math/BigDecimal;)V" since="9" />
+ <method name="setBinaryStream(ILjava/io/InputStream;)V" since="9" />
+ <method name="setBinaryStream(ILjava/io/InputStream;I)V" />
+ <method name="setBinaryStream(Ljava/lang/String;Ljava/io/InputStream;)V" since="9" />
+ <method name="setBinaryStream(Ljava/lang/String;Ljava/io/InputStream;I)V" since="9" />
+ <method name="setBlob(ILjava/io/InputStream;)V" since="9" />
+ <method name="setBlob(ILjava/io/InputStream;J)V" since="9" />
+ <method name="setBlob(ILjava/sql/Blob;)V" />
+ <method name="setBlob(Ljava/lang/String;Ljava/io/InputStream;)V" since="9" />
+ <method name="setBlob(Ljava/lang/String;Ljava/io/InputStream;J)V" since="9" />
+ <method name="setBlob(Ljava/lang/String;Ljava/sql/Blob;)V" since="9" />
+ <method name="setBoolean(IZ)V" />
+ <method name="setBoolean(Ljava/lang/String;Z)V" since="9" />
+ <method name="setByte(IB)V" />
+ <method name="setByte(Ljava/lang/String;B)V" since="9" />
+ <method name="setBytes(I[B)V" />
+ <method name="setBytes(Ljava/lang/String;[B)V" since="9" />
+ <method name="setCharacterStream(ILjava/io/Reader;)V" since="9" />
+ <method name="setCharacterStream(ILjava/io/Reader;I)V" />
+ <method name="setCharacterStream(Ljava/lang/String;Ljava/io/Reader;)V" since="9" />
+ <method name="setCharacterStream(Ljava/lang/String;Ljava/io/Reader;I)V" since="9" />
+ <method name="setClob(ILjava/io/Reader;)V" since="9" />
+ <method name="setClob(ILjava/io/Reader;J)V" since="9" />
+ <method name="setClob(ILjava/sql/Clob;)V" />
+ <method name="setClob(Ljava/lang/String;Ljava/io/Reader;)V" since="9" />
+ <method name="setClob(Ljava/lang/String;Ljava/io/Reader;J)V" since="9" />
+ <method name="setClob(Ljava/lang/String;Ljava/sql/Clob;)V" since="9" />
+ <method name="setCommand(Ljava/lang/String;)V" />
+ <method name="setConcurrency(I)V" />
+ <method name="setDataSourceName(Ljava/lang/String;)V" />
+ <method name="setDate(ILjava/sql/Date;)V" />
+ <method name="setDate(ILjava/sql/Date;Ljava/util/Calendar;)V" />
+ <method name="setDate(Ljava/lang/String;Ljava/sql/Date;)V" since="9" />
+ <method name="setDate(Ljava/lang/String;Ljava/sql/Date;Ljava/util/Calendar;)V" since="9" />
+ <method name="setDouble(ID)V" />
+ <method name="setDouble(Ljava/lang/String;D)V" since="9" />
+ <method name="setEscapeProcessing(Z)V" />
+ <method name="setFloat(IF)V" />
+ <method name="setFloat(Ljava/lang/String;F)V" since="9" />
+ <method name="setInt(II)V" />
+ <method name="setInt(Ljava/lang/String;I)V" since="9" />
+ <method name="setLong(IJ)V" />
+ <method name="setLong(Ljava/lang/String;J)V" since="9" />
+ <method name="setMaxFieldSize(I)V" />
+ <method name="setMaxRows(I)V" />
+ <method name="setNCharacterStream(ILjava/io/Reader;)V" since="9" />
+ <method name="setNCharacterStream(ILjava/io/Reader;J)V" since="9" />
+ <method name="setNCharacterStream(Ljava/lang/String;Ljava/io/Reader;)V" since="9" />
+ <method name="setNCharacterStream(Ljava/lang/String;Ljava/io/Reader;J)V" since="9" />
+ <method name="setNClob(ILjava/io/Reader;)V" since="9" />
+ <method name="setNClob(ILjava/io/Reader;J)V" since="9" />
+ <method name="setNClob(ILjava/sql/NClob;)V" since="9" />
+ <method name="setNClob(Ljava/lang/String;Ljava/io/Reader;)V" since="9" />
+ <method name="setNClob(Ljava/lang/String;Ljava/io/Reader;J)V" since="9" />
+ <method name="setNClob(Ljava/lang/String;Ljava/sql/NClob;)V" since="9" />
+ <method name="setNString(ILjava/lang/String;)V" since="9" />
+ <method name="setNString(Ljava/lang/String;Ljava/lang/String;)V" since="9" />
+ <method name="setNull(II)V" />
+ <method name="setNull(IILjava/lang/String;)V" />
+ <method name="setNull(Ljava/lang/String;I)V" since="9" />
+ <method name="setNull(Ljava/lang/String;ILjava/lang/String;)V" since="9" />
+ <method name="setObject(ILjava/lang/Object;)V" />
+ <method name="setObject(ILjava/lang/Object;I)V" />
+ <method name="setObject(ILjava/lang/Object;II)V" />
+ <method name="setObject(Ljava/lang/String;Ljava/lang/Object;)V" since="9" />
+ <method name="setObject(Ljava/lang/String;Ljava/lang/Object;I)V" since="9" />
+ <method name="setObject(Ljava/lang/String;Ljava/lang/Object;II)V" since="9" />
+ <method name="setPassword(Ljava/lang/String;)V" />
+ <method name="setQueryTimeout(I)V" />
+ <method name="setReadOnly(Z)V" />
+ <method name="setRef(ILjava/sql/Ref;)V" />
+ <method name="setRowId(ILjava/sql/RowId;)V" since="9" />
+ <method name="setRowId(Ljava/lang/String;Ljava/sql/RowId;)V" since="9" />
+ <method name="setSQLXML(ILjava/sql/SQLXML;)V" since="9" />
+ <method name="setSQLXML(Ljava/lang/String;Ljava/sql/SQLXML;)V" since="9" />
+ <method name="setShort(IS)V" />
+ <method name="setShort(Ljava/lang/String;S)V" since="9" />
+ <method name="setString(ILjava/lang/String;)V" />
+ <method name="setString(Ljava/lang/String;Ljava/lang/String;)V" since="9" />
+ <method name="setTime(ILjava/sql/Time;)V" />
+ <method name="setTime(ILjava/sql/Time;Ljava/util/Calendar;)V" />
+ <method name="setTime(Ljava/lang/String;Ljava/sql/Time;)V" since="9" />
+ <method name="setTime(Ljava/lang/String;Ljava/sql/Time;Ljava/util/Calendar;)V" since="9" />
+ <method name="setTimestamp(ILjava/sql/Timestamp;)V" />
+ <method name="setTimestamp(ILjava/sql/Timestamp;Ljava/util/Calendar;)V" />
+ <method name="setTimestamp(Ljava/lang/String;Ljava/sql/Timestamp;)V" since="9" />
+ <method name="setTimestamp(Ljava/lang/String;Ljava/sql/Timestamp;Ljava/util/Calendar;)V" since="9" />
+ <method name="setTransactionIsolation(I)V" />
+ <method name="setType(I)V" />
+ <method name="setTypeMap(Ljava/util/Map;)V" />
+ <method name="setURL(ILjava/net/URL;)V" since="9" />
+ <method name="setUrl(Ljava/lang/String;)V" />
+ <method name="setUsername(Ljava/lang/String;)V" />
+ </class>
+ <class name="javax/sql/RowSetEvent" since="1">
+ <extends name="java/util/EventObject" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljavax/sql/RowSet;)V" />
+ </class>
+ <class name="javax/sql/RowSetInternal" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getConnection()Ljava/sql/Connection;" />
+ <method name="getOriginal()Ljava/sql/ResultSet;" />
+ <method name="getOriginalRow()Ljava/sql/ResultSet;" />
+ <method name="getParams()[Ljava/lang/Object;" />
+ <method name="setMetaData(Ljavax/sql/RowSetMetaData;)V" />
+ </class>
+ <class name="javax/sql/RowSetListener" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/EventListener" />
+ <method name="cursorMoved(Ljavax/sql/RowSetEvent;)V" />
+ <method name="rowChanged(Ljavax/sql/RowSetEvent;)V" />
+ <method name="rowSetChanged(Ljavax/sql/RowSetEvent;)V" />
+ </class>
+ <class name="javax/sql/RowSetMetaData" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/sql/ResultSetMetaData" />
+ <method name="setAutoIncrement(IZ)V" />
+ <method name="setCaseSensitive(IZ)V" />
+ <method name="setCatalogName(ILjava/lang/String;)V" />
+ <method name="setColumnCount(I)V" />
+ <method name="setColumnDisplaySize(II)V" />
+ <method name="setColumnLabel(ILjava/lang/String;)V" />
+ <method name="setColumnName(ILjava/lang/String;)V" />
+ <method name="setColumnType(II)V" />
+ <method name="setColumnTypeName(ILjava/lang/String;)V" />
+ <method name="setCurrency(IZ)V" />
+ <method name="setNullable(II)V" />
+ <method name="setPrecision(II)V" />
+ <method name="setScale(II)V" />
+ <method name="setSchemaName(ILjava/lang/String;)V" />
+ <method name="setSearchable(IZ)V" />
+ <method name="setSigned(IZ)V" />
+ <method name="setTableName(ILjava/lang/String;)V" />
+ </class>
+ <class name="javax/sql/RowSetReader" since="1">
+ <extends name="java/lang/Object" />
+ <method name="readData(Ljavax/sql/RowSetInternal;)V" />
+ </class>
+ <class name="javax/sql/RowSetWriter" since="1">
+ <extends name="java/lang/Object" />
+ <method name="writeData(Ljavax/sql/RowSetInternal;)Z" />
+ </class>
+ <class name="javax/sql/StatementEvent" since="9">
+ <extends name="java/util/EventObject" />
+ <method name="&lt;init>(Ljavax/sql/PooledConnection;Ljava/sql/PreparedStatement;)V" />
+ <method name="&lt;init>(Ljavax/sql/PooledConnection;Ljava/sql/PreparedStatement;Ljava/sql/SQLException;)V" />
+ <method name="getSQLException()Ljava/sql/SQLException;" />
+ <method name="getStatement()Ljava/sql/PreparedStatement;" />
+ </class>
+ <class name="javax/sql/StatementEventListener" since="9">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/EventListener" />
+ <method name="statementClosed(Ljavax/sql/StatementEvent;)V" />
+ <method name="statementErrorOccurred(Ljavax/sql/StatementEvent;)V" />
+ </class>
+ <class name="javax/xml/XMLConstants" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="DEFAULT_NS_PREFIX" />
+ <field name="FEATURE_SECURE_PROCESSING" />
+ <field name="NULL_NS_URI" />
+ <field name="RELAXNG_NS_URI" />
+ <field name="W3C_XML_SCHEMA_INSTANCE_NS_URI" />
+ <field name="W3C_XML_SCHEMA_NS_URI" />
+ <field name="W3C_XPATH_DATATYPE_NS_URI" />
+ <field name="XMLNS_ATTRIBUTE" />
+ <field name="XMLNS_ATTRIBUTE_NS_URI" />
+ <field name="XML_DTD_NS_URI" />
+ <field name="XML_NS_PREFIX" />
+ <field name="XML_NS_URI" />
+ </class>
+ <class name="javax/xml/datatype/DatatypeConfigurationException" since="8">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="javax/xml/datatype/DatatypeConstants" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="APRIL" />
+ <field name="AUGUST" />
+ <field name="DATE" />
+ <field name="DATETIME" />
+ <field name="DAYS" />
+ <field name="DECEMBER" />
+ <field name="DURATION" />
+ <field name="DURATION_DAYTIME" />
+ <field name="DURATION_YEARMONTH" />
+ <field name="EQUAL" />
+ <field name="FEBRUARY" />
+ <field name="FIELD_UNDEFINED" />
+ <field name="GDAY" />
+ <field name="GMONTH" />
+ <field name="GMONTHDAY" />
+ <field name="GREATER" />
+ <field name="GYEAR" />
+ <field name="GYEARMONTH" />
+ <field name="HOURS" />
+ <field name="INDETERMINATE" />
+ <field name="JANUARY" />
+ <field name="JULY" />
+ <field name="JUNE" />
+ <field name="LESSER" />
+ <field name="MARCH" />
+ <field name="MAX_TIMEZONE_OFFSET" />
+ <field name="MAY" />
+ <field name="MINUTES" />
+ <field name="MIN_TIMEZONE_OFFSET" />
+ <field name="MONTHS" />
+ <field name="NOVEMBER" />
+ <field name="OCTOBER" />
+ <field name="SECONDS" />
+ <field name="SEPTEMBER" />
+ <field name="TIME" />
+ <field name="YEARS" />
+ </class>
+ <class name="javax/xml/datatype/DatatypeConstants$Field" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getId()I" />
+ </class>
+ <class name="javax/xml/datatype/DatatypeFactory" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="newDuration(J)Ljavax/xml/datatype/Duration;" />
+ <method name="newDuration(Ljava/lang/String;)Ljavax/xml/datatype/Duration;" />
+ <method name="newDuration(ZIIIIII)Ljavax/xml/datatype/Duration;" />
+ <method name="newDuration(ZLjava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigDecimal;)Ljavax/xml/datatype/Duration;" />
+ <method name="newDurationDayTime(J)Ljavax/xml/datatype/Duration;" />
+ <method name="newDurationDayTime(Ljava/lang/String;)Ljavax/xml/datatype/Duration;" />
+ <method name="newDurationDayTime(ZIIII)Ljavax/xml/datatype/Duration;" />
+ <method name="newDurationDayTime(ZLjava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;Ljava/math/BigInteger;)Ljavax/xml/datatype/Duration;" />
+ <method name="newDurationYearMonth(J)Ljavax/xml/datatype/Duration;" />
+ <method name="newDurationYearMonth(Ljava/lang/String;)Ljavax/xml/datatype/Duration;" />
+ <method name="newDurationYearMonth(ZII)Ljavax/xml/datatype/Duration;" />
+ <method name="newDurationYearMonth(ZLjava/math/BigInteger;Ljava/math/BigInteger;)Ljavax/xml/datatype/Duration;" />
+ <method name="newInstance()Ljavax/xml/datatype/DatatypeFactory;" />
+ <method name="newInstance(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljavax/xml/datatype/DatatypeFactory;" since="9" />
+ <method name="newXMLGregorianCalendar()Ljavax/xml/datatype/XMLGregorianCalendar;" />
+ <method name="newXMLGregorianCalendar(IIIIIIII)Ljavax/xml/datatype/XMLGregorianCalendar;" />
+ <method name="newXMLGregorianCalendar(Ljava/lang/String;)Ljavax/xml/datatype/XMLGregorianCalendar;" />
+ <method name="newXMLGregorianCalendar(Ljava/math/BigInteger;IIIIILjava/math/BigDecimal;I)Ljavax/xml/datatype/XMLGregorianCalendar;" />
+ <method name="newXMLGregorianCalendar(Ljava/util/GregorianCalendar;)Ljavax/xml/datatype/XMLGregorianCalendar;" />
+ <method name="newXMLGregorianCalendarDate(IIII)Ljavax/xml/datatype/XMLGregorianCalendar;" />
+ <method name="newXMLGregorianCalendarTime(IIII)Ljavax/xml/datatype/XMLGregorianCalendar;" />
+ <method name="newXMLGregorianCalendarTime(IIIII)Ljavax/xml/datatype/XMLGregorianCalendar;" />
+ <method name="newXMLGregorianCalendarTime(IIILjava/math/BigDecimal;I)Ljavax/xml/datatype/XMLGregorianCalendar;" />
+ <field name="DATATYPEFACTORY_IMPLEMENTATION_CLASS" />
+ <field name="DATATYPEFACTORY_PROPERTY" />
+ </class>
+ <class name="javax/xml/datatype/Duration" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="add(Ljavax/xml/datatype/Duration;)Ljavax/xml/datatype/Duration;" />
+ <method name="addTo(Ljava/util/Calendar;)V" />
+ <method name="addTo(Ljava/util/Date;)V" />
+ <method name="compare(Ljavax/xml/datatype/Duration;)I" />
+ <method name="getDays()I" />
+ <method name="getField(Ljavax/xml/datatype/DatatypeConstants$Field;)Ljava/lang/Number;" />
+ <method name="getHours()I" />
+ <method name="getMinutes()I" />
+ <method name="getMonths()I" />
+ <method name="getSeconds()I" />
+ <method name="getSign()I" />
+ <method name="getTimeInMillis(Ljava/util/Calendar;)J" />
+ <method name="getTimeInMillis(Ljava/util/Date;)J" />
+ <method name="getXMLSchemaType()Ljavax/xml/namespace/QName;" />
+ <method name="getYears()I" />
+ <method name="isLongerThan(Ljavax/xml/datatype/Duration;)Z" />
+ <method name="isSet(Ljavax/xml/datatype/DatatypeConstants$Field;)Z" />
+ <method name="isShorterThan(Ljavax/xml/datatype/Duration;)Z" />
+ <method name="multiply(I)Ljavax/xml/datatype/Duration;" />
+ <method name="multiply(Ljava/math/BigDecimal;)Ljavax/xml/datatype/Duration;" />
+ <method name="negate()Ljavax/xml/datatype/Duration;" />
+ <method name="normalizeWith(Ljava/util/Calendar;)Ljavax/xml/datatype/Duration;" />
+ <method name="subtract(Ljavax/xml/datatype/Duration;)Ljavax/xml/datatype/Duration;" />
+ </class>
+ <class name="javax/xml/datatype/XMLGregorianCalendar" since="8">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>()V" />
+ <method name="add(Ljavax/xml/datatype/Duration;)V" />
+ <method name="clear()V" />
+ <method name="compare(Ljavax/xml/datatype/XMLGregorianCalendar;)I" />
+ <method name="getDay()I" />
+ <method name="getEon()Ljava/math/BigInteger;" />
+ <method name="getEonAndYear()Ljava/math/BigInteger;" />
+ <method name="getFractionalSecond()Ljava/math/BigDecimal;" />
+ <method name="getHour()I" />
+ <method name="getMillisecond()I" />
+ <method name="getMinute()I" />
+ <method name="getMonth()I" />
+ <method name="getSecond()I" />
+ <method name="getTimeZone(I)Ljava/util/TimeZone;" />
+ <method name="getTimezone()I" />
+ <method name="getXMLSchemaType()Ljavax/xml/namespace/QName;" />
+ <method name="getYear()I" />
+ <method name="isValid()Z" />
+ <method name="normalize()Ljavax/xml/datatype/XMLGregorianCalendar;" />
+ <method name="reset()V" />
+ <method name="setDay(I)V" />
+ <method name="setFractionalSecond(Ljava/math/BigDecimal;)V" />
+ <method name="setHour(I)V" />
+ <method name="setMillisecond(I)V" />
+ <method name="setMinute(I)V" />
+ <method name="setMonth(I)V" />
+ <method name="setSecond(I)V" />
+ <method name="setTime(III)V" />
+ <method name="setTime(IIII)V" />
+ <method name="setTime(IIILjava/math/BigDecimal;)V" />
+ <method name="setTimezone(I)V" />
+ <method name="setYear(I)V" />
+ <method name="setYear(Ljava/math/BigInteger;)V" />
+ <method name="toGregorianCalendar()Ljava/util/GregorianCalendar;" />
+ <method name="toGregorianCalendar(Ljava/util/TimeZone;Ljava/util/Locale;Ljavax/xml/datatype/XMLGregorianCalendar;)Ljava/util/GregorianCalendar;" />
+ <method name="toXMLFormat()Ljava/lang/String;" />
+ </class>
+ <class name="javax/xml/namespace/NamespaceContext" since="8">
+ <extends name="java/lang/Object" />
+ <method name="getNamespaceURI(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getPrefix(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getPrefixes(Ljava/lang/String;)Ljava/util/Iterator;" />
+ </class>
+ <class name="javax/xml/namespace/QName" since="8">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="getLocalPart()Ljava/lang/String;" />
+ <method name="getNamespaceURI()Ljava/lang/String;" />
+ <method name="getPrefix()Ljava/lang/String;" />
+ <method name="valueOf(Ljava/lang/String;)Ljavax/xml/namespace/QName;" />
+ </class>
+ <class name="javax/xml/parsers/DocumentBuilder" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getDOMImplementation()Lorg/w3c/dom/DOMImplementation;" />
+ <method name="getSchema()Ljavax/xml/validation/Schema;" since="8" />
+ <method name="isNamespaceAware()Z" />
+ <method name="isValidating()Z" />
+ <method name="isXIncludeAware()Z" />
+ <method name="newDocument()Lorg/w3c/dom/Document;" />
+ <method name="parse(Ljava/io/File;)Lorg/w3c/dom/Document;" />
+ <method name="parse(Ljava/io/InputStream;)Lorg/w3c/dom/Document;" />
+ <method name="parse(Ljava/io/InputStream;Ljava/lang/String;)Lorg/w3c/dom/Document;" />
+ <method name="parse(Ljava/lang/String;)Lorg/w3c/dom/Document;" />
+ <method name="parse(Lorg/xml/sax/InputSource;)Lorg/w3c/dom/Document;" />
+ <method name="reset()V" />
+ <method name="setEntityResolver(Lorg/xml/sax/EntityResolver;)V" />
+ <method name="setErrorHandler(Lorg/xml/sax/ErrorHandler;)V" />
+ </class>
+ <class name="javax/xml/parsers/DocumentBuilderFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getAttribute(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="getFeature(Ljava/lang/String;)Z" />
+ <method name="getSchema()Ljavax/xml/validation/Schema;" since="8" />
+ <method name="isCoalescing()Z" />
+ <method name="isExpandEntityReferences()Z" />
+ <method name="isIgnoringComments()Z" />
+ <method name="isIgnoringElementContentWhitespace()Z" />
+ <method name="isNamespaceAware()Z" />
+ <method name="isValidating()Z" />
+ <method name="isXIncludeAware()Z" />
+ <method name="newDocumentBuilder()Ljavax/xml/parsers/DocumentBuilder;" />
+ <method name="newInstance()Ljavax/xml/parsers/DocumentBuilderFactory;" />
+ <method name="newInstance(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljavax/xml/parsers/DocumentBuilderFactory;" since="9" />
+ <method name="setAttribute(Ljava/lang/String;Ljava/lang/Object;)V" />
+ <method name="setCoalescing(Z)V" />
+ <method name="setExpandEntityReferences(Z)V" />
+ <method name="setFeature(Ljava/lang/String;Z)V" />
+ <method name="setIgnoringComments(Z)V" />
+ <method name="setIgnoringElementContentWhitespace(Z)V" />
+ <method name="setNamespaceAware(Z)V" />
+ <method name="setSchema(Ljavax/xml/validation/Schema;)V" since="8" />
+ <method name="setValidating(Z)V" />
+ <method name="setXIncludeAware(Z)V" />
+ </class>
+ <class name="javax/xml/parsers/FactoryConfigurationError" since="1">
+ <extends name="java/lang/Error" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/Exception;)V" />
+ <method name="&lt;init>(Ljava/lang/Exception;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getException()Ljava/lang/Exception;" />
+ </class>
+ <class name="javax/xml/parsers/ParserConfigurationException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="javax/xml/parsers/SAXParser" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getParser()Lorg/xml/sax/Parser;" />
+ <method name="getProperty(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="getSchema()Ljavax/xml/validation/Schema;" since="8" />
+ <method name="getXMLReader()Lorg/xml/sax/XMLReader;" />
+ <method name="isNamespaceAware()Z" />
+ <method name="isValidating()Z" />
+ <method name="isXIncludeAware()Z" />
+ <method name="parse(Ljava/io/File;Lorg/xml/sax/HandlerBase;)V" />
+ <method name="parse(Ljava/io/File;Lorg/xml/sax/helpers/DefaultHandler;)V" />
+ <method name="parse(Ljava/io/InputStream;Lorg/xml/sax/HandlerBase;)V" />
+ <method name="parse(Ljava/io/InputStream;Lorg/xml/sax/HandlerBase;Ljava/lang/String;)V" />
+ <method name="parse(Ljava/io/InputStream;Lorg/xml/sax/helpers/DefaultHandler;)V" />
+ <method name="parse(Ljava/io/InputStream;Lorg/xml/sax/helpers/DefaultHandler;Ljava/lang/String;)V" />
+ <method name="parse(Ljava/lang/String;Lorg/xml/sax/HandlerBase;)V" />
+ <method name="parse(Ljava/lang/String;Lorg/xml/sax/helpers/DefaultHandler;)V" />
+ <method name="parse(Lorg/xml/sax/InputSource;Lorg/xml/sax/HandlerBase;)V" />
+ <method name="parse(Lorg/xml/sax/InputSource;Lorg/xml/sax/helpers/DefaultHandler;)V" />
+ <method name="reset()V" />
+ <method name="setProperty(Ljava/lang/String;Ljava/lang/Object;)V" />
+ </class>
+ <class name="javax/xml/parsers/SAXParserFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getFeature(Ljava/lang/String;)Z" />
+ <method name="getSchema()Ljavax/xml/validation/Schema;" since="8" />
+ <method name="isNamespaceAware()Z" />
+ <method name="isValidating()Z" />
+ <method name="isXIncludeAware()Z" />
+ <method name="newInstance()Ljavax/xml/parsers/SAXParserFactory;" />
+ <method name="newInstance(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljavax/xml/parsers/SAXParserFactory;" since="9" />
+ <method name="newSAXParser()Ljavax/xml/parsers/SAXParser;" />
+ <method name="setFeature(Ljava/lang/String;Z)V" />
+ <method name="setNamespaceAware(Z)V" />
+ <method name="setSchema(Ljavax/xml/validation/Schema;)V" since="8" />
+ <method name="setValidating(Z)V" />
+ <method name="setXIncludeAware(Z)V" />
+ </class>
+ <class name="javax/xml/transform/ErrorListener" since="8">
+ <extends name="java/lang/Object" />
+ <method name="error(Ljavax/xml/transform/TransformerException;)V" />
+ <method name="fatalError(Ljavax/xml/transform/TransformerException;)V" />
+ <method name="warning(Ljavax/xml/transform/TransformerException;)V" />
+ </class>
+ <class name="javax/xml/transform/OutputKeys" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="CDATA_SECTION_ELEMENTS" />
+ <field name="DOCTYPE_PUBLIC" />
+ <field name="DOCTYPE_SYSTEM" />
+ <field name="ENCODING" />
+ <field name="INDENT" />
+ <field name="MEDIA_TYPE" />
+ <field name="METHOD" />
+ <field name="OMIT_XML_DECLARATION" />
+ <field name="STANDALONE" />
+ <field name="VERSION" />
+ </class>
+ <class name="javax/xml/transform/Result" since="8">
+ <extends name="java/lang/Object" />
+ <method name="getSystemId()Ljava/lang/String;" />
+ <method name="setSystemId(Ljava/lang/String;)V" />
+ <field name="PI_DISABLE_OUTPUT_ESCAPING" />
+ <field name="PI_ENABLE_OUTPUT_ESCAPING" />
+ </class>
+ <class name="javax/xml/transform/Source" since="8">
+ <extends name="java/lang/Object" />
+ <method name="getSystemId()Ljava/lang/String;" />
+ <method name="setSystemId(Ljava/lang/String;)V" />
+ </class>
+ <class name="javax/xml/transform/SourceLocator" since="8">
+ <extends name="java/lang/Object" />
+ <method name="getColumnNumber()I" />
+ <method name="getLineNumber()I" />
+ <method name="getPublicId()Ljava/lang/String;" />
+ <method name="getSystemId()Ljava/lang/String;" />
+ </class>
+ <class name="javax/xml/transform/Templates" since="8">
+ <extends name="java/lang/Object" />
+ <method name="getOutputProperties()Ljava/util/Properties;" />
+ <method name="newTransformer()Ljavax/xml/transform/Transformer;" />
+ </class>
+ <class name="javax/xml/transform/Transformer" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="clearParameters()V" />
+ <method name="getErrorListener()Ljavax/xml/transform/ErrorListener;" />
+ <method name="getOutputProperties()Ljava/util/Properties;" />
+ <method name="getOutputProperty(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getParameter(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="getURIResolver()Ljavax/xml/transform/URIResolver;" />
+ <method name="reset()V" />
+ <method name="setErrorListener(Ljavax/xml/transform/ErrorListener;)V" />
+ <method name="setOutputProperties(Ljava/util/Properties;)V" />
+ <method name="setOutputProperty(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="setParameter(Ljava/lang/String;Ljava/lang/Object;)V" />
+ <method name="setURIResolver(Ljavax/xml/transform/URIResolver;)V" />
+ <method name="transform(Ljavax/xml/transform/Source;Ljavax/xml/transform/Result;)V" />
+ </class>
+ <class name="javax/xml/transform/TransformerConfigurationException" since="8">
+ <extends name="javax/xml/transform/TransformerException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljavax/xml/transform/SourceLocator;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljavax/xml/transform/SourceLocator;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="javax/xml/transform/TransformerException" since="8">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljavax/xml/transform/SourceLocator;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljavax/xml/transform/SourceLocator;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ <method name="getException()Ljava/lang/Throwable;" />
+ <method name="getLocationAsString()Ljava/lang/String;" />
+ <method name="getLocator()Ljavax/xml/transform/SourceLocator;" />
+ <method name="getMessageAndLocation()Ljava/lang/String;" />
+ <method name="setLocator(Ljavax/xml/transform/SourceLocator;)V" />
+ </class>
+ <class name="javax/xml/transform/TransformerFactory" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getAssociatedStylesheet(Ljavax/xml/transform/Source;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljavax/xml/transform/Source;" />
+ <method name="getAttribute(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="getErrorListener()Ljavax/xml/transform/ErrorListener;" />
+ <method name="getFeature(Ljava/lang/String;)Z" />
+ <method name="getURIResolver()Ljavax/xml/transform/URIResolver;" />
+ <method name="newInstance()Ljavax/xml/transform/TransformerFactory;" />
+ <method name="newInstance(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljavax/xml/transform/TransformerFactory;" since="9" />
+ <method name="newTemplates(Ljavax/xml/transform/Source;)Ljavax/xml/transform/Templates;" />
+ <method name="newTransformer()Ljavax/xml/transform/Transformer;" />
+ <method name="newTransformer(Ljavax/xml/transform/Source;)Ljavax/xml/transform/Transformer;" />
+ <method name="setAttribute(Ljava/lang/String;Ljava/lang/Object;)V" />
+ <method name="setErrorListener(Ljavax/xml/transform/ErrorListener;)V" />
+ <method name="setFeature(Ljava/lang/String;Z)V" />
+ <method name="setURIResolver(Ljavax/xml/transform/URIResolver;)V" />
+ </class>
+ <class name="javax/xml/transform/TransformerFactoryConfigurationError" since="8">
+ <extends name="java/lang/Error" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/Exception;)V" />
+ <method name="&lt;init>(Ljava/lang/Exception;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getException()Ljava/lang/Exception;" />
+ </class>
+ <class name="javax/xml/transform/URIResolver" since="8">
+ <extends name="java/lang/Object" />
+ <method name="resolve(Ljava/lang/String;Ljava/lang/String;)Ljavax/xml/transform/Source;" />
+ </class>
+ <class name="javax/xml/transform/dom/DOMLocator" since="8">
+ <extends name="java/lang/Object" />
+ <implements name="javax/xml/transform/SourceLocator" />
+ <method name="getOriginatingNode()Lorg/w3c/dom/Node;" />
+ </class>
+ <class name="javax/xml/transform/dom/DOMResult" since="8">
+ <extends name="java/lang/Object" />
+ <implements name="javax/xml/transform/Result" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Lorg/w3c/dom/Node;)V" />
+ <method name="&lt;init>(Lorg/w3c/dom/Node;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Lorg/w3c/dom/Node;Lorg/w3c/dom/Node;)V" />
+ <method name="&lt;init>(Lorg/w3c/dom/Node;Lorg/w3c/dom/Node;Ljava/lang/String;)V" />
+ <method name="getNextSibling()Lorg/w3c/dom/Node;" />
+ <method name="getNode()Lorg/w3c/dom/Node;" />
+ <method name="setNextSibling(Lorg/w3c/dom/Node;)V" />
+ <method name="setNode(Lorg/w3c/dom/Node;)V" />
+ <field name="FEATURE" />
+ </class>
+ <class name="javax/xml/transform/dom/DOMSource" since="8">
+ <extends name="java/lang/Object" />
+ <implements name="javax/xml/transform/Source" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Lorg/w3c/dom/Node;)V" />
+ <method name="&lt;init>(Lorg/w3c/dom/Node;Ljava/lang/String;)V" />
+ <method name="getNode()Lorg/w3c/dom/Node;" />
+ <method name="setNode(Lorg/w3c/dom/Node;)V" />
+ <field name="FEATURE" />
+ </class>
+ <class name="javax/xml/transform/sax/SAXResult" since="8">
+ <extends name="java/lang/Object" />
+ <implements name="javax/xml/transform/Result" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Lorg/xml/sax/ContentHandler;)V" />
+ <method name="getHandler()Lorg/xml/sax/ContentHandler;" />
+ <method name="getLexicalHandler()Lorg/xml/sax/ext/LexicalHandler;" />
+ <method name="setHandler(Lorg/xml/sax/ContentHandler;)V" />
+ <method name="setLexicalHandler(Lorg/xml/sax/ext/LexicalHandler;)V" />
+ <field name="FEATURE" />
+ </class>
+ <class name="javax/xml/transform/sax/SAXSource" since="8">
+ <extends name="java/lang/Object" />
+ <implements name="javax/xml/transform/Source" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Lorg/xml/sax/InputSource;)V" />
+ <method name="&lt;init>(Lorg/xml/sax/XMLReader;Lorg/xml/sax/InputSource;)V" />
+ <method name="getInputSource()Lorg/xml/sax/InputSource;" />
+ <method name="getXMLReader()Lorg/xml/sax/XMLReader;" />
+ <method name="setInputSource(Lorg/xml/sax/InputSource;)V" />
+ <method name="setXMLReader(Lorg/xml/sax/XMLReader;)V" />
+ <method name="sourceToInputSource(Ljavax/xml/transform/Source;)Lorg/xml/sax/InputSource;" />
+ <field name="FEATURE" />
+ </class>
+ <class name="javax/xml/transform/sax/SAXTransformerFactory" since="8">
+ <extends name="javax/xml/transform/TransformerFactory" />
+ <method name="&lt;init>()V" />
+ <method name="newTemplatesHandler()Ljavax/xml/transform/sax/TemplatesHandler;" />
+ <method name="newTransformerHandler()Ljavax/xml/transform/sax/TransformerHandler;" />
+ <method name="newTransformerHandler(Ljavax/xml/transform/Source;)Ljavax/xml/transform/sax/TransformerHandler;" />
+ <method name="newTransformerHandler(Ljavax/xml/transform/Templates;)Ljavax/xml/transform/sax/TransformerHandler;" />
+ <method name="newXMLFilter(Ljavax/xml/transform/Source;)Lorg/xml/sax/XMLFilter;" />
+ <method name="newXMLFilter(Ljavax/xml/transform/Templates;)Lorg/xml/sax/XMLFilter;" />
+ <field name="FEATURE" />
+ <field name="FEATURE_XMLFILTER" />
+ </class>
+ <class name="javax/xml/transform/sax/TemplatesHandler" since="8">
+ <extends name="java/lang/Object" />
+ <implements name="org/xml/sax/ContentHandler" />
+ <method name="getSystemId()Ljava/lang/String;" />
+ <method name="getTemplates()Ljavax/xml/transform/Templates;" />
+ <method name="setSystemId(Ljava/lang/String;)V" />
+ </class>
+ <class name="javax/xml/transform/sax/TransformerHandler" since="8">
+ <extends name="java/lang/Object" />
+ <implements name="org/xml/sax/ContentHandler" />
+ <implements name="org/xml/sax/DTDHandler" />
+ <implements name="org/xml/sax/ext/LexicalHandler" />
+ <method name="getSystemId()Ljava/lang/String;" />
+ <method name="getTransformer()Ljavax/xml/transform/Transformer;" />
+ <method name="setResult(Ljavax/xml/transform/Result;)V" />
+ <method name="setSystemId(Ljava/lang/String;)V" />
+ </class>
+ <class name="javax/xml/transform/stream/StreamResult" since="8">
+ <extends name="java/lang/Object" />
+ <implements name="javax/xml/transform/Result" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/io/File;)V" />
+ <method name="&lt;init>(Ljava/io/OutputStream;)V" />
+ <method name="&lt;init>(Ljava/io/Writer;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getOutputStream()Ljava/io/OutputStream;" />
+ <method name="getWriter()Ljava/io/Writer;" />
+ <method name="setOutputStream(Ljava/io/OutputStream;)V" />
+ <method name="setSystemId(Ljava/io/File;)V" />
+ <method name="setWriter(Ljava/io/Writer;)V" />
+ <field name="FEATURE" />
+ </class>
+ <class name="javax/xml/transform/stream/StreamSource" since="8">
+ <extends name="java/lang/Object" />
+ <implements name="javax/xml/transform/Source" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/io/File;)V" />
+ <method name="&lt;init>(Ljava/io/InputStream;)V" />
+ <method name="&lt;init>(Ljava/io/InputStream;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/io/Reader;)V" />
+ <method name="&lt;init>(Ljava/io/Reader;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getInputStream()Ljava/io/InputStream;" />
+ <method name="getPublicId()Ljava/lang/String;" />
+ <method name="getReader()Ljava/io/Reader;" />
+ <method name="setInputStream(Ljava/io/InputStream;)V" />
+ <method name="setPublicId(Ljava/lang/String;)V" />
+ <method name="setReader(Ljava/io/Reader;)V" />
+ <method name="setSystemId(Ljava/io/File;)V" />
+ <field name="FEATURE" />
+ </class>
+ <class name="javax/xml/validation/Schema" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="newValidator()Ljavax/xml/validation/Validator;" />
+ <method name="newValidatorHandler()Ljavax/xml/validation/ValidatorHandler;" />
+ </class>
+ <class name="javax/xml/validation/SchemaFactory" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getErrorHandler()Lorg/xml/sax/ErrorHandler;" />
+ <method name="getFeature(Ljava/lang/String;)Z" />
+ <method name="getProperty(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="getResourceResolver()Lorg/w3c/dom/ls/LSResourceResolver;" />
+ <method name="isSchemaLanguageSupported(Ljava/lang/String;)Z" />
+ <method name="newInstance(Ljava/lang/String;)Ljavax/xml/validation/SchemaFactory;" />
+ <method name="newInstance(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)Ljavax/xml/validation/SchemaFactory;" since="9" />
+ <method name="newSchema()Ljavax/xml/validation/Schema;" />
+ <method name="newSchema(Ljava/io/File;)Ljavax/xml/validation/Schema;" />
+ <method name="newSchema(Ljava/net/URL;)Ljavax/xml/validation/Schema;" />
+ <method name="newSchema(Ljavax/xml/transform/Source;)Ljavax/xml/validation/Schema;" />
+ <method name="newSchema([Ljavax/xml/transform/Source;)Ljavax/xml/validation/Schema;" />
+ <method name="setErrorHandler(Lorg/xml/sax/ErrorHandler;)V" />
+ <method name="setFeature(Ljava/lang/String;Z)V" />
+ <method name="setProperty(Ljava/lang/String;Ljava/lang/Object;)V" />
+ <method name="setResourceResolver(Lorg/w3c/dom/ls/LSResourceResolver;)V" />
+ </class>
+ <class name="javax/xml/validation/SchemaFactoryLoader" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="newFactory(Ljava/lang/String;)Ljavax/xml/validation/SchemaFactory;" />
+ </class>
+ <class name="javax/xml/validation/TypeInfoProvider" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getAttributeTypeInfo(I)Lorg/w3c/dom/TypeInfo;" />
+ <method name="getElementTypeInfo()Lorg/w3c/dom/TypeInfo;" />
+ <method name="isIdAttribute(I)Z" />
+ <method name="isSpecified(I)Z" />
+ </class>
+ <class name="javax/xml/validation/Validator" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getErrorHandler()Lorg/xml/sax/ErrorHandler;" />
+ <method name="getFeature(Ljava/lang/String;)Z" />
+ <method name="getProperty(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="getResourceResolver()Lorg/w3c/dom/ls/LSResourceResolver;" />
+ <method name="reset()V" />
+ <method name="setErrorHandler(Lorg/xml/sax/ErrorHandler;)V" />
+ <method name="setFeature(Ljava/lang/String;Z)V" />
+ <method name="setProperty(Ljava/lang/String;Ljava/lang/Object;)V" />
+ <method name="setResourceResolver(Lorg/w3c/dom/ls/LSResourceResolver;)V" />
+ <method name="validate(Ljavax/xml/transform/Source;)V" />
+ <method name="validate(Ljavax/xml/transform/Source;Ljavax/xml/transform/Result;)V" />
+ </class>
+ <class name="javax/xml/validation/ValidatorHandler" since="8">
+ <extends name="java/lang/Object" />
+ <implements name="org/xml/sax/ContentHandler" />
+ <method name="&lt;init>()V" />
+ <method name="getContentHandler()Lorg/xml/sax/ContentHandler;" />
+ <method name="getErrorHandler()Lorg/xml/sax/ErrorHandler;" />
+ <method name="getFeature(Ljava/lang/String;)Z" />
+ <method name="getProperty(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="getResourceResolver()Lorg/w3c/dom/ls/LSResourceResolver;" />
+ <method name="getTypeInfoProvider()Ljavax/xml/validation/TypeInfoProvider;" />
+ <method name="setContentHandler(Lorg/xml/sax/ContentHandler;)V" />
+ <method name="setErrorHandler(Lorg/xml/sax/ErrorHandler;)V" />
+ <method name="setFeature(Ljava/lang/String;Z)V" />
+ <method name="setProperty(Ljava/lang/String;Ljava/lang/Object;)V" />
+ <method name="setResourceResolver(Lorg/w3c/dom/ls/LSResourceResolver;)V" />
+ </class>
+ <class name="javax/xml/xpath/XPath" since="8">
+ <extends name="java/lang/Object" />
+ <method name="compile(Ljava/lang/String;)Ljavax/xml/xpath/XPathExpression;" />
+ <method name="evaluate(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String;" />
+ <method name="evaluate(Ljava/lang/String;Ljava/lang/Object;Ljavax/xml/namespace/QName;)Ljava/lang/Object;" />
+ <method name="evaluate(Ljava/lang/String;Lorg/xml/sax/InputSource;)Ljava/lang/String;" />
+ <method name="evaluate(Ljava/lang/String;Lorg/xml/sax/InputSource;Ljavax/xml/namespace/QName;)Ljava/lang/Object;" />
+ <method name="getNamespaceContext()Ljavax/xml/namespace/NamespaceContext;" />
+ <method name="getXPathFunctionResolver()Ljavax/xml/xpath/XPathFunctionResolver;" />
+ <method name="getXPathVariableResolver()Ljavax/xml/xpath/XPathVariableResolver;" />
+ <method name="reset()V" />
+ <method name="setNamespaceContext(Ljavax/xml/namespace/NamespaceContext;)V" />
+ <method name="setXPathFunctionResolver(Ljavax/xml/xpath/XPathFunctionResolver;)V" />
+ <method name="setXPathVariableResolver(Ljavax/xml/xpath/XPathVariableResolver;)V" />
+ </class>
+ <class name="javax/xml/xpath/XPathConstants" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="BOOLEAN" />
+ <field name="DOM_OBJECT_MODEL" />
+ <field name="NODE" />
+ <field name="NODESET" />
+ <field name="NUMBER" />
+ <field name="STRING" />
+ </class>
+ <class name="javax/xml/xpath/XPathException" since="8">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="javax/xml/xpath/XPathExpression" since="8">
+ <extends name="java/lang/Object" />
+ <method name="evaluate(Ljava/lang/Object;)Ljava/lang/String;" />
+ <method name="evaluate(Ljava/lang/Object;Ljavax/xml/namespace/QName;)Ljava/lang/Object;" />
+ <method name="evaluate(Lorg/xml/sax/InputSource;)Ljava/lang/String;" />
+ <method name="evaluate(Lorg/xml/sax/InputSource;Ljavax/xml/namespace/QName;)Ljava/lang/Object;" />
+ </class>
+ <class name="javax/xml/xpath/XPathExpressionException" since="8">
+ <extends name="javax/xml/xpath/XPathException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="javax/xml/xpath/XPathFactory" since="8">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getFeature(Ljava/lang/String;)Z" />
+ <method name="isObjectModelSupported(Ljava/lang/String;)Z" />
+ <method name="newInstance()Ljavax/xml/xpath/XPathFactory;" />
+ <method name="newInstance(Ljava/lang/String;)Ljavax/xml/xpath/XPathFactory;" />
+ <method name="newInstance(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)Ljavax/xml/xpath/XPathFactory;" />
+ <method name="newXPath()Ljavax/xml/xpath/XPath;" />
+ <method name="setFeature(Ljava/lang/String;Z)V" />
+ <method name="setXPathFunctionResolver(Ljavax/xml/xpath/XPathFunctionResolver;)V" />
+ <method name="setXPathVariableResolver(Ljavax/xml/xpath/XPathVariableResolver;)V" />
+ <field name="DEFAULT_OBJECT_MODEL_URI" />
+ <field name="DEFAULT_PROPERTY_NAME" />
+ </class>
+ <class name="javax/xml/xpath/XPathFactoryConfigurationException" since="8">
+ <extends name="javax/xml/xpath/XPathException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="javax/xml/xpath/XPathFunction" since="8">
+ <extends name="java/lang/Object" />
+ <method name="evaluate(Ljava/util/List;)Ljava/lang/Object;" />
+ </class>
+ <class name="javax/xml/xpath/XPathFunctionException" since="8">
+ <extends name="javax/xml/xpath/XPathExpressionException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="javax/xml/xpath/XPathFunctionResolver" since="8">
+ <extends name="java/lang/Object" />
+ <method name="resolveFunction(Ljavax/xml/namespace/QName;I)Ljavax/xml/xpath/XPathFunction;" />
+ </class>
+ <class name="javax/xml/xpath/XPathVariableResolver" since="8">
+ <extends name="java/lang/Object" />
+ <method name="resolveVariable(Ljavax/xml/namespace/QName;)Ljava/lang/Object;" />
+ </class>
+ <class name="junit/framework/Assert" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="assertEquals(BB)V" />
+ <method name="assertEquals(CC)V" />
+ <method name="assertEquals(DDD)V" />
+ <method name="assertEquals(FFF)V" />
+ <method name="assertEquals(II)V" />
+ <method name="assertEquals(JJ)V" />
+ <method name="assertEquals(Ljava/lang/Object;Ljava/lang/Object;)V" />
+ <method name="assertEquals(Ljava/lang/String;BB)V" />
+ <method name="assertEquals(Ljava/lang/String;CC)V" />
+ <method name="assertEquals(Ljava/lang/String;DDD)V" />
+ <method name="assertEquals(Ljava/lang/String;FFF)V" />
+ <method name="assertEquals(Ljava/lang/String;II)V" />
+ <method name="assertEquals(Ljava/lang/String;JJ)V" />
+ <method name="assertEquals(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V" />
+ <method name="assertEquals(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="assertEquals(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="assertEquals(Ljava/lang/String;SS)V" />
+ <method name="assertEquals(Ljava/lang/String;ZZ)V" />
+ <method name="assertEquals(SS)V" />
+ <method name="assertEquals(ZZ)V" />
+ <method name="assertFalse(Ljava/lang/String;Z)V" />
+ <method name="assertFalse(Z)V" />
+ <method name="assertNotNull(Ljava/lang/Object;)V" />
+ <method name="assertNotNull(Ljava/lang/String;Ljava/lang/Object;)V" />
+ <method name="assertNotSame(Ljava/lang/Object;Ljava/lang/Object;)V" />
+ <method name="assertNotSame(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V" />
+ <method name="assertNull(Ljava/lang/Object;)V" />
+ <method name="assertNull(Ljava/lang/String;Ljava/lang/Object;)V" />
+ <method name="assertSame(Ljava/lang/Object;Ljava/lang/Object;)V" />
+ <method name="assertSame(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V" />
+ <method name="assertTrue(Ljava/lang/String;Z)V" />
+ <method name="assertTrue(Z)V" />
+ <method name="fail()V" />
+ <method name="fail(Ljava/lang/String;)V" />
+ <method name="failNotEquals(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V" since="16" />
+ <method name="failNotSame(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V" since="16" />
+ <method name="failSame(Ljava/lang/String;)V" since="16" />
+ <method name="format(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/String;" since="16" />
+ </class>
+ <class name="junit/framework/AssertionFailedError" since="1">
+ <extends name="java/lang/AssertionError" since="16" />
+ <extends name="java/lang/Error" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="junit/framework/ComparisonFailure" since="1">
+ <extends name="junit/framework/AssertionFailedError" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="getActual()Ljava/lang/String;" since="16" />
+ <method name="getExpected()Ljava/lang/String;" since="16" />
+ </class>
+ <class name="junit/framework/Protectable" since="1">
+ <extends name="java/lang/Object" />
+ <method name="protect()V" />
+ </class>
+ <class name="junit/framework/Test" since="1">
+ <extends name="java/lang/Object" />
+ <method name="countTestCases()I" />
+ <method name="run(Ljunit/framework/TestResult;)V" />
+ </class>
+ <class name="junit/framework/TestCase" since="1">
+ <extends name="junit/framework/Assert" />
+ <implements name="junit/framework/Test" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="createResult()Ljunit/framework/TestResult;" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="run()Ljunit/framework/TestResult;" />
+ <method name="runBare()V" />
+ <method name="runTest()V" />
+ <method name="setName(Ljava/lang/String;)V" />
+ <method name="setUp()V" />
+ <method name="tearDown()V" />
+ </class>
+ <class name="junit/framework/TestFailure" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljunit/framework/Test;Ljava/lang/Throwable;)V" />
+ <method name="exceptionMessage()Ljava/lang/String;" />
+ <method name="failedTest()Ljunit/framework/Test;" />
+ <method name="isFailure()Z" />
+ <method name="thrownException()Ljava/lang/Throwable;" />
+ <method name="trace()Ljava/lang/String;" />
+ <field name="fFailedTest" />
+ <field name="fThrownException" />
+ </class>
+ <class name="junit/framework/TestListener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="addError(Ljunit/framework/Test;Ljava/lang/Throwable;)V" />
+ <method name="addFailure(Ljunit/framework/Test;Ljunit/framework/AssertionFailedError;)V" />
+ <method name="endTest(Ljunit/framework/Test;)V" />
+ <method name="startTest(Ljunit/framework/Test;)V" />
+ </class>
+ <class name="junit/framework/TestResult" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="addError(Ljunit/framework/Test;Ljava/lang/Throwable;)V" />
+ <method name="addFailure(Ljunit/framework/Test;Ljunit/framework/AssertionFailedError;)V" />
+ <method name="addListener(Ljunit/framework/TestListener;)V" />
+ <method name="endTest(Ljunit/framework/Test;)V" />
+ <method name="errorCount()I" />
+ <method name="errors()Ljava/util/Enumeration;" />
+ <method name="failureCount()I" />
+ <method name="failures()Ljava/util/Enumeration;" />
+ <method name="removeListener(Ljunit/framework/TestListener;)V" />
+ <method name="run(Ljunit/framework/TestCase;)V" />
+ <method name="runCount()I" />
+ <method name="runProtected(Ljunit/framework/Test;Ljunit/framework/Protectable;)V" />
+ <method name="shouldStop()Z" />
+ <method name="startTest(Ljunit/framework/Test;)V" />
+ <method name="stop()V" />
+ <method name="wasSuccessful()Z" />
+ <field name="fErrors" />
+ <field name="fFailures" />
+ <field name="fListeners" />
+ <field name="fRunTests" />
+ </class>
+ <class name="junit/framework/TestSuite" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="junit/framework/Test" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/Class;)V" />
+ <method name="&lt;init>(Ljava/lang/Class;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>([Ljava/lang/Class;)V" since="16" />
+ <method name="&lt;init>([Ljava/lang/Class;Ljava/lang/String;)V" since="16" />
+ <method name="addTest(Ljunit/framework/Test;)V" />
+ <method name="addTestSuite(Ljava/lang/Class;)V" />
+ <method name="createTest(Ljava/lang/Class;Ljava/lang/String;)Ljunit/framework/Test;" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getTestConstructor(Ljava/lang/Class;)Ljava/lang/reflect/Constructor;" />
+ <method name="runTest(Ljunit/framework/Test;Ljunit/framework/TestResult;)V" />
+ <method name="setName(Ljava/lang/String;)V" />
+ <method name="testAt(I)Ljunit/framework/Test;" />
+ <method name="testCount()I" />
+ <method name="tests()Ljava/util/Enumeration;" />
+ <method name="warning(Ljava/lang/String;)Ljunit/framework/Test;" since="16" />
+ </class>
+ <class name="junit/runner/BaseTestRunner" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="junit/framework/TestListener" />
+ <method name="&lt;init>()V" />
+ <method name="clearStatus()V" />
+ <method name="elapsedTimeAsString(J)Ljava/lang/String;" />
+ <method name="extractClassName(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getFilteredTrace(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getFilteredTrace(Ljava/lang/Throwable;)Ljava/lang/String;" />
+ <method name="getLoader()Ljunit/runner/TestSuiteLoader;" />
+ <method name="getPreference(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getPreference(Ljava/lang/String;I)I" />
+ <method name="getPreferences()Ljava/util/Properties;" />
+ <method name="getTest(Ljava/lang/String;)Ljunit/framework/Test;" />
+ <method name="inVAJava()Z" />
+ <method name="loadSuiteClass(Ljava/lang/String;)Ljava/lang/Class;" />
+ <method name="processArguments([Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="runFailed(Ljava/lang/String;)V" />
+ <method name="savePreferences()V" />
+ <method name="setLoading(Z)V" />
+ <method name="setPreference(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="setPreferences(Ljava/util/Properties;)V" />
+ <method name="showStackRaw()Z" />
+ <method name="testEnded(Ljava/lang/String;)V" />
+ <method name="testFailed(ILjunit/framework/Test;Ljava/lang/Throwable;)V" />
+ <method name="testStarted(Ljava/lang/String;)V" />
+ <method name="truncate(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="useReloadingTestSuiteLoader()Z" />
+ <field name="SUITE_METHODNAME" />
+ </class>
+ <class name="junit/runner/TestSuiteLoader" since="1">
+ <extends name="java/lang/Object" />
+ <method name="load(Ljava/lang/String;)Ljava/lang/Class;" />
+ <method name="reload(Ljava/lang/Class;)Ljava/lang/Class;" />
+ </class>
+ <class name="junit/runner/Version" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="id()Ljava/lang/String;" />
+ </class>
+ <class name="org/apache/commons/logging/Log" since="1">
+ <extends name="java/lang/Object" />
+ <method name="debug(Ljava/lang/Object;)V" />
+ <method name="debug(Ljava/lang/Object;Ljava/lang/Throwable;)V" />
+ <method name="error(Ljava/lang/Object;)V" />
+ <method name="error(Ljava/lang/Object;Ljava/lang/Throwable;)V" />
+ <method name="fatal(Ljava/lang/Object;)V" />
+ <method name="fatal(Ljava/lang/Object;Ljava/lang/Throwable;)V" />
+ <method name="info(Ljava/lang/Object;)V" />
+ <method name="info(Ljava/lang/Object;Ljava/lang/Throwable;)V" />
+ <method name="isDebugEnabled()Z" />
+ <method name="isErrorEnabled()Z" />
+ <method name="isFatalEnabled()Z" />
+ <method name="isInfoEnabled()Z" />
+ <method name="isTraceEnabled()Z" />
+ <method name="isWarnEnabled()Z" />
+ <method name="trace(Ljava/lang/Object;)V" />
+ <method name="trace(Ljava/lang/Object;Ljava/lang/Throwable;)V" />
+ <method name="warn(Ljava/lang/Object;)V" />
+ <method name="warn(Ljava/lang/Object;Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="org/apache/http/ConnectionClosedException" since="1">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="org/apache/http/ConnectionReuseStrategy" since="1">
+ <extends name="java/lang/Object" />
+ <method name="keepAlive(Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)Z" />
+ </class>
+ <class name="org/apache/http/FormattedHeader" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/Header" />
+ <method name="getBuffer()Lorg/apache/http/util/CharArrayBuffer;" />
+ <method name="getValuePos()I" />
+ </class>
+ <class name="org/apache/http/Header" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getElements()[Lorg/apache/http/HeaderElement;" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getValue()Ljava/lang/String;" />
+ </class>
+ <class name="org/apache/http/HeaderElement" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getParameter(I)Lorg/apache/http/NameValuePair;" />
+ <method name="getParameterByName(Ljava/lang/String;)Lorg/apache/http/NameValuePair;" />
+ <method name="getParameterCount()I" />
+ <method name="getParameters()[Lorg/apache/http/NameValuePair;" />
+ <method name="getValue()Ljava/lang/String;" />
+ </class>
+ <class name="org/apache/http/HeaderElementIterator" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/Iterator" />
+ <method name="nextElement()Lorg/apache/http/HeaderElement;" />
+ </class>
+ <class name="org/apache/http/HeaderIterator" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/Iterator" />
+ <method name="nextHeader()Lorg/apache/http/Header;" />
+ </class>
+ <class name="org/apache/http/HttpClientConnection" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpConnection" />
+ <method name="flush()V" />
+ <method name="isResponseAvailable(I)Z" />
+ <method name="receiveResponseEntity(Lorg/apache/http/HttpResponse;)V" />
+ <method name="receiveResponseHeader()Lorg/apache/http/HttpResponse;" />
+ <method name="sendRequestEntity(Lorg/apache/http/HttpEntityEnclosingRequest;)V" />
+ <method name="sendRequestHeader(Lorg/apache/http/HttpRequest;)V" />
+ </class>
+ <class name="org/apache/http/HttpConnection" since="1">
+ <extends name="java/lang/Object" />
+ <method name="close()V" />
+ <method name="getMetrics()Lorg/apache/http/HttpConnectionMetrics;" />
+ <method name="getSocketTimeout()I" />
+ <method name="isOpen()Z" />
+ <method name="isStale()Z" />
+ <method name="setSocketTimeout(I)V" />
+ <method name="shutdown()V" />
+ </class>
+ <class name="org/apache/http/HttpConnectionMetrics" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getMetric(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="getReceivedBytesCount()J" />
+ <method name="getRequestCount()J" />
+ <method name="getResponseCount()J" />
+ <method name="getSentBytesCount()J" />
+ <method name="reset()V" />
+ </class>
+ <class name="org/apache/http/HttpEntity" since="1">
+ <extends name="java/lang/Object" />
+ <method name="consumeContent()V" />
+ <method name="getContent()Ljava/io/InputStream;" />
+ <method name="getContentEncoding()Lorg/apache/http/Header;" />
+ <method name="getContentLength()J" />
+ <method name="getContentType()Lorg/apache/http/Header;" />
+ <method name="isChunked()Z" />
+ <method name="isRepeatable()Z" />
+ <method name="isStreaming()Z" />
+ <method name="writeTo(Ljava/io/OutputStream;)V" />
+ </class>
+ <class name="org/apache/http/HttpEntityEnclosingRequest" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpRequest" />
+ <method name="expectContinue()Z" />
+ <method name="getEntity()Lorg/apache/http/HttpEntity;" />
+ <method name="setEntity(Lorg/apache/http/HttpEntity;)V" />
+ </class>
+ <class name="org/apache/http/HttpException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="org/apache/http/HttpHost" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;ILjava/lang/String;)V" />
+ <method name="&lt;init>(Lorg/apache/http/HttpHost;)V" />
+ <method name="getHostName()Ljava/lang/String;" />
+ <method name="getPort()I" />
+ <method name="getSchemeName()Ljava/lang/String;" />
+ <method name="toHostString()Ljava/lang/String;" />
+ <method name="toURI()Ljava/lang/String;" />
+ <field name="DEFAULT_SCHEME_NAME" />
+ <field name="hostname" />
+ <field name="lcHostname" />
+ <field name="port" />
+ <field name="schemeName" />
+ </class>
+ <class name="org/apache/http/HttpInetConnection" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpConnection" />
+ <method name="getLocalAddress()Ljava/net/InetAddress;" />
+ <method name="getLocalPort()I" />
+ <method name="getRemoteAddress()Ljava/net/InetAddress;" />
+ <method name="getRemotePort()I" />
+ </class>
+ <class name="org/apache/http/HttpMessage" since="1">
+ <extends name="java/lang/Object" />
+ <method name="addHeader(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="addHeader(Lorg/apache/http/Header;)V" />
+ <method name="containsHeader(Ljava/lang/String;)Z" />
+ <method name="getAllHeaders()[Lorg/apache/http/Header;" />
+ <method name="getFirstHeader(Ljava/lang/String;)Lorg/apache/http/Header;" />
+ <method name="getHeaders(Ljava/lang/String;)[Lorg/apache/http/Header;" />
+ <method name="getLastHeader(Ljava/lang/String;)Lorg/apache/http/Header;" />
+ <method name="getParams()Lorg/apache/http/params/HttpParams;" />
+ <method name="getProtocolVersion()Lorg/apache/http/ProtocolVersion;" />
+ <method name="headerIterator()Lorg/apache/http/HeaderIterator;" />
+ <method name="headerIterator(Ljava/lang/String;)Lorg/apache/http/HeaderIterator;" />
+ <method name="removeHeader(Lorg/apache/http/Header;)V" />
+ <method name="removeHeaders(Ljava/lang/String;)V" />
+ <method name="setHeader(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="setHeader(Lorg/apache/http/Header;)V" />
+ <method name="setHeaders([Lorg/apache/http/Header;)V" />
+ <method name="setParams(Lorg/apache/http/params/HttpParams;)V" />
+ </class>
+ <class name="org/apache/http/HttpRequest" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpMessage" />
+ <method name="getRequestLine()Lorg/apache/http/RequestLine;" />
+ </class>
+ <class name="org/apache/http/HttpRequestFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="newHttpRequest(Ljava/lang/String;Ljava/lang/String;)Lorg/apache/http/HttpRequest;" />
+ <method name="newHttpRequest(Lorg/apache/http/RequestLine;)Lorg/apache/http/HttpRequest;" />
+ </class>
+ <class name="org/apache/http/HttpRequestInterceptor" since="1">
+ <extends name="java/lang/Object" />
+ <method name="process(Lorg/apache/http/HttpRequest;Lorg/apache/http/protocol/HttpContext;)V" />
+ </class>
+ <class name="org/apache/http/HttpResponse" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpMessage" />
+ <method name="getEntity()Lorg/apache/http/HttpEntity;" />
+ <method name="getLocale()Ljava/util/Locale;" />
+ <method name="getStatusLine()Lorg/apache/http/StatusLine;" />
+ <method name="setEntity(Lorg/apache/http/HttpEntity;)V" />
+ <method name="setLocale(Ljava/util/Locale;)V" />
+ <method name="setReasonPhrase(Ljava/lang/String;)V" />
+ <method name="setStatusCode(I)V" />
+ <method name="setStatusLine(Lorg/apache/http/ProtocolVersion;I)V" />
+ <method name="setStatusLine(Lorg/apache/http/ProtocolVersion;ILjava/lang/String;)V" />
+ <method name="setStatusLine(Lorg/apache/http/StatusLine;)V" />
+ </class>
+ <class name="org/apache/http/HttpResponseFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="newHttpResponse(Lorg/apache/http/ProtocolVersion;ILorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpResponse;" />
+ <method name="newHttpResponse(Lorg/apache/http/StatusLine;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpResponse;" />
+ </class>
+ <class name="org/apache/http/HttpResponseInterceptor" since="1">
+ <extends name="java/lang/Object" />
+ <method name="process(Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)V" />
+ </class>
+ <class name="org/apache/http/HttpServerConnection" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpConnection" />
+ <method name="flush()V" />
+ <method name="receiveRequestEntity(Lorg/apache/http/HttpEntityEnclosingRequest;)V" />
+ <method name="receiveRequestHeader()Lorg/apache/http/HttpRequest;" />
+ <method name="sendResponseEntity(Lorg/apache/http/HttpResponse;)V" />
+ <method name="sendResponseHeader(Lorg/apache/http/HttpResponse;)V" />
+ </class>
+ <class name="org/apache/http/HttpStatus" since="1">
+ <extends name="java/lang/Object" />
+ <field name="SC_ACCEPTED" />
+ <field name="SC_BAD_GATEWAY" />
+ <field name="SC_BAD_REQUEST" />
+ <field name="SC_CONFLICT" />
+ <field name="SC_CONTINUE" />
+ <field name="SC_CREATED" />
+ <field name="SC_EXPECTATION_FAILED" />
+ <field name="SC_FAILED_DEPENDENCY" />
+ <field name="SC_FORBIDDEN" />
+ <field name="SC_GATEWAY_TIMEOUT" />
+ <field name="SC_GONE" />
+ <field name="SC_HTTP_VERSION_NOT_SUPPORTED" />
+ <field name="SC_INSUFFICIENT_SPACE_ON_RESOURCE" />
+ <field name="SC_INSUFFICIENT_STORAGE" />
+ <field name="SC_INTERNAL_SERVER_ERROR" />
+ <field name="SC_LENGTH_REQUIRED" />
+ <field name="SC_LOCKED" />
+ <field name="SC_METHOD_FAILURE" />
+ <field name="SC_METHOD_NOT_ALLOWED" />
+ <field name="SC_MOVED_PERMANENTLY" />
+ <field name="SC_MOVED_TEMPORARILY" />
+ <field name="SC_MULTIPLE_CHOICES" />
+ <field name="SC_MULTI_STATUS" />
+ <field name="SC_NON_AUTHORITATIVE_INFORMATION" />
+ <field name="SC_NOT_ACCEPTABLE" />
+ <field name="SC_NOT_FOUND" />
+ <field name="SC_NOT_IMPLEMENTED" />
+ <field name="SC_NOT_MODIFIED" />
+ <field name="SC_NO_CONTENT" />
+ <field name="SC_OK" />
+ <field name="SC_PARTIAL_CONTENT" />
+ <field name="SC_PAYMENT_REQUIRED" />
+ <field name="SC_PRECONDITION_FAILED" />
+ <field name="SC_PROCESSING" />
+ <field name="SC_PROXY_AUTHENTICATION_REQUIRED" />
+ <field name="SC_REQUESTED_RANGE_NOT_SATISFIABLE" />
+ <field name="SC_REQUEST_TIMEOUT" />
+ <field name="SC_REQUEST_TOO_LONG" />
+ <field name="SC_REQUEST_URI_TOO_LONG" />
+ <field name="SC_RESET_CONTENT" />
+ <field name="SC_SEE_OTHER" />
+ <field name="SC_SERVICE_UNAVAILABLE" />
+ <field name="SC_SWITCHING_PROTOCOLS" />
+ <field name="SC_TEMPORARY_REDIRECT" />
+ <field name="SC_UNAUTHORIZED" />
+ <field name="SC_UNPROCESSABLE_ENTITY" />
+ <field name="SC_UNSUPPORTED_MEDIA_TYPE" />
+ <field name="SC_USE_PROXY" />
+ </class>
+ <class name="org/apache/http/HttpVersion" since="1">
+ <extends name="org/apache/http/ProtocolVersion" />
+ <implements name="java/io/Serializable" />
+ <method name="&lt;init>(II)V" />
+ <field name="HTTP" />
+ <field name="HTTP_0_9" />
+ <field name="HTTP_1_0" />
+ <field name="HTTP_1_1" />
+ </class>
+ <class name="org/apache/http/MalformedChunkCodingException" since="1">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="org/apache/http/MethodNotSupportedException" since="1">
+ <extends name="org/apache/http/HttpException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="org/apache/http/NameValuePair" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getValue()Ljava/lang/String;" />
+ </class>
+ <class name="org/apache/http/NoHttpResponseException" since="1">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="org/apache/http/ParseException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="org/apache/http/ProtocolException" since="1">
+ <extends name="org/apache/http/HttpException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="org/apache/http/ProtocolVersion" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>(Ljava/lang/String;II)V" />
+ <method name="compareToVersion(Lorg/apache/http/ProtocolVersion;)I" />
+ <method name="forVersion(II)Lorg/apache/http/ProtocolVersion;" />
+ <method name="getMajor()I" />
+ <method name="getMinor()I" />
+ <method name="getProtocol()Ljava/lang/String;" />
+ <method name="greaterEquals(Lorg/apache/http/ProtocolVersion;)Z" />
+ <method name="isComparable(Lorg/apache/http/ProtocolVersion;)Z" />
+ <method name="lessEquals(Lorg/apache/http/ProtocolVersion;)Z" />
+ <field name="major" />
+ <field name="minor" />
+ <field name="protocol" />
+ </class>
+ <class name="org/apache/http/ReasonPhraseCatalog" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getReason(ILjava/util/Locale;)Ljava/lang/String;" />
+ </class>
+ <class name="org/apache/http/RequestLine" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getMethod()Ljava/lang/String;" />
+ <method name="getProtocolVersion()Lorg/apache/http/ProtocolVersion;" />
+ <method name="getUri()Ljava/lang/String;" />
+ </class>
+ <class name="org/apache/http/StatusLine" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getProtocolVersion()Lorg/apache/http/ProtocolVersion;" />
+ <method name="getReasonPhrase()Ljava/lang/String;" />
+ <method name="getStatusCode()I" />
+ </class>
+ <class name="org/apache/http/TokenIterator" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/util/Iterator" />
+ <method name="nextToken()Ljava/lang/String;" />
+ </class>
+ <class name="org/apache/http/UnsupportedHttpVersionException" since="1">
+ <extends name="org/apache/http/ProtocolException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="org/apache/http/auth/AUTH" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="PROXY_AUTH" />
+ <field name="PROXY_AUTH_RESP" />
+ <field name="WWW_AUTH" />
+ <field name="WWW_AUTH_RESP" />
+ </class>
+ <class name="org/apache/http/auth/AuthScheme" since="1">
+ <extends name="java/lang/Object" />
+ <method name="authenticate(Lorg/apache/http/auth/Credentials;Lorg/apache/http/HttpRequest;)Lorg/apache/http/Header;" />
+ <method name="getParameter(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getRealm()Ljava/lang/String;" />
+ <method name="getSchemeName()Ljava/lang/String;" />
+ <method name="isComplete()Z" />
+ <method name="isConnectionBased()Z" />
+ <method name="processChallenge(Lorg/apache/http/Header;)V" />
+ </class>
+ <class name="org/apache/http/auth/AuthSchemeFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="newInstance(Lorg/apache/http/params/HttpParams;)Lorg/apache/http/auth/AuthScheme;" />
+ </class>
+ <class name="org/apache/http/auth/AuthSchemeRegistry" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getAuthScheme(Ljava/lang/String;Lorg/apache/http/params/HttpParams;)Lorg/apache/http/auth/AuthScheme;" />
+ <method name="getSchemeNames()Ljava/util/List;" />
+ <method name="register(Ljava/lang/String;Lorg/apache/http/auth/AuthSchemeFactory;)V" />
+ <method name="setItems(Ljava/util/Map;)V" />
+ <method name="unregister(Ljava/lang/String;)V" />
+ </class>
+ <class name="org/apache/http/auth/AuthScope" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;I)V" />
+ <method name="&lt;init>(Ljava/lang/String;ILjava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Lorg/apache/http/auth/AuthScope;)V" />
+ <method name="getHost()Ljava/lang/String;" />
+ <method name="getPort()I" />
+ <method name="getRealm()Ljava/lang/String;" />
+ <method name="getScheme()Ljava/lang/String;" />
+ <method name="match(Lorg/apache/http/auth/AuthScope;)I" />
+ <field name="ANY" />
+ <field name="ANY_HOST" />
+ <field name="ANY_PORT" />
+ <field name="ANY_REALM" />
+ <field name="ANY_SCHEME" />
+ </class>
+ <class name="org/apache/http/auth/AuthState" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getAuthScheme()Lorg/apache/http/auth/AuthScheme;" />
+ <method name="getAuthScope()Lorg/apache/http/auth/AuthScope;" />
+ <method name="getCredentials()Lorg/apache/http/auth/Credentials;" />
+ <method name="invalidate()V" />
+ <method name="isValid()Z" />
+ <method name="setAuthScheme(Lorg/apache/http/auth/AuthScheme;)V" />
+ <method name="setAuthScope(Lorg/apache/http/auth/AuthScope;)V" />
+ <method name="setCredentials(Lorg/apache/http/auth/Credentials;)V" />
+ </class>
+ <class name="org/apache/http/auth/AuthenticationException" since="1">
+ <extends name="org/apache/http/ProtocolException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="org/apache/http/auth/BasicUserPrincipal" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/Principal" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="org/apache/http/auth/Credentials" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getPassword()Ljava/lang/String;" />
+ <method name="getUserPrincipal()Ljava/security/Principal;" />
+ </class>
+ <class name="org/apache/http/auth/InvalidCredentialsException" since="1">
+ <extends name="org/apache/http/auth/AuthenticationException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="org/apache/http/auth/MalformedChallengeException" since="1">
+ <extends name="org/apache/http/ProtocolException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="org/apache/http/auth/NTCredentials" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/auth/Credentials" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="getDomain()Ljava/lang/String;" />
+ <method name="getUserName()Ljava/lang/String;" />
+ <method name="getWorkstation()Ljava/lang/String;" />
+ </class>
+ <class name="org/apache/http/auth/NTUserPrincipal" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/security/Principal" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="getDomain()Ljava/lang/String;" />
+ <method name="getUsername()Ljava/lang/String;" />
+ </class>
+ <class name="org/apache/http/auth/UsernamePasswordCredentials" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/auth/Credentials" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="getUserName()Ljava/lang/String;" />
+ </class>
+ <class name="org/apache/http/auth/params/AuthPNames" since="1">
+ <extends name="java/lang/Object" />
+ <field name="CREDENTIAL_CHARSET" />
+ </class>
+ <class name="org/apache/http/auth/params/AuthParamBean" since="1">
+ <extends name="org/apache/http/params/HttpAbstractParamBean" />
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;)V" />
+ <method name="setCredentialCharset(Ljava/lang/String;)V" />
+ </class>
+ <class name="org/apache/http/auth/params/AuthParams" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getCredentialCharset(Lorg/apache/http/params/HttpParams;)Ljava/lang/String;" />
+ <method name="setCredentialCharset(Lorg/apache/http/params/HttpParams;Ljava/lang/String;)V" />
+ </class>
+ <class name="org/apache/http/client/AuthenticationHandler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getChallenges(Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)Ljava/util/Map;" />
+ <method name="isAuthenticationRequested(Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)Z" />
+ <method name="selectScheme(Ljava/util/Map;Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/auth/AuthScheme;" />
+ </class>
+ <class name="org/apache/http/client/CircularRedirectException" since="1">
+ <extends name="org/apache/http/client/RedirectException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="org/apache/http/client/ClientProtocolException" since="1">
+ <extends name="java/io/IOException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ <method name="&lt;init>(Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="org/apache/http/client/CookieStore" since="1">
+ <extends name="java/lang/Object" />
+ <method name="addCookie(Lorg/apache/http/cookie/Cookie;)V" />
+ <method name="clear()V" />
+ <method name="clearExpired(Ljava/util/Date;)Z" />
+ <method name="getCookies()Ljava/util/List;" />
+ </class>
+ <class name="org/apache/http/client/CredentialsProvider" since="1">
+ <extends name="java/lang/Object" />
+ <method name="clear()V" />
+ <method name="getCredentials(Lorg/apache/http/auth/AuthScope;)Lorg/apache/http/auth/Credentials;" />
+ <method name="setCredentials(Lorg/apache/http/auth/AuthScope;Lorg/apache/http/auth/Credentials;)V" />
+ </class>
+ <class name="org/apache/http/client/HttpClient" since="1">
+ <extends name="java/lang/Object" />
+ <method name="execute(Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;)Lorg/apache/http/HttpResponse;" />
+ <method name="execute(Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;Lorg/apache/http/client/ResponseHandler;)Ljava/lang/Object;" />
+ <method name="execute(Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;Lorg/apache/http/client/ResponseHandler;Lorg/apache/http/protocol/HttpContext;)Ljava/lang/Object;" />
+ <method name="execute(Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpResponse;" />
+ <method name="execute(Lorg/apache/http/client/methods/HttpUriRequest;)Lorg/apache/http/HttpResponse;" />
+ <method name="execute(Lorg/apache/http/client/methods/HttpUriRequest;Lorg/apache/http/client/ResponseHandler;)Ljava/lang/Object;" />
+ <method name="execute(Lorg/apache/http/client/methods/HttpUriRequest;Lorg/apache/http/client/ResponseHandler;Lorg/apache/http/protocol/HttpContext;)Ljava/lang/Object;" />
+ <method name="execute(Lorg/apache/http/client/methods/HttpUriRequest;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpResponse;" />
+ <method name="getConnectionManager()Lorg/apache/http/conn/ClientConnectionManager;" />
+ <method name="getParams()Lorg/apache/http/params/HttpParams;" />
+ </class>
+ <class name="org/apache/http/client/HttpRequestRetryHandler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="retryRequest(Ljava/io/IOException;ILorg/apache/http/protocol/HttpContext;)Z" />
+ </class>
+ <class name="org/apache/http/client/HttpResponseException" since="1">
+ <extends name="org/apache/http/client/ClientProtocolException" />
+ <method name="&lt;init>(ILjava/lang/String;)V" />
+ <method name="getStatusCode()I" />
+ </class>
+ <class name="org/apache/http/client/NonRepeatableRequestException" since="1">
+ <extends name="org/apache/http/ProtocolException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="org/apache/http/client/RedirectException" since="1">
+ <extends name="org/apache/http/ProtocolException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="org/apache/http/client/RedirectHandler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getLocationURI(Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)Ljava/net/URI;" />
+ <method name="isRedirectRequested(Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)Z" />
+ </class>
+ <class name="org/apache/http/client/RequestDirector" since="1">
+ <extends name="java/lang/Object" />
+ <method name="execute(Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpResponse;" />
+ </class>
+ <class name="org/apache/http/client/ResponseHandler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="handleResponse(Lorg/apache/http/HttpResponse;)Ljava/lang/Object;" />
+ </class>
+ <class name="org/apache/http/client/UserTokenHandler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getUserToken(Lorg/apache/http/protocol/HttpContext;)Ljava/lang/Object;" />
+ </class>
+ <class name="org/apache/http/client/entity/UrlEncodedFormEntity" since="1">
+ <extends name="org/apache/http/entity/StringEntity" />
+ <method name="&lt;init>(Ljava/util/List;)V" />
+ <method name="&lt;init>(Ljava/util/List;Ljava/lang/String;)V" />
+ </class>
+ <class name="org/apache/http/client/methods/AbortableHttpRequest" since="1">
+ <extends name="java/lang/Object" />
+ <method name="abort()V" />
+ <method name="setConnectionRequest(Lorg/apache/http/conn/ClientConnectionRequest;)V" />
+ <method name="setReleaseTrigger(Lorg/apache/http/conn/ConnectionReleaseTrigger;)V" />
+ </class>
+ <class name="org/apache/http/client/methods/HttpDelete" since="1">
+ <extends name="org/apache/http/client/methods/HttpRequestBase" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/net/URI;)V" />
+ <field name="METHOD_NAME" />
+ </class>
+ <class name="org/apache/http/client/methods/HttpEntityEnclosingRequestBase" since="1">
+ <extends name="org/apache/http/client/methods/HttpRequestBase" />
+ <implements name="org/apache/http/HttpEntityEnclosingRequest" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/client/methods/HttpGet" since="1">
+ <extends name="org/apache/http/client/methods/HttpRequestBase" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/net/URI;)V" />
+ <field name="METHOD_NAME" />
+ </class>
+ <class name="org/apache/http/client/methods/HttpHead" since="1">
+ <extends name="org/apache/http/client/methods/HttpRequestBase" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/net/URI;)V" />
+ <field name="METHOD_NAME" />
+ </class>
+ <class name="org/apache/http/client/methods/HttpOptions" since="1">
+ <extends name="org/apache/http/client/methods/HttpRequestBase" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/net/URI;)V" />
+ <method name="getAllowedMethods(Lorg/apache/http/HttpResponse;)Ljava/util/Set;" />
+ <field name="METHOD_NAME" />
+ </class>
+ <class name="org/apache/http/client/methods/HttpPost" since="1">
+ <extends name="org/apache/http/client/methods/HttpEntityEnclosingRequestBase" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/net/URI;)V" />
+ <field name="METHOD_NAME" />
+ </class>
+ <class name="org/apache/http/client/methods/HttpPut" since="1">
+ <extends name="org/apache/http/client/methods/HttpEntityEnclosingRequestBase" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/net/URI;)V" />
+ <field name="METHOD_NAME" />
+ </class>
+ <class name="org/apache/http/client/methods/HttpRequestBase" since="1">
+ <extends name="org/apache/http/message/AbstractHttpMessage" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="org/apache/http/client/methods/AbortableHttpRequest" />
+ <implements name="org/apache/http/client/methods/HttpUriRequest" />
+ <method name="&lt;init>()V" />
+ <method name="setURI(Ljava/net/URI;)V" />
+ </class>
+ <class name="org/apache/http/client/methods/HttpTrace" since="1">
+ <extends name="org/apache/http/client/methods/HttpRequestBase" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/net/URI;)V" />
+ <field name="METHOD_NAME" />
+ </class>
+ <class name="org/apache/http/client/methods/HttpUriRequest" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpRequest" />
+ <method name="abort()V" />
+ <method name="getMethod()Ljava/lang/String;" />
+ <method name="getURI()Ljava/net/URI;" />
+ <method name="isAborted()Z" />
+ </class>
+ <class name="org/apache/http/client/params/AllClientPNames" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/auth/params/AuthPNames" />
+ <implements name="org/apache/http/client/params/ClientPNames" />
+ <implements name="org/apache/http/conn/params/ConnConnectionPNames" />
+ <implements name="org/apache/http/conn/params/ConnManagerPNames" />
+ <implements name="org/apache/http/conn/params/ConnRoutePNames" />
+ <implements name="org/apache/http/cookie/params/CookieSpecPNames" />
+ <implements name="org/apache/http/params/CoreConnectionPNames" />
+ <implements name="org/apache/http/params/CoreProtocolPNames" />
+ </class>
+ <class name="org/apache/http/client/params/AuthPolicy" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="BASIC" />
+ <field name="DIGEST" />
+ <field name="NTLM" />
+ </class>
+ <class name="org/apache/http/client/params/ClientPNames" since="1">
+ <extends name="java/lang/Object" />
+ <field name="ALLOW_CIRCULAR_REDIRECTS" />
+ <field name="CONNECTION_MANAGER_FACTORY" />
+ <field name="CONNECTION_MANAGER_FACTORY_CLASS_NAME" />
+ <field name="COOKIE_POLICY" />
+ <field name="DEFAULT_HEADERS" />
+ <field name="DEFAULT_HOST" />
+ <field name="HANDLE_AUTHENTICATION" />
+ <field name="HANDLE_REDIRECTS" />
+ <field name="MAX_REDIRECTS" />
+ <field name="REJECT_RELATIVE_REDIRECT" />
+ <field name="VIRTUAL_HOST" />
+ </class>
+ <class name="org/apache/http/client/params/ClientParamBean" since="1">
+ <extends name="org/apache/http/params/HttpAbstractParamBean" />
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;)V" />
+ <method name="setAllowCircularRedirects(Z)V" />
+ <method name="setConnectionManagerFactory(Lorg/apache/http/conn/ClientConnectionManagerFactory;)V" />
+ <method name="setConnectionManagerFactoryClassName(Ljava/lang/String;)V" />
+ <method name="setCookiePolicy(Ljava/lang/String;)V" />
+ <method name="setDefaultHeaders(Ljava/util/Collection;)V" />
+ <method name="setDefaultHost(Lorg/apache/http/HttpHost;)V" />
+ <method name="setHandleAuthentication(Z)V" />
+ <method name="setHandleRedirects(Z)V" />
+ <method name="setMaxRedirects(I)V" />
+ <method name="setRejectRelativeRedirect(Z)V" />
+ <method name="setVirtualHost(Lorg/apache/http/HttpHost;)V" />
+ </class>
+ <class name="org/apache/http/client/params/CookiePolicy" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <field name="BEST_MATCH" />
+ <field name="BROWSER_COMPATIBILITY" />
+ <field name="NETSCAPE" />
+ <field name="RFC_2109" />
+ <field name="RFC_2965" />
+ </class>
+ <class name="org/apache/http/client/params/HttpClientParams" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getCookiePolicy(Lorg/apache/http/params/HttpParams;)Ljava/lang/String;" />
+ <method name="isAuthenticating(Lorg/apache/http/params/HttpParams;)Z" />
+ <method name="isRedirecting(Lorg/apache/http/params/HttpParams;)Z" />
+ <method name="setAuthenticating(Lorg/apache/http/params/HttpParams;Z)V" />
+ <method name="setCookiePolicy(Lorg/apache/http/params/HttpParams;Ljava/lang/String;)V" />
+ <method name="setRedirecting(Lorg/apache/http/params/HttpParams;Z)V" />
+ </class>
+ <class name="org/apache/http/client/protocol/ClientContext" since="1">
+ <extends name="java/lang/Object" />
+ <field name="AUTHSCHEME_REGISTRY" />
+ <field name="AUTH_SCHEME_PREF" />
+ <field name="COOKIESPEC_REGISTRY" />
+ <field name="COOKIE_ORIGIN" />
+ <field name="COOKIE_SPEC" />
+ <field name="COOKIE_STORE" />
+ <field name="CREDS_PROVIDER" />
+ <field name="PROXY_AUTH_STATE" />
+ <field name="TARGET_AUTH_STATE" />
+ <field name="USER_TOKEN" />
+ </class>
+ <class name="org/apache/http/client/protocol/ClientContextConfigurer" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/client/protocol/ClientContext" />
+ <method name="&lt;init>(Lorg/apache/http/protocol/HttpContext;)V" />
+ <method name="setAuthSchemePref(Ljava/util/List;)V" />
+ <method name="setAuthSchemeRegistry(Lorg/apache/http/auth/AuthSchemeRegistry;)V" />
+ <method name="setCookieSpecRegistry(Lorg/apache/http/cookie/CookieSpecRegistry;)V" />
+ <method name="setCookieStore(Lorg/apache/http/client/CookieStore;)V" />
+ <method name="setCredentialsProvider(Lorg/apache/http/client/CredentialsProvider;)V" />
+ </class>
+ <class name="org/apache/http/client/protocol/RequestAddCookies" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpRequestInterceptor" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/client/protocol/RequestDefaultHeaders" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpRequestInterceptor" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/client/protocol/RequestProxyAuthentication" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpRequestInterceptor" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/client/protocol/RequestTargetAuthentication" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpRequestInterceptor" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/client/protocol/ResponseProcessCookies" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpResponseInterceptor" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/client/utils/CloneUtils" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="clone(Ljava/lang/Object;)Ljava/lang/Object;" />
+ </class>
+ <class name="org/apache/http/client/utils/URIUtils" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="createURI(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/net/URI;" />
+ <method name="resolve(Ljava/net/URI;Ljava/lang/String;)Ljava/net/URI;" />
+ <method name="resolve(Ljava/net/URI;Ljava/net/URI;)Ljava/net/URI;" />
+ <method name="rewriteURI(Ljava/net/URI;Lorg/apache/http/HttpHost;)Ljava/net/URI;" />
+ <method name="rewriteURI(Ljava/net/URI;Lorg/apache/http/HttpHost;Z)Ljava/net/URI;" />
+ </class>
+ <class name="org/apache/http/client/utils/URLEncodedUtils" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="format(Ljava/util/List;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="isEncoded(Lorg/apache/http/HttpEntity;)Z" />
+ <method name="parse(Ljava/net/URI;Ljava/lang/String;)Ljava/util/List;" />
+ <method name="parse(Ljava/util/List;Ljava/util/Scanner;Ljava/lang/String;)V" />
+ <method name="parse(Lorg/apache/http/HttpEntity;)Ljava/util/List;" />
+ <field name="CONTENT_TYPE" />
+ </class>
+ <class name="org/apache/http/conn/BasicEofSensorWatcher" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/conn/EofSensorWatcher" />
+ <method name="&lt;init>(Lorg/apache/http/conn/ManagedClientConnection;Z)V" />
+ <field name="attemptReuse" />
+ <field name="managedConn" />
+ </class>
+ <class name="org/apache/http/conn/BasicManagedEntity" since="1">
+ <extends name="org/apache/http/entity/HttpEntityWrapper" />
+ <implements name="org/apache/http/conn/ConnectionReleaseTrigger" />
+ <implements name="org/apache/http/conn/EofSensorWatcher" />
+ <method name="&lt;init>(Lorg/apache/http/HttpEntity;Lorg/apache/http/conn/ManagedClientConnection;Z)V" />
+ <method name="releaseManagedConnection()V" />
+ <field name="attemptReuse" />
+ <field name="managedConn" />
+ </class>
+ <class name="org/apache/http/conn/ClientConnectionManager" since="1">
+ <extends name="java/lang/Object" />
+ <method name="closeExpiredConnections()V" />
+ <method name="closeIdleConnections(JLjava/util/concurrent/TimeUnit;)V" />
+ <method name="getSchemeRegistry()Lorg/apache/http/conn/scheme/SchemeRegistry;" />
+ <method name="releaseConnection(Lorg/apache/http/conn/ManagedClientConnection;JLjava/util/concurrent/TimeUnit;)V" />
+ <method name="requestConnection(Lorg/apache/http/conn/routing/HttpRoute;Ljava/lang/Object;)Lorg/apache/http/conn/ClientConnectionRequest;" />
+ <method name="shutdown()V" />
+ </class>
+ <class name="org/apache/http/conn/ClientConnectionManagerFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="newInstance(Lorg/apache/http/params/HttpParams;Lorg/apache/http/conn/scheme/SchemeRegistry;)Lorg/apache/http/conn/ClientConnectionManager;" />
+ </class>
+ <class name="org/apache/http/conn/ClientConnectionOperator" since="1">
+ <extends name="java/lang/Object" />
+ <method name="createConnection()Lorg/apache/http/conn/OperatedClientConnection;" />
+ <method name="openConnection(Lorg/apache/http/conn/OperatedClientConnection;Lorg/apache/http/HttpHost;Ljava/net/InetAddress;Lorg/apache/http/protocol/HttpContext;Lorg/apache/http/params/HttpParams;)V" />
+ <method name="updateSecureConnection(Lorg/apache/http/conn/OperatedClientConnection;Lorg/apache/http/HttpHost;Lorg/apache/http/protocol/HttpContext;Lorg/apache/http/params/HttpParams;)V" />
+ </class>
+ <class name="org/apache/http/conn/ClientConnectionRequest" since="1">
+ <extends name="java/lang/Object" />
+ <method name="abortRequest()V" />
+ <method name="getConnection(JLjava/util/concurrent/TimeUnit;)Lorg/apache/http/conn/ManagedClientConnection;" />
+ </class>
+ <class name="org/apache/http/conn/ConnectTimeoutException" since="1">
+ <extends name="java/io/InterruptedIOException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="org/apache/http/conn/ConnectionKeepAliveStrategy" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getKeepAliveDuration(Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)J" />
+ </class>
+ <class name="org/apache/http/conn/ConnectionPoolTimeoutException" since="1">
+ <extends name="org/apache/http/conn/ConnectTimeoutException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="org/apache/http/conn/ConnectionReleaseTrigger" since="1">
+ <extends name="java/lang/Object" />
+ <method name="abortConnection()V" />
+ <method name="releaseConnection()V" />
+ </class>
+ <class name="org/apache/http/conn/EofSensorInputStream" since="1">
+ <extends name="java/io/InputStream" />
+ <implements name="org/apache/http/conn/ConnectionReleaseTrigger" />
+ <method name="&lt;init>(Ljava/io/InputStream;Lorg/apache/http/conn/EofSensorWatcher;)V" />
+ <method name="checkAbort()V" />
+ <method name="checkClose()V" />
+ <method name="checkEOF(I)V" />
+ <method name="isReadAllowed()Z" />
+ <field name="wrappedStream" />
+ </class>
+ <class name="org/apache/http/conn/EofSensorWatcher" since="1">
+ <extends name="java/lang/Object" />
+ <method name="eofDetected(Ljava/io/InputStream;)Z" />
+ <method name="streamAbort(Ljava/io/InputStream;)Z" />
+ <method name="streamClosed(Ljava/io/InputStream;)Z" />
+ </class>
+ <class name="org/apache/http/conn/HttpHostConnectException" since="1">
+ <extends name="java/net/ConnectException" />
+ <method name="&lt;init>(Lorg/apache/http/HttpHost;Ljava/net/ConnectException;)V" />
+ <method name="getHost()Lorg/apache/http/HttpHost;" />
+ </class>
+ <class name="org/apache/http/conn/ManagedClientConnection" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpClientConnection" />
+ <implements name="org/apache/http/HttpInetConnection" />
+ <implements name="org/apache/http/conn/ConnectionReleaseTrigger" />
+ <method name="getRoute()Lorg/apache/http/conn/routing/HttpRoute;" />
+ <method name="getSSLSession()Ljavax/net/ssl/SSLSession;" />
+ <method name="getState()Ljava/lang/Object;" />
+ <method name="isMarkedReusable()Z" />
+ <method name="isSecure()Z" />
+ <method name="layerProtocol(Lorg/apache/http/protocol/HttpContext;Lorg/apache/http/params/HttpParams;)V" />
+ <method name="markReusable()V" />
+ <method name="open(Lorg/apache/http/conn/routing/HttpRoute;Lorg/apache/http/protocol/HttpContext;Lorg/apache/http/params/HttpParams;)V" />
+ <method name="setIdleDuration(JLjava/util/concurrent/TimeUnit;)V" />
+ <method name="setState(Ljava/lang/Object;)V" />
+ <method name="tunnelProxy(Lorg/apache/http/HttpHost;ZLorg/apache/http/params/HttpParams;)V" />
+ <method name="tunnelTarget(ZLorg/apache/http/params/HttpParams;)V" />
+ <method name="unmarkReusable()V" />
+ </class>
+ <class name="org/apache/http/conn/MultihomePlainSocketFactory" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/conn/scheme/SocketFactory" />
+ <method name="&lt;init>()V" />
+ <method name="getSocketFactory()Lorg/apache/http/conn/MultihomePlainSocketFactory;" />
+ </class>
+ <class name="org/apache/http/conn/OperatedClientConnection" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpClientConnection" />
+ <implements name="org/apache/http/HttpInetConnection" />
+ <method name="getSocket()Ljava/net/Socket;" />
+ <method name="getTargetHost()Lorg/apache/http/HttpHost;" />
+ <method name="isSecure()Z" />
+ <method name="openCompleted(ZLorg/apache/http/params/HttpParams;)V" />
+ <method name="opening(Ljava/net/Socket;Lorg/apache/http/HttpHost;)V" />
+ <method name="update(Ljava/net/Socket;Lorg/apache/http/HttpHost;ZLorg/apache/http/params/HttpParams;)V" />
+ </class>
+ <class name="org/apache/http/conn/params/ConnConnectionPNames" since="1">
+ <extends name="java/lang/Object" />
+ <field name="MAX_STATUS_LINE_GARBAGE" />
+ </class>
+ <class name="org/apache/http/conn/params/ConnConnectionParamBean" since="1">
+ <extends name="org/apache/http/params/HttpAbstractParamBean" />
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;)V" />
+ <method name="setMaxStatusLineGarbage(I)V" />
+ </class>
+ <class name="org/apache/http/conn/params/ConnManagerPNames" since="1">
+ <extends name="java/lang/Object" />
+ <field name="MAX_CONNECTIONS_PER_ROUTE" />
+ <field name="MAX_TOTAL_CONNECTIONS" />
+ <field name="TIMEOUT" />
+ </class>
+ <class name="org/apache/http/conn/params/ConnManagerParamBean" since="1">
+ <extends name="org/apache/http/params/HttpAbstractParamBean" />
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;)V" />
+ <method name="setConnectionsPerRoute(Lorg/apache/http/conn/params/ConnPerRouteBean;)V" />
+ <method name="setMaxTotalConnections(I)V" />
+ <method name="setTimeout(J)V" />
+ </class>
+ <class name="org/apache/http/conn/params/ConnManagerParams" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/conn/params/ConnManagerPNames" />
+ <method name="&lt;init>()V" />
+ <method name="getMaxConnectionsPerRoute(Lorg/apache/http/params/HttpParams;)Lorg/apache/http/conn/params/ConnPerRoute;" />
+ <method name="getMaxTotalConnections(Lorg/apache/http/params/HttpParams;)I" />
+ <method name="getTimeout(Lorg/apache/http/params/HttpParams;)J" />
+ <method name="setMaxConnectionsPerRoute(Lorg/apache/http/params/HttpParams;Lorg/apache/http/conn/params/ConnPerRoute;)V" />
+ <method name="setMaxTotalConnections(Lorg/apache/http/params/HttpParams;I)V" />
+ <method name="setTimeout(Lorg/apache/http/params/HttpParams;J)V" />
+ <field name="DEFAULT_MAX_TOTAL_CONNECTIONS" />
+ </class>
+ <class name="org/apache/http/conn/params/ConnPerRoute" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getMaxForRoute(Lorg/apache/http/conn/routing/HttpRoute;)I" />
+ </class>
+ <class name="org/apache/http/conn/params/ConnPerRouteBean" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/conn/params/ConnPerRoute" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(I)V" />
+ <method name="getDefaultMax()I" />
+ <method name="setDefaultMaxPerRoute(I)V" />
+ <method name="setMaxForRoute(Lorg/apache/http/conn/routing/HttpRoute;I)V" />
+ <method name="setMaxForRoutes(Ljava/util/Map;)V" />
+ <field name="DEFAULT_MAX_CONNECTIONS_PER_ROUTE" />
+ </class>
+ <class name="org/apache/http/conn/params/ConnRoutePNames" since="1">
+ <extends name="java/lang/Object" />
+ <field name="DEFAULT_PROXY" />
+ <field name="FORCED_ROUTE" />
+ <field name="LOCAL_ADDRESS" />
+ </class>
+ <class name="org/apache/http/conn/params/ConnRouteParamBean" since="1">
+ <extends name="org/apache/http/params/HttpAbstractParamBean" />
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;)V" />
+ <method name="setDefaultProxy(Lorg/apache/http/HttpHost;)V" />
+ <method name="setForcedRoute(Lorg/apache/http/conn/routing/HttpRoute;)V" />
+ <method name="setLocalAddress(Ljava/net/InetAddress;)V" />
+ </class>
+ <class name="org/apache/http/conn/params/ConnRouteParams" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/conn/params/ConnRoutePNames" />
+ <method name="&lt;init>()V" />
+ <method name="getDefaultProxy(Lorg/apache/http/params/HttpParams;)Lorg/apache/http/HttpHost;" />
+ <method name="getForcedRoute(Lorg/apache/http/params/HttpParams;)Lorg/apache/http/conn/routing/HttpRoute;" />
+ <method name="getLocalAddress(Lorg/apache/http/params/HttpParams;)Ljava/net/InetAddress;" />
+ <method name="setDefaultProxy(Lorg/apache/http/params/HttpParams;Lorg/apache/http/HttpHost;)V" />
+ <method name="setForcedRoute(Lorg/apache/http/params/HttpParams;Lorg/apache/http/conn/routing/HttpRoute;)V" />
+ <method name="setLocalAddress(Lorg/apache/http/params/HttpParams;Ljava/net/InetAddress;)V" />
+ <field name="NO_HOST" />
+ <field name="NO_ROUTE" />
+ </class>
+ <class name="org/apache/http/conn/routing/BasicRouteDirector" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/conn/routing/HttpRouteDirector" />
+ <method name="&lt;init>()V" />
+ <method name="directStep(Lorg/apache/http/conn/routing/RouteInfo;Lorg/apache/http/conn/routing/RouteInfo;)I" />
+ <method name="firstStep(Lorg/apache/http/conn/routing/RouteInfo;)I" />
+ <method name="proxiedStep(Lorg/apache/http/conn/routing/RouteInfo;Lorg/apache/http/conn/routing/RouteInfo;)I" />
+ </class>
+ <class name="org/apache/http/conn/routing/HttpRoute" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="org/apache/http/conn/routing/RouteInfo" />
+ <method name="&lt;init>(Lorg/apache/http/HttpHost;)V" />
+ <method name="&lt;init>(Lorg/apache/http/HttpHost;Ljava/net/InetAddress;Lorg/apache/http/HttpHost;Z)V" />
+ <method name="&lt;init>(Lorg/apache/http/HttpHost;Ljava/net/InetAddress;Lorg/apache/http/HttpHost;ZLorg/apache/http/conn/routing/RouteInfo$TunnelType;Lorg/apache/http/conn/routing/RouteInfo$LayerType;)V" />
+ <method name="&lt;init>(Lorg/apache/http/HttpHost;Ljava/net/InetAddress;Z)V" />
+ <method name="&lt;init>(Lorg/apache/http/HttpHost;Ljava/net/InetAddress;[Lorg/apache/http/HttpHost;ZLorg/apache/http/conn/routing/RouteInfo$TunnelType;Lorg/apache/http/conn/routing/RouteInfo$LayerType;)V" />
+ </class>
+ <class name="org/apache/http/conn/routing/HttpRouteDirector" since="1">
+ <extends name="java/lang/Object" />
+ <method name="nextStep(Lorg/apache/http/conn/routing/RouteInfo;Lorg/apache/http/conn/routing/RouteInfo;)I" />
+ <field name="COMPLETE" />
+ <field name="CONNECT_PROXY" />
+ <field name="CONNECT_TARGET" />
+ <field name="LAYER_PROTOCOL" />
+ <field name="TUNNEL_PROXY" />
+ <field name="TUNNEL_TARGET" />
+ <field name="UNREACHABLE" />
+ </class>
+ <class name="org/apache/http/conn/routing/HttpRoutePlanner" since="1">
+ <extends name="java/lang/Object" />
+ <method name="determineRoute(Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/conn/routing/HttpRoute;" />
+ </class>
+ <class name="org/apache/http/conn/routing/RouteInfo" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getHopCount()I" />
+ <method name="getHopTarget(I)Lorg/apache/http/HttpHost;" />
+ <method name="getLayerType()Lorg/apache/http/conn/routing/RouteInfo$LayerType;" />
+ <method name="getLocalAddress()Ljava/net/InetAddress;" />
+ <method name="getProxyHost()Lorg/apache/http/HttpHost;" />
+ <method name="getTargetHost()Lorg/apache/http/HttpHost;" />
+ <method name="getTunnelType()Lorg/apache/http/conn/routing/RouteInfo$TunnelType;" />
+ <method name="isLayered()Z" />
+ <method name="isSecure()Z" />
+ <method name="isTunnelled()Z" />
+ </class>
+ <class name="org/apache/http/conn/routing/RouteInfo$LayerType" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Lorg/apache/http/conn/routing/RouteInfo$LayerType;" />
+ <method name="values()[Lorg/apache/http/conn/routing/RouteInfo$LayerType;" />
+ <field name="LAYERED" />
+ <field name="PLAIN" />
+ </class>
+ <class name="org/apache/http/conn/routing/RouteInfo$TunnelType" since="1">
+ <extends name="java/lang/Enum" />
+ <method name="valueOf(Ljava/lang/String;)Lorg/apache/http/conn/routing/RouteInfo$TunnelType;" />
+ <method name="values()[Lorg/apache/http/conn/routing/RouteInfo$TunnelType;" />
+ <field name="PLAIN" />
+ <field name="TUNNELLED" />
+ </class>
+ <class name="org/apache/http/conn/routing/RouteTracker" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="org/apache/http/conn/routing/RouteInfo" />
+ <method name="&lt;init>(Lorg/apache/http/HttpHost;Ljava/net/InetAddress;)V" />
+ <method name="&lt;init>(Lorg/apache/http/conn/routing/HttpRoute;)V" />
+ <method name="connectProxy(Lorg/apache/http/HttpHost;Z)V" />
+ <method name="connectTarget(Z)V" />
+ <method name="isConnected()Z" />
+ <method name="layerProtocol(Z)V" />
+ <method name="toRoute()Lorg/apache/http/conn/routing/HttpRoute;" />
+ <method name="tunnelProxy(Lorg/apache/http/HttpHost;Z)V" />
+ <method name="tunnelTarget(Z)V" />
+ </class>
+ <class name="org/apache/http/conn/scheme/HostNameResolver" since="1">
+ <extends name="java/lang/Object" />
+ <method name="resolve(Ljava/lang/String;)Ljava/net/InetAddress;" />
+ </class>
+ <class name="org/apache/http/conn/scheme/LayeredSocketFactory" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/conn/scheme/SocketFactory" />
+ <method name="createSocket(Ljava/net/Socket;Ljava/lang/String;IZ)Ljava/net/Socket;" />
+ </class>
+ <class name="org/apache/http/conn/scheme/PlainSocketFactory" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/conn/scheme/SocketFactory" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Lorg/apache/http/conn/scheme/HostNameResolver;)V" />
+ <method name="getSocketFactory()Lorg/apache/http/conn/scheme/PlainSocketFactory;" />
+ </class>
+ <class name="org/apache/http/conn/scheme/Scheme" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;Lorg/apache/http/conn/scheme/SocketFactory;I)V" />
+ <method name="getDefaultPort()I" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getSocketFactory()Lorg/apache/http/conn/scheme/SocketFactory;" />
+ <method name="isLayered()Z" />
+ <method name="resolvePort(I)I" />
+ </class>
+ <class name="org/apache/http/conn/scheme/SchemeRegistry" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="get(Ljava/lang/String;)Lorg/apache/http/conn/scheme/Scheme;" />
+ <method name="getScheme(Ljava/lang/String;)Lorg/apache/http/conn/scheme/Scheme;" />
+ <method name="getScheme(Lorg/apache/http/HttpHost;)Lorg/apache/http/conn/scheme/Scheme;" />
+ <method name="getSchemeNames()Ljava/util/List;" />
+ <method name="register(Lorg/apache/http/conn/scheme/Scheme;)Lorg/apache/http/conn/scheme/Scheme;" />
+ <method name="setItems(Ljava/util/Map;)V" />
+ <method name="unregister(Ljava/lang/String;)Lorg/apache/http/conn/scheme/Scheme;" />
+ </class>
+ <class name="org/apache/http/conn/scheme/SocketFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="connectSocket(Ljava/net/Socket;Ljava/lang/String;ILjava/net/InetAddress;ILorg/apache/http/params/HttpParams;)Ljava/net/Socket;" />
+ <method name="createSocket()Ljava/net/Socket;" />
+ <method name="isSecure(Ljava/net/Socket;)Z" />
+ </class>
+ <class name="org/apache/http/conn/ssl/AbstractVerifier" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/conn/ssl/X509HostnameVerifier" />
+ <method name="&lt;init>()V" />
+ <method name="acceptableCountryWildcard(Ljava/lang/String;)Z" />
+ <method name="countDots(Ljava/lang/String;)I" />
+ <method name="getCNs(Ljava/security/cert/X509Certificate;)[Ljava/lang/String;" />
+ <method name="getDNSSubjectAlts(Ljava/security/cert/X509Certificate;)[Ljava/lang/String;" />
+ <method name="verify(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;Z)V" />
+ </class>
+ <class name="org/apache/http/conn/ssl/AllowAllHostnameVerifier" since="1">
+ <extends name="org/apache/http/conn/ssl/AbstractVerifier" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/conn/ssl/BrowserCompatHostnameVerifier" since="1">
+ <extends name="org/apache/http/conn/ssl/AbstractVerifier" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/conn/ssl/SSLSocketFactory" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/conn/scheme/LayeredSocketFactory" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/security/KeyStore;Ljava/lang/String;Ljava/security/KeyStore;Ljava/security/SecureRandom;Lorg/apache/http/conn/scheme/HostNameResolver;)V" />
+ <method name="&lt;init>(Ljava/security/KeyStore;)V" />
+ <method name="&lt;init>(Ljava/security/KeyStore;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/security/KeyStore;Ljava/lang/String;Ljava/security/KeyStore;)V" />
+ <method name="getHostnameVerifier()Lorg/apache/http/conn/ssl/X509HostnameVerifier;" />
+ <method name="getSocketFactory()Lorg/apache/http/conn/ssl/SSLSocketFactory;" />
+ <method name="setHostnameVerifier(Lorg/apache/http/conn/ssl/X509HostnameVerifier;)V" />
+ <field name="ALLOW_ALL_HOSTNAME_VERIFIER" />
+ <field name="BROWSER_COMPATIBLE_HOSTNAME_VERIFIER" />
+ <field name="SSL" />
+ <field name="SSLV2" />
+ <field name="STRICT_HOSTNAME_VERIFIER" />
+ <field name="TLS" />
+ </class>
+ <class name="org/apache/http/conn/ssl/StrictHostnameVerifier" since="1">
+ <extends name="org/apache/http/conn/ssl/AbstractVerifier" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/conn/ssl/X509HostnameVerifier" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="javax/net/ssl/HostnameVerifier" />
+ <method name="verify(Ljava/lang/String;Ljava/security/cert/X509Certificate;)V" />
+ <method name="verify(Ljava/lang/String;Ljavax/net/ssl/SSLSocket;)V" />
+ <method name="verify(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;)V" />
+ </class>
+ <class name="org/apache/http/conn/util/InetAddressUtils" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="isIPv4Address(Ljava/lang/String;)Z" />
+ <method name="isIPv6Address(Ljava/lang/String;)Z" />
+ <method name="isIPv6HexCompressedAddress(Ljava/lang/String;)Z" />
+ <method name="isIPv6StdAddress(Ljava/lang/String;)Z" />
+ </class>
+ <class name="org/apache/http/cookie/ClientCookie" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/cookie/Cookie" />
+ <method name="containsAttribute(Ljava/lang/String;)Z" />
+ <method name="getAttribute(Ljava/lang/String;)Ljava/lang/String;" />
+ <field name="COMMENTURL_ATTR" />
+ <field name="COMMENT_ATTR" />
+ <field name="DISCARD_ATTR" />
+ <field name="DOMAIN_ATTR" />
+ <field name="EXPIRES_ATTR" />
+ <field name="MAX_AGE_ATTR" />
+ <field name="PATH_ATTR" />
+ <field name="PORT_ATTR" />
+ <field name="SECURE_ATTR" />
+ <field name="VERSION_ATTR" />
+ </class>
+ <class name="org/apache/http/cookie/Cookie" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getComment()Ljava/lang/String;" />
+ <method name="getCommentURL()Ljava/lang/String;" />
+ <method name="getDomain()Ljava/lang/String;" />
+ <method name="getExpiryDate()Ljava/util/Date;" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getPath()Ljava/lang/String;" />
+ <method name="getPorts()[I" />
+ <method name="getValue()Ljava/lang/String;" />
+ <method name="getVersion()I" />
+ <method name="isExpired(Ljava/util/Date;)Z" />
+ <method name="isPersistent()Z" />
+ <method name="isSecure()Z" />
+ </class>
+ <class name="org/apache/http/cookie/CookieAttributeHandler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="match(Lorg/apache/http/cookie/Cookie;Lorg/apache/http/cookie/CookieOrigin;)Z" />
+ <method name="parse(Lorg/apache/http/cookie/SetCookie;Ljava/lang/String;)V" />
+ <method name="validate(Lorg/apache/http/cookie/Cookie;Lorg/apache/http/cookie/CookieOrigin;)V" />
+ </class>
+ <class name="org/apache/http/cookie/CookieIdentityComparator" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/util/Comparator" />
+ <method name="&lt;init>()V" />
+ <method name="compare(Lorg/apache/http/cookie/Cookie;Lorg/apache/http/cookie/Cookie;)I" />
+ </class>
+ <class name="org/apache/http/cookie/CookieOrigin" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;ILjava/lang/String;Z)V" />
+ <method name="getHost()Ljava/lang/String;" />
+ <method name="getPath()Ljava/lang/String;" />
+ <method name="getPort()I" />
+ <method name="isSecure()Z" />
+ </class>
+ <class name="org/apache/http/cookie/CookiePathComparator" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/util/Comparator" />
+ <method name="&lt;init>()V" />
+ <method name="compare(Lorg/apache/http/cookie/Cookie;Lorg/apache/http/cookie/Cookie;)I" />
+ </class>
+ <class name="org/apache/http/cookie/CookieSpec" since="1">
+ <extends name="java/lang/Object" />
+ <method name="formatCookies(Ljava/util/List;)Ljava/util/List;" />
+ <method name="getVersion()I" />
+ <method name="getVersionHeader()Lorg/apache/http/Header;" />
+ <method name="match(Lorg/apache/http/cookie/Cookie;Lorg/apache/http/cookie/CookieOrigin;)Z" />
+ <method name="parse(Lorg/apache/http/Header;Lorg/apache/http/cookie/CookieOrigin;)Ljava/util/List;" />
+ <method name="validate(Lorg/apache/http/cookie/Cookie;Lorg/apache/http/cookie/CookieOrigin;)V" />
+ </class>
+ <class name="org/apache/http/cookie/CookieSpecFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="newInstance(Lorg/apache/http/params/HttpParams;)Lorg/apache/http/cookie/CookieSpec;" />
+ </class>
+ <class name="org/apache/http/cookie/CookieSpecRegistry" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getCookieSpec(Ljava/lang/String;)Lorg/apache/http/cookie/CookieSpec;" />
+ <method name="getCookieSpec(Ljava/lang/String;Lorg/apache/http/params/HttpParams;)Lorg/apache/http/cookie/CookieSpec;" />
+ <method name="getSpecNames()Ljava/util/List;" />
+ <method name="register(Ljava/lang/String;Lorg/apache/http/cookie/CookieSpecFactory;)V" />
+ <method name="setItems(Ljava/util/Map;)V" />
+ <method name="unregister(Ljava/lang/String;)V" />
+ </class>
+ <class name="org/apache/http/cookie/MalformedCookieException" since="1">
+ <extends name="org/apache/http/ProtocolException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="org/apache/http/cookie/SM" since="1">
+ <extends name="java/lang/Object" />
+ <field name="COOKIE" />
+ <field name="COOKIE2" />
+ <field name="SET_COOKIE" />
+ <field name="SET_COOKIE2" />
+ </class>
+ <class name="org/apache/http/cookie/SetCookie" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/cookie/Cookie" />
+ <method name="setComment(Ljava/lang/String;)V" />
+ <method name="setDomain(Ljava/lang/String;)V" />
+ <method name="setExpiryDate(Ljava/util/Date;)V" />
+ <method name="setPath(Ljava/lang/String;)V" />
+ <method name="setSecure(Z)V" />
+ <method name="setValue(Ljava/lang/String;)V" />
+ <method name="setVersion(I)V" />
+ </class>
+ <class name="org/apache/http/cookie/SetCookie2" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/cookie/SetCookie" />
+ <method name="setCommentURL(Ljava/lang/String;)V" />
+ <method name="setDiscard(Z)V" />
+ <method name="setPorts([I)V" />
+ </class>
+ <class name="org/apache/http/cookie/params/CookieSpecPNames" since="1">
+ <extends name="java/lang/Object" />
+ <field name="DATE_PATTERNS" />
+ <field name="SINGLE_COOKIE_HEADER" />
+ </class>
+ <class name="org/apache/http/cookie/params/CookieSpecParamBean" since="1">
+ <extends name="org/apache/http/params/HttpAbstractParamBean" />
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;)V" />
+ <method name="setDatePatterns(Ljava/util/Collection;)V" />
+ <method name="setSingleHeader(Z)V" />
+ </class>
+ <class name="org/apache/http/entity/AbstractHttpEntity" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpEntity" />
+ <method name="&lt;init>()V" />
+ <method name="setChunked(Z)V" />
+ <method name="setContentEncoding(Ljava/lang/String;)V" />
+ <method name="setContentEncoding(Lorg/apache/http/Header;)V" />
+ <method name="setContentType(Ljava/lang/String;)V" />
+ <method name="setContentType(Lorg/apache/http/Header;)V" />
+ <field name="chunked" />
+ <field name="contentEncoding" />
+ <field name="contentType" />
+ </class>
+ <class name="org/apache/http/entity/BasicHttpEntity" since="1">
+ <extends name="org/apache/http/entity/AbstractHttpEntity" />
+ <method name="&lt;init>()V" />
+ <method name="setContent(Ljava/io/InputStream;)V" />
+ <method name="setContentLength(J)V" />
+ </class>
+ <class name="org/apache/http/entity/BufferedHttpEntity" since="1">
+ <extends name="org/apache/http/entity/HttpEntityWrapper" />
+ <method name="&lt;init>(Lorg/apache/http/HttpEntity;)V" />
+ </class>
+ <class name="org/apache/http/entity/ByteArrayEntity" since="1">
+ <extends name="org/apache/http/entity/AbstractHttpEntity" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>([B)V" />
+ <field name="content" />
+ </class>
+ <class name="org/apache/http/entity/ContentLengthStrategy" since="1">
+ <extends name="java/lang/Object" />
+ <method name="determineLength(Lorg/apache/http/HttpMessage;)J" />
+ <field name="CHUNKED" />
+ <field name="IDENTITY" />
+ </class>
+ <class name="org/apache/http/entity/ContentProducer" since="1">
+ <extends name="java/lang/Object" />
+ <method name="writeTo(Ljava/io/OutputStream;)V" />
+ </class>
+ <class name="org/apache/http/entity/EntityTemplate" since="1">
+ <extends name="org/apache/http/entity/AbstractHttpEntity" />
+ <method name="&lt;init>(Lorg/apache/http/entity/ContentProducer;)V" />
+ </class>
+ <class name="org/apache/http/entity/FileEntity" since="1">
+ <extends name="org/apache/http/entity/AbstractHttpEntity" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>(Ljava/io/File;Ljava/lang/String;)V" />
+ <field name="file" />
+ </class>
+ <class name="org/apache/http/entity/HttpEntityWrapper" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpEntity" />
+ <method name="&lt;init>(Lorg/apache/http/HttpEntity;)V" />
+ <field name="wrappedEntity" />
+ </class>
+ <class name="org/apache/http/entity/InputStreamEntity" since="1">
+ <extends name="org/apache/http/entity/AbstractHttpEntity" />
+ <method name="&lt;init>(Ljava/io/InputStream;J)V" />
+ </class>
+ <class name="org/apache/http/entity/SerializableEntity" since="1">
+ <extends name="org/apache/http/entity/AbstractHttpEntity" />
+ <method name="&lt;init>(Ljava/io/Serializable;Z)V" />
+ </class>
+ <class name="org/apache/http/entity/StringEntity" since="1">
+ <extends name="org/apache/http/entity/AbstractHttpEntity" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <field name="content" />
+ </class>
+ <class name="org/apache/http/impl/AbstractHttpClientConnection" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpClientConnection" />
+ <method name="&lt;init>()V" />
+ <method name="assertOpen()V" />
+ <method name="createEntityDeserializer()Lorg/apache/http/impl/entity/EntityDeserializer;" />
+ <method name="createEntitySerializer()Lorg/apache/http/impl/entity/EntitySerializer;" />
+ <method name="createHttpResponseFactory()Lorg/apache/http/HttpResponseFactory;" />
+ <method name="createRequestWriter(Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/params/HttpParams;)Lorg/apache/http/io/HttpMessageWriter;" />
+ <method name="createResponseParser(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/HttpResponseFactory;Lorg/apache/http/params/HttpParams;)Lorg/apache/http/io/HttpMessageParser;" />
+ <method name="doFlush()V" />
+ <method name="init(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/params/HttpParams;)V" />
+ </class>
+ <class name="org/apache/http/impl/AbstractHttpServerConnection" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpServerConnection" />
+ <method name="&lt;init>()V" />
+ <method name="assertOpen()V" />
+ <method name="createEntityDeserializer()Lorg/apache/http/impl/entity/EntityDeserializer;" />
+ <method name="createEntitySerializer()Lorg/apache/http/impl/entity/EntitySerializer;" />
+ <method name="createHttpRequestFactory()Lorg/apache/http/HttpRequestFactory;" />
+ <method name="createRequestParser(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/HttpRequestFactory;Lorg/apache/http/params/HttpParams;)Lorg/apache/http/io/HttpMessageParser;" />
+ <method name="createResponseWriter(Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/params/HttpParams;)Lorg/apache/http/io/HttpMessageWriter;" />
+ <method name="doFlush()V" />
+ <method name="init(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/params/HttpParams;)V" />
+ </class>
+ <class name="org/apache/http/impl/DefaultConnectionReuseStrategy" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/ConnectionReuseStrategy" />
+ <method name="&lt;init>()V" />
+ <method name="createTokenIterator(Lorg/apache/http/HeaderIterator;)Lorg/apache/http/TokenIterator;" />
+ </class>
+ <class name="org/apache/http/impl/DefaultHttpClientConnection" since="1">
+ <extends name="org/apache/http/impl/SocketHttpClientConnection" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/DefaultHttpRequestFactory" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpRequestFactory" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/DefaultHttpResponseFactory" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpResponseFactory" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Lorg/apache/http/ReasonPhraseCatalog;)V" />
+ <method name="determineLocale(Lorg/apache/http/protocol/HttpContext;)Ljava/util/Locale;" />
+ <field name="reasonCatalog" />
+ </class>
+ <class name="org/apache/http/impl/DefaultHttpServerConnection" since="1">
+ <extends name="org/apache/http/impl/SocketHttpServerConnection" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/EnglishReasonPhraseCatalog" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/ReasonPhraseCatalog" />
+ <method name="&lt;init>()V" />
+ <field name="INSTANCE" />
+ </class>
+ <class name="org/apache/http/impl/HttpConnectionMetricsImpl" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpConnectionMetrics" />
+ <method name="&lt;init>(Lorg/apache/http/io/HttpTransportMetrics;Lorg/apache/http/io/HttpTransportMetrics;)V" />
+ <method name="incrementRequestCount()V" />
+ <method name="incrementResponseCount()V" />
+ <method name="setMetric(Ljava/lang/String;Ljava/lang/Object;)V" />
+ <field name="RECEIVED_BYTES_COUNT" />
+ <field name="REQUEST_COUNT" />
+ <field name="RESPONSE_COUNT" />
+ <field name="SENT_BYTES_COUNT" />
+ </class>
+ <class name="org/apache/http/impl/NoConnectionReuseStrategy" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/ConnectionReuseStrategy" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/SocketHttpClientConnection" since="1">
+ <extends name="org/apache/http/impl/AbstractHttpClientConnection" />
+ <implements name="org/apache/http/HttpInetConnection" />
+ <method name="&lt;init>()V" />
+ <method name="assertNotOpen()V" />
+ <method name="bind(Ljava/net/Socket;Lorg/apache/http/params/HttpParams;)V" />
+ <method name="createSessionInputBuffer(Ljava/net/Socket;ILorg/apache/http/params/HttpParams;)Lorg/apache/http/io/SessionInputBuffer;" />
+ <method name="createSessionOutputBuffer(Ljava/net/Socket;ILorg/apache/http/params/HttpParams;)Lorg/apache/http/io/SessionOutputBuffer;" />
+ <method name="getSocket()Ljava/net/Socket;" />
+ </class>
+ <class name="org/apache/http/impl/SocketHttpServerConnection" since="1">
+ <extends name="org/apache/http/impl/AbstractHttpServerConnection" />
+ <implements name="org/apache/http/HttpInetConnection" />
+ <method name="&lt;init>()V" />
+ <method name="assertNotOpen()V" />
+ <method name="bind(Ljava/net/Socket;Lorg/apache/http/params/HttpParams;)V" />
+ <method name="createHttpDataReceiver(Ljava/net/Socket;ILorg/apache/http/params/HttpParams;)Lorg/apache/http/io/SessionInputBuffer;" />
+ <method name="createHttpDataTransmitter(Ljava/net/Socket;ILorg/apache/http/params/HttpParams;)Lorg/apache/http/io/SessionOutputBuffer;" />
+ <method name="getSocket()Ljava/net/Socket;" />
+ </class>
+ <class name="org/apache/http/impl/auth/AuthSchemeBase" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/auth/AuthScheme" />
+ <method name="&lt;init>()V" />
+ <method name="isProxy()Z" />
+ <method name="parseChallenge(Lorg/apache/http/util/CharArrayBuffer;II)V" />
+ </class>
+ <class name="org/apache/http/impl/auth/BasicScheme" since="1">
+ <extends name="org/apache/http/impl/auth/RFC2617Scheme" />
+ <method name="&lt;init>()V" />
+ <method name="authenticate(Lorg/apache/http/auth/Credentials;Ljava/lang/String;Z)Lorg/apache/http/Header;" />
+ </class>
+ <class name="org/apache/http/impl/auth/BasicSchemeFactory" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/auth/AuthSchemeFactory" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/auth/DigestScheme" since="1">
+ <extends name="org/apache/http/impl/auth/RFC2617Scheme" />
+ <method name="&lt;init>()V" />
+ <method name="createCnonce()Ljava/lang/String;" />
+ <method name="overrideParamter(Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="org/apache/http/impl/auth/DigestSchemeFactory" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/auth/AuthSchemeFactory" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/auth/NTLMEngine" since="1">
+ <extends name="java/lang/Object" />
+ <method name="generateType1Msg(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="generateType3Msg(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ </class>
+ <class name="org/apache/http/impl/auth/NTLMEngineException" since="1">
+ <extends name="org/apache/http/auth/AuthenticationException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="org/apache/http/impl/auth/NTLMScheme" since="1">
+ <extends name="org/apache/http/impl/auth/AuthSchemeBase" />
+ <method name="&lt;init>(Lorg/apache/http/impl/auth/NTLMEngine;)V" />
+ </class>
+ <class name="org/apache/http/impl/auth/RFC2617Scheme" since="1">
+ <extends name="org/apache/http/impl/auth/AuthSchemeBase" />
+ <method name="&lt;init>()V" />
+ <method name="getParameters()Ljava/util/Map;" />
+ </class>
+ <class name="org/apache/http/impl/auth/UnsupportedDigestAlgorithmException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="org/apache/http/impl/client/AbstractAuthenticationHandler" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/client/AuthenticationHandler" />
+ <method name="&lt;init>()V" />
+ <method name="getAuthPreferences()Ljava/util/List;" />
+ <method name="parseChallenges([Lorg/apache/http/Header;)Ljava/util/Map;" />
+ </class>
+ <class name="org/apache/http/impl/client/AbstractHttpClient" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/client/HttpClient" />
+ <method name="&lt;init>(Lorg/apache/http/conn/ClientConnectionManager;Lorg/apache/http/params/HttpParams;)V" />
+ <method name="addRequestInterceptor(Lorg/apache/http/HttpRequestInterceptor;)V" />
+ <method name="addRequestInterceptor(Lorg/apache/http/HttpRequestInterceptor;I)V" />
+ <method name="addResponseInterceptor(Lorg/apache/http/HttpResponseInterceptor;)V" />
+ <method name="addResponseInterceptor(Lorg/apache/http/HttpResponseInterceptor;I)V" />
+ <method name="clearRequestInterceptors()V" />
+ <method name="clearResponseInterceptors()V" />
+ <method name="createAuthSchemeRegistry()Lorg/apache/http/auth/AuthSchemeRegistry;" />
+ <method name="createClientConnectionManager()Lorg/apache/http/conn/ClientConnectionManager;" />
+ <method name="createClientRequestDirector(Lorg/apache/http/protocol/HttpRequestExecutor;Lorg/apache/http/conn/ClientConnectionManager;Lorg/apache/http/ConnectionReuseStrategy;Lorg/apache/http/conn/ConnectionKeepAliveStrategy;Lorg/apache/http/conn/routing/HttpRoutePlanner;Lorg/apache/http/protocol/HttpProcessor;Lorg/apache/http/client/HttpRequestRetryHandler;Lorg/apache/http/client/RedirectHandler;Lorg/apache/http/client/AuthenticationHandler;Lorg/apache/http/client/AuthenticationHandler;Lorg/apache/http/client/UserTokenHandler;Lorg/apache/http/params/HttpParams;)Lorg/apache/http/client/RequestDirector;" />
+ <method name="createConnectionKeepAliveStrategy()Lorg/apache/http/conn/ConnectionKeepAliveStrategy;" />
+ <method name="createConnectionReuseStrategy()Lorg/apache/http/ConnectionReuseStrategy;" />
+ <method name="createCookieSpecRegistry()Lorg/apache/http/cookie/CookieSpecRegistry;" />
+ <method name="createCookieStore()Lorg/apache/http/client/CookieStore;" />
+ <method name="createCredentialsProvider()Lorg/apache/http/client/CredentialsProvider;" />
+ <method name="createHttpContext()Lorg/apache/http/protocol/HttpContext;" />
+ <method name="createHttpParams()Lorg/apache/http/params/HttpParams;" />
+ <method name="createHttpProcessor()Lorg/apache/http/protocol/BasicHttpProcessor;" />
+ <method name="createHttpRequestRetryHandler()Lorg/apache/http/client/HttpRequestRetryHandler;" />
+ <method name="createHttpRoutePlanner()Lorg/apache/http/conn/routing/HttpRoutePlanner;" />
+ <method name="createProxyAuthenticationHandler()Lorg/apache/http/client/AuthenticationHandler;" />
+ <method name="createRedirectHandler()Lorg/apache/http/client/RedirectHandler;" />
+ <method name="createRequestExecutor()Lorg/apache/http/protocol/HttpRequestExecutor;" />
+ <method name="createTargetAuthenticationHandler()Lorg/apache/http/client/AuthenticationHandler;" />
+ <method name="createUserTokenHandler()Lorg/apache/http/client/UserTokenHandler;" />
+ <method name="determineParams(Lorg/apache/http/HttpRequest;)Lorg/apache/http/params/HttpParams;" />
+ <method name="getAuthSchemes()Lorg/apache/http/auth/AuthSchemeRegistry;" />
+ <method name="getConnectionKeepAliveStrategy()Lorg/apache/http/conn/ConnectionKeepAliveStrategy;" />
+ <method name="getConnectionReuseStrategy()Lorg/apache/http/ConnectionReuseStrategy;" />
+ <method name="getCookieSpecs()Lorg/apache/http/cookie/CookieSpecRegistry;" />
+ <method name="getCookieStore()Lorg/apache/http/client/CookieStore;" />
+ <method name="getCredentialsProvider()Lorg/apache/http/client/CredentialsProvider;" />
+ <method name="getHttpProcessor()Lorg/apache/http/protocol/BasicHttpProcessor;" />
+ <method name="getHttpRequestRetryHandler()Lorg/apache/http/client/HttpRequestRetryHandler;" />
+ <method name="getProxyAuthenticationHandler()Lorg/apache/http/client/AuthenticationHandler;" />
+ <method name="getRedirectHandler()Lorg/apache/http/client/RedirectHandler;" />
+ <method name="getRequestExecutor()Lorg/apache/http/protocol/HttpRequestExecutor;" />
+ <method name="getRequestInterceptor(I)Lorg/apache/http/HttpRequestInterceptor;" />
+ <method name="getRequestInterceptorCount()I" />
+ <method name="getResponseInterceptor(I)Lorg/apache/http/HttpResponseInterceptor;" />
+ <method name="getResponseInterceptorCount()I" />
+ <method name="getRoutePlanner()Lorg/apache/http/conn/routing/HttpRoutePlanner;" />
+ <method name="getTargetAuthenticationHandler()Lorg/apache/http/client/AuthenticationHandler;" />
+ <method name="getUserTokenHandler()Lorg/apache/http/client/UserTokenHandler;" />
+ <method name="removeRequestInterceptorByClass(Ljava/lang/Class;)V" />
+ <method name="removeResponseInterceptorByClass(Ljava/lang/Class;)V" />
+ <method name="setAuthSchemes(Lorg/apache/http/auth/AuthSchemeRegistry;)V" />
+ <method name="setCookieSpecs(Lorg/apache/http/cookie/CookieSpecRegistry;)V" />
+ <method name="setCookieStore(Lorg/apache/http/client/CookieStore;)V" />
+ <method name="setCredentialsProvider(Lorg/apache/http/client/CredentialsProvider;)V" />
+ <method name="setHttpRequestRetryHandler(Lorg/apache/http/client/HttpRequestRetryHandler;)V" />
+ <method name="setKeepAliveStrategy(Lorg/apache/http/conn/ConnectionKeepAliveStrategy;)V" />
+ <method name="setParams(Lorg/apache/http/params/HttpParams;)V" />
+ <method name="setProxyAuthenticationHandler(Lorg/apache/http/client/AuthenticationHandler;)V" />
+ <method name="setRedirectHandler(Lorg/apache/http/client/RedirectHandler;)V" />
+ <method name="setReuseStrategy(Lorg/apache/http/ConnectionReuseStrategy;)V" />
+ <method name="setRoutePlanner(Lorg/apache/http/conn/routing/HttpRoutePlanner;)V" />
+ <method name="setTargetAuthenticationHandler(Lorg/apache/http/client/AuthenticationHandler;)V" />
+ <method name="setUserTokenHandler(Lorg/apache/http/client/UserTokenHandler;)V" />
+ </class>
+ <class name="org/apache/http/impl/client/BasicCookieStore" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/client/CookieStore" />
+ <method name="&lt;init>()V" />
+ <method name="addCookies([Lorg/apache/http/cookie/Cookie;)V" />
+ </class>
+ <class name="org/apache/http/impl/client/BasicCredentialsProvider" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/client/CredentialsProvider" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/client/BasicResponseHandler" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/client/ResponseHandler" />
+ <method name="&lt;init>()V" />
+ <method name="handleResponse(Lorg/apache/http/HttpResponse;)Ljava/lang/String;" />
+ </class>
+ <class name="org/apache/http/impl/client/ClientParamsStack" since="1">
+ <extends name="org/apache/http/params/AbstractHttpParams" />
+ <method name="&lt;init>(Lorg/apache/http/impl/client/ClientParamsStack;)V" />
+ <method name="&lt;init>(Lorg/apache/http/impl/client/ClientParamsStack;Lorg/apache/http/params/HttpParams;Lorg/apache/http/params/HttpParams;Lorg/apache/http/params/HttpParams;Lorg/apache/http/params/HttpParams;)V" />
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;Lorg/apache/http/params/HttpParams;Lorg/apache/http/params/HttpParams;Lorg/apache/http/params/HttpParams;)V" />
+ <method name="getApplicationParams()Lorg/apache/http/params/HttpParams;" />
+ <method name="getClientParams()Lorg/apache/http/params/HttpParams;" />
+ <method name="getOverrideParams()Lorg/apache/http/params/HttpParams;" />
+ <method name="getRequestParams()Lorg/apache/http/params/HttpParams;" />
+ <field name="applicationParams" />
+ <field name="clientParams" />
+ <field name="overrideParams" />
+ <field name="requestParams" />
+ </class>
+ <class name="org/apache/http/impl/client/DefaultConnectionKeepAliveStrategy" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/conn/ConnectionKeepAliveStrategy" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/client/DefaultHttpClient" since="1">
+ <extends name="org/apache/http/impl/client/AbstractHttpClient" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Lorg/apache/http/conn/ClientConnectionManager;Lorg/apache/http/params/HttpParams;)V" />
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;)V" />
+ </class>
+ <class name="org/apache/http/impl/client/DefaultHttpRequestRetryHandler" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/client/HttpRequestRetryHandler" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(IZ)V" />
+ <method name="getRetryCount()I" />
+ <method name="isRequestSentRetryEnabled()Z" />
+ </class>
+ <class name="org/apache/http/impl/client/DefaultProxyAuthenticationHandler" since="1">
+ <extends name="org/apache/http/impl/client/AbstractAuthenticationHandler" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/client/DefaultRedirectHandler" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/client/RedirectHandler" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/client/DefaultRequestDirector" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/client/RequestDirector" />
+ <method name="&lt;init>(Lorg/apache/http/protocol/HttpRequestExecutor;Lorg/apache/http/conn/ClientConnectionManager;Lorg/apache/http/ConnectionReuseStrategy;Lorg/apache/http/conn/ConnectionKeepAliveStrategy;Lorg/apache/http/conn/routing/HttpRoutePlanner;Lorg/apache/http/protocol/HttpProcessor;Lorg/apache/http/client/HttpRequestRetryHandler;Lorg/apache/http/client/RedirectHandler;Lorg/apache/http/client/AuthenticationHandler;Lorg/apache/http/client/AuthenticationHandler;Lorg/apache/http/client/UserTokenHandler;Lorg/apache/http/params/HttpParams;)V" />
+ <method name="createConnectRequest(Lorg/apache/http/conn/routing/HttpRoute;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpRequest;" />
+ <method name="createTunnelToProxy(Lorg/apache/http/conn/routing/HttpRoute;ILorg/apache/http/protocol/HttpContext;)Z" />
+ <method name="createTunnelToTarget(Lorg/apache/http/conn/routing/HttpRoute;Lorg/apache/http/protocol/HttpContext;)Z" />
+ <method name="determineRoute(Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/conn/routing/HttpRoute;" />
+ <method name="establishRoute(Lorg/apache/http/conn/routing/HttpRoute;Lorg/apache/http/protocol/HttpContext;)V" />
+ <method name="handleResponse(Lorg/apache/http/impl/client/RoutedRequest;Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/impl/client/RoutedRequest;" />
+ <method name="releaseConnection()V" />
+ <method name="rewriteRequestURI(Lorg/apache/http/impl/client/RequestWrapper;Lorg/apache/http/conn/routing/HttpRoute;)V" />
+ <field name="connManager" />
+ <field name="httpProcessor" />
+ <field name="keepAliveStrategy" />
+ <field name="managedConn" />
+ <field name="params" />
+ <field name="redirectHandler" />
+ <field name="requestExec" />
+ <field name="retryHandler" />
+ <field name="reuseStrategy" />
+ <field name="routePlanner" />
+ </class>
+ <class name="org/apache/http/impl/client/DefaultTargetAuthenticationHandler" since="1">
+ <extends name="org/apache/http/impl/client/AbstractAuthenticationHandler" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/client/DefaultUserTokenHandler" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/client/UserTokenHandler" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/client/EntityEnclosingRequestWrapper" since="1">
+ <extends name="org/apache/http/impl/client/RequestWrapper" />
+ <implements name="org/apache/http/HttpEntityEnclosingRequest" />
+ <method name="&lt;init>(Lorg/apache/http/HttpEntityEnclosingRequest;)V" />
+ </class>
+ <class name="org/apache/http/impl/client/RedirectLocations" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="add(Ljava/net/URI;)V" />
+ <method name="contains(Ljava/net/URI;)Z" />
+ <method name="remove(Ljava/net/URI;)Z" />
+ </class>
+ <class name="org/apache/http/impl/client/RequestWrapper" since="1">
+ <extends name="org/apache/http/message/AbstractHttpMessage" />
+ <implements name="org/apache/http/client/methods/HttpUriRequest" />
+ <method name="&lt;init>(Lorg/apache/http/HttpRequest;)V" />
+ <method name="getExecCount()I" />
+ <method name="getOriginal()Lorg/apache/http/HttpRequest;" />
+ <method name="incrementExecCount()V" />
+ <method name="isRepeatable()Z" />
+ <method name="resetHeaders()V" />
+ <method name="setMethod(Ljava/lang/String;)V" />
+ <method name="setProtocolVersion(Lorg/apache/http/ProtocolVersion;)V" />
+ <method name="setURI(Ljava/net/URI;)V" />
+ </class>
+ <class name="org/apache/http/impl/client/RoutedRequest" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Lorg/apache/http/impl/client/RequestWrapper;Lorg/apache/http/conn/routing/HttpRoute;)V" />
+ <method name="getRequest()Lorg/apache/http/impl/client/RequestWrapper;" />
+ <method name="getRoute()Lorg/apache/http/conn/routing/HttpRoute;" />
+ <field name="request" />
+ <field name="route" />
+ </class>
+ <class name="org/apache/http/impl/client/TunnelRefusedException" since="1">
+ <extends name="org/apache/http/HttpException" />
+ <method name="&lt;init>(Ljava/lang/String;Lorg/apache/http/HttpResponse;)V" />
+ <method name="getResponse()Lorg/apache/http/HttpResponse;" />
+ </class>
+ <class name="org/apache/http/impl/conn/AbstractClientConnAdapter" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/conn/ManagedClientConnection" />
+ <method name="&lt;init>(Lorg/apache/http/conn/ClientConnectionManager;Lorg/apache/http/conn/OperatedClientConnection;)V" />
+ <method name="assertNotAborted()V" />
+ <method name="assertValid(Lorg/apache/http/conn/OperatedClientConnection;)V" />
+ <method name="detach()V" />
+ <method name="getManager()Lorg/apache/http/conn/ClientConnectionManager;" />
+ <method name="getWrappedConnection()Lorg/apache/http/conn/OperatedClientConnection;" />
+ </class>
+ <class name="org/apache/http/impl/conn/AbstractPoolEntry" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Lorg/apache/http/conn/ClientConnectionOperator;Lorg/apache/http/conn/routing/HttpRoute;)V" />
+ <method name="getState()Ljava/lang/Object;" />
+ <method name="layerProtocol(Lorg/apache/http/protocol/HttpContext;Lorg/apache/http/params/HttpParams;)V" />
+ <method name="open(Lorg/apache/http/conn/routing/HttpRoute;Lorg/apache/http/protocol/HttpContext;Lorg/apache/http/params/HttpParams;)V" />
+ <method name="setState(Ljava/lang/Object;)V" />
+ <method name="shutdownEntry()V" />
+ <method name="tunnelProxy(Lorg/apache/http/HttpHost;ZLorg/apache/http/params/HttpParams;)V" />
+ <method name="tunnelTarget(ZLorg/apache/http/params/HttpParams;)V" />
+ <field name="connOperator" />
+ <field name="connection" />
+ <field name="route" />
+ <field name="state" />
+ <field name="tracker" />
+ </class>
+ <class name="org/apache/http/impl/conn/AbstractPooledConnAdapter" since="1">
+ <extends name="org/apache/http/impl/conn/AbstractClientConnAdapter" />
+ <method name="&lt;init>(Lorg/apache/http/conn/ClientConnectionManager;Lorg/apache/http/impl/conn/AbstractPoolEntry;)V" />
+ <method name="assertAttached()V" />
+ <field name="poolEntry" />
+ </class>
+ <class name="org/apache/http/impl/conn/DefaultClientConnection" since="1">
+ <extends name="org/apache/http/impl/SocketHttpClientConnection" />
+ <implements name="org/apache/http/conn/OperatedClientConnection" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/conn/DefaultClientConnectionOperator" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/conn/ClientConnectionOperator" />
+ <method name="&lt;init>(Lorg/apache/http/conn/scheme/SchemeRegistry;)V" />
+ <method name="prepareSocket(Ljava/net/Socket;Lorg/apache/http/protocol/HttpContext;Lorg/apache/http/params/HttpParams;)V" />
+ <field name="schemeRegistry" />
+ </class>
+ <class name="org/apache/http/impl/conn/DefaultHttpRoutePlanner" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/conn/routing/HttpRoutePlanner" />
+ <method name="&lt;init>(Lorg/apache/http/conn/scheme/SchemeRegistry;)V" />
+ <field name="schemeRegistry" />
+ </class>
+ <class name="org/apache/http/impl/conn/DefaultResponseParser" since="1">
+ <extends name="org/apache/http/impl/io/AbstractMessageParser" />
+ <method name="&lt;init>(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/message/LineParser;Lorg/apache/http/HttpResponseFactory;Lorg/apache/http/params/HttpParams;)V" />
+ </class>
+ <class name="org/apache/http/impl/conn/IdleConnectionHandler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="add(Lorg/apache/http/HttpConnection;JLjava/util/concurrent/TimeUnit;)V" />
+ <method name="closeExpiredConnections()V" />
+ <method name="closeIdleConnections(J)V" />
+ <method name="remove(Lorg/apache/http/HttpConnection;)Z" />
+ <method name="removeAll()V" />
+ </class>
+ <class name="org/apache/http/impl/conn/LoggingSessionInputBuffer" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/io/SessionInputBuffer" />
+ <method name="&lt;init>(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/impl/conn/Wire;)V" />
+ </class>
+ <class name="org/apache/http/impl/conn/LoggingSessionOutputBuffer" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/io/SessionOutputBuffer" />
+ <method name="&lt;init>(Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/impl/conn/Wire;)V" />
+ </class>
+ <class name="org/apache/http/impl/conn/ProxySelectorRoutePlanner" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/conn/routing/HttpRoutePlanner" />
+ <method name="&lt;init>(Lorg/apache/http/conn/scheme/SchemeRegistry;Ljava/net/ProxySelector;)V" />
+ <method name="chooseProxy(Ljava/util/List;Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;Lorg/apache/http/protocol/HttpContext;)Ljava/net/Proxy;" />
+ <method name="determineProxy(Lorg/apache/http/HttpHost;Lorg/apache/http/HttpRequest;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpHost;" />
+ <method name="getHost(Ljava/net/InetSocketAddress;)Ljava/lang/String;" />
+ <method name="getProxySelector()Ljava/net/ProxySelector;" />
+ <method name="setProxySelector(Ljava/net/ProxySelector;)V" />
+ <field name="proxySelector" />
+ <field name="schemeRegistry" />
+ </class>
+ <class name="org/apache/http/impl/conn/SingleClientConnManager" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/conn/ClientConnectionManager" />
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;Lorg/apache/http/conn/scheme/SchemeRegistry;)V" />
+ <method name="assertStillUp()V" />
+ <method name="createConnectionOperator(Lorg/apache/http/conn/scheme/SchemeRegistry;)Lorg/apache/http/conn/ClientConnectionOperator;" />
+ <method name="getConnection(Lorg/apache/http/conn/routing/HttpRoute;Ljava/lang/Object;)Lorg/apache/http/conn/ManagedClientConnection;" />
+ <method name="revokeConnection()V" />
+ <field name="MISUSE_MESSAGE" />
+ <field name="alwaysShutDown" />
+ <field name="connOperator" />
+ <field name="connectionExpiresTime" />
+ <field name="isShutDown" />
+ <field name="lastReleaseTime" />
+ <field name="managedConn" />
+ <field name="schemeRegistry" />
+ <field name="uniquePoolEntry" />
+ </class>
+ <class name="org/apache/http/impl/conn/SingleClientConnManager$ConnAdapter" since="1">
+ <extends name="org/apache/http/impl/conn/AbstractPooledConnAdapter" />
+ <method name="&lt;init>(Lorg/apache/http/impl/conn/SingleClientConnManager;Lorg/apache/http/impl/conn/SingleClientConnManager$PoolEntry;Lorg/apache/http/conn/routing/HttpRoute;)V" />
+ </class>
+ <class name="org/apache/http/impl/conn/SingleClientConnManager$PoolEntry" since="1">
+ <extends name="org/apache/http/impl/conn/AbstractPoolEntry" />
+ <method name="&lt;init>(Lorg/apache/http/impl/conn/SingleClientConnManager;)V" />
+ <method name="close()V" />
+ <method name="shutdown()V" />
+ </class>
+ <class name="org/apache/http/impl/conn/Wire" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Lorg/apache/commons/logging/Log;)V" />
+ <method name="enabled()Z" />
+ <method name="input(I)V" />
+ <method name="input(Ljava/io/InputStream;)V" />
+ <method name="input(Ljava/lang/String;)V" />
+ <method name="input([B)V" />
+ <method name="input([BII)V" />
+ <method name="output(I)V" />
+ <method name="output(Ljava/io/InputStream;)V" />
+ <method name="output(Ljava/lang/String;)V" />
+ <method name="output([B)V" />
+ <method name="output([BII)V" />
+ </class>
+ <class name="org/apache/http/impl/conn/tsccm/AbstractConnPool" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/impl/conn/tsccm/RefQueueHandler" />
+ <method name="&lt;init>()V" />
+ <method name="closeConnection(Lorg/apache/http/conn/OperatedClientConnection;)V" />
+ <method name="closeExpiredConnections()V" />
+ <method name="closeIdleConnections(JLjava/util/concurrent/TimeUnit;)V" />
+ <method name="deleteClosedConnections()V" />
+ <method name="enableConnectionGC()V" />
+ <method name="freeEntry(Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;ZJLjava/util/concurrent/TimeUnit;)V" />
+ <method name="getEntry(Lorg/apache/http/conn/routing/HttpRoute;Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;)Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;" />
+ <method name="handleLostEntry(Lorg/apache/http/conn/routing/HttpRoute;)V" />
+ <method name="requestPoolEntry(Lorg/apache/http/conn/routing/HttpRoute;Ljava/lang/Object;)Lorg/apache/http/impl/conn/tsccm/PoolEntryRequest;" />
+ <method name="shutdown()V" />
+ <field name="idleConnHandler" />
+ <field name="isShutDown" />
+ <field name="issuedConnections" />
+ <field name="numConnections" />
+ <field name="poolLock" />
+ <field name="refQueue" />
+ </class>
+ <class name="org/apache/http/impl/conn/tsccm/BasicPoolEntry" since="1">
+ <extends name="org/apache/http/impl/conn/AbstractPoolEntry" />
+ <method name="&lt;init>(Lorg/apache/http/conn/ClientConnectionOperator;Lorg/apache/http/conn/routing/HttpRoute;Ljava/lang/ref/ReferenceQueue;)V" />
+ <method name="getConnection()Lorg/apache/http/conn/OperatedClientConnection;" />
+ <method name="getPlannedRoute()Lorg/apache/http/conn/routing/HttpRoute;" />
+ <method name="getWeakRef()Lorg/apache/http/impl/conn/tsccm/BasicPoolEntryRef;" />
+ </class>
+ <class name="org/apache/http/impl/conn/tsccm/BasicPoolEntryRef" since="1">
+ <extends name="java/lang/ref/WeakReference" />
+ <method name="&lt;init>(Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;Ljava/lang/ref/ReferenceQueue;)V" />
+ <method name="getRoute()Lorg/apache/http/conn/routing/HttpRoute;" />
+ </class>
+ <class name="org/apache/http/impl/conn/tsccm/BasicPooledConnAdapter" since="1">
+ <extends name="org/apache/http/impl/conn/AbstractPooledConnAdapter" />
+ <method name="&lt;init>(Lorg/apache/http/impl/conn/tsccm/ThreadSafeClientConnManager;Lorg/apache/http/impl/conn/AbstractPoolEntry;)V" />
+ <method name="getPoolEntry()Lorg/apache/http/impl/conn/AbstractPoolEntry;" />
+ </class>
+ <class name="org/apache/http/impl/conn/tsccm/ConnPoolByRoute" since="1">
+ <extends name="org/apache/http/impl/conn/tsccm/AbstractConnPool" />
+ <method name="&lt;init>(Lorg/apache/http/conn/ClientConnectionOperator;Lorg/apache/http/params/HttpParams;)V" />
+ <method name="createEntry(Lorg/apache/http/impl/conn/tsccm/RouteSpecificPool;Lorg/apache/http/conn/ClientConnectionOperator;)Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;" />
+ <method name="createFreeConnQueue()Ljava/util/Queue;" />
+ <method name="createRouteToPoolMap()Ljava/util/Map;" />
+ <method name="createWaitingThreadQueue()Ljava/util/Queue;" />
+ <method name="deleteEntry(Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;)V" />
+ <method name="deleteLeastUsedEntry()V" />
+ <method name="getConnectionsInPool(Lorg/apache/http/conn/routing/HttpRoute;)I" />
+ <method name="getEntryBlocking(Lorg/apache/http/conn/routing/HttpRoute;Ljava/lang/Object;JLjava/util/concurrent/TimeUnit;Lorg/apache/http/impl/conn/tsccm/WaitingThreadAborter;)Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;" />
+ <method name="getFreeEntry(Lorg/apache/http/impl/conn/tsccm/RouteSpecificPool;Ljava/lang/Object;)Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;" />
+ <method name="getRoutePool(Lorg/apache/http/conn/routing/HttpRoute;Z)Lorg/apache/http/impl/conn/tsccm/RouteSpecificPool;" />
+ <method name="newRouteSpecificPool(Lorg/apache/http/conn/routing/HttpRoute;)Lorg/apache/http/impl/conn/tsccm/RouteSpecificPool;" />
+ <method name="newWaitingThread(Ljava/util/concurrent/locks/Condition;Lorg/apache/http/impl/conn/tsccm/RouteSpecificPool;)Lorg/apache/http/impl/conn/tsccm/WaitingThread;" />
+ <method name="notifyWaitingThread(Lorg/apache/http/impl/conn/tsccm/RouteSpecificPool;)V" />
+ <field name="freeConnections" />
+ <field name="maxTotalConnections" />
+ <field name="operator" />
+ <field name="routeToPool" />
+ <field name="waitingThreads" />
+ </class>
+ <class name="org/apache/http/impl/conn/tsccm/PoolEntryRequest" since="1">
+ <extends name="java/lang/Object" />
+ <method name="abortRequest()V" />
+ <method name="getPoolEntry(JLjava/util/concurrent/TimeUnit;)Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;" />
+ </class>
+ <class name="org/apache/http/impl/conn/tsccm/RefQueueHandler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="handleReference(Ljava/lang/ref/Reference;)V" />
+ </class>
+ <class name="org/apache/http/impl/conn/tsccm/RefQueueWorker" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Runnable" />
+ <method name="&lt;init>(Ljava/lang/ref/ReferenceQueue;Lorg/apache/http/impl/conn/tsccm/RefQueueHandler;)V" />
+ <method name="shutdown()V" />
+ <field name="refHandler" />
+ <field name="refQueue" />
+ <field name="workerThread" />
+ </class>
+ <class name="org/apache/http/impl/conn/tsccm/RouteSpecificPool" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Lorg/apache/http/conn/routing/HttpRoute;I)V" />
+ <method name="allocEntry(Ljava/lang/Object;)Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;" />
+ <method name="createdEntry(Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;)V" />
+ <method name="deleteEntry(Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;)Z" />
+ <method name="dropEntry()V" />
+ <method name="freeEntry(Lorg/apache/http/impl/conn/tsccm/BasicPoolEntry;)V" />
+ <method name="getCapacity()I" />
+ <method name="getEntryCount()I" />
+ <method name="getMaxEntries()I" />
+ <method name="getRoute()Lorg/apache/http/conn/routing/HttpRoute;" />
+ <method name="hasThread()Z" />
+ <method name="isUnused()Z" />
+ <method name="nextThread()Lorg/apache/http/impl/conn/tsccm/WaitingThread;" />
+ <method name="queueThread(Lorg/apache/http/impl/conn/tsccm/WaitingThread;)V" />
+ <method name="removeThread(Lorg/apache/http/impl/conn/tsccm/WaitingThread;)V" />
+ <field name="freeEntries" />
+ <field name="maxEntries" />
+ <field name="numEntries" />
+ <field name="route" />
+ <field name="waitingThreads" />
+ </class>
+ <class name="org/apache/http/impl/conn/tsccm/ThreadSafeClientConnManager" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/conn/ClientConnectionManager" />
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;Lorg/apache/http/conn/scheme/SchemeRegistry;)V" />
+ <method name="createConnectionOperator(Lorg/apache/http/conn/scheme/SchemeRegistry;)Lorg/apache/http/conn/ClientConnectionOperator;" />
+ <method name="createConnectionPool(Lorg/apache/http/params/HttpParams;)Lorg/apache/http/impl/conn/tsccm/AbstractConnPool;" />
+ <method name="getConnectionsInPool()I" />
+ <method name="getConnectionsInPool(Lorg/apache/http/conn/routing/HttpRoute;)I" />
+ <field name="connOperator" />
+ <field name="connectionPool" />
+ <field name="schemeRegistry" />
+ </class>
+ <class name="org/apache/http/impl/conn/tsccm/WaitingThread" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/util/concurrent/locks/Condition;Lorg/apache/http/impl/conn/tsccm/RouteSpecificPool;)V" />
+ <method name="await(Ljava/util/Date;)Z" />
+ <method name="getCondition()Ljava/util/concurrent/locks/Condition;" />
+ <method name="getPool()Lorg/apache/http/impl/conn/tsccm/RouteSpecificPool;" />
+ <method name="getThread()Ljava/lang/Thread;" />
+ <method name="interrupt()V" />
+ <method name="wakeup()V" />
+ </class>
+ <class name="org/apache/http/impl/conn/tsccm/WaitingThreadAborter" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="abort()V" />
+ <method name="setWaitingThread(Lorg/apache/http/impl/conn/tsccm/WaitingThread;)V" />
+ </class>
+ <class name="org/apache/http/impl/cookie/AbstractCookieAttributeHandler" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/cookie/CookieAttributeHandler" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/cookie/AbstractCookieSpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/cookie/CookieSpec" />
+ <method name="&lt;init>()V" />
+ <method name="findAttribHandler(Ljava/lang/String;)Lorg/apache/http/cookie/CookieAttributeHandler;" />
+ <method name="getAttribHandler(Ljava/lang/String;)Lorg/apache/http/cookie/CookieAttributeHandler;" />
+ <method name="getAttribHandlers()Ljava/util/Collection;" />
+ <method name="registerAttribHandler(Ljava/lang/String;Lorg/apache/http/cookie/CookieAttributeHandler;)V" />
+ </class>
+ <class name="org/apache/http/impl/cookie/BasicClientCookie" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="org/apache/http/cookie/ClientCookie" />
+ <implements name="org/apache/http/cookie/SetCookie" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="setAttribute(Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="org/apache/http/impl/cookie/BasicClientCookie2" since="1">
+ <extends name="org/apache/http/impl/cookie/BasicClientCookie" />
+ <implements name="org/apache/http/cookie/SetCookie2" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="org/apache/http/impl/cookie/BasicCommentHandler" since="1">
+ <extends name="org/apache/http/impl/cookie/AbstractCookieAttributeHandler" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/cookie/BasicDomainHandler" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/cookie/CookieAttributeHandler" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/cookie/BasicExpiresHandler" since="1">
+ <extends name="org/apache/http/impl/cookie/AbstractCookieAttributeHandler" />
+ <method name="&lt;init>([Ljava/lang/String;)V" />
+ </class>
+ <class name="org/apache/http/impl/cookie/BasicMaxAgeHandler" since="1">
+ <extends name="org/apache/http/impl/cookie/AbstractCookieAttributeHandler" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/cookie/BasicPathHandler" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/cookie/CookieAttributeHandler" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/cookie/BasicSecureHandler" since="1">
+ <extends name="org/apache/http/impl/cookie/AbstractCookieAttributeHandler" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/cookie/BestMatchSpec" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/cookie/CookieSpec" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>([Ljava/lang/String;Z)V" />
+ </class>
+ <class name="org/apache/http/impl/cookie/BestMatchSpecFactory" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/cookie/CookieSpecFactory" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/cookie/BrowserCompatSpec" since="1">
+ <extends name="org/apache/http/impl/cookie/CookieSpecBase" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>([Ljava/lang/String;)V" />
+ <field name="DATE_PATTERNS" />
+ </class>
+ <class name="org/apache/http/impl/cookie/BrowserCompatSpecFactory" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/cookie/CookieSpecFactory" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/cookie/CookieSpecBase" since="1">
+ <extends name="org/apache/http/impl/cookie/AbstractCookieSpec" />
+ <method name="&lt;init>()V" />
+ <method name="getDefaultDomain(Lorg/apache/http/cookie/CookieOrigin;)Ljava/lang/String;" />
+ <method name="getDefaultPath(Lorg/apache/http/cookie/CookieOrigin;)Ljava/lang/String;" />
+ <method name="parse([Lorg/apache/http/HeaderElement;Lorg/apache/http/cookie/CookieOrigin;)Ljava/util/List;" />
+ </class>
+ <class name="org/apache/http/impl/cookie/DateParseException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="org/apache/http/impl/cookie/DateUtils" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="formatDate(Ljava/util/Date;)Ljava/lang/String;" />
+ <method name="formatDate(Ljava/util/Date;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="parseDate(Ljava/lang/String;)Ljava/util/Date;" />
+ <method name="parseDate(Ljava/lang/String;[Ljava/lang/String;)Ljava/util/Date;" />
+ <method name="parseDate(Ljava/lang/String;[Ljava/lang/String;Ljava/util/Date;)Ljava/util/Date;" />
+ <field name="GMT" />
+ <field name="PATTERN_ASCTIME" />
+ <field name="PATTERN_RFC1036" />
+ <field name="PATTERN_RFC1123" />
+ </class>
+ <class name="org/apache/http/impl/cookie/NetscapeDomainHandler" since="1">
+ <extends name="org/apache/http/impl/cookie/BasicDomainHandler" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/cookie/NetscapeDraftHeaderParser" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="parseHeader(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)Lorg/apache/http/HeaderElement;" />
+ <field name="DEFAULT" />
+ </class>
+ <class name="org/apache/http/impl/cookie/NetscapeDraftSpec" since="1">
+ <extends name="org/apache/http/impl/cookie/CookieSpecBase" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>([Ljava/lang/String;)V" />
+ <field name="EXPIRES_PATTERN" />
+ </class>
+ <class name="org/apache/http/impl/cookie/NetscapeDraftSpecFactory" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/cookie/CookieSpecFactory" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/cookie/RFC2109DomainHandler" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/cookie/CookieAttributeHandler" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/cookie/RFC2109Spec" since="1">
+ <extends name="org/apache/http/impl/cookie/CookieSpecBase" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>([Ljava/lang/String;Z)V" />
+ <method name="formatCookieAsVer(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/cookie/Cookie;I)V" />
+ <method name="formatParamAsVer(Lorg/apache/http/util/CharArrayBuffer;Ljava/lang/String;Ljava/lang/String;I)V" />
+ </class>
+ <class name="org/apache/http/impl/cookie/RFC2109SpecFactory" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/cookie/CookieSpecFactory" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/cookie/RFC2109VersionHandler" since="1">
+ <extends name="org/apache/http/impl/cookie/AbstractCookieAttributeHandler" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/cookie/RFC2965CommentUrlAttributeHandler" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/cookie/CookieAttributeHandler" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/cookie/RFC2965DiscardAttributeHandler" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/cookie/CookieAttributeHandler" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/cookie/RFC2965DomainAttributeHandler" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/cookie/CookieAttributeHandler" />
+ <method name="&lt;init>()V" />
+ <method name="domainMatch(Ljava/lang/String;Ljava/lang/String;)Z" />
+ </class>
+ <class name="org/apache/http/impl/cookie/RFC2965PortAttributeHandler" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/cookie/CookieAttributeHandler" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/cookie/RFC2965Spec" since="1">
+ <extends name="org/apache/http/impl/cookie/RFC2109Spec" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>([Ljava/lang/String;Z)V" />
+ </class>
+ <class name="org/apache/http/impl/cookie/RFC2965SpecFactory" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/cookie/CookieSpecFactory" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/cookie/RFC2965VersionAttributeHandler" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/cookie/CookieAttributeHandler" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/entity/EntityDeserializer" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Lorg/apache/http/entity/ContentLengthStrategy;)V" />
+ <method name="deserialize(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/HttpMessage;)Lorg/apache/http/HttpEntity;" />
+ <method name="doDeserialize(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/HttpMessage;)Lorg/apache/http/entity/BasicHttpEntity;" />
+ </class>
+ <class name="org/apache/http/impl/entity/EntitySerializer" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Lorg/apache/http/entity/ContentLengthStrategy;)V" />
+ <method name="doSerialize(Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/HttpMessage;)Ljava/io/OutputStream;" />
+ <method name="serialize(Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/HttpMessage;Lorg/apache/http/HttpEntity;)V" />
+ </class>
+ <class name="org/apache/http/impl/entity/LaxContentLengthStrategy" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/entity/ContentLengthStrategy" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/entity/StrictContentLengthStrategy" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/entity/ContentLengthStrategy" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/impl/io/AbstractMessageParser" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/io/HttpMessageParser" />
+ <method name="&lt;init>(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/message/LineParser;Lorg/apache/http/params/HttpParams;)V" />
+ <method name="parseHead(Lorg/apache/http/io/SessionInputBuffer;)Lorg/apache/http/HttpMessage;" />
+ <method name="parseHeaders(Lorg/apache/http/io/SessionInputBuffer;IILorg/apache/http/message/LineParser;)[Lorg/apache/http/Header;" />
+ <field name="lineParser" />
+ </class>
+ <class name="org/apache/http/impl/io/AbstractMessageWriter" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/io/HttpMessageWriter" />
+ <method name="&lt;init>(Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/message/LineFormatter;Lorg/apache/http/params/HttpParams;)V" />
+ <method name="writeHeadLine(Lorg/apache/http/HttpMessage;)V" />
+ <field name="lineBuf" />
+ <field name="lineFormatter" />
+ <field name="sessionBuffer" />
+ </class>
+ <class name="org/apache/http/impl/io/AbstractSessionInputBuffer" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/io/SessionInputBuffer" />
+ <method name="&lt;init>()V" />
+ <method name="fillBuffer()I" />
+ <method name="hasBufferedData()Z" />
+ <method name="init(Ljava/io/InputStream;ILorg/apache/http/params/HttpParams;)V" />
+ </class>
+ <class name="org/apache/http/impl/io/AbstractSessionOutputBuffer" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/io/SessionOutputBuffer" />
+ <method name="&lt;init>()V" />
+ <method name="flushBuffer()V" />
+ <method name="init(Ljava/io/OutputStream;ILorg/apache/http/params/HttpParams;)V" />
+ </class>
+ <class name="org/apache/http/impl/io/ChunkedInputStream" since="1">
+ <extends name="java/io/InputStream" />
+ <method name="&lt;init>(Lorg/apache/http/io/SessionInputBuffer;)V" />
+ <method name="getFooters()[Lorg/apache/http/Header;" />
+ </class>
+ <class name="org/apache/http/impl/io/ChunkedOutputStream" since="1">
+ <extends name="java/io/OutputStream" />
+ <method name="&lt;init>(Lorg/apache/http/io/SessionOutputBuffer;)V" />
+ <method name="&lt;init>(Lorg/apache/http/io/SessionOutputBuffer;I)V" />
+ <method name="finish()V" />
+ <method name="flushCache()V" />
+ <method name="flushCacheWithAppend([BII)V" />
+ <method name="writeClosingChunk()V" />
+ </class>
+ <class name="org/apache/http/impl/io/ContentLengthInputStream" since="1">
+ <extends name="java/io/InputStream" />
+ <method name="&lt;init>(Lorg/apache/http/io/SessionInputBuffer;J)V" />
+ </class>
+ <class name="org/apache/http/impl/io/ContentLengthOutputStream" since="1">
+ <extends name="java/io/OutputStream" />
+ <method name="&lt;init>(Lorg/apache/http/io/SessionOutputBuffer;J)V" />
+ </class>
+ <class name="org/apache/http/impl/io/HttpRequestParser" since="1">
+ <extends name="org/apache/http/impl/io/AbstractMessageParser" />
+ <method name="&lt;init>(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/message/LineParser;Lorg/apache/http/HttpRequestFactory;Lorg/apache/http/params/HttpParams;)V" />
+ </class>
+ <class name="org/apache/http/impl/io/HttpRequestWriter" since="1">
+ <extends name="org/apache/http/impl/io/AbstractMessageWriter" />
+ <method name="&lt;init>(Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/message/LineFormatter;Lorg/apache/http/params/HttpParams;)V" />
+ </class>
+ <class name="org/apache/http/impl/io/HttpResponseParser" since="1">
+ <extends name="org/apache/http/impl/io/AbstractMessageParser" />
+ <method name="&lt;init>(Lorg/apache/http/io/SessionInputBuffer;Lorg/apache/http/message/LineParser;Lorg/apache/http/HttpResponseFactory;Lorg/apache/http/params/HttpParams;)V" />
+ </class>
+ <class name="org/apache/http/impl/io/HttpResponseWriter" since="1">
+ <extends name="org/apache/http/impl/io/AbstractMessageWriter" />
+ <method name="&lt;init>(Lorg/apache/http/io/SessionOutputBuffer;Lorg/apache/http/message/LineFormatter;Lorg/apache/http/params/HttpParams;)V" />
+ </class>
+ <class name="org/apache/http/impl/io/HttpTransportMetricsImpl" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/io/HttpTransportMetrics" />
+ <method name="&lt;init>()V" />
+ <method name="incrementBytesTransferred(J)V" />
+ <method name="setBytesTransferred(J)V" />
+ </class>
+ <class name="org/apache/http/impl/io/IdentityInputStream" since="1">
+ <extends name="java/io/InputStream" />
+ <method name="&lt;init>(Lorg/apache/http/io/SessionInputBuffer;)V" />
+ </class>
+ <class name="org/apache/http/impl/io/IdentityOutputStream" since="1">
+ <extends name="java/io/OutputStream" />
+ <method name="&lt;init>(Lorg/apache/http/io/SessionOutputBuffer;)V" />
+ </class>
+ <class name="org/apache/http/impl/io/SocketInputBuffer" since="1">
+ <extends name="org/apache/http/impl/io/AbstractSessionInputBuffer" />
+ <method name="&lt;init>(Ljava/net/Socket;ILorg/apache/http/params/HttpParams;)V" />
+ </class>
+ <class name="org/apache/http/impl/io/SocketOutputBuffer" since="1">
+ <extends name="org/apache/http/impl/io/AbstractSessionOutputBuffer" />
+ <method name="&lt;init>(Ljava/net/Socket;ILorg/apache/http/params/HttpParams;)V" />
+ </class>
+ <class name="org/apache/http/io/HttpMessageParser" since="1">
+ <extends name="java/lang/Object" />
+ <method name="parse()Lorg/apache/http/HttpMessage;" />
+ </class>
+ <class name="org/apache/http/io/HttpMessageWriter" since="1">
+ <extends name="java/lang/Object" />
+ <method name="write(Lorg/apache/http/HttpMessage;)V" />
+ </class>
+ <class name="org/apache/http/io/HttpTransportMetrics" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getBytesTransferred()J" />
+ <method name="reset()V" />
+ </class>
+ <class name="org/apache/http/io/SessionInputBuffer" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getMetrics()Lorg/apache/http/io/HttpTransportMetrics;" />
+ <method name="isDataAvailable(I)Z" />
+ <method name="read()I" />
+ <method name="read([B)I" />
+ <method name="read([BII)I" />
+ <method name="readLine()Ljava/lang/String;" />
+ <method name="readLine(Lorg/apache/http/util/CharArrayBuffer;)I" />
+ </class>
+ <class name="org/apache/http/io/SessionOutputBuffer" since="1">
+ <extends name="java/lang/Object" />
+ <method name="flush()V" />
+ <method name="getMetrics()Lorg/apache/http/io/HttpTransportMetrics;" />
+ <method name="write(I)V" />
+ <method name="write([B)V" />
+ <method name="write([BII)V" />
+ <method name="writeLine(Ljava/lang/String;)V" />
+ <method name="writeLine(Lorg/apache/http/util/CharArrayBuffer;)V" />
+ </class>
+ <class name="org/apache/http/message/AbstractHttpMessage" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpMessage" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;)V" />
+ <field name="headergroup" />
+ <field name="params" />
+ </class>
+ <class name="org/apache/http/message/BasicHeader" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="org/apache/http/Header" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="org/apache/http/message/BasicHeaderElement" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="org/apache/http/HeaderElement" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;[Lorg/apache/http/NameValuePair;)V" />
+ </class>
+ <class name="org/apache/http/message/BasicHeaderElementIterator" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HeaderElementIterator" />
+ <method name="&lt;init>(Lorg/apache/http/HeaderIterator;)V" />
+ <method name="&lt;init>(Lorg/apache/http/HeaderIterator;Lorg/apache/http/message/HeaderValueParser;)V" />
+ </class>
+ <class name="org/apache/http/message/BasicHeaderIterator" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HeaderIterator" />
+ <method name="&lt;init>([Lorg/apache/http/Header;Ljava/lang/String;)V" />
+ <method name="filterHeader(I)Z" />
+ <method name="findNext(I)I" />
+ <field name="allHeaders" />
+ <field name="currentIndex" />
+ <field name="headerName" />
+ </class>
+ <class name="org/apache/http/message/BasicHeaderValueFormatter" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/message/HeaderValueFormatter" />
+ <method name="&lt;init>()V" />
+ <method name="doFormatValue(Lorg/apache/http/util/CharArrayBuffer;Ljava/lang/String;Z)V" />
+ <method name="estimateElementsLen([Lorg/apache/http/HeaderElement;)I" />
+ <method name="estimateHeaderElementLen(Lorg/apache/http/HeaderElement;)I" />
+ <method name="estimateNameValuePairLen(Lorg/apache/http/NameValuePair;)I" />
+ <method name="estimateParametersLen([Lorg/apache/http/NameValuePair;)I" />
+ <method name="formatElements([Lorg/apache/http/HeaderElement;ZLorg/apache/http/message/HeaderValueFormatter;)Ljava/lang/String;" />
+ <method name="formatHeaderElement(Lorg/apache/http/HeaderElement;ZLorg/apache/http/message/HeaderValueFormatter;)Ljava/lang/String;" />
+ <method name="formatNameValuePair(Lorg/apache/http/NameValuePair;ZLorg/apache/http/message/HeaderValueFormatter;)Ljava/lang/String;" />
+ <method name="formatParameters([Lorg/apache/http/NameValuePair;ZLorg/apache/http/message/HeaderValueFormatter;)Ljava/lang/String;" />
+ <method name="isSeparator(C)Z" />
+ <method name="isUnsafe(C)Z" />
+ <field name="DEFAULT" />
+ <field name="SEPARATORS" />
+ <field name="UNSAFE_CHARS" />
+ </class>
+ <class name="org/apache/http/message/BasicHeaderValueParser" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/message/HeaderValueParser" />
+ <method name="&lt;init>()V" />
+ <method name="createHeaderElement(Ljava/lang/String;Ljava/lang/String;[Lorg/apache/http/NameValuePair;)Lorg/apache/http/HeaderElement;" />
+ <method name="createNameValuePair(Ljava/lang/String;Ljava/lang/String;)Lorg/apache/http/NameValuePair;" />
+ <method name="parseElements(Ljava/lang/String;Lorg/apache/http/message/HeaderValueParser;)[Lorg/apache/http/HeaderElement;" />
+ <method name="parseHeaderElement(Ljava/lang/String;Lorg/apache/http/message/HeaderValueParser;)Lorg/apache/http/HeaderElement;" />
+ <method name="parseNameValuePair(Ljava/lang/String;Lorg/apache/http/message/HeaderValueParser;)Lorg/apache/http/NameValuePair;" />
+ <method name="parseNameValuePair(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;[C)Lorg/apache/http/NameValuePair;" />
+ <method name="parseParameters(Ljava/lang/String;Lorg/apache/http/message/HeaderValueParser;)[Lorg/apache/http/NameValuePair;" />
+ <field name="DEFAULT" />
+ </class>
+ <class name="org/apache/http/message/BasicHttpEntityEnclosingRequest" since="1">
+ <extends name="org/apache/http/message/BasicHttpRequest" />
+ <implements name="org/apache/http/HttpEntityEnclosingRequest" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Lorg/apache/http/ProtocolVersion;)V" />
+ <method name="&lt;init>(Lorg/apache/http/RequestLine;)V" />
+ </class>
+ <class name="org/apache/http/message/BasicHttpRequest" since="1">
+ <extends name="org/apache/http/message/AbstractHttpMessage" />
+ <implements name="org/apache/http/HttpRequest" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Lorg/apache/http/ProtocolVersion;)V" />
+ <method name="&lt;init>(Lorg/apache/http/RequestLine;)V" />
+ </class>
+ <class name="org/apache/http/message/BasicHttpResponse" since="1">
+ <extends name="org/apache/http/message/AbstractHttpMessage" />
+ <implements name="org/apache/http/HttpResponse" />
+ <method name="&lt;init>(Lorg/apache/http/ProtocolVersion;ILjava/lang/String;)V" />
+ <method name="&lt;init>(Lorg/apache/http/StatusLine;)V" />
+ <method name="&lt;init>(Lorg/apache/http/StatusLine;Lorg/apache/http/ReasonPhraseCatalog;Ljava/util/Locale;)V" />
+ <method name="getReason(I)Ljava/lang/String;" />
+ </class>
+ <class name="org/apache/http/message/BasicLineFormatter" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/message/LineFormatter" />
+ <method name="&lt;init>()V" />
+ <method name="doFormatHeader(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/Header;)V" />
+ <method name="doFormatRequestLine(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/RequestLine;)V" />
+ <method name="doFormatStatusLine(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/StatusLine;)V" />
+ <method name="estimateProtocolVersionLen(Lorg/apache/http/ProtocolVersion;)I" />
+ <method name="formatHeader(Lorg/apache/http/Header;Lorg/apache/http/message/LineFormatter;)Ljava/lang/String;" />
+ <method name="formatProtocolVersion(Lorg/apache/http/ProtocolVersion;Lorg/apache/http/message/LineFormatter;)Ljava/lang/String;" />
+ <method name="formatRequestLine(Lorg/apache/http/RequestLine;Lorg/apache/http/message/LineFormatter;)Ljava/lang/String;" />
+ <method name="formatStatusLine(Lorg/apache/http/StatusLine;Lorg/apache/http/message/LineFormatter;)Ljava/lang/String;" />
+ <method name="initBuffer(Lorg/apache/http/util/CharArrayBuffer;)Lorg/apache/http/util/CharArrayBuffer;" />
+ <field name="DEFAULT" />
+ </class>
+ <class name="org/apache/http/message/BasicLineParser" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/message/LineParser" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Lorg/apache/http/ProtocolVersion;)V" />
+ <method name="createProtocolVersion(II)Lorg/apache/http/ProtocolVersion;" />
+ <method name="createRequestLine(Ljava/lang/String;Ljava/lang/String;Lorg/apache/http/ProtocolVersion;)Lorg/apache/http/RequestLine;" />
+ <method name="createStatusLine(Lorg/apache/http/ProtocolVersion;ILjava/lang/String;)Lorg/apache/http/StatusLine;" />
+ <method name="parseHeader(Ljava/lang/String;Lorg/apache/http/message/LineParser;)Lorg/apache/http/Header;" />
+ <method name="parseProtocolVersion(Ljava/lang/String;Lorg/apache/http/message/LineParser;)Lorg/apache/http/ProtocolVersion;" />
+ <method name="parseRequestLine(Ljava/lang/String;Lorg/apache/http/message/LineParser;)Lorg/apache/http/RequestLine;" />
+ <method name="parseStatusLine(Ljava/lang/String;Lorg/apache/http/message/LineParser;)Lorg/apache/http/StatusLine;" />
+ <method name="skipWhitespace(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)V" />
+ <field name="DEFAULT" />
+ <field name="protocol" />
+ </class>
+ <class name="org/apache/http/message/BasicListHeaderIterator" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HeaderIterator" />
+ <method name="&lt;init>(Ljava/util/List;Ljava/lang/String;)V" />
+ <method name="filterHeader(I)Z" />
+ <method name="findNext(I)I" />
+ <field name="allHeaders" />
+ <field name="currentIndex" />
+ <field name="headerName" />
+ <field name="lastIndex" />
+ </class>
+ <class name="org/apache/http/message/BasicNameValuePair" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="org/apache/http/NameValuePair" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="org/apache/http/message/BasicRequestLine" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="org/apache/http/RequestLine" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Lorg/apache/http/ProtocolVersion;)V" />
+ </class>
+ <class name="org/apache/http/message/BasicStatusLine" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="org/apache/http/StatusLine" />
+ <method name="&lt;init>(Lorg/apache/http/ProtocolVersion;ILjava/lang/String;)V" />
+ </class>
+ <class name="org/apache/http/message/BasicTokenIterator" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/TokenIterator" />
+ <method name="&lt;init>(Lorg/apache/http/HeaderIterator;)V" />
+ <method name="createToken(Ljava/lang/String;II)Ljava/lang/String;" />
+ <method name="findNext(I)I" />
+ <method name="findTokenEnd(I)I" />
+ <method name="findTokenSeparator(I)I" />
+ <method name="findTokenStart(I)I" />
+ <method name="isHttpSeparator(C)Z" />
+ <method name="isTokenChar(C)Z" />
+ <method name="isTokenSeparator(C)Z" />
+ <method name="isWhitespace(C)Z" />
+ <field name="HTTP_SEPARATORS" />
+ <field name="currentHeader" />
+ <field name="currentToken" />
+ <field name="headerIt" />
+ <field name="searchPos" />
+ </class>
+ <class name="org/apache/http/message/BufferedHeader" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="org/apache/http/FormattedHeader" />
+ <method name="&lt;init>(Lorg/apache/http/util/CharArrayBuffer;)V" />
+ </class>
+ <class name="org/apache/http/message/HeaderGroup" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>()V" />
+ <method name="addHeader(Lorg/apache/http/Header;)V" />
+ <method name="clear()V" />
+ <method name="containsHeader(Ljava/lang/String;)Z" />
+ <method name="copy()Lorg/apache/http/message/HeaderGroup;" />
+ <method name="getAllHeaders()[Lorg/apache/http/Header;" />
+ <method name="getCondensedHeader(Ljava/lang/String;)Lorg/apache/http/Header;" />
+ <method name="getFirstHeader(Ljava/lang/String;)Lorg/apache/http/Header;" />
+ <method name="getHeaders(Ljava/lang/String;)[Lorg/apache/http/Header;" />
+ <method name="getLastHeader(Ljava/lang/String;)Lorg/apache/http/Header;" />
+ <method name="iterator()Lorg/apache/http/HeaderIterator;" />
+ <method name="iterator(Ljava/lang/String;)Lorg/apache/http/HeaderIterator;" />
+ <method name="removeHeader(Lorg/apache/http/Header;)V" />
+ <method name="setHeaders([Lorg/apache/http/Header;)V" />
+ <method name="updateHeader(Lorg/apache/http/Header;)V" />
+ </class>
+ <class name="org/apache/http/message/HeaderValueFormatter" since="1">
+ <extends name="java/lang/Object" />
+ <method name="formatElements(Lorg/apache/http/util/CharArrayBuffer;[Lorg/apache/http/HeaderElement;Z)Lorg/apache/http/util/CharArrayBuffer;" />
+ <method name="formatHeaderElement(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/HeaderElement;Z)Lorg/apache/http/util/CharArrayBuffer;" />
+ <method name="formatNameValuePair(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/NameValuePair;Z)Lorg/apache/http/util/CharArrayBuffer;" />
+ <method name="formatParameters(Lorg/apache/http/util/CharArrayBuffer;[Lorg/apache/http/NameValuePair;Z)Lorg/apache/http/util/CharArrayBuffer;" />
+ </class>
+ <class name="org/apache/http/message/HeaderValueParser" since="1">
+ <extends name="java/lang/Object" />
+ <method name="parseElements(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)[Lorg/apache/http/HeaderElement;" />
+ <method name="parseHeaderElement(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)Lorg/apache/http/HeaderElement;" />
+ <method name="parseNameValuePair(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)Lorg/apache/http/NameValuePair;" />
+ <method name="parseParameters(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)[Lorg/apache/http/NameValuePair;" />
+ </class>
+ <class name="org/apache/http/message/LineFormatter" since="1">
+ <extends name="java/lang/Object" />
+ <method name="appendProtocolVersion(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/ProtocolVersion;)Lorg/apache/http/util/CharArrayBuffer;" />
+ <method name="formatHeader(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/Header;)Lorg/apache/http/util/CharArrayBuffer;" />
+ <method name="formatRequestLine(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/RequestLine;)Lorg/apache/http/util/CharArrayBuffer;" />
+ <method name="formatStatusLine(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/StatusLine;)Lorg/apache/http/util/CharArrayBuffer;" />
+ </class>
+ <class name="org/apache/http/message/LineParser" since="1">
+ <extends name="java/lang/Object" />
+ <method name="hasProtocolVersion(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)Z" />
+ <method name="parseHeader(Lorg/apache/http/util/CharArrayBuffer;)Lorg/apache/http/Header;" />
+ <method name="parseProtocolVersion(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)Lorg/apache/http/ProtocolVersion;" />
+ <method name="parseRequestLine(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)Lorg/apache/http/RequestLine;" />
+ <method name="parseStatusLine(Lorg/apache/http/util/CharArrayBuffer;Lorg/apache/http/message/ParserCursor;)Lorg/apache/http/StatusLine;" />
+ </class>
+ <class name="org/apache/http/message/ParserCursor" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(II)V" />
+ <method name="atEnd()Z" />
+ <method name="getLowerBound()I" />
+ <method name="getPos()I" />
+ <method name="getUpperBound()I" />
+ <method name="updatePos(I)V" />
+ </class>
+ <class name="org/apache/http/params/AbstractHttpParams" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/params/HttpParams" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/params/BasicHttpParams" since="1">
+ <extends name="org/apache/http/params/AbstractHttpParams" />
+ <implements name="java/io/Serializable" />
+ <implements name="java/lang/Cloneable" />
+ <method name="&lt;init>()V" />
+ <method name="clear()V" />
+ <method name="copyParams(Lorg/apache/http/params/HttpParams;)V" />
+ <method name="isParameterSet(Ljava/lang/String;)Z" />
+ <method name="isParameterSetLocally(Ljava/lang/String;)Z" />
+ <method name="setParameters([Ljava/lang/String;Ljava/lang/Object;)V" />
+ </class>
+ <class name="org/apache/http/params/CoreConnectionPNames" since="1">
+ <extends name="java/lang/Object" />
+ <field name="CONNECTION_TIMEOUT" />
+ <field name="MAX_HEADER_COUNT" />
+ <field name="MAX_LINE_LENGTH" />
+ <field name="SOCKET_BUFFER_SIZE" />
+ <field name="SO_LINGER" />
+ <field name="SO_TIMEOUT" />
+ <field name="STALE_CONNECTION_CHECK" />
+ <field name="TCP_NODELAY" />
+ </class>
+ <class name="org/apache/http/params/CoreProtocolPNames" since="1">
+ <extends name="java/lang/Object" />
+ <field name="HTTP_CONTENT_CHARSET" />
+ <field name="HTTP_ELEMENT_CHARSET" />
+ <field name="ORIGIN_SERVER" />
+ <field name="PROTOCOL_VERSION" />
+ <field name="STRICT_TRANSFER_ENCODING" />
+ <field name="USER_AGENT" />
+ <field name="USE_EXPECT_CONTINUE" />
+ <field name="WAIT_FOR_CONTINUE" />
+ </class>
+ <class name="org/apache/http/params/DefaultedHttpParams" since="1">
+ <extends name="org/apache/http/params/AbstractHttpParams" />
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;Lorg/apache/http/params/HttpParams;)V" />
+ <method name="getDefaults()Lorg/apache/http/params/HttpParams;" />
+ </class>
+ <class name="org/apache/http/params/HttpAbstractParamBean" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;)V" />
+ <field name="params" />
+ </class>
+ <class name="org/apache/http/params/HttpConnectionParamBean" since="1">
+ <extends name="org/apache/http/params/HttpAbstractParamBean" />
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;)V" />
+ <method name="setConnectionTimeout(I)V" />
+ <method name="setLinger(I)V" />
+ <method name="setSoTimeout(I)V" />
+ <method name="setSocketBufferSize(I)V" />
+ <method name="setStaleCheckingEnabled(Z)V" />
+ <method name="setTcpNoDelay(Z)V" />
+ </class>
+ <class name="org/apache/http/params/HttpConnectionParams" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/params/CoreConnectionPNames" />
+ <method name="&lt;init>()V" />
+ <method name="getConnectionTimeout(Lorg/apache/http/params/HttpParams;)I" />
+ <method name="getLinger(Lorg/apache/http/params/HttpParams;)I" />
+ <method name="getSoTimeout(Lorg/apache/http/params/HttpParams;)I" />
+ <method name="getSocketBufferSize(Lorg/apache/http/params/HttpParams;)I" />
+ <method name="getTcpNoDelay(Lorg/apache/http/params/HttpParams;)Z" />
+ <method name="isStaleCheckingEnabled(Lorg/apache/http/params/HttpParams;)Z" />
+ <method name="setConnectionTimeout(Lorg/apache/http/params/HttpParams;I)V" />
+ <method name="setLinger(Lorg/apache/http/params/HttpParams;I)V" />
+ <method name="setSoTimeout(Lorg/apache/http/params/HttpParams;I)V" />
+ <method name="setSocketBufferSize(Lorg/apache/http/params/HttpParams;I)V" />
+ <method name="setStaleCheckingEnabled(Lorg/apache/http/params/HttpParams;Z)V" />
+ <method name="setTcpNoDelay(Lorg/apache/http/params/HttpParams;Z)V" />
+ </class>
+ <class name="org/apache/http/params/HttpParams" since="1">
+ <extends name="java/lang/Object" />
+ <method name="copy()Lorg/apache/http/params/HttpParams;" />
+ <method name="getBooleanParameter(Ljava/lang/String;Z)Z" />
+ <method name="getDoubleParameter(Ljava/lang/String;D)D" />
+ <method name="getIntParameter(Ljava/lang/String;I)I" />
+ <method name="getLongParameter(Ljava/lang/String;J)J" />
+ <method name="getParameter(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="isParameterFalse(Ljava/lang/String;)Z" />
+ <method name="isParameterTrue(Ljava/lang/String;)Z" />
+ <method name="removeParameter(Ljava/lang/String;)Z" />
+ <method name="setBooleanParameter(Ljava/lang/String;Z)Lorg/apache/http/params/HttpParams;" />
+ <method name="setDoubleParameter(Ljava/lang/String;D)Lorg/apache/http/params/HttpParams;" />
+ <method name="setIntParameter(Ljava/lang/String;I)Lorg/apache/http/params/HttpParams;" />
+ <method name="setLongParameter(Ljava/lang/String;J)Lorg/apache/http/params/HttpParams;" />
+ <method name="setParameter(Ljava/lang/String;Ljava/lang/Object;)Lorg/apache/http/params/HttpParams;" />
+ </class>
+ <class name="org/apache/http/params/HttpProtocolParamBean" since="1">
+ <extends name="org/apache/http/params/HttpAbstractParamBean" />
+ <method name="&lt;init>(Lorg/apache/http/params/HttpParams;)V" />
+ <method name="setContentCharset(Ljava/lang/String;)V" />
+ <method name="setHttpElementCharset(Ljava/lang/String;)V" />
+ <method name="setUseExpectContinue(Z)V" />
+ <method name="setUserAgent(Ljava/lang/String;)V" />
+ <method name="setVersion(Lorg/apache/http/HttpVersion;)V" />
+ </class>
+ <class name="org/apache/http/params/HttpProtocolParams" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/params/CoreProtocolPNames" />
+ <method name="&lt;init>()V" />
+ <method name="getContentCharset(Lorg/apache/http/params/HttpParams;)Ljava/lang/String;" />
+ <method name="getHttpElementCharset(Lorg/apache/http/params/HttpParams;)Ljava/lang/String;" />
+ <method name="getUserAgent(Lorg/apache/http/params/HttpParams;)Ljava/lang/String;" />
+ <method name="getVersion(Lorg/apache/http/params/HttpParams;)Lorg/apache/http/ProtocolVersion;" />
+ <method name="setContentCharset(Lorg/apache/http/params/HttpParams;Ljava/lang/String;)V" />
+ <method name="setHttpElementCharset(Lorg/apache/http/params/HttpParams;Ljava/lang/String;)V" />
+ <method name="setUseExpectContinue(Lorg/apache/http/params/HttpParams;Z)V" />
+ <method name="setUserAgent(Lorg/apache/http/params/HttpParams;Ljava/lang/String;)V" />
+ <method name="setVersion(Lorg/apache/http/params/HttpParams;Lorg/apache/http/ProtocolVersion;)V" />
+ <method name="useExpectContinue(Lorg/apache/http/params/HttpParams;)Z" />
+ </class>
+ <class name="org/apache/http/protocol/BasicHttpContext" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/protocol/HttpContext" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Lorg/apache/http/protocol/HttpContext;)V" />
+ </class>
+ <class name="org/apache/http/protocol/BasicHttpProcessor" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="java/lang/Cloneable" />
+ <implements name="org/apache/http/protocol/HttpProcessor" />
+ <implements name="org/apache/http/protocol/HttpRequestInterceptorList" />
+ <implements name="org/apache/http/protocol/HttpResponseInterceptorList" />
+ <method name="&lt;init>()V" />
+ <method name="addInterceptor(Lorg/apache/http/HttpRequestInterceptor;)V" />
+ <method name="addInterceptor(Lorg/apache/http/HttpRequestInterceptor;I)V" />
+ <method name="addInterceptor(Lorg/apache/http/HttpResponseInterceptor;)V" />
+ <method name="addInterceptor(Lorg/apache/http/HttpResponseInterceptor;I)V" />
+ <method name="clearInterceptors()V" />
+ <method name="copy()Lorg/apache/http/protocol/BasicHttpProcessor;" />
+ <method name="copyInterceptors(Lorg/apache/http/protocol/BasicHttpProcessor;)V" />
+ <field name="requestInterceptors" />
+ <field name="responseInterceptors" />
+ </class>
+ <class name="org/apache/http/protocol/DefaultedHttpContext" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/protocol/HttpContext" />
+ <method name="&lt;init>(Lorg/apache/http/protocol/HttpContext;Lorg/apache/http/protocol/HttpContext;)V" />
+ <method name="getDefaults()Lorg/apache/http/protocol/HttpContext;" />
+ </class>
+ <class name="org/apache/http/protocol/ExecutionContext" since="1">
+ <extends name="java/lang/Object" />
+ <field name="HTTP_CONNECTION" />
+ <field name="HTTP_PROXY_HOST" />
+ <field name="HTTP_REQUEST" />
+ <field name="HTTP_REQ_SENT" />
+ <field name="HTTP_RESPONSE" />
+ <field name="HTTP_TARGET_HOST" />
+ </class>
+ <class name="org/apache/http/protocol/HTTP" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="isWhitespace(C)Z" />
+ <field name="ASCII" />
+ <field name="CHARSET_PARAM" />
+ <field name="CHUNK_CODING" />
+ <field name="CONN_CLOSE" />
+ <field name="CONN_DIRECTIVE" />
+ <field name="CONN_KEEP_ALIVE" />
+ <field name="CONTENT_ENCODING" />
+ <field name="CONTENT_LEN" />
+ <field name="CONTENT_TYPE" />
+ <field name="CR" />
+ <field name="DATE_HEADER" />
+ <field name="DEFAULT_CONTENT_CHARSET" />
+ <field name="DEFAULT_CONTENT_TYPE" />
+ <field name="DEFAULT_PROTOCOL_CHARSET" />
+ <field name="EXPECT_CONTINUE" />
+ <field name="EXPECT_DIRECTIVE" />
+ <field name="HT" />
+ <field name="IDENTITY_CODING" />
+ <field name="ISO_8859_1" />
+ <field name="LF" />
+ <field name="OCTET_STREAM_TYPE" />
+ <field name="PLAIN_TEXT_TYPE" />
+ <field name="SERVER_HEADER" />
+ <field name="SP" />
+ <field name="TARGET_HOST" />
+ <field name="TRANSFER_ENCODING" />
+ <field name="USER_AGENT" />
+ <field name="US_ASCII" />
+ <field name="UTF_16" />
+ <field name="UTF_8" />
+ </class>
+ <class name="org/apache/http/protocol/HttpContext" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getAttribute(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="removeAttribute(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="setAttribute(Ljava/lang/String;Ljava/lang/Object;)V" />
+ <field name="RESERVED_PREFIX" />
+ </class>
+ <class name="org/apache/http/protocol/HttpDateGenerator" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getCurrentDate()Ljava/lang/String;" />
+ <field name="GMT" />
+ <field name="PATTERN_RFC1123" />
+ </class>
+ <class name="org/apache/http/protocol/HttpExpectationVerifier" since="1">
+ <extends name="java/lang/Object" />
+ <method name="verify(Lorg/apache/http/HttpRequest;Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)V" />
+ </class>
+ <class name="org/apache/http/protocol/HttpProcessor" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpRequestInterceptor" />
+ <implements name="org/apache/http/HttpResponseInterceptor" />
+ </class>
+ <class name="org/apache/http/protocol/HttpRequestExecutor" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="canResponseHaveBody(Lorg/apache/http/HttpRequest;Lorg/apache/http/HttpResponse;)Z" />
+ <method name="doReceiveResponse(Lorg/apache/http/HttpRequest;Lorg/apache/http/HttpClientConnection;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpResponse;" />
+ <method name="doSendRequest(Lorg/apache/http/HttpRequest;Lorg/apache/http/HttpClientConnection;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpResponse;" />
+ <method name="execute(Lorg/apache/http/HttpRequest;Lorg/apache/http/HttpClientConnection;Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpResponse;" />
+ <method name="postProcess(Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpProcessor;Lorg/apache/http/protocol/HttpContext;)V" />
+ <method name="preProcess(Lorg/apache/http/HttpRequest;Lorg/apache/http/protocol/HttpProcessor;Lorg/apache/http/protocol/HttpContext;)V" />
+ </class>
+ <class name="org/apache/http/protocol/HttpRequestHandler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="handle(Lorg/apache/http/HttpRequest;Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)V" />
+ </class>
+ <class name="org/apache/http/protocol/HttpRequestHandlerRegistry" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/protocol/HttpRequestHandlerResolver" />
+ <method name="&lt;init>()V" />
+ <method name="matchUriRequestPattern(Ljava/lang/String;Ljava/lang/String;)Z" />
+ <method name="register(Ljava/lang/String;Lorg/apache/http/protocol/HttpRequestHandler;)V" />
+ <method name="setHandlers(Ljava/util/Map;)V" />
+ <method name="unregister(Ljava/lang/String;)V" />
+ </class>
+ <class name="org/apache/http/protocol/HttpRequestHandlerResolver" since="1">
+ <extends name="java/lang/Object" />
+ <method name="lookup(Ljava/lang/String;)Lorg/apache/http/protocol/HttpRequestHandler;" />
+ </class>
+ <class name="org/apache/http/protocol/HttpRequestInterceptorList" since="1">
+ <extends name="java/lang/Object" />
+ <method name="addRequestInterceptor(Lorg/apache/http/HttpRequestInterceptor;)V" />
+ <method name="addRequestInterceptor(Lorg/apache/http/HttpRequestInterceptor;I)V" />
+ <method name="clearRequestInterceptors()V" />
+ <method name="getRequestInterceptor(I)Lorg/apache/http/HttpRequestInterceptor;" />
+ <method name="getRequestInterceptorCount()I" />
+ <method name="removeRequestInterceptorByClass(Ljava/lang/Class;)V" />
+ <method name="setInterceptors(Ljava/util/List;)V" />
+ </class>
+ <class name="org/apache/http/protocol/HttpResponseInterceptorList" since="1">
+ <extends name="java/lang/Object" />
+ <method name="addResponseInterceptor(Lorg/apache/http/HttpResponseInterceptor;)V" />
+ <method name="addResponseInterceptor(Lorg/apache/http/HttpResponseInterceptor;I)V" />
+ <method name="clearResponseInterceptors()V" />
+ <method name="getResponseInterceptor(I)Lorg/apache/http/HttpResponseInterceptor;" />
+ <method name="getResponseInterceptorCount()I" />
+ <method name="removeResponseInterceptorByClass(Ljava/lang/Class;)V" />
+ <method name="setInterceptors(Ljava/util/List;)V" />
+ </class>
+ <class name="org/apache/http/protocol/HttpService" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Lorg/apache/http/protocol/HttpProcessor;Lorg/apache/http/ConnectionReuseStrategy;Lorg/apache/http/HttpResponseFactory;)V" />
+ <method name="doService(Lorg/apache/http/HttpRequest;Lorg/apache/http/HttpResponse;Lorg/apache/http/protocol/HttpContext;)V" />
+ <method name="getParams()Lorg/apache/http/params/HttpParams;" />
+ <method name="handleException(Lorg/apache/http/HttpException;Lorg/apache/http/HttpResponse;)V" />
+ <method name="handleRequest(Lorg/apache/http/HttpServerConnection;Lorg/apache/http/protocol/HttpContext;)V" />
+ <method name="setConnReuseStrategy(Lorg/apache/http/ConnectionReuseStrategy;)V" />
+ <method name="setExpectationVerifier(Lorg/apache/http/protocol/HttpExpectationVerifier;)V" />
+ <method name="setHandlerResolver(Lorg/apache/http/protocol/HttpRequestHandlerResolver;)V" />
+ <method name="setHttpProcessor(Lorg/apache/http/protocol/HttpProcessor;)V" />
+ <method name="setParams(Lorg/apache/http/params/HttpParams;)V" />
+ <method name="setResponseFactory(Lorg/apache/http/HttpResponseFactory;)V" />
+ </class>
+ <class name="org/apache/http/protocol/RequestConnControl" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpRequestInterceptor" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/protocol/RequestContent" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpRequestInterceptor" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/protocol/RequestDate" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpRequestInterceptor" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/protocol/RequestExpectContinue" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpRequestInterceptor" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/protocol/RequestTargetHost" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpRequestInterceptor" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/protocol/RequestUserAgent" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpRequestInterceptor" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/protocol/ResponseConnControl" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpResponseInterceptor" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/protocol/ResponseContent" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpResponseInterceptor" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/protocol/ResponseDate" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpResponseInterceptor" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/protocol/ResponseServer" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/apache/http/HttpResponseInterceptor" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/apache/http/protocol/SyncBasicHttpContext" since="1">
+ <extends name="org/apache/http/protocol/BasicHttpContext" />
+ <method name="&lt;init>(Lorg/apache/http/protocol/HttpContext;)V" />
+ </class>
+ <class name="org/apache/http/protocol/UriPatternMatcher" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="lookup(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="matchUriRequestPattern(Ljava/lang/String;Ljava/lang/String;)Z" />
+ <method name="register(Ljava/lang/String;Ljava/lang/Object;)V" />
+ <method name="setHandlers(Ljava/util/Map;)V" />
+ <method name="unregister(Ljava/lang/String;)V" />
+ </class>
+ <class name="org/apache/http/util/ByteArrayBuffer" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(I)V" />
+ <method name="append(I)V" />
+ <method name="append(Lorg/apache/http/util/CharArrayBuffer;II)V" />
+ <method name="append([BII)V" />
+ <method name="append([CII)V" />
+ <method name="buffer()[B" />
+ <method name="byteAt(I)I" />
+ <method name="capacity()I" />
+ <method name="clear()V" />
+ <method name="isEmpty()Z" />
+ <method name="isFull()Z" />
+ <method name="length()I" />
+ <method name="setLength(I)V" />
+ <method name="toByteArray()[B" />
+ </class>
+ <class name="org/apache/http/util/CharArrayBuffer" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(I)V" />
+ <method name="append(C)V" />
+ <method name="append(Ljava/lang/Object;)V" />
+ <method name="append(Ljava/lang/String;)V" />
+ <method name="append(Lorg/apache/http/util/ByteArrayBuffer;II)V" />
+ <method name="append(Lorg/apache/http/util/CharArrayBuffer;)V" />
+ <method name="append(Lorg/apache/http/util/CharArrayBuffer;II)V" />
+ <method name="append([BII)V" />
+ <method name="append([CII)V" />
+ <method name="buffer()[C" />
+ <method name="capacity()I" />
+ <method name="charAt(I)C" />
+ <method name="clear()V" />
+ <method name="ensureCapacity(I)V" />
+ <method name="indexOf(I)I" />
+ <method name="indexOf(III)I" />
+ <method name="isEmpty()Z" />
+ <method name="isFull()Z" />
+ <method name="length()I" />
+ <method name="setLength(I)V" />
+ <method name="substring(II)Ljava/lang/String;" />
+ <method name="substringTrimmed(II)Ljava/lang/String;" />
+ <method name="toCharArray()[C" />
+ </class>
+ <class name="org/apache/http/util/EncodingUtils" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getAsciiBytes(Ljava/lang/String;)[B" />
+ <method name="getAsciiString([B)Ljava/lang/String;" />
+ <method name="getAsciiString([BII)Ljava/lang/String;" />
+ <method name="getBytes(Ljava/lang/String;Ljava/lang/String;)[B" />
+ <method name="getString([BIILjava/lang/String;)Ljava/lang/String;" />
+ <method name="getString([BLjava/lang/String;)Ljava/lang/String;" />
+ </class>
+ <class name="org/apache/http/util/EntityUtils" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getContentCharSet(Lorg/apache/http/HttpEntity;)Ljava/lang/String;" />
+ <method name="toByteArray(Lorg/apache/http/HttpEntity;)[B" />
+ <method name="toString(Lorg/apache/http/HttpEntity;)Ljava/lang/String;" />
+ <method name="toString(Lorg/apache/http/HttpEntity;Ljava/lang/String;)Ljava/lang/String;" />
+ </class>
+ <class name="org/apache/http/util/ExceptionUtils" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="initCause(Ljava/lang/Throwable;Ljava/lang/Throwable;)V" />
+ </class>
+ <class name="org/apache/http/util/LangUtils" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="equals(Ljava/lang/Object;Ljava/lang/Object;)Z" />
+ <method name="equals([Ljava/lang/Object;[Ljava/lang/Object;)Z" />
+ <method name="hashCode(II)I" />
+ <method name="hashCode(ILjava/lang/Object;)I" />
+ <method name="hashCode(IZ)I" />
+ <field name="HASH_OFFSET" />
+ <field name="HASH_SEED" />
+ </class>
+ <class name="org/apache/http/util/VersionInfo" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="fromMap(Ljava/lang/String;Ljava/util/Map;Ljava/lang/ClassLoader;)Lorg/apache/http/util/VersionInfo;" />
+ <method name="getClassloader()Ljava/lang/String;" />
+ <method name="getModule()Ljava/lang/String;" />
+ <method name="getPackage()Ljava/lang/String;" />
+ <method name="getRelease()Ljava/lang/String;" />
+ <method name="getTimestamp()Ljava/lang/String;" />
+ <method name="loadVersionInfo(Ljava/lang/String;Ljava/lang/ClassLoader;)Lorg/apache/http/util/VersionInfo;" />
+ <method name="loadVersionInfo([Ljava/lang/String;Ljava/lang/ClassLoader;)[Lorg/apache/http/util/VersionInfo;" />
+ <field name="PROPERTY_MODULE" />
+ <field name="PROPERTY_RELEASE" />
+ <field name="PROPERTY_TIMESTAMP" />
+ <field name="UNAVAILABLE" />
+ <field name="VERSION_PROPERTY_FILE" />
+ </class>
+ <class name="org/json/JSONArray" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/Object;)V" since="19" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/util/Collection;)V" />
+ <method name="&lt;init>(Lorg/json/JSONTokener;)V" />
+ <method name="get(I)Ljava/lang/Object;" />
+ <method name="getBoolean(I)Z" />
+ <method name="getDouble(I)D" />
+ <method name="getInt(I)I" />
+ <method name="getJSONArray(I)Lorg/json/JSONArray;" />
+ <method name="getJSONObject(I)Lorg/json/JSONObject;" />
+ <method name="getLong(I)J" />
+ <method name="getString(I)Ljava/lang/String;" />
+ <method name="isNull(I)Z" />
+ <method name="join(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="length()I" />
+ <method name="opt(I)Ljava/lang/Object;" />
+ <method name="optBoolean(I)Z" />
+ <method name="optBoolean(IZ)Z" />
+ <method name="optDouble(I)D" />
+ <method name="optDouble(ID)D" />
+ <method name="optInt(I)I" />
+ <method name="optInt(II)I" />
+ <method name="optJSONArray(I)Lorg/json/JSONArray;" />
+ <method name="optJSONObject(I)Lorg/json/JSONObject;" />
+ <method name="optLong(I)J" />
+ <method name="optLong(IJ)J" />
+ <method name="optString(I)Ljava/lang/String;" />
+ <method name="optString(ILjava/lang/String;)Ljava/lang/String;" />
+ <method name="put(D)Lorg/json/JSONArray;" />
+ <method name="put(I)Lorg/json/JSONArray;" />
+ <method name="put(ID)Lorg/json/JSONArray;" />
+ <method name="put(II)Lorg/json/JSONArray;" />
+ <method name="put(IJ)Lorg/json/JSONArray;" />
+ <method name="put(ILjava/lang/Object;)Lorg/json/JSONArray;" />
+ <method name="put(IZ)Lorg/json/JSONArray;" />
+ <method name="put(J)Lorg/json/JSONArray;" />
+ <method name="put(Ljava/lang/Object;)Lorg/json/JSONArray;" />
+ <method name="put(Z)Lorg/json/JSONArray;" />
+ <method name="remove(I)Ljava/lang/Object;" since="19" />
+ <method name="toJSONObject(Lorg/json/JSONArray;)Lorg/json/JSONObject;" />
+ <method name="toString(I)Ljava/lang/String;" />
+ </class>
+ <class name="org/json/JSONException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="org/json/JSONObject" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/util/Map;)V" />
+ <method name="&lt;init>(Lorg/json/JSONObject;[Ljava/lang/String;)V" />
+ <method name="&lt;init>(Lorg/json/JSONTokener;)V" />
+ <method name="accumulate(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;" />
+ <method name="get(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="getBoolean(Ljava/lang/String;)Z" />
+ <method name="getDouble(Ljava/lang/String;)D" />
+ <method name="getInt(Ljava/lang/String;)I" />
+ <method name="getJSONArray(Ljava/lang/String;)Lorg/json/JSONArray;" />
+ <method name="getJSONObject(Ljava/lang/String;)Lorg/json/JSONObject;" />
+ <method name="getLong(Ljava/lang/String;)J" />
+ <method name="getString(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="has(Ljava/lang/String;)Z" />
+ <method name="isNull(Ljava/lang/String;)Z" />
+ <method name="keys()Ljava/util/Iterator;" />
+ <method name="length()I" />
+ <method name="names()Lorg/json/JSONArray;" />
+ <method name="numberToString(Ljava/lang/Number;)Ljava/lang/String;" />
+ <method name="opt(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="optBoolean(Ljava/lang/String;)Z" />
+ <method name="optBoolean(Ljava/lang/String;Z)Z" />
+ <method name="optDouble(Ljava/lang/String;)D" />
+ <method name="optDouble(Ljava/lang/String;D)D" />
+ <method name="optInt(Ljava/lang/String;)I" />
+ <method name="optInt(Ljava/lang/String;I)I" />
+ <method name="optJSONArray(Ljava/lang/String;)Lorg/json/JSONArray;" />
+ <method name="optJSONObject(Ljava/lang/String;)Lorg/json/JSONObject;" />
+ <method name="optLong(Ljava/lang/String;)J" />
+ <method name="optLong(Ljava/lang/String;J)J" />
+ <method name="optString(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="optString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="put(Ljava/lang/String;D)Lorg/json/JSONObject;" />
+ <method name="put(Ljava/lang/String;I)Lorg/json/JSONObject;" />
+ <method name="put(Ljava/lang/String;J)Lorg/json/JSONObject;" />
+ <method name="put(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;" />
+ <method name="put(Ljava/lang/String;Z)Lorg/json/JSONObject;" />
+ <method name="putOpt(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;" />
+ <method name="quote(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="remove(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="toJSONArray(Lorg/json/JSONArray;)Lorg/json/JSONArray;" />
+ <method name="toString(I)Ljava/lang/String;" />
+ <method name="wrap(Ljava/lang/Object;)Ljava/lang/Object;" since="19" />
+ <field name="NULL" />
+ </class>
+ <class name="org/json/JSONStringer" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="array()Lorg/json/JSONStringer;" />
+ <method name="endArray()Lorg/json/JSONStringer;" />
+ <method name="endObject()Lorg/json/JSONStringer;" />
+ <method name="key(Ljava/lang/String;)Lorg/json/JSONStringer;" />
+ <method name="object()Lorg/json/JSONStringer;" />
+ <method name="value(D)Lorg/json/JSONStringer;" />
+ <method name="value(J)Lorg/json/JSONStringer;" />
+ <method name="value(Ljava/lang/Object;)Lorg/json/JSONStringer;" />
+ <method name="value(Z)Lorg/json/JSONStringer;" />
+ </class>
+ <class name="org/json/JSONTokener" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="back()V" />
+ <method name="dehexchar(C)I" />
+ <method name="more()Z" />
+ <method name="next()C" />
+ <method name="next(C)C" />
+ <method name="next(I)Ljava/lang/String;" />
+ <method name="nextClean()C" />
+ <method name="nextString(C)Ljava/lang/String;" />
+ <method name="nextTo(C)Ljava/lang/String;" />
+ <method name="nextTo(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="nextValue()Ljava/lang/Object;" />
+ <method name="skipPast(Ljava/lang/String;)V" />
+ <method name="skipTo(C)C" />
+ <method name="syntaxError(Ljava/lang/String;)Lorg/json/JSONException;" />
+ </class>
+ <class name="org/w3c/dom/Attr" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/w3c/dom/Node" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getOwnerElement()Lorg/w3c/dom/Element;" />
+ <method name="getSchemaTypeInfo()Lorg/w3c/dom/TypeInfo;" since="8" />
+ <method name="getSpecified()Z" />
+ <method name="getValue()Ljava/lang/String;" />
+ <method name="isId()Z" since="8" />
+ <method name="setValue(Ljava/lang/String;)V" />
+ </class>
+ <class name="org/w3c/dom/CDATASection" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/w3c/dom/Text" />
+ </class>
+ <class name="org/w3c/dom/CharacterData" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/w3c/dom/Node" />
+ <method name="appendData(Ljava/lang/String;)V" />
+ <method name="deleteData(II)V" />
+ <method name="getData()Ljava/lang/String;" />
+ <method name="getLength()I" />
+ <method name="insertData(ILjava/lang/String;)V" />
+ <method name="replaceData(IILjava/lang/String;)V" />
+ <method name="setData(Ljava/lang/String;)V" />
+ <method name="substringData(II)Ljava/lang/String;" />
+ </class>
+ <class name="org/w3c/dom/Comment" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/w3c/dom/CharacterData" />
+ </class>
+ <class name="org/w3c/dom/DOMConfiguration" since="8">
+ <extends name="java/lang/Object" />
+ <method name="canSetParameter(Ljava/lang/String;Ljava/lang/Object;)Z" />
+ <method name="getParameter(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="getParameterNames()Lorg/w3c/dom/DOMStringList;" />
+ <method name="setParameter(Ljava/lang/String;Ljava/lang/Object;)V" />
+ </class>
+ <class name="org/w3c/dom/DOMError" since="8">
+ <extends name="java/lang/Object" />
+ <method name="getLocation()Lorg/w3c/dom/DOMLocator;" />
+ <method name="getMessage()Ljava/lang/String;" />
+ <method name="getRelatedData()Ljava/lang/Object;" />
+ <method name="getRelatedException()Ljava/lang/Object;" />
+ <method name="getSeverity()S" />
+ <method name="getType()Ljava/lang/String;" />
+ <field name="SEVERITY_ERROR" />
+ <field name="SEVERITY_FATAL_ERROR" />
+ <field name="SEVERITY_WARNING" />
+ </class>
+ <class name="org/w3c/dom/DOMErrorHandler" since="8">
+ <extends name="java/lang/Object" />
+ <method name="handleError(Lorg/w3c/dom/DOMError;)Z" />
+ </class>
+ <class name="org/w3c/dom/DOMException" since="1">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>(SLjava/lang/String;)V" />
+ <field name="DOMSTRING_SIZE_ERR" />
+ <field name="HIERARCHY_REQUEST_ERR" />
+ <field name="INDEX_SIZE_ERR" />
+ <field name="INUSE_ATTRIBUTE_ERR" />
+ <field name="INVALID_ACCESS_ERR" />
+ <field name="INVALID_CHARACTER_ERR" />
+ <field name="INVALID_MODIFICATION_ERR" />
+ <field name="INVALID_STATE_ERR" />
+ <field name="NAMESPACE_ERR" />
+ <field name="NOT_FOUND_ERR" />
+ <field name="NOT_SUPPORTED_ERR" />
+ <field name="NO_DATA_ALLOWED_ERR" />
+ <field name="NO_MODIFICATION_ALLOWED_ERR" />
+ <field name="SYNTAX_ERR" />
+ <field name="TYPE_MISMATCH_ERR" since="8" />
+ <field name="VALIDATION_ERR" since="8" />
+ <field name="WRONG_DOCUMENT_ERR" />
+ <field name="code" />
+ </class>
+ <class name="org/w3c/dom/DOMImplementation" since="1">
+ <extends name="java/lang/Object" />
+ <method name="createDocument(Ljava/lang/String;Ljava/lang/String;Lorg/w3c/dom/DocumentType;)Lorg/w3c/dom/Document;" />
+ <method name="createDocumentType(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/DocumentType;" />
+ <method name="getFeature(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;" since="8" />
+ <method name="hasFeature(Ljava/lang/String;Ljava/lang/String;)Z" />
+ </class>
+ <class name="org/w3c/dom/DOMImplementationList" since="8">
+ <extends name="java/lang/Object" />
+ <method name="getLength()I" />
+ <method name="item(I)Lorg/w3c/dom/DOMImplementation;" />
+ </class>
+ <class name="org/w3c/dom/DOMImplementationSource" since="8">
+ <extends name="java/lang/Object" />
+ <method name="getDOMImplementation(Ljava/lang/String;)Lorg/w3c/dom/DOMImplementation;" />
+ <method name="getDOMImplementationList(Ljava/lang/String;)Lorg/w3c/dom/DOMImplementationList;" />
+ </class>
+ <class name="org/w3c/dom/DOMLocator" since="8">
+ <extends name="java/lang/Object" />
+ <method name="getByteOffset()I" />
+ <method name="getColumnNumber()I" />
+ <method name="getLineNumber()I" />
+ <method name="getRelatedNode()Lorg/w3c/dom/Node;" />
+ <method name="getUri()Ljava/lang/String;" />
+ <method name="getUtf16Offset()I" />
+ </class>
+ <class name="org/w3c/dom/DOMStringList" since="8">
+ <extends name="java/lang/Object" />
+ <method name="contains(Ljava/lang/String;)Z" />
+ <method name="getLength()I" />
+ <method name="item(I)Ljava/lang/String;" />
+ </class>
+ <class name="org/w3c/dom/Document" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/w3c/dom/Node" />
+ <method name="adoptNode(Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node;" since="8" />
+ <method name="createAttribute(Ljava/lang/String;)Lorg/w3c/dom/Attr;" />
+ <method name="createAttributeNS(Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/Attr;" />
+ <method name="createCDATASection(Ljava/lang/String;)Lorg/w3c/dom/CDATASection;" />
+ <method name="createComment(Ljava/lang/String;)Lorg/w3c/dom/Comment;" />
+ <method name="createDocumentFragment()Lorg/w3c/dom/DocumentFragment;" />
+ <method name="createElement(Ljava/lang/String;)Lorg/w3c/dom/Element;" />
+ <method name="createElementNS(Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/Element;" />
+ <method name="createEntityReference(Ljava/lang/String;)Lorg/w3c/dom/EntityReference;" />
+ <method name="createProcessingInstruction(Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/ProcessingInstruction;" />
+ <method name="createTextNode(Ljava/lang/String;)Lorg/w3c/dom/Text;" />
+ <method name="getDoctype()Lorg/w3c/dom/DocumentType;" />
+ <method name="getDocumentElement()Lorg/w3c/dom/Element;" />
+ <method name="getDocumentURI()Ljava/lang/String;" since="8" />
+ <method name="getDomConfig()Lorg/w3c/dom/DOMConfiguration;" since="8" />
+ <method name="getElementById(Ljava/lang/String;)Lorg/w3c/dom/Element;" />
+ <method name="getElementsByTagName(Ljava/lang/String;)Lorg/w3c/dom/NodeList;" />
+ <method name="getElementsByTagNameNS(Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/NodeList;" />
+ <method name="getImplementation()Lorg/w3c/dom/DOMImplementation;" />
+ <method name="getInputEncoding()Ljava/lang/String;" since="8" />
+ <method name="getStrictErrorChecking()Z" since="8" />
+ <method name="getXmlEncoding()Ljava/lang/String;" since="8" />
+ <method name="getXmlStandalone()Z" since="8" />
+ <method name="getXmlVersion()Ljava/lang/String;" since="8" />
+ <method name="importNode(Lorg/w3c/dom/Node;Z)Lorg/w3c/dom/Node;" />
+ <method name="normalizeDocument()V" since="8" />
+ <method name="renameNode(Lorg/w3c/dom/Node;Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/Node;" since="8" />
+ <method name="setDocumentURI(Ljava/lang/String;)V" since="8" />
+ <method name="setStrictErrorChecking(Z)V" since="8" />
+ <method name="setXmlStandalone(Z)V" since="8" />
+ <method name="setXmlVersion(Ljava/lang/String;)V" since="8" />
+ </class>
+ <class name="org/w3c/dom/DocumentFragment" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/w3c/dom/Node" />
+ </class>
+ <class name="org/w3c/dom/DocumentType" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/w3c/dom/Node" />
+ <method name="getEntities()Lorg/w3c/dom/NamedNodeMap;" />
+ <method name="getInternalSubset()Ljava/lang/String;" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getNotations()Lorg/w3c/dom/NamedNodeMap;" />
+ <method name="getPublicId()Ljava/lang/String;" />
+ <method name="getSystemId()Ljava/lang/String;" />
+ </class>
+ <class name="org/w3c/dom/Element" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/w3c/dom/Node" />
+ <method name="getAttribute(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getAttributeNS(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getAttributeNode(Ljava/lang/String;)Lorg/w3c/dom/Attr;" />
+ <method name="getAttributeNodeNS(Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/Attr;" />
+ <method name="getElementsByTagName(Ljava/lang/String;)Lorg/w3c/dom/NodeList;" />
+ <method name="getElementsByTagNameNS(Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/NodeList;" />
+ <method name="getSchemaTypeInfo()Lorg/w3c/dom/TypeInfo;" since="8" />
+ <method name="getTagName()Ljava/lang/String;" />
+ <method name="hasAttribute(Ljava/lang/String;)Z" />
+ <method name="hasAttributeNS(Ljava/lang/String;Ljava/lang/String;)Z" />
+ <method name="removeAttribute(Ljava/lang/String;)V" />
+ <method name="removeAttributeNS(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="removeAttributeNode(Lorg/w3c/dom/Attr;)Lorg/w3c/dom/Attr;" />
+ <method name="setAttribute(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="setAttributeNS(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="setAttributeNode(Lorg/w3c/dom/Attr;)Lorg/w3c/dom/Attr;" />
+ <method name="setAttributeNodeNS(Lorg/w3c/dom/Attr;)Lorg/w3c/dom/Attr;" />
+ <method name="setIdAttribute(Ljava/lang/String;Z)V" since="8" />
+ <method name="setIdAttributeNS(Ljava/lang/String;Ljava/lang/String;Z)V" since="8" />
+ <method name="setIdAttributeNode(Lorg/w3c/dom/Attr;Z)V" since="8" />
+ </class>
+ <class name="org/w3c/dom/Entity" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/w3c/dom/Node" />
+ <method name="getInputEncoding()Ljava/lang/String;" since="8" />
+ <method name="getNotationName()Ljava/lang/String;" />
+ <method name="getPublicId()Ljava/lang/String;" />
+ <method name="getSystemId()Ljava/lang/String;" />
+ <method name="getXmlEncoding()Ljava/lang/String;" since="8" />
+ <method name="getXmlVersion()Ljava/lang/String;" since="8" />
+ </class>
+ <class name="org/w3c/dom/EntityReference" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/w3c/dom/Node" />
+ </class>
+ <class name="org/w3c/dom/NameList" since="8">
+ <extends name="java/lang/Object" />
+ <method name="contains(Ljava/lang/String;)Z" />
+ <method name="containsNS(Ljava/lang/String;Ljava/lang/String;)Z" />
+ <method name="getLength()I" />
+ <method name="getName(I)Ljava/lang/String;" />
+ <method name="getNamespaceURI(I)Ljava/lang/String;" />
+ </class>
+ <class name="org/w3c/dom/NamedNodeMap" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getLength()I" />
+ <method name="getNamedItem(Ljava/lang/String;)Lorg/w3c/dom/Node;" />
+ <method name="getNamedItemNS(Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/Node;" />
+ <method name="item(I)Lorg/w3c/dom/Node;" />
+ <method name="removeNamedItem(Ljava/lang/String;)Lorg/w3c/dom/Node;" />
+ <method name="removeNamedItemNS(Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/Node;" />
+ <method name="setNamedItem(Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node;" />
+ <method name="setNamedItemNS(Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node;" />
+ </class>
+ <class name="org/w3c/dom/Node" since="1">
+ <extends name="java/lang/Object" />
+ <method name="appendChild(Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node;" />
+ <method name="cloneNode(Z)Lorg/w3c/dom/Node;" />
+ <method name="compareDocumentPosition(Lorg/w3c/dom/Node;)S" since="8" />
+ <method name="getAttributes()Lorg/w3c/dom/NamedNodeMap;" />
+ <method name="getBaseURI()Ljava/lang/String;" since="8" />
+ <method name="getChildNodes()Lorg/w3c/dom/NodeList;" />
+ <method name="getFeature(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;" since="8" />
+ <method name="getFirstChild()Lorg/w3c/dom/Node;" />
+ <method name="getLastChild()Lorg/w3c/dom/Node;" />
+ <method name="getLocalName()Ljava/lang/String;" />
+ <method name="getNamespaceURI()Ljava/lang/String;" />
+ <method name="getNextSibling()Lorg/w3c/dom/Node;" />
+ <method name="getNodeName()Ljava/lang/String;" />
+ <method name="getNodeType()S" />
+ <method name="getNodeValue()Ljava/lang/String;" />
+ <method name="getOwnerDocument()Lorg/w3c/dom/Document;" />
+ <method name="getParentNode()Lorg/w3c/dom/Node;" />
+ <method name="getPrefix()Ljava/lang/String;" />
+ <method name="getPreviousSibling()Lorg/w3c/dom/Node;" />
+ <method name="getTextContent()Ljava/lang/String;" since="8" />
+ <method name="getUserData(Ljava/lang/String;)Ljava/lang/Object;" since="8" />
+ <method name="hasAttributes()Z" />
+ <method name="hasChildNodes()Z" />
+ <method name="insertBefore(Lorg/w3c/dom/Node;Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node;" />
+ <method name="isDefaultNamespace(Ljava/lang/String;)Z" since="8" />
+ <method name="isEqualNode(Lorg/w3c/dom/Node;)Z" since="8" />
+ <method name="isSameNode(Lorg/w3c/dom/Node;)Z" since="8" />
+ <method name="isSupported(Ljava/lang/String;Ljava/lang/String;)Z" />
+ <method name="lookupNamespaceURI(Ljava/lang/String;)Ljava/lang/String;" since="8" />
+ <method name="lookupPrefix(Ljava/lang/String;)Ljava/lang/String;" since="8" />
+ <method name="normalize()V" />
+ <method name="removeChild(Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node;" />
+ <method name="replaceChild(Lorg/w3c/dom/Node;Lorg/w3c/dom/Node;)Lorg/w3c/dom/Node;" />
+ <method name="setNodeValue(Ljava/lang/String;)V" />
+ <method name="setPrefix(Ljava/lang/String;)V" />
+ <method name="setTextContent(Ljava/lang/String;)V" since="8" />
+ <method name="setUserData(Ljava/lang/String;Ljava/lang/Object;Lorg/w3c/dom/UserDataHandler;)Ljava/lang/Object;" since="8" />
+ <field name="ATTRIBUTE_NODE" />
+ <field name="CDATA_SECTION_NODE" />
+ <field name="COMMENT_NODE" />
+ <field name="DOCUMENT_FRAGMENT_NODE" />
+ <field name="DOCUMENT_NODE" />
+ <field name="DOCUMENT_POSITION_CONTAINED_BY" since="8" />
+ <field name="DOCUMENT_POSITION_CONTAINS" since="8" />
+ <field name="DOCUMENT_POSITION_DISCONNECTED" since="8" />
+ <field name="DOCUMENT_POSITION_FOLLOWING" since="8" />
+ <field name="DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC" since="8" />
+ <field name="DOCUMENT_POSITION_PRECEDING" since="8" />
+ <field name="DOCUMENT_TYPE_NODE" />
+ <field name="ELEMENT_NODE" />
+ <field name="ENTITY_NODE" />
+ <field name="ENTITY_REFERENCE_NODE" />
+ <field name="NOTATION_NODE" />
+ <field name="PROCESSING_INSTRUCTION_NODE" />
+ <field name="TEXT_NODE" />
+ </class>
+ <class name="org/w3c/dom/NodeList" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getLength()I" />
+ <method name="item(I)Lorg/w3c/dom/Node;" />
+ </class>
+ <class name="org/w3c/dom/Notation" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/w3c/dom/Node" />
+ <method name="getPublicId()Ljava/lang/String;" />
+ <method name="getSystemId()Ljava/lang/String;" />
+ </class>
+ <class name="org/w3c/dom/ProcessingInstruction" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/w3c/dom/Node" />
+ <method name="getData()Ljava/lang/String;" />
+ <method name="getTarget()Ljava/lang/String;" />
+ <method name="setData(Ljava/lang/String;)V" />
+ </class>
+ <class name="org/w3c/dom/Text" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/w3c/dom/CharacterData" />
+ <method name="getWholeText()Ljava/lang/String;" since="8" />
+ <method name="isElementContentWhitespace()Z" since="8" />
+ <method name="replaceWholeText(Ljava/lang/String;)Lorg/w3c/dom/Text;" since="8" />
+ <method name="splitText(I)Lorg/w3c/dom/Text;" />
+ </class>
+ <class name="org/w3c/dom/TypeInfo" since="8">
+ <extends name="java/lang/Object" />
+ <method name="getTypeName()Ljava/lang/String;" />
+ <method name="getTypeNamespace()Ljava/lang/String;" />
+ <method name="isDerivedFrom(Ljava/lang/String;Ljava/lang/String;I)Z" />
+ <field name="DERIVATION_EXTENSION" />
+ <field name="DERIVATION_LIST" />
+ <field name="DERIVATION_RESTRICTION" />
+ <field name="DERIVATION_UNION" />
+ </class>
+ <class name="org/w3c/dom/UserDataHandler" since="8">
+ <extends name="java/lang/Object" />
+ <method name="handle(SLjava/lang/String;Ljava/lang/Object;Lorg/w3c/dom/Node;Lorg/w3c/dom/Node;)V" />
+ <field name="NODE_ADOPTED" />
+ <field name="NODE_CLONED" />
+ <field name="NODE_DELETED" />
+ <field name="NODE_IMPORTED" />
+ <field name="NODE_RENAMED" />
+ </class>
+ <class name="org/w3c/dom/ls/DOMImplementationLS" since="8">
+ <extends name="java/lang/Object" />
+ <method name="createLSInput()Lorg/w3c/dom/ls/LSInput;" />
+ <method name="createLSOutput()Lorg/w3c/dom/ls/LSOutput;" />
+ <method name="createLSParser(SLjava/lang/String;)Lorg/w3c/dom/ls/LSParser;" />
+ <method name="createLSSerializer()Lorg/w3c/dom/ls/LSSerializer;" />
+ <field name="MODE_ASYNCHRONOUS" />
+ <field name="MODE_SYNCHRONOUS" />
+ </class>
+ <class name="org/w3c/dom/ls/LSException" since="8">
+ <extends name="java/lang/RuntimeException" />
+ <method name="&lt;init>(SLjava/lang/String;)V" />
+ <field name="PARSE_ERR" />
+ <field name="SERIALIZE_ERR" />
+ <field name="code" />
+ </class>
+ <class name="org/w3c/dom/ls/LSInput" since="8">
+ <extends name="java/lang/Object" />
+ <method name="getBaseURI()Ljava/lang/String;" />
+ <method name="getByteStream()Ljava/io/InputStream;" />
+ <method name="getCertifiedText()Z" />
+ <method name="getCharacterStream()Ljava/io/Reader;" />
+ <method name="getEncoding()Ljava/lang/String;" />
+ <method name="getPublicId()Ljava/lang/String;" />
+ <method name="getStringData()Ljava/lang/String;" />
+ <method name="getSystemId()Ljava/lang/String;" />
+ <method name="setBaseURI(Ljava/lang/String;)V" />
+ <method name="setByteStream(Ljava/io/InputStream;)V" />
+ <method name="setCertifiedText(Z)V" />
+ <method name="setCharacterStream(Ljava/io/Reader;)V" />
+ <method name="setEncoding(Ljava/lang/String;)V" />
+ <method name="setPublicId(Ljava/lang/String;)V" />
+ <method name="setStringData(Ljava/lang/String;)V" />
+ <method name="setSystemId(Ljava/lang/String;)V" />
+ </class>
+ <class name="org/w3c/dom/ls/LSOutput" since="8">
+ <extends name="java/lang/Object" />
+ <method name="getByteStream()Ljava/io/OutputStream;" />
+ <method name="getCharacterStream()Ljava/io/Writer;" />
+ <method name="getEncoding()Ljava/lang/String;" />
+ <method name="getSystemId()Ljava/lang/String;" />
+ <method name="setByteStream(Ljava/io/OutputStream;)V" />
+ <method name="setCharacterStream(Ljava/io/Writer;)V" />
+ <method name="setEncoding(Ljava/lang/String;)V" />
+ <method name="setSystemId(Ljava/lang/String;)V" />
+ </class>
+ <class name="org/w3c/dom/ls/LSParser" since="8">
+ <extends name="java/lang/Object" />
+ <method name="abort()V" />
+ <method name="getAsync()Z" />
+ <method name="getBusy()Z" />
+ <method name="getDomConfig()Lorg/w3c/dom/DOMConfiguration;" />
+ <method name="getFilter()Lorg/w3c/dom/ls/LSParserFilter;" />
+ <method name="parse(Lorg/w3c/dom/ls/LSInput;)Lorg/w3c/dom/Document;" />
+ <method name="parseURI(Ljava/lang/String;)Lorg/w3c/dom/Document;" />
+ <method name="parseWithContext(Lorg/w3c/dom/ls/LSInput;Lorg/w3c/dom/Node;S)Lorg/w3c/dom/Node;" />
+ <method name="setFilter(Lorg/w3c/dom/ls/LSParserFilter;)V" />
+ <field name="ACTION_APPEND_AS_CHILDREN" />
+ <field name="ACTION_INSERT_AFTER" />
+ <field name="ACTION_INSERT_BEFORE" />
+ <field name="ACTION_REPLACE" />
+ <field name="ACTION_REPLACE_CHILDREN" />
+ </class>
+ <class name="org/w3c/dom/ls/LSParserFilter" since="8">
+ <extends name="java/lang/Object" />
+ <method name="acceptNode(Lorg/w3c/dom/Node;)S" />
+ <method name="getWhatToShow()I" />
+ <method name="startElement(Lorg/w3c/dom/Element;)S" />
+ <field name="FILTER_ACCEPT" />
+ <field name="FILTER_INTERRUPT" />
+ <field name="FILTER_REJECT" />
+ <field name="FILTER_SKIP" />
+ </class>
+ <class name="org/w3c/dom/ls/LSResourceResolver" since="8">
+ <extends name="java/lang/Object" />
+ <method name="resolveResource(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/w3c/dom/ls/LSInput;" />
+ </class>
+ <class name="org/w3c/dom/ls/LSSerializer" since="8">
+ <extends name="java/lang/Object" />
+ <method name="getDomConfig()Lorg/w3c/dom/DOMConfiguration;" />
+ <method name="getNewLine()Ljava/lang/String;" />
+ <method name="setNewLine(Ljava/lang/String;)V" />
+ <method name="write(Lorg/w3c/dom/Node;Lorg/w3c/dom/ls/LSOutput;)Z" />
+ <method name="writeToString(Lorg/w3c/dom/Node;)Ljava/lang/String;" />
+ <method name="writeToURI(Lorg/w3c/dom/Node;Ljava/lang/String;)Z" />
+ </class>
+ <class name="org/xml/sax/AttributeList" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getLength()I" />
+ <method name="getName(I)Ljava/lang/String;" />
+ <method name="getType(I)Ljava/lang/String;" />
+ <method name="getType(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getValue(I)Ljava/lang/String;" />
+ <method name="getValue(Ljava/lang/String;)Ljava/lang/String;" />
+ </class>
+ <class name="org/xml/sax/Attributes" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getIndex(Ljava/lang/String;)I" />
+ <method name="getIndex(Ljava/lang/String;Ljava/lang/String;)I" />
+ <method name="getLength()I" />
+ <method name="getLocalName(I)Ljava/lang/String;" />
+ <method name="getQName(I)Ljava/lang/String;" />
+ <method name="getType(I)Ljava/lang/String;" />
+ <method name="getType(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getType(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getURI(I)Ljava/lang/String;" />
+ <method name="getValue(I)Ljava/lang/String;" />
+ <method name="getValue(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ </class>
+ <class name="org/xml/sax/ContentHandler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="characters([CII)V" />
+ <method name="endDocument()V" />
+ <method name="endElement(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="endPrefixMapping(Ljava/lang/String;)V" />
+ <method name="ignorableWhitespace([CII)V" />
+ <method name="processingInstruction(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="setDocumentLocator(Lorg/xml/sax/Locator;)V" />
+ <method name="skippedEntity(Ljava/lang/String;)V" />
+ <method name="startDocument()V" />
+ <method name="startElement(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/xml/sax/Attributes;)V" />
+ <method name="startPrefixMapping(Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="org/xml/sax/DTDHandler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="notationDecl(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="unparsedEntityDecl(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="org/xml/sax/DocumentHandler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="characters([CII)V" />
+ <method name="endDocument()V" />
+ <method name="endElement(Ljava/lang/String;)V" />
+ <method name="ignorableWhitespace([CII)V" />
+ <method name="processingInstruction(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="setDocumentLocator(Lorg/xml/sax/Locator;)V" />
+ <method name="startDocument()V" />
+ <method name="startElement(Ljava/lang/String;Lorg/xml/sax/AttributeList;)V" />
+ </class>
+ <class name="org/xml/sax/EntityResolver" since="1">
+ <extends name="java/lang/Object" />
+ <method name="resolveEntity(Ljava/lang/String;Ljava/lang/String;)Lorg/xml/sax/InputSource;" />
+ </class>
+ <class name="org/xml/sax/ErrorHandler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="error(Lorg/xml/sax/SAXParseException;)V" />
+ <method name="fatalError(Lorg/xml/sax/SAXParseException;)V" />
+ <method name="warning(Lorg/xml/sax/SAXParseException;)V" />
+ </class>
+ <class name="org/xml/sax/HandlerBase" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/xml/sax/DTDHandler" />
+ <implements name="org/xml/sax/DocumentHandler" />
+ <implements name="org/xml/sax/EntityResolver" />
+ <implements name="org/xml/sax/ErrorHandler" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/xml/sax/InputSource" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/io/InputStream;)V" />
+ <method name="&lt;init>(Ljava/io/Reader;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="getByteStream()Ljava/io/InputStream;" />
+ <method name="getCharacterStream()Ljava/io/Reader;" />
+ <method name="getEncoding()Ljava/lang/String;" />
+ <method name="getPublicId()Ljava/lang/String;" />
+ <method name="getSystemId()Ljava/lang/String;" />
+ <method name="setByteStream(Ljava/io/InputStream;)V" />
+ <method name="setCharacterStream(Ljava/io/Reader;)V" />
+ <method name="setEncoding(Ljava/lang/String;)V" />
+ <method name="setPublicId(Ljava/lang/String;)V" />
+ <method name="setSystemId(Ljava/lang/String;)V" />
+ </class>
+ <class name="org/xml/sax/Locator" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getColumnNumber()I" />
+ <method name="getLineNumber()I" />
+ <method name="getPublicId()Ljava/lang/String;" />
+ <method name="getSystemId()Ljava/lang/String;" />
+ </class>
+ <class name="org/xml/sax/Parser" since="1">
+ <extends name="java/lang/Object" />
+ <method name="parse(Ljava/lang/String;)V" />
+ <method name="parse(Lorg/xml/sax/InputSource;)V" />
+ <method name="setDTDHandler(Lorg/xml/sax/DTDHandler;)V" />
+ <method name="setDocumentHandler(Lorg/xml/sax/DocumentHandler;)V" />
+ <method name="setEntityResolver(Lorg/xml/sax/EntityResolver;)V" />
+ <method name="setErrorHandler(Lorg/xml/sax/ErrorHandler;)V" />
+ <method name="setLocale(Ljava/util/Locale;)V" />
+ </class>
+ <class name="org/xml/sax/SAXException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/Exception;)V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/Exception;)V" />
+ <method name="getException()Ljava/lang/Exception;" />
+ </class>
+ <class name="org/xml/sax/SAXNotRecognizedException" since="1">
+ <extends name="org/xml/sax/SAXException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="org/xml/sax/SAXNotSupportedException" since="1">
+ <extends name="org/xml/sax/SAXException" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ </class>
+ <class name="org/xml/sax/SAXParseException" since="1">
+ <extends name="org/xml/sax/SAXException" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II)V" />
+ <method name="&lt;init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IILjava/lang/Exception;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Lorg/xml/sax/Locator;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Lorg/xml/sax/Locator;Ljava/lang/Exception;)V" />
+ <method name="getColumnNumber()I" />
+ <method name="getLineNumber()I" />
+ <method name="getPublicId()Ljava/lang/String;" />
+ <method name="getSystemId()Ljava/lang/String;" />
+ </class>
+ <class name="org/xml/sax/XMLFilter" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/xml/sax/XMLReader" />
+ <method name="getParent()Lorg/xml/sax/XMLReader;" />
+ <method name="setParent(Lorg/xml/sax/XMLReader;)V" />
+ </class>
+ <class name="org/xml/sax/XMLReader" since="1">
+ <extends name="java/lang/Object" />
+ <method name="getContentHandler()Lorg/xml/sax/ContentHandler;" />
+ <method name="getDTDHandler()Lorg/xml/sax/DTDHandler;" />
+ <method name="getEntityResolver()Lorg/xml/sax/EntityResolver;" />
+ <method name="getErrorHandler()Lorg/xml/sax/ErrorHandler;" />
+ <method name="getFeature(Ljava/lang/String;)Z" />
+ <method name="getProperty(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="parse(Ljava/lang/String;)V" />
+ <method name="parse(Lorg/xml/sax/InputSource;)V" />
+ <method name="setContentHandler(Lorg/xml/sax/ContentHandler;)V" />
+ <method name="setDTDHandler(Lorg/xml/sax/DTDHandler;)V" />
+ <method name="setEntityResolver(Lorg/xml/sax/EntityResolver;)V" />
+ <method name="setErrorHandler(Lorg/xml/sax/ErrorHandler;)V" />
+ <method name="setFeature(Ljava/lang/String;Z)V" />
+ <method name="setProperty(Ljava/lang/String;Ljava/lang/Object;)V" />
+ </class>
+ <class name="org/xml/sax/ext/Attributes2" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/xml/sax/Attributes" />
+ <method name="isDeclared(I)Z" />
+ <method name="isDeclared(Ljava/lang/String;)Z" />
+ <method name="isDeclared(Ljava/lang/String;Ljava/lang/String;)Z" />
+ <method name="isSpecified(I)Z" />
+ <method name="isSpecified(Ljava/lang/String;)Z" />
+ <method name="isSpecified(Ljava/lang/String;Ljava/lang/String;)Z" />
+ </class>
+ <class name="org/xml/sax/ext/Attributes2Impl" since="1">
+ <extends name="org/xml/sax/helpers/AttributesImpl" />
+ <implements name="org/xml/sax/ext/Attributes2" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Lorg/xml/sax/Attributes;)V" />
+ <method name="setDeclared(IZ)V" />
+ <method name="setSpecified(IZ)V" />
+ </class>
+ <class name="org/xml/sax/ext/DeclHandler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="attributeDecl(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="elementDecl(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="externalEntityDecl(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="internalEntityDecl(Ljava/lang/String;Ljava/lang/String;)V" />
+ </class>
+ <class name="org/xml/sax/ext/DefaultHandler2" since="1">
+ <extends name="org/xml/sax/helpers/DefaultHandler" />
+ <implements name="org/xml/sax/ext/DeclHandler" />
+ <implements name="org/xml/sax/ext/EntityResolver2" />
+ <implements name="org/xml/sax/ext/LexicalHandler" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/xml/sax/ext/EntityResolver2" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/xml/sax/EntityResolver" />
+ <method name="getExternalSubset(Ljava/lang/String;Ljava/lang/String;)Lorg/xml/sax/InputSource;" />
+ <method name="resolveEntity(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xml/sax/InputSource;" />
+ </class>
+ <class name="org/xml/sax/ext/LexicalHandler" since="1">
+ <extends name="java/lang/Object" />
+ <method name="comment([CII)V" />
+ <method name="endCDATA()V" />
+ <method name="endDTD()V" />
+ <method name="endEntity(Ljava/lang/String;)V" />
+ <method name="startCDATA()V" />
+ <method name="startDTD(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="startEntity(Ljava/lang/String;)V" />
+ </class>
+ <class name="org/xml/sax/ext/Locator2" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/xml/sax/Locator" />
+ <method name="getEncoding()Ljava/lang/String;" />
+ <method name="getXMLVersion()Ljava/lang/String;" />
+ </class>
+ <class name="org/xml/sax/ext/Locator2Impl" since="1">
+ <extends name="org/xml/sax/helpers/LocatorImpl" />
+ <implements name="org/xml/sax/ext/Locator2" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Lorg/xml/sax/Locator;)V" />
+ <method name="setEncoding(Ljava/lang/String;)V" />
+ <method name="setXMLVersion(Ljava/lang/String;)V" />
+ </class>
+ <class name="org/xml/sax/helpers/AttributeListImpl" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/xml/sax/AttributeList" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Lorg/xml/sax/AttributeList;)V" />
+ <method name="addAttribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="clear()V" />
+ <method name="removeAttribute(Ljava/lang/String;)V" />
+ <method name="setAttributeList(Lorg/xml/sax/AttributeList;)V" />
+ </class>
+ <class name="org/xml/sax/helpers/AttributesImpl" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/xml/sax/Attributes" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Lorg/xml/sax/Attributes;)V" />
+ <method name="addAttribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="clear()V" />
+ <method name="removeAttribute(I)V" />
+ <method name="setAttribute(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="setAttributes(Lorg/xml/sax/Attributes;)V" />
+ <method name="setLocalName(ILjava/lang/String;)V" />
+ <method name="setQName(ILjava/lang/String;)V" />
+ <method name="setType(ILjava/lang/String;)V" />
+ <method name="setURI(ILjava/lang/String;)V" />
+ <method name="setValue(ILjava/lang/String;)V" />
+ </class>
+ <class name="org/xml/sax/helpers/DefaultHandler" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/xml/sax/ContentHandler" />
+ <implements name="org/xml/sax/DTDHandler" />
+ <implements name="org/xml/sax/EntityResolver" />
+ <implements name="org/xml/sax/ErrorHandler" />
+ <method name="&lt;init>()V" />
+ </class>
+ <class name="org/xml/sax/helpers/LocatorImpl" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/xml/sax/Locator" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Lorg/xml/sax/Locator;)V" />
+ <method name="setColumnNumber(I)V" />
+ <method name="setLineNumber(I)V" />
+ <method name="setPublicId(Ljava/lang/String;)V" />
+ <method name="setSystemId(Ljava/lang/String;)V" />
+ </class>
+ <class name="org/xml/sax/helpers/NamespaceSupport" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="declarePrefix(Ljava/lang/String;Ljava/lang/String;)Z" />
+ <method name="getDeclaredPrefixes()Ljava/util/Enumeration;" />
+ <method name="getPrefix(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getPrefixes()Ljava/util/Enumeration;" />
+ <method name="getPrefixes(Ljava/lang/String;)Ljava/util/Enumeration;" />
+ <method name="getURI(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="isNamespaceDeclUris()Z" />
+ <method name="popContext()V" />
+ <method name="processName(Ljava/lang/String;[Ljava/lang/String;Z)[Ljava/lang/String;" />
+ <method name="pushContext()V" />
+ <method name="reset()V" />
+ <method name="setNamespaceDeclUris(Z)V" />
+ <field name="NSDECL" />
+ <field name="XMLNS" />
+ </class>
+ <class name="org/xml/sax/helpers/ParserAdapter" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/xml/sax/DocumentHandler" />
+ <implements name="org/xml/sax/XMLReader" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Lorg/xml/sax/Parser;)V" />
+ </class>
+ <class name="org/xml/sax/helpers/ParserFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="makeParser()Lorg/xml/sax/Parser;" />
+ <method name="makeParser(Ljava/lang/String;)Lorg/xml/sax/Parser;" />
+ </class>
+ <class name="org/xml/sax/helpers/XMLFilterImpl" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/xml/sax/ContentHandler" />
+ <implements name="org/xml/sax/DTDHandler" />
+ <implements name="org/xml/sax/EntityResolver" />
+ <implements name="org/xml/sax/ErrorHandler" />
+ <implements name="org/xml/sax/XMLFilter" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Lorg/xml/sax/XMLReader;)V" />
+ </class>
+ <class name="org/xml/sax/helpers/XMLReaderAdapter" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/xml/sax/ContentHandler" />
+ <implements name="org/xml/sax/Parser" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Lorg/xml/sax/XMLReader;)V" />
+ </class>
+ <class name="org/xml/sax/helpers/XMLReaderFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="createXMLReader()Lorg/xml/sax/XMLReader;" />
+ <method name="createXMLReader(Ljava/lang/String;)Lorg/xml/sax/XMLReader;" />
+ </class>
+ <class name="org/xmlpull/v1/XmlPullParser" since="1">
+ <extends name="java/lang/Object" />
+ <method name="defineEntityReplacementText(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="getAttributeCount()I" />
+ <method name="getAttributeName(I)Ljava/lang/String;" />
+ <method name="getAttributeNamespace(I)Ljava/lang/String;" />
+ <method name="getAttributePrefix(I)Ljava/lang/String;" />
+ <method name="getAttributeType(I)Ljava/lang/String;" />
+ <method name="getAttributeValue(I)Ljava/lang/String;" />
+ <method name="getAttributeValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getColumnNumber()I" />
+ <method name="getDepth()I" />
+ <method name="getEventType()I" />
+ <method name="getFeature(Ljava/lang/String;)Z" />
+ <method name="getInputEncoding()Ljava/lang/String;" />
+ <method name="getLineNumber()I" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getNamespace()Ljava/lang/String;" />
+ <method name="getNamespace(Ljava/lang/String;)Ljava/lang/String;" />
+ <method name="getNamespaceCount(I)I" />
+ <method name="getNamespacePrefix(I)Ljava/lang/String;" />
+ <method name="getNamespaceUri(I)Ljava/lang/String;" />
+ <method name="getPositionDescription()Ljava/lang/String;" />
+ <method name="getPrefix()Ljava/lang/String;" />
+ <method name="getProperty(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="getText()Ljava/lang/String;" />
+ <method name="getTextCharacters([I)[C" />
+ <method name="isAttributeDefault(I)Z" />
+ <method name="isEmptyElementTag()Z" />
+ <method name="isWhitespace()Z" />
+ <method name="next()I" />
+ <method name="nextTag()I" />
+ <method name="nextText()Ljava/lang/String;" />
+ <method name="nextToken()I" />
+ <method name="require(ILjava/lang/String;Ljava/lang/String;)V" />
+ <method name="setFeature(Ljava/lang/String;Z)V" />
+ <method name="setInput(Ljava/io/InputStream;Ljava/lang/String;)V" />
+ <method name="setInput(Ljava/io/Reader;)V" />
+ <method name="setProperty(Ljava/lang/String;Ljava/lang/Object;)V" />
+ <field name="CDSECT" />
+ <field name="COMMENT" />
+ <field name="DOCDECL" />
+ <field name="END_DOCUMENT" />
+ <field name="END_TAG" />
+ <field name="ENTITY_REF" />
+ <field name="FEATURE_PROCESS_DOCDECL" />
+ <field name="FEATURE_PROCESS_NAMESPACES" />
+ <field name="FEATURE_REPORT_NAMESPACE_ATTRIBUTES" />
+ <field name="FEATURE_VALIDATION" />
+ <field name="IGNORABLE_WHITESPACE" />
+ <field name="NO_NAMESPACE" />
+ <field name="PROCESSING_INSTRUCTION" />
+ <field name="START_DOCUMENT" />
+ <field name="START_TAG" />
+ <field name="TEXT" />
+ <field name="TYPES" />
+ </class>
+ <class name="org/xmlpull/v1/XmlPullParserException" since="1">
+ <extends name="java/lang/Exception" />
+ <method name="&lt;init>(Ljava/lang/String;)V" />
+ <method name="&lt;init>(Ljava/lang/String;Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/Throwable;)V" />
+ <method name="getColumnNumber()I" />
+ <method name="getDetail()Ljava/lang/Throwable;" />
+ <method name="getLineNumber()I" />
+ <field name="column" />
+ <field name="detail" />
+ <field name="row" />
+ </class>
+ <class name="org/xmlpull/v1/XmlPullParserFactory" since="1">
+ <extends name="java/lang/Object" />
+ <method name="&lt;init>()V" />
+ <method name="getFeature(Ljava/lang/String;)Z" />
+ <method name="isNamespaceAware()Z" />
+ <method name="isValidating()Z" />
+ <method name="newInstance()Lorg/xmlpull/v1/XmlPullParserFactory;" />
+ <method name="newInstance(Ljava/lang/String;Ljava/lang/Class;)Lorg/xmlpull/v1/XmlPullParserFactory;" />
+ <method name="newPullParser()Lorg/xmlpull/v1/XmlPullParser;" />
+ <method name="newSerializer()Lorg/xmlpull/v1/XmlSerializer;" />
+ <method name="setFeature(Ljava/lang/String;Z)V" />
+ <method name="setNamespaceAware(Z)V" />
+ <method name="setValidating(Z)V" />
+ <field name="PROPERTY_NAME" />
+ <field name="classNamesLocation" />
+ <field name="features" />
+ <field name="parserClasses" />
+ <field name="serializerClasses" />
+ </class>
+ <class name="org/xmlpull/v1/XmlSerializer" since="1">
+ <extends name="java/lang/Object" />
+ <method name="attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;" />
+ <method name="cdsect(Ljava/lang/String;)V" />
+ <method name="comment(Ljava/lang/String;)V" />
+ <method name="docdecl(Ljava/lang/String;)V" />
+ <method name="endDocument()V" />
+ <method name="endTag(Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;" />
+ <method name="entityRef(Ljava/lang/String;)V" />
+ <method name="flush()V" />
+ <method name="getDepth()I" />
+ <method name="getFeature(Ljava/lang/String;)Z" />
+ <method name="getName()Ljava/lang/String;" />
+ <method name="getNamespace()Ljava/lang/String;" />
+ <method name="getPrefix(Ljava/lang/String;Z)Ljava/lang/String;" />
+ <method name="getProperty(Ljava/lang/String;)Ljava/lang/Object;" />
+ <method name="ignorableWhitespace(Ljava/lang/String;)V" />
+ <method name="processingInstruction(Ljava/lang/String;)V" />
+ <method name="setFeature(Ljava/lang/String;Z)V" />
+ <method name="setOutput(Ljava/io/OutputStream;Ljava/lang/String;)V" />
+ <method name="setOutput(Ljava/io/Writer;)V" />
+ <method name="setPrefix(Ljava/lang/String;Ljava/lang/String;)V" />
+ <method name="setProperty(Ljava/lang/String;Ljava/lang/Object;)V" />
+ <method name="startDocument(Ljava/lang/String;Ljava/lang/Boolean;)V" />
+ <method name="startTag(Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;" />
+ <method name="text(Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;" />
+ <method name="text([CII)Lorg/xmlpull/v1/XmlSerializer;" />
+ </class>
+ <class name="org/xmlpull/v1/sax2/Driver" since="1">
+ <extends name="java/lang/Object" />
+ <implements name="org/xml/sax/Attributes" />
+ <implements name="org/xml/sax/Locator" />
+ <implements name="org/xml/sax/XMLReader" />
+ <method name="&lt;init>()V" />
+ <method name="&lt;init>(Lorg/xmlpull/v1/XmlPullParser;)V" />
+ <method name="parseSubTree(Lorg/xmlpull/v1/XmlPullParser;)V" />
+ <method name="startElement(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V" />
+ <field name="APACHE_DYNAMIC_VALIDATION_FEATURE" />
+ <field name="APACHE_SCHEMA_VALIDATION_FEATURE" />
+ <field name="DECLARATION_HANDLER_PROPERTY" />
+ <field name="LEXICAL_HANDLER_PROPERTY" />
+ <field name="NAMESPACES_FEATURE" />
+ <field name="NAMESPACE_PREFIXES_FEATURE" />
+ <field name="VALIDATION_FEATURE" />
+ <field name="contentHandler" />
+ <field name="errorHandler" />
+ <field name="pp" />
+ <field name="systemId" />
+ </class>
+</api>
diff --git a/love2dToAPK/tools/tools/android-win/platform-tools/dmtracedump.exe b/love2dToAPK/tools/tools/android-win/platform-tools/dmtracedump.exe
new file mode 100644
index 0000000..bfbf29b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/platform-tools/dmtracedump.exe
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/platform-tools/etc1tool.exe b/love2dToAPK/tools/tools/android-win/platform-tools/etc1tool.exe
new file mode 100644
index 0000000..c323f5a
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/platform-tools/etc1tool.exe
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/platform-tools/fastboot.exe b/love2dToAPK/tools/tools/android-win/platform-tools/fastboot.exe
new file mode 100644
index 0000000..82fd88f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/platform-tools/fastboot.exe
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/platform-tools/hprof-conv.exe b/love2dToAPK/tools/tools/android-win/platform-tools/hprof-conv.exe
new file mode 100644
index 0000000..e0a125e
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/platform-tools/hprof-conv.exe
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/platform-tools/source.properties b/love2dToAPK/tools/tools/android-win/platform-tools/source.properties
new file mode 100644
index 0000000..8235bd0
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/platform-tools/source.properties
@@ -0,0 +1,7 @@
+### Android Tool: Source of this archive.
+#Thu Jul 09 05:17:47 CEST 2015
+Archive.HostOs=windows
+Pkg.License=To get started with the Android SDK, you must agree to the following terms and conditions.\n\nThis is the Android SDK License Agreement (the "License Agreement").\n\n1. Introduction\n\n1.1 The Android SDK (referred to in the License Agreement as the "SDK" and specifically including the Android system files, packaged APIs, and SDK library files and tools , if and when they are made available) is licensed to you subject to the terms of the License Agreement. The License Agreement forms a legally binding contract between you and Google in relation to your use of the SDK.\n\n1.2 "Android" means the Android software stack for devices, as made available under the Android Open Source Project, which is located at the following URL\: http\://source.android.com/, as updated from time to time.\n\n1.3 "Google" means Google Inc., a Delaware corporation with principal place of business at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States.\n\n2. Accepting the License Agreement\n\n2.1 In order to use the SDK, you must first agree to the License Agreement. You may not use the SDK if you do not accept the License Agreement.\n\n2.2 By clicking to accept and/or using the SDK, you hereby agree to the terms of the License Agreement.\n\n2.3 You may not use the SDK and may not accept the License Agreement if you are a person barred from receiving the SDK under the laws of the United States or other countries including the country in which you are resident or from which you use the SDK.\n\n2.4 If you will use the SDK internally within your company or organization you agree to be bound by the License Agreement on behalf of your employer or other entity, and you represent and warrant that you have full legal authority to bind your employer or such entity to the License Agreement. If you do not have the requisite authority, you may not accept the License Agreement or use the SDK on behalf of your employer or other entity.\n\n3. SDK License from Google\n\n3.1 Subject to the terms of the License Agreement, Google grants you a royalty-free, non-assignable, non-exclusive, non-sublicensable, limited, revocable license to use the SDK, personally or internally within your company or organization, solely to develop and distribute applications to run on the Android platform.\n\n3.2 You agree that Google or third parties own all legal right, title and interest in and to the SDK, including any Intellectual Property Rights that subsist in the SDK. "Intellectual Property Rights" means any and all rights under patent law, copyright law, trade secret law, trademark law, and any and all other proprietary rights. Google reserves all rights not expressly granted to you.\n\n3.3 You may not use the SDK for any purpose not expressly permitted by the License Agreement. Except to the extent required by applicable third party licenses, you may not\: (a) copy (except for backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create derivative works of the SDK or any part of the SDK; or (b) load any part of the SDK onto a mobile handset or any other hardware device except a personal computer, combine any part of the SDK with other software, or distribute any software or device incorporating a part of the SDK.\n\n3.4 You agree that you will not take any actions that may cause or result in the fragmentation of Android, including but not limited to distributing, participating in the creation of, or promoting in any way a software development kit derived from the SDK.\n\n3.5 Use, reproduction and distribution of components of the SDK licensed under an open source software license are governed solely by the terms of that open source software license and not the License Agreement. You agree to remain a licensee in good standing in regard to such open source software licenses under all the rights granted and to refrain from any actions that may terminate, suspend, or breach such rights.\n\n3.6 You agree that the form and nature of the SDK that Google provides may change without prior notice to you and that future versions of the SDK may be incompatible with applications developed on previous versions of the SDK. You agree that Google may stop (permanently or temporarily) providing the SDK (or any features within the SDK) to you or to users generally at Google's sole discretion, without prior notice to you.\n\n3.7 Nothing in the License Agreement gives you a right to use any of Google's trade names, trademarks, service marks, logos, domain names, or other distinctive brand features.\n\n3.8 You agree that you will not remove, obscure, or alter any proprietary rights notices (including copyright and trademark notices) that may be affixed to or contained within the SDK.\n\n4. Use of the SDK by You\n\n4.1 Google agrees that nothing in the License Agreement gives Google any right, title or interest from you (or your licensors) under the License Agreement in or to any software applications that you develop using the SDK, including any intellectual property rights that subsist in those applications.\n\n4.2 You agree to use the SDK and write applications only for purposes that are permitted by (a) the License Agreement, and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding the export of data or software to and from the United States or other relevant countries).\n\n4.3 You agree that if you use the SDK to develop applications, you will protect the privacy and legal rights of users. If users provide you with user names, passwords, or other login information or personal information, you must make the users aware that the information will be available to your application, and you must provide legally adequate privacy notice and protection for those users. If your application stores personal or sensitive information provided by users, it must do so securely. If users provide you with Google Account information, your application may only use that information to access the user's Google Account when, and for the limited purposes for which, each user has given you permission to do so.\n\n4.4 You agree that you will not engage in any activity with the SDK, including the development or distribution of an application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the servers, networks, or other properties or services of Google or any third party.\n\n4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any data, content, or resources that you create, transmit or display through Android and/or applications for Android, and for the consequences of your actions (including any loss or damage which Google may suffer) by doing so.\n\n4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any breach of your obligations under the License Agreement, any applicable third party contract or Terms of Service, or any applicable law or regulation, and for the consequences (including any loss or damage which Google or any third party may suffer) of any such breach.\n\n5. Your Developer Credentials\n\n5.1 You agree that you are responsible for maintaining the confidentiality of any developer credentials that may be issued to you by Google or which you may choose yourself and that you will be solely responsible for all applications that are developed under your developer credentials.\n\n6. Privacy and Information\n\n6.1 In order to continually innovate and improve the SDK, Google may collect certain usage statistics from the software including but not limited to a unique identifier, associated IP address, version number of the software, and information on which tools and/or services in the SDK are being used and how they are being used. Before any of this information is collected, the SDK will notify you and seek your consent. If you withhold consent, the information will not be collected.\n\n6.2 The data collected is examined in the aggregate to improve the SDK and is maintained in accordance with Google's Privacy Policy located at http\://www.google.com/policies/privacy/.\n\n7. Third Party Applications\n\n7.1 If you use the SDK to run applications developed by a third party or that access data, content or resources provided by a third party, you agree that Google is not responsible for those applications, data, content, or resources. You understand that all data, content or resources which you may access through such third party applications are the sole responsibility of the person from which they originated and that Google is not liable for any loss or damage that you may experience as a result of the use or access of any of those third party applications, data, content, or resources.\n\n7.2 You should be aware the data, content, and resources presented to you through such a third party application may be protected by intellectual property rights which are owned by the providers (or by other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute or create derivative works based on these data, content, or resources (either in whole or in part) unless you have been specifically given permission to do so by the relevant owners.\n\n7.3 You acknowledge that your use of such third party applications, data, content, or resources may be subject to separate terms between you and the relevant third party.\n\n8. Using Google APIs\n\n8.1 Google APIs\n\n8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be protected by intellectual property rights which are owned by Google or those parties that provide the data (or by other persons or companies on their behalf). Your use of any such API may be subject to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create derivative works based on this data (either in whole or in part) unless allowed by the relevant Terms of Service.\n\n8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you shall retrieve data only with the user's explicit consent and only when, and for the limited purposes for which, the user has given you permission to do so.\n\n9. Terminating the License Agreement\n\n9.1 The License Agreement will continue to apply until terminated by either you or Google as set out below.\n\n9.2 If you want to terminate the License Agreement, you may do so by ceasing your use of the SDK and any relevant developer credentials.\n\n9.3 Google may at any time, terminate the License Agreement, with or without cause, upon notice to you.\n\n9.4 The License Agreement will automatically terminate without notice or other action when Google ceases to provide the SDK or certain parts of the SDK to users in the country in which you are resident or from which you use the service.\n\n9.5 When the License Agreement is terminated, the license granted to you in the License Agreement will terminate, you will immediately cease all use of the SDK, and the provisions of paragraphs 10, 11, 12 and 14 shall survive indefinitely.\n\n10. DISCLAIMERS\n\n10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SDK IS AT YOUR SOLE RISK AND THAT THE SDK IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE.\n\n10.2 YOUR USE OF THE SDK AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE SDK IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. WITHOUT LIMITING THE FOREGOING, YOU UNDERSTAND THAT THE SDK MAY CONTAIN ERRORS, DEFECTS AND SECURITY VULNERABILITIES THAT CAN RESULT IN SIGNIFICANT DAMAGE, INCLUDING THE COMPLETE, IRRECOVERABLE LOSS OF USE OF YOUR COMPUTER SYSTEM OR OTHER DEVICE.\n\n10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.\n\n11. LIMITATION OF LIABILITY\n\n11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING.\n\n12. Indemnification\n\n12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless Google, its affiliates and their respective directors, officers, employees and agents from and against any and all claims, actions, suits or proceedings, as well as any and all losses, liabilities, damages, costs and expenses (including reasonable attorneys\u2019 fees) arising out of or accruing from (a) your use of the SDK, (b) any application you develop on the SDK that infringes any Intellectual Property Rights of any person or defames any person or violates their rights of publicity or privacy, and (c) any non-compliance by you of the License Agreement.\n\n13. Changes to the License Agreement\n\n13.1 Google may make changes to the License Agreement as it distributes new versions of the SDK. When these changes are made, Google will make a new version of the License Agreement available on the website where the SDK is made available.\n\n14. General Legal Terms\n\n14.1 The License Agreement constitutes the whole legal agreement between you and Google and governs your use of the SDK (excluding any services which Google may provide to you under a separate written agreement), and completely replaces any prior agreements between you and Google in relation to the SDK.\n\n14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is contained in the License Agreement (or which Google has the benefit of under any applicable law), this will not be taken to be a formal waiver of Google's rights and that those rights or remedies will still be available to Google.\n\n14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of the License Agreement is invalid, then that provision will be removed from the License Agreement without affecting the rest of the License Agreement. The remaining provisions of the License Agreement will continue to be valid and enforceable.\n\n14.4 You acknowledge and agree that each member of the group of companies of which Google is the parent shall be third party beneficiaries to the License Agreement and that such other companies shall be entitled to directly enforce, and rely upon, any provision of the License Agreement that confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall be third party beneficiaries to the License Agreement.\n\n14.5 EXPORT RESTRICTIONS. THE SDK IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE SDK. THESE LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE.\n\n14.6 The License Agreement may not be assigned or transferred by you without the prior written approval of Google, and any attempted assignment without such approval will be void. You shall not delegate your responsibilities or obligations under the License Agreement without the prior written approval of Google.\n\n14.7 The License Agreement, and your relationship with Google under the License Agreement, shall be governed by the laws of the State of California without regard to its conflict of laws provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located within the county of Santa Clara, California to resolve any legal matter arising from the License Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction.\n\nJune 2014.\n
+Pkg.LicenseRef=android-sdk-license
+Pkg.Revision=22
+Pkg.SourceUrl=https\://dl.google.com/android/repository/repository-11.xml
diff --git a/love2dToAPK/tools/tools/android-win/platform-tools/sqlite3.exe b/love2dToAPK/tools/tools/android-win/platform-tools/sqlite3.exe
new file mode 100644
index 0000000..a16d018
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/platform-tools/sqlite3.exe
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/platform-tools/systrace/AUTHORS b/love2dToAPK/tools/tools/android-win/platform-tools/systrace/AUTHORS
new file mode 100644
index 0000000..5a7ed82
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/platform-tools/systrace/AUTHORS
@@ -0,0 +1,12 @@
+# Names should be added to this file with this pattern:
+#
+# For individuals:
+# Name <email address>
+#
+# For organizations:
+# Organization <fnmatch pattern>
+#
+# See python fnmatch module documentation for more information.
+
+The Chromium Authors <*@chromium.org>
+Google Inc. <*@google.com>
diff --git a/love2dToAPK/tools/tools/android-win/platform-tools/systrace/LICENSE b/love2dToAPK/tools/tools/android-win/platform-tools/systrace/LICENSE
new file mode 100644
index 0000000..8dc3504
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/platform-tools/systrace/LICENSE
@@ -0,0 +1,27 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/love2dToAPK/tools/tools/android-win/platform-tools/systrace/NOTICE b/love2dToAPK/tools/tools/android-win/platform-tools/systrace/NOTICE
new file mode 100644
index 0000000..624b6da
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/platform-tools/systrace/NOTICE
@@ -0,0 +1,205 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
diff --git a/love2dToAPK/tools/tools/android-win/platform-tools/systrace/UPSTREAM_REVISION b/love2dToAPK/tools/tools/android-win/platform-tools/systrace/UPSTREAM_REVISION
new file mode 100644
index 0000000..1e25699
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/platform-tools/systrace/UPSTREAM_REVISION
@@ -0,0 +1 @@
+775
diff --git a/love2dToAPK/tools/tools/android-win/platform-tools/systrace/prefix.html b/love2dToAPK/tools/tools/android-win/platform-tools/systrace/prefix.html
new file mode 100644
index 0000000..21bf427
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/platform-tools/systrace/prefix.html
@@ -0,0 +1,38 @@
+<!DOCTYPE HTML>
+<html>
+<head i18n-values="dir:textdirection;">
+<meta charset="utf-8"/>
+<title>Android System Trace</title>
+%s
+%s
+<script language="javascript">
+document.addEventListener('DOMContentLoaded', function() {
+ if (!linuxPerfData)
+ return;
+
+ var m = new tracing.TraceModel(linuxPerfData);
+ var timelineViewEl = document.querySelector('.view');
+ ui.decorate(timelineViewEl, tracing.TimelineView);
+ timelineViewEl.model = m;
+ timelineViewEl.tabIndex = 1;
+ timelineViewEl.timeline.focusElement = timelineViewEl;
+});
+</script>
+<style>
+ .view {
+ overflow: hidden;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ }
+</style>
+</head>
+<body>
+ <div>%s</div>
+ <div class="view">
+ </div>
+<!-- BEGIN TRACE -->
+ <script>
+ var linuxPerfData = "\
diff --git a/love2dToAPK/tools/tools/android-win/platform-tools/systrace/script.js b/love2dToAPK/tools/tools/android-win/platform-tools/systrace/script.js
new file mode 100644
index 0000000..6eb2b37
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/platform-tools/systrace/script.js
@@ -0,0 +1,546 @@
+window.FLATTENED={};window.FLATTENED_RAW_SCRIPTS={};window.FLATTENED.base=!0;window.FLATTENED["tracing.color_scheme"]=!0;window.FLATTENED["tracing.importer.linux_perf.parser"]=!0;window.FLATTENED["base.guid"]=!0;window.FLATTENED["tracing.trace_model.counter_series"]=!0;window.FLATTENED["tracing.importer.linux_perf.android_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.bus_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.clock_parser"]=!0;
+window.FLATTENED["tracing.importer.linux_perf.cpufreq_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.disk_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.drm_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.exynos_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.gesture_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.i915_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.irq_parser"]=!0;
+window.FLATTENED["tracing.importer.linux_perf.kfunc_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.mali_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.memreclaim_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.power_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.sched_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.sync_parser"]=!0;window.FLATTENED["tracing.importer.linux_perf.workqueue_parser"]=!0;window.FLATTENED["base.event_target"]=!0;
+window.FLATTENED["base.events"]=!0;window.FLATTENED["base.range"]=!0;window.FLATTENED["tracing.filter"]=!0;window.FLATTENED["tracing.trace_model.counter"]=!0;window.FLATTENED["tracing.trace_model.trace_model_event"]=!0;window.FLATTENED["tracing.trace_model.slice"]=!0;window.FLATTENED["tracing.trace_model.cpu"]=!0;window.FLATTENED["base.sorted_array_utils"]=!0;window.FLATTENED["base.iteration_helpers"]=!0;window.FLATTENED["base.utils"]=!0;window.FLATTENED["tracing.trace_model.object_snapshot"]=!0;
+window.FLATTENED["tracing.trace_model.object_instance"]=!0;window.FLATTENED["tracing.trace_model.time_to_object_instance_map"]=!0;window.FLATTENED["tracing.trace_model.object_collection"]=!0;window.FLATTENED["tracing.trace_model.async_slice"]=!0;window.FLATTENED["tracing.trace_model.async_slice_group"]=!0;window.FLATTENED["tracing.trace_model.sample"]=!0;window.FLATTENED["tracing.trace_model.slice_group"]=!0;window.FLATTENED["tracing.trace_model.thread"]=!0;window.FLATTENED["base.settings"]=!0;
+window.FLATTENED["tracing.trace_model_settings"]=!0;window.FLATTENED["tracing.trace_model.process_base"]=!0;window.FLATTENED["tracing.trace_model.kernel"]=!0;window.FLATTENED["tracing.trace_model.process"]=!0;window.FLATTENED["tracing.trace_model"]=!0;window.FLATTENED["tracing.importer.linux_perf_importer"]=!0;window.FLATTENED_RAW_SCRIPTS["../third_party/gl-matrix/src/gl-matrix/common.js"]=!0;window.FLATTENED_RAW_SCRIPTS["../third_party/gl-matrix/src/gl-matrix/mat2d.js"]=!0;
+window.FLATTENED_RAW_SCRIPTS["../third_party/gl-matrix/src/gl-matrix/mat4.js"]=!0;window.FLATTENED_RAW_SCRIPTS["../third_party/gl-matrix/src/gl-matrix/vec2.js"]=!0;window.FLATTENED_RAW_SCRIPTS["../third_party/gl-matrix/src/gl-matrix/vec3.js"]=!0;window.FLATTENED_RAW_SCRIPTS["../third_party/gl-matrix/src/gl-matrix/vec4.js"]=!0;window.FLATTENED["base.gl_matrix"]=!0;window.FLATTENED["base.quad"]=!0;window.FLATTENED["tracing.trace_model.instant_event"]=!0;
+window.FLATTENED["tracing.importer.trace_event_importer"]=!0;window.FLATTENED["tracing.importer.v8.splaytree"]=!0;window.FLATTENED["tracing.importer.v8.codemap"]=!0;window.FLATTENED["tracing.importer.v8.log_reader"]=!0;window.FLATTENED["tracing.importer.v8_log_importer"]=!0;window.FLATTENED["tracing.importer"]=!0;window.FLATTENED["tracing.analysis.util"]=!0;window.FLATTENED["tracing.selection"]=!0;window.FLATTENED.ui=!0;window.FLATTENED["tracing.analysis.analysis_link"]=!0;
+window.FLATTENED["tracing.analysis.generic_object_view"]=!0;window.FLATTENED["tracing.analysis.analysis_results"]=!0;window.FLATTENED["tracing.analysis.analyze_counters"]=!0;window.FLATTENED["tracing.analysis.analyze_slices"]=!0;window.FLATTENED["tracing.analysis.analyze_selection"]=!0;window.FLATTENED["tracing.analysis.object_instance_view"]=!0;window.FLATTENED["tracing.analysis.object_snapshot_view"]=!0;window.FLATTENED["tracing.analysis.default_object_view"]=!0;
+window.FLATTENED["tracing.analysis.slice_view"]=!0;window.FLATTENED["tracing.analysis.analysis_view"]=!0;window.FLATTENED["base.properties"]=!0;window.FLATTENED["ui.overlay"]=!0;window.FLATTENED["tracing.category_filter_dialog"]=!0;window.FLATTENED["tracing.mouse_mode_constants"]=!0;window.FLATTENED["tracing.timeline_viewport"]=!0;window.FLATTENED["base.raf"]=!0;window.FLATTENED["ui.container_that_decorates_its_children"]=!0;window.FLATTENED["tracing.tracks.track"]=!0;
+window.FLATTENED["tracing.tracks.drawing_container"]=!0;window.FLATTENED["tracing.constants"]=!0;window.FLATTENED["tracing.tracks.heading_track"]=!0;window.FLATTENED["tracing.tracks.ruler_track"]=!0;window.FLATTENED["base.measuring_stick"]=!0;window.FLATTENED["tracing.tracks.container_track"]=!0;window.FLATTENED["tracing.fast_rect_renderer"]=!0;window.FLATTENED["tracing.tracks.slice_track"]=!0;window.FLATTENED["tracing.tracks.cpu_track"]=!0;
+window.FLATTENED["tracing.tracks.object_instance_track"]=!0;window.FLATTENED["tcmalloc.heap_instance_track"]=!0;window.FLATTENED["tracing.tracks.counter_track"]=!0;window.FLATTENED["tracing.tracks.spacing_track"]=!0;window.FLATTENED["tracing.tracks.slice_group_track"]=!0;window.FLATTENED["tracing.tracks.async_slice_group_track"]=!0;window.FLATTENED["tracing.tracks.thread_track"]=!0;window.FLATTENED["ui.dom_helpers"]=!0;window.FLATTENED["tracing.tracks.process_track_base"]=!0;
+window.FLATTENED["tracing.tracks.kernel_track"]=!0;window.FLATTENED["tracing.tracks.process_track"]=!0;window.FLATTENED["tracing.tracks.trace_model_track"]=!0;window.FLATTENED["ui.mouse_mode_selector"]=!0;window.FLATTENED["tracing.timeline_track_view"]=!0;window.FLATTENED["tracing.find_control"]=!0;window.FLATTENED["ui.drag_handle"]=!0;window.FLATTENED["tracing.timeline_view"]=!0;window.FLATTENED["tracing.standalone_timeline_view"]=!0;
+var templateData_=window.atob("PCEtLQpDb3B5cmlnaHQgKGMpIDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuClVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLS0+Cgo8dGVtcGxhdGUgaWQ9InJlY29yZC1zZWxlY3Rpb24tZGlhbG9nLXRlbXBsYXRlIj4KICA8ZGl2IGNsYXNzPSJyZWNvcmQtc2VsZWN0aW9uLWRpYWxvZyI+CiAgICA8Zm9ybT4KICAgICAgPHRhYmxlPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iZGVmYXVsdC1lbmFibGVkLWNhdGVnb3JpZXMiPgogICAgICAgICAgICA8ZGl2PlJlY29yZCZuYnNwO0NhdGVnb3JpZXM8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZ3JvdXAtc2VsZWN0b3JzIj4KICAgICAgICAgICAgICBTZWxlY3QKICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJhbGwtYnRuIj5BbGw8L2J1dHRvbj4KICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJub25lLWJ0biI+Tm9uZTwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2F0ZWdvcmllcyI+PC9kaXY+CiAgICAgICAgICA8L3RkPgogICAgICAgICAgPHRkIGNsYXNzPSJkZWZhdWx0LWRpc2FibGVkLWNhdGVnb3JpZXMiPgogICAgICAgICAgICA8ZGl2PkRpc2FibGVkJm5ic3A7YnkmbmJzcDtEZWZhdWx0Jm5ic3A7Q2F0ZWdvcmllczwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJncm91cC1zZWxlY3RvcnMiPgogICAgICAgICAgICAgIFNlbGVjdAogICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImFsbC1idG4iPkFsbDwvYnV0dG9uPgogICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9Im5vbmUtYnRuIj5Ob25lPC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXRlZ29yaWVzIj48L2Rpdj4KICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgICAgPC90YWJsZT4KICAgIDwvZm9ybT4KCiAgICA8ZGl2IGNsYXNzPSJvcHRpb25zIj4KICAgICAgPGJ1dHRvbiBjbGFzcz0icmVjb3JkLWNhdGVnb3JpZXMiPlJlY29yZDwvYnV0dG9uPgogICAgICA8bGFiZWwgY2xhc3M9ImNvbnRpbnVvdXMtdHJhY2luZy1sYWJlbCI+CiAgICAgICAgQ29udGludW91cyB0cmFjaW5nCiAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iY29udGludW91c1RyYWNpbmciIGNoZWNrZWQ9ImNoZWNrZWQiCiAgICAgICAgICAgICAgIGNsYXNzPSJjb250aW51b3VzLXRyYWNpbmctYnV0dG9uIiAvPgogICAgICA8L2xhYmVsPgogICAgICA8bGFiZWwgY2xhc3M9InN5c3RlbS10cmFjaW5nLWxhYmVsIj4KICAgICAgICBTeXN0ZW0gZXZlbnRzCiAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0ic3lzdGVtVHJhY2luZyIKICAgICAgICAgICAgICAgY2xhc3M9InN5c3RlbS10cmFjaW5nLWJ1dHRvbiIgLz4KICAgICAgPC9sYWJlbD4KICAgICAgPGxhYmVsIGNsYXNzPSJzYW1wbGluZy1sYWJlbCI+CiAgICAgICAgRW5hYmxlIHNhbXBsaW5nCiAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iZW5hYmxlU2FtcGxpbmciIGNsYXNzPSJzYW1wbGluZy1idXR0b24iIC8+CiAgICAgIDwvbGFiZWw+CiAgICA8L2Rpdj4KICA8L2Rpdj4KPC90ZW1wbGF0ZT4KPCEtLQpDb3B5cmlnaHQgKGMpIDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuClVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLS0+Cgo8dGVtcGxhdGUgaWQ9InZpZXctY2F0ZWdvcnktZmlsdGVyLWRpYWxvZy10ZW1wbGF0ZSI+CiAgPGRpdiBjbGFzcz0iY2F0ZWdvcnktZmlsdGVyLWRpYWxvZyI+CiAgICBTZWxlY3QgYWN0aXZlIGNhdGVnb3JpZXM6CiAgICA8Zm9ybSBjbGFzcz0iY2F0ZWdvcnktZmlsdGVyLWRpYWxvZy1mb3JtIj4KICAgICAgPGRpdiBjbGFzcz0iY2F0ZWdvcmllcyI+CiAgICAgIDwvZGl2PgogICAgPC9mb3JtPgogIDwvZGl2Pgo8L3RlbXBsYXRlPgo8IS0tCkNvcHlyaWdodCAoYykgMjAxMyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQpmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotLT4KCjx0ZW1wbGF0ZSBpZD0idGltZWxpbmUtdmlldy10ZW1wbGF0ZSI+CiAgPGRpdiBjbGFzcz0iY29udHJvbCI+CiAgICA8ZGl2IGlkPSJsZWZ0LWNvbnRyb2xzIiBjbGFzcz0iY29udHJvbHMiPjwvZGl2PgogICAgPGRpdiBjbGFzcz0idGl0bGUiPl5fXjwvZGl2PgogICAgPGRpdiBpZD0icmlnaHQtY29udHJvbHMiIGNsYXNzPSJjb250cm9scyBjYXRlZ29yeS1maWx0ZXIiPjwvZGl2PgogIDwvZGl2PgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+PC9kaXY+CjwvdGVtcGxhdGU+Cgo8dGVtcGxhdGUgaWQ9InRyYWNrLXNlbGVjdG9yLWJ0bi10ZW1wbGF0ZSI+CiAgPGRpdiBjbGFzcz0idHJhY2stc2VsZWN0b3ItYW5jaG9yIj4KICAgIDxidXR0b24gY2xhc3M9ImJ1dHRvbiB0cmFjay1zZWxlY3Rvci1idXR0b24gdHJhY2stc2VsZWN0b3ItY2xvc2VkIj4KICAgICAgVHJhY2sgU2VsZWN0b3IKICAgIDwvYnV0dG9uPgogIDwvZGl2Pgo8L3RlbXBsYXRlPgoKPHRlbXBsYXRlIGlkPSJpbXBvcnQtZXJyb3JzLWJ0bi10ZW1wbGF0ZSI+CiAgPGRpdiBjbGFzcz0iYnV0dG9uIHZpZXctaW1wb3J0LWVycm9ycy1idXR0b24gdmlldy1pbmZvLWJ1dHRvbiI+CiAgICBJbXBvcnQgZXJyb3JzIQogIDwvZGl2PgogIDxkaXYgY2xhc3M9ImluZm8tYnV0dG9uLWNvbnRhaW5lciBpbXBvcnQtZXJyb3JzLWRpYWxvZyI+CiAgICBFcnJvcnMgb2NjdXJyZWQgZHVyaW5nIGltcG9ydDoKICAgIDxkaXYgY2xhc3M9ImluZm8tYnV0dG9uLXRleHQgaW1wb3J0LWVycm9ycy1kaWFsb2ctdGV4dCI+PC9kaXY+CiAgPC9kaXY+CjwvdGVtcGxhdGU+Cgo8dGVtcGxhdGUgaWQ9ImNhdGVnb3J5LWZpbHRlci1idG4tdGVtcGxhdGUiPgogIDxkaXYgY2xhc3M9ImJ1dHRvbiB2aWV3LWluZm8tYnV0dG9uIj5DYXRlZ29yaWVzPC9kaXY+CjwvdGVtcGxhdGU+Cgo8dGVtcGxhdGUgaWQ9ImhlbHAtYnRuLXRlbXBsYXRlIj4KICA8ZGl2IGNsYXNzPSJidXR0b24gdmlldy1oZWxwLWJ1dHRvbiI+PzwvZGl2PgogIDxkaXYgY2xhc3M9InZpZXctaGVscC10ZXh0IgogICAgICBzdHlsZT0id2hpdGUtc3BhY2U6IHByZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZSI+PC9kaXY+CjwvdGVtcGxhdGU+Cgo8dGVtcGxhdGUgaWQ9Im1ldGFkYXRhLWJ0bi10ZW1wbGF0ZSI+CiAgPGRpdiBjbGFzcz0iYnV0dG9uIHZpZXctbWV0YWRhdGEtYnV0dG9uIHZpZXctaW5mby1idXR0b24iPgogICAgTWV0YWRhdGEKICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJpbmZvLWJ1dHRvbi1jb250YWluZXIgbWV0YWRhdGEtZGlhbG9nIj4KICAgIE1ldGFkYXRhIEluZm86CiAgICA8ZGl2IGNsYXNzPSJpbmZvLWJ1dHRvbi10ZXh0IG1ldGFkYXRhLWRpYWxvZy10ZXh0Ij48L2Rpdj4KICA8L2Rpdj4KPC90ZW1wbGF0ZT4KPCEtLQpDb3B5cmlnaHQgKGMpIDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuClVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLS0+Cgo8dGVtcGxhdGUgaWQ9Im1vdXNlLW1vZGUtc2VsZWN0b3ItdGVtcGxhdGUiPgogIDxkaXYgY2xhc3M9ImRyYWctaGFuZGxlIj48L2Rpdj4KICA8ZGl2IGNsYXNzPSJidXR0b25zIj4KICAgIDxkaXYgY2xhc3M9InBhbi1zY2FuLW1vZGUtYnV0dG9uIHRvb2wtYnV0dG9uIj48L2Rpdj4KICAgIDxkaXYgY2xhc3M9InNlbGVjdGlvbi1tb2RlLWJ1dHRvbiB0b29sLWJ1dHRvbiI+PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJ6b29tLW1vZGUtYnV0dG9uIHRvb2wtYnV0dG9uIj48L2Rpdj4KICA8L2Rpdj4KPC90ZW1wbGF0ZT4K"),templateElem_=
+document.createElement("div");for(templateElem_.innerHTML=templateData_;templateElem_.hasChildNodes();)document.head.appendChild(templateElem_.removeChild(templateElem_.firstChild));"use strict";var global=this;
+this.base=function(){function d(a){"/"==a[a.length-1]&&(a=a.substring(0,a.length-1));l=a}function b(a,c){n[a]||(n[a]=[]);for(var e=n[a],f=!1,b=0;b<e.length;b++)e[b]==c&&(f=!0);f||e.push(c)}function a(a,c){q[a]||(q[a]=[]);for(var e=q[a],f=!1,b=0;b<q.length;b++)e[b]==c&&(f=!0);f||e.push(c)}function c(a,c){p[a]||(p[a]=[]);for(var e=p[a],f=!1,b=0;b<e.length;b++)e[b]==c&&(f=!0);f||e.push(c)}function e(){if(!window.FLATTENED&&!m){m=!0;var e=new XMLHttpRequest;e.open("GET","/deps.js",!1);e.send(null);if(200!=
+e.status){var e=JSON.parse(e.responseText),f="You have a module problem: "+e.message,g=document.createElement("div");g.style.position="fixed";g.style.border="3px solid red";g.style.color="black";g.style.padding="8px";g.innerHTML='<h2>Module parsing problem</h2><div id="message"></div><pre id="details"></pre>';g.querySelector("#message").textContent=e.message;var h=g.querySelector("#details");h.textContent=e.details;h.style.maxWidth="800px";h.style.overflow="auto";document.body?document.body.appendChild(g):
+setTimeout(function(){document.body.appendChild(g)},150);throw Error(f);}base.addModuleDependency=b;base.addModuleRawScriptDependency=a;base.addModuleStylesheet=c;try{eval(e.responseText)}catch(d){throw Error("When loading deps, got "+d.stack?d.stack:d.message);}delete base.addModuleStylesheet;delete base.addModuleRawScriptDependency;delete base.addModuleDependency}}function f(){if(!s&&!window.FLATTENED){s=!0;var a=new XMLHttpRequest;a.open("GET","/templates",!1);a.send(null);var c=document.createElement("div");
+for(c.innerHTML=a.responseText;c.hasChildNodes();)document.head.appendChild(c.removeChild(c.firstChild))}}function g(a,c){var b=c||0,d=a;a instanceof Array||(d=[a]);e();f();d.forEach(function(a){if(window.FLATTENED){if(!window.FLATTENED[a])throw Error("Somehow, module "+a+" didn't get stored in the flattened js file! You may need to rerun build/generate_about_tracing_contents.py");}else if("APPENDED"!=u[a]&&"RESOLVING"!=u[a]){u[a]="RESOLVING";g(n[a]||[],b+1);for(var c=p[a]||[],e=0;e<c.length;e++)k(c[e]);
+c=q[a]||[];for(e=0;e<c.length;e++){var f=c[e];w[f]||(h(f),w[f]="APPENDED")}h(a.replace(/\./g,"/")+".js");u[name]="APPENDED"}})}function h(a){var c=document.createElement("script");c.src=l+"/"+a;c.type="text/javascript";c.defer=!0;c.async=!1;base.doc.head.appendChild(c)}function k(a){if(!window.FLATTENED&&!t[a]){t[a]=!0;a=a.replace(/\./g,"/")+".css";a=l+"/"+a;var c=document.createElement("link");c.setAttribute("rel","stylesheet");c.setAttribute("href",a);base.doc.head.appendChild(c)}}var l=".",m=!1,
+n={},p={},q={},s=!1,u={},w={},t={},r={};return{set moduleBasePath(a){d(a)},get moduleBasePath(){return l},initialize:function(){if(global.document)base.doc=document,base.isMac=/Mac/.test(navigator.platform),base.isWindows=/Win/.test(navigator.platform),base.isChromeOS=/CrOS/.test(navigator.userAgent),base.isLinux=/Linux/.test(navigator.userAgent),base.isGTK=/GTK/.test(chrome.toolkit),base.isViews=/views/.test(chrome.toolkit),d("/src");else{var a=base;Object.defineProperty(global,"base",{get:function(){Object.defineProperty(global,
+"base",{value:a});a.initialize();return a},configurable:!0})}},require:g,requireStylesheet:k,requireRawScript:function(a){if(window.FLATTENED_RAW_SCRIPTS){if(!window.FLATTENED_RAW_SCRIPTS[a])throw Error("Somehow, "+a+" didn't get stored in the flattened js file! You may need to rerun build/generate_about_tracing_contents.py");}else if(!w[a])throw Error(a+" should already have been loaded. Did you forget to run build/generate_about_tracing_contents.py?");},requireTemplate:function(a){if(!window.FLATTENED&&
+!r[a]){r[a]=!0;a=a.replace(/\./g,"/")+".html";a=l+"/"+a;var c=document.createElement("link");c.setAttribute("rel","import");c.setAttribute("href",a)}},exportTo:function(a,c){var e;e=a.split(".");for(var f=global,b;e.length&&(b=e.shift());)f=b in f?f[b]:f[b]={};e=f;try{var g=c()}catch(h){console.log("While running exports for ",a,":");console.log(h.stack||h);return}for(var d in g)(f=Object.getOwnPropertyDescriptor(g,d))&&Object.defineProperty(e,d,f)}}}();base.initialize();"use strict";
+base.exportTo("tracing",function(){function d(a){for(var c=0,e=0;e<a.length;++e)c=(c+37*c+11*a.charCodeAt(e))%4294967295;return c}var b=[{r:138,g:113,b:152},{r:175,g:112,b:133},{r:127,g:135,b:225},{r:93,g:81,b:137},{r:116,g:143,b:119},{r:178,g:214,b:122},{r:87,g:109,b:147},{r:119,g:155,b:95},{r:114,g:180,b:160},{r:132,g:85,b:103},{r:157,g:210,b:150},{r:148,g:94,b:86},{r:164,g:108,b:138},{r:139,g:191,b:150},{r:110,g:99,b:145},{r:80,g:129,b:109},{r:125,g:140,b:149},{r:93,g:124,b:132},{r:140,g:85,b:140},
+{r:104,g:163,b:162},{r:132,g:141,b:178},{r:131,g:105,b:147},{r:135,g:183,b:98},{r:152,g:134,b:177},{r:141,g:188,b:141},{r:133,g:160,b:210},{r:126,g:186,b:148},{r:112,g:198,b:205},{r:180,g:122,b:195},{r:203,g:144,b:152},{r:182,g:125,b:143},{r:126,g:200,b:148},{r:133,g:160,b:210},{r:240,g:240,b:240},{r:199,g:155,b:125}],a=b.length-5,c=b.length,e=b.concat(b.map(function(a){var c;c=240<=a.r&&240<=a.g&&240<=a.b?-.2:.45;return{r:Math.min(255,a.r+Math.floor(a.r*c)),g:Math.min(255,a.g+Math.floor(a.g*c)),
+b:Math.min(255,a.b+Math.floor(a.b*c))}})).map(function(a){return"rgb("+a.r+","+a.g+","+a.b+")"}),f={};return{getColorPalette:function(){return e},getColorPaletteHighlightIdBoost:function(){return c},getColorIdByName:function(c){if("iowait"==c)return a;if("running"==c)return a+1;if("runnable"==c)return a+2;if("sleeping"==c)return a+3;if("UNKNOWN"==c)return a+4;throw Error("Unrecognized color ")+c;},getStringHash:d,getStringColorId:function(c){if(void 0===f[c]){var e=d(c);f[c]=e%a}return f[c]}}});"use strict";
+base.exportTo("tracing.importer.linux_perf",function(){function d(a){this.importer=a;this.model=a.model}var b=[];d.registerSubtype=function(a){b.push(a)};d.getSubtypeConstructors=function(){return b};d.prototype={__proto__:Object.prototype};return{Parser:d}});"use strict";base.exportTo("base",function(){var d=1;return{GUID:{allocate:function(){return d++}}}});"use strict";base.require("base.guid");
+base.exportTo("tracing.trace_model",function(){function d(a,c){this.guid_=base.GUID.allocate();this.timestamp_=a;this.value_=c}function b(a,c){this.guid_=base.GUID.allocate();this.name_=a;this.color_=c;this.timestamps_=[];this.samples_=[]}d.prototype={__proto__:Object.prototype,get value(){return this.value_},set timestamp(a){this.timestamp_=a},toJSON:function(){for(var a={},c=Object.keys(this),e=0;e<c.length;e++){var f=c[e];"function"!=typeof this[f]&&(a[f]="parent"==f?this[f].guid:this[f])}return a}};
+b.prototype={__proto__:Object.prototype,toJSON:function(){for(var a={},c=Object.keys(this),e=0;e<c.length;e++){var f=c[e];"function"!=typeof this[f]&&(a[f]="parent"==f?this[f].guid:this[f])}return a},get length(){return this.timestamps_.length},get name(){return this.name_},get color(){return this.color_},get samples(){return this.samples_},get timestamps(){return this.timestamps_},getSample:function(a){return this.samples_[a]},getTimestamp:function(a){return this.timestamps_[a]},addSample:function(a,
+c){this.timestamps_.push(a);this.samples_.push(new d(a,c))},getStatistics:function(a){for(var c=0,e=Number.MAX_VALUE,f=-Number.MAX_VALUE,b=0;b<a.length;++b)var h=this.getSample(a[b]).value,c=c+h,e=Math.min(h,e),f=Math.max(h,f);return{min:e,max:f,avg:c/a.length,start:this.getSample(a[0]).value,end:this.getSample(a.length-1).value}},shiftTimestampsForward:function(a){for(var c=0;c<this.timestamps_.length;++c)this.timestamps_[c]+=a,this.samples_[c].timestamp=this.timestamps_[c]}};return{CounterSeries:b}});
+"use strict";base.require("tracing.importer.linux_perf.parser");base.require("tracing.trace_model.counter_series");
+base.exportTo("tracing.importer.linux_perf",function(){function d(c){a.call(this,c);c.registerEventHandler("tracing_mark_write:android",d.prototype.traceMarkWriteAndroidEvent.bind(this));c.registerEventHandler("0:android",d.prototype.traceMarkWriteAndroidEvent.bind(this));this.model_=c.model_;this.ppids_={}}function b(a){var e={};if(a){a=a.split(";");for(var f=0;f<a.length;++f){var b=a[f].split("=");b[0]&&(e[b.shift()]=b.join("="))}}return e}var a=tracing.importer.linux_perf.Parser;d.prototype={__proto__:a.prototype,
+openAsyncSlice:function(a,e,f,b,h){e=new tracing.trace_model.AsyncSlice(e,f,tracing.getStringColorId(f),h);e.id=b;e.startThread=a;this.openAsyncSlices||(this.openAsyncSlices={});this.openAsyncSlices[f+":"+b]=e},closeAsyncSlice:function(a,e,f,b){this.openAsyncSlices&&(e=e+":"+f,f=this.openAsyncSlices[e])&&(f.endThread=a,f.duration=b-f.start,f.startThread.asyncSliceGroup.push(f),f.subSlices=[new tracing.trace_model.Slice(f.category,f.title,f.colorId,f.start,f.args,f.duration)],delete this.openAsyncSlices[e])},
+traceMarkWriteAndroidEvent:function(a,e,f,g,h){a=h.details.split("|");switch(a[0]){case "B":e=parseInt(a[1]);var d=a[4],l=a[2],m=this.model_.getOrCreateProcess(e).getOrCreateThread(f);m.name=h.threadName;if(!m.sliceGroup.isTimestampValidForBeginOrEnd(g))return this.model_.importErrors.push("Timestamps are moving backward."),!1;this.ppids_[f]=e;m.sliceGroup.beginSlice(d,l,g,b(a[3]));break;case "E":e=this.ppids_[f];if(void 0===e)break;m=this.model_.getOrCreateProcess(e).getOrCreateThread(f);if(!m.sliceGroup.openSliceCount)break;
+f=m.sliceGroup.endSlice(g);h=b(a[3]);for(d in h)void 0!==f.args[d]&&this.model_.importErrors.push("Both the B and E events of "+f.title+"provided values for argument "+d+". The value of the E event will be used."),f.args[d]=h[d];break;case "C":e=parseInt(a[1]);var l=a[2],n=parseInt(a[3]),d=a[4];f=this.model_.getOrCreateProcess(e).getOrCreateCounter(d,l);0===f.numSeries&&f.addSeries(new tracing.trace_model.CounterSeries(n,tracing.getStringColorId(f.name+".value")));f.series.forEach(function(a){a.addSample(g,
+n)});break;case "S":e=parseInt(a[1]);l=a[2];a=parseInt(a[3]);m=this.model_.getOrCreateProcess(e).getOrCreateThread(f);m.name=h.threadName;this.ppids_[f]=e;this.openAsyncSlice(m,null,l,a,g);break;case "F":e=parseInt(a[1]);l=a[2];a=parseInt(a[3]);m=this.model_.getOrCreateProcess(e).getOrCreateThread(f);m.name=h.threadName;this.ppids_[f]=e;this.closeAsyncSlice(m,l,a,g);break;default:return!1}return!0}};a.registerSubtype(d);return{AndroidParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
+base.require("tracing.trace_model.counter_series");
+base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("memory_bus_usage",d.prototype.traceMarkWriteBusEvent.bind(this));this.model_=a.model_;this.ppids_={}}var b=tracing.importer.linux_perf.Parser;d.prototype={__proto__:b.prototype,traceMarkWriteBusEvent:function(a,c,e,f,b,h){e=/bus=(\S+) rw_bytes=(\d+) r_bytes=(\d+) w_bytes=(\d+) cycles=(\d+) ns=(\d+)/.exec(b.details);a=e[1];parseInt(e[2]);c=parseInt(e[3]);parseInt(e[4]);parseInt(e[5]);e=parseInt(e[6]);
+var d=1E9*c/e,d=d/1048576;c=this.model_.getOrCreateProcess(0).getOrCreateCounter(null,"bus "+a+" read");0===c.numSeries&&c.addSeries(new tracing.trace_model.CounterSeries("value",tracing.getStringColorId(c.name+".value")));c.series.forEach(function(a){a.addSample(f,d)});c=this.model_.getOrCreateProcess(0).getOrCreateCounter(null,"bus "+a+" write");0===c.numSeries&&c.addSeries(new tracing.trace_model.CounterSeries("value",tracing.getStringColorId(c.name+".value")));c.series.forEach(function(a){a.addSample(f,
+d)});return!0}};b.registerSubtype(d);return{BusParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");base.require("tracing.trace_model.counter_series");
+base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("clock_set_rate",d.prototype.traceMarkWriteClockEvent.bind(this));this.model_=a.model_;this.ppids_={}}var b=tracing.importer.linux_perf.Parser;d.prototype={__proto__:b.prototype,traceMarkWriteClockEvent:function(a,c,e,f,b,h){a=/(\S+) state=(\d+) cpu_id=(\d+)/.exec(b.details);c=a[1];var d=parseInt(a[2]);a=this.model_.getOrCreateProcess(0).getOrCreateCounter(null,c);0===a.numSeries&&a.addSeries(new tracing.trace_model.CounterSeries("value",
+tracing.getStringColorId(a.name+".value")));a.series.forEach(function(a){a.addSample(f,d)});return!0}};b.registerSubtype(d);return{ClockParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
+base.exportTo("tracing.importer.linux_perf",function(){function d(c){a.call(this,c);c.registerEventHandler("cpufreq_interactive_up",d.prototype.cpufreqUpDownEvent.bind(this));c.registerEventHandler("cpufreq_interactive_down",d.prototype.cpufreqUpDownEvent.bind(this));c.registerEventHandler("cpufreq_interactive_already",d.prototype.cpufreqTargetEvent.bind(this));c.registerEventHandler("cpufreq_interactive_notyet",d.prototype.cpufreqTargetEvent.bind(this));c.registerEventHandler("cpufreq_interactive_setspeed",
+d.prototype.cpufreqTargetEvent.bind(this));c.registerEventHandler("cpufreq_interactive_target",d.prototype.cpufreqTargetEvent.bind(this));c.registerEventHandler("cpufreq_interactive_boost",d.prototype.cpufreqBoostUnboostEvent.bind(this));c.registerEventHandler("cpufreq_interactive_unboost",d.prototype.cpufreqBoostUnboostEvent.bind(this))}function b(a){var e={};a=a.split(/\s+/);for(var f=a.length,b=0;b<f;b++){var h=a[b].split("=");e[h[0]]=parseInt(h[1])}return e}var a=tracing.importer.linux_perf.Parser;
+d.prototype={__proto__:a.prototype,cpufreqSlice:function(a,e,f,b){f=this.importer.getOrCreatePseudoThread("cpufreq");f.openSlice=e;a=new tracing.trace_model.Slice("",f.openSlice,tracing.getStringColorId(f.openSlice),a,b,0);f.thread.sliceGroup.pushSlice(a)},cpufreqBoostSlice:function(a,e,f){var b=this.importer.getOrCreatePseudoThread("cpufreq_boost");b.openSlice=e;a=new tracing.trace_model.Slice("",b.openSlice,tracing.getStringColorId(b.openSlice),a,f,0);b.thread.sliceGroup.pushSlice(a)},cpufreqUpDownEvent:function(a,
+e,f,g,h){e=b(h.details);this.cpufreqSlice(g,a,e.cpu,e);return!0},cpufreqTargetEvent:function(a,e,f,g,h){e=b(h.details);this.cpufreqSlice(g,a,e.cpu,e);return!0},cpufreqBoostUnboostEvent:function(a,e,f,b,h){this.cpufreqBoostSlice(b,a,{type:h.details});return!0}};a.registerSubtype(d);return{CpufreqParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
+base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("f2fs_write_begin",d.prototype.f2fsWriteBeginEvent.bind(this));a.registerEventHandler("f2fs_write_end",d.prototype.f2fsWriteEndEvent.bind(this));a.registerEventHandler("f2fs_sync_file_enter",d.prototype.f2fsSyncFileEnterEvent.bind(this));a.registerEventHandler("f2fs_sync_file_exit",d.prototype.f2fsSyncFileExitEvent.bind(this));a.registerEventHandler("ext4_sync_file_enter",d.prototype.ext4SyncFileEnterEvent.bind(this));
+a.registerEventHandler("ext4_sync_file_exit",d.prototype.ext4SyncFileExitEvent.bind(this));a.registerEventHandler("ext4_da_write_begin",d.prototype.ext4WriteBeginEvent.bind(this));a.registerEventHandler("ext4_da_write_end",d.prototype.ext4WriteEndEvent.bind(this));a.registerEventHandler("block_rq_issue",d.prototype.blockRqIssueEvent.bind(this));a.registerEventHandler("block_rq_complete",d.prototype.blockRqCompleteEvent.bind(this))}var b=tracing.importer.linux_perf.Parser;d.prototype={__proto__:b.prototype,
+openAsyncSlice:function(a,c,e,f,b,h){e=this.importer.getOrCreateKernelThread(c+":"+e,f);a=new tracing.trace_model.AsyncSlice(c,h,tracing.getStringColorId(h),a);a.startThread=e.thread;e.openAsyncSlices||(e.openAsyncSlices={});e.openAsyncSlices[b]=a},closeAsyncSlice:function(a,c,e,f,b,h){e=this.importer.getOrCreateKernelThread(c+":"+e,f);e.openAsyncSlices&&(f=e.openAsyncSlices[b])&&(f.duration=a-f.start,f.args=h,f.endThread=e.thread,f.subSlices=[new tracing.trace_model.Slice(c,f.title,f.colorId,f.start,
+f.args,f.duration)],e.thread.asyncSliceGroup.push(f),delete e.openAsyncSlices[b])},f2fsWriteBeginEvent:function(a,c,e,b,g){var h=/dev = \((\d+,\d+)\), ino = (\d+), pos = (\d+), len = (\d+), flags = (\d+)/.exec(g.details);if(!h)return!1;a=h[1];c=parseInt(h[2]);e=parseInt(h[3]);h=parseInt(h[4]);this.openAsyncSlice(b,"f2fs",g.threadName,g.pid,a+"-"+c+"-"+e+"-"+h,"f2fs_write");return!0},f2fsWriteEndEvent:function(a,c,e,b,g){var h=/dev = \((\d+,\d+)\), ino = (\d+), pos = (\d+), len = (\d+), copied = (\d+)/.exec(g.details);
+if(!h)return!1;a=h[1];c=parseInt(h[2]);e=parseInt(h[3]);var d=parseInt(h[4]),h=parseInt(h[5])!==d;this.closeAsyncSlice(b,"f2fs",g.threadName,g.pid,a+"-"+c+"-"+e+"-"+d,{device:a,inode:c,error:h});return!0},ext4WriteBeginEvent:function(a,c,e,b,g){var h=/dev (\d+,\d+) ino (\d+) pos (\d+) len (\d+) flags (\d+)/.exec(g.details);if(!h)return!1;a=h[1];c=parseInt(h[2]);e=parseInt(h[3]);h=parseInt(h[4]);this.openAsyncSlice(b,"ext4",g.threadName,g.pid,a+"-"+c+"-"+e+"-"+h,"ext4_write");return!0},ext4WriteEndEvent:function(a,
+c,e,b,g){var h=/dev (\d+,\d+) ino (\d+) pos (\d+) len (\d+) copied (\d+)/.exec(g.details);if(!h)return!1;a=h[1];c=parseInt(h[2]);e=parseInt(h[3]);var d=parseInt(h[4]),h=parseInt(h[5])!==d;this.closeAsyncSlice(b,"ext4",g.threadName,g.pid,a+"-"+c+"-"+e+"-"+d,{device:a,inode:c,error:h});return!0},f2fsSyncFileEnterEvent:function(a,c,e,b,g){c=/dev = \((\d+,\d+)\), ino = (\d+), pino = (\d+), i_mode = (\S+), i_size = (\d+), i_nlink = (\d+), i_blocks = (\d+), i_advise = (\d+)/.exec(g.details);if(!c)return!1;
+a=c[1];c=parseInt(c[2]);this.openAsyncSlice(b,"f2fs",g.threadName,g.pid,a+"-"+c,"fsync");return!0},f2fsSyncFileExitEvent:function(a,c,e,b,g){e=/dev = \((\d+,\d+)\), ino = (\d+), checkpoint is (\S+), datasync = (\d+), ret = (\d+)/.exec(g.details.replace("not needed","not_needed"));if(!e)return!1;a=e[1];c=parseInt(e[2]);e=parseInt(e[5]);this.closeAsyncSlice(b,"f2fs",g.threadName,g.pid,a+"-"+c,{device:a,inode:c,error:e});return!0},ext4SyncFileEnterEvent:function(a,c,e,b,g){a=/dev (\d+,\d+) ino (\d+) parent (\d+) datasync (\d+)/.exec(g.details);
+if(!a)return!1;c=a[1];e=parseInt(a[2]);this.openAsyncSlice(b,"ext4",g.threadName,g.pid,c+"-"+e,1==a[4]?"fdatasync":"fsync");return!0},ext4SyncFileExitEvent:function(a,c,e,b,g){e=/dev (\d+,\d+) ino (\d+) ret (\d+)/.exec(g.details);if(!e)return!1;a=e[1];c=parseInt(e[2]);e=parseInt(e[3]);this.closeAsyncSlice(b,"ext4",g.threadName,g.pid,a+"-"+c,{device:a,inode:c,error:e});return!0},blockRqIssueEvent:function(a,c,e,b,g){var h=/(\d+,\d+) (F)?([DWRN])(F)?(A)?(S)?(M)? \d+ \(.*\) (\d+) \+ (\d+) \[.*\]/.exec(g.details);
+if(!h)return!1;switch(h[3]){case "D":a="discard";break;case "W":a="write";break;case "R":a="read";break;case "N":a="none";break;default:a="unknown"}h[2]&&(a+=" flush");"F"==h[4]&&(a+=" fua");"A"==h[5]&&(a+=" ahead");"S"==h[6]&&(a+=" sync");"M"==h[7]&&(a+=" meta");c=h[1];e=parseInt(h[8]);h=parseInt(h[9]);this.openAsyncSlice(b,"block",g.threadName,g.pid,c+"-"+e+"-"+h,a);return!0},blockRqCompleteEvent:function(a,c,e,b,g){var h=/(\d+,\d+) (F)?([DWRN])(F)?(A)?(S)?(M)? \(.*\) (\d+) \+ (\d+) \[(.*)\]/.exec(g.details);
+if(!h)return!1;a=h[1];c=parseInt(h[8]);e=parseInt(h[9]);h=parseInt(h[10]);this.closeAsyncSlice(b,"block",g.threadName,g.pid,a+"-"+c+"-"+e,{device:a,sector:c,numSectors:e,error:h});return!0}};b.registerSubtype(d);return{DiskParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
+base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("drm_vblank_event",d.prototype.vblankEvent.bind(this))}var b=tracing.importer.linux_perf.Parser;d.prototype={__proto__:b.prototype,drmVblankSlice:function(a,c,e){var b=this.importer.getOrCreatePseudoThread("drm_vblank");b.openSlice=c;a=new tracing.trace_model.Slice("",b.openSlice,tracing.getStringColorId(b.openSlice),a,e,0);b.thread.sliceGroup.pushSlice(a)},vblankEvent:function(a,c,e,b,g){c=
+/crtc=(\d+), seq=(\d+)/.exec(g.details);if(!c)return!1;a=parseInt(c[1]);c=parseInt(c[2]);this.drmVblankSlice(b,"vblank:"+a,{crtc:a,seq:c});return!0}};b.registerSubtype(d);return{DrmParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
+base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("exynos_flip_request",d.prototype.flipEvent.bind(this));a.registerEventHandler("exynos_flip_complete",d.prototype.flipEvent.bind(this));a.registerEventHandler("exynos_busfreq_target_int",d.prototype.busfreqTargetIntEvent.bind(this));a.registerEventHandler("exynos_busfreq_target_mif",d.prototype.busfreqTargetMifEvent.bind(this))}var b=tracing.importer.linux_perf.Parser;d.prototype={__proto__:b.prototype,
+exynosFlipOpenSlice:function(a,c){var e=this.importer.getOrCreatePseudoThread("exynos_flip");e.openSliceTS=a;e.openSlice="flip:"+c},exynosFlipCloseSlice:function(a,c){var e=this.importer.getOrCreatePseudoThread("exynos_flip");if(e.openSlice){var b=new tracing.trace_model.Slice("",e.openSlice,tracing.getStringColorId(e.openSlice),e.openSliceTS,c,a-e.openSliceTS);e.thread.sliceGroup.pushSlice(b)}e.openSlice=void 0},flipEvent:function(a,c,e,b,g){c=/pipe=(\d+)/.exec(g.details);if(!c)return!1;c=parseInt(c[1]);
+"exynos_flip_request"==a?this.exynosFlipOpenSlice(b,c):this.exynosFlipCloseSlice(b,{pipe:c});return!0},exynosBusfreqSample:function(a,c,e){a=this.importer.getOrCreateCpuState(0).cpu.getOrCreateCounter("",a);0===a.numSeries&&a.addSeries(new tracing.trace_model.CounterSeries("frequency",tracing.getStringColorId(a.name+".frequency")));a.series.forEach(function(a){a.addSample(c,e)})},busfreqTargetIntEvent:function(a,c,e,b,g){a=/frequency=(\d+)/.exec(g.details);if(!a)return!1;this.exynosBusfreqSample("INT Frequency",
+b,parseInt(a[1]));return!0},busfreqTargetMifEvent:function(a,c,e,b,g){a=/frequency=(\d+)/.exec(g.details);if(!a)return!1;this.exynosBusfreqSample("MIF Frequency",b,parseInt(a[1]));return!0}};b.registerSubtype(d);return{ExynosParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
+base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("tracing_mark_write:log",d.prototype.logEvent.bind(this));a.registerEventHandler("tracing_mark_write:SyncInterpret",d.prototype.syncEvent.bind(this));a.registerEventHandler("tracing_mark_write:HandleTimer",d.prototype.timerEvent.bind(this))}var b=tracing.importer.linux_perf.Parser;d.prototype={__proto__:b.prototype,gestureOpenSlice:function(a,c,e){this.importer.getOrCreatePseudoThread("gesture").thread.sliceGroup.beginSlice("touchpad_gesture",
+a,c,e)},gestureCloseSlice:function(a,c){var e=this.importer.getOrCreatePseudoThread("gesture").thread;if(e.sliceGroup.openSliceCount){var b=e.sliceGroup.mostRecentlyOpenedPartialSlice;b.title!=a?this.importer.importError("Titles do not match. Title is "+b.title+" in openSlice, and is "+a+" in endSlice"):e.sliceGroup.endSlice(c)}},logEvent:function(a,c,e,b,g){a=/^\s*(\w+):\s*(\w+)$/.exec(g.details);switch(a[1]){case "start":this.gestureOpenSlice("GestureLog",b,{name:a[2]});break;case "end":this.gestureCloseSlice("GestureLog",
+b)}return!0},syncEvent:function(a,c,e,b,g){a=/^\s*(\w+):\s*(\w+)$/.exec(g.details);switch(a[1]){case "start":this.gestureOpenSlice("SyncInterpret",b,{interpreter:a[2]});break;case "end":this.gestureCloseSlice("SyncInterpret",b)}return!0},timerEvent:function(a,c,e,b,g){a=/^\s*(\w+):\s*(\w+)$/.exec(g.details);switch(a[1]){case "start":this.gestureOpenSlice("HandleTimer",b,{interpreter:a[2]});break;case "end":this.gestureCloseSlice("HandleTimer",b)}return!0}};b.registerSubtype(d);return{GestureParser:d}});
+"use strict";base.require("tracing.importer.linux_perf.parser");
+base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("i915_gem_object_create",d.prototype.gemObjectCreateEvent.bind(this));a.registerEventHandler("i915_gem_object_bind",d.prototype.gemObjectBindEvent.bind(this));a.registerEventHandler("i915_gem_object_unbind",d.prototype.gemObjectBindEvent.bind(this));a.registerEventHandler("i915_gem_object_change_domain",d.prototype.gemObjectChangeDomainEvent.bind(this));a.registerEventHandler("i915_gem_object_pread",
+d.prototype.gemObjectPreadWriteEvent.bind(this));a.registerEventHandler("i915_gem_object_pwrite",d.prototype.gemObjectPreadWriteEvent.bind(this));a.registerEventHandler("i915_gem_object_fault",d.prototype.gemObjectFaultEvent.bind(this));a.registerEventHandler("i915_gem_object_clflush",d.prototype.gemObjectDestroyEvent.bind(this));a.registerEventHandler("i915_gem_object_destroy",d.prototype.gemObjectDestroyEvent.bind(this));a.registerEventHandler("i915_gem_ring_dispatch",d.prototype.gemRingDispatchEvent.bind(this));
+a.registerEventHandler("i915_gem_ring_flush",d.prototype.gemRingFlushEvent.bind(this));a.registerEventHandler("i915_gem_request",d.prototype.gemRequestEvent.bind(this));a.registerEventHandler("i915_gem_request_add",d.prototype.gemRequestEvent.bind(this));a.registerEventHandler("i915_gem_request_complete",d.prototype.gemRequestEvent.bind(this));a.registerEventHandler("i915_gem_request_retire",d.prototype.gemRequestEvent.bind(this));a.registerEventHandler("i915_gem_request_wait_begin",d.prototype.gemRequestEvent.bind(this));
+a.registerEventHandler("i915_gem_request_wait_end",d.prototype.gemRequestEvent.bind(this));a.registerEventHandler("i915_gem_ring_wait_begin",d.prototype.gemRingWaitEvent.bind(this));a.registerEventHandler("i915_gem_ring_wait_end",d.prototype.gemRingWaitEvent.bind(this));a.registerEventHandler("i915_reg_rw",d.prototype.regRWEvent.bind(this));a.registerEventHandler("i915_flip_request",d.prototype.flipEvent.bind(this));a.registerEventHandler("i915_flip_complete",d.prototype.flipEvent.bind(this))}var b=
+tracing.importer.linux_perf.Parser;d.prototype={__proto__:b.prototype,i915FlipOpenSlice:function(a,c,e){var b=this.importer.getOrCreatePseudoThread("i915_flip");b.openSliceTS=a;b.openSlice="flip:"+c+"/"+e},i915FlipCloseSlice:function(a,c){var e=this.importer.getOrCreatePseudoThread("i915_flip");if(e.openSlice){var b=new tracing.trace_model.Slice("",e.openSlice,tracing.getStringColorId(e.openSlice),e.openSliceTS,c,a-e.openSliceTS);e.thread.sliceGroup.pushSlice(b)}e.openSlice=void 0},i915GemObjectSlice:function(a,
+c,e,b){var g=this.importer.getOrCreatePseudoThread("i915_gem");g.openSlice=c+":"+e;a=new tracing.trace_model.Slice("",g.openSlice,tracing.getStringColorId(g.openSlice),a,b,0);g.thread.sliceGroup.pushSlice(a)},i915GemRingSlice:function(a,c,e,b,g){var h=this.importer.getOrCreatePseudoThread("i915_gem_ring");h.openSlice=c+":"+e+"."+b;a=new tracing.trace_model.Slice("",h.openSlice,tracing.getStringColorId(h.openSlice),a,g,0);h.thread.sliceGroup.pushSlice(a)},i915RegSlice:function(a,c,e,b){var g=this.importer.getOrCreatePseudoThread("i915_reg");
+g.openSlice=c+":"+e;a=new tracing.trace_model.Slice("",g.openSlice,tracing.getStringColorId(g.openSlice),a,b,0);g.thread.sliceGroup.pushSlice(a)},gemObjectCreateEvent:function(a,c,e,b,g){e=/obj=(\w+), size=(\d+)/.exec(g.details);if(!e)return!1;c=e[1];e=parseInt(e[2]);this.i915GemObjectSlice(b,a,c,{obj:c,size:e});return!0},gemObjectBindEvent:function(a,c,e,b,g){g=/obj=(\w+), offset=(\w+), size=(\d+)/.exec(g.details);if(!g)return!1;c=g[1];e=g[2];g=parseInt(g[3]);this.i915ObjectGemSlice(b,a+":"+c,{obj:c,
+offset:e,size:g});return!0},gemObjectChangeDomainEvent:function(a,c,e,b,g){c=/obj=(\w+), read=(\w+=>\w+), write=(\w+=>\w+)/.exec(g.details);if(!c)return!1;e=c[1];this.i915GemObjectSlice(b,a,e,{obj:e,read:c[2],write:c[3]});return!0},gemObjectPreadWriteEvent:function(a,c,e,b,g){g=/obj=(\w+), offset=(\d+), len=(\d+)/.exec(g.details);if(!g)return!1;c=g[1];e=parseInt(g[2]);g=parseInt(g[3]);this.i915GemObjectSlice(b,a,c,{obj:c,offset:e,len:g});return!0},gemObjectFaultEvent:function(a,c,e,b,g){g=/obj=(\w+), (\w+) index=(\d+)/.exec(g.details);
+if(!g)return!1;c=g[1];e=g[2];g=parseInt(g[3]);this.i915GemObjectSlice(b,a,c,{obj:c,type:e,index:g});return!0},gemObjectDestroyEvent:function(a,c,e,b,g){c=/obj=(\w+)/.exec(g.details);if(!c)return!1;c=c[1];this.i915GemObjectSlice(b,a,c,{obj:c});return!0},gemRingDispatchEvent:function(a,c,e,b,g){g=/dev=(\d+), ring=(\d+), seqno=(\d+)/.exec(g.details);if(!g)return!1;c=parseInt(g[1]);e=parseInt(g[2]);g=parseInt(g[3]);this.i915GemRingSlice(b,a,c,e,{dev:c,ring:e,seqno:g});return!0},gemRingFlushEvent:function(a,
+c,e,b,g){c=/dev=(\d+), ring=(\w+), invalidate=(\w+), flush=(\w+)/.exec(g.details);if(!c)return!1;e=parseInt(c[1]);g=parseInt(c[2]);this.i915GemRingSlice(b,a,e,g,{dev:e,ring:g,invalidate:c[3],flush:c[4]});return!0},gemRequestEvent:function(a,c,e,b,g){g=/dev=(\d+), ring=(\d+), seqno=(\d+)/.exec(g.details);if(!g)return!1;c=parseInt(g[1]);e=parseInt(g[2]);g=parseInt(g[3]);this.i915GemRingSlice(b,a,c,e,{dev:c,ring:e,seqno:g});return!0},gemRingWaitEvent:function(a,c,e,b,g){e=/dev=(\d+), ring=(\d+)/.exec(g.details);
+if(!e)return!1;c=parseInt(e[1]);e=parseInt(e[2]);this.i915GemRingSlice(b,a,c,e,{dev:c,ring:e});return!0},regRWEvent:function(a,c,e,b,g){a=/(\w+) reg=(\w+), len=(\d+), val=(\(\w+, \w+\))/.exec(g.details);if(!a)return!1;c=a[1];e=a[2];this.i915RegSlice(b,c,e,{rw:c,reg:e,len:a[3],data:a[3]});return!0},flipEvent:function(a,c,e,b,g){e=/plane=(\d+), obj=(\w+)/.exec(g.details);if(!e)return!1;c=parseInt(e[1]);e=e[2];"i915_flip_request"==a?this.i915FlipOpenSlice(b,e,c):this.i915FlipCloseSlice(b,{obj:e,plane:c});
+return!0}};b.registerSubtype(d);return{I915Parser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
+base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("irq_handler_entry",d.prototype.irqHandlerEntryEvent.bind(this));a.registerEventHandler("irq_handler_exit",d.prototype.irqHandlerExitEvent.bind(this));a.registerEventHandler("softirq_raise",d.prototype.softirqRaiseEvent.bind(this));a.registerEventHandler("softirq_entry",d.prototype.softirqEntryEvent.bind(this));a.registerEventHandler("softirq_exit",d.prototype.softirqExitEvent.bind(this))}var b=
+tracing.importer.linux_perf.Parser,a=/irq=(\d+) name=(.+)/,c=/irq=(\d+) ret=(.+)/,e=/vec=(\d+) \[action=(.+)\]/;d.prototype={__proto__:b.prototype,irqHandlerEntryEvent:function(c,e,b,d,l){c=a.exec(l.details);if(!c)return!1;parseInt(c[1]);c=c[2];e=this.importer.getOrCreatePseudoThread("irqs cpu "+e);e.lastEntryTs=d;e.irqName=c;return!0},irqHandlerExitEvent:function(a,e,b,d,l){a=c.exec(l.details);if(!a)return!1;parseInt(a[1]);b=a[2];e=this.importer.getOrCreatePseudoThread("irqs cpu "+e);void 0!==e.lastEntryTs&&
+(d-=e.lastEntryTs,d=new tracing.trace_model.Slice("",e.irqName,tracing.getStringColorId(a[1]),e.lastEntryTs,{ret:b},d),e.thread.sliceGroup.pushSlice(d));e.lastEntryTs=void 0;e.irqName=void 0;return!0},softirqRaiseEvent:function(a,c,e,b,d){return!0},softirqEntryEvent:function(a,c,b,d,l){if(!e.exec(l.details))return!1;this.importer.getOrCreatePseudoThread("softirq cpu "+c).lastEntryTs=d;return!0},softirqExitEvent:function(a,c,b,d,l){a=e.exec(l.details);if(!a)return!1;b=parseInt(a[1]);l=a[2];c=this.importer.getOrCreatePseudoThread("softirq cpu "+
+c);void 0!==c.lastEntryTs&&(d-=c.lastEntryTs,d=new tracing.trace_model.Slice("",l,tracing.getStringColorId(a[1]),c.lastEntryTs,{vec:b},d),c.thread.sliceGroup.pushSlice(d));c.lastEntryTs=void 0;return!0}};b.registerSubtype(d);return{IrqParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
+base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("graph_ent",d.prototype.traceKernelFuncEnterEvent.bind(this));a.registerEventHandler("graph_ret",d.prototype.traceKernelFuncReturnEvent.bind(this));this.model_=a.model_;this.ppids_={}}var b=tracing.importer.linux_perf.Parser,a=/func=(.+)/;d.prototype={__proto__:b.prototype,traceKernelFuncEnterEvent:function(c,e,b,g,h){c=a.exec(h.details);if(!c||void 0===h.tgid)return!1;e=parseInt(h.tgid);c=c[1];
+b=this.model_.getOrCreateProcess(e).getOrCreateThread(b);b.name=h.threadName;h=b.kernelSliceGroup;if(!h.isTimestampValidForBeginOrEnd(g))return this.model_.importErrors.push("Timestamps are moving backward."),!1;h.beginSlice(null,c,g,{});return!0},traceKernelFuncReturnEvent:function(a,e,b,g,h){if(void 0===h.tgid)return!1;a=parseInt(h.tgid);b=this.model_.getOrCreateProcess(a).getOrCreateThread(b);b.name=h.threadName;h=b.kernelSliceGroup;if(!h.isTimestampValidForBeginOrEnd(g))return this.model_.importErrors.push("Timestamps are moving backward."),
+!1;0<h.openSliceCount&&h.endSlice(g);return!0}};b.registerSubtype(d);return{KernelFuncParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
+base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("mali_dvfs_event",d.prototype.dvfsEventEvent.bind(this));a.registerEventHandler("mali_dvfs_set_clock",d.prototype.dvfsSetClockEvent.bind(this));a.registerEventHandler("mali_dvfs_set_voltage",d.prototype.dvfsSetVoltageEvent.bind(this));this.addJMCounter("mali_hwc_MESSAGES_SENT","Messages Sent");this.addJMCounter("mali_hwc_MESSAGES_RECEIVED","Messages Received");this.addJMCycles("mali_hwc_GPU_ACTIVE",
+"GPU Active");this.addJMCycles("mali_hwc_IRQ_ACTIVE","IRQ Active");for(var c=0;7>c;c++){var e="JS"+c,f="mali_hwc_"+e;this.addJMCounter(f+"_JOBS",e+" Jobs");this.addJMCounter(f+"_TASKS",e+" Tasks");this.addJMCycles(f+"_ACTIVE",e+" Active");this.addJMCycles(f+"_WAIT_READ",e+" Wait Read");this.addJMCycles(f+"_WAIT_ISSUE",e+" Wait Issue");this.addJMCycles(f+"_WAIT_DEPEND",e+" Wait Depend");this.addJMCycles(f+"_WAIT_FINISH",e+" Wait Finish")}this.addTilerCounter("mali_hwc_TRIANGLES","Triangles");this.addTilerCounter("mali_hwc_QUADS",
+"Quads");this.addTilerCounter("mali_hwc_POLYGONS","Polygons");this.addTilerCounter("mali_hwc_POINTS","Points");this.addTilerCounter("mali_hwc_LINES","Lines");this.addTilerCounter("mali_hwc_VCACHE_HIT","VCache Hit");this.addTilerCounter("mali_hwc_VCACHE_MISS","VCache Miss");this.addTilerCounter("mali_hwc_FRONT_FACING","Front Facing");this.addTilerCounter("mali_hwc_BACK_FACING","Back Facing");this.addTilerCounter("mali_hwc_PRIM_VISIBLE","Prim Visible");this.addTilerCounter("mali_hwc_PRIM_CULLED","Prim Culled");
+this.addTilerCounter("mali_hwc_PRIM_CLIPPED","Prim Clipped");this.addTilerCounter("mali_hwc_WRBUF_HIT","Wrbuf Hit");this.addTilerCounter("mali_hwc_WRBUF_MISS","Wrbuf Miss");this.addTilerCounter("mali_hwc_WRBUF_LINE","Wrbuf Line");this.addTilerCounter("mali_hwc_WRBUF_PARTIAL","Wrbuf Partial");this.addTilerCounter("mali_hwc_WRBUF_STALL","Wrbuf Stall");this.addTilerCycles("mali_hwc_ACTIVE","Tiler Active");this.addTilerCycles("mali_hwc_INDEX_WAIT","Index Wait");this.addTilerCycles("mali_hwc_INDEX_RANGE_WAIT",
+"Index Range Wait");this.addTilerCycles("mali_hwc_VERTEX_WAIT","Vertex Wait");this.addTilerCycles("mali_hwc_PCACHE_WAIT","Pcache Wait");this.addTilerCycles("mali_hwc_WRBUF_WAIT","Wrbuf Wait");this.addTilerCycles("mali_hwc_BUS_READ","Bus Read");this.addTilerCycles("mali_hwc_BUS_WRITE","Bus Write");this.addTilerCycles("mali_hwc_TILER_UTLB_STALL","Tiler UTLB Stall");this.addTilerCycles("mali_hwc_TILER_UTLB_HIT","Tiler UTLB Hit");this.addFragCycles("mali_hwc_FRAG_ACTIVE","Active");this.addFragCounter("mali_hwc_FRAG_PRIMATIVES",
+"Primitives");this.addFragCounter("mali_hwc_FRAG_PRIMATIVES_DROPPED","Primitives Dropped");this.addFragCycles("mali_hwc_FRAG_CYCLE_DESC","Descriptor Processing");this.addFragCycles("mali_hwc_FRAG_CYCLES_PLR","PLR Processing??");this.addFragCycles("mali_hwc_FRAG_CYCLES_VERT","Vertex Processing");this.addFragCycles("mali_hwc_FRAG_CYCLES_TRISETUP","Triangle Setup");this.addFragCycles("mali_hwc_FRAG_CYCLES_RAST","Rasterization???");this.addFragCounter("mali_hwc_FRAG_THREADS","Threads");this.addFragCounter("mali_hwc_FRAG_DUMMY_THREADS",
+"Dummy Threads");this.addFragCounter("mali_hwc_FRAG_QUADS_RAST","Quads Rast");this.addFragCounter("mali_hwc_FRAG_QUADS_EZS_TEST","Quads EZS Test");this.addFragCounter("mali_hwc_FRAG_QUADS_EZS_KILLED","Quads EZS Killed");this.addFragCounter("mali_hwc_FRAG_QUADS_LZS_TEST","Quads LZS Test");this.addFragCounter("mali_hwc_FRAG_QUADS_LZS_KILLED","Quads LZS Killed");this.addFragCycles("mali_hwc_FRAG_CYCLE_NO_TILE","No Tiles");this.addFragCounter("mali_hwc_FRAG_NUM_TILES","Tiles");this.addFragCounter("mali_hwc_FRAG_TRANS_ELIM",
+"Transactions Eliminated");this.addComputeCycles("mali_hwc_COMPUTE_ACTIVE","Active");this.addComputeCounter("mali_hwc_COMPUTE_TASKS","Tasks");this.addComputeCounter("mali_hwc_COMPUTE_THREADS","Threads Started");this.addComputeCycles("mali_hwc_COMPUTE_CYCLES_DESC","Waiting for Descriptors");this.addTripipeCycles("mali_hwc_TRIPIPE_ACTIVE","Active");this.addArithCounter("mali_hwc_ARITH_WORDS","Instructions (/Pipes)");this.addArithCycles("mali_hwc_ARITH_CYCLES_REG","Reg scheduling stalls (/Pipes)");this.addArithCycles("mali_hwc_ARITH_CYCLES_L0",
+"L0 cache miss stalls (/Pipes)");this.addArithCounter("mali_hwc_ARITH_FRAG_DEPEND","Frag dep check failures (/Pipes)");this.addLSCounter("mali_hwc_LS_WORDS","Instruction Words Completed");this.addLSCounter("mali_hwc_LS_ISSUES","Full Pipeline Issues");this.addLSCounter("mali_hwc_LS_RESTARTS","Restarts (unpairable insts)");this.addLSCounter("mali_hwc_LS_REISSUES_MISS","Pipeline reissue (cache miss/uTLB)");this.addLSCounter("mali_hwc_LS_REISSUES_VD","Pipeline reissue (varying data)");this.addLSCounter("mali_hwc_LS_REISSUE_ATTRIB_MISS",
+"Pipeline reissue (attribute cache miss)");this.addLSCounter("mali_hwc_LS_REISSUE_NO_WB","Writeback not used");this.addTexCounter("mali_hwc_TEX_WORDS","Words");this.addTexCounter("mali_hwc_TEX_BUBBLES","Bubbles");this.addTexCounter("mali_hwc_TEX_WORDS_L0","Words L0");this.addTexCounter("mali_hwc_TEX_WORDS_DESC","Words Desc");this.addTexCounter("mali_hwc_TEX_THREADS","Threads");this.addTexCounter("mali_hwc_TEX_RECIRC_FMISS","Recirc due to Full Miss");this.addTexCounter("mali_hwc_TEX_RECIRC_DESC","Recirc due to Desc Miss");
+this.addTexCounter("mali_hwc_TEX_RECIRC_MULTI","Recirc due to Multipass");this.addTexCounter("mali_hwc_TEX_RECIRC_PMISS","Recirc due to Partial Cache Miss");this.addTexCounter("mali_hwc_TEX_RECIRC_CONF","Recirc due to Cache Conflict");this.addLSCCounter("mali_hwc_LSC_READ_HITS","Read Hits");this.addLSCCounter("mali_hwc_LSC_READ_MISSES","Read Misses");this.addLSCCounter("mali_hwc_LSC_WRITE_HITS","Write Hits");this.addLSCCounter("mali_hwc_LSC_WRITE_MISSES","Write Misses");this.addLSCCounter("mali_hwc_LSC_ATOMIC_HITS",
+"Atomic Hits");this.addLSCCounter("mali_hwc_LSC_ATOMIC_MISSES","Atomic Misses");this.addLSCCounter("mali_hwc_LSC_LINE_FETCHES","Line Fetches");this.addLSCCounter("mali_hwc_LSC_DIRTY_LINE","Dirty Lines");this.addLSCCounter("mali_hwc_LSC_SNOOPS","Snoops");this.addAXICounter("mali_hwc_AXI_TLB_STALL","Address channel stall");this.addAXICounter("mali_hwc_AXI_TLB_MISS","Cache Miss");this.addAXICounter("mali_hwc_AXI_TLB_TRANSACTION","Transactions");this.addAXICounter("mali_hwc_LS_TLB_MISS","LS Cache Miss");
+this.addAXICounter("mali_hwc_LS_TLB_HIT","LS Cache Hit");this.addAXICounter("mali_hwc_AXI_BEATS_READ","Read Beats");this.addAXICounter("mali_hwc_AXI_BEATS_WRITE","Write Beats");this.addMMUCounter("mali_hwc_MMU_TABLE_WALK","Page Table Walks");this.addMMUCounter("mali_hwc_MMU_REPLAY_MISS","Cache Miss from Replay Buffer");this.addMMUCounter("mali_hwc_MMU_REPLAY_FULL","Replay Buffer Full");this.addMMUCounter("mali_hwc_MMU_NEW_MISS","Cache Miss on New Request");this.addMMUCounter("mali_hwc_MMU_HIT","Cache Hit");
+this.addMMUCycles("mali_hwc_UTLB_STALL","UTLB Stalled");this.addMMUCycles("mali_hwc_UTLB_REPLAY_MISS","UTLB Replay Miss");this.addMMUCycles("mali_hwc_UTLB_REPLAY_FULL","UTLB Replay Full");this.addMMUCycles("mali_hwc_UTLB_NEW_MISS","UTLB New Miss");this.addMMUCycles("mali_hwc_UTLB_HIT","UTLB Hit");this.addL2Counter("mali_hwc_L2_READ_BEATS","Read Beats");this.addL2Counter("mali_hwc_L2_WRITE_BEATS","Write Beats");this.addL2Counter("mali_hwc_L2_ANY_LOOKUP","Any Lookup");this.addL2Counter("mali_hwc_L2_READ_LOOKUP",
+"Read Lookup");this.addL2Counter("mali_hwc_L2_SREAD_LOOKUP","Shareable Read Lookup");this.addL2Counter("mali_hwc_L2_READ_REPLAY","Read Replayed");this.addL2Counter("mali_hwc_L2_READ_SNOOP","Read Snoop");this.addL2Counter("mali_hwc_L2_READ_HIT","Read Cache Hit");this.addL2Counter("mali_hwc_L2_CLEAN_MISS","CleanUnique Miss");this.addL2Counter("mali_hwc_L2_WRITE_LOOKUP","Write Lookup");this.addL2Counter("mali_hwc_L2_SWRITE_LOOKUP","Shareable Write Lookup");this.addL2Counter("mali_hwc_L2_WRITE_REPLAY",
+"Write Replayed");this.addL2Counter("mali_hwc_L2_WRITE_SNOOP","Write Snoop");this.addL2Counter("mali_hwc_L2_WRITE_HIT","Write Cache Hit");this.addL2Counter("mali_hwc_L2_EXT_READ_FULL","ExtRD with BIU Full");this.addL2Counter("mali_hwc_L2_EXT_READ_HALF","ExtRD with BIU >1/2 Full");this.addL2Counter("mali_hwc_L2_EXT_WRITE_FULL","ExtWR with BIU Full");this.addL2Counter("mali_hwc_L2_EXT_WRITE_HALF","ExtWR with BIU >1/2 Full");this.addL2Counter("mali_hwc_L2_EXT_READ","External Read (ExtRD)");this.addL2Counter("mali_hwc_L2_EXT_READ_LINE",
+"ExtRD (linefill)");this.addL2Counter("mali_hwc_L2_EXT_WRITE","External Write (ExtWR)");this.addL2Counter("mali_hwc_L2_EXT_WRITE_LINE","ExtWR (linefill)");this.addL2Counter("mali_hwc_L2_EXT_WRITE_SMALL","ExtWR (burst size <64B)");this.addL2Counter("mali_hwc_L2_EXT_BARRIER","External Barrier");this.addL2Counter("mali_hwc_L2_EXT_AR_STALL","Address Read stalls");this.addL2Counter("mali_hwc_L2_EXT_R_BUF_FULL","Response Buffer full stalls");this.addL2Counter("mali_hwc_L2_EXT_RD_BUF_FULL","Read Data Buffer full stalls");
+this.addL2Counter("mali_hwc_L2_EXT_R_RAW","RAW hazard stalls");this.addL2Counter("mali_hwc_L2_EXT_W_STALL","Write Data stalls");this.addL2Counter("mali_hwc_L2_EXT_W_BUF_FULL","Write Data Buffer full");this.addL2Counter("mali_hwc_L2_EXT_R_W_HAZARD","WAW or WAR hazard stalls");this.addL2Counter("mali_hwc_L2_TAG_HAZARD","Tag hazard replays");this.addL2Cycles("mali_hwc_L2_SNOOP_FULL","Snoop buffer full");this.addL2Cycles("mali_hwc_L2_REPLAY_FULL","Replay buffer full");a.registerEventHandler("tracing_mark_write:mali_driver",
+d.prototype.maliDDKEvent.bind(this));this.model_=a.model_}var b=tracing.importer.linux_perf.Parser;d.prototype={__proto__:b.prototype,maliDDKOpenSlice:function(a,c,e,b,g){a=this.importer.model_.getOrCreateProcess(a).getOrCreateThread(c);b=/^([\w\d_]*)(?:\(\))?:?\s*(.*)$/.exec(b);a.sliceGroup.beginSlice("gpu-driver",b[1],e,{args:b[2],blockinfo:g})},maliDDKCloseSlice:function(a,c,e,b,g){a=this.importer.model_.getOrCreateProcess(a).getOrCreateThread(c);a.sliceGroup.openSliceCount&&a.sliceGroup.endSlice(e)},
+autoDetectLineRE:function(a){var c=/^\s*\(([\w\-]*)\)\s*(\w+):\s*([\w\\\/\.\-]*@\d*):?\s*(.*)$/;if(c.test(a))return c;c=/^s*()(\w+):\s*([\w\\\/.\-]*):?\s*(.*)$/;return c.test(a)?c:null},lineRE:null,maliDDKEvent:function(a,c,e,b,g){if(null==this.lineRE&&(this.lineRE=this.autoDetectLineRE(g.details),null==this.lineRE))return!1;a=this.lineRE.exec(g.details);c=""===a[1]?"mali":a[1];switch(a[2]){case "cros_trace_print_enter":this.maliDDKOpenSlice(e,c,b,a[4],a[3]);break;case "cros_trace_print_exit":this.maliDDKCloseSlice(e,
+c,b,[],a[3])}return!0},dvfsSample:function(a,c,e,b){var g=parseInt(b);a=this.model_.getOrCreateProcess(0).getOrCreateCounter("DVFS",a);0===a.numSeries&&a.addSeries(new tracing.trace_model.CounterSeries(c,tracing.getStringColorId(a.name)));a.series.forEach(function(a){a.addSample(e,g)})},dvfsEventEvent:function(a,c,e,b,g){a=/utilization=(\d+)/.exec(g.details);if(!a)return!1;this.dvfsSample("DVFS Utilization","utilization",b,a[1]);return!0},dvfsSetClockEvent:function(a,c,e,b,g){a=/frequency=(\d+)/.exec(g.details);
+if(!a)return!1;this.dvfsSample("DVFS Frequency","frequency",b,a[1]);return!0},dvfsSetVoltageEvent:function(a,c,e,b,g){a=/voltage=(\d+)/.exec(g.details);if(!a)return!1;this.dvfsSample("DVFS Voltage","voltage",b,a[1]);return!0},hwcSample:function(a,c,e,b,g){g=/val=(\d+)/.exec(g.details);if(!g)return!1;var h=parseInt(g[1]);a=this.model_.getOrCreateProcess(0).getOrCreateCounter(a,c);0===a.numSeries&&a.addSeries(new tracing.trace_model.CounterSeries(e,tracing.getStringColorId(a.name)));a.series.forEach(function(a){a.addSample(b,
+h)});return!0},jmSample:function(a,c,e,b){return this.hwcSample("mali:jm","JM: "+a,c,e,b)},addJMCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.jmSample(c,"count",h,d)}.bind(this))},addJMCycles:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.jmSample(c,"cycles",h,d)}.bind(this))},tilerSample:function(a,c,e,b){return this.hwcSample("mali:tiler","Tiler: "+a,c,e,b)},addTilerCounter:function(a,c){this.importer.registerEventHandler(a,
+function(a,b,g,h,d){return this.tilerSample(c,"count",h,d)}.bind(this))},addTilerCycles:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.tilerSample(c,"cycles",h,d)}.bind(this))},fragSample:function(a,c,e,b){return this.hwcSample("mali:fragment","Fragment: "+a,c,e,b)},addFragCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.fragSample(c,"count",h,d)}.bind(this))},addFragCycles:function(a,c){this.importer.registerEventHandler(a,
+function(a,b,g,h,d){return this.fragSample(c,"cycles",h,d)}.bind(this))},computeSample:function(a,c,e,b){return this.hwcSample("mali:compute","Compute: "+a,c,e,b)},addComputeCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.computeSample(c,"count",h,d)}.bind(this))},addComputeCycles:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.computeSample(c,"cycles",h,d)}.bind(this))},addTripipeCycles:function(a,c){this.importer.registerEventHandler(a,
+function(a,b,g,h,d){return this.hwcSample("mali:shader","Tripipe: "+c,"cycles",h,d)}.bind(this))},arithSample:function(a,c,e,b){return this.hwcSample("mali:arith","Arith: "+a,c,e,b)},addArithCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.arithSample(c,"count",h,d)}.bind(this))},addArithCycles:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.arithSample(c,"cycles",h,d)}.bind(this))},addLSCounter:function(a,c){this.importer.registerEventHandler(a,
+function(a,b,g,h,d){return this.hwcSample("mali:ls","LS: "+c,"count",h,d)}.bind(this))},textureSample:function(a,c,e,b){return this.hwcSample("mali:texture","Texture: "+a,c,e,b)},addTexCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.textureSample(c,"count",h,d)}.bind(this))},addLSCCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.hwcSample("mali:lsc","LSC: "+c,"count",h,d)}.bind(this))},addAXICounter:function(a,c){this.importer.registerEventHandler(a,
+function(a,b,g,h,d){return this.hwcSample("mali:axi","AXI: "+c,"count",h,d)}.bind(this))},mmuSample:function(a,c,e,b){return this.hwcSample("mali:mmu","MMU: "+a,c,e,b)},addMMUCounter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.mmuSample(c,"count",h,d)}.bind(this))},addMMUCycles:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.mmuSample(c,"cycles",h,d)}.bind(this))},l2Sample:function(a,c,e,b){return this.hwcSample("mali:l2","L2: "+
+a,c,e,b)},addL2Counter:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.l2Sample(c,"count",h,d)}.bind(this))},addL2Cycles:function(a,c){this.importer.registerEventHandler(a,function(a,b,g,h,d){return this.l2Sample(c,"cycles",h,d)}.bind(this))}};b.registerSubtype(d);return{MaliParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
+base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("mm_vmscan_kswapd_wake",d.prototype.kswapdWake.bind(this));a.registerEventHandler("mm_vmscan_kswapd_sleep",d.prototype.kswapdSleep.bind(this));a.registerEventHandler("mm_vmscan_direct_reclaim_begin",d.prototype.reclaimBegin.bind(this));a.registerEventHandler("mm_vmscan_direct_reclaim_end",d.prototype.reclaimEnd.bind(this))}var b=tracing.importer.linux_perf.Parser,a=/nid=(\d+) order=(\d+)/,c=
+/order=(\d+) may_writepage=\d+ gfp_flags=(.+)/,e=/nr_reclaimed=(\d+)/;d.prototype={__proto__:b.prototype,openAsyncSlice:function(a,c,b,e,d,m){b=this.importer.getOrCreateKernelThread(c+":"+b,e);a=new tracing.trace_model.AsyncSlice(c,m,tracing.getStringColorId(m),a);a.startThread=b.thread;b.openAsyncSlices||(b.openAsyncSlices={});b.openAsyncSlices[d]=a},closeAsyncSlice:function(a,c,b,e,d,m){b=this.importer.getOrCreateKernelThread(c+":"+b,e);b.openAsyncSlices&&(e=b.openAsyncSlices[d])&&(e.duration=a-
+e.start,e.args=m,e.endThread=b.thread,e.subSlices=[new tracing.trace_model.Slice(c,e.title,e.colorId,e.start,e.args,e.duration)],b.thread.asyncSliceGroup.push(e),delete b.openAsyncSlices[d])},kswapdWake:function(c,e,b,d,l){c=a.exec(l.details);if(!c)return!1;parseInt(c[1]);c=parseInt(c[2]);b=this.importer.getOrCreateKernelThread("kswapd: "+l.threadName,b,b);b.openSliceTS?c>b.order&&(b.order=c):(b.openSliceTS=d,b.order=c);return!0},kswapdSleep:function(a,c,b,e,d){a=this.importer.getOrCreateKernelThread("kswapd: "+
+d.threadName,b,b);a.openSliceTS&&(e=new tracing.trace_model.Slice("",d.threadName,tracing.getStringColorId(d.threadName),a.openSliceTS,{order:a.order},e-a.openSliceTS),a.thread.sliceGroup.pushSlice(e));a.openSliceTS=void 0;a.order=void 0;return!0},reclaimBegin:function(a,b,e,d,l){b=c.exec(l.details);if(!b)return!1;a=parseInt(b[1]);b=b[2];e=this.importer.getOrCreateKernelThread("direct reclaim: "+l.threadName,e,e);e.openSliceTS=d;e.order=a;e.gfp=b;return!0},reclaimEnd:function(a,c,b,d,l){a=e.exec(l.details);
+if(!a)return!1;a=parseInt(a[1]);b=this.importer.getOrCreateKernelThread("direct reclaim: "+l.threadName,b,b);void 0!==b.openSliceTS&&(d=new tracing.trace_model.Slice("","direct reclaim",tracing.getStringColorId(l.threadName),b.openSliceTS,{order:b.order,gfp:b.gfp,nr_reclaimed:a},d-b.openSliceTS),b.thread.sliceGroup.pushSlice(d));b.openSliceTS=void 0;b.order=void 0;b.gfp=void 0;return!0}};b.registerSubtype(d);return{MemReclaimParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
+base.require("tracing.trace_model.counter_series");
+base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("power_start",d.prototype.powerStartEvent.bind(this));a.registerEventHandler("power_frequency",d.prototype.powerFrequencyEvent.bind(this));a.registerEventHandler("cpu_frequency",d.prototype.cpuFrequencyEvent.bind(this));a.registerEventHandler("cpu_idle",d.prototype.cpuIdleEvent.bind(this))}var b=tracing.importer.linux_perf.Parser;d.prototype={__proto__:b.prototype,cpuStateSlice:function(a,c,
+b,f){c=this.importer.getOrCreateCpuState(c);"1"!=b?this.importer.importError("Don't understand power_start events of type "+b):(b=c.cpu.getOrCreateCounter("","C-State"),0===b.numSeries&&b.addSeries(new tracing.trace_model.CounterSeries("state",tracing.getStringColorId(b.name+".state"))),b.series.forEach(function(c){c.addSample(a,f)}))},cpuIdleSlice:function(a,c,b){c=this.importer.getOrCreateCpuState(c).cpu.getOrCreateCounter("","C-State");0===c.numSeries&&c.addSeries(new tracing.trace_model.CounterSeries("state",
+tracing.getStringColorId(c.name)));var f=4294967295!=b?b+1:0;c.series.forEach(function(c){c.addSample(a,f)})},cpuFrequencySlice:function(a,c,b){c=this.importer.getOrCreateCpuState(c).cpu.getOrCreateCounter("","Clock Frequency");0===c.numSeries&&c.addSeries(new tracing.trace_model.CounterSeries("state",tracing.getStringColorId(c.name+".state")));c.series.forEach(function(c){c.addSample(a,b)})},powerStartEvent:function(a,c,b,f,g){a=/type=(\d+) state=(\d) cpu_id=(\d)+/.exec(g.details);if(!a)return!1;
+c=parseInt(a[3]);b=parseInt(a[2]);this.cpuStateSlice(f,c,a[1],b);return!0},powerFrequencyEvent:function(a,c,b,f,g){c=/type=(\d+) state=(\d+) cpu_id=(\d)+/.exec(g.details);if(!c)return!1;a=parseInt(c[3]);c=parseInt(c[2]);this.cpuFrequencySlice(f,a,c);return!0},cpuFrequencyEvent:function(a,c,b,f,g){c=/state=(\d+) cpu_id=(\d)+/.exec(g.details);if(!c)return!1;a=parseInt(c[2]);c=parseInt(c[1]);this.cpuFrequencySlice(f,a,c);return!0},cpuIdleEvent:function(a,c,b,f,g){c=/state=(\d+) cpu_id=(\d)+/.exec(g.details);
+if(!c)return!1;a=parseInt(c[2]);c=parseInt(c[1]);this.cpuIdleSlice(f,a,c);return!0}};b.registerSubtype(d);return{PowerParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
+base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("sched_switch",d.prototype.schedSwitchEvent.bind(this));a.registerEventHandler("sched_wakeup",d.prototype.schedWakeupEvent.bind(this))}var b=tracing.importer.linux_perf.Parser,a={},c=/prev_comm=(.+) prev_pid=(\d+) prev_prio=(\d+) prev_state=(\S\+?|\S\|\S) ==> next_comm=(.+) next_pid=(\d+) next_prio=(\d+)/;a.schedSwitchRE=c;var e=/comm=(.+) pid=(\d+) prio=(\d+) success=(\d+) target_cpu=(\d+)/;
+a.schedWakeupRE=e;d.prototype={__proto__:b.prototype,schedSwitchEvent:function(a,b,e,d,l){var m=c.exec(l.details);if(!m)return!1;a=m[4];e=m[5];l=parseInt(m[6]);m=parseInt(m[7]);this.importer.getOrCreateCpuState(b).switchRunningLinuxPid(this.importer,a,d,l,e,m);return!0},schedWakeupEvent:function(a,c,b,d,l){l=e.exec(l.details);if(!l)return!1;a=b;c=l[1];b=parseInt(l[2]);l=parseInt(l[3]);this.importer.markPidRunnable(d,b,c,l,a);return!0}};b.registerSubtype(d);return{SchedParser:d,_SchedParserTestExports:a}});
+"use strict";base.require("tracing.importer.linux_perf.parser");
+base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("sync_timeline",d.prototype.timelineEvent.bind(this));a.registerEventHandler("sync_wait",d.prototype.syncWaitEvent.bind(this));a.registerEventHandler("sync_pt",d.prototype.syncPtEvent.bind(this));this.model_=a.model_}var b=tracing.importer.linux_perf.Parser,a=/name=(\S+) value=(\S*)/,c=/(\S+) name=(\S+) state=(\d+)/,e=/name=(\S+) value=(\S*)/;d.prototype={__proto__:b.prototype,timelineEvent:function(c,
+b,e,d,l){c=a.exec(l.details);if(!c)return!1;b=this.importer.getOrCreatePseudoThread(c[1]);void 0!==b.lastActiveTs&&(e=d-b.lastActiveTs,l=b.lastActiveValue,void 0==l&&(l=" "),e=new tracing.trace_model.Slice("",l,tracing.getStringColorId(l),b.lastActiveTs,{},e),b.thread.sliceGroup.pushSlice(e));b.lastActiveTs=d;b.lastActiveValue=c[2];return!0},syncWaitEvent:function(a,b,e,d,l){a=c.exec(l.details);if(!a||void 0===l.tgid)return!1;b=parseInt(l.tgid);e=this.model_.getOrCreateProcess(b).getOrCreateThread(e);
+e.name=l.threadName;l=e.kernelSliceGroup;if(!l.isTimestampValidForBeginOrEnd(d))return this.model_.importErrors.push("Timestamps are moving backward."),!1;e='fence_wait("'+a[2]+'")';if("begin"==a[1])l.beginSlice(null,e,d,{"Start state":a[3]});else if("end"==a[1])0<l.openSliceCount&&l.endSlice(d);else return!1;return!0},syncPtEvent:function(a,c,b,d,l){return e.exec(l.details)?!0:!1}};b.registerSubtype(d);return{SyncParser:d}});"use strict";base.require("tracing.importer.linux_perf.parser");
+base.exportTo("tracing.importer.linux_perf",function(){function d(a){b.call(this,a);a.registerEventHandler("workqueue_execute_start",d.prototype.executeStartEvent.bind(this));a.registerEventHandler("workqueue_execute_end",d.prototype.executeEndEvent.bind(this));a.registerEventHandler("workqueue_queue_work",d.prototype.executeQueueWork.bind(this));a.registerEventHandler("workqueue_activate_work",d.prototype.executeActivateWork.bind(this))}var b=tracing.importer.linux_perf.Parser,a=/work struct (.+): function (\S+)/,
+c=/work struct (.+)/;d.prototype={__proto__:b.prototype,executeStartEvent:function(c,b,g,d,k){c=a.exec(k.details);if(!c)return!1;g=this.importer.getOrCreateKernelThread(k.threadName,g,g);g.openSliceTS=d;g.openSlice=c[2];return!0},executeEndEvent:function(a,b,g,d,k){if(!c.exec(k.details))return!1;a=this.importer.getOrCreateKernelThread(k.threadName,g,g);a.openSlice&&(d=new tracing.trace_model.Slice("",a.openSlice,tracing.getStringColorId(a.openSlice),a.openSliceTS,{},d-a.openSliceTS),a.thread.sliceGroup.pushSlice(d));
+a.openSlice=void 0;return!0},executeQueueWork:function(a,c,b,d,k){return!0},executeActivateWork:function(a,c,b,d,k){return!0}};b.registerSubtype(d);return{WorkqueueParser:d}});"use strict";
+base.exportTo("base",function(){function d(){}d.prototype={addEventListener:function(a,c){this.listeners_||(this.listeners_=Object.create(null));if(a in this.listeners_){var b=this.listeners_[a];0>b.indexOf(c)&&b.push(c)}else this.listeners_[a]=[c]},removeEventListener:function(a,c){if(this.listeners_&&a in this.listeners_){var b=this.listeners_[a],f=b.indexOf(c);0<=f&&(1==b.length?delete this.listeners_[a]:b.splice(f,1))}},dispatchEvent:function(a){if(!this.listeners_)return!0;var c=this;a.__defineGetter__("target",
+function(){return c});a.preventDefault=function(){this.returnValue=!1};var b=a.type,f=0;if(b in this.listeners_)for(var b=this.listeners_[b].concat(),g=0,d;d=b[g];g++)f=d.handleEvent?f|!1===d.handleEvent.call(d,a):f|!1===d.call(this,a);return!f&&a.returnValue},hasEventListener:function(a){return void 0!==this.listeners_[a]}};var b={decorate:function(a){for(var c in b)if("decorate"!=c){var e=b[c];"function"===typeof e&&(a[c]=e)}a.listenerCounts_={}},addEventListener:function(a,c,b){this.__proto__.addEventListener.call(this,
+a,c,b);void 0===this.listenerCounts_[a]&&(this.listenerCounts_[a]=0);this.listenerCounts_[a]++},removeEventListener:function(a,c,b){this.__proto__.removeEventListener.call(this,a,c,b);this.listenerCounts_[a]--},hasEventListener:function(a){return 0<this.listenerCounts_[a]}};return{EventTarget:d,EventTargetHelper:b}});"use strict";base.require("base.event_target");
+base.exportTo("base",function(){function d(b,a,c){var e=base.doc.createEvent("Event");e.initEvent(b,!!a,!!c);e.__proto__=global.Event.prototype;return e}d.prototype={__proto__:global.Event.prototype};return{Event:d,dispatchSimpleEvent:function(b,a,c,e){a=new d(a,c,e);return b.dispatchEvent(a)}}});"use strict";
+base.exportTo("base",function(){function d(){this.isEmpty_=!0;this.max_=this.min_=void 0}d.prototype={__proto__:Object.prototype,reset:function(){this.isEmpty_=!0;this.max_=this.min_=void 0},get isEmpty(){return this.isEmpty_},addRange:function(b){b.isEmpty||(this.addValue(b.min),this.addValue(b.max))},addValue:function(b){this.isEmpty_?(this.min_=this.max_=b,this.isEmpty_=!1):(this.max_=Math.max(this.max_,b),this.min_=Math.min(this.min_,b))},get min(){return this.isEmpty_?void 0:this.min_},get max(){return this.isEmpty_?
+void 0:this.max_},get range(){return this.isEmpty_?void 0:this.max_-this.min_},get center(){return.5*(this.min_+this.max_)}};d.compareByMinTimes=function(b,a){return b.isEmpty||a.isEmpty?b.isEmpty&&!a.isEmpty?-1:!b.isEmpty&&a.isEmpty?1:0:b.min_-a.min_};return{Range:d}});"use strict";
+base.exportTo("tracing",function(){function d(){}function b(a){this.text_=a.toLowerCase()}function a(a){this.categories_={};a=a||[];for(var b=0;b<a.length;b++)this.addCategory(a[b])}d.prototype={__proto__:Object.prototype,matchCounter:function(a){return!0},matchCpu:function(a){return!0},matchProcess:function(a){return!0},matchSlice:function(a){return!0},matchThread:function(a){return!0}};b.prototype={__proto__:d.prototype,matchCounter:function(a){return 0===this.text_.length||void 0===a.name?!1:-1!==
+a.name.toLowerCase().indexOf(this.text_)},matchSlice:function(a){return 0===this.text_.length||void 0===a.title?!1:-1!==a.title.toLowerCase().indexOf(this.text_)}};a.prototype={__proto__:d.prototype,addCategory:function(a){this.categories_[a]=!0},matchCounter:function(a){return a.category?!this.categories_[a.category]:!0},matchSlice:function(a){return a.category?!this.categories_[a.category]:!0}};return{filterCounterArray:function(a,b){if(void 0===a)return b;for(var f=[],g=0;g<b.length;++g)a.matchCounter(b[g])&&
+f.push(b[g]);return f},filterSliceArray:function(a,b){if(void 0===a)return b;for(var f=[],g=0;g<b.length;++g)a.matchSlice(b[g])&&f.push(b[g]);return f},Filter:d,TitleFilter:b,CategoryFilter:a}});"use strict";base.require("base.guid");base.require("base.range");base.require("tracing.trace_model.counter_series");
+base.exportTo("tracing.trace_model",function(){function d(b,a,c,e){this.guid_=base.GUID.allocate();this.parent=b;this.id=a;this.category=c||"";this.name=e;this.series_=[];this.bounds=new base.Range}d.prototype={__proto__:Object.prototype,get guid(){return this.guid_},toJSON:function(){for(var b={},a=Object.keys(this),c=0;c<a.length;c++){var e=a[c];"function"!=typeof this[e]&&(b[e]="parent"==e?this[e].guid:this[e])}return b},set timestamps(b){throw Error("Bad counter API. No cookie.");},set seriesNames(b){throw Error("Bad counter API. No cookie.");
+},set seriesColors(b){throw Error("Bad counter API. No cookie.");},set samples(b){throw Error("Bad counter API. No cookie.");},addSeries:function(b){this.series_.push(b)},getSeries:function(b){return this.series_[b]},get series(){return this.series_},get numSeries(){return this.series_.length},get numSamples(){return 0===this.series_.length?0:this.series_[0].length},get timestamps(){return 0===this.series_.length?[]:this.series_[0].timestamps},getSampleStatistics:function(b){b.sort();var a=[];this.series_.forEach(function(c){a.push(c.getStatistics(b))});
+return a},shiftTimestampsForward:function(b){for(var a=0;a<this.series_.length;++a)this.series_[a].shiftTimestampsForward(b)},updateBounds:function(){this.totals=[];this.maxTotal=0;this.bounds.reset();if(0!==this.series_.length){var b=this.series_[0],a=this.series_[this.series_.length-1];this.bounds.addValue(b.getTimestamp(0));this.bounds.addValue(a.getTimestamp(a.length-1));this.maxTotal=-Infinity;for(var c=0;c<b.length;++c){var e=0;this.series_.forEach(function(a){e+=a.getSample(c).value;this.totals.push(e)}.bind(this));
+this.maxTotal=Math.max(e,this.maxTotal)}}}};d.compare=function(b,a){var c=b.parent.compareTo(a);if(0!=c)return c;c=b.name.localeCompare(a.name);return 0==c?b.tid-a.tid:c};return{Counter:d}});"use strict";base.exportTo("tracing.trace_model",function(){function d(b,a,c,e,f){this.category=b||"";this.title=a;this.colorId=c;this.start=e;this.args=f;this.didNotFinish=!1}d.prototype={selected:!1,duration:0,get end(){return this.start}};return{TraceModelEvent:d}});"use strict";base.require("tracing.trace_model.trace_model_event");
+base.exportTo("tracing.trace_model",function(){function d(b,a,c,e,f,g){tracing.trace_model.TraceModelEvent.call(this,b,a,c,e,f);void 0!==g&&(this.duration=g)}d.prototype={__proto__:tracing.trace_model.TraceModelEvent.prototype,get end(){return this.start+this.duration}};return{Slice:d}});"use strict";base.require("base.range");base.require("tracing.trace_model.slice");base.require("tracing.trace_model.counter");
+base.exportTo("tracing.trace_model",function(){function d(a){this.cpuNumber=a;this.slices=[];this.counters={};this.bounds=new base.Range}var b=tracing.trace_model.Counter;d.prototype={getOrCreateCounter:function(a,c){var e;e=a.length?a+"."+c:c;this.counters[e]||(this.counters[e]=new b(this,e,a,c));return this.counters[e]},shiftTimestampsForward:function(a){for(var c=0;c<this.slices.length;c++)this.slices[c].start+=a;for(var b in this.counters)this.counters[b].shiftTimestampsForward(a)},updateBounds:function(){this.bounds.reset();
+this.slices.length&&(this.bounds.addValue(this.slices[0].start),this.bounds.addValue(this.slices[this.slices.length-1].end));for(var a in this.counters)this.counters[a].updateBounds(),this.bounds.addRange(this.counters[a].bounds)},addCategoriesToDict:function(a){for(var c=0;c<this.slices.length;c++)a[this.slices[c].category]=!0;for(var b in this.counters)a[this.counters[b].category]=!0}};d.compare=function(a,c){return a.cpuNumber-c.cpuNumber};return{Cpu:d}});"use strict";
+base.exportTo("base",function(){function d(a,c,b){if(0==a.length)return 1;for(var f=0,g=a.length-1,d,k,l=-1;f<=g;)d=Math.floor((f+g)/2),k=c(a[d])-b,0>k?f=d+1:(0<k||(l=d),g=d-1);return-1!=l?l:f}function b(a,c,b,f,g,h){if(0!=a.length&&!(f>g)){var k=d(a,c,f);if(-1!=k&&(0<k&&c(a[k-1])+b(a[k-1],k-1)>=f&&h(a[k-1]),k!=a.length))for(b=a.length;k<b&&!(c(a[k])>=g);k++)h(a[k])}}return{findLowIndexInSortedArray:d,findLowIndexInSortedIntervals:function(a,c,b,f){var g=d(a,c,f);return 0==g?f>=c(a[0])&&f<c(a[0])+
+b(a[0],0)?0:-1:g<a.length?f>=c(a[g])&&f<c(a[g])+b(a[g],g)?g:f>=c(a[g-1])&&f<c(a[g-1])+b(a[g-1],g-1)?g-1:a.length:g==a.length?f>=c(a[g-1])&&f<c(a[g-1])+b(a[g-1],g-1)?g-1:a.length:a.length},iterateOverIntersectingIntervals:b,getIntersectingIntervals:function(a,c,e,f,g){var d=[];b(a,c,e,f,g,function(a){d.push(a)});return d}}});"use strict";
+base.exportTo("base",function(){function d(b,a){if(b instanceof Object)if(b instanceof Array)for(var c=0;c<b.length;c++)a(b,c,b[c]),d(b[c],a);else for(c in b){var e=b[c];a(b,c,e);d(e,a)}}return{asArray:function(b){for(var a=[],c=0;c<b.length;c++)a.push(b[c]);return a},concatenateArrays:function(){for(var b=[],a=0;a<arguments.length;a++){if(!(arguments[a]instanceof Array))throw Error("Arguments "+a+"is not an array");b.push.apply(b,arguments[a])}return b},compareArrays:function(b,a,c){for(var e=Math.min(b.length,
+a.length),f=0;f<e;f++){var g=c(b[f],a[f]);if(g)return g}return b.length==a.length?0:void 0===b[f]?-1:1},comparePossiblyUndefinedValues:function(b,a,c){return void 0!==b&&void 0!==a?c(b,a):void 0!==b?-1:void 0!==a?1:0},dictionaryKeys:function(b){var a=[],c;for(c in b)a.push(c);return a},dictionaryValues:function(b){var a=[],c;for(c in b)a.push(b[c]);return a},iterItems:function(b,a,c){c=c||this;for(var e in b)a.call(c,e,b[e])},iterObjectFieldsRecursively:d}});"use strict";base.require("base.iteration_helpers");
+base.exportTo("base",function(){return{addSingletonGetter:function(d){d.getInstance=function(){return d.instance_||(d.instance_=new d)}},tracedFunction:function(d,b,a){return function(){console.time(b);try{d.apply(a,arguments)}finally{console.timeEnd(b)}}},normalizeException:function(d){return"string"==typeof d?{message:d,stack:["<unknown>"]}:{message:d.message,stack:d.stack?d.stack:["<unknown>"]}},instantiateTemplate:function(d){return document.querySelector(d).content.cloneNode(!0)},stackTrace:function(){var d=
+Error().stack+"",d=d.split("\n");return d.slice(2)}}});"use strict";
+base.exportTo("tracing.trace_model",function(){function d(b,a,c){this.objectInstance=b;this.ts=a;this.args=c;this.selected=!1}d.prototype={__proto__:Object.prototype,preInitialize:function(){},initialize:function(){}};d.nameToConstructorMap_={};d.register=function(b,a){if(d.nameToConstructorMap_[b])throw Error("Constructor already registerd for "+b);d.nameToConstructorMap_[b]=a};d.unregister=function(b){delete d.nameToConstructorMap_[b]};d.getConstructor=function(b){return d.nameToConstructorMap_[b]?
+d.nameToConstructorMap_[b]:d};return{ObjectSnapshot:d}});"use strict";base.require("base.range");base.require("base.sorted_array_utils");base.require("tracing.trace_model.object_snapshot");
+base.exportTo("tracing.trace_model",function(){function d(b,a,c,e,f){this.parent=b;this.id=a;this.category=c;this.name=e;this.creationTs=f;this.creationTsWasExplicit=!1;this.deletionTs=Number.MAX_VALUE;this.selected=this.deletionTsWasExplicit=!1;this.colorId=0;this.bounds=new base.Range;this.snapshots=[];this.hasImplicitSnapshots=!1}d.prototype={__proto__:Object.prototype,get typeName(){return this.name},addSnapshot:function(b,a){if(b<this.creationTs)throw Error("Snapshots must be >= instance.creationTs");
+if(b>=this.deletionTs)throw Error("Snapshots cannot be added after an objects deletion timestamp.");var c;if(0<this.snapshots.length){c=this.snapshots[this.snapshots.length-1];if(c.ts==b)throw Error("Snapshots already exists at this time!");if(b<c.ts)throw Error("Snapshots must be added in increasing timestamp order");}c=new (tracing.trace_model.ObjectSnapshot.getConstructor(this.name))(this,b,a);this.snapshots.push(c);return c},wasDeleted:function(b){var a;if(0<this.snapshots.length&&(a=this.snapshots[this.snapshots.length-
+1],a.ts>b))throw Error("Instance cannot be deleted at ts="+b+". A snapshot exists that is older.");this.deletionTs=b;this.deletionTsWasExplicit=!0},preInitialize:function(){for(var b=0;b<this.snapshots.length;b++)this.snapshots[b].preInitialize()},initialize:function(){for(var b=0;b<this.snapshots.length;b++)this.snapshots[b].initialize()},getSnapshotAt:function(b){if(b<this.creationTs){if(this.creationTsWasExplicit)throw Error("ts must be within lifetime of this instance");return this.snapshots[0]}if(b>
+this.deletionTs)throw Error("ts must be within lifetime of this instance");var a=this.snapshots;b=base.findLowIndexInSortedIntervals(a,function(a){return a.ts},function(c,b){return b==a.length-1?a[b].objectInstance.deletionTs:a[b+1].ts-a[b].ts},b);return 0>b?this.snapshots[0]:b>=this.snapshots.length?this.snapshots[this.snapshots.length-1]:this.snapshots[b]},updateBounds:function(){this.bounds.reset();this.bounds.addValue(this.creationTs);this.deletionTs!=Number.MAX_VALUE?this.bounds.addValue(this.deletionTs):
+0<this.snapshots.length&&this.bounds.addValue(this.snapshots[this.snapshots.length-1].ts)},shiftTimestampsForward:function(b){this.creationTs+=b;this.deletionTs!=Number.MAX_VALUE&&(this.deletionTs+=b);this.snapshots.forEach(function(a){a.ts+=b})}};d.nameToConstructorMap_={};d.register=function(b,a){if(d.nameToConstructorMap_[b])throw Error("Constructor already registerd for "+b);d.nameToConstructorMap_[b]=a};d.unregister=function(b){delete d.nameToConstructorMap_[b]};d.getConstructor=function(b){return d.nameToConstructorMap_[b]?
+d.nameToConstructorMap_[b]:d};return{ObjectInstance:d}});"use strict";base.require("base.range");base.require("base.sorted_array_utils");
+base.exportTo("tracing.trace_model",function(){function d(b,a,c){this.createObjectInstanceFunction_=b;this.parent=a;this.id=c;this.instances=[]}d.prototype={idWasCreated:function(b,a,c){if(0==this.instances.length)return this.instances.push(this.createObjectInstanceFunction_(this.parent,this.id,b,a,c)),this.instances[0].creationTsWasExplicit=!0,this.instances[0];var e=this.instances[this.instances.length-1];if(c<e.deletionTs)throw Error("Mutation of the TimeToObjectInstanceMap must be done in ascending timestamp order.");
+e=this.createObjectInstanceFunction_(this.parent,this.id,b,a,c);e.creationTsWasExplicit=!0;this.instances.push(e);return e},addSnapshot:function(b,a,c,e){0==this.instances.length&&this.instances.push(this.createObjectInstanceFunction_(this.parent,this.id,b,a,c));var f=base.findLowIndexInSortedIntervals(this.instances,function(a){return a.creationTs},function(a){return a.deletionTs-a.creationTs},c);if(0>f){f=this.instances[0];if(c>f.deletionTs||f.creationTsWasExplicit)throw Error("At the provided timestamp, no instance was still alive");
+if(0!=f.snapshots.length)throw Error("Cannot shift creationTs forward, snapshots have been added. First snap was at ts="+f.snapshots[0].ts+" and creationTs was "+f.creationTs);f.creationTs=c}else if(f>=this.instances.length)if(f=this.instances[this.instances.length-1],c>=f.deletionTs)f=this.createObjectInstanceFunction_(this.parent,this.id,b,a,c),this.instances.push(f);else{for(var g,f=this.instances.length-1;0<=f;f--){b=this.instances[f];if(c>=b.deletionTs)break;0==b.creationTsWasExplicit&&0==b.snapshots.length&&
+(g=f)}if(void 0===g)throw Error("Cannot add snapshot. No instance was alive that was mutable.");f=this.instances[g];f.creationTs=c}else f=this.instances[f];return f.addSnapshot(c,e)},get lastInstance(){return 0==this.instances.length?void 0:this.instances[this.instances.length-1]},idWasDeleted:function(b,a,c){0==this.instances.length&&this.instances.push(this.createObjectInstanceFunction_(this.parent,this.id,b,a,c));var e=this.instances[this.instances.length-1];if(c<e.creationTs)throw Error("Cannot delete a id before it was crated");
+if(e.deletionTs==Number.MAX_VALUE)return e.wasDeleted(c),e;if(c<e.deletionTs)throw Error("id was already deleted earlier.");e=this.createObjectInstanceFunction_(this.parent,this.id,b,a,c);this.instances.push(e);return e},getInstanceAt:function(b){b=base.findLowIndexInSortedIntervals(this.instances,function(a){return a.creationTs},function(a){return a.deletionTs-a.creationTs},b);return 0>b?this.instances[0].creationTsWasExplicit?void 0:this.instances[0]:b>=this.instances.length?void 0:this.instances[b]}};
+return{TimeToObjectInstanceMap:d}});"use strict";base.require("base.utils");base.require("base.range");base.require("base.sorted_array_utils");base.require("tracing.trace_model.object_instance");base.require("tracing.trace_model.time_to_object_instance_map");
+base.exportTo("tracing.trace_model",function(){function d(b){this.parent=b;this.bounds=new base.Range;this.instanceMapsById_={};this.instancesByTypeName_={};this.createObjectInstance_=this.createObjectInstance_.bind(this)}d.prototype={__proto__:Object.prototype,createObjectInstance_:function(b,a,c,e,f){b=new (tracing.trace_model.ObjectInstance.getConstructor(e))(b,a,c,e,f);a=b.typeName;c=this.instancesByTypeName_[a];c||(c=[],this.instancesByTypeName_[a]=c);c.push(b);return b},getOrCreateInstanceMap_:function(b){var a=
+this.instanceMapsById_[b];if(a)return a;a=new tracing.trace_model.TimeToObjectInstanceMap(this.createObjectInstance_,this.parent,b);return this.instanceMapsById_[b]=a},idWasCreated:function(b,a,c,e){return this.getOrCreateInstanceMap_(b).idWasCreated(a,c,e)},addSnapshot:function(b,a,c,e,f){b=this.getOrCreateInstanceMap_(b,a,c,e).addSnapshot(a,c,e,f);if(b.objectInstance.category!=a)throw Error("Added snapshot with different category than when it was created");if(b.objectInstance.name!=c)throw Error("Added snapshot with different name than when it was created");
+return b},idWasDeleted:function(b,a,c,e){if(b=this.getOrCreateInstanceMap_(b,a,c,e).idWasDeleted(a,c,e)){if(b.category!=a)throw Error("Deleting an object with a different category than when it was created");if(b.name!=c)throw Error("Deleting an object with a different name than when it was created");}},autoDeleteObjects:function(b){base.iterItems(this.instanceMapsById_,function(a,c){var e=c.lastInstance;e.deletionTs==Number.MAX_VALUE&&(c.idWasDeleted(e.category,e.name,b),e.deletionTsWasExplicit=!1)})},
+getObjectInstanceAt:function(b,a){var c=this.instanceMapsById_[b];return c?c.getInstanceAt(a):void 0},getSnapshotAt:function(b,a){var c=this.getObjectInstanceAt(b,a);return c?c.getSnapshotAt(a):void 0},iterObjectInstances:function(b,a){a=a||this;base.iterItems(this.instanceMapsById_,function(c,e){e.instances.forEach(b,a)})},getAllObjectInstances:function(){var b=[];this.iterObjectInstances(function(a){b.push(a)});return b},getAllInstancesNamed:function(b){return this.instancesByTypeName_[b]},getAllInstancesByTypeName:function(){return this.instancesByTypeName_},
+preInitializeAllObjects:function(){this.iterObjectInstances(function(b){b.preInitialize()})},initializeAllObjects:function(){this.iterObjectInstances(function(b){b.initialize()})},initializeInstances:function(){this.iterObjectInstances(function(b){b.initialize()})},updateBounds:function(){this.bounds.reset();this.iterObjectInstances(function(b){b.updateBounds();this.bounds.addRange(b.bounds)},this)},shiftTimestampsForward:function(b){this.iterObjectInstances(function(a){a.shiftTimestampsForward(b)})},
+addCategoriesToDict:function(b){this.iterObjectInstances(function(a){b[a.category]=!0})},toJSON:function(){return{}}};return{ObjectCollection:d}});"use strict";base.require("tracing.trace_model.slice");
+base.exportTo("tracing.trace_model",function(){function d(b,a,c,e,f){tracing.trace_model.Slice.apply(this,arguments)}d.prototype={__proto__:tracing.trace_model.Slice.prototype,toJSON:function(){for(var b={},a=Object.keys(this),c=0;c<a.length;c++){var e=a[c];"function"!=typeof this[e]&&(b[e]="startThread"==e||"endThread"==e?this[e].guid:this[e])}return b},id:void 0,startThread:void 0,endThread:void 0,subSlices:void 0};return{AsyncSlice:d}});"use strict";base.require("base.range");base.require("tracing.trace_model.async_slice");
+base.exportTo("tracing.trace_model",function(){function d(){this.slices=[];this.bounds=new base.Range}d.prototype={__proto__:Object.prototype,push:function(b){this.slices.push(b)},get length(){return this.slices.length},shiftTimestampsForward:function(b){for(var a=0;a<this.slices.length;a++){var c=this.slices[a];c.start+=b;for(var e=0;e<c.subSlices.length;e++)c.subSlices[e].start+=b}},updateBounds:function(){this.bounds.reset();for(var b=0;b<this.slices.length;b++)this.bounds.addValue(this.slices[b].start),
+this.bounds.addValue(this.slices[b].end)},computeSubGroups:function(){for(var b={},a=0;a<this.slices.length;++a){var c=this.slices[a],e=c.startThread.guid;b[e]||(b[e]=new d);b[e].slices.push(c)}var a=[],f;for(f in b)c=b[f],c.updateBounds(),a.push(c);return a}};return{AsyncSliceGroup:d}});"use strict";base.require("tracing.trace_model.trace_model_event");
+base.exportTo("tracing.trace_model",function(){function d(b,a,c,e,f){tracing.trace_model.TraceModelEvent.apply(this,arguments)}d.prototype={__proto__:tracing.trace_model.TraceModelEvent.prototype};return{Sample:d}});"use strict";base.require("base.range");base.require("tracing.trace_model.slice");base.require("tracing.color_scheme");base.require("tracing.filter");
+base.exportTo("tracing.trace_model",function(){function d(a){this.sliceConstructor=a||b;this.openPartialSlices_=[];this.slices=[];this.bounds=new base.Range}var b=tracing.trace_model.Slice;d.prototype={__proto__:Object.prototype,get length(){return this.slices.length},pushSlice:function(a){this.slices.push(a);return a},pushSlices:function(a){this.slices.push.apply(this.slices,a)},pushInstantEvent:function(a){this.slices.push(a)},beginSlice:function(a,c,b,f){if(this.openPartialSlices_.length&&b<this.openPartialSlices_[this.openPartialSlices_.length-
+1].start)throw Error("Slices must be added in increasing timestamp order");var g=tracing.getStringColorId(c);a=new this.sliceConstructor(a,c,g,b,f?f:{});this.openPartialSlices_.push(a);return a},isTimestampValidForBeginOrEnd:function(a){return this.openPartialSlices_.length?a>=this.openPartialSlices_[this.openPartialSlices_.length-1].start:!0},get openSliceCount(){return this.openPartialSlices_.length},get mostRecentlyOpenedPartialSlice(){return this.openPartialSlices_.length?this.openPartialSlices_[this.openPartialSlices_.length-
+1]:void 0},endSlice:function(a){if(!this.openSliceCount)throw Error("endSlice called without an open slice");var c=this.openPartialSlices_[this.openSliceCount-1];this.openPartialSlices_.splice(this.openSliceCount-1,1);if(a<c.start)throw Error("Slice "+c.title+" end time is before its start.");c.duration=a-c.start;this.pushSlice(c);return c},autoCloseOpenSlices:function(a){a||(this.updateBounds(),a=this.bounds.max);for(;0<this.openSliceCount;)this.endSlice(a).didNotFinish=!0},shiftTimestampsForward:function(a){for(var c=
+0;c<this.slices.length;c++){var b=this.slices[c];b.start+=a}for(c=0;c<this.openPartialSlices_.length;c++)b=this.openPartialSlices_[i],b.start+=a},updateBounds:function(){this.bounds.reset();for(var a=0;a<this.slices.length;a++)this.bounds.addValue(this.slices[a].start),this.bounds.addValue(this.slices[a].end);this.openPartialSlices_.length&&(this.bounds.addValue(this.openPartialSlices_[0].start),this.bounds.addValue(this.openPartialSlices_[this.openPartialSlices_.length-1].start))},copySlice:function(a){var c=
+new this.sliceConstructor(a.category,a.title,a.colorId,a.start,a.args,a.duration);c.didNotFinish=a.didNotFinish;return c}};d.merge=function(a,c){if(0<a.openPartialSlices_.length)throw Error("groupA has open partial slices");if(0<c.openPartialSlices_.length)throw Error("groupB has open partial slices");for(var b=new d,f=a.slices,g=c.slices,h=f.length-1,k=g.length-1,l=[],m=[],n=function(a){for(var c=0;c<m.length;c++){var f=m[c],g=f.end;if(a<f.start||g<a)throw Error("slice should not be split");var d=
+b.copySlice(f);f.start=a;f.duration=g-a;f.title+=" (cont.)";d.duration=a-d.start;m[c]=d;b.pushSlice(d)}},p=function(a){for(;0<l.length||0<m.length;){var c=l[l.length-1],b=m[m.length-1],c=c&&c.start,b=b&&b.start;if((void 0===c||c<a)&&(void 0===b||b<a))break;void 0===b||c>b?(n(c),l.pop()):m.pop()}};0<=h||0<=k;){var q=f[h],s=g[k];void 0===q||void 0!==s&&q.end<s.end?(q=b.copySlice(s),s=!0,k--):(q=b.copySlice(q),s=!1,h--);p(q.end);b.pushSlice(q);s?m.push(q):(n(q.end),l.push(q))}p();b.slices.reverse();
+return b};return{SliceGroup:d}});"use strict";base.require("base.guid");base.require("base.range");base.require("tracing.trace_model.slice");base.require("tracing.trace_model.slice_group");base.require("tracing.trace_model.async_slice_group");base.require("tracing.trace_model.sample");
+base.exportTo("tracing.trace_model",function(){function d(c,b,e,d,l,m){a.call(this,c,b,e,d,l,m);this.subSlices=[]}function b(a,b){this.guid_=base.GUID.allocate();if(!a)throw Error("Parent must be provided.");this.parent=a;this.sortIndex=0;this.tid=b;this.sliceGroup=new c(d);this.cpuSlices=void 0;this.samples_=[];this.kernelSliceGroup=new c;this.asyncSliceGroup=new e;this.bounds=new base.Range;this.ephemeralSettings={}}var a=tracing.trace_model.Slice,c=tracing.trace_model.SliceGroup,e=tracing.trace_model.AsyncSliceGroup;
+d.prototype={__proto__:a.prototype};b.prototype={get guid(){return this.guid_},compareTo:function(a){return b.compare(this,a)},toJSON:function(){for(var a={},c=Object.keys(this),b=0;b<c.length;b++){var e=c[b];"function"!=typeof this[e]&&(a[e]="parent"==e?this[e].guid:this[e])}return a},addSample:function(a,c,b,e){if(this.samples_.length&&b<this.samples_[this.samples_.length-1].start)throw Error("Samples must be added in increasing timestamp order.");var d=tracing.getStringColorId(c);a=new tracing.trace_model.Sample(a,
+c,d,b,e?e:{});this.samples_.push(a);return a},get samples(){return this.samples_},name:void 0,shiftTimestampsForward:function(a){this.sliceGroup.shiftTimestampsForward(a);if(this.cpuSlices)for(var c=0;c<this.cpuSlices.length;c++)this.cpuSlices[c].start+=a;if(this.samples_.length)for(c=0;c<this.samples_.length;c++)this.samples_[c].start+=a;this.kernelSliceGroup.shiftTimestampsForward(a);this.asyncSliceGroup.shiftTimestampsForward(a)},get isEmpty(){return this.sliceGroup.length||this.sliceGroup.openSliceCount||
+this.cpuSlices&&this.cpuSlices.length||this.kernelSliceGroup.length||this.asyncSliceGroup.length||this.samples_.length?!1:!0},updateBounds:function(){this.bounds.reset();this.sliceGroup.updateBounds();this.bounds.addRange(this.sliceGroup.bounds);this.kernelSliceGroup.updateBounds();this.bounds.addRange(this.kernelSliceGroup.bounds);this.asyncSliceGroup.updateBounds();this.bounds.addRange(this.asyncSliceGroup.bounds);this.cpuSlices&&this.cpuSlices.length&&(this.bounds.addValue(this.cpuSlices[0].start),
+this.bounds.addValue(this.cpuSlices[this.cpuSlices.length-1].end));this.samples_.length&&(this.bounds.addValue(this.samples_[0].start),this.bounds.addValue(this.samples_[this.samples_.length-1].end))},addCategoriesToDict:function(a){for(var c=0;c<this.sliceGroup.length;c++)a[this.sliceGroup.slices[c].category]=!0;for(c=0;c<this.kernelSliceGroup.length;c++)a[this.kernelSliceGroup.slices[c].category]=!0;for(c=0;c<this.asyncSliceGroup.length;c++)a[this.asyncSliceGroup.slices[c].category]=!0;for(c=0;c<
+this.samples_.length;c++)a[this.samples_[c].category]=!0},autoCloseOpenSlices:function(a){this.sliceGroup.autoCloseOpenSlices(a);this.kernelSliceGroup.autoCloseOpenSlices(a)},mergeKernelWithUserland:function(){if(0<this.kernelSliceGroup.length){var a=c.merge(this.sliceGroup,this.kernelSliceGroup);this.sliceGroup.slices=a.slices;this.kernelSliceGroup=new c;this.updateBounds()}},get userFriendlyName(){return this.name||this.tid},get userFriendlyDetails(){return"tid: "+this.tid+(this.name?", name: "+
+this.name:"")},getSettingsKey:function(){if(this.name){var a=this.parent.getSettingsKey();return a?a+"."+this.name:void 0}}};b.compare=function(a,c){var b=a.parent.compareTo(c.parent);return b||(b=a.sortIndex-c.sortIndex)?b:(b=base.comparePossiblyUndefinedValues(a.name,c.name,function(a,c){return a.localeCompare(c)}))?b:a.tid-c.tid};return{ThreadSlice:d,Thread:b}});"use strict";
+base.exportTo("base",function(){function d(){return d}var b=localStorage;d.get=function(a,c,e){a=d.namespace_(a,e);var f=b.getItem(a);if(null===f||void 0===f)return c;try{return JSON.parse(f).value}catch(g){return b.removeItem(d.namespace_(a,e)),c}};d.set=function(a,c,e){if(void 0===c)throw Error("Settings.set: value must not be undefined");c=JSON.stringify({value:c});b.setItem(d.namespace_(a,e),c)};d.keys=function(a){var c=[];a=a||"";for(var e=0;e<b.length;e++){var f=b.key(e);d.isnamespaced_(f,a)&&
+c.push(d.unnamespace_(f,a))}return c};d.isnamespaced_=function(a,c){return 0==a.indexOf(d.normalize_(c))};d.namespace_=function(a,c){return d.normalize_(c)+a};d.unnamespace_=function(a,c){return a.replace(d.normalize_(c),"")};d.normalize_=function(a){return d.NAMESPACE+(a?a+".":"")};d.setAlternativeStorageInstance=function(a){b=a};d.getAlternativeStorageInstance=function(){return b===localStorage?void 0:b};d.NAMESPACE="trace-viewer";return{Settings:d}});"use strict";base.require("base.settings");
+base.exportTo("tracing",function(){function d(a){this.model=a;this.objectsByKey_=[];this.nonuniqueKeys_=[];this.buildObjectsByKeyMap_();this.removeNonuniqueKeysFromSettings_()}var b=base.Settings;d.prototype={buildObjectsByKeyMap_:function(){var a=[this.model.kernel];a.push.apply(a,base.dictionaryValues(this.model.processes));a.push.apply(a,this.model.getAllThreads());for(var c={},b=0;b<a.length;b++){var f=a[b],g=f.getSettingsKey();g&&(c[g]=void 0===c[g]?f:"nonuniqueKey")}var d={};base.dictionaryKeys(c).forEach(function(a){"nonuniqueKey"===
+c[a]&&(delete c[a],d[a]=!0)});this.nonuniqueKeys=d;this.objectsByKey_=c},removeNonuniqueKeysFromSettings_:function(){var a=b.get("trace_model_settings",{}),c=!1;base.dictionaryKeys(a).forEach(function(b){this.nonuniqueKeys[b]&&(c=!0,delete a[b])},this);c&&b.set("trace_model_settings",a)},hasUniqueSettingKey:function(a){return(a=a.getSettingsKey())?void 0!==this.objectsByKey_[a]:!1},getSettingFor:function(a,c,e){var f=a.getSettingsKey();if(!f||!this.objectsByKey_[f])return c=a.ephemeralSettings[c],
+void 0!==c?c:e;a=b.get("trace_model_settings",{});a[f]||(a[f]={});c=a[f][c];return void 0!==c?c:e},setSettingFor:function(a,c,e){var f=a.getSettingsKey();f&&this.objectsByKey_[f]?(a=b.get("trace_model_settings",{}),a[f]||(a[f]={}),a[f][c]=e,b.set("trace_model_settings",a)):a.ephemeralSettings[c]=e}};return{TraceModelSettings:d}});"use strict";base.require("base.guid");base.require("base.range");base.require("tracing.trace_model.counter");base.require("tracing.trace_model.object_collection");base.require("tracing.trace_model.thread");
+base.require("tracing.trace_model_settings");
+base.exportTo("tracing.trace_model",function(){function d(a){if(!a)throw Error("Must provide a model");this.guid_=base.GUID.allocate();this.model=a;this.threads={};this.counters={};this.objects=new tracing.trace_model.ObjectCollection(this);this.bounds=new base.Range;this.sortIndex=0;this.ephemeralSettings={}}var b=tracing.trace_model.Thread,a=tracing.trace_model.Counter;d.compare=function(a,b){return a.sortIndex-b.sortIndex};d.prototype={get guid(){return this.guid_},get numThreads(){var a=0,b;for(b in this.threads)a++;
+return a},toJSON:function(){for(var a={},b=Object.keys(this),f=0;f<b.length;f++){var g=b[f];"function"!=typeof this[g]&&"model"!=g&&(a[g]=this[g])}return a},shiftTimestampsForward:function(a){for(var b in this.threads)this.threads[b].shiftTimestampsForward(a);for(var f in this.counters)this.counters[f].shiftTimestampsForward(a);this.objects.shiftTimestampsForward(a)},autoCloseOpenSlices:function(a){for(var b in this.threads)this.threads[b].autoCloseOpenSlices(a)},autoDeleteObjects:function(a){this.objects.autoDeleteObjects(a)},
+preInitializeObjects:function(){this.objects.preInitializeAllObjects()},initializeObjects:function(){this.objects.initializeAllObjects()},mergeKernelWithUserland:function(){for(var a in this.threads)this.threads[a].mergeKernelWithUserland()},updateBounds:function(){this.bounds.reset();for(var a in this.threads)this.threads[a].updateBounds(),this.bounds.addRange(this.threads[a].bounds);for(var b in this.counters)this.counters[b].updateBounds(),this.bounds.addRange(this.counters[b].bounds);this.objects.updateBounds();
+this.bounds.addRange(this.objects.bounds)},addCategoriesToDict:function(a){for(var b in this.threads)this.threads[b].addCategoriesToDict(a);for(var f in this.counters)a[this.counters[f].category]=!0;this.objects.addCategoriesToDict(a)},findAllThreadsNamed:function(a){var b=[],f;for(f in this.threads){var g=this.threads[f];g.name==a&&b.push(g)}return b},pruneEmptyContainers:function(){var a={},b;for(b in this.threads){var f=this.threads[b];f.isEmpty||(a[b]=f)}this.threads=a},getOrCreateThread:function(a){this.threads[a]||
+(this.threads[a]=new b(this,a));return this.threads[a]},getOrCreateCounter:function(c,b){var f=c+"."+b;this.counters[f]||(this.counters[f]=new a(this,f,c,b));return this.counters[f]},getSettingsKey:function(){throw Error("Not implemented");}};return{ProcessBase:d}});"use strict";base.require("tracing.trace_model.cpu");base.require("tracing.trace_model.process_base");
+base.exportTo("tracing.trace_model",function(){function d(c){if(void 0===c)throw Error("model must be provided");a.call(this,c);this.cpus={}}var b=tracing.trace_model.Cpu,a=tracing.trace_model.ProcessBase;d.compare=function(a,b){return 0};d.prototype={__proto__:a.prototype,compareTo:function(a){return d.compare(this,a)},get userFriendlyName(){return"Kernel"},get userFriendlyDetails(){return"Kernel"},getOrCreateCpu:function(a){this.cpus[a]||(this.cpus[a]=new b(a));return this.cpus[a]},shiftTimestampsForward:function(c){a.prototype.shiftTimestampsForward.call(this);
+for(var b in this.cpus)this.cpus[b].shiftTimestampsForward(c)},updateBounds:function(){a.prototype.updateBounds.call(this);for(var c in this.cpus){var b=this.cpus[c];b.updateBounds();this.bounds.addRange(b.bounds)}},addCategoriesToDict:function(c){a.prototype.addCategoriesToDict.call(this,c);for(var b in this.cpus)this.cpus[b].addCategoriesToDict(c)},getSettingsKey:function(){return"kernel"}};return{Kernel:d}});"use strict";base.require("tracing.trace_model.process_base");
+base.exportTo("tracing.trace_model",function(){function d(b,a){if(void 0===b)throw Error("model must be provided");if(void 0===a)throw Error("pid must be provided");tracing.trace_model.ProcessBase.call(this,b);this.pid=a;this.name=void 0;this.labels=[];this.instantEvents=[]}d.compare=function(b,a){var c=tracing.trace_model.ProcessBase.compare(b,a);return c||(c=base.comparePossiblyUndefinedValues(b.name,a.name,function(a,c){return a.localeCompare(c)}))?c:(c=base.compareArrays(b.labels,a.labels,function(a,
+c){return a.localeCompare(c)}))?c:b.pid-a.pid};d.prototype={__proto__:tracing.trace_model.ProcessBase.prototype,compareTo:function(b){return d.compare(this,b)},pushInstantEvent:function(b){this.instantEvents.push(b)},get userFriendlyName(){var b;b=this.name?this.name:"Process "+this.pid;this.labels.length&&(b+=": "+this.labels.join(", "));return b},get userFriendlyDetails(){return this.name?this.name+" (pid "+this.pid+")":"pid: "+this.pid},getSettingsKey:function(){return this.name?this.labels.length?
+"processes."+this.name+"."+this.labels.join("."):"processes."+this.name:void 0},shiftTimestampsForward:function(b){for(var a in this.instantEvents)this.instantEvents[a].start+=b;tracing.trace_model.ProcessBase.prototype.shiftTimestampsForward.apply(this,arguments)}};return{Process:d}});"use strict";base.require("base.range");base.require("base.events");base.require("tracing.trace_model.process");base.require("tracing.trace_model.kernel");base.require("tracing.filter");
+base.exportTo("tracing",function(){function d(a,b){this.kernel=new c(this);this.processes={};this.importErrors=[];this.metadata=[];this.categories=[];this.bounds=new base.Range;this.instantEvents=[];a&&this.importTraces([a],b)}function b(a){this.importPriority=0}var a=tracing.trace_model.Process,c=tracing.trace_model.Kernel;d.importerConstructors_=[];d.registerImporter=function(a){d.importerConstructors_.push(a)};d.prototype={__proto__:base.EventTarget.prototype,get numProcesses(){var a=0,c;for(c in this.processes)a++;
+return a},getOrCreateProcess:function(c){this.processes[c]||(this.processes[c]=new a(this,c));return this.processes[c]},pushInstantEvent:function(a){this.instantEvents.push(a)},updateCategories_:function(){var a={};this.kernel.addCategoriesToDict(a);for(var c in this.processes)this.processes[c].addCategoriesToDict(a);this.categories=[];for(var b in a)""!=b&&this.categories.push(b)},updateBounds:function(){this.bounds.reset();this.kernel.updateBounds();this.bounds.addRange(this.kernel.bounds);for(var a in this.processes)this.processes[a].updateBounds(),
+this.bounds.addRange(this.processes[a].bounds)},shiftWorldToZero:function(){if(!this.bounds.isEmpty){var a=this.bounds.min;this.kernel.shiftTimestampsForward(-a);for(var c in this.instantEvents)this.instantEvents[c].start-=a;for(var b in this.processes)this.processes[b].shiftTimestampsForward(-a);this.updateBounds()}},getAllThreads:function(){var a=[],c;for(c in this.kernel.threads)a.push(d.threads[c]);for(var b in this.processes){var d=this.processes[b];for(c in d.threads)a.push(d.threads[c])}return a},
+getAllProcesses:function(){var a=[],c;for(c in this.processes)a.push(this.processes[c]);return a},getAllCounters:function(){var a=[];a.push.apply(a,base.dictionaryValues(this.kernel.counters));for(var c in this.processes){var b=this.processes[c],d;for(d in b.counters)a.push(b.counters[d])}return a},findAllThreadsNamed:function(a){var c=[];c.push.apply(c,this.kernel.findAllThreadsNamed(a));for(var b in this.processes)c.push.apply(c,this.processes[b].findAllThreadsNamed(a));return c},createImporter_:function(a){for(var c,
+b=0;b<d.importerConstructors_.length;++b)if(d.importerConstructors_[b].canImport(a)){c=d.importerConstructors_[b];break}if(!c)throw Error("Could not find an importer for the provided eventData.");return new c(this,a)},importTraces:function(a,c,b){void 0===c&&(c=!0);void 0===b&&(b=!0);a=a.slice(0);for(var d=[],k=0;k<a.length;++k)d.push(this.createImporter_(a[k]));for(k=0;k<d.length;k++){var l=d[k].extractSubtrace();l&&(a.push(l),d.push(this.createImporter_(l)))}d.sort(function(a,c){return a.importPriority-
+c.importPriority});for(k=0;k<d.length;k++)d[k].importEvents(0<k);this.updateBounds();this.kernel.autoCloseOpenSlices(this.bounds.max);for(var m in this.processes)this.processes[m].autoCloseOpenSlices(this.bounds.max);for(k=0;k<d.length;k++)d[k].finalizeImport();for(m in this.processes)this.processes[m].preInitializeObjects();if(b)for(m in this.kernel.pruneEmptyContainers(),this.processes)this.processes[m].pruneEmptyContainers();for(m in this.processes)this.processes[m].mergeKernelWithUserland();this.updateBounds();
+this.updateCategories_();c&&this.shiftWorldToZero();for(k=0;k<d.length;k++)d[k].joinRefs();for(m in this.processes)this.processes[m].autoDeleteObjects(this.bounds.max);for(m in this.processes)this.processes[m].initializeObjects()}};b.canImport=function(a){return a instanceof Array&&0==a.length?!0:"string"===typeof a||a instanceof String?0==a.length:!1};b.prototype={__proto__:Object.prototype,extractSubtrace:function(){},importEvents:function(){},finalizeImport:function(){},joinRefs:function(){}};
+d.registerImporter(b);return{TraceModel:d}});"use strict";base.require("tracing.trace_model");base.require("tracing.color_scheme");base.require("tracing.importer.linux_perf.bus_parser");base.require("tracing.importer.linux_perf.clock_parser");base.require("tracing.importer.linux_perf.cpufreq_parser");base.require("tracing.importer.linux_perf.disk_parser");base.require("tracing.importer.linux_perf.drm_parser");base.require("tracing.importer.linux_perf.exynos_parser");base.require("tracing.importer.linux_perf.gesture_parser");
+base.require("tracing.importer.linux_perf.i915_parser");base.require("tracing.importer.linux_perf.mali_parser");base.require("tracing.importer.linux_perf.power_parser");base.require("tracing.importer.linux_perf.sched_parser");base.require("tracing.importer.linux_perf.sync_parser");base.require("tracing.importer.linux_perf.workqueue_parser");base.require("tracing.importer.linux_perf.android_parser");base.require("tracing.importer.linux_perf.kfunc_parser");base.require("tracing.importer.linux_perf.irq_parser");
+base.require("tracing.importer.linux_perf.memreclaim_parser");
+base.exportTo("tracing.importer",function(){function d(a){this.cpu=a}function b(a,c){this.importPriority=2;this.model_=a;this.events_=c;this.clockSyncRecords_=[];this.cpuStates_={};this.wakeups_=[];this.kernelThreadStates_={};this.buildMapFromLinuxPidsToThreads();this.lineNumberBase=0;this.lineNumber=-1;this.pseudoThreadCounter=1;this.parsers_=[];this.eventHandlers_={}}function a(a){return"{"==a[0]?!1:e.test(a)?f:g.test(a)?h:k.test(a)?l:null}d.prototype={__proto__:Object.prototype,switchRunningLinuxPid:function(a,
+c,b,e,f,d){if(void 0!==this.lastActivePid&&0!=this.lastActivePid){var g=b-this.lastActiveTs;a=(a=a.threadsByLinuxPid[this.lastActivePid])?a.userFriendlyName:this.lastActiveComm;c=new tracing.trace_model.Slice("",a,tracing.getStringColorId(a),this.lastActiveTs,{comm:this.lastActiveComm,tid:this.lastActivePid,prio:this.lastActivePrio,stateWhenDescheduled:c},g);this.cpu.slices.push(c)}this.lastActiveTs=b;this.lastActivePid=e;this.lastActiveComm=f;this.lastActivePrio=d}};var c={},e=/^\s*(.+)-(\d+)\s+\(\s*(\d+|-+)\)\s\[(\d+)\]\s+[dX.][N.][Hhs.][0-9a-f.]\s+(\d+\.\d+):\s+(\S+):\s(.*)$/,
+f=function(a){a=e.exec(a);if(!a)return a;var c=a[3];"-"===c[0]&&(c=void 0);return{threadName:a[1],pid:a[2],tgid:c,cpuNumber:a[4],timestamp:a[5],eventName:a[6],details:a[7]}};c.lineParserWithTGID=f;var g=/^\s*(.+)-(\d+)\s+\[(\d+)\]\s+[dX.][N.][Hhs.][0-9a-f.]\s+(\d+\.\d+):\s+(\S+):\s(.*)$/,h=function(a){return(a=g.exec(a))?{threadName:a[1],pid:a[2],cpuNumber:a[3],timestamp:a[4],eventName:a[5],details:a[6]}:a};c.lineParserWithIRQInfo=h;var k=/^\s*(.+)-(\d+)\s+\[(\d+)\]\s*(\d+\.\d+):\s+(\S+):\s(.*)$/,
+l=function(a){return(a=k.exec(a))?{threadName:a[1],pid:a[2],cpuNumber:a[3],timestamp:a[4],eventName:a[5],details:a[6]}:a};c.lineParserWithLegacyFmt=l;c.traceEventClockSyncRE=/trace_event_clock_sync: parent_ts=(\d+\.?\d*)/;c.autoDetectLineParser=a;b.canImport=function(c){if(!("string"===typeof c||c instanceof String))return!1;if(b._extractEventsFromSystraceHTML(c,!1).ok||/^# tracer:/.test(c))return!0;var e=/^(.+)\n/.exec(c);e&&(c=e[1]);return a(c)?!0:!1};b._extractEventsFromSystraceHTML=function(a,
+c){function b(a){for(;g<d.length;g++)if(a.test(d[g]))return!0;return!1}function e(a,c){return-1===a.indexOf(c,a.length-c.length)?a:a.substring(a,a.length-c.length)}var f={ok:!1};void 0===c&&(c=!0);if(0==/^<!DOCTYPE HTML>/.test(a))return f;var d=a.split("\n"),g=1;if(!b(/^ <script>$/)||!b(/^ var linuxPerfData = "\\$/))return f;var h=g+1;if(!b(/^ <\/script>$/))return f;var l=g;if(!b(/^<\/body>$/)||!b(/^<\/html>$/))return f;var k=d.slice(h,l),l=[];if(c)for(var x=0;x<k.length;x++){var y=k[x],y=e(y,
+"\\n\\");l.push(y)}else l=[k[k.length-1]];k=l[l.length-1];x=e(k,'\\n";');if(x==k)return f;l[l.length-1]=x;return{ok:!0,lines:c?l:void 0,events_begin_at_line:h}};b.prototype={__proto__:Object.prototype,extractSubtrace:function(){},get model(){return this.model_},buildMapFromLinuxPidsToThreads:function(){this.threadsByLinuxPid={};this.model_.getAllThreads().forEach(function(a){this.threadsByLinuxPid[a.tid]=a}.bind(this))},getOrCreateCpuState:function(a){if(!this.cpuStates_[a]){var c=this.model_.kernel.getOrCreateCpu(a);
+this.cpuStates_[a]=new d(c)}return this.cpuStates_[a]},getOrCreateKernelThread:function(a,c,b){this.kernelThreadStates_[a]||(b=this.model_.getOrCreateProcess(c).getOrCreateThread(b),b.name=a,this.kernelThreadStates_[a]={pid:c,thread:b,openSlice:void 0,openSliceTS:void 0},this.threadsByLinuxPid[c]=b);return this.kernelThreadStates_[a]},getOrCreatePseudoThread:function(a){var c=this.kernelThreadStates_[a];c||(c=this.getOrCreateKernelThread(a,0,this.pseudoThreadCounter),this.pseudoThreadCounter++);return c},
+importEvents:function(a){this.createParsers();this.importCpuData();this.alignClocks(a)&&(this.buildMapFromLinuxPidsToThreads(),this.buildPerThreadCpuSlicesFromCpuState())},finalizeImport:function(){},joinRefs:function(){},buildPerThreadCpuSlicesFromCpuState:function(){for(var a in this.cpuStates_)for(var c=this.cpuStates_[a].cpu,b=0;b<c.slices.length;b++){var e=c.slices[b],f=this.threadsByLinuxPid[e.args.tid];f&&(f.tempCpuSlices||(f.tempCpuSlices=[]),f.tempCpuSlices.push(e))}for(b in this.wakeups_)if(a=
+this.wakeups_[b],f=this.threadsByLinuxPid[a.tid])f.tempWakeups=f.tempWakeups||[],f.tempWakeups.push(a);var d=tracing.getColorIdByName("running"),g=tracing.getColorIdByName("runnable"),h=tracing.getColorIdByName("sleeping"),l=tracing.getColorIdByName("iowait");this.model_.getAllThreads().forEach(function(a){if(void 0!==a.tempCpuSlices){var c=a.tempCpuSlices;delete a.tempCpuSlices;c.sort(function(a,c){return a.start-c.start});var b=a.tempWakeups||[];delete a.tempWakeups;b.sort(function(a,c){return a.ts-
+c.ts});var e=[];if(c.length){var f=c[0];if(b.length&&b[0].ts<f.start){var k=b.shift();e.push(new tracing.trace_model.Slice("","Runnable",g,k.ts,{"wakeup from tid":k.fromTid},f.start-k.ts))}e.push(new tracing.trace_model.Slice("","Running",d,f.start,{},f.duration))}k=void 0;for(f=1;f<c.length;f++){for(var m=c[f-1],n=c[f],p=n.start-m.end;b.length&&b[0].ts<n.start;){var q=b.shift();void 0===k&&q.ts>m.end&&(k=q)}q=function(a,c){void 0!==k&&(p=k.ts-m.end);e.push(new tracing.trace_model.Slice("",a,c,m.end,
+{},p));void 0!==k&&(e.push(new tracing.trace_model.Slice("","Runnable",g,k.ts,{"wakeup from tid":k.fromTid},n.start-k.ts)),k=void 0)};"S"==m.args.stateWhenDescheduled?q("Sleeping",h):"R"==m.args.stateWhenDescheduled||"R+"==m.args.stateWhenDescheduled?e.push(new tracing.trace_model.Slice("","Runnable",g,m.end,{},p)):"D"==m.args.stateWhenDescheduled?q("Uninterruptible Sleep",l):"T"==m.args.stateWhenDescheduled?e.push(new tracing.trace_model.Slice("","__TASK_STOPPED",l,m.end,{},p)):"t"==m.args.stateWhenDescheduled?
+e.push(new tracing.trace_model.Slice("","debug",l,m.end,{},p)):"Z"==m.args.stateWhenDescheduled?e.push(new tracing.trace_model.Slice("","Zombie",l,m.end,{},p)):"X"==m.args.stateWhenDescheduled?e.push(new tracing.trace_model.Slice("","Exit Dead",l,m.end,{},p)):"x"==m.args.stateWhenDescheduled?e.push(new tracing.trace_model.Slice("","Task Dead",l,m.end,{},p)):"K"==m.args.stateWhenDescheduled?e.push(new tracing.trace_model.Slice("","Wakekill",l,m.end,{},p)):"W"==m.args.stateWhenDescheduled?e.push(new tracing.trace_model.Slice("",
+"Waking",l,m.end,{},p)):"D|K"==m.args.stateWhenDescheduled?q("Uninterruptible Sleep | WakeKill",l):"D|W"==m.args.stateWhenDescheduled?q("Uninterruptible Sleep | Waking",l):(e.push(new tracing.trace_model.Slice("","UNKNOWN",l,m.end,{},p)),this.model_.importErrors.push("Unrecognized sleep state: "+m.args.stateWhenDescheduled));e.push(new tracing.trace_model.Slice("","Running",d,n.start,{},n.duration))}a.cpuSlices=e}},this)},alignClocks:function(a){if(0==this.clockSyncRecords_.length){if(!a)return!0;
+this.abortImport();return!1}a=this.clockSyncRecords_[0];if(0==a.parentTS||a.parentTS==a.perfTS)return!0;a=a.parentTS-a.perfTS;for(var c in this.cpuStates_){for(var b=this.cpuStates_[c].cpu,e=0;e<b.slices.length;e++){var f=b.slices[e];f.start+=a;f.duration=f.duration}for(var d in b.counters)for(e=b.counters[d],f=0;f<e.timestamps.length;f++)e.timestamps[f]+=a}for(var g in this.kernelThreadStates_)this.kernelThreadStates_[g].thread.shiftTimestampsForward(a);return!0},abortImport:function(){if(this.pushedEventsToThreads)throw Error("Cannot abort, have alrady pushedCpuDataToThreads.");
+for(var a in this.cpuStates_)delete this.model_.kernel.cpus[a];for(var c in this.kernelThreadStates_){a=this.kernelThreadStates_[c].thread;var b=a.parent;delete b.threads[a.tid];delete this.model_.processes[b.pid]}this.model_.importErrors.push("Cannot import kernel trace without a clock sync.")},createParsers:function(){for(var a=tracing.importer.linux_perf.Parser.getSubtypeConstructors(),c=0;c<a.length;++c)this.parsers_.push(new a[c](this));this.registerEventHandler("tracing_mark_write:trace_event_clock_sync",
+b.prototype.traceClockSyncEvent.bind(this));this.registerEventHandler("tracing_mark_write",b.prototype.traceMarkingWriteEvent.bind(this));this.registerEventHandler("0:trace_event_clock_sync",b.prototype.traceClockSyncEvent.bind(this));this.registerEventHandler("0",b.prototype.traceMarkingWriteEvent.bind(this))},registerEventHandler:function(a,c){this.eventHandlers_[a]=c},markPidRunnable:function(a,c,b,e,f){this.wakeups_.push({ts:a,tid:c,fromTid:f})},importError:function(a){this.model_.importErrors.push("Line "+
+(this.lineNumberBase+this.lineNumber+1)+": "+a)},traceClockSyncEvent:function(a,c,b,e,f){a=/parent_ts=(\d+\.?\d*)/.exec(f.details);if(!a)return!1;this.clockSyncRecords_.push({perfTS:e,parentTS:1E3*a[1]});return!0},traceMarkingWriteEvent:function(a,c,b,e,f,d){var g=/^\s*(\w+):\s*(.*)$/.exec(f.details);if(g)f.subEventName=g[1],f.details=g[2];else if(g=f.details.substring(0,2),"B|"==g||"E"==g||"E|"==g||"C|"==g||"S|"==g||"F|"==g)f.subEventName="android";else return!1;a=a+":"+f.subEventName;g=this.eventHandlers_[a];
+return g?g(a,c,b,e,f,d):(this.importError("Unknown trace_marking_write event "+a),!0)},importCpuData:function(){var c=b._extractEventsFromSystraceHTML(this.events_,!0);c.ok?(this.lineNumberBase=c.events_begin_at_line,this.lines_=c.lines):(this.lineNumberBase=0,this.lines_=this.events_.split("\n"));c=null;for(this.lineNumber=0;this.lineNumber<this.lines_.length;++this.lineNumber){var e=this.lines_[this.lineNumber];if(0!=e.length&&!/^#/.test(e)){if(null==c&&(c=a(e),null==c)){this.importError("Cannot parse line: "+
+e);continue}var f=c(e);if(f){var d=parseInt(f.pid),g=parseInt(f.cpuNumber),h=1E3*parseFloat(f.timestamp),l=f.eventName,k=this.eventHandlers_[l];k?k(l,g,d,h,f)||this.importError("Malformed "+l+" event ("+e+")"):this.importError("Unknown event "+l+" ("+e+")")}else this.importError("Unrecognized line: "+e)}}}};tracing.TraceModel.registerImporter(b);return{LinuxPerfImporter:b,_LinuxPerfImporterTestExports:c}});"use strict";base.requireRawScript("../third_party/gl-matrix/src/gl-matrix/common.js");base.requireRawScript("../third_party/gl-matrix/src/gl-matrix/mat2d.js");
+base.requireRawScript("../third_party/gl-matrix/src/gl-matrix/mat4.js");base.requireRawScript("../third_party/gl-matrix/src/gl-matrix/vec2.js");base.requireRawScript("../third_party/gl-matrix/src/gl-matrix/vec3.js");base.requireRawScript("../third_party/gl-matrix/src/gl-matrix/vec4.js");
+base.exportTo("base",function(){var d=vec2.create(),b=vec2.create(),a=vec4.create();mat2d.create();vec2.createFromArray=function(a){if(2!=a.length)throw Error("Should be length 2");var b=vec2.create();vec2.set(b,a[0],a[1]);return b};vec2.createXY=function(a,b){var f=vec2.create();vec2.set(f,a,b);return f};vec2.toString=function(a){return"["+a[0]+", "+a[1]+"]"};vec2.addTwoScaledUnitVectors=function(a,e,f,g,h){vec2.scale(d,e,f);vec2.scale(b,g,h);vec2.add(a,d,b)};vec3.createXYZ=function(a,b,f){var d=
+vec3.create();vec3.set(d,a,b,f);return d};vec3.toString=function(a){return"vec3("+a[0]+", "+a[1]+", "+a[2]+")"};mat2d.translateXY=function(a,b,f){vec2.set(d,b,f);mat2d.translate(a,a,d)};mat2d.scaleXY=function(a,b,f){vec2.set(d,b,f);mat2d.scale(a,a,d)};vec4.unitize=function(a,b){a[0]=b[0]/b[3];a[1]=b[1]/b[3];a[2]=b[2]/b[3];a[3]=1;return a};vec2.copyFromVec4=function(c,b){vec4.unitize(a,b);vec2.copy(c,a)};return{}});"use strict";base.require("base.gl_matrix");
+base.exportTo("base",function(){function d(a,c,b,e){vec2.scale(h,c,e);vec2.scale(k,b,1-e);vec2.add(a,h,k);vec2.normalize(a,a);return a}function b(){this.p1=vec2.create();this.p2=vec2.create();this.p3=vec2.create();this.p4=vec2.create()}function a(a,c,b){return(a[0]-b[0])*(c[1]-b[1])-(c[0]-b[0])*(a[1]-b[1])}function c(c,b,e,f){var d=0>a(c,b,e);e=0>a(c,e,f);c=0>a(c,f,b);return d==e&&e==c}for(var e=[],f=0;8>f;f++)e[f]=vec2.create();var g=vec4.create();vec4.create();vec4.create();mat4.create();mat4.create();
+vec2.createXY(0,0);vec2.createXY(1,0);vec2.createXY(0,1);vec2.createXY(1,1);var h=vec2.create(),k=vec2.create();b.FromXYWH=function(a,c,e,f){var d=new b;vec2.set(d.p1,a,c);vec2.set(d.p2,a+e,c);vec2.set(d.p3,a+e,c+f);vec2.set(d.p4,a,c+f);return d};b.FromRect=function(a){return new b.FromXYWH(a.x,a.y,a.width,a.height)};b.From4Vecs=function(a,c,e,f){var d=new b;vec2.set(d.p1,a[0],a[1]);vec2.set(d.p2,c[0],c[1]);vec2.set(d.p3,e[0],e[1]);vec2.set(d.p4,f[0],f[1]);return d};b.From8Array=function(a){if(8!=
+a.length)throw Error("Array must be 8 long");var c=new b;c.p1[0]=a[0];c.p1[1]=a[1];c.p2[0]=a[2];c.p2[1]=a[3];c.p3[0]=a[4];c.p3[1]=a[5];c.p4[0]=a[6];c.p4[1]=a[7];return c};b.prototype={vecInside:function(a){return c(a,this.p1,this.p2,this.p3)||c(a,this.p1,this.p3,this.p4)},boundingRect:function(){var a=Math.min(this.p1[0],this.p2[0],this.p3[0],this.p4[0]),c=Math.min(this.p1[1],this.p2[1],this.p3[1],this.p4[1]),b=Math.max(this.p1[0],this.p2[0],this.p3[0],this.p4[0]),e=Math.max(this.p1[1],this.p2[1],
+this.p3[1],this.p4[1]);return new base.Rect.FromXYWH(a,c,b-a,e-c)},clone:function(){var a=new b;vec2.copy(a.p1,this.p1);vec2.copy(a.p2,this.p2);vec2.copy(a.p3,this.p3);vec2.copy(a.p4,this.p4);return a},scale:function(a){var c=new b;this.scaleFast(c,a);return c},scaleFast:function(a,c){vec2.copy(a.p1,this.p1,c);vec2.copy(a.p2,this.p2,c);vec2.copy(a.p3,this.p3,c);vec2.copy(a.p3,this.p3,c)},isRectangle:function(){var a=this.boundingRect();return a.x==this.p1[0]&&a.y==this.p1[1]&&a.width==this.p2[0]-
+this.p1[0]&&a.y==this.p2[1]&&a.width==this.p3[0]-this.p1[0]&&a.height==this.p3[1]-this.p2[1]&&a.x==this.p4[0]&&a.height==this.p4[1]-this.p2[1]},projectUnitRect:function(a){var c=new b;this.projectUnitRectFast(c,a);return c},projectUnitRectFast:function(a,c){var b=e[0],f=e[1],h=e[2],k=e[3],u,w,t,r;vec2.sub(b,this.p2,this.p1);u=vec2.length(b);vec2.scale(b,b,1/u);vec2.sub(f,this.p4,this.p1);w=vec2.length(f);vec2.scale(f,f,1/w);vec2.sub(h,this.p3,this.p2);t=vec2.length(h);vec2.scale(h,h,1/t);vec2.sub(k,
+this.p3,this.p4);r=vec2.length(k);vec2.scale(k,k,1/r);var v=e[0],x=e[1],y=e[2],z=e[3];d(v,b,k,c.y);d(z,b,k,1-c.bottom);d(x,f,h,c.x);d(y,f,h,1-c.right);vec2.addTwoScaledUnitVectors(g,v,u*c.x,x,w*c.y);vec2.add(a.p1,this.p1,g);vec2.addTwoScaledUnitVectors(g,v,u*-(1-c.right),y,t*c.y);vec2.add(a.p2,this.p2,g);vec2.addTwoScaledUnitVectors(g,z,r*-(1-c.right),y,t*-(1-c.bottom));vec2.add(a.p3,this.p3,g);vec2.addTwoScaledUnitVectors(g,z,r*c.left,x,w*-(1-c.bottom));vec2.add(a.p4,this.p4,g)},toString:function(){return"Quad("+
+vec2.toString(this.p1)+", "+vec2.toString(this.p2)+", "+vec2.toString(this.p3)+", "+vec2.toString(this.p4)+")"}};return{vecInTriangle2:c,Quad:b}});"use strict";base.require("tracing.trace_model.trace_model_event");
+base.exportTo("tracing.trace_model",function(){function d(a,c,b,e,d){tracing.trace_model.TraceModelEvent.apply(this,arguments);this.type=void 0}function b(a,c,b,k,l){d.apply(this,arguments);this.type=e.GLOBAL}function a(a,c,b,k,l){d.apply(this,arguments);this.type=e.PROCESS}function c(a,c,b,k,l){d.apply(this,arguments);this.type=e.THREAD}var e={GLOBAL:1,PROCESS:2,THREAD:3};d.prototype={__proto__:tracing.trace_model.TraceModelEvent.prototype};b.prototype={__proto__:d.prototype};a.prototype={__proto__:d.prototype};
+c.prototype={__proto__:d.prototype};return{GlobalInstantEvent:b,ProcessInstantEvent:a,ThreadInstantEvent:c,InstantEventType:e}});"use strict";base.require("base.quad");base.require("tracing.trace_model");base.require("tracing.color_scheme");base.require("tracing.trace_model.instant_event");base.require("tracing.trace_model.counter_series");
+base.exportTo("tracing.importer",function(){function d(a){if(!(a instanceof Object)){if(void 0===a||null===a)return a;if("string"==typeof a)return a.substring();if("boolean"==typeof a||"number"==typeof a)return a;throw Error("Unrecognized: "+typeof a);}if(a instanceof Array){for(var c=Array(a.length),b=0;b<a.length;b++)c[b]=d(a[b]);return c}if(a.__proto__!=Object.prototype)throw Error("Can only clone simple types");c={};for(b in a)c[b]=d(a[b]);return c}function b(a,c){this.importPriority=1;this.model_=
+a;this.systemTraceEvents_=this.events_=void 0;this.eventsWereFromString_=!1;this.allAsyncEvents_=[];this.allObjectEvents_=[];"string"===typeof c||c instanceof String?("["===c[0]&&(c=c.replace(/[\r|\n]*$/,"").replace(/\s*,\s*$/,""),"]"!==c[c.length-1]&&(c+="]")),this.events_=JSON.parse(c),this.eventsWereFromString_=!0):this.events_=c;if(this.events_.traceEvents){var b=this.events_;this.events_=this.events_.traceEvents;this.systemTraceEvents_=b.systemTraceEvents;for(var f in b)"traceEvents"!==f&&"systemTraceEvents"!==
+f&&this.model_.metadata.push({name:f,value:b[f]})}}b.canImport=function(a){return"string"===typeof a||a instanceof String?"{"==a[0]||"["==a[0]:a instanceof Array&&a.length&&a[0].ph?!0:a.traceEvents?a.traceEvents instanceof Array&&a.traceEvents[0].ph:!1};b.prototype={__proto__:Object.prototype,extractSubtrace:function(){var a=this.systemTraceEvents_;this.systemTraceEvents_=void 0;return a},deepCopyIfNeeded_:function(a){return this.eventsWereFromString_?a:d(a)},processAsyncEvent:function(a){var c=this.model_.getOrCreateProcess(a.pid).getOrCreateThread(a.tid);
+this.allAsyncEvents_.push({event:a,thread:c})},processCounterEvent:function(a){var c;c=void 0!==a.id?a.name+"["+a.id+"]":a.name;c=this.model_.getOrCreateProcess(a.pid).getOrCreateCounter(a.cat,c);if(0===c.numSeries){for(var b in a.args)c.addSeries(new tracing.trace_model.CounterSeries(b,tracing.getStringColorId(c.name+"."+b)));if(0===c.numSeries){this.model_.importErrors.push("Expected counter "+a.name+" to have at least one argument to use as a value.");delete c.parent.counters[c.name];return}}var f=
+a.ts/1E3;c.series.forEach(function(c){c.addSample(f,a.args[c.name]?a.args[c.name]:0)})},processObjectEvent:function(a){var c=this.model_.getOrCreateProcess(a.pid).getOrCreateThread(a.tid);this.allObjectEvents_.push({event:a,thread:c})},processDurationEvent:function(a){var c=this.model_.getOrCreateProcess(a.pid).getOrCreateThread(a.tid);if(c.sliceGroup.isTimestampValidForBeginOrEnd(a.ts/1E3))if("B"==a.ph)c.sliceGroup.beginSlice(a.cat,a.name,a.ts/1E3,this.deepCopyIfNeeded_(a.args));else if(c.sliceGroup.openSliceCount){var c=
+c.sliceGroup.endSlice(a.ts/1E3),b;for(b in a.args)void 0!==c.args[b]&&this.model_.importErrors.push("Both the B and E phases of "+c.name+"provided values for argument "+b+". The value of the E phase event will be used."),c.args[b]=this.deepCopyIfNeeded_(a.args[b])}else this.model_.importErrors.push("E phase event without a matching B phase event.");else this.model_.importErrors.push("Timestamps are moving backward.")},processMetadataEvent:function(a){if("process_name"==a.name){var c=this.model_.getOrCreateProcess(a.pid);
+c.name=a.args.name}else"process_labels"==a.name?(c=this.model_.getOrCreateProcess(a.pid),c.labels.push.apply(c.labels,a.args.labels.split(","))):"process_sort_index"==a.name?(c=this.model_.getOrCreateProcess(a.pid),c.sortIndex=a.args.sort_index):"thread_name"==a.name?(c=this.model_.getOrCreateProcess(a.pid).getOrCreateThread(a.tid),c.name=a.args.name):"thread_sort_index"==a.name?(c=this.model_.getOrCreateProcess(a.pid).getOrCreateThread(a.tid),c.sortIndex=a.args.sort_index):this.model_.importErrors.push("Unrecognized metadata name: "+
+a.name)},processInstantEvent:function(a){var c;switch(a.s){case "g":c=tracing.trace_model.GlobalInstantEvent;break;case "p":c=tracing.trace_model.ProcessInstantEvent;break;default:c=tracing.trace_model.ThreadInstantEvent}var b=tracing.getStringColorId(a.name);c=new c(a.cat,a.name,b,a.ts/1E3,this.deepCopyIfNeeded_(a.args));switch(c.type){case tracing.trace_model.InstantEventType.GLOBAL:this.model_.pushInstantEvent(c);break;case tracing.trace_model.InstantEventType.PROCESS:this.model_.getOrCreateProcess(a.pid).pushInstantEvent(c);
+break;case tracing.trace_model.InstantEventType.THREAD:this.model_.getOrCreateProcess(a.pid).getOrCreateThread(a.tid).sliceGroup.pushInstantEvent(c);break;default:throw Error("Unknown instant event type: "+a.s);}},processSampleEvent:function(a){this.model_.getOrCreateProcess(a.pid).getOrCreateThread(a.tid).addSample(a.cat,a.name,a.ts/1E3,this.deepCopyIfNeeded_(a.args))},importEvents:function(){for(var a=this.events_,c=0;c<a.length;c++){var b=a[c];"B"===b.ph||"E"===b.ph?this.processDurationEvent(b):
+"S"===b.ph||"F"===b.ph||"T"===b.ph?this.processAsyncEvent(b):"I"==b.ph||"i"==b.ph?this.processInstantEvent(b):"P"==b.ph?this.processSampleEvent(b):"C"==b.ph?this.processCounterEvent(b):"M"==b.ph?this.processMetadataEvent(b):"N"===b.ph||"D"===b.ph||"O"===b.ph?this.processObjectEvent(b):"s"!==b.ph&&"t"!==b.ph&&"f"!==b.ph&&this.model_.importErrors.push("Unrecognized event phase: "+b.ph+" ("+b.name+")")}},finalizeImport:function(){this.createAsyncSlices_();this.createExplicitObjects_();this.createImplicitObjects_()},
+joinRefs:function(){this.joinObjectRefs_()},createAsyncSlices_:function(){if(0!=this.allAsyncEvents_.length){this.allAsyncEvents_.sort(function(a,c){return a.event.ts-c.event.ts});for(var a={},c=this.allAsyncEvents_,b=0;b<c.length;b++){var f=c[b],d=f.event,h=d.name;if(void 0===h)this.model_.importErrors.push("Async events (ph: S, T or F) require an name parameter.");else{var k=d.id;if(void 0===k)this.model_.importErrors.push("Async events (ph: S, T or F) require an id parameter.");else if("S"==d.ph)void 0===
+a[h]&&(a[h]={}),a[h][k]?this.model_.importErrors.push("At "+d.ts+", a slice of the same id "+k+" was alrady open."):(a[h][k]=[],a[h][k].push(f));else if(void 0===a[h])this.model_.importErrors.push("At "+d.ts+", no slice named "+h+" was open.");else if(void 0===a[h][k])this.model_.importErrors.push("At "+d.ts+", no slice named "+h+" with id="+k+" was open.");else{var l=a[h][k];l.push(f);if("F"==d.ph){var m=new tracing.trace_model.AsyncSlice(l[0].event.cat,h,tracing.getStringColorId(h),l[0].event.ts/
+1E3);m.duration=d.ts/1E3-l[0].event.ts/1E3;m.startThread=l[0].thread;m.endThread=f.thread;m.id=k;m.args=this.deepCopyIfNeeded_(l[0].event.args);m.subSlices=[];for(f=1;f<l.length;++f){var n=h;"T"==l[f-1].event.ph&&(n=h+":"+l[f-1].event.args.step);n=new tracing.trace_model.AsyncSlice(l[0].event.cat,n,tracing.getStringColorId(h+f),l[f-1].event.ts/1E3);n.duration=l[f].event.ts/1E3-l[f-1].event.ts/1E3;n.startThread=l[f-1].thread;n.endThread=l[f].thread;n.id=k;n.args=this.deepCopyIfNeeded_(l[f-1].event.args);
+m.subSlices.push(n)}var l=m.subSlices[m.subSlices.length-1],p;for(p in d.args)l.args[p]=this.deepCopyIfNeeded_(d.args[p]);m.startThread.asyncSliceGroup.push(m);delete a[h][k]}}}}}},createExplicitObjects_:function(){function a(a){var c=a.event;a=a.thread;void 0===c.name&&this.model_.importErrors.push("While processing "+JSON.stringify(c)+": Object events require an name parameter.");void 0===c.id&&this.model_.importErrors.push("While processing "+JSON.stringify(c)+": Object events require an id parameter.");
+a=a.parent;var b=c.ts/1E3,e;if("N"==c.ph)try{e=a.objects.idWasCreated(c.id,c.cat,c.name,b)}catch(f){this.model_.importErrors.push("While processing create of "+c.id+" at ts="+b+": "+f);return}else if("O"==c.ph){if(void 0===c.args.snapshot){this.model_.importErrors.push("While processing "+c.id+" at ts="+b+": Snapshots must have args: {snapshot: ...}");return}var d;try{d=a.objects.addSnapshot(c.id,c.cat,c.name,b,this.deepCopyIfNeeded_(c.args.snapshot))}catch(g){this.model_.importErrors.push("While processing snapshot of "+
+c.id+" at ts="+b+": "+g);return}e=d.objectInstance}else if("D"==c.ph)try{e=a.objects.idWasDeleted(c.id,c.cat,c.name,b)}catch(s){this.model_.importErrors.push("While processing delete of "+c.id+" at ts="+b+": "+s);return}e&&(e.colorId=tracing.getStringColorId(e.typeName))}if(0!=this.allObjectEvents_.length){this.allObjectEvents_.sort(function(a,c){return a.event.ts-c.event.ts});for(var c=this.allObjectEvents_,b=0;b<c.length;b++){var f=c[b];try{a.call(this,f)}catch(d){this.model_.importErrors.push(d.message)}}}},
+createImplicitObjects_:function(){base.iterItems(this.model_.processes,function(a,c){this.createImplicitObjectsForProcess_(c)},this)},createImplicitObjectsForProcess_:function(a){function c(c,b,e,d){if(e&&void 0!==e.id&&!(e instanceof tracing.trace_model.ObjectSnapshot)){var l=e.id,m=/(.+)\/(.+)/.exec(l);if(!m)throw Error("Implicit snapshots must have names.");delete e.id;var n=m[1],m=m[2],p;try{p=a.objects.addSnapshot(m,d.objectInstance.category,n,d.ts,e)}catch(q){this.model_.importErrors.push("While processing implicit snapshot of "+
+l+" at ts="+d.ts+": "+q);return}p.objectInstance.hasImplicitSnapshots=!0;p.containingSnapshot=d;c[b]=p;if(!(p instanceof tracing.trace_model.ObjectSnapshot))throw Error("Created object must be instanceof snapshot");return p.args}}function b(a,c,d,k){if(a instanceof Object)if(a instanceof Array)for(var l=0;l<a.length;l++){var m=c.call(k,a,l,a[l],d);m?b(m,c,d,k):b(a[l],c,d,k)}else for(l in a)(m=c.call(k,a,l,a[l],d))?b(m,c,d,k):b(a[l],c,d,k)}a.objects.iterObjectInstances(function(a){a.snapshots.forEach(function(a){if(void 0!==
+a.args.id)throw Error("args cannot have an id field inside it");b(a.args,c,a,this)},this)},this)},joinObjectRefs_:function(){base.iterItems(this.model_.processes,function(a,c){this.joinObjectRefsForProcess_(c)},this)},joinObjectRefsForProcess_:function(a){var c=[];base.iterItems(a.threads,function(b,f){f.asyncSliceGroup.slices.forEach(function(b){this.searchItemForIDRefs_(c,a.objects,"start",b)},this);f.sliceGroup.slices.forEach(function(b){this.searchItemForIDRefs_(c,a.objects,"start",b)},this)},
+this);a.objects.iterObjectInstances(function(b){b.snapshots.forEach(function(b){this.searchItemForIDRefs_(c,a.objects,"ts",b)},this)},this);c.forEach(function(a){a.object[a.field]=a.value})},searchItemForIDRefs_:function(a,c,b,f){function d(g,h,m){void 0!==m&&(m.id_ref||m.idRef)&&(m=c.getSnapshotAt(m.id_ref||m.idRef,f[b]))&&a.push({object:g,field:h,value:m})}function h(a){if(a instanceof Object&&!(a instanceof tracing.trace_model.ObjectSnapshot||a instanceof Float32Array||a instanceof base.Quad))if(a instanceof
+Array)for(var c=0;c<a.length;c++)d(a,c,a[c]),h(a[c]);else for(c in a){var b=a[c];d(a,c,b);h(b)}}if(!f.args)throw Error("");h(f.args)}};tracing.TraceModel.registerImporter(b);return{TraceEventImporter:b}});"use strict";
+base.exportTo("tracing.importer.v8",function(){function d(){}d.prototype.root_=null;d.prototype.isEmpty=function(){return!this.root_};d.prototype.insert=function(b,a){if(this.isEmpty())this.root_=new d.Node(b,a);else if(this.splay_(b),this.root_.key!=b){var c=new d.Node(b,a);b>this.root_.key?(c.left=this.root_,c.right=this.root_.right,this.root_.right=null):(c.right=this.root_,c.left=this.root_.left,this.root_.left=null);this.root_=c}};d.prototype.remove=function(b){if(this.isEmpty())throw Error("Key not found: "+
+b);this.splay_(b);if(this.root_.key!=b)throw Error("Key not found: "+b);var a=this.root_;if(this.root_.left){var c=this.root_.right;this.root_=this.root_.left;this.splay_(b);this.root_.right=c}else this.root_=this.root_.right;return a};d.prototype.find=function(b){if(this.isEmpty())return null;this.splay_(b);return this.root_.key==b?this.root_:null};d.prototype.findMin=function(){if(this.isEmpty())return null;for(var b=this.root_;b.left;)b=b.left;return b};d.prototype.findMax=function(b){if(this.isEmpty())return null;
+for(b=b||this.root_;b.right;)b=b.right;return b};d.prototype.findGreatestLessThan=function(b){if(this.isEmpty())return null;this.splay_(b);return this.root_.key<=b?this.root_:this.root_.left?this.findMax(this.root_.left):null};d.prototype.exportKeysAndValues=function(){var b=[];this.traverse_(function(a){b.push([a.key,a.value])});return b};d.prototype.exportValues=function(){var b=[];this.traverse_(function(a){b.push(a.value)});return b};d.prototype.splay_=function(b){if(!this.isEmpty()){var a,c,
+e;a=c=e=new d.Node(null,null);for(var f=this.root_;;)if(b<f.key){if(!f.left)break;if(b<f.left.key){var g=f.left;f.left=g.right;g.right=f;f=g;if(!f.left)break}e=e.left=f;f=f.left}else if(b>f.key){if(!f.right)break;if(b>f.right.key&&(g=f.right,f.right=g.left,g.left=f,f=g,!f.right))break;c=c.right=f;f=f.right}else break;c.right=f.left;e.left=f.right;f.left=a.right;f.right=a.left;this.root_=f}};d.prototype.traverse_=function(b){for(var a=[this.root_];0<a.length;){var c=a.shift();null!=c&&(b(c),a.push(c.left),
+a.push(c.right))}};d.Node=function(b,a){this.key=b;this.value=a};d.Node.prototype.left=null;d.Node.prototype.right=null;return{SplayTree:d}});"use strict";base.require("tracing.importer.v8.splaytree");
+base.exportTo("tracing.importer.v8",function(){function d(){this.dynamics_=new tracing.importer.v8.SplayTree;this.dynamicsNameGen_=new tracing.importer.v8.CodeMap.NameGenerator;this.statics_=new tracing.importer.v8.SplayTree;this.libraries_=new tracing.importer.v8.SplayTree;this.pages_=[]}d.PAGE_ALIGNMENT=12;d.PAGE_SIZE=1<<d.PAGE_ALIGNMENT;d.prototype.addCode=function(b,a){this.deleteAllCoveredNodes_(this.dynamics_,b,b+a.size);this.dynamics_.insert(b,a)};d.prototype.moveCode=function(b,a){var c=this.dynamics_.remove(b);
+this.deleteAllCoveredNodes_(this.dynamics_,a,a+c.value.size);this.dynamics_.insert(a,c.value)};d.prototype.deleteCode=function(b){this.dynamics_.remove(b)};d.prototype.addLibrary=function(b,a){this.markPages_(b,b+a.size);this.libraries_.insert(b,a)};d.prototype.addStaticCode=function(b,a){this.statics_.insert(b,a)};d.prototype.markPages_=function(b,a){for(var c=b;c<=a;c+=d.PAGE_SIZE)this.pages_[c>>>d.PAGE_ALIGNMENT]=1};d.prototype.deleteAllCoveredNodes_=function(b,a,c){for(var e=[],f=c-1;f>=a;){var d=
+b.findGreatestLessThan(f);if(!d)break;f=d.key;d=f+d.value.size;f<c&&a<d&&e.push(f);--f}a=0;for(c=e.length;a<c;++a)b.remove(e[a])};d.prototype.isAddressBelongsTo_=function(b,a){return b>=a.key&&b<a.key+a.value.size};d.prototype.findInTree_=function(b,a){var c=b.findGreatestLessThan(a);return c&&this.isAddressBelongsTo_(a,c)?c.value:null};d.prototype.findEntry=function(b){if(b>>>d.PAGE_ALIGNMENT in this.pages_)return this.findInTree_(this.statics_,b)||this.findInTree_(this.libraries_,b);var a=this.dynamics_.findMin(),
+c=this.dynamics_.findMax();if(null!=c&&b<c.key+c.value.size&&b>=a.key){b=this.findInTree_(this.dynamics_,b);if(null==b)return null;b.nameUpdated_||(b.name=this.dynamicsNameGen_.getName(b.name),b.nameUpdated_=!0);return b}return null};d.prototype.findDynamicEntryByStartAddress=function(b){return(b=this.dynamics_.find(b))?b.value:null};d.prototype.getAllDynamicEntries=function(){return this.dynamics_.exportValues()};d.prototype.getAllDynamicEntriesWithAddresses=function(){return this.dynamics_.exportKeysAndValues()};
+d.prototype.getAllStaticEntries=function(){return this.statics_.exportValues()};d.prototype.getAllLibrariesEntries=function(){return this.libraries_.exportValues()};d.CodeEntry=function(b,a){this.size=b;this.name=a||"";this.nameUpdated_=!1};d.CodeEntry.prototype.getName=function(){return this.name};d.CodeEntry.prototype.toString=function(){return this.name+": "+this.size.toString(16)};d.NameGenerator=function(){this.knownNames_={}};d.NameGenerator.prototype.getName=function(b){if(!(b in this.knownNames_))return this.knownNames_[b]=
+0,b;var a=++this.knownNames_[b];return b+" {"+a+"}"};return{CodeMap:d}});"use strict";
+base.exportTo("tracing.importer.v8",function(){function d(){}function b(a){this.dispatchTable_=a;this.lineNum_=0;this.csvParser_=new d}d.CSV_FIELD_RE_=/^"((?:[^"]|"")*)"|([^,]*)/;d.DOUBLE_QUOTE_RE_=/""/g;d.prototype.parseLine=function(a){var c=d.CSV_FIELD_RE_,b=d.DOUBLE_QUOTE_RE_,f=0,g=a.length,h=[];if(0<g){do{var k=c.exec(a.substr(f));"string"===typeof k[1]?(k=k[1],f+=k.length+3,h.push(k.replace(b,'"'))):(k=k[2],f+=k.length+1,h.push(k))}while(f<=g)}return h};b.prototype.printError=function(a){};
+b.prototype.processLogChunk=function(a){this.processLog_(a.split("\n"))};b.prototype.processLogLine=function(a){this.processLog_([a])};b.prototype.processStack=function(a,c,b){c=c?[a,c]:[a];for(var f=0,d=b.length;f<d;++f){var h=b[f],k=h.charAt(0);"+"==k||"-"==k?(a+=parseInt(h,16),c.push(a)):"o"!=k&&c.push(parseInt(h,16))}return c};b.prototype.skipDispatch=function(a){return!1};b.prototype.dispatchLogRow_=function(a){var c=a[0];if(c in this.dispatchTable_&&(c=this.dispatchTable_[c],null!==c&&!this.skipDispatch(c))){for(var b=
+[],f=0;f<c.parsers.length;++f){var d=c.parsers[f];if(null===d)b.push(a[1+f]);else if("function"==typeof d)b.push(d(a[1+f]));else{b.push(a.slice(1+f));break}}c.processor.apply(this,b)}};b.prototype.processLog_=function(a){for(var c=0,b=a.length;c<b;++c,++this.lineNum_){var f=a[c];if(f)try{var d=this.csvParser_.parseLine(f);this.dispatchLogRow_(d)}catch(h){this.printError("line "+(this.lineNum_+1)+": "+(h.message||h))}}};return{LogReader:b}});"use strict";base.require("tracing.trace_model");base.require("tracing.trace_model.slice");
+base.require("tracing.color_scheme");base.require("tracing.importer.v8.log_reader");base.require("tracing.importer.v8.codemap");
+base.exportTo("tracing.importer",function(){function d(a,b){this.importPriority=3;this.model_=a;this.logData_=b;this.code_map_=new tracing.importer.v8.CodeMap;this.v8_samples_thread_=this.v8_stack_thread_=this.v8_timer_thread_=void 0}var b=["/d8","/libv8.so"],a={"V8.Execute":{pause:!1,no_execution:!1},"V8.External":{pause:!1,no_execution:!0},"V8.CompileFullCode":{pause:!0,no_execution:!0},"V8.RecompileSynchronous":{pause:!0,no_execution:!0},"V8.RecompileParallel":{pause:!1,no_execution:!1},"V8.CompileEval":{pause:!0,
+no_execution:!0},"V8.Parse":{pause:!0,no_execution:!0},"V8.PreParse":{pause:!0,no_execution:!0},"V8.ParseLazy":{pause:!0,no_execution:!0},"V8.GCScavenger":{pause:!0,no_execution:!0},"V8.GCCompactor":{pause:!0,no_execution:!0},"V8.GCContext":{pause:!0,no_execution:!0}};d.canImport=function(a){return"string"===typeof a||a instanceof String?"timer-event,"==a.substring(0,12)||"tick,"==a.substring(0,5)||"shared-library,"==a.substring(0,15)||"profiler,"==a.substring(0,9):!1};d.prototype={__proto__:Object.prototype,
+extractSubtrace:function(){},processTimerEvent_:function(c,b,f){var d=a[c];if(void 0!==d){b/=1E3;f/=1E3;var h=tracing.getStringColorId(c);c=new tracing.trace_model.Slice("v8",c,h,b,d,f);this.v8_timer_thread_.sliceGroup.pushSlice(c)}},processTimerEventStart_:function(c,b){var f=a[c];void 0!==f&&this.v8_timer_thread_.sliceGroup.beginSlice("v8",c,b/1E3,f)},processTimerEventEnd_:function(a,b){this.v8_timer_thread_.sliceGroup.endSlice(b/1E3)},processCodeCreateEvent_:function(a,b,f,d,h){a=new tracing.importer.v8.CodeMap.CodeEntry(d,
+h);a.kind=b;this.code_map_.addCode(f,a)},processCodeMoveEvent_:function(a,b){this.code_map_.moveCode(a,b)},processCodeDeleteEvent_:function(a){this.code_map_.deleteCode(a)},processSharedLibrary_:function(a,e,f){f=new tracing.importer.v8.CodeMap.CodeEntry(f-e,a);f.kind=-3;for(var d=0;d<b.length;d++){var h=b[d];if(0<=a.indexOf(h,a.length-h.length)){f.kind=-1;break}}this.code_map_.addLibrary(e,f)},findCodeKind_:function(a){for(name in CodeKinds)if(0<=CodeKinds[name].kinds.indexOf(a))return CodeKinds[name]},
+nameForCodeEntry_:function(a){return a?a.name:"UnknownCode"},processTickEvent_:function(a,b,f,d,h,k,l){b=this.code_map_.findEntry(a);b=this.nameForCodeEntry_(b);f/=1E3;this.v8_samples_thread_.addSample("v8",b,f);if(l&&l.length)for(a=0;8>a&&l[a];a++)b=this.code_map_.findEntry(l[a]),b=this.nameForCodeEntry_(b),d=tracing.getStringColorId(b),b=new tracing.trace_model.Slice("v8",b,d,f,{},0),this.v8_stack_thread_.sliceGroup.pushSlice(b)},processDistortion_:function(a){distortion_per_entry=a/1E6},processPlotRange_:function(a,
+b){xrange_start_override=a;xrange_end_override=b},importEvents:function(){var a=new tracing.importer.v8.LogReader({"timer-event":{parsers:[null,parseInt,parseInt],processor:this.processTimerEvent_.bind(this)},"shared-library":{parsers:[null,parseInt,parseInt],processor:this.processSharedLibrary_.bind(this)},"timer-event-start":{parsers:[null,parseInt],processor:this.processTimerEventStart_.bind(this)},"timer-event-end":{parsers:[null,parseInt],processor:this.processTimerEventEnd_.bind(this)},"code-creation":{parsers:[null,
+parseInt,parseInt,parseInt,null],processor:this.processCodeCreateEvent_.bind(this)},"code-move":{parsers:[parseInt,parseInt],processor:this.processCodeMoveEvent_.bind(this)},"code-delete":{parsers:[parseInt],processor:this.processCodeDeleteEvent_.bind(this)},tick:{parsers:[parseInt,parseInt,parseInt,null,null,parseInt,"var-args"],processor:this.processTickEvent_.bind(this)},distortion:{parsers:[parseInt],processor:this.processDistortion_.bind(this)},"plot-range":{parsers:[parseInt,parseInt],processor:this.processPlotRange_.bind(this)}});
+this.v8_timer_thread_=this.model_.getOrCreateProcess(-32).getOrCreateThread(1);this.v8_timer_thread_.name="V8 Timers";this.v8_stack_thread_=this.model_.getOrCreateProcess(-32).getOrCreateThread(2);this.v8_stack_thread_.name="V8 JavaScript";this.v8_samples_thread_=this.model_.getOrCreateProcess(-32).getOrCreateThread(3);this.v8_samples_thread_.name="V8 PC";for(var b=this.logData_.split("\n"),f=0;f<b.length;f++)a.processLogLine(b[f])},finalizeImport:function(){},joinRefs:function(){}};tracing.TraceModel.registerImporter(d);
+return{V8LogImporter:d}});"use strict";base.require("tracing.importer.linux_perf_importer");base.require("tracing.importer.trace_event_importer");base.require("tracing.importer.v8_log_importer");"use strict";base.exportTo("tracing.analysis",function(){return{tsRound:function(d){return Math.round(1E3*d)/1E3}}});"use strict";base.require("base.events");base.require("base.guid");base.require("base.range");
+base.exportTo("tracing",function(){function d(a,c){this.track=a;this.slice=c}function b(a,c,b){this.track=a;this.counter=c;this.sampleIndex=b}function a(a,c){this.track=a;this.objectSnapshot=c}function c(a,c){this.track=a;this.objectInstance=c}function e(a){this.bounds_dirty_=!0;this.bounds_=new base.Range;this.length_=0;this.guid_=base.GUID.allocate();a&&this.pushHits(a)}d.prototype={get modelObject(){return this.slice},get selected(){return this.slice.selected},set selected(a){this.slice.selected=
+a},addBoundsToRange:function(a){a.addValue(this.slice.start);a.addValue(this.slice.end)}};b.prototype={get modelObject(){return this.sampleIndex},get selected(){return 1==this.track.selectedSamples[this.sampleIndex]},set selected(a){this.track.selectedSamples[this.sampleIndex]=a?!0:!1},addBoundsToRange:function(a){this.track.timestamps&&a.addValue(this.track.timestamps[this.sampleIndex])}};a.prototype={get modelObject(){return this.objectSnapshot},get selected(){return this.objectSnapshot.selected},
+set selected(a){this.objectSnapshot.selected=a},addBoundsToRange:function(a){a.addValue(this.objectSnapshot.ts)}};c.prototype={get modelObject(){return this.objectInstance},get selected(){return this.objectInstance.selected},set selected(a){this.objectInstance.selected=a},addBoundsToRange:function(a){a.addRange(this.objectInstance.bounds)}};var f=[{constructor:d,name:"slice",pluralName:"slices"},{constructor:b,name:"counterSample",pluralName:"counterSamples"},{constructor:a,name:"objectSnapshot",
+pluralName:"objectSnapshots"},{constructor:c,name:"objectInstance",pluralName:"objectInstances"}];e.prototype={__proto__:Object.prototype,get bounds(){if(this.bounds_dirty_){this.bounds_.reset();for(var a=0;a<this.length_;a++)this[a].addBoundsToRange(this.bounds_);this.bounds_dirty_=!1}return this.bounds_},get duration(){return this.bounds_.isEmpty?0:this.bounds_.max-this.bounds_.min},get length(){return this.length_},get guid(){return this.guid_},clear:function(){for(var a=0;a<this.length_;++a)delete this[a];
+this.length_=0;this.bounds_dirty_=!0},pushHit:function(a){this.push_(a)},pushHits:function(a){for(var c=0;c<a.length;c++)this.pushHit(a[c])},push_:function(a){this[this.length_++]=a;this.bounds_dirty_=!0;return a},addSlice:function(a,c){return this.push_(new d(a,c))},addCounterSample:function(a,c,e){return this.push_(new b(a,c,e))},addObjectSnapshot:function(c,b){return this.push_(new a(c,b))},addObjectInstance:function(a,b){return this.push_(new c(a,b))},addSelection:function(a){for(var c=0;c<a.length;c++)this.push_(a[c])},
+subSelection:function(a,c){c=c||1;var b=new e;b.bounds_dirty_=!0;if(0>a||a+c>this.length_)throw Error("Index out of bounds");for(var f=a;f<a+c;f++)b.push_(this[f]);return b},getCounterSampleHitsAsSelection:function(){var a=new e;this.enumHitsOfType(b,a.push_.bind(a));return a},getSliceHitsAsSelection:function(){var a=new e;this.enumHitsOfType(d,a.push_.bind(a));return a},getHitsOrganizedByType:function(){var a={};f.forEach(function(c){a[c.pluralName]=new e});for(var c=0;c<this.length_;c++){var b=
+this[c];f.forEach(function(c){b instanceof c.constructor&&a[c.pluralName].push_(b)})}return a},enumHitsOfType:function(a,c){for(var b=0;b<this.length_;b++)this[b]instanceof a&&c(this[b])},getNumSliceHits:function(){var a=0;this.enumHitsOfType(d,function(c){a++});return a},getNumCounterHits:function(){var a=0;this.enumHitsOfType(b,function(c){a++});return a},getNumObjectSnapshotHits:function(){var c=0;this.enumHitsOfType(a,function(a){c++});return c},getNumObjectInstanceHits:function(){var a=0;this.enumHitsOfType(c,
+function(c){a++});return a},map:function(a){for(var c=0;c<this.length_;c++)a(this[c])},getShiftedSelection:function(a){for(var c=new e,b=0;b<this.length_;b++){var f=this[b];f.track.addItemNearToProvidedHitToSelection(f,a,c)}return 0==c.length?void 0:c}};return{SelectionSliceHit:d,SelectionCounterSampleHit:b,SelectionObjectSnapshotHit:a,SelectionObjectInstanceHit:c,Selection:e,createSelectionFromObjectAndView:function(a,c){var b=new e;if(a instanceof tracing.trace_model.Slice)b.addSlice(void 0,a);
+else if(a instanceof tracing.trace_model.ObjectSnapshot)b.addObjectSnapshot(void 0,a);else if(a instanceof tracing.trace_model.ObjectInstance)b.addObjectInstance(void 0,a);else throw Error("Unrecognized selection type");return b}}});"use strict";
+base.exportTo("ui",function(){return{decorate:function(d,b){var a;a="string"==typeof d?base.doc.querySelectorAll(d):[d];for(var c=0,e;e=a[c];c++)e instanceof b||b.decorate(e)},define:function(d,b){function a(){if(b&&a.prototype.__proto__!=b.prototype)throw Error(d+" prototye's __proto__ field is messed up. It MUST be the prototype of "+b.tagName);var c=d;if(b)for(var e=b;e&&e.tagName;)c=e.tagName,e=e.parentConstructor;c=base.doc.createElement(c);a.decorate.call(this,c,arguments);return c}if("function"==
+typeof d)throw Error("Passing functions as tagName is deprecated. Please use (tagName, opt_parentConstructor) to subclass");d=d.toLowerCase();if(b&&!b.tagName)throw Error("opt_parentConstructor was not created by ui.define");a.decorate=function(c,b){c.__proto__=a.prototype;c.decorate.apply(c,b)};a.tagName=d;a.parentConstructor=b?b:void 0;a.toString=function(){return a.parentConstructor?a.parentConstructor.toString()+"::"+a.tagName:a.tagName};return a},elementIsChildOf:function(d,b){if(d==b)return!1;
+for(var a=d;a.parentNode;){if(a==b)return!0;a=a.parentNode}return!1}}});"use strict";base.requireStylesheet("tracing.analysis.analysis_link");base.require("base.events");base.require("tracing.selection");base.require("tracing.analysis.util");base.require("ui");
+base.exportTo("tracing.analysis",function(){var d=tracing.analysis.tsRound,b=base.Event.bind(void 0,"requestSelectionChange",!0,!1),a=ui.define("a");a.prototype={__proto__:HTMLAnchorElement.prototype,decorate:function(){this.classList.add("analysis-link");this.selectionGenerator;this.addEventListener("click",this.onClicked_.bind(this))},onClicked_:function(){var a=new b;a.selection=this.selectionGenerator();this.dispatchEvent(a)}};var c=ui.define("object-snapshot-link",a);c.prototype={__proto__:a.prototype,
+decorate:function(){a.prototype.decorate.apply(this)},set objectSnapshot(a){this.textContent=a.objectInstance.typeName+" "+a.objectInstance.id+" @ "+d(a.ts)+" ms";this.selectionGenerator=function(){return tracing.createSelectionFromObjectAndView(a,this)}.bind(this)}};var e=ui.define("object-instance-link",a);e.prototype={__proto__:a.prototype,decorate:function(){a.prototype.decorate.apply(this)},set objectInstance(a){this.textContent=a.typeName+" "+a.id;this.selectionGenerator=function(){return tracing.createSelectionFromObjectAndView(a,
+this)}.bind(this)}};return{RequestSelectionChangeEvent:b,AnalysisLink:a,ObjectSnapshotLink:c,ObjectInstanceLink:e}});"use strict";base.requireStylesheet("tracing.analysis.generic_object_view");base.require("base.utils");base.require("tracing.analysis.analysis_link");base.require("ui");
+base.exportTo("tracing.analysis",function(){var d=ui.define("x-generic-object-view");d.prototype={__proto__:HTMLUnknownElement.prototype,decorate:function(){this.object_=void 0},get object(){return this.object_},set object(b){this.object_=b;this.updateContents_()},updateContents_:function(){this.textContent="";this.appendElementsForType_("",this.object_,0,0,5,"")},appendElementsForType_:function(b,a,c,e,f,d){e>f?this.appendSimpleText_(b,c,"<recursion limit reached>",d):void 0===a?this.appendSimpleText_(b,
+c,"undefined",d):null===a?this.appendSimpleText_(b,c,"null",d):a instanceof Object?a instanceof tracing.trace_model.ObjectSnapshot?(e=new tracing.analysis.ObjectSnapshotLink(a),e.objectSnapshot=a,this.appendElementWithLabel_(b,c,e,d)):a instanceof tracing.trace_model.ObjectInstance?(e=new tracing.analysis.ObjectInstanceLink(a),e.objectInstance=a,this.appendElementWithLabel_(b,c,e,d)):a instanceof Array?this.appendElementsForArray_(b,a,c,e,f,d):this.appendElementsForObject_(b,a,c,e,f,d):"string"==
+typeof a?this.appendSimpleText_(b,c,'"'+a+'"',d):this.appendSimpleText_(b,c,a,d)},appendElementsForArray_:function(b,a,c,e,f,d){if(0==a.length)this.appendSimpleText_(b,c,"[]",d);else{this.appendElementsForType_(b+"[",a[0],c,e+1,f,1<a.length?",":"]"+d);for(var h=1;h<a.length;h++)this.appendElementsForType_("",a[h],c+b.length+1,e+1,f,h<a.length-1?",":"]"+d)}},appendElementsForObject_:function(b,a,c,e,f,d){var h=base.dictionaryKeys(a);if(0==h.length)this.appendSimpleText_(b,c,"{}",d);else{this.appendElementsForType_(b+
+"{"+h[0]+": ",a[h[0]],c,e,f,1<h.length?",":"}"+d);for(var k=1;k<h.length;k++)this.appendElementsForType_(h[k]+": ",a[h[k]],c+b.length+1,e+1,f,k<h.length-1?",":"}"+d)}},appendElementWithLabel_:function(b,a,c,e){var f=document.createElement("div"),d=document.createElement("span");d.style.whiteSpace="pre";for(var h=0;h<a;h++)d.textContent+=" ";f.appendChild(d);a=document.createElement("span");a.textContent=b;f.appendChild(a);f.appendChild(c);b=document.createElement("span");b.textContent=e;f.appendChild(b);
+f.dataElement=c;this.appendChild(f)},appendSimpleText_:function(b,a,c,e){var f=this.ownerDocument.createElement("span");f.textContent=c;this.appendElementWithLabel_(b,a,f,e);return f}};return{GenericObjectView:d}});"use strict";base.requireStylesheet("tracing.analysis.analysis_results");base.require("tracing.analysis.util");base.require("tracing.analysis.analysis_link");base.require("tracing.analysis.generic_object_view");base.require("ui");
+base.exportTo("tracing.analysis",function(){var d=ui.define("div");d.prototype={__proto__:HTMLDivElement.prototype,decorate:function(){this.className="analysis-results"},clear:function(){this.textContent=""},createSelectionChangingLink:function(b,a,c){var e=this.ownerDocument.createElement("a");tracing.analysis.AnalysisLink.decorate(e);e.textContent=b;e.selectionGenerator=a;c&&(e.title=c);return e},appendElement_:function(b,a,c){a=b.ownerDocument.createElement(a);b.appendChild(a);void 0!=c&&(a.textContent=
+c);return a},appendText_:function(b,a){b.ownerDocument.createTextNode(a);b.appendChild(textNode);return textNode},appendTableCell_:function(b,a,c,e){a=this.appendElement_(a,"td",e);a.className=b.className+"-col-"+c;return a},appendTableCell:function(b,a,c){return this.appendTableCell_(b,a,a.children.length,c)},appendTableCellWithTooltip_:function(b,a,c,e,f){if(f)return a=this.appendElement_(a,"td"),a.className=b.className+"-col-"+c,b=this.appendElement_(a,"span",e),b.className="tooltip",b.title=f,
+a;this.appendTableCell_(b,a,c,e)},appendTable:function(b,a){var c=this.appendElement_(this,"table");c.headerRow=this.appendElement_(c,"tr");c.className=b+" analysis-table";c.numColumns=a;return c},appendTableHeader:function(b,a){this.appendElement_(b.headerRow,"th",a).className="analysis-table-header"},appendTableRow:function(b){return this.appendElement_(b,"tr")},appendSummaryRow:function(b,a,c){var e=this.appendElement_(b,"tr");e.className="analysis-table-row";this.appendTableCell_(b,e,0,a);void 0!==
+c?(a=new tracing.analysis.GenericObjectView,a.object=c,a.classList.add("analysis-table-col-1"),a.style.display="table-cell",e.appendChild(a)):this.appendTableCell_(b,e,1,"");for(c=2;c<b.numColumns;c++)this.appendTableCell_(b,e,c,"")},appendSpacingRow:function(b){var a=this.appendElement_(b,"tr");a.className="analysis-table-row";for(var c=0;c<b.numColumns;c++)this.appendTableCell_(b,a,c," ")},appendSummaryRowTime:function(b,a,c){this.appendSummaryRow(b,a,tracing.analysis.tsRound(c)+" ms")},appendDataRow:function(b,
+a,c,e,f,d){var h=void 0;f&&(h="Min Duration:\t"+tracing.analysis.tsRound(f.min)+" ms \rMax Duration:\t"+tracing.analysis.tsRound(f.max)+" ms \rAvg Duration:\t"+tracing.analysis.tsRound(f.avg)+" ms (\u03c3 = "+tracing.analysis.tsRound(f.avg_stddev)+")",f.start&&(h+="\rStart Time:\t"+tracing.analysis.tsRound(f.start)+" ms"),f.end&&(h+="\rEnd Time:\t"+tracing.analysis.tsRound(f.end)+" ms"),f.frequency&&f.frequency_stddev&&(h+="\rFrequency:\t"+tracing.analysis.tsRound(f.frequency)+" occurrences/s (\u03c3 = "+
+tracing.analysis.tsRound(f.frequency_stddev)+")"));f=this.appendElement_(b,"tr");f.className="analysis-table-row";if(d){var k=this.appendTableCellWithTooltip_(b,f,0,a,h);k.textContent="";k.appendChild(this.createSelectionChangingLink(a,d,h))}else this.appendTableCellWithTooltip_(b,f,0,a,h);void 0!==c?c instanceof Array?this.appendTableCellWithTooltip_(b,f,1,"["+c.join(", ")+"]",h):this.appendTableCellWithTooltip_(b,f,1,tracing.analysis.tsRound(c)+" ms",h):this.appendTableCell_(b,f,1,"");void 0!==
+e?this.appendTableCellWithTooltip_(b,f,2,String(e)+" occurrences",h):this.appendTableCell_(b,f,2,"")}};return{AnalysisResults:d}});"use strict";base.require("tracing.analysis.util");base.require("ui");
+base.exportTo("tracing.analysis",function(){return{analyzeSingleCounterSampleHit:function(d,b){for(var a=b.counter,c=b.sampleIndex,e=[],f=0;f<a.numSeries;++f)e.push(a.getSeries(f).getSample(c).value);var g=d.appendTable("analysis-counter-table",2);d.appendTableHeader(g,"Selected counter:");d.appendSummaryRow(g,"Title",a.name);d.appendSummaryRowTime(g,"Timestamp",a.timestamps[c]);for(f=0;f<a.numSeries;f++)d.appendSummaryRow(g,a.getSeries(f).name,e[f])},analyzeMultipleCounterSampleHits:function(d,b){for(var a=
+{},c=0;c<b.length;c++){var e=b[c].counter;a[e.guid]||(a[e.guid]=[]);a[e.guid].push(b[c])}var f=d.appendTable("analysis-counter-table",2);d.appendTableHeader(f,"Counters:");for(var g in a){for(var h=a[g],e=h[0].counter,k=[],c=0;c<h.length;c++)k.push(h[c].sampleIndex);h=e.getSampleStatistics(k);for(c=0;c<h.length;c++){for(var l=[],m=0;m<k.length;++m)l.push(e.getSeries(c).getSample(k[m]).value);d.appendDataRow(f,e.name+": series("+e.getSeries(c).name+")",l,l.length,h[c])}}}}});"use strict";base.requireStylesheet("tracing.analysis.analyze_slices");
+base.require("tracing.analysis.util");base.require("ui");
+base.exportTo("tracing.analysis",function(){function d(b,a){var c=a.slice,e=b.appendTable("analysis-slice-table",2);b.appendTableHeader(e,"Selected slice:");b.appendSummaryRow(e,"Title",c.title);c.category&&b.appendSummaryRow(e,"Category",c.category);b.appendSummaryRowTime(e,"Start",c.start);b.appendSummaryRowTime(e,"Duration",c.duration);c.durationInUserTime&&b.appendSummaryRowTime(e,"Duration (U)",c.durationInUserTime);var f=0,d;for(d in c.args)f+=1;if(0<f)for(d in b.appendSummaryRow(e,"Args"),
+c.args)b.appendSummaryRow(e," "+d,c.args[d])}return{analyzeSingleSliceHit:d,analyzeMultipleSliceHits:function(b,a){var c=a.bounds.min,e=a.bounds.max;a.map(function(a){return a.slice.title});for(var f=0,g={},h=0;h<a.length;h++){var k=a[h].slice;g[k.title]||(g[k.title]={hits:[]},f++);g[k.title].hits.push(a[h])}var l;l=b.appendTable("analysis-slices-table",3);b.appendTableHeader(l,"Slices:");var m=0;base.iterItems(g,function(a,c){for(var e=0,g=0,h=Number.MAX_VALUE,k=-Number.MAX_VALUE,t=Number.MAX_VALUE,
+r=-Number.MAX_VALUE,g=0;g<c.hits.length;g++)var v=c.hits[g].slice,e=e+v.duration,h=Math.min(v.start,h),k=Math.max(v.start,k),t=Math.min(v.duration,t),r=Math.max(v.duration,r);m+=e;0==c.hits.length&&(g=0);g=e/c.hits.length;t={min:t,max:r,avg:g,avg_stddev:void 0,frequency:void 0,frequency_stddev:void 0};for(g=r=0;g<c.hits.length;g++)v=t.avg-c.hits[g].slice.duration,r+=v*v;t.avg_stddev=Math.sqrt(r/(c.hits.length-1));k-=h;if(2<c.hits.length&&0<k){h=c.hits.length-1;t.frequency=1E3*h/k;r=0;for(g=1;g<c.hits.length;g++)v=
+t.frequency-1E3/(c.hits[g].slice.start-c.hits[g-1].slice.start),r+=v*v;t.frequency_stddev=Math.sqrt(r/(h-1))}b.appendDataRow(l,a,e,c.hits.length,t,function(){return new tracing.Selection(c.hits)});if(1===f)for(g=0;g<c.hits.length;g++)d(b,c.hits[g])});1!==f&&(b.appendDataRow(l,"*Totals",m,a.length),b.appendSpacingRow(l));b.appendSummaryRowTime(l,"Selection start",c);b.appendSummaryRowTime(l,"Selection extent",e-c)}}});"use strict";base.require("tracing.analysis.analyze_counters");base.require("tracing.analysis.analyze_slices");
+base.require("tracing.analysis.util");base.require("ui");
+base.exportTo("tracing.analysis",function(){function d(a,c){var e=c.slices,f=c.counterSamples,d=new tracing.Selection;d.addSelection(c.objectSnapshots);d.addSelection(c.objectInstances);1==e.length?tracing.analysis.analyzeSingleSliceHit(a,e[0]):1<e.length&&tracing.analysis.analyzeMultipleSliceHits(a,e);1==f.length?tracing.analysis.analyzeSingleCounterSampleHit(a,f[0]):1<f.length&&tracing.analysis.analyzeMultipleCounterSampleHits(a,f);d.length&&b(a,d)}function b(a,c){c=base.asArray(c).sort(base.Range.compareByMinTimes);
+var b=a.appendTable("analysis-object-sample-table",2);a.appendTableHeader(b,"Selected Objects:");c.forEach(function(c){var d=a.appendTableRow(b),h,k,l;if(c instanceof tracing.SelectionObjectSnapshotHit){var m=c.objectSnapshot;h=tracing.analysis.tsRound(m.ts);k=m.objectInstance.typeName+" "+m.objectInstance.id;l=function(){var a=new tracing.Selection;a.addObjectSnapshot(c.track,m);return a}}else{var n=c.objectInstance;h=n.deletionTs==Number.MAX_VALUE?"":tracing.analysis.tsRound(n.deletionTs);h=tracing.analysis.tsRound(n.creationTs)+
+"-"+h;k=n.typeName+" "+n.id;l=function(){var a=new tracing.Selection;a.addObjectInstance(c.track,n);return a}}a.appendTableCell(b,d,h);a.appendTableCell(b,d,"").appendChild(a.createSelectionChangingLink(k,l))})}return{analyzeSelection:function(a,c){d(a,c.getHitsOrganizedByType())},analyzeHitsByType:d}});"use strict";base.require("ui");
+base.exportTo("tracing.analysis",function(){var d=ui.define("object-instance-view");d.prototype={__proto__:HTMLDivElement.prototype,decorate:function(){this.objectInstance_=void 0},set modelObject(b){this.objectInstance=b},get modelObject(){return this.objectInstance},get objectInstance(){return this.objectInstance_},set objectInstance(b){this.objectInstance_=b;this.updateContents()},updateContents:function(){throw Error("Not implemented");}};d.typeNameToViewInfoMap={};d.register=function(b,a,c){if(d.typeNameToViewInfoMap[b])throw Error("Handler already registerd for "+
+b);d.typeNameToViewInfoMap[b]={constructor:a,options:c||{showInTrackView:!0}}};d.unregister=function(b){if(void 0===d.typeNameToViewInfoMap[b])throw Error(b+" not registered");delete d.typeNameToViewInfoMap[b]};d.getViewInfo=function(b){return d.typeNameToViewInfoMap[b]};return{ObjectInstanceView:d}});"use strict";base.require("ui");
+base.exportTo("tracing.analysis",function(){var d=ui.define("object-snapshot-view");d.prototype={__proto__:HTMLDivElement.prototype,decorate:function(){this.objectSnapshot_=void 0},set modelObject(b){this.objectSnapshot=b},get modelObject(){return this.objectSnapshot},get objectSnapshot(){return this.objectSnapshot_},set objectSnapshot(b){this.objectSnapshot_=b;this.updateContents()},updateContents:function(){throw Error("Not implemented");}};d.typeNameToViewInfoMap={};d.register=function(b,a,c){if(d.typeNameToViewInfoMap[b])throw Error("Handler already registered for "+
+b);d.typeNameToViewInfoMap[b]={constructor:a,options:c||{showInTrackView:!0}}};d.unregister=function(b){if(void 0===d.typeNameToViewInfoMap[b])throw Error(b+" not registered");delete d.typeNameToViewInfoMap[b]};d.getViewInfo=function(b){return d.typeNameToViewInfoMap[b]};return{ObjectSnapshotView:d}});"use strict";base.requireStylesheet("tracing.analysis.default_object_view");base.require("tracing.analysis.analysis_link");base.require("tracing.analysis.object_instance_view");base.require("tracing.analysis.object_snapshot_view");
+base.require("tracing.analysis.util");
+base.exportTo("tracing.analysis",function(){var d=tracing.analysis.tsRound,b=ui.define("default-object-snapshot-view",tracing.analysis.ObjectSnapshotView);b.prototype={__proto__:tracing.analysis.ObjectSnapshotView.prototype,decorate:function(){tracing.analysis.ObjectSnapshotView.prototype.decorate.apply(this);this.classList.add("default-object-view");this.classList.add("default-object-snapshot-view")},updateContents:function(){var a=this.objectSnapshot;if(a){var b=a.objectInstance,f;f=""+('<div class="title">Snapshot of <a id="instance-link"></a> @ '+
+d(a.ts)+"ms</div>\n");f+="<table><tr>";f+='<tr><td>args:</td><td id="args"></td></tr>\n';this.innerHTML=f+="</table>";f=new tracing.analysis.ObjectInstanceLink;f.objectInstance=b;b=this.querySelector("#instance-link");b.parentElement.replaceChild(f,b);this.querySelector("#args").textContent=JSON.stringify(a.args,null,2)}else this.textContent=""}};var a=ui.define("default-object-instance-view",tracing.analysis.ObjectInstanceView);a.prototype={__proto__:tracing.analysis.ObjectInstanceView.prototype,
+decorate:function(){tracing.analysis.ObjectInstanceView.prototype.decorate.apply(this);this.classList.add("default-object-view");this.classList.add("default-object-instance-view")},updateContents:function(){var a=this.objectInstance;if(a){var b;b=""+('<div class="title">'+a.typeName+" "+a.id+"</div>\n");b+="<table><tr>";b+="<tr><td>creationTs:</td><td>"+a.creationTs+"</td></tr>\n";b=a.deletionTs!=Number.MAX_VALUE?b+("<tr><td>deletionTs:</td><td>"+a.deletionTs+"</td></tr>\n"):b+"<tr><td>deletionTs:</td><td>not deleted</td></tr>\n";
+b+='<tr><td>snapshots:</td><td id="snapshots"></td></tr>\n';this.innerHTML=b+="</table>";var d=this.querySelector("#snapshots");a.snapshots.forEach(function(a){var c=new tracing.analysis.ObjectSnapshotLink;c.objectSnapshot=a;d.appendChild(c)})}else this.textContent=""}};return{DefaultObjectSnapshotView:b,DefaultObjectInstanceView:a}});"use strict";base.require("ui");
+base.exportTo("tracing.analysis",function(){var d=ui.define("slice-view");d.prototype={__proto__:HTMLDivElement.prototype,decorate:function(){this.objectInstance_=void 0},set modelObject(b){this.slice=b},get modelObject(){return this.slice},get slice(){return this.slice_},set slice(b){this.slice_=b;this.updateContents()},updateContents:function(){throw Error("Not implemented");}};d.titleToViewInfoMap={};d.register=function(b,a){if(d.titleToViewInfoMap[b])throw Error("Handler already registerd for "+
+b);d.titleToViewInfoMap[b]={constructor:a}};d.unregister=function(b){if(void 0===d.titleToViewInfoMap[b])throw Error(b+" not registered");delete d.titleToViewInfoMap[b]};d.getViewInfo=function(b){return d.titleToViewInfoMap[b]};return{SliceView:d}});"use strict";base.requireStylesheet("tracing.analysis.analysis_view");base.require("base.guid");base.require("tracing.analysis.analysis_results");base.require("tracing.analysis.analyze_selection");base.require("tracing.analysis.default_object_view");base.require("tracing.analysis.object_instance_view");
+base.require("tracing.analysis.object_snapshot_view");base.require("tracing.analysis.slice_view");base.require("tracing.analysis.util");base.require("ui");
+base.exportTo("tracing.analysis",function(){var d=ui.define("div");d.prototype={__proto__:HTMLDivElement.prototype,decorate:function(){this.className="analysis-view";this.currentSelection_=this.currentView_=void 0;this.selections_=[];this.guid_=base.GUID.allocate();window.addEventListener("popstate",this.onPopState.bind(this))},changeViewType:function(b){if(!(this.currentView_ instanceof b)){this.textContent="";try{this.currentView_=new b,this.appendChild(this.currentView_)}catch(a){throw this.currentView_=
+void 0,a;}this.currentView_ instanceof tracing.analysis.AnalysisResults?this.classList.remove("viewing-object"):this.classList.add("viewing-object")}},get currentView(){return this.currentView_},get selection(){return this.currentSelection_},set selection(b){this.selections_.push(b);window.history.pushState({view_guid:this.guid_,selection_guid:b.guid});this.processSelection(b)},clearSelectionHistory:function(){this.selections_=[]},onPopState:function(b){if(null!==b.state&&b.state.view_guid===this.guid_){var a;
+for(a=0;a<this.selections_.length&&this.selections_[a].guid!==b.state.selection_guid;++a);a>=this.selections_.length||(this.processSelection(this.selections_[a]),b.stopPropagation())}},processSelection:function(b){var a=b.getHitsOrganizedByType();1==b.length&&0==a.counterSamples.length&&this.tryToProcessSelectionUsingCustomViewer(b[0])||(this.changeViewType(tracing.analysis.AnalysisResults),this.currentView.clear(),this.currentSelection_=b,tracing.analysis.analyzeHitsByType(this.currentView,a))},
+tryToProcessSelectionUsingCustomViewer:function(b){var a,c,e;a=b.modelObject;if(b instanceof tracing.SelectionObjectSnapshotHit)c=a.objectInstance.typeName,e=tracing.analysis.ObjectSnapshotView,b=tracing.analysis.DefaultObjectSnapshotView;else if(b instanceof tracing.SelectionObjectInstanceHit)c=a.typeName,e=tracing.analysis.ObjectInstanceView,b=tracing.analysis.DefaultObjectInstanceView;else if(b instanceof tracing.SelectionSliceHit)c=a.title,e=tracing.analysis.SliceView,b=void 0;else return!1;b=
+(c=e.getViewInfo(c))?c.constructor:b;if(!b)return!1;this.changeViewType(b);this.currentView.modelObject=a;return!0}};return{AnalysisView:d}});"use strict";base.require("base.events");
+base.exportTo("base",function(){function d(a,c,b,e,d,m){d=new base.Event(c+"Change",d,m);d.propertyName=c;d.newValue=b;d.oldValue=e;var n;d.throwError=function(a){n=a};a.dispatchEvent(d);if(n)throw n;}function b(a){return a.replace(/([A-Z])/g,"-$1").toLowerCase()}function a(a,c){switch(c){case e.JS:var d=a+"_base_";return function(){return this[d]};case e.ATTR:var k=b(a);return function(){return this.getAttribute(k)};case e.BOOL_ATTR:return k=b(a),function(){return this.hasAttribute(k)}}}function c(a,
+c,h,k,l){switch(c){case e.JS:var m=a+"_base_";return function(c){var b=this[m];c!==b&&(this[m]=c,h&&h.call(this,c,b),d(this,a,c,b,k,l))};case e.ATTR:var n=b(a);return function(c){var b=this.getAttribute(n);c!==b&&(void 0==c?this.removeAttribute(n):this.setAttribute(n,c),h&&h.call(this,c,b),d(this,a,c,b,k,l))};case e.BOOL_ATTR:return n=b(a),function(c){var b=this.getAttribute(n)===a;c!==b&&(c?this.setAttribute(n,a):this.removeAttribute(n),h&&h.call(this,c,b),d(this,a,c,b,k,l))}}}var e={JS:"js",ATTR:"attr",
+BOOL_ATTR:"boolAttr"};return{PropertyKind:e,defineProperty:function(b,d,h,k,l,m){console.error("Don't use base.defineProperty");"function"==typeof b&&(b=b.prototype);h=h||e.JS;b.__lookupGetter__(d)||b.__defineGetter__(d,a(d,h));b.__lookupSetter__(d)||b.__defineSetter__(d,c(d,h,k,l,m))},dispatchPropertyChange:d,setPropertyAndDispatchChange:function(a,c,b){var e=a[c];a[c+"_"]=b;e!==b&&base.dispatchPropertyChange(a,c,b,e,!0,!1)}}});"use strict";base.requireStylesheet("ui.overlay");base.require("base.properties");
+base.require("base.events");base.require("ui");
+base.exportTo("ui",function(){var d=ui.define("div");d.prototype={__proto__:HTMLDivElement.prototype,decorate:function(){this.classList.add("overlay-root");this.createToolBar_();this.contentHost=this.ownerDocument.createElement("div");this.contentHost.classList.add("content-host");this.tabCatcher=this.ownerDocument.createElement("span");this.tabCatcher.tabIndex=0;this.appendChild(this.contentHost);this.onKeydown_=this.onKeydown_.bind(this);this.onFocusIn_=this.onFocusIn_.bind(this);this.addEventListener("mousedown",
+this.onMousedown_.bind(this))},toggleToolbar:function(a){a?this.contentHost.firstChild?this.contentHost.insertBefore(this.contentHost.firstChild,this.toolbar_):this.contentHost.appendChild(this.toolbar_):this.toolbar_.parentElement&&this.contentHost.removeChild(this.toolbar_)},createToolBar_:function(){this.toolbar_=this.ownerDocument.createElement("div");this.toolbar_.className="tool-bar";this.exitButton_=this.ownerDocument.createElement("span");this.exitButton_.className="exit-button";this.exitButton_.textContent=
+"x";this.exitButton_.title="Close Overlay (esc)";this.toolbar_.appendChild(this.exitButton_)},showOverlay:function(a){a.oldParent_=a.parentNode;this.contentHost.appendChild(a);this.contentHost.appendChild(this.tabCatcher);this.ownerDocument.body.classList.add("disabled-by-overlay");a.tabIndex=0;var c=a.querySelector("button, input, list, select, a");c||(c=a);c.focus();this.ownerDocument.addEventListener("focusin",this.onFocusIn_,!0);a.addEventListener("keydown",this.onKeydown_)},onMousedown_:function(a){a.target==
+this&&a.preventDefault()},onFocusIn_:function(a){a.target==this.tabCatcher&&window.setTimeout(this.focusOverlay_.bind(this),0)},focusOverlay_:function(){this.contentHost.firstChild.focus()},onKeydown_:function(a){9==a.keyCode&&a.shiftKey&&a.target==this.contentHost.firstChild&&a.preventDefault()},hideOverlay:function(a){this.visible=!1;this.ownerDocument.body.classList.remove("disabled-by-overlay");this.lastFocusOut_=void 0;a.parentNode.removeChild(this.tabCatcher);a.oldParent_?(a.oldParent_.appendChild(a),
+delete a.oldParent_):this.contentHost.removeChild(a);a.removeEventListener("keydown",this.onKeydown_);this.ownerDocument.removeEventListener("focusin",this.onFocusIn_)}};var b=ui.define("div");b.prototype={__proto__:HTMLDivElement.prototype,decorate:function(){if(!this.ownerDocument.querySelector(".overlay-root")){var a=this.ownerDocument.createElement("div");ui.decorate(a,d);this.ownerDocument.body.appendChild(a)}this.classList.add("overlay");this.obeyCloseEvents=this.visible_=!1;this.additionalCloseKeyCodes=
+[];this.onKeyDown=this.onKeyDown.bind(this);this.onKeyPress=this.onKeyPress.bind(this);this.onDocumentClick=this.onDocumentClick.bind(this);this.addEventListener("visibleChange",b.prototype.onVisibleChange_.bind(this),!0);this.obeyCloseEvents=!0},get visible(){return this.visible_},set visible(a){base.setPropertyAndDispatchChange(this,"visible",a)},get obeyCloseEvents(){return this.obeyCloseEvents_},set obeyCloseEvents(a){base.setPropertyAndDispatchChange(this,"obeyCloseEvents",a);this.ownerDocument.querySelector(".overlay-root").toggleToolbar(a)},
+get toolbar(){return this.ownerDocument.querySelector(".overlay-root .tool-bar")},onVisibleChange_:function(){var a=this.ownerDocument.querySelector(".overlay-root");this.visible?(a.setAttribute("visible","visible"),a.showOverlay(this),document.addEventListener("keydown",this.onKeyDown,!0),document.addEventListener("keypress",this.onKeyPress,!0),document.addEventListener("click",this.onDocumentClick,!0)):(a.removeAttribute("visible"),document.removeEventListener("keydown",this.onKeyDown,!0),document.removeEventListener("keypress",
+this.onKeyPress,!0),document.removeEventListener("click",this.onDocumentClick,!0),a.hideOverlay(this))},onKeyDown:function(a){this.obeyCloseEvents&&27==a.keyCode&&(this.visible=!1,a.preventDefault())},onKeyPress:function(a){if(this.obeyCloseEvents)for(var c=0;c<this.additionalCloseKeyCodes.length;c++)if(a.keyCode==this.additionalCloseKeyCodes[c]){this.visible=!1;a.preventDefault();break}},onDocumentClick:function(a){if(this.obeyCloseEvents){for(var c=a.target;null!==c;){if(c===this)return;c=c.parentNode}this.visible=
+!1;a.preventDefault()}}};return{Overlay:b}});"use strict";base.requireTemplate("tracing.category_filter_dialog");base.require("base.utils");base.require("tracing.filter");base.require("ui.overlay");
+base.exportTo("tracing",function(){var d=ui.define("div");d.prototype={__proto__:ui.Overlay.prototype,decorate:function(){ui.Overlay.prototype.decorate.call(this);this.className="view-category-filter-overlay";this.obeyCloseEvents=!0;var b=base.instantiateTemplate("#view-category-filter-dialog-template");this.appendChild(b);this.formEl_=this.querySelector("form");this.categoriesEl_=this.querySelector(".categories");this.addEventListener("visibleChange",this.onVisibleChange_.bind(this))},set categories(b){this.categories_=
+b},set settingUpdatedCallback(b){this.settingUpdatedCallback_=b},unselectedCategories_:function(){for(var b=this.formEl_.querySelectorAll("input"),a=[],c=0;c<b.length;++c){var e=b[c];!1===e.checked&&a.push(e.value)}return a},onVisibleChange_:function(){this.visible&&this.updateForm_()},updateForm_:function(){this.categoriesEl_.innerHTML="";for(var b=this.categories_.sort(),a=0;a<b.length;a++){var c=b[a],e=document.createElement("input");e.type="checkbox";e.id=c;e.value=c;e.checked=!0;e.onchange=this.updateSetting_.bind(this);
+var d=document.createElement("label");d.textContent=c;d.setAttribute("for",c);c=document.createElement("div");c.appendChild(e);c.appendChild(d);this.categoriesEl_.appendChild(c)}},updateSetting_:function(b){void 0!==this.settingUpdatedCallback_&&this.settingUpdatedCallback_(this.unselectedCategories_())}};return{CategoryFilterDialog:d}});"use strict";base.exportTo("tracing",function(){return{mouseModeConstants:{MOUSE_MODE_SELECTION:1,MOUSE_MODE_PANSCAN:2,MOUSE_MODE_ZOOM:3}}});"use strict";base.require("base.events");
+base.exportTo("tracing",function(){function d(a){this.parentEl_=a;this.modelTrackContainer_=null;this.scaleX_=1;this.gridTimebase_=this.panY_=this.panX_=0;this.gridStep_=1E3/60;this.hasCalledSetupFunction_=this.gridEnabled_=!1;this.onResize_=this.onResize_.bind(this);this.onModelTrackControllerScroll_=this.onModelTrackControllerScroll_.bind(this);this.checkForAttachInterval_=setInterval(this.checkForAttach_.bind(this),250);this.markers=[]}function b(a,c){this.viewport_=a;this.positionWorld_=c;this.selected_=
+!1}d.prototype={__proto__:base.EventTarget.prototype,setWhenPossible:function(a){this.pendingSetFunction_=a},get isAttachedToDocument_(){var a=this.parentEl_;if(void 0!==a){for(;a.parentNode;)a=a.parentNode;return a==this.parentEl_.ownerDocument}},onResize_:function(){this.dispatchChangeEvent()},checkForAttach_:function(){if(this.isAttachedToDocument_&&0!=this.clientWidth){this.iframe_||(this.iframe_=document.createElement("iframe"),this.iframe_.style.cssText="position:absolute;width:100%;height:0;border:0;visibility:hidden;",
+this.parentEl_.appendChild(this.iframe_),this.iframe_.contentWindow.addEventListener("resize",this.onResize_));var a=this.parentEl_.clientWidth+"x"+this.parentEl_.clientHeight;if(this.pendingSetFunction_){this.lastSize_=a;try{this.pendingSetFunction_()}catch(c){console.log("While running setWhenPossible:",c.message?c.message+"\n"+c.stack:c.stack)}this.pendingSetFunction_=void 0}window.clearInterval(this.checkForAttachInterval_);this.checkForAttachInterval_=void 0}},dispatchChangeEvent:function(){base.dispatchSimpleEvent(this,
+"change")},dispatchMarkersChangeEvent_:function(){base.dispatchSimpleEvent(this,"markersChange")},detach:function(){this.checkForAttachInterval_&&(window.clearInterval(this.checkForAttachInterval_),this.checkForAttachInterval_=void 0);this.iframe_&&(this.iframe_.removeEventListener("resize",this.onResize_),this.parentEl_.removeChild(this.iframe_))},getStateInViewCoordinates:function(){return{panX:this.xWorldVectorToView(this.panX),panY:this.panY,scaleX:this.scaleX}},setStateInViewCoordinates:function(a){this.panX=
+this.xViewVectorToWorld(a.panX);this.panY=a.panY},onModelTrackControllerScroll_:function(a){this.panY_=this.modelTrackContainer_.scrollTop},set modelTrackContainer(a){this.modelTrackContainer_&&this.modelTrackContainer_.removeEventListener("scroll",this.onModelTrackControllerScroll_);this.modelTrackContainer_=a;this.modelTrackContainer_.addEventListener("scroll",this.onModelTrackControllerScroll_)},get scaleX(){return this.scaleX_},set scaleX(a){this.scaleX_!=a&&(this.scaleX_=a,this.dispatchChangeEvent())},
+get panX(){return this.panX_},set panX(a){this.panX_!=a&&(this.panX_=a,this.dispatchChangeEvent())},get panY(){return this.panY_},set panY(a){this.panY_=a;this.modelTrackContainer_.scrollTop=a},setPanAndScale:function(a,c){if(this.scaleX_!=c||this.panX_!=a)this.scaleX_=c,this.panX_=a,this.dispatchChangeEvent()},xWorldToView:function(a){return(a+this.panX_)*this.scaleX_},xWorldVectorToView:function(a){return a*this.scaleX_},xViewToWorld:function(a){return a/this.scaleX_-this.panX_},xViewVectorToWorld:function(a){return a/
+this.scaleX_},xPanWorldPosToViewPos:function(a,c,b){if("string"==typeof c)if("left"==c)c=0;else if("center"==c)c=b/2;else if("right"==c)c=b-1;else throw Error("unrecognized string for viewPos. left|center|right");this.panX=c/this.scaleX_-a},xPanWorldBoundsIntoView:function(a,c,b){0>this.xWorldToView(a)?this.xPanWorldPosToViewPos(a,"left",b):this.xWorldToView(c)>b&&this.xPanWorldPosToViewPos(c,"right",b)},xSetWorldBounds:function(a,c,b){this.setPanAndScale(-a,b/(c-a))},get gridEnabled(){return this.gridEnabled_},
+set gridEnabled(a){this.gridEnabled_!=a&&(this.gridEnabled_=a&&!0,this.dispatchChangeEvent())},get gridTimebase(){return this.gridTimebase_},set gridTimebase(a){this.gridTimebase_!=a&&(this.gridTimebase_=a,this.dispatchChangeEvent())},get gridStep(){return this.gridStep_},applyTransformToCanvas:function(a){a.transform(this.scaleX_,0,0,1,this.panX_*this.scaleX_,0)},addMarker:function(a){a=new b(this,a);this.markers.push(a);this.dispatchChangeEvent();this.dispatchMarkersChangeEvent_();return a},removeMarker:function(a){for(var c=
+0;c<this.markers.length;++c)if(this.markers[c]===a)return this.markers.splice(c,1),this.dispatchChangeEvent(),this.dispatchMarkersChangeEvent_(),!0},findMarkerNear:function(a,c){for(var b=this.xViewVectorToWorld(c),d=0;d<this.markers.length;++d)if(Math.abs(this.markers[d].positionWorld-a)<=b)return this.markers[d]},drawGridLines:function(a,c,b){if(this.gridEnabled){var d=this.gridTimebase;for(a.beginPath();d<b;){if(d>=c){var g=this.xWorldToView(d);a.moveTo(g,0);a.lineTo(g,a.canvas.height)}d+=this.gridStep}a.strokeStyle=
+"rgba(255,0,0,0.25)";a.stroke()}},drawMarkerArrows:function(a,c,b,d){for(var g=0;g<this.markers.length;++g)this.markers[g].drawTriangle_(a,c,b,a.canvas.height,d,this)},drawMarkerLines:function(a,c,b){for(var d=0;d<this.markers.length;++d)this.markers[d].drawLine(a,c,b,a.canvas.height,this)}};b.prototype={get positionWorld(){return this.positionWorld_},set positionWorld(a){this.positionWorld_=a;this.viewport_.dispatchChangeEvent()},set selected(a){this.selected_=a;this.viewport_.dispatchChangeEvent()},
+get selected(){return this.selected_},get color(){return this.selected?"rgb(255,0,0)":"rgb(0,0,0)"},drawTriangle_:function(a,c,b,d,g,h){a.beginPath();var k=this.positionWorld_;k<c||k>b||(c=h.xWorldToView(k),a.moveTo(c,g),a.lineTo(c-3,g/2),a.lineTo(c+3,g/2),a.lineTo(c,g),a.closePath(),a.fillStyle=this.color,a.fill(),g!==d&&(a.beginPath(),a.moveTo(c,g),a.lineTo(c,d),a.closePath(),a.strokeStyle=this.color,a.stroke()))},drawLine:function(a,c,b,d,g){a.beginPath();var h=this.positionWorld_;h>=c&&h<b&&(c=
+g.xWorldToView(h),a.moveTo(c,0),a.lineTo(c,d));a.strokeStyle=this.color;a.stroke()}};return{TimelineViewport:d,ViewportMarker:b}});"use strict";base.require("base.utils");
+base.exportTo("base",function(){function d(a){try{a.callback.call(a.context)}catch(c){base.onAnimationFrameError(c,a.stack)}}function b(){g=!1;var a=c;f=e;c=[];e=[];for(var b=0;b<a.length;b++)d(a[b]);for(;0<f.length;)d(f.shift());f=void 0}function a(a,c){e.push({callback:a,context:c||window,stack:""});g||(g=!0,window.webkitRequestAnimationFrame(b))}var c=[],e=[],f=void 0,g=!1;return{onAnimationFrameError:function(a,c){c&&console.log(c);a.message?console.error(a.message,a.stack):console.error(a)},
+requestPreAnimationFrame:function(a,e){c.push({callback:a,context:e||window,stack:""});g||(g=!0,window.webkitRequestAnimationFrame(b))},requestAnimationFrame:a,requestAnimationFrameInThisFrameIfPossible:function(c,b){f?f.push({callback:c,context:b||window,stack:""}):a(c,b)}}});"use strict";base.require("base.events");base.require("ui");
+base.exportTo("ui",function(){var d=ui.define("div");d.prototype={__proto__:HTMLUnknownElement.prototype,decorate:function(){this.observer_=new WebKitMutationObserver(this.didMutate_.bind(this));this.observer_.observe(this,{childList:!0});Object.defineProperty(this,"textContent",{get:void 0,set:this.onSetTextContent_})},appendChild:function(b){HTMLUnknownElement.prototype.appendChild.call(this,b);this.didMutate_(this.observer_.takeRecords())},insertBefore:function(b,a){HTMLUnknownElement.prototype.insertBefore.call(this,
+b,a);this.didMutate_(this.observer_.takeRecords())},removeChild:function(b){HTMLUnknownElement.prototype.removeChild.call(this,b);this.didMutate_(this.observer_.takeRecords())},replaceChild:function(b,a){HTMLUnknownElement.prototype.replaceChild.call(this,b,a);this.didMutate_(this.observer_.takeRecords())},onSetTextContent_:function(b){if(""!=b)throw Error("textContent can only be set to ''.");this.clear()},clear:function(){for(;this.lastChild;)HTMLUnknownElement.prototype.removeChild.call(this,this.lastChild);
+this.didMutate_(this.observer_.takeRecords())},didMutate_:function(b){this.beginDecorating_();for(var a=0;a<b.length;a++){var c=b[a].addedNodes;if(c)for(var e=0;e<c.length;e++)this.decorateChild_(c[e]);if(c=b[a].removedNodes)for(e=0;e<c.length;e++)this.undecorateChild_(c[e])}this.doneDecoratingForNow_()},decorateChild_:function(b){throw Error("Not implemented");},undecorateChild_:function(b){throw Error("Not implemented");},beginDecorating_:function(){},doneDecoratingForNow_:function(){}};return{ContainerThatDecoratesItsChildren:d}});
+"use strict";base.requireStylesheet("tracing.tracks.track");base.require("ui");base.require("ui.container_that_decorates_its_children");base.require("tracing.color_scheme");
+base.exportTo("tracing.tracks",function(){var d=tracing.getColorPaletteHighlightIdBoost(),b=ui.define("track",ui.ContainerThatDecoratesItsChildren);b.prototype={__proto__:ui.ContainerThatDecoratesItsChildren.prototype,decorate:function(a){ui.ContainerThatDecoratesItsChildren.prototype.decorate.call(this);if(void 0===a)throw Error("viewport is required when creating a Track.");this.viewport_=a;this.classList.add("track");this.categoryFilter_=void 0},get viewport(){return this.viewport_},context:function(){if(this.parentNode){if(!this.parentNode.context)throw Error("Parent container does not support context() method.");
+return this.parentNode.context()}},get categoryFilter(){return this.categoryFilter_},set categoryFilter(a){this.categoryFilter_!=a&&(this.categoryFilter_=a,this.updateContents_())},decorateChild_:function(a){a instanceof b&&(a.categoryFilter=this.categoryFilter)},undecorateChild_:function(a){a.detach&&a.detach()},updateContents_:function(){},drawTrack:function(a){var c=this.context();if(void 0!==c){c.save();var b=this.setupCanvasForDraw_();this.draw(a,b.left,b.right);c.restore()}},draw:function(a,
+c,b){},setupCanvasForDraw_:function(){var a=this.context(),c=window.devicePixelRatio||1,b=this.getBoundingClientRect(),d=a.canvas.getBoundingClientRect();a.translate(0,c*(b.top-d.top));a=this.viewport.xViewToWorld(0);c=this.viewport.xViewToWorld(b.width*c);return{left:a,right:c}},decorateHit:function(a){},addIntersectingItemsInRangeToSelection:function(a,c,b,d,g){var h=window.devicePixelRatio||1,k=this.viewport.xViewVectorToWorld(1);a=this.viewport.xViewToWorld(a*h);c=this.viewport.xViewToWorld(c*
+h);h=this.getBoundingClientRect();b=Math.max(b,h.top);d=Math.min(d,h.bottom);b>d||this.addIntersectingItemsInRangeToSelectionInWorldSpace(a,c,k,g)},addIntersectingItemsInRangeToSelectionInWorldSpace:function(a,c,b,d){},drawInstantEvents_:function(a,c,b){var f=this.context(),g=window.devicePixelRatio||1,g=this.getBoundingClientRect().height*g,h=this.viewport,k=h.xViewVectorToWorld(1),l=tracing.getColorPalette();f.save();h.applyTransformToCanvas(f);h=new tracing.FastRectRenderer(f,2*k,2*k,l);h.setYandH(0,
+g);for(c=base.findLowIndexInSortedArray(a,function(a){return a.start},c);c<a.length;++c){var m=a[c],n=m.start;if(n>b)break;Math.max(m.duration,.001);m=m.selected?m.colorId+d:m.colorId;.001<k?h.fillRect(n,k,m):(f.fillStyle=l[m],f.beginPath(),f.moveTo(n-4*k,g),f.lineTo(n,0),f.lineTo(n+4*k,g),f.closePath(),f.fill())}h.flush();f.restore()}};return{Track:b}});"use strict";base.requireStylesheet("tracing.tracks.drawing_container");base.require("base.raf");base.require("tracing.tracks.track");base.require("ui");
+base.exportTo("tracing.tracks",function(){var d={SLICE:1,INSTANT_EVENT:2},b=ui.define("drawing-container",tracing.tracks.Track);b.prototype={__proto__:tracing.tracks.Track.prototype,decorate:function(a){tracing.tracks.Track.prototype.decorate.call(this,a);this.classList.add("drawing-container");this.canvas_=document.createElement("canvas");this.canvas_.className="drawing-container-canvas";this.canvas_.style.left=tracing.constants.HEADING_WIDTH+"px";this.appendChild(this.canvas_);this.ctx_=this.canvas_.getContext("2d");
+this.viewportChange_=this.viewportChange_.bind(this);this.viewport.addEventListener("change",this.viewportChange_)},get canvas(){return this.canvas_},context:function(){return this.ctx_},viewportChange_:function(){this.invalidate()},invalidate:function(){this.rafPending_||(this.rafPending_=!0,base.requestPreAnimationFrame(function(){this.rafPending_=!1;this.ctx_.clearRect(0,0,this.canvas_.width,this.canvas_.height);this.updateCanvasSizeIfNeeded_();base.requestAnimationFrameInThisFrameIfPossible(function(){for(var a=
+0;a<this.children.length;++a)this.children[a]instanceof tracing.tracks.Track&&this.children[a].drawTrack(d.INSTANT_EVENT);for(a=0;a<this.children.length;++a)this.children[a]instanceof tracing.tracks.Track&&this.children[a].drawTrack(d.SLICE);var c=window.devicePixelRatio||1,b=this.canvas_.getBoundingClientRect(),a=this.viewport.xViewToWorld(0),c=this.viewport.xViewToWorld(b.width*c);this.viewport.drawGridLines(this.ctx_,a,c);this.viewport.drawMarkerLines(this.ctx_,a,c)},this)},this))},updateCanvasSizeIfNeeded_:function(){var a=
+base.asArray(this.children).filter(this.visibleFilter_),c=this.getBoundingClientRect(),b=a[0].getBoundingClientRect(),d=a[a.length-1].getBoundingClientRect(),a=b.width-tracing.constants.HEADING_WIDTH,d=d.bottom-b.top,g=window.devicePixelRatio||1;this.canvas_.width!=a*g&&(this.canvas_.width=a*g,this.canvas_.style.width=a+"px");this.canvas_.height!=d*g&&(this.canvas_.height=d*g,this.canvas_.style.height=d+"px");c=b.top-c.top+this.scrollTop;this.canvas_.style.top+"px"!==c&&(this.canvas_.style.top=c+
+"px")},visibleFilter_:function(a){return a instanceof tracing.tracks.Track?"none"!==window.getComputedStyle(a).display:!1}};return{DrawingContainer:b,DrawType:d}});"use strict";base.exportTo("tracing",function(){return{constants:{HEADING_WIDTH:250}}});"use strict";base.requireStylesheet("tracing.tracks.heading_track");base.require("tracing.constants");base.require("tracing.tracks.track");base.require("ui");
+base.exportTo("tracing.tracks",function(){var d=ui.define("heading-track",tracing.tracks.Track);d.prototype={__proto__:tracing.tracks.Track.prototype,decorate:function(b){tracing.tracks.Track.prototype.decorate.call(this,b);this.classList.add("heading-track");this.headingDiv_=document.createElement("heading");this.headingDiv_.style.width=tracing.constants.HEADING_WIDTH+"px";this.appendChild(this.headingDiv_)},get heading(){return this.headingDiv_.textContent},set heading(b){this.headingDiv_.textContent=
+b},set tooltip(b){this.headingDiv_.title=b},draw:function(b,a,c){throw Error("draw implementation missing");}};return{HeadingTrack:d}});"use strict";base.requireStylesheet("tracing.tracks.ruler_track");base.require("tracing.constants");base.require("tracing.tracks.track");base.require("tracing.tracks.heading_track");base.require("ui");
+base.exportTo("tracing.tracks",function(){var d=ui.define("ruler-track",tracing.tracks.HeadingTrack),b=Math.log(10);d.prototype={__proto__:tracing.tracks.HeadingTrack.prototype,decorate:function(a){tracing.tracks.HeadingTrack.prototype.decorate.call(this,a);this.classList.add("ruler-track");this.strings_secs_=[];this.strings_msecs_=[];this.addEventListener("mousedown",this.onMouseDown);this.viewportMarkersChange_=this.viewportMarkersChange_.bind(this);a.addEventListener("markersChange",this.viewportMarkersChange_)},
+detach:function(){tracing.tracks.HeadingTrack.prototype.detach.call(this);this.viewport.removeEventListener("markersChange",this.viewportMarkersChange_)},viewportMarkersChange_:function(){2>this.viewport.markers.length?this.classList.remove("ruler-track-with-distance-measurements"):this.classList.add("ruler-track-with-distance-measurements")},onMouseDown:function(a){0===a.button&&this.placeAndBeginDraggingMarker(a.clientX)},placeAndBeginDraggingMarker:function(a){var c=window.devicePixelRatio||1;
+a=this.viewport.xViewToWorld((a-this.offsetLeft-tracing.constants.HEADING_WIDTH)*c);var b=this.viewport.findMarkerNear(a,6),d=!1,g=!1;b||(b=this.viewport.addMarker(a),d=!0);b.selected=!0;var h=function(a){a=this.viewport.xViewToWorld((a.clientX-this.offsetLeft-tracing.constants.HEADING_WIDTH)*c);b.positionWorld=a;g=!0}.bind(this),k=function(a){b.selected=!1;g||d||this.viewport.removeMarker(b);document.removeEventListener("mouseup",k);document.removeEventListener("mousemove",h)}.bind(this);document.addEventListener("mouseup",
+k);document.addEventListener("mousemove",h)},drawLine_:function(a,c,b,d,g,h){a.beginPath();a.moveTo(c,b);a.lineTo(d,g);a.closePath();a.strokeStyle=h;a.stroke()},drawArrow_:function(a,c,b,d,g,h,k){this.drawLine_(a,c,b,d,g,k);var l=d-c,m=g-b,n=Math.sqrt(l*l+m*m),p=(n-10)/n;c+=p*l;b+=p*m;m=m/n*h;h*=-(l/n);a.beginPath();a.fillStyle=k;a.moveTo(c+m,b+h);a.lineTo(d,g);a.lineTo(c-m,b-h);a.lineTo(c+m,b+h);a.closePath();a.fill()},draw:function(a,b,e){switch(a){case tracing.tracks.DrawType.SLICE:this.drawSlices_(b,
+e)}},drawSlices_:function(a,c){var e=this.context(),d=window.devicePixelRatio||1,g=this.getBoundingClientRect(),h=g.width*d,k=g.height*d,l=this.classList.contains("ruler-track-with-distance-measurements"),g=l?k/2:k,m=this.viewport;m.drawMarkerArrows(e,a,c,g);var d=150*d,n=m.xViewVectorToWorld(d),p,q,s,u;u=Math.pow(10,Math.ceil(Math.log(n)/b));q=[10,5,2,1];for(n=0;n<q.length;++n)if(!(m.xWorldVectorToView(u/q[n])<d)){p=u/q[n-1];break}u=void 0;100>p?(q="ms",s=1,u=this.strings_msecs_):(q="s",s=1E3,u=
+this.strings_secs_);var w=m.xWorldVectorToView(p/5),n=Math.floor(a/p)*p,k=Math.floor(.25*k);e.fillStyle="rgb(0, 0, 0)";e.strokeStyle="rgb(0, 0, 0)";e.textAlign="left";e.textBaseline="top";d=window.devicePixelRatio||1;e.font=9*d+"px sans-serif";for(var t=n;t<c;t+=p){var r=Math.floor(m.xWorldToView(t)),n=Math.floor(t/s*1E5)/1E5;u[n]||(u[n]=n+" "+q);e.fillText(u[n],r+2*d,0);e.beginPath();e.moveTo(r,0);e.lineTo(r,g);for(n=1;5>n;++n){var v=Math.floor(r+w*n);e.moveTo(v,g-k);e.lineTo(v,g)}e.stroke()}e.moveTo(0,
+g);e.lineTo(h,g);e.stroke();if(l){p=m.markers.slice();p.sort(function(a,b){return a.positionWorld_-b.positionWorld_});l=g+2;d=l+4;for(n=0;n<p.length-1;n++){k=p[n+1];t=p[n];r=k.positionWorld-t.positionWorld;w=m.xWorldVectorToView(r);u=m.xWorldToView(t.positionWorld+r/2);100>r?(q="ms",s=1):(q="s",s=1E3);s=r/s;q=Math.abs(Math.floor(1E3*s)/1E3)+" "+q;s=e.measureText(q).width;v=m.xViewVectorToWorld(s);s=s+26+10;var x=t.positionWorld+r/2-v/2,y=x+v,r=l,v=m.xWorldToView(x),x=m.xWorldToView(y),t=m.xWorldToView(t.positionWorld),
+k=m.xWorldToView(k.positionWorld),y=!1;s<=w&&(e.fillStyle="rgb(0,0,0)",e.fillText(q,v,r),y=!0);26<=w&&(y?(q=v-10,u=x+10):q=u,this.drawArrow_(e,q,d,t,d,3,"rgb(128,121,121)"),this.drawArrow_(e,u,d,k,d,3,"rgb(128,121,121)"))}e.moveTo(0,2*g);e.lineTo(h,2*g);e.stroke()}},addIntersectingItemsInRangeToSelection:function(a,b,e,d,g){},addAllObjectsMatchingFilterToSelection:function(a,b){}};return{RulerTrack:d}});"use strict";
+base.exportTo("base",function(){function d(){this.iframe_=void 0}d.prototype={__proto__:Object.prototype,measure:function(b){this.iframe_.contentDocument.body.appendChild(b);var a=this.iframe_.contentWindow.getComputedStyle(b),c=parseInt(a.width,10),a=parseInt(a.height,10);this.iframe_.contentDocument.body.removeChild(b);return{width:c,height:a}},attach:function(){var b=document.createElement("iframe");b.style.cssText="position:absolute;width:100%;height:0;border:0;visibility:hidden";document.body.appendChild(b);
+this.iframe_=b;this.iframe_.contentDocument.body.style.cssText="padding:0;margin:0;overflow:hidden";for(var b=document.querySelectorAll("link[rel=stylesheet]"),a=0;a<b.length;a++){var c=b[a],e=this.iframe_.contentDocument.createElement("link");e.rel="stylesheet";e.href=c.href;this.iframe_.contentDocument.head.appendChild(e)}},detach:function(){document.body.removeChild(this.iframe_);this.iframe_=void 0}};return{MeasuringStick:d}});"use strict";base.require("tracing.tracks.track");base.require("tracing.filter");
+base.require("ui");
+base.exportTo("tracing.tracks",function(){var d=ui.define("container-track",tracing.tracks.Track);d.prototype={__proto__:tracing.tracks.Track.prototype,decorate:function(b){tracing.tracks.Track.prototype.decorate.call(this,b)},detach:function(){this.textContent=""},get tracks_(){for(var b=[],a=0;a<this.children.length;a++)this.children[a].classList.contains("track")&&b.push(this.children[a]);return b},drawTrack:function(b){for(var a=0;a<this.children.length;++a)this.children[a]instanceof tracing.tracks.Track&&
+this.children[a].drawTrack(b)},addIntersectingItemsInRangeToSelection:function(b,a,c,e,d){for(var g=0;g<this.tracks_.length;g++){var h=this.tracks_[g].getBoundingClientRect(),k=Math.max(c,h.top),h=Math.min(e,h.bottom);k<=h&&this.tracks_[g].addIntersectingItemsInRangeToSelection(b,a,c,e,d)}tracing.tracks.Track.prototype.addIntersectingItemsInRangeToSelection.apply(this,arguments)},addAllObjectsMatchingFilterToSelection:function(b,a){for(var c=0;c<this.tracks_.length;c++)this.tracks_[c].addAllObjectsMatchingFilterToSelection(b,
+a)}};return{ContainerTrack:d}});"use strict";
+base.exportTo("tracing",function(){function d(b,a,c,e){this.ctx_=b;this.minRectSize_=a;this.maxMergeDist_=c;this.pallette_=e}d.prototype={y_:0,h_:0,merging_:!1,mergeStartX_:0,mergeCurRight_:0,setYandH:function(b,a){this.flush();this.y_=b;this.h_=a},fillRect:function(b,a,c){var e=b+a;a<this.minRectSize_?(e-this.mergeStartX_>this.maxMergeDist_&&this.flush(),this.merging_?(this.mergeCurRight_=e,this.mergedColorId=Math.max(this.mergedColorId,c)):(this.merging_=!0,this.mergeStartX_=b,this.mergeCurRight_=
+e,this.mergedColorId=c)):(this.merging_&&this.flush(),this.ctx_.fillStyle=this.pallette_[c],this.ctx_.fillRect(b,this.y_,a,this.h_))},flush:function(){this.merging_&&(this.ctx_.fillStyle=this.pallette_[this.mergedColorId],this.ctx_.fillRect(this.mergeStartX_,this.y_,this.mergeCurRight_-this.mergeStartX_,this.h_),this.merging_=!1)}};return{FastRectRenderer:d}});"use strict";base.requireStylesheet("tracing.tracks.slice_track");base.require("base.sorted_array_utils");base.require("tracing.tracks.heading_track");
+base.require("tracing.fast_rect_renderer");base.require("tracing.color_scheme");base.require("ui");
+base.exportTo("tracing.tracks",function(){function d(){}function b(a,b){this.string=a;this.width=b}var a=tracing.getColorPalette(),c=ui.define("slice-track",tracing.tracks.HeadingTrack);c.prototype={__proto__:tracing.tracks.HeadingTrack.prototype,SHOULD_ELIDE_TEXT:!0,decorate:function(a){tracing.tracks.HeadingTrack.prototype.decorate.call(this,a);this.classList.add("slice-track");this.elidedTitleCache=new d;this.asyncStyle_=!1;this.slices_=null},get asyncStyle(){return this.asyncStyle_},set asyncStyle(a){this.asyncStyle_=
+!!a},get slices(){return this.slices_},set slices(a){this.slices_=a||[]},get height(){return window.getComputedStyle(this).height},set height(a){this.style.height=a},get hasVisibleContent(){return 0<this.slices.length},labelWidth:function(a){var b=this.context(),c=f[a];c||(c=b.measureText(a).width,f[a]=c);return c+2},labelWidthWorld:function(a,b){return this.labelWidth(a)*b},draw:function(a,b,c){switch(a){case tracing.tracks.DrawType.SLICE:this.drawSlices_(b,c)}},drawSlices_:function(b,c){var d=this.context(),
+f=window.devicePixelRatio||1,g=this.getBoundingClientRect().height*f,p=this.viewport,q=p.xViewVectorToWorld(1);d.save();p.applyTransformToCanvas(d);this.asyncStyle_&&(d.globalAlpha=.25);var s=new tracing.FastRectRenderer(d,2*q,2*q,a);s.setYandH(0,g);for(var u=this.slices_,w=base.findLowIndexInSortedArray(u,function(a){return a.start+a.duration},b),t=w;t<u.length;++t){var r=u[t],v=r.start;if(v>c)break;var x=Math.max(r.duration,.001),y=r.selected?r.colorId+e:r.colorId;x<q&&(x=q);0<r.duration?s.fillRect(v,
+x,y):.001<q?s.fillRect(v,q,y):(d.fillStyle=a[y],d.beginPath(),d.moveTo(v-4*q,g),d.lineTo(v,0),d.lineTo(v+4*q,g),d.closePath(),d.fill())}s.flush();d.restore();if(8<g)for(d.textAlign="center",d.textBaseline="top",d.font=10*f+"px sans-serif",d.strokeStyle="rgb(0,0,0)",d.fillStyle="rgb(0,0,0)",g=20*q,s=this.SHOULD_ELIDE_TEXT,t=w;t<u.length;++t){r=u[t];if(r.start>c)break;r.duration<=g||(w=r.title+(r.didNotFinish?" (Did Not Finish)":""),v=this.labelWidth(w),s&&this.labelWidthWorld(w,q)>r.duration&&(v=this.elidedTitleCache.get(this,
+q,w,v,r.duration),w=v.string,v=v.width),v*q<r.duration&&(r=p.xWorldToView(r.start+.5*r.duration),d.fillText(w,r,2.5*f,v)))}},addIntersectingItemsInRangeToSelectionInWorldSpace:function(a,b,c,e){base.iterateOverIntersectingIntervals(this.slices_,function(a){return a.start},function(a){return a.duration},a,b,function(a){a=e.addSlice(this,a);this.decorateHit(a)}.bind(this))},indexOfSlice_:function(a){for(var b=base.findLowIndexInSortedArray(this.slices_,function(a){return a.start},a.start);b<this.slices_.length&&
+a.start==this.slices_[b].start&&a.colorId!=this.slices_[b].colorId;)b++;return b<this.slices_.length?b:void 0},addItemNearToProvidedHitToSelection:function(a,b,c){if(!a.slice)return!1;a=this.indexOfSlice_(a.slice);if(void 0===a)return!1;b=a+b;if(0>b||b>=this.slices_.length)return!1;a=c.addSlice(this,this.slices_[b]);this.decorateHit(a);return!0},addAllObjectsMatchingFilterToSelection:function(a,b){for(var c=0;c<this.slices_.length;++c)if(a.matchSlice(this.slices_[c])){var e=b.addSlice(this,this.slices_[c]);
+this.decorateHit(e)}}};var e=tracing.getColorPaletteHighlightIdBoost(),f={},g={};d.prototype={get:function(a,c,e,d,f){var p=g[e];p||(p={},g[e]=p);d=p[c];d||(p[c]={},d=p[c]);p=d[f];if(void 0===p){for(p=!1;a.labelWidthWorld(e,c)>f&&!(1>.75*e.length);)e=e.substring(0,.75*e.length),p=!0;p&&3<e.length&&(e=e.substring(0,e.length-3)+"...");p=new b(e,a.labelWidth(e));d[f]=p}return p}};return{SliceTrack:c}});"use strict";base.require("tracing.tracks.container_track");base.require("tracing.tracks.slice_track");
+base.require("tracing.filter");base.require("tracing.trace_model");base.require("ui");
+base.exportTo("tracing.tracks",function(){var d=ui.define("cpu-track",tracing.tracks.ContainerTrack);d.prototype={__proto__:tracing.tracks.ContainerTrack.prototype,decorate:function(b){tracing.tracks.ContainerTrack.prototype.decorate.call(this,b);this.classList.add("cpu-track")},get cpu(){return this.cpu_},set cpu(b){this.cpu_=b;this.updateContents_()},get tooltip(){return this.tooltip_},set tooltip(b){this.tooltip_=b;this.updateContents_()},get hasVisibleContent(){return 0<this.children.length},
+updateContents_:function(){this.detach();if(this.cpu_){var b=tracing.filterSliceArray(this.categoryFilter_,this.cpu_.slices);if(b.length){var a=new tracing.tracks.SliceTrack(this.viewport);a.slices=b;a.heading="CPU "+this.cpu_.cpuNumber+":";this.appendChild(a)}for(var c in this.cpu_.counters){b=this.cpu_.counters[c];if(!this.categoryFilter_.matchCounter(b))break;a=new tracing.tracks.CounterTrack(this.viewport);a.heading="CPU "+this.cpu_.cpuNumber+" "+b.name+":";a.counter=b;a.categoryFilter=this.categoryFilter_;
+this.appendChild(a)}}}};return{CpuTrack:d}});"use strict";base.requireStylesheet("tracing.tracks.object_instance_track");base.require("base.sorted_array_utils");base.require("tracing.tracks.heading_track");base.require("tracing.color_scheme");base.require("ui");
+base.exportTo("tracing.tracks",function(){var d=tracing.getColorPalette(),b=tracing.getColorPaletteHighlightIdBoost(),a=ui.define("object-instance-track",tracing.tracks.HeadingTrack);a.prototype={__proto__:tracing.tracks.HeadingTrack.prototype,decorate:function(a){tracing.tracks.HeadingTrack.prototype.decorate.call(this,a);this.classList.add("object-instance-track");this.objectInstances_=[];this.objectSnapshots_=[]},get objectInstances(){return this.objectInstances_},set objectInstances(a){a&&0!=
+a.length?(this.heading=a[0].typeName,this.objectInstances_=a,this.objectSnapshots_=[],this.objectInstances_.forEach(function(a){this.objectSnapshots_.push.apply(this.objectSnapshots_,a.snapshots)},this)):(this.heading="",this.objectInstances_=[],this.objectSnapshots_=[])},get height(){return window.getComputedStyle(this).height},set height(a){this.style.height=a},get snapshotRadiusView(){return 7*(window.devicePixelRatio||1)},draw:function(a,b,d){switch(a){case tracing.tracks.DrawType.SLICE:this.drawSlices_(b,
+d)}},drawSlices_:function(a,e){var f=this.context(),g=window.devicePixelRatio||1,h=this.getBoundingClientRect().height*g,k=.5*h,l=2*Math.PI,m=this.viewport,n=this.snapshotRadiusView,p=m.xViewVectorToWorld(h),q;f.save();m.applyTransformToCanvas(f);var s=this.objectInstances_;q=base.findLowIndexInSortedArray(s,function(a){return a.deletionTs},a);f.globalAlpha=.25;for(f.strokeStyle="rgb(0,0,0)";q<s.length;++q){var u=s[q],w=u.creationTs;if(w>e)break;var t=u.selected?u.colorId+b:u.colorId,u=u.deletionTs==
+Number.MAX_VALUE?e:u.deletionTs;f.fillStyle=d[t];f.fillRect(w,g,u-w,h-2*g)}f.globalAlpha=1;f.restore();g=this.objectSnapshots_;for(q=base.findLowIndexInSortedArray(g,function(a){return a.ts+p},a);q<g.length;++q){h=g[q];w=h.ts;if(w-p>e)break;w=m.xWorldToView(w);t=h.selected?h.objectInstance.colorId+b:h.objectInstance.colorId;f.fillStyle=d[t];f.beginPath();f.arc(w,k,n,0,l);f.fill();h.selected?(f.lineWidth=5,f.strokeStyle="rgb(100,100,0)",f.stroke(),f.beginPath(),f.arc(w,k,n-1,0,l),f.lineWidth=2,f.strokeStyle=
+"rgb(255,255,0)"):(f.lineWidth=1,f.strokeStyle="rgb(0,0,0)");f.stroke()}f.lineWidth=1},addIntersectingItemsInRangeToSelectionInWorldSpace:function(a,b,d,g){function h(a){g.addObjectInstance(k,a)}var k=this,l=!1,m=d*this.snapshotRadiusView;base.iterateOverIntersectingIntervals(this.objectSnapshots_,function(a){return a.ts-m},function(a){return 2*m},a,b,function(a){g.addObjectSnapshot(k,a);l=!0});l||base.iterateOverIntersectingIntervals(this.objectInstances_,function(a){return a.creationTs},function(a){return a.deletionTs-
+a.creationTs},a,b,h)},addItemNearToProvidedHitToSelection:function(a,b,d){if(a instanceof tracing.SelectionObjectSnapshotHit){if(a=this.objectSnapshots_.indexOf(a.objectSnapshot),b=a+b,0<=b&&b<this.objectSnapshots_.length)return d.addObjectSnapshot(this,this.objectSnapshots_[b]),!0}else if(a instanceof tracing.SelectionObjectInstanceHit){if(a=this.objectInstances_.indexOf(a.objectInstance),b=a+b,0<=b&&b<this.objectInstances_.length)return d.addObjectInstance(this,this.objectInstances_[b]),!0}else throw Error("Unrecognized hit");
+return!1},addAllObjectsMatchingFilterToSelection:function(a,b){}};a.typeNameToTrackConstructorMap={};a.register=function(b,e){if(a.typeNameToTrackConstructorMap[b])throw Error("Handler already registered for "+b);a.typeNameToTrackConstructorMap[b]=e};a.getTrackConstructor=function(b){return a.typeNameToTrackConstructorMap[b]};return{ObjectInstanceTrack:a}});"use strict";base.requireStylesheet("tcmalloc.heap_instance_track");base.require("base.sorted_array_utils");base.require("tracing.tracks.heading_track");
+base.require("tracing.tracks.object_instance_track");base.require("tracing.color_scheme");base.require("ui");
+base.exportTo("tcmalloc",function(){var d=tracing.getColorPalette(),b=tracing.getColorPaletteHighlightIdBoost(),a=ui.define("heap-instance-track",tracing.tracks.HeadingTrack);a.prototype={__proto__:tracing.tracks.HeadingTrack.prototype,decorate:function(a){tracing.tracks.HeadingTrack.prototype.decorate.call(this,a);this.classList.add("heap-instance-track");this.objectInstance_=null},set objectInstances(a){if(a){if(1!=a.length)throw Error("Bad object instance count.");this.objectInstance_=a[0];this.maxBytes_=
+this.computeMaxBytes_(this.objectInstance_.snapshots)}else this.objectInstance_=[]},computeMaxBytes_:function(a){for(var b=0,d=0;d<a.length;d++){for(var g=a[d],h=Object.keys(g.heap_.children),k=0,l=0;l<h.length;l++)k+=g.heap_.children[h[l]].currentBytes;k>b&&(b=k)}return b},get height(){return window.getComputedStyle(this).height},set height(a){this.style.height=a},draw:function(a,b,d){switch(a){case tracing.tracks.DrawType.SLICE:this.drawSlices_(b,d)}},drawSlices_:function(a,e){var f=this.context(),
+g=window.devicePixelRatio||1,h=this.getBoundingClientRect(),k=h.width*g,g=h.height*g,h=this.viewport,l=this.maxBytes_,m=this.objectInstance_.snapshots,n=base.findLowIndexInSortedArray(m,function(a){return a.ts},a);for(0<n&&--n;n<m.length;++n){var p=m[n],q=p.ts;if(q>e)break;q=h.xWorldToView(q);0>q&&(q=0);var s=h.xWorldToView(n<m.length-1?m[n+1].ts:m[m.length-1].ts+5E3);s>k&&(s=k);for(var q=Math.floor(q),s=Math.floor(s),u=g,w=Object.keys(p.heap_.children),t=w.length-1;0<=t;t--){var r=p.heap_.children[w[t]];
+f.fillStyle=this.objectInstance_.selectedTraces&&0<this.objectInstance_.selectedTraces.length&&this.objectInstance_.selectedTraces[0]==w[t]?"rgb(239, 248, 206)":d[(p.selected?p.objectInstance.colorId+b:p.objectInstance.colorId)+t];r=g*r.currentBytes/l;f.fillRect(q,u-r,Math.max(s-q,1),r);u-=r}}f.lineWidth=1},addIntersectingItemsInRangeToSelectionInWorldSpace:function(a,b,d,g){var h=this;base.iterateOverIntersectingIntervals(this.objectInstance_.snapshots,function(a){return a.ts},function(a){return 5E3},
+a,b,function(a){g.addObjectSnapshot(h,a)})},addItemNearToProvidedHitToSelection:function(a,b,d){if(a instanceof tracing.SelectionObjectSnapshotHit){var g=this.objectInstance_.snapshots;a=g.indexOf(a.objectSnapshot)+b;if(0<=a&&a<g.length)return d.addObjectSnapshot(this,g[a]),!0}else throw Error("Unrecognized hit");return!1},addAllObjectsMatchingFilterToSelection:function(a,b){}};tracing.tracks.ObjectInstanceTrack.register("memory::Heap",a);return{HeapInstanceTrack:a}});"use strict";base.requireStylesheet("tracing.tracks.counter_track");
+base.require("tracing.tracks.heading_track");base.require("tracing.color_scheme");base.require("ui");
+base.exportTo("tracing.tracks",function(){var d=tracing.getColorPalette(),b=ui.define("counter-track",tracing.tracks.HeadingTrack);b.prototype={__proto__:tracing.tracks.HeadingTrack.prototype,decorate:function(a){tracing.tracks.HeadingTrack.prototype.decorate.call(this,a);this.classList.add("counter-track");this.selectedSamples_={};this.categoryFilter_=new tracing.Filter},decorateHit:function(a){},get counter(){return this.counter_},set counter(a){this.counter_=a;this.heading=a.name+": "},get categoryFilter(){return this.categoryFilter_},
+set categoryFilter(a){this.categoryFilter_=a},get selectedSamples(){return this.selectedSamples_},draw:function(a,b,e){switch(a){case tracing.tracks.DrawType.SLICE:this.drawSlices_(b,e)}},drawSlices_:function(a,b){var e=this.context(),f=window.devicePixelRatio||1,f=this.getBoundingClientRect().height*f,g=this.counter_,h=this.viewport,k=h.xViewVectorToWorld(1),l=h.xViewVectorToWorld(1);e.save();h.applyTransformToCanvas(e);for(var h=g.numSeries,m=g.numSamples,n=base.findLowIndexInSortedArray(g.timestamps,
+function(a){return a},a),n=0<n-1?n-1:0,p=f/g.maxTotal,q=g.numSeries-1;0<=q;q--){e.fillStyle=d[g.series[q].color];e.beginPath();for(var s=n-1,u=0<=s?g.timestamps[s]-l:-1,w=f,t=!1;;){s+=1;if(s>=m){e.lineTo(u,w);e.lineTo(u+8*k,w);e.lineTo(u+8*k,f);break}var r=g.timestamps[s],v=g.totals[s*h+q],v=f-p*v;if(r>b){e.lineTo(r,w);e.lineTo(r,f);break}if(s+1<m){var x=g.timestamps[s+1];if(x-u<=l&&x<b)continue}t||(e.moveTo(a,f),t=!0);r-u<l&&(r=u+l);e.lineTo(r,w);e.lineTo(r,v);u=r;w=v}e.closePath();e.fill()}e.fillStyle=
+"rgba(255, 0, 0, 1)";for(s in this.selectedSamples_)if(this.selectedSamples_[s])for(r=g.timestamps[s],q=g.numSeries-1;0<=q;q--)v=g.totals[s*h+q],v=f-p*v,e.fillRect(r-k,v-1,3*k,3);e.restore()},addIntersectingItemsInRangeToSelectionInWorldSpace:function(a,b,e,d){function g(a,b){return b===h.timestamps.length-1?0:h.timestamps[b+1]-h.timestamps[b]}var h=this.counter_;a=base.findLowIndexInSortedIntervals(h.timestamps,function(a){return a},g,a);for(b=base.findLowIndexInSortedIntervals(h.timestamps,function(a){return a},
+g,b);a<=b;a++)0>a||a>=h.timestamps.length||(e=d.addCounterSample(this,this.counter,a),this.decorateHit(e))},addAllObjectsMatchingFilterToSelection:function(a,b){}};return{CounterTrack:b}});"use strict";base.requireStylesheet("tracing.tracks.spacing_track");base.require("tracing.tracks.heading_track");
+base.exportTo("tracing.tracks",function(){var d=ui.define("spacing-track",tracing.tracks.HeadingTrack);d.prototype={__proto__:tracing.tracks.HeadingTrack.prototype,decorate:function(b){tracing.tracks.HeadingTrack.prototype.decorate.call(this,b);this.classList.add("spacing-track")},draw:function(b,a,c){},addAllObjectsMatchingFilterToSelection:function(b,a){}};return{SpacingTrack:d}});"use strict";base.require("base.sorted_array_utils");base.require("tracing.tracks.container_track");base.require("ui");
+base.exportTo("tracing.tracks",function(){var d=ui.define("slice-group-track",tracing.tracks.ContainerTrack);d.prototype={__proto__:tracing.tracks.ContainerTrack.prototype,decorate:function(b){tracing.tracks.ContainerTrack.prototype.decorate.call(this,b);this.classList.add("slice-group-track");this.heading_=this.tooltip_=""},get group(){return this.group_},set group(b){this.group_=b;this.updateContents_()},get heading(){return this.heading_},set heading(b){this.heading_=b;this.updateContents_()},
+get tooltip(){return this.tooltip_},set tooltip(b){this.tooltip_=b;this.updateContents_()},set decorateHit(b){this.decorateHit_=b;this.updateContents_()},addSliceTrack_:function(b){var a=new tracing.tracks.SliceTrack(this.viewport);a.slices=b;a.decorateHit=this.decorateHit_;a.categoryFilter_=this.categoryFilter;this.appendChild(a);return a},get subRows(){return base.asArray(this.children).map(function(b){return b.slices})},get hasVisibleContent(){return 0<this.children.length},updateContents_:function(){if(this.group_){var b=
+tracing.filterSliceArray(this.categoryFilter,this.group_.slices);if(this.areArrayContentsSame_(this.filteredSlices_,b))this.updateHeadingAndTooltip_();else if(this.filteredSlices_=b,this.detach(),b.length){for(var b=this.buildSubRows_(b),a=0;a<b.length;a++){var c=b[a];c.length&&this.addSliceTrack_(c)}this.updateHeadingAndTooltip_()}}else this.updateHeadingAndTooltip_()},updateHeadingAndTooltip_:function(){this.firstChild&&(this.firstChild.heading=this.heading_,this.firstChild.tooltip=this.tooltip_)},
+buildSubRows_:function(b){if(!b.length)return[];for(var a=[],c=0;c<b.length;c++)b[c].subSlices&&b[c].subSlices.splice(0,b[c].subSlices.length),a.push(c);a.sort(function(a,c){var e=b[a],d=b[c];return e.start!=d.start?e.start-d.start:c-a});var e=[[]];this.badSlices_=[];for(c=0;c<a.length;c++){for(var d=b[a[c]],g=!1,h=e.length-1;0<=h;h--)if(0!=e[h].length){var k=e[h][e[h].length-1];d.start<k.start&&(this.badSlices_.push(d),g=!0);if(d.start>=k.start&&d.end<=k.end){for(;e.length<=h+1;)e.push([]);e[h+1].push(d);
+k.subSlices&&k.subSlices.push(d);g=!0;break}}g||e[0].push(d)}return e},areArrayContentsSame_:function(b,a){if(!(b&&a&&b.length&&a.length)||b.length!=a.length)return!1;for(var c=0;c<b.length;++c)if(b[c]!=a[c])return!1;return!0}};return{SliceGroupTrack:d}});"use strict";base.require("tracing.tracks.slice_group_track");base.require("ui");
+base.exportTo("tracing.tracks",function(){var d=ui.define("async-slice-group-track",tracing.tracks.SliceGroupTrack);d.prototype={__proto__:tracing.tracks.SliceGroupTrack.prototype,decorate:function(b){tracing.tracks.SliceGroupTrack.prototype.decorate.call(this,b);this.classList.add("async-slice-group-track")},addSliceTrack_:function(b){b=tracing.tracks.SliceGroupTrack.prototype.addSliceTrack_.call(this,b);b.asyncStyle=!0;return b},buildSubRows_:function(){var b=tracing.filterSliceArray(this.categoryFilter,
+this.group_.slices);b.sort(function(a,b){return a.start-b.start});for(var a=[],c=0;c<b.length;c++){for(var e=b[c],d=!1,g=0;g<a.length;g++){var h=a[g];if(e.start>=h[h.length-1].end){d=!0;if(void 0===e.subSlices||1>e.subSlices.length)throw Error("AsyncEvent missing subSlices: ")+e.name;for(g=0;g<e.subSlices.length;g++)h.push(e.subSlices[g]);break}}if(!d&&(h=[],void 0!==e.subSlices)){for(g=0;g<e.subSlices.length;g++)h.push(e.subSlices[g]);a.push(h)}}return a}};return{AsyncSliceGroupTrack:d}});"use strict";
+base.requireStylesheet("tracing.tracks.thread_track");base.require("tracing.tracks.container_track");base.require("tracing.tracks.slice_track");base.require("tracing.tracks.slice_group_track");base.require("tracing.tracks.async_slice_group_track");base.require("tracing.filter");base.require("ui");
+base.exportTo("tracing.tracks",function(){var d=ui.define("thread-track",tracing.tracks.ContainerTrack);d.prototype={__proto__:tracing.tracks.ContainerTrack.prototype,decorate:function(b){tracing.tracks.ContainerTrack.prototype.decorate.call(this,b);this.classList.add("thread-track")},get thread(){return this.thread_},set thread(b){this.thread_=b;this.updateContents_()},get hasVisibleContent(){return 0<this.tracks_.length},updateContents_:function(){this.detach();if(this.thread_){this.heading=this.thread_.userFriendlyName+
+": ";this.tooltip=this.thread_.userFriendlyDetails;if(this.thread_.asyncSliceGroup.length){var b=new tracing.tracks.AsyncSliceGroupTrack(this.viewport);b.categoryFilter=this.categoryFilter;b.decorateHit=function(a){};b.group=this.thread_.asyncSliceGroup;b.hasVisibleContent&&this.appendChild(b)}this.thread_.samples.length&&(b=new tracing.tracks.SliceTrack(this.viewport),b.categoryFilter=b,b.group=this.thread_,b.slices=this.thread_.samples,b.decorateHit=function(a){a.thread=this.thread_},this.appendChild(b));
+this.thread_.cpuSlices&&(b=new tracing.tracks.SliceTrack(this.viewport),b.categoryFilter=this.categoryFilter,b.heading="",b.height="4px",b.decorateHit=function(a){a.thread=this.thread_},b.slices=this.thread_.cpuSlices,b.hasVisibleContent&&this.appendChild(b));this.thread_.sliceGroup.length&&(b=new tracing.tracks.SliceGroupTrack(this.viewport),b.categoryFilter=this.categoryFilter,b.heading=this.thread_.userFriendlyName,b.tooltip=this.thread_.userFriendlyDetails,b.decorateHit=function(a){a.thread=this.thread_},
+b.group=this.thread_.sliceGroup,b.hasVisibleContent&&this.appendChild(b))}},collapsedDidChange:function(b){if(b){b=parseInt(this.tracks[0].height);for(var a=0;a<this.tracks.length;++a)2<b?this.tracks[a].height=Math.floor(b)+"px":this.tracks[a].style.display="none",b*=.5}else for(a=0;a<this.tracks.length;++a)this.tracks[a].height=this.tracks[0].height,this.tracks[a].style.display=""}};return{ThreadTrack:d}});"use strict";base.require("ui");base.require("base.settings");
+base.exportTo("ui",function(){function d(a){var b=document.createElement("span");a&&(a.className&&(b.className=a.className),a.textContent&&(b.textContent=a.textContent),a.parent&&a.parent.appendChild(b));return b}var b=1;return{createSpan:d,createDiv:function(a){var b=document.createElement("div");a&&(a.className&&(b.className=a.className),a.parent&&a.parent.appendChild(b));return b},createScopedStyle:function(a){var b=document.createElement("style");b.scoped=!0;b.innerHTML=a;return b},createSelector:function(a,
+b,d,f,g){function h(f){f=n.selectedOptions[0].targetPropertyValue;base.Settings.set(d,f);a[b]=f}for(var k,l=0;l<g.length;l++){var m=g[l];if(m.value==f){k=l;break}}if(void 0===k)throw Error("defaultValue must be in the items list");var n=document.createElement("select");n.addEventListener("change",h);for(l=0;l<g.length;l++){var m=g[l],p=document.createElement("option");p.textContent=m.label;p.targetPropertyValue=m.value;n.appendChild(p)}a.__lookupSetter__("selectedIndex");n.__defineGetter__("selectedValue",
+function(a){return n.children[n.selectedIndex].targetPropertyValue});n.__defineSetter__("selectedValue",function(a){for(var b=0;b<n.children.length;b++)if(n.children[b].targetPropertyValue==a){n.selectedIndex=b;h();return}throw Error("Not a valid value");});g=base.Settings.get(d,f);m=!1;for(l=0;l<n.children.length;l++)if(n.children[l].targetPropertyValue==g){m=!0;a[b]=g;n.selectedIndex=l;break}m||(n.selectedIndex=k,a[b]=f);return n},createCheckBox:function(a,c,e,f,g){function h(){base.Settings.set(e,
+k.checked);a[c]=k.checked}var k=document.createElement("input");k.type="checkbox";f=base.Settings.get(e,f);k.checked=!!f;a[c]=f;k.addEventListener("change",h);f="#checkbox-"+b++;var l=d({className:"labeled-checkbox"});k.setAttribute("id",f);var m=document.createElement("label");m.textContent=g;m.setAttribute("for",f);l.appendChild(k);l.appendChild(m);l.__defineSetter__("checked",function(a){k.checked=!!a;h()});l.__defineGetter__("checked",function(){return k.checked});return l}}});"use strict";base.require("tcmalloc.heap_instance_track");
+base.require("tracing.analysis.object_snapshot_view");base.require("tracing.analysis.object_instance_view");base.require("tracing.tracks.container_track");base.require("tracing.tracks.counter_track");base.require("tracing.tracks.object_instance_track");base.require("tracing.tracks.spacing_track");base.require("tracing.tracks.thread_track");base.require("tracing.trace_model_settings");base.require("tracing.filter");base.require("ui");base.require("ui.dom_helpers");base.requireStylesheet("tracing.tracks.process_track_base");
+base.exportTo("tracing.tracks",function(){var d=tracing.analysis.ObjectSnapshotView,b=tracing.analysis.ObjectInstanceView,a=tracing.TraceModelSettings,c=tracing.tracks.SpacingTrack,e=ui.define("process-track-base",tracing.tracks.ContainerTrack);e.prototype={__proto__:tracing.tracks.ContainerTrack.prototype,decorate:function(a){tracing.tracks.ContainerTrack.prototype.decorate.call(this,a);this.processBase_=void 0;this.classList.add("process-track-base");this.classList.add("expanded");this.expandEl_=
+document.createElement("expand-button");this.expandEl_.classList.add("expand-button-expanded");this.processNameEl_=ui.createSpan();this.headerEl_=ui.createDiv({className:"process-track-header"});this.headerEl_.appendChild(this.expandEl_);this.headerEl_.appendChild(this.processNameEl_);this.headerEl_.addEventListener("click",this.onHeaderClick_.bind(this));this.appendChild(this.headerEl_)},get processBase(){return this.processBase_},set processBase(b){if(this.processBase_=b)this.expanded=(new a(this.processBase_.model)).getSettingFor(this.processBase_,
+"expanded",!0);this.updateContents_()},get expanded(){return this.expandEl_.classList.contains("expand-button-expanded")},set expanded(b){b=!!b;this.expandEl_.classList.contains("expand-button-expanded")!==b&&(b?(this.classList.add("expanded"),this.expandEl_.classList.add("expand-button-expanded")):(this.classList.remove("expanded"),this.expandEl_.classList.remove("expand-button-expanded")),this.viewport_.dispatchChangeEvent(),this.processBase_&&(new a(this.processBase_.model)).setSettingFor(this.processBase_,
+"expanded",b))},get hasVisibleContent(){return this.expanded?1<this.children.length:!0},onHeaderClick_:function(a){a.stopPropagation();a.preventDefault();this.expanded=!this.expanded},updateContents_:function(){this.tracks_.forEach(function(a){this.removeChild(a)},this);this.processBase_&&(this.processNameEl_.textContent=this.processBase_.userFriendlyName,this.headerEl_.title=this.processBase_.userFriendlyDetails,this.willAppendTracks_(),this.appendObjectInstanceTracks_(),this.appendCounterTracks_(),
+this.appendThreadTracks_(),this.didAppendTracks_())},willAppendTracks_:function(){},didAppendTracks_:function(){},appendObjectInstanceTracks_:function(){var a=this.processBase_.objects.getAllInstancesByTypeName(),e=base.dictionaryKeys(a);e.sort();var h=!1;e.forEach(function(c){var e=a[c],g=b.getViewInfo(c),n=d.getViewInfo(c);g&&!g.options.showInTrackView&&(g=void 0);n&&!n.options.showInTrackView&&(n=void 0);for(var n=g||n,g=[],p=0;p<e.length;p++){var q=e[p];0!==q.snapshots.length&&(q.hasImplicitSnapshots&&
+!n||g.push(q))}0!==g.length&&(c=tracing.tracks.ObjectInstanceTrack.getTrackConstructor(c),c||(c=tracing.tracks.ObjectInstanceTrack),c=new c(this.viewport),c.categoryFilter=this.categoryFilter_,c.objectInstances=g,this.appendChild(c),h=!0)},this);h&&this.appendChild(new c(this.viewport))},appendCounterTracks_:function(){var a=base.dictionaryValues(this.processBase.counters).filter(this.categoryFilter.matchCounter,this.categoryFilter);a.sort(tracing.trace_model.Counter.compare);a.forEach(function(a){var b=
+new tracing.tracks.CounterTrack(this.viewport);b.categoryFilter=this.categoryFilter_;b.counter=a;this.appendChild(b);this.appendChild(new c(this.viewport))}.bind(this))},appendThreadTracks_:function(){var a=base.dictionaryValues(this.processBase.threads).filter(function(a){return this.categoryFilter_.matchThread(a)},this);a.sort(tracing.trace_model.Thread.compare);a.forEach(function(a){var b=new tracing.tracks.ThreadTrack(this.viewport);b.categoryFilter=this.categoryFilter_;b.thread=a;b.hasVisibleContent&&
+(this.appendChild(b),this.appendChild(new c(this.viewport)))}.bind(this))}};return{ProcessTrackBase:e}});"use strict";base.require("tracing.tracks.process_track_base");base.require("tracing.tracks.cpu_track");base.require("tracing.tracks.spacing_track");
+base.exportTo("tracing.tracks",function(){var d=tracing.tracks.ProcessTrackBase,b=tracing.tracks.SpacingTrack,a=ui.define("kernel-track",d);a.prototype={__proto__:d.prototype,decorate:function(a){tracing.tracks.ProcessTrackBase.prototype.decorate.call(this,a)},set kernel(a){this.processBase=a},get kernel(){return this.processBase},willAppendTracks_:function(){var a=this.categoryFilter,d=base.dictionaryValues(this.kernel.cpus);d.sort(tracing.trace_model.Cpu.compare);for(var f=!1,g=0;g<d.length;++g){var h=
+d[g];if(!a.matchCpu(h))return;var k=new tracing.tracks.CpuTrack(this.viewport);k.categoryFilter=a;k.cpu=h;k.hasVisibleContent&&(this.appendChild(k),f=!0)}f&&this.appendChild(new b(this.viewport))}};return{KernelTrack:a}});"use strict";base.require("tracing.tracks.process_track_base");
+base.exportTo("tracing.tracks",function(){var d=tracing.tracks.ProcessTrackBase,b=ui.define("process-track",d);b.prototype={__proto__:d.prototype,decorate:function(a){tracing.tracks.ProcessTrackBase.prototype.decorate.call(this,a)},drawTrack:function(a){switch(a){case tracing.tracks.DrawType.INSTANT_EVENT:if(!this.processBase.instantEvents||0===this.processBase.instantEvents.length)break;var b=this.context();if(void 0===b)break;b.save();var d=this.setupCanvasForDraw_();this.drawInstantEvents_(this.processBase.instantEvents,
+d.left,d.right);b.restore()}tracing.tracks.ContainerTrack.prototype.drawTrack.call(this,a)},set process(a){this.processBase=a},get process(){return this.processBase},addIntersectingItemsInRangeToSelectionInWorldSpace:function(a,b,d,f){base.iterateOverIntersectingIntervals(this.processBase.instantEvents,function(a){return a.start},function(a){return a.duration},a,b,function(a){a=f.addSlice(this,a);this.decorateHit(a)}.bind(this));tracing.tracks.ContainerTrack.prototype.addIntersectingItemsInRangeToSelectionInWorldSpace.apply(this,
+arguments)}};return{ProcessTrack:b}});"use strict";base.requireStylesheet("tracing.tracks.trace_model_track");base.require("base.measuring_stick");base.require("tracing.tracks.container_track");base.require("tracing.tracks.kernel_track");base.require("tracing.tracks.process_track");base.require("ui");
+base.exportTo("tracing.tracks",function(){var d=ui.define("trace-model-track",tracing.tracks.ContainerTrack);d.prototype={__proto__:tracing.tracks.ContainerTrack.prototype,decorate:function(b){tracing.tracks.ContainerTrack.prototype.decorate.call(this,b);this.classList.add("model-track")},detach:function(){tracing.tracks.ContainerTrack.prototype.detach.call(this)},get model(){return this.model_},set model(b){this.model_=b;this.updateContents_()},get hasVisibleContent(){return 0<this.children.length},
+applyCategoryFilter_:function(){this.updateContents_()},updateContents_:function(){this.textContent="";if(this.model_&&this.categoryFilter){var b=this.categoryFilter;this.appendKernelTrack_();var a=this.model_.getAllProcesses();a.sort(tracing.trace_model.Process.compare);for(var c=0;c<a.length;++c){var d=a[c];if(!b.matchProcess(d))break;var f=new tracing.tracks.ProcessTrack(this.viewport);f.categoryFilter=b;f.process=d;f.hasVisibleContent&&this.appendChild(f)}}},appendKernelTrack_:function(){if(this.categoryFilter.matchProcess(this.model.kernel)){var b=
+new tracing.tracks.KernelTrack(this.viewport);b.categoryFilter=this.categoryFilter;b.kernel=this.model.kernel;b.hasVisibleContent&&this.appendChild(b)}},drawTrack:function(b){switch(b){case tracing.tracks.DrawType.INSTANT_EVENT:if(!this.model_.instantEvents||0===this.model_.instantEvents.length)break;var a=this.context();if(void 0===a)break;a.save();var c=this.setupCanvasForDraw_();this.drawInstantEvents_(this.model_.instantEvents,c.left,c.right);a.restore()}tracing.tracks.ContainerTrack.prototype.drawTrack.call(this,
+b)},addIntersectingItemsInRangeToSelectionInWorldSpace:function(b,a,c,d){base.iterateOverIntersectingIntervals(this.model_.instantEvents,function(a){return a.start},function(a){return a.duration},b,a,function(a){a=d.addSlice(this,a);this.decorateHit(a)}.bind(this));tracing.tracks.ContainerTrack.prototype.addIntersectingItemsInRangeToSelectionInWorldSpace.apply(this,arguments)}};return{TraceModelTrack:d}});"use strict";base.requireStylesheet("ui.tool_button");base.requireStylesheet("ui.mouse_mode_selector");
+base.requireTemplate("ui.mouse_mode_selector");base.require("base.events");base.require("tracing.mouse_mode_constants");base.require("ui");
+base.exportTo("ui",function(){var d=ui.define("div");d.prototype={__proto__:HTMLDivElement.prototype,decorate:function(b){this.classList.add("mouse-mode-selector");this.parentEl_=b;b=base.instantiateTemplate("#mouse-mode-selector-template");this.appendChild(b);this.buttonsEl_=this.querySelector(".buttons");this.dragHandleEl_=this.querySelector(".drag-handle");this.panScanModeButton_=this.buttonsEl_.querySelector(".pan-scan-mode-button");this.selectionModeButton_=this.buttonsEl_.querySelector(".selection-mode-button");
+this.zoomModeButton_=this.buttonsEl_.querySelector(".zoom-mode-button");this.pos_={x:base.Settings.get("mouse_mode_selector.x",window.innerWidth-50),y:base.Settings.get("mouse_mode_selector.y",100)};this.constrainPositionToWindowBounds_();this.updateStylesFromPosition_();this.isDraggingModeSelectorDragHandle_=!1;this.initialRelativeMouseDownPos_={x:0,y:0};this.dragHandleEl_.addEventListener("mousedown",this.onDragHandleMouseDown_.bind(this));document.addEventListener("mousemove",this.onDragHandleMouseMove_.bind(this));
+document.addEventListener("mouseup",this.onDragHandleMouseUp_.bind(this));window.addEventListener("resize",this.onWindowResize_.bind(this));this.buttonsEl_.addEventListener("mouseup",this.onButtonMouseUp_);this.buttonsEl_.addEventListener("mousedown",this.onButtonMouseDown_);this.buttonsEl_.addEventListener("click",this.onButtonPress_.bind(this));document.addEventListener("mousemove",this.onMouseMove_.bind(this));document.addEventListener("mouseup",this.onMouseUp_.bind(this));this.parentEl_.addEventListener("mousedown",
+this.onMouseDown_.bind(this));document.addEventListener("keypress",this.onKeyPress_.bind(this));document.addEventListener("keydown",this.onKeyDown_.bind(this));document.addEventListener("keyup",this.onKeyUp_.bind(this));this.mode=base.Settings.get("mouse_mode_selector.mouseMode",tracing.mouseModeConstants.MOUSE_MODE_PANSCAN);this.isInteracting_=this.isInTemporaryAlternativeMouseMode_=!1},get mode(){return this.currentMode_},set mode(b){if(this.currentMode_!==b){var a=tracing.mouseModeConstants;this.currentMode_=
+b;this.panScanModeButton_.classList.remove("active");this.selectionModeButton_.classList.remove("active");this.zoomModeButton_.classList.remove("active");switch(b){case a.MOUSE_MODE_PANSCAN:this.panScanModeButton_.classList.add("active");break;case a.MOUSE_MODE_SELECTION:this.selectionModeButton_.classList.add("active");break;case a.MOUSE_MODE_ZOOM:this.zoomModeButton_.classList.add("active");break;default:throw Error("Unknown selection mode: "+b);}base.Settings.set("mouse_mode_selector.mouseMode",
+b)}},getCurrentModeEventNames_:function(){var b=tracing.mouseModeConstants,a={begin:"",update:"",end:""};switch(this.mode){case b.MOUSE_MODE_PANSCAN:a.begin="beginpan";a.update="updatepan";a.end="endpan";break;case b.MOUSE_MODE_SELECTION:a.begin="beginselection";a.update="updateselection";a.end="endselection";break;case b.MOUSE_MODE_ZOOM:a.begin="beginzoom";a.update="updatezoom";a.end="endzoom";break;default:throw Error("Unsupported interaction mode");}return a},onMouseDown_:function(b){var a=this.getCurrentModeEventNames_(),
+a=new base.Event(a.begin,!0,!0);a.data=b;this.dispatchEvent(a);this.isInteracting_=!0},onMouseMove_:function(b){var a=this.getCurrentModeEventNames_(),a=new base.Event(a.update,!0,!0);a.data=b;this.dispatchEvent(a)},onMouseUp_:function(b){var a=this.getCurrentModeEventNames_(),a=new base.Event(a.end,!0,!0),c=!b.shiftKey,d=base.isMac&&!b.metaKey||!base.isMac&&!b.ctrlKey;a.data=b;this.dispatchEvent(a);this.isInteracting_=!1;this.isInTemporaryAlternativeMouseMode_&&c&&d&&(this.mode=tracing.mouseModeConstants.MOUSE_MODE_PANSCAN)},
+onButtonMouseDown_:function(b){b.preventDefault();b.stopImmediatePropagation()},onButtonMouseUp_:function(b){b.preventDefault();b.stopImmediatePropagation()},onButtonPress_:function(b){var a=tracing.mouseModeConstants;switch(b.target){case this.panScanModeButton_:this.mode=a.MOUSE_MODE_PANSCAN;break;case this.selectionModeButton_:this.mode=a.MOUSE_MODE_SELECTION;break;case this.zoomModeButton_:this.mode=a.MOUSE_MODE_ZOOM;break;default:throw Error("Unknown mouse mode button pressed");}b.preventDefault();
+this.isInTemporaryAlternativeMouseMode_=!1},onKeyPress_:function(b){if(!this.isInteracting_){var a=tracing.mouseModeConstants;switch(b.keyCode){case 49:this.mode=a.MOUSE_MODE_PANSCAN;break;case 50:this.mode=a.MOUSE_MODE_SELECTION;break;case 51:this.mode=a.MOUSE_MODE_ZOOM}}},onKeyDown_:function(b){if(!this.isInteracting_){var a=tracing.mouseModeConstants,c=base.isMac&&b.metaKey||!base.isMac&&b.ctrlKey,d=b.shiftKey;this.mode===a.MOUSE_MODE_PANSCAN&&(c||d)&&(this.mode=c?a.MOUSE_MODE_ZOOM:a.MOUSE_MODE_SELECTION,
+this.isInTemporaryAlternativeMouseMode_=!0,b.preventDefault())}},onKeyUp_:function(b){if(!this.isInteracting_){var a=tracing.mouseModeConstants,c=base.isMac&&!b.metaKey||!base.isMac&&!b.ctrlKey;b=b.shiftKey;this.isInTemporaryAlternativeMouseMode_&&(c||b)&&(this.mode=a.MOUSE_MODE_PANSCAN);this.isInTemporaryAlternativeMouseMode_=!1}},constrainPositionToWindowBounds_:function(){var b=window.innerHeight-this.offsetHeight,a=window.innerWidth-this.offsetWidth;this.pos_.x=Math.max(this.pos_.x,0);this.pos_.x=
+Math.min(this.pos_.x,a);this.pos_.y=Math.max(this.pos_.y,0);this.pos_.y=Math.min(this.pos_.y,b)},updateStylesFromPosition_:function(){this.style.left=this.pos_.x+"px";this.style.top=this.pos_.y+"px";base.Settings.set("mouse_mode_selector.x",this.pos_.x);base.Settings.set("mouse_mode_selector.y",this.pos_.y)},onDragHandleMouseDown_:function(b){b.preventDefault();b.stopImmediatePropagation();this.isDraggingModeSelectorDragHandle_=!0;this.initialRelativeMouseDownPos_.x=b.clientX-this.offsetLeft;this.initialRelativeMouseDownPos_.y=
+b.clientY-this.offsetTop},onDragHandleMouseMove_:function(b){this.isDraggingModeSelectorDragHandle_&&(this.pos_.x=b.clientX-this.initialRelativeMouseDownPos_.x,this.pos_.y=b.clientY-this.initialRelativeMouseDownPos_.y,this.constrainPositionToWindowBounds_(),this.updateStylesFromPosition_())},onDragHandleMouseUp_:function(b){this.isDraggingModeSelectorDragHandle_=!1},onWindowResize_:function(b){this.constrainPositionToWindowBounds_();this.updateStylesFromPosition_()}};return{MouseModeSelector:d}});
+"use strict";base.requireStylesheet("tracing.timeline_track_view");base.require("base.events");base.require("base.properties");base.require("base.settings");base.require("tracing.filter");base.require("tracing.selection");base.require("tracing.timeline_viewport");base.require("tracing.mouse_mode_constants");base.require("tracing.tracks.drawing_container");base.require("tracing.tracks.trace_model_track");base.require("tracing.tracks.ruler_track");base.require("ui");base.require("ui.mouse_mode_selector");
+base.exportTo("tracing",function(){var d=tracing.Selection,b=tracing.TimelineViewport,a=ui.define("div");a.prototype={__proto__:HTMLDivElement.prototype,model_:null,decorate:function(){this.classList.add("timeline-track-view");this.categoryFilter_=new tracing.CategoryFilter;this.viewport_=new b(this);this.viewportStateAtMouseDown_=null;this.rulerTrackContainer_=new tracing.tracks.DrawingContainer(this.viewport_);this.appendChild(this.rulerTrackContainer_);this.rulerTrackContainer_.invalidate();this.rulerTrack_=
+new tracing.tracks.RulerTrack(this.viewport_);this.rulerTrackContainer_.appendChild(this.rulerTrack_);this.modelTrackContainer_=new tracing.tracks.DrawingContainer(this.viewport_);this.appendChild(this.modelTrackContainer_);this.modelTrackContainer_.style.display="block";this.modelTrackContainer_.invalidate();this.viewport_.modelTrackContainer=this.modelTrackContainer_;this.modelTrack_=new tracing.tracks.TraceModelTrack(this.viewport_);this.modelTrackContainer_.appendChild(this.modelTrack_);this.mouseModeSelector_=
+new ui.MouseModeSelector(this);this.appendChild(this.mouseModeSelector_);this.dragBox_=this.ownerDocument.createElement("div");this.dragBox_.className="drag-box";this.appendChild(this.dragBox_);this.hideDragBox_();this.bindEventListener_(document,"keypress",this.onKeypress_,this);this.bindEventListener_(document,"beginpan",this.onBeginPanScan_,this);this.bindEventListener_(document,"updatepan",this.onUpdatePanScan_,this);this.bindEventListener_(document,"endpan",this.onEndPanScan_,this);this.bindEventListener_(document,
+"beginselection",this.onBeginSelection_,this);this.bindEventListener_(document,"updateselection",this.onUpdateSelection_,this);this.bindEventListener_(document,"endselection",this.onEndSelection_,this);this.bindEventListener_(document,"beginzoom",this.onBeginZoom_,this);this.bindEventListener_(document,"updatezoom",this.onUpdateZoom_,this);this.bindEventListener_(document,"endzoom",this.onEndZoom_,this);this.bindEventListener_(document,"keydown",this.onKeydown_,this);this.bindEventListener_(document,
+"keyup",this.onKeyup_,this);this.addEventListener("mousemove",this.onMouseMove_);this.addEventListener("dblclick",this.onDblClick_);this.mouseViewPosAtMouseDown_={x:0,y:0};this.lastMouseViewPos_={x:0,y:0};this.selection_=new d;this.isZooming_=this.isPanningAndScanning_=!1},distanceCoveredInPanScan_:function(a){a=this.lastMouseViewPos_.x-this.mouseViewPosAtMouseDown_.x;var b=this.lastMouseViewPos_.y-this.mouseViewPosAtMouseDown_.y;return Math.sqrt(a*a+b*b)},bindEventListener_:function(a,b,d,g){this.boundListeners_||
+(this.boundListeners_=[]);d=d.bind(g);this.boundListeners_.push({object:a,event:b,boundFunc:d});a.addEventListener(b,d)},detach:function(){this.modelTrack_.detach();for(var a=0;a<this.boundListeners_.length;a++){var b=this.boundListeners_[a];b.object.removeEventListener(b.event,b.boundFunc)}this.boundListeners_=void 0;this.viewport_.detach()},get viewport(){return this.viewport_},get categoryFilter(){return this.categoryFilter_},set categoryFilter(a){this.modelTrackContainer_.invalidate();this.categoryFilter_=
+a;this.modelTrack_.categoryFilter=a},get model(){return this.model_},set model(a){if(!a)throw Error("Model cannot be null");var b=this.model_!=a;this.model_=a;this.modelTrack_.model=a;this.modelTrack_.categoryFilter=this.categoryFilter;b&&this.viewport_.setWhenPossible(this.setInitialViewport_.bind(this));base.setPropertyAndDispatchChange(this,"model",a)},get hasVisibleContent(){return this.modelTrack_.hasVisibleContent},setInitialViewport_:function(){var a=this.modelTrackContainer_.canvas.width,
+b,d;this.model_.bounds.isEmpty?(b=0,d=1E3):0==this.model_.bounds.range?(b=this.model_.bounds.min,d=1E3):(b=this.model_.bounds.min,d=this.model_.bounds.range);var g=.15*d;this.viewport_.xSetWorldBounds(b-g,b+d+g,a)},addAllObjectsMatchingFilterToSelection:function(a,b){this.modelTrack_.addAllObjectsMatchingFilterToSelection(a,b)},get focusElement(){return this.focusElement_?this.focusElement_:this.parentElement},set focusElement(a){this.focusElement_=a},get listenToKeys_(){return!this.viewport_.isAttachedToDocument_||
+this.activeElement instanceof tracing.FindControl?!1:this.focusElement_?0<=this.focusElement.tabIndex?document.activeElement==this.focusElement?!0:ui.elementIsChildOf(document.activeElement,this.focusElement):!0:!0},onMouseMove_:function(a){this.isZooming_||this.storeLastMousePos_(a)},onKeypress_:function(a){var b=this.viewport_;if(this.listenToKeys_&&"INPUT"!=document.activeElement.nodeName){var d=this.modelTrackContainer_.canvas.clientWidth;switch(a.keyCode){case 119:case 44:this.zoomBy_(1.5);break;
+case 115:case 111:this.zoomBy_(1/1.5);break;case 103:this.onGridToggle_(!0);break;case 71:this.onGridToggle_(!1);break;case 87:case 60:this.zoomBy_(10);break;case 83:case 79:this.zoomBy_(.1);break;case 97:b.panX+=b.xViewVectorToWorld(.1*d);break;case 100:case 101:b.panX-=b.xViewVectorToWorld(.1*d);break;case 65:b.panX+=b.xViewVectorToWorld(.5*d);break;case 68:b.panX-=b.xViewVectorToWorld(.5*d);break;case 48:case 122:this.setInitialViewport_();break;case 102:this.zoomToSelection()}}},onKeydown_:function(a){if(this.listenToKeys_){var b,
+d=this.viewport_,g=this.modelTrackContainer_.canvas.clientWidth;switch(a.keyCode){case 37:(b=this.selection.getShiftedSelection(-1))?(this.selection=b,this.panToSelection(),a.preventDefault()):d.panX+=d.xViewVectorToWorld(.1*g);break;case 39:(b=this.selection.getShiftedSelection(1))?(this.selection=b,this.panToSelection(),a.preventDefault()):d.panX-=d.xViewVectorToWorld(.1*g);break;case 9:-1==this.focusElement.tabIndex&&(a.shiftKey?this.selectPrevious_(a):this.selectNext_(a),a.preventDefault())}}},
+onKeyup_:function(a){this.listenToKeys_&&(a.shiftKey||this.dragBeginEvent_&&this.setDragBoxPosition_(this.dragBoxXStart_,this.dragBoxYStart_,this.dragBoxXEnd_,this.dragBoxYEnd_))},zoomBy_:function(a){var b=this.viewport_,d=this.modelTrackContainer_.canvas.clientWidth,g=this.lastMouseViewPos_.x*(window.devicePixelRatio||1),h=b.xViewToWorld(g);b.scaleX*=a;b.xPanWorldPosToViewPos(h,g,d)},zoomToSelection:function(){if(this.selection&&this.selection.length){var a=this.selection.bounds;if(a.range){var b=
+a.center,a=.5*a.range,d=.5*a;this.viewport_.xSetWorldBounds(b-a-d,b+a+d,this.modelTrackContainer_.canvas.width)}}},panToSelection:function(){if(this.selection&&this.selection.length){var a=this.selection.bounds,b=a.center,d=this.modelTrackContainer_.canvas.width;if(a.range){var g=.5*a.range,h=.5*g;this.viewport_.xPanWorldBoundsIntoView(b-g-h,b+g+h,d);this.viewport_.xPanWorldBoundsIntoView(a.min,a.max,d)}else(0>this.viewport_.xWorldToView(a.center)||this.viewport_.xWorldToView(a.center)>d)&&this.viewport_.xPanWorldPosToViewPos(b,
+"center",d)}},get keyHelp(){var a="Qwerty Controls\n w/s : Zoom in/out (with shift: go faster)\n a/d : Pan left/right\n\nDvorak Controls\n ,/o : Zoom in/out (with shift: go faster)\n a/e : Pan left/right\n\nMouse Controls\n drag (Selection mode) : Select slices (with "+(0==navigator.platform.indexOf("Mac")?"cmd":"ctrl")+": zoom to slices)\n drag (Pan mode) : Pan left/right/up/down)\n\n",a=this.focusElement.tabIndex?
+a+" <- : Select previous event on current timeline\n -> : Select next event on current timeline\n":a+"General Navigation\n g/General : Shows grid at the start/end of the selected task\n <-,^TAB : Select previous event on current timeline\n ->, TAB : Select next event on current timeline\n";return a+"\nSpace to switch between select / pan modes\nShift to temporarily switch between select / pan modes\nScroll to zoom in/out (in pan mode)\nDbl-click to add timing markers\nf to zoom into selection\nz to reset zoom and pan to initial view\n/ to search\n"},
+get selection(){return this.selection_},set selection(a){if(!(a instanceof d))throw Error("Expected Selection");var b;for(b=0;b<this.selection_.length;b++)this.selection_[b].selected=!1;this.selection_.clear();this.selection_.addSelection(a);base.dispatchSimpleEvent(this,"selectionChange");for(b=0;b<this.selection_.length;b++)this.selection_[b].selected=!0;this.selection_.length&&this.selection_[0].track&&this.selection_[0].track.scrollIntoViewIfNeeded();this.viewport_.dispatchChangeEvent()},hideDragBox_:function(){this.dragBox_.style.left=
+"-1000px";this.dragBox_.style.top="-1000px";this.dragBox_.style.width=0;this.dragBox_.style.height=0},setDragBoxPosition_:function(a,b,d,g){var h=Math.min(b,g);g=Math.max(b,g);b=Math.min(a,d);a=Math.max(a,d);this.modelTrack_.getBoundingClientRect();d=b+(a-b);g=h+(g-h);var k=this.modelTrackContainer_.getBoundingClientRect(),l=k.left,m=k.top,n=k.right,k=k.bottom,p=window.getComputedStyle(this.querySelector("heading")).width,p=parseInt(p),l=l+p;p={};b>n||d<l||h>k||g<m?h=!1:(p.left=Math.max(l,b),p.top=
+Math.max(m,h),p.right=Math.min(n,d),p.bottom=Math.min(k,g),p.width=p.right-p.left,p.height=p.bottom-p.top,h=p);this.dragBox_.style.left=h.left+"px";this.dragBox_.style.width=h.width+"px";this.dragBox_.style.top=h.top+"px";this.dragBox_.style.height=h.height+"px";h=window.devicePixelRatio||1;d=this.modelTrackContainer_.canvas;b=this.viewport_.xViewToWorld((b-d.offsetLeft)*h);h=this.viewport_.xViewToWorld((a-d.offsetLeft)*h);a=Math.round(100*(h-b))/100;this.dragBox_.textContent=a+"ms";a=new base.Event("selectionChanging");
+a.loWX=b;a.hiWX=h;this.dispatchEvent(a)},onGridToggle_:function(a){var b=a?this.selection_.bounds.min:this.selection_.bounds.max;if(this.viewport_.gridEnabled&&this.viewport_.gridSide===a&&this.viewport_.gridTimebase===b)this.viewport_.gridside=void 0,this.viewport_.gridEnabled=!1,this.viewport_.gridTimebase=void 0;else{var d=Math.ceil((b-this.model_.bounds.min)/this.viewport_.gridStep_);this.viewport_.gridTimebase=b-(d+1)*this.viewport_.gridStep_;this.viewport_.gridEnabled=!0;this.viewport_.gridSide=
+a;this.viewport_.gridTimebase=b}},canBeginInteraction_:function(a){return 0!=a.button||ui.elementIsChildOf(a.target,this.rulerTrack_)?!1:!0},onDblClick_:function(a){if(this.isPanningAndScanning_){var b=new base.Event("endpan");b.data=a;this.onEndPanScan_(b)}this.isZooming_&&(b=new base.Event("endzoom"),b.data=a,this.onEndZoom_(b));this.rulerTrack_.placeAndBeginDraggingMarker(a.clientX);a.preventDefault()},storeLastMousePos_:function(a){this.lastMouseViewPos_=this.extractRelativeMousePosition_(a)},
+extractRelativeMousePosition_:function(a){var b=this.modelTrackContainer_.canvas;return{x:a.clientX-b.offsetLeft,y:a.clientY-b.offsetTop}},storeInitialMouseDownPos_:function(a){a=this.extractRelativeMousePosition_(a);this.mouseViewPosAtMouseDown_.x=a.x;this.mouseViewPosAtMouseDown_.y=a.y},focusElements_:function(){document.activeElement&&document.activeElement.blur();0<=this.focusElement.tabIndex&&this.focusElement.focus()},storeInitialInteractionPositionsAndFocus_:function(a){this.storeInitialMouseDownPos_(a);
+this.storeLastMousePos_(a);this.focusElements_()},onBeginPanScan_:function(a){var b=this.viewport_;a=a.data;this.canBeginInteraction_(a)&&(this.viewportStateAtMouseDown_=b.getStateInViewCoordinates(),this.isPanningAndScanning_=!0,this.storeInitialInteractionPositionsAndFocus_(a),a.preventDefault())},onUpdatePanScan_:function(a){this.isPanningAndScanning_&&(a=a.data,this.viewport_.setStateInViewCoordinates({panX:this.viewportStateAtMouseDown_.panX+(this.lastMouseViewPos_.x-this.mouseViewPosAtMouseDown_.x),
+panY:this.viewportStateAtMouseDown_.panY-(this.lastMouseViewPos_.y-this.mouseViewPosAtMouseDown_.y)}),a.preventDefault(),a.stopPropagation(),this.storeLastMousePos_(a))},onEndPanScan_:function(a){var b=a.data;this.isPanningAndScanning_=!1;this.storeLastMousePos_(b);4<this.distanceCoveredInPanScan_(b)||(this.dragBeginEvent_=b,this.onEndSelection_(a))},onBeginSelection_:function(a){a=a.data;if(this.canBeginInteraction_(a)){var b=this.modelTrackContainer_.canvas,d=this.modelTrack_.getBoundingClientRect(),
+b=b.getBoundingClientRect();d&&a.clientX>=d.left&&a.clientX<d.right&&a.clientY>=d.top&&a.clientY<d.bottom&&a.clientX>=b.left&&a.clientX<b.right&&(this.dragBeginEvent_=a,this.storeInitialInteractionPositionsAndFocus_(a),a.preventDefault())}},onUpdateSelection_:function(a){a=a.data;this.dragBeginEvent_&&(this.dragBoxXStart_=this.dragBeginEvent_.clientX,this.dragBoxXEnd_=a.clientX,this.dragBoxYStart_=this.dragBeginEvent_.clientY,this.dragBoxYEnd_=a.clientY,this.setDragBoxPosition_(this.dragBoxXStart_,
+this.dragBoxYStart_,this.dragBoxXEnd_,this.dragBoxYEnd_))},onEndSelection_:function(a){if(this.dragBeginEvent_){var b=a.data;this.hideDragBox_();var f=this.dragBeginEvent_||b;this.dragBeginEvent_=null;var g=Math.min(f.clientY,b.clientY),h=Math.max(f.clientY,b.clientY),k=Math.min(f.clientX,b.clientX),b=Math.max(f.clientX,b.clientX);this.modelTrackContainer_.getBoundingClientRect();f=this.modelTrackContainer_.canvas;k-=f.offsetLeft;b-=f.offsetLeft;f=new d;this.modelTrack_.addIntersectingItemsInRangeToSelection(k,
+b,g,h,f);this.selection=f;(base.isMac&&a.metaKey||!base.isMac&&a.ctrlKey)&&this.zoomToSelection_()}},onBeginZoom_:function(a){a=a.data;this.canBeginInteraction_(a)&&(this.isZooming_=!0,this.storeInitialInteractionPositionsAndFocus_(a),a.preventDefault())},onUpdateZoom_:function(a){if(this.isZooming_){a=a.data;var b=this.extractRelativeMousePosition_(a);this.zoomBy_(1+.01*(this.lastMouseViewPos_.y-b.y));this.storeLastMousePos_(a)}},onEndZoom_:function(a){this.isZooming_=!1}};return{TimelineTrackView:a}});
+"use strict";base.require("tracing.timeline_track_view");base.require("tracing.filter");base.require("ui.overlay");
+base.exportTo("tracing",function(){function d(){this.model_=this.timeline_=void 0;this.filterText_="";this.filterHits_=new tracing.Selection;this.filterHitsDirty_=!0;this.currentHitIndex_=-1}var b=ui.define("div");b.prototype={__proto__:ui.Overlay.prototype,decorate:function(){ui.Overlay.prototype.decorate.call(this);this.className="find-control";this.hitCountEl_=document.createElement("div");this.hitCountEl_.className="hit-count-label";this.hitCountEl_.textContent="1 of 7";var a=document.createElement("div");
+a.className="button find-previous";a.textContent="\u2190";a.addEventListener("click",this.findPrevious_.bind(this));var b=document.createElement("div");b.className="button find-next";b.textContent="\u2192";b.addEventListener("click",this.findNext_.bind(this));this.filterEl_=document.createElement("input");this.filterEl_.type="input";this.filterEl_.addEventListener("input",this.filterTextChanged_.bind(this));this.filterEl_.addEventListener("keydown",function(a){13==a.keyCode?a.shiftKey?this.findPrevious_():
+this.findNext_():27==a.keyCode&&(this.filterEl_.blur(),this.updateHitCountEl_())}.bind(this));this.filterEl_.addEventListener("blur",function(a){this.updateHitCountEl_()}.bind(this));this.filterEl_.addEventListener("focus",function(a){this.controller.reset();this.filterTextChanged_();this.filterEl_.select()}.bind(this));this.filterEl_.addEventListener("mouseup",function(a){a.preventDefault()});this.appendChild(this.filterEl_);this.appendChild(a);this.appendChild(b);this.appendChild(this.hitCountEl_);
+this.updateHitCountEl_()},get controller(){return this.controller_},set controller(a){this.controller_=a;this.updateHitCountEl_()},focus:function(){this.filterEl_.focus()},filterTextChanged_:function(){this.controller.filterText=this.filterEl_.value;this.updateHitCountEl_()},findNext_:function(){this.controller&&this.controller.findNext();this.updateHitCountEl_()},findPrevious_:function(){this.controller&&this.controller.findPrevious();this.updateHitCountEl_()},updateHitCountEl_:function(){if(this.controller&&
+document.activeElement==this.filterEl_){var a=this.controller.currentHitIndex,b=this.controller.filterHits.length;this.hitCountEl_.textContent=0==b?"0 of 0":a+1+" of "+b}else this.hitCountEl_.textContent=""}};d.prototype={__proto__:Object.prototype,get timeline(){return this.timeline_},set timeline(a){this.timeline_=a;this.filterHitsDirty_=!0},get filterText(){return this.filterText_},set filterText(a){a!=this.filterText_&&(this.filterText_=a,this.filterHitsDirty_=!0,this.showHits_(this.filterHits))},
+get filterHits(){if(this.filterHitsDirty_&&(this.filterHitsDirty_=!1,this.filterHits_.clear(),this.currentHitIndex_=-1,this.timeline_&&this.filterText.length)){var a=new tracing.TitleFilter(this.filterText);this.timeline.addAllObjectsMatchingFilterToSelection(a,this.filterHits_)}return this.filterHits_},get currentHitIndex(){return this.currentHitIndex_},showHits_:function(a,b,d){this.timeline&&(this.timeline.selection=a,b?this.timeline.zoomToSelection():d&&this.timeline.panToSelection())},find_:function(a){var b=
+-1===this.currentHitIndex_;b&&0>a&&(this.currentHitIndex_=0);var d=this.filterHits.length;this.currentHitIndex_=(this.currentHitIndex_+a+d)%d;a=this.filterHits.subSelection(this.currentHitIndex_);this.showHits_(a,b,!0)},findNext:function(){this.find_(1)},findPrevious:function(){this.find_(-1)},reset:function(){this.filterText_="";this.filterHitsDirty_=!0}};return{FindControl:b,FindController:d}});"use strict";base.require("ui");base.requireStylesheet("ui.drag_handle");
+base.exportTo("ui",function(){var d=ui.define("x-drag-handle");d.prototype={__proto__:HTMLDivElement.prototype,decorate:function(){this.lastMousePos_=0;this.onMouseMove_=this.onMouseMove_.bind(this);this.onMouseUp_=this.onMouseUp_.bind(this);this.addEventListener("mousedown",this.onMouseDown_);this.target_=void 0;this.horizontal=!0;this.observer_=new WebKitMutationObserver(this.didTargetMutate_.bind(this));this.targetSizesByModeKey_={}},get modeKey_(){return""==this.target_.className?".":this.target_.className},
+get target(){return this.target_},set target(b){this.observer_.disconnect();(this.target_=b)&&this.observer_.observe(this.target_,{attributes:!0,attributeFilter:["class"]})},get horizontal(){return this.horizontal_},set horizontal(b){this.className=(this.horizontal_=b)?"horizontal-drag-handle":"vertical-drag-handle"},get vertical(){return!this.horizontal_},set vertical(b){this.horizontal=!b},forceMutationObserverFlush_:function(){var b=this.observer_.takeRecords();b.length&&this.didTargetMutate_(b)},
+didTargetMutate_:function(b){b=this.targetSizesByModeKey_[this.modeKey_];void 0!==b?this.setTargetSize_(b):this.target_.style[this.targetStyleKey_]=""},get targetStyleKey_(){return this.horizontal_?"height":"width"},getTargetSize_:function(){var b=this.targetStyleKey_;this.target_.style[b]||(this.target_.style[b]=window.getComputedStyle(this.target_)[b]);b=parseInt(this.target_.style[b]);return this.targetSizesByModeKey_[this.modeKey_]=b},setTargetSize_:function(b){this.target_.style[this.targetStyleKey_]=
+b+"px";this.targetSizesByModeKey_[this.modeKey_]=b},applyDelta_:function(b){var a=this.getTargetSize_();if(this.target_==this.nextSibling)b=a+b;else{if(this.target_!=this.previousSibling)throw Error("Must be next sibling");b=a-b}this.setTargetSize_(b)},onMouseMove_:function(b){var a=this.horizontal_?b.clientY:b.clientX;this.applyDelta_(this.lastMousePos_-a);this.lastMousePos_=a;b.preventDefault();return!0},onMouseDown_:function(b){if(this.target_)return this.forceMutationObserverFlush_(),this.lastMousePos_=
+this.horizontal_?b.clientY:b.clientX,document.addEventListener("mousemove",this.onMouseMove_),document.addEventListener("mouseup",this.onMouseUp_),b.preventDefault(),!0},onMouseUp_:function(b){document.removeEventListener("mousemove",this.onMouseMove_);document.removeEventListener("mouseup",this.onMouseUp_);b.preventDefault()}};return{DragHandle:d}});"use strict";base.requireStylesheet("tracing.timeline_view");base.requireTemplate("tracing.timeline_view");base.require("base.utils");base.require("base.settings");
+base.require("tracing.analysis.analysis_view");base.require("tracing.category_filter_dialog");base.require("tracing.filter");base.require("tracing.find_control");base.require("tracing.timeline_track_view");base.require("ui.overlay");base.require("ui.drag_handle");
+base.exportTo("tracing",function(){var d=ui.define("div");d.prototype={__proto__:HTMLDivElement.prototype,decorate:function(){this.classList.add("timeline-view");var b=base.instantiateTemplate("#timeline-view-template");this.appendChild(b);this.titleEl_=this.querySelector(".title");this.leftControlsEl_=this.querySelector("#left-controls");this.rightControlsEl_=this.querySelector("#right-controls");this.timelineContainer_=this.querySelector(".container");this.categoryFilterButton_=this.createCategoryFilterButton_();
+this.categoryFilterButton_.callback=this.updateCategoryFilter_.bind(this);this.findCtl_=new tracing.FindControl;this.findCtl_.controller=new tracing.FindController;this.rightControls.appendChild(this.createImportErrorsButton_());this.rightControls.appendChild(this.categoryFilterButton_);this.rightControls.appendChild(this.createMetadataButton_());this.rightControls.appendChild(this.findCtl_);this.rightControls.appendChild(this.createHelpButton_());this.dragEl_=new ui.DragHandle;this.appendChild(this.dragEl_);
+this.analysisEl_=new tracing.analysis.AnalysisView;this.analysisEl_.addEventListener("requestSelectionChange",this.onRequestSelectionChange_.bind(this));this.appendChild(this.analysisEl_);this.onSelectionChanged_=this.onSelectionChanged_.bind(this);document.addEventListener("keypress",this.onKeypress_.bind(this),!0);this.dragEl_.target=this.analysisEl_},createImportErrorsButton_:function(){var b=base.instantiateTemplate("#import-errors-btn-template"),a=b.querySelector(".view-import-errors-button"),
+b=b.querySelector(".info-button-container"),c=b.querySelector(".info-button-text"),d=new ui.Overlay;d.classList.add("view-import-errors-overlay");d.obeyCloseEvents=!0;d.appendChild(b);a.addEventListener("click",function(){d.visible=!0;c.textContent=this.model.importErrors.join("\n")}.bind(this));b=function(){a.style.display=this.model&&this.model.importErrors.length?"":"none"}.bind(this);b();this.addEventListener("modelChange",b);return a},updateCategoryFilter_:function(b){this.timeline_&&(this.timeline_.categoryFilter=
+new tracing.CategoryFilter(b))},createCategoryFilterButton_:function(){var b=base.instantiateTemplate("#category-filter-btn-template").querySelector(".view-info-button");b.addEventListener("click",function(){var a=new tracing.CategoryFilterDialog;a.categories=this.model.categories;a.settings_key="categories";a.settingUpdatedCallback=this.updateCategoryFilter_.bind(this);a.visible=!0}.bind(this));var a=function(){b.style.display=this.model?"":"none"}.bind(this);a();this.addEventListener("modelChange",
+a);return b},createHelpButton_:function(){var b=base.instantiateTemplate("#help-btn-template"),a=b.querySelector(".view-help-button"),c=b.querySelector(".view-help-text"),d=new ui.Overlay;d.classList.add("view-help-overlay");d.obeyCloseEvents=!0;d.additionalCloseKeyCodes.push(63);d.appendChild(c);a.addEventListener("click",function(a){d.visible=!0;c.textContent=this.timeline_?this.timeline_.keyHelp:"No content loaded. For interesting help, load something.";a.stopPropagation();return!1}.bind(this));
+return a},createMetadataButton_:function(){var b=base.instantiateTemplate("#metadata-btn-template"),a=b.querySelector(".view-metadata-button"),b=b.querySelector(".info-button-container"),c=b.querySelector(".info-button-text"),d=new ui.Overlay;d.classList.add("view-metadata-overlay");d.obeyCloseEvents=!0;d.appendChild(b);a.addEventListener("click",function(){d.visible=!0;var a=[],b=this.model,h;for(h in b.metadata){var k=b.metadata[h],l=JSON.stringify(k.name),k=JSON.stringify(k.value,void 0," ");a.push(l+
+": "+k)}c.textContent=a.join("\n")}.bind(this));b=function(){a.style.display=this.model&&this.model.metadata.length?"":"none"}.bind(this);b();this.addEventListener("modelChange",b);return a},get leftControls(){return this.leftControlsEl_},get rightControls(){return this.rightControlsEl_},get viewTitle(){return this.titleEl_.textContent.substring(this.titleEl_.textContent.length-2)},set viewTitle(b){void 0===b?(this.titleEl_.textContent="",this.titleEl_.hidden=!0):(this.titleEl_.hidden=!1,this.titleEl_.textContent=
+b)},set traceData(b){this.model=new tracing.TraceModel(b)},get model(){if(this.timeline_)return this.timeline_.model},set model(b){var a=b!=this.model,c=b&&!b.bounds.isEmpty;a&&(this.timelineContainer_.textContent="",this.timeline_&&(this.timeline_.removeEventListener("selectionChange",this.onSelectionChanged_),this.timeline_.detach(),this.timeline_=void 0,this.findCtl_.controller.timeline=void 0));c&&!this.timeline_&&(this.timeline_=new tracing.TimelineTrackView,this.timeline_.focusElement=this.focusElement_?
+this.focusElement_:this.parentElement,this.timelineContainer_.appendChild(this.timeline_),this.findCtl_.controller.timeline=this.timeline_,this.timeline_.addEventListener("selectionChange",this.onSelectionChanged_),this.analysisEl_.clearSelectionHistory());c&&(this.timeline_.model=b);base.dispatchSimpleEvent(this,"modelChange");if(a)this.onSelectionChanged_()},get timeline(){return this.timeline_},get settings(){this.settings_||(this.settings_=new base.Settings);return this.settings_},set focusElement(b){this.focusElement_=
+b;this.timeline_&&(this.timeline_.focusElement=b)},get focusElement(){return this.focusElement_?this.focusElement_:this.parentElement},get isAttachedToDocument_(){for(var b=this;b.parentNode;)b=b.parentNode;return b==this.ownerDocument},get listenToKeys_(){if(this.isAttachedToDocument_)return this.focusElement_?0<=this.focusElement.tabIndex?document.activeElement==this.focusElement:!0:!0},onKeypress_:function(b){this.listenToKeys_&&(47==event.keyCode?(this.findCtl_.focus(),event.preventDefault()):
+63==b.keyCode&&(this.querySelector(".view-help-button").click(),b.preventDefault()))},beginFind:function(){if(!this.findInProgress_){this.findInProgress_=!0;var b=tracing.FindControl();b.controller=new tracing.FindController;b.controller.timeline=this.timeline;b.visible=!0;b.addEventListener("close",function(){this.findInProgress_=!1}.bind(this));b.addEventListener("findNext",function(){});b.addEventListener("findPrevious",function(){})}},onSelectionChanged_:function(b){b=this.timelineContainer_.scrollTop;
+var a=this.timeline_?this.timeline_.selection:new tracing.Selection;this.analysisEl_.selection=a;this.timelineContainer_.scrollTop=b},onRequestSelectionChange_:function(b){this.timeline_.selection=b.selection;b.stopPropagation()}};return{TimelineView:d}});"use strict";base.require("tracing.timeline_view");base.require("tracing.importer");
diff --git a/love2dToAPK/tools/tools/android-win/platform-tools/systrace/style.css b/love2dToAPK/tools/tools/android-win/platform-tools/systrace/style.css
new file mode 100644
index 0000000..eeddb89
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/platform-tools/systrace/style.css
@@ -0,0 +1 @@
+* WARNING:This file is generated by generate_standalone_timeline_view.py * * Do not edit directly. */.analysis-link{color:-webkit-link;cursor:pointer;text-decoration:underline}.analysis-link:hover{cursor:pointer}x-generic-object-view{display:block;font-family:monospace}.analysis-results{font-family:monospace;white-space:pre}.analysis-results *{-webkit-user-select:text!important;cursor:text}.analysis-table{border-collapse:collapse;border-width:0;margin-bottom:25px}.analysis-table>tr>td:first-child{padding-left:2px}.analysis-table>tr>td{padding:2px 4px 2px 4px}.analysis-table-header{text-align:left}.analysis-table-row{vertical-align:top}.analysis-table-row:nth-child(2n+0){background-color:#e2e2e2}.selection-changing-link{color:-webkit-link;cursor:pointer;text-decoration:underline}.analysis-slices-table-col-1,.analysis-slices-table-col-2{text-align:right}.default-object-snapshot-view #args{white-space:pre}.default-object-instance-view #snapshots>*{display:block}.default-object-view{overflow:auto}.default-object-view *{display:block;-webkit-user-select:text}.default-object-view .title,.default-object-view .title{border-bottom:1px solid #808080;font-size:110%;font-weight:bold}.default-object-view td,.default-object-view th{font-family:monospace;vertical-align:top}.analysis-view{background-color:white;display:-webkit-flex}.analysis-view:not(.viewing-object){overflow:auto}.analysis-view>*{-webkit-flex:1 0 auto}.overlay-root *{-webkit-user-select:none;box-sizing:border-box}.overlay-root{-webkit-flex-flow:row;-webkit-justify-content:center;-webkit-user-select:none;background:rgba(0,0,0,0.8);display:-webkit-flex;font-family:sans-serif;height:100%;left:0;position:fixed;top:0;width:100%;z-index:1000}.overlay-root:not([visible]){display:none}.overlay-root>.content-host{-webkit-flex-flow:column;-webkit-justify-content:center;-webkit-user-select:auto;display:-webkit-flex}.overlay *{-webkit-user-select:auto}.overlay-root>.content-host>*{background:#fff}.overlay-root>.content-host .tool-bar{cursor:pointer;display:-webkit-flex;height:24px;padding:1px}.overlay-root>.content-host .tool-bar .exit-button{background-color:rgba(0,0,0,0.8);border:1px solid white;color:white;height:100%;padding-left:4px;width:19px}.overlay{max-height:500px;overflow:auto;padding:8px}.track-button{background-color:rgba(255,255,255,0.5);border:1px solid rgba(0,0,0,0.1);color:rgba(0,0,0,0.2);font-size:10px;height:12px;text-align:center;width:12px}.track-button:hover{background-color:rgba(255,255,255,1.0);border:1px solid rgba(0,0,0,0.5);box-shadow:0 0 .05em rgba(0,0,0,0.4);color:rgba(0,0,0,1)}.track-close-button{left:2px;position:absolute;top:2px}.track-collapse-button{left:3px;position:absolute;top:2px}.drawing-container{-webkit-box-flex:1;display:inline;overflow:auto;position:relative}.drawing-container-canvas{-webkit-box-flex:1;display:block;pointer-events:none;position:absolute;top:0}.heading-track{-webkit-box-align:stretch;-webkit-box-orient:horizontal;display:-webkit-box;margin:0;padding:0 5px 0 0}.heading-track>heading{-webkit-box-sizing:border-box;background-color:rgba(214,221,229,0.3);border-right:1px solid #8e8e8e;box-sizing:border-box;display:block;overflow:hidden;padding-left:18px;padding-right:5px;text-align:left;text-overflow:ellipsis;white-space:nowrap}.ruler-track{height:12px}.ruler-track-with-distance-measurements{height:24px}.slice-track{height:18px}.object-instance-track{height:18px}.heap-instance-track{height:150px}.heap-instance-track ul{list-style:none;list-style-position:outside;margin:0;overflow:hidden}.counter-track{height:30px;position:relative}.spacing-track{height:4px}.thread-track{-webkit-box-orient:vertical;display:-webkit-box;position:relative}.process-track-header{-webkit-flex:0 0 auto;background-image:-webkit-gradient(linear,0 0,100% 0,from(#e5e5e5),to(#d1d1d1));border-bottom:1px solid #8e8e8e;border-top:1px solid white;font-size:75%}.process-track-base:not(.expanded)>.track{display:none}.process-track-header>expand-button{display:inline;padding:2px 4px 2px 4px}.process-track-header>expand-button.expand-button-expanded{content:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAABl0RVh0U29mdHdhcmUAUGFpbnQuTkVUIHYzLjUuNtCDrVoAAAAoSURBVChTY2CgKggNDVUHYnsUQ4EC//FhBoIKkI0DKlYAYhmqupsBAMwgJH8K5nKoAAAAAElFTkSuQmCC)}.process-track-header>expand-button:not(.expand-button-expanded){content:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAMAAADz0U65AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAwBQTFRFAAAAVVVVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASd3+7gAAAQB0Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AFP3ByUAAAAZdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjbQg61aAAAAGklEQVQYV2P4//8/IyOQYMBkMEIBA5yBWzEAD3Mj+VR5R78AAAAASUVORK5CYII=)}.model-track{-webkit-box-flex:1}.tool-button{background-position:center center;background-repeat:no-repeat;border-bottom:1px solid #bcbcbc;border-top:1px solid #f1f1f1;cursor:pointer;height:30px}.tool-button.active{cursor:auto}.mouse-mode-selector{-webkit-user-drag:element;-webkit-user-select:none;background:#DDD;border:1px solid #BBB;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,0.2);height:108px;left:calc(100% - 120px);position:fixed;top:100px;user-drag:element;user-select:none;width:29px;z-index:20}.mouse-mode-selector .drag-handle{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABkCAYAAADaIVPoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABV0RVh0Q3JlYXRpb24gVGltZQA3LzE2LzEzRNEKUwAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAlGSURBVHic7VxfSFPvH362taMLZxIqtAr8k01MwYQkaMGUVRfByEHxFYZ1E2oQBgrd7KZYUER1UaghonlR0CC7UWrrYhetGwum4kxksi4kdf6b25ye03Z+F/421B238579MXIPyM6fd5/nPHt9/+zzvO9Ejx8/Zq9fvw6TyYRUvP5tELEsy87MzKCkpASpeP3bIH7y5AkAIFWvfxsyNZyp4X+shkVOp5Pd74dIJ8T7/QDpRkbwv44DJ/jQfj+Aw+HAjx8/wDAMxOLEP/9QKASKolBTU4OKioqo+/sq2OFwYGRkBMeOHUNxcTFkMhlEIpHgeKFQCH6/Hy6XCyMjIwAQJXpfBY+OjuLkyZMoLy8HRVGQSCQJCWZZFjKZDLm5uRgfH8fo6GhyBK+uriIvL0/wg4URCoVQVFQEmUwGqVQaV3B4QrMXWJZFMBiERCJBcXExFhcXo8oQNxq32w2LxQK/30/61ihIJBLk5uZCKpWCoihQFAWpVMr5Nzk5iba2NiwvL+9ZZnuMI0eOQCKRJC54cnISAPD9+/eEBYvFYkgkEl5/b9++BQA8e/aMV3mKojg7QSLBs7OzmJ+fBwAsLCxgdnY2YdEikShuu7XZbLDb7QCAsbEx2Gw2wTGJBI+NjUWdMwxDEkIQuru7o859Pp+gWESCm5qaos4pihJETIJPnz5FncvlckGxiHppt9sd8zxVSCZvzBp2u90YGhriFWhoaAgul0vwg2zH6Ogo9Ho9r7J6vR5ms5l3bM7vwwzDYGJiAtPT0/yf8v/Iy8tDdXU1CgoK4pZ9//49Ll++jOzsbEilUgQCAQwMDGBwcJCYt6SkBHfu3EFlZSUYhsHGxgbMZjNu3LixoxxnDVutVkFiga1JidVqFdSDd3R0CBILbE1KOjo68O3bt5jlOAXrdDqUl5cLIj5+/DgaGxtjzoj2Ql9fH7RarSDec+fOwWQyob6+PmY5zk7L5/NBpVKhoqICX758wc2bNyP3Xr58GTm+e/du5PjNmze4ePEiTpw4Aa/Xi83NTeKHpmkaBoMB165dg8FgwOfPnyP3qqqqIsfj4+OR4ytXruD+/ftQqVTwer3Y2NiIycEpmGVZeDweyGQy6PV6zM3Ncb55+3W9Xo+1tTUsLy/zUxeDt7S0FMPDw7x4h4eHiXhjDks0TfMeApI5RKWSl2jisXuI4jtkJYrdQxTfIYsLRIIvXboU8zxVePToUcxzEhAJzsnJQXV1NQCguLgYOTk5golJUFZWFqnV+vp6lJWVCY5FJJimaVRWViI/Px/nz58HTdOCicNg2fg+AE3TuHXrFpRKJe7du8eLNxgMcl4nznhsbm6irq4Of/78IX0rJ9bX15GdnR23HMuyePXqFa+YLMtibW2N896+5rSkUilcLheOHDmyZ42QIhgMIhgM4tevX5BKpVH391VwVVUV7HY7RCIRioqK9kzL8EUwGMTKygpmZmbgdrtx9uzZqDL7KvjUqVMQiURwOByYn5+HWCxOOGsZCoVw6NAh1NTUoLS0NKpMxj3815ER/K/jwAnOuIfpRMY9/Fvdw2SB1D2MBz7u4b4K3u0eJjKtDCM8J0/IPQy3h2Qjnnv4/Plz3u5iUt1Dl8sFi8WSEuMsltNnNpvR3NxMbJwlxT1cXV3F0NAQVldXicgTxczMDPR6PZxOZ1LiEQ18DMPAYrEkzUPiC7/fj5aWFiIPaS8IGulHRkYiBnU68fTpU3R2diYUQ/DUZnp6GlarNS2G+HYMDg6ivb09PYb4brjdbpjN5rS367GxMbS0tAhq1wlPXtfX12G1WtPerufn59He3k7crgVPPPLz86HT6ZCVlYVQKASv14tAICA0HG8olUr09fVBLpcL4iWqYYqioNFoAACLi4uw2WyYm5vDwsJCSsXK5XIYjUYAwNTUFLq7uwXzEgm+evUqFAoFamtrAQATExNpab8vXryAWq1Ga2srAGBgYEDwuMxbsEajweHDhxEIBHDmzBnk5uYC2PrGk0oYjUaUlZUhEAigqakJCoUCANDV1SUoHi/BGo0GCoUiYnH4fD7U1dUB2FqgJnR5RDwYjUao1eodvA8fPgSw9UF/+PCBOCYvwQqFIqqt5OTkRJZFTExMEBPzgVqtjuItKyuLLIsYGBggjslLMFfHQNM0amtrQVFUyiYfe/G2tbVBLpcLWuCa0PfhjY0N3L59G2KxeM/lCfHAxz3kes/Xr19j8ibNPdxNvLCwkEgI3u4hCW/GPdyGjHuYTmTcwzTgwFktGcH/Og6c4Ix7mE5k3MOMe0iGlLmH4bROohsuSd3DcFqHawYVRjz3kFiwy+WC3W4HwzCorq5ObGUrh3u4F8xmMzo7O+H3+9Ha2gqdTrdn2VjuIW/BDMPAbrfvyD/b7XbMzs7iwoULnN9M+CDe3kOfz4eurq4d+eeuri7YbDY8ePCAcwlzwu5heGsOV7I9vJkrFbvUnE4nOjo6OJPtY2Nj0Ov1xElEXjVcUFCA//77Dx6PB+/evdtxr7GxEUePHsXq6mpS1k9vR3l5OUwmE5xOZ9RPVZlMJpw+fZqYl5dghmGwtLQU2Uq7HVNTUzE7kUQQ5v3582fUPavVKqjTJJracCXd4+0TSga4ftNHaBMiEsyVR1pZWRFETAIuL1poLpxIMFdadGlpSRAxCbgyk2kR7PV6o67RNJ1yU/z3799R13w+nyBTPG6nZbFY4hpmHz9+BLA180rWXqbm5ua4v8fV0NAAYGsr7evXr3nFjVvDOp2O17Z3iqJizn5I0d/fz2vbu1wuR39/P++4cQX7fL7IJxkLDQ0NgtddcIGmafT29sYt19vbSzQOxxXMsiwkEknECOeCRqOBRCIRZJvE4i0sLIwY4VwwGo0oLCwk4uXVaTEMA4VCwbmJury8HAqFIiUdF8MwUKvVnJuotVot1Go1MS/vXjoQCEClUiE/Pz9yLT8/HyqVKqXLHQKBAAwGA5RKZeSaUqmEwWAQxEs0LHk8Hmi12shv3mi1Wng8HmLS7eDz7+jxeNDT0wO5XA65XI6enp64vElzD7d3YsnopPi6h9s7sXidVFLdQ5Zlk9Y5kbqH4XUlsTZ6ZtzDXTjEsmxCiTO+2M3Dsmxa3MPdvCKHw8FmZWUlJIYPAoEAZDJZ5HxzcxP7wStOBymAHaQA0iKWi/fAeUsHTvD/AOsopsJRclbzAAAAAElFTkSuQmCC) 2px 3px no-repeat;background-repeat:no-repeat;border-bottom:1px solid #bcbcbc;cursor:move;display:block;height:13px;width:27px}.mouse-mode-selector .pan-scan-mode-button{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABkCAYAAADaIVPoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABV0RVh0Q3JlYXRpb24gVGltZQA3LzE2LzEzRNEKUwAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAlGSURBVHic7VxfSFPvH362taMLZxIqtAr8k01MwYQkaMGUVRfByEHxFYZ1E2oQBgrd7KZYUER1UaghonlR0CC7UWrrYhetGwum4kxksi4kdf6b25ye03Z+F/421B238579MXIPyM6fd5/nPHt9/+zzvO9Ejx8/Zq9fvw6TyYRUvP5tELEsy87MzKCkpASpeP3bIH7y5AkAIFWvfxsyNZyp4X+shkVOp5Pd74dIJ8T7/QDpRkbwv44DJ/jQfj+Aw+HAjx8/wDAMxOLEP/9QKASKolBTU4OKioqo+/sq2OFwYGRkBMeOHUNxcTFkMhlEIpHgeKFQCH6/Hy6XCyMjIwAQJXpfBY+OjuLkyZMoLy8HRVGQSCQJCWZZFjKZDLm5uRgfH8fo6GhyBK+uriIvL0/wg4URCoVQVFQEmUwGqVQaV3B4QrMXWJZFMBiERCJBcXExFhcXo8oQNxq32w2LxQK/30/61ihIJBLk5uZCKpWCoihQFAWpVMr5Nzk5iba2NiwvL+9ZZnuMI0eOQCKRJC54cnISAPD9+/eEBYvFYkgkEl5/b9++BQA8e/aMV3mKojg7QSLBs7OzmJ+fBwAsLCxgdnY2YdEikShuu7XZbLDb7QCAsbEx2Gw2wTGJBI+NjUWdMwxDEkIQuru7o859Pp+gWESCm5qaos4pihJETIJPnz5FncvlckGxiHppt9sd8zxVSCZvzBp2u90YGhriFWhoaAgul0vwg2zH6Ogo9Ho9r7J6vR5ms5l3bM7vwwzDYGJiAtPT0/yf8v/Iy8tDdXU1CgoK4pZ9//49Ll++jOzsbEilUgQCAQwMDGBwcJCYt6SkBHfu3EFlZSUYhsHGxgbMZjNu3LixoxxnDVutVkFiga1JidVqFdSDd3R0CBILbE1KOjo68O3bt5jlOAXrdDqUl5cLIj5+/DgaGxtjzoj2Ql9fH7RarSDec+fOwWQyob6+PmY5zk7L5/NBpVKhoqICX758wc2bNyP3Xr58GTm+e/du5PjNmze4ePEiTpw4Aa/Xi83NTeKHpmkaBoMB165dg8FgwOfPnyP3qqqqIsfj4+OR4ytXruD+/ftQqVTwer3Y2NiIycEpmGVZeDweyGQy6PV6zM3Ncb55+3W9Xo+1tTUsLy/zUxeDt7S0FMPDw7x4h4eHiXhjDks0TfMeApI5RKWSl2jisXuI4jtkJYrdQxTfIYsLRIIvXboU8zxVePToUcxzEhAJzsnJQXV1NQCguLgYOTk5golJUFZWFqnV+vp6lJWVCY5FJJimaVRWViI/Px/nz58HTdOCicNg2fg+AE3TuHXrFpRKJe7du8eLNxgMcl4nznhsbm6irq4Of/78IX0rJ9bX15GdnR23HMuyePXqFa+YLMtibW2N896+5rSkUilcLheOHDmyZ42QIhgMIhgM4tevX5BKpVH391VwVVUV7HY7RCIRioqK9kzL8EUwGMTKygpmZmbgdrtx9uzZqDL7KvjUqVMQiURwOByYn5+HWCxOOGsZCoVw6NAh1NTUoLS0NKpMxj3815ER/K/jwAnOuIfpRMY9/Fvdw2SB1D2MBz7u4b4K3u0eJjKtDCM8J0/IPQy3h2Qjnnv4/Plz3u5iUt1Dl8sFi8WSEuMsltNnNpvR3NxMbJwlxT1cXV3F0NAQVldXicgTxczMDPR6PZxOZ1LiEQ18DMPAYrEkzUPiC7/fj5aWFiIPaS8IGulHRkYiBnU68fTpU3R2diYUQ/DUZnp6GlarNS2G+HYMDg6ivb09PYb4brjdbpjN5rS367GxMbS0tAhq1wlPXtfX12G1WtPerufn59He3k7crgVPPPLz86HT6ZCVlYVQKASv14tAICA0HG8olUr09fVBLpcL4iWqYYqioNFoAACLi4uw2WyYm5vDwsJCSsXK5XIYjUYAwNTUFLq7uwXzEgm+evUqFAoFamtrAQATExNpab8vXryAWq1Ga2srAGBgYEDwuMxbsEajweHDhxEIBHDmzBnk5uYC2PrGk0oYjUaUlZUhEAigqakJCoUCANDV1SUoHi/BGo0GCoUiYnH4fD7U1dUB2FqgJnR5RDwYjUao1eodvA8fPgSw9UF/+PCBOCYvwQqFIqqt5OTkRJZFTExMEBPzgVqtjuItKyuLLIsYGBggjslLMFfHQNM0amtrQVFUyiYfe/G2tbVBLpcLWuCa0PfhjY0N3L59G2KxeM/lCfHAxz3kes/Xr19j8ibNPdxNvLCwkEgI3u4hCW/GPdyGjHuYTmTcwzTgwFktGcH/Og6c4Ix7mE5k3MOMe0iGlLmH4bROohsuSd3DcFqHawYVRjz3kFiwy+WC3W4HwzCorq5ObGUrh3u4F8xmMzo7O+H3+9Ha2gqdTrdn2VjuIW/BDMPAbrfvyD/b7XbMzs7iwoULnN9M+CDe3kOfz4eurq4d+eeuri7YbDY8ePCAcwlzwu5heGsOV7I9vJkrFbvUnE4nOjo6OJPtY2Nj0Ov1xElEXjVcUFCA//77Dx6PB+/evdtxr7GxEUePHsXq6mpS1k9vR3l5OUwmE5xOZ9RPVZlMJpw+fZqYl5dghmGwtLQU2Uq7HVNTUzE7kUQQ5v3582fUPavVKqjTJJracCXd4+0TSga4ftNHaBMiEsyVR1pZWRFETAIuL1poLpxIMFdadGlpSRAxCbgyk2kR7PV6o67RNJ1yU/z3799R13w+nyBTPG6nZbFY4hpmHz9+BLA180rWXqbm5ua4v8fV0NAAYGsr7evXr3nFjVvDOp2O17Z3iqJizn5I0d/fz2vbu1wuR39/P++4cQX7fL7IJxkLDQ0NgtddcIGmafT29sYt19vbSzQOxxXMsiwkEknECOeCRqOBRCIRZJvE4i0sLIwY4VwwGo0oLCwk4uXVaTEMA4VCwbmJury8HAqFIiUdF8MwUKvVnJuotVot1Go1MS/vXjoQCEClUiE/Pz9yLT8/HyqVKqXLHQKBAAwGA5RKZeSaUqmEwWAQxEs0LHk8Hmi12shv3mi1Wng8HmLS7eDz7+jxeNDT0wO5XA65XI6enp64vElzD7d3YsnopPi6h9s7sXidVFLdQ5Zlk9Y5kbqH4XUlsTZ6ZtzDXTjEsmxCiTO+2M3Dsmxa3MPdvCKHw8FmZWUlJIYPAoEAZDJZ5HxzcxP7wStOBymAHaQA0iKWi/fAeUsHTvD/AOsopsJRclbzAAAAAElFTkSuQmCC);background-position:0 -10px}.mouse-mode-selector .pan-scan-mode-button.active{background-position:-30px -10px}.mouse-mode-selector .selection-mode-button{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABkCAYAAADaIVPoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABV0RVh0Q3JlYXRpb24gVGltZQA3LzE2LzEzRNEKUwAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAlGSURBVHic7VxfSFPvH362taMLZxIqtAr8k01MwYQkaMGUVRfByEHxFYZ1E2oQBgrd7KZYUER1UaghonlR0CC7UWrrYhetGwum4kxksi4kdf6b25ye03Z+F/421B238579MXIPyM6fd5/nPHt9/+zzvO9Ejx8/Zq9fvw6TyYRUvP5tELEsy87MzKCkpASpeP3bIH7y5AkAIFWvfxsyNZyp4X+shkVOp5Pd74dIJ8T7/QDpRkbwv44DJ/jQfj+Aw+HAjx8/wDAMxOLEP/9QKASKolBTU4OKioqo+/sq2OFwYGRkBMeOHUNxcTFkMhlEIpHgeKFQCH6/Hy6XCyMjIwAQJXpfBY+OjuLkyZMoLy8HRVGQSCQJCWZZFjKZDLm5uRgfH8fo6GhyBK+uriIvL0/wg4URCoVQVFQEmUwGqVQaV3B4QrMXWJZFMBiERCJBcXExFhcXo8oQNxq32w2LxQK/30/61ihIJBLk5uZCKpWCoihQFAWpVMr5Nzk5iba2NiwvL+9ZZnuMI0eOQCKRJC54cnISAPD9+/eEBYvFYkgkEl5/b9++BQA8e/aMV3mKojg7QSLBs7OzmJ+fBwAsLCxgdnY2YdEikShuu7XZbLDb7QCAsbEx2Gw2wTGJBI+NjUWdMwxDEkIQuru7o859Pp+gWESCm5qaos4pihJETIJPnz5FncvlckGxiHppt9sd8zxVSCZvzBp2u90YGhriFWhoaAgul0vwg2zH6Ogo9Ho9r7J6vR5ms5l3bM7vwwzDYGJiAtPT0/yf8v/Iy8tDdXU1CgoK4pZ9//49Ll++jOzsbEilUgQCAQwMDGBwcJCYt6SkBHfu3EFlZSUYhsHGxgbMZjNu3LixoxxnDVutVkFiga1JidVqFdSDd3R0CBILbE1KOjo68O3bt5jlOAXrdDqUl5cLIj5+/DgaGxtjzoj2Ql9fH7RarSDec+fOwWQyob6+PmY5zk7L5/NBpVKhoqICX758wc2bNyP3Xr58GTm+e/du5PjNmze4ePEiTpw4Aa/Xi83NTeKHpmkaBoMB165dg8FgwOfPnyP3qqqqIsfj4+OR4ytXruD+/ftQqVTwer3Y2NiIycEpmGVZeDweyGQy6PV6zM3Ncb55+3W9Xo+1tTUsLy/zUxeDt7S0FMPDw7x4h4eHiXhjDks0TfMeApI5RKWSl2jisXuI4jtkJYrdQxTfIYsLRIIvXboU8zxVePToUcxzEhAJzsnJQXV1NQCguLgYOTk5golJUFZWFqnV+vp6lJWVCY5FJJimaVRWViI/Px/nz58HTdOCicNg2fg+AE3TuHXrFpRKJe7du8eLNxgMcl4nznhsbm6irq4Of/78IX0rJ9bX15GdnR23HMuyePXqFa+YLMtibW2N896+5rSkUilcLheOHDmyZ42QIhgMIhgM4tevX5BKpVH391VwVVUV7HY7RCIRioqK9kzL8EUwGMTKygpmZmbgdrtx9uzZqDL7KvjUqVMQiURwOByYn5+HWCxOOGsZCoVw6NAh1NTUoLS0NKpMxj3815ER/K/jwAnOuIfpRMY9/Fvdw2SB1D2MBz7u4b4K3u0eJjKtDCM8J0/IPQy3h2Qjnnv4/Plz3u5iUt1Dl8sFi8WSEuMsltNnNpvR3NxMbJwlxT1cXV3F0NAQVldXicgTxczMDPR6PZxOZ1LiEQ18DMPAYrEkzUPiC7/fj5aWFiIPaS8IGulHRkYiBnU68fTpU3R2diYUQ/DUZnp6GlarNS2G+HYMDg6ivb09PYb4brjdbpjN5rS367GxMbS0tAhq1wlPXtfX12G1WtPerufn59He3k7crgVPPPLz86HT6ZCVlYVQKASv14tAICA0HG8olUr09fVBLpcL4iWqYYqioNFoAACLi4uw2WyYm5vDwsJCSsXK5XIYjUYAwNTUFLq7uwXzEgm+evUqFAoFamtrAQATExNpab8vXryAWq1Ga2srAGBgYEDwuMxbsEajweHDhxEIBHDmzBnk5uYC2PrGk0oYjUaUlZUhEAigqakJCoUCANDV1SUoHi/BGo0GCoUiYnH4fD7U1dUB2FqgJnR5RDwYjUao1eodvA8fPgSw9UF/+PCBOCYvwQqFIqqt5OTkRJZFTExMEBPzgVqtjuItKyuLLIsYGBggjslLMFfHQNM0amtrQVFUyiYfe/G2tbVBLpcLWuCa0PfhjY0N3L59G2KxeM/lCfHAxz3kes/Xr19j8ibNPdxNvLCwkEgI3u4hCW/GPdyGjHuYTmTcwzTgwFktGcH/Og6c4Ix7mE5k3MOMe0iGlLmH4bROohsuSd3DcFqHawYVRjz3kFiwy+WC3W4HwzCorq5ObGUrh3u4F8xmMzo7O+H3+9Ha2gqdTrdn2VjuIW/BDMPAbrfvyD/b7XbMzs7iwoULnN9M+CDe3kOfz4eurq4d+eeuri7YbDY8ePCAcwlzwu5heGsOV7I9vJkrFbvUnE4nOjo6OJPtY2Nj0Ov1xElEXjVcUFCA//77Dx6PB+/evdtxr7GxEUePHsXq6mpS1k9vR3l5OUwmE5xOZ9RPVZlMJpw+fZqYl5dghmGwtLQU2Uq7HVNTUzE7kUQQ5v3582fUPavVKqjTJJracCXd4+0TSga4ftNHaBMiEsyVR1pZWRFETAIuL1poLpxIMFdadGlpSRAxCbgyk2kR7PV6o67RNJ1yU/z3799R13w+nyBTPG6nZbFY4hpmHz9+BLA180rWXqbm5ua4v8fV0NAAYGsr7evXr3nFjVvDOp2O17Z3iqJizn5I0d/fz2vbu1wuR39/P++4cQX7fL7IJxkLDQ0NgtddcIGmafT29sYt19vbSzQOxxXMsiwkEknECOeCRqOBRCIRZJvE4i0sLIwY4VwwGo0oLCwk4uXVaTEMA4VCwbmJury8HAqFIiUdF8MwUKvVnJuotVot1Go1MS/vXjoQCEClUiE/Pz9yLT8/HyqVKqXLHQKBAAwGA5RKZeSaUqmEwWAQxEs0LHk8Hmi12shv3mi1Wng8HmLS7eDz7+jxeNDT0wO5XA65XI6enp64vElzD7d3YsnopPi6h9s7sXidVFLdQ5Zlk9Y5kbqH4XUlsTZ6ZtzDXTjEsmxCiTO+2M3Dsmxa3MPdvCKHw8FmZWUlJIYPAoEAZDJZ5HxzcxP7wStOBymAHaQA0iKWi/fAeUsHTvD/AOsopsJRclbzAAAAAElFTkSuQmCC);background-position:0 -40px}.mouse-mode-selector .selection-mode-button.active{background-position:-30px -40px}.mouse-mode-selector .zoom-mode-button{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABkCAYAAADaIVPoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABV0RVh0Q3JlYXRpb24gVGltZQA3LzE2LzEzRNEKUwAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAlGSURBVHic7VxfSFPvH362taMLZxIqtAr8k01MwYQkaMGUVRfByEHxFYZ1E2oQBgrd7KZYUER1UaghonlR0CC7UWrrYhetGwum4kxksi4kdf6b25ye03Z+F/421B238579MXIPyM6fd5/nPHt9/+zzvO9Ejx8/Zq9fvw6TyYRUvP5tELEsy87MzKCkpASpeP3bIH7y5AkAIFWvfxsyNZyp4X+shkVOp5Pd74dIJ8T7/QDpRkbwv44DJ/jQfj+Aw+HAjx8/wDAMxOLEP/9QKASKolBTU4OKioqo+/sq2OFwYGRkBMeOHUNxcTFkMhlEIpHgeKFQCH6/Hy6XCyMjIwAQJXpfBY+OjuLkyZMoLy8HRVGQSCQJCWZZFjKZDLm5uRgfH8fo6GhyBK+uriIvL0/wg4URCoVQVFQEmUwGqVQaV3B4QrMXWJZFMBiERCJBcXExFhcXo8oQNxq32w2LxQK/30/61ihIJBLk5uZCKpWCoihQFAWpVMr5Nzk5iba2NiwvL+9ZZnuMI0eOQCKRJC54cnISAPD9+/eEBYvFYkgkEl5/b9++BQA8e/aMV3mKojg7QSLBs7OzmJ+fBwAsLCxgdnY2YdEikShuu7XZbLDb7QCAsbEx2Gw2wTGJBI+NjUWdMwxDEkIQuru7o859Pp+gWESCm5qaos4pihJETIJPnz5FncvlckGxiHppt9sd8zxVSCZvzBp2u90YGhriFWhoaAgul0vwg2zH6Ogo9Ho9r7J6vR5ms5l3bM7vwwzDYGJiAtPT0/yf8v/Iy8tDdXU1CgoK4pZ9//49Ll++jOzsbEilUgQCAQwMDGBwcJCYt6SkBHfu3EFlZSUYhsHGxgbMZjNu3LixoxxnDVutVkFiga1JidVqFdSDd3R0CBILbE1KOjo68O3bt5jlOAXrdDqUl5cLIj5+/DgaGxtjzoj2Ql9fH7RarSDec+fOwWQyob6+PmY5zk7L5/NBpVKhoqICX758wc2bNyP3Xr58GTm+e/du5PjNmze4ePEiTpw4Aa/Xi83NTeKHpmkaBoMB165dg8FgwOfPnyP3qqqqIsfj4+OR4ytXruD+/ftQqVTwer3Y2NiIycEpmGVZeDweyGQy6PV6zM3Ncb55+3W9Xo+1tTUsLy/zUxeDt7S0FMPDw7x4h4eHiXhjDks0TfMeApI5RKWSl2jisXuI4jtkJYrdQxTfIYsLRIIvXboU8zxVePToUcxzEhAJzsnJQXV1NQCguLgYOTk5golJUFZWFqnV+vp6lJWVCY5FJJimaVRWViI/Px/nz58HTdOCicNg2fg+AE3TuHXrFpRKJe7du8eLNxgMcl4nznhsbm6irq4Of/78IX0rJ9bX15GdnR23HMuyePXqFa+YLMtibW2N896+5rSkUilcLheOHDmyZ42QIhgMIhgM4tevX5BKpVH391VwVVUV7HY7RCIRioqK9kzL8EUwGMTKygpmZmbgdrtx9uzZqDL7KvjUqVMQiURwOByYn5+HWCxOOGsZCoVw6NAh1NTUoLS0NKpMxj3815ER/K/jwAnOuIfpRMY9/Fvdw2SB1D2MBz7u4b4K3u0eJjKtDCM8J0/IPQy3h2Qjnnv4/Plz3u5iUt1Dl8sFi8WSEuMsltNnNpvR3NxMbJwlxT1cXV3F0NAQVldXicgTxczMDPR6PZxOZ1LiEQ18DMPAYrEkzUPiC7/fj5aWFiIPaS8IGulHRkYiBnU68fTpU3R2diYUQ/DUZnp6GlarNS2G+HYMDg6ivb09PYb4brjdbpjN5rS367GxMbS0tAhq1wlPXtfX12G1WtPerufn59He3k7crgVPPPLz86HT6ZCVlYVQKASv14tAICA0HG8olUr09fVBLpcL4iWqYYqioNFoAACLi4uw2WyYm5vDwsJCSsXK5XIYjUYAwNTUFLq7uwXzEgm+evUqFAoFamtrAQATExNpab8vXryAWq1Ga2srAGBgYEDwuMxbsEajweHDhxEIBHDmzBnk5uYC2PrGk0oYjUaUlZUhEAigqakJCoUCANDV1SUoHi/BGo0GCoUiYnH4fD7U1dUB2FqgJnR5RDwYjUao1eodvA8fPgSw9UF/+PCBOCYvwQqFIqqt5OTkRJZFTExMEBPzgVqtjuItKyuLLIsYGBggjslLMFfHQNM0amtrQVFUyiYfe/G2tbVBLpcLWuCa0PfhjY0N3L59G2KxeM/lCfHAxz3kes/Xr19j8ibNPdxNvLCwkEgI3u4hCW/GPdyGjHuYTmTcwzTgwFktGcH/Og6c4Ix7mE5k3MOMe0iGlLmH4bROohsuSd3DcFqHawYVRjz3kFiwy+WC3W4HwzCorq5ObGUrh3u4F8xmMzo7O+H3+9Ha2gqdTrdn2VjuIW/BDMPAbrfvyD/b7XbMzs7iwoULnN9M+CDe3kOfz4eurq4d+eeuri7YbDY8ePCAcwlzwu5heGsOV7I9vJkrFbvUnE4nOjo6OJPtY2Nj0Ov1xElEXjVcUFCA//77Dx6PB+/evdtxr7GxEUePHsXq6mpS1k9vR3l5OUwmE5xOZ9RPVZlMJpw+fZqYl5dghmGwtLQU2Uq7HVNTUzE7kUQQ5v3582fUPavVKqjTJJracCXd4+0TSga4ftNHaBMiEsyVR1pZWRFETAIuL1poLpxIMFdadGlpSRAxCbgyk2kR7PV6o67RNJ1yU/z3799R13w+nyBTPG6nZbFY4hpmHz9+BLA180rWXqbm5ua4v8fV0NAAYGsr7evXr3nFjVvDOp2O17Z3iqJizn5I0d/fz2vbu1wuR39/P++4cQX7fL7IJxkLDQ0NgtddcIGmafT29sYt19vbSzQOxxXMsiwkEknECOeCRqOBRCIRZJvE4i0sLIwY4VwwGo0oLCwk4uXVaTEMA4VCwbmJury8HAqFIiUdF8MwUKvVnJuotVot1Go1MS/vXjoQCEClUiE/Pz9yLT8/HyqVKqXLHQKBAAwGA5RKZeSaUqmEwWAQxEs0LHk8Hmi12shv3mi1Wng8HmLS7eDz7+jxeNDT0wO5XA65XI6enp64vElzD7d3YsnopPi6h9s7sXidVFLdQ5Zlk9Y5kbqH4XUlsTZ6ZtzDXTjEsmxCiTO+2M3Dsmxa3MPdvCKHw8FmZWUlJIYPAoEAZDJZ5HxzcxP7wStOBymAHaQA0iKWi/fAeUsHTvD/AOsopsJRclbzAAAAAElFTkSuQmCC);background-position:0 -70px;border-bottom:0}.mouse-mode-selector .zoom-mode-button.active{background-position:-30px -70px}.timeline-track-view *{-webkit-user-select:none;cursor:default}.timeline-track-view .tool-button{cursor:pointer}.timeline-track-view{-webkit-box-orient:vertical;display:-webkit-box}.timeline-track-view .mode-indicator{height:32px;position:absolute;right:5px;top:38px;width:33px}.model-track-container{-webkit-box-flex:1;overflow:auto}.drag-box{background-color:rgba(0,0,255,0.25);border:1px solid #000060;font-size:75%;position:fixed}x-drag-handle{-webkit-user-select:none;box-sizing:border-box;display:block}x-drag-handle.horizontal-drag-handle{background-image:-webkit-gradient(linear,0 0,0 100%,from(#e5e5e5),to(#d1d1d1));border-bottom:1px solid #8e8e8e;border-top:1px solid white;cursor:ns-resize;height:7px;position:relative;z-index:10}x-drag-handle.vertical-drag-handle{background-image:-webkit-gradient(linear,0 0,100% 0,from(#e5e5e5),to(#d1d1d1));border-left:1px solid white;border-right:1px solid #8e8e8e;cursor:ew-resize;position:relative;width:7px;z-index:10}.timeline-view *{-webkit-user-select:none;box-sizing:border-box}.timeline-view{-webkit-box-flex:1;-webkit-box-orient:vertical;cursor:default;display:-webkit-box;font-family:sans-serif;padding:0}.timeline-view>.control>.title{font-size:14px;height:19px;padding-left:2px;padding-right:8px;padding-top:2px}.timeline-view>.control{background-color:#e6e6e6;background-image:-webkit-gradient(linear,0 0,0 100%,from(#e5e5e5),to(#d1d1d1));border-bottom:1px solid #8e8e8e;display:-webkit-flex;padding-top:1px}.timeline-view>.control>.controls.category-filter{margin-left:auto}.timeline-view>.control>.controls{display:-webkit-flex}.timeline-view>.control>span{padding-left:5px;padding-right:10px}.timeline-view>.control>.controls>button,.timeline-view>.control>.controls>label{font-size:11px;height:19px;margin:1px 2px 1px 2px}.timeline-view>.control>.spacer{-webkit-box-flex:1}.timeline-view>.container{-webkit-box-flex:1;border-bottom:1px solid #8e8e8e;display:-webkit-box}.timeline-view>.container>*{-webkit-box-flex:1}.timeline-view>.analysis-view{display:-webkit-flex;padding-left:2px;padding-right:2px}.timeline-view>.analysis-view:not(.viewing-object){height:250px}.timeline-view>.analysis-view.viewing-object{height:500px}.timeline-view .selection{margin:2px}.timeline-view .selection ul{margin:0}.find-control{-webkit-user-select:none;display:-webkit-box;position:relative}.find-control .hit-count-label{left:0;opacity:.25;pointer-events:none;position:absolute;text-align:right;top:2px;width:170px;z-index:1}.find-control input{-webkit-user-select:auto;background-color:#f8f8f8;border:1px solid rgba(0,0,0,0.5);box-sizing:border-box;height:19px;margin-bottom:1px;margin-left:0;margin-right:0;margin-top:1px;padding:0;width:170px}.find-control input:focus{background-color:white}.button.find-previous{border-left:none;margin-left:0;margin-right:0}.button.find-next{border-left:none;margin-left:0}.view-help-overlay{padding:6px}.button{background-color:#f8f8f8;border:1px solid rgba(0,0,0,0.5);color:rgba(0,0,0,0.8);font-size:14px;height:19px;margin:1px;min-width:23px;text-align:center}.button:hover{background-color:rgba(255,255,255,1.0);border:1px solid rgba(0,0,0,0.8);box-shadow:0 0 .05em rgba(0,0,0,0.4);color:rgba(0,0,0,1)}.view-info-button{padding-left:4px;padding-right:4px;width:auto}.view-info-button:hover{border:solid 1px}.view-import-errors-button{border:solid 1px rgba(128,0,0,0.2);color:darkred}.view-import-errors-button:hover{border:solid 1px red;color:red}.view-import-errors-overlay{-webkit-user-select:text;max-height:500px;max-width:800px;min-height:200px;min-width:400px;overflow:auto}.import-errors-dialog-text{font-family:monospace;margin:8px;white-space:pre}.metadata-dialog{max-height:500px;max-width:800px;min-height:200px;min-width:400px;overflow:auto}.metadata-dialog-text{font-family:monospace;margin:8px;white-space:pre}.category-filter-dialog{max-height:500px;min-width:400px;overflow-y:auto;padding:20px}.category-filter-dialog-form{font-size:80%;padding:10px}.category-filter-dialog-form input{margin-right:7px} \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/android-win/platform-tools/systrace/suffix.html b/love2dToAPK/tools/tools/android-win/platform-tools/systrace/suffix.html
new file mode 100644
index 0000000..f770848
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/platform-tools/systrace/suffix.html
@@ -0,0 +1,5 @@
+\n";
+ </script>
+<!-- END TRACE -->
+</body>
+</html>
diff --git a/love2dToAPK/tools/tools/android-win/platform-tools/systrace/systrace-legacy.py b/love2dToAPK/tools/tools/android-win/platform-tools/systrace/systrace-legacy.py
new file mode 100644
index 0000000..a20f6b5
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/platform-tools/systrace/systrace-legacy.py
@@ -0,0 +1,251 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2011 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Android system-wide tracing utility.
+
+This is a tool for capturing a trace that includes data from both userland and
+the kernel. It creates an HTML file for visualizing the trace.
+"""
+
+import errno, optparse, os, select, subprocess, sys, time, zlib
+
+# This list is based on the tags in frameworks/native/include/utils/Trace.h.
+trace_tag_bits = {
+ 'gfx': 1<<1,
+ 'input': 1<<2,
+ 'view': 1<<3,
+ 'webview': 1<<4,
+ 'wm': 1<<5,
+ 'am': 1<<6,
+ 'sync': 1<<7,
+ 'audio': 1<<8,
+ 'video': 1<<9,
+ 'camera': 1<<10,
+}
+
+flattened_css_file = 'style.css'
+flattened_js_file = 'script.js'
+
+def add_adb_serial(command, serial):
+ if serial != None:
+ command.insert(1, serial)
+ command.insert(1, '-s')
+
+def main():
+ parser = optparse.OptionParser()
+ parser.add_option('-o', dest='output_file', help='write HTML to FILE',
+ default='trace.html', metavar='FILE')
+ parser.add_option('-t', '--time', dest='trace_time', type='int',
+ help='trace for N seconds', metavar='N')
+ parser.add_option('-b', '--buf-size', dest='trace_buf_size', type='int',
+ help='use a trace buffer size of N KB', metavar='N')
+ parser.add_option('-d', '--disk', dest='trace_disk', default=False,
+ action='store_true', help='trace disk I/O (requires root)')
+ parser.add_option('-f', '--cpu-freq', dest='trace_cpu_freq', default=False,
+ action='store_true', help='trace CPU frequency changes')
+ parser.add_option('-i', '--cpu-idle', dest='trace_cpu_idle', default=False,
+ action='store_true', help='trace CPU idle events')
+ parser.add_option('-l', '--cpu-load', dest='trace_cpu_load', default=False,
+ action='store_true', help='trace CPU load')
+ parser.add_option('-s', '--no-cpu-sched', dest='trace_cpu_sched', default=True,
+ action='store_false', help='inhibit tracing CPU ' +
+ 'scheduler (allows longer trace times by reducing data ' +
+ 'rate into buffer)')
+ parser.add_option('-u', '--bus-utilization', dest='trace_bus_utilization',
+ default=False, action='store_true',
+ help='trace bus utilization (requires root)')
+ parser.add_option('-w', '--workqueue', dest='trace_workqueue', default=False,
+ action='store_true', help='trace the kernel workqueues ' +
+ '(requires root)')
+ parser.add_option('--set-tags', dest='set_tags', action='store',
+ help='set the enabled trace tags and exit; set to a ' +
+ 'comma separated list of: ' +
+ ', '.join(trace_tag_bits.iterkeys()))
+ parser.add_option('--link-assets', dest='link_assets', default=False,
+ action='store_true', help='link to original CSS or JS resources '
+ 'instead of embedding them')
+ parser.add_option('--from-file', dest='from_file', action='store',
+ help='read the trace from a file rather than running a live trace')
+ parser.add_option('--asset-dir', dest='asset_dir', default='trace-viewer',
+ type='string', help='')
+ parser.add_option('-e', '--serial', dest='device_serial', type='string',
+ help='adb device serial number')
+ options, args = parser.parse_args()
+
+ if options.set_tags:
+ flags = 0
+ tags = options.set_tags.split(',')
+ for tag in tags:
+ try:
+ flags |= trace_tag_bits[tag]
+ except KeyError:
+ parser.error('unrecognized tag: %s\nknown tags are: %s' %
+ (tag, ', '.join(trace_tag_bits.iterkeys())))
+ atrace_args = ['adb', 'shell', 'setprop', 'debug.atrace.tags.enableflags', hex(flags)]
+ add_adb_serial(atrace_args, options.device_serial)
+ try:
+ subprocess.check_call(atrace_args)
+ except subprocess.CalledProcessError, e:
+ print >> sys.stderr, 'unable to set tags: %s' % e
+ print '\nSet enabled tags to: %s\n' % ', '.join(tags)
+ print ('You will likely need to restart the Android framework for this to ' +
+ 'take effect:\n\n adb shell stop\n adb shell ' +
+ 'start\n')
+ return
+
+ atrace_args = ['adb', 'shell', 'atrace', '-z']
+ add_adb_serial(atrace_args, options.device_serial)
+
+ if options.trace_disk:
+ atrace_args.append('-d')
+ if options.trace_cpu_freq:
+ atrace_args.append('-f')
+ if options.trace_cpu_idle:
+ atrace_args.append('-i')
+ if options.trace_cpu_load:
+ atrace_args.append('-l')
+ if options.trace_cpu_sched:
+ atrace_args.append('-s')
+ if options.trace_bus_utilization:
+ atrace_args.append('-u')
+ if options.trace_workqueue:
+ atrace_args.append('-w')
+ if options.trace_time is not None:
+ if options.trace_time > 0:
+ atrace_args.extend(['-t', str(options.trace_time)])
+ else:
+ parser.error('the trace time must be a positive number')
+ if options.trace_buf_size is not None:
+ if options.trace_buf_size > 0:
+ atrace_args.extend(['-b', str(options.trace_buf_size)])
+ else:
+ parser.error('the trace buffer size must be a positive number')
+
+ if options.from_file is not None:
+ atrace_args = ['cat', options.from_file]
+
+ script_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
+
+ if options.link_assets:
+ src_dir = os.path.join(script_dir, options.asset_dir, 'src')
+ build_dir = os.path.join(script_dir, options.asset_dir, 'build')
+
+ js_files, js_flattenizer, css_files, templates = get_assets(src_dir, build_dir)
+
+ css = '\n'.join(linked_css_tag % (os.path.join(src_dir, f)) for f in css_files)
+ js = '<script language="javascript">\n%s</script>\n' % js_flattenizer
+ js += '\n'.join(linked_js_tag % (os.path.join(src_dir, f)) for f in js_files)
+
+ else:
+ css_filename = os.path.join(script_dir, flattened_css_file)
+ js_filename = os.path.join(script_dir, flattened_js_file)
+ css = compiled_css_tag % (open(css_filename).read())
+ js = compiled_js_tag % (open(js_filename).read())
+ templates = ''
+
+ html_filename = options.output_file
+
+ trace_started = False
+ leftovers = ''
+ adb = subprocess.Popen(atrace_args, stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ dec = zlib.decompressobj()
+ while True:
+ ready = select.select([adb.stdout, adb.stderr], [], [adb.stdout, adb.stderr])
+ if adb.stderr in ready[0]:
+ err = os.read(adb.stderr.fileno(), 4096)
+ sys.stderr.write(err)
+ sys.stderr.flush()
+ if adb.stdout in ready[0]:
+ out = leftovers + os.read(adb.stdout.fileno(), 4096)
+ if options.from_file is None:
+ out = out.replace('\r\n', '\n')
+ if out.endswith('\r'):
+ out = out[:-1]
+ leftovers = '\r'
+ else:
+ leftovers = ''
+ if not trace_started:
+ lines = out.splitlines(True)
+ out = ''
+ for i, line in enumerate(lines):
+ if line == 'TRACE:\n':
+ sys.stdout.write("downloading trace...")
+ sys.stdout.flush()
+ out = ''.join(lines[i+1:])
+ html_prefix = read_asset(script_dir, 'prefix.html')
+ html_file = open(html_filename, 'w')
+ html_file.write(html_prefix % (css, js, templates))
+ trace_started = True
+ break
+ elif 'TRACE:'.startswith(line) and i == len(lines) - 1:
+ leftovers = line + leftovers
+ else:
+ sys.stdout.write(line)
+ sys.stdout.flush()
+ if len(out) > 0:
+ out = dec.decompress(out)
+ html_out = out.replace('\n', '\\n\\\n')
+ if len(html_out) > 0:
+ html_file.write(html_out)
+ result = adb.poll()
+ if result is not None:
+ break
+ if result != 0:
+ print >> sys.stderr, 'adb returned error code %d' % result
+ elif trace_started:
+ html_out = dec.flush().replace('\n', '\\n\\\n').replace('\r', '')
+ if len(html_out) > 0:
+ html_file.write(html_out)
+ html_suffix = read_asset(script_dir, 'suffix.html')
+ html_file.write(html_suffix)
+ html_file.close()
+ print " done\n\n wrote file://%s\n" % (os.path.abspath(options.output_file))
+ else:
+ print >> sys.stderr, ('An error occured while capturing the trace. Output ' +
+ 'file was not written.')
+
+def read_asset(src_dir, filename):
+ return open(os.path.join(src_dir, filename)).read()
+
+def get_assets(src_dir, build_dir):
+ sys.path.append(build_dir)
+ gen = __import__('generate_standalone_timeline_view', {}, {})
+ parse_deps = __import__('parse_deps', {}, {})
+ gen_templates = __import__('generate_template_contents', {}, {})
+ filenames = gen._get_input_filenames()
+ load_sequence = parse_deps.calc_load_sequence(filenames, src_dir)
+
+ js_files = []
+ js_flattenizer = "window.FLATTENED = {};\n"
+ js_flattenizer += "window.FLATTENED_RAW_SCRIPTS = {};\n"
+ css_files = []
+
+ for module in load_sequence:
+ js_files.append(os.path.relpath(module.filename, src_dir))
+ js_flattenizer += "window.FLATTENED['%s'] = true;\n" % module.name
+ for dependent_raw_script_name in module.dependent_raw_script_names:
+ js_flattenizer += (
+ "window.FLATTENED_RAW_SCRIPTS['%s'] = true;\n" %
+ dependent_raw_script_name)
+
+ for style_sheet in module.style_sheets:
+ css_files.append(os.path.relpath(style_sheet.filename, src_dir))
+
+ templates = gen_templates.generate_templates()
+
+ sys.path.pop()
+
+ return (js_files, js_flattenizer, css_files, templates)
+
+compiled_css_tag = """<style type="text/css">%s</style>"""
+compiled_js_tag = """<script language="javascript">%s</script>"""
+
+linked_css_tag = """<link rel="stylesheet" href="%s"></link>"""
+linked_js_tag = """<script language="javascript" src="%s"></script>"""
+
+if __name__ == '__main__':
+ main()
diff --git a/love2dToAPK/tools/tools/android-win/platform-tools/systrace/systrace.py b/love2dToAPK/tools/tools/android-win/platform-tools/systrace/systrace.py
new file mode 100644
index 0000000..d89c35d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/platform-tools/systrace/systrace.py
@@ -0,0 +1,313 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2011 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Android system-wide tracing utility.
+
+This is a tool for capturing a trace that includes data from both userland and
+the kernel. It creates an HTML file for visualizing the trace.
+"""
+
+import errno, optparse, os, re, select, subprocess, sys, time, zlib
+
+flattened_css_file = 'style.css'
+flattened_js_file = 'script.js'
+
+class OptionParserIgnoreErrors(optparse.OptionParser):
+ def error(self, msg):
+ pass
+
+ def exit(self):
+ pass
+
+ def print_usage(self):
+ pass
+
+ def print_help(self):
+ pass
+
+ def print_version(self):
+ pass
+
+def get_device_sdk_version():
+ getprop_args = ['adb', 'shell', 'getprop', 'ro.build.version.sdk']
+
+ parser = OptionParserIgnoreErrors()
+ parser.add_option('-e', '--serial', dest='device_serial', type='string')
+ options, args = parser.parse_args()
+ if options.device_serial is not None:
+ getprop_args[1:1] = ['-s', options.device_serial]
+
+ adb = subprocess.Popen(getprop_args, stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ out, err = adb.communicate()
+ if adb.returncode != 0:
+ print >> sys.stderr, 'Error querying device SDK-version:'
+ print >> sys.stderr, err
+ sys.exit(1)
+
+ version = int(out)
+ return version
+
+def add_adb_serial(command, serial):
+ if serial is not None:
+ command.insert(1, serial)
+ command.insert(1, '-s')
+
+def main():
+ device_sdk_version = get_device_sdk_version()
+ if device_sdk_version < 18:
+ legacy_script = os.path.join(os.path.dirname(sys.argv[0]), 'systrace-legacy.py')
+ os.execv(legacy_script, sys.argv)
+
+ usage = "Usage: %prog [options] [category1 [category2 ...]]"
+ desc = "Example: %prog -b 32768 -t 15 gfx input view sched freq"
+ parser = optparse.OptionParser(usage=usage, description=desc)
+ parser.add_option('-o', dest='output_file', help='write HTML to FILE',
+ default='trace.html', metavar='FILE')
+ parser.add_option('-t', '--time', dest='trace_time', type='int',
+ help='trace for N seconds', metavar='N')
+ parser.add_option('-b', '--buf-size', dest='trace_buf_size', type='int',
+ help='use a trace buffer size of N KB', metavar='N')
+ parser.add_option('-k', '--ktrace', dest='kfuncs', action='store',
+ help='specify a comma-separated list of kernel functions to trace')
+ parser.add_option('-l', '--list-categories', dest='list_categories', default=False,
+ action='store_true', help='list the available categories and exit')
+ parser.add_option('-a', '--app', dest='app_name', default=None, type='string',
+ action='store', help='enable application-level tracing for comma-separated ' +
+ 'list of app cmdlines')
+ parser.add_option('--no-fix-threads', dest='fix_threads', default=True,
+ action='store_false', help='don\'t fix missing or truncated thread names')
+
+ parser.add_option('--link-assets', dest='link_assets', default=False,
+ action='store_true', help='link to original CSS or JS resources '
+ 'instead of embedding them')
+ parser.add_option('--from-file', dest='from_file', action='store',
+ help='read the trace from a file (compressed) rather than running a live trace')
+ parser.add_option('--asset-dir', dest='asset_dir', default='trace-viewer',
+ type='string', help='')
+ parser.add_option('-e', '--serial', dest='device_serial', type='string',
+ help='adb device serial number')
+
+ options, args = parser.parse_args()
+
+ if options.list_categories:
+ atrace_args = ['adb', 'shell', 'atrace', '--list_categories']
+ expect_trace = False
+ elif options.from_file is not None:
+ atrace_args = ['cat', options.from_file]
+ expect_trace = True
+ else:
+ atrace_args = ['adb', 'shell', 'atrace', '-z']
+ expect_trace = True
+
+ if options.trace_time is not None:
+ if options.trace_time > 0:
+ atrace_args.extend(['-t', str(options.trace_time)])
+ else:
+ parser.error('the trace time must be a positive number')
+
+ if options.trace_buf_size is not None:
+ if options.trace_buf_size > 0:
+ atrace_args.extend(['-b', str(options.trace_buf_size)])
+ else:
+ parser.error('the trace buffer size must be a positive number')
+
+ if options.app_name is not None:
+ atrace_args.extend(['-a', options.app_name])
+
+ if options.kfuncs is not None:
+ atrace_args.extend(['-k', options.kfuncs])
+
+ atrace_args.extend(args)
+
+ if options.fix_threads:
+ atrace_args.extend([';', 'ps', '-t'])
+
+ if atrace_args[0] == 'adb':
+ add_adb_serial(atrace_args, options.device_serial)
+
+ script_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
+
+ if options.link_assets:
+ src_dir = os.path.join(script_dir, options.asset_dir, 'src')
+ build_dir = os.path.join(script_dir, options.asset_dir, 'build')
+
+ js_files, js_flattenizer, css_files, templates = get_assets(src_dir, build_dir)
+
+ css = '\n'.join(linked_css_tag % (os.path.join(src_dir, f)) for f in css_files)
+ js = '<script language="javascript">\n%s</script>\n' % js_flattenizer
+ js += '\n'.join(linked_js_tag % (os.path.join(src_dir, f)) for f in js_files)
+
+ else:
+ css_filename = os.path.join(script_dir, flattened_css_file)
+ js_filename = os.path.join(script_dir, flattened_js_file)
+ css = compiled_css_tag % (open(css_filename).read())
+ js = compiled_js_tag % (open(js_filename).read())
+ templates = ''
+
+ html_filename = options.output_file
+
+ adb = subprocess.Popen(atrace_args, stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+
+ result = None
+ data = []
+
+ # Read the text portion of the output and watch for the 'TRACE:' marker that
+ # indicates the start of the trace data.
+ while result is None:
+ ready = select.select([adb.stdout, adb.stderr], [], [adb.stdout, adb.stderr])
+ if adb.stderr in ready[0]:
+ err = os.read(adb.stderr.fileno(), 4096)
+ sys.stderr.write(err)
+ sys.stderr.flush()
+ if adb.stdout in ready[0]:
+ out = os.read(adb.stdout.fileno(), 4096)
+ parts = out.split('\nTRACE:', 1)
+
+ txt = parts[0].replace('\r', '')
+ if len(parts) == 2:
+ # The '\nTRACE:' match stole the last newline from the text, so add it
+ # back here.
+ txt += '\n'
+ sys.stdout.write(txt)
+ sys.stdout.flush()
+
+ if len(parts) == 2:
+ data.append(parts[1])
+ sys.stdout.write("downloading trace...")
+ sys.stdout.flush()
+ break
+
+ result = adb.poll()
+
+ # Read and buffer the data portion of the output.
+ while True:
+ ready = select.select([adb.stdout, adb.stderr], [], [adb.stdout, adb.stderr])
+ keepReading = False
+ if adb.stderr in ready[0]:
+ err = os.read(adb.stderr.fileno(), 4096)
+ if len(err) > 0:
+ keepReading = True
+ sys.stderr.write(err)
+ sys.stderr.flush()
+ if adb.stdout in ready[0]:
+ out = os.read(adb.stdout.fileno(), 4096)
+ if len(out) > 0:
+ keepReading = True
+ data.append(out)
+
+ if result is not None and not keepReading:
+ break
+
+ result = adb.poll()
+
+ if result == 0:
+ if expect_trace:
+ data = ''.join(data)
+
+ # Collapse CRLFs that are added by adb shell.
+ if data.startswith('\r\n'):
+ data = data.replace('\r\n', '\n')
+
+ # Skip the initial newline.
+ data = data[1:]
+
+ if not data:
+ print >> sys.stderr, ('No data was captured. Output file was not ' +
+ 'written.')
+ sys.exit(1)
+ else:
+ # Indicate to the user that the data download is complete.
+ print " done\n"
+
+ # Extract the thread list dumped by ps.
+ threads = {}
+ if options.fix_threads:
+ parts = data.split('USER PID PPID VSIZE RSS WCHAN PC NAME', 1)
+ if len(parts) == 2:
+ data = parts[0]
+ for line in parts[1].splitlines():
+ cols = line.split(None, 8)
+ if len(cols) == 9:
+ tid = int(cols[1])
+ name = cols[8]
+ threads[tid] = name
+
+ # Decompress and preprocess the data.
+ out = zlib.decompress(data)
+ if options.fix_threads:
+ def repl(m):
+ tid = int(m.group(2))
+ if tid > 0:
+ name = threads.get(tid)
+ if name is None:
+ name = m.group(1)
+ if name == '<...>':
+ name = '<' + str(tid) + '>'
+ threads[tid] = name
+ return name + '-' + m.group(2)
+ else:
+ return m.group(0)
+ out = re.sub(r'^\s*(\S+)-(\d+)', repl, out, flags=re.MULTILINE)
+
+ html_prefix = read_asset(script_dir, 'prefix.html')
+ html_suffix = read_asset(script_dir, 'suffix.html')
+
+ html_file = open(html_filename, 'w')
+ html_file.write(html_prefix % (css, js, templates))
+ html_out = out.replace('\n', '\\n\\\n')
+ html_file.write(html_out)
+ html_file.write(html_suffix)
+ html_file.close()
+ print "\n wrote file://%s\n" % os.path.abspath(options.output_file)
+
+ else: # i.e. result != 0
+ print >> sys.stderr, 'adb returned error code %d' % result
+ sys.exit(1)
+
+def read_asset(src_dir, filename):
+ return open(os.path.join(src_dir, filename)).read()
+
+def get_assets(src_dir, build_dir):
+ sys.path.append(build_dir)
+ gen = __import__('generate_standalone_timeline_view', {}, {})
+ parse_deps = __import__('parse_deps', {}, {})
+ gen_templates = __import__('generate_template_contents', {}, {})
+ filenames = gen._get_input_filenames()
+ load_sequence = parse_deps.calc_load_sequence(filenames, src_dir)
+
+ js_files = []
+ js_flattenizer = "window.FLATTENED = {};\n"
+ js_flattenizer += "window.FLATTENED_RAW_SCRIPTS = {};\n"
+ css_files = []
+
+ for module in load_sequence:
+ js_files.append(os.path.relpath(module.filename, src_dir))
+ js_flattenizer += "window.FLATTENED['%s'] = true;\n" % module.name
+ for dependent_raw_script_name in module.dependent_raw_script_names:
+ js_flattenizer += (
+ "window.FLATTENED_RAW_SCRIPTS['%s'] = true;\n" %
+ dependent_raw_script_name)
+
+ for style_sheet in module.style_sheets:
+ css_files.append(os.path.relpath(style_sheet.filename, src_dir))
+
+ templates = gen_templates.generate_templates()
+
+ sys.path.pop()
+
+ return (js_files, js_flattenizer, css_files, templates)
+
+
+compiled_css_tag = """<style type="text/css">%s</style>"""
+compiled_js_tag = """<script language="javascript">%s</script>"""
+
+linked_css_tag = """<link rel="stylesheet" href="%s"></link>"""
+linked_js_tag = """<script language="javascript" src="%s"></script>"""
+
+if __name__ == '__main__':
+ main()
diff --git a/love2dToAPK/tools/tools/android-win/platforms/android-19/android.jar b/love2dToAPK/tools/tools/android-win/platforms/android-19/android.jar
new file mode 100644
index 0000000..ca5ceca
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/platforms/android-19/android.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/platforms/android-19/build.prop b/love2dToAPK/tools/tools/android-win/platforms/android-19/build.prop
new file mode 100644
index 0000000..5be5872
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/platforms/android-19/build.prop
@@ -0,0 +1,54 @@
+# begin build properties
+# autogenerated by buildinfo.sh
+ro.build.id=KK
+ro.build.display.id=sdk-eng 4.4.2 KK 1456859 test-keys
+ro.build.version.incremental=1456859
+ro.build.version.sdk=19
+ro.build.version.codename=REL
+ro.build.version.release=4.4.2
+ro.build.date=Mon Sep 22 20:54:27 UTC 2014
+ro.build.date.utc=1411419267
+ro.build.type=eng
+ro.build.tags=test-keys
+ro.product.model=sdk
+ro.product.name=sdk
+ro.product.board=
+ro.product.cpu.abi=armeabi-v7a
+ro.product.cpu.abi2=armeabi
+ro.product.locale.language=en
+ro.product.locale.region=US
+ro.wifi.channels=
+ro.board.platform=
+# ro.build.product is obsolete; use ro.product.device
+# Do not try to parse ro.build.description or .fingerprint
+ro.build.description=sdk-eng 4.4.2 KK 1456859 test-keys
+ro.build.fingerprint=generic/sdk/generic:4.4.2/KK/1456859:eng/test-keys
+ro.build.characteristics=default
+# end build properties
+#
+# from build/target/board/generic/system.prop
+#
+#
+# system.prop for generic sdk
+#
+
+rild.libpath=/system/lib/libreference-ril.so
+rild.libargs=-d /dev/ttyS0
+
+#
+# ADDITIONAL_BUILD_PROPERTIES
+#
+ro.config.notification_sound=OnTheHunt.ogg
+ro.config.alarm_alert=Alarm_Classic.ogg
+persist.sys.dalvik.vm.lib=libdvm.so
+ro.kernel.android.checkjni=1
+xmpp.auto-presence=true
+ro.config.nocheckin=yes
+net.bt.name=Android
+dalvik.vm.stack-trace-file=/data/anr/traces.txt
+ro.build.user=generic
+ro.build.host=generic
+ro.product.brand=generic
+ro.product.manufacturer=generic
+ro.product.device=generic
+ro.build.product=generic
diff --git a/love2dToAPK/tools/tools/android-win/platforms/android-19/framework.aidl b/love2dToAPK/tools/tools/android-win/platforms/android-19/framework.aidl
new file mode 100644
index 0000000..9bccbe1
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/platforms/android-19/framework.aidl
@@ -0,0 +1,57 @@
+interface android.accounts.IAccountManager;
+interface android.accounts.IAccountManagerResponse;
+interface android.accounts.IAccountAuthenticator;
+interface android.accounts.IAccountAuthenticatorResponse;
+parcelable android.app.Notification;
+parcelable android.app.PendingIntent;
+parcelable android.appwidget.AppWidgetProviderInfo;
+parcelable android.bluetooth.BluetoothDevice;
+parcelable android.bluetooth.BluetoothHealthAppConfiguration;
+parcelable android.content.ComponentName;
+parcelable android.content.ContentValues;
+parcelable android.content.Intent;
+parcelable android.content.IntentSender;
+parcelable android.content.PeriodicSync;
+parcelable android.content.SyncRequest;
+parcelable android.content.SyncStats;
+parcelable android.content.res.Configuration;
+parcelable android.database.CursorWindow;
+parcelable android.hardware.location.GeofenceHardwareRequestParcelable;
+parcelable android.net.Uri;
+parcelable android.nfc.NdefMessage;
+parcelable android.nfc.NdefRecord;
+parcelable android.nfc.Tag;
+parcelable android.os.Bundle;
+parcelable android.os.DropBoxManager.Entry;
+parcelable android.os.ParcelFileDescriptor;
+parcelable android.os.ParcelUuid;
+parcelable android.view.KeyEvent;
+parcelable android.view.MotionEvent;
+parcelable android.view.Surface;
+parcelable android.view.WindowManager.LayoutParams;
+parcelable android.widget.RemoteViews;
+interface com.android.internal.textservice.ISpellCheckerService;
+interface com.android.internal.textservice.ISpellCheckerSession;
+interface com.android.internal.textservice.ISpellCheckerSessionListener;
+interface com.android.internal.textservice.ITextServicesManager;
+interface com.android.internal.textservice.ITextServicesSessionListener;
+interface com.android.internal.view.IInputContext;
+interface com.android.internal.view.IInputMethod;
+interface com.android.internal.view.IInputMethodClient;
+interface com.android.internal.view.IInputMethodManager;
+interface com.android.internal.view.IInputMethodSession;
+parcelable android.graphics.Bitmap;
+parcelable android.graphics.Rect;
+parcelable android.graphics.Region;
+parcelable android.location.Criteria;
+parcelable android.location.Geofence;
+parcelable android.location.Location;
+parcelable android.location.LocationRequest;
+parcelable android.location.FusedBatchOptions;
+parcelable com.android.internal.location.ProviderProperties;
+parcelable com.android.internal.location.ProviderRequest;
+parcelable android.telephony.ServiceState;
+interface com.android.internal.telephony.IPhoneSubInfo;
+interface com.android.internal.telephony.ITelephony;
+parcelable android.net.wifi.BatchedScanSettings;
+parcelable android.net.wifi.BatchedScanResult;
diff --git a/love2dToAPK/tools/tools/android-win/platforms/android-19/sdk.properties b/love2dToAPK/tools/tools/android-win/platforms/android-19/sdk.properties
new file mode 100644
index 0000000..c22e3e3
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/platforms/android-19/sdk.properties
@@ -0,0 +1,5 @@
+# SDK properties
+# This file is copied in the root folder of each platform component.
+# If it used by various tools to figure out what the platform can do.
+sdk.ant.templates.revision=1
+sdk.skin.default=WVGA800 \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/android-win/platforms/android-19/source.properties b/love2dToAPK/tools/tools/android-win/platforms/android-19/source.properties
new file mode 100644
index 0000000..3dcb595
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/platforms/android-19/source.properties
@@ -0,0 +1,12 @@
+### Android Tool: Source of this archive.
+#Sat Feb 28 13:51:16 CET 2015
+AndroidVersion.ApiLevel=19
+Layoutlib.Api=12
+Layoutlib.Revision=1
+Pkg.Desc=Android SDK Platform 4.4.2
+Pkg.License=To get started with the Android SDK, you must agree to the following terms and conditions.\n\nThis is the Android SDK License Agreement (the "License Agreement").\n\n1. Introduction\n\n1.1 The Android SDK (referred to in the License Agreement as the "SDK" and specifically including the Android system files, packaged APIs, and SDK library files and tools , if and when they are made available) is licensed to you subject to the terms of the License Agreement. The License Agreement forms a legally binding contract between you and Google in relation to your use of the SDK.\n\n1.2 "Android" means the Android software stack for devices, as made available under the Android Open Source Project, which is located at the following URL\: http\://source.android.com/, as updated from time to time.\n\n1.3 "Google" means Google Inc., a Delaware corporation with principal place of business at 1600 Amphitheatre Parkway, Mountain View, CA 94043, United States.\n\n2. Accepting the License Agreement\n\n2.1 In order to use the SDK, you must first agree to the License Agreement. You may not use the SDK if you do not accept the License Agreement.\n\n2.2 By clicking to accept and/or using the SDK, you hereby agree to the terms of the License Agreement.\n\n2.3 You may not use the SDK and may not accept the License Agreement if you are a person barred from receiving the SDK under the laws of the United States or other countries including the country in which you are resident or from which you use the SDK.\n\n2.4 If you will use the SDK internally within your company or organization you agree to be bound by the License Agreement on behalf of your employer or other entity, and you represent and warrant that you have full legal authority to bind your employer or such entity to the License Agreement. If you do not have the requisite authority, you may not accept the License Agreement or use the SDK on behalf of your employer or other entity.\n\n3. SDK License from Google\n\n3.1 Subject to the terms of the License Agreement, Google grants you a royalty-free, non-assignable, non-exclusive, non-sublicensable, limited, revocable license to use the SDK, personally or internally within your company or organization, solely to develop and distribute applications to run on the Android platform.\n\n3.2 You agree that Google or third parties own all legal right, title and interest in and to the SDK, including any Intellectual Property Rights that subsist in the SDK. "Intellectual Property Rights" means any and all rights under patent law, copyright law, trade secret law, trademark law, and any and all other proprietary rights. Google reserves all rights not expressly granted to you.\n\n3.3 You may not use the SDK for any purpose not expressly permitted by the License Agreement. Except to the extent required by applicable third party licenses, you may not\: (a) copy (except for backup purposes), modify, adapt, redistribute, decompile, reverse engineer, disassemble, or create derivative works of the SDK or any part of the SDK; or (b) load any part of the SDK onto a mobile handset or any other hardware device except a personal computer, combine any part of the SDK with other software, or distribute any software or device incorporating a part of the SDK.\n\n3.4 You agree that you will not take any actions that may cause or result in the fragmentation of Android, including but not limited to distributing, participating in the creation of, or promoting in any way a software development kit derived from the SDK.\n\n3.5 Use, reproduction and distribution of components of the SDK licensed under an open source software license are governed solely by the terms of that open source software license and not the License Agreement. You agree to remain a licensee in good standing in regard to such open source software licenses under all the rights granted and to refrain from any actions that may terminate, suspend, or breach such rights.\n\n3.6 You agree that the form and nature of the SDK that Google provides may change without prior notice to you and that future versions of the SDK may be incompatible with applications developed on previous versions of the SDK. You agree that Google may stop (permanently or temporarily) providing the SDK (or any features within the SDK) to you or to users generally at Google's sole discretion, without prior notice to you.\n\n3.7 Nothing in the License Agreement gives you a right to use any of Google's trade names, trademarks, service marks, logos, domain names, or other distinctive brand features.\n\n3.8 You agree that you will not remove, obscure, or alter any proprietary rights notices (including copyright and trademark notices) that may be affixed to or contained within the SDK.\n\n4. Use of the SDK by You\n\n4.1 Google agrees that nothing in the License Agreement gives Google any right, title or interest from you (or your licensors) under the License Agreement in or to any software applications that you develop using the SDK, including any intellectual property rights that subsist in those applications.\n\n4.2 You agree to use the SDK and write applications only for purposes that are permitted by (a) the License Agreement, and (b) any applicable law, regulation or generally accepted practices or guidelines in the relevant jurisdictions (including any laws regarding the export of data or software to and from the United States or other relevant countries).\n\n4.3 You agree that if you use the SDK to develop applications, you will protect the privacy and legal rights of users. If users provide you with user names, passwords, or other login information or personal information, you must make the users aware that the information will be available to your application, and you must provide legally adequate privacy notice and protection for those users. If your application stores personal or sensitive information provided by users, it must do so securely. If users provide you with Google Account information, your application may only use that information to access the user's Google Account when, and for the limited purposes for which, each user has given you permission to do so.\n\n4.4 You agree that you will not engage in any activity with the SDK, including the development or distribution of an application, that interferes with, disrupts, damages, or accesses in an unauthorized manner the servers, networks, or other properties or services of Google or any third party.\n\n4.5 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any data, content, or resources that you create, transmit or display through Android and/or applications for Android, and for the consequences of your actions (including any loss or damage which Google may suffer) by doing so.\n\n4.6 You agree that you are solely responsible for (and that Google has no responsibility to you or to any third party for) any breach of your obligations under the License Agreement, any applicable third party contract or Terms of Service, or any applicable law or regulation, and for the consequences (including any loss or damage which Google or any third party may suffer) of any such breach.\n\n5. Your Developer Credentials\n\n5.1 You agree that you are responsible for maintaining the confidentiality of any developer credentials that may be issued to you by Google or which you may choose yourself and that you will be solely responsible for all applications that are developed under your developer credentials.\n\n6. Privacy and Information\n\n6.1 In order to continually innovate and improve the SDK, Google may collect certain usage statistics from the software including but not limited to a unique identifier, associated IP address, version number of the software, and information on which tools and/or services in the SDK are being used and how they are being used. Before any of this information is collected, the SDK will notify you and seek your consent. If you withhold consent, the information will not be collected.\n\n6.2 The data collected is examined in the aggregate to improve the SDK and is maintained in accordance with Google's Privacy Policy located at http\://www.google.com/policies/privacy/.\n\n7. Third Party Applications\n\n7.1 If you use the SDK to run applications developed by a third party or that access data, content or resources provided by a third party, you agree that Google is not responsible for those applications, data, content, or resources. You understand that all data, content or resources which you may access through such third party applications are the sole responsibility of the person from which they originated and that Google is not liable for any loss or damage that you may experience as a result of the use or access of any of those third party applications, data, content, or resources.\n\n7.2 You should be aware the data, content, and resources presented to you through such a third party application may be protected by intellectual property rights which are owned by the providers (or by other persons or companies on their behalf). You may not modify, rent, lease, loan, sell, distribute or create derivative works based on these data, content, or resources (either in whole or in part) unless you have been specifically given permission to do so by the relevant owners.\n\n7.3 You acknowledge that your use of such third party applications, data, content, or resources may be subject to separate terms between you and the relevant third party.\n\n8. Using Google APIs\n\n8.1 Google APIs\n\n8.1.1 If you use any API to retrieve data from Google, you acknowledge that the data may be protected by intellectual property rights which are owned by Google or those parties that provide the data (or by other persons or companies on their behalf). Your use of any such API may be subject to additional Terms of Service. You may not modify, rent, lease, loan, sell, distribute or create derivative works based on this data (either in whole or in part) unless allowed by the relevant Terms of Service.\n\n8.1.2 If you use any API to retrieve a user's data from Google, you acknowledge and agree that you shall retrieve data only with the user's explicit consent and only when, and for the limited purposes for which, the user has given you permission to do so.\n\n9. Terminating the License Agreement\n\n9.1 The License Agreement will continue to apply until terminated by either you or Google as set out below.\n\n9.2 If you want to terminate the License Agreement, you may do so by ceasing your use of the SDK and any relevant developer credentials.\n\n9.3 Google may at any time, terminate the License Agreement, with or without cause, upon notice to you.\n\n9.4 The License Agreement will automatically terminate without notice or other action when Google ceases to provide the SDK or certain parts of the SDK to users in the country in which you are resident or from which you use the service.\n\n9.5 When the License Agreement is terminated, the license granted to you in the License Agreement will terminate, you will immediately cease all use of the SDK, and the provisions of paragraphs 10, 11, 12 and 14 shall survive indefinitely.\n\n10. DISCLAIMERS\n\n10.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SDK IS AT YOUR SOLE RISK AND THAT THE SDK IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTY OF ANY KIND FROM GOOGLE.\n\n10.2 YOUR USE OF THE SDK AND ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF THE SDK IS AT YOUR OWN DISCRETION AND RISK AND YOU ARE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER DEVICE OR LOSS OF DATA THAT RESULTS FROM SUCH USE. WITHOUT LIMITING THE FOREGOING, YOU UNDERSTAND THAT THE SDK MAY CONTAIN ERRORS, DEFECTS AND SECURITY VULNERABILITIES THAT CAN RESULT IN SIGNIFICANT DAMAGE, INCLUDING THE COMPLETE, IRRECOVERABLE LOSS OF USE OF YOUR COMPUTER SYSTEM OR OTHER DEVICE.\n\n10.3 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.\n\n11. LIMITATION OF LIABILITY\n\n11.1 YOU EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL OR EXEMPLARY DAMAGES THAT MAY BE INCURRED BY YOU, INCLUDING ANY LOSS OF DATA, WHETHER OR NOT GOOGLE OR ITS REPRESENTATIVES HAVE BEEN ADVISED OF OR SHOULD HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING.\n\n12. Indemnification\n\n12.1 To the maximum extent permitted by law, you agree to defend, indemnify and hold harmless Google, its affiliates and their respective directors, officers, employees and agents from and against any and all claims, actions, suits or proceedings, as well as any and all losses, liabilities, damages, costs and expenses (including reasonable attorneys\u2019 fees) arising out of or accruing from (a) your use of the SDK, (b) any application you develop on the SDK that infringes any Intellectual Property Rights of any person or defames any person or violates their rights of publicity or privacy, and (c) any non-compliance by you of the License Agreement.\n\n13. Changes to the License Agreement\n\n13.1 Google may make changes to the License Agreement as it distributes new versions of the SDK. When these changes are made, Google will make a new version of the License Agreement available on the website where the SDK is made available.\n\n14. General Legal Terms\n\n14.1 The License Agreement constitutes the whole legal agreement between you and Google and governs your use of the SDK (excluding any services which Google may provide to you under a separate written agreement), and completely replaces any prior agreements between you and Google in relation to the SDK.\n\n14.2 You agree that if Google does not exercise or enforce any legal right or remedy which is contained in the License Agreement (or which Google has the benefit of under any applicable law), this will not be taken to be a formal waiver of Google's rights and that those rights or remedies will still be available to Google.\n\n14.3 If any court of law, having the jurisdiction to decide on this matter, rules that any provision of the License Agreement is invalid, then that provision will be removed from the License Agreement without affecting the rest of the License Agreement. The remaining provisions of the License Agreement will continue to be valid and enforceable.\n\n14.4 You acknowledge and agree that each member of the group of companies of which Google is the parent shall be third party beneficiaries to the License Agreement and that such other companies shall be entitled to directly enforce, and rely upon, any provision of the License Agreement that confers a benefit on (or rights in favor of) them. Other than this, no other person or company shall be third party beneficiaries to the License Agreement.\n\n14.5 EXPORT RESTRICTIONS. THE SDK IS SUBJECT TO UNITED STATES EXPORT LAWS AND REGULATIONS. YOU MUST COMPLY WITH ALL DOMESTIC AND INTERNATIONAL EXPORT LAWS AND REGULATIONS THAT APPLY TO THE SDK. THESE LAWS INCLUDE RESTRICTIONS ON DESTINATIONS, END USERS AND END USE.\n\n14.6 The License Agreement may not be assigned or transferred by you without the prior written approval of Google, and any attempted assignment without such approval will be void. You shall not delegate your responsibilities or obligations under the License Agreement without the prior written approval of Google.\n\n14.7 The License Agreement, and your relationship with Google under the License Agreement, shall be governed by the laws of the State of California without regard to its conflict of laws provisions. You and Google agree to submit to the exclusive jurisdiction of the courts located within the county of Santa Clara, California to resolve any legal matter arising from the License Agreement. Notwithstanding this, you agree that Google shall still be allowed to apply for injunctive remedies (or an equivalent type of urgent legal relief) in any jurisdiction.\n\nJune 2014.\n
+Pkg.LicenseRef=android-sdk-license
+Pkg.Revision=4
+Pkg.SourceUrl=https\://dl-ssl.google.com/android/repository/repository-10.xml
+Platform.MinToolsRev=22
+Platform.Version=4.4.2
diff --git a/love2dToAPK/tools/tools/android-win/platforms/android-19/uiautomator.jar b/love2dToAPK/tools/tools/android-win/platforms/android-19/uiautomator.jar
new file mode 100644
index 0000000..24a9da5
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/platforms/android-19/uiautomator.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/NOTICE.txt b/love2dToAPK/tools/tools/android-win/tools/NOTICE.txt
new file mode 100644
index 0000000..2a810ff
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/NOTICE.txt
@@ -0,0 +1,15749 @@
+============================================================
+Notices for file(s):
+emulator.exe
+qemu/windows-x86/qemu-system-x86_64.exe
+qemu/windows-x86/qemu-system-aarch64.exe
+qemu/windows-x86/qemu-system-mips64el.exe
+qemu/windows-x86_64/qemu-system-x86_64.exe
+qemu/windows-x86_64/qemu-system-aarch64.exe
+qemu/windows-x86_64/qemu-system-mips64el.exe
+lib/libGLES_CM_translator.dll
+lib/pc-bios/bios.bin
+lib/pc-bios/vgabios-cirrus.bin
+lib/libemugl_test_shared_library.dll
+lib/libEGL_translator.dll
+lib/libGLES_V2_translator.dll
+lib/gles_mesa/opengl32.dll
+lib/gles_mesa/osmesa.dll
+lib/libOpenglRender.dll
+lib/pc-bios/bios.bin
+lib/pc-bios/vgabios-cirrus.bin
+emulator64-ranchu-arm64.exe
+emulator64-ranchu-mips64.exe
+emulator-ranchu-arm64.exe
+emulator-ranchu-mips64.exe
+emulator-arm.exe
+emulator-mips.exe
+emulator-x86.exe
+------------------------------------------------------------
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
+============================================================
+Notices for file(s):
+mksdcard.exe
+------------------------------------------------------------
+
+ Copyright (c) 2005-2014, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+ant/NOTICE
+ant/build.xml
+ant/uibuild.xml
+------------------------------------------------------------
+
+ Copyright (c) 2005-2014, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+apps/SdkController/.project
+apps/SdkController/.classpath
+apps/SdkController/bin/SdkControllerApp.apk
+apps/SdkController/NOTICE
+apps/SdkController/assets/intro_help.html
+apps/SdkController/project.properties
+apps/SdkController/AndroidManifest.xml
+apps/SdkController/res/drawable-mdpi/ic_launcher.png
+apps/SdkController/res/drawable-ldpi/ic_launcher.png
+apps/SdkController/res/layout/multitouch.xml
+apps/SdkController/res/layout/main.xml
+apps/SdkController/res/layout/sensors.xml
+apps/SdkController/res/layout/sensor_row.xml
+apps/SdkController/res/values-v11/styles_v11.xml
+apps/SdkController/res/drawable-hdpi/ic_launcher.png
+apps/SdkController/res/drawable-xhdpi/ic_launcher.png
+apps/SdkController/res/layout-land/sensors.xml
+apps/SdkController/res/values/strings.xml
+apps/SdkController/res/values/styles.xml
+apps/SdkController/.settings/org.eclipse.jdt.core.prefs
+apps/SdkController/proguard-project.txt
+apps/SdkController/src/com/android/tools/sdkcontroller/views/MultiTouchView.java
+apps/SdkController/src/com/android/tools/sdkcontroller/activities/MultiTouchActivity.java
+apps/SdkController/src/com/android/tools/sdkcontroller/activities/MainActivity.java
+apps/SdkController/src/com/android/tools/sdkcontroller/activities/SensorActivity.java
+apps/SdkController/src/com/android/tools/sdkcontroller/activities/BaseBindingActivity.java
+apps/SdkController/src/com/android/tools/sdkcontroller/service/ControllerService.java
+apps/SdkController/src/com/android/tools/sdkcontroller/utils/ApiHelper.java
+apps/SdkController/src/com/android/tools/sdkcontroller/utils/ApiHelper_11.java
+apps/SdkController/src/com/android/tools/sdkcontroller/handlers/MultiTouchChannel.java
+apps/SdkController/src/com/android/tools/sdkcontroller/handlers/SensorChannel.java
+apps/SdkController/src/com/android/tools/sdkcontroller/lib/ProtocolConstants.java
+apps/SdkController/src/com/android/tools/sdkcontroller/lib/Connection.java
+apps/SdkController/src/com/android/tools/sdkcontroller/lib/Channel.java
+apps/SdkController/src/com/android/tools/sdkcontroller/lib/Socket.java
+apps/SdkController/Implementation.txt
+------------------------------------------------------------
+
+ Copyright (c) 2005-2014, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/devices.xml
+lib/android.el
+support/typos-en.txt
+support/typos-es.txt
+support/typos-pt.txt
+support/typos-it.txt
+support/typos-de.txt
+support/typos-tr.txt
+support/typos-nb.txt
+support/typos-hu.txt
+------------------------------------------------------------
+
+ Copyright (c) 2005-2014, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/emulator/snapshots.img
+lib/emulator/skins/dynamic/select.png
+lib/emulator/skins/dynamic/arrow_down.png
+lib/emulator/skins/dynamic/keyboard_on.png
+lib/emulator/skins/dynamic/arrow_left.png
+lib/emulator/skins/dynamic/arrow_up.png
+lib/emulator/skins/dynamic/layout
+lib/emulator/skins/dynamic/hwkeys_on.png
+lib/emulator/skins/dynamic/arrow_right.png
+lib/emulator/skins/dynamic/button.png
+lib/emulator/skins/dynamic/hwkeys_off.png
+lib/emulator/skins/dynamic/basic.png
+lib/emulator/skins/dynamic/dpad_on.png
+lib/emulator/skins/dynamic/keyboard_off.png
+lib/emulator/skins/dynamic/dpad_off.png
+------------------------------------------------------------
+
+ Copyright (c) 2005-2014, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/build.template
+lib/uibuild.template
+lib/build_gradle.template
+------------------------------------------------------------
+
+ Copyright (c) 2005-2014, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/x86/swt.jar
+------------------------------------------------------------
+
+ Eclipse Public License - v 1.0
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF
+THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+*1. DEFINITIONS*
+
+"Contribution" means:
+
+a) in the case of the initial Contributor, the initial code and
+documentation distributed under this Agreement, and
+
+b) in the case of each subsequent Contributor:
+
+i) changes to the Program, and
+
+ii) additions to the Program;
+
+where such changes and/or additions to the Program originate from and
+are distributed by that particular Contributor. A Contribution
+'originates' from a Contributor if it was added to the Program by such
+Contributor itself or anyone acting on such Contributor's behalf.
+Contributions do not include additions to the Program which: (i) are
+separate modules of software distributed in conjunction with the Program
+under their own license agreement, and (ii) are not derivative works of
+the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+"Licensed Patents" mean patent claims licensable by a Contributor which
+are necessarily infringed by the use or sale of its Contribution alone
+or when combined with the Program.
+
+"Program" means the Contributions distributed in accordance with this
+Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement,
+including all Contributors.
+
+*2. GRANT OF RIGHTS*
+
+a) Subject to the terms of this Agreement, each Contributor hereby
+grants Recipient a non-exclusive, worldwide, royalty-free copyright
+license to reproduce, prepare derivative works of, publicly display,
+publicly perform, distribute and sublicense the Contribution of such
+Contributor, if any, and such derivative works, in source code and
+object code form.
+
+b) Subject to the terms of this Agreement, each Contributor hereby
+grants Recipient a non-exclusive, worldwide, royalty-free patent license
+under Licensed Patents to make, use, sell, offer to sell, import and
+otherwise transfer the Contribution of such Contributor, if any, in
+source code and object code form. This patent license shall apply to the
+combination of the Contribution and the Program if, at the time the
+Contribution is added by the Contributor, such addition of the
+Contribution causes such combination to be covered by the Licensed
+Patents. The patent license shall not apply to any other combinations
+which include the Contribution. No hardware per se is licensed hereunder.
+
+c) Recipient understands that although each Contributor grants the
+licenses to its Contributions set forth herein, no assurances are
+provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.
+
+d) Each Contributor represents that to its knowledge it has sufficient
+copyright rights in its Contribution, if any, to grant the copyright
+license set forth in this Agreement.
+
+*3. REQUIREMENTS*
+
+A Contributor may choose to distribute the Program in object code form
+under its own license agreement, provided that:
+
+a) it complies with the terms and conditions of this Agreement; and
+
+b) its license agreement:
+
+i) effectively disclaims on behalf of all Contributors all warranties
+and conditions, express and implied, including warranties or conditions
+of title and non-infringement, and implied warranties or conditions of
+merchantability and fitness for a particular purpose;
+
+ii) effectively excludes on behalf of all Contributors all liability for
+damages, including direct, indirect, special, incidental and
+consequential damages, such as lost profits;
+
+iii) states that any provisions which differ from this Agreement are
+offered by that Contributor alone and not by any other party; and
+
+iv) states that source code for the Program is available from such
+Contributor, and informs licensees how to obtain it in a reasonable
+manner on or through a medium customarily used for software exchange.
+
+When the Program is made available in source code form:
+
+a) it must be made available under this Agreement; and
+
+b) a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained
+within the Program.
+
+Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.
+
+*4. COMMERCIAL DISTRIBUTION*
+
+Commercial distributors of software may accept certain responsibilities
+with respect to end users, business partners and the like. While this
+license is intended to facilitate the commercial use of the Program, the
+Contributor who includes the Program in a commercial product offering
+should do so in a manner which does not create potential liability for
+other Contributors. Therefore, if a Contributor includes the Program in
+a commercial product offering, such Contributor ("Commercial
+Contributor") hereby agrees to defend and indemnify every other
+Contributor ("Indemnified Contributor") against any losses, damages and
+costs (collectively "Losses") arising from claims, lawsuits and other
+legal actions brought by a third party against the Indemnified
+Contributor to the extent caused by the acts or omissions of such
+Commercial Contributor in connection with its distribution of the
+Program in a commercial product offering. The obligations in this
+section do not apply to any claims or Losses relating to any actual or
+alleged intellectual property infringement. In order to qualify, an
+Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial
+Contributor to control, and cooperate with the Commercial Contributor
+in, the defense and any related settlement negotiations. The Indemnified
+Contributor may participate in any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.
+
+*5. NO WARRANTY*
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED
+ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES
+OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR
+A PARTICULAR PURPOSE. Each Recipient is solely responsible for
+determining the appropriateness of using and distributing the Program
+and assumes all risks associated with its exercise of rights under this
+Agreement , including but not limited to the risks and costs of program
+errors, compliance with applicable laws, damage to or loss of data,
+programs or equipment, and unavailability or interruption of operations.
+
+*6. DISCLAIMER OF LIABILITY*
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR
+ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+*7. GENERAL*
+
+If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.
+
+If Recipient institutes patent litigation against any entity (including
+a cross-claim or counterclaim in a lawsuit) alleging that the Program
+itself (excluding combinations of the Program with other software or
+hardware) infringes such Recipient's patent(s), then such Recipient's
+rights granted under Section 2(b) shall terminate as of the date such
+litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it fails
+to comply with any of the material terms or conditions of this Agreement
+and does not cure such failure in a reasonable period of time after
+becoming aware of such noncompliance. If all Recipient's rights under
+this Agreement terminate, Recipient agrees to cease use and distribution
+of the Program as soon as reasonably practicable. However, Recipient's
+obligations under this Agreement and any licenses granted by Recipient
+relating to the Program shall continue and survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement,
+but in order to avoid inconsistency the Agreement is copyrighted and may
+only be modified in the following manner. The Agreement Steward reserves
+the right to publish new versions (including revisions) of this
+Agreement from time to time. No one other than the Agreement Steward has
+the right to modify this Agreement. The Eclipse Foundation is the
+initial Agreement Steward. The Eclipse Foundation may assign the
+responsibility to serve as the Agreement Steward to a suitable separate
+entity. Each new version of the Agreement will be given a distinguishing
+version number. The Program (including Contributions) may always be
+distributed subject to the version of the Agreement under which it was
+received. In addition, after a new version of the Agreement is
+published, Contributor may elect to distribute the Program (including
+its Contributions) under the new version. Except as expressly stated in
+Sections 2(a) and 2(b) above, Recipient receives no rights or licenses
+to the intellectual property of any Contributor under this Agreement,
+whether expressly, by implication, estoppel or otherwise. All rights in
+the Program not expressly granted under this Agreement are reserved.
+
+This Agreement is governed by the laws of the State of New York and the
+intellectual property laws of the United States of America. No party to
+this Agreement will bring a legal action under this Agreement more than
+one year after the cause of action arose. Each party waives its rights
+to a jury trial in any resulting litigation.
+
+============================================================
+Notices for file(s):
+lib/x86_64/swt.jar
+------------------------------------------------------------
+
+ Eclipse Public License - v 1.0
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF
+THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+*1. DEFINITIONS*
+
+"Contribution" means:
+
+a) in the case of the initial Contributor, the initial code and
+documentation distributed under this Agreement, and
+
+b) in the case of each subsequent Contributor:
+
+i) changes to the Program, and
+
+ii) additions to the Program;
+
+where such changes and/or additions to the Program originate from and
+are distributed by that particular Contributor. A Contribution
+'originates' from a Contributor if it was added to the Program by such
+Contributor itself or anyone acting on such Contributor's behalf.
+Contributions do not include additions to the Program which: (i) are
+separate modules of software distributed in conjunction with the Program
+under their own license agreement, and (ii) are not derivative works of
+the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+"Licensed Patents" mean patent claims licensable by a Contributor which
+are necessarily infringed by the use or sale of its Contribution alone
+or when combined with the Program.
+
+"Program" means the Contributions distributed in accordance with this
+Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement,
+including all Contributors.
+
+*2. GRANT OF RIGHTS*
+
+a) Subject to the terms of this Agreement, each Contributor hereby
+grants Recipient a non-exclusive, worldwide, royalty-free copyright
+license to reproduce, prepare derivative works of, publicly display,
+publicly perform, distribute and sublicense the Contribution of such
+Contributor, if any, and such derivative works, in source code and
+object code form.
+
+b) Subject to the terms of this Agreement, each Contributor hereby
+grants Recipient a non-exclusive, worldwide, royalty-free patent license
+under Licensed Patents to make, use, sell, offer to sell, import and
+otherwise transfer the Contribution of such Contributor, if any, in
+source code and object code form. This patent license shall apply to the
+combination of the Contribution and the Program if, at the time the
+Contribution is added by the Contributor, such addition of the
+Contribution causes such combination to be covered by the Licensed
+Patents. The patent license shall not apply to any other combinations
+which include the Contribution. No hardware per se is licensed hereunder.
+
+c) Recipient understands that although each Contributor grants the
+licenses to its Contributions set forth herein, no assurances are
+provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.
+
+d) Each Contributor represents that to its knowledge it has sufficient
+copyright rights in its Contribution, if any, to grant the copyright
+license set forth in this Agreement.
+
+*3. REQUIREMENTS*
+
+A Contributor may choose to distribute the Program in object code form
+under its own license agreement, provided that:
+
+a) it complies with the terms and conditions of this Agreement; and
+
+b) its license agreement:
+
+i) effectively disclaims on behalf of all Contributors all warranties
+and conditions, express and implied, including warranties or conditions
+of title and non-infringement, and implied warranties or conditions of
+merchantability and fitness for a particular purpose;
+
+ii) effectively excludes on behalf of all Contributors all liability for
+damages, including direct, indirect, special, incidental and
+consequential damages, such as lost profits;
+
+iii) states that any provisions which differ from this Agreement are
+offered by that Contributor alone and not by any other party; and
+
+iv) states that source code for the Program is available from such
+Contributor, and informs licensees how to obtain it in a reasonable
+manner on or through a medium customarily used for software exchange.
+
+When the Program is made available in source code form:
+
+a) it must be made available under this Agreement; and
+
+b) a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained
+within the Program.
+
+Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.
+
+*4. COMMERCIAL DISTRIBUTION*
+
+Commercial distributors of software may accept certain responsibilities
+with respect to end users, business partners and the like. While this
+license is intended to facilitate the commercial use of the Program, the
+Contributor who includes the Program in a commercial product offering
+should do so in a manner which does not create potential liability for
+other Contributors. Therefore, if a Contributor includes the Program in
+a commercial product offering, such Contributor ("Commercial
+Contributor") hereby agrees to defend and indemnify every other
+Contributor ("Indemnified Contributor") against any losses, damages and
+costs (collectively "Losses") arising from claims, lawsuits and other
+legal actions brought by a third party against the Indemnified
+Contributor to the extent caused by the acts or omissions of such
+Commercial Contributor in connection with its distribution of the
+Program in a commercial product offering. The obligations in this
+section do not apply to any claims or Losses relating to any actual or
+alleged intellectual property infringement. In order to qualify, an
+Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial
+Contributor to control, and cooperate with the Commercial Contributor
+in, the defense and any related settlement negotiations. The Indemnified
+Contributor may participate in any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.
+
+*5. NO WARRANTY*
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED
+ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES
+OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR
+A PARTICULAR PURPOSE. Each Recipient is solely responsible for
+determining the appropriateness of using and distributing the Program
+and assumes all risks associated with its exercise of rights under this
+Agreement , including but not limited to the risks and costs of program
+errors, compliance with applicable laws, damage to or loss of data,
+programs or equipment, and unavailability or interruption of operations.
+
+*6. DISCLAIMER OF LIABILITY*
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR
+ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+*7. GENERAL*
+
+If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.
+
+If Recipient institutes patent litigation against any entity (including
+a cross-claim or counterclaim in a lawsuit) alleging that the Program
+itself (excluding combinations of the Program with other software or
+hardware) infringes such Recipient's patent(s), then such Recipient's
+rights granted under Section 2(b) shall terminate as of the date such
+litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it fails
+to comply with any of the material terms or conditions of this Agreement
+and does not cure such failure in a reasonable period of time after
+becoming aware of such noncompliance. If all Recipient's rights under
+this Agreement terminate, Recipient agrees to cease use and distribution
+of the Program as soon as reasonably practicable. However, Recipient's
+obligations under this Agreement and any licenses granted by Recipient
+relating to the Program shall continue and survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement,
+but in order to avoid inconsistency the Agreement is copyrighted and may
+only be modified in the following manner. The Agreement Steward reserves
+the right to publish new versions (including revisions) of this
+Agreement from time to time. No one other than the Agreement Steward has
+the right to modify this Agreement. The Eclipse Foundation is the
+initial Agreement Steward. The Eclipse Foundation may assign the
+responsibility to serve as the Agreement Steward to a suitable separate
+entity. Each new version of the Agreement will be given a distinguishing
+version number. The Program (including Contributions) may always be
+distributed subject to the version of the Agreement under which it was
+received. In addition, after a new version of the Agreement is
+published, Contributor may elect to distribute the Program (including
+its Contributions) under the new version. Except as expressly stated in
+Sections 2(a) and 2(b) above, Recipient receives no rights or licenses
+to the intellectual property of any Contributor under this Agreement,
+whether expressly, by implication, estoppel or otherwise. All rights in
+the Program not expressly granted under this Agreement are reserved.
+
+This Agreement is governed by the laws of the State of New York and the
+intellectual property laws of the United States of America. No party to
+this Agreement will bring a legal action under this Agreement more than
+one year after the cause of action arose. Each party waives its rights
+to a jury trial in any resulting litigation.
+
+============================================================
+Notices for file(s):
+lib/annotations.jar
+------------------------------------------------------------
+
+ Copyright (c) 2005-2013, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/ant-tasks.jar
+------------------------------------------------------------
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/archquery.jar
+------------------------------------------------------------
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/asset-studio.jar
+------------------------------------------------------------
+
+ Copyright (c) 2005-2013, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/builder-model.jar
+------------------------------------------------------------
+
+ Copyright (c) 2005-2013, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/common.jar
+------------------------------------------------------------
+
+ Copyright (c) 2005-2013, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/ddmlib.jar
+------------------------------------------------------------
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+draw9patch.bat
+lib/draw9patch.jar
+------------------------------------------------------------
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/dvlib.jar
+------------------------------------------------------------
+
+ Copyright (c) 2005-2013, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+jobb.bat
+lib/jobb.jar
+------------------------------------------------------------
+Portions of this code:
+-------------------------------------------------------------------------------
+Copyright (c) 2000 The Legion Of The Bouncy Castle
+(http://www.bouncycastle.org)
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the "Software")
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense
+and/or sell copies of the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+-------------------------------------------------------------------------------
+Twofish is uncopyrighted and license-free, and was created and analyzed by:
+Bruce Schneier - John Kelsey - Doug Whiting
+David Wagner - Chris Hall - Niels Ferguson
+-------------------------------------------------------------------------------
+Cryptix General License
+
+Copyright (c) 1995-2005 The Cryptix Foundation Limited.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+ 1. Redistributions of source code must retain the copyright notice,
+ this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+-------------------------------------------------------------------------------
+All other code is:
+
+Copyright (C) 2012 The Android Open Source Project
+
+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.
+
+============================================================
+Notices for file(s):
+lib/layoutlib-api.jar
+------------------------------------------------------------
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lint.bat
+lib/lint.jar
+------------------------------------------------------------
+
+ Copyright (c) 2011, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/lint-api.jar
+------------------------------------------------------------
+
+ Copyright (c) 2011, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/lint-checks.jar
+------------------------------------------------------------
+
+ Copyright (c) 2011, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/lint-tests.jar
+------------------------------------------------------------
+
+ Copyright (c) 2011, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/manifest-merger.jar
+------------------------------------------------------------
+
+ Copyright (c) 2011, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/ninepatch.jar
+------------------------------------------------------------
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/rule-api.jar
+------------------------------------------------------------
+
+ Copyright (c) 2011, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/screenshot2.jar
+------------------------------------------------------------
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/sdk-common.jar
+------------------------------------------------------------
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/sdklib.jar
+------------------------------------------------------------
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+templates/projects/NewAndroidLibrary/template.xml
+templates/projects/NewAndroidLibrary/recipe.xml.ftl
+templates/projects/NewAndroidLibrary/template_new_project.png
+templates/projects/NewAndroidLibrary/globals.xml.ftl
+templates/projects/NewAndroidLibrary/root/res/drawable-mdpi/ic_launcher.png
+templates/projects/NewAndroidLibrary/root/res/values-v14/styles_ics.xml.ftl
+templates/projects/NewAndroidLibrary/root/res/values-v11/styles_hc.xml.ftl
+templates/projects/NewAndroidLibrary/root/res/drawable-hdpi/ic_launcher.png
+templates/projects/NewAndroidLibrary/root/res/drawable-xhdpi/ic_launcher.png
+templates/projects/NewAndroidLibrary/root/res/values/styles.xml.ftl
+templates/projects/NewAndroidLibrary/root/res/values/strings.xml.ftl
+templates/projects/NewAndroidLibrary/root/settings.gradle.ftl
+templates/projects/NewAndroidLibrary/root/AndroidManifest.xml.ftl
+templates/projects/NewAndroidLibrary/root/build.gradle.ftl
+templates/projects/NewJavaLibrary/template.xml
+templates/projects/NewJavaLibrary/recipe.xml.ftl
+templates/projects/NewJavaLibrary/template_new_project.png
+templates/projects/NewJavaLibrary/globals.xml.ftl
+templates/projects/NewJavaLibrary/root/settings.gradle.ftl
+templates/projects/NewJavaLibrary/root/src/library_package/Placeholder.java.ftl
+templates/projects/NewJavaLibrary/root/build.gradle.ftl
+templates/projects/NewAndroidApplication/template.xml
+templates/projects/NewAndroidApplication/recipe.xml.ftl
+templates/projects/NewAndroidApplication/template_new_project.png
+templates/projects/NewAndroidApplication/globals.xml.ftl
+templates/projects/NewAndroidApplication/root/res/drawable-mdpi/ic_launcher.png
+templates/projects/NewAndroidApplication/root/res/values-v14/styles_ics.xml.ftl
+templates/projects/NewAndroidApplication/root/res/values-v11/styles_hc.xml.ftl
+templates/projects/NewAndroidApplication/root/res/drawable-hdpi/ic_launcher.png
+templates/projects/NewAndroidApplication/root/res/drawable-xhdpi/ic_launcher.png
+templates/projects/NewAndroidApplication/root/res/values/styles.xml.ftl
+templates/projects/NewAndroidApplication/root/res/values/strings.xml.ftl
+templates/projects/NewAndroidApplication/root/settings.gradle.ftl
+templates/projects/NewAndroidApplication/root/AndroidManifest.xml.ftl
+templates/projects/NewAndroidApplication/root/build.gradle.ftl
+templates/activities/LoginActivity/template.xml
+templates/activities/LoginActivity/recipe.xml.ftl
+templates/activities/LoginActivity/globals.xml.ftl
+templates/activities/LoginActivity/template_login_activity.png
+templates/activities/LoginActivity/root/res/layout/activity_login.xml.ftl
+templates/activities/LoginActivity/root/res/values/dimens.xml
+templates/activities/LoginActivity/root/res/values/strings.xml.ftl
+templates/activities/LoginActivity/root/src/app_package/PlusBaseActivity.java.ftl
+templates/activities/LoginActivity/root/src/app_package/LoginActivity.java.ftl
+templates/activities/LoginActivity/root/AndroidManifest.xml.ftl
+templates/activities/NavigationDrawerActivity/template.xml
+templates/activities/NavigationDrawerActivity/template_blank_activity_drawer.png
+templates/activities/NavigationDrawerActivity/recipe.xml.ftl
+templates/activities/NavigationDrawerActivity/globals.xml.ftl
+templates/activities/NavigationDrawerActivity/root/res/drawable-mdpi/drawer_shadow.9.png
+templates/activities/NavigationDrawerActivity/root/res/drawable-mdpi/ic_drawer.png
+templates/activities/NavigationDrawerActivity/root/res/drawable-xxhdpi/drawer_shadow.9.png
+templates/activities/NavigationDrawerActivity/root/res/drawable-xxhdpi/ic_drawer.png
+templates/activities/NavigationDrawerActivity/root/res/layout/fragment_simple.xml.ftl
+templates/activities/NavigationDrawerActivity/root/res/layout/fragment_navigation_drawer.xml.ftl
+templates/activities/NavigationDrawerActivity/root/res/layout/activity_drawer.xml.ftl
+templates/activities/NavigationDrawerActivity/root/res/drawable-hdpi/drawer_shadow.9.png
+templates/activities/NavigationDrawerActivity/root/res/drawable-hdpi/ic_drawer.png
+templates/activities/NavigationDrawerActivity/root/res/drawable-xhdpi/drawer_shadow.9.png
+templates/activities/NavigationDrawerActivity/root/res/drawable-xhdpi/ic_drawer.png
+templates/activities/NavigationDrawerActivity/root/res/values-w820dp/dimens.xml
+templates/activities/NavigationDrawerActivity/root/res/values/dimens.xml.ftl
+templates/activities/NavigationDrawerActivity/root/res/values/strings.xml.ftl
+templates/activities/NavigationDrawerActivity/root/res/menu/global.xml.ftl
+templates/activities/NavigationDrawerActivity/root/res/menu/main.xml.ftl
+templates/activities/NavigationDrawerActivity/root/src/app_package/NavigationDrawerFragment.java.ftl
+templates/activities/NavigationDrawerActivity/root/src/app_package/include_options_menu.java.ftl
+templates/activities/NavigationDrawerActivity/root/src/app_package/DrawerActivity.java.ftl
+templates/activities/NavigationDrawerActivity/root/src/app_package/include_fragment.java.ftl
+templates/activities/NavigationDrawerActivity/root/AndroidManifest.xml.ftl
+templates/activities/NavigationDrawerActivity/root/build.gradle.ftl
+templates/activities/EmptyActivity/template.xml
+templates/activities/EmptyActivity/template_blank_activity.png
+templates/activities/EmptyActivity/recipe.xml.ftl
+templates/activities/EmptyActivity/globals.xml.ftl
+templates/activities/EmptyActivity/root/res/layout/activity_simple.xml
+templates/activities/EmptyActivity/root/res/values/strings.xml.ftl
+templates/activities/EmptyActivity/root/src/app_package/SimpleActivity.java.ftl
+templates/activities/EmptyActivity/root/AndroidManifest.xml.ftl
+templates/activities/MasterDetailFlow/template.xml
+templates/activities/MasterDetailFlow/template_master_detail.png
+templates/activities/MasterDetailFlow/recipe.xml.ftl
+templates/activities/MasterDetailFlow/globals.xml.ftl
+templates/activities/MasterDetailFlow/root/res/values-sw600dp/refs.xml.ftl
+templates/activities/MasterDetailFlow/root/res/layout/activity_content_twopane.xml.ftl
+templates/activities/MasterDetailFlow/root/res/layout/activity_content_list.xml.ftl
+templates/activities/MasterDetailFlow/root/res/layout/activity_content_detail.xml.ftl
+templates/activities/MasterDetailFlow/root/res/layout/fragment_content_detail.xml.ftl
+templates/activities/MasterDetailFlow/root/res/values-large/refs.xml.ftl
+templates/activities/MasterDetailFlow/root/res/values/strings.xml.ftl
+templates/activities/MasterDetailFlow/root/src/app_package/dummy/DummyContent.java.ftl
+templates/activities/MasterDetailFlow/root/src/app_package/ContentDetailFragment.java.ftl
+templates/activities/MasterDetailFlow/root/src/app_package/ContentListActivity.java.ftl
+templates/activities/MasterDetailFlow/root/src/app_package/ContentDetailActivity.java.ftl
+templates/activities/MasterDetailFlow/root/src/app_package/ContentListFragment.java.ftl
+templates/activities/MasterDetailFlow/root/AndroidManifest.xml.ftl
+templates/activities/BlankActivityWithFragment/template_blank_activity_fragment.png
+templates/activities/BlankActivityWithFragment/template.xml
+templates/activities/BlankActivityWithFragment/recipe.xml.ftl
+templates/activities/BlankActivityWithFragment/globals.xml.ftl
+templates/activities/BlankActivityWithFragment/root/res/layout/fragment_simple.xml.ftl
+templates/activities/BlankActivityWithFragment/root/res/layout/activity_fragment_container.xml.ftl
+templates/activities/BlankActivityWithFragment/root/res/values-w820dp/dimens.xml
+templates/activities/BlankActivityWithFragment/root/res/values/dimens.xml.ftl
+templates/activities/BlankActivityWithFragment/root/res/values/strings.xml.ftl
+templates/activities/BlankActivityWithFragment/root/res/menu/main.xml.ftl
+templates/activities/BlankActivityWithFragment/root/src/app_package/SimpleActivity.java.ftl
+templates/activities/BlankActivityWithFragment/root/src/app_package/include_options_menu.java.ftl
+templates/activities/BlankActivityWithFragment/root/src/app_package/include_fragment.java.ftl
+templates/activities/BlankActivityWithFragment/root/AndroidManifest.xml.ftl
+templates/activities/TabbedActivity/template.xml
+templates/activities/TabbedActivity/template_blank_activity_tabs.png
+templates/activities/TabbedActivity/template_blank_activity_dropdown.png
+templates/activities/TabbedActivity/recipe.xml.ftl
+templates/activities/TabbedActivity/globals.xml.ftl
+templates/activities/TabbedActivity/template_blank_activity_pager.png
+templates/activities/TabbedActivity/root/res/layout/fragment_simple.xml.ftl
+templates/activities/TabbedActivity/root/res/layout/activity_fragment_container.xml.ftl
+templates/activities/TabbedActivity/root/res/layout/activity_pager.xml.ftl
+templates/activities/TabbedActivity/root/res/values-w820dp/dimens.xml
+templates/activities/TabbedActivity/root/res/values/dimens.xml.ftl
+templates/activities/TabbedActivity/root/res/values/strings.xml.ftl
+templates/activities/TabbedActivity/root/res/menu/main.xml.ftl
+templates/activities/TabbedActivity/root/src/app_package/include_options_menu.java.ftl
+templates/activities/TabbedActivity/root/src/app_package/TabsAndPagerActivity.java.ftl
+templates/activities/TabbedActivity/root/src/app_package/DropdownActivity.java.ftl
+templates/activities/TabbedActivity/root/src/app_package/include_fragment.java.ftl
+templates/activities/TabbedActivity/root/AndroidManifest.xml.ftl
+templates/activities/SettingsActivity/template.xml
+templates/activities/SettingsActivity/template_settings_activity.png
+templates/activities/SettingsActivity/recipe.xml.ftl
+templates/activities/SettingsActivity/globals.xml.ftl
+templates/activities/SettingsActivity/root/res/xml/pref_data_sync.xml
+templates/activities/SettingsActivity/root/res/xml/pref_general.xml
+templates/activities/SettingsActivity/root/res/xml/pref_headers.xml.ftl
+templates/activities/SettingsActivity/root/res/xml/pref_notification.xml
+templates/activities/SettingsActivity/root/res/values/strings.xml.ftl
+templates/activities/SettingsActivity/root/src/app_package/SettingsActivity.java.ftl
+templates/activities/SettingsActivity/root/AndroidManifest.xml.ftl
+templates/activities/FullscreenActivity/template.xml
+templates/activities/FullscreenActivity/template_fullscreen_activity.png
+templates/activities/FullscreenActivity/recipe.xml.ftl
+templates/activities/FullscreenActivity/globals.xml.ftl
+templates/activities/FullscreenActivity/root/res/layout/activity_fullscreen.xml.ftl
+templates/activities/FullscreenActivity/root/res/values-v11/styles.xml
+templates/activities/FullscreenActivity/root/res/values/styles.xml
+templates/activities/FullscreenActivity/root/res/values/colors.xml
+templates/activities/FullscreenActivity/root/res/values/strings.xml.ftl
+templates/activities/FullscreenActivity/root/res/values/attrs.xml
+templates/activities/FullscreenActivity/root/src/app_package/FullscreenActivity.java.ftl
+templates/activities/FullscreenActivity/root/src/app_package/util/SystemUiHiderBase.java.ftl
+templates/activities/FullscreenActivity/root/src/app_package/util/SystemUiHider.java.ftl
+templates/activities/FullscreenActivity/root/src/app_package/util/SystemUiHiderHoneycomb.java.ftl
+templates/activities/FullscreenActivity/root/AndroidManifest.xml.ftl
+templates/activities/BlankActivity/template.xml
+templates/activities/BlankActivity/template_blank_activity.png
+templates/activities/BlankActivity/recipe.xml.ftl
+templates/activities/BlankActivity/globals.xml.ftl
+templates/activities/BlankActivity/root/res/layout/activity_simple.xml.ftl
+templates/activities/BlankActivity/root/res/values-w820dp/dimens.xml
+templates/activities/BlankActivity/root/res/values/dimens.xml.ftl
+templates/activities/BlankActivity/root/res/values/strings.xml.ftl
+templates/activities/BlankActivity/root/res/menu/main.xml.ftl
+templates/activities/BlankActivity/root/src/app_package/SimpleActivity.java.ftl
+templates/activities/BlankActivity/root/AndroidManifest.xml.ftl
+templates/gradle/utils/dependencies.gradle.ftl
+templates/gradle/wrapper/gradlew
+templates/gradle/wrapper/gradlew.bat
+templates/gradle/wrapper/gradle/wrapper/gradle-wrapper.jar
+templates/gradle/wrapper/gradle/wrapper/gradle-wrapper.properties
+templates/other/Notification/template.xml
+templates/other/Notification/template_notification_text.png
+templates/other/Notification/template_notification_picture_actions.png
+templates/other/Notification/template_notification_list_actions.png
+templates/other/Notification/template_notification_text_actions.png
+templates/other/Notification/template_notification_none.png
+templates/other/Notification/template_notification_picture.png
+templates/other/Notification/recipe.xml.ftl
+templates/other/Notification/globals.xml.ftl
+templates/other/Notification/template_notification_list.png
+templates/other/Notification/template_notification_none_actions.png
+templates/other/Notification/root/res/drawable-mdpi/ic_action_stat_share.png
+templates/other/Notification/root/res/drawable-mdpi/ic_action_stat_reply.png
+templates/other/Notification/root/res/drawable-hdpi/ic_action_stat_share.png
+templates/other/Notification/root/res/drawable-hdpi/ic_action_stat_reply.png
+templates/other/Notification/root/res/drawable-xhdpi/ic_action_stat_share.png
+templates/other/Notification/root/res/drawable-xhdpi/ic_action_stat_reply.png
+templates/other/Notification/root/res/drawable-nodpi/example_picture_large.png
+templates/other/Notification/root/res/drawable-nodpi/example_picture_small.png
+templates/other/Notification/root/res/values/strings.xml.ftl
+templates/other/Notification/root/src/app_package/NotificationHelper.java.ftl
+templates/other/Notification/root/AndroidManifest.xml.ftl
+templates/other/AidlFile/template.xml
+templates/other/AidlFile/recipe.xml.ftl
+templates/other/AidlFile/root/src/app_package/interface.aidl.ftl
+templates/other/Service/template.xml
+templates/other/Service/recipe.xml.ftl
+templates/other/Service/globals.xml.ftl
+templates/other/Service/root/src/app_package/Service.java.ftl
+templates/other/Service/root/AndroidManifest.xml.ftl
+templates/other/ListFragment/templates_list_fragment.png
+templates/other/ListFragment/template.xml
+templates/other/ListFragment/recipe.xml.ftl
+templates/other/ListFragment/globals.xml.ftl
+templates/other/ListFragment/root/res/values-sw600dp/refs_lrg.xml.ftl
+templates/other/ListFragment/root/res/layout/fragment_list.xml
+templates/other/ListFragment/root/res/layout/fragment_grid.xml
+templates/other/ListFragment/root/res/values-large/refs_lrg.xml.ftl
+templates/other/ListFragment/root/res/values/refs_lrg.xml.ftl
+templates/other/ListFragment/root/res/values/refs.xml.ftl
+templates/other/ListFragment/root/src/app_package/dummy/DummyContent.java.ftl
+templates/other/ListFragment/root/src/app_package/ListFragment.java.ftl
+templates/other/ContentProvider/template.xml
+templates/other/ContentProvider/recipe.xml.ftl
+templates/other/ContentProvider/globals.xml.ftl
+templates/other/ContentProvider/root/src/app_package/ContentProvider.java.ftl
+templates/other/ContentProvider/root/AndroidManifest.xml.ftl
+templates/other/ResFolder/template.xml
+templates/other/ResFolder/recipe.xml.ftl
+templates/other/ResFolder/root/build.gradle.ftl
+templates/other/Daydream/template.xml
+templates/other/Daydream/recipe.xml.ftl
+templates/other/Daydream/globals.xml.ftl
+templates/other/Daydream/root/res/layout-v17/dream.xml
+templates/other/Daydream/root/res/xml/xml_dream.xml.ftl
+templates/other/Daydream/root/res/xml/dream_prefs.xml
+templates/other/Daydream/root/res/values/strings.xml.ftl
+templates/other/Daydream/root/src/app_package/SettingsActivity.java.ftl
+templates/other/Daydream/root/src/app_package/DreamService.java.ftl
+templates/other/Daydream/root/AndroidManifest.xml.ftl
+templates/other/IntentService/template.xml
+templates/other/IntentService/recipe.xml.ftl
+templates/other/IntentService/globals.xml.ftl
+templates/other/IntentService/root/src/app_package/IntentService.java.ftl
+templates/other/IntentService/root/AndroidManifest.xml.ftl
+templates/other/AssetsFolder/template.xml
+templates/other/AssetsFolder/recipe.xml.ftl
+templates/other/AssetsFolder/root/build.gradle.ftl
+templates/other/AidlFolder/template.xml
+templates/other/AidlFolder/recipe.xml.ftl
+templates/other/AidlFolder/root/build.gradle.ftl
+templates/other/RsFolder/template.xml
+templates/other/RsFolder/recipe.xml.ftl
+templates/other/RsFolder/root/build.gradle.ftl
+templates/other/BlankFragment/template.xml
+templates/other/BlankFragment/recipe.xml.ftl
+templates/other/BlankFragment/globals.xml.ftl
+templates/other/BlankFragment/template_blank_fragment.png
+templates/other/BlankFragment/root/res/layout/fragment_blank.xml.ftl
+templates/other/BlankFragment/root/res/values/strings.xml
+templates/other/BlankFragment/root/src/app_package/BlankFragment.java.ftl
+templates/other/LayoutResourceFile/template.xml
+templates/other/LayoutResourceFile/recipe.xml.ftl
+templates/other/LayoutResourceFile/root/res/layout.xml.ftl
+templates/other/BroadcastReceiver/template.xml
+templates/other/BroadcastReceiver/recipe.xml.ftl
+templates/other/BroadcastReceiver/globals.xml.ftl
+templates/other/BroadcastReceiver/root/src/app_package/BroadcastReceiver.java.ftl
+templates/other/BroadcastReceiver/root/AndroidManifest.xml.ftl
+templates/other/ValueResourceFile/template.xml
+templates/other/ValueResourceFile/recipe.xml.ftl
+templates/other/ValueResourceFile/root/res/values.xml.ftl
+templates/other/JavaFolder/template.xml
+templates/other/JavaFolder/recipe.xml.ftl
+templates/other/JavaFolder/root/build.gradle.ftl
+templates/other/JniFolder/template.xml
+templates/other/JniFolder/recipe.xml.ftl
+templates/other/JniFolder/root/build.gradle.ftl
+templates/other/AndroidManifest/template.xml
+templates/other/AndroidManifest/recipe.xml.ftl
+templates/other/AndroidManifest/root/AndroidManifest.xml.ftl
+templates/other/AndroidManifest/root/build.gradle.ftl
+templates/other/PlusOneFragment/template.xml
+templates/other/PlusOneFragment/recipe.xml.ftl
+templates/other/PlusOneFragment/templates_plusone_fragment.png
+templates/other/PlusOneFragment/globals.xml.ftl
+templates/other/PlusOneFragment/root/res/layout/fragment_plus_one.xml.ftl
+templates/other/PlusOneFragment/root/src/app_package/PlusOneFragment.java.ftl
+templates/other/PlusOneFragment/root/AndroidManifest.xml.ftl
+templates/other/ResourcesFolder/template.xml
+templates/other/ResourcesFolder/recipe.xml.ftl
+templates/other/ResourcesFolder/root/build.gradle.ftl
+templates/other/AppWidget/template.xml
+templates/other/AppWidget/recipe.xml.ftl
+templates/other/AppWidget/globals.xml.ftl
+templates/other/AppWidget/thumbs/template_widget_2x1_v.png
+templates/other/AppWidget/thumbs/template_widget_2x3.png
+templates/other/AppWidget/thumbs/template_widget_3x4_h.png
+templates/other/AppWidget/thumbs/template_widget_1x1.png
+templates/other/AppWidget/thumbs/template_widget_1x1_vh.png
+templates/other/AppWidget/thumbs/template_widget_1x1_v.png
+templates/other/AppWidget/thumbs/template_widget_4x4_vh.png
+templates/other/AppWidget/thumbs/template_widget_4x3_v.png
+templates/other/AppWidget/thumbs/template_widget_4x1_vh.png
+templates/other/AppWidget/thumbs/template_widget_2x3_v.png
+templates/other/AppWidget/thumbs/template_widget_3x3_vh.png
+templates/other/AppWidget/thumbs/template_widget_3x3_v.png
+templates/other/AppWidget/thumbs/template_widget_3x1_vh.png
+templates/other/AppWidget/thumbs/template_widget_4x3_vh.png
+templates/other/AppWidget/thumbs/template_widget_3x1_v.png
+templates/other/AppWidget/thumbs/template_widget_3x2_vh.png
+templates/other/AppWidget/thumbs/template_widget_3x2_h.png
+templates/other/AppWidget/thumbs/template_widget_3x1_h.png
+templates/other/AppWidget/thumbs/template_widget_1x2_h.png
+templates/other/AppWidget/thumbs/template_widget_4x3_h.png
+templates/other/AppWidget/thumbs/template_widget_2x2_h.png
+templates/other/AppWidget/thumbs/template_widget_2x4_v.png
+templates/other/AppWidget/thumbs/template_widget_1x2.png
+templates/other/AppWidget/thumbs/template_widget_4x4.png
+templates/other/AppWidget/thumbs/template_widget_1x4.png
+templates/other/AppWidget/thumbs/template_widget_4x2_v.png
+templates/other/AppWidget/thumbs/template_widget_3x3_h.png
+templates/other/AppWidget/thumbs/template_widget_3x2_v.png
+templates/other/AppWidget/thumbs/template_widget_4x4_v.png
+templates/other/AppWidget/thumbs/template_widget_1x1_h.png
+templates/other/AppWidget/thumbs/template_widget_3x4_v.png
+templates/other/AppWidget/thumbs/template_widget_2x3_vh.png
+templates/other/AppWidget/thumbs/template_widget_2x2.png
+templates/other/AppWidget/thumbs/template_widget_4x3.png
+templates/other/AppWidget/thumbs/template_widget_4x2.png
+templates/other/AppWidget/thumbs/template_widget_1x3_h.png
+templates/other/AppWidget/thumbs/template_widget_2x1_vh.png
+templates/other/AppWidget/thumbs/template_widget_2x2_vh.png
+templates/other/AppWidget/thumbs/template_widget_2x1_h.png
+templates/other/AppWidget/thumbs/template_widget_4x1_h.png
+templates/other/AppWidget/thumbs/template_widget_3x1.png
+templates/other/AppWidget/thumbs/template_widget_2x4_h.png
+templates/other/AppWidget/thumbs/template_widget_1x4_v.png
+templates/other/AppWidget/thumbs/template_widget_1x2_v.png
+templates/other/AppWidget/thumbs/template_widget_4x4_h.png
+templates/other/AppWidget/thumbs/template_widget_1x3_v.png
+templates/other/AppWidget/thumbs/template_widget_2x4_vh.png
+templates/other/AppWidget/thumbs/template_widget_1x3_vh.png
+templates/other/AppWidget/thumbs/template_widget_1x3.png
+templates/other/AppWidget/thumbs/template_widget_2x2_v.png
+templates/other/AppWidget/thumbs/template_widget_4x1_v.png
+templates/other/AppWidget/thumbs/template_widget_3x2.png
+templates/other/AppWidget/thumbs/template_widget_4x2_h.png
+templates/other/AppWidget/thumbs/template_widget_1x2_vh.png
+templates/other/AppWidget/thumbs/template_widget_3x4.png
+templates/other/AppWidget/thumbs/template_widget_1x4_h.png
+templates/other/AppWidget/thumbs/template_widget_3x4_vh.png
+templates/other/AppWidget/thumbs/template_widget_4x2_vh.png
+templates/other/AppWidget/thumbs/template_widget_2x1.png
+templates/other/AppWidget/thumbs/template_widget_4x1.png
+templates/other/AppWidget/thumbs/template_widget_1x4_vh.png
+templates/other/AppWidget/thumbs/template_widget_3x3.png
+templates/other/AppWidget/thumbs/template_widget_2x4.png
+templates/other/AppWidget/thumbs/template_widget_2x3_h.png
+templates/other/AppWidget/root/res/xml/appwidget_info.xml.ftl
+templates/other/AppWidget/root/res/values-v14/dimens.xml
+templates/other/AppWidget/root/res/layout/appwidget_configure.xml
+templates/other/AppWidget/root/res/layout/appwidget.xml
+templates/other/AppWidget/root/res/drawable-nodpi/example_appwidget_preview.png
+templates/other/AppWidget/root/res/values/dimens.xml
+templates/other/AppWidget/root/res/values/strings.xml.ftl
+templates/other/AppWidget/root/src/app_package/AppWidget.java.ftl
+templates/other/AppWidget/root/src/app_package/AppWidgetConfigureActivity.java.ftl
+templates/other/AppWidget/root/AndroidManifest.xml.ftl
+templates/other/CustomView/template.xml
+templates/other/CustomView/recipe.xml.ftl
+templates/other/CustomView/globals.xml.ftl
+templates/other/CustomView/root/res/layout/sample.xml.ftl
+templates/other/CustomView/root/res/values/attrs.xml.ftl
+templates/other/CustomView/root/src/app_package/CustomView.java.ftl
+------------------------------------------------------------
+
+ Copyright (c) 2005-2014, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/emma.jar
+lib/emma_ant.jar
+lib/emma_device.jar
+------------------------------------------------------------
+Common Public License - v 1.0
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S
+ACCEPTANCE OF THIS AGREEMENT.
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+ a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
+ b) in the case of each subsequent Contributor:
+
+ i) changes to the Program, and
+
+ ii) additions to the Program;
+
+ where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was
+added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules
+of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
+
+"Program" means the Contributions distributed in accordance with this Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
+
+2. GRANT OF RIGHTS
+
+ a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative
+works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
+
+ b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make,
+use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the
+combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
+
+ c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the
+Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other
+entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole
+responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the
+Program, it is Recipient's responsibility to acquire that license before distributing the Program.
+
+ d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this
+Agreement.
+
+3. REQUIREMENTS
+
+A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
+
+ a) it complies with the terms and conditions of this Agreement; and
+
+ b) its license agreement:
+
+ i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement,
+and implied warranties or conditions of merchantability and fitness for a particular purpose;
+
+ ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost
+profits;
+
+ iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
+
+ iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium
+customarily used for software exchange.
+
+When the Program is made available in source code form:
+
+ a) it must be made available under this Agreement; and
+
+ b) a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained within the Program.
+
+Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the
+Contribution.
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the
+commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other
+Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify
+every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a
+third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a
+commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to
+qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate
+with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor
+then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this
+section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
+WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for
+determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to
+the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this
+Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
+
+If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any
+patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes
+patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a
+reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the
+Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and
+survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following
+manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the
+right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new
+version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under
+which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new
+version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement,
+whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
+
+This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal
+action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
+
+============================================================
+Notices for file(s):
+lib/fat32lib.jar
+------------------------------------------------------------
+GNU LESSER GENERAL PUBLIC LICENSE
+
+Version 2.1, February 1999
+
+Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+Preamble
+
+The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
+
+This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
+
+When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
+
+To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
+
+For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
+
+We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
+
+To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
+
+Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
+
+Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
+
+When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
+
+We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
+
+For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
+
+In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
+
+Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
+
+The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
+
+A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
+
+The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
+
+"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
+
+Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
+
+1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
+
+You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
+
+a) The modified work must itself be a software library.
+b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
+c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
+d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
+(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
+
+3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
+
+Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
+
+This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
+
+4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
+
+If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
+
+5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
+
+However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
+
+When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
+
+If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
+
+Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
+
+6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
+
+You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
+
+a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
+b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
+c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
+d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
+e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
+For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
+
+It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
+
+7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
+
+a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
+b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
+8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
+
+9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
+
+10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
+
+11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
+
+This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
+
+12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
+
+13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
+
+14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
+
+NO WARRANTY
+
+15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+support/annotations.jar
+------------------------------------------------------------
+
+ Copyright (c) 2012-2014, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/AVD Manager.exe
+------------------------------------------------------------
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/find_java32.exe
+lib/find_java64.exe
+lib/find_java.bat
+------------------------------------------------------------
+
+ Copyright (c) 2005-2011, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/SDK Manager.exe
+------------------------------------------------------------
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/chimpchat.jar
+------------------------------------------------------------
+
+ Copyright (c) 2005-2011, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+ddms.bat
+lib/ddms.jar
+------------------------------------------------------------
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/ddmuilib.jar
+------------------------------------------------------------
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+hierarchyviewer.bat
+lib/hierarchyviewer2.jar
+------------------------------------------------------------
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/hierarchyviewer2lib.jar
+------------------------------------------------------------
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+monkeyrunner.bat
+lib/monkeyrunner.jar
+------------------------------------------------------------
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+android.bat
+lib/sdkmanager.jar
+------------------------------------------------------------
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/sdkstats.jar
+------------------------------------------------------------
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/sdkuilib.jar
+------------------------------------------------------------
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/swtmenubar.jar
+------------------------------------------------------------
+*Eclipse Public License - v 1.0*
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF
+THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+*1. DEFINITIONS*
+
+"Contribution" means:
+
+a) in the case of the initial Contributor, the initial code and
+documentation distributed under this Agreement, and
+b) in the case of each subsequent Contributor:
+
+i) changes to the Program, and
+
+ii) additions to the Program;
+
+where such changes and/or additions to the Program originate from and
+are distributed by that particular Contributor. A Contribution
+'originates' from a Contributor if it was added to the Program by such
+Contributor itself or anyone acting on such Contributor's behalf.
+Contributions do not include additions to the Program which: (i) are
+separate modules of software distributed in conjunction with the Program
+under their own license agreement, and (ii) are not derivative works of
+the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+"Licensed Patents " mean patent claims licensable by a Contributor which
+are necessarily infringed by the use or sale of its Contribution alone
+or when combined with the Program.
+
+"Program" means the Contributions distributed in accordance with this
+Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement,
+including all Contributors.
+
+*2. GRANT OF RIGHTS*
+
+a) Subject to the terms of this Agreement, each Contributor hereby
+grants Recipient a non-exclusive, worldwide, royalty-free copyright
+license to reproduce, prepare derivative works of, publicly display,
+publicly perform, distribute and sublicense the Contribution of such
+Contributor, if any, and such derivative works, in source code and
+object code form.
+
+b) Subject to the terms of this Agreement, each Contributor hereby
+grants Recipient a non-exclusive, worldwide, royalty-free patent license
+under Licensed Patents to make, use, sell, offer to sell, import and
+otherwise transfer the Contribution of such Contributor, if any, in
+source code and object code form. This patent license shall apply to the
+combination of the Contribution and the Program if, at the time the
+Contribution is added by the Contributor, such addition of the
+Contribution causes such combination to be covered by the Licensed
+Patents. The patent license shall not apply to any other combinations
+which include the Contribution. No hardware per se is licensed hereunder.
+
+c) Recipient understands that although each Contributor grants the
+licenses to its Contributions set forth herein, no assurances are
+provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.
+
+d) Each Contributor represents that to its knowledge it has sufficient
+copyright rights in its Contribution, if any, to grant the copyright
+license set forth in this Agreement.
+
+*3. REQUIREMENTS*
+
+A Contributor may choose to distribute the Program in object code form
+under its own license agreement, provided that:
+
+a) it complies with the terms and conditions of this Agreement; and
+
+b) its license agreement:
+
+i) effectively disclaims on behalf of all Contributors all warranties
+and conditions, express and implied, including warranties or conditions
+of title and non-infringement, and implied warranties or conditions of
+merchantability and fitness for a particular purpose;
+
+ii) effectively excludes on behalf of all Contributors all liability for
+damages, including direct, indirect, special, incidental and
+consequential damages, such as lost profits;
+
+iii) states that any provisions which differ from this Agreement are
+offered by that Contributor alone and not by any other party; and
+
+iv) states that source code for the Program is available from such
+Contributor, and informs licensees how to obtain it in a reasonable
+manner on or through a medium customarily used for software exchange.
+
+When the Program is made available in source code form:
+
+a) it must be made available under this Agreement; and
+
+b) a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained
+within the Program.
+
+Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.
+
+*4. COMMERCIAL DISTRIBUTION*
+
+Commercial distributors of software may accept certain responsibilities
+with respect to end users, business partners and the like. While this
+license is intended to facilitate the commercial use of the Program, the
+Contributor who includes the Program in a commercial product offering
+should do so in a manner which does not create potential liability for
+other Contributors. Therefore, if a Contributor includes the Program in
+a commercial product offering, such Contributor ("Commercial
+Contributor") hereby agrees to defend and indemnify every other
+Contributor ("Indemnified Contributor") against any losses, damages and
+costs (collectively "Losses") arising from claims, lawsuits and other
+legal actions brought by a third party against the Indemnified
+Contributor to the extent caused by the acts or omissions of such
+Commercial Contributor in connection with its distribution of the
+Program in a commercial product offering. The obligations in this
+section do not apply to any claims or Losses relating to any actual or
+alleged intellectual property infringement. In order to qualify, an
+Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial
+Contributor to control, and cooperate with the Commercial Contributor
+in, the defense and any related settlement negotiations. The Indemnified
+Contributor may participate in any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.
+
+*5. NO WARRANTY*
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED
+ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES
+OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR
+A PARTICULAR PURPOSE. Each Recipient is solely responsible for
+determining the appropriateness of using and distributing the Program
+and assumes all risks associated with its exercise of rights under this
+Agreement , including but not limited to the risks and costs of program
+errors, compliance with applicable laws, damage to or loss of data,
+programs or equipment, and unavailability or interruption of operations.
+
+*6. DISCLAIMER OF LIABILITY*
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR
+ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+*7. GENERAL*
+
+If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.
+
+If Recipient institutes patent litigation against any entity (including
+a cross-claim or counterclaim in a lawsuit) alleging that the Program
+itself (excluding combinations of the Program with other software or
+hardware) infringes such Recipient's patent(s), then such Recipient's
+rights granted under Section 2(b) shall terminate as of the date such
+litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it fails
+to comply with any of the material terms or conditions of this Agreement
+and does not cure such failure in a reasonable period of time after
+becoming aware of such noncompliance. If all Recipient's rights under
+this Agreement terminate, Recipient agrees to cease use and distribution
+of the Program as soon as reasonably practicable. However, Recipient's
+obligations under this Agreement and any licenses granted by Recipient
+relating to the Program shall continue and survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement,
+but in order to avoid inconsistency the Agreement is copyrighted and may
+only be modified in the following manner. The Agreement Steward reserves
+the right to publish new versions (including revisions) of this
+Agreement from time to time. No one other than the Agreement Steward has
+the right to modify this Agreement. The Eclipse Foundation is the
+initial Agreement Steward. The Eclipse Foundation may assign the
+responsibility to serve as the Agreement Steward to a suitable separate
+entity. Each new version of the Agreement will be given a distinguishing
+version number. The Program (including Contributions) may always be
+distributed subject to the version of the Agreement under which it was
+received. In addition, after a new version of the Agreement is
+published, Contributor may elect to distribute the Program (including
+its Contributions) under the new version. Except as expressly stated in
+Sections 2(a) and 2(b) above, Recipient receives no rights or licenses
+to the intellectual property of any Contributor under this Agreement,
+whether expressly, by implication, estoppel or otherwise. All rights in
+the Program not expressly granted under this Agreement are reserved.
+
+This Agreement is governed by the laws of the State of New York and the
+intellectual property laws of the United States of America. No party to
+this Agreement will bring a legal action under this Agreement more than
+one year after the cause of action arose. Each party waives its rights
+to a jury trial in any resulting litigation.
+
+
+
+============================================================
+Notices for file(s):
+traceview.bat
+lib/traceview.jar
+------------------------------------------------------------
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+uiautomatorviewer.bat
+lib/uiautomatorviewer.jar
+------------------------------------------------------------
+
+ Copyright (c) 2005-2008, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+============================================================
+Notices for file(s):
+lib/commons-codec-1.4.jar
+------------------------------------------------------------
+Apache HttpComponents Client
+Copyright 1999-2011 The Apache Software Foundation
+
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org/).
+
+This project contains annotations derived from JCIP-ANNOTATIONS
+Copyright (c) 2005 Brian Goetz and Tim Peierls. See http://www.jcip.net
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+This project contains annotations derived from JCIP-ANNOTATIONS
+Copyright (c) 2005 Brian Goetz and Tim Peierls.
+See http://www.jcip.net and the Creative Commons Attribution License
+(http://creativecommons.org/licenses/by/2.5)
+
+============================================================
+Notices for file(s):
+lib/commons-compress-1.8.1.jar
+------------------------------------------------------------
+Apache Commons Compress
+Copyright 2002-2014 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+The files in the package org.apache.commons.compress.archivers.sevenz
+were derived from the LZMA SDK, version 9.20 (C/ and CPP/7zip/),
+which has been placed in the public domain:
+
+"LZMA SDK is placed in the public domain." (http://www.7-zip.org/sdk.html)
+
+
+-------
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
+
+============================================================
+Notices for file(s):
+lib/httpclient-4.1.1.jar
+------------------------------------------------------------
+Apache HttpComponents Client
+Copyright 1999-2011 The Apache Software Foundation
+
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org/).
+
+This project contains annotations derived from JCIP-ANNOTATIONS
+Copyright (c) 2005 Brian Goetz and Tim Peierls. See http://www.jcip.net
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+This project contains annotations derived from JCIP-ANNOTATIONS
+Copyright (c) 2005 Brian Goetz and Tim Peierls.
+See http://www.jcip.net and the Creative Commons Attribution License
+(http://creativecommons.org/licenses/by/2.5)
+
+============================================================
+Notices for file(s):
+lib/annotations-12.0.jar
+------------------------------------------------------------
+/*
+ * Apache License
+ * Version 2.0, January 2004
+ * http://www.apache.org/licenses/
+ *
+ * TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+ *
+ * 1. Definitions.
+ *
+ * "License" shall mean the terms and conditions for use, reproduction,
+ * and distribution as defined by Sections 1 through 9 of this document.
+ *
+ * "Licensor" shall mean the copyright owner or entity authorized by
+ * the copyright owner that is granting the License.
+ *
+ * "Legal Entity" shall mean the union of the acting entity and all
+ * other entities that control, are controlled by, or are under common
+ * control with that entity. For the purposes of this definition,
+ * "control" means (i) the power, direct or indirect, to cause the
+ * direction or management of such entity, whether by contract or
+ * otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ * outstanding shares, or (iii) beneficial ownership of such entity.
+ *
+ * "You" (or "Your") shall mean an individual or Legal Entity
+ * exercising permissions granted by this License.
+ *
+ * "Source" form shall mean the preferred form for making modifications,
+ * including but not limited to software source code, documentation
+ * source, and configuration files.
+ *
+ * "Object" form shall mean any form resulting from mechanical
+ * transformation or translation of a Source form, including but
+ * not limited to compiled object code, generated documentation,
+ * and conversions to other media types.
+ *
+ * "Work" shall mean the work of authorship, whether in Source or
+ * Object form, made available under the License, as indicated by a
+ * copyright notice that is included in or attached to the work
+ * (an example is provided in the Appendix below).
+ *
+ * "Derivative Works" shall mean any work, whether in Source or Object
+ * form, that is based on (or derived from) the Work and for which the
+ * editorial revisions, annotations, elaborations, or other modifications
+ * represent, as a whole, an original work of authorship. For the purposes
+ * of this License, Derivative Works shall not include works that remain
+ * separable from, or merely link (or bind by name) to the interfaces of,
+ * the Work and Derivative Works thereof.
+ *
+ * "Contribution" shall mean any work of authorship, including
+ * the original version of the Work and any modifications or additions
+ * to that Work or Derivative Works thereof, that is intentionally
+ * submitted to Licensor for inclusion in the Work by the copyright owner
+ * or by an individual or Legal Entity authorized to submit on behalf of
+ * the copyright owner. For the purposes of this definition, "submitted"
+ * means any form of electronic, verbal, or written communication sent
+ * to the Licensor or its representatives, including but not limited to
+ * communication on electronic mailing lists, source code control systems,
+ * and issue tracking systems that are managed by, or on behalf of, the
+ * Licensor for the purpose of discussing and improving the Work, but
+ * excluding communication that is conspicuously marked or otherwise
+ * designated in writing by the copyright owner as "Not a Contribution."
+ *
+ * "Contributor" shall mean Licensor and any individual or Legal Entity
+ * on behalf of whom a Contribution has been received by Licensor and
+ * subsequently incorporated within the Work.
+ *
+ * 2. Grant of Copyright License. Subject to the terms and conditions of
+ * this License, each Contributor hereby grants to You a perpetual,
+ * worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ * copyright license to reproduce, prepare Derivative Works of,
+ * publicly display, publicly perform, sublicense, and distribute the
+ * Work and such Derivative Works in Source or Object form.
+ *
+ * 3. Grant of Patent License. Subject to the terms and conditions of
+ * this License, each Contributor hereby grants to You a perpetual,
+ * worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ * (except as stated in this section) patent license to make, have made,
+ * use, offer to sell, sell, import, and otherwise transfer the Work,
+ * where such license applies only to those patent claims licensable
+ * by such Contributor that are necessarily infringed by their
+ * Contribution(s) alone or by combination of their Contribution(s)
+ * with the Work to which such Contribution(s) was submitted. If You
+ * institute patent litigation against any entity (including a
+ * cross-claim or counterclaim in a lawsuit) alleging that the Work
+ * or a Contribution incorporated within the Work constitutes direct
+ * or contributory patent infringement, then any patent licenses
+ * granted to You under this License for that Work shall terminate
+ * as of the date such litigation is filed.
+ *
+ * 4. Redistribution. You may reproduce and distribute copies of the
+ * Work or Derivative Works thereof in any medium, with or without
+ * modifications, and in Source or Object form, provided that You
+ * meet the following conditions:
+ *
+ * (a) You must give any other recipients of the Work or
+ * Derivative Works a copy of this License; and
+ *
+ * (b) You must cause any modified files to carry prominent notices
+ * stating that You changed the files; and
+ *
+ * (c) You must retain, in the Source form of any Derivative Works
+ * that You distribute, all copyright, patent, trademark, and
+ * attribution notices from the Source form of the Work,
+ * excluding those notices that do not pertain to any part of
+ * the Derivative Works; and
+ *
+ * (d) If the Work includes a "NOTICE" text file as part of its
+ * distribution, then any Derivative Works that You distribute must
+ * include a readable copy of the attribution notices contained
+ * within such NOTICE file, excluding those notices that do not
+ * pertain to any part of the Derivative Works, in at least one
+ * of the following places: within a NOTICE text file distributed
+ * as part of the Derivative Works; within the Source form or
+ * documentation, if provided along with the Derivative Works; or,
+ * within a display generated by the Derivative Works, if and
+ * wherever such third-party notices normally appear. The contents
+ * of the NOTICE file are for informational purposes only and
+ * do not modify the License. You may add Your own attribution
+ * notices within Derivative Works that You distribute, alongside
+ * or as an addendum to the NOTICE text from the Work, provided
+ * that such additional attribution notices cannot be construed
+ * as modifying the License.
+ *
+ * You may add Your own copyright statement to Your modifications and
+ * may provide additional or different license terms and conditions
+ * for use, reproduction, or distribution of Your modifications, or
+ * for any such Derivative Works as a whole, provided Your use,
+ * reproduction, and distribution of the Work otherwise complies with
+ * the conditions stated in this License.
+ *
+ * 5. Submission of Contributions. Unless You explicitly state otherwise,
+ * any Contribution intentionally submitted for inclusion in the Work
+ * by You to the Licensor shall be under the terms and conditions of
+ * this License, without any additional terms or conditions.
+ * Notwithstanding the above, nothing herein shall supersede or modify
+ * the terms of any separate license agreement you may have executed
+ * with Licensor regarding such Contributions.
+ *
+ * 6. Trademarks. This License does not grant permission to use the trade
+ * names, trademarks, service marks, or product names of the Licensor,
+ * except as required for reasonable and customary use in describing the
+ * origin of the Work and reproducing the content of the NOTICE file.
+ *
+ * 7. Disclaimer of Warranty. Unless required by applicable law or
+ * agreed to in writing, Licensor provides the Work (and each
+ * Contributor provides its Contributions) on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied, including, without limitation, any warranties or conditions
+ * of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ * PARTICULAR PURPOSE. You are solely responsible for determining the
+ * appropriateness of using or redistributing the Work and assume any
+ * risks associated with Your exercise of permissions under this License.
+ *
+ * 8. Limitation of Liability. In no event and under no legal theory,
+ * whether in tort (including negligence), contract, or otherwise,
+ * unless required by applicable law (such as deliberate and grossly
+ * negligent acts) or agreed to in writing, shall any Contributor be
+ * liable to You for damages, including any direct, indirect, special,
+ * incidental, or consequential damages of any character arising as a
+ * result of this License or out of the use or inability to use the
+ * Work (including but not limited to damages for loss of goodwill,
+ * work stoppage, computer failure or malfunction, or any and all
+ * other commercial damages or losses), even if such Contributor
+ * has been advised of the possibility of such damages.
+ *
+ * 9. Accepting Warranty or Additional Liability. While redistributing
+ * the Work or Derivative Works thereof, You may choose to offer,
+ * and charge a fee for, acceptance of support, warranty, indemnity,
+ * or other liability obligations and/or rights consistent with this
+ * License. However, in accepting such obligations, You may act only
+ * on Your own behalf and on Your sole responsibility, not on behalf
+ * of any other Contributor, and only if You agree to indemnify,
+ * defend, and hold each Contributor harmless for any liability
+ * incurred by, or claims asserted against, such Contributor by reason
+ * of your accepting any such warranty or additional liability.
+ *
+ * END OF TERMS AND CONDITIONS
+ *
+ * APPENDIX: How to apply the Apache License to your work.
+ *
+ * To apply the Apache License to your work, attach the following
+ * boilerplate notice, with the fields enclosed by brackets "[]"
+ * replaced with your own identifying information. (Don't include
+ * the brackets!) The text should be enclosed in the appropriate
+ * comment syntax for the file format. We also recommend that a
+ * file or class name and description of purpose be included on the
+ * same "printed page" as the copyright notice for easier
+ * identification within third-party archives.
+ *
+ * Copyright [yyyy] [name of copyright owner]
+ *
+ * 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.
+ */
+
+W3C� SOFTWARE NOTICE AND LICENSE
+http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
+
+This work (and included software, documentation such as READMEs, or other
+related items) is being provided by the copyright holders under the following
+license. By obtaining, using and/or copying this work, you (the licensee) agree
+that you have read, understood, and will comply with the following terms and
+conditions.
+
+Permission to copy, modify, and distribute this software and its documentation,
+with or without modification, for any purpose and without fee or royalty is
+hereby granted, provided that you include the following on ALL copies of the
+software and documentation or portions thereof, including modifications:
+
+ 1. The full text of this NOTICE in a location viewable to users of the
+ redistributed or derivative work.
+ 2. Any pre-existing intellectual property disclaimers, notices, or terms
+ and conditions. If none exist, the W3C Software Short Notice should be
+ included (hypertext is preferred, text is permitted) within the body
+ of any redistributed or derivative code.
+ 3. Notice of any changes or modifications to the files, including the date
+ changes were made. (We recommend you provide URIs to the location from
+ which the code is derived.)
+
+THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE
+NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT
+THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY
+PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
+
+COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION.
+
+The name and trademarks of copyright holders may NOT be used in advertising or
+publicity pertaining to the software without specific, written prior permission.
+Title to copyright in this software and any associated documentation will at
+all times remain with copyright holders.
+
+____________________________________
+
+This formulation of W3C's notice and license became active on December 31 2002.
+This version removes the copyright ownership notice such that this license can
+be used with materials other than those owned by the W3C, reflects that ERCIM
+is now a host of the W3C, includes references to this specific dated version of
+the license, and removes the ambiguous grant of "use". Otherwise, this version
+is the same as the previous version and is written so as to preserve the Free
+Software Foundation's assessment of GPL compatibility and OSI's certification
+under the Open Source Definition. Please see our Copyright FAQ for common
+questions about using materials from our site, including specific terms and
+conditions for packages like libwww, Amaya, and Jigsaw. Other questions about
+this notice can be directed to site-policy@w3.org.
+
+Joseph Reagle <site-policy@w3.org>
+
+This license came from: http://www.megginson.com/SAX/copying.html
+ However please note future versions of SAX may be covered
+ under http://saxproject.org/?selected=pd
+
+SAX2 is Free!
+
+I hereby abandon any property rights to SAX 2.0 (the Simple API for
+XML), and release all of the SAX 2.0 source code, compiled code, and
+documentation contained in this distribution into the Public Domain.
+SAX comes with NO WARRANTY or guarantee of fitness for any
+purpose.
+
+David Megginson, david@megginson.com
+2000-05-05
+
+============================================================
+Notices for file(s):
+lib/httpmime-4.1.jar
+------------------------------------------------------------
+Apache HttpComponents Client
+Copyright 1999-2011 The Apache Software Foundation
+
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org/).
+
+This project contains annotations derived from JCIP-ANNOTATIONS
+Copyright (c) 2005 Brian Goetz and Tim Peierls. See http://www.jcip.net
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+This project contains annotations derived from JCIP-ANNOTATIONS
+Copyright (c) 2005 Brian Goetz and Tim Peierls.
+See http://www.jcip.net and the Creative Commons Attribution License
+(http://creativecommons.org/licenses/by/2.5)
+
+============================================================
+Notices for file(s):
+lib/httpcore-4.1.jar
+------------------------------------------------------------
+Apache HttpComponents Client
+Copyright 1999-2011 The Apache Software Foundation
+
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org/).
+
+This project contains annotations derived from JCIP-ANNOTATIONS
+Copyright (c) 2005 Brian Goetz and Tim Peierls. See http://www.jcip.net
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+This project contains annotations derived from JCIP-ANNOTATIONS
+Copyright (c) 2005 Brian Goetz and Tim Peierls.
+See http://www.jcip.net and the Creative Commons Attribution License
+(http://creativecommons.org/licenses/by/2.5)
+
+============================================================
+Notices for file(s):
+lib/kxml2-2.3.0.jar
+------------------------------------------------------------
+Copyright (c) 2002,2003, Stefan Haustein, Oberhausen, Rhld., Germany
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+IN THE SOFTWARE.
+
+
+============================================================
+Notices for file(s):
+lib/guava-17.0.jar
+------------------------------------------------------------
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
+
+============================================================
+Notices for file(s):
+lib/commons-logging-1.1.1.jar
+------------------------------------------------------------
+Apache HttpComponents Client
+Copyright 1999-2011 The Apache Software Foundation
+
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org/).
+
+This project contains annotations derived from JCIP-ANNOTATIONS
+Copyright (c) 2005 Brian Goetz and Tim Peierls. See http://www.jcip.net
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+This project contains annotations derived from JCIP-ANNOTATIONS
+Copyright (c) 2005 Brian Goetz and Tim Peierls.
+See http://www.jcip.net and the Creative Commons Attribution License
+(http://creativecommons.org/licenses/by/2.5)
+
+============================================================
+Notices for file(s):
+lib/gson-2.2.4.jar
+------------------------------------------------------------
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright 2008-2011 Google Inc.
+
+ 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.
+
+============================================================
+Notices for file(s):
+lib/lombok-ast-0.2.3.jar
+------------------------------------------------------------
+Copyright (C) 2010-2011 The Project Lombok Authors.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+============================================================
+Notices for file(s):
+lib/asm-5.0.3.jar
+------------------------------------------------------------
+
+ ASM: a very small and fast Java bytecode manipulation framework
+ Copyright (c) 2000-2005 INRIA, France Telecom
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ THE POSSIBILITY OF SUCH DAMAGE.
+
+============================================================
+Notices for file(s):
+lib/ecj-4.4.2.jar
+------------------------------------------------------------
+
+ Eclipse Public License - v 1.0
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF
+THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+*1. DEFINITIONS*
+
+"Contribution" means:
+
+a) in the case of the initial Contributor, the initial code and
+documentation distributed under this Agreement, and
+
+b) in the case of each subsequent Contributor:
+
+i) changes to the Program, and
+
+ii) additions to the Program;
+
+where such changes and/or additions to the Program originate from and
+are distributed by that particular Contributor. A Contribution
+'originates' from a Contributor if it was added to the Program by such
+Contributor itself or anyone acting on such Contributor's behalf.
+Contributions do not include additions to the Program which: (i) are
+separate modules of software distributed in conjunction with the Program
+under their own license agreement, and (ii) are not derivative works of
+the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+"Licensed Patents" mean patent claims licensable by a Contributor which
+are necessarily infringed by the use or sale of its Contribution alone
+or when combined with the Program.
+
+"Program" means the Contributions distributed in accordance with this
+Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement,
+including all Contributors.
+
+*2. GRANT OF RIGHTS*
+
+a) Subject to the terms of this Agreement, each Contributor hereby
+grants Recipient a non-exclusive, worldwide, royalty-free copyright
+license to reproduce, prepare derivative works of, publicly display,
+publicly perform, distribute and sublicense the Contribution of such
+Contributor, if any, and such derivative works, in source code and
+object code form.
+
+b) Subject to the terms of this Agreement, each Contributor hereby
+grants Recipient a non-exclusive, worldwide, royalty-free patent license
+under Licensed Patents to make, use, sell, offer to sell, import and
+otherwise transfer the Contribution of such Contributor, if any, in
+source code and object code form. This patent license shall apply to the
+combination of the Contribution and the Program if, at the time the
+Contribution is added by the Contributor, such addition of the
+Contribution causes such combination to be covered by the Licensed
+Patents. The patent license shall not apply to any other combinations
+which include the Contribution. No hardware per se is licensed hereunder.
+
+c) Recipient understands that although each Contributor grants the
+licenses to its Contributions set forth herein, no assurances are
+provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.
+
+d) Each Contributor represents that to its knowledge it has sufficient
+copyright rights in its Contribution, if any, to grant the copyright
+license set forth in this Agreement.
+
+*3. REQUIREMENTS*
+
+A Contributor may choose to distribute the Program in object code form
+under its own license agreement, provided that:
+
+a) it complies with the terms and conditions of this Agreement; and
+
+b) its license agreement:
+
+i) effectively disclaims on behalf of all Contributors all warranties
+and conditions, express and implied, including warranties or conditions
+of title and non-infringement, and implied warranties or conditions of
+merchantability and fitness for a particular purpose;
+
+ii) effectively excludes on behalf of all Contributors all liability for
+damages, including direct, indirect, special, incidental and
+consequential damages, such as lost profits;
+
+iii) states that any provisions which differ from this Agreement are
+offered by that Contributor alone and not by any other party; and
+
+iv) states that source code for the Program is available from such
+Contributor, and informs licensees how to obtain it in a reasonable
+manner on or through a medium customarily used for software exchange.
+
+When the Program is made available in source code form:
+
+a) it must be made available under this Agreement; and
+
+b) a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained
+within the Program.
+
+Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.
+
+*4. COMMERCIAL DISTRIBUTION*
+
+Commercial distributors of software may accept certain responsibilities
+with respect to end users, business partners and the like. While this
+license is intended to facilitate the commercial use of the Program, the
+Contributor who includes the Program in a commercial product offering
+should do so in a manner which does not create potential liability for
+other Contributors. Therefore, if a Contributor includes the Program in
+a commercial product offering, such Contributor ("Commercial
+Contributor") hereby agrees to defend and indemnify every other
+Contributor ("Indemnified Contributor") against any losses, damages and
+costs (collectively "Losses") arising from claims, lawsuits and other
+legal actions brought by a third party against the Indemnified
+Contributor to the extent caused by the acts or omissions of such
+Commercial Contributor in connection with its distribution of the
+Program in a commercial product offering. The obligations in this
+section do not apply to any claims or Losses relating to any actual or
+alleged intellectual property infringement. In order to qualify, an
+Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial
+Contributor to control, and cooperate with the Commercial Contributor
+in, the defense and any related settlement negotiations. The Indemnified
+Contributor may participate in any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.
+
+*5. NO WARRANTY*
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED
+ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES
+OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR
+A PARTICULAR PURPOSE. Each Recipient is solely responsible for
+determining the appropriateness of using and distributing the Program
+and assumes all risks associated with its exercise of rights under this
+Agreement , including but not limited to the risks and costs of program
+errors, compliance with applicable laws, damage to or loss of data,
+programs or equipment, and unavailability or interruption of operations.
+
+*6. DISCLAIMER OF LIABILITY*
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR
+ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+*7. GENERAL*
+
+If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.
+
+If Recipient institutes patent litigation against any entity (including
+a cross-claim or counterclaim in a lawsuit) alleging that the Program
+itself (excluding combinations of the Program with other software or
+hardware) infringes such Recipient's patent(s), then such Recipient's
+rights granted under Section 2(b) shall terminate as of the date such
+litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it fails
+to comply with any of the material terms or conditions of this Agreement
+and does not cure such failure in a reasonable period of time after
+becoming aware of such noncompliance. If all Recipient's rights under
+this Agreement terminate, Recipient agrees to cease use and distribution
+of the Program as soon as reasonably practicable. However, Recipient's
+obligations under this Agreement and any licenses granted by Recipient
+relating to the Program shall continue and survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement,
+but in order to avoid inconsistency the Agreement is copyrighted and may
+only be modified in the following manner. The Agreement Steward reserves
+the right to publish new versions (including revisions) of this
+Agreement from time to time. No one other than the Agreement Steward has
+the right to modify this Agreement. The Eclipse Foundation is the
+initial Agreement Steward. The Eclipse Foundation may assign the
+responsibility to serve as the Agreement Steward to a suitable separate
+entity. Each new version of the Agreement will be given a distinguishing
+version number. The Program (including Contributions) may always be
+distributed subject to the version of the Agreement under which it was
+received. In addition, after a new version of the Agreement is
+published, Contributor may elect to distribute the Program (including
+its Contributions) under the new version. Except as expressly stated in
+Sections 2(a) and 2(b) above, Recipient receives no rights or licenses
+to the intellectual property of any Contributor under this Agreement,
+whether expressly, by implication, estoppel or otherwise. All rights in
+the Program not expressly granted under this Agreement are reserved.
+
+This Agreement is governed by the laws of the State of New York and the
+intellectual property laws of the United States of America. No party to
+this Agreement will bring a legal action under this Agreement more than
+one year after the cause of action arose. Each party waives its rights
+to a jury trial in any resulting litigation.
+
+============================================================
+Notices for file(s):
+lib/asm-analysis-5.0.3.jar
+------------------------------------------------------------
+
+ ASM: a very small and fast Java bytecode manipulation framework
+ Copyright (c) 2000-2005 INRIA, France Telecom
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ THE POSSIBILITY OF SUCH DAMAGE.
+
+============================================================
+Notices for file(s):
+lib/asm-tree-5.0.3.jar
+------------------------------------------------------------
+
+ ASM: a very small and fast Java bytecode manipulation framework
+ Copyright (c) 2000-2005 INRIA, France Telecom
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ THE POSSIBILITY OF SUCH DAMAGE.
+
+============================================================
+Notices for file(s):
+lib/hamcrest-core-1.3.jar
+------------------------------------------------------------
+BSD License
+
+Copyright (c) 2000-2015 www.hamcrest.org
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of
+conditions and the following disclaimer. Redistributions in binary form must reproduce
+the above copyright notice, this list of conditions and the following disclaimer in
+the documentation and/or other materials provided with the distribution.
+
+Neither the name of Hamcrest nor the names of its contributors may be used to endorse
+or promote products derived from this software without specific prior written
+permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
+
+============================================================
+Notices for file(s):
+lib/objenesis-2.1.jar
+------------------------------------------------------------
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
+
+============================================================
+Notices for file(s):
+lib/cglib-nodep-3.1.jar
+------------------------------------------------------------
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org/).
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
+
+============================================================
+Notices for file(s):
+lib/easymock-3.3.jar
+------------------------------------------------------------
+Easymock is from http://easymock.org/
+Contributors: http://easymock.org/contributors.html
+
+See LICENSE file for details.
+
+============================================================
+Notices for file(s):
+lib/junit-4.12.jar
+------------------------------------------------------------
+JUnit
+
+Eclipse Public License - v 1.0
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC
+LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
+CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+ a) in the case of the initial Contributor, the initial code and
+ documentation distributed under this Agreement, and
+ b) in the case of each subsequent Contributor:
+
+ i) changes to the Program, and
+
+ ii) additions to the Program;
+
+ where such changes and/or additions to the Program originate from and are
+distributed by that particular Contributor. A Contribution 'originates' from a
+Contributor if it was added to the Program by such Contributor itself or anyone
+acting on such Contributor's behalf. Contributions do not include additions to
+the Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii) are
+not derivative works of the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+"Licensed Patents " mean patent claims licensable by a Contributor which are
+necessarily infringed by the use or sale of its Contribution alone or when
+combined with the Program.
+
+"Program" means the Contributions distributed in accordance with this Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement,
+including all Contributors.
+
+2. GRANT OF RIGHTS
+
+ a) Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide, royalty-free copyright license to
+reproduce, prepare derivative works of, publicly display, publicly perform,
+distribute and sublicense the Contribution of such Contributor, if any, and
+such derivative works, in source code and object code form.
+
+ b) Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide, royalty-free patent license under
+Licensed Patents to make, use, sell, offer to sell, import and otherwise
+transfer the Contribution of such Contributor, if any, in source code and
+object code form. This patent license shall apply to the combination of the
+Contribution and the Program if, at the time the Contribution is added by the
+Contributor, such addition of the Contribution causes such combination to be
+covered by the Licensed Patents. The patent license shall not apply to any
+other combinations which include the Contribution. No hardware per se is
+licensed hereunder.
+
+ c) Recipient understands that although each Contributor grants the
+licenses to its Contributions set forth herein, no assurances are provided by
+any Contributor that the Program does not infringe the patent or other
+intellectual property rights of any other entity. Each Contributor disclaims
+any liability to Recipient for claims brought by any other entity based on
+infringement of intellectual property rights or otherwise. As a condition to
+exercising the rights and licenses granted hereunder, each Recipient hereby
+assumes sole responsibility to secure any other intellectual property rights
+needed, if any. For example, if a third party patent license is required to
+allow Recipient to distribute the Program, it is Recipient's responsibility to
+acquire that license before distributing the Program.
+
+ d) Each Contributor represents that to its knowledge it has sufficient
+copyright rights in its Contribution, if any, to grant the copyright license
+set forth in this Agreement.
+
+3. REQUIREMENTS
+
+A Contributor may choose to distribute the Program in object code form under
+its own license agreement, provided that:
+
+ a) it complies with the terms and conditions of this Agreement; and
+
+ b) its license agreement:
+
+ i) effectively disclaims on behalf of all Contributors all warranties and
+conditions, express and implied, including warranties or conditions of title
+and non-infringement, and implied warranties or conditions of merchantability
+and fitness for a particular purpose;
+
+ ii) effectively excludes on behalf of all Contributors all liability for
+damages, including direct, indirect, special, incidental and consequential
+damages, such as lost profits;
+
+ iii) states that any provisions which differ from this Agreement are
+offered by that Contributor alone and not by any other party; and
+
+ iv) states that source code for the Program is available from such
+Contributor, and informs licensees how to obtain it in a reasonable manner on
+or through a medium customarily used for software exchange.
+
+When the Program is made available in source code form:
+
+ a) it must be made available under this Agreement; and
+
+ b) a copy of this Agreement must be included with each copy of the
+Program.
+
+Contributors may not remove or alter any copyright notices contained within the
+Program.
+
+Each Contributor must identify itself as the originator of its Contribution, if
+any, in a manner that reasonably allows subsequent Recipients to identify the
+originator of the Contribution.
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain responsibilities with
+respect to end users, business partners and the like. While this license is
+intended to facilitate the commercial use of the Program, the Contributor who
+includes the Program in a commercial product offering should do so in a manner
+which does not create potential liability for other Contributors. Therefore, if
+a Contributor includes the Program in a commercial product offering, such
+Contributor ("Commercial Contributor") hereby agrees to defend and indemnify
+every other Contributor ("Indemnified Contributor") against any losses, damages
+and costs (collectively "Losses") arising from claims, lawsuits and other legal
+actions brought by a third party against the Indemnified Contributor to the
+extent caused by the acts or omissions of such Commercial Contributor in
+connection with its distribution of the Program in a commercial product
+offering. The obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In order
+to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial Contributor
+to control, and cooperate with the Commercial Contributor in, the defense and
+any related settlement negotiations. The Indemnified Contributor may
+participate in any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial product
+offering, Product X. That Contributor is then a Commercial Contributor. If that
+Commercial Contributor then makes performance claims, or offers warranties
+related to Product X, those performance claims and warranties are such
+Commercial Contributor's responsibility alone. Under this section, the
+Commercial Contributor would have to defend claims against the other
+Contributors related to those performance claims and warranties, and if a court
+requires any other Contributor to pay any damages as a result, the Commercial
+Contributor must pay those damages.
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
+IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE,
+NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each
+Recipient is solely responsible for determining the appropriateness of using
+and distributing the Program and assumes all risks associated with its exercise
+of rights under this Agreement, including but not limited to the risks and
+costs of program errors, compliance with applicable laws, damage to or loss of
+data, programs or equipment, and unavailability or interruption of operations.
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY
+CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
+PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
+WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS
+GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+7. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under applicable
+law, it shall not affect the validity or enforceability of the remainder of the
+terms of this Agreement, and without further action by the parties hereto, such
+provision shall be reformed to the minimum extent necessary to make such
+provision valid and enforceable.
+
+If Recipient institutes patent litigation against any
+entity (including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other software or
+hardware) infringes such Recipient's patent(s), then such Recipient's rights
+granted under Section 2(b) shall terminate as of the date such litigation is
+filed.
+
+All Recipient's rights under this Agreement shall terminate if it fails to
+comply with any of the material terms or conditions of this Agreement and does
+not cure such failure in a reasonable period of time after becoming aware of
+such noncompliance. If all Recipient's rights under this Agreement terminate,
+Recipient agrees to cease use and distribution of the Program as soon as
+reasonably practicable. However, Recipient's obligations under this Agreement
+and any licenses granted by Recipient relating to the Program shall continue
+and survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement, but in
+order to avoid inconsistency the Agreement is copyrighted and may only be
+modified in the following manner. The Agreement Steward reserves the right to
+publish new versions (including revisions) of this Agreement from time to time.
+No one other than the Agreement Steward has the right to modify this Agreement.
+The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to
+serve as the Agreement Steward to a suitable separate entity. Each new version
+of the Agreement will be given a distinguishing version number. The Program
+(including Contributions) may always be distributed subject to the version of
+the Agreement under which it was received. In addition, after a new version of
+the Agreement is published, Contributor may elect to distribute the Program
+(including its Contributions) under the new version. Except as expressly stated
+in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
+the intellectual property of any Contributor under this Agreement, whether
+expressly, by implication, estoppel or otherwise. All rights in the Program not
+expressly granted under this Agreement are reserved.
+
+This Agreement is governed by the laws of the State of New York and the
+intellectual property laws of the United States of America. No party to this
+Agreement will bring a legal action under this Agreement more than one year
+after the cause of action arose. Each party waives its rights to a jury trial
+in any resulting litigation.
+
+============================================================
+Notices for file(s):
+lib/org-eclipse-core-commands-3.6.0.jar
+------------------------------------------------------------
+
+ Eclipse Public License - v 1.0
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF
+THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+*1. DEFINITIONS*
+
+"Contribution" means:
+
+a) in the case of the initial Contributor, the initial code and
+documentation distributed under this Agreement, and
+
+b) in the case of each subsequent Contributor:
+
+i) changes to the Program, and
+
+ii) additions to the Program;
+
+where such changes and/or additions to the Program originate from and
+are distributed by that particular Contributor. A Contribution
+'originates' from a Contributor if it was added to the Program by such
+Contributor itself or anyone acting on such Contributor's behalf.
+Contributions do not include additions to the Program which: (i) are
+separate modules of software distributed in conjunction with the Program
+under their own license agreement, and (ii) are not derivative works of
+the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+"Licensed Patents" mean patent claims licensable by a Contributor which
+are necessarily infringed by the use or sale of its Contribution alone
+or when combined with the Program.
+
+"Program" means the Contributions distributed in accordance with this
+Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement,
+including all Contributors.
+
+*2. GRANT OF RIGHTS*
+
+a) Subject to the terms of this Agreement, each Contributor hereby
+grants Recipient a non-exclusive, worldwide, royalty-free copyright
+license to reproduce, prepare derivative works of, publicly display,
+publicly perform, distribute and sublicense the Contribution of such
+Contributor, if any, and such derivative works, in source code and
+object code form.
+
+b) Subject to the terms of this Agreement, each Contributor hereby
+grants Recipient a non-exclusive, worldwide, royalty-free patent license
+under Licensed Patents to make, use, sell, offer to sell, import and
+otherwise transfer the Contribution of such Contributor, if any, in
+source code and object code form. This patent license shall apply to the
+combination of the Contribution and the Program if, at the time the
+Contribution is added by the Contributor, such addition of the
+Contribution causes such combination to be covered by the Licensed
+Patents. The patent license shall not apply to any other combinations
+which include the Contribution. No hardware per se is licensed hereunder.
+
+c) Recipient understands that although each Contributor grants the
+licenses to its Contributions set forth herein, no assurances are
+provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.
+
+d) Each Contributor represents that to its knowledge it has sufficient
+copyright rights in its Contribution, if any, to grant the copyright
+license set forth in this Agreement.
+
+*3. REQUIREMENTS*
+
+A Contributor may choose to distribute the Program in object code form
+under its own license agreement, provided that:
+
+a) it complies with the terms and conditions of this Agreement; and
+
+b) its license agreement:
+
+i) effectively disclaims on behalf of all Contributors all warranties
+and conditions, express and implied, including warranties or conditions
+of title and non-infringement, and implied warranties or conditions of
+merchantability and fitness for a particular purpose;
+
+ii) effectively excludes on behalf of all Contributors all liability for
+damages, including direct, indirect, special, incidental and
+consequential damages, such as lost profits;
+
+iii) states that any provisions which differ from this Agreement are
+offered by that Contributor alone and not by any other party; and
+
+iv) states that source code for the Program is available from such
+Contributor, and informs licensees how to obtain it in a reasonable
+manner on or through a medium customarily used for software exchange.
+
+When the Program is made available in source code form:
+
+a) it must be made available under this Agreement; and
+
+b) a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained
+within the Program.
+
+Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.
+
+*4. COMMERCIAL DISTRIBUTION*
+
+Commercial distributors of software may accept certain responsibilities
+with respect to end users, business partners and the like. While this
+license is intended to facilitate the commercial use of the Program, the
+Contributor who includes the Program in a commercial product offering
+should do so in a manner which does not create potential liability for
+other Contributors. Therefore, if a Contributor includes the Program in
+a commercial product offering, such Contributor ("Commercial
+Contributor") hereby agrees to defend and indemnify every other
+Contributor ("Indemnified Contributor") against any losses, damages and
+costs (collectively "Losses") arising from claims, lawsuits and other
+legal actions brought by a third party against the Indemnified
+Contributor to the extent caused by the acts or omissions of such
+Commercial Contributor in connection with its distribution of the
+Program in a commercial product offering. The obligations in this
+section do not apply to any claims or Losses relating to any actual or
+alleged intellectual property infringement. In order to qualify, an
+Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial
+Contributor to control, and cooperate with the Commercial Contributor
+in, the defense and any related settlement negotiations. The Indemnified
+Contributor may participate in any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.
+
+*5. NO WARRANTY*
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED
+ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES
+OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR
+A PARTICULAR PURPOSE. Each Recipient is solely responsible for
+determining the appropriateness of using and distributing the Program
+and assumes all risks associated with its exercise of rights under this
+Agreement , including but not limited to the risks and costs of program
+errors, compliance with applicable laws, damage to or loss of data,
+programs or equipment, and unavailability or interruption of operations.
+
+*6. DISCLAIMER OF LIABILITY*
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR
+ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+*7. GENERAL*
+
+If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.
+
+If Recipient institutes patent litigation against any entity (including
+a cross-claim or counterclaim in a lawsuit) alleging that the Program
+itself (excluding combinations of the Program with other software or
+hardware) infringes such Recipient's patent(s), then such Recipient's
+rights granted under Section 2(b) shall terminate as of the date such
+litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it fails
+to comply with any of the material terms or conditions of this Agreement
+and does not cure such failure in a reasonable period of time after
+becoming aware of such noncompliance. If all Recipient's rights under
+this Agreement terminate, Recipient agrees to cease use and distribution
+of the Program as soon as reasonably practicable. However, Recipient's
+obligations under this Agreement and any licenses granted by Recipient
+relating to the Program shall continue and survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement,
+but in order to avoid inconsistency the Agreement is copyrighted and may
+only be modified in the following manner. The Agreement Steward reserves
+the right to publish new versions (including revisions) of this
+Agreement from time to time. No one other than the Agreement Steward has
+the right to modify this Agreement. The Eclipse Foundation is the
+initial Agreement Steward. The Eclipse Foundation may assign the
+responsibility to serve as the Agreement Steward to a suitable separate
+entity. Each new version of the Agreement will be given a distinguishing
+version number. The Program (including Contributions) may always be
+distributed subject to the version of the Agreement under which it was
+received. In addition, after a new version of the Agreement is
+published, Contributor may elect to distribute the Program (including
+its Contributions) under the new version. Except as expressly stated in
+Sections 2(a) and 2(b) above, Recipient receives no rights or licenses
+to the intellectual property of any Contributor under this Agreement,
+whether expressly, by implication, estoppel or otherwise. All rights in
+the Program not expressly granted under this Agreement are reserved.
+
+This Agreement is governed by the laws of the State of New York and the
+intellectual property laws of the United States of America. No party to
+this Agreement will bring a legal action under this Agreement more than
+one year after the cause of action arose. Each party waives its rights
+to a jury trial in any resulting litigation.
+
+============================================================
+Notices for file(s):
+lib/jfreechart-swt-1.0.9.jar
+------------------------------------------------------------
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
+============================================================
+Notices for file(s):
+lib/org-eclipse-jface-3.6.2.jar
+------------------------------------------------------------
+
+ Eclipse Public License - v 1.0
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF
+THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+*1. DEFINITIONS*
+
+"Contribution" means:
+
+a) in the case of the initial Contributor, the initial code and
+documentation distributed under this Agreement, and
+
+b) in the case of each subsequent Contributor:
+
+i) changes to the Program, and
+
+ii) additions to the Program;
+
+where such changes and/or additions to the Program originate from and
+are distributed by that particular Contributor. A Contribution
+'originates' from a Contributor if it was added to the Program by such
+Contributor itself or anyone acting on such Contributor's behalf.
+Contributions do not include additions to the Program which: (i) are
+separate modules of software distributed in conjunction with the Program
+under their own license agreement, and (ii) are not derivative works of
+the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+"Licensed Patents" mean patent claims licensable by a Contributor which
+are necessarily infringed by the use or sale of its Contribution alone
+or when combined with the Program.
+
+"Program" means the Contributions distributed in accordance with this
+Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement,
+including all Contributors.
+
+*2. GRANT OF RIGHTS*
+
+a) Subject to the terms of this Agreement, each Contributor hereby
+grants Recipient a non-exclusive, worldwide, royalty-free copyright
+license to reproduce, prepare derivative works of, publicly display,
+publicly perform, distribute and sublicense the Contribution of such
+Contributor, if any, and such derivative works, in source code and
+object code form.
+
+b) Subject to the terms of this Agreement, each Contributor hereby
+grants Recipient a non-exclusive, worldwide, royalty-free patent license
+under Licensed Patents to make, use, sell, offer to sell, import and
+otherwise transfer the Contribution of such Contributor, if any, in
+source code and object code form. This patent license shall apply to the
+combination of the Contribution and the Program if, at the time the
+Contribution is added by the Contributor, such addition of the
+Contribution causes such combination to be covered by the Licensed
+Patents. The patent license shall not apply to any other combinations
+which include the Contribution. No hardware per se is licensed hereunder.
+
+c) Recipient understands that although each Contributor grants the
+licenses to its Contributions set forth herein, no assurances are
+provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.
+
+d) Each Contributor represents that to its knowledge it has sufficient
+copyright rights in its Contribution, if any, to grant the copyright
+license set forth in this Agreement.
+
+*3. REQUIREMENTS*
+
+A Contributor may choose to distribute the Program in object code form
+under its own license agreement, provided that:
+
+a) it complies with the terms and conditions of this Agreement; and
+
+b) its license agreement:
+
+i) effectively disclaims on behalf of all Contributors all warranties
+and conditions, express and implied, including warranties or conditions
+of title and non-infringement, and implied warranties or conditions of
+merchantability and fitness for a particular purpose;
+
+ii) effectively excludes on behalf of all Contributors all liability for
+damages, including direct, indirect, special, incidental and
+consequential damages, such as lost profits;
+
+iii) states that any provisions which differ from this Agreement are
+offered by that Contributor alone and not by any other party; and
+
+iv) states that source code for the Program is available from such
+Contributor, and informs licensees how to obtain it in a reasonable
+manner on or through a medium customarily used for software exchange.
+
+When the Program is made available in source code form:
+
+a) it must be made available under this Agreement; and
+
+b) a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained
+within the Program.
+
+Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.
+
+*4. COMMERCIAL DISTRIBUTION*
+
+Commercial distributors of software may accept certain responsibilities
+with respect to end users, business partners and the like. While this
+license is intended to facilitate the commercial use of the Program, the
+Contributor who includes the Program in a commercial product offering
+should do so in a manner which does not create potential liability for
+other Contributors. Therefore, if a Contributor includes the Program in
+a commercial product offering, such Contributor ("Commercial
+Contributor") hereby agrees to defend and indemnify every other
+Contributor ("Indemnified Contributor") against any losses, damages and
+costs (collectively "Losses") arising from claims, lawsuits and other
+legal actions brought by a third party against the Indemnified
+Contributor to the extent caused by the acts or omissions of such
+Commercial Contributor in connection with its distribution of the
+Program in a commercial product offering. The obligations in this
+section do not apply to any claims or Losses relating to any actual or
+alleged intellectual property infringement. In order to qualify, an
+Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial
+Contributor to control, and cooperate with the Commercial Contributor
+in, the defense and any related settlement negotiations. The Indemnified
+Contributor may participate in any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.
+
+*5. NO WARRANTY*
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED
+ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES
+OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR
+A PARTICULAR PURPOSE. Each Recipient is solely responsible for
+determining the appropriateness of using and distributing the Program
+and assumes all risks associated with its exercise of rights under this
+Agreement , including but not limited to the risks and costs of program
+errors, compliance with applicable laws, damage to or loss of data,
+programs or equipment, and unavailability or interruption of operations.
+
+*6. DISCLAIMER OF LIABILITY*
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR
+ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+*7. GENERAL*
+
+If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.
+
+If Recipient institutes patent litigation against any entity (including
+a cross-claim or counterclaim in a lawsuit) alleging that the Program
+itself (excluding combinations of the Program with other software or
+hardware) infringes such Recipient's patent(s), then such Recipient's
+rights granted under Section 2(b) shall terminate as of the date such
+litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it fails
+to comply with any of the material terms or conditions of this Agreement
+and does not cure such failure in a reasonable period of time after
+becoming aware of such noncompliance. If all Recipient's rights under
+this Agreement terminate, Recipient agrees to cease use and distribution
+of the Program as soon as reasonably practicable. However, Recipient's
+obligations under this Agreement and any licenses granted by Recipient
+relating to the Program shall continue and survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement,
+but in order to avoid inconsistency the Agreement is copyrighted and may
+only be modified in the following manner. The Agreement Steward reserves
+the right to publish new versions (including revisions) of this
+Agreement from time to time. No one other than the Agreement Steward has
+the right to modify this Agreement. The Eclipse Foundation is the
+initial Agreement Steward. The Eclipse Foundation may assign the
+responsibility to serve as the Agreement Steward to a suitable separate
+entity. Each new version of the Agreement will be given a distinguishing
+version number. The Program (including Contributions) may always be
+distributed subject to the version of the Agreement under which it was
+received. In addition, after a new version of the Agreement is
+published, Contributor may elect to distribute the Program (including
+its Contributions) under the new version. Except as expressly stated in
+Sections 2(a) and 2(b) above, Recipient receives no rights or licenses
+to the intellectual property of any Contributor under this Agreement,
+whether expressly, by implication, estoppel or otherwise. All rights in
+the Program not expressly granted under this Agreement are reserved.
+
+This Agreement is governed by the laws of the State of New York and the
+intellectual property laws of the United States of America. No party to
+this Agreement will bring a legal action under this Agreement more than
+one year after the cause of action arose. Each party waives its rights
+to a jury trial in any resulting litigation.
+
+============================================================
+Notices for file(s):
+lib/org-eclipse-equinox-common-3.6.0.jar
+------------------------------------------------------------
+
+ Eclipse Public License - v 1.0
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF
+THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+*1. DEFINITIONS*
+
+"Contribution" means:
+
+a) in the case of the initial Contributor, the initial code and
+documentation distributed under this Agreement, and
+
+b) in the case of each subsequent Contributor:
+
+i) changes to the Program, and
+
+ii) additions to the Program;
+
+where such changes and/or additions to the Program originate from and
+are distributed by that particular Contributor. A Contribution
+'originates' from a Contributor if it was added to the Program by such
+Contributor itself or anyone acting on such Contributor's behalf.
+Contributions do not include additions to the Program which: (i) are
+separate modules of software distributed in conjunction with the Program
+under their own license agreement, and (ii) are not derivative works of
+the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+"Licensed Patents" mean patent claims licensable by a Contributor which
+are necessarily infringed by the use or sale of its Contribution alone
+or when combined with the Program.
+
+"Program" means the Contributions distributed in accordance with this
+Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement,
+including all Contributors.
+
+*2. GRANT OF RIGHTS*
+
+a) Subject to the terms of this Agreement, each Contributor hereby
+grants Recipient a non-exclusive, worldwide, royalty-free copyright
+license to reproduce, prepare derivative works of, publicly display,
+publicly perform, distribute and sublicense the Contribution of such
+Contributor, if any, and such derivative works, in source code and
+object code form.
+
+b) Subject to the terms of this Agreement, each Contributor hereby
+grants Recipient a non-exclusive, worldwide, royalty-free patent license
+under Licensed Patents to make, use, sell, offer to sell, import and
+otherwise transfer the Contribution of such Contributor, if any, in
+source code and object code form. This patent license shall apply to the
+combination of the Contribution and the Program if, at the time the
+Contribution is added by the Contributor, such addition of the
+Contribution causes such combination to be covered by the Licensed
+Patents. The patent license shall not apply to any other combinations
+which include the Contribution. No hardware per se is licensed hereunder.
+
+c) Recipient understands that although each Contributor grants the
+licenses to its Contributions set forth herein, no assurances are
+provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.
+
+d) Each Contributor represents that to its knowledge it has sufficient
+copyright rights in its Contribution, if any, to grant the copyright
+license set forth in this Agreement.
+
+*3. REQUIREMENTS*
+
+A Contributor may choose to distribute the Program in object code form
+under its own license agreement, provided that:
+
+a) it complies with the terms and conditions of this Agreement; and
+
+b) its license agreement:
+
+i) effectively disclaims on behalf of all Contributors all warranties
+and conditions, express and implied, including warranties or conditions
+of title and non-infringement, and implied warranties or conditions of
+merchantability and fitness for a particular purpose;
+
+ii) effectively excludes on behalf of all Contributors all liability for
+damages, including direct, indirect, special, incidental and
+consequential damages, such as lost profits;
+
+iii) states that any provisions which differ from this Agreement are
+offered by that Contributor alone and not by any other party; and
+
+iv) states that source code for the Program is available from such
+Contributor, and informs licensees how to obtain it in a reasonable
+manner on or through a medium customarily used for software exchange.
+
+When the Program is made available in source code form:
+
+a) it must be made available under this Agreement; and
+
+b) a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained
+within the Program.
+
+Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.
+
+*4. COMMERCIAL DISTRIBUTION*
+
+Commercial distributors of software may accept certain responsibilities
+with respect to end users, business partners and the like. While this
+license is intended to facilitate the commercial use of the Program, the
+Contributor who includes the Program in a commercial product offering
+should do so in a manner which does not create potential liability for
+other Contributors. Therefore, if a Contributor includes the Program in
+a commercial product offering, such Contributor ("Commercial
+Contributor") hereby agrees to defend and indemnify every other
+Contributor ("Indemnified Contributor") against any losses, damages and
+costs (collectively "Losses") arising from claims, lawsuits and other
+legal actions brought by a third party against the Indemnified
+Contributor to the extent caused by the acts or omissions of such
+Commercial Contributor in connection with its distribution of the
+Program in a commercial product offering. The obligations in this
+section do not apply to any claims or Losses relating to any actual or
+alleged intellectual property infringement. In order to qualify, an
+Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial
+Contributor to control, and cooperate with the Commercial Contributor
+in, the defense and any related settlement negotiations. The Indemnified
+Contributor may participate in any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.
+
+*5. NO WARRANTY*
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED
+ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES
+OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR
+A PARTICULAR PURPOSE. Each Recipient is solely responsible for
+determining the appropriateness of using and distributing the Program
+and assumes all risks associated with its exercise of rights under this
+Agreement , including but not limited to the risks and costs of program
+errors, compliance with applicable laws, damage to or loss of data,
+programs or equipment, and unavailability or interruption of operations.
+
+*6. DISCLAIMER OF LIABILITY*
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR
+ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+*7. GENERAL*
+
+If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.
+
+If Recipient institutes patent litigation against any entity (including
+a cross-claim or counterclaim in a lawsuit) alleging that the Program
+itself (excluding combinations of the Program with other software or
+hardware) infringes such Recipient's patent(s), then such Recipient's
+rights granted under Section 2(b) shall terminate as of the date such
+litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it fails
+to comply with any of the material terms or conditions of this Agreement
+and does not cure such failure in a reasonable period of time after
+becoming aware of such noncompliance. If all Recipient's rights under
+this Agreement terminate, Recipient agrees to cease use and distribution
+of the Program as soon as reasonably practicable. However, Recipient's
+obligations under this Agreement and any licenses granted by Recipient
+relating to the Program shall continue and survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement,
+but in order to avoid inconsistency the Agreement is copyrighted and may
+only be modified in the following manner. The Agreement Steward reserves
+the right to publish new versions (including revisions) of this
+Agreement from time to time. No one other than the Agreement Steward has
+the right to modify this Agreement. The Eclipse Foundation is the
+initial Agreement Steward. The Eclipse Foundation may assign the
+responsibility to serve as the Agreement Steward to a suitable separate
+entity. Each new version of the Agreement will be given a distinguishing
+version number. The Program (including Contributions) may always be
+distributed subject to the version of the Agreement under which it was
+received. In addition, after a new version of the Agreement is
+published, Contributor may elect to distribute the Program (including
+its Contributions) under the new version. Except as expressly stated in
+Sections 2(a) and 2(b) above, Recipient receives no rights or licenses
+to the intellectual property of any Contributor under this Agreement,
+whether expressly, by implication, estoppel or otherwise. All rights in
+the Program not expressly granted under this Agreement are reserved.
+
+This Agreement is governed by the laws of the State of New York and the
+intellectual property laws of the United States of America. No party to
+this Agreement will bring a legal action under this Agreement more than
+one year after the cause of action arose. Each party waives its rights
+to a jury trial in any resulting litigation.
+
+============================================================
+Notices for file(s):
+lib/osgi-4.0.0.jar
+------------------------------------------------------------
+
+ Eclipse Public License - v 1.0
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF
+THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+*1. DEFINITIONS*
+
+"Contribution" means:
+
+a) in the case of the initial Contributor, the initial code and
+documentation distributed under this Agreement, and
+
+b) in the case of each subsequent Contributor:
+
+i) changes to the Program, and
+
+ii) additions to the Program;
+
+where such changes and/or additions to the Program originate from and
+are distributed by that particular Contributor. A Contribution
+'originates' from a Contributor if it was added to the Program by such
+Contributor itself or anyone acting on such Contributor's behalf.
+Contributions do not include additions to the Program which: (i) are
+separate modules of software distributed in conjunction with the Program
+under their own license agreement, and (ii) are not derivative works of
+the Program.
+
+"Contributor" means any person or entity that distributes the Program.
+
+"Licensed Patents" mean patent claims licensable by a Contributor which
+are necessarily infringed by the use or sale of its Contribution alone
+or when combined with the Program.
+
+"Program" means the Contributions distributed in accordance with this
+Agreement.
+
+"Recipient" means anyone who receives the Program under this Agreement,
+including all Contributors.
+
+*2. GRANT OF RIGHTS*
+
+a) Subject to the terms of this Agreement, each Contributor hereby
+grants Recipient a non-exclusive, worldwide, royalty-free copyright
+license to reproduce, prepare derivative works of, publicly display,
+publicly perform, distribute and sublicense the Contribution of such
+Contributor, if any, and such derivative works, in source code and
+object code form.
+
+b) Subject to the terms of this Agreement, each Contributor hereby
+grants Recipient a non-exclusive, worldwide, royalty-free patent license
+under Licensed Patents to make, use, sell, offer to sell, import and
+otherwise transfer the Contribution of such Contributor, if any, in
+source code and object code form. This patent license shall apply to the
+combination of the Contribution and the Program if, at the time the
+Contribution is added by the Contributor, such addition of the
+Contribution causes such combination to be covered by the Licensed
+Patents. The patent license shall not apply to any other combinations
+which include the Contribution. No hardware per se is licensed hereunder.
+
+c) Recipient understands that although each Contributor grants the
+licenses to its Contributions set forth herein, no assurances are
+provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.
+
+d) Each Contributor represents that to its knowledge it has sufficient
+copyright rights in its Contribution, if any, to grant the copyright
+license set forth in this Agreement.
+
+*3. REQUIREMENTS*
+
+A Contributor may choose to distribute the Program in object code form
+under its own license agreement, provided that:
+
+a) it complies with the terms and conditions of this Agreement; and
+
+b) its license agreement:
+
+i) effectively disclaims on behalf of all Contributors all warranties
+and conditions, express and implied, including warranties or conditions
+of title and non-infringement, and implied warranties or conditions of
+merchantability and fitness for a particular purpose;
+
+ii) effectively excludes on behalf of all Contributors all liability for
+damages, including direct, indirect, special, incidental and
+consequential damages, such as lost profits;
+
+iii) states that any provisions which differ from this Agreement are
+offered by that Contributor alone and not by any other party; and
+
+iv) states that source code for the Program is available from such
+Contributor, and informs licensees how to obtain it in a reasonable
+manner on or through a medium customarily used for software exchange.
+
+When the Program is made available in source code form:
+
+a) it must be made available under this Agreement; and
+
+b) a copy of this Agreement must be included with each copy of the Program.
+
+Contributors may not remove or alter any copyright notices contained
+within the Program.
+
+Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.
+
+*4. COMMERCIAL DISTRIBUTION*
+
+Commercial distributors of software may accept certain responsibilities
+with respect to end users, business partners and the like. While this
+license is intended to facilitate the commercial use of the Program, the
+Contributor who includes the Program in a commercial product offering
+should do so in a manner which does not create potential liability for
+other Contributors. Therefore, if a Contributor includes the Program in
+a commercial product offering, such Contributor ("Commercial
+Contributor") hereby agrees to defend and indemnify every other
+Contributor ("Indemnified Contributor") against any losses, damages and
+costs (collectively "Losses") arising from claims, lawsuits and other
+legal actions brought by a third party against the Indemnified
+Contributor to the extent caused by the acts or omissions of such
+Commercial Contributor in connection with its distribution of the
+Program in a commercial product offering. The obligations in this
+section do not apply to any claims or Losses relating to any actual or
+alleged intellectual property infringement. In order to qualify, an
+Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial
+Contributor to control, and cooperate with the Commercial Contributor
+in, the defense and any related settlement negotiations. The Indemnified
+Contributor may participate in any such claim at its own expense.
+
+For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.
+
+*5. NO WARRANTY*
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED
+ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES
+OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR
+A PARTICULAR PURPOSE. Each Recipient is solely responsible for
+determining the appropriateness of using and distributing the Program
+and assumes all risks associated with its exercise of rights under this
+Agreement , including but not limited to the risks and costs of program
+errors, compliance with applicable laws, damage to or loss of data,
+programs or equipment, and unavailability or interruption of operations.
+
+*6. DISCLAIMER OF LIABILITY*
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR
+ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+*7. GENERAL*
+
+If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.
+
+If Recipient institutes patent litigation against any entity (including
+a cross-claim or counterclaim in a lawsuit) alleging that the Program
+itself (excluding combinations of the Program with other software or
+hardware) infringes such Recipient's patent(s), then such Recipient's
+rights granted under Section 2(b) shall terminate as of the date such
+litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it fails
+to comply with any of the material terms or conditions of this Agreement
+and does not cure such failure in a reasonable period of time after
+becoming aware of such noncompliance. If all Recipient's rights under
+this Agreement terminate, Recipient agrees to cease use and distribution
+of the Program as soon as reasonably practicable. However, Recipient's
+obligations under this Agreement and any licenses granted by Recipient
+relating to the Program shall continue and survive.
+
+Everyone is permitted to copy and distribute copies of this Agreement,
+but in order to avoid inconsistency the Agreement is copyrighted and may
+only be modified in the following manner. The Agreement Steward reserves
+the right to publish new versions (including revisions) of this
+Agreement from time to time. No one other than the Agreement Steward has
+the right to modify this Agreement. The Eclipse Foundation is the
+initial Agreement Steward. The Eclipse Foundation may assign the
+responsibility to serve as the Agreement Steward to a suitable separate
+entity. Each new version of the Agreement will be given a distinguishing
+version number. The Program (including Contributions) may always be
+distributed subject to the version of the Agreement under which it was
+received. In addition, after a new version of the Agreement is
+published, Contributor may elect to distribute the Program (including
+its Contributions) under the new version. Except as expressly stated in
+Sections 2(a) and 2(b) above, Recipient receives no rights or licenses
+to the intellectual property of any Contributor under this Agreement,
+whether expressly, by implication, estoppel or otherwise. All rights in
+the Program not expressly granted under this Agreement are reserved.
+
+This Agreement is governed by the laws of the State of New York and the
+intellectual property laws of the United States of America. No party to
+this Agreement will bring a legal action under this Agreement more than
+one year after the cause of action arose. Each party waives its rights
+to a jury trial in any resulting litigation.
+
+============================================================
+Notices for file(s):
+lib/jfreechart-1.0.9.jar
+------------------------------------------------------------
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
+============================================================
+Notices for file(s):
+lib/jcommon-1.0.12.jar
+------------------------------------------------------------
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
+============================================================
+Notices for file(s):
+lib/jsilver-1.0.0.jar
+------------------------------------------------------------
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
+
+============================================================
+Notices for file(s):
+lib/jython-standalone-2.5.3.jar
+------------------------------------------------------------
+Source: http://www.jython.org/license.html
+
+ The Jython License
+
+ A. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING JYTHON
+
+PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
+
+ 1. This LICENSE AGREEMENT is between the Python Software Foundation
+ ("PSF"), and the Individual or Organization ("Licensee") accessing and
+ otherwise using this software ("Jython") in source or binary form and its
+ associated documentation.
+
+ 2. Subject to the terms and conditions of this License Agreement, PSF
+ hereby grants Licensee a nonexclusive, royalty-free, world-wide license to
+ reproduce, analyze, test, perform and/or display publicly, prepare
+ derivative works, distribute, and otherwise use Jython alone or in any
+ derivative version, provided, however, that PSF's License Agreement and
+ PSF's notice of copyright, i.e., "Copyright (c) 2007 Python Software
+ Foundation; All Rights Reserved" are retained in Jython alone or in any
+ derivative version prepared by Licensee.
+
+ 3. In the event Licensee prepares a derivative work that is based on or
+ incorporates Jython or any part thereof, and wants to make the derivative
+ work available to others as provided herein, then Licensee hereby agrees
+ to include in any such work a brief summary of the changes made to Jython.
+
+ 4. PSF is making Jython available to Licensee on an "AS IS" basis. PSF
+ MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF
+ EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY REPRESENTATION
+ OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR
+ THAT THE USE OF JYTHON WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
+
+ 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF JYTHON FOR
+ ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF
+ MODIFYING, DISTRIBUTING, OR OTHERWISE USING JYTHON, OR ANY DERIVATIVE
+ THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+ 6. This License Agreement will automatically terminate upon a material
+ breach of its terms and conditions.
+
+ 7. Nothing in this License Agreement shall be deemed to create any
+ relationship of agency, partnership, or joint venture between PSF and
+ Licensee. This License Agreement does not grant permission to use PSF
+ trademarks or trade name in a trademark sense to endorse or promote
+ products or services of Licensee, or any third party.
+
+ 8. By copying, installing or otherwise using Jython, Licensee agrees to be
+ bound by the terms and conditions of this License Agreement.
+
+Jython 2.0, 2.1 License
+
+ Copyright (c) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Jython
+ Developers All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of the Jython Developers nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ JPython 1.1.x Software License.
+
+ 1. This LICENSE AGREEMENT is between the Corporation for National
+ Research Initiatives, having an office at 1895 Preston White Drive,
+ Reston, VA 20191 ("CNRI"), and the Individual or Organization
+ ("Licensee") accessing and using JPython version 1.1.x in source or
+ binary form and its associated documentation as provided herein
+ ("Software").
+
+ 2. Subject to the terms and conditions of this License Agreement, CNRI
+ hereby grants Licensee a non-exclusive, non-transferable,
+ royalty-free, world-wide license to reproduce, analyze, test,
+ perform and/or display publicly, prepare derivative works,
+ distribute, and otherwise use the Software alone or in any
+ derivative version, provided, however, that CNRI's License Agreement
+ and CNRI's notice of copyright, i.e., "Copyright **1996-1999
+ Corporation for National Research Initiatives; All Rights Reserved"
+ are both retained in the Software, alone or in any derivative
+ version prepared by Licensee.
+
+ Alternatively, in lieu of CNRI's License Agreement, Licensee may
+ substitute the following text (omitting the quotes), provided,
+ however, that such text is displayed prominently in the Software
+ alone or in any derivative version prepared by Licensee: "JPython
+ (Version 1.1.x) is made available subject to the terms and
+ conditions in CNRI's License Agreement. This Agreement may be
+ located on the Internet using the following unique, persistent
+ identifier (known as a handle): 1895.22/1006. The License may also
+ be obtained from a proxy server on the Web using the following URL:
+ http://hdl.handle.net/1895.22/1006."
+
+ 3. In the event Licensee prepares a derivative work that is based on or
+ incorporates the Software or any part thereof, and wants to make the
+ derivative work available to the public as provided herein, then
+ Licensee hereby agrees to indicate in any such work, in a
+ prominently visible way, the nature of the modifications made to
+ CNRI's Software.
+
+ 4. Licensee may not use CNRI trademarks or trade name, including
+ JPython or CNRI, in a trademark sense to endorse or promote products
+ or services of Licensee, or any third party. Licensee may use the
+ mark JPython in connection with Licensee's derivative versions that
+ are based on or incorporate the Software, but only in the form
+ "JPython-based ___________________," or equivalent.
+
+ 5. CNRI is making the Software available to Licensee on an "AS IS"
+ basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+ IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
+ DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR
+ FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE
+ WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
+
+ 6. CNRI SHALL NOT BE LIABLE TO LICENSEE OR OTHER USERS OF THE SOFTWARE
+ FOR ANY INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS AS A
+ RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
+ DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. SOME
+ STATES DO NOT ALLOW THE LIMITATION OR EXCLUSION OF LIABILITY SO THE
+ ABOVE DISCLAIMER MAY NOT APPLY TO LICENSEE.
+
+ 7. This License Agreement may be terminated by CNRI (i) immediately
+ upon written notice from CNRI of any material breach by the
+ Licensee, if the nature of the breach is such that it cannot be
+ promptly remedied; or (ii) sixty (60) days following notice from
+ CNRI to Licensee of a material remediable breach, if Licensee has
+ not remedied such breach within that sixty-day period.
+
+ 8. This License Agreement shall be governed by and interpreted in all
+ respects by the law of the State of Virginia, excluding conflict of
+ law provisions. Nothing in this Agreement shall be deemed to create
+ any relationship of agency, partnership, or joint venture between
+ CNRI and Licensee.
+
+ 9. By clicking on the "ACCEPT" button where indicated, or by
+ installing, copying or otherwise using the Software, Licensee agrees
+ to be bound by the terms and conditions of this License Agreement.
+
+ [ACCEPT BUTTON]
+
+ B. HISTORY OF THE SOFTWARE
+
+ JPython was created in late 1997 by Jim Hugunin. Jim was also the primary
+ developer while he was at CNRI. In February 1999 Barry Warsaw took over as
+ primary developer and released JPython version 1.1.
+
+ In October 2000 Barry helped move the software to SourceForge where it was
+ renamed to Jython. Jython 2.0 and 2.1 were developed under the Jython
+ specific license below.
+
+ From the 2.2 release on, Jython contributors have signed Python Software
+ Foundation contributor agreements and releases are covered under the
+ Python Software Foundation license version 2.
+
+ The standard library is covered by the Python Software Foundation license
+ as well. See the Lib/LICENSE file for details.
+
+ The zxJDBC package was written by Brian Zimmer and originally licensed
+ under the GNU Public License. The package is now covered by the Jython
+ Software License.
+
+ The command line interpreter is covered by the Apache Software License.
+ See the org/apache/LICENSE file for details.
+
+ ----------------------------------------------------------------------
+
diff --git a/love2dToAPK/tools/tools/android-win/tools/android.bat b/love2dToAPK/tools/tools/android-win/tools/android.bat
new file mode 100644
index 0000000..92cd2c5
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/android.bat
@@ -0,0 +1,85 @@
+@echo off
+rem Copyright (C) 2007 The Android Open Source Project
+rem
+rem Licensed under the Apache License, Version 2.0 (the "License");
+rem you may not use this file except in compliance with the License.
+rem You may obtain a copy of the License at
+rem
+rem http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem Useful links:
+rem Command-line reference:
+rem http://technet.microsoft.com/en-us/library/bb490890.aspx
+
+rem don't modify the caller's environment
+setlocal enableextensions
+
+rem Set up prog to be the path of this script, including following symlinks,
+rem and set up progdir to be the fully-qualified pathname of its directory.
+set prog=%~f0
+
+rem Grab current directory before we change it
+set work_dir=%cd%
+
+rem Change current directory and drive to where the script is, to avoid
+rem issues with directories containing whitespaces.
+cd /d %~dp0
+
+
+rem Check we have a valid Java.exe in the path.
+set java_exe=
+call lib\find_java.bat
+if not defined java_exe goto :EOF
+
+set jar_path=lib\sdkmanager.jar;lib\swtmenubar.jar
+
+rem Set SWT.Jar path based on current architecture (x86 or x86_64)
+for /f "delims=" %%a in ('"%java_exe%" -jar lib\archquery.jar') do set swt_path=lib\%%a
+
+:MkTempCopy
+ rem Copy android.bat and its required libs to a temp dir.
+ rem This avoids locking the tool dir in case the user is trying to update it.
+
+ set tmp_dir=%TEMP%\temp-android-tool
+ xcopy %swt_path% %tmp_dir%\%swt_path% /I /E /C /G /R /Y /Q > nul
+ copy /B /D /Y lib\common.jar %tmp_dir%\lib\ > nul
+ copy /B /D /Y lib\commons-codec* %tmp_dir%\lib\ > nul
+ copy /B /D /Y lib\commons-compress* %tmp_dir%\lib\ > nul
+ copy /B /D /Y lib\commons-logging* %tmp_dir%\lib\ > nul
+ copy /B /D /Y lib\dvlib.jar %tmp_dir%\lib\ > nul
+ copy /B /D /Y lib\gson* %tmp_dir%\lib\ > nul
+ copy /B /D /Y lib\guava* %tmp_dir%\lib\ > nul
+ copy /B /D /Y lib\httpclient* %tmp_dir%\lib\ > nul
+ copy /B /D /Y lib\httpcore* %tmp_dir%\lib\ > nul
+ copy /B /D /Y lib\httpmime* %tmp_dir%\lib\ > nul
+ copy /B /D /Y lib\layoutlib-api.jar %tmp_dir%\lib\ > nul
+ copy /B /D /Y lib\org-eclipse-* %tmp_dir%\lib\ > nul
+ copy /B /D /Y lib\sdk* %tmp_dir%\lib\ > nul
+ copy /B /D /Y lib\swtmenubar.jar %tmp_dir%\lib\ > nul
+
+ rem jar_path and swt_path are relative to PWD so we don't need to adjust them, just change dirs.
+ set tools_dir=%cd%
+ cd /d %tmp_dir%
+
+:EndTempCopy
+
+rem The global ANDROID_SWT always override the SWT.Jar path
+if defined ANDROID_SWT set swt_path=%ANDROID_SWT%
+
+if exist "%swt_path%" goto SetPath
+ echo ERROR: SWT folder '%swt_path%' does not exist.
+ echo Please set ANDROID_SWT to point to the folder containing swt.jar for your platform.
+ goto :EOF
+
+:SetPath
+rem Finally exec the java program and end here.
+REM set REMOTE_DEBUG=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+call "%java_exe% %REMOTE_DEBUG%" "-Dcom.android.sdkmanager.toolsdir=%tools_dir%" "-Dcom.android.sdkmanager.workdir=%work_dir%" -classpath "%jar_path%;%swt_path%\swt.jar" com.android.sdkmanager.Main %*
+
+rem EOF
diff --git a/love2dToAPK/tools/tools/android-win/tools/ant/NOTICE b/love2dToAPK/tools/tools/android-win/tools/ant/NOTICE
new file mode 100644
index 0000000..06a9081
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/ant/NOTICE
@@ -0,0 +1,190 @@
+
+ Copyright (c) 2005-2014, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
diff --git a/love2dToAPK/tools/tools/android-win/tools/ant/build.xml b/love2dToAPK/tools/tools/android-win/tools/ant/build.xml
new file mode 100644
index 0000000..aab440c
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/ant/build.xml
@@ -0,0 +1,1534 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="android_rules" default="debug">
+
+ <!--
+ This build file is imported by the project build file. It contains
+ all the targets and tasks necessary to build Android projects, be they
+ regular projects, library projects, or test projects.
+
+ At the beginning of the file is a list of properties that can be overridden
+ by adding them to your ant.properties (properties are immutable, so their
+ first definition sticks and is never changed).
+
+ Follows:
+ - custom task definitions,
+ - more properties (do not override those unless the whole build system is modified).
+ - macros used throughout the build,
+ - base build targets,
+ - debug-specific build targets,
+ - release-specific build targets,
+ - instrument-specific build targets,
+ - test project-specific build targets,
+ - install targets,
+ - help target
+ -->
+
+ <!-- ******************************************************* -->
+ <!-- **************** Overridable Properties *************** -->
+ <!-- ******************************************************* -->
+
+ <!-- You can override these values in your build.xml or ant.properties.
+ Overriding any other properties may result in broken build. -->
+
+ <!-- Tells adb which device to target. You can change this from the command line
+ by invoking "ant -Dadb.device.arg=-d" for device "ant -Dadb.device.arg=-e" for
+ the emulator. -->
+ <property name="adb.device.arg" value="" />
+
+ <!-- fileset exclude patterns (space separated) to prevent
+ files inside src/ from being packaged. -->
+ <property name="android.package.excludes" value="" />
+
+ <!-- set some properties used for filtering/override. If those weren't defined
+ before, then this will create them with empty values, which are then ignored
+ by the custom tasks receiving them. -->
+ <property name="version.code" value="" />
+ <property name="version.name" value="" />
+ <property name="aapt.resource.filter" value="" />
+ <!-- 'aapt.ignore.assets' is the list of file patterns to ignore under /res and /assets.
+ Default is "!.svn:!.git:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*.scc:*~"
+
+ Overall patterns syntax is:
+ [!][<dir>|<file>][*suffix-match|prefix-match*|full-match]:more:patterns...
+
+ - The first character flag ! avoids printing a warning.
+ - Pattern can have the flag "<dir>" to match only directories
+ or "<file>" to match only files. Default is to match both.
+ - Match is not case-sensitive.
+ -->
+ <property name="aapt.ignore.assets" value="" />
+
+ <!-- dex force jumbo options, to be used when dex merging fails with
+ UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dx.util.DexException: Cannot handle conversion to jumbo index!
+ at com.android.dx.merge.InstructionTransformer.jumboCheck(InstructionTransformer.java:103)
+ ...
+ -->
+ <property name="dex.force.jumbo" value="false" />
+ <property name="dex.disable.merger" value="false" />
+
+ <!-- compilation options -->
+ <property name="java.encoding" value="UTF-8" />
+ <property name="java.target" value="1.5" />
+ <property name="java.source" value="1.5" />
+ <property name="java.compilerargs" value="" />
+ <property name="java.compiler.classpath" value="" />
+
+ <!-- Renderscript options -->
+ <property name="renderscript.debug.opt.level" value="O0" />
+ <property name="renderscript.release.opt.level" value="O3" />
+ <property name="renderscript.support.mode" value="false" />
+
+ <!-- manifest merger default value -->
+ <property name="manifestmerger.enabled" value="false" />
+
+ <!-- instrumentation options -->
+ <property name="emma.filter" value="" />
+
+ <!-- Verbosity -->
+ <property name="verbose" value="false" />
+
+ <!-- Output location of the HTML report for the "lint" target.
+ Ideally this would be specified as
+ value="${out.dir}/lint-results.html"
+ but we can't make a forward reference to the definition for
+ ${out.dir}, and it is not a configurable property (yet).
+ -->
+ <property name="lint.out.html" value="bin/lint-results.html" />
+
+ <!-- Output location of the XML report for the "lint" target -->
+ <property name="lint.out.xml" value="bin/lint-results.xml" />
+
+ <!-- ******************************************************* -->
+ <!-- ********************* Custom Tasks ******************** -->
+ <!-- ******************************************************* -->
+
+ <!-- jar file from where the tasks are loaded -->
+ <path id="android.antlibs">
+ <pathelement path="${sdk.dir}/tools/lib/ant-tasks.jar" />
+ </path>
+
+ <!-- Custom tasks -->
+ <taskdef resource="anttasks.properties" classpathref="android.antlibs" />
+
+ <!-- Emma configuration -->
+ <property name="emma.dir" value="${sdk.dir}/tools/lib" />
+ <path id="emma.lib">
+ <pathelement location="${emma.dir}/emma.jar" />
+ <pathelement location="${emma.dir}/emma_ant.jar" />
+ </path>
+ <taskdef resource="emma_ant.properties" classpathref="emma.lib" />
+ <!-- End of emma configuration -->
+
+
+ <!-- ******************************************************* -->
+ <!-- ******************* Other Properties ****************** -->
+ <!-- ******************************************************* -->
+ <!-- overriding these properties may break the build
+ unless the whole file is updated -->
+
+ <!-- Input directories -->
+ <property name="source.dir" value="src" />
+ <property name="source.absolute.dir" location="${source.dir}" />
+ <property name="gen.absolute.dir" location="gen" />
+ <property name="resource.absolute.dir" location="res" />
+ <property name="asset.dir" value="assets" />
+ <property name="asset.absolute.dir" location="${asset.dir}" />
+ <property name="jar.libs.dir" value="libs" />
+ <property name="jar.libs.absolute.dir" location="${jar.libs.dir}" />
+ <property name="native.libs.absolute.dir" location="libs" />
+
+ <property name="manifest.file" value="AndroidManifest.xml" />
+ <property name="manifest.abs.file" location="${manifest.file}" />
+
+ <!-- Output directories -->
+ <property name="out.dir" value="bin" />
+ <property name="out.absolute.dir" location="${out.dir}" />
+ <property name="out.classes.absolute.dir" location="${out.dir}/classes" />
+ <property name="out.res.absolute.dir" location="${out.dir}/res" />
+ <property name="out.rs.obj.absolute.dir" location="${out.dir}/rsObj" />
+ <property name="out.rs.libs.absolute.dir" location="${out.dir}/rsLibs" />
+ <property name="out.aidl.absolute.dir" location="${out.dir}/aidl" />
+ <property name="out.dexed.absolute.dir" location="${out.dir}/dexedLibs" />
+ <property name="out.manifest.abs.file" location="${out.dir}/AndroidManifest.xml" />
+
+ <!-- tools location -->
+ <property name="android.tools.dir" location="${sdk.dir}/tools" />
+ <property name="android.platform.tools.dir" location="${sdk.dir}/platform-tools" />
+ <condition property="exe" value=".exe" else=""><os family="windows" /></condition>
+ <condition property="bat" value=".bat" else=""><os family="windows" /></condition>
+ <property name="adb" location="${android.platform.tools.dir}/adb${exe}" />
+ <property name="lint" location="${android.tools.dir}/lint${bat}" />
+
+ <!-- Intermediate files -->
+ <property name="dex.file.name" value="classes.dex" />
+ <property name="intermediate.dex.file" location="${out.absolute.dir}/${dex.file.name}" />
+ <property name="resource.package.file.name" value="${ant.project.name}.ap_" />
+
+ <!-- Build property file -->
+ <property name="out.build.prop.file" location="${out.absolute.dir}/build.prop" />
+
+
+ <!-- This is needed by emma as it uses multilevel verbosity instead of simple 'true' or 'false'
+ The property 'verbosity' is not user configurable and depends exclusively on 'verbose'
+ value.-->
+ <condition property="verbosity" value="verbose" else="quiet">
+ <istrue value="${verbose}" />
+ </condition>
+
+ <!-- properties for signing in release mode -->
+ <condition property="has.keystore">
+ <and>
+ <isset property="key.store" />
+ <length string="${key.store}" when="greater" length="0" />
+ <isset property="key.alias" />
+ </and>
+ </condition>
+ <condition property="has.password">
+ <and>
+ <isset property="has.keystore" />
+ <isset property="key.store.password" />
+ <isset property="key.alias.password" />
+ </and>
+ </condition>
+
+ <!-- properties for packaging -->
+ <property name="build.packaging.nocrunch" value="true" />
+
+ <!-- whether we need to fork javac.
+ This is only needed on Windows when running Java < 7 -->
+ <condition else="false" property="need.javac.fork">
+ <and>
+ <matches pattern="1\.[56]" string="${java.specification.version}"/>
+ <not>
+ <os family="unix"/>
+ </not>
+ </and>
+ </condition>
+
+ <!-- ******************************************************* -->
+ <!-- ************************ Macros *********************** -->
+ <!-- ******************************************************* -->
+
+ <!-- macro to do a task on if project.is.library is false.
+ elseText attribute is displayed otherwise -->
+ <macrodef name="do-only-if-not-library">
+ <attribute name="elseText" />
+ <element name="task-to-do" implicit="yes" />
+ <sequential>
+ <if condition="${project.is.library}">
+ <else>
+ <task-to-do />
+ </else>
+ <then>
+ <echo level="info">@{elseText}</echo>
+ </then>
+ </if>
+ </sequential>
+ </macrodef>
+
+ <!-- macro to do a task on if manifest.hasCode is true.
+ elseText attribute is displayed otherwise -->
+ <macrodef name="do-only-if-manifest-hasCode">
+ <attribute name="elseText" default=""/>
+ <element name="task-to-do" implicit="yes" />
+ <sequential>
+ <if condition="${manifest.hasCode}">
+ <then>
+ <task-to-do />
+ </then>
+ <else>
+ <if>
+ <condition>
+ <length string="@{elseText}" trim="true" when="greater" length="0" />
+ </condition>
+ <then>
+ <echo level="info">@{elseText}</echo>
+ </then>
+ </if>
+ </else>
+ </if>
+ </sequential>
+ </macrodef>
+
+
+ <!-- Configurable macro, which allows to pass as parameters output directory,
+ output dex filename and external libraries to dex (optional) -->
+ <macrodef name="dex-helper">
+ <element name="external-libs" optional="yes" />
+ <attribute name="nolocals" default="false" />
+ <sequential>
+ <!-- sets the primary input for dex. If a pre-dex task sets it to
+ something else this has no effect -->
+ <property name="out.dex.input.absolute.dir" value="${out.classes.absolute.dir}" />
+
+ <!-- set the secondary dx input: the project (and library) jar files
+ If a pre-dex task sets it to something else this has no effect -->
+ <if>
+ <condition>
+ <isreference refid="out.dex.jar.input.ref" />
+ </condition>
+ <else>
+ <path id="out.dex.jar.input.ref">
+ <path refid="project.all.jars.path" />
+ </path>
+ </else>
+ </if>
+
+ <dex executable="${dx}"
+ output="${intermediate.dex.file}"
+ dexedlibs="${out.dexed.absolute.dir}"
+ nolocals="@{nolocals}"
+ forceJumbo="${dex.force.jumbo}"
+ disableDexMerger="${dex.disable.merger}"
+ verbose="${verbose}">
+ <path path="${out.dex.input.absolute.dir}"/>
+ <path refid="out.dex.jar.input.ref" />
+ <external-libs />
+ </dex>
+ </sequential>
+ </macrodef>
+
+ <!-- This is macro that enable passing variable list of external jar files to ApkBuilder
+ Example of use:
+ <package-helper>
+ <extra-jars>
+ <jarfolder path="my_jars" />
+ <jarfile path="foo/bar.jar" />
+ <jarfolder path="your_jars" />
+ </extra-jars>
+ </package-helper> -->
+ <macrodef name="package-helper">
+ <element name="extra-jars" optional="yes" />
+ <sequential>
+ <apkbuilder
+ outfolder="${out.absolute.dir}"
+ resourcefile="${resource.package.file.name}"
+ apkfilepath="${out.packaged.file}"
+ debugpackaging="${build.is.packaging.debug}"
+ debugsigning="${build.is.signing.debug}"
+ verbose="${verbose}"
+ hascode="${manifest.hasCode}"
+ previousBuildType="${build.last.is.packaging.debug}/${build.last.is.signing.debug}"
+ buildType="${build.is.packaging.debug}/${build.is.signing.debug}">
+ <dex path="${intermediate.dex.file}"/>
+ <sourcefolder path="${source.absolute.dir}"/>
+ <jarfile refid="project.all.jars.path" />
+ <nativefolder path="${native.libs.absolute.dir}" />
+ <nativefolder refid="project.library.native.folder.path" />
+ <nativefolder refid="project.rs.support.libs.path" />
+ <nativefolder path="${out.rs.libs.absolute.dir}" />
+ <extra-jars/>
+ </apkbuilder>
+ </sequential>
+ </macrodef>
+
+ <!-- This is macro which zipaligns in.package and outputs it to out.package. Used by targets
+ debug, -debug-with-emma and release.-->
+ <macrodef name="zipalign-helper">
+ <attribute name="in.package" />
+ <attribute name="out.package" />
+ <sequential>
+ <zipalign
+ executable="${zipalign}"
+ input="@{in.package}"
+ output="@{out.package}"
+ verbose="${verbose}" />
+ </sequential>
+ </macrodef>
+
+ <macrodef name="run-tests-helper">
+ <attribute name="emma.enabled" default="false" />
+ <element name="extra-instrument-args" optional="yes" />
+ <sequential>
+ <echo level="info">Running tests ...</echo>
+ <exec executable="${adb}" failonerror="true">
+ <arg line="${adb.device.arg}" />
+ <arg value="shell" />
+ <arg value="am" />
+ <arg value="instrument" />
+ <arg value="-w" />
+ <arg value="-e" />
+ <arg value="coverage" />
+ <arg value="@{emma.enabled}" />
+ <extra-instrument-args />
+ <arg value="${project.app.package}/${test.runner}" />
+ </exec>
+ </sequential>
+ </macrodef>
+
+ <macrodef name="record-build-key">
+ <attribute name="key" default="false" />
+ <attribute name="value" default="false" />
+ <sequential>
+ <propertyfile file="${out.build.prop.file}" comment="Last build type">
+ <entry key="@{key}" value="@{value}"/>
+ </propertyfile>
+ </sequential>
+ </macrodef>
+
+ <macrodef name="record-build-info">
+ <sequential>
+ <record-build-key key="build.last.target" value="${build.target}" />
+ <record-build-key key="build.last.is.instrumented" value="${build.is.instrumented}" />
+ <record-build-key key="build.last.is.packaging.debug" value="${build.is.packaging.debug}" />
+ <record-build-key key="build.last.is.signing.debug" value="${build.is.signing.debug}" />
+ </sequential>
+ </macrodef>
+
+ <macrodef name="uninstall-helper">
+ <attribute name="app.package" default="false" />
+ <sequential>
+ <echo level="info">Uninstalling @{app.package} from the default emulator or device...</echo>
+ <exec executable="${adb}" failonerror="true">
+ <arg line="${adb.device.arg}" />
+ <arg value="uninstall" />
+ <arg value="@{app.package}" />
+ </exec>
+ </sequential>
+ </macrodef>
+
+ <!-- ******************************************************* -->
+ <!-- ******************** Build Targets ******************** -->
+ <!-- ******************************************************* -->
+
+ <!-- Basic Ant + SDK check -->
+ <target name="-check-env">
+ <checkenv />
+ </target>
+
+ <!-- target to disable building dependencies -->
+ <target name="nodeps">
+ <property name="dont.do.deps" value="true" />
+ </target>
+
+ <!-- generic setup -->
+ <target name="-setup" depends="-check-env">
+ <echo level="info">Project Name: ${ant.project.name}</echo>
+ <gettype projectTypeOut="project.type" />
+
+ <!-- sets a few boolean based on project.type
+ to make the if task easier -->
+ <condition property="project.is.library" value="true" else="false">
+ <equals arg1="${project.type}" arg2="library" />
+ </condition>
+ <condition property="project.is.test" value="true" else="false">
+ <equals arg1="${project.type}" arg2="test" />
+ </condition>
+ <condition property="project.is.testapp" value="true" else="false">
+ <equals arg1="${project.type}" arg2="test-app" />
+ </condition>
+
+ <!-- If a test project, resolve absolute path to tested project. -->
+ <if condition="${project.is.test}">
+ <then>
+ <property name="tested.project.absolute.dir" location="${tested.project.dir}" />
+ </then>
+ </if>
+
+ <!-- get the project manifest package -->
+ <xpath input="${manifest.abs.file}"
+ expression="/manifest/@package" output="project.app.package" />
+
+ </target>
+
+ <!-- empty default pre-clean target. Create a similar target in
+ your build.xml and it'll be called instead of this one. -->
+ <target name="-pre-clean"/>
+
+ <!-- clean target -->
+ <target name="clean" depends="-setup, -pre-clean"
+ description="Removes output files created by other targets.">
+ <delete dir="${out.absolute.dir}" verbose="${verbose}" />
+ <delete dir="${gen.absolute.dir}" verbose="${verbose}" />
+
+ <!-- if we know about a tested project or libraries, we clean them too. -->
+ <if condition="${project.is.test}">
+ <then>
+ <property name="tested.project.absolute.dir" location="${tested.project.dir}" />
+ <subant failonerror="true">
+ <fileset dir="${tested.project.absolute.dir}" includes="build.xml" />
+ <target name="clean" />
+ </subant>
+ </then>
+ </if>
+
+ <!-- get all the libraries -->
+ <if>
+ <condition><not><isset property="dont.do.deps" /></not></condition>
+ <then>
+ <getlibpath libraryFolderPathOut="project.library.folder.path" />
+ <if>
+ <condition>
+ <isreference refid="project.library.folder.path" />
+ </condition>
+ <then>
+ <!-- clean the libraries with nodeps since we already
+ know about all the libraries even the indirect one -->
+ <subant
+ buildpathref="project.library.folder.path"
+ antfile="build.xml"
+ failonerror="true">
+ <target name="nodeps" />
+ <target name="clean" />
+ </subant>
+ </then>
+ </if>
+ </then>
+ </if>
+ </target>
+
+ <!-- Pre build setup -->
+ <target name="-build-setup" depends="-setup">
+ <!-- find location of build tools -->
+ <getbuildtools name="android.build.tools.dir" verbose="${verbose}" />
+
+ <!-- read the previous build mode -->
+ <property file="${out.build.prop.file}" />
+ <!-- if empty the props won't be set, meaning it's a new build.
+ To force a build, set the prop to empty values. -->
+ <property name="build.last.target" value="" />
+ <property name="build.last.is.instrumented" value="" />
+ <property name="build.last.is.packaging.debug" value="" />
+ <property name="build.last.is.signing.debug" value="" />
+
+ <!-- If the "debug" build type changed, clear out the compiled code.
+ This is to make sure the new BuildConfig.DEBUG value is picked up
+ as javac can't deal with this type of change in its dependency computation. -->
+ <if>
+ <condition>
+ <and>
+ <length string="${build.last.is.packaging.debug}" trim="true" when="greater" length="0" />
+ <not><equals
+ arg1="${build.is.packaging.debug}"
+ arg2="${build.last.is.packaging.debug}" /></not>
+ </and>
+ </condition>
+ <then>
+ <echo level="info">Switching between debug and non debug build: Deleting previous compilation output...</echo>
+ <delete dir="${out.classes.absolute.dir}" verbose="${verbose}" />
+ </then>
+ <else>
+ <!-- Else, we may still need to clean the code, for another reason.
+ special case for instrumented: if the previous build was
+ instrumented but not this one, clear out the compiled code -->
+ <if>
+ <condition>
+ <and>
+ <istrue value="${build.last.is.instrumented}" />
+ <isfalse value="${build.is.instrumented}" />
+ </and>
+ </condition>
+ <then>
+ <echo level="info">Switching from instrumented to non-instrumented build: Deleting previous compilation output...</echo>
+ <delete dir="${out.classes.absolute.dir}" verbose="${verbose}" />
+ </then>
+ </if>
+ </else>
+ </if>
+
+ <echo level="info">Resolving Build Target for ${ant.project.name}...</echo>
+ <!-- load project properties, resolve Android target, library dependencies
+ and set some properties with the results.
+ All property names are passed as parameters ending in -Out -->
+ <gettarget
+ androidJarFileOut="project.target.android.jar"
+ androidAidlFileOut="project.target.framework.aidl"
+ bootClassPathOut="project.target.class.path"
+ targetApiOut="project.target.apilevel"
+ minSdkVersionOut="project.minSdkVersion" />
+
+ <!-- Value of the hasCode attribute (Application node) extracted from manifest file -->
+ <xpath input="${manifest.abs.file}" expression="/manifest/application/@android:hasCode"
+ output="manifest.hasCode" default="true"/>
+
+ <echo level="info">----------</echo>
+ <echo level="info">Creating output directories if needed...</echo>
+ <mkdir dir="${resource.absolute.dir}" />
+ <mkdir dir="${jar.libs.absolute.dir}" />
+ <mkdir dir="${out.absolute.dir}" />
+ <mkdir dir="${out.res.absolute.dir}" />
+ <mkdir dir="${out.rs.obj.absolute.dir}" />
+ <mkdir dir="${out.rs.libs.absolute.dir}" />
+ <do-only-if-manifest-hasCode>
+ <mkdir dir="${gen.absolute.dir}" />
+ <mkdir dir="${out.classes.absolute.dir}" />
+ <mkdir dir="${out.dexed.absolute.dir}" />
+ </do-only-if-manifest-hasCode>
+
+ <echo level="info">----------</echo>
+ <echo level="info">Resolving Dependencies for ${ant.project.name}...</echo>
+ <dependency
+ libraryFolderPathOut="project.library.folder.path"
+ libraryPackagesOut="project.library.packages"
+ libraryManifestFilePathOut="project.library.manifest.file.path"
+ libraryResFolderPathOut="project.library.res.folder.path"
+ libraryBinAidlFolderPathOut="project.library.bin.aidl.folder.path"
+ libraryRFilePathOut="project.library.bin.r.file.path"
+ libraryNativeFolderPathOut="project.library.native.folder.path"
+ jarLibraryPathOut="project.all.jars.path"
+ targetApi="${project.target.apilevel}"
+ renderscriptSupportMode="${renderscript.support.mode}"
+ buildToolsFolder="${android.build.tools.dir}"
+ renderscriptSupportLibsOut="project.rs.support.libs.path"
+ verbose="${verbose}" />
+
+ <!-- compile the libraries if any -->
+ <if>
+ <condition>
+ <and>
+ <isreference refid="project.library.folder.path" />
+ <not><isset property="dont.do.deps" /></not>
+ </and>
+ </condition>
+ <then>
+ <!-- figure out which target must be used to build the library projects.
+ If emma is enabled, then use 'instrument' otherwise, use 'debug' -->
+ <condition property="project.libraries.target" value="instrument" else="${build.target}">
+ <istrue value="${build.is.instrumented}" />
+ </condition>
+
+ <echo level="info">----------</echo>
+ <echo level="info">Building Libraries with '${project.libraries.target}'...</echo>
+
+ <!-- no need to build the deps as we have already
+ the full list of libraries -->
+ <subant failonerror="true"
+ buildpathref="project.library.folder.path"
+ antfile="build.xml">
+ <target name="nodeps" />
+ <target name="${project.libraries.target}" />
+ <property name="emma.coverage.absolute.file" location="${out.absolute.dir}/coverage.em" />
+ </subant>
+ </then>
+ </if>
+
+ <!-- compile the main project if this is a test project -->
+ <if condition="${project.is.test}">
+ <then>
+ <!-- figure out which target must be used to build the tested project.
+ If emma is enabled, then use 'instrument' otherwise, use 'debug' -->
+ <condition property="tested.project.target" value="instrument" else="debug">
+ <isset property="emma.enabled" />
+ </condition>
+
+ <echo level="info">----------</echo>
+ <echo level="info">Building tested project at ${tested.project.absolute.dir} with '${tested.project.target}'...</echo>
+ <subant target="${tested.project.target}" failonerror="true">
+ <fileset dir="${tested.project.absolute.dir}" includes="build.xml" />
+ </subant>
+
+ <!-- get the tested project full classpath to be able to build
+ the test project -->
+ <testedprojectclasspath
+ projectLocation="${tested.project.absolute.dir}"
+ projectClassPathOut="tested.project.classpath"/>
+ </then>
+ <else>
+ <!-- no tested project, make an empty Path object so that javac doesn't
+ complain -->
+ <path id="tested.project.classpath" />
+ </else>
+ </if>
+ </target>
+
+ <!-- empty default pre-build target. Create a similar target in
+ your build.xml and it'll be called instead of this one. -->
+ <target name="-pre-build"/>
+
+ <!-- Code Generation: compile resources (aapt -> R.java), aidl, renderscript -->
+ <target name="-code-gen">
+ <!-- always merge manifest -->
+ <mergemanifest
+ appManifest="${manifest.abs.file}"
+ outManifest="${out.manifest.abs.file}"
+ enabled="${manifestmerger.enabled}">
+ <library refid="project.library.manifest.file.path" />
+ </mergemanifest>
+
+ <do-only-if-manifest-hasCode
+ elseText="hasCode = false. Skipping aidl/renderscript/R.java">
+ <echo level="info">Handling aidl files...</echo>
+ <aidl executable="${aidl}"
+ framework="${project.target.framework.aidl}"
+ libraryBinAidlFolderPathRefid="project.library.bin.aidl.folder.path"
+ genFolder="${gen.absolute.dir}"
+ aidlOutFolder="${out.aidl.absolute.dir}">
+ <source path="${source.absolute.dir}"/>
+ </aidl>
+
+ <!-- renderscript generates resources so it must be called before aapt -->
+ <echo level="info">----------</echo>
+ <echo level="info">Handling RenderScript files...</echo>
+ <!-- set the rs target prop in case it hasn't been set. -->
+ <property name="renderscript.target" value="${project.minSdkVersion}" />
+ <renderscript
+ buildToolsRoot="${android.build.tools.dir}"
+ genFolder="${gen.absolute.dir}"
+ resFolder="${out.res.absolute.dir}"
+ rsObjFolder="${out.rs.obj.absolute.dir}"
+ libsFolder="${out.rs.libs.absolute.dir}"
+ targetApi="${renderscript.target}"
+ optLevel="${renderscript.opt.level}"
+ supportMode="${renderscript.support.mode}"
+ binFolder="${out.absolute.dir}"
+ buildType="${build.is.packaging.debug}"
+ previousBuildType="${build.last.is.packaging.debug}">
+ <source path="${source.absolute.dir}"/>
+ </renderscript>
+
+ <echo level="info">----------</echo>
+ <echo level="info">Handling Resources...</echo>
+ <aapt executable="${aapt}"
+ command="package"
+ verbose="${verbose}"
+ manifest="${out.manifest.abs.file}"
+ originalManifestPackage="${project.app.package}"
+ androidjar="${project.target.android.jar}"
+ rfolder="${gen.absolute.dir}"
+ nonConstantId="${android.library}"
+ libraryResFolderPathRefid="project.library.res.folder.path"
+ libraryPackagesRefid="project.library.packages"
+ libraryRFileRefid="project.library.bin.r.file.path"
+ ignoreAssets="${aapt.ignore.assets}"
+ binFolder="${out.absolute.dir}"
+ proguardFile="${out.absolute.dir}/proguard.txt">
+ <res path="${out.res.absolute.dir}" />
+ <res path="${resource.absolute.dir}" />
+ </aapt>
+
+ <echo level="info">----------</echo>
+ <echo level="info">Handling BuildConfig class...</echo>
+ <buildconfig
+ genFolder="${gen.absolute.dir}"
+ package="${project.app.package}"
+ buildType="${build.is.packaging.debug}"
+ previousBuildType="${build.last.is.packaging.debug}"/>
+
+ </do-only-if-manifest-hasCode>
+ </target>
+
+ <!-- empty default pre-compile target. Create a similar target in
+ your build.xml and it'll be called instead of this one. -->
+ <target name="-pre-compile"/>
+
+ <!-- Compiles this project's .java files into .class files. -->
+ <target name="-compile" depends="-pre-build, -build-setup, -code-gen, -pre-compile">
+ <do-only-if-manifest-hasCode elseText="hasCode = false. Skipping...">
+ <!-- merge the project's own classpath and the tested project's classpath -->
+ <path id="project.javac.classpath">
+ <path refid="project.all.jars.path" />
+ <path refid="tested.project.classpath" />
+ <path path="${java.compiler.classpath}" />
+ </path>
+ <javac encoding="${java.encoding}"
+ source="${java.source}" target="${java.target}"
+ debug="true" extdirs="" includeantruntime="false"
+ destdir="${out.classes.absolute.dir}"
+ bootclasspathref="project.target.class.path"
+ verbose="${verbose}"
+ classpathref="project.javac.classpath"
+ fork="${need.javac.fork}">
+ <src path="${source.absolute.dir}" />
+ <src path="${gen.absolute.dir}" />
+ <compilerarg line="${java.compilerargs}" />
+ </javac>
+
+ <!-- if the project is instrumented, intrument the classes -->
+ <if condition="${build.is.instrumented}">
+ <then>
+ <echo level="info">Instrumenting classes from ${out.absolute.dir}/classes...</echo>
+
+ <!-- build the filter to remove R, Manifest, BuildConfig -->
+ <getemmafilter
+ appPackage="${project.app.package}"
+ libraryPackagesRefId="project.library.packages"
+ filterOut="emma.default.filter"/>
+
+ <!-- define where the .em file is going. This may have been
+ setup already if this is a library -->
+ <property name="emma.coverage.absolute.file" location="${out.absolute.dir}/coverage.em" />
+
+ <!-- It only instruments class files, not any external libs -->
+ <emma enabled="true">
+ <instr verbosity="${verbosity}"
+ mode="overwrite"
+ instrpath="${out.absolute.dir}/classes"
+ outdir="${out.absolute.dir}/classes"
+ metadatafile="${emma.coverage.absolute.file}">
+ <filter excludes="${emma.default.filter}" />
+ <filter value="${emma.filter}" />
+ </instr>
+ </emma>
+ </then>
+ </if>
+
+ <!-- if the project is a library then we generate a jar file -->
+ <if condition="${project.is.library}">
+ <then>
+ <echo level="info">Creating library output jar file...</echo>
+ <property name="out.library.jar.file" location="${out.absolute.dir}/classes.jar" />
+ <if>
+ <condition>
+ <length string="${android.package.excludes}" trim="true" when="greater" length="0" />
+ </condition>
+ <then>
+ <echo level="info">Custom jar packaging exclusion: ${android.package.excludes}</echo>
+ </then>
+ </if>
+
+ <propertybyreplace name="project.app.package.path" input="${project.app.package}" replace="." with="/" />
+
+ <jar destfile="${out.library.jar.file}">
+ <fileset dir="${out.classes.absolute.dir}"
+ includes="**/*.class"
+ excludes="${project.app.package.path}/R.class ${project.app.package.path}/R$*.class ${project.app.package.path}/BuildConfig.class"/>
+ <fileset dir="${source.absolute.dir}" excludes="**/*.java ${android.package.excludes}" />
+ </jar>
+ </then>
+ </if>
+
+ </do-only-if-manifest-hasCode>
+ </target>
+
+ <!-- empty default post-compile target. Create a similar target in
+ your build.xml and it'll be called instead of this one. -->
+ <target name="-post-compile"/>
+
+ <!-- Obfuscate target
+ This is only active in release builds when proguard.config is defined
+ in default.properties.
+
+ To replace Proguard with a different obfuscation engine:
+ Override the following targets in your build.xml, before the call to <setup>
+ -release-obfuscation-check
+ Check whether obfuscation should happen, and put the result in a property.
+ -debug-obfuscation-check
+ Obfuscation should not happen. Set the same property to false.
+ -obfuscate
+ check if the property set in -debug/release-obfuscation-check is set to true.
+ If true:
+ Perform obfuscation
+ Set property out.dex.input.absolute.dir to be the output of the obfuscation
+ -->
+ <target name="-obfuscate">
+ <if condition="${proguard.enabled}">
+ <then>
+ <property name="obfuscate.absolute.dir" location="${out.absolute.dir}/proguard" />
+ <property name="preobfuscate.jar.file" value="${obfuscate.absolute.dir}/original.jar" />
+ <property name="obfuscated.jar.file" value="${obfuscate.absolute.dir}/obfuscated.jar" />
+ <!-- input for dex will be proguard's output -->
+ <property name="out.dex.input.absolute.dir" value="${obfuscated.jar.file}" />
+
+ <!-- Add Proguard Tasks -->
+ <property name="proguard.jar" location="${android.tools.dir}/proguard/lib/proguard.jar" />
+ <taskdef name="proguard" classname="proguard.ant.ProGuardTask" classpath="${proguard.jar}" />
+
+ <!-- Set the android classpath Path object into a single property. It'll be
+ all the jar files separated by a platform path-separator.
+ Each path must be quoted if it contains spaces.
+ -->
+ <pathconvert property="project.target.classpath.value" refid="project.target.class.path">
+ <firstmatchmapper>
+ <regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"'/>
+ <identitymapper/>
+ </firstmatchmapper>
+ </pathconvert>
+
+ <!-- Build a path object with all the jar files that must be obfuscated.
+ This include the project compiled source code and any 3rd party jar
+ files. -->
+ <path id="project.all.classes.path">
+ <pathelement location="${preobfuscate.jar.file}" />
+ <path refid="project.all.jars.path" />
+ </path>
+ <!-- Set the project jar files Path object into a single property. It'll be
+ all the jar files separated by a platform path-separator.
+ Each path must be quoted if it contains spaces.
+ -->
+ <pathconvert property="project.all.classes.value" refid="project.all.classes.path">
+ <firstmatchmapper>
+ <regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"'/>
+ <identitymapper/>
+ </firstmatchmapper>
+ </pathconvert>
+
+ <!-- Turn the path property ${proguard.config} from an A:B:C property
+ into a series of includes: -include A -include B -include C
+ suitable for processing by the ProGuard task. Note - this does
+ not include the leading '-include "' or the closing '"'; those
+ are added under the <proguard> call below.
+ -->
+ <path id="proguard.configpath">
+ <pathelement path="${proguard.config}"/>
+ </path>
+ <pathconvert pathsep='" -include "' property="proguard.configcmd" refid="proguard.configpath"/>
+
+ <mkdir dir="${obfuscate.absolute.dir}" />
+ <delete file="${preobfuscate.jar.file}"/>
+ <delete file="${obfuscated.jar.file}"/>
+ <jar basedir="${out.classes.absolute.dir}"
+ destfile="${preobfuscate.jar.file}" />
+ <proguard>
+ -include "${proguard.configcmd}"
+ -include "${out.absolute.dir}/proguard.txt"
+ -injars ${project.all.classes.value}
+ -outjars "${obfuscated.jar.file}"
+ -libraryjars ${project.target.classpath.value}
+ -dump "${obfuscate.absolute.dir}/dump.txt"
+ -printseeds "${obfuscate.absolute.dir}/seeds.txt"
+ -printusage "${obfuscate.absolute.dir}/usage.txt"
+ -printmapping "${obfuscate.absolute.dir}/mapping.txt"
+ </proguard>
+ </then>
+ </if>
+ </target>
+
+ <!-- Converts this project's .class files into .dex files -->
+ <target name="-dex" depends="-compile, -post-compile, -obfuscate">
+ <do-only-if-manifest-hasCode elseText="hasCode = false. Skipping...">
+ <!-- only convert to dalvik bytecode is *not* a library -->
+ <do-only-if-not-library elseText="Library project: do not convert bytecode..." >
+ <!-- special case for instrumented builds: need to use no-locals and need
+ to pass in the emma jar. -->
+ <if condition="${build.is.instrumented}">
+ <then>
+ <dex-helper nolocals="true">
+ <external-libs>
+ <fileset file="${emma.dir}/emma_device.jar" />
+ </external-libs>
+ </dex-helper>
+ </then>
+ <else>
+ <dex-helper />
+ </else>
+ </if>
+ </do-only-if-not-library>
+ </do-only-if-manifest-hasCode>
+ </target>
+
+<!-- Updates the pre-processed PNG cache -->
+ <target name="-crunch">
+ <exec executable="${aapt}" taskName="crunch">
+ <arg value="crunch" />
+ <arg value="-v" />
+ <arg value="-S" />
+ <arg path="${resource.absolute.dir}" />
+ <arg value="-C" />
+ <arg path="${out.res.absolute.dir}" />
+ </exec>
+ </target>
+
+ <!-- Puts the project's resources into the output package file
+ This actually can create multiple resource package in case
+ Some custom apk with specific configuration have been
+ declared in default.properties.
+ -->
+ <target name="-package-resources" depends="-crunch">
+ <!-- only package resources if *not* a library project -->
+ <do-only-if-not-library elseText="Library project: do not package resources..." >
+ <aapt executable="${aapt}"
+ command="package"
+ versioncode="${version.code}"
+ versionname="${version.name}"
+ debug="${build.is.packaging.debug}"
+ manifest="${out.manifest.abs.file}"
+ assets="${asset.absolute.dir}"
+ androidjar="${project.target.android.jar}"
+ apkfolder="${out.absolute.dir}"
+ nocrunch="${build.packaging.nocrunch}"
+ resourcefilename="${resource.package.file.name}"
+ resourcefilter="${aapt.resource.filter}"
+ libraryResFolderPathRefid="project.library.res.folder.path"
+ libraryPackagesRefid="project.library.packages"
+ libraryRFileRefid="project.library.bin.r.file.path"
+ previousBuildType="${build.last.target}"
+ buildType="${build.target}"
+ ignoreAssets="${aapt.ignore.assets}">
+ <res path="${out.res.absolute.dir}" />
+ <res path="${resource.absolute.dir}" />
+ <!-- <nocompress /> forces no compression on any files in assets or res/raw -->
+ <!-- <nocompress extension="xml" /> forces no compression on specific file extensions in assets and res/raw -->
+ </aapt>
+ </do-only-if-not-library>
+ </target>
+
+ <!-- Packages the application. -->
+ <target name="-package" depends="-dex, -package-resources">
+ <!-- only package apk if *not* a library project -->
+ <do-only-if-not-library elseText="Library project: do not package apk..." >
+ <if condition="${build.is.instrumented}">
+ <then>
+ <package-helper>
+ <extra-jars>
+ <!-- Injected from external file -->
+ <jarfile path="${emma.dir}/emma_device.jar" />
+ </extra-jars>
+ </package-helper>
+ </then>
+ <else>
+ <package-helper />
+ </else>
+ </if>
+ </do-only-if-not-library>
+ </target>
+
+ <target name="-post-package" />
+ <target name="-post-build" />
+
+ <target name="-set-mode-check">
+ <fail if="build.is.mode.set"
+ message="Cannot run two different modes at the same time. If you are running more than one debug/release/instrument type targets, call them from different Ant calls." />
+ </target>
+
+ <!-- ******************************************************* -->
+ <!-- **************** Debug specific targets *************** -->
+ <!-- ******************************************************* -->
+
+ <target name="-set-debug-files" depends="-set-mode-check">
+
+ <property name="out.packaged.file" location="${out.absolute.dir}/${ant.project.name}-debug-unaligned.apk" />
+ <property name="out.final.file" location="${out.absolute.dir}/${ant.project.name}-debug.apk" />
+ <property name="build.is.mode.set" value="true" />
+ </target>
+
+
+ <target name="-set-debug-mode" depends="-setup">
+ <!-- record the current build target -->
+ <property name="build.target" value="debug" />
+
+ <if>
+ <condition>
+ <and>
+ <istrue value="${project.is.testapp}" />
+ <istrue value="${emma.enabled}" />
+ </and>
+ </condition>
+ <then>
+ <property name="build.is.instrumented" value="true" />
+ </then>
+ <else>
+ <property name="build.is.instrumented" value="false" />
+ </else>
+ </if>
+
+ <!-- whether the build is a debug build. always set. -->
+ <property name="build.is.packaging.debug" value="true" />
+
+ <!-- signing mode: debug -->
+ <property name="build.is.signing.debug" value="true" />
+
+ <!-- Renderscript optimization level: none -->
+ <property name="renderscript.opt.level" value="${renderscript.debug.opt.level}" />
+
+ </target>
+
+ <target name="-debug-obfuscation-check">
+ <!-- proguard is never enabled in debug mode -->
+ <property name="proguard.enabled" value="false"/>
+ </target>
+
+ <!-- Builds debug output package -->
+ <target name="-do-debug" depends="-set-debug-mode, -debug-obfuscation-check, -package, -post-package">
+ <!-- only create apk if *not* a library project -->
+ <do-only-if-not-library elseText="Library project: do not create apk..." >
+ <sequential>
+ <zipalign-helper in.package="${out.packaged.file}" out.package="${out.final.file}" />
+ <echo level="info">Debug Package: ${out.final.file}</echo>
+ </sequential>
+ </do-only-if-not-library>
+ <record-build-info />
+ </target>
+
+ <!-- Builds debug output package -->
+ <target name="debug" depends="-set-debug-files, -do-debug, -post-build"
+ description="Builds the application and signs it with a debug key.">
+ </target>
+
+
+ <!-- ******************************************************* -->
+ <!-- *************** Release specific targets ************** -->
+ <!-- ******************************************************* -->
+
+ <!-- called through target 'release'. Only executed if the keystore and
+ key alias are known but not their password. -->
+ <target name="-release-prompt-for-password" if="has.keystore" unless="has.password">
+ <!-- Gets passwords -->
+ <input
+ message="Please enter keystore password (store:${key.store}):"
+ addproperty="key.store.password" />
+ <input
+ message="Please enter password for alias '${key.alias}':"
+ addproperty="key.alias.password" />
+ </target>
+
+ <!-- called through target 'release'. Only executed if there's no
+ keystore/key alias set -->
+ <target name="-release-nosign" unless="has.keystore">
+ <!-- no release builds for library project -->
+ <do-only-if-not-library elseText="" >
+ <sequential>
+ <echo level="info">No key.store and key.alias properties found in build.properties.</echo>
+ <echo level="info">Please sign ${out.packaged.file} manually</echo>
+ <echo level="info">and run zipalign from the Android SDK tools.</echo>
+ </sequential>
+ </do-only-if-not-library>
+ <record-build-info />
+ </target>
+
+ <target name="-release-obfuscation-check">
+ <echo level="info">proguard.config is ${proguard.config}</echo>
+ <condition property="proguard.enabled" value="true" else="false">
+ <and>
+ <isset property="build.is.mode.release" />
+ <isset property="proguard.config" />
+ </and>
+ </condition>
+ <if condition="${proguard.enabled}">
+ <then>
+ <echo level="info">Proguard.config is enabled</echo>
+ <!-- Secondary dx input (jar files) is empty since all the
+ jar files will be in the obfuscated jar -->
+ <path id="out.dex.jar.input.ref" />
+ </then>
+ </if>
+ </target>
+
+ <target name="-set-release-mode" depends="-set-mode-check">
+ <property name="out.packaged.file" location="${out.absolute.dir}/${ant.project.name}-release-unsigned.apk" />
+ <property name="out.final.file" location="${out.absolute.dir}/${ant.project.name}-release.apk" />
+ <property name="build.is.mode.set" value="true" />
+
+ <!-- record the current build target -->
+ <property name="build.target" value="release" />
+
+ <property name="build.is.instrumented" value="false" />
+
+ <!-- release mode is only valid if the manifest does not explicitly
+ set debuggable to true. default is false. -->
+ <xpath input="${manifest.abs.file}" expression="/manifest/application/@android:debuggable"
+ output="build.is.packaging.debug" default="false"/>
+
+ <!-- signing mode: release -->
+ <property name="build.is.signing.debug" value="false" />
+
+ <!-- Renderscript optimization level: aggressive -->
+ <property name="renderscript.opt.level" value="${renderscript.release.opt.level}" />
+
+ <if condition="${build.is.packaging.debug}">
+ <then>
+ <echo>*************************************************</echo>
+ <echo>**** Android Manifest has debuggable=true ****</echo>
+ <echo>**** Doing DEBUG packaging with RELEASE keys ****</echo>
+ <echo>*************************************************</echo>
+ </then>
+ <else>
+ <!-- property only set in release mode.
+ Useful for if/unless attributes in target node
+ when using Ant before 1.8 -->
+ <property name="build.is.mode.release" value="true"/>
+ </else>
+ </if>
+ </target>
+
+ <target name="-release-sign" if="has.keystore" >
+ <!-- only create apk if *not* a library project -->
+ <do-only-if-not-library elseText="Library project: do not create apk..." >
+ <sequential>
+ <property name="out.unaligned.file" location="${out.absolute.dir}/${ant.project.name}-release-unaligned.apk" />
+
+ <!-- Signs the APK -->
+ <echo level="info">Signing final apk...</echo>
+ <signapk
+ input="${out.packaged.file}"
+ output="${out.unaligned.file}"
+ keystore="${key.store}"
+ storepass="${key.store.password}"
+ alias="${key.alias}"
+ keypass="${key.alias.password}"/>
+
+ <!-- Zip aligns the APK -->
+ <zipalign-helper
+ in.package="${out.unaligned.file}"
+ out.package="${out.final.file}" />
+ <echo level="info">Release Package: ${out.final.file}</echo>
+ </sequential>
+ </do-only-if-not-library>
+ <record-build-info />
+ </target>
+
+ <!-- This runs -package-release and -release-nosign first and then runs
+ only if release-sign is true (set in -release-check,
+ called by -release-no-sign)-->
+ <target name="release"
+ depends="-set-release-mode, -release-obfuscation-check, -package, -post-package, -release-prompt-for-password, -release-nosign, -release-sign, -post-build"
+ description="Builds the application in release mode.">
+ </target>
+
+ <!-- ******************************************************* -->
+ <!-- ************ Instrumented specific targets ************ -->
+ <!-- ******************************************************* -->
+
+ <!-- These targets are specific for the project under test when it
+ gets compiled by the test projects in a way that will make it
+ support emma code coverage -->
+
+ <target name="-set-instrumented-mode" depends="-set-mode-check">
+ <property name="out.packaged.file" location="${out.absolute.dir}/${ant.project.name}-instrumented-unaligned.apk" />
+ <property name="out.final.file" location="${out.absolute.dir}/${ant.project.name}-instrumented.apk" />
+ <property name="build.is.mode.set" value="true" />
+
+ <!-- whether the build is an instrumented build. -->
+ <property name="build.is.instrumented" value="true" />
+ </target>
+
+ <!-- Builds instrumented output package -->
+ <target name="instrument" depends="-set-instrumented-mode, -do-debug"
+ description="Builds an instrumented packaged.">
+ <!-- only create apk if *not* a library project -->
+ <do-only-if-not-library elseText="Library project: do not create apk..." >
+ <sequential>
+ <zipalign-helper in.package="${out.packaged.file}" out.package="${out.final.file}" />
+ <echo level="info">Instrumented Package: ${out.final.file}</echo>
+ </sequential>
+ </do-only-if-not-library>
+ <record-build-info />
+ </target>
+
+ <!-- ******************************************************* -->
+ <!-- ************ Test project specific targets ************ -->
+ <!-- ******************************************************* -->
+
+ <!-- enable code coverage -->
+ <target name="emma">
+ <property name="emma.enabled" value="true" />
+ </target>
+
+ <!-- fails if the project is not a test project -->
+ <target name="-test-project-check" depends="-setup">
+ <if>
+ <condition>
+ <and>
+ <isfalse value="${project.is.test}" />
+ <isfalse value="${project.is.testapp}" />
+ </and>
+ </condition>
+ <then>
+ <fail message="Project is not a test project." />
+ </then>
+ </if>
+ </target>
+
+ <target name="test" depends="-test-project-check"
+ description="Runs tests from the package defined in test.package property">
+ <property name="test.runner" value="android.test.InstrumentationTestRunner" />
+
+ <if condition="${project.is.test}">
+ <then>
+ <property name="tested.project.absolute.dir" location="${tested.project.dir}" />
+
+ <!-- Application package of the tested project extracted from its manifest file -->
+ <xpath input="${tested.project.absolute.dir}/AndroidManifest.xml"
+ expression="/manifest/@package" output="tested.project.app.package" />
+
+ <if condition="${emma.enabled}">
+ <then>
+ <getprojectpaths projectPath="${tested.project.absolute.dir}"
+ binOut="tested.project.out.absolute.dir"
+ srcOut="tested.project.source.absolute.dir" />
+
+ <getlibpath projectPath="${tested.project.absolute.dir}"
+ libraryFolderPathOut="tested.project.lib.source.path"
+ leaf="@{source.dir}" />
+
+ </then>
+ </if>
+
+ </then>
+ <else>
+ <!-- this is a test app, the tested package is the app's own package -->
+ <property name="tested.project.app.package" value="${project.app.package}" />
+
+ <if condition="${emma.enabled}">
+ <then>
+ <property name="tested.project.out.absolute.dir" value="${out.absolute.dir}" />
+ <property name="tested.project.source.absolute.dir" value="${source.absolute.dir}" />
+
+ <getlibpath
+ libraryFolderPathOut="tested.project.lib.source.path"
+ leaf="@{source.dir}" />
+
+ </then>
+ </if>
+
+ </else>
+ </if>
+
+ <property name="emma.dump.file"
+ value="/data/data/${tested.project.app.package}/coverage.ec" />
+
+ <if condition="${emma.enabled}">
+ <then>
+ <echo>Running tests...</echo>
+ <run-tests-helper emma.enabled="true">
+ <extra-instrument-args>
+ <arg value="-e" />
+ <arg value="coverageFile" />
+ <arg value="${emma.dump.file}" />
+ </extra-instrument-args>
+ </run-tests-helper>
+
+ <echo level="info">Setting permission to download the coverage file...</echo>
+ <exec executable="${adb}" failonerror="true">
+ <arg line="${adb.device.arg}" />
+ <arg value="shell" />
+ <arg value="run-as" />
+ <arg value="${tested.project.app.package}" />
+ <arg value="chmod" />
+ <arg value="644" />
+ <arg value="${emma.dump.file}" />
+ </exec>
+ <echo level="info">Downloading coverage file into project directory...</echo>
+ <exec executable="${adb}" failonerror="true">
+ <arg line="${adb.device.arg}" />
+ <arg value="pull" />
+ <arg value="${emma.dump.file}" />
+ <arg path="${out.absolute.dir}/coverage.ec" />
+ </exec>
+
+ <pathconvert property="tested.project.lib.source.path.value" refid="tested.project.lib.source.path">
+ <firstmatchmapper>
+ <regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"'/>
+ <identitymapper/>
+ </firstmatchmapper>
+ </pathconvert>
+
+ <echo level="info">Extracting coverage report...</echo>
+ <emma>
+ <property name="report.html.out.encoding" value="UTF-8" />
+ <report sourcepath="${tested.project.source.absolute.dir}:${tested.project.lib.source.path.value}"
+ verbosity="${verbosity}">
+ <!-- TODO: report.dir or something like should be introduced if necessary -->
+ <infileset file="${out.absolute.dir}/coverage.ec" />
+ <infileset file="${tested.project.out.absolute.dir}/coverage.em" />
+ <!-- TODO: reports in other, indicated by user formats -->
+ <html outfile="${out.absolute.dir}/coverage.html" />
+ <txt outfile="${out.absolute.dir}/coverage.txt" />
+ <xml outfile="${out.absolute.dir}/coverage.xml" />
+ </report>
+ </emma>
+ <echo level="info">Cleaning up temporary files...</echo>
+ <delete file="${out.absolute.dir}/coverage.ec" />
+ <delete file="${tested.project.out.absolute.dir}/coverage.em" />
+ <exec executable="${adb}" failonerror="true">
+ <arg line="${adb.device.arg}" />
+ <arg value="shell" />
+ <arg value="run-as" />
+ <arg value="${tested.project.app.package}" />
+ <arg value="rm" />
+ <arg value="${emma.dump.file}" />
+ </exec>
+ <echo level="info">Saving the coverage reports in ${out.absolute.dir}</echo>
+ </then>
+ <else>
+ <run-tests-helper />
+ </else>
+ </if>
+ </target>
+
+ <!-- ******************************************************* -->
+ <!-- ********** Run Lint on the project ********* -->
+ <!-- ******************************************************* -->
+
+ <target name="lint"
+ description="Runs lint on the project to look for potential bugs" >
+ <lint executable="${lint}"
+ html="${lint.out.html}"
+ xml="${lint.out.xml}"
+ src="${source.absolute.dir}:${gen.absolute.dir}"
+ classpath="${out.classes.absolute.dir}" />
+ </target>
+
+ <!-- ******************************************************* -->
+ <!-- ********** Install/uninstall specific targets ********* -->
+ <!-- ******************************************************* -->
+
+ <target name="install"
+ description="Installs the newly build package. Must be used in conjunction with a build target
+ (debug/release/instrument). If the application was previously installed, the application
+ is reinstalled if the signature matches." >
+ <!-- only do install if *not* a library project -->
+ <do-only-if-not-library elseText="Library project: nothing to install!" >
+ <if>
+ <condition>
+ <isset property="out.final.file" />
+ </condition>
+ <then>
+ <if>
+ <condition>
+ <resourceexists>
+ <file file="${out.final.file}"/>
+ </resourceexists>
+ </condition>
+ <then>
+ <echo level="info">Installing ${out.final.file} onto default emulator or device...</echo>
+ <exec executable="${adb}" failonerror="true">
+ <arg line="${adb.device.arg}" />
+ <arg value="install" />
+ <arg value="-r" />
+ <arg path="${out.final.file}" />
+ </exec>
+
+ <!-- now install the tested project if applicable -->
+ <!-- can't use project.is.test since the setup target might not have run -->
+ <if>
+ <condition>
+ <and>
+ <isset property="tested.project.dir" />
+ <not>
+ <isset property="dont.do.deps" />
+ </not>
+ </and>
+ </condition>
+ <then>
+ <property name="tested.project.absolute.dir" location="${tested.project.dir}" />
+
+ <!-- figure out which tested package to install based on emma.enabled -->
+ <condition property="tested.project.install.target" value="installi" else="installd">
+ <isset property="emma.enabled" />
+ </condition>
+ <subant target="${tested.project.install.target}" failonerror="true">
+ <fileset dir="${tested.project.absolute.dir}" includes="build.xml" />
+ </subant>
+ </then>
+ </if>
+ </then>
+ <else>
+ <fail message="File ${out.final.file} does not exist." />
+ </else>
+ </if>
+ </then>
+ <else>
+ <echo>Install file not specified.</echo>
+ <echo></echo>
+ <echo>'ant install' now requires the build target to be specified as well.</echo>
+ <echo></echo>
+ <echo></echo>
+ <echo> ant debug install</echo>
+ <echo> ant release install</echo>
+ <echo> ant instrument install</echo>
+ <echo>This will build the given package and install it.</echo>
+ <echo></echo>
+ <echo>Alternatively, you can use</echo>
+ <echo> ant installd</echo>
+ <echo> ant installr</echo>
+ <echo> ant installi</echo>
+ <echo> ant installt</echo>
+ <echo>to only install an existing package (this will not rebuild the package.)</echo>
+ <fail />
+ </else>
+ </if>
+ </do-only-if-not-library>
+ </target>
+
+ <target name="installd" depends="-set-debug-files, install"
+ description="Installs (only) the debug package." />
+ <target name="installr" depends="-set-release-mode, install"
+ description="Installs (only) the release package." />
+ <target name="installi" depends="-set-instrumented-mode, install"
+ description="Installs (only) the instrumented package." />
+ <target name="installt" depends="-test-project-check, installd"
+ description="Installs (only) the test and tested packages." />
+
+
+ <!-- Uninstalls the package from the default emulator/device -->
+ <target name="uninstall" depends="-setup"
+ description="Uninstalls the application from a running emulator or device.">
+ <if>
+ <condition>
+ <isset property="project.app.package" />
+ </condition>
+ <then>
+ <uninstall-helper app.package="${project.app.package}" />
+ </then>
+ <else>
+ <fail message="Could not find application package in manifest. Cannot run 'adb uninstall'." />
+ </else>
+ </if>
+
+ <!-- Now uninstall the tested project, if applicable -->
+ <if>
+ <condition>
+ <and>
+ <istrue value="${project.is.test}" />
+ <not>
+ <isset property="dont.do.deps" />
+ </not>
+ </and>
+ </condition>
+ <then>
+ <property name="tested.project.absolute.dir" location="${tested.project.dir}" />
+
+ <!-- Application package of the tested project extracted from its manifest file -->
+ <xpath input="${tested.project.absolute.dir}/AndroidManifest.xml"
+ expression="/manifest/@package" output="tested.project.app.package" />
+ <if>
+ <condition>
+ <isset property="tested.project.app.package" />
+ </condition>
+ <then>
+ <uninstall-helper app.package="${tested.project.app.package}" />
+ </then>
+ <else>
+ <fail message="Could not find tested application package in manifest. Cannot run 'adb uninstall'." />
+ </else>
+ </if>
+ </then>
+ </if>
+
+ </target>
+
+
+ <!-- ******************************************************* -->
+ <!-- ************************* Help ************************ -->
+ <!-- ******************************************************* -->
+
+ <target name="help">
+ <!-- displays starts at col 13
+ |13 80| -->
+ <echo>Android Ant Build. Available targets:</echo>
+ <echo> help: Displays this help.</echo>
+ <echo> clean: Removes output files created by other targets.</echo>
+ <echo> This calls the same target on all dependent projects.</echo>
+ <echo> Use 'ant nodeps clean' to only clean the local project</echo>
+ <echo> debug: Builds the application and signs it with a debug key.</echo>
+ <echo> The 'nodeps' target can be used to only build the</echo>
+ <echo> current project and ignore the libraries using:</echo>
+ <echo> 'ant nodeps debug'</echo>
+ <echo> release: Builds the application. The generated apk file must be</echo>
+ <echo> signed before it is published.</echo>
+ <echo> The 'nodeps' target can be used to only build the</echo>
+ <echo> current project and ignore the libraries using:</echo>
+ <echo> 'ant nodeps release'</echo>
+ <echo> instrument:Builds an instrumented package and signs it with a</echo>
+ <echo> debug key.</echo>
+ <echo> test: Runs the tests. Project must be a test project and</echo>
+ <echo> must have been built. Typical usage would be:</echo>
+ <echo> ant [emma] debug install test</echo>
+ <echo> emma: Transiently enables code coverage for subsequent</echo>
+ <echo> targets.</echo>
+ <echo> install: Installs the newly build package. Must either be used</echo>
+ <echo> in conjunction with a build target (debug/release/</echo>
+ <echo> instrument) or with the proper suffix indicating</echo>
+ <echo> which package to install (see below).</echo>
+ <echo> If the application was previously installed, the</echo>
+ <echo> application is reinstalled if the signature matches.</echo>
+ <echo> installd: Installs (only) the debug package.</echo>
+ <echo> installr: Installs (only) the release package.</echo>
+ <echo> installi: Installs (only) the instrumented package.</echo>
+ <echo> installt: Installs (only) the test and tested packages (unless</echo>
+ <echo> nodeps is used as well.</echo>
+ <echo> uninstall: Uninstalls the application from a running emulator or</echo>
+ <echo> device. Also uninstall tested package if applicable</echo>
+ <echo> unless 'nodeps' is used as well.</echo>
+ </target>
+</project>
diff --git a/love2dToAPK/tools/tools/android-win/tools/ant/uibuild.xml b/love2dToAPK/tools/tools/android-win/tools/ant/uibuild.xml
new file mode 100644
index 0000000..788ca77
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/ant/uibuild.xml
@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="android_rules" default="debug">
+
+ <!--
+ This build file is imported by the project build file. It contains
+ all the targets and tasks necessary to build Android projects, be they
+ regular projects, library projects, or test projects.
+
+ At the beginning of the file is a list of properties that can be overridden
+ by adding them to your ant.properties (properties are immutable, so their
+ first definition sticks and is never changed).
+
+ Follows:
+ - custom task definitions,
+ - more properties (do not override those unless the whole build system is modified).
+ - macros used throughout the build,
+ - base build targets,
+ - debug-specific build targets,
+ - release-specific build targets,
+ - instrument-specific build targets,
+ - test project-specific build targets,
+ - install targets,
+ - help target
+ -->
+
+ <!-- ******************************************************* -->
+ <!-- **************** Overridable Properties *************** -->
+ <!-- ******************************************************* -->
+
+ <!-- You can override these values in your build.xml or ant.properties.
+ Overriding any other properties may result in broken build. -->
+
+ <!-- Tells adb which device to target. You can change this from the command line
+ by invoking "ant -Dadb.device.arg=-d" for device "ant -Dadb.device.arg=-e" for
+ the emulator. -->
+ <property name="adb.device.arg" value="" />
+
+ <!-- filename only of the output file. Cannot be a path -->
+ <property name="out.filename" value="${ant.project.name}.jar" />
+
+ <!-- compilation options -->
+ <property name="java.encoding" value="UTF-8" />
+ <property name="java.target" value="1.5" />
+ <property name="java.source" value="1.5" />
+ <property name="java.compilerargs" value="" />
+
+ <!-- Verbosity -->
+ <property name="verbose" value="false" />
+
+ <!-- ******************************************************* -->
+ <!-- ********************* Custom Tasks ******************** -->
+ <!-- ******************************************************* -->
+
+ <!-- jar file from where the tasks are loaded -->
+ <path id="android.antlibs">
+ <pathelement path="${sdk.dir}/tools/lib/ant-tasks.jar" />
+ </path>
+
+ <!-- Custom tasks -->
+ <taskdef resource="anttasks.properties" classpathref="android.antlibs" />
+
+ <!-- Emma configuration -->
+ <property name="emma.dir" value="${sdk.dir}/tools/lib" />
+ <path id="emma.lib">
+ <pathelement location="${emma.dir}/emma.jar" />
+ <pathelement location="${emma.dir}/emma_ant.jar" />
+ </path>
+ <taskdef resource="emma_ant.properties" classpathref="emma.lib" />
+ <!-- End of emma configuration -->
+
+
+ <!-- ******************************************************* -->
+ <!-- ******************* Other Properties ****************** -->
+ <!-- ******************************************************* -->
+ <!-- overriding these properties may break the build
+ unless the whole file is updated -->
+
+ <!-- Input directories -->
+ <property name="source.dir" value="src" />
+ <property name="source.absolute.dir" location="${source.dir}" />
+ <property name="jar.libs.dir" value="libs" />
+ <property name="jar.libs.absolute.dir" location="${jar.libs.dir}" />
+
+ <!-- Output directories -->
+ <property name="out.dir" value="bin" />
+ <property name="out.absolute.dir" location="${out.dir}" />
+ <property name="out.classes.absolute.dir" location="${out.dir}/classes" />
+
+ <property name="out.file" value="${out.absolute.dir}/${out.filename}" />
+
+ <!-- tools location -->
+ <property name="android.tools.dir" location="${sdk.dir}/tools" />
+ <property name="android.platform.tools.dir" location="${sdk.dir}/platform-tools" />
+ <condition property="exe" value=".exe" else=""><os family="windows" /></condition>
+ <condition property="bat" value=".bat" else=""><os family="windows" /></condition>
+ <property name="adb" location="${android.platform.tools.dir}/adb${exe}" />
+
+ <!-- Intermediate files -->
+ <property name="dex.file.name" value="classes.dex" />
+ <property name="intermediate.dex.file" location="${out.absolute.dir}/${dex.file.name}" />
+ <property name="resource.package.file.name" value="${ant.project.name}.ap_" />
+
+ <!-- whether we need to fork javac.
+ This is only needed on Windows when running Java < 7 -->
+ <condition else="false" property="need.javac.fork">
+ <and>
+ <matches pattern="1\.[56]" string="${java.specification.version}"/>
+ <not>
+ <os family="unix"/>
+ </not>
+ </and>
+ </condition>
+
+ <macrodef name="run-tests-helper">
+ <attribute name="emma.enabled" default="false" />
+ <element name="extra-instrument-args" optional="yes" />
+ <sequential>
+ <echo level="info">Running tests ...</echo>
+ <exec executable="${adb}" failonerror="true">
+ <arg line="${adb.device.arg}" />
+ <arg value="shell" />
+ <arg value="am" />
+ <arg value="instrument" />
+ <arg value="-w" />
+ <arg value="-e" />
+ <arg value="coverage" />
+ <arg value="@{emma.enabled}" />
+ <extra-instrument-args />
+ <arg value="${project.app.package}/${test.runner}" />
+ </exec>
+ </sequential>
+ </macrodef>
+
+ <!-- ******************************************************* -->
+ <!-- ******************** Build Targets ******************** -->
+ <!-- ******************************************************* -->
+
+ <!-- Basic Ant + SDK check -->
+ <target name="-check-env">
+ <checkenv />
+ </target>
+
+ <!-- empty default pre-clean target. Create a similar target in
+ your build.xml and it'll be called instead of this one. -->
+ <target name="-pre-clean"/>
+
+ <!-- clean target -->
+ <target name="clean" depends="-check-env, -pre-clean"
+ description="Removes output files created by other targets.">
+ <delete dir="${out.absolute.dir}" verbose="${verbose}" />
+ </target>
+
+ <!-- Pre build setup -->
+ <target name="-build-setup" depends="-check-env">
+ <getbuildtools name="android.build.tools.dir" />
+ <property name="dx" location="${android.build.tools.dir}/dx${bat}" />
+
+ <echo level="info">Resolving Build Target for ${ant.project.name}...</echo>
+ <!-- load project properties, resolve Android target, library dependencies
+ and set some properties with the results.
+ All property names are passed as parameters ending in -Out -->
+ <getuitarget compileClassPathOut="project.target.class.path" />
+
+ <echo level="info">----------</echo>
+ <echo level="info">Creating output directories if needed...</echo>
+ <mkdir dir="${out.absolute.dir}" />
+ <mkdir dir="${out.classes.absolute.dir}" />
+
+ </target>
+
+ <!-- empty default pre-compile target. Create a similar target in
+ your build.xml and it'll be called instead of this one. -->
+ <target name="-pre-compile"/>
+
+ <!-- Compiles this project's .java files into .class files. -->
+ <target name="compile" depends="-build-setup, -pre-compile">
+ <javac encoding="${java.encoding}"
+ source="${java.source}" target="${java.target}"
+ debug="true" extdirs="" includeantruntime="false"
+ destdir="${out.classes.absolute.dir}"
+ bootclasspathref="project.target.class.path"
+ verbose="${verbose}"
+ fork="${need.javac.fork}">
+ <src path="${source.absolute.dir}" />
+ <compilerarg line="${java.compilerargs}" />
+ </javac>
+ </target>
+
+ <!-- empty default post-compile target. Create a similar target in
+ your build.xml and it'll be called instead of this one. -->
+ <target name="-post-compile"/>
+
+ <!-- Converts this project's .class files into .dex files -->
+ <target name="-dex" depends="compile, -post-compile">
+ <dex executable="${dx}"
+ output="${intermediate.dex.file}"
+ nolocals="@{nolocals}"
+ verbose="${verbose}">
+ <path path="${out.classes.absolute.dir}"/>
+ </dex>
+ </target>
+
+ <!-- empty default post-dex target. Create a similar target in
+ your build.xml and it'll be called instead of this one. -->
+ <target name="-post-dex"/>
+
+ <target name="-jar" depends="-dex, -post-dex" >
+ <jar destfile="${out.file}">
+ <fileset file="${intermediate.dex.file}" />
+ </jar>
+ </target>
+
+ <!-- empty default post-jar target. Create a similar target in
+ your build.xml and it'll be called instead of this one. -->
+ <target name="-post-jar"/>
+
+ <target name="build" depends="-jar, -post-jar" />
+
+ <target name="install" description="Install the test package">
+ <exec executable="${adb}" failonerror="true">
+ <arg line="${adb.device.arg}" />
+ <arg value="push" />
+ <arg value="${out.file}" />
+ <arg value="/data/local/tmp" />
+ </exec>
+ </target>
+
+ <target name="test" description="Runs tests">
+ <!-- todo: fix this -->
+ <fail message="Launching tests from Ant not supported yet" />
+
+ <exec executable="${adb}" failonerror="true">
+ <arg line="${adb.device.arg}" />
+ <arg value="shell" />
+ <arg value="uiautomator" />
+ <arg value="runtest" />
+ <arg value="${out.filename}" />
+ <arg value="-e" />
+ <arg value="class" />
+ <arg value="com.android.uiautomator.samples.skeleton.DemoTestCase" />
+ </exec>
+ </target>
+
+ <target name="help">
+ <!-- displays starts at col 13
+ |13 80| -->
+ <echo>Android Ant Build. Available targets:</echo>
+ <echo> help: Displays this help.</echo>
+ <echo> clean: Removes output files created by other targets.</echo>
+ <echo> build: Builds the test library.</echo>
+ <echo> install: Installs the library on a connected device or</echo>
+ <echo> emulator.</echo>
+ <echo> test: Runs the tests.</echo>
+ <echo></echo>
+ <echo>It is possible to mix targets. For instance:</echo>
+ <echo> ant build install test</echo>
+ <echo>This will build, install and run the test in a single command.</echo>
+ </target>
+
+</project>
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/.classpath b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/.classpath
new file mode 100644
index 0000000..a4763d1
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="src" path="gen"/>
+ <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
+ <classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
+ <classpathentry kind="output" path="bin/classes"/>
+</classpath>
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/.project b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/.project
new file mode 100644
index 0000000..172daea
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>SdkControllerApp</name>
+ <comment></comment>
+ <projects>
+ <project>SdkControllerLib</project>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.android.ide.eclipse.adt.ApkBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>com.android.ide.eclipse.adt.AndroidNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/.settings/org.eclipse.jdt.core.prefs b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0d8eaac
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#Fri Apr 06 22:06:54 PDT 2012
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/AndroidManifest.xml b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/AndroidManifest.xml
new file mode 100644
index 0000000..df7aa47
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/AndroidManifest.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.tools.sdkcontroller"
+ android:versionCode="1"
+ android:versionName="1.0" >
+
+ <uses-sdk
+ android:minSdkVersion="7"
+ android:targetSdkVersion="15" />
+
+ <uses-permission android:name="android.permission.INTERNET" />
+
+ <application
+ android:icon="@drawable/ic_launcher"
+ android:label="@string/app_name" >
+
+ <activity
+ android:name=".activities.MainActivity"
+ android:label="@string/app_name"
+ android:launchMode="singleInstance" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+
+ <activity
+ android:name=".activities.SensorActivity"
+ android:launchMode="singleInstance"
+ android:windowSoftInputMode="stateUnchanged" android:label="@string/sensors_activity_title"/>
+
+ <activity
+ android:name=".activities.MultiTouchActivity"
+ android:launchMode="singleInstance"
+ android:screenOrientation="portrait"
+ android:theme="@style/Theme.MultiTouch"
+ android:windowSoftInputMode="stateHidden"/>
+
+ <service
+ android:name=".service.ControllerService"
+ android:description="@string/service_description"
+ android:icon="@drawable/ic_launcher" />
+ </application>
+</manifest>
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/Implementation.txt b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/Implementation.txt
new file mode 100644
index 0000000..f1ead49
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/Implementation.txt
@@ -0,0 +1,85 @@
+Implementation Details for SdkControllerApp
+-------------------------------------------
+
+---- 2012-03-22
+App is in the namespace com.android.tools.sdkcontroller.
+
+This is an app that has a minSdkVersion of 7 (Eclair)
+and a targetSdkVersion of 15 (ICS). The target version
+means the app is forbidden under ICS from doing any network
+communication on its main thread.
+
+The overall design:
+- A background service is started by the app. It handles the connection
+ to the emulator and provides a number of "handlers". Handlers can be
+ though as being separate tasks that the user wants to achieve, for example
+ sending sensor data, sending multi-touch events, receiving screen updates,
+ sending a camera feed, etc.
+- All the handlers are started when the service starts and shutdown with it.
+ They basically stay there as long as the app is running, and its up to the
+ handler to deal with emulator connections starts/stopping. Some handlers
+ will run in the background (e.g. sending sensor data) whereas other might
+ need an activity to connect to them first.
+- The app has a number of activities which connect to existing handlers.
+
+Another way to see it is that the app handles a number of tasks which are
+composed of a background handler (that consumes data form the emulator and
+can send data to the emulator) and an optional activity for UI (that displays
+or controls the handler's state.)
+
+
+Here's a quick overview of the classes in the application:
+
+
+The main UI is in activities.MainActivity.
+There are 2 tasks activities: SensorActivity and MultiTouchActivity.
+
+These all derive from BaseBindingActivity which provides a few convenient common features
+- in onResume this will bind to the service, creating and starting it if necessary.
+- in onPause, this will unbind from the service, but does not stop it.
+
+Note however that due to the asynchronous nature of the bind operation, the activity
+must not attempt to use the service from onResume. Instead there are 2 callbacks to use:
+- onServiceConnected when the bind succeeded.
+- onServiceDisconnected as the reverse operation.
+
+When the activity is connected to the service, it can then use getServiceBinder()
+to get an interface to talk to the service.
+
+In the other direction, the activity provides a listener for the service to notify
+the application: ControllerListener createControllerListener().
+
+The activity can then access the handler:
+ handler = getServiceBinder().getHandler(HandlerType....)
+
+and then the activity wants to provide a listener to get notified by the handler:
+ handler.addUiHandler(new android.os.Handler(this));
+
+The emulator connection is separated in the "lib" subpackage:
+- EmulatorConnection abstracts a connection to the emulator.
+ - Object is first created by giving a non-null EmulatorListener.
+ - then connect(port) is called to initiate the connection.
+ - The EmulatorConnection is always created in SYNC mode.
+- EmulatorListener is a callback: the emulator connection uses it to indicate
+ when the connection is actually connected or disconnected.
+
+In the end we have the following workflow describing who controls what (-->):
+
+
+ Emulator
+ ^ ^
+ | | EmuCnxHandler
+ sendEventToEmulator| | (EmulatorListener)
+ | +-------------+
+ | |
+ handlers.BaseHandler | v
+ Activity ------------------------> Handler <---- ControllerService
+ UI <------------------------ | ^
+ android.os.Handler | |
+ | ^ | |
+ | | ControllerListener | |
+ | +--------------------------------------------------+ |
+ +-----------------------------------------------------------+
+ ControllerBinder
+
+----
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/NOTICE b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/NOTICE
new file mode 100644
index 0000000..06a9081
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/NOTICE
@@ -0,0 +1,190 @@
+
+ Copyright (c) 2005-2014, The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+
+ 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.
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/assets/intro_help.html b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/assets/intro_help.html
new file mode 100644
index 0000000..d922a70
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/assets/intro_help.html
@@ -0,0 +1,42 @@
+<html>
+<!--
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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.
+ */
+-->
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <style type="text/css">
+ body { color: white; background-color: black }
+ a:link { color: #33B5E5; /*blue*/ }
+ a:visited { color: #99CC00; /*green*/ }
+ a:hover { color: #FFBB33; /*yellow*/; }
+ </style>
+</head>
+<body>
+<hr/>
+<b>SdkController</b> is used to send sensor data from an actual device to an emulator. <p/>
+To use it, do the following: <br/>
+<ol>
+<li>Connect your device to your computer via USB. Make sure to enable <i>USB Debugging</i> in <i>Settings &gt; Developer Options</i>. </li>
+<li>Start this application on your device. </li>
+<li>On the computer in a shell, run: <br/><i>adb forward tcp:1970 localabstract:android.sdk.controller</i> </li>
+<li>Finally <b>run an emulator</b> with an AVD targetting <b>API 15</b>.
+Multi-touch emulation must be explicitly enabled in emulator either by setting "Touch screen type" property to "multi-touch" in AVD Manager,
+or by starting the emulator with "-screen multi-touch" option.</li>
+</ol>
+<a href="https://sites.google.com/a/android.com/tools/recent/sensoremulation">Read more.</a>
+</body>
+</html>
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/proguard-project.txt b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/proguard-project.txt
new file mode 100644
index 0000000..f2fe155
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/proguard-project.txt
@@ -0,0 +1,20 @@
+# To enable ProGuard in your project, edit project.properties
+# to define the proguard.config property as described in that file.
+#
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in ${sdk.dir}/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the ProGuard
+# include property in project.properties.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/project.properties b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/project.properties
new file mode 100644
index 0000000..9c52cb1
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/project.properties
@@ -0,0 +1,14 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system edit
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+#
+# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
+#proguard.config=${sdk.dir}\tools\proguard\proguard-android.txt:proguard-project.txt
+
+# Project target.
+target=android-15
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/drawable-hdpi/ic_launcher.png b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..96a442e
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/drawable-ldpi/ic_launcher.png b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/drawable-ldpi/ic_launcher.png
new file mode 100644
index 0000000..9923872
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/drawable-ldpi/ic_launcher.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/drawable-mdpi/ic_launcher.png b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..359047d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/drawable-xhdpi/ic_launcher.png b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..71c6d76
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/layout-land/sensors.xml b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/layout-land/sensors.xml
new file mode 100644
index 0000000..1f3e2f1
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/layout-land/sensors.xml
@@ -0,0 +1,168 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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.
+ */
+-->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="vertical"
+ >
+
+ <RelativeLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" >
+
+ <TableRow
+ android:id="@+id/row1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/sensors_sample_rate"
+ android:gravity="right"
+ android:layout_marginRight="8dp"
+ />
+
+ <EditText
+ android:id="@+id/textSampleRate"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:ems="4"
+ android:gravity="right"
+ android:imeOptions="actionNone|flagNoExtractUi|flagNoFullscreen|"
+ android:inputType="number"
+ android:text="@string/sensors_default_sample_rate"
+ tools:ignore="HardcodedText" />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/sensors_hz_per_sensor" />
+
+ </TableRow>
+
+ <TableRow
+ android:id="@+id/row2"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentRight="true"
+ android:layout_alignBaseline="@+id/row1"
+ >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="right"
+ android:layout_marginRight="8dp"
+ android:text="@string/sensors_actual_rate" />
+
+ <TextView
+ android:id="@+id/textActualRate"
+ android:gravity="right"
+ android:text="--"
+ tools:ignore="HardcodedText"
+ android:paddingLeft="8dp"
+ android:paddingRight="8dp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/sensors_hz_average" />
+
+ <!-- This 1-pixel wide invisible edit field makes sure that row1 and
+ row2 have the same height and an equal baseline. This works around
+ the fact that row2's attribute layout_alignBaseline=row1 is in fact
+ ignored. -->
+ <EditText
+ android:layout_width="1px"
+ android:layout_height="wrap_content"
+ android:imeOptions="actionNone"
+ android:focusable="false"
+ android:focusableInTouchMode="false"
+ android:visibility="invisible"
+ />
+
+ </TableRow>
+
+ </RelativeLayout>
+
+ <TableLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ >
+
+ <TableRow
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" >
+
+ </TableRow>
+
+ <TableRow
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" >
+
+ </TableRow>
+
+ </TableLayout>
+
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="16dp"
+ android:text="@string/sensors_top_description" />
+
+ <ScrollView
+ android:id="@+id/scrollView1"
+ android:layout_width="fill_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1" >
+
+ <TableLayout
+ android:id="@+id/tableLayout"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:saveEnabled="false" />
+
+ </ScrollView>
+
+ <!-- Placeholder status text. Becomes visibility=gone when empty. -->
+ <TextView
+ android:id="@+id/textStatus"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dp"
+ android:textAppearance="?android:attr/textAppearanceSmall" />
+
+ <!-- Placeholder error text. Becomes visibility=gone when empty. -->
+ <TextView
+ android:id="@+id/textError"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_horizontal"
+ android:background="#F00F"
+ android:padding="8dp"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="#FFF0" />
+
+</LinearLayout> \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/layout/main.xml b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/layout/main.xml
new file mode 100644
index 0000000..2e7a4bb
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/layout/main.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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.
+ */
+-->
+
+<ScrollView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ >
+
+ <RelativeLayout
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:padding="8dp" >
+
+ <ToggleButton
+ android:id="@+id/toggleService"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentRight="true"
+ />
+
+ <TextView
+ android:id="@+id/labelService"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignBaseline="@+id/toggleService"
+ android:layout_alignParentLeft="true"
+ android:layout_marginTop="20dp"
+ android:text="@string/main_label_service"
+ android:textAppearance="?android:attr/textAppearanceLarge" />
+
+ <!-- Placeholder status text. Becomes visibility=gone when empty. -->
+ <TextView
+ android:id="@+id/textStatus"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignBaseline="@+id/labelService"
+ android:layout_marginLeft="8dp"
+ android:layout_toRightOf="@+id/labelService"
+ android:text="[status]"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ tools:ignore="HardcodedText" />
+
+ <!-- Placeholder error text. Becomes visibility=gone when empty. -->
+ <TextView
+ android:id="@+id/textError"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentLeft="true"
+ android:layout_alignParentRight="true"
+ android:layout_below="@+id/toggleService"
+ android:layout_marginBottom="8dp"
+ android:layout_marginTop="8dp"
+ android:background="#F00F"
+ android:gravity="center_horizontal"
+ android:padding="8dp"
+ android:text="[service errors]"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:textColor="#FFF0"
+ tools:ignore="HardcodedText" />
+
+ <TextView
+ android:id="@+id/labelButtons"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@+id/textError"
+ android:layout_marginTop="16dp"
+ android:text="@string/main_label_buttons"
+ android:textAppearance="?android:attr/textAppearanceLarge" />
+
+ <Button
+ android:id="@+id/btnOpenMultitouch"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@+id/labelButtons"
+ android:layout_centerHorizontal="true"
+ android:layout_marginTop="16dp"
+ android:text="@string/main_btn_open_multitouch" />
+
+ <Button
+ android:id="@+id/btnOpenSensors"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_below="@+id/btnOpenMultitouch"
+ android:layout_centerHorizontal="true"
+ android:layout_marginTop="16dp"
+ android:text="@string/main_btn_open_sensors" />
+
+ <WebView
+ android:id="@+id/webIntro"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_below="@+id/btnOpenSensors"
+ android:layout_marginTop="16dp"
+ android:background="@null"
+ />
+
+ </RelativeLayout>
+</ScrollView>
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/layout/multitouch.xml b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/layout/multitouch.xml
new file mode 100644
index 0000000..0aec0fb
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/layout/multitouch.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent" >
+
+ <com.android.tools.sdkcontroller.views.MultiTouchView
+ android:id="@+id/imageView"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent" />
+
+ <!-- Placeholder status text. Becomes visibility=gone when empty. -->
+ <TextView
+ android:id="@+id/textStatus"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:textAppearance="?android:attr/textAppearanceSmall" />
+
+ <!-- Placeholder error text. Becomes visibility=gone when empty. -->
+ <TextView
+ android:id="@+id/textError"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_below="@+id/textStatus"
+ android:gravity="center_horizontal"
+ android:background="#F00F"
+ android:padding="8dp"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="#FFF0" />
+
+</RelativeLayout>
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/layout/sensor_row.xml b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/layout/sensor_row.xml
new file mode 100644
index 0000000..16ffd42
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/layout/sensor_row.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * 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.
+ */
+-->
+
+<!-- One row per sensor added to the TableLayout from layout/sensors.xml -->
+<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent" >
+
+ <CheckBox
+ android:id="@+id/row_checkbox"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginRight="10dp"
+ android:saveEnabled="false"
+ android:text="Some CheckBox"
+ tools:ignore="HardcodedText" />
+
+ <TextView
+ android:id="@+id/row_textview"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:textAppearance="?android:attr/textAppearanceSmall" />
+
+</TableRow>
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/layout/sensors.xml b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/layout/sensors.xml
new file mode 100644
index 0000000..57935cc
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/layout/sensors.xml
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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.
+ */
+-->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent"
+ android:orientation="vertical"
+ >
+
+ <TableLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal"
+ >
+
+ <TableRow
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/sensors_sample_rate"
+ android:gravity="right"
+ android:layout_marginRight="8dp"
+ />
+ <EditText
+ android:id="@+id/textSampleRate"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:ems="4"
+ android:gravity="right"
+ android:imeOptions="actionNone|flagNoExtractUi|flagNoFullscreen|"
+ android:inputType="number"
+ android:text="@string/sensors_default_sample_rate" />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/sensors_hz_per_sensor" />
+
+ </TableRow>
+
+ <TableRow
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" >
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:gravity="right"
+ android:layout_marginRight="8dp"
+ android:text="@string/sensors_actual_rate" />
+
+ <TextView
+ android:id="@+id/textActualRate"
+ android:gravity="right"
+ android:text="--"
+ tools:ignore="HardcodedText"
+ android:paddingLeft="8dp"
+ android:paddingRight="8dp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/sensors_hz_average" />
+
+ </TableRow>
+
+ </TableLayout>
+
+ <TextView
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="16dp"
+ android:text="@string/sensors_top_description" />
+
+ <ScrollView
+ android:id="@+id/scrollView1"
+ android:layout_width="fill_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1" >
+
+ <TableLayout
+ android:id="@+id/tableLayout"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:saveEnabled="false" />
+
+ </ScrollView>
+
+ <!-- Placeholder status text. Becomes visibility=gone when empty. -->
+ <TextView
+ android:id="@+id/textStatus"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="8dp"
+ android:textAppearance="?android:attr/textAppearanceSmall" />
+
+ <!-- Placeholder error text. Becomes visibility=gone when empty. -->
+ <TextView
+ android:id="@+id/textError"
+ android:layout_width="fill_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center_horizontal"
+ android:background="#F00F"
+ android:padding="8dp"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="#FFF0" />
+
+</LinearLayout> \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/values-v11/styles_v11.xml b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/values-v11/styles_v11.xml
new file mode 100644
index 0000000..3d3860e
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/values-v11/styles_v11.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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.
+ */
+-->
+
+<resources>
+
+ <style name="Theme.MultiTouch" parent="android:Theme.Holo.NoActionBar.Fullscreen">
+ <item name="android:windowBackground">@android:color/transparent</item>
+ </style>
+
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/values/strings.xml b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/values/strings.xml
new file mode 100644
index 0000000..e4e1dbb
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/values/strings.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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.
+ */
+-->
+
+<resources>
+
+ <!-- Strings for manifest. -->
+ <string name="app_name">SDK Controller</string>
+ <string name="service_description">Background service for SDK Controller</string>
+
+ <!-- Strings for service. -->
+ <string name="service_notif_title">SDK Controller is running</string>
+
+ <!-- Strings for layout/main -->
+ <string name="main_label_service">Service:</string>
+ <string name="main_label_buttons">What you can do:</string>
+ <string name="main_btn_open_multitouch">Control Multi-touch</string>
+ <string name="main_btn_open_sensors">Control Sensors</string>
+ <string name="main_service_status_connected">Emulator Connected</string>
+ <string name="main_service_status_disconnected">Emulator Connected</string>
+
+ <!-- Strings for layout/sensors -->
+ <string name="sensors_activity_title">SDK Controller &gt; Sensors</string>
+ <string name="sensors_top_description">Available Sensors:</string>
+ <string name="sensors_sample_rate">Sample Rate</string>
+ <string name="sensors_hz_per_sensor">Hz per sensor</string>
+ <string name="sensors_actual_rate">Actual</string>
+ <string name="sensors_hz_average">Hz average</string>
+ <!-- Default sample rate for SensorsActivity UI.
+ Should match the default for SensorsHandler.mUpdateTargetMs. -->
+ <string name="sensors_default_sample_rate">20</string>
+
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/values/styles.xml b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/values/styles.xml
new file mode 100644
index 0000000..67c7278
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/res/values/styles.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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.
+ */
+-->
+
+<resources>
+
+ <style name="Theme.MultiTouch" parent="android:Theme.NoTitleBar.Fullscreen">
+ <item name="android:windowBackground">@android:color/transparent</item>
+ </style>
+
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/activities/BaseBindingActivity.java b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/activities/BaseBindingActivity.java
new file mode 100644
index 0000000..ab5306d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/activities/BaseBindingActivity.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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 com.android.tools.sdkcontroller.activities;
+
+import android.app.Activity;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+import android.util.Log;
+
+import com.android.tools.sdkcontroller.service.ControllerService;
+import com.android.tools.sdkcontroller.service.ControllerService.ControllerBinder;
+import com.android.tools.sdkcontroller.service.ControllerService.ControllerListener;
+
+/**
+ * Base activity class that knows how to bind and unbind from the
+ * {@link ControllerService}.
+ */
+public abstract class BaseBindingActivity extends Activity {
+
+ public static String TAG = BaseBindingActivity.class.getSimpleName();
+ private static boolean DEBUG = true;
+ private ServiceConnection mServiceConnection;
+ private ControllerBinder mServiceBinder;
+
+ /**
+ * Returns the binder. Activities can use that to query the controller service.
+ * @return An existing {@link ControllerBinder}.
+ * The binder is only valid between calls {@link #onServiceConnected()} and
+ * {@link #onServiceDisconnected()}. Returns null when not valid.
+ */
+ public ControllerBinder getServiceBinder() {
+ return mServiceBinder;
+ }
+
+ /**
+ * Called when the activity resumes.
+ * This automatically binds to the service, starting it as needed.
+ * <p/>
+ * Since on resume we automatically bind to the service, the {@link ServiceConnection}
+ * will is restored and {@link #onServiceConnected()} is called as necessary.
+ * Derived classes that need to initialize anything that is related to the service
+ * (e.g. getting their handler) should thus do so in {@link #onServiceConnected()} and
+ * <em>not</em> in {@link #onResume()} -- since binding to the service is asynchronous
+ * there is <em>no</em> guarantee that {@link #getServiceBinder()} returns non-null
+ * when this call finishes.
+ */
+ @Override
+ protected void onResume() {
+ super.onResume();
+ bindToService();
+ }
+
+ /**
+ * Called when the activity is paused.
+ * This automatically unbinds from the service but does not stop it.
+ */
+ @Override
+ protected void onPause() {
+ super.onPause();
+ unbindFromService();
+ }
+
+ // ----------
+
+ /**
+ * Called when binding to the service to get the activity's {@link ControllerListener}.
+ * @return A new non-null {@link ControllerListener}.
+ */
+ protected abstract ControllerListener createControllerListener();
+
+ /**
+ * Called by the service once the activity is connected (bound) to it.
+ * <p/>
+ * When this is called, {@link #getServiceBinder()} returns a non-null binder that
+ * can be used by the activity to control the service.
+ */
+ protected abstract void onServiceConnected();
+
+ /**
+ * Called by the service when it is forcibly disconnected OR when we know
+ * we're unbinding the service.
+ * <p/>
+ * When this is called, {@link #getServiceBinder()} returns a null binder and
+ * the activity should stop using that binder and remove any reference to it.
+ */
+ protected abstract void onServiceDisconnected();
+
+ /**
+ * Starts the service and binds to it.
+ */
+ protected void bindToService() {
+ if (mServiceConnection == null) {
+ final ControllerListener listener = createControllerListener();
+
+ mServiceConnection = new ServiceConnection() {
+ /**
+ * Called when the service is connected.
+ * Allows us to retrieve the binder to talk to the service.
+ */
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ if (DEBUG) Log.d(TAG, "Activity connected to service");
+ mServiceBinder = (ControllerBinder) service;
+ mServiceBinder.addControllerListener(listener);
+ BaseBindingActivity.this.onServiceConnected();
+ }
+
+ /**
+ * Called when the service got disconnected, e.g. because it crashed.
+ * This is <em>not</em> called when we unbind from the service.
+ */
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ if (DEBUG) Log.d(TAG, "Activity disconnected from service");
+ mServiceBinder = null;
+ BaseBindingActivity.this.onServiceDisconnected();
+ }
+ };
+ }
+
+ // Start service so that it doesn't stop when we unbind
+ if (DEBUG) Log.d(TAG, "start requested & bind service");
+ Intent service = new Intent(this, ControllerService.class);
+ startService(service);
+ bindService(service,
+ mServiceConnection,
+ Context.BIND_AUTO_CREATE);
+ }
+
+ /**
+ * Unbinds from the service but does not actually stop the service.
+ * This lets us have it run in the background even if this isn't the active activity.
+ */
+ protected void unbindFromService() {
+ if (mServiceConnection != null) {
+ if (DEBUG) Log.d(TAG, "unbind service");
+ mServiceConnection.onServiceDisconnected(null /*name*/);
+ unbindService(mServiceConnection);
+ mServiceConnection = null;
+ }
+ }
+} \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/activities/MainActivity.java b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/activities/MainActivity.java
new file mode 100644
index 0000000..4769245
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/activities/MainActivity.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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 com.android.tools.sdkcontroller.activities;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.webkit.WebView;
+import android.widget.Button;
+import android.widget.CompoundButton;
+import android.widget.CompoundButton.OnCheckedChangeListener;
+import android.widget.TextView;
+import android.widget.ToggleButton;
+
+import com.android.tools.sdkcontroller.R;
+import com.android.tools.sdkcontroller.service.ControllerService;
+import com.android.tools.sdkcontroller.service.ControllerService.ControllerBinder;
+import com.android.tools.sdkcontroller.service.ControllerService.ControllerListener;
+
+/**
+ * Main activity. It's the entry point for the application.
+ * It allows the user to start/stop the service and see it's current state and errors.
+ * It also has buttons to start either the sensor control activity or the multitouch activity.
+ */
+public class MainActivity extends BaseBindingActivity {
+
+ @SuppressWarnings("hiding")
+ public static String TAG = MainActivity.class.getSimpleName();
+ private static boolean DEBUG = true;
+ private Button mBtnOpenMultitouch;
+ private Button mBtnOpenSensors;
+ private ToggleButton mBtnToggleService;
+ private TextView mTextError;
+ private TextView mTextStatus;
+
+ /** Called when the activity is first created. */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.main);
+
+ mTextError = (TextView) findViewById(R.id.textError);
+ mTextStatus = (TextView) findViewById(R.id.textStatus);
+
+ WebView wv = (WebView) findViewById(R.id.webIntro);
+ wv.loadUrl("file:///android_asset/intro_help.html");
+
+ setupButtons();
+ }
+
+ @Override
+ protected void onResume() {
+ // BaseBindingActivity.onResume will bind to the service.
+ super.onResume();
+ updateError();
+ }
+
+ @Override
+ protected void onPause() {
+ // BaseBindingActivity.onResume will unbind from (but not stop) the service.
+ super.onPause();
+ }
+
+ @Override
+ public void onBackPressed() {
+ if (DEBUG) Log.d(TAG, "onBackPressed");
+ // If back is pressed, we stop the service automatically.
+ // It seems more intuitive that way.
+ stopService();
+ super.onBackPressed();
+ }
+
+ // ----------
+
+ @Override
+ protected void onServiceConnected() {
+ updateButtons();
+ }
+
+ @Override
+ protected void onServiceDisconnected() {
+ updateButtons();
+ }
+
+ @Override
+ protected ControllerListener createControllerListener() {
+ return new MainControllerListener();
+ }
+
+ // ----------
+
+ private void setupButtons() {
+ mBtnOpenMultitouch = (Button) findViewById(R.id.btnOpenMultitouch);
+ mBtnOpenSensors = (Button) findViewById(R.id.btnOpenSensors);
+
+ mBtnOpenMultitouch.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ // Open the multi-touch activity.
+ Intent i = new Intent(MainActivity.this, MultiTouchActivity.class);
+ startActivity(i);
+ }
+ });
+
+ mBtnOpenSensors.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ // Open the sensor activity.
+ Intent i = new Intent(MainActivity.this, SensorActivity.class);
+ startActivity(i);
+ }
+ });
+
+ mBtnToggleService = (ToggleButton) findViewById(R.id.toggleService);
+
+ // set initial state
+ updateButtons();
+
+ mBtnToggleService.setOnCheckedChangeListener(new OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ if (isChecked) {
+ bindToService();
+ updateButtons();
+ } else {
+ stopService();
+ updateButtons();
+ }
+ }
+ });
+
+ }
+
+ private void updateButtons() {
+ boolean running = ControllerService.isServiceIsRunning();
+ mBtnOpenMultitouch.setEnabled(running);
+ mBtnOpenSensors.setEnabled(running);
+ mBtnToggleService.setChecked(running);
+ }
+
+ /**
+ * Unbind and then actually stops the service.
+ */
+ private void stopService() {
+ Intent service = new Intent(this, ControllerService.class);
+ unbindFromService();
+ if (DEBUG) Log.d(TAG, "stop service requested");
+ stopService(service);
+ }
+
+ private class MainControllerListener implements ControllerListener {
+ @Override
+ public void onErrorChanged() {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ updateError();
+ }
+ });
+ }
+
+ @Override
+ public void onStatusChanged() {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ updateStatus();
+ }
+ });
+ }
+ }
+
+ private void updateError() {
+ ControllerBinder binder = getServiceBinder();
+ String error = binder == null ? "" : binder.getServiceError();
+ if (error == null) {
+ error = "";
+ }
+
+ mTextError.setVisibility(error.length() == 0 ? View.GONE : View.VISIBLE);
+ mTextError.setText(error);
+ }
+
+ private void updateStatus() {
+ ControllerBinder binder = getServiceBinder();
+ boolean connected = binder == null ? false : binder.isEmuConnected();
+ mTextStatus.setText(
+ getText(connected ? R.string.main_service_status_connected
+ : R.string.main_service_status_disconnected));
+
+ }
+} \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/activities/MultiTouchActivity.java b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/activities/MultiTouchActivity.java
new file mode 100644
index 0000000..faba882
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/activities/MultiTouchActivity.java
@@ -0,0 +1,388 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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 com.android.tools.sdkcontroller.activities;
+
+import java.io.ByteArrayInputStream;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+
+import android.graphics.Color;
+import android.os.Bundle;
+import android.os.Message;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.View.OnTouchListener;
+import android.widget.TextView;
+
+import com.android.tools.sdkcontroller.R;
+import com.android.tools.sdkcontroller.handlers.MultiTouchChannel;
+import com.android.tools.sdkcontroller.lib.Channel;
+import com.android.tools.sdkcontroller.lib.ProtocolConstants;
+import com.android.tools.sdkcontroller.service.ControllerService.ControllerBinder;
+import com.android.tools.sdkcontroller.service.ControllerService.ControllerListener;
+import com.android.tools.sdkcontroller.utils.ApiHelper;
+import com.android.tools.sdkcontroller.views.MultiTouchView;
+
+/**
+ * Activity that controls and displays the {@link MultiTouchChannel}.
+ */
+public class MultiTouchActivity extends BaseBindingActivity
+ implements android.os.Handler.Callback {
+
+ @SuppressWarnings("hiding")
+ private static String TAG = MultiTouchActivity.class.getSimpleName();
+ private static boolean DEBUG = true;
+
+ private volatile MultiTouchChannel mHandler;
+
+ private TextView mTextError;
+ private TextView mTextStatus;
+ private MultiTouchView mImageView;
+ /** Width of the emulator's display. */
+ private int mEmulatorWidth = 0;
+ /** Height of the emulator's display. */
+ private int mEmulatorHeight = 0;
+ /** Bitmap storage. */
+ private int[] mColors;
+
+ private final TouchListener mTouchListener = new TouchListener();
+ private final android.os.Handler mUiHandler = new android.os.Handler(this);
+
+ /** Called when the activity is first created. */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.multitouch);
+ mImageView = (MultiTouchView) findViewById(R.id.imageView);
+ mTextError = (TextView) findViewById(R.id.textError);
+ mTextStatus = (TextView) findViewById(R.id.textStatus);
+ updateStatus("Waiting for connection");
+
+ ApiHelper ah = ApiHelper.get();
+ ah.View_setSystemUiVisibility(mImageView, View.SYSTEM_UI_FLAG_LOW_PROFILE);
+ }
+
+ @Override
+ protected void onResume() {
+ if (DEBUG) Log.d(TAG, "onResume");
+ // BaseBindingActivity.onResume will bind to the service.
+ // Note: any initialization related to the service or the handler should
+ // go in onServiceConnected() since in this call the service may not be
+ // bound yet.
+ super.onResume();
+ updateError();
+ }
+
+ @Override
+ protected void onPause() {
+ if (DEBUG) Log.d(TAG, "onPause");
+ // BaseBindingActivity.onResume will unbind from (but not stop) the service.
+ super.onPause();
+ mImageView.setEnabled(false);
+ updateStatus("Paused");
+ }
+
+ // ----------
+
+ @Override
+ protected void onServiceConnected() {
+ if (DEBUG) Log.d(TAG, "onServiceConnected");
+ mHandler = (MultiTouchChannel) getServiceBinder().getChannel(Channel.MULTITOUCH_CHANNEL);
+ if (mHandler != null) {
+ mHandler.setViewSize(mImageView.getWidth(), mImageView.getHeight());
+ mHandler.addUiHandler(mUiHandler);
+ }
+ }
+
+ @Override
+ protected void onServiceDisconnected() {
+ if (DEBUG) Log.d(TAG, "onServiceDisconnected");
+ if (mHandler != null) {
+ mHandler.removeUiHandler(mUiHandler);
+ mHandler = null;
+ }
+ }
+
+ @Override
+ protected ControllerListener createControllerListener() {
+ return new MultiTouchControllerListener();
+ }
+
+ // ----------
+
+ private class MultiTouchControllerListener implements ControllerListener {
+ @Override
+ public void onErrorChanged() {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ updateError();
+ }
+ });
+ }
+
+ @Override
+ public void onStatusChanged() {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ ControllerBinder binder = getServiceBinder();
+ if (binder != null) {
+ boolean connected = binder.isEmuConnected();
+ mImageView.setEnabled(connected);
+ updateStatus(connected ? "Emulator connected" : "Emulator disconnected");
+ }
+ }
+ });
+ }
+ }
+
+ // ----------
+
+ /**
+ * Implements OnTouchListener interface that receives touch screen events,
+ * and reports them to the emulator application.
+ */
+ class TouchListener implements OnTouchListener {
+ /**
+ * Touch screen event handler.
+ */
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ ByteBuffer bb = null;
+ final int action = event.getAction();
+ final int action_code = action & MotionEvent.ACTION_MASK;
+ final int action_pid_index = action >> MotionEvent.ACTION_POINTER_ID_SHIFT;
+ int msg_type = 0;
+ MultiTouchChannel h = mHandler;
+
+ // Build message for the emulator.
+ switch (action_code) {
+ case MotionEvent.ACTION_MOVE:
+ if (h != null) {
+ bb = ByteBuffer.allocate(
+ event.getPointerCount() * ProtocolConstants.MT_EVENT_ENTRY_SIZE);
+ bb.order(h.getEndian());
+ for (int n = 0; n < event.getPointerCount(); n++) {
+ mImageView.constructEventMessage(bb, event, n);
+ }
+ msg_type = ProtocolConstants.MT_MOVE;
+ }
+ break;
+ case MotionEvent.ACTION_DOWN:
+ if (h != null) {
+ bb = ByteBuffer.allocate(ProtocolConstants.MT_EVENT_ENTRY_SIZE);
+ bb.order(h.getEndian());
+ mImageView.constructEventMessage(bb, event, action_pid_index);
+ msg_type = ProtocolConstants.MT_FISRT_DOWN;
+ }
+ break;
+ case MotionEvent.ACTION_UP:
+ if (h != null) {
+ bb = ByteBuffer.allocate(ProtocolConstants.MT_EVENT_ENTRY_SIZE);
+ bb.order(h.getEndian());
+ bb.putInt(event.getPointerId(action_pid_index));
+ msg_type = ProtocolConstants.MT_LAST_UP;
+ }
+ break;
+ case MotionEvent.ACTION_POINTER_DOWN:
+ if (h != null) {
+ bb = ByteBuffer.allocate(ProtocolConstants.MT_EVENT_ENTRY_SIZE);
+ bb.order(h.getEndian());
+ mImageView.constructEventMessage(bb, event, action_pid_index);
+ msg_type = ProtocolConstants.MT_POINTER_DOWN;
+ }
+ break;
+ case MotionEvent.ACTION_POINTER_UP:
+ if (h != null) {
+ bb = ByteBuffer.allocate(ProtocolConstants.MT_EVENT_ENTRY_SIZE);
+ bb.order(h.getEndian());
+ bb.putInt(event.getPointerId(action_pid_index));
+ msg_type = ProtocolConstants.MT_POINTER_UP;
+ }
+ break;
+ default:
+ Log.w(TAG, "Unknown action type: " + action_code);
+ return true;
+ }
+
+ if (DEBUG && bb != null) Log.d(TAG, bb.toString());
+
+ if (h != null && bb != null) {
+ h.postMessage(msg_type, bb);
+ }
+ return true;
+ }
+ } // TouchListener
+
+ /** Implementation of Handler.Callback */
+ @Override
+ public boolean handleMessage(Message msg) {
+ switch (msg.what) {
+ case MultiTouchChannel.EVENT_MT_START:
+ MultiTouchChannel h = mHandler;
+ if (h != null) {
+ mImageView.setEnabled(true);
+ mImageView.setOnTouchListener(mTouchListener);
+ }
+ break;
+ case MultiTouchChannel.EVENT_MT_STOP:
+ mImageView.setOnTouchListener(null);
+ break;
+ case MultiTouchChannel.EVENT_FRAME_BUFFER:
+ onFrameBuffer(((ByteBuffer) msg.obj).array());
+ mHandler.postMessage(ProtocolConstants.MT_FB_HANDLED, (byte[]) null);
+ break;
+ }
+ return true; // we consumed this message
+ }
+
+ /**
+ * Called when a BLOB query is received from the emulator.
+ * <p/>
+ * This query is used to deliver framebuffer updates in the emulator. The
+ * blob contains an update header, followed by the bitmap containing updated
+ * rectangle. The header is defined as MTFrameHeader structure in
+ * external/qemu/android/multitouch-port.h
+ * <p/>
+ * NOTE: This method is called from the I/O loop, so all communication with
+ * the emulator will be "on hold" until this method returns.
+ *
+ * TODO ===> CHECK that we can consume that array from a different thread than the producer's.
+ * E.g. does the produce reuse the same array or does it generate a new one each time?
+ *
+ * @param array contains BLOB data for the query.
+ */
+ private void onFrameBuffer(byte[] array) {
+ final ByteBuffer bb = ByteBuffer.wrap(array);
+ bb.order(ByteOrder.LITTLE_ENDIAN);
+
+ // Read frame header.
+ final int header_size = bb.getInt();
+ final int disp_width = bb.getInt();
+ final int disp_height = bb.getInt();
+ final int x = bb.getInt();
+ final int y = bb.getInt();
+ final int w = bb.getInt();
+ final int h = bb.getInt();
+ final int bpl = bb.getInt();
+ final int bpp = bb.getInt();
+ final int format = bb.getInt();
+
+ // Update application display.
+ updateDisplay(disp_width, disp_height);
+
+ if (format == ProtocolConstants.MT_FRAME_JPEG) {
+ /*
+ * Framebuffer is in JPEG format.
+ */
+
+ final ByteArrayInputStream jpg = new ByteArrayInputStream(bb.array());
+ // Advance input stream to JPEG image.
+ jpg.skip(header_size);
+ // Draw the image.
+ mImageView.drawJpeg(x, y, w, h, jpg);
+ } else {
+ /*
+ * Framebuffer is in a raw RGB format.
+ */
+
+ final int pixel_num = h * w;
+ // Advance stream to the beginning of framebuffer data.
+ bb.position(header_size);
+
+ // Make sure that mColors is large enough to contain the
+ // update bitmap.
+ if (mColors == null || mColors.length < pixel_num) {
+ mColors = new int[pixel_num];
+ }
+
+ // Convert the blob bitmap into bitmap that we will display.
+ if (format == ProtocolConstants.MT_FRAME_RGB565) {
+ for (int n = 0; n < pixel_num; n++) {
+ // Blob bitmap is in RGB565 format.
+ final int color = bb.getShort();
+ final int r = ((color & 0xf800) >> 8) | ((color & 0xf800) >> 14);
+ final int g = ((color & 0x7e0) >> 3) | ((color & 0x7e0) >> 9);
+ final int b = ((color & 0x1f) << 3) | ((color & 0x1f) >> 2);
+ mColors[n] = Color.rgb(r, g, b);
+ }
+ } else if (format == ProtocolConstants.MT_FRAME_RGB888) {
+ for (int n = 0; n < pixel_num; n++) {
+ // Blob bitmap is in RGB565 format.
+ final int r = bb.getChar();
+ final int g = bb.getChar();
+ final int b = bb.getChar();
+ mColors[n] = Color.rgb(r, g, b);
+ }
+ } else {
+ Log.w(TAG, "Invalid framebuffer format: " + format);
+ return;
+ }
+ mImageView.drawBitmap(x, y, w, h, mColors);
+ }
+ }
+
+ /**
+ * Updates application's screen accordingly to the emulator screen.
+ *
+ * @param e_width Width of the emulator screen.
+ * @param e_height Height of the emulator screen.
+ */
+ private void updateDisplay(int e_width, int e_height) {
+ if (e_width != mEmulatorWidth || e_height != mEmulatorHeight) {
+ mEmulatorWidth = e_width;
+ mEmulatorHeight = e_height;
+
+ boolean rotateDisplay = false;
+ int w = mImageView.getWidth();
+ int h = mImageView.getHeight();
+ if (w > h != e_width > e_height) {
+ rotateDisplay = true;
+ int tmp = w;
+ w = h;
+ h = tmp;
+ }
+
+ float dx = (float) w / (float) e_width;
+ float dy = (float) h / (float) e_height;
+ mImageView.setDxDy(dx, dy, rotateDisplay);
+ if (DEBUG) Log.d(TAG, "Dispay updated: " + e_width + " x " + e_height +
+ " -> " + w + " x " + h + " ratio: " +
+ dx + " x " + dy);
+ }
+ }
+
+ // ----------
+
+ private void updateStatus(String status) {
+ mTextStatus.setVisibility(status == null ? View.GONE : View.VISIBLE);
+ if (status != null) mTextStatus.setText(status);
+ }
+
+ private void updateError() {
+ ControllerBinder binder = getServiceBinder();
+ String error = binder == null ? "" : binder.getServiceError();
+ if (error == null) {
+ error = "";
+ }
+
+ mTextError.setVisibility(error.length() == 0 ? View.GONE : View.VISIBLE);
+ mTextError.setText(error);
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/activities/SensorActivity.java b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/activities/SensorActivity.java
new file mode 100644
index 0000000..61c3081
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/activities/SensorActivity.java
@@ -0,0 +1,338 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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 com.android.tools.sdkcontroller.activities;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import android.os.Bundle;
+import android.os.Message;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnFocusChangeListener;
+import android.view.View.OnKeyListener;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.TableLayout;
+import android.widget.TableRow;
+import android.widget.TextView;
+
+import com.android.tools.sdkcontroller.R;
+import com.android.tools.sdkcontroller.handlers.SensorChannel;
+import com.android.tools.sdkcontroller.handlers.SensorChannel.MonitoredSensor;
+import com.android.tools.sdkcontroller.lib.Channel;
+import com.android.tools.sdkcontroller.service.ControllerService.ControllerBinder;
+import com.android.tools.sdkcontroller.service.ControllerService.ControllerListener;
+
+/**
+ * Activity that displays and controls the sensors from {@link SensorChannel}.
+ * For each sensor it displays a checkbox that is enabled if the sensor is supported
+ * by the emulator. The user can select whether the sensor is active. It also displays
+ * data from the sensor when available.
+ */
+public class SensorActivity extends BaseBindingActivity
+ implements android.os.Handler.Callback {
+
+ @SuppressWarnings("hiding")
+ public static String TAG = SensorActivity.class.getSimpleName();
+ private static boolean DEBUG = true;
+
+ private static final int MSG_UPDATE_ACTUAL_HZ = 0x31415;
+
+ private TableLayout mTableLayout;
+ private TextView mTextError;
+ private TextView mTextStatus;
+ private TextView mTextTargetHz;
+ private TextView mTextActualHz;
+ private SensorChannel mSensorHandler;
+
+ private final Map<MonitoredSensor, DisplayInfo> mDisplayedSensors =
+ new HashMap<SensorChannel.MonitoredSensor, SensorActivity.DisplayInfo>();
+ private final android.os.Handler mUiHandler = new android.os.Handler(this);
+ private int mTargetSampleRate;
+ private long mLastActualUpdateMs;
+
+ /** Called when the activity is first created. */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.sensors);
+ mTableLayout = (TableLayout) findViewById(R.id.tableLayout);
+ mTextError = (TextView) findViewById(R.id.textError);
+ mTextStatus = (TextView) findViewById(R.id.textStatus);
+ mTextTargetHz = (TextView) findViewById(R.id.textSampleRate);
+ mTextActualHz = (TextView) findViewById(R.id.textActualRate);
+ updateStatus("Waiting for connection");
+
+ mTextTargetHz.setOnKeyListener(new OnKeyListener() {
+ @Override
+ public boolean onKey(View v, int keyCode, KeyEvent event) {
+ updateSampleRate();
+ return false;
+ }
+ });
+ mTextTargetHz.setOnFocusChangeListener(new OnFocusChangeListener() {
+ @Override
+ public void onFocusChange(View v, boolean hasFocus) {
+ updateSampleRate();
+ }
+ });
+ }
+
+ @Override
+ protected void onResume() {
+ if (DEBUG) Log.d(TAG, "onResume");
+ // BaseBindingActivity.onResume will bind to the service.
+ super.onResume();
+ updateError();
+ }
+
+ @Override
+ protected void onPause() {
+ if (DEBUG) Log.d(TAG, "onPause");
+ // BaseBindingActivity.onResume will unbind from (but not stop) the service.
+ super.onPause();
+ }
+
+ @Override
+ protected void onDestroy() {
+ if (DEBUG) Log.d(TAG, "onDestroy");
+ super.onDestroy();
+ removeSensorUi();
+ }
+
+ // ----------
+
+ @Override
+ protected void onServiceConnected() {
+ if (DEBUG) Log.d(TAG, "onServiceConnected");
+ createSensorUi();
+ }
+
+ @Override
+ protected void onServiceDisconnected() {
+ if (DEBUG) Log.d(TAG, "onServiceDisconnected");
+ removeSensorUi();
+ }
+
+ @Override
+ protected ControllerListener createControllerListener() {
+ return new SensorsControllerListener();
+ }
+
+ // ----------
+
+ private class SensorsControllerListener implements ControllerListener {
+ @Override
+ public void onErrorChanged() {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ updateError();
+ }
+ });
+ }
+
+ @Override
+ public void onStatusChanged() {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ ControllerBinder binder = getServiceBinder();
+ if (binder != null) {
+ boolean connected = binder.isEmuConnected();
+ mTableLayout.setEnabled(connected);
+ updateStatus(connected ? "Emulated connected" : "Emulator disconnected");
+ }
+ }
+ });
+ }
+ }
+
+ private void createSensorUi() {
+ final LayoutInflater inflater = getLayoutInflater();
+
+ if (!mDisplayedSensors.isEmpty()) {
+ removeSensorUi();
+ }
+
+ mSensorHandler = (SensorChannel) getServiceBinder().getChannel(Channel.SENSOR_CHANNEL);
+ if (mSensorHandler != null) {
+ mSensorHandler.addUiHandler(mUiHandler);
+ mUiHandler.sendEmptyMessage(MSG_UPDATE_ACTUAL_HZ);
+
+ assert mDisplayedSensors.isEmpty();
+ List<MonitoredSensor> sensors = mSensorHandler.getSensors();
+ for (MonitoredSensor sensor : sensors) {
+ final TableRow row = (TableRow) inflater.inflate(R.layout.sensor_row,
+ mTableLayout,
+ false);
+ mTableLayout.addView(row);
+ mDisplayedSensors.put(sensor, new DisplayInfo(sensor, row));
+ }
+ }
+ }
+
+ private void removeSensorUi() {
+ if (mSensorHandler != null) {
+ mSensorHandler.removeUiHandler(mUiHandler);
+ mSensorHandler = null;
+ }
+ mTableLayout.removeAllViews();
+ for (DisplayInfo info : mDisplayedSensors.values()) {
+ info.release();
+ }
+ mDisplayedSensors.clear();
+ }
+
+ private class DisplayInfo implements CompoundButton.OnCheckedChangeListener {
+ private MonitoredSensor mSensor;
+ private CheckBox mChk;
+ private TextView mVal;
+
+ public DisplayInfo(MonitoredSensor sensor, TableRow row) {
+ mSensor = sensor;
+
+ // Initialize displayed checkbox for this sensor, and register
+ // checked state listener for it.
+ mChk = (CheckBox) row.findViewById(R.id.row_checkbox);
+ mChk.setText(sensor.getUiName());
+ mChk.setEnabled(sensor.isEnabledByEmulator());
+ mChk.setChecked(sensor.isEnabledByUser());
+ mChk.setOnCheckedChangeListener(this);
+
+ // Initialize displayed text box for this sensor.
+ mVal = (TextView) row.findViewById(R.id.row_textview);
+ mVal.setText(sensor.getValue());
+ }
+
+ /**
+ * Handles checked state change for the associated CheckBox. If check
+ * box is checked we will register sensor change listener. If it is
+ * unchecked, we will unregister sensor change listener.
+ */
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ if (mSensor != null) {
+ mSensor.onCheckedChanged(isChecked);
+ }
+ }
+
+ public void release() {
+ mChk = null;
+ mVal = null;
+ mSensor = null;
+
+ }
+
+ public void updateState() {
+ if (mChk != null && mSensor != null) {
+ mChk.setEnabled(mSensor.isEnabledByEmulator());
+ mChk.setChecked(mSensor.isEnabledByUser());
+ }
+ }
+
+ public void updateValue() {
+ if (mVal != null && mSensor != null) {
+ mVal.setText(mSensor.getValue());
+ }
+ }
+ }
+
+ /** Implementation of Handler.Callback */
+ @Override
+ public boolean handleMessage(Message msg) {
+ DisplayInfo info = null;
+ switch (msg.what) {
+ case SensorChannel.SENSOR_STATE_CHANGED:
+ info = mDisplayedSensors.get(msg.obj);
+ if (info != null) {
+ info.updateState();
+ }
+ break;
+ case SensorChannel.SENSOR_DISPLAY_MODIFIED:
+ info = mDisplayedSensors.get(msg.obj);
+ if (info != null) {
+ info.updateValue();
+ }
+ if (mSensorHandler != null) {
+ updateStatus(Integer.toString(mSensorHandler.getMsgSentCount()) + " events sent");
+
+ // Update the "actual rate" field if the value has changed
+ long ms = mSensorHandler.getActualUpdateMs();
+ if (ms != mLastActualUpdateMs) {
+ mLastActualUpdateMs = ms;
+ String hz = mLastActualUpdateMs <= 0 ? "--" :
+ Integer.toString((int) Math.ceil(1000. / ms));
+ mTextActualHz.setText(hz);
+ }
+ }
+ break;
+ case MSG_UPDATE_ACTUAL_HZ:
+ if (mSensorHandler != null) {
+ // Update the "actual rate" field if the value has changed
+ long ms = mSensorHandler.getActualUpdateMs();
+ if (ms != mLastActualUpdateMs) {
+ mLastActualUpdateMs = ms;
+ String hz = mLastActualUpdateMs <= 0 ? "--" :
+ Integer.toString((int) Math.ceil(1000. / ms));
+ mTextActualHz.setText(hz);
+ }
+ mUiHandler.sendEmptyMessageDelayed(MSG_UPDATE_ACTUAL_HZ, 1000 /*1s*/);
+ }
+ }
+ return true; // we consumed this message
+ }
+
+ private void updateStatus(String status) {
+ mTextStatus.setVisibility(status == null ? View.GONE : View.VISIBLE);
+ if (status != null) mTextStatus.setText(status);
+ }
+
+ private void updateError() {
+ ControllerBinder binder = getServiceBinder();
+ String error = binder == null ? "" : binder.getServiceError();
+ if (error == null) {
+ error = "";
+ }
+
+ mTextError.setVisibility(error.length() == 0 ? View.GONE : View.VISIBLE);
+ mTextError.setText(error);
+ }
+
+ private void updateSampleRate() {
+ String str = mTextTargetHz.getText().toString();
+ try {
+ int hz = Integer.parseInt(str.trim());
+
+ // Cap the value. 50 Hz is a reasonable max value for the emulator.
+ if (hz <= 0 || hz > 50) {
+ hz = 50;
+ }
+
+ if (hz != mTargetSampleRate) {
+ mTargetSampleRate = hz;
+ if (mSensorHandler != null) {
+ mSensorHandler.setUpdateTargetMs(hz <= 0 ? 0 : (int)(1000.0f / hz));
+ }
+ }
+ } catch (Exception ignore) {}
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/handlers/MultiTouchChannel.java b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/handlers/MultiTouchChannel.java
new file mode 100644
index 0000000..ad00e92
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/handlers/MultiTouchChannel.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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 com.android.tools.sdkcontroller.handlers;
+
+import android.graphics.Point;
+import android.os.Message;
+import android.util.Log;
+
+import com.android.tools.sdkcontroller.lib.Channel;
+import com.android.tools.sdkcontroller.lib.ProtocolConstants;
+import com.android.tools.sdkcontroller.service.ControllerService;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Implements multi-touch emulation.
+ */
+public class MultiTouchChannel extends Channel {
+
+ @SuppressWarnings("hiding")
+ private static final String TAG = MultiTouchChannel.class.getSimpleName();
+ /**
+ * A new frame buffer has been received from the emulator.
+ * Parameter {@code obj} is a {@code byte[] array} containing the screen data.
+ */
+ public static final int EVENT_FRAME_BUFFER = 1;
+ /**
+ * A multi-touch "start" command has been received from the emulator.
+ * Parameter {@code obj} is the string parameter from the start command.
+ */
+ public static final int EVENT_MT_START = 2;
+ /**
+ * A multi-touch "stop" command has been received from the emulator. There
+ * is no {@code obj} parameter associated.
+ */
+ public static final int EVENT_MT_STOP = 3;
+
+ private static final Point mViewSize = new Point(0, 0);
+
+ /**
+ * Constructs MultiTouchChannel instance.
+ */
+ public MultiTouchChannel(ControllerService service) {
+ super(service, Channel.MULTITOUCH_CHANNEL);
+ }
+
+ /**
+ * Sets size of the display view for emulated screen updates.
+ *
+ * @param width View width in pixels.
+ * @param height View height in pixels.
+ */
+ public void setViewSize(int width, int height) {
+ mViewSize.set(width, height);
+ }
+
+ /*
+ * Channel abstract implementation.
+ */
+
+ /**
+ * This method is invoked when this channel is fully connected with its
+ * counterpart in the emulator.
+ */
+ @Override
+ public void onEmulatorConnected() {
+ if (hasUiHandler()) {
+ enable();
+ notifyUiHandlers(EVENT_MT_START);
+ }
+ }
+
+ /**
+ * This method is invoked when this channel loses connection with its
+ * counterpart in the emulator.
+ */
+ @Override
+ public void onEmulatorDisconnected() {
+ if (hasUiHandler()) {
+ disable();
+ notifyUiHandlers(EVENT_MT_STOP);
+ }
+ }
+
+ /**
+ * A message has been received from the emulator.
+ *
+ * @param msg_type Message type.
+ * @param msg_data Packet received from the emulator.
+ */
+ @Override
+ public void onEmulatorMessage(int msg_type, ByteBuffer msg_data) {
+ switch (msg_type) {
+ case ProtocolConstants.MT_FB_UPDATE:
+ Message msg = Message.obtain();
+ msg.what = EVENT_FRAME_BUFFER;
+ msg.obj = msg_data;
+ postMessage(ProtocolConstants.MT_FB_ACK, (byte[]) null);
+ notifyUiHandlers(msg);
+ break;
+
+ default:
+ Log.e(TAG, "Unknown message type " + msg_type);
+ }
+ }
+
+ /**
+ * A query has been received from the emulator.
+ *
+ * @param query_id Identifies the query. This ID must be used when replying
+ * to the query.
+ * @param query_type Query type.
+ * @param query_data Query data.
+ */
+ @Override
+ public void onEmulatorQuery(int query_id, int query_type, ByteBuffer query_data) {
+ Loge("Unexpected query " + query_type + " in multi-touch");
+ sendQueryResponse(query_id, (byte[]) null);
+ }
+
+ /**
+ * Registers a new UI handler.
+ *
+ * @param uiHandler A non-null UI handler to register. Ignored if the UI
+ * handler is null or already registered.
+ */
+ @Override
+ public void addUiHandler(android.os.Handler uiHandler) {
+ final boolean first_handler = !hasUiHandler();
+ super.addUiHandler(uiHandler);
+ if (first_handler && isConnected()) {
+ enable();
+ notifyUiHandlers(EVENT_MT_START);
+ }
+ }
+
+ /**
+ * Unregisters an UI handler.
+ *
+ * @param uiHandler A non-null UI listener to unregister. Ignored if the
+ * listener is null or already registered.
+ */
+ @Override
+ public void removeUiHandler(android.os.Handler uiHandler) {
+ super.removeUiHandler(uiHandler);
+ if (isConnected() && !hasUiHandler()) {
+ disable();
+ }
+ }
+
+ /***************************************************************************
+ * Logging wrappers
+ **************************************************************************/
+
+ private void Loge(String log) {
+ mService.addError(log);
+ Log.e(TAG, log);
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/handlers/SensorChannel.java b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/handlers/SensorChannel.java
new file mode 100644
index 0000000..ffc2fd0
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/handlers/SensorChannel.java
@@ -0,0 +1,675 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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 com.android.tools.sdkcontroller.handlers;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+import android.content.Context;
+import android.hardware.Sensor;
+import android.hardware.SensorEvent;
+import android.hardware.SensorEventListener;
+import android.hardware.SensorManager;
+import android.os.Message;
+import android.os.SystemClock;
+import android.util.Log;
+
+import com.android.tools.sdkcontroller.lib.Channel;
+import com.android.tools.sdkcontroller.lib.ProtocolConstants;
+import com.android.tools.sdkcontroller.service.ControllerService;
+
+/**
+ * Implements sensors emulation.
+ */
+public class SensorChannel extends Channel {
+
+ @SuppressWarnings("hiding")
+ private static String TAG = SensorChannel.class.getSimpleName();
+ @SuppressWarnings("hiding")
+ private static boolean DEBUG = false;
+ /**
+ * The target update time per sensor. Ignored if 0 or negative.
+ * Sensor updates that arrive faster than this delay are ignored.
+ * Ideally the emulator can be updated at up to 50 fps, however
+ * for average power devices something like 20 fps is more
+ * reasonable.
+ * Default value should match res/values/strings.xml > sensors_default_sample_rate.
+ */
+ private long mUpdateTargetMs = 1000/20; // 20 fps in milliseconds
+ /** Accumulates average update frequency. */
+ private long mGlobalAvgUpdateMs = 0;
+
+ /** Array containing monitored sensors. */
+ private final List<MonitoredSensor> mSensors = new ArrayList<MonitoredSensor>();
+ /** Sensor manager. */
+ private SensorManager mSenMan;
+
+ /*
+ * Messages exchanged with the UI.
+ */
+
+ /**
+ * Sensor "enabled by emulator" state has changed. Parameter {@code obj} is
+ * the {@link MonitoredSensor}.
+ */
+ public static final int SENSOR_STATE_CHANGED = 1;
+ /**
+ * Sensor display value has changed. Parameter {@code obj} is the
+ * {@link MonitoredSensor}.
+ */
+ public static final int SENSOR_DISPLAY_MODIFIED = 2;
+
+ /**
+ * Constructs SensorChannel instance.
+ *
+ * @param service Service context.
+ */
+ public SensorChannel(ControllerService service) {
+ super(service, Channel.SENSOR_CHANNEL);
+ mSenMan = (SensorManager) service.getSystemService(Context.SENSOR_SERVICE);
+ // Iterate through the available sensors, adding them to the array.
+ List<Sensor> sensors = mSenMan.getSensorList(Sensor.TYPE_ALL);
+ int cur_index = 0;
+ for (int n = 0; n < sensors.size(); n++) {
+ Sensor avail_sensor = sensors.get(n);
+
+ // There can be multiple sensors of the same type. We need only one.
+ if (!isSensorTypeAlreadyMonitored(avail_sensor.getType())) {
+ // The first sensor we've got for the given type is not
+ // necessarily the right one. So, use the default sensor
+ // for the given type.
+ Sensor def_sens = mSenMan.getDefaultSensor(avail_sensor.getType());
+ MonitoredSensor to_add = new MonitoredSensor(def_sens);
+ cur_index++;
+ mSensors.add(to_add);
+ if (DEBUG)
+ Log.d(TAG, String.format(
+ "Monitoring sensor #%02d: Name = '%s', Type = 0x%x",
+ cur_index, def_sens.getName(), def_sens.getType()));
+ }
+ }
+ }
+
+ /**
+ * Returns the list of sensors found on the device.
+ * The list is computed once by {@link #SensorChannel(ControllerService)}.
+ *
+ * @return A non-null possibly-empty list of sensors.
+ */
+ public List<MonitoredSensor> getSensors() {
+ return mSensors;
+ }
+
+ /**
+ * Set the target update delay throttling per-sensor, in milliseconds.
+ * <p/>
+ * For example setting it to 1000/50 means that updates for a <em>given</em> sensor
+ * faster than 50 fps is discarded.
+ *
+ * @param updateTargetMs 0 to disable throttling, otherwise a > 0 millisecond minimum
+ * between sensor updates.
+ */
+ public void setUpdateTargetMs(long updateTargetMs) {
+ mUpdateTargetMs = updateTargetMs;
+ }
+
+ /**
+ * Returns the actual average time in milliseconds between same-sensor updates.
+ *
+ * @return The actual average time in milliseconds between same-sensor updates or 0.
+ */
+ public long getActualUpdateMs() {
+ return mGlobalAvgUpdateMs;
+ }
+
+ /*
+ * Channel abstract implementation.
+ */
+
+ /**
+ * This method is invoked when this channel is fully connected with its
+ * counterpart in the emulator.
+ */
+ @Override
+ public void onEmulatorConnected() {
+ // Emulation is now possible. Note though that it will start only after
+ // emulator tells us so with SENSORS_START command.
+ enable();
+ }
+
+ /**
+ * This method is invoked when this channel loses connection with its
+ * counterpart in the emulator.
+ */
+ @Override
+ public void onEmulatorDisconnected() {
+ // Stop sensor event callbacks.
+ stopSensors();
+ }
+
+ /**
+ * A query has been received from the emulator.
+ *
+ * @param query_id Identifies the query. This ID should be used when
+ * replying to the query.
+ * @param query_type Query type.
+ * @param query_data Query data.
+ */
+ @Override
+ public void onEmulatorQuery(int query_id, int query_type, ByteBuffer query_data) {
+ switch (query_type) {
+ case ProtocolConstants.SENSORS_QUERY_LIST:
+ // Preallocate large response buffer.
+ ByteBuffer resp = ByteBuffer.allocate(1024);
+ resp.order(getEndian());
+ // Iterate through the list of monitored sensors, dumping them
+ // into the response buffer.
+ for (MonitoredSensor sensor : mSensors) {
+ // Entry for each sensor must contain:
+ // - an integer for its ID
+ // - a zero-terminated emulator-friendly name.
+ final byte[] name = sensor.getEmulatorFriendlyName().getBytes();
+ final int required_size = 4 + name.length + 1;
+ resp = ExpandIf(resp, required_size);
+ resp.putInt(sensor.getType());
+ resp.put(name);
+ resp.put((byte) 0);
+ }
+ // Terminating entry contains single -1 integer.
+ resp = ExpandIf(resp, 4);
+ resp.putInt(-1);
+ sendQueryResponse(query_id, resp);
+ return;
+
+ default:
+ Loge("Unknown query " + query_type);
+ return;
+ }
+ }
+
+ /**
+ * A message has been received from the emulator.
+ *
+ * @param msg_type Message type.
+ * @param msg_data Packet received from the emulator.
+ */
+ @Override
+ public void onEmulatorMessage(int msg_type, ByteBuffer msg_data) {
+ switch (msg_type) {
+ case ProtocolConstants.SENSORS_START:
+ Log.v(TAG, "Starting sensors emulation.");
+ startSensors();
+ break;
+ case ProtocolConstants.SENSORS_STOP:
+ Log.v(TAG, "Stopping sensors emulation.");
+ stopSensors();
+ break;
+ case ProtocolConstants.SENSORS_ENABLE:
+ String enable_name = new String(msg_data.array());
+ Log.v(TAG, "Enabling sensor: " + enable_name);
+ onEnableSensor(enable_name);
+ break;
+ case ProtocolConstants.SENSORS_DISABLE:
+ String disable_name = new String(msg_data.array());
+ Log.v(TAG, "Disabling sensor: " + disable_name);
+ onDisableSensor(disable_name);
+ break;
+ default:
+ Loge("Unknown message type " + msg_type);
+ break;
+ }
+ }
+
+ /**
+ * Handles 'enable' message.
+ *
+ * @param name Emulator-friendly name of a sensor to enable, or "all" to
+ * enable all sensors.
+ */
+ private void onEnableSensor(String name) {
+ if (name.contentEquals("all")) {
+ // Enable all sensors.
+ for (MonitoredSensor sensor : mSensors) {
+ sensor.enableSensor();
+ }
+ } else {
+ // Lookup sensor by emulator-friendly name.
+ final MonitoredSensor sensor = getSensorByEFN(name);
+ if (sensor != null) {
+ sensor.enableSensor();
+ }
+ }
+ }
+
+ /**
+ * Handles 'disable' message.
+ *
+ * @param name Emulator-friendly name of a sensor to disable, or "all" to
+ * disable all sensors.
+ */
+ private void onDisableSensor(String name) {
+ if (name.contentEquals("all")) {
+ // Disable all sensors.
+ for (MonitoredSensor sensor : mSensors) {
+ sensor.disableSensor();
+ }
+ } else {
+ // Lookup sensor by emulator-friendly name.
+ MonitoredSensor sensor = getSensorByEFN(name);
+ if (sensor != null) {
+ sensor.disableSensor();
+ }
+ }
+ }
+
+ /**
+ * Start listening to all monitored sensors.
+ */
+ private void startSensors() {
+ for (MonitoredSensor sensor : mSensors) {
+ sensor.startListening();
+ }
+ }
+
+ /**
+ * Stop listening to all monitored sensors.
+ */
+ private void stopSensors() {
+ for (MonitoredSensor sensor : mSensors) {
+ sensor.stopListening();
+ }
+ }
+
+ /***************************************************************************
+ * Internals
+ **************************************************************************/
+
+ /**
+ * Checks if a sensor for the given type is already monitored.
+ *
+ * @param type Sensor type (one of the Sensor.TYPE_XXX constants)
+ * @return true if a sensor for the given type is already monitored, or
+ * false if the sensor is not monitored.
+ */
+ private boolean isSensorTypeAlreadyMonitored(int type) {
+ for (MonitoredSensor sensor : mSensors) {
+ if (sensor.getType() == type) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Looks up a monitored sensor by its emulator-friendly name.
+ *
+ * @param name Emulator-friendly name to look up the monitored sensor for.
+ * @return Monitored sensor for the fiven name, or null if sensor was not
+ * found.
+ */
+ private MonitoredSensor getSensorByEFN(String name) {
+ for (MonitoredSensor sensor : mSensors) {
+ if (sensor.mEmulatorFriendlyName.contentEquals(name)) {
+ return sensor;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Encapsulates a sensor that is being monitored. To monitor sensor changes
+ * each monitored sensor registers with sensor manager as a sensor listener.
+ * To control sensor monitoring from the UI, each monitored sensor has two
+ * UI controls associated with it: - A check box (named after sensor) that
+ * can be used to enable, or disable listening to the sensor changes. - A
+ * text view where current sensor value is displayed.
+ */
+ public class MonitoredSensor {
+ /** Sensor to monitor. */
+ private final Sensor mSensor;
+ /** The sensor name to display in the UI. */
+ private String mUiName = "";
+ /** Text view displaying the value of the sensor. */
+ private String mValue = null;
+ /** Emulator-friendly name for the sensor. */
+ private String mEmulatorFriendlyName;
+ /** Formats string to show in the TextView. */
+ private String mTextFmt;
+ /** Sensor values. */
+ private float[] mValues = new float[3];
+ /**
+ * Enabled state. This state is controlled by the emulator, that
+ * maintains its own list of sensors. So, if a sensor is missing, or is
+ * disabled in the emulator, it should be disabled in this application.
+ */
+ private boolean mEnabledByEmulator = false;
+ /** User-controlled enabled state. */
+ private boolean mEnabledByUser = true;
+ /** Sensor event listener for this sensor. */
+ private final OurSensorEventListener mListener = new OurSensorEventListener();
+
+ /**
+ * Constructs MonitoredSensor instance, and register the listeners.
+ *
+ * @param sensor Sensor to monitor.
+ */
+ MonitoredSensor(Sensor sensor) {
+ mSensor = sensor;
+ mEnabledByUser = true;
+
+ // Set appropriate sensor name depending on the type. Unfortunately,
+ // we can't really use sensor.getName() here, since the value it
+ // returns (although resembles the purpose) is a bit vaguer than it
+ // should be. Also choose an appropriate format for the strings that
+ // display sensor's value.
+ switch (sensor.getType()) {
+ case Sensor.TYPE_ACCELEROMETER:
+ mUiName = "Accelerometer";
+ mTextFmt = "%+.2f %+.2f %+.2f";
+ mEmulatorFriendlyName = "acceleration";
+ break;
+ case 9: // Sensor.TYPE_GRAVITY is missing in API 7
+ mUiName = "Gravity";
+ mTextFmt = "%+.2f %+.2f %+.2f";
+ mEmulatorFriendlyName = "gravity";
+ break;
+ case Sensor.TYPE_GYROSCOPE:
+ mUiName = "Gyroscope";
+ mTextFmt = "%+.2f %+.2f %+.2f";
+ mEmulatorFriendlyName = "gyroscope";
+ break;
+ case Sensor.TYPE_LIGHT:
+ mUiName = "Light";
+ mTextFmt = "%.0f";
+ mEmulatorFriendlyName = "light";
+ break;
+ case 10: // Sensor.TYPE_LINEAR_ACCELERATION is missing in API 7
+ mUiName = "Linear acceleration";
+ mTextFmt = "%+.2f %+.2f %+.2f";
+ mEmulatorFriendlyName = "linear-acceleration";
+ break;
+ case Sensor.TYPE_MAGNETIC_FIELD:
+ mUiName = "Magnetic field";
+ mTextFmt = "%+.2f %+.2f %+.2f";
+ mEmulatorFriendlyName = "magnetic-field";
+ break;
+ case Sensor.TYPE_ORIENTATION:
+ mUiName = "Orientation";
+ mTextFmt = "%+03.0f %+03.0f %+03.0f";
+ mEmulatorFriendlyName = "orientation";
+ break;
+ case Sensor.TYPE_PRESSURE:
+ mUiName = "Pressure";
+ mTextFmt = "%.0f";
+ mEmulatorFriendlyName = "pressure";
+ break;
+ case Sensor.TYPE_PROXIMITY:
+ mUiName = "Proximity";
+ mTextFmt = "%.0f";
+ mEmulatorFriendlyName = "proximity";
+ break;
+ case 11: // Sensor.TYPE_ROTATION_VECTOR is missing in API 7
+ mUiName = "Rotation";
+ mTextFmt = "%+.2f %+.2f %+.2f";
+ mEmulatorFriendlyName = "rotation";
+ break;
+ case Sensor.TYPE_TEMPERATURE:
+ mUiName = "Temperature";
+ mTextFmt = "%.0f";
+ mEmulatorFriendlyName = "temperature";
+ break;
+ default:
+ mUiName = "<Unknown>";
+ mTextFmt = "N/A";
+ mEmulatorFriendlyName = "unknown";
+ if (DEBUG) Loge("Unknown sensor type " + mSensor.getType() +
+ " for sensor " + mSensor.getName());
+ break;
+ }
+ }
+
+ /**
+ * Get name for this sensor to display.
+ *
+ * @return Name for this sensor to display.
+ */
+ public String getUiName() {
+ return mUiName;
+ }
+
+ /**
+ * Gets current sensor value to display.
+ *
+ * @return Current sensor value to display.
+ */
+ public String getValue() {
+ if (mValue == null) {
+ float[] values = mValues;
+ mValue = String.format(mTextFmt, values[0], values[1], values[2]);
+ }
+ return mValue == null ? "??" : mValue;
+ }
+
+ /**
+ * Checks if monitoring of this this sensor has been enabled by
+ * emulator.
+ *
+ * @return true if monitoring of this this sensor has been enabled by
+ * emulator, or false if emulator didn't enable this sensor.
+ */
+ public boolean isEnabledByEmulator() {
+ return mEnabledByEmulator;
+ }
+
+ /**
+ * Checks if monitoring of this this sensor has been enabled by user.
+ *
+ * @return true if monitoring of this this sensor has been enabled by
+ * user, or false if user didn't enable this sensor.
+ */
+ public boolean isEnabledByUser() {
+ return mEnabledByUser;
+ }
+
+ /**
+ * Handles checked state change for the associated CheckBox. If check
+ * box is checked we will register sensor change listener. If it is
+ * unchecked, we will unregister sensor change listener.
+ */
+ public void onCheckedChanged(boolean isChecked) {
+ mEnabledByUser = isChecked;
+ if (isChecked) {
+ startListening();
+ } else {
+ stopListening();
+ }
+ }
+
+ /**
+ * Gets sensor type.
+ *
+ * @return Sensor type as one of the Sensor.TYPE_XXX constants.
+ */
+ private int getType() {
+ return mSensor.getType();
+ }
+
+ /**
+ * Gets sensor's emulator-friendly name.
+ *
+ * @return Sensor's emulator-friendly name.
+ */
+ private String getEmulatorFriendlyName() {
+ return mEmulatorFriendlyName;
+ }
+
+ /**
+ * Starts monitoring the sensor.
+ * NOTE: This method is called from outside of the UI thread.
+ */
+ private void startListening() {
+ if (mEnabledByEmulator && mEnabledByUser) {
+ if (DEBUG) Log.d(TAG, "+++ Sensor " + getEmulatorFriendlyName() + " is started.");
+ mSenMan.registerListener(mListener, mSensor, SensorManager.SENSOR_DELAY_FASTEST);
+ }
+ }
+
+ /**
+ * Stops monitoring the sensor.
+ * NOTE: This method is called from outside of the UI thread.
+ */
+ private void stopListening() {
+ if (DEBUG) Log.d(TAG, "--- Sensor " + getEmulatorFriendlyName() + " is stopped.");
+ mSenMan.unregisterListener(mListener);
+ }
+
+ /**
+ * Enables sensor events.
+ * NOTE: This method is called from outside of the UI thread.
+ */
+ private void enableSensor() {
+ if (DEBUG) Log.d(TAG, ">>> Sensor " + getEmulatorFriendlyName() + " is enabled.");
+ mEnabledByEmulator = true;
+ mValue = null;
+
+ Message msg = Message.obtain();
+ msg.what = SENSOR_STATE_CHANGED;
+ msg.obj = MonitoredSensor.this;
+ notifyUiHandlers(msg);
+ }
+
+ /**
+ * Disables sensor events.
+ * NOTE: This method is called from outside of the UI thread.
+ */
+ private void disableSensor() {
+ if (DEBUG) Log.w(TAG, "<<< Sensor " + getEmulatorFriendlyName() + " is disabled.");
+ mEnabledByEmulator = false;
+ mValue = "Disabled by emulator";
+
+ Message msg = Message.obtain();
+ msg.what = SENSOR_STATE_CHANGED;
+ msg.obj = MonitoredSensor.this;
+ notifyUiHandlers(msg);
+ }
+
+ private class OurSensorEventListener implements SensorEventListener {
+ /** Last update's time-stamp in local thread millisecond time. */
+ private long mLastUpdateTS = 0;
+ /** Last display update time-stamp. */
+ private long mLastDisplayTS = 0;
+ /** Preallocated buffer for change notification message. */
+ private final ByteBuffer mChangeMsg = ByteBuffer.allocate(64);
+
+ /**
+ * Handles "sensor changed" event.
+ * This is an implementation of the SensorEventListener interface.
+ */
+ @Override
+ public void onSensorChanged(SensorEvent event) {
+ long now = SystemClock.elapsedRealtime();
+
+ long deltaMs = 0;
+ if (mLastUpdateTS != 0) {
+ deltaMs = now - mLastUpdateTS;
+ if (mUpdateTargetMs > 0 && deltaMs < mUpdateTargetMs) {
+ // New sample is arriving too fast. Discard it.
+ return;
+ }
+ }
+
+ // Format and post message for the emulator.
+ float[] values = event.values;
+ final int len = values.length;
+
+ mChangeMsg.order(getEndian());
+ mChangeMsg.position(0);
+ mChangeMsg.putInt(getType());
+ mChangeMsg.putFloat(values[0]);
+ if (len > 1) {
+ mChangeMsg.putFloat(values[1]);
+ if (len > 2) {
+ mChangeMsg.putFloat(values[2]);
+ }
+ }
+ postMessage(ProtocolConstants.SENSORS_SENSOR_EVENT, mChangeMsg);
+
+ // Computes average update time for this sensor and average globally.
+ if (mLastUpdateTS != 0) {
+ if (mGlobalAvgUpdateMs != 0) {
+ mGlobalAvgUpdateMs = (mGlobalAvgUpdateMs + deltaMs) / 2;
+ } else {
+ mGlobalAvgUpdateMs = deltaMs;
+ }
+ }
+ mLastUpdateTS = now;
+
+ // Update the UI for the sensor, with a static throttling of 10 fps max.
+ if (hasUiHandler()) {
+ if (mLastDisplayTS != 0) {
+ long uiDeltaMs = now - mLastDisplayTS;
+ if (uiDeltaMs < 1000 / 4 /* 4fps in ms */) {
+ // Skip this UI update
+ return;
+ }
+ }
+ mLastDisplayTS = now;
+
+ mValues[0] = values[0];
+ if (len > 1) {
+ mValues[1] = values[1];
+ if (len > 2) {
+ mValues[2] = values[2];
+ }
+ }
+ mValue = null;
+
+ Message msg = Message.obtain();
+ msg.what = SENSOR_DISPLAY_MODIFIED;
+ msg.obj = MonitoredSensor.this;
+ notifyUiHandlers(msg);
+ }
+
+ if (DEBUG) {
+ long now2 = SystemClock.elapsedRealtime();
+ long processingTimeMs = now2 - now;
+ Log.d(TAG, String.format("glob %d - local %d > target %d - processing %d -- %s",
+ mGlobalAvgUpdateMs, deltaMs, mUpdateTargetMs, processingTimeMs,
+ mSensor.getName()));
+ }
+ }
+
+ /**
+ * Handles "sensor accuracy changed" event.
+ * This is an implementation of the SensorEventListener interface.
+ */
+ @Override
+ public void onAccuracyChanged(Sensor sensor, int accuracy) {
+ }
+ }
+ } // MonitoredSensor
+
+ /***************************************************************************
+ * Logging wrappers
+ **************************************************************************/
+
+ private void Loge(String log) {
+ mService.addError(log);
+ Log.e(TAG, log);
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/lib/Channel.java b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/lib/Channel.java
new file mode 100644
index 0000000..639f4cf
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/lib/Channel.java
@@ -0,0 +1,795 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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 com.android.tools.sdkcontroller.lib;
+
+import android.os.Message;
+import android.util.Log;
+
+import com.android.tools.sdkcontroller.service.ControllerService;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Encapsulates basics of a connection with the emulator.
+ * This class must be used as a base class for all the channelss that provide
+ * particular type of emulation (such as sensors, multi-touch, etc.)
+ * <p/>
+ * Essentially, Channel is an implementation of a particular emulated functionality,
+ * that defines logical format of the data transferred between the emulator and
+ * SDK controller. For instance, "sensors" is a channel that emulates sensors,
+ * and transfers sensor value changes from the device to the emulator. "Multi-touch"
+ * is a channel that supports multi-touch emulation, and transfers multi-touch
+ * events to the emulator, while receiving frame buffer updates from the emulator.
+ * <p/>
+ * Besides connection with the emulator, each channel may contain one or more UI
+ * components associated with it. This class provides some basics for UI support,
+ * including:
+ * <p/>
+ * - Providing a way to register / unregister a UI component with the channel.
+ * <p/>
+ * - Implementing posting of messages to emulator in opposite to direct message
+ * sent. This is due to requirement that UI threads are prohibited from doing
+ * network I/O.
+ */
+public abstract class Channel {
+
+ /**
+ * Encapsulates a message posted to be sent to the emulator from a worker
+ * thread. This class is used to describe a message that is posted in UI
+ * thread, and then picked up in the worker thread.
+ */
+ private class SdkControllerMessage {
+ /** Message type. */
+ private int mMessageType;
+ /** Message data (can be null). */
+ private byte[] mMessage;
+ /** Message data size */
+ private int mMessageSize;
+
+ /**
+ * Construct message from an array.
+ *
+ * @param type Message type.
+ * @param message Message data. Message data size is defined by size of
+ * the array.
+ */
+ public SdkControllerMessage(int type, byte[] message) {
+ mMessageType = type;
+ mMessage = message;
+ mMessageSize = (message != null) ? message.length : 0;
+ }
+
+ /**
+ * Construct message from a ByteBuffer.
+ *
+ * @param type Message type.
+ * @param message Message data. Message data size is defined by
+ * position() property of the ByteBuffer.
+ */
+ public SdkControllerMessage(int type, ByteBuffer message) {
+ mMessageType = type;
+ if (message != null) {
+ mMessage = message.array();
+ mMessageSize = message.position();
+ } else {
+ mMessage = null;
+ mMessageSize = 0;
+ }
+ }
+
+ /**
+ * Gets message type.
+
+ *
+ * @return Message type.
+ */
+ public int getMessageType() {
+ return mMessageType;
+ }
+
+ /**
+ * Gets message buffer.
+ *
+ * @return Message buffer.
+ */
+ public byte[] getMessage() {
+ return mMessage;
+ }
+
+ /**
+ * Gets message buffer size.
+ *
+ * @return Message buffer size.
+ */
+ public int getMessageSize() {
+ return mMessageSize;
+ }
+ } // SdkControllerMessage
+
+ /*
+ * Names for currently implemented SDK controller channels.
+ */
+
+ /** Name for a channel that handles sensors emulation */
+ public static final String SENSOR_CHANNEL = "sensors";
+ /** Name for a channel that handles multi-touch emulation */
+ public static final String MULTITOUCH_CHANNEL = "multi-touch";
+
+ /*
+ * Types of messages internally used by Channel class.
+ */
+
+ /** Service-side emulator is connected. */
+ private static final int MSG_CONNECTED = -1;
+ /** Service-side emulator is disconnected. */
+ private static final int MSG_DISCONNECTED = -2;
+ /** Service-side emulator is enabled. */
+ private static final int MSG_ENABLED = -3;
+ /** Service-side emulator is disabled. */
+ private static final int MSG_DISABLED = -4;
+
+ /** Tag for logging messages. */
+ private static final String TAG = "SdkControllerChannel";
+ /** Controls debug log. */
+ private static final boolean DEBUG = false;
+
+ /** Service that has created this object. */
+ protected ControllerService mService;
+
+ /*
+ * Socket stuff.
+ */
+
+ /** Socket to use to to communicate with the emulator. */
+ private Socket mSocket = null;
+ /** Channel name ("sensors", "multi-touch", etc.) */
+ private String mChannelName;
+ /** Endianness of data transferred in this channel. */
+ private ByteOrder mEndian;
+
+ /*
+ * Message posting support.
+ */
+
+ /** Total number of messages posted in this channel */
+ private final AtomicInteger mMsgCount = new AtomicInteger(0);
+ /** Flags whether or not message thread is running. */
+ private volatile boolean mRunMsgQueue = true;
+ /** Queue of messages pending transmission. */
+ private final BlockingQueue<SdkControllerMessage>
+ mMsgQueue = new LinkedBlockingQueue<SdkControllerMessage>();
+ /** Message thread */
+ private final Thread mMsgThread;
+
+ /*
+ * UI support.
+ */
+
+ /** Lists UI handlers attached to this channel. */
+ private final List<android.os.Handler> mUiHandlers = new ArrayList<android.os.Handler>();
+
+ /*
+ * Abstract methods.
+ */
+
+ /**
+ * This method is invoked when this channel is fully connected with its
+ * counterpart in the emulator.
+ */
+ public abstract void onEmulatorConnected();
+
+ /**
+ * This method is invoked when this channel loses connection with its
+ * counterpart in the emulator.
+ */
+ public abstract void onEmulatorDisconnected();
+
+ /**
+ * A message has been received from the emulator.
+ *
+ * @param msg_type Message type.
+ * @param msg_data Message data. Message data size is defined by the length
+ * of the array wrapped by the ByteBuffer.
+ */
+ public abstract void onEmulatorMessage(int msg_type, ByteBuffer msg_data);
+
+ /**
+ * A query has been received from the emulator.
+ *
+ * @param query_id Identifies the query. This ID must be used when replying
+ * to the query.
+ * @param query_type Query type.
+ * @param query_data Query data. Query data size is defined by the length of
+ * the array wrapped by the ByteBuffer.
+ */
+ public abstract void onEmulatorQuery(int query_id, int query_type, ByteBuffer query_data);
+
+ /*
+ * Channel implementation.
+ */
+
+ /**
+ * Constructs Channel instance.
+ *
+ * @param name Channel name.
+ */
+ public Channel(ControllerService service, String name) {
+ mService = service;
+ mChannelName = name;
+ // Start the worker thread for posted messages.
+ mMsgThread = new Thread(new Runnable() {
+ @Override
+ public void run() {
+ if (DEBUG) Log.d(TAG, "MsgThread.started-" + mChannelName);
+ while (mRunMsgQueue) {
+ try {
+ SdkControllerMessage msg = mMsgQueue.take();
+ if (msg != null) {
+ sendMessage(
+ msg.getMessageType(), msg.getMessage(), msg.getMessageSize());
+ mMsgCount.incrementAndGet();
+ }
+ } catch (InterruptedException e) {
+ Log.e(TAG, "MsgThread-" + mChannelName, e);
+ }
+ }
+ if (DEBUG) Log.d(TAG, "MsgThread.terminate-" + mChannelName);
+ }
+ }, "MsgThread-" + name);
+ mMsgThread.start();
+ if (DEBUG) Log.d(TAG, "Channel is constructed for " + mChannelName);
+ }
+
+ /**
+ * Gets name for this channel.
+ *
+ * @return Emulator name.
+ */
+ public String getChannelName() {
+ return mChannelName;
+ }
+
+ /**
+ * Gets endianness for this channel.
+ *
+ * @return Channel endianness.
+ */
+ public ByteOrder getEndian() {
+ return mEndian;
+ }
+
+ /**
+ * Gets number of messages sent via postMessage method.
+ *
+ * @return Number of messages sent via postMessage method.
+ */
+ public int getMsgSentCount() {
+ return mMsgCount.get();
+ }
+
+ /**
+ * Checks if this channel is connected with the emulator.
+ *
+ * @return true if this channel is connected with the emulator, or false if it is
+ * not connected.
+ */
+ public boolean isConnected() {
+ // Use local copy of the socket, ensuring it's not going to NULL while
+ // we're working with it. If it gets closed, while we're in the middle
+ // of data transfer - it's OK, since it will produce an exception, and
+ // the caller will gracefully handle it.
+ //
+ // Same technique is used everywhere in this class where mSocket member
+ // is touched.
+ Socket socket = mSocket;
+ return socket != null && socket.isConnected();
+ }
+
+ /**
+ * Establishes connection with the emulator. This method is called by Connection
+ * object when emulator successfully connects to this channel, or this channel
+ * gets registered, and there is a pending socket connection for it.
+ *
+ * @param socket Channel connection socket.
+ */
+ public void connect(Socket socket) {
+ mSocket = socket;
+ mEndian = socket.getEndian();
+ Logv("Channel " + mChannelName + " is now connected with the emulator.");
+ // Notify the emulator that connection is established.
+ sendMessage(MSG_CONNECTED, (byte[]) null);
+
+ // Let the derived class know that emulator is connected, and start the
+ // I/O loop in which we will receive data from the emulator. Note that
+ // we start the loop after onEmulatorConnected call, since we don't want
+ // to start dispatching messages before the derived class could set
+ // itself up for receiving them.
+ onEmulatorConnected();
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ runIOLooper();
+ }
+ }, "ChannelIoLoop").start();
+ mService.notifyStatusChanged();
+ }
+
+ /**
+ * Disconnects this channel from the emulator.
+ *
+ * @return true if this channel has been disconnected in this call, or false if
+ * channel has been already disconnected when this method has been called.
+ */
+ public boolean disconnect() {
+ // This is the only place in this class where we will null the
+ // socket object. Since this method can be called concurrently from
+ // different threads, lets do this under the lock.
+ Socket socket;
+ synchronized (this) {
+ socket = mSocket;
+ mSocket = null;
+ }
+ if (socket != null) {
+ // Notify the emulator about channel disconnection before we close
+ // the communication socket.
+ try {
+ sendMessage(socket, MSG_DISCONNECTED, null, 0);
+ } catch (IOException e) {
+ // Ignore I/O exception at this point. We don't care about
+ // it, since the socket is being closed anyways.
+ }
+ // This will eventually stop I/O looper thread.
+ socket.close();
+ mService.notifyStatusChanged();
+ }
+ return socket != null;
+ }
+
+ /**
+ * Enables the emulation. Typically, this method is called for channels that are
+ * dependent on UI to handle the emulation. For instance, multi-touch emulation is
+ * disabled until at least one UI component is attached to the channel. So, for
+ * multi-touch emulation this method is called when UI gets attached to the channel.
+ */
+ public void enable() {
+ postMessage(MSG_ENABLED, (byte[]) null);
+ mService.notifyStatusChanged();
+ }
+
+ /**
+ * Disables the emulation. Just the opposite to enable(). For multi-touch this
+ * method is called when UI detaches from the channel.
+ */
+ public void disable() {
+ postMessage(MSG_DISABLED, (byte[]) null);
+ mService.notifyStatusChanged();
+ }
+
+ /**
+ * Sends message to the emulator.
+ *
+ * @param socket Socket to send the message to.
+ * @param msg_type Message type.
+ * @param msg Message data to send.
+ * @param len Byte size of message data.
+ * @throws IOException
+ */
+ private void sendMessage(Socket socket, int msg_type, byte[] msg, int len)
+ throws IOException {
+ // In async environment we must have message header and message data in
+ // one block to prevent messages from other threads getting between the
+ // header and the data. So, we can't sent header, and then the data. We
+ // must combine them in one data block instead.
+ ByteBuffer bb = ByteBuffer.allocate(ProtocolConstants.MESSAGE_HEADER_SIZE + len);
+ bb.order(mEndian);
+
+ // Initialize message header.
+ bb.putInt(ProtocolConstants.PACKET_SIGNATURE);
+ bb.putInt(ProtocolConstants.MESSAGE_HEADER_SIZE + len);
+ bb.putInt(ProtocolConstants.PACKET_TYPE_MESSAGE);
+ bb.putInt(msg_type);
+
+ // Save message data (if there is any).
+ if (len != 0) {
+ bb.put(msg, 0, len);
+ }
+
+ socket.send(bb.array());
+ }
+
+ /**
+ * Sends message to the emulator.
+ *
+ * @param msg_type Message type.
+ * @param msg Message data to send. Message size is defined by the size of
+ * the array.
+ * @return true on success, or false if data transmission has failed.
+ */
+ public boolean sendMessage(int msg_type, byte[] msg, int msg_len) {
+ try {
+ Socket socket = mSocket;
+ if (socket != null) {
+ sendMessage(socket, msg_type, msg, msg_len);
+ return true;
+ } else {
+ Logw("sendMessage is called on disconnected Channel " + mChannelName);
+ }
+ } catch (IOException e) {
+ Loge("Exception " + e + " in sendMessage for Channel " + mChannelName);
+ onIoFailure();
+ }
+ return false;
+ }
+
+ /**
+ * Sends message to the emulator.
+ *
+ * @param msg_type Message type.
+ * @param msg Message data to send. Message size is defined by the size of
+ * the array.
+ * @return true on success, or false if data transmission has failed.
+ */
+ public boolean sendMessage(int msg_type, byte[] msg) {
+ try {
+ Socket socket = mSocket;
+ if (socket != null) {
+ if (msg != null) {
+ sendMessage(socket, msg_type, msg, msg.length);
+ } else {
+ sendMessage(socket, msg_type, null, 0);
+ }
+ return true;
+ } else {
+ Logw("sendMessage is called on disconnected Channel " + mChannelName);
+ }
+ } catch (IOException e) {
+ Loge("Exception " + e + " in sendMessage for Channel " + mChannelName);
+ onIoFailure();
+ }
+ return false;
+ }
+
+ /**
+ * Sends message to the emulator.
+ *
+ * @param msg_type Message type.
+ * @param msg Message data to send. Message size is defined by the
+ * position() property of the ByteBuffer.
+ * @return true on success, or false if data transmission has failed.
+ */
+ public boolean sendMessage(int msg_type, ByteBuffer msg) {
+ try {
+ Socket socket = mSocket;
+ if (socket != null) {
+ if (msg != null) {
+ sendMessage(socket, msg_type, msg.array(), msg.position());
+ } else {
+ sendMessage(socket, msg_type, null, 0);
+ }
+ return true;
+ } else {
+ Logw("sendMessage is called on disconnected Channel " + mChannelName);
+ }
+ } catch (IOException e) {
+ Loge("Exception " + e + " in sendMessage for Channel " + mChannelName);
+ onIoFailure();
+ }
+ return false;
+ }
+
+ /**
+ * Posts message to the emulator.
+ *
+ * @param msg_type Message type.
+ * @param msg Message data to post. Message size is defined by the size of
+ * the array.
+ */
+ public void postMessage(int msg_type, byte[] msg) {
+ try {
+ mMsgQueue.put(new SdkControllerMessage(msg_type, msg));
+ } catch (InterruptedException e) {
+ Log.e(TAG, "mMessageQueue.put", e);
+ }
+ }
+
+ /**
+ * Posts message to the emulator.
+ *
+ * @param msg_type Message type.
+ * @param msg Message data to post. Message size is defined by the
+ * position() property of the ByteBuffer.
+ */
+ public void postMessage(int msg_type, ByteBuffer msg) {
+ try {
+ mMsgQueue.put(new SdkControllerMessage(msg_type, msg));
+ } catch (InterruptedException e) {
+ Log.e(TAG, "mMessageQueue.put", e);
+ }
+ }
+
+ /**
+ * Sends query response to the emulator.
+ *
+ * @param query_id Query identifier.
+ * @param qresp Response to the query.
+ * @param len Byte size of query response data.
+ * @return true on success, or false if data transmission has failed.
+ */
+ public boolean sendQueryResponse(int query_id, byte[] qresp, int len) {
+ // Just like with messages, we must combine header and data in a single
+ // transmitting block.
+ ByteBuffer bb = ByteBuffer.allocate(ProtocolConstants.QUERY_RESP_HEADER_SIZE + len);
+ bb.order(mEndian);
+
+ // Initialize response header.
+ bb.putInt(ProtocolConstants.PACKET_SIGNATURE);
+ bb.putInt(ProtocolConstants.QUERY_RESP_HEADER_SIZE + len);
+ bb.putInt(ProtocolConstants.PACKET_TYPE_QUERY_RESPONSE);
+ bb.putInt(query_id);
+
+ // Save response data (if there is any).
+ if (qresp != null && len != 0) {
+ bb.put(qresp, 0, len);
+ }
+
+ // Send the response.
+ try {
+ Socket socket = mSocket;
+ if (socket != null) {
+ socket.send(bb.array());
+ return true;
+ } else {
+ Logw("sendQueryResponse is called on disconnected Channel "
+ + mChannelName);
+ }
+ } catch (IOException e) {
+ Loge("Exception " + e + " in sendQueryResponse for Channel " + mChannelName);
+ onIoFailure();
+ }
+ return false;
+ }
+
+ /**
+ * Sends query response to the emulator.
+ *
+ * @param query_id Query identifier.
+ * @param qresp Response to the query. Query response size is defined by the
+ * size of the array.
+ * @return true on success, or false if data transmission has failed.
+ */
+ public boolean sendQueryResponse(int query_id, byte[] qresp) {
+ return (qresp != null) ? sendQueryResponse(query_id, qresp, qresp.length) :
+ sendQueryResponse(query_id, null, 0);
+ }
+
+ /**
+ * Sends query response to the emulator.
+ *
+ * @param query_id Query identifier.
+ * @param qresp Response to the query. Query response size is defined by the
+ * position() property of the ByteBuffer.
+ * @return true on success, or false if data transmission has failed.
+ */
+ public boolean sendQueryResponse(int query_id, ByteBuffer qresp) {
+ return (qresp != null) ? sendQueryResponse(query_id, qresp.array(), qresp.position()) :
+ sendQueryResponse(query_id, null, 0);
+ }
+
+ /**
+ * Handles an I/O failure occurred in the channel.
+ */
+ private void onIoFailure() {
+ // All I/O failures cause disconnection.
+ if (disconnect()) {
+ // Success of disconnect() indicates that I/O failure is not the
+ // result of a disconnection request, but is in deed an I/O
+ // failure. Report lost connection to the derived class.
+ Loge("Connection with the emulator has been lost in Channel " + mChannelName);
+ onEmulatorDisconnected();
+ }
+ }
+
+ /**
+ * Loops on the local socket, handling connection attempts.
+ */
+ private void runIOLooper() {
+ if (DEBUG) Log.d(TAG, "In I/O looper for Channel " + mChannelName);
+ // Initialize byte buffer large enough to receive packet header.
+ ByteBuffer header = ByteBuffer.allocate(ProtocolConstants.PACKET_HEADER_SIZE);
+ header.order(mEndian);
+ try {
+ // Since disconnection (which will null the mSocket) can be
+ // requested from outside of this thread, it's simpler just to make
+ // a copy of mSocket here, and work with that copy. Otherwise we
+ // will have to go through a complex synchronization algorithm that
+ // would decrease performance on normal runs. If socket gets closed
+ // while we're in the middle of transfer, an exception will occur,
+ // which we will catch and handle properly.
+ Socket socket = mSocket;
+ while (socket != null) {
+ // Reset header position.
+ header.position(0);
+ // This will receive total packet size + packet type.
+ socket.receive(header.array());
+ // First - signature.
+ final int signature = header.getInt();
+ assert signature == ProtocolConstants.PACKET_SIGNATURE;
+ // Next - packet size (including header).
+ int remains = header.getInt() - ProtocolConstants.PACKET_HEADER_SIZE;
+ // After the size comes packet type.
+ final int packet_type = header.getInt();
+
+ // Get the remainder of the data, and dispatch the packet to
+ // an appropriate handler.
+ switch (packet_type) {
+ case ProtocolConstants.PACKET_TYPE_MESSAGE:
+ // Read message header (one int: message type).
+ final int ext = ProtocolConstants.MESSAGE_HEADER_SIZE - ProtocolConstants.PACKET_HEADER_SIZE;
+ header.position(0);
+ socket.receive(header.array(), ext);
+ final int msg_type = header.getInt();
+
+ // Read message data.
+ remains -= ext;
+ final ByteBuffer msg_data = ByteBuffer.allocate(remains);
+ msg_data.order(mEndian);
+ socket.receive(msg_data.array());
+
+ // Dispatch message for handling.
+ onEmulatorMessage(msg_type, msg_data);
+ break;
+
+ case ProtocolConstants.PACKET_TYPE_QUERY:
+ // Read query ID and query type.
+ final int extq = ProtocolConstants.QUERY_HEADER_SIZE - ProtocolConstants.PACKET_HEADER_SIZE;
+ header.position(0);
+ socket.receive(header.array(), extq);
+ final int query_id = header.getInt();
+ final int query_type = header.getInt();
+
+ // Read query data.
+ remains -= extq;
+ final ByteBuffer query_data = ByteBuffer.allocate(remains);
+ query_data.order(mEndian);
+ socket.receive(query_data.array());
+
+ // Dispatch query for handling.
+ onEmulatorQuery(query_id, query_type, query_data);
+ break;
+
+ default:
+ // Unknown packet type. Just discard the remainder
+ // of the packet
+ Loge("Unknown packet type " + packet_type + " in Channel "
+ + mChannelName);
+ final byte[] discard_data = new byte[remains];
+ socket.receive(discard_data);
+ break;
+ }
+ socket = mSocket;
+ }
+ } catch (IOException e) {
+ Loge("Exception " + e + " in I/O looper for Channel " + mChannelName);
+ onIoFailure();
+ }
+ if (DEBUG) Log.d(TAG, "Exiting I/O looper for Channel " + mChannelName);
+ }
+
+ /**
+ * Indicates any UI handler is currently registered with the channel. If no UI
+ * is displaying the channel's state, maybe the channel can skip UI related tasks.
+ *
+ * @return True if there's at least one UI handler registered.
+ */
+ public boolean hasUiHandler() {
+ return !mUiHandlers.isEmpty();
+ }
+
+ /**
+ * Registers a new UI handler.
+ *
+ * @param uiHandler A non-null UI handler to register. Ignored if the UI
+ * handler is null or already registered.
+ */
+ public void addUiHandler(android.os.Handler uiHandler) {
+ assert uiHandler != null;
+ if (uiHandler != null) {
+ if (!mUiHandlers.contains(uiHandler)) {
+ mUiHandlers.add(uiHandler);
+ }
+ }
+ }
+
+ /**
+ * Unregisters an UI handler.
+ *
+ * @param uiHandler A non-null UI listener to unregister. Ignored if the
+ * listener is null or already registered.
+ */
+ public void removeUiHandler(android.os.Handler uiHandler) {
+ assert uiHandler != null;
+ mUiHandlers.remove(uiHandler);
+ }
+
+ /**
+ * Protected method to be used by handlers to send an event to all UI
+ * handlers.
+ *
+ * @param event An integer event code with no specific parameters. To be
+ * defined by the handler itself.
+ */
+ protected void notifyUiHandlers(int event) {
+ for (android.os.Handler uiHandler : mUiHandlers) {
+ uiHandler.sendEmptyMessage(event);
+ }
+ }
+
+ /**
+ * Protected method to be used by handlers to send an event to all UI
+ * handlers.
+ *
+ * @param msg An event with parameters. To be defined by the handler itself.
+ */
+ protected void notifyUiHandlers(Message msg) {
+ for (android.os.Handler uiHandler : mUiHandlers) {
+ uiHandler.sendMessage(msg);
+ }
+ }
+
+ /**
+ * A helper routine that expands ByteBuffer to contain given number of extra
+ * bytes.
+ *
+ * @param buff Buffer to expand.
+ * @param extra Number of bytes that are required to be available in the
+ * buffer after current position()
+ * @return ByteBuffer, containing required number of available bytes.
+ */
+ public ByteBuffer ExpandIf(ByteBuffer buff, int extra) {
+ if (extra <= buff.remaining()) {
+ return buff;
+ }
+ ByteBuffer ret = ByteBuffer.allocate(buff.position() + extra);
+ ret.order(buff.order());
+ ret.put(buff.array(), 0, buff.position());
+ return ret;
+ }
+
+ /***************************************************************************
+ * Logging wrappers
+ **************************************************************************/
+
+ private void Loge(String log) {
+ mService.addError(log);
+ Log.e(TAG, log);
+ }
+
+ private void Logw(String log) {
+ Log.w(TAG, log);
+ }
+
+ private void Logv(String log) {
+ Log.v(TAG, log);
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/lib/Connection.java b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/lib/Connection.java
new file mode 100644
index 0000000..cb50869
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/lib/Connection.java
@@ -0,0 +1,412 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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 com.android.tools.sdkcontroller.lib;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.ArrayList;
+import java.util.List;
+
+import android.util.Log;
+import android.net.LocalServerSocket;
+import android.net.LocalSocket;
+
+import com.android.tools.sdkcontroller.lib.Channel;
+import com.android.tools.sdkcontroller.service.ControllerService;
+
+/**
+ * Encapsulates a connection between SdkController service and the emulator. On
+ * the device side, the connection is bound to the UNIX-domain socket named
+ * 'android.sdk.controller'. On the emulator side the connection is established
+ * via TCP port that is used to forward I/O traffic on the host machine to
+ * 'android.sdk.controller' socket on the device. Typically, the port forwarding
+ * can be enabled using adb command:
+ * <p/>
+ * 'adb forward tcp:<TCP port number> localabstract:android.sdk.controller'
+ * <p/>
+ * The way communication between the emulator and SDK controller service works
+ * is as follows:
+ * <p/>
+ * 1. Both sides, emulator and the service have components that implement a particular
+ * type of emulation. For instance, AndroidSensorsPort in the emulator, and
+ * SensorChannel in the application implement sensors emulation.
+ * Emulation channels are identified by unique names. For instance, sensor emulation
+ * is done via "sensors" channel, multi-touch emulation is done via "multi-touch"
+ * channel, etc.
+ * <p/>
+ * 2. Channels are connected to emulator via separate socket instance (though all
+ * of the connections share the same socket address).
+ * <p/>
+ * 3. Connection is initiated by the emulator side, while the service provides
+ * its side (a channel) that implement functionality and exchange protocol required
+ * by the requested type of emulation.
+ * <p/>
+ * Given that, the main responsibilities of this class are:
+ * <p/>
+ * 1. Bind to "android.sdk.controller" socket, listening to emulator connections.
+ * <p/>
+ * 2. Maintain a list of service-side channels registered by the application.
+ * <p/>
+ * 3. Bind emulator connection with service-side channel via port name, provided by
+ * the emulator.
+ * <p/>
+ * 4. Monitor connection state with the emulator, and automatically restore the
+ * connection once it is lost.
+ */
+public class Connection {
+ /** UNIX-domain name reserved for SDK controller. */
+ public static final String SDK_CONTROLLER_PORT = "android.sdk.controller";
+ /** Tag for logging messages. */
+ private static final String TAG = "SdkControllerConnection";
+ /** Controls debug logging */
+ private static final boolean DEBUG = false;
+
+ /** Server socket used to listen to emulator connections. */
+ private LocalServerSocket mServerSocket = null;
+ /** Service that has created this object. */
+ private ControllerService mService;
+ /**
+ * List of connected emulator sockets, pending for a channel to be registered.
+ * <p/>
+ * Emulator may connect to SDK controller before the app registers a channel
+ * for that connection. In this case (when app-side channel is not registered
+ * with this class) we will keep emulator connection in this list, pending
+ * for the app-side channel to register.
+ */
+ private List<Socket> mPendingSockets = new ArrayList<Socket>();
+ /**
+ * List of registered app-side channels.
+ * <p/>
+ * Channels that are kept in this list may be disconnected from (or pending
+ * connection with) the emulator, or they may be connected with the
+ * emulator.
+ */
+ private List<Channel> mChannels = new ArrayList<Channel>();
+
+ /**
+ * Constructs Connection instance.
+ */
+ public Connection(ControllerService service) {
+ mService = service;
+ if (DEBUG) Log.d(TAG, "SdkControllerConnection is constructed.");
+ }
+
+ /**
+ * Binds to the socket, and starts the listening thread.
+ */
+ public void connect() {
+ if (DEBUG) Log.d(TAG, "SdkControllerConnection is connecting...");
+ // Start connection listener.
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ runIOLooper();
+ }
+ }, "SdkControllerConnectionIoLoop").start();
+ }
+
+ /**
+ * Stops the listener, and closes the socket.
+ *
+ * @return true if connection has been stopped in this call, or false if it
+ * has been already stopped when this method has been called.
+ */
+ public boolean disconnect() {
+ // This is the only place in this class where we will null the
+ // socket object. Since this method can be called concurrently from
+ // different threads, lets do this under the lock.
+ LocalServerSocket socket;
+ synchronized (this) {
+ socket = mServerSocket;
+ mServerSocket = null;
+ }
+ if (socket != null) {
+ if (DEBUG) Log.d(TAG, "SdkControllerConnection is stopping I/O looper...");
+ // Stop accepting new connections.
+ wakeIOLooper(socket);
+ try {
+ socket.close();
+ } catch (Exception e) {
+ }
+
+ // Close all the pending sockets, and clear pending socket list.
+ if (DEBUG) Log.d(TAG, "SdkControllerConnection is closing pending sockets...");
+ for (Socket pending_socket : mPendingSockets) {
+ pending_socket.close();
+ }
+ mPendingSockets.clear();
+
+ // Disconnect all the emualtors.
+ if (DEBUG) Log.d(TAG, "SdkControllerConnection is disconnecting channels...");
+ for (Channel channel : mChannels) {
+ if (channel.disconnect()) {
+ channel.onEmulatorDisconnected();
+ }
+ }
+ if (DEBUG) Log.d(TAG, "SdkControllerConnection is disconnected.");
+ }
+ return socket != null;
+ }
+
+ /**
+ * Registers SDK controller channel.
+ *
+ * @param channel SDK controller emulator to register.
+ * @return true if channel has been registered successfully, or false if channel
+ * with the same name is already registered.
+ */
+ public boolean registerChannel(Channel channel) {
+ for (Channel check_channel : mChannels) {
+ if (check_channel.getChannelName().equals(channel.getChannelName())) {
+ Loge("Registering a duplicate Channel " + channel.getChannelName());
+ return false;
+ }
+ }
+ if (DEBUG) Log.d(TAG, "Registering Channel " + channel.getChannelName());
+ mChannels.add(channel);
+
+ // Lets see if there is a pending socket for this channel.
+ for (Socket pending_socket : mPendingSockets) {
+ if (pending_socket.getChannelName().equals(channel.getChannelName())) {
+ // Remove the socket from the pending list, and connect the registered channel with it.
+ if (DEBUG) Log.d(TAG, "Found pending Socket for registering Channel "
+ + channel.getChannelName());
+ mPendingSockets.remove(pending_socket);
+ channel.connect(pending_socket);
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Checks if at least one socket connection exists with channel.
+ *
+ * @return true if at least one socket connection exists with channel.
+ */
+ public boolean isEmulatorConnected() {
+ for (Channel channel : mChannels) {
+ if (channel.isConnected()) {
+ return true;
+ }
+ }
+ return !mPendingSockets.isEmpty();
+ }
+
+ /**
+ * Gets Channel instance for the given channel name.
+ *
+ * @param name Channel name to get Channel instance for.
+ * @return Channel instance for the given channel name, or NULL if no
+ * channel has been registered for that name.
+ */
+ public Channel getChannel(String name) {
+ for (Channel channel : mChannels) {
+ if (channel.getChannelName().equals(name)) {
+ return channel;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Gets connected emulator socket that is pending for service-side channel
+ * registration.
+ *
+ * @param name Channel name to lookup Socket for.
+ * @return Connected emulator socket that is pending for service-side channel
+ * registration, or null if no socket is pending for service-size
+ * channel registration.
+ */
+ private Socket getPendingSocket(String name) {
+ for (Socket socket : mPendingSockets) {
+ if (socket.getChannelName().equals(name)) {
+ return socket;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Wakes I/O looper waiting on connection with the emulator.
+ *
+ * @param socket Server socket waiting on connection.
+ */
+ private void wakeIOLooper(LocalServerSocket socket) {
+ // We wake the looper by connecting to the socket.
+ LocalSocket waker = new LocalSocket();
+ try {
+ waker.connect(socket.getLocalSocketAddress());
+ } catch (IOException e) {
+ Loge("Exception " + e + " in SdkControllerConnection while waking up the I/O looper.");
+ }
+ }
+
+ /**
+ * Loops on the local socket, handling emulator connection attempts.
+ */
+ private void runIOLooper() {
+ if (DEBUG) Log.d(TAG, "In SdkControllerConnection I/O looper.");
+ do {
+ try {
+ // Create non-blocking server socket that would listen for connections,
+ // and bind it to the given port on the local host.
+ mServerSocket = new LocalServerSocket(SDK_CONTROLLER_PORT);
+ LocalServerSocket socket = mServerSocket;
+ while (socket != null) {
+ final LocalSocket sk = socket.accept();
+ if (mServerSocket != null) {
+ onAccept(sk);
+ } else {
+ break;
+ }
+ socket = mServerSocket;
+ }
+ } catch (IOException e) {
+ Loge("Exception " + e + "SdkControllerConnection I/O looper.");
+ }
+ if (DEBUG) Log.d(TAG, "Exiting SdkControllerConnection I/O looper.");
+
+ // If we're exiting the internal loop for reasons other than an explicit
+ // disconnect request, we should reconnect again.
+ } while (disconnect());
+ }
+
+ /**
+ * Accepts new connection from the emulator.
+ *
+ * @param sock Connecting socket.
+ * @throws IOException
+ */
+ private void onAccept(LocalSocket sock) throws IOException {
+ final ByteBuffer handshake = ByteBuffer.allocate(ProtocolConstants.QUERY_HEADER_SIZE);
+
+ // By protocol, first byte received from newly connected emulator socket
+ // indicates host endianness.
+ Socket.receive(sock, handshake.array(), 1);
+ final ByteOrder endian = (handshake.getChar() == 0) ? ByteOrder.LITTLE_ENDIAN :
+ ByteOrder.BIG_ENDIAN;
+ handshake.order(endian);
+
+ // Right after that follows the handshake query header.
+ handshake.position(0);
+ Socket.receive(sock, handshake.array(), handshake.array().length);
+
+ // First int - signature
+ final int signature = handshake.getInt();
+ assert signature == ProtocolConstants.PACKET_SIGNATURE;
+ // Second int - total query size (including fixed query header)
+ final int remains = handshake.getInt() - ProtocolConstants.QUERY_HEADER_SIZE;
+ // After that - header type (which must be SDKCTL_PACKET_TYPE_QUERY)
+ final int msg_type = handshake.getInt();
+ assert msg_type == ProtocolConstants.PACKET_TYPE_QUERY;
+ // After that - query ID.
+ final int query_id = handshake.getInt();
+ // And finally, query type (which must be ProtocolConstants.QUERY_HANDSHAKE for
+ // handshake query)
+ final int query_type = handshake.getInt();
+ assert query_type == ProtocolConstants.QUERY_HANDSHAKE;
+ // Verify that received is a query.
+ if (msg_type != ProtocolConstants.PACKET_TYPE_QUERY) {
+ // Message type is not a query. Lets read and discard the remainder
+ // of the message.
+ if (remains > 0) {
+ Loge("Unexpected handshake message type: " + msg_type);
+ byte[] discard = new byte[remains];
+ Socket.receive(sock, discard, discard.length);
+ }
+ return;
+ }
+
+ // Receive query data.
+ final byte[] name_array = new byte[remains];
+ Socket.receive(sock, name_array, name_array.length);
+
+ // Prepare response header.
+ handshake.position(0);
+ handshake.putInt(ProtocolConstants.PACKET_SIGNATURE);
+ // Handshake reply is just one int.
+ handshake.putInt(ProtocolConstants.QUERY_RESP_HEADER_SIZE + 4);
+ handshake.putInt(ProtocolConstants.PACKET_TYPE_QUERY_RESPONSE);
+ handshake.putInt(query_id);
+
+ // Verify that received query is in deed a handshake query.
+ if (query_type != ProtocolConstants.QUERY_HANDSHAKE) {
+ // Query is not a handshake. Reply with failure.
+ Loge("Unexpected handshake query type: " + query_type);
+ handshake.putInt(ProtocolConstants.HANDSHAKE_RESP_QUERY_UNKNOWN);
+ sock.getOutputStream().write(handshake.array());
+ return;
+ }
+
+ // Handshake query data consist of SDK controller channel name.
+ final String channel_name = new String(name_array);
+ if (DEBUG) Log.d(TAG, "Handshake received for channel " + channel_name);
+
+ // Respond to query depending on service-side channel availability
+ final Channel channel = getChannel(channel_name);
+ Socket sk = null;
+
+ if (channel != null) {
+ if (channel.isConnected()) {
+ // This is a duplicate connection.
+ Loge("Duplicate connection to a connected Channel " + channel_name);
+ handshake.putInt(ProtocolConstants.HANDSHAKE_RESP_DUP);
+ } else {
+ // Connecting to a registered channel.
+ if (DEBUG) Log.d(TAG, "Emulator is connected to a registered Channel " + channel_name);
+ handshake.putInt(ProtocolConstants.HANDSHAKE_RESP_CONNECTED);
+ }
+ } else {
+ // Make sure that there are no other channel connections for this
+ // channel name.
+ if (getPendingSocket(channel_name) != null) {
+ // This is a duplicate.
+ Loge("Duplicate connection to a pending Socket " + channel_name);
+ handshake.putInt(ProtocolConstants.HANDSHAKE_RESP_DUP);
+ } else {
+ // Connecting to a channel that has not been registered yet.
+ if (DEBUG) Log.d(TAG, "Emulator is connected to a pending Socket " + channel_name);
+ handshake.putInt(ProtocolConstants.HANDSHAKE_RESP_NOPORT);
+ sk = new Socket(sock, channel_name, endian);
+ mPendingSockets.add(sk);
+ }
+ }
+
+ // Send handshake reply.
+ sock.getOutputStream().write(handshake.array());
+
+ // If a disconnected channel for emulator connection has been found,
+ // connect it.
+ if (channel != null && !channel.isConnected()) {
+ if (DEBUG) Log.d(TAG, "Connecting Channel " + channel_name + " with emulator.");
+ sk = new Socket(sock, channel_name, endian);
+ channel.connect(sk);
+ }
+
+ mService.notifyStatusChanged();
+ }
+
+ /***************************************************************************
+ * Logging wrappers
+ **************************************************************************/
+
+ private void Loge(String log) {
+ mService.addError(log);
+ Log.e(TAG, log);
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/lib/ProtocolConstants.java b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/lib/ProtocolConstants.java
new file mode 100644
index 0000000..32abf2b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/lib/ProtocolConstants.java
@@ -0,0 +1,146 @@
+// Copyright 2012 Google Inc. All Rights Reserved.
+
+package com.android.tools.sdkcontroller.lib;
+
+/**
+ * Contains declarations of constants that are tied to emulator implementation.
+ * These constants can be changed only simultaneously in both places.
+ */
+public final class ProtocolConstants {
+ /*
+ * Constants related to data transfer.
+ */
+
+ /** Signature of a packet sent via SDK controller socket ('SDKC') */
+ public static final int PACKET_SIGNATURE = 0x53444B43;
+
+ /*
+ * Header sizes for packets sent / received by SDK controller emulator.
+ */
+
+ /**
+ * 12 bytes (3 ints) for the packet header:
+ * <p/>
+ * - Signature.
+ * <p/>
+ * - Total packet size.
+ * <p/>
+ * - Packet type.
+ */
+ public static final int PACKET_HEADER_SIZE = 12;
+ /**
+ * 16 bytes (4 ints) for the message header:
+ * <p/>
+ * - Common packet header.
+ * <p/>
+ * - Message type.
+ */
+ public static final int MESSAGE_HEADER_SIZE = 16;
+ /**
+ * 20 bytes (5 ints) for the query header:
+ * <p/>
+ * - Common packet header.
+ * <p/>
+ * - Query ID.
+ * <p/>
+ * - Query type.
+ */
+ public static final int QUERY_HEADER_SIZE = 20;
+ /**
+ * 16 bytes (4 ints) for the query response:
+ * <p/>
+ * - Common packet header.
+ * <p/>
+ * - Query ID.
+ */
+ public static final int QUERY_RESP_HEADER_SIZE = 16;
+
+ /*
+ * Types of packets transferred via SDK Controller channel.
+ */
+
+ /** Packet is a message. */
+ public static final int PACKET_TYPE_MESSAGE = 1;
+ /** Packet is a query. */
+ public static final int PACKET_TYPE_QUERY = 2;
+ /** Packet is a response to a query. */
+ public static final int PACKET_TYPE_QUERY_RESPONSE = 3;
+
+ /*
+ * Constants related to handshake protocol between the emulator and a channel.
+ */
+
+ /**
+ * Query type for a special "handshake" query.
+ * <p/>
+ * When emulator connects to SDK controller, the first thing that goes
+ * through the socket is a special "handshake" query that delivers channel name
+ * to the service.
+ */
+ public static final int QUERY_HANDSHAKE = -1;
+ /**
+ * Handshake query response on condition that service-side channel is available
+ * (registered).
+ */
+ public static final int HANDSHAKE_RESP_CONNECTED = 0;
+ /**
+ * Handshake query response on condition that service-side channel is not
+ * available (not registered).
+ */
+ public static final int HANDSHAKE_RESP_NOPORT = 1;
+ /**
+ * Handshake query response on condition that there is already an existing
+ * emulator connection for this channel. Emulator should stop connection
+ * attempts in this case.
+ */
+ public static final int HANDSHAKE_RESP_DUP = -1;
+ /** Response to an unknown handshake query type. */
+ public static final int HANDSHAKE_RESP_QUERY_UNKNOWN = -2;
+
+ /*
+ * Constants related to multi-touch emulation.
+ */
+
+ /** Received frame is JPEG image. */
+ public static final int MT_FRAME_JPEG = 1;
+ /** Received frame is RGB565 bitmap. */
+ public static final int MT_FRAME_RGB565 = 2;
+ /** Received frame is RGB888 bitmap. */
+ public static final int MT_FRAME_RGB888 = 3;
+
+ /** Pointer(s) moved. */
+ public static final int MT_MOVE = 1;
+ /** First pointer down message. */
+ public static final int MT_FISRT_DOWN = 2;
+ /** Last pointer up message. */
+ public static final int MT_LAST_UP = 3;
+ /** Pointer down message. */
+ public static final int MT_POINTER_DOWN = 4;
+ /** Pointer up message. */
+ public static final int MT_POINTER_UP = 5;
+ /** Sends framebuffer update. */
+ public static final int MT_FB_UPDATE = 6;
+ /** Frame buffer update has been received. */
+ public static final int MT_FB_ACK = 7;
+ /** Frame buffer update has been handled. */
+ public static final int MT_FB_HANDLED = 8;
+ /** Size of an event entry in the touch event message to the emulator. */
+ public static final int MT_EVENT_ENTRY_SIZE = 16;
+
+ /*
+ * Constants related to sensor emulation.
+ */
+
+ /** Query type for a query that should return the list of available sensors. */
+ public static final int SENSORS_QUERY_LIST = 1;
+ /** Message that starts sensor emulation. */
+ public static final int SENSORS_START = 1;
+ /** Message that stops sensor emulation. */
+ public static final int SENSORS_STOP = 2;
+ /** Message that enables emulation of a particular sensor. */
+ public static final int SENSORS_ENABLE = 3;
+ /** Message that disables emulation of a particular sensor. */
+ public static final int SENSORS_DISABLE = 4;
+ /** Message that delivers sensor events to emulator. */
+ public static final int SENSORS_SENSOR_EVENT = 5;
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/lib/Socket.java b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/lib/Socket.java
new file mode 100644
index 0000000..08e6b28
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/lib/Socket.java
@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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 com.android.tools.sdkcontroller.lib;
+
+import android.net.LocalSocket;
+import android.util.Log;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.ByteOrder;
+import java.nio.channels.ClosedChannelException;
+
+/**
+ * Encapsulates a connection with the emulator over a UNIX-domain socket.
+ */
+public class Socket {
+ /** UNIX-domain socket connected with the emulator. */
+ private LocalSocket mSocket = null;
+ /** Channel name for the connection established via this socket. */
+ private String mChannelName;
+ /** Endianness of data transferred in this connection. */
+ private ByteOrder mEndian;
+
+ /** Tag for message logging. */
+ private static final String TAG = "SdkControllerSocket";
+ /** Controls debug log. */
+ private static boolean DEBUG = false;
+
+ /**
+ * Constructs Socket instance.
+ *
+ * @param socket Socket connection with the emulator.
+ * @param name Channel port name for this connection.
+ * @param endian Endianness of data transferred in this connection.
+ */
+ public Socket(LocalSocket socket, String name, ByteOrder endian) {
+ mSocket = socket;
+ mChannelName = name;
+ mEndian = endian;
+ if (DEBUG) Log.d(TAG, "Socket is constructed for " + mChannelName);
+ }
+
+ /**
+ * Gets connection status of this socket.
+ *
+ * @return true if socket is connected, or false if socket is not connected.
+ */
+ public boolean isConnected() {
+ return mSocket != null;
+ }
+
+ /**
+ * Gets channel name for this socket.
+ *
+ * @return Channel name for this socket.
+ */
+ public String getChannelName() {
+ return mChannelName;
+ }
+
+ /**
+ * Gets endianness of data transferred via this socket.
+ *
+ * @return Endianness of data transferred via this socket.
+ */
+ public ByteOrder getEndian() {
+ return mEndian;
+ }
+
+ /**
+ * Sends data to the socket.
+ *
+ * @param data Data to send. Data size is defined by the length of the
+ * array.
+ * @throws IOException
+ */
+ public void send(byte[] data) throws IOException {
+ // Use local copy of the socket, ensuring it's not going to NULL while
+ // we're working with it. If it gets closed, while we're in the middle
+ // of data transfer - it's OK, since it will produce an exception, and
+ // the caller will gracefully handle it.
+ //
+ // Same technique is used everywhere in this class where mSocket member
+ // is touched.
+ LocalSocket socket = mSocket;
+ if (socket == null) {
+ Logw("'send' request on closed Socket " + mChannelName);
+ throw new ClosedChannelException();
+ }
+ socket.getOutputStream().write(data);
+ }
+
+ /**
+ * Sends data to the socket.
+ *
+ * @param data Data to send.
+ * @param offset The start position in data from where to get bytes.
+ * @param len The number of bytes from data to write to this socket.
+ * @throws IOException
+ */
+ public void send(byte[] data, int offset, int len) throws IOException {
+ LocalSocket socket = mSocket;
+ if (socket == null) {
+ Logw("'send' request on closed Socket " + mChannelName);
+ throw new ClosedChannelException();
+ }
+ socket.getOutputStream().write(data, offset, len);
+ }
+
+ /**
+ * Receives data from the socket.
+ *
+ * @param socket Socket from where to receive data.
+ * @param data Array where to save received data.
+ * @param len Number of bytes to receive.
+ * @throws IOException
+ */
+ public static void receive(LocalSocket socket, byte[] data, int len) throws IOException {
+ final InputStream is = socket.getInputStream();
+ int received = 0;
+ while (received != len) {
+ final int chunk = is.read(data, received, len - received);
+ if (chunk < 0) {
+ throw new IOException(
+ "I/O failure while receiving SDK controller data from socket.");
+ }
+ received += chunk;
+ }
+ }
+
+ /**
+ * Receives data from the socket.
+ *
+ * @param data Array where to save received data.
+ * @param len Number of bytes to receive.
+ * @throws IOException
+ */
+ public void receive(byte[] data, int len) throws IOException {
+ LocalSocket socket = mSocket;
+ if (socket == null) {
+ Logw("'receive' request on closed Socket " + mChannelName);
+ throw new ClosedChannelException();
+ }
+ receive(socket, data, len);
+ }
+
+ /**
+ * Receives data from the socket.
+ *
+ * @param data Array where to save received data. Data size is defined by
+ * the size of the array.
+ * @throws IOException
+ */
+ public void receive(byte[] data) throws IOException {
+ receive(data, data.length);
+ }
+
+ /**
+ * Closes the socket.
+ *
+ * @return true if socket has been closed in this call, or false if it had
+ * been already closed when this method has been called.
+ */
+ public boolean close() {
+ // This is the only place in this class where we will null the socket
+ // object. Since this method can be called concurrently from different
+ // threads, lets do this under the lock.
+ LocalSocket socket;
+ synchronized (this) {
+ socket = mSocket;
+ mSocket = null;
+ }
+ if (socket != null) {
+ try {
+ // Force all I/O to stop before closing the socket.
+ socket.shutdownInput();
+ socket.shutdownOutput();
+ socket.close();
+ if (DEBUG) Log.d(TAG, "Socket is closed for " + mChannelName);
+ return true;
+ } catch (IOException e) {
+ Loge("Exception " + e + " while closing Socket for " + mChannelName);
+ }
+ }
+ return false;
+ }
+
+ /***************************************************************************
+ * Logging wrappers
+ **************************************************************************/
+
+ private void Loge(String log) {
+ Log.e(TAG, log);
+ }
+
+ private void Logw(String log) {
+ Log.w(TAG, log);
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/service/ControllerService.java b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/service/ControllerService.java
new file mode 100644
index 0000000..9a3408b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/service/ControllerService.java
@@ -0,0 +1,319 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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 com.android.tools.sdkcontroller.service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import android.app.Activity;
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.app.Service;
+import android.content.Intent;
+import android.os.Binder;
+import android.os.IBinder;
+import android.util.Log;
+
+import com.android.tools.sdkcontroller.R;
+import com.android.tools.sdkcontroller.activities.MainActivity;
+import com.android.tools.sdkcontroller.handlers.MultiTouchChannel;
+import com.android.tools.sdkcontroller.handlers.SensorChannel;
+import com.android.tools.sdkcontroller.lib.Connection;
+import com.android.tools.sdkcontroller.lib.Channel;
+
+/**
+ * The background service of the SdkController.
+ * There can be only one instance of this.
+ * <p/>
+ * The service manages a number of SDK controller channels which can be seen as
+ * individual tasks that the user might want to accomplish, for example "sending
+ * sensor data to the emulator" or "sending multi-touch data and displaying an
+ * emulator screen".
+ * <p/>
+ * Each channel connects to the emulator via UNIX-domain socket that is bound to
+ * "android.sdk.controller" port. Connection class provides a socket server that
+ * listens to emulator connections on this port, and binds new connection with a
+ * channel, based on channel name.
+ * <p/>
+ * All the channels are created when the service starts, and whether the emulator
+ * connection is successful or not, and whether there's any UI to control it.
+ * It's up to the channels to deal with these specific details. <br/>
+ * For example the {@link SensorChannel} initializes its sensor list as soon as
+ * created and then tries to send data as soon as there's an emulator
+ * connection. On the other hand the {@link MultiTouchChannel} lays dormant till
+ * there's an UI interacting with it.
+ */
+public class ControllerService extends Service {
+
+ /*
+ * Implementation reference:
+ * http://developer.android.com/reference/android/app/Service.html#LocalServiceSample
+ */
+
+ /** Tag for logging messages. */
+ public static String TAG = ControllerService.class.getSimpleName();
+ /** Controls debug log. */
+ private static boolean DEBUG = true;
+ /** Identifier for the notification. */
+ private static int NOTIF_ID = 'S' << 24 + 'd' << 16 + 'k' << 8 + 'C' << 0;
+
+ /** Connection to the emulator. */
+ public Connection mConnection;
+
+
+ private final IBinder mBinder = new ControllerBinder();
+
+ private List<ControllerListener> mListeners = new ArrayList<ControllerListener>();
+
+ /**
+ * Whether the service is running. Set to true in onCreate, false in onDestroy.
+ */
+ private static volatile boolean gServiceIsRunning = false;
+
+ /** Internal error reported by the service. */
+ private String mServiceError = "";
+
+ /**
+ * Interface that the service uses to notify binded activities.
+ * <p/>
+ * As a design rule, implementations of this listener should be aware that most calls
+ * will NOT happen on the UI thread. Any access to the UI should be properly protected
+ * by using {@link Activity#runOnUiThread(Runnable)}.
+ */
+ public interface ControllerListener {
+ /**
+ * The error string reported by the service has changed. <br/>
+ * Note this may be called from a thread different than the UI thread.
+ */
+ void onErrorChanged();
+
+ /**
+ * The service status has changed (emulator connected/disconnected.)
+ */
+ void onStatusChanged();
+ }
+
+ /** Interface that callers can use to access the service. */
+ public class ControllerBinder extends Binder {
+
+ /**
+ * Adds a new listener that will be notified when the service state changes.
+ *
+ * @param listener A non-null listener. Ignored if already listed.
+ */
+ public void addControllerListener(ControllerListener listener) {
+ assert listener != null;
+ if (listener != null) {
+ synchronized (mListeners) {
+ if (!mListeners.contains(listener)) {
+ mListeners.add(listener);
+ }
+ }
+ }
+ }
+
+ /**
+ * Removes a listener.
+ *
+ * @param listener A listener to remove. Can be null.
+ */
+ public void removeControllerListener(ControllerListener listener) {
+ assert listener != null;
+ synchronized (mListeners) {
+ mListeners.remove(listener);
+ }
+ }
+
+ /**
+ * Returns the error string accumulated by the service.
+ * Typically these would relate to failures to establish the communication
+ * channel(s) with the emulator, or unexpected disconnections.
+ */
+ public String getServiceError() {
+ return mServiceError;
+ }
+
+ /**
+ * Indicates when <em>any</all> of the SDK controller channels is connected
+ * with the emulator.
+ *
+ * @return True if any of the SDK controller channels is connected with the
+ * emulator.
+ */
+ public boolean isEmuConnected() {
+ return mConnection.isEmulatorConnected();
+ }
+
+ /**
+ * Returns the channel instance for the given type.
+ *
+ * @param name One of the channel names. Must not be null.
+ * @return Null if the type is not found, otherwise the handler's unique instance.
+ */
+ public Channel getChannel(String name) {
+ return mConnection.getChannel(name);
+ }
+ }
+
+ /**
+ * Whether the service is running. Set to true in onCreate, false in onDestroy.
+ */
+ public static boolean isServiceIsRunning() {
+ return gServiceIsRunning;
+ }
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ if (DEBUG) Log.d(TAG, "Service onCreate");
+ gServiceIsRunning = true;
+ showNotification();
+ onServiceStarted();
+ }
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ // We want this service to continue running until it is explicitly
+ // stopped, so return sticky.
+ if (DEBUG) Log.d(TAG, "Service onStartCommand");
+ return START_STICKY;
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ if (DEBUG) Log.d(TAG, "Service onBind");
+ return mBinder;
+ }
+
+ @Override
+ public void onDestroy() {
+ if (DEBUG) Log.d(TAG, "Service onDestroy");
+ gServiceIsRunning = false;
+ removeNotification();
+ resetError();
+ onServiceStopped();
+ super.onDestroy();
+ }
+
+ private void disconnectAll() {
+ if (mConnection != null) {
+ mConnection.disconnect();
+ }
+ }
+
+ /**
+ * Called when the service has been created.
+ */
+ private void onServiceStarted() {
+ try {
+ disconnectAll();
+
+ // Bind to SDK controller port, and start accepting emulator
+ // connections.
+ mConnection = new Connection(ControllerService.this);
+ mConnection.connect();
+
+ // Create and register sensors channel.
+ mConnection.registerChannel(new SensorChannel(ControllerService.this));
+ // Create and register multi-touch channel.
+ mConnection.registerChannel(new MultiTouchChannel(ControllerService.this));
+ } catch (Exception e) {
+ addError("Connection failed: " + e.toString());
+ }
+ }
+
+ /**
+ * Called when the service is being destroyed.
+ */
+ private void onServiceStopped() {
+ disconnectAll();
+ }
+
+ private void notifyErrorChanged() {
+ synchronized (mListeners) {
+ for (ControllerListener listener : mListeners) {
+ listener.onErrorChanged();
+ }
+ }
+ }
+
+ public void notifyStatusChanged() {
+ synchronized (mListeners) {
+ for (ControllerListener listener : mListeners) {
+ listener.onStatusChanged();
+ }
+ }
+ }
+
+ /**
+ * Resets the error string and notify listeners.
+ */
+ private void resetError() {
+ mServiceError = "";
+
+ notifyErrorChanged();
+ }
+
+ /**
+ * An internal utility method to add a line to the error string and notify listeners.
+ * @param error A non-null non-empty error line. \n will be added automatically.
+ */
+ public void addError(String error) {
+ Log.e(TAG, error);
+ if (mServiceError.length() > 0) {
+ mServiceError += "\n";
+ }
+ mServiceError += error;
+
+ notifyErrorChanged();
+ }
+
+ /**
+ * Displays a notification showing that the service is running.
+ * When the user touches the notification, it opens the main activity
+ * which allows the user to stop this service.
+ */
+ @SuppressWarnings("deprecated")
+ private void showNotification() {
+ NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
+
+ String text = getString(R.string.service_notif_title);
+
+ // Note: Notification is marked as deprecated -- in API 11+ there's a new Builder class
+ // but we need to have API 7 compatibility so we ignore that warning.
+
+ Notification n = new Notification(R.drawable.ic_launcher, text, System.currentTimeMillis());
+ n.flags |= Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR;
+ Intent intent = new Intent(this, MainActivity.class);
+ intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
+ PendingIntent pi = PendingIntent.getActivity(
+ this, //context
+ 0, //requestCode
+ intent, //intent
+ 0 //pending intent flags
+ );
+ n.setLatestEventInfo(this, text, text, pi);
+
+ nm.notify(NOTIF_ID, n);
+ }
+
+ private void removeNotification() {
+ NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
+ nm.cancel(NOTIF_ID);
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/utils/ApiHelper.java b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/utils/ApiHelper.java
new file mode 100644
index 0000000..66bce49
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/utils/ApiHelper.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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 com.android.tools.sdkcontroller.utils;
+
+import android.annotation.TargetApi;
+import android.os.Build;
+import android.view.View;
+
+/**
+ * Helper to deal with methods only available at certain API levels.
+ * Users should get use {@link ApiHelper#get()} to retrieve a singleton
+ * and then call the methods they desire. If the method is not available
+ * on the current API level, a stub or a nop will be used instead.
+ */
+@TargetApi(7)
+public class ApiHelper {
+
+ private static ApiHelper sApiHelper = null;
+
+ /** Creates a new ApiHelper adapted to the current runtime API level. */
+ public static ApiHelper get() {
+ if (sApiHelper == null) {
+ if (Build.VERSION.SDK_INT >= 11) {
+ sApiHelper = new ApiHelper_11();
+ } else {
+ sApiHelper = new ApiHelper();
+ }
+ }
+
+ return sApiHelper;
+ }
+
+ protected ApiHelper() {
+ }
+
+ /**
+ * Applies {@link View#setSystemUiVisibility(int)}, available only starting with API 11.
+ * Does nothing for API < 11.
+ */
+ public void View_setSystemUiVisibility(View view, int visibility) {
+ // nop
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/utils/ApiHelper_11.java b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/utils/ApiHelper_11.java
new file mode 100644
index 0000000..2d4e8cd
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/utils/ApiHelper_11.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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 com.android.tools.sdkcontroller.utils;
+
+import android.annotation.TargetApi;
+import android.view.View;
+
+/**
+ * API 11: support View_setSystemUiVisibility
+ */
+@TargetApi(11)
+class ApiHelper_11 extends ApiHelper {
+
+ /**
+ * Applies {@link View#setSystemUiVisibility(int)}, available only starting with API 11.
+ * Does nothing for API < 11.
+ */
+ @Override
+ public void View_setSystemUiVisibility(View view, int visibility) {
+ view.setSystemUiVisibility(visibility);
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/views/MultiTouchView.java b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/views/MultiTouchView.java
new file mode 100644
index 0000000..0f185b1
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/apps/SdkController/src/com/android/tools/sdkcontroller/views/MultiTouchView.java
@@ -0,0 +1,232 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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 com.android.tools.sdkcontroller.views;
+
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.MotionEvent;
+import android.view.View;
+
+/**
+ * Implements a main view for the application providing multi-touch emulation.
+ */
+public class MultiTouchView extends View {
+ /** Tag for logging messages. */
+ private static final String TAG = MultiTouchView.class.getSimpleName();
+ /**
+ * Back-end bitmap. Initialized in onSizeChanged(), updated in
+ * onTouchEvent() and drawn in onDraw().
+ */
+ private Bitmap mBitmap;
+ /** Default Paint instance for drawing the bitmap. */
+ private final Paint mPaint = new Paint();
+ /** Canvas instance for this view. */
+ private Canvas mCanvas;
+ /** Emulator screen width to this view width ratio. */
+ private float mDx = 1;
+ /** Emulator screen height to this view height ratio. */
+ private float mDy = 1;
+ /**
+ * Flags whether or not image received from the emulator should be rotated.
+ * Rotation is required when display orientation state of the emulator and
+ * the device doesn't match.
+ */
+ private boolean mRotateDisplay;
+ /** Base matrix that keep emulator->device display scaling */
+ private Matrix mBaseMatrix = new Matrix();
+ /** Matrix that is used to draw emulator's screen on the device. */
+ private Matrix mDrawMatrix = new Matrix();
+
+ /**
+ * Simple constructor to use when creating a view from code.
+ *
+ * @see View#View(Context)
+ */
+ public MultiTouchView(Context context) {
+ this(context, null);
+ }
+
+ /**
+ * Constructor that is called when inflating a view from XML.
+ *
+ * @see View#View(Context, AttributeSet)
+ */
+ public MultiTouchView(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ /**
+ * Perform inflation from XML and apply a class-specific base style.
+ *
+ * @see View#View(Context, AttributeSet, int)
+ */
+ public MultiTouchView(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+
+ // TODO Add constructor-time code here.
+ }
+
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(w, h, oldw, oldh);
+
+ mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
+ mCanvas = new Canvas(mBitmap);
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+ // Just draw the back-end bitmap without zooming or scaling.
+ if (mBitmap != null) {
+ canvas.drawBitmap(mBitmap, 0, 0, null);
+ }
+ }
+
+ /**
+ * Sets emulator screen width and height to this view width and height
+ * ratio.
+ *
+ * @param dx Emulator screen width to this view width ratio.
+ * @param dy Emulator screen height to this view height ratio.
+ * @param rotateDisplay Flags whether image received from the emulator
+ * should be rotated when drawn on the device.
+ */
+ public void setDxDy(float dx, float dy, boolean rotateDisplay) {
+ mDx = dx;
+ mDy = dy;
+ mRotateDisplay = rotateDisplay;
+
+ mBaseMatrix.setScale(dx, dy);
+ if (mRotateDisplay) {
+ mBaseMatrix.postRotate(90);
+ mBaseMatrix.postTranslate(getWidth(), 0);
+ }
+ }
+
+ /**
+ * Computes draw matrix for the emulator screen update.
+ *
+ * @param x Left screen coordinate of the bitmap on emulator screen.
+ * @param y Top screen coordinate of the bitmap on emulator screen.
+ */
+ private void computeDrawMatrix(int x, int y) {
+ mDrawMatrix.set(mBaseMatrix);
+ if (mRotateDisplay) {
+ mDrawMatrix.postTranslate(-y * mDy, x * mDx);
+ } else {
+ mDrawMatrix.postTranslate(x * mDx, y * mDy);
+ }
+ }
+
+ /**
+ * Draws a bitmap on the screen.
+ *
+ * @param x Left screen coordinate of the bitmap on emulator screen.
+ * @param y Top screen coordinate of the bitmap on emulator screen.
+ * @param w Width of the bitmap on the emulator screen.
+ * @param h Height of the bitmap on the emulator screen.
+ * @param colors Bitmap to draw.
+ */
+ public void drawBitmap(int x, int y, int w, int h, int[] colors) {
+ if (mCanvas != null) {
+ final Bitmap bmp = Bitmap.createBitmap(colors, 0, w, w, h, Bitmap.Config.ARGB_8888);
+
+ computeDrawMatrix(x, y);
+
+ /* Draw the bitmap and invalidate the updated region. */
+ mCanvas.drawBitmap(bmp, mDrawMatrix, mPaint);
+ invalidate();
+ }
+ }
+
+ /**
+ * Draws a JPEG bitmap on the screen.
+ *
+ * @param x Left screen coordinate of the bitmap on emulator screen.
+ * @param y Top screen coordinate of the bitmap on emulator screen.
+ * @param w Width of the bitmap on the emulator screen.
+ * @param h Height of the bitmap on the emulator screen.
+ * @param jpeg JPEG bitmap to draw.
+ */
+ public void drawJpeg(int x, int y, int w, int h, InputStream jpeg) {
+ if (mCanvas != null) {
+ final Bitmap bmp = BitmapFactory.decodeStream(jpeg);
+
+ computeDrawMatrix(x, y);
+
+ /* Draw the bitmap and invalidate the updated region. */
+ mCanvas.drawBitmap(bmp, mDrawMatrix, mPaint);
+ invalidate();
+ }
+ }
+
+ /**
+ * Constructs touch event message to be send to emulator.
+ *
+ * @param bb ByteBuffer where to construct the message.
+ * @param event Event for which to construct the message.
+ * @param ptr_index Index of the motion pointer for which to construct the
+ * message.
+ */
+ public void constructEventMessage(ByteBuffer bb, MotionEvent event, int ptr_index) {
+ bb.putInt(event.getPointerId(ptr_index));
+ if (mRotateDisplay == false) {
+ bb.putInt((int) (event.getX(ptr_index) / mDx));
+ bb.putInt((int) (event.getY(ptr_index) / mDy));
+ } else {
+ bb.putInt((int) (event.getY(ptr_index) / mDy));
+ bb.putInt((int) (getWidth() - event.getX(ptr_index) / mDx));
+ }
+ // At the system level the input reader takes integers in the range
+ // 0 - 100 for the pressure.
+ int pressure = (int) (event.getPressure(ptr_index) * 100);
+ // Make sure it doesn't exceed 100...
+ if (pressure > 100) {
+ pressure = 100;
+ }
+ bb.putInt(pressure);
+ }
+
+ /***************************************************************************
+ * Logging wrappers
+ **************************************************************************/
+
+ @SuppressWarnings("unused")
+ private void Loge(String log) {
+ Log.e(TAG, log);
+ }
+
+ @SuppressWarnings("unused")
+ private void Logw(String log) {
+ Log.w(TAG, log);
+ }
+
+ @SuppressWarnings("unused")
+ private void Logv(String log) {
+ Log.v(TAG, log);
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/ddms.bat b/love2dToAPK/tools/tools/android-win/tools/ddms.bat
new file mode 100644
index 0000000..04f628e
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/ddms.bat
@@ -0,0 +1,74 @@
+@echo off
+rem Copyright (C) 2007 The Android Open Source Project
+rem
+rem Licensed under the Apache License, Version 2.0 (the "License");
+rem you may not use this file except in compliance with the License.
+rem You may obtain a copy of the License at
+rem
+rem http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem don't modify the caller's environment
+setlocal
+
+rem Set up prog to be the path of this script, including following symlinks,
+rem and set up progdir to be the fully-qualified pathname of its directory.
+set prog=%~f0
+
+rem Change current directory and drive to where the script is, to avoid
+rem issues with directories containing whitespaces.
+cd /d %~dp0
+
+rem Get the CWD as a full path with short names only (without spaces)
+for %%i in ("%cd%") do set prog_dir=%%~fsi
+
+rem Check we have a valid Java.exe in the path.
+set java_exe=
+call lib\find_java.bat
+if not defined java_exe goto :EOF
+
+set jarfile=ddms.jar
+set frameworkdir=.
+
+if exist %frameworkdir%\%jarfile% goto JarFileOk
+ set frameworkdir=lib
+
+if exist %frameworkdir%\%jarfile% goto JarFileOk
+ set frameworkdir=..\framework
+
+:JarFileOk
+
+if debug NEQ "%1" goto NoDebug
+ set java_debug=-agentlib:jdwp=transport=dt_socket,server=y,address=8050,suspend=y
+ shift 1
+:NoDebug
+
+set jarpath=%frameworkdir%\%jarfile%;%frameworkdir%\swtmenubar.jar
+
+if not defined ANDROID_SWT goto QueryArch
+ set swt_path=%ANDROID_SWT%
+ goto SwtDone
+
+:QueryArch
+
+ for /f "delims=" %%a in ('"%java_exe%" -jar %frameworkdir%\archquery.jar') do set swt_path=%frameworkdir%\%%a
+
+:SwtDone
+
+if exist "%swt_path%" goto SetPath
+ echo SWT folder '%swt_path%' does not exist.
+ echo Please set ANDROID_SWT to point to the folder containing swt.jar for your platform.
+ exit /B
+
+:SetPath
+set javaextdirs=%swt_path%;%frameworkdir%
+
+echo The standalone version of DDMS is deprecated.
+echo Please use Android Device Monitor (monitor.bat) instead.
+call "%java_exe%" %java_debug% "-Dcom.android.ddms.bindir=%prog_dir%" -classpath "%jarpath%;%swt_path%\swt.jar" com.android.ddms.Main %*
+
diff --git a/love2dToAPK/tools/tools/android-win/tools/draw9patch.bat b/love2dToAPK/tools/tools/android-win/tools/draw9patch.bat
new file mode 100644
index 0000000..6965a36
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/draw9patch.bat
@@ -0,0 +1,46 @@
+@echo off
+rem Copyright (C) 2008 The Android Open Source Project
+rem
+rem Licensed under the Apache License, Version 2.0 (the "License");
+rem you may not use this file except in compliance with the License.
+rem You may obtain a copy of the License at
+rem
+rem http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem don't modify the caller's environment
+setlocal
+
+rem Set up prog to be the path of this script, including following symlinks,
+rem and set up progdir to be the fully-qualified pathname of its directory.
+set prog=%~f0
+
+rem Change current directory and drive to where the script is, to avoid
+rem issues with directories containing whitespaces.
+cd /d %~dp0
+
+rem Check we have a valid Java.exe in the path.
+set java_exe=
+call lib\find_java.bat
+if not defined java_exe goto :EOF
+
+set jarfile=draw9patch.jar
+set frameworkdir=.
+set libdir=
+
+if exist %frameworkdir%\%jarfile% goto JarFileOk
+ set frameworkdir=lib
+
+if exist %frameworkdir%\%jarfile% goto JarFileOk
+ set frameworkdir=..\framework
+
+:JarFileOk
+
+set jarpath=%frameworkdir%\%jarfile%
+
+call "%java_exe%" "-Djava.ext.dirs=%frameworkdir%" -jar %jarpath% %*
diff --git a/love2dToAPK/tools/tools/android-win/tools/hierarchyviewer.bat b/love2dToAPK/tools/tools/android-win/tools/hierarchyviewer.bat
new file mode 100644
index 0000000..ca9b5fb
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/hierarchyviewer.bat
@@ -0,0 +1,75 @@
+@echo off
+rem Copyright (C) 2008 The Android Open Source Project
+rem
+rem Licensed under the Apache License, Version 2.0 (the "License");
+rem you may not use this file except in compliance with the License.
+rem You may obtain a copy of the License at
+rem
+rem http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem don't modify the caller's environment
+setlocal
+
+rem Set up prog to be the path of this script, including following symlinks,
+rem and set up progdir to be the fully-qualified pathname of its directory.
+set prog=%~f0
+
+rem Change current directory and drive to where the script is, to avoid
+rem issues with directories containing whitespaces.
+cd /d %~dp0
+
+rem Get the CWD as a full path with short names only (without spaces)
+for %%i in ("%cd%") do set prog_dir=%%~fsi
+
+rem Check we have a valid Java.exe in the path.
+set java_exe=
+call lib\find_java.bat
+if not defined java_exe goto :EOF
+
+set jarfile=hierarchyviewer2.jar
+set frameworkdir=.
+set libdir=
+
+if exist %frameworkdir%\%jarfile% goto JarFileOk
+ set frameworkdir=lib
+
+if exist %frameworkdir%\%jarfile% goto JarFileOk
+ set frameworkdir=..\framework
+
+:JarFileOk
+
+if debug NEQ "%1" goto NoDebug
+ set java_debug=-agentlib:jdwp=transport=dt_socket,server=y,address=8050,suspend=y
+ shift 1
+:NoDebug
+
+set jarpath=%frameworkdir%\%jarfile%;%frameworkdir%\hierarchyviewerlib.jar;%frameworkdir%\swtmenubar.jar
+
+if not defined ANDROID_SWT goto QueryArch
+ set swt_path=%ANDROID_SWT%
+ goto SwtDone
+
+:QueryArch
+
+ for /f "delims=" %%a in ('"%java_exe%" -jar %frameworkdir%\archquery.jar') do set swt_path=%frameworkdir%\%%a
+
+:SwtDone
+
+if exist "%swt_path%" goto SetPath
+ echo SWT folder '%swt_path%' does not exist.
+ echo Please set ANDROID_SWT to point to the folder containing swt.jar for your platform.
+ exit /B
+
+:SetPath
+
+echo The standalone version of hieararchyviewer is deprecated.
+echo Please use Android Device Monitor (tools/monitor.bat) instead.
+call "%java_exe%" %java_debug% -Xmx512m "-Dcom.android.hierarchyviewer.bindir=%prog_dir%" -classpath "%jarpath%;%swt_path%\swt.jar" com.android.hierarchyviewer.HierarchyViewerApplication %*
+
+
diff --git a/love2dToAPK/tools/tools/android-win/tools/jobb.bat b/love2dToAPK/tools/tools/android-win/tools/jobb.bat
new file mode 100644
index 0000000..20f8ec5
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/jobb.bat
@@ -0,0 +1,51 @@
+@echo off
+rem Copyright (C) 2008 The Android Open Source Project
+rem
+rem Licensed under the Apache License, Version 2.0 (the "License");
+rem you may not use this file except in compliance with the License.
+rem You may obtain a copy of the License at
+rem
+rem http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem don't modify the caller's environment
+setlocal
+
+rem Set up prog to be the path of this script, including following symlinks,
+rem and set up progdir to be the fully-qualified pathname of its directory.
+set prog=%~f0
+
+rem Change current directory and drive to where the script is, to avoid
+rem issues with directories containing whitespaces.
+cd /d %~dp0
+
+rem Get the CWD as a full path with short names only (without spaces)
+for %%i in ("%cd%") do set prog_dir=%%~fsi
+
+rem Check we have a valid Java.exe in the path.
+set java_exe=
+call lib\find_java.bat
+if not defined java_exe goto :EOF
+
+set jarfile=jobb.jar
+set frameworkdir=.
+set libdir=
+
+if exist %frameworkdir%\%jarfile% goto JarFileOk
+ set frameworkdir=lib
+
+if exist %frameworkdir%\%jarfile% goto JarFileOk
+ set frameworkdir=..\framework
+
+:JarFileOk
+
+set jarpath=%frameworkdir%\%jarfile%;%frameworkdir%\libfat32.jar
+
+call "%java_exe%" %java_debug% -classpath "%jarpath%" com.android.jobb.Main %*
+
+
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/android.el b/love2dToAPK/tools/tools/android-win/tools/lib/android.el
new file mode 100644
index 0000000..5c66218
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/android.el
@@ -0,0 +1,131 @@
+;;;; Copyright 2007 The Android Open Source Project
+
+;;; Set up GUD+JDB to attach to a Java process running on the phone or
+;;; under the emulator.
+
+(defvar android-jdb-port-history '("8700")
+ "history of ports supplied to `android-jdb'")
+
+(defvar android-jdb-project-root-history '()
+ "history of project roots supplied to `android-jdb'")
+(defvar android-jdb-history nil
+ "history of commands supplied to `android-jdb'")
+
+(defvar android-jdb-activity-class-history ()
+ "history of activity classes supplied to `start-android-activity'")
+
+(defcustom android-jdb-command-name "jdb"
+ "Name of Java debugger."
+ :type 'string
+ :group 'android)
+
+(defgroup android nil
+ "Android Applications."
+ :group 'applications)
+
+(defcustom android-project-root nil
+ "This is where your Android project root is stored."
+ :type 'directory
+ :group 'android )
+
+(defcustom android-apk nil
+ "This is where your Android Application Package is stored."
+ :type 'string
+ :group 'android)
+
+(defcustom android-activity-class nil
+ "This is where your Android Activity class is stored."
+ :type 'string
+ :group 'android)
+
+(defun android-read-project-root ()
+ (if (or (string-match "XEmacs" emacs-version)
+ (>= emacs-major-version 22))
+ (read-file-name "Android project root: "
+ android-project-root
+ nil
+ t
+ nil
+ 'file-directory-p)
+ (labels ((read-directory ()
+ (read-file-name "Android project root: "
+ android-project-root
+ nil
+ t
+ nil)))
+ (do ((entered-root (read-directory) (read-directory)))
+ ((and entered-root
+ (file-directory-p entered-root))
+ (expand-file-name entered-root))))))
+
+(defun android-jdb (port root)
+ "Set GUD+JDB up to run against Android on PORT in directory ROOT."
+ (interactive
+ (list
+ (read-from-minibuffer "Activity's JDWP DDMS port: "
+ (car android-jdb-port-history)
+ nil
+ t
+ 'android-jdb-port-history)
+ (android-read-project-root)))
+ (setq android-project-root root)
+ (let ((jdb-command
+ (format "%s -attach localhost:%s -sourcepath%s"
+ android-jdb-command-name
+ port
+ (format "%s/src" root))))
+ (if (not (string= jdb-command (car android-jdb-history)))
+ (push jdb-command android-jdb-history))
+ (jdb jdb-command)))
+
+(defun android-emulate ()
+ "Run the Android emulator. This expects the SDK tools directory to be in the current path."
+ (interactive)
+ (compile "emulator"))
+
+(defun android-install-app (apk)
+ "Install an Android application package APK in the Android emulator. This expects the SDK tools directory to be in the current path."
+ (interactive (list (expand-file-name
+ (read-file-name "Android Application Package (.apk): "
+ nil
+ android-apk
+ t
+ nil
+ nil))))
+ (setq android-apk apk)
+ (compile (format "adb install -r %s" apk)))
+
+(defun android-uninstall-app (package-name)
+ "Uninstall an Android application package APK in the Android emulator. This expects the SDK tools directory to be in the current path.
+Specify the package name --- and not the name of the application e.g., com.android.foo."
+ (interactive
+ (list
+ (read-from-minibuffer "Package: ")))
+ (compile (format "adb uninstall %s" package-name)))
+
+(defun android-start-activity (package class)
+ "Start the activity PACKAGE/CLASS in the Android emulator. This expects the SDK tools directory to be in the current path."
+ (interactive
+ (list
+ (read-from-minibuffer "Package: ")
+ (read-from-minibuffer "Activity Java class: "
+ (car android-jdb-activity-class-history)
+ nil
+ t
+ 'android-jdb-activity-class-history)))
+ (compile (format "adb shell am start -n %s/%s" package class)))
+
+(defun android-debug-activity (package class)
+ "Start the activity PACKAGE/CLASS within the debugger in the Android emulator. This expects the SDK tools directory to be in the current path."
+ (interactive
+ (list
+ (read-from-minibuffer "Package: ")
+ (read-from-minibuffer "Activity Java class: "
+ (car android-jdb-activity-class-history)
+ nil
+ t
+ 'android-jdb-activity-class-history)))
+ (compile (format "adb shell am start -D -n %s/%s" package class)))
+
+(provide 'android)
+
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/annotations-12.0.jar b/love2dToAPK/tools/tools/android-win/tools/lib/annotations-12.0.jar
new file mode 100644
index 0000000..7f8b362
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/annotations-12.0.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/annotations.jar b/love2dToAPK/tools/tools/android-win/tools/lib/annotations.jar
new file mode 100644
index 0000000..9c2a338
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/annotations.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/ant-tasks.jar b/love2dToAPK/tools/tools/android-win/tools/lib/ant-tasks.jar
new file mode 100644
index 0000000..88db7f8
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/ant-tasks.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/archquery.jar b/love2dToAPK/tools/tools/android-win/tools/lib/archquery.jar
new file mode 100644
index 0000000..a4c2ce4
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/archquery.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/asm-5.0.3.jar b/love2dToAPK/tools/tools/android-win/tools/lib/asm-5.0.3.jar
new file mode 100644
index 0000000..573535b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/asm-5.0.3.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/asm-analysis-5.0.3.jar b/love2dToAPK/tools/tools/android-win/tools/lib/asm-analysis-5.0.3.jar
new file mode 100644
index 0000000..8b73cf0
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/asm-analysis-5.0.3.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/asm-tree-5.0.3.jar b/love2dToAPK/tools/tools/android-win/tools/lib/asm-tree-5.0.3.jar
new file mode 100644
index 0000000..e7eae53
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/asm-tree-5.0.3.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/asset-studio.jar b/love2dToAPK/tools/tools/android-win/tools/lib/asset-studio.jar
new file mode 100644
index 0000000..ad879b1
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/asset-studio.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/build.template b/love2dToAPK/tools/tools/android-win/tools/lib/build.template
new file mode 100644
index 0000000..aea57a2
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/build.template
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="PROJECT_NAME" default="help">
+
+ <!-- The local.properties file is created and updated by the 'android' tool.
+ It contains the path to the SDK. It should *NOT* be checked into
+ Version Control Systems. -->
+ <property file="local.properties" />
+
+ <!-- The ant.properties file can be created by you. It is only edited by the
+ 'android' tool to add properties to it.
+ This is the place to change some Ant specific build properties.
+ Here are some properties you may want to change/update:
+
+ source.dir
+ The name of the source directory. Default is 'src'.
+ out.dir
+ The name of the output directory. Default is 'bin'.
+
+ For other overridable properties, look at the beginning of the rules
+ files in the SDK, at tools/ant/build.xml
+
+ Properties related to the SDK location or the project target should
+ be updated using the 'android' tool with the 'update' action.
+
+ This file is an integral part of the build system for your
+ application and should be checked into Version Control Systems.
+
+ -->
+ <property file="ant.properties" />
+
+ <!-- if sdk.dir was not set from one of the property file, then
+ get it from the ANDROID_HOME env var.
+ This must be done before we load project.properties since
+ the proguard config can use sdk.dir -->
+ <property environment="env" />
+ <condition property="sdk.dir" value="${env.ANDROID_HOME}">
+ <isset property="env.ANDROID_HOME" />
+ </condition>
+
+ <!-- The project.properties file is created and updated by the 'android'
+ tool, as well as ADT.
+
+ This contains project specific properties such as project target, and library
+ dependencies. Lower level build properties are stored in ant.properties
+ (or in .classpath for Eclipse projects).
+
+ This file is an integral part of the build system for your
+ application and should be checked into Version Control Systems. -->
+ <loadproperties srcFile="project.properties" />
+
+ <!-- quick check on sdk.dir -->
+ <fail
+ message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
+ unless="sdk.dir"
+ />
+
+ <!--
+ Import per project custom build rules if present at the root of the project.
+ This is the place to put custom intermediary targets such as:
+ -pre-build
+ -pre-compile
+ -post-compile (This is typically used for code obfuscation.
+ Compiled code location: ${out.classes.absolute.dir}
+ If this is not done in place, override ${out.dex.input.absolute.dir})
+ -post-package
+ -post-build
+ -pre-clean
+ -->
+ <import file="custom_rules.xml" optional="true" />
+
+ <!-- Import the actual build file.
+
+ To customize existing targets, there are two options:
+ - Customize only one target:
+ - copy/paste the target into this file, *before* the
+ <import> task.
+ - customize it to your needs.
+ - Customize the whole content of build.xml
+ - copy/paste the content of the rules files (minus the top node)
+ into this file, replacing the <import> task.
+ - customize to your needs.
+
+ ***********************
+ ****** IMPORTANT ******
+ ***********************
+ In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
+ in order to avoid having your file be overridden by tools such as "android update project"
+ -->
+ <!-- version-tag: VERSION_TAG -->
+ <import file="${sdk.dir}/tools/ant/build.xml" />
+
+</project>
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/build_gradle.template b/love2dToAPK/tools/tools/android-win/tools/lib/build_gradle.template
new file mode 100644
index 0000000..6ec137c
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/build_gradle.template
@@ -0,0 +1,21 @@
+buildscript {
+ repositories {
+ mavenCentral()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:ARTIFACT_VERSION'
+ }
+}
+apply plugin: 'PLUGIN'
+
+android {
+ compileSdkVersion 'TARGET'
+ buildToolsVersion 'BUILD_TOOL_REV'
+
+ buildTypes {
+ release {
+ runProguard false
+ proguardFile getDefaultProguardFile('proguard-android.txt')
+ }
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/builder-model.jar b/love2dToAPK/tools/tools/android-win/tools/lib/builder-model.jar
new file mode 100644
index 0000000..82318e2
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/builder-model.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/cglib-nodep-3.1.jar b/love2dToAPK/tools/tools/android-win/tools/lib/cglib-nodep-3.1.jar
new file mode 100644
index 0000000..c0ac121
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/cglib-nodep-3.1.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/chimpchat.jar b/love2dToAPK/tools/tools/android-win/tools/lib/chimpchat.jar
new file mode 100644
index 0000000..6b6969c
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/chimpchat.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/common.jar b/love2dToAPK/tools/tools/android-win/tools/lib/common.jar
new file mode 100644
index 0000000..c15dc24
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/common.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/commons-codec-1.4.jar b/love2dToAPK/tools/tools/android-win/tools/lib/commons-codec-1.4.jar
new file mode 100644
index 0000000..458d432
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/commons-codec-1.4.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/commons-compress-1.8.1.jar b/love2dToAPK/tools/tools/android-win/tools/lib/commons-compress-1.8.1.jar
new file mode 100644
index 0000000..66b0a56
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/commons-compress-1.8.1.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/commons-logging-1.1.1.jar b/love2dToAPK/tools/tools/android-win/tools/lib/commons-logging-1.1.1.jar
new file mode 100644
index 0000000..1deef14
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/commons-logging-1.1.1.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/ddmlib.jar b/love2dToAPK/tools/tools/android-win/tools/lib/ddmlib.jar
new file mode 100644
index 0000000..41204a6
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/ddmlib.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/ddms.jar b/love2dToAPK/tools/tools/android-win/tools/lib/ddms.jar
new file mode 100644
index 0000000..2dba0be
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/ddms.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/ddmuilib.jar b/love2dToAPK/tools/tools/android-win/tools/lib/ddmuilib.jar
new file mode 100644
index 0000000..c8d25ad
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/ddmuilib.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/devices.xml b/love2dToAPK/tools/tools/android-win/tools/lib/devices.xml
new file mode 100644
index 0000000..0c7cb96
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/devices.xml
@@ -0,0 +1,595 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<d:devices xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:d="http://schemas.android.com/sdk/devices/1">
+
+ <d:device>
+ <d:name>Nexus One</d:name>
+ <d:manufacturer>Google</d:manufacturer>
+ <d:hardware>
+ <d:screen>
+ <d:screen-size>normal</d:screen-size>
+ <d:diagonal-length>3.7</d:diagonal-length>
+ <d:pixel-density>hdpi</d:pixel-density>
+ <d:screen-ratio>long</d:screen-ratio>
+ <d:dimensions>
+ <d:x-dimension>480</d:x-dimension>
+ <d:y-dimension>800</d:y-dimension>
+ </d:dimensions>
+ <d:xdpi>254</d:xdpi>
+ <d:ydpi>254</d:ydpi>
+ <d:touch>
+ <d:multitouch>basic</d:multitouch>
+ <d:mechanism>finger</d:mechanism>
+ <d:screen-type>capacitive</d:screen-type>
+ </d:touch>
+ </d:screen>
+ <d:networking>
+ Wifi
+ Bluetooth
+ </d:networking>
+ <d:sensors>
+ Accelerometer
+ Compass
+ GPS
+ LightSensor
+ ProximitySensor
+ </d:sensors>
+ <d:mic>true</d:mic>
+ <d:camera>
+ <d:location>back</d:location>
+ <d:autofocus>true</d:autofocus>
+ <d:flash>true</d:flash>
+ </d:camera>
+ <d:keyboard>nokeys</d:keyboard>
+ <d:nav>trackball</d:nav>
+ <d:ram unit="MiB">512</d:ram>
+ <d:buttons>hard</d:buttons>
+ <d:internal-storage unit="MiB">503</d:internal-storage>
+ <d:removable-storage unit="MiB">0</d:removable-storage>
+ <d:cpu>Qualcomm Scorpion</d:cpu>
+ <d:gpu>Qualcomm Adreno 200</d:gpu>
+ <d:abi>
+ armeabi-v7a
+ armeabi
+ </d:abi>
+ <d:dock> </d:dock>
+ <d:power-type>battery</d:power-type>
+ </d:hardware>
+ <d:software>
+ <d:api-level>7-10</d:api-level>
+ <d:live-wallpaper-support>true</d:live-wallpaper-support>
+ <d:bluetooth-profiles> </d:bluetooth-profiles>
+ <d:gl-version>2.0</d:gl-version>
+ <d:gl-extensions>
+ </d:gl-extensions>
+ <d:status-bar>true</d:status-bar>
+ </d:software>
+ <d:state name="Portrait" default="true">
+ <d:description>The phone in portrait view</d:description>
+ <d:screen-orientation>port</d:screen-orientation>
+ <d:keyboard-state>keyssoft</d:keyboard-state>
+ <d:nav-state>nonav</d:nav-state>
+ </d:state>
+ <d:state name="Landscape">
+ <d:description>The phone in landscape view</d:description>
+ <d:screen-orientation>land</d:screen-orientation>
+ <d:keyboard-state>keyssoft</d:keyboard-state>
+ <d:nav-state>nonav</d:nav-state>
+ </d:state>
+ </d:device>
+ <d:device>
+ <d:name>Nexus S</d:name>
+ <d:manufacturer>Google</d:manufacturer>
+ <d:hardware>
+ <d:screen>
+ <d:screen-size>normal</d:screen-size>
+ <d:diagonal-length>4</d:diagonal-length>
+ <d:pixel-density>hdpi</d:pixel-density>
+ <d:screen-ratio>long</d:screen-ratio>
+ <d:dimensions>
+ <d:x-dimension>480</d:x-dimension>
+ <d:y-dimension>800</d:y-dimension>
+ </d:dimensions>
+ <d:xdpi>235</d:xdpi>
+ <d:ydpi>235</d:ydpi>
+ <d:touch>
+ <d:multitouch>jazz-hands</d:multitouch>
+ <d:mechanism>finger</d:mechanism>
+ <d:screen-type>capacitive</d:screen-type>
+ </d:touch>
+ </d:screen>
+ <d:networking>
+ Wifi
+ Bluetooth
+ NFC
+ </d:networking>
+ <d:sensors>
+ Accelerometer
+ Compass
+ GPS
+ Gyroscope
+ LightSensor
+ ProximitySensor
+ </d:sensors>
+ <d:mic>true</d:mic>
+ <d:camera>
+ <d:location>back</d:location>
+ <d:autofocus>true</d:autofocus>
+ <d:flash>true</d:flash>
+ </d:camera>
+ <d:camera>
+ <d:location>front</d:location>
+ <d:autofocus>false</d:autofocus>
+ <d:flash>false</d:flash>
+ </d:camera>
+ <d:keyboard>nokeys</d:keyboard>
+ <d:nav>nonav</d:nav>
+ <d:ram unit="KiB">351428</d:ram>
+ <d:buttons>hard</d:buttons>
+ <d:internal-storage unit="MiB">503</d:internal-storage>
+ <d:removable-storage unit="MiB">0</d:removable-storage>
+ <d:cpu>Samsung Exynos 3110</d:cpu>
+ <d:gpu>PowerVR SGX 540</d:gpu>
+ <d:abi>
+ armeabi-v7a
+ armeabi
+ </d:abi>
+ <d:dock> </d:dock>
+ <d:power-type>battery</d:power-type>
+ </d:hardware>
+ <d:software>
+ <d:api-level>9-16</d:api-level>
+ <d:live-wallpaper-support>true</d:live-wallpaper-support>
+ <d:bluetooth-profiles> </d:bluetooth-profiles>
+ <d:gl-version>2.0</d:gl-version>
+ <d:gl-extensions>
+ GL_EXT_debug_marker
+ GL_OES_rgb8_rgba8
+ GL_OES_depth24
+ GL_OES_vertex_half_float
+ GL_OES_texture_float
+ GL_OES_texture_half_float
+ GL_OES_element_index_uint
+ GL_OES_mapbuffer
+ GL_OES_fragment_precision_high
+ GL_OES_compressed_ETC1_RGB8_texture
+ GL_OES_EGL_image
+ GL_OES_EGL_image_external
+ GL_OES_required_internalformat
+ GL_OES_depth_texture
+ GL_OES_get_program_binary
+ GL_OES_packed_depth_stencil
+ GL_OES_standard_derivatives
+ GL_OES_vertex_array_object
+ GL_OES_egl_sync
+ GL_EXT_multi_draw_arrays
+ GL_EXT_texture_format_BGRA8888
+ GL_EXT_discard_framebuffer
+ GL_EXT_shader_texture_lod
+ GL_IMG_shader_binary
+ GL_IMG_texture_compression_pvrtc
+ GL_IMG_texture_npot
+ GL_IMG_texture_format_BGRA8888
+ GL_IMG_read_format
+ GL_IMG_program_binary
+ GL_IMG_multisampled_render_to_texture
+ </d:gl-extensions>
+ <d:status-bar>true</d:status-bar>
+ </d:software>
+ <d:state name="Portrait" default="true">
+ <d:description>The phone in portrait view</d:description>
+ <d:screen-orientation>port</d:screen-orientation>
+ <d:keyboard-state>keyssoft</d:keyboard-state>
+ <d:nav-state>nonav</d:nav-state>
+ </d:state>
+ <d:state name="Landscape">
+ <d:description>The phone in landscape view</d:description>
+ <d:screen-orientation>land</d:screen-orientation>
+ <d:keyboard-state>keyssoft</d:keyboard-state>
+ <d:nav-state>nonav</d:nav-state>
+ </d:state>
+ </d:device>
+
+ <d:device>
+ <d:name>Galaxy Nexus</d:name>
+ <d:manufacturer>Google</d:manufacturer>
+ <d:hardware>
+ <d:screen>
+ <d:screen-size>normal</d:screen-size>
+ <d:diagonal-length>4.65</d:diagonal-length> <!-- In inches -->
+ <d:pixel-density>xhdpi</d:pixel-density>
+ <d:screen-ratio>long</d:screen-ratio>
+ <d:dimensions>
+ <d:x-dimension>720</d:x-dimension>
+ <d:y-dimension>1280</d:y-dimension>
+ </d:dimensions>
+ <d:xdpi>316</d:xdpi>
+ <d:ydpi>316</d:ydpi>
+ <d:touch>
+ <d:multitouch>jazz-hands</d:multitouch>
+ <d:mechanism>finger</d:mechanism>
+ <d:screen-type>capacitive</d:screen-type>
+ </d:touch>
+ </d:screen>
+ <d:networking>
+ Bluetooth
+ Wifi
+ NFC
+ </d:networking>
+ <d:sensors>
+ Accelerometer
+ Barometer
+ Gyroscope
+ Compass
+ GPS
+ ProximitySensor
+ </d:sensors>
+ <d:mic>true</d:mic>
+ <d:camera>
+ <d:location>front</d:location>
+ <d:autofocus>true</d:autofocus>
+ <d:flash>false</d:flash>
+ </d:camera>
+ <d:camera>
+ <d:location>back</d:location>
+ <d:autofocus>true</d:autofocus>
+ <d:flash>true</d:flash>
+ </d:camera>
+ <d:keyboard>nokeys</d:keyboard>
+ <d:nav>nonav</d:nav>
+ <d:ram unit="GiB">1</d:ram>
+ <d:buttons>soft</d:buttons>
+ <d:internal-storage unit="GiB">16</d:internal-storage>
+ <d:removable-storage unit="KiB"></d:removable-storage>
+ <d:cpu>OMAP 4460</d:cpu> <!-- cpu type (Tegra3) freeform -->
+ <d:gpu>PowerVR SGX540</d:gpu>
+ <d:abi>
+ armeabi
+ armeabi-v7a
+ </d:abi>
+ <!--dock (car, desk, tv, none)-->
+ <d:dock>
+ </d:dock>
+ <!-- power-type (battery, plugged-in) -->
+ <d:power-type>battery</d:power-type>
+ </d:hardware>
+ <d:software>
+ <d:api-level>14-</d:api-level>
+ <d:live-wallpaper-support>true</d:live-wallpaper-support>
+ <d:bluetooth-profiles>
+ HSP
+ HFP
+ SPP
+ A2DP
+ AVRCP
+ OPP
+ PBAP
+ GAVDP
+ AVDTP
+ HID
+ HDP
+ PAN
+ </d:bluetooth-profiles>
+ <d:gl-version>2.0</d:gl-version>
+ <!--
+ These can be gotten via
+ javax.microedition.khronos.opengles.GL10.glGetString(GL10.GL_EXTENSIONS);
+ -->
+ <d:gl-extensions>
+ GL_EXT_discard_framebuffer
+ GL_EXT_multi_draw_arrays
+ GL_EXT_shader_texture_lod
+ GL_EXT_texture_format_BGRA8888
+ GL_IMG_multisampled_render_to_texture
+ GL_IMG_program_binary
+ GL_IMG_read_format
+ GL_IMG_shader_binary
+ GL_IMG_texture_compression_pvrtc
+ GL_IMG_texture_format_BGRA8888
+ GL_IMG_texture_npot
+ GL_OES_compressed_ETC1_RGB8_texture
+ GL_OES_depth_texture
+ GL_OES_depth24
+ GL_OES_EGL_image
+ GL_OES_EGL_image_external
+ GL_OES_egl_sync
+ GL_OES_element_index_uint
+ GL_OES_fragment_precision_high
+ GL_OES_get_program_binary
+ GL_OES_mapbuffer
+ GL_OES_packed_depth_stencil
+ GL_OES_required_internalformat
+ GL_OES_rgb8_rgba8
+ GL_OES_standard_derivatives
+ GL_OES_texture_float
+ GL_OES_texture_half_float
+ GL_OES_vertex_array_object
+ GL_OES_vertex_half_float
+ </d:gl-extensions>
+ <d:status-bar>true</d:status-bar>
+ </d:software>
+ <d:state name="Portrait" default="true">
+ <d:description>The phone in portrait view</d:description>
+ <d:screen-orientation>port</d:screen-orientation>
+ <d:keyboard-state>keyssoft</d:keyboard-state>
+ <d:nav-state>nonav</d:nav-state>
+ </d:state>
+ <d:state name="Landscape">
+ <d:description>The phone in landscape view</d:description>
+ <d:screen-orientation>land</d:screen-orientation>
+ <d:keyboard-state>keyssoft</d:keyboard-state>
+ <d:nav-state>nonav</d:nav-state>
+ </d:state>
+ </d:device>
+ <d:device>
+ <d:name>Nexus 7</d:name>
+ <d:manufacturer>Google</d:manufacturer>
+ <d:hardware>
+ <d:screen>
+ <d:screen-size>large</d:screen-size>
+ <d:diagonal-length>7.27</d:diagonal-length>
+ <d:pixel-density>tvdpi</d:pixel-density>
+ <d:screen-ratio>notlong</d:screen-ratio>
+ <d:dimensions>
+ <d:x-dimension>800</d:x-dimension>
+ <d:y-dimension>1280</d:y-dimension>
+ </d:dimensions>
+ <d:xdpi>195</d:xdpi>
+ <d:ydpi>200</d:ydpi>
+ <d:touch>
+ <d:multitouch>jazz-hands</d:multitouch>
+ <d:mechanism>finger</d:mechanism>
+ <d:screen-type>capacitive</d:screen-type>
+ </d:touch>
+ </d:screen>
+ <d:networking>
+ Wifi
+ Bluetooth
+ NFC
+ </d:networking>
+ <d:sensors>
+ Accelerometer
+ Compass
+ GPS
+ Gyroscope
+ LightSensor
+ </d:sensors>
+ <d:mic>true</d:mic>
+ <d:camera>
+ <d:location>front</d:location>
+ <d:autofocus>false</d:autofocus>
+ <d:flash>false</d:flash>
+ </d:camera>
+ <d:keyboard>nokeys</d:keyboard>
+ <d:nav>nonav</d:nav>
+ <d:ram unit="GiB">1</d:ram>
+ <d:buttons>soft</d:buttons>
+ <d:internal-storage unit="GiB">8</d:internal-storage>
+ <d:removable-storage unit="MiB"> </d:removable-storage>
+ <d:cpu> Tegra3 </d:cpu>
+ <d:gpu> Tegra3 </d:gpu>
+ <d:abi>
+ armeabi-v7a
+ armeabi
+ </d:abi>
+ <d:dock> </d:dock>
+ <d:power-type>battery</d:power-type>
+ </d:hardware>
+
+ <d:software>
+ <d:api-level>16</d:api-level>
+ <d:live-wallpaper-support>true</d:live-wallpaper-support>
+ <d:bluetooth-profiles> </d:bluetooth-profiles>
+ <d:gl-version>2.0</d:gl-version>
+ <d:gl-extensions> </d:gl-extensions>
+ <d:status-bar>true</d:status-bar>
+ </d:software>
+
+ <d:state name="Portrait" default="true">
+ <d:description>The phone in portrait view</d:description>
+ <d:screen-orientation>port</d:screen-orientation>
+ <d:keyboard-state>keyssoft</d:keyboard-state>
+ <d:nav-state>nonav</d:nav-state>
+ </d:state>
+ <d:state name="Landscape">
+ <d:description>The phone in landscape view</d:description>
+ <d:screen-orientation>land</d:screen-orientation>
+ <d:keyboard-state>keyssoft</d:keyboard-state>
+ <d:nav-state>nonav</d:nav-state>
+ </d:state>
+
+ </d:device>
+
+ <d:device>
+ <d:name>Nexus 4</d:name>
+ <d:manufacturer>Google</d:manufacturer>
+ <d:hardware>
+ <d:screen>
+ <d:screen-size>normal</d:screen-size>
+ <d:diagonal-length>4.7</d:diagonal-length>
+ <d:pixel-density>xhdpi</d:pixel-density>
+ <d:screen-ratio>notlong</d:screen-ratio>
+ <d:dimensions>
+ <d:x-dimension>768</d:x-dimension>
+ <d:y-dimension>1280</d:y-dimension>
+ </d:dimensions>
+ <d:xdpi>320</d:xdpi>
+ <d:ydpi>320</d:ydpi>
+ <d:touch>
+ <d:multitouch>jazz-hands</d:multitouch>
+ <d:mechanism>finger</d:mechanism>
+ <d:screen-type>capacitive</d:screen-type>
+ </d:touch>
+ </d:screen>
+ <d:networking>
+ Wifi
+ Bluetooth
+ NFC
+ </d:networking>
+ <d:sensors>
+ Accelerometer
+ Barometer
+ Compass
+ GPS
+ Gyroscope
+ LightSensor
+ ProximitySensor
+ </d:sensors>
+ <d:mic>true</d:mic>
+ <d:camera>
+ <d:location>back</d:location>
+ <d:autofocus>true</d:autofocus>
+ <d:flash>true</d:flash>
+ </d:camera>
+ <d:camera>
+ <d:location>front</d:location>
+ <d:autofocus>false</d:autofocus>
+ <d:flash>false</d:flash>
+ </d:camera>
+ <d:keyboard>nokeys</d:keyboard>
+ <d:nav>nonav</d:nav>
+ <d:ram unit="KiB">1953125</d:ram>
+ <d:buttons>soft</d:buttons>
+ <d:internal-storage unit="KiB">7811891</d:internal-storage>
+ <d:removable-storage unit="MiB"></d:removable-storage>
+ <d:cpu>Qualcomm Snapdragon S4 Pro</d:cpu>
+ <d:gpu>Adreno 320</d:gpu>
+ <d:abi>
+ armeabi-v7a
+ armeabi
+ </d:abi>
+ <d:dock></d:dock>
+ <d:power-type>battery</d:power-type>
+ </d:hardware>
+ <d:software>
+ <d:api-level>16</d:api-level>
+ <d:live-wallpaper-support>true</d:live-wallpaper-support>
+ <d:bluetooth-profiles></d:bluetooth-profiles>
+ <d:gl-version>2.0</d:gl-version>
+ <d:gl-extensions>GL_EXT_debug_marker GL_AMD_compressed_ATC_texture
+ GL_AMD_performance_monitor GL_AMD_program_binary_Z400 GL_EXT_robustness
+ GL_EXT_texture_format_BGRA8888 GL_EXT_texture_type_2_10_10_10_REV GL_NV_fence
+ GL_OES_compressed_ETC1_RGB8_texture GL_OES_depth_texture GL_OES_depth24
+ GL_OES_EGL_image GL_OES_EGL_image_external GL_OES_element_index_uint
+ GL_OES_fbo_render_mipmap GL_OES_fragment_precision_high GL_OES_get_program_binary
+ GL_OES_packed_depth_stencil GL_OES_rgb8_rgba8 GL_OES_standard_derivatives
+ GL_OES_texture_3D GL_OES_texture_float GL_OES_texture_half_float
+ GL_OES_texture_half_float_linear GL_OES_texture_npot GL_OES_vertex_half_float
+ GL_OES_vertex_type_10_10_10_2 GL_OES_vertex_array_object GL_QCOM_alpha_test
+ GL_QCOM_binning_control GL_QCOM_driver_control GL_QCOM_perfmon_global_mode
+ GL_QCOM_extended_get GL_QCOM_extended_get2 GL_QCOM_tiled_rendering
+ GL_QCOM_writeonly_rendering GL_EXT_sRGB
+ </d:gl-extensions>
+ <d:status-bar>true</d:status-bar>
+ </d:software>
+ <d:state name="Portrait" default="true">
+ <d:description>The phone in portrait view</d:description>
+ <d:screen-orientation>port</d:screen-orientation>
+ <d:keyboard-state>keyssoft</d:keyboard-state>
+ <d:nav-state>nonav</d:nav-state>
+ </d:state>
+ <d:state name="Landscape">
+ <d:description>The phone in landscape view</d:description>
+ <d:screen-orientation>land</d:screen-orientation>
+ <d:keyboard-state>keyssoft</d:keyboard-state>
+ <d:nav-state>nonav</d:nav-state>
+ </d:state>
+ </d:device>
+
+ <d:device>
+ <d:name>Nexus 10</d:name>
+ <d:manufacturer>Google</d:manufacturer>
+ <d:hardware>
+ <d:screen>
+ <d:screen-size>xlarge</d:screen-size>
+ <d:diagonal-length>10.055</d:diagonal-length>
+ <d:pixel-density>xhdpi</d:pixel-density>
+ <d:screen-ratio>notlong</d:screen-ratio>
+ <d:dimensions>
+ <d:x-dimension>2560</d:x-dimension>
+ <d:y-dimension>1600</d:y-dimension>
+ </d:dimensions>
+ <d:xdpi>300</d:xdpi>
+ <d:ydpi>300</d:ydpi>
+ <d:touch>
+ <d:multitouch>jazz-hands</d:multitouch>
+ <d:mechanism>finger</d:mechanism>
+ <d:screen-type>capacitive</d:screen-type>
+ </d:touch>
+ </d:screen>
+ <d:networking>
+ Wifi
+ Bluetooth
+ NFC
+ </d:networking>
+ <d:sensors>
+ Accelerometer
+ Barometer
+ Compass
+ GPS
+ Gyroscope
+ LightSensor
+ </d:sensors>
+ <d:mic>true</d:mic>
+ <d:camera>
+ <d:location>back</d:location>
+ <d:autofocus>true</d:autofocus>
+ <d:flash>true</d:flash>
+ </d:camera>
+ <d:camera>
+ <d:location>front</d:location>
+ <d:autofocus>false</d:autofocus>
+ <d:flash>false</d:flash>
+ </d:camera>
+ <d:keyboard>nokeys</d:keyboard>
+ <d:nav>nonav</d:nav>
+ <d:ram unit="KiB">1953125</d:ram>
+ <d:buttons>soft</d:buttons>
+ <d:internal-storage unit="KiB">15623782</d:internal-storage>
+ <d:removable-storage unit="MiB"></d:removable-storage>
+ <d:cpu>Dual-core A15</d:cpu>
+ <d:gpu>Quad-core Mali T604</d:gpu>
+ <d:abi>
+ armeabi-v7a
+ armeabi
+ </d:abi>
+ <d:dock></d:dock>
+ <d:power-type>battery</d:power-type>
+ </d:hardware>
+ <d:software>
+ <d:api-level>16</d:api-level>
+ <d:live-wallpaper-support>true</d:live-wallpaper-support>
+ <d:bluetooth-profiles></d:bluetooth-profiles>
+ <d:gl-version>2.0</d:gl-version>
+ <d:gl-extensions>GL_EXT_debug_marker GL_ARM_rgba8 GL_ARM_mali_shader_binary
+ GL_OES_depth24 GL_OES_depth_texture GL_OES_depth_texture_cube_map
+ GL_OES_packed_depth_stencil GL_OES_rgb8_rgba8 GL_EXT_read_format_bgra
+ GL_OES_compressed_paletted_texture GL_OES_compressed_ETC1_RGB8_texture
+ GL_OES_standard_derivatives GL_OES_EGL_image GL_OES_EGL_image_external
+ GL_OES_EGL_sync GL_OES_texture_npot GL_OES_vertex_half_float
+ GL_OES_required_internalformat GL_OES_vertex_array_object GL_OES_mapbuffer
+ GL_EXT_texture_format_BGRA8888 GL_EXT_texture_rg GL_EXT_texture_type_2_10_10_10_REV
+ GL_OES_fbo_render_mipmap GL_OES_element_index_uint GL_EXT_shadow_samplers
+ GL_EXT_occlusion_query_boolean GL_EXT_blend_minmax GL_EXT_discard_framebuffer
+ GL_OES_get_program_binary GL_OES_texture_3D GL_EXT_texture_storage
+ GL_EXT_multisampled_render_to_texture GL_OES_surfaceless_context
+ GL_ARM_mali_program_binary
+ </d:gl-extensions>
+ <d:status-bar>true</d:status-bar>
+ </d:software>
+ <d:state name="Portrait">
+ <d:description>The phone in portrait view</d:description>
+ <d:screen-orientation>port</d:screen-orientation>
+ <d:keyboard-state>keyssoft</d:keyboard-state>
+ <d:nav-state>nonav</d:nav-state>
+ </d:state>
+ <d:state name="Landscape" default="true">
+ <d:description>The phone in landscape view</d:description>
+ <d:screen-orientation>land</d:screen-orientation>
+ <d:keyboard-state>keyssoft</d:keyboard-state>
+ <d:nav-state>nonav</d:nav-state>
+ </d:state>
+ </d:device>
+
+</d:devices>
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/draw9patch.jar b/love2dToAPK/tools/tools/android-win/tools/lib/draw9patch.jar
new file mode 100644
index 0000000..4721e3c
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/draw9patch.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/dvlib.jar b/love2dToAPK/tools/tools/android-win/tools/lib/dvlib.jar
new file mode 100644
index 0000000..204163e
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/dvlib.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/easymock-3.3.jar b/love2dToAPK/tools/tools/android-win/tools/lib/easymock-3.3.jar
new file mode 100644
index 0000000..544273b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/easymock-3.3.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/ecj-4.4.2.jar b/love2dToAPK/tools/tools/android-win/tools/lib/ecj-4.4.2.jar
new file mode 100644
index 0000000..d9411b3
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/ecj-4.4.2.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/emma.jar b/love2dToAPK/tools/tools/android-win/tools/lib/emma.jar
new file mode 100644
index 0000000..27629de
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/emma.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/emma_ant.jar b/love2dToAPK/tools/tools/android-win/tools/lib/emma_ant.jar
new file mode 100644
index 0000000..3f28c2c
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/emma_ant.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/emma_device.jar b/love2dToAPK/tools/tools/android-win/tools/lib/emma_device.jar
new file mode 100644
index 0000000..42302e0
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/emma_device.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/fat32lib.jar b/love2dToAPK/tools/tools/android-win/tools/lib/fat32lib.jar
new file mode 100644
index 0000000..82f6d1d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/fat32lib.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/find_java.bat b/love2dToAPK/tools/tools/android-win/tools/lib/find_java.bat
new file mode 100644
index 0000000..f4a6af0
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/find_java.bat
@@ -0,0 +1,68 @@
+@echo off
+rem Copyright (C) 2007 The Android Open Source Project
+rem
+rem Licensed under the Apache License, Version 2.0 (the "License");
+rem you may not use this file except in compliance with the License.
+rem You may obtain a copy of the License at
+rem
+rem http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem This script is called by the other batch files to find a suitable Java.exe
+rem to use. The script changes the "java_exe" env variable. The variable
+rem is left unset if Java.exe was not found.
+
+rem Useful links:
+rem Command-line reference:
+rem http://technet.microsoft.com/en-us/library/bb490890.aspx
+
+rem Query whether this system is 32-bit or 64-bit
+rem Note: Some users report that reg.exe is missing on their machine, so we
+rem check for that first, as we'd like to use it if we can.
+set sys_32=%SYSTEMROOT%\system32
+if exist %sys_32%\reg.exe (
+ rem This first-pass solution returns the correct architecture even if you
+ rem call this .bat file from a 32-bit process.
+ rem See also: http://stackoverflow.com/a/24590583/1299302
+ %sys_32%\reg query "HKLM\Hardware\Description\System\CentralProcessor\0"^
+ | %sys_32%\find /i "x86" > NUL && set arch_ext=32|| set arch_ext=64
+) else (
+ rem This fallback approach is simpler, but may misreport your architecture as
+ rem 32-bit if running from a 32-bit process. Still, it should serve to help
+ rem our users without reg.exe, at least.
+ if "%PROCESSOR_ARCHITECTURE%" == "x86" (set arch_ext=32) else (set arch_ext=64)
+)
+
+rem Check we have a valid Java.exe in the path. The return code will
+rem be 0 if the command worked or 1 if the exec failed (program not found).
+for /f "delims=" %%a in ('"%~dps0\find_java%arch_ext%.exe" -s') do set java_exe=%%a
+if not defined java_exe goto :CheckFailed
+
+:SearchJavaW
+rem Check if we can find a javaw.exe at the same location than java.exe.
+rem If that doesn't work, just fall back on the java.exe we just found.
+for /f "delims=" %%a in ('"%~dps0\find_java%arch_ext%.exe" -s -w') do set javaw_exe=%%a
+if not exist "%javaw_exe%" set javaw_exe=%java_exe%
+goto :EOF
+
+
+:CheckFailed
+echo.
+echo ERROR: No suitable Java found. In order to properly use the Android Developer
+echo Tools, you need a suitable version of Java JDK installed on your system.
+echo We recommend that you install the JDK version of JavaSE, available here:
+echo http://www.oracle.com/technetwork/java/javase/downloads
+echo.
+echo If you already have Java installed, you can define the JAVA_HOME environment
+echo variable in Control Panel / System / Avanced System Settings to point to the
+echo JDK folder.
+echo.
+echo You can find the complete Android SDK requirements here:
+echo http://developer.android.com/sdk/requirements.html
+echo.
+goto :EOF
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/find_java32.exe b/love2dToAPK/tools/tools/android-win/tools/lib/find_java32.exe
new file mode 100644
index 0000000..f66976a
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/find_java32.exe
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/find_java64.exe b/love2dToAPK/tools/tools/android-win/tools/lib/find_java64.exe
new file mode 100644
index 0000000..19d42f1
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/find_java64.exe
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/gson-2.2.4.jar b/love2dToAPK/tools/tools/android-win/tools/lib/gson-2.2.4.jar
new file mode 100644
index 0000000..75fe27c
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/gson-2.2.4.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/guava-17.0.jar b/love2dToAPK/tools/tools/android-win/tools/lib/guava-17.0.jar
new file mode 100644
index 0000000..661fc74
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/guava-17.0.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/hamcrest-core-1.3.jar b/love2dToAPK/tools/tools/android-win/tools/lib/hamcrest-core-1.3.jar
new file mode 100644
index 0000000..9d5fe16
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/hamcrest-core-1.3.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/hierarchyviewer2.jar b/love2dToAPK/tools/tools/android-win/tools/lib/hierarchyviewer2.jar
new file mode 100644
index 0000000..6822f6d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/hierarchyviewer2.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/hierarchyviewer2lib.jar b/love2dToAPK/tools/tools/android-win/tools/lib/hierarchyviewer2lib.jar
new file mode 100644
index 0000000..13527b1
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/hierarchyviewer2lib.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/httpclient-4.1.1.jar b/love2dToAPK/tools/tools/android-win/tools/lib/httpclient-4.1.1.jar
new file mode 100644
index 0000000..74121b7
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/httpclient-4.1.1.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/httpcore-4.1.jar b/love2dToAPK/tools/tools/android-win/tools/lib/httpcore-4.1.jar
new file mode 100644
index 0000000..a357c07
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/httpcore-4.1.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/httpmime-4.1.jar b/love2dToAPK/tools/tools/android-win/tools/lib/httpmime-4.1.jar
new file mode 100644
index 0000000..68f6158
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/httpmime-4.1.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/jcommon-1.0.12.jar b/love2dToAPK/tools/tools/android-win/tools/lib/jcommon-1.0.12.jar
new file mode 100644
index 0000000..ca4f04a
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/jcommon-1.0.12.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/jfreechart-1.0.9.jar b/love2dToAPK/tools/tools/android-win/tools/lib/jfreechart-1.0.9.jar
new file mode 100644
index 0000000..d1e2b74
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/jfreechart-1.0.9.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/jfreechart-swt-1.0.9.jar b/love2dToAPK/tools/tools/android-win/tools/lib/jfreechart-swt-1.0.9.jar
new file mode 100644
index 0000000..e4e7ec0
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/jfreechart-swt-1.0.9.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/jobb.jar b/love2dToAPK/tools/tools/android-win/tools/lib/jobb.jar
new file mode 100644
index 0000000..b6e6426
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/jobb.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/jsilver-1.0.0.jar b/love2dToAPK/tools/tools/android-win/tools/lib/jsilver-1.0.0.jar
new file mode 100644
index 0000000..02d55de
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/jsilver-1.0.0.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/junit-4.12.jar b/love2dToAPK/tools/tools/android-win/tools/lib/junit-4.12.jar
new file mode 100644
index 0000000..3a7fc26
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/junit-4.12.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/kxml2-2.3.0.jar b/love2dToAPK/tools/tools/android-win/tools/lib/kxml2-2.3.0.jar
new file mode 100644
index 0000000..6470952
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/kxml2-2.3.0.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/layoutlib-api.jar b/love2dToAPK/tools/tools/android-win/tools/lib/layoutlib-api.jar
new file mode 100644
index 0000000..49e909b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/layoutlib-api.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/libemugl_test_shared_library.dll b/love2dToAPK/tools/tools/android-win/tools/lib/libemugl_test_shared_library.dll
new file mode 100644
index 0000000..cf6004f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/libemugl_test_shared_library.dll
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/lint-api.jar b/love2dToAPK/tools/tools/android-win/tools/lib/lint-api.jar
new file mode 100644
index 0000000..0652eea
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/lint-api.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/lint-checks.jar b/love2dToAPK/tools/tools/android-win/tools/lib/lint-checks.jar
new file mode 100644
index 0000000..c6c3520
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/lint-checks.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/lint-tests.jar b/love2dToAPK/tools/tools/android-win/tools/lib/lint-tests.jar
new file mode 100644
index 0000000..98b7332
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/lint-tests.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/lint.jar b/love2dToAPK/tools/tools/android-win/tools/lib/lint.jar
new file mode 100644
index 0000000..73e6aea
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/lint.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/lombok-ast-0.2.3.jar b/love2dToAPK/tools/tools/android-win/tools/lib/lombok-ast-0.2.3.jar
new file mode 100644
index 0000000..4b76285
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/lombok-ast-0.2.3.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/manifest-merger.jar b/love2dToAPK/tools/tools/android-win/tools/lib/manifest-merger.jar
new file mode 100644
index 0000000..5994f9d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/manifest-merger.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/monkeyrunner.jar b/love2dToAPK/tools/tools/android-win/tools/lib/monkeyrunner.jar
new file mode 100644
index 0000000..7918757
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/monkeyrunner.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/ninepatch.jar b/love2dToAPK/tools/tools/android-win/tools/lib/ninepatch.jar
new file mode 100644
index 0000000..8f47e80
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/ninepatch.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/objenesis-2.1.jar b/love2dToAPK/tools/tools/android-win/tools/lib/objenesis-2.1.jar
new file mode 100644
index 0000000..7c1e983
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/objenesis-2.1.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/org-eclipse-core-commands-3.6.0.jar b/love2dToAPK/tools/tools/android-win/tools/lib/org-eclipse-core-commands-3.6.0.jar
new file mode 100644
index 0000000..6c95c0f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/org-eclipse-core-commands-3.6.0.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/org-eclipse-equinox-common-3.6.0.jar b/love2dToAPK/tools/tools/android-win/tools/lib/org-eclipse-equinox-common-3.6.0.jar
new file mode 100644
index 0000000..a5d37aa
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/org-eclipse-equinox-common-3.6.0.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/org-eclipse-jface-3.6.2.jar b/love2dToAPK/tools/tools/android-win/tools/lib/org-eclipse-jface-3.6.2.jar
new file mode 100644
index 0000000..289db85
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/org-eclipse-jface-3.6.2.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/osgi-4.0.0.jar b/love2dToAPK/tools/tools/android-win/tools/lib/osgi-4.0.0.jar
new file mode 100644
index 0000000..5f82c42
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/osgi-4.0.0.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/pc-bios/bios.bin b/love2dToAPK/tools/tools/android-win/tools/lib/pc-bios/bios.bin
new file mode 100644
index 0000000..ed9b8f7
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/pc-bios/bios.bin
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/pc-bios/vgabios-cirrus.bin b/love2dToAPK/tools/tools/android-win/tools/lib/pc-bios/vgabios-cirrus.bin
new file mode 100644
index 0000000..d32ec21
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/pc-bios/vgabios-cirrus.bin
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/plugin.prop b/love2dToAPK/tools/tools/android-win/tools/lib/plugin.prop
new file mode 100644
index 0000000..44a6a1b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/plugin.prop
@@ -0,0 +1,3 @@
+# begin plugin.prop
+plugin.version=23.0.0
+# end plugin.prop
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/proguard-project.txt b/love2dToAPK/tools/tools/android-win/tools/lib/proguard-project.txt
new file mode 100644
index 0000000..f2fe155
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/proguard-project.txt
@@ -0,0 +1,20 @@
+# To enable ProGuard in your project, edit project.properties
+# to define the proguard.config property as described in that file.
+#
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in ${sdk.dir}/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the ProGuard
+# include property in project.properties.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/rule-api.jar b/love2dToAPK/tools/tools/android-win/tools/lib/rule-api.jar
new file mode 100644
index 0000000..326b995
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/rule-api.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/screenshot2.jar b/love2dToAPK/tools/tools/android-win/tools/lib/screenshot2.jar
new file mode 100644
index 0000000..6132cd1
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/screenshot2.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/sdk-common.jar b/love2dToAPK/tools/tools/android-win/tools/lib/sdk-common.jar
new file mode 100644
index 0000000..5393ef6
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/sdk-common.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/sdklib.jar b/love2dToAPK/tools/tools/android-win/tools/lib/sdklib.jar
new file mode 100644
index 0000000..cef030e
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/sdklib.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/sdkmanager.jar b/love2dToAPK/tools/tools/android-win/tools/lib/sdkmanager.jar
new file mode 100644
index 0000000..5f7b555
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/sdkmanager.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/sdkstats.jar b/love2dToAPK/tools/tools/android-win/tools/lib/sdkstats.jar
new file mode 100644
index 0000000..5e52f80
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/sdkstats.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/sdkuilib.jar b/love2dToAPK/tools/tools/android-win/tools/lib/sdkuilib.jar
new file mode 100644
index 0000000..0426c5c
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/sdkuilib.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/swtmenubar.jar b/love2dToAPK/tools/tools/android-win/tools/lib/swtmenubar.jar
new file mode 100644
index 0000000..0078c18
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/swtmenubar.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/traceview.jar b/love2dToAPK/tools/tools/android-win/tools/lib/traceview.jar
new file mode 100644
index 0000000..78acbb7
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/traceview.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/uiautomatorviewer.jar b/love2dToAPK/tools/tools/android-win/tools/lib/uiautomatorviewer.jar
new file mode 100644
index 0000000..d77b79e
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/uiautomatorviewer.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/lib/uibuild.template b/love2dToAPK/tools/tools/android-win/tools/lib/uibuild.template
new file mode 100644
index 0000000..3170da6
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lib/uibuild.template
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="PROJECT_NAME" default="help">
+
+ <!-- The local.properties file is created and updated by the 'android' tool.
+ It contains the path to the SDK. It should *NOT* be checked into
+ Version Control Systems. -->
+ <property file="local.properties" />
+
+ <!-- The ant.properties file can be created by you. It is only edited by the
+ 'android' tool to add properties to it.
+ This is the place to change some Ant specific build properties.
+ Here are some properties you may want to change/update:
+
+ source.dir
+ The name of the source directory. Default is 'src'.
+ out.dir
+ The name of the output directory. Default is 'bin'.
+
+ For other overridable properties, look at the beginning of the rules
+ files in the SDK, at tools/ant/build.xml
+
+ Properties related to the SDK location or the project target should
+ be updated using the 'android' tool with the 'update' action.
+
+ This file is an integral part of the build system for your
+ application and should be checked into Version Control Systems.
+
+ -->
+ <property file="ant.properties" />
+
+ <!-- if sdk.dir was not set from one of the property file, then
+ get it from the ANDROID_HOME env var.
+ This must be done before we load project.properties since
+ the proguard config can use sdk.dir -->
+ <property environment="env" />
+ <condition property="sdk.dir" value="${env.ANDROID_HOME}">
+ <isset property="env.ANDROID_HOME" />
+ </condition>
+
+ <!-- The project.properties file is created and updated by the 'android'
+ tool, as well as ADT.
+
+ This contains project specific properties such as project target, and library
+ dependencies. Lower level build properties are stored in ant.properties
+ (or in .classpath for Eclipse projects).
+
+ This file is an integral part of the build system for your
+ application and should be checked into Version Control Systems. -->
+ <loadproperties srcFile="project.properties" />
+
+ <!-- quick check on sdk.dir -->
+ <fail
+ message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
+ unless="sdk.dir"
+ />
+
+ <!--
+ Import per project custom build rules if present at the root of the project.
+ This is the place to put custom intermediary targets such as:
+ -pre-build
+ -pre-compile
+ -post-compile (This is typically used for code obfuscation.
+ Compiled code location: ${out.classes.absolute.dir}
+ If this is not done in place, override ${out.dex.input.absolute.dir})
+ -post-package
+ -post-build
+ -pre-clean
+ -->
+ <import file="custom_rules.xml" optional="true" />
+
+ <!-- Import the actual build file.
+
+ To customize existing targets, there are two options:
+ - Customize only one target:
+ - copy/paste the target into this file, *before* the
+ <import> task.
+ - customize it to your needs.
+ - Customize the whole content of build.xml
+ - copy/paste the content of the rules files (minus the top node)
+ into this file, replacing the <import> task.
+ - customize to your needs.
+
+ ***********************
+ ****** IMPORTANT ******
+ ***********************
+ In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
+ in order to avoid having your file be overridden by tools such as "android update project"
+ -->
+ <!-- version-tag: VERSION_TAG -->
+ <import file="${sdk.dir}/tools/ant/uibuild.xml" />
+
+</project>
diff --git a/love2dToAPK/tools/tools/android-win/tools/lint.bat b/love2dToAPK/tools/tools/android-win/tools/lint.bat
new file mode 100644
index 0000000..31dd760
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/lint.bat
@@ -0,0 +1,58 @@
+@echo off
+rem Copyright (C) 2011 The Android Open Source Project
+rem
+rem Licensed under the Apache License, Version 2.0 (the "License");
+rem you may not use this file except in compliance with the License.
+rem You may obtain a copy of the License at
+rem
+rem http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem don't modify the caller's environment
+setlocal
+
+rem Set up prog to be the path of this script, including following symlinks,
+rem and set up progdir to be the fully-qualified pathname of its directory.
+set prog=%~f0
+
+rem Grab current directory before we change it
+set work_dir=%cd%
+
+rem Change current directory and drive to where the script is, to avoid
+rem issues with directories containing whitespaces.
+cd /d %~dp0
+
+rem Get the CWD as a full path with short names only (without spaces)
+for %%i in ("%cd%") do set prog_dir=%%~fsi
+
+rem Check we have a valid Java.exe in the path.
+set java_exe=
+call lib\find_java.bat
+if not defined java_exe goto :EOF
+
+set jarfile=lint.jar
+set frameworkdir=.
+
+if exist %frameworkdir%\%jarfile% goto JarFileOk
+ set frameworkdir=lib
+
+if exist %frameworkdir%\%jarfile% goto JarFileOk
+ set frameworkdir=..\framework
+
+:JarFileOk
+
+if debug NEQ "%1" goto NoDebug
+ set java_debug=-agentlib:jdwp=transport=dt_socket,server=y,address=8050,suspend=y
+ shift 1
+:NoDebug
+
+set jarpath=%frameworkdir%\%jarfile%
+set javaextdirs=%frameworkdir%
+
+call "%java_exe%" %java_debug% -Xmx1024m "-Dcom.android.tools.lint.bindir=%prog_dir%" "-Dcom.android.tools.lint.workdir=%work_dir%" -Djava.awt.headless=true -classpath "%jarpath%" com.android.tools.lint.Main %*
+
diff --git a/love2dToAPK/tools/tools/android-win/tools/mksdcard.exe b/love2dToAPK/tools/tools/android-win/tools/mksdcard.exe
new file mode 100644
index 0000000..706b75e
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/mksdcard.exe
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/monitor.bat b/love2dToAPK/tools/tools/android-win/tools/monitor.bat
new file mode 100644
index 0000000..4389d93
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/monitor.bat
@@ -0,0 +1,32 @@
+@echo off
+rem Copyright (C) 2012 The Android Open Source Project
+rem
+rem Licensed under the Apache License, Version 2.0 (the "License");
+rem you may not use this file except in compliance with the License.
+rem You may obtain a copy of the License at
+rem
+rem http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem don't modify the caller's environment
+setlocal
+
+rem Change current directory and drive to where the script is, to avoid
+rem issues with directories containing whitespaces.
+cd /d %~dp0
+
+rem Check we have a valid Java.exe in the path.
+set java_exe=
+call lib\find_java.bat
+if not defined java_exe goto :EOF
+
+:QueryArch
+for /f "delims=" %%a in ('"%java_exe%" -jar lib\archquery.jar') do set vmarch=%%a
+
+start lib\monitor-%vmarch%\monitor
+
diff --git a/love2dToAPK/tools/tools/android-win/tools/monkeyrunner.bat b/love2dToAPK/tools/tools/android-win/tools/monkeyrunner.bat
new file mode 100644
index 0000000..531d5dd
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/monkeyrunner.bat
@@ -0,0 +1,63 @@
+@echo off
+rem Copyright (C) 2010 The Android Open Source Project
+rem
+rem Licensed under the Apache License, Version 2.0 (the "License");
+rem you may not use this file except in compliance with the License.
+rem You may obtain a copy of the License at
+rem
+rem http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem don't modify the caller's environment
+setlocal
+
+rem Set up prog to be the path of this script, including following symlinks,
+rem and set up progdir to be the fully-qualified pathname of its directory.
+set prog=%~f0
+
+rem Change current directory and drive to where the script is, to avoid
+rem issues with directories containing whitespaces.
+cd /d %~dp0
+
+rem Check we have a valid Java.exe in the path.
+set java_exe=
+call lib\find_java.bat
+if not defined java_exe goto :EOF
+
+set jarfile=monkeyrunner.jar
+set frameworkdir=.
+set libdir=
+
+if exist %frameworkdir%\%jarfile% goto JarFileOk
+ set frameworkdir=lib
+
+if exist %frameworkdir%\%jarfile% goto JarFileOk
+ set frameworkdir=..\framework
+
+:JarFileOk
+
+set jarpath=%frameworkdir%\%jarfile%
+
+if not defined ANDROID_SWT goto QueryArch
+ set swt_path=%ANDROID_SWT%
+ goto SwtDone
+
+:QueryArch
+
+ for /f "delims=" %%a in ('"%java_exe%" -jar %frameworkdir%\archquery.jar') do set swt_path=%frameworkdir%\%%a
+
+:SwtDone
+
+if exist "%swt_path%" goto SetPath
+ echo SWT folder '%swt_path%' does not exist.
+ echo Please set ANDROID_SWT to point to the folder containing swt.jar for your platform.
+ exit /B
+
+:SetPath
+
+call "%java_exe%" -Xmx512m "-Djava.ext.dirs=%frameworkdir%;%swt_path%" -Dcom.android.monkeyrunner.bindir=..\framework -jar %jarpath% %*
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/README b/love2dToAPK/tools/tools/android-win/tools/proguard/README
new file mode 100644
index 0000000..a8fd359
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/README
@@ -0,0 +1,41 @@
+ProGuard, Java class file shrinker, optimizer, obfuscator, and preverifier
+==========================================================================
+
+This distribution contains the following directories:
+
+- bin : simple wrapper scripts to run ProGuard, its GUI, and ReTrace
+- lib : the main jars, compiled and ready to use with "java -jar ...."
+- docs : the complete documentation, licenses, etc. in html format
+- examples : some example configuration files
+
+The best place to start is docs/index.html
+
+Example
+=======
+
+If you want to give ProGuard a spin right away, try processing the ProGuard
+jar itself:
+
+ cd examples
+ java -jar ../lib/proguard.jar @proguard.pro
+
+The resulting proguard_out.jar contains the same application, but it's a lot
+smaller.
+
+Enjoy!
+
+http://proguard.sourceforge.net/
+
+Copyright (c) 2002-2011 Eric Lafortune (eric@graphics.cornell.edu)
+
+Android Addendum:
+=================
+NOTE: This distribution is identical to the official Proguard 4.7 release,
+with the following modifications:
+- the "src" and "build" directories were deleted (for space considerations)
+- the task.properties file was moved from src/ into ant/ (to be compatible
+ with the directory structure of earlier bundled versions of ProGuard
+- this README file was updated to reflect the above changes
+
+You can download the original proguard4.7.zip, containing the source code,
+from http://proguard.sourceforge.net/.
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/ant/task.properties b/love2dToAPK/tools/tools/android-win/tools/proguard/ant/task.properties
new file mode 100644
index 0000000..82d0f3f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/ant/task.properties
@@ -0,0 +1,2 @@
+proguard = proguard.ant.ProGuardTask
+proguardconfiguration = proguard.ant.ConfigurationTask
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/android.pro b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/android.pro
new file mode 100644
index 0000000..a502a2b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/android.pro
@@ -0,0 +1,149 @@
+#
+# This ProGuard configuration file illustrates how to process Android
+# applications.
+# Usage:
+# java -jar proguard.jar @android.pro
+#
+# If you're using the Android SDK (version 2.3 or higher), the android tool
+# already creates a file like this in your project, called proguard.cfg.
+# It should contain the settings of this file, minus the input and output paths
+# (-injars, -outjars, -libraryjars, -printmapping, and -printseeds).
+# The generated Ant build file automatically sets these paths.
+
+# Specify the input jars, output jars, and library jars.
+# Note that ProGuard works with Java bytecode (.class),
+# before the dex compiler converts it into Dalvik code (.dex).
+
+-injars bin/classes
+-injars libs
+-outjars bin/classes-processed.jar
+
+-libraryjars /usr/local/android-sdk/platforms/android-9/android.jar
+#-libraryjars /usr/local/android-sdk/add-ons/google_apis-7_r01/libs/maps.jar
+# ...
+
+# Save the obfuscation mapping to a file, so you can de-obfuscate any stack
+# traces later on.
+
+-printmapping bin/classes-processed.map
+
+# You can print out the seeds that are matching the keep options below.
+
+#-printseeds bin/classes-processed.seeds
+
+# Preverification is irrelevant for the dex compiler and the Dalvik VM.
+
+-dontpreverify
+
+# Reduce the size of the output some more.
+
+-repackageclasses ''
+-allowaccessmodification
+
+# Switch off some optimizations that trip older versions of the Dalvik VM.
+
+-optimizations !code/simplification/arithmetic
+
+# Keep a fixed source file attribute and all line number tables to get line
+# numbers in the stack traces.
+# You can comment this out if you're not interested in stack traces.
+
+-renamesourcefileattribute SourceFile
+-keepattributes SourceFile,LineNumberTable
+
+# RemoteViews might need annotations.
+
+-keepattributes *Annotation*
+
+# Preserve all fundamental application classes.
+
+-keep public class * extends android.app.Activity
+-keep public class * extends android.app.Application
+-keep public class * extends android.app.Service
+-keep public class * extends android.content.BroadcastReceiver
+-keep public class * extends android.content.ContentProvider
+
+# Preserve all View implementations, their special context constructors, and
+# their setters.
+
+-keep public class * extends android.view.View {
+ public <init>(android.content.Context);
+ public <init>(android.content.Context, android.util.AttributeSet);
+ public <init>(android.content.Context, android.util.AttributeSet, int);
+ public void set*(...);
+}
+
+# Preserve all classes that have special context constructors, and the
+# constructors themselves.
+
+-keepclasseswithmembers class * {
+ public <init>(android.content.Context, android.util.AttributeSet);
+}
+
+# Preserve all classes that have special context constructors, and the
+# constructors themselves.
+
+-keepclasseswithmembers class * {
+ public <init>(android.content.Context, android.util.AttributeSet, int);
+}
+
+# Preserve the special fields of all Parcelable implementations.
+
+-keepclassmembers class * implements android.os.Parcelable {
+ static android.os.Parcelable$Creator CREATOR;
+}
+
+# Preserve static fields of inner classes of R classes that might be accessed
+# through introspection.
+
+-keepclassmembers class **.R$* {
+ public static <fields>;
+}
+
+# Preserve the required interface from the License Verification Library
+# (but don't nag the developer if the library is not used at all).
+
+-keep public interface com.android.vending.licensing.ILicensingService
+
+-dontnote com.android.vending.licensing.ILicensingService
+
+# The Android Compatibility library references some classes that may not be
+# present in all versions of the API, but we know that's ok.
+
+-dontwarn android.support.**
+
+# Preserve all native method names and the names of their classes.
+
+-keepclasseswithmembernames class * {
+ native <methods>;
+}
+
+# Preserve the special static methods that are required in all enumeration
+# classes.
+
+-keepclassmembers class * extends java.lang.Enum {
+ public static **[] values();
+ public static ** valueOf(java.lang.String);
+}
+
+# Explicitly preserve all serialization members. The Serializable interface
+# is only a marker interface, so it wouldn't save them.
+# You can comment this out if your application doesn't use serialization.
+# If your code contains serializable classes that have to be backward
+# compatible, please refer to the manual.
+
+-keepclassmembers class * implements java.io.Serializable {
+ static final long serialVersionUID;
+ static final java.io.ObjectStreamField[] serialPersistentFields;
+ private void writeObject(java.io.ObjectOutputStream);
+ private void readObject(java.io.ObjectInputStream);
+ java.lang.Object writeReplace();
+ java.lang.Object readResolve();
+}
+
+# Your application may contain more items that need to be preserved;
+# typically classes that are dynamically created using Class.forName:
+
+# -keep public class mypackage.MyClass
+# -keep public interface mypackage.MyInterface
+# -keep public class * implements mypackage.MyInterface
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/examples.pro b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/examples.pro
new file mode 100644
index 0000000..3a47183
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/examples.pro
@@ -0,0 +1,60 @@
+#
+# This ProGuard configuration file illustrates how to use annotations for
+# specifying which classes and class members should be kept.
+# Usage:
+# java -jar proguard.jar @examples.pro
+#
+
+# Specify the input, output, and library jars.
+# This is assuming the code has been compiled in the examples directory.
+
+-injars examples(*.class)
+-outjars out
+
+-libraryjars <java.home>/lib/rt.jar
+
+# Some important configuration is based on the annotations in the code.
+# We have to specify what the annotations mean to ProGuard.
+
+-include lib/annotations.pro
+
+#
+# We can then still add any other options that might be useful.
+#
+
+# Print out a list of what we're preserving.
+
+-printseeds
+
+# Preserve all annotations themselves.
+
+-keepattributes *Annotation*
+
+# Preserve all native method names and the names of their classes.
+
+-keepclasseswithmembernames class * {
+ native <methods>;
+}
+
+# Preserve the special static methods that are required in all enumeration
+# classes.
+
+-keepclassmembers class * extends java.lang.Enum {
+ public static **[] values();
+ public static ** valueOf(java.lang.String);
+}
+
+# Explicitly preserve all serialization members. The Serializable interface
+# is only a marker interface, so it wouldn't save them.
+# You can comment this out if your application doesn't use serialization.
+# If your code contains serializable classes that have to be backward
+# compatible, please refer to the manual.
+
+-keepclassmembers class * implements java.io.Serializable {
+ static final long serialVersionUID;
+ static final java.io.ObjectStreamField[] serialPersistentFields;
+ private void writeObject(java.io.ObjectOutputStream);
+ private void readObject(java.io.ObjectInputStream);
+ java.lang.Object writeReplace();
+ java.lang.Object readResolve();
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/examples/Applet.java b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/examples/Applet.java
new file mode 100644
index 0000000..8a5874b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/examples/Applet.java
@@ -0,0 +1,22 @@
+import proguard.annotation.*;
+
+/**
+ * This applet illustrates the use of annotations for configuring ProGuard.
+ *
+ * You can compile it with:
+ * javac -classpath ../lib/annotations.jar Applet.java
+ * You can then process it with:
+ * java -jar ../../../lib/proguard.jar @ ../examples.pro
+ *
+ * The annotation will preserve the class and its essential methods.
+ */
+@Keep
+public class Applet extends java.applet.Applet
+{
+ // Implementations for Applet.
+
+ public void init()
+ {
+ // ...
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/examples/Application.java b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/examples/Application.java
new file mode 100644
index 0000000..f8d5060
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/examples/Application.java
@@ -0,0 +1,20 @@
+import proguard.annotation.KeepApplication;
+
+/**
+ * This application illustrates the use of annotations for configuring ProGuard.
+ *
+ * You can compile it with:
+ * javac -classpath ../lib/annotations.jar Application.java
+ * You can then process it with:
+ * java -jar ../../../lib/proguard.jar @ ../examples.pro
+ *
+ * The annotation will preserve the class and its main method.
+ */
+@KeepApplication
+public class Application
+{
+ public static void main(String[] args)
+ {
+ System.out.println("The answer is 42");
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/examples/Bean.java b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/examples/Bean.java
new file mode 100644
index 0000000..0544bf3
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/examples/Bean.java
@@ -0,0 +1,56 @@
+import proguard.annotation.*;
+
+/**
+ * This bean illustrates the use of annotations for configuring ProGuard.
+ *
+ * You can compile it with:
+ * javac -classpath ../lib/annotations.jar Bean.java
+ * You can then process it with:
+ * java -jar ../../../lib/proguard.jar @ ../examples.pro
+ *
+ * The annotations will preserve the class and its public getters and setters.
+ */
+@Keep
+@KeepPublicGettersSetters
+public class Bean
+{
+ public boolean booleanProperty;
+ public int intProperty;
+ public String stringProperty;
+
+
+ public boolean isBooleanProperty()
+ {
+ return booleanProperty;
+ }
+
+
+ public void setBooleanProperty(boolean booleanProperty)
+ {
+ this.booleanProperty = booleanProperty;
+ }
+
+
+ public int getIntProperty()
+ {
+ return intProperty;
+ }
+
+
+ public void setIntProperty(int intProperty)
+ {
+ this.intProperty = intProperty;
+ }
+
+
+ public String getStringProperty()
+ {
+ return stringProperty;
+ }
+
+
+ public void setStringProperty(String stringProperty)
+ {
+ this.stringProperty = stringProperty;
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/examples/NativeCallBack.java b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/examples/NativeCallBack.java
new file mode 100644
index 0000000..2c72f7b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/examples/NativeCallBack.java
@@ -0,0 +1,44 @@
+import proguard.annotation.*;
+
+/**
+ * This application illustrates the use of annotations for configuring ProGuard.
+ *
+ * You can compile it with:
+ * javac -classpath ../lib/annotations.jar NativeCallBack.java
+ * You can then process it with:
+ * java -jar ../../../lib/proguard.jar @ ../examples.pro
+ *
+ * The annotation will preserve the class and its main method.
+ */
+@KeepApplication
+public class NativeCallBack
+{
+ /**
+ * Suppose this is a native method that computes an answer.
+ *
+ * The -keep option regular ProGuard configuration will make sure it is
+ * not renamed when processing this code.
+ */
+ public native int computeAnswer();
+
+
+ /**
+ * Suppose this method is called back from the above native method.
+ *
+ * ProGuard would remove it, because it is not referenced from java.
+ * The annotation will make sure it is preserved anyhow.
+ */
+ @Keep
+ public int getAnswer()
+ {
+ return 42;
+ }
+
+
+ public static void main(String[] args)
+ {
+ int answer = new NativeCallBack().computeAnswer();
+
+ System.out.println("The answer is " + answer);
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/lib/annotations.jar b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/lib/annotations.jar
new file mode 100644
index 0000000..36f6356
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/lib/annotations.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/lib/annotations.pro b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/lib/annotations.pro
new file mode 100644
index 0000000..f704af2
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/lib/annotations.pro
@@ -0,0 +1,118 @@
+#
+# This ProGuard configuration file specifies how annotations can be used
+# to configure the processing of other code.
+# Usage:
+# java -jar proguard.jar @annotations.pro -libraryjars annotations.jar ...
+#
+# Note that the other input/output options still have to be specified.
+# If you specify them in a separate file, you can simply include this file:
+# -include annotations.pro
+#
+# You can add any other options that are required. For instance, if you are
+# processing a library, you can still include the options from library.pro.
+
+
+# The annotations are defined in the accompanying jar. For now, we'll start
+# with these. You can always define your own annotations, if necessary.
+-libraryjars annotations.jar
+
+
+# The following annotations can be specified with classes and with class
+# members.
+
+# @Keep specifies not to shrink, optimize, or obfuscate the annotated class
+# or class member as an entry point.
+
+-keep @proguard.annotation.Keep class *
+
+-keepclassmembers class * {
+ @proguard.annotation.Keep *;
+}
+
+
+# @KeepName specifies not to optimize or obfuscate the annotated class or
+# class member as an entry point.
+
+-keepnames @proguard.annotation.KeepName class *
+
+-keepclassmembernames class * {
+ @proguard.annotation.KeepName *;
+}
+
+
+# The following annotations can only be specified with classes.
+
+# @KeepImplementations and @KeepPublicImplementations specify to keep all,
+# resp. all public, implementations or extensions of the annotated class as
+# entry points. Note the extension of the java-like syntax, adding annotations
+# before the (wild-carded) interface name.
+
+-keep class * implements @proguard.annotation.KeepImplementations *
+-keep public class * implements @proguard.annotation.KeepPublicImplementations *
+
+# @KeepApplication specifies to keep the annotated class as an application,
+# together with its main method.
+
+-keepclasseswithmembers @proguard.annotation.KeepApplication public class * {
+ public static void main(java.lang.String[]);
+}
+
+# @KeepClassMembers, @KeepPublicClassMembers, and
+# @KeepPublicProtectedClassMembers specify to keep all, all public, resp.
+# all public or protected, class members of the annotated class from being
+# shrunk, optimized, or obfuscated as entry points.
+
+-keepclassmembers @proguard.annotation.KeepClassMembers class * {
+ *;
+}
+
+-keepclassmembers @proguard.annotation.KeepPublicClassMembers class * {
+ public *;
+}
+
+-keepclassmembers @proguard.annotation.KeepPublicProtectedClassMembers class * {
+ public protected *;
+}
+
+# @KeepClassMemberNames, @KeepPublicClassMemberNames, and
+# @KeepPublicProtectedClassMemberNames specify to keep all, all public, resp.
+# all public or protected, class members of the annotated class from being
+# optimized or obfuscated as entry points.
+
+-keepclassmembernames @proguard.annotation.KeepClassMemberNames class * {
+ *;
+}
+
+-keepclassmembernames @proguard.annotation.KeepPublicClassMemberNames class * {
+ public *;
+}
+
+-keepclassmembernames @proguard.annotation.KeepPublicProtectedClassMemberNames class * {
+ public protected *;
+}
+
+# @KeepGettersSetters and @KeepPublicGettersSetters specify to keep all, resp.
+# all public, getters and setters of the annotated class from being shrunk,
+# optimized, or obfuscated as entry points.
+
+-keepclassmembers @proguard.annotation.KeepGettersSetters class * {
+ void set*(***);
+ void set*(int, ***);
+
+ boolean is*();
+ boolean is*(int);
+
+ *** get*();
+ *** get*(int);
+}
+
+-keepclassmembers @proguard.annotation.KeepPublicGettersSetters class * {
+ public void set*(***);
+ public void set*(int, ***);
+
+ public boolean is*();
+ public boolean is*(int);
+
+ public *** get*();
+ public *** get*(int);
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/Keep.java b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/Keep.java
new file mode 100644
index 0000000..93a469f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/Keep.java
@@ -0,0 +1,18 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ * of Java bytecode.
+ *
+ * Copyright (c) 2002-2007 Eric Lafortune (eric@graphics.cornell.edu)
+ */
+package proguard.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * This annotation specifies not to optimize or obfuscate the annotated class or
+ * class member as an entry point.
+ */
+@Target({ ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR })
+@Retention(RetentionPolicy.CLASS)
+@Documented
+public @interface Keep {}
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepApplication.java b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepApplication.java
new file mode 100644
index 0000000..181f9b1
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepApplication.java
@@ -0,0 +1,18 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ * of Java bytecode.
+ *
+ * Copyright (c) 2002-2007 Eric Lafortune (eric@graphics.cornell.edu)
+ */
+package proguard.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * This annotation specifies to keep the annotated class as an application,
+ * together with its a main method.
+ */
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.CLASS)
+@Documented
+public @interface KeepApplication {}
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepClassMemberNames.java b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepClassMemberNames.java
new file mode 100644
index 0000000..b2f1df9
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepClassMemberNames.java
@@ -0,0 +1,18 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ * of Java bytecode.
+ *
+ * Copyright (c) 2002-2007 Eric Lafortune (eric@graphics.cornell.edu)
+ */
+package proguard.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * This annotation specifies to keep all class members of the annotated class
+ * from being optimized or obfuscated as entry points.
+ */
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.CLASS)
+@Documented
+public @interface KeepClassMemberNames {}
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepClassMembers.java b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepClassMembers.java
new file mode 100644
index 0000000..7ed755b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepClassMembers.java
@@ -0,0 +1,18 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ * of Java bytecode.
+ *
+ * Copyright (c) 2002-2007 Eric Lafortune (eric@graphics.cornell.edu)
+ */
+package proguard.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * This annotation specifies to keep all class members of the annotated class
+ * from being shrunk, optimized, or obfuscated as entry points.
+ */
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.CLASS)
+@Documented
+public @interface KeepClassMembers {}
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepGettersSetters.java b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepGettersSetters.java
new file mode 100644
index 0000000..497dcb7
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepGettersSetters.java
@@ -0,0 +1,18 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ * of Java bytecode.
+ *
+ * Copyright (c) 2002-2007 Eric Lafortune (eric@graphics.cornell.edu)
+ */
+package proguard.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * This annotation specifies to keep all getters and setters of the annotated
+ * class from being shrunk, optimized, or obfuscated as entry points.
+ */
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.CLASS)
+@Documented
+public @interface KeepGettersSetters {}
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepImplementations.java b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepImplementations.java
new file mode 100644
index 0000000..47406a3
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepImplementations.java
@@ -0,0 +1,18 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ * of Java bytecode.
+ *
+ * Copyright (c) 2002-2007 Eric Lafortune (eric@graphics.cornell.edu)
+ */
+package proguard.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * This annotation specifies to keep all implementations or extensions of the
+ * annotated class as entry points.
+ */
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.CLASS)
+@Documented
+public @interface KeepImplementations {}
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepName.java b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepName.java
new file mode 100644
index 0000000..5dd3680
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepName.java
@@ -0,0 +1,18 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ * of Java bytecode.
+ *
+ * Copyright (c) 2002-2007 Eric Lafortune (eric@graphics.cornell.edu)
+ */
+package proguard.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * This annotation specifies not to optimize or obfuscate the annotated class or
+ * class member as an entry point.
+ */
+@Target({ ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.CONSTRUCTOR })
+@Retention(RetentionPolicy.CLASS)
+@Documented
+public @interface KeepName {}
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepPublicClassMemberNames.java b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepPublicClassMemberNames.java
new file mode 100644
index 0000000..f24b126
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepPublicClassMemberNames.java
@@ -0,0 +1,18 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ * of Java bytecode.
+ *
+ * Copyright (c) 2002-2007 Eric Lafortune (eric@graphics.cornell.edu)
+ */
+package proguard.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * This annotation specifies to keep all public class members of the annotated
+ * class from being optimized or obfuscated as entry points.
+ */
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.CLASS)
+@Documented
+public @interface KeepPublicClassMemberNames {}
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepPublicClassMembers.java b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepPublicClassMembers.java
new file mode 100644
index 0000000..2be7fa4
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepPublicClassMembers.java
@@ -0,0 +1,18 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ * of Java bytecode.
+ *
+ * Copyright (c) 2002-2007 Eric Lafortune (eric@graphics.cornell.edu)
+ */
+package proguard.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * This annotation specifies to keep all public class members of the annotated
+ * class from being shrunk, optimized, or obfuscated as entry points.
+ */
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.CLASS)
+@Documented
+public @interface KeepPublicClassMembers {}
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepPublicGettersSetters.java b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepPublicGettersSetters.java
new file mode 100644
index 0000000..6028ba9
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepPublicGettersSetters.java
@@ -0,0 +1,18 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ * of Java bytecode.
+ *
+ * Copyright (c) 2002-2007 Eric Lafortune (eric@graphics.cornell.edu)
+ */
+package proguard.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * This annotation specifies to keep all public getters and setters of the
+ * annotated class from being shrunk, optimized, or obfuscated as entry points.
+ */
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.CLASS)
+@Documented
+public @interface KeepPublicGettersSetters {}
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepPublicImplementations.java b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepPublicImplementations.java
new file mode 100644
index 0000000..52ee5b9
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepPublicImplementations.java
@@ -0,0 +1,18 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ * of Java bytecode.
+ *
+ * Copyright (c) 2002-2007 Eric Lafortune (eric@graphics.cornell.edu)
+ */
+package proguard.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * This annotation specifies to keep all public implementations or extensions
+ * of the annotated class as entry points.
+ */
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.CLASS)
+@Documented
+public @interface KeepPublicImplementations {}
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepPublicProtectedClassMemberNames.java b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepPublicProtectedClassMemberNames.java
new file mode 100644
index 0000000..59f0004
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepPublicProtectedClassMemberNames.java
@@ -0,0 +1,18 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ * of Java bytecode.
+ *
+ * Copyright (c) 2002-2007 Eric Lafortune (eric@graphics.cornell.edu)
+ */
+package proguard.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * This annotation specifies to keep all public or protected class members of
+ * the annotated class from being optimized or obfuscated as entry points.
+ */
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.CLASS)
+@Documented
+public @interface KeepPublicProtectedClassMemberNames {}
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepPublicProtectedClassMembers.java b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepPublicProtectedClassMembers.java
new file mode 100644
index 0000000..e918a9b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/annotations/src/proguard/annotation/KeepPublicProtectedClassMembers.java
@@ -0,0 +1,19 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ * of Java bytecode.
+ *
+ * Copyright (c) 2002-2007 Eric Lafortune (eric@graphics.cornell.edu)
+ */
+package proguard.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * This annotation specifies to keep all public or protected class members of
+ * the annotated class from being shrunk, optimized, or obfuscated as entry
+ * points.
+ */
+@Target({ ElementType.TYPE })
+@Retention(RetentionPolicy.CLASS)
+@Documented
+public @interface KeepPublicProtectedClassMembers {}
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/android-8.xml b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/android-8.xml
new file mode 100644
index 0000000..3a4316b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/android-8.xml
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="MyAndroidApp" default="help">
+
+<!-- The local.properties file is created and updated by the 'android'
+ tool.
+ It contains the path to the SDK. It should *NOT* be checked into
+ Version Control Systems. -->
+ <property file="local.properties" />
+
+ <!-- The build.properties file can be created by you and is never touched
+ by the 'android' tool. This is the place to change some of the
+ default property values used by the Ant rules.
+ Here are some properties you may want to change/update:
+
+ source.dir
+ The name of the source directory. Default is 'src'.
+ out.dir
+ The name of the output directory. Default is 'bin'.
+
+ Properties related to the SDK location or the project target should
+ be updated using the 'android' tool with the 'update' action.
+
+ This file is an integral part of the build system for your
+ application and should be checked into Version Control Systems.
+
+ -->
+ <property file="build.properties" />
+
+ <!-- The default.properties file is created and updated by the 'android'
+ tool, as well as ADT.
+ This file is an integral part of the build system for your
+ application and should be checked into Version Control Systems. -->
+ <property file="default.properties" />
+
+ <!-- Custom Android task to deal with the project target, and import the
+ proper rules.
+ This requires ant 1.6.0 or above. -->
+ <path id="android.antlibs">
+ <pathelement path="${sdk.dir}/tools/lib/anttasks.jar" />
+ <pathelement path="${sdk.dir}/tools/lib/sdklib.jar" />
+ <pathelement path="${sdk.dir}/tools/lib/androidprefs.jar" />
+ </path>
+
+ <taskdef name="setup"
+ classname="com.android.ant.SetupTask"
+ classpathref="android.antlibs" />
+
+<!-- extension targets. Uncomment the ones where you want to do custom work
+ in between standard targets -->
+<!--
+ <target name="-pre-build">
+ </target>
+ <target name="-pre-compile">
+ </target>
+
+ [This is typically used for code obfuscation.
+ Compiled code location: ${out.classes.absolute.dir}
+ If this is not done in place, override ${out.dex.input.absolute.dir}]
+ <target name="-post-compile">
+ </target>
+-->
+
+
+ <!-- Execute the Android Setup task that will setup some properties
+ specific to the target, and import the build rules files.
+
+ The rules file is imported from
+ <SDK>/platforms/<target_platform>/ant/ant_rules_r#.xml
+
+ To customize existing targets, there are two options:
+ - Customize only one target:
+ - copy/paste the target into this file, *before* the
+ <setup> task.
+ - customize it to your needs.
+ - Customize the whole script.
+ - copy/paste the content of the rules files (minus the top node)
+ into this file, *after* the <setup> task
+ - disable the import of the rules by changing the setup task
+ below to <setup import="false" />.
+ - customize to your needs.
+ -->
+
+ <setup />
+
+ <!-- Define a place for the optimized classes. -->
+ <property name="out.proguard.absolute.jar"
+ location="${out.absolute.dir}/classes-processed.jar" />
+
+ <!-- Define a obfuscation mapping file. -->
+ <property name="out.proguard.absolute.map"
+ location="${out.absolute.dir}/classes-processed.map" />
+
+ <!-- Redefine the dex help macro, so it converts the optimized classes.. -->
+ <macrodef name="dex-helper">
+ <element name="external-libs" optional="yes" />
+ <element name="extra-parameters" optional="yes" />
+ <sequential>
+ <echo>Converting optimized files into ${intermediate.dex.file}...</echo>
+ <apply executable="${dx}" failonerror="true" parallel="true">
+ <arg value="--dex" />
+ <arg value="--output=${intermediate.dex.file}" />
+ <extra-parameters />
+ <arg line="${verbose.option}" />
+ <fileset file="${out.proguard.absolute.jar}" />
+ <external-libs />
+ </apply>
+ </sequential>
+ </macrodef>
+
+ <!-- Define the optimization target. -->
+ <taskdef resource="proguard/ant/task.properties"
+ classpath="/home/eric/ProGuard/releases/proguard4.5.1/lib/proguard.jar" />
+
+ <target name="-post-compile">
+ <echo>Optimizing compiled files and libraries into ${out.proguard.absolute.jar}...</echo>
+ <proguard printmapping="${out.proguard.absolute.map}">
+ <injar path="${out.classes.absolute.dir}" />
+ <injar path="${external.libs.absolute.dir}" />
+ <outjar path="${out.proguard.absolute.jar}" />
+ <libraryjar refid="android.target.classpath" />
+
+ -dontpreverify
+ -repackageclasses ''
+ -allowaccessmodification
+ -optimizations !code/simplification/arithmetic
+
+ <!--
+ -renamesourcefileattribute SourceFile
+ -keepattributes SourceFile,LineNumberTable
+ -->
+
+ -keepattributes *Annotation*
+
+ -keep public class * extends android.app.Activity
+ -keep public class * extends android.app.Application
+ -keep public class * extends android.app.Service
+ -keep public class * extends android.content.BroadcastReceiver
+ -keep public class * extends android.content.ContentProvider
+
+ -keep public class * extends android.view.View {
+ public &lt;init&gt;(android.content.Context);
+ public &lt;init&gt;(android.content.Context, android.util.AttributeSet);
+ public &lt;init&gt;(android.content.Context, android.util.AttributeSet, int);
+ public void set*(...);
+ }
+
+ -keepclasseswithmembers class * {
+ public &lt;init&gt;(android.content.Context, android.util.AttributeSet);
+ }
+
+ -keepclasseswithmembers class * {
+ public &lt;init&gt;(android.content.Context, android.util.AttributeSet, int);
+ }
+
+ -keepclassmembers class * implements android.os.Parcelable {
+ static android.os.Parcelable$Creator CREATOR;
+ }
+
+ -keepclassmembers class **.R$* {
+ public static &lt;fields&gt;;
+ }
+
+ -keep public interface com.android.vending.licensing.ILicensingService
+ -dontnote com.android.vending.licensing.ILicensingService
+
+ -keepclasseswithmembernames class * {
+ native &lt;methods&gt;;
+ }
+
+ -keepclassmembers class * extends java.lang.Enum {
+ public static **[] values();
+ public static ** valueOf(java.lang.String);
+ }
+ </proguard>
+ </target>
+
+</project>
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/applets.xml b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/applets.xml
new file mode 100644
index 0000000..4d0cb38
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/applets.xml
@@ -0,0 +1,88 @@
+<!-- This Ant build file illustrates how to process applets.
+ Usage: ant -f applets.xml -->
+
+<project name="Applets" default="obfuscate" basedir="../..">
+
+<target name="obfuscate">
+ <taskdef resource="proguard/ant/task.properties"
+ classpath="lib/proguard.jar" />
+
+ <proguard printseeds="on"
+ printmapping="out.map"
+ renamesourcefileattribute="SourceFile">
+
+ <!-- Specify the input jars, output jars, and library jars. -->
+
+ <injar file="in.jar" />
+ <outjar file="out.jar" />
+
+ <libraryjar file="${java.home}/lib/rt.jar" />
+
+ <!-- Optionally preserve line numbers in the obfuscated stack traces.
+ <keepattribute name="LineNumberTable">
+ <keepattribute name="SourceFile">
+ -->
+
+ <!-- Preserve all annotations. -->
+
+ <keepattribute name="*Annotation*" />
+
+ <!-- Preserve all public applets. -->
+
+ <keep access="public" extends="java.applet.Applet" />
+
+ <!-- Preserve all native method names and the names of their classes. -->
+
+ <keepclasseswithmembernames>
+ <method access="native" />
+ </keepclasseswithmembernames>
+
+ <!-- Preserve the methods that are required in all enumeration classes. -->
+
+ <keepclassmembers extends="java.lang.Enum">
+ <method access="public static"
+ type="**[]"
+ name="values"
+ parameters="" />
+ <method access="public static"
+ type="**"
+ name="valueOf"
+ parameters="java.lang.String" />
+ </keepclassmembers>
+
+ <!-- Explicitly preserve all serialization members. The Serializable
+ interface is only a marker interface, so it wouldn't save them.
+ You can comment this out if your library doesn't use serialization.
+ If your code contains serializable classes that have to be backward
+ compatible, please refer to the manual. -->
+
+ <keepclassmembers implements="java.io.Serializable">
+ <field access ="static final"
+ type ="long"
+ name ="serialVersionUID" />
+ <field access ="static final"
+ type ="java.io.ObjectStreamField[]"
+ name ="serialPersistentFields" />
+ <method access ="private"
+ type ="void"
+ name ="writeObject"
+ parameters="java.io.ObjectOutputStream" />
+ <method access ="private"
+ type ="void"
+ name ="readObject"
+ parameters="java.io.ObjectInputStream" />
+ <method type ="java.lang.Object"
+ name ="writeReplace"
+ parameters="" />
+ <method type ="java.lang.Object"
+ name ="readResolve"
+ parameters="" />
+ </keepclassmembers>
+
+ <!-- Your application may contain more items that need to be preserved;
+ typically classes that are dynamically created using Class.forName -->
+
+ </proguard>
+</target>
+
+</project>
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/applications1.xml b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/applications1.xml
new file mode 100644
index 0000000..6df5789
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/applications1.xml
@@ -0,0 +1,15 @@
+<!-- This Ant build file illustrates how to process applications,
+ by including a ProGuard-style configuration file.
+ Usage: ant -f applications1.xml -->
+
+<project name="Applications" default="obfuscate" basedir="../..">
+
+<target name="obfuscate">
+ <taskdef resource="proguard/ant/task.properties"
+ classpath="lib/proguard.jar" />
+
+ <proguard configuration="examples/applications.pro" />
+
+</target>
+
+</project>
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/applications2.xml b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/applications2.xml
new file mode 100644
index 0000000..681a894
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/applications2.xml
@@ -0,0 +1,74 @@
+<!-- This Ant build file illustrates how to process applications,
+ by including ProGuard-style configuration options.
+ Usage: ant -f applications2.xml -->
+
+<project name="Applications" default="obfuscate" basedir="../..">
+
+<target name="obfuscate">
+ <taskdef resource="proguard/ant/task.properties"
+ classpath="lib/proguard.jar" />
+
+ <proguard>
+
+ <!-- Specify the input jars, output jars, and library jars. -->
+
+ -injars in.jar
+ -outjars out.jar
+
+ -libraryjars ${java.home}/lib/rt.jar
+ <!-- -libraryjars junit.jar -->
+ <!-- -libraryjars servlet.jar -->
+ <!-- -libraryjars jai_core.jar -->
+ <!-- ... -->
+
+ <!-- Save the obfuscation mapping to a file, and preserve line numbers. -->
+
+ -printmapping out.map
+ -renamesourcefileattribute SourceFile
+ -keepattributes SourceFile,LineNumberTable
+
+ <!-- Preserve all annotations. -->
+
+ -keepattributes *Annotation*
+
+ <!-- Preserve all public applications. -->
+
+ -keepclasseswithmembers public class * {
+ public static void main(java.lang.String[]);
+ }
+
+ <!-- Preserve all native method names and the names of their classes. -->
+
+ -keepclasseswithmembernames class * {
+ native &lt;methods&gt;;
+ }
+
+ <!-- Preserve the methods that are required in all enumeration classes. -->
+
+ -keepclassmembers class * extends java.lang.Enum {
+ public static **[] values();
+ public static ** valueOf(java.lang.String);
+ }
+
+ <!-- Explicitly preserve all serialization members. The Serializable
+ interface is only a marker interface, so it wouldn't save them.
+ You can comment this out if your library doesn't use serialization.
+ If your code contains serializable classes that have to be backward
+ compatible, please refer to the manual. -->
+
+ -keepclassmembers class * implements java.io.Serializable {
+ static final long serialVersionUID;
+ static final java.io.ObjectStreamField[] serialPersistentFields;
+ private void writeObject(java.io.ObjectOutputStream);
+ private void readObject(java.io.ObjectInputStream);
+ java.lang.Object writeReplace();
+ java.lang.Object readResolve();
+ }
+
+ <!-- Your application may contain more items that need to be preserved;
+ typically classes that are dynamically created using Class.forName -->
+
+ </proguard>
+</target>
+
+</project>
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/applications3.xml b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/applications3.xml
new file mode 100644
index 0000000..e42eb39
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/applications3.xml
@@ -0,0 +1,98 @@
+<!-- This Ant build file illustrates how to process applications,
+ using a full-blown XML configuration.
+ Usage: ant -f applications3.xml -->
+
+<project name="Applications" default="obfuscate" basedir="../..">
+
+<target name="obfuscate">
+ <taskdef resource="proguard/ant/task.properties"
+ classpath="lib/proguard.jar" />
+
+ <proguard printseeds="on"
+ printmapping="out.map"
+ renamesourcefileattribute="SourceFile">
+
+ <!-- Specify the input jars, output jars, and library jars. -->
+
+ <injar file="in.jar" />
+ <outjar file="out.jar" />
+
+ <libraryjar file="${java.home}/lib/rt.jar" />
+ <!-- libraryjar file="junit.jar" / -->
+ <!-- libraryjar file="servlet.jar" / -->
+ <!-- libraryjar file="jai_core.jar" / -->
+ <!-- ... / -->
+
+ <!-- Preserve line numbers in the obfuscated stack traces. -->
+
+ <keepattribute name="LineNumberTable" />
+ <keepattribute name="SourceFile" />
+
+ <!-- Preserve all annotations. -->
+
+ <keepattribute name="*Annotation*" />
+
+ <!-- Preserve all public applications. -->
+
+ <keepclasseswithmembers access="public">
+ <method access ="public static"
+ type ="void"
+ name ="main"
+ parameters="java.lang.String[]" />
+ </keepclasseswithmembers>
+
+ <!-- Preserve all native method names and the names of their classes. -->
+
+ <keepclasseswithmembernames>
+ <method access="native" />
+ </keepclasseswithmembernames>
+
+ <!-- Preserve the methods that are required in all enumeration classes. -->
+
+ <keepclassmembers extends="java.lang.Enum">
+ <method access="public static"
+ type="**[]"
+ name="values"
+ parameters="" />
+ <method access="public static"
+ type="**"
+ name="valueOf"
+ parameters="java.lang.String" />
+ </keepclassmembers>
+
+ <!-- Explicitly preserve all serialization members. The Serializable
+ interface is only a marker interface, so it wouldn't save them.
+ You can comment this out if your library doesn't use serialization.
+ If your code contains serializable classes that have to be backward
+ compatible, please refer to the manual. -->
+
+ <keepclassmembers implements="java.io.Serializable">
+ <field access ="static final"
+ type ="long"
+ name ="serialVersionUID" />
+ <field access ="static final"
+ type ="java.io.ObjectStreamField[]"
+ name ="serialPersistentFields" />
+ <method access ="private"
+ type ="void"
+ name ="writeObject"
+ parameters="java.io.ObjectOutputStream" />
+ <method access ="private"
+ type ="void"
+ name ="readObject"
+ parameters="java.io.ObjectInputStream" />
+ <method type ="java.lang.Object"
+ name ="writeReplace"
+ parameters="" />
+ <method type ="java.lang.Object"
+ name ="readResolve"
+ parameters="" />
+ </keepclassmembers>
+
+ <!-- Your application may contain more items that need to be preserved;
+ typically classes that are dynamically created using Class.forName -->
+
+ </proguard>
+</target>
+
+</project>
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/library.xml b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/library.xml
new file mode 100644
index 0000000..d87bd16
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/library.xml
@@ -0,0 +1,102 @@
+<!-- This Ant build file illustrates how to process a program library,
+ such that it remains usable as a library.
+ Usage: ant -f library.xml -->
+
+<project name="Library" default="obfuscate" basedir="../..">
+
+<target name="obfuscate">
+ <taskdef resource="proguard/ant/task.properties"
+ classpath="lib/proguard.jar" />
+
+ <proguard printmapping="out.map"
+ renamesourcefileattribute="SourceFile">
+
+ <!-- Specify the input jars, output jars, and library jars. -->
+
+ <injar file="library.jar" />
+ <outjar file="library_out.jar" />
+
+ <libraryjar file="${java.home}/lib/rt.jar" />
+
+ <!-- Keep some useful attributes. -->
+
+ <keepattribute name="InnerClasses" />
+ <keepattribute name="SourceFile" />
+ <keepattribute name="LineNumberTable" />
+ <keepattribute name="Deprecated" />
+ <keepattribute name="*Annotation*" />
+
+ <!-- Preserve all public classes, and their public and protected fields
+ and methods. -->
+
+ <keep access="public">
+ <field access="public protected" />
+ <method access="public protected" />
+ </keep>
+
+ <!-- Preserve all .class method names. -->
+
+ <keepclassmembernames access="public">
+ <method type ="java.lang.Class"
+ name ="class$"
+ parameters="java.lang.String" />
+ <method type ="java.lang.Class"
+ name ="class$"
+ parameters="java.lang.String,boolean" />
+ </keepclassmembernames>
+
+ <!-- Preserve all native method names and the names of their classes. -->
+
+ <keepclasseswithmembernames>
+ <method access="native" />
+ </keepclasseswithmembernames>
+
+ <!-- Preserve the methods that are required in all enumeration classes. -->
+
+ <keepclassmembers extends="java.lang.Enum">
+ <method access="public static"
+ type="**[]"
+ name="values"
+ parameters="" />
+ <method access="public static"
+ type="**"
+ name="valueOf"
+ parameters="java.lang.String" />
+ </keepclassmembers>
+
+ <!-- Explicitly preserve all serialization members. The Serializable
+ interface is only a marker interface, so it wouldn't save them.
+ You can comment this out if your library doesn't use serialization.
+ If your code contains serializable classes that have to be backward
+ compatible, please refer to the manual. -->
+
+ <keepclassmembers implements="java.io.Serializable">
+ <field access ="final"
+ type ="long"
+ name ="serialVersionUID" />
+ <field access ="static final"
+ type ="java.io.ObjectStreamField[]"
+ name ="serialPersistentFields" />
+ <method access ="private"
+ type ="void"
+ name ="writeObject"
+ parameters="java.io.ObjectOutputStream" />
+ <method access ="private"
+ type ="void"
+ name ="readObject"
+ parameters="java.io.ObjectInputStream" />
+ <method type ="java.lang.Object"
+ name ="writeReplace"
+ parameters="" />
+ <method type ="java.lang.Object"
+ name ="readResolve"
+ parameters="" />
+ </keepclassmembers>
+
+ <!-- Your application may contain more items that need to be preserved;
+ typically classes that are dynamically created using Class.forName -->
+
+ </proguard>
+</target>
+
+</project>
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/midlets.xml b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/midlets.xml
new file mode 100644
index 0000000..223d0da
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/midlets.xml
@@ -0,0 +1,52 @@
+<!-- This Ant build file illustrates how to process J2ME midlets.
+ Usage: ant -f midlets.xml -->
+
+<project name="Midlets" default="obfuscate" basedir="../..">
+
+<target name="obfuscate">
+ <taskdef resource="proguard/ant/task.properties"
+ classpath="lib/proguard.jar" />
+
+ <proguard microedition="on"
+ printseeds="on"
+ printmapping="out.map"
+ overloadaggressively="on"
+ repackageclasses=""
+ allowaccessmodification="on"
+ renamesourcefileattribute="SourceFile">
+
+ <!-- On Windows, you can't use mixed case class names,
+ should you still want to use the preverify tool.
+ usemixedcaseclassnames="false">
+ -->
+
+ <!-- Specify the input jars, output jars, and library jars. -->
+
+ <injar file="in.jar" />
+ <outjar file="out.jar" />
+
+ <libraryjar file="/usr/local/java/wtk2.5.2/lib/midpapi20.jar" />
+ <libraryjar file="/usr/local/java/wtk2.5.2/lib/cldcapi11.jar" />
+
+ <!-- Optionally preserve line numbers in the obfuscated stack traces.
+ <keepattribute name="LineNumberTable">
+ <keepattribute name="SourceFile">
+ -->
+
+ <!-- Preserve all public midlets. -->
+
+ <keep access="public" extends="javax.microedition.midlet.MIDlet" />
+
+ <!-- Preserve all native method names and the names of their classes. -->
+
+ <keepclasseswithmembernames>
+ <method access="native" />
+ </keepclasseswithmembernames>
+
+ <!-- Your application may contain more items that need to be preserved;
+ typically classes that are dynamically created using Class.forName -->
+
+ </proguard>
+</target>
+
+</project>
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/proguard.xml b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/proguard.xml
new file mode 100644
index 0000000..f10764d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/proguard.xml
@@ -0,0 +1,78 @@
+<!-- This Ant build file illustrates how to process ProGuard (including its
+ main application, its GUI, its Ant task, and its WTK plugin), and the
+ ReTrace tool, all in one go.
+ Usage: ant -f proguard.xml -->
+
+<project name="ProGuard" default="obfuscate" basedir="../..">
+
+<target name="obfuscate">
+ <taskdef resource="proguard/ant/task.properties"
+ classpath="lib/proguard.jar" />
+
+ <proguard printmapping="proguard.map"
+ overloadaggressively="on"
+ repackageclasses=""
+ renamesourcefileattribute="SourceFile">
+
+ <!-- Specify the input jars, output jars, and library jars. -->
+
+ <injar file="lib/proguard.jar" />
+ <injar file="lib/proguardgui.jar" filter="!META-INF/**" />
+ <injar file="lib/retrace.jar" filter="!META-INF/**" />
+
+ <outjar file="examples/ant/proguard_out.jar" />
+
+ <libraryjar file="${java.home}/lib/rt.jar" />
+ <libraryjar file="/usr/local/java/ant/lib/ant.jar" />
+ <libraryjar file="/usr/local/java/wtk2.5.2/wtklib/kenv.zip" />
+
+ <!-- Adapt the resource file names, based on the corresponding obfuscated
+ class names. -->
+
+ <adaptresourcefilenames filter="**.properties,**.gif,**.jpg" />
+ <adaptresourcefilecontents filter="proguard/ant/task.properties" />
+
+ <!-- Optionally preserve line numbers in the obfuscated stack traces.
+ <keepattribute name="LineNumberTable">
+ <keepattribute name="SourceFile">
+ -->
+
+ <!-- The main seeds: ProGuard and its companion tool ReTrace. -->
+
+ <keep access="public" name="proguard.ProGuard">
+ <method access ="public static"
+ type ="void"
+ name ="main"
+ parameters="java.lang.String[]" />
+ </keep>
+ <keep access="public" name="proguard.gui.ProGuardGUI">
+ <method access ="public static"
+ type ="void"
+ name ="main"
+ parameters="java.lang.String[]" />
+ </keep>
+ <keep access="public" name="proguard.retrace.ReTrace">
+ <method access ="public static"
+ type ="void"
+ name ="main"
+ parameters="java.lang.String[]" />
+ </keep>
+
+ <!-- If we have ant.jar, we can properly process the Ant task. -->
+
+ <keeppackagename name="proguard.ant" />
+ <keep name="proguard.ant.*" allowobfuscation="true" />
+ <keepclassmembers access="public" name="proguard.ant.*">
+ <constructor parameters="org.apache.tools.ant.Project" />
+ <method access="public" type="void" name="set*" parameters="***" />
+ <method access="public" type="void" name="add*" parameters="***" />
+ </keepclassmembers>
+
+ <!-- If we have kenv.zip, we can process the J2ME WTK plugin. -->
+
+ <keep access="public" name="proguard.wtk.ProGuardObfuscator" />
+
+ </proguard>
+</target>
+
+</project>
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/servlets.xml b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/servlets.xml
new file mode 100644
index 0000000..51bcaad
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/ant/servlets.xml
@@ -0,0 +1,88 @@
+<!-- This Ant build file illustrates how to process servlets.
+ Usage: ant -f servlets.xml -->
+
+<project name="Servlets" default="obfuscate" basedir="../..">
+
+<target name="obfuscate">
+ <taskdef resource="proguard/ant/task.properties"
+ classpath="lib/proguard.jar" />
+
+ <proguard printseeds="on"
+ printmapping="proguard.map"
+ renamesourcefileattribute="SourceFile">
+
+ <!-- Specify the input jars, output jars, and library jars. -->
+
+ <injar file="in.jar" />
+ <outjar file="out.jar" />
+
+ <libraryjar file="${java.home}/lib/rt.jar" />
+
+ <!-- Optionally preserve line numbers in the obfuscated stack traces.
+ <keepattribute name="LineNumberTable">
+ <keepattribute name="SourceFile">
+ -->
+
+ <!-- Preserve all annotations. -->
+
+ <keepattribute name="*Annotation*" />
+
+ <!-- Keep all public servlets. -->
+
+ <keep access="public" implements="javax.servlet.Servlet" />
+
+ <!-- Preserve all native method names and the names of their classes. -->
+
+ <keepclasseswithmembernames>
+ <method access="native" />
+ </keepclasseswithmembernames>
+
+ <!-- Preserve the methods that are required in all enumeration classes. -->
+
+ <keepclassmembers extends="java.lang.Enum">
+ <method access="public static"
+ type="**[]"
+ name="values"
+ parameters="" />
+ <method access="public static"
+ type="**"
+ name="valueOf"
+ parameters="java.lang.String" />
+ </keepclassmembers>
+
+ <!-- Explicitly preserve all serialization members. The Serializable
+ interface is only a marker interface, so it wouldn't save them.
+ You can comment this out if your library doesn't use serialization.
+ If your code contains serializable classes that have to be backward
+ compatible, please refer to the manual. -->
+
+ <keepclassmembers implements="java.io.Serializable">
+ <field access ="static final"
+ type ="long"
+ name ="serialVersionUID" />
+ <field access ="static final"
+ type ="java.io.ObjectStreamField[]"
+ name ="serialPersistentFields" />
+ <method access ="private"
+ type ="void"
+ name ="writeObject"
+ parameters="java.io.ObjectOutputStream" />
+ <method access ="private"
+ type ="void"
+ name ="readObject"
+ parameters="java.io.ObjectInputStream" />
+ <method type ="java.lang.Object"
+ name ="writeReplace"
+ parameters="" />
+ <method type ="java.lang.Object"
+ name ="readResolve"
+ parameters="" />
+ </keepclassmembers>
+
+ <!-- Your application may contain more items that need to be preserved;
+ typically classes that are dynamically created using Class.forName -->
+
+ </proguard>
+</target>
+
+</project>
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/applets.pro b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/applets.pro
new file mode 100644
index 0000000..c5affc1
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/applets.pro
@@ -0,0 +1,69 @@
+#
+# This ProGuard configuration file illustrates how to process applets.
+# Usage:
+# java -jar proguard.jar @applets.pro
+#
+
+# Specify the input jars, output jars, and library jars.
+
+-injars in.jar
+-outjars out.jar
+
+-libraryjars <java.home>/lib/rt.jar
+
+# Save the obfuscation mapping to a file, so you can de-obfuscate any stack
+# traces later on. Keep a fixed source file attribute and all line number
+# tables to get line numbers in the stack traces.
+# You can comment this out if you're not interested in stack traces.
+
+-printmapping out.map
+-renamesourcefileattribute SourceFile
+-keepattributes SourceFile,LineNumberTable
+
+# Preserve all annotations.
+
+-keepattributes *Annotation*
+
+# You can print out the seeds that are matching the keep options below.
+
+#-printseeds out.seeds
+
+# Preserve all public applets.
+
+-keep public class * extends java.applet.Applet
+
+# Preserve all native method names and the names of their classes.
+
+-keepclasseswithmembernames class * {
+ native <methods>;
+}
+
+# Preserve the special static methods that are required in all enumeration
+# classes.
+
+-keepclassmembers class * extends java.lang.Enum {
+ public static **[] values();
+ public static ** valueOf(java.lang.String);
+}
+
+# Explicitly preserve all serialization members. The Serializable interface
+# is only a marker interface, so it wouldn't save them.
+# You can comment this out if your library doesn't use serialization.
+# If your code contains serializable classes that have to be backward
+# compatible, please refer to the manual.
+
+-keepclassmembers class * implements java.io.Serializable {
+ static final long serialVersionUID;
+ static final java.io.ObjectStreamField[] serialPersistentFields;
+ private void writeObject(java.io.ObjectOutputStream);
+ private void readObject(java.io.ObjectInputStream);
+ java.lang.Object writeReplace();
+ java.lang.Object readResolve();
+}
+
+# Your application may contain more items that need to be preserved;
+# typically classes that are dynamically created using Class.forName:
+
+# -keep public class mypackage.MyClass
+# -keep public interface mypackage.MyInterface
+# -keep public class * implements mypackage.MyInterface
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/applications.pro b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/applications.pro
new file mode 100644
index 0000000..f718088
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/applications.pro
@@ -0,0 +1,75 @@
+#
+# This ProGuard configuration file illustrates how to process applications.
+# Usage:
+# java -jar proguard.jar @applications.pro
+#
+
+# Specify the input jars, output jars, and library jars.
+
+-injars in.jar
+-outjars out.jar
+
+-libraryjars <java.home>/lib/rt.jar
+#-libraryjars junit.jar
+#-libraryjars servlet.jar
+#-libraryjars jai_core.jar
+#...
+
+# Save the obfuscation mapping to a file, so you can de-obfuscate any stack
+# traces later on. Keep a fixed source file attribute and all line number
+# tables to get line numbers in the stack traces.
+# You can comment this out if you're not interested in stack traces.
+
+-printmapping out.map
+-renamesourcefileattribute SourceFile
+-keepattributes SourceFile,LineNumberTable
+
+# Preserve all annotations.
+
+-keepattributes *Annotation*
+
+# You can print out the seeds that are matching the keep options below.
+
+#-printseeds out.seeds
+
+# Preserve all public applications.
+
+-keepclasseswithmembers public class * {
+ public static void main(java.lang.String[]);
+}
+
+# Preserve all native method names and the names of their classes.
+
+-keepclasseswithmembernames class * {
+ native <methods>;
+}
+
+# Preserve the special static methods that are required in all enumeration
+# classes.
+
+-keepclassmembers class * extends java.lang.Enum {
+ public static **[] values();
+ public static ** valueOf(java.lang.String);
+}
+
+# Explicitly preserve all serialization members. The Serializable interface
+# is only a marker interface, so it wouldn't save them.
+# You can comment this out if your application doesn't use serialization.
+# If your code contains serializable classes that have to be backward
+# compatible, please refer to the manual.
+
+-keepclassmembers class * implements java.io.Serializable {
+ static final long serialVersionUID;
+ static final java.io.ObjectStreamField[] serialPersistentFields;
+ private void writeObject(java.io.ObjectOutputStream);
+ private void readObject(java.io.ObjectInputStream);
+ java.lang.Object writeReplace();
+ java.lang.Object readResolve();
+}
+
+# Your application may contain more items that need to be preserved;
+# typically classes that are dynamically created using Class.forName:
+
+# -keep public class mypackage.MyClass
+# -keep public interface mypackage.MyInterface
+# -keep public class * implements mypackage.MyInterface
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/dictionaries/compact.txt b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/dictionaries/compact.txt
new file mode 100644
index 0000000..5636a3e
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/dictionaries/compact.txt
@@ -0,0 +1,18 @@
+#
+# This obfuscation dictionary contains strings that are already present
+# in many class files. Since these strings can be shared, the resulting
+# obfuscated class files will generally be a little bit more compact.
+# Usage:
+# java -jar proguard.jar ..... -obfuscationdictionary compact.txt
+#
+
+Code
+V
+I
+Z
+B
+C
+S
+F
+D
+L
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/dictionaries/keywords.txt b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/dictionaries/keywords.txt
new file mode 100644
index 0000000..76f5a7b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/dictionaries/keywords.txt
@@ -0,0 +1,58 @@
+#
+# This obfuscation dictionary contains reserved Java keywords. They can't
+# be used in Java source files, but they can be used in compiled class files.
+# Note that this hardly improves the obfuscation. Decent decompilers can
+# automatically replace reserved keywords, and the effect can fairly simply be
+# undone by obfuscating again with simpler names.
+# Usage:
+# java -jar proguard.jar ..... -obfuscationdictionary keywords.txt
+#
+
+do
+if
+for
+int
+new
+try
+byte
+case
+char
+else
+goto
+long
+this
+void
+break
+catch
+class
+const
+final
+float
+short
+super
+throw
+while
+double
+import
+native
+public
+return
+static
+switch
+throws
+boolean
+default
+extends
+finally
+package
+private
+abstract
+continue
+strictfp
+volatile
+interface
+protected
+transient
+implements
+instanceof
+synchronized
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/dictionaries/shakespeare.txt b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/dictionaries/shakespeare.txt
new file mode 100644
index 0000000..28b1cd8
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/dictionaries/shakespeare.txt
@@ -0,0 +1,23 @@
+#
+# This obfuscation dictionary contains quotes from plays by Shakespeare.
+# It illustrates that any text can be used, for whatever flippant reasons
+# one may have.
+# Usage:
+# java -jar proguard.jar ..... -obfuscationdictionary shakespeare.txt
+#
+
+
+"This thing of darkness I acknowledge mine."
+
+ --From The Tempest (V, i, 275-276)
+
+
+"Though this be madness, yet there is method in 't."
+
+ --From Hamlet (II, ii, 206)
+
+
+"What's in a name? That which we call a rose
+ By any other word would smell as sweet."
+
+ --From Romeo and Juliet (II, ii, 1-2)
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/dictionaries/windows.txt b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/dictionaries/windows.txt
new file mode 100644
index 0000000..fd65dc9
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/dictionaries/windows.txt
@@ -0,0 +1,209 @@
+#
+# This obfuscation dictionary contains names that are not allowed as file names
+# in Windows, not even with extensions like .class or .java. They can however
+# be used without problems in jar archives, which just begs to apply them as
+# obfuscated class names. Trying to unpack the obfuscated archives in Windows
+# will probably generate some sparks.
+# Usage:
+# java -jar proguard.jar ..... -classobfuscationdictionary windows.txt
+# -packageobfuscationdictionary windows.txt
+#
+
+aux
+Aux
+aUx
+AUx
+auX
+AuX
+aUX
+AUX
+AUX
+con
+Con
+cOn
+COn
+coN
+CoN
+cON
+CON
+CON
+nul
+Nul
+nUl
+NUl
+nuL
+NuL
+nUL
+NUL
+NUL
+prn
+Prn
+pRn
+PRn
+prN
+PrN
+pRN
+PRN
+PRN
+com1
+Com1
+cOm1
+COm1
+coM1
+CoM1
+cOM1
+COM1
+COM1
+com2
+Com2
+cOm2
+COm2
+coM2
+CoM2
+cOM2
+COM2
+COM2
+com3
+Com3
+cOm3
+COm3
+coM3
+CoM3
+cOM3
+COM3
+COM3
+com4
+Com4
+cOm4
+COm4
+coM4
+CoM4
+cOM4
+COM4
+COM4
+com5
+Com5
+cOm5
+COm5
+coM5
+CoM5
+cOM5
+COM5
+COM5
+com6
+Com6
+cOm6
+COm6
+coM6
+CoM6
+cOM6
+COM6
+COM6
+com7
+Com7
+cOm7
+COm7
+coM7
+CoM7
+cOM7
+COM7
+COM7
+com8
+Com8
+cOm8
+COm8
+coM8
+CoM8
+cOM8
+COM8
+COM8
+com9
+Com9
+cOm9
+COm9
+coM9
+CoM9
+cOM9
+COM9
+COM9
+lpt1
+Lpt1
+lPt1
+LPt1
+lpT1
+LpT1
+lPT1
+LPT1
+LPT1
+lpt2
+Lpt2
+lPt2
+LPt2
+lpT2
+LpT2
+lPT2
+LPT2
+LPT2
+lpt3
+Lpt3
+lPt3
+LPt3
+lpT3
+LpT3
+lPT3
+LPT3
+LPT3
+lpt4
+Lpt4
+lPt4
+LPt4
+lpT4
+LpT4
+lPT4
+LPT4
+LPT4
+lpt5
+Lpt5
+lPt5
+LPt5
+lpT5
+LpT5
+lPT5
+LPT5
+LPT5
+lpt6
+Lpt6
+lPt6
+LPt6
+lpT6
+LpT6
+lPT6
+LPT6
+LPT6
+lpt7
+Lpt7
+lPt7
+LPt7
+lpT7
+LpT7
+lPT7
+LPT7
+LPT7
+lpt8
+Lpt8
+lPt8
+LPt8
+lpT8
+LpT8
+lPT8
+LPT8
+LPT8
+lpt9
+Lpt9
+lPt9
+LPt9
+lpT9
+LpT9
+lPT9
+LPT9
+LPT9
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/library.pro b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/library.pro
new file mode 100644
index 0000000..b812082
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/library.pro
@@ -0,0 +1,79 @@
+#
+# This ProGuard configuration file illustrates how to process a program
+# library, such that it remains usable as a library.
+# Usage:
+# java -jar proguard.jar @library.pro
+#
+
+# Specify the input jars, output jars, and library jars.
+# In this case, the input jar is the program library that we want to process.
+
+-injars in.jar
+-outjars out.jar
+
+-libraryjars <java.home>/lib/rt.jar
+
+# Save the obfuscation mapping to a file, so we can de-obfuscate any stack
+# traces later on. Keep a fixed source file attribute and all line number
+# tables to get line numbers in the stack traces.
+# You can comment this out if you're not interested in stack traces.
+
+-printmapping out.map
+-keepparameternames
+-renamesourcefileattribute SourceFile
+-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
+ SourceFile,LineNumberTable,EnclosingMethod
+
+# Preserve all annotations.
+
+-keepattributes *Annotation*
+
+# Preserve all public classes, and their public and protected fields and
+# methods.
+
+-keep public class * {
+ public protected *;
+}
+
+# Preserve all .class method names.
+
+-keepclassmembernames class * {
+ java.lang.Class class$(java.lang.String);
+ java.lang.Class class$(java.lang.String, boolean);
+}
+
+# Preserve all native method names and the names of their classes.
+
+-keepclasseswithmembernames class * {
+ native <methods>;
+}
+
+# Preserve the special static methods that are required in all enumeration
+# classes.
+
+-keepclassmembers class * extends java.lang.Enum {
+ public static **[] values();
+ public static ** valueOf(java.lang.String);
+}
+
+# Explicitly preserve all serialization members. The Serializable interface
+# is only a marker interface, so it wouldn't save them.
+# You can comment this out if your library doesn't use serialization.
+# If your code contains serializable classes that have to be backward
+# compatible, please refer to the manual.
+
+-keepclassmembers class * implements java.io.Serializable {
+ static final long serialVersionUID;
+ static final java.io.ObjectStreamField[] serialPersistentFields;
+ private void writeObject(java.io.ObjectOutputStream);
+ private void readObject(java.io.ObjectInputStream);
+ java.lang.Object writeReplace();
+ java.lang.Object readResolve();
+}
+
+# Your library may contain more items that need to be preserved;
+# typically classes that are dynamically created using Class.forName:
+
+# -keep public class mypackage.MyClass
+# -keep public interface mypackage.MyInterface
+# -keep public class * implements mypackage.MyInterface
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/midlets.pro b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/midlets.pro
new file mode 100644
index 0000000..1383980
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/midlets.pro
@@ -0,0 +1,67 @@
+#
+# This ProGuard configuration file illustrates how to process J2ME midlets.
+# Usage:
+# java -jar proguard.jar @midlets.pro
+#
+
+# Specify the input jars, output jars, and library jars.
+
+-injars in.jar
+-outjars out.jar
+
+-libraryjars /usr/local/java/wtk2.5.2/lib/midpapi20.jar
+-libraryjars /usr/local/java/wtk2.5.2/lib/cldcapi11.jar
+
+# Preverify the code suitably for Java Micro Edition.
+
+-microedition
+
+# Allow methods with the same signature, except for the return type,
+# to get the same obfuscation name.
+
+-overloadaggressively
+
+# Put all obfuscated classes into the nameless root package.
+
+-repackageclasses ''
+
+# Allow classes and class members to be made public.
+
+-allowaccessmodification
+
+# On Windows, you can't use mixed case class names,
+# should you still want to use the preverify tool.
+#
+# -dontusemixedcaseclassnames
+
+# Save the obfuscation mapping to a file, so you can de-obfuscate any stack
+# traces later on.
+
+-printmapping out.map
+
+# You can keep a fixed source file attribute and all line number tables to
+# get stack traces with line numbers.
+
+#-renamesourcefileattribute SourceFile
+#-keepattributes SourceFile,LineNumberTable
+
+# You can print out the seeds that are matching the keep options below.
+
+#-printseeds out.seeds
+
+# Preserve all public midlets.
+
+-keep public class * extends javax.microedition.midlet.MIDlet
+
+# Preserve all native method names and the names of their classes.
+
+-keepclasseswithmembernames class * {
+ native <methods>;
+}
+
+# Your midlet may contain more items that need to be preserved;
+# typically classes that are dynamically created using Class.forName:
+
+# -keep public class mypackage.MyClass
+# -keep public interface mypackage.MyInterface
+# -keep public class * implements mypackage.MyInterface
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/proguard.pro b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/proguard.pro
new file mode 100644
index 0000000..3b0a926
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/proguard.pro
@@ -0,0 +1,57 @@
+#
+# This ProGuard configuration file illustrates how to process ProGuard itself.
+# Configuration files for typical applications will be very similar.
+# Usage:
+# java -jar proguard.jar @proguard.pro
+#
+
+# Specify the input jars, output jars, and library jars.
+# We'll filter out the Ant and WTK classes, keeping everything else.
+
+-injars ../lib/proguard.jar(!proguard/ant/**,!proguard/wtk/**)
+-outjars proguard_out.jar
+
+-libraryjars <java.home>/lib/rt.jar
+
+# Write out an obfuscation mapping file, for de-obfuscating any stack traces
+# later on, or for incremental obfuscation of extensions.
+
+-printmapping proguard.map
+
+# Allow methods with the same signature, except for the return type,
+# to get the same obfuscation name.
+
+-overloadaggressively
+
+# Put all obfuscated classes into the nameless root package.
+
+-repackageclasses ''
+
+# Allow classes and class members to be made public.
+
+-allowaccessmodification
+
+# The entry point: ProGuard and its main method.
+
+-keep public class proguard.ProGuard {
+ public static void main(java.lang.String[]);
+}
+
+# If you want to preserve the Ant task as well, you'll have to specify the
+# main ant.jar.
+
+#-libraryjars /usr/local/java/ant/lib/ant.jar
+#-adaptresourcefilecontents proguard/ant/task.properties
+#
+#-keep,allowobfuscation class proguard.ant.*
+#-keepclassmembers public class proguard.ant.* {
+# <init>(org.apache.tools.ant.Project);
+# public void set*(***);
+# public void add*(***);
+#}
+
+# If you want to preserve the WTK obfuscation plug-in, you'll have to specify
+# the kenv.zip file.
+
+#-libraryjars /usr/local/java/wtk2.5.2/wtklib/kenv.zip
+#-keep public class proguard.wtk.ProGuardObfuscator
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/proguardall.pro b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/proguardall.pro
new file mode 100644
index 0000000..da9c2b3
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/proguardall.pro
@@ -0,0 +1,62 @@
+#
+# This ProGuard configuration file illustrates how to process ProGuard
+# (including its main application, its GUI, its Ant task, and its WTK plugin),
+# and the ReTrace tool, all in one go.
+# Configuration files for typical applications will be very similar.
+# Usage:
+# java -jar proguard.jar @proguardall.pro
+#
+
+# Specify the input jars, output jars, and library jars.
+# We'll read all jars from the lib directory, process them, and write the
+# processed jars to a new out directory.
+
+-injars ../lib
+-outjars out
+
+# You may have to adapt the paths below.
+
+-libraryjars <java.home>/lib/rt.jar
+-libraryjars /usr/local/java/ant/lib/ant.jar
+-libraryjars /usr/local/java/wtk2.5.2/wtklib/kenv.zip
+
+# Allow methods with the same signature, except for the return type,
+# to get the same obfuscation name.
+
+-overloadaggressively
+
+# Put all obfuscated classes into the nameless root package.
+
+-repackageclasses ''
+
+# Adapt the names and contents of the resource files.
+
+-adaptresourcefilenames **.properties,**.gif,**.jpg
+-adaptresourcefilecontents proguard/ant/task.properties
+
+# The main entry points.
+
+-keep public class proguard.ProGuard {
+ public static void main(java.lang.String[]);
+}
+
+-keep public class proguard.gui.ProGuardGUI {
+ public static void main(java.lang.String[]);
+}
+
+-keep public class proguard.retrace.ReTrace {
+ public static void main(java.lang.String[]);
+}
+
+# If we have ant.jar, we can properly process the Ant task.
+
+-keep,allowobfuscation class proguard.ant.*
+-keepclassmembers public class proguard.ant.* {
+ <init>(org.apache.tools.ant.Project);
+ public void set*(***);
+ public void add*(***);
+}
+
+# If we have kenv.zip, we can process the J2ME WTK plugin.
+
+-keep public class proguard.wtk.ProGuardObfuscator
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/proguardgui.pro b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/proguardgui.pro
new file mode 100644
index 0000000..f14ce14
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/proguardgui.pro
@@ -0,0 +1,50 @@
+#
+# This ProGuard configuration file illustrates how to process the ProGuard GUI.
+# Configuration files for typical applications will be very similar.
+# Usage:
+# java -jar proguard.jar @proguardgui.pro
+#
+
+# Specify the input jars, output jars, and library jars.
+# The input jars will be merged in a single output jar.
+# We'll filter out the Ant and WTK classes.
+
+-injars ../lib/proguardgui.jar
+-injars ../lib/proguard.jar(!META-INF/**,!proguard/ant/**,!proguard/wtk/**)
+-injars ../lib/retrace.jar (!META-INF/**)
+-outjars proguardgui_out.jar
+
+-libraryjars <java.home>/lib/rt.jar
+
+# If we wanted to reuse the previously obfuscated proguard_out.jar, we could
+# perform incremental obfuscation based on its mapping file, and only keep the
+# additional GUI files instead of all files.
+
+#-applymapping proguard.map
+#-injars ../lib/proguardgui.jar
+#-outjars proguardgui_out.jar
+#-libraryjars ../lib/proguard.jar(!proguard/ant/**,!proguard/wtk/**)
+#-libraryjars ../lib/retrace.jar
+#-libraryjars <java.home>/lib/rt.jar
+
+
+# Allow methods with the same signature, except for the return type,
+# to get the same obfuscation name.
+
+-overloadaggressively
+
+# Put all obfuscated classes into the nameless root package.
+
+-repackageclasses ''
+
+# Adapt the names of resource files, based on the corresponding obfuscated
+# class names. Notably, in this case, the GUI resource properties file will
+# have to be renamed.
+
+-adaptresourcefilenames **.properties,**.gif,**.jpg
+
+# The entry point: ProGuardGUI and its main method.
+
+-keep public class proguard.gui.ProGuardGUI {
+ public static void main(java.lang.String[]);
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/retrace.pro b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/retrace.pro
new file mode 100644
index 0000000..39f5a95
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/retrace.pro
@@ -0,0 +1,43 @@
+#
+# This ProGuard configuration file illustrates how to process the ReTrace tool.
+# Configuration files for typical applications will be very similar.
+# Usage:
+# java -jar proguard.jar @retrace.pro
+#
+
+# Specify the input jars, output jars, and library jars.
+# The input jars will be merged in a single output jar.
+# We'll filter out the Ant and WTK classes.
+
+-injars ../lib/retrace.jar
+-injars ../lib/proguard.jar(!META-INF/MANIFEST.MF,
+ !proguard/ant/**,!proguard/wtk/**)
+-outjars retrace_out.jar
+
+-libraryjars <java.home>/lib/rt.jar
+
+# If we wanted to reuse the previously obfuscated proguard_out.jar, we could
+# perform incremental obfuscation based on its mapping file, and only keep the
+# additional ReTrace files instead of all files.
+
+#-applymapping proguard.map
+#-outjars retrace_out.jar(proguard/retrace/**)
+
+# Allow methods with the same signature, except for the return type,
+# to get the same obfuscation name.
+
+-overloadaggressively
+
+# Put all obfuscated classes into the nameless root package.
+
+-repackageclasses ''
+
+# Allow classes and class members to be made public.
+
+-allowaccessmodification
+
+# The entry point: ReTrace and its main method.
+
+-keep public class proguard.retrace.ReTrace {
+ public static void main(java.lang.String[]);
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/scala.pro b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/scala.pro
new file mode 100644
index 0000000..658fc77
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/scala.pro
@@ -0,0 +1,132 @@
+#
+# This ProGuard configuration file illustrates how to process Scala
+# applications, including the Scala runtime.
+# Usage:
+# java -jar proguard.jar @scala.pro
+#
+
+# Specify the input jars, output jars, and library jars.
+
+-injars in.jar
+-injars /usr/local/java/scala-2.9.1/lib/scala-library.jar
+#-injars /usr/local/java/scala-2.9.1/lib/scala-compiler.jar(!META-INF/MANIFEST.MF)
+#-injars /usr/local/java/scala-2.9.1/lib/jline.jar(!META-INF/MANIFEST.MF)
+-outjars out.jar
+
+-libraryjars <java.home>/lib/rt.jar
+#-libraryjars /usr/local/java/ant/lib/ant.jar
+#...
+
+# Ignore some compiler artefacts.
+
+-dontwarn scala.**
+
+# Save the obfuscation mapping to a file, so you can de-obfuscate any stack
+# traces later on. Keep a fixed source file attribute and all line number
+# tables to get line numbers in the stack traces.
+# You can comment this out if you're not interested in stack traces.
+
+-printmapping out.map
+-renamesourcefileattribute SourceFile
+-keepattributes SourceFile,LineNumberTable
+
+# Preserve all annotations.
+
+-keepattributes *Annotation*
+
+# You can print out the seeds that are matching the keep options below.
+
+#-printseeds out.seeds
+
+# Preserve all public applications.
+
+-keepclasseswithmembers public class * {
+ public static void main(java.lang.String[]);
+}
+
+# Preserve some classes and class members that are accessed by means of
+# introspection.
+
+-keep class * implements org.xml.sax.EntityResolver
+
+-keepclassmembers class * {
+ ** MODULE$;
+}
+
+-keepclassmembernames class scala.concurrent.forkjoin.ForkJoinPool {
+ long eventCount;
+ int workerCounts;
+ int runControl;
+ scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode syncStack;
+ scala.concurrent.forkjoin.ForkJoinPool$WaitQueueNode spareStack;
+}
+
+-keepclassmembernames class scala.concurrent.forkjoin.ForkJoinWorkerThread {
+ int base;
+ int sp;
+ int runState;
+}
+
+-keepclassmembernames class scala.concurrent.forkjoin.ForkJoinTask {
+ int status;
+}
+
+-keepclassmembernames class scala.concurrent.forkjoin.LinkedTransferQueue {
+ scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference head;
+ scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference tail;
+ scala.concurrent.forkjoin.LinkedTransferQueue$PaddedAtomicReference cleanMe;
+}
+
+# Preserve some classes and class members that are accessed by means of
+# introspection in the Scala compiler library, if it is processed as well.
+
+#-keep class * implements jline.Completor
+#-keep class * implements jline.Terminal
+
+#-keep class scala.tools.nsc.Global
+
+#-keepclasseswithmembers class * {
+# <init>(scala.tools.nsc.Global);
+#}
+
+#-keepclassmembers class * {
+# *** scala_repl_value();
+# *** scala_repl_result();
+#}
+
+# Preserve all native method names and the names of their classes.
+
+-keepclasseswithmembernames class * {
+ native <methods>;
+}
+
+# Preserve the special static methods that are required in all enumeration
+# classes.
+
+-keepclassmembers class * extends java.lang.Enum {
+ public static **[] values();
+ public static ** valueOf(java.lang.String);
+}
+
+# Explicitly preserve all serialization members. The Serializable interface
+# is only a marker interface, so it wouldn't save them.
+# You can comment this out if your application doesn't use serialization.
+# If your code contains serializable classes that have to be backward
+# compatible, please refer to the manual.
+
+-keepclassmembers class * implements java.io.Serializable {
+ static final long serialVersionUID;
+ static final java.io.ObjectStreamField[] serialPersistentFields;
+ private void writeObject(java.io.ObjectOutputStream);
+ private void readObject(java.io.ObjectInputStream);
+ java.lang.Object writeReplace();
+ java.lang.Object readResolve();
+}
+
+# Your application may contain more items that need to be preserved;
+# typically classes that are dynamically created using Class.forName:
+
+# -keep public class mypackage.MyClass
+# -keep public interface mypackage.MyInterface
+# -keep public class * implements mypackage.MyInterface
+
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/examples/servlets.pro b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/servlets.pro
new file mode 100644
index 0000000..b42b2e4
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/examples/servlets.pro
@@ -0,0 +1,70 @@
+#
+# This ProGuard configuration file illustrates how to process servlets.
+# Usage:
+# java -jar proguard.jar @servlets.pro
+#
+
+# Specify the input jars, output jars, and library jars.
+
+-injars in.jar
+-outjars out.jar
+
+-libraryjars <java.home>/lib/rt.jar
+-libraryjars /usr/local/java/servlet/servlet.jar
+
+# Save the obfuscation mapping to a file, so you can de-obfuscate any stack
+# traces later on. Keep a fixed source file attribute and all line number
+# tables to get line numbers in the stack traces.
+# You can comment this out if you're not interested in stack traces.
+
+-printmapping out.map
+-renamesourcefileattribute SourceFile
+-keepattributes SourceFile,LineNumberTable
+
+# Preserve all annotations.
+
+-keepattributes *Annotation*
+
+# You can print out the seeds that are matching the keep options below.
+
+#-printseeds out.seeds
+
+# Preserve all public servlets.
+
+-keep public class * implements javax.servlet.Servlet
+
+# Preserve all native method names and the names of their classes.
+
+-keepclasseswithmembernames class * {
+ native <methods>;
+}
+
+# Preserve the special static methods that are required in all enumeration
+# classes.
+
+-keepclassmembers class * extends java.lang.Enum {
+ public static **[] values();
+ public static ** valueOf(java.lang.String);
+}
+
+# Explicitly preserve all serialization members. The Serializable interface
+# is only a marker interface, so it wouldn't save them.
+# You can comment this out if your library doesn't use serialization.
+# If your code contains serializable classes that have to be backward
+# compatible, please refer to the manual.
+
+-keepclassmembers class * implements java.io.Serializable {
+ static final long serialVersionUID;
+ static final java.io.ObjectStreamField[] serialPersistentFields;
+ private void writeObject(java.io.ObjectOutputStream);
+ private void readObject(java.io.ObjectInputStream);
+ java.lang.Object writeReplace();
+ java.lang.Object readResolve();
+}
+
+# Your application may contain more items that need to be preserved;
+# typically classes that are dynamically created using Class.forName:
+
+# -keep public class mypackage.MyClass
+# -keep public interface mypackage.MyInterface
+# -keep public class * implements mypackage.MyInterface
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/lib/proguard.jar b/love2dToAPK/tools/tools/android-win/tools/proguard/lib/proguard.jar
new file mode 100644
index 0000000..56d68ba
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/lib/proguard.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/lib/proguardgui.jar b/love2dToAPK/tools/tools/android-win/tools/proguard/lib/proguardgui.jar
new file mode 100644
index 0000000..5cf8f81
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/lib/proguardgui.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/lib/retrace.jar b/love2dToAPK/tools/tools/android-win/tools/proguard/lib/retrace.jar
new file mode 100644
index 0000000..a872adb
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/lib/retrace.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/license.html b/love2dToAPK/tools/tools/android-win/tools/proguard/license.html
new file mode 100644
index 0000000..5134165
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/license.html
@@ -0,0 +1,49 @@
+<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<meta http-equiv="content-style-type" content="text/css">
+<link rel="stylesheet" type="text/css" href="style.css">
+<title>ProGuard License</title>
+</head>
+<body>
+
+<h2>License</h2>
+
+<b>ProGuard</b> is free. You can use it freely for processing your
+applications, commercial or not. Your code obviously remains yours after
+having been processed, and its license can remain the same.
+<p>
+
+<b>ProGuard</b> itself is copyrighted, but its distribution license provides
+you with some rights for modifying and redistributing its code and its
+documentation. More specifically, <b>ProGuard</b> is distributed under the
+terms of the <a href="GPL.html">GNU General Public License</a> (GPL), version
+2, as published by the <a href="http://www.fsf.org/" target="other">Free
+Software Foundation</a> (FSF). In short, this means that you may freely
+redistribute the program, modified or as is, on the condition that you make
+the complete source code available as well. If you develop a program that is
+linked with
+<b>ProGuard</b>, the program as a whole has to be distributed at no charge
+under the GPL. I am granting a <a href="GPL_exception.html">special
+exception</a> to the latter clause (in wording suggested by
+the <a href="http://www.gnu.org/copyleft/gpl-faq.html#GPLIncompatibleLibs"
+target="other">FSF</a>), for combinations with the following stand-alone
+applications: Apache Ant, Apache Maven, the Google Android SDK, the Eclipse
+ProGuardDT GUI, the EclipseME JME IDE, the Oracle NetBeans Java IDE, the Oracle
+JME Wireless Toolkit, the Simple Build Tool for Scala, the NeoMAD Tools by
+Neomades, the Javaground Tools, and the Sanaware Tools.
+
+<p>
+The <b>ProGuard user documentation</b> represents an important part of this
+work. It may only be redistributed without changes, along with the unmodified
+version of the code.
+
+<hr />
+<noscript><div><a target="_top" href="index.html" class="button">Show menu</a></div></noscript>
+<address>
+Copyright &copy; 2002-2011
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+</address>
+</body>
+</html>
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/proguard-android-optimize.txt b/love2dToAPK/tools/tools/android-win/tools/proguard/proguard-android-optimize.txt
new file mode 100644
index 0000000..f8f5bcb
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/proguard-android-optimize.txt
@@ -0,0 +1,64 @@
+# This is a configuration file for ProGuard.
+# http://proguard.sourceforge.net/index.html#manual/usage.html
+
+# Optimizations: If you don't want to optimize, use the
+# proguard-android.txt configuration file instead of this one, which
+# turns off the optimization flags. Adding optimization introduces
+# certain risks, since for example not all optimizations performed by
+# ProGuard works on all versions of Dalvik. The following flags turn
+# off various optimizations known to have issues, but the list may not
+# be complete or up to date. (The "arithmetic" optimization can be
+# used if you are only targeting Android 2.0 or later.) Make sure you
+# test thoroughly if you go this route.
+-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
+-optimizationpasses 5
+-allowaccessmodification
+-dontpreverify
+
+# The remainder of this file is identical to the non-optimized version
+# of the Proguard configuration file (except that the other file has
+# flags to turn off optimization).
+
+-dontusemixedcaseclassnames
+-dontskipnonpubliclibraryclasses
+-verbose
+
+-keepattributes *Annotation*
+-keep public class com.google.vending.licensing.ILicensingService
+-keep public class com.android.vending.licensing.ILicensingService
+
+# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
+-keepclasseswithmembernames class * {
+ native <methods>;
+}
+
+# keep setters in Views so that animations can still work.
+# see http://proguard.sourceforge.net/manual/examples.html#beans
+-keepclassmembers public class * extends android.view.View {
+ void set*(***);
+ *** get*();
+}
+
+# We want to keep methods in Activity that could be used in the XML attribute onClick
+-keepclassmembers class * extends android.app.Activity {
+ public void *(android.view.View);
+}
+
+# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
+-keepclassmembers enum * {
+ public static **[] values();
+ public static ** valueOf(java.lang.String);
+}
+
+-keep class * implements android.os.Parcelable {
+ public static final android.os.Parcelable$Creator *;
+}
+
+-keepclassmembers class **.R$* {
+ public static <fields>;
+}
+
+# The support library contains references to newer platform versions.
+# Don't warn about those in case this app is linking against an older
+# platform version. We know about them, and they are safe.
+-dontwarn android.support.**
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/proguard-android.txt b/love2dToAPK/tools/tools/android-win/tools/proguard/proguard-android.txt
new file mode 100644
index 0000000..fe73bae
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/proguard-android.txt
@@ -0,0 +1,57 @@
+# This is a configuration file for ProGuard.
+# http://proguard.sourceforge.net/index.html#manual/usage.html
+
+-dontusemixedcaseclassnames
+-dontskipnonpubliclibraryclasses
+-verbose
+
+# Optimization is turned off by default. Dex does not like code run
+# through the ProGuard optimize and preverify steps (and performs some
+# of these optimizations on its own).
+-dontoptimize
+-dontpreverify
+# Note that if you want to enable optimization, you cannot just
+# include optimization flags in your own project configuration file;
+# instead you will need to point to the
+# "proguard-android-optimize.txt" file instead of this one from your
+# project.properties file.
+
+-keepattributes *Annotation*
+-keep public class com.google.vending.licensing.ILicensingService
+-keep public class com.android.vending.licensing.ILicensingService
+
+# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
+-keepclasseswithmembernames class * {
+ native <methods>;
+}
+
+# keep setters in Views so that animations can still work.
+# see http://proguard.sourceforge.net/manual/examples.html#beans
+-keepclassmembers public class * extends android.view.View {
+ void set*(***);
+ *** get*();
+}
+
+# We want to keep methods in Activity that could be used in the XML attribute onClick
+-keepclassmembers class * extends android.app.Activity {
+ public void *(android.view.View);
+}
+
+# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
+-keepclassmembers enum * {
+ public static **[] values();
+ public static ** valueOf(java.lang.String);
+}
+
+-keep class * implements android.os.Parcelable {
+ public static final android.os.Parcelable$Creator *;
+}
+
+-keepclassmembers class **.R$* {
+ public static <fields>;
+}
+
+# The support library contains references to newer platform versions.
+# Don't warn about those in case this app is linking against an older
+# platform version. We know about them, and they are safe.
+-dontwarn android.support.**
diff --git a/love2dToAPK/tools/tools/android-win/tools/proguard/proguard-project.txt b/love2dToAPK/tools/tools/android-win/tools/proguard/proguard-project.txt
new file mode 100644
index 0000000..f2fe155
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/proguard/proguard-project.txt
@@ -0,0 +1,20 @@
+# To enable ProGuard in your project, edit project.properties
+# to define the proguard.config property as described in that file.
+#
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in ${sdk.dir}/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the ProGuard
+# include property in project.properties.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
diff --git a/love2dToAPK/tools/tools/android-win/tools/source.properties b/love2dToAPK/tools/tools/android-win/tools/source.properties
new file mode 100644
index 0000000..0be07dc
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/source.properties
@@ -0,0 +1,3 @@
+Pkg.UserSrc=false
+Pkg.Revision=24.3.3
+Platform.MinPlatformToolsRev=20
diff --git a/love2dToAPK/tools/tools/android-win/tools/support/annotations.jar b/love2dToAPK/tools/tools/android-win/tools/support/annotations.jar
new file mode 100644
index 0000000..15898d1
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/support/annotations.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/support/typos-de.txt b/love2dToAPK/tools/tools/android-win/tools/support/typos-de.txt
new file mode 100644
index 0000000..5bcdffc
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/support/typos-de.txt
@@ -0,0 +1,2219 @@
+# This file contains a number of common German typos:
+andriod->android
+
+# The remainder of this file contains misspellings from
+# http://de.m.wikipedia.org/wiki/Wikipedia:Liste_von_Tippfehlern/F%C3%BCr_Maschinen
+# plus some post-processing to fix invalid entries, remove duplicates, etc.
+#
+# The content is available under the
+# "Creative Commons Attribution-ShareAlike License"
+# http://creativecommons.org/licenses/by-sa/3.0/
+#
+# THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
+# COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
+# COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
+# AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
+#
+# BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
+# TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY
+# BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS
+# CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
+# CONDITIONS.
+#
+# *1. Definitions*
+#
+# 1. *"Adaptation"* means a work based upon the Work, or upon the Work
+# and other pre-existing works, such as a translation, adaptation,
+# derivative work, arrangement of music or other alterations of a
+# literary or artistic work, or phonogram or performance and includes
+# cinematographic adaptations or any other form in which the Work may
+# be recast, transformed, or adapted including in any form
+# recognizably derived from the original, except that a work that
+# constitutes a Collection will not be considered an Adaptation for
+# the purpose of this License. For the avoidance of doubt, where the
+# Work is a musical work, performance or phonogram, the
+# synchronization of the Work in timed-relation with a moving image
+# ("synching") will be considered an Adaptation for the purpose of
+# this License.
+# 2. *"Collection"* means a collection of literary or artistic works,
+# such as encyclopedias and anthologies, or performances, phonograms
+# or broadcasts, or other works or subject matter other than works
+# listed in Section 1(f) below, which, by reason of the selection and
+# arrangement of their contents, constitute intellectual creations, in
+# which the Work is included in its entirety in unmodified form along
+# with one or more other contributions, each constituting separate and
+# independent works in themselves, which together are assembled into a
+# collective whole. A work that constitutes a Collection will not be
+# considered an Adaptation (as defined below) for the purposes of this
+# License.
+# 3. *"Creative Commons Compatible License"* means a license that is
+# listed at http://creativecommons.org/compatiblelicenses that has
+# been approved by Creative Commons as being essentially equivalent to
+# this License, including, at a minimum, because that license: (i)
+# contains terms that have the same purpose, meaning and effect as the
+# License Elements of this License; and, (ii) explicitly permits the
+# relicensing of adaptations of works made available under that
+# license under this License or a Creative Commons jurisdiction
+# license with the same License Elements as this License.
+# 4. *"Distribute"* means to make available to the public the original
+# and copies of the Work or Adaptation, as appropriate, through sale
+# or other transfer of ownership.
+# 5. *"License Elements"* means the following high-level license
+# attributes as selected by Licensor and indicated in the title of
+# this License: Attribution, ShareAlike.
+# 6. *"Licensor"* means the individual, individuals, entity or entities
+# that offer(s) the Work under the terms of this License.
+# 7. *"Original Author"* means, in the case of a literary or artistic
+# work, the individual, individuals, entity or entities who created
+# the Work or if no individual or entity can be identified, the
+# publisher; and in addition (i) in the case of a performance the
+# actors, singers, musicians, dancers, and other persons who act,
+# sing, deliver, declaim, play in, interpret or otherwise perform
+# literary or artistic works or expressions of folklore; (ii) in the
+# case of a phonogram the producer being the person or legal entity
+# who first fixes the sounds of a performance or other sounds; and,
+# (iii) in the case of broadcasts, the organization that transmits the
+# broadcast.
+# 8. *"Work"* means the literary and/or artistic work offered under the
+# terms of this License including without limitation any production in
+# the literary, scientific and artistic domain, whatever may be the
+# mode or form of its expression including digital form, such as a
+# book, pamphlet and other writing; a lecture, address, sermon or
+# other work of the same nature; a dramatic or dramatico-musical work;
+# a choreographic work or entertainment in dumb show; a musical
+# composition with or without words; a cinematographic work to which
+# are assimilated works expressed by a process analogous to
+# cinematography; a work of drawing, painting, architecture,
+# sculpture, engraving or lithography; a photographic work to which
+# are assimilated works expressed by a process analogous to
+# photography; a work of applied art; an illustration, map, plan,
+# sketch or three-dimensional work relative to geography, topography,
+# architecture or science; a performance; a broadcast; a phonogram; a
+# compilation of data to the extent it is protected as a copyrightable
+# work; or a work performed by a variety or circus performer to the
+# extent it is not otherwise considered a literary or artistic work.
+# 9. *"You"* means an individual or entity exercising rights under this
+# License who has not previously violated the terms of this License
+# with respect to the Work, or who has received express permission
+# from the Licensor to exercise rights under this License despite a
+# previous violation.
+# 10. *"Publicly Perform"* means to perform public recitations of the Work
+# and to communicate to the public those public recitations, by any
+# means or process, including by wire or wireless means or public
+# digital performances; to make available to the public Works in such
+# a way that members of the public may access these Works from a place
+# and at a place individually chosen by them; to perform the Work to
+# the public by any means or process and the communication to the
+# public of the performances of the Work, including by public digital
+# performance; to broadcast and rebroadcast the Work by any means
+# including signs, sounds or images.
+# 11. *"Reproduce"* means to make copies of the Work by any means
+# including without limitation by sound or visual recordings and the
+# right of fixation and reproducing fixations of the Work, including
+# storage of a protected performance or phonogram in digital form or
+# other electronic medium.
+#
+# *2. Fair Dealing Rights.* Nothing in this License is intended to reduce,
+# limit, or restrict any uses free from copyright or rights arising from
+# limitations or exceptions that are provided for in connection with the
+# copyright protection under copyright law or other applicable laws.
+#
+# *3. License Grant.* Subject to the terms and conditions of this License,
+# Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
+# perpetual (for the duration of the applicable copyright) license to
+# exercise the rights in the Work as stated below:
+#
+# 1. to Reproduce the Work, to incorporate the Work into one or more
+# Collections, and to Reproduce the Work as incorporated in the
+# Collections;
+# 2. to create and Reproduce Adaptations provided that any such
+# Adaptation, including any translation in any medium, takes
+# reasonable steps to clearly label, demarcate or otherwise identify
+# that changes were made to the original Work. For example, a
+# translation could be marked "The original work was translated from
+# English to Spanish," or a modification could indicate "The original
+# work has been modified.";
+# 3. to Distribute and Publicly Perform the Work including as
+# incorporated in Collections; and,
+# 4. to Distribute and Publicly Perform Adaptations.
+# 5.
+#
+# For the avoidance of doubt:
+#
+# 1. *Non-waivable Compulsory License Schemes*. In those
+# jurisdictions in which the right to collect royalties through
+# any statutory or compulsory licensing scheme cannot be waived,
+# the Licensor reserves the exclusive right to collect such
+# royalties for any exercise by You of the rights granted under
+# this License;
+# 2. *Waivable Compulsory License Schemes*. In those jurisdictions in
+# which the right to collect royalties through any statutory or
+# compulsory licensing scheme can be waived, the Licensor waives
+# the exclusive right to collect such royalties for any exercise
+# by You of the rights granted under this License; and,
+# 3. *Voluntary License Schemes*. The Licensor waives the right to
+# collect royalties, whether individually or, in the event that
+# the Licensor is a member of a collecting society that
+# administers voluntary licensing schemes, via that society, from
+# any exercise by You of the rights granted under this License.
+#
+# The above rights may be exercised in all media and formats whether now
+# known or hereafter devised. The above rights include the right to make
+# such modifications as are technically necessary to exercise the rights
+# in other media and formats. Subject to Section 8(f), all rights not
+# expressly granted by Licensor are hereby reserved.
+#
+# *4. Restrictions.* The license granted in Section 3 above is expressly
+# made subject to and limited by the following restrictions:
+#
+# 1. You may Distribute or Publicly Perform the Work only under the terms
+# of this License. You must include a copy of, or the Uniform Resource
+# Identifier (URI) for, this License with every copy of the Work You
+# Distribute or Publicly Perform. You may not offer or impose any
+# terms on the Work that restrict the terms of this License or the
+# ability of the recipient of the Work to exercise the rights granted
+# to that recipient under the terms of the License. You may not
+# sublicense the Work. You must keep intact all notices that refer to
+# this License and to the disclaimer of warranties with every copy of
+# the Work You Distribute or Publicly Perform. When You Distribute or
+# Publicly Perform the Work, You may not impose any effective
+# technological measures on the Work that restrict the ability of a
+# recipient of the Work from You to exercise the rights granted to
+# that recipient under the terms of the License. This Section 4(a)
+# applies to the Work as incorporated in a Collection, but this does
+# not require the Collection apart from the Work itself to be made
+# subject to the terms of this License. If You create a Collection,
+# upon notice from any Licensor You must, to the extent practicable,
+# remove from the Collection any credit as required by Section 4(c),
+# as requested. If You create an Adaptation, upon notice from any
+# Licensor You must, to the extent practicable, remove from the
+# Adaptation any credit as required by Section 4(c), as requested.
+# 2. You may Distribute or Publicly Perform an Adaptation only under the
+# terms of: (i) this License; (ii) a later version of this License
+# with the same License Elements as this License; (iii) a Creative
+# Commons jurisdiction license (either this or a later license
+# version) that contains the same License Elements as this License
+# (e.g., Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons
+# Compatible License. If you license the Adaptation under one of the
+# licenses mentioned in (iv), you must comply with the terms of that
+# license. If you license the Adaptation under the terms of any of the
+# licenses mentioned in (i), (ii) or (iii) (the "Applicable License"),
+# you must comply with the terms of the Applicable License generally
+# and the following provisions: (I) You must include a copy of, or the
+# URI for, the Applicable License with every copy of each Adaptation
+# You Distribute or Publicly Perform; (II) You may not offer or impose
+# any terms on the Adaptation that restrict the terms of the
+# Applicable License or the ability of the recipient of the Adaptation
+# to exercise the rights granted to that recipient under the terms of
+# the Applicable License; (III) You must keep intact all notices that
+# refer to the Applicable License and to the disclaimer of warranties
+# with every copy of the Work as included in the Adaptation You
+# Distribute or Publicly Perform; (IV) when You Distribute or Publicly
+# Perform the Adaptation, You may not impose any effective
+# technological measures on the Adaptation that restrict the ability
+# of a recipient of the Adaptation from You to exercise the rights
+# granted to that recipient under the terms of the Applicable License.
+# This Section 4(b) applies to the Adaptation as incorporated in a
+# Collection, but this does not require the Collection apart from the
+# Adaptation itself to be made subject to the terms of the Applicable
+# License.
+# 3. If You Distribute, or Publicly Perform the Work or any Adaptations
+# or Collections, You must, unless a request has been made pursuant to
+# Section 4(a), keep intact all copyright notices for the Work and
+# provide, reasonable to the medium or means You are utilizing: (i)
+# the name of the Original Author (or pseudonym, if applicable) if
+# supplied, and/or if the Original Author and/or Licensor designate
+# another party or parties (e.g., a sponsor institute, publishing
+# entity, journal) for attribution ("Attribution Parties") in
+# Licensor's copyright notice, terms of service or by other reasonable
+# means, the name of such party or parties; (ii) the title of the Work
+# if supplied; (iii) to the extent reasonably practicable, the URI, if
+# any, that Licensor specifies to be associated with the Work, unless
+# such URI does not refer to the copyright notice or licensing
+# information for the Work; and (iv) , consistent with Ssection 3(b),
+# in the case of an Adaptation, a credit identifying the use of the
+# Work in the Adaptation (e.g., "French translation of the Work by
+# Original Author," or "Screenplay based on original Work by Original
+# Author"). The credit required by this Section 4(c) may be
+# implemented in any reasonable manner; provided, however, that in the
+# case of a Adaptation or Collection, at a minimum such credit will
+# appear, if a credit for all contributing authors of the Adaptation
+# or Collection appears, then as part of these credits and in a manner
+# at least as prominent as the credits for the other contributing
+# authors. For the avoidance of doubt, You may only use the credit
+# required by this Section for the purpose of attribution in the
+# manner set out above and, by exercising Your rights under this
+# License, You may not implicitly or explicitly assert or imply any
+# connection with, sponsorship or endorsement by the Original Author,
+# Licensor and/or Attribution Parties, as appropriate, of You or Your
+# use of the Work, without the separate, express prior written
+# permission of the Original Author, Licensor and/or Attribution Parties.
+# 4. Except as otherwise agreed in writing by the Licensor or as may be
+# otherwise permitted by applicable law, if You Reproduce, Distribute
+# or Publicly Perform the Work either by itself or as part of any
+# Adaptations or Collections, You must not distort, mutilate, modify
+# or take other derogatory action in relation to the Work which would
+# be prejudicial to the Original Author's honor or reputation.
+# Licensor agrees that in those jurisdictions (e.g. Japan), in which
+# any exercise of the right granted in Section 3(b) of this License
+# (the right to make Adaptations) would be deemed to be a distortion,
+# mutilation, modification or other derogatory action prejudicial to
+# the Original Author's honor and reputation, the Licensor will waive
+# or not assert, as appropriate, this Section, to the fullest extent
+# permitted by the applicable national law, to enable You to
+# reasonably exercise Your right under Section 3(b) of this License
+# (right to make Adaptations) but not otherwise.
+#
+# *5. Representations, Warranties and Disclaimer*
+#
+# UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
+# OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
+# KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
+# INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
+# LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
+# WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE
+# EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
+#
+# *6. Limitation on Liability.* EXCEPT TO THE EXTENT REQUIRED BY
+# APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL
+# THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY
+# DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF
+# LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+#
+# *7. Termination*
+#
+# 1. This License and the rights granted hereunder will terminate
+# automatically upon any breach by You of the terms of this License.
+# Individuals or entities who have received Adaptations or Collections
+# from You under this License, however, will not have their licenses
+# terminated provided such individuals or entities remain in full
+# compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will
+# survive any termination of this License.
+# 2. Subject to the above terms and conditions, the license granted here
+# is perpetual (for the duration of the applicable copyright in the
+# Work). Notwithstanding the above, Licensor reserves the right to
+# release the Work under different license terms or to stop
+# distributing the Work at any time; provided, however that any such
+# election will not serve to withdraw this License (or any other
+# license that has been, or is required to be, granted under the terms
+# of this License), and this License will continue in full force and
+# effect unless terminated as stated above.
+#
+# *8. Miscellaneous*
+#
+# 1. Each time You Distribute or Publicly Perform the Work or a
+# Collection, the Licensor offers to the recipient a license to the
+# Work on the same terms and conditions as the license granted to You
+# under this License.
+# 2. Each time You Distribute or Publicly Perform an Adaptation, Licensor
+# offers to the recipient a license to the original Work on the same
+# terms and conditions as the license granted to You under this License.
+# 3. If any provision of this License is invalid or unenforceable under
+# applicable law, it shall not affect the validity or enforceability
+# of the remainder of the terms of this License, and without further
+# action by the parties to this agreement, such provision shall be
+# reformed to the minimum extent necessary to make such provision
+# valid and enforceable.
+# 4. No term or provision of this License shall be deemed waived and no
+# breach consented to unless such waiver or consent shall be in
+# writing and signed by the party to be charged with such waiver or
+# consent.
+# 5. This License constitutes the entire agreement between the parties
+# with respect to the Work licensed here. There are no understandings,
+# agreements or representations with respect to the Work not specified
+# here. Licensor shall not be bound by any additional provisions that
+# may appear in any communication from You. This License may not be
+# modified without the mutual written agreement of the Licensor and You.
+# 6. The rights granted under, and the subject matter referenced, in this
+# License were drafted utilizing the terminology of the Berne
+# Convention for the Protection of Literary and Artistic Works (as
+# amended on September 28, 1979), the Rome Convention of 1961, the
+# WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms
+# Treaty of 1996 and the Universal Copyright Convention (as revised on
+# July 24, 1971). These rights and subject matter take effect in the
+# relevant jurisdiction in which the License terms are sought to be
+# enforced according to the corresponding provisions of the
+# implementation of those treaty provisions in the applicable national
+# law. If the standard suite of rights granted under applicable
+# copyright law includes additional rights not granted under this
+# License, such additional rights are deemed to be included in the
+# License; this License is not intended to restrict the license of any
+# rights under applicable law.
+Aaachen->Aachen
+aberufen->abgerufen
+abgekürtzt->abgekürzt
+abgeschloßen->abgeschlossen
+Abhängikeit->Abhängigkeit
+Abhängkeit->Abhängigkeit
+abolvieren->absolvieren
+abolviert->absolviert
+abschliessen->abschließen
+abschliessend->abschließend
+abschliessende->abschließende
+abschliessenden->abschließenden
+abschliessender->abschließender
+abschliesst->abschließt
+Absorbtion->Absorption
+abzuschliessen->abzuschließen
+achsial*->axial*
+achzig->achtzig
+Addresse->Adresse
+addressiert->adressiert
+Adjudant->Adjutant
+Aeropag->Areopag
+Aeropagos->Areopag
+afrz->afrz.
+agberufen->abgerufen
+Agendas->Agenden
+agerufen->abgerufen
+agraisch->agrarisch
+agressiv->aggressiv
+akkomodieren->akkommodieren
+Akkustik->Akustik
+akreditiert->akkreditiert
+Aktivitiäten->Aktivitäten
+Aktzeptanz->Akzeptanz
+alamiert->alarmiert
+aler->aller
+alerdings->allerdings
+Algorhitmus->Algorithmus
+Algoritmus->Algorithmus
+aliiert->alliiert
+allerding->allerdings
+allgmein->allgemein
+alliert->alliiert
+allredings->allerdings
+all zu->allzu
+Alstadt->Altstadt
+am einem->an einem,am einen
+amerikanich->amerikanisch
+amerikansch->amerikanisch
+amerkanisch->amerikanisch
+am seinem->an seinem
+Amtsitz->Amtssitz
+Amtsprache->Amtssprache
+Amtsprachen->Amtssprachen
+Anaesthesie->Anästhesie
+Analen->Annalen
+anderere->andere
+andereren->anderen
+andererer->anderer
+andereseits->andererseits
+anders herum->andersherum
+andersrum->besser: andersherum
+angelsächisch->angelsächsisch
+angelsächsiche->angelsächsische
+angelsächsichen->angelsächsischen
+angesehendsten->angesehensten
+anlaesslich->anlässlich
+anlaeßlich->anlässlich
+änlich->ähnlich
+annährend->annähernd
+Annährung->Annäherung
+Annektion->Annexion
+annerkannt->anerkannt
+annerkannte->anerkannte
+Annerkennung->Anerkennung
+annuliert->annulliert
+Annulierung->Annullierung
+Anordung->Anordnung
+Anschaung->Anschauung
+anschliessen->anschließen
+anschliessend->anschließend
+anschliessende->anschließende
+anschliessenden->anschließenden
+anschliessender->anschließender
+anschliessendes->anschließendes
+anschliesst->anschließt
+Anstoss->Anstoß
+anvisiert->angekündigt,avisiert
+Anwendund->Anwendung
+Anwort->Antwort
+Appartment*->Apartment*,Appartement*
+aquirieren->akquirieren
+Aquisition->Akquisition
+archälogische->archäologische
+archälogischen->archäologischen
+Archeologe->Archäologe
+Argentur*->Agentur*
+Arikel->Artikel
+arithmetrisch->arithmetisch
+Artzt->Arzt
+assozial->asozial
+asymetrisch*->asymmetrisch*
+Atacke->Attacke
+atackieren->attackieren
+atakieren->attackieren
+Athleth*->Athlet*
+Athmosphäre*->Atmosphäre*
+athmosphärisch*->atmosphärisch*
+Atrappe->Attrappe
+attakieren->attackieren
+Aufällig->Auffällig
+Aufassung->Auffassung
+Aufassungen->Auffassungen
+auf dem ersten Blick->auf den ersten Blick
+auf eigenem Wunsch->auf eigenen Wunsch,aus eigenem Wunsch
+Aufenhalt->Aufenthalt
+Aufname->Aufnahme
+Auforderung->Aufforderung
+aufrecht erhält->aufrechterhält
+aufrecht erhalten->aufrechterhalten
+aufrecht erhielt->aufrechterhielt
+aufrecht zu erhalten->aufrechtzuerhalten
+Aufsteig->Aufstieg
+Auftieg->Aufstieg
+auftretenen->auftretenden
+auftretten->auftreten
+Augenlied->Augenlid
+augenommen->aufgenommen,ausgenommen
+auml->Ä,ä
+Ausage->Aussage
+Ausagen->Aussagen
+auschliesslich->ausschließlich
+auschließlich->ausschließlich
+auschliessliche->ausschließliche
+auschliesslichen->ausschließlichen
+Auseinadersetzung->Auseinandersetzung
+Auseindersetzung->Auseinandersetzung
+auserdem->außerdem
+auserhalb->außerhalb
+Ausgangpunkt->Ausgangspunkt
+ausgeschalten->ausgeschaltet
+Ausicht->Aussicht
+Ausmass->Ausmaß
+Ausprache->Aussprache
+Auspruch->Ausspruch
+ausschliessen->ausschließen
+ausschliesslich->ausschließlich
+ausschliesst->ausschließt
+Ausschwitz->Auschwitz
+aussen->außen
+Aussenminister->Außenminister
+ausser->außer
+ausserdem->außerdem
+äussere->äußere
+äusseren->äußeren
+äusserer->äußerer
+äusseres->äußeres
+aussergewöhnlich->außergewöhnlich
+aussergewöhnlichen->außergewöhnlichen
+ausserhalb->außerhalb
+ausserirdisch->außerirdisch
+ausserirdische->außerirdische
+ausserirdischen->außerirdischen
+äussern->äußern
+ausserordentlich->außerordentlich
+ausserordentliche->außerordentliche
+ausserordentlichem->außerordentlichem
+ausserordentlichen->außerordentlichen
+ausserordentlicher->außerordentlicher
+ausserordentliches->außerordentliches
+äusserst->äußerst
+äusserste->äußerste
+äussersten->äußersten
+äusserte->äußerte
+äusserten->äußerten
+Äusserung->Äußerung
+Äusserungen->Äußerungen
+aussschliesslich->ausschließlich
+aussschließlich->ausschließlich
+außschließlich->ausschließlich
+Austattung->Ausstattung
+Austellung->Ausstellung
+Austellungen->Ausstellungen
+Austerben->Aussterben
+Auszeichung->Auszeichnung
+Auszeichungen->Auszeichnungen
+auszuschliessen->auszuschließen
+Author des->Autor des
+authorisieren->autorisieren
+authorisiert->autorisiert
+Authorisierung*->Autorisierung*
+Authorität->Autorität
+dem Autoren->dem Autor
+des Autoren->des Autors
+vom Autoren->vom Autor
+Babies->Babys
+bafand->befand
+Balett->Ballett
+bassierend->basierend
+Batallion->Bataillon
+Battaillon->Bataillon
+Battallion->Bataillon
+Bauerhof->Bauernhof
+Bauerhöfe->Bauernhöfe
+bedeudend->bedeutend
+bedeudende->bedeutende
+bedeudenden->bedeutenden
+bedeudender->bedeutender
+bedeudendes->bedeutendes
+bedeudet->bedeutet
+bedeudete->bedeutete
+bedeutendeste->bedeutendste
+bedeutenste->bedeutendste
+bedeutensten->bedeutendsten
+bedeutenster->bedeutendster
+bedeutenstes->bedeutendstes
+bedeutesten->bedeutendsten
+Bedinung->Bedingung/Bedienung
+Bedürfniss->Bedürfnis
+beeinflußen->beeinflussen
+Beeinflußung->Beeinflussung
+beeinhalten->beinhalten
+beeinhaltet->beinhaltet
+befindet auf->befindet sich auf
+befindet ein*->befindet sich ein*
+befindet in->befindet sich in
+begang->beging,begann
+beherrbergt->beherbergt
+beherschen->beherrschen
+beherscht->beherrscht
+beherschte->beherrschte
+beidemale->beide Male
+beim dem->bei dem,beim
+beim der->bei der,beim,bei dem
+beindrucken->beeindrucken
+beinflussen->beeinflussen
+beinflusst*->beeinflusst*
+Beipiel*->Beispiel*
+Beispeil*->Beispiel*
+beispielswiese->beispielsweise
+beispielweise->beispielsweise
+Beitag->Beitrag
+bekammen->bekamen
+Bekenntniss->Bekenntnis
+Benefitz->Benefiz
+bennant->benannt
+Bennenung->Benennung
+Berechung->Berechnung
+bereit gehalten->bereitgehalten
+bereit gestellt->bereitgestellt
+bereit hält->bereithält
+bereit stand->bereitstand
+bereit stehen->bereitstehen
+bereit steht->bereitsteht
+bereit stellt->bereitstellt
+bereit zu halten->bereitzuhalten
+bereit zu stellen->bereitzustellen
+Berfung->Berufung
+Berreich->Bereich
+berücksichtig->berücksichtigt
+berümt->berühmt
+berümte->berühmte
+besass->besaß
+besassen->besaßen
+besitzten->besitzen
+Bespiel->Beispiel
+Bestandsteil->Bestandteil
+Bestandtteil->Bestandteil
+bestbezahltest*->bestbezahlt*
+bestimmmt->bestimmt
+bestreitete->bestritt
+Betreung->Betreuung
+Betriebsystem*->Betriebssystem*
+Bevökerung->Bevölkerung
+Beweiß->Beweis
+bezeichent->bezeichnet
+bezeichet->bezeichnet
+Bezeichung*->Bezeichnung*
+Biograpfie->Biografie
+bischen->bisschen
+Bischofsitz->Bischofssitz
+Bisquit->Biskuit
+bloss->bloß
+blosse->bloße
+blossen->bloßen
+blosser->bloßer
+blosses->bloßes
+an Board->an Bord
+on Bord->an Bord
+bombadieren->bombardieren
+bombadiert->bombardiert
+Bombadierung->Bombardierung
+boolsch->boolesch
+brilliant->brillant
+britsch->britisch
+britsche->britische
+britschen->britischen
+britscher->britischer
+britsches->britisches
+Bronzemedaillie*->Bronzemedaille*
+Bronzemedallie*->Bronzemedaille*
+Bügermeister->Bürgermeister
+Bundesaussenminister->Bundesaußenminister
+Bundesstrasse->Bundesstraße
+Bundestaat*->Bundesstaat*
+Bundestraße->Bundesstraße
+Bundsandstein*->Buntsandstein*
+byzantisch*->byzantinisch*
+chinesiche->chinesische
+chinesichen->chinesischen
+chinesicher->chinesischer
+Chirugie->Chirurgie
+Chonik->Chronik
+Chonist->Chronist
+chonologisch->chronologisch
+cirka->zirka,circa
+dadruch->dadurch
+daduch->dadurch
+danaben->daneben
+danch->danach
+dannach->danach
+deuten daraufhin->deuten darauf hin
+deutet daraufhin->deutet darauf hin
+weisen daraufhin->weisen darauf hin
+weist daraufhin->weist darauf hin
+darüberhinaus->darüber hinaus
+daruf->darauf
+darufhin->daraufhin
+das es sich bei->dass es sich bei
+das es sich um->dass es sich um
+so das der->so dass der
+so das die->so dass die
+so das er->so dass er
+so das sie->so dass sie
+dass heißt->das heißt
+dastellt->darstellt
+dazu gehörige*->dazugehörige*
+Debutalbum->Debütalbum
+Definiton->Definition
+definitv->definitiv
+Defintion->Definition
+deligiert->delegiert
+dem selben->demselben
+denoch->dennoch
+den selben->denselben
+derem->deren
+der Niederlanden->der Niederlande,den Niederlanden
+der selbe->derselbe
+der selben->derselben
+in der USA->in den USA
+des des->des
+des eines->eines,des,der eines,dem eines
+des selben->desselben
+dessem->dessen
+desshalb->deshalb
+desweiteren->des Weiteren
+desweitern->des Weiteren
+des Weitern->des Weiteren
+detailiert*->detailliert*
+detalliert->detailliert
+dezeit->derzeit
+Dezmber->Dezember
+die selbe->dieselbe
+die selben->dieselben
+Differentation->Differentiation
+Dikator->Diktator
+Dikatur->Diktatur
+Diphterie->Diphtherie
+Diphtong->Diphthong
+Dirgent->Dirigent
+Discografie->Diskografie
+Discographie->Diskographie
+diskreminieren->diskriminieren
+diskrimierend*->diskriminierend*
+Diskrimierung*->Diskriminierung*
+Diskusion->Diskussion
+Disseration->Dissertation
+Divison*->Division*
+Divsion*->Division*
+Diziplin*->Disziplin*
+Dollmetscher->Dolmetscher
+dort hin->dorthin
+draufhin->daraufhin
+draussen->draußen
+Dreick->Dreieck
+dreissig->dreißig
+dreissiger->dreißiger
+druch->durch
+druchgeführt->durchgeführt
+duch->durch
+duchführen->durchführen
+Duchführung->Durchführung
+duchgeführt->durchgeführt
+Duchschnitt->Durchschnitt
+durch geführt->durchgeführt
+Durchschlagkraft->Durchschlagskraft
+Durchsetztung->Durchsetzung
+durchstossen->durchstoßen
+Durschnitt->Durchschnitt
+durschnittlich->durchschnittlich
+durschnittliche->durchschnittliche
+durschnittlichen->durchschnittlichen
+ebefalls->ebenfalls
+eben dies->ebendies
+eben diese->ebendiese
+eben diesem->ebendiesem
+eben diesen->ebendiesen
+eben dieser->ebendieser
+eben dieses->ebendieses
+ebendso->ebenso
+ebenfall->ebenfalls
+ebenfals->ebenfalls
+Editon->Edition
+Edtion->Edition
+einem eigenem->einem eigenen
+ihrem eigenem->ihrem eigenen
+seinem eigenem->seinem eigenen
+eigenen sich->eignen sich
+mit einen->mit einem
+eines des->eines der
+Einflüße->Einflüsse
+Einfuss->Einfluss
+einge->einige
+eingen->einigen
+eingentlich->eigentlich
+einger->einiger
+einges->einiges
+eingesetz->eingesetzt
+eingesetzen->eingesetzten
+einigemal->einige Mal
+einklich->eigentlich
+Einordung->Einordnung
+einschliessen->einschließen
+einschliesslich->einschließlich
+einschliesst->einschließt
+einzelen->einzelne
+einzigste->einzige
+einzigster->einziger
+einzigstes->einziges
+ekklektizistisch->eklektizistisch
+ekstasisch->ekstatisch
+elekrisch->elektrisch
+elekronisch->elektronisch
+eleminieren->eliminieren
+eleminiert->eliminiert
+emigiert->emigriert
+emigiriert->emigriert
+Emmigrant->Emigrant
+Emmigration->Emigration
+emmigriert->emigriert
+emprisch->empirisch
+Emsemble->Ensemble
+endeckt->entdeckt
+endeckte->entdeckte
+Endeckung*->Entdeckung*
+enfernt->entfernt
+enfernte->entfernte
+Enfernung->Entfernung
+Enfernungen->Entfernungen
+Engeneering->Engineering
+englsich->englisch
+engültig->endgültig
+enhält->enthält
+enhalten->enthalten
+Enscheidung->Entscheidung
+enstand->entstand
+enstanden->entstanden
+enstehen->entstehen
+ensteht->entsteht
+Enstehung->Entstehung
+entgegen gebracht*->entgegengebracht*
+entgegen gesetzt*->entgegengesetzt*
+entgegen kam->entgegenkam
+entgegen nahm->entgegennahm
+entgegen zu gehen->entgegenzugehen
+entgegen zu kommen->entgegenzukommen
+entgegen zu nehmen->entgegenzunehmen
+entgegen zu schleudern->entgegenzuschleudern
+entgegen zu setzen->entgegenzusetzen
+entgegen zu stellen->entgegenzustellen
+entgegen zu treten->entgegenzutreten
+entgegen zu wirken->entgegenzuwirken
+Entgeld->Entgelt
+entgültig*->endgültig*
+entlang führt*->entlangführt*
+entlang geführt*->entlanggeführt*
+entprechend->entsprechend
+entprechende->entsprechende
+entprechender->entsprechender
+entsant->entsandt
+entscheidene*->entscheidende*
+entscheident->entscheidend
+entschloß->entschloss
+entspechen*->entsprechen*
+entsprechene->entsprechende
+entsprechenen->entsprechenden
+entstandt->entstand
+enwickelt->entwickelt
+enwickelte->entwickelte
+enwickelten->entwickelten
+enwickelter->entwickelter
+enwickeltes->entwickeltes
+Enwicklung->Entwicklung
+Enwicklungen->Entwicklungen
+ereichen->erreichen
+ereicht->erreicht
+ereichte->erreichte
+Ereignise->Ereignisse
+Ereignisen->Ereignissen
+Ereigniss->Ereignis
+Erfog->Erfolg
+erfogreich->erfolgreich
+erfolgslos->erfolglos
+erfolgsversprechend->erfolgversprechend
+Erfurcht->Ehrfurcht
+Ergebniss->Ergebnis
+Erkentnis->Erkenntnis
+Erkentnisse->Erkenntnisse
+erklährt->erklärt
+ermöglich->ermöglicht,ermöglichen
+erorbert->erobert
+errinnern->erinnern
+errinnert->erinnert
+errreichen->erreichen
+errreicht->erreicht
+errreichte->erreichte
+errrichtet->errichtet
+ersmals->erstmals
+dem erstem->dem ersten
+im erstem->im ersten
+erzeilt->erzielt
+erzeilte->erzielte
+erziehlen->erzielen
+erziehlt->erzielt
+estisch->estnisch
+Ettikett*->Etikett*
+dem europäischem->dem europäischen
+im europäischem->im europäischen
+Examplar->Exemplar
+examplarisch->exemplarisch
+exellent->exzellent
+exisitiert->existiert
+Existens->Existenz
+Expediton->Expedition
+experimentiell->experimentell
+Extase->Ekstase
+Fahradtour->Fahrradtour
+fälschlicher Weise->fälschlicherweise
+familär*->familiär*
+Famile->Familie
+Familen*->Familien*
+Famlie*->Familie*
+Februrar->Februar
+Feburar->Februar
+fern geblieben->ferngeblieben
+fern gehalten->ferngehalten
+fern zu halten->fernzuhalten
+Fersehen->Fernsehen
+Ferseh*->Fernseh*
+fertigestellt->fertiggestellt
+festellen->feststellen
+Festellung->Feststellung
+fidet->findet
+Fiedrich->Friedrich
+Flagschiff->Flaggschiff
+Flektion->Flexion
+fliessen->fließen
+fliesst->fließt
+des Flughafen->des Flughafens
+Fluß->Fluss
+Flüße->Flüsse
+fokusieren->fokussieren
+fokusiert->fokussiert
+Fokusierung->Fokussierung
+Foschung->Forschung
+Fotographie->Fotografie,Photographie
+Fotographien->Fotografien,Photographien
+fotographiert->fotografiert
+franösisch*->französisch*
+frantösisch*->französisch*
+franzöisch*->französisch*
+französich*->französisch*
+dem französischem->dem französischen
+einem französischem->einem französischen
+im französischem->im französischen
+Freidrich->Friedrich
+frei gestellt->freigestellt
+Freimauerei->Freimaurerei
+Fremsprache->Fremdsprache
+Friedenschluss->Friedensschluss
+Friedich->Friedrich
+Frima->Firma
+fröhnen->frönen
+Frühjar->Frühjahr
+frühre->frühere
+fuer->für
+füher*->früher*,Führer*
+Fuktion*->Funktion*
+Funier*->Furnier*
+für für->für
+Fuss->Fuß
+Fussball->Fußball
+Fussballer->Fußballer
+Fussballerin->Fußballerin
+Fussballspieler->Fußballspieler
+Fussballspielerin->Fußballspielerin
+Fußballstadium->Fußballstadion
+Fusse->Fuße
+Füsse->Füße
+Füst->Fürst
+gabe es->gab es
+Gallerie->Galerie
+Gallerien->Galerien
+Gallionsfigur->Galionsfigur
+garnicht->gar nicht
+Garnision->Garnison
+Garnision*->Garnison*
+Gebäde->Gebäude
+Gebahren->Gebaren
+gebähren->gebären
+Gebaüde->Gebäude
+Gebaude->Gebäude
+Gebäuder->Gebäude
+gebornen->geborenen
+Gedult->Geduld
+Gedänk*->Gedenk*
+einem geeignetem->einem geeigneten
+Gefäss->Gefäß
+gegebenfalls->gegebenenfalls
+gegen einander->gegeneinander
+gegenüber gestellt->gegenübergestellt
+gegn->gegen
+gegnüber->gegenüber
+gehöhren->gehören
+gehöhrt*->gehört*
+gekührt->gekürt
+gelanden->geladen
+gemäss->gemäß
+gemeinsammen->gemeinsamen
+gemeisam->gemeinsam
+genant->genannt
+genanten->genannten
+Genaral*->General*
+geniessen->genießen
+gennant*->genannt*
+gennannt*->genannt*
+Gerneral*->General*
+gesäht->gesät
+gesammt->gesamt
+gesammten->gesamten
+gesammter->gesamter
+Gesandschaft*->Gesandtschaft*
+Geschichtschreiber->Geschichtsschreiber
+Geschichtschreibung->Geschichtsschreibung
+geschiet->geschieht
+geschlosssen->geschlossen
+gesetztlich->gesetzlich
+Gesichtpunkt->Gesichtspunkt
+gesponsort->gesponsert
+gesteift->gestreift
+gewan->gewann
+gewissermassen->gewissermaßen
+gewunken->gewinkt
+Ghandi->Gandhi
+giebt->gibt
+Giessen->Gießen
+gleichbleiben->gleich bleiben
+gleich zu tun->gleichzutun
+Gogle->Google
+Goldmedaillie*->Goldmedaille*
+Goldmedallie*->Goldmedaille*
+Gothik->Gotik
+gothisch->gotisch
+Grabmahl->Grabmal
+Gradwanderung->Gratwanderung
+Graftschaft*->Grafschaft*
+groesse->größe
+groeße->größe
+gröhlen->grölen
+Grossaufgebot->Großaufgebot
+Grossbritanien->Großbritannien
+Großbritanien->Großbritannien
+Grossbritannien->Großbritannien
+Grossbrittanien->Großbritannien
+Großbrittanien->Großbritannien
+Grossbrittannien->Großbritannien
+Großbrittannien->Großbritannien
+grosse->große
+grösse->größe
+grossem->großem
+einem großem->einem großen
+grossen->großen
+grossenteils->großenteils
+größenteils->größtenteils
+grosser->großer
+grösser->größer
+grössere->größere
+grösserem->größerem
+grösseren->größeren
+grösserer->größerer
+grösseres->größeres
+grosses->großes
+grösste->größte
+Grossteil->Großteil
+grossteils->großteils
+grössten->größten
+grösstenteils->größtenteils
+grösster->größter
+grösstes->größtes
+Gründstück*->Grundstück*
+einem grünem->einem grünen
+Guerrillakampf->Guerillakampf
+Guiness->Guinness
+Guiseppe->Giuseppe
+einem gutem->einem guten
+Güterloh*->Gütersloh*
+Häckchen->Häkchen
+haetten->hätten
+Handelschiff->Handelsschiff
+Handies->Handys
+hahnebüchen->hanebüchen
+hattte->hatte,hatten
+Haupstadt->Hauptstadt
+haupsächlich->hauptsächlich
+Haupstädte->Hauptstädte
+des Haus->des Hauses
+heiratetet->heiratet
+heiss->heiß
+heisser->heißer
+heisst->heißt
+heraus gebracht->herausgebracht
+herausragenste->herausragendste
+Herausvorderung->Herausforderung
+herraus->heraus
+herrausragend->herausragend
+Herrrschaft->Herrschaft
+Herrrscher->Herrscher
+Herschaft->Herrschaft
+Herscher->Herrscher
+hervoragen->hervorragen
+hervoragend->hervorragend
+hervor gegangen*->hervorgegangen*
+hervor ging->hervorging
+hervorragenste->hervorragendste
+Hierachie->Hierarchie
+hierachisch->hierarchisch
+hiess->hieß
+hinaus gehende*->hinausgehende*
+hingegegen->hingegen
+Hintegrund->Hintergrund
+Hintergund->Hintergrund
+hinterliess->hinterließ
+hinterliessen->hinterließen
+hinweg täuschen->hinwegtäuschen
+hinzu gefügt*->hinzugefügt*
+hinzu gekommen*->hinzugekommen*
+Hobbies->Hobbys
+Hochaus->Hochhaus
+Hochäuser->Hochhäuser
+höchst gelegene*->höchstgelegene*
+Hofffnung->Hoffnung
+Hoffung->Hoffnung
+höherere*->höhere*
+höherwertigere*->höherwertige*
+höhren->hören,höheren
+höhrt->hört
+Homage->Hommage
+hunderste*->hundertste*
+idendifiziert->identifiziert
+idenfiziert->identifiziert
+idiopatisch->idiopathisch
+im besonderen Maße->in besonderem Maße
+im Bezug auf->in Bezug auf
+Imbus->Inbus
+im dem->in dem,im
+im den->in den,in dem,ihm den
+im der->in der,im,ihm der
+im deutschsprachigem->im deutschsprachigen
+im einem->in einem
+im großem->in großem,im großen
+im großen Umfang->in großem Umfang
+im hohen Maße->in hohem Maße
+immernoch->immer noch
+immmer->immer
+Impendanz->Impedanz
+im seinem->in seinem
+im selbem->im selben
+inbesondere->insbesondere
+inclusive->inklusive
+Independet->Independent
+indeß->indes
+individiuell->individuell
+Industie->Industrie
+Industriealisierung->Industrialisierung
+in englisch->in Englisch
+inerhalb->innerhalb
+Infantrie->Infanterie
+infiszieren->infizieren
+in Folge->infolge
+in Folge der->infolge der
+in Folge des->infolge des
+in Folge einer->infolge einer
+in Folge eines->infolge eines
+in Folge von->infolge von
+in Folge dessen->infolgedessen,infolge dessen,in dessen Folge
+Ingeneur->Ingenieur
+ingesamt->insgesamt
+Ingredenzien->Ingredienzien
+Inhaltstoff->Inhaltsstoff
+Initation->Initiation,Imitation
+Initative->Initiative
+Initator->Initiator
+Initialie->Initiale
+Initialien->Initialen
+initieren->initiieren
+initiert->initiiert
+Inititative->Initiative
+Iniziative->Initiative
+in mitten->inmitten
+inne gehabt->innegehabt
+inne haben->innehaben
+inne hat->innehat
+inne hatte->innehatte
+inne hatten->innehatten
+Innenaustattung->Innenausstattung
+innnerhalb->innerhalb
+Insbruck->Innsbruck
+in selben Jahr->im selben Jahr
+insgeamt->insgesamt
+insgesammt->insgesamt
+Insitut->Institut
+Insitution->Institution
+in so fern->insofern
+in sofern->insofern
+instandgehalten->instand gehalten,in Stand gehalten
+instandgesetzt->instand gesetzt,in Stand gesetzt
+instandhalten->instand halten,in Stand halten
+instandsetzen->instand setzen,in Stand setzen
+instandzusetzen->instand zu setzen,in Stand zu setzen
+Instituion->Institution
+Instiut->Institut
+Instiution->Institution
+Instutition*->Institution*
+inszinieren->inszenieren
+Inszinierung->Inszenierung
+integiert->integriert
+intelektuell*->intellektuell*
+intenational->international
+intepretiert->interpretiert
+Interese->Interesse
+interesiert->interessiert
+Intergration->Integration
+intergriert->integriert
+Internetpräsens->Internetpräsenz
+interresiert->interessiert
+Interresse->Interesse
+interressiert->interessiert
+Intiative->Initiative
+intressiert->interessiert
+Intrument*->Instrument*
+Inverstor->Investor
+in wie weit->inwieweit
+in wieweit->inwieweit
+inwischen->inzwischen
+irgend ein->irgendein
+irgend eine->irgendeine
+irgend einem->irgendeinem
+irgend einen->irgendeinen
+irgend einer->irgendeiner
+irgend eines->irgendeines
+irgentwie->irgendwie
+irrtümlicher Weise->irrtümlicherweise
+ist meis->ist meist
+ist meisten->ist meistens
+italenisch->italienisch
+italiensch->italienisch
+italiensich->italienisch
+Jägerbatallion->Jägerbataillon
+Jahhundert->Jahrhundert
+Jahhunderte->Jahrhunderte
+Jahhunderts->Jahrhunderts
+des Jahre->des Jahres
+Jahrhudert->Jahrhundert
+Jahrhunder->Jahrhundert
+Jahrundert->Jahrhundert
+Jahrunderte->Jahrhunderte
+Jahrunderts->Jahrhunderts
+Jahrzent->Jahrzehnt
+Jahrzente->Jahrzehnte
+Jahundert->Jahrhundert
+Jahunderte->Jahrhunderte
+Jahunderts->Jahrhunderts
+Jäner->Jänner
+Janur->Januar
+Jarh->Jahr
+Jarhundert->Jahrhundert
+Jarhunderte->Jahrhunderte
+Jarhunderts->Jahrhunderts
+jdoch->jedoch
+jedch->jedoch
+jeoch->jedoch
+jeodch->jedoch
+jeweil->jeweils
+jeweis->jeweils
+Jounalist->Journalist
+Jubiliäum->Jubiläum
+Jungend*->Jugend*
+Justitz->Justiz
+Kabaret->Kabarett
+Kaiserlautern->Kaiserslautern
+Kandidad->Kandidat
+Kanditat->Kandidat
+Kappelle->Kapelle
+Karierre->Karriere
+Karrikaturist->Karikaturist
+karrikieren->karikieren
+Kasette*->Kassette*
+kathegorisch->kategorisch
+Kenntnise->Kenntnis
+Kenntniss->Kenntnis
+Kennzeichnug->Kennzeichnung
+Kentnis->Kenntnis
+Kentnisse->Kenntnisse
+Kirchtum->Kirchturm
+klassich->klassisch
+klassiche->klassische
+klassichen->klassischen
+klassicher->klassischer
+Klink->Klinik
+des Kloster->des Klosters
+km2->km²
+kmh->km/h
+Kofession*->Konfession*
+Kollission*->Kollision*
+Kollonade->Kolonnade
+Komandant->Kommandant
+Komandanten->Kommandanten
+Komando->Kommando
+Komandos->Kommandos
+komerziell->kommerziell
+Komissar->Kommissar
+Komissariat->Kommissariat
+komissarisch->kommissarisch
+Komission->Kommission
+komlett->komplett
+Kommilitionen->Kommilitonen
+Kommision->Kommission
+Kommitee->Komitee
+Kommittee->Komitee
+kommmen->kommen
+Kommunkation->Kommunikation
+Kompentenz->Kompetenz
+Könföderierte->Konföderierte
+Konförderierte->Konföderierte
+könglich->königlich
+Köngreich->Königreich
+Königsreich->Königreich
+Königstum->Königtum
+Konkurenz*->Konkurrenz*
+konkurieren*->konkurrieren*
+konkuriert*->konkurriert*
+könnnen->können,Können
+Konservationslexikon->Konversationslexikon
+Kontak->Kontakt
+konte->konnte
+Kontigent*->Kontingent*
+konventionnell->konventionell
+korregieren->korrigieren
+korregiert->korrigiert
+Krankeit*->Krankheit*
+Krankenaus->Krankenhaus
+Kreuzug*->Kreuzung*,Kreuzzug*
+Kriche->Kirche
+Kriegschiff->Kriegsschiff
+kummulieren->kumulieren
+Kunsstoff*->Kunststoff*
+Kunstaustellung*->Kunstausstellung*
+Kunstoff->Kunststoff
+Kunstoffe->Kunststoffe
+Kurfüst*->Kurfürst*
+kurzeitig*->kurzzeitig*
+läd->lädt
+Landesaustellung->Landesausstellung
+Landesprache->Landessprache
+Landwirschaft->Landwirtschaft
+landwirschaftlich->landwirtschaftlich
+langläufig->landläufig
+Lapalie->Lappalie
+Lassithi->Lasithi
+läst->lässt
+lateinsch->lateinisch
+lateinsche->lateinische
+lateinschen->lateinischen
+lateinscher->lateinischer
+lateinsches->lateinisches
+Lebenstil->Lebensstil
+Lebenweise->Lebensweise
+legänder->legendär
+Leibzig->Leipzig
+Leichathlet*->Leichtathlet*
+Leichnahm->Leichnam
+letze->letzte
+letzem->letztem
+letzen->letzten
+letzendlich->letztendlich
+letzer->letzter
+letzere->letztere
+letzerem->letzterem
+letzeren->letzteren
+letzerer->letzterer
+letzeres->letzteres
+letzes->letztes
+letzlich->letztlich
+letztenendes->letzten Endes
+Lexikas->Lexika
+Liason->Liaison
+liess->ließ
+liesse->ließe
+liessen->ließen
+ließt->er/sie/es liest; ließ; fließt
+Lilliputaner->Liliputaner
+literaisch->literarisch
+literatisch->literarisch
+lizensieren->lizenzieren
+lizensiert->lizenziert
+lizensierte->lizenzierte
+lizensiertem->lizenziertem
+lizensierten->lizenzierten
+lizensierter->lizenzierter
+lizensiertes->lizenziertes
+Lizensierung->Lizenzierung
+los zu werden->loszuwerden
+Louisana->Louisiana
+Lousiana->Louisiana
+Luwig->Ludwig
+Lybien->Libyen
+lybisch->libysch
+lybische->libysche
+lybischem->libyschem
+lybischen->libyschen
+lybischer->libyscher
+lybisches->libysches
+machmal->manchmal
+Manhatan->Manhattan
+Manhatta->Manhattan
+Manhatten->Manhattan
+Manhetten->Manhattan
+Manschaft->Mannschaft
+Manmschaft->Mannschaft
+Mannhattan->Manhattan
+Mannöver->Manöver
+Mannschaf->Mannschaft
+Mannschaftt->Mannschaft
+Mannshcaft->Mannschaft
+Mansardach->Mansarddach
+Mansardendach->Mansarddach
+Mansnchaften->Mannschaft
+Manssarddach->Mansarddach
+marrokanisch*->marokkanisch*
+marrokkanisch*->marokkanisch*
+Marrokko->Marokko
+Marroko->Marokko
+Marylin->meist Marilyn
+Marytrium->Martyrium
+Märtyrium->Martyrium
+Maschiene->Maschine
+Maschienen->Maschinen
+mässig->mäßig
+mässige->mäßige
+mässigem->mäßigem
+mässigen->mäßigen
+mässiger->mäßiger
+mässiges->mäßiges
+Mass->Maß
+Massgabe->Maßgabe
+Massgaben->Maßgaben
+massgebend->maßgebend
+massgebende->maßgebende
+massgebendem->maßgebendem
+massgebenden->maßgebenden
+massgebender->maßgebender
+massgebendes->maßgebendes
+massgeblich->maßgeblich
+massgebliche->maßgebliche
+massgeblichem->maßgeblichem
+massgeblichen->maßgeblichen
+massgeblicher->maßgeblicher
+massgebliches->maßgebliches
+masslos->maßlos
+masslose->maßlose
+masslosen->maßlosen
+massloser->maßloser
+massloses->maßloses
+Massnahme->Maßnahme
+Massnahmen->Maßnahmen
+Matraze->Matratze
+Matritze->Matrize,Matrix
+Maximillian->meist Maximilian
+Medailie->Medaille
+Medaillie->Medaille
+Medailliengewinner->Medaillengewinner
+Medailliengewinnerin->Medaillengewinnerin
+Medallie->Medaille
+Medalliengewinner->Medaillengewinner
+Medalliengewinnerin->Medaillengewinnerin
+medizinsch->medizinisch
+medizisch->medizinisch
+medizische->medizinische
+medizischem->medizinischem
+medizischen->medizinischen
+medizischer->medizinischer
+medizisches->medizinisches
+Meerespiegel->Meeresspiegel
+Meeresspegel->Meeresspiegel
+mehere->mehrere
+meheren->mehreren
+meherer->mehrerer
+mehre->meist mehrere
+mehren->gelegentlich mehreren
+mehrer->häufig mehrerer,mehrere
+mehrerere->mehrere
+mehrtätige->mehrtägige
+meisst->meist
+meißt->meist
+meißten->meisten
+meißtens->meistens
+meistbesuchtesten->meistbesuchten
+meist gelesene*->meistgelesene*
+meist gesehene*->meistgesehene*
+meist gesuchte*->meistgesuchte*
+meits->meist
+mengemässig->mengenmäßig
+mengenmässig->mengenmäßig
+Mensche->Menschen
+Menscheit->Menschheit
+Menschens->Menschen
+Meßgerät->Messgerät
+Meßgeräte->Messgeräte
+Messystem->Messsystem
+Meßsystem->Messsystem
+Metallegierung->Metalllegierung
+Metereologe->Meteorologe
+Metereologie->Meteorologie
+metereologisch->meteorologisch
+Meterologie->Meteorologie
+meterologisch->meteorologisch
+Mettal->Metall
+mhd->mittelhochdeutsch
+Micheal->meist Michael
+Miglied->Mitglied
+Milionen->Millionen
+Militärdikatur->Militärdiktatur
+Millarde->Milliarde
+Millarden*->Milliarden*
+Millenium->Millennium
+Millione->Millionen
+Millitär->Militär
+millitärisch->militärisch
+eine Millionen->eine Million
+Millon->Million
+Millonen->Millionen
+Miltär->Militär
+miltärisch->militärisch
+Miltitär->Militär
+miltitärisch->militärisch
+minimalste->minimale
+minimalster->minimaler
+minimalstes->minimales
+Ministerpäsident->Ministerpräsident
+mit einander->miteinander
+Mitgleid->Mitglied
+mitlerweile->mittlerweile
+mittlerweilen->mittlerweile
+Mitlgiled->Mitglied
+Mitlied->Mitglied
+mit samt->mitsamt
+Mittelater->Mittelalter
+mittelaterlich->mittelalterlich
+mittelständige->mittelständische
+mittelständigen->mittelständischen
+mittelständiger->mittelständischer
+mittelständiges->mittelständisches
+Mitteralter->Mittelalter
+mitteralterlich->mittelalterlich
+Mitterand->Mitterrand
+Mittglied->Mitglied
+Mittschnitt->Mitschnitt
+mnachmal->manchmal
+Mobiletelefon->Mobiltelefon
+moeglich->möglich
+moegliche->mögliche
+moeglichen->möglichen
+moeglicher->möglicher
+moegliches->mögliches
+möglicht->möglich,möglichst
+mordern->modern
+morderne->moderne
+mordernen->modernen
+morderner->moderner
+mordernes->modernes
+morgentlich*->morgendlich*
+morgends->morgens
+muß->muss
+mußte->musste
+mußten->mussten
+Museeum->Museum
+mutmasslich->mutmaßlich
+mutmassliche->mutmaßliche
+mutmasslichem->mutmaßlichem
+mutmasslichen->mutmaßlichen
+mutmasslicher->mutmaßlicher
+mutmassliches->mutmaßliches
+nachdem Krieg->nach dem Krieg
+Nachkommens->Nachkommen
+nächst gelegene*->nächstgelegene*
+nächst größere*->nächstgrößere*
+nächst höhere*->nächsthöhere*
+nächst kleinere*->nächstkleinere*
+nächst niedrigere*->nächstniedrigere*
+nächst tiefere*->nächsttiefere*
+Nahaufname->Nahaufnahme
+nahegelegenste->nächstgelegene
+naheste->nächste
+nahesten->nächsten
+nähmlich->nämlich
+namenlich->namentlich
+namenslos->namenlos
+des Names->des Namens
+Namne->Namen
+narzistisch->narzisstisch
+Natiomnal*->National*
+Nazionalsoz*->Nationalsoz*
+nciht->nicht
+Nervösität->Nervosität
+nich->nicht
+die Niederlanden->die Niederlande
+niedersächisch->niedersächsisch
+niedersächsiche->niedersächsische
+niedersächsichen->niedersächsischen
+niedrieg->niedrig
+Niesche->Nische
+nihct->nicht
+nix->nichts
+nocheinmal->noch einmal
+nordeutsch->norddeutsch
+Nordeutschland->Norddeutschland
+nordlich->nördlich
+nördöstlich*->nordöstlich*
+nördwestlich*->nordwestlich*
+normanisch*->normannisch*
+notwenig*->notwendig*
+numehr->nunmehr
+Numerus Clausus->Numerus clausus
+objekiv->objektiv
+obrige->obige
+obrigen->obigen
+obriger->obiger
+offizell*->offiziell*
+Offizer->Offizier
+offiziel->offiziell
+offiziele*->offizielle*
+offziell->offiziell
+offzielle->offizielle
+ofiziell->offiziell
+Olympiamedaillie*->Olympiamedaille*
+Olympiamedallie*->Olympiamedaille*
+Olympische Bronzemedaille->olympische Bronzemedaille
+Olympische Goldmedaille->olympische Goldmedaille
+Olympische Silbermedaille->olympische Silbermedaille
+Omlett->Omelett
+optimalste->optimale
+optimalster->optimaler
+optimalstes->optimales
+Ordnug->Ordnung
+Ordung->Ordnung
+Orgeon->Oregon
+Organistion->Organisation
+Organsiation->Organisation
+organsich->organisch
+Organsisation->Organisation
+organisert->organisiert
+orginal->original
+orginale->originale
+orginalen->originalen
+orginell->originell
+orignal->original
+orignell->originell
+Orsteil->Ortsteil
+Orsteile->Ortsteile
+Ortteil->Ortsteil
+ouml->Ö/ö
+Overtüre->Ouvertüre
+öffenlich->öffentlich
+Ökö->Öko
+Östereich->Österreich
+Österrreich->Österreich
+Österreisch->Österreich
+östereichisch*->österreichisch*
+österreichich->österreichisch
+Packet->Paket
+palästinesisch->palästinensisch
+Palete->Palette
+Paleten->Paletten
+Pallete->Palette
+Palleten->Paletten
+Pallette->Palette
+Palletten->Paletten
+paralell->parallel
+Parcour->Parcours
+parralel->parallel
+parrallel->parallel
+Päsident->Präsident
+patroullieren->patrouillieren
+patroulliert->patrouilliert
+Pavillion->Pavillon
+Peleponnes*->Peloponnes*
+Pepperoni->Peperoni
+Perlmut->Perlmutt
+perönlich*->persönlich*
+persöhnlich*->persönlich*
+Persönlichleit->Persönlichkeit
+Philantrop*->Philanthrop*
+Philipinen->Philippinen
+Philipinisch->Philippinisch
+philipinischer->philippinischer
+Philippienen->Philippinen
+Philisoph->Philosoph
+Philisophie->Philosophie
+philisophisch->philosophisch
+Phillipinen->Philippinen
+Philosopie->Philosophie
+Philosph->Philosoph
+Philosphie->Philosophie
+philosphisch->philosophisch
+Philsophie->Philosophie
+philsophisch->philosophisch
+photografiert->fotografiert,photographiert
+piktoresk->pittoresk
+Planze->Pflanze
+Planzen*->Pflanzen*
+Politk->Politik
+Politker->Politiker
+politsch->politisch
+politsche->politische
+politschen->politischen
+politscher->politischer
+politsches->politisches
+poltisch*->politisch*
+portugiesich*->portugiesisch*
+Positon->Position
+postiv->positiv
+prinzipell*->prinzipiell*
+Prinzipen->Prinzipien
+Priveleg->Privileg
+priveligiert->privilegiert
+Priviligien*->Privilegien*
+priviligiert->privilegiert
+Progrom->Pogrom
+projezieren->projizieren
+projeziert->projiziert
+Prophezeihung*->Prophezeiung*
+Provinzhaupstadt->Provinzhauptstadt
+Prozeße->Prozesse
+Psychatrie->Psychiatrie
+pysikalisch->physikalisch
+Quattrologie->Tetralogie
+Ralley->Rallye
+Ralleyfahrer->Rallyefahrer
+rechlich->rechtlich
+Rechtsprache->Rechtssprache
+Rechtspruch->Rechtsspruch
+Rechtssprechung->Rechtsprechung
+Rechtstaat->Rechtsstaat
+rechtstaatlich->rechtsstaatlich
+rechtwinklich->rechtwinklig
+rechtwinkling->rechtwinklig
+rechzeitig->rechtzeitig
+Reeling->Reling
+Reflektion->Reflexion
+regelmässig->regelmäßig
+regelmässige->regelmäßige
+regelmässigen->regelmäßigen
+regelmässiger->regelmäßiger
+regelmässiges->regelmäßiges
+Reichtags*->Reichstags*
+Relgion*->Religion*
+relgiös->religiös
+Religiösität->Religiosität
+Religon->Religion
+Religonen->Religionen
+religös->religiös
+religösen->religiösen
+Relion->Religion
+reliösen->religiösen
+Remineszenz->Reminiszenz
+Rendevous->Rendezvous
+Rennaisance->Renaissance
+Rennaissance->Renaissance
+des Rennes->des Rennens
+Renomee->Renommee
+renomiert->renommiert
+Renomme->Renommee
+repäsentieren->repräsentieren
+repäsentiert->repräsentiert
+Reperatur->Reparatur
+Resourcen->Ressourcen
+Rhytmen->Rhythmen
+rhytmisch->rhythmisch
+rhytmische->rhythmische
+Rhytmus->Rhythmus
+Richtline->Richtlinie
+Richung->Richtung
+rigde->ridge
+rihgt->right
+Riskio->Risiko
+Risko->Risiko
+Rossevelt->Roosevelt
+Rückgrad->Rückgrat
+Rückrad->Rückgrat
+Rückrat->Rückgrat
+russich->russisch
+russiche->russische
+russichen->russischen
+russicher->russischer
+russsich->russisch
+russsisch->russisch
+russsische->russische
+russsischen->russischen
+Rythmen->Rhythmen
+rythmisch->rhythmisch
+rythmische->rhythmische
+Rythmus->Rhythmus
+sächisch->sächsisch
+sächsich->sächsisch
+sächsiche->sächsische
+sächsichen->sächsischen
+Santiago de Compostella->Santiago de Compostela
+Sarkopharg->Sarkophag
+sassen->saßen
+satzungsgemäss->satzungsgemäß
+S-Bahnstation->S-Bahn-Station
+schafte->schaffte
+Schaupiel*->Schauspiel*
+Scheiz->Schweiz
+schillernste*->schillerndste*
+schliessen->schließen
+schliesslich->schließlich
+schliesst->schließt
+Schrifsteller*->Schriftsteller*
+Schriftseller->Schriftsteller
+schweizer->Schweizer
+Seeman->Seemann
+seemänisch->seemännisch
+sehenwert->sehenswert
+Sehenwürdigkeit->Sehenswürdigkeit
+Sehenwürdigkeiten->Sehenswürdigkeiten
+seit dem->seitdem
+seit dem die->seitdem die
+seit dem ein->seitdem ein
+seit dem hat->seitdem hat
+seit dem ist->seitdem ist
+seit dem war->seitdem war
+seperat->separat
+seperate->separate
+seperatem->separatem
+seperaten->separaten
+Seperation->Separation
+Seperatist*->Separatist*
+Septmber->September
+Septmeber->September
+Seriösität->Seriosität
+sicher gestellt->sichergestellt
+sich er sich->er sich
+sicher stellen->sicherstellen
+sicher stellt*->sicherstellt*
+sicher zu stellen->sicherzustellen
+Silbermedaillie*->Silbermedaille*
+Silbermedallie*->Silbermedaille*
+Siluette->Silhouette
+sinvoll->sinnvoll
+Situtation->Situation
+Skagerak->Skagerrak
+sobald wie möglich->so bald wie möglich
+sobald als möglich->so bald als möglich
+sodas->sodass,so dass
+sodaß->sodass,so dass
+sogenante->sogenannte
+sogenanten->sogenannten
+sonder->sondern
+Souveranität->Souveränität
+soweit wie->so weit wie
+Sowietunion->Sowjetunion
+spezialiseren->spezialisieren
+spezialisert*->spezialisiert*
+speziel->speziell
+sponsorte->sponserte
+Spritualität->Spiritualität
+sprituell->spirituell
+Staatstreich->Staatsstreich
+Stadbild->Stadtbild
+Staddteil->Stadtteil
+Stadteil->Stadtteil
+Stadteile->Stadtteile
+Stadteilen->Stadtteilen
+Stadteils->Stadtteils
+Standart->Standard
+Standarts->Standards
+statt fand->stattfand
+statt finden->stattfinden
+statt findet->stattfindet
+statt gegeben->stattgegeben
+Stehgreif->Stegreif
+stellverteten->stellvertreten
+Stellverteter->Stellvertreter
+stiess->stieß
+Stimmulation->Stimulation
+Stömung->Strömung
+Stoss->Stoß
+stossen->stoßen
+Stossfänger->Stoßfänger
+Stossstange->Stoßstange
+stösst->stößt
+Strasse->Straße
+strukur*->struktur*
+subsummieren->subsumieren
+subsummiert->subsumiert
+sumieren->summieren
+sumiert->summiert
+svw->svw., bzw., so viel wie
+symetrisch->symmetrisch
+symphatisiert->sympathisiert
+Synomym->Synonym
+Synomyn->Synonym
+Syphon->Siphon
+Sytem->System
+Sytematik->Systematik
+sytematisch->systematisch
+Tag- und Nachtgleiche->Tagundnachtgleiche,Tag-und-Nacht-Gleiche
+Taiwanese->Taiwaner
+Taiwanesen->Taiwaner
+tasächlich->tatsächlich
+tatächlich->tatsächlich
+Teakwondo->Taekwondo
+teiweise->teilweise
+Temparatur->Temperatur
+tendentiell*->tendenziell*
+Terasse->Terrasse
+Terassen->Terrassen
+Terrabyte->Terabyte
+Tocher->Tochter
+Tolleranz->Toleranz
+tollerieren->tolerieren
+tolleriert->toleriert
+Tradion*->Tradition*
+traditionel->traditionell
+Traditon*->Tradition*
+Tradtion*->Tradition*
+Trainig*->Training*
+Transskript->Transkript
+Triologie->Trilogie
+Triumpf->Triumph
+trotzdessen->trotzdem
+trozdem->trotzdem
+Tryptichon->Triptychon
+Triptichon->Triptychon
+Tryptychon->Triptychon
+Tunier->Turnier
+Turismus->Tourismus
+Turist->Tourist
+U-Bahnnetz->U-Bahn-Netz
+U-Bahnstation->U-Bahn-Station
+U-Bahntunnel->U-Bahn-Tunnel
+überarbeitetet->überarbeitet
+überlegende->überlegene
+überlegenden->überlegenen
+überlicherweise->üblicherweise
+Überwachungstaat->Überwachungsstaat
+U-Bootkrieg->U-Boot-Krieg
+umbennen->umbenennen
+umbennenen->umbenennen
+umbennennen->umbenennen
+umbennant->umbenannt
+Umbennennung->Umbenennung
+Umbennenung->Umbenennung
+Umbennung->Umbenennung,Umnennung
+umd->und,um
+Umgangsprache->Umgangssprache
+umgangsprachlich->umgangssprachlich
+umgangsprachliche->umgangssprachliche
+umgangsprachlicher->umgangssprachlicher
+umgenannt->umbenannt
+umittelbar->unmittelbar
+umstrittend*->umstritten*
+umzubennen->umzubenennen,umzunennen
+Unabhängikeit->Unabhängigkeit
+Unabhängkeit->Unabhängigkeit
+unabhänig->unabhängig
+Unabhänigkeit->Unabhängigkeit
+unauthorisiert->unautorisiert
+unbenannt wurde->umbenannt wurde
+und sowie->und/sowie
+und und->und
+Unfang->Umfang
+ungekehrt->umgekehrt
+Univerität->Universität
+Universiät->Universität
+Universtät->Universität
+Universtität->Universität
+unsymetrisch->unsymmetrisch
+unteranderem->unter anderem
+Untergund->Untergrund
+Untericht->Unterricht
+unterichtet->unterrichtet
+unteriridisch->unterirdisch
+Unternehmes*->Unternehmens*
+Unternehms*->Unternehmens*
+unterstüzt->unterstützt
+Unterstüzung->Unterstützung
+Unversität->Universität
+unwegbar->unwägbar,unwegsam
+Urprung->Ursprung
+urprünglich*->ursprünglich*
+ürsprünglich*->ursprünglich*
+urspünglich*->ursprünglich*
+Ursurpator->Usurpator
+us-amerikanischen->US-amerikanischen,amerikanischen
+usprünglich*->ursprünglich*
+variert->variiert
+varrieren->variieren
+Vehrkehr*->Verkehr*
+Vekehr*->Verkehr*
+venezuelanisch*->venezolanisch*
+venizianisch*->venezianisch*
+verabeitet->verarbeitet
+Verabeitung*->Verarbeitung*
+veraltert*->veraltet*
+verantworlich*->verantwortlich*
+Veranwtortung->Verantwortung
+Verbauch*->Verbrauch*
+verbeitet*->verbreitet*
+Verbeitung*->Verbreitung*
+verbreiteste*->verbreitetste*
+verbreiteteste*->verbreitetste*
+vereingt*->vereinigt*
+vereiningt->vereinigt
+vergleichweise->vergleichsweise
+vergößert*->vergrößert*
+Vergößerung->Vergrößerung
+vergrössern->vergrößern
+vergrössert->vergrößert
+vergrösserte->vergrößerte
+vergrösserten->vergrößerten
+vergrösserter->vergrößerter
+Vergrösserung->Vergrößerung
+verhaeltnismaessig->verhältnismäßig
+verhältnismässig->verhältnismäßig
+verheiratetet->verheiratet
+verkündetet->verkündet
+verliess->verließ
+veröffendlicht->veröffentlicht
+Veröffendlichung->Veröffentlichung
+veröffentlich->veröffentlicht
+verplichtet->verpflichtet
+verschiedende*->verschiedene*
+verschiedendste*->verschiedenste*
+Verschleiss->Verschleiß
+verschohnen->verschonen
+verspühren->verspüren
+verspührt->verspürt
+Verständis->Verständnis
+Vertäge->Verträge
+vertaglich->vertraglich
+Verteidung->Verteidigung
+Verwaltungsitz->Verwaltungssitz
+Verwandschaft->Verwandtschaft
+verwandschaftlich*->verwandtschaftlich*
+Vetrag->Vertrag
+Veträge->Verträge
+vetraglich->vertraglich
+vetraut->vertraut
+vieleicht->vielleicht
+vom dem->von dem,vom
+vom der->von der,vom,der
+von einander->voneinander
+getrennt von einander->getrennt voneinander
+unabhängig von einander->unabhängig voneinander
+von einander entfernt->voneinander entfernt
+von einander getrennt->voneinander getrennt
+von einander unterscheiden->voneinander unterscheiden
+von einander unterschieden->voneinander unterschieden
+von einander zu->voneinander zu
+von nöten->vonnöten,z. B. vonnöten sein
+von statten->vonstatten
+von von->von
+vorallem->vor allem
+vorallen->vor allem
+vor allen in->vor allem in
+voran bringen->voranbringen
+Vorang->Vorrang
+voran gegangen*->vorangegangen*
+vorangig->vorrangig
+voran zu bringen->voranzubringen
+voran zu treiben->voranzutreiben
+Vorausetzung->Voraussetzung
+Vorausetzungen->Voraussetzungen
+voraus gegangen*->vorausgegangen*
+vorausichtlich->voraussichtlich
+Vorfahrens->Vorfahren
+Vorgesetze->Vorgesetzte
+vorkommene->vorkommende
+Vormachtsstellung->Vormachtstellung
+vorranging->vorrangig
+vorraus*->voraus*
+vorrüber*->vorüber*
+vorweg genommen*->vorweggenommen*
+Wachholder->Wacholder
+wachesen->wachsen
+währe->wäre
+währendessen->währenddessen
+wahr genommen->wahrgenommen
+Walfahrer->Wallfahrer
+Walfahrt->Wallfahrt
+Walfahrtskirche->Wallfahrtskirche
+Walfahrtsort->Wallfahrtsort
+wärend->während
+Warheit->Wahrheit
+warscheinlich->wahrscheinlich
+Webblog*->Weblog*
+Webpräsens->Webpräsenz
+Wehrmutstropfen->Wermutstropfen
+weiss->weiß
+Weisswein->Weißwein
+einem weiterem->einem weiteren
+im weiterem->im weiteren
+weiterere->weitere
+weitereren->weiteren
+weitesgehend->weitestgehend
+Weltanschaung->Weltanschauung
+Wepräsenz->Webpräsenz
+wesendlich->wesentlich
+im Wesentlichem->im Wesentlichen
+wichig->wichtig
+wichtigeste->wichtigste
+Widerstandkämpfer->Widerstandskämpfer
+widerum->wiederum
+Wiedererichtung->Wiedererrichtung
+wieder kehrend*->wiederkehrend*
+Wiedersacher->Widersacher
+wiedersetzen->widersetzen
+wiederspiegeln->widerspiegeln
+wiederspiegelt->widerspiegelt
+wiederspiegelte->widerspiegelte
+wiederspiegelten->widerspiegelten
+wiedersprechen->widersprechen
+wiedersprechend->widersprechend
+wiedersprechende->widersprechende
+Wiederspruch->Widerspruch
+Wiedersprüche->Widersprüche
+wiedersprüchlich->widersprüchlich
+wiedersprüchliche->widersprüchliche
+wiedersprüchlichen->widersprüchlichen
+Wiederstand->Widerstand
+Wiederstandskampf->Widerstandskampf
+wiederstehen->widerstehen
+wiederzuspiegeln->widerzuspiegeln
+Wihelm->Wilhelm
+Wikipeda->Wikipedia
+Wikpedia->Wikipedia
+wirtschaflich->wirtschaftlich
+wissenschaflich->wissenschaftlich
+wissenschafltich->wissenschaftlich
+Wissentschaft->Wissenschaft
+wissentschaftlich->wissenschaftlich
+Wochende->Wochenende
+woduch->wodurch
+Wolfang->Wolfgang
+wurd->wurde
+wurde wurde->wurde
+Würtemberg->Württemberg
+würtembergische->württembergische
+zahreich->zahlreich
+zeimlich->ziemlich
+der Zeit seines Lebens->der zeit seines Lebens
+er Zeit seines Lebens->er zeit seines Lebens
+sie Zeit ihres Lebens->sie zeit ihres Lebens
+war Zeit ihres Lebens->war zeit ihres Lebens
+war Zeit seines Lebens->war zeit seines Lebens
+zeitgenösisch->zeitgenössisch
+zeitgenössich->zeitgenössisch
+zerissen->zerrissen
+Ziffernblatt->Zifferblatt
+Zohne->Zone
+zu allererst->zuallererst
+zuammen->zusammen
+Zuammenhang->Zusammenhang
+zueigen->zu eigen
+zuende->zu Ende
+zu Folge->zufolge,zur Folge
+zufrieden geben->zufriedengeben
+zugrundeliegen->zugrunde liegen,zu Grunde liegen
+zugrundeliegt->zugrunde liegt,zu Grunde liegt
+zu letzt->zuletzt
+zum dem->zu dem,zum
+zum den->zu den,zu dem,zum
+zum erstem->zum ersten
+zumindestens->zumindest
+in zunehmenden Maße->in zunehmendem Maße
+mit zunehmenden Alter->mit zunehmendem Alter
+zunehmends->zunehmend
+zur der->zu der,zur
+zur dieser->zu dieser
+zur einem->zu einem
+zur einer->zu einer,zur
+zur ihr->zu ihr
+zur ihrem->zu ihrem
+zur ihren->zu ihren
+zur ihrer->zu ihrer,zur
+zur seiner->zu seiner,zur
+zurecht->zurecht
+zurecht finden->zurechtfinden
+zurecht kam->zurechtkam
+zurecht kommen->zurechtkommen
+zurecht kommt->zurechtkommt
+zurecht zu finden->zurechtzufinden
+zurecht zu kommen->zurechtzukommen
+zurfolge->zur Folge,zufolge
+zurück ge*->zurückge*
+zurück gegangen*->zurückgegangen*
+zurück blicken->zurückblicken
+zurück erobert->zurückerobert
+zurück ging->zurückging
+zurück greif*->zurückgreif*
+zurück kehrte->zurückkehrte
+zurück trat->zurücktrat
+zurück verfolgen->zurückverfolgen
+zurück verfolgt->zurückverfolgt
+zurück ziehen->zurückziehen
+zurück zog->zurückzog
+zurück zu bekommen->zurückzubekommen
+zurück zu bringen->zurückzubringen
+zurück zu drängen->zurückzudrängen
+zurück zu erobern->zurückzuerobern
+zurück zu führen->zurückzuführen
+zurück zuführen->zurückzuführen
+zurück zu gewinnen->zurückzugewinnen
+zurück zu holen->zurückzuholen
+zurück zu kehren->zurückzukehren
+zurück zu ziehen->zurückzuziehen
+zusamen->zusammen
+Zusamenhang->Zusammenhang
+zusammen arbeiten->zusammenarbeiten
+zusammen arbeitete->zusammenarbeitete
+zusammen arbeiteten->zusammenarbeiteten
+zusammen gearbeitet->zusammengearbeitet
+zusammen gefasst->zusammengefasst
+zusammen geschlossen*->zusammengeschlossen*
+zusammen schloss*->zusammenschloss*
+zusammen zu arbeiten->zusammenzuarbeiten
+zusammen zu schließen->zusammenzuschließen
+zusammmen->zusammen
+zusätlich->zusätzlich
+zusehens->zusehends
+zustandegekommen->zustande gekommen,zu Stande gekommen
+zustandekam->zustande kam,zu Stande kam
+zustandekommt->zustande kommt,zu Stande kommt
+zustätzlich->zusätzlich
+zu teil werden->zuteilwerden
+zu teil wird->zuteilwird
+zu teil wurde->zuteilwurde
+zu zu->zu,zuzu
+zu zuordnen*->zuzuordnen*
+zu zuwenden*->zuzuwenden*
+Zweidrittel->zwei Drittel
+Zweidrittel-Mehrheit->Zweidrittelmehrheit
+Zweiliga*->Zweitliga*
+dem zweitem->dem zweiten
+im zweitem->im zweiten
diff --git a/love2dToAPK/tools/tools/android-win/tools/support/typos-en.txt b/love2dToAPK/tools/tools/android-win/tools/support/typos-en.txt
new file mode 100644
index 0000000..74fbd08
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/support/typos-en.txt
@@ -0,0 +1,4576 @@
+# This file contains a number of common English typos:
+andriod->android
+
+# The remainder of this file contains misspellings from
+# http://en.wikipedia.org/wiki/Wikipedia:Lists_of_common_misspellings/For_machines
+# plus some post-processing to fix invalid entries, remove duplicates, etc.
+#
+# The content is available under the
+# "Creative Commons Attribution-ShareAlike License"
+# http://creativecommons.org/licenses/by-sa/3.0/
+#
+# THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
+# COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
+# COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
+# AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
+#
+# BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
+# TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY
+# BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS
+# CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
+# CONDITIONS.
+#
+# *1. Definitions*
+#
+# 1. *"Adaptation"* means a work based upon the Work, or upon the Work
+# and other pre-existing works, such as a translation, adaptation,
+# derivative work, arrangement of music or other alterations of a
+# literary or artistic work, or phonogram or performance and includes
+# cinematographic adaptations or any other form in which the Work may
+# be recast, transformed, or adapted including in any form
+# recognizably derived from the original, except that a work that
+# constitutes a Collection will not be considered an Adaptation for
+# the purpose of this License. For the avoidance of doubt, where the
+# Work is a musical work, performance or phonogram, the
+# synchronization of the Work in timed-relation with a moving image
+# ("synching") will be considered an Adaptation for the purpose of
+# this License.
+# 2. *"Collection"* means a collection of literary or artistic works,
+# such as encyclopedias and anthologies, or performances, phonograms
+# or broadcasts, or other works or subject matter other than works
+# listed in Section 1(f) below, which, by reason of the selection and
+# arrangement of their contents, constitute intellectual creations, in
+# which the Work is included in its entirety in unmodified form along
+# with one or more other contributions, each constituting separate and
+# independent works in themselves, which together are assembled into a
+# collective whole. A work that constitutes a Collection will not be
+# considered an Adaptation (as defined below) for the purposes of this
+# License.
+# 3. *"Creative Commons Compatible License"* means a license that is
+# listed at http://creativecommons.org/compatiblelicenses that has
+# been approved by Creative Commons as being essentially equivalent to
+# this License, including, at a minimum, because that license: (i)
+# contains terms that have the same purpose, meaning and effect as the
+# License Elements of this License; and, (ii) explicitly permits the
+# relicensing of adaptations of works made available under that
+# license under this License or a Creative Commons jurisdiction
+# license with the same License Elements as this License.
+# 4. *"Distribute"* means to make available to the public the original
+# and copies of the Work or Adaptation, as appropriate, through sale
+# or other transfer of ownership.
+# 5. *"License Elements"* means the following high-level license
+# attributes as selected by Licensor and indicated in the title of
+# this License: Attribution, ShareAlike.
+# 6. *"Licensor"* means the individual, individuals, entity or entities
+# that offer(s) the Work under the terms of this License.
+# 7. *"Original Author"* means, in the case of a literary or artistic
+# work, the individual, individuals, entity or entities who created
+# the Work or if no individual or entity can be identified, the
+# publisher; and in addition (i) in the case of a performance the
+# actors, singers, musicians, dancers, and other persons who act,
+# sing, deliver, declaim, play in, interpret or otherwise perform
+# literary or artistic works or expressions of folklore; (ii) in the
+# case of a phonogram the producer being the person or legal entity
+# who first fixes the sounds of a performance or other sounds; and,
+# (iii) in the case of broadcasts, the organization that transmits the
+# broadcast.
+# 8. *"Work"* means the literary and/or artistic work offered under the
+# terms of this License including without limitation any production in
+# the literary, scientific and artistic domain, whatever may be the
+# mode or form of its expression including digital form, such as a
+# book, pamphlet and other writing; a lecture, address, sermon or
+# other work of the same nature; a dramatic or dramatico-musical work;
+# a choreographic work or entertainment in dumb show; a musical
+# composition with or without words; a cinematographic work to which
+# are assimilated works expressed by a process analogous to
+# cinematography; a work of drawing, painting, architecture,
+# sculpture, engraving or lithography; a photographic work to which
+# are assimilated works expressed by a process analogous to
+# photography; a work of applied art; an illustration, map, plan,
+# sketch or three-dimensional work relative to geography, topography,
+# architecture or science; a performance; a broadcast; a phonogram; a
+# compilation of data to the extent it is protected as a copyrightable
+# work; or a work performed by a variety or circus performer to the
+# extent it is not otherwise considered a literary or artistic work.
+# 9. *"You"* means an individual or entity exercising rights under this
+# License who has not previously violated the terms of this License
+# with respect to the Work, or who has received express permission
+# from the Licensor to exercise rights under this License despite a
+# previous violation.
+# 10. *"Publicly Perform"* means to perform public recitations of the Work
+# and to communicate to the public those public recitations, by any
+# means or process, including by wire or wireless means or public
+# digital performances; to make available to the public Works in such
+# a way that members of the public may access these Works from a place
+# and at a place individually chosen by them; to perform the Work to
+# the public by any means or process and the communication to the
+# public of the performances of the Work, including by public digital
+# performance; to broadcast and rebroadcast the Work by any means
+# including signs, sounds or images.
+# 11. *"Reproduce"* means to make copies of the Work by any means
+# including without limitation by sound or visual recordings and the
+# right of fixation and reproducing fixations of the Work, including
+# storage of a protected performance or phonogram in digital form or
+# other electronic medium.
+#
+# *2. Fair Dealing Rights.* Nothing in this License is intended to reduce,
+# limit, or restrict any uses free from copyright or rights arising from
+# limitations or exceptions that are provided for in connection with the
+# copyright protection under copyright law or other applicable laws.
+#
+# *3. License Grant.* Subject to the terms and conditions of this License,
+# Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
+# perpetual (for the duration of the applicable copyright) license to
+# exercise the rights in the Work as stated below:
+#
+# 1. to Reproduce the Work, to incorporate the Work into one or more
+# Collections, and to Reproduce the Work as incorporated in the
+# Collections;
+# 2. to create and Reproduce Adaptations provided that any such
+# Adaptation, including any translation in any medium, takes
+# reasonable steps to clearly label, demarcate or otherwise identify
+# that changes were made to the original Work. For example, a
+# translation could be marked "The original work was translated from
+# English to Spanish," or a modification could indicate "The original
+# work has been modified.";
+# 3. to Distribute and Publicly Perform the Work including as
+# incorporated in Collections; and,
+# 4. to Distribute and Publicly Perform Adaptations.
+# 5.
+#
+# For the avoidance of doubt:
+#
+# 1. *Non-waivable Compulsory License Schemes*. In those
+# jurisdictions in which the right to collect royalties through
+# any statutory or compulsory licensing scheme cannot be waived,
+# the Licensor reserves the exclusive right to collect such
+# royalties for any exercise by You of the rights granted under
+# this License;
+# 2. *Waivable Compulsory License Schemes*. In those jurisdictions in
+# which the right to collect royalties through any statutory or
+# compulsory licensing scheme can be waived, the Licensor waives
+# the exclusive right to collect such royalties for any exercise
+# by You of the rights granted under this License; and,
+# 3. *Voluntary License Schemes*. The Licensor waives the right to
+# collect royalties, whether individually or, in the event that
+# the Licensor is a member of a collecting society that
+# administers voluntary licensing schemes, via that society, from
+# any exercise by You of the rights granted under this License.
+#
+# The above rights may be exercised in all media and formats whether now
+# known or hereafter devised. The above rights include the right to make
+# such modifications as are technically necessary to exercise the rights
+# in other media and formats. Subject to Section 8(f), all rights not
+# expressly granted by Licensor are hereby reserved.
+#
+# *4. Restrictions.* The license granted in Section 3 above is expressly
+# made subject to and limited by the following restrictions:
+#
+# 1. You may Distribute or Publicly Perform the Work only under the terms
+# of this License. You must include a copy of, or the Uniform Resource
+# Identifier (URI) for, this License with every copy of the Work You
+# Distribute or Publicly Perform. You may not offer or impose any
+# terms on the Work that restrict the terms of this License or the
+# ability of the recipient of the Work to exercise the rights granted
+# to that recipient under the terms of the License. You may not
+# sublicense the Work. You must keep intact all notices that refer to
+# this License and to the disclaimer of warranties with every copy of
+# the Work You Distribute or Publicly Perform. When You Distribute or
+# Publicly Perform the Work, You may not impose any effective
+# technological measures on the Work that restrict the ability of a
+# recipient of the Work from You to exercise the rights granted to
+# that recipient under the terms of the License. This Section 4(a)
+# applies to the Work as incorporated in a Collection, but this does
+# not require the Collection apart from the Work itself to be made
+# subject to the terms of this License. If You create a Collection,
+# upon notice from any Licensor You must, to the extent practicable,
+# remove from the Collection any credit as required by Section 4(c),
+# as requested. If You create an Adaptation, upon notice from any
+# Licensor You must, to the extent practicable, remove from the
+# Adaptation any credit as required by Section 4(c), as requested.
+# 2. You may Distribute or Publicly Perform an Adaptation only under the
+# terms of: (i) this License; (ii) a later version of this License
+# with the same License Elements as this License; (iii) a Creative
+# Commons jurisdiction license (either this or a later license
+# version) that contains the same License Elements as this License
+# (e.g., Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons
+# Compatible License. If you license the Adaptation under one of the
+# licenses mentioned in (iv), you must comply with the terms of that
+# license. If you license the Adaptation under the terms of any of the
+# licenses mentioned in (i), (ii) or (iii) (the "Applicable License"),
+# you must comply with the terms of the Applicable License generally
+# and the following provisions: (I) You must include a copy of, or the
+# URI for, the Applicable License with every copy of each Adaptation
+# You Distribute or Publicly Perform; (II) You may not offer or impose
+# any terms on the Adaptation that restrict the terms of the
+# Applicable License or the ability of the recipient of the Adaptation
+# to exercise the rights granted to that recipient under the terms of
+# the Applicable License; (III) You must keep intact all notices that
+# refer to the Applicable License and to the disclaimer of warranties
+# with every copy of the Work as included in the Adaptation You
+# Distribute or Publicly Perform; (IV) when You Distribute or Publicly
+# Perform the Adaptation, You may not impose any effective
+# technological measures on the Adaptation that restrict the ability
+# of a recipient of the Adaptation from You to exercise the rights
+# granted to that recipient under the terms of the Applicable License.
+# This Section 4(b) applies to the Adaptation as incorporated in a
+# Collection, but this does not require the Collection apart from the
+# Adaptation itself to be made subject to the terms of the Applicable
+# License.
+# 3. If You Distribute, or Publicly Perform the Work or any Adaptations
+# or Collections, You must, unless a request has been made pursuant to
+# Section 4(a), keep intact all copyright notices for the Work and
+# provide, reasonable to the medium or means You are utilizing: (i)
+# the name of the Original Author (or pseudonym, if applicable) if
+# supplied, and/or if the Original Author and/or Licensor designate
+# another party or parties (e.g., a sponsor institute, publishing
+# entity, journal) for attribution ("Attribution Parties") in
+# Licensor's copyright notice, terms of service or by other reasonable
+# means, the name of such party or parties; (ii) the title of the Work
+# if supplied; (iii) to the extent reasonably practicable, the URI, if
+# any, that Licensor specifies to be associated with the Work, unless
+# such URI does not refer to the copyright notice or licensing
+# information for the Work; and (iv) , consistent with Ssection 3(b),
+# in the case of an Adaptation, a credit identifying the use of the
+# Work in the Adaptation (e.g., "French translation of the Work by
+# Original Author," or "Screenplay based on original Work by Original
+# Author"). The credit required by this Section 4(c) may be
+# implemented in any reasonable manner; provided, however, that in the
+# case of a Adaptation or Collection, at a minimum such credit will
+# appear, if a credit for all contributing authors of the Adaptation
+# or Collection appears, then as part of these credits and in a manner
+# at least as prominent as the credits for the other contributing
+# authors. For the avoidance of doubt, You may only use the credit
+# required by this Section for the purpose of attribution in the
+# manner set out above and, by exercising Your rights under this
+# License, You may not implicitly or explicitly assert or imply any
+# connection with, sponsorship or endorsement by the Original Author,
+# Licensor and/or Attribution Parties, as appropriate, of You or Your
+# use of the Work, without the separate, express prior written
+# permission of the Original Author, Licensor and/or Attribution Parties.
+# 4. Except as otherwise agreed in writing by the Licensor or as may be
+# otherwise permitted by applicable law, if You Reproduce, Distribute
+# or Publicly Perform the Work either by itself or as part of any
+# Adaptations or Collections, You must not distort, mutilate, modify
+# or take other derogatory action in relation to the Work which would
+# be prejudicial to the Original Author's honor or reputation.
+# Licensor agrees that in those jurisdictions (e.g. Japan), in which
+# any exercise of the right granted in Section 3(b) of this License
+# (the right to make Adaptations) would be deemed to be a distortion,
+# mutilation, modification or other derogatory action prejudicial to
+# the Original Author's honor and reputation, the Licensor will waive
+# or not assert, as appropriate, this Section, to the fullest extent
+# permitted by the applicable national law, to enable You to
+# reasonably exercise Your right under Section 3(b) of this License
+# (right to make Adaptations) but not otherwise.
+#
+# *5. Representations, Warranties and Disclaimer*
+#
+# UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
+# OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
+# KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
+# INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
+# LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
+# WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE
+# EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
+#
+# *6. Limitation on Liability.* EXCEPT TO THE EXTENT REQUIRED BY
+# APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL
+# THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY
+# DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF
+# LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+#
+# *7. Termination*
+#
+# 1. This License and the rights granted hereunder will terminate
+# automatically upon any breach by You of the terms of this License.
+# Individuals or entities who have received Adaptations or Collections
+# from You under this License, however, will not have their licenses
+# terminated provided such individuals or entities remain in full
+# compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will
+# survive any termination of this License.
+# 2. Subject to the above terms and conditions, the license granted here
+# is perpetual (for the duration of the applicable copyright in the
+# Work). Notwithstanding the above, Licensor reserves the right to
+# release the Work under different license terms or to stop
+# distributing the Work at any time; provided, however that any such
+# election will not serve to withdraw this License (or any other
+# license that has been, or is required to be, granted under the terms
+# of this License), and this License will continue in full force and
+# effect unless terminated as stated above.
+#
+# *8. Miscellaneous*
+#
+# 1. Each time You Distribute or Publicly Perform the Work or a
+# Collection, the Licensor offers to the recipient a license to the
+# Work on the same terms and conditions as the license granted to You
+# under this License.
+# 2. Each time You Distribute or Publicly Perform an Adaptation, Licensor
+# offers to the recipient a license to the original Work on the same
+# terms and conditions as the license granted to You under this License.
+# 3. If any provision of this License is invalid or unenforceable under
+# applicable law, it shall not affect the validity or enforceability
+# of the remainder of the terms of this License, and without further
+# action by the parties to this agreement, such provision shall be
+# reformed to the minimum extent necessary to make such provision
+# valid and enforceable.
+# 4. No term or provision of this License shall be deemed waived and no
+# breach consented to unless such waiver or consent shall be in
+# writing and signed by the party to be charged with such waiver or
+# consent.
+# 5. This License constitutes the entire agreement between the parties
+# with respect to the Work licensed here. There are no understandings,
+# agreements or representations with respect to the Work not specified
+# here. Licensor shall not be bound by any additional provisions that
+# may appear in any communication from You. This License may not be
+# modified without the mutual written agreement of the Licensor and You.
+# 6. The rights granted under, and the subject matter referenced, in this
+# License were drafted utilizing the terminology of the Berne
+# Convention for the Protection of Literary and Artistic Works (as
+# amended on September 28, 1979), the Rome Convention of 1961, the
+# WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms
+# Treaty of 1996 and the Universal Copyright Convention (as revised on
+# July 24, 1971). These rights and subject matter take effect in the
+# relevant jurisdiction in which the License terms are sought to be
+# enforced according to the corresponding provisions of the
+# implementation of those treaty provisions in the applicable national
+# law. If the standard suite of rights granted under applicable
+# copyright law includes additional rights not granted under this
+# License, such additional rights are deemed to be included in the
+# License; this License is not intended to restrict the license of any
+# rights under applicable law.
+
+abandonned->abandoned
+aberation->aberration
+abilties->abilities
+abilty->ability
+abondon->abandon
+abbout->about
+abotu->about
+abouta->about a
+aboutit->about it
+aboutthe->about the
+abscence->absence
+abondoned->abandoned
+abondoning->abandoning
+abondons->abandons
+aborigene->aborigine
+accesories->accessories
+accidant->accident
+abortificant->abortifacient
+abreviate->abbreviate
+abreviated->abbreviated
+abreviation->abbreviation
+abritrary->arbitrary
+absail->abseil
+absailing->abseiling
+absense->absence
+absolutly->absolutely
+absorbsion->absorption
+absorbtion->absorption
+abudance->abundance
+abundacies->abundances
+abundancies->abundances
+abundunt->abundant
+abutts->abuts
+acadamy->academy
+acadmic->academic
+accademic->academic
+accademy->academy
+acccused->accused
+accelleration->acceleration
+accension->accession, ascension
+acceptence->acceptance
+acceptible->acceptable
+accessable->accessible
+accidentaly->accidentally
+accidently->accidentally
+acclimitization->acclimatization
+accomadate->accommodate
+accomadated->accommodated
+accomadates->accommodates
+accomadating->accommodating
+accomadation->accommodation
+accomadations->accommodations
+accomdate->accommodate
+accomodate->accommodate
+accomodated->accommodated
+accomodates->accommodates
+accomodating->accommodating
+accomodation->accommodation
+accomodations->accommodations
+accompanyed->accompanied
+accordeon->accordion
+accordian->accordion
+accoring->according
+accoustic->acoustic
+accquainted->acquainted
+accrediation->accreditation
+accredidation->accreditation
+accross->across
+accussed->accused
+acedemic->academic
+acheive->achieve
+acheived->achieved
+acheivement->achievement
+acheivements->achievements
+acheives->achieves
+acheiving->achieving
+acheivment->achievement
+acheivments->achievements
+achievment->achievement
+achievments->achievements
+achive->achieve, archive
+achived->achieved, archived
+achivement->achievement
+achivements->achievements
+acknowldeged->acknowledged
+acknowledgeing->acknowledging
+ackward->awkward, backward
+acommodate->accommodate
+acomplish->accomplish
+acomplished->accomplished
+acomplishment->accomplishment
+acomplishments->accomplishments
+acording->according
+acordingly->accordingly
+acquaintence->acquaintance
+acquaintences->acquaintances
+acquiantence->acquaintance
+acquiantences->acquaintances
+acquited->acquitted
+activites->activities
+activly->actively
+actualy->actually
+acuracy->accuracy
+acused->accused
+acustom->accustom
+acustommed->accustomed
+adavanced->advanced
+adbandon->abandon
+addional->additional
+addionally->additionally
+additinally->additionally
+additionaly->additionally
+additonal->additional
+additonally->additionally
+addmission->admission
+addopt->adopt
+addopted->adopted
+addoptive->adoptive
+addres->address, adders
+addresable->addressable
+addresed->addressed
+addresing->addressing
+addressess->addresses
+addtion->addition
+addtional->additional
+adecuate->adequate
+adequit->adequate
+adhearing->adhering
+adherance->adherence
+admendment->amendment
+admininistrative->administrative
+adminstered->administered
+adminstrate->administrate
+adminstration->administration
+adminstrative->administrative
+adminstrator->administrator
+admissability->admissibility
+admissable->admissible
+admited->admitted
+admitedly->admittedly
+adn->and
+adolecent->adolescent
+adquire->acquire
+adquired->acquired
+adquires->acquires
+adquiring->acquiring
+adres->address
+adresable->addressable
+adresing->addressing
+adress->address
+adressable->addressable
+adressed->addressed
+adressing->addressing, dressing
+adventrous->adventurous
+advertisment->advertisement
+advertisments->advertisements
+advesary->adversary
+adviced->advised
+aeriel->aerial
+aeriels->aerials
+afair->affair
+afficianados->aficionados
+afficionado->aficionado
+afficionados->aficionados
+affilate->affiliate
+affilliate->affiliate
+affort->afford, effort
+aforememtioned->aforementioned
+againnst->against
+agains->against
+agaisnt->against
+aganist->against
+aggaravates->aggravates
+aggreed->agreed
+aggreement->agreement
+aggregious->egregious
+aggresive->aggressive
+agian->again
+agianst->against
+agin->again
+agina->again, angina
+aginst->against
+agravate->aggravate
+agre->agree
+agred->agreed
+agreeement->agreement
+agreemnt->agreement
+agregate->aggregate
+agregates->aggregates
+agreing->agreeing
+agression->aggression
+agressive->aggressive
+agressively->aggressively
+agressor->aggressor
+agricultue->agriculture
+agriculure->agriculture
+agricuture->agriculture
+agrieved->aggrieved
+ahev->have
+ahppen->happen
+ahve->have
+aicraft->aircraft
+aiport->airport
+airbourne->airborne
+aircaft->aircraft
+aircrafts->aircraft
+airporta->airports
+airrcraft->aircraft
+aisian->asian
+albiet->albeit
+alchohol->alcohol
+alchoholic->alcoholic
+alchol->alcohol
+alcholic->alcoholic
+alcohal->alcohol
+alcoholical->alcoholic
+aledge->allege
+aledged->alleged
+aledges->alleges
+alege->allege
+aleged->alleged
+alegience->allegiance
+algebraical->algebraic
+algorhitms->algorithms
+algoritm->algorithm
+algoritms->algorithms
+alientating->alienating
+alledge->allege
+alledged->alleged
+alledgedly->allegedly
+alledges->alleges
+allegedely->allegedly
+allegedy->allegedly
+allegely->allegedly
+allegence->allegiance
+allegience->allegiance
+allign->align
+alligned->aligned
+alliviate->alleviate
+allopone->allophone
+allopones->allophones
+allready->already
+allthough->although
+alltime->all-time
+alltogether->altogether
+almsot->almost
+alochol->alcohol
+alomst->almost
+alot->a lot, allot
+alotted->allotted
+alowed->allowed
+alowing->allowing
+alreayd->already
+alse->else
+alsot->also
+alternitives->alternatives
+altho->although
+althought->although
+altough->although
+alusion->allusion, illusion
+alwasy->always
+alwyas->always
+amalgomated->amalgamated
+amatuer->amateur
+amature->armature, amateur
+amendmant->amendment
+Amercia->America
+amerliorate->ameliorate
+amke->make
+amking->making
+ammend->amend
+ammended->amended
+ammendment->amendment
+ammendments->amendments
+ammount->amount
+ammused->amused
+amoung->among
+amoungst->amongst
+amung->among
+amunition->ammunition
+analagous->analogous
+analitic->analytic
+analogeous->analogous
+anarchim->anarchism
+anarchistm->anarchism
+anbd->and
+ancestory->ancestry
+ancilliary->ancillary
+andd->and
+androgenous->androgynous
+androgeny->androgyny
+anihilation->annihilation
+aniversary->anniversary
+annoint->anoint
+annointed->anointed
+annointing->anointing
+annoints->anoints
+annouced->announced
+annualy->annually
+annuled->annulled
+anohter->another
+anomolies->anomalies
+anomolous->anomalous
+anomoly->anomaly
+anonimity->anonymity
+anounced->announced
+anouncement->announcement
+ansalisation->nasalisation
+ansalization->nasalization
+ansestors->ancestors
+antartic->antarctic
+anthromorphization->anthropomorphization
+anthropolgist->anthropologist
+anthropolgy->anthropology
+anual->annual
+anulled->annulled
+anwsered->answered
+anyhwere->anywhere
+anyother->any other
+anytying->anything
+aparent->apparent
+aparment->apartment
+apenines->apennines, Apennines
+aplication->application
+aplied->applied
+apolegetics->apologetics
+apon->upon, apron
+apparant->apparent
+apparantly->apparently
+appart->apart
+appartment->apartment
+appartments->apartments
+appealling->appealing, appalling
+appeareance->appearance
+appearence->appearance
+appearences->appearances
+appenines->apennines, Apennines
+apperance->appearance
+apperances->appearances
+appereance->appearance
+appereances->appearances
+applicaiton->application
+applicaitons->applications
+appologies->apologies
+appology->apology
+apprearance->appearance
+apprieciate->appreciate
+approachs->approaches
+appropiate->appropriate
+appropraite->appropriate
+appropropiate->appropriate
+approproximate->approximate
+approxamately->approximately
+approxiately->approximately
+approximitely->approximately
+aprehensive->apprehensive
+apropriate->appropriate
+aproval->approval
+aproximate->approximate
+aproximately->approximately
+aquaduct->aqueduct
+aquaintance->acquaintance
+aquainted->acquainted
+aquiantance->acquaintance
+aquire->acquire
+aquired->acquired
+aquiring->acquiring
+aquisition->acquisition
+aquitted->acquitted
+aranged->arranged
+arangement->arrangement
+arbitarily->arbitrarily
+arbitary->arbitrary
+archaelogical->archaeological
+archaelogists->archaeologists
+archaelogy->archaeology
+archaoelogy->archeology, archaeology
+archaology->archeology, archaeology
+archeaologist->archeologist, archaeologist
+archeaologists->archeologists, archaeologists
+archetect->architect
+archetects->architects
+archetectural->architectural
+archetecturally->architecturally
+archetecture->architecture
+archiac->archaic
+archictect->architect
+archimedian->archimedean
+architecht->architect
+architechturally->architecturally
+architechture->architecture
+architechtures->architectures
+architectual->architectural
+archtype->archetype
+archtypes->archetypes
+aready->already
+areodynamics->aerodynamics
+argubly->arguably
+arguement->argument
+arguements->arguments
+arised->arose
+arival->arrival
+armamant->armament
+armistace->armistice
+arogant->arrogant
+arogent->arrogant
+aroud->around
+arrangment->arrangement
+arrangments->arrangements
+arrengement->arrangement
+arrengements->arrangements
+arround->around
+artcile->article
+artical->article
+artice->article
+articel->article
+artifical->artificial
+artifically->artificially
+artillary->artillery
+arund->around
+asetic->ascetic
+asfar->as far
+asign->assign
+aslo->also
+asociated->associated
+asorbed->absorbed
+asphyxation->asphyxiation
+assasin->assassin
+assasinate->assassinate
+assasinated->assassinated
+assasinates->assassinates
+assasination->assassination
+assasinations->assassinations
+assasined->assassinated
+assasins->assassins
+assassintation->assassination
+assemple->assemble
+assertation->assertion
+asside->aside
+assisnate->assassinate
+assit->assist
+assitant->assistant
+assocation->association
+assoicate->associate
+assoicated->associated
+assoicates->associates
+assosication->assassination
+asssassans->assassins
+assualt->assault
+assualted->assaulted
+assymetric->asymmetric
+assymetrical->asymmetrical
+asteriod->asteroid
+asthetic->aesthetic
+asthetical->aesthetical
+asthetically->aesthetically
+asume->assume
+aswell->as well
+atain->attain
+atempting->attempting
+atheistical->atheistic
+athenean->athenian
+atheneans->athenians
+athiesm->atheism
+athiest->atheist
+atorney->attorney
+atribute->attribute
+atributed->attributed
+atributes->attributes
+attaindre->attainder, attained
+attemp->attempt
+attemped->attempted
+attemt->attempt
+attemted->attempted
+attemting->attempting
+attemts->attempts
+attendence->attendance
+attendent->attendant
+attendents->attendants
+attened->attended
+attension->attention
+attitide->attitude
+attributred->attributed
+attrocities->atrocities
+audeince->audience
+auromated->automated
+austrailia->Australia
+austrailian->Australian
+auther->author
+authobiographic->autobiographic
+authobiography->autobiography
+authorative->authoritative
+authorites->authorities
+authorithy->authority
+authoritiers->authorities
+authoritive->authoritative
+authrorities->authorities
+autochtonous->autochthonous
+autoctonous->autochthonous
+automaticly->automatically
+automibile->automobile
+automonomous->autonomous
+autor->author
+autority->authority
+auxilary->auxiliary
+auxillaries->auxiliaries
+auxillary->auxiliary
+auxilliaries->auxiliaries
+auxilliary->auxiliary
+availabe->available
+availablity->availability
+availaible->available
+availble->available
+availiable->available
+availible->available
+avalable->available
+avalance->avalanche
+avaliable->available
+avation->aviation
+avengence->a vengeance
+averageed->averaged
+avilable->available
+awared->awarded
+awya->away
+azn->asian
+baceause->because
+backgorund->background
+backrounds->backgrounds
+bakc->back
+banannas->bananas
+bandwith->bandwidth
+bankrupcy->bankruptcy
+banruptcy->bankruptcy
+baout->about, bout
+basicaly->basically
+basicly->basically
+bcak->back
+beachead->beachhead
+beacuse->because
+beastiality->bestiality
+beatiful->beautiful
+beaurocracy->bureaucracy
+beaurocratic->bureaucratic
+beautyfull->beautiful
+becamae->became
+becames->becomes, became
+becasue->because
+beccause->because
+becomeing->becoming
+becomming->becoming
+becouse->because
+becuase->because
+bedore->before
+beeing->being
+befoer->before
+beggin->begin, begging
+begginer->beginner
+begginers->beginners
+beggining->beginning
+begginings->beginnings
+beggins->begins
+begining->beginning
+beginnig->beginning
+behavour->behavior, behaviour
+beleagured->beleaguered
+beleif->belief
+beleive->believe
+beleived->believed
+beleives->believes
+beleiving->believing
+beligum->belgium
+belive->believe
+belived->believed, beloved
+belives->believes, beliefs
+belligerant->belligerent
+bellweather->bellwether
+bemusemnt->bemusement
+beneficary->beneficiary
+beng->being
+benificial->beneficial
+benifit->benefit
+benifits->benefits
+bergamont->bergamot
+Bernouilli->Bernoulli
+beseige->besiege
+beseiged->besieged
+beseiging->besieging
+beteen->between
+betwen->between
+beween->between
+bewteen->between
+bilateraly->bilaterally
+billingualism->bilingualism
+binominal->binomial
+bizzare->bizarre
+blaim->blame
+blaimed->blamed
+blessure->blessing
+Blitzkreig->Blitzkrieg
+boaut->bout, boat, about
+bodydbuilder->bodybuilder
+bombardement->bombardment
+bombarment->bombardment
+bondary->boundary
+Bonnano->Bonanno
+borke->broke
+boundry->boundary
+bouyancy->buoyancy
+bouyant->buoyant
+boyant->buoyant
+Brasillian->Brazilian
+breakthough->breakthrough
+breakthroughts->breakthroughs
+breif->brief
+breifly->briefly
+brethen->brethren
+bretheren->brethren
+briliant->brilliant
+brillant->brilliant
+brimestone->brimstone
+Britian->Britain
+Brittish->British
+broacasted->broadcast
+broadacasting->broadcasting
+broady->broadly
+Buddah->Buddha
+Buddist->Buddhist
+buisness->business
+buisnessman->businessman
+buoancy->buoyancy
+buring->burying, burning, burin, during
+burried->buried
+busines->business
+busineses->business, businesses
+busness->business
+bussiness->business
+caculater->calculator
+cacuses->caucuses
+cahracters->characters
+calaber->caliber
+calander->calendar, calender, colander
+calculater->calculator
+calculs->calculus
+calenders->calendars
+caligraphy->calligraphy
+caluclate->calculate
+caluclated->calculated
+caluculate->calculate
+caluculated->calculated
+calulate->calculate
+calulated->calculated
+calulater->calculator
+Cambrige->Cambridge
+camoflage->camouflage
+campain->campaign
+campains->campaigns
+candadate->candidate
+candiate->candidate
+candidiate->candidate
+cannister->canister
+cannisters->canisters
+cannnot->cannot
+cannonical->canonical
+cannotation->connotation
+cannotations->connotations
+cant->cannot, can not, can't
+caost->coast
+caperbility->capability
+Capetown->Cape Town
+capible->capable
+captial->capital
+captued->captured
+capturd->captured
+carachter->character
+caracterized->characterized
+carcas->carcass, Caracas
+carefull->careful
+careing->caring
+carismatic->charismatic
+Carmalite->Carmelite
+Carnagie->Carnegie
+Carnagie-Mellon->Carnegie-Mellon
+carnege->carnage, Carnegie
+carnige->carnage, Carnegie
+Carnigie->Carnegie
+Carnigie-Mellon->Carnegie-Mellon
+carniverous->carnivorous
+carreer->career
+carrers->careers
+Carribbean->Caribbean
+Carribean->Caribbean
+cartdridge->cartridge
+Carthagian->Carthaginian
+carthographer->cartographer
+cartilege->cartilage
+cartilidge->cartilage
+cartrige->cartridge
+casette->cassette
+casion->caisson
+cassawory->cassowary
+cassowarry->cassowary
+casue->cause
+casued->caused
+casues->causes
+casuing->causing
+casulaties->casualties
+casulaty->casualty
+catagories->categories
+catagorized->categorized
+catagory->category
+Cataline->Catiline, Catalina
+catapillar->caterpillar
+catapillars->caterpillars
+catapiller->caterpillar
+catapillers->caterpillars
+catepillar->caterpillar
+catepillars->caterpillars
+catergorize->categorize
+catergorized->categorized
+caterpilar->caterpillar
+caterpilars->caterpillars
+caterpiller->caterpillar
+caterpillers->caterpillars
+cathlic->catholic
+catholocism->catholicism
+catterpilar->caterpillar
+catterpilars->caterpillars
+catterpillar->caterpillar
+catterpillars->caterpillars
+cattleship->battleship
+causalities->casualties
+Ceasar->Caesar
+Celcius->Celsius
+cellpading->cellpadding
+cementary->cemetery
+cemetarey->cemetery
+cemetaries->cemeteries
+cemetary->cemetery
+cencus->census
+censur->censor, censure
+cententenial->centennial
+centruies->centuries
+centruy->century
+centuties->centuries
+centuty->century
+ceratin->certain, keratin
+cerimonial->ceremonial
+cerimonies->ceremonies
+cerimonious->ceremonious
+cerimony->ceremony
+ceromony->ceremony
+certainity->certainty
+certian->certain
+cervial->cervical, servile, serval
+chalenging->challenging
+challange->challenge
+challanged->challenged
+challege->challenge
+Champange->Champagne
+changable->changeable
+charachter->character
+charachters->characters
+charactersistic->characteristic
+charactor->character
+charactors->characters
+charasmatic->charismatic
+charaterized->characterized
+chariman->chairman
+charistics->characteristics
+chasr->chaser, chase
+cheif->chief
+cheifs->chiefs
+chemcial->chemical
+chemcially->chemically
+chemestry->chemistry
+chemicaly->chemically
+childbird->childbirth
+childen->children
+choosen->chosen
+chracter->character
+chuch->church
+churchs->churches
+Cincinatti->Cincinnati
+Cincinnatti->Cincinnati
+circulaton->circulation
+circumsicion->circumcision
+circut->circuit
+ciricuit->circuit
+ciriculum->curriculum
+civillian->civilian
+claer->clear
+claerer->clearer
+claerly->clearly
+claimes->claims
+clas->class
+clasic->classic
+clasical->classical
+clasically->classically
+cleareance->clearance
+clera->clear, sclera
+clincial->clinical
+clinicaly->clinically
+cmo->com
+cmoputer->computer
+co-incided->coincided
+coctail->cocktail
+coform->conform
+cognizent->cognizant
+coincedentally->coincidentally
+colaborations->collaborations
+colateral->collateral
+colelctive->collective
+collaberative->collaborative
+collecton->collection
+collegue->colleague
+collegues->colleagues
+collonade->colonnade
+collonies->colonies
+collony->colony
+collosal->colossal
+colonizators->colonizers
+comander->commander, commandeer
+comando->commando
+comandos->commandos
+comany->company
+comapany->company
+comback->comeback
+combanations->combinations
+combinatins->combinations
+combusion->combustion
+comdemnation->condemnation
+comemmorates->commemorates
+comemoretion->commemoration
+comision->commission
+comisioned->commissioned
+comisioner->commissioner
+comisioning->commissioning
+comisions->commissions
+comission->commission
+comissioned->commissioned
+comissioner->commissioner
+comissioning->commissioning
+comissions->commissions
+comited->committed
+comiting->committing
+comitted->committed
+comittee->committee
+comitting->committing
+commandoes->commandos
+commedic->comedic
+commemerative->commemorative
+commemmorate->commemorate
+commemmorating->commemorating
+commerical->commercial
+commerically->commercially
+commericial->commercial
+commericially->commercially
+commerorative->commemorative
+comming->coming
+comminication->communication
+commision->commission
+commisioned->commissioned
+commisioner->commissioner
+commisioning->commissioning
+commisions->commissions
+commited->committed
+commitee->committee
+commiting->committing
+committe->committee
+committment->commitment
+committments->commitments
+commmemorated->commemorated
+commongly->commonly
+commonweath->commonwealth
+commuications->communications
+commuinications->communications
+communciation->communication
+communiation->communication
+communites->communities
+compability->compatibility
+comparision->comparison
+comparisions->comparisons
+comparitive->comparative
+comparitively->comparatively
+compatabilities->compatibilities
+compatability->compatibility
+compatable->compatible
+compatablities->compatibilities
+compatablity->compatibility
+compatiable->compatible
+compatiblities->compatibilities
+compatiblity->compatibility
+compeitions->competitions
+compensantion->compensation
+competance->competence
+competant->competent
+competative->competitive
+competion->competition, completion
+competitiion->competition
+competive->competitive
+competiveness->competitiveness
+comphrehensive->comprehensive
+compitent->competent
+completedthe->completed the
+completelyl->completely
+completetion->completion
+complier->compiler
+componant->component
+comprable->comparable
+comprimise->compromise
+compulsary->compulsory
+compulsery->compulsory
+computarized->computerized
+concensus->consensus
+concider->consider
+concidered->considered
+concidering->considering
+conciders->considers
+concieted->conceited
+concieved->conceived
+concious->conscious
+conciously->consciously
+conciousness->consciousness
+condamned->condemned
+condemmed->condemned
+condidtion->condition
+condidtions->conditions
+conditionsof->conditions of
+conected->connected
+conection->connection
+conesencus->consensus
+confidental->confidential
+confidentally->confidentially
+confids->confides
+configureable->configurable
+confortable->comfortable
+congradulations->congratulations
+congresional->congressional
+conived->connived
+conjecutre->conjecture
+conjuction->conjunction
+Conneticut->Connecticut
+conotations->connotations
+conquerd->conquered
+conquerer->conqueror
+conquerers->conquerors
+conqured->conquered
+conscent->consent
+consciouness->consciousness
+consdider->consider
+consdidered->considered
+consdiered->considered
+consectutive->consecutive
+consenquently->consequently
+consentrate->concentrate
+consentrated->concentrated
+consentrates->concentrates
+consept->concept
+consequentually->consequently
+consequeseces->consequences
+consern->concern
+conserned->concerned
+conserning->concerning
+conservitive->conservative
+consiciousness->consciousness
+consicousness->consciousness
+considerd->considered
+consideres->considered
+consious->conscious
+consistant->consistent
+consistantly->consistently
+consituencies->constituencies
+consituency->constituency
+consituted->constituted
+consitution->constitution
+consitutional->constitutional
+consolodate->consolidate
+consolodated->consolidated
+consonent->consonant
+consonents->consonants
+consorcium->consortium
+conspiracys->conspiracies
+conspiriator->conspirator
+constaints->constraints
+constanly->constantly
+constarnation->consternation
+constatn->constant
+constinually->continually
+constituant->constituent
+constituants->constituents
+constituion->constitution
+constituional->constitutional
+consttruction->construction
+constuction->construction
+contstruction->construction
+consulant->consultant
+consumate->consummate
+consumated->consummated
+contaiminate->contaminate
+containes->contains
+contamporaries->contemporaries
+contamporary->contemporary
+contempoary->contemporary
+contemporaneus->contemporaneous
+contempory->contemporary
+contendor->contender
+contibute->contribute
+contibuted->contributed
+contibutes->contributes
+contigent->contingent
+contined->continued
+continous->continuous
+continously->continuously
+continueing->continuing
+contravercial->controversial
+contraversy->controversy
+contributer->contributor
+contributers->contributors
+contritutions->contributions
+controled->controlled
+controling->controlling
+controll->control
+controlls->controls
+controvercial->controversial
+controvercy->controversy
+controveries->controversies
+controversal->controversial
+controversey->controversy
+controvertial->controversial
+controvery->controversy
+contruction->construction
+conveinent->convenient
+convenant->covenant
+convential->conventional
+convertables->convertibles
+convertion->conversion
+conviced->convinced
+convienient->convenient
+coordiantion->coordination
+coorperation->cooperation, corporation
+coorperations->corporations
+copmetitors->competitors
+coputer->computer
+copywrite->copyright
+coridal->cordial
+cornmitted->committed
+corosion->corrosion
+corparate->corporate
+corperations->corporations
+correcters->correctors
+correponding->corresponding
+correposding->corresponding
+correspondant->correspondent
+correspondants->correspondents
+corridoors->corridors
+corrispond->correspond
+corrispondant->correspondent
+corrispondants->correspondents
+corrisponded->corresponded
+corrisponding->corresponding
+corrisponds->corresponds
+costitution->constitution
+coucil->council
+coudl->could, cloud
+councellor->councillor, counselor, councilor
+councellors->councillors, counselors, councilors
+counries->countries
+countains->contains
+countires->countries
+countrie's->countries, countries', country's
+coururier->courier, couturier
+coverted->converted, covered, coveted
+cpoy->coy, copy
+creaeted->created
+creche->crèche
+creedence->credence
+critereon->criterion
+criterias->criteria
+criticists->critics
+critising->criticising, criticizing
+critisising->criticising
+critisism->criticism
+critisisms->criticisms
+critisize->criticise, criticize
+critisized->criticised, criticized
+critisizes->criticises, criticizes
+critisizing->criticising, criticizing
+critized->criticized
+critizing->criticizing
+crockodiles->crocodiles
+crowm->crown
+crtical->critical
+crticised->criticised
+crucifiction->crucifixion
+crusies->cruises
+crystalisation->crystallisation
+culiminating->culminating
+cumulatative->cumulative
+curch->church
+curcuit->circuit
+currenly->currently
+curriculem->curriculum
+cxan->cyan
+cyclinder->cylinder
+dacquiri->daiquiri
+daed->dead
+dael->deal, dial, dahl
+dalmation->dalmatian
+damenor->demeanor
+dammage->damage
+Dardenelles->Dardanelles
+daugher->daughter
+debateable->debatable
+decendant->descendant
+decendants->descendants
+decendent->descendant
+decendents->descendants
+decideable->decidable
+decidely->decidedly
+decieved->deceived
+decison->decision
+decomissioned->decommissioned
+decomposit->decompose
+decomposited->decomposed
+decompositing->decomposing
+decomposits->decomposes
+decress->decrees
+decribe->describe
+decribed->described
+decribes->describes
+decribing->describing
+dectect->detect
+defendent->defendant
+defendents->defendants
+deffensively->defensively
+deffine->define
+deffined->defined
+definance->defiance
+definate->definite
+definately->definitely
+definatly->definitely
+definetly->definitely
+definining->defining
+definit->definite
+definitly->definitely
+definiton->definition
+defintion->definition
+degrate->degrade
+delagates->delegates
+delapidated->dilapidated
+delerious->delirious
+delevopment->development
+deliberatly->deliberately
+delusionally->delusively
+demenor->demeanor
+demographical->demographic
+demolision->demolition
+demorcracy->democracy
+demostration->demonstration
+denegrating->denigrating
+densly->densely
+deparment->department
+deparmental->departmental
+deparments->departments
+dependance->dependence
+dependancy->dependency
+dependant->dependent
+deram->dram, dream
+deriviated->derived
+derivitive->derivative
+derogitory->derogatory
+descendands->descendants
+descibed->described
+descision->decision
+descisions->decisions
+descriibes->describes
+descripters->descriptors
+descripton->description
+desctruction->destruction
+descuss->discuss
+desgined->designed
+deside->decide
+desigining->designing
+desinations->destinations
+desintegrated->disintegrated
+desintegration->disintegration
+desireable->desirable
+desitned->destined
+desktiop->desktop
+desorder->disorder
+desoriented->disoriented
+desparate->desperate, disparate
+despict->depict
+despiration->desperation
+dessicated->desiccated
+dessigned->designed
+destablized->destabilized
+destory->destroy
+detailled->detailed
+detatched->detached
+deteoriated->deteriorated
+deteriate->deteriorate
+deterioriating->deteriorating
+determinining->determining
+detremental->detrimental
+devasted->devastated
+develope->develop
+developement->development
+developped->developed
+develpment->development
+devels->delves
+devestated->devastated
+devestating->devastating
+devide->divide
+devided->divided
+devistating->devastating
+devolopement->development
+diablical->diabolical
+diamons->diamonds
+diaster->disaster
+dichtomy->dichotomy
+diconnects->disconnects
+dicover->discover
+dicovered->discovered
+dicovering->discovering
+dicovers->discovers
+dicovery->discovery
+dicussed->discussed
+didnt->didn't
+diea->idea, die
+dieing->dying, dyeing
+dieties->deities
+diety->deity
+diferent->different
+diferrent->different
+differentiatiations->differentiations
+differnt->different
+difficulity->difficulty
+diffrent->different
+dificulties->difficulties
+dificulty->difficulty
+dimenions->dimensions
+dimention->dimension
+dimentional->dimensional
+dimentions->dimensions
+dimesnional->dimensional
+diminuitive->diminutive
+dimunitive->diminutive
+diosese->diocese
+diphtong->diphthong
+diphtongs->diphthongs
+diplomancy->diplomacy
+dipthong->diphthong
+dipthongs->diphthongs
+dirived->derived
+disagreeed->disagreed
+disapeared->disappeared
+disapointing->disappointing
+disappearred->disappeared
+disaproval->disapproval
+disasterous->disastrous
+disatisfaction->dissatisfaction
+disatisfied->dissatisfied
+disatrous->disastrous
+discontentment->discontent
+discribe->describe
+discribed->described
+discribes->describes
+discribing->describing
+disctinction->distinction
+disctinctive->distinctive
+disemination->dissemination
+disenchanged->disenchanted
+disiplined->disciplined
+disobediance->disobedience
+disobediant->disobedient
+disolved->dissolved
+disover->discover
+dispair->despair
+disparingly->disparagingly
+dispence->dispense
+dispenced->dispensed
+dispencing->dispensing
+dispicable->despicable
+dispite->despite
+dispostion->disposition
+disproportiate->disproportionate
+disputandem->disputandum
+disricts->districts
+dissagreement->disagreement
+dissapear->disappear
+dissapearance->disappearance
+dissapeared->disappeared
+dissapearing->disappearing
+dissapears->disappears
+dissappear->disappear
+dissappears->disappears
+dissappointed->disappointed
+dissarray->disarray
+dissobediance->disobedience
+dissobediant->disobedient
+dissobedience->disobedience
+dissobedient->disobedient
+distiction->distinction
+distingish->distinguish
+distingished->distinguished
+distingishes->distinguishes
+distingishing->distinguishing
+distingquished->distinguished
+distrubution->distribution
+distruction->destruction
+distructive->destructive
+ditributed->distributed
+diversed->diverse, diverged
+divice->device
+divison->division
+divisons->divisions
+dum->dumb
+doccument->document
+doccumented->documented
+doccuments->documents
+docrines->doctrines
+doctines->doctrines
+documenatry->documentary
+doens->does
+doesnt->doesn't
+doign->doing
+dominaton->domination
+dominent->dominant
+dominiant->dominant
+donig->doing
+dosen't->doesn't
+doub->doubt, daub
+doulbe->double
+dowloads->downloads
+dramtic->dramatic
+draughtman->draughtsman
+Dravadian->Dravidian
+dreasm->dreams
+driectly->directly
+drnik->drink
+druming->drumming
+drummless->drumless
+dupicate->duplicate
+durig->during
+durring->during
+duting->during
+dyas->dryas
+eahc->each
+ealier->earlier
+earlies->earliest
+earnt->earned
+ecclectic->eclectic
+eceonomy->economy
+ecidious->deciduous
+eclispe->eclipse
+ecomonic->economic
+ect->etc
+eearly->early
+efel->evil
+effeciency->efficiency
+effecient->efficient
+effeciently->efficiently
+efficency->efficiency
+efficent->efficient
+efficently->efficiently
+efford->effort, afford
+effords->efforts, affords
+effulence->effluence
+eigth->eighth, eight
+eiter->either
+elction->election
+electic->eclectic, electric
+electon->election, electron
+electrial->electrical
+electricly->electrically
+electricty->electricity
+elementay->elementary
+eleminated->eliminated
+eleminating->eliminating
+eles->eels
+eletricity->electricity
+elicided->elicited
+eligable->eligible
+elimentary->elementary
+ellected->elected
+elphant->elephant
+embarass->embarrass
+embarassed->embarrassed
+embarassing->embarrassing
+embarassment->embarrassment
+embargos->embargoes
+embarras->embarrass
+embarrased->embarrassed
+embarrasing->embarrassing
+embarrasment->embarrassment
+embezelled->embezzled
+emblamatic->emblematic
+eminate->emanate
+eminated->emanated
+emision->emission
+emited->emitted
+emiting->emitting
+emition->emission, emotion
+emmediately->immediately
+emmigrated->emigrated, immigrated
+emminent->eminent, imminent
+emminently->eminently
+emmisaries->emissaries
+emmisarries->emissaries
+emmisarry->emissary
+emmisary->emissary
+emmision->emission
+emmisions->emissions
+emmited->emitted
+emmiting->emitting
+emmitted->emitted
+emmitting->emitting
+emnity->enmity
+emperical->empirical
+emphaised->emphasised
+emphsis->emphasis
+emphysyma->emphysema
+empirial->empirical, imperial
+emprisoned->imprisoned
+enameld->enameled
+enchancement->enhancement
+encouraing->encouraging
+encryptiion->encryption
+encylopedia->encyclopedia
+endevors->endeavors
+endevour->endeavour
+endig->ending
+endolithes->endoliths
+enduce->induce
+ened->need
+enflamed->inflamed
+enforceing->enforcing
+engagment->engagement
+engeneer->engineer
+engeneering->engineering
+engieneer->engineer
+engieneers->engineers
+enlargment->enlargement
+enlargments->enlargements
+Enlish->English, enlist
+enourmous->enormous
+enourmously->enormously
+ensconsed->ensconced
+entaglements->entanglements
+enteratinment->entertainment
+enthusiatic->enthusiastic
+entitity->entity
+entitlied->entitled
+entrepeneur->entrepreneur
+entrepeneurs->entrepreneurs
+enviorment->environment
+enviormental->environmental
+enviormentally->environmentally
+enviorments->environments
+enviornment->environment
+enviornmental->environmental
+enviornmentalist->environmentalist
+enviornmentally->environmentally
+enviornments->environments
+enviroment->environment
+enviromental->environmental
+enviromentalist->environmentalist
+enviromentally->environmentally
+enviroments->environments
+envolutionary->evolutionary
+envrionments->environments
+enxt->next
+epidsodes->episodes
+epsiode->episode
+equialent->equivalent
+equilibium->equilibrium
+equilibrum->equilibrium
+equiped->equipped
+equippment->equipment
+equitorial->equatorial
+equivelant->equivalent
+equivelent->equivalent
+equivilant->equivalent
+equivilent->equivalent
+equivlalent->equivalent
+erally->orally, really
+eratic->erratic
+eratically->erratically
+eraticly->erratically
+erested->arrested, erected
+errupted->erupted
+esential->essential
+esitmated->estimated
+esle->else
+especialy->especially
+essencial->essential
+essense->essence
+essentail->essential
+essentialy->essentially
+essentual->essential
+essesital->essential
+estabishes->establishes
+establising->establishing
+ethnocentricm->ethnocentrism
+ethose->those, ethos
+Europian->European
+Europians->Europeans
+Eurpean->European
+Eurpoean->European
+evenhtually->eventually
+eventally->eventually
+eventhough->even though
+eventially->eventually
+eventualy->eventually
+everthing->everything
+everytime->every time
+everyting->everything
+eveyr->every
+evidentally->evidently
+exagerate->exaggerate
+exagerated->exaggerated
+exagerates->exaggerates
+exagerating->exaggerating
+exagerrate->exaggerate
+exagerrated->exaggerated
+exagerrates->exaggerates
+exagerrating->exaggerating
+examinated->examined
+exampt->exempt
+exapansion->expansion
+excact->exact
+excange->exchange
+excecute->execute
+excecuted->executed
+excecutes->executes
+excecuting->executing
+excecution->execution
+excedded->exceeded
+excelent->excellent
+excell->excel
+excellance->excellence
+excellant->excellent
+excells->excels
+excercise->exercise
+exchanching->exchanging
+excisted->existed
+exculsivly->exclusively
+execising->exercising
+exection->execution
+exectued->executed
+exeedingly->exceedingly
+exelent->excellent
+exellent->excellent
+exemple->example
+exept->except
+exeptional->exceptional
+exerbate->exacerbate
+exerbated->exacerbated
+exerciese->exercises
+exerpt->excerpt
+exerpts->excerpts
+exersize->exercise
+exerternal->external
+exhalted->exalted
+exhibtion->exhibition
+exibition->exhibition
+exibitions->exhibitions
+exicting->exciting
+exinct->extinct
+existance->existence
+existant->existent
+existince->existence
+exliled->exiled
+exludes->excludes
+exmaple->example
+exonorate->exonerate
+exoskelaton->exoskeleton
+expalin->explain
+expatriot->expatriate
+expeced->expected
+expecially->especially
+expeditonary->expeditionary
+expeiments->experiments
+expell->expel
+expells->expels
+experiance->experience
+experianced->experienced
+expiditions->expeditions
+expierence->experience
+explaination->explanation
+explaning->explaining
+explictly->explicitly
+exploititive->exploitative
+explotation->exploitation
+expropiated->expropriated
+expropiation->expropriation
+exressed->expressed
+extemely->extremely
+extention->extension
+extentions->extensions
+extered->exerted
+extermist->extremist
+extint->extinct, extant
+extradiction->extradition
+extraterrestial->extraterrestrial
+extraterrestials->extraterrestrials
+extravagent->extravagant
+extrememly->extremely
+extremeophile->extremophile
+extremly->extremely
+extrordinarily->extraordinarily
+extrordinary->extraordinary
+eyar->year, eyas
+eyars->years, eyas
+eyasr->years, eyas
+faciliate->facilitate
+faciliated->facilitated
+faciliates->facilitates
+facilites->facilities
+facillitate->facilitate
+facinated->fascinated
+facist->fascist
+familes->families
+familliar->familiar
+famoust->famous
+fanatism->fanaticism
+Farenheit->Fahrenheit
+fatc->fact
+faught->fought
+favoutrable->favourable
+feasable->feasible
+Febuary->February
+Feburary->February
+fedreally->federally
+feromone->pheromone
+fertily->fertility
+fianite->finite
+fianlly->finally
+ficticious->fictitious
+fictious->fictitious
+fidn->find
+fiel->feel, field, file, phial
+fiels->feels, fields, files, phials
+fiercly->fiercely
+fightings->fighting
+filiament->filament
+fimilies->families
+finacial->financial
+finaly->finally
+financialy->financially
+firends->friends
+firts->flirts, first
+fisionable->fissionable
+flamable->flammable
+flawess->flawless
+fleed->fled, freed
+Flemmish->Flemish
+florescent->fluorescent
+flourescent->fluorescent
+flourine->fluorine
+fluorish->flourish
+flourishment->flourishing
+follwoing->following
+folowing->following
+fomed->formed
+fomr->from, form
+fonetic->phonetic
+fontrier->fontier
+foootball->football
+forbad->forbade
+forbiden->forbidden
+foreward->foreword
+forfiet->forfeit
+forhead->forehead
+foriegn->foreign
+Formalhaut->Fomalhaut
+formallize->formalize
+formallized->formalized
+formaly->formally, formerly
+formelly->formerly
+formidible->formidable
+formost->foremost
+forsaw->foresaw
+forseeable->foreseeable
+fortelling->foretelling
+forunner->forerunner
+foucs->focus
+foudn->found
+fougth->fought
+foundaries->foundries
+foundary->foundry
+Foundland->Newfoundland
+fourties->forties
+fourty->forty
+fouth->fourth
+foward->forward
+Fransiscan->Franciscan
+Fransiscans->Franciscans
+freind->friend
+freindly->friendly
+frequentily->frequently
+frome->from
+fromed->formed
+froniter->frontier
+fucntion->function
+fucntioning->functioning
+fufill->fulfill
+fufilled->fulfilled
+fulfiled->fulfilled
+fullfill->fulfill
+fullfilled->fulfilled
+fundametal->fundamental
+fundametals->fundamentals
+funguses->fungi
+funtion->function
+furuther->further
+futher->further
+futhermore->furthermore
+futhroc->futhark, futhorc
+gae->game, Gael, gale
+galatic->galactic
+Galations->Galatians
+gallaxies->galaxies
+galvinized->galvanized
+Gameboy->Game Boy
+ganerate->generate
+ganes->games
+ganster->gangster
+garantee->guarantee
+garanteed->guaranteed
+garantees->guarantees
+gardai->gardaí
+garnison->garrison
+gauarana->guaraná
+gaurantee->guarantee
+gauranteed->guaranteed
+gaurantees->guarantees
+gaurd->guard, gourd
+gaurentee->guarantee
+gaurenteed->guaranteed
+gaurentees->guarantees
+geneological->genealogical
+geneologies->genealogies
+geneology->genealogy
+generaly->generally
+generatting->generating
+genialia->genitalia
+geographicial->geographical
+geometrician->geometer
+geometricians->geometers
+gerat->great
+Ghandi->Gandhi
+glight->flight
+gnawwed->gnawed
+godess->goddess
+godesses->goddesses
+Godounov->Godunov
+gogin->going, Gauguin
+goign->going
+gonig->going
+Gothenberg->Gothenburg
+Gottleib->Gottlieb
+gouvener->governor
+govement->government
+govenment->government
+govenrment->government
+goverance->governance
+goverment->government
+govermental->governmental
+governer->governor
+governmnet->government
+govorment->government
+govormental->governmental
+govornment->government
+gracefull->graceful
+graet->great
+grafitti->graffiti
+gramatically->grammatically
+grammaticaly->grammatically
+grammer->grammar
+grat->great
+gratuitious->gratuitous
+greatful->grateful
+greatfully->gratefully
+greif->grief
+gridles->griddles
+gropu->group
+grwo->grow
+Guaduloupe->Guadalupe, Guadeloupe
+Guadulupe->Guadalupe, Guadeloupe
+guage->gauge
+guarentee->guarantee
+guarenteed->guaranteed
+guarentees->guarantees
+Guatamala->Guatemala
+Guatamalan->Guatemalan
+guerrila->guerrilla
+guerrilas->guerrillas
+guidence->guidance
+Guilia->Giulia
+Guilio->Giulio
+Guiness->Guinness
+Guiseppe->Giuseppe
+gunanine->guanine
+gurantee->guarantee
+guranteed->guaranteed
+gurantees->guarantees
+guttaral->guttural
+gutteral->guttural
+habaeus->habeas
+habeus->habeas
+Habsbourg->Habsburg
+haemorrage->haemorrhage
+haev->have, heave
+halarious->hilarious
+Hallowean->Hallowe'en, Halloween
+halp->help
+hapen->happen
+hapened->happened
+hapening->happening
+happend->happened
+happended->happened
+happenned->happened
+harased->harassed
+harases->harasses
+harasment->harassment
+harasments->harassments
+harassement->harassment
+harras->harass
+harrased->harassed
+harrases->harasses
+harrasing->harassing
+harrasment->harassment
+harrasments->harassments
+harrassed->harassed
+harrasses->harassed
+harrassing->harassing
+harrassment->harassment
+harrassments->harassments
+hasnt->hasn't
+Hatian->Haitian
+haviest->heaviest
+headquarer->headquarter
+headquater->headquarter
+headquatered->headquartered
+headquaters->headquarters
+healthercare->healthcare
+heared->heard
+heathy->healthy
+Heidelburg->Heidelberg
+heigher->higher
+heirarchy->hierarchy
+heiroglyphics->hieroglyphics
+helment->helmet
+helpfull->helpful
+helpped->helped
+hemmorhage->hemorrhage
+herad->heard, Hera
+heridity->heredity
+heroe->hero
+heros->heroes
+hertiage->heritage
+hertzs->hertz
+hesistant->hesitant
+heterogenous->heterogeneous
+hieght->height
+hierachical->hierarchical
+hierachies->hierarchies
+hierachy->hierarchy
+hierarcical->hierarchical
+hierarcy->hierarchy
+hieroglph->hieroglyph
+hieroglphs->hieroglyphs
+higer->higher
+higest->highest
+higway->highway
+hillarious->hilarious
+himselv->himself
+hinderance->hindrance
+hinderence->hindrance
+hindrence->hindrance
+hipopotamus->hippopotamus
+hismelf->himself
+histocompatability->histocompatibility
+historicians->historians
+hitsingles->hit singles
+holf->hold
+holliday->holiday
+homestate->home state
+homogeneize->homogenize
+homogeneized->homogenized
+honory->honorary
+horrifing->horrifying
+hosited->hoisted
+hospitible->hospitable
+hounour->honour
+housr->hours, house
+howver->however
+hsitorians->historians
+hstory->history
+hten->then, hen, the
+htere->there, here
+htey->they
+htikn->think
+hting->thing
+htink->think
+htis->this
+humer->humor, humour
+humerous->humorous, humerus
+huminoid->humanoid
+humoural->humoral
+humurous->humorous
+husban->husband
+hvae->have
+hvaing->having
+hvea->have, heave
+hwihc->which
+hwile->while
+hwole->whole
+hydogen->hydrogen
+hydropile->hydrophile
+hydropilic->hydrophilic
+hydropobe->hydrophobe
+hydropobic->hydrophobic
+hygeine->hygiene
+hypocracy->hypocrisy
+hypocrasy->hypocrisy
+hypocricy->hypocrisy
+hypocrit->hypocrite
+hypocrits->hypocrites
+iconclastic->iconoclastic
+idaeidae->idea
+idaes->ideas
+idealogies->ideologies
+idealogy->ideology
+identicial->identical
+identifers->identifiers
+ideosyncratic->idiosyncratic
+idesa->ideas, ides
+idiosyncracy->idiosyncrasy
+Ihaca->Ithaca
+illegimacy->illegitimacy
+illegitmate->illegitimate
+illess->illness
+illiegal->illegal
+illution->illusion
+ilness->illness
+ilogical->illogical
+imagenary->imaginary
+imagin->imagine
+imaginery->imaginary, imagery
+imanent->eminent, imminent
+imcomplete->incomplete
+imediately->immediately
+imense->immense
+imigrant->emigrant, immigrant
+imigrated->emigrated, immigrated
+imigration->emigration, immigration
+iminent->eminent, imminent, immanent
+immediatley->immediately
+immediatly->immediately
+immidately->immediately
+immidiately->immediately
+immitate->imitate
+immitated->imitated
+immitating->imitating
+immitator->imitator
+immunosupressant->immunosuppressant
+impecabbly->impeccably
+impedence->impedance
+implamenting->implementing
+impliment->implement
+implimented->implemented
+imploys->employs
+importamt->important
+impressario->impresario
+imprioned->imprisoned
+imprisonned->imprisoned
+improvision->improvisation
+improvments->improvements
+inablility->inability
+inaccessable->inaccessible
+inadiquate->inadequate
+inadquate->inadequate
+inadvertant->inadvertent
+inadvertantly->inadvertently
+inagurated->inaugurated
+inaguration->inauguration
+inappropiate->inappropriate
+inaugures->inaugurates
+inbalance->imbalance
+inbalanced->imbalanced
+inbetween->between
+incarcirated->incarcerated
+incidentially->incidentally
+incidently->incidentally
+inclreased->increased
+includ->include
+includng->including
+incompatabilities->incompatibilities
+incompatability->incompatibility
+incompatable->incompatible
+incompatablities->incompatibilities
+incompatablity->incompatibility
+incompatiblities->incompatibilities
+incompatiblity->incompatibility
+incompetance->incompetence
+incompetant->incompetent
+incomptable->incompatible
+incomptetent->incompetent
+inconsistant->inconsistent
+incoroporated->incorporated
+incorperation->incorporation
+incorportaed->incorporated
+incorprates->incorporates
+incorruptable->incorruptible
+incramentally->incrementally
+increadible->incredible
+incredable->incredible
+inctroduce->introduce
+inctroduced->introduced
+incuding->including
+incunabla->incunabula
+indefinately->indefinitely
+indefineable->undefinable
+indefinitly->indefinitely
+indentical->identical
+indepedantly->independently
+indepedence->independence
+independance->independence
+independant->independent
+independantly->independently
+independece->independence
+independendet->independent
+indespensable->indispensable
+indespensible->indispensable
+indictement->indictment
+indigineous->indigenous
+indipendence->independence
+indipendent->independent
+indipendently->independently
+indispensible->indispensable
+indisputible->indisputable
+indisputibly->indisputably
+indite->indict
+individualy->individually
+indpendent->independent
+indpendently->independently
+indulgue->indulge
+indutrial->industrial
+indviduals->individuals
+inefficienty->inefficiently
+inevatible->inevitable
+inevitible->inevitable
+inevititably->inevitably
+infalability->infallibility
+infallable->infallible
+infectuous->infectious
+infered->inferred
+infilitrate->infiltrate
+infilitrated->infiltrated
+infilitration->infiltration
+infinit->infinite
+inflamation->inflammation
+influencial->influential
+influented->influenced
+infomation->information
+informtion->information
+infrantryman->infantryman
+infrigement->infringement
+ingenius->ingenious
+ingreediants->ingredients
+inhabitans->inhabitants
+inherantly->inherently
+inheritage->heritage, inheritance
+inheritence->inheritance
+inital->initial
+initally->initially
+initation->initiation
+initiaitive->initiative
+inlcuding->including
+inmigrant->immigrant
+inmigrants->immigrants
+innoculated->inoculated
+inocence->innocence
+inofficial->unofficial
+inot->into
+inpeach->impeach
+inpolite->impolite
+inprisonment->imprisonment
+inproving->improving
+insectiverous->insectivorous
+insensative->insensitive
+inseperable->inseparable
+insistance->insistence
+insitution->institution
+insitutions->institutions
+inspite->in spite, inspire
+instade->instead
+instatance->instance
+institue->institute
+instuction->instruction
+instuments->instruments
+instutionalized->institutionalized
+instutions->intuitions
+insurence->insurance
+intelectual->intellectual
+inteligence->intelligence
+inteligent->intelligent
+intenational->international
+intented->intended, indented
+intepretation->interpretation
+intepretator->interpretor
+interational->international
+interbread->interbreed, interbred
+interchangable->interchangeable
+interchangably->interchangeably
+intercontinetal->intercontinental
+intered->interred, interned
+interelated->interrelated
+interferance->interference
+interfereing->interfering
+intergrated->integrated
+intergration->integration
+interm->interim
+internation->international
+interpet->interpret
+interrim->interim
+interrugum->interregnum
+intertaining->entertaining
+interupt->interrupt
+intervines->intervenes
+intevene->intervene
+intial->initial
+intially->initially
+intrduced->introduced
+intrest->interest
+introdued->introduced
+intruduced->introduced
+intrument->instrument
+intrumental->instrumental
+intruments->instruments
+intrusted->entrusted
+intutive->intuitive
+intutively->intuitively
+inudstry->industry
+inumerable->enumerable, innumerable
+inventer->inventor
+invertibrates->invertebrates
+investingate->investigate
+involvment->involvement
+irelevent->irrelevant
+iresistable->irresistible
+iresistably->irresistibly
+iresistible->irresistible
+iresistibly->irresistibly
+iritable->irritable
+iritated->irritated
+ironicly->ironically
+irregardless->regardless
+irrelevent->irrelevant
+irreplacable->irreplaceable
+irresistable->irresistible
+irresistably->irresistibly
+isnt->isn't
+Israelies->Israelis
+issueing->issuing
+itnroduced->introduced
+iunior->junior
+iwll->will
+iwth->with
+Janurary->January
+Januray->January
+Japanes->Japanese
+jaques->jacques
+jeapardy->jeopardy
+jewllery->jewellery
+Johanine->Johannine
+jorunal->journal
+Jospeh->Joseph
+jouney->journey
+journied->journeyed
+journies->journeys
+jstu->just
+jsut->just
+Juadaism->Judaism
+Juadism->Judaism
+judical->judicial
+judisuary->judiciary
+juducial->judicial
+juristiction->jurisdiction
+juristictions->jurisdictions
+kindergarden->kindergarten
+klenex->kleenex
+knifes->knives
+knive->knife
+knowlege->knowledge
+knowlegeable->knowledgeable
+knwo->know
+knwos->knows
+konw->know
+konws->knows
+kwno->know
+labatory->lavatory, laboratory
+labled->labelled, labeled
+labratory->laboratory
+laguage->language
+laguages->languages
+larg->large
+largst->largest
+larrry->larry
+lastr->last
+lattitude->latitude
+launchs->launch, launches
+launhed->launched
+lavae->larvae
+layed->laid
+lazyness->laziness
+leage->league
+leanr->lean, learn, leaner
+leathal->lethal
+lefted->left
+legitamate->legitimate
+legitmate->legitimate
+leibnitz->leibniz
+lenght->length
+leran->learn
+lerans->learns
+leutenant->lieutenant
+levetate->levitate
+levetated->levitated
+levetates->levitates
+levetating->levitating
+levle->level
+liasion->liaison
+liason->liaison
+liasons->liaisons
+libary->library
+libell->libel
+libguistic->linguistic
+libguistics->linguistics
+libitarianisn->libertarianism
+lible->libel, liable
+lieing->lying
+liek->like
+liekd->liked
+liesure->leisure
+lieuenant->lieutenant
+lieved->lived
+liftime->lifetime
+lightyear->light year
+lightyears->light years
+likelyhood->likelihood
+linnaena->linnaean
+lippizaner->lipizzaner
+liquify->liquefy
+liscense->license, licence
+lisence->license, licence
+lisense->license, licence
+listners->listeners
+litature->literature
+literaly->literally
+literture->literature
+littel->little
+litterally->literally
+liuke->like
+livley->lively
+lmits->limits
+loev->love
+lonelyness->loneliness
+longitudonal->longitudinal
+lonley->lonely
+lonly->lonely, only
+loosing->losing
+lotharingen->lothringen
+lsat->last
+lukid->likud
+lveo->love
+lvoe->love
+Lybia->Libya
+maching->machine, marching, matching
+mackeral->mackerel
+magasine->magazine
+magincian->magician
+magnificient->magnificent
+magolia->magnolia
+mailny->mainly
+maintainance->maintenance
+maintainence->maintenance
+maintance->maintenance
+maintenence->maintenance
+maintinaing->maintaining
+maintioned->mentioned
+majoroty->majority
+maked->marked, made
+makse->makes
+Malcom->Malcolm
+maltesian->Maltese
+mamal->mammal
+mamalian->mammalian
+managable->manageable, manageably
+managment->management
+maneouvre->manoeuvre
+maneouvred->manoeuvred
+maneouvres->manoeuvres
+maneouvring->manoeuvring
+manisfestations->manifestations
+manoeuverability->maneuverability
+manouver->maneuver, manoeuvre
+manouverability->maneuverability, manoeuvrability, manoeuverability
+manouverable->maneuverable, manoeuvrable
+manouvers->maneuvers, manoeuvres
+mantained->maintained
+manuever->maneuver, manoeuvre
+manuevers->maneuvers, manoeuvres
+manufacturedd->manufactured
+manufature->manufacture
+manufatured->manufactured
+manufaturing->manufacturing
+manuver->maneuver
+mariage->marriage
+marjority->majority
+markes->marks
+marketting->marketing
+marmelade->marmalade
+marrage->marriage
+marraige->marriage
+marrtyred->martyred
+marryied->married
+Massachussets->Massachusetts
+Massachussetts->Massachusetts
+massmedia->mass media
+masterbation->masturbation
+mataphysical->metaphysical
+materalists->materialist
+mathamatics->mathematics
+mathematican->mathematician
+mathematicas->mathematics
+matheticians->mathematicians
+mathmatically->mathematically
+mathmatician->mathematician
+mathmaticians->mathematicians
+mccarthyst->mccarthyist
+mchanics->mechanics
+meaninng->meaning
+mear->wear, mere, mare
+mechandise->merchandise
+medacine->medicine
+medeival->medieval
+medevial->medieval
+mediciney->mediciny
+medievel->medieval
+mediterainnean->mediterranean
+Mediteranean->Mediterranean
+meerkrat->meerkat
+melieux->milieux
+membranaphone->membranophone
+memeber->member
+menally->mentally
+meranda->veranda, Miranda
+mercentile->mercantile
+messanger->messenger
+messenging->messaging
+metalic->metallic
+metalurgic->metallurgic
+metalurgical->metallurgical
+metalurgy->metallurgy
+metamorphysis->metamorphosis
+metaphoricial->metaphorical
+meterologist->meteorologist
+meterology->meteorology
+methaphor->metaphor
+methaphors->metaphors
+Michagan->Michigan
+micoscopy->microscopy
+midwifes->midwives
+mileau->milieu
+milennia->millennia
+milennium->millennium
+mileu->milieu
+miliary->military
+milion->million
+miliraty->military
+millenia->millennia
+millenial->millennial
+millenialism->millennialism
+millenium->millennium
+millepede->millipede
+millioniare->millionaire
+millitary->military
+millon->million
+miltary->military
+minature->miniature
+minerial->mineral
+miniscule->minuscule
+ministery->ministry
+minstries->ministries
+minstry->ministry
+minumum->minimum
+mirrorred->mirrored
+miscelaneous->miscellaneous
+miscellanious->miscellaneous
+miscellanous->miscellaneous
+mischeivous->mischievous
+mischevious->mischievous
+mischievious->mischievous
+misdameanor->misdemeanor
+misdameanors->misdemeanors
+misdemenor->misdemeanor
+misdemenors->misdemeanors
+misfourtunes->misfortunes
+misile->missile
+Misouri->Missouri
+mispell->misspell
+mispelled->misspelled
+mispelling->misspelling
+missen->mizzen
+Missisipi->Mississippi
+Missisippi->Mississippi
+missle->missile
+missonary->missionary
+misterious->mysterious
+mistery->mystery
+misteryous->mysterious
+mkae->make
+mkaes->makes
+mkaing->making
+mkea->make
+moderm->modem
+modle->model
+moent->moment
+moeny->money
+mohammedans->muslims
+moil->mohel,soil
+moleclues->molecules
+momento->memento
+monestaries->monasteries
+monestary->monastery, monetary
+monickers->monikers
+monolite->monolithic
+Monserrat->Montserrat
+montains->mountains
+montanous->mountainous
+Montnana->Montana
+monts->months
+montypic->monotypic
+moreso->more, more so
+morgage->mortgage
+Morisette->Morissette
+Morrisette->Morissette
+morroccan->moroccan
+morrocco->morocco
+morroco->morocco
+mortage->mortgage
+mosture->moisture
+motiviated->motivated
+mounth->month
+movei->movie
+movment->movement
+mroe->more
+mucuous->mucous
+muder->murder
+mudering->murdering
+muhammadan->muslim
+multicultralism->multiculturalism
+multipled->multiplied
+multiplers->multipliers
+munbers->numbers
+muncipalities->municipalities
+muncipality->municipality
+munnicipality->municipality
+muscels->mussels, muscles
+muscial->musical
+muscician->musician
+muscicians->musicians
+mutiliated->mutilated
+myraid->myriad
+mysef->myself
+mysogynist->misogynist
+mysogyny->misogyny
+mysterous->mysterious
+Mythraic->Mithraic
+naieve->naive
+Naploeon->Napoleon
+Napolean->Napoleon
+Napoleonian->Napoleonic
+naturaly->naturally
+naturely->naturally
+naturual->natural
+naturually->naturally
+Nazereth->Nazareth
+neccesarily->necessarily
+neccesary->necessary
+neccessarily->necessarily
+neccessary->necessary
+neccessities->necessities
+necesarily->necessarily
+necesary->necessary
+necessiate->necessitate
+neglible->negligible
+negligable->negligible
+negociate->negotiate
+negociation->negotiation
+negociations->negotiations
+negotation->negotiation
+neice->niece, nice
+neigborhood->neighborhood
+neigbour->neighbour, neighbor
+neigbourhood->neighbourhood
+neigbouring->neighbouring, neighboring
+neigbours->neighbours, neighbors
+neolitic->neolithic
+nessasarily->necessarily
+nessecary->necessary
+nestin->nesting
+neverthless->nevertheless
+newletters->newsletters
+Newyorker->New Yorker
+nickle->nickel
+nightfa;;->nightfall
+nightime->nighttime
+nineth->ninth
+ninteenth->nineteenth
+ninties->1990s
+ninty->ninety
+nkow->know
+nkwo->know
+nmae->name
+noncombatents->noncombatants
+nonsence->nonsense
+nontheless->nonetheless
+noone->no one
+norhern->northern
+northen->northern
+northereastern->northeastern
+notabley->notably
+noteable->notable
+noteably->notably
+noteriety->notoriety
+noth->north
+nothern->northern
+noticable->noticeable
+noticably->noticeably
+noticeing->noticing
+noticible->noticeable
+notwhithstanding->notwithstanding
+noveau->nouveau
+Novermber->November
+nowdays->nowadays
+nowe->now
+nto->not
+nucular->nuclear
+nuculear->nuclear
+nuisanse->nuisance
+Nullabour->Nullarbor
+numberous->numerous
+Nuremburg->Nuremberg
+nusance->nuisance
+nutritent->nutrient
+nutritents->nutrients
+nuturing->nurturing
+obediance->obedience
+obediant->obedient
+obession->obsession
+obssessed->obsessed
+obstacal->obstacle
+obstancles->obstacles
+obstruced->obstructed
+ocasion->occasion
+ocasional->occasional
+ocasionally->occasionally
+ocasionaly->occasionally
+ocasioned->occasioned
+ocasions->occasions
+ocassion->occasion
+ocassional->occasional
+ocassionally->occasionally
+ocassionaly->occasionally
+ocassioned->occasioned
+ocassions->occasions
+occaison->occasion
+occassion->occasion
+occassional->occasional
+occassionally->occasionally
+occassionaly->occasionally
+occassioned->occasioned
+occassions->occasions
+occationally->occasionally
+occour->occur
+occurance->occurrence
+occurances->occurrences
+occured->occurred
+occurence->occurrence
+occurences->occurrences
+occuring->occurring
+occurr->occur
+occurrance->occurrence
+occurrances->occurrences
+octohedra->octahedra
+octohedral->octahedral
+octohedron->octahedron
+ocuntries->countries
+ocuntry->country
+ocurr->occur
+ocurrance->occurrence
+ocurred->occurred
+ocurrence->occurrence
+offcers->officers
+offcially->officially
+offereings->offerings
+offical->official
+offically->officially
+officals->officials
+officaly->officially
+officialy->officially
+offred->offered
+oftenly->often
+oging->going, ogling
+ok->OK
+omision->omission
+omited->omitted
+omiting->omitting
+omlette->omelette
+ommision->omission
+ommited->omitted
+ommiting->omitting
+ommitted->omitted
+ommitting->omitting
+omniverous->omnivorous
+omniverously->omnivorously
+omre->more
+onot->note, not
+onyl->only
+openess->openness
+oponent->opponent
+oportunity->opportunity
+opose->oppose
+oposite->opposite
+oposition->opposition
+oppenly->openly
+oppinion->opinion
+opponant->opponent
+oppononent->opponent
+oppositition->opposition
+oppossed->opposed
+opprotunity->opportunity
+opression->oppression
+opressive->oppressive
+opthalmic->ophthalmic
+opthalmologist->ophthalmologist
+opthalmology->ophthalmology
+opthamologist->ophthalmologist
+optmizations->optimizations
+optomism->optimism
+orded->ordered
+organim->organism
+organistion->organisation
+organiztion->organization
+orgin->origin, organ
+orginal->original
+orginally->originally
+orginize->organise
+oridinarily->ordinarily
+origanaly->originally
+originall->original, originally
+originaly->originally
+originially->originally
+originnally->originally
+origional->original
+orignally->originally
+orignially->originally
+otehr->other
+oublisher->publisher
+ouevre->oeuvre
+oustanding->outstanding
+overshaddowed->overshadowed
+overthere->over there
+overwelming->overwhelming
+overwheliming->overwhelming
+owrk->work
+owudl->would
+oxigen->oxygen
+oximoron->oxymoron
+p0enis->penis
+paide->paid
+paitience->patience
+palce->place, palace
+paleolitic->paleolithic
+paliamentarian->parliamentarian
+Palistian->Palestinian
+Palistinian->Palestinian
+Palistinians->Palestinians
+pallete->palette
+pamflet->pamphlet
+pamplet->pamphlet
+pantomine->pantomime
+Papanicalou->Papanicolaou
+paralel->parallel
+paralell->parallel
+paralelly->parallelly
+paralely->parallelly
+parallely->parallelly
+paranthesis->parenthesis
+paraphenalia->paraphernalia
+parellels->parallels
+parituclar->particular
+parliment->parliament
+parrakeets->parakeets
+parralel->parallel
+parrallel->parallel
+parrallell->parallel
+parrallelly->parallelly
+parrallely->parallelly
+partialy->partially
+particually->particularly
+particualr->particular
+particuarly->particularly
+particularily->particularly
+particulary->particularly
+pary->party
+pased->passed
+pasengers->passengers
+passerbys->passersby
+pasttime->pastime
+pastural->pastoral
+paticular->particular
+pattented->patented
+pavillion->pavilion
+payed->paid
+pblisher->publisher
+pbulisher->publisher
+peacefuland->peaceful and
+peageant->pageant
+peculure->peculiar
+pedestrain->pedestrian
+peformed->performed
+peice->piece
+Peloponnes->Peloponnesus
+penatly->penalty
+penerator->penetrator
+penisula->peninsula
+penisular->peninsular
+penninsula->peninsula
+penninsular->peninsular
+pennisula->peninsula
+Pennyslvania->Pennsylvania
+pensinula->peninsula
+peom->poem
+peoms->poems
+peopel->people
+peotry->poetry
+perade->parade
+percepted->perceived
+percieve->perceive
+percieved->perceived
+perenially->perennially
+perfomance->performance
+perfomers->performers
+performence->performance
+performes->performed, performs
+perhasp->perhaps
+perheaps->perhaps
+perhpas->perhaps
+peripathetic->peripatetic
+peristent->persistent
+perjery->perjury
+perjorative->pejorative
+permanant->permanent
+permenant->permanent
+permenantly->permanently
+permissable->permissible
+perogative->prerogative
+peronal->personal
+perosnality->personality
+perphas->perhaps
+perpindicular->perpendicular
+perseverence->perseverance
+persistance->persistence
+persistant->persistent
+personel->personnel, personal
+personell->personnel
+personnell->personnel
+persuded->persuaded
+persue->pursue
+persued->pursued
+persuing->pursuing
+persuit->pursuit
+persuits->pursuits
+pertubation->perturbation
+pertubations->perturbations
+pessiary->pessary
+petetion->petition
+Pharoah->Pharaoh
+phenomenom->phenomenon
+phenomenonal->phenomenal
+phenomenonly->phenomenally
+phenomonenon->phenomenon
+phenomonon->phenomenon
+phenonmena->phenomena
+Philipines->Philippines
+philisopher->philosopher
+philisophical->philosophical
+philisophy->philosophy
+Phillipine->Philippine
+Phillipines->Philippines
+Phillippines->Philippines
+phillosophically->philosophically
+philospher->philosopher
+philosphies->philosophies
+philosphy->philosophy
+Phonecian->Phoenecian
+phongraph->phonograph
+phylosophical->philosophical
+physicaly->physically
+piblisher->publisher
+pich->pitch
+pilgrimmage->pilgrimage
+pilgrimmages->pilgrimages
+pinapple->pineapple
+pinnaple->pineapple
+pinoneered->pioneered
+plagarism->plagiarism
+planation->plantation
+planed->planned
+plantiff->plaintiff
+plateu->plateau
+plausable->plausible
+playright->playwright
+playwrite->playwright
+playwrites->playwrights
+pleasent->pleasant
+plebicite->plebiscite
+plesant->pleasant
+poenis->penis
+poeoples->peoples
+poety->poetry
+poisin->poison
+polical->political
+polinator->pollinator
+polinators->pollinators
+politican->politician
+politicans->politicians
+poltical->political
+polute->pollute
+poluted->polluted
+polutes->pollutes
+poluting->polluting
+polution->pollution
+polyphonyic->polyphonic
+polysaccaride->polysaccharide
+polysaccharid->polysaccharide
+pomegranite->pomegranate
+pomotion->promotion
+poportional->proportional
+popoulation->population
+popularaty->popularity
+populare->popular
+populer->popular
+portait->portrait
+portayed->portrayed
+portraing->portraying
+Portugese->Portuguese
+portuguease->portuguese
+portugues->Portuguese
+posess->possess
+posessed->possessed
+posesses->possesses
+posessing->possessing
+posession->possession
+posessions->possessions
+posion->poison
+positon->position, positron
+possable->possible
+possably->possibly
+posseses->possesses
+possesing->possessing
+possesion->possession
+possessess->possesses
+possibile->possible
+possibilty->possibility
+possiblility->possibility
+possiblilty->possibility
+possiblities->possibilities
+possiblity->possibility
+possition->position
+Postdam->Potsdam
+posthomous->posthumous
+postion->position
+postive->positive
+potatos->potatoes
+potrait->portrait
+potrayed->portrayed
+poulations->populations
+poverful->powerful
+poweful->powerful
+powerfull->powerful
+ppublisher->publisher
+practial->practical
+practially->practically
+practicaly->practically
+practicioner->practitioner
+practicioners->practitioners
+practicly->practically
+practioner->practitioner
+practioners->practitioners
+prairy->prairie
+prarie->prairie
+praries->prairies
+pratice->practice
+preample->preamble
+precedessor->predecessor
+preceed->precede
+preceeded->preceded
+preceeding->preceding
+preceeds->precedes
+precentage->percentage
+precice->precise
+precisly->precisely
+precurser->precursor
+predecesors->predecessors
+predicatble->predictable
+predicitons->predictions
+predomiantly->predominately
+prefered->preferred
+prefering->preferring
+preferrably->preferably
+pregancies->pregnancies
+preiod->period
+preliferation->proliferation
+premeire->premiere
+premeired->premiered
+premillenial->premillennial
+preminence->preeminence
+premission->permission
+Premonasterians->Premonstratensians
+preocupation->preoccupation
+prepair->prepare
+prepartion->preparation
+prepatory->preparatory
+preperation->preparation
+preperations->preparations
+preriod->period
+presedential->presidential
+presense->presence
+presidenital->presidential
+presidental->presidential
+presitgious->prestigious
+prespective->perspective
+prestigeous->prestigious
+prestigous->prestigious
+presumabely->presumably
+presumibly->presumably
+pretection->protection
+prevelant->prevalent
+preverse->perverse
+previvous->previous
+pricipal->principal
+priciple->principle
+priestood->priesthood
+primarly->primarily
+primative->primitive
+primatively->primitively
+primatives->primitives
+primordal->primordial
+principlaity->principality
+principaly->principality
+principial->principal
+principly->principally
+prinicipal->principal
+privalege->privilege
+privaleges->privileges
+priveledges->privileges
+privelege->privilege
+priveleged->privileged
+priveleges->privileges
+privelige->privilege
+priveliged->privileged
+priveliges->privileges
+privelleges->privileges
+privilage->privilege
+priviledge->privilege
+priviledges->privileges
+privledge->privilege
+privte->private
+probabilaty->probability
+probablistic->probabilistic
+probablly->probably
+probalibity->probability
+probaly->probably
+probelm->problem
+proccess->process
+proccessing->processing
+procede->proceed, precede
+proceded->proceeded, preceded
+procedes->proceeds, precedes
+procedger->procedure
+proceding->proceeding, preceding
+procedings->proceedings
+proceedure->procedure
+proces->process
+processer->processor
+proclaimation->proclamation
+proclamed->proclaimed
+proclaming->proclaiming
+proclomation->proclamation
+profesion->profusion, profession
+profesor->professor
+professer->professor
+proffesed->professed
+proffesion->profession
+proffesional->professional
+proffesor->professor
+profilic->prolific
+progessed->progressed
+programable->programmable
+progrom->pogrom, program
+progroms->pogroms, programs
+prohabition->prohibition
+prologomena->prolegomena
+prominance->prominence
+prominant->prominent
+prominantly->prominently
+prominately->prominently, predominately
+promiscous->promiscuous
+promotted->promoted
+pronomial->pronominal
+pronouced->pronounced
+pronounched->pronounced
+pronounciation->pronunciation
+proove->prove
+prooved->proved
+prophacy->prophecy
+propietary->proprietary
+propmted->prompted
+propoganda->propaganda
+propogate->propagate
+propogates->propagates
+propogation->propagation
+propostion->proposition
+propotions->proportions
+propper->proper
+propperly->properly
+proprietory->proprietary
+proseletyzing->proselytizing
+protaganist->protagonist
+protaganists->protagonists
+protocal->protocol
+protoganist->protagonist
+protrayed->portrayed
+protruberance->protuberance
+protruberances->protuberances
+prouncements->pronouncements
+provacative->provocative
+provded->provided
+provicial->provincial
+provinicial->provincial
+provisiosn->provision
+provisonal->provisional
+proximty->proximity
+pseudononymous->pseudonymous
+pseudonyn->pseudonym
+psuedo->pseudo
+psycology->psychology
+psyhic->psychic
+pubilsher->publisher
+pubisher->publisher
+publiaher->publisher
+publically->publicly
+publicaly->publicly
+publicher->publisher
+publihser->publisher
+publisehr->publisher
+publiser->publisher
+publisger->publisher
+publisheed->published
+publisherr->publisher
+publishher->publisher
+publishor->publisher
+publishre->publisher
+publissher->publisher
+publlisher->publisher
+publsiher->publisher
+publusher->publisher
+puchasing->purchasing
+Pucini->Puccini
+Puertorrican->Puerto Rican
+Puertorricans->Puerto Ricans
+pulisher->publisher
+pumkin->pumpkin
+puplisher->publisher
+puritannical->puritanical
+purposedly->purposely
+purpotedly->purportedly
+pursuade->persuade
+pursuaded->persuaded
+pursuades->persuades
+pususading->persuading
+puting->putting
+pwoer->power
+pyscic->psychic
+qtuie->quite, quiet
+quantaty->quantity
+quantitiy->quantity
+quarantaine->quarantine
+Queenland->Queensland
+questonable->questionable
+quicklyu->quickly
+quinessential->quintessential
+quitted->quit
+quizes->quizzes
+qutie->quite, quiet
+rabinnical->rabbinical
+racaus->raucous
+radiactive->radioactive
+radify->ratify
+raelly->really
+rarified->rarefied
+reaccurring->recurring
+reacing->reaching
+reacll->recall
+readmition->readmission
+realitvely->relatively
+realsitic->realistic
+realtions->relations
+realy->really
+realyl->really
+reasearch->research
+rebiulding->rebuilding
+rebllions->rebellions
+rebounce->rebound
+reccomend->recommend
+reccomendations->recommendations
+reccomended->recommended
+reccomending->recommending
+reccommend->recommend
+reccommended->recommended
+reccommending->recommending
+reccuring->recurring
+receeded->receded
+receeding->receding
+receivedfrom->received from
+recepient->recipient
+recepients->recipients
+receving->receiving
+rechargable->rechargeable
+reched->reached
+recide->reside
+recided->resided
+recident->resident
+recidents->residents
+reciding->residing
+reciepents->recipients
+reciept->receipt
+recieve->receive
+recieved->received
+reciever->receiver
+recievers->receivers
+recieves->receives
+recieving->receiving
+recipiant->recipient
+recipiants->recipients
+recived->received
+recivership->receivership
+recogise->recognise
+recogize->recognize
+recomend->recommend
+recomended->recommended
+recomending->recommending
+recomends->recommends
+recommedations->recommendations
+recompence->recompense
+reconaissance->reconnaissance
+reconcilation->reconciliation
+reconized->recognized
+reconnaisance->reconnaissance
+reconnaissence->reconnaissance
+recontructed->reconstructed
+recordproducer->record producer
+recquired->required
+recrational->recreational
+recrod->record
+recuiting->recruiting
+recuring->recurring
+recurrance->recurrence
+rediculous->ridiculous
+reedeming->redeeming
+reenforced->reinforced
+refect->reflect
+refedendum->referendum
+referal->referral
+referece->reference
+refereces->references
+refered->referred
+referemce->reference
+referemces->references
+referencs->references
+referenece->reference
+refereneced->referenced
+refereneces->references
+referiang->referring
+refering->referring
+refernce->reference,references
+refernces->references
+referrence->reference
+referrences->references
+referrs->refers
+reffered->referred
+refference->reference
+reffering->referring
+refrence->reference
+refrences->references
+refrers->refers
+refridgeration->refrigeration
+refridgerator->refrigerator
+refromist->reformist
+refusla->refusal
+regardes->regards
+regluar->regular
+reguarly->regularly
+regulaion->regulation
+regulaotrs->regulators
+regularily->regularly
+rehersal->rehearsal
+reicarnation->reincarnation
+reigining->reigning
+reknown->renown
+reknowned->renowned
+rela->real
+relaly->really
+relatiopnship->relationship
+relativly->relatively
+relected->reelected
+releive->relieve
+releived->relieved
+releiver->reliever
+releses->releases
+relevence->relevance
+relevent->relevant
+reliablity->reliability
+relient->reliant
+religeous->religious
+religous->religious
+religously->religiously
+relinqushment->relinquishment
+relitavely->relatively
+relized->realised, realized
+relpacement->replacement
+remaing->remaining
+remeber->remember
+rememberable->memorable
+rememberance->remembrance
+remembrence->remembrance
+remenant->remnant
+remenicent->reminiscent
+reminent->remnant
+reminescent->reminiscent
+reminscent->reminiscent
+reminsicent->reminiscent
+rendevous->rendezvous
+rendezous->rendezvous
+renedered->rende
+renewl->renewal
+rennovate->renovate
+rennovated->renovated
+rennovating->renovating
+rennovation->renovation
+rentors->renters
+reoccurrence->recurrence
+reorganision->reorganisation
+repatition->repetition, repartition
+repblic->republic
+repblican->republican
+repblicans->republicans
+repblics->republics
+repectively->respectively
+repeition->repetition
+repentence->repentance
+repentent->repentant
+repeteadly->repeatedly
+repetion->repetition
+repid->rapid
+reponse->response
+reponsible->responsible
+reportadly->reportedly
+represantative->representative
+representive->representative
+representives->representatives
+reproducable->reproducible
+reprtoire->repertoire
+repsectively->respectively
+reptition->repetition
+repubic->republic
+repubican->republican
+repubicans->republicans
+repubics->republics
+republi->republic
+republian->republican
+republians->republicans
+republis->republics
+repulic->republic
+repulican->republican
+repulicans->republicans
+repulics->republics
+requirment->requirement
+requred->required
+resaurant->restaurant
+resembelance->resemblance
+resembes->resembles
+resemblence->resemblance
+resevoir->reservoir
+residental->residential
+resignement->resignment
+resistable->resistible
+resistence->resistance
+resistent->resistant
+respectivly->respectively
+responce->response
+responibilities->responsibilities
+responisble->responsible
+responnsibilty->responsibility
+responsability->responsibility
+responsibile->responsible
+responsibilites->responsibilities
+responsiblities->responsibilities
+responsiblity->responsibility
+ressemblance->resemblance
+ressemble->resemble
+ressembled->resembled
+ressemblence->resemblance
+ressembling->resembling
+resssurecting->resurrecting
+ressurect->resurrect
+ressurected->resurrected
+ressurection->resurrection
+ressurrection->resurrection
+restarant->restaurant
+restarants->restaurants
+restaraunt->restaurant
+restaraunteur->restaurateur
+restaraunteurs->restaurateurs
+restaraunts->restaurants
+restauranteurs->restaurateurs
+restauration->restoration
+restauraunt->restaurant
+resteraunt->restaurant
+resteraunts->restaurants
+resticted->restricted
+restraunt->restraint, restaurant
+resturant->restaurant
+resturants->restaurants
+resturaunt->restaurant
+resturaunts->restaurants
+resurecting->resurrecting
+retalitated->retaliated
+retalitation->retaliation
+retreive->retrieve
+returnd->returned
+revaluated->reevaluated
+reveiw->review
+reveral->reversal
+reversable->reversible
+revolutionar->revolutionary
+rewitten->rewritten
+rewriet->rewrite
+rference->reference
+rferences->references
+rhymme->rhyme
+rhythem->rhythm
+rhythim->rhythm
+rhytmic->rhythmic
+rigeur->rigueur, rigour, rigor
+rigourous->rigorous
+rininging->ringing
+rised->rose
+Rockerfeller->Rockefeller
+rococco->rococo
+rocord->record
+roomate->roommate
+rougly->roughly
+rucuperate->recuperate
+rudimentatry->rudimentary
+rulle->rule
+runing->running
+runnung->running
+russina->Russian
+Russion->Russian
+rwite->write
+rythem->rhythm
+rythim->rhythm
+rythm->rhythm
+rythmic->rhythmic
+rythyms->rhythms
+sacrafice->sacrifice
+sacreligious->sacrilegious
+sacrifical->sacrificial
+saftey->safety
+safty->safety
+salery->salary
+sanctionning->sanctioning
+sandwhich->sandwich
+Sanhedrim->Sanhedrin
+santioned->sanctioned
+sargant->sergeant
+sargeant->sergeant
+sasy->says, sassy
+satelite->satellite
+satelites->satellites
+Saterday->Saturday
+Saterdays->Saturdays
+satisfactority->satisfactorily
+satric->satiric
+satrical->satirical
+satrically->satirically
+sattelite->satellite
+sattelites->satellites
+saught->sought
+saveing->saving
+saxaphone->saxophone
+scaleable->scalable
+scandanavia->Scandinavia
+scaricity->scarcity
+scavanged->scavenged
+schedual->schedule
+scholarhip->scholarship
+scholarstic->scholastic, scholarly
+scientfic->scientific
+scientifc->scientific
+scientis->scientist
+scince->science
+scinece->science
+scirpt->script
+scoll->scroll
+screenwrighter->screenwriter
+scrutinity->scrutiny
+scuptures->sculptures
+seach->search
+seached->searched
+seaches->searches
+secceeded->seceded, succeeded
+seceed->succeed, secede
+seceeded->succeeded, seceded
+secratary->secretary
+secretery->secretary
+sedereal->sidereal
+seeked->sought
+segementation->segmentation
+seguoys->segues
+seige->siege
+seing->seeing
+seinor->senior
+seldomly->seldom
+senarios->scenarios
+sence->sense, since
+senstive->sensitive
+sensure->censure
+seperate->separate
+seperated->separated
+seperately->separately
+seperates->separates
+seperating->separating
+seperation->separation
+seperatism->separatism
+seperatist->separatist
+sepina->subpoena
+sepulchure->sepulchre, sepulcher
+sepulcre->sepulchre, sepulcher
+sergent->sergeant
+settelement->settlement
+settlment->settlement
+severeal->several
+severley->severely
+severly->severely
+sevice->service
+shadasloo->shadaloo
+shaddow->shadow
+shadoloo->shadaloo
+shamen->shaman, shamans
+sheat->sheath, sheet, cheat
+sheild->shield
+sherif->sheriff
+shineing->shining
+shiped->shipped
+shiping->shipping
+shopkeeepers->shopkeepers
+shorly->shortly
+shortwhile->short while
+shoudl->should
+shoudln->should, shouldn't
+shouldnt->shouldn't
+shreak->shriek
+shrinked->shrunk
+sicne->since
+sideral->sidereal
+sieze->seize, size
+siezed->seized, sized
+siezing->seizing, sizing
+siezure->seizure
+siezures->seizures
+siginificant->significant
+signficant->significant
+signficiant->significant
+signfies->signifies
+signifantly->significantly
+significently->significantly
+signifigant->significant
+signifigantly->significantly
+signitories->signatories
+signitory->signatory
+similarily->similarly
+similiar->similar
+similiarity->similarity
+similiarly->similarly
+simmilar->similar
+simpley->simply
+simplier->simpler
+simultanous->simultaneous
+simultanously->simultaneously
+sincerley->sincerely
+singsog->singsong
+sinse->sines, since
+Sionist->Zionist
+Sionists->Zionists
+Sixtin->Sistine
+Skagerak->Skagerrak
+skateing->skating
+slaugterhouses->slaughterhouses
+slighly->slightly
+slippy->slippery
+slowy->slowly
+smae->same
+smealting->smelting
+smoe->some
+sneeks->sneaks
+snese->sneeze
+socalism->socialism
+socities->societies
+soem->some
+sofware->software
+sohw->show
+soilders->soldiers
+solatary->solitary
+soley->solely
+soliders->soldiers
+soliliquy->soliloquy
+soluable->soluble
+somene->someone
+somtimes->sometimes
+somwhere->somewhere
+sophicated->sophisticated
+sophmore->sophomore
+sorceror->sorcerer
+sorrounding->surrounding
+sotry->story
+sotyr->satyr, story
+soudn->sound
+soudns->sounds
+sould->could, should, sold, soul
+sountrack->soundtrack
+sourth->south
+sourthern->southern
+souvenier->souvenir
+souveniers->souvenirs
+soveits->soviets
+sovereignity->sovereignty
+soverign->sovereign
+soverignity->sovereignty
+soverignty->sovereignty
+spainish->Spanish
+speach->speech
+specfic->specific
+speciallized->specialised, specialized
+specif->specific, specify
+specifiying->specifying
+speciman->specimen
+spectauclar->spectacular
+spectaulars->spectaculars
+spects->aspects, expects
+spectum->spectrum
+speices->species
+spendour->splendour
+spermatozoan->spermatozoon
+spoace->space
+sponser->sponsor
+sponsered->sponsored
+spontanous->spontaneous
+sponzored->sponsored
+spoonfulls->spoonfuls
+sppeches->speeches
+spreaded->spread
+sprech->speech
+spred->spread
+spriritual->spiritual
+spritual->spiritual
+sqaure->square
+stablility->stability
+stainlees->stainless
+staion->station
+standars->standards
+stange->strange
+startegic->strategic
+startegies->strategies
+startegy->strategy
+stateman->statesman
+statememts->statements
+statment->statement
+steriods->steroids
+sterotypes->stereotypes
+stilus->stylus
+stingent->stringent
+stiring->stirring
+stirrs->stirs
+stlye->style
+stomache->stomach
+stong->strong
+stopry->story
+storeis->stories
+storise->stories
+stornegst->strongest
+stoyr->story
+stpo->stop
+stradegies->strategies
+stradegy->strategy
+strat->start, strata
+stratagically->strategically
+streemlining->streamlining
+stregth->strength
+strenghen->strengthen
+strenghened->strengthened
+strenghening->strengthening
+strenght->strength
+strenghten->strengthen
+strenghtened->strengthened
+strenghtening->strengthening
+strengtened->strengthened
+strenous->strenuous
+strictist->strictest
+strikely->strikingly
+strnad->strand
+stroy->story, destroy
+structual->structural
+stubborness->stubbornness
+stucture->structure
+stuctured->structured
+studdy->study
+studing->studying
+stuggling->struggling
+sturcture->structure
+subcatagories->subcategories
+subcatagory->subcategory
+subconsiously->subconsciously
+subjudgation->subjugation
+submachne->submachine
+subpecies->subspecies
+subsidary->subsidiary
+subsiduary->subsidiary
+subsquent->subsequent
+subsquently->subsequently
+substace->substance
+substancial->substantial
+substatial->substantial
+substituded->substituted
+substract->subtract
+substracted->subtracted
+substracting->subtracting
+substraction->subtraction
+substracts->subtracts
+subtances->substances
+subterranian->subterranean
+suburburban->suburban
+succceeded->succeeded
+succcesses->successes
+succedded->succeeded
+succeded->succeeded
+succeds->succeeds
+succesful->successful
+succesfully->successfully
+succesfuly->successfully
+succesion->succession
+succesive->successive
+successfull->successful
+successully->successfully
+succsess->success
+succsessfull->successful
+suceed->succeed
+suceeded->succeeded
+suceeding->succeeding
+suceeds->succeeds
+sucesful->successful
+sucesfully->successfully
+sucesfuly->successfully
+sucesion->succession
+sucess->success
+sucesses->successes
+sucessful->successful
+sucessfull->successful
+sucessfully->successfully
+sucessfuly->successfully
+sucession->succession
+sucessive->successive
+sucessor->successor
+sucessot->successor
+sucide->suicide
+sucidial->suicidal
+sufferage->suffrage
+sufferred->suffered
+sufferring->suffering
+sufficent->sufficient
+sufficently->sufficiently
+sumary->summary
+sunglases->sunglasses
+suop->soup
+superceeded->superseded
+superintendant->superintendent
+suphisticated->sophisticated
+suplimented->supplemented
+supose->suppose
+suposed->supposed
+suposedly->supposedly
+suposes->supposes
+suposing->supposing
+supplamented->supplemented
+suppliementing->supplementing
+suppoed->supposed
+supposingly->supposedly
+suppy->supply
+supress->suppress
+supressed->suppressed
+supresses->suppresses
+supressing->suppressing
+suprise->surprise
+suprised->surprised
+suprising->surprising
+suprisingly->surprisingly
+suprize->surprise
+suprized->surprised
+suprizing->surprising
+suprizingly->surprisingly
+surfce->surface
+surley->surly, surely
+suround->surround
+surounded->surrounded
+surounding->surrounding
+suroundings->surroundings
+surounds->surrounds
+surplanted->supplanted
+surpress->suppress
+surpressed->suppressed
+surprize->surprise
+surprized->surprised
+surprizing->surprising
+surprizingly->surprisingly
+surrended->surrounded, surrendered
+surrepetitious->surreptitious
+surrepetitiously->surreptitiously
+surreptious->surreptitious
+surreptiously->surreptitiously
+surronded->surrounded
+surrouded->surrounded
+surrouding->surrounding
+surrundering->surrendering
+surveilence->surveillance
+surveill->surveil
+surveyer->surveyor
+surviver->survivor
+survivers->survivors
+survivied->survived
+suseptable->susceptible
+suseptible->susceptible
+suspention->suspension
+swaer->swear
+swaers->swears
+swepth->swept
+swiming->swimming
+syas->says
+symetrical->symmetrical
+symetrically->symmetrically
+symetry->symmetry
+symettric->symmetric
+symmetral->symmetric
+symmetricaly->symmetrically
+synagouge->synagogue
+syncronization->synchronization
+synonomous->synonymous
+synonymns->synonyms
+synphony->symphony
+syphyllis->syphilis
+sypmtoms->symptoms
+syrap->syrup
+sysmatically->systematically
+sytem->system
+sytle->style
+tabacco->tobacco
+tahn->than
+taht->that
+talekd->talked
+targetted->targeted
+targetting->targeting
+tast->taste
+tath->that
+tattooes->tattoos
+taxanomic->taxonomic
+taxanomy->taxonomy
+teached->taught
+techician->technician
+techicians->technicians
+techiniques->techniques
+technitian->technician
+technnology->technology
+technolgy->technology
+teh->the
+tehy->they
+telelevision->television
+televsion->television
+telphony->telephony
+temerature->temperature
+tempalte->template
+tempaltes->templates
+temparate->temperate
+temperarily->temporarily
+temperment->temperament
+tempertaure->temperature
+temperture->temperature
+temprary->temporary
+tenacle->tentacle
+tenacles->tentacles
+tendacy->tendency
+tendancies->tendencies
+tendancy->tendency
+tennisplayer->tennis player
+tepmorarily->temporarily
+terrestial->terrestrial
+terriories->territories
+terriory->territory
+territorist->terrorist
+territoy->territory
+terroist->terrorist
+testiclular->testicular
+tghe->the
+thast->that, that's
+theather->theater
+theese->these
+theif->thief
+theives->thieves
+themselfs->themselves
+themslves->themselves
+ther->there, their, the
+therafter->thereafter
+therby->thereby
+theri->their
+theyre->they're
+thgat->that
+thge->the
+thier->their
+thign->thing
+thigns->things
+thigsn->things
+thikn->think
+thikning->thinking, thickening
+thikns->thinks
+thiunk->think
+thn->then
+thna->than
+thne->then
+thnig->thing
+thnigs->things
+thoughout->throughout
+threatend->threatened
+threatning->threatening
+threee->three
+threshhold->threshold
+thrid->third
+throrough->thorough
+throughly->thoroughly
+throught->thought, through, throughout
+througout->throughout
+thru->through
+thsi->this
+thsoe->those
+thta->that
+thyat->that
+tiem->time, Tim
+tihkn->think
+tihs->this
+timne->time
+tiome->time, tome
+tje->the
+tjhe->the
+tjpanishad->upanishad
+tkae->take
+tkaes->takes
+tkaing->taking
+tlaking->talking
+tobbaco->tobacco
+todays->today's
+todya->today
+toghether->together
+toke->took
+tolerence->tolerance
+Tolkein->Tolkien
+tomatos->tomatoes
+tommorow->tomorrow
+tommorrow->tomorrow
+tongiht->tonight
+toriodal->toroidal
+tormenters->tormentors
+tornadoe->tornado
+torpeados->torpedoes
+torpedos->torpedoes
+tothe->to the
+toubles->troubles
+tounge->tongue
+tourch->torch, touch
+towords->towards
+towrad->toward
+tradionally->traditionally
+traditionaly->traditionally
+traditionnal->traditional
+traditition->tradition
+tradtionally->traditionally
+trafficed->trafficked
+trafficing->trafficking
+trafic->traffic
+trancendent->transcendent
+trancending->transcending
+tranform->transform
+tranformed->transformed
+transcendance->transcendence
+transcendant->transcendent
+transcendentational->transcendental
+transcripting->transcribing, transcription
+transending->transcending
+transesxuals->transsexuals
+transfered->transferred
+transfering->transferring
+transformaton->transformation
+transistion->transition
+translater->translator
+translaters->translators
+transmissable->transmissible
+transporation->transportation
+tremelo->tremolo
+tremelos->tremolos
+triguered->triggered
+triology->trilogy
+troling->trolling
+troup->troupe
+troups->troupes, troops
+truely->truly
+trustworthyness->trustworthiness
+turnk->turnkey, trunk
+Tuscon->Tucson
+tust->trust
+twelth->twelfth
+twon->town
+twpo->two
+tyhat->that
+tyhe->they
+typcial->typical
+typicaly->typically
+tyranies->tyrannies
+tyrany->tyranny
+tyrranies->tyrannies
+tyrrany->tyranny
+ubiquitious->ubiquitous
+ublisher->publisher
+uise->use
+Ukranian->Ukrainian
+ultimely->ultimately
+unacompanied->unaccompanied
+unahppy->unhappy
+unanymous->unanimous
+unathorised->unauthorised
+unavailible->unavailable
+unballance->unbalance
+unbeknowst->unbeknownst
+unbeleivable->unbelievable
+uncertainity->uncertainty
+unchallengable->unchallengeable
+unchangable->unchangeable
+uncompetive->uncompetitive
+unconcious->unconscious
+unconciousness->unconsciousness
+unconfortability->discomfort
+uncontitutional->unconstitutional
+unconvential->unconventional
+undecideable->undecidable
+understoon->understood
+undesireable->undesirable
+undetecable->undetectable
+undoubtely->undoubtedly
+undreground->underground
+uneccesary->unnecessary
+unecessary->unnecessary
+unequalities->inequalities
+unforetunately->unfortunately
+unforgetable->unforgettable
+unforgiveable->unforgivable
+unfortunatley->unfortunately
+unfortunatly->unfortunately
+unfourtunately->unfortunately
+unihabited->uninhabited
+unilateraly->unilaterally
+unilatreal->unilateral
+unilatreally->unilaterally
+uninterruped->uninterrupted
+uninterupted->uninterrupted
+UnitesStates->UnitedStates
+univeral->universal
+univeristies->universities
+univeristy->university
+univerity->university
+universtiy->university
+univesities->universities
+univesity->university
+unkown->unknown
+unlikey->unlikely
+unmanouverable->unmaneuverable, unmanoeuvrable
+unmistakeably->unmistakably
+unneccesarily->unnecessarily
+unneccesary->unnecessary
+unneccessarily->unnecessarily
+unneccessary->unnecessary
+unnecesarily->unnecessarily
+unnecesary->unnecessary
+unoffical->unofficial
+unoperational->nonoperational
+unoticeable->unnoticeable
+unplease->displease
+unplesant->unpleasant
+unprecendented->unprecedented
+unprecidented->unprecedented
+unrepentent->unrepentant
+unrepetant->unrepentant
+unrepetent->unrepentant
+unsed->used, unused, unsaid
+unsubstanciated->unsubstantiated
+unsuccesful->unsuccessful
+unsuccesfully->unsuccessfully
+unsuccessfull->unsuccessful
+unsucesful->unsuccessful
+unsucesfuly->unsuccessfully
+unsucessful->unsuccessful
+unsucessfull->unsuccessful
+unsucessfully->unsuccessfully
+unsuprised->unsurprised
+unsuprising->unsurprising
+unsuprisingly->unsurprisingly
+unsuprized->unsurprised
+unsuprizing->unsurprising
+unsuprizingly->unsurprisingly
+unsurprized->unsurprised
+unsurprizing->unsurprising
+unsurprizingly->unsurprisingly
+untill->until
+untranslateable->untranslatable
+unuseable->unusable
+unusuable->unusable
+unviersity->university
+unwarrented->unwarranted
+unweildly->unwieldy
+unwieldly->unwieldy
+upcomming->upcoming
+upgradded->upgraded
+upto->up to
+usally->usually
+useage->usage
+usefull->useful
+usefuly->usefully
+useing->using
+usualy->usually
+ususally->usually
+vaccum->vacuum
+vaccume->vacuum
+vacinity->vicinity
+vaguaries->vagaries
+vaieties->varieties
+vailidty->validity
+valetta->valletta
+valuble->valuable
+valueable->valuable
+varations->variations
+varient->variant
+variey->variety
+varing->varying
+varities->varieties
+varity->variety
+vasall->vassal
+vasalls->vassals
+vegatarian->vegetarian
+vegitable->vegetable
+vegitables->vegetables
+vegtable->vegetable
+vehicule->vehicle
+vell->well
+venemous->venomous
+vengance->vengeance
+vengence->vengeance
+verfication->verification
+verison->version
+verisons->versions
+vermillion->vermilion
+versitilaty->versatility
+versitlity->versatility
+vetween->between
+veyr->very
+vigeur->vigueur, vigour, vigor
+vigilence->vigilance
+vigourous->vigorous
+villian->villain
+villification->vilification
+villify->vilify
+villin->villi, villain, villein
+vincinity->vicinity
+violentce->violence
+virtualy->virtually
+virutal->virtual
+virutally->virtually
+visable->visible
+visably->visibly
+visting->visiting
+vistors->visitors
+vitories->victories
+volcanoe->volcano
+voleyball->volleyball
+volontary->voluntary
+volonteer->volunteer
+volonteered->volunteered
+volonteering->volunteering
+volonteers->volunteers
+volounteer->volunteer
+volounteered->volunteered
+volounteering->volunteering
+volounteers->volunteers
+volumne->volume
+vreity->variety
+vrey->very
+vriety->variety
+vulnerablility->vulnerability
+vyer->very
+vyre->very
+waht->what
+wanna->want to
+warantee->warranty
+wardobe->wardrobe
+warrent->warrant
+warrriors->warriors
+wasnt->wasn't
+wass->was
+watn->want
+wayword->wayward
+weaponary->weaponry
+weas->was
+wehn->when
+weild->wield, wild
+weilded->wielded
+wendsay->Wednesday
+wensday->Wednesday
+wereabouts->whereabouts
+whant->want
+whants->wants
+whcih->which
+wheras->whereas
+wherease->whereas
+whereever->wherever
+whic->which
+whihc->which
+whith->with
+whlch->which
+whn->when
+wholey->wholly
+wholy->wholly, holy
+whta->what
+whther->whether
+wich->which, witch
+widesread->widespread
+wief->wife
+wierd->weird
+wiew->view
+wih->with
+wiht->with
+wille->will
+willk->will
+willingless->willingness
+wirting->writing
+withdrawl->withdrawal, withdraw
+witheld->withheld
+withh->with
+withing->within
+withold->withhold
+witht->with
+witn->with
+wiull->will
+wnat->want
+wnated->wanted
+wnats->wants
+wohle->whole
+wokr->work
+wokring->working
+wonderfull->wonderful
+wordlwide->worldwide
+workststion->workstation
+worls->world
+worstened->worsened
+woudl->would
+wresters->wrestlers
+wriet->write
+writen->written
+wroet->wrote
+wrok->work
+wroking->working
+wtih->with
+wupport->support
+xenophoby->xenophobia
+yaching->yachting
+yaer->year
+yaerly->yearly
+yaers->years
+yatch->yacht
+yearm->year
+yeasr->years
+yeild->yield
+yeilding->yielding
+yera->year
+yrea->year
+yeras->years
+yersa->years
+yotube->youtube
+youseff->yousef
+youself->yourself
+ytou->you
+yuo->you
+zeebra->zebra
diff --git a/love2dToAPK/tools/tools/android-win/tools/support/typos-es.txt b/love2dToAPK/tools/tools/android-win/tools/support/typos-es.txt
new file mode 100644
index 0000000..af2bccb
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/support/typos-es.txt
@@ -0,0 +1,733 @@
+# This file contains a number of common Spanish typos:
+andriod->android
+
+# The remainder of this file contains misspellings from
+# http://es.wikipedia.org/wiki/Wikipedia:Lista_de_errores_ortogr%C3%A1ficos_comunes/M%C3%A1quinas
+# plus some post-processing to fix invalid entries, remove duplicates, etc.
+#
+# The content is available under the
+# "Creative Commons Attribution-ShareAlike License"
+# http://creativecommons.org/licenses/by-sa/3.0/
+#
+# THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
+# COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
+# COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
+# AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
+#
+# BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
+# TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY
+# BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS
+# CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
+# CONDITIONS.
+#
+# *1. Definitions*
+#
+# 1. *"Adaptation"* means a work based upon the Work, or upon the Work
+# and other pre-existing works, such as a translation, adaptation,
+# derivative work, arrangement of music or other alterations of a
+# literary or artistic work, or phonogram or performance and includes
+# cinematographic adaptations or any other form in which the Work may
+# be recast, transformed, or adapted including in any form
+# recognizably derived from the original, except that a work that
+# constitutes a Collection will not be considered an Adaptation for
+# the purpose of this License. For the avoidance of doubt, where the
+# Work is a musical work, performance or phonogram, the
+# synchronization of the Work in timed-relation with a moving image
+# ("synching") will be considered an Adaptation for the purpose of
+# this License.
+# 2. *"Collection"* means a collection of literary or artistic works,
+# such as encyclopedias and anthologies, or performances, phonograms
+# or broadcasts, or other works or subject matter other than works
+# listed in Section 1(f) below, which, by reason of the selection and
+# arrangement of their contents, constitute intellectual creations, in
+# which the Work is included in its entirety in unmodified form along
+# with one or more other contributions, each constituting separate and
+# independent works in themselves, which together are assembled into a
+# collective whole. A work that constitutes a Collection will not be
+# considered an Adaptation (as defined below) for the purposes of this
+# License.
+# 3. *"Creative Commons Compatible License"* means a license that is
+# listed at http://creativecommons.org/compatiblelicenses that has
+# been approved by Creative Commons as being essentially equivalent to
+# this License, including, at a minimum, because that license: (i)
+# contains terms that have the same purpose, meaning and effect as the
+# License Elements of this License; and, (ii) explicitly permits the
+# relicensing of adaptations of works made available under that
+# license under this License or a Creative Commons jurisdiction
+# license with the same License Elements as this License.
+# 4. *"Distribute"* means to make available to the public the original
+# and copies of the Work or Adaptation, as appropriate, through sale
+# or other transfer of ownership.
+# 5. *"License Elements"* means the following high-level license
+# attributes as selected by Licensor and indicated in the title of
+# this License: Attribution, ShareAlike.
+# 6. *"Licensor"* means the individual, individuals, entity or entities
+# that offer(s) the Work under the terms of this License.
+# 7. *"Original Author"* means, in the case of a literary or artistic
+# work, the individual, individuals, entity or entities who created
+# the Work or if no individual or entity can be identified, the
+# publisher; and in addition (i) in the case of a performance the
+# actors, singers, musicians, dancers, and other persons who act,
+# sing, deliver, declaim, play in, interpret or otherwise perform
+# literary or artistic works or expressions of folklore; (ii) in the
+# case of a phonogram the producer being the person or legal entity
+# who first fixes the sounds of a performance or other sounds; and,
+# (iii) in the case of broadcasts, the organization that transmits the
+# broadcast.
+# 8. *"Work"* means the literary and/or artistic work offered under the
+# terms of this License including without limitation any production in
+# the literary, scientific and artistic domain, whatever may be the
+# mode or form of its expression including digital form, such as a
+# book, pamphlet and other writing; a lecture, address, sermon or
+# other work of the same nature; a dramatic or dramatico-musical work;
+# a choreographic work or entertainment in dumb show; a musical
+# composition with or without words; a cinematographic work to which
+# are assimilated works expressed by a process analogous to
+# cinematography; a work of drawing, painting, architecture,
+# sculpture, engraving or lithography; a photographic work to which
+# are assimilated works expressed by a process analogous to
+# photography; a work of applied art; an illustration, map, plan,
+# sketch or three-dimensional work relative to geography, topography,
+# architecture or science; a performance; a broadcast; a phonogram; a
+# compilation of data to the extent it is protected as a copyrightable
+# work; or a work performed by a variety or circus performer to the
+# extent it is not otherwise considered a literary or artistic work.
+# 9. *"You"* means an individual or entity exercising rights under this
+# License who has not previously violated the terms of this License
+# with respect to the Work, or who has received express permission
+# from the Licensor to exercise rights under this License despite a
+# previous violation.
+# 10. *"Publicly Perform"* means to perform public recitations of the Work
+# and to communicate to the public those public recitations, by any
+# means or process, including by wire or wireless means or public
+# digital performances; to make available to the public Works in such
+# a way that members of the public may access these Works from a place
+# and at a place individually chosen by them; to perform the Work to
+# the public by any means or process and the communication to the
+# public of the performances of the Work, including by public digital
+# performance; to broadcast and rebroadcast the Work by any means
+# including signs, sounds or images.
+# 11. *"Reproduce"* means to make copies of the Work by any means
+# including without limitation by sound or visual recordings and the
+# right of fixation and reproducing fixations of the Work, including
+# storage of a protected performance or phonogram in digital form or
+# other electronic medium.
+#
+# *2. Fair Dealing Rights.* Nothing in this License is intended to reduce,
+# limit, or restrict any uses free from copyright or rights arising from
+# limitations or exceptions that are provided for in connection with the
+# copyright protection under copyright law or other applicable laws.
+#
+# *3. License Grant.* Subject to the terms and conditions of this License,
+# Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
+# perpetual (for the duration of the applicable copyright) license to
+# exercise the rights in the Work as stated below:
+#
+# 1. to Reproduce the Work, to incorporate the Work into one or more
+# Collections, and to Reproduce the Work as incorporated in the
+# Collections;
+# 2. to create and Reproduce Adaptations provided that any such
+# Adaptation, including any translation in any medium, takes
+# reasonable steps to clearly label, demarcate or otherwise identify
+# that changes were made to the original Work. For example, a
+# translation could be marked "The original work was translated from
+# English to Spanish," or a modification could indicate "The original
+# work has been modified.";
+# 3. to Distribute and Publicly Perform the Work including as
+# incorporated in Collections; and,
+# 4. to Distribute and Publicly Perform Adaptations.
+# 5.
+#
+# For the avoidance of doubt:
+#
+# 1. *Non-waivable Compulsory License Schemes*. In those
+# jurisdictions in which the right to collect royalties through
+# any statutory or compulsory licensing scheme cannot be waived,
+# the Licensor reserves the exclusive right to collect such
+# royalties for any exercise by You of the rights granted under
+# this License;
+# 2. *Waivable Compulsory License Schemes*. In those jurisdictions in
+# which the right to collect royalties through any statutory or
+# compulsory licensing scheme can be waived, the Licensor waives
+# the exclusive right to collect such royalties for any exercise
+# by You of the rights granted under this License; and,
+# 3. *Voluntary License Schemes*. The Licensor waives the right to
+# collect royalties, whether individually or, in the event that
+# the Licensor is a member of a collecting society that
+# administers voluntary licensing schemes, via that society, from
+# any exercise by You of the rights granted under this License.
+#
+# The above rights may be exercised in all media and formats whether now
+# known or hereafter devised. The above rights include the right to make
+# such modifications as are technically necessary to exercise the rights
+# in other media and formats. Subject to Section 8(f), all rights not
+# expressly granted by Licensor are hereby reserved.
+#
+# *4. Restrictions.* The license granted in Section 3 above is expressly
+# made subject to and limited by the following restrictions:
+#
+# 1. You may Distribute or Publicly Perform the Work only under the terms
+# of this License. You must include a copy of, or the Uniform Resource
+# Identifier (URI) for, this License with every copy of the Work You
+# Distribute or Publicly Perform. You may not offer or impose any
+# terms on the Work that restrict the terms of this License or the
+# ability of the recipient of the Work to exercise the rights granted
+# to that recipient under the terms of the License. You may not
+# sublicense the Work. You must keep intact all notices that refer to
+# this License and to the disclaimer of warranties with every copy of
+# the Work You Distribute or Publicly Perform. When You Distribute or
+# Publicly Perform the Work, You may not impose any effective
+# technological measures on the Work that restrict the ability of a
+# recipient of the Work from You to exercise the rights granted to
+# that recipient under the terms of the License. This Section 4(a)
+# applies to the Work as incorporated in a Collection, but this does
+# not require the Collection apart from the Work itself to be made
+# subject to the terms of this License. If You create a Collection,
+# upon notice from any Licensor You must, to the extent practicable,
+# remove from the Collection any credit as required by Section 4(c),
+# as requested. If You create an Adaptation, upon notice from any
+# Licensor You must, to the extent practicable, remove from the
+# Adaptation any credit as required by Section 4(c), as requested.
+# 2. You may Distribute or Publicly Perform an Adaptation only under the
+# terms of: (i) this License; (ii) a later version of this License
+# with the same License Elements as this License; (iii) a Creative
+# Commons jurisdiction license (either this or a later license
+# version) that contains the same License Elements as this License
+# (e.g., Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons
+# Compatible License. If you license the Adaptation under one of the
+# licenses mentioned in (iv), you must comply with the terms of that
+# license. If you license the Adaptation under the terms of any of the
+# licenses mentioned in (i), (ii) or (iii) (the "Applicable License"),
+# you must comply with the terms of the Applicable License generally
+# and the following provisions: (I) You must include a copy of, or the
+# URI for, the Applicable License with every copy of each Adaptation
+# You Distribute or Publicly Perform; (II) You may not offer or impose
+# any terms on the Adaptation that restrict the terms of the
+# Applicable License or the ability of the recipient of the Adaptation
+# to exercise the rights granted to that recipient under the terms of
+# the Applicable License; (III) You must keep intact all notices that
+# refer to the Applicable License and to the disclaimer of warranties
+# with every copy of the Work as included in the Adaptation You
+# Distribute or Publicly Perform; (IV) when You Distribute or Publicly
+# Perform the Adaptation, You may not impose any effective
+# technological measures on the Adaptation that restrict the ability
+# of a recipient of the Adaptation from You to exercise the rights
+# granted to that recipient under the terms of the Applicable License.
+# This Section 4(b) applies to the Adaptation as incorporated in a
+# Collection, but this does not require the Collection apart from the
+# Adaptation itself to be made subject to the terms of the Applicable
+# License.
+# 3. If You Distribute, or Publicly Perform the Work or any Adaptations
+# or Collections, You must, unless a request has been made pursuant to
+# Section 4(a), keep intact all copyright notices for the Work and
+# provide, reasonable to the medium or means You are utilizing: (i)
+# the name of the Original Author (or pseudonym, if applicable) if
+# supplied, and/or if the Original Author and/or Licensor designate
+# another party or parties (e.g., a sponsor institute, publishing
+# entity, journal) for attribution ("Attribution Parties") in
+# Licensor's copyright notice, terms of service or by other reasonable
+# means, the name of such party or parties; (ii) the title of the Work
+# if supplied; (iii) to the extent reasonably practicable, the URI, if
+# any, that Licensor specifies to be associated with the Work, unless
+# such URI does not refer to the copyright notice or licensing
+# information for the Work; and (iv) , consistent with Ssection 3(b),
+# in the case of an Adaptation, a credit identifying the use of the
+# Work in the Adaptation (e.g., "French translation of the Work by
+# Original Author," or "Screenplay based on original Work by Original
+# Author"). The credit required by this Section 4(c) may be
+# implemented in any reasonable manner; provided, however, that in the
+# case of a Adaptation or Collection, at a minimum such credit will
+# appear, if a credit for all contributing authors of the Adaptation
+# or Collection appears, then as part of these credits and in a manner
+# at least as prominent as the credits for the other contributing
+# authors. For the avoidance of doubt, You may only use the credit
+# required by this Section for the purpose of attribution in the
+# manner set out above and, by exercising Your rights under this
+# License, You may not implicitly or explicitly assert or imply any
+# connection with, sponsorship or endorsement by the Original Author,
+# Licensor and/or Attribution Parties, as appropriate, of You or Your
+# use of the Work, without the separate, express prior written
+# permission of the Original Author, Licensor and/or Attribution Parties.
+# 4. Except as otherwise agreed in writing by the Licensor or as may be
+# otherwise permitted by applicable law, if You Reproduce, Distribute
+# or Publicly Perform the Work either by itself or as part of any
+# Adaptations or Collections, You must not distort, mutilate, modify
+# or take other derogatory action in relation to the Work which would
+# be prejudicial to the Original Author's honor or reputation.
+# Licensor agrees that in those jurisdictions (e.g. Japan), in which
+# any exercise of the right granted in Section 3(b) of this License
+# (the right to make Adaptations) would be deemed to be a distortion,
+# mutilation, modification or other derogatory action prejudicial to
+# the Original Author's honor and reputation, the Licensor will waive
+# or not assert, as appropriate, this Section, to the fullest extent
+# permitted by the applicable national law, to enable You to
+# reasonably exercise Your right under Section 3(b) of this License
+# (right to make Adaptations) but not otherwise.
+#
+# *5. Representations, Warranties and Disclaimer*
+#
+# UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
+# OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
+# KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
+# INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
+# LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
+# WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE
+# EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
+#
+# *6. Limitation on Liability.* EXCEPT TO THE EXTENT REQUIRED BY
+# APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL
+# THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY
+# DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF
+# LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+#
+# *7. Termination*
+#
+# 1. This License and the rights granted hereunder will terminate
+# automatically upon any breach by You of the terms of this License.
+# Individuals or entities who have received Adaptations or Collections
+# from You under this License, however, will not have their licenses
+# terminated provided such individuals or entities remain in full
+# compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will
+# survive any termination of this License.
+# 2. Subject to the above terms and conditions, the license granted here
+# is perpetual (for the duration of the applicable copyright in the
+# Work). Notwithstanding the above, Licensor reserves the right to
+# release the Work under different license terms or to stop
+# distributing the Work at any time; provided, however that any such
+# election will not serve to withdraw this License (or any other
+# license that has been, or is required to be, granted under the terms
+# of this License), and this License will continue in full force and
+# effect unless terminated as stated above.
+#
+# *8. Miscellaneous*
+#
+# 1. Each time You Distribute or Publicly Perform the Work or a
+# Collection, the Licensor offers to the recipient a license to the
+# Work on the same terms and conditions as the license granted to You
+# under this License.
+# 2. Each time You Distribute or Publicly Perform an Adaptation, Licensor
+# offers to the recipient a license to the original Work on the same
+# terms and conditions as the license granted to You under this License.
+# 3. If any provision of this License is invalid or unenforceable under
+# applicable law, it shall not affect the validity or enforceability
+# of the remainder of the terms of this License, and without further
+# action by the parties to this agreement, such provision shall be
+# reformed to the minimum extent necessary to make such provision
+# valid and enforceable.
+# 4. No term or provision of this License shall be deemed waived and no
+# breach consented to unless such waiver or consent shall be in
+# writing and signed by the party to be charged with such waiver or
+# consent.
+# 5. This License constitutes the entire agreement between the parties
+# with respect to the Work licensed here. There are no understandings,
+# agreements or representations with respect to the Work not specified
+# here. Licensor shall not be bound by any additional provisions that
+# may appear in any communication from You. This License may not be
+# modified without the mutual written agreement of the Licensor and You.
+# 6. The rights granted under, and the subject matter referenced, in this
+# License were drafted utilizing the terminology of the Berne
+# Convention for the Protection of Literary and Artistic Works (as
+# amended on September 28, 1979), the Rome Convention of 1961, the
+# WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms
+# Treaty of 1996 and the Universal Copyright Convention (as revised on
+# July 24, 1971). These rights and subject matter take effect in the
+# relevant jurisdiction in which the License terms are sought to be
+# enforced according to the corresponding provisions of the
+# implementation of those treaty provisions in the applicable national
+# law. If the standard suite of rights granted under applicable
+# copyright law includes additional rights not granted under this
+# License, such additional rights are deemed to be included in the
+# License; this License is not intended to restrict the license of any
+# rights under applicable law.
+absorver->absorber
+absorviendo->absorbiendo
+aca->acá
+academica->académica
+academicamente->académicamente
+academico->académico
+accion->acción
+aceptacion->aceptación
+acetado->aceptado
+ademas->además
+administracion->administración
+aerea->aérea
+aereo->aéreo
+aficion->afición
+aficcion->afición
+aficción->afición
+ahi->ahí
+al Cairo->a El Cairo
+album->álbum
+alevin->alevín
+algun->algún
+alli->allí
+alla->allá
+al rededor->alrededor
+aprobechar->aprovechar
+aqui->aquí
+arabe->árabe
+arbol->árbol
+area->área
+articulacion->articulación
+asi->así
+atencion->atención
+atlantico->atlántico
+automovil->automóvil
+avion->avión
+azucar->azúcar
+bibliografia->bibliografía
+bién->bien
+Bogota->Bogotá
+Brasilero->brasileño
+Brasilera->brasileña
+buho->búho
+cadaver->cadáver
+cafe->café
+cafeteria->cafetería
+camaleon->camaleón
+camara->cámara
+cancion->canción
+candadear->candear
+caracter->carácter
+caracteristica->característica
+carroceria->carrocería
+catastrofe->catástrofe
+catastrofica->catastrófica
+catastrofico->catastrófico
+categoria->categoría
+cién->cien
+CD's->CD
+CDs->CD
+cogeran->cogerán
+cogia->cogía
+cogian->cogían
+cojer->coger
+cojen->cogen
+cojerán->cogerán
+cojía->cogía
+cojia->cogía
+cojían->cogían
+cojió->cogió
+companía->compañía
+compañia->compañía
+compasion->compasión
+comun->común
+comunmente->comúnmente
+conección->conexión
+cono urbano->conurbano
+consideracion->consideración
+constituída->constituida
+constituído->constituido
+construído->construido
+construír->construir
+continuan->continúan
+contínuo->continuo
+convirtio->convirtió
+cortesmente->cortésmente
+cronologica->cronológica
+cronologicamente->cronológicamente
+cronologico->cronológico
+da a lugar a->da lugar a
+dar a lugar a->dar lugar a
+daría a lugar a->daría lugar a
+dá->da
+definio->definió
+del Cairo->de El Cairo
+del interfaz->de la interfaz
+delfin->delfín
+desconto->descontó
+desovediente->desobediente
+deshechar->desechar
+deshechando->desechando
+despues->después
+dia->día
+dias->días
+dieciseis->dieciséis
+diéz->diez
+dificil->difícil
+dificilmente->difícilmente
+dio a lugar a->dio lugar a
+dió->dio
+discusion->discusión
+disolucion->disolución
+distorción->distorsión
+distorcionado->distorsionado
+distribuído->distribuido
+duodecimo->duodécimo
+e hielo->y hielo
+e hierro->y hierro
+e iones->y iones
+ebano->ébano
+eclesiastico->eclesiástico
+eclesiasticos->eclesiásticos
+el fue->él fue
+el interfaz->la interfaz
+el Osasuna->Osasuna
+embarcacion->embarcación
+enbarcacion->embarcación
+enbarcación->embarcación
+empezo->empezó
+enlaze->enlace
+eolico->eólico
+equalización->ecualización
+equalizador->ecualizador
+equalizar->ecualizar
+espiritu->espíritu
+estan->están
+estandard->estándar
+estándard->estándar
+etc...->etc.
+etimologia->etimología
+exámen->examen
+examenes->exámenes
+exitar->excitar
+exito->éxito
+exemplo->ejemplo
+explendor->esplendor
+extrangero->extranjero
+estranjero->extranjero
+estrangero->extranjero
+extricta->estricta
+extricto->estricto
+extrictamente->estrictamente
+espia->espía
+esprecion->expresión
+espreción->expresión
+espresion->expresión
+espresión->expresión
+expresion->expresión
+facil->fácil
+facilmente->fácilmente
+fanatica->fanática
+fanaticamente->fanáticamente
+fanatico->fanático
+fé->fe
+ficcion->ficción
+fisica->física
+fluído->fluido
+fricion->fricción
+frición->fricción
+friccion->fricción
+fucion->fusión
+fución->fusión
+fué->fue
+fuí->fui
+funcion->función
+fusion->fusión
+futbol->fútbol
+futil->fútil
+garage->garaje
+guión->guion
+Guipuzcoa->Guipúzcoa
+gustaria->gustaría
+Gutierrez->Gutiérrez
+habia->había
+haiga->haya
+habian->habían
+hechar->echar
+hechado->echado
+herbivoro->herbívoro
+herviboro->herbívoro
+hervíboro->herbívoro
+hervivoro->herbívoro
+hervívoro->herbívoro
+hermita->ermita
+heroe->héroe
+heróica->heroica
+heróico->heroico
+hibridización->hibridación
+hinduísmo->hinduismo
+hinduísta->hinduista
+homogenea->homogénea
+homogeneo->homogéneo
+hormigon->hormigón
+ideologia->ideología
+ideologica->ideológica
+ideologicamente->ideológicamente
+ideologico->ideológico
+imágen->imagen
+imagenes->imágenes
+IMDB->IMDb
+incluído->incluido
+incluír->incluir
+indice->índice
+interface->interfaz
+interperie->intemperie
+inutil->inútil
+invasion->invasión
+israeli->israelí
+israelies->israelíes
+jardin->jardín
+jente->gente
+jóven->joven
+judia->judía
+judias->judías
+judio->judío
+judios->judíos
+Km->km
+km2->km²
+lampara->lámpara
+le hecha->le echa
+leido->leído
+leon->león
+lider->líder
+linea->línea
+lineas->líneas
+linia->línea
+llendo->yendo
+llevada acabo->llevada a cabo
+llevado acabo->llevado a cabo
+llevaron acabo->llevaron a cabo
+llevó acabo->llevó a cabo
+logica->lógica
+logicamente->lógicamente
+logico->lógico
+lo hecha->lo echa
+lonjeva->longeva
+lonjevo->longevo
+mecanica->mecánica
+mecanicamente->mecánicamente
+mecanico->mecánico
+magica->mágica
+magico->mágico
+martir->mártir
+maxima->máxima
+maximo->máximo
+mayoria->mayoría
+mayuscula->mayúscula
+mayusculo->mayúsculo
+metodologia->metodología
+Mexico->México
+míl->mil
+minima->mínima
+minimo->mínimo
+minoria->minoría
+minuscula->minúscula
+minusculo->minúsculo
+mitologia->mitología
+mitologica->mitológica
+mitologico->mitológico
+mitomana->mitómana
+mitomania->mitomanía
+mitomano->mitómano
+monton->montón
+movil->móvil
+murciegalo->murciélago
+murciégalo->murciélago
+murio->murió
+musica->música
+nacio->nació
+nadien->nadie
+ningun->ningún
+oceano->océano
+olimpica->olímpica
+olimpicamente->olímpicamente
+olimpico->olímpico
+operacion->operación
+oraculo->oráculo
+órden->orden
+organica->orgánica
+organico->orgánico
+organo->órgano
+orígen->origen
+origenes->orígenes
+osea->o sea
+oceano pacifico->océano pacífico
+ONG's->ONG
+ONGs-> ONG
+OVNI's->OVNI
+OVNIs->OVNI
+pagina->página
+pais->país
+paparazzis->paparazzi
+participacion->participación
+pasion->pasión
+pelicula->película
+peloton->pelotón
+perfíl->perfil
+persuación->persuasión
+politica->política
+politicamente->políticamente
+politico->político
+por contra-> por el contrario
+practicamente->prácticamente
+prerequisito->prerrequisito
+pre-requisito->prerrequisito
+preveer->prever
+prevencion->prevención
+programacion->programación
+promocion->promoción
+protejer->proteger
+publicamente->públicamente
+quiza->quizá
+quizas->quizás
+rapido->rápido
+rapida->rápida
+regilla->rejilla
+remplazar->reemplazar
+republica->república
+resolucion->resolución
+restaurant->restaurante
+revizado->revisado
+revizar->revisar
+revolucion->revolución
+rocin->rocín
+ruído->ruido
+sacerdotiza->sacerdotisa
+sazon->sazón
+se a->se ha
+séis->seis
+segun->según
+sera->será
+serpentin->serpentín
+sinembargo->sin embargo
+sinfin->sinfín
+slogan->eslogan
+sóla->sola
+sólamente->solamente
+solucion->solución
+stándard->estándar
+subrraya->subraya
+subrrayado->subrayado
+subrrayar->subrayar
+superfície->superficie
+supérflua->superflua
+tagea->tajea
+talvez->tal vez
+tambien->también
+tanbien->también
+tanbién->también
+tecnica->técnica
+tecnicamente->técnicamente
+tecnico->técnico
+tí->ti
+tia->tía
+tio->tío
+tipica->típica
+tipicamente->típicamente
+tipico->típico
+tradució->tradujo,traducción
+traducion->traducción
+tradución->traducción
+traduccion->traducción
+traf->tráf
+tunel->túnel
+ubicacion->ubicación
+ultimamente->últimamente
+ultimo->último
+ultimos->últimos
+un interfaz->una interfaz
+undecimo->undécimo
+unica->única
+unicamente->únicamente
+unico->único
+util->útil
+vease->véase
+veintidos->veintidós
+veintiseis->veintiséis
+veintitres->veintitrés
+vision->visión
+via->vía
+vió->vio
+watios->vatios
diff --git a/love2dToAPK/tools/tools/android-win/tools/support/typos-hu.txt b/love2dToAPK/tools/tools/android-win/tools/support/typos-hu.txt
new file mode 100644
index 0000000..e0586bf
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/support/typos-hu.txt
@@ -0,0 +1,431 @@
+# This file contains a number of common Hungarian typos:
+andriod->android
+
+# The remainder of this file contains misspellings from
+# http://hu.wikipedia.org/wiki/Szerkeszt%C5%91:AntiVandal/Hiba
+# plus some post-processing to fix invalid entries, remove duplicates, etc.
+#
+# The content is available under the
+# "Creative Commons Attribution-ShareAlike License"
+# http://creativecommons.org/licenses/by-sa/3.0/
+#
+# THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
+# COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
+# COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
+# AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
+#
+# BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
+# TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY
+# BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS
+# CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
+# CONDITIONS.
+#
+# *1. Definitions*
+#
+# 1. *"Adaptation"* means a work based upon the Work, or upon the Work
+# and other pre-existing works, such as a translation, adaptation,
+# derivative work, arrangement of music or other alterations of a
+# literary or artistic work, or phonogram or performance and includes
+# cinematographic adaptations or any other form in which the Work may
+# be recast, transformed, or adapted including in any form
+# recognizably derived from the original, except that a work that
+# constitutes a Collection will not be considered an Adaptation for
+# the purpose of this License. For the avoidance of doubt, where the
+# Work is a musical work, performance or phonogram, the
+# synchronization of the Work in timed-relation with a moving image
+# ("synching") will be considered an Adaptation for the purpose of
+# this License.
+# 2. *"Collection"* means a collection of literary or artistic works,
+# such as encyclopedias and anthologies, or performances, phonograms
+# or broadcasts, or other works or subject matter other than works
+# listed in Section 1(f) below, which, by reason of the selection and
+# arrangement of their contents, constitute intellectual creations, in
+# which the Work is included in its entirety in unmodified form along
+# with one or more other contributions, each constituting separate and
+# independent works in themselves, which together are assembled into a
+# collective whole. A work that constitutes a Collection will not be
+# considered an Adaptation (as defined below) for the purposes of this
+# License.
+# 3. *"Creative Commons Compatible License"* means a license that is
+# listed at http://creativecommons.org/compatiblelicenses that has
+# been approved by Creative Commons as being essentially equivalent to
+# this License, including, at a minimum, because that license: (i)
+# contains terms that have the same purpose, meaning and effect as the
+# License Elements of this License; and, (ii) explicitly permits the
+# relicensing of adaptations of works made available under that
+# license under this License or a Creative Commons jurisdiction
+# license with the same License Elements as this License.
+# 4. *"Distribute"* means to make available to the public the original
+# and copies of the Work or Adaptation, as appropriate, through sale
+# or other transfer of ownership.
+# 5. *"License Elements"* means the following high-level license
+# attributes as selected by Licensor and indicated in the title of
+# this License: Attribution, ShareAlike.
+# 6. *"Licensor"* means the individual, individuals, entity or entities
+# that offer(s) the Work under the terms of this License.
+# 7. *"Original Author"* means, in the case of a literary or artistic
+# work, the individual, individuals, entity or entities who created
+# the Work or if no individual or entity can be identified, the
+# publisher; and in addition (i) in the case of a performance the
+# actors, singers, musicians, dancers, and other persons who act,
+# sing, deliver, declaim, play in, interpret or otherwise perform
+# literary or artistic works or expressions of folklore; (ii) in the
+# case of a phonogram the producer being the person or legal entity
+# who first fixes the sounds of a performance or other sounds; and,
+# (iii) in the case of broadcasts, the organization that transmits the
+# broadcast.
+# 8. *"Work"* means the literary and/or artistic work offered under the
+# terms of this License including without limitation any production in
+# the literary, scientific and artistic domain, whatever may be the
+# mode or form of its expression including digital form, such as a
+# book, pamphlet and other writing; a lecture, address, sermon or
+# other work of the same nature; a dramatic or dramatico-musical work;
+# a choreographic work or entertainment in dumb show; a musical
+# composition with or without words; a cinematographic work to which
+# are assimilated works expressed by a process analogous to
+# cinematography; a work of drawing, painting, architecture,
+# sculpture, engraving or lithography; a photographic work to which
+# are assimilated works expressed by a process analogous to
+# photography; a work of applied art; an illustration, map, plan,
+# sketch or three-dimensional work relative to geography, topography,
+# architecture or science; a performance; a broadcast; a phonogram; a
+# compilation of data to the extent it is protected as a copyrightable
+# work; or a work performed by a variety or circus performer to the
+# extent it is not otherwise considered a literary or artistic work.
+# 9. *"You"* means an individual or entity exercising rights under this
+# License who has not previously violated the terms of this License
+# with respect to the Work, or who has received express permission
+# from the Licensor to exercise rights under this License despite a
+# previous violation.
+# 10. *"Publicly Perform"* means to perform public recitations of the Work
+# and to communicate to the public those public recitations, by any
+# means or process, including by wire or wireless means or public
+# digital performances; to make available to the public Works in such
+# a way that members of the public may access these Works from a place
+# and at a place individually chosen by them; to perform the Work to
+# the public by any means or process and the communication to the
+# public of the performances of the Work, including by public digital
+# performance; to broadcast and rebroadcast the Work by any means
+# including signs, sounds or images.
+# 11. *"Reproduce"* means to make copies of the Work by any means
+# including without limitation by sound or visual recordings and the
+# right of fixation and reproducing fixations of the Work, including
+# storage of a protected performance or phonogram in digital form or
+# other electronic medium.
+#
+# *2. Fair Dealing Rights.* Nothing in this License is intended to reduce,
+# limit, or restrict any uses free from copyright or rights arising from
+# limitations or exceptions that are provided for in connection with the
+# copyright protection under copyright law or other applicable laws.
+#
+# *3. License Grant.* Subject to the terms and conditions of this License,
+# Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
+# perpetual (for the duration of the applicable copyright) license to
+# exercise the rights in the Work as stated below:
+#
+# 1. to Reproduce the Work, to incorporate the Work into one or more
+# Collections, and to Reproduce the Work as incorporated in the
+# Collections;
+# 2. to create and Reproduce Adaptations provided that any such
+# Adaptation, including any translation in any medium, takes
+# reasonable steps to clearly label, demarcate or otherwise identify
+# that changes were made to the original Work. For example, a
+# translation could be marked "The original work was translated from
+# English to Spanish," or a modification could indicate "The original
+# work has been modified.";
+# 3. to Distribute and Publicly Perform the Work including as
+# incorporated in Collections; and,
+# 4. to Distribute and Publicly Perform Adaptations.
+# 5.
+#
+# For the avoidance of doubt:
+#
+# 1. *Non-waivable Compulsory License Schemes*. In those
+# jurisdictions in which the right to collect royalties through
+# any statutory or compulsory licensing scheme cannot be waived,
+# the Licensor reserves the exclusive right to collect such
+# royalties for any exercise by You of the rights granted under
+# this License;
+# 2. *Waivable Compulsory License Schemes*. In those jurisdictions in
+# which the right to collect royalties through any statutory or
+# compulsory licensing scheme can be waived, the Licensor waives
+# the exclusive right to collect such royalties for any exercise
+# by You of the rights granted under this License; and,
+# 3. *Voluntary License Schemes*. The Licensor waives the right to
+# collect royalties, whether individually or, in the event that
+# the Licensor is a member of a collecting society that
+# administers voluntary licensing schemes, via that society, from
+# any exercise by You of the rights granted under this License.
+#
+# The above rights may be exercised in all media and formats whether now
+# known or hereafter devised. The above rights include the right to make
+# such modifications as are technically necessary to exercise the rights
+# in other media and formats. Subject to Section 8(f), all rights not
+# expressly granted by Licensor are hereby reserved.
+#
+# *4. Restrictions.* The license granted in Section 3 above is expressly
+# made subject to and limited by the following restrictions:
+#
+# 1. You may Distribute or Publicly Perform the Work only under the terms
+# of this License. You must include a copy of, or the Uniform Resource
+# Identifier (URI) for, this License with every copy of the Work You
+# Distribute or Publicly Perform. You may not offer or impose any
+# terms on the Work that restrict the terms of this License or the
+# ability of the recipient of the Work to exercise the rights granted
+# to that recipient under the terms of the License. You may not
+# sublicense the Work. You must keep intact all notices that refer to
+# this License and to the disclaimer of warranties with every copy of
+# the Work You Distribute or Publicly Perform. When You Distribute or
+# Publicly Perform the Work, You may not impose any effective
+# technological measures on the Work that restrict the ability of a
+# recipient of the Work from You to exercise the rights granted to
+# that recipient under the terms of the License. This Section 4(a)
+# applies to the Work as incorporated in a Collection, but this does
+# not require the Collection apart from the Work itself to be made
+# subject to the terms of this License. If You create a Collection,
+# upon notice from any Licensor You must, to the extent practicable,
+# remove from the Collection any credit as required by Section 4(c),
+# as requested. If You create an Adaptation, upon notice from any
+# Licensor You must, to the extent practicable, remove from the
+# Adaptation any credit as required by Section 4(c), as requested.
+# 2. You may Distribute or Publicly Perform an Adaptation only under the
+# terms of: (i) this License; (ii) a later version of this License
+# with the same License Elements as this License; (iii) a Creative
+# Commons jurisdiction license (either this or a later license
+# version) that contains the same License Elements as this License
+# (e.g., Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons
+# Compatible License. If you license the Adaptation under one of the
+# licenses mentioned in (iv), you must comply with the terms of that
+# license. If you license the Adaptation under the terms of any of the
+# licenses mentioned in (i), (ii) or (iii) (the "Applicable License"),
+# you must comply with the terms of the Applicable License generally
+# and the following provisions: (I) You must include a copy of, or the
+# URI for, the Applicable License with every copy of each Adaptation
+# You Distribute or Publicly Perform; (II) You may not offer or impose
+# any terms on the Adaptation that restrict the terms of the
+# Applicable License or the ability of the recipient of the Adaptation
+# to exercise the rights granted to that recipient under the terms of
+# the Applicable License; (III) You must keep intact all notices that
+# refer to the Applicable License and to the disclaimer of warranties
+# with every copy of the Work as included in the Adaptation You
+# Distribute or Publicly Perform; (IV) when You Distribute or Publicly
+# Perform the Adaptation, You may not impose any effective
+# technological measures on the Adaptation that restrict the ability
+# of a recipient of the Adaptation from You to exercise the rights
+# granted to that recipient under the terms of the Applicable License.
+# This Section 4(b) applies to the Adaptation as incorporated in a
+# Collection, but this does not require the Collection apart from the
+# Adaptation itself to be made subject to the terms of the Applicable
+# License.
+# 3. If You Distribute, or Publicly Perform the Work or any Adaptations
+# or Collections, You must, unless a request has been made pursuant to
+# Section 4(a), keep intact all copyright notices for the Work and
+# provide, reasonable to the medium or means You are utilizing: (i)
+# the name of the Original Author (or pseudonym, if applicable) if
+# supplied, and/or if the Original Author and/or Licensor designate
+# another party or parties (e.g., a sponsor institute, publishing
+# entity, journal) for attribution ("Attribution Parties") in
+# Licensor's copyright notice, terms of service or by other reasonable
+# means, the name of such party or parties; (ii) the title of the Work
+# if supplied; (iii) to the extent reasonably practicable, the URI, if
+# any, that Licensor specifies to be associated with the Work, unless
+# such URI does not refer to the copyright notice or licensing
+# information for the Work; and (iv) , consistent with Ssection 3(b),
+# in the case of an Adaptation, a credit identifying the use of the
+# Work in the Adaptation (e.g., "French translation of the Work by
+# Original Author," or "Screenplay based on original Work by Original
+# Author"). The credit required by this Section 4(c) may be
+# implemented in any reasonable manner; provided, however, that in the
+# case of a Adaptation or Collection, at a minimum such credit will
+# appear, if a credit for all contributing authors of the Adaptation
+# or Collection appears, then as part of these credits and in a manner
+# at least as prominent as the credits for the other contributing
+# authors. For the avoidance of doubt, You may only use the credit
+# required by this Section for the purpose of attribution in the
+# manner set out above and, by exercising Your rights under this
+# License, You may not implicitly or explicitly assert or imply any
+# connection with, sponsorship or endorsement by the Original Author,
+# Licensor and/or Attribution Parties, as appropriate, of You or Your
+# use of the Work, without the separate, express prior written
+# permission of the Original Author, Licensor and/or Attribution Parties.
+# 4. Except as otherwise agreed in writing by the Licensor or as may be
+# otherwise permitted by applicable law, if You Reproduce, Distribute
+# or Publicly Perform the Work either by itself or as part of any
+# Adaptations or Collections, You must not distort, mutilate, modify
+# or take other derogatory action in relation to the Work which would
+# be prejudicial to the Original Author's honor or reputation.
+# Licensor agrees that in those jurisdictions (e.g. Japan), in which
+# any exercise of the right granted in Section 3(b) of this License
+# (the right to make Adaptations) would be deemed to be a distortion,
+# mutilation, modification or other derogatory action prejudicial to
+# the Original Author's honor and reputation, the Licensor will waive
+# or not assert, as appropriate, this Section, to the fullest extent
+# permitted by the applicable national law, to enable You to
+# reasonably exercise Your right under Section 3(b) of this License
+# (right to make Adaptations) but not otherwise.
+#
+# *5. Representations, Warranties and Disclaimer*
+#
+# UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
+# OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
+# KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
+# INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
+# LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
+# WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE
+# EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
+#
+# *6. Limitation on Liability.* EXCEPT TO THE EXTENT REQUIRED BY
+# APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL
+# THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY
+# DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF
+# LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+#
+# *7. Termination*
+#
+# 1. This License and the rights granted hereunder will terminate
+# automatically upon any breach by You of the terms of this License.
+# Individuals or entities who have received Adaptations or Collections
+# from You under this License, however, will not have their licenses
+# terminated provided such individuals or entities remain in full
+# compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will
+# survive any termination of this License.
+# 2. Subject to the above terms and conditions, the license granted here
+# is perpetual (for the duration of the applicable copyright in the
+# Work). Notwithstanding the above, Licensor reserves the right to
+# release the Work under different license terms or to stop
+# distributing the Work at any time; provided, however that any such
+# election will not serve to withdraw this License (or any other
+# license that has been, or is required to be, granted under the terms
+# of this License), and this License will continue in full force and
+# effect unless terminated as stated above.
+#
+# *8. Miscellaneous*
+#
+# 1. Each time You Distribute or Publicly Perform the Work or a
+# Collection, the Licensor offers to the recipient a license to the
+# Work on the same terms and conditions as the license granted to You
+# under this License.
+# 2. Each time You Distribute or Publicly Perform an Adaptation, Licensor
+# offers to the recipient a license to the original Work on the same
+# terms and conditions as the license granted to You under this License.
+# 3. If any provision of this License is invalid or unenforceable under
+# applicable law, it shall not affect the validity or enforceability
+# of the remainder of the terms of this License, and without further
+# action by the parties to this agreement, such provision shall be
+# reformed to the minimum extent necessary to make such provision
+# valid and enforceable.
+# 4. No term or provision of this License shall be deemed waived and no
+# breach consented to unless such waiver or consent shall be in
+# writing and signed by the party to be charged with such waiver or
+# consent.
+# 5. This License constitutes the entire agreement between the parties
+# with respect to the Work licensed here. There are no understandings,
+# agreements or representations with respect to the Work not specified
+# here. Licensor shall not be bound by any additional provisions that
+# may appear in any communication from You. This License may not be
+# modified without the mutual written agreement of the Licensor and You.
+# 6. The rights granted under, and the subject matter referenced, in this
+# License were drafted utilizing the terminology of the Berne
+# Convention for the Protection of Literary and Artistic Works (as
+# amended on September 28, 1979), the Rome Convention of 1961, the
+# WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms
+# Treaty of 1996 and the Universal Copyright Convention (as revised on
+# July 24, 1971). These rights and subject matter take effect in the
+# relevant jurisdiction in which the License terms are sought to be
+# enforced according to the corresponding provisions of the
+# implementation of those treaty provisions in the applicable national
+# law. If the standard suite of rights granted under applicable
+# copyright law includes additional rights not granted under this
+# License, such additional rights are deemed to be included in the
+# License; this License is not intended to restrict the license of any
+# rights under applicable law.
+0-át->0-t
+1.-én->1-jén
+10.-én->10-én
+11.-én->11-én
+12.-én->12-én
+13.-án->13-án
+14.-én->14-én
+15.-én->15-én
+16.-án->16-án
+17.-én->17-én
+18.-án->18-án
+19.-én->19-én
+1-e->1-je
+1-el->1-gyel
+1-én->1-jén
+2.-án->2-án
+20.-án->20-án
+21.-én->21-én
+22.-én->22-én
+23.-án->23-án
+24.-én->24-én
+25.-én->25-én
+26.-án->26-án
+27.-én->27-én
+28.-án->28-án
+29.-én->29-én
+2-őt->2-t
+3.-án->3-án
+30.-án->30-án
+31.-én->31-én
+4.-én->4-én
+5.-én->5-én
+6.-án->6-án
+7.-én->7-én
+8.-án->8-án
+9.-én->9-én
+abszolut->abszolút
+ambíciózus->ambiciózus
+asszimetrikus->aszimmetrikus
+árú->áru
+azomban->azonban
+bejjebb->beljebb
+bisztos->biztos
+brilliáns->briliáns
+cimke->címke
+dícséret->dicséret
+egyenlőre->egyelőre
+egyértelmüsítő->egyértelműsítő
+eggyütt->együtt
+elipszis->ellipszis
+follyon->folyjon
+hektóliter->hektoliter
+hellénista->hellenista
+hellénisztikus->hellenisztikus
+hellénizmus->hellenizmus
+Horatiussal->Horatiusszal
+igéret->ígéret
+irígy->irigy
+kálcium->kalcium
+kellet->kellett
+keveseb->kevesebb
+kilóméter->kilométer
+kisseb->kisebb
+kissebb->kisebb
+konkurrencia->konkurencia
+konkurrens->konkurens
+könnyeb->könnyebb
+könyebb->könnyebb
+kultura->kultúra
+kultúrális->kulturális
+külömbség->különbség
+külömböző->különböző
+legjob->legjobb
+legkeveseb->legkevesebb
+legnagyob->legnagyobb
+lessz->lesz
+mellet->mellett
+mindíg->mindig
+muszály->muszáj
+new yorki->New York-i
+orzság->ország
+önnálló->önálló
+raffinált->rafinált
+szinvonal->színvonal
+Szovjetúnió->Szovjetunió
+Torino-i->torinói
+únió->unió
+vákum->vákuum
+Vietnám->Vietnam
diff --git a/love2dToAPK/tools/tools/android-win/tools/support/typos-it.txt b/love2dToAPK/tools/tools/android-win/tools/support/typos-it.txt
new file mode 100644
index 0000000..5c2d496
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/support/typos-it.txt
@@ -0,0 +1,665 @@
+# This file contains a number of common Italian typos:
+andriod->android
+
+# The remainder of this file contains misspellings from
+# http://it.m.wikipedia.org/wiki/Utente:Senpai/Lista_degli_errori_comuni/Formato_macchina
+# plus some post-processing to fix invalid entries, remove duplicates, etc.
+#
+# The content is available under the
+# "Creative Commons Attribution-ShareAlike License"
+# http://creativecommons.org/licenses/by-sa/3.0/
+#
+# THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
+# COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
+# COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
+# AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
+#
+# BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
+# TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY
+# BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS
+# CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
+# CONDITIONS.
+#
+# *1. Definitions*
+#
+# 1. *"Adaptation"* means a work based upon the Work, or upon the Work
+# and other pre-existing works, such as a translation, adaptation,
+# derivative work, arrangement of music or other alterations of a
+# literary or artistic work, or phonogram or performance and includes
+# cinematographic adaptations or any other form in which the Work may
+# be recast, transformed, or adapted including in any form
+# recognizably derived from the original, except that a work that
+# constitutes a Collection will not be considered an Adaptation for
+# the purpose of this License. For the avoidance of doubt, where the
+# Work is a musical work, performance or phonogram, the
+# synchronization of the Work in timed-relation with a moving image
+# ("synching") will be considered an Adaptation for the purpose of
+# this License.
+# 2. *"Collection"* means a collection of literary or artistic works,
+# such as encyclopedias and anthologies, or performances, phonograms
+# or broadcasts, or other works or subject matter other than works
+# listed in Section 1(f) below, which, by reason of the selection and
+# arrangement of their contents, constitute intellectual creations, in
+# which the Work is included in its entirety in unmodified form along
+# with one or more other contributions, each constituting separate and
+# independent works in themselves, which together are assembled into a
+# collective whole. A work that constitutes a Collection will not be
+# considered an Adaptation (as defined below) for the purposes of this
+# License.
+# 3. *"Creative Commons Compatible License"* means a license that is
+# listed at http://creativecommons.org/compatiblelicenses that has
+# been approved by Creative Commons as being essentially equivalent to
+# this License, including, at a minimum, because that license: (i)
+# contains terms that have the same purpose, meaning and effect as the
+# License Elements of this License; and, (ii) explicitly permits the
+# relicensing of adaptations of works made available under that
+# license under this License or a Creative Commons jurisdiction
+# license with the same License Elements as this License.
+# 4. *"Distribute"* means to make available to the public the original
+# and copies of the Work or Adaptation, as appropriate, through sale
+# or other transfer of ownership.
+# 5. *"License Elements"* means the following high-level license
+# attributes as selected by Licensor and indicated in the title of
+# this License: Attribution, ShareAlike.
+# 6. *"Licensor"* means the individual, individuals, entity or entities
+# that offer(s) the Work under the terms of this License.
+# 7. *"Original Author"* means, in the case of a literary or artistic
+# work, the individual, individuals, entity or entities who created
+# the Work or if no individual or entity can be identified, the
+# publisher; and in addition (i) in the case of a performance the
+# actors, singers, musicians, dancers, and other persons who act,
+# sing, deliver, declaim, play in, interpret or otherwise perform
+# literary or artistic works or expressions of folklore; (ii) in the
+# case of a phonogram the producer being the person or legal entity
+# who first fixes the sounds of a performance or other sounds; and,
+# (iii) in the case of broadcasts, the organization that transmits the
+# broadcast.
+# 8. *"Work"* means the literary and/or artistic work offered under the
+# terms of this License including without limitation any production in
+# the literary, scientific and artistic domain, whatever may be the
+# mode or form of its expression including digital form, such as a
+# book, pamphlet and other writing; a lecture, address, sermon or
+# other work of the same nature; a dramatic or dramatico-musical work;
+# a choreographic work or entertainment in dumb show; a musical
+# composition with or without words; a cinematographic work to which
+# are assimilated works expressed by a process analogous to
+# cinematography; a work of drawing, painting, architecture,
+# sculpture, engraving or lithography; a photographic work to which
+# are assimilated works expressed by a process analogous to
+# photography; a work of applied art; an illustration, map, plan,
+# sketch or three-dimensional work relative to geography, topography,
+# architecture or science; a performance; a broadcast; a phonogram; a
+# compilation of data to the extent it is protected as a copyrightable
+# work; or a work performed by a variety or circus performer to the
+# extent it is not otherwise considered a literary or artistic work.
+# 9. *"You"* means an individual or entity exercising rights under this
+# License who has not previously violated the terms of this License
+# with respect to the Work, or who has received express permission
+# from the Licensor to exercise rights under this License despite a
+# previous violation.
+# 10. *"Publicly Perform"* means to perform public recitations of the Work
+# and to communicate to the public those public recitations, by any
+# means or process, including by wire or wireless means or public
+# digital performances; to make available to the public Works in such
+# a way that members of the public may access these Works from a place
+# and at a place individually chosen by them; to perform the Work to
+# the public by any means or process and the communication to the
+# public of the performances of the Work, including by public digital
+# performance; to broadcast and rebroadcast the Work by any means
+# including signs, sounds or images.
+# 11. *"Reproduce"* means to make copies of the Work by any means
+# including without limitation by sound or visual recordings and the
+# right of fixation and reproducing fixations of the Work, including
+# storage of a protected performance or phonogram in digital form or
+# other electronic medium.
+#
+# *2. Fair Dealing Rights.* Nothing in this License is intended to reduce,
+# limit, or restrict any uses free from copyright or rights arising from
+# limitations or exceptions that are provided for in connection with the
+# copyright protection under copyright law or other applicable laws.
+#
+# *3. License Grant.* Subject to the terms and conditions of this License,
+# Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
+# perpetual (for the duration of the applicable copyright) license to
+# exercise the rights in the Work as stated below:
+#
+# 1. to Reproduce the Work, to incorporate the Work into one or more
+# Collections, and to Reproduce the Work as incorporated in the
+# Collections;
+# 2. to create and Reproduce Adaptations provided that any such
+# Adaptation, including any translation in any medium, takes
+# reasonable steps to clearly label, demarcate or otherwise identify
+# that changes were made to the original Work. For example, a
+# translation could be marked "The original work was translated from
+# English to Spanish," or a modification could indicate "The original
+# work has been modified.";
+# 3. to Distribute and Publicly Perform the Work including as
+# incorporated in Collections; and,
+# 4. to Distribute and Publicly Perform Adaptations.
+# 5.
+#
+# For the avoidance of doubt:
+#
+# 1. *Non-waivable Compulsory License Schemes*. In those
+# jurisdictions in which the right to collect royalties through
+# any statutory or compulsory licensing scheme cannot be waived,
+# the Licensor reserves the exclusive right to collect such
+# royalties for any exercise by You of the rights granted under
+# this License;
+# 2. *Waivable Compulsory License Schemes*. In those jurisdictions in
+# which the right to collect royalties through any statutory or
+# compulsory licensing scheme can be waived, the Licensor waives
+# the exclusive right to collect such royalties for any exercise
+# by You of the rights granted under this License; and,
+# 3. *Voluntary License Schemes*. The Licensor waives the right to
+# collect royalties, whether individually or, in the event that
+# the Licensor is a member of a collecting society that
+# administers voluntary licensing schemes, via that society, from
+# any exercise by You of the rights granted under this License.
+#
+# The above rights may be exercised in all media and formats whether now
+# known or hereafter devised. The above rights include the right to make
+# such modifications as are technically necessary to exercise the rights
+# in other media and formats. Subject to Section 8(f), all rights not
+# expressly granted by Licensor are hereby reserved.
+#
+# *4. Restrictions.* The license granted in Section 3 above is expressly
+# made subject to and limited by the following restrictions:
+#
+# 1. You may Distribute or Publicly Perform the Work only under the terms
+# of this License. You must include a copy of, or the Uniform Resource
+# Identifier (URI) for, this License with every copy of the Work You
+# Distribute or Publicly Perform. You may not offer or impose any
+# terms on the Work that restrict the terms of this License or the
+# ability of the recipient of the Work to exercise the rights granted
+# to that recipient under the terms of the License. You may not
+# sublicense the Work. You must keep intact all notices that refer to
+# this License and to the disclaimer of warranties with every copy of
+# the Work You Distribute or Publicly Perform. When You Distribute or
+# Publicly Perform the Work, You may not impose any effective
+# technological measures on the Work that restrict the ability of a
+# recipient of the Work from You to exercise the rights granted to
+# that recipient under the terms of the License. This Section 4(a)
+# applies to the Work as incorporated in a Collection, but this does
+# not require the Collection apart from the Work itself to be made
+# subject to the terms of this License. If You create a Collection,
+# upon notice from any Licensor You must, to the extent practicable,
+# remove from the Collection any credit as required by Section 4(c),
+# as requested. If You create an Adaptation, upon notice from any
+# Licensor You must, to the extent practicable, remove from the
+# Adaptation any credit as required by Section 4(c), as requested.
+# 2. You may Distribute or Publicly Perform an Adaptation only under the
+# terms of: (i) this License; (ii) a later version of this License
+# with the same License Elements as this License; (iii) a Creative
+# Commons jurisdiction license (either this or a later license
+# version) that contains the same License Elements as this License
+# (e.g., Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons
+# Compatible License. If you license the Adaptation under one of the
+# licenses mentioned in (iv), you must comply with the terms of that
+# license. If you license the Adaptation under the terms of any of the
+# licenses mentioned in (i), (ii) or (iii) (the "Applicable License"),
+# you must comply with the terms of the Applicable License generally
+# and the following provisions: (I) You must include a copy of, or the
+# URI for, the Applicable License with every copy of each Adaptation
+# You Distribute or Publicly Perform; (II) You may not offer or impose
+# any terms on the Adaptation that restrict the terms of the
+# Applicable License or the ability of the recipient of the Adaptation
+# to exercise the rights granted to that recipient under the terms of
+# the Applicable License; (III) You must keep intact all notices that
+# refer to the Applicable License and to the disclaimer of warranties
+# with every copy of the Work as included in the Adaptation You
+# Distribute or Publicly Perform; (IV) when You Distribute or Publicly
+# Perform the Adaptation, You may not impose any effective
+# technological measures on the Adaptation that restrict the ability
+# of a recipient of the Adaptation from You to exercise the rights
+# granted to that recipient under the terms of the Applicable License.
+# This Section 4(b) applies to the Adaptation as incorporated in a
+# Collection, but this does not require the Collection apart from the
+# Adaptation itself to be made subject to the terms of the Applicable
+# License.
+# 3. If You Distribute, or Publicly Perform the Work or any Adaptations
+# or Collections, You must, unless a request has been made pursuant to
+# Section 4(a), keep intact all copyright notices for the Work and
+# provide, reasonable to the medium or means You are utilizing: (i)
+# the name of the Original Author (or pseudonym, if applicable) if
+# supplied, and/or if the Original Author and/or Licensor designate
+# another party or parties (e.g., a sponsor institute, publishing
+# entity, journal) for attribution ("Attribution Parties") in
+# Licensor's copyright notice, terms of service or by other reasonable
+# means, the name of such party or parties; (ii) the title of the Work
+# if supplied; (iii) to the extent reasonably practicable, the URI, if
+# any, that Licensor specifies to be associated with the Work, unless
+# such URI does not refer to the copyright notice or licensing
+# information for the Work; and (iv) , consistent with Ssection 3(b),
+# in the case of an Adaptation, a credit identifying the use of the
+# Work in the Adaptation (e.g., "French translation of the Work by
+# Original Author," or "Screenplay based on original Work by Original
+# Author"). The credit required by this Section 4(c) may be
+# implemented in any reasonable manner; provided, however, that in the
+# case of a Adaptation or Collection, at a minimum such credit will
+# appear, if a credit for all contributing authors of the Adaptation
+# or Collection appears, then as part of these credits and in a manner
+# at least as prominent as the credits for the other contributing
+# authors. For the avoidance of doubt, You may only use the credit
+# required by this Section for the purpose of attribution in the
+# manner set out above and, by exercising Your rights under this
+# License, You may not implicitly or explicitly assert or imply any
+# connection with, sponsorship or endorsement by the Original Author,
+# Licensor and/or Attribution Parties, as appropriate, of You or Your
+# use of the Work, without the separate, express prior written
+# permission of the Original Author, Licensor and/or Attribution Parties.
+# 4. Except as otherwise agreed in writing by the Licensor or as may be
+# otherwise permitted by applicable law, if You Reproduce, Distribute
+# or Publicly Perform the Work either by itself or as part of any
+# Adaptations or Collections, You must not distort, mutilate, modify
+# or take other derogatory action in relation to the Work which would
+# be prejudicial to the Original Author's honor or reputation.
+# Licensor agrees that in those jurisdictions (e.g. Japan), in which
+# any exercise of the right granted in Section 3(b) of this License
+# (the right to make Adaptations) would be deemed to be a distortion,
+# mutilation, modification or other derogatory action prejudicial to
+# the Original Author's honor and reputation, the Licensor will waive
+# or not assert, as appropriate, this Section, to the fullest extent
+# permitted by the applicable national law, to enable You to
+# reasonably exercise Your right under Section 3(b) of this License
+# (right to make Adaptations) but not otherwise.
+#
+# *5. Representations, Warranties and Disclaimer*
+#
+# UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
+# OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
+# KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
+# INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
+# LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
+# WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE
+# EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
+#
+# *6. Limitation on Liability.* EXCEPT TO THE EXTENT REQUIRED BY
+# APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL
+# THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY
+# DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF
+# LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+#
+# *7. Termination*
+#
+# 1. This License and the rights granted hereunder will terminate
+# automatically upon any breach by You of the terms of this License.
+# Individuals or entities who have received Adaptations or Collections
+# from You under this License, however, will not have their licenses
+# terminated provided such individuals or entities remain in full
+# compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will
+# survive any termination of this License.
+# 2. Subject to the above terms and conditions, the license granted here
+# is perpetual (for the duration of the applicable copyright in the
+# Work). Notwithstanding the above, Licensor reserves the right to
+# release the Work under different license terms or to stop
+# distributing the Work at any time; provided, however that any such
+# election will not serve to withdraw this License (or any other
+# license that has been, or is required to be, granted under the terms
+# of this License), and this License will continue in full force and
+# effect unless terminated as stated above.
+#
+# *8. Miscellaneous*
+#
+# 1. Each time You Distribute or Publicly Perform the Work or a
+# Collection, the Licensor offers to the recipient a license to the
+# Work on the same terms and conditions as the license granted to You
+# under this License.
+# 2. Each time You Distribute or Publicly Perform an Adaptation, Licensor
+# offers to the recipient a license to the original Work on the same
+# terms and conditions as the license granted to You under this License.
+# 3. If any provision of this License is invalid or unenforceable under
+# applicable law, it shall not affect the validity or enforceability
+# of the remainder of the terms of this License, and without further
+# action by the parties to this agreement, such provision shall be
+# reformed to the minimum extent necessary to make such provision
+# valid and enforceable.
+# 4. No term or provision of this License shall be deemed waived and no
+# breach consented to unless such waiver or consent shall be in
+# writing and signed by the party to be charged with such waiver or
+# consent.
+# 5. This License constitutes the entire agreement between the parties
+# with respect to the Work licensed here. There are no understandings,
+# agreements or representations with respect to the Work not specified
+# here. Licensor shall not be bound by any additional provisions that
+# may appear in any communication from You. This License may not be
+# modified without the mutual written agreement of the Licensor and You.
+# 6. The rights granted under, and the subject matter referenced, in this
+# License were drafted utilizing the terminology of the Berne
+# Convention for the Protection of Literary and Artistic Works (as
+# amended on September 28, 1979), the Rome Convention of 1961, the
+# WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms
+# Treaty of 1996 and the Universal Copyright Convention (as revised on
+# July 24, 1971). These rights and subject matter take effect in the
+# relevant jurisdiction in which the License terms are sought to be
+# enforced according to the corresponding provisions of the
+# implementation of those treaty provisions in the applicable national
+# law. If the standard suite of rights granted under applicable
+# copyright law includes additional rights not granted under this
+# License, such additional rights are deemed to be included in the
+# License; this License is not intended to restrict the license of any
+# rights under applicable law.
+accellerare->accelerare
+acellerare->accelerare
+accellerata->accelerata
+accellerato->accelerato
+accellerazione->accelerazione
+aereonautica->aeronautica
+aereoporti->aeroporti
+aereoporto->aeroporto
+aereosilurante->aerosilurante
+aereosiluranti->aerosiluranti
+affianco->a fianco
+affilliate->affiliate
+aggiottaggio->aggiotaggio
+aggresive->aggressive
+agravate->aggravate
+alse->else
+appropiata->appropriata
+appropiate->appropriate
+appropiati->appropriati
+appropiato->appropriato
+approposito->a proposito
+appropraite->appropriate
+appropropiate->appropriate
+approvigionamento->approvvigionamento
+apropriate->appropriate
+areazione->aerazione
+areoporti->aeroporti
+areoporto->aeroporto
+assisnate->assassinate
+assit->assist
+asume->assume
+audeince->audience
+austrailia->Australia
+automibile->automobile
+avvallo->avallo
+backgorund->background
+backrounds->backgrounds
+benchè->benché
+Bernouilli->Bernoulli
+biricchino->birichino
+bizzare->bizzarre
+Buddah->Buddha
+buisness->business
+busness->business
+bussiness->business
+caffé->caffè
+Caltanisetta->Caltanissetta
+Cambrige->Cambridge
+candadate->candidate
+candiate->candidate
+candidiate->candidate
+casette->cassette
+Celcius->Celsius
+Champange->Champagne
+cioé->cioè
+ciriculum->curriculum
+cmoputer->computer
+coctail->cocktail
+coefficente->coefficiente
+coefficenti->coefficienti
+collaberative->collaborative
+collutazione->colluttazione
+commemerative->commemorative
+commemmorate->commemorate
+comparitive->comparative
+competative->competitive
+competive->competitive
+comprimise->compromise
+compropietari->comproprietari
+compropietaria->comproprietaria
+compropietarie->comproprietarie
+compropietario->comproprietario
+Conneticut->Connecticut
+conosciente->conoscente
+conoscienti->conoscenti
+conoscienza->conoscenza
+consectutive->consecutive
+consentrate->concentrate
+conservitive->conservative
+consolodate->consolidate
+contaiminate->contaminate
+contendor->contender
+coputer->computer
+copywrite->copyright
+corelate->correlate
+correzzione->correzione
+coscente->cosciente
+coscenti->coscienti
+coscenza->coscienza
+cosi->così
+cosidetto->cosiddetto
+cumulatative->cumulative
+curch->church
+curriculem->curriculum
+dasse->desse
+decomposit->decompose
+deficente->deficiente
+deficenti->deficienti
+deficenza->deficienza
+definate->definite
+derivitive->derivative
+deside->decide
+desktiop->desktop
+deteriate->deteriorate
+devide->divide
+diminuitive->diminutive
+dispence->dispense
+doesnt->doesn't
+dosen't->doesn't
+drnik->drink
+dupicate->duplicate
+E'->È
+É->È
+etc.->ecc.
+eccezzionale->eccezionale
+eccezzionali->eccezionali
+eccezzione->eccezione
+ect->etc
+eminate->emanate
+enduce->induce
+esle->else
+esterefatto->esterrefatto
+faciliate->facilitate
+facillitate->facilitate
+Farenheit->Fahrenheit
+fianite->finite
+foootball->football
+foucs->focus
+Gameboy->Game Boy
+ganerate->generate
+Ghandi->Gandhi
+gia->già
+gia'->già
+giacchè->giacché
+giaccue->giacque
+grafitti->graffiti
+Guilia->Giulia
+Guilio->Giulio
+Guiness->Guinness
+Guiseppe->Giuseppe
+halp->help
+hapening->happening
+hertzs->hertz
+imcomplete->incomplete
+imense->immense
+immitate->imitate
+inappropiate->inappropriate
+includ->include
+incoscente->incosciente
+incoscenti->incoscienti
+incoscenza->incoscienza
+inctroduce->introduce
+indulgue->indulge
+infilitrate->infiltrate
+infinit->infinite
+ingegniere->ingegnere
+innoquo->innocuo
+inpolite->impolite
+inquanto->in quanto
+insufficente->insufficiente
+insufficenti->insufficienti
+insufficenza->insufficienza
+interm->interim
+interrim->interim
+intutive->intuitive
+investingate->investigate
+iunior->junior
+knwo->know
+konw->know
+kwno->know
+levetate->levitate
+loev->love
+lveo->love
+lvoe->love
+Macchiavelli->Machiavelli
+maggiorparte->maggior parte
+magolia->magnolia
+managment->management
+marketting->marketing
+Massachussets->Massachusetts
+Massachussetts->Massachusetts
+medacine->medicine
+mercentile->mercantile
+messanger->messenger
+metereologia->meteorologia
+metereologico->meteorologico
+Michagan->Michigan
+minature->miniature
+misile->missile
+Misouri->Missouri
+Missisipi->Mississippi
+Missisippi->Mississippi
+missle->missile
+moderm->modem
+modle->model
+Monserrat->Montserrat
+mroe->more
+muscial->musical
+mussulmano->musulmano
+naturual->natural
+Nazereth->Nazareth
+necessiate->necessitate
+nkow->know
+nkwo->know
+noveau->nouveau
+ocuntry->country
+omlette->omelette
+omre->more
+onniscente->onnisciente
+onniscenti->onniscienti
+onoreficenze->onorificenze
+onyl->only
+ovverossia->ovverosia
+pallete->palette
+pantomine->pantomime
+pary->party
+penatly->penalty
+perchè->perché
+perche'->perché
+percui->per cui
+performence->performance
+pero'->però
+perogative->prerogative
+peronospera->peronospora
+piu->più
+piu'->più
+plateu->plateau
+pò->po'
+poiche'->poiché
+poichè->poiché
+preceed->precede
+pressocche'->pressoché
+pressocché->pressoché
+preverse->perverse
+primative->primitive
+privte->private
+proceedure->procedure
+processer->processor
+profesor->professor
+professer->professor
+proffesed->professed
+proffesor->professor
+profiquo->proficuo
+proove->prove
+propietà->proprietà
+propietari->proprietari
+propietaria->proprietaria
+propietarie->proprietarie
+propietario->proprietario
+propio->proprio
+propoganda->propaganda
+propogate->propagate
+prospicente->prospiciente
+prospicenti->prospicienti
+provacative->provocative
+psuedo->pseudo
+Pucini->Puccini
+pursuade->persuade
+pwoer->power
+recrod->record
+redarre->redigere
+refedendum->referendum
+rela->real
+riconosciente->riconoscente
+riconoscienti->riconoscenti
+riconoscienza->riconoscenza
+rocord->record
+rubgy->rugby
+sandwhich->sandwich
+satelite->satellite
+sattelite->satellite
+scandanavia->Scandinavia
+scenza->scienza
+scenze->scienze
+scirpt->script
+se'->sé
+sè->sé
+sensa->senza
+senstive->sensitive
+sensure->censure
+senzo->senso
+smoe->some
+soem->some
+sofware->software
+sohw->show
+sopratutto->soprattutto
+soudn->sound
+speci->specie
+spoace->space
+sponser->sponsor
+staion->station
+stasse->stesse
+stong->strong
+stpo->stop
+strazzio->strazio
+su'->sù
+succesiva->successiva
+succesive->successive
+succesivi->successivi
+succesivo->successivo
+sucessiva->successiva
+sucessive->successive
+sucessivi->successivi
+sucessivo->successivo
+sufficente->sufficiente
+sufficenti->sufficienti
+sufficenza->sufficienza
+sytem->system
+tast->taste
+té->tè
+tghe->the
+timne->time
+tje->the
+tjhe->the
+transare->transigere
+tremelo->tremolo
+troup->troupe
+tust->trust
+vadino->vadano
+valetta->valletta
+ventitrè->ventitré
+vicere->viceré
+zeebra->zebra
diff --git a/love2dToAPK/tools/tools/android-win/tools/support/typos-nb.txt b/love2dToAPK/tools/tools/android-win/tools/support/typos-nb.txt
new file mode 100644
index 0000000..1043627
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/support/typos-nb.txt
@@ -0,0 +1,449 @@
+# This file contains a number of common Norwegian typos:
+andriod->android
+
+# The remainder of this file contains misspellings from
+# http://no.wikipedia.org/wiki/Wikipedia:Liste_over_alminnelige_stavefeil/Maskinform
+# plus some post-processing to fix invalid entries, remove duplicates, etc.
+#
+# The content is available under the
+# "Creative Commons Attribution-ShareAlike License"
+# http://creativecommons.org/licenses/by-sa/3.0/
+#
+# THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
+# COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
+# COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
+# AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
+#
+# BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
+# TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY
+# BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS
+# CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
+# CONDITIONS.
+#
+# *1. Definitions*
+#
+# 1. *"Adaptation"* means a work based upon the Work, or upon the Work
+# and other pre-existing works, such as a translation, adaptation,
+# derivative work, arrangement of music or other alterations of a
+# literary or artistic work, or phonogram or performance and includes
+# cinematographic adaptations or any other form in which the Work may
+# be recast, transformed, or adapted including in any form
+# recognizably derived from the original, except that a work that
+# constitutes a Collection will not be considered an Adaptation for
+# the purpose of this License. For the avoidance of doubt, where the
+# Work is a musical work, performance or phonogram, the
+# synchronization of the Work in timed-relation with a moving image
+# ("synching") will be considered an Adaptation for the purpose of
+# this License.
+# 2. *"Collection"* means a collection of literary or artistic works,
+# such as encyclopedias and anthologies, or performances, phonograms
+# or broadcasts, or other works or subject matter other than works
+# listed in Section 1(f) below, which, by reason of the selection and
+# arrangement of their contents, constitute intellectual creations, in
+# which the Work is included in its entirety in unmodified form along
+# with one or more other contributions, each constituting separate and
+# independent works in themselves, which together are assembled into a
+# collective whole. A work that constitutes a Collection will not be
+# considered an Adaptation (as defined below) for the purposes of this
+# License.
+# 3. *"Creative Commons Compatible License"* means a license that is
+# listed at http://creativecommons.org/compatiblelicenses that has
+# been approved by Creative Commons as being essentially equivalent to
+# this License, including, at a minimum, because that license: (i)
+# contains terms that have the same purpose, meaning and effect as the
+# License Elements of this License; and, (ii) explicitly permits the
+# relicensing of adaptations of works made available under that
+# license under this License or a Creative Commons jurisdiction
+# license with the same License Elements as this License.
+# 4. *"Distribute"* means to make available to the public the original
+# and copies of the Work or Adaptation, as appropriate, through sale
+# or other transfer of ownership.
+# 5. *"License Elements"* means the following high-level license
+# attributes as selected by Licensor and indicated in the title of
+# this License: Attribution, ShareAlike.
+# 6. *"Licensor"* means the individual, individuals, entity or entities
+# that offer(s) the Work under the terms of this License.
+# 7. *"Original Author"* means, in the case of a literary or artistic
+# work, the individual, individuals, entity or entities who created
+# the Work or if no individual or entity can be identified, the
+# publisher; and in addition (i) in the case of a performance the
+# actors, singers, musicians, dancers, and other persons who act,
+# sing, deliver, declaim, play in, interpret or otherwise perform
+# literary or artistic works or expressions of folklore; (ii) in the
+# case of a phonogram the producer being the person or legal entity
+# who first fixes the sounds of a performance or other sounds; and,
+# (iii) in the case of broadcasts, the organization that transmits the
+# broadcast.
+# 8. *"Work"* means the literary and/or artistic work offered under the
+# terms of this License including without limitation any production in
+# the literary, scientific and artistic domain, whatever may be the
+# mode or form of its expression including digital form, such as a
+# book, pamphlet and other writing; a lecture, address, sermon or
+# other work of the same nature; a dramatic or dramatico-musical work;
+# a choreographic work or entertainment in dumb show; a musical
+# composition with or without words; a cinematographic work to which
+# are assimilated works expressed by a process analogous to
+# cinematography; a work of drawing, painting, architecture,
+# sculpture, engraving or lithography; a photographic work to which
+# are assimilated works expressed by a process analogous to
+# photography; a work of applied art; an illustration, map, plan,
+# sketch or three-dimensional work relative to geography, topography,
+# architecture or science; a performance; a broadcast; a phonogram; a
+# compilation of data to the extent it is protected as a copyrightable
+# work; or a work performed by a variety or circus performer to the
+# extent it is not otherwise considered a literary or artistic work.
+# 9. *"You"* means an individual or entity exercising rights under this
+# License who has not previously violated the terms of this License
+# with respect to the Work, or who has received express permission
+# from the Licensor to exercise rights under this License despite a
+# previous violation.
+# 10. *"Publicly Perform"* means to perform public recitations of the Work
+# and to communicate to the public those public recitations, by any
+# means or process, including by wire or wireless means or public
+# digital performances; to make available to the public Works in such
+# a way that members of the public may access these Works from a place
+# and at a place individually chosen by them; to perform the Work to
+# the public by any means or process and the communication to the
+# public of the performances of the Work, including by public digital
+# performance; to broadcast and rebroadcast the Work by any means
+# including signs, sounds or images.
+# 11. *"Reproduce"* means to make copies of the Work by any means
+# including without limitation by sound or visual recordings and the
+# right of fixation and reproducing fixations of the Work, including
+# storage of a protected performance or phonogram in digital form or
+# other electronic medium.
+#
+# *2. Fair Dealing Rights.* Nothing in this License is intended to reduce,
+# limit, or restrict any uses free from copyright or rights arising from
+# limitations or exceptions that are provided for in connection with the
+# copyright protection under copyright law or other applicable laws.
+#
+# *3. License Grant.* Subject to the terms and conditions of this License,
+# Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
+# perpetual (for the duration of the applicable copyright) license to
+# exercise the rights in the Work as stated below:
+#
+# 1. to Reproduce the Work, to incorporate the Work into one or more
+# Collections, and to Reproduce the Work as incorporated in the
+# Collections;
+# 2. to create and Reproduce Adaptations provided that any such
+# Adaptation, including any translation in any medium, takes
+# reasonable steps to clearly label, demarcate or otherwise identify
+# that changes were made to the original Work. For example, a
+# translation could be marked "The original work was translated from
+# English to Spanish," or a modification could indicate "The original
+# work has been modified.";
+# 3. to Distribute and Publicly Perform the Work including as
+# incorporated in Collections; and,
+# 4. to Distribute and Publicly Perform Adaptations.
+# 5.
+#
+# For the avoidance of doubt:
+#
+# 1. *Non-waivable Compulsory License Schemes*. In those
+# jurisdictions in which the right to collect royalties through
+# any statutory or compulsory licensing scheme cannot be waived,
+# the Licensor reserves the exclusive right to collect such
+# royalties for any exercise by You of the rights granted under
+# this License;
+# 2. *Waivable Compulsory License Schemes*. In those jurisdictions in
+# which the right to collect royalties through any statutory or
+# compulsory licensing scheme can be waived, the Licensor waives
+# the exclusive right to collect such royalties for any exercise
+# by You of the rights granted under this License; and,
+# 3. *Voluntary License Schemes*. The Licensor waives the right to
+# collect royalties, whether individually or, in the event that
+# the Licensor is a member of a collecting society that
+# administers voluntary licensing schemes, via that society, from
+# any exercise by You of the rights granted under this License.
+#
+# The above rights may be exercised in all media and formats whether now
+# known or hereafter devised. The above rights include the right to make
+# such modifications as are technically necessary to exercise the rights
+# in other media and formats. Subject to Section 8(f), all rights not
+# expressly granted by Licensor are hereby reserved.
+#
+# *4. Restrictions.* The license granted in Section 3 above is expressly
+# made subject to and limited by the following restrictions:
+#
+# 1. You may Distribute or Publicly Perform the Work only under the terms
+# of this License. You must include a copy of, or the Uniform Resource
+# Identifier (URI) for, this License with every copy of the Work You
+# Distribute or Publicly Perform. You may not offer or impose any
+# terms on the Work that restrict the terms of this License or the
+# ability of the recipient of the Work to exercise the rights granted
+# to that recipient under the terms of the License. You may not
+# sublicense the Work. You must keep intact all notices that refer to
+# this License and to the disclaimer of warranties with every copy of
+# the Work You Distribute or Publicly Perform. When You Distribute or
+# Publicly Perform the Work, You may not impose any effective
+# technological measures on the Work that restrict the ability of a
+# recipient of the Work from You to exercise the rights granted to
+# that recipient under the terms of the License. This Section 4(a)
+# applies to the Work as incorporated in a Collection, but this does
+# not require the Collection apart from the Work itself to be made
+# subject to the terms of this License. If You create a Collection,
+# upon notice from any Licensor You must, to the extent practicable,
+# remove from the Collection any credit as required by Section 4(c),
+# as requested. If You create an Adaptation, upon notice from any
+# Licensor You must, to the extent practicable, remove from the
+# Adaptation any credit as required by Section 4(c), as requested.
+# 2. You may Distribute or Publicly Perform an Adaptation only under the
+# terms of: (i) this License; (ii) a later version of this License
+# with the same License Elements as this License; (iii) a Creative
+# Commons jurisdiction license (either this or a later license
+# version) that contains the same License Elements as this License
+# (e.g., Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons
+# Compatible License. If you license the Adaptation under one of the
+# licenses mentioned in (iv), you must comply with the terms of that
+# license. If you license the Adaptation under the terms of any of the
+# licenses mentioned in (i), (ii) or (iii) (the "Applicable License"),
+# you must comply with the terms of the Applicable License generally
+# and the following provisions: (I) You must include a copy of, or the
+# URI for, the Applicable License with every copy of each Adaptation
+# You Distribute or Publicly Perform; (II) You may not offer or impose
+# any terms on the Adaptation that restrict the terms of the
+# Applicable License or the ability of the recipient of the Adaptation
+# to exercise the rights granted to that recipient under the terms of
+# the Applicable License; (III) You must keep intact all notices that
+# refer to the Applicable License and to the disclaimer of warranties
+# with every copy of the Work as included in the Adaptation You
+# Distribute or Publicly Perform; (IV) when You Distribute or Publicly
+# Perform the Adaptation, You may not impose any effective
+# technological measures on the Adaptation that restrict the ability
+# of a recipient of the Adaptation from You to exercise the rights
+# granted to that recipient under the terms of the Applicable License.
+# This Section 4(b) applies to the Adaptation as incorporated in a
+# Collection, but this does not require the Collection apart from the
+# Adaptation itself to be made subject to the terms of the Applicable
+# License.
+# 3. If You Distribute, or Publicly Perform the Work or any Adaptations
+# or Collections, You must, unless a request has been made pursuant to
+# Section 4(a), keep intact all copyright notices for the Work and
+# provide, reasonable to the medium or means You are utilizing: (i)
+# the name of the Original Author (or pseudonym, if applicable) if
+# supplied, and/or if the Original Author and/or Licensor designate
+# another party or parties (e.g., a sponsor institute, publishing
+# entity, journal) for attribution ("Attribution Parties") in
+# Licensor's copyright notice, terms of service or by other reasonable
+# means, the name of such party or parties; (ii) the title of the Work
+# if supplied; (iii) to the extent reasonably practicable, the URI, if
+# any, that Licensor specifies to be associated with the Work, unless
+# such URI does not refer to the copyright notice or licensing
+# information for the Work; and (iv) , consistent with Ssection 3(b),
+# in the case of an Adaptation, a credit identifying the use of the
+# Work in the Adaptation (e.g., "French translation of the Work by
+# Original Author," or "Screenplay based on original Work by Original
+# Author"). The credit required by this Section 4(c) may be
+# implemented in any reasonable manner; provided, however, that in the
+# case of a Adaptation or Collection, at a minimum such credit will
+# appear, if a credit for all contributing authors of the Adaptation
+# or Collection appears, then as part of these credits and in a manner
+# at least as prominent as the credits for the other contributing
+# authors. For the avoidance of doubt, You may only use the credit
+# required by this Section for the purpose of attribution in the
+# manner set out above and, by exercising Your rights under this
+# License, You may not implicitly or explicitly assert or imply any
+# connection with, sponsorship or endorsement by the Original Author,
+# Licensor and/or Attribution Parties, as appropriate, of You or Your
+# use of the Work, without the separate, express prior written
+# permission of the Original Author, Licensor and/or Attribution Parties.
+# 4. Except as otherwise agreed in writing by the Licensor or as may be
+# otherwise permitted by applicable law, if You Reproduce, Distribute
+# or Publicly Perform the Work either by itself or as part of any
+# Adaptations or Collections, You must not distort, mutilate, modify
+# or take other derogatory action in relation to the Work which would
+# be prejudicial to the Original Author's honor or reputation.
+# Licensor agrees that in those jurisdictions (e.g. Japan), in which
+# any exercise of the right granted in Section 3(b) of this License
+# (the right to make Adaptations) would be deemed to be a distortion,
+# mutilation, modification or other derogatory action prejudicial to
+# the Original Author's honor and reputation, the Licensor will waive
+# or not assert, as appropriate, this Section, to the fullest extent
+# permitted by the applicable national law, to enable You to
+# reasonably exercise Your right under Section 3(b) of this License
+# (right to make Adaptations) but not otherwise.
+#
+# *5. Representations, Warranties and Disclaimer*
+#
+# UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
+# OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
+# KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
+# INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
+# LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
+# WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE
+# EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
+#
+# *6. Limitation on Liability.* EXCEPT TO THE EXTENT REQUIRED BY
+# APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL
+# THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY
+# DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF
+# LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+#
+# *7. Termination*
+#
+# 1. This License and the rights granted hereunder will terminate
+# automatically upon any breach by You of the terms of this License.
+# Individuals or entities who have received Adaptations or Collections
+# from You under this License, however, will not have their licenses
+# terminated provided such individuals or entities remain in full
+# compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will
+# survive any termination of this License.
+# 2. Subject to the above terms and conditions, the license granted here
+# is perpetual (for the duration of the applicable copyright in the
+# Work). Notwithstanding the above, Licensor reserves the right to
+# release the Work under different license terms or to stop
+# distributing the Work at any time; provided, however that any such
+# election will not serve to withdraw this License (or any other
+# license that has been, or is required to be, granted under the terms
+# of this License), and this License will continue in full force and
+# effect unless terminated as stated above.
+#
+# *8. Miscellaneous*
+#
+# 1. Each time You Distribute or Publicly Perform the Work or a
+# Collection, the Licensor offers to the recipient a license to the
+# Work on the same terms and conditions as the license granted to You
+# under this License.
+# 2. Each time You Distribute or Publicly Perform an Adaptation, Licensor
+# offers to the recipient a license to the original Work on the same
+# terms and conditions as the license granted to You under this License.
+# 3. If any provision of this License is invalid or unenforceable under
+# applicable law, it shall not affect the validity or enforceability
+# of the remainder of the terms of this License, and without further
+# action by the parties to this agreement, such provision shall be
+# reformed to the minimum extent necessary to make such provision
+# valid and enforceable.
+# 4. No term or provision of this License shall be deemed waived and no
+# breach consented to unless such waiver or consent shall be in
+# writing and signed by the party to be charged with such waiver or
+# consent.
+# 5. This License constitutes the entire agreement between the parties
+# with respect to the Work licensed here. There are no understandings,
+# agreements or representations with respect to the Work not specified
+# here. Licensor shall not be bound by any additional provisions that
+# may appear in any communication from You. This License may not be
+# modified without the mutual written agreement of the Licensor and You.
+# 6. The rights granted under, and the subject matter referenced, in this
+# License were drafted utilizing the terminology of the Berne
+# Convention for the Protection of Literary and Artistic Works (as
+# amended on September 28, 1979), the Rome Convention of 1961, the
+# WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms
+# Treaty of 1996 and the Universal Copyright Convention (as revised on
+# July 24, 1971). These rights and subject matter take effect in the
+# relevant jurisdiction in which the License terms are sought to be
+# enforced according to the corresponding provisions of the
+# implementation of those treaty provisions in the applicable national
+# law. If the standard suite of rights granted under applicable
+# copyright law includes additional rights not granted under this
+# License, such additional rights are deemed to be included in the
+# License; this License is not intended to restrict the license of any
+# rights under applicable law.
+
+abbonement->abonnement
+addresse->adresse
+agresiv->aggressiv
+aggresiv->aggressiv
+agressiv->aggressiv
+aldrig->aldri
+alldri->aldri
+allè->allé
+allminnelig->alminnelig
+alminnlig->alminnelig
+altid->alltid
+annerkjenne->anerkjenne
+apelere->appellere
+apellere->appellere
+appelere->appellere
+apetitt->appetitt
+appetit->appetitt
+artikel->artikkel
+artikkler->artikler
+avlegs->avleggs
+biblotek->bibliotek
+bilett->billett
+blandt->blant
+brylupp->bryllup
+colloseum->colosseum
+desverre->dessverre
+editere->redigere
+ein->en
+eit->et
+fasinerende->fascinerende
+foresten->forresten
+genetiv->genitiv
+gjordt->gjort
+grafitti->graffiti
+hovedsaklig->hovedsakelig
+ikkje->ikke
+iakta->iaktta
+insjiativ->initiativ
+inttiativ->initiativ
+intiativ->initiativ
+inteligent->intelligent
+intligent->intelligent
+innteligent->intelligent
+internett->Internett
+Internet->Internett
+interresant->interessant
+interressant->interessant
+interrese->interesse
+interresse->interesse
+km2->km²
+kakkerlakk->kakerlakk
+kammerat->kamerat
+kammere->kamre
+kanate->kantate
+kansje->kanskje
+karriære->karrière
+kariere->karrière
+kasett->kassett
+komune->kommune
+konstantere->konstatere
+kontigent->kontingent
+konkuranse->konkurranse
+konkurere->konkurrere
+m.o.h.->moh
+Majorstua->Majorstuen
+media->medier
+medlemsskap->medlemskap
+mennsker->mennesker
+metrolog->meteorolog
+metrologi->meteorologi
+Midt-Østen->Midtøsten
+Midt-østen->Midtøsten
+millenium->millennium
+missvisende->misvisende
+morro->moro
+musikker->musiker
+nysjerrig->nysgjerrig
+nyskjerrig->nysgjerrig
+oksyd->oksid
+oksydere->oksidere
+orginal->original
+paralell->parallell
+parallel->parallell
+parantes->parentes
+prevansjon->prevensjon
+risici->risikoer
+risiki->risikoer
+satelitt->satellitt
+simpelten->simpelthen
+sinnsyk->sinnssyk
+skjelden->sjelden
+skriftelig->skriftlig
+slalom->slalåm
+terasse->terrasse
+triologi->trilogi
+tydlig->tydelig
+tunell->tunnel
+tunnell->tunnel
+untatt->unntatt
+usakelig->usaklig
+utdybende->utdypende
+underholdene->underholdende
+vakum->vakuum
+viderekommende->viderekomne
+værre->verre
+værste->verste
diff --git a/love2dToAPK/tools/tools/android-win/tools/support/typos-pt.txt b/love2dToAPK/tools/tools/android-win/tools/support/typos-pt.txt
new file mode 100644
index 0000000..6285d37
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/support/typos-pt.txt
@@ -0,0 +1,1647 @@
+# This file contains a number of common Portuguese typos:
+andriod->android
+
+# The remainder of this file contains misspellings from
+# http://pt.wikipedia.org/wiki/Wikip%C3%A9dia:Software/Anti-vandal_tool/Ortografia
+# plus some post-processing to fix invalid entries, remove duplicates, etc.
+#
+# The content is available under the
+# "Creative Commons Attribution-ShareAlike License"
+# http://creativecommons.org/licenses/by-sa/3.0/
+#
+# THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
+# COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
+# COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
+# AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
+#
+# BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
+# TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY
+# BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS
+# CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
+# CONDITIONS.
+#
+# *1. Definitions*
+#
+# 1. *"Adaptation"* means a work based upon the Work, or upon the Work
+# and other pre-existing works, such as a translation, adaptation,
+# derivative work, arrangement of music or other alterations of a
+# literary or artistic work, or phonogram or performance and includes
+# cinematographic adaptations or any other form in which the Work may
+# be recast, transformed, or adapted including in any form
+# recognizably derived from the original, except that a work that
+# constitutes a Collection will not be considered an Adaptation for
+# the purpose of this License. For the avoidance of doubt, where the
+# Work is a musical work, performance or phonogram, the
+# synchronization of the Work in timed-relation with a moving image
+# ("synching") will be considered an Adaptation for the purpose of
+# this License.
+# 2. *"Collection"* means a collection of literary or artistic works,
+# such as encyclopedias and anthologies, or performances, phonograms
+# or broadcasts, or other works or subject matter other than works
+# listed in Section 1(f) below, which, by reason of the selection and
+# arrangement of their contents, constitute intellectual creations, in
+# which the Work is included in its entirety in unmodified form along
+# with one or more other contributions, each constituting separate and
+# independent works in themselves, which together are assembled into a
+# collective whole. A work that constitutes a Collection will not be
+# considered an Adaptation (as defined below) for the purposes of this
+# License.
+# 3. *"Creative Commons Compatible License"* means a license that is
+# listed at http://creativecommons.org/compatiblelicenses that has
+# been approved by Creative Commons as being essentially equivalent to
+# this License, including, at a minimum, because that license: (i)
+# contains terms that have the same purpose, meaning and effect as the
+# License Elements of this License; and, (ii) explicitly permits the
+# relicensing of adaptations of works made available under that
+# license under this License or a Creative Commons jurisdiction
+# license with the same License Elements as this License.
+# 4. *"Distribute"* means to make available to the public the original
+# and copies of the Work or Adaptation, as appropriate, through sale
+# or other transfer of ownership.
+# 5. *"License Elements"* means the following high-level license
+# attributes as selected by Licensor and indicated in the title of
+# this License: Attribution, ShareAlike.
+# 6. *"Licensor"* means the individual, individuals, entity or entities
+# that offer(s) the Work under the terms of this License.
+# 7. *"Original Author"* means, in the case of a literary or artistic
+# work, the individual, individuals, entity or entities who created
+# the Work or if no individual or entity can be identified, the
+# publisher; and in addition (i) in the case of a performance the
+# actors, singers, musicians, dancers, and other persons who act,
+# sing, deliver, declaim, play in, interpret or otherwise perform
+# literary or artistic works or expressions of folklore; (ii) in the
+# case of a phonogram the producer being the person or legal entity
+# who first fixes the sounds of a performance or other sounds; and,
+# (iii) in the case of broadcasts, the organization that transmits the
+# broadcast.
+# 8. *"Work"* means the literary and/or artistic work offered under the
+# terms of this License including without limitation any production in
+# the literary, scientific and artistic domain, whatever may be the
+# mode or form of its expression including digital form, such as a
+# book, pamphlet and other writing; a lecture, address, sermon or
+# other work of the same nature; a dramatic or dramatico-musical work;
+# a choreographic work or entertainment in dumb show; a musical
+# composition with or without words; a cinematographic work to which
+# are assimilated works expressed by a process analogous to
+# cinematography; a work of drawing, painting, architecture,
+# sculpture, engraving or lithography; a photographic work to which
+# are assimilated works expressed by a process analogous to
+# photography; a work of applied art; an illustration, map, plan,
+# sketch or three-dimensional work relative to geography, topography,
+# architecture or science; a performance; a broadcast; a phonogram; a
+# compilation of data to the extent it is protected as a copyrightable
+# work; or a work performed by a variety or circus performer to the
+# extent it is not otherwise considered a literary or artistic work.
+# 9. *"You"* means an individual or entity exercising rights under this
+# License who has not previously violated the terms of this License
+# with respect to the Work, or who has received express permission
+# from the Licensor to exercise rights under this License despite a
+# previous violation.
+# 10. *"Publicly Perform"* means to perform public recitations of the Work
+# and to communicate to the public those public recitations, by any
+# means or process, including by wire or wireless means or public
+# digital performances; to make available to the public Works in such
+# a way that members of the public may access these Works from a place
+# and at a place individually chosen by them; to perform the Work to
+# the public by any means or process and the communication to the
+# public of the performances of the Work, including by public digital
+# performance; to broadcast and rebroadcast the Work by any means
+# including signs, sounds or images.
+# 11. *"Reproduce"* means to make copies of the Work by any means
+# including without limitation by sound or visual recordings and the
+# right of fixation and reproducing fixations of the Work, including
+# storage of a protected performance or phonogram in digital form or
+# other electronic medium.
+#
+# *2. Fair Dealing Rights.* Nothing in this License is intended to reduce,
+# limit, or restrict any uses free from copyright or rights arising from
+# limitations or exceptions that are provided for in connection with the
+# copyright protection under copyright law or other applicable laws.
+#
+# *3. License Grant.* Subject to the terms and conditions of this License,
+# Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
+# perpetual (for the duration of the applicable copyright) license to
+# exercise the rights in the Work as stated below:
+#
+# 1. to Reproduce the Work, to incorporate the Work into one or more
+# Collections, and to Reproduce the Work as incorporated in the
+# Collections;
+# 2. to create and Reproduce Adaptations provided that any such
+# Adaptation, including any translation in any medium, takes
+# reasonable steps to clearly label, demarcate or otherwise identify
+# that changes were made to the original Work. For example, a
+# translation could be marked "The original work was translated from
+# English to Spanish," or a modification could indicate "The original
+# work has been modified.";
+# 3. to Distribute and Publicly Perform the Work including as
+# incorporated in Collections; and,
+# 4. to Distribute and Publicly Perform Adaptations.
+# 5.
+#
+# For the avoidance of doubt:
+#
+# 1. *Non-waivable Compulsory License Schemes*. In those
+# jurisdictions in which the right to collect royalties through
+# any statutory or compulsory licensing scheme cannot be waived,
+# the Licensor reserves the exclusive right to collect such
+# royalties for any exercise by You of the rights granted under
+# this License;
+# 2. *Waivable Compulsory License Schemes*. In those jurisdictions in
+# which the right to collect royalties through any statutory or
+# compulsory licensing scheme can be waived, the Licensor waives
+# the exclusive right to collect such royalties for any exercise
+# by You of the rights granted under this License; and,
+# 3. *Voluntary License Schemes*. The Licensor waives the right to
+# collect royalties, whether individually or, in the event that
+# the Licensor is a member of a collecting society that
+# administers voluntary licensing schemes, via that society, from
+# any exercise by You of the rights granted under this License.
+#
+# The above rights may be exercised in all media and formats whether now
+# known or hereafter devised. The above rights include the right to make
+# such modifications as are technically necessary to exercise the rights
+# in other media and formats. Subject to Section 8(f), all rights not
+# expressly granted by Licensor are hereby reserved.
+#
+# *4. Restrictions.* The license granted in Section 3 above is expressly
+# made subject to and limited by the following restrictions:
+#
+# 1. You may Distribute or Publicly Perform the Work only under the terms
+# of this License. You must include a copy of, or the Uniform Resource
+# Identifier (URI) for, this License with every copy of the Work You
+# Distribute or Publicly Perform. You may not offer or impose any
+# terms on the Work that restrict the terms of this License or the
+# ability of the recipient of the Work to exercise the rights granted
+# to that recipient under the terms of the License. You may not
+# sublicense the Work. You must keep intact all notices that refer to
+# this License and to the disclaimer of warranties with every copy of
+# the Work You Distribute or Publicly Perform. When You Distribute or
+# Publicly Perform the Work, You may not impose any effective
+# technological measures on the Work that restrict the ability of a
+# recipient of the Work from You to exercise the rights granted to
+# that recipient under the terms of the License. This Section 4(a)
+# applies to the Work as incorporated in a Collection, but this does
+# not require the Collection apart from the Work itself to be made
+# subject to the terms of this License. If You create a Collection,
+# upon notice from any Licensor You must, to the extent practicable,
+# remove from the Collection any credit as required by Section 4(c),
+# as requested. If You create an Adaptation, upon notice from any
+# Licensor You must, to the extent practicable, remove from the
+# Adaptation any credit as required by Section 4(c), as requested.
+# 2. You may Distribute or Publicly Perform an Adaptation only under the
+# terms of: (i) this License; (ii) a later version of this License
+# with the same License Elements as this License; (iii) a Creative
+# Commons jurisdiction license (either this or a later license
+# version) that contains the same License Elements as this License
+# (e.g., Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons
+# Compatible License. If you license the Adaptation under one of the
+# licenses mentioned in (iv), you must comply with the terms of that
+# license. If you license the Adaptation under the terms of any of the
+# licenses mentioned in (i), (ii) or (iii) (the "Applicable License"),
+# you must comply with the terms of the Applicable License generally
+# and the following provisions: (I) You must include a copy of, or the
+# URI for, the Applicable License with every copy of each Adaptation
+# You Distribute or Publicly Perform; (II) You may not offer or impose
+# any terms on the Adaptation that restrict the terms of the
+# Applicable License or the ability of the recipient of the Adaptation
+# to exercise the rights granted to that recipient under the terms of
+# the Applicable License; (III) You must keep intact all notices that
+# refer to the Applicable License and to the disclaimer of warranties
+# with every copy of the Work as included in the Adaptation You
+# Distribute or Publicly Perform; (IV) when You Distribute or Publicly
+# Perform the Adaptation, You may not impose any effective
+# technological measures on the Adaptation that restrict the ability
+# of a recipient of the Adaptation from You to exercise the rights
+# granted to that recipient under the terms of the Applicable License.
+# This Section 4(b) applies to the Adaptation as incorporated in a
+# Collection, but this does not require the Collection apart from the
+# Adaptation itself to be made subject to the terms of the Applicable
+# License.
+# 3. If You Distribute, or Publicly Perform the Work or any Adaptations
+# or Collections, You must, unless a request has been made pursuant to
+# Section 4(a), keep intact all copyright notices for the Work and
+# provide, reasonable to the medium or means You are utilizing: (i)
+# the name of the Original Author (or pseudonym, if applicable) if
+# supplied, and/or if the Original Author and/or Licensor designate
+# another party or parties (e.g., a sponsor institute, publishing
+# entity, journal) for attribution ("Attribution Parties") in
+# Licensor's copyright notice, terms of service or by other reasonable
+# means, the name of such party or parties; (ii) the title of the Work
+# if supplied; (iii) to the extent reasonably practicable, the URI, if
+# any, that Licensor specifies to be associated with the Work, unless
+# such URI does not refer to the copyright notice or licensing
+# information for the Work; and (iv) , consistent with Ssection 3(b),
+# in the case of an Adaptation, a credit identifying the use of the
+# Work in the Adaptation (e.g., "French translation of the Work by
+# Original Author," or "Screenplay based on original Work by Original
+# Author"). The credit required by this Section 4(c) may be
+# implemented in any reasonable manner; provided, however, that in the
+# case of a Adaptation or Collection, at a minimum such credit will
+# appear, if a credit for all contributing authors of the Adaptation
+# or Collection appears, then as part of these credits and in a manner
+# at least as prominent as the credits for the other contributing
+# authors. For the avoidance of doubt, You may only use the credit
+# required by this Section for the purpose of attribution in the
+# manner set out above and, by exercising Your rights under this
+# License, You may not implicitly or explicitly assert or imply any
+# connection with, sponsorship or endorsement by the Original Author,
+# Licensor and/or Attribution Parties, as appropriate, of You or Your
+# use of the Work, without the separate, express prior written
+# permission of the Original Author, Licensor and/or Attribution Parties.
+# 4. Except as otherwise agreed in writing by the Licensor or as may be
+# otherwise permitted by applicable law, if You Reproduce, Distribute
+# or Publicly Perform the Work either by itself or as part of any
+# Adaptations or Collections, You must not distort, mutilate, modify
+# or take other derogatory action in relation to the Work which would
+# be prejudicial to the Original Author's honor or reputation.
+# Licensor agrees that in those jurisdictions (e.g. Japan), in which
+# any exercise of the right granted in Section 3(b) of this License
+# (the right to make Adaptations) would be deemed to be a distortion,
+# mutilation, modification or other derogatory action prejudicial to
+# the Original Author's honor and reputation, the Licensor will waive
+# or not assert, as appropriate, this Section, to the fullest extent
+# permitted by the applicable national law, to enable You to
+# reasonably exercise Your right under Section 3(b) of this License
+# (right to make Adaptations) but not otherwise.
+#
+# *5. Representations, Warranties and Disclaimer*
+#
+# UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
+# OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
+# KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
+# INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
+# LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
+# WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE
+# EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
+#
+# *6. Limitation on Liability.* EXCEPT TO THE EXTENT REQUIRED BY
+# APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL
+# THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY
+# DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF
+# LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+#
+# *7. Termination*
+#
+# 1. This License and the rights granted hereunder will terminate
+# automatically upon any breach by You of the terms of this License.
+# Individuals or entities who have received Adaptations or Collections
+# from You under this License, however, will not have their licenses
+# terminated provided such individuals or entities remain in full
+# compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will
+# survive any termination of this License.
+# 2. Subject to the above terms and conditions, the license granted here
+# is perpetual (for the duration of the applicable copyright in the
+# Work). Notwithstanding the above, Licensor reserves the right to
+# release the Work under different license terms or to stop
+# distributing the Work at any time; provided, however that any such
+# election will not serve to withdraw this License (or any other
+# license that has been, or is required to be, granted under the terms
+# of this License), and this License will continue in full force and
+# effect unless terminated as stated above.
+#
+# *8. Miscellaneous*
+#
+# 1. Each time You Distribute or Publicly Perform the Work or a
+# Collection, the Licensor offers to the recipient a license to the
+# Work on the same terms and conditions as the license granted to You
+# under this License.
+# 2. Each time You Distribute or Publicly Perform an Adaptation, Licensor
+# offers to the recipient a license to the original Work on the same
+# terms and conditions as the license granted to You under this License.
+# 3. If any provision of this License is invalid or unenforceable under
+# applicable law, it shall not affect the validity or enforceability
+# of the remainder of the terms of this License, and without further
+# action by the parties to this agreement, such provision shall be
+# reformed to the minimum extent necessary to make such provision
+# valid and enforceable.
+# 4. No term or provision of this License shall be deemed waived and no
+# breach consented to unless such waiver or consent shall be in
+# writing and signed by the party to be charged with such waiver or
+# consent.
+# 5. This License constitutes the entire agreement between the parties
+# with respect to the Work licensed here. There are no understandings,
+# agreements or representations with respect to the Work not specified
+# here. Licensor shall not be bound by any additional provisions that
+# may appear in any communication from You. This License may not be
+# modified without the mutual written agreement of the Licensor and You.
+# 6. The rights granted under, and the subject matter referenced, in this
+# License were drafted utilizing the terminology of the Berne
+# Convention for the Protection of Literary and Artistic Works (as
+# amended on September 28, 1979), the Rome Convention of 1961, the
+# WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms
+# Treaty of 1996 and the Universal Copyright Convention (as revised on
+# July 24, 1971). These rights and subject matter take effect in the
+# relevant jurisdiction in which the License terms are sought to be
+# enforced according to the corresponding provisions of the
+# implementation of those treaty provisions in the applicable national
+# law. If the standard suite of rights granted under applicable
+# copyright law includes additional rights not granted under this
+# License, such additional rights are deemed to be included in the
+# License; this License is not intended to restrict the license of any
+# rights under applicable law.
+a a->a
+à cavalo->a cavalo
+a muito tempo->há muito tempo
+à muito tempo->há muito tempo
+a nível de->em nível de, ao nível de
+à pé->a pé
+aandeija->bandeja
+abitual->habitual
+acêrca->acerca
+àcerca->acerca
+acessiveis->acessíveis
+acessivel->acessível
+acessor->assessor
+acessora->assessora
+acessoras->assessoras
+acessores->assessores
+acessoria->assessoria
+acessorio->acessório
+acessorios->acessórios
+acesssada->acessada
+acesssadas->acessadas
+acesssado->acessado
+acesssados->acessados
+açoes->acções
+aconselhaveis->aconselháveis
+aconselhavel->aconselhável
+açoreana->açoriana
+açoreanas->açorianas
+açoreano->açoriano
+açoreanos->açorianos
+actris->atriz
+açucar ->açúcar
+acustica->acústica
+acusticas->acústicas
+acustico->acústico
+acusticos->acústicos
+adimite->admite
+adimitir->admitir
+adimitiram->admitiram
+adimitiu->admitiu
+admnistração->administração
+admnistrar->administrar
+adolescencia->adolescência
+afim->a fim
+Africa->África
+agencia->agência
+agradaveis->agradáveis
+agradavel->agradável
+agricola->agrícola
+agricolas->agrícolas
+agua->água
+aguas->águas
+aki->aqui
+album->álbum
+albúm->álbum
+albùm->álbum
+albums->álbuns
+albun->álbum
+albuns->álbuns
+albúns->álbuns
+albùns->álbuns
+alcolémia->alcoolemia
+alcolico->alcoólico
+alcólico->alcoólico
+alcolicos->alcoólicos
+alcólicos->alcoólicos
+alcoolémia->alcoolemia
+alcóolica->alcoólica
+alcoolico->alcoólico
+alcóolico->alcoólico
+alcoolicos->alcoólicos
+aleatorios->aleatórios
+algeriano->argelino
+algorítmo->algoritmo
+algorítmos->algoritmos
+alguem->alguém
+altoridade->autoridade
+altoridades->autoridades
+amanha->amanhã
+amargúra->amargura
+amargúria->amargura
+ambulancia->ambulância
+ambulancias->ambulâncias
+anciosa->ansiosa
+ancioso->ansioso
+anciosas->ansiosas
+anciosos->ansiosos
+anciosamente->ansiosamente
+anemona->anémona,anêmona
+anglofona->anglófona
+anglófonas->anglófonas
+anglofono->anglófono
+anglofonos->anglófonos
+angulo->ângulo
+angulos->ângulos
+anonimo->anónimo, anônimo
+antepôr->antepor
+anti aéreo->antiaéreo
+anti depressivo->antidepressivo
+anti-vírus->antivírus
+anuncio->anúncio
+ao meu ver->a meu ver
+aparencia->aparência, aparecia
+aparencias->aparências
+aplicaçao->aplicação
+Aracajú->Aracaju
+arco-iris->arco-íris
+arcoiris->arco-íris
+arcoíris->arco-íris
+areas->áreas
+argerino->argelino
+aristocratica->aristocrática
+aristocraticas->aristocráticas
+aristocratico->aristocrático
+aristocraticos->aristocráticos
+armonia->harmonia
+arquipelago->arquipélago
+arquipelagos->arquipélagos
+arquipelogo->arquipélago
+artistica->artística
+artisticas->artísticas
+artistico->artístico
+artisticos->artísticos
+ascençao->ascensão
+ascenção->ascensão
+ascensao->ascensão
+Asia->Ásia
+asiatica->asiática
+asim->assim
+assasinato->assassinato
+assistencia->assistência
+associção->associação
+aste->haste
+ateismo->ateísmo
+aterisagem->aterrissagem
+aterissagem->aterrissagem
+aterrisagem->aterrissagem
+aterrizagem->aterrissagem
+atras->atrás
+atraves->através
+atravez->através
+atravéz->através
+atraz->atrás
+atráz->atrás
+atribuida->atribuída
+atribuidas->atribuídas
+atribuido->atribuído
+atribuidos->atribuídos
+atris->atriz, actriz, atris
+audiencia->audiência
+audiencias->audiências
+ausencia->ausência
+ausencias->ausências
+autentica->autêntica
+autenticas->autênticas
+autentico->autêntico
+autenticos->autênticos
+automoveis->automóveis
+automovel->automóvel
+autonoma->autónoma, autônoma
+autonomas->autónomas, autônomas
+autonomo->autónomo, autônomo
+autonomos->autónomos, autônomos
+autopsia->autópsia
+aver->haver
+aviacao->aviação
+aviacão->aviação
+aviasão->aviação
+avogrado->Avogadro
+avulsso->avulso
+azaléia->azaléa
+azas->asas
+bahiana->baiana
+bahiano->baiano
+baínha->bainha
+baínhas->bainhas
+banca-rota->bancarrota
+banca-rrota->bancarrota
+bancarota->bancarrota
+barbarie->barbárie
+barbaries->barbáries
+bébe->bebé
+bébé->bebé
+bébes->bebés
+bébés->bebés
+beige->bege
+beiges->beges
+beije->bege
+beijes->beges
+bem vindo->bem-vindo
+benção->bênção
+bençãos->bênçãos
+beneficencia->beneficência
+beneficio->benefício
+beneficios->benefícios
+benvindo->bem-vindo
+Bertold Brecht->Bertolt Brecht
+bevocar->invocar
+bi-campeão->bicampeão
+bibliografica->bibliográfica
+bibliograficas->bibliográficas
+bibliografico->bibliográfico
+bibliograficos->bibliográficos
+biografico->biográfico
+biograficos->biográficos
+biograifa->biografia
+biograifas->biografias
+biópsia->biopsia
+biópsias->biopsias
+boas vindas->Boas-vindas
+boeiro->bueiro
+borburinho->burburinho
+brasao->brasão
+brazão->brasão
+Brazil->Brasil
+britanico->britânico
+burborinho->burburinho
+bussula->bússola
+cadaço->cadarço
+caiem->caem
+calsado->calçado
+calvice->calvície
+calvíce->calvície
+camara->câmara
+camera->câmera
+caminhoes->caminhões, camiões
+camioes->camiões, caminhões
+campeao->campeão
+campeoes->campeões
+campiao->campeão
+campião->campeão
+campioes->campeões
+campiões->campeões
+campionato->campeonato
+campionatos->campeonatos
+cançao->canção
+cansão->canção
+capitão mor->capitão-mor
+capitulo->capítulo
+capitulos->capítulos
+caracteristica->característica
+caracteristicas->características
+caracteristico->característico
+caracteristicos->característicos
+carissimo->caríssimo
+cassar->caçar, casar, cassar
+catalizador->catalisador
+catalogo->catálogo
+catalogos->catálogos
+catequisador->catequizador
+catequisar->catequizar
+cazamento->casamento
+cazar->casar
+cazara->casara
+cazaram->casaram
+cazou->casou
+Ceara->Ceará
+celebro->cérebro
+cemiterio->cemitério
+cemiterios->cemitérios
+cenario->cenário
+cenarios->cenários
+cerebro->cérebro
+cerebros->cérebros
+chopp->chope
+ciclano->sicrano
+cidadães->cidadãos
+cidadões->cidadãos
+ciencia->ciência
+ciencias->ciências
+cientifica->científica
+cientificas->científicas
+cientifico->científico
+cientificos->científicos
+circulo->círculo
+circulos->círculos
+classica->clássica
+classicas->clássicas
+classico->clássico
+classicos->clássicos
+clinica->clínica
+cms->cm
+co-habitação->coabitação
+coalisão->coalizão
+côco->coco
+coerencia->coerência
+coerencias->coerências
+cohabitação->coabitação
+comcerteza->com certeza
+comecou->começou
+comedia->comédia
+comercio->comércio
+comercios->comércios
+comisão->comissão
+comisoes->comissões
+comisões->comissões
+comissao->comissão
+comnosco->connosco
+compôr->compor
+compreenção->compreensão
+compreenções->compreensões
+compreenssão->compreensão
+compreenssões->compreensões
+concerteza->com certeza
+conciderada->considerada
+concideradas->consideradas
+conciderado->considerado
+conciderados->considerados
+concluíndo->concluindo
+concretisar->concretizar
+condiçao->condição
+condissao->condição
+condissão->condição
+conseguírem->conseguirem
+constituia->constituía
+constituiam->constituíam
+constituiram->constituíram
+constroi->constrói
+construia->construía
+construida->construída
+construidas->construídas
+construido->construído
+construidos->construído
+contemporaneo->contemporâneo
+contemporaneos->contemporâneos
+contribue->contribui
+contrução->construção
+contruído->construído
+contruir->construir
+converçao->conversão
+converção->conversão
+conversao->conversão
+converssão->conversão
+côr->cor
+corçario->corsário
+côres->cores
+cornea->córnea
+corneas->córneas
+corografico->corográfico
+corograficos->corográficos
+correiro eletronico->correio electrónico, correio eletrônico
+corrijiam->corrigiam
+corrijir->corrigir
+corrijiram->corrigiram
+crâneo->crânio
+crâneos->crânios
+criaça->criança
+criacao->criação
+criaçao->criação
+criaças->crianças
+crianca->criança
+criancas->crianças
+cristianizacao->cristianização
+cristianizacão->cristianização
+cristianizacoes->cristianizações
+cristianizacões->cristianizações
+criticas->críticas
+critícas->críticas
+criticos->críticos
+critícos->críticos
+crueis->cruéis
+culinaria->culinária
+custuma->costuma
+custumava->costumava
+custumavam->costumavam
+custume->costume
+custumes->costumes
+decada->década
+decadas->décadas
+decadencia->decadência
+decadencias->decadências
+decer->descer
+deceram->desceram
+declinio->declínio
+declinios->declínios
+defeniçao->definição
+defenição->definição
+defenições->definições
+defenido->definido
+defenir->definir
+definitamente->definitivamente
+deiche->deixe
+deisponiveis->disponíveis
+deisponivel->disponível
+democratica->democrática
+demonio->demónio, demônio
+demonios->demónios, demônios
+depedente->dependente
+depedentes->dependentes
+deposito->depósito
+depositos->depósitos
+desagradaveis->desagradáveis
+desagradavel->desagradável
+descubrimento->descobrimento
+descubrimentos->descobrimentos
+descubrir->descobrir
+descubriram->descobriram
+descubrire->descobrire
+deseçeis->dezesseis
+desembro->Dezembro
+desesseis->dezesseis
+desnecessario->desnecessário
+despensaveis->dispensáveis
+despensáveis->dispensáveis
+despensavel->dispensável
+despensável->dispensável
+desprotejida->desprotegida
+desprotejidas->desprotegidas
+desprotejido->desprotegido
+desprotejidos->desprotegidos
+destruida->destruída
+devocao->devoção
+devocão->devoção
+devoçao->devoção
+diagnostico->diagnóstico
+diagnosticos->diagnósticos
+diaria->diária
+diáriamente->diariamente
+diario->diário
+dibre->drible
+diferencas->diferenças
+díficeis->difíceis
+dificil->difícil
+díficil->difícil
+dificulidade->dificuldade
+difusao->difusão
+dignatária->dignitária
+dignatárias->dignitárias
+dignatário->dignitário
+dignatários->dignitários
+dijita->digita
+dijitar->digitar
+dijitara->digitara
+dijitaram->digitaram
+dijitou->digitou
+diminue->diminui
+dinamico->dinâmico
+discuções->discussões
+discursso->discurso
+dispender->despender
+dispenderam->despenderam
+dispendio->dispêndio
+dispendios->dispêndios
+dispensaveis->dispensáveis
+dispensavel->dispensável
+disponiveis->disponíveis
+disponivel->disponível
+distribuida->distribuída
+distribuidas->distribuídas
+distribuido->distribuído
+distribuidos->distribuídos
+disturbio->distúrbio
+disturbios->distúrbios
+diverssas->diversas
+diverssos->diversos
+documentario->documentário
+documentarios->documentários
+dragao->dragão
+druída->druida
+druídas->druidas
+dsenho->desenho
+duvidas->dúvidas
+ecessão->exceção
+ecessões->exceções
+eciclopedia->enciclopédia
+eciclopédia->enciclopédia
+economica->económica, econômica
+ect->etc
+egipcios->egípcios
+egipsio->egípcio
+elacção->elação
+electrônica->electrónica, eletrônica
+electrônicas->electrónicas, eletrônicas
+electrônico->electrónico, eletrônico
+electrônicos->electrónicos, eletrônicos
+eletroima->eletroímã
+eletroimã->eletroímã
+eletronica->electrónica, eletrônica
+eletrónica->electrónica, eletrônica
+eletronicas->electrónicas, eletrônicas
+eletrónicas->electrónicas, eletrônicas
+eletronico->electrónico, eletrônico
+eletrónico->electrónico, eletrônico
+eletronicos->electrónicos, eletrônicos
+eletrónicos->electrónicos, eletrônicos
+elice->hélice
+emaili->e-mail, email, correio electrónico, correio eletrônico
+eminencia->eminência
+eminencias->eminências
+empresario->empresário
+empresarios->empresários
+enciclopedia->enciclopédia
+enciclopedias->enciclopédias
+enfase->ênfase
+enfases->ênfases
+entao->então
+entertido->entretido
+entitular->intitular
+entretando->entretanto
+entreteram->entretiveram
+entreterimento->entretenimento
+entreteu->entreteve
+epecial->especial
+epica->épica
+epicas->épicas
+epico->épico
+epicos->épicos
+eplepsia->epilepsia
+epoca->época
+epocas->épocas
+equilibrio->equilíbrio
+ernegia->energia
+erói->herói
+errupção->erupção
+escerda->esquerda
+escerdas->esquerdas
+esitaram->hesitaram
+esitou->hesitou
+especialisada->especializada
+especialisadas->especializadas
+especialisado->especializado
+especialisados->especializados
+espectativa->expectativa
+espectativas->expectativas
+esperanca->esperança
+esperancas->esperanças
+espetativa->expectativa
+espetativas->expectativas
+espirita->espírita
+espiritas->espíritas
+espirito->espírito
+espiritos->espíritos
+espulsou->expulsou
+esquesita->esquisita
+esquesitas->esquisitas
+esquesito->esquisito
+esquesitos->esquisitos
+estabelecimente->estabelecimento
+estabelecimentes->estabelecimentos
+estaçãoos->estações
+estadio->estádio
+estadios->estádios
+estao->estão
+esteje->esteja
+estinto->extinto
+estintos->extintos
+estorquir->extorquir
+estorquiram->extorquiram
+estorquiu->extorquiu
+estudio->estúdio
+estudios->estúdios
+esturquir->extorquir
+esturquiram->extorquiram
+esturquiu->extorquiu
+ethanol->etanol
+etica->ética
+eticas->éticas
+excavação->escavação
+excavar->escavar
+excessão->exceção
+exdrúxula->esdrúxula
+exdrúxulas->esdrúxulas
+exdrúxulo->esdrúxulo
+exdrúxulos->esdrúxulos
+exepto->excepto, exceto
+exercicio->exercício
+exercicios->exercícios
+exeto->exceto, excepto
+exijência->exigência
+exijências->exigências
+exitar->hesitar
+exitaram->hesitaram
+exitou->hesitou
+expectador->espectador
+expontânea->espontânea
+expontâneas->espontâneas
+expontâneo->espontâneo
+expontâneos->espontâneos
+extende-se->estende-se
+extender->estender
+extenderam->estenderam
+facil->fácil
+familia->família
+familias->famílias
+farmaceutica->farmacêutica
+farmaceuticas->farmacêuticas
+farmaceutico->farmacêutico
+farmaceuticos->farmacêuticos
+faser->fazer
+fecula->fécula
+fémea->fêmea
+femeninismo->femininismo
+femeninismos->femininismos
+femenino->feminino
+femeninos->femininos
+ferverosos->fervorosos
+fimeninismo->femininismo
+fimeninismos->femininismos
+fimenino->feminino
+fimeninos->femininos
+Finlandia->finlândia
+fisica->física
+fizestes->fizeste
+flôr->flor
+flôres->flores
+flôrs->flores
+fluído->fluido
+fluídos->fluidos
+forão->foram
+fortuíto->fortuito
+fortuítos->fortuitos
+fotografica->fotográfica
+frageis->frágeis
+fragil->frágil
+Frankstein->Frankenstein
+funeraria->funerária
+funerarias->funerárias
+funerario->funerário
+funerarios->funerários
+furá->furar
+furacao->furacão
+furacoes->furacões
+galaxia->galáxia
+gas->gás
+gaz->gás
+gáz->gás
+geito->jeito
+geneceu->gineceu
+generico->genérico
+genericos->genéricos
+genero->género
+generos->géneros
+genio->génio, gênio
+geometrica->geométrico
+geometricas->geométricos
+geometrico->geométrico
+geometricos->geométricos
+gipe->jipe
+gipes->jipes
+giria->gíria
+girias->gírias
+giroscopico->giroscópio
+giroscopio->giroscópio
+gorgeta->gorjeta
+gorgetas->gorjetas
+Grã Bretanha->Grã-Bretanha
+graca->graça
+gracas->graças
+grafico->gráfico
+graficos->gráficos
+grangear->granjear
+gratuíto->gratuito
+gratuítos->gratuitos
+grau centigrado->grau Celsius
+grau centígrado->grau Celsius
+grau centígrados->grau Celsius
+grau kelvin->kelvin
+guizar->guisar
+hà->há
+hambiente->ambiente
+hambientes->ambientes
+haviam muitos->havia muitos
+haviam poucos->havia poucos
+hectar->hectare
+heraldica->heráldica
+heraldico->heráldico
+heranca->herança
+Herodoto->Heródoto
+heróico->heroico
+hexa-campeão->hexacampeão
+hilariedade->hilaridade
+historia->história
+historica->histórica
+historicas->históricas
+historico->histórico
+historicos->históricos
+homosexual->homossexual
+homosexualidade->homossexualidade
+horario->horário
+horarios->horários
+hoxigenio->oxigênio
+hoxigênio->oxigênio
+humoristica->humorística
+humoristico->humorístico
+ideología->ideologia
+idolo->ídolo
+idolos->ídolos
+igiene->higiene
+igienico->higiênico
+iguasu->Iguaçu
+ilacção->ilação
+imenência->iminência
+imenente->iminente
+imoveis->imóveis
+imovel->imóvel
+imperio->império
+imperios->impérios
+importancia->importância
+importancias->importâncias
+impresa->empresa
+imuno-deficiência->imunodeficiência
+imuno-deficiências->imunodeficiências
+incluiam->incluíam
+inclusivé->inclusive
+indefenição->indefinição
+indefenições->indefinições
+indefenir->indefinir
+indentidade->identidade
+indentidades->identidades
+India->Índia
+indice->índice
+indigena->indígena
+indiguinação->indignação
+indiguinado->indignado
+indiguinar->indignar
+indioma->idioma
+indiomas->idiomas
+individada->endividada
+individadas->endividadas
+individado->endividado
+individados->endividados
+individuo->indivíduo
+individuos->indivíduos
+inedita->inédita
+ineditas->inéditas
+inedito->inédito
+ineditos->inéditos
+infancia->infância
+infelismente->infelizmente
+inflacção->inflação
+infra vermelho->infravermelho
+infra vermelhos->infravermelhos
+infra-vermelho->infravermelho
+infra-vermelhos->infravermelhos
+ingenuo->ingénuo
+ingles->inglês
+inglêsa->inglesa
+inglêsas->inglesas
+inglêses->ingleses
+ingreja->igreja
+inícia->inicia
+inicio->início
+inicios->inícios
+inteligencia->inteligência
+inteligencias->inteligências
+intensão->intenção
+intertido->entretido
+intervemos->intervimos
+intervi->intervim
+intervido->intervindo
+interviram->intervieram
+interviste->intervieste
+interviu->interveio
+intigração->integração
+intrumental->instrumental
+intrumento->instrumento
+inumeras->inúmeras
+inumeros->inúmeros
+invensivel->invencível
+invensível->invencível
+invenssível->invencível
+inves->invés
+invez->invés
+invéz->invés
+iorgute->iogurte
+iper->hiper
+ipopótamo->hipopótamo
+ipslon->ípslon
+irisar->irizar
+irmao->irmão
+irmaos->irmãos
+irupção->irrupção
+ispirar->inspirar
+ispirou->inspirou
+issu->isso
+jamelão->jamelada,rabada
+japones->japonês
+jeropiga->geropiga
+Joana d´Arc->Joana d'Arc
+judiciaria->judiciária
+judiciarias->judiciárias
+juíz->juiz
+juiza->juíza
+juizas->juízas
+juizes->juízes
+junior->júnior
+júniores->juniores
+juridica->jurídica
+juridição->jurisdição
+juridicas->jurídicas
+juridico->jurídico
+juridicos->jurídicos
+juz->jus
+kilo->quilograma
+kilômetro->quilômetro
+kilometro->quilómetro, quilômetro
+kilómetro->quilómetro, quilômetro
+kilometros->quilómetros, quilômetros
+kilómetros->quilómetros, quilômetros
+km2->km²
+largartixa->lagartixa
+largarto->lagarto
+leem->lêem
+leêm->lêem
+lêm->lêem
+lendaria->lendária
+lendarias->lendárias
+lendario->lendário
+lendarios->lendários
+leucémia->leucemia
+licenca->licença
+licencas->licenças
+licensa->licença
+lider->líder
+lideres->líderes
+lingua->língua
+linguas->línguas
+linguísta->linguista
+línguísta->linguista
+linguístas->linguistas
+línguístas->linguistas
+lisongea->lisonjeia
+lisongear->lisonjear
+lisongeara->lisonjeara
+lisongearam->lisonjearam
+lisongearou->lisonjearou
+lisonjea->lisonjeia
+logica->lógica
+lógicamente->logicamente
+logista->lojista
+logistas->lojistas
+lojica->lógica
+lójica->lógica
+lusofona->lusófona
+lusofonas->lusófonas
+lusofono->lusófono
+lusofonos->lusófonos
+magestade->majestade
+magestades->majestades
+magica->mágica
+magico->mágico
+mangerico->manjerico
+mangericos->manjericos
+manteram->mantiveram
+manteu->manteve
+maritima->marítima
+maritimas->marítimas
+maritimo->marítimo
+maritimos->marítimos
+massiça->maciça
+massiças->maciças
+massiço->maciço
+massiços->maciços
+meche->mexe
+mecher->mexer
+mecheram->mexeram
+mecheu->mexeu
+médico cirurgião->médico-cirurgião
+memoria->memória
+memorias->memórias
+menas->menos
+mercenaria->mercenária
+mercenarias->mercenárias
+mercenario->mercenário
+mercenarios->mercenários
+mêses->meses
+metereologia->meteorologia
+metodo->método
+metodos->métodos
+miceis->mísseis
+míceis->mísseis
+micil->míssil
+mícil->míssil
+minerio->minério
+minimo->mínimo
+missao->missão
+mistica->mística
+misticas->místicas
+mistico->místico
+misticos->místicos
+miticas->míticas
+molar->mol/L
+molaridade->concentração em quantidade de matéria
+muinto->muito
+muintos->muitos
+multi-uso-> multiúso
+multimedia->multimedia, multimídia
+multimedias->multimédias, multimídias
+multimidia->multimídia, multimédia
+multimidias-> multimídias, multimédias
+multiuso-> multiúso
+municipio->município
+munícipio->município
+munícípio->município
+municipios->municípios
+munícipios->municípios
+munícípios->municípios
+munto->muito
+muntos->muitos
+musica->música
+musicas->músicas
+musico->músico
+musicos->músicos
+ñ->não
+nanômetro->nanometro
+nao->não
+naum->não
+negocios->negócios
+nenum->nenhum
+neo darwinismo->neodarwinismo
+neo liberais->neoliberais
+neo liberal->neoliberal
+neo liberalismo->neoliberalismo
+neo zelandês->neozelandês
+neo zelandesa->neozelandesa
+neo-darwinismo->neodarwinismo
+neo-liberais->neoliberais
+neo-liberal->neoliberal
+neo-liberalismo->neoliberalismo
+neo-zelandês->neozelandês
+neo-zelandesa->neozelandesa
+nescessário->necessário
+ninguem->ninguém
+nivel->nível
+nonagesima->nonagésima
+nonagesimo->nonagésimo
+nonagessima->nonagésima
+nonagéssima->nonagésima
+nonagessimo->nonagésimo
+nonagéssimo->nonagésimo
+nostalgico->nostálgico
+nostalgicos->nostálgicos
+notávelmente->notavelmente
+númerais->numerais
+númeral->numeral
+número de Avogadro->constante de Avogadro
+número de moles->quantidade de matéria
+número de mols->quantidade de matéria
+numero->número
+numeros->números
+numismatica->numismática
+numismatico->numismático
+núvem->nuvem
+núvens->nuvens
+obrigatoria->obrigatória
+obrigatorias->obrigatórias
+obrigatorio->obrigatório
+obrigatorios->obrigatórios
+obtem->obtém, obtêm
+obteram->obtiveram
+obteu->obteve
+ºC->°C
+odio->ódio
+ºF->°F
+oje->hoje
+olimpico->olímpico
+olimpicos->olímpicos
+omem->homem
+optima->óptima, ótima
+optimo->óptimo, ótimo
+orta->horta
+otima->ótima, óptima
+otimisadas->otimizadas, optimizadas
+otimo->ótimo, óptimo
+oxido-redução->oxirredução
+pagaos->pagãos
+pagina->página
+paises->países
+paleolitica->paleolítica
+paleolitico->paleolítico
+papeis->papéis
+para mim fazer->para eu fazer
+paraiso->paraíso
+paraisos->paraísos
+paraizo->paraíso
+paraízo->paraíso
+paraizos->paraísos
+paraízos->paraísos
+paralização->paralisação
+paralizado->paralisado
+paralizar->paralisar
+paroco->pároco
+parocos->párocos
+pascais->pascals
+patria->pátria
+Paulinia->Paulínia
+pedigri->pedigree
+penta-campeão->pentacampeão
+percursora->precursora
+percursoras->precursoras
+periodo->período
+periodos->períodos
+periudo->período
+períudo->período
+periudos->períodos
+períudos->períodos
+permenor->pormenor
+permenores->pormenores
+perola->pérola
+perolas->pérolas
+personalisação->personalização
+personalisar->personalizar
+personalisou->personalizou
+pertubar->perturbar
+peso atômico->massa atômica
+peso molecular->massa molecular
+pesquiza->pesquisa
+picômetro->picometro
+plásticamente->plasticamente
+plasticas->plásticas
+plastico->plástico
+plasticos->plásticos
+poblema->problema
+pobrema->problema
+politica->política
+politicas->políticas
+politico->político
+politicos->políticos
+poluicao->poluição
+Portugual->Portugal
+posivel->possível
+possiveis->possíveis
+possivel->possível
+possue->possui
+pq->porque,porquê,por que,por quê
+praca->praça
+prefêrencias->preferências
+prescisa->precisa
+prestaçãões->prestações
+pretenção->pretensão
+pretenssão->pretensão
+previlegio->privilégio
+previlégio->privilégio
+previlegios->privilégios
+previlégios->privilégios
+primaria->primária
+primarias->primárias
+primario->primário
+primarios->primários
+primeiro ministro->primeiro-ministro
+princípalmente->principalmente
+príncipalmente->principalmente
+principios->princípios
+prisao->prisão
+prisoes->prisões
+privatizaçao->privatização
+privilegio->privilégio
+privilegios->privilégios
+proceço->processo
+proceços->processos
+proceso->processo
+procesos->processos
+producao->produção
+progama->programa
+progamas->programas
+proibe->proíbe
+proíbido->proibido
+propia->própria
+própia->própria
+propias->próprias
+propiedade->propriedade
+propio->próprio
+própio->próprio
+propios->próprios
+proposito->propósito
+prosceço->processo
+prosceços->processos
+prosceso->processo
+proscesos->processos
+proseço->processo
+proseços->processos
+prosseço->processo
+prosseços->processos
+protejida->protegida
+protejidas->protegidas
+protejido->protegido
+protejidos->protegidos
+prototipo->protótipo
+prototipos->protótipos
+provincia->província
+provincias->províncias
+proxima->próxima
+proximas->próximas
+proximo->próximo
+proximos->próximos
+pseudo-ciência->pseudociência
+publico->público
+publicos->públicos
+qeu->que
+questao->questão
+quilómetro->quilômetro
+quilometro->quilómetro, quilômetro
+quilometros->quilómetros, quilômetros
+quimica->química
+quimicas->químicas
+quimico->químico
+quimicos->químicos
+quizer->quiser
+quizesse->quisesse
+quizessem->quisessem
+radiaçao->radiação
+radio->rádio
+raíz->raiz
+raizes->raízes
+rarissimo->raríssimo
+rarissimos->raríssimos
+razao->razão
+razoes->razões
+récorde->recorde
+referencia->referência
+referencias->referências
+reibi->râguebi
+reinterar->reiterar
+reinvidicação->reivindicação
+reinvidicar->reivindicar
+renovaveis->renováveis
+repertorio->repertório
+repertorios->repertórios
+reportorio->reportório
+reportorios->reportórios
+requesito->requisito
+responsaveis->responsáveis
+responsavel->responsável
+retem->retém, retêm
+reteram->retiveram
+reteu->reteve
+reune->reúne
+reunem->reúnem
+reuniao->reunião
+reunioes->reuniões
+reuso-> reúso
+riquissimo->riquíssimo
+riquissimos->riquíssimos
+ritualistico->ritualístico
+rúbrica->rubrica
+rúbricas->rubricas
+sacerdocio->sacerdócio
+sacrificio->sacrifício
+saira->saíra, sairá
+santuario->santuário
+sao->são
+saude->saúde
+secudaria->secudária
+secudarias->secudárias
+secudario->secudário
+secudarios->secudários
+seculo->século
+seculos->séculos
+seissentos->seiscentos
+seje->seja
+semaforo->semáforo
+semaforos->semáforos
+semi círculo->semicírculo
+semi círculos->semicírculos
+semi finais->semifinais
+semi final->semifinal
+semi precioso->semiprecioso
+semi preciosos->semipreciosos
+semi presidencialismos->semipresidencialismos
+semi presidencialistas->semipresidencialistas
+semi-círculo->semicírculo
+semi-círculos->semicírculos
+semi-finais->semifinais
+semi-final->semifinal
+semi-precioso->semiprecioso
+semi-preciosos->semipreciosos
+semi-presidencialismos->semipresidencialismos
+semi-presidencialistas->semipresidencialistas
+sensiveis->sensíveis
+sensivel->sensível
+separaçoes->separações
+serie->série
+serio->sério, série, seriado
+setessentos->setecentos
+siclano->sicrano
+simbolo->símbolo
+simbolos->símbolos
+simplemente->simplesmente
+sindrome->síndrome
+sinonimo->sinónimo, sinônimo
+síntaze->síntaxe
+sistemico->sistémico
+sobrevivencia->sobrevivência
+sombrancelha->sobrancelha
+subdivisáo->subdivisão
+substituida->substituída
+substituidas->substituídas
+substituido->substituído
+substituidos->substituídos
+suçeso->sucesso
+suçesos->sucessos
+suçesso->sucesso
+suçessos->sucessos
+Suiça->Suíça
+suiço->suíço
+suino->suíno
+suseço->sucesso
+suseços->sucessos
+susseço->sucesso
+susseços->sucessos
+sussesso->sucesso
+sussessos->sucessos
+tambem->também
+támbem->também
+támbém->também
+tao->tão
+tb->também
+tbm->também
+tecnica->técnica
+tecnico->técnico
+têmporo-mandibular->temporomandibular
+tendencia->tendência
+tendencias->tendências
+tetra-hidrofurano->tetraidrofurano
+tipica->típica
+tipicas->típicas
+tipico->típico
+tipicos->típicos
+titulos->títulos
+tracao->tracção, tração
+tranformar->transformar
+transmissiveis->transmissíveis
+transmissivel->transmissível
+traser->trazer
+trasnporta->transporta
+trasnporte->transporte
+trasnportes->transportes
+tratrahidrofurano->tetraidrofurano
+tres->três
+treslagoense->três-lagoense
+tri-campeão->tricampeão
+trovao->trovão
+Tupí-guarani->Tupi-guarani
+turistico->turístico
+turisticos->turísticos
+u.m.a->u
+ultima->última
+ultimo->último
+ultimos->últimos
+um um->um
+úmidade->umidade, humidade
+unica->única
+unicas->únicas
+unico->único
+unicos->únicos
+univercidade->universidade
+univercidades->universidades
+universitaria->universitária
+universitarias->universitárias
+universitario->universitário
+universitarios->universitários
+uqe->que
+usuario->usuário, utilizador
+util->útil
+utilisador->utilizador, usuário
+uzada->usada
+uzadas->usadas
+uzado->usado
+uzados->usados
+uzar->usar
+uzo->uso
+uzou->usou
+váriados->variados
+varias->várias
+varios->vários
+vc->você
+veiculo->veículo
+veiculos->veículos
+verçao->versão
+verção->versão
+verçoes->versões
+verções->versões
+ves->vez, vês
+veses->vezes
+vestigio->vestígio
+vestigios->vestígios
+vezis->vezes
+viajem->viagem
+vice governador->vice-governador
+vice governadores->vice-governadores
+vice prefeito->vice-prefeito
+vice prefeitos->vice-prefeitos
+vice presidente->vice-presidente
+vice presidentes->vice-presidentes
+video game->videogame
+video->vídeo
+videoclip->videoclipe
+vigilancia->vigilância
+violencia->violência
+viros->vírus
+víros->vírus
+virus->vírus
+virús->vírus
+vírús->vírus
+vitoria->vitória
+vitorias->vitórias
+viuva->viúva
+voçe->você
+voçê->você
+Wikimapa->WikiMapia
+Wikimapia->WikiMapia
+xafariz->chafariz
+xuxu->chuchu
+yoga->ioga
+yôga->ioga
diff --git a/love2dToAPK/tools/tools/android-win/tools/support/typos-tr.txt b/love2dToAPK/tools/tools/android-win/tools/support/typos-tr.txt
new file mode 100644
index 0000000..4db11e7
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/support/typos-tr.txt
@@ -0,0 +1,604 @@
+# This file contains a number of common Turkish typos:
+andriod->android
+
+# The remainder of this file contains misspellings from
+# http://tr.wikipedia.org/wiki/Vikipedi:Yaygin_kelime_hatalari/makinalar_icin
+# plus some post-processing to fix invalid entries, remove duplicates, etc.
+#
+# The content is available under the
+# "Creative Commons Attribution-ShareAlike License"
+# http://creativecommons.org/licenses/by-sa/3.0/
+#
+# THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
+# COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
+# COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
+# AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
+#
+# BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
+# TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY
+# BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS
+# CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
+# CONDITIONS.
+#
+# *1. Definitions*
+#
+# 1. *"Adaptation"* means a work based upon the Work, or upon the Work
+# and other pre-existing works, such as a translation, adaptation,
+# derivative work, arrangement of music or other alterations of a
+# literary or artistic work, or phonogram or performance and includes
+# cinematographic adaptations or any other form in which the Work may
+# be recast, transformed, or adapted including in any form
+# recognizably derived from the original, except that a work that
+# constitutes a Collection will not be considered an Adaptation for
+# the purpose of this License. For the avoidance of doubt, where the
+# Work is a musical work, performance or phonogram, the
+# synchronization of the Work in timed-relation with a moving image
+# ("synching") will be considered an Adaptation for the purpose of
+# this License.
+# 2. *"Collection"* means a collection of literary or artistic works,
+# such as encyclopedias and anthologies, or performances, phonograms
+# or broadcasts, or other works or subject matter other than works
+# listed in Section 1(f) below, which, by reason of the selection and
+# arrangement of their contents, constitute intellectual creations, in
+# which the Work is included in its entirety in unmodified form along
+# with one or more other contributions, each constituting separate and
+# independent works in themselves, which together are assembled into a
+# collective whole. A work that constitutes a Collection will not be
+# considered an Adaptation (as defined below) for the purposes of this
+# License.
+# 3. *"Creative Commons Compatible License"* means a license that is
+# listed at http://creativecommons.org/compatiblelicenses that has
+# been approved by Creative Commons as being essentially equivalent to
+# this License, including, at a minimum, because that license: (i)
+# contains terms that have the same purpose, meaning and effect as the
+# License Elements of this License; and, (ii) explicitly permits the
+# relicensing of adaptations of works made available under that
+# license under this License or a Creative Commons jurisdiction
+# license with the same License Elements as this License.
+# 4. *"Distribute"* means to make available to the public the original
+# and copies of the Work or Adaptation, as appropriate, through sale
+# or other transfer of ownership.
+# 5. *"License Elements"* means the following high-level license
+# attributes as selected by Licensor and indicated in the title of
+# this License: Attribution, ShareAlike.
+# 6. *"Licensor"* means the individual, individuals, entity or entities
+# that offer(s) the Work under the terms of this License.
+# 7. *"Original Author"* means, in the case of a literary or artistic
+# work, the individual, individuals, entity or entities who created
+# the Work or if no individual or entity can be identified, the
+# publisher; and in addition (i) in the case of a performance the
+# actors, singers, musicians, dancers, and other persons who act,
+# sing, deliver, declaim, play in, interpret or otherwise perform
+# literary or artistic works or expressions of folklore; (ii) in the
+# case of a phonogram the producer being the person or legal entity
+# who first fixes the sounds of a performance or other sounds; and,
+# (iii) in the case of broadcasts, the organization that transmits the
+# broadcast.
+# 8. *"Work"* means the literary and/or artistic work offered under the
+# terms of this License including without limitation any production in
+# the literary, scientific and artistic domain, whatever may be the
+# mode or form of its expression including digital form, such as a
+# book, pamphlet and other writing; a lecture, address, sermon or
+# other work of the same nature; a dramatic or dramatico-musical work;
+# a choreographic work or entertainment in dumb show; a musical
+# composition with or without words; a cinematographic work to which
+# are assimilated works expressed by a process analogous to
+# cinematography; a work of drawing, painting, architecture,
+# sculpture, engraving or lithography; a photographic work to which
+# are assimilated works expressed by a process analogous to
+# photography; a work of applied art; an illustration, map, plan,
+# sketch or three-dimensional work relative to geography, topography,
+# architecture or science; a performance; a broadcast; a phonogram; a
+# compilation of data to the extent it is protected as a copyrightable
+# work; or a work performed by a variety or circus performer to the
+# extent it is not otherwise considered a literary or artistic work.
+# 9. *"You"* means an individual or entity exercising rights under this
+# License who has not previously violated the terms of this License
+# with respect to the Work, or who has received express permission
+# from the Licensor to exercise rights under this License despite a
+# previous violation.
+# 10. *"Publicly Perform"* means to perform public recitations of the Work
+# and to communicate to the public those public recitations, by any
+# means or process, including by wire or wireless means or public
+# digital performances; to make available to the public Works in such
+# a way that members of the public may access these Works from a place
+# and at a place individually chosen by them; to perform the Work to
+# the public by any means or process and the communication to the
+# public of the performances of the Work, including by public digital
+# performance; to broadcast and rebroadcast the Work by any means
+# including signs, sounds or images.
+# 11. *"Reproduce"* means to make copies of the Work by any means
+# including without limitation by sound or visual recordings and the
+# right of fixation and reproducing fixations of the Work, including
+# storage of a protected performance or phonogram in digital form or
+# other electronic medium.
+#
+# *2. Fair Dealing Rights.* Nothing in this License is intended to reduce,
+# limit, or restrict any uses free from copyright or rights arising from
+# limitations or exceptions that are provided for in connection with the
+# copyright protection under copyright law or other applicable laws.
+#
+# *3. License Grant.* Subject to the terms and conditions of this License,
+# Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
+# perpetual (for the duration of the applicable copyright) license to
+# exercise the rights in the Work as stated below:
+#
+# 1. to Reproduce the Work, to incorporate the Work into one or more
+# Collections, and to Reproduce the Work as incorporated in the
+# Collections;
+# 2. to create and Reproduce Adaptations provided that any such
+# Adaptation, including any translation in any medium, takes
+# reasonable steps to clearly label, demarcate or otherwise identify
+# that changes were made to the original Work. For example, a
+# translation could be marked "The original work was translated from
+# English to Spanish," or a modification could indicate "The original
+# work has been modified.";
+# 3. to Distribute and Publicly Perform the Work including as
+# incorporated in Collections; and,
+# 4. to Distribute and Publicly Perform Adaptations.
+# 5.
+#
+# For the avoidance of doubt:
+#
+# 1. *Non-waivable Compulsory License Schemes*. In those
+# jurisdictions in which the right to collect royalties through
+# any statutory or compulsory licensing scheme cannot be waived,
+# the Licensor reserves the exclusive right to collect such
+# royalties for any exercise by You of the rights granted under
+# this License;
+# 2. *Waivable Compulsory License Schemes*. In those jurisdictions in
+# which the right to collect royalties through any statutory or
+# compulsory licensing scheme can be waived, the Licensor waives
+# the exclusive right to collect such royalties for any exercise
+# by You of the rights granted under this License; and,
+# 3. *Voluntary License Schemes*. The Licensor waives the right to
+# collect royalties, whether individually or, in the event that
+# the Licensor is a member of a collecting society that
+# administers voluntary licensing schemes, via that society, from
+# any exercise by You of the rights granted under this License.
+#
+# The above rights may be exercised in all media and formats whether now
+# known or hereafter devised. The above rights include the right to make
+# such modifications as are technically necessary to exercise the rights
+# in other media and formats. Subject to Section 8(f), all rights not
+# expressly granted by Licensor are hereby reserved.
+#
+# *4. Restrictions.* The license granted in Section 3 above is expressly
+# made subject to and limited by the following restrictions:
+#
+# 1. You may Distribute or Publicly Perform the Work only under the terms
+# of this License. You must include a copy of, or the Uniform Resource
+# Identifier (URI) for, this License with every copy of the Work You
+# Distribute or Publicly Perform. You may not offer or impose any
+# terms on the Work that restrict the terms of this License or the
+# ability of the recipient of the Work to exercise the rights granted
+# to that recipient under the terms of the License. You may not
+# sublicense the Work. You must keep intact all notices that refer to
+# this License and to the disclaimer of warranties with every copy of
+# the Work You Distribute or Publicly Perform. When You Distribute or
+# Publicly Perform the Work, You may not impose any effective
+# technological measures on the Work that restrict the ability of a
+# recipient of the Work from You to exercise the rights granted to
+# that recipient under the terms of the License. This Section 4(a)
+# applies to the Work as incorporated in a Collection, but this does
+# not require the Collection apart from the Work itself to be made
+# subject to the terms of this License. If You create a Collection,
+# upon notice from any Licensor You must, to the extent practicable,
+# remove from the Collection any credit as required by Section 4(c),
+# as requested. If You create an Adaptation, upon notice from any
+# Licensor You must, to the extent practicable, remove from the
+# Adaptation any credit as required by Section 4(c), as requested.
+# 2. You may Distribute or Publicly Perform an Adaptation only under the
+# terms of: (i) this License; (ii) a later version of this License
+# with the same License Elements as this License; (iii) a Creative
+# Commons jurisdiction license (either this or a later license
+# version) that contains the same License Elements as this License
+# (e.g., Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons
+# Compatible License. If you license the Adaptation under one of the
+# licenses mentioned in (iv), you must comply with the terms of that
+# license. If you license the Adaptation under the terms of any of the
+# licenses mentioned in (i), (ii) or (iii) (the "Applicable License"),
+# you must comply with the terms of the Applicable License generally
+# and the following provisions: (I) You must include a copy of, or the
+# URI for, the Applicable License with every copy of each Adaptation
+# You Distribute or Publicly Perform; (II) You may not offer or impose
+# any terms on the Adaptation that restrict the terms of the
+# Applicable License or the ability of the recipient of the Adaptation
+# to exercise the rights granted to that recipient under the terms of
+# the Applicable License; (III) You must keep intact all notices that
+# refer to the Applicable License and to the disclaimer of warranties
+# with every copy of the Work as included in the Adaptation You
+# Distribute or Publicly Perform; (IV) when You Distribute or Publicly
+# Perform the Adaptation, You may not impose any effective
+# technological measures on the Adaptation that restrict the ability
+# of a recipient of the Adaptation from You to exercise the rights
+# granted to that recipient under the terms of the Applicable License.
+# This Section 4(b) applies to the Adaptation as incorporated in a
+# Collection, but this does not require the Collection apart from the
+# Adaptation itself to be made subject to the terms of the Applicable
+# License.
+# 3. If You Distribute, or Publicly Perform the Work or any Adaptations
+# or Collections, You must, unless a request has been made pursuant to
+# Section 4(a), keep intact all copyright notices for the Work and
+# provide, reasonable to the medium or means You are utilizing: (i)
+# the name of the Original Author (or pseudonym, if applicable) if
+# supplied, and/or if the Original Author and/or Licensor designate
+# another party or parties (e.g., a sponsor institute, publishing
+# entity, journal) for attribution ("Attribution Parties") in
+# Licensor's copyright notice, terms of service or by other reasonable
+# means, the name of such party or parties; (ii) the title of the Work
+# if supplied; (iii) to the extent reasonably practicable, the URI, if
+# any, that Licensor specifies to be associated with the Work, unless
+# such URI does not refer to the copyright notice or licensing
+# information for the Work; and (iv) , consistent with Ssection 3(b),
+# in the case of an Adaptation, a credit identifying the use of the
+# Work in the Adaptation (e.g., "French translation of the Work by
+# Original Author," or "Screenplay based on original Work by Original
+# Author"). The credit required by this Section 4(c) may be
+# implemented in any reasonable manner; provided, however, that in the
+# case of a Adaptation or Collection, at a minimum such credit will
+# appear, if a credit for all contributing authors of the Adaptation
+# or Collection appears, then as part of these credits and in a manner
+# at least as prominent as the credits for the other contributing
+# authors. For the avoidance of doubt, You may only use the credit
+# required by this Section for the purpose of attribution in the
+# manner set out above and, by exercising Your rights under this
+# License, You may not implicitly or explicitly assert or imply any
+# connection with, sponsorship or endorsement by the Original Author,
+# Licensor and/or Attribution Parties, as appropriate, of You or Your
+# use of the Work, without the separate, express prior written
+# permission of the Original Author, Licensor and/or Attribution Parties.
+# 4. Except as otherwise agreed in writing by the Licensor or as may be
+# otherwise permitted by applicable law, if You Reproduce, Distribute
+# or Publicly Perform the Work either by itself or as part of any
+# Adaptations or Collections, You must not distort, mutilate, modify
+# or take other derogatory action in relation to the Work which would
+# be prejudicial to the Original Author's honor or reputation.
+# Licensor agrees that in those jurisdictions (e.g. Japan), in which
+# any exercise of the right granted in Section 3(b) of this License
+# (the right to make Adaptations) would be deemed to be a distortion,
+# mutilation, modification or other derogatory action prejudicial to
+# the Original Author's honor and reputation, the Licensor will waive
+# or not assert, as appropriate, this Section, to the fullest extent
+# permitted by the applicable national law, to enable You to
+# reasonably exercise Your right under Section 3(b) of this License
+# (right to make Adaptations) but not otherwise.
+#
+# *5. Representations, Warranties and Disclaimer*
+#
+# UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
+# OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
+# KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
+# INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
+# FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
+# LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
+# WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE
+# EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
+#
+# *6. Limitation on Liability.* EXCEPT TO THE EXTENT REQUIRED BY
+# APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL
+# THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY
+# DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF
+# LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+#
+# *7. Termination*
+#
+# 1. This License and the rights granted hereunder will terminate
+# automatically upon any breach by You of the terms of this License.
+# Individuals or entities who have received Adaptations or Collections
+# from You under this License, however, will not have their licenses
+# terminated provided such individuals or entities remain in full
+# compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will
+# survive any termination of this License.
+# 2. Subject to the above terms and conditions, the license granted here
+# is perpetual (for the duration of the applicable copyright in the
+# Work). Notwithstanding the above, Licensor reserves the right to
+# release the Work under different license terms or to stop
+# distributing the Work at any time; provided, however that any such
+# election will not serve to withdraw this License (or any other
+# license that has been, or is required to be, granted under the terms
+# of this License), and this License will continue in full force and
+# effect unless terminated as stated above.
+#
+# *8. Miscellaneous*
+#
+# 1. Each time You Distribute or Publicly Perform the Work or a
+# Collection, the Licensor offers to the recipient a license to the
+# Work on the same terms and conditions as the license granted to You
+# under this License.
+# 2. Each time You Distribute or Publicly Perform an Adaptation, Licensor
+# offers to the recipient a license to the original Work on the same
+# terms and conditions as the license granted to You under this License.
+# 3. If any provision of this License is invalid or unenforceable under
+# applicable law, it shall not affect the validity or enforceability
+# of the remainder of the terms of this License, and without further
+# action by the parties to this agreement, such provision shall be
+# reformed to the minimum extent necessary to make such provision
+# valid and enforceable.
+# 4. No term or provision of this License shall be deemed waived and no
+# breach consented to unless such waiver or consent shall be in
+# writing and signed by the party to be charged with such waiver or
+# consent.
+# 5. This License constitutes the entire agreement between the parties
+# with respect to the Work licensed here. There are no understandings,
+# agreements or representations with respect to the Work not specified
+# here. Licensor shall not be bound by any additional provisions that
+# may appear in any communication from You. This License may not be
+# modified without the mutual written agreement of the Licensor and You.
+# 6. The rights granted under, and the subject matter referenced, in this
+# License were drafted utilizing the terminology of the Berne
+# Convention for the Protection of Literary and Artistic Works (as
+# amended on September 28, 1979), the Rome Convention of 1961, the
+# WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms
+# Treaty of 1996 and the Universal Copyright Convention (as revised on
+# July 24, 1971). These rights and subject matter take effect in the
+# relevant jurisdiction in which the License terms are sought to be
+# enforced according to the corresponding provisions of the
+# implementation of those treaty provisions in the applicable national
+# law. If the standard suite of rights granted under applicable
+# copyright law includes additional rights not granted under this
+# License, such additional rights are deemed to be included in the
+# License; this License is not intended to restrict the license of any
+# rights under applicable law.
+acizane->âcizane
+alamanya->almanya
+aferim->aferin
+agrasif->agresif
+ağostos->ağustos
+ahret->ahiret
+ayle->aile
+alarım->alarm
+atmış->altmış
+alemiyon->alüminyum
+amarika->amerika
+anfi->amfi
+aparetif->aperitif
+arabeks->arabesk
+artiz->artist
+aşşağı->aşağı
+ahçı->aşçı
+avut->aut
+ayakıbı->ayakkabı
+azarbeycan->azerbaycan
+azerbeycan->azerbaycan
+avusturalya->avustralya
+bangledeş->bangladeş
+pıçak->bıçak
+bilmukavele->bilmukabele
+birşey->bir şey
+bir kaç->birkaç
+bir çok->birçok
+pisiklet->bisiklet
+püsküüt->bisküvi
+canbaz->cambaz
+çoçuk->çocuk
+çoşku->coşku
+cıplak->çıplak
+çiflik->çiftlik
+çünki->çünkü
+dekarasyon->dekorasyon
+debrem->deprem
+dohtor->doktor
+doktur->doktor
+doktör->doktor
+tiken->diken
+dinazor->dinozor
+diplamat->diplomat
+distibütör->distribütör
+dinayet->diyanet
+domat->domates
+domtiz->domates
+domatis->domates
+domatiz->domates
+döküman->doküman
+döndermek->döndürmek
+dükkan->dükkân
+tukkan->dükkân
+egsos->egzoz
+egsoz->egzoz
+egsozt->egzoz
+egzos->egzoz
+egzost->egzoz
+eksos->egzoz
+eksoz->egzoz
+eksozt->egzoz
+ekzos->egzoz
+ekzost->egzoz
+eşki->ekşi
+eylence->eğlence
+elenktirik->elektrik
+elenktrik->elektrik
+elektirik->elektrik
+entellektüel->entelektüel
+aşortman->eşofman
+eşortman->eşofman
+felan->falan
+filim->film
+formil->formül
+gardırop->gardrop
+gardolap->gardrop
+gaste->gazete
+goometri->geometri
+girişgen->girişken
+greyfirut->greyfurt
+greyfrut->greyfurt
+gürcüstan->gürcistan
+güzelgah->güzergâh
+güzergah->güzergâh
+harfiyat->hafriyat
+hastene->hastane
+havunç->havuç
+herhangibir->herhangi bir
+herşey->her şey,her şey
+haparlör->hoparlör
+hopollo->hoparlör
+hoporlör->hoparlör
+operlo->hoparlör
+operlor->hoparlör
+hakkari->hakkâri
+heralda->herhalde
+herkez->herkes
+#hiç bir->hiçbir
+hiç birşey->hiçbir şey
+hükümet->hükûmet
+holanda->hollanda
+istakoz->ıstakoz
+imkan->imkân
+imlâ->imla
+inkilap->inkılap
+insiyatif->inisiyatif
+iskan->iskân
+ıstanbul->istanbul
+istambul->istanbul
+istinâden->istinaden
+itibariyle->itibarıyla
+celatin->jelatin
+capon->Japon
+ceton->jeton
+jöton->jeton
+kağıt->kâğıt
+kağat->kâğıt
+kayfaltı->kahvaltı
+gahfe->kahve
+gayfe->kahve
+kaave->kahve
+kayfe->kahve
+kave->kahve
+gangren->kangren
+kankıran->kangren
+karekter->karakter
+kaysı->kayısı
+kebelek->kelebek
+keşki->keşke
+kırahatane->kıraathane
+kirbit->kibrit
+kipri->kirpi
+kiprik->kirpik,kirpik
+kokreç->kokoreç
+komonis->komünist
+komonist->komünist
+komonizm->komünizm
+kontür->kontör
+kopye->kopya
+kareografi->koreografi
+gipür->kupür
+küpür->kupür
+lahap->lakap
+leplepi->leblebi
+nalet->lanet
+leyen->leğen
+liğen->leğen
+liyen->leğen
+lüx->lüks
+makadonya->makedonya
+makina->makine
+maaşallah->maşallah
+matamatik->matematik
+menejer->menajer
+menapoz->menopoz
+mentalite->mantalite
+meraba->merhaba
+meyva->meyve
+mihendis->mühendis
+moğalistan->moğolistan
+müdehale->müdahale
+münübüs->minibüs
+müracat->müracaat
+mütahit->müteahhit
+mütevazi->mütevazı
+nacizane->naçizane
+laylon->naylon
+nufüs->nüfus
+nülüfer->nilüfer
+netekim->nitekim
+oce->oje
+okşizen->oksijen
+orjinal->orijinal
+otibis->otobüs
+#öğe->öge
+ötenazi->ötanazi
+palyanço->palyaço
+panaroma->panorama
+pantalon->pantolon
+pattes->patates
+pattis->patates
+peçeta->peçete
+penbe->pembe
+pelisilin->penilisin
+poaça->poğaça
+pohaça->poğaça
+poğçe->poğaça
+pırofösör->profesör
+prefesör->profesör
+profösör->profesör
+profütür->profiterol
+proğram->program
+promasyon->promosyon
+radyosyon->radyasyon
+romenya->romanya
+ruc->ruj
+sandaviç->sandviç
+sandeviç->sandviç
+sandoviç->sandviç
+sandöviç->sandviç
+sarmısak->sarımsak
+sarumsak->sarımsak
+satlık->satılık
+santranç->satranç
+santraç->satranç
+satraç->satranç
+skayner->scanner
+zebze->sebze
+seramoni->seremoni
+seromoni->seremoni
+sikorta->sigorta
+sinama->sinema
+siyasî->siyasi
+sıkandal->skandal
+sovan->soğan
+sosyel->sosyal
+sitretoskop->stetoskop
+siteteskop->stetoskop
+süpriz->sürpriz
+südyen->sütyen
+şartel->şalter
+şaltel->şalter
+şarz->şarj
+şindi->şimdi
+şöfer->şoför
+şöför->şoför
+tetbir->tedbir
+temis->temiz
+telafuz->telaffuz
+tenefüs->teneffüs
+tellik->terlik
+tranvay->tramvay
+törörist->terörist
+teşebüs->teşebbüs
+teşeppüs->teşebbüs
+tiskinmek->tiksinmek
+tos->tost
+tükrük->tükürük
+tüprük->tükürük
+traş->tıraş
+türkiya->türkiye
+ukele->ukala
+ükela->ukala
+ukranya->ukrayna
+ukrayin->ukrayna
+ünvan->unvan
+üçken->üçgen
+vucüt->vücut
+vucud->vücut
+vürüs->virüs
+fites->vites
+valeybol->voleybol
+veleybol->voleybol
+yada->ya da
+yanlız->yalnız
+yannış->yanlış
+yalnış->yanlış
+yimek->yemek
+yeni zellanda->yeni zelanda
+gine->yine
+zerafet->zarafet
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/globals.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/globals.xml.ftl
new file mode 100644
index 0000000..3475cf0
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/globals.xml.ftl
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<globals>
+ <global id="manifestOut" value="${manifestDir}" />
+ <global id="appCompat" type="boolean" value="${(minApiLevel lt 14)?string}" />
+ <!-- e.g. getSupportActionBar vs. getActionBar -->
+ <global id="Support" value="${(minApiLevel lt 14)?string('Support','')}" />
+ <global id="srcOut" value="${srcDir}/${slashedPackageName(packageName)}" />
+ <global id="resOut" value="${resDir}" />
+ <global id="menuName" value="${classToResource(activityClass)}" />
+ <global id="relativePackage" value="<#if relativePackage?has_content>${relativePackage}<#else>${packageName}</#if>" />
+</globals>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/recipe.xml.ftl
new file mode 100644
index 0000000..cc4e5b5
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/recipe.xml.ftl
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<recipe>
+
+ <#if appCompat><dependency mavenUrl="com.android.support:appcompat-v7:19.+"/></#if>
+
+ <merge from="AndroidManifest.xml.ftl"
+ to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />
+
+ <instantiate from="res/menu/main.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/menu/${menuName}.xml" />
+
+ <merge from="res/values/strings.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values/strings.xml" />
+
+ <merge from="res/values/dimens.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values/dimens.xml" />
+ <merge from="res/values-w820dp/dimens.xml"
+ to="${escapeXmlAttribute(resOut)}/values-w820dp/dimens.xml" />
+
+ <instantiate from="res/layout/activity_simple.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml" />
+
+ <instantiate from="src/app_package/SimpleActivity.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />
+
+ <open file="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />
+ <open file="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml" />
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/AndroidManifest.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/AndroidManifest.xml.ftl
new file mode 100644
index 0000000..af1d2d6
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/AndroidManifest.xml.ftl
@@ -0,0 +1,24 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <application>
+ <activity android:name="${relativePackage}.${activityClass}"
+ <#if isNewProject>
+ android:label="@string/app_name"
+ <#else>
+ android:label="@string/title_${activityToLayout(activityClass)}"
+ </#if>
+ <#if buildApi gte 16 && parentActivityClass != "">android:parentActivityName="${parentActivityClass}"</#if>>
+ <#if parentActivityClass != "">
+ <meta-data android:name="android.support.PARENT_ACTIVITY"
+ android:value="${parentActivityClass}" />
+ </#if>
+ <#if isLauncher>
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </#if>
+ </activity>
+ </application>
+
+</manifest>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/res/layout/activity_simple.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/res/layout/activity_simple.xml.ftl
new file mode 100644
index 0000000..e522310
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/res/layout/activity_simple.xml.ftl
@@ -0,0 +1,16 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingLeft="@dimen/activity_horizontal_margin"
+ android:paddingRight="@dimen/activity_horizontal_margin"
+ android:paddingTop="@dimen/activity_vertical_margin"
+ android:paddingBottom="@dimen/activity_vertical_margin"
+ tools:context="${relativePackage}.${activityClass}">
+
+ <TextView
+ android:text="@string/hello_world"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+</RelativeLayout>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/res/menu/main.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/res/menu/main.xml.ftl
new file mode 100644
index 0000000..27f6aaa
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/res/menu/main.xml.ftl
@@ -0,0 +1,9 @@
+<menu xmlns:android="http://schemas.android.com/apk/res/android"<#if appCompat>
+ xmlns:app="http://schemas.android.com/apk/res-auto"</#if>
+ xmlns:tools="http://schemas.android.com/tools"
+ tools:context="${relativePackage}.${activityClass}" >
+ <item android:id="@+id/action_settings"
+ android:title="@string/action_settings"
+ android:orderInCategory="100"
+ ${(appCompat)?string('app','android')}:showAsAction="never" />
+</menu>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/res/values-w820dp/dimens.xml b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/res/values-w820dp/dimens.xml
new file mode 100644
index 0000000..63fc816
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/res/values-w820dp/dimens.xml
@@ -0,0 +1,6 @@
+<resources>
+ <!-- Example customization of dimensions originally defined in res/values/dimens.xml
+ (such as screen margins) for screens with more than 820dp of available width. This
+ would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
+ <dimen name="activity_horizontal_margin">64dp</dimen>
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/res/values/dimens.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/res/values/dimens.xml.ftl
new file mode 100644
index 0000000..47c8224
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/res/values/dimens.xml.ftl
@@ -0,0 +1,5 @@
+<resources>
+ <!-- Default screen margins, per the Android Design guidelines. -->
+ <dimen name="activity_horizontal_margin">16dp</dimen>
+ <dimen name="activity_vertical_margin">16dp</dimen>
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/res/values/strings.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/res/values/strings.xml.ftl
new file mode 100644
index 0000000..721bd51
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/res/values/strings.xml.ftl
@@ -0,0 +1,9 @@
+<resources>
+ <#if !isNewProject>
+ <string name="title_${activityToLayout(activityClass)}">${escapeXmlString(activityTitle)}</string>
+ </#if>
+
+ <string name="hello_world">Hello world!</string>
+ <string name="action_settings">Settings</string>
+
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/src/app_package/SimpleActivity.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/src/app_package/SimpleActivity.java.ftl
new file mode 100644
index 0000000..a4b47ed
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/root/src/app_package/SimpleActivity.java.ftl
@@ -0,0 +1,35 @@
+package ${packageName};
+
+import <#if appCompat>android.support.v7.app.ActionBarActivity<#else>android.app.Activity</#if>;
+import android.os.Bundle;
+import android.view.Menu;
+import android.view.MenuItem;
+<#if applicationPackage??>import ${applicationPackage}.R;</#if>
+
+public class ${activityClass} extends ${(appCompat)?string('ActionBar','')}Activity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.${layoutName});
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ // Inflate the menu; this adds items to the action bar if it is present.
+ getMenuInflater().inflate(R.menu.${menuName}, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ // Handle action bar item clicks here. The action bar will
+ // automatically handle clicks on the Home/Up button, so long
+ // as you specify a parent activity in AndroidManifest.xml.
+ int id = item.getItemId();
+ if (id == R.id.action_settings) {
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/template.xml
new file mode 100644
index 0000000..21861e5
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/template.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0"?>
+<template
+ format="3"
+ revision="4"
+ name="Blank Activity"
+ minApi="7"
+ minBuildApi="14"
+ description="Creates a new blank activity with an action bar.">
+
+ <category value="Activity" />
+ <formfactor value="Mobile" />
+
+ <parameter
+ id="activityClass"
+ name="Activity Name"
+ type="string"
+ constraints="class|unique|nonempty"
+ suggest="${layoutToActivity(layoutName)}"
+ default="MainActivity"
+ help="The name of the activity class to create" />
+
+ <parameter
+ id="layoutName"
+ name="Layout Name"
+ type="string"
+ constraints="layout|unique|nonempty"
+ suggest="${activityToLayout(activityClass)}"
+ default="activity_main"
+ help="The name of the layout to create for the activity" />
+
+ <parameter
+ id="activityTitle"
+ name="Title"
+ type="string"
+ constraints="nonempty"
+ default="MainActivity"
+ suggest="${activityClass}"
+ help="The name of the activity. For launcher activities, the application title." />
+
+ <parameter
+ id="isLauncher"
+ name="Launcher Activity"
+ type="boolean"
+ default="false"
+ help="If true, this activity will have a CATEGORY_LAUNCHER intent filter, making it visible in the launcher" />
+
+ <parameter
+ id="parentActivityClass"
+ name="Hierarchical Parent"
+ type="string"
+ constraints="activity|exists|empty"
+ default=""
+ help="The hierarchical parent activity, used to provide a default implementation for the 'Up' button" />
+
+ <parameter
+ id="packageName"
+ name="Package name"
+ type="string"
+ constraints="package"
+ default="com.mycompany.myapp" />
+
+ <!-- 128x128 thumbnails relative to template.xml -->
+ <thumbs>
+ <!-- default thumbnail is required -->
+ <thumb>template_blank_activity.png</thumb>
+ </thumbs>
+
+ <globals file="globals.xml.ftl" />
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/template_blank_activity.png b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/template_blank_activity.png
new file mode 100644
index 0000000..d6ace2c
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivity/template_blank_activity.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/globals.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/globals.xml.ftl
new file mode 100644
index 0000000..3475cf0
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/globals.xml.ftl
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<globals>
+ <global id="manifestOut" value="${manifestDir}" />
+ <global id="appCompat" type="boolean" value="${(minApiLevel lt 14)?string}" />
+ <!-- e.g. getSupportActionBar vs. getActionBar -->
+ <global id="Support" value="${(minApiLevel lt 14)?string('Support','')}" />
+ <global id="srcOut" value="${srcDir}/${slashedPackageName(packageName)}" />
+ <global id="resOut" value="${resDir}" />
+ <global id="menuName" value="${classToResource(activityClass)}" />
+ <global id="relativePackage" value="<#if relativePackage?has_content>${relativePackage}<#else>${packageName}</#if>" />
+</globals>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/recipe.xml.ftl
new file mode 100644
index 0000000..3a2bd11
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/recipe.xml.ftl
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<recipe>
+
+ <#if appCompat><dependency mavenUrl="com.android.support:appcompat-v7:19.+"/></#if>
+
+ <merge from="AndroidManifest.xml.ftl"
+ to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />
+
+ <instantiate from="res/menu/main.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/menu/${menuName}.xml" />
+
+ <merge from="res/values/strings.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values/strings.xml" />
+
+ <merge from="res/values/dimens.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values/dimens.xml" />
+ <merge from="res/values-w820dp/dimens.xml"
+ to="${escapeXmlAttribute(resOut)}/values-w820dp/dimens.xml" />
+
+ <instantiate from="res/layout/activity_fragment_container.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml" />
+
+ <instantiate from="res/layout/fragment_simple.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/layout/${fragmentLayoutName}.xml" />
+
+ <instantiate from="src/app_package/SimpleActivity.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />
+
+ <open file="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />
+ <open file="${escapeXmlAttribute(resOut)}/layout/${fragmentLayoutName}.xml" />
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/AndroidManifest.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/AndroidManifest.xml.ftl
new file mode 100644
index 0000000..af1d2d6
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/AndroidManifest.xml.ftl
@@ -0,0 +1,24 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <application>
+ <activity android:name="${relativePackage}.${activityClass}"
+ <#if isNewProject>
+ android:label="@string/app_name"
+ <#else>
+ android:label="@string/title_${activityToLayout(activityClass)}"
+ </#if>
+ <#if buildApi gte 16 && parentActivityClass != "">android:parentActivityName="${parentActivityClass}"</#if>>
+ <#if parentActivityClass != "">
+ <meta-data android:name="android.support.PARENT_ACTIVITY"
+ android:value="${parentActivityClass}" />
+ </#if>
+ <#if isLauncher>
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </#if>
+ </activity>
+ </application>
+
+</manifest>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/res/layout/activity_fragment_container.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/res/layout/activity_fragment_container.xml.ftl
new file mode 100644
index 0000000..92b2b62
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/res/layout/activity_fragment_container.xml.ftl
@@ -0,0 +1,7 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context="${relativePackage}.${activityClass}"
+ tools:ignore="MergeRootFrame" />
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/res/layout/fragment_simple.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/res/layout/fragment_simple.xml.ftl
new file mode 100644
index 0000000..8d5a2e5
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/res/layout/fragment_simple.xml.ftl
@@ -0,0 +1,16 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingLeft="@dimen/activity_horizontal_margin"
+ android:paddingRight="@dimen/activity_horizontal_margin"
+ android:paddingTop="@dimen/activity_vertical_margin"
+ android:paddingBottom="@dimen/activity_vertical_margin"
+ tools:context="${relativePackage}.${activityClass}$PlaceholderFragment">
+
+ <TextView
+ android:text="@string/hello_world"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+</RelativeLayout>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/res/menu/main.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/res/menu/main.xml.ftl
new file mode 100644
index 0000000..27f6aaa
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/res/menu/main.xml.ftl
@@ -0,0 +1,9 @@
+<menu xmlns:android="http://schemas.android.com/apk/res/android"<#if appCompat>
+ xmlns:app="http://schemas.android.com/apk/res-auto"</#if>
+ xmlns:tools="http://schemas.android.com/tools"
+ tools:context="${relativePackage}.${activityClass}" >
+ <item android:id="@+id/action_settings"
+ android:title="@string/action_settings"
+ android:orderInCategory="100"
+ ${(appCompat)?string('app','android')}:showAsAction="never" />
+</menu>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/res/values-w820dp/dimens.xml b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/res/values-w820dp/dimens.xml
new file mode 100644
index 0000000..63fc816
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/res/values-w820dp/dimens.xml
@@ -0,0 +1,6 @@
+<resources>
+ <!-- Example customization of dimensions originally defined in res/values/dimens.xml
+ (such as screen margins) for screens with more than 820dp of available width. This
+ would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
+ <dimen name="activity_horizontal_margin">64dp</dimen>
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/res/values/dimens.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/res/values/dimens.xml.ftl
new file mode 100644
index 0000000..47c8224
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/res/values/dimens.xml.ftl
@@ -0,0 +1,5 @@
+<resources>
+ <!-- Default screen margins, per the Android Design guidelines. -->
+ <dimen name="activity_horizontal_margin">16dp</dimen>
+ <dimen name="activity_vertical_margin">16dp</dimen>
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/res/values/strings.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/res/values/strings.xml.ftl
new file mode 100644
index 0000000..991c89c
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/res/values/strings.xml.ftl
@@ -0,0 +1,7 @@
+<resources>
+ <#if !isNewProject>
+ <string name="title_${activityToLayout(activityClass)}">${escapeXmlString(activityTitle)}</string>
+ </#if>
+ <string name="hello_world">Hello world!</string>
+ <string name="action_settings">Settings</string>
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/src/app_package/SimpleActivity.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/src/app_package/SimpleActivity.java.ftl
new file mode 100644
index 0000000..561f01d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/src/app_package/SimpleActivity.java.ftl
@@ -0,0 +1,32 @@
+package ${packageName};
+
+import <#if appCompat>android.support.v7.app.ActionBarActivity<#else>android.app.Activity</#if>;
+import android.<#if appCompat>support.v7.</#if>app.ActionBar;
+import android.<#if appCompat>support.v4.</#if>app.Fragment;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.os.Build;
+
+<#if applicationPackage??>import ${applicationPackage}.R;</#if>
+
+public class ${activityClass} extends ${appCompat?string('ActionBar','')}Activity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.${layoutName});
+ if (savedInstanceState == null) {
+ get${Support}FragmentManager().beginTransaction()
+ .add(R.id.container, new PlaceholderFragment())
+ .commit();
+ }
+ }
+
+ <#include "include_options_menu.java.ftl">
+
+ <#include "include_fragment.java.ftl">
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/src/app_package/include_fragment.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/src/app_package/include_fragment.java.ftl
new file mode 100644
index 0000000..435b311
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/src/app_package/include_fragment.java.ftl
@@ -0,0 +1,15 @@
+ /**
+ * A placeholder fragment containing a simple view.
+ */
+ public static class PlaceholderFragment extends Fragment {
+
+ public PlaceholderFragment() {
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View rootView = inflater.inflate(R.layout.${fragmentLayoutName}, container, false);
+ return rootView;
+ }
+ }
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/src/app_package/include_options_menu.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/src/app_package/include_options_menu.java.ftl
new file mode 100644
index 0000000..5c4bb95
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/root/src/app_package/include_options_menu.java.ftl
@@ -0,0 +1,19 @@
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ // Inflate the menu; this adds items to the action bar if it is present.
+ getMenuInflater().inflate(R.menu.${menuName}, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ // Handle action bar item clicks here. The action bar will
+ // automatically handle clicks on the Home/Up button, so long
+ // as you specify a parent activity in AndroidManifest.xml.
+ int id = item.getItemId();
+ if (id == R.id.action_settings) {
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/template.xml
new file mode 100644
index 0000000..9b26d2f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/template.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0"?>
+<template
+ format="3"
+ revision="4"
+ name="Blank Activity with Fragment"
+ minApi="7"
+ minBuildApi="14"
+ description="Creates a new blank activity, with an action bar and a contained Fragment.">
+
+ <category value="Activity" />
+ <formfactor value="Mobile" />
+
+ <parameter
+ id="activityClass"
+ name="Activity Name"
+ type="string"
+ constraints="class|unique|nonempty"
+ suggest="${layoutToActivity(layoutName)}"
+ default="MainActivity"
+ help="The name of the activity class to create" />
+
+ <parameter
+ id="layoutName"
+ name="Layout Name"
+ type="string"
+ constraints="layout|unique|nonempty"
+ suggest="${activityToLayout(activityClass)}"
+ default="activity_main"
+ help="The name of the layout to create for the activity" />
+
+ <parameter
+ id="fragmentLayoutName"
+ name="Fragment Layout Name"
+ type="string"
+ constraints="layout|unique|nonempty"
+ suggest="fragment_${classToResource(activityClass)}"
+ default="fragment_main"
+ help="The name of the layout to create for the activity's content fragment"/>
+
+ <parameter
+ id="activityTitle"
+ name="Title"
+ type="string"
+ constraints="nonempty"
+ default="MainActivity"
+ suggest="${activityClass}"
+ help="The name of the activity. For launcher activities, the application title." />
+
+ <parameter
+ id="isLauncher"
+ name="Launcher Activity"
+ type="boolean"
+ default="false"
+ help="If true, this activity will have a CATEGORY_LAUNCHER intent filter, making it visible in the launcher" />
+
+ <parameter
+ id="parentActivityClass"
+ name="Hierarchical Parent"
+ type="string"
+ constraints="activity|exists|empty"
+ default=""
+ help="The hierarchical parent activity, used to provide a default implementation for the 'Up' button" />
+
+ <parameter
+ id="packageName"
+ name="Package name"
+ type="string"
+ constraints="package"
+ default="com.mycompany.myapp" />
+
+ <!-- 128x128 thumbnails relative to template.xml -->
+ <thumbs>
+ <!-- default thumbnail is required -->
+ <thumb>template_blank_activity_fragment.png</thumb>
+ </thumbs>
+
+ <globals file="globals.xml.ftl" />
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/template_blank_activity_fragment.png b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/template_blank_activity_fragment.png
new file mode 100644
index 0000000..53b310d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/BlankActivityWithFragment/template_blank_activity_fragment.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/globals.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/globals.xml.ftl
new file mode 100644
index 0000000..4bf836f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/globals.xml.ftl
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<globals>
+ <global id="manifestOut" value="${manifestDir}" />
+ <global id="srcOut" value="${srcDir}/${slashedPackageName(packageName)}" />
+ <global id="resOut" value="${resDir}" />
+ <global id="relativePackage" value="<#if relativePackage?has_content>${relativePackage}<#else>${packageName}</#if>" />
+</globals>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/recipe.xml.ftl
new file mode 100644
index 0000000..41088d9
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/recipe.xml.ftl
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<recipe>
+ <merge from="AndroidManifest.xml.ftl"
+ to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />
+
+ <merge from="res/values/strings.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values/strings.xml" />
+
+ <copy from="res/layout/activity_simple.xml"
+ to="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml" />
+
+ <instantiate from="src/app_package/SimpleActivity.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />
+
+ <open file="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />
+ <open file="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml" />
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/root/AndroidManifest.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/root/AndroidManifest.xml.ftl
new file mode 100644
index 0000000..8054909
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/root/AndroidManifest.xml.ftl
@@ -0,0 +1,20 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <application>
+ <activity android:name="${relativePackage}.${activityClass}"
+ <#if isNewProject>
+ android:label="@string/app_name"
+ <#else>
+ android:label="@string/title_${activityToLayout(activityClass)}"
+ </#if>
+ >
+ <#if isLauncher>
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </#if>
+ </activity>
+ </application>
+
+</manifest>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/root/res/layout/activity_simple.xml b/love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/root/res/layout/activity_simple.xml
new file mode 100644
index 0000000..39d12f0
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/root/res/layout/activity_simple.xml
@@ -0,0 +1,12 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context="${relativePackage}.${activityClass}">
+
+ <TextView
+ android:text="@string/hello_world"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+</RelativeLayout>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/root/res/values/strings.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/root/res/values/strings.xml.ftl
new file mode 100644
index 0000000..a76fbc6
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/root/res/values/strings.xml.ftl
@@ -0,0 +1,6 @@
+<resources>
+ <#if !isNewProject>
+ <string name="title_${activityToLayout(activityClass)}">${escapeXmlString(activityTitle)}</string>
+ </#if>
+ <string name="hello_world">Hello world!</string>
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/root/src/app_package/SimpleActivity.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/root/src/app_package/SimpleActivity.java.ftl
new file mode 100644
index 0000000..2df6530
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/root/src/app_package/SimpleActivity.java.ftl
@@ -0,0 +1,15 @@
+package ${packageName};
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.Menu;
+import android.view.MenuItem;
+
+public class ${activityClass} extends Activity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.${layoutName});
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/template.xml
new file mode 100644
index 0000000..73d7bc9
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/template.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0"?>
+<template
+ format="3"
+ revision="4"
+ name="Empty Activity"
+ minApi="7"
+ minBuildApi="14"
+ description="Creates a new empty activity">
+
+ <category value="Activity" />
+ <formfactor value="Mobile" />
+
+ <parameter
+ id="activityClass"
+ name="Activity Name"
+ type="string"
+ constraints="class|unique|nonempty"
+ suggest="${layoutToActivity(layoutName)}"
+ default="MainActivity"
+ help="The name of the activity class to create" />
+
+ <parameter
+ id="layoutName"
+ name="Layout Name"
+ type="string"
+ constraints="layout|unique|nonempty"
+ suggest="${activityToLayout(activityClass)}"
+ default="activity_main"
+ help="The name of the layout to create for the activity" />
+
+ <parameter
+ id="activityTitle"
+ name="Title"
+ type="string"
+ constraints="nonempty"
+ default="MainActivity"
+ suggest="${activityClass}"
+ help="The name of the activity. For launcher activities, the application title." />
+
+ <parameter
+ id="isLauncher"
+ name="Launcher Activity"
+ type="boolean"
+ default="false"
+ help="If true, this activity will have a CATEGORY_LAUNCHER intent filter, making it visible in the launcher" />
+
+ <parameter
+ id="packageName"
+ name="Package name"
+ type="string"
+ constraints="package"
+ default="com.mycompany.myapp" />
+
+ <!-- 128x128 thumbnails relative to template.xml -->
+ <thumbs>
+ <!-- default thumbnail is required -->
+ <thumb>template_blank_activity.png</thumb>
+ </thumbs>
+
+ <globals file="globals.xml.ftl" />
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/template_blank_activity.png b/love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/template_blank_activity.png
new file mode 100644
index 0000000..d6ace2c
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/EmptyActivity/template_blank_activity.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/globals.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/globals.xml.ftl
new file mode 100644
index 0000000..81a41ba
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/globals.xml.ftl
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<globals>
+ <global id="projectOut" value="." />
+ <global id="manifestOut" value="${manifestDir}" />
+ <global id="srcOut" value="${srcDir}/${slashedPackageName(packageName)}" />
+ <global id="resOut" value="${resDir}" />
+ <global id="simpleName" value="${activityToLayout(activityClass)}" />
+ <global id="relativePackage" value="<#if relativePackage?has_content>${relativePackage}<#else>${packageName}</#if>" />
+</globals>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/recipe.xml.ftl
new file mode 100644
index 0000000..bdc8a19
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/recipe.xml.ftl
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<recipe>
+ <dependency mavenUrl="com.android.support:support-v4:19.+" />
+
+ <merge from="AndroidManifest.xml.ftl"
+ to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />
+
+ <merge from="res/values/attrs.xml"
+ to="${escapeXmlAttribute(resOut)}/values/attrs.xml" />
+ <merge from="res/values/colors.xml"
+ to="${escapeXmlAttribute(resOut)}/values/colors.xml" />
+ <merge from="res/values/styles.xml"
+ to="${escapeXmlAttribute(resOut)}/values/styles.xml" />
+ <merge from="res/values-v11/styles.xml"
+ to="${escapeXmlAttribute(resOut)}/values-v11/styles.xml" />
+ <instantiate from="res/layout/activity_fullscreen.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml" />
+
+ <merge from="res/values/strings.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values/strings.xml" />
+
+ <instantiate from="src/app_package/FullscreenActivity.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />
+ <instantiate from="src/app_package/util/SystemUiHider.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/util/SystemUiHider.java" />
+ <instantiate from="src/app_package/util/SystemUiHiderBase.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/util/SystemUiHiderBase.java" />
+ <instantiate from="src/app_package/util/SystemUiHiderHoneycomb.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/util/SystemUiHiderHoneycomb.java" />
+
+ <open file="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml" />
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/AndroidManifest.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/AndroidManifest.xml.ftl
new file mode 100644
index 0000000..4c5b799
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/AndroidManifest.xml.ftl
@@ -0,0 +1,26 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <application>
+ <activity android:name="${relativePackage}.${activityClass}"
+ <#if isNewProject>
+ android:label="@string/app_name"
+ <#else>
+ android:label="@string/title_${simpleName}"
+ </#if>
+ android:configChanges="orientation|keyboardHidden|screenSize"
+ android:theme="@style/FullscreenTheme"
+ <#if buildApi gte 16 && parentActivityClass != "">android:parentActivityName="${parentActivityClass}"</#if>>
+ <#if parentActivityClass != "">
+ <meta-data android:name="android.support.PARENT_ACTIVITY"
+ android:value="${parentActivityClass}" />
+ </#if>
+ <#if isLauncher>
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </#if>
+ </activity>
+ </application>
+
+</manifest>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/res/layout/activity_fullscreen.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/res/layout/activity_fullscreen.xml.ftl
new file mode 100644
index 0000000..31e0bf7
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/res/layout/activity_fullscreen.xml.ftl
@@ -0,0 +1,46 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="#0099cc"
+ tools:context="${relativePackage}.${activityClass}">
+
+ <!-- The primary full-screen view. This can be replaced with whatever view
+ is needed to present your content, e.g. VideoView, SurfaceView,
+ TextureView, etc. -->
+ <TextView android:id="@+id/fullscreen_content"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:keepScreenOn="true"
+ android:textColor="#33b5e5"
+ android:textStyle="bold"
+ android:textSize="50sp"
+ android:gravity="center"
+ android:text="@string/dummy_content" />
+
+ <!-- This FrameLayout insets its children based on system windows using
+ android:fitsSystemWindows. -->
+ <FrameLayout android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:fitsSystemWindows="true">
+
+ <LinearLayout android:id="@+id/fullscreen_content_controls"
+ style="?metaButtonBarStyle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom|center_horizontal"
+ android:background="@color/black_overlay"
+ android:orientation="horizontal"
+ tools:ignore="UselessParent">
+
+ <Button android:id="@+id/dummy_button"
+ style="?metaButtonBarButtonStyle"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="@string/dummy_button" />
+
+ </LinearLayout>
+ </FrameLayout>
+
+</FrameLayout>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/res/values-v11/styles.xml b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/res/values-v11/styles.xml
new file mode 100644
index 0000000..f72515d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/res/values-v11/styles.xml
@@ -0,0 +1,15 @@
+<resources>
+
+ <style name="FullscreenTheme" parent="android:Theme.Holo">
+ <item name="android:actionBarStyle">@style/FullscreenActionBarStyle</item>
+ <item name="android:windowActionBarOverlay">true</item>
+ <item name="android:windowBackground">@null</item>
+ <item name="metaButtonBarStyle">?android:attr/buttonBarStyle</item>
+ <item name="metaButtonBarButtonStyle">?android:attr/buttonBarButtonStyle</item>
+ </style>
+
+ <style name="FullscreenActionBarStyle" parent="android:Widget.Holo.ActionBar">
+ <item name="android:background">@color/black_overlay</item>
+ </style>
+
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/res/values/attrs.xml b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/res/values/attrs.xml
new file mode 100644
index 0000000..7ce840e
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/res/values/attrs.xml
@@ -0,0 +1,12 @@
+<resources>
+
+ <!-- Declare custom theme attributes that allow changing which styles are
+ used for button bars depending on the API level.
+ ?android:attr/buttonBarStyle is new as of API 11 so this is
+ necessary to support previous API levels. -->
+ <declare-styleable name="ButtonBarContainerTheme">
+ <attr name="metaButtonBarStyle" format="reference" />
+ <attr name="metaButtonBarButtonStyle" format="reference" />
+ </declare-styleable>
+
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/res/values/colors.xml b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/res/values/colors.xml
new file mode 100644
index 0000000..327c060
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/res/values/colors.xml
@@ -0,0 +1,5 @@
+<resources>
+
+ <color name="black_overlay">#66000000</color>
+
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/res/values/strings.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/res/values/strings.xml.ftl
new file mode 100644
index 0000000..00043bd
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/res/values/strings.xml.ftl
@@ -0,0 +1,9 @@
+<resources>
+
+ <#if !isNewProject>
+ <string name="title_${simpleName}">${escapeXmlString(activityTitle)}</string>
+ </#if>
+ <string name="dummy_button">Dummy Button</string>
+ <string name="dummy_content">DUMMY\nCONTENT</string>
+
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/res/values/styles.xml b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/res/values/styles.xml
new file mode 100644
index 0000000..e95ba03
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/res/values/styles.xml
@@ -0,0 +1,22 @@
+<resources>
+
+ <style name="FullscreenTheme" parent="android:Theme.NoTitleBar">
+ <item name="android:windowContentOverlay">@null</item>
+ <item name="android:windowBackground">@null</item>
+ <item name="metaButtonBarStyle">@style/ButtonBar</item>
+ <item name="metaButtonBarButtonStyle">@style/ButtonBarButton</item>
+ </style>
+
+ <!-- Backward-compatible version of ?android:attr/buttonBarStyle -->
+ <style name="ButtonBar">
+ <item name="android:paddingLeft">2dp</item>
+ <item name="android:paddingTop">5dp</item>
+ <item name="android:paddingRight">2dp</item>
+ <item name="android:paddingBottom">0dp</item>
+ <item name="android:background">@android:drawable/bottom_bar</item>
+ </style>
+
+ <!-- Backward-compatible version of ?android:attr/buttonBarButtonStyle -->
+ <style name="ButtonBarButton" />
+
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/src/app_package/FullscreenActivity.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/src/app_package/FullscreenActivity.java.ftl
new file mode 100644
index 0000000..d8db3c2
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/src/app_package/FullscreenActivity.java.ftl
@@ -0,0 +1,198 @@
+package ${packageName};
+
+import ${packageName}.util.SystemUiHider;
+
+import android.annotation.TargetApi;
+import android.app.Activity;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Handler;
+import android.view.MotionEvent;
+import android.view.View;
+<#if parentActivityClass != "">
+import android.view.MenuItem;
+import android.support.v4.app.NavUtils;
+</#if>
+<#if applicationPackage??>import ${applicationPackage}.R;</#if>
+
+/**
+ * An example full-screen activity that shows and hides the system UI (i.e.
+ * status bar and navigation/system bar) with user interaction.
+ *
+ * @see SystemUiHider
+ */
+public class ${activityClass} extends Activity {
+ /**
+ * Whether or not the system UI should be auto-hidden after
+ * {@link #AUTO_HIDE_DELAY_MILLIS} milliseconds.
+ */
+ private static final boolean AUTO_HIDE = true;
+
+ /**
+ * If {@link #AUTO_HIDE} is set, the number of milliseconds to wait after
+ * user interaction before hiding the system UI.
+ */
+ private static final int AUTO_HIDE_DELAY_MILLIS = 3000;
+
+ /**
+ * If set, will toggle the system UI visibility upon interaction. Otherwise,
+ * will show the system UI visibility upon interaction.
+ */
+ private static final boolean TOGGLE_ON_CLICK = true;
+
+ /**
+ * The flags to pass to {@link SystemUiHider#getInstance}.
+ */
+ private static final int HIDER_FLAGS = SystemUiHider.FLAG_HIDE_NAVIGATION;
+
+ /**
+ * The instance of the {@link SystemUiHider} for this activity.
+ */
+ private SystemUiHider mSystemUiHider;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ setContentView(R.layout.${layoutName});
+ <#if parentActivityClass != "">
+ setupActionBar();
+ </#if>
+
+ final View controlsView = findViewById(R.id.fullscreen_content_controls);
+ final View contentView = findViewById(R.id.fullscreen_content);
+
+ // Set up an instance of SystemUiHider to control the system UI for
+ // this activity.
+ mSystemUiHider = SystemUiHider.getInstance(this, contentView, HIDER_FLAGS);
+ mSystemUiHider.setup();
+ mSystemUiHider
+ .setOnVisibilityChangeListener(new SystemUiHider.OnVisibilityChangeListener() {
+ // Cached values.
+ int mControlsHeight;
+ int mShortAnimTime;
+
+ @Override
+ @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
+ public void onVisibilityChange(boolean visible) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
+ // If the ViewPropertyAnimator API is available
+ // (Honeycomb MR2 and later), use it to animate the
+ // in-layout UI controls at the bottom of the
+ // screen.
+ if (mControlsHeight == 0) {
+ mControlsHeight = controlsView.getHeight();
+ }
+ if (mShortAnimTime == 0) {
+ mShortAnimTime = getResources().getInteger(
+ android.R.integer.config_shortAnimTime);
+ }
+ controlsView.animate()
+ .translationY(visible ? 0 : mControlsHeight)
+ .setDuration(mShortAnimTime);
+ } else {
+ // If the ViewPropertyAnimator APIs aren't
+ // available, simply show or hide the in-layout UI
+ // controls.
+ controlsView.setVisibility(visible ? View.VISIBLE : View.GONE);
+ }
+
+ if (visible && AUTO_HIDE) {
+ // Schedule a hide().
+ delayedHide(AUTO_HIDE_DELAY_MILLIS);
+ }
+ }
+ });
+
+ // Set up the user interaction to manually show or hide the system UI.
+ contentView.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ if (TOGGLE_ON_CLICK) {
+ mSystemUiHider.toggle();
+ } else {
+ mSystemUiHider.show();
+ }
+ }
+ });
+
+ // Upon interacting with UI controls, delay any scheduled hide()
+ // operations to prevent the jarring behavior of controls going away
+ // while interacting with the UI.
+ findViewById(R.id.dummy_button).setOnTouchListener(mDelayHideTouchListener);
+ }
+
+ @Override
+ protected void onPostCreate(Bundle savedInstanceState) {
+ super.onPostCreate(savedInstanceState);
+
+ // Trigger the initial hide() shortly after the activity has been
+ // created, to briefly hint to the user that UI controls
+ // are available.
+ delayedHide(100);
+ }
+
+ <#if parentActivityClass != "">
+ /**
+ * Set up the {@link android.app.ActionBar}, if the API is available.
+ */
+ @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+ private void setupActionBar() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+ // Show the Up button in the action bar.
+ getActionBar().setDisplayHomeAsUpEnabled(true);
+ }
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ int id = item.getItemId();
+ if (id == android.R.id.home) {
+ // This ID represents the Home or Up button. In the case of this
+ // activity, the Up button is shown. Use NavUtils to allow users
+ // to navigate up one level in the application structure. For
+ // more details, see the Navigation pattern on Android Design:
+ //
+ // http://developer.android.com/design/patterns/navigation.html#up-vs-back
+ //
+ // TODO: If Settings has multiple levels, Up should navigate up
+ // that hierarchy.
+ NavUtils.navigateUpFromSameTask(this);
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+ </#if>
+
+ /**
+ * Touch listener to use for in-layout UI controls to delay hiding the
+ * system UI. This is to prevent the jarring behavior of controls going away
+ * while interacting with activity UI.
+ */
+ View.OnTouchListener mDelayHideTouchListener = new View.OnTouchListener() {
+ @Override
+ public boolean onTouch(View view, MotionEvent motionEvent) {
+ if (AUTO_HIDE) {
+ delayedHide(AUTO_HIDE_DELAY_MILLIS);
+ }
+ return false;
+ }
+ };
+
+ Handler mHideHandler = new Handler();
+ Runnable mHideRunnable = new Runnable() {
+ @Override
+ public void run() {
+ mSystemUiHider.hide();
+ }
+ };
+
+ /**
+ * Schedules a call to hide() in [delay] milliseconds, canceling any
+ * previously scheduled calls.
+ */
+ private void delayedHide(int delayMillis) {
+ mHideHandler.removeCallbacks(mHideRunnable);
+ mHideHandler.postDelayed(mHideRunnable, delayMillis);
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/src/app_package/util/SystemUiHider.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/src/app_package/util/SystemUiHider.java.ftl
new file mode 100644
index 0000000..28efb77
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/src/app_package/util/SystemUiHider.java.ftl
@@ -0,0 +1,172 @@
+package ${packageName}.util;
+
+import android.app.Activity;
+import android.os.Build;
+import android.view.View;
+
+/**
+ * A utility class that helps with showing and hiding system UI such as the
+ * status bar and navigation/system bar. This class uses backward-compatibility
+ * techniques described in <a href=
+ * "http://developer.android.com/training/backward-compatible-ui/index.html">
+ * Creating Backward-Compatible UIs</a> to ensure that devices running any
+ * version of ndroid OS are supported. More specifically, there are separate
+ * implementations of this abstract class: for newer devices,
+ * {@link #getInstance} will return a {@link SystemUiHiderHoneycomb} instance,
+ * while on older devices {@link #getInstance} will return a
+ * {@link SystemUiHiderBase} instance.
+ * <p>
+ * For more on system bars, see <a href=
+ * "http://developer.android.com/design/get-started/ui-overview.html#system-bars"
+ * > System Bars</a>.
+ *
+ * @see android.view.View#setSystemUiVisibility(int)
+ * @see android.view.WindowManager.LayoutParams#FLAG_FULLSCREEN
+ */
+public abstract class SystemUiHider {
+ /**
+ * When this flag is set, the
+ * {@link android.view.WindowManager.LayoutParams#FLAG_LAYOUT_IN_SCREEN}
+ * flag will be set on older devices, making the status bar "float" on top
+ * of the activity layout. This is most useful when there are no controls at
+ * the top of the activity layout.
+ * <p>
+ * This flag isn't used on newer devices because the <a
+ * href="http://developer.android.com/design/patterns/actionbar.html">action
+ * bar</a>, the most important structural element of an Android app, should
+ * be visible and not obscured by the system UI.
+ */
+ public static final int FLAG_LAYOUT_IN_SCREEN_OLDER_DEVICES = 0x1;
+
+ /**
+ * When this flag is set, {@link #show()} and {@link #hide()} will toggle
+ * the visibility of the status bar. If there is a navigation bar, show and
+ * hide will toggle low profile mode.
+ */
+ public static final int FLAG_FULLSCREEN = 0x2;
+
+ /**
+ * When this flag is set, {@link #show()} and {@link #hide()} will toggle
+ * the visibility of the navigation bar, if it's present on the device and
+ * the device allows hiding it. In cases where the navigation bar is present
+ * but cannot be hidden, show and hide will toggle low profile mode.
+ */
+ public static final int FLAG_HIDE_NAVIGATION = FLAG_FULLSCREEN | 0x4;
+
+ /**
+ * The activity associated with this UI hider object.
+ */
+ protected Activity mActivity;
+
+ /**
+ * The view on which {@link View#setSystemUiVisibility(int)} will be called.
+ */
+ protected View mAnchorView;
+
+ /**
+ * The current UI hider flags.
+ *
+ * @see #FLAG_FULLSCREEN
+ * @see #FLAG_HIDE_NAVIGATION
+ * @see #FLAG_LAYOUT_IN_SCREEN_OLDER_DEVICES
+ */
+ protected int mFlags;
+
+ /**
+ * The current visibility callback.
+ */
+ protected OnVisibilityChangeListener mOnVisibilityChangeListener = sDummyListener;
+
+ /**
+ * Creates and returns an instance of {@link SystemUiHider} that is
+ * appropriate for this device. The object will be either a
+ * {@link SystemUiHiderBase} or {@link SystemUiHiderHoneycomb} depending on
+ * the device.
+ *
+ * @param activity The activity whose window's system UI should be
+ * controlled by this class.
+ * @param anchorView The view on which
+ * {@link View#setSystemUiVisibility(int)} will be called.
+ * @param flags Either 0 or any combination of {@link #FLAG_FULLSCREEN},
+ * {@link #FLAG_HIDE_NAVIGATION}, and
+ * {@link #FLAG_LAYOUT_IN_SCREEN_OLDER_DEVICES}.
+ */
+ public static SystemUiHider getInstance(Activity activity, View anchorView, int flags) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+ return new SystemUiHiderHoneycomb(activity, anchorView, flags);
+ } else {
+ return new SystemUiHiderBase(activity, anchorView, flags);
+ }
+ }
+
+ protected SystemUiHider(Activity activity, View anchorView, int flags) {
+ mActivity = activity;
+ mAnchorView = anchorView;
+ mFlags = flags;
+ }
+
+ /**
+ * Sets up the system UI hider. Should be called from
+ * {@link Activity#onCreate}.
+ */
+ public abstract void setup();
+
+ /**
+ * Returns whether or not the system UI is visible.
+ */
+ public abstract boolean isVisible();
+
+ /**
+ * Hide the system UI.
+ */
+ public abstract void hide();
+
+ /**
+ * Show the system UI.
+ */
+ public abstract void show();
+
+ /**
+ * Toggle the visibility of the system UI.
+ */
+ public void toggle() {
+ if (isVisible()) {
+ hide();
+ } else {
+ show();
+ }
+ }
+
+ /**
+ * Registers a callback, to be triggered when the system UI visibility
+ * changes.
+ */
+ public void setOnVisibilityChangeListener(OnVisibilityChangeListener listener) {
+ if (listener == null) {
+ listener = sDummyListener;
+ }
+
+ mOnVisibilityChangeListener = listener;
+ }
+
+ /**
+ * A dummy no-op callback for use when there is no other listener set.
+ */
+ private static OnVisibilityChangeListener sDummyListener = new OnVisibilityChangeListener() {
+ @Override
+ public void onVisibilityChange(boolean visible) {
+ }
+ };
+
+ /**
+ * A callback interface used to listen for system UI visibility changes.
+ */
+ public interface OnVisibilityChangeListener {
+ /**
+ * Called when the system UI visibility has changed.
+ *
+ * @param visible True if the system UI is visible.
+ */
+ public void onVisibilityChange(boolean visible);
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/src/app_package/util/SystemUiHiderBase.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/src/app_package/util/SystemUiHiderBase.java.ftl
new file mode 100644
index 0000000..da08842
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/src/app_package/util/SystemUiHiderBase.java.ftl
@@ -0,0 +1,63 @@
+package ${packageName}.util;
+
+import android.app.Activity;
+import android.view.View;
+import android.view.WindowManager;
+
+/**
+ * A base implementation of {@link SystemUiHider}. Uses APIs available in all
+ * API levels to show and hide the status bar.
+ */
+public class SystemUiHiderBase extends SystemUiHider {
+ /**
+ * Whether or not the system UI is currently visible. This is a cached value
+ * from calls to {@link #hide()} and {@link #show()}.
+ */
+ private boolean mVisible = true;
+
+ /**
+ * Constructor not intended to be called by clients. Use
+ * {@link SystemUiHider#getInstance} to obtain an instance.
+ */
+ protected SystemUiHiderBase(Activity activity, View anchorView, int flags) {
+ super(activity, anchorView, flags);
+ }
+
+ @Override
+ public void setup() {
+ if ((mFlags & FLAG_LAYOUT_IN_SCREEN_OLDER_DEVICES) == 0) {
+ mActivity.getWindow().setFlags(
+ WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+ | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
+ WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
+ | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
+ }
+ }
+
+ @Override
+ public boolean isVisible() {
+ return mVisible;
+ }
+
+ @Override
+ public void hide() {
+ if ((mFlags & FLAG_FULLSCREEN) != 0) {
+ mActivity.getWindow().setFlags(
+ WindowManager.LayoutParams.FLAG_FULLSCREEN,
+ WindowManager.LayoutParams.FLAG_FULLSCREEN);
+ }
+ mOnVisibilityChangeListener.onVisibilityChange(false);
+ mVisible = false;
+ }
+
+ @Override
+ public void show() {
+ if ((mFlags & FLAG_FULLSCREEN) != 0) {
+ mActivity.getWindow().setFlags(
+ 0,
+ WindowManager.LayoutParams.FLAG_FULLSCREEN);
+ }
+ mOnVisibilityChangeListener.onVisibilityChange(true);
+ mVisible = true;
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/src/app_package/util/SystemUiHiderHoneycomb.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/src/app_package/util/SystemUiHiderHoneycomb.java.ftl
new file mode 100644
index 0000000..2e2d8a9
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/root/src/app_package/util/SystemUiHiderHoneycomb.java.ftl
@@ -0,0 +1,133 @@
+package ${packageName}.util;
+
+import android.annotation.TargetApi;
+import android.app.Activity;
+import android.os.Build;
+import android.view.View;
+import android.view.WindowManager;
+
+/**
+ * An API 11+ implementation of {@link SystemUiHider}. Uses APIs available in
+ * Honeycomb and later (specifically {@link View#setSystemUiVisibility(int)}) to
+ * show and hide the system UI.
+ */
+@TargetApi(Build.VERSION_CODES.HONEYCOMB)
+public class SystemUiHiderHoneycomb extends SystemUiHiderBase {
+ /**
+ * Flags for {@link View#setSystemUiVisibility(int)} to use when showing the
+ * system UI.
+ */
+ private int mShowFlags;
+
+ /**
+ * Flags for {@link View#setSystemUiVisibility(int)} to use when hiding the
+ * system UI.
+ */
+ private int mHideFlags;
+
+ /**
+ * Flags to test against the first parameter in
+ * {@link android.view.View.OnSystemUiVisibilityChangeListener#onSystemUiVisibilityChange(int)}
+ * to determine the system UI visibility state.
+ */
+ private int mTestFlags;
+
+ /**
+ * Whether or not the system UI is currently visible. This is cached from
+ * {@link android.view.View.OnSystemUiVisibilityChangeListener}.
+ */
+ private boolean mVisible = true;
+
+ /**
+ * Constructor not intended to be called by clients. Use
+ * {@link SystemUiHider#getInstance} to obtain an instance.
+ */
+ protected SystemUiHiderHoneycomb(Activity activity, View anchorView, int flags) {
+ super(activity, anchorView, flags);
+
+ mShowFlags = View.SYSTEM_UI_FLAG_VISIBLE;
+ mHideFlags = View.SYSTEM_UI_FLAG_LOW_PROFILE;
+ mTestFlags = View.SYSTEM_UI_FLAG_LOW_PROFILE;
+
+ if ((mFlags & FLAG_FULLSCREEN) != 0) {
+ // If the client requested fullscreen, add flags relevant to hiding
+ // the status bar. Note that some of these constants are new as of
+ // API 16 (Jelly Bean). It is safe to use them, as they are inlined
+ // at compile-time and do nothing on pre-Jelly Bean devices.
+ mShowFlags |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
+ mHideFlags |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+ | View.SYSTEM_UI_FLAG_FULLSCREEN;
+ }
+
+ if ((mFlags & FLAG_HIDE_NAVIGATION) != 0) {
+ // If the client requested hiding navigation, add relevant flags.
+ mShowFlags |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
+ mHideFlags |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+ | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
+ mTestFlags |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
+ }
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public void setup() {
+ mAnchorView.setOnSystemUiVisibilityChangeListener(mSystemUiVisibilityChangeListener);
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public void hide() {
+ mAnchorView.setSystemUiVisibility(mHideFlags);
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public void show() {
+ mAnchorView.setSystemUiVisibility(mShowFlags);
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public boolean isVisible() {
+ return mVisible;
+ }
+
+ private View.OnSystemUiVisibilityChangeListener mSystemUiVisibilityChangeListener
+ = new View.OnSystemUiVisibilityChangeListener() {
+ @Override
+ public void onSystemUiVisibilityChange(int vis) {
+ // Test against mTestFlags to see if the system UI is visible.
+ if ((vis & mTestFlags) != 0) {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
+ // Pre-Jelly Bean, we must manually hide the action bar
+ // and use the old window flags API.
+ mActivity.getActionBar().hide();
+ mActivity.getWindow().setFlags(
+ WindowManager.LayoutParams.FLAG_FULLSCREEN,
+ WindowManager.LayoutParams.FLAG_FULLSCREEN);
+ }
+
+ // Trigger the registered listener and cache the visibility
+ // state.
+ mOnVisibilityChangeListener.onVisibilityChange(false);
+ mVisible = false;
+
+ } else {
+ mAnchorView.setSystemUiVisibility(mShowFlags);
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
+ // Pre-Jelly Bean, we must manually show the action bar
+ // and use the old window flags API.
+ mActivity.getActionBar().show();
+ mActivity.getWindow().setFlags(
+ 0,
+ WindowManager.LayoutParams.FLAG_FULLSCREEN);
+ }
+
+ // Trigger the registered listener and cache the visibility
+ // state.
+ mOnVisibilityChangeListener.onVisibilityChange(true);
+ mVisible = true;
+ }
+ }
+ };
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/template.xml
new file mode 100644
index 0000000..996fc6d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/template.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0"?>
+<template
+ format="4"
+ revision="4"
+ name="Fullscreen Activity"
+ description="Creates a new activity that toggles the visibility of the system UI (status and navigation bars) and action bar upon user interaction."
+ minApi="4"
+ minBuildApi="16">
+ <dependency name="android-support-v4" revision="8" />
+ <category value="Activity" />
+ <formfactor value="Mobile" />
+
+ <parameter
+ id="activityClass"
+ name="Activity Name"
+ type="string"
+ constraints="class|unique|nonempty"
+ default="FullscreenActivity"
+ help="The name of the activity class to create" />
+
+ <parameter
+ id="layoutName"
+ name="Layout Name"
+ type="string"
+ constraints="layout|unique|nonempty"
+ suggest="${activityToLayout(activityClass)}"
+ default="activity_fullscreen"
+ help="The name of the layout to create for the activity" />
+
+ <parameter
+ id="activityTitle"
+ name="Title"
+ type="string"
+ constraints="nonempty"
+ default="FullscreenActivity"
+ suggest="${activityClass}"
+ help="The name of the activity." />
+
+ <parameter
+ id="isLauncher"
+ name="Launcher Activity"
+ type="boolean"
+ default="false"
+ help="If true, this activity will have a CATEGORY_LAUNCHER intent filter, making it visible in the launcher" />
+
+ <parameter
+ id="parentActivityClass"
+ name="Hierarchical Parent"
+ type="string"
+ constraints="activity|exists|empty"
+ default=""
+ help="The hierarchical parent activity, used to provide a default implementation for the 'Up' button" />
+
+ <parameter
+ id="packageName"
+ name="Package name"
+ type="string"
+ constraints="package"
+ default="com.mycompany.myapp" />
+
+ <thumbs>
+ <thumb>template_fullscreen_activity.png</thumb>
+ </thumbs>
+
+ <globals file="globals.xml.ftl" />
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/template_fullscreen_activity.png b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/template_fullscreen_activity.png
new file mode 100644
index 0000000..a8597b2
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/FullscreenActivity/template_fullscreen_activity.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/globals.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/globals.xml.ftl
new file mode 100644
index 0000000..eafa59c
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/globals.xml.ftl
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<globals>
+ <global id="projectOut" value="." />
+ <global id="manifestOut" value="${manifestDir}" />
+ <global id="srcOut" value="${srcDir}/${slashedPackageName(packageName)}" />
+ <global id="resOut" value="${resDir}" />
+ <global id="menuName" value="${classToResource(activityClass)}" />
+ <global id="simpleName" value="${activityToLayout(activityClass)}" />
+ <global id="relativePackage" value="<#if relativePackage?has_content>${relativePackage}<#else>${packageName}</#if>" />
+</globals>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/recipe.xml.ftl
new file mode 100644
index 0000000..43198a0
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/recipe.xml.ftl
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<recipe>
+ <dependency mavenUrl="com.google.android.gms:play-services:4.2.42" />
+ <dependency mavenUrl="com.android.support:appcompat-v7:19.+" />
+
+ <merge from="AndroidManifest.xml.ftl"
+ to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />
+
+ <merge from="res/values/dimens.xml"
+ to="${escapeXmlAttribute(resOut)}/values/dimens.xml" />
+
+ <instantiate from="res/layout/activity_login.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml" />
+
+ <instantiate from="res/values/strings.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values/strings_${simpleName}.xml" />
+
+ <instantiate from="src/app_package/LoginActivity.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />
+
+ <#if includeGooglePlus>
+ <instantiate from="src/app_package/PlusBaseActivity.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/PlusBaseActivity.java" />
+ </#if>
+
+ <open file="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />
+
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/root/AndroidManifest.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/root/AndroidManifest.xml.ftl
new file mode 100644
index 0000000..a206ed4
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/root/AndroidManifest.xml.ftl
@@ -0,0 +1,37 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" >
+<#if includeGooglePlus>
+ <!-- To access Google+ APIs: -->
+ <uses-permission android:name="android.permission.INTERNET" />
+
+ <!-- To retrieve OAuth 2.0 tokens or invalidate tokens to disconnect a user. This disconnect
+ option is required to comply with the Google+ Sign-In developer policies -->
+ <uses-permission android:name="android.permission.USE_CREDENTIALS" />
+
+ <!-- To retrieve the account name (email) as part of sign-in: -->
+ <uses-permission android:name="android.permission.GET_ACCOUNTS" /></#if>
+
+ <!-- To auto-complete the email text field in the login form with the user's emails --><#if !includeGooglePlus>
+ <uses-permission android:name="android.permission.GET_ACCOUNTS" /></#if>
+ <uses-permission android:name="android.permission.READ_PROFILE" />
+ <uses-permission android:name="android.permission.READ_CONTACTS" />
+
+ <application>
+ <activity android:name=".${activityClass}"
+ <#if isNewProject>
+ android:label="@string/app_name"
+ <#else>
+ android:label="@string/title_${simpleName}"
+ </#if>
+ android:windowSoftInputMode="adjustResize|<#if includeGooglePlus>stateHidden<#else>stateVisible</#if>"
+ <#if buildApi gte 16 && parentActivityClass != "">android:parentActivityName="${parentActivityClass}"</#if>>
+ <#if parentActivityClass != "">
+ <meta-data android:name="android.support.PARENT_ACTIVITY"
+ android:value="${parentActivityClass}" />
+ </#if>
+ </activity>
+<#if includeGooglePlus>
+ <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
+</#if>
+ </application>
+
+</manifest>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/root/res/layout/activity_login.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/root/res/layout/activity_login.xml.ftl
new file mode 100644
index 0000000..45143f5
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/root/res/layout/activity_login.xml.ftl
@@ -0,0 +1,108 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center_horizontal"
+ android:orientation="vertical"
+ android:paddingBottom="@dimen/activity_vertical_margin"
+ android:paddingLeft="@dimen/activity_horizontal_margin"
+ android:paddingRight="@dimen/activity_horizontal_margin"
+ android:paddingTop="@dimen/activity_vertical_margin"
+ tools:context="${relativePackage}.${activityClass}">
+
+ <!-- Login progress -->
+ <ProgressBar
+ android:id="@+id/login_progress"
+ style="?android:attr/progressBarStyleLarge"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="8dp"
+ android:visibility="gone"/>
+
+ <ScrollView
+ android:id="@+id/login_form"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ >
+<#if includeGooglePlus>
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <com.google.android.gms.common.SignInButton
+ android:id="@+id/plus_sign_in_button"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="32dp"/>
+
+ <LinearLayout
+ android:id="@+id/plus_sign_out_buttons"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:visibility="gone"
+ android:weightSum="2">
+
+ <Button
+ android:id="@+id/plus_sign_out_button"
+ style="?android:textAppearanceSmall"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:text="@string/plus_sign_out"/>
+
+ <Button
+ android:id="@+id/plus_disconnect_button"
+ style="?android:textAppearanceSmall"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:text="@string/plus_disconnect"/>
+
+ </LinearLayout>
+</#if>
+
+ <LinearLayout
+ android:id="@+id/email_login_form"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
+
+ <AutoCompleteTextView
+ android:id="@+id/email"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:hint="@string/prompt_email"
+ android:inputType="textEmailAddress"
+ android:maxLines="1"
+ android:singleLine="true"/>
+
+ <EditText
+ android:id="@+id/password"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:hint="@string/prompt_password"
+ android:imeActionId="@+id/login"
+ android:imeActionLabel="@string/action_sign_in_short"
+ android:imeOptions="actionUnspecified"
+ android:inputType="textPassword"
+ android:maxLines="1"
+ android:singleLine="true"/>
+
+ <Button
+ android:id="@+id/email_sign_in_button"
+ style="?android:textAppearanceSmall"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="16dp"
+ android:text="@string/action_sign_in"
+ android:textStyle="bold"/>
+
+ </LinearLayout>
+<#if includeGooglePlus>
+ </LinearLayout>
+</#if>
+ </ScrollView>
+
+</LinearLayout>
+
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/root/res/values/dimens.xml b/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/root/res/values/dimens.xml
new file mode 100644
index 0000000..47c8224
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/root/res/values/dimens.xml
@@ -0,0 +1,5 @@
+<resources>
+ <!-- Default screen margins, per the Android Design guidelines. -->
+ <dimen name="activity_horizontal_margin">16dp</dimen>
+ <dimen name="activity_vertical_margin">16dp</dimen>
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/root/res/values/strings.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/root/res/values/strings.xml.ftl
new file mode 100644
index 0000000..97c23b6
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/root/res/values/strings.xml.ftl
@@ -0,0 +1,17 @@
+<resources>
+ <#if !isNewProject>
+ <string name="title_${simpleName}">${escapeXmlString(activityTitle)}</string>
+ </#if>
+
+ <!-- Strings related to login -->
+ <string name="prompt_email">Email</string>
+ <string name="prompt_password">Password (optional)</string>
+ <string name="action_sign_in">Sign in or register</string>
+ <string name="action_sign_in_short">Sign in</string>
+<#if includeGooglePlus> <string name="plus_sign_out">Switch Google+ account</string>
+ <string name="plus_disconnect">Disconnect from Google+</string></#if>
+ <string name="error_invalid_email">This email address is invalid</string>
+ <string name="error_invalid_password">This password is too short</string>
+ <string name="error_incorrect_password">This password is incorrect</string>
+ <string name="error_field_required">This field is required</string>
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/root/src/app_package/LoginActivity.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/root/src/app_package/LoginActivity.java.ftl
new file mode 100644
index 0000000..0bcfb4b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/root/src/app_package/LoginActivity.java.ftl
@@ -0,0 +1,449 @@
+package ${packageName};
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.annotation.TargetApi;
+<#if !includeGooglePlus>import android.app.Activity;</#if>
+import android.app.LoaderManager.LoaderCallbacks;
+import android.content.ContentResolver;
+import android.content.CursorLoader;
+import android.content.Loader;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.AsyncTask;
+<#if minApiLevel lt 14>import android.os.Build.VERSION;</#if>
+import android.os.Build;
+import android.os.Bundle;
+import android.provider.ContactsContract;
+import android.text.TextUtils;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.inputmethod.EditorInfo;
+import android.widget.ArrayAdapter;
+import android.widget.AutoCompleteTextView;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TextView;
+<#if includeGooglePlus>
+import com.google.android.gms.common.ConnectionResult;
+import com.google.android.gms.common.GooglePlayServicesUtil;
+import com.google.android.gms.common.SignInButton;
+</#if>
+import java.util.ArrayList;
+import java.util.List;
+<#if applicationPackage??>import ${applicationPackage}.R;</#if>
+
+/**
+ * A login screen that offers login via email/password<#if includeGooglePlus> and via Google+ sign in</#if>.
+<#if includeGooglePlus> * <p/>
+ * ************ IMPORTANT SETUP NOTES: ************
+ * In order for Google+ sign in to work with your app, you must first go to:
+ * https://developers.google.com/+/mobile/android/getting-started#step_1_enable_the_google_api
+ * and follow the steps in "Step 1" to create an OAuth 2.0 client for your package.</#if>
+ */
+public class ${activityClass} extends <#if includeGooglePlus>PlusBase</#if>Activity implements LoaderCallbacks<Cursor>{
+
+ /**
+ * A dummy authentication store containing known user names and passwords.
+ * TODO: remove after connecting to a real authentication system.
+ */
+ private static final String[] DUMMY_CREDENTIALS = new String[]{
+ "foo@example.com:hello", "bar@example.com:world"
+ };
+ /**
+ * Keep track of the login task to ensure we can cancel it if requested.
+ */
+ private UserLoginTask mAuthTask = null;
+
+ // UI references.
+ private AutoCompleteTextView mEmailView;
+ private EditText mPasswordView;
+ private View mProgressView;<#if includeGooglePlus>
+ private View mEmailLoginFormView;
+ private SignInButton mPlusSignInButton;
+ private View mSignOutButtons;</#if>
+ private View mLoginFormView;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_login);
+<#if parentActivityClass != "">
+ setupActionBar();
+</#if>
+<#if includeGooglePlus>
+
+ // Find the Google+ sign in button.
+ mPlusSignInButton = (SignInButton) findViewById(R.id.plus_sign_in_button);
+ if (supportsGooglePlayServices()) {
+ // Set a listener to connect the user when the G+ button is clicked.
+ mPlusSignInButton.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ signIn();
+ }
+ });
+ } else {
+ // Don't offer G+ sign in if the app's version is too low to support Google Play
+ // Services.
+ mPlusSignInButton.setVisibility(View.GONE);
+ return;
+ }
+</#if>
+
+ // Set up the login form.
+ mEmailView = (AutoCompleteTextView) findViewById(R.id.email);
+ populateAutoComplete();
+
+ mPasswordView = (EditText) findViewById(R.id.password);
+ mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
+ @Override
+ public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
+ if (id == R.id.login || id == EditorInfo.IME_NULL) {
+ attemptLogin();
+ return true;
+ }
+ return false;
+ }
+ });
+
+ Button mEmailSignInButton = (Button) findViewById(R.id.email_sign_in_button);
+ mEmailSignInButton.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ attemptLogin();
+ }
+ });
+
+ mLoginFormView = findViewById(R.id.login_form);
+ mProgressView = findViewById(R.id.login_progress);<#if includeGooglePlus>
+ mEmailLoginFormView = findViewById(R.id.email_login_form);
+ mSignOutButtons = findViewById(R.id.plus_sign_out_buttons);</#if>
+ }
+
+ private void populateAutoComplete() {
+<#if minApiLevel gte 14>
+ getLoaderManager().initLoader(0, null, this);
+<#else>
+ if (VERSION.SDK_INT >= 14) {
+ // Use ContactsContract.Profile (API 14+)
+ getLoaderManager().initLoader(0, null, this);
+ } else if (VERSION.SDK_INT >= 8) {
+ // Use AccountManager (API 8+)
+ new SetupEmailAutoCompleteTask().execute(null, null);
+ }
+</#if>
+ }
+
+ <#if parentActivityClass != "">
+ /**
+ * Set up the {@link android.app.ActionBar}, if the API is available.
+ */
+ @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+ private void setupActionBar() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+ // Show the Up button in the action bar.
+ getActionBar().setDisplayHomeAsUpEnabled(true);
+ }
+ }
+ </#if>
+
+ /**
+ * Attempts to sign in or register the account specified by the login form.
+ * If there are form errors (invalid email, missing fields, etc.), the
+ * errors are presented and no actual login attempt is made.
+ */
+ public void attemptLogin() {
+ if (mAuthTask != null) {
+ return;
+ }
+
+ // Reset errors.
+ mEmailView.setError(null);
+ mPasswordView.setError(null);
+
+ // Store values at the time of the login attempt.
+ String email = mEmailView.getText().toString();
+ String password = mPasswordView.getText().toString();
+
+ boolean cancel = false;
+ View focusView = null;
+
+ // Check for a valid password, if the user entered one.
+ if (!TextUtils.isEmpty(password) && !isPasswordValid(password)) {
+ mPasswordView.setError(getString(R.string.error_invalid_password));
+ focusView = mPasswordView;
+ cancel = true;
+ }
+
+ // Check for a valid email address.
+ if (TextUtils.isEmpty(email)) {
+ mEmailView.setError(getString(R.string.error_field_required));
+ focusView = mEmailView;
+ cancel = true;
+ } else if (!isEmailValid(email)) {
+ mEmailView.setError(getString(R.string.error_invalid_email));
+ focusView = mEmailView;
+ cancel = true;
+ }
+
+ if (cancel) {
+ // There was an error; don't attempt login and focus the first
+ // form field with an error.
+ focusView.requestFocus();
+ } else {
+ // Show a progress spinner, and kick off a background task to
+ // perform the user login attempt.
+ showProgress(true);
+ mAuthTask = new UserLoginTask(email, password);
+ mAuthTask.execute((Void) null);
+ }
+ }
+ private boolean isEmailValid(String email) {
+ //TODO: Replace this with your own logic
+ return email.contains("@");
+ }
+
+ private boolean isPasswordValid(String password) {
+ //TODO: Replace this with your own logic
+ return password.length() > 4;
+ }
+
+ /**
+ * Shows the progress UI and hides the login form.
+ */
+ @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
+ public void showProgress(final boolean show) {
+ // On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow
+ // for very easy animations. If available, use these APIs to fade-in
+ // the progress spinner.
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
+ int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime);
+
+ mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
+ mLoginFormView.animate().setDuration(shortAnimTime).alpha(
+ show ? 0 : 1).setListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
+ }
+ });
+
+ mProgressView.setVisibility(show ? View.VISIBLE : View.GONE);
+ mProgressView.animate().setDuration(shortAnimTime).alpha(
+ show ? 1 : 0).setListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mProgressView.setVisibility(show ? View.VISIBLE : View.GONE);
+ }
+ });
+ } else {
+ // The ViewPropertyAnimator APIs are not available, so simply show
+ // and hide the relevant UI components.
+ mProgressView.setVisibility(show ? View.VISIBLE : View.GONE);
+ mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
+ }
+ }
+<#if includeGooglePlus>
+
+ @Override
+ protected void onPlusClientSignIn() {
+ //Set up sign out and disconnect buttons.
+ Button signOutButton = (Button) findViewById(R.id.plus_sign_out_button);
+ signOutButton.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ signOut();
+ }
+ });
+ Button disconnectButton = (Button) findViewById(R.id.plus_disconnect_button);
+ disconnectButton.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ revokeAccess();
+ }
+ });
+ }
+
+ @Override
+ protected void onPlusClientBlockingUI(boolean show) {
+ showProgress(show);
+ }
+
+ @Override
+ protected void updateConnectButtonState() {
+ //TODO: Update this logic to also handle the user logged in by email.
+ boolean connected = getPlusClient().isConnected();
+
+ mSignOutButtons.setVisibility(connected ? View.VISIBLE : View.GONE);
+ mPlusSignInButton.setVisibility(connected ? View.GONE : View.VISIBLE);
+ mEmailLoginFormView.setVisibility(connected ? View.GONE : View.VISIBLE);
+ }
+
+ @Override
+ protected void onPlusClientRevokeAccess() {
+ // TODO: Access to the user's G+ account has been revoked. Per the developer terms, delete
+ // any stored user data here.
+ }
+
+ @Override
+ protected void onPlusClientSignOut() {
+
+ }
+
+ /**
+ * Check if the device supports Google Play Services. It's best
+ * practice to check first rather than handling this as an error case.
+ *
+ * @return whether the device supports Google Play Services
+ */
+ private boolean supportsGooglePlayServices() {
+ return GooglePlayServicesUtil.isGooglePlayServicesAvailable(this) ==
+ ConnectionResult.SUCCESS;
+ }
+</#if>
+
+ @Override
+ public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
+ return new CursorLoader(this,
+ // Retrieve data rows for the device user's 'profile' contact.
+ Uri.withAppendedPath(ContactsContract.Profile.CONTENT_URI,
+ ContactsContract.Contacts.Data.CONTENT_DIRECTORY), ProfileQuery.PROJECTION,
+
+ // Select only email addresses.
+ ContactsContract.Contacts.Data.MIMETYPE +
+ " = ?", new String[]{ContactsContract.CommonDataKinds.Email
+ .CONTENT_ITEM_TYPE},
+
+ // Show primary email addresses first. Note that there won't be
+ // a primary email address if the user hasn't specified one.
+ ContactsContract.Contacts.Data.IS_PRIMARY + " DESC");
+ }
+
+ @Override
+ public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
+ List<String> emails = new ArrayList<String>();
+ cursor.moveToFirst();
+ while (!cursor.isAfterLast()) {
+ emails.add(cursor.getString(ProfileQuery.ADDRESS));
+ cursor.moveToNext();
+ }
+
+ addEmailsToAutoComplete(emails);
+ }
+
+ @Override
+ public void onLoaderReset(Loader<Cursor> cursorLoader) {
+
+ }
+
+ private interface ProfileQuery {
+ String[] PROJECTION = {
+ ContactsContract.CommonDataKinds.Email.ADDRESS,
+ ContactsContract.CommonDataKinds.Email.IS_PRIMARY,
+ };
+
+ int ADDRESS = 0;
+ int IS_PRIMARY = 1;
+ }
+
+<#if minApiLevel lt 14>
+ /**
+ * Use an AsyncTask to fetch the user's email addresses on a background thread, and update
+ * the email text field with results on the main UI thread.
+ */
+ class SetupEmailAutoCompleteTask extends AsyncTask<Void, Void, List<String>> {
+
+ @Override
+ protected List<String> doInBackground(Void... voids) {
+ ArrayList<String> emailAddressCollection = new ArrayList<String>();
+
+ // Get all emails from the user's contacts and copy them to a list.
+ ContentResolver cr = getContentResolver();
+ Cursor emailCur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,
+ null, null, null);
+ while (emailCur.moveToNext()) {
+ String email = emailCur.getString(emailCur.getColumnIndex(ContactsContract
+ .CommonDataKinds.Email.DATA));
+ emailAddressCollection.add(email);
+ }
+ emailCur.close();
+
+ return emailAddressCollection;
+ }
+
+ @Override
+ protected void onPostExecute(List<String> emailAddressCollection) {
+ addEmailsToAutoComplete(emailAddressCollection);
+ }
+ }
+</#if>
+
+ private void addEmailsToAutoComplete(List<String> emailAddressCollection) {
+ //Create adapter to tell the AutoCompleteTextView what to show in its dropdown list.
+ ArrayAdapter<String> adapter =
+ new ArrayAdapter<String>(LoginActivity.this,
+ android.R.layout.simple_dropdown_item_1line, emailAddressCollection);
+
+ mEmailView.setAdapter(adapter);
+ }
+
+ /**
+ * Represents an asynchronous login/registration task used to authenticate
+ * the user.
+ */
+ public class UserLoginTask extends AsyncTask<Void, Void, Boolean> {
+
+ private final String mEmail;
+ private final String mPassword;
+
+ UserLoginTask(String email, String password) {
+ mEmail = email;
+ mPassword = password;
+ }
+
+ @Override
+ protected Boolean doInBackground(Void... params) {
+ // TODO: attempt authentication against a network service.
+
+ try {
+ // Simulate network access.
+ Thread.sleep(2000);
+ } catch (InterruptedException e) {
+ return false;
+ }
+
+ for (String credential : DUMMY_CREDENTIALS) {
+ String[] pieces = credential.split(":");
+ if (pieces[0].equals(mEmail)) {
+ // Account exists, return true if the password matches.
+ return pieces[1].equals(mPassword);
+ }
+ }
+
+ // TODO: register the new account here.
+ return true;
+ }
+
+ @Override
+ protected void onPostExecute(final Boolean success) {
+ mAuthTask = null;
+ showProgress(false);
+
+ if (success) {
+ finish();
+ } else {
+ mPasswordView.setError(getString(R.string.error_incorrect_password));
+ mPasswordView.requestFocus();
+ }
+ }
+
+ @Override
+ protected void onCancelled() {
+ mAuthTask = null;
+ showProgress(false);
+ }
+ }
+}
+
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/root/src/app_package/PlusBaseActivity.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/root/src/app_package/PlusBaseActivity.java.ftl
new file mode 100644
index 0000000..45ea9a9
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/root/src/app_package/PlusBaseActivity.java.ftl
@@ -0,0 +1,282 @@
+package ${packageName};
+
+import android.content.Intent;
+import android.content.IntentSender;
+import android.os.Bundle;
+<#if minApiLevel lt 14>import android.support.v7.app.ActionBarActivity;</#if>
+<#if minApiLevel gte 14>import android.app.Activity;</#if>
+import android.util.Log;
+
+import com.google.android.gms.common.ConnectionResult;
+import com.google.android.gms.common.GooglePlayServicesClient;
+import com.google.android.gms.common.Scopes;
+import com.google.android.gms.plus.PlusClient;
+<#if applicationPackage??>import ${applicationPackage}.R;</#if>
+
+/**
+ * A base class to wrap communication with the Google Play Services PlusClient.
+ */
+public abstract class PlusBaseActivity extends <#if minApiLevel lt 14>ActionBar</#if>Activity
+ implements GooglePlayServicesClient.ConnectionCallbacks,
+ GooglePlayServicesClient.OnConnectionFailedListener {
+
+ private static final String TAG = PlusBaseActivity.class.getSimpleName();
+
+ // A magic number we will use to know that our sign-in error resolution activity has completed
+ private static final int OUR_REQUEST_CODE = 49404;
+
+ // A flag to stop multiple dialogues appearing for the user
+ private boolean mAutoResolveOnFail;
+
+ // A flag to track when a connection is already in progress
+ public boolean mPlusClientIsConnecting = false;
+
+ // This is the helper object that connects to Google Play Services.
+ private PlusClient mPlusClient;
+
+ // The saved result from {@link #onConnectionFailed(ConnectionResult)}. If a connection
+ // attempt has been made, this is non-null.
+ // If this IS null, then the connect method is still running.
+ private ConnectionResult mConnectionResult;
+
+ /**
+ * Called when the {@link PlusClient} revokes access to this app.
+ */
+ protected abstract void onPlusClientRevokeAccess();
+
+ /**
+ * Called when the PlusClient is successfully connected.
+ */
+ protected abstract void onPlusClientSignIn();
+
+ /**
+ * Called when the {@link PlusClient} is disconnected.
+ */
+ protected abstract void onPlusClientSignOut();
+
+ /**
+ * Called when the {@link PlusClient} is blocking the UI. If you have a progress bar widget,
+ * this tells you when to show or hide it.
+ */
+ protected abstract void onPlusClientBlockingUI(boolean show);
+
+ /**
+ * Called when there is a change in connection state. If you have "Sign in"/ "Connect",
+ * "Sign out"/ "Disconnect", or "Revoke access" buttons, this lets you know when their states
+ * need to be updated.
+ */
+ protected abstract void updateConnectButtonState();
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // Initialize the PlusClient connection.
+ // Scopes indicate the information about the user your application will be able to access.
+ mPlusClient =
+ new PlusClient.Builder(this, this, this).setScopes(Scopes.PLUS_LOGIN,
+ Scopes.PLUS_ME).build();
+ }
+
+ /**
+ * Try to sign in the user.
+ */
+ public void signIn() {
+ if (!mPlusClient.isConnected()) {
+ // Show the dialog as we are now signing in.
+ setProgressBarVisible(true);
+ // Make sure that we will start the resolution (e.g. fire the intent and pop up a
+ // dialog for the user) for any errors that come in.
+ mAutoResolveOnFail = true;
+ // We should always have a connection result ready to resolve,
+ // so we can start that process.
+ if (mConnectionResult != null) {
+ startResolution();
+ } else {
+ // If we don't have one though, we can start connect in
+ // order to retrieve one.
+ initiatePlusClientConnect();
+ }
+ }
+
+ updateConnectButtonState();
+ }
+
+ /**
+ * Connect the {@link PlusClient} only if a connection isn't already in progress. This will
+ * call back to {@link #onConnected(android.os.Bundle)} or
+ * {@link #onConnectionFailed(com.google.android.gms.common.ConnectionResult)}.
+ */
+ private void initiatePlusClientConnect() {
+ if (!mPlusClient.isConnected() && !mPlusClient.isConnecting()) {
+ mPlusClient.connect();
+ }
+ }
+
+ /**
+ * Disconnect the {@link PlusClient} only if it is connected (otherwise, it can throw an error.)
+ * This will call back to {@link #onDisconnected()}.
+ */
+ private void initiatePlusClientDisconnect() {
+ if (mPlusClient.isConnected()) {
+ mPlusClient.disconnect();
+ }
+ }
+
+ /**
+ * Sign out the user (so they can switch to another account).
+ */
+ public void signOut() {
+
+ // We only want to sign out if we're connected.
+ if (mPlusClient.isConnected()) {
+ // Clear the default account in order to allow the user to potentially choose a
+ // different account from the account chooser.
+ mPlusClient.clearDefaultAccount();
+
+ // Disconnect from Google Play Services, then reconnect in order to restart the
+ // process from scratch.
+ initiatePlusClientDisconnect();
+
+ Log.v(TAG, "Sign out successful!");
+ }
+
+ updateConnectButtonState();
+ }
+
+ /**
+ * Revoke Google+ authorization completely.
+ */
+ public void revokeAccess() {
+
+ if (mPlusClient.isConnected()) {
+ // Clear the default account as in the Sign Out.
+ mPlusClient.clearDefaultAccount();
+
+ // Revoke access to this entire application. This will call back to
+ // onAccessRevoked when it is complete, as it needs to reach the Google
+ // authentication servers to revoke all tokens.
+ mPlusClient.revokeAccessAndDisconnect(new PlusClient.OnAccessRevokedListener() {
+ public void onAccessRevoked(ConnectionResult result) {
+ updateConnectButtonState();
+ onPlusClientRevokeAccess();
+ }
+ });
+ }
+
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ initiatePlusClientConnect();
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ initiatePlusClientDisconnect();
+ }
+
+ public boolean isPlusClientConnecting() {
+ return mPlusClientIsConnecting;
+ }
+
+ private void setProgressBarVisible(boolean flag) {
+ mPlusClientIsConnecting = flag;
+ onPlusClientBlockingUI(flag);
+ }
+
+ /**
+ * A helper method to flip the mResolveOnFail flag and start the resolution
+ * of the ConnectionResult from the failed connect() call.
+ */
+ private void startResolution() {
+ try {
+ // Don't start another resolution now until we have a result from the activity we're
+ // about to start.
+ mAutoResolveOnFail = false;
+ // If we can resolve the error, then call start resolution and pass it an integer tag
+ // we can use to track.
+ // This means that when we get the onActivityResult callback we'll know it's from
+ // being started here.
+ mConnectionResult.startResolutionForResult(this, OUR_REQUEST_CODE);
+ } catch (IntentSender.SendIntentException e) {
+ // Any problems, just try to connect() again so we get a new ConnectionResult.
+ mConnectionResult = null;
+ initiatePlusClientConnect();
+ }
+ }
+
+ /**
+ * An earlier connection failed, and we're now receiving the result of the resolution attempt
+ * by PlusClient.
+ *
+ * @see #onConnectionFailed(ConnectionResult)
+ */
+ @Override
+ protected void onActivityResult(int requestCode, int responseCode, Intent intent) {
+ updateConnectButtonState();
+ if (requestCode == OUR_REQUEST_CODE && responseCode == RESULT_OK) {
+ // If we have a successful result, we will want to be able to resolve any further
+ // errors, so turn on resolution with our flag.
+ mAutoResolveOnFail = true;
+ // If we have a successful result, let's call connect() again. If there are any more
+ // errors to resolve we'll get our onConnectionFailed, but if not,
+ // we'll get onConnected.
+ initiatePlusClientConnect();
+ } else if (requestCode == OUR_REQUEST_CODE && responseCode != RESULT_OK) {
+ // If we've got an error we can't resolve, we're no longer in the midst of signing
+ // in, so we can stop the progress spinner.
+ setProgressBarVisible(false);
+ }
+ }
+
+ /**
+ * Successfully connected (called by PlusClient)
+ */
+ @Override
+ public void onConnected(Bundle connectionHint) {
+ updateConnectButtonState();
+ setProgressBarVisible(false);
+ onPlusClientSignIn();
+ }
+
+ /**
+ * Successfully disconnected (called by PlusClient)
+ */
+ @Override
+ public void onDisconnected() {
+ updateConnectButtonState();
+ onPlusClientSignOut();
+ }
+
+ /**
+ * Connection failed for some reason (called by PlusClient)
+ * Try and resolve the result. Failure here is usually not an indication of a serious error,
+ * just that the user's input is needed.
+ *
+ * @see #onActivityResult(int, int, Intent)
+ */
+ @Override
+ public void onConnectionFailed(ConnectionResult result) {
+ updateConnectButtonState();
+
+ // Most of the time, the connection will fail with a user resolvable result. We can store
+ // that in our mConnectionResult property ready to be used when the user clicks the
+ // sign-in button.
+ if (result.hasResolution()) {
+ mConnectionResult = result;
+ if (mAutoResolveOnFail) {
+ // This is a local helper function that starts the resolution of the problem,
+ // which may be showing the user an account chooser or similar.
+ startResolution();
+ }
+ }
+ }
+
+ public PlusClient getPlusClient() {
+ return mPlusClient;
+ }
+
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/template.xml
new file mode 100644
index 0000000..03ea755
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/template.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0"?>
+<template
+ format="4"
+ revision="5"
+ name="Login Activity"
+ description="Creates a new login activity, allowing users to optionally sign in with Google+ or enter an email address and password to log in to or register with your application."
+ minApi="8"
+ minBuildApi="14">
+
+ <dependency name="android-support-v4" revision="8" />
+
+ <category value="Activity" />
+ <formfactor value="Mobile" />
+
+ <parameter
+ id="activityClass"
+ name="Activity Name"
+ type="string"
+ constraints="class|unique|nonempty"
+ default="LoginActivity"
+ help="The name of the activity class to create" />
+
+ <parameter
+ id="layoutName"
+ name="Layout Name"
+ type="string"
+ constraints="layout|unique|nonempty"
+ suggest="${activityToLayout(activityClass)}"
+ default="activity_login"
+ help="The name of the layout to create for the activity" />
+
+ <parameter
+ id="activityTitle"
+ name="Title"
+ type="string"
+ constraints="nonempty"
+ default="Sign in"
+ help="The name of the activity." />
+
+ <parameter
+ id="parentActivityClass"
+ name="Hierarchical Parent"
+ type="string"
+ constraints="activity|exists|empty"
+ default=""
+ help="The hierarchical parent activity, used to provide a default implementation for the 'Up' button" />
+
+ <parameter
+ id="packageName"
+ name="Package name"
+ type="string"
+ constraints="package"
+ default="com.mycompany.myapp" />
+
+ <parameter
+ id="includeGooglePlus"
+ name="Include Google+ sign in"
+ type="boolean"
+ default="true" />
+
+ <thumbs>
+ <thumb>template_login_activity.png</thumb>
+ </thumbs>
+
+ <globals file="globals.xml.ftl" />
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/template_login_activity.png b/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/template_login_activity.png
new file mode 100644
index 0000000..0f9bfc0
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/LoginActivity/template_login_activity.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/globals.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/globals.xml.ftl
new file mode 100644
index 0000000..5858cec
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/globals.xml.ftl
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<globals>
+ <global id="appCompat" type="boolean" value="${(minApiLevel lt 14)?string}" />
+ <global id="Support" value="${(minApiLevel lt 14)?string('Support','')}" />
+ <global id="projectOut" value="." />
+ <global id="manifestOut" value="${manifestDir}" />
+ <global id="srcOut" value="${srcDir}/${slashedPackageName(packageName)}" />
+ <global id="resOut" value="${resDir}" />
+ <global id="CollectionName" value="${extractLetters(objectKind)}List" />
+ <global id="collection_name" value="${extractLetters(objectKind?lower_case)}_list" />
+ <global id="DetailName" value="${extractLetters(objectKind)}Detail" />
+ <global id="detail_name" value="${extractLetters(objectKind?lower_case)}_detail" />
+ <global id="relativePackage" value="<#if relativePackage?has_content>${relativePackage}<#else>${packageName}</#if>" />
+</globals>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/recipe.xml.ftl
new file mode 100644
index 0000000..25d12bd
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/recipe.xml.ftl
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<recipe>
+ <dependency mavenUrl="com.android.support:support-v4:19.+" />
+
+ <merge from="AndroidManifest.xml.ftl"
+ to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />
+
+ <merge from="res/values-large/refs.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values-large/refs.xml" />
+ <merge from="res/values-sw600dp/refs.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values-sw600dp/refs.xml" />
+ <merge from="res/values/strings.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values/strings.xml" />
+
+ <instantiate from="res/layout/activity_content_detail.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/layout/activity_${detail_name}.xml" />
+ <instantiate from="res/layout/activity_content_list.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/layout/activity_${collection_name}.xml" />
+ <instantiate from="res/layout/activity_content_twopane.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/layout/activity_${extractLetters(objectKind?lower_case)}_twopane.xml" />
+ <instantiate from="res/layout/fragment_content_detail.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/layout/fragment_${detail_name}.xml" />
+
+ <instantiate from="src/app_package/ContentDetailActivity.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/${DetailName}Activity.java" />
+ <instantiate from="src/app_package/ContentDetailFragment.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/${DetailName}Fragment.java" />
+ <instantiate from="src/app_package/ContentListActivity.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/${CollectionName}Activity.java" />
+ <instantiate from="src/app_package/ContentListFragment.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/${CollectionName}Fragment.java" />
+ <instantiate from="src/app_package/dummy/DummyContent.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/dummy/DummyContent.java" />
+
+ <open file="${escapeXmlAttribute(srcOut)}/${DetailName}Fragment.java" />
+ <open file="${escapeXmlAttribute(resOut)}/layout/fragment_${detail_name}.xml" />
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/AndroidManifest.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/AndroidManifest.xml.ftl
new file mode 100644
index 0000000..3fb177b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/AndroidManifest.xml.ftl
@@ -0,0 +1,31 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <application>
+ <activity android:name="${relativePackage}.${CollectionName}Activity"
+ <#if isNewProject>
+ android:label="@string/app_name"
+ <#else>
+ android:label="@string/title_${collection_name}"
+ </#if>
+ <#if buildApi gte 16 && parentActivityClass != "">android:parentActivityName="${parentActivityClass}"</#if>>
+ <#if parentActivityClass != "">
+ <meta-data android:name="android.support.PARENT_ACTIVITY"
+ android:value="${parentActivityClass}" />
+ </#if>
+ <#if isLauncher>
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </#if>
+ </activity>
+
+ <activity android:name="${relativePackage}.${DetailName}Activity"
+ android:label="@string/title_${detail_name}"
+ <#if buildApi gte 16>android:parentActivityName="${relativePackage}.${CollectionName}Activity"</#if>>
+ <meta-data android:name="android.support.PARENT_ACTIVITY"
+ android:value="${relativePackage}.${CollectionName}Activity" />
+ </activity>
+ </application>
+
+</manifest>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/layout/activity_content_detail.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/layout/activity_content_detail.xml.ftl
new file mode 100644
index 0000000..91f931a
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/layout/activity_content_detail.xml.ftl
@@ -0,0 +1,7 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/${detail_name}_container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context="${relativePackage}.${DetailName}Activity"
+ tools:ignore="MergeRootFrame" />
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/layout/activity_content_list.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/layout/activity_content_list.xml.ftl
new file mode 100644
index 0000000..8777431
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/layout/activity_content_list.xml.ftl
@@ -0,0 +1,10 @@
+<fragment xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/${collection_name}"
+ android:name="${packageName}.${CollectionName}Fragment"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginLeft="16dp"
+ android:layout_marginRight="16dp"
+ tools:context="${relativePackage}.${CollectionName}Activity"
+ tools:layout="@android:layout/list_content" />
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/layout/activity_content_twopane.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/layout/activity_content_twopane.xml.ftl
new file mode 100644
index 0000000..4b922ee
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/layout/activity_content_twopane.xml.ftl
@@ -0,0 +1,38 @@
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_marginLeft="16dp"
+ android:layout_marginRight="16dp"
+ android:baselineAligned="false"
+ android:divider="?android:attr/dividerHorizontal"
+ android:orientation="horizontal"
+ android:showDividers="middle"
+ tools:context="${relativePackage}.${CollectionName}Activity">
+
+ <!--
+ This layout is a two-pane layout for the ${objectKindPlural}
+ master/detail flow. See res/values-large/refs.xml and
+ res/values-sw600dp/refs.xml for an example of layout aliases
+ that replace the single-pane version of the layout with
+ this two-pane version.
+
+ For more on layout aliases, see:
+ http://developer.android.com/training/multiscreen/screensizes.html#TaskUseAliasFilters
+ -->
+
+ <fragment
+ android:id="@+id/${collection_name}"
+ android:name="${packageName}.${CollectionName}Fragment"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ tools:layout="@android:layout/list_content" />
+
+ <FrameLayout
+ android:id="@+id/${detail_name}_container"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="3" />
+
+</LinearLayout>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/layout/fragment_content_detail.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/layout/fragment_content_detail.xml.ftl
new file mode 100644
index 0000000..f921d60
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/layout/fragment_content_detail.xml.ftl
@@ -0,0 +1,9 @@
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/${detail_name}"
+ style="?android:attr/textAppearanceLarge"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:padding="16dp"
+ android:textIsSelectable="true"
+ tools:context="${relativePackage}.${DetailName}Fragment" />
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/values-large/refs.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/values-large/refs.xml.ftl
new file mode 100644
index 0000000..97215c3
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/values-large/refs.xml.ftl
@@ -0,0 +1,10 @@
+<resources>
+ <!--
+ Layout alias to replace the single-pane version of the layout with a
+ two-pane version on Large screens.
+
+ For more on layout aliases, see:
+ http://developer.android.com/training/multiscreen/screensizes.html#TaskUseAliasFilters
+ -->
+ <item type="layout" name="activity_${collection_name}">@layout/activity_${extractLetters(objectKind?lower_case)}_twopane</item>
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/values-sw600dp/refs.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/values-sw600dp/refs.xml.ftl
new file mode 100644
index 0000000..d592404
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/values-sw600dp/refs.xml.ftl
@@ -0,0 +1,11 @@
+<resources>
+ <!--
+ Layout alias to replace the single-pane version of the layout with a
+ two-pane version on screens with a smallest width (smallest dimension)
+ of at least 600 density-independent pixels (dips).
+
+ For more on layout aliases, see:
+ http://developer.android.com/training/multiscreen/screensizes.html#TaskUseAliasFilters
+ -->
+ <item type="layout" name="activity_${collection_name}">@layout/activity_${extractLetters(objectKind?lower_case)}_twopane</item>
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/values/strings.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/values/strings.xml.ftl
new file mode 100644
index 0000000..ea882bc
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/res/values/strings.xml.ftl
@@ -0,0 +1,6 @@
+<resources>
+ <#if !isNewProject>
+ <string name="title_${collection_name}">${escapeXmlString(objectKindPlural)}</string>
+ </#if>
+ <string name="title_${detail_name}">${escapeXmlString(objectKind)} Detail</string>
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/src/app_package/ContentDetailActivity.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/src/app_package/ContentDetailActivity.java.ftl
new file mode 100644
index 0000000..6dc3409
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/src/app_package/ContentDetailActivity.java.ftl
@@ -0,0 +1,78 @@
+package ${packageName};
+
+import android.content.Intent;
+import android.os.Bundle;
+import <#if appCompat>android.support.v7.app.ActionBarActivity<#else>android.app.Activity</#if>;
+<#if minApiLevel lt 16>import android.support.v4.app.NavUtils;</#if>
+import android.view.MenuItem;
+<#if applicationPackage??>import ${applicationPackage}.R;</#if>
+
+/**
+ * An activity representing a single ${objectKind} detail screen. This
+ * activity is only used on handset devices. On tablet-size devices,
+ * item details are presented side-by-side with a list of items
+ * in a {@link ${CollectionName}Activity}.
+ * <p>
+ * This activity is mostly just a 'shell' activity containing nothing
+ * more than a {@link ${DetailName}Fragment}.
+ */
+public class ${DetailName}Activity extends ${appCompat?string('ActionBar','')}Activity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_${detail_name});
+
+ // Show the Up button in the action bar.
+ get${Support}ActionBar().setDisplayHomeAsUpEnabled(true);
+
+ // savedInstanceState is non-null when there is fragment state
+ // saved from previous configurations of this activity
+ // (e.g. when rotating the screen from portrait to landscape).
+ // In this case, the fragment will automatically be re-added
+ // to its container so we don't need to manually add it.
+ // For more information, see the Fragments API guide at:
+ //
+ // http://developer.android.com/guide/components/fragments.html
+ //
+ if (savedInstanceState == null) {
+ // Create the detail fragment and add it to the activity
+ // using a fragment transaction.
+ Bundle arguments = new Bundle();
+ arguments.putString(${DetailName}Fragment.ARG_ITEM_ID,
+ getIntent().getStringExtra(${DetailName}Fragment.ARG_ITEM_ID));
+ ${DetailName}Fragment fragment = new ${DetailName}Fragment();
+ fragment.setArguments(arguments);
+ get${Support}FragmentManager().beginTransaction()
+ .add(R.id.${detail_name}_container, fragment)
+ .commit();
+ }
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ int id = item.getItemId();
+ if (id == android.R.id.home) {
+<#if minApiLevel lt 16>
+ // This ID represents the Home or Up button. In the case of this
+ // activity, the Up button is shown. Use NavUtils to allow users
+ // to navigate up one level in the application structure. For
+ // more details, see the Navigation pattern on Android Design:
+ //
+ // http://developer.android.com/design/patterns/navigation.html#up-vs-back
+ //
+ NavUtils.navigateUpTo(this, new Intent(this, ${CollectionName}Activity.class));
+<#else>
+ // This ID represents the Home or Up button. In the case of this
+ // activity, the Up button is shown. For
+ // more details, see the Navigation pattern on Android Design:
+ //
+ // http://developer.android.com/design/patterns/navigation.html#up-vs-back
+ //
+ navigateUpTo(new Intent(this, ${CollectionName}Activity.class));
+</#if>
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/src/app_package/ContentDetailFragment.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/src/app_package/ContentDetailFragment.java.ftl
new file mode 100644
index 0000000..27331cd
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/src/app_package/ContentDetailFragment.java.ftl
@@ -0,0 +1,62 @@
+package ${packageName};
+
+import android.os.Bundle;
+import android.<#if appCompat>support.v4.</#if>app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+<#if applicationPackage??>import ${applicationPackage}.R;</#if>
+
+import ${packageName}.dummy.DummyContent;
+
+/**
+ * A fragment representing a single ${objectKind} detail screen.
+ * This fragment is either contained in a {@link ${CollectionName}Activity}
+ * in two-pane mode (on tablets) or a {@link ${DetailName}Activity}
+ * on handsets.
+ */
+public class ${DetailName}Fragment extends Fragment {
+ /**
+ * The fragment argument representing the item ID that this fragment
+ * represents.
+ */
+ public static final String ARG_ITEM_ID = "item_id";
+
+ /**
+ * The dummy content this fragment is presenting.
+ */
+ private DummyContent.DummyItem mItem;
+
+ /**
+ * Mandatory empty constructor for the fragment manager to instantiate the
+ * fragment (e.g. upon screen orientation changes).
+ */
+ public ${DetailName}Fragment() {
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ if (getArguments().containsKey(ARG_ITEM_ID)) {
+ // Load the dummy content specified by the fragment
+ // arguments. In a real-world scenario, use a Loader
+ // to load content from a content provider.
+ mItem = DummyContent.ITEM_MAP.get(getArguments().getString(ARG_ITEM_ID));
+ }
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View rootView = inflater.inflate(R.layout.fragment_${detail_name}, container, false);
+
+ // Show the dummy content as text in a TextView.
+ if (mItem != null) {
+ ((TextView) rootView.findViewById(R.id.${detail_name})).setText(mItem.content);
+ }
+
+ return rootView;
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/src/app_package/ContentListActivity.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/src/app_package/ContentListActivity.java.ftl
new file mode 100644
index 0000000..8e8ac58
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/src/app_package/ContentListActivity.java.ftl
@@ -0,0 +1,106 @@
+package ${packageName};
+
+import android.content.Intent;
+import android.os.Bundle;
+import <#if appCompat>android.support.v4.app.FragmentActivity<#else>android.app.Activity</#if>;
+<#if (parentActivityClass != "" && minApiLevel lt 16)>import android.support.v4.app.NavUtils;</#if>
+<#if parentActivityClass != "">import android.view.MenuItem;</#if>
+<#if applicationPackage??>import ${applicationPackage}.R;</#if>
+
+/**
+ * An activity representing a list of ${objectKindPlural}. This activity
+ * has different presentations for handset and tablet-size devices. On
+ * handsets, the activity presents a list of items, which when touched,
+ * lead to a {@link ${DetailName}Activity} representing
+ * item details. On tablets, the activity presents the list of items and
+ * item details side-by-side using two vertical panes.
+ * <p>
+ * The activity makes heavy use of fragments. The list of items is a
+ * {@link ${CollectionName}Fragment} and the item details
+ * (if present) is a {@link ${DetailName}Fragment}.
+ * <p>
+ * This activity also implements the required
+ * {@link ${CollectionName}Fragment.Callbacks} interface
+ * to listen for item selections.
+ */
+public class ${CollectionName}Activity extends ${(appCompat)?string('Fragment','')}Activity
+ implements ${CollectionName}Fragment.Callbacks {
+
+ /**
+ * Whether or not the activity is in two-pane mode, i.e. running on a tablet
+ * device.
+ */
+ private boolean mTwoPane;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_${collection_name});
+ <#if parentActivityClass != "">
+ // Show the Up button in the action bar.
+ get${Support}ActionBar().setDisplayHomeAsUpEnabled(true);
+ </#if>
+
+ if (findViewById(R.id.${detail_name}_container) != null) {
+ // The detail container view will be present only in the
+ // large-screen layouts (res/values-large and
+ // res/values-sw600dp). If this view is present, then the
+ // activity should be in two-pane mode.
+ mTwoPane = true;
+
+ // In two-pane mode, list items should be given the
+ // 'activated' state when touched.
+ ((${CollectionName}Fragment) get${Support}FragmentManager()
+ .findFragmentById(R.id.${collection_name}))
+ .setActivateOnItemClick(true);
+ }
+
+ // TODO: If exposing deep links into your app, handle intents here.
+ }
+ <#if parentActivityClass != "">
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ int id = item.getItemId();
+ if (id == android.R.id.home) {
+ // This ID represents the Home or Up button. In the case of this
+ // activity, the Up button is shown. Use NavUtils to allow users
+ // to navigate up one level in the application structure. For
+ // more details, see the Navigation pattern on Android Design:
+ //
+ // http://developer.android.com/design/patterns/navigation.html#up-vs-back
+ //
+ ${(minApiLevel lt 16)?string('NavUtils.','')}navigateUpFromSameTask(this);
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+ </#if>
+
+ /**
+ * Callback method from {@link ${CollectionName}Fragment.Callbacks}
+ * indicating that the item with the given ID was selected.
+ */
+ @Override
+ public void onItemSelected(String id) {
+ if (mTwoPane) {
+ // In two-pane mode, show the detail view in this activity by
+ // adding or replacing the detail fragment using a
+ // fragment transaction.
+ Bundle arguments = new Bundle();
+ arguments.putString(${DetailName}Fragment.ARG_ITEM_ID, id);
+ ${DetailName}Fragment fragment = new ${DetailName}Fragment();
+ fragment.setArguments(arguments);
+ get${Support}FragmentManager().beginTransaction()
+ .replace(R.id.${detail_name}_container, fragment)
+ .commit();
+
+ } else {
+ // In single-pane mode, simply start the detail activity
+ // for the selected item ID.
+ Intent detailIntent = new Intent(this, ${DetailName}Activity.class);
+ detailIntent.putExtra(${DetailName}Fragment.ARG_ITEM_ID, id);
+ startActivity(detailIntent);
+ }
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/src/app_package/ContentListFragment.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/src/app_package/ContentListFragment.java.ftl
new file mode 100644
index 0000000..9e34f3e
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/src/app_package/ContentListFragment.java.ftl
@@ -0,0 +1,152 @@
+package ${packageName};
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.<#if Support?has_content>support.v4.</#if>app.ListFragment;
+import android.view.View;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+<#if applicationPackage??>import ${applicationPackage}.R;</#if>
+
+import ${packageName}.dummy.DummyContent;
+
+/**
+ * A list fragment representing a list of ${objectKindPlural}. This fragment
+ * also supports tablet devices by allowing list items to be given an
+ * 'activated' state upon selection. This helps indicate which item is
+ * currently being viewed in a {@link ${DetailName}Fragment}.
+ * <p>
+ * Activities containing this fragment MUST implement the {@link Callbacks}
+ * interface.
+ */
+public class ${CollectionName}Fragment extends ListFragment {
+
+ /**
+ * The serialization (saved instance state) Bundle key representing the
+ * activated item position. Only used on tablets.
+ */
+ private static final String STATE_ACTIVATED_POSITION = "activated_position";
+
+ /**
+ * The fragment's current callback object, which is notified of list item
+ * clicks.
+ */
+ private Callbacks mCallbacks = sDummyCallbacks;
+
+ /**
+ * The current activated item position. Only used on tablets.
+ */
+ private int mActivatedPosition = ListView.INVALID_POSITION;
+
+ /**
+ * A callback interface that all activities containing this fragment must
+ * implement. This mechanism allows activities to be notified of item
+ * selections.
+ */
+ public interface Callbacks {
+ /**
+ * Callback for when an item has been selected.
+ */
+ public void onItemSelected(String id);
+ }
+
+ /**
+ * A dummy implementation of the {@link Callbacks} interface that does
+ * nothing. Used only when this fragment is not attached to an activity.
+ */
+ private static Callbacks sDummyCallbacks = new Callbacks() {
+ @Override
+ public void onItemSelected(String id) {
+ }
+ };
+
+ /**
+ * Mandatory empty constructor for the fragment manager to instantiate the
+ * fragment (e.g. upon screen orientation changes).
+ */
+ public ${CollectionName}Fragment() {
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // TODO: replace with a real list adapter.
+ setListAdapter(new ArrayAdapter<DummyContent.DummyItem>(
+ getActivity(),
+ android.R.layout.simple_list_item_activated_1,
+ android.R.id.text1,
+ DummyContent.ITEMS));
+ }
+
+ @Override
+ public void onViewCreated(View view, Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+
+ // Restore the previously serialized activated item position.
+ if (savedInstanceState != null
+ && savedInstanceState.containsKey(STATE_ACTIVATED_POSITION)) {
+ setActivatedPosition(savedInstanceState.getInt(STATE_ACTIVATED_POSITION));
+ }
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+
+ // Activities containing this fragment must implement its callbacks.
+ if (!(activity instanceof Callbacks)) {
+ throw new IllegalStateException("Activity must implement fragment's callbacks.");
+ }
+
+ mCallbacks = (Callbacks) activity;
+ }
+
+ @Override
+ public void onDetach() {
+ super.onDetach();
+
+ // Reset the active callbacks interface to the dummy implementation.
+ mCallbacks = sDummyCallbacks;
+ }
+
+ @Override
+ public void onListItemClick(ListView listView, View view, int position, long id) {
+ super.onListItemClick(listView, view, position, id);
+
+ // Notify the active callbacks interface (the activity, if the
+ // fragment is attached to one) that an item has been selected.
+ mCallbacks.onItemSelected(DummyContent.ITEMS.get(position).id);
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ if (mActivatedPosition != ListView.INVALID_POSITION) {
+ // Serialize and persist the activated item position.
+ outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition);
+ }
+ }
+
+ /**
+ * Turns on activate-on-click mode. When this mode is on, list items will be
+ * given the 'activated' state when touched.
+ */
+ public void setActivateOnItemClick(boolean activateOnItemClick) {
+ // When setting CHOICE_MODE_SINGLE, ListView will automatically
+ // give items the 'activated' state when touched.
+ getListView().setChoiceMode(activateOnItemClick
+ ? ListView.CHOICE_MODE_SINGLE
+ : ListView.CHOICE_MODE_NONE);
+ }
+
+ private void setActivatedPosition(int position) {
+ if (position == ListView.INVALID_POSITION) {
+ getListView().setItemChecked(mActivatedPosition, false);
+ } else {
+ getListView().setItemChecked(position, true);
+ }
+
+ mActivatedPosition = position;
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/src/app_package/dummy/DummyContent.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/src/app_package/dummy/DummyContent.java.ftl
new file mode 100644
index 0000000..3545ba3
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/root/src/app_package/dummy/DummyContent.java.ftl
@@ -0,0 +1,55 @@
+package ${packageName}.dummy;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Helper class for providing sample content for user interfaces created by
+ * Android template wizards.
+ * <p>
+ * TODO: Replace all uses of this class before publishing your app.
+ */
+public class DummyContent {
+
+ /**
+ * An array of sample (dummy) items.
+ */
+ public static List<DummyItem> ITEMS = new ArrayList<DummyItem>();
+
+ /**
+ * A map of sample (dummy) items, by ID.
+ */
+ public static Map<String, DummyItem> ITEM_MAP = new HashMap<String, DummyItem>();
+
+ static {
+ // Add 3 sample items.
+ addItem(new DummyItem("1", "Item 1"));
+ addItem(new DummyItem("2", "Item 2"));
+ addItem(new DummyItem("3", "Item 3"));
+ }
+
+ private static void addItem(DummyItem item) {
+ ITEMS.add(item);
+ ITEM_MAP.put(item.id, item);
+ }
+
+ /**
+ * A dummy item representing a piece of content.
+ */
+ public static class DummyItem {
+ public String id;
+ public String content;
+
+ public DummyItem(String id, String content) {
+ this.id = id;
+ this.content = content;
+ }
+
+ @Override
+ public String toString() {
+ return content;
+ }
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/template.xml
new file mode 100644
index 0000000..b8b2587
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/template.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0"?>
+<template
+ format="4"
+ revision="5"
+ name="Master/Detail Flow"
+ minApi="4"
+ description="Creates a new master/detail flow, allowing users to view a collection of objects as well as details for each object. This flow is presented using two columns on tablet-size screens and one column on handsets and smaller screens. This template creates two activities, a master fragment, and a detail fragment."
+ category="Activity">
+
+ <dependency name="android-support-v4" revision="8" />
+
+ <category value="Activity" />
+ <formfactor value="Mobile" />
+
+ <thumbs>
+ <thumb>template_master_detail.png</thumb>
+ </thumbs>
+
+ <parameter
+ id="objectKind"
+ name="Object Kind"
+ type="string"
+ constraints="nonempty"
+ default="Item"
+ help="Other examples are 'Person', 'Book', etc." />
+
+ <parameter
+ id="objectKindPlural"
+ name="Object Kind Plural"
+ type="string"
+ constraints="nonempty"
+ default="Items"
+ help="Other examples are 'People', 'Books', etc." />
+
+ <parameter
+ id="activityTitle"
+ name="Title"
+ type="string"
+ constraints="nonempty"
+ suggest="${objectKindPlural}"
+ default="Items" />
+
+ <parameter
+ id="isLauncher"
+ name="Launcher Activity"
+ type="boolean"
+ default="false"
+ help="If true, the primary activity in the flow will have a CATEGORY_LAUNCHER intent filter, making it visible in the launcher" />
+
+ <parameter
+ id="parentActivityClass"
+ name="Hierarchical Parent"
+ type="string"
+ constraints="activity|exists|empty"
+ default=""
+ help="The hierarchical parent activity, used to provide a default implementation for the 'Up' button" />
+
+ <parameter
+ id="packageName"
+ name="Package name"
+ type="string"
+ constraints="package"
+ default="com.mycompany.myapp" />
+
+ <globals file="globals.xml.ftl" />
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/template_master_detail.png b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/template_master_detail.png
new file mode 100644
index 0000000..f9d3f23
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/MasterDetailFlow/template_master_detail.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/globals.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/globals.xml.ftl
new file mode 100644
index 0000000..cd58b56
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/globals.xml.ftl
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<globals>
+ <global id="manifestOut" value="${manifestDir}" />
+ <global id="appCompat" type="boolean" value="${(minApiLevel lt 14)?string}" />
+ <!-- e.g. getSupportActionBar vs. getActionBar -->
+ <global id="Support" value="${(minApiLevel lt 14)?string('Support','')}" />
+ <global id="ActionNamespace" value="${(minApiLevel lt 14)?string('app','android')}" />
+ <global id="srcOut" value="${srcDir}/${slashedPackageName(packageName)}" />
+ <global id="resOut" value="${resDir}" />
+ <global id="menuName" value="${classToResource(activityClass)}" />
+ <global id="relativePackage" value="<#if relativePackage?has_content>${relativePackage}<#else>${packageName}</#if>" />
+</globals>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/recipe.xml.ftl
new file mode 100644
index 0000000..77e66fd
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/recipe.xml.ftl
@@ -0,0 +1,49 @@
+<?xml version="1.0"?>
+<recipe>
+
+ <#if appCompat><dependency mavenUrl="com.android.support:appcompat-v7:19.+"/></#if>
+ <#if !appCompat><dependency mavenUrl="com.android.support:support-v4:19.+"/></#if>
+
+ <merge from="AndroidManifest.xml.ftl"
+ to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />
+
+ <instantiate from="res/menu/main.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/menu/${menuName}.xml" />
+
+ <merge from="res/values/strings.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values/strings.xml" />
+
+ <merge from="res/values/dimens.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values/dimens.xml" />
+ <merge from="res/values-w820dp/dimens.xml"
+ to="${escapeXmlAttribute(resOut)}/values-w820dp/dimens.xml" />
+
+ <!-- TODO: switch on Holo Dark v. Holo Light -->
+ <copy from="res/drawable-hdpi"
+ to="${escapeXmlAttribute(resOut)}/drawable-hdpi" />
+ <copy from="res/drawable-mdpi"
+ to="${escapeXmlAttribute(resOut)}/drawable-mdpi" />
+ <copy from="res/drawable-xhdpi"
+ to="${escapeXmlAttribute(resOut)}/drawable-xhdpi" />
+ <copy from="res/drawable-xxhdpi"
+ to="${escapeXmlAttribute(resOut)}/drawable-xxhdpi" />
+
+ <instantiate from="res/menu/global.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/menu/global.xml" />
+
+ <instantiate from="res/layout/activity_drawer.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml" />
+ <instantiate from="res/layout/fragment_navigation_drawer.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/layout/${navigationDrawerLayout}.xml" />
+
+ <instantiate from="res/layout/fragment_simple.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/layout/${fragmentLayoutName}.xml" />
+
+ <instantiate from="src/app_package/DrawerActivity.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />
+ <instantiate from="src/app_package/NavigationDrawerFragment.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/NavigationDrawerFragment.java" />
+
+ <open file="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />
+ <open file="${escapeXmlAttribute(resOut)}/layout/${fragmentLayoutName}.xml" />
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/AndroidManifest.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/AndroidManifest.xml.ftl
new file mode 100644
index 0000000..af1d2d6
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/AndroidManifest.xml.ftl
@@ -0,0 +1,24 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <application>
+ <activity android:name="${relativePackage}.${activityClass}"
+ <#if isNewProject>
+ android:label="@string/app_name"
+ <#else>
+ android:label="@string/title_${activityToLayout(activityClass)}"
+ </#if>
+ <#if buildApi gte 16 && parentActivityClass != "">android:parentActivityName="${parentActivityClass}"</#if>>
+ <#if parentActivityClass != "">
+ <meta-data android:name="android.support.PARENT_ACTIVITY"
+ android:value="${parentActivityClass}" />
+ </#if>
+ <#if isLauncher>
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </#if>
+ </activity>
+ </application>
+
+</manifest>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/build.gradle.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/build.gradle.ftl
new file mode 100644
index 0000000..caf4f20
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/build.gradle.ftl
@@ -0,0 +1,7 @@
+dependencies {
+ <#if dependencyList?? >
+ <#list dependencyList as dependency>
+ compile '${dependency}'
+ </#list>
+ </#if>
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-hdpi/drawer_shadow.9.png b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-hdpi/drawer_shadow.9.png
new file mode 100644
index 0000000..236bff5
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-hdpi/drawer_shadow.9.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-hdpi/ic_drawer.png b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-hdpi/ic_drawer.png
new file mode 100644
index 0000000..c59f601
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-hdpi/ic_drawer.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-mdpi/drawer_shadow.9.png b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-mdpi/drawer_shadow.9.png
new file mode 100644
index 0000000..ffe3a28
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-mdpi/drawer_shadow.9.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-mdpi/ic_drawer.png b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-mdpi/ic_drawer.png
new file mode 100644
index 0000000..1ed2c56
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-mdpi/ic_drawer.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-xhdpi/drawer_shadow.9.png b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-xhdpi/drawer_shadow.9.png
new file mode 100644
index 0000000..fabe9d9
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-xhdpi/drawer_shadow.9.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-xhdpi/ic_drawer.png b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-xhdpi/ic_drawer.png
new file mode 100644
index 0000000..a5fa74d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-xhdpi/ic_drawer.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-xxhdpi/drawer_shadow.9.png b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-xxhdpi/drawer_shadow.9.png
new file mode 100644
index 0000000..b91e9d7
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-xxhdpi/drawer_shadow.9.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-xxhdpi/ic_drawer.png b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-xxhdpi/ic_drawer.png
new file mode 100644
index 0000000..9c4685d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/drawable-xxhdpi/ic_drawer.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/layout/activity_drawer.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/layout/activity_drawer.xml.ftl
new file mode 100644
index 0000000..eabb6b1
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/layout/activity_drawer.xml.ftl
@@ -0,0 +1,31 @@
+<!-- A DrawerLayout is intended to be used as the top-level content view using match_parent for both width and height to consume the full space available. -->
+<android.support.v4.widget.DrawerLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/drawer_layout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context="${relativePackage}.${activityClass}">
+
+ <!-- As the main content view, the view below consumes the entire
+ space available using match_parent in both dimensions. -->
+ <FrameLayout
+ android:id="@+id/container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+ <!-- android:layout_gravity="start" tells DrawerLayout to treat
+ this as a sliding drawer on the left side for left-to-right
+ languages and on the right side for right-to-left languages.
+ If you're not building against API 17 or higher, use
+ android:layout_gravity="left" instead. -->
+ <!-- The drawer is given a fixed width in dp and extends the full height of
+ the container. -->
+ <fragment android:id="@+id/navigation_drawer"
+ android:layout_width="@dimen/navigation_drawer_width"
+ android:layout_height="match_parent"
+ android:layout_gravity="<#if buildApi gte 17>start<#else>left</#if>"
+ android:name="${packageName}.NavigationDrawerFragment"
+ tools:layout="@layout/${navigationDrawerLayout}" />
+
+</android.support.v4.widget.DrawerLayout>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/layout/fragment_navigation_drawer.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/layout/fragment_navigation_drawer.xml.ftl
new file mode 100644
index 0000000..8958788
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/layout/fragment_navigation_drawer.xml.ftl
@@ -0,0 +1,9 @@
+<ListView xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:choiceMode="singleChoice"
+ android:divider="@android:color/transparent"
+ android:dividerHeight="0dp"
+ android:background="#cccc"
+ tools:context="${relativePackage}.NavigationDrawerFragment" />
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/layout/fragment_simple.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/layout/fragment_simple.xml.ftl
new file mode 100644
index 0000000..1baa65a
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/layout/fragment_simple.xml.ftl
@@ -0,0 +1,16 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingLeft="@dimen/activity_horizontal_margin"
+ android:paddingRight="@dimen/activity_horizontal_margin"
+ android:paddingTop="@dimen/activity_vertical_margin"
+ android:paddingBottom="@dimen/activity_vertical_margin"
+ tools:context="${relativePackage}.${activityClass}$PlaceholderFragment">
+
+ <TextView
+ android:id="@+id/section_label"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+</RelativeLayout>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/menu/global.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/menu/global.xml.ftl
new file mode 100644
index 0000000..cfc1903
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/menu/global.xml.ftl
@@ -0,0 +1,7 @@
+<menu xmlns:android="http://schemas.android.com/apk/res/android"<#if appCompat>
+ xmlns:app="http://schemas.android.com/apk/res-auto"</#if>>
+ <item android:id="@+id/action_settings"
+ android:title="@string/action_settings"
+ android:orderInCategory="100"
+ ${ActionNamespace}:showAsAction="never" />
+</menu>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/menu/main.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/menu/main.xml.ftl
new file mode 100644
index 0000000..2824974
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/menu/main.xml.ftl
@@ -0,0 +1,12 @@
+<menu xmlns:android="http://schemas.android.com/apk/res/android"<#if appCompat>
+ xmlns:app="http://schemas.android.com/apk/res-auto"</#if>
+ xmlns:tools="http://schemas.android.com/tools"
+ tools:context="${relativePackage}.${activityClass}" >
+ <item android:id="@+id/action_example"
+ android:title="@string/action_example"
+ ${ActionNamespace}:showAsAction="withText|ifRoom" />
+ <item android:id="@+id/action_settings"
+ android:title="@string/action_settings"
+ android:orderInCategory="100"
+ ${ActionNamespace}:showAsAction="never" />
+</menu>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/values-w820dp/dimens.xml b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/values-w820dp/dimens.xml
new file mode 100644
index 0000000..63fc816
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/values-w820dp/dimens.xml
@@ -0,0 +1,6 @@
+<resources>
+ <!-- Example customization of dimensions originally defined in res/values/dimens.xml
+ (such as screen margins) for screens with more than 820dp of available width. This
+ would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
+ <dimen name="activity_horizontal_margin">64dp</dimen>
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/values/dimens.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/values/dimens.xml.ftl
new file mode 100644
index 0000000..074e7a0
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/values/dimens.xml.ftl
@@ -0,0 +1,9 @@
+<resources>
+ <!-- Default screen margins, per the Android Design guidelines. -->
+ <dimen name="activity_horizontal_margin">16dp</dimen>
+ <dimen name="activity_vertical_margin">16dp</dimen>
+
+ <!-- Per the design guidelines, navigation drawers should be between 240dp and 320dp:
+ https://developer.android.com/design/patterns/navigation-drawer.html -->
+ <dimen name="navigation_drawer_width">240dp</dimen>
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/values/strings.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/values/strings.xml.ftl
new file mode 100644
index 0000000..68a6529
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/res/values/strings.xml.ftl
@@ -0,0 +1,17 @@
+<resources>
+ <#if !isNewProject>
+ <string name="title_${activityToLayout(activityClass)}">${escapeXmlString(activityTitle)}</string>
+ </#if>
+
+ <string name="title_section1">Section 1</string>
+ <string name="title_section2">Section 2</string>
+ <string name="title_section3">Section 3</string>
+
+ <string name="navigation_drawer_open">Open navigation drawer</string>
+ <string name="navigation_drawer_close">Close navigation drawer</string>
+
+ <string name="action_example">Example action</string>
+
+ <string name="action_settings">Settings</string>
+
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/src/app_package/DrawerActivity.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/src/app_package/DrawerActivity.java.ftl
new file mode 100644
index 0000000..261d090
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/src/app_package/DrawerActivity.java.ftl
@@ -0,0 +1,84 @@
+package ${packageName};
+
+import android.app.Activity;
+<#if appCompat>import android.support.v7.app.ActionBarActivity;</#if>
+import android.<#if appCompat>support.v7.</#if>app.ActionBar;
+import android.<#if appCompat>support.v4.</#if>app.Fragment;
+import android.<#if appCompat>support.v4.</#if>app.FragmentManager;
+import android.content.Context;
+import android.os.Build;
+import android.os.Bundle;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.support.v4.widget.DrawerLayout;
+import android.widget.ArrayAdapter;
+import android.widget.TextView;
+<#if applicationPackage??>import ${applicationPackage}.R;</#if>
+
+public class ${activityClass} extends ${(appCompat)?string('ActionBar','')}Activity
+ implements NavigationDrawerFragment.NavigationDrawerCallbacks {
+
+ /**
+ * Fragment managing the behaviors, interactions and presentation of the navigation drawer.
+ */
+ private NavigationDrawerFragment mNavigationDrawerFragment;
+
+ /**
+ * Used to store the last screen title. For use in {@link #restoreActionBar()}.
+ */
+ private CharSequence mTitle;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.${layoutName});
+
+ mNavigationDrawerFragment = (NavigationDrawerFragment)
+ get${Support}FragmentManager().findFragmentById(R.id.navigation_drawer);
+ mTitle = getTitle();
+
+ // Set up the drawer.
+ mNavigationDrawerFragment.setUp(
+ R.id.navigation_drawer,
+ (DrawerLayout) findViewById(R.id.drawer_layout));
+ }
+
+ @Override
+ public void onNavigationDrawerItemSelected(int position) {
+ // update the main content by replacing fragments
+ FragmentManager fragmentManager = get${Support}FragmentManager();
+ fragmentManager.beginTransaction()
+ .replace(R.id.container, PlaceholderFragment.newInstance(position + 1))
+ .commit();
+ }
+
+ public void onSectionAttached(int number) {
+ switch (number) {
+ case 1:
+ mTitle = getString(R.string.title_section1);
+ break;
+ case 2:
+ mTitle = getString(R.string.title_section2);
+ break;
+ case 3:
+ mTitle = getString(R.string.title_section3);
+ break;
+ }
+ }
+
+ public void restoreActionBar() {
+ ActionBar actionBar = get${Support}ActionBar();
+ actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
+ actionBar.setDisplayShowTitleEnabled(true);
+ actionBar.setTitle(mTitle);
+ }
+
+ <#include "include_options_menu.java.ftl">
+
+ <#include "include_fragment.java.ftl">
+
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/src/app_package/NavigationDrawerFragment.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/src/app_package/NavigationDrawerFragment.java.ftl
new file mode 100644
index 0000000..cb0f2c5
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/src/app_package/NavigationDrawerFragment.java.ftl
@@ -0,0 +1,282 @@
+package ${packageName};
+
+<#if appCompat>import android.support.v7.app.ActionBarActivity;</#if>
+import android.app.Activity;
+import android.<#if appCompat>support.v7.</#if>app.ActionBar;
+import android.<#if appCompat>support.v4.</#if>app.Fragment;
+import android.support.v4.app.ActionBarDrawerToggle;
+import android.support.v4.view.GravityCompat;
+import android.support.v4.widget.DrawerLayout;
+import android.content.SharedPreferences;
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.preference.PreferenceManager;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+import android.widget.Toast;
+
+/**
+ * Fragment used for managing interactions for and presentation of a navigation drawer.
+ * See the <a href="https://developer.android.com/design/patterns/navigation-drawer.html#Interaction">
+ * design guidelines</a> for a complete explanation of the behaviors implemented here.
+ */
+public class NavigationDrawerFragment extends Fragment {
+
+ /**
+ * Remember the position of the selected item.
+ */
+ private static final String STATE_SELECTED_POSITION = "selected_navigation_drawer_position";
+
+ /**
+ * Per the design guidelines, you should show the drawer on launch until the user manually
+ * expands it. This shared preference tracks this.
+ */
+ private static final String PREF_USER_LEARNED_DRAWER = "navigation_drawer_learned";
+
+ /**
+ * A pointer to the current callbacks instance (the Activity).
+ */
+ private NavigationDrawerCallbacks mCallbacks;
+
+ /**
+ * Helper component that ties the action bar to the navigation drawer.
+ */
+ private ActionBarDrawerToggle mDrawerToggle;
+
+ private DrawerLayout mDrawerLayout;
+ private ListView mDrawerListView;
+ private View mFragmentContainerView;
+
+ private int mCurrentSelectedPosition = 0;
+ private boolean mFromSavedInstanceState;
+ private boolean mUserLearnedDrawer;
+
+ public NavigationDrawerFragment() {
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // Read in the flag indicating whether or not the user has demonstrated awareness of the
+ // drawer. See PREF_USER_LEARNED_DRAWER for details.
+ SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity());
+ mUserLearnedDrawer = sp.getBoolean(PREF_USER_LEARNED_DRAWER, false);
+
+ if (savedInstanceState != null) {
+ mCurrentSelectedPosition = savedInstanceState.getInt(STATE_SELECTED_POSITION);
+ mFromSavedInstanceState = true;
+ }
+
+ // Select either the default item (0) or the last selected item.
+ selectItem(mCurrentSelectedPosition);
+ }
+
+ @Override
+ public void onActivityCreated (Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ // Indicate that this fragment would like to influence the set of actions in the action bar.
+ setHasOptionsMenu(true);
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ mDrawerListView = (ListView) inflater.inflate(
+ R.layout.${navigationDrawerLayout}, container, false);
+ mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ selectItem(position);
+ }
+ });
+ mDrawerListView.setAdapter(new ArrayAdapter<String>(
+ getActionBar().getThemedContext(),
+ android.R.layout.simple_list_item_<#if minApiLevel gte 11>activated_</#if>1,
+ android.R.id.text1,
+ new String[]{
+ getString(R.string.title_section1),
+ getString(R.string.title_section2),
+ getString(R.string.title_section3),
+ }));
+ mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);
+ return mDrawerListView;
+ }
+
+ public boolean isDrawerOpen() {
+ return mDrawerLayout != null && mDrawerLayout.isDrawerOpen(mFragmentContainerView);
+ }
+
+ /**
+ * Users of this fragment must call this method to set up the navigation drawer interactions.
+ *
+ * @param fragmentId The android:id of this fragment in its activity's layout.
+ * @param drawerLayout The DrawerLayout containing this fragment's UI.
+ */
+ public void setUp(int fragmentId, DrawerLayout drawerLayout) {
+ mFragmentContainerView = getActivity().findViewById(fragmentId);
+ mDrawerLayout = drawerLayout;
+
+ // set a custom shadow that overlays the main content when the drawer opens
+ mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
+ // set up the drawer's list view with items and click listener
+
+ ActionBar actionBar = getActionBar();
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ actionBar.setHomeButtonEnabled(true);
+
+ // ActionBarDrawerToggle ties together the the proper interactions
+ // between the navigation drawer and the action bar app icon.
+ mDrawerToggle = new ActionBarDrawerToggle(
+ getActivity(), /* host Activity */
+ mDrawerLayout, /* DrawerLayout object */
+ R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */
+ R.string.navigation_drawer_open, /* "open drawer" description for accessibility */
+ R.string.navigation_drawer_close /* "close drawer" description for accessibility */
+ ) {
+ @Override
+ public void onDrawerClosed(View drawerView) {
+ super.onDrawerClosed(drawerView);
+ if (!isAdded()) {
+ return;
+ }
+
+ getActivity().${appCompat?string('supportInvalidate','invalidate')}OptionsMenu(); // calls onPrepareOptionsMenu()
+ }
+
+ @Override
+ public void onDrawerOpened(View drawerView) {
+ super.onDrawerOpened(drawerView);
+ if (!isAdded()) {
+ return;
+ }
+
+ if (!mUserLearnedDrawer) {
+ // The user manually opened the drawer; store this flag to prevent auto-showing
+ // the navigation drawer automatically in the future.
+ mUserLearnedDrawer = true;
+ SharedPreferences sp = PreferenceManager
+ .getDefaultSharedPreferences(getActivity());
+ sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).${(minApiLevel gte 9)?string('apply','commit')}();
+ }
+
+ getActivity().${appCompat?string('supportInvalidate','invalidate')}OptionsMenu(); // calls onPrepareOptionsMenu()
+ }
+ };
+
+ // If the user hasn't 'learned' about the drawer, open it to introduce them to the drawer,
+ // per the navigation drawer design guidelines.
+ if (!mUserLearnedDrawer && !mFromSavedInstanceState) {
+ mDrawerLayout.openDrawer(mFragmentContainerView);
+ }
+
+ // Defer code dependent on restoration of previous instance state.
+ mDrawerLayout.post(new Runnable() {
+ @Override
+ public void run() {
+ mDrawerToggle.syncState();
+ }
+ });
+
+ mDrawerLayout.setDrawerListener(mDrawerToggle);
+ }
+
+ private void selectItem(int position) {
+ mCurrentSelectedPosition = position;
+ if (mDrawerListView != null) {
+ mDrawerListView.setItemChecked(position, true);
+ }
+ if (mDrawerLayout != null) {
+ mDrawerLayout.closeDrawer(mFragmentContainerView);
+ }
+ if (mCallbacks != null) {
+ mCallbacks.onNavigationDrawerItemSelected(position);
+ }
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ try {
+ mCallbacks = (NavigationDrawerCallbacks) activity;
+ } catch (ClassCastException e) {
+ throw new ClassCastException("Activity must implement NavigationDrawerCallbacks.");
+ }
+ }
+
+ @Override
+ public void onDetach() {
+ super.onDetach();
+ mCallbacks = null;
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition);
+ }
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ // Forward the new configuration the drawer toggle component.
+ mDrawerToggle.onConfigurationChanged(newConfig);
+ }
+
+ @Override
+ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+ // If the drawer is open, show the global app actions in the action bar. See also
+ // showGlobalContextActionBar, which controls the top-left area of the action bar.
+ if (mDrawerLayout != null && isDrawerOpen()) {
+ inflater.inflate(R.menu.global, menu);
+ showGlobalContextActionBar();
+ }
+ super.onCreateOptionsMenu(menu, inflater);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (mDrawerToggle.onOptionsItemSelected(item)) {
+ return true;
+ }
+
+ if (item.getItemId() == R.id.action_example) {
+ Toast.makeText(getActivity(), "Example action.", Toast.LENGTH_SHORT).show();
+ return true;
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+
+ /**
+ * Per the navigation drawer design guidelines, updates the action bar to show the global app
+ * 'context', rather than just what's in the current screen.
+ */
+ private void showGlobalContextActionBar() {
+ ActionBar actionBar = getActionBar();
+ actionBar.setDisplayShowTitleEnabled(true);
+ actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
+ actionBar.setTitle(R.string.app_name);
+ }
+
+ private ActionBar getActionBar() {
+ return <#if appCompat>((ActionBarActivity) getActivity()).getSupportActionBar();<#else>getActivity().getActionBar();</#if>
+ }
+
+ /**
+ * Callbacks interface that all activities using this fragment must implement.
+ */
+ public static interface NavigationDrawerCallbacks {
+ /**
+ * Called when an item in the navigation drawer is selected.
+ */
+ void onNavigationDrawerItemSelected(int position);
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/src/app_package/include_fragment.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/src/app_package/include_fragment.java.ftl
new file mode 100644
index 0000000..57ae492
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/src/app_package/include_fragment.java.ftl
@@ -0,0 +1,43 @@
+ /**
+ * A placeholder fragment containing a simple view.
+ */
+ public static class PlaceholderFragment extends Fragment {
+ /**
+ * The fragment argument representing the section number for this
+ * fragment.
+ */
+ private static final String ARG_SECTION_NUMBER = "section_number";
+
+ /**
+ * Returns a new instance of this fragment for the given section
+ * number.
+ */
+ public static PlaceholderFragment newInstance(int sectionNumber) {
+ PlaceholderFragment fragment = new PlaceholderFragment();
+ Bundle args = new Bundle();
+ args.putInt(ARG_SECTION_NUMBER, sectionNumber);
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ public PlaceholderFragment() {
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View rootView = inflater.inflate(R.layout.${fragmentLayoutName}, container, false);
+ <#if hasSections?has_content>
+ TextView textView = (TextView) rootView.findViewById(R.id.section_label);
+ textView.setText(Integer.toString(getArguments().getInt(ARG_SECTION_NUMBER)));
+ </#if>
+ return rootView;
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ ((${activityClass}) activity).onSectionAttached(
+ getArguments().getInt(ARG_SECTION_NUMBER));
+ }
+ }
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/src/app_package/include_options_menu.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/src/app_package/include_options_menu.java.ftl
new file mode 100644
index 0000000..8166367
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/root/src/app_package/include_options_menu.java.ftl
@@ -0,0 +1,25 @@
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ if (!mNavigationDrawerFragment.isDrawerOpen()) {
+ // Only show items in the action bar relevant to this screen
+ // if the drawer is not showing. Otherwise, let the drawer
+ // decide what to show in the action bar.
+ getMenuInflater().inflate(R.menu.${menuName}, menu);
+ restoreActionBar();
+ return true;
+ }
+ return super.onCreateOptionsMenu(menu);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ // Handle action bar item clicks here. The action bar will
+ // automatically handle clicks on the Home/Up button, so long
+ // as you specify a parent activity in AndroidManifest.xml.
+ int id = item.getItemId();
+ if (id == R.id.action_settings) {
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/template.xml
new file mode 100644
index 0000000..9329c7b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/template.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0"?>
+<template
+ format="3"
+ revision="4"
+ name="Navigation Drawer Activity"
+ minApi="7"
+ minBuildApi="14"
+ description="Creates a new Activity with a Navigation Drawer.">
+
+ <category value="Activity" />
+ <formfactor value="Mobile" />
+
+ <parameter
+ id="activityClass"
+ name="Activity Name"
+ type="string"
+ constraints="class|unique|nonempty"
+ suggest="${layoutToActivity(layoutName)}"
+ default="MainActivity"
+ help="The name of the activity class to create" />
+
+ <parameter
+ id="layoutName"
+ name="Layout Name"
+ type="string"
+ constraints="layout|unique|nonempty"
+ suggest="${activityToLayout(activityClass)}"
+ default="activity_main"
+ help="The name of the layout to create for the activity" />
+
+ <parameter
+ id="fragmentLayoutName"
+ name="Fragment Layout Name"
+ type="string"
+ constraints="layout|unique|nonempty"
+ suggest="fragment_${classToResource(activityClass)}"
+ default="fragment_main"
+ help="The name of the layout to create for the activity's content fragment"/>
+
+ <parameter
+ id="activityTitle"
+ name="Title"
+ type="string"
+ constraints="nonempty"
+ default="MainActivity"
+ suggest="${activityClass}"
+ help="The name of the activity. For launcher activities, the application title." />
+
+ <parameter
+ id="isLauncher"
+ name="Launcher Activity"
+ type="boolean"
+ default="false"
+ help="If true, this activity will have a CATEGORY_LAUNCHER intent filter, making it visible in the launcher" />
+
+ <parameter
+ id="parentActivityClass"
+ name="Hierarchical Parent"
+ type="string"
+ constraints="activity|exists|empty"
+ default=""
+ help="The hierarchical parent activity, used to provide a default implementation for the 'Up' button" />
+
+ <parameter
+ id="packageName"
+ name="Package name"
+ type="string"
+ constraints="package"
+ default="com.mycompany.myapp" />
+
+ <parameter
+ id="navigationDrawerLayout"
+ name="Navigation Drawer Fragment Name"
+ type="string"
+ constraints="layout|unique"
+ default="fragment_navigation_drawer"/>
+
+ <!-- 128x128 thumbnails relative to template.xml -->
+ <thumbs>
+ <!-- default thumbnail is required -->
+ <thumb>template_blank_activity_drawer.png</thumb>
+ </thumbs>
+
+ <globals file="globals.xml.ftl" />
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/template_blank_activity_drawer.png b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/template_blank_activity_drawer.png
new file mode 100644
index 0000000..25ab6bc
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/NavigationDrawerActivity/template_blank_activity_drawer.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/globals.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/globals.xml.ftl
new file mode 100644
index 0000000..81a41ba
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/globals.xml.ftl
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<globals>
+ <global id="projectOut" value="." />
+ <global id="manifestOut" value="${manifestDir}" />
+ <global id="srcOut" value="${srcDir}/${slashedPackageName(packageName)}" />
+ <global id="resOut" value="${resDir}" />
+ <global id="simpleName" value="${activityToLayout(activityClass)}" />
+ <global id="relativePackage" value="<#if relativePackage?has_content>${relativePackage}<#else>${packageName}</#if>" />
+</globals>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/recipe.xml.ftl
new file mode 100644
index 0000000..060d7b3
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/recipe.xml.ftl
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<recipe>
+ <dependency mavenUrl="com.android.support:support-v4:19.+" />
+
+ <merge from="AndroidManifest.xml.ftl"
+ to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />
+
+ <copy from="res/xml/pref_data_sync.xml"
+ to="${escapeXmlAttribute(resOut)}/xml/pref_data_sync.xml" />
+ <copy from="res/xml/pref_general.xml"
+ to="${escapeXmlAttribute(resOut)}/xml/pref_general.xml" />
+ <merge from="res/xml/pref_headers.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/xml/pref_headers.xml" />
+ <copy from="res/xml/pref_notification.xml"
+ to="${escapeXmlAttribute(resOut)}/xml/pref_notification.xml" />
+
+ <instantiate from="res/values/strings.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values/strings_${simpleName}.xml" />
+
+ <instantiate from="src/app_package/SettingsActivity.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />
+
+ <open file="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/AndroidManifest.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/AndroidManifest.xml.ftl
new file mode 100644
index 0000000..b0048b2
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/AndroidManifest.xml.ftl
@@ -0,0 +1,18 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <application>
+ <activity android:name="${relativePackage}.${activityClass}"
+ <#if isNewProject>
+ android:label="@string/app_name"
+ <#else>
+ android:label="@string/title_${simpleName}"
+ </#if>
+ <#if buildApi gte 16 && parentActivityClass != "">android:parentActivityName="${parentActivityClass}"</#if>>
+ <#if parentActivityClass != "">
+ <meta-data android:name="android.support.PARENT_ACTIVITY"
+ android:value="${parentActivityClass}" />
+ </#if>
+ </activity>
+ </application>
+
+</manifest>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/res/values/strings.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/res/values/strings.xml.ftl
new file mode 100644
index 0000000..8dc52ac
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/res/values/strings.xml.ftl
@@ -0,0 +1,61 @@
+<resources>
+ <#if !isNewProject>
+ <string name="title_${simpleName}">${escapeXmlString(activityTitle)}</string>
+ </#if>
+
+ <!-- Strings related to Settings -->
+
+ <!-- Example General settings -->
+ <string name="pref_header_general">General</string>
+
+ <string name="pref_title_social_recommendations">Enable social recommendations</string>
+ <string name="pref_description_social_recommendations">Recommendations for people to contact based on your message history</string>
+
+ <string name="pref_title_display_name">Display name</string>
+ <string name="pref_default_display_name">John Smith</string>
+
+ <string name="pref_title_add_friends_to_messages">Add friends to messages</string>
+ <string-array name="pref_example_list_titles">
+ <item>Always</item>
+ <item>When possible</item>
+ <item>Never</item>
+ </string-array>
+ <string-array name="pref_example_list_values">
+ <item>1</item>
+ <item>0</item>
+ <item>-1</item>
+ </string-array>
+
+ <!-- Example settings for Data & Sync -->
+ <string name="pref_header_data_sync">Data &amp; sync</string>
+
+ <string name="pref_title_sync_frequency">Sync frequency</string>
+ <string-array name="pref_sync_frequency_titles">
+ <item>15 minutes</item>
+ <item>30 minutes</item>
+ <item>1 hour</item>
+ <item>3 hours</item>
+ <item>6 hours</item>
+ <item>Never</item>
+ </string-array>
+ <string-array name="pref_sync_frequency_values">
+ <item>15</item>
+ <item>30</item>
+ <item>60</item>
+ <item>180</item>
+ <item>360</item>
+ <item>-1</item>
+ </string-array>
+
+ <string name="pref_title_system_sync_settings">System sync settings</string>
+
+ <!-- Example settings for Notifications -->
+ <string name="pref_header_notifications">Notifications</string>
+
+ <string name="pref_title_new_message_notifications">New message notifications</string>
+
+ <string name="pref_title_ringtone">Ringtone</string>
+ <string name="pref_ringtone_silent">Silent</string>
+
+ <string name="pref_title_vibrate">Vibrate</string>
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/res/xml/pref_data_sync.xml b/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/res/xml/pref_data_sync.xml
new file mode 100644
index 0000000..ffda831
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/res/xml/pref_data_sync.xml
@@ -0,0 +1,21 @@
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- NOTE: Hide buttons to simplify the UI. Users can touch outside the dialog to
+ dismiss it. -->
+ <!-- NOTE: ListPreference's summary should be set to its value by the activity code. -->
+ <ListPreference
+ android:key="sync_frequency"
+ android:title="@string/pref_title_sync_frequency"
+ android:entries="@array/pref_sync_frequency_titles"
+ android:entryValues="@array/pref_sync_frequency_values"
+ android:defaultValue="180"
+ android:negativeButtonText="@null"
+ android:positiveButtonText="@null" />
+
+ <!-- This preference simply launches an intent when selected. Use this UI sparingly, per
+ design guidelines. -->
+ <Preference android:title="@string/pref_title_system_sync_settings">
+ <intent android:action="android.settings.SYNC_SETTINGS" />
+ </Preference>
+
+</PreferenceScreen>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/res/xml/pref_general.xml b/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/res/xml/pref_general.xml
new file mode 100644
index 0000000..c49cbed
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/res/xml/pref_general.xml
@@ -0,0 +1,33 @@
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <CheckBoxPreference
+ android:key="example_checkbox"
+ android:title="@string/pref_title_social_recommendations"
+ android:summary="@string/pref_description_social_recommendations"
+ android:defaultValue="true" />
+
+ <!-- NOTE: EditTextPreference accepts EditText attributes. -->
+ <!-- NOTE: EditTextPreference's summary should be set to its value by the activity code. -->
+ <EditTextPreference
+ android:key="example_text"
+ android:title="@string/pref_title_display_name"
+ android:defaultValue="@string/pref_default_display_name"
+ android:selectAllOnFocus="true"
+ android:inputType="textCapWords"
+ android:capitalize="words"
+ android:singleLine="true"
+ android:maxLines="1" />
+
+ <!-- NOTE: Hide buttons to simplify the UI. Users can touch outside the dialog to
+ dismiss it. -->
+ <!-- NOTE: ListPreference's summary should be set to its value by the activity code. -->
+ <ListPreference
+ android:key="example_list"
+ android:title="@string/pref_title_add_friends_to_messages"
+ android:defaultValue="-1"
+ android:entries="@array/pref_example_list_titles"
+ android:entryValues="@array/pref_example_list_values"
+ android:negativeButtonText="@null"
+ android:positiveButtonText="@null" />
+
+</PreferenceScreen>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/res/xml/pref_headers.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/res/xml/pref_headers.xml.ftl
new file mode 100644
index 0000000..a3da325
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/res/xml/pref_headers.xml.ftl
@@ -0,0 +1,17 @@
+<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- These settings headers are only used on tablets. -->
+
+ <header
+ android:fragment="${packageName}.${activityClass}$GeneralPreferenceFragment"
+ android:title="@string/pref_header_general" />
+
+ <header
+ android:fragment="${packageName}.${activityClass}$NotificationPreferenceFragment"
+ android:title="@string/pref_header_notifications" />
+
+ <header
+ android:fragment="${packageName}.${activityClass}$DataSyncPreferenceFragment"
+ android:title="@string/pref_header_data_sync" />
+
+</preference-headers>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/res/xml/pref_notification.xml b/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/res/xml/pref_notification.xml
new file mode 100644
index 0000000..b4b8cae
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/res/xml/pref_notification.xml
@@ -0,0 +1,27 @@
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <!-- A 'parent' preference, which enables/disables child preferences (below)
+ when checked/unchecked. -->
+ <CheckBoxPreference
+ android:key="notifications_new_message"
+ android:title="@string/pref_title_new_message_notifications"
+ android:defaultValue="true" />
+
+ <!-- Allows the user to choose a ringtone in the 'notification' category. -->
+ <!-- NOTE: This preference will be enabled only when the checkbox above is checked. -->
+ <!-- NOTE: RingtonePreference's summary should be set to its value by the activity code. -->
+ <RingtonePreference
+ android:dependency="notifications_new_message"
+ android:key="notifications_new_message_ringtone"
+ android:title="@string/pref_title_ringtone"
+ android:ringtoneType="notification"
+ android:defaultValue="content://settings/system/notification_sound" />
+
+ <!-- NOTE: This preference will be enabled only when the checkbox above is checked. -->
+ <CheckBoxPreference
+ android:dependency="notifications_new_message"
+ android:key="notifications_new_message_vibrate"
+ android:title="@string/pref_title_vibrate"
+ android:defaultValue="true" />
+
+</PreferenceScreen>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/src/app_package/SettingsActivity.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/src/app_package/SettingsActivity.java.ftl
new file mode 100644
index 0000000..70deb61
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/root/src/app_package/SettingsActivity.java.ftl
@@ -0,0 +1,296 @@
+package ${packageName};
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.res.Configuration;
+import android.media.Ringtone;
+import android.media.RingtoneManager;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.preference.ListPreference;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceCategory;
+import android.preference.PreferenceFragment;
+import android.preference.PreferenceManager;
+import android.preference.RingtonePreference;
+import android.text.TextUtils;
+<#if parentActivityClass != "">
+import android.view.MenuItem;
+import android.support.v4.app.NavUtils;
+</#if>
+<#if applicationPackage??>import ${applicationPackage}.R;</#if>
+
+import java.util.List;
+
+/**
+ * A {@link PreferenceActivity} that presents a set of application settings. On
+ * handset devices, settings are presented as a single list. On tablets,
+ * settings are split by category, with category headers shown to the left of
+ * the list of settings.
+ * <p>
+ * See <a href="http://developer.android.com/design/patterns/settings.html">
+ * Android Design: Settings</a> for design guidelines and the <a
+ * href="http://developer.android.com/guide/topics/ui/settings.html">Settings
+ * API Guide</a> for more information on developing a Settings UI.
+ */
+public class ${activityClass} extends PreferenceActivity {
+ /**
+ * Determines whether to always show the simplified settings UI, where
+ * settings are presented in a single list. When false, settings are shown
+ * as a master/detail two-pane view on tablets. When true, a single pane is
+ * shown on tablets.
+ */
+ private static final boolean ALWAYS_SIMPLE_PREFS = false;
+
+ <#if parentActivityClass != "">
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setupActionBar();
+ }
+
+ /**
+ * Set up the {@link android.app.ActionBar}, if the API is available.
+ */
+ @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+ private void setupActionBar() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+ // Show the Up button in the action bar.
+ getActionBar().setDisplayHomeAsUpEnabled(true);
+ }
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ int id = item.getItemId();
+ if (id == android.R.id.home) {
+ // This ID represents the Home or Up button. In the case of this
+ // activity, the Up button is shown. Use NavUtils to allow users
+ // to navigate up one level in the application structure. For
+ // more details, see the Navigation pattern on Android Design:
+ //
+ // http://developer.android.com/design/patterns/navigation.html#up-vs-back
+ //
+ // TODO: If Settings has multiple levels, Up should navigate up
+ // that hierarchy.
+ NavUtils.navigateUpFromSameTask(this);
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+ </#if>
+
+ @Override
+ protected void onPostCreate(Bundle savedInstanceState) {
+ super.onPostCreate(savedInstanceState);
+
+ setupSimplePreferencesScreen();
+ }
+
+ /**
+ * Shows the simplified settings UI if the device configuration if the
+ * device configuration dictates that a simplified, single-pane UI should be
+ * shown.
+ */
+ private void setupSimplePreferencesScreen() {
+ if (!isSimplePreferences(this)) {
+ return;
+ }
+
+ // In the simplified UI, fragments are not used at all and we instead
+ // use the older PreferenceActivity APIs.
+
+ // Add 'general' preferences.
+ addPreferencesFromResource(R.xml.pref_general);
+
+ // Add 'notifications' preferences, and a corresponding header.
+ PreferenceCategory fakeHeader = new PreferenceCategory(this);
+ fakeHeader.setTitle(R.string.pref_header_notifications);
+ getPreferenceScreen().addPreference(fakeHeader);
+ addPreferencesFromResource(R.xml.pref_notification);
+
+ // Add 'data and sync' preferences, and a corresponding header.
+ fakeHeader = new PreferenceCategory(this);
+ fakeHeader.setTitle(R.string.pref_header_data_sync);
+ getPreferenceScreen().addPreference(fakeHeader);
+ addPreferencesFromResource(R.xml.pref_data_sync);
+
+ // Bind the summaries of EditText/List/Dialog/Ringtone preferences to
+ // their values. When their values change, their summaries are updated
+ // to reflect the new value, per the Android Design guidelines.
+ bindPreferenceSummaryToValue(findPreference("example_text"));
+ bindPreferenceSummaryToValue(findPreference("example_list"));
+ bindPreferenceSummaryToValue(findPreference("notifications_new_message_ringtone"));
+ bindPreferenceSummaryToValue(findPreference("sync_frequency"));
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public boolean onIsMultiPane() {
+ return isXLargeTablet(this) && !isSimplePreferences(this);
+ }
+
+ /**
+ * Helper method to determine if the device has an extra-large screen. For
+ * example, 10" tablets are extra-large.
+ */
+ private static boolean isXLargeTablet(Context context) {
+ return (context.getResources().getConfiguration().screenLayout
+ & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE;
+ }
+
+ /**
+ * Determines whether the simplified settings UI should be shown. This is
+ * true if this is forced via {@link #ALWAYS_SIMPLE_PREFS}, or the device
+ * doesn't have newer APIs like {@link PreferenceFragment}, or the device
+ * doesn't have an extra-large screen. In these cases, a single-pane
+ * "simplified" settings UI should be shown.
+ */
+ private static boolean isSimplePreferences(Context context) {
+ return ALWAYS_SIMPLE_PREFS
+ || Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB
+ || !isXLargeTablet(context);
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+ public void onBuildHeaders(List<Header> target) {
+ if (!isSimplePreferences(this)) {
+ loadHeadersFromResource(R.xml.pref_headers, target);
+ }
+ }
+
+ /**
+ * A preference value change listener that updates the preference's summary
+ * to reflect its new value.
+ */
+ private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object value) {
+ String stringValue = value.toString();
+
+ if (preference instanceof ListPreference) {
+ // For list preferences, look up the correct display value in
+ // the preference's 'entries' list.
+ ListPreference listPreference = (ListPreference) preference;
+ int index = listPreference.findIndexOfValue(stringValue);
+
+ // Set the summary to reflect the new value.
+ preference.setSummary(
+ index >= 0
+ ? listPreference.getEntries()[index]
+ : null);
+
+ } else if (preference instanceof RingtonePreference) {
+ // For ringtone preferences, look up the correct display value
+ // using RingtoneManager.
+ if (TextUtils.isEmpty(stringValue)) {
+ // Empty values correspond to 'silent' (no ringtone).
+ preference.setSummary(R.string.pref_ringtone_silent);
+
+ } else {
+ Ringtone ringtone = RingtoneManager.getRingtone(
+ preference.getContext(), Uri.parse(stringValue));
+
+ if (ringtone == null) {
+ // Clear the summary if there was a lookup error.
+ preference.setSummary(null);
+ } else {
+ // Set the summary to reflect the new ringtone display
+ // name.
+ String name = ringtone.getTitle(preference.getContext());
+ preference.setSummary(name);
+ }
+ }
+
+ } else {
+ // For all other preferences, set the summary to the value's
+ // simple string representation.
+ preference.setSummary(stringValue);
+ }
+ return true;
+ }
+ };
+
+ /**
+ * Binds a preference's summary to its value. More specifically, when the
+ * preference's value is changed, its summary (line of text below the
+ * preference title) is updated to reflect the value. The summary is also
+ * immediately updated upon calling this method. The exact display format is
+ * dependent on the type of preference.
+ *
+ * @see #sBindPreferenceSummaryToValueListener
+ */
+ private static void bindPreferenceSummaryToValue(Preference preference) {
+ // Set the listener to watch for value changes.
+ preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);
+
+ // Trigger the listener immediately with the preference's
+ // current value.
+ sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
+ PreferenceManager
+ .getDefaultSharedPreferences(preference.getContext())
+ .getString(preference.getKey(), ""));
+ }
+
+ /**
+ * This fragment shows general preferences only. It is used when the
+ * activity is showing a two-pane settings UI.
+ */
+ @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+ public static class GeneralPreferenceFragment extends PreferenceFragment {
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ addPreferencesFromResource(R.xml.pref_general);
+
+ // Bind the summaries of EditText/List/Dialog/Ringtone preferences
+ // to their values. When their values change, their summaries are
+ // updated to reflect the new value, per the Android Design
+ // guidelines.
+ bindPreferenceSummaryToValue(findPreference("example_text"));
+ bindPreferenceSummaryToValue(findPreference("example_list"));
+ }
+ }
+
+ /**
+ * This fragment shows notification preferences only. It is used when the
+ * activity is showing a two-pane settings UI.
+ */
+ @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+ public static class NotificationPreferenceFragment extends PreferenceFragment {
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ addPreferencesFromResource(R.xml.pref_notification);
+
+ // Bind the summaries of EditText/List/Dialog/Ringtone preferences
+ // to their values. When their values change, their summaries are
+ // updated to reflect the new value, per the Android Design
+ // guidelines.
+ bindPreferenceSummaryToValue(findPreference("notifications_new_message_ringtone"));
+ }
+ }
+
+ /**
+ * This fragment shows data and sync preferences only. It is used when the
+ * activity is showing a two-pane settings UI.
+ */
+ @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+ public static class DataSyncPreferenceFragment extends PreferenceFragment {
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ addPreferencesFromResource(R.xml.pref_data_sync);
+
+ // Bind the summaries of EditText/List/Dialog/Ringtone preferences
+ // to their values. When their values change, their summaries are
+ // updated to reflect the new value, per the Android Design
+ // guidelines.
+ bindPreferenceSummaryToValue(findPreference("sync_frequency"));
+ }
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/template.xml
new file mode 100644
index 0000000..cedb287
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/template.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0"?>
+<template
+ format="4"
+ revision="4"
+ name="Settings Activity"
+ description="Creates a new application settings activity that presents alternative layouts on handset and tablet-size screens."
+ minApi="4"
+ minBuildApi="11"
+ category="Activity">
+
+ <dependency name="android-support-v4" revision="8" />
+
+ <category value="Activity" />
+ <formfactor value="Mobile" />
+
+ <parameter
+ id="activityClass"
+ name="Activity Name"
+ type="string"
+ constraints="class|unique|nonempty"
+ default="SettingsActivity"
+ help="The name of the activity class to create" />
+
+ <parameter
+ id="activityTitle"
+ name="Title"
+ type="string"
+ constraints="nonempty"
+ default="Settings"
+ help="The name of the activity." />
+
+ <parameter
+ id="parentActivityClass"
+ name="Hierarchical Parent"
+ type="string"
+ constraints="activity|exists|empty"
+ default=""
+ help="The hierarchical parent activity, used to provide a default implementation for the 'Up' button" />
+
+ <parameter
+ id="packageName"
+ name="Package name"
+ type="string"
+ constraints="package"
+ default="com.mycompany.myapp" />
+
+ <!-- 128x128 thumbnails relative to template.xml -->
+ <thumbs>
+ <!-- default thumbnail is required -->
+ <thumb>template_settings_activity.png</thumb>
+ </thumbs>
+
+ <globals file="globals.xml.ftl" />
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/template_settings_activity.png b/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/template_settings_activity.png
new file mode 100644
index 0000000..c1a65cb
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/SettingsActivity/template_settings_activity.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/globals.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/globals.xml.ftl
new file mode 100644
index 0000000..e1b7485
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/globals.xml.ftl
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<globals>
+ <global id="manifestOut" value="${manifestDir}" />
+ <global id="appCompat" type="boolean" value="${(minApiLevel lt 14)?string}" />
+ <!-- e.g. getSupportActionBar vs. getActionBar -->
+ <global id="Support" value="${(minApiLevel lt 14)?string('Support','')}" />
+ <global id="hasViewPager" type="boolean" value="${(features == 'pager' || features == 'tabs')?string}" />
+ <global id="srcOut" value="${srcDir}/${slashedPackageName(packageName)}" />
+ <global id="resOut" value="${resDir}" />
+ <global id="menuName" value="${classToResource(activityClass)}" />
+ <global id="relativePackage" value="<#if relativePackage?has_content>${relativePackage}<#else>${packageName}</#if>" />
+</globals>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/recipe.xml.ftl
new file mode 100644
index 0000000..72966fd
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/recipe.xml.ftl
@@ -0,0 +1,47 @@
+<?xml version="1.0"?>
+<recipe>
+
+ <#if appCompat><dependency mavenUrl="com.android.support:appcompat-v7:19.+"/></#if>
+ <#if !appCompat && hasViewPager><dependency mavenUrl="com.android.support:support-v13:19.+"/></#if>
+
+ <merge from="AndroidManifest.xml.ftl"
+ to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />
+
+ <instantiate from="res/menu/main.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/menu/${menuName}.xml" />
+
+ <merge from="res/values/strings.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values/strings.xml" />
+
+ <merge from="res/values/dimens.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values/dimens.xml" />
+ <merge from="res/values-w820dp/dimens.xml"
+ to="${escapeXmlAttribute(resOut)}/values-w820dp/dimens.xml" />
+
+ <!-- Decide what kind of layout(s) to add -->
+ <#if hasViewPager>
+ <instantiate from="res/layout/activity_pager.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml" />
+
+ <#else>
+ <instantiate from="res/layout/activity_fragment_container.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml" />
+ </#if>
+
+ <instantiate from="res/layout/fragment_simple.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/layout/${fragmentLayoutName}.xml" />
+
+ <!-- Decide which activity code to add -->
+ <#if features == "tabs" || features == "pager">
+ <instantiate from="src/app_package/TabsAndPagerActivity.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />
+
+ <#elseif features == "spinner">
+ <instantiate from="src/app_package/DropdownActivity.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />
+
+ </#if>
+
+ <open file="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />
+ <open file="${escapeXmlAttribute(resOut)}/layout/${fragmentLayoutName}.xml" />
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/AndroidManifest.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/AndroidManifest.xml.ftl
new file mode 100644
index 0000000..af1d2d6
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/AndroidManifest.xml.ftl
@@ -0,0 +1,24 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <application>
+ <activity android:name="${relativePackage}.${activityClass}"
+ <#if isNewProject>
+ android:label="@string/app_name"
+ <#else>
+ android:label="@string/title_${activityToLayout(activityClass)}"
+ </#if>
+ <#if buildApi gte 16 && parentActivityClass != "">android:parentActivityName="${parentActivityClass}"</#if>>
+ <#if parentActivityClass != "">
+ <meta-data android:name="android.support.PARENT_ACTIVITY"
+ android:value="${parentActivityClass}" />
+ </#if>
+ <#if isLauncher>
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </#if>
+ </activity>
+ </application>
+
+</manifest>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/layout/activity_fragment_container.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/layout/activity_fragment_container.xml.ftl
new file mode 100644
index 0000000..92b2b62
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/layout/activity_fragment_container.xml.ftl
@@ -0,0 +1,7 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/container"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context="${relativePackage}.${activityClass}"
+ tools:ignore="MergeRootFrame" />
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/layout/activity_pager.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/layout/activity_pager.xml.ftl
new file mode 100644
index 0000000..e296a03
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/layout/activity_pager.xml.ftl
@@ -0,0 +1,6 @@
+<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/pager"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context="${relativePackage}.${activityClass}" />
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/layout/fragment_simple.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/layout/fragment_simple.xml.ftl
new file mode 100644
index 0000000..6fa8741
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/layout/fragment_simple.xml.ftl
@@ -0,0 +1,16 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingLeft="@dimen/activity_horizontal_margin"
+ android:paddingRight="@dimen/activity_horizontal_margin"
+ android:paddingTop="@dimen/activity_vertical_margin"
+ android:paddingBottom="@dimen/activity_vertical_margin"
+ tools:context="${relativePackage}.${activityClass}$PlaceholderFragment">
+
+ <TextView
+ <#if hasViewPager>android:id="@+id/section_label"<#else>android:text="@string/hello_world"</#if>
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
+</RelativeLayout>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/menu/main.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/menu/main.xml.ftl
new file mode 100644
index 0000000..27f6aaa
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/menu/main.xml.ftl
@@ -0,0 +1,9 @@
+<menu xmlns:android="http://schemas.android.com/apk/res/android"<#if appCompat>
+ xmlns:app="http://schemas.android.com/apk/res-auto"</#if>
+ xmlns:tools="http://schemas.android.com/tools"
+ tools:context="${relativePackage}.${activityClass}" >
+ <item android:id="@+id/action_settings"
+ android:title="@string/action_settings"
+ android:orderInCategory="100"
+ ${(appCompat)?string('app','android')}:showAsAction="never" />
+</menu>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/values-w820dp/dimens.xml b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/values-w820dp/dimens.xml
new file mode 100644
index 0000000..63fc816
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/values-w820dp/dimens.xml
@@ -0,0 +1,6 @@
+<resources>
+ <!-- Example customization of dimensions originally defined in res/values/dimens.xml
+ (such as screen margins) for screens with more than 820dp of available width. This
+ would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
+ <dimen name="activity_horizontal_margin">64dp</dimen>
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/values/dimens.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/values/dimens.xml.ftl
new file mode 100644
index 0000000..47c8224
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/values/dimens.xml.ftl
@@ -0,0 +1,5 @@
+<resources>
+ <!-- Default screen margins, per the Android Design guidelines. -->
+ <dimen name="activity_horizontal_margin">16dp</dimen>
+ <dimen name="activity_vertical_margin">16dp</dimen>
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/values/strings.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/values/strings.xml.ftl
new file mode 100644
index 0000000..8e9cef0
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/res/values/strings.xml.ftl
@@ -0,0 +1,14 @@
+<resources>
+ <#if !isNewProject>
+ <string name="title_${activityToLayout(activityClass)}">${escapeXmlString(activityTitle)}</string>
+ </#if>
+
+ <string name="title_section1">Section 1</string>
+ <string name="title_section2">Section 2</string>
+ <string name="title_section3">Section 3</string>
+
+ <string name="hello_world">Hello world!</string>
+
+ <string name="action_settings">Settings</string>
+
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/src/app_package/DropdownActivity.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/src/app_package/DropdownActivity.java.ftl
new file mode 100644
index 0000000..8f579a4
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/src/app_package/DropdownActivity.java.ftl
@@ -0,0 +1,86 @@
+package ${packageName};
+
+import <#if appCompat>android.support.v7.app.ActionBarActivity<#else>android.app.Activity</#if>;
+import android.<#if appCompat>support.v7.</#if>app.ActionBar;
+import android.<#if appCompat>support.v4.</#if>app.Fragment;
+import android.content.Context;
+import android.os.Build;
+import android.os.Bundle;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.TextView;
+<#if applicationPackage??>import ${applicationPackage}.R;</#if>
+
+public class ${activityClass} extends ${(appCompat)?string('ActionBar','')}Activity implements ActionBar.OnNavigationListener {
+
+ /**
+ * The serialization (saved instance state) Bundle key representing the
+ * current dropdown position.
+ */
+ private static final String STATE_SELECTED_NAVIGATION_ITEM = "selected_navigation_item";
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.${layoutName});
+
+ // Set up the action bar to show a dropdown list.
+ final ActionBar actionBar = get${Support}ActionBar();
+ actionBar.setDisplayShowTitleEnabled(false);
+ actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
+ <#if parentActivityClass != "">
+ // Show the Up button in the action bar.
+ actionBar.setDisplayHomeAsUpEnabled(true);
+ </#if>
+
+ // Set up the dropdown list navigation in the action bar.
+ actionBar.setListNavigationCallbacks(
+ // Specify a SpinnerAdapter to populate the dropdown list.
+ new ArrayAdapter<String>(
+ actionBar.getThemedContext(),
+ android.R.layout.simple_list_item_1,
+ android.R.id.text1,
+ new String[] {
+ getString(R.string.title_section1),
+ getString(R.string.title_section2),
+ getString(R.string.title_section3),
+ }),
+ this);
+ }
+
+ @Override
+ public void onRestoreInstanceState(Bundle savedInstanceState) {
+ // Restore the previously serialized current dropdown position.
+ if (savedInstanceState.containsKey(STATE_SELECTED_NAVIGATION_ITEM)) {
+ get${Support}ActionBar().setSelectedNavigationItem(
+ savedInstanceState.getInt(STATE_SELECTED_NAVIGATION_ITEM));
+ }
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ // Serialize the current dropdown position.
+ outState.putInt(STATE_SELECTED_NAVIGATION_ITEM,
+ get${Support}ActionBar().getSelectedNavigationIndex());
+ }
+
+ <#include "include_options_menu.java.ftl">
+
+ @Override
+ public boolean onNavigationItemSelected(int position, long id) {
+ // When the given dropdown item is selected, show its contents in the
+ // container view.
+ get${Support}FragmentManager().beginTransaction()
+ .replace(R.id.container, PlaceholderFragment.newInstance(position + 1))
+ .commit();
+ return true;
+ }
+
+ <#include "include_fragment.java.ftl">
+
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/src/app_package/TabsAndPagerActivity.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/src/app_package/TabsAndPagerActivity.java.ftl
new file mode 100644
index 0000000..dfa4786
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/src/app_package/TabsAndPagerActivity.java.ftl
@@ -0,0 +1,139 @@
+package ${packageName};
+
+import java.util.Locale;
+
+import <#if appCompat>android.support.v7.app.ActionBarActivity<#else>android.app.Activity</#if>;
+import android.<#if appCompat>support.v7.</#if>app.ActionBar;
+import android.<#if appCompat>support.v4.</#if>app.Fragment;
+import android.<#if appCompat>support.v4.</#if>app.FragmentManager;
+import android.<#if appCompat>support.v4.</#if>app.FragmentTransaction;
+import android.support.${(appCompat)?string('v4','v13')}.app.FragmentPagerAdapter;
+import android.os.Bundle;
+import android.support.v4.view.ViewPager;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+<#if applicationPackage??>import ${applicationPackage}.R;</#if>
+
+public class ${activityClass} extends ${(appCompat)?string('ActionBar','')}Activity<#if features == 'tabs'> implements ActionBar.TabListener</#if> {
+
+ /**
+ * The {@link android.support.v4.view.PagerAdapter} that will provide
+ * fragments for each of the sections. We use a
+ * {@link FragmentPagerAdapter} derivative, which will keep every
+ * loaded fragment in memory. If this becomes too memory intensive, it
+ * may be best to switch to a
+ * {@link android.support.${(appCompat)?string('v4','v13')}.app.FragmentStatePagerAdapter}.
+ */
+ SectionsPagerAdapter mSectionsPagerAdapter;
+
+ /**
+ * The {@link ViewPager} that will host the section contents.
+ */
+ ViewPager mViewPager;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.${layoutName});
+
+ <#if features == 'tabs'>
+ // Set up the action bar.
+ final ActionBar actionBar = get${Support}ActionBar();
+ actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);</#if>
+
+ // Create the adapter that will return a fragment for each of the three
+ // primary sections of the activity.
+ mSectionsPagerAdapter = new SectionsPagerAdapter(get${Support}FragmentManager());
+
+ // Set up the ViewPager with the sections adapter.
+ mViewPager = (ViewPager) findViewById(R.id.pager);
+ mViewPager.setAdapter(mSectionsPagerAdapter);
+
+ <#if features == 'tabs'>
+ // When swiping between different sections, select the corresponding
+ // tab. We can also use ActionBar.Tab#select() to do this if we have
+ // a reference to the Tab.
+ mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
+ @Override
+ public void onPageSelected(int position) {
+ actionBar.setSelectedNavigationItem(position);
+ }
+ });
+
+ // For each of the sections in the app, add a tab to the action bar.
+ for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
+ // Create a tab with text corresponding to the page title defined by
+ // the adapter. Also specify this Activity object, which implements
+ // the TabListener interface, as the callback (listener) for when
+ // this tab is selected.
+ actionBar.addTab(
+ actionBar.newTab()
+ .setText(mSectionsPagerAdapter.getPageTitle(i))
+ .setTabListener(this));
+ }
+ </#if>
+ }
+
+ <#include "include_options_menu.java.ftl">
+
+ <#if features == 'tabs'>@Override
+ public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
+ // When the given tab is selected, switch to the corresponding page in
+ // the ViewPager.
+ mViewPager.setCurrentItem(tab.getPosition());
+ }
+
+ @Override
+ public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
+ }
+
+ @Override
+ public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
+ }</#if>
+
+ /**
+ * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
+ * one of the sections/tabs/pages.
+ */
+ public class SectionsPagerAdapter extends FragmentPagerAdapter {
+
+ public SectionsPagerAdapter(FragmentManager fm) {
+ super(fm);
+ }
+
+ @Override
+ public Fragment getItem(int position) {
+ // getItem is called to instantiate the fragment for the given page.
+ // Return a PlaceholderFragment (defined as a static inner class below).
+ return PlaceholderFragment.newInstance(position + 1);
+ }
+
+ @Override
+ public int getCount() {
+ // Show 3 total pages.
+ return 3;
+ }
+
+ @Override
+ public CharSequence getPageTitle(int position) {
+ Locale l = Locale.getDefault();
+ switch (position) {
+ case 0:
+ return getString(R.string.title_section1).toUpperCase(l);
+ case 1:
+ return getString(R.string.title_section2).toUpperCase(l);
+ case 2:
+ return getString(R.string.title_section3).toUpperCase(l);
+ }
+ return null;
+ }
+ }
+
+ <#include "include_fragment.java.ftl">
+
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/src/app_package/include_fragment.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/src/app_package/include_fragment.java.ftl
new file mode 100644
index 0000000..f5c65b6
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/src/app_package/include_fragment.java.ftl
@@ -0,0 +1,36 @@
+ /**
+ * A placeholder fragment containing a simple view.
+ */
+ public static class PlaceholderFragment extends Fragment {
+ /**
+ * The fragment argument representing the section number for this
+ * fragment.
+ */
+ private static final String ARG_SECTION_NUMBER = "section_number";
+
+ /**
+ * Returns a new instance of this fragment for the given section
+ * number.
+ */
+ public static PlaceholderFragment newInstance(int sectionNumber) {
+ PlaceholderFragment fragment = new PlaceholderFragment();
+ Bundle args = new Bundle();
+ args.putInt(ARG_SECTION_NUMBER, sectionNumber);
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ public PlaceholderFragment() {
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View rootView = inflater.inflate(R.layout.${fragmentLayoutName}, container, false);
+ <#if hasSections?has_content>
+ TextView textView = (TextView) rootView.findViewById(R.id.section_label);
+ textView.setText(Integer.toString(getArguments().getInt(ARG_SECTION_NUMBER)));
+ </#if>
+ return rootView;
+ }
+ }
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/src/app_package/include_options_menu.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/src/app_package/include_options_menu.java.ftl
new file mode 100644
index 0000000..5c4bb95
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/root/src/app_package/include_options_menu.java.ftl
@@ -0,0 +1,19 @@
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ // Inflate the menu; this adds items to the action bar if it is present.
+ getMenuInflater().inflate(R.menu.${menuName}, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ // Handle action bar item clicks here. The action bar will
+ // automatically handle clicks on the Home/Up button, so long
+ // as you specify a parent activity in AndroidManifest.xml.
+ int id = item.getItemId();
+ if (id == R.id.action_settings) {
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/template.xml
new file mode 100644
index 0000000..8b0f806
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/template.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0"?>
+<template
+ format="3"
+ revision="4"
+ name="Tabbed Activity"
+ minApi="7"
+ minBuildApi="14"
+ description="Creates a new blank activity, with an action bar and navigational elements such as tabs or horizontal swipe.">
+
+ <category value="Activity" />
+ <formfactor value="Mobile" />
+
+ <parameter
+ id="activityClass"
+ name="Activity Name"
+ type="string"
+ constraints="class|unique|nonempty"
+ suggest="${layoutToActivity(layoutName)}"
+ default="MainActivity"
+ help="The name of the activity class to create" />
+
+ <parameter
+ id="layoutName"
+ name="Layout Name"
+ type="string"
+ constraints="layout|unique|nonempty"
+ suggest="${activityToLayout(activityClass)}"
+ default="activity_main"
+ help="The name of the layout to create for the activity" />
+
+ <parameter
+ id="fragmentLayoutName"
+ name="Fragment Layout Name"
+ type="string"
+ constraints="layout|unique|nonempty"
+ suggest="fragment_${classToResource(activityClass)}"
+ default="fragment_main"
+ help="The name of the layout to create for the activity's content fragment" />
+
+ <parameter
+ id="activityTitle"
+ name="Title"
+ type="string"
+ constraints="nonempty"
+ default="MainActivity"
+ suggest="${activityClass}"
+ help="The name of the activity. For launcher activities, the application title." />
+
+ <parameter
+ id="isLauncher"
+ name="Launcher Activity"
+ type="boolean"
+ default="false"
+ help="If true, this activity will have a CATEGORY_LAUNCHER intent filter, making it visible in the launcher" />
+
+ <parameter
+ id="parentActivityClass"
+ name="Hierarchical Parent"
+ type="string"
+ constraints="activity|exists|empty"
+ default=""
+ help="The hierarchical parent activity, used to provide a default implementation for the 'Up' button" />
+
+ <parameter
+ id="features"
+ name="Navigation Style"
+ type="enum"
+ default="pager"
+ help="Additional features to include, such as a fragment, swipe views, or a navigation drawer" >
+ <option id="pager">Swipe Views (ViewPager)</option>
+ <option id="tabs">Action Bar Tabs (with ViewPager)</option>
+ <option id="spinner">Action Bar Spinner</option>
+ </parameter>
+
+ <parameter
+ id="packageName"
+ name="Package name"
+ type="string"
+ constraints="package"
+ default="com.mycompany.myapp" />
+
+ <!-- 128x128 thumbnails relative to template.xml -->
+ <thumbs>
+ <!-- default thumbnail is required -->
+ <thumb>template_blank_activity_pager.png</thumb>
+ <!-- attributes act as selectors based on chosen parameters -->
+ <thumb features="tabs">template_blank_activity_tabs.png</thumb>
+ <thumb features="pager">template_blank_activity_pager.png</thumb>
+ <thumb features="spinner">template_blank_activity_dropdown.png</thumb>
+ </thumbs>
+
+ <globals file="globals.xml.ftl" />
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/template_blank_activity_dropdown.png b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/template_blank_activity_dropdown.png
new file mode 100644
index 0000000..6204340
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/template_blank_activity_dropdown.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/template_blank_activity_pager.png b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/template_blank_activity_pager.png
new file mode 100644
index 0000000..f0792e6
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/template_blank_activity_pager.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/template_blank_activity_tabs.png b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/template_blank_activity_tabs.png
new file mode 100644
index 0000000..e57460b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/activities/TabbedActivity/template_blank_activity_tabs.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/gradle/utils/dependencies.gradle.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/gradle/utils/dependencies.gradle.ftl
new file mode 100644
index 0000000..96bd373
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/gradle/utils/dependencies.gradle.ftl
@@ -0,0 +1,7 @@
+dependencies {
+<#if dependencyList?? >
+<#list dependencyList as dependency>
+compile '${dependency}'
+</#list>
+</#if>
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/gradle/wrapper/gradle/wrapper/gradle-wrapper.jar b/love2dToAPK/tools/tools/android-win/tools/templates/gradle/wrapper/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..8c0fb64
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/gradle/wrapper/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/gradle/wrapper/gradle/wrapper/gradle-wrapper.properties b/love2dToAPK/tools/tools/android-win/tools/templates/gradle/wrapper/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..1e61d1f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/gradle/wrapper/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed Apr 10 15:27:10 PDT 2013
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=http\://services.gradle.org/distributions/gradle-1.12-all.zip
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/gradle/wrapper/gradlew b/love2dToAPK/tools/tools/android-win/tools/templates/gradle/wrapper/gradlew
new file mode 100644
index 0000000..91a7e26
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/gradle/wrapper/gradlew
@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+ echo "$*"
+}
+
+die ( ) {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+esac
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
+if $cygwin ; then
+ [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+fi
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >&-
+APP_HOME="`pwd -P`"
+cd "$SAVED" >&-
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+ JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/gradle/wrapper/gradlew.bat b/love2dToAPK/tools/tools/android-win/tools/templates/gradle/wrapper/gradlew.bat
new file mode 100644
index 0000000..8a0b282
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/gradle/wrapper/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AidlFile/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/AidlFile/recipe.xml.ftl
new file mode 100644
index 0000000..ef6e31c
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AidlFile/recipe.xml.ftl
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<recipe>
+
+ <instantiate from="src/app_package/interface.aidl.ftl"
+ to="${escapeXmlAttribute(aidlOut)}/${slashedPackageName(packageName)}/${escapeXmlAttribute(interfaceName)}.aidl" />
+ <open file="${escapeXmlAttribute(aidlOut)}/${slashedPackageName(packageName)}/${escapeXmlAttribute(interfaceName)}.aidl" />
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AidlFile/root/src/app_package/interface.aidl.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/AidlFile/root/src/app_package/interface.aidl.ftl
new file mode 100644
index 0000000..4404cf2
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AidlFile/root/src/app_package/interface.aidl.ftl
@@ -0,0 +1,13 @@
+// ${interfaceName}.aidl
+package ${packageName};
+
+// Declare any non-default types here with import statements
+
+interface ${interfaceName} {
+ /**
+ * Demonstrates some basic types that you can use as parameters
+ * and return values in AIDL.
+ */
+ void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
+ double aDouble, String aString);
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AidlFile/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/AidlFile/template.xml
new file mode 100644
index 0000000..bd42e84
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AidlFile/template.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<template
+ format="4"
+ revision="1"
+ name="AIDL File"
+ description="Creates a new Android Interface Description Language file."
+ >
+
+ <category value="AIDL" />
+
+ <parameter
+ id="interfaceName"
+ name="Interface Name"
+ type="string"
+ constraints="class|unique|nonempty"
+ default="IMyAidlInterface"
+ help="Name of the Interface." />
+
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AidlFolder/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/AidlFolder/recipe.xml.ftl
new file mode 100644
index 0000000..93eef52
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AidlFolder/recipe.xml.ftl
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<recipe>
+
+ <#if remapFolder>
+ <mkdir at="${escapeXmlAttribute(projectOut)}/${escapeXmlAttribute(newLocation)}" />
+ <merge from="build.gradle.ftl"
+ to="${escapeXmlAttribute(projectOut)}/build.gradle" />
+ <#else>
+ <mkdir at="${escapeXmlAttribute(manifestOut)}/aidl/" />
+ </#if>
+
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AidlFolder/root/build.gradle.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/AidlFolder/root/build.gradle.ftl
new file mode 100644
index 0000000..0cd590d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AidlFolder/root/build.gradle.ftl
@@ -0,0 +1 @@
+android {sourceSets {${sourceProviderName} {aidl.srcDirs=['src/${sourceProviderName}/aidl', '${newLocation}']}}} \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AidlFolder/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/AidlFolder/template.xml
new file mode 100644
index 0000000..6155f0e
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AidlFolder/template.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<template
+ format="4"
+ revision="2"
+ name="AIDL Folder"
+ description="Creates a source root for Android Interface Description Language files."
+ >
+
+ <category value="Folder" />
+
+ <parameter
+ id="remapFolder"
+ name="Change Folder Location"
+ type="boolean"
+ constraints=""
+ default="false"
+ help="Change the folder location to another folder within the module." />
+
+ <parameter
+ id="newLocation"
+ name="New Folder Location"
+ type="string"
+ constraints="nonempty|source_set_folder|unique"
+ suggest="src/${sourceProviderName}/aidl/"
+ help="The location for the new folder"
+ visibility="remapFolder" />
+
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AndroidManifest/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/AndroidManifest/recipe.xml.ftl
new file mode 100644
index 0000000..747c6b3
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AndroidManifest/recipe.xml.ftl
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<recipe>
+
+ <#if remapFile>
+ <merge from="AndroidManifest.xml.ftl"
+ to="${escapeXmlAttribute(projectOut)}/${escapeXmlAttribute(newLocation)}" />
+ <merge from="build.gradle.ftl"
+ to="${escapeXmlAttribute(projectOut)}/build.gradle" />
+ <#else>
+ <merge from="AndroidManifest.xml.ftl"
+ to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />
+ </#if>
+
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AndroidManifest/root/AndroidManifest.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/AndroidManifest/root/AndroidManifest.xml.ftl
new file mode 100644
index 0000000..14d5865
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AndroidManifest/root/AndroidManifest.xml.ftl
@@ -0,0 +1,8 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="${packageName}">
+
+ <application>
+
+ </application>
+
+</manifest>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AndroidManifest/root/build.gradle.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/AndroidManifest/root/build.gradle.ftl
new file mode 100644
index 0000000..218a0dd
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AndroidManifest/root/build.gradle.ftl
@@ -0,0 +1,3 @@
+android {sourceSets {${sourceProviderName} {
+manifest.srcFile '${newLocation}'
+}}} \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AndroidManifest/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/AndroidManifest/template.xml
new file mode 100644
index 0000000..afc0aaa
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AndroidManifest/template.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<template
+ format="4"
+ revision="2"
+ name="Android Manifest File"
+ description="Creates an Android Manifest XML File."
+ >
+
+ <category value="Other" />
+
+ <parameter
+ id="remapFile"
+ name="Change File Location"
+ type="boolean"
+ constraints=""
+ default="false"
+ help="Change the file location to another destination within the module." />
+
+ <parameter
+ id="newLocation"
+ name="New File Location"
+ type="string"
+ constraints="nonempty|source_set_folder|unique"
+ suggest="src/${sourceProviderName}/AndroidManifest.xml"
+ help="The location for the new file"
+ visibility="remapFile" />
+
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/globals.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/globals.xml.ftl
new file mode 100644
index 0000000..73289bc
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/globals.xml.ftl
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<globals>
+ <global id="manifestOut" value="${manifestDir}" />
+ <global id="srcOut" value="${srcDir}/${slashedPackageName(packageName)}" />
+ <global id="resOut" value="${resDir}" />
+ <global id="class_name" value="${camelCaseToUnderscore(className)}" />
+ <global id="relativePackage" value="<#if relativePackage?has_content>${relativePackage}<#else>${packageName}</#if>" />
+</globals>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/recipe.xml.ftl
new file mode 100644
index 0000000..5810eae
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/recipe.xml.ftl
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<recipe>
+
+ <merge from="AndroidManifest.xml.ftl"
+ to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />
+
+ <copy from="res/drawable-nodpi/example_appwidget_preview.png"
+ to="${escapeXmlAttribute(resOut)}/drawable-nodpi/example_appwidget_preview.png" />
+ <instantiate from="res/layout/appwidget.xml"
+ to="${escapeXmlAttribute(resOut)}/layout/${class_name}.xml" />
+
+ <#if configurable>
+ <instantiate from="res/layout/appwidget_configure.xml"
+ to="${escapeXmlAttribute(resOut)}/layout/${class_name}_configure.xml" />
+ </#if>
+
+ <instantiate from="res/xml/appwidget_info.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/xml/${class_name}_info.xml" />
+ <merge from="res/values/strings.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values/strings.xml" />
+ <merge from="res/values-v14/dimens.xml"
+ to="${escapeXmlAttribute(resOut)}/values-v14/dimens.xml" />
+ <merge from="res/values/dimens.xml"
+ to="${escapeXmlAttribute(resOut)}/values/dimens.xml" />
+
+ <instantiate from="src/app_package/AppWidget.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/${className}.java" />
+
+ <#if configurable>
+ <instantiate from="src/app_package/AppWidgetConfigureActivity.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/${className}ConfigureActivity.java" />
+ </#if>
+
+ <open file="${escapeXmlAttribute(srcOut)}/${className}.java" />
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/AndroidManifest.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/AndroidManifest.xml.ftl
new file mode 100644
index 0000000..698f3ba
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/AndroidManifest.xml.ftl
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <application>
+
+ <receiver android:name="${relativePackage}.${className}" >
+ <intent-filter>
+ <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
+ </intent-filter>
+
+ <meta-data
+ android:name="android.appwidget.provider"
+ android:resource="@xml/${class_name}_info" />
+ </receiver>
+
+ <#if configurable>
+ <activity android:name="${relativePackage}.${className}ConfigureActivity" >
+ <intent-filter>
+ <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
+ </intent-filter>
+ </activity>
+ </#if>
+ </application>
+
+</manifest>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/drawable-nodpi/example_appwidget_preview.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/drawable-nodpi/example_appwidget_preview.png
new file mode 100644
index 0000000..894b069
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/drawable-nodpi/example_appwidget_preview.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/layout/appwidget.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/layout/appwidget.xml
new file mode 100644
index 0000000..3a00464
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/layout/appwidget.xml
@@ -0,0 +1,21 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:padding="@dimen/widget_margin"
+ android:background="#09C" >
+
+ <TextView
+ android:id="@+id/appwidget_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerHorizontal="true"
+ android:layout_centerVertical="true"
+ android:text="@string/appwidget_text"
+ android:textColor="#ffffff"
+ android:textSize="24sp"
+ android:textStyle="bold|italic"
+ android:layout_margin="8dp"
+ android:contentDescription="@string/appwidget_text"
+ android:background="#09C"/>
+
+</RelativeLayout> \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/layout/appwidget_configure.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/layout/appwidget_configure.xml
new file mode 100644
index 0000000..8ddc335
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/layout/appwidget_configure.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:padding="16dp">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/configure"
+ android:layout_marginBottom="8dp" />
+
+ <EditText
+ android:id="@+id/appwidget_text"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:inputType="text" />
+
+ <Button
+ android:id="@+id/add_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/add_widget"
+ android:layout_marginTop="8dp" />
+
+</LinearLayout> \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/values-v14/dimens.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/values-v14/dimens.xml
new file mode 100644
index 0000000..4db8c59
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/values-v14/dimens.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!--
+Refer to App Widget Documentation for margin information
+http://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout
+ -->
+ <dimen name="widget_margin">0dp</dimen>
+
+</resources> \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/values/dimens.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/values/dimens.xml
new file mode 100644
index 0000000..fdececf
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/values/dimens.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+ <!--
+Refer to App Widget Documentation for margin information
+http://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout
+ -->
+ <dimen name="widget_margin">8dp</dimen>
+
+</resources> \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/values/strings.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/values/strings.xml.ftl
new file mode 100644
index 0000000..66c06bc
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/values/strings.xml.ftl
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <string name="appwidget_text">EXAMPLE</string>
+ <#if configurable>
+ <string name="configure">Configure</string>
+ </#if>
+ <string name="add_widget">Add widget</string>
+</resources> \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/xml/appwidget_info.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/xml/appwidget_info.xml.ftl
new file mode 100644
index 0000000..75791be
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/res/xml/appwidget_info.xml.ftl
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
+ android:minWidth="${-30 + 70 * minWidth?number}dp"
+ android:minHeight="${-30 + 70 * minHeight?number}dp"
+ android:updatePeriodMillis="86400000"
+ android:previewImage="@drawable/example_appwidget_preview"
+ android:initialLayout="@layout/${class_name}"
+<#if configurable>
+ android:configure="${packageName}.${className}ConfigureActivity"
+</#if>
+<#if resizable='both'>
+ android:resizeMode="horizontal|vertical"
+<#elseif resizable='horizontal'>
+ android:resizeMode="horizontal"
+<#elseif resizable='vertical'>
+ android:resizeMode="vertical"
+<#elseif resizable='none'>
+</#if>
+<#if placement='both'>
+ android:widgetCategory="home_screen|keyguard"
+<#elseif placement='homescreen'>
+ android:widgetCategory="home_screen"
+<#elseif placement='keyguard'>
+ android:widgetCategory="keyguard"
+</#if>
+ android:initialKeyguardLayout="@layout/${class_name}">
+</appwidget-provider> \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/src/app_package/AppWidget.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/src/app_package/AppWidget.java.ftl
new file mode 100644
index 0000000..60a1e08
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/src/app_package/AppWidget.java.ftl
@@ -0,0 +1,63 @@
+package ${packageName};
+
+import android.appwidget.AppWidgetManager;
+import android.appwidget.AppWidgetProvider;
+import android.content.Context;
+import android.widget.RemoteViews;
+<#if applicationPackage??>import ${applicationPackage}.R;</#if>
+
+/**
+ * Implementation of App Widget functionality.
+<#if configurable>
+ * App Widget Configuration implemented in {@link ${className}ConfigureActivity ${className}ConfigureActivity}
+</#if>
+ */
+public class ${className} extends AppWidgetProvider {
+
+ @Override
+ public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
+ // There may be multiple widgets active, so update all of them
+ final int N = appWidgetIds.length;
+ for (int i=0; i<N; i++) {
+ updateAppWidget(context, appWidgetManager, appWidgetIds[i]);
+ }
+ }
+
+<#if configurable>
+ @Override
+ public void onDeleted(Context context, int[] appWidgetIds) {
+ // When the user deletes the widget, delete the preference associated with it.
+ final int N = appWidgetIds.length;
+ for (int i=0; i<N; i++) {
+ ${className}ConfigureActivity.deleteTitlePref(context, appWidgetIds[i]);
+ }
+ }
+</#if>
+
+ @Override
+ public void onEnabled(Context context) {
+ // Enter relevant functionality for when the first widget is created
+ }
+
+ @Override
+ public void onDisabled(Context context) {
+ // Enter relevant functionality for when the last widget is disabled
+ }
+
+ static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
+ int appWidgetId) {
+
+<#if configurable>
+ CharSequence widgetText = ${className}ConfigureActivity.loadTitlePref(context, appWidgetId);
+<#else>
+ CharSequence widgetText = context.getString(R.string.appwidget_text);
+</#if>
+ // Construct the RemoteViews object
+ RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.${class_name});
+ views.setTextViewText(R.id.appwidget_text, widgetText);
+
+ // Instruct the widget manager to update the widget
+ appWidgetManager.updateAppWidget(appWidgetId, views);
+ }
+}
+
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/src/app_package/AppWidgetConfigureActivity.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/src/app_package/AppWidgetConfigureActivity.java.ftl
new file mode 100644
index 0000000..eed95b5
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/root/src/app_package/AppWidgetConfigureActivity.java.ftl
@@ -0,0 +1,101 @@
+package ${packageName};
+
+import android.app.Activity;
+import android.appwidget.AppWidgetManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.EditText;
+<#if applicationPackage??>import ${applicationPackage}.R;</#if>
+
+/**
+ * The configuration screen for the {@link ${className} ${className}} AppWidget.
+ */
+public class ${className}ConfigureActivity extends Activity {
+
+ int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
+ EditText mAppWidgetText;
+ private static final String PREFS_NAME = "${packageName}.${className}";
+ private static final String PREF_PREFIX_KEY = "appwidget_";
+
+ public ${className}ConfigureActivity() {
+ super();
+ }
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ // Set the result to CANCELED. This will cause the widget host to cancel
+ // out of the widget placement if the user presses the back button.
+ setResult(RESULT_CANCELED);
+
+ setContentView(R.layout.${class_name}_configure);
+ mAppWidgetText = (EditText)findViewById(R.id.appwidget_text);
+ findViewById(R.id.add_button).setOnClickListener(mOnClickListener);
+
+ // Find the widget id from the intent.
+ Intent intent = getIntent();
+ Bundle extras = intent.getExtras();
+ if (extras != null) {
+ mAppWidgetId = extras.getInt(
+ AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
+ }
+
+ // If this activity was started with an intent without an app widget ID, finish with an error.
+ if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
+ finish();
+ return;
+ }
+
+ mAppWidgetText.setText(loadTitlePref(${className}ConfigureActivity.this, mAppWidgetId));
+ }
+
+ View.OnClickListener mOnClickListener = new View.OnClickListener() {
+ public void onClick(View v) {
+ final Context context = ${className}ConfigureActivity.this;
+
+ // When the button is clicked, store the string locally
+ String widgetText = mAppWidgetText.getText().toString();
+ saveTitlePref(context,mAppWidgetId,widgetText);
+
+ // It is the responsibility of the configuration activity to update the app widget
+ AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
+ ${className}.updateAppWidget(context, appWidgetManager, mAppWidgetId);
+
+ // Make sure we pass back the original appWidgetId
+ Intent resultValue = new Intent();
+ resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
+ setResult(RESULT_OK, resultValue);
+ finish();
+ }
+ };
+
+ // Write the prefix to the SharedPreferences object for this widget
+ static void saveTitlePref(Context context, int appWidgetId, String text) {
+ SharedPreferences.Editor prefs = context.getSharedPreferences(PREFS_NAME, 0).edit();
+ prefs.putString(PREF_PREFIX_KEY + appWidgetId, text);
+ prefs.commit();
+ }
+
+ // Read the prefix from the SharedPreferences object for this widget.
+ // If there is no preference saved, get the default from a resource
+ static String loadTitlePref(Context context, int appWidgetId) {
+ SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0);
+ String titleValue = prefs.getString(PREF_PREFIX_KEY + appWidgetId, null);
+ if (titleValue != null) {
+ return titleValue;
+ } else {
+ return context.getString(R.string.appwidget_text);
+ }
+ }
+
+ static void deleteTitlePref(Context context, int appWidgetId) {
+ SharedPreferences.Editor prefs = context.getSharedPreferences(PREFS_NAME, 0).edit();
+ prefs.remove(PREF_PREFIX_KEY + appWidgetId);
+ prefs.commit();
+ }
+}
+
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/template.xml
new file mode 100644
index 0000000..13659b7
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/template.xml
@@ -0,0 +1,148 @@
+<?xml version="1.0"?>
+<template
+ format="4"
+ revision="2"
+ name="App Widget"
+ description="Creates a new App Widget"
+ minApi="4"
+ minBuildApi="16">
+
+ <category value="Widget" />
+
+ <parameter
+ id="className"
+ name="Class Name"
+ type="string"
+ constraints="class|unique|nonempty"
+ default="NewAppWidget"
+ help="The name of the App Widget to create" />
+
+ <parameter
+ id="placement"
+ name="Placement"
+ type="enum"
+ default="homescreen"
+ help="Make the widget available on the Home-screen and/or on the Keyguard. Keyguard placement is only supported in Android 4.2 and above; this setting is ignored on earlier versions and defaults to Home-screen.">
+ <option id="both">Home-screen and Keyguard</option>
+ <option id="homescreen">Home-screen only</option>
+ <option id="keyguard" >Keyguard only (API 17+)</option>
+ </parameter>
+
+ <parameter
+ id="resizable"
+ name="Resizable (API 12+)"
+ type="enum"
+ default="both"
+ help="Allow the user to resize the widget. Feature only available on Android 3.1 and above.">
+ <option id="both">Horizontally and vertically</option>
+ <option id="horizontal">Only horizontally</option>
+ <option id="vertical" >Only vertically</option>
+ <option id="none">Not resizable</option>
+ </parameter>
+
+ <parameter
+ id="minWidth"
+ name="Minimum Width (cells)"
+ type="enum"
+ default="1">
+ <option id="1">1</option>
+ <option id="2" >2</option>
+ <option id="3" >3</option>
+ <option id="4" >4</option>
+ </parameter>
+
+ <parameter
+ id="minHeight"
+ name="Minimum Height (cells)"
+ type="enum"
+ default="1">
+ <option id="1">1</option>
+ <option id="2" >2</option>
+ <option id="3" >3</option>
+ <option id="4" >4</option>
+ </parameter>
+
+ <parameter
+ id="configurable"
+ name="Configuration Screen"
+ type="boolean"
+ default="false"
+ help="Generates a widget configuration activity" />
+
+ <globals file="globals.xml.ftl" />
+ <execute file="recipe.xml.ftl" />
+
+
+ <thumbs>
+ <thumb>thumbs/template_widget_3x3_vh.png</thumb>
+
+ <thumb minWidth="1" minHeight="1" resizable="none" >thumbs/template_widget_1x1.png</thumb>
+ <thumb minWidth="2" minHeight="1" resizable="none" >thumbs/template_widget_2x1.png</thumb>
+ <thumb minWidth="3" minHeight="1" resizable="none" >thumbs/template_widget_3x1.png</thumb>
+ <thumb minWidth="4" minHeight="1" resizable="none" >thumbs/template_widget_4x1.png</thumb>
+ <thumb minWidth="1" minHeight="2" resizable="none" >thumbs/template_widget_1x2.png</thumb>
+ <thumb minWidth="2" minHeight="2" resizable="none" >thumbs/template_widget_2x2.png</thumb>
+ <thumb minWidth="3" minHeight="2" resizable="none" >thumbs/template_widget_3x2.png</thumb>
+ <thumb minWidth="4" minHeight="2" resizable="none" >thumbs/template_widget_4x2.png</thumb>
+ <thumb minWidth="1" minHeight="3" resizable="none" >thumbs/template_widget_1x3.png</thumb>
+ <thumb minWidth="2" minHeight="3" resizable="none" >thumbs/template_widget_2x3.png</thumb>
+ <thumb minWidth="3" minHeight="3" resizable="none" >thumbs/template_widget_3x3.png</thumb>
+ <thumb minWidth="4" minHeight="3" resizable="none" >thumbs/template_widget_4x3.png</thumb>
+ <thumb minWidth="1" minHeight="4" resizable="none" >thumbs/template_widget_1x4.png</thumb>
+ <thumb minWidth="2" minHeight="4" resizable="none" >thumbs/template_widget_2x4.png</thumb>
+ <thumb minWidth="3" minHeight="4" resizable="none" >thumbs/template_widget_3x4.png</thumb>
+ <thumb minWidth="4" minHeight="4" resizable="none" >thumbs/template_widget_4x4.png</thumb>
+
+ <thumb minWidth="1" minHeight="1" resizable="horizontal">thumbs/template_widget_1x1_h.png</thumb>
+ <thumb minWidth="2" minHeight="1" resizable="horizontal">thumbs/template_widget_2x1_h.png</thumb>
+ <thumb minWidth="3" minHeight="1" resizable="horizontal">thumbs/template_widget_3x1_h.png</thumb>
+ <thumb minWidth="4" minHeight="1" resizable="horizontal">thumbs/template_widget_4x1_h.png</thumb>
+ <thumb minWidth="1" minHeight="2" resizable="horizontal">thumbs/template_widget_1x2_h.png</thumb>
+ <thumb minWidth="2" minHeight="2" resizable="horizontal">thumbs/template_widget_2x2_h.png</thumb>
+ <thumb minWidth="3" minHeight="2" resizable="horizontal">thumbs/template_widget_3x2_h.png</thumb>
+ <thumb minWidth="4" minHeight="2" resizable="horizontal">thumbs/template_widget_4x2_h.png</thumb>
+ <thumb minWidth="1" minHeight="3" resizable="horizontal">thumbs/template_widget_1x3_h.png</thumb>
+ <thumb minWidth="2" minHeight="3" resizable="horizontal">thumbs/template_widget_2x3_h.png</thumb>
+ <thumb minWidth="3" minHeight="3" resizable="horizontal">thumbs/template_widget_3x3_h.png</thumb>
+ <thumb minWidth="4" minHeight="3" resizable="horizontal">thumbs/template_widget_4x3_h.png</thumb>
+ <thumb minWidth="1" minHeight="4" resizable="horizontal">thumbs/template_widget_1x4_h.png</thumb>
+ <thumb minWidth="2" minHeight="4" resizable="horizontal">thumbs/template_widget_2x4_h.png</thumb>
+ <thumb minWidth="3" minHeight="4" resizable="horizontal">thumbs/template_widget_3x4_h.png</thumb>
+ <thumb minWidth="4" minHeight="4" resizable="horizontal">thumbs/template_widget_4x4_h.png</thumb>
+
+ <thumb minWidth="1" minHeight="1" resizable="vertical" >thumbs/template_widget_1x1_v.png</thumb>
+ <thumb minWidth="2" minHeight="1" resizable="vertical" >thumbs/template_widget_2x1_v.png</thumb>
+ <thumb minWidth="3" minHeight="1" resizable="vertical" >thumbs/template_widget_3x1_v.png</thumb>
+ <thumb minWidth="4" minHeight="1" resizable="vertical" >thumbs/template_widget_4x1_v.png</thumb>
+ <thumb minWidth="1" minHeight="2" resizable="vertical" >thumbs/template_widget_1x2_v.png</thumb>
+ <thumb minWidth="2" minHeight="2" resizable="vertical" >thumbs/template_widget_2x2_v.png</thumb>
+ <thumb minWidth="3" minHeight="2" resizable="vertical" >thumbs/template_widget_3x2_v.png</thumb>
+ <thumb minWidth="4" minHeight="2" resizable="vertical" >thumbs/template_widget_4x2_v.png</thumb>
+ <thumb minWidth="1" minHeight="3" resizable="vertical" >thumbs/template_widget_1x3_v.png</thumb>
+ <thumb minWidth="2" minHeight="3" resizable="vertical" >thumbs/template_widget_2x3_v.png</thumb>
+ <thumb minWidth="3" minHeight="3" resizable="vertical" >thumbs/template_widget_3x3_v.png</thumb>
+ <thumb minWidth="4" minHeight="3" resizable="vertical" >thumbs/template_widget_4x3_v.png</thumb>
+ <thumb minWidth="1" minHeight="4" resizable="vertical" >thumbs/template_widget_1x4_v.png</thumb>
+ <thumb minWidth="2" minHeight="4" resizable="vertical" >thumbs/template_widget_2x4_v.png</thumb>
+ <thumb minWidth="3" minHeight="4" resizable="vertical" >thumbs/template_widget_3x4_v.png</thumb>
+ <thumb minWidth="4" minHeight="4" resizable="vertical" >thumbs/template_widget_4x4_v.png</thumb>
+
+ <thumb minWidth="1" minHeight="1" resizable="both" >thumbs/template_widget_1x1_vh.png</thumb>
+ <thumb minWidth="2" minHeight="1" resizable="both" >thumbs/template_widget_2x1_vh.png</thumb>
+ <thumb minWidth="3" minHeight="1" resizable="both" >thumbs/template_widget_3x1_vh.png</thumb>
+ <thumb minWidth="4" minHeight="1" resizable="both" >thumbs/template_widget_4x1_vh.png</thumb>
+ <thumb minWidth="1" minHeight="2" resizable="both" >thumbs/template_widget_1x2_vh.png</thumb>
+ <thumb minWidth="2" minHeight="2" resizable="both" >thumbs/template_widget_2x2_vh.png</thumb>
+ <thumb minWidth="3" minHeight="2" resizable="both" >thumbs/template_widget_3x2_vh.png</thumb>
+ <thumb minWidth="4" minHeight="2" resizable="both" >thumbs/template_widget_4x2_vh.png</thumb>
+ <thumb minWidth="1" minHeight="3" resizable="both" >thumbs/template_widget_1x3_vh.png</thumb>
+ <thumb minWidth="2" minHeight="3" resizable="both" >thumbs/template_widget_2x3_vh.png</thumb>
+ <thumb minWidth="3" minHeight="3" resizable="both" >thumbs/template_widget_3x3_vh.png</thumb>
+ <thumb minWidth="4" minHeight="3" resizable="both" >thumbs/template_widget_4x3_vh.png</thumb>
+ <thumb minWidth="1" minHeight="4" resizable="both" >thumbs/template_widget_1x4_vh.png</thumb>
+ <thumb minWidth="2" minHeight="4" resizable="both" >thumbs/template_widget_2x4_vh.png</thumb>
+ <thumb minWidth="3" minHeight="4" resizable="both" >thumbs/template_widget_3x4_vh.png</thumb>
+ <thumb minWidth="4" minHeight="4" resizable="both" >thumbs/template_widget_4x4_vh.png</thumb>
+ </thumbs>
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x1.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x1.png
new file mode 100644
index 0000000..8b34a24
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x1.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x1_h.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x1_h.png
new file mode 100644
index 0000000..38ce687
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x1_h.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x1_v.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x1_v.png
new file mode 100644
index 0000000..0aedac7
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x1_v.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x1_vh.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x1_vh.png
new file mode 100644
index 0000000..301ee0f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x1_vh.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x2.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x2.png
new file mode 100644
index 0000000..0e4181d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x2.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x2_h.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x2_h.png
new file mode 100644
index 0000000..37f3b94
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x2_h.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x2_v.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x2_v.png
new file mode 100644
index 0000000..2d13903
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x2_v.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x2_vh.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x2_vh.png
new file mode 100644
index 0000000..431f929
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x2_vh.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x3.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x3.png
new file mode 100644
index 0000000..b0fb55a
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x3.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x3_h.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x3_h.png
new file mode 100644
index 0000000..14fdc46
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x3_h.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x3_v.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x3_v.png
new file mode 100644
index 0000000..136b8de
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x3_v.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x3_vh.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x3_vh.png
new file mode 100644
index 0000000..5e18856
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x3_vh.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x4.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x4.png
new file mode 100644
index 0000000..2922d34
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x4.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x4_h.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x4_h.png
new file mode 100644
index 0000000..462c802
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x4_h.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x4_v.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x4_v.png
new file mode 100644
index 0000000..f239e73
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x4_v.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x4_vh.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x4_vh.png
new file mode 100644
index 0000000..b05e168
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_1x4_vh.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x1.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x1.png
new file mode 100644
index 0000000..9e14ef8
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x1.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x1_h.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x1_h.png
new file mode 100644
index 0000000..3a8019e
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x1_h.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x1_v.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x1_v.png
new file mode 100644
index 0000000..d09ff28
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x1_v.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x1_vh.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x1_vh.png
new file mode 100644
index 0000000..b6093e1
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x1_vh.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x2.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x2.png
new file mode 100644
index 0000000..2894704
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x2.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x2_h.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x2_h.png
new file mode 100644
index 0000000..a2ab77c
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x2_h.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x2_v.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x2_v.png
new file mode 100644
index 0000000..c09f1f7
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x2_v.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x2_vh.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x2_vh.png
new file mode 100644
index 0000000..21becb2
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x2_vh.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x3.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x3.png
new file mode 100644
index 0000000..3226127
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x3.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x3_h.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x3_h.png
new file mode 100644
index 0000000..db2037a
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x3_h.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x3_v.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x3_v.png
new file mode 100644
index 0000000..af21176
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x3_v.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x3_vh.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x3_vh.png
new file mode 100644
index 0000000..e0edfb4
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x3_vh.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x4.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x4.png
new file mode 100644
index 0000000..dfcda22
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x4.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x4_h.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x4_h.png
new file mode 100644
index 0000000..dc21139
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x4_h.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x4_v.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x4_v.png
new file mode 100644
index 0000000..6bfc884
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x4_v.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x4_vh.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x4_vh.png
new file mode 100644
index 0000000..922aeee
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_2x4_vh.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x1.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x1.png
new file mode 100644
index 0000000..bb394b9
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x1.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x1_h.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x1_h.png
new file mode 100644
index 0000000..47b19c3
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x1_h.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x1_v.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x1_v.png
new file mode 100644
index 0000000..5575850
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x1_v.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x1_vh.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x1_vh.png
new file mode 100644
index 0000000..c4a5f3f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x1_vh.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x2.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x2.png
new file mode 100644
index 0000000..200fba4
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x2.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x2_h.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x2_h.png
new file mode 100644
index 0000000..b027430
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x2_h.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x2_v.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x2_v.png
new file mode 100644
index 0000000..b350ae8
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x2_v.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x2_vh.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x2_vh.png
new file mode 100644
index 0000000..129b706
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x2_vh.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x3.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x3.png
new file mode 100644
index 0000000..30dfb4b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x3.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x3_h.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x3_h.png
new file mode 100644
index 0000000..9b062e9
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x3_h.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x3_v.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x3_v.png
new file mode 100644
index 0000000..af8b494
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x3_v.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x3_vh.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x3_vh.png
new file mode 100644
index 0000000..bc92413
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x3_vh.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x4.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x4.png
new file mode 100644
index 0000000..1759b62
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x4.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x4_h.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x4_h.png
new file mode 100644
index 0000000..e09fa7e
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x4_h.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x4_v.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x4_v.png
new file mode 100644
index 0000000..e6451fe
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x4_v.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x4_vh.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x4_vh.png
new file mode 100644
index 0000000..376611f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_3x4_vh.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x1.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x1.png
new file mode 100644
index 0000000..75031c8
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x1.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x1_h.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x1_h.png
new file mode 100644
index 0000000..7a4b81f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x1_h.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x1_v.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x1_v.png
new file mode 100644
index 0000000..2c8c604
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x1_v.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x1_vh.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x1_vh.png
new file mode 100644
index 0000000..0b43cd7
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x1_vh.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x2.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x2.png
new file mode 100644
index 0000000..8328141
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x2.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x2_h.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x2_h.png
new file mode 100644
index 0000000..d83062c
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x2_h.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x2_v.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x2_v.png
new file mode 100644
index 0000000..561f47a
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x2_v.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x2_vh.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x2_vh.png
new file mode 100644
index 0000000..132ccd1
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x2_vh.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x3.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x3.png
new file mode 100644
index 0000000..c3ea452
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x3.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x3_h.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x3_h.png
new file mode 100644
index 0000000..57d84ce
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x3_h.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x3_v.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x3_v.png
new file mode 100644
index 0000000..e8d93fc
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x3_v.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x3_vh.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x3_vh.png
new file mode 100644
index 0000000..71dfbb3
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x3_vh.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x4.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x4.png
new file mode 100644
index 0000000..340244f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x4.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x4_h.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x4_h.png
new file mode 100644
index 0000000..f20c14e
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x4_h.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x4_v.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x4_v.png
new file mode 100644
index 0000000..d490c79
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x4_v.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x4_vh.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x4_vh.png
new file mode 100644
index 0000000..52e1b4d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AppWidget/thumbs/template_widget_4x4_vh.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AssetsFolder/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/AssetsFolder/recipe.xml.ftl
new file mode 100644
index 0000000..f2042bf
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AssetsFolder/recipe.xml.ftl
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<recipe>
+
+ <#if remapFolder>
+ <mkdir at="${escapeXmlAttribute(projectOut)}/${escapeXmlAttribute(newLocation)}" />
+ <merge from="build.gradle.ftl"
+ to="${escapeXmlAttribute(projectOut)}/build.gradle" />
+ <#else>
+ <mkdir at="${escapeXmlAttribute(manifestOut)}/assets/" />
+ </#if>
+
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AssetsFolder/root/build.gradle.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/AssetsFolder/root/build.gradle.ftl
new file mode 100644
index 0000000..fd527dc
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AssetsFolder/root/build.gradle.ftl
@@ -0,0 +1 @@
+android {sourceSets {${sourceProviderName} {assets.srcDirs=['src/${sourceProviderName}/assets', '${newLocation}']}}} \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/AssetsFolder/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/AssetsFolder/template.xml
new file mode 100644
index 0000000..d659f88
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/AssetsFolder/template.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<template
+ format="4"
+ revision="2"
+ name="Assets Folder"
+ description="Creates a source root for assets which will be included in the APK."
+ >
+
+ <category value="Folder" />
+
+ <parameter
+ id="remapFolder"
+ name="Change Folder Location"
+ type="boolean"
+ constraints=""
+ default="false"
+ help="Change the folder location to another folder within the module." />
+
+ <parameter
+ id="newLocation"
+ name="New Folder Location"
+ type="string"
+ constraints="nonempty|source_set_folder|unique"
+ suggest="src/${sourceProviderName}/assets/"
+ help="The location for the new folder"
+ visibility="remapFolder" />
+
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/globals.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/globals.xml.ftl
new file mode 100644
index 0000000..e4cf72f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/globals.xml.ftl
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<globals>
+ <global id="useSupport" type="boolean" value="${(minApiLevel lt 11)?string}" />
+ <global id="resOut" value="${resDir}" />
+ <global id="srcOut" value="${srcDir}/${slashedPackageName(packageName)}" />
+ <global id="relativePackage" value="<#if relativePackage?has_content>${relativePackage}<#else>${packageName}</#if>" />
+</globals>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/recipe.xml.ftl
new file mode 100644
index 0000000..61764c7
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/recipe.xml.ftl
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<recipe>
+
+ <#if useSupport><dependency mavenUrl="com.android.support:support-v4:19.+"/></#if>
+ <merge from="res/values/strings.xml" to="${escapeXmlAttribute(resOut)}/values/strings.xml" />
+
+ <#if includeLayout>
+ <instantiate from="res/layout/fragment_blank.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/layout/${escapeXmlAttribute(fragmentName)}.xml" />
+
+ <open file="${escapeXmlAttribute(resOut)}/layout/${escapeXmlAttribute(fragmentName)}.xml" />
+ </#if>
+
+ <open file="${escapeXmlAttribute(srcOut)}/${className}.java" />
+
+ <instantiate from="src/app_package/BlankFragment.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/${className}.java" />
+
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/root/res/layout/fragment_blank.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/root/res/layout/fragment_blank.xml.ftl
new file mode 100644
index 0000000..315171e
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/root/res/layout/fragment_blank.xml.ftl
@@ -0,0 +1,13 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context="${relativePackage}.${className}">
+
+ <!-- TODO: Update blank fragment layout -->
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:text="@string/hello_blank_fragment" />
+
+</FrameLayout>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/root/res/values/strings.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/root/res/values/strings.xml
new file mode 100644
index 0000000..c8d8b1a
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/root/res/values/strings.xml
@@ -0,0 +1,6 @@
+<resources>
+
+<!-- TODO: Remove or change this placeholder text -->
+ <string name="hello_blank_fragment">Hello blank fragment</string>
+
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/root/src/app_package/BlankFragment.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/root/src/app_package/BlankFragment.java.ftl
new file mode 100644
index 0000000..6e33197
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/root/src/app_package/BlankFragment.java.ftl
@@ -0,0 +1,130 @@
+package ${packageName};
+
+<#if includeCallbacks>import android.app.Activity;</#if>
+<#if includeCallbacks>import android.net.Uri;</#if>
+import android.os.Bundle;
+import android<#if useSupport>.support.v4</#if>.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+<#if !includeLayout>import android.widget.TextView;</#if>
+<#if applicationPackage??>import ${applicationPackage}.R;</#if>
+
+/**
+ * A simple {@link Fragment} subclass.
+<#if includeCallbacks>
+ * Activities that contain this fragment must implement the
+ * {@link ${className}.OnFragmentInteractionListener} interface
+ * to handle interaction events.
+</#if>
+<#if includeFactory>
+ * Use the {@link ${className}#newInstance} factory method to
+ * create an instance of this fragment.
+</#if>
+ *
+ */
+public class ${className} extends Fragment {
+<#if includeFactory>
+ // TODO: Rename parameter arguments, choose names that match
+ // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
+ private static final String ARG_PARAM1 = "param1";
+ private static final String ARG_PARAM2 = "param2";
+
+ // TODO: Rename and change types of parameters
+ private String mParam1;
+ private String mParam2;
+</#if>
+
+<#if includeCallbacks>
+ private OnFragmentInteractionListener mListener;
+</#if>
+
+<#if includeFactory>
+ /**
+ * Use this factory method to create a new instance of
+ * this fragment using the provided parameters.
+ *
+ * @param param1 Parameter 1.
+ * @param param2 Parameter 2.
+ * @return A new instance of fragment ${className}.
+ */
+ // TODO: Rename and change types and number of parameters
+ public static ${className} newInstance(String param1, String param2) {
+ ${className} fragment = new ${className}();
+ Bundle args = new Bundle();
+ args.putString(ARG_PARAM1, param1);
+ args.putString(ARG_PARAM2, param2);
+ fragment.setArguments(args);
+ return fragment;
+ }
+</#if>
+ public ${className}() {
+ // Required empty public constructor
+ }
+
+<#if includeFactory>
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (getArguments() != null) {
+ mParam1 = getArguments().getString(ARG_PARAM1);
+ mParam2 = getArguments().getString(ARG_PARAM2);
+ }
+ }
+</#if>
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+<#if includeLayout>
+ // Inflate the layout for this fragment
+ return inflater.inflate(R.layout.${fragmentName}, container, false);
+<#else>
+ TextView textView = new TextView(getActivity());
+ textView.setText(R.string.hello_blank_fragment);
+ return textView;
+</#if>
+ }
+
+<#if includeCallbacks>
+ // TODO: Rename method, update argument and hook method into UI event
+ public void onButtonPressed(Uri uri) {
+ if (mListener != null) {
+ mListener.onFragmentInteraction(uri);
+ }
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ try {
+ mListener = (OnFragmentInteractionListener) activity;
+ } catch (ClassCastException e) {
+ throw new ClassCastException(activity.toString()
+ + " must implement OnFragmentInteractionListener");
+ }
+ }
+
+ @Override
+ public void onDetach() {
+ super.onDetach();
+ mListener = null;
+ }
+
+ /**
+ * This interface must be implemented by activities that contain this
+ * fragment to allow an interaction in this fragment to be communicated
+ * to the activity and potentially other fragments contained in that
+ * activity.
+ * <p>
+ * See the Android Training lesson <a href=
+ * "http://developer.android.com/training/basics/fragments/communicating.html"
+ * >Communicating with Other Fragments</a> for more information.
+ */
+ public interface OnFragmentInteractionListener {
+ // TODO: Update argument type and name
+ public void onFragmentInteraction(Uri uri);
+ }
+</#if>
+
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/template.xml
new file mode 100644
index 0000000..d9779ef
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/template.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0"?>
+<template
+ format="4"
+ revision="2"
+ name="Fragment (Blank)"
+ description="Creates a blank fragment that is compatible back to API level 4."
+ minApi="7"
+ minBuildApi="8">
+
+ <category value="Fragment" />
+
+ <dependency name="android-support-v4" revision="8" />
+
+ <parameter
+ id="className"
+ name="Fragment Name"
+ type="string"
+ constraints="class|nonempty|unique"
+ default="BlankFragment"
+ help="The name of the fragment class to create" />
+
+ <parameter
+ id="includeLayout"
+ name="Create layout XML?"
+ type="boolean"
+ default="true"
+ help="Generate a layout XML for the fragment" />
+
+ <parameter
+ id="fragmentName"
+ name="Fragment Layout Name"
+ type="string"
+ constraints="layout|nonempty|unique"
+ default="fragment_blank"
+ visibility="includeLayout"
+ suggest="fragment_${classToResource(className)}"
+ help="The name of the layout to create" />
+
+ <parameter
+ id="includeFactory"
+ name="Include fragment factory methods?"
+ type="boolean"
+ default="true"
+ help="Generate static fragment factory methods for easy instantiation" />
+
+ <parameter
+ id="includeCallbacks"
+ name="Include interface callbacks?"
+ type="boolean"
+ default="true"
+ help="Generate event callbacks for communication with an Activity or other fragments" />
+
+ <thumbs>
+ <thumb>template_blank_fragment.png</thumb>
+ </thumbs>
+
+ <globals file="globals.xml.ftl" />
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/template_blank_fragment.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/template_blank_fragment.png
new file mode 100644
index 0000000..69a02bb
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/BlankFragment/template_blank_fragment.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/BroadcastReceiver/globals.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/BroadcastReceiver/globals.xml.ftl
new file mode 100644
index 0000000..fca5ad8
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/BroadcastReceiver/globals.xml.ftl
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<globals>
+ <global id="manifestOut" value="${manifestDir}" />
+ <global id="srcOut" value="${srcDir}/${slashedPackageName(packageName)}" />
+ <global id="relativePackage" value="<#if relativePackage?has_content>${relativePackage}<#else>${packageName}</#if>" />
+</globals>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/BroadcastReceiver/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/BroadcastReceiver/recipe.xml.ftl
new file mode 100644
index 0000000..d889414
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/BroadcastReceiver/recipe.xml.ftl
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<recipe>
+ <merge from="AndroidManifest.xml.ftl"
+ to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />
+ <instantiate from="src/app_package/BroadcastReceiver.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/${className}.java" />
+ <open file="${escapeXmlAttribute(srcOut)}/${className}.java" />
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/BroadcastReceiver/root/AndroidManifest.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/BroadcastReceiver/root/AndroidManifest.xml.ftl
new file mode 100644
index 0000000..e767f55
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/BroadcastReceiver/root/AndroidManifest.xml.ftl
@@ -0,0 +1,10 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <application>
+ <receiver android:name="${relativePackage}.${className}"
+ android:exported="${isExported?string}"
+ android:enabled="${isEnabled?string}" >
+ </receiver>
+ </application>
+
+</manifest>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/BroadcastReceiver/root/src/app_package/BroadcastReceiver.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/BroadcastReceiver/root/src/app_package/BroadcastReceiver.java.ftl
new file mode 100644
index 0000000..560c132
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/BroadcastReceiver/root/src/app_package/BroadcastReceiver.java.ftl
@@ -0,0 +1,17 @@
+package ${packageName};
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+
+public class ${className} extends BroadcastReceiver {
+ public ${className}() {
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ // TODO: This method is called when the BroadcastReceiver is receiving
+ // an Intent broadcast.
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/BroadcastReceiver/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/BroadcastReceiver/template.xml
new file mode 100644
index 0000000..159ff75
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/BroadcastReceiver/template.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<template
+ format="4"
+ revision="2"
+ name="Broadcast Receiver"
+ description="Creates a new broadcast receiver component and adds it to your Android manifest.">
+
+ <parameter
+ id="className"
+ name="Class Name"
+ type="string"
+ constraints="class|unique|nonempty"
+ default="MyReceiver" />
+
+ <parameter
+ id="isExported"
+ name="Exported"
+ type="boolean"
+ default="true"
+ help="Whether or not the broadcast receiver can receive messages from sources outside its application" />
+
+ <parameter
+ id="isEnabled"
+ name="Enabled"
+ type="boolean"
+ default="true"
+ help="Whether or not the broadcast receiver can be instantiated by the system" />
+
+ <globals file="globals.xml.ftl" />
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/ContentProvider/globals.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/ContentProvider/globals.xml.ftl
new file mode 100644
index 0000000..fca5ad8
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/ContentProvider/globals.xml.ftl
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<globals>
+ <global id="manifestOut" value="${manifestDir}" />
+ <global id="srcOut" value="${srcDir}/${slashedPackageName(packageName)}" />
+ <global id="relativePackage" value="<#if relativePackage?has_content>${relativePackage}<#else>${packageName}</#if>" />
+</globals>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/ContentProvider/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/ContentProvider/recipe.xml.ftl
new file mode 100644
index 0000000..9bc3e61
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/ContentProvider/recipe.xml.ftl
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<recipe>
+ <merge from="AndroidManifest.xml.ftl"
+ to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />
+ <instantiate from="src/app_package/ContentProvider.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/${className}.java" />
+ <open file="${escapeXmlAttribute(srcOut)}/${className}.java" />
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/ContentProvider/root/AndroidManifest.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/ContentProvider/root/AndroidManifest.xml.ftl
new file mode 100644
index 0000000..354f6c9
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/ContentProvider/root/AndroidManifest.xml.ftl
@@ -0,0 +1,11 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <application>
+ <provider android:name="${relativePackage}.${className}"
+ android:authorities="${authorities}"
+ android:exported="${isExported?string}"
+ android:enabled="${isEnabled?string}" >
+ </provider>
+ </application>
+
+</manifest>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/ContentProvider/root/src/app_package/ContentProvider.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/ContentProvider/root/src/app_package/ContentProvider.java.ftl
new file mode 100644
index 0000000..e5b43b5
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/ContentProvider/root/src/app_package/ContentProvider.java.ftl
@@ -0,0 +1,50 @@
+package ${packageName};
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.net.Uri;
+
+public class ${className} extends ContentProvider {
+ public ${className}() {
+ }
+
+ @Override
+ public int delete(Uri uri, String selection, String[] selectionArgs) {
+ // Implement this to handle requests to delete one or more rows.
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+ @Override
+ public String getType(Uri uri) {
+ // TODO: Implement this to handle requests for the MIME type of the data
+ // at the given URI.
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+ @Override
+ public Uri insert(Uri uri, ContentValues values) {
+ // TODO: Implement this to handle requests to insert a new row.
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+ @Override
+ public boolean onCreate() {
+ // TODO: Implement this to initialize your content provider on startup.
+ return false;
+ }
+
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection,
+ String[] selectionArgs, String sortOrder) {
+ // TODO: Implement this to handle query requests from clients.
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+ @Override
+ public int update(Uri uri, ContentValues values, String selection,
+ String[] selectionArgs) {
+ // TODO: Implement this to handle requests to update one or more rows.
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/ContentProvider/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/ContentProvider/template.xml
new file mode 100644
index 0000000..dc7e1ea
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/ContentProvider/template.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0"?>
+<template
+ format="4"
+ revision="2"
+ name="Content Provider"
+ description="Creates a new content provider component and adds it to your Android manifest.">
+
+ <parameter
+ id="className"
+ name="Class Name"
+ type="string"
+ constraints="class|unique|nonempty"
+ default="MyContentProvider" />
+
+ <parameter
+ id="authorities"
+ name="URI Authorities"
+ type="string"
+ constraints="nonempty"
+ default=""
+ help="A list of one or more URI authorities that identify data under the purview of the content provider. " />
+
+ <parameter
+ id="isExported"
+ name="Exported"
+ type="boolean"
+ default="true"
+ help="Whether or not the content provider can be used by components of other applications " />
+
+ <parameter
+ id="isEnabled"
+ name="Enabled"
+ type="boolean"
+ default="true"
+ help="Whether or not the content provider can be instantiated by the system " />
+
+ <globals file="globals.xml.ftl" />
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/CustomView/globals.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/CustomView/globals.xml.ftl
new file mode 100644
index 0000000..58fe1d0
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/CustomView/globals.xml.ftl
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<globals>
+ <global id="resOut" value="${resDir}" />
+ <global id="srcOut" value="${srcDir}/${slashedPackageName(packageName)}" />
+ <global id="view_class" value="${camelCaseToUnderscore(viewClass)}" />
+</globals>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/CustomView/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/CustomView/recipe.xml.ftl
new file mode 100644
index 0000000..ce605b2
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/CustomView/recipe.xml.ftl
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<recipe>
+ <merge from="res/values/attrs.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values/attrs_${view_class}.xml" />
+ <instantiate from="res/layout/sample.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/layout/sample_${view_class}.xml" />
+
+ <instantiate from="src/app_package/CustomView.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/${viewClass}.java" />
+
+ <open file="${escapeXmlAttribute(srcOut)}/${viewClass}.java" />
+ <open file="${escapeXmlAttribute(resOut)}/layout/sample_${view_class}.xml" />
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/CustomView/root/res/layout/sample.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/CustomView/root/res/layout/sample.xml.ftl
new file mode 100644
index 0000000..7dc4232
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/CustomView/root/res/layout/sample.xml.ftl
@@ -0,0 +1,22 @@
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+<#if !isLibraryProject && (!(isGradle??) || !isGradle) >
+ xmlns:app="http://schemas.android.com/apk/res/${packageName}"
+<#else>
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+</#if>
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <${packageName}.${viewClass}
+ android:background="#ccc"
+ android:layout_width="300dp"
+ android:layout_height="300dp"
+ android:paddingLeft="20dp"
+ android:paddingBottom="40dp"
+ app:exampleDimension="24sp"
+ app:exampleColor="#33b5e5"
+ app:exampleString="Hello, ${viewClass}"
+ app:exampleDrawable="@android:drawable/ic_menu_add" />
+
+</FrameLayout>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/CustomView/root/res/values/attrs.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/CustomView/root/res/values/attrs.xml.ftl
new file mode 100644
index 0000000..89059d2
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/CustomView/root/res/values/attrs.xml.ftl
@@ -0,0 +1,8 @@
+<resources>
+ <declare-styleable name="${viewClass}">
+ <attr name="exampleString" format="string" />
+ <attr name="exampleDimension" format="dimension" />
+ <attr name="exampleColor" format="color" />
+ <attr name="exampleDrawable" format="color|reference" />
+ </declare-styleable>
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/CustomView/root/src/app_package/CustomView.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/CustomView/root/src/app_package/CustomView.java.ftl
new file mode 100644
index 0000000..a989a30
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/CustomView/root/src/app_package/CustomView.java.ftl
@@ -0,0 +1,182 @@
+package ${packageName};
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.drawable.Drawable;
+import android.text.TextPaint;
+import android.util.AttributeSet;
+import android.view.View;
+<#if applicationPackage??>import ${applicationPackage}.R;</#if>
+
+/**
+ * TODO: document your custom view class.
+ */
+public class ${viewClass} extends View {
+ private String mExampleString; // TODO: use a default from R.string...
+ private int mExampleColor = Color.RED; // TODO: use a default from R.color...
+ private float mExampleDimension = 0; // TODO: use a default from R.dimen...
+ private Drawable mExampleDrawable;
+
+ private TextPaint mTextPaint;
+ private float mTextWidth;
+ private float mTextHeight;
+
+ public ${viewClass}(Context context) {
+ super(context);
+ init(null, 0);
+ }
+
+ public ${viewClass}(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init(attrs, 0);
+ }
+
+ public ${viewClass}(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ init(attrs, defStyle);
+ }
+
+ private void init(AttributeSet attrs, int defStyle) {
+ // Load attributes
+ final TypedArray a = getContext().obtainStyledAttributes(
+ attrs, R.styleable.${viewClass}, defStyle, 0);
+
+ mExampleString = a.getString(
+ R.styleable.${viewClass}_exampleString);
+ mExampleColor = a.getColor(
+ R.styleable.${viewClass}_exampleColor,
+ mExampleColor);
+ // Use getDimensionPixelSize or getDimensionPixelOffset when dealing with
+ // values that should fall on pixel boundaries.
+ mExampleDimension = a.getDimension(
+ R.styleable.${viewClass}_exampleDimension,
+ mExampleDimension);
+
+ if (a.hasValue(R.styleable.${viewClass}_exampleDrawable)) {
+ mExampleDrawable = a.getDrawable(
+ R.styleable.${viewClass}_exampleDrawable);
+ mExampleDrawable.setCallback(this);
+ }
+
+ a.recycle();
+
+ // Set up a default TextPaint object
+ mTextPaint = new TextPaint();
+ mTextPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ mTextPaint.setTextAlign(Paint.Align.LEFT);
+
+ // Update TextPaint and text measurements from attributes
+ invalidateTextPaintAndMeasurements();
+ }
+
+ private void invalidateTextPaintAndMeasurements() {
+ mTextPaint.setTextSize(mExampleDimension);
+ mTextPaint.setColor(mExampleColor);
+ mTextWidth = mTextPaint.measureText(mExampleString);
+
+ Paint.FontMetrics fontMetrics = mTextPaint.getFontMetrics();
+ mTextHeight = fontMetrics.bottom;
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+
+ // TODO: consider storing these as member variables to reduce
+ // allocations per draw cycle.
+ int paddingLeft = getPaddingLeft();
+ int paddingTop = getPaddingTop();
+ int paddingRight = getPaddingRight();
+ int paddingBottom = getPaddingBottom();
+
+ int contentWidth = getWidth() - paddingLeft - paddingRight;
+ int contentHeight = getHeight() - paddingTop - paddingBottom;
+
+ // Draw the text.
+ canvas.drawText(mExampleString,
+ paddingLeft + (contentWidth - mTextWidth) / 2,
+ paddingTop + (contentHeight + mTextHeight) / 2,
+ mTextPaint);
+
+ // Draw the example drawable on top of the text.
+ if (mExampleDrawable != null) {
+ mExampleDrawable.setBounds(paddingLeft, paddingTop,
+ paddingLeft + contentWidth, paddingTop + contentHeight);
+ mExampleDrawable.draw(canvas);
+ }
+ }
+
+ /**
+ * Gets the example string attribute value.
+ * @return The example string attribute value.
+ */
+ public String getExampleString() {
+ return mExampleString;
+ }
+
+ /**
+ * Sets the view's example string attribute value. In the example view, this string
+ * is the text to draw.
+ * @param exampleString The example string attribute value to use.
+ */
+ public void setExampleString(String exampleString) {
+ mExampleString = exampleString;
+ invalidateTextPaintAndMeasurements();
+ }
+
+ /**
+ * Gets the example color attribute value.
+ * @return The example color attribute value.
+ */
+ public int getExampleColor() {
+ return mExampleColor;
+ }
+
+ /**
+ * Sets the view's example color attribute value. In the example view, this color
+ * is the font color.
+ * @param exampleColor The example color attribute value to use.
+ */
+ public void setExampleColor(int exampleColor) {
+ mExampleColor = exampleColor;
+ invalidateTextPaintAndMeasurements();
+ }
+
+ /**
+ * Gets the example dimension attribute value.
+ * @return The example dimension attribute value.
+ */
+ public float getExampleDimension() {
+ return mExampleDimension;
+ }
+
+ /**
+ * Sets the view's example dimension attribute value. In the example view, this dimension
+ * is the font size.
+ * @param exampleDimension The example dimension attribute value to use.
+ */
+ public void setExampleDimension(float exampleDimension) {
+ mExampleDimension = exampleDimension;
+ invalidateTextPaintAndMeasurements();
+ }
+
+ /**
+ * Gets the example drawable attribute value.
+ * @return The example drawable attribute value.
+ */
+ public Drawable getExampleDrawable() {
+ return mExampleDrawable;
+ }
+
+ /**
+ * Sets the view's example drawable attribute value. In the example view, this drawable is
+ * drawn above the text.
+ * @param exampleDrawable The example drawable attribute value to use.
+ */
+ public void setExampleDrawable(Drawable exampleDrawable) {
+ mExampleDrawable = exampleDrawable;
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/CustomView/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/CustomView/template.xml
new file mode 100644
index 0000000..666d319
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/CustomView/template.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<template
+ format="4"
+ revision="2"
+ name="Custom View"
+ description="Creates a new custom view that extends android.view.View and exposes custom attributes.">
+
+ <category value="UI Component" />
+
+ <parameter
+ id="packageName"
+ name="Package name"
+ type="string"
+ constraints="package"
+ default="com.mycompany.myapp" />
+
+ <parameter
+ id="viewClass"
+ name="View Class"
+ type="string"
+ constraints="class|unique|nonempty"
+ default="MyView"
+ help="By convention, should end in 'View'" />
+
+ <globals file="globals.xml.ftl" />
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/globals.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/globals.xml.ftl
new file mode 100644
index 0000000..1a8b620
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/globals.xml.ftl
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<globals>
+ <global id="manifestOut" value="${manifestDir}" />
+ <global id="resOut" value="${resDir}" />
+ <global id="srcOut" value="${srcDir}/${slashedPackageName(packageName)}" />
+ <global id="class_name" value="${classToResource(className)}" />
+ <global id="info_name" value="${classToResource(className)}_info" />
+ <global id="settingsClassName" value="${className}SettingsActivity" />
+ <global id="prefs_name" value="${classToResource(className)}_prefs" />
+ <global id="relativePackage" value="<#if relativePackage?has_content>${relativePackage}<#else>${packageName}</#if>" />
+</globals>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/recipe.xml.ftl
new file mode 100644
index 0000000..5b99917
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/recipe.xml.ftl
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<recipe>
+
+ <merge from="AndroidManifest.xml.ftl"
+ to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />
+ <merge from="res/values/strings.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values/strings.xml" />
+
+ <copy from="res/layout-v17/dream.xml"
+ to="${escapeXmlAttribute(resOut)}/layout-v17/${class_name}.xml" />
+
+ <instantiate from="src/app_package/DreamService.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/${className}.java" />
+
+<#if configurable>
+ <copy from="res/xml/dream_prefs.xml"
+ to="${escapeXmlAttribute(resOut)}/xml/${prefs_name}.xml" />
+
+ <instantiate from="src/app_package/SettingsActivity.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/${settingsClassName}.java" />
+
+ <instantiate from="res/xml/xml_dream.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/xml/${info_name}.xml" />
+</#if>
+
+ <open file="${escapeXmlAttribute(srcOut)}/${className}.java" />
+
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/AndroidManifest.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/AndroidManifest.xml.ftl
new file mode 100644
index 0000000..9777461
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/AndroidManifest.xml.ftl
@@ -0,0 +1,28 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <application>
+
+<#if configurable>
+ <activity
+ android:name="${relativePackage}.${settingsClassName}" />
+</#if>
+
+ <!-- This service is only used on devices with API v17+ -->
+ <service
+ android:name="${relativePackage}.${className}"
+ android:exported="true" >
+ <intent-filter>
+ <action android:name="android.service.dreams.DreamService" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+<#if configurable>
+
+ <!-- Point to additional information for this dream -->
+ <meta-data
+ android:name="android.service.dream"
+ android:resource="@xml/${info_name}" />
+</#if>
+ </service>
+ </application>
+
+</manifest>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/res/layout-v17/dream.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/res/layout-v17/dream.xml
new file mode 100644
index 0000000..25593f3
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/res/layout-v17/dream.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" >
+
+ <TextView
+ android:id="@+id/dream_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:fontFamily="sans-serif-light"
+ android:textSize="50sp" />
+
+</FrameLayout>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/res/values/strings.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/res/values/strings.xml.ftl
new file mode 100644
index 0000000..b3d208f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/res/values/strings.xml.ftl
@@ -0,0 +1,7 @@
+<resources>
+ <string name="pref_dream_text_key">pref_dream_text</string>
+ <string name="pref_dream_text_default">zzzZZZzzz</string>
+<#if configurable>
+ <string name="pref_dream_text_title">Ticker text</string>
+</#if>
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/res/xml/dream_prefs.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/res/xml/dream_prefs.xml
new file mode 100644
index 0000000..997e5b2
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/res/xml/dream_prefs.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <EditTextPreference
+ android:key="@string/pref_dream_text_key"
+ android:title="@string/pref_dream_text_title"
+ android:defaultValue="@string/pref_dream_text_default" />
+
+</PreferenceScreen>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/res/xml/xml_dream.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/res/xml/xml_dream.xml.ftl
new file mode 100644
index 0000000..5367ae1
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/res/xml/xml_dream.xml.ftl
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<dream xmlns:android="http://schemas.android.com/apk/res/android"
+ android:settingsActivity="${packageName}/.${settingsClassName}" />
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/src/app_package/DreamService.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/src/app_package/DreamService.java.ftl
new file mode 100644
index 0000000..0dc51ca
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/src/app_package/DreamService.java.ftl
@@ -0,0 +1,141 @@
+package ${packageName};
+
+import java.util.Random;
+
+import android.animation.Animator;
+import android.animation.Animator.AnimatorListener;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.TimeInterpolator;
+import android.annotation.TargetApi;
+import android.content.SharedPreferences;
+import android.graphics.Point;
+import android.os.Build;
+import android.preference.PreferenceManager;
+import android.service.dreams.DreamService;
+import android.view.ViewPropertyAnimator;
+import android.view.animation.LinearInterpolator;
+import android.widget.TextView;
+<#if applicationPackage??>import ${applicationPackage}.R;</#if>
+
+/**
+ * This class is a sample implementation of a DreamService. When activated, a
+ * TextView will repeatedly, move from the left to the right of screen, at a
+ * random y-value.
+<#if configurable>
+ * The generated {@link BlahDreamServiceSettingsActivity} allows
+ * the user to change the text which is displayed.
+</#if>
+ * <p />
+ * Daydreams are only available on devices running API v17+.
+ */
+@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
+public class ${className} extends DreamService {
+
+ private static final TimeInterpolator sInterpolator = new LinearInterpolator();
+
+ private final AnimatorListener mAnimListener = new AnimatorListenerAdapter() {
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ // Start animation again
+ startTextViewScrollAnimation();
+ }
+
+ };
+
+ private final Random mRandom = new Random();
+ private final Point mPointSize = new Point();
+
+ private TextView mDreamTextView;
+ private ViewPropertyAnimator mAnimator;
+
+ @Override
+ public void onAttachedToWindow() {
+ super.onAttachedToWindow();
+
+ // Exit dream upon user touch?
+<#if isInteractive>
+ setInteractive(true);
+<#else>
+ setInteractive(false);
+</#if>
+
+ // Hide system UI?
+<#if isFullscreen>
+ setFullscreen(true);
+<#else>
+ setFullscreen(false);
+</#if>
+
+ // Keep screen at full brightness?
+<#if isScreenBright>
+ setScreenBright(true);
+<#else>
+ setScreenBright(false);
+</#if>
+
+ // Set the content view, just like you would with an Activity.
+ setContentView(R.layout.${class_name});
+
+ mDreamTextView = (TextView) findViewById(R.id.dream_text);
+ mDreamTextView.setText(getTextFromPreferences());
+ }
+
+ @Override
+ public void onDreamingStarted() {
+ super.onDreamingStarted();
+
+ // TODO: Begin animations or other behaviors here.
+
+ startTextViewScrollAnimation();
+ }
+
+ @Override
+ public void onDreamingStopped() {
+ super.onDreamingStopped();
+
+ // TODO: Stop anything that was started in onDreamingStarted()
+
+ mAnimator.cancel();
+ }
+
+ @Override
+ public void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+
+ // TODO: Dismantle resources
+ // (for example, detach from handlers and listeners).
+ }
+
+ private String getTextFromPreferences() {
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
+ return prefs.getString(getString(R.string.pref_dream_text_key),
+ getString(R.string.pref_dream_text_default));
+ }
+
+ private void startTextViewScrollAnimation() {
+ // Refresh Size of Window
+ getWindowManager().getDefaultDisplay().getSize(mPointSize);
+
+ final int windowWidth = mPointSize.x;
+ final int windowHeight = mPointSize.y;
+
+ // Move TextView so it's moved all the way to the left
+ mDreamTextView.setTranslationX(-mDreamTextView.getWidth());
+
+ // Move TextView to random y value
+ final int yRange = windowHeight - mDreamTextView.getHeight();
+ mDreamTextView.setTranslationY(mRandom.nextInt(yRange));
+
+ // Create an Animator and keep a reference to it
+ mAnimator = mDreamTextView.animate().translationX(windowWidth)
+ .setDuration(3000)
+ .setStartDelay(500)
+ .setListener(mAnimListener)
+ .setInterpolator(sInterpolator);
+
+ // Start the animation
+ mAnimator.start();
+ }
+
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/src/app_package/SettingsActivity.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/src/app_package/SettingsActivity.java.ftl
new file mode 100644
index 0000000..cd1b4c8
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/root/src/app_package/SettingsActivity.java.ftl
@@ -0,0 +1,37 @@
+package ${packageName};
+
+import android.annotation.TargetApi;
+import android.os.Build;
+import android.os.Bundle;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceFragment;
+<#if applicationPackage??>import ${applicationPackage}.R;</#if>
+
+/**
+ * A settings Activity for {@link ${className}}.
+ * <p />
+ * A DreamService can only be used on devices with API v17+, so it is safe
+ * for us to use a {@link PreferenceFragment} here.
+ */
+@TargetApi(Build.VERSION_CODES.HONEYCOMB)
+public class ${settingsClassName} extends PreferenceActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ getFragmentManager().beginTransaction()
+ .replace(android.R.id.content, new DreamPreferenceFragment()).commit();
+ }
+
+ public static class DreamPreferenceFragment extends PreferenceFragment {
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ addPreferencesFromResource(R.xml.${prefs_name});
+ }
+
+ }
+
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/template.xml
new file mode 100644
index 0000000..491d009
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Daydream/template.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0"?>
+<template
+ format="4"
+ revision="2"
+ name="Daydream"
+ description="Creates a new Daydream service component, for use on devices running Android 4.2 and later."
+ minBuildApi="17">
+
+ <parameter
+ id="className"
+ name="Class Name"
+ type="string"
+ constraints="class|unique|nonempty"
+ default="MyDaydreamService" />
+
+ <parameter
+ id="isInteractive"
+ name="Interactive?"
+ type="boolean"
+ default="false"
+ help="Whether or not the Daydream is interactive. Touching anywhere on a non-interactive Daydreams dismisses it." />
+
+ <parameter
+ id="isFullscreen"
+ name="Fullscreen?"
+ type="boolean"
+ default="true"
+ help="Whether or not the Daydream should be in fullscreen mode (in which case system UI will be hidden)." />
+
+ <parameter
+ id="isScreenBright"
+ name="Bright Screen?"
+ type="boolean"
+ default="true"
+ help="Whether or not the screen should be bright when this Daydream is running. The screen will be dim otherwise." />
+
+ <parameter
+ id="configurable"
+ name="Configuration Activity"
+ type="boolean"
+ default="false"
+ help="Whether or not to generate an associated settings Activity." />
+
+ <globals file="globals.xml.ftl" />
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/IntentService/globals.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/IntentService/globals.xml.ftl
new file mode 100644
index 0000000..3b38cfd
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/IntentService/globals.xml.ftl
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<globals>
+ <global id="srcOut" value="${srcDir}/${slashedPackageName(packageName)}" />
+ <global id="manifestOut" value="${manifestDir}" />
+ <global id="relativePackage" value="<#if relativePackage?has_content>${relativePackage}<#else>${packageName}</#if>" />
+</globals>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/IntentService/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/IntentService/recipe.xml.ftl
new file mode 100644
index 0000000..197fc1f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/IntentService/recipe.xml.ftl
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<recipe>
+ <merge from="AndroidManifest.xml.ftl"
+ to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />
+ <instantiate from="src/app_package/IntentService.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/${className}.java" />
+ <open file="${escapeXmlAttribute(srcOut)}/${className}.java" />
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/IntentService/root/AndroidManifest.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/IntentService/root/AndroidManifest.xml.ftl
new file mode 100644
index 0000000..f49f6f5
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/IntentService/root/AndroidManifest.xml.ftl
@@ -0,0 +1,9 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <application>
+ <service android:name="${relativePackage}.${className}"
+ android:exported="false" >
+ </service>
+ </application>
+
+</manifest>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/IntentService/root/src/app_package/IntentService.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/IntentService/root/src/app_package/IntentService.java.ftl
new file mode 100644
index 0000000..c6848ef
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/IntentService/root/src/app_package/IntentService.java.ftl
@@ -0,0 +1,106 @@
+package ${packageName};
+
+import android.app.IntentService;
+import android.content.Intent;
+<#if includeHelper>import android.content.Context;</#if>
+
+/**
+ * An {@link IntentService} subclass for handling asynchronous task requests in
+ * a service on a separate handler thread.
+ * <p>
+<#if includeHelper>
+ * TODO: Customize class - update intent actions, extra parameters and static
+ * helper methods.
+<#else>
+ * TODO: Customize class - update intent actions and extra parameters.
+</#if>
+ */
+public class ${className} extends IntentService {
+<#if !includeHelper>
+ // TODO: Rename actions, choose action names that describe tasks that this
+ // IntentService can perform, e.g. ACTION_FETCH_NEW_ITEMS
+ public static final String ACTION_FOO = "${packageName}.action.FOO";
+ public static final String ACTION_BAZ = "${packageName}.action.BAZ";
+
+ // TODO: Rename parameters
+ public static final String EXTRA_PARAM1 = "${packageName}.extra.PARAM1";
+ public static final String EXTRA_PARAM2 = "${packageName}.extra.PARAM2";
+<#else>
+ // TODO: Rename actions, choose action names that describe tasks that this
+ // IntentService can perform, e.g. ACTION_FETCH_NEW_ITEMS
+ private static final String ACTION_FOO = "${packageName}.action.FOO";
+ private static final String ACTION_BAZ = "${packageName}.action.BAZ";
+
+ // TODO: Rename parameters
+ private static final String EXTRA_PARAM1 = "${packageName}.extra.PARAM1";
+ private static final String EXTRA_PARAM2 = "${packageName}.extra.PARAM2";
+
+ /**
+ * Starts this service to perform action Foo with the given parameters. If
+ * the service is already performing a task this action will be queued.
+ *
+ * @see IntentService
+ */
+ // TODO: Customize helper method
+ public static void startActionFoo(Context context, String param1, String param2) {
+ Intent intent = new Intent(context, ${className}.class);
+ intent.setAction(ACTION_FOO);
+ intent.putExtra(EXTRA_PARAM1, param1);
+ intent.putExtra(EXTRA_PARAM2, param2);
+ context.startService(intent);
+ }
+
+ /**
+ * Starts this service to perform action Baz with the given parameters. If
+ * the service is already performing a task this action will be queued.
+ *
+ * @see IntentService
+ */
+ // TODO: Customize helper method
+ public static void startActionBaz(Context context, String param1, String param2) {
+ Intent intent = new Intent(context, ${className}.class);
+ intent.setAction(ACTION_BAZ);
+ intent.putExtra(EXTRA_PARAM1, param1);
+ intent.putExtra(EXTRA_PARAM2, param2);
+ context.startService(intent);
+ }
+</#if>
+
+ public ${className}() {
+ super("${className}");
+ }
+
+ @Override
+ protected void onHandleIntent(Intent intent) {
+ if (intent != null) {
+ final String action = intent.getAction();
+ if (ACTION_FOO.equals(action)) {
+ final String param1 = intent.getStringExtra(EXTRA_PARAM1);
+ final String param2 = intent.getStringExtra(EXTRA_PARAM2);
+ handleActionFoo(param1, param2);
+ } else if (ACTION_BAZ.equals(action)) {
+ final String param1 = intent.getStringExtra(EXTRA_PARAM1);
+ final String param2 = intent.getStringExtra(EXTRA_PARAM2);
+ handleActionBaz(param1, param2);
+ }
+ }
+ }
+
+ /**
+ * Handle action Foo in the provided background thread with the provided
+ * parameters.
+ */
+ private void handleActionFoo(String param1, String param2) {
+ // TODO: Handle action Foo
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+ /**
+ * Handle action Baz in the provided background thread with the provided
+ * parameters.
+ */
+ private void handleActionBaz(String param1, String param2) {
+ // TODO: Handle action Baz
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/IntentService/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/IntentService/template.xml
new file mode 100644
index 0000000..7a0cc60
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/IntentService/template.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0"?>
+<template
+ format="4"
+ revision="2"
+ name="Service (IntentService)"
+ description="Creates a new intent service class."
+ minApi="3"
+ minBuildApi="3">
+
+ <category value="Service" />
+
+ <parameter
+ id="className"
+ name="Class Name"
+ type="string"
+ constraints="class|unique|nonempty"
+ default="MyIntentService" />
+
+ <parameter
+ id="includeHelper"
+ name="Include helper start methods?"
+ type="boolean"
+ default="true"
+ help="Generate static helper methods to start the service e.g. MyIntentService.startAction()" />
+
+ <globals file="globals.xml.ftl" />
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/JavaFolder/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/JavaFolder/recipe.xml.ftl
new file mode 100644
index 0000000..a470666
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/JavaFolder/recipe.xml.ftl
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<recipe>
+
+ <#if remapFolder>
+ <mkdir at="${escapeXmlAttribute(projectOut)}/${escapeXmlAttribute(newLocation)}" />
+ <merge from="build.gradle.ftl"
+ to="${escapeXmlAttribute(projectOut)}/build.gradle" />
+ <#else>
+ <mkdir at="${escapeXmlAttribute(manifestOut)}/java/" />
+ </#if>
+
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/JavaFolder/root/build.gradle.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/JavaFolder/root/build.gradle.ftl
new file mode 100644
index 0000000..3692aaa
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/JavaFolder/root/build.gradle.ftl
@@ -0,0 +1 @@
+android {sourceSets {${sourceProviderName} {java.srcDirs=['src/${sourceProviderName}/java', '${newLocation}']}}} \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/JavaFolder/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/JavaFolder/template.xml
new file mode 100644
index 0000000..df0cd6f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/JavaFolder/template.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<template
+ format="4"
+ revision="2"
+ name="Java Folder"
+ description="Creates a source root for Java files."
+ >
+
+ <category value="Folder" />
+
+ <parameter
+ id="remapFolder"
+ name="Change Folder Location"
+ type="boolean"
+ constraints=""
+ default="false"
+ help="Change the folder location to another folder within the module." />
+
+ <parameter
+ id="newLocation"
+ name="New Folder Location"
+ type="string"
+ constraints="nonempty|source_set_folder|unique"
+ suggest="src/${sourceProviderName}/java/"
+ help="The location for the new folder"
+ visibility="remapFolder" />
+
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/JniFolder/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/JniFolder/recipe.xml.ftl
new file mode 100644
index 0000000..29e7e98
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/JniFolder/recipe.xml.ftl
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<recipe>
+
+ <#if remapFolder>
+ <mkdir at="${escapeXmlAttribute(projectOut)}/${escapeXmlAttribute(newLocation)}" />
+ <merge from="build.gradle.ftl"
+ to="${escapeXmlAttribute(projectOut)}/build.gradle" />
+ <#else>
+ <mkdir at="${escapeXmlAttribute(manifestOut)}/jni/" />
+ </#if>
+
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/JniFolder/root/build.gradle.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/JniFolder/root/build.gradle.ftl
new file mode 100644
index 0000000..d4ab6e3
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/JniFolder/root/build.gradle.ftl
@@ -0,0 +1 @@
+android {sourceSets {${sourceProviderName} {jni.srcDirs=['src/${sourceProviderName}/jni', '${newLocation}']}}} \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/JniFolder/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/JniFolder/template.xml
new file mode 100644
index 0000000..0067618
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/JniFolder/template.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<template
+ format="4"
+ revision="2"
+ name="JNI Folder"
+ description="Creates a source root for Java Native Interface files."
+ >
+
+ <category value="Folder" />
+
+ <parameter
+ id="remapFolder"
+ name="Change Folder Location"
+ type="boolean"
+ constraints=""
+ default="false"
+ help="Change the folder location to another folder within the module." />
+
+ <parameter
+ id="newLocation"
+ name="New Folder Location"
+ type="string"
+ constraints="nonempty|source_set_folder|unique"
+ suggest="src/${sourceProviderName}/jni/"
+ help="The location for the new folder"
+ visibility="remapFolder" />
+
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/LayoutResourceFile/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/LayoutResourceFile/recipe.xml.ftl
new file mode 100644
index 0000000..a73adc7
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/LayoutResourceFile/recipe.xml.ftl
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<recipe>
+
+ <instantiate from="res/layout.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/layout/${escapeXmlAttribute(layoutName)}.xml" />
+ <open file="${escapeXmlAttribute(resOut)}/layout/${escapeXmlAttribute(layoutName)}.xml" />
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/LayoutResourceFile/root/res/layout.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/LayoutResourceFile/root/res/layout.xml.ftl
new file mode 100644
index 0000000..18114ab
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/LayoutResourceFile/root/res/layout.xml.ftl
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<${rootTag} xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+</${rootTag}>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/LayoutResourceFile/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/LayoutResourceFile/template.xml
new file mode 100644
index 0000000..abca0d2
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/LayoutResourceFile/template.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0"?>
+<template
+ format="4"
+ revision="1"
+ name="Layout XML File"
+ description="Creates a new XML layout file."
+ >
+
+ <category value="XML" />
+
+ <parameter
+ id="layoutName"
+ name="Layout File Name"
+ type="string"
+ constraints="layout|unique|nonempty"
+ default="layout"
+ help="Name of the layout XML file." />
+
+ <parameter
+ id="rootTag"
+ name="Root Tag"
+ type="string"
+ constraints="nonempty"
+ default="LinearLayout"
+ help="The root XML tag for the new file" />
+
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/globals.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/globals.xml.ftl
new file mode 100644
index 0000000..9e56824
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/globals.xml.ftl
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<globals>
+ <global id="useSupport" type="boolean" value="${(minApiLevel lt 11)?string}" />
+ <global id="SupportPackage" value="${(minApiLevel lt 11)?string('.support.v4','')}" />
+ <global id="resOut" value="${resDir}" />
+ <global id="srcOut" value="${srcDir}/${slashedPackageName(packageName)}" />
+ <global id="collection_name" value="${extractLetters(objectKind?lower_case)}" />
+ <global id="className" value="${extractLetters(objectKind)}Fragment" />
+ <global id="fragment_layout" value="fragment_${extractLetters(objectKind?lower_case)}" />
+ <global id="relativePackage" value="<#if relativePackage?has_content>${relativePackage}<#else>${packageName}</#if>" />
+</globals>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/recipe.xml.ftl
new file mode 100644
index 0000000..5236d3c
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/recipe.xml.ftl
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<recipe>
+
+ <#if useSupport><dependency mavenUrl="com.android.support:support-v4:19.+"/></#if>
+<#if switchGrid == true>
+ <merge from="res/values/refs.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values/refs.xml" />
+ <merge from="res/values/refs_lrg.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values-large/refs.xml" />
+ <merge from="res/values/refs_lrg.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values-sw600dp/refs.xml" />
+
+ <instantiate from="res/layout/fragment_grid.xml"
+ to="${escapeXmlAttribute(resOut)}/layout/${fragment_layout}_grid.xml" />
+
+ <instantiate from="res/layout/fragment_list.xml"
+ to="${escapeXmlAttribute(resOut)}/layout/${fragment_layout}_list.xml" />
+</#if>
+
+ <instantiate from="src/app_package/ListFragment.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/${className}.java" />
+
+ <instantiate from="src/app_package/dummy/DummyContent.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/dummy/DummyContent.java" />
+
+ <open file="${escapeXmlAttribute(srcOut)}/${className}.java" />
+
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/res/layout/fragment_grid.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/res/layout/fragment_grid.xml
new file mode 100644
index 0000000..333ea8e
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/res/layout/fragment_grid.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context="${relativePackage}.${className}">
+
+ <GridView
+ android:id="@android:id/list"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:numColumns="2" />
+
+ <TextView
+ android:id="@android:id/empty"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center" />
+
+</FrameLayout>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/res/layout/fragment_list.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/res/layout/fragment_list.xml
new file mode 100644
index 0000000..cc2aa02
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/res/layout/fragment_list.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context="${relativePackage}.${className}">
+
+ <ListView
+ android:id="@android:id/list"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+ <TextView
+ android:id="@android:id/empty"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center" />
+
+</FrameLayout>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/res/values-large/refs_lrg.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/res/values-large/refs_lrg.xml.ftl
new file mode 100644
index 0000000..fb20a27
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/res/values-large/refs_lrg.xml.ftl
@@ -0,0 +1,12 @@
+<resources>
+
+ <!--
+ Layout alias to replace the single-pane version of the layout with a
+ two-pane version on Large screens.
+
+ For more on layout aliases, see:
+ http://developer.android.com/training/multiscreen/screensizes.html#TaskUseAliasFilters
+ -->
+ <item name="${fragment_layout}" type="layout">@layout/${fragment_layout}_grid</item>
+
+</resources> \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/res/values-sw600dp/refs_lrg.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/res/values-sw600dp/refs_lrg.xml.ftl
new file mode 100644
index 0000000..fb20a27
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/res/values-sw600dp/refs_lrg.xml.ftl
@@ -0,0 +1,12 @@
+<resources>
+
+ <!--
+ Layout alias to replace the single-pane version of the layout with a
+ two-pane version on Large screens.
+
+ For more on layout aliases, see:
+ http://developer.android.com/training/multiscreen/screensizes.html#TaskUseAliasFilters
+ -->
+ <item name="${fragment_layout}" type="layout">@layout/${fragment_layout}_grid</item>
+
+</resources> \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/res/values/refs.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/res/values/refs.xml.ftl
new file mode 100644
index 0000000..59ca92c
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/res/values/refs.xml.ftl
@@ -0,0 +1,12 @@
+<resources>
+
+ <!--
+ Layout alias to replace the single-pane version of the layout with a
+ two-pane version on Large screens.
+
+ For more on layout aliases, see:
+ http://developer.android.com/training/multiscreen/screensizes.html#TaskUseAliasFilters
+ -->
+ <item name="${fragment_layout}" type="layout">@layout/${fragment_layout}_list</item>
+
+</resources> \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/res/values/refs_lrg.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/res/values/refs_lrg.xml.ftl
new file mode 100644
index 0000000..fb20a27
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/res/values/refs_lrg.xml.ftl
@@ -0,0 +1,12 @@
+<resources>
+
+ <!--
+ Layout alias to replace the single-pane version of the layout with a
+ two-pane version on Large screens.
+
+ For more on layout aliases, see:
+ http://developer.android.com/training/multiscreen/screensizes.html#TaskUseAliasFilters
+ -->
+ <item name="${fragment_layout}" type="layout">@layout/${fragment_layout}_grid</item>
+
+</resources> \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/src/app_package/ListFragment.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/src/app_package/ListFragment.java.ftl
new file mode 100644
index 0000000..2e130a5
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/src/app_package/ListFragment.java.ftl
@@ -0,0 +1,195 @@
+package ${packageName};
+
+import android.app.Activity;
+import android.os.Bundle;
+<#if switchGrid == true>
+import android${SupportPackage}.app.Fragment;
+import android.view.LayoutInflater;
+<#else>
+import android${SupportPackage}.app.ListFragment;
+</#if>
+import android.view.View;
+<#if switchGrid == true>
+import android.view.ViewGroup;
+import android.widget.AbsListView;
+import android.widget.AdapterView;
+</#if>
+import android.widget.ArrayAdapter;
+<#if switchGrid == true>
+import android.widget.ListAdapter;
+import android.widget.TextView;
+<#else>
+import android.widget.ListView;
+</#if>
+<#if applicationPackage??>import ${applicationPackage}.R;</#if>
+
+import ${packageName}.dummy.DummyContent;
+
+/**
+ * A fragment representing a list of Items.
+ * <p />
+<#if switchGrid == true>
+ * Large screen devices (such as tablets) are supported by replacing the ListView
+ * with a GridView.
+</#if>
+ * <p />
+ * Activities containing this fragment MUST implement the {@link Callbacks}
+ * interface.
+ */
+<#if switchGrid == true>
+public class ${className} extends Fragment implements AbsListView.OnItemClickListener {
+<#else>
+public class ${className} extends ListFragment {
+</#if>
+
+<#if includeFactory>
+ // TODO: Rename parameter arguments, choose names that match
+ // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
+ private static final String ARG_PARAM1 = "param1";
+ private static final String ARG_PARAM2 = "param2";
+
+ // TODO: Rename and change types of parameters
+ private String mParam1;
+ private String mParam2;
+
+</#if>
+ private OnFragmentInteractionListener mListener;
+
+<#if switchGrid == true>
+ /**
+ * The fragment's ListView/GridView.
+ */
+ private AbsListView mListView;
+
+ /**
+ * The Adapter which will be used to populate the ListView/GridView with
+ * Views.
+ */
+ private ListAdapter mAdapter;
+
+</#if>
+<#if includeFactory>
+ // TODO: Rename and change types of parameters
+ public static ${className} newInstance(String param1, String param2) {
+ ${className} fragment = new ${className}();
+ Bundle args = new Bundle();
+ args.putString(ARG_PARAM1, param1);
+ args.putString(ARG_PARAM2, param2);
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+</#if>
+ /**
+ * Mandatory empty constructor for the fragment manager to instantiate the
+ * fragment (e.g. upon screen orientation changes).
+ */
+ public ${className}() {
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+<#if includeFactory>
+ if (getArguments() != null) {
+ mParam1 = getArguments().getString(ARG_PARAM1);
+ mParam2 = getArguments().getString(ARG_PARAM2);
+ }
+</#if>
+
+ // TODO: Change Adapter to display your content
+<#if switchGrid == true>
+ mAdapter = new ArrayAdapter<DummyContent.DummyItem>(getActivity(),
+ android.R.layout.simple_list_item_1, android.R.id.text1, DummyContent.ITEMS);
+<#else>
+ setListAdapter(new ArrayAdapter<DummyContent.DummyItem>(getActivity(),
+ android.R.layout.simple_list_item_1, android.R.id.text1, DummyContent.ITEMS));
+</#if>
+ }
+
+<#if switchGrid == true>
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.${fragment_layout}, container, false);
+
+ // Set the adapter
+ mListView = (AbsListView) view.findViewById(android.R.id.list);
+ ((AdapterView<ListAdapter>) mListView).setAdapter(mAdapter);
+
+ // Set OnItemClickListener so we can be notified on item clicks
+ mListView.setOnItemClickListener(this);
+
+ return view;
+ }
+</#if>
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ try {
+ mListener = (OnFragmentInteractionListener) activity;
+ } catch (ClassCastException e) {
+ throw new ClassCastException(activity.toString()
+ + " must implement OnFragmentInteractionListener");
+ }
+ }
+
+ @Override
+ public void onDetach() {
+ super.onDetach();
+ mListener = null;
+ }
+
+<#if switchGrid == true>
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ if (null != mListener) {
+ // Notify the active callbacks interface (the activity, if the
+ // fragment is attached to one) that an item has been selected.
+ mListener.onFragmentInteraction(DummyContent.ITEMS.get(position).id);
+ }
+ }
+
+ /**
+ * The default content for this Fragment has a TextView that is shown when
+ * the list is empty. If you would like to change the text, call this method
+ * to supply the text it should use.
+ */
+ public void setEmptyText(CharSequence emptyText) {
+ View emptyView = mListView.getEmptyView();
+
+ if (emptyText instanceof TextView) {
+ ((TextView) emptyView).setText(emptyText);
+ }
+ }
+<#else>
+ @Override
+ public void onListItemClick(ListView l, View v, int position, long id) {
+ super.onListItemClick(l, v, position, id);
+
+ if (null != mListener) {
+ // Notify the active callbacks interface (the activity, if the
+ // fragment is attached to one) that an item has been selected.
+ mListener.onFragmentInteraction(DummyContent.ITEMS.get(position).id);
+ }
+ }
+</#if>
+
+ /**
+ * This interface must be implemented by activities that contain this
+ * fragment to allow an interaction in this fragment to be communicated
+ * to the activity and potentially other fragments contained in that
+ * activity.
+ * <p>
+ * See the Android Training lesson <a href=
+ * "http://developer.android.com/training/basics/fragments/communicating.html"
+ * >Communicating with Other Fragments</a> for more information.
+ */
+ public interface OnFragmentInteractionListener {
+ // TODO: Update argument type and name
+ public void onFragmentInteraction(String id);
+ }
+
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/src/app_package/dummy/DummyContent.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/src/app_package/dummy/DummyContent.java.ftl
new file mode 100644
index 0000000..3545ba3
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/root/src/app_package/dummy/DummyContent.java.ftl
@@ -0,0 +1,55 @@
+package ${packageName}.dummy;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Helper class for providing sample content for user interfaces created by
+ * Android template wizards.
+ * <p>
+ * TODO: Replace all uses of this class before publishing your app.
+ */
+public class DummyContent {
+
+ /**
+ * An array of sample (dummy) items.
+ */
+ public static List<DummyItem> ITEMS = new ArrayList<DummyItem>();
+
+ /**
+ * A map of sample (dummy) items, by ID.
+ */
+ public static Map<String, DummyItem> ITEM_MAP = new HashMap<String, DummyItem>();
+
+ static {
+ // Add 3 sample items.
+ addItem(new DummyItem("1", "Item 1"));
+ addItem(new DummyItem("2", "Item 2"));
+ addItem(new DummyItem("3", "Item 3"));
+ }
+
+ private static void addItem(DummyItem item) {
+ ITEMS.add(item);
+ ITEM_MAP.put(item.id, item);
+ }
+
+ /**
+ * A dummy item representing a piece of content.
+ */
+ public static class DummyItem {
+ public String id;
+ public String content;
+
+ public DummyItem(String id, String content) {
+ this.id = id;
+ this.content = content;
+ }
+
+ @Override
+ public String toString() {
+ return content;
+ }
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/template.xml
new file mode 100644
index 0000000..3d1f96d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/template.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0"?>
+<template
+ format="4"
+ revision="2"
+ name="Fragment (List)"
+ description="Creates a new empty fragment containing a list that can optionally change to a grid when on large screens. Compatible back to API level 4."
+ minApi="7"
+ minBuildApi="8">
+
+ <category value="Fragment" />
+
+ <dependency name="android-support-v4" revision="8" />
+
+ <parameter
+ id="packageName"
+ name="Package name"
+ type="string"
+ constraints="package"
+ default="com.mycompany.myapp" />
+
+ <parameter
+ id="objectKind"
+ name="Object Kind"
+ type="string"
+ constraints="nonempty"
+ default="Item"
+ help="Other examples are 'Person', 'Book', etc." />
+
+ <parameter
+ id="includeFactory"
+ name="Include fragment factory methods?"
+ type="boolean"
+ default="true"
+ help="Generate static fragment factory methods for easy instantiation" />
+
+ <parameter
+ id="switchGrid"
+ name="Switch to grid view on large screens?"
+ type="boolean"
+ default="true" />
+
+ <!-- 128x128 thumbnails relative to template.xml -->
+ <thumbs>
+ <!-- default thumbnail is required -->
+ <thumb>templates_list_fragment.png</thumb>
+ </thumbs>
+
+
+ <globals file="globals.xml.ftl" />
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/templates_list_fragment.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/templates_list_fragment.png
new file mode 100644
index 0000000..92ac799
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/ListFragment/templates_list_fragment.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/globals.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/globals.xml.ftl
new file mode 100644
index 0000000..93d7472
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/globals.xml.ftl
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<globals>
+ <global id="manifestOut" value="${manifestDir}" />
+ <global id="resOut" value="${resDir}" />
+ <global id="srcOut" value="${srcDir}/${slashedPackageName(packageName)}" />
+ <global id="notificationName" value="${className?replace('notification','','i')}" />
+ <global id="notification_name" value="${camelCaseToUnderscore(className?replace('notification','','i'))}" />
+ <global id="display_title" value="${camelCaseToUnderscore(className?replace('notification','','i'))?replace('_',' ')?cap_first}" />
+ <global id="icon_resource" value="ic_stat_${camelCaseToUnderscore(className?replace('notification','','i'))}" />
+</globals>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/recipe.xml.ftl
new file mode 100644
index 0000000..c08a91f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/recipe.xml.ftl
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<recipe>
+
+ <dependency mavenUrl="com.android.support:support-v4:19.+"/>
+ <merge from="AndroidManifest.xml.ftl"
+ to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />
+
+ <#if expandedStyle == "picture">
+ <copy from="res/drawable-nodpi/example_picture_large.png"
+ to="${escapeXmlAttribute(resOut)}/drawable-nodpi/example_picture.png" />
+ <#else>
+ <copy from="res/drawable-nodpi/example_picture_small.png"
+ to="${escapeXmlAttribute(resOut)}/drawable-nodpi/example_picture.png" />
+ </#if>
+
+ <#if moreActions>
+ <copy from="res/drawable-hdpi"
+ to="${escapeXmlAttribute(resOut)}/drawable-hdpi" />
+ <copy from="res/drawable-mdpi"
+ to="${escapeXmlAttribute(resOut)}/drawable-mdpi" />
+ <copy from="res/drawable-xhdpi"
+ to="${escapeXmlAttribute(resOut)}/drawable-xhdpi" />
+ </#if>
+
+ <merge from="res/values/strings.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values/strings.xml" />
+
+ <instantiate from="src/app_package/NotificationHelper.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/${className}.java" />
+ <open file="${escapeXmlAttribute(srcOut)}/${className}.java" />
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/AndroidManifest.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/AndroidManifest.xml.ftl
new file mode 100644
index 0000000..fb564cc
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/AndroidManifest.xml.ftl
@@ -0,0 +1,5 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <uses-permission android:name="android.permission.VIBRATE" />
+
+</manifest>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-hdpi/ic_action_stat_reply.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-hdpi/ic_action_stat_reply.png
new file mode 100644
index 0000000..835d96f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-hdpi/ic_action_stat_reply.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-hdpi/ic_action_stat_share.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-hdpi/ic_action_stat_share.png
new file mode 100644
index 0000000..c329f58
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-hdpi/ic_action_stat_share.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-mdpi/ic_action_stat_reply.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-mdpi/ic_action_stat_reply.png
new file mode 100644
index 0000000..9e34465
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-mdpi/ic_action_stat_reply.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-mdpi/ic_action_stat_share.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-mdpi/ic_action_stat_share.png
new file mode 100644
index 0000000..056deb5
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-mdpi/ic_action_stat_share.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-nodpi/example_picture_large.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-nodpi/example_picture_large.png
new file mode 100644
index 0000000..1e69424
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-nodpi/example_picture_large.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-nodpi/example_picture_small.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-nodpi/example_picture_small.png
new file mode 100644
index 0000000..e0627f5
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-nodpi/example_picture_small.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-xhdpi/ic_action_stat_reply.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-xhdpi/ic_action_stat_reply.png
new file mode 100644
index 0000000..4cc854a
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-xhdpi/ic_action_stat_reply.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-xhdpi/ic_action_stat_share.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-xhdpi/ic_action_stat_share.png
new file mode 100644
index 0000000..15549b0
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/drawable-xhdpi/ic_action_stat_share.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/values/strings.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/values/strings.xml.ftl
new file mode 100644
index 0000000..5f3da57
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/res/values/strings.xml.ftl
@@ -0,0 +1,13 @@
+<resources>
+
+ <string name="${notification_name}_notification_title_template">${escapeXmlString(display_title)}: %1$s</string>
+
+ <!-- TODO: remove this placeholder text -->
+ <string name="${notification_name}_notification_placeholder_text_template">You said %1$s and lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam non enim magna. Morbi dictum, velit vel semper venenatis, magna odio volutpat velit, at ullamcorper nulla lacus sed turpis. Pellentesque vitae metus elit, nec tincidunt tellus. Integer sed nisl sem, ullamcorper ornare lacus. Duis ac mauris sed massa congue volutpat. Donec sed erat sit amet turpis viverra rhoncus sit amet nec magna. Donec lacinia ligula at libero volutpat volutpat nec nec tortor.</string>
+
+ <#if moreActions>
+ <string name="action_share">Share</string>
+ <string name="action_reply">Reply</string>
+ </#if>
+
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/src/app_package/NotificationHelper.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/src/app_package/NotificationHelper.java.ftl
new file mode 100644
index 0000000..6c39bfe
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/root/src/app_package/NotificationHelper.java.ftl
@@ -0,0 +1,206 @@
+package ${packageName};
+
+import android.annotation.TargetApi;
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.os.Build;
+import android.support.v4.app.NotificationCompat;
+<#if expandedStyle == 'list'>
+import android.graphics.Color;
+import android.text.SpannableStringBuilder;
+import android.text.style.ForegroundColorSpan;
+</#if>
+<#if applicationPackage??>import ${applicationPackage}.R;</#if>
+
+/**
+ * Helper class for showing and canceling ${display_title?lower_case}
+ * notifications.
+ * <p>
+ * This class makes heavy use of the {@link NotificationCompat.Builder} helper
+ * class to create notifications in a backward-compatible way.
+ */
+public class ${className} {
+ /**
+ * The unique identifier for this type of notification.
+ */
+ private static final String NOTIFICATION_TAG = "${notificationName}";
+
+ /**
+ * Shows the notification, or updates a previously shown notification of
+ * this type, with the given parameters.
+ * <p>
+ * TODO: Customize this method's arguments to present relevant content in
+ * the notification.
+ * <p>
+ * TODO: Customize the contents of this method to tweak the behavior and
+ * presentation of ${display_title?lower_case} notifications. Make
+ * sure to follow the
+ * <a href="https://developer.android.com/design/patterns/notifications.html">
+ * Notification design guidelines</a> when doing so.
+ *
+ * @see #cancel(Context)
+ */
+ public static void notify(final Context context,
+ final String exampleString, final int number) {
+ final Resources res = context.getResources();
+
+ <#if expandedStyle == "picture">
+ // This image is used as the notification's large icon (thumbnail) when
+ // the notification is collapsed, and as the big picture to show when
+ // the notification is expanded.
+ <#else>
+ // This image is used as the notification's large icon (thumbnail).
+ // TODO: Remove this if your notification has no relevant thumbnail.
+ </#if>
+ final Bitmap picture = BitmapFactory.decodeResource(res, R.drawable.example_picture);
+
+ <#if expandedStyle == 'list'>
+ final SpannableStringBuilder exampleItem = new SpannableStringBuilder();
+ exampleItem.append("Dummy");
+ exampleItem.setSpan(new ForegroundColorSpan(Color.WHITE), 0, exampleItem.length(), 0);
+ exampleItem.append(" Example content");
+ </#if>
+
+ final String ticker = exampleString;
+ final String title = res.getString(
+ R.string.${notification_name}_notification_title_template, exampleString);
+ final String text = res.getString(
+ R.string.${notification_name}_notification_placeholder_text_template, exampleString);
+
+ final NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
+
+ // Set appropriate defaults for the notification light, sound,
+ // and vibration.
+ .setDefaults(Notification.DEFAULT_ALL)
+
+ // Set required fields, including the small icon, the
+ // notification title, and text.
+ .setSmallIcon(R.drawable.${icon_resource})
+ .setContentTitle(title)
+ .setContentText(text)
+
+ // All fields below this line are optional.
+
+ // Use a default priority (recognized on devices running Android
+ // 4.1 or later)
+ .setPriority(NotificationCompat.PRIORITY_DEFAULT)
+
+ // Provide a large icon, shown with the notification in the
+ // notification drawer on devices running Android 3.0 or later.
+ .setLargeIcon(picture)
+
+ // Set ticker text (preview) information for this notification.
+ .setTicker(ticker)
+
+ // Show a number. This is useful when stacking notifications of
+ // a single type.
+ .setNumber(number)
+
+ // If this notification relates to a past or upcoming event, you
+ // should set the relevant time information using the setWhen
+ // method below. If this call is omitted, the notification's
+ // timestamp will by set to the time at which it was shown.
+ // TODO: Call setWhen if this notification relates to a past or
+ // upcoming event. The sole argument to this method should be
+ // the notification timestamp in milliseconds.
+ //.setWhen(...)
+
+ // Set the pending intent to be initiated when the user touches
+ // the notification.
+ .setContentIntent(
+ PendingIntent.getActivity(
+ context,
+ 0,
+ new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com")),
+ PendingIntent.FLAG_UPDATE_CURRENT))
+ <#if expandedStyle == 'picture'>
+
+ // Show an expanded photo on devices running Android 4.1 or
+ // later.
+ .setStyle(new NotificationCompat.BigPictureStyle()<#--
+ TODO: .bigLargeIcon(null) when the support library supports it -->
+ .bigPicture(picture)
+ .setBigContentTitle(title)
+ .setSummaryText("Dummy summary text"))
+ <#elseif expandedStyle == 'list'>
+
+ // Show an expanded list of items on devices running Android 4.1
+ // or later.
+ .setStyle(new NotificationCompat.InboxStyle()
+ .addLine(exampleItem)
+ .addLine(exampleItem)
+ .addLine(exampleItem)
+ .addLine(exampleItem)
+ .setBigContentTitle(title)
+ .setSummaryText("Dummy summary text"))
+ <#elseif expandedStyle == 'text'>
+
+ // Show expanded text content on devices running Android 4.1 or
+ // later.
+ .setStyle(new NotificationCompat.BigTextStyle()
+ .bigText(text)
+ .setBigContentTitle(title)
+ .setSummaryText("Dummy summary text"))
+ </#if>
+ <#if moreActions>
+
+ // Example additional actions for this notification. These will
+ // only show on devices running Android 4.1 or later, so you
+ // should ensure that the activity in this notification's
+ // content intent provides access to the same actions in
+ // another way.
+ .addAction(
+ R.drawable.ic_action_stat_share,
+ res.getString(R.string.action_share),
+ PendingIntent.getActivity(
+ context,
+ 0,
+ Intent.createChooser(new Intent(Intent.ACTION_SEND)
+ .setType("text/plain")
+ .putExtra(Intent.EXTRA_TEXT, "Dummy text"), "Dummy title"),
+ PendingIntent.FLAG_UPDATE_CURRENT))
+ .addAction(
+ R.drawable.ic_action_stat_reply,
+ res.getString(R.string.action_reply),
+ null)
+ </#if>
+
+ // Automatically dismiss the notification when it is touched.
+ .setAutoCancel(true);
+
+ notify(context, builder.build());
+ }
+
+ @TargetApi(Build.VERSION_CODES.ECLAIR)
+ private static void notify(final Context context, final Notification notification) {
+ final NotificationManager nm = (NotificationManager) context
+ .getSystemService(Context.NOTIFICATION_SERVICE);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) {
+ nm.notify(NOTIFICATION_TAG, 0, notification);
+ } else {
+ nm.notify(NOTIFICATION_TAG.hashCode(), notification);
+ }
+ }
+
+ /**
+ * Cancels any notifications of this type previously shown using
+ * {@link #notify(Context, String, int)}.
+ */
+ @TargetApi(Build.VERSION_CODES.ECLAIR)
+ public static void cancel(final Context context) {
+ final NotificationManager nm = (NotificationManager) context
+ .getSystemService(Context.NOTIFICATION_SERVICE);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR) {
+ nm.cancel(NOTIFICATION_TAG, 0);
+ } else {
+ nm.cancel(NOTIFICATION_TAG.hashCode());
+ }
+ }
+} \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template.xml
new file mode 100644
index 0000000..2a13999
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0"?>
+<template
+ format="4"
+ revision="2"
+ name="Notification"
+ description="Creates a new helper class that can show or cancel a status bar notification."
+ minApi="4">
+
+ <category value="UI Component" />
+
+ <dependency name="android-support-v4" revision="10" />
+
+ <parameter
+ id="className"
+ name="Class Name"
+ type="string"
+ constraints="class|unique|nonempty"
+ default="NewMessageNotification"
+ help="The name of the notification helper class to create, e.g. 'NewMessageNotification'." />
+
+ <parameter
+ id="expandedStyle"
+ name="Style when Expanded"
+ type="enum"
+ default="text"
+ help="The expanded notification style to use for devices running Android 4.1 or later." >
+ <option id="none">None</option>
+ <option id="text">More text</option>
+ <option id="picture">Picture</option>
+ <option id="list">List</option>
+ </parameter>
+
+ <parameter
+ id="moreActions"
+ name="Show Additional Actions"
+ type="boolean"
+ default="true"
+ help="If true, this notification will contain additional actions when expanded on devices running Android 4.1 or later." />
+
+ <globals file="globals.xml.ftl" />
+ <execute file="recipe.xml.ftl" />
+
+ <thumbs>
+ <thumb>template_notification_text_actions.png</thumb>
+ <thumb expandedStyle="none">template_notification_none.png</thumb>
+ <thumb expandedStyle="none" moreActions="true">template_notification_none_actions.png</thumb>
+ <thumb expandedStyle="text">template_notification_text.png</thumb>
+ <thumb expandedStyle="text" moreActions="true">template_notification_text_actions.png</thumb>
+ <thumb expandedStyle="list">template_notification_list.png</thumb>
+ <thumb expandedStyle="list" moreActions="true">template_notification_list_actions.png</thumb>
+ <thumb expandedStyle="picture">template_notification_picture.png</thumb>
+ <thumb expandedStyle="picture" moreActions="true">template_notification_picture_actions.png</thumb>
+ </thumbs>
+
+ <icons
+ type="notification"
+ name="ic_stat_${camelCaseToUnderscore(className?replace('notification','','i'))}" />
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_list.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_list.png
new file mode 100644
index 0000000..f858daa
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_list.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_list_actions.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_list_actions.png
new file mode 100644
index 0000000..a095525
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_list_actions.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_none.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_none.png
new file mode 100644
index 0000000..abbee9d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_none.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_none_actions.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_none_actions.png
new file mode 100644
index 0000000..69a4a50
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_none_actions.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_picture.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_picture.png
new file mode 100644
index 0000000..d535661
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_picture.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_picture_actions.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_picture_actions.png
new file mode 100644
index 0000000..300431f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_picture_actions.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_text.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_text.png
new file mode 100644
index 0000000..790ecc0
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_text.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_text_actions.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_text_actions.png
new file mode 100644
index 0000000..6514069
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Notification/template_notification_text_actions.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/globals.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/globals.xml.ftl
new file mode 100644
index 0000000..6e28120
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/globals.xml.ftl
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<globals>
+ <global id="resOut" value="${resDir}" />
+ <global id="srcOut" value="${srcDir}/${slashedPackageName(packageName)}" />
+</globals>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/recipe.xml.ftl
new file mode 100644
index 0000000..443404d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/recipe.xml.ftl
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<recipe>
+
+ <dependency mavenUrl="com.android.support:support-v4:19.+"/>
+ <dependency mavenUrl="com.google.android.gms:play-services:4.2.42"/>
+
+ <merge from="AndroidManifest.xml.ftl"
+ to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />
+
+ <instantiate from="res/layout/fragment_plus_one.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/layout/fragment_${classToResource(className)}.xml" />
+
+ <open file="${escapeXmlAttribute(resOut)}/layout/fragment_${classToResource(className)}.xml" />
+
+ <open file="${escapeXmlAttribute(srcOut)}/${className}.java" />
+
+ <instantiate from="src/app_package/PlusOneFragment.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/${className}.java" />
+
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/root/AndroidManifest.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/root/AndroidManifest.xml.ftl
new file mode 100644
index 0000000..aa8f5a5
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/root/AndroidManifest.xml.ftl
@@ -0,0 +1,6 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <!--To access Google+ APIs:-->
+ <uses-permission android:name="android.permission.INTERNET" />
+
+</manifest>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/root/res/layout/fragment_plus_one.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/root/res/layout/fragment_plus_one.xml.ftl
new file mode 100644
index 0000000..2f45612
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/root/res/layout/fragment_plus_one.xml.ftl
@@ -0,0 +1,15 @@
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context=".${className}">
+
+ <com.google.android.gms.plus.PlusOneButton
+ xmlns:plus="http://schemas.android.com/apk/lib/com.google.android.gms.plus"
+ android:id="@+id/plus_one_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ plus:size="standard"
+ plus:annotation="inline"/>
+
+</FrameLayout>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/root/src/app_package/PlusOneFragment.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/root/src/app_package/PlusOneFragment.java.ftl
new file mode 100644
index 0000000..659bc45
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/root/src/app_package/PlusOneFragment.java.ftl
@@ -0,0 +1,146 @@
+package ${packageName};
+
+<#if includeCallbacks>import android.app.Activity;</#if>
+<#if includeCallbacks>import android.net.Uri;</#if>
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+<#if applicationPackage??>import ${applicationPackage}.R;</#if>
+
+import com.google.android.gms.plus.PlusOneButton;
+
+/**
+ * A fragment with a Google +1 button.
+<#if includeCallbacks>
+ * Activities that contain this fragment must implement the
+ * {@link ${className}.OnFragmentInteractionListener} interface
+ * to handle interaction events.
+</#if>
+<#if includeFactory>
+ * Use the {@link ${className}#newInstance} factory method to
+ * create an instance of this fragment.
+</#if>
+ *
+ */
+public class ${className} extends Fragment {
+<#if includeFactory>
+ // TODO: Rename parameter arguments, choose names that match
+ // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
+ private static final String ARG_PARAM1 = "param1";
+ private static final String ARG_PARAM2 = "param2";
+
+ // TODO: Rename and change types of parameters
+ private String mParam1;
+ private String mParam2;
+</#if>
+
+ // The URL to +1. Must be a valid URL.
+ private final String PLUS_ONE_URL = "http://developer.android.com";
+
+ // The request code must be 0 or greater.
+ private static final int PLUS_ONE_REQUEST_CODE = 0;
+
+ private PlusOneButton mPlusOneButton;
+
+<#if includeCallbacks>
+ private OnFragmentInteractionListener mListener;
+</#if>
+
+<#if includeFactory>
+ /**
+ * Use this factory method to create a new instance of
+ * this fragment using the provided parameters.
+ *
+ * @param param1 Parameter 1.
+ * @param param2 Parameter 2.
+ * @return A new instance of fragment ${className}.
+ */
+ // TODO: Rename and change types and number of parameters
+ public static ${className} newInstance(String param1, String param2) {
+ ${className} fragment = new ${className}();
+ Bundle args = new Bundle();
+ args.putString(ARG_PARAM1, param1);
+ args.putString(ARG_PARAM2, param2);
+ fragment.setArguments(args);
+ return fragment;
+ }
+</#if>
+ public ${className}() {
+ // Required empty public constructor
+ }
+
+<#if includeFactory>
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (getArguments() != null) {
+ mParam1 = getArguments().getString(ARG_PARAM1);
+ mParam2 = getArguments().getString(ARG_PARAM2);
+ }
+ }
+</#if>
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ // Inflate the layout for this fragment
+ View view = inflater.inflate(R.layout.fragment_${classToResource(className)}, container, false);
+
+ //Find the +1 button
+ mPlusOneButton = (PlusOneButton) view.findViewById(R.id.plus_one_button);
+
+ return view;
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ // Refresh the state of the +1 button each time the activity receives focus.
+ mPlusOneButton.initialize(PLUS_ONE_URL, PLUS_ONE_REQUEST_CODE);
+ }
+
+<#if includeCallbacks>
+ // TODO: Rename method, update argument and hook method into UI event
+ public void onButtonPressed(Uri uri) {
+ if (mListener != null) {
+ mListener.onFragmentInteraction(uri);
+ }
+ }
+
+ @Override
+ public void onAttach(Activity activity) {
+ super.onAttach(activity);
+ try {
+ mListener = (OnFragmentInteractionListener) activity;
+ } catch (ClassCastException e) {
+ throw new ClassCastException(activity.toString()
+ + " must implement OnFragmentInteractionListener");
+ }
+ }
+
+ @Override
+ public void onDetach() {
+ super.onDetach();
+ mListener = null;
+ }
+
+ /**
+ * This interface must be implemented by activities that contain this
+ * fragment to allow an interaction in this fragment to be communicated
+ * to the activity and potentially other fragments contained in that
+ * activity.
+ * <p>
+ * See the Android Training lesson <a href=
+ * "http://developer.android.com/training/basics/fragments/communicating.html"
+ * >Communicating with Other Fragments</a> for more information.
+ */
+ public interface OnFragmentInteractionListener {
+ // TODO: Update argument type and name
+ public void onFragmentInteraction(Uri uri);
+ }
+</#if>
+
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/template.xml
new file mode 100644
index 0000000..618d92d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/template.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<template
+ format="3"
+ revision="1"
+ name="Fragment (with a +1 button)"
+ description="Creates a fragment with a Google Plus +1 button."
+ minApi="8"
+ minBuildApi="8">
+
+ <category value="Fragment" />
+
+ <dependency name="android-support-v4" revision="8" />
+
+ <category value="Other" />
+
+ <parameter
+ id="className"
+ name="Fragment Name"
+ type="string"
+ constraints="class|nonempty|unique"
+ default="PlusOneFragment"
+ help="The name of the fragment class to create" />
+
+ <parameter
+ id="includeFactory"
+ name="Include fragment factory methods?"
+ type="boolean"
+ default="true"
+ help="Generate static fragment factory methods for easy instantiation" />
+
+ <parameter
+ id="includeCallbacks"
+ name="Include interface callbacks?"
+ type="boolean"
+ default="true"
+ help="Generate event callbacks for communication with an Activity or other fragments" />
+
+ <thumbs>
+ <thumb>templates_plusone_fragment.png</thumb>
+ </thumbs>
+
+ <globals file="globals.xml.ftl" />
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/templates_plusone_fragment.png b/love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/templates_plusone_fragment.png
new file mode 100644
index 0000000..47c1dcc
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/PlusOneFragment/templates_plusone_fragment.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/ResFolder/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/ResFolder/recipe.xml.ftl
new file mode 100644
index 0000000..abfda2d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/ResFolder/recipe.xml.ftl
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<recipe>
+
+ <#if remapFolder>
+ <mkdir at="${escapeXmlAttribute(projectOut)}/${escapeXmlAttribute(newLocation)}" />
+ <merge from="build.gradle.ftl"
+ to="${escapeXmlAttribute(projectOut)}/build.gradle" />
+ <#else>
+ <mkdir at="${escapeXmlAttribute(manifestOut)}/res/" />
+ </#if>
+
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/ResFolder/root/build.gradle.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/ResFolder/root/build.gradle.ftl
new file mode 100644
index 0000000..beef1f8
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/ResFolder/root/build.gradle.ftl
@@ -0,0 +1 @@
+android {sourceSets {${sourceProviderName} {res.srcDirs=['src/${sourceProviderName}/res', '${newLocation}']}}} \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/ResFolder/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/ResFolder/template.xml
new file mode 100644
index 0000000..a813a95
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/ResFolder/template.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<template
+ format="4"
+ revision="2"
+ name="Res Folder"
+ description="Creates a source root for Android Resource files."
+ >
+
+ <category value="Folder" />
+
+ <parameter
+ id="remapFolder"
+ name="Change Folder Location"
+ type="boolean"
+ constraints=""
+ default="false"
+ help="Change the folder location to another folder within the module." />
+
+ <parameter
+ id="newLocation"
+ name="New Folder Location"
+ type="string"
+ constraints="nonempty|source_set_folder|unique"
+ suggest="src/${sourceProviderName}/res/"
+ help="The location for the new folder"
+ visibility="remapFolder" />
+
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/ResourcesFolder/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/ResourcesFolder/recipe.xml.ftl
new file mode 100644
index 0000000..2045012
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/ResourcesFolder/recipe.xml.ftl
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<recipe>
+
+ <#if remapFolder>
+ <mkdir at="${escapeXmlAttribute(projectOut)}/${escapeXmlAttribute(newLocation)}" />
+ <merge from="build.gradle.ftl"
+ to="${escapeXmlAttribute(projectOut)}/build.gradle" />
+ <#else>
+ <mkdir at="${escapeXmlAttribute(manifestOut)}/resources/" />
+ </#if>
+
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/ResourcesFolder/root/build.gradle.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/ResourcesFolder/root/build.gradle.ftl
new file mode 100644
index 0000000..46cb70a
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/ResourcesFolder/root/build.gradle.ftl
@@ -0,0 +1 @@
+android {sourceSets {${sourceProviderName} {resources.srcDirs=['src/${sourceProviderName}/resources', '${newLocation}']}}} \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/ResourcesFolder/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/ResourcesFolder/template.xml
new file mode 100644
index 0000000..c5a9c1b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/ResourcesFolder/template.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<template
+ format="4"
+ revision="2"
+ name="Java Resources Folder"
+ description="Creates a source root for Java Resource (NOT Android resource) files."
+ >
+
+ <category value="Folder" />
+
+ <parameter
+ id="remapFolder"
+ name="Change Folder Location"
+ type="boolean"
+ constraints=""
+ default="false"
+ help="Change the folder location to another folder within the module." />
+
+ <parameter
+ id="newLocation"
+ name="New Folder Location"
+ type="string"
+ constraints="nonempty|source_set_folder|unique"
+ suggest="src/${sourceProviderName}/resources/"
+ help="The location for the new folder"
+ visibility="remapFolder" />
+
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/RsFolder/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/RsFolder/recipe.xml.ftl
new file mode 100644
index 0000000..e2766e4
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/RsFolder/recipe.xml.ftl
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<recipe>
+
+ <#if remapFolder>
+ <mkdir at="${escapeXmlAttribute(projectOut)}/${escapeXmlAttribute(newLocation)}" />
+ <merge from="build.gradle.ftl"
+ to="${escapeXmlAttribute(projectOut)}/build.gradle" />
+ <#else>
+ <mkdir at="${escapeXmlAttribute(manifestOut)}/rs/" />
+ </#if>
+
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/RsFolder/root/build.gradle.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/RsFolder/root/build.gradle.ftl
new file mode 100644
index 0000000..f393724
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/RsFolder/root/build.gradle.ftl
@@ -0,0 +1 @@
+android {sourceSets {${sourceProviderName} {renderscript.srcDirs=['src/${sourceProviderName}/rs', '${newLocation}']}}} \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/RsFolder/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/RsFolder/template.xml
new file mode 100644
index 0000000..0725931
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/RsFolder/template.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<template
+ format="4"
+ revision="2"
+ name="RenderScript Folder"
+ description="Creates a source root for RenderScript files."
+ >
+
+ <category value="Folder" />
+
+ <parameter
+ id="remapFolder"
+ name="Change Folder Location"
+ type="boolean"
+ constraints=""
+ default="false"
+ help="Change the folder location to another folder within the module." />
+
+ <parameter
+ id="newLocation"
+ name="New Folder Location"
+ type="string"
+ constraints="nonempty|source_set_folder|unique"
+ suggest="src/${sourceProviderName}/rs/"
+ help="The location for the new folder"
+ visibility="remapFolder" />
+
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Service/globals.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/Service/globals.xml.ftl
new file mode 100644
index 0000000..fca5ad8
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Service/globals.xml.ftl
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<globals>
+ <global id="manifestOut" value="${manifestDir}" />
+ <global id="srcOut" value="${srcDir}/${slashedPackageName(packageName)}" />
+ <global id="relativePackage" value="<#if relativePackage?has_content>${relativePackage}<#else>${packageName}</#if>" />
+</globals>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Service/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/Service/recipe.xml.ftl
new file mode 100644
index 0000000..9e66da5
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Service/recipe.xml.ftl
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<recipe>
+ <merge from="AndroidManifest.xml.ftl"
+ to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />
+ <instantiate from="src/app_package/Service.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/${className}.java" />
+ <open file="${escapeXmlAttribute(srcOut)}/${className}.java" />
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Service/root/AndroidManifest.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/Service/root/AndroidManifest.xml.ftl
new file mode 100644
index 0000000..74a4a9c
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Service/root/AndroidManifest.xml.ftl
@@ -0,0 +1,10 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" >
+
+ <application>
+ <service android:name="${relativePackage}.${className}"
+ android:exported="${isExported?string}"
+ android:enabled="${isEnabled?string}" >
+ </service>
+ </application>
+
+</manifest>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Service/root/src/app_package/Service.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/Service/root/src/app_package/Service.java.ftl
new file mode 100644
index 0000000..571d2b8
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Service/root/src/app_package/Service.java.ftl
@@ -0,0 +1,16 @@
+package ${packageName};
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.IBinder;
+
+public class ${className} extends Service {
+ public ${className}() {
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ // TODO: Return the communication channel to the service.
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/Service/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/Service/template.xml
new file mode 100644
index 0000000..96ad2a1
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/Service/template.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<template
+ format="4"
+ revision="2"
+ name="Service"
+ description="Creates a new service component and adds it to your Android manifest.">
+
+ <category value="Service" />
+
+ <parameter
+ id="className"
+ name="Class Name"
+ type="string"
+ constraints="class|unique|nonempty"
+ default="MyService" />
+
+ <parameter
+ id="isExported"
+ name="Exported"
+ type="boolean"
+ default="true"
+ help="Whether or not components of other applications can invoke the service or interact with it" />
+
+ <parameter
+ id="isEnabled"
+ name="Enabled"
+ type="boolean"
+ default="true"
+ help="Whether or not the service can be instantiated by the system" />
+
+ <globals file="globals.xml.ftl" />
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/ValueResourceFile/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/ValueResourceFile/recipe.xml.ftl
new file mode 100644
index 0000000..8895ae1
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/ValueResourceFile/recipe.xml.ftl
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<recipe>
+
+ <instantiate from="res/values.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values/${escapeXmlAttribute(fileName)}.xml" />
+ <open file="${escapeXmlAttribute(resOut)}/values/${escapeXmlAttribute(fileName)}.xml" />
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/ValueResourceFile/root/res/values.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/other/ValueResourceFile/root/res/values.xml.ftl
new file mode 100644
index 0000000..045e125
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/ValueResourceFile/root/res/values.xml.ftl
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/other/ValueResourceFile/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/other/ValueResourceFile/template.xml
new file mode 100644
index 0000000..b270aae
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/other/ValueResourceFile/template.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<template
+ format="4"
+ revision="1"
+ name="Values XML File"
+ description="Creates a new XML values file."
+ >
+
+ <category value="XML" />
+
+ <parameter
+ id="fileName"
+ name="Values File Name"
+ type="string"
+ constraints="unique|nonempty"
+ default="values"
+ help="Name of the values XML file." />
+
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/globals.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/globals.xml.ftl
new file mode 100644
index 0000000..9870768
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/globals.xml.ftl
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<globals>
+ <global id="topOut" value="." />
+ <global id="projectOut" value="." />
+ <global id="manifestOut" value="." />
+ <global id="srcOut" value="src/${slashedPackageName(packageName)}" />
+ <global id="resOut" value="res" />
+ <global id="mavenUrl" value="mavenCentral" />
+ <global id="buildToolsVersion" value="${buildApi}" />
+ <global id="gradlePluginVersion" value="1.0.+" />
+ <global id="v4SupportLibraryVersion" value="13.0.+" />
+</globals>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/recipe.xml.ftl
new file mode 100644
index 0000000..73bf014
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/recipe.xml.ftl
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<recipe>
+ <instantiate from="AndroidManifest.xml.ftl"
+ to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />
+
+<#if copyIcons>
+ <copy from="res/drawable-hdpi"
+ to="${escapeXmlAttribute(resOut)}/drawable-hdpi" />
+ <copy from="res/drawable-mdpi"
+ to="${escapeXmlAttribute(resOut)}/drawable-mdpi" />
+ <copy from="res/drawable-xhdpi"
+ to="${escapeXmlAttribute(resOut)}/drawable-xhdpi" />
+</#if>
+ <instantiate from="res/values/styles.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values/styles.xml" />
+<#if buildApi gte 11 && baseTheme != "none">
+ <instantiate from="res/values-v11/styles_hc.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values-v11/styles.xml" />
+</#if>
+<#if buildApi gte 14 && baseTheme?contains("darkactionbar")>
+ <instantiate from="res/values-v14/styles_ics.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values-v14/styles.xml" />
+</#if>
+
+ <instantiate from="res/values/strings.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values/strings.xml" />
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/AndroidManifest.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/AndroidManifest.xml.ftl
new file mode 100644
index 0000000..390a9da
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/AndroidManifest.xml.ftl
@@ -0,0 +1,15 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="${packageName}"
+ android:versionCode="1"
+ android:versionName="1.0">
+
+ <uses-sdk android:minSdkVersion="${minApi}" <#if buildApi gte 4>android:targetSdkVersion="${targetApi}" </#if>/>
+
+ <application <#if minApiLevel gte 4 && buildApi gte 4>android:allowBackup="true"</#if>
+ android:label="@string/app_name"
+ android:icon="@drawable/ic_launcher"<#if baseTheme != "none">
+ android:theme="@style/AppTheme"</#if>>
+
+ </application>
+
+</manifest>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/build.gradle.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/build.gradle.ftl
new file mode 100644
index 0000000..5196c75
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/build.gradle.ftl
@@ -0,0 +1,35 @@
+buildscript {
+ repositories {
+<#if mavenUrl == "mavenCentral">
+ mavenCentral()
+<#else>
+ maven { url '${mavenUrl}' }
+</#if>
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:${gradlePluginVersion}'
+ }
+}
+apply plugin: 'android'
+
+repositories {
+<#if mavenUrl == "mavenCentral">
+ mavenCentral()
+<#else>
+ maven { url '${mavenUrl}' }
+</#if>
+}
+
+android {
+ compileSdkVersion ${buildApi}
+ buildToolsVersion "${buildToolsVersion}"
+
+ defaultConfig {
+ minSdkVersion ${minApi}
+ targetSdkVersion ${targetApi}
+ }
+}
+
+dependencies {
+ compile 'com.android.support:support-v4:${v4SupportLibraryVersion}'
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/drawable-hdpi/ic_launcher.png b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..96a442e
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/drawable-mdpi/ic_launcher.png b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..359047d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/drawable-xhdpi/ic_launcher.png b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..71c6d76
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/values-v11/styles_hc.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/values-v11/styles_hc.xml.ftl
new file mode 100644
index 0000000..7a1fd9d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/values-v11/styles_hc.xml.ftl
@@ -0,0 +1,13 @@
+<resources>
+
+ <!--
+ Base application theme for API 11+. This theme completely replaces
+ AppBaseTheme from res/values/styles.xml on API 11+ devices.
+ -->
+ <style name="AppBaseTheme" parent="<#if
+ appCompat?has_content>Theme.AppCompat<#else
+ >android:Theme.Holo</#if><#if baseTheme?contains("light")>.Light</#if>">
+ <!-- API 11 theme customizations can go here. -->
+ </style>
+
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/values-v14/styles_ics.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/values-v14/styles_ics.xml.ftl
new file mode 100644
index 0000000..21a96e8
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/values-v14/styles_ics.xml.ftl
@@ -0,0 +1,14 @@
+<resources>
+
+ <!--
+ Base application theme for API 14+. This theme completely replaces
+ AppBaseTheme from BOTH res/values/styles.xml and
+ res/values-v11/styles.xml on API 14+ devices.
+ -->
+ <style name="AppBaseTheme" parent="<#if
+ appCompat?has_content>Theme.AppCompat<#else
+ >android:Theme.Holo</#if>.Light.DarkActionBar">
+ <!-- API 14 theme customizations can go here. -->
+ </style>
+
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/values/strings.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/values/strings.xml.ftl
new file mode 100644
index 0000000..ee03444
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/values/strings.xml.ftl
@@ -0,0 +1,3 @@
+<resources>
+ <string name="app_name">${escapeXmlString(appTitle)}</string>
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/values/styles.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/values/styles.xml.ftl
new file mode 100644
index 0000000..96464b8
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/res/values/styles.xml.ftl
@@ -0,0 +1,22 @@
+<resources>
+
+ <!--
+ Base application theme, dependent on API level. This theme is replaced
+ by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
+ -->
+ <style name="AppBaseTheme" parent="<#if
+ appCompat?has_content>Theme.AppCompat<#else>android:Theme</#if><#if
+ baseTheme?contains("light")>.Light</#if>">
+ <!--
+ Theme customizations available in newer API levels can go in
+ res/values-vXX/styles.xml, while customizations related to
+ backward-compatibility can go here.
+ -->
+ </style>
+
+ <!-- Application theme. -->
+ <style name="AppTheme" parent="AppBaseTheme">
+ <!-- All customizations that are NOT specific to a particular API-level can go here. -->
+ </style>
+
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/settings.gradle.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/settings.gradle.ftl
new file mode 100644
index 0000000..b12004b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/root/settings.gradle.ftl
@@ -0,0 +1 @@
+include ':${projectName}'
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/template.xml
new file mode 100644
index 0000000..0d9b234
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/template.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0"?>
+<template
+ format="1"
+ revision="2"
+ name="Android Application"
+ description="Creates a new Android application.">
+ <dependency name="android-support-v4" revision="8" />
+
+ <thumbs>
+ <thumb>template_new_project.png</thumb>
+ </thumbs>
+
+ <category value="Applications" />
+
+ <parameter
+ id="packageName"
+ name="Package name"
+ type="string"
+ constraints="package|nonempty"
+ default="com.mycompany.myapp" />
+
+ <parameter
+ id="appTitle"
+ name="Application title"
+ type="string"
+ constraints="nonempty"
+ default="My Application" />
+
+ <parameter
+ id="baseTheme"
+ name="Base Theme"
+ type="enum"
+ default="holo_light_darkactionbar"
+ help="The base user interface theme for the application">
+ <option id="none">None</option>
+ <option id="holo_dark" minBuildApi="11">Holo Dark</option>
+ <option id="holo_light" minBuildApi="11">Holo Light</option>
+ <option id="holo_light_darkactionbar" minBuildApi="14" default="true">Holo Light with Dark Action Bar</option>
+ </parameter>
+
+ <parameter
+ id="minApi"
+ name="Minimum API level"
+ type="string"
+ constraints="apilevel"
+ default="7" />
+
+ <!--
+ Usually the same as minApi, but when minApi is a code name this will be the corresponding
+ API level
+ -->
+ <parameter
+ id="minApiLevel"
+ name="Minimum API level"
+ type="string"
+ constraints="apilevel"
+ default="7" />
+
+ <parameter
+ id="targetApi"
+ name="Target API level"
+ type="string"
+ constraints="apilevel"
+ default="16" />
+
+ <parameter
+ id="buildApi"
+ name="Build API level"
+ type="string"
+ constraints="apilevel"
+ default="16" />
+
+ <parameter
+ id="copyIcons"
+ name="Include launcher icons"
+ type="boolean"
+ default="true" />
+
+ <globals file="globals.xml.ftl" />
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/template_new_project.png b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/template_new_project.png
new file mode 100644
index 0000000..92e8556
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidApplication/template_new_project.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/globals.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/globals.xml.ftl
new file mode 100644
index 0000000..9870768
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/globals.xml.ftl
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<globals>
+ <global id="topOut" value="." />
+ <global id="projectOut" value="." />
+ <global id="manifestOut" value="." />
+ <global id="srcOut" value="src/${slashedPackageName(packageName)}" />
+ <global id="resOut" value="res" />
+ <global id="mavenUrl" value="mavenCentral" />
+ <global id="buildToolsVersion" value="${buildApi}" />
+ <global id="gradlePluginVersion" value="1.0.+" />
+ <global id="v4SupportLibraryVersion" value="13.0.+" />
+</globals>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/recipe.xml.ftl
new file mode 100644
index 0000000..73bf014
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/recipe.xml.ftl
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<recipe>
+ <instantiate from="AndroidManifest.xml.ftl"
+ to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />
+
+<#if copyIcons>
+ <copy from="res/drawable-hdpi"
+ to="${escapeXmlAttribute(resOut)}/drawable-hdpi" />
+ <copy from="res/drawable-mdpi"
+ to="${escapeXmlAttribute(resOut)}/drawable-mdpi" />
+ <copy from="res/drawable-xhdpi"
+ to="${escapeXmlAttribute(resOut)}/drawable-xhdpi" />
+</#if>
+ <instantiate from="res/values/styles.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values/styles.xml" />
+<#if buildApi gte 11 && baseTheme != "none">
+ <instantiate from="res/values-v11/styles_hc.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values-v11/styles.xml" />
+</#if>
+<#if buildApi gte 14 && baseTheme?contains("darkactionbar")>
+ <instantiate from="res/values-v14/styles_ics.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values-v14/styles.xml" />
+</#if>
+
+ <instantiate from="res/values/strings.xml.ftl"
+ to="${escapeXmlAttribute(resOut)}/values/strings.xml" />
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/AndroidManifest.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/AndroidManifest.xml.ftl
new file mode 100644
index 0000000..390a9da
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/AndroidManifest.xml.ftl
@@ -0,0 +1,15 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="${packageName}"
+ android:versionCode="1"
+ android:versionName="1.0">
+
+ <uses-sdk android:minSdkVersion="${minApi}" <#if buildApi gte 4>android:targetSdkVersion="${targetApi}" </#if>/>
+
+ <application <#if minApiLevel gte 4 && buildApi gte 4>android:allowBackup="true"</#if>
+ android:label="@string/app_name"
+ android:icon="@drawable/ic_launcher"<#if baseTheme != "none">
+ android:theme="@style/AppTheme"</#if>>
+
+ </application>
+
+</manifest>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/build.gradle.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/build.gradle.ftl
new file mode 100644
index 0000000..5c6994e
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/build.gradle.ftl
@@ -0,0 +1,35 @@
+buildscript {
+ repositories {
+<#if mavenUrl == "mavenCentral">
+ mavenCentral()
+<#else>
+ maven { url '${mavenUrl}' }
+</#if>
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:${gradlePluginVersion}'
+ }
+}
+apply plugin: 'android-library'
+
+repositories {
+<#if mavenUrl == "mavenCentral">
+ mavenCentral()
+<#else>
+ maven { url '${mavenUrl}' }
+</#if>
+}
+
+android {
+ compileSdkVersion ${buildApi}
+ buildToolsVersion "${buildToolsVersion}"
+
+ defaultConfig {
+ minSdkVersion ${minApi}
+ targetSdkVersion ${targetApi}
+ }
+}
+
+dependencies {
+ compile 'com.android.support:support-v4:${v4SupportLibraryVersion}'
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/drawable-hdpi/ic_launcher.png b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..96a442e
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/drawable-hdpi/ic_launcher.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/drawable-mdpi/ic_launcher.png b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..359047d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/drawable-mdpi/ic_launcher.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/drawable-xhdpi/ic_launcher.png b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..71c6d76
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/drawable-xhdpi/ic_launcher.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/values-v11/styles_hc.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/values-v11/styles_hc.xml.ftl
new file mode 100644
index 0000000..7a1fd9d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/values-v11/styles_hc.xml.ftl
@@ -0,0 +1,13 @@
+<resources>
+
+ <!--
+ Base application theme for API 11+. This theme completely replaces
+ AppBaseTheme from res/values/styles.xml on API 11+ devices.
+ -->
+ <style name="AppBaseTheme" parent="<#if
+ appCompat?has_content>Theme.AppCompat<#else
+ >android:Theme.Holo</#if><#if baseTheme?contains("light")>.Light</#if>">
+ <!-- API 11 theme customizations can go here. -->
+ </style>
+
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/values-v14/styles_ics.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/values-v14/styles_ics.xml.ftl
new file mode 100644
index 0000000..21a96e8
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/values-v14/styles_ics.xml.ftl
@@ -0,0 +1,14 @@
+<resources>
+
+ <!--
+ Base application theme for API 14+. This theme completely replaces
+ AppBaseTheme from BOTH res/values/styles.xml and
+ res/values-v11/styles.xml on API 14+ devices.
+ -->
+ <style name="AppBaseTheme" parent="<#if
+ appCompat?has_content>Theme.AppCompat<#else
+ >android:Theme.Holo</#if>.Light.DarkActionBar">
+ <!-- API 14 theme customizations can go here. -->
+ </style>
+
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/values/strings.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/values/strings.xml.ftl
new file mode 100644
index 0000000..ee03444
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/values/strings.xml.ftl
@@ -0,0 +1,3 @@
+<resources>
+ <string name="app_name">${escapeXmlString(appTitle)}</string>
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/values/styles.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/values/styles.xml.ftl
new file mode 100644
index 0000000..96464b8
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/res/values/styles.xml.ftl
@@ -0,0 +1,22 @@
+<resources>
+
+ <!--
+ Base application theme, dependent on API level. This theme is replaced
+ by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
+ -->
+ <style name="AppBaseTheme" parent="<#if
+ appCompat?has_content>Theme.AppCompat<#else>android:Theme</#if><#if
+ baseTheme?contains("light")>.Light</#if>">
+ <!--
+ Theme customizations available in newer API levels can go in
+ res/values-vXX/styles.xml, while customizations related to
+ backward-compatibility can go here.
+ -->
+ </style>
+
+ <!-- Application theme. -->
+ <style name="AppTheme" parent="AppBaseTheme">
+ <!-- All customizations that are NOT specific to a particular API-level can go here. -->
+ </style>
+
+</resources>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/settings.gradle.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/settings.gradle.ftl
new file mode 100644
index 0000000..b12004b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/root/settings.gradle.ftl
@@ -0,0 +1 @@
+include ':${projectName}'
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/template.xml
new file mode 100644
index 0000000..9d13db5
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/template.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0"?>
+<template
+ format="1"
+ revision="2"
+ name="Android Library"
+ description="Creates a new Android library.">
+ <dependency name="android-support-v4" revision="8" />
+
+ <thumbs>
+ <thumb>template_new_project.png</thumb>
+ </thumbs>
+
+ <category value="Applications" />
+
+ <parameter
+ id="packageName"
+ name="Package name"
+ type="string"
+ constraints="package|nonempty"
+ default="com.mycompany.myapp" />
+
+ <parameter
+ id="appTitle"
+ name="Library title"
+ type="string"
+ constraints="nonempty"
+ default="My Library"/>
+
+ <parameter
+ id="baseTheme"
+ name="Base Theme"
+ type="enum"
+ default="holo_light_darkactionbar"
+ help="The base user interface theme for the library">
+ <option id="none">None</option>
+ <option id="holo_dark" minBuildApi="11">Holo Dark</option>
+ <option id="holo_light" minBuildApi="11">Holo Light</option>
+ <option id="holo_light_darkactionbar" minBuildApi="14" default="true">Holo Light with Dark Action Bar</option>
+ </parameter>
+
+ <parameter
+ id="minApi"
+ name="Minimum API level"
+ type="string"
+ constraints="apilevel"
+ default="7" />
+
+ <!--
+ Usually the same as minApi, but when minApi is a code name this will be the corresponding
+ API level
+ -->
+ <parameter
+ id="minApiLevel"
+ name="Minimum API level"
+ type="string"
+ constraints="apilevel"
+ default="7" />
+
+ <parameter
+ id="targetApi"
+ name="Target API level"
+ type="string"
+ constraints="apilevel"
+ default="16" />
+
+ <parameter
+ id="buildApi"
+ name="Build API level"
+ type="string"
+ constraints="apilevel"
+ default="16" />
+
+ <parameter
+ id="copyIcons"
+ name="Include launcher icons"
+ type="boolean"
+ default="true" />
+
+ <globals file="globals.xml.ftl" />
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/template_new_project.png b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/template_new_project.png
new file mode 100644
index 0000000..92e8556
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewAndroidLibrary/template_new_project.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/globals.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/globals.xml.ftl
new file mode 100644
index 0000000..b731454
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/globals.xml.ftl
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<globals>
+ <global id="topOut" value="." />
+ <global id="projectOut" value="." />
+ <global id="srcOut" value="src/${slashedPackageName(packageName)}" />
+</globals>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/recipe.xml.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/recipe.xml.ftl
new file mode 100644
index 0000000..ea1e83f
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/recipe.xml.ftl
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<recipe>
+ <instantiate from="/src/library_package/Placeholder.java.ftl"
+ to="${escapeXmlAttribute(srcOut)}/${className}.java" />
+</recipe>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/root/build.gradle.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/root/build.gradle.ftl
new file mode 100644
index 0000000..bbfeb03
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/root/build.gradle.ftl
@@ -0,0 +1 @@
+apply plugin: 'java'
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/root/settings.gradle.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/root/settings.gradle.ftl
new file mode 100644
index 0000000..b12004b
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/root/settings.gradle.ftl
@@ -0,0 +1 @@
+include ':${projectName}'
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/root/src/library_package/Placeholder.java.ftl b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/root/src/library_package/Placeholder.java.ftl
new file mode 100644
index 0000000..2af8c0d
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/root/src/library_package/Placeholder.java.ftl
@@ -0,0 +1,4 @@
+package ${packageName};
+
+public class ${className} {
+}
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/template.xml b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/template.xml
new file mode 100644
index 0000000..cb117a5
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/template.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0"?>
+<template
+ format="1"
+ revision="2"
+ name="Java Library"
+ description="Creates a new Java library.">
+
+ <thumbs>
+ <thumb>template_new_project.png</thumb>
+ </thumbs>
+
+ <category value="Applications" />
+
+ <parameter
+ id="projectName"
+ name="Library name"
+ type="string"
+ constraints="nonempty"
+ default="MyLibrary"/>
+
+ <parameter
+ id="packageName"
+ name="Java package name"
+ type="string"
+ constraints="nonempty"
+ default="com.example"/>
+
+ <parameter
+ id="className"
+ name="Java class name"
+ type="string"
+ constraints="nonempty"
+ default="MyClass"/>
+
+ <globals file="globals.xml.ftl" />
+ <execute file="recipe.xml.ftl" />
+
+</template>
diff --git a/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/template_new_project.png b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/template_new_project.png
new file mode 100644
index 0000000..92e8556
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/templates/projects/NewJavaLibrary/template_new_project.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/android-win/tools/traceview.bat b/love2dToAPK/tools/tools/android-win/tools/traceview.bat
new file mode 100644
index 0000000..8b71731
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/traceview.bat
@@ -0,0 +1,65 @@
+@echo off
+rem Copyright (C) 2007 The Android Open Source Project
+rem
+rem Licensed under the Apache License, Version 2.0 (the "License");
+rem you may not use this file except in compliance with the License.
+rem You may obtain a copy of the License at
+rem
+rem http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem don't modify the caller's environment
+setlocal
+
+rem Set up prog to be the path of this script, including following symlinks,
+rem and set up progdir to be the fully-qualified pathname of its directory.
+set prog=%~f0
+
+rem Change current directory and drive to where the script is, to avoid
+rem issues with directories containing whitespaces.
+cd /d %~dp0
+
+rem Check we have a valid Java.exe in the path.
+set java_exe=
+call lib\find_java.bat
+if not defined java_exe goto :EOF
+
+set jarfile=traceview.jar
+set frameworkdir=.
+
+if exist %frameworkdir%\%jarfile% goto JarFileOk
+ set frameworkdir=lib
+
+if exist %frameworkdir%\%jarfile% goto JarFileOk
+ set frameworkdir=..\framework
+
+:JarFileOk
+
+set jarpath=%frameworkdir%\%jarfile%
+
+if not defined ANDROID_SWT goto QueryArch
+ set swt_path=%ANDROID_SWT%
+ goto SwtDone
+
+:QueryArch
+
+ for /f "delims=" %%a in ('"%java_exe%" -jar %frameworkdir%\archquery.jar') do set swt_path=%frameworkdir%\%%a
+
+:SwtDone
+
+if exist "%swt_path%" goto SetPath
+ echo SWT folder '%swt_path%' does not exist.
+ echo Please set ANDROID_SWT to point to the folder containing swt.jar for your platform.
+ exit /B
+
+:SetPath
+set javaextdirs=%swt_path%;%frameworkdir%
+
+echo The standalone version of traceview is deprecated.
+echo Please use Android Device Monitor (tools/monitor) instead.
+call "%java_exe%" "-Djava.ext.dirs=%javaextdirs%" -Dcom.android.traceview.toolsdir= -jar %jarpath% %*
diff --git a/love2dToAPK/tools/tools/android-win/tools/uiautomatorviewer.bat b/love2dToAPK/tools/tools/android-win/tools/uiautomatorviewer.bat
new file mode 100644
index 0000000..d3bdbd8
--- /dev/null
+++ b/love2dToAPK/tools/tools/android-win/tools/uiautomatorviewer.bat
@@ -0,0 +1,66 @@
+@echo off
+rem Copyright (C) 2012 The Android Open Source Project
+rem
+rem Licensed under the Apache License, Version 2.0 (the "License");
+rem you may not use this file except in compliance with the License.
+rem You may obtain a copy of the License at
+rem
+rem http://www.apache.org/licenses/LICENSE-2.0
+rem
+rem Unless required by applicable law or agreed to in writing, software
+rem distributed under the License is distributed on an "AS IS" BASIS,
+rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+rem See the License for the specific language governing permissions and
+rem limitations under the License.
+
+rem don't modify the caller's environment
+setlocal
+
+rem Set up prog to be the path of this script, including following symlinks,
+rem and set up progdir to be the fully-qualified pathname of its directory.
+set prog=%~f0
+
+rem Change current directory and drive to where the script is, to avoid
+rem issues with directories containing whitespaces.
+cd /d %~dp0
+
+rem Get the CWD as a full path with short names only (without spaces)
+for %%i in ("%cd%") do set prog_dir=%%~fsi
+
+rem Check we have a valid Java.exe in the path.
+set java_exe=
+call lib\find_java.bat
+if not defined java_exe goto :EOF
+
+set jarfile=uiautomatorviewer.jar
+set frameworkdir=.
+
+if exist %frameworkdir%\%jarfile% goto JarFileOk
+ set frameworkdir=lib
+
+if exist %frameworkdir%\%jarfile% goto JarFileOk
+ set frameworkdir=..\framework
+
+:JarFileOk
+
+set jarpath=%frameworkdir%\%jarfile%
+
+if not defined ANDROID_SWT goto QueryArch
+ set swt_path=%ANDROID_SWT%
+ goto SwtDone
+
+:QueryArch
+
+ for /f "delims=" %%a in ('"%java_exe%" -jar %frameworkdir%\archquery.jar') do set swt_path=%frameworkdir%\%%a
+
+:SwtDone
+
+if exist "%swt_path%" goto SetPath
+ echo SWT folder '%swt_path%' does not exist.
+ echo Please set ANDROID_SWT to point to the folder containing swt.jar for your platform.
+ exit /B
+
+:SetPath
+set javaextdirs=%swt_path%;%frameworkdir%
+
+call "%java_exe%" "-Djava.ext.dirs=%javaextdirs%" "-Dcom.android.uiautomator.bindir=%prog_dir%" -jar %jarpath% %*
diff --git a/love2dToAPK/tools/tools/ant/CONTRIBUTORS b/love2dToAPK/tools/tools/ant/CONTRIBUTORS
new file mode 100644
index 0000000..e78bd62
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/CONTRIBUTORS
@@ -0,0 +1,417 @@
+Amongst other, the following people contributed to ant:
+
+Adam Blinkinsop
+Adam Bryzak
+Adam Sotona
+Adrian Nistor
+Aleksandr Ishutin
+Alex Rosen
+Alexei Yudichev
+Alexey Panchenko
+Alexey Solofnenko
+Alfred Theorin
+Alison Winters
+Andreas Ames
+Andreas Mross
+Andrew Eisenberg
+Andrew Everitt
+Andrew Stevens
+Andrey Urazov
+André-John Mas
+Andy Wood
+Anil K. Vijendran
+Anli Shundi
+Anthony Goubard
+Anthony Green
+Anthony Wat
+Antoine Baudoux
+Antoine Levy-Lambert
+Anton Mazkovoi
+Arjan Veenstra
+Arnaud Vandyck
+Arnout J. Kuiper
+Aslak Hellesôy
+Atsuhiko Yamanaka
+Avik Sengupta
+Balazs Fejes 2
+Bart Vanhaute
+Benjamin Burgess
+Ben Galbraith
+Ben Gertzfield
+Benoit Moussaud
+Bernd Dutkowski
+Bernhard Rosenkraenzer
+Brad Clark
+Brant Langer Gurganus
+Brian Curnow
+Brian Deitte
+Brian Felder
+Brian Repko
+Bruce Atherton
+Cedomir Igaly
+Charles Hudak
+Charlie Hubbard
+Chris Povirk
+Christian Knorr
+Christian Schmidt
+Christoph Gysin
+Christoph Wilhelms
+Christophe Labouisse
+Christopher A. Longo
+Christopher Charlier
+Clark Archer
+Clemens Hammacher
+Clement OUDOT
+Clive Brettingham-Moore
+Conor MacNeill
+Craeg Strong
+Craig Cottingham
+Craig R. McClanahan
+Craig Richardson
+Craig Ryan
+Craig Sandvik
+Curt Arnold
+Curtis White
+Cyrille Morvan
+D'Arcy Smith
+Dale Anson
+Dale Sherwood
+Dan Armbrust
+Daniel Henrique
+Daniel Ribagnac
+Daniel Spilker
+Daniel Trebbien
+Danno Ferrin
+Danny Yates
+Dante Briones
+Davanum Srinivas
+Dave Brondsema
+Dave Brosius
+David A. Herman
+David Crossley
+David Gärtner
+David S. Johnson
+David Kavanagh
+David LeRoy
+David Leal
+David M. Lloyd
+David Maclean
+David Rees
+Denis Hennessy
+Derek Slager
+Devon C. Miller
+Diane Holt
+dIon Gillard
+Dmitry A. Kuminov
+Dominique Devienne
+Donal Quinlan
+Don Brown
+Don Ferguson
+Don Jeffery
+Drew Sudell
+Edison Guo
+Eduard Wirch
+Edwin Woudt
+Eli Tucker
+Emmanuel Bourg
+Eric Barboni
+Eric Olsen
+Eric Pugh
+Erik Costlow
+Erik Hatcher
+Erik Langenbach
+Erik Meade
+Ernst de Haan
+Frank Harnack
+Frank Somers
+Frank Zeyda
+Frantisek Kucera
+Frederic Bothamy
+Frederic Lavigne
+Gary S. Weaver
+Gautam Guliani
+Gene-Sung Chung
+Georges-Etienne Legendre
+Gero Vermaas
+Gerrit Riessen
+Gilbert Rebhan
+Gilles Scokart
+Glenn McAllister
+Glenn Twiggs
+Greg Nelson
+Greg Roodt
+Greg Schueler
+Grégoire Vatry
+Günther Kögel
+Harish Prabandham
+Haroon Rafique
+Hiroaki Nakamura
+Holger Engels
+Holger Joest
+Ignacio Coloma
+Ingenonsya France
+Ingmar Stein
+Irene Rusman
+Isaac Shabtay
+Ivan Ivanov
+J Bleijenbergh
+Jack J. Woehr
+James Duncan Davidson
+Jan Cumps
+Jan Matèrne
+Jan Mynarik
+Jan Stolze
+Jason Hunter
+Jason Pettiss
+Jason Salter
+Jason Yip
+Jay Dickon Glanville
+Jay Peck
+Jay van der Meer
+JC Mann
+J D Glanville
+Jean-Francois Brousseau
+Jean-Louis Boudart
+Jeff Gettle
+Jeff Martin
+Jeff Tulley
+Jeff Turner
+Jene Jasper
+Jeremy Mawson
+Jerome Lacoste
+Jesse Glick
+Jesse Stockall
+Jim Allers
+Joerg Wassmer
+Joel Tucci
+Joey Richey
+Johann Herunter
+John Elion
+John Sisson
+Jon Dickinson
+Jon S. Stevens
+Jon Skeet
+Jose Alberto Fernandez
+Joseph Walton
+Josh Lucas
+Juerg Wanner
+Julian Simpson
+Justin Vallon
+Keiron Liddle
+Keith Visco
+Kevin Connor Arpe
+Kevin Greiner
+Kevin Jackson
+Kevin Ross
+Kevin Z Grey
+Kim Hansen
+Kirk Wylie
+Kristian Rosenvold
+Kyle Adams
+Lajos Veres
+Larry Shatzer
+Larry Streepy
+Les Hughes
+Levi Cook
+lucas
+Lucas Werkmeister
+Ludovic Claude
+Maarten Coene
+Magesh Umasankar
+Maneesh Sahu
+Marcel Schutte
+Marcus B&ouml;rger
+Mario Frasca
+Mariusz Nowostawski
+Mark A. Ziesemer
+Mark DeLaFranier
+Mark Hecker
+Mark R. Diggory
+Mark Salter
+Markus Kahl
+Martijn Kruithof
+Martin Landers
+Martin Poeschl
+Martin van den Bemt
+Martin von Gagern
+Mathieu Champlon
+Mathieu Peltier
+Matt Albrecht
+Matt Benson
+Matt Bishop
+Matt Foemmel
+Matt Grosso
+Matt Humphrey
+Matt Small
+Matt Wildig
+Matthew Hawthorne
+Matthew Inger
+Matthew Kuperus Heun
+Matthew Watson
+Matthias Bhend
+Michael Bayne
+Michael Clarke
+Michael Davey
+Michael J. Sikorsky
+Michael McCallum
+Michael Montuori
+Michael Newcomb
+Micheal Nygard
+Michael Saunders
+Miha
+Mike Davis
+Mike Roberts
+Mike Williams
+Miroslav Zaťko
+mnowostawski
+Mounir El Hajj
+Nathan Beyer
+Nick Chalko
+Nick Fortescue
+Nick Crossley
+Nick Pellow
+Nicola Ken Barozzi
+Nico Seessle
+Nigel Magnay
+Oliver Merkel
+Oliver Rossmueller
+Ondra Medek
+Omer Shapira
+Oystein Gisnas
+Patrick Altaie
+Patrick C. Beard
+Patrick Chanezon
+Patrick G. Heck (Gus Heck)
+Patrick Martin
+Paul Austin
+Paul Christmann
+Paul Galbraith
+Paul King
+Paulo Gaspar
+Pavan Bayyapu
+Pavel Jisl
+Pawel Zuzelski
+Peter B. West
+Peter Donald
+Peter Doornbosch
+Peter Hulst
+Peter Janes
+Peter Reilly
+Petr Kureš
+Phil Hanna
+Philip Hourihane
+Phillip Wells
+Pierre Delisle
+Pierre Dittgen
+riasol
+R Handerson
+Ralf Hergert
+Rami Ojares
+Randy Watler
+Raphael Pierquin
+Ray Waldin
+Remie Bolte
+René Krell
+Richard Evans
+Richard Steele
+Rick Beton
+Robbie Gibson
+Robert Anderson
+Robert Clark
+Robert Flaherty
+Robert Shaw
+Robert Streich
+Robert Watkins
+Roberto Scaramuzzi
+Robin Green
+Robin Power
+Robin Verduijn
+Rob Oxspring
+Rob van Oostrum
+Rodrigo Schmidt
+Roger Vaughn
+Roman Ivashin
+Roman Savko
+Ronen Mashal
+Russell Gold
+Ryan Bennitt
+Sam Ruby
+Sandra Metz
+Scott Carlson
+Scott Ellsworth
+Scott Johnson
+Scott M. Stirling
+Sean Egan
+Sean P. Kane
+Sebastien Arod
+Shiraz Kanga
+Sebastian Kantha
+Simon Law
+Simone Bordet
+Stefan Bodewig
+Stefan Heimann
+Stefano Mazzocchi
+Stephan Strittmatter
+Stephane Bailliez
+stephan
+Stephan Michels
+Stephen Chin
+Stephen Goetze
+Steve Cohen
+Steve Langley
+Steve Loughran
+Steve Morin
+Steve Wadsworth
+Steven E. Newton
+Sudheer Chigurupati
+Takashi Okamoto
+TAMURA Kent
+Taoufik Romdhane
+Tariq Master
+Thomas Aglassinger
+Thomas Butz
+Thomas Christen
+Thomas Christensen
+Thomas Haas
+Thomas Quas
+Tim Boemker
+Tim Drury
+Tim Fennell
+Tim Stephenson
+Tim Whittington
+Timoteo Ohara
+Timothy Gerard Endres
+Tom Ball
+Tom Brus
+Tom Cunningham
+Tom Dimock
+Tom Eugelink
+Tom May
+Tomasz Bech
+Trejkaz Xaoza
+Ulrich Schmidt
+Uwe Schindler
+Valentino Miazzo
+Victor Toni
+Vimil Saju
+Vincent Legoll
+Vitold Sedyshev
+Volker Leidl
+Waldek Herka
+Wang Weijun
+Will Wang
+William Bernardet
+William Ferguson
+William Webber
+Wolf Siberski
+Wolfgang Baer
+Wolfgang Frech
+Wolfgang Glas
+Wolfgang Werner
+Xavier Hanin
+Xavier Witdouck
+Yohann Roussel
+Yuji Yamano
+Yves Martin
+Zach Garner
+Zdenek Wagner
diff --git a/love2dToAPK/tools/tools/ant/INSTALL b/love2dToAPK/tools/tools/ant/INSTALL
new file mode 100644
index 0000000..83c1167
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/INSTALL
@@ -0,0 +1,2 @@
+For installation instructions see the manual in the docs subdirectory
+or online at <http://ant.apache.org/manual/index.html>.
diff --git a/love2dToAPK/tools/tools/ant/KEYS b/love2dToAPK/tools/tools/ant/KEYS
new file mode 100644
index 0000000..fb21736
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/KEYS
@@ -0,0 +1,1497 @@
+This file contains the PGP keys of various developers.
+
+Users: pgp < KEYS
+ gpg --import KEYS
+Developers:
+ pgp -kxa <your name> and append it to this file.
+ (pgpk -ll <your name> && pgpk -xa <your name>) >> this file.
+ (gpg --list-sigs <your name>
+ && gpg --armor --export <your name>) >> this file.
+
+Type Bits/KeyID Date User ID
+pub 1024/FEECAAED 1998/11/11 Stefan Bodewig <bodewig@bost.de>
+ Stefan Bodewig <bodewig@apache.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: 2.6.3i
+
+mQCNAzZJoiMAAAEEAMzhUxTOC20Nprp6K4nLTiARt+EXii/dovNWWcfzZcYXi/lX
+r3zpUTTZxlKQpd4RaHjFmGgoOraZE4jCRFARVcFJgYmGUKpcWJZO7YKL36WUizTM
++dyB2ycOtzlty1W5VmRL3FGqo67pKA9F/QHg3NSu9hY1W9xPPK7Kq3f+7KrtAAUR
+tCBTdGVmYW4gQm9kZXdpZyA8Ym9kZXdpZ0Bib3N0LmRlPokAlQIFEDZSrGXHcgyK
+jiW9zQEBshEEAMlG4qVjKp4/agdJG56M6izx9oaKecFLXHQJrFUy3w2PvZHFYtXc
+osXKorX6bPrE8uB57MxbY2WapKeVRodlG0+j39vAf501duK8q2rktfWt9Cl4JjJ4
+DbWhSWfV1ci62u2gCxwYQe22F9Wh+vhOR5NK9RTbSKhupdlFsnrk/i7xiQCVAwUQ
+NkmiI67Kq3f+7KrtAQGdxQQAlcFOzSv7G6M4uGbgvw7IGgrhx7rawtIyv9hLXgVC
+7ua9xaZV8G0Fl9gh8RnbdcZ4R/aT+KIiAFaslfZ3t6hlC4MTbnAJqvdS/NO98ZkJ
+YvnzZSKHflAbd5gyE7IVxBC9/xRlF/Wls5sYNwb6RjoRCaOjxN/y3WCLa3Va101v
+zNy0I1N0ZWZhbiBCb2Rld2lnIDxib2Rld2lnQGFwYWNoZS5vcmc+iQCVAwUQOxIo
+BK7Kq3f+7KrtAQGn6gP/SBACdHakA4H//otpyESSrk4PmyOaYF0Kyok43Gee2mT+
+m9+jZ3jLcC0oav6iH+otL/lhk9t/JDM8LjD2kAkdWWoIvvuPyCx97gOzojIo0Ve2
+1wuxJTF/VIjwyOtE8FzE7p4tkc6EubVpeZkV9Pq9HFRBCUcyKJDLnF4tbstScLU=
+=OBLe
+-----END PGP PUBLIC KEY BLOCK-----
+
+
+pub 1024D/51898504 2001-05-29 Conor MacNeill <conor@cortexebusiness.com.au>
+sig 3 51898504 2001-05-29 Conor MacNeill <conor@cortexebusiness.com.au>
+sig 5F6B8B72 2002-01-11 Stefan Bodewig <bodewig@apache.org>
+uid Conor MacNeill <conor@apache.org>
+sig 3 51898504 2001-05-29 Conor MacNeill <conor@cortexebusiness.com.au>
+sig 5F6B8B72 2002-01-11 Stefan Bodewig <bodewig@apache.org>
+sub 1024g/D1ECBA5D 2001-05-29
+sig 51898504 2001-05-29 Conor MacNeill <conor@cortexebusiness.com.au>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.2.0 (GNU/Linux)
+
+mQGiBDsTqygRBACiZckNdclTlQFonLaIKBFGhMy0KKByw0x8XA4iwdbCXuF6xNIc
+HIFHajJ74AHchQ4d8xtomBy6b8yvFgWVeaZensvn69BlLeqGdyeJRzfPt6TgRnzZ
+2eWhb0HXdG3JwxL/2BabDhHfs4YJOrgB/vhRFQku6oCMRiBPtJj2werD6wCg0/zp
+jacYTw6+CR+sVvneCNyySFED/R3j10c4RnR8djgv1jKT8CKPuHYraupI9INEe+I6
+7qWjtJ02GzvMO6TElAtUsf4aysu45GgwkwEBnuG6mYb3Pq0V2c5tJc2A3Tj3DrdR
+i3HUNwurbus76I0sPyyENPu12QPeC6mvWLEsxVJ9o0hRKFayGvYUmrwWK9UFLjvp
+p9cXBACDHgLn7MAVLqUdYhRrUj/M+GOUpvBikEgoJJrEUmb5X4+++dffMh5HBIO4
+5LA11qEKuM2xnKqOilP7NLYXz1Fe0ocqv0jsHB4SprFTTai7ma31uwuRQvCQXVv1
+yJ5CLqYda64h/UA2kmmR2dfopmvDogYEMz/HU5voozxe7BEI7bQhQ29ub3IgTWFj
+TmVpbGwgPGNvbm9yQGFwYWNoZS5vcmc+iFcEExECABcFAjsTqygFCwcKAwQDFQMC
+AxYCAQIXgAAKCRCBBGRPUYmFBDgIAKCZztXqKhK6kXOnoGy7opCNmWU0lwCgsPDa
+4m+ruW3ch0rfbqtR75S52R+IRgQQEQIABgUCPD6eTgAKCRCiEVrhX2uLcqCcAKCr
+1Wylqju9YjBi5Twej9ze69JFBQCeOaMgo6yjnkcV3PnVInLlaMwPr5q0LUNvbm9y
+IE1hY05laWxsIDxjb25vckBjb3J0ZXhlYnVzaW5lc3MuY29tLmF1PohXBBMRAgAX
+BQI7E6xMBQsHCgMEAxUDAgMWAgECF4AACgkQgQRkT1GJhQTY0ACgmZmKheHzjPJs
+5hybpyvnvEiPYqYAn2+ryxdtz8XyOMExGRmHNlhG7svsiEYEEBECAAYFAjw+nlUA
+CgkQohFa4V9ri3JYYACg1WN+NCptfKVP1mbrIa+0ajztsiIAnAn+m70iwRRFZCxr
+jcULoY5SjyTLuQENBDsTqy0QBACfsCxJ6iCtgX8zjlVtMsMfDqu72x5sYatWKn8c
+u+4Oj5mi0x6azZIhwCa+K3ihLVOyG1mCRnzztGTIxWYRhq3TESIVOfgm+NgLGrmA
+XUTFyCT+21TExLCpuVZKmUHsWXLxDtfQ1diPeQpiQ8+Fvb/4jLGFjFIrQ2VjtFQn
+kumkSwADBgP9H0bF4hdMuVEcSJ9imxSoJshcOOA3Vd2+YiCTZhBygWM49wY5jNos
+/DArIjNCE53IlOu/UtHB2jqkSqjF0soGYsUjeCWouiTP9hLuMKPjnqj9ryJPTDKz
+nTCZ4TuB5CtzrKTlWLmPCPpFsGqe4KjMeKg/mqGqjPKl97xgStK9N9GIRgQYEQIA
+BgUCOxOrLQAKCRCBBGRPUYmFBMM6AJsF3FFyZGEmbt9aGG1W/u0oI9mcLgCfQyJ+
+aalbspazea4J9zgi59SSwOM=
+=cBdR
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub 1024R/697ECEDD 2000-04-06 Henri Gomez <hgomez@slib.fr>
+sig 697ECEDD 2000-04-06 Henri Gomez <hgomez@slib.fr>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.2.0 (GNU/Linux)
+
+mQCNAzjsydwAAAEEAMpwFU/ci3/wR3ryCGp9Exr+Rx/hTQ7hWAJcVw8ejlBXlT4T
+yITlRUs0HGfRWxME2J55PuXXsIEPZzjfozNtvOyq8WlLlJ7iaiyWxVRoPJ25sSEj
+C9etm6wjj4E66ZgzuElZkm1m69uEsCHPPNuz1oQ/g1O+SmIVxIYirlxpfs7dAAUR
+tBxIZW5yaSBHb21leiA8aGdvbWV6QHNsaWIuZnI+iQCVAwUQOOzJ3IYirlxpfs7d
+AQFQyQQAj0D9G0hEL7SQGaSCkkoXwvamQw42N8+tNm+jfWHWdE4HAiVlhJmI2GyD
+sdcXVAcR8R7ILIRB5AY7a3bF+qMk0r+vO6oR878RKKn9AvtaAIOnrh6tr0tiPwf5
+XDUMySxIWJEF3SmJAy9Lq3bAl5GMzZCFHiS0NW2gtWgmr/u1RuM=
+=6l+I
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub 1024R/397DCAD5 2002-07-03 Henri Gomez <hgomez@users.sourceforge.net>
+sig 397DCAD5 2002-07-03 Henri Gomez <hgomez@users.sourceforge.net>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.2.0 (GNU/Linux)
+
+mQCNAz0i0UUAAAEEALXePN6IHne0W96YRMnR+4EXB6402QY5f8ZLcnSUZUH55Fb1
+qcZGBc3WRKlPiUvwBD+eVYgCpNSXF/H+oV1mawxNJN5XwqBEpfYmY8MRIPcqa61h
+bJc3LBSm1qNf05G5Cwxeed+OgVm0r1HBy6DAgDHAqNlkC8DZ/BVgqMA5fcrVAAUR
+tCpIZW5yaSBHb21leiA8aGdvbWV6QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD6JAJUD
+BRA9ItFFFWCowDl9ytUBASNyA/458T84LUVhqq6Y9fPBAfcFMWY2kehuDWsQEXkO
+46XoK+AnFZCkKuyDLqPHchVUO5pK/gZYsDK/xJkfh3u4FTDTsecb9wFmIeyayVIN
+SI8o6l8EZzDX/PGwqEwzxHrbQkIgIktNn5ApIoazvdBpbkQfNj1vr2wWoMYPLAWM
+8xzecA==
+=UmZ8
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub 1024D/307A10A5 2002-07-18 Henri Gomez <hgomez@users.sourceforge.net>
+sig 3 307A10A5 2002-07-18 Henri Gomez <hgomez@users.sourceforge.net>
+sub 2048g/862B8F70 2002-07-18
+sig 307A10A5 2002-07-18 Henri Gomez <hgomez@users.sourceforge.net>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.2.0 (GNU/Linux)
+
+mQGiBD02vbERBAC1v8fR6gjERpaz4UMfdy0hRVWCPSbOdF+Swm/IenjVzErco6zb
+MTa13umUNrDPBy/tTWiCCZrOnqi7fgDzWqPEqrXJjKAFVLEWE6MmKylPPEPG1/bm
+idkNGERSAZduvhKv777PzvEJJ/8eGe3wy/O8NbgIjCPtr4UklwCZS8cFuwCg8oMO
+UdT8qZRtzdxdAyu1m5fUb+MD/3IKJYWXsdtb6iBphCU4f/BoyjVC9EZJ1ywLuiVM
+siKbuaDUaXU9nWcbNKv+fx8uZ1NaadpfLokqqhnWcpnSiqw8HNR7SwsF1D33rkXK
+O4FSuVss/tIoqGdWFcJyPkP4yP5shxqR335narVw2vDa0+BiWkALbA2qVsSIdZDB
+LeFZA/47AMBS0U2BRk2rQT8LmMuFl7mR+wNBM4n7FUGdxsGn3TcYd4pXTNrEQPrV
+YNdooKlikgGk4hgFnIFX09Spmimqgq0goFue81rttVdZZ4uep8dTghY6gwmvcOxX
+jATbhWStBhdu9B35kzfHc+1QihD5Z94u4uyWIVBIzikcdiY8LbQqSGVucmkgR29t
+ZXogPGhnb21lekB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+iFcEExECABcFAj02vbEF
+CwcKAwQDFQMCAxYCAQIXgAAKCRAZMdaEMHoQpYijAKCCP68ndU/kTXR9XAKLvibC
+3S8+1QCfUFQYte3Jo+MHKaWjsu9JGptRzo+5Ag0EPTa93RAIAKlsRJ5gOGTFsmaR
+W9k6MIh4c/MCy7J7HUxT5xTdHROa+3zUh+FAE/JaOx9ZtZtH863DFHA8cP4L+tpi
+PjBT6g2E94dwGcuH/OiSSCT4JSBukbGbOuLLdmFXqUl8+4gsL90Xal67FtNLwyLG
+1n7geLir0byD+OT7VLA5w+6G0NOpJEveV/FIa2qLgdRZ8vz73ybgMh18hBUrUmro
+jncp0rln2VU7VCH1C2aClKm7kK4mGAjIFIzKbguK+kM3b8NDHmXKpT6syyCtIM3h
+prkV1TUCAFqLI32aSdlTN79lpeA2zDga9k4/4X/RDHsFpRN2neRFGTNUtuUgYpQQ
+E5zWBmMAAwUH/RiGxyeBsad923IwE1+GAjxFl2tqF9xWk0J6yTnSK4nfhYAE9evV
+jwDEok9jRl4ILCcXx6YN/d/lWNuSbARKHz/3hLiTouPpwd3SSJ8is2x9PgpJz5JX
+cD0y1SkbPLvs3jH3ZmdcxZpuAmJeI/typqFKK5pWP44oXIH+XH/8nWDtmLEBkgKQ
+/ATQWenMTmZ6MIJ6aWKWGkO9QS6iYRz3PPPGQ1O8W02CeprM2wBtlb8J1Z3RxNhM
+rZcg/1Qi3V3D1HI4zw6tAFmDeBb8J4PaBQzqlhzx2EBTbfwNPhV8AlPvpxHEeGGn
+v+O1yhZr33SnyZdINNoNDn+owVMdmkobe9GIRgQYEQIABgUCPTa93QAKCRAZMdaE
+MHoQpRsTAJ4qst3MhLm48fBAEnzuzi/BIKr+AgCfYaCB/AvPoncQbHc8BcNGRimR
+P9A=
+=hQhz
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub 1024D/EDF62C35 2002-04-10 Magesh Umasankar <umagesh@apache.org>
+sig 3 EDF62C35 2002-04-10 Magesh Umasankar <umagesh@apache.org>
+sig 3 5F6B8B72 2003-03-07 Stefan Bodewig <bodewig@apache.org>
+sub 1024g/B5FFC53F 2002-04-10
+sig EDF62C35 2002-04-10 Magesh Umasankar <umagesh@apache.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.2.0 (GNU/Linux)
+
+mQGiBDy0ebgRBADuKIKD8PuJ4wKEV1h2AprwJjxCRx8vn48XNwfLZuvhw8cpArtK
+rZwhoGPPUPEEXgtTNerlKq4VwpAwcnvRz7oC/7aWkUbcR2sAyhfe2scohwPgw7Xv
++isWC0NDPdrxvXG/PUOG/cnELunr51ymybBqBxUd2gMhYIxPo67D+YPYLwCgwcZp
+yc/6kJa116ESWHrti342GD8D/1srpnRs9CiS1DQF1uZ1wW4vzj4VD61tKsjdWD8D
+V573R22iMDLSj4oMB536WxUH7snz8XsAKm/peqJ6G9m0smtmWA1ago5yzQj70WqF
+xzWBhHn2I/YfAQ8pb2s9q1lClj8elnCxT65L27ydBAZteejb2VqjtQ6iGy86PUT2
+wRUvBADZmoV1eIZJEM5NnxBv1EtvRYZtIQEzZ8dO2A1LOS7qlVr8IypljNPLGhzX
+VHNvVsjC9QMUSWeBsDedvQHQ3hJpIMnTI32XE1V4gX06gfVTZdhf2fLTtwnsHZp0
+oumqshGDVRhNJJdDYLikxWOxOfkNveKEqJFvtuBR+ZqqluQKebQlTWFnZXNoIFVt
+YXNhbmthciA8dW1hZ2VzaEBhcGFjaGUub3JnPohXBBMRAgAXBQI8tHm4BQsHCgME
+AxUDAgMWAgECF4AACgkQ76Pnee32LDWSRwCfeASWXvpdt7bSFPMtszU/7uPEktsA
+n23mYUN5WKJA1ZreW+0CcZ2ESnOviEYEExECAAYFAj5ogYgACgkQohFa4V9ri3IW
+YACgsxGig0PL0M86rJsA/IpXjBdg3ysAoJzsoUZ/7s2BxDfzF/FRTVIzS+TMuQEN
+BDy0eb8QBACBVb9YDJRp9Irzmq71Jf9FIPw+4g/cWpF3t/Eb7eSzMcOvTAXyNIWz
+aaOjHre7lFctHfq8ls/6gR7uqajiAnfQcfTcu7pp+F5KsU0Embt83SFzZ3aoJwET
+mB/LqUyrrGDiue3lU+flJO7UmcsRvtk0+BDkyCeB9HgfdpXbBLCyuwADBQP+PNxX
+4e1tg3ZJo/xNEnD2Re3HjmQRrr0RYJLUGjgQrAEONSgowx3IW8/JssmNJVjnYm0q
+jSKsb8rergCFJhPNZ8Dd/k00pKcrq+IN6j7WTYLqPce87zrGAZUtmDwDSp5mxy5E
+xWJJxsgBPk4YBQLzJt21A3BgK/i24Sze2VLbaZuIRgQYEQIABgUCPLR5vwAKCRDv
+o+d57fYsNa8xAJ4mLfonZbd64+YY9rfvhIh3Vsl3AACeLPPKtma2K6XCfhTBEDnj
+hzSr4vo=
+=lBfF
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub 1024D/5F6B8B72 2001-05-28
+uid Stefan Bodewig <bodewig@apache.org>
+sig 3 5F6B8B72 2001-05-28 Stefan Bodewig <bodewig@apache.org>
+sig 51898504 2002-01-11 Conor MacNeill <conor@codefeed.com>
+sig 3 F88341D9 2003-03-17 Lars Eilebrecht <lars@eilebrecht.org>
+sig 3 2261D073 2003-03-17 Astrid Kessler (Kess) <kess@kess-net.de>
+sig 21D0A71B 2003-03-17 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) <dirkx@anywi.com>
+sig 75A67692 2003-03-18 Erik Abele <erik@codefaktor.de>
+sig B3B2A12C 2003-05-20 ct magazine CERTIFICATE <pgpCA@ct.heise.de>
+sig 3 8103A37E 2003-04-04 Andre Malo <nd@apache.org>
+sig 3 5F6B8B72 2001-05-28 Stefan Bodewig <bodewig@apache.org>
+sig D6298F01 2003-04-27 Paulo Henrique Gaspar Jorge <pjorge@asatnet.com.br>
+sig 0CAA68B4 2004-11-11 Patrick Rentsch <patrick.rentsch@suissimage.ch>
+sig 2FE28BCF 2005-07-01 Harald Wilhelm (HAWI) <Harald.Wilhelm@hawi.de>
+sig 5793498F 2005-07-21 Tim Ellison <tim@ellison.name>
+sig E4136392 2005-07-21 Noel J. Bergman <noel@apache.org>
+sig 8408F755 2005-07-21 Christian Geisert <chrisg@apache.org>
+sig 2 FC243F3C 2005-07-20 Henk P. Penning <penning@cs.uu.nl>
+sig 3 EC140B81 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) <dirkx@anywi.com>
+sig 3 EE65E321 2005-07-20 Martin Kraemer <martin@apache.org>
+sig 3 A99F75DD 2005-07-21 Rodent of Unusual Size <coar@php.net>
+sig 3 3642CB4B 2005-07-20 Martin Kraemer <martin@apache.org>
+sig 3 302DA568 2005-07-21 Rodent of Unusual Size (DSA) <coar@Apache.Org>
+sig 3 2C312D2F 2005-07-21 Rodent of Unusual Size <coar@php.net>
+sig 3 CC78C893 2005-07-22 Rich Bowen <rbowen@rcbowen.com>
+sig 3 E2D774DF 2005-07-22 Sylvain Wallez <sylvain@apache.org>
+sig 3 E04F9A89 2005-07-22 Roy T. Fielding <fielding@gbiv.com>
+sig 3 015AFC8A 2005-07-22 Bertrand Delacretaz <bdelacretaz@apache.org>
+sig 3 87315C31 2005-07-23 Raphal Luta <raphael.luta@aptiwan.com>
+sig 3 E41EDC7E 2005-07-24 Carsten Ziegeler <cziegeler@apache.org>
+sig 3 F39B3750 2005-07-24 Colm MacCarthaigh <colm@stdlib.net>
+sig 1CD4861F 2005-07-25 Eran Chinthaka <chinthaka@apache.org>
+sig EA1BA38D 2005-07-25 Ajith Harshana Ranabahu (Made at Apachecon 2005) <ajith@apache.org>
+sig 333E4E84 2005-07-26 Chathura Kamalanath Herath (Apachecon Europe 2005) <chathura@apache.org>
+sig 152924AF 2005-07-29 Sander Temme <sander@temme.net>
+sig 3 9C85222B 2005-07-24 Henning Schmiedehausen <hps@intermeta.de>
+sig 3 9978AF86 2005-07-25 [User ID not found]
+sig 3 2A623F72 2005-07-25 [User ID not found]
+sig 3 F8EA2967 2005-07-26 [User ID not found]
+sig 3 C152431A 2005-07-27 Steve Loughran <stevel@apache.org>
+sig DE885DD3 2005-11-25 Sander Striker <striker@apache.org>
+sig CE419C8F 2007-01-05 Upayavira <upayavira@odoko.co.uk>
+sig E222DE4F 2007-05-02 Mathias Herberts <Mathias.Herberts@iroise.net>
+sig 911203E4 2007-05-02 [User ID not found]
+sig F12F6072 2007-05-05 [User ID not found]
+sig 3 990ED4AA 2007-05-02 Knut Anders Hatlen <kahatlen@apache.org>
+sig 3 311A3DE5 2007-05-05 Ruediger Pluem <rpluem@apache.org>
+sig 3 88817402 2007-05-06 Thomas Vandahl <thomas@vandahl.org>
+sig 5F298824 2007-05-06 Simon Pepping <spepping@leverkruid.eu>
+sig 4CEED75F 2007-05-06 Nick Burch <nick@gagravarr.org>
+sig 4358C584 2007-05-06 Vincent Hennebert <vhennebert@apache.org>
+sig 0B7E6CFA 2007-05-06 Sami Siren <siren@apache.org>
+sig 3 01530235 2007-05-02 Luc Maisonobe (SpaceRoots) <luc@spaceroots.org>
+sig 40581837 2007-05-08 Nick Kew <nick@webthing.com>
+uid Stefan Bodewig <stefan.bodewig@freenet.de>
+sig 3 5F6B8B72 2003-03-07 Stefan Bodewig <bodewig@apache.org>
+sig 3 F88341D9 2003-03-17 Lars Eilebrecht <lars@eilebrecht.org>
+sig 3 2261D073 2003-03-17 Astrid Kessler (Kess) <kess@kess-net.de>
+sig 21D0A71B 2003-03-17 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) <dirkx@anywi.com>
+sig 75A67692 2003-03-18 Erik Abele <erik@codefaktor.de>
+sig B3B2A12C 2003-05-20 ct magazine CERTIFICATE <pgpCA@ct.heise.de>
+sig 3 8103A37E 2003-04-04 Andre Malo <nd@apache.org>
+sig 51898504 2005-06-21 Conor MacNeill <conor@codefeed.com>
+sig 0CAA68B4 2004-11-11 Patrick Rentsch <patrick.rentsch@suissimage.ch>
+sig 2FE28BCF 2005-07-01 Harald Wilhelm (HAWI) <Harald.Wilhelm@hawi.de>
+sig 5793498F 2005-07-21 Tim Ellison <tim@ellison.name>
+sig 8408F755 2005-07-21 Christian Geisert <chrisg@apache.org>
+sig 3 EC140B81 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) <dirkx@anywi.com>
+sig 3 EE65E321 2005-07-20 Martin Kraemer <martin@apache.org>
+sig 3 A99F75DD 2005-07-21 Rodent of Unusual Size <coar@php.net>
+sig 3 3642CB4B 2005-07-20 Martin Kraemer <martin@apache.org>
+sig 3 302DA568 2005-07-21 Rodent of Unusual Size (DSA) <coar@Apache.Org>
+sig 3 2C312D2F 2005-07-21 Rodent of Unusual Size <coar@php.net>
+sig 3 CC78C893 2005-07-22 Rich Bowen <rbowen@rcbowen.com>
+sig 3 E2D774DF 2005-07-22 Sylvain Wallez <sylvain@apache.org>
+sig 3 E04F9A89 2005-07-22 Roy T. Fielding <fielding@gbiv.com>
+sig 3 87315C31 2005-07-23 Raphal Luta <raphael.luta@aptiwan.com>
+sig 3 E41EDC7E 2005-07-24 Carsten Ziegeler <cziegeler@apache.org>
+sig 3 F39B3750 2005-07-24 Colm MacCarthaigh <colm@stdlib.net>
+sig 1CD4861F 2005-07-25 Eran Chinthaka <chinthaka@apache.org>
+sig EA1BA38D 2005-07-25 Ajith Harshana Ranabahu (Made at Apachecon 2005) <ajith@apache.org>
+sig 333E4E84 2005-07-26 Chathura Kamalanath Herath (Apachecon Europe 2005) <chathura@apache.org>
+sig 152924AF 2005-07-29 Sander Temme <sander@temme.net>
+sig 3 9C85222B 2005-07-24 Henning Schmiedehausen <hps@intermeta.de>
+sig 3 9978AF86 2005-07-25 [User ID not found]
+sig 3 2A623F72 2005-07-25 [User ID not found]
+sig 3 F8EA2967 2005-07-26 [User ID not found]
+sig 3 C152431A 2005-07-27 Steve Loughran <stevel@apache.org>
+sig DE885DD3 2005-11-25 Sander Striker <striker@apache.org>
+sig E222DE4F 2007-05-02 Mathias Herberts <Mathias.Herberts@iroise.net>
+sig 911203E4 2007-05-02 [User ID not found]
+sig F12F6072 2007-05-05 [User ID not found]
+sig 3 990ED4AA 2007-05-02 Knut Anders Hatlen <kahatlen@apache.org>
+sig 3 311A3DE5 2007-05-05 Ruediger Pluem <rpluem@apache.org>
+sig 3 88817402 2007-05-06 Thomas Vandahl <thomas@vandahl.org>
+sig 4CEED75F 2007-05-06 Nick Burch <nick@gagravarr.org>
+sig 4358C584 2007-05-06 Vincent Hennebert <vhennebert@apache.org>
+sig 0B7E6CFA 2007-05-06 Sami Siren <siren@apache.org>
+sig 3 DE8884A0 2007-05-07 Xavier Hanin <xavier.hanin@gmail.com>
+sig 3 01530235 2007-05-02 Luc Maisonobe (SpaceRoots) <luc@spaceroots.org>
+sig 40581837 2007-05-08 Nick Kew <nick@webthing.com>
+uid Stefan Bodewig <stefan@samaflost.de>
+sig 3 5F6B8B72 2005-05-31 Stefan Bodewig <bodewig@apache.org>
+sig 51898504 2005-06-21 Conor MacNeill <conor@codefeed.com>
+sig 2FE28BCF 2005-07-01 Harald Wilhelm (HAWI) <Harald.Wilhelm@hawi.de>
+sig 5793498F 2005-07-21 Tim Ellison <tim@ellison.name>
+sig 3 EC140B81 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) <dirkx@anywi.com>
+sig 3 EE65E321 2005-07-20 Martin Kraemer <martin@apache.org>
+sig 3 A99F75DD 2005-07-21 Rodent of Unusual Size <coar@php.net>
+sig 3 21D0A71B 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) <dirkx@anywi.com>
+sig 3 3642CB4B 2005-07-20 Martin Kraemer <martin@apache.org>
+sig 3 302DA568 2005-07-21 Rodent of Unusual Size (DSA) <coar@Apache.Org>
+sig 3 2C312D2F 2005-07-21 Rodent of Unusual Size <coar@php.net>
+sig 3 CC78C893 2005-07-22 Rich Bowen <rbowen@rcbowen.com>
+sig 3 E2D774DF 2005-07-22 Sylvain Wallez <sylvain@apache.org>
+sig 3 E04F9A89 2005-07-22 Roy T. Fielding <fielding@gbiv.com>
+sig 3 87315C31 2005-07-23 Raphal Luta <raphael.luta@aptiwan.com>
+sig 3 E41EDC7E 2005-07-24 Carsten Ziegeler <cziegeler@apache.org>
+sig 3 F39B3750 2005-07-24 Colm MacCarthaigh <colm@stdlib.net>
+sig 1CD4861F 2005-07-25 Eran Chinthaka <chinthaka@apache.org>
+sig EA1BA38D 2005-07-25 Ajith Harshana Ranabahu (Made at Apachecon 2005) <ajith@apache.org>
+sig 333E4E84 2005-07-26 Chathura Kamalanath Herath (Apachecon Europe 2005) <chathura@apache.org>
+sig 152924AF 2005-07-29 Sander Temme <sander@temme.net>
+sig 3 9C85222B 2005-07-24 Henning Schmiedehausen <hps@intermeta.de>
+sig 3 9978AF86 2005-07-25 [User ID not found]
+sig 3 2A623F72 2005-07-25 [User ID not found]
+sig 3 F8EA2967 2005-07-26 [User ID not found]
+sig 3 C152431A 2005-07-27 Steve Loughran <stevel@apache.org>
+sig DE885DD3 2005-11-25 Sander Striker <striker@apache.org>
+sig E222DE4F 2007-05-02 Mathias Herberts <Mathias.Herberts@iroise.net>
+sig 911203E4 2007-05-02 [User ID not found]
+sig F12F6072 2007-05-05 [User ID not found]
+sig 3 990ED4AA 2007-05-02 Knut Anders Hatlen <kahatlen@apache.org>
+sig 3 311A3DE5 2007-05-05 Ruediger Pluem <rpluem@apache.org>
+sig 3 88817402 2007-05-06 Thomas Vandahl <thomas@vandahl.org>
+sig 4CEED75F 2007-05-06 Nick Burch <nick@gagravarr.org>
+sig 4358C584 2007-05-06 Vincent Hennebert <vhennebert@apache.org>
+sig 0B7E6CFA 2007-05-06 Sami Siren <siren@apache.org>
+sig 3 01530235 2007-05-02 Luc Maisonobe (SpaceRoots) <luc@spaceroots.org>
+sig 40581837 2007-05-08 Nick Kew <nick@webthing.com>
+sub 1024g/24774157 2001-05-28
+sig 5F6B8B72 2001-05-28 Stefan Bodewig <bodewig@apache.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.2 (GNU/Linux)
+
+mQGiBDsSIk4RBADSCj6rUjV64tYCGT1DYKYR7GthyWpNdGHSYLbETBcDatAe1dzQ
+5NsCgfrlybfyeY+y1lxr3T9bqf6zJWDw/718wff96qmmv1qzexSYtmIrj+h53V82
+EXwWOFuYMJisuxdT940iQzosm3GOv4MJdEg3oI2SgfEyRQQ6vO4Ob5rHDwCg5taZ
+nrHOrXx2dIGHxpxRZ0SUl30D/jmtttFjYOQ3LBMriikz5mh2sK3ZnoSRF4o5O0zW
+Ve6e2SFXOEjVjImKsH6KCbdQNelrAdgiyOoXClyQKsQ27pncbdWo6bO0E3POJZVm
+XaeW7iudHVr63rU5PViXObIQrdQl0D59j5brKj4vdlTyUw8kaHPvbKPDEOwvZq4Y
+LJQ5BACA1YilTeXRJqwFsNlpcxCHwlULD4QUVP496prQWf1B7Z6g0KvLGrQsO0Vn
+Jcn+fEqukysTJixSXCPebosltd4RalJIupVYkp4w6MJ7biaDAlLuNhDcI/AiXTmV
+dXUedVXIaM8I3Ne23gucwbAyc0Hvb+3cSAKRhl/azFQhuHBvlrQjU3RlZmFuIEJv
+ZGV3aWcgPGJvZGV3aWdAYXBhY2hlLm9yZz6IaAQTEQIAIAIXgAIZAQUCSgkegwUL
+CQgHAwQVCgkIBRYCAwEAAh4BABIHZUdQRwABAQkQohFa4V9ri3IWMwCghs0wCe4g
+GMPBq6jtBXK46e4aHKIAoNn+9NX6NlhF04qaHyDBhXK2HMmuiEYEEBECAAYFAjw+
+1Y8ACgkQgQRkT1GJhQSdkgCeM6RDHUF/E334TtiLPgw7GpmNJSkAoNCLQCW/9VHr
+V+ZHsodnXUnaD4dIiJkEEwECAAYFAj513wwACgkQPo+38viDQdknZAPlHNiMnR+L
+Uavo2yOYiJT+W9+8+qNs2grYDZ+WSYujaWT2NJrUCYXQRM6gKDyFlkcJvHI9lF2y
+YMkVetllZVN1TJkeEdtbHncNHcdq+ZUQR0NkFKTF9d1K7UI2rfWxt1y6a13TcUjp
+JXzbtw/OXX9EZSI6QQt4rSFlvci9J3mIRgQTEQIABgUCPnXawQAKCRDu0eo5ImHQ
+c0W4AJ9vuq4wlkc6TmmmZPF/gZVLluHcTgCeItrnvzyS11xkIETk6v4b7K4gaiiI
+PwMFED51qhr9b4jGIdCnGxECRAUAoOaVZW5CdZ9oYr3PwI/i8RJN+JfJAKCmd/XI
+lYOCpa9Qc4C855pM8NFw6YhGBBARAgAGBQI+d6QQAAoJEBU/oM11pnaSL+sAn1DT
+HmbhITeEw0ZSgyBLQw2ZhcM5AJ0ZrRBbZ9lbgHXBKOJQiLpWBj4XsYhGBBARAgAG
+BQI+yi6WAAoJENvSRfyzsqEsF/AAoNXq7Cp/0AwEmWvhoTjmtY6eVYB5AKCMFhBU
+dYWNXVyalPTq8ThswNUnr4hGBBMRAgAGBQI+jc4sAAoJEMppOXSBA6N+kUoAn1Nj
+6YqarQg0sL2KrFsQROM3A6fSAKCyl40SpfVJSO33fYuPci9dHp+QCIhXBBMRAgAX
+BQI7EiJOBQsHCgMEAxUDAgMWAgECF4AACgkQohFa4V9ri3IsngCfbIpJDWj6UgXY
+7rBH8To12BgB+RIAn3jw72WJzplAtShVTmuMlRFS+FUNiEYEEBECAAYFAj6sazwA
+CgkQqywx6dYpjwFkeQCeOkJrnO5r2hWDhX4ACPPLObZvXLIAnR0VHAgkEH1W/t7B
+4zdDYdBBZrd5iEYEEBECAAYFAkGS8mMACgkQ5BNhMwyqaLQs9ACgio5zJcieYLpp
+igvSYLBfubUVrXUAnRKZJ6MACpH6fpoz2vkc2dh69tbSiEYEEBECAAYFAkLFMoEA
+CgkQm/IjRS/ii88aCQCfd1cIawDqpkYU86f3JEjcN85ntFcAni0m8WR6s+bkh3fd
++EIrSRsru3uQiEYEEBECAAYFAkLfRQIACgkQQeoJoFeTSY8XxQCdFd+XEWqyDkCx
+37gaIQAG4dHpwiUAoOZ/K5OHyTJCNFaBUDtpCh7hL8TPiEYEEBECAAYFAkLfkncA
+CgkQAQVmvOQTY5L3SgCgiEi5/1vYvJrKoAdl0hRWU57ieUIAn2n08BQfMZJQ439a
+NW/CnIK8jPBPiEYEEBECAAYFAkLgNdAACgkQc84u+4QI91XdNQCgoBB1ebohIfli
+nAPlvI37pFHuu0MAoJ4yMtbKZMaq0xIBnxV9c5uu99tGiEYEEhECAAYFAkLerWMA
+CgkQi5YpQ/wkPzxD7ACgqKnyeb/fjVS8vov4FePxeLju4msAn1SCGaiF9gEf+qIa
+ZUnjcT7JDJ96iJwEEwECAAYFAkLerG8ACgkQMaY9luwUC4Ea9gP/WON+0xIWOvWP
+7mKkg/+X0ukW+mbjE426qKtG/B0vNrTKpElmz8ttR+oajqbg20LazoEUuA9ZXjLP
+fsdWA+vFkxgV6qIdtxYPMamPm7ytEBOmgMowYXUftGteqM5fxLlceHiwdUlynG2f
+mtMqvPnd2OCezSFRx3W6nvAiIjoLZpCInAQTAQIABgUCQt7H0wAKCRA34/Rf7mXj
+IcAUA/4nDlQbnToSSDOZkFj1CoGL8TjsVgzrO3r3S3x38uQQTFAE/AGBY4mtHgNc
+YmiJaC2hN1Y+mlEGu/80Rjv185ZfJsFEerU6Y/9tRJJ1So9AAe5AmvGpD9ysXae5
+geB+k+epIMSuf9WMeTRUCbQs9ufGZLV5a8jqstv+btcrzNaY9oicBBMBAgAGBQJC
+32x4AAoJEJrNPMCpn3XdRBkD/iNi0Y6A3afDG9ZL/K4JrOPgHUFWC/DgAEBme4AY
+62agUsT0uXlz+Mu1Ps2E0t26ejScuVMMvqpXg7iJ2+3yKzsnX0ySEXW6/696XEpe
+3TFn1iVOmMElPKxakn3t/jr6SDepo9jqD5P5CJR4GsDsG3iKIisWdDf81ZXpf86y
+7A5eiEYEExECAAYFAkLeuuUACgkQMsnkzjZCy0vmSQCdHGC6jOEVo96yyospTq7b
+L+EEeioAoNMKIZy5qFLXXZbSNvsj7mDRg2c8iEYEExECAAYFAkLfbHoACgkQUI6u
+xTAtpWhYhQCaAvqVBsTX5s4c+sTOo06BNMdzHIUAoIwpThAKq936Szy/3Gfv8K3g
+s5NOiEYEExECAAYFAkLfbHwACgkQ3bpkuiwxLS9z8ACfYeocOK4J204xwbXgEdUJ
+QyvHK2UAoKz2AF1I2b8Ebu7vTUZLNFV1QMtwiEYEExECAAYFAkLgyTgACgkQXP03
++sx4yJNbEgCfRcj6QKHVHQtYVXdCYKUbrj97wAoAnimqV15cvz1siDjUK9K/aTsk
+GwajiEYEExECAAYFAkLg7MsACgkQybWm7OLXdN8UoQCdFfqef8My1xhn6mLd9WTL
+LaIewTQAnRXGh/Af4hVG0KwtZcJEA464nCoJiEYEExECAAYFAkLg7TwACgkQW5aA
+EOBPmol+JwCeLxZjKNisjgP4AxV5BCKR+5SU9NoAoIwPF/7B2NmGNR0t3EZze8wp
+NhQ0iEYEExECAAYFAkLg7V8ACgkQN/aP9QFa/IqerACfafKJi4s8LYV2JxNfQKHg
+mRXzeIIAoNBHOzukDCdxIvmYJfamItnCP45giEYEExECAAYFAkLiYm8ACgkQbZiN
+F4cxXDH8HwCgq8P29CwMX7PKhRmY3T32APsOaMEAnjdd/WvzVBFtTcJFWkH6iF4L
+8EQpiEYEExECAAYFAkLjVb4ACgkQEy5J1OQe3H56DACcDPfWLO5cDkeKFCvIP8mc
+4p4KkfkAoJITROldIRxXqUiML1oTJxieuHJfiEYEExECAAYFAkLjZNoACgkQdcqi
+o/ObN1CItACgsJhqBxeZTaSrRVNk3aj6ciAJrgEAoIxPXYTvIpnWBr4/WMbN0jpV
+0TGEiEYEEBECAAYFAkLkbxIACgkQjON2uBzUhh/gZQCbBpIqkCEuIbd6tqChz3Pz
+cIGiZbgAnjluBFHl4l1/NHtP9fEYCgl8nbCviEYEEBECAAYFAkLkkr4ACgkQBJE0
+Quobo42f+QCgjtO6EOdDRiruCi6gKvwM1a2eRwcAn0XUELm5AZezL5E0rEfIM2FB
+iMi5iEYEEBECAAYFAkLlwh0ACgkQYRlqLjM+ToS9pwCfUEgO834XY/clWzkw/VLB
+fe7MLZQAmwdz0nleOHYWFBrnYgEz53d4MxUPiEYEEBECAAYFAkLqY/QACgkQsr68
+QBUpJK/oMQCfc7M9KpApCWW7eE22PlLoN1sPK+4AoJdwE8TsDM2Pmehk9K+uHIx6
+FoRviEYEExECAAYFAkLj7WcACgkQMoZOQZyFIitClACfWpH0+V/N6vuucWZ7bsMm
+2BcmM3oAn3fF5qqovlog4/PcgvKCToNEF8uWiEYEExECAAYFAkLlELcACgkQUnkv
+r5l4r4YUZwCgg7vJpDpUXnuNvgc5RHgG7UYhRQYAoIEKHsrswh6XzVn5yQRkfjdB
+/A0OiEYEExECAAYFAkLlEaQACgkQa3OhBipiP3JA4QCffb8NgQssOQXaVR0dSwPC
+eU2nQPUAn15EAjykVZsUi2tZWqEM08SNOKI9iEYEExECAAYFAkLmmWIACgkQaOuM
+dvjqKWd7AQCbBpwyitQ77kd9KIT6y95Im1vmWt8AnAnkNTBctVtMfwddYTG+xLka
+OllOiEYEExECAAYFAkLnYVAACgkQbpR1lMFSQxqIRACffQqUXTgOa4hyHYQBUwrl
+GEqmWt4AnRMXVGhd47loS27MmiEiWwDlkNjJiEYEEBECAAYFAkOHn54ACgkQZjW2
+wN6IXdOr9gCgh2fn26W0DSL5WZATvvQkwZeJNiMAnR6+0AlUK8uFSFIVhl+RZMnY
++XFwiEYEEBECAAYFAkWdnk0ACgkQIYJJVs5BnI/0SgCeKCw39INy9ISFunlAojYg
+SInHfokAn2vU8q4JNjg13qNeclZN9kmN9mbWiEYEEBECAAYFAkY44sMACgkQFUWz
+/uIi3k+qvACffppBpoY82MEvDV7c4/6cjw544CQAoJAPCdZA/LRqICJm0iFbDrwh
+sSb6iEYEEBECAAYFAkY4558ACgkQY9CtrpESA+QrAACglRB/VdEmovbyWdMDmsTd
+yw4kha4An0uKwZeKHfBR3cC2s7MvqqmMoz9jiEUEEBECAAYFAkY8kyoACgkQmHDv
+8/EvYHIkCgCYgXQZTJ8VmHwSX3pXOxnMhp7mbACeIPXwcPvmfP709nfgQ8/GpT2z
+9ISIRgQTEQIABgUCRjkasQAKCRDh4fKwmQ7UqhZKAJ9iraDBstzeXPMtst3x+ZXd
+LQm7cgCfWDDgaQOa8CoM5/+7WCtkyasP6BiIRgQTEQIABgUCRjxQRwAKCRBMBCgY
+MRo95eP4AKCuEQU6fjPy/cPEiqhGH23J2YEr7gCfS8vBTEU4sRbOomTEuINPxb96
+OZmIRgQTEQIABgUCRj2gkgAKCRAuuUaCiIF0AgOBAJ0bJmFzA9WkG5FmfaP4ieG9
++SCbXACgw+2wcOA/B94LKRtjhJT6j6zSiDmIRgQQEQIABgUCRj4VvwAKCRA+Km/C
+XymIJIvcAJ9QSE4mCQldVnpbYwLTCk+xHDqhcQCggT9P3/rHIzIvv1tJ+A1ZJPvX
+OcqIRgQQEQIABgUCRj3WeAAKCRD1wmAWTO7XXwpbAJ4mr2IxFtx0ppkefxx0l0TJ
+6cFkrQCdEFbc+aMxRKhK9SCAWi3mq1UqEWiIRgQQEQIABgUCRj31AAAKCRCgctTQ
+Q1jFhByKAJ9SIielTuD3StxPQpBkAkYP6Ld88ACgg1oPX9ryJA7YuhMD7byXQsET
+zD+IRgQQEQIABgUCRj4FxQAKCRACpaYFC35s+k/GAJ9/VDyw2vNzk1xjcu/QZCa3
+gGI2zgCfeG8klJ78bAGknzxBlK3XtmoNqASISgQQEQIACgUCRjj3hAMFAzwACgkQ
+c92MFgFTAjVJogCeL+3FTTVR5snJx9qbGQsgv23ZaT0An2Hy1CcXVklcYBF7Lbnb
+Agbe1HpfiEYEEBECAAYFAkZAtkMACgkQbQvHOkBYGDePegCbBe6rmz9/kYDV7w5p
+vwnugVsvbiEAniTfLW7NW8z1SRBWf6lMH3clGAs8iEYEEBECAAYFAkZMRFMACgkQ
+HyEjw2vYcqB22gCg1np1JYFYPqCB3ekZts3K+pn7RkwAnRWd6HmtjRolZdrZfkqQ
+DJKmd5zviEYEEBECAAYFAkZMfQEACgkQD0UKJmIQv8DJYgCfW0C9rDAToLU+0BKL
+YCiWwtFJ98MAn2HvQ3CDhv8WTm+av36lETLqhjnfiEYEEBECAAYFAkZSb1kACgkQ
+MsHW7w8UO8GGZwCg0l2T1O/OpOECXs/vYE2649wNTaYAoLrUpLKYev8uHAfc53lZ
+6LE0h1T0iEYEEBECAAYFAkZSb2AACgkQy66+OaRsTKHZbwCdFSloWJh3uuTLk87a
+St4uYeZrKToAoIrN7epZxeu9n9e6hqVOLz85zc3TiEYEEBECAAYFAkZe1aoACgkQ
+mobXzNGq6mD+cwCg3k4BRrRi6pjrY/UggHjhiHWSD1YAniDQn1MVB620Ik2cVL7h
+R1V0ZL6biEYEEBECAAYFAkalTCwACgkQOb5RoQhMkROqQwCdHhIdklVR341azVFB
+O6aGArSOP2QAn0WtSIiqaLTEQ57+ir62FxRYBQdWiEYEEBECAAYFAkatzFQACgkQ
+M81nM69exFIdRgCfSGft6KIZ+CTEPIGr8lp8oOpNaHMAn1NCXZTJOW+r0G5ply4h
+lu8UXC4AiQEcBBABAgAGBQJHwH2YAAoJEBllhVDDEQYRZ4cH/3XnLW6UAdDd4k0x
+l2lUAj9gB7ITUbejCwvnFqUyKAE9P38boBHNfc6cliQUOz4ITWDPhiinbjNnJHgl
+p9vK0o4R/tFFyGImIvbmu1C8lyO2BJPgF2yMNrBgZhx0+IkAG3R4iy9JFIDGgddj
+LQSP4TX3uRUFUXEAhHzGA//XP4tnC3CisvOsuoc6ZjyZGSt/HUzZoKf+wsdJlfab
+iK3QpD8lSOw8KEZF54JUC8uaYGuBGs7ih4FcO+Aqb52UAx4/+13eEdAognVF2Hba
+iI+G2jEekyAwD0bP3DWyg+9fGBtnwtDMj0OrHklvA8qoHxAMvXHIGhxjqZBOFehh
+8DNEB6SIRgQQEQIABgUCScqH2QAKCRDJx5JOUQR9Zj6WAJwOtRlhq45DedrYNH54
+QIJSFw3XJQCfQI9fZl6zmKWSm1nJqXRC+awKmwyIRgQQEQIABgUCSc/UtQAKCRAk
+waN4agF7F75XAJ0TyTdCMGIZGCooM/xr3w+qvyZLgACg0W8O9WOf0qwSVgynmh2v
+QggUiyKIRgQQEQIABgUCSdI2jwAKCRCusBoVO3x1sZHiAKClsXinnJfHMQYewFPq
+y16zr//f4ACgulnu+ObADHMquuGCw4BLwrvqMIK0IFN0ZWZhbiBCb2Rld2lnIDxi
+b2Rld2lnQGJvc3QuZGU+iF8EExECABcFAjsSOYEFCwcKAwQDFQMCAxYCAQIXgAAS
+CRCiEVrhX2uLcgdlR1BHAAEByboAoNoD/9Jgm/alxfAYELz05LMa/HLeAKDWTHqq
+7rMkppZoTUv2gWpVzrk5RIhGBBARAgAGBQI8PtWVAAoJEIEEZE9RiYUE0LMAn22/
+u01Lo3Bo5lDxxHSkayUkYq25AKCm20yaGFGtTDJW4Rdz50pfut1AwoiZBBMBAgAG
+BQI+dd8PAAoJED6Pt/L4g0HZWboD4gPGJi0y93+Zp37uFGgpe8PkB10HVLCe9B0l
+7R7BK0UFhnFl004td2RWeALAAnOI8ZlxCahwQdUys34zF77c5fQ8Rn7co46wBSL5
+9Oi/bG9/wRYqBf13SWL2ITK1UDgzRznZrds9MLQqSL8oBjebyg28CZPBYH10FKig
+UUMwiEYEExECAAYFAj512scACgkQ7tHqOSJh0HOu5gCcDO9Ou8NA2+gChoNAn6j/
+J2owDxkAnA0Q5AMezP7rKdsw+hCYqZSp8QhIiD8DBRA+daoh/W+IxiHQpxsRAiSn
+AJ4id/ijcLliSH/EGh1UiaunYK9zLwCgyfeZ7mnhKXauba2NXFMlm3axSvuIRgQQ
+EQIABgUCPnekGgAKCRAVP6DNdaZ2kikaAKCJMBE/oJ/4ko7FRpUWvQv0MLmhRwCg
+jEXsPmY5Ur8AVynVzE2TcEu12reIRgQQEQIABgUCPsouMgAKCRDb0kX8s7KhLABs
+AKCU2ntXY/DhTnvki6igzrvttl/ynACfZTZNwePs9imtT6phGTInelrsXLKIRgQT
+EQIABgUCPo3ONQAKCRDKaTl0gQOjflg/AJ4khT+aic33qc/iMmMC5+URcxt6ZQCg
+leruhUJi44Kpav9PdVbQMzdb52eIRgQQEQIABgUCQZLz6wAKCRDkE2EzDKpotDZH
+AJ4xwN/htv44yNFQnACTYsc322HjZACfTd9WoxRkRWY6tVd9YgumNc0swMiIRgQQ
+EQIABgUCQsUyhgAKCRCb8iNFL+KLz+ClAJ99ddEJ5l/VW/mKHvTITZleDSv+uwCg
+lgqx3HQrlqp+gTPKIEKPkjjom+GIagQwEQIAKgUCQuE4ECMdIFRoaXMgd2FzIGEg
+am9iIGFkZHJlc3MgYW5kIEkgcXVpdAAKCRCiEVrhX2uLcvEYAKCJD7CVpr2Iw657
+kO6G3Is8xKa6IgCgiStyJgU5/dUEEPQctZ8ZVZSrHNGIRgQQEQIABgUCQt9FDAAK
+CRBB6gmgV5NJj+d2AJ9QRCXhFzmee7cbhlfejg7LBsXsMQCfce2/Wz+if56L7WaZ
+Lpn893CAzu+InAQTAQIABgUCQt6scQAKCRAxpj2W7BQLgXUkA/96klgNlfh+VTSx
+rwCUW1JE5j87qDeJWrnN5ibVYPd7TE45hNeWQie2RgWGpsHNlDekVh9aZuHMJb9N
+zRGKAAJ2augQQuvDKt8sge+ydRMXsLkAvpK4VBmobqqgyO0cV3ooMyizawMRndVc
+MbVu5b6Gkdj2tZEko/Nv9KBJ61MJ64icBBMBAgAGBQJC3sfZAAoJEDfj9F/uZeMh
+rGYEAKJgLDFku3GdpF/BI4GQBKqadLygF3Igq9Np310sTcLOI2ARb4B18Tvq9CyR
+4PEvdlVC5uEpaJozgHthTadjGTgg1WmiTWqG31s3U+zL5NLdK+k8qqrxGLzFzhk8
+PB1wJwImJcvLmJHm3HeIGycdEzn4swgmD4uI6p39mcGyCCONiJwEEwECAAYFAkLf
+bHkACgkQms08wKmfdd2sxAP/e8W2cqyypPqYHs05nTxNzD5wLl72ABWvljfdf5mA
+97sEl3q48234j3sUN1Uk6c21NlK+eRBn8Lv1ihyLTJkACgdiXNFvi1eC4vLhQMGO
+PcGW8+wI4olmsqftvG+2hNt4eCMead6IjAK7LNKgDWEBjGI+WIOvC5UJBO50cNXG
+OXWIRgQTEQIABgUCQt667QAKCRAyyeTONkLLSxJgAJ9faCKziDmN6nQeMoAECTfV
+vIdTRACgjnb3h8sc54gcosIh28qb7uBUuf6IRgQTEQIABgUCQt9sewAKCRBQjq7F
+MC2laDoHAJ9VC11NFs0+BAYWoZBJSUEnjn3F9gCgsqGPrxhTBkHlWAh4iiumq31t
+ZHaIRgQTEQIABgUCQt9sfQAKCRDdumS6LDEtL3hJAKCEHj7lHAZHRk7LLbFQDh7o
+iY7plACgiORbBhF3VWn1JCglbk51Kq5hJy2IRgQTEQIABgUCQuDJOwAKCRBc/Tf6
+zHjIk6wAAJ4qjf2FNE1VXK+PnL2iFP1h7f8L4wCfbtoQqsaDE1vCrnSobEUT6nfq
+Pt+IRgQTEQIABgUCQuDszAAKCRDJtabs4td03yLQAKCz5pbjUWdyEHQr85R0He3Q
+uDiLkgCgz6XQ/LFLdcmwDAj4lsKbRpHdUDyIRgQTEQIABgUCQuDtQAAKCRBbloAQ
+4E+aiRuoAJwLeKfpT6aqNLBvrusHnNNjROFi5wCgjhXup7RcdMNTDBY6BGj83NHu
+TU6IRgQTEQIABgUCQuJibwAKCRBtmI0XhzFcMZwOAKCLkKunJnUNy7QgowvTkV+/
+DyU+FgCfScvQFzMSj1Gk1ViDbK0n5i2MpQWIRgQTEQIABgUCQuNVwAAKCRATLknU
+5B7cfur2AJ9XnFPKjlIPsbrZVJRuNh96py7FfACgoC5yGwyRq9hYK3SMGGAu5MmQ
+WpSIRgQTEQIABgUCQuNk2wAKCRB1yqKj85s3UB1kAKClSCLmqecNSlVeFOwlSijh
+TjzmxgCg5eYxuHJo4wf2D2d1gWbloc8xt/2IRgQQEQIABgUCQuRvFAAKCRCM43a4
+HNSGH1JzAKCoUQuAh01aTLbbUS4WCMrOAQblagCfdwFlsT48wWEBnJSFAiXaEcRt
+UkiIRgQQEQIABgUCQuSSxwAKCRAEkTRC6hujjcShAJ9EK1u8wehMaZLt2ZnexHIC
+PhbtagCgkN+i7LXBnm1IwlP5cGbmgW3BJRKIRgQQEQIABgUCQuXCIAAKCRBhGWou
+Mz5OhEAfAJsHEwc1jK9tiYBvWRMS3zJ0XrrShgCffOyuZlrBNeuO9s8T9WkL7/vC
+nOmIRgQQEQIABgUCQupj+AAKCRCyvrxAFSkkrxWDAJ9oJHjkm3MWfPS/iMK6iipo
+UaAfzQCfYFygT+mws9MQIZEMoTi/sk0AOcKIRgQTEQIABgUCQuPtagAKCRAyhk5B
+nIUiKxsGAJ4mMBcsZ/PlqEN2CjOoNits7PFYbwCeLuEXDDEcUAh7jb46wvrHB5EP
+jp+IRgQTEQIABgUCQuUQtwAKCRBSeS+vmXivhlvNAJ4wGMXMO8EgWYrlU0i+9wrd
+6N0M/ACgvODXK0oKDcDQ55t8xf2evmJA7HCIRgQTEQIABgUCQuURpQAKCRBrc6EG
+KmI/cl6+AJ4kaPB7Ois5KuLwhbEwmpO3e07OQQCgw1kJOjcCZwogIWG1222By45k
+1YCIRgQTEQIABgUCQuaZYgAKCRBo64x2+OopZ+DxAJ91h0aGRvukGqAWEafe4nnT
+6xj9CACfU91kJ9G1WB2T8lW/fkXt8mnlrUKIRgQTEQIABgUCQudhVwAKCRBulHWU
+wVJDGgmCAJ9DsO7lkpvuigmPoIX6d7vufFW5iACeMsXW1nX0DWf6E9pPgDaeZ+db
+a1GIRgQQEQIABgUCQ4efngAKCRBmNbbA3ohd09++AJ9GFjNIUutctozuFNreIeS2
+xATWJQCfTUwt6nd4R13f5U0+iOsTwWVX6h2IRgQQEQIABgUCQ4efngAKCRBmNbbA
+3ohd06v2AKCHZ+fbpbQNIvlZkBO+9CTBl4k2IwCdHr7QCVQry4VIUhWGX5Fkydj5
+cXCJARwEEAECAAYFAkfAfZgACgkQGWWFUMMRBhFLagf6AqFi2y+DPg+duogX5hHs
+lLpeRVXbqEqX9bB2BzzinUhTmmRpEpiVnCkTd69scXh/ZVTECfA2zBYV67gp3eit
+UB7CDSeLZwqQCIz42uF5ADq9oj+j6uf8pPmsk9qO4VZcr7mUwJ4tDy6znG7Qg5H7
+y4HRRQ8cwodDIa2jpLdQ+v9+fms4Nq5j/IJRmHjT7Ha6n78arpl8DlBtjjG0dpmK
+fBB9n68MbiFLX19yIxO98X/nEoDCk6DuLX79Ratt4jEr08YCyJ4PfAqJKUy+F5jr
+Knp3G/qj6H2N72vHZLzoZRfZjBzbpN3V9rPossxQauoRqmU5M9wFDnBoqyszMMU+
+KokBHAQQAQIABgUCR8B9mAAKCRAZZYVQwxEGEWeHB/915y1ulAHQ3eJNMZdpVAI/
+YAeyE1G3owsL5xalMigBPT9/G6ARzX3OnJYkFDs+CE1gz4Yop24zZyR4JafbytKO
+Ef7RRchiJiL25rtQvJcjtgST4BdsjDawYGYcdPiJABt0eIsvSRSAxoHXYy0Ej+E1
+97kVBVFxAIR8xgP/1z+LZwtworLzrLqHOmY8mRkrfx1M2aCn/sLHSZX2m4it0KQ/
+JUjsPChGReeCVAvLmmBrgRrO4oeBXDvgKm+dlAMeP/td3hHQKIJ1Rdh22oiPhtox
+HpMgMA9Gz9w1soPvXxgbZ8LQzI9Dqx5JbwPKqB8QDL1xyBocY6mQThXoYfAzRAek
+tCpTdGVmYW4gQm9kZXdpZyA8c3RlZmFuLmJvZGV3aWdAZnJlZW5ldC5kZT6IYAQT
+EQIAIAIbAwIeAQIXgAUCSgkeigULCQgHAwQVCgkIBRYCAwEAAAoJEKIRWuFfa4ty
+6SoAn2X4c0dOTQp0dk+ofvPDMtNWBbIXAKDdrSAnSP/iaXIouTg9ncAERnXFgoiZ
+BBMBAgAGBQI+dd8PAAoJED6Pt/L4g0HZhpID51GCXx5Q60No2CVrjw73vZ+KVfTr
+8iJZSsi3X1C47C1l8OCZvnzECYFq9hhKL9WWCMktvqxg2aW8/78WgVW4KjPEz3Yl
+88cFPABauJPhJuHyl0efAci0iY7yy82utbKTRyXp5xFBad7U6RLK+GzbrmqEWIbY
+is06jbqAvtMfiEYEExECAAYFAj512scACgkQ7tHqOSJh0HOZXACfRTqAC+LhzLqh
+1668bBFTybxCdvwAoIGjkethM4lKnKqXZv9Wctz+E9toiD8DBRA+dao4/W+IxiHQ
+pxsRAlrLAKCp5Eet21hghQweWCbX2Sfp0Kt0wACg9W8xv5CE0KSB7E9rwmNcgZpV
+mwWIRgQQEQIABgUCPnekGgAKCRAVP6DNdaZ2kvvSAJ9JBZVwMzoYbuK+X4JTFbsO
+W0wHdACgrWEV9hElP/rbBPL7l1rbDAhniOWIRgQQEQIABgUCPsouuwAKCRDb0kX8
+s7KhLEnHAKCqht/V9susaEGuep74heYgo/6ExQCcCysfRsihFG0jPX/yEOwLGT4R
+0+eIRgQTEQIABgUCPo3ONQAKCRDKaTl0gQOjfsWIAJ9R2xmpnF0w2EhY591OYpNr
+0GvJ7gCgv7lDNNYLHZ/u9RIgJJq45R+h/TCIRgQQEQIABgUCQrgKqwAKCRCBBGRP
+UYmFBNDFAJ93FhVVtNwg7jLgO00lKk3/3lgEVgCgvxo0Jz2dPoOzWw8OvGUmN5PF
+rrqIRgQQEQIABgUCQZLz+QAKCRDkE2EzDKpotBiEAJ9ZqXR8/8Ffvq0lNkJ+0d9r
+JXzXaQCgyT6qZ5nDeDFJpPdMmRHhwHSZq4SIRgQQEQIABgUCQsUyhgAKCRCb8iNF
+L+KLz92FAJ9c/C9RJy3SGLbVq09c7NBPPS8+AQCeLBc3EqtjTtzmbBEH4fRegq1H
+t1KIRgQQEQIABgUCQt9FDAAKCRBB6gmgV5NJjyFIAKDhfzgs3KPp/97Biee5tPmq
+hizsIwCfWwvOgdoUb5GmZRpv53t08woBRp6IRgQQEQIABgUCQuA10wAKCRBzzi77
+hAj3VbBKAJ9oavMNCVLXyabt0pjFJBWSwRZt/gCePKcZox146ASRqaJF8OIvQn2+
+egaImwQTAQIABgUCQt6scQAKCRAxpj2W7BQLgRg1A/d5x83A1kegLg8Q72g6dcUf
+KCWR6I3mfbFkkUH34jSShdO773Yxm8oKolm0JrUzPagZwMRIgaUqSXpgYbxkyorz
+5G/R/PCkHto6qMAztyCaKyFTE/nlBQfuKZ+XPpBSw/yIRu6IWdqwSHOOy+thRbg9
+fXrMbzHFXpawRauu2VeCiJwEEwECAAYFAkLex9kACgkQN+P0X+5l4yGPbwQA6q4L
+s5TTiRZFrxJIHVVwgh9kz9zlLj2fSULWyX25INZ59YQpzCE2qTSZRBN8sowe5BKQ
+ZJlLcir91UsDg7KX4rP6bOsyUSJ3v9kecarU9/B3/7GLnKDGVHHoqRQKAi2DqpCi
+SsE6WDNONNXVKbsadcvC6uTdEg7U1vXyjDbPY4qInAQTAQIABgUCQt9seQAKCRCa
+zTzAqZ913XpNBADS498IdhQrpMnbH0s6oIxQ6ZFY4gcW07QnqfOn5WizKxdx9InX
+JBgozFH/yaLLQbI8AqS9lZQrb4cJeWYCM5vJbnHh7qatoguYb1DdCIyriFzC22T+
+wxPi33L8PNpyrfCTT6Y6LF4jIcrEGZrNl37jT+n/xMvCeY2gdmdiQmFiQYhGBBMR
+AgAGBQJC3rrtAAoJEDLJ5M42QstLwa4AoJXwrbSMRRqlUy06v54T50RTB1/WAKDO
+GdOaE7jxcRlkuEc8Qswm976bAIhGBBMRAgAGBQJC32x7AAoJEFCOrsUwLaVoIqQA
+n0wc28m+1XNI69hWQ4lyRVEgQqBGAJ0fsklpnnZHCVhEkrakbLQ/E+9pjohGBBMR
+AgAGBQJC32x9AAoJEN26ZLosMS0v+UQAoJvPJaWA8ctG2Bff7mxW76gsOovWAJ46
+0KDi0QbUOEJiD0fk//R0XjnknIhGBBMRAgAGBQJC4Mk8AAoJEFz9N/rMeMiTV8UA
+n36HHFAVjudWCBDNJm7KqZyh7WsKAJ9sU4g4KN047W0SbJAA7sPkJwE0C4hGBBMR
+AgAGBQJC4OzMAAoJEMm1puzi13TfGz8An3irX0FipvIvirhSUyKDE7wDeuUEAJ9g
+PRtcLRDeFc4Oh35077YLrN9q0YhGBBMRAgAGBQJC4O1AAAoJEFuWgBDgT5qJwJMA
+n3hd5dZRNloo0BdAZjzH6r5MgNlHAJ0UM7nOz1sj9J8nRqCb3xFBwclbO4hGBBMR
+AgAGBQJC4mJvAAoJEG2YjReHMVwxAuoAoKiAof3Y87dYurmnSQDs7WXP88ZdAJ40
+dTmjNicUfsKit5aEkxCl9bjqQYhGBBMRAgAGBQJC41XAAAoJEBMuSdTkHtx+60cA
+niVi5i8j86YN56+uY+wMahkSXg31AJ0U9jmvOXQDNNsIHWJY9xXoz7jRc4hGBBMR
+AgAGBQJC42TbAAoJEHXKoqPzmzdQwPoAnjmnjGqxCQz22Y2jd8vz3+Twfwr9AKDB
+j4z0kxrf4hydmgK38ndDBP0edohGBBARAgAGBQJC5G8UAAoJEIzjdrgc1IYfpZ0A
+n1WzxheVFpcxW8SvsSpmNg2yl2+cAJ46aAMX30kTtT2ZUFB4FpUvjWngs4hGBBAR
+AgAGBQJC5JLHAAoJEASRNELqG6ONH2wAoKPWAiV7uR6aHP0lad6xwmJk7hDGAKCL
+dquqzy/yW25IpG0amrrBJxbLc4hGBBARAgAGBQJC5cIgAAoJEGEZai4zPk6ET/MA
+njlQCKWhvqvRu7iYFQsg2dCW443yAKCYIPjawX4TXjgbruZktT0hg87UPohGBBAR
+AgAGBQJC6mP4AAoJELK+vEAVKSSvB38An1oDZWDSwVpp/53o5cdJujbLU9grAJ0X
+YbLrL+kW3CjaFVLncRhuF5t5xohGBBMRAgAGBQJC4+1qAAoJEDKGTkGchSIr+o0A
+njIqK/E4OJrK0XPhX134+VJZ9N3eAJ90U2hylPkr+EoBHnF5VtEWJVWunohGBBMR
+AgAGBQJC5RC3AAoJEFJ5L6+ZeK+GQvYAmweV9Ky/w7aRqbYjTtdg3U0Ks7DDAKDl
+qSRYN1u8wK+2pVY6pcdLdb0uCohGBBMRAgAGBQJC5RGlAAoJEGtzoQYqYj9y2GsA
+oIrkKoVWsuxRPHtOWWuvbHkMBeAmAJwMQVTcr17v9WngLkot4gurcsLxaIhGBBMR
+AgAGBQJC5pliAAoJEGjrjHb46iln3W0AnR3w53mDPp1l0/6GDqqIWpi75PIkAJ9S
+yyYZC4gjDmvf24hduMyrfjI2h4hGBBMRAgAGBQJC52FXAAoJEG6UdZTBUkMaINAA
+oKf5u3fzXTT9MOtOVcqyVgnaIHhvAJ9hPhaRQUIMryWg+pJcw0TTWC3O9YhGBBAR
+AgAGBQJDh5+eAAoJEGY1tsDeiF3TYA4An1FTBiWVfw9UBHZ8K05EZjG9+ykeAJ0S
+w1jLCrauKil0I2G5rizXR2tREIhGBBARAgAGBQJGOOLIAAoJEBVFs/7iIt5PB/wA
+oJihHU6IgWsNcADF1yo4/vD01PPNAJ401g1Y1dn2Z4/Il2jiuzE8dNYDEYhGBBAR
+AgAGBQJGOOeiAAoJEGPQra6REgPkF3AAnAhbVLxHJk0+XswLDLFj20SQKrcKAJ4x
+XaigKAQ5D6/Of1SPPRoX7bTEXYhGBBARAgAGBQJGPJMqAAoJEJhw7/PxL2By3XsA
+oKONmq8YyhYqvpafW9dX7k6r4pg5AJ9Sjki0Wqrm1AYXxAYGc8fZIesIf4hGBBMR
+AgAGBQJGORq5AAoJEOHh8rCZDtSqiDoAnR8FA/yGXEAd6gP0AoioyMHj6e0KAKCA
+dnxXUB/eSwN98EkeVwSPpiBLG4hGBBMRAgAGBQJGPFBHAAoJEEwEKBgxGj3l+XYA
+n2Okz5W6SabKyirUGjF30lr9BP8VAKCBqsPWR50O8vcG0lDLkp1tuW+63YhGBBMR
+AgAGBQJGPaCSAAoJEC65RoKIgXQCTFkAoIq89nYh6AmxcqwQFeYiloD+FGv0AJ41
+la0vkis1JUIDM3FNO8xw5VbNZIhGBBARAgAGBQJGPdZ4AAoJEPXCYBZM7tdfcxkA
+nAsMAnhrvQNVPQJs/P5ysQTKHXZ7AKCGrxUFi5FQ93oEuWBGqw/xHcMfVIhGBBAR
+AgAGBQJGPfUFAAoJEKBy1NBDWMWESn4AnjHzaapJEaIYFhc/39hIRm5n0dl9AJ9l
+AXqmz+YQSqJKQ/cchdKbLdhSGYhGBBARAgAGBQJGPgXFAAoJEAKlpgULfmz6xg8A
+n1EFGiCeI1C+7BUDqI5xlPps6WB5AJ9cUoE8g1ipE/QtCVYcOUhD53yxY4hGBBMR
+AgAGBQJGPwYxAAoJEAP2jL3eiISgjbsAoLzdvLd5d8mADMZDFLi9ywPLk4pBAKCt
+23xxWAwNSj5W+uPGLL6R0IEb6IhKBBARAgAKBQJGOPeHAwUDPAAKCRBz3YwWAVMC
+NT3pAJ0d+kpqF2GHoIhFEisRwox0J52J2wCfc5nQgpaGmgyMqodqq+cdoybHIx2I
+RgQQEQIABgUCRkC2TAAKCRBtC8c6QFgYN2F+AJ9l6y2ms478IKVMFRI/SghwKvRW
+AQCeJIR6hCR46QY0IqKhkHy9mfzaiPaIRgQQEQIABgUCRkxEUwAKCRAfISPDa9hy
+oOhdAJ45vxMRMgaHj1548DkUttPv0cdYHQCdGlc//bHVnJwwlUFz/1O4sXwDttaI
+RgQQEQIABgUCRkx9AQAKCRAPRQomYhC/wO8fAJ44L3d9QLaMvMvcI78aMBJH2y2d
+SgCfe9xYYMuYvf9qElihil/7a/9p68CIRgQQEQIABgUCRlJvWQAKCRAywdbvDxQ7
+wRIDAJ9xo4egUgVo6h/N7A5nMBuT3dZ6jACgy2Oc2uFYYhGvBAgQpHqESZf4suOI
+RgQQEQIABgUCRlJvYAAKCRDLrr45pGxMoYJUAKC/iURBlu5JKxZJqUJ6D2kzYuo4
+tQCgxTpvpDWKqrGIM8OeA/PbdUJqTkCIRgQQEQIABgUCRl7VqgAKCRCahtfM0arq
+YMd8AKDHCkES+rZ5lM7aewuV+/ouOknGQACfePMsXa5L4OKjA3szncnZkcc6Wl6I
+RgQQEQIABgUCRqVMLgAKCRA5vlGhCEyREz3aAKCFX/1eYbphSmP2KYfgHkhg6Hf1
+UwCgtjZrJUNnuhsPGRK+Fooeds3MatGIRgQQEQIABgUCRq3MVwAKCRAzzWczr17E
+UvI9AKC1QzfFpES4rgb6+6lqzYYO2JW9SwCgtZkhqsaH5evRZiIglzjHmfgPJjeJ
+ARwEEAECAAYFAkfAfZgACgkQGWWFUMMRBhEjoAgA4cFAPqtCYVpEf0Nc7eciqxpU
+LGLaUCOuDfMZiz1kSkXi4FiDAKbSfrcGAPmLh+8AiQbID+1PKItsfWs5ZjuBzJw2
+toF7OKSWxNKUSJoT+SapGGrs3qbywZWRi82dcwqSxPyZmsQfLXONJRePwgWy4+RB
+Nvo38j1hKZclf8xMI4w1wJMUs34Xae9BGMoLhpuJ+jOCoG4JE3cUdf7hvhyJKtMh
+xrAiYVYmVlurShtNF3Czhq5tm80Jb9m1wlZRFgvUE6m/2XWwPjjS0lnZnoBFVZ0H
+lMd47b0YOu8ieS1wNgkqtpRwBqBBH2XOM4kR5p/uT7rJN9yav6z1fEEgmV5TG4hG
+BBARAgAGBQJJyofZAAoJEMnHkk5RBH1mxrcAnj6+e5JOVqw2yHEYGIL5d+z9iURf
+AKCR6Y89jMFzzv2rEPbArCxOeGmurrQkU3RlZmFuIEJvZGV3aWcgPHN0ZWZhbkBz
+YW1hZmxvc3QuZGU+iGAEExECACACGwMCHgECF4AFAkoJHooFCwkIBwMEFQoJCAUW
+AgMBAAAKCRCiEVrhX2uLcoYCAKC4KNTcBwjOEIfMOgFsF3uTQTvL5QCfQ2960jGi
+s9Jye9Ly/fI1CBMVQxiIRgQQEQIABgUCQrgKqwAKCRCBBGRPUYmFBP0VAKCPH0b7
+S+TylV1uBuYcYnWIb/RJzwCeJvRTMPnWNjVz+CVOvVzJTH4ol5mIRgQQEQIABgUC
+QsUyhgAKCRCb8iNFL+KLz3iqAKCXRZWdGjBVbj3IBFl3kvh3xF2gsgCcD3H79mbV
+DRNMxpGArFQ1hqQFzleIRgQQEQIABgUCQt9FDAAKCRBB6gmgV5NJjzHQAJ9IfkjK
+kiEuFxUhznsghAQ8bsBWnACgoT0kWSB3iUepLIDoWhhGtDIS5FSInAQTAQIABgUC
+Qt6scQAKCRAxpj2W7BQLgebOBACAFFpEKETO3ZHbjMnPogACNr6EZCQxzGTIXrXS
+yWQs68VcH54wUOA4yk3cGpfH2pgAxYjaHejTJRvDKvGrPGlKHgCZFy4+wHzo17pW
+9J1aKk2sUWlT67snDVdMun/i8WxD9yz299cXR6iCxPfP2HIMEqbsxWJaXITo7drW
+SjO35YicBBMBAgAGBQJC3sfZAAoJEDfj9F/uZeMhRawEAM9wfn9sBIsFzQRQbAO+
+ll83f8ki++A4Anj6DXQ4xRmClUxqahL1BjxxeQhE+Qomq1IebDJr0Se34XB0g3J7
+bzr/i9QmEwEqnDJfWVobv1Ugjy+1jzErlZBhm8hnCI+zPnrWKLk0n78vzJ5RrnVa
+TTV+OW5r4rdVZ86yKYHtpVSoiJwEEwECAAYFAkLfbHkACgkQms08wKmfdd0HDQP8
+DDD+1FQU8PPPe+Kuf2bJOO7Ycrej4JF1I/Gbs2HH3xXgOZsRv6WJ41M/ovxJLYrp
+VqQA2YF/Gxwguwrf4lPk+4spFdabguiJK0d2/KZAtnLsjIzdYcoY01IKGT3xkPwI
+DErNFSmxX6bKCUePcFNHYZ6dDBHFFcYVTsdo/wbAe6aIRgQTEQIABgUCQt6wsgAK
+CRD9b4jGIdCnG30UAKDCxsPZksKIcvj7tbHQEwm+PV5+DwCg7PorUCgIvTIWnID8
+zRWDBG4ACXaIRgQTEQIABgUCQt667QAKCRAyyeTONkLLS/d2AJwM7BQIQgqLA0qA
+75R2EjHFXQKZWACgo7iaANHxIRc/Nw19j8CxNbWJRJ6IRgQTEQIABgUCQt9sewAK
+CRBQjq7FMC2laIx3AJsF0Hjrm4N21EwdrmhS9PHKQL2KdgCgjlus2GyuCzafgb9J
+HVhBDrhelkmIRgQTEQIABgUCQt9sfQAKCRDdumS6LDEtL7MWAKC6rQU6ZjSS6gVn
+wswutaqBwfwtvwCgv2mMGJf2hnYVaNNqV5WIFAuycmOIRgQTEQIABgUCQuDJOwAK
+CRBc/Tf6zHjIk9TlAJ9dbM2HowI5oD6hGSnADhI2dKfBrQCg4O9WtFiRzLqC1TgC
+Asbigqy+JDiIRgQTEQIABgUCQuDszAAKCRDJtabs4td0311pAJ9L3yUe7GUeDqMz
+d3WLWatclf7ruQCeOenA9nhyKgHASeEK/ZXQXDDBW0uIRgQTEQIABgUCQuDtQAAK
+CRBbloAQ4E+aibNVAJ4wnAfcA/rtUs3+Hu9nNn8ar/2Q5wCfe6W+k9yHjd7hZWnY
+HdnCkAZkOMeIRgQTEQIABgUCQuJibwAKCRBtmI0XhzFcMezQAKCnk+So0Anm4kLD
+wl+srHvIB7b6jACgqROBN5MeEGXQm+Gan2VSt+nvTZ+IRgQTEQIABgUCQuNVwAAK
+CRATLknU5B7cflR0AKCTAlfhPFwHPXnBo+5IROopwNQnsQCgh2vHS9VRZRt5I9is
+NDaNf1biCQmIRgQTEQIABgUCQuNk2wAKCRB1yqKj85s3UK9XAKCELi7ymxtLxdwY
+fdfV3dxd63mV2wCgjgaUlQqFXjx5mXnRsgy4S6cS9yuIRgQQEQIABgUCQuRvFAAK
+CRCM43a4HNSGH5/sAJ9JVHMVwBwHD8PN3DQq8hHEumn8twCfVQSXooNY2P744K+8
+k6lLO8nOH6GIRgQQEQIABgUCQuSSxwAKCRAEkTRC6hujjb+qAJ0Z+AoGDYe122wR
+AOYAKayl9f9e0QCeKetoll6NZ+Rm/NKbFJGP6fYywIuIRgQQEQIABgUCQuXCIAAK
+CRBhGWouMz5OhDd7AJ40l37cLZcSxfPt3M7/aOPgVGpa5wCfciaEynzuHDfIQD/v
+tXrZb2m0+NeIRgQQEQIABgUCQupj+AAKCRCyvrxAFSkkrwQsAJwM8IqtXQk/TBiQ
+i6Fyq/HHm5/zvACg5atZV8F+r7jVRhT1SJ+FaVsaQDiIRgQTEQIABgUCQuPtagAK
+CRAyhk5BnIUiKwuyAJwOljL2++fVQ0BSKRvFSvS+fSu3KACeJxsOhbyCd3o3rqwa
+VeY5FFi+Fm+IRgQTEQIABgUCQuUQtwAKCRBSeS+vmXivhv0OAJ0Sg/UEnB/IAoqj
+HzKoBivCMYDtrQCfVY3IDKRHbbLNfWBSDERWCTpHXtiIRgQTEQIABgUCQuURpQAK
+CRBrc6EGKmI/cqGBAKDEgTewzt6TjmCkI9RrYjF46a9H4wCeJPh4bmTymcfwRGn6
+0h0a9Mz1mKaIRgQTEQIABgUCQuaZYgAKCRBo64x2+OopZ3lEAJ9w4EWAgRUMxf0U
+d1zoygYDQedAgQCeJPHSbk62Ej11NljNGN1zdwzRHuSIRgQTEQIABgUCQudhVwAK
+CRBulHWUwVJDGkOfAKCgQM+50dTktJDaDd8gVOGBKRiSIgCgkT9gdtDac0m9s2IH
+Aqktk0mc0U+IRgQQEQIABgUCQ4efngAKCRBmNbbA3ohd05uvAKCjMnn4GpnZhjWF
+S7iN0LIXgxm5PwCfYodjKF5zSbIROx79dJ41Gg0/VxWIRgQQEQIABgUCRjjiyAAK
+CRAVRbP+4iLeTznPAKCaIUKdiySarhu//zEVn67y9q/szACcDUob1L2ac1R1FHB9
+XE4fTf/PV1KIRgQQEQIABgUCRjjnogAKCRBj0K2ukRID5FlVAJoDhc0dijUvPmOK
+ILkX6fG5g73DugCePsOrjW+YIc5+T9qeVMzHyfm2opuIRgQQEQIABgUCRjyTKgAK
+CRCYcO/z8S9gctnJAKCc7DZ7JzXgaB4ImiwB2dyGMFUC8QCgitOFKEw1y4+V1dNN
+3kZYL4P/M/uIRgQTEQIABgUCRjkauQAKCRDh4fKwmQ7UqvVYAJ9BjHLDyGmR56xK
+lKF3qVq1+jAmgwCfQR+0qbVWaSIaVS1DCg8yUr2txOeIRgQTEQIABgUCRjxQRwAK
+CRBMBCgYMRo95VO1AKCewEwAscfj9VfTxswF6BL6zNj8rACfW/3kG7zPI2dSjWJz
+GYPQYPAa0smIRgQTEQIABgUCRj2gkgAKCRAuuUaCiIF0AjxRAKCu9kiQfvVmSrVZ
+b9HK8Mazhut+hwCfY5guSOz96KH5dJ2585cm5wPyT5mIRgQQEQIABgUCRj3WeAAK
+CRD1wmAWTO7XX04yAJ4/ZvOfsexCgIQRuoREg1/D9bniKgCfTcKh9dLFkPjlD3yI
+w/NCc1L0/ruIRgQQEQIABgUCRj31BQAKCRCgctTQQ1jFhJmBAJ0TPZlIksq1EnAY
+tTTSb/tHpXxNUACfd/m3jaTHdJljRXGI7UBsVHnL0nWIRgQQEQIABgUCRj4FxQAK
+CRACpaYFC35s+iQnAJ0eGzB7NIQtXLEgyuphyW0nBppVrQCcDj6tm1MCKXA7f4zV
+1R0u30jrUeCISgQQEQIACgUCRjj3hwMFAzwACgkQc92MFgFTAjV92QCeI+02yLkS
+qmdJlMBVfVE9joT/pBAAnjJlywot38PS8FtodliCfNvqn6VIiEYEEBECAAYFAkZA
+tkwACgkQbQvHOkBYGDcfVwCfbS6bS20V1ElnuQBAofsmi0yjbzoAn3eztrDQIrh+
+/BkXIJo7IF0Ny+gViEYEEBECAAYFAkZMRFMACgkQHyEjw2vYcqBPqACg1jy6peeP
+fEuvYJEKfJBNG7FVwPwAn3y5/eBtZdRefj90FeIiS3dr3D3siEYEEBECAAYFAkZM
+fQEACgkQD0UKJmIQv8AfLQCfeHzJB6tJdA4bjPEcJKi0sMFceCwAnAovkjdUhF2a
+JrpK2cr4bZhm5RbhiEYEEBECAAYFAkZSb1kACgkQMsHW7w8UO8FdFACfSFzmzz3l
+ZmB+qclUq7q+YVgd3hYAnRyNi3iYLUVrk746XsvzWcv8UonRiEYEEBECAAYFAkZS
+b2AACgkQy66+OaRsTKE0LgCfYZfXtB9Er7iKXoDfhNuuDIdKmqQAniGNC3piLBCg
+gMPpJ5vQp2KsptvJiEYEEBECAAYFAkZe1aoACgkQmobXzNGq6mC8pQCfeV2ib+Ym
+o/KQ+jYsr1BxYVFCOmsAoO312vLgv8Q46hucGIq9aN2isEnEiEYEEBECAAYFAkal
+TC4ACgkQOb5RoQhMkRPl4wCfebfolpLZYdGk48JuUwd2shtkicwAoMGAdNOSoXyn
+I/6/b9jsxQl8qmwZiEYEEBECAAYFAkatzFcACgkQM81nM69exFIBlgCg0CUQ1h61
+lCLBjE9+/Kvskrh1QAgAn0gXeq1NKEuepDB6hQo7fVZrSpF8iQEcBBABAgAGBQJH
+wH2YAAoJEBllhVDDEQYR8ZEIALAYFxipk7FfpDbEnUrTI237QugKjpvrX9n7CdHx
+JLnwOBr1g2/e/RMgoJHH8yqP8iQPGMfZXCVLM6ME/EoUQAVT0M0I1QsBVxTIXyPq
+QIzCv6zibLYyEXDlQDNVB4hqdhozzxyjGruqbn75zfb8mlTMoj9lElNhVIdcUOVL
+2xHkBy6g/YpmuZb/pt4HXBOUyWkmFK8zBMxhXw5bOuOP2zSJk9rZt7wdKNj3iC+/
++936yXZzqWFuUOq0RX61RtW8e3SJfowGFBd728snsiD0IFLTXor62aBfBJ5yiGKF
+UBM8LQ27FcJasfo7a8SiBbJOO/OsyQ1lRvLS85kM+XZDXZaIRgQQEQIABgUCScqH
+2QAKCRDJx5JOUQR9Zlt8AKCAMAc8652qgKVPdH0XJbzoq6ykNwCgkTboPY7d+GFy
+EwNCHk+0PAmkPru0KFN0ZWZhbiBCb2Rld2lnIDxzdGVmYW4uYm9kZXdpZ0BlcG9z
+dC5kZT6IdwQwEQIANwUCQsVK6jAdIEkgbm8gbG9uZ2VyIGhhdmUgYWNjZXNzIHRv
+IHRoYXQgZW1haWwgYWRkcmVzcy4ACgkQohFa4V9ri3LW7wCdEc6hdCr094a8LG+c
+hTd+OzGxfFUAnR3FvtuG8sv367Knk0ybMnpOM/4hiEYEEBECAAYFAj53pBoACgkQ
+FT+gzXWmdpL1ewCeOSe7lOufhc3mfTXs7eSvqECt89oAn0VM+YgQHbfdVp32YE7H
+t6N6GPf0iJkEEwECAAYFAj513w8ACgkQPo+38viDQdkP7QPmPZXPi7m6wRiLofsT
+lHCbBrR+ehWoSSqCmHQjN1DGRtamGE6X8QbMIttD+NLp+uTx8j/E0sGUdPnWkky6
+fwt1f3AYeoAgCXNvPoewsC6mZn3FMdEo6vJc43FmhsUfumOtunvGNBnXdM8GSCJ+
+RBS/ASMjRrECF12/14xwgyyIVwQTEQIAFwUCPD7aNgULBwoDBAMVAwIDFgIBAheA
+AAoJEKIRWuFfa4tys/4AoND5QhEdyVIypBvCUHv5SCaAKcd/AKDFthtZTrjF+eEY
+lktPLRtI9zjeE4hGBBMRAgAGBQI+jc41AAoJEMppOXSBA6N+jAIAoIcAeCIKt2QB
+PnAthnUk4DhlmM7FAKCA0Iz9ZutXGb2l+p8s7hhF3+Y9L4hGBBMRAgAGBQI+ddrH
+AAoJEO7R6jkiYdBzi84AnRddvByuDodl5KaCSdpe6k9aYkLqAJoC/ud28X0M478K
+lmacVVjb+PqzBIg/AwUQPnWqLv1viMYh0KcbEQJ6DwCff918LRigFUyEvYj04C12
+so87JNUAn0RNFw+P1/SR9Mr/JQmOzJVhlwdriEYEEBECAAYFAkLFMoYACgkQm/Ij
+RS/ii8+wZwCfRvfW6NyBoAp7oS9ILRHNYh2GbhsAnRYGs1hSaGK4rGxm/fmqxj+D
+vqI2iQEcBBABAgAGBQJHwH2YAAoJEBllhVDDEQYRqFAH/28B/f92MsQX9ZRJG1v9
+EDGVx1U+pcE16a7iplCP4QuUR6uA2EUe9fptzZfX2iT2nr2XgCB3x2NHf0rzNpTA
+M3OtqKQhXdvS3EWzWqR8UaDf6dxKN57B4QONRIhuImf3m9DWFNwIr3oOtO25Q+tG
+7YcZen/zbwU5O23CEakNsysxGEHn/3BPjRyA1FE7NVLrAmxFu8LXBUD9y3HNNetM
+4WlucnObqw5cBFsZMtnGcVLs3suTAsxwrnBo7jq/DbZVvzUZtEkGdV7LpSWkivSr
+q0+h9Gzug8EcYTjrdR6LFA5xGan6R9zrSe4mxe7vja10fmGEdIOQIapgO/iOWDR8
+3MG5AQ0EOxIiVBAEAM1SlkvEK5MrMnW0ybtv9eMCG89gqIvd2gBnpcAsF0sX+dCa
+WHWNy5HL3dBak/G3BJ8+NzAksfL5Srm0LVKcfVjBiG+IsbUoSyeJQGuhSZXYcnIc
+/3Z8Ujcs+TfFurG8uHU1cWnNK5aMYwDrqxmp4Ru0zLYHw4tHBBKF0cgFaCsjAAMF
+A/49aSZuDaatppSaBOzCt7wIYCsGBxX5ZibrJqr0gLUbhXU9eaWzCawOWwCvpQN0
+lTjoYVkwiLZaYUkdqsSQgHAU3jjKlIuaIRXApEkTb8Jg7R/vNAdwXoZRLBCjZPGd
+5qGtnIezsZ2+lxFx+bRieUL8fUInemXwWl8e23PMisgm+IhOBBgRAgAGBQI7EiJU
+ABIJEKIRWuFfa4tyB2VHUEcAAQENMgCgnc22kj8TfjktU6u4SUUqud25ZZcAn0B2
+b0zPjKjGuiwdKSnkFbNcFS3g
+=UxMc
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub 1024D/C152431A 2005-07-18 [expires: 2010-07-17]
+uid Steve Loughran <stevel@apache.org>
+sig 3 C152431A 2005-07-18 Steve Loughran <stevel@apache.org>
+sig 2 FC243F3C 2005-07-20 Henk P. Penning <penning@cs.uu.nl>
+sig 3 302DA568 2005-07-21 Rodent of Unusual Size (DSA) <coar@Apache.Org>
+sig 3 2C312D2F 2005-07-21 Rodent of Unusual Size <coar@OpenSource.Org>
+sig 3 E04F9A89 2005-07-22 Roy T. Fielding <fielding@gbiv.com>
+sig 8103A37E 2005-07-20 Andre Malo <nd@apache.org>
+sig 5793498F 2005-07-21 Tim Ellison <tim@ellison.name>
+sig E4136392 2005-07-21 Noel J. Bergman <noel@apache.org>
+sig 1CD4861F 2005-07-25 Eran Chinthaka <chinthaka@apache.org>
+sig EA1BA38D 2005-07-25 Ajith Harshana Ranabahu (Made at Apachecon 2005) <ajith@apache.org>
+sig 3 21D0A71B 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) <dirkx@anywi.com>
+sig 3 3642CB4B 2005-07-20 Martin Kraemer <martin@apache.org>
+sig 3 2261D073 2005-07-20 Astrid Kessler (Kess) <kess@kess-net.de>
+sig 3 E2D774DF 2005-07-22 Sylvain Wallez <sylvain@apache.org>
+sig 3 015AFC8A 2005-07-22 Bertrand Delacretaz <bdelacretaz@apache.org>
+sig 3 E41EDC7E 2005-07-24 Carsten Ziegeler <cziegeler@apache.org>
+sig 3 F39B3750 2005-07-24 Colm MacCarthaigh <colm@stdlib.net>
+sig 3 9C85222B 2005-07-24 Henning Schmiedehausen <hps@intermeta.de>
+sig 3 9978AF86 2005-07-25 Christoph Probst <chris@netzpunkt.org>
+sig 3 2A623F72 2005-07-25 Christoph Probst <chris@netzpunkt.org>
+sig 3 F8EA2967 2005-07-26 Brian McCallister <brianm@apache.org>
+sig 3 A99F75DD 2005-07-21 Rodent of Unusual Size <coar@OpenSource.Org>
+sig 3 EC140B81 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) <dirkx@anywi.com>
+sig 3 EE65E321 2005-07-20 Martin Kraemer <martin@apache.org>
+sig 152924AF 2005-07-29 Sander Temme <sander@temme.net>
+sig 3 87315C31 2005-07-23 Raphaël Luta <raphael.luta@aptiwan.com>
+sub 2048g/59066D7B 2005-07-18 [expires: 2010-07-17]
+sig C152431A 2005-07-18 Steve Loughran <stevel@apache.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.2 (GNU/Linux)
+
+mQGiBELb2+oRBADhgEV29jhAMg4dFJN9fjeIjN7+J0Lj3rcLBWc5RTlM33DTOCFM
+BCIE9B/RXJuVhGgi7fUuB+WsHz7XMgZRn+5nqIKGecIxwEUtZCfwsaV6Id3abt30
+wccyYDTSV95gQie+bbwWF44ao7n/CaR1WUU/Nx5b26nY2EzOrQcgP1qYEwCgynnc
+NU1N3zd1cIYr5hQVqvdazKsEAMbYAm5WsjBlLBrolxs/smx4vxZYJaA3gUqTz9WY
+D08rDsotVIMoosYF0b4b3WxcePJ68N1pkF3U+zo8bIZJThT91nAfMh29ZAcSyRqg
+Mkd25OcrrjykeF7OavuFSwhvYoDdlwsvkuijHY3weXyhpjvzi+GzvZoONo3zSl4g
+aWncA/4vu6k7XZUZ6B9DbJLJ4Xqq8uhD7uT4417uCQdozIWgKE4ThM2WffhV2IgY
+W6IXg+o6AqY1qiMLSYYdeRsVkQ/GVss+sR++cbsO5ijDGfvlWPfGxIcA+P+alAwf
+KY9M45IB8E92DUDru6ImrDHMeOrlDNPRusxRyZ4SiSJYNcgBtLQiU3RldmUgTG91
+Z2hyYW4gPHN0ZXZlbEBhcGFjaGUub3JnPohhBBMRAgAhBQJC29vqBQkJZgGABgsJ
+CAcDAgMVAgMDFgIBAh4BAheAAAoJEG6UdZTBUkMaZugAnjJVyMa1FYEm/9811Whm
+K06kGzXbAJ4rgRTBOcuyVbmbOAeYCgqloOxky4hGBBIRAgAGBQJC3rlGAAoJEIuW
+KUP8JD88RewAn3LmpnmnLlYnlQW7+byITmKLO9gwAKCi0GGQz0QUq9tFG4YeF7Rp
+UCl8ZIhGBBMRAgAGBQJC32y8AAoJEFCOrsUwLaVof1cAoLX3ROO9ufH+QXYlBuy6
+HA5SgofAAJ9aON/jC3WmrxT9Lz/DlIBKVI9TZohGBBMRAgAGBQJC32zBAAoJEN26
+ZLosMS0vCycAnjFhGc63FoWHwzpfVoocrBm8yQTHAJ47Kle1Tr+fBnlkYsAg0xY6
+12VZ9YhGBBMRAgAGBQJC4PEqAAoJEFuWgBDgT5qJY6IAnj2jxdReXh3eBRr+easP
+bboH9Lu0AKCSoT0Gt+pM+G7XM8vQbZjsyjDhrohMBBARAgAMBQJC3t+3BYMJYv2z
+AAoJEMppOXSBA6N+4VAAnRfGDGvU4qDop0EdApmHCExFDHFDAJ9/3xZDnJjEeSGr
+l2JyOPJfbv/k0YhMBBARAgAMBQJC30/tBYMJYo19AAoJEEHqCaBXk0mPRKwAoI0M
+FDyhr2PON57N4614Po16a9ZNAJ0SGKJtMOIxgoDHSf6SYuFy+8sBLYhMBBARAgAM
+BQJC35MFBYMJYkplAAoJEAEFZrzkE2OSgcsAnjKv4POPmFUYhDGH+GCcxSyM9LPo
+AJ0TPnoLf74lUroWD5+rlhTPD9eMHYhMBBARAgAMBQJC5HvtBYMJXWF9AAoJEIzj
+drgc1IYfdCAAoIKybYLGd4yGE8NcrvnGaPSXx6NXAJ4zrIPA9tQu23tOHarZxSqg
+7AWGh4hMBBARAgAMBQJC5JCBBYMJXUzpAAoJEASRNELqG6ONWZsAniJvvMiDR61N
+rV5Y7xx/3/id/ekWAJ9MNUUQAXTES1dkywQVHVp6C8QFvohMBBMRAgAMBQJC3rR1
+BYMJYyj1AAoJEP1viMYh0Kcb26oAn2JuF355Lq6PIEvnhEr+SA3noxS8AJ9msBXz
+nHsORsz8mB4WZ4DMAYEH0YhMBBMRAgAMBQJC3rvoBYMJYyGCAAoJEDLJ5M42QstL
+Cu0An2vCOimm9iyRJekvlh7IcsrXVDksAJ9S1iVXBgyRuWBkbcuRk9OLs/TnwohM
+BBMRAgAMBQJC3twlBYMJYwFFAAoJEO7R6jkiYdBz3gkAn3b48pHpjPG5DCbfp0oT
+/WN9IqYlAJ47CLk2xg7e8N53WTmYfL+F/c/ZrohMBBMRAgAMBQJC4O0jBYMJYPBH
+AAoJEMm1puzi13Tf+KgAnjviBj4kvC9ABiWR70t4BU3y8kgJAJ9qmj71qWjrek/L
+Cb3+fAmlASx82IhMBBMRAgAMBQJC4O20BYMJYO+2AAoJEDf2j/UBWvyKJywAnjSC
+smaB18utPgHthVW0qDQ+DDmNAJ9a64uKqcDI7u1cDEbi3nL5ELztCohMBBMRAgAM
+BQJC41snBYMJXoJDAAoJEBMuSdTkHtx+SyUAn19MjVdnPdxKdiXjpMRWwOs5fhTL
+AJ9AGh+TvyOt877cfLVaywPK+GhN0ohMBBMRAgAMBQJC42UQBYMJXnhaAAoJEHXK
+oqPzmzdQe9gAoL7BugDd1NniX/ZNqs0aD7Y1uUfhAJ0b4p34ZYPWFg1CyUduwYlx
+MAOqo4hMBBMRAgAMBQJC4+3gBYMJXe+KAAoJEDKGTkGchSIrHl8An0ERlWCCDHYy
+0jlbsVcQ4FOS9qe6AJ4sLF02AltG01bK1kpvnKXxHFVYoIhMBBMRAgAMBQJC5RDw
+BYMJXMx6AAoJEFJ5L6+ZeK+GWEkAoIl+GM1cgJosSMsMG0NqXog9yqeKAJ9aJ0Xr
+j7JP5abRyjROroIUCUcc4ohMBBMRAgAMBQJC5RHdBYMJXMuNAAoJEGtzoQYqYj9y
+IawAn3TzgRnJPfl4gg2kwIlJtD/a4ql5AJ43+Bbg3EWh2RVaLB7QpA1pAsRFB4hM
+BBMRAgAMBQJC5pnVBYMJW0OVAAoJEGjrjHb46ilnWz8An1WpumoYARq3Le1VG0vu
+SkQcdg8SAJ488MHNQRq2fyQFk9uIstWriQfa7YicBBMBAgAGBQJC32y2AAoJEJrN
+PMCpn3Xdsl0D/j7J+/vobH/4+pmWCWv3okqBbbd9PH/NJTC3B7KU+p8bFdIIZWYh
+n9SPXRdLoUlbKnqYw6+x0Ktn/9oWqwTM2b1bOHoMEUy/hPDM1ZK2gGDU11BFbfC4
+zkXowbq2xCHLyaQXqj5Wju01PT/wj8bw5A0E2rzv2iUA2ilXJE1vQdx+iKIEEwEC
+AAwFAkLerQ0FgwljMF0ACgkQMaY9luwUC4H6jAP+L3lvntIdecj0QlnD4gTkdLn+
+nbOPT0G9MPSjA3ML9Bqeoh/uD2TeHS0dqb67DpIzhKV/zu6vrOhsXHXNiCjR4lxR
+YHBg0PoxLJkggpjdAduk5vcM2ZgRJZQojsQ9CunxnmA/YCRCEEUPFeKj/5p1aFGm
+uPsl2zwggHxbdOBY1maIogQTAQIADAUCQt7IywWDCWMUnwAKCRA34/Rf7mXjITNS
+A/9YB8srHD2WbpZy5P/cN6WjPshYgx0lVFOifFdXgD4AUzgJ3VmtH1NI0Rkgadcw
+8PdJYAynH/Hdz4PJ8wIEkmMFEe6TKB3BCjCGY8+Ti6R/VrlkizIGL0HzAUzNc+g2
+D1NI8725Idx+XNSOSBcOBZ3mwPVo1k67X1rF8BoYAeo8TohMBBARAgAMBQJC6mYn
+BYMJV3dDAAoJELK+vEAVKSSv8BwAniQzr7l/ihVvAhvNUnpJzFWfr6tfAJ93Mama
+D+Fz4kgEVjnO5j8MrM6JtIhMBBMRAgAMBQJC4mNBBYMJX3opAAoJEG2YjReHMVwx
+Pr4AmQGWlApW3C1VbkuRgVs8pj6/ejXqAKC1z3D5mMpj83yyejnBjxDjXTLsUbkC
+DQRC29vxEAgA05PNdXcVOSTsYuizTCbdBU9i3qUBkAyqPmDE6hkWI+7fnr8KAUUo
+UghWwhxqBngpv48o3mE+bC+l/cTH+DuHIOsszpSK5ydufyitXi7piYk4RS+UNbyl
+b4BU5qGodwWwXC9wKBIjXL5rK2KjKh4Ovh0WogtZ1fwc5NzQkjcfbner9WsAmjtd
+nmVV2vZhJdDlxf3BBM9ai2R2IRvfhF61QFZcr2ehqAdsiDix8p0ugpC/oQS8h8pg
+GQebz7aNeSjh/Vb3dsdo8CaLvHp1nM5aVCDRqoCfoeKUbRfwwwKxtc1cyYzOHD1f
+KG9BuvtL4y4JQ/gDCsQVKdAAoiktu8Ks9wADBQf/fGkVYIh7w0+8xSIvez1DKirX
+rl1J3XNvOYIa1qlBk65hllXnFXeXqoOLQpvygcwNRfil3AGcpwzwlNloem3ozjnt
+IFvYJYzB6q4SMl1/a5uLrcc2frq8tbG0RhU+ZEhWR6sIEOBQhkKZ9LZbJ1tK9buJ
+M0meaIt5gVLAVbI5vf+2Lvmlv0+E/a4Zn2exl1RcBYATNZT1gC55m0z5PMzG6Bc4
+tOAhPEo3WpfNjIrFeXcB0ksk4mfDIWKlA0mc8A+faKSSMdiDpeU4H4uZy5pE/hVv
+2VyE3Ej5PoA3DajRzgQ69YlojTYnfnPyJErCBZhtZXTtRY7aDm9/xBT7FZ06RIhM
+BBgRAgAMBQJC29vxBQkJZgGAAAoJEG6UdZTBUkMakjEAoINKV6yLAdbBhXhvMsqK
+0N6XOghJAJ4mSgdwgv+sIOaPKQqCm+PL2M0lPw==
+=4TlI
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub 1024D/AA0077B0 2006-06-13
+uid Kev Jackson (apache key) <kevj@apache.org>
+sig 3 AA0077B0 2006-06-13 Kev Jackson (apache key) <kevj@apache.org>
+sub 2048g/8A6DD738 2006-06-13
+sig AA0077B0 2006-06-13 Kev Jackson (apache key) <kevj@apache.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.1 (Darwin)
+
+mQGiBESOfuoRBADiCLjvY8EG8cDrfNvPaVJr1/8d8GDoLjBCeJWl50M7j1IQDB+r
+rzBPXOzhoqiNRbZMkpjv8ofa5hVOQitVS4B69FA07RbuiQNTKg142h8ogtJeAI1g
+eXuTZtmGE47TOpj7FMG8bHOmoJdQMkzUsdOhEAyqRu4noknuuIKgsE1kYwCgnhaH
+9KBlpKaRG7Bb2BH6da+wmKUEAIaBeZ1aSQodUzDqnGjCd4hZbpzjyWg7O5BylNhK
+ogMY95BvwFRD8WFdSvhvH9VKBtSuNqg/6gIkqAljRRESVxL4QrzlYSqF513kK1ds
+lUTmqU9Dvaf7dkH+MYnkPVTP5tMZVCT7HEt4F6HcqlaZKlz5jsu3R53KBx6XZATc
+SEGbA/wOournJ64We8sXTJGHFupvSLBy3nh68mPLaplzTnH2al1DLBnoF2giC32v
+ZGG+e12kWE+fyyQ3pdAIRHgVjZ/ckPmcmxnVcYrhzbgV99fo2+JRh2SVrLrmvw+G
+CKiUtNHn0HS1klBKSj+3ML1AQQlbyfrcVSf0Fefug51BqoqU+rQqS2V2IEphY2tz
+b24gKGFwYWNoZSBrZXkpIDxrZXZqQGFwYWNoZS5vcmc+iF4EExECAB4FAkSOfuoC
+GwMGCwkIBwMCAxUCAwMWAgECHgECF4AACgkQoL/5PaoAd7BnTACff9f8Y2RFB7O7
+Wjncyb1XbEwJB/gAninrR0isW9jGx49GmSnQCjtO9k34uQINBESOfzMQCACP+GP2
+x2nE2JxjUUjj16ftOxUivbL8L9ksplx41n7yeRvu+RzOXcjlonuld0LYxprNsHGv
+mbAoZj93QozHQIMfC2kfnia+hxCcBPMbev9RPCqgogpb90BtV0f9HGyWXs2QTgWG
+R2hyjq/RpwtA3obSXw3pb1CnXW4stV65WAdd72KDc66wRR1gmjxKQx6b1dGcC+E4
+HyOgu2CDtr1ULPeI5U4BA4y8FLgDfYwkxp6vj5ViegGP7GlMa3bSgNRGsYX7VwgZ
+pmI8WY4B5k3/Pyv2Toe6/5zTmKH8WlyZd00ede/tbFTqQLg+EylAcWJ8c3asood+
+SjCwTuD8l8a0wpO3AAMHB/9GXkbBUE8cbMTaS4yj7UL5iWRVhSPo9IzMSrzaXmZN
+8ykX96ud35BCEfmYgty3USMk90Rs/PbwB4Mh3h1ZTXqRWcfOXzJ8kMabm2RANyf2
+H2DvGKoFPtpX/9I13vo9qRLRHVRENNg+3JCa1ii8cq7h8bWvTT0VxX/rOG0cl8nO
+XkHTUARR19cGPf6XkHEcl+u1pAxIJGqY/gVowjyFGZs+RXFl/q/Vrgu+lvvxmryd
+yEdeGdsBvQ9M0KKr98w1RiJnDUkSqI711xwlVk14Uu6Xke0oB3bbpe4UxD52avAC
+yEzYY7vbpe6XS2+dOcZxWE3eur6SfsucAkj4Ib72mchhiEkEGBECAAkFAkSOfzMC
+GwwACgkQoL/5PaoAd7BQAwCeJFb9yZvOWfdf73A7t2MvPXn1y6kAnRquMmA5eVdh
+HbAUXWyYuT2OHOSD
+=F2q3
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub 1024D/DE8884A0 2007-04-27 Xavier Hanin <xavier.hanin@gmail.com>
+sig 3 DE8884A0 2007-04-27 Xavier Hanin <xavier.hanin@gmail.com>
+sig 5F298824 2007-05-06 Simon Pepping <spepping@leverkruid.eu>
+sig A99F75DD 2007-05-03 Rodent of Unusual Size <coar@OpenSource.Org>
+sig E222DE4F 2007-05-02 Mathias Herberts <Mathias.Herberts@iroise.net>
+sig 911203E4 2007-05-02 [User id not found]
+sig 302DA568 2007-05-03 Rodent of Unusual Size (DSA) <coar@Apache.Org>
+sig 2C312D2F 2007-05-03 Rodent of Unusual Size <coar@OpenSource.Org>
+sig F12F6072 2007-05-05 Fred Vos <fred.vos@mokolo.org>
+sig 3 311A3DE5 2007-05-05 Ruediger Pluem <rpluem@apache.org>
+sig 3 88817402 2007-05-06 Thomas Vandahl <thomas@vandahl.org>
+sig 01530235 2007-05-02 Luc Maisonobe (SpaceRoots) <luc@spaceroots.org>
+sig 5F6B8B72 2007-05-12 Stefan Bodewig <bodewig@apache.org>
+sig 9C85222B 2007-05-14 Henning Schmiedehausen <hps@intermeta.de>
+sig 4358C584 2007-05-06 Vincent Hennebert <vhennebert@apache.org>
+sig 0B7E6CFA 2007-05-06 Sami Siren <siren@apache.org>
+sig 4CEED75F 2007-05-07 Nick Burch <nick@gagravarr.org>
+sig 40581837 2007-05-08 Nick Kew <nick@webthing.com>
+sig 6BD872A0 2007-05-17 Michael Busch (Lucene Committer) <buschmi@apache.org>
+sig 6210BFC0 2007-05-17 Jean-Frederic Clere <jfclere@apache.org>
+sig 3 990ED4AA 2007-05-06 Knut Anders Hatlen <kahatlen@apache.org>
+sig 0F143BC1 2007-05-22 Matt Hogstrom <matt@hogstrom.org>
+sig A46C4CA1 2007-05-22 Matt Hogstrom <hogstrom@apache.org>
+sig 152924AF 2007-05-23 Sander Temme <sander@temme.net>
+sub 1024g/A5EB8D3D 2007-04-27
+sig DE8884A0 2007-04-27 Xavier Hanin <xavier.hanin@gmail.com>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.2.3 (MingW32)
+
+mQGiBEYxng4RBACQpDi0ebPGdHVAdV14aK47MzFkFJEbCisBgcZ2OT/pyPjVTN+9
+Q3NtIusVuY/yEeO4+tb+YTbBiwNsx5p91Rder0prBBVPr9TGN8bV81hnSHfVCR+O
+oqrLj2Onv1qsMslOuZR2m1d/i6cFIKV0CV9EWOcEJZ6UEP9CXP29ZzjdRwCg5NgW
+YfergzvpVtON0E5UvjFnGmUD/AoWhJ0CRxw8xj/EAGS4xXO83Ydf6ucu2PwqUOSZ
+N2mMWyBpr12sQH+iMjWJW25GNobwJBKzfvrojujvlU4uyNIyD40sPeH0UrTwLbL/
+Kek9zp9NxZ9wawjzZvdp8sdrOZ54o59/7flAjL3iqJRtLQSeyQsfZaOSNRxsAUiI
+obn3A/9SEtJdF6HM6C7V57WdKIHv6uVocdZNN3zig2T9uP2Uq1VMIEYtllRNX/4V
+9Vq+2KdV72DnlMuZIA++o1n57d/LgUmbDd72AAZGNJaFq39CV9YElXziO7BVOjAg
+MH9kNxCywcjcw8EFa3NCFcOKMESBn5sHu1nw/Iu1Z9TtagnJwrQlWGF2aWVyIEhh
+bmluIDx4YXZpZXIuaGFuaW5AZ21haWwuY29tPoheBBMRAgAeBQJGMZ4OAhsDBgsJ
+CAcDAgMVAgMDFgIBAh4BAheAAAoJEAP2jL3eiISgw0gAoKcAgjjfQWlqnQNRJQ+8
+A7H5ioIZAJ9qApxb1iH8ulGHjiBOjiSgQq0SNohGBBARAgAGBQJGPhhDAAoJED4q
+b8JfKYgkB8AAn28euVJz8OQZvoSw89voHvcVzewGAJ4lm2R0FCSIRfmHCl+5aSYw
+TazeNYicBBABAgAGBQJGOgiqAAoJEJrNPMCpn3Xd8Z8D/1Z/ml/qcIf1yDiYQTu8
+O+/so0ZlfTYlEF6XrW6WjZDIhNVAAT+Rk1E3q+FvZfMq1BV1mubsCXRtcwt1Br3z
+MWIuJ7lBZl+T1Nu2sxH9H7FAvY7Bk8p5WecIaVdNyFxC98vGYAFs0aRRGSeCFbEu
+oW5XXxUAkkWpIT/aG2y3t4G3iEYEEBECAAYFAkY45CgACgkQFUWz/uIi3k/mCwCf
+WUNeKG4a3hgDhMOyZ1FGFpDnle0AnR1yXWaEazJD5wyTtnnSE/Ajk4L3iEYEEBEC
+AAYFAkY46MoACgkQY9CtrpESA+SOtgCeMIh7BKJeSezB+h1JQmUyg6EuNWMAn3pN
+aMYYEj1LL8R/2ZxBNbU9njNXiEYEEBECAAYFAkY6CKoACgkQUI6uxTAtpWhrvwCf
+c2uhmeog5475d9hTQg94MqEo8cEAoJOp95BdZ7xd9ayJwL4LmBVYaIMAiEYEEBEC
+AAYFAkY6CKoACgkQ3bpkuiwxLS9rvwCffwzrqfIJghWUoXhJsa/m/PSLiogAoM3j
+x2xt5sG1sQQbzM+U4VHhRmWAiEYEEBECAAYFAkY8xoUACgkQmHDv8/EvYHKBZgCe
+PkYoQsESFkBkVyiSVueICUvg4G0An3rqc8/Beip9a2YF+7UYsKKJ1e5OiEYEExEC
+AAYFAkY8UYgACgkQTAQoGDEaPeVNwQCdE4UB1RW+mjtYEbgxkZSjdaV3IKgAn1Sy
+hoOrn3S20OhaZht5Y0EksVVEiEYEExECAAYFAkY9o64ACgkQLrlGgoiBdAKz3ACf
+RkJXrvpQVQlk9//+O0W4BvggGxMAoPyvjRXm+Ie+nPAII74kL7croRWsiEYEEBEC
+AAYFAkY4+5AACgkQc92MFgFTAjXIMgCfXfRlxPUwlzLWotr0BGQVK39JXyEAnRht
+cgH/yscqbkvi2JvaVWkV/T9JiEYEEBECAAYFAkZGEjgACgkQohFa4V9ri3KpJwCg
+4v63DT9Ll4+mqnAC1/HWIgSfQ8sAoN+EQ15zUuI0nuSyG6UCw/UUZX82iHEEEBEC
+ADEFAkZIxWEqHEhlbm5pbmcgU2NobWllZGVoYXVzZW4gPGhwc0BpbnRlcm1ldGEu
+ZGU+AAoJEDKGTkGchSIrkUgAnjI6jBaidqIjKhusVm6ihmG6LEIdAJwJnc6YRNyY
+88MWtd0XRghD6ST174hGBBARAgAGBQJGPfdgAAoJEKBy1NBDWMWEYEYAn0RS69vJ
+1EVod7WxAecb0F4tyJcBAJsEnTiTRMoNmJmRe6w3WqhqdLQUeYhGBBARAgAGBQJG
+PhN/AAoJEAKlpgULfmz6aJIAmwcQI5XDWrLDzSFRJFuW3F1zl7P0AJ9GQYDvu4mI
+c9ZCcaLdukbY2e6FGIhGBBARAgAGBQJGPyoEAAoJEPXCYBZM7tdfbQ8AoJVSPa3g
+Cmc5ghLz1X12r/QBHPPKAJsH6g/0hcAou2ZUfVhOE7VJhpeGkohGBBARAgAGBQJG
+QLz1AAoJEG0LxzpAWBg3cXAAoI2rKauHeIDRwh05S8iNGKTtEaPMAKCMHrqbLsbl
+0P7XxTpZ4EKSvOkQ6IhGBBARAgAGBQJGTEaDAAoJEB8hI8Nr2HKgtRoAnReqmHxs
+MbATTtCEF+WbTqREe1+JAJ9pM5VmM/Apfh1hPM8i55Q96BP1h4hGBBARAgAGBQJG
+TIFwAAoJEA9FCiZiEL/A4j0AnAsAjAu6nDTd73TM3S80JtbuatX8AJ0WBRJk5ZZI
+TmnMyz2yp6k57tyeRohGBBMRAgAGBQJGPbLbAAoJEOHh8rCZDtSqCOQAn0SVan9j
+r55MJrDGk8D3M5pQvTd8AJ9uU45i0OQUP+zY5LSacNtOzSy6MIhGBBARAgAGBQJG
+Una1AAoJEDLB1u8PFDvBK+EAoMjrujpsE1XQs3YxDwz5HHSWv9E7AKCJLU0W2MbF
+OIgs9Smxz2LbuYH7lIhGBBARAgAGBQJGUnbGAAoJEMuuvjmkbEyh9uMAoJ2fBgZo
+2kl+jOzhQnXHHDHzyLyAAKCR8Z6tloKXkhPRIV/N/OjwIW0i54ipBBARAgBpBQJG
+U8qkIBxTYW5kZXIgVGVtbWUgPHNhbmRlckB0ZW1tZS5uZXQ+IhxTYW5kZXIgVGVt
+bWUgPHNjdGVtbWVAYXBhY2hlLm9yZz4eHFNhbmRlciBUZW1tZSA8c2FuZGVyQG1h
+Yy5jb20+AAoJELK+vEAVKSSveJAAniq8wB4b/DdGTK9Ygmu5Y76tqsw/AJsHGkn3
+5JyiHbXCvVujWmPtY1/OZbkBDQRGMZ4PEAQA+T0YRtd2aeXU+AOJnrhChy0dptVt
+CE6PW9LrwZGqeV4THNWhdYuWRWlyzgU4HSfuk1Svu3WKMbnwp+Fv8fU6MmidOvEJ
+p9IV1l4DidIXyhAacwpCN11hXvj5cHdF4KhJr/NG9oedin6nQoQFRQ7EfkUjAXOf
+MCZnSps9XBJdy3cAAwUEAIGrITayVmWfUgjPvQg8L+4R2i31XQ70HIELQtYDs0Ln
+iWrwZuO+aLI6Jw1RbZii6DM2QsVdZj+v36S2KJTvXeJVyb51d0uXYFxre1uCZrb2
+I1Lle8v3GVQvlrTpmZIPhOTotskKFWUCh2jqgLaEvJPpRWgIRXPF4g12nBXcLLXE
+iEkEGBECAAkFAkYxng8CGwwACgkQA/aMvd6IhKDVtQCeKdUGQS0lD0nAJsGiSbKg
+gLwEM0sAn0dUIIsbxE0fTHQVIQK4bII82UhZ
+=jwNf
+-----END PGP PUBLIC KEY BLOCK-----
+pub 1024D/B80602AE 2008-10-22
+uid Maarten Coene (CODE SIGNING KEY) <maartenc@apache.org>
+sig 3 B80602AE 2008-10-22 Maarten Coene (CODE SIGNING KEY) <maartenc@apache.org>
+sig 5F6B8B72 2009-02-02 Stefan Bodewig <bodewig@apache.org>
+sub 2048g/9C7184FE 2008-10-22
+sig B80602AE 2008-10-22 Maarten Coene (CODE SIGNING KEY) <maartenc@apache.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.9 (Cygwin)
+
+mQGiBEj/pNYRBADN+YqWzDBLrOgiUCul5TWVLgUReY2VMaWh3Z732AMPJb1dlbtW
+B8sRqyvtQxKIPIItl6oaom5yzuqc8leXQCJBVRnnBkv8cMomhOD/AuzaA82egttI
+C+CHt/akaUPhgrzhry7TZ7lVtJZ04FJ9WaE+LKAZcnlhCWOSF330pRB8bwCg8E5k
+4TF9z2cmwfRmMwJxruRpN1cEAJ0yo22TkjSksXFmQf0eKVEPaHmrsEjNzIECcz8m
+JrggYDfXIgC2s758D7uhUTlJM7u1L2KTZmiZgiFp6WOw6DnPlBf4PRD03038fAQn
+rGtfC/B7DcgMLS4tCPlGEyeh9H8RphaVSXVCN5IgRV4x0vIhyx7kVz1ZWbAlLEQx
+KHp8BAC3/K9yVkRDa6m+HAZvRP60zxWAwIdiX1R/9CCRtI4uSaLz1Iiw0jni1YkE
+tFe+z5PNa89Dy1bgFWJKxtG1jQVfHIt6nEz2C4z3Xk02+PxmJH/Dj84EOiLfxzvp
+Hm2hA57GrNjJuvG7C7GVFy+bQh8DCkzJfGAaplSgzqyVmP/l5bQ2TWFhcnRlbiBD
+b2VuZSAoQ09ERSBTSUdOSU5HIEtFWSkgPG1hYXJ0ZW5jQGFwYWNoZS5vcmc+iGAE
+ExECACAFAkj/pNYCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRBb4LqMuAYC
+rpMmAKCNSdXDiaOex6L8UmKiGbkEah3llgCgotsI/YjRzQNSvmGfqrgkch6f0tqI
+RgQQEQIABgUCSYbTIwAKCRCiEVrhX2uLckjKAJ9f0JEsAJIJDn80SMIHaEXhJj9N
+tgCeL29JGbUoYjTq8LpoMrl3ZhDaqEy5Ag0ESP+k1hAIALRxgmE+fbedOgRhLl4w
+pZyt3A/EXiZBY/9UDRAWpviCp4S3cQ5cjhv3glj8IAHw2ntuEJ2ksjG5r/swQ38z
+quTdDY4YT/Qd5NDlSX+KOGL69mda6kFFiNeJerDcM0FPjiV3MWcNp4IwJTs45EX2
+ep17a0oUG2AhDjL8c/32elHzXtkzoMPQzBWqHdTO4gkp/2iLw/bTpfEJLtWKsWJS
+lgnLobisAnWjFBo/NgtjxaxGjwIjTn4OZNQaBi3P46PP9FEj4Hp791i1YvkBYrIg
+BaQY96Fexd/7FKyvBefUmlxZPyY7I/OI11KWifJoSj1qPxZb+90UQN2r9zySDdpQ
+h0MAAwYH/jkSE2KTx5R/vU+bnz11Kx3NRq6kxCQBGUclPGgUxk7iSWfHggQ/0U3m
+1TI8GL687dwb8AO+f2b4nov4g4umdoddu9gPlHvpBcQ1BGx8JqcWJJ+F7lWUeVw+
+bqp5Qcttm9ldw1HEbUF0l81VFpLNDV6p5z3zrXGE84fk2BEMzD23IhMwNnWDsDVu
+2S46h6BuK8sdTzgP5GTXw/7c7xG2zgfMHVUBWtuz5P6D8vl9gHu6unuLIcKspOgI
+Vl2ygZ2VsxGUscyR9soLrem7hZaaQJfJqH757X3K8SuGZY36mH69Ziwzs1gQlof6
+bgumh74P8Xu+StvFwdZn1+aFsqcoDwuISQQYEQIACQUCSP+k1gIbDAAKCRBb4LqM
+uAYCrpuxAJ9NYy3kPGHYAZuFSeygBt3aV1acGACeP9bIj81YOQn45Dvgmb7zqYBU
+g7o=
+=jpcP
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub 1024D/3B7C75B1 2007-05-29
+uid Gilles Scokart (at apache) <gscokart@apache.org>
+sig 3 3B7C75B1 2007-05-29 Gilles Scokart (at apache) <gscokart@apache.org>
+sig 51047D66 2009-03-25 Tony Stevenson <pctony@apache.org>
+sig 01530235 2009-03-26 Luc Maisonobe (general purpose) <Luc.Maisonobe@free.fr>
+sig 6A017B17 2009-03-29 H.-Dirk Schmitt <dirk@computer42.org>
+sig 5F6B8B72 2009-03-30 Stefan Bodewig <bodewig@apache.org>
+sig B1313DE2 2009-03-30 Robert Burrell Donkin (CODE SIGNING KEY) <rdonkin@apache.org>
+sig 40581837 2009-03-31 Nick Kew <nicholas.kew@sun.com>
+sub 2048g/82AE20EE 2007-05-29
+sig 3B7C75B1 2007-05-29 Gilles Scokart (at apache) <gscokart@apache.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.9 (Cygwin)
+
+mQGiBEZcIBkRBAD5fm+1xVyIldiodrRlBF+LIcyKhX/tXyn7BL82cf/8UwxHdcqm
+9/cihYQH1ywj3fiVEKdnoHWTtZyvNtA2c2JUUJfqlD81SZKi+pnRzDpnBLmliaYN
+CZNo4jlk5/Ft3fWjHe3pYISDrJkMsbfdN59CHtgor88UVaTRANIrc044RwCgv2p4
+kZjazZhUnALYfUGBKTiMnhsEALk8pYW3uVtk7Qlor7KNx5YfSmaIxi/LQnk9i8LQ
+r+N0ZA/vMPMxwA7l1hsuQA/LgElTzS5E9caqVP+n+RL0wMNDfova5tar8LgGa8Wl
+GC1A4aEF3DUTLuKwdW20ZV3ai7ROaoDwGcMzxQxJwffMVlsto0DgX+cw17g6ld2u
+/jpABADf6DfQn170yeCwA7v/iQcSau3vDquMIDGCfE7USUEWop91pi9hs7lEkoDG
+V/uDC+XpT2jFD6z4p2bhdD6CL3xXk1PbR/4W9Z/hzQQs7IeKtxb2ZPUkmTGkHa1b
+1AXBjk0COaYbFMDHC/1M7tSJVitOjJgn6SzvvpebPzZCPPJhu7QwR2lsbGVzIFNj
+b2thcnQgKGF0IGFwYWNoZSkgPGdzY29rYXJ0QGFwYWNoZS5vcmc+iGAEExECACAF
+AkZcIBkCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRCusBoVO3x1sSe3AJ42
+g9VSRlSotQF09SOUOSy+OT09HgCgjdxpDK9DePZJQqNvFiFlVHosOFiIRgQQEQIA
+BgUCScqJzQAKCRDJx5JOUQR9ZnA3AJ95e/9F+PbyG644fqHRbNRaoPK7IwCgklmM
+i91C3XHtkJIFlkIcrSDYmauIRgQQEQIABgUCScvpOwAKCRBz3YwWAVMCNefhAKCe
+NXk2pgPR+IQ5DTynLD9I3zpt5wCfSslyVN1eFyOB98cAvcQ6ZSvQ41CIRgQQEQIA
+BgUCSc/ynAAKCRAkwaN4agF7F//ZAKDlEUat3dBPe35MUAd+nLumAx0IwQCg4wsJ
+5gf8UUWQGRn9kQqoCpENhXuIRgQQEQIABgUCSdDLeQAKCRCiEVrhX2uLcs3xAJ9f
+MNVQ2cvirIAWAWBOWNVxRuBVgQCgmxIdCpUQxXCB4wJkNjjTqY5X+KGIRgQQEQIA
+BgUCSdDjEgAKCRDVM051sTE94urLAKCc1IeUJf+Mjssykz1bz9qCoN9KCQCfZ5+q
+4QJxgiOzLSjvNBSBSKrSdUmIRgQQEQIABgUCSdJ1/wAKCRBtC8c6QFgYNxLjAJsH
+jscYS54FPhD6UQrm40U4hRKD8wCeODdDmprYA+G6BBF3CM7uXK4H2Mi5Ag0ERlwg
+HxAIAJXnRz/mS9LlEoHKCvvoY58OAPIjaSqfdNLWGBSjXOsPKSRIb44PmakBGp8r
+xCZdgwIRv/qHzkBVjiYD0k4XkftCwrz2yGkzcIgXl6kW3kCkwkrNckFoDmTCGshP
+BuTKJctwIDWQW38ORfObOs5dRCzmvfI6S75JYUAi/EEHDtXuo3UjLPEWVEA9xoOn
+kUo4MehCRgOh40J3GDyeOaC9/2aXOBLOdNJpciyX/035/rxxIE+FgwYVssfnmph7
+rguczh1VXWtP9URTUHJYis71wCjil1AYxHwTHg791pwde3JifieyNYLCUK4jS0XH
+RybeIzrq68pHQGVakrV8alIf86MAAwUH/1PtIDR2YthX7Mwo08H0DLaDpU5sioAg
+rU6NytREJR6VHDgRlwFn4FT1skx0yZw4TjoOoHfs5u59pnalRjPitpWPaNRK2Se7
+HsWv83nCZVqXxgi0Zr5xsNdeohOMcKlFhJfu7Q4UgCX9RjMDFVBWdPeeU2vNDdMd
+B5XgmQIls7bq6skeX2nZCa+R1M2QK5ckd+qOYGj1Qu2eJbfq0Tgo21s3tgX5Y1nD
+wD3VnBV8oqfUNanAnp/km4XlWwI8dk6f5GliWJ7/aKFOkg5IoAjJ3CPfLBrPC+ns
+TEuMtaOLk0Bb1rIisXn7Pz4b3EpzetD/lJdVahLy5Ko2lE+OQW3sFJCISQQYEQIA
+CQUCRlwgHwIbDAAKCRCusBoVO3x1sd/FAJ9xjqbygtW21vUNcztbWJroKaL/DACe
+PEZ4/iF5mYiEb2kEZmS6aRhVxuA=
+=w8bP
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub 1024D/7BF8BE8E 2008-06-18
+uid Nicolas Lalevée <nicolas.lalevee@hibnet.org>
+sig 3 7BF8BE8E 2010-01-21 Nicolas Lalevée <nicolas.lalevee@hibnet.org>
+sig 3 7BF8BE8E 2008-06-18 Nicolas Lalevée <nicolas.lalevee@hibnet.org>
+sub 2048g/64443553 2008-06-18
+sig 7BF8BE8E 2008-06-18 Nicolas Lalevée <nicolas.lalevee@hibnet.org>
+
+pub 4096R/971731FB 2010-01-29
+uid Nicolas Lalevée <nicolas.lalevee@hibnet.org>
+sig 3 971731FB 2010-01-29 Nicolas Lalevée <nicolas.lalevee@hibnet.org>
+sig 7BF8BE8E 2010-01-29 Nicolas Lalevée <nicolas.lalevee@hibnet.org>
+sig 0642FA40 2010-01-31 Lionel Porcheron <lionel@alveonet.org>
+sub 4096R/9A54153C 2010-01-29
+sig 971731FB 2010-01-29 Nicolas Lalevée <nicolas.lalevee@hibnet.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.10 (Darwin)
+
+mQGiBEhY+uIRBACUmSXD8kBukXrvlRHNVCvo1mMNyaGhHbkf2oF1Sr8o/g10wRLF
+1zh2Ohgux/Z0gbjumhT4WG/kADsk0r8vSeuiquwyhHIg9ZXBgs4/JFtSbVrahxkG
+gWIhr1cLKYSAeFe20w/Bn3zBUtfKVN3VaDyDFJkgOsu/0mXPU+3JbcV/CwCg9M14
+Pk3MtDg2xgfoVlm3CiT1byED+wS8Rmm9+spz8oMA8vKxKtIb5vvlnnIdaSs69XtT
+1Iv2aDpCIlYh820G2mghll2f9rfTn7aiiL8ohyQ55N5tSwVdMrUKbsW2o8IreXuJ
+XvGxuSAxpWgKluuH42uHXitO06Ir55mkhHG6M06cMn3hEXU4gJRegCUQW41vrCgn
+zorKA/0ZOdFGhN0NCACB3o/bjQFINs5MpDpkPZOYkb0PSgtqto75jZQEMqk4vvlp
+Z0430MSzA66WSU9rPv9b2Ck7+/bqxFx972tSygUg3w2mSvqab2z//HVB6XQm+R1b
+3XGaEMM19nG3K8XJMKolhcrvwbT8OS1ZajEJlvEt0jpfk7rYpLQtTmljb2xhcyBM
+YWxldsOpZSA8bmljb2xhcy5sYWxldmVlQGhpYm5ldC5vcmc+iGEEExECACECGwMC
+HgECF4AFAktYr7EFCwkIBwMFFQoJCAsFFgIDAQAACgkQSDwjxnv4vo7YZQCeNnaq
+c5+4/3NSQjyPNnRBse17FS8AoL8BQSWRvCzlti3VBA7UOamcNM+eiGAEExECACAF
+AkhY+uICGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAKCRBIPCPGe/i+jhSdAJ4y
+bjviXLP22CAsOZh7hn3rkL49MQCfUnJIv8ErY+I1EH+sWMNnj91aY5K5AgwESFj6
+5hAIAKO3XJPcBZBLwpYtOcRZqyUSOQ9uHe5iRtqEFP3fqibVvIEMq7jeMa3q+Y+0
+i6wSbDEnKS3VfTv5JXyIXyK5k9bN8+BclzXGuyzFrz05b3XmkaNZuHHtyfPzj1bt
+FO0K1Bh8utejday12ZK8gfEaTZaG14027BdYtoR2YzrilXXzxc740nDOlgAU9pwk
+DqWR8gMOUf4l0mLGwG0F66CZJsIY8x580afbCUOTaXXyp9wHMK4ko9zm6+dFT/4c
+D41eovaqP+GSxyBow6A9pSD8nFI/YrcrfxvPb2DMLhkBYG5VzYYOisRY/nFot04i
+lc0v2HNV7RWrylXzlVRIo9SqC2sAAwUH+Jr/O+GDP3kOmmE7iCCg16KfP67wG/oN
+1+pYtSDTSgn4f/Ec+HO6vbkc5A+nfetMdgGnbVnFIdZl9BcNb3xqCQMkGcmEFvmJ
+YilxGfqngnu+8kPXJMEfHHTcEXGUme0YaPrJeQHiu2C75n9uuvUMtPO+kCfxfEY1
+TMPnHpDKwTGWuOLdI0hzoLSOPBuKpha7Im4SqQq5vHQ0xJmGSwYR5+l2Weob3nU0
+miyCAT4+3FMTQrQ5N6nX8tb8wqRT85sgwMXyXszz9TQ0g+Q5RLmE4jHP3sPEUhbt
+k5LBxPZyxwwzFHgDHmleHP1lzKCHi2K4ed3j/IqOVrhpMSSW8kI9/IhJBBgRAgAJ
+BQJIWPrmAhsMAAoJEEg8I8Z7+L6ODs4AnRqXRAlzNAepkDiRwtJS++ecE0sPAKDA
+OVV69v0Yz7/QqRrLRB66xTj2kZkCDQRLYwO/ARAApAAIbR+GIZgckHwL4vlPeMM4
+eG9gAina2Lkk1h8YuwkeryEKXwE6ggQOjqvv+MiqV7EhFL2EIDDL68YG8Hmih6Ml
+gzlrDwiQILvx9KGKAVRQGiknDz3thgK7rZ0FINdkB0OP04NB7vGX3i+dZfSknN5m
+WWucQDxxtN/b6QsLOnsepxdYPU6fcMLvrgXBMwhbFkWjcsv4rkwWRWcx8KUTADOJ
+vbndMnbMp24DMv5VNYISri+VJ4PKEZyFBeG4NT4KhL7/tJ104D9zERWu8mWA2bNP
+hl1hy3woX4ueBmAUdvKuzFgAEnV98ZTzIGdEPrWVz/T6RccRjwpfxKB7kNVzaPC9
+lNoOPRqK5ir3wVhPYAdE+cNJ0IZ0X37PSJlp+ZHEraR9iGI2AIG7bBwvvtcDqMLk
+r78aY8RrAY3+fXScE+yBMynTKWxQXoRJJAZhEJbwA7WVMw5ms+ooPmqYCNwEoOe+
+0KeNC3fxkbFsU9Nt7kqVKmqMAUsOonNAB161JURhzAoYbeiYStq7ln9nEQ+yuZsb
+eLs+j6vyAqw0QmuIphaFevz0oeXXPDIoSRMpDiVmrfn/T+283ilZOlYEt08YhSqJ
+68CtGhVes3vdx/m4t5Lr2GK8Y8ogOuwdM7v+JJNbhlgYu6CSp+rHsdnh6Zi8zhFG
+OMKAzPnorBE7MbzgrxcAEQEAAbQtTmljb2xhcyBMYWxldsOpZSA8bmljb2xhcy5s
+YWxldmVlQGhpYm5ldC5vcmc+iQI3BBMBCgAhBQJLYwO/AhsDBQsJCAcDBRUKCQgL
+BRYCAwEAAh4BAheAAAoJEDeg4GKXFzH73nEQAJZD8Ol1LfaD4AoA5gR7eo1VuIjT
+SkwdufYyo9PPuimMZEt8hZk0bq56Q5g6uxkJqegeBbDTarreBVx5liy4NovqWknd
+UqSMANmB5tRtlUmcTTjcz/1BJ4ynb/Ty/YqRljrFf0+yWII9Il3H/gCwHnv2cXun
+Iu+x7y1wKuJg2Dg976jIBh1949Jddqz+Hs0NzTuxs56I5yf/mMsVz3QtplgsIPXB
+0xBVK5W/HY6Jx9j4qpjWLklZ2TDftzoYdO+mj/RK4n0xxeA2HdK3+XFvJ4fn9xY/
+9l/fk2ElM/4zUAKFDeyYyAw/x34nJJF1KDcp46GaXPM3CkvTweYEsJ5rruuBTYLb
+IZxBCHSBsCZwHHCai8+aj3tQywoq7tyLtWfWdiNE03xJumv3O0Zk7XXmAAo9fhgo
+91fI4r1hkyy8GGZasXeMz6xyRFzEJyNP9O6a9iAt7w4zlf/J6WrG6n3RchAp8wPi
+tvTW6hgZdgr2pP4a7i29lzUBmLbGhOYN9sgbZxgRUiHGee/F++KNV48FG72VgNTj
+LYPnxvL7fx8YZkMiWLfEqlMyt7Dy8kyF4SnWH563kOVzfAxKdxLgNWfll4bBA99m
+Yvx7b0H/UTAvo474PvJyAPYR51P0Ekq3OSIcSreH39I4as0WNjRNOoWpO4IQP+3y
+tIaD+8bMnmhR6l/NiEYEEBEKAAYFAktjBtsACgkQSDwjxnv4vo5v2gCgyeuyy3UJ
+dJjdR7NGhGSCHIn27QkAoMQ99L7qjlYOsvkmSPdPSWwpV03qiQEcBBABAgAGBQJL
+ZXYVAAoJEGrA8Y4GQvpA8egH/A9b3bfHKLCLGtpn859V1IoLRqioze33dr3I2AaC
+CEaxQQbDQZeJWB7eKtnB8O1YuqPTFHH3H9xfyj5DtA2SzhaE1hSHPlYNgGTkfTaB
+0NncbD708yAisyilKbDilBnmcxwLbACadO7BCHE47FAbMT97qm0Y270SgN7bwh2+
+14SCjsivVAoRUtYshJxpEQAFYBNi76yi1w5ZEptPCvobI4dcabwYb3rZXVKBb+20
+OU0oeVS1wpf33A8xH1TQc3KtcXgEAwNz4opEZAgWc79km+2BCLTxidHSJylqkrPC
+QWo12Du7hPwZzeBKl5wCwOq2qzbFBfB9yVIePrE7CUrNHEq5Ag0ES2MDvwEQAMFy
+Z3VaTm01L6Lv3BSvBNydsRvnK3jeBKlWsiysI7uJrzYBIIcWcyE6lDjobmEegu3Z
+7lef3/5NmzR2QRhxro/oWXhzZqTfmnLIvUiqRLGD+e7tGrabIabWqjies55lCZaE
+vJOFLoEoIgzCPhRcPidfnHfbctq0KIkkP3jbdWmqcY8Y5na2t210jXiDRdGGwPKY
+G+2Q+4UUsfFvHS8Q9nZJdmm87hWWa0XUMYOmbE0ffewad2LF3PpT2NK/qX/7jqdX
+N/nnSoMQrAuJBmJAQBtdDfgN6Wddm5cedoc2fDcsm3rLamS9dgW7mrNfcIvt3ECw
+nlV1rReASPU3CTsuwFxB89VPHOemQ1o52IpW+zO/g/11q5ycmzjteBbL6uL4vZRB
+G7VUCi2fKpWa16FhSeZ2+8FMUW3YiS/LL5r1mtovZZdhY543nzuHUYCigqUVvzUj
+Dhn3wXgjNNmZbDLPExSacMgvbafeDAGSLtXd6Q4RkFbtxtmwwDmg8e17QW6OKQQ5
+jd5devg2UM053Bji8+SnRq3LgqgvaG90fT85JqtlnbeGjV3CiTizeHbz8ucQ+HtV
+uJewGj9HMuRM1Mgw1UHZ+k+5PVkMxmMN5M3O92a1DtYtFxXAK6bbiHb4QA8kSScN
+HljHA+lJYfYrQY1vVgbHuCkoE1aTJv0W9B28CwolABEBAAGJAh8EGAEKAAkFAktj
+A78CGwwACgkQN6DgYpcXMfvZ4w//QphYIrHnVmlEj3GUXX+DU1vhrHbpFMcqWkSA
+xHTDWgbrJdOyf9iMperYo0/3u+DnGR/vcb1LvpIeOtNgAd6SYeSmerE3CZlV/0kD
+LyA6OfyinX8vxaXxgcObxrpcB7rpvom7xVE0tUB6vJtGF9dfKQ/VVFtQ2812Xv22
+cFcAZ1jIqYsIZ/TK9aqRl2DqMTCpLWWaoR61hlTc/TeAud67hCDxHZfuQpXrQ0RW
+5dIlg5dKSlluT3dq9XZ36LctgKpy6lX3OzJts+W3YN7fkKKxHtCBqltUiUAQDZVs
+SJTbV9mheymgLJPqcK7ZUi2HDoi2w993KRUa2GSmQpU0qBaWPJQapY3CueAsSCV5
+rMb6BIfHGr96bDogi0h7vgxieG8TrZrW4J6SDvvzmiIAZhKM78kBBzQ1m8i4xqeW
+a+0ddwNcvOEM7G3uH1P3rThHdkIkcPixAGaRXjsOBRVawdNCouf/YcRZakxBIhHA
+wfDfgVHPFr/UMZC4iMEt9OdF1uWMe/9Eu9LxF6BzN8VkAmJ5F2f5izl0P6nnmQ4/
+BSG8P9yd+0IMyBAXSeMkYSJVZF2EII1qa/zpWYMx9emOkdL7m666NgwdXrcVf/bw
+9EG82hI9O6HI2jQAPMH9WPoungOiOh+TT90IKX5eI+cW0TaR8JeG5A2oYB9Yxr/q
+wepeqtU=
+=gSlB
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub 4096R/9711DBFC 2010-03-11
+uid Jon Schneider <jschneider@apache.org>
+sig 3 9711DBFC 2010-03-11 Jon Schneider <jschneider@apache.org>
+sub 4096R/3DAD980A 2010-03-11
+sig 9711DBFC 2010-03-11 Jon Schneider <jschneider@apache.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.10 (MingW32)
+
+mQINBEuY8zUBEACcQbEoZkXl296KesX/bjX1aCatSIEGIZGiWWTfABqzx55tmfsI
+BBx1HuuVcBlwMZfeTIb5Oe0IQaZ5h7wEl/ezzwQxOezHTwvAbwnZ4oZOrbs7p7D4
+5I90vsw7rn3bPMBV8xuCgV8t2YFmLH0pzX6+gwmSoVfk+RuxRWfqhHJaVzqNYk6q
+iit6NLm2O4PUEeqHWl30RaYPlKabwhoBoFfAzEGIoE3BgukSukO7JmhXGhcS6fLG
+V3/2qvzQmb62PwtuHarIHtaPq4lE0DME0+cXZtLEgMq2nMtPxSssYHk71PhaP4+0
+iu7AwgMfAUbNDFJoAc5M0gq2TAoJk3YZrtisTUhSjMIiKrLB8MvnZZ+MWK1/E+Aq
+XXocerbgK5fFpk7yeEiqvU1/h+S7WSqIDDOqZWeiKCrrIQZAJvz2f5Ak4A8eyYhv
+KXDOwty+q4FL3V76VwWsA7fS8ib9PZqahowaG34DNCflUO3Xj5F9Gk71eBbb894E
+Jboq+n7K7Ayo1jRKu8i+HF6KHiPgWcRvpIbJuQxpjxW4c8Kxqf5iGTXyP7dwRWyQ
+k+DZ2RKzzNBLXCKyQ5TJtgiHXUEwAW21nCaPijOiqjII00GdoA9oZgliX3O3jKsq
+S3llZqwldE97ycfxWenOLn5g47yiCUFqK7/UtJizwYKJC6J3pliC7Kz9UQARAQAB
+tCVKb24gU2NobmVpZGVyIDxqc2NobmVpZGVyQGFwYWNoZS5vcmc+iQI3BBMBAgAi
+BQJLmPM1AhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRCNbQrQlxHb/BpI
+D/iB+WagSbCHgwy+vt0ImiPMggmoxemyf8f1Uv1fz0C9gSH6mY6/ovLrXF0YIBGq
+SP8OlTtcz7eKMJPsvJ2n3GrwXyCYLNbL3QUOoHZjnTpmO/vqTtP3jNceoVzW7vle
+PwMTgp6Nme0/DQ8Hqdgjinwd/E8BY8AFpNdr2ZaWwVHT9fjKpxdGTQG0iZIesluB
+XppnqkltNwBkSdxyVpRXaLhMSjlQyx3S2sGZDJPO7ydiR0EnxzkWP8WqNyEkI80R
+n0neYL4HCnwufsCE+sDBiz4p1v6ekUil0Gv0seK+24U+LsEoc6zZatgXzwJ6XEGC
+0L6eNZ6al6TzxhKxq6byzb7XQxASV0CiZKQTTY0yh400+cgFwa3p02hFnvl7skB3
+f6u20tmnQi4xb2f7W++z215qPpbsLHTggmAIguX0oF2aTYBjNDLyu0LCMnm2uhzF
+Lf/kl77V7AUAWHKdRTDhblTsFL2G/O5i8aDGMbyG82ZieOe2LFqZ1EcqD6ODrLP5
+hhyEYmnlEcb6VSQyQwFwF0E6X4MiZbo0ieLwYEI1P6nSfjKr6Ejuk2EwvQe5TTnM
+OwB0a/4jv/U4A3NE26wJKca3LSml3eYPEsOqE7+X7225z6+YeGPGEYCUCu6HI/Wu
+0VDsZ0SjoHYlMyx6q+bvbLhwBBUJLP6aKiGeptDUHYCmuQINBEuY8zUBEADd1HYa
+7X6JLzEyPZOaddJqR6RZoBKBxmfqxcNv+jO4BehqVEEh7f+Fj/P80JwlyjLiL+1N
+tlf/ejfMXrhjqK5uNbVyKRtwwlgztWook+8zJ0xMeYth6UXdFdhrUTs41R4QSUai
+c8X+kEQex1TgjCXeDBiBJgUEpnMIc2OOIZgEHpverdOE3X0WYXqHppC0FCzYBTix
+x8gw6bsgn/Z2mGMTmzHtm1OtIp9mWJQtY+tLa6+3sWiedClrQcWtUIxPqDh68Ckh
+Lwc05TRGryqZ40zU8mF68DQ9GQB7+FUADkViT5l/cGZa1XCEyPI72IjdH4WY2Qxl
+ivXoItQgUPgVBo1aeeoVYFr43iCFMVPKp3qOJTeJGg/qezc3X1TZXNQ3E6vY5XO5
+9d4CpduJ1uOjk4NSSnfpUG+Y/LrCrx8yqO2Uhh23S6KhO5Bx7ar65YBBFhFhc2aP
+sqRfqUSACaDKmO7VvxarYcjvbqb1zzwCzXzGhb3LqIuik8ydkoBB91BDouNM5J3u
+O2KHVhRrnPncyDtL9FQ7Ru7T7NnFdtxZ17BSM6Z7DUHs+PJe+EYBzMN7UDkV7eJ8
+/2HC59QaY+NoNYPyNHOwkTNQyn5kMIwoTVBndqBlSdp5vR+8n/nJ7RNOF+pPeEfd
+hs1rzfZy/+1wP4PWWh1Cj34ZrQjpfDKBKYiXoQARAQABiQIfBBgBAgAJBQJLmPM1
+AhsMAAoJEI1tCtCXEdv8XNwQAI9dF7lvrIz/7D5t0+u43k6dSGVH76tMQXv6yo4u
+tyuKoRieR315SjjgCGZ817bHM3frxyIXLk+PMT7Brbi2DKoftVVLpmVDbSsv2Pi+
+mqez8XjJFoRZNgwbWESjtcNJY10ukwQ9VT5+73kVNIQdbizK51hK13+Etd9UGr6p
+2MZOe+nV5bbKnEdCxrRricbGTOju5x5i5DEZzWGa8W2JZKHsEF/l3qrfYbmn0AMg
+vXw5Robo38ZxxuH3l6O3GEed4aUNLJSmu3gIl32uANLE5kg/OYbupmAuvwBCn7/D
+xAB7LY38Tg4zIrWfhQCzP5IAyxYOZSFgsggpJ6foilOLCgJul8Vq19HV98FsWf/M
+sE5azSIfJI/Z5EWpbaM0xu56nbJ2O18mN0Y3ojz5/ewZo9+ODRm+buCI+Muz5Gs2
+iNoi9D8jtudc46l1OASP7n9e+WQDCd/IwwsUXHqT4+EkM/ZIj31W1+mBZtzIPBCU
+37ibGfpt4W8GC9DtsDk+r0A0+4RurzVYTR0P8iTb4uq0i/ffBPBLVTS1E9D/WcGP
+2DX7YW9e6LhY1kIbjrLR/rDHi95sx8QOCBMridpy8RlXdwWKU/kZ9s5gCYBVKBhj
+/w98LUqT07uWFU98kDugW15Ng8OCogpaueDYi6hA4A6c66EhjdKH9JzigxfxjSkD
+udvp
+=oSat
+-----END PGP PUBLIC KEY BLOCK-----
+pub 1024D/265B4C63 2003-08-18
+uid Antoine Levy-Lambert (Apache Ant Committer) <antoine@apache.org>
+sig 3 265B4C63 2003-12-06 Antoine Levy-Lambert (Apache Ant Committer) <antoine@apache.org>
+sig 3 5F6B8B72 2003-12-12 Stefan Bodewig <bodewig@apache.org>
+uid Antoine Levy-Lambert (Apache Ant Committer) <antoine@antbuild.com>
+sig 3 265B4C63 2003-08-18 Antoine Levy-Lambert (Apache Ant Committer) <antoine@apache.org>
+sig 3 5F6B8B72 2003-12-12 Stefan Bodewig <bodewig@apache.org>
+sub 1024g/A3060393 2003-08-18
+sig 265B4C63 2003-08-18 Antoine Levy-Lambert (Apache Ant Committer) <antoine@apache.org>
+
+pub 4096R/710038F5 2010-11-02
+uid Antoine Levy-Lambert (CODE SIGNING KEY) <antoine@apache.org>
+sig 3 710038F5 2010-11-02 Antoine Levy-Lambert (CODE SIGNING KEY) <antoine@apache.org>
+sub 4096R/84F32FDC 2010-11-02
+sig 710038F5 2010-11-02 Antoine Levy-Lambert (CODE SIGNING KEY) <antoine@apache.org>
+
+pub 4096R/82A7FBCD 2010-11-02
+uid Antoine Levy-Lambert (CODE SIGNING KEY) <antoine@apache.org>
+sig 3 82A7FBCD 2010-11-02 Antoine Levy-Lambert (CODE SIGNING KEY) <antoine@apache.org>
+sig 62B2963F 2010-11-04 Dan Poirier <dan@poirier.us>
+sig 7C408737 2010-11-04 Joseph Edward Bergmark (CODE SIGNING KEY) <bergmark@apache.org>
+sig 02E9F65B 2010-11-04 Luc Maisonobe <Luc.Maisonobe@c-s.fr>
+sig EFB55DF1 2010-11-05 Luciano Resende (Code Signing Key) <lresende@apache.org>
+sub 4096R/70EC4C9A 2010-11-02
+sig 82A7FBCD 2010-11-02 Antoine Levy-Lambert (CODE SIGNING KEY) <antoine@apache.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG/MacGPG2 v2.0.16 (Darwin)
+
+mQGiBD9AzmcRBACMqgb7IFvC/nLxw7mUAgHENeZXY3JOQJ8wVBevIbbMEeFvzHE2
+diFydqUXocPexduYr0ahkf033WvWdAiNqDLfVW/HFOsc1TpjbHkqPUHtJ62Ya5tg
+nH4UGN9BYZfMbfVDOSz41lYwmfK5HYgpZN/sBQBSKf2qgoFB+LxYaae8YwCgrWlu
+fYhf7fkKbbdSf3BGS67ggNkD/0VvkXkw1SEnPaqrkKGkPKomCTb2auGxcYYI3/rP
+1m+SGRf0gE1NtocmIEitiR6WvfKUjoMAXSCp5KdnUXmO9rwzkM002KCA7K5CY+e/
+2bLDuiQ3rNiD4mFfG6M+UnmZ+GMFba1p9Cp4PqLNLsCHz67t7hEsscTZQ8mZ9xKM
++GCsA/9P+XFM7JDn9MLhYab9qo1CkceBkthUP6jWGjuAZ00elmBCkpkzNv5aIzss
+xih2GpaU/tmcMjw8FGp0dTwzqdpmbZBLjunRnuBTir4m4l5G9rwl4JbfK1PVqk4a
+VKkh9W7/yqBcEfNcsfJO9cqaQ+PzcnCoDiD9UHEBYzUhrCKwhLRCQW50b2luZSBM
+ZXZ5LUxhbWJlcnQgKEFwYWNoZSBBbnQgQ29tbWl0dGVyKSA8YW50b2luZUBhbnRi
+dWlsZC5jb20+iFsEExECABsFAj9AzmcGCwkIBwMCAxUCAwMWAgECHgECF4AACgkQ
+hhTWqyZbTGMnOgCeJV2gI+1CIxMR7dcIhXjPkiusreIAn2SGOsPS0o89l0EIVuc9
+J2F03aB+iEYEExECAAYFAj/ZwioACgkQohFa4V9ri3J8CACgiGlh+td0BAnJPq19
+ovEQR2DJ02MAoLP203EF+BLPpykeTcGp8UEWmeGQtEBBbnRvaW5lIExldnktTGFt
+YmVydCAoQXBhY2hlIEFudCBDb21taXR0ZXIpIDxhbnRvaW5lQGFwYWNoZS5vcmc+
+iF4EExECAB4FAj/SSwYCGwMGCwkIBwMCAxUCAwMWAgECHgECF4AACgkQhhTWqyZb
+TGOh/QCfbrSoipMlizyGT6c8BOPEd9zzfi0AnRRTqTDzXzsGk4CG/BJME9CCm7Ts
+iEYEExECAAYFAj/ZwiMACgkQohFa4V9ri3IOVACgh2QHS1+cVjvM4eLjls1bJwWi
+o5IAoLtAszHrwHS5qrhvr2rtnlyyyV2guQENBD9AzmkQBACNpBfqi2PweozCtxoX
+PqzKdRDKqCw7TOrDR6lbP3z/ov/1SN5Vc0XqNzBSGqwBcmGWtneABkX7n4uzJrC5
+wvX/TZ/DkMvypPyeNVMu+/ZMlzdbx06OUDKr6Fy/NtaI7cN1rw+Igyv22Q8ilhhg
+s/5Rdj84EtJkWQjVRml6wXSAZwADBwP/TqyhOC4sA5YrePYGH8i46h0SU9dXjfEF
+JijC8vXZ+BNQHQVK3fjEXedZL8Zvvp1bsMu7Muz9SMnqygM1unp2NGxLRd/9315p
+Qh0VStYKn0xq13ybOKr0Gsyx5yyl3Nzlu/1qAR0es/zN4jV7/IQi3R2GOvezcpHX
+mkbsYiZAhu2IRgQYEQIABgUCP0DOaQAKCRCGFNarJltMYxcsAKCSJJUABlXYnLBj
+b+WtmAzu0JjZNACdFJ4KIATJDK/5ajFq5+irOpodoHeZAg0ETM+HJwEQAMkzgJCo
+lSOgkvzsTcjy/4ySwS56VgyFdYpZis8QqbEGCe8xKT+d9FYi5sBTw/jGpIy4weig
+NKRRW4NLYgriWJANksBaaPOKvczGAOLWzh2aPfifaGF/puIVT8yCubH6ecxr0Wy/
+lN54Rpi7cmpp+CEbhUTR+7xNGCMt3f9brtOlC6qYN3tJ7PPcfNBjJr0Ts+fPt8lT
+RZlBhVa9iEUVYoqMnZQEBmYkg+FxSrFlLw7/WLMKaKGHAV7QbpIxhaDvQ7bMM6qW
+c4plt10+wtZtJV3MB6TIRSYaEF87hXCif7mJY8KkCN8XkAxFlQhqEY/gJTOs73DS
+Z5+LJKUOF+0+66B31tN5gQq5yNBGd55OEA9iOM87hhQb4e0IuZGvq2vxxK1OL6Q5
+apr141c0ZxHLKaG2YCqM0B42mW84V2mO/Xu25HUjmXGrkpEd61KaodffS5g7SWj3
+jb0X1w/+QGQXnWdTPWuWu/SrpnJb9kBpk/awrBbh6/gz9Uug6WVw3jBaYvfm2gEf
+eKVYXa8AtBDSDuytXSXCSNRKY6Hd27ohUKMRBLEtz6Z+WgTKS11u9ip6ewG9irtk
+cJQmloGjgaQTLmTXJaZ9UkaEh8uH/LinhIDHk+ilht7z2+CN7S3kOX094v1AnvlA
+OchoDd7Wn1KqSoiM6WO5pccPdnU/j4LSoeVDABEBAAG0PEFudG9pbmUgTGV2eS1M
+YW1iZXJ0IChDT0RFIFNJR05JTkcgS0VZKSA8YW50b2luZUBhcGFjaGUub3JnPokC
+OAQTAQIAIgUCTM+HJwIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQDmn4
+CXEAOPVsEQ//Vv4CTUrXTvuaPTNR1x08nntcF5RY+2GGNlT5Cs6EzRbiB3GmKFKu
+Qxp0Ucgr+Yg1NTa7jOP2TbMwo8/FCD6i/Q5pWTISs7CdahnqKx37a33F1Hz1bNqV
+0Jhi5oJS/sVniYG0d4ZcUl5FkD/gDXgNbUDaB1Vi3I9bU+agwrsLoXrFWDpDPxrg
+PGDV3grvqfEp7K2HvPl2B6mUQHYHbIZ9FgjRLRIjOzjMr33RkVtg2QrLaUiOlJ3r
+i0xpWf2kMKDMej6M3vFP7PTacRHwqZMxZMWZ2WaviuC943pK0gWwUyJgkkYSrfql
+LkzIq3DwKPUneuuInNS4bab8YjwuGYSd/Fnj11P8emTEHwkIIKFyH0LxO2JKw8tV
+BosgExmS39P99tGjAOp4Qg1E00exl2mxtIiKI359DS3DYhjEhb5EDH1gVAh5GL2s
+Y/NiI4VANomiuzkzCybVYaMwjRpaIkCKemXN0BXb8r7e3CLXn4BA3KHIpuZH4Yz7
+I6RpVuyTOrayM62czy9mxF64Pnwp0gRUJhWC3a2BTYXV5vAtW89BrFB7ArENUKGd
+q81lUXVocAk/1LnMxy5fveS5yuUMxPM0fRBwzgARfyv+0HdsjzVmKZZKfjKPOjB5
+YWtOFtdFSdCzYnpIGyoPuUU34v8LuzRwMdBDrODb5LfvX3lMw7YvIkq5Ag0ETM+H
+JwEQANOvLBAACFpbL82gr5fP0xfL/fG+oSrAqumUsXmxnCcxHOzDoEvExxebVnL+
+102IXIMV3eQqEaZuqcUYGBjkMt216u5btuSoSsVDrwRI8T3/9fXsB/jdvlCzsq7b
+pImEFh7VDQc/jC21pP7r1G81Tt7zWB8oWYBbGXJMGsacaNg6449Z/0Ctp+gi+T5L
+jIq1b9apD/+ucg9kGdlKFlLJ8zMwc77hG3LWkoli1cbLgYKk4RKahboFmoEVnM9S
+ypdFfDZuSCB+7PvitjfqEao+fOCYOG0b3ykdcYXSVitFSnHe9T1DLjvKBy9qMtbA
+GkdD61xEl0MtifQxKkya/n2Fg438HUeU7ltcFLlKd4XAzmsh9PXy2Gpj/lbNYpsD
+DDMZafyfFfkLYYZasN4/+Ak+f5T1OuUqByIlesAPGReFtnUI+yXM9qEImProy+R5
+gNkBPN1AnNWvy2pi+ZUUI+35NW49uee35p5LNzMiP3hd2W+rDHWhE9y3oVFkpzbL
+lXwF7AMQGtMNE6i82XfahDyiMRo9BzssTSdYc1+5OO+5buXWuZUibYmGc5yDQ6qv
+0Yhlry4uoBMLJQcVCMkFh/os0gB4hgzI/MkhuEIYIBZcjGTzIzeGnB+0hB3ODiqt
+LmrR2IiK56EkJ+UGfQ6Niankx+1M+OtSFXc9oWP4RacT8yaZABEBAAGJAh8EGAEC
+AAkFAkzPhycCGwwACgkQDmn4CXEAOPW/3w//Wd3DfhQTXa1LoenNuuALnF9zIJQr
+scLXc9HRO41x+0oCxi+ePDhCSiTWKWA4t74PsgLurdwXnQlcFU8rdSeWSalnO0gr
+f0Rs+OHl4ICK3AWAgzZjFDh4J5Pyr7fVteGlUlKRgCCy/rGMwwSnCGLQYa9W1/ZE
+KYZzLvFk0S/AoSv2iw6BxWUYVZVO7EzRzLoauLXQX6HyFyTpaH2soYbs1Xnp8t/u
+w47PDnWXpYAaM0P1pD0T6krYp3M8YdNySGiXaZTkHBP2bj0PllGQHB/RjOyUrv95
+USYZj60O430OyvjlIBDq+BBL/ZLEbMdUIFJJ6WO1F1nIr8MowpTNqeEBpEaqOY6A
+lV0j9fZWX2qJKIxQayq5OjfWL6Y7juJUuDBBZUzPtKSmcwGtg3HsCL0SWoz8JT4p
+hPOXy4Zk1NMn4F4oIwRrGrcB2lmBaQmoBWBP63g5rObADL0wsyabfYuVRTE7PoSg
+iCEN7wONrFjXrpB+WWG36d8nrETyMKALr96YL+1T4VNs0sllYbrkowRe2ioMKj9r
+t61UPOGhPekw0HA7pDS1n+nGMMU+efLKKCvcKFKq/TDdjK2jPg1JQ1Xq8O4fDwRf
+ibUXyvYwswAqOqQ0nHH5QSj9pov3tsXhJWWDVIWKMFhk+U1Sans9txHEQKJl8L5k
+KiqgPxg3Tk50+6aZAg0ETM+LbwEQAN5ZRgD4sZJ6ClxoWjlmMM1c9632/isnzXJM
+unkZeCA3gjx++uhZexCdSD36aQZ7dAFSwvrJLHRrjsszl/uc1H7FaBmkZ7E8sjNI
+/oulUtMhcLe0TYy6MRSdl8aBqll4slZNfcl7iYk4PCmk2eR4sdMPMEsQC2kcglDW
+HDeJfG0RozFgJ46QVRCktRWTrrACQcvuHLizl0+4nMZ76yexNre7Rrgo6kE5Mapl
+0UXog6qM9ngV5cVxh2/wDex5fmXvB9uNTusEQIFo8qaZPBtapAAeoIShyUWispqi
+kos5t410OzlGfBHsDb0cq4SU44bAXJmkZv/95JECEy8mZjsbywU4MCDjAf1lC4d9
+K7lcwHQS9rE2Xw1suXfD/VjQy9obpLLROk1DGLJC0aige0BbhMOa+mXgKVzSKcKv
+PdmcUHcdm0dIy/LYZhC9Ja0uv37Sc9Ri55k3DU6DgdBu2dZgy7q9bBzLpqPIyTPs
+XxUlczjhT6KxZYDeyghbwJYQ+miasY2VHeY9aZHYXXhDHIo2eEaut1y/9a7i4auA
+aYnaADj/gmryBm6rb+r/MIMbfZ5htB4l6aoI/8BJygzq38LrWwUvzQ3p/N5+jA5N
+uJWexAbG9hEc7nbbwINwp1b0P35eqSxhtr5wGdSNor5zScHazaPjPxHKP7WiATj8
+a1p0MlEHABEBAAG0PEFudG9pbmUgTGV2eS1MYW1iZXJ0IChDT0RFIFNJR05JTkcg
+S0VZKSA8YW50b2luZUBhcGFjaGUub3JnPokCKwQTAQIAFQIbAwIeAQIXgAUCTM+M
+LAUVCgkIAgAKCRBe+tn+gqf7zcwkEAC3VkVY4TGXoj3CDnjCL9nwkxAyK+JagXSw
+7g8FMjqWW7YAIU8TprZxtOJUcnSXioVtT8dhKBfaasu34EpMrUYEIPNp5BNzhxIf
+f9hXVrcuOZ1k0nJRlSc4IKSsrognoCDm340ma8AOMARVkrz7tXdqdlDPWVjMvqn/
+5/KReaIHQUNRqjypIIdM5mgaE41F1+uAyqLqcxvf4YQtu0NNGMizGZd37bH+5wMF
+BT7S6CesAVPogcfnMdoMN1wO2yOzWKlg49U91DLUY3XHGOQnqVnTnVQ/xzLEj/vf
+0PlLoY+3Yn9WEaonkMgco9un71xZ9s4DnR4WE+7QJYU2cgSPFB5DbAZ925qcNK/x
+wOpKfRyBPN4zdjWE8Vjd25EcjZLsxgPiSlPpbyIJD6Ot61uoqekinNlAo44sleg8
+rNAAYnajlD/1La+Q/grQnHcujOt/w/ya3LG/cTpz7wkUhxhnmMwmxrVlEFaM24Qk
+PwbQE/Wuwdvm/hYX5o4F1b7DQ9WepNZ4ahb/ztbsIg2my7JLN4RPDWZ++EMt5K6w
+G+34vn8RfuSu4GHT8TAoexDsAEWzFo67F+dAosrvfw+HBBm3hNEz4tRkKP4SPqmo
+dE8IXUffF+VFeFH0NLsvIwfpdW90XNxnSlnrc8aVpdvuE3qXqjQICo10LEJuxZRa
+hNggNMtUNIkCfQQQAQIAZwUCTNK+FSEcRGFuIFBvaXJpZXIgPHBvaXJpZXJAYXBh
+Y2hlLm9yZz4gHERhbiBQb2lyaWVyIDxwb2lyaWVyQHBvYm94LmNvbT4dHERhbiBQ
+b2lyaWVyIDxkYW5AcG9pcmllci51cz4ACgkQnPorAWKylj8WUxAAmxx/NESLJp0r
+A+fW8dQ08jGZ1Xf1laNCEd1eb6FXr/Z2xsKPFq6okBiiw6cm2wiwp7DBBHxQatyb
+AJNLAGVg8wpHUPgUguFOY1LyLRZ9i2SKKmWG0jzQ7svWELxssHFUnMW8dwtk3qAb
+o8pKvOKf4ol3qoKfN3Xq8ZBXAGkQaTIOJzGSfau+dH5NbhMcqZEoKGOAcOsLiIHZ
+Cnos9KqFMxqBlTMyJWO9YP8dY3mGHUWV0gsYfE32bHM3auaA2Ynzxtor/jMBATeq
+hTWjRAD1H92/HZ9vRBKwpHHpjsF+21aL9TZv5D2OmFYeN7/G1tyRcLYLrhDa7tnx
+r5S/ePdypMZ2IUaC0umMKrc8ZrAtK/2N4ZmnHKoScCJHjup66cLCVVFGXHb2hEM9
+2fPFog2//s78Cw1DAxaNE4jjmR4QWXmQZUqA8AymIfgsi+nI9rWMWnpTCC6DGG9+
+j7GbIpPdRscqoyAiPl2lBpZerLirTa1GMuDqqGuNiv6YmEvxNVleOlPYCCQr1vY5
+ltJz34zckBNJAH/7woggqoyGiLa456ruDzU77qxUCy5ulFTOWsVtltojnlxgKBML
+8f0uThQZN+0HydPb4uP3k5aLNL1ktiSo/XlIP2/AO69Bi4YZzERYsETm2zFLWx1P
+MN+R0l/BAjRskTCX+H92fG5OkGjkmR+JAlwEEAECAEcFAkzS16tAHEpvc2VwaCBF
+ZHdhcmQgQmVyZ21hcmsgKENPREUgU0lHTklORyBLRVkpIDxiZXJnbWFya0BhcGFj
+aGUub3JnPgAKCRCw2ZG0fECHN8OVD/Y8+R4R9aNkuZJ76SCHOIhxjKtMhk44muAZ
+FQwB+CG7HY4b/869+JdAOrwsOYr75h3vkz1vkU8FOr2LAu6PdiXDKpEs9wkPDGFx
+Rg9yePaX2DbAh0Ch1ucR1FZvr3QqO+L0ri1lfUUl76n/QfZtHXfuoPgsYIjsbv6g
+90mxHFJxxmowgX5gWKYaVm6OFN7xYiAC18Ia8LfReNIZO0XyaOq2/NoLuIVyguyi
+C3RuVnvAk92/6YCPgZNiH1lN1kLmkoNvGpY6CFkCI9LKZ9xRCbs7Dbkoz7I+EYla
+zfRf5mLjsrI+nVmFHvicvuw3ZtCCAImMdZ+Z53CHwd2N2v81lqnxUyCDPJf4Mxcw
+Jq7Hf9hYZUBS9Ehj3nfCmJwOVUMrXYXurKinDAcyoYmlA2iqdzUdM3d9xFGjexsl
+cUhZusggmOvBc3bK5BLZXUm009B5LYz4BGUAVsmN8vXekRgevszz5GcZBKElgRds
+9DQaO4sbgrskq2TXHzBI7e9GiEcUyErZ8fdsbea5zrPoW2/x74Kq93VtQCuWPDOJ
+Nq95l0J6bmiaVZuUTO5YIHFts7jphvA4gMf/4Lnzhzkcwftgi9OwyDBbpTyfdno+
+hsYBrBFQP4L7DLaGewHt46Iggil7Y9oMO0Yo7JtCsRnDtZYxc4rveg8vRg2xIl4y
+NJlDNzNciQIcBBABCgAGBQJM0p5uAAoJEJrilv0C6fZbqooQAOpWpMdzXdmDG2fe
+BffHiY2sabhX7B+tBRw+SIvmGw+ZvWvy3Tp2xFy7+PgCJhs/wbjyI3tCyx+DPb5C
+ybZpDjferuhbKA/PVgnJozUhYtwLFQ7bRyvlLq3ZSZZawVn2bbIHn1knjohz+0hB
+90zVX6vXhjPNZwL8vzPa3jMMNPDbd4E7w0VB63sWTKXq/pTy5SFGfscunxOsDMbj
+KcW1VtSszH68aywefZV9DbmjSDEgNRiqwtj+WxD3rp3fARBO+4o5yIsjWu1wGL+n
+59atHZJp34dAJFgOTJ2Jtykyuh3G76k4XKLemgUsu4aWFAlNIWt/f41cT5WmQe4z
+YG4yWLE/KWpIc5Jn2p3wlQpKqwl/+F3pkOpqPZmZkYjn4ORCMg1Q0eOzfiaheofv
+T78N0j8020z1lf5ojmEtGHoOzwz076Z3TGP256a4F37ZzibM7KFBn4iwjVrgqfFa
+62Q5WG+q2rdmpQ5B2eXAYNxg66DiMcfR3zHJeMz3UpOZcygIUZ63N6VK7+WgNPtO
+swBmXUxa5L35+a616/vvPtCEBlvJtDQz22BIvp/RpYaJ1k5K58uy0hj0oXZlD3q7
+BJSgPhgYOOqO79ZOwbgqGB9is5yegDXtXctV4FGuj601C+qtUHbRLmGio3XSMnmy
+FCOJpZW41tJYo9uQz7dRHIzGsBpSiIAEEBECAEAFAkzTeLE5HEx1Y2lhbm8gUmVz
+ZW5kZSAoQ29kZSBTaWduaW5nIEtleSkgPGxyZXNlbmRlQGFwYWNoZS5vcmc+AAoJ
+EPOfGH3vtV3xs08AniczpMS0xOouROjBIHLC+RlBdMwAAJ0ZiOfPrr5+C9Glo317
+omxwZ0obvbkCDQRMz4tvARAAoqAcqn4cTgkAEACgeJQJoPKYAAyZwISGNTgqnnSr
+BtN91af3XoVybrnXvlzFc6CkyWQ5T44yMaSfM/ZCYMpFCLtzssTlk3R8ASd7aIQR
+/ydoB5vaPZ424NjSfsNLiF1NR868R8iFPHphegw3P2UeFT8rw/arcdJ5lXQ/J66p
+63t9BlggU4piIMl/JPrtVawVLelYMYy3zw/RdnmrvU1qrZBGno5QkRhRlOXqQBTv
+FlWVZT0GtC+lNha/MqEqW5YkACVPYqpmYk2aoNH5+Gj/yBpWap1o8GsVZKZQUMx6
+CPAT9GcTrOlFqFbFG1kL0iOQgOlggQ0Kba5LN1VXUl7ESsu7NYEXDqDdbjduVDMR
+UsFrhTPUOf/kRNPjMPmGih0RP1s0woe3M4dsLaZEcAu88HHMCcaiOfBPAFU84upM
+fEgh0BIcmTVwAaSftD5gzmZKY3YXfaS0cD6RaZBWuzecHNDLLEgzuhNbUtmtylx1
+X57tep9Mh2tKDFrqBxlhg3M73+mGdE6zgsWhgOeAMATII8mzM90zLh4bg9RBxdp+
+PnoJEbuZVdIX2bNJPt/u4LdAV/czozPjkZtZ60VSkEYyUnZ2dNKUOv5tujkY4dm1
+V+R9uR25C4fLopnE/AN26+GYePrbBaghEUh7ugg7HlTEXPz2JsfvpjPIaao0V1+A
+bEUAEQEAAYkCHwQYAQIACQUCTM+LbwIbDAAKCRBe+tn+gqf7zYEvEACoszB5B68Z
+QrcOBSWvk4l0xWLNfZQIl0M5WoNEoNj6Vt1CzIXadRFxHu1m0gnDLW3brquRuxTe
+acho1iqinNw0pP7yODNW5p5ftKdvFlB7NNemVxzNZn1Q4cSkbI7GdYFiU9WQf7lB
+TQpzFhjJSbJEMHtQrYOqw1wGNPZThEfNXwFLwe+0RF25gEQwuTkRdnpKarBeZiax
+8zkuOmTLWmrI5Dq0dsYi6YotuHaSa3cFjGo+gp2cj+mBljaW8BXAIjzNunjMKqkV
+XNA+Eh3w8FIx7NYZfrbDz4II3naYLb3x3IEwb6g7sTnCexFyTcS2RMJOqPBG2Zh6
+UI73B3AGkWDMsUyDMPVCVOEWUsT94tPBDZCrvdOpVu99OeMqESuaIuPELEbSIrsU
+aDCyJDnIWVExk69szQl/4HOM+u9WBtSmG94WOCT7T+ypPcfFBPpUvxx6VriWKRQX
+yKUlVCJVET4UpDHIwVUpIsmFmjxZfTlhe7pny8/a03/EnvGImuLYoxhfzP3VRapr
+86fwCseMxAPW3gnl6zvGZrIM6ZS09tdyTIOiHUHMcXvWpyxdw+7EXHuncpEB5m0U
+Ci8LBeDYqitVqqakgdKGAl8pfwaIJ9DsE5Sv/IHKFmieLa9PEh/2S/4hCD31atIK
+3PimOFurhebU3wOU0wEkNb/3IYLk+MFQOA==
+=1STU
+-----END PGP PUBLIC KEY BLOCK-----
+
+pub 2048R/AAE4CBCD 2014-01-27
+uid Charles Duffy <cduffy@apache.org>
+sig 3 AAE4CBCD 2014-01-27 Charles Duffy <cduffy@apache.org>
+uid Charles Duffy <charles@dyfis.net>
+sig 3 AAE4CBCD 2014-01-27 Charles Duffy <cduffy@apache.org>
+sub 2048R/886E0B44 2014-01-27
+sig AAE4CBCD 2014-01-27 Charles Duffy <cduffy@apache.org>
+
+pub 4096R/87C39319 2014-01-27 [expires: 2024-01-25]
+uid Charles Duffy (CODE SIGNING KEY) <cduffy@apache.org>
+sig 3 87C39319 2014-01-27 Charles Duffy (CODE SIGNING KEY) <cduffy@apache.org>
+sub 4096R/CEE42EB1 2014-01-27 [expires: 2024-01-25]
+sig 87C39319 2014-01-27 Charles Duffy (CODE SIGNING KEY) <cduffy@apache.org>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.14 (GNU/Linux)
+
+mQENBFLmW14BCACcK3JRugJ67/+EssTjqFd5/9AxZR5iVumLvyzAG+JVL4wd9Vb9
+kh9uHaGNHUNSHgp25RIq9k6ML3Oha7IIzw9DvYFMkTJa1m+LZvbunmC4UPe8OgDJ
+j84mFcKrl9ew9QnGzxMBI5S3bIEBOe+I3apxZh+dL0WTWz60yKsE3Fo7Tc0+fkTH
+XBMw+GfaOQDenckIAM+nWv9JqdZWo0EnkjUwCudpqAvApJd7LJlZJjEAh9wfuE+Y
+L5YGTHN5ddui/lErCVFYZH8Ojd6AhnnJZWuc6yNW44BhPtSXskmYTzGc8z413Ml6
+SSRAQ55oItfFeqml2n5OsONhAFjCyNt7ukP7ABEBAAG0IUNoYXJsZXMgRHVmZnkg
+PGNoYXJsZXNAZHlmaXMubmV0PokBNwQTAQIAIgUCUuZbXgIbAwYLCQgHAwIGFQgC
+CQoLBBYCAwECHgECF4AACgkQ4xVjcarky81lmQf499s7X5f2lEOz9xr0bIWbtWLg
+MkdwX/OZL0jJTjIvv3034x/ijuSzF2U3rfIh3AQASEIX1AGJVAAAjaum2OFdD0Ea
+VBH0shgtBIAkJXSEUqa3Jb1XmzmlS8ALMga/uiEmadIByjHyemYC5AGYo2AjTMgT
+I6ARSfwpOuTRQ+wEZaJjFaGnCd5ZI48T34laIfcLGKYRcg/bYBVh4OKol86eNgKP
+M+yAGIaFozbbgEEzSabLoiTGXwxscxefElmAZY7TNeI3rcFFxY/Sew5SrqjnzbAf
+JH3EO3GIOitK8NHCxKPD/F5p//tEs7Z0Vaor/ejhFIHnuALDghK8wCvEcwkhtCFD
+aGFybGVzIER1ZmZ5IDxjZHVmZnlAYXBhY2hlLm9yZz6JATgEEwECACIFAlLmjUoC
+GwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEOMVY3Gq5MvNmdkH/iSA78+C
+lQOwkjijvOy1Y1w9ey7ySoK2L45I/Z+FesLQlVkyHuPnfpaGrmSrBlHNEIS7Gs/X
+DvS1UBNtGXb4EiKM9nvgYp7GEniiEOWMUBpqAVPRFER8BbLkTdoNn3LBziMdaAj/
+eeASRPH6pu9wp3t/2nI1b1mj5kFg2ewRbicUBhoR57Lgv5qWAuOpBRqlSPp6lSdE
+x8pvfiW7eI31ovmzvuXMJrffxVEDyhmjwXnA8y1QLsRxiP5g6yBTqE7B29tSP0XP
+TqkH1q53rvnmfPQ4EP76c0SXURdSILsbJAWM6MxshqhcOPy8TMzvUG50/86UNAyL
+5FHE9NGR4C6rgja5AQ0EUuZbXgEIALp/M7maUGh2ODWjdDIt87j4ilMUo9xZupeO
+vsEYVB3lvDmwzfEe+FAQGm1sbcdLZ/AMiwf6blUs4/s2RZKuApWUREWqMrodu/ej
+1ozY6RUN6tXfaSmmK2ECnAu9m0hnRqdmU1eVcAsrlI95/stQzJY6xUfr948Yz/nT
+oA6WUXIIiDys6mcyvux6Lno/hbxiNw9LULK62q0Jh6g/ErxiuHzv2sXsi0M7ZYLz
+VkZdopa5Zq8/8WXl9VK4DfO0UlZsI+7Ucvzn8JOX7fmRJ571bEJkzmRaRrEXtJaY
+9g3TE5xB2Oy0DXBCeEMqqqRrJXPqmV7m9ODMmSFACGwRFmSn7p8AEQEAAYkBHwQY
+AQIACQUCUuZbXgIbDAAKCRDjFWNxquTLzXcRCACZi3ySYQdz7Qj/JD27qL/u+16x
+369z8dG+ncglQT5DWnCbnyITDnsE58Oh50V3nBT3KMFMELNpgUag8l7yPaRGRcDY
+Xwag+DpDWaOD3G4BWyqpC9+hdlSBsW013YLnnGfuvjSLv0hFV27EMA6MFnmHgcPA
++xIV6j08PhFvYsUH69yA4u93ey8CAH/Qv3tGIRxcUvp1hqWLsxnqc3LAq4kepydY
+ZX/2ppslj02OkKGPsgv6ParKGMESBjx2Td8ZwnzFc4AiYXqpvuMQx95TxC+eitBX
+UKMdQR4SRJBdZWnZLLoPvzgH08TtE9Y1UraJVVm+gIPqeYLqux+6y3ujRo3ZmQIN
+BFLmYdEBEAC+GgyACiLyLycJ54GUJanMRAhB49SLpi7oLnbfnCPqiey4sOugVZf7
+XhS01wokzjsRpOgy35qEK03T4lsMEaYcEEhJYPN90RhjY7VGPfGgVGrXjZjPJHKL
+lTH85wV1zyAGmNyI/Kcd0WiWxVifSEqDDrV8dTvJQEq/PHoEpvXwVygjEuYbbBmK
+j7LKbvFqnEbK63SLmCpq9AITQ12ysy+SysHp0dFw5haSLB2oK9CO/hXKc1fohI1H
+Kx1vn6wCHouCyo3svuXzLaUAyPJboNFL0D46uiiv29pc3bsS6NLkiWa/I6v8oxpS
+Q2bDCb8aGRl71D8dLYtx7FQvvQmtN7Mzbp7nbcw6O6EFX8BrsOWDBXw/+K+rzR4k
+Hu+wA+SSwbOsMAk/uP8cgk0p8agLvv66Y2tHXv+A3aowBZ1CPNy89Fo44QMib1Mz
+mRHMrh6UCwHznLRdA66SgfUItgO5G0glc6sjlQNdzhoO3fDg6ltD/pyW6a4S9cP3
+yv3YH0gOgAHHpVVJP0MJZi3lh1Oh9zdwqy/DFKebFdVZdbXHPWxO61jVl6m640mA
+rAQ438ro4N0nZ9afsgNT7hXms4Cx9qda6R5RVt6hA7NMo6agZE976ptgsQXttsYf
+tVJqs7acu9S6LCLrpx9elt4DMeH6KQQAwvAy0qRQcfs6uOGsgGvflQARAQABtDRD
+aGFybGVzIER1ZmZ5IChDT0RFIFNJR05JTkcgS0VZKSA8Y2R1ZmZ5QGFwYWNoZS5v
+cmc+iQI+BBMBAgAoBQJS5mHRAhsDBQkSzAMABgsJCAcDAgYVCAIJCgsEFgIDAQIe
+AQIXgAAKCRBxk7nQh8OTGehGEACF69wQMCC+yGNvQ+xV0IfTUGwKIK/vT/eHbr5p
+FiF6Hyui3JEx8L+UAecnKJVZBUz8s3AQ8wVqA5p+ttDCw0hoUSDolc3Jpp3mrcQo
+Ckx6JRpc+fDloDN8txakc2wGphQSpIwps/qe9vPy/84eqhmGo5f6GjoUY4cEWH82
+zrWQRHEoNfOTr5POPCexJy+0rTKGXvrCyIcQdSHf7a0V3AXoFQYgqFT42sn2Pj7/
+EjSe70qCZPBY+ytQykKenOLx1fq2FuORsiU8E+DhjyPpfO62pabDwPsi+ZXy6o3D
+Q/wAYSgpO0GfIcTaQM/8gkmOTLpiRnuwukUmSH/4VuAj4rz+hMBqjZtnR8FeVJvO
+gnOljNJjtXcVcHVNWT6cUr8IC1VKvJZoGbjZf5mlwyd3Cye9oGVvoEXTq5xVY8+R
+COIUcC41gOhC9RJadHXkGCN12jC6uOmCohSkrVZ3hb8n2hHxFFgPN11NYCGTu5fV
+pg3CJA00uPFSJF8+grl4cFPX7mqD4lO6yKHWGHwTCXxo9S2DuZrnAmKNAt6Z9otB
+B+c0i+6dKpV8yBy0ChUmYNOh251RPMNt1FHPFGAhiE7rdZw6iuwWO5R3/AvTy//v
+lRt5c0QJImVCf6eu18HPwcgw/f6EXQaE26DlytnuXdddjwKyY7Nv1ECT15V8w67I
+ZgrzKbkCDQRS5mHRARAAp9sydQ7GeAv+hkY694iDPSEYmLwsNrpFAdHrHe3u30XL
+8VwSHkEY2x18tmFcEKo737+3seblDkzoHMMSn1uC66RxHsfJeA3CfpxMgTr5jGy1
+emNoKrE+lEi1v3CE4rg21UD42IafZMHKnsQnnkSyyYIvcTjw81lslS/iYbn8juUN
+4u5hMjYgV+LTy06P/ZPB9koHj5DiM6iXWf45wy6OctlhyGGAzYPN8bagqBlcBZ8k
+9JnNrViKV4ZOV4ToE42ZQXPs31TOyXalcUbiZGaeKMH9iV6V0yciS5YcrnxFWLqO
+RS0yjMR6uCkEyJVAGI/l9KDPZHFtDW3hDGo7eny6qJjIVbDA6vM7Az67fcegVAC5
+v3G7fWKyc2E64ygv34OhMWtKMe0X37YRmPupmAZA/fd49Tk9sEu7BYaHpjgW3bu2
+wC5fTYcXbBx1mzhY9VWvlsqpzaZKPihqKcTHEwQiXRsFCDiog5uVJ2dY8DSpjl7y
+lEasG+pMIglZW+Dt4/U1RNzGGitcdBXZBcC6vZ8MK3D5ifQPcxRoA5OLeOHfaWLm
+fHGuIpKwdjs/SdovY7wibTbZcNjRqQmYm4TRE12B6ICvqQRdA0WtA4hZ8kXKeB7A
+VkcT5DCI86BI8zc3vq5dOql4eGVe0fZ4KBwNHv/Thi21iP04ahaBFpXVb15/8YMA
+EQEAAYkCJQQYAQIADwUCUuZh0QIbDAUJEswDAAAKCRBxk7nQh8OTGWGfD/9Ata00
+8MJ6VhD+w0kRmXAx628lE2VlYlbz6gqsUxo/uXQJ1+U3RVwGEzJGYxRSXzcCCGB4
+AhVSaUZB2XuKCXxDWA5KxBim9XgaZ55jdrtoBPk4QoYVy9rx+hiyRTkhbaBTgr4m
+SF1+GeovG6NMI1HJ526uuUw9bjbDBcixDDEc4HnuezJhvXagciRbJP7KBPrXqLR8
+LIQnfrVE9/C01SLpTfu4ibsv7C+xKQOEGbChhfvXazqgd614kYi6Akj27UpadSQw
+8YiU7kS0H9IrYZLL66Nfxlb+9DT1rP0gDA8FSuRO1iW0hqigIeMQrcLAocQS51ck
+IZ1RqzLF0TmurOBO/DOqfY70HPyb022tM4hYE4iZ1/GBS8bq7v1yYE7AWb55YQ2O
+JxV6wSUOBwLxEh8PBMhiwFLaObEOPgkubxGT/YvWEjmK0CoZKy74R7MnxgnceRoF
+QV44gC6CuttGoElueBpjULs1lnKFKA/qwv2ltITMHe81LHVjg96YgsApXOKCkK01
+KH9pznkHhcEAVA0XJ6b4c1TeCQzz7YxPlVU4nxW/fECv7ZgWCBZ1MRrXXRtEViGz
+G3GJoHIALPVs33ykG7MKFFqpbJHHc95hcOzs8eVh2/jD53CXILjbhKEGGbejFlx+
+RHkiOuu1l6jXCeh/J1R6YidjsDjKWlRkHifMmw==
+=j+uw
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/love2dToAPK/tools/tools/ant/LICENSE b/love2dToAPK/tools/tools/ant/LICENSE
new file mode 100644
index 0000000..cdf6ff8
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/LICENSE
@@ -0,0 +1,272 @@
+/*
+ * Apache License
+ * Version 2.0, January 2004
+ * http://www.apache.org/licenses/
+ *
+ * TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+ *
+ * 1. Definitions.
+ *
+ * "License" shall mean the terms and conditions for use, reproduction,
+ * and distribution as defined by Sections 1 through 9 of this document.
+ *
+ * "Licensor" shall mean the copyright owner or entity authorized by
+ * the copyright owner that is granting the License.
+ *
+ * "Legal Entity" shall mean the union of the acting entity and all
+ * other entities that control, are controlled by, or are under common
+ * control with that entity. For the purposes of this definition,
+ * "control" means (i) the power, direct or indirect, to cause the
+ * direction or management of such entity, whether by contract or
+ * otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ * outstanding shares, or (iii) beneficial ownership of such entity.
+ *
+ * "You" (or "Your") shall mean an individual or Legal Entity
+ * exercising permissions granted by this License.
+ *
+ * "Source" form shall mean the preferred form for making modifications,
+ * including but not limited to software source code, documentation
+ * source, and configuration files.
+ *
+ * "Object" form shall mean any form resulting from mechanical
+ * transformation or translation of a Source form, including but
+ * not limited to compiled object code, generated documentation,
+ * and conversions to other media types.
+ *
+ * "Work" shall mean the work of authorship, whether in Source or
+ * Object form, made available under the License, as indicated by a
+ * copyright notice that is included in or attached to the work
+ * (an example is provided in the Appendix below).
+ *
+ * "Derivative Works" shall mean any work, whether in Source or Object
+ * form, that is based on (or derived from) the Work and for which the
+ * editorial revisions, annotations, elaborations, or other modifications
+ * represent, as a whole, an original work of authorship. For the purposes
+ * of this License, Derivative Works shall not include works that remain
+ * separable from, or merely link (or bind by name) to the interfaces of,
+ * the Work and Derivative Works thereof.
+ *
+ * "Contribution" shall mean any work of authorship, including
+ * the original version of the Work and any modifications or additions
+ * to that Work or Derivative Works thereof, that is intentionally
+ * submitted to Licensor for inclusion in the Work by the copyright owner
+ * or by an individual or Legal Entity authorized to submit on behalf of
+ * the copyright owner. For the purposes of this definition, "submitted"
+ * means any form of electronic, verbal, or written communication sent
+ * to the Licensor or its representatives, including but not limited to
+ * communication on electronic mailing lists, source code control systems,
+ * and issue tracking systems that are managed by, or on behalf of, the
+ * Licensor for the purpose of discussing and improving the Work, but
+ * excluding communication that is conspicuously marked or otherwise
+ * designated in writing by the copyright owner as "Not a Contribution."
+ *
+ * "Contributor" shall mean Licensor and any individual or Legal Entity
+ * on behalf of whom a Contribution has been received by Licensor and
+ * subsequently incorporated within the Work.
+ *
+ * 2. Grant of Copyright License. Subject to the terms and conditions of
+ * this License, each Contributor hereby grants to You a perpetual,
+ * worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ * copyright license to reproduce, prepare Derivative Works of,
+ * publicly display, publicly perform, sublicense, and distribute the
+ * Work and such Derivative Works in Source or Object form.
+ *
+ * 3. Grant of Patent License. Subject to the terms and conditions of
+ * this License, each Contributor hereby grants to You a perpetual,
+ * worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ * (except as stated in this section) patent license to make, have made,
+ * use, offer to sell, sell, import, and otherwise transfer the Work,
+ * where such license applies only to those patent claims licensable
+ * by such Contributor that are necessarily infringed by their
+ * Contribution(s) alone or by combination of their Contribution(s)
+ * with the Work to which such Contribution(s) was submitted. If You
+ * institute patent litigation against any entity (including a
+ * cross-claim or counterclaim in a lawsuit) alleging that the Work
+ * or a Contribution incorporated within the Work constitutes direct
+ * or contributory patent infringement, then any patent licenses
+ * granted to You under this License for that Work shall terminate
+ * as of the date such litigation is filed.
+ *
+ * 4. Redistribution. You may reproduce and distribute copies of the
+ * Work or Derivative Works thereof in any medium, with or without
+ * modifications, and in Source or Object form, provided that You
+ * meet the following conditions:
+ *
+ * (a) You must give any other recipients of the Work or
+ * Derivative Works a copy of this License; and
+ *
+ * (b) You must cause any modified files to carry prominent notices
+ * stating that You changed the files; and
+ *
+ * (c) You must retain, in the Source form of any Derivative Works
+ * that You distribute, all copyright, patent, trademark, and
+ * attribution notices from the Source form of the Work,
+ * excluding those notices that do not pertain to any part of
+ * the Derivative Works; and
+ *
+ * (d) If the Work includes a "NOTICE" text file as part of its
+ * distribution, then any Derivative Works that You distribute must
+ * include a readable copy of the attribution notices contained
+ * within such NOTICE file, excluding those notices that do not
+ * pertain to any part of the Derivative Works, in at least one
+ * of the following places: within a NOTICE text file distributed
+ * as part of the Derivative Works; within the Source form or
+ * documentation, if provided along with the Derivative Works; or,
+ * within a display generated by the Derivative Works, if and
+ * wherever such third-party notices normally appear. The contents
+ * of the NOTICE file are for informational purposes only and
+ * do not modify the License. You may add Your own attribution
+ * notices within Derivative Works that You distribute, alongside
+ * or as an addendum to the NOTICE text from the Work, provided
+ * that such additional attribution notices cannot be construed
+ * as modifying the License.
+ *
+ * You may add Your own copyright statement to Your modifications and
+ * may provide additional or different license terms and conditions
+ * for use, reproduction, or distribution of Your modifications, or
+ * for any such Derivative Works as a whole, provided Your use,
+ * reproduction, and distribution of the Work otherwise complies with
+ * the conditions stated in this License.
+ *
+ * 5. Submission of Contributions. Unless You explicitly state otherwise,
+ * any Contribution intentionally submitted for inclusion in the Work
+ * by You to the Licensor shall be under the terms and conditions of
+ * this License, without any additional terms or conditions.
+ * Notwithstanding the above, nothing herein shall supersede or modify
+ * the terms of any separate license agreement you may have executed
+ * with Licensor regarding such Contributions.
+ *
+ * 6. Trademarks. This License does not grant permission to use the trade
+ * names, trademarks, service marks, or product names of the Licensor,
+ * except as required for reasonable and customary use in describing the
+ * origin of the Work and reproducing the content of the NOTICE file.
+ *
+ * 7. Disclaimer of Warranty. Unless required by applicable law or
+ * agreed to in writing, Licensor provides the Work (and each
+ * Contributor provides its Contributions) on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied, including, without limitation, any warranties or conditions
+ * of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ * PARTICULAR PURPOSE. You are solely responsible for determining the
+ * appropriateness of using or redistributing the Work and assume any
+ * risks associated with Your exercise of permissions under this License.
+ *
+ * 8. Limitation of Liability. In no event and under no legal theory,
+ * whether in tort (including negligence), contract, or otherwise,
+ * unless required by applicable law (such as deliberate and grossly
+ * negligent acts) or agreed to in writing, shall any Contributor be
+ * liable to You for damages, including any direct, indirect, special,
+ * incidental, or consequential damages of any character arising as a
+ * result of this License or out of the use or inability to use the
+ * Work (including but not limited to damages for loss of goodwill,
+ * work stoppage, computer failure or malfunction, or any and all
+ * other commercial damages or losses), even if such Contributor
+ * has been advised of the possibility of such damages.
+ *
+ * 9. Accepting Warranty or Additional Liability. While redistributing
+ * the Work or Derivative Works thereof, You may choose to offer,
+ * and charge a fee for, acceptance of support, warranty, indemnity,
+ * or other liability obligations and/or rights consistent with this
+ * License. However, in accepting such obligations, You may act only
+ * on Your own behalf and on Your sole responsibility, not on behalf
+ * of any other Contributor, and only if You agree to indemnify,
+ * defend, and hold each Contributor harmless for any liability
+ * incurred by, or claims asserted against, such Contributor by reason
+ * of your accepting any such warranty or additional liability.
+ *
+ * END OF TERMS AND CONDITIONS
+ *
+ * APPENDIX: How to apply the Apache License to your work.
+ *
+ * To apply the Apache License to your work, attach the following
+ * boilerplate notice, with the fields enclosed by brackets "[]"
+ * replaced with your own identifying information. (Don't include
+ * the brackets!) The text should be enclosed in the appropriate
+ * comment syntax for the file format. We also recommend that a
+ * file or class name and description of purpose be included on the
+ * same "printed page" as the copyright notice for easier
+ * identification within third-party archives.
+ *
+ * Copyright [yyyy] [name of copyright owner]
+ *
+ * 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.
+ */
+
+W3C SOFTWARE NOTICE AND LICENSE
+http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
+
+This work (and included software, documentation such as READMEs, or other
+related items) is being provided by the copyright holders under the following
+license. By obtaining, using and/or copying this work, you (the licensee) agree
+that you have read, understood, and will comply with the following terms and
+conditions.
+
+Permission to copy, modify, and distribute this software and its documentation,
+with or without modification, for any purpose and without fee or royalty is
+hereby granted, provided that you include the following on ALL copies of the
+software and documentation or portions thereof, including modifications:
+
+ 1. The full text of this NOTICE in a location viewable to users of the
+ redistributed or derivative work.
+ 2. Any pre-existing intellectual property disclaimers, notices, or terms
+ and conditions. If none exist, the W3C Software Short Notice should be
+ included (hypertext is preferred, text is permitted) within the body
+ of any redistributed or derivative code.
+ 3. Notice of any changes or modifications to the files, including the date
+ changes were made. (We recommend you provide URIs to the location from
+ which the code is derived.)
+
+THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE
+NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT
+THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY
+PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
+
+COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION.
+
+The name and trademarks of copyright holders may NOT be used in advertising or
+publicity pertaining to the software without specific, written prior permission.
+Title to copyright in this software and any associated documentation will at
+all times remain with copyright holders.
+
+____________________________________
+
+This formulation of W3C's notice and license became active on December 31 2002.
+This version removes the copyright ownership notice such that this license can
+be used with materials other than those owned by the W3C, reflects that ERCIM
+is now a host of the W3C, includes references to this specific dated version of
+the license, and removes the ambiguous grant of "use". Otherwise, this version
+is the same as the previous version and is written so as to preserve the Free
+Software Foundation's assessment of GPL compatibility and OSI's certification
+under the Open Source Definition. Please see our Copyright FAQ for common
+questions about using materials from our site, including specific terms and
+conditions for packages like libwww, Amaya, and Jigsaw. Other questions about
+this notice can be directed to site-policy@w3.org.
+
+Joseph Reagle <site-policy@w3.org>
+
+This license came from: http://www.megginson.com/SAX/copying.html
+ However please note future versions of SAX may be covered
+ under http://saxproject.org/?selected=pd
+
+SAX2 is Free!
+
+I hereby abandon any property rights to SAX 2.0 (the Simple API for
+XML), and release all of the SAX 2.0 source code, compiled code, and
+documentation contained in this distribution into the Public Domain.
+SAX comes with NO WARRANTY or guarantee of fitness for any
+purpose.
+
+David Megginson, david@megginson.com
+2000-05-05
diff --git a/love2dToAPK/tools/tools/ant/NOTICE b/love2dToAPK/tools/tools/ant/NOTICE
new file mode 100644
index 0000000..a9957fc
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/NOTICE
@@ -0,0 +1,9 @@
+Apache Ant
+Copyright 1999-2015 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+The <sync> task is based on code Copyright (c) 2002, Landmark
+Graphics Corp that has been kindly donated to the Apache Software
+Foundation.
diff --git a/love2dToAPK/tools/tools/ant/README b/love2dToAPK/tools/tools/ant/README
new file mode 100644
index 0000000..9510941
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/README
@@ -0,0 +1,97 @@
+
+ A N T
+
+
+ What is it?
+ -----------
+
+ Ant is a Java based build tool. In theory it is kind of like "make"
+ without makes wrinkles and with the full portability of pure java code.
+
+
+ Why?
+ ----
+
+ Why another build tool when there is already make, gnumake, nmake, jam,
+ and others? Because all of those tools have limitations that its original
+ author couldn't live with when developing software across multiple platforms.
+
+ Make-like tools are inherently shell based. They evaluate a set of
+ dependencies and then execute commands not unlike what you would issue on a
+ shell. This means that you can easily extend these tools by using or writing
+ any program for the OS that you are working on. However, this also means that
+ you limit yourself to the OS, or at least the OS type such as Unix, that you
+ are working on.
+
+ Makefiles are inherently evil as well. Anybody who has worked on them for any
+ time has run into the dreaded tab problem. "Is my command not executing
+ because I have a space in front of my tab!!!" said the original author of Ant
+ way too many times. Tools like Jam took care of this to a great degree, but
+ still use yet another format to use and remember.
+
+ Ant is different. Instead a model where it is extended with shell based
+ commands, it is extended using Java classes. Instead of writing shell
+ commands, the configuration files are XML based calling out a target tree
+ where various tasks get executed. Each task is run by an object which
+ implements a particular Task interface.
+
+ Granted, this removes some of the expressive power that is inherent by being
+ able to construct a shell command such as `find . -name foo -exec rm {}` but
+ it gives you the ability to be cross platform. To work anywhere and
+ everywhere. And hey, if you really need to execute a shell command, Ant has
+ an exec rule that allows different commands to be executed based on the OS
+ that it is executing on.
+
+ The Latest Version
+ ------------------
+
+ Details of the latest version can be found on the Apache Ant
+ Project web site <http://ant.apache.org/>.
+
+
+ Documentation
+ -------------
+
+ Documentation is available in HTML format, in the docs/ directory.
+ For information about building and installing Ant, see
+ docs/manual/index.html
+
+
+ Licensing
+ ---------
+
+ This software is licensed under the terms you may find in the file
+ named "LICENSE" in this directory.
+
+ This distribution includes cryptographic software. The country in
+ which you currently reside may have restrictions on the import,
+ possession, use, and/or re-export to another country, of
+ encryption software. BEFORE using any encryption software, please
+ check your country's laws, regulations and policies concerning the
+ import, possession, or use, and re-export of encryption software, to
+ see if this is permitted. See <http://www.wassenaar.org/> for more
+ information.
+
+ The U.S. Government Department of Commerce, Bureau of Industry and
+ Security (BIS), has classified this software as Export Commodity
+ Control Number (ECCN) 5D002.C.1, which includes information security
+ software using or performing cryptographic functions with asymmetric
+ algorithms. The form and manner of this Apache Software Foundation
+ distribution makes it eligible for export under the License Exception
+ ENC Technology Software Unrestricted (TSU) exception (see the BIS
+ Export Administration Regulations, Section 740.13) for both object
+ code and source code.
+
+ The following provides more details on the included cryptographic
+ software:
+
+ For the SSH family of tasks (<sshexec> and <scp>) Ant requires the
+ JSch <http://www.jcraft.com/jsch/index.html> library as well as the
+ Java Cryptography extensions
+ <http://java.sun.com/javase/technologies/security/>. Ant does not
+ include these libraries itself, but is designed to use them.
+
+ Thanks for using Ant.
+
+ The Apache Ant Project
+ <http://ant.apache.org/>
diff --git a/love2dToAPK/tools/tools/ant/WHATSNEW b/love2dToAPK/tools/tools/ant/WHATSNEW
new file mode 100644
index 0000000..9a6d478
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/WHATSNEW
@@ -0,0 +1,6263 @@
+Changes from Ant 1.9.5 TO Ant 1.9.6
+===================================
+
+Changes that could break older environments:
+-------------------------------------------
+
+Fixed bugs:
+-----------
+
+ * ArrayIndexOutOfBoundsException when ZIP extra fields are read and
+ the entry contains an UnparseableExtraField.
+ https://issues.apache.org/jira/browse/COMPRESS-317
+
+Other changes:
+--------------
+ * Hidden <javaconstant> resource is published now. It reads the
+ value of a specified java constant.
+
+
+Changes from Ant 1.9.4 TO Ant 1.9.5
+===================================
+
+Changes that could break older environments:
+-------------------------------------------
+
+ * The ReplaceTokens filter can now use token-separators longer than
+ one character. This means it can be used to replace mustache-style
+ {{patterns}} and similar templates. This is going to break code
+ that invokes the setters on ReplaceTokens via the Java API as their
+ parameters have been changed from char to String. It may also
+ break build files that specified multi character tokens and relied
+ on Ant silently ignoring all but the first character.
+ Bugzilla Report 56584
+
+ * The changes that added <get>'s support for gzip encoding
+ automatically uncompressed content that would not have been touched
+ before - like when downloading .tar.gz files. A new flag has been
+ added to control the behavior and its default will make <get> work
+ as it did in 1.9.3. I.e. if you want it to work like 1.9.4
+ you have to explicitly set tryGzipEncoding to true.
+ Bugzilla Report 57048
+
+Fixed bugs:
+-----------
+
+ * TarArchiveInputStream failed to read archives with empty gid/uid
+ fields.
+ Bugzilla Report 56641
+
+ * TarArchiveInputStream could throw IOException when reading PAX
+ headers from a "slow" InputStream.
+
+ * XMLJunitResultFormatter could throw NullPointerException if Java
+ cannot determine the local hostname.
+ Bugzilla Report 56593
+
+ * URLResource#getLastModified tried to access the connection to the
+ URL without making sure it was established, potentially leading to
+ a NullPointerException when using FTP.
+ Bugzilla Report 56873
+
+ * Long-Name and -link or PAX-header entries in TAR archives
+ always had the current time as last modfication time, creating
+ archives that are different at the byte level each time an
+ archive was built.
+
+ * runant.py should now work as well when the path of the Java executable
+ contains spaces.
+ github pull request #1
+
+ * <junitreport> now supports nested <classpath> and <factory> elements.
+ Bugzilla Report 47002
+
+ * complete-ant-cmd.pl now also knows about the -file option.
+ Bugzilla Report 57371
+
+ * the br-replace template inside the XSLT stylesheets used by
+ <junitreport> could cause stack overflows or out-of-memory errors
+ when applied to big outputs.
+ Bugzilla Report 57341
+
+ * removed spurious warning about unclosed ZipFiles when reading the
+ archive failed.
+ Port of https://issues.apache.org/jira/browse/COMPRESS-297
+
+ * FileUtils.rename which is used by several tasks can throw a
+ NullPointerException if the "normal" renameTo operation fails and
+ an exception occurs while rename falls back to copying and deleting
+ the file.
+ Bugzilla Report 57533
+
+ * complete-ant-cmd.pl would incorrectly suggest words from the build
+ file description.
+ Bugzilla Report 51931
+
+ * complete-ant-cmd.pl now also completes tasks without a description.
+ Bugzilla Report 57542
+
+ * LocalPropertyStack could run into ConcurrentModificationException
+ when tasks spawned new child threads that accessed the properties.
+ Bugzilla Report 55074
+
+ * TarEntry's constructor with a File and a String arg didn't
+ normalize the name.
+
+ * Between 1.8.4 and 1.9.0 TarInputStream started to parse file
+ names using the platform's default encoding rather than as ASCII.
+ This has been a breaking change that has never been marked as such
+ (in fact it went unnoticed). In order to allow <untar> and
+ <tarfileset> to work on platforms who's encoding doesn't match the
+ encoding of file names inside the archive, both now support
+ encoding attributes.
+ The attribute has also been added to <tar> for symmetry.
+ Bugzilla Report 57822
+
+Other changes:
+--------------
+
+ * it is now possible to provide proxy configuration to signjar
+ when using the timestamped authority.
+ Bugzilla Report 56678
+
+ * complete-ant-cmd.pl now also analyzes the ANT_ARGS environment
+ variable.
+ Bugzilla Report 57371
+
+ * ported some of the write-optimization of Commons Compress 1.10 to
+ the ZIP package
+
+ * adapted unit tests to Java9 and added "javac1.9" as valid option
+ for javac's compiler attribute.
+
+ * performance improvements for <intersect>
+ Bugzilla Report 57588
+
+ * MailLogger can now add CC and BCC addresses.
+ Bugzilla Report 57789.
+
+ * <scp>'s buffer size has been increased from 1k to 100k to match
+ <ftp> and <get>.
+ github pull requests #8 and #9
+
+ * The tar package can now deal with group and user ids bigger than
+ 0x80000000.
+ https://issues.apache.org/jira/browse/COMPRESS-314
+ https://issues.apache.org/jira/browse/COMPRESS-315
+
+ * <scp> has new attributes fileMode and dirMode that control the
+ permissions on the remote side when sending data via SSH.
+ Bugzilla Report 43271.
+
+ * New <allbutlast> and <allbutfirst> resource collections can be used
+ to select all but a given subset of a resource collection.
+ Bugzilla Report 57834.
+
+Changes from Ant 1.9.3 TO Ant 1.9.4
+===================================
+
+Changes that could break older environments:
+-------------------------------------------
+
+ * the prefixValues attribute of <property> didn't work as expected
+ when set to false (the default).
+ It is quite likely existing build files relied on the wrong
+ behavior and expect Ant to resolve the value side against the
+ properties defined in the property file itself - these build files
+ must now explicitly set the prefixValues attribute to true.
+ Bugzilla Report 54769
+
+ * when matching an entry of a zip/tarfileset against a pattern a
+ leading slash will be stripped from the entry name. Most archives
+ don't contain paths with leading slashes anyway.
+ This may cause include/exclude patterns that start with a / to stop
+ matching anything. Such patterns only used to work by accident and
+ only on platforms with multiple file system roots.
+ Bugzilla Report 53949
+
+ * DirectoryScanner and thus fileset/dirset will now silently drop all
+ filesystem objects that are neither files nor directories according
+ to java.io.File. This prevents Ant from reading named pipes which
+ might lead to blocking or other undefined behavior.
+ Bugzilla Report 56149
+
+ * BuildFileTest and BaseSelectorTest have both been deprecated in
+ favour of BuildFileRule and BaseSelectorRule respectively, and the
+ tests that previously extended these base tests have been converted to
+ JUnit 4 tests using the new "rule"s. Any external test that sub-classed
+ a test in the Ant workspace, rather than BuildFileTest, will need
+ changed to either use JUnit4's annotations, or be modified to
+ extend BuildFileTest directly. This will not affect any tests that are
+ being executed by Ant's junit or batchtest tasks that are not specifically
+ testing Ant's code.
+
+Fixed bugs:
+-----------
+
+ * <import>/<include> failed when the importing file was loaded from an
+ URI or a jar and it imported a file from the local file system via
+ an absolute path.
+ Bugzilla Report 50953
+
+ * <import> could import the same resource twice when imported via
+ different resource types.
+ Bugzilla Report 55097
+
+ * several calls to File#mkdirs could fall victim to a race condition
+ where another thread already created the same directory.
+ Bugzilla Report 55290
+
+ * <manifestclasspath> created '/' rather than './' for the parent
+ directory of the given jarfile.
+ Bugzilla Report 55049
+
+ * <concat>'s fixlastline="true" didn't work when using certain filter
+ readers.
+ Bugzilla Report 54672
+
+ * several places where resources are read from jars will now
+ explicitly disable caching to avoid problems with reloading jars.
+ Bugzilla Report 54473
+
+ * AntClassloader will now ignore files that are part of the classpath
+ but not zip files when scanning for resources. It used to throw an
+ exception.
+ Bugzilla Report 53964
+
+ * <javadoc> caused a NullPointerException when no destdir was set.
+ Bugzilla Report 55949
+
+ * <jar filesetmanifest="mergewithoutmain"> would still include the
+ Main section of the fileset manifests if there was no nested
+ manifest or manifest attribute.
+ Bugzilla Report 54171
+
+ * reading of compiler args has become more defensive
+ Bugzilla Report 53754
+
+ * <copy> without force="true" would not only fail to overwrite a
+ read-only file as expected but also remove the existing file.
+ Bugzilla Report 53095
+
+ * <delete removeNotFollowedSymlinks="true"> would remove symbolic
+ links to not-included files. It will still delete symlinks to
+ directories that would have been followed even if they are not
+ explicitly included. exclude-Patterns can still be used to
+ preserve symbolic links.
+ Bugzilla Report 53959
+
+ * Sometimes copy-operations using NIO FileChannels fail. Ant will
+ now try to use a Stream based copy operation as fallback when the
+ Channel based copy fails.
+ Bugzilla Reports 53102 and 54397
+
+ * Javadoc.postProcessGeneratedJavadocs() fails for Classes that
+ extend Javadoc
+ Bugzilla Report 56047
+
+ * TarInputStream will now read archives created by tar
+ implementations that encode big numbers by not adding a trailing
+ NUL.
+
+ * the isExists() method of URLResource returned false positives for
+ HTTP and FTP URLs.
+
+Other changes:
+--------------
+
+ * initial support for Java 1.9
+
+ * <sshexec> can optionally pass System.in to the remote process
+ Bugzilla Report 55393
+
+ * <sshexec> now supports capturing error output of the executed
+ process and setting a property from the return code.
+ Bugzilla Report 48478
+
+ * <javadoc> now has an option to fail if javadoc issues warnings.
+ Bugzilla Report 55015
+
+ * <sql> has a new outputencoding attribute.
+ Bugzilla Report 39541
+
+ * changes to JUnitTestRunner and PlainJUnitResultFormatter to make
+ OutOfMemoryErrors less likely.
+ Bugzilla Report 45536
+
+ * changes to DOMElementWriter to make OutOfMemoryErrors less likely.
+ Bugzilla Report 54147
+
+ * <redirector> has a new attribute binaryOutput that prevents Ant
+ from splitting the output into lines. This prevents binary output
+ from being corrupted but may lead to error and normal output being
+ mixed up.
+ Bugzilla Report 55667
+ Bugzilla Report 56156
+
+ * the nested <message> elements of <mail> now have an optional
+ inputEncoding attribute that can be used to specify the encoding of
+ files read that don't use the platform's default encoding.
+ Bugzilla Report 56258
+
+ * The <get> task now explicitly accepts and supports the gzip content encoding.
+ Bugzilla Report 49453
+
+ * A new resourcecollection type <multirootfileset> acts like a union
+ of <fileset>s and <dirset>s that share the same configuration but
+ have different base directories.
+ Bugzilla Report 48621
+
+ * <get> has a quiet attribute that makes the task log errors only
+ when enabled.
+ GitHub Pull Request #1
+
+* <junit> has now a threads attribute allowing to run the tests in several threads.
+ Bugzilla Report 55925
+
+* addition of a new ProcessUtil class providing the process id of the current process
+
+* changes to allow to run the JUnit testcases of Ant in parallel,
+ by making them use unique temporary directories
+
+Changes from Ant 1.9.2 TO Ant 1.9.3
+===================================
+
+Fixed bugs:
+-----------
+
+ * <parallel> swallowed the status code of nested <fail> tasks.
+ Bugzilla Report 55539.
+
+ * a race condition could make <fixcrlf> tasks of parallel builds to
+ interfere with each other.
+ Bugzilla Report 54393.
+
+ * <mail>'s mailport still didn't work properly when using smtps.
+ Bugzilla Report 49267.
+
+ * using attributes belonging to the if and unless namespaces
+ made macrodef fail.
+ Bugzilla Report 55885.
+
+ * Ant 1.8 exec task changes have slowed exec to a crawl
+ Bugzilla Report 54128.
+
+ * Apt is not available under JDK 1.8
+ Bugzilla Report 55922.
+
+
+Other changes:
+--------------
+
+ * Documentation fix for if/unless attributes. PR 55359.
+
+ * tar entries with long link names are now handled the same way as
+ entries with long names.
+
+ * Addition of 'skipNonTests' attribute to <junit> and <batchtest>
+ tasks to allow the tasks to skip classes that don't contain tests.
+
+ * <filterset> now supports a nested <propertyset> to specify filters.
+ Bugzilla Report 55794.
+
+ * <xslt>'s params can now be typed.
+ Bugzilla Report 21525.
+
+ * build of Mac OS X pkg installer
+ Bugzilla Report 55899.
+
+Changes from Ant 1.9.1 TO Ant 1.9.2
+===================================
+
+Fixed bugs:
+-----------
+
+ * Parsing of zip64 extra fields has become more lenient in order to
+ be able to read archives created by DotNetZip and maybe other
+ archivers as well.
+
+ * TarInputStream should now properly read GNU longlink entries' names.
+ Bugzilla Report 55040.
+
+ * <java> and <exec> used to be too restrictive when evaluating
+ whether a given set of options is compatible with spawning the new
+ process.
+ Bugzilla Report 55112.
+
+Other changes:
+--------------
+
+ * <javadoc> will now post-process the generated in order to mitigate
+ the frame injection attack possible in javadocs generated by Oracle
+ JDKs prior to Java7 Update 25. The vulnerability is known as
+ CVE-2013-1571.
+ There is an option to turn off the post-processing but it is only
+ recommended you do so if all your builds use a JDK that's not
+ vulnerable.
+ Bugzilla Report 55132.
+
+Changes from Ant 1.9.0 TO Ant 1.9.1
+===================================
+
+Changes that could break older environments:
+-------------------------------------------
+
+ * Users who have their own ProjectHelper implementation will need to change it because the import and include tasks
+ will now default the targetPrefix to ProjectHelper.USE_PROJECT_NAME_AS_TARGET_PREFIX.
+ Users using the default ProjectHelper2 with ant need not worry about this change done to fix Bugzilla Report 54940.
+
+
+Fixed bugs:
+-----------
+
+ * Corrected XSLTC error in <junitreport>.
+ Bugzilla Report 54641.
+
+ * Provide more control over Zip64 extensions created by <zip> and
+ related tasks. In particular no Zip64 extensions will be used at
+ all by the <jar> task family by default - this is required for jars
+ to be readably by Java5.
+ Bugzilla Report 54762.
+
+ * Fixed loading of external dependencies in JUnit task.
+ Bugzilla Report 54835.
+
+ * Target rewriting for nested "include" only works when "as" is specified.
+ See also "Changes that could break older environments"
+ Bugzilla Report 54940.
+
+
+Other changes:
+--------------
+
+ * strict attribute added to <signjar>.
+ Bugzilla Report 54889.
+
+ * simplifying Execute.getEnvironmentVariables since we are only running on Java 1.5 or higher now
+
+ * Added conditional attributes.
+ Bugzilla Report 43362
+
+ * Recommending to upgrade jsch to 0.1.50, particularly if you are using Java 1.7.
+ jsch is the library behind the sshexec and scp Ant tasks.
+ Versions of jsch older than 0.1.50 fail randomly under Java 1.7 with an error message "verify: false"
+
+Changes from Ant 1.8.4 TO Ant 1.9.0
+===================================
+
+Changes that could break older environments:
+-------------------------------------------
+
+ * Ant now requires at least Java 1.5 to compile and to run
+
+ * FixCRLF used to treat the EOL value ASIS to convert to the system property
+ line.separator. Specified was that ASIS would leave the EOL characters alone,
+ the task now really leaves the EOL characters alone. This also implies that
+ EOL ASIS will not insert a newline even if fixlast is set to true.
+ Bugzilla report 53036
+
+ * The CommandLauncher hierarchy that used to be a set of inner
+ classes of Execute has been extracted to the
+ org.apache.tools.ant.taskdefs.launcher package.
+
+ * Any FileResource whose represented File has a parent also has a basedir.
+
+ * Removing the Perforce Ant tasks replaced by tasks supplied by Perforce Inc.
+
+ * Setting the default encoding of StringResource to UTF-8 instead of null
+
+ * Upgrade JUnit 4 to JUnit 4.11
+
+Fixed bugs:
+-----------
+
+ * Made VectorSet faster.
+ Bugzilla Report 53622.
+
+ * Incorrect URLs in Ant child POMs.
+ Bugzilla Report 53617.
+
+ * Subclasses of JUnitTask did not correctly find junit.jar.
+ Bugzilla Report 53571.
+
+ * External XML catalog resolver failed to use project basedir when given an
+ unmentioned relative path like the internal resolver does.
+ Bugzilla Report 52754.
+
+ * Fixed some potential stream leaks.
+ Bugzilla Reports 52738, 52740, 52742, 52743.
+
+ * Updated documentation to fix spelling errors / broken links.
+ Bugzilla Reports 53215, 53291, 53202
+
+ * Unable to override system properties. It was not possible not to override
+ system properties from the command line (or from a property file).
+ Bugzilla Report 51792
+
+ * <javac> by default fails when run on JDK 8.
+ Bugzilla Report 53347.
+
+ * ExtensionPoint doesn't work with nested import/include
+ Bugzilla Report 53405.
+
+ * <packagemapper> failed to strip the non-matched parts with
+ handledirsep="true".
+ Bugzilla Report 53399.
+
+ * <expandproperties> filter caused a NullPointerException when input
+ was empty.
+ Bugzilla Report 53626.
+
+ * <get> now supports HTTP redirects using status code 307.
+ Bugzilla Report 54374.
+
+ * ssh tasks prompt for kerberos username/password under Java 7
+ Bugzilla Report 53437.
+
+ * Zip task on <mappedresources> that excludes certain files by way of the mapper resulted in a NullPointerException
+ Bugzilla Report 54026
+
+ * The ant launcher script should properly detect JAVA_HOME on
+ MacOS X 10.7
+ Bugzilla Report 52632
+
+ * Depend task does not handle invokeDynamic constant pool entries - java.lang.ClassFormatError: Invalid Constant Pool entry Type 18
+ Bugzilla Report 54090
+
+ * Base64Converter not properly handling bytes with MSB set (not masking byte to int conversion)
+ Bugzilla Report 54460
+
+ * The size resource comparator would return wrong results if file
+ sizes differed by more than 2 GB.
+ Bugzilla Report 54623
+
+ * Unable to encode properly into UTF-8 when the system property file.encoding is
+ set to ANSI_X3.4-1968.
+ Bugzilla Report 54606
+
+ * JUnit4 tests marked @Ignore do not appear in XML output
+ Bugzilla Report 43969
+
+Other changes:
+--------------
+
+ * merged the ZIP package from Commons Compress, it can now read
+ archives using Zip64 extensions (files and archives bigger that 4GB
+ and with more that 64k entries).
+
+ * a new task <commandlauncher> can be used to configure the
+ CommandLauncher used by Ant when forking external programs or new
+ Java VMs.
+ Bugzilla Report 52706.
+
+ * merged the TAR package from Commons Compress, it can now read
+ archives using POSIX extension headers and STAR extensions.
+
+ * merged the BZIP2 package from Commons Compress, it can now
+ optionally read files that contain multiple streams properly.
+
+ * <bunzip2> will now properly expand files created by pbzip2 and
+ similar tools that create files with multiple bzip2 streams.
+
+ * <tar> now supports a new "posix" option for longfile-mode which
+ will make it create PAX extension headers for long file names. PAX
+ extension headers are supported by all modern implementations of
+ tar including GNU tar.
+ This option should now be used in preference to "warn" or "gnu" as
+ it is more portable. For backwards compatibility reasons "warn"
+ will still create "gnu" extensions rather than "posix" extensions.
+
+ * The ProjectHelper class now exposes a method to be used by third party
+ implementations to properly resolve the binding between target extensions
+ and extension points.
+ Bugzilla Report 53549.
+
+ * Make extension point bindable to imported prefixed targets
+ Bugzilla Report 53550.
+
+ * Add the possibility to register a custom command line argument processor.
+ See org.apache.tools.ant.ArgumentProcessor and manual/argumentprocessor.html
+
+ * add the possibility to suppress stdout in the sshexec task.
+ Bugzilla Report 50270.
+
+ * add an encoding attribute to the contains selector.
+ This will be useful to use the contains selector if the encoding of the VM is different from the encoding
+ of the files being selected.
+
+ * support for GNU Classpath.
+ Bugzilla report 54760.
+
+Changes from Ant 1.8.3 TO Ant 1.8.4
+===================================
+
+Fixed bugs:
+-----------
+
+ * Ported libbzip2's fallback sort algorithm to CBZip2OutputStream to
+ speed up compression in certain edge cases. Merge from Commons
+ Compress.
+
+ Using specially crafted inputs this can be used as a denial of
+ service attack.
+ See http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2012-2098
+
+Changes from Ant 1.8.2 TO Ant 1.8.3
+===================================
+
+Changes that could break older environments:
+-------------------------------------------
+
+ * The Enumeration returned by AntClassLoader#getResources used to
+ return null in nextElement after hasNextElement would return false.
+ It has been changed to throw a NoSuchElementException instead so
+ that it now adheres to the contract of java.util.Enumeration.
+ Bugzilla Report 51579.
+
+Fixed bugs:
+-----------
+
+ * Removed buggy duplicate JAR list in RPM mode.
+ Bugzilla Report 52556.
+
+ * Launcher fixed to pass the right class loader parent.
+ Bugzilla Report 48633.
+
+ * <junitreport> mishandled ${line.separator}.
+ Bugzilla Report 51049.
+
+ * <junitreport> did not work in embedded environments on JDK 7.
+ Nor did <xslt> when using Xalan redirects.
+ Bugzilla Report 51668, 52382.
+
+ * Encoding of unicode escape sequences by the property file task
+ Bugzilla Report 50515.
+
+ * The code that implicitly sets the -source switch if only -target
+ has been specified in <javac> was broken for Java 5 and 6.
+ Bugzilla Report 50578.
+
+ * MailLogger ignore the Maillogger.starttls.enable property.
+ Bugzilla Report 50668.
+
+ * Delete task example does not work
+ Bugzilla Report 50816.
+
+ * <splash>'s proxy handling has been delegated to <setproxy>
+ internally so the two tasks are consistent. <splash>'s way of not
+ setting a proxy caused problems with other Java libraries.
+ Bugzilla Report 50888.
+
+ * Include task breaks dependencies or extension-points for multiple
+ files.
+ Bugzilla Report 50866.
+
+ * Read on System.in hangs for forked java task.
+ Bugzilla Report 50960.
+
+ * FileResource specified using basedir/name attributes was non-functional.
+
+ * Resource collection implementation of mapped PropertySet returned
+ unusable resources.
+
+ * The hasmethod condition failed with a NullPointerException when
+ ignoresystemclasses is true and Ant tried to load a "restricted
+ class" - i.e. a class that the Java VM will only accept when loaded
+ via the bootclassloader (a java.* class).
+ It will now fail with a more useful error message.
+ Bugzilla Report 51035.
+
+ * Exec task may mix the stderr and stdout output while logging it
+ Bugzilla Report 50507.
+
+ * Missing space between "finished" and timestamp in task/target
+ finish message from ProfileLogger.
+ Bugzilla Report 51109.
+
+ * Redirecting the output of a java, exec or apply task could print in the
+ error output stream some "Pipe broken" errors.
+ Bugzilla Report 48789.
+
+ * ZipFile failed to clean up some resources which could lead to
+ OutOfMemoryException while unzipping large archives.
+ A similar problem in ZipArchiveOutputStream has been fixed as well.
+ Bugzilla Report 42696.
+
+ * quiet attribute added to the copy and move tasks, to be used together
+ with failonerror=false, so warnings won't get logged
+ Bugzilla Report 48789.
+
+ * System.in was closed and not readable anymore by the DefaultInputHandler
+ when Ant is used via its Java API.
+ Bugzilla Report 51161
+
+ * <sync> only supported a single non-fileset resource collection even
+ though the manual said it could be multiple.
+
+ * <sync> didn't work properly when working on resource collections.
+ Bugzilla Report 51462.
+
+ * <augment> cause a NullPointerException if it was used in a target
+ that was invoked by multiple targets from the command line.
+ Bugzilla Report 50894.
+
+ * The ZipFile class could read past the start of the file if the
+ given file is not a ZIP archive and it is smaller than the size of
+ a ZIP "end of central directory record".
+
+ * <javac> would create the empty package-info.class file in the wrong
+ directory if no destdir was specified. Note it may still pick the
+ wrong directory if you specify more than one source directory but
+ no destDir. It is highly recommended that you always explicitly
+ specify the destDir attribute.
+ Bugzilla Report 51947.
+
+ * packagemapper now honors the handleDirSep attribute.
+ Bugzilla Report 51086.
+
+ * the attributes of macrodef tasks had their values run through
+ property expansion twice. Still true by default, but can be disabled.
+ Bugzilla Report 42046.
+
+ * jvc doesn't like it if source file names in argument files are
+ quoted.
+ Bugzilla Report 31667.
+
+ * ZipFile didn't work properly for archives using unicode extra
+ fields rather than UTF-8 filenames and the EFS-Flag.
+
+ * Access to DirectoryScanner's default excludes wasn't synchronized.
+ Bugzilla Report 52188.
+
+ * When a Project instance was created by a custom tasks its
+ createTask method didn't work.
+ Bugzilla Report 50788.
+
+Other changes:
+--------------
+
+ * -f/-file/-buildfile accepts a directory containing build.xml.
+
+ * The <javacc>, <jjtree> and <jjdoc> now support a new maxmemory
+ attribute.
+ Bugzilla Report 50513.
+
+ * the documented inputstring attribute of sshexec has been
+ implemented and the actually existing attribute inputproperty
+ documented.
+ Bugzilla Report 50576.
+
+ * The concat task now permits the name of its exposed resource
+ by means of its 'resourcename' attribute.
+
+ * The expandproperties filter now accepts a nested propertyset
+ which, if specified, provides the properties for expansion.
+ Bugzilla Report 51044.
+
+ * <junit filtertrace="true"/> will no longer filter out the very
+ first line of the stacktrace containing the original exception
+ message even if it matches one of the filter expressions.
+
+ * Upgraded to Apache AntUnit 1.2
+
+ * Provide read access to Mkdir.dir. Bugzilla Report 51684.
+
+ * <delete> and <move> have a new attribute performGCOnFailedDelete
+ that may - when set to true - help resolve some problems with
+ deleting empty directories on NFS shares.
+ Bugzilla Report 45786.
+
+ * <loadfile> and <loadresource> used to log at level INFO to signal a
+ property hasn't been set when the resource was empty even if the
+ quiet attribute was set to true. They will now use VERBOSE
+ instead.
+ Bugzilla Report 52107.
+
+ * <javac> has a new attribute createMissingPackageInfoClass that can
+ be set to false to prevent Ant from creating empty dummy classes
+ used for up-to-date-ness checks.
+ Bugzilla Report 52096.
+
+ * URLResources#isExists has become less noisy.
+ Bugzilla Report 51829.
+
+ * The <retry> task has a new optional attribute retryDelay that can
+ be used to make the task sleep between retry attempts.
+ Bugzilla Report 52076.
+
+ * <signjar> has new attributes that control the signature and digest
+ algorithms.
+ Bugzilla Report 52344.
+
+ * Initial support for Java 8.
+
+ * <sshexec> can optionally create a pseudo terminal (like ssh -t)
+ Bugzilla Report 52554.
+
+Changes from Ant 1.8.1 TO Ant 1.8.2
+===================================
+
+Changes that could break older environments:
+-------------------------------------------
+
+ * Prior to Ant 1.8.0 the <copy> task and several other tasks would
+ overwrite read-only destination files. Starting with 1.8.0 they
+ would only do so under special circumstances. Ant 1.8.2 now
+ consistently won't replace a read-only file by default. The same is
+ true for a number of other tasks.
+ The <copy>, <move> and <echo> tasks now have a new force attribute
+ and <concat> has a new forceReadonly attribute that can be used to
+ make the task overwrite read-only destinations.
+ Bugzilla Report 49261.
+
+ * Removed ant-nodeps.jar; it is now merged into ant.jar.
+
+ * DOMElementWriter#encode used to employ special code before encoding
+ ampersands so that &#123; remained &#123; rather than being turned
+ into &amp;#123;. This is no longer the case, ampersands will now
+ be encoded unconditionally.
+ Also DOMElementWriter#encodeData will treat CDATA sections containing a
+ literal "]]>" sequence different now - it will split the CDATA
+ section between the second "]" and ">" and create two sections.
+ This affects <echoxml> task as well as the XML logger or JUnit
+ formatter where ampersands will now always get encoded.
+ In addition DOMElementWriter will now replace the characters \t, \r
+ and \n in attribute values by entity references.
+ Bugzilla Report 49404.
+
+ * The list elements returned by ProjectHelper#getExtensionStack are
+ now String arrays of length 3 rather than 2 in order to support the
+ onMissingExtensionPoint attribute.
+ Bugzilla Report 49473.
+
+ * When using <property file="..." prefix="..."/> properties defined
+ inside the same file will only get used in expansions if the ${}
+ reference uses the same prefix. This is different from Ant 1.8.1
+ but is the same behavior Ant 1.8.0 and earlier exhibited.
+ A new attribute prefixValues can be used to re-enable the behavior
+ of Ant 1.8.1.
+ Bugzilla Report 49373.
+
+ * The files and directories used by Git, Mercurial and Bazaar to
+ store their information are now excluded by the defaultexcludes.
+ Bugzilla Report 49624.
+
+ * The <junit> task no longer generates TestListener events - which
+ have been introduced in ant 1.7.0 - by default. The task has a new
+ attribute enableTestListenerEvents and a new "magic" property
+ ant.junit.enabletestlistenerevents has been added that can be used
+ to reinstate the old behavior.
+
+Fixed bugs:
+-----------
+
+ * hostinfo now prefers addresses with a hostname over addresses without
+ a hostname, provided the addresses have the same scope.
+ For local lookup, no IP address will be put in NAME / DOMAIN anymore.
+ For remote lookup, if a host name was provided and only an IP address is
+ found, the IP address will no longer overwrite the host name provided to the
+ task.
+ Bugzilla Report 49513
+
+ * mmap-based file copy problems under JDK 1.4 on Linux.
+ Bugzilla Report 49430.
+
+ * The Sun JVM tries to mmap the entire file during a copy.
+ For large files this is not feasible.
+ We now explicitly request to copy at most 16 MiB per request.
+ Bugzilla Report 49326.
+
+ * DemuxInputStream.read() should return unsigned values
+ Bugzilla Report 49279.
+
+ * The MIME mailer ignored the port parameter when using SSL.
+ Bugzilla Report 49267.
+
+ * <xslt> ignored the classpath when using the default TraX processor.
+ Bugzilla Report 49271.
+
+ * <checksum>'s totalproperty only worked reliably if the same file
+ name didn't occur inside more than one directory.
+ Bugzilla Report 36748.
+
+ * <ftp> could fail to download files from remote subdirectories under
+ certain circumstances.
+ Bugzilla Report 49296.
+
+ * <junit> will now produce better diagnostics when it fails to delete
+ a temporary file.
+ Bugzilla Report 49419.
+
+ * Ant would often scan directories even though there were known to
+ only hold excluded files when evaluating filesets. This never
+ resulted in wrong results but degraded performance of the scan
+ itself.
+ Bugzilla Report 49420.
+
+ * <javac> failed for long command lines on OS/2.
+ Bugzilla Report 49425.
+
+ * <junitreport> did not handle encodings well for stdout/stderr.
+ Bugzilla Report 49418.
+
+ * <junit> could issue a warning about multiple versions of Ant on the
+ CLASSPATH if two CLASSPATH entries differed in case on a
+ case-insensitive file system.
+ Bugzilla Report 49041.
+
+ * The <restrict> resource collection was checking every resource even if
+ we actually just want the first one, like in the example of use of
+ resourcelist in the documentation (getting the first available resource
+ from a mirror list).
+
+ * A race condition could lead to build failures if multiple <mkdir>
+ tasks were trying to create the same directory.
+ Bugzilla Report 49572.
+
+ * the toString() method of the Resources class - and thus any
+ ${toString:} expansion of a reference to a <resources> element -
+ didn't iterate over its nested elements if it hadn't done so prior
+ to the toString invocation already.
+ Bugzilla Report 49588.
+
+ * <apply> in parallel mode didn't work together with a nested
+ <redirector> if maxparallel was <= 0 (the default) or no source
+ files matched.
+ Bugzilla Report 49594.
+
+ * <jar filesetmanifest="merge"> didn't work for manifests added via
+ <zipfileset>s that used the prefix or fullpath attributes.
+ Bugzilla Report 49605.
+
+ * <tempfile createfile="true"> would cause an error unless the prefix
+ attribute has been specified.
+ Bugzilla Report 49755.
+
+ * If forked, after finished <java> was still reading the input stream
+ for a bunch of characters, then stealing them from a following <input>.
+ Bugzilla Report 49119.
+
+ * Ant could be leaking threads for each forked process (started by
+ <exec>, <apply>, <java> or similar tasks) that didn't receive input
+ from a resource or string explicitly.
+ Bugzilla Report 49587.
+
+ * Project#setDefault threw an exception when null was passed in as
+ argument, even though the Javadoc says null is a valid value.
+ Bugzilla Report 49803.
+
+ * runant.py would swallow the first argument if CLASSPATH wasn't set.
+ Bugzilla Report 49963.
+
+ * <taskdef> failed to load resources from jar files contained in a
+ directory that has a "!" in its name.
+ Bugzilla Report 50007.
+
+ * ant.bat exit strategy improvements and issues
+ make the exit codes work in environments where 4NT or MKS are installed
+ Bugzilla Report 41039.
+
+ * <signjar> would fail if used via its Java API and the File passed
+ into the setJar method was not "normalized" (i.e. contained ".."
+ segments).
+ Bugzilla Report 50081.
+
+ * <delete> ignored <fileset>'s errorOnMissingDir attribute
+ Bugzilla Report 50124.
+
+ * <symlink> failed to close files when reading a list of symbolic
+ links from a properties file.
+ Bugzilla Report 50136.
+
+ * <parallel> could allow tasks to start executing even if a task
+ scheduled to run before them timed out.
+ Bugzilla Report 49527.
+
+ * If a <junit> batch with multiple tests times out Ant logs a message
+ about a test named Batch-With-Multiple-Tests since 1.8.0 but the
+ logic that determined the Java package of this pseudo-test has been
+ wrong.
+ Bugzilla Report 45227.
+
+ * <propertyfile> didn't preserve the original linefeed style when
+ updating a file.
+ Bugzilla Report 50049.
+
+ * <zip>'s whenEmpty behavior never consulted the non-fileset
+ resources so the task could fail even though resources have been
+ provided using non-fileset resource collections.
+ Bugzilla Issue 50115.
+
+* ftp chmod could throw a NPE.
+ Bugzilla report 50217.
+
+* The project help (-p option in the command line) will now print
+ the dependencies of the targets in debug mode (-d on the command
+ line)
+
+Other changes:
+--------------
+
+ * <concat>'s force attribute has been deprecated in favor of a new
+ overwrite attribute that is consistent with <copy>'s attribute
+ names.
+
+ * You can now specify a list of methods to run in a JUnit test case.
+ Bugzilla Report 34748.
+
+ * properties in files read because of the -propertyfile command line
+ option will now get resolved against other properties that are
+ defined before the project starts executing (those from the same or
+ earlier -propertfiles or defined via the -D option).
+ Bugzilla Report 18732.
+
+ * <pathelement>s can now contain wildcards in order to use wildcard
+ CLASSPATH entries introduced with Java6.
+ The wildcards are not expanded or even evaluated by Ant and will be
+ used literally. The resulting path may be unusable as a CLASSPATH
+ for Java versions prior to Java6 and likely doesn't mean anything
+ when used in any other way than a CLASSPATH for a forked Java VM.
+ Bugzilla Report 46842.
+
+ * A new attribute allows targets to deal with nonexistent extension
+ points, i.e. they can extend an extension-point if it has been
+ defined or silently work as plain targets if it hasn't. This is
+ useful for targets that get included/imported in different
+ scenarios where a given extension-point may or may not exist.
+ Bugzilla Report 49473.
+
+ * Ant now logs a warning message if it fails to change the file
+ modification time in for example when using <touch> or preserving
+ timestamps in various tasks.
+ Bugzilla Report 49485.
+
+ * ProjectHelpers can now be installed dynamically via the <projecthelper>
+ Ant task.
+
+ * <import> is now able to switch to the proper ProjectHelper to parse
+ the imported resource. This means that several kinds of different build
+ files can import each other.
+
+ * <copy tofile=""> now also works for non-filesystem resources.
+ Bugzilla Report 49756.
+
+ * The <linecontainsregexp> filter now supports a casesensitive
+ attribute.
+
+ * The <containsregexp> selector now supports casesensitive, multiline
+ and singleline attributes.
+ Bugzilla Report 49764.
+
+ * A new <cutdirsmapper> can be used like wget's --cut-dirs option to
+ strip leading directories from file names.
+
+ * <javah> now supports the GNU project's gcjh compiler.
+ Bugzilla Report 50149.
+
+ * <checksum> supports additional views of a file's path as elements
+ for a custom pattern.
+ Bugzilla Report 50114.
+
+ * JUnit XMLResultAggregator logs the stack trace of caught IO exceptions
+ in verbose runs.
+ Bugzilla Report 48836.
+
+ * StringUtils.parseHumanSizes() should turn parse failures into
+ BuildExceptions.
+ Bugzilla Report 48835.
+
+ * New task <bindtargets> to make a list of targets bound to some
+ specified extension point.
+
+ * Initial support for OpenJDK7 has been added.
+
+ * Ant now uses java.net.CookieStore rather than
+ java.util.ServiceLocator to detect whether the environment is a
+ Java 1.6 system. This means releases of gcj/gij at the time of
+ this release of Ant are detected as Java 1.5 and not 1.6.
+ Bugzilla Report 50256.
+
+ * It is now possible to write a compiler adapter for <javac> that
+ compiles sources with extensions other than .java (but that still
+ compile to .class files).
+ Bugzilla Report 48829.
+
+ * The performance of VectorSet#add(Object) has been improved which
+ should also benefit any operation that scans directories in Ant.
+ Bugzilla Report 50200.
+
+Changes from Ant 1.8.0 TO Ant 1.8.1
+===================================
+
+Changes that could break older environments:
+-------------------------------------------
+
+ * ant-trax.jar is no longer produced since TrAX is included in JDK 1.4+.
+
+ * Ant no longer ships with Apache Xerces-J or the XML APIs but relies
+ on the Java runtime to provide a parser and matching API versions.
+
+ * The stylebook ant task and the ant-stylebook.jar are removed.
+
+Fixed bugs:
+-----------
+
+ * Tasks that iterate over task or type definitions, references or
+ targets now iterate over copies instead of the live maps to avoid
+ ConcurrentModificationExceptions if another thread changes the
+ maps.
+ Bugzilla Report 48310.
+
+ * The filesmatch condition threw a NullPointerException when
+ comparing text files and the second file contained fewer lines than
+ the first one.
+ Bugzilla Report 48715.
+
+ * Regression: The <ear> task would allow multiple
+ META-INF/application.xml files to be added.
+ Bugzilla Report 6836.
+
+ * VectorSet#remove(Object) would fail if the size of the vector
+ equaled its capacity.
+
+ * Regression : ant -diagnostics was returning with exit code 1
+ Bugzilla Report 48782
+
+ * Fix for exec task sometimes inserts extraneous newlines
+ Bugzilla Report 48746
+
+ * SymlinkTest#testSymbolicLinkUtilsMethods failing on MacOS
+ Bugzilla Report 48785.
+
+ * If <concat>'s first resourcecollection child is a <resources>,
+ any subsequently added child resourcecollection joins the first.
+ Bugzilla Report 48816.
+
+ * <get> with an invalid URL could trigger an NPE in some JVMs.
+ Bugzilla Report 48833
+
+ * Broken Pipe issue under Ubuntu Linux
+ Bugzilla Report 48789
+
+ * Properties wrongly read from file or not update during read
+ Bugzilla Report 48768
+
+ * AntClassLoader in Ant 1.8.0 has been considerably slower than in
+ 1.7.1
+ Bugzilla Report 48853
+
+ * ANT_CMD_LINE_ARGS are rippling through lower level Ant usage
+ Bugzilla Report 48876
+
+ * email : IO error sending mail with plain mimetype
+ Bugzilla Report 48932
+
+ * the complete-ant-cmd.pl script failed to create a proper cache of
+ target if "ant -p" failed.
+ Bugzilla Report 48980
+
+ * <rmic>'s sourcebase attribute was broken.
+ Bugzilla Report 48970
+
+ * <copy>'s failonerror didn't work as expected when copying a single
+ element resource collection to a file.
+ Bugzilla Report 49070
+
+ * <get> no longer followed redirects if the redirect URL was relative
+ and not an absolute URL.
+ Bugzilla Report 48972
+
+ * fixed a performance degradation in the code that expands property
+ references.
+ Bugzilla Reports 48961 and 49079
+
+ * <jar filesetmanifest="merge"> was broken on Windows.
+ Bugzilla Report 49090
+
+ * <symlink> delete failed if the link attribute was a relative path
+ to a link inside the current directory without a leading ".".
+ Bugzilla Report 49137
+
+ * <telnet> and <rexec> failed to find the expected strings when
+ waiting for responses and thus always failed.
+ Bugzilla Report 49173
+
+Other changes:
+--------------
+
+ * Project provides new get methods that return copies instead of the
+ live maps of task and type definitions, references and targets.
+
+ * Ant is now more lenient with ZIP extra fields and will be able to
+ read archives that it failed to read in earlier versions.
+ Bugzilla Report 48781.
+
+ * The <zip> family of tasks has been sped up for bigger archives.
+ Bugzilla Report 48755.
+
+ * Add removeKeepExtension option to NetRexxC task.
+ Bugzilla Report 48788.
+
+ * Add prefix attribute to loadproperties task.
+
+ * Add resource attribute to length task.
+
+ * PropertyResource will effectively proxy another Resource if ${name}
+ evaluates to a Resource object.
+
+ * Added forcestring attribute to equals condition to force evaluation
+ of Object args as strings; previously only API-level usage of the
+ equals condition allowed Object args, but Ant 1.8.x+ property
+ evaluation may yield values of any type.
+
+ * BuildFileTest.assertPropertyUnset() fails with a slightly more
+ meaningful error message
+ Bugzilla Report 48834
+
+ * <junit> will now throw an exception if a test name is empty. This
+ used to manifest itself in unrelated errors like
+ Bugzilla Report 43586.
+
+ * A change that made <exec> more reliable on Windows (Bugzilla Report
+ 5003) strongly impacts the performance for commands that execute
+ quickly, like attrib. Basically no single execution of a command
+ could take less than a second on Windows.
+ A few timeouts have been tweaked to allow these commands to finish
+ more quickly but still they will take longer than they did with Ant
+ 1.7.1.
+ Bugzilla Report 48734.
+
+ * Added SimpleBigProjectLogger, intermediate between NoBannerLogger and
+ BigProjectLogger.
+
+ * <mappedresources> supports new attributes enablemultiplemappings
+ and cache.
+
+ * Added the augment task to manipulate existing references via Ant's basic
+ introspection mechanisms.
+
+Changes from Ant 1.8.0RC1 TO Ant 1.8.0
+======================================
+
+Changes that could break older environments:
+-------------------------------------------
+
+ * the appendtolines filter has been renamed to suffixlines.
+
+Fixed bugs:
+-----------
+
+ * stack traces were not reported at all by <junit/>
+ when filtertrace="on", which is the default.
+
+ * ant.bat can now also process the -noclasspath switch when it is
+ the first switch on a command line.
+ Bugzilla Report 48186.
+
+ * <fixcrlf> now tries to delete the created temporary files earlier.
+ Bugzilla Report 48506.
+
+ * the implementation of <zip> had been changed in a way that broke
+ the jarjar links task and protentially other third-party subclasses
+ as well.
+ Bugzilla Report 48541.
+
+ * <scp> task didn't report build file location when a remote operation failed
+ Bugzilla Report 48578.
+
+ * <propertyfile> would add the same comment and a date line each time
+ it updated an existing property file.
+ Bugzilla Report 48558.
+
+ * <sound> didn't work properly in recent Java VMs.
+ Bugzilla Report 48637.
+
+Other changes:
+--------------
+
+Changes from Ant 1.7.1 TO Ant 1.8.0RC1
+======================================
+
+Changes that could break older environments:
+-------------------------------------------
+
+ * if and unless attributes (on <target> as well as various tasks and other
+ elements) have long permitted ${property} interpolation. Now, if the result
+ evaluates to "true" or "false" (or "yes", "no", "on", "off"), that boolean
+ value will be used; otherwise the traditional behavior of treating the value
+ as a property name (defined ~ true, undefined ~ false) is used. Existing
+ scripts could be broken if they perversely defined a property named "false"
+ and expected if="false" to be true, or used if="true" expecting this to be
+ triggered only if a property named "true" were defined.
+
+ * Ant now requires Java 1.4 or later.
+
+ * Improved handling of InterruptException (lets suppose someone/thing
+ is trying to kill the thread when we receive an
+ InterruptException), when an InterruptException is received, we do
+ not wait anymore in a while loop till the end time has been
+ reached.
+ Bugzilla Report 42924.
+
+ * Refactor PropertyHelper and introspection APIs to make extension
+ more granular and support setting task/type attribute values to
+ objects decoded by custom PropertyEvaluator delegates. Also add
+ <propertyhelper> task for registering delegates and/or replacing
+ the registered PropertyHelper instance.
+ Bugzilla Report 42736.
+
+ * Added a restricted form of typedef called <componentdef>. This
+ allows definition of elements that can only be within tasks or
+ types. This method is now used to define conditions, selectors,
+ comparators and filterreaders. This means that tasks may now have
+ nested conditions just by implementing the Condition interface,
+ rather than extending ConditionBase. It also means that the use of
+ namespaces for some of the selectors introduced in Ant 1.7.0 is no
+ longer necessary. Implementing this means that the DynamicElement
+ work-around introduced in Ant 1.7.0 has been removed.
+ Bugzilla Report 40511.
+
+ * In the <touch> task when a <mapper> is used, the millis and
+ datetime attributes now override the time of the source resource if
+ provisioned.
+ Bugzilla Report 43235.
+
+ * Remove fall-back mechanism for references that are not resolved
+ during normal runtime execution.
+
+ * FileUtils.createTempFile now actually creates the file.
+ The TempFile task still does not create the file by default, can be
+ instructed to do so however using a new parameter.
+ Bugzilla Report 33969.
+
+ * A lock in Project ensured that a BuildListener's messageLogged
+ method was only ever executed by a single thread at a time, while
+ all other methods could be invoked by multiple threads
+ simultaniously (while within <parallel>, for example). This lock
+ is no longer in place, messageLogged should be made thread-safe
+ now.
+
+ * <sql>'s onError="stop" no longer fails the build if an error
+ occurs, this is the main difference between stop and error and
+ matches what the documentation implied.
+ Bugzilla Report 24668.
+
+ * Ant's configuration introspection mechanisms have been modified to prefer
+ Resource and FileProvider attributes to plain java.io.File attributes;
+ however the configuration-from-String behavior remains equivalent, rendering
+ a FileResource.
+
+ * CBZip2InputStream will now throw an IOException if
+ passed in a null or empty InputStream to read from.
+ Bugzilla Reports 32200.
+
+ * <unzip> will now fail when trying to extract certain broken
+ archives that would have been silently ignored in earlier version.
+ Bugzilla Report 35000.
+
+ * Ant's <zip> family of tasks tries to preserve the existing Unix
+ permissions when updating archives or copying entries from one
+ archive to another.
+ Since not all archiving tools support storing Unix permissions in
+ the same way that is used by Ant, sometimes the permissions read by
+ Ant seem to be 0, which means nobody is allowed to do anything to
+ the file or directory.
+ If Ant now encounters a permission set of 0 it will assume that
+ this is not the intended value and instead apply its own default
+ values. Ant used to create entries with 0 permissions itself.
+ The <zip> family of tasks has a new attribute preserve0permissions
+ that can be set to restore the old behavior.
+ Bugzilla Report 42122.
+
+ * If a batch containing multiple JUnit tests running inside a forked
+ Java VM caused the VM to crash (or caused a timeout), the
+ formatters would receive an error message for the last test in the
+ batch.
+ Ant will now pass in a test with the name "Batch-With-Multiple-Tests"
+ instead - this is supposed to show more clearly that the last test
+ may not have started at all.
+ Bugzilla Report 45227.
+
+ * If the number of minutes a build takes is bigger then 1000 Ant will
+ no longer print a thousands separator in the "elapsed time"
+ message. It used to be the thousands separator of the current
+ locale.
+ Bugzilla Report 44659.
+
+ * <symlink action="delete"> used to fail if the link was broken (i.e.
+ pointing to a file or directory that no longer existed). It will now
+ silently try to remove the link.
+ Bugzilla Report 41285.
+
+ * <delete file="..."> used to log a warning and not delete broken
+ symbolic links. <delete dir="..."/> didn't even log a warning.
+ The task will now try to delete them in both cases.
+ Bugzilla Report 41285.
+
+ * if the dir attribute of a <fileset> points to a symbolic link and
+ followsymlinks is set to false, the fileset will no longer be
+ scanned and always seem empty.
+ Bugzilla Report 45741.
+
+ * the .NET tasks that have been deprecated since Ant 1.7.0 have been
+ removed, please use the stand-alone Antlib you can find at
+ http://ant.apache.org/antlibs/dotnet/index.html
+ instead.
+
+ * the logic of closing streams connected to forked processes (read
+ the input and output of <exec> and friends) has been changed to
+ deal with cases where child processes of the forked processes live
+ longer than their parents and keep Ant from exiting.
+ It is unlikely but possible that the changed logic breaks stream
+ handling on certain Java VMs.
+ Bugzilla issue 5003.
+
+ * <checksum>'s totalproperty was platform dependent because it relied
+ on java.io.File#compareTo. It has now been made platform
+ independent, which means that totalPropery values obtained on
+ Windows (and other systems where the sort order of File is not case
+ sensitive) can be different from the values obtained with earlier
+ versions of Ant.
+ Bugzilla Report 36748.
+
+ * globmapper didn't work properly if the "to" or "from" patterns
+ didn't contain a "*". In particular it implicitly added a * to the
+ end of the pattern(s). This is no longer the case. If you relied
+ on this behavior you will now need to explicitly specify the
+ trailing "*".
+ Bugzilla Report 46506.
+
+ * <copy> silently ignored missing resources even with
+ failOnError="true". If your build tries to copy non-existent
+ resources and you relied on this behavior you must now explicitly
+ set failOnError to false.
+ Bugzilla Report 47362.
+
+ * Ant now prefers the java.runtime.version system property over
+ java.vm.version for the Created-By Manifest attribute.
+ Bugzilla Report 47632.
+
+ * The <image> task now supports a nested mapper. In order to
+ implement this, the Java API of the task had to change so any
+ custom subclass overriding the processFile method will need to
+ adapt (by overriding the new two-arg processFile method).
+ Bugzilla Report 23243.
+
+ * A new property syntax can be used to set attributes from
+ references: ${ant.ref:some-reference}
+
+ In most cases this will yield the exact same result as
+ ${toString:some-reference} - only when an attribute setter method
+ accepts an object type other than string and the project's
+ reference is an Object of matching type the new syntax will pass in
+ that object.
+
+ If your build file already contains properties whose name starts
+ with "ant.ref:" there is a potential for collision. If your
+ property has been set, normal property expansion will take
+ precedence over the new syntax. If the property has not been set
+ and a reference with the postfix of your property name exists
+ (i.e. in a very unlikely event) then the new syntax would yield a
+ different result (an expanded property) than Ant 1.7.1 did.
+
+ * A ProjectHelper implementation can now provide the default build file
+ name it is expecting, and can specify if they can support a specific build
+ file. So Ant is now capable of supporting several ProjectHelper
+ implementations, deciding on which to use depending of the input build file.
+
+ * Mapper-aware selectors (depends, different, present) now accept typedef'd
+ FileNameMappers.
+
+Fixed bugs:
+-----------
+
+ * The default logger was failing to print complete stack traces for
+ exceptions other than BuildException when inside <ant> or
+ <antcall>, thus omitting often important diagnostic
+ information.
+ Bugzilla 43398 (continued).
+
+ * Better handling of package-info.class.
+ Bugzilla Report 43114.
+
+ * RPM task needed an inserted space between the define and the value.
+ Bugzilla Report 46659.
+
+ * Got rid of deadlock between in, out and err in the Redirector.
+ Bugzilla Report 44544.
+
+ * Caused by AssertionError no longer filtered.
+ Bugzilla Report 45631.
+
+ * <zip> would sometimes recreate JARs unnecessarily.
+ Bugzilla Report 45902.
+
+ * <symlink> task couldn't overwrite existing symlinks that pointed to
+ nonexistent files
+ Bugzilla Report 38199.
+
+ * <symlink> task couldn't overwrite files that were in the way of the symlink.
+ Bugzilla Report 43426.
+
+ * <symlink> task failonerror="false" does not stop build from failing
+ when 'ln' command returns non-zero.
+ Bugzilla Report 43624
+
+ * <touch> task couldn't differentiate between "no resources
+ specified" and "no resources matched."
+ Bugzilla Report 43799.
+
+ * ManifestClassPath failed when a relative path would traverse the
+ file system root.
+ Bugzilla Report 44499.
+
+ * <globmapper> had an indexoutofbounds when the prefix and postfix
+ overlapped.
+ Bugzilla Report 44731.
+
+ * <typedef> and <taskdef> failed to accept file names with #
+ characters in them.
+ Bugzilla Report 45190
+
+ * A deadlock could occur if a BuildListener tried to access an Ant property
+ within messageLogged while a different thread also accessed one.
+ Bugzilla Report 45194
+
+ * Handle null result of system getProperty() in CommandlineJava.
+ Similar to Bugzilla Report 42334.
+
+ * Length task did not process nonexistent Resources even though these might
+ conceivably still carry file length information.
+ Bugzilla Report 45271.
+
+ * <javac>'s includeJavaRuntime="false" should work for gcj now. Note
+ that you may need to set includeAntRuntime to false in order to
+ have full control.
+ Bugzilla Report 34638.
+
+ * <sql> would fail if the executed statement didn't return a result
+ set with some JDBC driver that dissalow Statement.getResultSet to
+ be called in such a situation.
+ Bugzilla Report 36265
+
+ * if the executed statement in <sql> returned a result set and an
+ update count, the count would be lost.
+
+ * if an executed statement in <sql> mixes update count and result set
+ parts, some result sets wouldn't get printed.
+ Bugzilla Report 32168.
+
+ * XmlLogger could lose messages if <parallel> is used.
+ Bugzilla Report 25734.
+
+ * <scp> creates remoteToDir if it doesn't exist.
+ Bugzilla Report 42781
+
+ * CBZip2OutputStream threw an exception if it was closed prior to
+ writing anything.
+ Bugzilla Reports 32200, 45836
+
+ * The IPlanetDeploymentTool didn't use the configured DTD locations.
+ Bugzilla Report 31876.
+
+ * The ant shell script printed a warning under Cygwin if JAVA_HOME
+ was not set.
+ Bugzilla Report 45245.
+
+ * <filterset> sometimes incorrectly flagged infinite recursions of
+ filter tokens
+ Bugzilla Report 44226.
+
+ * failures were treated as errors in forked JUnit tests when JUnit 4
+ was used.
+ Bugzilla Report 43892.
+
+ * <jar> and <manifest> disallowed manifest attributes whose name
+ contained the character '8'.
+ Bugzilla Report 45675.
+
+ * BigProjectLogger would set the project's basedir to the current
+ working directory.
+ Bugzilla Report 45607.
+
+ * only <formatter>s that logged to a file were notified if forked VM
+ crashed or a timeout occurred in <junit>.
+ Bugzilla Report 37312.
+
+ * ant -v -version would print the version information twice.
+ Bugzilla Report 45695.
+
+ * when nested into builds that have been invoked by <ant> tasks
+ <subant> might set the wrong basedir on the called projects.
+ Bugzilla Report 30569.
+
+ * If the message of the failed assertion of a forked JUnit test
+ contained line feeds some excess output ended up in Ant's log.
+ Bugzilla Report 45411.
+
+ * <symlink action="delete"> failed to delete a link that pointed to
+ a parent directory.
+ Bugzilla Report 45743.
+
+ * <symlink action="delete"> failed if ant lacked permission to rename
+ the link's target.
+ Bugzilla Report 41525.
+
+ * when checking whether a jar is signed, <signjar> ignored the
+ sigfile attribute.
+ Bugzilla Report 44805.
+
+ * When using JavaMail all <mail> tasks used the same mail host
+ regardless of their configuration.
+ Bugzilla Report 37970.
+
+ * <signjar> and <issigned> didn't handle aliases with characters other
+ than numbers, letters, hyphen or underscore properly.
+ Bugzilla Report 45820.
+
+ * <filterset> could miss multi-character begin tokens in some cases.
+ Bugzilla Report 45094.
+
+ * <depend> didn't close JARs that were part of the classpath.
+ Bugzilla Report 45955.
+
+ * in some cases <depend> would delete class files even if it didn't
+ find the corresponding source files.
+ Bugzilla Report 45916.
+
+ * <javadoc> failed if the nested <bottom> or <head> contained line
+ breaks.
+ Bugzilla Report 43342.
+
+ * encoding="auto" has been broken in <mail> since Ant 1.7.0 and only
+ worked if JavaMail was available.
+ Bugzilla Report 42389.
+
+ * MailLogger could cause a NullPointerException.
+ Bugzilla Report 44009.
+
+ * <junit> didn't recognize failed assertions as failures if they
+ caused subclasses of AssertionError to be thrown (like
+ org.junit.ComparisonFailure that is thrown when assertEquals
+ fails).
+ Bugzilla Report 45028.
+
+ * the Unix "ant" wrapper script failed to protect wildcards in
+ command line arguments in some cases.
+ Bugzilla Report 31601.
+
+ * <cvstagdiff> crippled file names and could miss some entries if
+ multiple modules have been specified.
+ Bugzilla Report 35301.
+
+ * Tasks with a "public void add(SomeType)" method failed to work as
+ TaskContainers at the same time.
+ Bugzilla Report 41647.
+
+ * Tasks that implementes DynamicElemen or DynamicElementNS failed to
+ work as TaskContainers at the same time.
+ Bugzilla Report 41647.
+
+ * combining SSL and authentication in <mail> and MailLogger failed in
+ some setups.
+ Bugzilla Report 46063.
+
+ * if an error occurs while logging the buildFinished event, the
+ original error is now logged to System.err.
+ Bugzilla Report 25086.
+
+ * <copy> failed with a NullPointerException when copying a resource
+ without a name. It will now fail with a meaningful error message.
+ Bugzilla Report 39960.
+
+ * <xslt> now uses the configured classpath to load the factory (when
+ using TraX) before falling back to Ant's own classpath.
+ Bugzilla Report 46172.
+
+ * <dependset> complained about files being modified in the future if
+ they had been just very recently (within Ant's assumed granularity
+ of the file system).
+ Bugzilla Report 43665.
+
+ * <sshexec> didn't store the output in outputproperty if the remote
+ command failed.
+ Bugzilla Report 46340.
+
+ * DirectoryScanner's slow-scanning algorithm that is used when you
+ ask for excluded or not-included files and/or directories could
+ miss some files and directories in the presence of recursive
+ exclude patterns.
+
+ * <sort> resource collection kept only one of entries deemed equal by
+ the chosen Comparator.
+ Bugzilla Report 46527.
+
+ * the ZipFile class used by <unzip> and others could leave the
+ archive open (making it undeletable on Windows as long as the java
+ VM was running) for files with an unexpected internal structure.
+ Bugzilla Report 46559.
+
+ * The zip package now supports the extra fields invented by InfoZIP
+ in order to store Unicode file names and comments.
+
+ * The zip package detects the encoding bit set by more modern
+ archivers when they write UTF-8 filenames and optionally sets it
+ when writing zips or jars.
+ Bugzilla Report 45548
+
+ * <sync> could run into a NullPointerException when faced with broken
+ symbolic links.
+ Bugzilla Report 46747.
+
+ * The ant shell script should now support MSYS/MinGW as well.
+ Bugzilla Report 46936.
+
+ * <signjar> has a new force attribute that allows re-signing of jars
+ that are already signed.
+ Bugzilla Report 46891.
+
+ * <sshexec> now again honors failonerror in the face of connection
+ errors.
+ Bugzilla Report 46829.
+
+ * The <replacetokens> filter threw an exception if the stream to
+ filter ended with a begin token.
+ Bugzilla Report 47306.
+
+ * <scriptmapper>, <scriptfilter> and <scriptcondition> didn't support
+ the setbeans attribute.
+ Bugzilla Report 47336.
+
+ * <loadproperties>' encoding attribute didn't work.
+ Bugzilla Report 47382.
+
+ * Ant created tar archives could contain random bytes at the end
+ which confused some untar implementations.
+ Bugzilla Report 47421.
+
+ * various places where unchecked PrintWriters could hide exceptions
+ have been revisited to now check the error status or not use a
+ PrintWriter at all.
+ Bugzilla Report 43537.
+
+ * filesetmanifest="mergewithoutmain" in <jar> didn't treat inline
+ manifests as expected.
+ Bugzilla Report 29731.
+
+ * <record> didn't work properly with nested builds.
+ Bugzilla Report 41368.
+
+ * <jar> with filesetmanifest different from skip didn't work if the
+ update attribute has been set to true.
+ Bugzilla Report 30751.
+
+ * The default stylesheets for <junitreport> failed to properly escape
+ XML content in exception stack traces.
+ Bugzilla Report 39492.
+
+ * AntClassLoader didn't set the proper CodeSource for loaded classes.
+ Bugzilla Report 20174.
+
+ * AntClassLoader.getResourceAsStream would return streams to
+ resources it didn't return with getResource and to classes it
+ failed to load.
+ Bugzilla Report 44103.
+
+ * Logging exceptions without a message would cause a
+ NullPointerException.
+ Bugzilla Report 47623.
+
+ * WeblogicDeploymentTool could fail on platforms with a file
+ separator other than "/".
+ Bugzilla Report 35649.
+
+ * The update attribute of the modified selector was ignored.
+ Bugzilla Report 32597.
+
+ * <manifest> and <jar> can now merge Class-Path attributes from
+ multiple sources and optionally flatten them into a single
+ attribute.
+ The default behaviour still is to keep multiple Class-Path
+ attributes if they have been specified and to only include the
+ attributes of the last merged manifest.
+ Bugzilla Report 39655.
+
+ * <delete> didn't work correctly with a <modified> selector because
+ it was scanning the same filesets more than once.
+ Bugzilla Report 43574.
+
+ * when using custom filterreaders with the <filterreader classname="">
+ syntax Ant could leak memory.
+ The problem didn't occur when using <typedef> or <componentdef> to
+ define the filterreader which is the recommended approach.
+ Bugzilla Report 45439.
+
+ * Ant didn't set the proper "magic" value for tar entries containing
+ long file names in GNU longfile mode.
+ Bugzilla Report 47653.
+
+ * The tar task failed to recognize that the archive had to be
+ (re-)created in some cases where the sources are filesystem based
+ resources but not filesets.
+ Bugzilla Report 48035.
+
+ * <sshexec>'s outputproperty was prefixed by the executed command
+ when the command attribute has been used, breaking backwards
+ compatibility to Ant 1.7.0.
+ Bugzilla Report 48040.
+
+ * different task instances of the same <scriptdef>ed tasks could
+ overwrite each others attributes/nested elements.
+ Bugzilla Report 41602.
+
+ * The Hashvalue algortihm implementation of the modified task could
+ fail to read the file(s) completely.
+ Bugzilla Report 48313.
+
+Other changes:
+--------------
+
+ * The get task now also follows redirects from http to https
+ Bugzilla Report 47433
+
+ * A HostInfo task was added performing information on hosts, including info on
+ the host ant is running on.
+ Bugzilla Reports 45861 and 31164.
+
+ * There is now a FileProvider interface for resources that act as a source
+ of filenames. This should be used by tasks that require resources
+ to provide filenames, rather than require that all resources
+ are instances or subclasses of FileResource.
+ Bugzilla Report 43348
+
+ * There is now a URLProvider interface for resources that act as a
+ source of URLs. This should be used by tasks that require resources
+ to provide URLs, rather than require that all resources are
+ instances or subclasses of URLResource.
+
+ * Fixcrlf now gives better error messages on bad directory attributes.
+ Bugzilla Report 43936
+
+ * a new property ant.project.default-target holds the value of the
+ current <project>'s default attribute.
+
+ * a new property ant.project.invoked-targets holds a comma separated
+ list of the targets that have been specified on the command line
+ (the IDE, an <ant> task ...) when invoking the current project.
+
+ * The <type> resource selector has had an "any" type added for better
+ configurability.
+
+ * Ant should detect the OS as both a Mac and a Unix system when
+ running on OpenJDK.
+ Bugzilla Report 44889.
+
+ * new protected getConnection and getStatement methods allow
+ subclasses of SQLExec more control - or access to the cached
+ instances when overriding other methods like runStatements.
+ Bugzilla Report 27178.
+
+ * <sql> has a new failOnConnectionError attribute that can be used to
+ keep a build going even if the task failed to connect to the
+ database.
+ Bugzilla Report 36712.
+
+ * A new attribute strictDelimiterMatching can be used to ignore case
+ or whitespace differences when <sql> searches for delimiters.
+ This is useful if you execute a SQL script that has contains "GO"
+ and "go" as delimiters.
+ Bugzilla Report 26459.
+
+ * A new showWarnings attribute of <sql> allows warnings to be logged.
+ Bugzilla Report 41836.
+
+ * A new treatWarningsAsErrors attribute of <sql> can be used to fail
+ a build if a warning occurs.
+ Bugzilla Report 41836.
+
+ * Ant now supports scoped properties (see Local task).
+ Bugzilla Report 23942.
+
+ * <sql>'s CSV output can be controlled via the new attributes
+ csvColumnSeparator and csvQuoteCharacter.
+ Bugzilla Report 35627.
+
+ * <ftp>'s logging has been improved.
+ Bugzilla Reports 30932, 31743.
+
+ * It is now possible to disable <ftp>'s remote verification.
+ Bugzilla Report 35471.
+
+ * <sshexec> now supports input in a way similar to <exec>
+ Bugzilla Report 39197.
+
+ * <scp> can now preserve the file modification time when downloading
+ files.
+ Bugzilla Report 33939.
+
+ * the new task sshsession can run multiple tasks in the presence of
+ an SSH session providing (local and remote) tunnels.
+ Bugzilla Report 43083.
+
+ * ZipOutputStream has been sped up for certain usage scenarios that
+ are not used by Ant's family of zip tasks.
+ Bugzilla Report 45396.
+
+ * <echo> supports an "output" Resource attribute as an alternative to "file".
+
+ * <sql> "output" attribute now supports any Resource in addition to a file.
+
+ * <scp> no longer requires a passphrase when using key based
+ authentication.
+ Bugzilla Report 33718.
+
+ * a new failOnEmptyArchive attribute on <unzip> and <untar> can now
+ make the task fail the build if it tries to extract an empty
+ archive.
+
+ * <unzip> and <untar> have a new attribute stripAbsolutePathSpec.
+ When set to true, Ant will remove any leading path separator from
+ the archived entry's name before extracting it (making the name a
+ relative file name).
+ Bugzilla Report 28911.
+
+ * <unzip> will now detect that it was asked to extract a file that is
+ not an archive earlier if the file is big.
+ Bugzilla Report 45463.
+
+ * New file and resource selectors <readable/> and <writable/> have
+ been added that select file which the current process can read or
+ write.
+ Bugzilla Report 45081.
+
+ * The filename file selector has a new attribute regex that allows
+ files to be selected by matching their names against a regular
+ expression.
+ Bugzilla Report 45284
+
+ * The name resource selector has a new attribute regex that allows
+ resources to be selected by matching their names against a regular
+ expression.
+ Bugzilla Report 45284
+
+ * Enhanced performance of Project.fireMessageLoggedEvent and DirectoryScanner
+ Bugzilla Reports 45651 and 45665
+
+ * The package list location for offline links can now be specified as
+ an URL.
+ Bugzilla Report 28881
+
+ * <echoxml> now supports XML namespaces.
+ Bugzilla Report 36804.
+
+ * A new listener for <junit> has been added that tries to invoke the
+ tearDown method of a TestCase if that TestCase was run in a forked
+ VM and the VM crashed or a timeout occurred. See the <junit> task's
+ manual page for details.
+ Bugzilla Report 37241.
+
+ * The Jar task now supports the addition of a jar index file in update mode.
+ Previously the absence of the index was not enough to trigger the rebuild;
+ some other update was necessary.
+ Bugzilla report 45098.
+
+ * <ant> has a new attribute "useNativeBasedir" that makes the child
+ build use the same basedir it would have used if invoked from the
+ command line. No matter what other attributes/properties have been
+ set.
+ Bugzilla Report 45711.
+
+ * <patch> has a new optional failOnError attribute.
+ Bugzilla Report 44772.
+
+ * Antlib descriptors will now be parsed by the configured
+ ProjectHelper if the implementation overrides the new
+ canParseAntlibDescriptor and parseAntlibDescriptor methods. If the
+ configured helper doesn't override the methods, a new instance of
+ ProjectHelper2 will be used just like in Ant 1.7.1.
+ Bugzilla Report 42208.
+
+ * It is now possible to explicitly set the executable used by
+ <signjar>.
+ Bugzilla Report 39189.
+
+ * <compositemapper>'s order of results is now predictable.
+ Bugzilla Report 44873
+
+ * a new <firstmatchmapper> has been added, which works similar to
+ <compositemapper> but only returns the results of the first nested
+ mapper that matches.
+ Bugzilla Report 44873
+
+ * <get> has a new maxtime attribute that terminates downloads that
+ are taking too long.
+ Bugzilla Report 45181.
+
+ * <ftp> now supports selectors for remote directories as well.
+ Bugzilla Report 44726.
+
+ * In some cases Ant fails to rename files if the source or target
+ file has just recently been closed on Windows. It will now try to
+ delete the offending file once again after giving the Java VM time
+ to really close the file.
+ Bugzilla Report 45960.
+
+ * two new properties can be used to set the MIME-Type and charset
+ used by MailLogger.
+ Bugzilla Report 27211.
+
+ * a new attribute of <mail> allows the task to succeed if it can
+ reach at least one given recipient.
+ Bugzilla Report 36446.
+
+ * two new properties allow MailLogger to send a fixed text instead of
+ the log file.
+ Bugzilla Report 38029.
+
+ * <cvsversion> is supposed to support CVSNT now.
+ Bugzilla Report 31409.
+
+ * <cvs>' port attribute should now work for all clients that use the
+ environment variable CVS_PSERVER_PORT instead of the "official"
+ CVS_CLIENT_PORT.
+ Bugzilla Report 30124.
+
+ * <cvsversion> now works for local repositories as well.
+
+ * <cvstagdiff> has an option to ignore removed files now.
+ Bugzilla Report 26257.
+
+ * <cvs> and friends now support modules with spaces in their names
+ via nested <module> elements.
+
+ * A new attribute "ignoreEmpty" controls how <concat> deals when
+ there are no resources to concatenate. If it is set to false, the
+ destination file will be created regardless, which reinstates the
+ behavior of Ant 1.7.0.
+ Bugzilla Report 46010.
+
+ * If the new remote attribute is set to true, <cvschangelog> can now
+ work against a remote repository without any working copy.
+ Bugzilla Report 27419.
+
+ * start and end tags can now be used instead of dates in
+ <cvschangelog>.
+ Bugzilla Report 27419.
+
+ * MailLogger and <mail> can now optionally enable support for
+ STARTTLS.
+ Bugzilla Report 46063.
+
+ * <import> has new attributes "as" and "prefixSeparator" that can be
+ used to control the prefix prepended to the imported targets'
+ names.
+
+ * a new task <include> provides an alternative to <import> that
+ should be preferred when you don't want to override any targets.
+
+ * delete has a new attribute removeNotFollowedSymlink. If set to
+ true, symbolic links not followed (because followSymlinks was false
+ or the number of symlinks was too big) will be removed.
+ Bugzilla Report 36658.
+
+ * the os and osfamily attributes of <chown>, <chgrp>, <chmod> and
+ <attrib> can now be used to run the commands on operating systems
+ other than their "native" environment, i.e. non-Unix or non-Windows
+ operating systems respectively.
+ Bugzilla Report 7624.
+
+ * a new resource collection <mappedresources> generalizes the prefix
+ and fullpath attributes of <zipfileset> to arbitrary mappers that
+ can be applied to arbitrary resource collections.
+ Bugzilla Report 4240.
+
+ * <tarfileset> and <zipfileset> have a new attribute
+ errorOnMissingArchive that allows "optional" filesets that don't
+ break the build if the archive doesn't exist.
+ Bugzilla Report 46091.
+
+ * <javadoc> has new attributes that correspond to the
+ -docfilessubdirs and -excludedocfilessubdir command line arguments.
+ Bugzilla Report 34455.
+
+ * <xslt> now fails early if a specified stylesheet doesn't exist.
+ Bugzilla Report 34525.
+
+ * <xslt> now has an option to suppress transformer warnings. This
+ option only has an effect for processors that support this feature;
+ the "trax" processor included with Ant does support it.
+ Bugzilla Report 18897.
+
+ * <xslt> has two new attributes failOnError and
+ failOnTransformationError that can be used to not make the build
+ process proceed if an error occurs.
+ Bugzilla Report 36260.
+
+ * <xslt> has a new attribute failOnNoResources that can be used to
+ make the build fail/continue if the collection of resources to
+ transform is empty.
+ Bugzilla Report 46274.
+
+ * It is now possible to define system properties that should be set
+ during xslt's transformation. This can be used to enable XInclude
+ processing in Xerces, for example.
+ Bugzilla Report 36653.
+
+ * a new resource collection <archives> can be used to specify
+ collections of ZIP and TAR archives as sources. It extracts them on
+ the fly. This is a generalization of the <zipgroupfileset> found
+ as nested element of <zip> and friends.
+ Bugzilla Report 46257.
+
+ * <dependset> has a new verbose attribute that makes the task list
+ all deleted targets and give a hint as to why it deleted them.
+ Bugzilla Report 13681.
+
+ * <replaceregexp> now supports arbitrary filesystem based resource
+ collections.
+ Bugzilla Report 46341.
+
+ * <replace> now supports arbitrary filesystem based resource
+ collections.
+ Bugzilla Report 24062.
+
+ * token and value of <replace>'s nested <replacefilter> can now also
+ be specified as nested elements to allow multiline content more
+ easily.
+ Bugzilla Report 39568.
+
+ * <replace> and <replaceregexp> can now optionally preserve the file
+ timestamp even if the file is modified.
+ Bugzilla Report 39002.
+
+ * The <replace> child-elements <replacetoken> and <replacevalue> have
+ a new attribute that controls whether properties in nested text get
+ expanded.
+ Bugzilla Report 11585.
+
+ * <replace> has a new attribute failOnNoReplacements that makes the
+ build fail if the task didn't do anything.
+ Bugzilla Report 21064.
+
+ * <sync>'s <preserveInTarget> has a new attribute that controls
+ whether empty directories should be kept.
+ Bugzilla Report 43159.
+
+ * ant -diagnostics now checks that it can read as much from the
+ temporary directory as it has written. This may help detecting a
+ full filesystem.
+ Bugzilla Report 32676.
+
+ * <pathconvert> has a new preserveduplicates attribute--historically
+ these were eliminated in the interest of behaving in the manner
+ of a "path."
+
+ * <javac>'s source and target attributes are no longer ignored when
+ using gcj.
+ Bugzilla Issue 46617.
+
+ * ant -diagnostics now outputs information about the default XSLT
+ processor.
+ Bugzilla Issue 46612.
+
+ * the ZIP library will now ignore ZIP extra fields that don't specify
+ a size.
+ Bugzilla Report 42940.
+
+ * CBZip2OutputStream now has a finish method separate from close.
+ Bugzilla Report 42713.
+
+ * the <zip> and <unzip> family of tasks has new options to deal with
+ file name and comment encoding. Please see the zip tasks'
+ documentation for details.
+
+ * <input ...><handler type="secure" /></input> now uses previously
+ undocumented SecureInputHandler shipped with Ant 1.7.1.
+
+ * Command line arguments for <exec> and similar tasks can now have
+ optional prefix and suffix attributes.
+ Bugzilla Report 47365
+
+ * <apply>'s srcfile and targetfile child elements can now have
+ optional prefix and suffix attributes.
+ Bugzilla Report 45625
+
+ * <jar> has a new attribute to enable indexing of META-INF
+ directories which is disabled for backwards compatibility reasons.
+ Bugzilla Report 47457
+
+ * <apt>'s executable attribute can be used to specify a different
+ executable.
+ Bugzilla Report 46230.
+
+ * <rmic>'s new executable attribute can be used to specify a
+ different executable.
+ Bugzilla Report 42132.
+
+ * <javac>, <rmic>, <javah> and <native2ascii> now provide a nested
+ element to specify a classpath that will be used when loading the
+ task's (compiler) adapter class.
+ Bugzilla Report 11143.
+
+ * <javac>, <rmic>, <javah> and <native2ascii> now provide a nested
+ element to specify the task's (compiler) adapter as an instance of
+ a class that has been defined via typedef/componentdef. This
+ allows more control over the classpath and allows adapters to be
+ defined in Antlibs easily.
+
+ * A new subclass org.apache.tools.ant.loader.AntClassLoader5 of
+ AntClassLoader has been added which overrides getResources
+ which became non-final in ClassLoader with Java5+ so
+ this method now behaves as expected.
+ The new subclass will be used by Ant internally if it is available
+ and Ant is running on Java5 or more recent.
+ Bugzilla Report 46752.
+
+ * a new attributes can chose a different request method than GET for
+ the http condition.
+ Bugzilla Report 30244
+
+ * <splash> now supports a configurable display text and a regular
+ expression based way to determine progress based on logged messages.
+ Bugzilla Report 39957.
+
+ * the number of retries on error in <get> is now configurable. <get>
+ can be told to not download files that already exist locally.
+ Bugzilla Report 40058.
+
+ * Ant now builds against commons-net 2.0 as well.
+ Bugzilla Report 47669.
+
+ * A new nested element connectionProperty of <sql> allows setting of
+ arbitrary JDBC connection properties.
+ Bugzilla Report 33452.
+
+ * A new islastmodified condition can check the last modified date of
+ resources.
+
+ * <rmic> has a new destDir attribute that allows generated files to
+ be written to a different location than the original classes.
+ Bugzilla Report 20699.
+
+ * <rmic> has a new listfiles attribute similar to the existing one of
+ <javac>.
+ Bugzilla Report 24359.
+
+ * It is now possible to suppress the "FAILED" lines sent to Ant's
+ logging system via <junit>'s new logFailedTests attribute.
+ Bugzilla Report 35073.
+
+ * <propertyfile> now can delete entries.
+
+ * The <resources> resource collection can now optionally cache its
+ contents.
+
+ * A new <resourceexists> condition can check whether resources exists.
+
+ * <sql> has two new attributes errorproperty and warningproperty that
+ can be set if an error/warning occurs.
+ Bugzilla Report 38807.
+
+ * <sql> has a new attribute rowcountproperty that can be used to set
+ a property to the number of rows affected by a task execution.
+ Bugzilla Report 40923.
+
+ * when Ant copies files without filtering, it will now use NIO
+ channels.
+ Bugzilla Report 30094.
+
+ * <get> has a new attribute that can be used to disable caching on
+ HTTP connections at the HttpUrlConnection level.
+ Bugzilla Report 41891.
+
+ * <tar> and <zip> (and tasks derived from <zip>) will now create the
+ parent directory of the destination archive if it doesn't exist.
+ Bugzilla Report 45377.
+
+ * A new filterreader <sortfilter> that sorts input lines has been
+ added.
+ Bugzilla Report 40504.
+
+ * A new token filter <uniqfilter> that suppresses tokens that match
+ their ancestor token has been added.
+
+ * <rootfileset>s nested into <classfileset>s can now use a dir
+ attribute different from the <classfileset>.
+ Bugzilla Report 37763.
+
+ * <path> can now optionally cache its contents.
+
+ * <property> can now specify values as nested text.
+ Bugzilla Report 32917.
+
+ * a new parentFirst attribute on <javaresource> allows resources to
+ be loaded from the specified classpath rather than the system
+ classloader.
+ Bugzilla Report 41369.
+
+ * <property location="from" basedir="to" relative="true"/> can now
+ calculate relative paths.
+
+ * The <name> selector supports a new handleDirSep attribute that
+ makes it ignore differences between / and \ separators.
+ Bugzilla Report 47858.
+
+ * <get> now supports resource collections (as long as the resources
+ contained provide URLs) and can get multiple resources in a single
+ task.
+
+ * <import> can now import non-File resources if they provide an URL
+ - as the <url> and <javaresource> resources do.
+ Bugzilla Report 29251
+
+ * <import> can now import multiple resources specified as resource
+ collections.
+ Bugzilla Report 22269.
+
+ * a new <resourcelist> type is similar to <filelist> but can read the
+ list of resources from non-file resources and may return resources
+ that are not files.
+
+ * a new filterreader appendtolines complements prefixlines.
+
+ * a new top level element extension-point allows build files to be
+ extended with custom targets more easily.
+
+Changes from Ant 1.7.0 TO Ant 1.7.1
+=============================================
+
+Changes that could break older environments:
+-------------------------------------------
+
+* String resources only have properties single expanded. If you relied on
+ <string> resources being expanded more than once, it no longer happens.
+ Bugzilla report 42277.
+
+* A String resource's encoding attribute was only taken into account when
+ set from the resource's OutputStream; the InputStream provided the String's
+ binary content according to the platform's default encoding. Behavior has
+ been modified to encode outgoing (InputStream) content as well as encoding
+ incoming (OutputStream) content.
+
+* <java> with fork now returns gives -1 instead of 0 as result when failonerror
+ is false and some exception (including timeout) occurs. Br 42377.
+
+* ant-type attribute has been marked as deprecated and a warning has been
+ issued if it is encountered in the build file.
+
+Fixed bugs:
+-----------
+
+* The default logger was failing to print complete stack traces for exceptions
+ other than BuildException, thus omitting often important diagnostic
+ information. Bugzilla 43398.
+
+* Error in FTP task
+ Bugzilla report 41724
+
+* Regression: Locator fails with URI encoding problem when spaces in path
+ Bugzilla report 42222
+
+* Regression in Locator: running Ant off a network share does not work:
+ message "URI has authority component" appears
+ Bugzilla report 42275
+
+* Improvements in AntClassLoader Speed.
+ Bugzilla report 42259
+
+* Error in handling of some permissions, most notably the AllPermission on
+ jdk 1.5
+ Bugzilla report 41776
+
+* Replace task summary output incorrect.
+ Bugzilla report 41544
+
+* Dependset crashes ant when timestamp on files change during Dependset
+ execution.
+ Bugzilla report 41284
+
+* Bug in org.apache.tools.ant.types.resources.comparators.Date
+ Bugzilla report 41411
+
+* <junit> in Ant 1.7.0 could throw NPE if no <classpath> was defined.
+ Bugzilla report 41422.
+
+* In Ant 1.7.0, <fileset> in <javadoc> does not by default include only
+ **/*.java as the documentation claims and earlier revisions did.
+ Bugzilla report 41264.
+
+* SPI support in jar was broken.
+ Bugzilla report 41201.
+
+* jsch-0.1.30 causes SCP task to hang
+ Bugzilla report 41090.
+
+* Target from imported file listed twice in projecthelp.
+ Bugzilla report 41226.
+
+* <sql> task double-expands properties if expandproperties is true,
+ and expands properties if expandproperties is false.
+ Bugzilla report 41204.
+
+* Rolling back Bugzilla 32927 (set a default description for a javadoc tag
+ if not set) as it caused a BC problem.
+ Bugzilla report 41268.
+
+* <apt> forks properly and so memory settings are picked up.
+ Bug report 41280.
+
+* Regression: NPE was thrown when using <pathconvert> against a
+ (third-party instantiated) fileset with null Project reference.
+
+* Strip out all -J arguments to non forking rmic adapters, specifically
+ the Sun and Weblogic compilers.
+ Bug report 41349
+
+* Synchonization issues in PropertyHelper. Bugzilla 41353.
+
+* <concat binary="true" append="true"> did not append. Bugzilla 41399.
+
+* -autoproxy turns Java1.5+ automatic proxy support on. Bugzilla 41904
+
+* Handle null result of system getProperty(). Bugzilla 42334.
+
+* Regression: concat fixlastline="true" should not have applied to
+ nested text, but did in Ant 1.7.0. Bugzilla 42369.
+
+* Regression: ant.version was not passed down in <ant>, <subant>.
+ This worked in Ant 1.6.5, but not in 1.7.0.
+ ant.core.lib (added in 1.7.0) was also not being propagated.
+ Bugzilla bug 42263
+
+* Regression: bzip2 task created corrupted output files for some inputs.
+ Bugzilla bug 41596.
+
+* Regression: <available> with <filepath> did not work.
+ Bugzilla 42735.
+
+* ant script, cd may output to stdout.
+ Bugzilla 42739.
+
+* Modified selector doesn't update the cache if only one file has changed.
+ Bugzilla 42802.
+
+* Regression: Path subclasses that overrode list() stopped working in
+ resourceCollection contexts in Ant 1.7.0. Bugzilla 42967.
+
+* <property> supports loading from xml based property definition.
+ Bugzilla 42946
+
+* <junit> supports collecting and rerunning failed test cases
+ (textXXX methods). Bugzilla 42984.
+
+* War task failed with "No WEB-INF/web.xml file was added" when called
+ a second time. Bugzilla 43121.
+
+* FilterMapper could throw an NPE.
+ Bugzilla 43292.
+
+* Regession nested macrodefs with elements could cause StackOverFlow.
+ Bugzilla 43324.
+
+* Some changes to <junit> broke third party tasks that extend it (like
+ Apache Cactus' Ant task). The changes have been modified so that
+ subclases should now work again - without any changes to the
+ subclass.
+
+Other changes:
+--------------
+
+* Various small optimizations speed up common tasks such as <javac> on large
+ filesets, reducing both I/O and CPU usage.
+
+* Profiling logger has been added with basic profiling capabilities.
+
+* <script> now has basic support for JavaFX scripts
+
+* SSH task can now take a command parameter containing the commands to execute.
+ This allows you to connect to a server and execute a number of commands
+ without constantly reconnecting for each command.
+
+* Upgraded XML API to XML commons version 1.3.04.
+
+* Upgraded to Xerces 2.9.0
+
+* <script> can now work with bsf.jar and js.jar in its <classpath>.
+
+* add errorProperty and updatedProperty to <javac>
+ Bugzilla 35637 and 28941.
+
+* add classpathref attribute to <whichresource>
+ Bugzilla 41158.
+
+* reduce logging noise of <apply skipemptyfilesets="true">
+ Bugzilla 29154
+
+* Show Previous Revision in the tagdiff.xsl stylesheet
+ Bugzilla 29143
+
+* Allow <mapper refid> to refer directly to a FileNameMapper instance.
+
+* If you try and use a type in a namespace (or an antlib), and the type is not
+ recognized but there are other definitions in that namespace, Ant lists what
+ the known definitions are. This helps you find spelling errors.
+
+* Add a <last> resource collection, corresponding to <first>.
+
+* Add new <truncate> task.
+
+* <junitreport> xsl stylesheets allow setting the title used in <title> and <h1> tags by
+ using <report><param> element. Bugzilla 41742.
+
+* Add IgnoreDependenciesExecutor for weird cases when the user wants to run
+ only the targets explicitly specified.
+
+* Patternset allows nested inverted patternsets using <invert>.
+
+* <manifest> checks for validity of attribute names.
+
+* JUnitVersionHelper.getTestCaseClassName is now public. Bugzilla 42231
+
+* <string> resource supports nested text. Bugzilla bug 42276
+
+* <scriptdef> now sources scripts from nested resources/resource collections. This lets you
+ define scripts in JARs, remote URLs, or any other supported resource. Bugzilla report 41597.
+
+* <concat> is now usable as a single-element ResourceCollection.
+
+* It is now possible to provide the value of a <striplinecomments> filter's
+ <comment> nested element as nested text instead of using the 'value'
+ attribute.
+
+* A new logger, BigProjectLogger, lists the project name with every target
+
+* Default text added to macrodef. Bugzilla report 42301.
+
+* "rawblobs" attribute added to SQL task.
+
+* Add new retry task container.
+
+* <jar> has a new strict attribute that checks if the jar complies with
+ the jar packaging version specification.
+
+* <javac> has a new attribute - includeDestClasses.
+ Bugzilla 40776.
+
+* <fileset> has a new attribute - errorOnMissingDir.
+ Bugzilla 11270.
+
+* <javac> handles package-info.java files, there were repeatedly compiled.
+ Bugzilla 43114.
+
+* SecureInputHandler added to use Java 6 System.console().readPassword()
+ when available.
+
+Changes from Ant 1.6.5 to Ant 1.7.0
+===================================
+
+Changes that could break older environments:
+-------------------------------------------
+
+* Initial support for JDK 6 (JSR 223) scripting.
+ <*script*> tasks will now use javax.scripting if BSF is
+ not available, or if explicitly requested by using
+ a "manager" attribute.
+
+* Removed launcher classes from nodeps jar.
+
+* <classconstants> filter reader uses ISO-8859-1 encoding to read
+ the java class file. Bugzilla report 33604.
+
+* Defer reference process. Bugzilla 36955, 34458, 37688.
+ This may break build files in which a reference was set in a target which was
+ never executed. Historically, Ant would set the reference early on, during parse
+ time, so the datatype would be defined. Now it requires the reference to have
+ been in a bit of the build file which was actually executed. If you get
+ an error about an undefined reference, locate the reference and move it somewhere
+ where it is used, or fix the depends attribute of the target in question to
+ depend on the target which defines the reference/datatype.
+ As a result of testing on real live build scripts, a fall-back mechanism
+ was put it place to allow references that are out-of-band to be resolved. If
+ this happens a big warning message is logged. This fall-back mechanism will
+ be removed in Ant 1.8.0.
+
+* <script> and <scriptdef> now set the current thread context.
+
+* Unrestrict the dbvendor names in the websphere element of the ejbjar task.
+ Bugzilla Report 40475.
+
+* <env> nested element in <java>, <exec> and others is now case-insensitive
+ for windows OS. Bugzilla Report 28874.
+
+* Removed support for xalan1 completely. Users of Xalan1 for Ant builds will
+ have to stay at ant 1.6.5 or upgrade to xalan2.
+
+* Use org.apache.log4j.Logger instead of org.apache.log4j.Category.
+ Category has been deprecated for ~2 years and has been removed from
+ the log4j code. Logger was introduced in log4j 1.2 so users of
+ log4j 1.1 and log4j 1.0 need to upgrade to a newer version of log4j.
+ Bugzilla Report 31951.
+
+* build.sysclasspath now also affects the bootclasspath handling of
+ spawned Java VMs. If you set build.sysclasspath to anything other
+ than "ignore" (or leave it unset, since "ignore" is the default when
+ it comes to bootclasspath handling), then the bootclasspath of the
+ VM running Ant will be added to the bootclasspath you've specified.
+
+* The <java fork="false"> now as per default installs a security manager
+ using the default permissions. This is now independent of the
+ failonerror attribute. Bugzilla report 33361.
+
+* <signjar> now notices when the jar and signedjar are equal, and switches
+ to the same dependency logic as when signedjar is omitted. This may break
+ something that depended upon signing in this situation. However, since
+ invoking the JDK jarsigner program with -signedjar set to the source jar
+ actually crashes the JVM on our (Java1.5) systems, we don't think any
+ build files which actually worked will be affected by the change.
+
+* <signjar> used to ignore a nested fileset when a jar was also provided as an
+ attribute, printing a warning message; now it signs files in the fileset.
+
+* An improved method of handling timestamp granularity differences between
+ client and server was added to the <ftp> task. FTP servers typically
+ have HH:mm timestamps whereas local filesystems have HH:mm:ss timestamps.
+ Previously, this required tweaking with the timediffmillis attribute
+ which also was used to handle timezone differences. Now, there is a new
+ timestampgranularity attribute. The default value for get operations is 0
+ since the user has the more powerful preservelastmodified attribute to work
+ with. Since this is not available on put operations the default value
+ adds a minute to the server timestamp in order to account for this,
+ Scripts which previously used timediffmillis to do this compensation may
+ need to be rewritten. timediffmillis has now been deprecated.
+
+* Support for the XSL:P XML parser has been removed.
+ Bugzilla Report 23455.
+
+* Visual Age for Java optional tasks removed as the required library is no
+ longer available.
+
+* Testlet (test) optional task removed as the required library is no
+ longer available.
+
+* IContract optional task removed as the required library is no
+ longer available.
+
+* Metamata (maudit, mmetrics, and mparse tasks) removed as the required
+ library is no longer available.
+
+* Sitraka (jpcoverage, jpcovmerge, jpcovreport) tasks suppressed as the
+ required library is no longer available.
+
+* <fixcrlf> used \r (Mac) line endings on OS X, whose proper line separator
+ is \n (Unix). Bugzilla report 39585.
+
+* <scp> now optionally supports the sftp protocol, you may need a
+ newer jsch.jar. Bugzilla Report 39373.
+
+* Ant launcher program prints errors to stderr, and exits with a 2 exit code
+ value if, for any reason, it cannot actually start Ant proper. This will only
+ affect programs/scripts that called the launcher and which did not want to
+ receive an error if Ant itself would not start
+
+* All .NET tasks are now deprecated in favor of the new .NET Antlib:
+ http://ant.apache.org/antlibs/dotnet/index.html
+
+Fixed bugs:
+-----------
+* Directory deletion did not work properly.
+ Bugzilla 40972.
+
+* docletpath attribute of javadoc was ignored.
+ Bugzilla 40900.
+
+* Fixed incorrect recursion in DOMUtil.listChildNodes().
+ Bugzilla 40918.
+
+* CompressedResource.compareTo() did not
+ take comparison with another CompressedResource into account.
+ Bugzilla 40949.
+
+* Avoid possible NPE in Jar.java.
+ Bugzilla 40847.
+
+* regression in attribute prefix (+ others) for refid in zipfileset and tarfileset.
+ Bugzilla 41004, 30498.
+
+* dependset failed if the basedir of a target fileset did not exist.
+ Bugzilla 40916.
+
+* Recursive filtering encountered NullPointerExceptions under certain
+ circumstances. Bugzilla 41086.
+
+* XmlProperty overrides previously set property value when handling duplicate
+ elements. Bugzilla 41080.
+
+* Having many tasks causes OOM. Bugzilla 41049.
+
+* Regression: <path> was evaluating nested content only once, so that it could
+ not e.g. pick up files that didn't exist the first time through.
+ Bugzilla 41151.
+
+* OOM caused by IH holding on to classes and thus their classloaders.
+ Bugzilla 28283 and 33061.
+
+* <delete> doesn't delete when defaultexcludes="false" and no includes is set
+ fixed. Bugzilla 40313.
+
+* Behavior change of DirectoryScanner/AbstractFileset when conditional include
+ patterns are used. Bugzilla 40722.
+
+* <javac> fails with NPE when compiling with eclipse ecj 3.1.x.
+ Bugzilla 40839.
+
+* JUnitTestRunner had a NPE when unable to create parser, the exception
+ containing the error did not get reported. Bugzilla 36733.
+
+* <checksum> with file and todir option failed. Bugzilla report 37386.
+
+* <path location="loc"> was broken (Regression from beta1).
+ Bugzilla report 40547.
+
+* Nested fileset in <cab> did not work. Bugzilla report 39439.
+
+* The ant wrapper script should now correctly locate the java
+ executable in more recent IBM JDKs for AIX as well.
+
+* URLResource did not close jar files, and also did not disconnect HTTPConnection (s).
+
+* Error calling junitreport. Bugzilla 40595.
+
+* <junittask/> created junitvmwatcher*.properties files but did not close and delete them.
+
+* <xmlproperty> did not create properties for empty leaf elements.
+ Bugzilla report 26286.
+
+* UnknownElement.maybeConfigure always configured.
+ Bugzilla report 40641.
+
+* No check for refid when prefix attribute is set in zipfileset.
+ Bugzilla report 30498.
+
+* Fix for junit4 issue introduced since beta2.
+ Bugzilla report 40682.
+
+* Error in duplicate project name with <import> and <antcall>.
+ Bugzilla report 39920.
+
+* junit4 did not work with fork=no and junit4 in $ANT_HOME/lib.
+ Bugzilla report 40697.
+
+* PathConvert on Windows should process forward and back slashes equivalently.
+ Bugzilla report 32884.
+
+* ant.bat now looks in %USERPROFILE% and %HOMEDRIVE%%HOMEPATH% in addition to
+ %HOME% for pre/post batch files. Bugzilla report 39298.
+
+* The inheritance hierarchy of the legacy <path> type was changed; code built
+ against Ant 1.7 would therefore no longer execute on older versions of Ant.
+ Since <path> is historically heavily used this was undesirable, and since it
+ is also avoidable, the change to <path>'s taxonomy was reverted.
+
+* <zip filesonly="true"> included empty directories. Bugzilla report 40258.
+
+* Invalid hash code of Target causes XmlLogger to fail.
+ Bugzilla report 40207.
+
+* Macro element did not include top level Text. Bugzilla report 36803.
+
+* AntClassLoader did not isolate resources when isolate was set. Bugzilla report 38747.
+
+* Diagnostics broken when using java 1.4. Bugzilla report 40395.
+
+* Exception reporting in <copy> was broken. Bugzilla report 40300.
+
+* Handling of corrupt tar files, TarInputStream.read() never returns EOF.
+ Bugzilla report 39924.
+
+* Some bugs in ReaderInputStream. Bugzilla report 39635.
+
+* <antlr> did not recognise whether the target is up-to-date for html option.
+ Bugzilla report 38451.
+
+* Documented minimal version of jsch now 0.1.29.
+ Bugzilla report 40333.
+
+* <available> searched parent directories for files.
+ Bugzilla report 37148.
+
+* The build could be halted if a file path contained more ".." components than
+ the actual depth of the preceding path. Now such paths are left
+ alone (meaning they will likely be treated as nonexistent
+ files). Bugzilla Report 40281.
+
+* Converting a <dirset> to a string was broken. Bugzilla Report 39683.
+
+* Manifests have improved line length handling, taking care of encoding.
+ Bug reports 37548 / 34425.
+
+* <manifest> now closes the inputstream explicitly. Bug report 39628.
+
+* <rpm> now also correctly searches the first element of the path.
+ Bug report 39345.
+
+* ant.bat now handles classpath set to "". Bug report 38914.
+
+* <junit> now supports JUnit 4. Bugzilla Report 38811.
+
+* <junit> can now work with junit.jar in its <classpath>. Bugzilla
+ Report 38799.
+
+* Some potential NullPointerExceptions, Bugzilla Reports 37765 and 38056.
+
+* Problem when adding multiple filter files, Bugzilla Report 37341.
+
+* Problem referencing jars specified by Class-Path attribute in manifest
+ of a ant task jar file, when this ant task jar file is located in
+ a directory with space, Bugzilla Report 37085.
+
+* Backward incompatible change in ZipFileSet, Bugzilla Report 35824.
+
+* Wrong replacement of file separator chars prevens junitbatchtest
+ from running correctly on files from a zipfileset. Bugzilla Report 35499.
+
+* Calling close twice on ReaderInputStream gave a nullpointer exception.
+ Bugzilla Report 35544.
+
+* Memory leak from IntrospectionHelper.getHelper(Class) in embedded
+ environments. Bugzilla Report 30162.
+
+* Translate task does not remove tokens when a key is not found.
+ It logs a verbose message. Bugzilla Report 13936.
+
+* Incorrect task name with invalid "javac" task after a "presetdef".
+ Bugzilla reports 31389 and 29499.
+
+* <manifest> was not printing warnings about invalid manifest elements.
+ Bugzilla report 32190.
+
+* <replace> got out of memory on large files (part of report 32566).
+ <replace> can now handle files as long as there is enough disk space
+ available.
+
+* Commandline.describeCommand() methods would attempt to describe
+ arguments even when none, other than the executable name, were present.
+
+* Create signjar's helper ExecTask instance directly rather than by
+ typedef discovery mechanisms. Bugzilla report 33433.
+
+* FileUtils.resolveFile() promised to return absolute files but
+ did not always do so.
+
+* <ftp> failed to retrieve a file when the path towards the file contained
+ an element starting with . Bugzilla report 33770.
+
+* "<rmic> always compiles on Java1.5" bugzilla report=33862. Fixed default
+ stub version to always be "compat", even on Java1.5+.
+
+* The .NET compilation tasks failed if filenames given as references
+ contained spaces. Bugzilla Report 27170.
+
+* SQL task would try access result sets of statements that didn't
+ return any, causing problems with Informix IDS 9.2 and IBM DB2 8.1
+ FixPak 6 (or later). Bugzilla Reports 27162 and 29954.
+
+* Task.init() was called twice for most tasks. Bugzilla Report 34411.
+
+* JavaTest testcases sometimes fail on windows. Bugzilla Report 34502.
+
+* Targets with identical name work in imported project. Bugzilla Report 34566.
+
+* DemuxOutputStream now uses a WeakHashMap to store the thread-stream mapping,
+ to avoid holding on to thread references after they terminate.
+
+* <xmlvalidate> and <schemavalidate> create a new parser for every file in a
+ fileset, and so validate multiple files properly. Bugzilla Report 32791.
+
+* <tar> / <untar> now accepts files upto 8GB, <tar> gives an error if larger
+ files are to be included. This is the POSIX size limit.
+
+* <junitreport> removed line-breaks from stack-traces. Bugzilla
+ Report 34963.
+
+* Off-by-one error in environment setup for execution under OpenVMS fixed.
+
+* Bugzilla report 36171: -noclasspath crashes ant if no system
+ classpath is set.
+
+* <pvcs> used wrong switch for retrieving revisions by label.
+ Bugzilla Report 36359.
+
+* <sshexec> closed System.out, disabling output on second and subsequent
+ invocations. Bugzilla report 36302.
+
+* <cvschangelog> was crashing with CVS versions >= 1.12.x due to change in
+ the date format. Bugzilla report 30962.
+
+* The same IntrospectionHelper instance was continuously added as a listener
+ to project. Bugzilla report 37184.
+
+* FileUtils.toURI() was not encoding non-ASCII characters to ASCII,
+ causing impossibility to process XML entities referenced by XML
+ documents in non ASCII paths. Bugzilla report 37348.
+
+* > 1 ssh invocations to a given host would fail. Bugzilla report 36207.
+
+* EmailTask was eating SMTP error messages. Bugzilla report 37547.
+
+* PropertySet API setMapper(...) didn't properly set up the Mapper.
+ Bugzilla report 37760.
+
+* Proper return code for ant.bat. Bugzilla report 13655.
+
+* Project not set on ChainReaderHelpers used by the Redirector.
+ Bugzilla report 37958.
+
+* Copy task would fail on locked (or otherwise uncopyable) files even if
+ failonerror set to false. Bugzilla report 38175.
+
+* <junit> task did not print all the Test names when using forkmode='once'.
+ Bugzilla report 37426.
+
+* <available> could leak resources, Bugzilla Report 38260.
+
+* Redirector called Thread.sleep in a synchronized block. Bugzilla
+ report 37767.
+
+* CCUnlock's objselect attribute could exhibit unpredictable behavior;
+ standardized improperly included objselect and objsel property accessors to
+ delegate to the inherited objSelect property accessor. Bugzilla report 37766.
+
+* <unzip> and <untar> now correctly merge multiple nested patternsets.
+ Bugzilla Report 38973.
+
+* On case-insensitive filesystems, a <move> to change filename case
+ erroneously deleted the "destination" file before attempting to rename
+ the source file. Bugzilla 37701.
+
+* <scp> can now handle uris with @s other than the final one denoting the
+ domain. Bugzilla 38082.
+
+* If the class invoked by the <java> task threw a ClassNotFoundException,
+ this was misinterpreted as the specified class itself not being found.
+
+* <echoproperties> setPrefix javadoc claimed null or empty prefix would be
+ ignored; instead an error was thrown. Bugzilla report 39954.
+
+* <get> would fetch files that were up to date, because it used > in a
+ remote/local timestamp comparison, not >=. Bugzilla 35607.
+
+* <xslt> passes the current file (name + directory) to the
+ stylesheet/transformation. xsl-parameter name is configurable.
+ Bugzilla report 21042.
+
+* The <zip> API allowed creation of directories in file-only archives; a
+ habitual offender was the subclassed <jar>, which included META-INF/ in
+ the destination file regardless of whether filesonly was set to true.
+
+* <rmic> has a new adapter, xnew, to use the -XNew back end on java1.5+.
+ By forking rmic, this works on java1.6+. Bugzilla report 38732.
+
+* Copy of UnknownElement in macroinstance was not recursive.
+ Bugzilla report 40238.
+
+* Mixing of add and addConfigured methods in Mapper/ChainedMapper
+ causes incorrect chaining. Bugzilla report 40228.
+
+Other changes:
+--------------
+
+* Warn user when a reference in the form "${refid}" cannot be resolved as this
+ is a sign they probably meant "refid" (misuse of property expansion syntax).
+
+* Add dtd to javadoc for junit.
+ Bugzilla 40754.
+
+* Add quiet attribute to loadfile/resource.
+ Bugzilla 38249.
+
+* Make Locator#fromURI also append the drive letter when running under Windows
+ with JDK 1.3 or 1.2.
+
+* Do not uppercase the drive letters systematically in FileUtils#normalize.
+
+* Java 5 enumerations may now be used as values in XML attributes in place of
+ EnumeratedAttribute. Bugzilla 41058.
+
+* Create a pom file for ant-testutil and add ant-testutil.jar to the ant
+ distribution. Bugzilla 40980.
+
+* Roll back automatic proxy enabling on Java 1.5. It broke things like
+ Oracle JDBC drivers, and Ant itself on IBM's JVM on AIX, and didn't
+ seem to work to well the rest of the time.
+ To enable the feature, use the -autoproxy command line option.
+
+* Upgraded XML API and parser to Xerces 2.8.1
+
+* A code review of some threaded logic has tightened up the synchronization
+ of Watchdog, ExecuteWatchdog and ExecuteJava, which could reduce the occurrence
+ of race conditions here, especially on Java1.5+.
+
+* Allow broken reference build files. The defer reference processing would
+ break too many files - so allow them with a warning.
+
+* Removed dependency on sun.misc.UUEncoder for UUMailer.
+
+* Added regex attribute to the echoproperties task.
+ Bugzilla 40019.
+
+* <war> task now allows you to omit the web.xml file. as this is optional
+ in the servlet 2.5 and Java EE 5 APIs. set needxmlfile="false" to
+ avoid a missing web.xml file from halting the build.
+
+* Diagnostics catches and logs security exceptions when accessing system properties.
+
+* <javadoc> useexternalfile now applies to all command line arguments
+ of javadoc. Bugzilla report 40852.
+
+* javadoc/tag@description is now set to the name if description is
+ not specified. Bugzill report 32927.
+
+* Some performance improvements, including Bugzilla report 25778.
+
+* Add <matches> condition. Bugzilla report 28883.
+
+* Extending JAR-Task for SPI. Bugzilla report 31520.
+
+* Added <tokens> resource collection for convenient creation of string
+ resources from other resources' content. Inspired by Bugzilla 40504.
+
+* Added <compare> resource selector to select resources based on the
+ results of their comparison to other resources.
+
+* Added outputtoformatters attribute to <junit> to allow suppression
+ of noisey tests. Bugzilla report 12817.
+
+* Log level of message 'Overriding previous definition of reference to'
+ set to Verbose. Bugzilla report 17240.
+
+* Added setbeans attribute to <script> to allow <script>'s to be
+ run without referencing all references.
+ Bugzilla report 37688.
+
+* Added classpath attribute and nested element to <script> to allow
+ the language jars to be specified in the build script.
+ Bugzilla report 29676.
+
+* Trim the driver attribute on the <sql> task. Bugzilla report 21228.
+
+* Allow (jar) files as well as directories to be given to jdepend.
+ Bugzilla report 28865.
+
+* Convert SplashTask to use NOT sun internal classes.
+ Bugzilla report 35619.
+
+* Made PatternSet#hasPatterns public to allow custom filesets access.
+ Bugzilla report 36772.
+
+* Added searchparents attribute to <available>. Bugzilla report 39549.
+
+* Tasks that don't extend Ant's Task class will now get the build file
+ location reflected into a method of the signature void setLocation(Location)
+ - if such a method exists.
+
+* Remove needless synchronization in DirectoryScanner.
+ Bugzilla report 40237.
+
+* Improved recursion detection for lines with multiple matches of same token
+ on a single line. Bugzilla report 38456.
+
+* Task will now log correctly even if no project is set.
+ Bugzilla report 38458.
+
+* Use alternative names for the command line arguments in javac. Bugzilla
+ Report 37546.
+
+* The Reference class now has a project field that will get
+ used (if set) in preference to the passed in project, when
+ dereferencing the reference. Bugzilla Report 25777.
+
+* On DOS and Netware, filenames beginning with a drive letter
+ and followed by a colon but with no directory separator following
+ the colon are no longer (incorrectly) accepted as absolute pathnames
+ by FileUtils.normalize() and FileUtils.isAbsolutePath(). Netware
+ volumes can still be specified without an intervening separator.
+ UNC pathnames on Windows must include a server and share name, i.e.
+ "\\a\b" to be considered valid absolute paths.
+
+* A bug in SQLExec would prevent the execution of trailing,
+ non-semicolon-delimited statements. Bugzilla Report 37764.
+
+* InputHandler implementations may now call InputRequest.getDefaultValue()
+ if they wish. The default handler uses this also. Bugzilla report 28621.
+
+* Took in bugzilla report 39320, "Simple code cleanups"
+
+* Improve compatibility with GNU Classpath and java versions prior to
+ 1.5. Bugzilla 39027.
+
+* ${ant.core.lib} may now be used to refer to the library containing the
+ Ant classes, for instance useful when compiling tasks.
+
+* Minor performance improvements Bugzilla report 37777
+
+* New task <manifestclasspath> converts a path into a property
+ suitable as the value for a manifest's Class-Path attribute.
+
+* Fixed references to obsoleted CVS web site. Bugzilla Report 36854.
+
+* Log fine-grained events at verbose level from JUnit. Bugzilla report 31885.
+
+* <WsdlToDotnet> and <style> are now deprecated in favor of <wsdltodotnet> and
+ <xslt>, respectively. Bugzilla report 25832.
+
+* <echoproperties> now (alphanumerically) sorts the property list
+ before echoing. Bugzilla report 18976.
+
+* A new base class DispatchTask has been added to facilitate elegant
+ creation of tasks with multiple actions.
+
+* Major revision of <wsdltodotnet>. Supports mono wsdl and the microsoft
+ wsdl run on mono, as well as most of the .NET WSE2.0 options. Extra
+ schemas (files or urls) can be named in the <schema> element.
+ Compilers can be selected using the compiler attribute, which defaults
+ to "microsoft" on windows, and "mono" on everything else.
+
+* It is now possible to specify the pattern created/parsed by <checksum>.
+ Bugzilla Report 16539.
+
+* Added a new "failall" value for the onerror attribute of <typedef>.
+ Bugzilla report 31685.
+
+* unzip/unwar/unjar/untar now supports a nested mapper, which lets you unzip
+ in useful ways.
+
+* Junit task -- display suite first.
+ Bugzilla report 31962.
+
+* Added isSigned condition and signedselector selector
+ Bugzilla report 32126.
+
+* Added preserveLastModified attribute to signjar task.
+ Bugzilla report 30987.
+
+* Added <scriptcondition> condition, for inline scripted conditions
+
+* Added <xor> condition for exclusive-or combining of nested conditions.
+
+* Added <scriptselector> selector for scripted file selection
+
+* ant -diagnostics lists contents of ${user.home}/.ant/lib , and
+ checks that the java.io.tmpdir directory exists and is writeable.
+
+* mail task accepts nested header element. Bugzilla report 24713.
+
+* zip/jar/war/ear supports level attribute for deflate compression level.
+ Bugzilla report 25513.
+
+* Added loginputstring attribute to the redirector type.
+
+* Tighten security by sending storepass and keypass to signjar
+ via the input stream of the forked process.
+
+* New task <schemavalidate> extends <xmlvalidate> with extra support
+ for XML Schema (XSD) files.
+
+* <fixcrlf> supports a file attribute for easy fixup of a single file.
+
+* New condition <parsersupports> which can look for XML parser feature or
+ property support in the parser Ant is using.
+
+* fixcrlf can be used in a filterchain.
+
+* <sync> has a new nested element <preserveInTarget> that can be used
+ to protect extra-content in the target directory. Bugzilla Report
+ 21832.
+
+* <signjar> now supports:
+ -nested filesets at the same time as the jar attribute
+ -a destDir attribute with the appropriate dependency logic, which
+ can be used with the jar attribute or nested filesets
+ -a mapper to permit filename remapping on signing
+ -tsaurl and tsacert attributes for timestamped JAR signing
+ -nested <sysproperty> elements, which can be used for proxy setup
+ and the like
+
+* The linecontains and linecontainsregexp filterreaders now support a
+ negate attribute to select lines -not- containing specified text.
+ Bugzilla Report 34374.
+
+* <os> condition adds "winnt" as a family which can be tested. This is
+ all windows platforms other than the Win9x line or Windows CE.
+
+* <exec> (and hence, <apply> and any other derived classes) have an OsFamily
+ attribute, which can restrict execution to a single OS family.
+
+* Added "backtrace" attribute to macrodef. Bugzilla report 27219.
+
+* Ant main provides some diagnostics if it ever sees a -cp or -lib option,
+ as this is indicative of a script mismatch. Bugzilla report 34860
+
+* <junitreport> prints a special message if supplied an empty XML File. This
+ can be caused by the test JVM exiting during a test, either via a
+ System.exit() call or a JVM crash.
+
+* Project name is now used for *all* targets so one can write consistent import
+ build files. Bugzilla report 28444.
+
+* New condition <typefound> that can be used to probe for the declaration
+ and implementation of a task, type, preset, macro, scriptdef, whatever.
+ As it tests for the implementation, it can be used to check for optional
+ tasks being available.
+
+* Check for 1.5.* Ant main class. (weblogic.jar in classpath reports)
+
+* New condition <isfailure> that tests the return-code of an executable. This
+ contains platform-specific logic and is better than comparing the result with
+ "0".
+
+* Added initial support for Resource Collections, including the
+ resourcecount task.
+
+* property attribute of pathconvert is now optional. If omitted the
+ result will be written to the log.
+
+* New mapper, <scriptmapper>, supports scripted mapping of source files/strings
+ to destination strings.
+
+* Add the echoxml task. This will echo nested XML to a file, with
+ the normal <?xml ?> processor instruction. UTF-8 encoding only; no-namespace
+ support.
+
+* Try to make subprojects of custom Project subclasses instances of the
+ same type. Bugzilla report 17901.
+
+* <ssh> and <scp> support keyboard-interactive authentication now.
+
+* <javadoc> now supports -breakiterator for custom doclets if Ant is
+ running on JSE 5.0 or higher. Bugzilla Report: 34580.
+
+* New logger, TimestampedLogger, that prints the wall time that a build
+ finished/failed. Use with
+ -logger org.apache.tools.ant.listener.TimestampedLogger
+
+* <junitreport> now generates pages alltests-errors.html and
+ alltests-fails.html, that list only the errors and failures, respectively.
+ Bugzilla Report: 36226
+
+* New task <makeurl> that can turn a file reference into an absolute file://
+ url; and nested filesets/paths into a (space, comma, whatever) separated
+ list of URLs. Useful for RMI classpath setup, amongst other things.
+
+* <xslt> now accepts nested FileNameMappers e.g. <globmapper>.
+ Bugzilla report 37604.
+
+* New task <loadresource> that accompanies <loadfile> for non file resources.
+
+* <echo> now supports an encoding when saving to a file.
+
+* New GreedyInputHandler added.
+
+* Add textfile attribute to the <filesmatch> condition. When true, the text
+ contents of the two files are compared, ignoring line ending differences.
+
+* New <resourcesmatch> condition.
+
+* Added the onmissingfiltersfile attribute to filterset. Bugzilla report 19845.
+
+* Added the inline handler element to the input task.
+
+* <sql> supports property expansion if you set the expandProperties
+ attribute. By default it does not expand properties, something we
+ dare not change for fear of breaking complex SQL operations in
+ existing files.
+
+* <javadoc>'s packagenames attribute is now optional and defaults to "*".
+
+* <javac>'s source and target attributes as well as <javadoc>'s source
+ attribute will read default values from the properties
+ ant.build.javac.source and ant.build.javac.target.
+
+* Handling of ' ', '#' in CLASSPATH and '#' in -lib (cannot use ' '
+ in -lib on UNIX at the moment). Bugzilla Report 39295.
+
+* <scp> now optionally supports the sftp protocol. Bugzilla Report 39373.
+
+* Resources can now be used to indicate the location of the stylesheet to use
+ in <xslt>. Bugzilla Report 39407.
+
+* New <antversion> condition. Bugzilla report 32804.
+
+* ReplaceTokens should allow properties files. Bugzilla report 39688.
+
+* FTP Account could not be specified in ant FTP task. Bugzilla report 39720.
+
+* Minor performance updates. Bugzilla report 39565.
+
+* New deleteonexit attribute for the <tempfile> task. Bugzilla report 39842.
+ Remember that the exit of the JVM can be a long time coming,
+ especially under an IDE. Don't rely on this being called.
+
+* <scriptdef>-created scripts have support for nested text. All text
+ passed to a scripted task can be accessed via self.text.
+
+* <fixcrlf> now supports an outputencoding attribute. Bugzilla report 39697.
+
+* <junitreport> now supports nested XSL parameters. Bugzilla report 39708.
+
+* <javacc> has a jdkversion attribute to pass the desired JDK version
+ down to javacc. Bugzilla report 38715.
+
+* <cvs> prints passfile info at -verbose level instead of -info. Bugzilla
+ report 35268
+
+* When <javac> can't find the compiler class, it prints out java.home for
+ immediate diagnostics
+
+* Ant launcher now supports a -main attribute so that you can specify
+ an extension class to the built in org.apache.tools.ant.Main
+ class. This class must implement the interface AntMain
+
+Changes from Ant 1.6.4 to Ant 1.6.5
+===================================
+
+Changes that could break older environments:
+--------------------------------------------
+
+Fixed bugs:
+-----------
+
+* <move> was unable to replace existing files or write into
+ existing directories. Bugzilla report 34962.
+
+* <macrodef> with redefined default values was incorrect. (Fix for
+ 31215 had a bug). Bugzilla report 35109.
+
+* <javadoc> will convert backslashes to forwardslashes when generating file
+ list by useexternalfile. Bugzilla report 27814.
+
+Changes from Ant 1.6.3 to Ant 1.6.4
+===================================
+
+Changes that could break older environments:
+--------------------------------------------
+* <ftp> task has had a number of changes. Uptodate calculation previously
+ did not call a file uptodate if the source timestamp and the destination
+ timestamp were equal. Bugzilla report 34941. Any script that attempted
+ to compensate for this by using the timediffmillis attribute might need
+ to be tweaked.
+
+
+Fixed bugs:
+-----------
+
+* Sun javah failed with java.lang.NoClassDefFoundError.
+ Bugzilla report 34681.
+
+* DirectoryScanner.slowScan() was broken. Bugzilla report 34722.
+
+* DirectoryScanner.scan() could throw a NullPointerException on
+ case-insensitive filesystems (read Windows or MacOS X).
+
+* Get w/authentication failed with ArrayOutOfBoundsExceptions.
+ Bugzilla report 34734.
+
+* Granularity attribute for <sync> task was undocumented.
+ Bugzilla report 34871.
+
+* <unzip> and <untar> could leave file handles open on invalid
+ archives. Bugzilla report 34893.
+
+* propertyset threw NPE with nested, mapped propertysets.
+
+Other changes:
+--------------
+
+* AntXMLContext.setCurrentTargets() is now public. Bugzilla report 34680.
+
+Changes from Ant 1.6.2 to Ant 1.6.3
+===================================
+
+Changes that could break older environments:
+--------------------------------------------
+
+* The subant task used the canonical version of a file path. This
+ has been changed to use the absolute path. Bugzilla 30438.
+
+* Tar now writes two EOF blocks rather than one.
+ Bugzilla report 28776
+
+* The Reference object now has a project field which it uses in preference
+ to the project passed in. This allows composite references to be
+ handled to nested projects.
+ Bugzilla report 25777
+
+* <junit> with filtertrace="true" will now also swallow lines for the
+ sun.reflect package. If you need to see them in your stack trace,
+ you must set filtertrace to false.
+ Bugzilla Report 22758
+
+* The jikes compiler adapter now supports -bootclasspath, -extdirs and
+ -sourcepath and also uses the same logic for debug flags as javac.
+ This means, the jikes compiler adapter now requires Jikes 1.15 or later.
+ Bugzilla Reports 25868, 26404 and 32609.
+
+* The gcj compiler adapter used to include the Java runtime classes
+ even if includeJavaRuntime was set to false, unless the
+ bootclasspath has been specified as well. It will now always adhere
+ to includeJavaRuntime, you may need to set it to true explicitly now
+ if you relied on the old behavior.
+
+Other changes:
+--------------
+
+* <javadoc> can now take an attribute 'executable'. Bugzilla report 30606.
+
+* New attribute ignorecontents for <different> selector
+
+* Javadoc fixes for Location, Project, and RuntimeConfigurable
+ Bugzilla 30160.
+
+* Enable to choose the regexp implementation without system property.
+ Bugzilla Report 15390.
+
+* Expose objects and methods in IntrospectionHelper. Bugzilla Report 30794.
+
+* Allow file attribute of <move> to rename a directory.
+ Bugzilla Report 22863.
+
+* Add xmlcatalog nested element to XmlProperty. Bugzilla report 27053.
+
+* New attribute alwayslog for <redirector> type.
+
+* Added <target> nested elements to <ant> and <antcall> to allow
+ specification of multiple sub-build targets, which are executed
+ with a single dependency analysis.
+
+* Refactored Target invocation into org.apache.tools.ant.Executor
+ implementations. Bugzilla Reports 21421, 29248.
+
+* <rmic> now also supports Kaffe's rmic version shipping with Kaffe
+ 1.1.2 and above.
+
+* added casesensitive attribute to <globmapper> and <regexpmapper>
+ Bugzilla report 16686
+
+* added handledirsep attribute to <globmapper> and <regexpmapper>
+ Bugzilla report 32487
+
+* added a new mapper <filtermapper>
+
+* When a BuildListener tried to access System.err or System.out, Ant
+ would have thrown an exception - this has been changed. Ant now
+ silently ignores the message. BuildListeners still should avoid
+ accessing either stream.
+
+* Added a comment attribute to the zip task.
+ Bugzilla report 22793.
+
+* Overloaded FileUtils.createNewFile with a boolean mkdirs attribute
+ to create nonexistent parent directories.
+
+* <apply> has a new "force" attribute that, when true, disables
+ checking of target files.
+
+* Made the dest attribute of the apply task optional; mapped target
+ filenames will be interpreted as absolute pathnames when dest is omitted.
+
+* Changed default tempdir for <javac> from user.dir to java.io.tmpdir.
+
+* Added searchpath attribute to <exec> for searching path variable(s)
+ when resolveexecutable = true.
+
+* Added revision and userid attributes to <pvcs> documentation.
+
+* Added support to the touch task for a mkdirs attribute to create
+ nonexistent parent directories before touching new files.
+
+* Added support to the touch task for a pattern attribute to allow
+ alternate datetime formats.
+
+* Added support to the touch task to map touched files using a nested
+ mapper element.
+
+* Added support to the touch task for a verbose attribute to suppress
+ logging of new file creation.
+
+* bad link in docs to the enhancement page in bugzilla.
+ Bugzilla report 33252.
+
+* Added length task to get strings' and files' lengths.
+
+* <native2ascii> and <javah> now also support Kaffe's versions.
+
+* Recursive token expansion in a filterset can now be disabled by
+ setting its recurse attribute to false.
+
+* Pathconvert no longer requires that one of (targetos|pathsep|dirsep)
+ be set; platform defaults are used when this is the case.
+
+* Added preservelastmodified attribute to fixcrlf task. Bugzilla 25770.
+
+* Added isfileselected condition.
+
+* Added verbose="true|false" attribute to <subant>. When verbose is enabled,
+ the directory name is logged on entry and exit of the sub-build.
+ Bugzilla 33787.
+
+* Added -nouserlib option to allow running ant without automatically loading
+ up ${user.home}/.lib/ant. This is useful when compiling ant, and antlibs.
+ Modified the build.sh and build.bat to use the option.
+
+* Added -noclasspath option to allow running ant WITHOUT using CLASSPATH env
+ variable. Modified ant.bat to do this so that %CLASSPATH% is not looked at.
+
+* Add else attribute to the condition task, which specifies an
+ optional alternate value to set the property to if the nested
+ condition evaluates to false. Bugzilla report 33074.
+
+* Ant generated jar files should now be detected as jar files by
+ Solaris. Bugzilla Report 32649.
+
+* <rexec> with a single command should now work with unusal login
+ dialogs without special read/write pairs. Bugzilla Report 26632.
+
+* <csc>'s extraoptions can now contain multiple arguments.
+ Bugzilla Report 23599.
+
+* <macrodef> with default values set by properties would be
+ seen as new definitions when called twice with different properties.
+ This was confusing so the definitions are now treated as similar.
+ Bugzilla Report 31215.
+
+* <javadoc> has a new attribute "includenosourcepackages" that can be
+ used to document packages that don't hold source files but a
+ package.html file. Bugzilla Report 25339.
+
+* <rpm> has new attributes failonerror and quiet.
+
+* Added two tutorials
+ - beginner: introduction into Ant
+ - task developers: using path, fileset etc
+
+* a number of new attributes that allow the user to handle non-standard
+ server listing formats and time zone differences have been added in
+ the <ftp> task.
+
+
+Fixed bugs:
+-----------
+
+* Do not pass on ThreadDeath when halting <java fork="false">. Bugzilla
+ 32941.
+
+* Killing a thread running <java fork="true"> (e.g. from an IDE) would
+ not stop the forked process. Bugzilla 31928.
+
+* Programs run with <java fork="true"> can now accept standard input
+ from the Ant console. (Programs run with <java fork="false"> could
+ already do so.) Bugzilla 24918.
+
+* AbstractCvsTask prematurely closed its outputStream and errorStream.
+ Bugzilla 30097.
+
+* Impossible to use implicit classpath for <taskdef>
+ when Ant core loader != Java application loader and
+ Path.systemClassPath taken from ${java.class.path} Bugzilla 30161.
+
+* MacroInstance did not clean up nested elements correctly in the execute
+ method, causing multiple use of the same macro instance with nested
+ elements to fail.
+
+* checksum fileext property doc wrong. Bugzilla 30787.
+
+* FTP task, getTimeDiff method was returning wrong value. Bugzilla 30595.
+
+* make sure that Zip and its derivatives call the createEmptyZip method when
+ there are no resources to zip/jar/...
+
+* Zip task was not zipping when only empty directories were found.
+ Bugzilla 30365.
+
+* Jar task was not including manifest files when duplicate="preserve" was
+ chosen. Bugzilla 32802.
+
+* ant.bat was missing runAntNoClasspath label for goto.
+ Bugzilla 34510.
+
+* Classpath was treated in the same way as -lib options. Bugzilla 28046.
+
+* Manual page for cvsversion contained incorrect attributes and did not
+ say since 1.6.1. Bugzilla 31408.
+
+* Typo in definition of <cvsversion> task causing it not to be defined.
+ Bugzilla 31403.
+
+* Execution of top level tasks in imported files get delayed by targets.
+ Bugzilla report 31487.
+
+* ExecTask executes checkConfiguration() even though os does not match.
+ Bugzilla report 31805.
+
+* Concat task instance could not be run twice.
+ Bugzilla report 31814.
+
+* NPE using XmlLogger and antlib.
+ Bugzilla report 31840.
+
+* Properties.propertyNames() should be used instead of .keys().
+ Bugzilla report 27261.
+
+* Target location is not set for default target.
+ Bugzilla report 32267.
+
+* Incorrect classloader parent in junittask when using with
+ ant-junit.jar and junit.jar not in the project classloader. Bugzilla
+ report 28474.
+
+* getResources() on the classloader returned by ClasspathUtils would
+ see each resource twice - if the resource is in the project
+ classpath and if the classloader is requested with a null path.
+
+* XMLValidate used URL#getFile rather than the ant method FileUtils#fromURI
+ Bugzilla report 32508
+
+* fixed Regexp-Mapper docs which gave outdated instructions (optional.jar)
+ Bugzilla report 28584
+
+* <scp> using <fileset> didn't work with OpenSSH 3.9 and later.
+ Bugzilla report 31939
+
+* <setproxy> failed to set user/password on some JDKs.
+ Bugzilla report 32667
+
+* untar would go into infinite loop for some invalid tar files.
+ Bugzilla report 29877
+
+* forked <javac> won't pass -source to a JDK 1.1 or 1.2 javac anymore.
+ Bugzilla report 32948
+
+* propertyset references did not handle nested propertyset references.
+
+* oata.types.Description.getDescription(Project) would throw a
+ NullPointerException when the "ant.targets" reference was unset.
+
+* Wrapper scripts did not detect WINNT value of dynamic OS environment
+ variable when logged into workstations using Novell authentication.
+ Bugzilla Report 30366.
+
+* DependScanner.getResource() always returned nonexistent resources,
+ even when the resource actually existed. Bugzilla Report 30558.
+
+* <apply> was broken with classfilesets. Bugzilla Report 30567.
+
+* <available> returned false positives when checking a file
+ passed in with the current basedir leading twice:
+ e.g. ${basedir}${file.separator}${basedir}${file.separator}foo .
+
+* The first file open that took place when using input files with the
+ <exec>, <apply>, or <java> tasks was always logged to System.out
+ instead of to the managing Task.
+
+* <telnet> and <rexec> would try to disconnect from servers they never
+ connetced to, potentially leading to exceptions in commons-net.
+ Bugzilla Report 33618.
+
+* <zip> would drop files matched by defaultexcludes during updates.
+ Bugzilla Report 33412.
+
+* <zip> couldn't store files with size between 2GB and 4GB (the
+ upper limit set by the ZIP format itself). Bugzilla Report 33310.
+
+* NPE when when <presetdef> tries to configure a task that
+ cannot be instantiated. Bugzilla Report 33689.
+
+* <javac debug="false"> created an invalid command line when running
+ the Symantec Java compiler.
+
+* Get with usetimestamp did not work on Java 1.2.
+
+* Get with usetimestamp did not work when local timestamp roughly >= now.
+
+* The framed JUnit report now handles multiple reports for the same
+ testcase properly. Bugzilla Report 32745.
+
+* <cab> didn't work for files with spaces in their names on Windows.
+ Bugzilla Report 17182.
+
+* The VAJ tasks could fail if the project name contained characters
+ that need to get URL encoded. Bugzilla Report 23322.
+
+* TarInputStream#read() wasn't implemented correctly. Bugzilla Report
+ 34097.
+
+* <xslt> failed to process file-hierarchies of more than one level if
+ scanincludeddirectories was true. Bugzilla Report 24866.
+
+* forkmode="perBatch" or "once" would ignore extension attributes that
+ had been specified for <formatter>s. Bugzilla Report 32973.
+
+* The refid attribute of the I/O redirector was not functional.
+
+Changes from Ant 1.6.1 to Ant 1.6.2
+===================================
+
+Changes that could break older environments:
+--------------------------------------------
+
+* The import task used the canonical version of a file path. This
+ has been changed to use the absolute path. Bugzilla 28505.
+
+* ant-xalan2.jar has been removed since the only class contained in it
+ didn't depend on Xalan-J 2 at all. Its sole dependency has always
+ been TraX and so it has been merged into ant-trax.jar.
+
+* All exceptions thrown by tasks are now wrapped in a buildexception
+ giving the location in the buildfile of the task.
+
+* Nested elements for namespaced tasks and types may belong to the
+ Ant default namespace as well as the task's or type's namespace.
+
+* <junitreport> will very likely no longer work with Xalan-J 1.
+
+ Note that Xalan-J 1 has been deprecated for a very long time and we
+ highly recommend that you upgrade.
+
+ If you really need to continue using Xalan-J 1, please copy the
+ junit-frames-xalan1.xsl from the distribution's etc directory as
+ junit-frames.xsl into a new directory and use the task's styledir
+ attribute to point to. This is the last version of the XSLT
+ stylesheet that is expected to be compatible with Xalan-J 1.
+
+Fixed bugs:
+-----------
+
+* eliminate memory leak in AntClassLoader. Bugzilla Report 8689.
+
+* subant haltonfailure=false did not catch all failures. Bugzilla Report 27007.
+
+* macrodef @@ escaping was broken. Bugzilla Report 27069.
+
+* MacroDef did not allow attributes named 'description'. Bugzilla Report 27175.
+
+* Throw build exception if name attribute missing from patternset#NameEntry.
+ Bugzilla Report 25982.
+
+* Throw build exception if target repeated in build file, but allow targets
+ to be repeated in imported files.
+
+* <apply> didn't compare timestamps of source and targetfiles when
+ using a nested <filelist>. Bugzilla Report 26985.
+
+* tagdiff.xml was broken in ant 1.6.1. Bugzilla Report 27057.
+
+* if the basedir contained .. or . dirs, and the build file name contained
+ .. or ., the basedir was set incorrectly. Bugzilla Report 26765.
+
+* regression from ant 1.5, exec task outputted two redundant trailing newlines.
+ Bugzilla Report 27546.
+
+* NPE when running commons listener. Bugzilla Report 27373.
+
+* <java> swallowed the stack trace of exceptions thrown by the
+ executed program if run in the same VM.
+
+* -projecthelp swallowed (configuration) errors silently.
+ Bugzilla report 27732.
+
+* filterset used by filtertask doesn't respect loglevel. Bugzilla Report 27568.
+
+* wrong compare used in ProjectComponent for logging. Bugzilla Report 28070.
+
+* failOnAny attribute for <parallel> was broken. Bugzilla Report 28122.
+
+* If <javac> uses gcj and any of the nested <compilerarg>s implies
+ compilation to native code (like -o or --main), Ant will not pass
+ the -C switch to gcj. This means you can now compile to native code
+ with gcj which has been impossible in Ant < 1.6.2.
+
+* <import optional="false"> and <import optional="true">
+ behaved identically.
+
+* <xslt> now sets the context classloader if you've specified a nested
+ <classpath>. Bugzilla Report 24802.
+
+* <zip> and friends would delete the original file when trying to update
+ a read-only archive. Bugzilla Report 28419.
+
+* <junit> and <assertions> are working together. Bugzilla report 27218
+
+* AntClassLoader#getResource could return invalid URLs. Bugzilla
+ Report 28060.
+
+* Ant failed to locate tools.jar if the jre directory name wasn't all
+ lowercase. Bugzilla Report 25798.
+
+* Redirector exhibited inconsistent behavior with regard to split
+ output. When sent to file only, files would be created in all
+ cases; when split file-property, files were only created if
+ writes were performed.
+
+* fixed case handling of scriptdef attributes and elements.
+
+* UNC pathnames did not work for ANT_HOME or -lib locations on Windows.
+ Bugzilla report 27922.
+
+* replacestring tokenfilter only replaced the first occurrence.
+
+* AntLikeTasksAtTopLevelTest failed on cygwin.
+
+* I/O-intensive processes hung when executed via <exec spawn="true">.
+ Bugzilla reports 23893/26852.
+
+* JDependTask did not close an output file. Bugzilla Report 28557.
+
+* Using <macrodef> could break XmlLogger. Bugzilla Report 28993.
+
+* <genkey> no longer requires keytool to be in your PATH. Bugzilla
+ Report 29382.
+
+* <symlink> could create cyclic links. Bugzilla Report 25181.
+
+* <zip whenempty="skip"> didn't work in a common situation. Bugzilla
+ Report 22865.
+
+* <scp> now properly handles remote files and directories with spaces
+ in their names. Bugzilla Report 26097.
+
+* <scp> now has (local|remote)tofile attributes to rename files on the
+ fly. Bugzilla Report 26758.
+
+* <telnet> and <rexec> didn't close the session. Bugzilla Report 25935.
+
+* <subant> and XmlLogger didn't play nicley together.
+
+Other changes:
+--------------
+* doc fix concerning the dependencies of the ftp task
+ Bugzilla Report 29334.
+
+* <xmlvalidate> has now a property nested element,
+ allowing to set string properties for the parser
+ Bugzilla Report 23395.
+
+* Docs fixes for xmlvalidate.html, javadoc.html, starteam.
+ Bugzilla Reports 27092, 27284, 27554.
+
+* <pathconvert> now accepts nested <mapper>s. Bugzilla Report 26364.
+
+* Shipped XML parser is now Xerces-J 2.6.2.
+
+* Added nested file element to filelist.
+
+* spelling fixes, occurred. Bugzilla Report 27282.
+
+* add uid and gid to tarfileset. Bugzilla Report 19120.
+
+* <scp> has a verbose attribute to get some feedback during the
+ transfer and new [local|remote][File|Todir] alternatives to file and
+ todir that explicitly state the direction of the transfer.
+
+* The OS/2 wrapper scripts have been adapted to use the new launcher.
+ Bugzilla Report 28226.
+
+* <sshexec> now also captures stderr output. Bugzilla Report 28349.
+
+* <xslt> now supports a nested <mapper>. Bugzilla Report 11249.
+
+* <touch> has filelist support.
+
+* <nice> task lets you set the priority of the current thread; non-forking
+ <java> code will inherit this priority in their main thread.
+
+* New attribute "negate" on <propertyset> to invert selection criteria.
+
+* Target now supports a Location member. Bugzilla Report 28599.
+
+* New "pattern" attribute for <date> selector.
+
+* <junit> has a new forkmode attribute that controls the number of
+ Java VMs that get created when forking tests. This allows you to
+ run all tests in a single forked JVM reducing the overhead of VM
+ creation a lot. Bugzilla Report 24697.
+
+* <jar> can now optionally create an index for jars different than the
+ one it currently builds as well. See the new <indexjars> element
+ for details. Bugzilla Report 14255.
+
+* Permit building under JDK 1.5. Bugzilla Report 28996.
+
+* minor Javadoc changes. Bugzilla Report 28998.
+
+* Misc. corrections in SignJar.java. Bugzilla Report 28999.
+
+* Remove redundant <hr> from javah.html. Bugzilla Report 28995.
+
+* Ignore built distributions. Bugzilla Report 28997.
+
+* A new roundup attribute on <zip> and related task can be used to
+ control whether the file modification times inside the archive will
+ be rounded up or down (since zips only store modification times with
+ a granularity of two seconds). The default remains to round up.
+ Bugzilla Report 17934.
+
+* A binary option has been added to <concat>. Bugzilla Report 26312.
+
+* Added DynamicConfiguratorNS, an namespace aware version of
+ DynamicConfigurator. Bugzilla Report 28436.
+
+* Add implicit nested element to <macrodef>. Bugzilla Report 25633.
+
+* Add deleteonexit attribute to <delete>.
+
+* Added Target.getIf/Unless(). Bugzilla Report 29320.
+
+* <fail> has a status attribute that can be used to pass an exit
+ status back to the command line.
+
+* <fail> accepts a nested <condition>.
+
+* <loadproperties> supports loading from a resource.
+ Bugzilla Report 28340.
+
+* Nested file mappers and a container mapper implementation have been
+ introduced. Additionally, the <mapper> element now accepts "defined"
+ nested FileNameMapper implementations directly, allowing a usage
+ comparable to those of <condition>, <filter>, and <selector>.
+
+* New <redirector> type introduced to provide extreme I/O flexibility.
+ Initial support for <exec>, <apply>, and <java> tasks.
+
+* <apply> has a new ignoremissing attribute (default true for BC)
+ which will allow nonexistent files specified via <filelist>s to
+ be passed to the executable. Bugzilla Report 29585.
+
+* <junitreport> now also works with Xalan XSLTC and/or JDK 1.5.
+ Bugzilla Report 27541.
+
+* <jspc> doesn't work properly with Tomcat 5.x. We've implemented a
+ work-around but don't intend to support future changes in Tomcat
+ 5.x. Please use the jspc task that ships with Tomcat instead of
+ Ant's.
+
+Changes from Ant 1.6.0 to Ant 1.6.1
+=============================================
+
+Changes that could break older environments:
+--------------------------------------------
+
+* License is now Apache License 2.0
+ see http://www.apache.org/licenses/ for more information
+
+Fixed bugs:
+-----------
+* Remove a recursive template call in the junit xsls that could trigger a stack
+ overflow. It now uses Xalan extensions to call a Java class directly.
+ Bugzilla Report 19301
+
+* Fix spurious infinite loop detection for filters (introduced in ant 1.6.0).
+ Bugzilla Report 23154.
+
+* Fix handling of default ant namespace for nested elements.
+
+* Fix jboss element of ejb task (introduced in ant 1.6.0).
+
+* <whichresource> failed to load classes correctly.
+
+* Ant could fail to start with a NullPointerException if
+ ANT_HOME/lib/ant-launcher.jar was part of the system CLASSPATH.
+
+* presetdef'ed types did not work with the ant-type attribute
+
+* fixed case handling of macrodef attributes and elements. Bugzilla
+ Reports 25687 and 26225.
+
+* <java> ignored the append attribute, Bugzilla Report 26137.
+
+* The gcj compiler adapter for <javac> failed if the destination
+ directory didn't exist. Bugzilla Report 25856.
+
+* Ant now fails with a more useful message if a new process will be
+ forked in a directory and that directory doesn't exist.
+
+* <splash> used to break the build on non-GUI environments. Bugzilla
+ report 11482.
+
+* Ant 1.6.0 cannot run build scripts in directories with non-ASCII names.
+ Bugzilla Report 26642.
+
+Other changes:
+--------------
+* Shipped XML parser is now Xerces-J 2.6.1
+
+* Translate task logs a debug message specifying the number of files
+ that it processed. Bugzilla Report 13938.
+
+* <fixcrlf> has a new attribute - fixlast. Bugzilla Report 23262.
+
+* <p4submit> has 2 new attributes, needsresolveproperty and changeproperty.
+ Bugzilla Report 25711.
+
+* add description attributes to macrodef attributes and elements.
+ Bugzilla Report 24711.
+
+* Extending ClearCase Tasks :
+ - Added an extra option to 'failonerr' to each ClearCase task/command.
+ - Extended the functionality of cccheckout. It can check (notco) to see if
+ the desired element is already checked out to the current view. Thus it
+ won't attempt to check it out again.
+ - Added three new ClearCase commands: ccmkattr, ccmkdir, ccmkelem
+ Bugzilla Report 26253.
+
+* added nested text support to <macrodef>
+
+* added initial support for Java 1.5. Java 1.5 is now correctly
+ detected by Ant and treated just like Java 1.4. You can now specify
+ source="1.5" in the <javac> task.
+
+* created new task <cvsversion>
+
+* added support for branch logging via the tag attribute in <cvschangelog>
+ Bugzilla Report 13510.
+
+* added support the groovy language in the script and scriptdef tasks
+
+Changes from Ant 1.5.4 to Ant 1.6.0
+===================================
+
+Changes that could break older environments:
+--------------------------------------------
+
+* This version of Ant can not be built with JDK 1.1 and requires at
+ least Java 1.2 at runtime as well. Compiling for a 1.1 target is
+ still supported.
+
+* Targets cannot have the empty string as their name any longer.
+
+* ant.jar's manifest does no longer include a Class-Path entry, so it
+ is no longer possible to run Ant via "java -jar ant.jar" without
+ manually altering the CLASSPATH. Instead of that a file
+ ant-bootstrap.jar is included in the etc directory of the binary
+ distribution, copy this to the lib directory and use
+ "java -jar ant-bootstrap.jar" instead if you want to run Ant without
+ the wrapper script (not recommended).
+
+* The <script> task now requires Apache BSF instead of the older IBM
+ version. See <http://jakarta.apache.org/bsf/>
+
+* <xmlproperty> will no longer fail if the file to be loaded doesn't exist.
+
+* XML namespaces are now enabled in the XML parser, meaning XML namespace
+ declarations no longer cause errors. However task names containing colons
+ will cause errors unless there is a corresponding namespace uri.
+
+* The <ftp> and <telnet> tasks now require Jakarta Commons Net instead
+ of the older ORO Netcomponents version. See
+ <http://jakarta.apache.org/commons/net/index.html>.
+
+* <input> will no longer prompt the user and wait for input if the
+ addproperty attribute is set to a property that has already been
+ defined in the project. If you rely on the task waiting for input,
+ don't use the addproperty attribute.
+
+* The Class-Path attribute in manifests will no longer merge the
+ entries of all manifests found, but will be treated like all other
+ manifest attributes - the most recent attribute(s) will be used.
+
+* New Launch mechanism implemented. This moves some functionality from
+ the batch files / shell scripts into Java. This removes environment
+ limitations, for command issues, directory depth issues on Windows. Also
+ allows a per-user library location to be used if the main Ant install
+ is locked down.
+
+* The Entry nested element of PropertyFile will not any more have its value
+ attribute (actually increment) overwritten with the new value of the entry
+ after execution.
+
+* Output stored from a <java> or <exec> task is now exactly as generated. No
+ conversion to platform end-of-line characters is performed.
+
+* <translate> will now preserve line endings.
+
+* <ftp> followsymlinks="false" in nested fileset definitions is explicitly
+ required in order to exclude remote symbolic links (when doing a get, chmod,
+ delete, rmdir).
+
+* The values of the Copy#fileCopyMap variable has changed from String to
+ String[]. (In java 1.5 terms it was Hashtable<String, String> and
+ is now Hashtable<String, String[]>). This will affect third party code
+ that extend Copy and override Copy#doFileOperations.
+
+* <loadproperties> didn't expand properties while <property file="..."/>
+ does, so they were not equivalent. This has been fixed, which means
+ that propetries may get expanded twice if you use an
+ <expandproperties> filterreader. Bugzilla Report 17782.
+
+* User defined tasks and typedefs are now handled internally in the
+ same way as predefined tasks and typedefs. Also tasks and typedefs
+ are resolved at a later stage. This causes some
+ differences especially for user defined task containers.
+
+* <checksum> log message "Calculating checksum ..." has been degraded
+ from INFO to VERBOSE.
+
+Fixed bugs:
+-----------
+* Filter readers were not handling line endings properly. Bugzilla
+ Report 18476.
+
+* Filtersets were also not handling line endings properly.
+
+* Expand tasks did not behave as expected with PatternSets.
+
+* <property environment=... /> now works on OS/400.
+
+* <cab> could hang listcab on large <fileset>s.
+
+* The starteam stcheckout, stcheckin tasks now correctly compute
+ status of files against whatever local tree they are run against
+ and, optionally, will not process a file if it is current.
+ Previously you had to process everything unless you ran against the
+ default folder which wasn't the normal use-case for ant-starteam.
+ The stlist task now similarly displays that status correctly making
+ it a more generally useful tool.
+
+* entity includes would cause exceptions if path names included spaces.
+
+* addConfiguredXXX would not work for TaskAdapter wrapped tasks
+
+* Fix <ilasm> outputfile testing so that the output file does not need
+ to exist beforehand.
+
+* Ant will now exit with a return code of 1 if it encounters problems
+ with the command line arguments.
+
+* ClassLoader creation changes to use a factory method in Project. A new
+ class AntClassLoader2 implemented for 1.2+ specific features including
+ Package information and addition of classes specified in the Class-Path
+ element of a Jar's manifest.
+
+* It is now possible in <exec> to resolve the executable to a project
+ basedir or execution dir relative executable. The resolveExecutable
+ must be used to pick up such executables.
+
+* splash screen wouldn't disappear when build was finished.
+
+* <exec> output and error streams can now be redirected independently
+ to either a property or a file (or both)
+
+* TarEntry's File-arg constructor would fail with a
+ StringIndexOutOfBoundsException on all OSes where os.name is shorter
+ than seven characters. Bugzilla Report 18105.
+
+* <copy> and <move>'s failonerror didn't apply to filesets pointing to
+ non-existent directories. Bugzilla Report 18414.
+
+* The <stripjavacomments> filter sometimes removed parts of string
+ constants. Bugzilla Report 17441.
+
+* <antlr> will now recompile your grammar if the supergrammar has
+ changed. Bugzilla Report 12691.
+
+* <property env> will now work on Unices with /bin/env instead of
+ /usr/bin/env. Bugzilla Report 17642.
+
+* <jar index="on"> could include multiple index lists. Bugzilla 10262.
+
+* The index created by <jar> didn't conform to the spec as it didn't
+ include the top-level entries. Bugzilla Report 16972.
+
+* <tar> and <zip> didn't honor the defaultexcludes attribute for the
+ implicit fileset. Bugzilla Report 18637.
+
+* The <replacetokens> filter would throw an exception if the token's
+ value was an empty string. Bugzilla Report 18625.
+
+* Perforce tasks relying on output from the server such as <p4change>
+ and <p4label> were hanging. Bugzilla Reports 18129 and 18956.
+
+* Improve exception and logging behavior of Perforce tasks.
+ Bugzilla report 18154.
+
+* build.sh install had a problem on cygwin (with REALANTHOME).
+ Bugzilla Report 17257
+
+* <replaceregexp> didn't work for multi-byte encodings if byline was false.
+ Bugzilla Report 19187.
+
+* <replaceregexp> was altering unnecessarily the timestamp of the directories
+ containing the files to process
+ Bugzilla Report 22541.
+
+* file names that include spaces need to be quoted inside the @argfile
+ argument using forked <javac> and (all JDKS). Bugzilla Report 10499.
+ NB : a first correction was only introducing quotes for JDK 1.4
+ It has been changed to quote for all external compilers when paths
+ contain spaces.
+ Also the backslashes need to be converted to forward slashes
+ Bugzilla Report 17683.
+
+* Setting filesonly to true in <zip> and related tasks would cause the
+ archives to be always recreated. Bugzilla Report 19449.
+
+* file names that include spaces need to be quoted inside the @argfile
+ argument using <javadoc> and JDK 1.4. Bugzilla Report 16871.
+
+* <junit> didn't work with custom formatters that were only available
+ on the user specified classpath when a timeout occurred. Bugzilla
+ Report 19953.
+
+* <different> selector : make ignoreFileTimes effectively default to true
+ and fix a bug in the comparison of timestamps. Bugzilla Report 20205.
+
+* <different> selector can now be nested directly under a fileset
+ Bugzilla Report 20220.
+
+* <cvstagdiff> had a problem with "dd-MM-yy hh:mm:ss" formats
+ Bugzilla Report 15995.
+
+* <cvstagdiff> cvsroot and package attributes added to the root
+ element tagdiff of the xml output
+ Bugzilla Report 16081.
+
+* <cvstagdiff> had a problem with aliased modules and with requests for
+ multiple modules. Bugzilla Reports 21373 and 22877.
+
+* <cvstagdiff> could not parse properly the revision number of new files with
+ CVS 1.11.9 or higher. Bugzilla Report 24406.
+
+* <fixcrlf> make fixcrlf create its temporary files in the default directory
+ of FileUtils#createTempFile instead of the destination dir of fixcrlf.
+ Bugzilla Report 20870.
+
+* <ejbjar> implementation for Borland.
+ Prevent the task from being blocked by error messages coming from java2iiop.
+ Bugzilla Report 19385.
+
+* <unzip>'s and <untar>'s nested patternsets didn't work as documented
+ when the pattern ended in a slash or backslash. Bugzilla Report 20969.
+
+* <fixcrlf> will now create the parent directories for the destination
+ files if necessary. Bugzilla Report 20840.
+
+* <xmlproperty> now handles CDATA sections. BugZilla Report 17195
+
+* <translate> now translate tokens that are placed close together.
+ Bugzilla Report 17297
+
+* Nested websphere element for ejbjar does not support spaces in file name.
+ Bugzilla Report 21298
+
+* Don't multiply Class-Path attributes when updating jars. Bugzilla
+ Report 21170.
+
+* Do not overwrite the value (increment) attribute of PropertyFile nested
+ Entry element. Bugzilla Report 21505.
+
+* Prevent sysproperties with no key or no value from being added in <junit>.
+ Bugzilla Report 21684.
+
+* Allow references to be properly inherited via antcall
+ Bugzilla Report 21724.
+
+* ftp chmod failed when the remote system was UNIX and local system Windows
+ Bugzilla Report 21865.
+
+* ftp put with chmod failed when the remote system was UNIX and local system
+ Windows. Bugzilla Report 23143.
+
+* ftp did not set the ascii mode explicitly, causing problems with ftp servers
+ having binary as default
+
+* ftp was not able to download files when they were pointed to by symbolic
+ links. Bugzilla Report 14063.
+
+* ftp is able to download also directories pointed to by symbolic links.
+
+* replace would change \r\n into \r\r\n under Windows.
+
+* junitreport with frames did not display a link for classes without a package
+ or in the top package.
+ Bugzilla Report 21915.
+
+* Project.toBoolean(String) now handles null as argument and does not throw a
+ NullPointerException any more.
+
+* The socket condition will now close the socket created to test.
+ Bugzilla Report 23040.
+
+* <junit includeantruntime="true" fork="true"> replaced the CLASSPATH instead
+ of adding to it. Bugzilla Report 14971.
+
+* <splash> could fail on JVMs that use null to indicate the system classloader.
+ Bugzilla Report 23320.
+
+* <xmlcatalog>s only worked when defined inside of tasks. Bugzilla
+ Report 20965.
+
+* <csc> and siblings (<vbc> <jsharpc>) handle large filesets by
+automatic use of response files. Bugzilla report #19630
+
+Other changes:
+--------------
+
+* Shipped XML parser is now Xerces 2.6.0
+
+* All tasks can be used outside of <target>s. Note that some tasks
+ will not work at all outside of targets as they would cause infinite
+ loops (<antcall> as well as <ant> and <subant> if they invoke the
+ current build file).
+
+* Six new Clearcase tasks added.
+
+* A new filter reader namely tokenfilter has been added. Bugzilla
+ Report 18312.
+
+* A new attribute named skip is added to the TailFilter and
+ HeadFilter filter readers.
+
+* The filesetmanifest attribute of <jar> has been reenabled.
+
+* The start and end tokens for <translate> may now be longer than a
+ single character.
+
+* <setproxy> lets you set the username and password for proxies that
+ want authentication
+
+* <loadproperties> has a new encoding attribute.
+
+* <echoproperties> can now create XML output.
+
+* <echoproperties> has a new srcfile attribute that can make it read
+ properties files and output them instead of Ant's properties.
+
+* <filterset> will now resolve filters recursively.
+
+* <input> has a new attribute that allows you to specify a default value.
+
+* Added <image> task (requires JAI).
+
+* <image> task has now proportions attribute in the <scale/> nested element
+ instead of keepproportions (bringing in more functionality)
+
+* New condition <isreference>
+
+* <ftp> now has a preservelastmodified attribute to preserve the
+ timestamp of a downloaded file.
+
+* new rmdir action for <ftp> that removes directories from a fileset.
+
+* <ftp> has attributes timediffauto and timediffmillis to use together
+ with the newer attribute to tell ant to take into account a time difference
+ between client and remote side.
+ Bugzilla Report 19358.
+
+* <ftp> has been optimized to go directly to the include patterns.
+ This reduces scanning time under UNIX when followsymlinks="true"
+ and casesensitive="true" (the default)
+ Bugzilla Report 20103.
+
+* The SOS and VSS tasks will no longer unconditionally prepend a $ to
+ vsspath or projectpath.
+
+* OS/400 now gets detected by the os condition.
+
+* <arg> has a new attribute pathref that can be used to reference
+ previously defined paths.
+
+* <xmlproperty> has been improved, you can now expand ${properties},
+ define ids or paths and use Ant's location magic for filename resolutions
+ in the XML file.
+
+* <xmlcatalog> will now support external catalogs according to the
+ OASIS "Open Catalog" standard - if resolver.jar (newer than version
+ 1.0) from Apache's xml-commons is in your CLASSPATH.
+
+* Starteam tasks now have support for revision labels and build labels.
+ Checkouts now have the option of using repository timestamps, instead
+ of current.
+
+* new task <symlink> that creates and maintains symbolic links.
+
+* new tasks <chown> and <chgrp> which are wrappers of the Unix commands.
+
+* new task <attrib> to change file attributes on Windows systems.
+
+* <style> has a new attribute reloadstylesheet to work around a
+ bug in widespread Xalan versions.
+
+* <tarfileset> has a new dirmode attribute to specify the permissions
+ for directories.
+
+* <fixcrlf>'s eol attribute now also understands "mac", "unix" and "dos".
+
+* <classfileset> now picks up dependencies of the form MyClass.class. This
+ works for the code generated by the Sun java compiler. It may not work for
+ all compilers.
+
+* a new attribute "globalopts" can be added to all Perforce tasks.
+ You can put in it all the strings described by p4 help usage. Refer to
+ the docs for more information.
+
+* new Perforce tasks <p4integrate> , <p4resolve>, and <p4labelsync>
+
+* <p4submit> will change the property p4.change if the Perforce server
+ renumbers the change list.
+ It will set the property p4.needsresolve if the submit fails,
+ and the message says that file(s) need to be resolved.
+
+* <replaceregexp> now has an optional encoding attribute to support
+ replacing in files that are in a different encoding than the
+ platform's default.
+
+* The <exec> task may now have its input redirected from either a file
+ or a string from the build file. The error output can be separated
+ to a different file when outut is redirected. standard error may be
+ logged to the Ant log when redirecting output to a file
+
+* The <java> task also supports the input redirection and separate
+ error streams introduced to the <exec> task. In addition, it is now
+ possible to save the output into a property for use within the build
+ file as was possible with <exec> in Ant 1.5
+
+* The <javadoc> task <tag> subelement has been enhanced to allow files
+ with tag mappings to be used.
+
+* New tasks: <scp> supports file transfers, <sshexec> executes a
+ command over SSH. They require jsch, a BSD licensed SSH library that
+ can be found at http://www.jcraft.com/jsch/index.html
+
+* New filterreader <escapeunicode/>.
+
+* Support for HP's NonStop Kernel (Tandem) OS has been added.
+
+* <cab>'s basedir attribute is now optional if you specify nested
+ filesets. Bugzilla Report 18046.
+
+* New task <sync> that synchronizes two directory trees.
+
+* <apply> has new forwardslash attribute that can force filenames to
+ use forward slashes (/) as file separators even on platforms with a
+ different separator. This is useful if you want to run certain
+ ported Unix tools.
+
+* Copy has a new outputencoding attribute that can be used to change
+ the encoding while copying files. Bugzilla Report 18217.
+
+* The xml formatter for JUnit will now honor test case names set with
+ setName. Bugzilla Report 17040.
+
+* JUnit now has an attribute reloading, which, when set to false,
+ makes the task reuse the same class loader for a series of tests.
+
+* <concat> now supports filtering and can check timestamps before
+ overriding a file. Bugzilla Report 18166.
+
+* <junit> has a new attribute tempdir that controls the placement of
+ temporary files. Bugzilla Report 15454.
+
+* <jdepend> now supports a new nested element <classespath> which is
+ the same as <sourcespath> but point to compiled classes (the
+ preferred mode of operation for JDepend > 2.5). Additionally, nested
+ <exclude> elements can be used to exclude certain packages from
+ being parsed. Bugzilla Report 17134.
+
+* The JProbe tasks now also work with JProbe 4.x. Bugzilla Report 14849.
+
+* <javacc> and <jjtree> will now autodetect JavaCC 3.x and can use it.
+
+* <sql> has a new attribute to control escape processing.
+
+* <sql> is able to display properly several resultsets if you are
+ running a compound sql statement. Bugzilla Report 21594.
+
+* A new <containsregexp> selector has been added, that selects files
+ if their content matches a certain regular expression.
+
+* <antlr>'s debug attribute has been enabled. Bugzilla Report 19051.
+
+* <mail> has a new attribute charset. Bugzilla Report 15434.
+
+* <mail> has new attributes user and password for SMTP auth.
+ maillogger can also use this.
+ The implementation only works with JavaMail (encoding="MIME").
+ Implementation with plain mail remains to do.
+ Bugzilla Report 5969.
+
+* <mail> and mailloger support SMTP over TLS/SSL
+ Bugzilla Report 19180.
+
+* <mail> the attributes from, replyto ,tolist, cclist, bcclist
+ can now contain email addresses of the form name <address@xyz.com>
+ or (name) address@xyz.com
+ Bugzilla Report 22474.
+
+* <mail> (version PlainMail)
+ prevent blank headers from being sent,
+ make the order of the headers of plain mail messages predictable
+ Bugzilla Report 22088.
+
+* <zipfileset> can now be defined in the main body of a project
+ and referred to with refid="xyz". Bugzilla Report 17007.
+
+* A wrapper script for OS/2 has been added.
+
+* <unzip> will now detect and successfully extract self-extracting
+ archives. Bugzilla Report 16213.
+
+* <stcheckout> has a new attribute "converteol" that can be used to
+ control the automatic line-end conversion performed on ASCII files.
+ Bugzilla Report 18884.
+
+* Users can now modify the list of default excludes using the new
+ defaultexcludes task. Bugzilla Report 12700.
+
+* There is a new data type <propertyset> that can be used to collect
+ properties. It is supported by <ant>, <antcall>, <subant>, <java>,
+ <echoproperties> and <junit>.
+
+* <concat> can now control the encoding of the output as well and optionally
+ add new-line characters at the end of files that get concatenated but
+ don't end in newlines. Bugzilla Report 12511.
+
+* <rpm> will detect the rpmbuild executable of RedHat 8.0 and newer
+ and use that if it is on your PATH. Bugzilla Report 14650.
+
+* A new task <rexec> has been added that requires commons-net to work.
+ Bugzilla Report 19541.
+
+* <javadoc> now supports a nested <arg> element in addition to the
+ additionalparams attribute.
+
+* You can now determine the order of standard tags in <javadoc> via
+ <tag> elements - you must not use the description attribute for them.
+ Bugzilla Report 18912.
+
+* <javadoc> now supports the -noqualifier switch. Bugzilla Report 19288.
+
+* <javac>'s executable attribute can now also be used to specify the
+ executable for jikes, jvc, sj or gcj. Bugzilla Report 13814.
+
+* <javac> has a new attribute tempdir that can control the placement
+ of temporary files. Bugzilla Report 19765.
+
+* A new magic property build.compiler.jvc.extensions has been added
+ that can be used to turn of Microsoft extensions while using the jvc
+ compiler. Bugzilla Report 19826.
+
+* You can now limit the parallelism of <apply> and <chmod> by using the new
+ maxparallel attribute.
+
+* With the new addsourcefile attribute, you can make <apply> ommit the
+ source file names from the command line. Bugzilla Report 13654.
+
+* <apply> and <chmod> now support nested <filelist>s as well as <dirset>s.
+ Bugzilla Reports 15929 and 20687.
+
+* <apply> and <chmod> will display a summary if you set the new
+ verbose attribute to true. Bugzilla Report 19883.
+
+* <copy>/<move>'s failonerror attribute can now also be used to
+ continue the build if an I/O error caused a problem. Bugzilla
+ Report 12999.
+
+* new selector <type/> allowing to select only files or only directories.
+ Bugzilla Report 20222.
+
+* <java> and <junit> now support a nested <bootclasspath> element that
+ will be ignored if not forking a new VM.
+
+* <junit>'s nested <formatter> elements now support if/unless clauses.
+
+* <ejbjar>
+ cmpversion attribute added
+ jboss element will look for jbosscmp-jdbc.xml descriptor
+ if ejbjar has cmpversion="2.0" set
+ Bugzilla Reports 14707 and 14709.
+
+* <pvcs> config attribute added to set the location of a specific PVCS
+ .cfg file
+ Bugzilla Report 9752
+
+* <mapper> has an "unpackage" mapper
+ Bugzilla Report 18908
+
+* Added <scriptdef> task allowing tasks to be defined using any BSF-supported
+ scripting language.
+
+* <touch>'s datetime attribute can now accept time with a granularity
+ of seconds as well. Bugzilla Report 21014.
+
+* <checksum> has two new properties: totalproperty and todir.
+
+* FileUtils#createTempFile will now create temporary files in the
+ directory pointed to by the property java.io.tmpdir
+
+* <unzip> and friends now supports an optional encoding attribute to
+ enable it to expand archives created with filenames using an encoding
+ other than UTF8. Bugzilla Report 10504.
+
+* <patch> has a new attribute destfile that can be used to create a new
+ file instead of patching files in place.
+
+* OpenVMS is detected as a valid OS family.
+
+* DirectoryScanner has been optimized for cases where include patterns do not
+ start with wildcards. Bugzilla Report 20103.
+
+* DirectoryScanner begins to be optimized not to scan excluded directories.
+ Bugzilla Report 21941.
+
+* Added keep-going feature. Bugzilla Report 21144
+
+* The archives generated by <zip> and friends will now contain CRC and
+ size information in the "local file header", thereby providing this
+ information to applications that read the archives using
+ java.util.ZipInputStream. Bugzilla Report 19195.
+
+* <copy> and <move> can now handle mappers that return multiple
+ mappings per source path. This behaviour is enabled by using
+ an enablemultiplemapping attribute. Bugzilla Report 21320.
+
+* <exec> will now work on OpenVMS (please read the notes in
+ <exec>'s manual page). Bugzilla Report 21877.
+
+* <exec> will now have a new attribute spawn (default false).
+ If set to true, the process will be spawned. Bugzilla Report 5907.
+
+* <java> will now have a new attribute spawn (default false).
+ If set to true, the process will be spawned. Bugzilla Report 5907.
+
+* <parallel> now supports a timeout which can be used to recover
+ from deadlocks, etc in the parallel threads. <parallel> also
+ now supports a <daemons> nested element. This can be used to
+ run tasks in daemon threads which the parallel task will not
+ wait for before completing. A new attribute failonany will cause
+ <parallel> to throw an exception if any thread fails without
+ waiting for all other threads to complete.
+
+* <zip> and friends will consume far less memory than they used to
+ when run with compress="false". Bugzilla Report 21899.
+
+* <if/> and <unless/> attributes added to <param/> element of <style>
+ Bugzilla Report 22044
+
+* <zip> and friends have a new attribute "keepcompression" that can be
+ used to incrementally build an archive mixing compressed and uncompressed
+ entries.
+
+* <junit>'s XML formatter adds a new classname attribute to the <testcase>
+ elements.
+
+* new <permissions> type add permission handling to the code
+ this type can be nested in the <java> and <junit> tasks.
+ Bugzilla Report 22533.
+
+* additional shortcuts for ant options (-d --> -debug, -e --> -emacs,
+ -h --> -help, -p --> -projecthelp, -s --> -find).
+
+* new selector <modified>. "cache" was renamed to "modified".
+ Bugzilla Report 20474.
+
+* <stcheckout> and <stlist> have a new asofdate attribute that can be
+ used to checkout/list files based on a date instead of a label.
+ Bugzilla Report 20578.
+
+* New filter <concatfilter>. Adds the content of file at the beginning
+ or end of a file. Discussion started at
+ http://marc.theaimsgroup.com/?l=ant-user&m=106366791228585&w=2
+
+* New task <import>
+
+* New task <macrodef>
+
+* New task <presetdef>
+
+* Ant libraries that can make use of namespaces to avoid name
+ clashes of custom tasks
+
+* <java> and <junit> now support <assertions>, which let you enable
+ and disable Java1.4 assertions on a package or class basis. These
+ only work when fork=true, currently.
+
+* .NET tasks expanded with VB support <vbc> and J#, via <jsharp>,
+ <importtypelib> and <ilasm>. <csc> supports nested <src> types,
+ <defines> for (potentially conditional) definitions, <reference>
+ filesets for references. The executable attribute lets you switch to
+ mono or other implementations -<csc> has been tested with Mono on
+ Linux and OSX.
+
+
+Changes from Ant 1.5.3 to Ant 1.5.4
+===================================
+
+Changes that could break older environments:
+--------------------------------------------
+
+* If the Visual Age tasks used to work for you, they may stop doing so
+ now - and we'd like to know about it. The current set of tasks is
+ supposed to work with any version of VAJ starting with 3.0.
+
+Fixed bugs:
+-----------
+
+* The Visual Age for Java tasks didn't work (at least for versions 3.0
+ and higher). Bugzilla Report 10016.
+
+* URL-encoding in <vaj*port> didn't work properly.
+
+* VAJRemoteUtil called getAbsolutePath instead of getPath
+ causing problems when using a Windows VAJ server from a UNIX server.
+ Bugzilla Report 20457.
+
+* VAJImport task failed with NullPointerException when using DirectoryScanner.
+ Bugzilla Report 22080.
+
+Other changes:
+--------------
+
+* Shipped XML parser is now Xerces 2.5.0
+
+* <javah> will invoke oldjavah on JDK 1.4.2. Bugzilla Report 18667.
+
+* The VAJ tasks now support a haltonfailure attribute to conditionally
+ keep building even if they fail.
+
+* It is now possible to use the latest (versioned or unversioned) edition
+ in <vajload> by using special wildcard characters. Also fixes
+ Bugzilla Report 2236.
+
+Changes from Ant 1.5.2 to Ant 1.5.3
+===================================
+
+Changes that could break older environments:
+--------------------------------------------
+
+* The <zip> task and friends have again changed a method signature
+ (sorry, was necessary to fix bug 17780). The return type of
+ getResourcesToAdd has changed.
+
+Fixed bugs:
+-----------
+
+* <zipfileset>'s filemode would get ignored and the dirmode was used
+ for the included files as well. As a side effect, WinZIP was unable
+ to extract or display the files, so they seemed to be missing from
+ the archive. Bugzilla Report 17648.
+
+* <ftp> could use the wrong path separator when trying to change the
+ remote working directory. Bugzilla Report 17735.
+
+* <jar update="true"> would loose all original files if you didn't
+ specify any nested <(zip)fileset>s and the manifest had changed.
+ Bugzilla Report 17780.
+
+* If you used a value starting with \ on Windows for the appxml
+ attribute of <ear> or the webxml attribute of <war>, it would be
+ ignored. Bugzilla Report 17871.
+
+* Ant will no longer implicitly add Sun's rt.jar in <javac> when you
+ use jvc and don't specify a bootclasspath. Bugzilla Report 18055.
+
+* The prefix attribute of <zipfileset> would not generate directory
+ entries for the prefix itself. Bugzilla Report 18403.
+
+* starteam checkout can now handle deleted labels. Bugzilla Report 17646.
+
+* The Unix wrapper script failed if you invoked it as a relative
+ symlink and ANT_HOME has not been set. Bugzilla Report 17721.
+
+Other Changes:
+--------------
+* Added ability to specify manifest encoding for the <jar> and
+ <manifest> tasks
+
+Changes from Ant 1.5.1 to Ant 1.5.2
+=============================================
+
+Changes that could break older environments:
+--------------------------------------------
+* ANT_OPTS environment variable is now applied at the start of the
+ Java command line, allowing position specific parameters of some
+ JVMs, such as -classic to be specified.
+
+* ZipScanner#getIncludedFiles will now return the names of the ZipEntries
+ that have been matched instead of the name of the archive.
+
+* The <zip> task and friends have been heavily modified, almost every
+ method signature of the Zip class has changed. If you have subclassed
+ Zip (or one of its subclasses), your class will most likely not
+ compile against the current code base. If it still compiles, it will
+ probably not work as in Ant 1.5.1.
+
+Fixed bugs:
+-----------
+* <translate> was not ignoring comment lines.
+
+* <manifest> wouldn't update an existing manifest if only an attribute
+ of an existing section changed.
+
+* ant.bat now supports the ANT_ARGS and JAVACMD environment variables
+ again (like Ant 1.5 did).
+
+* The "plain" <junit> <formatter> could throw a NullPointerException
+ if an error occurred in setUp.
+
+* <junit> will now produce output when a test times out as well.
+
+* <replace> would count some internal character replacements when
+ reporting the number of replaced tokens.
+
+* <concat> would cause an exception if a <filelist> pointed to files
+ that do not exist.
+
+* <javadoc> will now pass -source to custom doclets as well.
+
+* <cvstagdiff> would throw a NullPointException if there had been no
+ differences.
+
+* <cvschangelog> could miss today's changes.
+
+* <concat> could append newline characters between concatenated files.
+
+* <xmlvalidate> ignored the specified encoding of the files to
+ validate.
+
+* the errorsbeginat attribute of the <http> condition didn't work.
+
+* Ant will try to force loading of certain packages like com.sun.*
+ from the system classloader. The packages are determined by the
+ version of the JVM running Ant.
+
+* Ant didn't find the runtime libraries on IBM's JDK 1.4 for Linux.
+
+* random component of temporary files is now always a positive integer.
+
+* Ant could incorrectly try to use the 1.4 regexp implementation even
+ if it isn't available if you run the JVM with -Xverify:none.
+
+* Ant would die with an exception if you used nested <reference>
+ elements in Ant and the refid attribute didn't point to an existing
+ project reference.
+
+* The <get> task can now be compiled (and Ant thus bootstrapped) using
+ Kaffee.
+
+* build.sysclasspath will now be honored by more tasks.
+
+* The signjar keystore attribute has been reverted to a String allowing
+ it to once again accept URLs. This should not affect current File based usage
+ unless you are extending the Signjar task.
+
+* <jar update="true"> would remove the original manifest.
+
+* fix up folder creation in PVCS task
+
+* <tar>'s up-to-date check didn't work for nested <(tar)fileset>s.
+
+* Corrected a problem in XMLLogger where it would not associated
+ messages with a taskdef'd task
+
+* <uptodate> now works when using attributes (i.e. not filesets) and pointing
+ to the same file
+
+* Java task (and output system) now stores output which doos not end
+ with a line feed.
+
+* splash screen wouldn't disappear when build was finished.
+
+* <exec> now supports OS/2.
+
+* <zip> and friends would only update/recreate existing archives if
+ the files to add/update have been newer than the archive.
+
+* <javadoc>'s <link> element could fail for offline="true" on some JDKs.
+
+Other changes:
+--------------
+
+* MailLogger now sets the Date header correctly.
+
+* Shipped XML parser is now Xerces 2.3.0
+
+* signjar now accepts a maxmemory attribute to allow the memory allocated to the
+ jarsigner tool to be specified. The jarsigner from the JDK's JAVA_HOME bin
+ dir is now used rather than the first jarsigner on the path.
+
+* **/.DS_Store has been added to the list of default pattern excludes.
+
+* The Created-By header in the default manifest now contains the JVM
+ vendor and version according to the jar specification. A new header,
+ Ant-Version provides the Ant version used to create the jar.
+
+* <zip> can now store Unix permissions in a way that can be
+ reconstructed by Info-Zip's unzip command.
+
+Changes from Ant 1.5.1Beta1 to 1.5.1
+====================================
+
+Fixed bugs:
+-----------
+
+* <tstamp>'s prefix attribute failed to apply to nested <format> elements.
+
+* <junitreport> created an empty junit-noframes.html if no format had
+ been specified.
+
+* <basename> would remove more than it should if the file name
+ contained more than one dot.
+
+* <filterset>s nested into <filterset>s didn't work.
+
+Other changes:
+--------------
+
+* Shipped XML parser is now Xerces 2.2.0
+
+* Filesets now support a 'file' attribute, allowing a single-file
+ fileset to be constructed without having to specify its parent
+ directory separately.
+
+* <junit> will now return the result of a call to getName instead of
+ "unknown" for Test implementations that don't extend TestCase but have
+ a public String getName() method.
+
+Changes from Ant 1.5 to 1.5.1Beta1
+==================================
+
+Fixed bugs:
+-----------
+* Date/time in CvsChangeLog was in local timezone and 12 hour format leading
+ to a problem when sorting by time. It is now UTC (GMT) and in 24-hour
+ format as per cvs 'specifications'.
+
+* CvsTagDiff now supports ampersand modules or modules that have a different
+ root directory than their name.
+
+* EjbJar threw NPEs for the Websphere element. The property 'websphere.home'
+ was not documented.
+
+* Mail example in the documentation was not correct.
+
+* Checksum was broken in the following scenario:
+ (using verifyproperty OR in a condition) AND using filesets
+ with multiple files.
+
+* The ExpandProperties filter threw NPEs when defined using
+ the <filterreader> format.
+
+* The sh wrapper script didn't work under Cygwin if ANT_HOME wasn't
+ set with a Unix style filename.
+
+* The sh wrapper script could fail if you started Ant from a directory
+ with whitespace in its name.
+
+* ant -diagnostics was not working properly when the task dependency
+ was missing and was just printing the missing dependency.
+
+* If a task got redefined via <taskdef>, it lost its child elements.
+
+* <property>'s classpathref attribute was broken.
+
+* <arg line="''" /> would result in no command line argument, will now
+ be a single empty argument. Use <arg value="''"/> if you need the
+ quotes literally.
+
+* <replaceregexp> could append a newline character at the end of the
+ file.
+
+Other changes:
+--------------
+
+* Appendix E of Java Development with Ant (Loughran/Hatcher) was
+ contributed to the docs.
+
+* <available> will only print deprecration warnings if it is actually
+ used to change the value of a property.
+
+Changes from Ant 1.5beta3 to Ant 1.5
+====================================
+
+Changes that could break older environments:
+--------------------------------------------
+
+* The filesetmanifest attribute added to <jar> after the 1.4.1
+ release has been removed for now. This change may affect only
+ the 1.5Beta/1.6Alpha users. An attempt will be made to add this
+ feature back into Ant 1.6.
+
+Fixed bugs:
+-----------
+
+* <zip> and friends would always update existing archive if you set
+ the update attribute to true.
+
+* To support backward compatibility with older versions, <pathconvert>
+ will once again set the property, even if the result is the empty
+ string, unless the new 'setonempty' attribute is set to false|no|off
+ (default is "true").
+
+* The manifest task would crash XmlLogger
+
+Other changes:
+--------------
+
+* added **/.svn and **/.svn/** to the default excludes
+
+Changes from Ant 1.5beta2 to Ant 1.5beta3
+=========================================
+
+Changes that could break older environments:
+--------------------------------------------
+
+* <pvcs> default filenameformat has been different from Ant 1.4.1.
+ Now it is different from 1.5beta1 and 1.5beta2.
+
+* <pathconvert> won't set the property if the result is the empty string.
+
+Fixed bugs:
+-----------
+
+* <available> could fail to find files or directories that happen to
+ start with the name of the project's basedir but are not children of
+ the basedir.
+
+* Nested <property>'s inside <ant> can now be overriden by subsequent
+ <ant> and <antcall> tasks.
+
+* <xslt>'s outputtype attribute wouldn't do anything.
+
+* <linecontains> filterreader could swallow lines.
+
+* <sequential> used to configure the tasks (set their attributes)
+ before the first task has been executed. This means that properties
+ that have been set by nested task seemed to be unset for the other
+ tasks in the same <sequential> element.
+
+* <javac>'s sourcepath setting has been ignored by some compiler
+ implementations.
+
+* <javadoc>'s packagelist attribute didn't work.
+
+* the plain mailer would always use port 25 in <mail>.
+
+* Ant's default logger could swallow empty lines.
+
+* ejbjar's iPlanet nested element now can process multiple descriptors.
+
+* IPlanetEjbc was looking in the wrong place for four iiop files.
+
+* <javac> would pass the -source switch to JDK 1.3's javac, even
+ though it doesn't support it.
+
+Other changes:
+--------------
+
+* <checksum> now uses a buffer (of configurable size).
+
+* The "Trying to override task definition" warning has been degraded
+ to verbose level if the two task definitions only differ in the class
+ loader instance that has loaded the definition.
+
+* Add a jvmargs to the ejbjar's weblogic element to allow additional
+ arguments to be provided to the VM runnign ejbc. Document the
+ jvmdebuglevel attribute which can be used to avoid warnings about
+ interface classess being found on the classpath. Document the new
+ <sysproperty> element which allows JVM properties to be defined.
+ Added an outputdir attribute to allow the destination to be a
+ directory into which the exploded jar is written.
+
+* ejbjar now supports Borland Enterprise Server 5 and Jonas 2.5
+
+Changes from Ant 1.5beta1 to Ant 1.5beta2
+=========================================
+
+Changes that could break older environments:
+--------------------------------------------
+
+* Properties will now be expanded in mail message bodies. This means
+ that one $ sign will be stripped if your mail message contains the text $$.
+
+* org.apache.tools.ant.taskdefs.Expand no longer extends MatchingTask.
+
+* Available#setFile now again uses a File argument as it did in 1.4,
+ this may break environments that have been adapted to the String
+ argument version present in 1.5beta1.
+
+Fixed bugs:
+-----------
+* When <move> attempts a rename, it deletes the destination file, if it
+ exists, before renaming the source file. However, <move> was not
+ checking if the destination file was actually a directory before
+ trying to delete it.
+
+* Make CVS Tasks to work under Cygwin.
+
+* Fix LineContains to handle huge files elegantly without causing
+ Stack Overflows.
+
+* if you ask for the "classic" compiler on Java1.4, you get upgraded to
+ "modern" because there is no classic compiler any more.
+
+* the <http> condition was viewing 404 'not found' exceptions as success. Now
+ it defaults to viewing any response >=400 as an error, and has an
+ errorsBeginAt attribute you can use if you want a higher or lower value.
+
+* <get> throws a build exception on an http authorization error, unless you
+ have set ignoreerrors to true.
+
+* <wsdltodotnet> was spelt in Wintel case: <WsdlToDotnet>. It is now lower
+ case, though the old spelling is retained for anyone who used it.
+
+* Merging of Manifests in jar now works as documented.
+
+* paths that have been separated by colons would be incorrectly parsed
+ on NetWare.
+
+* runant.pl now supports NetWare.
+
+* <tempfile> and <setproxy> tasks were in beta1, but not defined by
+ default; They now are. <tempfile> fills a property with the name of a
+ temporary file; <setproxy> lets you set the JVM's http, ftp and socks proxy
+ settings.
+
+* <available classname="foo" ignoresystemclasses="true"> failed for
+ JDK 1.1 and 1.2, even if the class could be found on the
+ user-specified classpath.
+
+* <property environment=... /> now works on z/OS.
+
+* forked <javac> failed for the wrong reason on JDK 1.1 - Ant would
+ use a temporary file to hold the names of the files to compile under
+ some conditons, but 1.1 doesn't support this feature. Ant will no
+ longer try this, but you may run into problems with the length of the
+ command line now.
+
+* the refid attribute for <property>s nested into <ant> or <param>s
+ nested into <antcall> didn't work.
+
+* <replaceregexp> didn't work for nested <fileset>s.
+
+* <javadoc> dropped sourcepath entries if no "interesting" .java
+ source files could be found below them. This has been backwards
+ incompatible and caused problems with custom doclets like xdoclet.
+
+* Using the doclet, docletpath or docletpathref attributes of
+ <javadoc> may have caused NullPointerExceptions.
+
+* nested <filesets> of <javadoc> would include too much.
+
+* <dependset> will no longer choke on <targetfileset>s that point to
+ non-existing directories.
+
+* <patch> didn't work at all.
+
+* <replace> and <replaceregexp> now fail if the file they are working
+ on is locked.
+
+* <javadoc> would pick up the wrong executable in the combination JDK
+ 1.2 and AIX.
+
+Other changes:
+--------------
+
+* z/OS now gets detected by the os condition.
+
+* <fileset> and <dirset> now have an optional followsymlink attribute
+ that can prevent Ant from following symbolic links on some platforms.
+
+* BeanShell is now supported in the <script> task.
+
+* <ejbjar> under Weblogic attempts to use the ejbc20 compiler for 2.0 beans
+ based on the deployment descriptor's DTD reference. Under weblogic 7.00 Beta
+ this ejbc class has been deprecated. To avoid the deprecation warning use
+ ejbcclass="weblogic.ejbc".
+
+* <ejbjar> will add a manifest to the generated jar based on the naming
+ convention in use. This overrides the manifest specified in the
+ <ejbjar> attribute
+
+
+Changes from Ant 1.4.1 to 1.5beta1
+==================================
+
+Changes that could break older environments:
+--------------------------------------------
+
+* Important: Single $ signs are no longer silently stripped!
+ Before you panic that we have broken all your build files, we have kept
+ the old "$$" -> "$" behaviour. So only build files which accidentally had
+ a $ sign in a string that was being silently stripped may break.
+ We added this fix to stop newbie confusion; if you want to write a
+ build file which works on ant versions 1.4.1 or earlier, stay with
+ the double $$ sign rule.
+
+* Project.getBuildListeners now returns a clone of the listener
+ list. Changes to the returned list will not affect the listeners
+ currently attached to the Project. It also means that it is safe to
+ iterate over the returned list if listeners are added or removed
+ during the traversal.
+
+* <pvcs> default filenameformat has been different from Ant 1.4.1.
+
+* Some messages that are printed during startup will not be
+ written to the logfile specified via -logfile as they might destroy
+ the format of the file for special BuildLoggers (like XmlLogger).
+
+* The filesetmanifest attribute added to <jar> after the 1.4.1
+ release has been removed for now. This change may affect only
+ the 1.5Beta/1.6Alpha users. An attempt will be made to add this
+ feature back into Ant 1.6.
+* Shipped XML parser is now Xerces 2.0.1 along with the XML Parser APIs.
+ XML Parser APIs is a separate jar that contains the necessary
+ JAXP/DOM/SAX classes.
+
+* <telnet> was fixed to expand properties inside nested <read> and
+ <write> elements; before this only happened when you assigned the text
+ to the string attribute. If you had $ signs in the string, they may
+ need escaping.
+
+* the RegexpMatcher interface has been extended to support case
+ insensitive matches and other options - custom implementations of
+ this interface won't work any longer. We recommend to use the new
+ Regexp interface that also supports substitution instead of the
+ RegexpMatcher interface in the future.
+
+* <gzip> will throw an exception if your src attribute points to a directory.
+
+* Unjar, Unzip and Unwar will throw an exception if the Src attribute
+ represents a directory. Support for nested filesets is provided
+ instead.
+
+* It is no longer possible to overwrite a property using tasks like
+ <condition>, <exec>, <pathconvert>, or <tstamp>. In some exceptional
+ cases it will generate a warning if you attempt to overwrite an
+ existing property.
+
+* Taskwriters please note: Whenever tasks had any overloaded set* methods,
+ Ant's introspection mechanism would select the last overloaded method
+ provided to it by the Java Runtime. A modification has now been made such
+ that when the Java Runtime provides a method with a String as its argument,
+ a check is made to see if there is another overloaded method that takes in
+ some other type of argument. If there is one such method, then the method
+ that takes in String as an argument is not selected by the Introspector.
+
+* The pattern definition **/._* has been included into the Default
+ Excludes list.
+
+* <propertyfile>'s <entry> element was modified to remove "never" as a value
+ as its behavior was undocumented and flakey.
+
+* The -projecthelp flag now only prints out targets that include the
+ 'description' attribute, unless the -verbose or -debug flag is included
+ on the Ant command line.
+
+* Ant's testcases now require JUnit 3.7 or above, as they now use the new
+ assertTrue method instead of assert.
+
+* If the 'output' attribute of <ant> is set to a simple filename or a
+ relative path, the file is created relative to ${basedir}, not ${user.dir}.
+
+* The default value for build.compiler is now javac1.x with x
+ depending on the JDK that is running Ant instead of classic/modern.
+
+Fixed bugs:
+-----------
+
+* <available> could fail to find files or directories that happen to
+ start with the name of the project's basedir but are not children of
+ the basedir.
+
+* Nested <property>'s inside <ant> can now be overriden by subsequent
+ <ant> and <antcall> tasks.
+
+* <xslt>'s outputtype attribute wouldn't do anything.
+
+* <linecontains> filterreader could swallow lines.
+
+* <sequential> used to configure the tasks (set their attributes)
+ before the first task has been executed. This means that properties
+ that have been set by nested task seemed to be unset for the other
+ tasks in the same <sequential> element.
+
+* <javac>'s sourcepath setting has been ignored by some compiler
+ implementations.
+
+* <javadoc>'s packagelist attribute didn't work.
+
+* the plain mailer would always use port 25 in <mail>.
+
+* Ant's default logger could swallow empty lines.
+
+* ejbjar's iPlanet nested element now can process multiple descriptors.
+
+* IPlanetEjbc was looking in the wrong place for four iiop files.
+
+* <javac> would pass the -source switch to JDK 1.3's javac, even
+ though it doesn't support it.
+
+* <zip> and friends would always update existing archive if you set
+ the update attribute to true.
+
+* To support backward compatibility with older versions, <pathconvert>
+ will once again set the property, even if the result is the empty
+ string, unless the new 'setonempty' attribute is set to false|no|off
+ (default is "true").
+
+* The manifest task would crash XmlLogger
+
+* A bug existed that prevented generated log files from being deleted as
+ part of the build process itself. This has now been fixed.
+
+* Fixed bug where <move> ignored <filterset>s.
+
+* Ant works properly with the combination of Java1.4/WindowsXP.
+
+* Fixed bug where <java> used to sometimes invoke class constructors twice.
+
+* Fixed bug with 4NT shell support.
+
+* Fixed bug where ant would not perform ftp without remotedir being
+ specified even though this was not mandatory.
+
+* Fixed bug where ant would not copy system properties into new Project
+ in ant/antcall tasks when inheritall="false" is set.
+
+* <propertyfile> would not close the original property file.
+
+* <ant> will no longer override a subbuild's basedir with inheritall="true".
+
+* Fixed problem with the built-in <junit> formatters which assumed
+ that only one test could be running at the same time - this is not
+ necessarily true, see junit.extensions.ActiveTestSuite.
+
+* <jar>'s whenEmpty attribute is useless as JARs are never empty, they
+ contain at least a manifest file, therefore it will now print a
+ warning and do nothing.
+
+* <typedef> hasn't been all that useful as it couldn't be used outside
+ of targets (it can now) and nested "unknown" elements have always
+ been considered to be tasks (changed as well).
+
+* <fixcrlf> would fail for files that contained lines longer than 8kB.
+
+* Some junit formatters incorrectly assumed that all testcases would
+ inherit from junit.framework.TestCase.
+
+* <fixcrlf> dropped the first characters from Mac files.
+
+Other changes:
+--------------
+
+* <checksum> now uses a buffer (of configurable size).
+
+* The "Trying to override task definition" warning has been degraded
+ to verbose level if the two task definitions only differ in the class
+ loader instance that has loaded the definition.
+
+* Add a jvmargs to the ejbjar's weblogic element to allow additional
+ arguments to be provided to the VM runnign ejbc. Document the
+ jvmdebuglevel attribute which can be used to avoid warnings about
+ interface classess being found on the classpath. Document the new
+ <sysproperty> element which allows JVM properties to be defined.
+ Added an outputdir attribute to allow the destination to be a
+ directory into which the exploded jar is written.
+
+* ejbjar now supports Borland Enterprise Server 5 and Jonas 2.5
+
+* added **/.svn and **/.svn/** to the default excludes.
+
+* Selector Elements now provide a way to create filesets based on
+ sophisticated selection criteria.
+
+* Gzip and Bzip2 files can now be constructed in the fly when using
+ the tar task without having to create the intermediate tar file on
+ disk. The Untar task can also untar GZip and BZip2 files on the fly
+ without creating the intermediate tar file.
+
+* New optional type, <classfileset> added.
+
+* <ejbjar> now allows control over which additional classes and interfaces
+ are added to the generated EJB jars. A new attribute "dependency" can be
+ defined which controls what classes are added. The addition of classes now
+ uses the Jakarta-BCEL library rather than reflection, meaning bean classes are
+ no longer loaded into Ant's JVM. The default dependency analyzer is known as
+ the ancestor analyzer. It provides the same behaviour as the 1.4.1 version of
+ <ejbjar>. If the BCEL library is not present, a warning will be issued stating
+ the ancestor analyzer is not available. In this case <ejbjar> will continue
+ to function but will not add super classes to the jar.
+
+* <available> has a new attribute named ignoreSystemClasses.
+
+* New task <cvschangelog/> generates an XML report of changes that occur
+ on CVS repository.
+
+* New filter readers: ClassConstants, ExpandProperties, HeadFilter,
+ LineContains, LineContainsRegExp, PrefixLines, ReplaceTokens,
+ StripJavaComments, StripLineBreaks, StripLineComments, TabsToSpaces,
+ TailFilter.
+
+* <copy>, <loadfile>, <loadproperties>, <move> support FilterChains
+ of FilterReaders.
+
+* New task <loadproperties> to load contents of file as Ant properties,
+ with nested <filterchain> elements.
+
+* New task <loadfile> to load a whole file into a property.
+
+* New task <echoproperties> to list your current properties to the screen
+ or a file.
+
+* New tasks <bzip2> and <bunzip2> to pack and unpack files using the
+ BZip2 algorithm.
+
+* New tasks <replaceregexp>, <checksum>, <translate>, <waitfor>,
+ <manifest>, <vsscp>, <vssadd>, <vsscreate>, <splash>, <basename>, <dirname>,
+ <concat>, <sourceoffsite>, <jarlib-available>, <jarlib-display>,
+ <jarlib-manifest>, <jarlib-resolve>.
+
+* A new combined <mail> task, which replaces the old <mail> and
+ <mimemail> tasks, has been added. The <mimemail> task, and
+ old SendEmail and MimeMail classes have been deprecated.
+
+* Mail task allows specification of port number.
+
+* Users can control what <zip> and <jar> must do when duplicate files
+ are found. A new element <zipgroupfileset> allows for multiple zip
+ files to be merged into the archive. In addition, <jar> also has
+ another new attribute: filesetmanifest. The existing manifest
+ attribute of <jar> now also accepts the name of a jar added through
+ a fileset.
+
+* gzip now checks that the zipfile is older than the source file
+ before rebuilding the zipfile.
+
+* TarFileset takes in three new attributes - fullpath, prefix
+ and preserveLeadingSlashes.
+
+* <move> attempts to rename the directory, if everything inside it is
+ included, before performing file-by-file moves. This attempt will
+ be done only if filtering is off and if mappers are not used. This
+ is a performance improvement and there is no change otherwise in
+ the functionality of this task.
+
+* Exec task has extra attribute "resultproperty" to get the return code
+ into a property.
+
+* Exec task prints a message when a timed-out process is killed.
+
+* Added optional attributes - name, arch and version to the <os> task.
+
+* Unjar, Untar, Unwar and Unzip now support patternsets to
+ select files from an archive for extraction. Filesets may be
+ used to select archived files for unarchival.
+
+* Javac task allows debug levels to be specified. Debug levels
+ will have an effect only when the modern compiler or the
+ classic compiler (version 1.2 and higher) is used and debugging
+ is enabled.
+
+* Added support for specifying CVS_RSH in the <cvs/> task
+
+* The attributes zipfile, jarfile, warfile and earfile (from the Zip,
+ Jar, War and Ear tasks) have been deprecated and superseded by a
+ new attribute "destfile".
+
+* Added new conditions <isset>, <checksum>, <http>, <socket>, <contains>,
+ <filesmatch>.
+
+* <taskdef> and <typedef> will now emit a warning if a task/type of
+ the given name already exists.
+
+* A new revision of VAJ tasks: The most important new feature
+ is the ability to execute VAJ tasks from the command line by
+ exploiting the Remote Tool Access feature of VAJ.
+
+* Improved support for Novell NetWare.
+
+* Added an optional encoding attribute to <fixcrlf>.
+
+* <apply> has a new attribute relative that allows users to pass the
+ filenames as relative instead of absolute paths on the command line.
+
+* References can now be copied into the child build by <ant> and
+ <antcall> using nested <reference> elements or the new inheritRefs
+ attribute.
+
+* <fail> now supports builds to fail based on conditions via if and
+ unless attributes.
+
+* Ant now comes with two new BuildLogger implementations - one that
+ can send emails containing a log of the build process (MailLogger),
+ and one that colorizes the output based on message levels, using
+ ANSI color code escape sequences (AnsiColorLogger).
+
+* A "package" mapper type has been added to allow package directory
+ names replaced with the dotted form.
+
+* You can now specify environment variables in the <java> and <junit> tasks
+ if the fork attribute has been set to true.
+
+* -propertyfile command-line option has been added to load an entire
+ property file just as -D properties are declared (as user properties).
+ -D properties take precedence over -propertyfile specified ones.
+
+* You can now set an ANT_ARGS environment variable to hold arguments you
+ always want passed to the 'ant' command -- for example, if you always
+ want to use a different logger or the -find flag.
+
+* <tstamp> now supports a new "prefix" attribute to prefix properties set.
+
+* You can now specify the -sourcepath for <javac> explicitly.
+
+* <javac> now supports a new "listfiles" attribute to list the source
+ files it's handing off to the compiler.
+
+* The compiler implementation for <javac> can now be chosen on a task by
+ task basis. The new "compiler" attribute of <javac> can be used to override
+ the value of the build.compiler property, if set.
+
+* <javac> has a new nested element, <compilerarg>, which allows you
+ to specify additional args for the specific compiler you're using.
+
+* <javac>'s "source" attribute is now enabled for jikes as well.
+
+* <propertyfile>'s <entry> now has a 'unit' attribute to specify the
+ increment/decrement unit on date operations.
+
+* <property> now supports a 'prefix' attribute when loading from a file
+ or resource.
+
+* In Ant 1.4, a feature has been added to the <junit> task that would
+ add ant.jar, optional.jar and junit.jar implicitly to the classpath -
+ this feature can now be disabled by setting the new includeantruntime
+ attribute to false.
+
+* <style> behaves differently from any other directory-based task, as it
+ processes all files that it finds in included directories in
+ addition to the files matched by your patterns. There is now a new
+ attribute, 'scanincludeddirectories', to suppress this behavior.
+
+* <javadoc> now supports a <tag> nested element to provide the -tag option
+ to the standard Java 1.4 doclet. The element is ignored when not running
+ on Java 1.4.
+
+* <ftp> can now chmod files on a remote server that supports
+ "site chmod", as well as set the umask before transferring files, if
+ the server supports "site umask".
+
+* New <serverdeploy> "optional" task.
+
+* <patternset> now supports nested patternsets.
+
+* Perforce tasks now support a "failonerror" attribute (defaults to "true").
+
+* Open Source application server JOnAS support:
+ EJB hot deploy and deploy with <serverdeploy> and <ejbjar>
+
+* Added new DirSet (<dirset>) datatype.
+
+* <path> now supports nested <dirset> and <filelist> elements.
+
+* <pathconvert> now supports nested <dirset> and <filelist> elements.
+
+* <pathconvert>'s "dirsep" and "pathsep" attributes now accept
+ multi-character values.
+
+* <copy> task now has a 'failonerror' attribute to allow keep-going
+ behaviour when the file to be copied is not found (defaults to "true").
+
+* <uptodate> now has a 'srcfile' attribute to allow specifying a
+ full-path filename.
+
+* <exec>, <sql> and <java> now support append attributes to allow
+ appending the output to an existing file.
+
+* <java> now supports a timeout attribute analog to <exec> - it is
+ highly recommended to only use it together with fork="true".
+
+* <javadoc> now supports a source attribute to enable javadoc to
+ handle assertions present in JDK 1.4 source code.
+
+* <replace> supports a new replacefilterfile attribute that
+ automatically turns all properties of a given file into
+ replacefilters.
+
+* An alias of <xslt> has been added to refer to the <style> task.
+
+* The compiler implementation for <rmic> can now be chosen on a task by
+ task basis. The new "compiler" attribute of <rmic> can be used to override
+ the value of the build.rmic property, if set.
+
+* <rmic> has a new nested element, <compilerarg>, which allows you
+ to specify additional args for the specific compiler you're using.
+
+* org.apache.tools.ant.XmlLogger now is a BuildLogger, rather than just
+ a BuildListener. It can operate in either mode successfully.
+
+* <junit> has a new attribute "showoutput". If set to true, output
+ generated by tests will be sent to Ant's logging system as well as
+ to the formatters (instead of sending it to the formatters
+ exclusively).
+
+* Ant has now a pluggable way to prompt users for input, which is used
+ by the new <input> task. IDE integrators can provide an
+ implementation of the InputHandler interface to decouple Ant's input
+ from the console. An implementation that gets its input from a file
+ for unattended builds is part of Ant's distribution.
+
+ For more details see docs/manual/inputhandler.html.
+
+* <patch> has a new attribute that selects the directory in which to
+ run the command.
+
+* <javadoc> now supports two new nested elements, <fileset> and <packageset>.
+
+
+Changes from Ant 1.4 to Ant 1.4.1
+===========================================
+
+Fixed bugs:
+-----------
+
+* <ant>'s antfile attribute will now also be considered an absolute path on
+ Windows systems, if it starts with a \ and no drive specifier.
+
+* The fullpath attribute of <zipfileset> has been ignored if you used
+ the src attribute at the same time.
+
+* The manifest file is now always placed as the second entry (after /META-INF)
+ in generated jars. This allows the manifest to be read by JarInputStreams
+
+* Fixed bug in depend task which would fail with a NullPointerException if no
+ dependency cache was specified.
+
+* sql task now handles REM statements correctly so that lines starying with rem
+ but which are not comments are actually processed.
+
+* XMLLogger now uses the task's name rather than the classname
+
+* <mapper>s will now work as expected if the to pattern expands to an
+ absolute pathname.
+
+* <javac> didn't ignore memory settings in non-fork mode
+
+* <cab> didn't split the options attribute into several command line
+ arguments correctly.
+
+Other changes:
+--------------
+
+* New source attribute for <javac> to enable assertion in JDK 1.4
+
+* XmlLogger and <antstructure> now add an encoding declaration to the
+ XML files they generate.
+
+* <fileset> has a new attribute "casesensitive" to make it match
+ filenames in a case insensitive way (if you set it to false) - by
+ default filesets remain case sensitive.
+
+Changes from Ant 1.3 to Ant 1.4
+===========================================
+
+Changes that could break older environments:
+--------------------------------------------
+* JUnitReport now uses the xalan redirect extension for multi-output.
+ With Xalan 1.2.2 it forces the use of bsf.jar in the classpath.
+ (Available in the xalan distribution). It is recommended to switch
+ to Xalan 2.x that do not need it.
+
+* Zip.setWhenempty() has changed its signature.
+
+* <rmic> is now implemented using a factory. This makes extending
+ rmic to use a new compiler a lot easier but may break custom
+ versions of this task that rely on the old implementation.
+
+* several Zip methods have changed their signature as we now use a Zip
+ package of our own that handles Unix permissions for directories.
+ Furthermore <zip> will now use the platform's default character
+ encoding for filenames - this is consistent with the command line
+ ZIP tools, but causes problems if you try to open them from within
+ Java and your filenames contain non US-ASCII characters. Use the new
+ encoding attribute of the task and set it to UTF8 to get the old
+ behavior.
+
+* The <pvcs> task has been moved to a package of its own.
+
+* JUnitResultFormater has two additional methods that must be
+ implemented by custom formatters.
+
+* Ant will no longer use the canonical version of a path internally -
+ this may yield different results on filesystems that support
+ symbolic links.
+
+* The output generated by the xml formatter for <junit> has changed
+ again, it doesn't format the numeric value in the time attribute anymore.
+
+* Pattern matching rules have changes slightly, the pattern foo*
+ doesn't match files contained in a directory named foo - use foo/*
+ instead.
+
+* <fixcrlf> will not remove trailing whitespace at the end of lines anymore.
+
+* The Classloader usage has been changed for the taskdef, property, available
+ and sql tasks so that it delegates to the parent classloader. This may cause
+ ClassNotFoundExceptions to be thrown if a system class attempts to load a
+ class in the taskdef's classpath (typically factory objects).
+
+* Ant now allows multithreading of tasks and the containment of tasks within
+ other tasks. This can break customer listeners which do not expect messages
+ from a task before the previous task has finished.
+
+* Ant now installs its own output stream into System.out to route output to the
+ task currently executing on the current thread. This also means that all
+ output is now routed as Ant message events. Customer listeners and loggers
+ should not call System.out at any time. This has always been true but such
+ usage now will cause problems due to possible recursion.
+
+* Invalid manifest files will now cause build failures in the <jar> task.
+
+* Ant Introspection now looks for methods with method names starting with
+ addConfigured. When called these methods are passed an argument after it has
+ been configured from the build file. Custom tasks supporting nested elements
+ starting with the name configured will no longer function.
+
+* The environment variable JAVACMD that can be used to specify the
+ java executable to Ant's wrapper scripts must not contain additional
+ command line parameters any longer - please use the environment
+ variable ANT_OPTS for such parameters now.
+
+* Ant's wrapper scripts now quote the CLASSPATH environment variable, thus
+ supporting classpaths which refer to directories containing spaces. This means
+ that the CLASSPATH environment variable cannot have quotes. Any quotes should
+ be removed. This will not affect the operation of the CLASSPATH environment
+ variable in other contexts.
+
+* A delete task like
+ <delete includeEmptyFilesets="true">
+ <fileset dir="somedir" />
+ </delete>
+ will now remove "somedir" as well, unless there are still files left
+ in it (matched by the default excludes).
+
+* The copy task will now fail if the file to be copied is not found.
+
+* Ant properties defined in properties files now behave the same way as
+ properties defined in the build file. In particular the $ character needs
+ to be escaped in property values by doubling it to $$. So, to define a
+ property with the value $hello, you need to define it in a properties file
+ as
+ test.prop=$$hello
+ This was not the case in Ant 1.3
+
+Other changes:
+--------------
+
+* New tasks: ear, p4counter, record, cvspass, vsscheckin, vsscheckout,
+ typedef, sleep, mimemail, set of tasks for Continuus/Synergy, dependset,
+ condition, maudit, mmetrics, jpcoverage, jpcovreport, jpcovmerge
+
+* Ant now uses JAXP 1.1
+
+* rmic now supports Kaffe's and Weblogic's version of rmic.
+
+* new magic property build.rmic to chose the rmic implementation
+
+* <tar> will now add empty directories as well
+
+* you can now specify a description for <p4change>
+
+* <touch> can now work on <fileset>s
+
+* <uptodate> now supports a value attribute
+
+* <fail> supports nested text
+
+* <fixcrlf> won't override files that are already in the correct
+ format.
+
+* <sql> now supports REM comments as well as // and --
+
+* <jar> now has a nested <metainf> element following the same idea as
+ <war>'s <webinf>.
+
+* <pvcs> can now handle multiple projects.
+
+* <available> now has a "type" attribute you can use in conjunction
+ with the "file" attribute to specify whether the "file" you're
+ looking for is a file or a directory.
+
+* New <junit> formatter named "brief"
+
+* <ejbjar> changes
+ * Add support for Borland Application Server to the <ejbjar> task using
+ a <borland> nested element.
+ * Add support for iPlanet Application Server to the <ejbjar> task. Also
+ includes some iPlanet utility tasks
+ * Add support for JBoss Application Server to the <ejbjar> task.
+ * Add a naming attribute to control the naming scheme that
+ ejbjar uses to name the generated EJB jars.
+ * Weblogic element now sets the compiler class for EJB 2.0 beans
+ * <dtd> elements can be specified at the <ejbjar> level for building generic
+ beans
+ * <dtd> elements can now be URLs
+ * Allow the manifest to be specified for the generated jars
+ * The weblogic element now supprts an attribte noEJBC to skip the processing
+ of the jar by ejbc. The ejbc step will then occur at deployment
+ * weblogic will tell ejbc to use Jikes compiler if build.compiler is set to
+ jikes. It can be restored to the default, javac, operation if desired.
+
+* Allow the <sql> Delimiter to be set in the so that Oracle stored procs may be
+ entered
+
+* <execon> and <apply> can now optionally skip empty filesets.
+
+* <javadoc> has a new useexternalfile attribute that makes it use a
+ temporary file for sourcefile and package names - helps to defeat
+ command line length limitations.
+
+* Data types like <path> can now be defined inside of <target>s
+
+* you can now specify a classpath for <style> - the XSLZ processor
+ will be loaded from this path
+
+* added a force attribute to <style> to support dependencies that the
+ task cannot determine itself (dependency on parameters, not file
+ modification times for example)
+
+* added vmlauncher attribute to exec tasks. This defaults to true. If
+ it is set to false, the VM's ability to launch commands in bypassed
+ and the OS shell, either directly or through the auxiliary antRun
+ scripts is used.
+
+* regexp mapper now supports the java.util.regex package of JDK 1.4.
+
+* New filesonly attribute for <zip> and friends to suppress directory
+ entries.
+
+* New update attribute for <zip> and friends - update an existing
+ archive instead of creating a new one.
+
+* <apply> and <execon> have been merged into a single task.
+
+* added vssver.scc to the default excludes
+
+* <available> has a new filepath attribute/nested element that allows
+ you top search for a file in a given path.
+
+* <junit> can now optionally set a property on test failure.
+
+* <taskdef> can now define several tasks at once, reading the
+ name/classname pairs from a property file or resource.
+
+* <unzip/unjar/unwar> and <untar> now have an overwrite attribute that
+ defaults to true. If set to false, files that are newer than the
+ files in the archive will not be replaced.
+
+* <patternset> and <fileset> now support nested <in/excludesfile>
+ elements - using these you can have more than one in/excludes file
+ per <patternset>.
+
+* Three new supported compilers for javac: kjc for kopi, gcj for the
+ gcc frontend and sj for Symantec's compiler.
+ In addition extJavac or the new fork attribute can be
+ used to run the JDK's javac in a JVM separate from Ant.
+
+* <fixrlf> can now with CR only line-ends and can use an arbitraty
+ between 2 and 80.
+
+* The .NET tasks have been adapted to the beta2 release of the framework.
+
+* <move> will now try to rename() files before copying them byte by
+ byte - only if filtering is of, of course.
+
+* <ant> and <antcall> tasks now support a new attribute inheritAll. When set to
+ false, only user properties are passed through to the target Ant instance.
+ This includes properties set on the command line and properties explicitly
+ passed
+
+* <javadoc> now skips off line links if the package list cannot be found.
+
+* <wlrun> now allows the security policy file to exist outside the weblogic
+ directory.
+
+* <java> task will set the Thread contextClassLoader under JDKs 1.2+ to the
+ classloader for the class being executed.
+
+* Introduce the concept of a TaskContainer - a task or element which can contain
+ Ant Tasks.
+
+* Add new tasks implementing the TaskContainer interface <parallel> and
+ <sequential> which allow parallel execution of tasks to be specified.
+
+* <depend> task will now take into account dependencies on jar files and class
+ files from a given classpath.
+
+* <jar> manifest entries may now be specified in the build file either
+ completely or to be merged with a manifest file.
+
+* <tstamp> task custom formats now support locales.
+
+* Added a listner which will forward events to Log4J. The log4j configuration
+ file should be in the directory from which Ant is run or passed as a system
+ property using a JVM argument.
+
+* Introduced the concept of <filtersets> to allow for more control in which
+ filters get applied in a <copy> or <move> operation.
+
+* Added nowarn attribute to javac and deprecated the Jikes-magic property
+ build.compiler.warnings.
+
+* The <depend> task cache format has changed and all dependency information is
+ now stored in a single file.
+
+Fixed bugs:
+-----------
+
+* Testcases have been made independent of current working directory.
+
+* Input ZIP-Files will be closed when using a <zipfileset>.
+
+* p4 tasks now don't fail if user, port or client have been omitted
+ (and this is acceptable for the context of the command).
+
+* <javah>'s outputfile attribute will be resolved as relative to the
+ projects basedir.
+
+* <antstructure> should create a valid DTD for propertyfile.operation.entry
+ and omit tasks it fails to load.
+
+* won't try to pass a -bootclasspath flag to javac 1.1 anymore
+
+* <style>'s style attribute no handles absolute paths correctly.
+
+* <delete includeemptydirs="true"> now deletes more than just the leaf
+ directories.
+
+* You can now specify a <fileset> for a directory that doesn't exist at
+ declaration time but will created before the fileset gets used for the
+ first time.
+
+* If the quiet attribute has been set, <delete> will handle <fileset>s
+ with non-existing directories gracefully.
+
+* Output written by testcases will now be captured by the <junit> task
+ and passed to the formatters.
+
+* Quote the -group parameter to Javadoc as per the specification
+
+* Initialise classes when loaded through the AntClassLoader - that is, run
+ static initializers
+
+* Implement getResource() and getResources() in AntClassLoader
+
+* Create the <ejbjar> weblogic command line as a set of arguments rather than
+ as a single line. Avoids problems with paths which contain spaces.
+
+* <ejbjar> now fails when the weblogic ejbc compiler reports an error.
+
+* Make the AntClassLoader load resources in the same order as it currently
+ loads classes.
+
+* Handle classpaths with spaces
+
+* Make sure XSLT processors close their output files in <style>.
+
+* perform proper uptodate check in <rmic> when compiling for IIOP.
+
+* <jjtree>'s uptodate test works even if outputdirectory is not the
+ parent dir of target
+
+* <copy> will remove target file (if it exists) before writing to it -
+ this avoids problems with links on filesystems that support them.
+
+* <ftp> now properly recurses remote directories.
+
+* <ftp> closes remote connection when it's done.
+
+* <junit> tries to include all necessary classes for the task itself
+ to the classpath when running in fork mode - doesn't work for JDK 1.1
+
+* <apply> and <execon> do now execute the command only once, if you
+ specify the parallel attribute - instead of once per fileset.
+
+* directory based tasks and fileset could miss some included files in
+ directories that have been excluded
+
+* <fixcrlf> failed for large files.
+
+* <move> removed files you tried to move to themselves.
+
+* <sql> task will not trty to print the result set unless the query succeeded.
+
+* Ant classloader will now ignore paths which are invalid relative to the
+ project base
+
+* <ejbjar> weblogic elements check for jar file changes has been fixed.
+ Previously some changes would not be included.
+
+* properties loaded from properties files are now resolved internally. This
+ removes the spurious warnings about usage of properties which have not been
+ set.
+
+* <jar> task and friends now process the JAR manifest to ensure it is valid.
+
+* The task finished event now includes any exception thrown by the task.
+
+* <java> task now supports a jvmVersion attribute so that if another JVM is
+ being used, Ant can determine which options to use for features such as the
+ VM memory limits
+
+
+Changes from Ant 1.2 to Ant 1.3
+===========================================
+
+Changes that could break older environments:
+--------------------------------------------
+
+* Ant doesn't search for the buildfile anymore, unless you use the new
+ -find argument.
+
+* <perforce> has been replaced by a number of new tasks.
+
+* <javac> is now implemented using a factory. This makes extending
+ javac to use a new compiler a lot easier but may break custom
+ versions of this task that rely on the old implementation.
+
+* The output generated by the xml formatter for <junit> has changed a
+ little, it doesn't append " sec" in the time attribute anymore.
+
+Other changes:
+--------------
+
+* A GUI Frontend: Antidote. This is currently in development. At this
+ time, this is not part of the Ant release, although the source is
+ included if you are interested.
+
+* New tasks: stylebook, propertyfile, depend, antlr, telnet, csc,
+ ilasm, apply, javah, several clearcase tasks, junitreport, sound
+
+* Added output attribute to <java>.
+
+* Added nested zipfileset element to <zip>
+
+* Changed <sql> so that printing is at the task level rather than
+ the statement level.
+
+* javadoc task will pass -d flag to any doclet if the destDir attribute is
+ given. If the doclet does not accept the -d flag then omit the destdir
+ attribute.
+
+* <cab> can work on non-Windows platforms with the help of libcabinet.
+ See http://trill.cis.fordham.edu/~barbacha/cabinet_library/.
+
+* <ftp> now supports passive mode.
+
+* New <mapper> data type that can be used to get influence on the
+ target files for some tasks like <copy> or enable new types of tasks
+ like <apply>.
+
+* <execon> provides more control over the command line now, the names
+ of the source files are no longer required to be at the end of the
+ command.
+
+* Style tasks will now support TraX compliant XSL processors if one is present
+ in your classpath.
+
+* Added a failonerror to the javac task. If set to false, the build will
+ continue even if there are compilation errors.
+
+* Added nested format elements to the tstamp task allowing additional time
+ formats to be defined for arbitrary properties.
+
+* Added classpath attribute and nested classpath element to <property>
+ to make the resource attribute more powerful.
+
+* ${} property expansion will now be performed on the patterns read
+ from files specified as includesfile or excludesfile attributes.
+
+* The <tar> and <untar> tasks now support GNU format for handling paths
+ which are greater than 100 characters in length. In addition the <tar>
+ task now supports nested filesets through which the file permissions
+ may be controlled.
+
+* wlrun, wlstop and ejbjar now support Weblogic 6.0
+
+* The MPasre task has been updated to work with MParse 2.0
+
+* The documentation has been significantly updated.
+
+
+Fixed bugs:
+-----------
+
+* <signjar> no longer uses deprecated methods.
+
+* javadoc's failonerror attribute works again
+
+* javadoc's additionalparam attribute will now be split into separate
+ parameters (on spaces) to allow for more than one parameter.
+
+* Changed <sql> task so that printing result sets works on Oracle
+
+* Changes to ddcreator and ejbc helper to respect the descriptor hierarchy
+ keppgenerated in ejbc can now be turned off
+
+* ejbjar now correctly ignores <ejb-ref> elements in the deployment descriptor.
+ CMP files are included by parsing the weblogic deployment descriptor rather
+ than relying on the naming convention used in ant 1.2
+
+* ejbjar includes super classes and super interfaces into the generated ejb
+ jar files. The <support> nested element allows support classes to be
+ included in the EJB jar. The toplink element should now correctly locate
+ the toplink descriptor.
+
+* <vssget> now correctly deals with spaces in arguments
+
+* <jar> fails early if a given manifest file doesn't exist
+
+* <rmic> doesn't search for the _Skel file anymore when stubversion is
+ set to 1.2.
+
+* <rmic> uses the the same classpath to verify a class can be rmic'd
+ as it passes to the compiler.
+
+* org.apache.tools.mail.MailMessage (and therefore <mail>) can now
+ handle SMTP servers sending multi line responses.
+
+* nested <classpath> elements of <taskdef> now work for <taskdef>s not
+ nested into <target> as well.
+
+* <property> and <available> will search for the resource "foo" instead
+ of "/org/apache/tools/ant/taskdefs/foo" when given a relative resource
+ name foo.
+
+* Handle build files in directories whose name contained a "#" character
+
+* <junit> can now log to files whose name contains a comma as well.
+
+* The AntClassLoader now refers to the loader which loaded it, any
+ requests it does not handle itself. Previously these went to the
+ primordial loader.
+
+Changes from Ant 1.1 to Ant 1.2
+===============================
+
+Changes that could break older environments:
+--------------------------------------------
+
+* Semantics of <property> has changed again in the hope to be more
+ intuitive. ${} expansion now happens at runtime and <property> tags
+ living inside of targets only take effect if they are visited at
+ runtime.
+
+ As a side effect of this change, task's attributes get set at runtime
+ not at parser time as well, which might change the results of
+ <script>s or other custom tasks that reference other tasks by their id
+ attribute.
+
+* copying of support files in <javac> has been removed - as well as
+ the filtering attribute.
+
+* the <expand> and <keysubst> tasks have been removed.
+
+* the ignore and items attributes of directory based tasks have been removed.
+
+* the command line switches _not_ starting with - have been removed.
+
+* Path and EnumeratedAttribute have been moved from
+ org.apache.tools.ant to org.apache.tools.ant.types.
+
+* the class attributes of <available>, <java>, <rmic> and <taskdef>
+ have been removed.
+
+* the src attribute of <chmod> has been removed.
+
+* <patch> and <javadoc> have lost some of their attributes.
+
+* <java> and <cvs> have lost some undocumented attributes.
+
+* the Unix antRun script would search for command.sh in the directory
+ it changed to and invoke this instead of command if present. This
+ behavior has been dropped.
+
+* <ejbjar> task syntax has been changed significantly
+
+* <exec> is no longer implemented by org.apache.tool.ant.taskdefs.Exec.
+ Custom tasks that rely on Project.createTask("exec") to return an
+ instance of this class are going to fail.
+
+* nested <include> and <exclude> elements expect the value of their
+ name attribute to be a single pattern, they don't accept multiple
+ patterns anymore. Split them into multiple elements of the same type.
+
+* <delete dir="somedir" /> will now delete the directory itself as
+ well as all included files. If you just want to clean out the
+ directory and keep the empty one, use a nested fileset.
+
+Other changes:
+--------------
+
+* New tasks: antstructure, cab, execon, fail, ftp, genkey, jlink,
+ junit, sql, javacc, jjtree, starteam, war, unwar, uptodate,
+ native2ascii, copy, move, mparse.
+
+* copydir, copyfile, deltree and rename are now deprecated. They
+ should be replaced with the new copy, delete and move tasks.
+
+* <java> uses a ClassLoader of its own in no-fork mode if a classpath is
+ specified.
+
+* <style> will create the necessary target directories and reprocess
+ all files if the stylesheet changes.
+
+* New data types fileset and patternset - expected to get a broader use.
+ They, as well as PATH like structures, can now be defined on a global
+ level and later be referenced by their id attribute.
+
+* You can specify environment variables to <exec>.
+
+* <get> can check whether a remote file is actually newer than a local
+ copy before it starts a download (HTTP only).
+
+* Added a -logger option to allow the class which performs logging to be
+ specified on the command line.
+
+* Added a -emacs option to tell the logger to leave out taskname adornments
+ on log output.
+
+* <chmod> works on all files in parallel and supports multiple filesets.
+
+* <replace> can now use tokens and/or values that cross line boundaries.
+
+* build.compiler supports now jvc as well.
+
+* project specific help can now be obtained with the -projecthelp option.
+
+* Added a -debug option to make -verbose less verbose (and more useful)
+
+* Ant will now search for a file named build.xml in the parent directory
+ and above (towards the root of the filesystem) if you didn't specify
+ -buildfile and there is no build.xml in the current directory.
+
+* <echo> can now write to a file and accepts nested text.
+
+Fixed bugs:
+-----------
+
+* <chmod> didn't work when used as a directory based task.
+
+* Path, Available, Property didn't resolve relative filenames with
+ respect to the Project's basedir.
+
+* Project didn't interpret the basedir attribute correctly in all
+ cases.
+
+* Nested <src> in <javac> caused NullPointerException.
+
+* Corrupt Zip- and Jar-files ar now deleted if the task fails.
+
+* many more fixes we've forgotten to document here ...
+
+* The packagelistloc attribute of <javadoc>'s <link> child will be
+ resolved as a file (i.e. it is either absolute or relative to
+ basedir).
diff --git a/love2dToAPK/tools/tools/ant/contributors.xml b/love2dToAPK/tools/tools/ant/contributors.xml
new file mode 100644
index 0000000..7ea115e
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/contributors.xml
@@ -0,0 +1,1671 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+-->
+<!DOCTYPE contributors
+[
+<!ELEMENT name (first?, middle?, last)>
+<!ELEMENT contributors (introduction, name+)>
+<!ELEMENT first (#PCDATA)>
+<!ELEMENT introduction (#PCDATA)>
+<!ELEMENT middle (#PCDATA)>
+<!ELEMENT last (#PCDATA)>
+]
+>
+
+<contributors>
+ <introduction>
+ These are some of the many people who have helped Ant become so successful.
+ </introduction>
+ <name>
+ <first>Adam</first>
+ <last>Blinkinsop</last>
+ </name>
+ <name>
+ <first>Adam</first>
+ <last>Bryzak</last>
+ </name>
+ <name>
+ <first>Adam</first>
+ <last>Sotona</last>
+ </name>
+ <name>
+ <first>Adrian</first>
+ <last>Nistor</last>
+ </name>
+ <name>
+ <first>Aleksandr</first>
+ <last>Ishutin</last>
+ </name>
+ <name>
+ <first>Alex</first>
+ <last>Rosen</last>
+ </name>
+ <name>
+ <first>Alexei</first>
+ <last>Yudichev</last>
+ </name>
+ <name>
+ <first>Alexey</first>
+ <last>Panchenko</last>
+ </name>
+ <name>
+ <first>Alexey</first>
+ <last>Solofnenko</last>
+ </name>
+ <name>
+ <first>Alfred</first>
+ <last>Theorin</last>
+ </name>
+ <name>
+ <first>Alison</first>
+ <last>Winters</last>
+ </name>
+ <name>
+ <first>Andreas</first>
+ <last>Ames</last>
+ </name>
+ <name>
+ <first>Andrew</first>
+ <last>Eisenberg</last>
+ </name>
+ <name>
+ <first>Andrew</first>
+ <last>Everitt</last>
+ </name>
+ <name>
+ <first>Andrew</first>
+ <last>Stevens</last>
+ </name>
+ <name>
+ <first>Andrey</first>
+ <last>Urazov</last>
+ </name>
+ <name>
+ <first>André-John</first>
+ <last>Mas</last>
+ </name>
+ <name>
+ <first>Andy</first>
+ <last>Wood</last>
+ </name>
+ <name>
+ <first>Anil</first>
+ <middle>K.</middle>
+ <last>Vijendran</last>
+ </name>
+ <name>
+ <first>Anli</first>
+ <last>Shundi</last>
+ </name>
+ <name>
+ <first>Anthony</first>
+ <last>Green</last>
+ </name>
+ <name>
+ <first>Anthony</first>
+ <last>Wat</last>
+ </name>
+ <name>
+ <first>Antoine</first>
+ <last>Baudoux</last>
+ </name>
+ <name>
+ <first>Antoine</first>
+ <last>Levy-Lambert</last>
+ </name>
+ <name>
+ <first>Anton</first>
+ <last>Mazkovoi</last>
+ </name>
+ <name>
+ <first>Arjan</first>
+ <last>Veenstra</last>
+ </name>
+ <name>
+ <first>Arnaud</first>
+ <last>Vandyck</last>
+ </name>
+ <name>
+ <first>Arnout</first>
+ <middle>J.</middle>
+ <last>Kuiper</last>
+ </name>
+ <name>
+ <first>Aslak</first>
+ <last>Helles&#244;y</last>
+ </name>
+ <name>
+ <first>Atsuhiko</first>
+ <last>Yamanaka</last>
+ </name>
+ <name>
+ <first>Avik</first>
+ <last>Sengupta</last>
+ </name>
+ <name>
+ <first>Balazs</first>
+ <last>Fejes 2</last>
+ </name>
+ <name>
+ <first>Bart</first>
+ <last>Vanhaute</last>
+ </name>
+ <name>
+ <first>Benjamin</first>
+ <last>Burgess</last>
+ </name>
+ <name>
+ <first>Ben</first>
+ <last>Galbraith</last>
+ </name>
+ <name>
+ <first>Ben</first>
+ <last>Gertzfield</last>
+ </name>
+ <name>
+ <first>Benoit</first>
+ <last>Moussaud</last>
+ </name>
+ <name>
+ <first>Bernd</first>
+ <last>Dutkowski</last>
+ </name>
+ <name>
+ <first>Bernhard</first>
+ <last>Rosenkraenzer</last>
+ </name>
+ <name>
+ <first>Brad</first>
+ <last>Clark</last>
+ </name>
+ <name>
+ <first>Brant</first>
+ <middle>Langer</middle>
+ <last>Gurganus</last>
+ </name>
+ <name>
+ <first>Brian</first>
+ <last>Curnow</last>
+ </name>
+ <name>
+ <first>Brian</first>
+ <last>Deitte</last>
+ </name>
+ <name>
+ <first>Brian</first>
+ <last>Felder</last>
+ </name>
+ <name>
+ <first>Brian</first>
+ <last>Repko</last>
+ </name>
+ <name>
+ <first>Bruce</first>
+ <last>Atherton</last>
+ </name>
+ <name>
+ <first>Charles</first>
+ <last>Hudak</last>
+ </name>
+ <name>
+ <first>Charlie</first>
+ <last>Hubbard</last>
+ </name>
+ <name>
+ <first>Chris</first>
+ <last>Povirk</last>
+ </name>
+ <name>
+ <first>Christian</first>
+ <last>Knorr</last>
+ </name>
+ <name>
+ <first>Christian</first>
+ <last>Schmidt</last>
+ </name>
+ <name>
+ <first>Christoph</first>
+ <last>Gysin</last>
+ </name>
+ <name>
+ <first>Christoph</first>
+ <last>Wilhelms</last>
+ </name>
+ <name>
+ <first>Christophe</first>
+ <last>Labouisse</last>
+ </name>
+ <name>
+ <first>Christopher</first>
+ <middle>A.</middle>
+ <last>Longo</last>
+ </name>
+ <name>
+ <first>Christopher</first>
+ <last>Charlier</last>
+ </name>
+ <name>
+ <first>Clark</first>
+ <last>Archer</last>
+ </name>
+ <name>
+ <first>Clemens</first>
+ <last>Hammacher</last>
+ </name>
+ <name>
+ <first>Clement</first>
+ <last>OUDOT</last>
+ </name>
+ <name>
+ <first>Clive</first>
+ <last>Brettingham-Moore</last>
+ </name>
+ <name>
+ <first>Conor</first>
+ <last>MacNeill</last>
+ </name>
+ <name>
+ <first>Craeg</first>
+ <last>Strong</last>
+ </name>
+ <name>
+ <first>Craig</first>
+ <last>Cottingham</last>
+ </name>
+ <name>
+ <first>Craig</first>
+ <middle>R.</middle>
+ <last>McClanahan</last>
+ </name>
+ <name>
+ <first>Craig</first>
+ <last>Ryan</last>
+ </name>
+ <name>
+ <first>Craig</first>
+ <last>Richardson</last>
+ </name>
+ <name>
+ <first>Craig</first>
+ <last>Sandvik</last>
+ </name>
+ <name>
+ <first>Curt</first>
+ <last>Arnold</last>
+ </name>
+ <name>
+ <first>Curtis</first>
+ <last>White</last>
+ </name>
+ <name>
+ <first>Cyrille</first>
+ <last>Morvan</last>
+ </name>
+ <name>
+ <first>D'Arcy</first>
+ <last>Smith</last>
+ </name>
+ <name>
+ <first>Dale</first>
+ <last>Anson</last>
+ </name>
+ <name>
+ <first>Dale</first>
+ <last>Sherwood</last>
+ </name>
+ <name>
+ <first>Dan</first>
+ <last>Armbrust</last>
+ </name>
+ <name>
+ <first>Daniel</first>
+ <last>Henrique</last>
+ </name>
+ <name>
+ <first>Daniel</first>
+ <last>Ribagnac</last>
+ </name>
+ <name>
+ <first>Daniel</first>
+ <last>Spilker</last>
+ </name>
+ <name>
+ <first>Daniel</first>
+ <last>Trebbien</last>
+ </name>
+ <name>
+ <first>Danno</first>
+ <last>Ferrin</last>
+ </name>
+ <name>
+ <first>Danny</first>
+ <last>Yates</last>
+ </name>
+ <name>
+ <first>Dante</first>
+ <last>Briones</last>
+ </name>
+ <name>
+ <first>Davanum</first>
+ <last>Srinivas</last>
+ </name>
+ <name>
+ <first>Dave</first>
+ <last>Brondsema</last>
+ </name>
+ <name>
+ <first>Dave</first>
+ <last>Brosius</last>
+ </name>
+ <name>
+ <first>David</first>
+ <last>A.</last>
+ </name>
+ <name>
+ <first>David</first>
+ <last>Crossley</last>
+ </name>
+ <name>
+ <first>David</first>
+ <last>G&#228;rtner</last>
+ </name>
+ <name>
+ <first>David</first>
+ <middle>S.</middle>
+ <last>Johnson</last>
+ </name>
+ <name>
+ <first>David</first>
+ <last>Kavanagh</last>
+ </name>
+ <name>
+ <first>David</first>
+ <last>LeRoy</last>
+ </name>
+ <name>
+ <first>David</first>
+ <last>Leal</last>
+ </name>
+ <name>
+ <first>David</first>
+ <middle>M.</middle>
+ <last>Lloyd</last>
+ </name>
+ <name>
+ <first>David</first>
+ <last>Maclean</last>
+ </name>
+ <name>
+ <first>David</first>
+ <last>Rees</last>
+ </name>
+ <name>
+ <first>Denis</first>
+ <last>Hennessy</last>
+ </name>
+ <name>
+ <first>Derek</first>
+ <last>Slager</last>
+ </name>
+ <name>
+ <first>Devon</first>
+ <middle>C.</middle>
+ <last>Miller</last>
+ </name>
+ <name>
+ <first>Diane</first>
+ <last>Holt</last>
+ </name>
+ <name>
+ <first>dIon</first>
+ <last>Gillard</last>
+ </name>
+ <name>
+ <first>Dmitry</first>
+ <middle>A.</middle>
+ <last>Kuminov</last>
+ </name>
+ <name>
+ <first>Dominique</first>
+ <last>Devienne</last>
+ </name>
+ <name>
+ <first>Donal</first>
+ <last>Quinlan</last>
+ </name>
+ <name>
+ <first>Don</first>
+ <last>Bnamen</last>
+ </name>
+ <name>
+ <first>Don</first>
+ <last>Ferguson</last>
+ </name>
+ <name>
+ <first>Don</first>
+ <last>Jeffery</last>
+ </name>
+ <name>
+ <first>Drew</first>
+ <last>Sudell</last>
+ </name>
+ <name>
+ <first>Edison</first>
+ <last>Guo</last>
+ </name>
+ <name>
+ <first>Eduard</first>
+ <last>Wirch</last>
+ </name>
+ <name>
+ <first>Edwin</first>
+ <last>Woudt</last>
+ </name>
+ <name>
+ <first>Eli</first>
+ <last>Tucker</last>
+ </name>
+ <name>
+ <first>Emmanuel</first>
+ <last>Bourg</last>
+ </name>
+ <name>
+ <first>Eric</first>
+ <last>Olsen</last>
+ </name>
+ <name>
+ <first>Eric</first>
+ <last>Pugh</last>
+ </name>
+ <name>
+ <first>Erik</first>
+ <last>Costlow</last>
+ </name>
+ <name>
+ <first>Erik</first>
+ <last>Hatcher</last>
+ </name>
+ <name>
+ <first>Erik</first>
+ <last>Langenbach</last>
+ </name>
+ <name>
+ <first>Erik</first>
+ <last>Meade</last>
+ </name>
+ <name>
+ <first>Ernst</first>
+ <last>de Haan</last>
+ </name>
+ <name>
+ <first>Frank</first>
+ <last>Harnack</last>
+ </name>
+ <name>
+ <first>Frank</first>
+ <last>Somers</last>
+ </name>
+ <name>
+ <first>Frank</first>
+ <last>Zeyda</last>
+ </name>
+ <name>
+ <first>František</first>
+ <last>Kučera</last>
+ </name>
+ <name>
+ <first>Frédéric</first>
+ <last>Bothamy</last>
+ </name>
+ <name>
+ <first>Frederic</first>
+ <last>Lavigne</last>
+ </name>
+ <name>
+ <first>Gary</first>
+ <middle>S.</middle>
+ <last>Weaver</last>
+ </name>
+ <name>
+ <first>Gautam</first>
+ <last>Guliani</last>
+ </name>
+ <name>
+ <first>Gene-Sung</first>
+ <last>Chung</last>
+ </name>
+ <name>
+ <first>Georges-Etienne</first>
+ <last>Legendre</last>
+ </name>
+ <name>
+ <first>Gero</first>
+ <last>Vermaas</last>
+ </name>
+ <name>
+ <first>Gerrit</first>
+ <last>Riessen</last>
+ </name>
+ <name>
+ <first>Gilbert</first>
+ <last>Rebhan</last>
+ </name>
+ <name>
+ <first>Gilles</first>
+ <last>Scokart</last>
+ </name>
+ <name>
+ <first>Glenn</first>
+ <last>McAllister</last>
+ </name>
+ <name>
+ <first>Glenn</first>
+ <last>Twiggs</last>
+ </name>
+ <name>
+ <first>Greg</first>
+ <last>Nelson</last>
+ </name>
+ <name>
+ <first>Greg</first>
+ <last>Roodt</last>
+ </name>
+ <name>
+ <first>Greg</first>
+ <last>Schueler</last>
+ </name>
+ <name>
+ <first>Grégoire</first>
+ <last>Vatry</last>
+ </name>
+ <name>
+ <first>Günther</first>
+ <last>Kögel</last>
+ </name>
+ <name>
+ <first>Harish</first>
+ <last>Prabandham</last>
+ </name>
+ <name>
+ <first>Haroon</first>
+ <last>Rafique</last>
+ </name>
+ <name>
+ <first>Hiroaki</first>
+ <last>Nakamura</last>
+ </name>
+ <name>
+ <first>Holger</first>
+ <last>Engels</last>
+ </name>
+ <name>
+ <first>Holger</first>
+ <last>Joest</last>
+ </name>
+ <name>
+ <first>Ignacio</first>
+ <last>Coloma</last>
+ </name>
+ <name>
+ <first>Ingenonsya</first>
+ <last>France</last>
+ </name>
+ <name>
+ <first>Ingmar</first>
+ <last>Stein</last>
+ </name>
+ <name>
+ <first>Irene</first>
+ <last>Rusman</last>
+ </name>
+ <name>
+ <first>Isaac</first>
+ <last>Shabtay</last>
+ </name>
+ <name>
+ <first>Ivan</first>
+ <last>Ivanov</last>
+ </name>
+ <name>
+ <first>J</first>
+ <last>Bleijenbergh</last>
+ </name>
+ <name>
+ <first>Jack</first>
+ <middle>J.</middle>
+ <last>Woehr</last>
+ </name>
+ <name>
+ <first>James</first>
+ <middle>Duncan</middle>
+ <last>Davidson</last>
+ </name>
+ <name>
+ <first>Jan</first>
+ <last>Cumps</last>
+ </name>
+ <name>
+ <first>Jan</first>
+ <last>Mat&#232;rne</last>
+ </name>
+ <name>
+ <first>Jan</first>
+ <last>Mynarik</last>
+ </name>
+ <name>
+ <first>Jan</first>
+ <last>Stolze</last>
+ </name>
+ <name>
+ <first>Jason</first>
+ <last>Hunter</last>
+ </name>
+ <name>
+ <first>Jason</first>
+ <last>Pettiss</last>
+ </name>
+ <name>
+ <first>Jason</first>
+ <last>Salter</last>
+ </name>
+ <name>
+ <first>Jason</first>
+ <last>Yip</last>
+ </name>
+ <name>
+ <first>Jay</first>
+ <middle>Dickon</middle>
+ <last>Glanville</last>
+ </name>
+ <name>
+ <first>Jay</first>
+ <last>Peck</last>
+ </name>
+ <name>
+ <first>Jay</first>
+ <last>van der Meer</last>
+ </name>
+ <name>
+ <first>JC</first>
+ <last>Mann</last>
+ </name>
+ <name>
+ <first>J</first>
+ <last>D</last>
+ </name>
+ <name>
+ <first>Jean-Francois</first>
+ <last>Brousseau</last>
+ </name>
+ <name>
+ <first>Jeff</first>
+ <last>Gettle</last>
+ </name>
+ <name>
+ <first>Jeff</first>
+ <last>Martin</last>
+ </name>
+ <name>
+ <first>Jeff</first>
+ <last>Tulley</last>
+ </name>
+ <name>
+ <first>Jeff</first>
+ <last>Turner</last>
+ </name>
+ <name>
+ <first>Jene</first>
+ <last>Jasper</last>
+ </name>
+ <name>
+ <first>Jeremy</first>
+ <last>Mawson</last>
+ </name>
+ <name>
+ <first>Jerome</first>
+ <last>Lacoste</last>
+ </name>
+ <name>
+ <first>Jesse</first>
+ <last>Glick</last>
+ </name>
+ <name>
+ <first>Jesse</first>
+ <last>Stockall</last>
+ </name>
+ <name>
+ <first>Jim</first>
+ <last>Allers</last>
+ </name>
+ <name>
+ <first>Joerg</first>
+ <last>Wassmer</last>
+ </name>
+ <name>
+ <first>Joel</first>
+ <last>Tucci</last>
+ </name>
+ <name>
+ <first>Joey</first>
+ <last>Richey</last>
+ </name>
+ <name>
+ <first>Johann</first>
+ <last>Herunter</last>
+ </name>
+ <name>
+ <first>John</first>
+ <last>Elion</last>
+ </name>
+ <name>
+ <first>John</first>
+ <last>Sisson</last>
+ </name>
+ <name>
+ <first>Jon</first>
+ <last>Dickinson</last>
+ </name>
+ <name>
+ <first>Jon</first>
+ <last>Skeet</last>
+ </name>
+ <name>
+ <first>Jon</first>
+ <middle>S.</middle>
+ <last>Stevens</last>
+ </name>
+ <name>
+ <first>Jose</first>
+ <middle>Alberto</middle>
+ <last>Fernandez</last>
+ </name>
+ <name>
+ <first>Josh</first>
+ <last>Lucas</last>
+ </name>
+ <name>
+ <first>Joseph</first>
+ <last>Walton</last>
+ </name>
+ <name>
+ <first>Juerg</first>
+ <last>Wanner</last>
+ </name>
+ <name>
+ <first>Julian</first>
+ <last>Simpson</last>
+ </name>
+ <name>
+ <first>Justin</first>
+ <last>Vallon</last>
+ </name>
+ <name>
+ <first>Keiron</first>
+ <last>Liddle</last>
+ </name>
+ <name>
+ <first>Keith</first>
+ <last>Visco</last>
+ </name>
+ <name>
+ <first>Kevin</first>
+ <middle>Connor</middle>
+ <last>Arpe</last>
+ </name>
+ <name>
+ <first>Kevin</first>
+ <last>Greiner</last>
+ </name>
+ <name>
+ <first>Kevin</first>
+ <last>Jackson</last>
+ </name>
+ <name>
+ <first>Kevin</first>
+ <last>Ross</last>
+ </name>
+ <name>
+ <first>Kevin</first>
+ <middle>Z</middle>
+ <last>Grey</last>
+ </name>
+ <name>
+ <first>Kim</first>
+ <last>Hansen</last>
+ </name>
+ <name>
+ <first>Kirk</first>
+ <last>Wylie</last>
+ </name>
+ <name>
+ <first>Kristian</first>
+ <last>Rosenvold</last>
+ </name>
+ <name>
+ <first>Kyle</first>
+ <last>Adams</last>
+ </name>
+ <name>
+ <first>Lajos</first>
+ <last>Veres</last>
+ </name>
+ <name>
+ <first>Larry</first>
+ <last>Shatzer</last>
+ </name>
+ <name>
+ <first>Larry</first>
+ <last>Streepy</last>
+ </name>
+ <name>
+ <first>Les</first>
+ <last>Hughes</last>
+ </name>
+ <name>
+ <first>Levi</first>
+ <last>Cook</last>
+ </name>
+ <name>
+ <last>lucas</last>
+ </name>
+ <name>
+ <first>Lucas</first>
+ <last>Werkmeister</last>
+ </name>
+ <name>
+ <first>Ludovic</first>
+ <last>Claude</last>
+ </name>
+ <name>
+ <first>Magesh</first>
+ <last>Umasankar</last>
+ </name>
+ <name>
+ <first>Maneesh</first>
+ <last>Sahu</last>
+ </name>
+ <name>
+ <first>Marcel</first>
+ <last>Schutte</last>
+ </name>
+ <name>
+ <first>Marcus</first>
+ <last>Börger</last>
+ </name>
+ <name>
+ <first>Mario</first>
+ <last>Frasca</last>
+ </name>
+ <name>
+ <first>Mariusz</first>
+ <last>Nowostawski</last>
+ </name>
+ <name>
+ <first>Mark</first>
+ <last>DeLaFranier</last>
+ </name>
+ <name>
+ <first>Mark</first>
+ <last>Hecker</last>
+ </name>
+ <name>
+ <first>Mark</first>
+ <last>Salter</last>
+ </name>
+ <name>
+ <first>Mark</first>
+ <middle>R.</middle>
+ <last>Diggory</last>
+ </name>
+ <name>
+ <first>Mark</first>
+ <middle>A.</middle>
+ <last>Ziesemer</last>
+ </name>
+ <name>
+ <first>Markus</first>
+ <last>Kahl</last>
+ </name>
+ <name>
+ <first>Martijn</first>
+ <last>Kruithof</last>
+ </name>
+ <name>
+ <first>Martin</first>
+ <last>Landers</last>
+ </name>
+ <name>
+ <first>Martin</first>
+ <last>Poeschl</last>
+ </name>
+ <name>
+ <first>Martin</first>
+ <last>van den Bemt</last>
+ </name>
+ <name>
+ <first>Martin</first>
+ <last>von Gagern</last>
+ </name>
+ <name>
+ <first>Matt</first>
+ <last>Albrecht</last>
+ </name>
+ <name>
+ <first>Matt</first>
+ <last>Benson</last>
+ </name>
+ <name>
+ <first>Matt</first>
+ <last>Bishop</last>
+ </name>
+ <name>
+ <first>Matt</first>
+ <last>Foemmel</last>
+ </name>
+ <name>
+ <first>Matt</first>
+ <last>Grosso</last>
+ </name>
+ <name>
+ <first>Matt</first>
+ <last>Humphrey</last>
+ </name>
+ <name>
+ <first>Matt</first>
+ <last>Small</last>
+ </name>
+ <name>
+ <first>Matt</first>
+ <last>Wildig</last>
+ </name>
+ <name>
+ <first>Mathieu</first>
+ <last>Champlon</last>
+ </name>
+ <name>
+ <first>Mathieu</first>
+ <last>Peltier</last>
+ </name>
+ <name>
+ <first>Matthias</first>
+ <last>Bhend</last>
+ </name>
+ <name>
+ <first>Matthew</first>
+ <last>Hawthorne</last>
+ </name>
+ <name>
+ <first>Matthew</first>
+ <last>Inger</last>
+ </name>
+ <name>
+ <first>Matthew</first>
+ <middle>Kuperus</middle>
+ <last>Heun</last>
+ </name>
+ <name>
+ <first>Matthew</first>
+ <last>Watson</last>
+ </name>
+ <name>
+ <first>Michael</first>
+ <last>Bayne</last>
+ </name>
+ <name>
+ <first>Michael</first>
+ <last>Clarke</last>
+ </name>
+ <name>
+ <first>Michael</first>
+ <last>Davey</last>
+ </name>
+ <name>
+ <first>Michael</first>
+ <middle>J.</middle>
+ <last>Sikorsky</last>
+ </name>
+ <name>
+ <first>Michael</first>
+ <last>McCallum</last>
+ </name>
+ <name>
+ <first>Michael</first>
+ <last>Newcomb</last>
+ </name>
+ <name>
+ <first>Michael</first>
+ <last>Nygard</last>
+ </name>
+ <name>
+ <first>Michael</first>
+ <last>Saunders</last>
+ </name>
+ <name>
+ <last>Miha</last>
+ </name>
+ <name>
+ <first>Mike</first>
+ <last>Davis</last>
+ </name>
+ <name>
+ <first>Mike</first>
+ <last>Roberts</last>
+ </name>
+ <name>
+ <first>Mike</first>
+ <last>Williams</last>
+ </name>
+ <name>
+ <first>Miroslav</first>
+ <last>Zaťko</last>
+ </name>
+ <name>
+ <last>mnowostawski</last>
+ </name>
+ <name>
+ <first>Mounir</first>
+ <last>El Hajj</last>
+ </name>
+ <name>
+ <first>Nathan</first>
+ <last>Beyer</last>
+ </name>
+ <name>
+ <first>Nick</first>
+ <last>Chalko</last>
+ </name>
+ <name>
+ <first>Nick</first>
+ <last>Crossley</last>
+ </name>
+ <name>
+ <first>Nick</first>
+ <last>Fortescue</last>
+ </name>
+ <name>
+ <first>Nick</first>
+ <last>Pellow</last>
+ </name>
+ <name>
+ <first>Nicola</first>
+ <last>Ken</last>
+ </name>
+ <name>
+ <first>Nico</first>
+ <last>Seessle</last>
+ </name>
+ <name>
+ <first>Nigel</first>
+ <last>Magnay</last>
+ </name>
+ <name>
+ <first>Oliver</first>
+ <last>Merkel</last>
+ </name>
+ <name>
+ <first>Oliver</first>
+ <last>Rossmueller</last>
+ </name>
+ <name>
+ <first>Omer</first>
+ <last>Shapira</last>
+ </name>
+ <name>
+ <first>Ondra</first>
+ <last>Medek</last>
+ </name>
+ <name>
+ <first>&#216;ystein</first>
+ <last>Gisn&#229;s</last>
+ </name>
+ <name>
+ <first>Patrick</first>
+ <last>Altaie</last>
+ </name>
+ <name>
+ <first>Patrick</first>
+ <last>C.</last>
+ </name>
+ <name>
+ <first>Patrick</first>
+ <last>Chanezon</last>
+ </name>
+ <name>
+ <first>Patrick</first>
+ <last>Gus</last>
+ </name>
+ <name>
+ <first>Paul</first>
+ <last>Austin</last>
+ </name>
+ <name>
+ <first>Paul</first>
+ <last>Christmann</last>
+ </name>
+ <name>
+ <first>Paul</first>
+ <last>Galbraith</last>
+ </name>
+ <name>
+ <first>Paul</first>
+ <last>King</last>
+ </name>
+ <name>
+ <first>Paulo</first>
+ <last>Gaspar</last>
+ </name>
+ <name>
+ <first>Pavan</first>
+ <last>Bayyapu</last>
+ </name>
+ <name>
+ <first>Pavel</first>
+ <last>Jisl</last>
+ </name>
+ <name>
+ <first>Paweł</first>
+ <last>Zuzelski</last>
+ </name>
+ <name>
+ <first>Peter</first>
+ <middle>B.</middle>
+ <last>West</last>
+ </name>
+ <name>
+ <first>Peter</first>
+ <last>Donald</last>
+ </name>
+ <name>
+ <first>Peter</first>
+ <last>Doornbosch</last>
+ </name>
+ <name>
+ <first>Peter</first>
+ <last>Hulst</last>
+ </name>
+ <name>
+ <first>Peter</first>
+ <last>Janes</last>
+ </name>
+ <name>
+ <first>Peter</first>
+ <last>Reilly</last>
+ </name>
+ <name>
+ <first>Petr</first>
+ <last>Kureš</last>
+ </name>
+ <name>
+ <first>Phil</first>
+ <last>Hanna</last>
+ </name>
+ <name>
+ <first>Philip</first>
+ <last>Hourihane</last>
+ </name>
+ <name>
+ <first>Phillip</first>
+ <last>Wells</last>
+ </name>
+ <name>
+ <first>Pierre</first>
+ <last>Delisle</last>
+ </name>
+ <name>
+ <first>Pierre</first>
+ <last>Dittgen</last>
+ </name>
+ <name>
+ <first>R</first>
+ <last>Handerson</last>
+ </name>
+ <name>
+ <first>Ralf</first>
+ <last>Hergert</last>
+ </name>
+ <name>
+ <first>Rami</first>
+ <last>Ojares</last>
+ </name>
+ <name>
+ <first>Randy</first>
+ <last>Watler</last>
+ </name>
+ <name>
+ <first>Raphael</first>
+ <last>Pierquin</last>
+ </name>
+ <name>
+ <first>Ray</first>
+ <last>Waldin</last>
+ </name>
+ <name>
+ <first>Remie</first>
+ <last>Bolte</last>
+ </name>
+ <name>
+ <first>René</first>
+ <last>Krell</last>
+ </name>
+ <name>
+ <first>Richard</first>
+ <last>Evans</last>
+ </name>
+ <name>
+ <first>Richard</first>
+ <last>Steele</last>
+ </name>
+ <name>
+ <first>Rick</first>
+ <last>Beton</last>
+ </name>
+ <name>
+ <first>Robbie</first>
+ <last>Gibson</last>
+ </name>
+ <name>
+ <first>Robert</first>
+ <last>Anderson</last>
+ </name>
+ <name>
+ <first>Robert</first>
+ <last>Clark</last>
+ </name>
+ <name>
+ <first>Robert</first>
+ <last>Flaherty</last>
+ </name>
+ <name>
+ <first>Robert</first>
+ <last>Shaw</last>
+ </name>
+ <name>
+ <first>Robert</first>
+ <last>Streich</last>
+ </name>
+ <name>
+ <first>Robert</first>
+ <last>Watkins</last>
+ </name>
+ <name>
+ <first>Roberto</first>
+ <last>Scaramuzzi</last>
+ </name>
+ <name>
+ <first>Robin</first>
+ <last>Green</last>
+ </name>
+ <name>
+ <first>Robin</first>
+ <last>Power</last>
+ </name>
+ <name>
+ <first>Robin</first>
+ <last>Verduijn</last>
+ </name>
+ <name>
+ <first>Rob</first>
+ <last>Oxspring</last>
+ </name>
+ <name>
+ <first>Rob</first>
+ <last>van Oostrum</last>
+ </name>
+ <name>
+ <first>Rodrigo</first>
+ <last>Schmidt</last>
+ </name>
+ <name>
+ <first>Roger</first>
+ <last>Vaughn</last>
+ </name>
+ <name>
+ <first>Roman</first>
+ <last>Ivashin</last>
+ </name>
+ <name>
+ <first>Roman</first>
+ <last>Savko</last>
+ </name>
+ <name>
+ <first>Ronen</first>
+ <last>Mashal</last>
+ </name>
+ <name>
+ <first>Russell</first>
+ <last>Gold</last>
+ </name>
+ <name>
+ <first>Ryan</first>
+ <last>Bennitt</last>
+ </name>
+ <name>
+ <first>Sam</first>
+ <last>Ruby</last>
+ </name>
+ <name>
+ <first>Sandra</first>
+ <last>Metz</last>
+ </name>
+ <name>
+ <first>Scott</first>
+ <last>Carlson</last>
+ </name>
+ <name>
+ <first>Scott</first>
+ <last>Ellsworth</last>
+ </name>
+ <name>
+ <first>Scott</first>
+ <last>Johnson</last>
+ </name>
+ <name>
+ <first>Scott</first>
+ <middle>M.</middle>
+ <last>Stirling</last>
+ </name>
+ <name>
+ <first>Sean</first>
+ <last>Egan</last>
+ </name>
+ <name>
+ <first>Sean</first>
+ <middle>P.</middle>
+ <last>Kane</last>
+ </name>
+ <name>
+ <first>Sebastien</first>
+ <last>Arod</last>
+ </name>
+ <name>
+ <first>Shiraz</first>
+ <last>Kanga</last>
+ </name>
+ <name>
+ <first>Sebastian</first>
+ <last>Kantha</last>
+ </name>
+ <name>
+ <first>Simon</first>
+ <last>Law</last>
+ </name>
+ <name>
+ <first>Simone</first>
+ <last>Bordet</last>
+ </name>
+ <name>
+ <first>Stefan</first>
+ <last>Bodewig</last>
+ </name>
+ <name>
+ <first>Stefan</first>
+ <last>Heimann</last>
+ </name>
+ <name>
+ <first>Stefano</first>
+ <last>Mazzocchi</last>
+ </name>
+ <name>
+ <first>Stephan</first>
+ <last>Strittmatter</last>
+ </name>
+ <name>
+ <first>Stephane</first>
+ <last>Bailliez</last>
+ </name>
+ <name>
+ <last>stephan</last>
+ </name>
+ <name>
+ <first>Stephan</first>
+ <last>Michels</last>
+ </name>
+ <name>
+ <first>Stephen</first>
+ <last>Chin</last>
+ </name>
+ <name>
+ <first>Steve</first>
+ <last>Cohen</last>
+ </name>
+ <name>
+ <first>Steve</first>
+ <last>Langley</last>
+ </name>
+ <name>
+ <first>Steve</first>
+ <last>Loughran</last>
+ </name>
+ <name>
+ <first>Steve</first>
+ <last>Morin</last>
+ </name>
+ <name>
+ <first>Steve</first>
+ <last>Wadsworth</last>
+ </name>
+ <name>
+ <first>Steven</first>
+ <middle>E.</middle>
+ <last>Newton</last>
+ </name>
+ <name>
+ <first>Sudheer</first>
+ <last>Chigurupati</last>
+ </name>
+ <name>
+ <first>Takashi</first>
+ <last>Okamoto</last>
+ </name>
+ <name>
+ <first>TAMURA</first>
+ <last>Kent</last>
+ </name>
+ <name>
+ <first>Taoufik</first>
+ <last>Romdhane</last>
+ </name>
+ <name>
+ <first>Tariq</first>
+ <last>Master</last>
+ </name>
+ <name>
+ <first>Thomas</first>
+ <last>Aglassinger</last>
+ </name>
+ <name>
+ <first>Thomas</first>
+ <last>Butz</last>
+ </name>
+ <name>
+ <first>Thomas</first>
+ <last>Christen</last>
+ </name>
+ <name>
+ <first>Thomas</first>
+ <last>Christensen</last>
+ </name>
+ <name>
+ <first>Thomas</first>
+ <last>Haas</last>
+ </name>
+ <name>
+ <first>Thomas</first>
+ <last>Quas</last>
+ </name>
+ <name>
+ <first>Tim</first>
+ <last>Boemker</last>
+ </name>
+ <name>
+ <first>Tim</first>
+ <last>Drury</last>
+ </name>
+ <name>
+ <first>Tim</first>
+ <last>Fennell</last>
+ </name>
+ <name>
+ <first>Tim</first>
+ <last>Whittington</last>
+ </name>
+ <name>
+ <first>Timoteo</first>
+ <last>Ohara</last>
+ </name>
+ <name>
+ <first>Timothy</first>
+ <middle>Gerard</middle>
+ <last>Endres</last>
+ </name>
+ <name>
+ <first>Tim</first>
+ <last>Stephenson</last>
+ </name>
+ <name>
+ <first>Tom</first>
+ <last>Ball</last>
+ </name>
+ <name>
+ <first>Tom</first>
+ <last>Cunningham</last>
+ </name>
+ <name>
+ <first>Tom</first>
+ <last>Dimock</last>
+ </name>
+ <name>
+ <first>Tom</first>
+ <last>Eugelink</last>
+ </name>
+ <name>
+ <first>Tom</first>
+ <last>May</last>
+ </name>
+ <name>
+ <first>Tomasz</first>
+ <last>Bech</last>
+ </name>
+ <name>
+ <first>Trejkaz</first>
+ <last>Xaoz</last>
+ </name>
+ <name>
+ <first>Ulrich</first>
+ <last>Schmidt</last>
+ </name>
+ <name>
+ <first>Uwe</first>
+ <last>Schindler</last>
+ </name>
+ <name>
+ <first>Valentino</first>
+ <last>Miazzo</last>
+ </name>
+ <name>
+ <first>Victor</first>
+ <last>Toni</last>
+ </name>
+ <name>
+ <first>Vincent</first>
+ <last>Legoll</last>
+ </name>
+ <name>
+ <first>Vimil</first>
+ <last>Saju</last>
+ </name>
+ <name>
+ <first>Vitold</first>
+ <last>Sedyshev</last>
+ </name>
+ <name>
+ <first>Volker</first>
+ <last>Leidl</last>
+ </name>
+ <name>
+ <first>Wang</first>
+ <last>Weijun</last>
+ </name>
+ <name>
+ <first>Will</first>
+ <last>Wang</last>
+ </name>
+ <name>
+ <first>William</first>
+ <last>Bernardet</last>
+ </name>
+ <name>
+ <first>William</first>
+ <last>Ferguson</last>
+ </name>
+ <name>
+ <first>William</first>
+ <last>Webber</last>
+ </name>
+ <name>
+ <first>Wolf</first>
+ <last>Siberski</last>
+ </name>
+ <name>
+ <first>Wolfgang</first>
+ <last>Baer</last>
+ </name>
+ <name>
+ <first>Wolfgang</first>
+ <last>Frech</last>
+ </name>
+ <name>
+ <first>Wolfgang</first>
+ <last>Glas</last>
+ </name>
+ <name>
+ <first>Wolfgang</first>
+ <last>Werner</last>
+ </name>
+ <name>
+ <first>Xavier</first>
+ <last>Hanin</last>
+ </name>
+ <name>
+ <first>Xavier</first>
+ <last>Witdouck</last>
+ </name>
+ <name>
+ <first>Yohann</first>
+ <last>Roussel</last>
+ </name>
+ <name>
+ <first>Yuji</first>
+ <last>Yamano</last>
+ </name>
+ <name>
+ <first>Yves</first>
+ <last>Martin</last>
+ </name>
+ <name>
+ <first>Zach</first>
+ <last>Garner</last>
+ </name>
+ <name>
+ <first>Zdenek</first>
+ <last>Wagner</last>
+ </name>
+ <name>
+ <first/>
+ <last>riasol</last>
+ </name>
+</contributors>
diff --git a/love2dToAPK/tools/tools/ant/etc/ant-bootstrap.jar b/love2dToAPK/tools/tools/ant/etc/ant-bootstrap.jar
new file mode 100644
index 0000000..244ed3a
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/etc/ant-bootstrap.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/ant/etc/changelog.xsl b/love2dToAPK/tools/tools/ant/etc/changelog.xsl
new file mode 100644
index 0000000..c6aef8f
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/etc/changelog.xsl
@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<xsl:stylesheet
+ xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
+ version='1.0'>
+
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+
+-->
+ <xsl:param name="title"/>
+ <xsl:param name="module"/>
+ <xsl:param name="cvsweb"/>
+
+ <xsl:output method="html" indent="yes" encoding="US-ASCII"
+ doctype-public="-//W3C//DTD HTML 4.01//EN"
+ doctype-system="http://www.w3.org/TR/html401/strict.dtd"/>
+
+ <!-- Copy standard document elements. Elements that
+ should be ignored must be filtered by apply-templates
+ tags. -->
+ <xsl:template match="*">
+ <xsl:copy>
+ <xsl:copy-of select="attribute::*[. != '']"/>
+ <xsl:apply-templates/>
+ </xsl:copy>
+ </xsl:template>
+
+ <xsl:template match="changelog">
+ <html>
+ <head>
+ <title><xsl:value-of select="$title"/></title>
+ <style type="text/css">
+ body, p {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 80%;
+ color: #000000;
+ background-color: #ffffff;
+ }
+ tr, td {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ background: #eeeee0;
+ }
+ td {
+ padding-left: 20px;
+ }
+ .dateAndAuthor {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-weight: bold;
+ text-align: left;
+ background: #a6caf0;
+ padding-left: 3px;
+ }
+ a {
+ color: #000000;
+ }
+ pre {
+ font-weight: bold;
+ }
+ </style>
+ </head>
+ <body>
+ <h1>
+ <a name="top"><xsl:value-of select="$title"/></a>
+ </h1>
+ <p style="text-align: right">Designed for use with <a href="http://ant.apache.org/">Apache Ant</a>.</p>
+ <hr/>
+ <table border="0" width="100%" cellspacing="1">
+
+ <xsl:apply-templates select=".//entry">
+ <xsl:sort select="date" data-type="text" order="descending"/>
+ <xsl:sort select="time" data-type="text" order="descending"/>
+ </xsl:apply-templates>
+
+ </table>
+
+ </body>
+ </html>
+ </xsl:template>
+
+ <xsl:template match="entry">
+ <tr>
+ <td class="dateAndAuthor">
+ <xsl:value-of select="date"/><xsl:text> </xsl:text><xsl:value-of select="time"/><xsl:text> </xsl:text><xsl:value-of select="author"/>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <pre>
+<xsl:apply-templates select="msg"/></pre>
+ <ul>
+ <xsl:apply-templates select="file"/>
+ </ul>
+ </td>
+ </tr>
+ </xsl:template>
+
+ <xsl:template match="date">
+ <i><xsl:value-of select="."/></i>
+ </xsl:template>
+
+ <xsl:template match="time">
+ <i><xsl:value-of select="."/></i>
+ </xsl:template>
+
+ <xsl:template match="author">
+ <i>
+ <a>
+ <xsl:attribute name="href">mailto:<xsl:value-of select="."/></xsl:attribute>
+ <xsl:value-of select="."/></a>
+ </i>
+ </xsl:template>
+
+ <xsl:template match="file">
+ <li>
+ <a>
+ <xsl:choose>
+ <xsl:when test="string-length(prevrevision) = 0 ">
+ <xsl:attribute name="href"><xsl:value-of select="$cvsweb"/><xsl:value-of select="$module" />/<xsl:value-of select="name" />?rev=<xsl:value-of select="revision" />&amp;content-type=text/x-cvsweb-markup</xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="href"><xsl:value-of select="$cvsweb"/><xsl:value-of select="$module" />/<xsl:value-of select="name" />?r1=<xsl:value-of select="revision" />&amp;r2=<xsl:value-of select="prevrevision"/></xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:value-of select="name" /> (<xsl:value-of select="revision"/>)</a>
+ </li>
+ </xsl:template>
+
+ <!-- Any elements within a msg are processed,
+ so that we can preserve HTML tags. -->
+ <xsl:template match="msg">
+ <xsl:apply-templates/>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/love2dToAPK/tools/tools/ant/etc/checkstyle/checkstyle-frames-sortby-check.xsl b/love2dToAPK/tools/tools/ant/etc/checkstyle/checkstyle-frames-sortby-check.xsl
new file mode 100644
index 0000000..060f878
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/etc/checkstyle/checkstyle-frames-sortby-check.xsl
@@ -0,0 +1,367 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
+ xmlns:lxslt="http://xml.apache.org/xslt"
+ xmlns:redirect="http://xml.apache.org/xalan/redirect"
+ extension-element-prefixes="redirect">
+
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+-->
+
+ <xsl:output method="html" indent="yes" encoding="US-ASCII"/>
+ <xsl:decimal-format decimal-separator="." grouping-separator="," />
+
+ <xsl:param name="output.dir" select="'.'"/>
+ <xsl:param name="basedir" select="'.'"/>
+
+
+
+ <!--
+ Matches the root element of the data and starts the generation.
+ -->
+ <xsl:template match="checkstyle">
+ <!-- create the sorted.html with the data -->
+ <redirect:write file="{$output.dir}/sorted.html">
+ <xsl:call-template name="sorted.html"/>
+ </redirect:write>
+
+ <!-- create the stylesheet.css with layout -->
+ <redirect:write file="{$output.dir}/sorted.css">
+ <xsl:call-template name="sorted.css"/>
+ </redirect:write>
+
+ <!-- create the switch.js for collepsing the data -->
+ <redirect:write file="{$output.dir}/switch.js">
+ <xsl:call-template name="switch.js"/>
+ </redirect:write>
+ </xsl:template>
+
+
+
+ <!--
+ Generates the HTML page with the data.
+ -->
+ <xsl:template name="sorted.html">
+ <html>
+ <head>
+ <title>CheckStyle Audit</title>
+ <script language="JavaScript" src="switch.js" type="text/javascript"></script>
+ <link rel="stylesheet" type="text/css" href="sorted.css"/>
+ </head>
+ <body onload="javascript:openFirst();">
+ <h1>CheckStyle Audit</h1>
+ <p>Designed for use with
+ <a href='http://checkstyle.sourceforge.net/'>CheckStyle</a> and
+ <a href='http://ant.apache.org/'>Ant</a>.
+ </p>
+ <xsl:apply-templates select="." mode="navigation"/>
+ <xsl:apply-templates select="." mode="data"/>
+ </body>
+ </html>
+ </xsl:template>
+
+
+
+ <!--
+ Key for detecting duplicate CheckModules
+ -->
+ <xsl:key name="module" match="file/error" use="@source"/>
+
+
+
+ <!--
+ Generates the navagation bar.
+ -->
+ <xsl:template match="checkstyle" mode="navigation">
+ <ul id="navigation">
+ <xsl:for-each select="file/error[generate-id() = generate-id(key('module',@source))]">
+ <xsl:sort select="@source"/>
+ <xsl:variable name="last-index">
+ <xsl:call-template name="last-index-of">
+ <xsl:with-param name="txt" select="@source"/>
+ <xsl:with-param name="delimiter" select="'.'"></xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+ <li><a href="javascript:change('{@source}');">
+ <xsl:value-of select="substring(@source, $last-index+1)"/>
+ </a></li>
+ </xsl:for-each>
+ </ul>
+ </xsl:template>
+
+
+
+ <!--
+ Generates the data part.
+ -->
+ <xsl:template match="checkstyle" mode="data">
+ <div id="content">
+ <xsl:for-each select="file/error[generate-id() = generate-id(key('module',@source))]">
+ <xsl:sort select="@source"/>
+ <div class="hideable" id="{@source}">
+ <xsl:variable name="module" select="@source"/>
+ <h2><xsl:value-of select="@source"/></h2>
+ <xsl:call-template name="data">
+ <xsl:with-param name="filter" select="$module"/>
+ </xsl:call-template>
+ </div>
+ </xsl:for-each>
+ </div>
+ </xsl:template>
+
+
+
+ <!--
+ Generates the content table for the given check module.
+ @param filter full qualified module name
+ -->
+ <xsl:template name="data">
+ <xsl:param name="filter"/>
+
+ <table>
+ <tr>
+ <th>file</th>
+ <th>line</th>
+ <th>severity</th>
+ <th>message</th>
+ </tr>
+ <xsl:for-each select="/checkstyle/file">
+ <xsl:choose>
+ <xsl:when test="error/@source=$filter">
+ <xsl:call-template name="data-rows">
+ <xsl:with-param name="node" select="."/>
+ <xsl:with-param name="filter" select="$filter"/>
+ </xsl:call-template>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:for-each>
+ </table>
+ </xsl:template>
+
+
+
+ <!--
+ Generates the data rows for the current check module.
+ Ignores errors in the current file from other modules.
+ @param node the file with the errors
+ @param filter full qualified module name
+ -->
+ <xsl:template name="data-rows">
+ <xsl:param name="node"/>
+ <xsl:param name="filter"/>
+
+ <xsl:for-each select="$node/error">
+ <xsl:choose>
+ <xsl:when test="@source=$filter">
+ <tr>
+ <!-- Hide the basdir. First char of the result is a path separator so remove that. -->
+ <td><xsl:value-of select="substring(substring-after($node/@name, $basedir),2)"/></td>
+ <td><xsl:value-of select="@line"/></td>
+ <td><xsl:value-of select="@severity"/></td>
+ <td><xsl:value-of select="@message"/></td>
+ </tr>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:template>
+
+
+
+ <!--
+ Generates the CSS with the layout instructions.
+ Generated so this XSL is the single source of the whole report.
+ -->
+ <xsl:template name="sorted.css">
+ body {
+ font:normal 80% arial,helvetica,sanserif;
+ color: black;
+ background-color: white;
+ margin: 0;
+ padding: 1em;
+ min-width: 41em;
+ }
+ h1 {
+ font-weight:bold;
+ font-size:140%;
+ margin: 0 0 0.7em;
+ padding: 0.3em;
+ text-align: center;
+ background-color: #eee;
+ border: 2px ridge silver;
+ }
+ html<xsl:text disable-output-escaping="yes">&gt;</xsl:text>body h1 {
+ border-color: gray;
+ }
+
+ ul#navigation {
+ font-size: 0.83em;
+ float: left; width: 18em;
+ margin: 0 0 1.2em; padding: 0;
+ border: 1px dashed silver;
+ }
+ ul#navigation li {
+ list-style: none;
+ margin: 0; padding: 0.2em;
+ }
+ ul#navigation a {
+ display: block;
+ padding: 0.2em;
+ font-weight: bold;
+ }
+ ul#navigation a:link {
+ color: black; background-color: #eee;
+ }
+ ul#navigation a:visited {
+ color: #666; background-color: #eee;
+ }
+ ul#navigation a:hover {
+ color: red; background-color: white;
+ }
+ ul#navigation a:active {
+ color: white; background-color: gray;
+ }
+
+ div#content {
+ margin: 0 1em 1em 16em;
+ padding: 0 1em;
+ }
+ * html div#content {
+ height: 1em; /* Workaround 3-Pixel-Bug of Internet Explorers */
+ }
+ div#content h2 {
+ font-size:100%;
+ font-weight:bold;
+ background: #525D76;
+ color: white;
+ text-decoration: none;
+ padding: 5px;
+ margin-right: 2px;
+ margin-left: 2px;
+ margin-bottom: 0;
+ }
+ div#content p {
+ font-size: 1em;
+ margin: 1em 0;
+ }
+ table {
+ width:100%;
+ border-collapse:collapse;
+ }
+ table td, table th {
+ border:1px solid #000;
+ padding:3px 7px 2px 7px;
+ }
+ table th {
+ font-weight:bold;
+ background: #ccc;
+ color: black;
+ }
+ table tr:nth-child(odd) td {
+ background: #efefef;
+ }
+ table tr:nth-child(even) td {
+ background: #fff;
+ }
+ </xsl:template>
+
+
+
+ <!--
+ Generates the JavaScript for the dynamic style.
+ Generated so this XSL is the single source of the whole report.
+ -->
+ <xsl:template name="switch.js">
+ /*
+ * Hides all "hideable" div-containers
+ */
+ function hideAll() {
+ allElements = document.getElementsByTagName("div");
+ for (i = 0; i <xsl:text disable-output-escaping="yes">&lt;</xsl:text> allElements.length; i++) {
+ if (allElements[i].className=="hideable") {
+ allElements[i].style.display="none";
+ }
+ }
+ return;
+ }
+
+ /*
+ * Shows one div-container and hides the other.
+ * @param id id of the element to show
+ */
+ function change(id) {
+ hideAll();
+ e = document.getElementById(id);
+ if (e.style.display=="none") {
+ e.style.display="";
+ }
+ window.scrollTo(0, 0);
+ return;
+ }
+
+ /*
+ * Shows only the first data row.
+ * Used in body:onload so the user could directly see some messages.
+ */
+ function openFirst() {
+ hideAll();
+ for (i = 0; i <xsl:text disable-output-escaping="yes">&lt;</xsl:text> allElements.length; i++) {
+ if (allElements[i].className=="hideable") {
+ allElements[i].style.display="";
+ return;
+ }
+ }
+ return;
+ }
+ </xsl:template>
+
+
+
+ <!--
+ Calculates the index of the last occurence of a substring in a string.
+ @param txt the whole string in which to search
+ @delimiter the substring to search
+ -->
+ <xsl:template name="last-index-of">
+ <xsl:param name="txt"/>
+ <xsl:param name="remainder" select="$txt"/>
+ <xsl:param name="delimiter" select="' '"/>
+
+ <xsl:choose>
+ <xsl:when test="contains($remainder, $delimiter)">
+ <xsl:call-template name="last-index-of">
+ <xsl:with-param name="txt" select="$txt"/>
+ <xsl:with-param name="remainder" select="substring-after($remainder, $delimiter)"/>
+ <xsl:with-param name="delimiter" select="$delimiter"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="lastIndex" select="string-length(substring($txt, 1, string-length($txt)-string-length($remainder)))+1"/>
+ <xsl:choose>
+ <xsl:when test="string-length($remainder)=0">
+ <xsl:value-of select="string-length($txt)"/>
+ </xsl:when>
+ <xsl:when test="$lastIndex>0">
+ <xsl:value-of select="($lastIndex - string-length($delimiter))"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="0"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/love2dToAPK/tools/tools/ant/etc/checkstyle/checkstyle-frames.xsl b/love2dToAPK/tools/tools/ant/etc/checkstyle/checkstyle-frames.xsl
new file mode 100644
index 0000000..c79c0b7
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/etc/checkstyle/checkstyle-frames.xsl
@@ -0,0 +1,299 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:lxslt="http://xml.apache.org/xslt"
+ xmlns:redirect="http://xml.apache.org/xalan/redirect"
+ extension-element-prefixes="redirect">
+
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+-->
+
+ <xsl:output method="html" indent="yes" encoding="US-ASCII"/>
+ <xsl:decimal-format decimal-separator="." grouping-separator="," />
+
+ <xsl:param name="output.dir" select="'.'"/>
+ <xsl:param name="basedir" select="'.'"/>
+
+ <xsl:template match="checkstyle">
+ <!-- create the index.html -->
+ <redirect:write file="{$output.dir}/index.html">
+ <xsl:call-template name="index.html"/>
+ </redirect:write>
+
+ <!-- create the stylesheet.css -->
+ <redirect:write file="{$output.dir}/stylesheet.css">
+ <xsl:call-template name="stylesheet.css"/>
+ </redirect:write>
+
+ <!-- create the overview-summary.html at the root -->
+ <redirect:write file="{$output.dir}/overview-frame.html">
+ <xsl:apply-templates select="." mode="overview"/>
+ </redirect:write>
+
+ <!-- create the all-classes.html at the root -->
+ <redirect:write file="{$output.dir}/allclasses-frame.html">
+ <xsl:apply-templates select="." mode="all.classes"/>
+ </redirect:write>
+
+ <!-- process all files -->
+ <xsl:apply-templates select="file[count(error) != 0]"/>
+ </xsl:template>
+
+ <xsl:template name="index.html">
+ <html>
+ <head>
+ <title>CheckStyle Audit</title>
+ </head>
+ <frameset cols="20%,80%">
+ <frame src="allclasses-frame.html" name="fileListFrame"/>
+ <frame src="overview-frame.html" name="fileFrame"/>
+ </frameset>
+ <noframes>
+ <h2>Frame Alert</h2>
+ <p>
+ This document is designed to be viewed using the frames feature.
+ If you see this message, you are using a non-frame-capable web client.
+ </p>
+ </noframes>
+ </html>
+ </xsl:template>
+
+ <xsl:template name="pageHeader">
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr>
+ <td class="text-align:right"><h2>CheckStyle Audit</h2></td>
+ </tr>
+ <tr>
+ <td class="text-align:right">Designed for use with
+ <a href='http://checkstyle.sourceforge.net/'>CheckStyle</a> and
+ <a href='http://ant.apache.org/'>Ant</a>.</td>
+ </tr>
+ </table>
+ <hr size="1"/>
+ </xsl:template>
+
+ <xsl:template match="checkstyle" mode="overview">
+ <html>
+ <head>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css"/>
+ </head>
+ <body>
+ <!-- page header -->
+ <xsl:call-template name="pageHeader"/>
+
+ <!-- Summary part -->
+ <xsl:apply-templates select="." mode="summary"/>
+ <hr size="1" width="100%" align="left"/>
+
+ <!-- File list part -->
+ <xsl:apply-templates select="." mode="filelist"/>
+ </body>
+ </html>
+ </xsl:template>
+
+ <xsl:template name="stylesheet.css">
+ .bannercell {
+ border: 0px;
+ padding: 0px;
+ }
+ body {
+ margin-left: 10;
+ margin-right: 10;
+ font:normal 80% arial,helvetica,sanserif;
+ background-color:#FFFFFF;
+ color:#000000;
+ }
+ .oddrow td {
+ background: #efefef;
+ }
+ .evenrow td {
+ background: #fff;
+ }
+ th, td {
+ text-align: left;
+ vertical-align: top;
+ }
+ th {
+ font-weight:bold;
+ background: #ccc;
+ color: black;
+ }
+ table, th, td {
+ font-size:100%;
+ border: none
+ }
+ table.log tr td, tr th {
+
+ }
+ h2 {
+ font-weight:bold;
+ font-size:140%;
+ margin-bottom: 5;
+ }
+ h3 {
+ font-size:100%;
+ font-weight:bold;
+ background: #525D76;
+ color: white;
+ text-decoration: none;
+ padding: 5px;
+ margin-right: 2px;
+ margin-left: 2px;
+ margin-bottom: 0;
+ }
+ </xsl:template>
+
+ <!--
+ Creates an all-classes.html file that contains a link to all files.
+ -->
+ <xsl:template match="checkstyle" mode="all.classes">
+ <html>
+ <head>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css"/>
+ </head>
+ <body>
+ <h2>Files</h2>
+ <p>
+ <table width="100%">
+ <!-- For each file create its part -->
+ <xsl:apply-templates select="file[count(error) != 0]" mode="all.classes">
+ <xsl:sort select="substring-after(@name, $basedir)"/>
+ </xsl:apply-templates>
+ </table>
+ </p>
+ </body>
+ </html>
+ </xsl:template>
+
+ <xsl:template match="checkstyle" mode="filelist">
+ <h3>Files</h3>
+ <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%">
+ <tr>
+ <th>Name</th>
+ <th>Errors</th>
+ </tr>
+ <xsl:apply-templates select="file[count(error) != 0]" mode="filelist">
+ <xsl:sort select="count(error)" order="descending" data-type="number"/>
+ </xsl:apply-templates>
+ </table>
+ </xsl:template>
+
+ <xsl:template match="file" mode="filelist">
+ <tr>
+ <xsl:call-template name="alternated-row"/>
+ <td nowrap="nowrap">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:text>files/</xsl:text><xsl:value-of select="substring-after(@name, $basedir)"/><xsl:text>.html</xsl:text>
+ </xsl:attribute>
+ <xsl:value-of select="substring-after(@name, $basedir)"/>
+ </a>
+ </td>
+ <td><xsl:value-of select="count(error)"/></td>
+ </tr>
+ </xsl:template>
+
+ <xsl:template match="file" mode="all.classes">
+ <tr>
+ <td nowrap="nowrap">
+ <a target="fileFrame">
+ <xsl:attribute name="href">
+ <xsl:text>files/</xsl:text><xsl:value-of select="substring-after(@name, $basedir)"/><xsl:text>.html</xsl:text>
+ </xsl:attribute>
+ <xsl:value-of select="substring-after(@name, $basedir)"/>
+ </a>
+ </td>
+ </tr>
+ </xsl:template>
+
+ <!--
+ transform string like a/b/c to ../../../
+ @param path the path to transform into a descending directory path
+ -->
+ <xsl:template name="path">
+ <xsl:param name="path"/>
+
+ <!-- Convert a windows path '\' to a unix path '/' for further processing. -->
+ <xsl:variable name="path2" select="translate($path,'\','/')"/>
+
+
+ <xsl:if test="contains($path2,'/')">
+ <xsl:text>../</xsl:text>
+ <xsl:call-template name="path">
+ <xsl:with-param name="path"><xsl:value-of select="substring-after($path2,'/')"/></xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="not(contains($path2,'/')) and not($path2 = '')">
+ <xsl:text>../</xsl:text>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="file">
+ <redirect:write file="{$output.dir}/files/{substring-after(@name, $basedir)}.html">
+ <html>
+ <head>
+ <link rel="stylesheet" type="text/css">
+ <xsl:attribute name="href"><xsl:call-template name="path"><xsl:with-param name="path" select="substring-after(@name, $basedir)"/></xsl:call-template><xsl:text>stylesheet.css</xsl:text></xsl:attribute>
+ </link>
+ </head>
+ <body>
+ <xsl:call-template name="pageHeader"/>
+ <h3>File <xsl:value-of select="substring-after(@name, $basedir)"/></h3>
+ <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%">
+ <tr>
+ <th>Error Description</th>
+ <th>Line:Column</th>
+ </tr>
+ <xsl:for-each select="error">
+ <tr>
+ <xsl:call-template name="alternated-row"/>
+ <td><a title="{@source}"><xsl:value-of select="@message"/></a></td>
+ <td align="center"><xsl:value-of select="@line"/><xsl:if test="@column">:<xsl:value-of select="@column"/></xsl:if></td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </body>
+ </html>
+ </redirect:write>
+ </xsl:template>
+
+ <xsl:template match="checkstyle" mode="summary">
+ <h3>Summary</h3>
+ <xsl:variable name="fileCount" select="count(file)"/>
+ <xsl:variable name="errorCount" select="count(file/error)"/>
+ <xsl:variable name="fileErrorCount" select="count(file[count(error) != 0])"/>
+ <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%">
+ <tr>
+ <th>Total Files</th>
+ <th>Files With Errors</th>
+ <th>Errors</th>
+ </tr>
+ <tr>
+ <xsl:call-template name="alternated-row"/>
+ <td><xsl:value-of select="$fileCount"/></td>
+ <td><xsl:value-of select="$fileErrorCount"/></td>
+ <td><xsl:value-of select="$errorCount"/></td>
+ </tr>
+ </table>
+ </xsl:template>
+
+ <xsl:template name="alternated-row">
+ <xsl:attribute name="class">
+ <xsl:if test="position() mod 2 = 1">oddrow</xsl:if>
+ <xsl:if test="position() mod 2 = 0">evenrow</xsl:if>
+ </xsl:attribute>
+ </xsl:template>
+</xsl:stylesheet> \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/ant/etc/checkstyle/checkstyle-text.xsl b/love2dToAPK/tools/tools/ant/etc/checkstyle/checkstyle-text.xsl
new file mode 100644
index 0000000..7359e41
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/etc/checkstyle/checkstyle-text.xsl
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+-->
+
+ <xsl:strip-space elements="checkstyle"/>
+ <xsl:preserve-space elements="file"/>
+ <xsl:output method="text"/>
+ <xsl:template match="checkstyle/file/error">
+ <xsl:value-of select="../@name"/>
+ <xsl:text>:</xsl:text>
+ <xsl:value-of select="@line"/>
+ <xsl:text>:</xsl:text>
+ <xsl:value-of select="@column"/>
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="@message"/>
+ </xsl:template>
+</xsl:stylesheet>
+
diff --git a/love2dToAPK/tools/tools/ant/etc/checkstyle/checkstyle-xdoc.xsl b/love2dToAPK/tools/tools/ant/etc/checkstyle/checkstyle-xdoc.xsl
new file mode 100644
index 0000000..5fc6eab
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/etc/checkstyle/checkstyle-xdoc.xsl
@@ -0,0 +1,130 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:lxslt="http://xml.apache.org/xslt"
+ xmlns:redirect="org.apache.xalan.lib.Redirect"
+ extension-element-prefixes="redirect">
+
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+-->
+
+ <xsl:output method="xml" indent="yes"/>
+ <xsl:decimal-format decimal-separator="." grouping-separator="," />
+
+ <xsl:param name="output.dir" select="'.'"/>
+ <xsl:param name="basedir" select="'.'"/>
+
+ <xsl:template match="checkstyle">
+ <document>
+ <properties>
+ <title>Checkstyle Audit</title>
+ </properties>
+
+ <body>
+ <xsl:apply-templates select="." mode="summary"/>
+ <!-- File list part -->
+ <xsl:apply-templates select="." mode="filelist"/>
+ <xsl:apply-templates select="file[count(error) != 0]"/>
+ </body>
+ </document>
+ </xsl:template>
+
+ <xsl:template match="checkstyle" mode="filelist">
+ <section name="Files">
+ <table>
+ <tr>
+ <th>Name</th>
+ <th>Errors</th>
+ </tr>
+ <xsl:apply-templates select="file[count(error) != 0]" mode="filelist">
+ <xsl:sort select="count(error)" order="descending" data-type="number"/>
+ </xsl:apply-templates>
+ </table>
+ </section>
+ </xsl:template>
+
+ <xsl:template match="file" mode="filelist">
+ <tr>
+ <xsl:call-template name="alternated-row"/>
+ <td nowrap="nowrap">
+ <a>
+ <xsl:attribute name="href">
+ <xsl:text>files</xsl:text><xsl:value-of select="substring-after(@name, $basedir)"/><xsl:text>.html</xsl:text>
+ </xsl:attribute>
+ <xsl:value-of select="substring-after(@name, $basedir)"/>
+ </a>
+ </td>
+ <td><xsl:value-of select="count(error)"/></td>
+ </tr>
+ </xsl:template>
+
+ <xsl:template match="file">
+ <redirect:write file="{$output.dir}/files{substring-after(@name, $basedir)}.xml">
+ <document>
+ <properties>
+ <title>Checkstyle Audit</title>
+ </properties>
+
+ <body>
+ <section name="Details for {substring-after(@name, $basedir)}">
+ <table>
+ <tr>
+ <th>Error Description</th>
+ <th>Line</th>
+ </tr>
+ <xsl:for-each select="error">
+ <tr>
+ <xsl:call-template name="alternated-row"/>
+ <td><a title="{@source}"><xsl:value-of select="@message"/></a></td>
+ <td><xsl:value-of select="@line"/></td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </section>
+ </body>
+ </document>
+ </redirect:write>
+ </xsl:template>
+
+ <xsl:template match="checkstyle" mode="summary">
+ <section name="Summary">
+ <xsl:variable name="fileCount" select="count(file)"/>
+ <xsl:variable name="errorCount" select="count(file/error)"/>
+ <xsl:variable name="fileErrorCount" select="count(file[count(error) != 0])"/>
+ <table>
+ <tr>
+ <th>Files</th>
+ <th>Files With Errors</th>
+ <th>Errors</th>
+ </tr>
+ <tr>
+ <xsl:call-template name="alternated-row"/>
+ <td><xsl:value-of select="$fileCount"/></td>
+ <td><xsl:value-of select="$fileErrorCount"/></td>
+ <td><xsl:value-of select="$errorCount"/></td>
+ </tr>
+ </table>
+ </section>
+ </xsl:template>
+
+ <xsl:template name="alternated-row">
+ <xsl:attribute name="class">
+ <xsl:if test="position() mod 2 = 1">oddrow</xsl:if>
+ <xsl:if test="position() mod 2 = 0">evenrow</xsl:if>
+ </xsl:attribute>
+ </xsl:template>
+</xsl:stylesheet>
+
diff --git a/love2dToAPK/tools/tools/ant/etc/coverage-frames.xsl b/love2dToAPK/tools/tools/ant/etc/coverage-frames.xsl
new file mode 100644
index 0000000..9603597
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/etc/coverage-frames.xsl
@@ -0,0 +1,487 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:lxslt="http://xml.apache.org/xslt"
+ xmlns:redirect="org.apache.xalan.lib.Redirect"
+ extension-element-prefixes="redirect">
+<xsl:output method="html" indent="yes"/>
+<xsl:decimal-format decimal-separator="." grouping-separator="," />
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+-->
+
+<!--
+
+ Sample stylesheet to be used with JProbe 3.0 XML output.
+
+ It creates a set of HTML files a la javadoc where you can browse easily
+ through all packages and classes.
+
+ It is best used with JProbe Coverage Ant task that gives you the benefit
+ of a reference classpath so that you have the list of classes/methods
+ that are not used at all in a given classpath.
+
+-->
+
+<!-- default output directory is current directory -->
+<xsl:param name="output.dir" select="'.'"/>
+
+<!-- ======================================================================
+ Root element
+ ======================================================================= -->
+<xsl:template match="/snapshot">
+ <!-- create the index.html -->
+ <redirect:write file="{$output.dir}/index.html">
+ <xsl:call-template name="index.html"/>
+ </redirect:write>
+
+ <!-- create the stylesheet.css -->
+ <redirect:write file="{$output.dir}/stylesheet.css">
+ <xsl:call-template name="stylesheet.css"/>
+ </redirect:write>
+
+ <!-- create the overview-packages.html at the root -->
+ <redirect:write file="{$output.dir}/overview-summary.html">
+ <xsl:apply-templates select="." mode="overview.packages"/>
+ </redirect:write>
+
+ <!-- create the all-packages.html at the root -->
+ <redirect:write file="{$output.dir}/overview-frame.html">
+ <xsl:apply-templates select="." mode="all.packages"/>
+ </redirect:write>
+
+ <!-- create the all-classes.html at the root -->
+ <redirect:write file="{$output.dir}/allclasses-frame.html">
+ <xsl:apply-templates select="." mode="all.classes"/>
+ </redirect:write>
+
+ <!-- process all packages -->
+ <xsl:apply-templates select="./package" mode="write"/>
+</xsl:template>
+
+<!-- =======================================================================
+ Frameset definition. Entry point for the report.
+ 3 frames: packageListFrame, classListFrame, classFrame
+ ======================================================================= -->
+<xsl:template name="index.html">
+<html>
+ <head><title>Coverage Results.</title></head>
+ <frameset cols="20%,80%">
+ <frameset rows="30%,70%">
+ <frame src="overview-frame.html" name="packageListFrame"/>
+ <frame src="allclasses-frame.html" name="classListFrame"/>
+ </frameset>
+ <frame src="overview-summary.html" name="classFrame"/>
+ </frameset>
+ <noframes>
+ <h2>Frame Alert</h2>
+ <p>
+ This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
+ </p>
+ </noframes>
+</html>
+</xsl:template>
+
+<!-- =======================================================================
+ Stylesheet CSS used
+ ======================================================================= -->
+<!-- this is the stylesheet css to use for nearly everything -->
+<xsl:template name="stylesheet.css">
+ .bannercell {
+ border: 0px;
+ padding: 0px;
+ }
+ body {
+ margin-left: 10;
+ margin-right: 10;
+ font:normal 80% arial,helvetica,sanserif;
+ background-color:#FFFFFF;
+ color:#000000;
+ }
+ .a td {
+ background: #efefef;
+ }
+ .b td {
+ background: #fff;
+ }
+ th, td {
+ text-align: left;
+ vertical-align: top;
+ }
+ th {
+ font-weight:bold;
+ background: #ccc;
+ color: black;
+ }
+ table, th, td {
+ font-size:100%;
+ border: none
+ }
+ table.log tr td, tr th {
+
+ }
+ h2 {
+ font-weight:bold;
+ font-size:140%;
+ margin-bottom: 5;
+ }
+ h3 {
+ font-size:100%;
+ font-weight:bold;
+ background: #525D76;
+ color: white;
+ text-decoration: none;
+ padding: 5px;
+ margin-right: 2px;
+ margin-left: 2px;
+ margin-bottom: 0;
+ }
+</xsl:template>
+
+<!-- =======================================================================
+ List of all classes in all packages
+ This will be the first page in the classListFrame
+ ======================================================================= -->
+<xsl:template match="snapshot" mode="all.classes">
+ <html>
+ <head>
+ <xsl:call-template name="create.stylesheet.link"/>
+ </head>
+ <body>
+ <h2>Classes</h2>
+ <table width="100%">
+ <xsl:for-each select="package/class">
+ <xsl:sort select="@name"/>
+ <xsl:variable name="package.name" select="(ancestor::package)[last()]/@name"/>
+ <xsl:variable name="link">
+ <xsl:if test="not($package.name='')">
+ <xsl:value-of select="translate($package.name,'.','/')"/><xsl:text>/</xsl:text>
+ </xsl:if><xsl:value-of select="@name"/><xsl:text>.html</xsl:text>
+ </xsl:variable>
+ <tr>
+ <td nowrap="nowrap">
+ <a target="classFrame" href="{$link}"><xsl:value-of select="@name"/></a>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </body>
+ </html>
+</xsl:template>
+
+<!-- list of all packages -->
+<xsl:template match="snapshot" mode="all.packages">
+ <html>
+ <head>
+ <xsl:call-template name="create.stylesheet.link"/>
+ </head>
+ <body>
+ <h2><a href="overview-summary.html" target="classFrame">Home</a></h2>
+ <h2>Packages</h2>
+ <table width="100%">
+ <xsl:for-each select="package">
+ <xsl:sort select="@name" order="ascending"/>
+ <tr>
+ <td nowrap="nowrap">
+ <a href="{translate(@name,'.','/')}/package-summary.html" target="classFrame">
+ <xsl:value-of select="@name"/>
+ </a>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </body>
+ </html>
+</xsl:template>
+
+<!-- overview of statistics in packages -->
+<xsl:template match="snapshot" mode="overview.packages">
+ <html>
+ <head>
+ <xsl:call-template name="create.stylesheet.link"/>
+ </head>
+ <body onload="open('allclasses-frame.html','classListFrame')">
+ <xsl:call-template name="pageHeader"/>
+ <h3>Summary</h3>
+ <table class="log" cellpadding="5" cellspacing="2" width="100%">
+ <tr>
+ <!--th width="10%" nowrap="nowrap">Date</th>
+ <th width="10%" nowrap="nowrap">Elapsed time</th-->
+ <th width="10%" nowrap="nowrap">Reported Classes</th>
+ <th width="10%" nowrap="nowrap">Methods Hit</th>
+ <th width="10%" nowrap="nowrap">Lines Hit</th>
+ </tr>
+ <tr class="a">
+ <!--td nowrap="nowrap"><xsl:value-of select="execution_log/@program_start"/></td>
+ <td><xsl:value-of select="format-number(execution_log/@elapsed_time div 1000,'0.0')"/>secs</td-->
+ <td><xsl:value-of select="count(package/class)"/></td>
+ <td><xsl:value-of select="format-number(cov.data/@hit_methods div cov.data/@total_methods,'0.0%')"/></td>
+ <td><xsl:value-of select="format-number(cov.data/@hit_lines div cov.data/@total_lines,'0.0%')"/></td>
+ </tr>
+ </table>
+ <table border="0" width="100%">
+ <tr>
+ <td style="text-align: justify;">
+ To ensure accurate test runs on Java applications, developers need to know how much of
+ the code has been tested, and where to find any untested code. Coverage helps you
+ locate untested code, and measure precisely how much code has been exercised.
+ The result is a higher quality application in a shorter period of time.
+ <p/>
+ </td>
+ </tr>
+ </table>
+
+ <h3>Packages</h3>
+ <table class="log" cellpadding="5" cellspacing="2" width="100%">
+ <xsl:apply-templates select="package[1]" mode="stats.header"/>
+ <!-- display packages and sort them via their coverage rate -->
+ <xsl:for-each select="package">
+ <xsl:sort data-type="number" select="cov.data/@hit_lines div cov.data/@total_lines"/>
+ <tr>
+ <xsl:call-template name="alternate-row"/>
+ <td><a href="{translate(@name,'.','/')}/package-summary.html"><xsl:value-of select="@name"/></a></td>
+ <td><xsl:value-of select="format-number(cov.data/@hit_methods div cov.data/@total_methods,'0.0%')"/></td>
+ <td><xsl:value-of select="format-number(cov.data/@hit_lines div cov.data/@total_lines,'0.0%')"/></td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ <xsl:call-template name="pageFooter"/>
+ </body>
+ </html>
+</xsl:template>
+
+<!--
+ detailed info for a package. It will output the list of classes
+, the summary page, and the info for each class
+-->
+<xsl:template match="package" mode="write">
+ <xsl:variable name="package.dir">
+ <xsl:if test="not(@name = '')"><xsl:value-of select="translate(@name,'.','/')"/></xsl:if>
+ <xsl:if test="@name = ''">.</xsl:if>
+ </xsl:variable>
+
+ <!-- create a classes-list.html in the package directory -->
+ <redirect:write file="{$output.dir}/{$package.dir}/package-frame.html">
+ <xsl:apply-templates select="." mode="classes.list"/>
+ </redirect:write>
+
+ <!-- create a package-summary.html in the package directory -->
+ <redirect:write file="{$output.dir}/{$package.dir}/package-summary.html">
+ <xsl:apply-templates select="." mode="package.summary"/>
+ </redirect:write>
+
+ <!-- for each class, creates a @name.html -->
+ <xsl:for-each select="class">
+ <redirect:write file="{$output.dir}/{$package.dir}/{@name}.html">
+ <xsl:apply-templates select="." mode="class.details"/>
+ </redirect:write>
+ </xsl:for-each>
+</xsl:template>
+
+<!-- list of classes in a package -->
+<xsl:template match="package" mode="classes.list">
+ <html>
+ <HEAD>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name" select="@name"/>
+ </xsl:call-template>
+ </HEAD>
+ <BODY>
+ <table width="100%">
+ <tr>
+ <td nowrap="nowrap">
+ <H2><a href="package-summary.html" target="classFrame"><xsl:value-of select="@name"/></a></H2>
+ </td>
+ </tr>
+ </table>
+
+ <H2>Classes</H2>
+ <TABLE WIDTH="100%">
+ <xsl:for-each select="class">
+ <xsl:sort select="@name"/>
+ <tr>
+ <td nowrap="nowrap">
+ <a href="{@name}.html" target="classFrame"><xsl:value-of select="@name"/></a>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </TABLE>
+ </BODY>
+ </html>
+</xsl:template>
+
+<!-- summary of a package -->
+<xsl:template match="package" mode="package.summary">
+ <HTML>
+ <HEAD>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name" select="@name"/>
+ </xsl:call-template>
+ </HEAD>
+ <!-- when loading this package, it will open the classes into the frame -->
+ <BODY onload="open('package-frame.html','classListFrame')">
+ <xsl:call-template name="pageHeader"/>
+ <h3>Package <xsl:value-of select="@name"/></h3>
+ <table class="log" cellpadding="5" cellspacing="2" width="100%">
+ <xsl:apply-templates select="." mode="stats.header"/>
+ <xsl:apply-templates select="." mode="stats"/>
+ </table>
+
+ <xsl:if test="count(class) &gt; 0">
+ <H3>Classes</H3>
+ <table class="log" cellpadding="5" cellspacing="2" width="100%">
+ <xsl:apply-templates select="." mode="stats.header"/>
+ <xsl:apply-templates select="class" mode="stats">
+ <xsl:sort data-type="number" select="cov.data/@hit_lines div cov.data/@total_lines"/>
+ </xsl:apply-templates>
+ </table>
+ </xsl:if>
+ <xsl:call-template name="pageFooter"/>
+ </BODY>
+ </HTML>
+</xsl:template>
+
+<!-- details of a class -->
+<xsl:template match="class" mode="class.details">
+ <xsl:variable name="package.name" select="(ancestor::package)[last()]/@name"/>
+ <HTML>
+ <HEAD>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name" select="$package.name"/>
+ </xsl:call-template>
+ </HEAD>
+ <BODY>
+ <xsl:call-template name="pageHeader"/>
+ <H3>Class <xsl:if test="not($package.name = '')"><xsl:value-of select="$package.name"/>.</xsl:if><xsl:value-of select="@name"/></H3>
+
+ <!-- class summary -->
+ <table class="log" cellpadding="5" cellspacing="2" width="100%">
+ <xsl:apply-templates select="." mode="stats.header"/>
+ <xsl:apply-templates select="." mode="stats"/>
+ </table>
+
+ <!-- details of methods -->
+ <H3>Methods</H3>
+ <table class="log" cellpadding="5" cellspacing="2" width="100%">
+ <xsl:apply-templates select="method[1]" mode="stats.header"/>
+ <xsl:apply-templates select="method" mode="stats">
+ <xsl:sort data-type="number" select="cov.data/@hit_lines div cov.data/@total_lines"/>
+ </xsl:apply-templates>
+ </table>
+ <xsl:call-template name="pageFooter"/>
+ </BODY>
+ </HTML>
+
+</xsl:template>
+
+<!-- Page Header -->
+<xsl:template name="pageHeader">
+ <!-- jakarta logo -->
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr>
+ <td class="bannercell" rowspan="2">
+ <a href="http://jakarta.apache.org/">
+ <img src="http://jakarta.apache.org/images/jakarta-logo.gif" alt="http://jakarta.apache.org" align="left" border="0"/>
+ </a>
+ </td>
+ <td style="text-align:right"><h2>Source Code Coverage</h2></td>
+ </tr>
+ <tr>
+ <td style="text-align:right">Designed for use with <a href='http://www.sitraka.com/jprobe'>Sitraka JProbe</a> and <a href='http://jakarta.apache.org'>Ant</a>.</td>
+ </tr>
+ </table>
+ <hr size="1"/>
+</xsl:template>
+
+<!-- Page Footer -->
+<xsl:template name="pageFooter">
+</xsl:template>
+
+
+<xsl:template name="table.header">
+ <tr>
+ <th width="80%">Name</th>
+ <th width="10%" nowrap="nowrap">Methods Hit</th>
+ <th width="10%" nowrap="nowrap">Lines Hit</th>
+ </tr>
+</xsl:template>
+
+<xsl:template match="method" mode="stats.header">
+ <tr>
+ <th width="90%">Name</th>
+ <th width="10%" nowrap="nowrap">Lines Hit</th>
+ </tr>
+</xsl:template>
+<xsl:template match="method" mode="stats">
+ <tr>
+ <xsl:call-template name="alternate-row"/>
+ <td><xsl:value-of select="@name"/></td>
+ <td>
+ <xsl:value-of select="format-number(cov.data/@hit_lines div cov.data/@total_lines,'0.0%')"/>
+ </td>
+ </tr>
+</xsl:template>
+
+<xsl:template match="package|class" mode="stats.header">
+ <tr>
+ <th width="80%">Name</th>
+ <th width="10%" nowrap="nowrap">Methods Hit</th>
+ <th width="10%" nowrap="nowrap">Lines Hit</th>
+ </tr>
+</xsl:template>
+<xsl:template match="package|class" mode="stats">
+ <tr>
+ <xsl:call-template name="alternate-row"/>
+ <td><xsl:value-of select="@name"/></td>
+ <td><xsl:value-of select="format-number(cov.data/@hit_methods div cov.data/@total_methods,'0.0%')"/></td>
+ <td><xsl:value-of select="format-number(cov.data/@hit_lines div cov.data/@total_lines,'0.0%')"/></td>
+ </tr>
+</xsl:template>
+
+<!--
+ transform string like a.b.c to ../../../
+ @param path the path to transform into a descending directory path
+-->
+<xsl:template name="path">
+ <xsl:param name="path"/>
+ <xsl:if test="contains($path,'.')">
+ <xsl:text>../</xsl:text>
+ <xsl:call-template name="path">
+ <xsl:with-param name="path"><xsl:value-of select="substring-after($path,'.')"/></xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="not(contains($path,'.')) and not($path = '')">
+ <xsl:text>../</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+
+<!-- create the link to the stylesheet based on the package name -->
+<xsl:template name="create.stylesheet.link">
+ <xsl:param name="package.name"/>
+ <LINK REL ="stylesheet" TYPE="text/css" TITLE="Style"><xsl:attribute name="href"><xsl:if test="not($package.name = 'unnamed package')"><xsl:call-template name="path"><xsl:with-param name="path" select="$package.name"/></xsl:call-template></xsl:if>stylesheet.css</xsl:attribute></LINK>
+</xsl:template>
+
+<!-- alternated row style -->
+<xsl:template name="alternate-row">
+<xsl:attribute name="class">
+ <xsl:if test="position() mod 2 = 1">a</xsl:if>
+ <xsl:if test="position() mod 2 = 0">b</xsl:if>
+</xsl:attribute>
+</xsl:template>
+
+</xsl:stylesheet>
+
+
diff --git a/love2dToAPK/tools/tools/ant/etc/jdepend-frames.xsl b/love2dToAPK/tools/tools/ant/etc/jdepend-frames.xsl
new file mode 100644
index 0000000..8028734
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/etc/jdepend-frames.xsl
@@ -0,0 +1,485 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:lxslt="http://xml.apache.org/xslt"
+ xmlns:redirect="org.apache.xalan.lib.Redirect"
+ extension-element-prefixes="redirect">
+<xsl:output method="html" indent="yes" encoding="US-ASCII"/>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+
+-->
+<!--
+
+ Sample stylesheet to be used with JDepend XML output.
+
+ It creates a set of HTML files a la javadoc where you can browse easily
+ through all packages and classes.
+
+ -->
+<xsl:param name="output.dir" select="'.'"/>
+
+<xsl:template match="JDepend">
+ <!-- create the index.html -->
+ <redirect:write file="{$output.dir}/index.html">
+ <xsl:call-template name="index.html"/>
+ </redirect:write>
+
+ <!-- create the stylesheet.css -->
+ <redirect:write file="{$output.dir}/stylesheet.css">
+ <xsl:call-template name="stylesheet.css"/>
+ </redirect:write>
+
+ <!-- create the overview-packages.html at the root -->
+ <redirect:write file="{$output.dir}/overview-summary.html">
+ <xsl:apply-templates select="." mode="overview.packages"/>
+ </redirect:write>
+
+ <!-- create the overview-packages.html at the root -->
+ <redirect:write file="{$output.dir}/overview-packages.html">
+ <xsl:apply-templates select="." mode="packages.details"/>
+ </redirect:write>
+
+ <!-- create the overview-cycles.html at the root -->
+ <redirect:write file="{$output.dir}/overview-cycles.html">
+ <xsl:apply-templates select="." mode="cycles.details"/>
+ </redirect:write>
+
+ <!-- create the overview-cycles.html at the root -->
+ <redirect:write file="{$output.dir}/overview-explanations.html">
+ <xsl:apply-templates select="." mode="explanations"/>
+ </redirect:write>
+
+ <!-- create the all-packages.html at the root -->
+ <redirect:write file="{$output.dir}/all-packages.html">
+ <xsl:apply-templates select="Packages" mode="all.packages"/>
+ </redirect:write>
+
+ <!-- create the all-cycles.html at the root -->
+ <redirect:write file="{$output.dir}/all-cycles.html">
+ <xsl:apply-templates select="Cycles" mode="all.cycles"/>
+ </redirect:write>
+</xsl:template>
+
+
+<xsl:template name="index.html">
+<html>
+ <head>
+ <title>JDepend Analysis</title>
+ </head>
+ <frameset cols="20%,80%">
+ <frameset rows="30%,70%">
+ <frame src="all-packages.html" name="packageListFrame"/>
+ <frame src="all-cycles.html" name="classListFrame"/>
+ </frameset>
+ <frame src="overview-summary.html" name="classFrame"/>
+ </frameset>
+ <noframes>
+ <h2>Frame Alert</h2>
+ <p>
+ This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
+ </p>
+ </noframes>
+</html>
+</xsl:template>
+
+<!-- this is the stylesheet css to use for nearly everything -->
+<xsl:template name="stylesheet.css">
+ <style type="text/css">
+ body {
+ font:normal 68% verdana,arial,helvetica;
+ color:#000000;
+ }
+ table tr td, tr th {
+ font-size: 68%;
+ }
+ table.details tr th{
+ font-weight: bold;
+ text-align:left;
+ background:#a6caf0;
+ }
+ table.details tr td{
+ background:#eeeee0;
+ }
+
+ p {
+ line-height:1.5em;
+ margin-top:0.5em; margin-bottom:1.0em;
+ margin-left:2em;
+ margin-right:2em;
+ }
+ h1 {
+ margin: 0px 0px 5px; font: 165% verdana,arial,helvetica
+ }
+ h2 {
+ margin-top: 1em; margin-bottom: 0.5em; font: bold 125% verdana,arial,helvetica
+ }
+ h3 {
+ margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica
+ }
+ h4 {
+ margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
+ }
+ h5 {
+ margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
+ }
+ h6 {
+ margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
+ }
+ .Error {
+ font-weight:bold; color:red;
+ }
+ .Failure {
+ font-weight:bold; color:purple;
+ }
+ .Properties {
+ text-align:right;
+ }
+ </style>
+</xsl:template>
+
+<xsl:template match="JDepend" mode="overview.packages">
+ <html>
+ <head>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css"/>
+ </head>
+ <body>
+ <xsl:call-template name="pageHeader"/>
+ <table width="100%"><tr align="left"><h2>Summary</h2><td>
+ </td><td align="right">
+ [summary]
+ [<a href="overview-packages.html">packages</a>]
+ [<a href="overview-cycles.html">cycles</a>]
+ [<a href="overview-explanations.html">explanations</a>]
+ </td></tr></table>
+ <table width="100%" class="details">
+ <tr>
+ <th>Package</th>
+ <th>Total Classes</th>
+ <th><a href="overview-explanations.html#EXnumber">Abstract Classes</a></th>
+ <th><a href="overview-explanations.html#EXnumber">Concrete Classes</a></th>
+ <th><a href="overview-explanations.html#EXafferent">Afferent Couplings</a></th>
+ <th><a href="overview-explanations.html#EXefferent">Efferent Couplings</a></th>
+ <th><a href="overview-explanations.html#EXabstractness">Abstractness</a></th>
+ <th><a href="overview-explanations.html#EXinstability">Instability</a></th>
+ <th><a href="overview-explanations.html#EXdistance">Distance</a></th>
+
+ </tr>
+ <xsl:for-each select="./Packages/Package">
+ <xsl:if test="count(error) = 0">
+ <tr>
+ <td align="left">
+ <a>
+ <xsl:attribute name="href">overview-packages.html#PK<xsl:value-of select="@name"/>
+ </xsl:attribute>
+ <xsl:value-of select="@name"/>
+ </a>
+ </td>
+ <td align="right"><xsl:value-of select="Stats/TotalClasses"/></td>
+ <td align="right"><xsl:value-of select="Stats/AbstractClasses"/></td>
+ <td align="right"><xsl:value-of select="Stats/ConcreteClasses"/></td>
+ <td align="right"><xsl:value-of select="Stats/Ca"/></td>
+ <td align="right"><xsl:value-of select="Stats/Ce"/></td>
+ <td align="right"><xsl:value-of select="Stats/A"/></td>
+ <td align="right"><xsl:value-of select="Stats/I"/></td>
+ <td align="right"><xsl:value-of select="Stats/D"/></td>
+ </tr>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:for-each select="./Packages/Package">
+ <xsl:if test="count(error) &gt; 0">
+ <tr>
+ <td align="left">
+ <xsl:value-of select="@name"/>
+ </td>
+ <td align="left" colspan="8"><xsl:value-of select="error"/></td>
+ </tr>
+ </xsl:if>
+ </xsl:for-each>
+ </table>
+ </body>
+ </html>
+</xsl:template>
+
+<xsl:template match="JDepend" mode="packages.details">
+ <html>
+ <head>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css"/>
+ </head>
+ <body>
+ <xsl:call-template name="pageHeader"/>
+ <table width="100%"><tr align="left"><h2>Packages</h2><td>
+ </td><td align="right">
+ [<a href="overview-summary.html">summary</a>]
+ [packages]
+ [<a href="overview-cycles.html">cycles</a>]
+ [<a href="overview-explanations.html">explanations</a>]
+ </td></tr></table>
+
+ <xsl:for-each select="./Packages/Package">
+ <xsl:if test="count(error) = 0">
+ <h3><a><xsl:attribute name="name">PK<xsl:value-of select="@name"/></xsl:attribute>
+ <xsl:value-of select="@name"/></a></h3>
+
+ <table width="100%"><tr>
+ <td><a href="overview-explanations.html#EXafferent">Afferent Couplings</a>: <xsl:value-of select="Stats/Ca"/></td>
+ <td><a href="overview-explanations.html#EXefferent">Efferent Couplings</a>: <xsl:value-of select="Stats/Ce"/></td>
+ <td><a href="overview-explanations.html#EXabstractness">Abstractness</a>: <xsl:value-of select="Stats/A"/></td>
+ <td><a href="overview-explanations.html#EXinstability">Instability</a>: <xsl:value-of select="Stats/I"/></td>
+ <td><a href="overview-explanations.html#EXdistance">Distance</a>: <xsl:value-of select="Stats/D"/></td>
+ </tr></table>
+
+ <table width="100%" class="details">
+ <tr>
+ <th>Abstract Classes</th>
+ <th>Concrete Classes</th>
+ <th>Used by Packages</th>
+ <th>Uses Packages</th>
+ </tr>
+ <tr>
+ <td valign="top" width="25%">
+ <xsl:if test="count(AbstractClasses/Class)=0">
+ <i>None</i>
+ </xsl:if>
+ <xsl:for-each select="AbstractClasses/Class">
+ <xsl:value-of select="node()"/><br/>
+ </xsl:for-each>
+ </td>
+ <td valign="top" width="25%">
+ <xsl:if test="count(ConcreteClasses/Class)=0">
+ <i>None</i>
+ </xsl:if>
+ <xsl:for-each select="ConcreteClasses/Class">
+ <xsl:value-of select="node()"/><br/>
+ </xsl:for-each>
+ </td>
+ <td valign="top" width="25%">
+ <xsl:if test="count(UsedBy/Package)=0">
+ <i>None</i>
+ </xsl:if>
+ <xsl:for-each select="UsedBy/Package">
+ <a>
+ <xsl:attribute name="href">overview-packages.html#PK<xsl:value-of select="node()"/></xsl:attribute>
+ <xsl:value-of select="node()"/>
+ </a><br/>
+ </xsl:for-each>
+ </td>
+ <td valign="top" width="25%">
+ <xsl:if test="count(DependsUpon/Package)=0">
+ <i>None</i>
+ </xsl:if>
+ <xsl:for-each select="DependsUpon/Package">
+ <a>
+ <xsl:attribute name="href">overview-packages.html#PK<xsl:value-of select="node()"/></xsl:attribute>
+ <xsl:value-of select="node()"/>
+ </a><br/>
+ </xsl:for-each>
+ </td>
+ </tr>
+ </table>
+ </xsl:if>
+ </xsl:for-each>
+ <!-- this is often a long listing; provide a lower navigation table also -->
+ <table width="100%"><tr align="left"><td></td><td align="right">
+ [<a href="overview-summary.html">summary</a>]
+ [packages]
+ [<a href="overview-cycles.html">cycles</a>]
+ [<a href="overview-explanations.html">explanations</a>]
+ </td></tr></table>
+ </body>
+ </html>
+</xsl:template>
+
+<xsl:template match="JDepend" mode="cycles.details">
+ <html>
+ <head>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css"/>
+ </head>
+ <body>
+ <xsl:call-template name="pageHeader"/>
+ <table width="100%"><tr align="left"><h2>Cycles</h2><td>
+ </td><td align="right">
+ [<a href="overview-summary.html">summary</a>]
+ [<a href="overview-packages.html">packages</a>]
+ [cycles]
+ [<a href="overview-explanations.html">explanations</a>]
+ </td></tr></table>
+ <!--<table width="100%"><tr><td>
+ </td><td align="right">
+ [<a href="#NVsummary">summary</a>]
+ [<a href="#NVpackages">packages</a>]
+ [<a href="#NVcycles">cycles</a>]
+ [<a href="#NVexplanations">explanations</a>]
+ </td></tr></table> -->
+
+ <xsl:if test="count(Cycles/Package) = 0">
+ <p>There are no cyclic dependancies.</p>
+ </xsl:if>
+ <xsl:for-each select="Cycles/Package">
+ <h3><a><xsl:attribute name="name">#CY<xsl:value-of select="@Name"/></xsl:attribute><xsl:value-of select="@Name"/></a></h3><p>
+ <xsl:for-each select="Package">
+ <xsl:value-of select="."/><br/>
+ </xsl:for-each></p>
+ </xsl:for-each>
+ <!-- this is often a long listing; provide a lower navigation table also -->
+ <table width="100%"><tr align="left"><td></td><td align="right">
+ [<a href="overview-summary.html">summary</a>]
+ [<a href="overview-packages.html">packages</a>]
+ [cycles]
+ [<a href="overview-explanations.html">explanations</a>]
+ </td></tr></table>
+ </body>
+ </html>
+</xsl:template>
+
+<xsl:template match="JDepend" mode="explanations">
+ <html>
+ <head>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css"/>
+ </head>
+ <body>
+ <xsl:call-template name="pageHeader"/>
+
+ <table width="100%"><tr align="left"><h2>Explanations</h2><td>
+ </td><td align="right">
+ [<a href="overview-summary.html">summary</a>]
+ [<a href="overview-packages.html">packages</a>]
+ [<a href="overview-cycles.html">cycles</a>]
+ [explanations]
+ </td></tr></table>
+
+ <p>The following explanations are for quick reference and are lifted directly from the original <a href="http://www.clarkware.com/software/JDepend.html">JDepend documentation</a>.</p>
+
+ <h3><a name="EXnumber">Number of Classes</a></h3>
+ <p>The number of concrete and abstract classes (and interfaces) in the package is an indicator of the extensibility of the package.</p>
+ <h3><a name="EXafferent">Afferent Couplings</a></h3>
+ <p>The number of other packages that depend upon classes within the package is an indicator of the package's responsibility. </p>
+ <h3><a name="EXefferent">Efferent Couplings</a></h3>
+ <p>The number of other packages that the classes in the package depend upon is an indicator of the package's independence. </p>
+ <h3><a name="EXabstractness">Abstractness</a></h3>
+ <p>The ratio of the number of abstract classes (and interfaces) in the analyzed package to the total number of classes in the analyzed package. </p>
+ <p>The range for this metric is 0 to 1, with A=0 indicating a completely concrete package and A=1 indicating a completely abstract package. </p>
+ <h3><a name="EXinstability">Instability</a></h3>
+ <p>The ratio of efferent coupling (Ce) to total coupling (Ce / (Ce + Ca)). This metric is an indicator of the package's resilience to change. </p>
+ <p>The range for this metric is 0 to 1, with I=0 indicating a completely stable package and I=1 indicating a completely instable package. </p>
+ <h3><a name="EXdistance">Distance</a></h3>
+ <p>The perpendicular distance of a package from the idealized line A + I = 1. This metric is an indicator of the package's balance between abstractness and stability. </p>
+ <p>A package squarely on the main sequence is optimally balanced with respect to its abstractness and stability. Ideal packages are either completely abstract and stable (x=0, y=1) or completely concrete and instable (x=1, y=0). </p>
+ <p>The range for this metric is 0 to 1, with D=0 indicating a package that is coincident with the main sequence and D=1 indicating a package that is as far from the main sequence as possible. </p>
+
+ </body>
+ </html>
+</xsl:template>
+
+
+<!--
+Creates an html file that contains a link to all package links in overview-packages.html.
+ @bug there will be a problem here, I don't know yet how to handle unnamed package :(
+-->
+<xsl:template match="JDepend/Packages" mode="all.packages">
+ <html>
+ <head>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css"/>
+ </head>
+ <body>
+ <table width="100%"><tr align="left"><td></td><td nowrap="nowrap" align="right">
+ [<a href="overview-summary.html" target="classFrame">summary</a>]
+ [<a href="overview-packages.html" target="classFrame">packages</a>]
+ [<a href="overview-cycles.html" target="classFrame">cycles</a>]
+ [<a href="overview-explanations.html" target="classFrame">explanations</a>]
+ </td></tr></table>
+ <h2>Packages</h2>
+ <table width="100%">
+ <xsl:apply-templates select="Package[count(error)=0]" mode="all.packages.link">
+ <xsl:sort select="@name"/>
+ </xsl:apply-templates>
+ <xsl:apply-templates select="Package[count(error) &gt; 0]" mode="all.packages.nolink">
+ <xsl:sort select="@name"/>
+ </xsl:apply-templates>
+ </table>
+ </body>
+ </html>
+</xsl:template>
+
+<xsl:template match="JDepend/Packages/Package" mode="all.packages.link">
+ <tr>
+ <td nowrap="nowrap">
+ <a href="overview-packages.html#PK{@name}" target="classFrame">
+ <xsl:value-of select="@name"/>
+ </a>
+ </td>
+ </tr>
+</xsl:template>
+
+<!--
+I do not know JDepend enough to know if every error results in a non-analyzed package,
+but that is how I am presenting it to the viewer. This may need to change.
+ @bug there will be a problem here, I don't know yet how to handle unnamed package :(
+-->
+<xsl:template match="JDepend/Packages/Package" mode="all.packages.nolink">
+ <tr>
+ <td nowrap="nowrap">
+ Not Analyzed: <xsl:value-of select="@name"/>
+ </td>
+ </tr>
+</xsl:template>
+
+<!--
+Creates an html file that contains a link to all package links in overview-cycles.html.
+ @bug there will be a problem here, I don't know yet how to handle unnamed package :(
+-->
+<xsl:template match="JDepend/Cycles" mode="all.cycles">
+ <html>
+ <head>
+ <link rel="stylesheet" type="text/css" href="stylesheet.css"/>
+ </head>
+ <body>
+ <table width="100%"><tr align="left"><td></td><td nowrap="nowrap" align="right">
+ [<a href="overview-summary.html" target="classFrame">summary</a>]
+ [<a href="overview-packages.html" target="classFrame">packages</a>]
+ [<a href="overview-cycles.html" target="classFrame">cycles</a>]
+ [<a href="overview-explanations.html" target="classFrame">explanations</a>]
+ </td></tr></table>
+ <h2>Cycles</h2>
+ <table width="100%">
+ <xsl:apply-templates select="Package" mode="all.cycles">
+ <xsl:sort select="@Name"/>
+ </xsl:apply-templates>
+ </table>
+ </body>
+ </html>
+</xsl:template>
+
+<xsl:template match="JDepend/Cycles/Package" mode="all.cycles">
+ <tr>
+ <td nowrap="nowrap">
+ <a href="overview-cycles.html#CY{@Name}" target="classFrame"><xsl:value-of select="@Name"/></a>
+ </td>
+ </tr>
+</xsl:template>
+
+<!-- Page HEADER -->
+<xsl:template name="pageHeader">
+ <h1>JDepend Analysis</h1>
+ <table width="100%">
+ <tr>
+ <td align="left"></td>
+ <td align="right">Designed for use with <a href="http://www.clarkware.com/software/JDepend.html">JDepend</a> and <a href="http://jakarta.apache.org">Ant</a>.</td>
+ </tr>
+ </table>
+ <hr size="1"/>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/love2dToAPK/tools/tools/ant/etc/jdepend.xsl b/love2dToAPK/tools/tools/ant/etc/jdepend.xsl
new file mode 100644
index 0000000..f813297
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/etc/jdepend.xsl
@@ -0,0 +1,276 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+-->
+
+<xsl:output method="html" indent="yes" encoding="US-ASCII"/>
+
+<xsl:template match="JDepend">
+ <html>
+ <head>
+ <title>JDepend Analysis</title>
+
+ <style type="text/css">
+ body {
+ font:normal 68% verdana,arial,helvetica;
+ color:#000000;
+ }
+ table tr td, tr th {
+ font-size: 68%;
+ }
+ table.details tr th{
+ font-weight: bold;
+ text-align:left;
+ background:#a6caf0;
+ }
+ table.details tr td{
+ background:#eeeee0;
+ }
+
+ p {
+ line-height:1.5em;
+ margin-top:0.5em; margin-bottom:1.0em;
+ margin-left:2em;
+ margin-right:2em;
+ }
+ h1 {
+ margin: 0px 0px 5px; font: 165% verdana,arial,helvetica
+ }
+ h2 {
+ margin-top: 1em; margin-bottom: 0.5em; font: bold 125% verdana,arial,helvetica
+ }
+ h3 {
+ margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica
+ }
+ h4 {
+ margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
+ }
+ h5 {
+ margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
+ }
+ h6 {
+ margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
+ }
+ .Error {
+ font-weight:bold; color:red;
+ }
+ .Failure {
+ font-weight:bold; color:purple;
+ }
+ .Properties {
+ text-align:right;
+ }
+ </style>
+
+
+ </head>
+ <body>
+ <!--h1>JDepend Report</h1>
+ <ul>
+ <xsl:for-each select="./Packages/Package">
+ <xsl:sort select="@name"/>
+ <li><xsl:value-of select="@name"/></li>
+ </xsl:for-each>
+ </ul-->
+
+ <h1><a name="top">JDepend Analysis</a></h1>
+ <p align="right">Designed for use with <a href="http://www.clarkware.com/software/JDepend.html">JDepend</a> and <a href="http://jakarta.apache.org">Ant</a>.</p>
+ <hr size="2" />
+
+ <table width="100%"><tr><td>
+ <a name="NVsummary"><h2>Summary</h2></a>
+ </td><td align="right">
+ [<a href="#NVsummary">summary</a>]
+ [<a href="#NVpackages">packages</a>]
+ [<a href="#NVcycles">cycles</a>]
+ [<a href="#NVexplanations">explanations</a>]
+ </td></tr></table>
+
+ <table width="100%" class="details">
+ <tr>
+ <th>Package</th>
+ <th>Total Classes</th>
+ <th><a href="#EXnumber">Abstract Classes</a></th>
+ <th><a href="#EXnumber">Concrete Classes</a></th>
+ <th><a href="#EXafferent">Afferent Couplings</a></th>
+ <th><a href="#EXefferent">Efferent Couplings</a></th>
+ <th><a href="#EXabstractness">Abstractness</a></th>
+ <th><a href="#EXinstability">Instability</a></th>
+ <th><a href="#EXdistance">Distance</a></th>
+
+ </tr>
+ <xsl:for-each select="./Packages/Package">
+ <xsl:if test="count(error) = 0">
+ <tr>
+ <td align="left">
+ <a>
+ <xsl:attribute name="href">#PK<xsl:value-of select="@name"/>
+ </xsl:attribute>
+ <xsl:value-of select="@name"/>
+ </a>
+ </td>
+ <td align="right"><xsl:value-of select="Stats/TotalClasses"/></td>
+ <td align="right"><xsl:value-of select="Stats/AbstractClasses"/></td>
+ <td align="right"><xsl:value-of select="Stats/ConcreteClasses"/></td>
+ <td align="right"><xsl:value-of select="Stats/Ca"/></td>
+ <td align="right"><xsl:value-of select="Stats/Ce"/></td>
+ <td align="right"><xsl:value-of select="Stats/A"/></td>
+ <td align="right"><xsl:value-of select="Stats/I"/></td>
+ <td align="right"><xsl:value-of select="Stats/D"/></td>
+
+
+ </tr>
+ </xsl:if>
+ </xsl:for-each>
+ <xsl:for-each select="./Packages/Package">
+ <xsl:if test="count(error) &gt; 0">
+ <tr>
+ <td align="left">
+ <xsl:value-of select="@name"/>
+ </td>
+ <td align="left" colspan="8"><xsl:value-of select="error"/></td>
+ </tr>
+ </xsl:if>
+ </xsl:for-each>
+ </table>
+
+ <table width="100%"><tr><td>
+ <a name="NVpackages"><h2>Packages</h2></a>
+ </td><td align="right">
+ [<a href="#NVsummary">summary</a>]
+ [<a href="#NVpackages">packages</a>]
+ [<a href="#NVcycles">cycles</a>]
+ [<a href="#NVexplanations">explanations</a>]
+ </td></tr></table>
+
+ <xsl:for-each select="./Packages/Package">
+ <xsl:if test="count(error) = 0">
+ <h3><a><xsl:attribute name="name">PK<xsl:value-of select="@name"/></xsl:attribute>
+ <xsl:value-of select="@name"/></a></h3>
+
+ <table width="100%"><tr>
+ <td><a href="#EXafferent">Afferent Couplings</a>: <xsl:value-of select="Stats/Ca"/></td>
+ <td><a href="#EXefferent">Efferent Couplings</a>: <xsl:value-of select="Stats/Ce"/></td>
+ <td><a href="#EXabstractness">Abstractness</a>: <xsl:value-of select="Stats/A"/></td>
+ <td><a href="#EXinstability">Instability</a>: <xsl:value-of select="Stats/I"/></td>
+ <td><a href="#EXdistance">Distance</a>: <xsl:value-of select="Stats/D"/></td>
+ </tr></table>
+
+ <table width="100%" class="details">
+ <tr>
+ <th>Abstract Classes</th>
+ <th>Concrete Classes</th>
+ <th>Used by Packages</th>
+ <th>Uses Packages</th>
+ </tr>
+ <tr>
+ <td valign="top" width="25%">
+ <xsl:if test="count(AbstractClasses/Class)=0">
+ <i>None</i>
+ </xsl:if>
+ <xsl:for-each select="AbstractClasses/Class">
+ <xsl:value-of select="node()"/><br/>
+ </xsl:for-each>
+ </td>
+ <td valign="top" width="25%">
+ <xsl:if test="count(ConcreteClasses/Class)=0">
+ <i>None</i>
+ </xsl:if>
+ <xsl:for-each select="ConcreteClasses/Class">
+ <xsl:value-of select="node()"/><br/>
+ </xsl:for-each>
+ </td>
+ <td valign="top" width="25%">
+ <xsl:if test="count(UsedBy/Package)=0">
+ <i>None</i>
+ </xsl:if>
+ <xsl:for-each select="UsedBy/Package">
+ <a>
+ <xsl:attribute name="href">#PK<xsl:value-of select="node()"/></xsl:attribute>
+ <xsl:value-of select="node()"/>
+ </a><br/>
+ </xsl:for-each>
+ </td>
+ <td valign="top" width="25%">
+ <xsl:if test="count(DependsUpon/Package)=0">
+ <i>None</i>
+ </xsl:if>
+ <xsl:for-each select="DependsUpon/Package">
+ <a>
+ <xsl:attribute name="href">#PK<xsl:value-of select="node()"/></xsl:attribute>
+ <xsl:value-of select="node()"/>
+ </a><br/>
+ </xsl:for-each>
+ </td>
+ </tr>
+ </table>
+ </xsl:if>
+ </xsl:for-each>
+
+ <table width="100%"><tr><td>
+ <a name="NVcycles"><h2>Cycles</h2></a>
+ </td><td align="right">
+ [<a href="#NVsummary">summary</a>]
+ [<a href="#NVpackages">packages</a>]
+ [<a href="#NVcycles">cycles</a>]
+ [<a href="#NVexplanations">explanations</a>]
+ </td></tr></table>
+
+ <xsl:if test="count(Cycles/Package) = 0">
+ <p>There are no cyclic dependancies.</p>
+ </xsl:if>
+ <xsl:for-each select="Cycles/Package">
+ <h3><xsl:value-of select="@Name"/></h3><p>
+ <xsl:for-each select="Package">
+ <xsl:value-of select="."/><br/>
+ </xsl:for-each></p>
+ </xsl:for-each>
+
+ <table width="100%"><tr><td>
+ <a name="NVexplanations"><h2>Explanations</h2></a>
+ </td><td align="right">
+ [<a href="#NVsummary">summary</a>]
+ [<a href="#NVpackages">packages</a>]
+ [<a href="#NVcycles">cycles</a>]
+ [<a href="#NVexplanations">explanations</a>]
+ </td></tr></table>
+
+ <p>The following explanations are for quick reference and are lifted directly from the original <a href="http://www.clarkware.com/software/JDepend.html">JDepend documentation</a>.</p>
+
+ <h3><a name="EXnumber">Number of Classes</a></h3>
+ <p>The number of concrete and abstract classes (and interfaces) in the package is an indicator of the extensibility of the package.</p>
+ <h3><a name="EXafferent">Afferent Couplings</a></h3>
+ <p>The number of other packages that depend upon classes within the package is an indicator of the package's responsibility. </p>
+ <h3><a name="EXefferent">Efferent Couplings</a></h3>
+ <p>The number of other packages that the classes in the package depend upon is an indicator of the package's independence. </p>
+ <h3><a name="EXabstractness">Abstractness</a></h3>
+ <p>The ratio of the number of abstract classes (and interfaces) in the analyzed package to the total number of classes in the analyzed package. </p>
+ <p>The range for this metric is 0 to 1, with A=0 indicating a completely concrete package and A=1 indicating a completely abstract package. </p>
+ <h3><a name="EXinstability">Instability</a></h3>
+ <p>The ratio of efferent coupling (Ce) to total coupling (Ce / (Ce + Ca)). This metric is an indicator of the package's resilience to change. </p>
+ <p>The range for this metric is 0 to 1, with I=0 indicating a completely stable package and I=1 indicating a completely instable package. </p>
+ <h3><a name="EXdistance">Distance</a></h3>
+ <p>The perpendicular distance of a package from the idealized line A + I = 1. This metric is an indicator of the package's balance between abstractness and stability. </p>
+ <p>A package squarely on the main sequence is optimally balanced with respect to its abstractness and stability. Ideal packages are either completely abstract and stable (x=0, y=1) or completely concrete and instable (x=1, y=0). </p>
+ <p>The range for this metric is 0 to 1, with D=0 indicating a package that is coincident with the main sequence and D=1 indicating a package that is as far from the main sequence as possible. </p>
+
+ </body>
+ </html>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/love2dToAPK/tools/tools/ant/etc/junit-frames-xalan1.xsl b/love2dToAPK/tools/tools/ant/etc/junit-frames-xalan1.xsl
new file mode 100644
index 0000000..fbc28e1
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/etc/junit-frames-xalan1.xsl
@@ -0,0 +1,745 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:lxslt="http://xml.apache.org/xslt"
+ xmlns:redirect="org.apache.xalan.lib.Redirect"
+ xmlns:string="xalan://java.lang.String"
+ extension-element-prefixes="redirect">
+<xsl:output method="html" indent="yes" encoding="UTF-8"/>
+<xsl:decimal-format decimal-separator="." grouping-separator=","/>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+ -->
+
+<!--
+
+ Sample stylesheet to be used with Ant JUnitReport output.
+
+ It creates a set of HTML files a la javadoc where you can browse easily
+ through all packages and classes.
+
+-->
+<xsl:param name="output.dir" select="'.'"/>
+
+
+<xsl:template match="testsuites">
+ <!-- create the index.html -->
+ <redirect:write file="{$output.dir}/index.html">
+ <xsl:call-template name="index.html"/>
+ </redirect:write>
+
+ <!-- create the stylesheet.css -->
+ <redirect:write file="{$output.dir}/stylesheet.css">
+ <xsl:call-template name="stylesheet.css"/>
+ </redirect:write>
+
+ <!-- create the overview-packages.html at the root -->
+ <redirect:write file="{$output.dir}/overview-summary.html">
+ <xsl:apply-templates select="." mode="overview.packages"/>
+ </redirect:write>
+
+ <!-- create the all-packages.html at the root -->
+ <redirect:write file="{$output.dir}/overview-frame.html">
+ <xsl:apply-templates select="." mode="all.packages"/>
+ </redirect:write>
+
+ <!-- create the all-classes.html at the root -->
+ <redirect:write file="{$output.dir}/allclasses-frame.html">
+ <xsl:apply-templates select="." mode="all.classes"/>
+ </redirect:write>
+
+ <!-- process all packages -->
+ <xsl:for-each select="./testsuite[not(./@package = preceding-sibling::testsuite/@package)]">
+ <xsl:call-template name="package">
+ <xsl:with-param name="name" select="@package"/>
+ </xsl:call-template>
+ </xsl:for-each>
+</xsl:template>
+
+
+<xsl:template name="package">
+ <xsl:param name="name"/>
+ <xsl:variable name="package.dir">
+ <xsl:if test="not($name = '')"><xsl:value-of select="translate($name,'.','/')"/></xsl:if>
+ <xsl:if test="$name = ''">.</xsl:if>
+ </xsl:variable>
+ <!--Processing package <xsl:value-of select="@name"/> in <xsl:value-of select="$output.dir"/> -->
+ <!-- create a classes-list.html in the package directory -->
+ <redirect:write file="{$output.dir}/{$package.dir}/package-frame.html">
+ <xsl:call-template name="classes.list">
+ <xsl:with-param name="name" select="$name"/>
+ </xsl:call-template>
+ </redirect:write>
+
+ <!-- create a package-summary.html in the package directory -->
+ <redirect:write file="{$output.dir}/{$package.dir}/package-summary.html">
+ <xsl:call-template name="package.summary">
+ <xsl:with-param name="name" select="$name"/>
+ </xsl:call-template>
+ </redirect:write>
+
+ <!-- for each class, creates a @name.html -->
+ <!-- @bug there will be a problem with inner classes having the same name, it will be overwritten -->
+ <xsl:for-each select="/testsuites/testsuite[@package = $name]">
+ <redirect:write file="{$output.dir}/{$package.dir}/{@name}.html">
+ <xsl:apply-templates select="." mode="class.details"/>
+ </redirect:write>
+ <xsl:if test="string-length(./system-out)!=0">
+ <redirect:write file="{$output.dir}/{$package.dir}/{@name}-out.html">
+ <html>
+ <head>
+ <title>Standard Output from <xsl:value-of select="@name"/></title>
+ </head>
+ <body>
+ <pre><xsl:value-of select="./system-out"/></pre>
+ </body>
+ </html>
+ </redirect:write>
+ </xsl:if>
+ <xsl:if test="string-length(./system-err)!=0">
+ <redirect:write file="{$output.dir}/{$package.dir}/{@name}-err.html">
+ <html>
+ <head>
+ <title>Standard Error from <xsl:value-of select="@name"/></title>
+ </head>
+ <body>
+ <pre><xsl:value-of select="./system-err"/></pre>
+ </body>
+ </html>
+ </redirect:write>
+ </xsl:if>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template name="index.html">
+<html>
+ <head>
+ <title>Unit Test Results.</title>
+ </head>
+ <frameset cols="20%,80%">
+ <frameset rows="30%,70%">
+ <frame src="overview-frame.html" name="packageListFrame"/>
+ <frame src="allclasses-frame.html" name="classListFrame"/>
+ </frameset>
+ <frame src="overview-summary.html" name="classFrame"/>
+ <noframes>
+ <h2>Frame Alert</h2>
+ <p>
+ This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
+ </p>
+ </noframes>
+ </frameset>
+</html>
+</xsl:template>
+
+<!-- this is the stylesheet css to use for nearly everything -->
+<xsl:template name="stylesheet.css">
+body {
+ font:normal 68% verdana,arial,helvetica;
+ color:#000000;
+}
+table tr td, table tr th {
+ font-size: 68%;
+}
+table.details tr th{
+ font-weight: bold;
+ text-align:left;
+ background:#a6caf0;
+}
+table.details tr td{
+ background:#eeeee0;
+}
+
+p {
+ line-height:1.5em;
+ margin-top:0.5em; margin-bottom:1.0em;
+}
+h1 {
+ margin: 0px 0px 5px; font: 165% verdana,arial,helvetica
+}
+h2 {
+ margin-top: 1em; margin-bottom: 0.5em; font: bold 125% verdana,arial,helvetica
+}
+h3 {
+ margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica
+}
+h4 {
+ margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
+}
+h5 {
+ margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
+}
+h6 {
+ margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
+}
+.Error {
+ font-weight:bold; color:red;
+}
+.Failure {
+ font-weight:bold; color:purple;
+}
+.Properties {
+ text-align:right;
+}
+</xsl:template>
+
+
+<!-- ======================================================================
+ This page is created for every testsuite class.
+ It prints a summary of the testsuite and detailed information about
+ testcase methods.
+ ====================================================================== -->
+<xsl:template match="testsuite" mode="class.details">
+ <xsl:variable name="package.name" select="@package"/>
+ <xsl:variable name="class.name"><xsl:if test="not($package.name = '')"><xsl:value-of select="$package.name"/>.</xsl:if><xsl:value-of select="@name"/></xsl:variable>
+ <html>
+ <head>
+ <title>Unit Test Results: <xsl:value-of select="$class.name"/></title>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name" select="$package.name"/>
+ </xsl:call-template>
+ <script type="text/javascript" language="JavaScript">
+ var TestCases = new Array();
+ var cur;
+ <xsl:apply-templates select="properties"/>
+ </script>
+ <script type="text/javascript" language="JavaScript"><![CDATA[
+ function displayProperties (name) {
+ var win = window.open('','JUnitSystemProperties','scrollbars=1,resizable=1');
+ var doc = win.document;
+ doc.open();
+ doc.write("<html><head><title>Properties of " + name + "</title>");
+ doc.write("<style type=\"text/css\">");
+ doc.write("body {font:normal 68% verdana,arial,helvetica; color:#000000; }");
+ doc.write("table tr td, table tr th { font-size: 68%; }");
+ doc.write("table.properties { border-collapse:collapse; border-left:solid 1 #cccccc; border-top:solid 1 #cccccc; padding:5px; }");
+ doc.write("table.properties th { text-align:left; border-right:solid 1 #cccccc; border-bottom:solid 1 #cccccc; background-color:#eeeeee; }");
+ doc.write("table.properties td { font:normal; text-align:left; border-right:solid 1 #cccccc; border-bottom:solid 1 #cccccc; background-color:#fffffff; }");
+ doc.write("h3 { margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica }");
+ doc.write("</style>");
+ doc.write("</head><body>");
+ doc.write("<h3>Properties of " + name + "</h3>");
+ doc.write("<div align=\"right\"><a href=\"javascript:window.close();\">Close</a></div>");
+ doc.write("<table class='properties'>");
+ doc.write("<tr><th>Name</th><th>Value</th></tr>");
+ for (prop in TestCases[name]) {
+ doc.write("<tr><th>" + prop + "</th><td>" + TestCases[name][prop] + "</td></tr>");
+ }
+ doc.write("</table>");
+ doc.write("</body></html>");
+ doc.close();
+ win.focus();
+ }
+ ]]>
+ </script>
+ </head>
+ <body>
+ <xsl:call-template name="pageHeader"/>
+ <h3>Class <xsl:value-of select="$class.name"/></h3>
+
+
+ <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
+ <xsl:call-template name="testsuite.test.header"/>
+ <xsl:apply-templates select="." mode="print.test"/>
+ </table>
+
+ <h2>Tests</h2>
+ <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
+ <xsl:call-template name="testcase.test.header"/>
+ <!--
+ test can even not be started at all (failure to load the class)
+ so report the error directly
+ -->
+ <xsl:if test="./error">
+ <tr class="Error">
+ <td colspan="4"><xsl:apply-templates select="./error"/></td>
+ </tr>
+ </xsl:if>
+ <xsl:apply-templates select="./testcase" mode="print.test"/>
+ </table>
+ <div class="Properties">
+ <a>
+ <xsl:attribute name="href">javascript:displayProperties('<xsl:value-of select="@package"/>.<xsl:value-of select="@name"/>');</xsl:attribute>
+ Properties &#187;
+ </a>
+ </div>
+ <xsl:if test="string-length(./system-out)!=0">
+ <div class="Properties">
+ <a>
+ <xsl:attribute name="href">./<xsl:value-of select="@name"/>-out.html</xsl:attribute>
+ System.out &#187;
+ </a>
+ </div>
+ </xsl:if>
+ <xsl:if test="string-length(./system-err)!=0">
+ <div class="Properties">
+ <a>
+ <xsl:attribute name="href">./<xsl:value-of select="@name"/>-err.html</xsl:attribute>
+ System.err &#187;
+ </a>
+ </div>
+ </xsl:if>
+ </body>
+ </html>
+</xsl:template>
+
+ <!--
+ Write properties into a JavaScript data structure.
+ This is based on the original idea by Erik Hatcher (ehatcher@apache.org)
+ -->
+ <xsl:template match="properties">
+ cur = TestCases['<xsl:value-of select="../@package"/>.<xsl:value-of select="../@name"/>'] = new Array();
+ <xsl:for-each select="property">
+ <xsl:sort select="@name"/>
+ cur['<xsl:value-of select="@name"/>'] = '<xsl:call-template name="JS-escape"><xsl:with-param name="string" select="@value"/></xsl:call-template>';
+ </xsl:for-each>
+ </xsl:template>
+
+
+<!-- ======================================================================
+ This page is created for every package.
+ It prints the name of all classes that belongs to this package.
+ @param name the package name to print classes.
+ ====================================================================== -->
+<!-- list of classes in a package -->
+<xsl:template name="classes.list">
+ <xsl:param name="name"/>
+ <html>
+ <head>
+ <title>Unit Test Classes: <xsl:value-of select="$name"/></title>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name" select="$name"/>
+ </xsl:call-template>
+ </head>
+ <body>
+ <table width="100%">
+ <tr>
+ <td nowrap="nowrap">
+ <h2><a href="package-summary.html" target="classFrame">
+ <xsl:value-of select="$name"/>
+ <xsl:if test="$name = ''">&lt;none&gt;</xsl:if>
+ </a></h2>
+ </td>
+ </tr>
+ </table>
+
+ <h2>Classes</h2>
+ <table width="100%">
+ <xsl:for-each select="/testsuites/testsuite[./@package = $name]">
+ <xsl:sort select="@name"/>
+ <tr>
+ <td nowrap="nowrap">
+ <a href="{@name}.html" target="classFrame"><xsl:value-of select="@name"/></a>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </body>
+ </html>
+</xsl:template>
+
+
+<!--
+ Creates an all-classes.html file that contains a link to all package-summary.html
+ on each class.
+-->
+<xsl:template match="testsuites" mode="all.classes">
+ <html>
+ <head>
+ <title>All Unit Test Classes</title>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name"/>
+ </xsl:call-template>
+ </head>
+ <body>
+ <h2>Classes</h2>
+ <table width="100%">
+ <xsl:apply-templates select="testsuite" mode="all.classes">
+ <xsl:sort select="@name"/>
+ </xsl:apply-templates>
+ </table>
+ </body>
+ </html>
+</xsl:template>
+
+<xsl:template match="testsuite" mode="all.classes">
+ <xsl:variable name="package.name" select="@package"/>
+ <tr>
+ <td nowrap="nowrap">
+ <a target="classFrame">
+ <xsl:attribute name="href">
+ <xsl:if test="not($package.name='')">
+ <xsl:value-of select="translate($package.name,'.','/')"/><xsl:text>/</xsl:text>
+ </xsl:if><xsl:value-of select="@name"/><xsl:text>.html</xsl:text>
+ </xsl:attribute>
+ <xsl:value-of select="@name"/>
+ </a>
+ </td>
+ </tr>
+</xsl:template>
+
+
+<!--
+ Creates an html file that contains a link to all package-summary.html files on
+ each package existing on testsuites.
+ @bug there will be a problem here, I don't know yet how to handle unnamed package :(
+-->
+<xsl:template match="testsuites" mode="all.packages">
+ <html>
+ <head>
+ <title>All Unit Test Packages</title>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name"/>
+ </xsl:call-template>
+ </head>
+ <body>
+ <h2><a href="overview-summary.html" target="classFrame">Home</a></h2>
+ <h2>Packages</h2>
+ <table width="100%">
+ <xsl:apply-templates select="testsuite[not(./@package = preceding-sibling::testsuite/@package)]" mode="all.packages">
+ <xsl:sort select="@package"/>
+ </xsl:apply-templates>
+ </table>
+ </body>
+ </html>
+</xsl:template>
+
+<xsl:template match="testsuite" mode="all.packages">
+ <tr>
+ <td nowrap="nowrap">
+ <a href="./{translate(@package,'.','/')}/package-summary.html" target="classFrame">
+ <xsl:value-of select="@package"/>
+ <xsl:if test="@package = ''">&lt;none&gt;</xsl:if>
+ </a>
+ </td>
+ </tr>
+</xsl:template>
+
+
+<xsl:template match="testsuites" mode="overview.packages">
+ <html>
+ <head>
+ <title>Unit Test Results: Summary</title>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name"/>
+ </xsl:call-template>
+ </head>
+ <body>
+ <xsl:attribute name="onload">open('allclasses-frame.html','classListFrame')</xsl:attribute>
+ <xsl:call-template name="pageHeader"/>
+ <h2>Summary</h2>
+ <xsl:variable name="testCount" select="sum(testsuite/@tests)"/>
+ <xsl:variable name="errorCount" select="sum(testsuite/@errors)"/>
+ <xsl:variable name="failureCount" select="sum(testsuite/@failures)"/>
+ <xsl:variable name="skippedCount" select="sum(testsuite/@skipped)"/>
+ <xsl:variable name="timeCount" select="sum(testsuite/@time)"/>
+ <xsl:variable name="successRate" select="($testCount - $failureCount - $errorCount) div $testCount"/>
+ <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
+ <tr valign="top">
+ <th>Tests</th>
+ <th>Failures</th>
+ <th>Errors</th>
+ <th>Skipped</th>
+ <th>Success rate</th>
+ <th>Time</th>
+ </tr>
+ <tr valign="top">
+ <xsl:attribute name="class">
+ <xsl:choose>
+ <xsl:when test="$errorCount &gt; 0">Error</xsl:when>
+ <xsl:when test="$failureCount &gt; 0">Failure</xsl:when>
+ <xsl:otherwise>Pass</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <td><xsl:value-of select="$testCount"/></td>
+ <td><xsl:value-of select="$failureCount"/></td>
+ <td><xsl:value-of select="$errorCount"/></td>
+ <td><xsl:value-of select="$skipCount" /></td>
+ <td>
+ <xsl:call-template name="display-percent">
+ <xsl:with-param name="value" select="$successRate"/>
+ </xsl:call-template>
+ </td>
+ <td>
+ <xsl:call-template name="display-time">
+ <xsl:with-param name="value" select="$timeCount"/>
+ </xsl:call-template>
+ </td>
+ </tr>
+ </table>
+ <table border="0" width="95%">
+ <tr>
+ <td style="text-align: justify;">
+ Note: <em>failures</em> are anticipated and checked for with assertions while <em>errors</em> are unanticipated.
+ </td>
+ </tr>
+ </table>
+
+ <h2>Packages</h2>
+ <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
+ <xsl:call-template name="testsuite.test.header"/>
+ <xsl:for-each select="testsuite[not(./@package = preceding-sibling::testsuite/@package)]">
+ <xsl:sort select="@package" order="ascending"/>
+ <!-- get the node set containing all testsuites that have the same package -->
+ <xsl:variable name="insamepackage" select="/testsuites/testsuite[./@package = current()/@package]"/>
+ <tr valign="top">
+ <!-- display a failure if there is any failure/error in the package -->
+ <xsl:attribute name="class">
+ <xsl:choose>
+ <xsl:when test="sum($insamepackage/@errors) &gt; 0">Error</xsl:when>
+ <xsl:when test="sum($insamepackage/@failures) &gt; 0">Failure</xsl:when>
+ <xsl:otherwise>Pass</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <td><a href="./{translate(@package,'.','/')}/package-summary.html">
+ <xsl:value-of select="@package"/>
+ <xsl:if test="@package = ''">&lt;none&gt;</xsl:if>
+ </a></td>
+ <td><xsl:value-of select="sum($insamepackage/@tests)"/></td>
+ <td><xsl:value-of select="sum($insamepackage/@errors)"/></td>
+ <td><xsl:value-of select="sum($insamepackage/@failures)"/></td>
+ <td><xsl:value-of select="sum($insamepackage/@skipped)" /></td>
+ <td>
+ <xsl:call-template name="display-time">
+ <xsl:with-param name="value" select="sum($insamepackage/@time)"/>
+ </xsl:call-template>
+ </td>
+ <td><xsl:value-of select="$insamepackage/@timestamp"/></td>
+ <td><xsl:value-of select="$insamepackage/@hostname"/></td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </body>
+ </html>
+</xsl:template>
+
+
+<xsl:template name="package.summary">
+ <xsl:param name="name"/>
+ <html>
+ <head>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name" select="$name"/>
+ </xsl:call-template>
+ </head>
+ <body>
+ <xsl:attribute name="onload">open('package-frame.html','classListFrame')</xsl:attribute>
+ <xsl:call-template name="pageHeader"/>
+ <h3>Package <xsl:value-of select="$name"/></h3>
+
+ <!--table border="0" cellpadding="5" cellspacing="2" width="95%">
+ <xsl:call-template name="class.metrics.header"/>
+ <xsl:apply-templates select="." mode="print.metrics"/>
+ </table-->
+
+ <xsl:variable name="insamepackage" select="/testsuites/testsuite[./@package = $name]"/>
+ <xsl:if test="count($insamepackage) &gt; 0">
+ <h2>Classes</h2>
+ <p>
+ <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
+ <xsl:call-template name="testsuite.test.header"/>
+ <xsl:apply-templates select="$insamepackage" mode="print.test">
+ <xsl:sort select="@name"/>
+ </xsl:apply-templates>
+ </table>
+ </p>
+ </xsl:if>
+ </body>
+ </html>
+</xsl:template>
+
+
+<!--
+ transform string like a.b.c to ../../../
+ @param path the path to transform into a descending directory path
+-->
+<xsl:template name="path">
+ <xsl:param name="path"/>
+ <xsl:if test="contains($path,'.')">
+ <xsl:text>../</xsl:text>
+ <xsl:call-template name="path">
+ <xsl:with-param name="path"><xsl:value-of select="substring-after($path,'.')"/></xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="not(contains($path,'.')) and not($path = '')">
+ <xsl:text>../</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+
+<!-- create the link to the stylesheet based on the package name -->
+<xsl:template name="create.stylesheet.link">
+ <xsl:param name="package.name"/>
+ <link rel="stylesheet" type="text/css" title="Style"><xsl:attribute name="href"><xsl:if test="not($package.name = 'unnamed package')"><xsl:call-template name="path"><xsl:with-param name="path" select="$package.name"/></xsl:call-template></xsl:if>stylesheet.css</xsl:attribute></link>
+</xsl:template>
+
+
+<!-- Page HEADER -->
+<xsl:template name="pageHeader">
+ <h1>Unit Test Results</h1>
+ <table width="100%">
+ <tr>
+ <td align="left"></td>
+ <td align="right">Designed for use with <a href="http://www.junit.org/">JUnit</a> and <a href="http://ant.apache.org/">Ant</a>.</td>
+ </tr>
+ </table>
+ <hr size="1"/>
+</xsl:template>
+
+<!-- class header -->
+<xsl:template name="testsuite.test.header">
+ <tr valign="top">
+ <th width="80%">Name</th>
+ <th>Tests</th>
+ <th>Errors</th>
+ <th>Failures</th>
+ <th>Skipped</th>
+ <th nowrap="nowrap">Time(s)</th>
+ <th nowrap="nowrap">Time Stamp</th>
+ <th>Host</th>
+ </tr>
+</xsl:template>
+
+<!-- method header -->
+<xsl:template name="testcase.test.header">
+ <tr valign="top">
+ <th>Name</th>
+ <th>Status</th>
+ <th width="80%">Type</th>
+ <th nowrap="nowrap">Time(s)</th>
+ </tr>
+</xsl:template>
+
+
+<!-- class information -->
+<xsl:template match="testsuite" mode="print.test">
+ <tr valign="top">
+ <xsl:attribute name="class">
+ <xsl:choose>
+ <xsl:when test="@errors[.&gt; 0]">Error</xsl:when>
+ <xsl:when test="@failures[.&gt; 0]">Failure</xsl:when>
+ <xsl:otherwise>Pass</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <td><a href="{@name}.html"><xsl:value-of select="@name"/></a></td>
+ <td><xsl:apply-templates select="@tests"/></td>
+ <td><xsl:apply-templates select="@errors"/></td>
+ <td><xsl:apply-templates select="@failures"/></td>
+ <td><xsl:apply-templates select="@skipped" /></td>
+ <td><xsl:call-template name="display-time">
+ <xsl:with-param name="value" select="@time"/>
+ </xsl:call-template>
+ </td>
+ <td><xsl:apply-templates select="@timestamp"/></td>
+ <td><xsl:apply-templates select="@hostname"/></td>
+ </tr>
+</xsl:template>
+
+<xsl:template match="testcase" mode="print.test">
+ <tr valign="top">
+ <xsl:attribute name="class">
+ <xsl:choose>
+ <xsl:when test="error">Error</xsl:when>
+ <xsl:when test="failure">Failure</xsl:when>
+ <xsl:otherwise>TableRowColor</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <td><xsl:value-of select="@name"/></td>
+ <xsl:choose>
+ <xsl:when test="failure">
+ <td>Failure</td>
+ <td><xsl:apply-templates select="failure"/></td>
+ </xsl:when>
+ <xsl:when test="error">
+ <td>Error</td>
+ <td><xsl:apply-templates select="error"/></td>
+ </xsl:when>
+ <xsl:when test="skipped">
+ <td>Skipped</td>
+ <td><xsl:apply-templates select="skipped"/></td>
+ </xsl:when>
+ <xsl:otherwise>
+ <td>Success</td>
+ <td></td>
+ </xsl:otherwise>
+ </xsl:choose>
+ <td>
+ <xsl:call-template name="display-time">
+ <xsl:with-param name="value" select="@time"/>
+ </xsl:call-template>
+ </td>
+ </tr>
+</xsl:template>
+
+
+<!-- Note : the below template error and failure are the same style
+ so just call the same style store in the toolkit template -->
+<xsl:template match="failure">
+ <xsl:call-template name="display-failures"/>
+</xsl:template>
+
+<xsl:template match="error">
+ <xsl:call-template name="display-failures"/>
+</xsl:template>
+
+<!-- Style for the error and failure in the testcase template -->
+<xsl:template name="display-failures">
+ <xsl:choose>
+ <xsl:when test="not(@message)">N/A</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@message"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <!-- display the stacktrace -->
+ <br/><br/>
+ <code>
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word" select="."/>
+ </xsl:call-template>
+ </code>
+ <!-- the latter is better but might be problematic for non-21" monitors... -->
+ <!--pre><xsl:value-of select="."/></pre-->
+</xsl:template>
+
+<xsl:template name="JS-escape">
+ <xsl:param name="string"/>
+ <xsl:param name="tmp1" select="string:replaceAll(string:new(string($string)),'\\','\\\\')"/>
+ <xsl:param name="tmp2" select="string:replaceAll(string:new(string($tmp1)),&quot;'&quot;,&quot;\\&apos;&quot;)"/>
+ <xsl:param name="tmp3" select="string:replaceAll(string:new(string($tmp2)),&quot;&#10;&quot;,'\\n')"/>
+ <xsl:param name="tmp4" select="string:replaceAll(string:new(string($tmp3)),&quot;&#13;&quot;,'\\r')"/>
+ <xsl:value-of select="$tmp4"/>
+</xsl:template>
+
+
+<!--
+ template that will convert a carriage return into a br tag
+ @param word the text from which to convert CR to BR tag
+-->
+<xsl:template name="br-replace">
+ <xsl:param name="word"/>
+ <xsl:param name="br"><br/></xsl:param>
+ <xsl:value-of select='stringutils:replace(string($word),"&#xA;",$br)'/>
+</xsl:template>
+
+<xsl:template name="display-time">
+ <xsl:param name="value"/>
+ <xsl:value-of select="format-number($value,'0.000')"/>
+</xsl:template>
+
+<xsl:template name="display-percent">
+ <xsl:param name="value"/>
+ <xsl:value-of select="format-number($value,'0.00%')"/>
+</xsl:template>
+</xsl:stylesheet>
diff --git a/love2dToAPK/tools/tools/ant/etc/junit-frames.xsl b/love2dToAPK/tools/tools/ant/etc/junit-frames.xsl
new file mode 100644
index 0000000..afea6e0
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/etc/junit-frames.xsl
@@ -0,0 +1,972 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:lxslt="http://xml.apache.org/xslt"
+ xmlns:redirect="http://xml.apache.org/xalan/redirect"
+ xmlns:string="xalan://java.lang.String"
+ extension-element-prefixes="redirect">
+<xsl:output method="html" indent="yes" encoding="UTF-8"/>
+<xsl:decimal-format decimal-separator="." grouping-separator=","/>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+ -->
+
+<!--
+
+ Sample stylesheet to be used with Ant JUnitReport output.
+
+ It creates a set of HTML files a la javadoc where you can browse easily
+ through all packages and classes.
+
+-->
+<xsl:param name="output.dir" select="'.'"/>
+<xsl:param name="TITLE">Unit Test Results.</xsl:param>
+
+
+<xsl:template match="testsuites">
+ <!-- create the index.html -->
+ <redirect:write file="{$output.dir}/index.html">
+ <xsl:call-template name="index.html"/>
+ </redirect:write>
+
+ <!-- create the stylesheet.css -->
+ <redirect:write file="{$output.dir}/stylesheet.css">
+ <xsl:call-template name="stylesheet.css"/>
+ </redirect:write>
+
+ <!-- create the overview-packages.html at the root -->
+ <redirect:write file="{$output.dir}/overview-summary.html">
+ <xsl:apply-templates select="." mode="overview.packages"/>
+ </redirect:write>
+
+ <!-- create the all-packages.html at the root -->
+ <redirect:write file="{$output.dir}/overview-frame.html">
+ <xsl:apply-templates select="." mode="all.packages"/>
+ </redirect:write>
+
+ <!-- create the all-classes.html at the root -->
+ <redirect:write file="{$output.dir}/allclasses-frame.html">
+ <xsl:apply-templates select="." mode="all.classes"/>
+ </redirect:write>
+
+ <!-- create the all-tests.html at the root -->
+ <redirect:write file="{$output.dir}/all-tests.html">
+ <xsl:apply-templates select="." mode="all.tests"/>
+ </redirect:write>
+
+ <!-- create the alltests-fails.html at the root -->
+ <redirect:write file="{$output.dir}/alltests-fails.html">
+ <xsl:apply-templates select="." mode="all.tests">
+ <xsl:with-param name="type" select="'fails'"/>
+ </xsl:apply-templates>
+ </redirect:write>
+
+ <!-- create the alltests-errors.html at the root -->
+ <redirect:write file="{$output.dir}/alltests-errors.html">
+ <xsl:apply-templates select="." mode="all.tests">
+ <xsl:with-param name="type" select="'errors'"/>
+ </xsl:apply-templates>
+ </redirect:write>
+
+ <!-- create the alltests-skipped.html at the root -->
+ <redirect:write file="{$output.dir}/alltests-skipped.html">
+ <xsl:apply-templates select="." mode="all.tests">
+ <xsl:with-param name="type" select="'skipped'"/>
+ </xsl:apply-templates>
+ </redirect:write>
+
+ <!-- process all packages -->
+ <xsl:for-each select="./testsuite[not(./@package = preceding-sibling::testsuite/@package)]">
+ <xsl:call-template name="package">
+ <xsl:with-param name="name" select="@package"/>
+ </xsl:call-template>
+ </xsl:for-each>
+</xsl:template>
+
+
+<xsl:template name="package">
+ <xsl:param name="name"/>
+ <xsl:variable name="package.dir">
+ <xsl:if test="not($name = '')"><xsl:value-of select="translate($name,'.','/')"/></xsl:if>
+ <xsl:if test="$name = ''">.</xsl:if>
+ </xsl:variable>
+ <!--Processing package <xsl:value-of select="@name"/> in <xsl:value-of select="$output.dir"/> -->
+ <!-- create a classes-list.html in the package directory -->
+ <redirect:write file="{$output.dir}/{$package.dir}/package-frame.html">
+ <xsl:call-template name="classes.list">
+ <xsl:with-param name="name" select="$name"/>
+ </xsl:call-template>
+ </redirect:write>
+
+ <!-- create a package-summary.html in the package directory -->
+ <redirect:write file="{$output.dir}/{$package.dir}/package-summary.html">
+ <xsl:call-template name="package.summary">
+ <xsl:with-param name="name" select="$name"/>
+ </xsl:call-template>
+ </redirect:write>
+
+ <!-- for each class, creates a @name.html -->
+ <!-- @bug there will be a problem with inner classes having the same name, it will be overwritten -->
+ <xsl:for-each select="/testsuites/testsuite[@package = $name]">
+ <redirect:write file="{$output.dir}/{$package.dir}/{@id}_{@name}.html">
+ <xsl:apply-templates select="." mode="class.details"/>
+ </redirect:write>
+ <xsl:if test="string-length(./system-out)!=0">
+ <redirect:write file="{$output.dir}/{$package.dir}/{@id}_{@name}-out.html">
+ <html>
+ <head>
+ <title>Standard Output from <xsl:value-of select="@name"/></title>
+ </head>
+ <body>
+ <pre><xsl:value-of select="./system-out"/></pre>
+ </body>
+ </html>
+ </redirect:write>
+ </xsl:if>
+ <xsl:if test="string-length(./system-err)!=0">
+ <redirect:write file="{$output.dir}/{$package.dir}/{@id}_{@name}-err.html">
+ <html>
+ <head>
+ <title>Standard Error from <xsl:value-of select="@name"/></title>
+ </head>
+ <body>
+ <pre><xsl:value-of select="./system-err"/></pre>
+ </body>
+ </html>
+ </redirect:write>
+ </xsl:if>
+ <xsl:if test="@failures != 0">
+ <redirect:write file="{$output.dir}/{$package.dir}/{@id}_{@name}-fails.html">
+ <xsl:apply-templates select="." mode="class.details">
+ <xsl:with-param name="type" select="'fails'"/>
+ </xsl:apply-templates>
+ </redirect:write>
+ </xsl:if>
+ <xsl:if test="@errors != 0">
+ <redirect:write file="{$output.dir}/{$package.dir}/{@id}_{@name}-errors.html">
+ <xsl:apply-templates select="." mode="class.details">
+ <xsl:with-param name="type" select="'errors'"/>
+ </xsl:apply-templates>
+ </redirect:write>
+ </xsl:if>
+ <xsl:if test="@skipped != 0">
+ <redirect:write file="{$output.dir}/{$package.dir}/{@id}_{@name}-skipped.html">
+ <xsl:apply-templates select="." mode="class.details">
+ <xsl:with-param name="type" select="'skipped'"/>
+ </xsl:apply-templates>
+ </redirect:write>
+ </xsl:if>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template name="index.html">
+<html>
+ <head>
+ <title><xsl:value-of select="$TITLE"/></title>
+ </head>
+ <frameset cols="20%,80%">
+ <frameset rows="30%,70%">
+ <frame src="overview-frame.html" name="packageListFrame"/>
+ <frame src="allclasses-frame.html" name="classListFrame"/>
+ </frameset>
+ <frame src="overview-summary.html" name="classFrame"/>
+ <noframes>
+ <h2>Frame Alert</h2>
+ <p>
+ This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
+ </p>
+ </noframes>
+ </frameset>
+</html>
+</xsl:template>
+
+<!-- this is the stylesheet css to use for nearly everything -->
+<xsl:template name="stylesheet.css">
+body {
+ font:normal 68% verdana,arial,helvetica;
+ color:#000000;
+}
+table tr td, table tr th {
+ font-size: 68%;
+}
+table.details tr th{
+ font-weight: bold;
+ text-align:left;
+ background:#a6caf0;
+}
+table.details tr td{
+ background:#eeeee0;
+}
+
+p {
+ line-height:1.5em;
+ margin-top:0.5em; margin-bottom:1.0em;
+}
+h1 {
+ margin: 0px 0px 5px; font: 165% verdana,arial,helvetica
+}
+h2 {
+ margin-top: 1em; margin-bottom: 0.5em; font: bold 125% verdana,arial,helvetica
+}
+h3 {
+ margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica
+}
+h4 {
+ margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
+}
+h5 {
+ margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
+}
+h6 {
+ margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
+}
+.Error {
+ font-weight:bold; color:red;
+}
+.Failure {
+ font-weight:bold; color:purple;
+}
+.Properties {
+ text-align:right;
+}
+</xsl:template>
+
+<!-- Create list of all/failed/errored/skipped tests -->
+<xsl:template match="testsuites" mode="all.tests">
+ <xsl:param name="type" select="'all'"/>
+ <html>
+ <xsl:variable name="title">
+ <xsl:choose>
+ <xsl:when test="$type = 'fails'">
+ <xsl:text>All Failures</xsl:text>
+ </xsl:when>
+ <xsl:when test="$type = 'errors'">
+ <xsl:text>All Errors</xsl:text>
+ </xsl:when>
+ <xsl:when test="$type = 'skipped'">
+ <xsl:text>All Skipped</xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>All Tests</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <head>
+ <title>Unit Test Results: <xsl:value-of select="$title"/></title>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name"/>
+ </xsl:call-template>
+ </head>
+ <body>
+ <xsl:attribute name="onload">open('allclasses-frame.html','classListFrame')</xsl:attribute>
+ <xsl:call-template name="pageHeader"/>
+ <h2><xsl:value-of select="$title"/></h2>
+
+ <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
+ <xsl:call-template name="testcase.test.header">
+ <xsl:with-param name="show.class" select="'yes'"/>
+ </xsl:call-template>
+ <!--
+ test can even not be started at all (failure to load the class)
+ so report the error directly
+ -->
+ <xsl:if test="./error">
+ <tr class="Error">
+ <td colspan="4">
+ <xsl:apply-templates select="./error"/>
+ </td>
+ </tr>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="$type = 'fails'">
+ <xsl:apply-templates select=".//testcase[failure]" mode="print.test">
+ <xsl:with-param name="show.class" select="'yes'"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="$type = 'errors'">
+ <xsl:apply-templates select=".//testcase[error]" mode="print.test">
+ <xsl:with-param name="show.class" select="'yes'"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:when test="$type = 'skipped'">
+ <xsl:apply-templates select=".//testcase[skipped]" mode="print.test">
+ <xsl:with-param name="show.class" select="'yes'"/>
+ </xsl:apply-templates>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select=".//testcase" mode="print.test">
+ <xsl:with-param name="show.class" select="'yes'"/>
+ </xsl:apply-templates>
+ </xsl:otherwise>
+ </xsl:choose>
+ </table>
+ </body>
+ </html>
+</xsl:template>
+
+
+<!-- ======================================================================
+ This page is created for every testsuite class.
+ It prints a summary of the testsuite and detailed information about
+ testcase methods.
+ ====================================================================== -->
+<xsl:template match="testsuite" mode="class.details">
+ <xsl:param name="type" select="'all'"/>
+ <xsl:variable name="package.name" select="@package"/>
+ <xsl:variable name="class.name"><xsl:if test="not($package.name = '')"><xsl:value-of select="$package.name"/>.</xsl:if><xsl:value-of select="@name"/></xsl:variable>
+ <html>
+ <head>
+ <title>Unit Test Results: <xsl:value-of select="$class.name"/></title>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name" select="$package.name"/>
+ </xsl:call-template>
+ <script type="text/javascript" language="JavaScript">
+ var TestCases = new Array();
+ var cur;
+ <xsl:apply-templates select="properties"/>
+ </script>
+ <script type="text/javascript" language="JavaScript"><![CDATA[
+ function displayProperties (name) {
+ var win = window.open('','JUnitSystemProperties','scrollbars=1,resizable=1');
+ var doc = win.document;
+ doc.open();
+ doc.write("<html><head><title>Properties of " + name + "</title>");
+ doc.write("<style type=\"text/css\">");
+ doc.write("body {font:normal 68% verdana,arial,helvetica; color:#000000; }");
+ doc.write("table tr td, table tr th { font-size: 68%; }");
+ doc.write("table.properties { border-collapse:collapse; border-left:solid 1 #cccccc; border-top:solid 1 #cccccc; padding:5px; }");
+ doc.write("table.properties th { text-align:left; border-right:solid 1 #cccccc; border-bottom:solid 1 #cccccc; background-color:#eeeeee; }");
+ doc.write("table.properties td { font:normal; text-align:left; border-right:solid 1 #cccccc; border-bottom:solid 1 #cccccc; background-color:#fffffff; }");
+ doc.write("h3 { margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica }");
+ doc.write("</style>");
+ doc.write("</head><body>");
+ doc.write("<h3>Properties of " + name + "</h3>");
+ doc.write("<div align=\"right\"><a href=\"javascript:window.close();\">Close</a></div>");
+ doc.write("<table class='properties'>");
+ doc.write("<tr><th>Name</th><th>Value</th></tr>");
+ for (prop in TestCases[name]) {
+ doc.write("<tr><th>" + prop + "</th><td>" + TestCases[name][prop] + "</td></tr>");
+ }
+ doc.write("</table>");
+ doc.write("</body></html>");
+ doc.close();
+ win.focus();
+ }
+ ]]>
+ </script>
+ </head>
+ <body>
+ <xsl:call-template name="pageHeader"/>
+ <h3>Class <xsl:value-of select="$class.name"/></h3>
+
+
+ <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
+ <xsl:call-template name="testsuite.test.header"/>
+ <xsl:apply-templates select="." mode="print.test"/>
+ </table>
+
+ <xsl:choose>
+ <xsl:when test="$type = 'fails'">
+ <h2>Failures</h2>
+ </xsl:when>
+ <xsl:when test="$type = 'errors'">
+ <h2>Errors</h2>
+ </xsl:when>
+ <xsl:when test="$type = 'skipped'">
+ <h2>Skipped</h2>
+ </xsl:when>
+ <xsl:otherwise>
+ <h2>Tests</h2>
+ </xsl:otherwise>
+ </xsl:choose>
+ <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
+ <xsl:call-template name="testcase.test.header"/>
+ <!--
+ test can even not be started at all (failure to load the class)
+ so report the error directly
+ -->
+ <xsl:if test="./error">
+ <tr class="Error">
+ <td colspan="4"><xsl:apply-templates select="./error"/></td>
+ </tr>
+ </xsl:if>
+ <xsl:choose>
+ <xsl:when test="$type = 'fails'">
+ <xsl:apply-templates select="./testcase[failure]" mode="print.test"/>
+ </xsl:when>
+ <xsl:when test="$type = 'errors'">
+ <xsl:apply-templates select="./testcase[error]" mode="print.test"/>
+ </xsl:when>
+ <xsl:when test="$type = 'skipped'">
+ <xsl:apply-templates select="./testcase[skipped]" mode="print.test"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="./testcase" mode="print.test"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </table>
+ <div class="Properties">
+ <a>
+ <xsl:attribute name="href">javascript:displayProperties('<xsl:value-of select="@package"/>.<xsl:value-of select="@name"/>');</xsl:attribute>
+ Properties &#187;
+ </a>
+ </div>
+ <xsl:if test="string-length(./system-out)!=0">
+ <div class="Properties">
+ <a>
+ <xsl:attribute name="href">./<xsl:value-of select="@id"/>_<xsl:value-of select="@name"/>-out.html</xsl:attribute>
+ System.out &#187;
+ </a>
+ </div>
+ </xsl:if>
+ <xsl:if test="string-length(./system-err)!=0">
+ <div class="Properties">
+ <a>
+ <xsl:attribute name="href">./<xsl:value-of select="@id"/>_<xsl:value-of select="@name"/>-err.html</xsl:attribute>
+ System.err &#187;
+ </a>
+ </div>
+ </xsl:if>
+ </body>
+ </html>
+</xsl:template>
+
+ <!--
+ Write properties into a JavaScript data structure.
+ This is based on the original idea by Erik Hatcher (ehatcher@apache.org)
+ -->
+ <xsl:template match="properties">
+ cur = TestCases['<xsl:value-of select="../@package"/>.<xsl:value-of select="../@name"/>'] = new Array();
+ <xsl:for-each select="property">
+ <xsl:sort select="@name"/>
+ cur['<xsl:value-of select="@name"/>'] = '<xsl:call-template name="JS-escape"><xsl:with-param name="string" select="@value"/></xsl:call-template>';
+ </xsl:for-each>
+ </xsl:template>
+
+
+<!-- ======================================================================
+ This page is created for every package.
+ It prints the name of all classes that belongs to this package.
+ @param name the package name to print classes.
+ ====================================================================== -->
+<!-- list of classes in a package -->
+<xsl:template name="classes.list">
+ <xsl:param name="name"/>
+ <html>
+ <head>
+ <title>Unit Test Classes: <xsl:value-of select="$name"/></title>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name" select="$name"/>
+ </xsl:call-template>
+ </head>
+ <body>
+ <table width="100%">
+ <tr>
+ <td nowrap="nowrap">
+ <h2><a href="package-summary.html" target="classFrame">
+ <xsl:value-of select="$name"/>
+ <xsl:if test="$name = ''">&lt;none&gt;</xsl:if>
+ </a></h2>
+ </td>
+ </tr>
+ </table>
+
+ <h2>Classes</h2>
+ <table width="100%">
+ <xsl:for-each select="/testsuites/testsuite[./@package = $name]">
+ <xsl:sort select="@name"/>
+ <tr>
+ <td nowrap="nowrap">
+ <a href="{@id}_{@name}.html" target="classFrame"><xsl:value-of select="@name"/></a>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </body>
+ </html>
+</xsl:template>
+
+
+<!--
+ Creates an all-classes.html file that contains a link to all package-summary.html
+ on each class.
+-->
+<xsl:template match="testsuites" mode="all.classes">
+ <html>
+ <head>
+ <title>All Unit Test Classes</title>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name"/>
+ </xsl:call-template>
+ </head>
+ <body>
+ <h2>Classes</h2>
+ <table width="100%">
+ <xsl:apply-templates select="testsuite" mode="all.classes">
+ <xsl:sort select="@name"/>
+ </xsl:apply-templates>
+ </table>
+ </body>
+ </html>
+</xsl:template>
+
+<xsl:template match="testsuite" mode="all.classes">
+ <xsl:variable name="package.name" select="@package"/>
+ <tr>
+ <td nowrap="nowrap">
+ <a target="classFrame">
+ <xsl:attribute name="href">
+ <xsl:if test="not($package.name='')">
+ <xsl:value-of select="translate($package.name,'.','/')"/><xsl:text>/</xsl:text>
+ </xsl:if><xsl:value-of select="@id"/>_<xsl:value-of select="@name"/><xsl:text>.html</xsl:text>
+ </xsl:attribute>
+ <xsl:value-of select="@name"/>
+ </a>
+ </td>
+ </tr>
+</xsl:template>
+
+
+<!--
+ Creates an html file that contains a link to all package-summary.html files on
+ each package existing on testsuites.
+ @bug there will be a problem here, I don't know yet how to handle unnamed package :(
+-->
+<xsl:template match="testsuites" mode="all.packages">
+ <html>
+ <head>
+ <title>All Unit Test Packages</title>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name"/>
+ </xsl:call-template>
+ </head>
+ <body>
+ <h2><a href="overview-summary.html" target="classFrame">Home</a></h2>
+ <h2>Packages</h2>
+ <table width="100%">
+ <xsl:apply-templates select="testsuite[not(./@package = preceding-sibling::testsuite/@package)]" mode="all.packages">
+ <xsl:sort select="@package"/>
+ </xsl:apply-templates>
+ </table>
+ </body>
+ </html>
+</xsl:template>
+
+<xsl:template match="testsuite" mode="all.packages">
+ <tr>
+ <td nowrap="nowrap">
+ <a href="./{translate(@package,'.','/')}/package-summary.html" target="classFrame">
+ <xsl:value-of select="@package"/>
+ <xsl:if test="@package = ''">&lt;none&gt;</xsl:if>
+ </a>
+ </td>
+ </tr>
+</xsl:template>
+
+
+<xsl:template match="testsuites" mode="overview.packages">
+ <html>
+ <head>
+ <title>Unit Test Results: Summary</title>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name"/>
+ </xsl:call-template>
+ </head>
+ <body>
+ <xsl:attribute name="onload">open('allclasses-frame.html','classListFrame')</xsl:attribute>
+ <xsl:call-template name="pageHeader"/>
+ <h2>Summary</h2>
+ <xsl:variable name="testCount" select="sum(testsuite/@tests)"/>
+ <xsl:variable name="errorCount" select="sum(testsuite/@errors)"/>
+ <xsl:variable name="failureCount" select="sum(testsuite/@failures)"/>
+ <xsl:variable name="skippedCount" select="sum(testsuite/@skipped)" />
+ <xsl:variable name="timeCount" select="sum(testsuite/@time)"/>
+ <xsl:variable name="successRate" select="($testCount - $failureCount - $errorCount) div $testCount"/>
+ <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
+ <tr valign="top">
+ <th>Tests</th>
+ <th>Failures</th>
+ <th>Errors</th>
+ <th>Skipped</th>
+ <th>Success rate</th>
+ <th>Time</th>
+ </tr>
+ <tr valign="top">
+ <xsl:attribute name="class">
+ <xsl:choose>
+ <xsl:when test="$errorCount &gt; 0">Error</xsl:when>
+ <xsl:when test="$failureCount &gt; 0">Failure</xsl:when>
+ <xsl:otherwise>Pass</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <td><a title="Display all tests" href="all-tests.html"><xsl:value-of select="$testCount"/></a></td>
+ <td><a title="Display all failures" href="alltests-fails.html"><xsl:value-of select="$failureCount"/></a></td>
+ <td><a title="Display all errors" href="alltests-errors.html"><xsl:value-of select="$errorCount"/></a></td>
+ <td><a title="Display all skipped test" href="alltests-skipped.html"><xsl:value-of select="$skippedCount" /></a></td>
+ <td>
+ <xsl:call-template name="display-percent">
+ <xsl:with-param name="value" select="$successRate"/>
+ </xsl:call-template>
+ </td>
+ <td>
+ <xsl:call-template name="display-time">
+ <xsl:with-param name="value" select="$timeCount"/>
+ </xsl:call-template>
+ </td>
+ </tr>
+ </table>
+ <table border="0" width="95%">
+ <tr>
+ <td style="text-align: justify;">
+ Note: <em>failures</em> are anticipated and checked for with assertions while <em>errors</em> are unanticipated.
+ </td>
+ </tr>
+ </table>
+
+ <h2>Packages</h2>
+ <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
+ <xsl:call-template name="testsuite.test.header"/>
+ <xsl:for-each select="testsuite[not(./@package = preceding-sibling::testsuite/@package)]">
+ <xsl:sort select="@package" order="ascending"/>
+ <!-- get the node set containing all testsuites that have the same package -->
+ <xsl:variable name="insamepackage" select="/testsuites/testsuite[./@package = current()/@package]"/>
+ <tr valign="top">
+ <!-- display a failure if there is any failure/error in the package -->
+ <xsl:attribute name="class">
+ <xsl:choose>
+ <xsl:when test="sum($insamepackage/@errors) &gt; 0">Error</xsl:when>
+ <xsl:when test="sum($insamepackage/@failures) &gt; 0">Failure</xsl:when>
+ <xsl:otherwise>Pass</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <td><a href="./{translate(@package,'.','/')}/package-summary.html">
+ <xsl:value-of select="@package"/>
+ <xsl:if test="@package = ''">&lt;none&gt;</xsl:if>
+ </a></td>
+ <td><xsl:value-of select="sum($insamepackage/@tests)"/></td>
+ <td><xsl:value-of select="sum($insamepackage/@errors)"/></td>
+ <td><xsl:value-of select="sum($insamepackage/@failures)"/></td>
+ <td><xsl:value-of select="sum($insamepackage/@skipped)" /></td>
+ <td>
+ <xsl:call-template name="display-time">
+ <xsl:with-param name="value" select="sum($insamepackage/@time)"/>
+ </xsl:call-template>
+ </td>
+ <td><xsl:value-of select="$insamepackage/@timestamp"/></td>
+ <td><xsl:value-of select="$insamepackage/@hostname"/></td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </body>
+ </html>
+</xsl:template>
+
+
+<xsl:template name="package.summary">
+ <xsl:param name="name"/>
+ <html>
+ <head>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name" select="$name"/>
+ </xsl:call-template>
+ </head>
+ <body>
+ <xsl:attribute name="onload">open('package-frame.html','classListFrame')</xsl:attribute>
+ <xsl:call-template name="pageHeader"/>
+ <h3>Package <xsl:value-of select="$name"/></h3>
+
+ <!--table border="0" cellpadding="5" cellspacing="2" width="95%">
+ <xsl:call-template name="class.metrics.header"/>
+ <xsl:apply-templates select="." mode="print.metrics"/>
+ </table-->
+
+ <xsl:variable name="insamepackage" select="/testsuites/testsuite[./@package = $name]"/>
+ <xsl:if test="count($insamepackage) &gt; 0">
+ <h2>Classes</h2>
+ <p>
+ <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
+ <xsl:call-template name="testsuite.test.header"/>
+ <xsl:apply-templates select="$insamepackage" mode="print.test">
+ <xsl:sort select="@name"/>
+ </xsl:apply-templates>
+ </table>
+ </p>
+ </xsl:if>
+ </body>
+ </html>
+</xsl:template>
+
+
+<!--
+ transform string like a.b.c to ../../../
+ @param path the path to transform into a descending directory path
+-->
+<xsl:template name="path">
+ <xsl:param name="path"/>
+ <xsl:if test="contains($path,'.')">
+ <xsl:text>../</xsl:text>
+ <xsl:call-template name="path">
+ <xsl:with-param name="path"><xsl:value-of select="substring-after($path,'.')"/></xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="not(contains($path,'.')) and not($path = '')">
+ <xsl:text>../</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+
+<!-- create the link to the stylesheet based on the package name -->
+<xsl:template name="create.stylesheet.link">
+ <xsl:param name="package.name"/>
+ <link rel="stylesheet" type="text/css" title="Style"><xsl:attribute name="href"><xsl:if test="not($package.name = 'unnamed package')"><xsl:call-template name="path"><xsl:with-param name="path" select="$package.name"/></xsl:call-template></xsl:if>stylesheet.css</xsl:attribute></link>
+</xsl:template>
+
+
+<!-- Page HEADER -->
+<xsl:template name="pageHeader">
+ <h1><xsl:value-of select="$TITLE"/></h1>
+ <table width="100%">
+ <tr>
+ <td align="left"></td>
+ <td align="right">Designed for use with <a href="http://www.junit.org/">JUnit</a> and <a href="http://ant.apache.org/">Ant</a>.</td>
+ </tr>
+ </table>
+ <hr size="1"/>
+</xsl:template>
+
+<!-- class header -->
+<xsl:template name="testsuite.test.header">
+ <tr valign="top">
+ <th width="80%">Name</th>
+ <th>Tests</th>
+ <th>Errors</th>
+ <th>Failures</th>
+ <th>Skipped</th>
+ <th nowrap="nowrap">Time(s)</th>
+ <th nowrap="nowrap">Time Stamp</th>
+ <th>Host</th>
+ </tr>
+</xsl:template>
+
+<!-- method header -->
+<xsl:template name="testcase.test.header">
+ <xsl:param name="show.class" select="''"/>
+ <tr valign="top">
+ <xsl:if test="boolean($show.class)">
+ <th>Class</th>
+ </xsl:if>
+ <th>Name</th>
+ <th>Status</th>
+ <th width="80%">Type</th>
+ <th nowrap="nowrap">Time(s)</th>
+ </tr>
+</xsl:template>
+
+
+<!-- class information -->
+<xsl:template match="testsuite" mode="print.test">
+ <tr valign="top">
+ <xsl:attribute name="class">
+ <xsl:choose>
+ <xsl:when test="@errors[.&gt; 0]">Error</xsl:when>
+ <xsl:when test="@failures[.&gt; 0]">Failure</xsl:when>
+ <xsl:otherwise>Pass</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <td><a title="Display all tests" href="{@id}_{@name}.html"><xsl:value-of select="@name"/></a></td>
+ <td><a title="Display all tests" href="{@id}_{@name}.html"><xsl:apply-templates select="@tests"/></a></td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="@errors != 0">
+ <a title="Display only errors" href="{@id}_{@name}-errors.html"><xsl:apply-templates select="@errors"/></a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="@errors"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="@failures != 0">
+ <a title="Display only failures" href="{@id}_{@name}-fails.html"><xsl:apply-templates select="@failures"/></a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="@failures"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="@skipped != 0">
+ <a title="Display only skipped tests" href="{@id}_{@name}-skipped.html"><xsl:apply-templates select="@skipped"/></a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates select="@skipped"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ <td><xsl:call-template name="display-time">
+ <xsl:with-param name="value" select="@time"/>
+ </xsl:call-template>
+ </td>
+ <td><xsl:apply-templates select="@timestamp"/></td>
+ <td><xsl:apply-templates select="@hostname"/></td>
+ </tr>
+</xsl:template>
+
+<xsl:template match="testcase" mode="print.test">
+ <xsl:param name="show.class" select="''"/>
+ <tr valign="top">
+ <xsl:attribute name="class">
+ <xsl:choose>
+ <xsl:when test="error">Error</xsl:when>
+ <xsl:when test="failure">Failure</xsl:when>
+ <xsl:otherwise>TableRowColor</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:variable name="class.href">
+ <xsl:value-of select="concat(translate(../@package,'.','/'), '/', ../@id, '_', ../@name, '.html')"/>
+ </xsl:variable>
+ <xsl:if test="boolean($show.class)">
+ <td><a href="{$class.href}"><xsl:value-of select="../@name"/></a></td>
+ </xsl:if>
+ <td>
+ <a name="{@name}"/>
+ <xsl:choose>
+ <xsl:when test="boolean($show.class)">
+ <a href="{concat($class.href, '#', @name)}"><xsl:value-of select="@name"/></a>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@name"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ <xsl:choose>
+ <xsl:when test="failure">
+ <td>Failure</td>
+ <td><xsl:apply-templates select="failure"/></td>
+ </xsl:when>
+ <xsl:when test="error">
+ <td>Error</td>
+ <td><xsl:apply-templates select="error"/></td>
+ </xsl:when>
+ <xsl:when test="skipped">
+ <td>Skipped</td>
+ <td><xsl:apply-templates select="skipped"/></td>
+ </xsl:when>
+ <xsl:otherwise>
+ <td>Success</td>
+ <td></td>
+ </xsl:otherwise>
+ </xsl:choose>
+ <td>
+ <xsl:call-template name="display-time">
+ <xsl:with-param name="value" select="@time"/>
+ </xsl:call-template>
+ </td>
+ </tr>
+</xsl:template>
+
+
+<!-- Note : the below template skipped, error and failure are the same style
+ so just call the same style store in the toolkit template -->
+<xsl:template match="failure">
+ <xsl:call-template name="display-failures"/>
+</xsl:template>
+
+<xsl:template match="error">
+ <xsl:call-template name="display-failures"/>
+</xsl:template>
+
+<xsl:template match="skipped">
+ <xsl:call-template name="display-failures"/>
+</xsl:template>
+
+<!-- Style for the error and failure in the testcase template -->
+<xsl:template name="display-failures">
+ <xsl:choose>
+ <xsl:when test="not(@message)">N/A</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@message"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <!-- display the stacktrace -->
+ <br/><br/>
+ <code>
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word" select="."/>
+ </xsl:call-template>
+ </code>
+ <!-- the latter is better but might be problematic for non-21" monitors... -->
+ <!--pre><xsl:value-of select="."/></pre-->
+</xsl:template>
+
+<xsl:template name="JS-escape">
+ <xsl:param name="string"/>
+ <xsl:param name="tmp1" select="string:replaceAll(string:new(string($string)),'\\','\\\\')"/>
+ <xsl:param name="tmp2" select="string:replaceAll(string:new(string($tmp1)),&quot;'&quot;,&quot;\\&apos;&quot;)"/>
+ <xsl:param name="tmp3" select="string:replaceAll(string:new(string($tmp2)),&quot;&#10;&quot;,'\\n')"/>
+ <xsl:param name="tmp4" select="string:replaceAll(string:new(string($tmp3)),&quot;&#13;&quot;,'\\r')"/>
+ <xsl:value-of select="$tmp4"/>
+</xsl:template>
+
+
+<!--
+ template that will convert a carriage return into a br tag
+ @param word the text from which to convert CR to BR tag
+-->
+<xsl:template name="br-replace">
+ <xsl:param name="word"/>
+ <xsl:param name="splitlimit">32</xsl:param>
+ <xsl:variable name="secondhalflen" select="(string-length($word)+(string-length($word) mod 2)) div 2"/>
+ <xsl:variable name="secondhalfword" select="substring($word, $secondhalflen)"/>
+ <!-- When word is very big, a recursive replace is very heap/stack expensive, so subdivide on line break after middle of string -->
+ <xsl:choose>
+ <xsl:when test="(string-length($word) > $splitlimit) and (contains($secondhalfword, '&#xa;'))">
+ <xsl:variable name="secondhalfend" select="substring-after($secondhalfword, '&#xa;')"/>
+ <xsl:variable name="firsthalflen" select="string-length($word) - $secondhalflen"/>
+ <xsl:variable name="firsthalfword" select="substring($word, 1, $firsthalflen)"/>
+ <xsl:variable name="firsthalfend" select="substring-before($secondhalfword, '&#xa;')"/>
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word" select="concat($firsthalfword,$firsthalfend)"/>
+ </xsl:call-template>
+ <br/>
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word" select="$secondhalfend"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="contains($word, '&#xa;')">
+ <xsl:value-of select="substring-before($word, '&#xa;')"/>
+ <br/>
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word" select="substring-after($word, '&#xa;')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$word"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="display-time">
+ <xsl:param name="value"/>
+ <xsl:value-of select="format-number($value,'0.000')"/>
+</xsl:template>
+
+<xsl:template name="display-percent">
+ <xsl:param name="value"/>
+ <xsl:value-of select="format-number($value,'0.00%')"/>
+</xsl:template>
+</xsl:stylesheet>
diff --git a/love2dToAPK/tools/tools/ant/etc/junit-noframes.xsl b/love2dToAPK/tools/tools/ant/etc/junit-noframes.xsl
new file mode 100644
index 0000000..bd7002a
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/etc/junit-noframes.xsl
@@ -0,0 +1,513 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:lxslt="http://xml.apache.org/xslt"
+ xmlns:string="xalan://java.lang.String">
+<xsl:output method="html" indent="yes" encoding="UTF-8"
+ doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" />
+<xsl:decimal-format decimal-separator="." grouping-separator="," />
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+ -->
+
+<xsl:param name="TITLE">Unit Test Results.</xsl:param>
+
+<!--
+
+ Sample stylesheet to be used with Ant JUnitReport output.
+
+ It creates a non-framed report that can be useful to send via
+ e-mail or such.
+
+-->
+<xsl:template match="testsuites">
+ <html>
+ <head>
+ <title><xsl:value-of select="$TITLE"/></title>
+ <style type="text/css">
+ body {
+ font:normal 68% verdana,arial,helvetica;
+ color:#000000;
+ }
+ table tr td, table tr th {
+ font-size: 68%;
+ }
+ table.details tr th{
+ font-weight: bold;
+ text-align:left;
+ background:#a6caf0;
+ }
+ table.details tr td{
+ background:#eeeee0;
+ }
+
+ p {
+ line-height:1.5em;
+ margin-top:0.5em; margin-bottom:1.0em;
+ }
+ h1 {
+ margin: 0px 0px 5px; font: 165% verdana,arial,helvetica
+ }
+ h2 {
+ margin-top: 1em; margin-bottom: 0.5em; font: bold 125% verdana,arial,helvetica
+ }
+ h3 {
+ margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica
+ }
+ h4 {
+ margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
+ }
+ h5 {
+ margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
+ }
+ h6 {
+ margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
+ }
+ .Error {
+ font-weight:bold; color:red;
+ }
+ .Failure {
+ font-weight:bold; color:purple;
+ }
+ .Properties {
+ text-align:right;
+ }
+ </style>
+ <script type="text/javascript" language="JavaScript">
+ var TestCases = new Array();
+ var cur;
+ <xsl:for-each select="./testsuite">
+ <xsl:apply-templates select="properties"/>
+ </xsl:for-each>
+
+ </script>
+ <script type="text/javascript" language="JavaScript"><![CDATA[
+ function displayProperties (name) {
+ var win = window.open('','JUnitSystemProperties','scrollbars=1,resizable=1');
+ var doc = win.document;
+ doc.open();
+ doc.write("<html><head><title>Properties of " + name + "</title>");
+ doc.write("<style>")
+ doc.write("body {font:normal 68% verdana,arial,helvetica; color:#000000; }");
+ doc.write("table tr td, table tr th { font-size: 68%; }");
+ doc.write("table.properties { border-collapse:collapse; border-left:solid 1 #cccccc; border-top:solid 1 #cccccc; padding:5px; }");
+ doc.write("table.properties th { text-align:left; border-right:solid 1 #cccccc; border-bottom:solid 1 #cccccc; background-color:#eeeeee; }");
+ doc.write("table.properties td { font:normal; text-align:left; border-right:solid 1 #cccccc; border-bottom:solid 1 #cccccc; background-color:#fffffff; }");
+ doc.write("h3 { margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica }");
+ doc.write("</style>");
+ doc.write("</head><body>");
+ doc.write("<h3>Properties of " + name + "</h3>");
+ doc.write("<div align=\"right\"><a href=\"javascript:window.close();\">Close</a></div>");
+ doc.write("<table class='properties'>");
+ doc.write("<tr><th>Name</th><th>Value</th></tr>");
+ for (prop in TestCases[name]) {
+ doc.write("<tr><th>" + prop + "</th><td>" + TestCases[name][prop] + "</td></tr>");
+ }
+ doc.write("</table>");
+ doc.write("</body></html>");
+ doc.close();
+ win.focus();
+ }
+ ]]>
+ </script>
+ </head>
+ <body>
+ <a name="top"></a>
+ <xsl:call-template name="pageHeader"/>
+
+ <!-- Summary part -->
+ <xsl:call-template name="summary"/>
+ <hr size="1" width="95%" align="left"/>
+
+ <!-- Package List part -->
+ <xsl:call-template name="packagelist"/>
+ <hr size="1" width="95%" align="left"/>
+
+ <!-- For each package create its part -->
+ <xsl:call-template name="packages"/>
+ <hr size="1" width="95%" align="left"/>
+
+ <!-- For each class create the part -->
+ <xsl:call-template name="classes"/>
+
+ </body>
+ </html>
+</xsl:template>
+
+
+
+ <!-- ================================================================== -->
+ <!-- Write a list of all packages with an hyperlink to the anchor of -->
+ <!-- of the package name. -->
+ <!-- ================================================================== -->
+ <xsl:template name="packagelist">
+ <h2>Packages</h2>
+ Note: package statistics are not computed recursively, they only sum up all of its testsuites numbers.
+ <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
+ <xsl:call-template name="testsuite.test.header"/>
+ <!-- list all packages recursively -->
+ <xsl:for-each select="./testsuite[not(./@package = preceding-sibling::testsuite/@package)]">
+ <xsl:sort select="@package"/>
+ <xsl:variable name="testsuites-in-package" select="/testsuites/testsuite[./@package = current()/@package]"/>
+ <xsl:variable name="testCount" select="sum($testsuites-in-package/@tests)"/>
+ <xsl:variable name="errorCount" select="sum($testsuites-in-package/@errors)"/>
+ <xsl:variable name="failureCount" select="sum($testsuites-in-package/@failures)"/>
+ <xsl:variable name="skippedCount" select="sum($testsuites-in-package/@skipped)" />
+ <xsl:variable name="timeCount" select="sum($testsuites-in-package/@time)"/>
+
+ <!-- write a summary for the package -->
+ <tr valign="top">
+ <!-- set a nice color depending if there is an error/failure -->
+ <xsl:attribute name="class">
+ <xsl:choose>
+ <xsl:when test="$failureCount &gt; 0">Failure</xsl:when>
+ <xsl:when test="$errorCount &gt; 0">Error</xsl:when>
+ </xsl:choose>
+ </xsl:attribute>
+ <td><a href="#{@package}"><xsl:value-of select="@package"/></a></td>
+ <td><xsl:value-of select="$testCount"/></td>
+ <td><xsl:value-of select="$errorCount"/></td>
+ <td><xsl:value-of select="$failureCount"/></td>
+ <td><xsl:value-of select="$skippedCount" /></td>
+ <td>
+ <xsl:call-template name="display-time">
+ <xsl:with-param name="value" select="$timeCount"/>
+ </xsl:call-template>
+ </td>
+ <td><xsl:value-of select="$testsuites-in-package/@timestamp"/></td>
+ <td><xsl:value-of select="$testsuites-in-package/@hostname"/></td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </xsl:template>
+
+
+ <!-- ================================================================== -->
+ <!-- Write a package level report -->
+ <!-- It creates a table with values from the document: -->
+ <!-- Name | Tests | Errors | Failures | Time -->
+ <!-- ================================================================== -->
+ <xsl:template name="packages">
+ <!-- create an anchor to this package name -->
+ <xsl:for-each select="/testsuites/testsuite[not(./@package = preceding-sibling::testsuite/@package)]">
+ <xsl:sort select="@package"/>
+ <a name="{@package}"></a>
+ <h3>Package <xsl:value-of select="@package"/></h3>
+
+ <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
+ <xsl:call-template name="testsuite.test.header"/>
+
+ <!-- match the testsuites of this package -->
+ <xsl:apply-templates select="/testsuites/testsuite[./@package = current()/@package]" mode="print.test"/>
+ </table>
+ <a href="#top">Back to top</a>
+ <p/>
+ <p/>
+ </xsl:for-each>
+ </xsl:template>
+
+ <xsl:template name="classes">
+ <xsl:for-each select="testsuite">
+ <xsl:sort select="@name"/>
+ <!-- create an anchor to this class name -->
+ <a name="{@name}"></a>
+ <h3>TestCase <xsl:value-of select="@name"/></h3>
+
+ <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
+ <xsl:call-template name="testcase.test.header"/>
+ <!--
+ test can even not be started at all (failure to load the class)
+ so report the error directly
+ -->
+ <xsl:if test="./error">
+ <tr class="Error">
+ <td colspan="4"><xsl:apply-templates select="./error"/></td>
+ </tr>
+ </xsl:if>
+ <xsl:apply-templates select="./testcase" mode="print.test"/>
+ </table>
+ <div class="Properties">
+ <a>
+ <xsl:attribute name="href">javascript:displayProperties('<xsl:value-of select="@package"/>.<xsl:value-of select="@name"/>');</xsl:attribute>
+ Properties &#187;
+ </a>
+ </div>
+ <p/>
+
+ <a href="#top">Back to top</a>
+ </xsl:for-each>
+ </xsl:template>
+
+ <xsl:template name="summary">
+ <h2>Summary</h2>
+ <xsl:variable name="testCount" select="sum(testsuite/@tests)"/>
+ <xsl:variable name="errorCount" select="sum(testsuite/@errors)"/>
+ <xsl:variable name="failureCount" select="sum(testsuite/@failures)"/>
+ <xsl:variable name="skippedCount" select="sum(testsuite/@skipped)" />
+ <xsl:variable name="timeCount" select="sum(testsuite/@time)"/>
+ <xsl:variable name="successRate" select="($testCount - $failureCount - $errorCount) div $testCount"/>
+ <table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
+ <tr valign="top">
+ <th>Tests</th>
+ <th>Failures</th>
+ <th>Errors</th>
+ <th>Skipped</th>
+ <th>Success rate</th>
+ <th>Time</th>
+ </tr>
+ <tr valign="top">
+ <xsl:attribute name="class">
+ <xsl:choose>
+ <xsl:when test="$failureCount &gt; 0">Failure</xsl:when>
+ <xsl:when test="$errorCount &gt; 0">Error</xsl:when>
+ </xsl:choose>
+ </xsl:attribute>
+ <td><xsl:value-of select="$testCount"/></td>
+ <td><xsl:value-of select="$failureCount"/></td>
+ <td><xsl:value-of select="$errorCount"/></td>
+ <td><xsl:value-of select="$skippedCount" /></td>
+ <td>
+ <xsl:call-template name="display-percent">
+ <xsl:with-param name="value" select="$successRate"/>
+ </xsl:call-template>
+ </td>
+ <td>
+ <xsl:call-template name="display-time">
+ <xsl:with-param name="value" select="$timeCount"/>
+ </xsl:call-template>
+ </td>
+
+ </tr>
+ </table>
+ <table border="0" width="95%">
+ <tr>
+ <td style="text-align: justify;">
+ Note: <i>failures</i> are anticipated and checked for with assertions while <i>errors</i> are unanticipated.
+ </td>
+ </tr>
+ </table>
+ </xsl:template>
+
+ <!--
+ Write properties into a JavaScript data structure.
+ This is based on the original idea by Erik Hatcher (ehatcher@apache.org)
+ -->
+ <xsl:template match="properties">
+ cur = TestCases['<xsl:value-of select="../@package"/>.<xsl:value-of select="../@name"/>'] = new Array();
+ <xsl:for-each select="property">
+ <xsl:sort select="@name"/>
+ cur['<xsl:value-of select="@name"/>'] = '<xsl:call-template name="JS-escape"><xsl:with-param name="string" select="@value"/></xsl:call-template>';
+ </xsl:for-each>
+ </xsl:template>
+
+<!-- Page HEADER -->
+<xsl:template name="pageHeader">
+ <h1><xsl:value-of select="$TITLE"/></h1>
+ <table width="100%">
+ <tr>
+ <td align="left"></td>
+ <td align="right">Designed for use with <a href='http://www.junit.org'>JUnit</a> and <a href='http://ant.apache.org/ant'>Ant</a>.</td>
+ </tr>
+ </table>
+ <hr size="1"/>
+</xsl:template>
+
+<xsl:template match="testsuite" mode="header">
+ <tr valign="top">
+ <th width="80%">Name</th>
+ <th>Tests</th>
+ <th>Errors</th>
+ <th>Failures</th>
+ <th>Skipped</th>
+ <th nowrap="nowrap">Time(s)</th>
+ </tr>
+</xsl:template>
+
+<!-- class header -->
+<xsl:template name="testsuite.test.header">
+ <tr valign="top">
+ <th width="80%">Name</th>
+ <th>Tests</th>
+ <th>Errors</th>
+ <th>Failures</th>
+ <th>Skipped</th>
+ <th nowrap="nowrap">Time(s)</th>
+ <th nowrap="nowrap">Time Stamp</th>
+ <th>Host</th>
+ </tr>
+</xsl:template>
+
+<!-- method header -->
+<xsl:template name="testcase.test.header">
+ <tr valign="top">
+ <th>Name</th>
+ <th>Status</th>
+ <th width="80%">Type</th>
+ <th nowrap="nowrap">Time(s)</th>
+ </tr>
+</xsl:template>
+
+
+<!-- class information -->
+<xsl:template match="testsuite" mode="print.test">
+ <tr valign="top">
+ <!-- set a nice color depending if there is an error/failure -->
+ <xsl:attribute name="class">
+ <xsl:choose>
+ <xsl:when test="@failures[.&gt; 0]">Failure</xsl:when>
+ <xsl:when test="@errors[.&gt; 0]">Error</xsl:when>
+ </xsl:choose>
+ </xsl:attribute>
+
+ <!-- print testsuite information -->
+ <td><a href="#{@name}"><xsl:value-of select="@name"/></a></td>
+ <td><xsl:value-of select="@tests"/></td>
+ <td><xsl:value-of select="@errors"/></td>
+ <td><xsl:value-of select="@failures"/></td>
+ <td><xsl:value-of select="@skipped" /></td>
+ <td>
+ <xsl:call-template name="display-time">
+ <xsl:with-param name="value" select="@time"/>
+ </xsl:call-template>
+ </td>
+ <td><xsl:apply-templates select="@timestamp"/></td>
+ <td><xsl:apply-templates select="@hostname"/></td>
+ </tr>
+</xsl:template>
+
+<xsl:template match="testcase" mode="print.test">
+ <tr valign="top">
+ <xsl:attribute name="class">
+ <xsl:choose>
+ <xsl:when test="failure | error">Error</xsl:when>
+ </xsl:choose>
+ </xsl:attribute>
+ <td><xsl:value-of select="@name"/></td>
+ <xsl:choose>
+ <xsl:when test="failure">
+ <td>Failure</td>
+ <td><xsl:apply-templates select="failure"/></td>
+ </xsl:when>
+ <xsl:when test="error">
+ <td>Error</td>
+ <td><xsl:apply-templates select="error"/></td>
+ </xsl:when>
+ <xsl:when test="skipped">
+ <td>Skipped</td>
+ <td><xsl:apply-templates select="skipped"/></td>
+ </xsl:when>
+ <xsl:otherwise>
+ <td>Success</td>
+ <td></td>
+ </xsl:otherwise>
+ </xsl:choose>
+ <td>
+ <xsl:call-template name="display-time">
+ <xsl:with-param name="value" select="@time"/>
+ </xsl:call-template>
+ </td>
+ </tr>
+</xsl:template>
+
+
+<xsl:template match="failure">
+ <xsl:call-template name="display-failures"/>
+</xsl:template>
+
+<xsl:template match="error">
+ <xsl:call-template name="display-failures"/>
+</xsl:template>
+
+<xsl:template match="skipped">
+ <xsl:call-template name="display-failures"/>
+</xsl:template>
+
+<!-- Style for the error, failure and skipped in the testcase template -->
+<xsl:template name="display-failures">
+ <xsl:choose>
+ <xsl:when test="not(@message)">N/A</xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@message"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ <!-- display the stacktrace -->
+ <code>
+ <br/><br/>
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word" select="."/>
+ </xsl:call-template>
+ </code>
+ <!-- the later is better but might be problematic for non-21" monitors... -->
+ <!--pre><xsl:value-of select="."/></pre-->
+</xsl:template>
+
+<xsl:template name="JS-escape">
+ <xsl:param name="string"/>
+ <xsl:param name="tmp1" select="string:replaceAll(string:new(string($string)),'\\','\\\\')"/>
+ <xsl:param name="tmp2" select="string:replaceAll(string:new(string($tmp1)),&quot;'&quot;,&quot;\\&apos;&quot;)"/>
+ <xsl:param name="tmp3" select="string:replaceAll(string:new(string($tmp2)),&quot;&#10;&quot;,'\\n')"/>
+ <xsl:param name="tmp4" select="string:replaceAll(string:new(string($tmp3)),&quot;&#13;&quot;,'\\r')"/>
+ <xsl:value-of select="$tmp4"/>
+</xsl:template>
+
+
+<!--
+ template that will convert a carriage return into a br tag
+ @param word the text from which to convert CR to BR tag
+-->
+<xsl:template name="br-replace">
+ <xsl:param name="word"/>
+ <xsl:param name="splitlimit">32</xsl:param>
+ <xsl:variable name="secondhalflen" select="(string-length($word)+(string-length($word) mod 2)) div 2"/>
+ <xsl:variable name="secondhalfword" select="substring($word, $secondhalflen)"/>
+ <!-- When word is very big, a recursive replace is very heap/stack expensive, so subdivide on line break after middle of string -->
+ <xsl:choose>
+ <xsl:when test="(string-length($word) > $splitlimit) and (contains($secondhalfword, '&#xa;'))">
+ <xsl:variable name="secondhalfend" select="substring-after($secondhalfword, '&#xa;')"/>
+ <xsl:variable name="firsthalflen" select="string-length($word) - $secondhalflen"/>
+ <xsl:variable name="firsthalfword" select="substring($word, 1, $firsthalflen)"/>
+ <xsl:variable name="firsthalfend" select="substring-before($secondhalfword, '&#xa;')"/>
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word" select="concat($firsthalfword,$firsthalfend)"/>
+ </xsl:call-template>
+ <br/>
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word" select="$secondhalfend"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="contains($word, '&#xa;')">
+ <xsl:value-of select="substring-before($word, '&#xa;')"/>
+ <br/>
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word" select="substring-after($word, '&#xa;')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$word"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+<xsl:template name="display-time">
+ <xsl:param name="value"/>
+ <xsl:value-of select="format-number($value,'0.000')"/>
+</xsl:template>
+
+<xsl:template name="display-percent">
+ <xsl:param name="value"/>
+ <xsl:value-of select="format-number($value,'0.00%')"/>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/love2dToAPK/tools/tools/ant/etc/log.xsl b/love2dToAPK/tools/tools/ant/etc/log.xsl
new file mode 100644
index 0000000..5040993
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/etc/log.xsl
@@ -0,0 +1,203 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+<xsl:output method="html" indent="yes" encoding="US-ASCII"/>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+
+-->
+
+<!--
+
+ The purpose have this XSL is to provide a nice way to look at the output
+ from the Ant XmlLogger (ie: ant -listener org.apache.tools.ant.XmlLogger )
+
+ @author <a href="mailto:sbailliez@apache.org">Stephane Bailliez</a>
+
+-->
+<xsl:decimal-format decimal-separator="." grouping-separator="," />
+
+<xsl:template match="/">
+<html>
+ <head>
+ <style type="text/css">
+ .bannercell {
+ border: 0px;
+ padding: 0px;
+ }
+ body {
+ margin: 0;
+ font:normal 100% arial,helvetica,sanserif;
+ background-color:#FFFFFF;
+ color:#000000;
+ }
+ table.status {
+ font:bold 80% arial,helvetica,sanserif;
+ background-color:#525D76;
+ color:#ffffff;
+ }
+ table.log tr td, tr th {
+ font-size: 80%;
+ }
+ .error {
+ color:red;
+ }
+ .warn {
+ color:brown;
+ }
+ .info {
+ color:gray;
+ }
+ .debug{
+ color:gray;
+ }
+ .failed {
+ font-size:80%;
+ background-color: red;
+ color:#FFFFFF;
+ font-weight: bold
+ }
+ .complete {
+ font-size:80%;
+ background-color: #525D76;
+ color:#FFFFFF;
+ font-weight: bold
+ }
+ .a td {
+ background: #efefef;
+ }
+ .b td {
+ background: #fff;
+ }
+ th, td {
+ text-align: left;
+ vertical-align: top;
+ }
+ th {
+ background: #ccc;
+ color: black;
+ }
+ table, th, td {
+ border: none
+ }
+ h3 {
+ font:bold 80% arial,helvetica,sanserif;
+ background: #525D76;
+ color: white;
+ text-decoration: none;
+ padding: 5px;
+ margin-right: 2px;
+ margin-left: 2px;
+ margin-bottom: 0;
+ }
+ </style>
+ </head>
+ <body>
+ <!-- jakarta logo -->
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr>
+ <td valign="top" class="bannercell">
+ <a href="http://jakarta.apache.org/">
+ <img src="http://jakarta.apache.org/images/jakarta-logo.gif" alt="http://jakarta.apache.org" align="left" border="0"/>
+ </a>
+ </td>
+ <td style="text-align:right;vertical-align:bottom">
+ <a href="http://ant.apache.org/">Apache Ant</a>
+ </td>
+ </tr>
+ </table>
+
+ <table border="0" width="100%">
+ <tr><td><hr noshade="yes" size="1"/></td></tr>
+ </table>
+
+ <xsl:apply-templates select="build"/>
+
+ </body>
+</html>
+</xsl:template>
+
+<xsl:template match="build">
+ <!-- build status -->
+ <table width="100%">
+ <xsl:attribute name="class">
+ <xsl:if test="@error">failed</xsl:if>
+ <xsl:if test="not(@error)">complete</xsl:if>
+ </xsl:attribute>
+ <tr>
+ <xsl:if test="@error">
+ <td nowrap="yes">Build Failed</td>
+ </xsl:if>
+ <xsl:if test="not(@error)">
+ <td nowrap="yes">Build Complete</td>
+ </xsl:if>
+ <td style="text-align:right" nowrap="yes">Total Time: <xsl:value-of select="@time"/></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <xsl:if test="@error">
+ <tt><xsl:value-of select="@error"/></tt><br/>
+ <i style="font-size:80%">See the <a href="#stacktrace" alt="Click for details">stacktrace</a>.</i>
+ </xsl:if>
+ </td>
+ </tr>
+ </table>
+ <table border="1" cellspacing="2" cellpadding="3" width="100%" style="font-size:80%">
+ <tr class="a"><td width="1">ant.file</td><td><xsl:value-of select="substring-after(//message[contains(text(),'ant.file')], '->')"/></td></tr>
+ <tr class="b"><td width="1">ant.version</td><td><xsl:value-of select="substring-after(//message[contains(text(),'ant.version')], '->')"/></td></tr>
+ <tr class="a"><td width="1">java.version</td><td><xsl:value-of select="substring-after(//message[contains(text(),'java.vm.version')], '->')"/></td></tr>
+ <tr class="b"><td width="1">os.name</td><td><xsl:value-of select="substring-after(//message[contains(text(),'os.name')], '->')"/></td></tr>
+ </table>
+ <!-- build information -->
+ <h3>Build events</h3>
+ <table class="log" border="1" cellspacing="2" cellpadding="3" width="100%">
+ <tr>
+ <th nowrap="yes" align="left" width="1%">target</th>
+ <th nowrap="yes" align="left" width="1%">task</th>
+ <th nowrap="yes" align="left">message</th>
+ </tr>
+ <xsl:apply-templates select=".//message[@priority != 'debug']"/>
+ </table>
+ <p>
+ <!-- stacktrace -->
+ <xsl:if test="stacktrace">
+ <a name="stacktrace"/>
+ <h3>Error details</h3>
+ <table width="100%">
+ <tr><td>
+ <pre><xsl:value-of select="stacktrace"/></pre>
+ </td></tr>
+ </table>
+ </xsl:if>
+ </p>
+</xsl:template>
+
+<!-- report every message but those with debug priority -->
+<xsl:template match="message[@priority!='debug']">
+ <tr valign="top">
+ <!-- alternated row style -->
+ <xsl:attribute name="class">
+ <xsl:if test="position() mod 2 = 1">a</xsl:if>
+ <xsl:if test="position() mod 2 = 0">b</xsl:if>
+ </xsl:attribute>
+ <td nowrap="yes" width="1%"><xsl:value-of select="../../@name"/></td>
+ <td nowrap="yes" style="text-align:right" width="1%">[ <xsl:value-of select="../@name"/> ]</td>
+ <td class="{@priority}" nowrap="yes">
+ <xsl:value-of select="text()"/>
+ </td>
+ </tr>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/love2dToAPK/tools/tools/ant/etc/maudit-frames.xsl b/love2dToAPK/tools/tools/ant/etc/maudit-frames.xsl
new file mode 100644
index 0000000..c81f8dc
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/etc/maudit-frames.xsl
@@ -0,0 +1,502 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:lxslt="http://xml.apache.org/xslt"
+ xmlns:redirect="org.apache.xalan.lib.Redirect"
+ extension-element-prefixes="redirect">
+<xsl:output method="html" indent="yes" encoding="US-ASCII"/>
+<xsl:decimal-format decimal-separator="." grouping-separator="," />
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+-->
+<!--
+
+ Stylesheet to transform an XML file generated by the Ant MAudit task into
+ a set of JavaDoc-like HTML page to make pages more convenient to be browsed.
+
+ It use the Xalan redirect extension to write to multiple output files.
+
+-->
+
+<xsl:param name="output.dir" select="'.'"/>
+
+
+<xsl:template match="classes">
+ <!-- create the index.html -->
+ <redirect:write file="{$output.dir}/index.html">
+ <xsl:call-template name="index.html"/>
+ </redirect:write>
+
+ <!-- create the stylesheet.css -->
+ <redirect:write file="{$output.dir}/stylesheet.css">
+ <xsl:call-template name="stylesheet.css"/>
+ </redirect:write>
+
+ <!-- create the overview-packages.html at the root -->
+ <redirect:write file="{$output.dir}/overview-summary.html">
+ <xsl:apply-templates select="." mode="overview.packages"/>
+ </redirect:write>
+
+ <!-- create the all-packages.html at the root -->
+ <redirect:write file="{$output.dir}/overview-frame.html">
+ <xsl:apply-templates select="." mode="all.packages"/>
+ </redirect:write>
+
+ <!-- create the all-classes.html at the root -->
+ <redirect:write file="{$output.dir}/allclasses-frame.html">
+ <xsl:apply-templates select="." mode="all.classes"/>
+ </redirect:write>
+
+ <!-- process all packages -->
+ <xsl:for-each select="./class[not(./@package = preceding-sibling::class/@package)]">
+ <xsl:call-template name="package">
+ <xsl:with-param name="name" select="@package"/>
+ </xsl:call-template>
+ </xsl:for-each>
+</xsl:template>
+
+
+<xsl:template name="package">
+ <xsl:param name="name"/>
+ <xsl:variable name="package.dir">
+ <xsl:if test="not($name = '')"><xsl:value-of select="translate($name,'.','/')"/></xsl:if>
+ <xsl:if test="$name = ''">.</xsl:if>
+ </xsl:variable>
+ <!--Processing package <xsl:value-of select="@name"/> in <xsl:value-of select="$output.dir"/> -->
+ <!-- create a classes-list.html in the package directory -->
+ <redirect:write file="{$output.dir}/{$package.dir}/package-frame.html">
+ <xsl:call-template name="classes.list">
+ <xsl:with-param name="name" select="$name"/>
+ </xsl:call-template>
+ </redirect:write>
+
+ <!-- create a package-summary.html in the package directory -->
+ <redirect:write file="{$output.dir}/{$package.dir}/package-summary.html">
+ <xsl:call-template name="package.summary">
+ <xsl:with-param name="name" select="$name"/>
+ </xsl:call-template>
+ </redirect:write>
+
+ <!-- for each class, creates a @name.html -->
+ <!-- @bug there will be a problem with inner classes having the same name, it will be overwritten -->
+ <xsl:for-each select="/classes/class[@package = $name]">
+ <redirect:write file="{$output.dir}/{$package.dir}/{@name}.html">
+ <xsl:apply-templates select="." mode="class.details"/>
+ </redirect:write>
+ </xsl:for-each>
+</xsl:template>
+
+<xsl:template name="index.html">
+<HTML>
+ <HEAD><TITLE>Audit Results.</TITLE></HEAD>
+ <FRAMESET cols="20%,80%">
+ <FRAMESET rows="30%,70%">
+ <FRAME src="overview-frame.html" name="packageListFrame"/>
+ <FRAME src="allclasses-frame.html" name="classListFrame"/>
+ </FRAMESET>
+ <FRAME src="overview-summary.html" name="classFrame"/>
+ </FRAMESET>
+ <noframes>
+ <H2>Frame Alert</H2>
+ <P>
+ This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
+ </P>
+ </noframes>
+</HTML>
+</xsl:template>
+
+
+<!-- this is the stylesheet css to use for nearly everything -->
+<xsl:template name="stylesheet.css">
+ .bannercell {
+ border: 0px;
+ padding: 0px;
+ }
+ body {
+ margin-left: 10;
+ margin-right: 10;
+ font:normal 80% arial,helvetica,sanserif;
+ background-color:#FFFFFF;
+ color:#000000;
+ }
+ .a td {
+ background: #efefef;
+ }
+ .b td {
+ background: #fff;
+ }
+ th, td {
+ text-align: left;
+ vertical-align: top;
+ }
+ th {
+ font-weight:bold;
+ background: #ccc;
+ color: black;
+ }
+ table, th, td {
+ font-size:100%;
+ border: none
+ }
+ table.log tr td, tr th {
+
+ }
+ h2 {
+ font-weight:bold;
+ font-size:140%;
+ margin-bottom: 5;
+ }
+ h3 {
+ font-size:100%;
+ font-weight:bold;
+ background: #525D76;
+ color: white;
+ text-decoration: none;
+ padding: 5px;
+ margin-right: 2px;
+ margin-left: 2px;
+ margin-bottom: 0;
+ }
+</xsl:template>
+
+
+<!-- print the violations of the class -->
+<xsl:template match="class" mode="class.details">
+ <xsl:variable name="package.name" select="@package"/>
+ <HTML>
+ <HEAD>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name" select="$package.name"/>
+ </xsl:call-template>
+ </HEAD>
+ <BODY>
+ <xsl:call-template name="pageHeader"/>
+ <H3>Class <xsl:if test="not($package.name = '')"><xsl:value-of select="$package.name"/>.</xsl:if><xsl:value-of select="@name"/></H3>
+
+ <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%">
+ <xsl:call-template name="class.audit.header"/>
+ <xsl:apply-templates select="." mode="print.audit"/>
+ </table>
+
+ <H3>Violations</H3>
+ <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%">
+ <xsl:call-template name="violation.audit.header"/>
+ <xsl:apply-templates select="./violation" mode="print.audit">
+ <xsl:sort data-type="number" select="@line"/>
+ </xsl:apply-templates>
+ </table>
+ <xsl:call-template name="pageFooter"/>
+ </BODY>
+ </HTML>
+</xsl:template>
+
+
+<!-- list of classes in a package -->
+<xsl:template name="classes.list">
+ <xsl:param name="name"/>
+ <HTML>
+ <HEAD>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name" select="$name"/>
+ </xsl:call-template>
+ </HEAD>
+ <BODY>
+ <table width="100%">
+ <tr>
+ <td nowrap="nowrap">
+ <H2><a href="package-summary.html" target="classFrame"><xsl:value-of select="$name"/></a></H2>
+ </td>
+ </tr>
+ </table>
+
+ <h2>Classes</h2>
+ <TABLE WIDTH="100%">
+ <xsl:apply-templates select="/classes/class[./@package = $name]" mode="classes.list">
+ <xsl:sort select="@name"/>
+ </xsl:apply-templates>
+ </TABLE>
+ </BODY>
+ </HTML>
+</xsl:template>
+<!-- the class to list -->
+<xsl:template match="class" mode="classes.list">
+ <tr>
+ <td nowrap="nowrap">
+ <!-- @bug naming to fix for inner classes -->
+ <a href="{@name}.html" target="classFrame"><xsl:value-of select="@name"/></a>
+ </td>
+ </tr>
+</xsl:template>
+
+
+<!--
+ Creates an all-classes.html file that contains a link to all package-summary.html
+ on each class.
+-->
+<xsl:template match="classes" mode="all.classes">
+ <html>
+ <head>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name"/>
+ </xsl:call-template>
+ </head>
+ <body>
+ <h2>Classes</h2>
+ <table width="100%">
+ <xsl:apply-templates select=".//class" mode="all.classes">
+ <xsl:sort select="@name"/>
+ </xsl:apply-templates>
+ </table>
+ </body>
+ </html>
+</xsl:template>
+
+<xsl:template match="class" mode="all.classes">
+ <!-- (ancestor::package)[last()] is buggy in MSXML3 ? -->
+ <xsl:variable name="package.name" select="@package"/>
+ <tr>
+ <td nowrap="nowrap">
+ <a target="classFrame">
+ <xsl:attribute name="href">
+ <xsl:if test="not($package.name='')">
+ <xsl:value-of select="translate($package.name,'.','/')"/><xsl:text>/</xsl:text>
+ </xsl:if><xsl:value-of select="@name"/><xsl:text>.html</xsl:text>
+ </xsl:attribute>
+ <xsl:value-of select="@name"/>
+ </a>
+ </td>
+ </tr>
+</xsl:template>
+
+
+<!--
+ Creates an html file that contains a link to all package-summary.html files on
+ each package existing on testsuites.
+ @bug there will be a problem here, I don't know yet how to handle unnamed package :(
+-->
+<xsl:template match="classes" mode="all.packages">
+ <html>
+ <head>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name"/>
+ </xsl:call-template>
+ </head>
+ <body>
+ <h2><a href="overview-summary.html" target="classFrame">Home</a></h2>
+ <h2>Packages</h2>
+ <table width="100%">
+ <xsl:apply-templates select="class[not(./@package = preceding-sibling::class/@package)]" mode="all.packages">
+ <xsl:sort select="@package" order="ascending"/>
+ </xsl:apply-templates>
+ </table>
+ </body>
+ </html>
+</xsl:template>
+
+<xsl:template match="class" mode="all.packages">
+ <tr>
+ <td nowrap="nowrap">
+ <a href="{translate(@package,'.','/')}/package-summary.html" target="classFrame">
+ <xsl:value-of select="@package"/>
+ </a>
+ </td>
+ </tr>
+</xsl:template>
+
+
+<xsl:template match="classes" mode="overview.packages">
+ <html>
+ <head>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name"/>
+ </xsl:call-template>
+ </head>
+ <body onload="open('allclasses-frame.html','classListFrame')">
+ <xsl:call-template name="pageHeader"/>
+ <h3>Summary</h3>
+ <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%">
+ <tr>
+ <th>Audited classes</th>
+ <th>Reported classes</th>
+ <th>Violations</th>
+ </tr>
+ <tr class="a">
+ <td><xsl:value-of select="@audited"/></td>
+ <td><xsl:value-of select="@reported"/></td>
+ <td><xsl:value-of select="@violations"/></td>
+ </tr>
+ </table>
+ <table border="0" width="100%">
+ <tr>
+ <td style="text-align: justify;">
+ Note: Rules checked have originated from style guidelines suggested by the language designers,
+ experience from the Java development community and insite experience. Violations are generally
+ reported with a reference to the <a href="http://java.sun.com/docs/books/jls/second_edition/html/jTOC.doc.html">Java Language Specifications</a> (JLS x.x.x)
+ and Metamata Audit rules (x.x).
+ Please consult these documents for additional information about violations.
+ <p/>
+ Rules checked also enforce adherence to <a href="http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html">Sun Java coding guidelines</a> in use at Jakarta.
+ <p/>
+ One should note that these violations do not necessary underline errors but should be used
+ as an indication for <i>possible</i> errors. As always, use your best judgment and review
+ them carefully, it might save you hours of debugging.
+ </td>
+ </tr>
+ </table>
+
+ <h3>Packages</h3>
+ <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%">
+ <xsl:call-template name="class.audit.header"/>
+ <xsl:for-each select="class[not(./@package = preceding-sibling::class/@package)]">
+ <xsl:sort select="@package" order="ascending"/>
+ <tr>
+ <xsl:call-template name="alternate-row"/>
+ <td><a href="{translate(@package,'.','/')}/package-summary.html"><xsl:value-of select="@package"/></a></td>
+ <td><xsl:value-of select="sum(/classes/class[./@package = current()/@package]/@violations)"/></td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ <xsl:call-template name="pageFooter"/>
+ </body>
+ </html>
+</xsl:template>
+
+
+<xsl:template name="package.summary">
+ <xsl:param name="name"/>
+ <HTML>
+ <HEAD>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name" select="$name"/>
+ </xsl:call-template>
+ </HEAD>
+ <BODY>
+ <xsl:attribute name="onload">open('package-frame.html','classListFrame')</xsl:attribute>
+ <xsl:call-template name="pageHeader"/>
+ <h3>Package <xsl:value-of select="$name"/></h3>
+
+ <!--table border="0" cellpadding="5" cellspacing="2" width="100%">
+ <xsl:call-template name="class.metrics.header"/>
+ <xsl:apply-templates select="." mode="print.metrics"/>
+ </table-->
+
+ <xsl:if test="count(/classes/class[./@package = $name]) &gt; 0">
+ <H3>Classes</H3>
+ <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%">
+ <xsl:call-template name="class.audit.header"/>
+ <xsl:apply-templates select="/classes/class[./@package = $name]" mode="print.audit">
+ <xsl:sort select="@name"/>
+ </xsl:apply-templates>
+ </table>
+ </xsl:if>
+ <xsl:call-template name="pageFooter"/>
+ </BODY>
+ </HTML>
+</xsl:template>
+
+
+<!--
+ transform string like a.b.c to ../../../
+ @param path the path to transform into a descending directory path
+-->
+<xsl:template name="path">
+ <xsl:param name="path"/>
+ <xsl:if test="contains($path,'.')">
+ <xsl:text>../</xsl:text>
+ <xsl:call-template name="path">
+ <xsl:with-param name="path"><xsl:value-of select="substring-after($path,'.')"/></xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="not(contains($path,'.')) and not($path = '')">
+ <xsl:text>../</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+
+<!-- create the link to the stylesheet based on the package name -->
+<xsl:template name="create.stylesheet.link">
+ <xsl:param name="package.name"/>
+ <LINK REL ="stylesheet" TYPE="text/css" TITLE="Style"><xsl:attribute name="href"><xsl:if test="not($package.name = 'unnamed package')"><xsl:call-template name="path"><xsl:with-param name="path" select="$package.name"/></xsl:call-template></xsl:if>stylesheet.css</xsl:attribute></LINK>
+</xsl:template>
+
+<!-- Page HEADER -->
+<xsl:template name="pageHeader">
+
+ <!-- jakarta logo -->
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr>
+ <td class="bannercell" rowspan="2">
+ <a href="http://jakarta.apache.org/">
+ <img src="http://jakarta.apache.org/images/jakarta-logo.gif" alt="http://jakarta.apache.org" align="left" border="0"/>
+ </a>
+ </td>
+ <td style="text-align:right"><h2>Source Code Audit</h2></td>
+ </tr>
+ <tr>
+ <td style="text-align:right">Designed for use with <a href='http://www.webgain.com/products/quality_analyzer/'>Webgain QA/Metamata Audit</a> and <a href='http://jakarta.apache.org'>Ant</a>.</td>
+ </tr>
+ </table>
+ <hr size="1"/>
+</xsl:template>
+
+<!-- Page HEADER -->
+<xsl:template name="pageFooter">
+</xsl:template>
+
+
+<!-- class header -->
+<xsl:template name="class.audit.header">
+ <tr>
+ <th width="80%">Name</th>
+ <th>Violations</th>
+ </tr>
+</xsl:template>
+
+<!-- method header -->
+<xsl:template name="violation.audit.header">
+ <tr>
+ <th>Line</th>
+ <th>Message</th>
+ </tr>
+</xsl:template>
+
+
+<!-- class information -->
+<xsl:template match="class" mode="print.audit">
+ <tr>
+ <xsl:call-template name="alternate-row"/>
+ <td><a href="{@name}.html"><xsl:value-of select="@name"/></a></td>
+ <td><xsl:apply-templates select="@violations"/></td>
+ </tr>
+</xsl:template>
+
+<xsl:template match="violation" mode="print.audit">
+ <tr>
+ <xsl:call-template name="alternate-row"/>
+ <td><xsl:value-of select="@line"/></td>
+ <td><xsl:apply-templates select="@message"/></td>
+ </tr>
+</xsl:template>
+
+<!-- alternated row style -->
+<xsl:template name="alternate-row">
+<xsl:attribute name="class">
+ <xsl:if test="position() mod 2 = 1">a</xsl:if>
+ <xsl:if test="position() mod 2 = 0">b</xsl:if>
+</xsl:attribute>
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/love2dToAPK/tools/tools/ant/etc/mmetrics-frames.xsl b/love2dToAPK/tools/tools/ant/etc/mmetrics-frames.xsl
new file mode 100644
index 0000000..2b0f6b8
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/etc/mmetrics-frames.xsl
@@ -0,0 +1,1023 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+ xmlns:lxslt="http://xml.apache.org/xslt"
+ xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:redirect="org.apache.xalan.lib.Redirect"
+ exclude-result-prefixes="xalan"
+ extension-element-prefixes="redirect">
+<xsl:output method="html" indent="yes" encoding="US-ASCII"/>
+<xsl:decimal-format decimal-separator="." grouping-separator="," />
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+-->
+<xsl:param name="output.dir" select="'.'"/>
+
+<!-- default max value for the metrics -->
+<xsl:param name="vg.max" select="10"/>
+<xsl:param name="loc.max" select="1000"/>
+<xsl:param name="dit.max" select="10"/>
+<xsl:param name="noa.max" select="250"/>
+<xsl:param name="nrm.max" select="50"/>
+<xsl:param name="nlm.max" select="250"/>
+<xsl:param name="wmc.max" select="250"/>
+<xsl:param name="rfc.max" select="50"/>
+<xsl:param name="dac.max" select="10"/>
+<xsl:param name="fanout.max" select="10"/>
+<xsl:param name="cbo.max" select="15"/>
+<xsl:param name="lcom.max" select="10"/>
+<xsl:param name="nocl.max" select="10"/>
+
+
+<!-- create a tree fragment to speed up processing -->
+<xsl:variable name="doctree.var">
+ <xsl:element name="classes">
+ <xsl:for-each select=".//class">
+ <xsl:element name="class">
+ <xsl:attribute name="package">
+ <xsl:value-of select="(ancestor::package)[last()]/@name"/>
+ </xsl:attribute>
+ <xsl:copy-of select="@*"/>
+ <xsl:attribute name="name">
+ <xsl:apply-templates select="." mode="class.name"/>
+ </xsl:attribute>
+ <xsl:copy-of select="method"/>
+ </xsl:element>
+ </xsl:for-each>
+ </xsl:element>
+</xsl:variable>
+
+<xsl:variable name="doctree" select="xalan:nodeset($doctree.var)"/>
+
+<xsl:template match="metrics">
+
+ <!-- create the index.html -->
+ <redirect:write file="{$output.dir}/index.html">
+ <xsl:call-template name="index.html"/>
+ </redirect:write>
+
+ <!-- create the stylesheet.css -->
+ <redirect:write file="{$output.dir}/stylesheet.css">
+ <xsl:call-template name="stylesheet.css"/>
+ </redirect:write>
+
+ <redirect:write file="{$output.dir}/metrics-reference.html">
+ <xsl:call-template name="metrics-reference.html"/>
+ </redirect:write>
+
+ <!-- create the overview-packages.html at the root -->
+ <redirect:write file="{$output.dir}/overview-summary.html">
+ <xsl:apply-templates select="." mode="overview.packages"/>
+ </redirect:write>
+
+ <!-- create the all-packages.html at the root -->
+ <redirect:write file="{$output.dir}/overview-frame.html">
+ <xsl:apply-templates select="." mode="all.packages"/>
+ </redirect:write>
+
+ <!-- create the all-classes.html at the root -->
+ <redirect:write file="{$output.dir}/allclasses-frame.html">
+ <xsl:apply-templates select="." mode="all.classes"/>
+ </redirect:write>
+
+ <!-- process all packages -->
+ <xsl:apply-templates select=".//package"/>
+</xsl:template>
+
+
+<xsl:template match="package">
+ <xsl:variable name="package.name" select="@name"/>
+ <xsl:variable name="package.dir">
+ <xsl:if test="not($package.name = 'unnamed package')"><xsl:value-of select="translate($package.name,'.','/')"/></xsl:if>
+ <xsl:if test="$package.name = 'unnamed package'">.</xsl:if>
+ </xsl:variable>
+ <!-- create a classes-list.html in the package directory -->
+ <redirect:write file="{$output.dir}/{$package.dir}/package-frame.html">
+ <xsl:apply-templates select="." mode="classes.list"/>
+ </redirect:write>
+
+ <!-- create a package-summary.html in the package directory -->
+ <redirect:write file="{$output.dir}/{$package.dir}/package-summary.html">
+ <xsl:apply-templates select="." mode="package.summary"/>
+ </redirect:write>
+
+ <!-- for each class, creates a @name.html -->
+ <!-- @bug there will be a problem with inner classes having the same name, it will be overwritten -->
+ <xsl:for-each select="$doctree/classes/class[@package = current()/@name]">
+ <!--Processing <xsl:value-of select="$class.name"/><xsl:text>&#10;</xsl:text> -->
+ <redirect:write file="{$output.dir}/{$package.dir}/{@name}.html">
+ <xsl:apply-templates select="." mode="class.details"/>
+ </redirect:write>
+ </xsl:for-each>
+</xsl:template>
+
+<!-- little trick to compute the classname for inner and non inner classes -->
+<!-- this is all in one line to avoid CRLF in the name -->
+<xsl:template match="class" mode="class.name">
+ <xsl:if test="parent::class"><xsl:apply-templates select="parent::class" mode="class.name"/>.<xsl:value-of select="@name"/></xsl:if><xsl:if test="not(parent::class)"><xsl:value-of select="@name"/></xsl:if>
+</xsl:template>
+
+
+<xsl:template name="index.html">
+<HTML>
+ <HEAD><TITLE>Metrics Results.</TITLE></HEAD>
+ <FRAMESET cols="20%,80%">
+ <FRAMESET rows="30%,70%">
+ <FRAME src="overview-frame.html" name="packageListFrame"/>
+ <FRAME src="allclasses-frame.html" name="classListFrame"/>
+ </FRAMESET>
+ <FRAME src="overview-summary.html" name="classFrame"/>
+ </FRAMESET>
+ <noframes>
+ <H2>Frame Alert</H2>
+ <P>
+ This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
+ </P>
+ </noframes>
+</HTML>
+</xsl:template>
+
+<!-- this is the stylesheet css to use for nearly everything -->
+<xsl:template name="metrics-reference.html">
+<html>
+<head>
+<link title="Style" type="text/css" rel="stylesheet" href="stylesheet.css"/>
+</head>
+<body style="text-align:justify;">
+<h2>Metrics Reference</h2>
+<a href="#V(G)">V(G)</a> |
+<a href="#LOC">LOC</a> |
+<a href="#DIT">DIT</a> |
+<a href="#NOA">NOA</a> |
+<a href="#NRM">NRM</a> |
+<a href="#NLM">NLM</a> |
+<a href="#WMC">WMC</a> |
+<a href="#RFC">RFC</a> |
+<a href="#DAC">DAC</a> |
+<a href="#FANOUT">FANOUT</a> |
+<a href="#CBO">CBO</a> |
+<a href="#LCOM">LCOM</a> |
+<a href="#NOC">NOC</a>
+
+<a name="V(G)"/>
+<h3>Cyclomatic Complexity - V(G)</h3>
+This metric was introduced in the 1970s to measure the amount of control
+flow complexity or branching complexity in a module such as a
+subroutine. It gives the number of paths that may be taken through the
+code, and was initially developed to give some measure of the cost of
+producing a test case for the module by executing each path.
+<p/>
+Methods with a high cyclomatic complexity tend to be more difficult to
+understand and maintain. In general the more complex the methods of an
+application, the more difficult it will be to test it, and this will adversely
+affect its reliability.
+<p/>
+V(G) is a measure of the control flow complexity of a method or
+constructor. It counts the number of branches in the body of the method,
+defined as:
+<ul>
+<li>while statements;</li>
+<li>if statements;</li>
+<li>for statements.</li>
+</ul>
+
+The metric can also be configured to count each case of a switch
+statement as well.
+
+<a name="LOC"/>
+<h3>Lines of Code - LOC</h3>
+
+This is perhaps the simplest of all the metrics to define and compute.
+Counting lines has a long history as a software metric dating from before
+the rise of structured programming, and it is still in widespread use today.
+The size of a method affects the ease with which it can be understood, its
+reusability and its maintainability. There are a variety of ways that the size
+can be calculated. These include counting all the lines of code, the number
+of statements, the blank lines of code, the lines of commentary, and the
+lines consisting only of syntax such as block delimiters.
+<p/>
+This metric can also be used for sizing other constructs as well, for
+example, the overall size of a Java class or package can be measured by
+counting the number of source lines it consists of.
+<p/>
+LOC can be used to determine the size of a compilation unit (source file),
+class or interface, method, constructor, or field. It can be configured to
+ignore:
+<ul>
+<li>blank lines;</li>
+<li>lines consisting only of comments;</li>
+<li>lines consisting only of opening and closing braces.</li>
+</ul>
+
+<a name="DIT"/>
+<h3>Depth of Inheritance Hierarchy - DIT</h3>
+
+This metric calculates how far down the inheritance hierarchy a class is
+declared. In Java all classes have java.lang.Object as their ultimate
+superclass, which is defined to have a depth of 1. So a class that
+immediately extends java.lang.Object has a metric value of 2; any of its
+subclasses will have a value of 3, and so on.
+<p/>
+A class that is deep within the tree inherits more methods and state
+variables, thereby increasing its complexity and making it difficult to
+predict its behavior. It can be harder to understand a system with many
+inheritance layers.
+<p/>
+DIT is defined for classes and interfaces:
+<ul>
+<li>all interface types have a depth of 1;</li>
+<li>the class java.lang.Object has a depth of 1;</li>
+<li>all other classes have a depth of 1 + the depth of their super class.</li>
+</ul>
+
+<a name="NOA"/>
+<h3>Number of Attributes - NOA</h3>
+
+The number of distinct state variables in a class serves as one measure of
+its complexity. The more state a class represents the more difficult it is to
+maintain invariants for it. It also hinders comprehensibility and reuse.
+<p/>
+In Java, state can be exposed to subclasses through protected fields, which
+entails that the subclass also be aware of and maintain any invariants. This
+interference with the class's data encapsulation can be a source of defects
+and hidden dependencies between the state variables.
+<p/>
+NOA is defined for classes and interfaces. It counts the number of fields
+declared in the class or interface.
+
+<a name="NRM"/>
+<h3>Number of Remote Methods - NRM</h3>
+
+NRM is defined for classes. A remote method call is defined as an
+invocation of a method that is not declared in any of:
+<ul>
+<li>the class itself;</li>
+<li>a class or interface that the class extends or implements;</li>
+<li>a class or method that extends the class.</li>
+</ul>
+
+The value is the count of all the remote method calls in all of the methods
+and constructors of the class.
+
+<a name="NLM"/>
+<h3>Number of Local Methods - NLM</h3>
+
+NLM is defined for classes and interfaces. A local method is defined as a
+method that is declared in the class or interface. NLM can be configured to
+include the local methods of all of the class's superclasses. Methods with
+public, protected, package and private visibility can be independently
+counted by setting configuration parameters.
+
+<a name="WMC"/>
+<h3>Weighted Methods per Class - WMC</h3>
+
+If the number of methods in a class can be determined during the design
+and modeling phase of a project, it can be used as a predictor of how
+much time and effort is needed to develop, debug and maintain it. This
+metric can be further refined by incorporating a weighting for the
+complexity of each method. The usual weighting is given by the cyclomatic
+complexity of the method.
+<p/>
+The subclasses of a class inherit all of its public and protected methods,
+and possibly its package methods as well, so the number of methods a
+class has directly impacts the complexity of its subclasses. Classes with
+large numbers of methods are often specific to a particular application,
+reducing the ability to reuse them.
+<p/>
+The definition of WMC is based upon NLM, and it provides the same
+configuration parameters for counting inherited methods and of varying
+visibility. The main difference is that NLM always counts each method as 1,
+whereas WMC will weight each method. There are two weighting schemes:
+<ul>
+<li>V(G) the cyclomatic complexity of the method is used as its weight.
+ Methods from class files are given a V(G) of 1.</li>
+<li>the arity, or the number of parameters of the method are used to
+ determine the weight.</li>
+</ul>
+
+<a name="RFC"/>
+<h3>Response For Class - RFC</h3>
+
+The response set of a class is the set of all methods that can be invoked as
+a result of a message sent to an object of the class. This includes methods
+in the class's inheritance hierarchy and methods that can be invoked on
+other objects. The Response For Class metric is defined to be size of the
+response set for the class. A class which provides a larger response set is
+considered to be more complex than one with a smaller response set.
+<p/>
+One reason for this is that if a method call on a class can result in a large
+number of different method calls on the target and other classes, then it
+can be harder to test the behavior of the class and debug problems. It will
+typically require a deeper understanding of the potential interactions that
+objects of the class can have with the rest of the system.
+<p/>
+RFC is defined as the sum of NLM and NRM for the class. The local methods
+include all of the public, protected, package and private methods, but not
+methods declared only in a superclass.
+
+<a name="DAC"/>
+<h3>Data Abstraction Coupling - DAC</h3>
+
+DAC is defined for classes and interfaces. It counts the number of reference
+types that are used in the field declarations of the class or interface. The
+component types of arrays are also counted. Any field with a type that is
+either a supertype or a subtype of the class is not counted.
+
+<a name="FANOUT"/>
+<h3>Fan Out - FANOUT</h3>
+
+FANOUT is defined for classes and interfaces, constructors and methods. It
+counts the number of reference types that are used in:
+<ul>
+<li>field declarations;</li>
+<li>formal parameters and return types;</li>
+<li>throws declarations;</li>
+<li>local variables.</li>
+</ul>
+
+The component types of arrays are also counted. Any type that is either a
+supertype or a subtype of the class is not counted.
+
+<a name="CBO"/>
+<h3>Coupling Between Objects - CBO</h3>
+
+When one object or class uses another object or class they are said to be
+coupled. One major source of coupling is that between a superclass and a
+subclass. A coupling is also introduced when a method or field in another
+class is accessed, or when an object of another class is passed into or out
+of a method invocation. Coupling Between Objects is a measure of the
+non-inheritance coupling between two objects.
+<p/>
+A high value of coupling reduces the modularity of the class and makes
+reuse more difficult. The more independent a class is the more likely it is
+that it will be possible to reuse it in another part of the system. When a
+class is coupled to another class it becomes sensitive to changes in that
+class, thereby making maintenance for difficult. In addition, a class that is
+overly dependent on other classes can be difficult to understand and test in
+isolation.
+<p/>
+CBO is defined for classes and interfaces, constructors and methods. It
+counts the number of reference types that are used in:
+<ul>
+<li>field declarations</li>
+<li>formal parameters and return types</li>
+<li>throws declarations</li>
+<li>local variables</li>
+</ul>
+
+It also counts:
+<ul>
+<li>types from which field and method selections are made</li>
+</ul>
+
+The component types of arrays are also counted. Any type that is either a
+supertype or a subtype of the class is not counted.
+
+<a name="LCOM"/>
+<h3>Lack of Cohesion Of Methods - LCOM</h3>
+
+The cohesion of a class is the degree to which its methods are related to
+each other. It is determined by examining the pattern of state variable
+accesses within the set of methods. If all the methods access the same state
+variables then they have high cohesion; if they access disjoint sets of
+variables then the cohesion is low. An extreme example of low cohesion
+would be if none of the methods accessed any of the state variables.
+
+If a class exhibits low method cohesion it indicates that the design of the
+class has probably been partitioned incorrectly, and could benefit by being
+split into more classes with individually higher cohesion. On the other
+hand, a high value of cohesion (a low lack of cohesion) implies that the
+class is well designed. A cohesive class will tend to provide a high degree
+of encapsulation, whereas a lack of cohesion decreases encapsulation and
+increases complexity.
+<p/>
+Another form of cohesion that is useful for Java programs is cohesion
+between nested and enclosing classes. A nested class that has very low
+cohesion with its enclosing class would probably better designed as a peer
+class rather than a nested class.
+<p/>
+LCOM is defined for classes. Operationally, LCOM takes each pair of
+methods in the class and determines the set of fields they each access. If
+they have disjoint sets of field accesses increase the count P by one. If they
+share at least one field access then increase Q by one. After considering
+each pair of methods,
+LCOM = (P > Q) ? (P - Q) : 0
+<p/>
+Indirect access to fields via local methods can be considered by setting a
+metric configuration parameter.
+
+<a name="NOC"/>
+<h3>Number Of Classes - NOC</h3>
+
+The overall size of the system can be estimated by calculating the number
+of classes it contains. A large system with more classes is more complex
+than a smaller one because the number of potential interactions between
+objects is higher. This reduces the comprehensibility of the system which
+in turn makes it harder to test, debug and maintain.
+<p/>
+If the number of classes in the system can be projected during the initial
+design phase of the project it can serve as a base for estimating the total
+effort and cost of developing, debugging and maintaining the system.
+<p/>
+The NOC metric can also usefully be applied at the package and class level
+as well as the total system.
+<p/>
+NOCL is defined for class and interfaces. It counts the number of classes or
+interfaces that are declared. This is usually 1, but nested class declarations
+will increase this number.
+</body>
+</html>
+</xsl:template>
+
+<!-- this is the stylesheet css to use for nearly everything -->
+<xsl:template name="stylesheet.css">
+ .bannercell {
+ border: 0px;
+ padding: 0px;
+ }
+ body {
+ margin-left: 10;
+ margin-right: 10;
+ font:normal 80% arial,helvetica,sanserif;
+ background-color:#FFFFFF;
+ color:#000000;
+ }
+ .a td {
+ background: #efefef;
+ }
+ .b td {
+ background: #fff;
+ }
+ th, td {
+ text-align: left;
+ vertical-align: top;
+ }
+ th {
+ font-weight:bold;
+ background: #ccc;
+ color: black;
+ }
+ table, th, td {
+ font-size:100%;
+ border: none
+ }
+ table.log tr td, tr th {
+
+ }
+ h2 {
+ font-weight:bold;
+ font-size:140%;
+ margin-bottom: 5;
+ }
+ h3 {
+ font-size:100%;
+ font-weight:bold;
+ background: #525D76;
+ color: white;
+ text-decoration: none;
+ padding: 5px;
+ margin-right: 2px;
+ margin-left: 2px;
+ margin-bottom: 0;
+ }
+ .Error {
+ font-weight:bold; color:red;
+ }
+
+</xsl:template>
+
+<!-- print the metrics of the class -->
+<xsl:template match="class" mode="class.details">
+ <!--xsl:variable name="package.name" select="(ancestor::package)[last()]/@name"/-->
+ <xsl:variable name="package.name" select="@package"/>
+ <HTML>
+ <HEAD>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name" select="$package.name"/>
+ </xsl:call-template>
+ </HEAD>
+ <BODY>
+ <xsl:call-template name="pageHeader"/>
+
+ <H3>Class <xsl:if test="not($package.name = 'unnamed package')"><xsl:value-of select="$package.name"/>.</xsl:if><xsl:value-of select="@name"/></H3>
+ <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%">
+ <xsl:call-template name="all.metrics.header"/>
+ <xsl:apply-templates select="." mode="print.metrics"/>
+ </table>
+
+ <H3>Methods</H3>
+ <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%">
+ <xsl:call-template name="method.metrics.header"/>
+ <xsl:apply-templates select="method" mode="print.metrics"/>
+ </table>
+
+ <xsl:call-template name="pageFooter"/>
+ </BODY>
+ </HTML>
+</xsl:template>
+
+
+<!-- list of classes in a package -->
+<xsl:template match="package" mode="classes.list">
+ <HTML>
+ <HEAD>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name" select="@name"/>
+ </xsl:call-template>
+ </HEAD>
+ <BODY>
+ <table width="100%">
+ <tr>
+ <td nowrap="nowrap">
+ <H2><a href="package-summary.html" target="classFrame"><xsl:value-of select="@name"/></a></H2>
+ </td>
+ </tr>
+ </table>
+
+ <H2>Classes</H2>
+ <TABLE WIDTH="100%">
+ <!-- xalan-nodeset:nodeset for Xalan 1.2.2 -->
+ <xsl:for-each select="$doctree/classes/class[@package = current()/@name]">
+ <xsl:sort select="@name"/>
+ <tr>
+ <td nowrap="nowrap">
+ <a href="{@name}.html" target="classFrame"><xsl:value-of select="@name"/></a>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </TABLE>
+ </BODY>
+ </HTML>
+</xsl:template>
+
+
+<!--
+ Creates an all-classes.html file that contains a link to all package-summary.html
+ on each class.
+-->
+<xsl:template match="metrics" mode="all.classes">
+ <html>
+ <head>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name" select="''"/>
+ </xsl:call-template>
+ </head>
+ <body>
+ <h2>Classes</h2>
+ <table width="100%">
+ <xsl:for-each select="$doctree/classes/class">
+ <xsl:sort select="@name"/>
+ <xsl:apply-templates select="." mode="all.classes"/>
+ </xsl:for-each>
+ </table>
+ </body>
+ </html>
+</xsl:template>
+
+<xsl:template match="class" mode="all.classes">
+ <xsl:variable name="package.name" select="@package"/>
+ <xsl:variable name="class.name" select="@name"/>
+ <tr>
+ <td nowrap="nowrap">
+ <a target="classFrame">
+ <xsl:attribute name="href">
+ <xsl:if test="not($package.name='unnamed package')">
+ <xsl:value-of select="translate($package.name,'.','/')"/><xsl:text>/</xsl:text>
+ </xsl:if>
+ <xsl:value-of select="$class.name"/><xsl:text>.html</xsl:text>
+ </xsl:attribute>
+ <xsl:value-of select="$class.name"/>
+ </a>
+ </td>
+ </tr>
+</xsl:template>
+
+<!--
+ Creates an html file that contains a link to all package-summary.html files on
+ each package existing on testsuites.
+ @bug there will be a problem here, I don't know yet how to handle unnamed package :(
+-->
+<xsl:template match="metrics" mode="all.packages">
+ <html>
+ <head>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name" select="./package/@name"/>
+ </xsl:call-template>
+ </head>
+ <body>
+ <h2><a href="overview-summary.html" target="classFrame">Home</a></h2>
+ <h2>Packages</h2>
+ <table width="100%">
+ <xsl:apply-templates select=".//package[not(./@name = 'unnamed package')]" mode="all.packages">
+ <xsl:sort select="@name"/>
+ </xsl:apply-templates>
+ </table>
+ </body>
+ </html>
+</xsl:template>
+
+<xsl:template match="package" mode="all.packages">
+ <tr>
+ <td nowrap="nowrap">
+ <a href="{translate(@name,'.','/')}/package-summary.html" target="classFrame">
+ <xsl:value-of select="@name"/>
+ </a>
+ </td>
+ </tr>
+</xsl:template>
+
+
+<xsl:template match="metrics" mode="overview.packages">
+ <html>
+ <head>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name" select="''"/>
+ </xsl:call-template>
+ </head>
+ <body onload="open('allclasses-frame.html','classListFrame')">
+ <xsl:call-template name="pageHeader"/>
+ <h3>Summary</h3>
+ <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%">
+ <tr>
+ <th><a href="metrics-reference.html#V(G)">V(G)</a></th>
+ <th><a href="metrics-reference.html#LOC">LOC</a></th>
+ <th><a href="metrics-reference.html#DIT">DIT</a></th>
+ <th><a href="metrics-reference.html#NOA">NOA</a></th>
+ <th><a href="metrics-reference.html#NRM">NRM</a></th>
+ <th><a href="metrics-reference.html#NLM">NLM</a></th>
+ <th><a href="metrics-reference.html#WMC">WMC</a></th>
+ <th><a href="metrics-reference.html#RFC">RFC</a></th>
+ <th><a href="metrics-reference.html#DAC">DAC</a></th>
+ <th><a href="metrics-reference.html#FANOUT">FANOUT</a></th>
+ <th><a href="metrics-reference.html#CBO">CBO</a></th>
+ <th><a href="metrics-reference.html#LCOM">LCOM</a></th>
+ <th><a href="metrics-reference.html#NOCL">NOCL</a></th>
+ </tr>
+ <xsl:apply-templates select="." mode="print.metrics"/>
+ </table>
+ <table border="0" width="100%">
+ <tr>
+ <td style="text-align: justify;">
+ Note: Metrics evaluate the quality of software by analyzing the program source and quantifying
+ various kind of complexity. Complexity is a common source of problems and defects in software.
+ High complexity makes it more difficult to develop, understand, maintain, extend, test and debug
+ a program.
+ <p/>
+ The primary use of metrics is to focus your attention on those parts of code that potentially are
+ complexity hot spots. Once the complex areas your program have been uncovered, you can take remedial
+ actions.
+ For additional information about metrics and their meaning, please consult
+ Metamata Metrics manual.
+ </td>
+ </tr>
+ </table>
+
+ <h3>Packages</h3>
+ <table border="0" cellpadding="5" cellspacing="2" width="100%">
+ <xsl:call-template name="all.metrics.header"/>
+ <xsl:for-each select=".//package[not(@name = 'unnamed package')]">
+ <xsl:sort select="@name" order="ascending"/>
+ <xsl:apply-templates select="." mode="print.metrics"/>
+ </xsl:for-each>
+ </table>
+ <!-- @bug there could some classes at this level (classes in unnamed package) -->
+ <xsl:call-template name="pageFooter"/>
+ </body>
+ </html>
+</xsl:template>
+
+<xsl:template match="package" mode="package.summary">
+ <HTML>
+ <HEAD>
+ <xsl:call-template name="create.stylesheet.link">
+ <xsl:with-param name="package.name" select="@name"/>
+ </xsl:call-template>
+ </HEAD>
+ <body onload="open('package-frame.html','classListFrame')">
+ <xsl:call-template name="pageHeader"/>
+ <!-- create an anchor to this package name -->
+ <h3>Package <xsl:value-of select="@name"/></h3>
+
+ <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%">
+ <xsl:call-template name="all.metrics.header"/>
+ <xsl:apply-templates select="." mode="print.metrics"/>
+ </table>
+
+ <table border="0" width="100%">
+ <tr>
+ <td style="text-align: justify;">
+ Note: Metrics evaluate the quality of software by analyzing the program source and quantifying
+ various kind of complexity. Complexity is a common source of problems and defects in software.
+ High complexity makes it more difficult to develop, understand, maintain, extend, test and debug
+ a program.
+ <p/>
+ The primary use of metrics is to focus your attention on those parts of code that potentially are
+ complexity hot spots. Once the complex areas your program have been uncovered, you can take remedial
+ actions.
+ For additional information about metrics and their meaning, please consult
+ Metamata Metrics manual.
+ </td>
+ </tr>
+ </table>
+
+ <xsl:variable name="classes-in-package" select="$doctree/classes/class[@package = current()/@name]"/>
+ <xsl:if test="count($classes-in-package) &gt; 0">
+ <H3>Classes</H3>
+ <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%">
+ <xsl:call-template name="all.metrics.header"/>
+ <xsl:for-each select="$classes-in-package">
+ <xsl:sort select="@name"/>
+ <xsl:apply-templates select="." mode="print.metrics"/>
+ </xsl:for-each>
+ </table>
+ </xsl:if>
+
+ <xsl:call-template name="pageFooter"/>
+ </body>
+ </HTML>
+</xsl:template>
+
+
+<!--
+ transform string like a.b.c to ../../../
+ @param path the path to transform into a descending directory path
+-->
+<xsl:template name="path">
+ <xsl:param name="path"/>
+ <xsl:if test="contains($path,'.')">
+ <xsl:text>../</xsl:text>
+ <xsl:call-template name="path">
+ <xsl:with-param name="path"><xsl:value-of select="substring-after($path,'.')"/></xsl:with-param>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="not(contains($path,'.')) and not($path = '')">
+ <xsl:text>../</xsl:text>
+ </xsl:if>
+</xsl:template>
+
+
+<!-- create the link to the stylesheet based on the package name -->
+<xsl:template name="create.stylesheet.link">
+ <xsl:param name="package.name"/>
+ <LINK REL ="stylesheet" TYPE="text/css" TITLE="Style"><xsl:attribute name="href"><xsl:if test="not($package.name = 'unnamed package')"><xsl:call-template name="path"><xsl:with-param name="path" select="$package.name"/></xsl:call-template></xsl:if>stylesheet.css</xsl:attribute></LINK>
+</xsl:template>
+
+
+<!-- Page Header -->
+<xsl:template name="pageHeader">
+
+ <!-- jakarta logo -->
+ <table border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr>
+ <td class="bannercell" rowspan="2">
+ <a href="http://jakarta.apache.org/">
+ <img src="http://jakarta.apache.org/images/jakarta-logo.gif" alt="http://jakarta.apache.org" align="left" border="0"/>
+ </a>
+ </td>
+ <td style="text-align:right"><h2>Source Code Metrics</h2></td>
+ </tr>
+ <tr>
+ <td style="text-align:right">Designed for use with <a href='http://www.webgain.com/products/quality_analyzer/'>Webgain QA/Metamata Metrics</a> and <a href='http://jakarta.apache.org'>Ant</a>.</td>
+ </tr>
+ </table>
+ <hr size="1"/>
+</xsl:template>
+
+<!-- Page Footer -->
+<xsl:template name="pageFooter">
+</xsl:template>
+
+<!-- class header -->
+<xsl:template name="all.metrics.header">
+ <tr>
+ <th width="80%">Name</th>
+ <th nowrap="nowrap">V(G)</th>
+ <th>LOC</th>
+ <th>DIT</th>
+ <th>NOA</th>
+ <th>NRM</th>
+ <th>NLM</th>
+ <th>WMC</th>
+ <th>RFC</th>
+ <th>DAC</th>
+ <th>FANOUT</th>
+ <th>CBO</th>
+ <th>LCOM</th>
+ <th>NOCL</th>
+ </tr>
+</xsl:template>
+
+<!-- method header -->
+<xsl:template name="method.metrics.header">
+ <tr>
+ <th width="80%">Name</th>
+ <th nowrap="nowrap">V(G)</th>
+ <th>LOC</th>
+ <th>FANOUT</th>
+ <th>CBO</th>
+ </tr>
+</xsl:template>
+
+<!-- method information -->
+<xsl:template match="method" mode="print.metrics">
+ <tr>
+ <xsl:call-template name="alternate-row"/>
+ <td><xsl:apply-templates select="@name"/></td>
+ <td><xsl:apply-templates select="@vg"/></td>
+ <td><xsl:apply-templates select="@loc"/></td>
+ <td><xsl:apply-templates select="@fanout"/></td>
+ <td><xsl:apply-templates select="@cbo"/></td>
+ </tr>
+</xsl:template>
+
+<!-- class information -->
+<xsl:template match="class" mode="print.metrics">
+ <tr>
+ <xsl:call-template name="alternate-row"/>
+ <td><a href="{@name}.html"><xsl:value-of select="@name"/></a></td>
+ <td><xsl:apply-templates select="@vg"/></td>
+ <td><xsl:apply-templates select="@loc"/></td>
+ <td><xsl:apply-templates select="@dit"/></td>
+ <td><xsl:apply-templates select="@noa"/></td>
+ <td><xsl:apply-templates select="@nrm"/></td>
+ <td><xsl:apply-templates select="@nlm"/></td>
+ <td><xsl:apply-templates select="@wmc"/></td>
+ <td><xsl:apply-templates select="@rfc"/></td>
+ <td><xsl:apply-templates select="@dac"/></td>
+ <td><xsl:apply-templates select="@fanout"/></td>
+ <td><xsl:apply-templates select="@cbo"/></td>
+ <td><xsl:apply-templates select="@lcom"/></td>
+ <td><xsl:apply-templates select="@nocl"/></td>
+ </tr>
+</xsl:template>
+
+<xsl:template match="file|package" mode="print.metrics">
+ <tr>
+ <xsl:call-template name="alternate-row"/>
+ <td>
+ <a href="{translate(@name,'.','/')}/package-summary.html" target="classFrame">
+ <xsl:value-of select="@name"/>
+ </a>
+ </td>
+ <td><xsl:apply-templates select="@vg"/></td>
+ <td><xsl:apply-templates select="@loc"/></td>
+ <td><xsl:apply-templates select="@dit"/></td>
+ <td><xsl:apply-templates select="@noa"/></td>
+ <td><xsl:apply-templates select="@nrm"/></td>
+ <td><xsl:apply-templates select="@nlm"/></td>
+ <td><xsl:apply-templates select="@wmc"/></td>
+ <td><xsl:apply-templates select="@rfc"/></td>
+ <td><xsl:apply-templates select="@dac"/></td>
+ <td><xsl:apply-templates select="@fanout"/></td>
+ <td><xsl:apply-templates select="@cbo"/></td>
+ <td><xsl:apply-templates select="@lcom"/></td>
+ <td><xsl:apply-templates select="@nocl"/></td>
+ </tr>
+</xsl:template>
+
+<xsl:template match="metrics" mode="print.metrics">
+ <tr>
+ <xsl:call-template name="alternate-row"/>
+ <!-- the global metrics is the top package metrics -->
+ <td><xsl:apply-templates select="./package/@vg"/></td>
+ <td><xsl:apply-templates select="./package/@loc"/></td>
+ <td><xsl:apply-templates select="./package/@dit"/></td>
+ <td><xsl:apply-templates select="./package/@noa"/></td>
+ <td><xsl:apply-templates select="./package/@nrm"/></td>
+ <td><xsl:apply-templates select="./package/@nlm"/></td>
+ <td><xsl:apply-templates select="./package/@wmc"/></td>
+ <td><xsl:apply-templates select="./package/@rfc"/></td>
+ <td><xsl:apply-templates select="./package/@dac"/></td>
+ <td><xsl:apply-templates select="./package/@fanout"/></td>
+ <td><xsl:apply-templates select="./package/@cbo"/></td>
+ <td><xsl:apply-templates select="./package/@lcom"/></td>
+ <td><xsl:apply-templates select="./package/@nocl"/></td>
+ </tr>
+</xsl:template>
+
+<!-- alternated row style -->
+<xsl:template name="alternate-row">
+<xsl:attribute name="class">
+ <xsl:if test="position() mod 2 = 1">a</xsl:if>
+ <xsl:if test="position() mod 2 = 0">b</xsl:if>
+</xsl:attribute>
+</xsl:template>
+
+
+<!-- how to display the metrics with their max value -->
+<!-- @todo the max values must be external to the xsl -->
+
+ <xsl:template match="@vg">
+ <xsl:call-template name="display-value">
+ <xsl:with-param name="value" select="current()"/>
+ <xsl:with-param name="max" select="$vg.max"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match="@loc">
+ <xsl:call-template name="display-value">
+ <xsl:with-param name="value" select="current()"/>
+ <xsl:with-param name="max" select="$loc.max"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match="@dit">
+ <xsl:call-template name="display-value">
+ <xsl:with-param name="value" select="current()"/>
+ <xsl:with-param name="max" select="$dit.max"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match="@noa">
+ <xsl:call-template name="display-value">
+ <xsl:with-param name="value" select="current()"/>
+ <xsl:with-param name="max" select="$noa.max"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match="@nrm">
+ <xsl:call-template name="display-value">
+ <xsl:with-param name="value" select="current()"/>
+ <xsl:with-param name="max" select="$nrm.max"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match="@nlm">
+ <xsl:call-template name="display-value">
+ <xsl:with-param name="value" select="current()"/>
+ <xsl:with-param name="max" select="$nlm.max"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match="@wmc">
+ <xsl:call-template name="display-value">
+ <xsl:with-param name="value" select="current()"/>
+ <xsl:with-param name="max" select="$wmc.max"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match="@rfc">
+ <xsl:call-template name="display-value">
+ <xsl:with-param name="value" select="current()"/>
+ <xsl:with-param name="max" select="$rfc.max"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match="@dac">
+ <xsl:call-template name="display-value">
+ <xsl:with-param name="value" select="current()"/>
+ <xsl:with-param name="max" select="$dac.max"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match="@fanout">
+ <xsl:call-template name="display-value">
+ <xsl:with-param name="value" select="current()"/>
+ <xsl:with-param name="max" select="$fanout.max"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match="@cbo">
+ <xsl:call-template name="display-value">
+ <xsl:with-param name="value" select="current()"/>
+ <xsl:with-param name="max" select="$cbo.max"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match="@lcom">
+ <xsl:call-template name="display-value">
+ <xsl:with-param name="value" select="current()"/>
+ <xsl:with-param name="max" select="$lcom.max"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match="@nocl">
+ <xsl:call-template name="display-value">
+ <xsl:with-param name="value" select="current()"/>
+ <xsl:with-param name="max" select="$nocl.max"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template name="display-value">
+ <xsl:param name="value"/>
+ <xsl:param name="max"/>
+ <xsl:if test="$value > $max">
+ <xsl:attribute name="class">Error</xsl:attribute>
+ </xsl:if>
+ <xsl:value-of select="$value"/>
+ </xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/love2dToAPK/tools/tools/ant/etc/tagdiff.xsl b/love2dToAPK/tools/tools/ant/etc/tagdiff.xsl
new file mode 100644
index 0000000..5d430a7
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/etc/tagdiff.xsl
@@ -0,0 +1,179 @@
+<?xml version="1.0"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+-->
+<!-- a stylesheet to display changelogs ala netbeans -->
+<xsl:stylesheet
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0">
+ <xsl:param name="title"/>
+ <xsl:param name="module"/>
+ <xsl:param name="cvsweb"/>
+
+ <xsl:output method="html" indent="yes"/>
+
+ <!-- Copy standard document elements. Elements that
+ should be ignored must be filtered by apply-templates
+ tags. -->
+ <xsl:template match="*">
+ <xsl:copy>
+ <xsl:copy-of select="attribute::*[. != '']"/>
+ <xsl:apply-templates/>
+ </xsl:copy>
+ </xsl:template>
+
+ <xsl:template match="tagdiff">
+ <html>
+ <head>
+ <title><xsl:value-of select="$title"/></title>
+ <style type="text/css">
+ body, p {
+ font-family: verdana,arial,helvetica;
+ font-size: 80%;
+ color:#000000;
+ }
+ .dateAndAuthor {
+ font-family: verdana,arial,helvetica;
+ font-size: 80%;
+ font-weight: bold;
+ text-align:left;
+ background:#a6caf0;
+ }
+ tr, td{
+ font-family: verdana,arial,helvetica;
+ font-size: 80%;
+ background:#eeeee0;
+ }
+ </style>
+ </head>
+ <body link="#000000" alink="#000000" vlink="#000000" text="#000000">
+ <h1>
+ <a name="top"><xsl:value-of select="$title"/></a>
+ </h1>
+ Tagdiff between <xsl:value-of select="@startTag"/> <xsl:value-of select="@startDate"/> and
+ <xsl:value-of select="@endTag"/> <xsl:value-of select="@endDate"/>
+ <p align="right">Designed for use with <a href="http://ant.apache.org/">Ant</a>.</p>
+ <hr size="2"/>
+ <a name="TOP"/>
+ <table width="100%">
+ <tr>
+ <td align="right">
+ <a href="#New">New Files</a> |
+ <a href="#Modified">Modified Files</a> |
+ <a href="#Removed">Removed Files</a>
+ </td>
+ </tr>
+ </table>
+ <table border="0" width="100%" cellpadding="3" cellspacing="1">
+ <xsl:call-template name="show-entries">
+ <xsl:with-param name="title">New Files</xsl:with-param>
+ <xsl:with-param name="anchor">New</xsl:with-param>
+ <xsl:with-param name="entries" select=".//entry[file/revision][not(file/prevrevision)]"/>
+ </xsl:call-template>
+
+ <xsl:call-template name="show-entries">
+ <xsl:with-param name="title">Modified Files</xsl:with-param>
+ <xsl:with-param name="anchor">Modified</xsl:with-param>
+ <xsl:with-param name="entries" select=".//entry[file/revision][file/prevrevision]"/>
+ </xsl:call-template>
+
+ <!-- change to entries select to address bug #36827 -->
+ <xsl:call-template name="show-entries">
+ <xsl:with-param name="title">Removed Files</xsl:with-param>
+ <xsl:with-param name="anchor">Removed</xsl:with-param>
+ <xsl:with-param name="entries" select=".//entry[not(file/revision)][file/prevrevision]"/>
+ </xsl:call-template>
+ </table>
+
+ </body>
+ </html>
+ </xsl:template>
+
+ <xsl:template name="show-entries">
+ <xsl:param name="title"/>
+ <xsl:param name="anchor"/>
+ <xsl:param name="entries"/>
+ <tr>
+ <td colspan="2" class="dateAndAuthor">
+ <a>
+ <xsl:attribute name="name"><xsl:value-of select="$anchor"/></xsl:attribute>
+ <xsl:value-of select="$title"/> - <xsl:value-of select="count($entries)"/> entries
+ </a>
+ <a href="#TOP">(back to top)</a>
+ </td>
+ </tr>
+ <tr>
+ <td width="20">
+ <xsl:text> </xsl:text>
+ </td>
+ <td>
+ <ul>
+ <xsl:apply-templates select="$entries"/>
+ </ul>
+ </td>
+ </tr>
+ </xsl:template>
+
+ <xsl:template match="entry">
+ <xsl:apply-templates select="file"/>
+ </xsl:template>
+
+ <xsl:template match="date">
+ <i><xsl:value-of select="."/></i>
+ </xsl:template>
+
+ <xsl:template match="time">
+ <i><xsl:value-of select="."/></i>
+ </xsl:template>
+
+ <xsl:template match="author">
+ <i>
+ <a>
+ <xsl:attribute name="href">mailto:<xsl:value-of select="."/></xsl:attribute>
+ <xsl:value-of select="."/>
+ </a>
+ </i>
+ </xsl:template>
+
+ <xsl:template match="file">
+ <li>
+ <a target="_new">
+ <xsl:attribute name="href"><xsl:value-of select="$cvsweb"/><xsl:value-of select="$module" />/<xsl:value-of select="name" /></xsl:attribute>
+ <xsl:value-of select="name" />
+ </a>
+ <xsl:if test="string-length(prevrevision) > 0 or string-length(revision) > 0">
+ <xsl:text> </xsl:text>
+ <a target="_new">
+ <xsl:choose>
+ <xsl:when test="string-length(prevrevision) = 0 ">
+ <xsl:attribute name="href"><xsl:value-of select="$cvsweb"/><xsl:value-of select="$module" />/<xsl:value-of select="name" />?rev=<xsl:value-of select="revision" />&amp;content-type=text/x-cvsweb-markup</xsl:attribute>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:attribute name="href"><xsl:value-of select="$cvsweb"/><xsl:value-of select="$module" />/<xsl:value-of select="name" />?r1=<xsl:value-of select="revision" />&amp;r2=<xsl:value-of select="prevrevision"/>&amp;diff_format=h</xsl:attribute>
+ </xsl:otherwise>
+ </xsl:choose> (<xsl:if test="count(prevrevision) &gt; 0"> <xsl:value-of select="prevrevision"/> --&gt; </xsl:if> <xsl:value-of select="revision"/>)
+ </a>
+ </xsl:if>
+ </li>
+ </xsl:template>
+
+ <!-- Any elements within a msg are processed,
+ so that we can preserve HTML tags. -->
+ <xsl:template match="msg">
+ <b><xsl:apply-templates/></b>
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/love2dToAPK/tools/tools/ant/fetch.xml b/love2dToAPK/tools/tools/ant/fetch.xml
new file mode 100644
index 0000000..8442d2a
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/fetch.xml
@@ -0,0 +1,335 @@
+<?xml version="1.0"?>
+
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+-->
+<!--
+ =======================================================================
+ Build file to fetch optional libraries for Apache Ant
+ =======================================================================
+-->
+<project name="fetch" default="all" basedir=".">
+
+<description>
+ This build file downloads JAR files that optional Ant tasks use,
+ and installs them in a location that is accessible the next time Ant runs.
+
+ You can choose three locations, by going -Ddest=LOCATION on the command line
+ -Ddest=user user lib dir ${user.home}/.ant/lib
+ -Ddest=system ant lib dir ${ant.home}/lib
+ -Ddest=optional optional dir $${basedir}/lib/optional (for Ant developers)
+
+ You may also need to set proxy settings. On Java1.5, Ant tries to get
+ this from the OS, unless you use the -noproxy option.
+
+ Proxies can be configured manually setting the JVM proxy values in the
+ ANT_OPTS environment variable.
+
+ For example, to set the proxy up in the tcsh shell, the command would be
+ something like:
+
+ For csh/tcsh:
+ setenv ANT_OPTS "-Dhttp.proxyHost=proxy -Dhttp.proxyPort=8080"
+ For bash:
+ export ANT_OPTS="-Dhttp.proxyHost=proxy -Dhttp.proxyPort=8080"
+ For Windows, set the environment variable in the appropriate dialog box
+ and open a new console. or, by hand
+ set ANT_OPTS = -Dhttp.proxyHost=proxy -Dhttp.proxyPort=8080
+</description>
+
+ <!-- Give user a chance to override without editing this file
+ (and without typing -D each time it compiles it) -->
+ <property file="${user.home}/.ant/ant.properties"/>
+ <property name="lib.dir" location="lib" />
+ <property name="optional.dir" location="${lib.dir}/optional" />
+ <property name="userlib.dir" location="${user.home}/.ant/lib" />
+
+ <!-- load in our properties table -->
+ <property file="${lib.dir}/libraries.properties"/>
+
+ <!-- Temporary cache for working files -->
+ <property name="temp.dir" location="${user.home}/.ant/tempcache" />
+ <property name="keep.temp.dir" value="true" />
+
+ <import file="get-m2.xml" />
+
+ <target name="pick-dest">
+ <fail>
+ <condition>
+ <not>
+ <isset property="dest"/>
+ </not>
+ </condition>ERROR
+Set -Ddest=LOCATION on the command line
+ -Ddest=user user lib dir ${user.home}/.ant/lib
+ -Ddest=system ant lib dir ${ant.home}/lib
+ -Ddest=optional optional dir $${basedir}/lib/optional (for Ant developers)
+ </fail>
+
+ <condition property="dest.dir"
+ value="${lib.dir}">
+ <equals arg1="${dest}" arg2="system" />
+ </condition>
+ <condition property="dest.dir"
+ value="${optional.dir}">
+ <equals arg1="${dest}" arg2="optional" />
+ </condition>
+ <condition property="dest.dir"
+ value="${userlib.dir}">
+ <equals arg1="${dest}" arg2="user" />
+ </condition>
+ <fail unless="dest.dir">Unknown destination : ${dest}</fail>
+ <echo>Downloading to ${dest.dir}</echo>
+ <property name="m2.dest.dir" value="${dest.dir}" />
+ </target>
+
+
+ <target name="macros" depends="pick-dest,get-m2"
+ xmlns:artifact="antlib:org.apache.maven.artifact.ant">
+
+ <macrodef name="f2">
+ <attribute name="project" />
+ <attribute name="archive" default="@{project}"/>
+ <attribute name="repository" default="${m2.repo}"/>
+ <sequential>
+ <fail>
+ Unknown archive @{archive} -no property @{archive}.version defined in ${lib.dir}/libraries.properties.
+ <condition>
+ <not>
+ <isset property="@{archive}.version"/>
+ </not>
+ </condition>
+ </fail>
+ <artifact:dependencies pathID="@{archive}.path">
+ <dependency groupID="@{project}"
+ artifactID="@{archive}"
+ version="${@{archive}.version}"/>
+ <remoteRepository url="@{repository}" />
+ </artifact:dependencies>
+ <!-- now we are left with the problem of getting the files
+ into our directory -->
+ <copy todir="${dest.dir}">
+ <path refid="@{archive}.path" />
+ <flattenmapper/>
+ </copy>
+ </sequential>
+ </macrodef>
+ </target>
+
+ <target name="nonm2-macros" depends="pick-dest">
+ <macrodef name="get-ftp-file">
+ <attribute name="host" />
+ <attribute name="port" default="21"/>
+ <attribute name="remotedir" />
+ <attribute name="filename" />
+ <attribute name="localdir" default="${dest.dir}" />
+ <attribute name="user" default="anonymous"/>
+ <attribute name="pw" default="anonymous"/>
+ <sequential>
+ <ftp server="@{host}" port="@{port}" userid="@{user}" password="@{pw}" passive="true"
+ remotedir="@{remotedir}" action="get" depends="true" preserveLastModified="true"
+ skipFailedTransfers="true">
+ <fileset dir="@{localdir}">
+ <include name="@{filename}" />
+ </fileset>
+ </ftp>
+ </sequential>
+ </macrodef>
+
+ </target>
+
+
+
+ <!-- any init stuff -->
+ <target name="init" depends="macros" />
+
+ <target name="init-no-m2" depends="nonm2-macros" />
+
+ <target name="init-cache">
+ <available property="temp.cache.already.exists" file="${temp.dir}" type="dir" />
+ <condition property="user.wants.temp.cache">
+ <and>
+ <isset property="keep.temp.dir" />
+ <not>
+ <or>
+ <equals arg1="${keep.temp.dir}" arg2="false" casesensitive="false" />
+ <equals arg1="${keep.temp.dir}" arg2="no" casesensitive="false" />
+ <equals arg1="${keep.temp.dir}" arg2="off" casesensitive="false" />
+ </or>
+ </not>
+ </and>
+ </condition>
+ <condition property="delete.temp.cache">
+ <and>
+ <not>
+ <isset property="temp.cache.already.exists" />
+ </not>
+ <not>
+ <isset property="user.wants.temp.cache" />
+ </not>
+ </and>
+ </condition>
+ </target>
+
+ <target name="-setup-temp-cache" depends="init-cache" unless="temp.cache.already.exists"
+ description="Setup temporary cache for downloaded files">
+ <mkdir dir="${temp.dir}" />
+ </target>
+
+ <target name="-cleanup-temp-cache" depends="init-cache" if="delete.temp.cache"
+ description="Gets rid of the temporary cache directory">
+ <delete dir="${temp.dir}" />
+ </target>
+
+
+ <target name="diag" depends="init">
+ <echoproperties />
+ </target>
+
+ <target name="logging"
+ description="load logging libraries"
+ depends="init">
+ <f2 project="log4j" />
+ <f2 project="commons-logging" archive="commons-logging-api" />
+ </target>
+
+ <target name="junit"
+ description="load junit libraries"
+ depends="init">
+ <f2 project="junit" />
+ </target>
+
+ <target name="xml"
+ description="load full XML libraries (xalan, resolver)"
+ depends="init">
+ <f2 project="xalan" />
+ <f2 project="xml-resolver" />
+ </target>
+
+ <target name="networking"
+ description="load networking libraries (commons-net; jsch)"
+ depends="init">
+ <f2 project="commons-net" />
+ <f2 project="com.jcraft" archive="jsch"/>
+ </target>
+
+ <target name="regexp"
+ description="load regexp libraries"
+ depends="init">
+ <f2 project="regexp" />
+ <f2 project="oro" />
+ </target>
+
+ <target name="antlr"
+ description="load antlr libraries"
+ depends="init">
+ <f2 project="antlr" />
+ </target>
+
+ <target name="bcel"
+ description="load bcel libraries"
+ depends="init">
+ <f2 project="bcel" />
+ </target>
+
+ <target name="jdepend"
+ description="load jdepend libraries"
+ depends="init">
+ <f2 project="jdepend" />
+ </target>
+
+ <target name="bsf"
+ description="load bsf libraries"
+ depends="init">
+ <f2 project="bsf" />
+ </target>
+
+ <target name="jruby"
+ description="load jruby"
+ depends="bsf">
+ <f2 project="org.jruby" archive="jruby"/>
+ </target>
+
+ <target name="beanshell"
+ description="load beanshell support"
+ depends="bsf">
+ <f2 project="org.beanshell" archive="bsh"/>
+ <f2 project="org.beanshell" archive="bsh-core"/>
+ </target>
+
+ <target name="jython"
+ description="load jython"
+ depends="bsf">
+ <f2 project="jython" archive="jython"/>
+ </target>
+
+ <target name="rhino"
+ description="load rhino"
+ depends="bsf">
+ <f2 project="rhino" archive="js"/>
+ </target>
+
+ <target name="script"
+ description="load script languages (except jython)"
+ depends="bsf,jruby,beanshell,rhino"/>
+
+ <target name="debugging"
+ description="internal ant debugging"
+ depends="init">
+ <f2 project="which" />
+ </target>
+
+ <target name="javamail" depends="init"
+ description="load javamail">
+ <f2 project="javax.mail" archive="mail"/>
+ </target>
+
+ <target name="jspc" depends="init" description="loads Jasper">
+ <f2 project="tomcat" archive="jasper-compiler"/>
+ <f2 project="tomcat" archive="jasper-runtime"/>
+ <f2 project="javax.servlet" archive="servlet-api"/>
+ </target>
+
+ <target name="jai" depends="init"
+ description="load java advanced imaging">
+ <f2 project="javax.media" archive="jai-core" repository="https://repository.jboss.org/nexus/content/groups/public/"/>
+ <f2 project="com.sun.media" archive="jai-codec" repository="https://repository.jboss.org/nexus/content/groups/public/"/>
+ </target>
+
+ <target name="netrexx" depends="init-no-m2,-setup-temp-cache,-fetch-netrexx,-fetch-netrexx-no-commons-net"
+ description="load NetRexx compiler">
+ <copy todir="${dest.dir}" flatten="true">
+ <zipfileset src="${temp.dir}/NetRexx.zip">
+ <include name="NetRexx\lib\NetRexxC.jar" />
+ <include name="NetRexx\browse\license.txt" />
+ </zipfileset>
+ </copy>
+ <antcall target="-cleanup-temp-cache"/>
+ </target>
+ <available property="have.commons.net" classname="org.apache.commons.net.ftp.FTPClientConfig"/>
+ <target name="-fetch-netrexx" if="have.commons.net">
+ <get-ftp-file host="ftp.software.ibm.com" remotedir="/software/awdtools/netrexx"
+ filename="NetRexx.zip" localdir="${temp.dir}" />
+ </target>
+ <target name="-fetch-netrexx-no-commons-net" unless="have.commons.net">
+ <get src="ftp://ftp.software.ibm.com/software/awdtools/netrexx/NetRexx.zip" dest="${temp.dir}/NetRexx.zip" skipexisting="true"/>
+ </target>
+
+ <target name="all"
+ description="load all the libraries (except jython)"
+ depends="logging,junit,xml,networking,regexp,antlr,bcel,jdepend,bsf,debugging,script,javamail,jspc,jai,netrexx" />
+
+</project>
diff --git a/love2dToAPK/tools/tools/ant/get-m2.xml b/love2dToAPK/tools/tools/ant/get-m2.xml
new file mode 100644
index 0000000..4111e81
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/get-m2.xml
@@ -0,0 +1,121 @@
+<?xml version="1.0"?>
+
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+-->
+<!--
+ =======================================================================
+ Build file to fetch maven2 tasks; extracted from (Ant's) fetch.xml
+ =======================================================================
+-->
+<project name="get-m2" default="get-m2" basedir=".">
+
+<description>
+ This build file downloads the Maven2 Ant tasks,
+ and installs them in the location specified by the m2.dest.dir property.
+
+ You may need to set proxy settings. On Java1.5, Ant tries to get
+ this from the OS, unless you use the -noproxy option.
+
+ Proxies can be configured manually setting the JVM proxy values in the
+ ANT_OPTS environment variable.
+
+ For example, to set the proxy up in the tcsh shell, the command would be
+ something like:
+
+ For csh/tcsh:
+ setenv ANT_OPTS "-Dhttp.proxyHost=proxy -Dhttp.proxyPort=8080"
+ For bash:
+ export ANT_OPTS="-Dhttp.proxyHost=proxy -Dhttp.proxyPort=8080"
+ For Windows, set the environment variable in the appropriate dialog box
+ and open a new console. or, by hand
+ set ANT_OPTS = -Dhttp.proxyHost=proxy -Dhttp.proxyPort=8080
+</description>
+
+ <property file="get-m2.properties" />
+
+ <property name="m2.antlib.resource"
+ value="org/apache/maven/artifact/ant/antlib.xml" />
+
+ <property name="m2.antlib.uri"
+ value="antlib:org.apache.maven.artifact.ant" />
+
+ <macrodef name="require">
+ <attribute name="property" />
+ <sequential>
+ <fail unless="@{property}">$${@{property}} not specified</fail>
+ </sequential>
+ </macrodef>
+
+ <target name="probe-m2">
+ <require property="m2.dest.dir" />
+ <require property="m2.jar.name" />
+
+ <!-- Look for M2 ant tasks in our classpath-->
+ <property name="m2.artifact" location="${m2.dest.dir}/${m2.jar.name}" />
+ <available property="m2.antlib.found" resource="${m2.antlib.resource}" />
+ <condition property="m2.antlib.typefound">
+ <typefound name="${m2.antlib.uri}:artifact" />
+ </condition>
+ <available property="m2.artifact.found" file="${m2.artifact}" type="file" />
+ </target>
+
+ <target name="download-m2" depends="probe-m2" unless="m2.artifact.found">
+ <require property="m2.antlib.url" />
+ <echo>Downloading to ${m2.dest.dir}</echo>
+
+ <mkdir dir="${m2.dest.dir}" />
+ <!-- fetch M2 ant tasks into our repository, if it is not there-->
+ <get src="${m2.antlib.url}"
+ dest="${m2.artifact}"
+ verbose="true"
+ usetimestamp="false" />
+ </target>
+
+ <target name="dont-validate-m2-checksum" depends="probe-m2"
+ if="m2.artifact.found">
+ <property name="checksum.equal" value="true" />
+ </target>
+
+ <target name="validate-m2-checksum"
+ depends="download-m2,dont-validate-m2-checksum"
+ if="m2.sha1.checksum" unless="m2.artifact.found">
+ <checksum file="${m2.artifact}"
+ algorithm="SHA"
+ property="${m2.sha1.checksum}"
+ verifyProperty="checksum.equal" />
+ </target>
+
+ <target name="checksum-mismatch" depends="validate-m2-checksum"
+ if="m2.sha1.checksum" unless="checksum.equal">
+ <delete file="${m2.artifact}" />
+ <fail>
+ Failed to verify the downloaded file ${m2.antlib.url}" against the checksum
+ coded into libraries.properties.
+ The local copy has been deleted, for security reasons
+ </fail>
+ </target>
+
+ <target name="checksum-match" depends="checksum-mismatch"
+ unless="m2.antlib.found">
+ <taskdef classpath="${m2.artifact}" resource="${m2.antlib.resource}"
+ uri="${m2.antlib.uri}" />
+ </target>
+
+ <target name="get-m2" depends="checksum-match"
+ description="Download the Maven2 Ant tasks" />
+
+</project>
diff --git a/love2dToAPK/tools/tools/ant/lib/README b/love2dToAPK/tools/tools/ant/lib/README
new file mode 100644
index 0000000..67e37ce
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/README
@@ -0,0 +1,3 @@
+Please refer to the Ant manual under Installing Ant / Library
+Dependencies for a list of the jar requirements for various optional
+tasks and features.
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-antlr.jar b/love2dToAPK/tools/tools/ant/lib/ant-antlr.jar
new file mode 100644
index 0000000..c716be1
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-antlr.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-antlr.pom b/love2dToAPK/tools/tools/ant/lib/ant-antlr.pom
new file mode 100644
index 0000000..f3aa7b3
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-antlr.pom
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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 POM has been created manually by the Ant Development Team.
+ Please contact us if you are not satisfied with the data contained in this POM.
+ URL : http://ant.apache.org
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-parent</artifactId>
+ <relativePath>../pom.xml</relativePath>
+ <version>1.9.6</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <url>http://ant.apache.org/</url>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-antlr</artifactId>
+ <version>1.9.6</version>
+ <name>Apache Ant + ANTLR</name>
+ <description>antlr specific task.
+ The implementation forks a java process, therefore the antlr jar file is only needed at runtime</description>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.9.6</version>
+ <optional>true</optional>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <!-- add a dependency with antlr 2.7.2 consistent with libraries.properties antlr 2.7.6 is also available on ibiblio-->
+ <groupId>antlr</groupId>
+ <artifactId>antlr</artifactId>
+ <version>2.7.2</version>
+ <optional>true</optional>
+ <scope>runtime</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <includes>
+ <include>org/apache/tools/ant/taskdefs/optional/ANTLR*</include>
+ </includes>
+ </configuration>
+ </plugin>
+ </plugins>
+ <sourceDirectory>../../../../src/main</sourceDirectory>
+ <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
+ <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
+ <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
+ <directory>../../../../target/${project.artifactId}</directory>
+ </build>
+</project>
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-apache-bcel.jar b/love2dToAPK/tools/tools/ant/lib/ant-apache-bcel.jar
new file mode 100644
index 0000000..44e941b
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-apache-bcel.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-apache-bcel.pom b/love2dToAPK/tools/tools/ant/lib/ant-apache-bcel.pom
new file mode 100644
index 0000000..44c6c89
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-apache-bcel.pom
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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 POM has been created manually by the Ant Development Team.
+ Please contact us if you are not satisfied with the data contained in this POM.
+ URL : http://ant.apache.org
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-parent</artifactId>
+ <relativePath>../pom.xml</relativePath>
+ <version>1.9.6</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <url>http://ant.apache.org/</url>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-apache-bcel</artifactId>
+ <version>1.9.6</version>
+ <name>Apache Ant + BCEL</name>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.9.6</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>bcel</groupId>
+ <artifactId>bcel</artifactId>
+ <version>5.1</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <includes>
+ <include>org/apache/tools/ant/filters/util/JavaClassHelper*</include>
+ <include>org/apache/tools/ant/util/depend/bcel/*</include>
+ </includes>
+ </configuration>
+ </plugin>
+ </plugins>
+ <sourceDirectory>../../../../src/main</sourceDirectory>
+ <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
+ <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
+ <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
+ <directory>../../../../target/${project.artifactId}</directory>
+ </build>
+</project>
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-apache-bsf.jar b/love2dToAPK/tools/tools/ant/lib/ant-apache-bsf.jar
new file mode 100644
index 0000000..4f8eced
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-apache-bsf.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-apache-bsf.pom b/love2dToAPK/tools/tools/ant/lib/ant-apache-bsf.pom
new file mode 100644
index 0000000..d518029
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-apache-bsf.pom
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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 POM has been created manually by the Ant Development Team.
+ Please contact us if you are not satisfied with the data contained in this POM.
+ URL : http://ant.apache.org
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-parent</artifactId>
+ <relativePath>../pom.xml</relativePath>
+ <version>1.9.6</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <url>http://ant.apache.org/</url>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-apache-bsf</artifactId>
+ <version>1.9.6</version>
+ <name>Apache Ant + BSF</name>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.9.6</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>bsf</groupId>
+ <artifactId>bsf</artifactId>
+ <version>2.4.0</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <includes>
+ <include>org/apache/tools/ant/taskdefs/optional/Script*</include>
+ <include>org/apache/tools/ant/taskdefs/optional/script/**</include>
+ <include>org/apache/tools/ant/types/optional/*Script*</include>
+ <include>org/apache/tools/ant/util/Script*</include>
+ <include>org/apache/tools/ant/util/optional/Script*</include>
+ </includes>
+ </configuration>
+ </plugin>
+ </plugins>
+ <sourceDirectory>../../../../src/main</sourceDirectory>
+ <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
+ <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
+ <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
+ <directory>../../../../target/${project.artifactId}</directory>
+ </build>
+</project>
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-apache-log4j.jar b/love2dToAPK/tools/tools/ant/lib/ant-apache-log4j.jar
new file mode 100644
index 0000000..2f018dc
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-apache-log4j.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-apache-log4j.pom b/love2dToAPK/tools/tools/ant/lib/ant-apache-log4j.pom
new file mode 100644
index 0000000..5caad40
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-apache-log4j.pom
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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 POM has been created manually by the Ant Development Team.
+ Please contact us if you are not satisfied with the data contained in this POM.
+ URL : http://ant.apache.org
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-parent</artifactId>
+ <relativePath>../pom.xml</relativePath>
+ <version>1.9.6</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <url>http://ant.apache.org/</url>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-apache-log4j</artifactId>
+ <version>1.9.6</version>
+ <name>Apache Ant + Log4J</name>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.9.6</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ <version>1.2.13</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <includes>
+ <include>org/apache/tools/ant/listener/Log4jListener*</include>
+ </includes>
+ </configuration>
+ </plugin>
+ </plugins>
+ <sourceDirectory>../../../../src/main</sourceDirectory>
+ <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
+ <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
+ <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
+ <directory>../../../../target/${project.artifactId}</directory>
+ </build>
+</project>
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-apache-oro.jar b/love2dToAPK/tools/tools/ant/lib/ant-apache-oro.jar
new file mode 100644
index 0000000..b8d5adc
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-apache-oro.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-apache-oro.pom b/love2dToAPK/tools/tools/ant/lib/ant-apache-oro.pom
new file mode 100644
index 0000000..b722bab
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-apache-oro.pom
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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 POM has been created manually by the Ant Development Team.
+ Please contact us if you are not satisfied with the data contained in this POM.
+ URL : http://ant.apache.org
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-parent</artifactId>
+ <relativePath>../pom.xml</relativePath>
+ <version>1.9.6</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <url>http://ant.apache.org/</url>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-apache-oro</artifactId>
+ <version>1.9.6</version>
+ <name>Apache Ant + Apache Oro</name>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.9.6</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>oro</groupId>
+ <artifactId>oro</artifactId>
+ <version>2.0.8</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <includes>
+ <include>org/apache/tools/ant/util/regexp/JakartaOro*</include>
+ </includes>
+ <testIncludes>
+ <include>org/apache/tools/ant/util/regexp/JakartaOro*</include>
+ <include>org/apache/tools/ant/util/regexp/Regexp*</include>
+ </testIncludes>
+ </configuration>
+ </plugin>
+ </plugins>
+ <sourceDirectory>../../../../src/main</sourceDirectory>
+ <testSourceDirectory>../../../../src/tests/junit</testSourceDirectory>
+ <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
+ <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
+ <directory>../../../../target/${project.artifactId}</directory>
+ </build>
+</project>
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-apache-regexp.jar b/love2dToAPK/tools/tools/ant/lib/ant-apache-regexp.jar
new file mode 100644
index 0000000..f5f0e41
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-apache-regexp.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-apache-regexp.pom b/love2dToAPK/tools/tools/ant/lib/ant-apache-regexp.pom
new file mode 100644
index 0000000..6c30621
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-apache-regexp.pom
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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 POM has been created manually by the Ant Development Team.
+ Please contact us if you are not satisfied with the data contained in this POM.
+ URL : http://ant.apache.org
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-parent</artifactId>
+ <relativePath>../pom.xml</relativePath>
+ <version>1.9.6</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <url>http://ant.apache.org/</url>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-apache-regexp</artifactId>
+ <version>1.9.6</version>
+ <name>Apache Ant + Apache Regexp</name>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.9.6</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>regexp</groupId>
+ <artifactId>regexp</artifactId>
+ <version>1.3</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <includes>
+ <include>org/apache/tools/ant/util/regexp/JakartaRegexp*</include>
+ </includes>
+ </configuration>
+ </plugin>
+ </plugins>
+ <sourceDirectory>../../../../src/main</sourceDirectory>
+ <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
+ <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
+ <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
+ <directory>../../../../target/${project.artifactId}</directory>
+ </build>
+
+</project>
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-apache-resolver.jar b/love2dToAPK/tools/tools/ant/lib/ant-apache-resolver.jar
new file mode 100644
index 0000000..0c41b10
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-apache-resolver.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-apache-resolver.pom b/love2dToAPK/tools/tools/ant/lib/ant-apache-resolver.pom
new file mode 100644
index 0000000..bd3dfa3
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-apache-resolver.pom
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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 POM has been created manually by the Ant Development Team.
+ Please contact us if you are not satisfied with the data contained in this POM.
+ URL : http://ant.apache.org
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-parent</artifactId>
+ <relativePath>../pom.xml</relativePath>
+ <version>1.9.6</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <url>http://ant.apache.org/</url>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-apache-resolver</artifactId>
+ <version>1.9.6</version>
+ <name>Apache Ant + Apache Resolver</name>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.9.6</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>xml-resolver</groupId>
+ <artifactId>xml-resolver</artifactId>
+ <version>1.1</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <includes>
+ <include>org/apache/tools/ant/types/resolver/**</include>
+ </includes>
+ </configuration>
+ </plugin>
+ </plugins>
+ <sourceDirectory>../../../../src/main</sourceDirectory>
+ <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
+ <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
+ <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
+ <directory>../../../../target/${project.artifactId}</directory>
+ </build>
+</project>
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-apache-xalan2.jar b/love2dToAPK/tools/tools/ant/lib/ant-apache-xalan2.jar
new file mode 100644
index 0000000..ce92587
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-apache-xalan2.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-apache-xalan2.pom b/love2dToAPK/tools/tools/ant/lib/ant-apache-xalan2.pom
new file mode 100644
index 0000000..73f8442
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-apache-xalan2.pom
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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 POM has been created manually by the Ant Development Team.
+ Please contact us if you are not satisfied with the data contained in this POM.
+ URL : http://ant.apache.org
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-parent</artifactId>
+ <relativePath>../pom.xml</relativePath>
+ <version>1.9.6</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <url>http://ant.apache.org/</url>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-apache-xalan2</artifactId>
+ <version>1.9.6</version>
+ <name>Apache Ant + Xalan 2</name>
+ <description>contains Xalan2-specific features</description>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.9.6</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>xalan</groupId>
+ <artifactId>xalan</artifactId>
+ <version>2.7.1</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>create-timestamp-file</id>
+ <phase>generate-resources</phase>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ <configuration>
+ <tasks>
+ <mkdir dir="${project.build.outputDirectory}"/>
+ <copy todir="${project.build.outputDirectory}/org/apache/tools/ant/taskdefs/optional/junit/xsl">
+ <fileset dir="${project.build.sourceDirectory}/../etc">
+ <include name="junit-frames.xsl"/>
+ <include name="junit-noframes.xsl"/>
+ </fileset>
+ </copy>
+ </tasks>
+ </configuration>
+ </execution>
+
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <includes>
+ <include>org/apache/tools/ant/taskdefs/optional/Xalan2TraceSupport*</include>
+ </includes>
+ </configuration>
+ </plugin>
+ </plugins>
+ <sourceDirectory>../../../../src/main</sourceDirectory>
+ <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
+ <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
+ <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
+ <directory>../../../../target/${project.artifactId}</directory>
+ </build>
+</project>
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-commons-logging.jar b/love2dToAPK/tools/tools/ant/lib/ant-commons-logging.jar
new file mode 100644
index 0000000..b87eefb
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-commons-logging.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-commons-logging.pom b/love2dToAPK/tools/tools/ant/lib/ant-commons-logging.pom
new file mode 100644
index 0000000..2415823
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-commons-logging.pom
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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 POM has been created manually by the Ant Development Team.
+ Please contact us if you are not satisfied with the data contained in this POM.
+ URL : http://ant.apache.org
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-parent</artifactId>
+ <relativePath>../pom.xml</relativePath>
+ <version>1.9.6</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <url>http://ant.apache.org/</url>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-commons-logging</artifactId>
+ <version>1.9.6</version>
+ <name>Apache Ant + Commons Logging</name>
+ <description>Ant Listener based on commons-logging</description>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.9.6</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging-api</artifactId>
+ <version>1.0.4</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <includes>
+ <include>org/apache/tools/ant/listener/CommonsLoggingListener*</include>
+ </includes>
+ </configuration>
+ </plugin>
+ </plugins>
+ <sourceDirectory>../../../../src/main</sourceDirectory>
+ <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
+ <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
+ <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
+ <directory>../../../../target/${project.artifactId}</directory>
+ </build>
+</project>
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-commons-net.jar b/love2dToAPK/tools/tools/ant/lib/ant-commons-net.jar
new file mode 100644
index 0000000..18f52ae
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-commons-net.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-commons-net.pom b/love2dToAPK/tools/tools/ant/lib/ant-commons-net.pom
new file mode 100644
index 0000000..73144a6
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-commons-net.pom
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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 POM has been created manually by the Ant Development Team.
+ Please contact us if you are not satisfied with the data contained in this POM.
+ URL : http://ant.apache.org
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-parent</artifactId>
+ <relativePath>../pom.xml</relativePath>
+ <version>1.9.6</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <url>http://ant.apache.org/</url>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-commons-net</artifactId>
+ <version>1.9.6</version>
+ <name>Apache Ant + Commons Net</name>
+ <description>ftp, rexec and telnet tasks</description>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.9.6</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>commons-net</groupId>
+ <artifactId>commons-net</artifactId>
+ <version>1.4.0</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <includes>
+ <include>org/apache/tools/ant/taskdefs/optional/net/FTP*</include>
+ <include>org/apache/tools/ant/taskdefs/optional/net/RExec*</include>
+ <include>org/apache/tools/ant/taskdefs/optional/net/TelnetTask*</include>
+ </includes>
+ <testIncludes>
+ <include>org/apache/tools/ant/taskdefs/optional/net/FTP*</include>
+ </testIncludes>
+ </configuration>
+ </plugin>
+ </plugins>
+ <sourceDirectory>../../../../src/main</sourceDirectory>
+ <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
+ <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
+ <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
+ <directory>../../../../target/${project.artifactId}</directory>
+ </build>
+</project>
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-jai.jar b/love2dToAPK/tools/tools/ant/lib/ant-jai.jar
new file mode 100644
index 0000000..c322d40
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-jai.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-jai.pom b/love2dToAPK/tools/tools/ant/lib/ant-jai.pom
new file mode 100644
index 0000000..1ac8f4f
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-jai.pom
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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 POM has been created manually by the Ant Development Team.
+ Please contact us if you are not satisfied with the data contained in this POM.
+ URL : http://ant.apache.org
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-parent</artifactId>
+ <relativePath>../pom.xml</relativePath>
+ <version>1.9.6</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <url>http://ant.apache.org/</url>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-jai</artifactId>
+ <version>1.9.6</version>
+ <name>Apache Ant + JAI</name>
+ <description>image task and corresponding types.
+ </description>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.9.6</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>javax.media</groupId>
+ <artifactId>jai-core</artifactId>
+ <version>1.1.3</version>
+ </dependency>
+ <dependency>
+ <groupId>com.sun.media</groupId>
+ <artifactId>jai-codec</artifactId>
+ <version>1.1.3</version>
+ </dependency>
+ </dependencies>
+ <!-- Central has javax.media:jai-core:1.1.3 but only com.sun.media:jai-codec:1.1.2_01 -->
+ <repositories>
+ <repository>
+ <id>jboss</id>
+ <name>JBoss</name>
+ <url>https://repository.jboss.org/nexus/content/groups/public/</url>
+ </repository>
+ </repositories>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <includes>
+ <include>org/apache/tools/ant/taskdefs/optional/image/*</include>
+ <include>org/apache/tools/ant/types/optional/image/*</include>
+ </includes>
+ </configuration>
+ </plugin>
+ </plugins>
+ <sourceDirectory>../../../../src/main</sourceDirectory>
+ <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
+ <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
+ <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
+ <directory>../../../../target/${project.artifactId}</directory>
+ </build>
+</project>
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-javamail.jar b/love2dToAPK/tools/tools/ant/lib/ant-javamail.jar
new file mode 100644
index 0000000..3c95527
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-javamail.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-javamail.pom b/love2dToAPK/tools/tools/ant/lib/ant-javamail.pom
new file mode 100644
index 0000000..543c497
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-javamail.pom
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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 POM has been created manually by the Ant Development Team.
+ Please contact us if you are not satisfied with the data contained in this POM.
+ URL : http://ant.apache.org
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-parent</artifactId>
+ <relativePath>../pom.xml</relativePath>
+ <version>1.9.6</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <url>http://ant.apache.org/</url>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-javamail</artifactId>
+ <version>1.9.6</version>
+ <name>Apache Ant + JavaMail</name>
+ <description>implementation of the mail task based on javamail.
+ Required to send emails to SMTP servers using user/password combinations
+ or to send mail over SSL</description>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.9.6</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>javax.mail</groupId>
+ <artifactId>mail</artifactId>
+ <version>1.4</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>javax.activation</groupId>
+ <artifactId>activation</artifactId>
+ <version>1.1</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <includes>
+ <include>org/apache/tools/ant/taskdefs/email/MimeMailer*</include>
+ </includes>
+ </configuration>
+ </plugin>
+ </plugins>
+ <sourceDirectory>../../../../src/main</sourceDirectory>
+ <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
+ <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
+ <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
+ <directory>../../../../target/${project.artifactId}</directory>
+ </build>
+</project>
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-jdepend.jar b/love2dToAPK/tools/tools/ant/lib/ant-jdepend.jar
new file mode 100644
index 0000000..96105b4
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-jdepend.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-jdepend.pom b/love2dToAPK/tools/tools/ant/lib/ant-jdepend.pom
new file mode 100644
index 0000000..ecbaaad
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-jdepend.pom
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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 POM has been created manually by the Ant Development Team.
+ Please contact us if you are not satisfied with the data contained in this POM.
+ URL : http://ant.apache.org
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-parent</artifactId>
+ <relativePath>../pom.xml</relativePath>
+ <version>1.9.6</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <url>http://ant.apache.org/</url>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-jdepend</artifactId>
+ <version>1.9.6</version>
+ <name>Apache Ant + JDepend</name>
+ <description>task jdepend invoking the jdepend parser. There is also a version 2.9.1 of the
+ jdepend parser available on the maven repository</description>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.9.6</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>jdepend</groupId>
+ <artifactId>jdepend</artifactId>
+ <version>2.7</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <includes>
+ <include>org/apache/tools/ant/taskdefs/optional/jdepend/*</include>
+ </includes>
+ </configuration>
+ </plugin>
+ </plugins>
+ <sourceDirectory>../../../../src/main</sourceDirectory>
+ <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
+ <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
+ <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
+ <directory>../../../../target/${project.artifactId}</directory>
+ </build>
+</project>
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-jmf.jar b/love2dToAPK/tools/tools/ant/lib/ant-jmf.jar
new file mode 100644
index 0000000..11a29be
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-jmf.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-jmf.pom b/love2dToAPK/tools/tools/ant/lib/ant-jmf.pom
new file mode 100644
index 0000000..278a01f
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-jmf.pom
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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 POM has been created manually by the Ant Development Team.
+ Please contact us if you are not satisfied with the data contained in this POM.
+ URL : http://ant.apache.org
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-parent</artifactId>
+ <relativePath>../pom.xml</relativePath>
+ <version>1.9.6</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <url>http://ant.apache.org/</url>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-jmf</artifactId>
+ <version>1.9.6</version>
+ <name>Apache Ant + JMF</name>
+ <description>contains the sound task and a soundplayer listener
+ download the dependency from http://java.sun.com/products/java-media/jmf/</description>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.9.6</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <includes>
+ <include>org/apache/tools/ant/taskdefs/optional/sound/*</include>
+ </includes>
+ </configuration>
+ </plugin>
+ </plugins>
+ <sourceDirectory>../../../../src/main</sourceDirectory>
+ <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
+ <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
+ <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
+ <directory>../../../../target/${project.artifactId}</directory>
+ </build>
+ </project>
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-jsch.jar b/love2dToAPK/tools/tools/ant/lib/ant-jsch.jar
new file mode 100644
index 0000000..6f07789
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-jsch.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-jsch.pom b/love2dToAPK/tools/tools/ant/lib/ant-jsch.pom
new file mode 100644
index 0000000..39444a3
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-jsch.pom
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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 POM has been created manually by the Ant Development Team.
+ Please contact us if you are not satisfied with the data contained in this POM.
+ URL : http://ant.apache.org
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-parent</artifactId>
+ <relativePath>../pom.xml</relativePath>
+ <version>1.9.6</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <url>http://ant.apache.org/</url>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-jsch</artifactId>
+ <version>1.9.6</version>
+ <name>Apache Ant + JSch</name>
+ <description>contains the sshexec and scp tasks
+ </description>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.9.6</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.jcraft</groupId>
+ <artifactId>jsch</artifactId>
+ <version>0.1.50</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <includes>
+ <include>org/apache/tools/ant/taskdefs/optional/ssh/*</include>
+ </includes>
+ <testIncludes>
+ <include>org/apache/tools/ant/taskdefs/optional/ssh/*</include>
+ </testIncludes>
+ </configuration>
+ </plugin>
+ </plugins>
+ <sourceDirectory>../../../../src/main</sourceDirectory>
+ <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
+ <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
+ <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
+ <directory>../../../../target/${project.artifactId}</directory>
+ </build>
+</project>
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-junit.jar b/love2dToAPK/tools/tools/ant/lib/ant-junit.jar
new file mode 100644
index 0000000..00c1f1c
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-junit.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-junit.pom b/love2dToAPK/tools/tools/ant/lib/ant-junit.pom
new file mode 100644
index 0000000..32926a4
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-junit.pom
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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 POM has been created manually by the Ant Development Team.
+ Please contact us if you are not satisfied with the data contained in this POM.
+ URL : http://ant.apache.org
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-parent</artifactId>
+ <relativePath>../pom.xml</relativePath>
+ <version>1.9.6</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <url>http://ant.apache.org/</url>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-junit</artifactId>
+ <version>1.9.6</version>
+ <name>Apache Ant + JUnit</name>
+ <description>contains the junit and junirreport tasks</description>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.9.6</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.11</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>create-timestamp-file</id>
+ <phase>generate-resources</phase>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ <configuration>
+ <tasks>
+ <mkdir dir="${project.build.outputDirectory}"/>
+ <copy todir="${project.build.outputDirectory}/org/apache/tools/ant/taskdefs/optional/junit/xsl">
+ <fileset dir="${project.build.sourceDirectory}/../etc">
+ <include name="junit-frames.xsl"/>
+ <include name="junit-noframes.xsl"/>
+ </fileset>
+ </copy>
+ </tasks>
+ </configuration>
+ </execution>
+
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <includes>
+ <include>org/apache/tools/ant/taskdefs/optional/junit/*</include>
+ </includes>
+ <excludes>
+ <exclude>org/apache/tools/ant/taskdefs/optional/junit/JUnit4TestMethodAdapter*</exclude>
+ <exclude>org/apache/tools/ant/taskdefs/optional/junit/CustomJUnit4TestAdapterCache*</exclude>
+ </excludes>
+ <testIncludes>
+ <include>org/apache/tools/ant/taskdefs/optional/junit/</include>
+ </testIncludes>
+ </configuration>
+ </plugin>
+ </plugins>
+ <sourceDirectory>../../../../src/main</sourceDirectory>
+ <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
+ <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
+ <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
+ <directory>../../../../target/${project.artifactId}</directory>
+ </build>
+</project>
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-junit4.jar b/love2dToAPK/tools/tools/ant/lib/ant-junit4.jar
new file mode 100644
index 0000000..ebedde3
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-junit4.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-junit4.pom b/love2dToAPK/tools/tools/ant/lib/ant-junit4.pom
new file mode 100644
index 0000000..e40d984
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-junit4.pom
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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 POM has been created manually by the Ant Development Team.
+ Please contact us if you are not satisfied with the data contained in this POM.
+ URL : http://ant.apache.org
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-parent</artifactId>
+ <relativePath>../pom.xml</relativePath>
+ <version>1.9.6</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <url>http://ant.apache.org/</url>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-junit4</artifactId>
+ <version>1.9.6</version>
+ <name>Apache Ant + JUnit 4</name>
+ <description>contains JUnit 4.x support</description>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.9.6</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.11</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <includes>
+ <include>org/apache/tools/ant/taskdefs/optional/junit/JUnit4TestMethodAdapter*</include>
+ <include>org/apache/tools/ant/taskdefs/optional/junit/CustomJUnit4TestAdapterCache*</include>
+ </includes>
+ </configuration>
+ </plugin>
+ </plugins>
+ <sourceDirectory>../../../../src/main</sourceDirectory>
+ <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
+ <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
+ <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
+ <directory>../../../../target/${project.artifactId}</directory>
+ </build>
+</project>
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-launcher.jar b/love2dToAPK/tools/tools/ant/lib/ant-launcher.jar
new file mode 100644
index 0000000..0478a8c
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-launcher.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-launcher.pom b/love2dToAPK/tools/tools/ant/lib/ant-launcher.pom
new file mode 100644
index 0000000..02ecff8
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-launcher.pom
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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 POM has been created manually by the Ant Development Team.
+ Please contact us if you are not satisfied with the data contained in this POM.
+ URL : http://ant.apache.org
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-parent</artifactId>
+ <relativePath>../pom.xml</relativePath>
+ <version>1.9.6</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <url>http://ant.apache.org/</url>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-launcher</artifactId>
+ <version>1.9.6</version>
+ <name>Apache Ant Launcher</name>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <includes>
+ <include>org/apache/tools/ant/launch/*.java</include>
+ </includes>
+
+ </configuration>
+ </plugin>
+ </plugins>
+ <sourceDirectory>../../../../src/main</sourceDirectory>
+ <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
+ <outputDirectory>../../../../target/ant-launcher/classes</outputDirectory>
+ <testOutputDirectory>../../../../target/ant-launcher/testcases</testOutputDirectory>
+ <directory>../../../../target/ant-launcher</directory>
+ </build>
+</project>
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-netrexx.jar b/love2dToAPK/tools/tools/ant/lib/ant-netrexx.jar
new file mode 100644
index 0000000..8255a59
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-netrexx.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-netrexx.pom b/love2dToAPK/tools/tools/ant/lib/ant-netrexx.pom
new file mode 100644
index 0000000..505ad92
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-netrexx.pom
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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 POM has been created manually by the Ant Development Team.
+ Please contact us if you are not satisfied with the data contained in this POM.
+ URL : http://ant.apache.org
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-parent</artifactId>
+ <relativePath>../pom.xml</relativePath>
+ <version>1.9.6</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <url>http://ant.apache.org/</url>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-netrexx</artifactId>
+ <version>1.9.6</version>
+ <name>Apache Ant + NetRexx</name>
+ <description>NetRexxC task
+ dependency can be downloaded from http://www.ibm.com/software/awdtools/netrexx/download.html</description>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.9.6</version>
+ <scope>compile</scope>
+ </dependency>
+ <!-- Processed too early, before maven-antrun-plugin gets a chance to work:
+ <dependency>
+ <groupId>com.ibm.netrexx</groupId>
+ <artifactId>netrexx</artifactId>
+ <version>2.0.5</version>
+ <scope>system</scope>
+ <systemPath>${basedir}/../../../../lib/optional/NetRexxC.jar</systemPath>
+ </dependency>
+ -->
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <includes>
+ <include>org/apache/tools/ant/taskdefs/optional/NetRexxC*</include>
+ </includes>
+ <!-- Need to use this rather than system scope as above: -->
+ <compilerArguments>
+ <extdirs>${basedir}/../../../../lib/optional</extdirs>
+ </compilerArguments>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <version>1.4</version>
+ <executions>
+ <execution>
+ <phase>validate</phase>
+ <configuration>
+ <tasks>
+ <ant dir="${basedir}/../../../.." antfile="fetch.xml" target="netrexx">
+ <property name="dest" value="optional"/>
+ </ant>
+ </tasks>
+ </configuration>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ <sourceDirectory>../../../../src/main</sourceDirectory>
+ <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
+ <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
+ <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
+ <directory>../../../../target/${project.artifactId}</directory>
+ </build>
+</project>
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-parent.pom b/love2dToAPK/tools/tools/ant/lib/ant-parent.pom
new file mode 100644
index 0000000..47a4e32
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-parent.pom
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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 POM has been created manually by the Ant Development Team.
+ Please contact us if you are not satisfied with the data contained in this POM.
+ URL : http://ant.apache.org
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-parent</artifactId>
+ <version>1.9.6</version>
+ <packaging>pom</packaging>
+ <description>master POM</description>
+ <licenses>
+ <license>
+ <name>The Apache Software License, Version 2.0</name>
+ <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+ <distribution>repo</distribution>
+ </license>
+ </licenses>
+ <name>Apache Ant</name>
+ <url>http://ant.apache.org/</url>
+ <inceptionYear>2000</inceptionYear>
+ <organization>
+ <name>The Apache Software Foundation</name>
+ <url>http://www.apache.org/</url>
+ </organization>
+ <distributionManagement>
+ <!-- Null out inherited apache distribution repo by default -->
+ <repository>
+ <id>dummy</id>
+ <name>Dummy to avoid accidental deploys</name>
+ <url>http://nowhere.net/</url>
+ </repository>
+ </distributionManagement>
+ <scm>
+ <connection>scm:git:https://git-wip-us.apache.org/repos/asf/ant.git</connection>
+ <developerConnection>scm:git:https://git-wip-us.apache.org/repos/asf/ant.git</developerConnection>
+ <url>https://git-wip-us.apache.org/repos/asf/ant.git</url>
+ </scm>
+ <ciManagement>
+ <system>hudson</system>
+ <url>https://builds.apache.org/job/Ant_BuildFromPOMs/</url>
+ </ciManagement>
+ <mailingLists>
+ <mailingList>
+ <name>Ant Developers List</name>
+ <subscribe>dev-subscribe@ant.apache.org</subscribe>
+ <unsubscribe>dev-unsubscribe@ant.apache.org</unsubscribe>
+ <post>dev@ant.apache.org</post>
+ <archive>http://mail-archives.apache.org/mod_mbox/ant-dev</archive>
+ </mailingList>
+ <mailingList>
+ <name>Ant Users List</name>
+ <subscribe>user-subscribe@ant.apache.org</subscribe>
+ <unsubscribe>user-unsubscribe@ant.apache.org</unsubscribe>
+ <post>user@ant.apache.org</post>
+ <archive>http://mail-archives.apache.org/mod_mbox/ant-user</archive>
+ </mailingList>
+ </mailingLists>
+ <issueManagement>
+ <system>bugzilla</system>
+ <url>http://issues.apache.org/bugzilla/</url>
+ </issueManagement>
+ <modules>
+ <module>ant</module>
+ <module>ant-antlr</module>
+ <module>ant-apache-bcel</module>
+ <module>ant-apache-bsf</module>
+ <module>ant-apache-log4j</module>
+ <module>ant-apache-oro</module>
+ <module>ant-apache-regexp</module>
+ <module>ant-apache-resolver</module>
+ <module>ant-apache-xalan2</module>
+ <module>ant-commons-logging</module>
+ <module>ant-commons-net</module>
+ <module>ant-jai</module>
+ <module>ant-javamail</module>
+ <module>ant-jdepend</module>
+ <module>ant-jmf</module>
+ <module>ant-jsch</module>
+ <module>ant-junit</module>
+ <module>ant-junit4</module>
+ <module>ant-launcher</module>
+ <module>ant-netrexx</module>
+ <module>ant-swing</module>
+ <module>ant-testutil</module>
+ </modules>
+ <dependencies>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.2</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <sourceDirectory>../../../src/main</sourceDirectory>
+ <testSourceDirectory>../../../src/testcases</testSourceDirectory>
+ <outputDirectory>../../../target/classes</outputDirectory>
+ <testOutputDirectory>../../../target/testcases</testOutputDirectory>
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>2.3.2</version>
+ <configuration>
+ <source>1.5</source>
+ <target>1.5</target>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <version>2.4</version>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <version>2.12</version>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-report-plugin</artifactId>
+ <version>2.12</version>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ </properties>
+</project>
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-swing.jar b/love2dToAPK/tools/tools/ant/lib/ant-swing.jar
new file mode 100644
index 0000000..66e8a53
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-swing.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-swing.pom b/love2dToAPK/tools/tools/ant/lib/ant-swing.pom
new file mode 100644
index 0000000..1fd3e6a
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-swing.pom
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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 POM has been created manually by the Ant Development Team.
+ Please contact us if you are not satisfied with the data contained in this POM.
+ URL : http://ant.apache.org
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-parent</artifactId>
+ <relativePath>../pom.xml</relativePath>
+ <version>1.9.6</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <url>http://ant.apache.org/</url>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-swing</artifactId>
+ <version>1.9.6</version>
+ <name>Apache Ant + Swing</name>
+ <description>a listener and a splash task based on Swing</description>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.9.6</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <includes>
+ <include>org/apache/tools/ant/taskdefs/optional/splash/*</include>
+ </includes>
+ </configuration>
+ </plugin>
+ </plugins>
+ <sourceDirectory>../../../../src/main</sourceDirectory>
+ <testSourceDirectory>../../../../src/testcases</testSourceDirectory>
+ <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
+ <testOutputDirectory>../../../../target/${project.artifactId}/testcases</testOutputDirectory>
+ <directory>../../../../target/${project.artifactId}</directory>
+ </build>
+
+</project>
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-testutil.jar b/love2dToAPK/tools/tools/ant/lib/ant-testutil.jar
new file mode 100644
index 0000000..ed1dd13
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-testutil.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/ant/lib/ant-testutil.pom b/love2dToAPK/tools/tools/ant/lib/ant-testutil.pom
new file mode 100644
index 0000000..0b8c2d5
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant-testutil.pom
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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 POM has been created manually by the Ant Development Team.
+ Please contact us if you are not satisfied with the data contained in this POM.
+ URL : http://ant.apache.org
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-parent</artifactId>
+ <relativePath>../pom.xml</relativePath>
+ <version>1.9.6</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <url>http://ant.apache.org/</url>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-testutil</artifactId>
+ <version>1.9.6</version>
+ <name>Apache Ant Test Utilities</name>
+ <description>test utility classes</description>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.9.6</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.11</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <includes>
+ <include>org/apache/tools/ant/BuildFileTest*</include>
+ <include>org/apache/tools/ant/util/regexp/RegexpMatcherTest*</include>
+ <include>org/apache/tools/ant/util/regexp/RegexpTest*</include>
+ <include>org/apache/tools/ant/taskdefs/optional/AbstractXSLTLiaisonTest*</include>
+ <include>org/apache/tools/ant/types/AbstractFileSetTest*</include>
+ </includes>
+ </configuration>
+ </plugin>
+ </plugins>
+ <sourceDirectory>../../../../src/tests/junit</sourceDirectory>
+ <outputDirectory>../../../../target/${project.artifactId}/classes</outputDirectory>
+ <directory>../../../../target/${project.artifactId}</directory>
+ </build>
+
+</project>
diff --git a/love2dToAPK/tools/tools/ant/lib/ant.jar b/love2dToAPK/tools/tools/ant/lib/ant.jar
new file mode 100644
index 0000000..3bebb5c
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/ant/lib/ant.pom b/love2dToAPK/tools/tools/ant/lib/ant.pom
new file mode 100644
index 0000000..087c369
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/ant.pom
@@ -0,0 +1,225 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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 POM has been created manually by the Ant Development Team.
+ Please contact us if you are not satisfied with the data contained in this POM.
+ URL : http://ant.apache.org
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <parent>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-parent</artifactId>
+ <relativePath>../pom.xml</relativePath>
+ <version>1.9.6</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <url>http://ant.apache.org/</url>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.9.6</version>
+ <name>Apache Ant Core</name>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.ant</groupId>
+ <artifactId>ant-launcher</artifactId>
+ <version>1.9.6</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.11</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+ <build>
+ <filters>
+ <filter>../../../../target/ant/.build.timestamp.properties</filter>
+ </filters>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <configuration> </configuration>
+ </plugin>
+ <plugin>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>create-timestamp-file</id>
+ <phase>generate-resources</phase>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ <configuration>
+ <tasks>
+ <tstamp/>
+ <mkdir dir="${project.build.directory}"/>
+ <touch file="${project.build.directory}/.build.timestamp.properties"/>
+ <echo file="${project.build.directory}/.build.timestamp.properties" append="false"
+ message="TODAY=${TODAY}"/>
+ </tasks>
+ </configuration>
+ </execution>
+ <execution>
+ <id>delete-timestamp-file</id>
+ <phase>clean</phase>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ <configuration>
+ <tasks>
+ <delete file="${project.build.directory}/.build.timestamp.properties"/>
+ </tasks>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <excludes>
+ <exclude>org/apache/tools/ant/filters/util/JavaClassHelper*</exclude>
+ <exclude>org/apache/tools/ant/types/resolver/**</exclude>
+ <exclude>org/apache/tools/ant/listener/Log4jListener*</exclude>
+ <exclude>org/apache/tools/ant/listener/CommonsLoggingListener*</exclude>
+ <exclude>org/apache/tools/ant/util/regexp/JakartaRegexp*</exclude>
+ <exclude>org/apache/tools/ant/util/regexp/JakartaOro*</exclude>
+ <exclude>org/apache/tools/ant/taskdefs/email/MimeMailer*</exclude>
+ <exclude>org/apache/tools/ant/launch/**</exclude>
+ <exclude>org/apache/tools/ant/taskdefs/optional/net/FTP*</exclude>
+ <exclude>org/apache/tools/ant/taskdefs/optional/net/RExec*</exclude>
+ <exclude>org/apache/tools/ant/taskdefs/optional/net/TelnetTask*</exclude>
+ <exclude>org/apache/tools/ant/taskdefs/optional/junit/*</exclude>
+ <exclude>org/apache/tools/ant/taskdefs/optional/ssh/*</exclude>
+ <exclude>org/apache/tools/ant/taskdefs/optional/image/*</exclude>
+ <exclude>org/apache/tools/ant/types/optional/image/*</exclude>
+ <exclude>org/apache/tools/ant/taskdefs/optional/Script*</exclude>
+ <exclude>org/apache/tools/ant/taskdefs/optional/script/**</exclude>
+ <exclude>org/apache/tools/ant/types/optional/*Script*</exclude>
+ <exclude>org/apache/tools/ant/util/ScriptRunner.java</exclude>
+ <exclude>org/apache/tools/ant/util/optional/ScriptRunner.java</exclude>
+ <exclude>org/apache/tools/ant/filters/util/JavaClassHelper*</exclude>
+ <exclude>org/apache/tools/ant/util/depend/bcel/*</exclude>
+ <exclude>org/apache/tools/ant/taskdefs/optional/NetRexxC*</exclude>
+ <exclude>org/apache/tools/ant/taskdefs/optional/Xalan2TraceSupport*</exclude>
+ <exclude>org/apache/tools/ant/taskdefs/optional/jdepend/*</exclude>
+ </excludes>
+ <testExcludes>
+ <exclude>org/apache/tools/ant/filters/util/JavaClassHelper*</exclude>
+ <exclude>org/apache/tools/ant/types/resolver/**</exclude>
+ <exclude>org/apache/tools/ant/util/Script*</exclude>
+ <exclude>org/apache/tools/ant/listener/Log4jListener*</exclude>
+ <exclude>org/apache/tools/ant/listener/CommonsLoggingListener*</exclude>
+ <exclude>org/apache/tools/ant/util/regexp/JakartaRegexp*</exclude>
+ <exclude>org/apache/tools/ant/util/regexp/JakartaOro*</exclude>
+ <exclude>org/apache/tools/ant/util/regexp/Jdk14Regexp*</exclude>
+ <exclude>org/apache/tools/ant/taskdefs/email/MimeMailer*</exclude>
+ <exclude>org/apache/tools/ant/launch/**</exclude>
+ <exclude>org/apache/tools/ant/taskdefs/StyleTest*</exclude>
+ <exclude>org/apache/tools/ant/taskdefs/optional/junit/</exclude>
+ <exclude>org/apache/tools/ant/taskdefs/optional/net/FTP*</exclude>
+ <exclude>org/apache/tools/ant/taskdefs/optional/ssh/*</exclude>
+ </testExcludes>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <omitBasedir>true</omitBasedir>
+ <systemProperties>
+ <property>
+ <name>ant.home</name>
+ <value>${env.ANT_HOME}</value>
+ </property>
+ <property>
+ <name>build.tests</name>
+ <value>../../../../target/ant/testcases</value>
+ </property>
+ <property>
+ <name>build.tests.value</name>
+ <value>../../../../target/ant/testcases</value>
+ </property>
+ <property>
+ <name>offline</name>
+ <value>true</value>
+ </property>
+ <property>
+ <name>root</name>
+ <value>../../../..</value>
+ </property>
+ </systemProperties>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-report-plugin</artifactId>
+ </plugin>
+ </plugins>
+ <resources>
+ <resource>
+ <directory>../../../../src/main</directory>
+ <filtering>true</filtering>
+ <includes>
+ <include>org/apache/tools/ant/taskdefs/default.properties</include>
+ <include>org/apache/tools/ant/types/default.properties</include>
+ <include>org/apache/tools/ant/taskdefs/default.properties</include>
+ <include>org/apache/tools/ant/types/conditions/antlib.xml</include>
+ <include>org/apache/tools/ant/defaultManifest.mf</include>
+ <include>org/apache/tools/ant/version.txt</include>
+ </includes>
+ </resource>
+ <resource>
+ <directory>../../../../src/resources</directory>
+ <filtering>true</filtering>
+ <includes>
+ <include>**/antlib.xml</include>
+ </includes>
+ </resource>
+ <resource>
+ <directory>../../../../docs</directory>
+ <filtering>false</filtering>
+ <includes>
+ <include>images/ant_logo_large.gif</include>
+ </includes>
+ </resource>
+ </resources>
+ <testResources>
+ <testResource>
+ <directory>../../../../src/etc/testcases</directory>
+ <filtering>true</filtering>
+ </testResource>
+ <testResource>
+ <directory>../../../../src/main</directory>
+ <filtering>true</filtering>
+ <excludes>
+ <exclude>**/*.java</exclude>
+ </excludes>
+ </testResource>
+ </testResources>
+ <sourceDirectory>../../../../src/main</sourceDirectory>
+ <testSourceDirectory>../../../../src/tests/junit</testSourceDirectory>
+ <outputDirectory>../../../../target/ant/classes</outputDirectory>
+ <testOutputDirectory>../../../../target/ant/testcases</testOutputDirectory>
+ <directory>../../../../target/ant</directory>
+ </build>
+</project>
diff --git a/love2dToAPK/tools/tools/ant/lib/libraries.properties b/love2dToAPK/tools/tools/ant/lib/libraries.properties
new file mode 100644
index 0000000..d6aee6b
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/lib/libraries.properties
@@ -0,0 +1,65 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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 declares the libraries for use in
+#a given release of the components
+
+#if you change this, change the checksum to match
+m2.version=2.0.4
+m2.url=http\://repo1.maven.org/maven2
+m2.artifact-name=maven-artifact-ant
+m2.jar.name=${m2.artifact-name}-${m2.version}-dep.jar
+#this is the URL of the antlib library, that is pulled down for everything else.
+m2.antlib.url=${m2.url}/org/apache/maven/${m2.artifact-name}/${m2.version}/${m2.jar.name}
+#this is the sha1 checksum of the artifact
+m2.sha1.checksum=4e7ddfdb91600e9b59bb965ff8eef2f06015df50
+
+# Repository to use by default for fetching dependencies.
+m2.repo=http://repo1.maven.org/maven2/
+
+#versions of different libraries. Please keep in alphabetical order, except
+#when a specific dependency forces them to be out-of-order
+antlr.version=2.7.7
+bcel.version=5.1
+bsf.version=2.4.0
+bsh.version=2.0b4
+bsh-core.version=${bsh.version}
+commons-net.version=1.4.1
+commons-logging.version=1.1
+commons-logging-api.version=${commons-logging.version}
+jai-core.version=1.1.3
+jai-codec.version=1.1.3
+jasper-compiler.version=4.1.36
+jasper-runtime.version=${jasper-compiler.version}
+jdepend.version=2.9.1
+jruby.version=0.9.8
+junit.version=4.11
+jsch.version=0.1.50
+jython.version=2.1
+#log4j 1.2.15 requires JMS and a few other Sun jars that are not in the m2 repo
+log4j.version=1.2.14
+#js is the javascript implementation of the rhino project
+#17R1 is compiled with Java5 so we can't use the jar when building with JDK 1.4
+js.version=1.6R7
+oro.version=2.0.8
+regexp.version=1.3
+servlet-api.version=2.3
+which.version=1.0
+xalan.version=2.7.1
+xml-resolver.version=1.2
+mail.version=1.4
+#paired
+jacl.version=1.2.6
+tcljava.version=${jacl.version}
diff --git a/love2dToAPK/tools/tools/ant/patch.xml b/love2dToAPK/tools/tools/ant/patch.xml
new file mode 100644
index 0000000..910b123
--- /dev/null
+++ b/love2dToAPK/tools/tools/ant/patch.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0"?>
+
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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 Apache Ant to generate a patch file for Apache Ant.
+ =======================================================================
+-->
+<project name="create-patch" default="patchpackage" basedir=".">
+ <property environment="env"/>
+ <property name="patch.package" value="patch.tar.gz"/>
+ <property name="patch.file" value="patch.txt"/>
+
+ <condition property="git.found">
+ <or>
+ <available file="git" filepath="${env.PATH}"/>
+ <available file="git.exe" filepath="${env.PATH}"/>
+ <available file="git.exe" filepath="${env.Path}"/>
+ </or>
+ </condition>
+
+ <target name="createpatch">
+ <fail unless="git.found"
+ message="You need a version of git to create the patch"/>
+ <exec executable="git" output="${patch.file}">
+ <arg value="diff"/>
+ </exec>
+ </target>
+
+ <target name="patchpackage" depends="createpatch">
+ <gzip src="${patch.file}" destfile="${patch.file}.gz"/>
+ </target>
+</project>
diff --git a/love2dToAPK/tools/tools/jdk-win/COPYRIGHT b/love2dToAPK/tools/tools/jdk-win/COPYRIGHT
new file mode 100644
index 0000000..defd406
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/COPYRIGHT
@@ -0,0 +1,69 @@
+Copyright 1993, 2015, Oracle and/or its affiliates.
+All rights reserved.
+
+This software and related documentation are provided under a
+license agreement containing restrictions on use and
+disclosure and are protected by intellectual property laws.
+Except as expressly permitted in your license agreement or
+allowed by law, you may not use, copy, reproduce, translate,
+broadcast, modify, license, transmit, distribute, exhibit,
+perform, publish, or display any part, in any form, or by
+any means. Reverse engineering, disassembly, or
+decompilation of this software, unless required by law for
+interoperability, is prohibited.
+
+The information contained herein is subject to change
+without notice and is not warranted to be error-free. If you
+find any errors, please report them to us in writing.
+
+If this is software or related documentation that is
+delivered to the U.S. Government or anyone licensing it on
+behalf of the U.S. Government, the following notice is
+applicable:
+
+U.S. GOVERNMENT END USERS: Oracle programs, including any
+operating system, integrated software, any programs
+installed on the hardware, and/or documentation, delivered
+to U.S. Government end users are "commercial computer
+software" pursuant to the applicable Federal Acquisition
+Regulation and agency-specific supplemental regulations. As
+such, use, duplication, disclosure, modification, and
+adaptation of the programs, including any operating system,
+integrated software, any programs installed on the hardware,
+and/or documentation, shall be subject to license terms and
+license restrictions applicable to the programs. No other
+rights are granted to the U.S. Government.
+
+This software or hardware is developed for general use in a
+variety of information management applications. It is not
+developed or intended for use in any inherently dangerous
+applications, including applications that may create a risk
+of personal injury. If you use this software or hardware in
+dangerous applications, then you shall be responsible to
+take all appropriate fail-safe, backup, redundancy, and
+other measures to ensure its safe use. Oracle Corporation
+and its affiliates disclaim any liability for any damages
+caused by use of this software or hardware in dangerous
+applications.
+
+Oracle and Java are registered trademarks of Oracle and/or
+its affiliates. Other names may be trademarks of their
+respective owners.
+
+Intel and Intel Xeon are trademarks or registered trademarks
+of Intel Corporation. All SPARC trademarks are used under
+license and are trademarks or registered trademarks of SPARC
+International, Inc. AMD, Opteron, the AMD logo, and the AMD
+Opteron logo are trademarks or registered trademarks of
+Advanced Micro Devices. UNIX is a registered trademark of
+The Open Group.
+
+This software or hardware and documentation may provide
+access to or information on content, products, and services
+from third parties. Oracle Corporation and its affiliates
+are not responsible for and expressly disclaim all
+warranties of any kind with respect to third-party content,
+products, and services. Oracle Corporation and its
+affiliates will not be responsible for any loss, costs, or
+damages incurred due to your access to or use of third-party
+content, products, or services.
diff --git a/love2dToAPK/tools/tools/jdk-win/LICENSE b/love2dToAPK/tools/tools/jdk-win/LICENSE
new file mode 100644
index 0000000..39e216a
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/LICENSE
@@ -0,0 +1 @@
+Please refer to http://java.com/license
diff --git a/love2dToAPK/tools/tools/jdk-win/README.html b/love2dToAPK/tools/tools/jdk-win/README.html
new file mode 100644
index 0000000..10ea506
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/README.html
@@ -0,0 +1,9 @@
+<html>
+<head>
+<title>README
+</title>
+</head>
+<body>
+Please refer to <A HREF="http://java.com/licensereadme">http://java.com/licensereadme</A>
+</body>
+</html>
diff --git a/love2dToAPK/tools/tools/jdk-win/THIRDPARTYLICENSEREADME-JAVAFX.txt b/love2dToAPK/tools/tools/jdk-win/THIRDPARTYLICENSEREADME-JAVAFX.txt
new file mode 100644
index 0000000..ff9bbd0
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/THIRDPARTYLICENSEREADME-JAVAFX.txt
@@ -0,0 +1,1531 @@
+DO NOT TRANSLATE OR LOCALIZE
+
+***************************************************************************
+
+%%The following software may be included in this product:
+Microsoft DirectShow - Base Classes
+
+Use of any of this software is governed by the terms of the license below:
+
+MSDN - Information on Terms of Use
+
+Updated: February 13, 2008
+
+ON THIS PAGE
+
+ * ACCEPTANCE OF TERMS
+ * PRIVACY AND PROTECTION OF PERSONAL INFORMATION
+ * NOTICE SPECIFIC TO APIs AVAILABLE ON THIS WEB SITE
+ * NOTICE SPECIFIC TO SOFTWARE AVAILABLE ON THIS WEB SITE
+ * NOTICE SPECIFIC TO DOCUMENTATION AVAILABLE ON THIS WEB SITE
+ * NOTICES REGARDING SOFTWARE, DOCUMENTATION, APIS AND SERVICES AVAILABLE ON
+THIS WEB SITE
+ * RESERVATION OF RIGHTS
+ * MEMBER ACCOUNT, PASSWORD, AND SECURITY
+ * NO UNLAWFUL OR PROHIBITED USE
+ * USE OF SERVICES
+ * MATERIALS PROVIDED TO MICROSOFT OR POSTED AT ANY MICROSOFT WEB SITE
+ * NOTICES AND PROCEDURE FOR MAKING CLAIMS OF COPYRIGHT INFRINGEMENT
+ * LINKS TO THIRD PARTY SITES
+ * UNSOLICITED IDEA SUBMISSION POLICY
+ * COPYRIGHT NOTICE & FAQ
+ * TRADEMARKS
+
+ACCEPTANCE OF TERMS.
+
+Microsoft provides you with access to a variety of resources on this website
+(“Web Site”), including documentation and other product information
+(collectively the “Documentation”), download areas, communication forums, and
+other services (collectively "Services"), software, including developer tools
+and sample code (collectively “Software”), and Application Program Interface
+information (“APIs”). The Documentation, Services, Software, and APIs
+(including any updates, enhancements, new features, and/or the addition of any
+new Web properties to the Web Site), are subject to the following Terms of Use
+("TOU"), unless we have provided those items to you under more specific terms,
+in which case, those more specific terms will apply to the relevant item.
+Microsoft reserves the right to update the TOU at any time without notice to
+you. The most current version of the TOU can be reviewed by clicking on the
+"Terms of Use" hypertext link located at the bottom of our Web pages.
+
+Top of page
+PRIVACY AND PROTECTION OF PERSONAL INFORMATION.
+
+See the Privacy Statement disclosures relating to the collection and use of your
+information.
+
+Top of page
+NOTICE SPECIFIC TO APIS AVAILABLE ON THIS WEB SITE.
+
+Microsoft publishes information on a number of APIs on this Web Site. Microsoft
+will not assert any of its patent rights on account of your products calling
+these APIs in order to receive services from the Microsoft product that exposes
+the APIs.
+
+Top of page
+NOTICE SPECIFIC TO SOFTWARE AVAILABLE ON THIS WEB SITE.
+
+All Software is the copyrighted work of Microsoft and/or its suppliers. Use of
+the Software is governed by the terms of the end user license agreement, if any,
+which accompanies or is included with the Software ("License Agreement").
+
+If Microsoft makes Software available on this Web Site without a License
+Agreement, you may use such Software to design, develop and test your programs
+to run on Microsoft products and services.
+
+If Microsoft makes any code marked as “sample” available on this Web Site
+without a License Agreement, then that code is licensed to you under the terms
+of the Microsoft Limited Public License.
+
+The Software is made available for download solely for use by end users
+according to the License Agreement or these TOU. Any reproduction or
+redistribution of the Software not in accordance with the License Agreement or
+these TOU is expressly prohibited.
+
+WITHOUT LIMITING THE FOREGOING, COPYING OR REPRODUCTION OF THE SOFTWARE TO ANY
+OTHER SERVER OR LOCATION FOR FURTHER REPRODUCTION OR REDISTRIBUTION IS EXPRESSLY
+PROHIBITED, UNLESS SUCH REPRODUCTION OR REDISTRIBUTION IS EXPRESSLY PERMITTED BY
+THE LICENSE AGREEMENT ACCOMPANYING SUCH SOFTWARE.
+
+FOR YOUR CONVENIENCE, MICROSOFT MAY MAKE AVAILABLE ON THIS WEB SITE, TOOLS AND
+UTILITIES FOR USE AND/OR DOWNLOAD. MICROSOFT DOES NOT MAKE ANY ASSURANCES WITH
+REGARD TO THE ACCURACY OF THE RESULTS OR OUTPUT THAT DERIVES FROM SUCH USE OF
+ANY SUCH TOOLS AND UTILITIES. PLEASE RESPECT THE INTELLECTUAL PROPERTY RIGHTS OF
+OTHERS WHEN USING THE TOOLS AND UTILITIES MADE AVAILABLE ON THIS WEB SITE.
+
+RESTRICTED RIGHTS LEGEND. Any Software which is downloaded from the Web Site for
+or on behalf of the United States of America, its agencies and/or
+instrumentalities ("U.S. Government"), is provided with Restricted Rights... Use,
+duplication, or disclosure by the U.S. Government is subject to restrictions as
+set forth in subparagraph (c)(1)(ii) of the Rights in Technical Data and
+Computer Software clause at DFARS 252.227-7013 or subparagraphs (c)(1) and (2)
+of the Commercial Computer Software - Restricted Rights at 48 CFR 52.227-19, as
+applicable. Manufacturer is Microsoft Corporation, One Microsoft Way, Redmond,
+WA 98052-6399.
+
+Top of page
+NOTICE SPECIFIC TO DOCUMENTATION AVAILABLE ON THIS WEB SITE.
+
+All Documentation is the copyrighted work of Microsoft and/or its suppliers. Use
+of the Documentation is governed by the terms of the license agreement, if any,
+which accompanies or is included with the Documentation ("Documentation License
+Agreement").
+
+If Documentation is made available to you on this Web Site without a
+Documentation License Agreement, then You may annotate, translate, and make a
+reasonable number of copies of the Documentation for your internal use in
+designing, developing, and testing your software, products and services, and you
+may distribute a reasonable amount of portions of the Documentation as necessary
+to document your software, products, and services. You may not publish any such
+annotations or translations. You must preserve the below copyright notice in
+all copies of the Documentation and ensure that both the copyright notice and
+this permission notice appear in those copies. Accredited educational
+institutions, such as K-12, universities, private/public colleges, and state
+community colleges, may download and reproduce the Documentation for
+distribution in the classroom. Distribution outside the classroom requires
+express written permission. Use for any other purpose is expressly prohibited
+
+The Documentation does not include the design or layout of the Microsoft.com Web
+site or any other Microsoft owned, operated, licensed or controlled site.
+Elements of Microsoft Web sites are protected by trade dress, trademark, unfair
+competition, and other laws and may not be copied or imitated in whole or in
+part. No logo, graphic, sound or image from any Microsoft Web site may be copied
+or retransmitted unless expressly permitted by Microsoft.
+
+THE DOCUMENTATION AND RELATED GRAPHICS PUBLISHED ON THE WEB SITE COULD INCLUDE
+TECHNICAL INACCURACIES OR TYPOGRAPHICAL ERRORS. CHANGES ARE PERIODICALLY ADDED
+TO THE INFORMATION IN THIS WEB SITE. MICROSOFT AND/OR ITS RESPECTIVE SUPPLIERS
+MAY MAKE IMPROVEMENTS AND/OR CHANGES IN THE PRODUCT(S) AND/OR THE PROGRAM(S)
+DESCRIBED IN THIS WEB SITE AT ANY TIME.
+
+Top of page
+NOTICES REGARDING SOFTWARE, DOCUMENTATION, APIS AND SERVICES AVAILABLE ON THIS
+WEB SITE.
+
+THE SOFTWARE, DOCUMENTATION, APIS, AND SERVICES ARE WARRANTED, IF AT ALL, ONLY
+ACCORDING TO THE TERMS OF ASEPARATE AGREEMENT THAT COVERS THE APPLICABLE
+SOFTWARE, DOCUMENTATION, APIS, OR SERVICES. EXCEPT AS WARRANTED IN THAT SEPARATE
+AGREEMENT (IF ANY), MICROSOFT CORPORATION HEREBY DISCLAIMS ALL WARRANTIES AND
+CONDITIONS WITH REGARD TO THE SOFTWARE, DOCUMENTATION, APIS, AND SERVICES,
+INCLUDING ALL WARRANTIES AND CONDITIONS OF MERCHANTABILITY, WHETHER EXPRESS,
+IMPLIED OR STATUTORY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT.
+
+IN NO EVENT SHALL MICROSOFT AND/OR ITS RESPECTIVE SUPPLIERS BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF SOFTWARE, DOCUMENTATION, APIS, PROVISION OF OR FAILURE TO PROVIDE
+SERVICES, OR INFORMATION AVAILABLE FROM ANY OF THE FOREGOING SOFTWARE,
+DOCUMENTATION, APIS OR SERVICES.
+
+Top of page
+RESERVATION OF RIGHTS.
+
+Microsoft reserves all rights not expressly granted under these TOU, and no
+other rights are granted under these TOU by implication or estoppel or otherwise.
+
+Top of page
+MEMBER ACCOUNT, PASSWORD, AND SECURITY.
+
+If any of the Services requires you to open an account, you must complete the
+registration process by providing us with current, complete and accurate
+information as prompted by the applicable registration form. You also will
+choose a password and a user name. You are entirely responsible for maintaining
+the confidentiality of your password and account. Furthermore, you are entirely
+responsible for any and all activities that occur under your account. You agree
+to notify Microsoft immediately of any unauthorized use of your account or any
+other breach of security. Microsoft will not be liable for any loss that you may
+incur as a result of someone else using your password or account, either with or
+without your knowledge. However, you could be held liable for losses incurred by
+Microsoft or another party due to someone else using your account or password.
+You may not use anyone else's account at any time, without the permission of the
+account holder.
+
+Top of page
+NO UNLAWFUL OR PROHIBITED USE.
+
+As a condition of your use of the Services, you will not use the Services for
+any purpose that is unlawful or prohibited by these terms, conditions, and
+notices. You may not use the Services in any manner that could damage, disable,
+overburden, or impair any Microsoft server, or the network(s) connected to any
+Microsoft server, or interfere with any other party's use and enjoyment of any
+Services. You may not attempt to gain unauthorized access to any Services, other
+accounts, computer systems or networks connected to any Microsoft server or to
+any of the Services, through hacking, password mining or any other means. You
+may not obtain or attempt to obtain any materials or information through any
+means not intentionally made available through the Services.
+
+Top of page
+USE OF SERVICES.
+
+The Services may contain e-mail services, bulletin board services, chat areas,
+news groups, forums, communities, personal web pages, calendars, photo albums,
+file cabinets and/or other message or communication facilities designed to
+enable you to communicate with others (each a "Communication Service" and
+collectively "Communication Services"). You agree to use the Communication
+Services only to post, send and receive messages and material that are proper
+and, when applicable, related to the particular Communication Service. By way of
+example, and not as a limitation, you agree that when using the Communication
+Services, you will not:
+
+ * Use the Communication Services in connection with surveys, contests,
+pyramid schemes, chain letters, junk email, spamming or any duplicative or
+unsolicited messages (commercial or otherwise).
+ * Defame, abuse, harass, stalk, threaten or otherwise violate the legal
+rights (such as rights of privacy and publicity) of others.
+ * Publish, post, upload, distribute or disseminate any inappropriate,
+profane, defamatory, obscene, indecent or unlawful topic, name, material or
+information.
+ * Upload, or otherwise make available, files that contain images,
+photographs, software or other material protected by intellectual property laws,
+including, by way of example, and not as limitation, copyright or trademark laws
+(or by rights of privacy or publicity) unless you own or control the rights
+thereto or have received all necessary consent to do the same.
+ * Use any material or information, including images or photographs, which
+are made available through the Services in any manner that infringes any
+copyright, trademark, patent, trade secret, or other proprietary right of any party.
+ * Upload files that contain viruses, Trojan horses, worms, time bombs,
+cancelbots, corrupted files, or any other similar software or programs that may
+damage the operation of another's computer or property of another.
+ * Advertise or offer to sell or buy any goods or services for any business
+purpose, unless such Communication Services specifically allows such messages.
+ * Download any file posted by another user of a Communication Service that
+you know, or reasonably should know, cannot be legally reproduced, displayed,
+performed, and/or distributed in such manner.
+ * Falsify or delete any copyright management information, such as author
+attributions, legal or other proper notices or proprietary designations or
+labels of the origin or source of software or other material contained in a file
+that is uploaded.
+ * Restrict or inhibit any other user from using and enjoying the
+Communication Services.
+ * Violate any code of conduct or other guidelines which may be applicable
+for any particular Communication Service.
+ * Harvest or otherwise collect information about others, including e-mail
+addresses.
+ * Violate any applicable laws or regulations.
+ * Create a false identity for the purpose of misleading others.
+ * Use, download or otherwise copy, or provide (whether or not for a fee) to
+a person or entity any directory of users of the Services or other user or usage
+information or any portion thereof.
+
+Microsoft has no obligation to monitor the Communication Services. However,
+Microsoft reserves the right to review materials posted to the Communication
+Services and to remove any materials in its sole discretion. Microsoft reserves
+the right to terminate your access to any or all of the Communication Services
+at any time, without notice, for any reason whatsoever.
+
+Microsoft reserves the right at all times to disclose any information as
+Microsoft deems necessary to satisfy any applicable law, regulation, legal
+process or governmental request, or to edit, refuse to post or to remove any
+information or materials, in whole or in part, in Microsoft's sole discretion.
+
+Always use caution when giving out any personally identifiable information about
+yourself or your children in any Communication Services. Microsoft does not
+control or endorse the content, messages or information found in any
+Communication Services and, therefore, Microsoft specifically disclaims any
+liability with regard to the Communication Services and any actions resulting
+from your participation in any Communication Services. Managers and hosts are
+not authorized Microsoft spokespersons, and their views do not necessarily
+reflect those of Microsoft.
+
+Materials uploaded to the Communication Services may be subject to posted
+limitations on usage, reproduction and/or dissemination; you are responsible for
+adhering to such limitations if you download the materials.
+
+Top of page
+MATERIALS PROVIDED TO MICROSOFT OR POSTED AT ANY MICROSOFT WEB SITE.
+
+Microsoft does not claim ownership of the materials you provide to Microsoft
+(including feedback and suggestions) or post, upload, input or submit to any
+Services or its associated services for review by the general public, or by the
+members of any public or private community, (each a "Submission" and
+collectively "Submissions"). However, by posting, uploading, inputting,
+providing or submitting ("Posting") your Submission you are granting Microsoft,
+its affiliated companies, necessary sublicensees (including third parties whose
+products , technologies and services use or interface with any specific parts of
+a Microsoft software or service that includes the Submission) , without charge,
+the right to use, share and commercialize your Submission in any way and for
+any purpose. You will not give any Submission that is subject to a license that
+requires Microsoft to license its software or documentation to third parties
+because we include your Submission in them.
+
+Microsoft is under no obligation to post or use any Submission you may provide,
+and Microsoft may remove any Submission at any time in its sole discretion.
+
+By Posting a Submission you warrant and represent that you own or otherwise
+control all of the rights to your Submission as described in these TOU
+including, without limitation, all the rights necessary for you to Post the
+Submissions.
+
+In addition to the warranty and representation set forth above, by Posting a
+Submission that contains images, photographs, pictures or that are otherwise
+graphical in whole or in part ("Images"), you warrant and represent that (a) you
+are the copyright owner of such Images, or that the copyright owner of such
+Images has granted you permission to use such Images or any content and/or
+images contained in such Images consistent with the manner and purpose of your
+use and as otherwise permitted by these TOU, (b) you have the rights necessary
+to grant the licenses and sublicenses described in these TOU, and (c) that each
+person depicted in such Images, if any, has provided consent to the use of the
+Images as set forth in these TOU, including, by way of example, and not as a
+limitation, the distribution, public display and reproduction of such Images. By
+Posting Images, you are granting (a) to all members of your private community
+(for each such Images available to members of such private community), and/or
+(b) to the general public (for each such Images available anywhere on the
+Services or Web Site, other than a private community), permission to use your
+Images in connection with the use, as permitted by these TOU, of any of the
+Services or Web Site, (including, by way of example, and not as a limitation,
+making prints and gift items which include such Images), and including, without
+limitation, a non-exclusive, world-wide, royalty-free license to: copy,
+distribute, transmit, publicly display, publicly perform, reproduce, edit,
+translate and reformat your Images without having your name attached to such
+Images, and the right to sublicense such rights to any supplier of the Services.
+The licenses granted in the preceding sentences for a Images will terminate at
+the time you completely remove such Images from the Services or Web Site,
+provided that such termination shall not affect any licenses granted in
+connection with such Images prior to the time you completely remove such Images.
+No compensation will be paid with respect to the use of your Images.
+
+Top of page
+NOTICES AND PROCEDURE FOR MAKING CLAIMS OF COPYRIGHT INFRINGEMENT.
+
+Pursuant to Title 17, United States Code, Section 512(c)(2), notifications of
+claimed copyright infringement should be sent to Service Provider's Designated
+Agent. ALL INQUIRIES NOT RELEVANT TO THE FOLLOWING PROCEDURE WILL NOT RECEIVE A
+RESPONSE.
+
+See Notice and Procedure for Making Claims of Copyright Infringement.
+
+Top of page
+LINKS TO THIRD PARTY SITES.
+
+THE LINKS IN THIS AREA WILL LET YOU LEAVE MICROSOFT'S SITE. THE LINKED SITES ARE
+NOT UNDER THE CONTROL OF MICROSOFT AND MICROSOFT IS NOT RESPONSIBLE FOR THE
+CONTENTS OF ANY LINKED SITE OR ANY LINK CONTAINED IN A LINKED SITE, OR ANY
+CHANGES OR UPDATES TO SUCH SITES. MICROSOFT IS NOT RESPONSIBLE FOR WEBCASTING OR
+ANY OTHER FORM OF TRANSMISSION RECEIVED FROM ANY LINKED SITE. MICROSOFT IS
+PROVIDING THESE LINKS TO YOU ONLY AS A CONVENIENCE, AND THE INCLUSION OF ANY
+LINK DOES NOT IMPLY ENDORSEMENT BY MICROSOFT OF THE SITE.
+
+Top of page
+UNSOLICITED IDEA SUBMISSION POLICY.
+
+MICROSOFT OR ANY OF ITS EMPLOYEES DO NOT ACCEPT OR CONSIDER UNSOLICITED IDEAS,
+INCLUDING IDEAS FOR NEW ADVERTISING CAMPAIGNS, NEW PROMOTIONS, NEW PRODUCTS OR
+TECHNOLOGIES, PROCESSES, MATERIALS, MARKETING PLANS OR NEW PRODUCT NAMES. PLEASE
+DO NOT SEND ANY ORIGINAL CREATIVE ARTWORK, SAMPLES, DEMOS, OR OTHER WORKS... THE
+SOLE PURPOSE OF THIS POLICY IS TO AVOID POTENTIAL MISUNDERSTANDINGS OR DISPUTES
+WHEN MICROSOFT'S PRODUCTS OR MARKETING STRATEGIES MIGHT SEEM SIMILAR TO IDEAS
+SUBMITTED TO MICROSOFT. SO, PLEASE DO NOT SEND YOUR UNSOLICITED IDEAS TO
+MICROSOFT OR ANYONE AT MICROSOFT. IF, DESPITE OUR REQUEST THAT YOU NOT SEND US
+YOUR IDEAS AND MATERIALS, YOU STILL SEND THEM, PLEASE UNDERSTAND THAT MICROSOFT
+MAKES NO ASSURANCES THAT YOUR IDEAS AND MATERIALS WILL BE TREATED AS
+CONFIDENTIAL OR PROPRIETARY.
+
+Top of page
+COPYRIGHT NOTICE & FAQ.
+
+© 2008 Microsoft Corporation. All rights reserved.
+
+The following is provided for informational purposes only and should not be
+construed as legal advice. If you need legal advice, contact a lawyer.
+
+What is copyright?
+
+Copyright law protects original works, such as websites, books, music,
+paintings, photos and video. A work is “original” if it contains some elements
+you created and did not borrow from others. Typically, when you create an
+original work, you own the copyright. As the copyright owner, you can control
+how others use your work. For example, if you write a movie script, you have the
+right to, and can prevent others from, copying your script, sharing it with
+others (“distributing it”), making a movie or book from your script (a
+“derivative work”), or publicly performing your script as a play or movie. You
+also have the ability to sell or give away these rights. In other words, you
+could sell the right to make a movie based on your script to a movie studio.
+
+If you use someone else’s copyrighted materials without permission, that use
+generally violates the copyright owner's exclusive rights, and is copyright
+infringement. So if you create a new work and include parts of other people’s
+works in it (such as an existing photo, lengthy quotes from a book or a loop
+from a song), you must own or have permission to use the elements you borrow.
+For example, if your script is based on an existing popular series, you should
+obtain permission to use the elements you borrow from the series.
+
+Copyright law is different from the law of personal property. If you buy a
+physical object, such as a movie on DVD, you own the physical object. You do
+not, however, obtain ownership of the “copyrights” (the rights to make copies,
+distribute, make derivatives and publicly perform or display) in the content of
+the movie. The fact that you have obtained physical possession of a DVD does not
+automatically grant you the right to copy or share it.
+
+If you make your own movie, it may include many copyrighted works in it. So, if
+you decide to make a movie based on your script, you must either create all
+elements of it on your own, or have permission to use the elements you borrow.
+Especially keep in mind that photos or artwork hanging on the walls of your sets
+and music on the soundtrack (even if you own the CD or MP3) may be copyrighted.
+You should not include copyrighted works such as these in your movie without
+authorization.
+
+A few other things to keep in mind are:
+
+ 1. Just because a work does not include a copyright notice (e.g., © 2006
+Microsoft Corporation) does not mean the work is in the public domain. Copyright
+notices are generally not required for works to be protected by copyright.
+ 2. Just because a work is easily available on the internet or elsewhere does
+not mean you may use the work freely. Look for terms of use, such as Creative
+Commons, that explain how works you find on the Internet may be used.
+
+Isn't it in the public domain?
+
+Just because a work is freely available, does not mean it is in the “public
+domain.” Copyright is for a limited term; it does not last forever. In the
+copyright context, “public domain” means the copyright term has expired. Once a
+work is in the public domain, it may be freely used without permission from the
+copyright owner.
+
+Determining the term of copyright can be complex, particularly because copyright
+laws vary from country to country. Also, even if the copyright on a work has
+expired, you should be careful about how you use a public domain work. For
+example, a book may be in the public domain, but it might not be ok to scan the
+book cover to cover and post it on the internet. This is because the particular
+version of the book may contain new copyrightable material that is not in the
+public domain, such as cover art or footnotes.
+
+What about fair use?
+
+In limited situations, you can use copyrighted works without permission from the
+copyright holder. It can be difficult to figure out whether use of copyrighted
+works without permission is legal, though, because the laws in this area are
+often vague and vary from country to country.
+
+The copyright law in the United States has a doctrine called “fair use”. Fair
+use provides a defense to copyright infringement in some circumstances. For
+example, fair use allows documentary filmmakers to use very short clips of
+copyrighted movies, music and news footage without permission from the copyright
+owner. Fair use is a difficult concept because determining whether something is
+a fair use involves weighing four factors. Unfortunately, weighing the fair use
+factors rarely results in a clear-cut answer.
+
+Rather than applying a fair use test, many other countries have specific
+exceptions to copyright infringement. The number and type of exceptions vary by
+country, but they frequently allow copyrighted materials to be used without
+permission from the copyright holder for activities such as nonprofit research,
+teaching, news reporting, or private study.
+
+If you incorrectly decide that something is a fair use or falls into an
+exception to copyright infringement, you could be held criminally and civilly
+liable and have to pay damages. We suggest you talk to a lawyer if you have
+questions regarding fair uses of copyrighted works.
+
+What happens if you upload copyrighted materials to one of our websites without
+permission?
+
+By law, we are required to take down videos, music, photographs or other content
+you upload onto a website hosted by Microsoft if we learn that it infringes
+someone else’s copyright. If you believe that we have mistakenly taken down
+content you uploaded that you own or have permission to upload, you can also let
+us know that. Finally, if you upload infringing content repeatedly, we will
+terminate your account and you could face criminal and civil penalties. So
+please, respect other people’s copyrights.
+
+What if my stuff is on a Microsoft website without my permission?
+
+If you believe that anything on a website hosted by Microsoft infringes your
+copyright, let us know. Just provide us with the information requested here and
+we will see that your copyrighted works are taken down.
+
+What if I don't want my website crawled?
+
+Microsoft search services (MSN Search and Windows Live Search) follow the Robots
+Exclusion Standards. This means that you can control which pages Microsoft
+search engines index and how often Microsoft bots access your website. To learn
+how to do so, or for more information regarding Microsoft’s webcrawling and site
+indexing practices, please visit http://search.msn.com/docs/siteowner.aspx.
+
+Top of page
+TRADEMARKS.
+
+Trademark information is available at
+http://www.microsoft.com/library/toolbar/3.0/trademarks/en-us.mspx.
+
+Any rights not expressly granted herein are reserved.
+
+Send your questions to the appropriate contact as listed below:
+
+ * Microsoft Web properties, contact homepage@microsoft.com.
+ * MSN Web properties, contact webmaster@msn.com.
+ * Hotmail, contact support@hotmail.com; for spam/privacy issues, contact
+abuse@hotmail.com or hotmailprivacy@hotmail.com.
+ * Piracy questions can be routed to piracy@microsoft.com or by calling
+1-800-R-U-LEGIT.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Microsoft Public License (Ms-PL)
+Mon, 2007-10-15 19:23 — nelson
+
+This license governs use of the accompanying software. If you use the software, you
+accept this license. If you do not accept the license, do not use the software.
+
+1. Definitions
+The terms "reproduce," "reproduction," "derivative works," and "distribution"
+have the
+same meaning here as under U.S. copyright law.
+A "contribution" is the original software, or any additions or changes to the
+software.
+A "contributor" is any person that distributes its contribution under this license.
+"Licensed patents" are a contributor's patent claims that read directly on its
+contribution.
+
+2. Grant of Rights
+(A) Copyright Grant- Subject to the terms of this license, including the license
+conditions and limitations in section 3, each contributor grants you a
+non-exclusive, worldwide, royalty-free copyright license to reproduce its
+contribution, prepare derivative works of its contribution, and distribute its
+contribution or any derivative works that you create.
+(B) Patent Grant- Subject to the terms of this license, including the license
+conditions and limitations in section 3, each contributor grants you a
+non-exclusive, worldwide, royalty-free license under its licensed patents to
+make, have made, use, sell, offer for sale, import, and/or otherwise dispose of
+its contribution in the software or derivative works of the contribution in the
+software.
+
+3. Conditions and Limitations
+(A) No Trademark License- This license does not grant you rights to use any
+contributors' name, logo, or trademarks.
+(B) If you bring a patent claim against any contributor over patents that you
+claim are infringed by the software, your patent license from such contributor
+to the software ends automatically.
+(C) If you distribute any portion of the software, you must retain all
+copyright, patent, trademark, and attribution notices that are present in the
+software.
+(D) If you distribute any portion of the software in source code form, you may
+do so only under this license by including a complete copy of this license with
+your distribution. If you distribute any portion of the software in compiled or
+object code form, you may only do so under a license that complies with this
+license.
+(E) The software is licensed "as-is." You bear the risk of using it. The
+contributors give no express warranties, guarantees or conditions. You may have
+additional consumer rights under your local laws which this license cannot
+change. To the extent permitted under your local laws, the contributors exclude
+the implied warranties of merchantability, fitness for a particular purpose and
+non-infringement.
+
+***************************************************************************
+
+%%The following software may be included in this product:
+Apache Batik
+
+Use of any of this software is governed by the terms of the license below:
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution..."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
+
+***************************************************************************
+
+%%The following software may be included in this product:
+ASM
+
+Use of any of this software is governed by the terms of the license below:
+
+Copyright (c) 2000-2005 INRIA, France Telecom
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holders nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGE.
+
+***************************************************************************
+
+%%The following software may be included in this product:
+JPEG
+
+Use of any of this software is governed by the terms of the license below:
+
+Taken from code......
+
+LEGAL ISSUES
+============
+
+In plain English:
+
+1. We don't promise that this software works. (But if you find any bugs,
+ please let us know!)
+2. You can use this software for whatever you want. You don't have to pay us.
+3. You may not pretend that you wrote this software. If you use it in a
+ program, you must acknowledge somewhere in your documentation that
+ you've used the IJG code.
+
+In legalese:
+
+The authors make NO WARRANTY or representation, either express or implied,
+with respect to this software, its quality, accuracy, merchantability, or
+fitness for a particular purpose. This software is provided "AS IS", and you,
+its user, assume the entire risk as to its quality and accuracy.
+
+This software is copyright (C) 1991-1998, Thomas G. Lane.
+All Rights Reserved except as specified below.
+
+Permission is hereby granted to use, copy, modify, and distribute this
+software (or portions thereof) for any purpose, without fee, subject to these
+conditions:
+(1) If any part of the source code for this software is distributed, then this
+README file must be included, with this copyright and no-warranty notice
+unaltered; and any additions, deletions, or changes to the original files
+must be clearly indicated in accompanying documentation.
+(2) If only executable code is distributed, then the accompanying
+documentation must state that "this software is based in part on the work of
+the Independent JPEG Group".
+(3) Permission for use of this software is granted only if the user accepts
+full responsibility for any undesirable consequences; the authors accept
+NO LIABILITY for damages of any kind.
+
+These conditions apply to any software derived from or based on the IJG code,
+not just to the unmodified library. If you use our work, you ought to
+acknowledge us.
+
+Permission is NOT granted for the use of any IJG author's name or company name
+in advertising or publicity relating to this software or products derived from
+it. This software may be referred to only as "the Independent JPEG Group's
+software".
+
+We specifically permit and encourage the use of this software as the basis of
+commercial products, provided that all warranty or liability claims are
+assumed by the product vendor.
+
+
+ansi2knr.c is included in this distribution by permission of L. Peter Deutsch,
+sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA.
+ansi2knr.c is NOT covered by the above copyright and conditions, but instead
+by the usual distribution terms of the Free Software Foundation; principally,
+that you must include source code if you redistribute it. (See the file
+ansi2knr.c for full details.) However, since ansi2knr.c is not needed as part
+of any program generated from the IJG code, this does not limit you more than
+the foregoing paragraphs do.
+
+The Unix configuration script "configure" was produced with GNU Autoconf.
+It is copyright by the Free Software Foundation but is freely distributable.
+The same holds for its supporting scripts (config.guess, config.sub,
+ltconfig, ltmain.sh). Another support script, install-sh, is copyright
+by M.I.T. but is also freely distributable.
+
+It appears that the arithmetic coding option of the JPEG spec is covered by
+patents owned by IBM, AT&T, and Mitsubishi. Hence arithmetic coding cannot
+legally be used without obtaining one or more licenses. For this reason,
+support for arithmetic coding has been removed from the free JPEG software.
+(Since arithmetic coding provides only a marginal gain over the unpatented
+Huffman mode, it is unlikely that very many implementations will support it.)
+So far as we are aware, there are no patent restrictions on the remaining
+code.
+
+The IJG distribution formerly included code to read and write GIF files.
+To avoid entanglement with the Unisys LZW patent, GIF reading support has
+been removed altogether, and the GIF writer has been simplified to produce
+"uncompressed GIFs". This technique does not use the LZW algorithm; the
+resulting GIF files are larger than usual, but are readable by all standard
+GIF decoders.
+
+We are required to state that
+ "The Graphics Interchange Format(c) is the Copyright property of
+ CompuServe Incorporated. GIF(sm) is a Service Mark property of
+ CompuServe Incorporated."
+
+Additional License(s)
+
+"copyright"
+
+***************************************************************************
+
+MD5 License
+"THE BEER-WARE LICENSE" (Revision 42):
+ wrote this file. As long as you retain this
+notice you can do whatever you want with this stuff. If we meet some
+day, and you think this stuff is worth it, you can buy me a beer in
+return. Poul-Henning Kamp
+
+
+
+
+
+***************************************************************************
+
+
+%%The following software may be included in this product:
+ANTLR Java runtime binary only jar
+
+Use of any of this software is governed by the terms of the license below:
+
+ANTLR 3 License
+
+[The BSD License]
+Copyright (c) 2003-2007, Terence Parr
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation and/or
+other materials provided with the distribution.
+ * Neither the name of the author nor the names of its contributors may be
+used to endorse or promote products derived from this software without specific
+prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+***************************************************************************
+
+%%The following software may be included in this product:
+gstreamer
+
+You are receiving a copy of the GStreamer library in object code in the
+JavaFX runtime or JavaFX SDK. A
+copy of the Oracle modified GStreamer library in source code is located
+at http://oss.oracle.com/projects/gstreamer-mods/ . The terms of the
+Oracle license do NOT apply to the GStreamer program; it is licensed under
+the following license, separately from the Oracle programs you receive. If
+you do not wish to install this program, you may not wish to install
+the JavaFX Runtime or JavaFX SDK.
+
+Use of any of this software is governed by the terms of the license below:
+
+GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999
+Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
+[This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and
+change it. By contrast, the GNU General Public Licenses are intended to guarantee
+your freedom to share and change free software--to make sure the software is free
+for all its users.
+This license, the Lesser General Public License, applies to some specially
+designated software packages--typically libraries--of the Free Software Foundation
+and other authors who decide to use it. You can use it too, but we suggest you first
+think carefully about whether this license or the ordinary General Public License is
+the better strategy to use in any particular case, based on the explanations below.
+When we speak of free software, we are referring to freedom of use, not price. Our
+General Public Licenses are designed to make sure that you have the freedom to
+distribute copies of free software (and charge for this service if you wish); that
+you receive source code or can get it if you want it; that you can change the
+software and use pieces of it in new free programs; and that you are informed that
+you can do these things.
+To protect your rights, we need to make restrictions that forbid distributors to
+deny you these rights or to ask you to surrender these rights. These restrictions
+translate to certain responsibilities for you if you distribute copies of the
+library or if you modify it.
+For example, if you distribute copies of the library, whether gratis or for a fee,
+you must give the recipients all the rights that we gave you. You must make sure
+that they, too, receive or can get the source code. If you link other code with the
+library, you must provide complete object files to the recipients, so that they can
+relink them with the library after making changes to the library and recompiling it.
+And you must show them these terms so they know their rights.
+We protect your rights with a two-step method: (1) we copyright the library, and (2)
+we offer you this license, which gives you legal permission to copy, distribute
+and/or modify the library.
+To protect each distributor, we want to make it very clear that there is no warranty
+for the free library. Also, if the library is modified by someone else and passed
+on, the recipients should know that what they have is not the original version, so
+that the original author's reputation will not be affected by problems that might be
+introduced by others.
+Finally, software patents pose a constant threat to the existence of any free
+program. We wish to make sure that a company cannot effectively restrict the users
+of a free program by obtaining a restrictive license from a patent holder.
+Therefore, we insist that any patent license obtained for a version of the library
+must be consistent with the full freedom of use specified in this license.
+Most GNU software, including some libraries, is covered by the ordinary GNU General
+Public License. This license, the GNU Lesser General Public License, applies to
+certain designated libraries, and is quite different from the ordinary General
+Public License. We use this license for certain libraries in order to permit linking
+those libraries into non-free programs.
+When a program is linked with a library, whether statically or using a shared
+library, the combination of the two is legally speaking a combined work, a
+derivative of the original library. The ordinary General Public License therefore
+permits such linking only if the entire combination fits its criteria of freedom.
+The Lesser General Public License permits more lax criteria for linking other code
+with the library.
+We call this license the "Lesser" General Public License because it does Less to
+protect the user's freedom than the ordinary General Public License. It also
+provides other free software developers Less of an advantage over competing non-free
+programs. These disadvantages are the reason we use the ordinary General Public
+License for many libraries. However, the Lesser license provides advantages in
+certain special circumstances.
+For example, on rare occasions, there may be a special need to encourage the widest
+possible use of a certain library, so that it becomes a de-facto standard. To
+achieve this, non-free programs must be allowed to use the library. A more frequent
+case is that a free library does the same job as widely used non-free libraries. In
+this case, there is little to gain by limiting the free library to free software
+only, so we use the Lesser General Public License.
+In other cases, permission to use a particular library in non-free programs enables
+a greater number of people to use a large body of free software. For example,
+permission to use the GNU C Library in non-free programs enables many more people to
+use the whole GNU operating system, as well as its variant, the GNU/Linux operating
+system.
+Although the Lesser General Public License is Less protective of the users' freedom,
+it does ensure that the user of a program that is linked with the Library has the
+freedom and the wherewithal to run that program using a modified version of the
+Library.
+The precise terms and conditions for copying, distribution and modification follow.
+Pay close attention to the difference between a "work based on the library" and a
+"work that uses the library". The former contains code derived from the library,
+whereas the latter must be combined with the library in order to run.
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which
+contains a notice placed by the copyright holder or other authorized party saying it
+may be distributed under the terms of this Lesser General Public License (also
+called "this License"). Each licensee is addressed as "you".
+A "library" means a collection of software functions and/or data prepared so as to
+be conveniently linked with application programs (which use some of those functions
+and data) to form executables.
+The "Library", below, refers to any such software library or work which has been
+distributed under these terms. A "work based on the Library" means either the
+Library or any derivative work under copyright law: that is to say, a work
+containing the Library or a portion of it, either verbatim or with modifications
+and/or translated straightforwardly into another language. (Hereinafter, translation
+is included without limitation in the term "modification".)
+"Source code" for a work means the preferred form of the work for making
+modifications to it. For a library, complete source code means all the source code
+for all modules it contains, plus any associated interface definition files, plus
+the scripts used to control compilation and installation of the library.
+Activities other than copying, distribution and modification are not covered by this
+License; they are outside its scope. The act of running a program using the Library
+is not restricted, and output from such a program is covered only if its contents
+constitute a work based on the Library (independent of the use of the Library in a
+tool for writing it). Whether that is true depends on what the Library does and what
+the program that uses the Library does.
+1. You may copy and distribute verbatim copies of the Library's complete source code
+as you receive it, in any medium, provided that you conspicuously and appropriately
+publish on each copy an appropriate copyright notice and disclaimer of warranty;
+keep intact all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the Library.
+You may charge a fee for the physical act of transferring a copy, and you may at
+your option offer warranty protection in exchange for a fee.
+2. You may modify your copy or copies of the Library or any portion of it, thus
+forming a work based on the Library, and copy and distribute such modifications or
+work under the terms of Section 1 above, provided that you also meet all of these
+conditions:
+a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you
+changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third
+parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to
+be supplied by an application program that uses the facility, other than as an
+argument passed when the facility is invoked, then you must make a good faith effort
+to ensure that, in the event an application does not supply such function or table,
+the facility still operates, and performs whatever part of its purpose remains
+meaningful. (For example, a function in a library to compute square roots has a purpose that is
+entirely well-defined independent of the application. Therefore, Subsection 2d
+requires that any application-supplied function or table used by this function must
+be optional: if the application does not supply it, the square root function must
+still compute square roots.)
+These requirements apply to the modified work as a whole. If identifiable sections
+of that work are not derived from the Library, and can be reasonably considered
+independent and separate works in themselves, then this License, and its terms, do
+not apply to those sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based on the
+Library, the distribution of the whole must be on the terms of this License, whose
+permissions for other licensees extend to the entire whole, and thus to each and
+every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to
+work written entirely by you; rather, the intent is to exercise the right to control
+the distribution of derivative or collective works based on the Library.
+In addition, mere aggregation of another work not based on the Library with the
+Library (or with a work based on the Library) on a volume of a storage or
+distribution medium does not bring the other work under the scope of this License.
+3. You may opt to apply the terms of the ordinary GNU General Public License instead
+of this License to a given copy of the Library. To do this, you must alter all the
+notices that refer to this License, so that they refer to the ordinary GNU General
+Public License, version 2, instead of to this License. (If a newer version than
+version 2 of the ordinary GNU General Public License has appeared, then you can
+specify that version instead if you wish.) Do not make any other change in these
+notices.
+Once this change is made in a given copy, it is irreversible for that copy, so the
+ordinary GNU General Public License applies to all subsequent copies and derivative
+works made from that copy.
+This option is useful when you wish to copy part of the code of the Library into a
+program that is not a library.
+4. You may copy and distribute the Library (or a portion or derivative of it, under
+Section 2) in object code or executable form under the terms of Sections 1 and 2
+above provided that you accompany it with the complete corresponding machine-
+readable source code, which must be distributed under the terms of Sections 1 and 2
+above on a medium customarily used for software interchange.
+If distribution of object code is made by offering access to copy from a designated
+place, then offering equivalent access to copy the source code from the same place
+satisfies the requirement to distribute the source code, even though third parties
+are not compelled to copy the source along with the object code.
+5. A program that contains no derivative of any portion of the Library, but is
+designed to work with the Library by being compiled or linked with it, is called a
+"work that uses the Library". Such a work, in isolation, is not a derivative work of
+the Library, and therefore falls outside the scope of this License.
+However, linking a "work that uses the Library" with the Library creates an
+executable that is a derivative of the Library (because it contains portions of the
+Library), rather than a "work that uses the library". The executable is therefore
+covered by this License. Section 6 states terms for distribution of such
+executables.
+When a "work that uses the Library" uses material from a header file that is part of
+the Library, the object code for the work may be a derivative work of the Library
+even though the source code is not. Whether this is true is especially significant
+if the work can be linked without the Library, or if the work is itself a library.
+The threshold for this to be true is not precisely defined by law.
+If such an object file uses only numerical parameters, data structure layouts and
+accessors, and small macros and small inline functions (ten lines or less in
+length), then the use of the object file is unrestricted, regardless of whether it
+is legally a derivative work. (Executables containing this object code plus portions
+of the Library will still fall under Section 6.)
+Otherwise, if the work is a derivative of the Library, you may distribute the object
+code for the work under the terms of Section 6. Any executables containing that work
+also fall under Section 6, whether or not they are linked directly with the Library
+itself.
+6. As an exception to the Sections above, you may also combine or link a "work that
+uses the Library" with the Library to produce a work containing portions of the
+Library, and distribute that work under terms of your choice, provided that the
+terms permit modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+You must give prominent notice with each copy of the work that the Library is used
+in it and that the Library and its use are covered by this License. You must supply
+a copy of this License. If the work during execution displays copyright notices, you
+must include the copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one of these
+things:
+a) Accompany the work with the complete corresponding machine-readable source code
+for the Library including whatever changes were used in the work (which must be
+distributed under Sections 1 and 2 above); and, if the work is an executable linked
+with the Library, with the complete machine-readable "work that uses the Library",
+as object code and/or source code, so that the user can modify the Library and then
+relink to produce a modified executable containing the modified Library. (It is
+understood that the user who changes the contents of definitions files in the
+Library will not necessarily be able to recompile the application to use the
+modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable
+mechanism is one that (1) uses at run time a copy of the library already present on
+the user's computer system, rather than copying library functions into the
+executable, and (2) will operate properly with a modified version of the library, if
+the user installs one, as long as the modified version is interface-compatible with
+the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give
+the same user the materials specified in Subsection 6a, above, for a charge no more
+than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated
+place, offer equivalent access to copy the above specified materials from the same
+place. e) Verify that the user has already received a copy of these materials or that you
+have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must
+include any data and utility programs needed for reproducing the executable from it.
+However, as a special exception, the materials to be distributed need not include
+anything that is normally distributed (in either source or binary form) with the
+major components (compiler, kernel, and so on) of the operating system on which the
+executable runs, unless that component itself accompanies the executable.
+It may happen that this requirement contradicts the license restrictions of other
+proprietary libraries that do not normally accompany the operating system. Such a
+contradiction means you cannot use both them and the Library together in an
+executable that you distribute.
+7. You may place library facilities that are a work based on the Library side-by-
+side in a single library together with other library facilities not covered by this
+License, and distribute such a combined library, provided that the separate
+distribution of the work based on the Library and of the other library facilities is
+otherwise permitted, and provided that you do these two things:
+a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
+9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
+10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
+11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
+If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
+It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
+12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
+13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
+Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the
+Free Software Foundation.
+14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
+NO WARRANTY
+15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH
+YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE
+OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
+To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. one line to give the library's name and an idea of what it does. Copyright (C) year name of author
+This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
+This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail.
+You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
+Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+signature of Ty Coon, 1 April 1990 Ty Coon, President of Vice That's all there is to it!
+
+***************************************************************************
+
+%%The following software may be included in this product:
+JFXtras Core v 0.5
+
+Use of any of this software is governed by the terms of the license below:
+Copyright (c) 2008-2009, JFXtras Group
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+3. Neither the name of JFXtras nor the names of its contributors may be used
+ to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+
+***************************************************************************
+
+%%The following software may be included in this product:
+Webkit
+
+You are receiving a copy of the WebKit library in object code in the
+JavaFX runtime or JavaFX SDK.
+A copy of the Oracle modified WebKit library in source code is located
+at http://oss.oracle.com/projects/webkit-java-mods/ . The terms of the
+Oracle license do NOT apply to the WebKit program; it is licensed under
+the following license separately from the Oracle programs you receive.
+If you do not wish to install this program, you may not wish to install
+the JavaFX runtime or JavaFX SDK.
+
+Use of any of this software is governed by the terms of the license below:
+
+GNU LIBRARY GENERAL PUBLIC LICENSE
+Version 2, June 1991
+Copyright (C) 1991 Free Software Foundation, Inc.
+51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL. It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+Preamble
+The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
+This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, too.
+When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
+To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it.
+For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
+Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library.
+Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations.
+Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
+Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license.
+The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such.
+Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better.
+However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries.
+The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library.
+Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one.
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you".
+A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
+The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
+"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
+Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
+1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
+You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
+2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
+a) The modified work must itself be a software library.
+b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
+c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
+d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
+These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
+Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
+In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
+3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
+Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
+This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
+4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
+If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
+5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
+However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
+When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
+If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
+Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
+6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
+You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
+a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
+b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
+c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
+d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
+For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
+It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
+7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
+a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
+b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
+8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
+9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
+10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
+11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
+If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
+It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
+This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
+12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
+13. The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
+Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
+14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
+NO WARRANTY
+15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+
+
+***************************************************************************
+
+%%The following software may be included in this product:
+zlib
+
+
+/* zlib.h -- interface of the 'zlib' general purpose compression library
+ version 1.2.2, October 3rd, 2004
+
+ Copyright (C) 1995-2004 Jean-loup Gailly and Mark Adler
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jean-loup Gailly jloup@gzip.org
+ Mark Adler madler@alumni.caltech.edu
+
+*/
+
+***************************************************************************
+
+%%The following software may be included in this product:
+libpng
+
+This copy of the libpng notices is provided for your convenience. In case of
+any discrepancy between this copy and the notices in the file png.h that is
+included in the libpng distribution, the latter shall prevail.
+
+COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
+
+If you modify libpng you may insert additional notices immediately following
+this sentence.
+
+This code is released under the libpng license.
+
+libpng versions 1.2.6, August 15, 2004, through 1.5.0, January 6, 2011, are
+Copyright (c) 2004, 2006-2010 Glenn Randers-Pehrson, and are
+distributed according to the same disclaimer and license as libpng-1.2.5
+with the following individual added to the list of Contributing Authors
+
+ Cosmin Truta
+
+libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
+Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
+distributed according to the same disclaimer and license as libpng-1.0.6
+with the following individuals added to the list of Contributing Authors
+
+ Simon-Pierre Cadieux
+ Eric S. Raymond
+ Gilles Vollant
+
+and with the following additions to the disclaimer:
+
+ There is no warranty against interference with your enjoyment of the
+ library or against infringement. There is no warranty that our
+ efforts or the library will fulfill any of your particular purposes
+ or needs. This library is provided with all faults, and the entire
+ risk of satisfactory quality, performance, accuracy, and effort is with
+ the user.
+
+libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
+Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are
+distributed according to the same disclaimer and license as libpng-0.96,
+with the following individuals added to the list of Contributing Authors:
+
+ Tom Lane
+ Glenn Randers-Pehrson
+ Willem van Schaik
+
+libpng versions 0.89, June 1996, through 0.96, May 1997, are
+Copyright (c) 1996, 1997 Andreas Dilger
+Distributed according to the same disclaimer and license as libpng-0.88,
+with the following individuals added to the list of Contributing Authors:
+
+ John Bowler
+ Kevin Bracey
+ Sam Bushell
+ Magnus Holmgren
+ Greg Roelofs
+ Tom Tanner
+
+libpng versions 0.5, May 1995, through 0.88, January 1996, are
+Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
+
+For the purposes of this copyright and license, "Contributing Authors"
+is defined as the following set of individuals:
+
+ Andreas Dilger
+ Dave Martindale
+ Guy Eric Schalnat
+ Paul Schmidt
+ Tim Wegner
+
+The PNG Reference Library is supplied "AS IS". The Contributing Authors
+and Group 42, Inc. disclaim all warranties, expressed or implied,
+including, without limitation, the warranties of merchantability and of
+fitness for any purpose. The Contributing Authors and Group 42, Inc.
+assume no liability for direct, indirect, incidental, special, exemplary,
+or consequential damages, which may result from the use of the PNG
+Reference Library, even if advised of the possibility of such damage.
+
+Permission is hereby granted to use, copy, modify, and distribute this
+source code, or portions hereof, for any purpose, without fee, subject
+to the following restrictions:
+
+1. The origin of this source code must not be misrepresented.
+
+2. Altered versions must be plainly marked as such and must not
+ be misrepresented as being the original source.
+
+3. This Copyright notice may not be removed or altered from any
+ source or altered source distribution.
+
+The Contributing Authors and Group 42, Inc. specifically permit, without
+fee, and encourage the use of this source code as a component to
+supporting the PNG file format in commercial products. If you use this
+source code in a product, acknowledgment is not required but would be
+appreciated.
+
+
+A "png_get_copyright" function is available, for convenient use in "about"
+boxes and the like:
+
+ printf("%s",png_get_copyright(NULL));
+
+Also, the PNG logo (in PNG format, of course) is supplied in the
+files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
+
+Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a
+certification mark of the Open Source Initiative.
+
+Glenn Randers-Pehrson
+glennrp at users.sourceforge.net
+January 6, 2011
+
+***************************************************************************
+
+%%The following software may be included in this product:
+libxml
+
+The MIT License
+Copyright (c) <year> <copyright holders>
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+***************************************************************************
+
+%%The following software may be included in this product:
+libxslt
+
+The MIT License
+
+Copyright (c) <year> <copyright holders>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/love2dToAPK/tools/tools/jdk-win/THIRDPARTYLICENSEREADME.txt b/love2dToAPK/tools/tools/jdk-win/THIRDPARTYLICENSEREADME.txt
new file mode 100644
index 0000000..cd88baf
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/THIRDPARTYLICENSEREADME.txt
@@ -0,0 +1,3605 @@
+DO NOT TRANSLATE OR LOCALIZE.
+-----------------------------
+
+%% This notice is provided with respect to ASM Bytecode Manipulation
+Framework v5.0.3, which may be included with JRE 8, and JDK 8, and
+OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Copyright (c) 2000-2011 France Télécom
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holders nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGE.
+
+--- end of LICENSE ---
+
+--------------------------------------------------------------------------------
+
+%% This notice is provided with respect to BSDiff v4.3, which may be
+included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Copyright 2003-2005 Colin Percival
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted providing that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to CodeViewer 1.0, which may be
+included with JDK 8.
+
+--- begin of LICENSE ---
+
+Copyright 1999 by CoolServlets.com.
+
+Any errors or suggested improvements to this class can be reported as
+instructed on CoolServlets.com. We hope you enjoy this program... your
+comments will encourage further development! This software is distributed
+under the terms of the BSD License. Redistribution and use in source and
+binary forms, with or without modification, are permitted provided that the
+following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+Neither name of CoolServlets.com nor the names of its contributors may be
+used to endorse or promote products derived from this software without
+specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY COOLSERVLETS.COM AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Cryptix AES 3.2.0, which may be
+included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Cryptix General License
+
+Copyright (c) 1995-2005 The Cryptix Foundation Limited.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ 1. Redistributions of source code must retain the copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE CRYPTIX FOUNDATION LIMITED AND
+CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE CRYPTIX FOUNDATION LIMITED OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to CUP Parser Generator for
+Java 0.10k, which may be included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Copyright 1996-1999 by Scott Hudson, Frank Flannery, C. Scott Ananian
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted, provided
+that the above copyright notice appear in all copies and that both the
+copyright notice and this permission notice and warranty disclaimer appear in
+supporting documentation, and that the names of the authors or their
+employers not be used in advertising or publicity pertaining to distribution of
+the software without specific, written prior permission.
+
+The authors and their employers disclaim all warranties with regard to
+this software, including all implied warranties of merchantability and fitness.
+In no event shall the authors or their employers be liable for any special,
+indirect or consequential damages or any damages whatsoever resulting from
+loss of use, data or profits, whether in an action of contract, negligence or
+other tortious action, arising out of or in connection with the use or
+performance of this software.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Document Object Model (DOM) Level 2
+& 3, which may be included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+W3C SOFTWARE NOTICE AND LICENSE
+
+http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
+
+This work (and included software, documentation such as READMEs, or other
+related items) is being provided by the copyright holders under the following
+license. By obtaining, using and/or copying this work, you (the licensee)
+agree that you have read, understood, and will comply with the following terms
+and conditions.
+
+Permission to copy, modify, and distribute this software and its
+documentation, with or without modification, for any purpose and without fee
+or royalty is hereby granted, provided that you include the following on ALL
+copies of the software and documentation or portions thereof, including
+modifications:
+
+ 1.The full text of this NOTICE in a location viewable to users of the
+ redistributed or derivative work.
+
+ 2.Any pre-existing intellectual property disclaimers, notices, or terms and
+ conditions. If none exist, the W3C Software Short Notice should be included
+ (hypertext is preferred, text is permitted) within the body of any
+ redistributed or derivative code.
+
+ 3.Notice of any changes or modifications to the files, including the date
+ changes were made. (We recommend you provide URIs to the location from
+ which the code is derived.)
+
+THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS
+MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
+LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR
+PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY
+THIRD PARTY PATENTS,COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
+
+COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL
+OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR
+DOCUMENTATION. The name and trademarks of copyright holders may NOT be used
+in advertising or publicity pertaining to the software without specific,
+written prior permission. Title to copyright in this software and any
+associated documentation will at all times remain with copyright holders.
+
+____________________________________
+
+This formulation of W3C's notice and license became active on December 31
+2002. This version removes the copyright ownership notice such that this
+license can be used with materials other than those owned by the W3C, reflects
+that ERCIM is now a host of the W3C, includes references to this specific
+dated version of the license, and removes the ambiguous grant of "use".
+Otherwise, this version is the same as the previous version and is written so
+as to preserve the Free Software Foundation's assessment of GPL compatibility
+and OSI's certification under the Open Source Definition. Please see our
+Copyright FAQ for common questions about using materials from our site,
+including specific terms and conditions for packages like libwww, Amaya, and
+Jigsaw. Other questions about this notice can be directed to
+site-policy@w3.org.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Dynalink v0.5, which may be
+included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Copyright (c) 2009-2013, Attila Szegedi
+
+All rights reserved.Redistribution and use in source and binary forms, with or
+without modification, are permitted provided that the following conditions are
+met:* Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer. * Redistributions in
+binary form must reproduce the above copyright notice, this list of
+conditions and the following disclaimer in the documentation and/or other
+materials provided with the distribution. * Neither the name of Attila
+Szegedi nor the names of its contributors may be used to endorse or promote
+products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THEPOSSIBILITY OF SUCH DAMAGE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Elliptic Curve Cryptography, which
+may be included with JRE 8, JDK 8, and OpenJDK 8.
+
+You are receiving a copy of the Elliptic Curve Cryptography library in source
+form with the JDK 8 and OpenJDK 8 source distributions, and as object code in
+the JRE 8 & JDK 8 runtimes.
+
+In the case of the JRE 8 & JDK 8 runtimes, the terms of the Oracle license do
+NOT apply to the Elliptic Curve Cryptography library; it is licensed under the
+following license, separately from Oracle's JDK & JRE. If you do not wish to
+install the Elliptic Curve Cryptography library, you may delete the library
+named libsunec.so (on Solaris and Linux systems) or sunec.dll (on Windows
+systems) from the JRE bin directory reserved for native libraries.
+
+
+--- begin of LICENSE ---
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to ECMAScript Language
+Specification ECMA-262 Edition 5.1 which may be included with
+JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Copyright notice
+Copyright © 2011 Ecma International
+Ecma International
+Rue du Rhone 114
+CH-1204 Geneva
+Tel: +41 22 849 6000
+Fax: +41 22 849 6001
+Web: http://www.ecma-international.org
+
+This document and possible translations of it may be copied and furnished to
+others, and derivative works that comment on or otherwise explain it or assist
+in its implementation may be prepared, copied, published, and distributed, in
+whole or in part, without restriction of any kind, provided that the above
+copyright notice and this section are included on all such copies and derivative
+works. However, this document itself may not be modified in any way, including
+by removing the copyright notice or references to Ecma International, except as
+needed for the purpose of developing any document or deliverable produced by
+Ecma International (in which case the rules applied to copyrights must be
+followed) or as required to translate it into languages other than English. The
+limited permissions granted above are perpetual and will not be revoked by Ecma
+International or its successors or assigns. This document and the information
+contained herein is provided on an "AS IS" basis and ECMA INTERNATIONAL
+DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY
+WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP
+RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
+PURPOSE." Software License
+
+All Software contained in this document ("Software)" is protected by copyright
+and is being made available under the "BSD License", included below. This
+Software may be subject to third party rights (rights from parties other than
+Ecma International), including patent rights, and no licenses under such third
+party rights are granted under this license even if the third party concerned is
+a member of Ecma International. SEE THE ECMA CODE OF CONDUCT IN PATENT MATTERS
+AVAILABLE AT http://www.ecma-international.org/memento/codeofconduct.htm FOR
+INFORMATION REGARDING THE LICENSING OF PATENT CLAIMS THAT ARE REQUIRED TO
+IMPLEMENT ECMA INTERNATIONAL STANDARDS*. Redistribution and use in source and
+binary forms, with or without modification, are permitted provided that the
+following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation and/or
+other materials provided with the distribution.
+
+3. Neither the name of the authors nor Ecma International may be used to endorse
+or promote products derived from this software without specific prior written
+permission.
+
+THIS SOFTWARE IS PROVIDED BY THE ECMA INTERNATIONAL "AS IS" AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL ECMA INTERNATIONAL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+--- end of LICENSE ---
+
+%% This notice is provided with respect to Dynalink library which is included
+with the Nashorn technology.
+
+--- begin of LICENSE ---
+Copyright (c) 2009-2013, Attila Szegedi
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+* Neither the name of the copyright holder nor the names of
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--- end of LICENSE ---
+
+%% This notice is provided with respect to Joni library which is included
+with the Nashorn technology.
+
+--- begin of LICENSE ---
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to FontConfig 2.5, which may be
+included with JRE 8, JDK 8, and OpenJDK 8 source distributions on
+Linux and Solaris.
+
+--- begin of LICENSE ---
+
+Copyright © 2001,2003 Keith Packard
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that the
+above copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation, and that
+the name of Keith Packard not be used in advertising or publicity pertaining
+to distribution of the software without specific, written prior permission.
+Keith Packard makes no representations about the suitability of this software
+for any purpose. It is provided "as is" without express or implied warranty.
+
+KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL KEITH
+PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
+DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to IAIK PKCS#11 Wrapper,
+which may be included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+IAIK PKCS#11 Wrapper License
+
+Copyright (c) 2002 Graz University of Technology. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+3. The end-user documentation included with the redistribution, if any, must
+ include the following acknowledgment:
+
+ "This product includes software developed by IAIK of Graz University of
+ Technology."
+
+ Alternately, this acknowledgment may appear in the software itself, if and
+ wherever such third-party acknowledgments normally appear.
+
+4. The names "Graz University of Technology" and "IAIK of Graz University of
+ Technology" must not be used to endorse or promote products derived from this
+ software without prior written permission.
+
+5. Products derived from this software may not be called "IAIK PKCS Wrapper",
+ nor may "IAIK" appear in their name, without prior written permission of
+ Graz University of Technology.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+LICENSOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to ICU4C 4.0.1 and ICU4J 4.4, which
+may be included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Copyright (c) 1995-2010 International Business Machines Corporation and others
+
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, and/or sell copies of the
+Software, and to permit persons to whom the Software is furnished to do so,
+provided that the above copyright notice(s) and this permission notice appear
+in all copies of the Software and that both the above copyright notice(s) and
+this permission notice appear in supporting documentation.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN
+NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE
+LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY
+DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder shall not
+be used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization of the copyright holder.
+All trademarks and registered trademarks mentioned herein are the property of
+their respective owners.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to IJG JPEG 6b, which may be
+included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+This software is copyright (C) 1991-1998, Thomas G. Lane.
+All Rights Reserved except as specified below.
+
+Permission is hereby granted to use, copy, modify, and distribute this
+software (or portions thereof) for any purpose, without fee, subject to these
+conditions:
+(1) If any part of the source code for this software is distributed, then this
+README file must be included, with this copyright and no-warranty notice
+unaltered; and any additions, deletions, or changes to the original files
+must be clearly indicated in accompanying documentation.
+(2) If only executable code is distributed, then the accompanying
+documentation must state that "this software is based in part on the work of
+the Independent JPEG Group".
+(3) Permission for use of this software is granted only if the user accepts
+full responsibility for any undesirable consequences; the authors accept
+NO LIABILITY for damages of any kind.
+
+These conditions apply to any software derived from or based on the IJG code,
+not just to the unmodified library. If you use our work, you ought to
+acknowledge us.
+
+Permission is NOT granted for the use of any IJG author's name or company name
+in advertising or publicity relating to this software or products derived from
+it. This software may be referred to only as "the Independent JPEG Group's
+software".
+
+We specifically permit and encourage the use of this software as the basis of
+commercial products, provided that all warranty or liability claims are
+assumed by the product vendor.
+
+--- end of LICENSE ---
+
+--------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Joni v1.1.9, which may be
+included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to JOpt-Simple v3.0, which may be
+included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+ Copyright (c) 2004-2009 Paul R. Holser, Jr.
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+--- end of LICENSE ---
+
+--------------------------------------------------------------------------------
+
+%% This notice is provided with respect to JSON, which may be included
+with JRE 8 & JDK 8.
+
+--- begin of LICENSE ---
+
+Copyright (c) 2002 JSON.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+The Software shall be used for Good, not Evil.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Kerberos functionality, which
+which may be included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+ (C) Copyright IBM Corp. 1999 All Rights Reserved.
+ Copyright 1997 The Open Group Research Institute. All rights reserved.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Kerberos functionality from
+FundsXpress, INC., which may be included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+ Copyright (C) 1998 by the FundsXpress, INC.
+
+ All rights reserved.
+
+ Export of this software from the United States of America may require
+ a specific license from the United States Government. It is the
+ responsibility of any person or organization contemplating export to
+ obtain such a license before exporting.
+
+ WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
+ distribute this software and its documentation for any purpose and
+ without fee is hereby granted, provided that the above copyright
+ notice appear in all copies and that both that copyright notice and
+ this permission notice appear in supporting documentation, and that
+ the name of FundsXpress. not be used in advertising or publicity pertaining
+ to distribution of the software without specific, written prior
+ permission. FundsXpress makes no representations about the suitability of
+ this software for any purpose. It is provided "as is" without express
+ or implied warranty.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Kronos OpenGL headers, which may be
+included with JDK 8 and OpenJDK 8 source distributions.
+
+--- begin of LICENSE ---
+
+ Copyright (c) 2007 The Khronos Group Inc.
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and/or associated documentation files (the "Materials"), to
+ deal in the Materials without restriction, including without limitation the
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ sell copies of the Materials, and to permit persons to whom the Materials are
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Materials.
+
+ THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS IN THE
+ MATERIALS.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% Portions Copyright Eastman Kodak Company 1992
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to libpng 1.6.16, which may be
+included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+This copy of the libpng notices is provided for your convenience. In case of
+any discrepancy between this copy and the notices in the file png.h that is
+included in the libpng distribution, the latter shall prevail.
+
+COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
+
+If you modify libpng you may insert additional notices immediately following
+this sentence.
+
+This code is released under the libpng license.
+
+libpng versions 1.2.6, August 15, 2004, through 1.6.16, December 22, 2014, are
+Copyright (c) 2004, 2006-2014 Glenn Randers-Pehrson, and are
+distributed according to the same disclaimer and license as libpng-1.2.5
+with the following individual added to the list of Contributing Authors
+
+ Cosmin Truta
+
+libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
+Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
+distributed according to the same disclaimer and license as libpng-1.0.6
+with the following individuals added to the list of Contributing Authors
+
+ Simon-Pierre Cadieux
+ Eric S. Raymond
+ Gilles Vollant
+
+and with the following additions to the disclaimer:
+
+ There is no warranty against interference with your enjoyment of the
+ library or against infringement. There is no warranty that our
+ efforts or the library will fulfill any of your particular purposes
+ or needs. This library is provided with all faults, and the entire
+ risk of satisfactory quality, performance, accuracy, and effort is with
+ the user.
+
+libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
+Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are
+distributed according to the same disclaimer and license as libpng-0.96,
+with the following individuals added to the list of Contributing Authors:
+
+ Tom Lane
+ Glenn Randers-Pehrson
+ Willem van Schaik
+
+libpng versions 0.89, June 1996, through 0.96, May 1997, are
+Copyright (c) 1996, 1997 Andreas Dilger
+Distributed according to the same disclaimer and license as libpng-0.88,
+with the following individuals added to the list of Contributing Authors:
+
+ John Bowler
+ Kevin Bracey
+ Sam Bushell
+ Magnus Holmgren
+ Greg Roelofs
+ Tom Tanner
+
+libpng versions 0.5, May 1995, through 0.88, January 1996, are
+Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
+
+For the purposes of this copyright and license, "Contributing Authors"
+is defined as the following set of individuals:
+
+ Andreas Dilger
+ Dave Martindale
+ Guy Eric Schalnat
+ Paul Schmidt
+ Tim Wegner
+
+The PNG Reference Library is supplied "AS IS". The Contributing Authors
+and Group 42, Inc. disclaim all warranties, expressed or implied,
+including, without limitation, the warranties of merchantability and of
+fitness for any purpose. The Contributing Authors and Group 42, Inc.
+assume no liability for direct, indirect, incidental, special, exemplary,
+or consequential damages, which may result from the use of the PNG
+Reference Library, even if advised of the possibility of such damage.
+
+Permission is hereby granted to use, copy, modify, and distribute this
+source code, or portions hereof, for any purpose, without fee, subject
+to the following restrictions:
+
+1. The origin of this source code must not be misrepresented.
+
+2. Altered versions must be plainly marked as such and must not
+ be misrepresented as being the original source.
+
+3. This Copyright notice may not be removed or altered from any
+ source or altered source distribution.
+
+The Contributing Authors and Group 42, Inc. specifically permit, without
+fee, and encourage the use of this source code as a component to
+supporting the PNG file format in commercial products. If you use this
+source code in a product, acknowledgment is not required but would be
+appreciated.
+
+
+A "png_get_copyright" function is available, for convenient use in "about"
+boxes and the like:
+
+ printf("%s",png_get_copyright(NULL));
+
+Also, the PNG logo (in PNG format, of course) is supplied in the
+files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
+
+Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a
+certification mark of the Open Source Initiative.
+
+Glenn Randers-Pehrson
+glennrp at users.sourceforge.net
+December 22, 2014
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to libungif 4.1.3, which may be
+included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+The GIFLIB distribution is Copyright (c) 1997 Eric S. Raymond
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Little CMS 2.5, which may be
+included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Little CMS
+Copyright (c) 1998-2011 Marti Maria Saguer
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% Lucida is a registered trademark or trademark of Bigelow & Holmes in the
+U.S. and other countries.
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Mesa 3D Graphics Library v4.1,
+which may be included with JRE 8, JDK 8, and OpenJDK 8 source distributions.
+
+--- begin of LICENSE ---
+
+ Mesa 3-D graphics library
+ Version: 4.1
+
+ Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the "Software"),
+ to deal in the Software without restriction, including without limitation
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ and/or sell copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Mozilla Network Security
+Services (NSS), which is supplied with the JDK test suite in the OpenJDK
+source code repository. It is licensed under Mozilla Public License (MPL),
+version 2.0.
+
+The NSS libraries are supplied in executable form, built from unmodified
+NSS source code labeled with the "NSS_3_16_RTM" HG tag.
+
+The NSS source code is available in the OpenJDK source code repository at:
+ jdk/test/sun/security/pkcs11/nss/src
+
+The NSS libraries are available in the OpenJDK source code repository at:
+ jdk/test/sun/security/pkcs11/nss/lib
+
+--- begin of LICENSE ---
+
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+ means each individual or legal entity that creates, contributes to
+ the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+ means the combination of the Contributions of others (if any) used
+ by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+ means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+ means Source Code Form to which the initial Contributor has attached
+ the notice in Exhibit A, the Executable Form of such Source Code
+ Form, and Modifications of such Source Code Form, in each case
+ including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+ means
+
+ (a) that the initial Contributor has attached the notice described
+ in Exhibit B to the Covered Software; or
+
+ (b) that the Covered Software was made available under the terms of
+ version 1.1 or earlier of the License, but not also under the
+ terms of a Secondary License.
+
+1.6. "Executable Form"
+ means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+ means a work that combines Covered Software with other material, in
+ a separate file or files, that is not Covered Software.
+
+1.8. "License"
+ means this document.
+
+1.9. "Licensable"
+ means having the right to grant, to the maximum extent possible,
+ whether at the time of the initial grant or subsequently, any and
+ all of the rights conveyed by this License.
+
+1.10. "Modifications"
+ means any of the following:
+
+ (a) any file in Source Code Form that results from an addition to,
+ deletion from, or modification of the contents of Covered
+ Software; or
+
+ (b) any new file in Source Code Form that contains any Covered
+ Software.
+
+1.11. "Patent Claims" of a Contributor
+ means any patent claim(s), including without limitation, method,
+ process, and apparatus claims, in any patent Licensable by such
+ Contributor that would be infringed, but for the grant of the
+ License, by the making, using, selling, offering for sale, having
+ made, import, or transfer of either its Contributions or its
+ Contributor Version.
+
+1.12. "Secondary License"
+ means either the GNU General Public License, Version 2.0, the GNU
+ Lesser General Public License, Version 2.1, the GNU Affero General
+ Public License, Version 3.0, or any later versions of those
+ licenses.
+
+1.13. "Source Code Form"
+ means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+ means an individual or a legal entity exercising rights under this
+ License. For legal entities, "You" includes any entity that
+ controls, is controlled by, or is under common control with You. For
+ purposes of this definition, "control" means (a) the power, direct
+ or indirect, to cause the direction or management of such entity,
+ whether by contract or otherwise, or (b) ownership of more than
+ fifty percent (50%) of the outstanding shares or beneficial
+ ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+ Licensable by such Contributor to use, reproduce, make available,
+ modify, display, perform, distribute, and otherwise exploit its
+ Contributions, either on an unmodified basis, with Modifications, or
+ as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+ for sale, have made, import, and otherwise transfer either its
+ Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+ or
+
+(b) for infringements caused by: (i) Your and any other third party's
+ modifications of Covered Software, or (ii) the combination of its
+ Contributions with other software (except as part of its Contributor
+ Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+ its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+ Form, as described in Section 3.1, and You must inform recipients of
+ the Executable Form how they can obtain a copy of such Source Code
+ Form by reasonable means in a timely manner, at a charge no more
+ than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+ License, or sublicense it under different terms, provided that the
+ license for the Executable Form does not attempt to limit or alter
+ the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+* *
+* 6. Disclaimer of Warranty *
+* ------------------------- *
+* *
+* Covered Software is provided under this License on an "as is" *
+* basis, without warranty of any kind, either expressed, implied, or *
+* statutory, including, without limitation, warranties that the *
+* Covered Software is free of defects, merchantable, fit for a *
+* particular purpose or non-infringing. The entire risk as to the *
+* quality and performance of the Covered Software is with You. *
+* Should any Covered Software prove defective in any respect, You *
+* (not any Contributor) assume the cost of any necessary servicing, *
+* repair, or correction. This disclaimer of warranty constitutes an *
+* essential part of this License. No use of any Covered Software is *
+* authorized under this License except under this disclaimer. *
+* *
+************************************************************************
+
+************************************************************************
+* *
+* 7. Limitation of Liability *
+* -------------------------- *
+* *
+* Under no circumstances and under no legal theory, whether tort *
+* (including negligence), contract, or otherwise, shall any *
+* Contributor, or anyone who distributes Covered Software as *
+* permitted above, be liable to You for any direct, indirect, *
+* special, incidental, or consequential damages of any character *
+* including, without limitation, damages for lost profits, loss of *
+* goodwill, work stoppage, computer failure or malfunction, or any *
+* and all other commercial damages or losses, even if such party *
+* shall have been informed of the possibility of such damages. This *
+* limitation of liability shall not apply to liability for death or *
+* personal injury resulting from such party's negligence to the *
+* extent applicable law prohibits such limitation. Some *
+* jurisdictions do not allow the exclusion or limitation of *
+* incidental or consequential damages, so this exclusion and *
+* limitation may not apply to You. *
+* *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+ This Source Code Form is subject to the terms of the Mozilla Public
+ License, v. 2.0. If a copy of the MPL was not distributed with this
+ file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+ This Source Code Form is "Incompatible With Secondary Licenses", as
+ defined by the Mozilla Public License, v. 2.0.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to PC/SC Lite for Suse Linux v.1.1.1,
+which may be included with JRE 8, JDK 8, and OpenJDK 8 on Linux and Solaris.
+
+--- begin of LICENSE ---
+
+Copyright (c) 1999-2004 David Corcoran <corcoran@linuxnet.com>
+Copyright (c) 1999-2004 Ludovic Rousseau <ludovic.rousseau (at) free.fr>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+3. All advertising materials mentioning features or use of this software
+ must display the following acknowledgement:
+ This product includes software developed by:
+ David Corcoran <corcoran@linuxnet.com>
+ http://www.linuxnet.com (MUSCLE)
+4. The name of the author may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+Changes to this license can be made only by the copyright author with
+explicit written consent.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to PorterStemmer v4, which may be
+included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+See: http://tartarus.org/~martin/PorterStemmer
+
+The software is completely free for any purpose, unless notes at the head of
+the program text indicates otherwise (which is rare). In any case, the notes
+about licensing are never more restrictive than the BSD License.
+
+In every case where the software is not written by me (Martin Porter), this
+licensing arrangement has been endorsed by the contributor, and it is
+therefore unnecessary to ask the contributor again to confirm it.
+
+I have not asked any contributors (or their employers, if they have them) for
+proofs that they have the right to distribute their software in this way.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Relax NG Object/Parser v.20050510,
+which may be included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Copyright (c) Kohsuke Kawaguchi
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions: The above copyright
+notice and this permission notice shall be included in all copies or
+substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to RelaxNGCC v1.12, which may be
+included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Copyright (c) 2000-2003 Daisuke Okajima and Kohsuke Kawaguchi.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+3. The end-user documentation included with the redistribution, if any, must
+ include the following acknowledgment:
+
+ "This product includes software developed by Daisuke Okajima
+ and Kohsuke Kawaguchi (http://relaxngcc.sf.net/)."
+
+Alternately, this acknowledgment may appear in the software itself, if and
+wherever such third-party acknowledgments normally appear.
+
+4. The names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission. For
+ written permission, please contact the copyright holders.
+
+5. Products derived from this software may not be called "RELAXNGCC", nor may
+ "RELAXNGCC" appear in their name, without prior written permission of the
+ copyright holders.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE APACHE
+SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to SAX 2.0.1, which may be included
+with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+ SAX is free!
+
+ In fact, it's not possible to own a license to SAX, since it's been placed in
+ the public domain.
+
+ No Warranty
+
+ Because SAX is released to the public domain, there is no warranty for the
+ design or for the software implementation, to the extent permitted by
+ applicable law. Except when otherwise stated in writing the copyright holders
+ and/or other parties provide SAX "as is" without warranty of any kind, either
+ expressed or implied, including, but not limited to, the implied warranties
+ of merchantability and fitness for a particular purpose. The entire risk as
+ to the quality and performance of SAX is with you. Should SAX prove
+ defective, you assume the cost of all necessary servicing, repair or
+ correction.
+
+ In no event unless required by applicable law or agreed to in writing will
+ any copyright holder, or any other party who may modify and/or redistribute
+ SAX, be liable to you for damages, including any general, special, incidental
+ or consequential damages arising out of the use or inability to use SAX
+ (including but not limited to loss of data or data being rendered inaccurate
+ or losses sustained by you or third parties or a failure of the SAX to
+ operate with any other programs), even if such holder or other party has been
+ advised of the possibility of such damages.
+
+ Copyright Disclaimers
+
+ This page includes statements to that effect by David Megginson, who would
+ have been able to claim copyright for the original work. SAX 1.0
+
+ Version 1.0 of the Simple API for XML (SAX), created collectively by the
+ membership of the XML-DEV mailing list, is hereby released into the public
+ domain.
+
+ No one owns SAX: you may use it freely in both commercial and non-commercial
+ applications, bundle it with your software distribution, include it on a
+ CD-ROM, list the source code in a book, mirror the documentation at your own
+ web site, or use it in any other way you see fit.
+
+ David Megginson, sax@megginson.com
+ 1998-05-11
+
+ SAX 2.0
+
+ I hereby abandon any property rights to SAX 2.0 (the Simple API for XML), and
+ release all of the SAX 2.0 source code, compiled code, and documentation
+ contained in this distribution into the Public Domain. SAX comes with NO
+ WARRANTY or guarantee of fitness for any purpose.
+
+ David Megginson, david@megginson.com
+ 2000-05-05
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to SoftFloat version 2b, which may be
+included with JRE 8, JDK 8, and OpenJDK 8 on Linux/ARM.
+
+--- begin of LICENSE ---
+
+Use of any of this software is governed by the terms of the license below:
+
+SoftFloat was written by me, John R. Hauser. This work was made possible in
+part by the International Computer Science Institute, located at Suite 600,
+1947 Center Street, Berkeley, California 94704. Funding was partially
+provided by the National Science Foundation under grant MIP-9311980. The
+original version of this code was written as part of a project to build
+a fixed-point vector processor in collaboration with the University of
+California at Berkeley, overseen by Profs. Nelson Morgan and John Wawrzynek.
+
+THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort
+has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
+TIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO
+PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL
+LOSSES, COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO
+FURTHERMORE EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER
+SCIENCE INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES,
+COSTS, OR OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE
+SOFTWARE.
+
+Derivative works are acceptable, even for commercial purposes, provided
+that the minimal documentation requirements stated in the source code are
+satisfied.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Sparkle 1.5,
+which may be included with JRE 8 on Mac OS X.
+
+--- begin of LICENSE ---
+
+Copyright (c) 2012 Sparkle.org and Andy Matuschak
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% Portions licensed from Taligent, Inc.
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Thai Dictionary, which may be
+included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Copyright (C) 1982 The Royal Institute, Thai Royal Government.
+
+Copyright (C) 1998 National Electronics and Computer Technology Center,
+National Science and Technology Development Agency,
+Ministry of Science Technology and Environment,
+Thai Royal Government.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Unicode 6.2.0 & CLDR 21.0.1
+which may be included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Unicode Terms of Use
+
+For the general privacy policy governing access to this site, see the Unicode
+Privacy Policy. For trademark usage, see the Unicode® Consortium Name and
+Trademark Usage Policy.
+
+A. Unicode Copyright.
+ 1. Copyright © 1991-2013 Unicode, Inc. All rights reserved.
+
+ 2. Certain documents and files on this website contain a legend indicating
+ that "Modification is permitted." Any person is hereby authorized,
+ without fee, to modify such documents and files to create derivative
+ works conforming to the Unicode® Standard, subject to Terms and
+ Conditions herein.
+
+ 3. Any person is hereby authorized, without fee, to view, use, reproduce,
+ and distribute all documents and files solely for informational
+ purposes in the creation of products supporting the Unicode Standard,
+ subject to the Terms and Conditions herein.
+
+ 4. Further specifications of rights and restrictions pertaining to the use
+ of the particular set of data files known as the "Unicode Character
+ Database" can be found in Exhibit 1.
+
+ 5. Each version of the Unicode Standard has further specifications of
+ rights and restrictions of use. For the book editions (Unicode 5.0 and
+ earlier), these are found on the back of the title page. The online
+ code charts carry specific restrictions. All other files, including
+ online documentation of the core specification for Unicode 6.0 and
+ later, are covered under these general Terms of Use.
+
+ 6. No license is granted to "mirror" the Unicode website where a fee is
+ charged for access to the "mirror" site.
+
+ 7. Modification is not permitted with respect to this document. All copies
+ of this document must be verbatim.
+
+B. Restricted Rights Legend. Any technical data or software which is licensed
+ to the United States of America, its agencies and/or instrumentalities
+ under this Agreement is commercial technical data or commercial computer
+ software developed exclusively at private expense as defined in FAR 2.101,
+ or DFARS 252.227-7014 (June 1995), as applicable. For technical data, use,
+ duplication, or disclosure by the Government is subject to restrictions as
+ set forth in DFARS 202.227-7015 Technical Data, Commercial and Items (Nov
+ 1995) and this Agreement. For Software, in accordance with FAR 12-212 or
+ DFARS 227-7202, as applicable, use, duplication or disclosure by the
+ Government is subject to the restrictions set forth in this Agreement.
+
+C. Warranties and Disclaimers.
+ 1. This publication and/or website may include technical or typographical
+ errors or other inaccuracies . Changes are periodically added to the
+ information herein; these changes will be incorporated in new editions
+ of the publication and/or website. Unicode may make improvements and/or
+ changes in the product(s) and/or program(s) described in this
+ publication and/or website at any time.
+
+ 2. If this file has been purchased on magnetic or optical media from
+ Unicode, Inc. the sole and exclusive remedy for any claim will be
+ exchange of the defective media within ninety (90) days of original
+ purchase.
+
+ 3. EXCEPT AS PROVIDED IN SECTION C.2, THIS PUBLICATION AND/OR SOFTWARE IS
+ PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND EITHER EXPRESS, IMPLIED,
+ OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
+ UNICODE AND ITS LICENSORS ASSUME NO RESPONSIBILITY FOR ERRORS OR
+ OMISSIONS IN THIS PUBLICATION AND/OR SOFTWARE OR OTHER DOCUMENTS WHICH
+ ARE REFERENCED BY OR LINKED TO THIS PUBLICATION OR THE UNICODE WEBSITE.
+
+D. Waiver of Damages. In no event shall Unicode or its licensors be liable for
+ any special, incidental, indirect or consequential damages of any kind, or
+ any damages whatsoever, whether or not Unicode was advised of the
+ possibility of the damage, including, without limitation, those resulting
+ from the following: loss of use, data or profits, in connection with the
+ use, modification or distribution of this information or its derivatives.
+
+E.Trademarks & Logos.
+ 1. The Unicode Word Mark and the Unicode Logo are trademarks of Unicode,
+ Inc. “The Unicode Consortium” and “Unicode, Inc.” are trade names of
+ Unicode, Inc. Use of the information and materials found on this
+ website indicates your acknowledgement of Unicode, Inc.’s exclusive
+ worldwide rights in the Unicode Word Mark, the Unicode Logo, and the
+ Unicode trade names.
+
+ 2. The Unicode Consortium Name and Trademark Usage Policy (“Trademark
+ Policy”) are incorporated herein by reference and you agree to abide by
+ the provisions of the Trademark Policy, which may be changed from time
+ to time in the sole discretion of Unicode, Inc.
+
+ 3. All third party trademarks referenced herein are the property of their
+ respective owners.
+
+Miscellaneous.
+ 1. Jurisdiction and Venue. This server is operated from a location in the
+ State of California, United States of America. Unicode makes no
+ representation that the materials are appropriate for use in other
+ locations. If you access this server from other locations, you are
+ responsible for compliance with local laws. This Agreement, all use of
+ this site and any claims and damages resulting from use of this site are
+ governed solely by the laws of the State of California without regard to
+ any principles which would apply the laws of a different jurisdiction.
+ The user agrees that any disputes regarding this site shall be resolved
+ solely in the courts located in Santa Clara County, California. The user
+ agrees said courts have personal jurisdiction and agree to waive any
+ right to transfer the dispute to any other forum.
+
+ 2. Modification by Unicode. Unicode shall have the right to modify this
+ Agreement at any time by posting it to this site. The user may not
+ assign any part of this Agreement without Unicode’s prior written
+ consent.
+
+ 3. Taxes. The user agrees to pay any taxes arising from access to this
+ website or use of the information herein, except for those based on
+ Unicode’s net income.
+
+ 4. Severability. If any provision of this Agreement is declared invalid or
+ unenforceable, the remaining provisions of this Agreement shall remain
+ in effect.
+
+ 5. Entire Agreement. This Agreement constitutes the entire agreement
+ between the parties.
+
+EXHIBIT 1
+UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE
+
+Unicode Data Files include all data files under the directories
+http://www.unicode.org/Public/, http://www.unicode.org/reports/, and
+http://www.unicode.org/cldr/data/. Unicode Data Files do not include PDF
+online code charts under the directory http://www.unicode.org/Public/.
+Software includes any source code published in the Unicode Standard or under
+the directories http://www.unicode.org/Public/,
+http://www.unicode.org/reports/, and http://www.unicode.org/cldr/data/.
+
+NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING,
+INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA FILES ("DATA
+FILES"), AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO
+BE BOUND BY, ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT
+AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR
+SOFTWARE.
+
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright © 1991-2012 Unicode, Inc. All rights reserved. Distributed under the
+Terms of Use in http://www.unicode.org/copyright.html.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the Unicode data files and any associated documentation (the "Data Files")
+or Unicode software and any associated documentation (the "Software") to deal
+in the Data Files or Software without restriction, including without
+limitation the rights to use, copy, modify, merge, publish, distribute, and/or
+sell copies of the Data Files or Software, and to permit persons to whom the
+Data Files or Software are furnished to do so, provided that (a) the above
+copyright notice(s) and this permission notice appear with all copies of the
+Data Files or Software, (b) both the above copyright notice(s) and this
+permission notice appear in associated documentation, and (c) there is clear
+notice in each modified Data File or in the Software as well as in the
+documentation associated with the Data File(s) or Software that the data or
+software has been modified.
+
+THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD
+PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN
+THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
+DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE
+DATA FILES OR SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder shall not
+be used in advertising or otherwise to promote the sale, use or other dealings
+in these Data Files or Software without prior written authorization of the
+copyright holder.
+
+Unicode and the Unicode logo are trademarks of Unicode, Inc. in the United
+States and other countries. All third party trademarks referenced herein are
+the property of their respective owners.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to UPX v3.01, which may be included
+with JRE 8 on Windows.
+
+--- begin of LICENSE ---
+
+Use of any of this software is governed by the terms of the license below:
+
+
+ ooooo ooo ooooooooo. ooooooo ooooo
+ `888' `8' `888 `Y88. `8888 d8'
+ 888 8 888 .d88' Y888..8P
+ 888 8 888ooo88P' `8888'
+ 888 8 888 .8PY888.
+ `88. .8' 888 d8' `888b
+ `YbodP' o888o o888o o88888o
+
+
+ The Ultimate Packer for eXecutables
+ Copyright (c) 1996-2000 Markus Oberhumer & Laszlo Molnar
+ http://wildsau.idv.uni-linz.ac.at/mfx/upx.html
+ http://www.nexus.hu/upx
+ http://upx.tsx.org
+
+
+PLEASE CAREFULLY READ THIS LICENSE AGREEMENT, ESPECIALLY IF YOU PLAN
+TO MODIFY THE UPX SOURCE CODE OR USE A MODIFIED UPX VERSION.
+
+
+ABSTRACT
+========
+
+ UPX and UCL are copyrighted software distributed under the terms
+ of the GNU General Public License (hereinafter the "GPL").
+
+ The stub which is imbedded in each UPX compressed program is part
+ of UPX and UCL, and contains code that is under our copyright. The
+ terms of the GNU General Public License still apply as compressing
+ a program is a special form of linking with our stub.
+
+ As a special exception we grant the free usage of UPX for all
+ executables, including commercial programs.
+ See below for details and restrictions.
+
+
+COPYRIGHT
+=========
+
+ UPX and UCL are copyrighted software. All rights remain with the authors.
+
+ UPX is Copyright (C) 1996-2000 Markus Franz Xaver Johannes Oberhumer
+ UPX is Copyright (C) 1996-2000 Laszlo Molnar
+
+ UCL is Copyright (C) 1996-2000 Markus Franz Xaver Johannes Oberhumer
+
+
+GNU GENERAL PUBLIC LICENSE
+==========================
+
+ UPX and the UCL library are free software; you can redistribute them
+ and/or modify them under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of
+ the License, or (at your option) any later version.
+
+ UPX and UCL are distributed in the hope that they will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING.
+
+
+SPECIAL EXCEPTION FOR COMPRESSED EXECUTABLES
+============================================
+
+ The stub which is imbedded in each UPX compressed program is part
+ of UPX and UCL, and contains code that is under our copyright. The
+ terms of the GNU General Public License still apply as compressing
+ a program is a special form of linking with our stub.
+
+ Hereby Markus F.X.J. Oberhumer and Laszlo Molnar grant you special
+ permission to freely use and distribute all UPX compressed programs
+ (including commercial ones), subject to the following restrictions:
+
+ 1. You must compress your program with a completely unmodified UPX
+ version; either with our precompiled version, or (at your option)
+ with a self compiled version of the unmodified UPX sources as
+ distributed by us.
+ 2. This also implies that the UPX stub must be completely unmodfied, i.e.
+ the stub imbedded in your compressed program must be byte-identical
+ to the stub that is produced by the official unmodified UPX version.
+ 3. The decompressor and any other code from the stub must exclusively get
+ used by the unmodified UPX stub for decompressing your program at
+ program startup. No portion of the stub may get read, copied,
+ called or otherwise get used or accessed by your program.
+
+
+ANNOTATIONS
+===========
+
+ - You can use a modified UPX version or modified UPX stub only for
+ programs that are compatible with the GNU General Public License.
+
+ - We grant you special permission to freely use and distribute all UPX
+ compressed programs. But any modification of the UPX stub (such as,
+ but not limited to, removing our copyright string or making your
+ program non-decompressible) will immediately revoke your right to
+ use and distribute a UPX compressed program.
+
+ - UPX is not a software protection tool; by requiring that you use
+ the unmodified UPX version for your proprietary programs we
+ make sure that any user can decompress your program. This protects
+ both you and your users as nobody can hide malicious code -
+ any program that cannot be decompressed is highly suspicious
+ by definition.
+
+ - You can integrate all or part of UPX and UCL into projects that
+ are compatible with the GNU GPL, but obviously you cannot grant
+ any special exceptions beyond the GPL for our code in your project.
+
+ - We want to actively support manufacturers of virus scanners and
+ similar security software. Please contact us if you would like to
+ incorporate parts of UPX or UCL into such a product.
+
+
+
+Markus F.X.J. Oberhumer Laszlo Molnar
+markus.oberhumer@jk.uni-linz.ac.at ml1050@cdata.tvnet.hu
+
+Linz, Austria, 25 Feb 2000
+
+Additional License(s)
+
+The UPX license file is at http://upx.sourceforge.net/upx-license.html.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Xfree86-VidMode Extension 1.0,
+which may be included with JRE 8, JDK 8, and OpenJDK 8 on Linux and Solaris.
+
+--- begin of LICENSE ---
+
+Version 1.1 of XFree86 ProjectLicence.
+
+Copyright (C) 1994-2004 The XFree86 Project, Inc. All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicence, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so,subject to the following conditions:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice,this list of conditions, and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution, and in the same place
+ and form as other copyright, license and disclaimer information.
+
+ 3. The end-user documentation included with the redistribution, if any,must
+ include the following acknowledgment: "This product includes
+ software developed by The XFree86 Project, Inc (http://www.xfree86.org/) and
+ its contributors", in the same place and form as other third-party
+ acknowledgments. Alternately, this acknowledgment may appear in the software
+ itself, in the same form and location as other such third-party
+ acknowledgments.
+
+ 4. Except as contained in this notice, the name of The XFree86 Project,Inc
+ shall not be used in advertising or otherwise to promote the sale, use
+ or other dealings in this Software without prior written authorization from
+ The XFree86 Project, Inc.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+ EVENT SHALL THE XFREE86 PROJECT, INC OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL,SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO,PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ DAMAGE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to X Window System 6.8.2, which may be
+included with JRE 8, JDK 8, and OpenJDK 8 on Linux and Solaris.
+
+--- begin of LICENSE ---
+
+ Licenses
+The X.Org Foundation March 2004
+
+1. Introduction
+
+The X.org Foundation X Window System distribution is a compilation of code and
+documentation from many sources. This document is intended primarily as a
+guide to the licenses used in the distribution: you must check each file
+and/or package for precise redistribution terms. None-the-less, this summary
+may be useful to many users. No software incorporating the XFree86 1.1 license
+has been incorporated.
+
+This document is based on the compilation from XFree86.
+
+2. XFree86 License
+
+XFree86 code without an explicit copyright is covered by the following
+copyright/license:
+
+Copyright (C) 1994-2003 The XFree86 Project, Inc. All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the XFree86 Project shall not
+be used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from the XFree86 Project.
+
+3. Other Licenses
+
+Portions of code are covered by the following licenses/copyrights. See
+individual files for the copyright dates.
+
+3.1. X/MIT Copyrights
+
+3.1.1. X Consortium
+
+Copyright (C) <date> X Consortium
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE X
+CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the X Consortium shall not be
+used in advertising or otherwise to promote the sale, use or other dealings in
+this Software without prior written authorization from the X Consortium.
+
+X Window System is a trademark of X Consortium, Inc.
+
+3.1.2. The Open Group
+
+Copyright <date> The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that the
+above copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings in
+this Software without prior written authorization from The Open Group. 3.2.
+Berkeley-based copyrights:
+
+o
+3.2.1. General
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ 3. The name of the author may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE. 3.2.2. UCB/LBL
+
+Copyright (c) 1993 The Regents of the University of California. All rights
+reserved.
+
+This software was developed by the Computer Systems Engineering group at
+Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and contributed to
+Berkeley.
+
+All advertising materials mentioning features or use of this software must
+display the following acknowledgement: This product includes software
+developed by the University of California, Lawrence Berkeley Laboratory.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ 3. All advertising materials mentioning features or use of this software
+ must display the following acknowledgement: This product includes software
+ developed by the University of California, Berkeley and its contributors.
+
+ 4. Neither the name of the University nor the names of its contributors may
+ be used to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3.2.3. The
+NetBSD Foundation, Inc.
+
+Copyright (c) 2003 The NetBSD Foundation, Inc. All rights reserved.
+
+This code is derived from software contributed to The NetBSD Foundation by Ben
+Collver <collver1@attbi.com>
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ 3. All advertising materials mentioning features or use of this software
+ must display the following acknowledgement: This product includes software
+ developed by the NetBSD Foundation, Inc. and its contributors.
+
+ 4. Neither the name of The NetBSD Foundation nor the names of its
+ contributors may be used to endorse or promote products derived from this
+ software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS ``AS
+IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3.2.4. Theodore
+Ts'o.
+
+Copyright Theodore Ts'o, 1994, 1995, 1996, 1997, 1998, 1999. All rights
+reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ and the entire permission notice in its entirety, including the disclaimer
+ of warranties.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ 3. he name of the author may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE, ALL OF WHICH ARE HEREBY DISCLAIMED. IN NO
+EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE. 3.2.5. Theo de Raadt and Damien Miller
+
+Copyright (c) 1995,1999 Theo de Raadt. All rights reserved. Copyright (c)
+2001-2002 Damien Miller. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE. 3.2.6. Todd C. Miller
+
+Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+
+Permission to use, copy, modify, and distribute this software for any purpose
+with or without fee is hereby granted, provided that the above copyright
+notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND TODD C. MILLER DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL TODD C. MILLER BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 3.2.7. Thomas
+Winischhofer
+
+Copyright (C) 2001-2004 Thomas Winischhofer
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ 3. The name of the author may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE. 3.3. NVIDIA Corp
+
+Copyright (c) 1996 NVIDIA, Corp. All rights reserved.
+
+NOTICE TO USER: The source code is copyrighted under U.S. and international
+laws. NVIDIA, Corp. of Sunnyvale, California owns the copyright and as design
+patents pending on the design and interface of the NV chips. Users and
+possessors of this source code are hereby granted a nonexclusive, royalty-free
+copyright and design patent license to use this code in individual and
+commercial software.
+
+Any use of this source code must include, in the user documentation and
+internal comments to the code, notices to the end user as follows:
+
+Copyright (c) 1996 NVIDIA, Corp. NVIDIA design patents pending in the U.S. and
+foreign countries.
+
+NVIDIA, CORP. MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE
+CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED
+WARRANTY OF ANY KIND. NVIDIA, CORP. DISCLAIMS ALL WARRANTIES WITH REGARD TO
+THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA, CORP. BE LIABLE
+FOR ANY SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, OR ANY
+DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. 3.4. GLX Public
+License
+
+GLX PUBLIC LICENSE (Version 1.0 (2/11/99)) ("License")
+
+Subject to any third party claims, Silicon Graphics, Inc. ("SGI") hereby
+grants permission to Recipient (defined below), under Recipient's copyrights
+in the Original Software (defined below), to use, copy, modify, merge,
+publish, distribute, sublicense and/or sell copies of Subject Software
+(defined below), and to permit persons to whom the Subject Software is
+furnished in accordance with this License to do the same, subject to all of
+the following terms and conditions, which Recipient accepts by engaging in any
+such use, copying, modifying, merging, publishing, distributing, sublicensing
+or selling:
+
+1. Definitions.
+
+ (a) "Original Software" means source code of computer software code which
+ is described in Exhibit A as Original Software.
+
+ (b) "Modifications" means any addition to or deletion from the substance
+ or structure of either the Original Software or any previous
+ Modifications. When Subject Software is released as a series of files, a
+ Modification means (i) any addition to or deletion from the contents of a
+ file containing Original Software or previous Modifications and (ii) any
+ new file that contains any part of the Original Code or previous
+ Modifications.
+
+ (c) "Subject Software" means the Original Software or Modifications or the
+ combination of the Original Software and Modifications, or portions of any
+ of the foregoing.
+
+ (d) "Recipient" means an individual or a legal entity exercising rights
+ under, and complying with all of the terms of, this License. For legal
+ entities, "Recipient" includes any entity which controls, is controlled
+ by, or is under common control with Recipient. For purposes of this
+ definition, "control" of an entity means (a) the power, direct or
+ indirect, to direct or manage such entity, or (b) ownership of fifty
+ percent (50%) or more of the outstanding shares or beneficial ownership of
+ such entity.
+
+2. Redistribution of Source Code Subject to These Terms. Redistributions of
+Subject Software in source code form must retain the notice set forth in
+Exhibit A, below, in every file. A copy of this License must be included in
+any documentation for such Subject Software where the recipients' rights
+relating to Subject Software are described. Recipient may distribute the
+source code version of Subject Software under a license of Recipient's choice,
+which may contain terms different from this License, provided that (i)
+Recipient is in compliance with the terms of this License, and (ii) the
+license terms include this Section 2 and Sections 3, 4, 7, 8, 10, 12 and 13 of
+this License, which terms may not be modified or superseded by any other terms
+of such license. If Recipient distributes the source code version under a
+different license Recipient must make it absolutely clear that any terms which
+differ from this License are offered by Recipient alone, not by SGI. Recipient
+hereby agrees to indemnify SGI for any liability incurred by SGI as a result
+of any such terms Recipient offers.
+
+3. Redistribution in Executable Form. The notice set forth in Exhibit A must
+be conspicuously included in any notice in an executable version of Subject
+Software, related documentation or collateral in which Recipient describes the
+user's rights relating to the Subject Software. Recipient may distribute the
+executable version of Subject Software under a license of Recipient's choice,
+which may contain terms different from this License, provided that (i)
+Recipient is in compliance with the terms of this License, and (ii) the
+license terms include this Section 3 and Sections 4, 7, 8, 10, 12 and 13 of
+this License, which terms may not be modified or superseded by any other terms
+of such license. If Recipient distributes the executable version under a
+different license Recipient must make it absolutely clear that any terms which
+differ from this License are offered by Recipient alone, not by SGI. Recipient
+hereby agrees to indemnify SGI for any liability incurred by SGI as a result
+of any such terms Recipient offers.
+
+4. Termination. This License and the rights granted hereunder will terminate
+automatically if Recipient fails to comply with terms herein and fails to cure
+such breach within 30 days of the breach. Any sublicense to the Subject
+Software which is properly granted shall survive any termination of this
+License absent termination by the terms of such sublicense. Provisions which,
+by their nature, must remain in effect beyond the termination of this License
+shall survive.
+
+5. No Trademark Rights. This License does not grant any rights to use any
+trade name, trademark or service mark whatsoever. No trade name, trademark or
+service mark of SGI may be used to endorse or promote products derived from
+the Subject Software without prior written permission of SGI.
+
+6. No Other Rights. This License does not grant any rights with respect to the
+OpenGL API or to any software or hardware implementation thereof or to any
+other software whatsoever, nor shall any other rights or licenses not
+expressly granted hereunder arise by implication, estoppel or otherwise with
+respect to the Subject Software. Title to and ownership of the Original
+Software at all times remains with SGI. All rights in the Original Software
+not expressly granted under this License are reserved.
+
+7. Compliance with Laws; Non-Infringement. Recipient shall comply with all
+applicable laws and regulations in connection with use and distribution of the
+Subject Software, including but not limited to, all export and import control
+laws and regulations of the U.S. government and other countries. Recipient may
+not distribute Subject Software that (i) in any way infringes (directly or
+contributorily) the rights (including patent, copyright, trade secret,
+trademark or other intellectual property rights of any kind) of any other
+person or entity or (ii) breaches any representation or warranty, express,
+implied or statutory, which under any applicable law it might be deemed to
+have been distributed.
+
+8. Claims of Infringement. If Recipient at any time has knowledge of any one
+or more third party claims that reproduction, modification, use, distribution,
+import or sale of Subject Software (including particular functionality or code
+incorporated in Subject Software) infringes the third party's intellectual
+property rights, Recipient must place in a well-identified web page bearing
+the title "LEGAL" a description of each such claim and a description of the
+party making each such claim in sufficient detail that a user of the Subject
+Software will know whom to contact regarding the claim. Also, upon gaining
+such knowledge of any such claim, Recipient must conspicuously include the URL
+for such web page in the Exhibit A notice required under Sections 2 and 3,
+above, and in the text of any related documentation, license agreement or
+collateral in which Recipient describes end user's rights relating to the
+Subject Software. If Recipient obtains such knowledge after it makes Subject
+Software available to any other person or entity, Recipient shall take other
+steps (such as notifying appropriate mailing lists or newsgroups) reasonably
+calculated to inform those who received the Subject Software that new
+knowledge has been obtained.
+
+9. DISCLAIMER OF WARRANTY. SUBJECT SOFTWARE IS PROVIDED ON AN "AS IS" BASIS,
+WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT
+LIMITATION, WARRANTIES THAT THE SUBJECT SOFTWARE IS FREE OF DEFECTS,
+MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON- INFRINGING. SGI ASSUMES NO
+RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE. SHOULD ANY SOFTWARE
+PROVE DEFECTIVE IN ANY RESPECT, SGI ASSUMES NO COST OR LIABILITY FOR ANY
+SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN
+ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY SUBJECT SOFTWARE IS AUTHORIZED
+HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+10. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY,
+WHETHER TORT (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE OR STRICT LIABILITY),
+CONTRACT, OR OTHERWISE, SHALL SGI OR ANY SGI LICENSOR BE LIABLE FOR ANY
+DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
+CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK
+STOPPAGE, LOSS OF DATA, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
+COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF
+THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY
+TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SGI's NEGLIGENCE TO
+THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT
+ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
+THAT EXCLUSION AND LIMITATION MAY NOT APPLY TO RECIPIENT.
+
+11. Indemnity. Recipient shall be solely responsible for damages arising,
+directly or indirectly, out of its utilization of rights under this License.
+Recipient will defend, indemnify and hold harmless Silicon Graphics, Inc. from
+and against any loss, liability, damages, costs or expenses (including the
+payment of reasonable attorneys fees) arising out of Recipient's use,
+modification, reproduction and distribution of the Subject Software or out of
+any representation or warranty made by Recipient.
+
+12. U.S. Government End Users. The Subject Software is a "commercial item"
+consisting of "commercial computer software" as such terms are defined in
+title 48 of the Code of Federal Regulations and all U.S. Government End Users
+acquire only the rights set forth in this License and are subject to the terms
+of this License.
+
+13. Miscellaneous. This License represents the complete agreement concerning
+subject matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed so as to achieve as nearly as
+possible the same economic effect as the original provision and the remainder
+of this License will remain in effect. This License shall be governed by and
+construed in accordance with the laws of the United States and the State of
+California as applied to agreements entered into and to be performed entirely
+within California between California residents. Any litigation relating to
+this License shall be subject to the exclusive jurisdiction of the Federal
+Courts of the Northern District of California (or, absent subject matter
+jurisdiction in such courts, the courts of the State of California), with
+venue lying exclusively in Santa Clara County, California, with the losing
+party responsible for costs, including without limitation, court costs and
+reasonable attorneys fees and expenses. The application of the United Nations
+Convention on Contracts for the International Sale of Goods is expressly
+excluded. Any law or regulation which provides that the language of a contract
+shall be construed against the drafter shall not apply to this License.
+
+Exhibit A
+
+The contents of this file are subject to Sections 2, 3, 4, 7, 8, 10, 12 and 13
+of the GLX Public License Version 1.0 (the "License"). You may not use this
+file except in compliance with those sections of the License. You may obtain a
+copy of the License at Silicon Graphics, Inc., attn: Legal Services, 2011 N.
+Shoreline Blvd., Mountain View, CA 94043 or at
+http://www.sgi.com/software/opensource/glx/license.html.
+
+Software distributed under the License is distributed on an "AS IS" basis. ALL
+WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED
+WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF NON-
+INFRINGEMENT. See the License for the specific language governing rights and
+limitations under the License.
+
+The Original Software is GLX version 1.2 source code, released February, 1999.
+The developer of the Original Software is Silicon Graphics, Inc. Those
+portions of the Subject Software created by Silicon Graphics, Inc. are
+Copyright (c) 1991-9 Silicon Graphics, Inc. All Rights Reserved. 3.5. CID
+Font Code Public License
+
+CID FONT CODE PUBLIC LICENSE (Version 1.0 (3/31/99))("License")
+
+Subject to any applicable third party claims, Silicon Graphics, Inc. ("SGI")
+hereby grants permission to Recipient (defined below), under SGI's copyrights
+in the Original Software (defined below), to use, copy, modify, merge,
+publish, distribute, sublicense and/or sell copies of Subject Software
+(defined below) in both source code and executable form, and to permit persons
+to whom the Subject Software is furnished in accordance with this License to
+do the same, subject to all of the following terms and conditions, which
+Recipient accepts by engaging in any such use, copying, modifying, merging,
+publication, distributing, sublicensing or selling:
+
+1. Definitions.
+
+ a. "Original Software" means source code of computer software code that is
+ described in Exhibit A as Original Software.
+
+ b. "Modifications" means any addition to or deletion from the substance or
+ structure of either the Original Software or any previous Modifications.
+ When Subject Software is released as a series of files, a Modification
+ means (i) any addition to or deletion from the contents of a file
+ containing Original Software or previous Modifications and (ii) any new
+ file that contains any part of the Original Code or previous
+ Modifications.
+
+ c. "Subject Software" means the Original Software or Modifications or the
+ combination of the Original Software and Modifications, or portions of any
+ of the foregoing.
+
+ d. "Recipient" means an individual or a legal entity exercising rights
+ under the terms of this License. For legal entities, "Recipient" includes
+ any entity that controls, is controlled by, or is under common control
+ with Recipient. For purposes of this definition, "control" of an entity
+ means (i) the power, direct or indirect, to direct or manage such entity,
+ or (ii) ownership of fifty percent (50%) or more of the outstanding shares
+ or beneficial ownership of such entity.
+
+ e. "Required Notice" means the notice set forth in Exhibit A to this
+ License.
+
+ f. "Accompanying Technology" means any software or other technology that
+ is not a Modification and that is distributed or made publicly available
+ by Recipient with the Subject Software. Separate software files that do
+ not contain any Original Software or any previous Modification shall not
+ be deemed a Modification, even if such software files are aggregated as
+ part of a product, or in any medium of storage, with any file that does
+ contain Original Software or any previous Modification.
+
+2. License Terms. All distribution of the Subject Software must be made
+subject to the terms of this License. A copy of this License and the Required
+Notice must be included in any documentation for Subject Software where
+Recipient's rights relating to Subject Software and/or any Accompanying
+Technology are described. Distributions of Subject Software in source code
+form must also include the Required Notice in every file distributed. In
+addition, a ReadMe file entitled "Important Legal Notice" must be distributed
+with each distribution of one or more files that incorporate Subject Software.
+That file must be included with distributions made in both source code and
+executable form. A copy of the License and the Required Notice must be
+included in that file. Recipient may distribute Accompanying Technology under
+a license of Recipient's choice, which may contain terms different from this
+License, provided that (i) Recipient is in compliance with the terms of this
+License, (ii) such other license terms do not modify or supersede the terms of
+this License as applicable to the Subject Software, (iii) Recipient hereby
+indemnifies SGI for any liability incurred by SGI as a result of the
+distribution of Accompanying Technology or the use of other license terms.
+
+3. Termination. This License and the rights granted hereunder will terminate
+automatically if Recipient fails to comply with terms herein and fails to cure
+such breach within 30 days of the breach. Any sublicense to the Subject
+Software that is properly granted shall survive any termination of this
+License absent termination by the terms of such sublicense. Provisions which,
+by their nature, must remain in effect beyond the termination of this License
+shall survive.
+
+4. Trademark Rights. This License does not grant any rights to use any trade
+name, trademark or service mark whatsoever. No trade name, trademark or
+service mark of SGI may be used to endorse or promote products derived from or
+incorporating any Subject Software without prior written permission of SGI.
+
+5. No Other Rights. No rights or licenses not expressly granted hereunder
+shall arise by implication, estoppel or otherwise. Title to and ownership of
+the Original Software at all times remains with SGI. All rights in the
+Original Software not expressly granted under this License are reserved.
+
+6. Compliance with Laws; Non-Infringement. Recipient shall comply with all
+applicable laws and regulations in connection with use and distribution of the
+Subject Software, including but not limited to, all export and import control
+laws and regulations of the U.S. government and other countries. Recipient may
+not distribute Subject Software that (i) in any way infringes (directly or
+contributorily) the rights (including patent, copyright, trade secret,
+trademark or other intellectual property rights of any kind) of any other
+person or entity, or (ii) breaches any representation or warranty, express,
+implied or statutory, which under any applicable law it might be deemed to
+have been distributed.
+
+7. Claims of Infringement. If Recipient at any time has knowledge of any one
+or more third party claims that reproduction, modification, use, distribution,
+import or sale of Subject Software (including particular functionality or code
+incorporated in Subject Software) infringes the third party's intellectual
+property rights, Recipient must place in a well-identified web page bearing
+the title "LEGAL" a description of each such claim and a description of the
+party making each such claim in sufficient detail that a user of the Subject
+Software will know whom to contact regarding the claim. Also, upon gaining
+such knowledge of any such claim, Recipient must conspicuously include the URL
+for such web page in the Required Notice, and in the text of any related
+documentation, license agreement or collateral in which Recipient describes
+end user's rights relating to the Subject Software. If Recipient obtains such
+knowledge after it makes Subject Software available to any other person or
+entity, Recipient shall take other steps (such as notifying appropriate
+mailing lists or newsgroups) reasonably calculated to provide such knowledge
+to those who received the Subject Software.
+
+8. DISCLAIMER OF WARRANTY. SUBJECT SOFTWARE IS PROVIDED ON AN "AS IS" BASIS,
+WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT
+LIMITATION, WARRANTIES THAT THE SUBJECT SOFTWARE IS FREE OF DEFECTS,
+MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. SGI ASSUMES NO
+RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE. SHOULD ANY SOFTWARE
+PROVE DEFECTIVE IN ANY RESPECT, SGI ASSUMES NO COST OR LIABILITY FOR ANY
+SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN
+ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY SUBJECT SOFTWARE IS AUTHORIZED
+HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+9. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY,
+WHETHER TORT (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE OR STRICT LIABILITY),
+CONTRACT, OR OTHERWISE, SHALL SGI OR ANY SGI LICENSOR BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SUBJECT SOFTWARE OR
+THE USE OR OTHER DEALINGS IN THE SUBJECT SOFTWARE. SOME JURISDICTIONS DO NOT
+ALLOW THE EXCLUSION OR LIMITATION OF CERTAIN DAMAGES, SO THIS EXCLUSION AND
+LIMITATION MAY NOT APPLY TO RECIPIENT TO THE EXTENT SO DISALLOWED.
+
+10. Indemnity. Recipient shall be solely responsible for damages arising,
+directly or indirectly, out of its utilization of rights under this License.
+Recipient will defend, indemnify and hold SGI and its successors and assigns
+harmless from and against any loss, liability, damages, costs or expenses
+(including the payment of reasonable attorneys fees) arising out of
+(Recipient's use, modification, reproduction and distribution of the Subject
+Software or out of any representation or warranty made by Recipient.
+
+11. U.S. Government End Users. The Subject Software is a "commercial item"
+consisting of "commercial computer software" as such terms are defined in
+title 48 of the Code of Federal Regulations and all U.S. Government End Users
+acquire only the rights set forth in this License and are subject to the terms
+of this License.
+
+12. Miscellaneous. This License represents the complete agreement concerning
+subject matter hereof. If any provision of this License is held to be
+unenforceable by any judicial or administrative authority having proper
+jurisdiction with respect thereto, such provision shall be reformed so as to
+achieve as nearly as possible the same economic effect as the original
+provision and the remainder of this License will remain in effect. This
+License shall be governed by and construed in accordance with the laws of the
+United States and the State of California as applied to agreements entered
+into and to be performed entirely within California between California
+residents. Any litigation relating to this License shall be subject to the
+exclusive jurisdiction of the Federal Courts of the Northern District of
+California (or, absent subject matter jurisdiction in such courts, the courts
+of the State of California), with venue lying exclusively in Santa Clara
+County, California, with the losing party responsible for costs, including
+without limitation, court costs and reasonable attorneys fees and expenses.
+The application of the United Nations Convention on Contracts for the
+International Sale of Goods is expressly excluded. Any law or regulation that
+provides that the language of a contract shall be construed against the
+drafter shall not apply to this License.
+
+Exhibit A
+
+Copyright (c) 1994-1999 Silicon Graphics, Inc.
+
+The contents of this file are subject to the CID Font Code Public License
+Version 1.0 (the "License"). You may not use this file except in compliance
+with the License. You may obtain a copy of the License at Silicon Graphics,
+Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA 94043
+or at http://www.sgi.com/software/opensource/cid/license.html
+
+Software distributed under the License is distributed on an "AS IS" basis. ALL
+WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED
+WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF
+NON-INFRINGEMENT. See the License for the specific language governing rights
+and limitations under the License.
+
+The Original Software (as defined in the License) is CID font code that was
+developed by Silicon Graphics, Inc. Those portions of the Subject Software (as
+defined in the License) that were created by Silicon Graphics, Inc. are
+Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved.
+
+[NOTE: When using this text in connection with Subject Software delivered
+solely in object code form, Recipient may replace the words "this file" with
+"this software" in both the first and second sentences.] 3.6. Bitstream Vera
+Fonts Copyright
+
+The fonts have a generous copyright, allowing derivative works (as long as
+"Bitstream" or "Vera" are not in the names), and full redistribution (so long
+as they are not *sold* by themselves). They can be be bundled, redistributed
+and sold with any software.
+
+The fonts are distributed under the following copyright:
+
+Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a
+trademark of Bitstream, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the fonts accompanying this license ("Fonts") and associated documentation
+files (the "Font Software"), to reproduce and distribute the Font Software,
+including without limitation the rights to use, copy, merge, publish,
+distribute, and/or sell copies of the Font Software, and to permit persons to
+whom the Font Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright and trademark notices and this permission notice shall be
+included in all copies of one or more of the Font Software typefaces.
+
+The Font Software may be modified, altered, or added to, and in particular the
+designs of glyphs or characters in the Fonts may be modified and additional
+glyphs or characters may be added to the Fonts, only if the fonts are renamed
+to names not containing either the words "Bitstream" or the word "Vera".
+
+This License becomes null and void to the extent applicable to Fonts or Font
+Software that has been modified and is distributed under the "Bitstream Vera"
+names.
+
+The Font Software may be sold as part of a larger software package but no copy
+of one or more of the Font Software typefaces may be sold by itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION
+BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL,
+SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO
+USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
+
+Except as contained in this notice, the names of Gnome, the Gnome Foundation,
+and Bitstream Inc., shall not be used in advertising or otherwise to promote
+the sale, use or other dealings in this Font Software without prior written
+authorization from the Gnome Foundation or Bitstream Inc., respectively. For
+further information, contact: fonts at gnome dot org. 3.7. Bigelow & Holmes
+Inc and URW++ GmbH Luxi font license
+
+Luxi fonts copyright (c) 2001 by Bigelow & Holmes Inc. Luxi font instruction
+code copyright (c) 2001 by URW++ GmbH. All Rights Reserved. Luxi is a
+registered trademark of Bigelow & Holmes Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of these Fonts and associated documentation files (the "Font Software"), to
+deal in the Font Software, including without limitation the rights to use,
+copy, merge, publish, distribute, sublicense, and/or sell copies of the Font
+Software, and to permit persons to whom the Font Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright and trademark notices and this permission notice shall be
+included in all copies of one or more of the Font Software.
+
+The Font Software may not be modified, altered, or added to, and in particular
+the designs of glyphs or characters in the Fonts may not be modified nor may
+additional glyphs or characters be added to the Fonts. This License becomes
+null and void when the Fonts or Font Software have been modified.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BIGELOW & HOLMES INC. OR URW++
+GMBH. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY
+GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR
+INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT
+SOFTWARE.
+
+Except as contained in this notice, the names of Bigelow & Holmes Inc. and
+URW++ GmbH. shall not be used in advertising or otherwise to promote the sale,
+use or other dealings in this Font Software without prior written
+authorization from Bigelow & Holmes Inc. and URW++ GmbH.
+
+For further information, contact:
+
+info@urwpp.de or design@bigelowandholmes.com
+
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to zlib v1.2.8, which may be included
+with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+ version 1.2.8, April 28th, 2013
+
+ Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jean-loup Gailly Mark Adler
+ jloup@gzip.org madler@alumni.caltech.edu
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to the following which may be
+included with JRE 8, JDK 8, and OpenJDK 8.
+
+ Apache Commons Math 3.2
+ Apache Derby 10.11.1.2
+ Apache Jakarta BCEL 5.1
+ Apache Jakarta Regexp 1.4
+ Apache Santuario XML Security for Java 1.5.4
+ Apache Xalan-Java 2.7.1
+ Apache Xerces Java 2.10.0
+ Apache XML Resolver 1.1
+ Dynalink 0.5
+
+
+--- begin of LICENSE ---
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
diff --git a/love2dToAPK/tools/tools/jdk-win/include/classfile_constants.h b/love2dToAPK/tools/tools/jdk-win/include/classfile_constants.h
new file mode 100644
index 0000000..e5c20cd
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/include/classfile_constants.h
@@ -0,0 +1,560 @@
+/*
+ * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved.
+ * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ */
+
+#ifndef CLASSFILE_CONSTANTS_H
+#define CLASSFILE_CONSTANTS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Classfile version number for this information */
+#define JVM_CLASSFILE_MAJOR_VERSION 52
+#define JVM_CLASSFILE_MINOR_VERSION 0
+
+/* Flags */
+
+enum {
+ JVM_ACC_PUBLIC = 0x0001,
+ JVM_ACC_PRIVATE = 0x0002,
+ JVM_ACC_PROTECTED = 0x0004,
+ JVM_ACC_STATIC = 0x0008,
+ JVM_ACC_FINAL = 0x0010,
+ JVM_ACC_SYNCHRONIZED = 0x0020,
+ JVM_ACC_SUPER = 0x0020,
+ JVM_ACC_VOLATILE = 0x0040,
+ JVM_ACC_BRIDGE = 0x0040,
+ JVM_ACC_TRANSIENT = 0x0080,
+ JVM_ACC_VARARGS = 0x0080,
+ JVM_ACC_NATIVE = 0x0100,
+ JVM_ACC_INTERFACE = 0x0200,
+ JVM_ACC_ABSTRACT = 0x0400,
+ JVM_ACC_STRICT = 0x0800,
+ JVM_ACC_SYNTHETIC = 0x1000,
+ JVM_ACC_ANNOTATION = 0x2000,
+ JVM_ACC_ENUM = 0x4000
+};
+
+/* Used in newarray instruction. */
+
+enum {
+ JVM_T_BOOLEAN = 4,
+ JVM_T_CHAR = 5,
+ JVM_T_FLOAT = 6,
+ JVM_T_DOUBLE = 7,
+ JVM_T_BYTE = 8,
+ JVM_T_SHORT = 9,
+ JVM_T_INT = 10,
+ JVM_T_LONG = 11
+};
+
+/* Constant Pool Entries */
+
+enum {
+ JVM_CONSTANT_Utf8 = 1,
+ JVM_CONSTANT_Unicode = 2, /* unused */
+ JVM_CONSTANT_Integer = 3,
+ JVM_CONSTANT_Float = 4,
+ JVM_CONSTANT_Long = 5,
+ JVM_CONSTANT_Double = 6,
+ JVM_CONSTANT_Class = 7,
+ JVM_CONSTANT_String = 8,
+ JVM_CONSTANT_Fieldref = 9,
+ JVM_CONSTANT_Methodref = 10,
+ JVM_CONSTANT_InterfaceMethodref = 11,
+ JVM_CONSTANT_NameAndType = 12,
+ JVM_CONSTANT_MethodHandle = 15, // JSR 292
+ JVM_CONSTANT_MethodType = 16, // JSR 292
+ JVM_CONSTANT_InvokeDynamic = 18
+};
+
+/* JVM_CONSTANT_MethodHandle subtypes */
+enum {
+ JVM_REF_getField = 1,
+ JVM_REF_getStatic = 2,
+ JVM_REF_putField = 3,
+ JVM_REF_putStatic = 4,
+ JVM_REF_invokeVirtual = 5,
+ JVM_REF_invokeStatic = 6,
+ JVM_REF_invokeSpecial = 7,
+ JVM_REF_newInvokeSpecial = 8,
+ JVM_REF_invokeInterface = 9
+};
+
+/* StackMapTable type item numbers */
+
+enum {
+ JVM_ITEM_Top = 0,
+ JVM_ITEM_Integer = 1,
+ JVM_ITEM_Float = 2,
+ JVM_ITEM_Double = 3,
+ JVM_ITEM_Long = 4,
+ JVM_ITEM_Null = 5,
+ JVM_ITEM_UninitializedThis = 6,
+ JVM_ITEM_Object = 7,
+ JVM_ITEM_Uninitialized = 8
+};
+
+/* Type signatures */
+
+enum {
+ JVM_SIGNATURE_ARRAY = '[',
+ JVM_SIGNATURE_BYTE = 'B',
+ JVM_SIGNATURE_CHAR = 'C',
+ JVM_SIGNATURE_CLASS = 'L',
+ JVM_SIGNATURE_ENDCLASS = ';',
+ JVM_SIGNATURE_ENUM = 'E',
+ JVM_SIGNATURE_FLOAT = 'F',
+ JVM_SIGNATURE_DOUBLE = 'D',
+ JVM_SIGNATURE_FUNC = '(',
+ JVM_SIGNATURE_ENDFUNC = ')',
+ JVM_SIGNATURE_INT = 'I',
+ JVM_SIGNATURE_LONG = 'J',
+ JVM_SIGNATURE_SHORT = 'S',
+ JVM_SIGNATURE_VOID = 'V',
+ JVM_SIGNATURE_BOOLEAN = 'Z'
+};
+
+/* Opcodes */
+
+enum {
+ JVM_OPC_nop = 0,
+ JVM_OPC_aconst_null = 1,
+ JVM_OPC_iconst_m1 = 2,
+ JVM_OPC_iconst_0 = 3,
+ JVM_OPC_iconst_1 = 4,
+ JVM_OPC_iconst_2 = 5,
+ JVM_OPC_iconst_3 = 6,
+ JVM_OPC_iconst_4 = 7,
+ JVM_OPC_iconst_5 = 8,
+ JVM_OPC_lconst_0 = 9,
+ JVM_OPC_lconst_1 = 10,
+ JVM_OPC_fconst_0 = 11,
+ JVM_OPC_fconst_1 = 12,
+ JVM_OPC_fconst_2 = 13,
+ JVM_OPC_dconst_0 = 14,
+ JVM_OPC_dconst_1 = 15,
+ JVM_OPC_bipush = 16,
+ JVM_OPC_sipush = 17,
+ JVM_OPC_ldc = 18,
+ JVM_OPC_ldc_w = 19,
+ JVM_OPC_ldc2_w = 20,
+ JVM_OPC_iload = 21,
+ JVM_OPC_lload = 22,
+ JVM_OPC_fload = 23,
+ JVM_OPC_dload = 24,
+ JVM_OPC_aload = 25,
+ JVM_OPC_iload_0 = 26,
+ JVM_OPC_iload_1 = 27,
+ JVM_OPC_iload_2 = 28,
+ JVM_OPC_iload_3 = 29,
+ JVM_OPC_lload_0 = 30,
+ JVM_OPC_lload_1 = 31,
+ JVM_OPC_lload_2 = 32,
+ JVM_OPC_lload_3 = 33,
+ JVM_OPC_fload_0 = 34,
+ JVM_OPC_fload_1 = 35,
+ JVM_OPC_fload_2 = 36,
+ JVM_OPC_fload_3 = 37,
+ JVM_OPC_dload_0 = 38,
+ JVM_OPC_dload_1 = 39,
+ JVM_OPC_dload_2 = 40,
+ JVM_OPC_dload_3 = 41,
+ JVM_OPC_aload_0 = 42,
+ JVM_OPC_aload_1 = 43,
+ JVM_OPC_aload_2 = 44,
+ JVM_OPC_aload_3 = 45,
+ JVM_OPC_iaload = 46,
+ JVM_OPC_laload = 47,
+ JVM_OPC_faload = 48,
+ JVM_OPC_daload = 49,
+ JVM_OPC_aaload = 50,
+ JVM_OPC_baload = 51,
+ JVM_OPC_caload = 52,
+ JVM_OPC_saload = 53,
+ JVM_OPC_istore = 54,
+ JVM_OPC_lstore = 55,
+ JVM_OPC_fstore = 56,
+ JVM_OPC_dstore = 57,
+ JVM_OPC_astore = 58,
+ JVM_OPC_istore_0 = 59,
+ JVM_OPC_istore_1 = 60,
+ JVM_OPC_istore_2 = 61,
+ JVM_OPC_istore_3 = 62,
+ JVM_OPC_lstore_0 = 63,
+ JVM_OPC_lstore_1 = 64,
+ JVM_OPC_lstore_2 = 65,
+ JVM_OPC_lstore_3 = 66,
+ JVM_OPC_fstore_0 = 67,
+ JVM_OPC_fstore_1 = 68,
+ JVM_OPC_fstore_2 = 69,
+ JVM_OPC_fstore_3 = 70,
+ JVM_OPC_dstore_0 = 71,
+ JVM_OPC_dstore_1 = 72,
+ JVM_OPC_dstore_2 = 73,
+ JVM_OPC_dstore_3 = 74,
+ JVM_OPC_astore_0 = 75,
+ JVM_OPC_astore_1 = 76,
+ JVM_OPC_astore_2 = 77,
+ JVM_OPC_astore_3 = 78,
+ JVM_OPC_iastore = 79,
+ JVM_OPC_lastore = 80,
+ JVM_OPC_fastore = 81,
+ JVM_OPC_dastore = 82,
+ JVM_OPC_aastore = 83,
+ JVM_OPC_bastore = 84,
+ JVM_OPC_castore = 85,
+ JVM_OPC_sastore = 86,
+ JVM_OPC_pop = 87,
+ JVM_OPC_pop2 = 88,
+ JVM_OPC_dup = 89,
+ JVM_OPC_dup_x1 = 90,
+ JVM_OPC_dup_x2 = 91,
+ JVM_OPC_dup2 = 92,
+ JVM_OPC_dup2_x1 = 93,
+ JVM_OPC_dup2_x2 = 94,
+ JVM_OPC_swap = 95,
+ JVM_OPC_iadd = 96,
+ JVM_OPC_ladd = 97,
+ JVM_OPC_fadd = 98,
+ JVM_OPC_dadd = 99,
+ JVM_OPC_isub = 100,
+ JVM_OPC_lsub = 101,
+ JVM_OPC_fsub = 102,
+ JVM_OPC_dsub = 103,
+ JVM_OPC_imul = 104,
+ JVM_OPC_lmul = 105,
+ JVM_OPC_fmul = 106,
+ JVM_OPC_dmul = 107,
+ JVM_OPC_idiv = 108,
+ JVM_OPC_ldiv = 109,
+ JVM_OPC_fdiv = 110,
+ JVM_OPC_ddiv = 111,
+ JVM_OPC_irem = 112,
+ JVM_OPC_lrem = 113,
+ JVM_OPC_frem = 114,
+ JVM_OPC_drem = 115,
+ JVM_OPC_ineg = 116,
+ JVM_OPC_lneg = 117,
+ JVM_OPC_fneg = 118,
+ JVM_OPC_dneg = 119,
+ JVM_OPC_ishl = 120,
+ JVM_OPC_lshl = 121,
+ JVM_OPC_ishr = 122,
+ JVM_OPC_lshr = 123,
+ JVM_OPC_iushr = 124,
+ JVM_OPC_lushr = 125,
+ JVM_OPC_iand = 126,
+ JVM_OPC_land = 127,
+ JVM_OPC_ior = 128,
+ JVM_OPC_lor = 129,
+ JVM_OPC_ixor = 130,
+ JVM_OPC_lxor = 131,
+ JVM_OPC_iinc = 132,
+ JVM_OPC_i2l = 133,
+ JVM_OPC_i2f = 134,
+ JVM_OPC_i2d = 135,
+ JVM_OPC_l2i = 136,
+ JVM_OPC_l2f = 137,
+ JVM_OPC_l2d = 138,
+ JVM_OPC_f2i = 139,
+ JVM_OPC_f2l = 140,
+ JVM_OPC_f2d = 141,
+ JVM_OPC_d2i = 142,
+ JVM_OPC_d2l = 143,
+ JVM_OPC_d2f = 144,
+ JVM_OPC_i2b = 145,
+ JVM_OPC_i2c = 146,
+ JVM_OPC_i2s = 147,
+ JVM_OPC_lcmp = 148,
+ JVM_OPC_fcmpl = 149,
+ JVM_OPC_fcmpg = 150,
+ JVM_OPC_dcmpl = 151,
+ JVM_OPC_dcmpg = 152,
+ JVM_OPC_ifeq = 153,
+ JVM_OPC_ifne = 154,
+ JVM_OPC_iflt = 155,
+ JVM_OPC_ifge = 156,
+ JVM_OPC_ifgt = 157,
+ JVM_OPC_ifle = 158,
+ JVM_OPC_if_icmpeq = 159,
+ JVM_OPC_if_icmpne = 160,
+ JVM_OPC_if_icmplt = 161,
+ JVM_OPC_if_icmpge = 162,
+ JVM_OPC_if_icmpgt = 163,
+ JVM_OPC_if_icmple = 164,
+ JVM_OPC_if_acmpeq = 165,
+ JVM_OPC_if_acmpne = 166,
+ JVM_OPC_goto = 167,
+ JVM_OPC_jsr = 168,
+ JVM_OPC_ret = 169,
+ JVM_OPC_tableswitch = 170,
+ JVM_OPC_lookupswitch = 171,
+ JVM_OPC_ireturn = 172,
+ JVM_OPC_lreturn = 173,
+ JVM_OPC_freturn = 174,
+ JVM_OPC_dreturn = 175,
+ JVM_OPC_areturn = 176,
+ JVM_OPC_return = 177,
+ JVM_OPC_getstatic = 178,
+ JVM_OPC_putstatic = 179,
+ JVM_OPC_getfield = 180,
+ JVM_OPC_putfield = 181,
+ JVM_OPC_invokevirtual = 182,
+ JVM_OPC_invokespecial = 183,
+ JVM_OPC_invokestatic = 184,
+ JVM_OPC_invokeinterface = 185,
+ JVM_OPC_invokedynamic = 186,
+ JVM_OPC_new = 187,
+ JVM_OPC_newarray = 188,
+ JVM_OPC_anewarray = 189,
+ JVM_OPC_arraylength = 190,
+ JVM_OPC_athrow = 191,
+ JVM_OPC_checkcast = 192,
+ JVM_OPC_instanceof = 193,
+ JVM_OPC_monitorenter = 194,
+ JVM_OPC_monitorexit = 195,
+ JVM_OPC_wide = 196,
+ JVM_OPC_multianewarray = 197,
+ JVM_OPC_ifnull = 198,
+ JVM_OPC_ifnonnull = 199,
+ JVM_OPC_goto_w = 200,
+ JVM_OPC_jsr_w = 201,
+ JVM_OPC_MAX = 201
+};
+
+/* Opcode length initializer, use with something like:
+ * unsigned char opcode_length[JVM_OPC_MAX+1] = JVM_OPCODE_LENGTH_INITIALIZER;
+ */
+#define JVM_OPCODE_LENGTH_INITIALIZER { \
+ 1, /* nop */ \
+ 1, /* aconst_null */ \
+ 1, /* iconst_m1 */ \
+ 1, /* iconst_0 */ \
+ 1, /* iconst_1 */ \
+ 1, /* iconst_2 */ \
+ 1, /* iconst_3 */ \
+ 1, /* iconst_4 */ \
+ 1, /* iconst_5 */ \
+ 1, /* lconst_0 */ \
+ 1, /* lconst_1 */ \
+ 1, /* fconst_0 */ \
+ 1, /* fconst_1 */ \
+ 1, /* fconst_2 */ \
+ 1, /* dconst_0 */ \
+ 1, /* dconst_1 */ \
+ 2, /* bipush */ \
+ 3, /* sipush */ \
+ 2, /* ldc */ \
+ 3, /* ldc_w */ \
+ 3, /* ldc2_w */ \
+ 2, /* iload */ \
+ 2, /* lload */ \
+ 2, /* fload */ \
+ 2, /* dload */ \
+ 2, /* aload */ \
+ 1, /* iload_0 */ \
+ 1, /* iload_1 */ \
+ 1, /* iload_2 */ \
+ 1, /* iload_3 */ \
+ 1, /* lload_0 */ \
+ 1, /* lload_1 */ \
+ 1, /* lload_2 */ \
+ 1, /* lload_3 */ \
+ 1, /* fload_0 */ \
+ 1, /* fload_1 */ \
+ 1, /* fload_2 */ \
+ 1, /* fload_3 */ \
+ 1, /* dload_0 */ \
+ 1, /* dload_1 */ \
+ 1, /* dload_2 */ \
+ 1, /* dload_3 */ \
+ 1, /* aload_0 */ \
+ 1, /* aload_1 */ \
+ 1, /* aload_2 */ \
+ 1, /* aload_3 */ \
+ 1, /* iaload */ \
+ 1, /* laload */ \
+ 1, /* faload */ \
+ 1, /* daload */ \
+ 1, /* aaload */ \
+ 1, /* baload */ \
+ 1, /* caload */ \
+ 1, /* saload */ \
+ 2, /* istore */ \
+ 2, /* lstore */ \
+ 2, /* fstore */ \
+ 2, /* dstore */ \
+ 2, /* astore */ \
+ 1, /* istore_0 */ \
+ 1, /* istore_1 */ \
+ 1, /* istore_2 */ \
+ 1, /* istore_3 */ \
+ 1, /* lstore_0 */ \
+ 1, /* lstore_1 */ \
+ 1, /* lstore_2 */ \
+ 1, /* lstore_3 */ \
+ 1, /* fstore_0 */ \
+ 1, /* fstore_1 */ \
+ 1, /* fstore_2 */ \
+ 1, /* fstore_3 */ \
+ 1, /* dstore_0 */ \
+ 1, /* dstore_1 */ \
+ 1, /* dstore_2 */ \
+ 1, /* dstore_3 */ \
+ 1, /* astore_0 */ \
+ 1, /* astore_1 */ \
+ 1, /* astore_2 */ \
+ 1, /* astore_3 */ \
+ 1, /* iastore */ \
+ 1, /* lastore */ \
+ 1, /* fastore */ \
+ 1, /* dastore */ \
+ 1, /* aastore */ \
+ 1, /* bastore */ \
+ 1, /* castore */ \
+ 1, /* sastore */ \
+ 1, /* pop */ \
+ 1, /* pop2 */ \
+ 1, /* dup */ \
+ 1, /* dup_x1 */ \
+ 1, /* dup_x2 */ \
+ 1, /* dup2 */ \
+ 1, /* dup2_x1 */ \
+ 1, /* dup2_x2 */ \
+ 1, /* swap */ \
+ 1, /* iadd */ \
+ 1, /* ladd */ \
+ 1, /* fadd */ \
+ 1, /* dadd */ \
+ 1, /* isub */ \
+ 1, /* lsub */ \
+ 1, /* fsub */ \
+ 1, /* dsub */ \
+ 1, /* imul */ \
+ 1, /* lmul */ \
+ 1, /* fmul */ \
+ 1, /* dmul */ \
+ 1, /* idiv */ \
+ 1, /* ldiv */ \
+ 1, /* fdiv */ \
+ 1, /* ddiv */ \
+ 1, /* irem */ \
+ 1, /* lrem */ \
+ 1, /* frem */ \
+ 1, /* drem */ \
+ 1, /* ineg */ \
+ 1, /* lneg */ \
+ 1, /* fneg */ \
+ 1, /* dneg */ \
+ 1, /* ishl */ \
+ 1, /* lshl */ \
+ 1, /* ishr */ \
+ 1, /* lshr */ \
+ 1, /* iushr */ \
+ 1, /* lushr */ \
+ 1, /* iand */ \
+ 1, /* land */ \
+ 1, /* ior */ \
+ 1, /* lor */ \
+ 1, /* ixor */ \
+ 1, /* lxor */ \
+ 3, /* iinc */ \
+ 1, /* i2l */ \
+ 1, /* i2f */ \
+ 1, /* i2d */ \
+ 1, /* l2i */ \
+ 1, /* l2f */ \
+ 1, /* l2d */ \
+ 1, /* f2i */ \
+ 1, /* f2l */ \
+ 1, /* f2d */ \
+ 1, /* d2i */ \
+ 1, /* d2l */ \
+ 1, /* d2f */ \
+ 1, /* i2b */ \
+ 1, /* i2c */ \
+ 1, /* i2s */ \
+ 1, /* lcmp */ \
+ 1, /* fcmpl */ \
+ 1, /* fcmpg */ \
+ 1, /* dcmpl */ \
+ 1, /* dcmpg */ \
+ 3, /* ifeq */ \
+ 3, /* ifne */ \
+ 3, /* iflt */ \
+ 3, /* ifge */ \
+ 3, /* ifgt */ \
+ 3, /* ifle */ \
+ 3, /* if_icmpeq */ \
+ 3, /* if_icmpne */ \
+ 3, /* if_icmplt */ \
+ 3, /* if_icmpge */ \
+ 3, /* if_icmpgt */ \
+ 3, /* if_icmple */ \
+ 3, /* if_acmpeq */ \
+ 3, /* if_acmpne */ \
+ 3, /* goto */ \
+ 3, /* jsr */ \
+ 2, /* ret */ \
+ 99, /* tableswitch */ \
+ 99, /* lookupswitch */ \
+ 1, /* ireturn */ \
+ 1, /* lreturn */ \
+ 1, /* freturn */ \
+ 1, /* dreturn */ \
+ 1, /* areturn */ \
+ 1, /* return */ \
+ 3, /* getstatic */ \
+ 3, /* putstatic */ \
+ 3, /* getfield */ \
+ 3, /* putfield */ \
+ 3, /* invokevirtual */ \
+ 3, /* invokespecial */ \
+ 3, /* invokestatic */ \
+ 5, /* invokeinterface */ \
+ 5, /* invokedynamic */ \
+ 3, /* new */ \
+ 2, /* newarray */ \
+ 3, /* anewarray */ \
+ 1, /* arraylength */ \
+ 1, /* athrow */ \
+ 3, /* checkcast */ \
+ 3, /* instanceof */ \
+ 1, /* monitorenter */ \
+ 1, /* monitorexit */ \
+ 0, /* wide */ \
+ 4, /* multianewarray */ \
+ 3, /* ifnull */ \
+ 3, /* ifnonnull */ \
+ 5, /* goto_w */ \
+ 5 /* jsr_w */ \
+}
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif /* __cplusplus */
+
+#endif /* CLASSFILE_CONSTANTS */
diff --git a/love2dToAPK/tools/tools/jdk-win/include/jawt.h b/love2dToAPK/tools/tools/jdk-win/include/jawt.h
new file mode 100644
index 0000000..f06e807
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/include/jawt.h
@@ -0,0 +1,299 @@
+/*
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ */
+
+#ifndef _JAVASOFT_JAWT_H_
+#define _JAVASOFT_JAWT_H_
+
+#include "jni.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * AWT native interface (new in JDK 1.3)
+ *
+ * The AWT native interface allows a native C or C++ application a means
+ * by which to access native structures in AWT. This is to facilitate moving
+ * legacy C and C++ applications to Java and to target the needs of the
+ * community who, at present, wish to do their own native rendering to canvases
+ * for performance reasons. Standard extensions such as Java3D also require a
+ * means to access the underlying native data structures of AWT.
+ *
+ * There may be future extensions to this API depending on demand.
+ *
+ * A VM does not have to implement this API in order to pass the JCK.
+ * It is recommended, however, that this API is implemented on VMs that support
+ * standard extensions, such as Java3D.
+ *
+ * Since this is a native API, any program which uses it cannot be considered
+ * 100% pure java.
+ */
+
+/*
+ * AWT Native Drawing Surface (JAWT_DrawingSurface).
+ *
+ * For each platform, there is a native drawing surface structure. This
+ * platform-specific structure can be found in jawt_md.h. It is recommended
+ * that additional platforms follow the same model. It is also recommended
+ * that VMs on Win32 and Solaris support the existing structures in jawt_md.h.
+ *
+ *******************
+ * EXAMPLE OF USAGE:
+ *******************
+ *
+ * In Win32, a programmer wishes to access the HWND of a canvas to perform
+ * native rendering into it. The programmer has declared the paint() method
+ * for their canvas subclass to be native:
+ *
+ *
+ * MyCanvas.java:
+ *
+ * import java.awt.*;
+ *
+ * public class MyCanvas extends Canvas {
+ *
+ * static {
+ * System.loadLibrary("mylib");
+ * }
+ *
+ * public native void paint(Graphics g);
+ * }
+ *
+ *
+ * myfile.c:
+ *
+ * #include "jawt_md.h"
+ * #include <assert.h>
+ *
+ * JNIEXPORT void JNICALL
+ * Java_MyCanvas_paint(JNIEnv* env, jobject canvas, jobject graphics)
+ * {
+ * JAWT awt;
+ * JAWT_DrawingSurface* ds;
+ * JAWT_DrawingSurfaceInfo* dsi;
+ * JAWT_Win32DrawingSurfaceInfo* dsi_win;
+ * jboolean result;
+ * jint lock;
+ *
+ * // Get the AWT
+ * awt.version = JAWT_VERSION_1_3;
+ * result = JAWT_GetAWT(env, &awt);
+ * assert(result != JNI_FALSE);
+ *
+ * // Get the drawing surface
+ * ds = awt.GetDrawingSurface(env, canvas);
+ * assert(ds != NULL);
+ *
+ * // Lock the drawing surface
+ * lock = ds->Lock(ds);
+ * assert((lock & JAWT_LOCK_ERROR) == 0);
+ *
+ * // Get the drawing surface info
+ * dsi = ds->GetDrawingSurfaceInfo(ds);
+ *
+ * // Get the platform-specific drawing info
+ * dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;
+ *
+ * //////////////////////////////
+ * // !!! DO PAINTING HERE !!! //
+ * //////////////////////////////
+ *
+ * // Free the drawing surface info
+ * ds->FreeDrawingSurfaceInfo(dsi);
+ *
+ * // Unlock the drawing surface
+ * ds->Unlock(ds);
+ *
+ * // Free the drawing surface
+ * awt.FreeDrawingSurface(ds);
+ * }
+ *
+ */
+
+/*
+ * JAWT_Rectangle
+ * Structure for a native rectangle.
+ */
+typedef struct jawt_Rectangle {
+ jint x;
+ jint y;
+ jint width;
+ jint height;
+} JAWT_Rectangle;
+
+struct jawt_DrawingSurface;
+
+/*
+ * JAWT_DrawingSurfaceInfo
+ * Structure for containing the underlying drawing information of a component.
+ */
+typedef struct jawt_DrawingSurfaceInfo {
+ /*
+ * Pointer to the platform-specific information. This can be safely
+ * cast to a JAWT_Win32DrawingSurfaceInfo on Windows or a
+ * JAWT_X11DrawingSurfaceInfo on Solaris. On Mac OS X this is a
+ * pointer to a NSObject that conforms to the JAWT_SurfaceLayers
+ * protocol. See jawt_md.h for details.
+ */
+ void* platformInfo;
+ /* Cached pointer to the underlying drawing surface */
+ struct jawt_DrawingSurface* ds;
+ /* Bounding rectangle of the drawing surface */
+ JAWT_Rectangle bounds;
+ /* Number of rectangles in the clip */
+ jint clipSize;
+ /* Clip rectangle array */
+ JAWT_Rectangle* clip;
+} JAWT_DrawingSurfaceInfo;
+
+#define JAWT_LOCK_ERROR 0x00000001
+#define JAWT_LOCK_CLIP_CHANGED 0x00000002
+#define JAWT_LOCK_BOUNDS_CHANGED 0x00000004
+#define JAWT_LOCK_SURFACE_CHANGED 0x00000008
+
+/*
+ * JAWT_DrawingSurface
+ * Structure for containing the underlying drawing information of a component.
+ * All operations on a JAWT_DrawingSurface MUST be performed from the same
+ * thread as the call to GetDrawingSurface.
+ */
+typedef struct jawt_DrawingSurface {
+ /*
+ * Cached reference to the Java environment of the calling thread.
+ * If Lock(), Unlock(), GetDrawingSurfaceInfo() or
+ * FreeDrawingSurfaceInfo() are called from a different thread,
+ * this data member should be set before calling those functions.
+ */
+ JNIEnv* env;
+ /* Cached reference to the target object */
+ jobject target;
+ /*
+ * Lock the surface of the target component for native rendering.
+ * When finished drawing, the surface must be unlocked with
+ * Unlock(). This function returns a bitmask with one or more of the
+ * following values:
+ *
+ * JAWT_LOCK_ERROR - When an error has occurred and the surface could not
+ * be locked.
+ *
+ * JAWT_LOCK_CLIP_CHANGED - When the clip region has changed.
+ *
+ * JAWT_LOCK_BOUNDS_CHANGED - When the bounds of the surface have changed.
+ *
+ * JAWT_LOCK_SURFACE_CHANGED - When the surface itself has changed
+ */
+ jint (JNICALL *Lock)
+ (struct jawt_DrawingSurface* ds);
+ /*
+ * Get the drawing surface info.
+ * The value returned may be cached, but the values may change if
+ * additional calls to Lock() or Unlock() are made.
+ * Lock() must be called before this can return a valid value.
+ * Returns NULL if an error has occurred.
+ * When finished with the returned value, FreeDrawingSurfaceInfo must be
+ * called.
+ */
+ JAWT_DrawingSurfaceInfo* (JNICALL *GetDrawingSurfaceInfo)
+ (struct jawt_DrawingSurface* ds);
+ /*
+ * Free the drawing surface info.
+ */
+ void (JNICALL *FreeDrawingSurfaceInfo)
+ (JAWT_DrawingSurfaceInfo* dsi);
+ /*
+ * Unlock the drawing surface of the target component for native rendering.
+ */
+ void (JNICALL *Unlock)
+ (struct jawt_DrawingSurface* ds);
+} JAWT_DrawingSurface;
+
+/*
+ * JAWT
+ * Structure for containing native AWT functions.
+ */
+typedef struct jawt {
+ /*
+ * Version of this structure. This must always be set before
+ * calling JAWT_GetAWT()
+ */
+ jint version;
+ /*
+ * Return a drawing surface from a target jobject. This value
+ * may be cached.
+ * Returns NULL if an error has occurred.
+ * Target must be a java.awt.Component (should be a Canvas
+ * or Window for native rendering).
+ * FreeDrawingSurface() must be called when finished with the
+ * returned JAWT_DrawingSurface.
+ */
+ JAWT_DrawingSurface* (JNICALL *GetDrawingSurface)
+ (JNIEnv* env, jobject target);
+ /*
+ * Free the drawing surface allocated in GetDrawingSurface.
+ */
+ void (JNICALL *FreeDrawingSurface)
+ (JAWT_DrawingSurface* ds);
+ /*
+ * Since 1.4
+ * Locks the entire AWT for synchronization purposes
+ */
+ void (JNICALL *Lock)(JNIEnv* env);
+ /*
+ * Since 1.4
+ * Unlocks the entire AWT for synchronization purposes
+ */
+ void (JNICALL *Unlock)(JNIEnv* env);
+ /*
+ * Since 1.4
+ * Returns a reference to a java.awt.Component from a native
+ * platform handle. On Windows, this corresponds to an HWND;
+ * on Solaris and Linux, this is a Drawable. For other platforms,
+ * see the appropriate machine-dependent header file for a description.
+ * The reference returned by this function is a local
+ * reference that is only valid in this environment.
+ * This function returns a NULL reference if no component could be
+ * found with matching platform information.
+ */
+ jobject (JNICALL *GetComponent)(JNIEnv* env, void* platformInfo);
+
+} JAWT;
+
+/*
+ * Get the AWT native structure. This function returns JNI_FALSE if
+ * an error occurs.
+ */
+_JNI_IMPORT_OR_EXPORT_
+jboolean JNICALL JAWT_GetAWT(JNIEnv* env, JAWT* awt);
+
+#define JAWT_VERSION_1_3 0x00010003
+#define JAWT_VERSION_1_4 0x00010004
+#define JAWT_VERSION_1_7 0x00010007
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* !_JAVASOFT_JAWT_H_ */
diff --git a/love2dToAPK/tools/tools/jdk-win/include/jdwpTransport.h b/love2dToAPK/tools/tools/jdk-win/include/jdwpTransport.h
new file mode 100644
index 0000000..0ab7cdc
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/include/jdwpTransport.h
@@ -0,0 +1,254 @@
+/*
+ * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ */
+
+/*
+ * Java Debug Wire Protocol Transport Service Provider Interface.
+ */
+
+#ifndef JDWPTRANSPORT_H
+#define JDWPTRANSPORT_H
+
+#include "jni.h"
+
+enum {
+ JDWPTRANSPORT_VERSION_1_0 = 0x00010000
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct jdwpTransportNativeInterface_;
+
+struct _jdwpTransportEnv;
+
+#ifdef __cplusplus
+typedef _jdwpTransportEnv jdwpTransportEnv;
+#else
+typedef const struct jdwpTransportNativeInterface_ *jdwpTransportEnv;
+#endif /* __cplusplus */
+
+/*
+ * Errors. Universal errors with JVMTI/JVMDI equivalents keep the
+ * values the same.
+ */
+typedef enum {
+ JDWPTRANSPORT_ERROR_NONE = 0,
+ JDWPTRANSPORT_ERROR_ILLEGAL_ARGUMENT = 103,
+ JDWPTRANSPORT_ERROR_OUT_OF_MEMORY = 110,
+ JDWPTRANSPORT_ERROR_INTERNAL = 113,
+ JDWPTRANSPORT_ERROR_ILLEGAL_STATE = 201,
+ JDWPTRANSPORT_ERROR_IO_ERROR = 202,
+ JDWPTRANSPORT_ERROR_TIMEOUT = 203,
+ JDWPTRANSPORT_ERROR_MSG_NOT_AVAILABLE = 204
+} jdwpTransportError;
+
+
+/*
+ * Structure to define capabilities
+ */
+typedef struct {
+ unsigned int can_timeout_attach :1;
+ unsigned int can_timeout_accept :1;
+ unsigned int can_timeout_handshake :1;
+ unsigned int reserved3 :1;
+ unsigned int reserved4 :1;
+ unsigned int reserved5 :1;
+ unsigned int reserved6 :1;
+ unsigned int reserved7 :1;
+ unsigned int reserved8 :1;
+ unsigned int reserved9 :1;
+ unsigned int reserved10 :1;
+ unsigned int reserved11 :1;
+ unsigned int reserved12 :1;
+ unsigned int reserved13 :1;
+ unsigned int reserved14 :1;
+ unsigned int reserved15 :1;
+} JDWPTransportCapabilities;
+
+
+/*
+ * Structures to define packet layout.
+ *
+ * See: http://java.sun.com/j2se/1.5/docs/guide/jpda/jdwp-spec.html
+ */
+
+enum {
+ JDWPTRANSPORT_FLAGS_NONE = 0x0,
+ JDWPTRANSPORT_FLAGS_REPLY = 0x80
+};
+
+typedef struct {
+ jint len;
+ jint id;
+ jbyte flags;
+ jbyte cmdSet;
+ jbyte cmd;
+ jbyte *data;
+} jdwpCmdPacket;
+
+typedef struct {
+ jint len;
+ jint id;
+ jbyte flags;
+ jshort errorCode;
+ jbyte *data;
+} jdwpReplyPacket;
+
+typedef struct {
+ union {
+ jdwpCmdPacket cmd;
+ jdwpReplyPacket reply;
+ } type;
+} jdwpPacket;
+
+/*
+ * JDWP functions called by the transport.
+ */
+typedef struct jdwpTransportCallback {
+ void *(*alloc)(jint numBytes); /* Call this for all allocations */
+ void (*free)(void *buffer); /* Call this for all deallocations */
+} jdwpTransportCallback;
+
+typedef jint (JNICALL *jdwpTransport_OnLoad_t)(JavaVM *jvm,
+ jdwpTransportCallback *callback,
+ jint version,
+ jdwpTransportEnv** env);
+
+
+
+/* Function Interface */
+
+struct jdwpTransportNativeInterface_ {
+ /* 1 : RESERVED */
+ void *reserved1;
+
+ /* 2 : Get Capabilities */
+ jdwpTransportError (JNICALL *GetCapabilities)(jdwpTransportEnv* env,
+ JDWPTransportCapabilities *capabilities_ptr);
+
+ /* 3 : Attach */
+ jdwpTransportError (JNICALL *Attach)(jdwpTransportEnv* env,
+ const char* address,
+ jlong attach_timeout,
+ jlong handshake_timeout);
+
+ /* 4: StartListening */
+ jdwpTransportError (JNICALL *StartListening)(jdwpTransportEnv* env,
+ const char* address,
+ char** actual_address);
+
+ /* 5: StopListening */
+ jdwpTransportError (JNICALL *StopListening)(jdwpTransportEnv* env);
+
+ /* 6: Accept */
+ jdwpTransportError (JNICALL *Accept)(jdwpTransportEnv* env,
+ jlong accept_timeout,
+ jlong handshake_timeout);
+
+ /* 7: IsOpen */
+ jboolean (JNICALL *IsOpen)(jdwpTransportEnv* env);
+
+ /* 8: Close */
+ jdwpTransportError (JNICALL *Close)(jdwpTransportEnv* env);
+
+ /* 9: ReadPacket */
+ jdwpTransportError (JNICALL *ReadPacket)(jdwpTransportEnv* env,
+ jdwpPacket *pkt);
+
+ /* 10: Write Packet */
+ jdwpTransportError (JNICALL *WritePacket)(jdwpTransportEnv* env,
+ const jdwpPacket* pkt);
+
+ /* 11: GetLastError */
+ jdwpTransportError (JNICALL *GetLastError)(jdwpTransportEnv* env,
+ char** error);
+
+};
+
+
+/*
+ * Use inlined functions so that C++ code can use syntax such as
+ * env->Attach("mymachine:5000", 10*1000, 0);
+ *
+ * rather than using C's :-
+ *
+ * (*env)->Attach(env, "mymachine:5000", 10*1000, 0);
+ */
+struct _jdwpTransportEnv {
+ const struct jdwpTransportNativeInterface_ *functions;
+#ifdef __cplusplus
+
+ jdwpTransportError GetCapabilities(JDWPTransportCapabilities *capabilities_ptr) {
+ return functions->GetCapabilities(this, capabilities_ptr);
+ }
+
+ jdwpTransportError Attach(const char* address, jlong attach_timeout,
+ jlong handshake_timeout) {
+ return functions->Attach(this, address, attach_timeout, handshake_timeout);
+ }
+
+ jdwpTransportError StartListening(const char* address,
+ char** actual_address) {
+ return functions->StartListening(this, address, actual_address);
+ }
+
+ jdwpTransportError StopListening(void) {
+ return functions->StopListening(this);
+ }
+
+ jdwpTransportError Accept(jlong accept_timeout, jlong handshake_timeout) {
+ return functions->Accept(this, accept_timeout, handshake_timeout);
+ }
+
+ jboolean IsOpen(void) {
+ return functions->IsOpen(this);
+ }
+
+ jdwpTransportError Close(void) {
+ return functions->Close(this);
+ }
+
+ jdwpTransportError ReadPacket(jdwpPacket *pkt) {
+ return functions->ReadPacket(this, pkt);
+ }
+
+ jdwpTransportError WritePacket(const jdwpPacket* pkt) {
+ return functions->WritePacket(this, pkt);
+ }
+
+ jdwpTransportError GetLastError(char** error) {
+ return functions->GetLastError(this, error);
+ }
+
+
+#endif /* __cplusplus */
+};
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif /* __cplusplus */
+
+#endif /* JDWPTRANSPORT_H */
diff --git a/love2dToAPK/tools/tools/jdk-win/include/jni.h b/love2dToAPK/tools/tools/jdk-win/include/jni.h
new file mode 100644
index 0000000..0ffe244
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/include/jni.h
@@ -0,0 +1,1960 @@
+/*
+ * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
+ * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ */
+
+/*
+ * We used part of Netscape's Java Runtime Interface (JRI) as the starting
+ * point of our design and implementation.
+ */
+
+/******************************************************************************
+ * Java Runtime Interface
+ * Copyright (c) 1996 Netscape Communications Corporation. All rights reserved.
+ *****************************************************************************/
+
+#ifndef _JAVASOFT_JNI_H_
+#define _JAVASOFT_JNI_H_
+
+#include <stdio.h>
+#include <stdarg.h>
+
+/* jni_md.h contains the machine-dependent typedefs for jbyte, jint
+ and jlong */
+
+#include "jni_md.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * JNI Types
+ */
+
+#ifndef JNI_TYPES_ALREADY_DEFINED_IN_JNI_MD_H
+
+typedef unsigned char jboolean;
+typedef unsigned short jchar;
+typedef short jshort;
+typedef float jfloat;
+typedef double jdouble;
+
+typedef jint jsize;
+
+#ifdef __cplusplus
+
+class _jobject {};
+class _jclass : public _jobject {};
+class _jthrowable : public _jobject {};
+class _jstring : public _jobject {};
+class _jarray : public _jobject {};
+class _jbooleanArray : public _jarray {};
+class _jbyteArray : public _jarray {};
+class _jcharArray : public _jarray {};
+class _jshortArray : public _jarray {};
+class _jintArray : public _jarray {};
+class _jlongArray : public _jarray {};
+class _jfloatArray : public _jarray {};
+class _jdoubleArray : public _jarray {};
+class _jobjectArray : public _jarray {};
+
+typedef _jobject *jobject;
+typedef _jclass *jclass;
+typedef _jthrowable *jthrowable;
+typedef _jstring *jstring;
+typedef _jarray *jarray;
+typedef _jbooleanArray *jbooleanArray;
+typedef _jbyteArray *jbyteArray;
+typedef _jcharArray *jcharArray;
+typedef _jshortArray *jshortArray;
+typedef _jintArray *jintArray;
+typedef _jlongArray *jlongArray;
+typedef _jfloatArray *jfloatArray;
+typedef _jdoubleArray *jdoubleArray;
+typedef _jobjectArray *jobjectArray;
+
+#else
+
+struct _jobject;
+
+typedef struct _jobject *jobject;
+typedef jobject jclass;
+typedef jobject jthrowable;
+typedef jobject jstring;
+typedef jobject jarray;
+typedef jarray jbooleanArray;
+typedef jarray jbyteArray;
+typedef jarray jcharArray;
+typedef jarray jshortArray;
+typedef jarray jintArray;
+typedef jarray jlongArray;
+typedef jarray jfloatArray;
+typedef jarray jdoubleArray;
+typedef jarray jobjectArray;
+
+#endif
+
+typedef jobject jweak;
+
+typedef union jvalue {
+ jboolean z;
+ jbyte b;
+ jchar c;
+ jshort s;
+ jint i;
+ jlong j;
+ jfloat f;
+ jdouble d;
+ jobject l;
+} jvalue;
+
+struct _jfieldID;
+typedef struct _jfieldID *jfieldID;
+
+struct _jmethodID;
+typedef struct _jmethodID *jmethodID;
+
+/* Return values from jobjectRefType */
+typedef enum _jobjectType {
+ JNIInvalidRefType = 0,
+ JNILocalRefType = 1,
+ JNIGlobalRefType = 2,
+ JNIWeakGlobalRefType = 3
+} jobjectRefType;
+
+
+#endif /* JNI_TYPES_ALREADY_DEFINED_IN_JNI_MD_H */
+
+/*
+ * jboolean constants
+ */
+
+#define JNI_FALSE 0
+#define JNI_TRUE 1
+
+/*
+ * possible return values for JNI functions.
+ */
+
+#define JNI_OK 0 /* success */
+#define JNI_ERR (-1) /* unknown error */
+#define JNI_EDETACHED (-2) /* thread detached from the VM */
+#define JNI_EVERSION (-3) /* JNI version error */
+#define JNI_ENOMEM (-4) /* not enough memory */
+#define JNI_EEXIST (-5) /* VM already created */
+#define JNI_EINVAL (-6) /* invalid arguments */
+
+/*
+ * used in ReleaseScalarArrayElements
+ */
+
+#define JNI_COMMIT 1
+#define JNI_ABORT 2
+
+/*
+ * used in RegisterNatives to describe native method name, signature,
+ * and function pointer.
+ */
+
+typedef struct {
+ char *name;
+ char *signature;
+ void *fnPtr;
+} JNINativeMethod;
+
+/*
+ * JNI Native Method Interface.
+ */
+
+struct JNINativeInterface_;
+
+struct JNIEnv_;
+
+#ifdef __cplusplus
+typedef JNIEnv_ JNIEnv;
+#else
+typedef const struct JNINativeInterface_ *JNIEnv;
+#endif
+
+/*
+ * JNI Invocation Interface.
+ */
+
+struct JNIInvokeInterface_;
+
+struct JavaVM_;
+
+#ifdef __cplusplus
+typedef JavaVM_ JavaVM;
+#else
+typedef const struct JNIInvokeInterface_ *JavaVM;
+#endif
+
+struct JNINativeInterface_ {
+ void *reserved0;
+ void *reserved1;
+ void *reserved2;
+
+ void *reserved3;
+ jint (JNICALL *GetVersion)(JNIEnv *env);
+
+ jclass (JNICALL *DefineClass)
+ (JNIEnv *env, const char *name, jobject loader, const jbyte *buf,
+ jsize len);
+ jclass (JNICALL *FindClass)
+ (JNIEnv *env, const char *name);
+
+ jmethodID (JNICALL *FromReflectedMethod)
+ (JNIEnv *env, jobject method);
+ jfieldID (JNICALL *FromReflectedField)
+ (JNIEnv *env, jobject field);
+
+ jobject (JNICALL *ToReflectedMethod)
+ (JNIEnv *env, jclass cls, jmethodID methodID, jboolean isStatic);
+
+ jclass (JNICALL *GetSuperclass)
+ (JNIEnv *env, jclass sub);
+ jboolean (JNICALL *IsAssignableFrom)
+ (JNIEnv *env, jclass sub, jclass sup);
+
+ jobject (JNICALL *ToReflectedField)
+ (JNIEnv *env, jclass cls, jfieldID fieldID, jboolean isStatic);
+
+ jint (JNICALL *Throw)
+ (JNIEnv *env, jthrowable obj);
+ jint (JNICALL *ThrowNew)
+ (JNIEnv *env, jclass clazz, const char *msg);
+ jthrowable (JNICALL *ExceptionOccurred)
+ (JNIEnv *env);
+ void (JNICALL *ExceptionDescribe)
+ (JNIEnv *env);
+ void (JNICALL *ExceptionClear)
+ (JNIEnv *env);
+ void (JNICALL *FatalError)
+ (JNIEnv *env, const char *msg);
+
+ jint (JNICALL *PushLocalFrame)
+ (JNIEnv *env, jint capacity);
+ jobject (JNICALL *PopLocalFrame)
+ (JNIEnv *env, jobject result);
+
+ jobject (JNICALL *NewGlobalRef)
+ (JNIEnv *env, jobject lobj);
+ void (JNICALL *DeleteGlobalRef)
+ (JNIEnv *env, jobject gref);
+ void (JNICALL *DeleteLocalRef)
+ (JNIEnv *env, jobject obj);
+ jboolean (JNICALL *IsSameObject)
+ (JNIEnv *env, jobject obj1, jobject obj2);
+ jobject (JNICALL *NewLocalRef)
+ (JNIEnv *env, jobject ref);
+ jint (JNICALL *EnsureLocalCapacity)
+ (JNIEnv *env, jint capacity);
+
+ jobject (JNICALL *AllocObject)
+ (JNIEnv *env, jclass clazz);
+ jobject (JNICALL *NewObject)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
+ jobject (JNICALL *NewObjectV)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
+ jobject (JNICALL *NewObjectA)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
+
+ jclass (JNICALL *GetObjectClass)
+ (JNIEnv *env, jobject obj);
+ jboolean (JNICALL *IsInstanceOf)
+ (JNIEnv *env, jobject obj, jclass clazz);
+
+ jmethodID (JNICALL *GetMethodID)
+ (JNIEnv *env, jclass clazz, const char *name, const char *sig);
+
+ jobject (JNICALL *CallObjectMethod)
+ (JNIEnv *env, jobject obj, jmethodID methodID, ...);
+ jobject (JNICALL *CallObjectMethodV)
+ (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
+ jobject (JNICALL *CallObjectMethodA)
+ (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args);
+
+ jboolean (JNICALL *CallBooleanMethod)
+ (JNIEnv *env, jobject obj, jmethodID methodID, ...);
+ jboolean (JNICALL *CallBooleanMethodV)
+ (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
+ jboolean (JNICALL *CallBooleanMethodA)
+ (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args);
+
+ jbyte (JNICALL *CallByteMethod)
+ (JNIEnv *env, jobject obj, jmethodID methodID, ...);
+ jbyte (JNICALL *CallByteMethodV)
+ (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
+ jbyte (JNICALL *CallByteMethodA)
+ (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
+
+ jchar (JNICALL *CallCharMethod)
+ (JNIEnv *env, jobject obj, jmethodID methodID, ...);
+ jchar (JNICALL *CallCharMethodV)
+ (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
+ jchar (JNICALL *CallCharMethodA)
+ (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
+
+ jshort (JNICALL *CallShortMethod)
+ (JNIEnv *env, jobject obj, jmethodID methodID, ...);
+ jshort (JNICALL *CallShortMethodV)
+ (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
+ jshort (JNICALL *CallShortMethodA)
+ (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
+
+ jint (JNICALL *CallIntMethod)
+ (JNIEnv *env, jobject obj, jmethodID methodID, ...);
+ jint (JNICALL *CallIntMethodV)
+ (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
+ jint (JNICALL *CallIntMethodA)
+ (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
+
+ jlong (JNICALL *CallLongMethod)
+ (JNIEnv *env, jobject obj, jmethodID methodID, ...);
+ jlong (JNICALL *CallLongMethodV)
+ (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
+ jlong (JNICALL *CallLongMethodA)
+ (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
+
+ jfloat (JNICALL *CallFloatMethod)
+ (JNIEnv *env, jobject obj, jmethodID methodID, ...);
+ jfloat (JNICALL *CallFloatMethodV)
+ (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
+ jfloat (JNICALL *CallFloatMethodA)
+ (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
+
+ jdouble (JNICALL *CallDoubleMethod)
+ (JNIEnv *env, jobject obj, jmethodID methodID, ...);
+ jdouble (JNICALL *CallDoubleMethodV)
+ (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
+ jdouble (JNICALL *CallDoubleMethodA)
+ (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
+
+ void (JNICALL *CallVoidMethod)
+ (JNIEnv *env, jobject obj, jmethodID methodID, ...);
+ void (JNICALL *CallVoidMethodV)
+ (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
+ void (JNICALL *CallVoidMethodA)
+ (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args);
+
+ jobject (JNICALL *CallNonvirtualObjectMethod)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
+ jobject (JNICALL *CallNonvirtualObjectMethodV)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+ va_list args);
+ jobject (JNICALL *CallNonvirtualObjectMethodA)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+ const jvalue * args);
+
+ jboolean (JNICALL *CallNonvirtualBooleanMethod)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
+ jboolean (JNICALL *CallNonvirtualBooleanMethodV)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+ va_list args);
+ jboolean (JNICALL *CallNonvirtualBooleanMethodA)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+ const jvalue * args);
+
+ jbyte (JNICALL *CallNonvirtualByteMethod)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
+ jbyte (JNICALL *CallNonvirtualByteMethodV)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+ va_list args);
+ jbyte (JNICALL *CallNonvirtualByteMethodA)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+ const jvalue *args);
+
+ jchar (JNICALL *CallNonvirtualCharMethod)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
+ jchar (JNICALL *CallNonvirtualCharMethodV)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+ va_list args);
+ jchar (JNICALL *CallNonvirtualCharMethodA)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+ const jvalue *args);
+
+ jshort (JNICALL *CallNonvirtualShortMethod)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
+ jshort (JNICALL *CallNonvirtualShortMethodV)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+ va_list args);
+ jshort (JNICALL *CallNonvirtualShortMethodA)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+ const jvalue *args);
+
+ jint (JNICALL *CallNonvirtualIntMethod)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
+ jint (JNICALL *CallNonvirtualIntMethodV)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+ va_list args);
+ jint (JNICALL *CallNonvirtualIntMethodA)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+ const jvalue *args);
+
+ jlong (JNICALL *CallNonvirtualLongMethod)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
+ jlong (JNICALL *CallNonvirtualLongMethodV)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+ va_list args);
+ jlong (JNICALL *CallNonvirtualLongMethodA)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+ const jvalue *args);
+
+ jfloat (JNICALL *CallNonvirtualFloatMethod)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
+ jfloat (JNICALL *CallNonvirtualFloatMethodV)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+ va_list args);
+ jfloat (JNICALL *CallNonvirtualFloatMethodA)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+ const jvalue *args);
+
+ jdouble (JNICALL *CallNonvirtualDoubleMethod)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
+ jdouble (JNICALL *CallNonvirtualDoubleMethodV)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+ va_list args);
+ jdouble (JNICALL *CallNonvirtualDoubleMethodA)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+ const jvalue *args);
+
+ void (JNICALL *CallNonvirtualVoidMethod)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
+ void (JNICALL *CallNonvirtualVoidMethodV)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+ va_list args);
+ void (JNICALL *CallNonvirtualVoidMethodA)
+ (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
+ const jvalue * args);
+
+ jfieldID (JNICALL *GetFieldID)
+ (JNIEnv *env, jclass clazz, const char *name, const char *sig);
+
+ jobject (JNICALL *GetObjectField)
+ (JNIEnv *env, jobject obj, jfieldID fieldID);
+ jboolean (JNICALL *GetBooleanField)
+ (JNIEnv *env, jobject obj, jfieldID fieldID);
+ jbyte (JNICALL *GetByteField)
+ (JNIEnv *env, jobject obj, jfieldID fieldID);
+ jchar (JNICALL *GetCharField)
+ (JNIEnv *env, jobject obj, jfieldID fieldID);
+ jshort (JNICALL *GetShortField)
+ (JNIEnv *env, jobject obj, jfieldID fieldID);
+ jint (JNICALL *GetIntField)
+ (JNIEnv *env, jobject obj, jfieldID fieldID);
+ jlong (JNICALL *GetLongField)
+ (JNIEnv *env, jobject obj, jfieldID fieldID);
+ jfloat (JNICALL *GetFloatField)
+ (JNIEnv *env, jobject obj, jfieldID fieldID);
+ jdouble (JNICALL *GetDoubleField)
+ (JNIEnv *env, jobject obj, jfieldID fieldID);
+
+ void (JNICALL *SetObjectField)
+ (JNIEnv *env, jobject obj, jfieldID fieldID, jobject val);
+ void (JNICALL *SetBooleanField)
+ (JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val);
+ void (JNICALL *SetByteField)
+ (JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val);
+ void (JNICALL *SetCharField)
+ (JNIEnv *env, jobject obj, jfieldID fieldID, jchar val);
+ void (JNICALL *SetShortField)
+ (JNIEnv *env, jobject obj, jfieldID fieldID, jshort val);
+ void (JNICALL *SetIntField)
+ (JNIEnv *env, jobject obj, jfieldID fieldID, jint val);
+ void (JNICALL *SetLongField)
+ (JNIEnv *env, jobject obj, jfieldID fieldID, jlong val);
+ void (JNICALL *SetFloatField)
+ (JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val);
+ void (JNICALL *SetDoubleField)
+ (JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val);
+
+ jmethodID (JNICALL *GetStaticMethodID)
+ (JNIEnv *env, jclass clazz, const char *name, const char *sig);
+
+ jobject (JNICALL *CallStaticObjectMethod)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
+ jobject (JNICALL *CallStaticObjectMethodV)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
+ jobject (JNICALL *CallStaticObjectMethodA)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
+
+ jboolean (JNICALL *CallStaticBooleanMethod)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
+ jboolean (JNICALL *CallStaticBooleanMethodV)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
+ jboolean (JNICALL *CallStaticBooleanMethodA)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
+
+ jbyte (JNICALL *CallStaticByteMethod)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
+ jbyte (JNICALL *CallStaticByteMethodV)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
+ jbyte (JNICALL *CallStaticByteMethodA)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
+
+ jchar (JNICALL *CallStaticCharMethod)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
+ jchar (JNICALL *CallStaticCharMethodV)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
+ jchar (JNICALL *CallStaticCharMethodA)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
+
+ jshort (JNICALL *CallStaticShortMethod)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
+ jshort (JNICALL *CallStaticShortMethodV)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
+ jshort (JNICALL *CallStaticShortMethodA)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
+
+ jint (JNICALL *CallStaticIntMethod)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
+ jint (JNICALL *CallStaticIntMethodV)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
+ jint (JNICALL *CallStaticIntMethodA)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
+
+ jlong (JNICALL *CallStaticLongMethod)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
+ jlong (JNICALL *CallStaticLongMethodV)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
+ jlong (JNICALL *CallStaticLongMethodA)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
+
+ jfloat (JNICALL *CallStaticFloatMethod)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
+ jfloat (JNICALL *CallStaticFloatMethodV)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
+ jfloat (JNICALL *CallStaticFloatMethodA)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
+
+ jdouble (JNICALL *CallStaticDoubleMethod)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
+ jdouble (JNICALL *CallStaticDoubleMethodV)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
+ jdouble (JNICALL *CallStaticDoubleMethodA)
+ (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
+
+ void (JNICALL *CallStaticVoidMethod)
+ (JNIEnv *env, jclass cls, jmethodID methodID, ...);
+ void (JNICALL *CallStaticVoidMethodV)
+ (JNIEnv *env, jclass cls, jmethodID methodID, va_list args);
+ void (JNICALL *CallStaticVoidMethodA)
+ (JNIEnv *env, jclass cls, jmethodID methodID, const jvalue * args);
+
+ jfieldID (JNICALL *GetStaticFieldID)
+ (JNIEnv *env, jclass clazz, const char *name, const char *sig);
+ jobject (JNICALL *GetStaticObjectField)
+ (JNIEnv *env, jclass clazz, jfieldID fieldID);
+ jboolean (JNICALL *GetStaticBooleanField)
+ (JNIEnv *env, jclass clazz, jfieldID fieldID);
+ jbyte (JNICALL *GetStaticByteField)
+ (JNIEnv *env, jclass clazz, jfieldID fieldID);
+ jchar (JNICALL *GetStaticCharField)
+ (JNIEnv *env, jclass clazz, jfieldID fieldID);
+ jshort (JNICALL *GetStaticShortField)
+ (JNIEnv *env, jclass clazz, jfieldID fieldID);
+ jint (JNICALL *GetStaticIntField)
+ (JNIEnv *env, jclass clazz, jfieldID fieldID);
+ jlong (JNICALL *GetStaticLongField)
+ (JNIEnv *env, jclass clazz, jfieldID fieldID);
+ jfloat (JNICALL *GetStaticFloatField)
+ (JNIEnv *env, jclass clazz, jfieldID fieldID);
+ jdouble (JNICALL *GetStaticDoubleField)
+ (JNIEnv *env, jclass clazz, jfieldID fieldID);
+
+ void (JNICALL *SetStaticObjectField)
+ (JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value);
+ void (JNICALL *SetStaticBooleanField)
+ (JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean value);
+ void (JNICALL *SetStaticByteField)
+ (JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value);
+ void (JNICALL *SetStaticCharField)
+ (JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value);
+ void (JNICALL *SetStaticShortField)
+ (JNIEnv *env, jclass clazz, jfieldID fieldID, jshort value);
+ void (JNICALL *SetStaticIntField)
+ (JNIEnv *env, jclass clazz, jfieldID fieldID, jint value);
+ void (JNICALL *SetStaticLongField)
+ (JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value);
+ void (JNICALL *SetStaticFloatField)
+ (JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat value);
+ void (JNICALL *SetStaticDoubleField)
+ (JNIEnv *env, jclass clazz, jfieldID fieldID, jdouble value);
+
+ jstring (JNICALL *NewString)
+ (JNIEnv *env, const jchar *unicode, jsize len);
+ jsize (JNICALL *GetStringLength)
+ (JNIEnv *env, jstring str);
+ const jchar *(JNICALL *GetStringChars)
+ (JNIEnv *env, jstring str, jboolean *isCopy);
+ void (JNICALL *ReleaseStringChars)
+ (JNIEnv *env, jstring str, const jchar *chars);
+
+ jstring (JNICALL *NewStringUTF)
+ (JNIEnv *env, const char *utf);
+ jsize (JNICALL *GetStringUTFLength)
+ (JNIEnv *env, jstring str);
+ const char* (JNICALL *GetStringUTFChars)
+ (JNIEnv *env, jstring str, jboolean *isCopy);
+ void (JNICALL *ReleaseStringUTFChars)
+ (JNIEnv *env, jstring str, const char* chars);
+
+
+ jsize (JNICALL *GetArrayLength)
+ (JNIEnv *env, jarray array);
+
+ jobjectArray (JNICALL *NewObjectArray)
+ (JNIEnv *env, jsize len, jclass clazz, jobject init);
+ jobject (JNICALL *GetObjectArrayElement)
+ (JNIEnv *env, jobjectArray array, jsize index);
+ void (JNICALL *SetObjectArrayElement)
+ (JNIEnv *env, jobjectArray array, jsize index, jobject val);
+
+ jbooleanArray (JNICALL *NewBooleanArray)
+ (JNIEnv *env, jsize len);
+ jbyteArray (JNICALL *NewByteArray)
+ (JNIEnv *env, jsize len);
+ jcharArray (JNICALL *NewCharArray)
+ (JNIEnv *env, jsize len);
+ jshortArray (JNICALL *NewShortArray)
+ (JNIEnv *env, jsize len);
+ jintArray (JNICALL *NewIntArray)
+ (JNIEnv *env, jsize len);
+ jlongArray (JNICALL *NewLongArray)
+ (JNIEnv *env, jsize len);
+ jfloatArray (JNICALL *NewFloatArray)
+ (JNIEnv *env, jsize len);
+ jdoubleArray (JNICALL *NewDoubleArray)
+ (JNIEnv *env, jsize len);
+
+ jboolean * (JNICALL *GetBooleanArrayElements)
+ (JNIEnv *env, jbooleanArray array, jboolean *isCopy);
+ jbyte * (JNICALL *GetByteArrayElements)
+ (JNIEnv *env, jbyteArray array, jboolean *isCopy);
+ jchar * (JNICALL *GetCharArrayElements)
+ (JNIEnv *env, jcharArray array, jboolean *isCopy);
+ jshort * (JNICALL *GetShortArrayElements)
+ (JNIEnv *env, jshortArray array, jboolean *isCopy);
+ jint * (JNICALL *GetIntArrayElements)
+ (JNIEnv *env, jintArray array, jboolean *isCopy);
+ jlong * (JNICALL *GetLongArrayElements)
+ (JNIEnv *env, jlongArray array, jboolean *isCopy);
+ jfloat * (JNICALL *GetFloatArrayElements)
+ (JNIEnv *env, jfloatArray array, jboolean *isCopy);
+ jdouble * (JNICALL *GetDoubleArrayElements)
+ (JNIEnv *env, jdoubleArray array, jboolean *isCopy);
+
+ void (JNICALL *ReleaseBooleanArrayElements)
+ (JNIEnv *env, jbooleanArray array, jboolean *elems, jint mode);
+ void (JNICALL *ReleaseByteArrayElements)
+ (JNIEnv *env, jbyteArray array, jbyte *elems, jint mode);
+ void (JNICALL *ReleaseCharArrayElements)
+ (JNIEnv *env, jcharArray array, jchar *elems, jint mode);
+ void (JNICALL *ReleaseShortArrayElements)
+ (JNIEnv *env, jshortArray array, jshort *elems, jint mode);
+ void (JNICALL *ReleaseIntArrayElements)
+ (JNIEnv *env, jintArray array, jint *elems, jint mode);
+ void (JNICALL *ReleaseLongArrayElements)
+ (JNIEnv *env, jlongArray array, jlong *elems, jint mode);
+ void (JNICALL *ReleaseFloatArrayElements)
+ (JNIEnv *env, jfloatArray array, jfloat *elems, jint mode);
+ void (JNICALL *ReleaseDoubleArrayElements)
+ (JNIEnv *env, jdoubleArray array, jdouble *elems, jint mode);
+
+ void (JNICALL *GetBooleanArrayRegion)
+ (JNIEnv *env, jbooleanArray array, jsize start, jsize l, jboolean *buf);
+ void (JNICALL *GetByteArrayRegion)
+ (JNIEnv *env, jbyteArray array, jsize start, jsize len, jbyte *buf);
+ void (JNICALL *GetCharArrayRegion)
+ (JNIEnv *env, jcharArray array, jsize start, jsize len, jchar *buf);
+ void (JNICALL *GetShortArrayRegion)
+ (JNIEnv *env, jshortArray array, jsize start, jsize len, jshort *buf);
+ void (JNICALL *GetIntArrayRegion)
+ (JNIEnv *env, jintArray array, jsize start, jsize len, jint *buf);
+ void (JNICALL *GetLongArrayRegion)
+ (JNIEnv *env, jlongArray array, jsize start, jsize len, jlong *buf);
+ void (JNICALL *GetFloatArrayRegion)
+ (JNIEnv *env, jfloatArray array, jsize start, jsize len, jfloat *buf);
+ void (JNICALL *GetDoubleArrayRegion)
+ (JNIEnv *env, jdoubleArray array, jsize start, jsize len, jdouble *buf);
+
+ void (JNICALL *SetBooleanArrayRegion)
+ (JNIEnv *env, jbooleanArray array, jsize start, jsize l, const jboolean *buf);
+ void (JNICALL *SetByteArrayRegion)
+ (JNIEnv *env, jbyteArray array, jsize start, jsize len, const jbyte *buf);
+ void (JNICALL *SetCharArrayRegion)
+ (JNIEnv *env, jcharArray array, jsize start, jsize len, const jchar *buf);
+ void (JNICALL *SetShortArrayRegion)
+ (JNIEnv *env, jshortArray array, jsize start, jsize len, const jshort *buf);
+ void (JNICALL *SetIntArrayRegion)
+ (JNIEnv *env, jintArray array, jsize start, jsize len, const jint *buf);
+ void (JNICALL *SetLongArrayRegion)
+ (JNIEnv *env, jlongArray array, jsize start, jsize len, const jlong *buf);
+ void (JNICALL *SetFloatArrayRegion)
+ (JNIEnv *env, jfloatArray array, jsize start, jsize len, const jfloat *buf);
+ void (JNICALL *SetDoubleArrayRegion)
+ (JNIEnv *env, jdoubleArray array, jsize start, jsize len, const jdouble *buf);
+
+ jint (JNICALL *RegisterNatives)
+ (JNIEnv *env, jclass clazz, const JNINativeMethod *methods,
+ jint nMethods);
+ jint (JNICALL *UnregisterNatives)
+ (JNIEnv *env, jclass clazz);
+
+ jint (JNICALL *MonitorEnter)
+ (JNIEnv *env, jobject obj);
+ jint (JNICALL *MonitorExit)
+ (JNIEnv *env, jobject obj);
+
+ jint (JNICALL *GetJavaVM)
+ (JNIEnv *env, JavaVM **vm);
+
+ void (JNICALL *GetStringRegion)
+ (JNIEnv *env, jstring str, jsize start, jsize len, jchar *buf);
+ void (JNICALL *GetStringUTFRegion)
+ (JNIEnv *env, jstring str, jsize start, jsize len, char *buf);
+
+ void * (JNICALL *GetPrimitiveArrayCritical)
+ (JNIEnv *env, jarray array, jboolean *isCopy);
+ void (JNICALL *ReleasePrimitiveArrayCritical)
+ (JNIEnv *env, jarray array, void *carray, jint mode);
+
+ const jchar * (JNICALL *GetStringCritical)
+ (JNIEnv *env, jstring string, jboolean *isCopy);
+ void (JNICALL *ReleaseStringCritical)
+ (JNIEnv *env, jstring string, const jchar *cstring);
+
+ jweak (JNICALL *NewWeakGlobalRef)
+ (JNIEnv *env, jobject obj);
+ void (JNICALL *DeleteWeakGlobalRef)
+ (JNIEnv *env, jweak ref);
+
+ jboolean (JNICALL *ExceptionCheck)
+ (JNIEnv *env);
+
+ jobject (JNICALL *NewDirectByteBuffer)
+ (JNIEnv* env, void* address, jlong capacity);
+ void* (JNICALL *GetDirectBufferAddress)
+ (JNIEnv* env, jobject buf);
+ jlong (JNICALL *GetDirectBufferCapacity)
+ (JNIEnv* env, jobject buf);
+
+ /* New JNI 1.6 Features */
+
+ jobjectRefType (JNICALL *GetObjectRefType)
+ (JNIEnv* env, jobject obj);
+};
+
+/*
+ * We use inlined functions for C++ so that programmers can write:
+ *
+ * env->FindClass("java/lang/String")
+ *
+ * in C++ rather than:
+ *
+ * (*env)->FindClass(env, "java/lang/String")
+ *
+ * in C.
+ */
+
+struct JNIEnv_ {
+ const struct JNINativeInterface_ *functions;
+#ifdef __cplusplus
+
+ jint GetVersion() {
+ return functions->GetVersion(this);
+ }
+ jclass DefineClass(const char *name, jobject loader, const jbyte *buf,
+ jsize len) {
+ return functions->DefineClass(this, name, loader, buf, len);
+ }
+ jclass FindClass(const char *name) {
+ return functions->FindClass(this, name);
+ }
+ jmethodID FromReflectedMethod(jobject method) {
+ return functions->FromReflectedMethod(this,method);
+ }
+ jfieldID FromReflectedField(jobject field) {
+ return functions->FromReflectedField(this,field);
+ }
+
+ jobject ToReflectedMethod(jclass cls, jmethodID methodID, jboolean isStatic) {
+ return functions->ToReflectedMethod(this, cls, methodID, isStatic);
+ }
+
+ jclass GetSuperclass(jclass sub) {
+ return functions->GetSuperclass(this, sub);
+ }
+ jboolean IsAssignableFrom(jclass sub, jclass sup) {
+ return functions->IsAssignableFrom(this, sub, sup);
+ }
+
+ jobject ToReflectedField(jclass cls, jfieldID fieldID, jboolean isStatic) {
+ return functions->ToReflectedField(this,cls,fieldID,isStatic);
+ }
+
+ jint Throw(jthrowable obj) {
+ return functions->Throw(this, obj);
+ }
+ jint ThrowNew(jclass clazz, const char *msg) {
+ return functions->ThrowNew(this, clazz, msg);
+ }
+ jthrowable ExceptionOccurred() {
+ return functions->ExceptionOccurred(this);
+ }
+ void ExceptionDescribe() {
+ functions->ExceptionDescribe(this);
+ }
+ void ExceptionClear() {
+ functions->ExceptionClear(this);
+ }
+ void FatalError(const char *msg) {
+ functions->FatalError(this, msg);
+ }
+
+ jint PushLocalFrame(jint capacity) {
+ return functions->PushLocalFrame(this,capacity);
+ }
+ jobject PopLocalFrame(jobject result) {
+ return functions->PopLocalFrame(this,result);
+ }
+
+ jobject NewGlobalRef(jobject lobj) {
+ return functions->NewGlobalRef(this,lobj);
+ }
+ void DeleteGlobalRef(jobject gref) {
+ functions->DeleteGlobalRef(this,gref);
+ }
+ void DeleteLocalRef(jobject obj) {
+ functions->DeleteLocalRef(this, obj);
+ }
+
+ jboolean IsSameObject(jobject obj1, jobject obj2) {
+ return functions->IsSameObject(this,obj1,obj2);
+ }
+
+ jobject NewLocalRef(jobject ref) {
+ return functions->NewLocalRef(this,ref);
+ }
+ jint EnsureLocalCapacity(jint capacity) {
+ return functions->EnsureLocalCapacity(this,capacity);
+ }
+
+ jobject AllocObject(jclass clazz) {
+ return functions->AllocObject(this,clazz);
+ }
+ jobject NewObject(jclass clazz, jmethodID methodID, ...) {
+ va_list args;
+ jobject result;
+ va_start(args, methodID);
+ result = functions->NewObjectV(this,clazz,methodID,args);
+ va_end(args);
+ return result;
+ }
+ jobject NewObjectV(jclass clazz, jmethodID methodID,
+ va_list args) {
+ return functions->NewObjectV(this,clazz,methodID,args);
+ }
+ jobject NewObjectA(jclass clazz, jmethodID methodID,
+ const jvalue *args) {
+ return functions->NewObjectA(this,clazz,methodID,args);
+ }
+
+ jclass GetObjectClass(jobject obj) {
+ return functions->GetObjectClass(this,obj);
+ }
+ jboolean IsInstanceOf(jobject obj, jclass clazz) {
+ return functions->IsInstanceOf(this,obj,clazz);
+ }
+
+ jmethodID GetMethodID(jclass clazz, const char *name,
+ const char *sig) {
+ return functions->GetMethodID(this,clazz,name,sig);
+ }
+
+ jobject CallObjectMethod(jobject obj, jmethodID methodID, ...) {
+ va_list args;
+ jobject result;
+ va_start(args,methodID);
+ result = functions->CallObjectMethodV(this,obj,methodID,args);
+ va_end(args);
+ return result;
+ }
+ jobject CallObjectMethodV(jobject obj, jmethodID methodID,
+ va_list args) {
+ return functions->CallObjectMethodV(this,obj,methodID,args);
+ }
+ jobject CallObjectMethodA(jobject obj, jmethodID methodID,
+ const jvalue * args) {
+ return functions->CallObjectMethodA(this,obj,methodID,args);
+ }
+
+ jboolean CallBooleanMethod(jobject obj,
+ jmethodID methodID, ...) {
+ va_list args;
+ jboolean result;
+ va_start(args,methodID);
+ result = functions->CallBooleanMethodV(this,obj,methodID,args);
+ va_end(args);
+ return result;
+ }
+ jboolean CallBooleanMethodV(jobject obj, jmethodID methodID,
+ va_list args) {
+ return functions->CallBooleanMethodV(this,obj,methodID,args);
+ }
+ jboolean CallBooleanMethodA(jobject obj, jmethodID methodID,
+ const jvalue * args) {
+ return functions->CallBooleanMethodA(this,obj,methodID, args);
+ }
+
+ jbyte CallByteMethod(jobject obj, jmethodID methodID, ...) {
+ va_list args;
+ jbyte result;
+ va_start(args,methodID);
+ result = functions->CallByteMethodV(this,obj,methodID,args);
+ va_end(args);
+ return result;
+ }
+ jbyte CallByteMethodV(jobject obj, jmethodID methodID,
+ va_list args) {
+ return functions->CallByteMethodV(this,obj,methodID,args);
+ }
+ jbyte CallByteMethodA(jobject obj, jmethodID methodID,
+ const jvalue * args) {
+ return functions->CallByteMethodA(this,obj,methodID,args);
+ }
+
+ jchar CallCharMethod(jobject obj, jmethodID methodID, ...) {
+ va_list args;
+ jchar result;
+ va_start(args,methodID);
+ result = functions->CallCharMethodV(this,obj,methodID,args);
+ va_end(args);
+ return result;
+ }
+ jchar CallCharMethodV(jobject obj, jmethodID methodID,
+ va_list args) {
+ return functions->CallCharMethodV(this,obj,methodID,args);
+ }
+ jchar CallCharMethodA(jobject obj, jmethodID methodID,
+ const jvalue * args) {
+ return functions->CallCharMethodA(this,obj,methodID,args);
+ }
+
+ jshort CallShortMethod(jobject obj, jmethodID methodID, ...) {
+ va_list args;
+ jshort result;
+ va_start(args,methodID);
+ result = functions->CallShortMethodV(this,obj,methodID,args);
+ va_end(args);
+ return result;
+ }
+ jshort CallShortMethodV(jobject obj, jmethodID methodID,
+ va_list args) {
+ return functions->CallShortMethodV(this,obj,methodID,args);
+ }
+ jshort CallShortMethodA(jobject obj, jmethodID methodID,
+ const jvalue * args) {
+ return functions->CallShortMethodA(this,obj,methodID,args);
+ }
+
+ jint CallIntMethod(jobject obj, jmethodID methodID, ...) {
+ va_list args;
+ jint result;
+ va_start(args,methodID);
+ result = functions->CallIntMethodV(this,obj,methodID,args);
+ va_end(args);
+ return result;
+ }
+ jint CallIntMethodV(jobject obj, jmethodID methodID,
+ va_list args) {
+ return functions->CallIntMethodV(this,obj,methodID,args);
+ }
+ jint CallIntMethodA(jobject obj, jmethodID methodID,
+ const jvalue * args) {
+ return functions->CallIntMethodA(this,obj,methodID,args);
+ }
+
+ jlong CallLongMethod(jobject obj, jmethodID methodID, ...) {
+ va_list args;
+ jlong result;
+ va_start(args,methodID);
+ result = functions->CallLongMethodV(this,obj,methodID,args);
+ va_end(args);
+ return result;
+ }
+ jlong CallLongMethodV(jobject obj, jmethodID methodID,
+ va_list args) {
+ return functions->CallLongMethodV(this,obj,methodID,args);
+ }
+ jlong CallLongMethodA(jobject obj, jmethodID methodID,
+ const jvalue * args) {
+ return functions->CallLongMethodA(this,obj,methodID,args);
+ }
+
+ jfloat CallFloatMethod(jobject obj, jmethodID methodID, ...) {
+ va_list args;
+ jfloat result;
+ va_start(args,methodID);
+ result = functions->CallFloatMethodV(this,obj,methodID,args);
+ va_end(args);
+ return result;
+ }
+ jfloat CallFloatMethodV(jobject obj, jmethodID methodID,
+ va_list args) {
+ return functions->CallFloatMethodV(this,obj,methodID,args);
+ }
+ jfloat CallFloatMethodA(jobject obj, jmethodID methodID,
+ const jvalue * args) {
+ return functions->CallFloatMethodA(this,obj,methodID,args);
+ }
+
+ jdouble CallDoubleMethod(jobject obj, jmethodID methodID, ...) {
+ va_list args;
+ jdouble result;
+ va_start(args,methodID);
+ result = functions->CallDoubleMethodV(this,obj,methodID,args);
+ va_end(args);
+ return result;
+ }
+ jdouble CallDoubleMethodV(jobject obj, jmethodID methodID,
+ va_list args) {
+ return functions->CallDoubleMethodV(this,obj,methodID,args);
+ }
+ jdouble CallDoubleMethodA(jobject obj, jmethodID methodID,
+ const jvalue * args) {
+ return functions->CallDoubleMethodA(this,obj,methodID,args);
+ }
+
+ void CallVoidMethod(jobject obj, jmethodID methodID, ...) {
+ va_list args;
+ va_start(args,methodID);
+ functions->CallVoidMethodV(this,obj,methodID,args);
+ va_end(args);
+ }
+ void CallVoidMethodV(jobject obj, jmethodID methodID,
+ va_list args) {
+ functions->CallVoidMethodV(this,obj,methodID,args);
+ }
+ void CallVoidMethodA(jobject obj, jmethodID methodID,
+ const jvalue * args) {
+ functions->CallVoidMethodA(this,obj,methodID,args);
+ }
+
+ jobject CallNonvirtualObjectMethod(jobject obj, jclass clazz,
+ jmethodID methodID, ...) {
+ va_list args;
+ jobject result;
+ va_start(args,methodID);
+ result = functions->CallNonvirtualObjectMethodV(this,obj,clazz,
+ methodID,args);
+ va_end(args);
+ return result;
+ }
+ jobject CallNonvirtualObjectMethodV(jobject obj, jclass clazz,
+ jmethodID methodID, va_list args) {
+ return functions->CallNonvirtualObjectMethodV(this,obj,clazz,
+ methodID,args);
+ }
+ jobject CallNonvirtualObjectMethodA(jobject obj, jclass clazz,
+ jmethodID methodID, const jvalue * args) {
+ return functions->CallNonvirtualObjectMethodA(this,obj,clazz,
+ methodID,args);
+ }
+
+ jboolean CallNonvirtualBooleanMethod(jobject obj, jclass clazz,
+ jmethodID methodID, ...) {
+ va_list args;
+ jboolean result;
+ va_start(args,methodID);
+ result = functions->CallNonvirtualBooleanMethodV(this,obj,clazz,
+ methodID,args);
+ va_end(args);
+ return result;
+ }
+ jboolean CallNonvirtualBooleanMethodV(jobject obj, jclass clazz,
+ jmethodID methodID, va_list args) {
+ return functions->CallNonvirtualBooleanMethodV(this,obj,clazz,
+ methodID,args);
+ }
+ jboolean CallNonvirtualBooleanMethodA(jobject obj, jclass clazz,
+ jmethodID methodID, const jvalue * args) {
+ return functions->CallNonvirtualBooleanMethodA(this,obj,clazz,
+ methodID, args);
+ }
+
+ jbyte CallNonvirtualByteMethod(jobject obj, jclass clazz,
+ jmethodID methodID, ...) {
+ va_list args;
+ jbyte result;
+ va_start(args,methodID);
+ result = functions->CallNonvirtualByteMethodV(this,obj,clazz,
+ methodID,args);
+ va_end(args);
+ return result;
+ }
+ jbyte CallNonvirtualByteMethodV(jobject obj, jclass clazz,
+ jmethodID methodID, va_list args) {
+ return functions->CallNonvirtualByteMethodV(this,obj,clazz,
+ methodID,args);
+ }
+ jbyte CallNonvirtualByteMethodA(jobject obj, jclass clazz,
+ jmethodID methodID, const jvalue * args) {
+ return functions->CallNonvirtualByteMethodA(this,obj,clazz,
+ methodID,args);
+ }
+
+ jchar CallNonvirtualCharMethod(jobject obj, jclass clazz,
+ jmethodID methodID, ...) {
+ va_list args;
+ jchar result;
+ va_start(args,methodID);
+ result = functions->CallNonvirtualCharMethodV(this,obj,clazz,
+ methodID,args);
+ va_end(args);
+ return result;
+ }
+ jchar CallNonvirtualCharMethodV(jobject obj, jclass clazz,
+ jmethodID methodID, va_list args) {
+ return functions->CallNonvirtualCharMethodV(this,obj,clazz,
+ methodID,args);
+ }
+ jchar CallNonvirtualCharMethodA(jobject obj, jclass clazz,
+ jmethodID methodID, const jvalue * args) {
+ return functions->CallNonvirtualCharMethodA(this,obj,clazz,
+ methodID,args);
+ }
+
+ jshort CallNonvirtualShortMethod(jobject obj, jclass clazz,
+ jmethodID methodID, ...) {
+ va_list args;
+ jshort result;
+ va_start(args,methodID);
+ result = functions->CallNonvirtualShortMethodV(this,obj,clazz,
+ methodID,args);
+ va_end(args);
+ return result;
+ }
+ jshort CallNonvirtualShortMethodV(jobject obj, jclass clazz,
+ jmethodID methodID, va_list args) {
+ return functions->CallNonvirtualShortMethodV(this,obj,clazz,
+ methodID,args);
+ }
+ jshort CallNonvirtualShortMethodA(jobject obj, jclass clazz,
+ jmethodID methodID, const jvalue * args) {
+ return functions->CallNonvirtualShortMethodA(this,obj,clazz,
+ methodID,args);
+ }
+
+ jint CallNonvirtualIntMethod(jobject obj, jclass clazz,
+ jmethodID methodID, ...) {
+ va_list args;
+ jint result;
+ va_start(args,methodID);
+ result = functions->CallNonvirtualIntMethodV(this,obj,clazz,
+ methodID,args);
+ va_end(args);
+ return result;
+ }
+ jint CallNonvirtualIntMethodV(jobject obj, jclass clazz,
+ jmethodID methodID, va_list args) {
+ return functions->CallNonvirtualIntMethodV(this,obj,clazz,
+ methodID,args);
+ }
+ jint CallNonvirtualIntMethodA(jobject obj, jclass clazz,
+ jmethodID methodID, const jvalue * args) {
+ return functions->CallNonvirtualIntMethodA(this,obj,clazz,
+ methodID,args);
+ }
+
+ jlong CallNonvirtualLongMethod(jobject obj, jclass clazz,
+ jmethodID methodID, ...) {
+ va_list args;
+ jlong result;
+ va_start(args,methodID);
+ result = functions->CallNonvirtualLongMethodV(this,obj,clazz,
+ methodID,args);
+ va_end(args);
+ return result;
+ }
+ jlong CallNonvirtualLongMethodV(jobject obj, jclass clazz,
+ jmethodID methodID, va_list args) {
+ return functions->CallNonvirtualLongMethodV(this,obj,clazz,
+ methodID,args);
+ }
+ jlong CallNonvirtualLongMethodA(jobject obj, jclass clazz,
+ jmethodID methodID, const jvalue * args) {
+ return functions->CallNonvirtualLongMethodA(this,obj,clazz,
+ methodID,args);
+ }
+
+ jfloat CallNonvirtualFloatMethod(jobject obj, jclass clazz,
+ jmethodID methodID, ...) {
+ va_list args;
+ jfloat result;
+ va_start(args,methodID);
+ result = functions->CallNonvirtualFloatMethodV(this,obj,clazz,
+ methodID,args);
+ va_end(args);
+ return result;
+ }
+ jfloat CallNonvirtualFloatMethodV(jobject obj, jclass clazz,
+ jmethodID methodID,
+ va_list args) {
+ return functions->CallNonvirtualFloatMethodV(this,obj,clazz,
+ methodID,args);
+ }
+ jfloat CallNonvirtualFloatMethodA(jobject obj, jclass clazz,
+ jmethodID methodID,
+ const jvalue * args) {
+ return functions->CallNonvirtualFloatMethodA(this,obj,clazz,
+ methodID,args);
+ }
+
+ jdouble CallNonvirtualDoubleMethod(jobject obj, jclass clazz,
+ jmethodID methodID, ...) {
+ va_list args;
+ jdouble result;
+ va_start(args,methodID);
+ result = functions->CallNonvirtualDoubleMethodV(this,obj,clazz,
+ methodID,args);
+ va_end(args);
+ return result;
+ }
+ jdouble CallNonvirtualDoubleMethodV(jobject obj, jclass clazz,
+ jmethodID methodID,
+ va_list args) {
+ return functions->CallNonvirtualDoubleMethodV(this,obj,clazz,
+ methodID,args);
+ }
+ jdouble CallNonvirtualDoubleMethodA(jobject obj, jclass clazz,
+ jmethodID methodID,
+ const jvalue * args) {
+ return functions->CallNonvirtualDoubleMethodA(this,obj,clazz,
+ methodID,args);
+ }
+
+ void CallNonvirtualVoidMethod(jobject obj, jclass clazz,
+ jmethodID methodID, ...) {
+ va_list args;
+ va_start(args,methodID);
+ functions->CallNonvirtualVoidMethodV(this,obj,clazz,methodID,args);
+ va_end(args);
+ }
+ void CallNonvirtualVoidMethodV(jobject obj, jclass clazz,
+ jmethodID methodID,
+ va_list args) {
+ functions->CallNonvirtualVoidMethodV(this,obj,clazz,methodID,args);
+ }
+ void CallNonvirtualVoidMethodA(jobject obj, jclass clazz,
+ jmethodID methodID,
+ const jvalue * args) {
+ functions->CallNonvirtualVoidMethodA(this,obj,clazz,methodID,args);
+ }
+
+ jfieldID GetFieldID(jclass clazz, const char *name,
+ const char *sig) {
+ return functions->GetFieldID(this,clazz,name,sig);
+ }
+
+ jobject GetObjectField(jobject obj, jfieldID fieldID) {
+ return functions->GetObjectField(this,obj,fieldID);
+ }
+ jboolean GetBooleanField(jobject obj, jfieldID fieldID) {
+ return functions->GetBooleanField(this,obj,fieldID);
+ }
+ jbyte GetByteField(jobject obj, jfieldID fieldID) {
+ return functions->GetByteField(this,obj,fieldID);
+ }
+ jchar GetCharField(jobject obj, jfieldID fieldID) {
+ return functions->GetCharField(this,obj,fieldID);
+ }
+ jshort GetShortField(jobject obj, jfieldID fieldID) {
+ return functions->GetShortField(this,obj,fieldID);
+ }
+ jint GetIntField(jobject obj, jfieldID fieldID) {
+ return functions->GetIntField(this,obj,fieldID);
+ }
+ jlong GetLongField(jobject obj, jfieldID fieldID) {
+ return functions->GetLongField(this,obj,fieldID);
+ }
+ jfloat GetFloatField(jobject obj, jfieldID fieldID) {
+ return functions->GetFloatField(this,obj,fieldID);
+ }
+ jdouble GetDoubleField(jobject obj, jfieldID fieldID) {
+ return functions->GetDoubleField(this,obj,fieldID);
+ }
+
+ void SetObjectField(jobject obj, jfieldID fieldID, jobject val) {
+ functions->SetObjectField(this,obj,fieldID,val);
+ }
+ void SetBooleanField(jobject obj, jfieldID fieldID,
+ jboolean val) {
+ functions->SetBooleanField(this,obj,fieldID,val);
+ }
+ void SetByteField(jobject obj, jfieldID fieldID,
+ jbyte val) {
+ functions->SetByteField(this,obj,fieldID,val);
+ }
+ void SetCharField(jobject obj, jfieldID fieldID,
+ jchar val) {
+ functions->SetCharField(this,obj,fieldID,val);
+ }
+ void SetShortField(jobject obj, jfieldID fieldID,
+ jshort val) {
+ functions->SetShortField(this,obj,fieldID,val);
+ }
+ void SetIntField(jobject obj, jfieldID fieldID,
+ jint val) {
+ functions->SetIntField(this,obj,fieldID,val);
+ }
+ void SetLongField(jobject obj, jfieldID fieldID,
+ jlong val) {
+ functions->SetLongField(this,obj,fieldID,val);
+ }
+ void SetFloatField(jobject obj, jfieldID fieldID,
+ jfloat val) {
+ functions->SetFloatField(this,obj,fieldID,val);
+ }
+ void SetDoubleField(jobject obj, jfieldID fieldID,
+ jdouble val) {
+ functions->SetDoubleField(this,obj,fieldID,val);
+ }
+
+ jmethodID GetStaticMethodID(jclass clazz, const char *name,
+ const char *sig) {
+ return functions->GetStaticMethodID(this,clazz,name,sig);
+ }
+
+ jobject CallStaticObjectMethod(jclass clazz, jmethodID methodID,
+ ...) {
+ va_list args;
+ jobject result;
+ va_start(args,methodID);
+ result = functions->CallStaticObjectMethodV(this,clazz,methodID,args);
+ va_end(args);
+ return result;
+ }
+ jobject CallStaticObjectMethodV(jclass clazz, jmethodID methodID,
+ va_list args) {
+ return functions->CallStaticObjectMethodV(this,clazz,methodID,args);
+ }
+ jobject CallStaticObjectMethodA(jclass clazz, jmethodID methodID,
+ const jvalue *args) {
+ return functions->CallStaticObjectMethodA(this,clazz,methodID,args);
+ }
+
+ jboolean CallStaticBooleanMethod(jclass clazz,
+ jmethodID methodID, ...) {
+ va_list args;
+ jboolean result;
+ va_start(args,methodID);
+ result = functions->CallStaticBooleanMethodV(this,clazz,methodID,args);
+ va_end(args);
+ return result;
+ }
+ jboolean CallStaticBooleanMethodV(jclass clazz,
+ jmethodID methodID, va_list args) {
+ return functions->CallStaticBooleanMethodV(this,clazz,methodID,args);
+ }
+ jboolean CallStaticBooleanMethodA(jclass clazz,
+ jmethodID methodID, const jvalue *args) {
+ return functions->CallStaticBooleanMethodA(this,clazz,methodID,args);
+ }
+
+ jbyte CallStaticByteMethod(jclass clazz,
+ jmethodID methodID, ...) {
+ va_list args;
+ jbyte result;
+ va_start(args,methodID);
+ result = functions->CallStaticByteMethodV(this,clazz,methodID,args);
+ va_end(args);
+ return result;
+ }
+ jbyte CallStaticByteMethodV(jclass clazz,
+ jmethodID methodID, va_list args) {
+ return functions->CallStaticByteMethodV(this,clazz,methodID,args);
+ }
+ jbyte CallStaticByteMethodA(jclass clazz,
+ jmethodID methodID, const jvalue *args) {
+ return functions->CallStaticByteMethodA(this,clazz,methodID,args);
+ }
+
+ jchar CallStaticCharMethod(jclass clazz,
+ jmethodID methodID, ...) {
+ va_list args;
+ jchar result;
+ va_start(args,methodID);
+ result = functions->CallStaticCharMethodV(this,clazz,methodID,args);
+ va_end(args);
+ return result;
+ }
+ jchar CallStaticCharMethodV(jclass clazz,
+ jmethodID methodID, va_list args) {
+ return functions->CallStaticCharMethodV(this,clazz,methodID,args);
+ }
+ jchar CallStaticCharMethodA(jclass clazz,
+ jmethodID methodID, const jvalue *args) {
+ return functions->CallStaticCharMethodA(this,clazz,methodID,args);
+ }
+
+ jshort CallStaticShortMethod(jclass clazz,
+ jmethodID methodID, ...) {
+ va_list args;
+ jshort result;
+ va_start(args,methodID);
+ result = functions->CallStaticShortMethodV(this,clazz,methodID,args);
+ va_end(args);
+ return result;
+ }
+ jshort CallStaticShortMethodV(jclass clazz,
+ jmethodID methodID, va_list args) {
+ return functions->CallStaticShortMethodV(this,clazz,methodID,args);
+ }
+ jshort CallStaticShortMethodA(jclass clazz,
+ jmethodID methodID, const jvalue *args) {
+ return functions->CallStaticShortMethodA(this,clazz,methodID,args);
+ }
+
+ jint CallStaticIntMethod(jclass clazz,
+ jmethodID methodID, ...) {
+ va_list args;
+ jint result;
+ va_start(args,methodID);
+ result = functions->CallStaticIntMethodV(this,clazz,methodID,args);
+ va_end(args);
+ return result;
+ }
+ jint CallStaticIntMethodV(jclass clazz,
+ jmethodID methodID, va_list args) {
+ return functions->CallStaticIntMethodV(this,clazz,methodID,args);
+ }
+ jint CallStaticIntMethodA(jclass clazz,
+ jmethodID methodID, const jvalue *args) {
+ return functions->CallStaticIntMethodA(this,clazz,methodID,args);
+ }
+
+ jlong CallStaticLongMethod(jclass clazz,
+ jmethodID methodID, ...) {
+ va_list args;
+ jlong result;
+ va_start(args,methodID);
+ result = functions->CallStaticLongMethodV(this,clazz,methodID,args);
+ va_end(args);
+ return result;
+ }
+ jlong CallStaticLongMethodV(jclass clazz,
+ jmethodID methodID, va_list args) {
+ return functions->CallStaticLongMethodV(this,clazz,methodID,args);
+ }
+ jlong CallStaticLongMethodA(jclass clazz,
+ jmethodID methodID, const jvalue *args) {
+ return functions->CallStaticLongMethodA(this,clazz,methodID,args);
+ }
+
+ jfloat CallStaticFloatMethod(jclass clazz,
+ jmethodID methodID, ...) {
+ va_list args;
+ jfloat result;
+ va_start(args,methodID);
+ result = functions->CallStaticFloatMethodV(this,clazz,methodID,args);
+ va_end(args);
+ return result;
+ }
+ jfloat CallStaticFloatMethodV(jclass clazz,
+ jmethodID methodID, va_list args) {
+ return functions->CallStaticFloatMethodV(this,clazz,methodID,args);
+ }
+ jfloat CallStaticFloatMethodA(jclass clazz,
+ jmethodID methodID, const jvalue *args) {
+ return functions->CallStaticFloatMethodA(this,clazz,methodID,args);
+ }
+
+ jdouble CallStaticDoubleMethod(jclass clazz,
+ jmethodID methodID, ...) {
+ va_list args;
+ jdouble result;
+ va_start(args,methodID);
+ result = functions->CallStaticDoubleMethodV(this,clazz,methodID,args);
+ va_end(args);
+ return result;
+ }
+ jdouble CallStaticDoubleMethodV(jclass clazz,
+ jmethodID methodID, va_list args) {
+ return functions->CallStaticDoubleMethodV(this,clazz,methodID,args);
+ }
+ jdouble CallStaticDoubleMethodA(jclass clazz,
+ jmethodID methodID, const jvalue *args) {
+ return functions->CallStaticDoubleMethodA(this,clazz,methodID,args);
+ }
+
+ void CallStaticVoidMethod(jclass cls, jmethodID methodID, ...) {
+ va_list args;
+ va_start(args,methodID);
+ functions->CallStaticVoidMethodV(this,cls,methodID,args);
+ va_end(args);
+ }
+ void CallStaticVoidMethodV(jclass cls, jmethodID methodID,
+ va_list args) {
+ functions->CallStaticVoidMethodV(this,cls,methodID,args);
+ }
+ void CallStaticVoidMethodA(jclass cls, jmethodID methodID,
+ const jvalue * args) {
+ functions->CallStaticVoidMethodA(this,cls,methodID,args);
+ }
+
+ jfieldID GetStaticFieldID(jclass clazz, const char *name,
+ const char *sig) {
+ return functions->GetStaticFieldID(this,clazz,name,sig);
+ }
+ jobject GetStaticObjectField(jclass clazz, jfieldID fieldID) {
+ return functions->GetStaticObjectField(this,clazz,fieldID);
+ }
+ jboolean GetStaticBooleanField(jclass clazz, jfieldID fieldID) {
+ return functions->GetStaticBooleanField(this,clazz,fieldID);
+ }
+ jbyte GetStaticByteField(jclass clazz, jfieldID fieldID) {
+ return functions->GetStaticByteField(this,clazz,fieldID);
+ }
+ jchar GetStaticCharField(jclass clazz, jfieldID fieldID) {
+ return functions->GetStaticCharField(this,clazz,fieldID);
+ }
+ jshort GetStaticShortField(jclass clazz, jfieldID fieldID) {
+ return functions->GetStaticShortField(this,clazz,fieldID);
+ }
+ jint GetStaticIntField(jclass clazz, jfieldID fieldID) {
+ return functions->GetStaticIntField(this,clazz,fieldID);
+ }
+ jlong GetStaticLongField(jclass clazz, jfieldID fieldID) {
+ return functions->GetStaticLongField(this,clazz,fieldID);
+ }
+ jfloat GetStaticFloatField(jclass clazz, jfieldID fieldID) {
+ return functions->GetStaticFloatField(this,clazz,fieldID);
+ }
+ jdouble GetStaticDoubleField(jclass clazz, jfieldID fieldID) {
+ return functions->GetStaticDoubleField(this,clazz,fieldID);
+ }
+
+ void SetStaticObjectField(jclass clazz, jfieldID fieldID,
+ jobject value) {
+ functions->SetStaticObjectField(this,clazz,fieldID,value);
+ }
+ void SetStaticBooleanField(jclass clazz, jfieldID fieldID,
+ jboolean value) {
+ functions->SetStaticBooleanField(this,clazz,fieldID,value);
+ }
+ void SetStaticByteField(jclass clazz, jfieldID fieldID,
+ jbyte value) {
+ functions->SetStaticByteField(this,clazz,fieldID,value);
+ }
+ void SetStaticCharField(jclass clazz, jfieldID fieldID,
+ jchar value) {
+ functions->SetStaticCharField(this,clazz,fieldID,value);
+ }
+ void SetStaticShortField(jclass clazz, jfieldID fieldID,
+ jshort value) {
+ functions->SetStaticShortField(this,clazz,fieldID,value);
+ }
+ void SetStaticIntField(jclass clazz, jfieldID fieldID,
+ jint value) {
+ functions->SetStaticIntField(this,clazz,fieldID,value);
+ }
+ void SetStaticLongField(jclass clazz, jfieldID fieldID,
+ jlong value) {
+ functions->SetStaticLongField(this,clazz,fieldID,value);
+ }
+ void SetStaticFloatField(jclass clazz, jfieldID fieldID,
+ jfloat value) {
+ functions->SetStaticFloatField(this,clazz,fieldID,value);
+ }
+ void SetStaticDoubleField(jclass clazz, jfieldID fieldID,
+ jdouble value) {
+ functions->SetStaticDoubleField(this,clazz,fieldID,value);
+ }
+
+ jstring NewString(const jchar *unicode, jsize len) {
+ return functions->NewString(this,unicode,len);
+ }
+ jsize GetStringLength(jstring str) {
+ return functions->GetStringLength(this,str);
+ }
+ const jchar *GetStringChars(jstring str, jboolean *isCopy) {
+ return functions->GetStringChars(this,str,isCopy);
+ }
+ void ReleaseStringChars(jstring str, const jchar *chars) {
+ functions->ReleaseStringChars(this,str,chars);
+ }
+
+ jstring NewStringUTF(const char *utf) {
+ return functions->NewStringUTF(this,utf);
+ }
+ jsize GetStringUTFLength(jstring str) {
+ return functions->GetStringUTFLength(this,str);
+ }
+ const char* GetStringUTFChars(jstring str, jboolean *isCopy) {
+ return functions->GetStringUTFChars(this,str,isCopy);
+ }
+ void ReleaseStringUTFChars(jstring str, const char* chars) {
+ functions->ReleaseStringUTFChars(this,str,chars);
+ }
+
+ jsize GetArrayLength(jarray array) {
+ return functions->GetArrayLength(this,array);
+ }
+
+ jobjectArray NewObjectArray(jsize len, jclass clazz,
+ jobject init) {
+ return functions->NewObjectArray(this,len,clazz,init);
+ }
+ jobject GetObjectArrayElement(jobjectArray array, jsize index) {
+ return functions->GetObjectArrayElement(this,array,index);
+ }
+ void SetObjectArrayElement(jobjectArray array, jsize index,
+ jobject val) {
+ functions->SetObjectArrayElement(this,array,index,val);
+ }
+
+ jbooleanArray NewBooleanArray(jsize len) {
+ return functions->NewBooleanArray(this,len);
+ }
+ jbyteArray NewByteArray(jsize len) {
+ return functions->NewByteArray(this,len);
+ }
+ jcharArray NewCharArray(jsize len) {
+ return functions->NewCharArray(this,len);
+ }
+ jshortArray NewShortArray(jsize len) {
+ return functions->NewShortArray(this,len);
+ }
+ jintArray NewIntArray(jsize len) {
+ return functions->NewIntArray(this,len);
+ }
+ jlongArray NewLongArray(jsize len) {
+ return functions->NewLongArray(this,len);
+ }
+ jfloatArray NewFloatArray(jsize len) {
+ return functions->NewFloatArray(this,len);
+ }
+ jdoubleArray NewDoubleArray(jsize len) {
+ return functions->NewDoubleArray(this,len);
+ }
+
+ jboolean * GetBooleanArrayElements(jbooleanArray array, jboolean *isCopy) {
+ return functions->GetBooleanArrayElements(this,array,isCopy);
+ }
+ jbyte * GetByteArrayElements(jbyteArray array, jboolean *isCopy) {
+ return functions->GetByteArrayElements(this,array,isCopy);
+ }
+ jchar * GetCharArrayElements(jcharArray array, jboolean *isCopy) {
+ return functions->GetCharArrayElements(this,array,isCopy);
+ }
+ jshort * GetShortArrayElements(jshortArray array, jboolean *isCopy) {
+ return functions->GetShortArrayElements(this,array,isCopy);
+ }
+ jint * GetIntArrayElements(jintArray array, jboolean *isCopy) {
+ return functions->GetIntArrayElements(this,array,isCopy);
+ }
+ jlong * GetLongArrayElements(jlongArray array, jboolean *isCopy) {
+ return functions->GetLongArrayElements(this,array,isCopy);
+ }
+ jfloat * GetFloatArrayElements(jfloatArray array, jboolean *isCopy) {
+ return functions->GetFloatArrayElements(this,array,isCopy);
+ }
+ jdouble * GetDoubleArrayElements(jdoubleArray array, jboolean *isCopy) {
+ return functions->GetDoubleArrayElements(this,array,isCopy);
+ }
+
+ void ReleaseBooleanArrayElements(jbooleanArray array,
+ jboolean *elems,
+ jint mode) {
+ functions->ReleaseBooleanArrayElements(this,array,elems,mode);
+ }
+ void ReleaseByteArrayElements(jbyteArray array,
+ jbyte *elems,
+ jint mode) {
+ functions->ReleaseByteArrayElements(this,array,elems,mode);
+ }
+ void ReleaseCharArrayElements(jcharArray array,
+ jchar *elems,
+ jint mode) {
+ functions->ReleaseCharArrayElements(this,array,elems,mode);
+ }
+ void ReleaseShortArrayElements(jshortArray array,
+ jshort *elems,
+ jint mode) {
+ functions->ReleaseShortArrayElements(this,array,elems,mode);
+ }
+ void ReleaseIntArrayElements(jintArray array,
+ jint *elems,
+ jint mode) {
+ functions->ReleaseIntArrayElements(this,array,elems,mode);
+ }
+ void ReleaseLongArrayElements(jlongArray array,
+ jlong *elems,
+ jint mode) {
+ functions->ReleaseLongArrayElements(this,array,elems,mode);
+ }
+ void ReleaseFloatArrayElements(jfloatArray array,
+ jfloat *elems,
+ jint mode) {
+ functions->ReleaseFloatArrayElements(this,array,elems,mode);
+ }
+ void ReleaseDoubleArrayElements(jdoubleArray array,
+ jdouble *elems,
+ jint mode) {
+ functions->ReleaseDoubleArrayElements(this,array,elems,mode);
+ }
+
+ void GetBooleanArrayRegion(jbooleanArray array,
+ jsize start, jsize len, jboolean *buf) {
+ functions->GetBooleanArrayRegion(this,array,start,len,buf);
+ }
+ void GetByteArrayRegion(jbyteArray array,
+ jsize start, jsize len, jbyte *buf) {
+ functions->GetByteArrayRegion(this,array,start,len,buf);
+ }
+ void GetCharArrayRegion(jcharArray array,
+ jsize start, jsize len, jchar *buf) {
+ functions->GetCharArrayRegion(this,array,start,len,buf);
+ }
+ void GetShortArrayRegion(jshortArray array,
+ jsize start, jsize len, jshort *buf) {
+ functions->GetShortArrayRegion(this,array,start,len,buf);
+ }
+ void GetIntArrayRegion(jintArray array,
+ jsize start, jsize len, jint *buf) {
+ functions->GetIntArrayRegion(this,array,start,len,buf);
+ }
+ void GetLongArrayRegion(jlongArray array,
+ jsize start, jsize len, jlong *buf) {
+ functions->GetLongArrayRegion(this,array,start,len,buf);
+ }
+ void GetFloatArrayRegion(jfloatArray array,
+ jsize start, jsize len, jfloat *buf) {
+ functions->GetFloatArrayRegion(this,array,start,len,buf);
+ }
+ void GetDoubleArrayRegion(jdoubleArray array,
+ jsize start, jsize len, jdouble *buf) {
+ functions->GetDoubleArrayRegion(this,array,start,len,buf);
+ }
+
+ void SetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len,
+ const jboolean *buf) {
+ functions->SetBooleanArrayRegion(this,array,start,len,buf);
+ }
+ void SetByteArrayRegion(jbyteArray array, jsize start, jsize len,
+ const jbyte *buf) {
+ functions->SetByteArrayRegion(this,array,start,len,buf);
+ }
+ void SetCharArrayRegion(jcharArray array, jsize start, jsize len,
+ const jchar *buf) {
+ functions->SetCharArrayRegion(this,array,start,len,buf);
+ }
+ void SetShortArrayRegion(jshortArray array, jsize start, jsize len,
+ const jshort *buf) {
+ functions->SetShortArrayRegion(this,array,start,len,buf);
+ }
+ void SetIntArrayRegion(jintArray array, jsize start, jsize len,
+ const jint *buf) {
+ functions->SetIntArrayRegion(this,array,start,len,buf);
+ }
+ void SetLongArrayRegion(jlongArray array, jsize start, jsize len,
+ const jlong *buf) {
+ functions->SetLongArrayRegion(this,array,start,len,buf);
+ }
+ void SetFloatArrayRegion(jfloatArray array, jsize start, jsize len,
+ const jfloat *buf) {
+ functions->SetFloatArrayRegion(this,array,start,len,buf);
+ }
+ void SetDoubleArrayRegion(jdoubleArray array, jsize start, jsize len,
+ const jdouble *buf) {
+ functions->SetDoubleArrayRegion(this,array,start,len,buf);
+ }
+
+ jint RegisterNatives(jclass clazz, const JNINativeMethod *methods,
+ jint nMethods) {
+ return functions->RegisterNatives(this,clazz,methods,nMethods);
+ }
+ jint UnregisterNatives(jclass clazz) {
+ return functions->UnregisterNatives(this,clazz);
+ }
+
+ jint MonitorEnter(jobject obj) {
+ return functions->MonitorEnter(this,obj);
+ }
+ jint MonitorExit(jobject obj) {
+ return functions->MonitorExit(this,obj);
+ }
+
+ jint GetJavaVM(JavaVM **vm) {
+ return functions->GetJavaVM(this,vm);
+ }
+
+ void GetStringRegion(jstring str, jsize start, jsize len, jchar *buf) {
+ functions->GetStringRegion(this,str,start,len,buf);
+ }
+ void GetStringUTFRegion(jstring str, jsize start, jsize len, char *buf) {
+ functions->GetStringUTFRegion(this,str,start,len,buf);
+ }
+
+ void * GetPrimitiveArrayCritical(jarray array, jboolean *isCopy) {
+ return functions->GetPrimitiveArrayCritical(this,array,isCopy);
+ }
+ void ReleasePrimitiveArrayCritical(jarray array, void *carray, jint mode) {
+ functions->ReleasePrimitiveArrayCritical(this,array,carray,mode);
+ }
+
+ const jchar * GetStringCritical(jstring string, jboolean *isCopy) {
+ return functions->GetStringCritical(this,string,isCopy);
+ }
+ void ReleaseStringCritical(jstring string, const jchar *cstring) {
+ functions->ReleaseStringCritical(this,string,cstring);
+ }
+
+ jweak NewWeakGlobalRef(jobject obj) {
+ return functions->NewWeakGlobalRef(this,obj);
+ }
+ void DeleteWeakGlobalRef(jweak ref) {
+ functions->DeleteWeakGlobalRef(this,ref);
+ }
+
+ jboolean ExceptionCheck() {
+ return functions->ExceptionCheck(this);
+ }
+
+ jobject NewDirectByteBuffer(void* address, jlong capacity) {
+ return functions->NewDirectByteBuffer(this, address, capacity);
+ }
+ void* GetDirectBufferAddress(jobject buf) {
+ return functions->GetDirectBufferAddress(this, buf);
+ }
+ jlong GetDirectBufferCapacity(jobject buf) {
+ return functions->GetDirectBufferCapacity(this, buf);
+ }
+ jobjectRefType GetObjectRefType(jobject obj) {
+ return functions->GetObjectRefType(this, obj);
+ }
+
+#endif /* __cplusplus */
+};
+
+typedef struct JavaVMOption {
+ char *optionString;
+ void *extraInfo;
+} JavaVMOption;
+
+typedef struct JavaVMInitArgs {
+ jint version;
+
+ jint nOptions;
+ JavaVMOption *options;
+ jboolean ignoreUnrecognized;
+} JavaVMInitArgs;
+
+typedef struct JavaVMAttachArgs {
+ jint version;
+
+ char *name;
+ jobject group;
+} JavaVMAttachArgs;
+
+/* These will be VM-specific. */
+
+#define JDK1_2
+#define JDK1_4
+
+/* End VM-specific. */
+
+struct JNIInvokeInterface_ {
+ void *reserved0;
+ void *reserved1;
+ void *reserved2;
+
+ jint (JNICALL *DestroyJavaVM)(JavaVM *vm);
+
+ jint (JNICALL *AttachCurrentThread)(JavaVM *vm, void **penv, void *args);
+
+ jint (JNICALL *DetachCurrentThread)(JavaVM *vm);
+
+ jint (JNICALL *GetEnv)(JavaVM *vm, void **penv, jint version);
+
+ jint (JNICALL *AttachCurrentThreadAsDaemon)(JavaVM *vm, void **penv, void *args);
+};
+
+struct JavaVM_ {
+ const struct JNIInvokeInterface_ *functions;
+#ifdef __cplusplus
+
+ jint DestroyJavaVM() {
+ return functions->DestroyJavaVM(this);
+ }
+ jint AttachCurrentThread(void **penv, void *args) {
+ return functions->AttachCurrentThread(this, penv, args);
+ }
+ jint DetachCurrentThread() {
+ return functions->DetachCurrentThread(this);
+ }
+
+ jint GetEnv(void **penv, jint version) {
+ return functions->GetEnv(this, penv, version);
+ }
+ jint AttachCurrentThreadAsDaemon(void **penv, void *args) {
+ return functions->AttachCurrentThreadAsDaemon(this, penv, args);
+ }
+#endif
+};
+
+#ifdef _JNI_IMPLEMENTATION_
+#define _JNI_IMPORT_OR_EXPORT_ JNIEXPORT
+#else
+#define _JNI_IMPORT_OR_EXPORT_ JNIIMPORT
+#endif
+_JNI_IMPORT_OR_EXPORT_ jint JNICALL
+JNI_GetDefaultJavaVMInitArgs(void *args);
+
+_JNI_IMPORT_OR_EXPORT_ jint JNICALL
+JNI_CreateJavaVM(JavaVM **pvm, void **penv, void *args);
+
+_JNI_IMPORT_OR_EXPORT_ jint JNICALL
+JNI_GetCreatedJavaVMs(JavaVM **, jsize, jsize *);
+
+/* Defined by native libraries. */
+JNIEXPORT jint JNICALL
+JNI_OnLoad(JavaVM *vm, void *reserved);
+
+JNIEXPORT void JNICALL
+JNI_OnUnload(JavaVM *vm, void *reserved);
+
+#define JNI_VERSION_1_1 0x00010001
+#define JNI_VERSION_1_2 0x00010002
+#define JNI_VERSION_1_4 0x00010004
+#define JNI_VERSION_1_6 0x00010006
+#define JNI_VERSION_1_8 0x00010008
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif /* __cplusplus */
+
+#endif /* !_JAVASOFT_JNI_H_ */
diff --git a/love2dToAPK/tools/tools/jdk-win/include/jvmti.h b/love2dToAPK/tools/tools/jdk-win/include/jvmti.h
new file mode 100644
index 0000000..74243f5
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/include/jvmti.h
@@ -0,0 +1,2534 @@
+/*
+ * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ */
+
+ /* AUTOMATICALLY GENERATED FILE - DO NOT EDIT */
+
+
+ /* Include file for the Java(tm) Virtual Machine Tool Interface */
+
+#ifndef _JAVA_JVMTI_H_
+#define _JAVA_JVMTI_H_
+
+#include "jni.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum {
+ JVMTI_VERSION_1 = 0x30010000,
+ JVMTI_VERSION_1_0 = 0x30010000,
+ JVMTI_VERSION_1_1 = 0x30010100,
+ JVMTI_VERSION_1_2 = 0x30010200,
+
+ JVMTI_VERSION = 0x30000000 + (1 * 0x10000) + (2 * 0x100) + 1 /* version: 1.2.1 */
+};
+
+JNIEXPORT jint JNICALL
+Agent_OnLoad(JavaVM *vm, char *options, void *reserved);
+
+JNIEXPORT jint JNICALL
+Agent_OnAttach(JavaVM* vm, char* options, void* reserved);
+
+JNIEXPORT void JNICALL
+Agent_OnUnload(JavaVM *vm);
+
+ /* Forward declaration of the environment */
+
+struct _jvmtiEnv;
+
+struct jvmtiInterface_1_;
+
+#ifdef __cplusplus
+typedef _jvmtiEnv jvmtiEnv;
+#else
+typedef const struct jvmtiInterface_1_ *jvmtiEnv;
+#endif /* __cplusplus */
+
+/* Derived Base Types */
+
+typedef jobject jthread;
+typedef jobject jthreadGroup;
+typedef jlong jlocation;
+struct _jrawMonitorID;
+typedef struct _jrawMonitorID *jrawMonitorID;
+typedef struct JNINativeInterface_ jniNativeInterface;
+
+ /* Constants */
+
+
+ /* Thread State Flags */
+
+enum {
+ JVMTI_THREAD_STATE_ALIVE = 0x0001,
+ JVMTI_THREAD_STATE_TERMINATED = 0x0002,
+ JVMTI_THREAD_STATE_RUNNABLE = 0x0004,
+ JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER = 0x0400,
+ JVMTI_THREAD_STATE_WAITING = 0x0080,
+ JVMTI_THREAD_STATE_WAITING_INDEFINITELY = 0x0010,
+ JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT = 0x0020,
+ JVMTI_THREAD_STATE_SLEEPING = 0x0040,
+ JVMTI_THREAD_STATE_IN_OBJECT_WAIT = 0x0100,
+ JVMTI_THREAD_STATE_PARKED = 0x0200,
+ JVMTI_THREAD_STATE_SUSPENDED = 0x100000,
+ JVMTI_THREAD_STATE_INTERRUPTED = 0x200000,
+ JVMTI_THREAD_STATE_IN_NATIVE = 0x400000,
+ JVMTI_THREAD_STATE_VENDOR_1 = 0x10000000,
+ JVMTI_THREAD_STATE_VENDOR_2 = 0x20000000,
+ JVMTI_THREAD_STATE_VENDOR_3 = 0x40000000
+};
+
+ /* java.lang.Thread.State Conversion Masks */
+
+enum {
+ JVMTI_JAVA_LANG_THREAD_STATE_MASK = JVMTI_THREAD_STATE_TERMINATED | JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_RUNNABLE | JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_INDEFINITELY | JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT,
+ JVMTI_JAVA_LANG_THREAD_STATE_NEW = 0,
+ JVMTI_JAVA_LANG_THREAD_STATE_TERMINATED = JVMTI_THREAD_STATE_TERMINATED,
+ JVMTI_JAVA_LANG_THREAD_STATE_RUNNABLE = JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_RUNNABLE,
+ JVMTI_JAVA_LANG_THREAD_STATE_BLOCKED = JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER,
+ JVMTI_JAVA_LANG_THREAD_STATE_WAITING = JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_INDEFINITELY,
+ JVMTI_JAVA_LANG_THREAD_STATE_TIMED_WAITING = JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT
+};
+
+ /* Thread Priority Constants */
+
+enum {
+ JVMTI_THREAD_MIN_PRIORITY = 1,
+ JVMTI_THREAD_NORM_PRIORITY = 5,
+ JVMTI_THREAD_MAX_PRIORITY = 10
+};
+
+ /* Heap Filter Flags */
+
+enum {
+ JVMTI_HEAP_FILTER_TAGGED = 0x4,
+ JVMTI_HEAP_FILTER_UNTAGGED = 0x8,
+ JVMTI_HEAP_FILTER_CLASS_TAGGED = 0x10,
+ JVMTI_HEAP_FILTER_CLASS_UNTAGGED = 0x20
+};
+
+ /* Heap Visit Control Flags */
+
+enum {
+ JVMTI_VISIT_OBJECTS = 0x100,
+ JVMTI_VISIT_ABORT = 0x8000
+};
+
+ /* Heap Reference Enumeration */
+
+typedef enum {
+ JVMTI_HEAP_REFERENCE_CLASS = 1,
+ JVMTI_HEAP_REFERENCE_FIELD = 2,
+ JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT = 3,
+ JVMTI_HEAP_REFERENCE_CLASS_LOADER = 4,
+ JVMTI_HEAP_REFERENCE_SIGNERS = 5,
+ JVMTI_HEAP_REFERENCE_PROTECTION_DOMAIN = 6,
+ JVMTI_HEAP_REFERENCE_INTERFACE = 7,
+ JVMTI_HEAP_REFERENCE_STATIC_FIELD = 8,
+ JVMTI_HEAP_REFERENCE_CONSTANT_POOL = 9,
+ JVMTI_HEAP_REFERENCE_SUPERCLASS = 10,
+ JVMTI_HEAP_REFERENCE_JNI_GLOBAL = 21,
+ JVMTI_HEAP_REFERENCE_SYSTEM_CLASS = 22,
+ JVMTI_HEAP_REFERENCE_MONITOR = 23,
+ JVMTI_HEAP_REFERENCE_STACK_LOCAL = 24,
+ JVMTI_HEAP_REFERENCE_JNI_LOCAL = 25,
+ JVMTI_HEAP_REFERENCE_THREAD = 26,
+ JVMTI_HEAP_REFERENCE_OTHER = 27
+} jvmtiHeapReferenceKind;
+
+ /* Primitive Type Enumeration */
+
+typedef enum {
+ JVMTI_PRIMITIVE_TYPE_BOOLEAN = 90,
+ JVMTI_PRIMITIVE_TYPE_BYTE = 66,
+ JVMTI_PRIMITIVE_TYPE_CHAR = 67,
+ JVMTI_PRIMITIVE_TYPE_SHORT = 83,
+ JVMTI_PRIMITIVE_TYPE_INT = 73,
+ JVMTI_PRIMITIVE_TYPE_LONG = 74,
+ JVMTI_PRIMITIVE_TYPE_FLOAT = 70,
+ JVMTI_PRIMITIVE_TYPE_DOUBLE = 68
+} jvmtiPrimitiveType;
+
+ /* Heap Object Filter Enumeration */
+
+typedef enum {
+ JVMTI_HEAP_OBJECT_TAGGED = 1,
+ JVMTI_HEAP_OBJECT_UNTAGGED = 2,
+ JVMTI_HEAP_OBJECT_EITHER = 3
+} jvmtiHeapObjectFilter;
+
+ /* Heap Root Kind Enumeration */
+
+typedef enum {
+ JVMTI_HEAP_ROOT_JNI_GLOBAL = 1,
+ JVMTI_HEAP_ROOT_SYSTEM_CLASS = 2,
+ JVMTI_HEAP_ROOT_MONITOR = 3,
+ JVMTI_HEAP_ROOT_STACK_LOCAL = 4,
+ JVMTI_HEAP_ROOT_JNI_LOCAL = 5,
+ JVMTI_HEAP_ROOT_THREAD = 6,
+ JVMTI_HEAP_ROOT_OTHER = 7
+} jvmtiHeapRootKind;
+
+ /* Object Reference Enumeration */
+
+typedef enum {
+ JVMTI_REFERENCE_CLASS = 1,
+ JVMTI_REFERENCE_FIELD = 2,
+ JVMTI_REFERENCE_ARRAY_ELEMENT = 3,
+ JVMTI_REFERENCE_CLASS_LOADER = 4,
+ JVMTI_REFERENCE_SIGNERS = 5,
+ JVMTI_REFERENCE_PROTECTION_DOMAIN = 6,
+ JVMTI_REFERENCE_INTERFACE = 7,
+ JVMTI_REFERENCE_STATIC_FIELD = 8,
+ JVMTI_REFERENCE_CONSTANT_POOL = 9
+} jvmtiObjectReferenceKind;
+
+ /* Iteration Control Enumeration */
+
+typedef enum {
+ JVMTI_ITERATION_CONTINUE = 1,
+ JVMTI_ITERATION_IGNORE = 2,
+ JVMTI_ITERATION_ABORT = 0
+} jvmtiIterationControl;
+
+ /* Class Status Flags */
+
+enum {
+ JVMTI_CLASS_STATUS_VERIFIED = 1,
+ JVMTI_CLASS_STATUS_PREPARED = 2,
+ JVMTI_CLASS_STATUS_INITIALIZED = 4,
+ JVMTI_CLASS_STATUS_ERROR = 8,
+ JVMTI_CLASS_STATUS_ARRAY = 16,
+ JVMTI_CLASS_STATUS_PRIMITIVE = 32
+};
+
+ /* Event Enable/Disable */
+
+typedef enum {
+ JVMTI_ENABLE = 1,
+ JVMTI_DISABLE = 0
+} jvmtiEventMode;
+
+ /* Extension Function/Event Parameter Types */
+
+typedef enum {
+ JVMTI_TYPE_JBYTE = 101,
+ JVMTI_TYPE_JCHAR = 102,
+ JVMTI_TYPE_JSHORT = 103,
+ JVMTI_TYPE_JINT = 104,
+ JVMTI_TYPE_JLONG = 105,
+ JVMTI_TYPE_JFLOAT = 106,
+ JVMTI_TYPE_JDOUBLE = 107,
+ JVMTI_TYPE_JBOOLEAN = 108,
+ JVMTI_TYPE_JOBJECT = 109,
+ JVMTI_TYPE_JTHREAD = 110,
+ JVMTI_TYPE_JCLASS = 111,
+ JVMTI_TYPE_JVALUE = 112,
+ JVMTI_TYPE_JFIELDID = 113,
+ JVMTI_TYPE_JMETHODID = 114,
+ JVMTI_TYPE_CCHAR = 115,
+ JVMTI_TYPE_CVOID = 116,
+ JVMTI_TYPE_JNIENV = 117
+} jvmtiParamTypes;
+
+ /* Extension Function/Event Parameter Kinds */
+
+typedef enum {
+ JVMTI_KIND_IN = 91,
+ JVMTI_KIND_IN_PTR = 92,
+ JVMTI_KIND_IN_BUF = 93,
+ JVMTI_KIND_ALLOC_BUF = 94,
+ JVMTI_KIND_ALLOC_ALLOC_BUF = 95,
+ JVMTI_KIND_OUT = 96,
+ JVMTI_KIND_OUT_BUF = 97
+} jvmtiParamKind;
+
+ /* Timer Kinds */
+
+typedef enum {
+ JVMTI_TIMER_USER_CPU = 30,
+ JVMTI_TIMER_TOTAL_CPU = 31,
+ JVMTI_TIMER_ELAPSED = 32
+} jvmtiTimerKind;
+
+ /* Phases of execution */
+
+typedef enum {
+ JVMTI_PHASE_ONLOAD = 1,
+ JVMTI_PHASE_PRIMORDIAL = 2,
+ JVMTI_PHASE_START = 6,
+ JVMTI_PHASE_LIVE = 4,
+ JVMTI_PHASE_DEAD = 8
+} jvmtiPhase;
+
+ /* Version Interface Types */
+
+enum {
+ JVMTI_VERSION_INTERFACE_JNI = 0x00000000,
+ JVMTI_VERSION_INTERFACE_JVMTI = 0x30000000
+};
+
+ /* Version Masks */
+
+enum {
+ JVMTI_VERSION_MASK_INTERFACE_TYPE = 0x70000000,
+ JVMTI_VERSION_MASK_MAJOR = 0x0FFF0000,
+ JVMTI_VERSION_MASK_MINOR = 0x0000FF00,
+ JVMTI_VERSION_MASK_MICRO = 0x000000FF
+};
+
+ /* Version Shifts */
+
+enum {
+ JVMTI_VERSION_SHIFT_MAJOR = 16,
+ JVMTI_VERSION_SHIFT_MINOR = 8,
+ JVMTI_VERSION_SHIFT_MICRO = 0
+};
+
+ /* Verbose Flag Enumeration */
+
+typedef enum {
+ JVMTI_VERBOSE_OTHER = 0,
+ JVMTI_VERBOSE_GC = 1,
+ JVMTI_VERBOSE_CLASS = 2,
+ JVMTI_VERBOSE_JNI = 4
+} jvmtiVerboseFlag;
+
+ /* JLocation Format Enumeration */
+
+typedef enum {
+ JVMTI_JLOCATION_JVMBCI = 1,
+ JVMTI_JLOCATION_MACHINEPC = 2,
+ JVMTI_JLOCATION_OTHER = 0
+} jvmtiJlocationFormat;
+
+ /* Resource Exhaustion Flags */
+
+enum {
+ JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR = 0x0001,
+ JVMTI_RESOURCE_EXHAUSTED_JAVA_HEAP = 0x0002,
+ JVMTI_RESOURCE_EXHAUSTED_THREADS = 0x0004
+};
+
+ /* Errors */
+
+typedef enum {
+ JVMTI_ERROR_NONE = 0,
+ JVMTI_ERROR_INVALID_THREAD = 10,
+ JVMTI_ERROR_INVALID_THREAD_GROUP = 11,
+ JVMTI_ERROR_INVALID_PRIORITY = 12,
+ JVMTI_ERROR_THREAD_NOT_SUSPENDED = 13,
+ JVMTI_ERROR_THREAD_SUSPENDED = 14,
+ JVMTI_ERROR_THREAD_NOT_ALIVE = 15,
+ JVMTI_ERROR_INVALID_OBJECT = 20,
+ JVMTI_ERROR_INVALID_CLASS = 21,
+ JVMTI_ERROR_CLASS_NOT_PREPARED = 22,
+ JVMTI_ERROR_INVALID_METHODID = 23,
+ JVMTI_ERROR_INVALID_LOCATION = 24,
+ JVMTI_ERROR_INVALID_FIELDID = 25,
+ JVMTI_ERROR_NO_MORE_FRAMES = 31,
+ JVMTI_ERROR_OPAQUE_FRAME = 32,
+ JVMTI_ERROR_TYPE_MISMATCH = 34,
+ JVMTI_ERROR_INVALID_SLOT = 35,
+ JVMTI_ERROR_DUPLICATE = 40,
+ JVMTI_ERROR_NOT_FOUND = 41,
+ JVMTI_ERROR_INVALID_MONITOR = 50,
+ JVMTI_ERROR_NOT_MONITOR_OWNER = 51,
+ JVMTI_ERROR_INTERRUPT = 52,
+ JVMTI_ERROR_INVALID_CLASS_FORMAT = 60,
+ JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION = 61,
+ JVMTI_ERROR_FAILS_VERIFICATION = 62,
+ JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED = 63,
+ JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED = 64,
+ JVMTI_ERROR_INVALID_TYPESTATE = 65,
+ JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED = 66,
+ JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED = 67,
+ JVMTI_ERROR_UNSUPPORTED_VERSION = 68,
+ JVMTI_ERROR_NAMES_DONT_MATCH = 69,
+ JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED = 70,
+ JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED = 71,
+ JVMTI_ERROR_UNMODIFIABLE_CLASS = 79,
+ JVMTI_ERROR_NOT_AVAILABLE = 98,
+ JVMTI_ERROR_MUST_POSSESS_CAPABILITY = 99,
+ JVMTI_ERROR_NULL_POINTER = 100,
+ JVMTI_ERROR_ABSENT_INFORMATION = 101,
+ JVMTI_ERROR_INVALID_EVENT_TYPE = 102,
+ JVMTI_ERROR_ILLEGAL_ARGUMENT = 103,
+ JVMTI_ERROR_NATIVE_METHOD = 104,
+ JVMTI_ERROR_CLASS_LOADER_UNSUPPORTED = 106,
+ JVMTI_ERROR_OUT_OF_MEMORY = 110,
+ JVMTI_ERROR_ACCESS_DENIED = 111,
+ JVMTI_ERROR_WRONG_PHASE = 112,
+ JVMTI_ERROR_INTERNAL = 113,
+ JVMTI_ERROR_UNATTACHED_THREAD = 115,
+ JVMTI_ERROR_INVALID_ENVIRONMENT = 116,
+ JVMTI_ERROR_MAX = 116
+} jvmtiError;
+
+ /* Event IDs */
+
+typedef enum {
+ JVMTI_MIN_EVENT_TYPE_VAL = 50,
+ JVMTI_EVENT_VM_INIT = 50,
+ JVMTI_EVENT_VM_DEATH = 51,
+ JVMTI_EVENT_THREAD_START = 52,
+ JVMTI_EVENT_THREAD_END = 53,
+ JVMTI_EVENT_CLASS_FILE_LOAD_HOOK = 54,
+ JVMTI_EVENT_CLASS_LOAD = 55,
+ JVMTI_EVENT_CLASS_PREPARE = 56,
+ JVMTI_EVENT_VM_START = 57,
+ JVMTI_EVENT_EXCEPTION = 58,
+ JVMTI_EVENT_EXCEPTION_CATCH = 59,
+ JVMTI_EVENT_SINGLE_STEP = 60,
+ JVMTI_EVENT_FRAME_POP = 61,
+ JVMTI_EVENT_BREAKPOINT = 62,
+ JVMTI_EVENT_FIELD_ACCESS = 63,
+ JVMTI_EVENT_FIELD_MODIFICATION = 64,
+ JVMTI_EVENT_METHOD_ENTRY = 65,
+ JVMTI_EVENT_METHOD_EXIT = 66,
+ JVMTI_EVENT_NATIVE_METHOD_BIND = 67,
+ JVMTI_EVENT_COMPILED_METHOD_LOAD = 68,
+ JVMTI_EVENT_COMPILED_METHOD_UNLOAD = 69,
+ JVMTI_EVENT_DYNAMIC_CODE_GENERATED = 70,
+ JVMTI_EVENT_DATA_DUMP_REQUEST = 71,
+ JVMTI_EVENT_MONITOR_WAIT = 73,
+ JVMTI_EVENT_MONITOR_WAITED = 74,
+ JVMTI_EVENT_MONITOR_CONTENDED_ENTER = 75,
+ JVMTI_EVENT_MONITOR_CONTENDED_ENTERED = 76,
+ JVMTI_EVENT_RESOURCE_EXHAUSTED = 80,
+ JVMTI_EVENT_GARBAGE_COLLECTION_START = 81,
+ JVMTI_EVENT_GARBAGE_COLLECTION_FINISH = 82,
+ JVMTI_EVENT_OBJECT_FREE = 83,
+ JVMTI_EVENT_VM_OBJECT_ALLOC = 84,
+ JVMTI_MAX_EVENT_TYPE_VAL = 84
+} jvmtiEvent;
+
+
+ /* Pre-Declarations */
+struct _jvmtiThreadInfo;
+typedef struct _jvmtiThreadInfo jvmtiThreadInfo;
+struct _jvmtiMonitorStackDepthInfo;
+typedef struct _jvmtiMonitorStackDepthInfo jvmtiMonitorStackDepthInfo;
+struct _jvmtiThreadGroupInfo;
+typedef struct _jvmtiThreadGroupInfo jvmtiThreadGroupInfo;
+struct _jvmtiFrameInfo;
+typedef struct _jvmtiFrameInfo jvmtiFrameInfo;
+struct _jvmtiStackInfo;
+typedef struct _jvmtiStackInfo jvmtiStackInfo;
+struct _jvmtiHeapReferenceInfoField;
+typedef struct _jvmtiHeapReferenceInfoField jvmtiHeapReferenceInfoField;
+struct _jvmtiHeapReferenceInfoArray;
+typedef struct _jvmtiHeapReferenceInfoArray jvmtiHeapReferenceInfoArray;
+struct _jvmtiHeapReferenceInfoConstantPool;
+typedef struct _jvmtiHeapReferenceInfoConstantPool jvmtiHeapReferenceInfoConstantPool;
+struct _jvmtiHeapReferenceInfoStackLocal;
+typedef struct _jvmtiHeapReferenceInfoStackLocal jvmtiHeapReferenceInfoStackLocal;
+struct _jvmtiHeapReferenceInfoJniLocal;
+typedef struct _jvmtiHeapReferenceInfoJniLocal jvmtiHeapReferenceInfoJniLocal;
+struct _jvmtiHeapReferenceInfoReserved;
+typedef struct _jvmtiHeapReferenceInfoReserved jvmtiHeapReferenceInfoReserved;
+union _jvmtiHeapReferenceInfo;
+typedef union _jvmtiHeapReferenceInfo jvmtiHeapReferenceInfo;
+struct _jvmtiHeapCallbacks;
+typedef struct _jvmtiHeapCallbacks jvmtiHeapCallbacks;
+struct _jvmtiClassDefinition;
+typedef struct _jvmtiClassDefinition jvmtiClassDefinition;
+struct _jvmtiMonitorUsage;
+typedef struct _jvmtiMonitorUsage jvmtiMonitorUsage;
+struct _jvmtiLineNumberEntry;
+typedef struct _jvmtiLineNumberEntry jvmtiLineNumberEntry;
+struct _jvmtiLocalVariableEntry;
+typedef struct _jvmtiLocalVariableEntry jvmtiLocalVariableEntry;
+struct _jvmtiParamInfo;
+typedef struct _jvmtiParamInfo jvmtiParamInfo;
+struct _jvmtiExtensionFunctionInfo;
+typedef struct _jvmtiExtensionFunctionInfo jvmtiExtensionFunctionInfo;
+struct _jvmtiExtensionEventInfo;
+typedef struct _jvmtiExtensionEventInfo jvmtiExtensionEventInfo;
+struct _jvmtiTimerInfo;
+typedef struct _jvmtiTimerInfo jvmtiTimerInfo;
+struct _jvmtiAddrLocationMap;
+typedef struct _jvmtiAddrLocationMap jvmtiAddrLocationMap;
+
+ /* Function Types */
+
+typedef void (JNICALL *jvmtiStartFunction)
+ (jvmtiEnv* jvmti_env, JNIEnv* jni_env, void* arg);
+
+typedef jint (JNICALL *jvmtiHeapIterationCallback)
+ (jlong class_tag, jlong size, jlong* tag_ptr, jint length, void* user_data);
+
+typedef jint (JNICALL *jvmtiHeapReferenceCallback)
+ (jvmtiHeapReferenceKind reference_kind, const jvmtiHeapReferenceInfo* reference_info, jlong class_tag, jlong referrer_class_tag, jlong size, jlong* tag_ptr, jlong* referrer_tag_ptr, jint length, void* user_data);
+
+typedef jint (JNICALL *jvmtiPrimitiveFieldCallback)
+ (jvmtiHeapReferenceKind kind, const jvmtiHeapReferenceInfo* info, jlong object_class_tag, jlong* object_tag_ptr, jvalue value, jvmtiPrimitiveType value_type, void* user_data);
+
+typedef jint (JNICALL *jvmtiArrayPrimitiveValueCallback)
+ (jlong class_tag, jlong size, jlong* tag_ptr, jint element_count, jvmtiPrimitiveType element_type, const void* elements, void* user_data);
+
+typedef jint (JNICALL *jvmtiStringPrimitiveValueCallback)
+ (jlong class_tag, jlong size, jlong* tag_ptr, const jchar* value, jint value_length, void* user_data);
+
+typedef jint (JNICALL *jvmtiReservedCallback)
+ ();
+
+typedef jvmtiIterationControl (JNICALL *jvmtiHeapObjectCallback)
+ (jlong class_tag, jlong size, jlong* tag_ptr, void* user_data);
+
+typedef jvmtiIterationControl (JNICALL *jvmtiHeapRootCallback)
+ (jvmtiHeapRootKind root_kind, jlong class_tag, jlong size, jlong* tag_ptr, void* user_data);
+
+typedef jvmtiIterationControl (JNICALL *jvmtiStackReferenceCallback)
+ (jvmtiHeapRootKind root_kind, jlong class_tag, jlong size, jlong* tag_ptr, jlong thread_tag, jint depth, jmethodID method, jint slot, void* user_data);
+
+typedef jvmtiIterationControl (JNICALL *jvmtiObjectReferenceCallback)
+ (jvmtiObjectReferenceKind reference_kind, jlong class_tag, jlong size, jlong* tag_ptr, jlong referrer_tag, jint referrer_index, void* user_data);
+
+typedef jvmtiError (JNICALL *jvmtiExtensionFunction)
+ (jvmtiEnv* jvmti_env, ...);
+
+typedef void (JNICALL *jvmtiExtensionEvent)
+ (jvmtiEnv* jvmti_env, ...);
+
+
+ /* Structure Types */
+struct _jvmtiThreadInfo {
+ char* name;
+ jint priority;
+ jboolean is_daemon;
+ jthreadGroup thread_group;
+ jobject context_class_loader;
+};
+struct _jvmtiMonitorStackDepthInfo {
+ jobject monitor;
+ jint stack_depth;
+};
+struct _jvmtiThreadGroupInfo {
+ jthreadGroup parent;
+ char* name;
+ jint max_priority;
+ jboolean is_daemon;
+};
+struct _jvmtiFrameInfo {
+ jmethodID method;
+ jlocation location;
+};
+struct _jvmtiStackInfo {
+ jthread thread;
+ jint state;
+ jvmtiFrameInfo* frame_buffer;
+ jint frame_count;
+};
+struct _jvmtiHeapReferenceInfoField {
+ jint index;
+};
+struct _jvmtiHeapReferenceInfoArray {
+ jint index;
+};
+struct _jvmtiHeapReferenceInfoConstantPool {
+ jint index;
+};
+struct _jvmtiHeapReferenceInfoStackLocal {
+ jlong thread_tag;
+ jlong thread_id;
+ jint depth;
+ jmethodID method;
+ jlocation location;
+ jint slot;
+};
+struct _jvmtiHeapReferenceInfoJniLocal {
+ jlong thread_tag;
+ jlong thread_id;
+ jint depth;
+ jmethodID method;
+};
+struct _jvmtiHeapReferenceInfoReserved {
+ jlong reserved1;
+ jlong reserved2;
+ jlong reserved3;
+ jlong reserved4;
+ jlong reserved5;
+ jlong reserved6;
+ jlong reserved7;
+ jlong reserved8;
+};
+union _jvmtiHeapReferenceInfo {
+ jvmtiHeapReferenceInfoField field;
+ jvmtiHeapReferenceInfoArray array;
+ jvmtiHeapReferenceInfoConstantPool constant_pool;
+ jvmtiHeapReferenceInfoStackLocal stack_local;
+ jvmtiHeapReferenceInfoJniLocal jni_local;
+ jvmtiHeapReferenceInfoReserved other;
+};
+struct _jvmtiHeapCallbacks {
+ jvmtiHeapIterationCallback heap_iteration_callback;
+ jvmtiHeapReferenceCallback heap_reference_callback;
+ jvmtiPrimitiveFieldCallback primitive_field_callback;
+ jvmtiArrayPrimitiveValueCallback array_primitive_value_callback;
+ jvmtiStringPrimitiveValueCallback string_primitive_value_callback;
+ jvmtiReservedCallback reserved5;
+ jvmtiReservedCallback reserved6;
+ jvmtiReservedCallback reserved7;
+ jvmtiReservedCallback reserved8;
+ jvmtiReservedCallback reserved9;
+ jvmtiReservedCallback reserved10;
+ jvmtiReservedCallback reserved11;
+ jvmtiReservedCallback reserved12;
+ jvmtiReservedCallback reserved13;
+ jvmtiReservedCallback reserved14;
+ jvmtiReservedCallback reserved15;
+};
+struct _jvmtiClassDefinition {
+ jclass klass;
+ jint class_byte_count;
+ const unsigned char* class_bytes;
+};
+struct _jvmtiMonitorUsage {
+ jthread owner;
+ jint entry_count;
+ jint waiter_count;
+ jthread* waiters;
+ jint notify_waiter_count;
+ jthread* notify_waiters;
+};
+struct _jvmtiLineNumberEntry {
+ jlocation start_location;
+ jint line_number;
+};
+struct _jvmtiLocalVariableEntry {
+ jlocation start_location;
+ jint length;
+ char* name;
+ char* signature;
+ char* generic_signature;
+ jint slot;
+};
+struct _jvmtiParamInfo {
+ char* name;
+ jvmtiParamKind kind;
+ jvmtiParamTypes base_type;
+ jboolean null_ok;
+};
+struct _jvmtiExtensionFunctionInfo {
+ jvmtiExtensionFunction func;
+ char* id;
+ char* short_description;
+ jint param_count;
+ jvmtiParamInfo* params;
+ jint error_count;
+ jvmtiError* errors;
+};
+struct _jvmtiExtensionEventInfo {
+ jint extension_event_index;
+ char* id;
+ char* short_description;
+ jint param_count;
+ jvmtiParamInfo* params;
+};
+struct _jvmtiTimerInfo {
+ jlong max_value;
+ jboolean may_skip_forward;
+ jboolean may_skip_backward;
+ jvmtiTimerKind kind;
+ jlong reserved1;
+ jlong reserved2;
+};
+struct _jvmtiAddrLocationMap {
+ const void* start_address;
+ jlocation location;
+};
+
+typedef struct {
+ unsigned int can_tag_objects : 1;
+ unsigned int can_generate_field_modification_events : 1;
+ unsigned int can_generate_field_access_events : 1;
+ unsigned int can_get_bytecodes : 1;
+ unsigned int can_get_synthetic_attribute : 1;
+ unsigned int can_get_owned_monitor_info : 1;
+ unsigned int can_get_current_contended_monitor : 1;
+ unsigned int can_get_monitor_info : 1;
+ unsigned int can_pop_frame : 1;
+ unsigned int can_redefine_classes : 1;
+ unsigned int can_signal_thread : 1;
+ unsigned int can_get_source_file_name : 1;
+ unsigned int can_get_line_numbers : 1;
+ unsigned int can_get_source_debug_extension : 1;
+ unsigned int can_access_local_variables : 1;
+ unsigned int can_maintain_original_method_order : 1;
+ unsigned int can_generate_single_step_events : 1;
+ unsigned int can_generate_exception_events : 1;
+ unsigned int can_generate_frame_pop_events : 1;
+ unsigned int can_generate_breakpoint_events : 1;
+ unsigned int can_suspend : 1;
+ unsigned int can_redefine_any_class : 1;
+ unsigned int can_get_current_thread_cpu_time : 1;
+ unsigned int can_get_thread_cpu_time : 1;
+ unsigned int can_generate_method_entry_events : 1;
+ unsigned int can_generate_method_exit_events : 1;
+ unsigned int can_generate_all_class_hook_events : 1;
+ unsigned int can_generate_compiled_method_load_events : 1;
+ unsigned int can_generate_monitor_events : 1;
+ unsigned int can_generate_vm_object_alloc_events : 1;
+ unsigned int can_generate_native_method_bind_events : 1;
+ unsigned int can_generate_garbage_collection_events : 1;
+ unsigned int can_generate_object_free_events : 1;
+ unsigned int can_force_early_return : 1;
+ unsigned int can_get_owned_monitor_stack_depth_info : 1;
+ unsigned int can_get_constant_pool : 1;
+ unsigned int can_set_native_method_prefix : 1;
+ unsigned int can_retransform_classes : 1;
+ unsigned int can_retransform_any_class : 1;
+ unsigned int can_generate_resource_exhaustion_heap_events : 1;
+ unsigned int can_generate_resource_exhaustion_threads_events : 1;
+ unsigned int : 7;
+ unsigned int : 16;
+ unsigned int : 16;
+ unsigned int : 16;
+ unsigned int : 16;
+ unsigned int : 16;
+} jvmtiCapabilities;
+
+
+ /* Event Definitions */
+
+typedef void (JNICALL *jvmtiEventReserved)(void);
+
+
+typedef void (JNICALL *jvmtiEventBreakpoint)
+ (jvmtiEnv *jvmti_env,
+ JNIEnv* jni_env,
+ jthread thread,
+ jmethodID method,
+ jlocation location);
+
+typedef void (JNICALL *jvmtiEventClassFileLoadHook)
+ (jvmtiEnv *jvmti_env,
+ JNIEnv* jni_env,
+ jclass class_being_redefined,
+ jobject loader,
+ const char* name,
+ jobject protection_domain,
+ jint class_data_len,
+ const unsigned char* class_data,
+ jint* new_class_data_len,
+ unsigned char** new_class_data);
+
+typedef void (JNICALL *jvmtiEventClassLoad)
+ (jvmtiEnv *jvmti_env,
+ JNIEnv* jni_env,
+ jthread thread,
+ jclass klass);
+
+typedef void (JNICALL *jvmtiEventClassPrepare)
+ (jvmtiEnv *jvmti_env,
+ JNIEnv* jni_env,
+ jthread thread,
+ jclass klass);
+
+typedef void (JNICALL *jvmtiEventCompiledMethodLoad)
+ (jvmtiEnv *jvmti_env,
+ jmethodID method,
+ jint code_size,
+ const void* code_addr,
+ jint map_length,
+ const jvmtiAddrLocationMap* map,
+ const void* compile_info);
+
+typedef void (JNICALL *jvmtiEventCompiledMethodUnload)
+ (jvmtiEnv *jvmti_env,
+ jmethodID method,
+ const void* code_addr);
+
+typedef void (JNICALL *jvmtiEventDataDumpRequest)
+ (jvmtiEnv *jvmti_env);
+
+typedef void (JNICALL *jvmtiEventDynamicCodeGenerated)
+ (jvmtiEnv *jvmti_env,
+ const char* name,
+ const void* address,
+ jint length);
+
+typedef void (JNICALL *jvmtiEventException)
+ (jvmtiEnv *jvmti_env,
+ JNIEnv* jni_env,
+ jthread thread,
+ jmethodID method,
+ jlocation location,
+ jobject exception,
+ jmethodID catch_method,
+ jlocation catch_location);
+
+typedef void (JNICALL *jvmtiEventExceptionCatch)
+ (jvmtiEnv *jvmti_env,
+ JNIEnv* jni_env,
+ jthread thread,
+ jmethodID method,
+ jlocation location,
+ jobject exception);
+
+typedef void (JNICALL *jvmtiEventFieldAccess)
+ (jvmtiEnv *jvmti_env,
+ JNIEnv* jni_env,
+ jthread thread,
+ jmethodID method,
+ jlocation location,
+ jclass field_klass,
+ jobject object,
+ jfieldID field);
+
+typedef void (JNICALL *jvmtiEventFieldModification)
+ (jvmtiEnv *jvmti_env,
+ JNIEnv* jni_env,
+ jthread thread,
+ jmethodID method,
+ jlocation location,
+ jclass field_klass,
+ jobject object,
+ jfieldID field,
+ char signature_type,
+ jvalue new_value);
+
+typedef void (JNICALL *jvmtiEventFramePop)
+ (jvmtiEnv *jvmti_env,
+ JNIEnv* jni_env,
+ jthread thread,
+ jmethodID method,
+ jboolean was_popped_by_exception);
+
+typedef void (JNICALL *jvmtiEventGarbageCollectionFinish)
+ (jvmtiEnv *jvmti_env);
+
+typedef void (JNICALL *jvmtiEventGarbageCollectionStart)
+ (jvmtiEnv *jvmti_env);
+
+typedef void (JNICALL *jvmtiEventMethodEntry)
+ (jvmtiEnv *jvmti_env,
+ JNIEnv* jni_env,
+ jthread thread,
+ jmethodID method);
+
+typedef void (JNICALL *jvmtiEventMethodExit)
+ (jvmtiEnv *jvmti_env,
+ JNIEnv* jni_env,
+ jthread thread,
+ jmethodID method,
+ jboolean was_popped_by_exception,
+ jvalue return_value);
+
+typedef void (JNICALL *jvmtiEventMonitorContendedEnter)
+ (jvmtiEnv *jvmti_env,
+ JNIEnv* jni_env,
+ jthread thread,
+ jobject object);
+
+typedef void (JNICALL *jvmtiEventMonitorContendedEntered)
+ (jvmtiEnv *jvmti_env,
+ JNIEnv* jni_env,
+ jthread thread,
+ jobject object);
+
+typedef void (JNICALL *jvmtiEventMonitorWait)
+ (jvmtiEnv *jvmti_env,
+ JNIEnv* jni_env,
+ jthread thread,
+ jobject object,
+ jlong timeout);
+
+typedef void (JNICALL *jvmtiEventMonitorWaited)
+ (jvmtiEnv *jvmti_env,
+ JNIEnv* jni_env,
+ jthread thread,
+ jobject object,
+ jboolean timed_out);
+
+typedef void (JNICALL *jvmtiEventNativeMethodBind)
+ (jvmtiEnv *jvmti_env,
+ JNIEnv* jni_env,
+ jthread thread,
+ jmethodID method,
+ void* address,
+ void** new_address_ptr);
+
+typedef void (JNICALL *jvmtiEventObjectFree)
+ (jvmtiEnv *jvmti_env,
+ jlong tag);
+
+typedef void (JNICALL *jvmtiEventResourceExhausted)
+ (jvmtiEnv *jvmti_env,
+ JNIEnv* jni_env,
+ jint flags,
+ const void* reserved,
+ const char* description);
+
+typedef void (JNICALL *jvmtiEventSingleStep)
+ (jvmtiEnv *jvmti_env,
+ JNIEnv* jni_env,
+ jthread thread,
+ jmethodID method,
+ jlocation location);
+
+typedef void (JNICALL *jvmtiEventThreadEnd)
+ (jvmtiEnv *jvmti_env,
+ JNIEnv* jni_env,
+ jthread thread);
+
+typedef void (JNICALL *jvmtiEventThreadStart)
+ (jvmtiEnv *jvmti_env,
+ JNIEnv* jni_env,
+ jthread thread);
+
+typedef void (JNICALL *jvmtiEventVMDeath)
+ (jvmtiEnv *jvmti_env,
+ JNIEnv* jni_env);
+
+typedef void (JNICALL *jvmtiEventVMInit)
+ (jvmtiEnv *jvmti_env,
+ JNIEnv* jni_env,
+ jthread thread);
+
+typedef void (JNICALL *jvmtiEventVMObjectAlloc)
+ (jvmtiEnv *jvmti_env,
+ JNIEnv* jni_env,
+ jthread thread,
+ jobject object,
+ jclass object_klass,
+ jlong size);
+
+typedef void (JNICALL *jvmtiEventVMStart)
+ (jvmtiEnv *jvmti_env,
+ JNIEnv* jni_env);
+
+ /* Event Callback Structure */
+
+typedef struct {
+ /* 50 : VM Initialization Event */
+ jvmtiEventVMInit VMInit;
+ /* 51 : VM Death Event */
+ jvmtiEventVMDeath VMDeath;
+ /* 52 : Thread Start */
+ jvmtiEventThreadStart ThreadStart;
+ /* 53 : Thread End */
+ jvmtiEventThreadEnd ThreadEnd;
+ /* 54 : Class File Load Hook */
+ jvmtiEventClassFileLoadHook ClassFileLoadHook;
+ /* 55 : Class Load */
+ jvmtiEventClassLoad ClassLoad;
+ /* 56 : Class Prepare */
+ jvmtiEventClassPrepare ClassPrepare;
+ /* 57 : VM Start Event */
+ jvmtiEventVMStart VMStart;
+ /* 58 : Exception */
+ jvmtiEventException Exception;
+ /* 59 : Exception Catch */
+ jvmtiEventExceptionCatch ExceptionCatch;
+ /* 60 : Single Step */
+ jvmtiEventSingleStep SingleStep;
+ /* 61 : Frame Pop */
+ jvmtiEventFramePop FramePop;
+ /* 62 : Breakpoint */
+ jvmtiEventBreakpoint Breakpoint;
+ /* 63 : Field Access */
+ jvmtiEventFieldAccess FieldAccess;
+ /* 64 : Field Modification */
+ jvmtiEventFieldModification FieldModification;
+ /* 65 : Method Entry */
+ jvmtiEventMethodEntry MethodEntry;
+ /* 66 : Method Exit */
+ jvmtiEventMethodExit MethodExit;
+ /* 67 : Native Method Bind */
+ jvmtiEventNativeMethodBind NativeMethodBind;
+ /* 68 : Compiled Method Load */
+ jvmtiEventCompiledMethodLoad CompiledMethodLoad;
+ /* 69 : Compiled Method Unload */
+ jvmtiEventCompiledMethodUnload CompiledMethodUnload;
+ /* 70 : Dynamic Code Generated */
+ jvmtiEventDynamicCodeGenerated DynamicCodeGenerated;
+ /* 71 : Data Dump Request */
+ jvmtiEventDataDumpRequest DataDumpRequest;
+ /* 72 */
+ jvmtiEventReserved reserved72;
+ /* 73 : Monitor Wait */
+ jvmtiEventMonitorWait MonitorWait;
+ /* 74 : Monitor Waited */
+ jvmtiEventMonitorWaited MonitorWaited;
+ /* 75 : Monitor Contended Enter */
+ jvmtiEventMonitorContendedEnter MonitorContendedEnter;
+ /* 76 : Monitor Contended Entered */
+ jvmtiEventMonitorContendedEntered MonitorContendedEntered;
+ /* 77 */
+ jvmtiEventReserved reserved77;
+ /* 78 */
+ jvmtiEventReserved reserved78;
+ /* 79 */
+ jvmtiEventReserved reserved79;
+ /* 80 : Resource Exhausted */
+ jvmtiEventResourceExhausted ResourceExhausted;
+ /* 81 : Garbage Collection Start */
+ jvmtiEventGarbageCollectionStart GarbageCollectionStart;
+ /* 82 : Garbage Collection Finish */
+ jvmtiEventGarbageCollectionFinish GarbageCollectionFinish;
+ /* 83 : Object Free */
+ jvmtiEventObjectFree ObjectFree;
+ /* 84 : VM Object Allocation */
+ jvmtiEventVMObjectAlloc VMObjectAlloc;
+} jvmtiEventCallbacks;
+
+
+ /* Function Interface */
+
+typedef struct jvmtiInterface_1_ {
+
+ /* 1 : RESERVED */
+ void *reserved1;
+
+ /* 2 : Set Event Notification Mode */
+ jvmtiError (JNICALL *SetEventNotificationMode) (jvmtiEnv* env,
+ jvmtiEventMode mode,
+ jvmtiEvent event_type,
+ jthread event_thread,
+ ...);
+
+ /* 3 : RESERVED */
+ void *reserved3;
+
+ /* 4 : Get All Threads */
+ jvmtiError (JNICALL *GetAllThreads) (jvmtiEnv* env,
+ jint* threads_count_ptr,
+ jthread** threads_ptr);
+
+ /* 5 : Suspend Thread */
+ jvmtiError (JNICALL *SuspendThread) (jvmtiEnv* env,
+ jthread thread);
+
+ /* 6 : Resume Thread */
+ jvmtiError (JNICALL *ResumeThread) (jvmtiEnv* env,
+ jthread thread);
+
+ /* 7 : Stop Thread */
+ jvmtiError (JNICALL *StopThread) (jvmtiEnv* env,
+ jthread thread,
+ jobject exception);
+
+ /* 8 : Interrupt Thread */
+ jvmtiError (JNICALL *InterruptThread) (jvmtiEnv* env,
+ jthread thread);
+
+ /* 9 : Get Thread Info */
+ jvmtiError (JNICALL *GetThreadInfo) (jvmtiEnv* env,
+ jthread thread,
+ jvmtiThreadInfo* info_ptr);
+
+ /* 10 : Get Owned Monitor Info */
+ jvmtiError (JNICALL *GetOwnedMonitorInfo) (jvmtiEnv* env,
+ jthread thread,
+ jint* owned_monitor_count_ptr,
+ jobject** owned_monitors_ptr);
+
+ /* 11 : Get Current Contended Monitor */
+ jvmtiError (JNICALL *GetCurrentContendedMonitor) (jvmtiEnv* env,
+ jthread thread,
+ jobject* monitor_ptr);
+
+ /* 12 : Run Agent Thread */
+ jvmtiError (JNICALL *RunAgentThread) (jvmtiEnv* env,
+ jthread thread,
+ jvmtiStartFunction proc,
+ const void* arg,
+ jint priority);
+
+ /* 13 : Get Top Thread Groups */
+ jvmtiError (JNICALL *GetTopThreadGroups) (jvmtiEnv* env,
+ jint* group_count_ptr,
+ jthreadGroup** groups_ptr);
+
+ /* 14 : Get Thread Group Info */
+ jvmtiError (JNICALL *GetThreadGroupInfo) (jvmtiEnv* env,
+ jthreadGroup group,
+ jvmtiThreadGroupInfo* info_ptr);
+
+ /* 15 : Get Thread Group Children */
+ jvmtiError (JNICALL *GetThreadGroupChildren) (jvmtiEnv* env,
+ jthreadGroup group,
+ jint* thread_count_ptr,
+ jthread** threads_ptr,
+ jint* group_count_ptr,
+ jthreadGroup** groups_ptr);
+
+ /* 16 : Get Frame Count */
+ jvmtiError (JNICALL *GetFrameCount) (jvmtiEnv* env,
+ jthread thread,
+ jint* count_ptr);
+
+ /* 17 : Get Thread State */
+ jvmtiError (JNICALL *GetThreadState) (jvmtiEnv* env,
+ jthread thread,
+ jint* thread_state_ptr);
+
+ /* 18 : Get Current Thread */
+ jvmtiError (JNICALL *GetCurrentThread) (jvmtiEnv* env,
+ jthread* thread_ptr);
+
+ /* 19 : Get Frame Location */
+ jvmtiError (JNICALL *GetFrameLocation) (jvmtiEnv* env,
+ jthread thread,
+ jint depth,
+ jmethodID* method_ptr,
+ jlocation* location_ptr);
+
+ /* 20 : Notify Frame Pop */
+ jvmtiError (JNICALL *NotifyFramePop) (jvmtiEnv* env,
+ jthread thread,
+ jint depth);
+
+ /* 21 : Get Local Variable - Object */
+ jvmtiError (JNICALL *GetLocalObject) (jvmtiEnv* env,
+ jthread thread,
+ jint depth,
+ jint slot,
+ jobject* value_ptr);
+
+ /* 22 : Get Local Variable - Int */
+ jvmtiError (JNICALL *GetLocalInt) (jvmtiEnv* env,
+ jthread thread,
+ jint depth,
+ jint slot,
+ jint* value_ptr);
+
+ /* 23 : Get Local Variable - Long */
+ jvmtiError (JNICALL *GetLocalLong) (jvmtiEnv* env,
+ jthread thread,
+ jint depth,
+ jint slot,
+ jlong* value_ptr);
+
+ /* 24 : Get Local Variable - Float */
+ jvmtiError (JNICALL *GetLocalFloat) (jvmtiEnv* env,
+ jthread thread,
+ jint depth,
+ jint slot,
+ jfloat* value_ptr);
+
+ /* 25 : Get Local Variable - Double */
+ jvmtiError (JNICALL *GetLocalDouble) (jvmtiEnv* env,
+ jthread thread,
+ jint depth,
+ jint slot,
+ jdouble* value_ptr);
+
+ /* 26 : Set Local Variable - Object */
+ jvmtiError (JNICALL *SetLocalObject) (jvmtiEnv* env,
+ jthread thread,
+ jint depth,
+ jint slot,
+ jobject value);
+
+ /* 27 : Set Local Variable - Int */
+ jvmtiError (JNICALL *SetLocalInt) (jvmtiEnv* env,
+ jthread thread,
+ jint depth,
+ jint slot,
+ jint value);
+
+ /* 28 : Set Local Variable - Long */
+ jvmtiError (JNICALL *SetLocalLong) (jvmtiEnv* env,
+ jthread thread,
+ jint depth,
+ jint slot,
+ jlong value);
+
+ /* 29 : Set Local Variable - Float */
+ jvmtiError (JNICALL *SetLocalFloat) (jvmtiEnv* env,
+ jthread thread,
+ jint depth,
+ jint slot,
+ jfloat value);
+
+ /* 30 : Set Local Variable - Double */
+ jvmtiError (JNICALL *SetLocalDouble) (jvmtiEnv* env,
+ jthread thread,
+ jint depth,
+ jint slot,
+ jdouble value);
+
+ /* 31 : Create Raw Monitor */
+ jvmtiError (JNICALL *CreateRawMonitor) (jvmtiEnv* env,
+ const char* name,
+ jrawMonitorID* monitor_ptr);
+
+ /* 32 : Destroy Raw Monitor */
+ jvmtiError (JNICALL *DestroyRawMonitor) (jvmtiEnv* env,
+ jrawMonitorID monitor);
+
+ /* 33 : Raw Monitor Enter */
+ jvmtiError (JNICALL *RawMonitorEnter) (jvmtiEnv* env,
+ jrawMonitorID monitor);
+
+ /* 34 : Raw Monitor Exit */
+ jvmtiError (JNICALL *RawMonitorExit) (jvmtiEnv* env,
+ jrawMonitorID monitor);
+
+ /* 35 : Raw Monitor Wait */
+ jvmtiError (JNICALL *RawMonitorWait) (jvmtiEnv* env,
+ jrawMonitorID monitor,
+ jlong millis);
+
+ /* 36 : Raw Monitor Notify */
+ jvmtiError (JNICALL *RawMonitorNotify) (jvmtiEnv* env,
+ jrawMonitorID monitor);
+
+ /* 37 : Raw Monitor Notify All */
+ jvmtiError (JNICALL *RawMonitorNotifyAll) (jvmtiEnv* env,
+ jrawMonitorID monitor);
+
+ /* 38 : Set Breakpoint */
+ jvmtiError (JNICALL *SetBreakpoint) (jvmtiEnv* env,
+ jmethodID method,
+ jlocation location);
+
+ /* 39 : Clear Breakpoint */
+ jvmtiError (JNICALL *ClearBreakpoint) (jvmtiEnv* env,
+ jmethodID method,
+ jlocation location);
+
+ /* 40 : RESERVED */
+ void *reserved40;
+
+ /* 41 : Set Field Access Watch */
+ jvmtiError (JNICALL *SetFieldAccessWatch) (jvmtiEnv* env,
+ jclass klass,
+ jfieldID field);
+
+ /* 42 : Clear Field Access Watch */
+ jvmtiError (JNICALL *ClearFieldAccessWatch) (jvmtiEnv* env,
+ jclass klass,
+ jfieldID field);
+
+ /* 43 : Set Field Modification Watch */
+ jvmtiError (JNICALL *SetFieldModificationWatch) (jvmtiEnv* env,
+ jclass klass,
+ jfieldID field);
+
+ /* 44 : Clear Field Modification Watch */
+ jvmtiError (JNICALL *ClearFieldModificationWatch) (jvmtiEnv* env,
+ jclass klass,
+ jfieldID field);
+
+ /* 45 : Is Modifiable Class */
+ jvmtiError (JNICALL *IsModifiableClass) (jvmtiEnv* env,
+ jclass klass,
+ jboolean* is_modifiable_class_ptr);
+
+ /* 46 : Allocate */
+ jvmtiError (JNICALL *Allocate) (jvmtiEnv* env,
+ jlong size,
+ unsigned char** mem_ptr);
+
+ /* 47 : Deallocate */
+ jvmtiError (JNICALL *Deallocate) (jvmtiEnv* env,
+ unsigned char* mem);
+
+ /* 48 : Get Class Signature */
+ jvmtiError (JNICALL *GetClassSignature) (jvmtiEnv* env,
+ jclass klass,
+ char** signature_ptr,
+ char** generic_ptr);
+
+ /* 49 : Get Class Status */
+ jvmtiError (JNICALL *GetClassStatus) (jvmtiEnv* env,
+ jclass klass,
+ jint* status_ptr);
+
+ /* 50 : Get Source File Name */
+ jvmtiError (JNICALL *GetSourceFileName) (jvmtiEnv* env,
+ jclass klass,
+ char** source_name_ptr);
+
+ /* 51 : Get Class Modifiers */
+ jvmtiError (JNICALL *GetClassModifiers) (jvmtiEnv* env,
+ jclass klass,
+ jint* modifiers_ptr);
+
+ /* 52 : Get Class Methods */
+ jvmtiError (JNICALL *GetClassMethods) (jvmtiEnv* env,
+ jclass klass,
+ jint* method_count_ptr,
+ jmethodID** methods_ptr);
+
+ /* 53 : Get Class Fields */
+ jvmtiError (JNICALL *GetClassFields) (jvmtiEnv* env,
+ jclass klass,
+ jint* field_count_ptr,
+ jfieldID** fields_ptr);
+
+ /* 54 : Get Implemented Interfaces */
+ jvmtiError (JNICALL *GetImplementedInterfaces) (jvmtiEnv* env,
+ jclass klass,
+ jint* interface_count_ptr,
+ jclass** interfaces_ptr);
+
+ /* 55 : Is Interface */
+ jvmtiError (JNICALL *IsInterface) (jvmtiEnv* env,
+ jclass klass,
+ jboolean* is_interface_ptr);
+
+ /* 56 : Is Array Class */
+ jvmtiError (JNICALL *IsArrayClass) (jvmtiEnv* env,
+ jclass klass,
+ jboolean* is_array_class_ptr);
+
+ /* 57 : Get Class Loader */
+ jvmtiError (JNICALL *GetClassLoader) (jvmtiEnv* env,
+ jclass klass,
+ jobject* classloader_ptr);
+
+ /* 58 : Get Object Hash Code */
+ jvmtiError (JNICALL *GetObjectHashCode) (jvmtiEnv* env,
+ jobject object,
+ jint* hash_code_ptr);
+
+ /* 59 : Get Object Monitor Usage */
+ jvmtiError (JNICALL *GetObjectMonitorUsage) (jvmtiEnv* env,
+ jobject object,
+ jvmtiMonitorUsage* info_ptr);
+
+ /* 60 : Get Field Name (and Signature) */
+ jvmtiError (JNICALL *GetFieldName) (jvmtiEnv* env,
+ jclass klass,
+ jfieldID field,
+ char** name_ptr,
+ char** signature_ptr,
+ char** generic_ptr);
+
+ /* 61 : Get Field Declaring Class */
+ jvmtiError (JNICALL *GetFieldDeclaringClass) (jvmtiEnv* env,
+ jclass klass,
+ jfieldID field,
+ jclass* declaring_class_ptr);
+
+ /* 62 : Get Field Modifiers */
+ jvmtiError (JNICALL *GetFieldModifiers) (jvmtiEnv* env,
+ jclass klass,
+ jfieldID field,
+ jint* modifiers_ptr);
+
+ /* 63 : Is Field Synthetic */
+ jvmtiError (JNICALL *IsFieldSynthetic) (jvmtiEnv* env,
+ jclass klass,
+ jfieldID field,
+ jboolean* is_synthetic_ptr);
+
+ /* 64 : Get Method Name (and Signature) */
+ jvmtiError (JNICALL *GetMethodName) (jvmtiEnv* env,
+ jmethodID method,
+ char** name_ptr,
+ char** signature_ptr,
+ char** generic_ptr);
+
+ /* 65 : Get Method Declaring Class */
+ jvmtiError (JNICALL *GetMethodDeclaringClass) (jvmtiEnv* env,
+ jmethodID method,
+ jclass* declaring_class_ptr);
+
+ /* 66 : Get Method Modifiers */
+ jvmtiError (JNICALL *GetMethodModifiers) (jvmtiEnv* env,
+ jmethodID method,
+ jint* modifiers_ptr);
+
+ /* 67 : RESERVED */
+ void *reserved67;
+
+ /* 68 : Get Max Locals */
+ jvmtiError (JNICALL *GetMaxLocals) (jvmtiEnv* env,
+ jmethodID method,
+ jint* max_ptr);
+
+ /* 69 : Get Arguments Size */
+ jvmtiError (JNICALL *GetArgumentsSize) (jvmtiEnv* env,
+ jmethodID method,
+ jint* size_ptr);
+
+ /* 70 : Get Line Number Table */
+ jvmtiError (JNICALL *GetLineNumberTable) (jvmtiEnv* env,
+ jmethodID method,
+ jint* entry_count_ptr,
+ jvmtiLineNumberEntry** table_ptr);
+
+ /* 71 : Get Method Location */
+ jvmtiError (JNICALL *GetMethodLocation) (jvmtiEnv* env,
+ jmethodID method,
+ jlocation* start_location_ptr,
+ jlocation* end_location_ptr);
+
+ /* 72 : Get Local Variable Table */
+ jvmtiError (JNICALL *GetLocalVariableTable) (jvmtiEnv* env,
+ jmethodID method,
+ jint* entry_count_ptr,
+ jvmtiLocalVariableEntry** table_ptr);
+
+ /* 73 : Set Native Method Prefix */
+ jvmtiError (JNICALL *SetNativeMethodPrefix) (jvmtiEnv* env,
+ const char* prefix);
+
+ /* 74 : Set Native Method Prefixes */
+ jvmtiError (JNICALL *SetNativeMethodPrefixes) (jvmtiEnv* env,
+ jint prefix_count,
+ char** prefixes);
+
+ /* 75 : Get Bytecodes */
+ jvmtiError (JNICALL *GetBytecodes) (jvmtiEnv* env,
+ jmethodID method,
+ jint* bytecode_count_ptr,
+ unsigned char** bytecodes_ptr);
+
+ /* 76 : Is Method Native */
+ jvmtiError (JNICALL *IsMethodNative) (jvmtiEnv* env,
+ jmethodID method,
+ jboolean* is_native_ptr);
+
+ /* 77 : Is Method Synthetic */
+ jvmtiError (JNICALL *IsMethodSynthetic) (jvmtiEnv* env,
+ jmethodID method,
+ jboolean* is_synthetic_ptr);
+
+ /* 78 : Get Loaded Classes */
+ jvmtiError (JNICALL *GetLoadedClasses) (jvmtiEnv* env,
+ jint* class_count_ptr,
+ jclass** classes_ptr);
+
+ /* 79 : Get Classloader Classes */
+ jvmtiError (JNICALL *GetClassLoaderClasses) (jvmtiEnv* env,
+ jobject initiating_loader,
+ jint* class_count_ptr,
+ jclass** classes_ptr);
+
+ /* 80 : Pop Frame */
+ jvmtiError (JNICALL *PopFrame) (jvmtiEnv* env,
+ jthread thread);
+
+ /* 81 : Force Early Return - Object */
+ jvmtiError (JNICALL *ForceEarlyReturnObject) (jvmtiEnv* env,
+ jthread thread,
+ jobject value);
+
+ /* 82 : Force Early Return - Int */
+ jvmtiError (JNICALL *ForceEarlyReturnInt) (jvmtiEnv* env,
+ jthread thread,
+ jint value);
+
+ /* 83 : Force Early Return - Long */
+ jvmtiError (JNICALL *ForceEarlyReturnLong) (jvmtiEnv* env,
+ jthread thread,
+ jlong value);
+
+ /* 84 : Force Early Return - Float */
+ jvmtiError (JNICALL *ForceEarlyReturnFloat) (jvmtiEnv* env,
+ jthread thread,
+ jfloat value);
+
+ /* 85 : Force Early Return - Double */
+ jvmtiError (JNICALL *ForceEarlyReturnDouble) (jvmtiEnv* env,
+ jthread thread,
+ jdouble value);
+
+ /* 86 : Force Early Return - Void */
+ jvmtiError (JNICALL *ForceEarlyReturnVoid) (jvmtiEnv* env,
+ jthread thread);
+
+ /* 87 : Redefine Classes */
+ jvmtiError (JNICALL *RedefineClasses) (jvmtiEnv* env,
+ jint class_count,
+ const jvmtiClassDefinition* class_definitions);
+
+ /* 88 : Get Version Number */
+ jvmtiError (JNICALL *GetVersionNumber) (jvmtiEnv* env,
+ jint* version_ptr);
+
+ /* 89 : Get Capabilities */
+ jvmtiError (JNICALL *GetCapabilities) (jvmtiEnv* env,
+ jvmtiCapabilities* capabilities_ptr);
+
+ /* 90 : Get Source Debug Extension */
+ jvmtiError (JNICALL *GetSourceDebugExtension) (jvmtiEnv* env,
+ jclass klass,
+ char** source_debug_extension_ptr);
+
+ /* 91 : Is Method Obsolete */
+ jvmtiError (JNICALL *IsMethodObsolete) (jvmtiEnv* env,
+ jmethodID method,
+ jboolean* is_obsolete_ptr);
+
+ /* 92 : Suspend Thread List */
+ jvmtiError (JNICALL *SuspendThreadList) (jvmtiEnv* env,
+ jint request_count,
+ const jthread* request_list,
+ jvmtiError* results);
+
+ /* 93 : Resume Thread List */
+ jvmtiError (JNICALL *ResumeThreadList) (jvmtiEnv* env,
+ jint request_count,
+ const jthread* request_list,
+ jvmtiError* results);
+
+ /* 94 : RESERVED */
+ void *reserved94;
+
+ /* 95 : RESERVED */
+ void *reserved95;
+
+ /* 96 : RESERVED */
+ void *reserved96;
+
+ /* 97 : RESERVED */
+ void *reserved97;
+
+ /* 98 : RESERVED */
+ void *reserved98;
+
+ /* 99 : RESERVED */
+ void *reserved99;
+
+ /* 100 : Get All Stack Traces */
+ jvmtiError (JNICALL *GetAllStackTraces) (jvmtiEnv* env,
+ jint max_frame_count,
+ jvmtiStackInfo** stack_info_ptr,
+ jint* thread_count_ptr);
+
+ /* 101 : Get Thread List Stack Traces */
+ jvmtiError (JNICALL *GetThreadListStackTraces) (jvmtiEnv* env,
+ jint thread_count,
+ const jthread* thread_list,
+ jint max_frame_count,
+ jvmtiStackInfo** stack_info_ptr);
+
+ /* 102 : Get Thread Local Storage */
+ jvmtiError (JNICALL *GetThreadLocalStorage) (jvmtiEnv* env,
+ jthread thread,
+ void** data_ptr);
+
+ /* 103 : Set Thread Local Storage */
+ jvmtiError (JNICALL *SetThreadLocalStorage) (jvmtiEnv* env,
+ jthread thread,
+ const void* data);
+
+ /* 104 : Get Stack Trace */
+ jvmtiError (JNICALL *GetStackTrace) (jvmtiEnv* env,
+ jthread thread,
+ jint start_depth,
+ jint max_frame_count,
+ jvmtiFrameInfo* frame_buffer,
+ jint* count_ptr);
+
+ /* 105 : RESERVED */
+ void *reserved105;
+
+ /* 106 : Get Tag */
+ jvmtiError (JNICALL *GetTag) (jvmtiEnv* env,
+ jobject object,
+ jlong* tag_ptr);
+
+ /* 107 : Set Tag */
+ jvmtiError (JNICALL *SetTag) (jvmtiEnv* env,
+ jobject object,
+ jlong tag);
+
+ /* 108 : Force Garbage Collection */
+ jvmtiError (JNICALL *ForceGarbageCollection) (jvmtiEnv* env);
+
+ /* 109 : Iterate Over Objects Reachable From Object */
+ jvmtiError (JNICALL *IterateOverObjectsReachableFromObject) (jvmtiEnv* env,
+ jobject object,
+ jvmtiObjectReferenceCallback object_reference_callback,
+ const void* user_data);
+
+ /* 110 : Iterate Over Reachable Objects */
+ jvmtiError (JNICALL *IterateOverReachableObjects) (jvmtiEnv* env,
+ jvmtiHeapRootCallback heap_root_callback,
+ jvmtiStackReferenceCallback stack_ref_callback,
+ jvmtiObjectReferenceCallback object_ref_callback,
+ const void* user_data);
+
+ /* 111 : Iterate Over Heap */
+ jvmtiError (JNICALL *IterateOverHeap) (jvmtiEnv* env,
+ jvmtiHeapObjectFilter object_filter,
+ jvmtiHeapObjectCallback heap_object_callback,
+ const void* user_data);
+
+ /* 112 : Iterate Over Instances Of Class */
+ jvmtiError (JNICALL *IterateOverInstancesOfClass) (jvmtiEnv* env,
+ jclass klass,
+ jvmtiHeapObjectFilter object_filter,
+ jvmtiHeapObjectCallback heap_object_callback,
+ const void* user_data);
+
+ /* 113 : RESERVED */
+ void *reserved113;
+
+ /* 114 : Get Objects With Tags */
+ jvmtiError (JNICALL *GetObjectsWithTags) (jvmtiEnv* env,
+ jint tag_count,
+ const jlong* tags,
+ jint* count_ptr,
+ jobject** object_result_ptr,
+ jlong** tag_result_ptr);
+
+ /* 115 : Follow References */
+ jvmtiError (JNICALL *FollowReferences) (jvmtiEnv* env,
+ jint heap_filter,
+ jclass klass,
+ jobject initial_object,
+ const jvmtiHeapCallbacks* callbacks,
+ const void* user_data);
+
+ /* 116 : Iterate Through Heap */
+ jvmtiError (JNICALL *IterateThroughHeap) (jvmtiEnv* env,
+ jint heap_filter,
+ jclass klass,
+ const jvmtiHeapCallbacks* callbacks,
+ const void* user_data);
+
+ /* 117 : RESERVED */
+ void *reserved117;
+
+ /* 118 : RESERVED */
+ void *reserved118;
+
+ /* 119 : RESERVED */
+ void *reserved119;
+
+ /* 120 : Set JNI Function Table */
+ jvmtiError (JNICALL *SetJNIFunctionTable) (jvmtiEnv* env,
+ const jniNativeInterface* function_table);
+
+ /* 121 : Get JNI Function Table */
+ jvmtiError (JNICALL *GetJNIFunctionTable) (jvmtiEnv* env,
+ jniNativeInterface** function_table);
+
+ /* 122 : Set Event Callbacks */
+ jvmtiError (JNICALL *SetEventCallbacks) (jvmtiEnv* env,
+ const jvmtiEventCallbacks* callbacks,
+ jint size_of_callbacks);
+
+ /* 123 : Generate Events */
+ jvmtiError (JNICALL *GenerateEvents) (jvmtiEnv* env,
+ jvmtiEvent event_type);
+
+ /* 124 : Get Extension Functions */
+ jvmtiError (JNICALL *GetExtensionFunctions) (jvmtiEnv* env,
+ jint* extension_count_ptr,
+ jvmtiExtensionFunctionInfo** extensions);
+
+ /* 125 : Get Extension Events */
+ jvmtiError (JNICALL *GetExtensionEvents) (jvmtiEnv* env,
+ jint* extension_count_ptr,
+ jvmtiExtensionEventInfo** extensions);
+
+ /* 126 : Set Extension Event Callback */
+ jvmtiError (JNICALL *SetExtensionEventCallback) (jvmtiEnv* env,
+ jint extension_event_index,
+ jvmtiExtensionEvent callback);
+
+ /* 127 : Dispose Environment */
+ jvmtiError (JNICALL *DisposeEnvironment) (jvmtiEnv* env);
+
+ /* 128 : Get Error Name */
+ jvmtiError (JNICALL *GetErrorName) (jvmtiEnv* env,
+ jvmtiError error,
+ char** name_ptr);
+
+ /* 129 : Get JLocation Format */
+ jvmtiError (JNICALL *GetJLocationFormat) (jvmtiEnv* env,
+ jvmtiJlocationFormat* format_ptr);
+
+ /* 130 : Get System Properties */
+ jvmtiError (JNICALL *GetSystemProperties) (jvmtiEnv* env,
+ jint* count_ptr,
+ char*** property_ptr);
+
+ /* 131 : Get System Property */
+ jvmtiError (JNICALL *GetSystemProperty) (jvmtiEnv* env,
+ const char* property,
+ char** value_ptr);
+
+ /* 132 : Set System Property */
+ jvmtiError (JNICALL *SetSystemProperty) (jvmtiEnv* env,
+ const char* property,
+ const char* value);
+
+ /* 133 : Get Phase */
+ jvmtiError (JNICALL *GetPhase) (jvmtiEnv* env,
+ jvmtiPhase* phase_ptr);
+
+ /* 134 : Get Current Thread CPU Timer Information */
+ jvmtiError (JNICALL *GetCurrentThreadCpuTimerInfo) (jvmtiEnv* env,
+ jvmtiTimerInfo* info_ptr);
+
+ /* 135 : Get Current Thread CPU Time */
+ jvmtiError (JNICALL *GetCurrentThreadCpuTime) (jvmtiEnv* env,
+ jlong* nanos_ptr);
+
+ /* 136 : Get Thread CPU Timer Information */
+ jvmtiError (JNICALL *GetThreadCpuTimerInfo) (jvmtiEnv* env,
+ jvmtiTimerInfo* info_ptr);
+
+ /* 137 : Get Thread CPU Time */
+ jvmtiError (JNICALL *GetThreadCpuTime) (jvmtiEnv* env,
+ jthread thread,
+ jlong* nanos_ptr);
+
+ /* 138 : Get Timer Information */
+ jvmtiError (JNICALL *GetTimerInfo) (jvmtiEnv* env,
+ jvmtiTimerInfo* info_ptr);
+
+ /* 139 : Get Time */
+ jvmtiError (JNICALL *GetTime) (jvmtiEnv* env,
+ jlong* nanos_ptr);
+
+ /* 140 : Get Potential Capabilities */
+ jvmtiError (JNICALL *GetPotentialCapabilities) (jvmtiEnv* env,
+ jvmtiCapabilities* capabilities_ptr);
+
+ /* 141 : RESERVED */
+ void *reserved141;
+
+ /* 142 : Add Capabilities */
+ jvmtiError (JNICALL *AddCapabilities) (jvmtiEnv* env,
+ const jvmtiCapabilities* capabilities_ptr);
+
+ /* 143 : Relinquish Capabilities */
+ jvmtiError (JNICALL *RelinquishCapabilities) (jvmtiEnv* env,
+ const jvmtiCapabilities* capabilities_ptr);
+
+ /* 144 : Get Available Processors */
+ jvmtiError (JNICALL *GetAvailableProcessors) (jvmtiEnv* env,
+ jint* processor_count_ptr);
+
+ /* 145 : Get Class Version Numbers */
+ jvmtiError (JNICALL *GetClassVersionNumbers) (jvmtiEnv* env,
+ jclass klass,
+ jint* minor_version_ptr,
+ jint* major_version_ptr);
+
+ /* 146 : Get Constant Pool */
+ jvmtiError (JNICALL *GetConstantPool) (jvmtiEnv* env,
+ jclass klass,
+ jint* constant_pool_count_ptr,
+ jint* constant_pool_byte_count_ptr,
+ unsigned char** constant_pool_bytes_ptr);
+
+ /* 147 : Get Environment Local Storage */
+ jvmtiError (JNICALL *GetEnvironmentLocalStorage) (jvmtiEnv* env,
+ void** data_ptr);
+
+ /* 148 : Set Environment Local Storage */
+ jvmtiError (JNICALL *SetEnvironmentLocalStorage) (jvmtiEnv* env,
+ const void* data);
+
+ /* 149 : Add To Bootstrap Class Loader Search */
+ jvmtiError (JNICALL *AddToBootstrapClassLoaderSearch) (jvmtiEnv* env,
+ const char* segment);
+
+ /* 150 : Set Verbose Flag */
+ jvmtiError (JNICALL *SetVerboseFlag) (jvmtiEnv* env,
+ jvmtiVerboseFlag flag,
+ jboolean value);
+
+ /* 151 : Add To System Class Loader Search */
+ jvmtiError (JNICALL *AddToSystemClassLoaderSearch) (jvmtiEnv* env,
+ const char* segment);
+
+ /* 152 : Retransform Classes */
+ jvmtiError (JNICALL *RetransformClasses) (jvmtiEnv* env,
+ jint class_count,
+ const jclass* classes);
+
+ /* 153 : Get Owned Monitor Stack Depth Info */
+ jvmtiError (JNICALL *GetOwnedMonitorStackDepthInfo) (jvmtiEnv* env,
+ jthread thread,
+ jint* monitor_info_count_ptr,
+ jvmtiMonitorStackDepthInfo** monitor_info_ptr);
+
+ /* 154 : Get Object Size */
+ jvmtiError (JNICALL *GetObjectSize) (jvmtiEnv* env,
+ jobject object,
+ jlong* size_ptr);
+
+ /* 155 : Get Local Instance */
+ jvmtiError (JNICALL *GetLocalInstance) (jvmtiEnv* env,
+ jthread thread,
+ jint depth,
+ jobject* value_ptr);
+
+} jvmtiInterface_1;
+
+struct _jvmtiEnv {
+ const struct jvmtiInterface_1_ *functions;
+#ifdef __cplusplus
+
+
+ jvmtiError Allocate(jlong size,
+ unsigned char** mem_ptr) {
+ return functions->Allocate(this, size, mem_ptr);
+ }
+
+ jvmtiError Deallocate(unsigned char* mem) {
+ return functions->Deallocate(this, mem);
+ }
+
+ jvmtiError GetThreadState(jthread thread,
+ jint* thread_state_ptr) {
+ return functions->GetThreadState(this, thread, thread_state_ptr);
+ }
+
+ jvmtiError GetCurrentThread(jthread* thread_ptr) {
+ return functions->GetCurrentThread(this, thread_ptr);
+ }
+
+ jvmtiError GetAllThreads(jint* threads_count_ptr,
+ jthread** threads_ptr) {
+ return functions->GetAllThreads(this, threads_count_ptr, threads_ptr);
+ }
+
+ jvmtiError SuspendThread(jthread thread) {
+ return functions->SuspendThread(this, thread);
+ }
+
+ jvmtiError SuspendThreadList(jint request_count,
+ const jthread* request_list,
+ jvmtiError* results) {
+ return functions->SuspendThreadList(this, request_count, request_list, results);
+ }
+
+ jvmtiError ResumeThread(jthread thread) {
+ return functions->ResumeThread(this, thread);
+ }
+
+ jvmtiError ResumeThreadList(jint request_count,
+ const jthread* request_list,
+ jvmtiError* results) {
+ return functions->ResumeThreadList(this, request_count, request_list, results);
+ }
+
+ jvmtiError StopThread(jthread thread,
+ jobject exception) {
+ return functions->StopThread(this, thread, exception);
+ }
+
+ jvmtiError InterruptThread(jthread thread) {
+ return functions->InterruptThread(this, thread);
+ }
+
+ jvmtiError GetThreadInfo(jthread thread,
+ jvmtiThreadInfo* info_ptr) {
+ return functions->GetThreadInfo(this, thread, info_ptr);
+ }
+
+ jvmtiError GetOwnedMonitorInfo(jthread thread,
+ jint* owned_monitor_count_ptr,
+ jobject** owned_monitors_ptr) {
+ return functions->GetOwnedMonitorInfo(this, thread, owned_monitor_count_ptr, owned_monitors_ptr);
+ }
+
+ jvmtiError GetOwnedMonitorStackDepthInfo(jthread thread,
+ jint* monitor_info_count_ptr,
+ jvmtiMonitorStackDepthInfo** monitor_info_ptr) {
+ return functions->GetOwnedMonitorStackDepthInfo(this, thread, monitor_info_count_ptr, monitor_info_ptr);
+ }
+
+ jvmtiError GetCurrentContendedMonitor(jthread thread,
+ jobject* monitor_ptr) {
+ return functions->GetCurrentContendedMonitor(this, thread, monitor_ptr);
+ }
+
+ jvmtiError RunAgentThread(jthread thread,
+ jvmtiStartFunction proc,
+ const void* arg,
+ jint priority) {
+ return functions->RunAgentThread(this, thread, proc, arg, priority);
+ }
+
+ jvmtiError SetThreadLocalStorage(jthread thread,
+ const void* data) {
+ return functions->SetThreadLocalStorage(this, thread, data);
+ }
+
+ jvmtiError GetThreadLocalStorage(jthread thread,
+ void** data_ptr) {
+ return functions->GetThreadLocalStorage(this, thread, data_ptr);
+ }
+
+ jvmtiError GetTopThreadGroups(jint* group_count_ptr,
+ jthreadGroup** groups_ptr) {
+ return functions->GetTopThreadGroups(this, group_count_ptr, groups_ptr);
+ }
+
+ jvmtiError GetThreadGroupInfo(jthreadGroup group,
+ jvmtiThreadGroupInfo* info_ptr) {
+ return functions->GetThreadGroupInfo(this, group, info_ptr);
+ }
+
+ jvmtiError GetThreadGroupChildren(jthreadGroup group,
+ jint* thread_count_ptr,
+ jthread** threads_ptr,
+ jint* group_count_ptr,
+ jthreadGroup** groups_ptr) {
+ return functions->GetThreadGroupChildren(this, group, thread_count_ptr, threads_ptr, group_count_ptr, groups_ptr);
+ }
+
+ jvmtiError GetStackTrace(jthread thread,
+ jint start_depth,
+ jint max_frame_count,
+ jvmtiFrameInfo* frame_buffer,
+ jint* count_ptr) {
+ return functions->GetStackTrace(this, thread, start_depth, max_frame_count, frame_buffer, count_ptr);
+ }
+
+ jvmtiError GetAllStackTraces(jint max_frame_count,
+ jvmtiStackInfo** stack_info_ptr,
+ jint* thread_count_ptr) {
+ return functions->GetAllStackTraces(this, max_frame_count, stack_info_ptr, thread_count_ptr);
+ }
+
+ jvmtiError GetThreadListStackTraces(jint thread_count,
+ const jthread* thread_list,
+ jint max_frame_count,
+ jvmtiStackInfo** stack_info_ptr) {
+ return functions->GetThreadListStackTraces(this, thread_count, thread_list, max_frame_count, stack_info_ptr);
+ }
+
+ jvmtiError GetFrameCount(jthread thread,
+ jint* count_ptr) {
+ return functions->GetFrameCount(this, thread, count_ptr);
+ }
+
+ jvmtiError PopFrame(jthread thread) {
+ return functions->PopFrame(this, thread);
+ }
+
+ jvmtiError GetFrameLocation(jthread thread,
+ jint depth,
+ jmethodID* method_ptr,
+ jlocation* location_ptr) {
+ return functions->GetFrameLocation(this, thread, depth, method_ptr, location_ptr);
+ }
+
+ jvmtiError NotifyFramePop(jthread thread,
+ jint depth) {
+ return functions->NotifyFramePop(this, thread, depth);
+ }
+
+ jvmtiError ForceEarlyReturnObject(jthread thread,
+ jobject value) {
+ return functions->ForceEarlyReturnObject(this, thread, value);
+ }
+
+ jvmtiError ForceEarlyReturnInt(jthread thread,
+ jint value) {
+ return functions->ForceEarlyReturnInt(this, thread, value);
+ }
+
+ jvmtiError ForceEarlyReturnLong(jthread thread,
+ jlong value) {
+ return functions->ForceEarlyReturnLong(this, thread, value);
+ }
+
+ jvmtiError ForceEarlyReturnFloat(jthread thread,
+ jfloat value) {
+ return functions->ForceEarlyReturnFloat(this, thread, value);
+ }
+
+ jvmtiError ForceEarlyReturnDouble(jthread thread,
+ jdouble value) {
+ return functions->ForceEarlyReturnDouble(this, thread, value);
+ }
+
+ jvmtiError ForceEarlyReturnVoid(jthread thread) {
+ return functions->ForceEarlyReturnVoid(this, thread);
+ }
+
+ jvmtiError FollowReferences(jint heap_filter,
+ jclass klass,
+ jobject initial_object,
+ const jvmtiHeapCallbacks* callbacks,
+ const void* user_data) {
+ return functions->FollowReferences(this, heap_filter, klass, initial_object, callbacks, user_data);
+ }
+
+ jvmtiError IterateThroughHeap(jint heap_filter,
+ jclass klass,
+ const jvmtiHeapCallbacks* callbacks,
+ const void* user_data) {
+ return functions->IterateThroughHeap(this, heap_filter, klass, callbacks, user_data);
+ }
+
+ jvmtiError GetTag(jobject object,
+ jlong* tag_ptr) {
+ return functions->GetTag(this, object, tag_ptr);
+ }
+
+ jvmtiError SetTag(jobject object,
+ jlong tag) {
+ return functions->SetTag(this, object, tag);
+ }
+
+ jvmtiError GetObjectsWithTags(jint tag_count,
+ const jlong* tags,
+ jint* count_ptr,
+ jobject** object_result_ptr,
+ jlong** tag_result_ptr) {
+ return functions->GetObjectsWithTags(this, tag_count, tags, count_ptr, object_result_ptr, tag_result_ptr);
+ }
+
+ jvmtiError ForceGarbageCollection() {
+ return functions->ForceGarbageCollection(this);
+ }
+
+ jvmtiError IterateOverObjectsReachableFromObject(jobject object,
+ jvmtiObjectReferenceCallback object_reference_callback,
+ const void* user_data) {
+ return functions->IterateOverObjectsReachableFromObject(this, object, object_reference_callback, user_data);
+ }
+
+ jvmtiError IterateOverReachableObjects(jvmtiHeapRootCallback heap_root_callback,
+ jvmtiStackReferenceCallback stack_ref_callback,
+ jvmtiObjectReferenceCallback object_ref_callback,
+ const void* user_data) {
+ return functions->IterateOverReachableObjects(this, heap_root_callback, stack_ref_callback, object_ref_callback, user_data);
+ }
+
+ jvmtiError IterateOverHeap(jvmtiHeapObjectFilter object_filter,
+ jvmtiHeapObjectCallback heap_object_callback,
+ const void* user_data) {
+ return functions->IterateOverHeap(this, object_filter, heap_object_callback, user_data);
+ }
+
+ jvmtiError IterateOverInstancesOfClass(jclass klass,
+ jvmtiHeapObjectFilter object_filter,
+ jvmtiHeapObjectCallback heap_object_callback,
+ const void* user_data) {
+ return functions->IterateOverInstancesOfClass(this, klass, object_filter, heap_object_callback, user_data);
+ }
+
+ jvmtiError GetLocalObject(jthread thread,
+ jint depth,
+ jint slot,
+ jobject* value_ptr) {
+ return functions->GetLocalObject(this, thread, depth, slot, value_ptr);
+ }
+
+ jvmtiError GetLocalInstance(jthread thread,
+ jint depth,
+ jobject* value_ptr) {
+ return functions->GetLocalInstance(this, thread, depth, value_ptr);
+ }
+
+ jvmtiError GetLocalInt(jthread thread,
+ jint depth,
+ jint slot,
+ jint* value_ptr) {
+ return functions->GetLocalInt(this, thread, depth, slot, value_ptr);
+ }
+
+ jvmtiError GetLocalLong(jthread thread,
+ jint depth,
+ jint slot,
+ jlong* value_ptr) {
+ return functions->GetLocalLong(this, thread, depth, slot, value_ptr);
+ }
+
+ jvmtiError GetLocalFloat(jthread thread,
+ jint depth,
+ jint slot,
+ jfloat* value_ptr) {
+ return functions->GetLocalFloat(this, thread, depth, slot, value_ptr);
+ }
+
+ jvmtiError GetLocalDouble(jthread thread,
+ jint depth,
+ jint slot,
+ jdouble* value_ptr) {
+ return functions->GetLocalDouble(this, thread, depth, slot, value_ptr);
+ }
+
+ jvmtiError SetLocalObject(jthread thread,
+ jint depth,
+ jint slot,
+ jobject value) {
+ return functions->SetLocalObject(this, thread, depth, slot, value);
+ }
+
+ jvmtiError SetLocalInt(jthread thread,
+ jint depth,
+ jint slot,
+ jint value) {
+ return functions->SetLocalInt(this, thread, depth, slot, value);
+ }
+
+ jvmtiError SetLocalLong(jthread thread,
+ jint depth,
+ jint slot,
+ jlong value) {
+ return functions->SetLocalLong(this, thread, depth, slot, value);
+ }
+
+ jvmtiError SetLocalFloat(jthread thread,
+ jint depth,
+ jint slot,
+ jfloat value) {
+ return functions->SetLocalFloat(this, thread, depth, slot, value);
+ }
+
+ jvmtiError SetLocalDouble(jthread thread,
+ jint depth,
+ jint slot,
+ jdouble value) {
+ return functions->SetLocalDouble(this, thread, depth, slot, value);
+ }
+
+ jvmtiError SetBreakpoint(jmethodID method,
+ jlocation location) {
+ return functions->SetBreakpoint(this, method, location);
+ }
+
+ jvmtiError ClearBreakpoint(jmethodID method,
+ jlocation location) {
+ return functions->ClearBreakpoint(this, method, location);
+ }
+
+ jvmtiError SetFieldAccessWatch(jclass klass,
+ jfieldID field) {
+ return functions->SetFieldAccessWatch(this, klass, field);
+ }
+
+ jvmtiError ClearFieldAccessWatch(jclass klass,
+ jfieldID field) {
+ return functions->ClearFieldAccessWatch(this, klass, field);
+ }
+
+ jvmtiError SetFieldModificationWatch(jclass klass,
+ jfieldID field) {
+ return functions->SetFieldModificationWatch(this, klass, field);
+ }
+
+ jvmtiError ClearFieldModificationWatch(jclass klass,
+ jfieldID field) {
+ return functions->ClearFieldModificationWatch(this, klass, field);
+ }
+
+ jvmtiError GetLoadedClasses(jint* class_count_ptr,
+ jclass** classes_ptr) {
+ return functions->GetLoadedClasses(this, class_count_ptr, classes_ptr);
+ }
+
+ jvmtiError GetClassLoaderClasses(jobject initiating_loader,
+ jint* class_count_ptr,
+ jclass** classes_ptr) {
+ return functions->GetClassLoaderClasses(this, initiating_loader, class_count_ptr, classes_ptr);
+ }
+
+ jvmtiError GetClassSignature(jclass klass,
+ char** signature_ptr,
+ char** generic_ptr) {
+ return functions->GetClassSignature(this, klass, signature_ptr, generic_ptr);
+ }
+
+ jvmtiError GetClassStatus(jclass klass,
+ jint* status_ptr) {
+ return functions->GetClassStatus(this, klass, status_ptr);
+ }
+
+ jvmtiError GetSourceFileName(jclass klass,
+ char** source_name_ptr) {
+ return functions->GetSourceFileName(this, klass, source_name_ptr);
+ }
+
+ jvmtiError GetClassModifiers(jclass klass,
+ jint* modifiers_ptr) {
+ return functions->GetClassModifiers(this, klass, modifiers_ptr);
+ }
+
+ jvmtiError GetClassMethods(jclass klass,
+ jint* method_count_ptr,
+ jmethodID** methods_ptr) {
+ return functions->GetClassMethods(this, klass, method_count_ptr, methods_ptr);
+ }
+
+ jvmtiError GetClassFields(jclass klass,
+ jint* field_count_ptr,
+ jfieldID** fields_ptr) {
+ return functions->GetClassFields(this, klass, field_count_ptr, fields_ptr);
+ }
+
+ jvmtiError GetImplementedInterfaces(jclass klass,
+ jint* interface_count_ptr,
+ jclass** interfaces_ptr) {
+ return functions->GetImplementedInterfaces(this, klass, interface_count_ptr, interfaces_ptr);
+ }
+
+ jvmtiError GetClassVersionNumbers(jclass klass,
+ jint* minor_version_ptr,
+ jint* major_version_ptr) {
+ return functions->GetClassVersionNumbers(this, klass, minor_version_ptr, major_version_ptr);
+ }
+
+ jvmtiError GetConstantPool(jclass klass,
+ jint* constant_pool_count_ptr,
+ jint* constant_pool_byte_count_ptr,
+ unsigned char** constant_pool_bytes_ptr) {
+ return functions->GetConstantPool(this, klass, constant_pool_count_ptr, constant_pool_byte_count_ptr, constant_pool_bytes_ptr);
+ }
+
+ jvmtiError IsInterface(jclass klass,
+ jboolean* is_interface_ptr) {
+ return functions->IsInterface(this, klass, is_interface_ptr);
+ }
+
+ jvmtiError IsArrayClass(jclass klass,
+ jboolean* is_array_class_ptr) {
+ return functions->IsArrayClass(this, klass, is_array_class_ptr);
+ }
+
+ jvmtiError IsModifiableClass(jclass klass,
+ jboolean* is_modifiable_class_ptr) {
+ return functions->IsModifiableClass(this, klass, is_modifiable_class_ptr);
+ }
+
+ jvmtiError GetClassLoader(jclass klass,
+ jobject* classloader_ptr) {
+ return functions->GetClassLoader(this, klass, classloader_ptr);
+ }
+
+ jvmtiError GetSourceDebugExtension(jclass klass,
+ char** source_debug_extension_ptr) {
+ return functions->GetSourceDebugExtension(this, klass, source_debug_extension_ptr);
+ }
+
+ jvmtiError RetransformClasses(jint class_count,
+ const jclass* classes) {
+ return functions->RetransformClasses(this, class_count, classes);
+ }
+
+ jvmtiError RedefineClasses(jint class_count,
+ const jvmtiClassDefinition* class_definitions) {
+ return functions->RedefineClasses(this, class_count, class_definitions);
+ }
+
+ jvmtiError GetObjectSize(jobject object,
+ jlong* size_ptr) {
+ return functions->GetObjectSize(this, object, size_ptr);
+ }
+
+ jvmtiError GetObjectHashCode(jobject object,
+ jint* hash_code_ptr) {
+ return functions->GetObjectHashCode(this, object, hash_code_ptr);
+ }
+
+ jvmtiError GetObjectMonitorUsage(jobject object,
+ jvmtiMonitorUsage* info_ptr) {
+ return functions->GetObjectMonitorUsage(this, object, info_ptr);
+ }
+
+ jvmtiError GetFieldName(jclass klass,
+ jfieldID field,
+ char** name_ptr,
+ char** signature_ptr,
+ char** generic_ptr) {
+ return functions->GetFieldName(this, klass, field, name_ptr, signature_ptr, generic_ptr);
+ }
+
+ jvmtiError GetFieldDeclaringClass(jclass klass,
+ jfieldID field,
+ jclass* declaring_class_ptr) {
+ return functions->GetFieldDeclaringClass(this, klass, field, declaring_class_ptr);
+ }
+
+ jvmtiError GetFieldModifiers(jclass klass,
+ jfieldID field,
+ jint* modifiers_ptr) {
+ return functions->GetFieldModifiers(this, klass, field, modifiers_ptr);
+ }
+
+ jvmtiError IsFieldSynthetic(jclass klass,
+ jfieldID field,
+ jboolean* is_synthetic_ptr) {
+ return functions->IsFieldSynthetic(this, klass, field, is_synthetic_ptr);
+ }
+
+ jvmtiError GetMethodName(jmethodID method,
+ char** name_ptr,
+ char** signature_ptr,
+ char** generic_ptr) {
+ return functions->GetMethodName(this, method, name_ptr, signature_ptr, generic_ptr);
+ }
+
+ jvmtiError GetMethodDeclaringClass(jmethodID method,
+ jclass* declaring_class_ptr) {
+ return functions->GetMethodDeclaringClass(this, method, declaring_class_ptr);
+ }
+
+ jvmtiError GetMethodModifiers(jmethodID method,
+ jint* modifiers_ptr) {
+ return functions->GetMethodModifiers(this, method, modifiers_ptr);
+ }
+
+ jvmtiError GetMaxLocals(jmethodID method,
+ jint* max_ptr) {
+ return functions->GetMaxLocals(this, method, max_ptr);
+ }
+
+ jvmtiError GetArgumentsSize(jmethodID method,
+ jint* size_ptr) {
+ return functions->GetArgumentsSize(this, method, size_ptr);
+ }
+
+ jvmtiError GetLineNumberTable(jmethodID method,
+ jint* entry_count_ptr,
+ jvmtiLineNumberEntry** table_ptr) {
+ return functions->GetLineNumberTable(this, method, entry_count_ptr, table_ptr);
+ }
+
+ jvmtiError GetMethodLocation(jmethodID method,
+ jlocation* start_location_ptr,
+ jlocation* end_location_ptr) {
+ return functions->GetMethodLocation(this, method, start_location_ptr, end_location_ptr);
+ }
+
+ jvmtiError GetLocalVariableTable(jmethodID method,
+ jint* entry_count_ptr,
+ jvmtiLocalVariableEntry** table_ptr) {
+ return functions->GetLocalVariableTable(this, method, entry_count_ptr, table_ptr);
+ }
+
+ jvmtiError GetBytecodes(jmethodID method,
+ jint* bytecode_count_ptr,
+ unsigned char** bytecodes_ptr) {
+ return functions->GetBytecodes(this, method, bytecode_count_ptr, bytecodes_ptr);
+ }
+
+ jvmtiError IsMethodNative(jmethodID method,
+ jboolean* is_native_ptr) {
+ return functions->IsMethodNative(this, method, is_native_ptr);
+ }
+
+ jvmtiError IsMethodSynthetic(jmethodID method,
+ jboolean* is_synthetic_ptr) {
+ return functions->IsMethodSynthetic(this, method, is_synthetic_ptr);
+ }
+
+ jvmtiError IsMethodObsolete(jmethodID method,
+ jboolean* is_obsolete_ptr) {
+ return functions->IsMethodObsolete(this, method, is_obsolete_ptr);
+ }
+
+ jvmtiError SetNativeMethodPrefix(const char* prefix) {
+ return functions->SetNativeMethodPrefix(this, prefix);
+ }
+
+ jvmtiError SetNativeMethodPrefixes(jint prefix_count,
+ char** prefixes) {
+ return functions->SetNativeMethodPrefixes(this, prefix_count, prefixes);
+ }
+
+ jvmtiError CreateRawMonitor(const char* name,
+ jrawMonitorID* monitor_ptr) {
+ return functions->CreateRawMonitor(this, name, monitor_ptr);
+ }
+
+ jvmtiError DestroyRawMonitor(jrawMonitorID monitor) {
+ return functions->DestroyRawMonitor(this, monitor);
+ }
+
+ jvmtiError RawMonitorEnter(jrawMonitorID monitor) {
+ return functions->RawMonitorEnter(this, monitor);
+ }
+
+ jvmtiError RawMonitorExit(jrawMonitorID monitor) {
+ return functions->RawMonitorExit(this, monitor);
+ }
+
+ jvmtiError RawMonitorWait(jrawMonitorID monitor,
+ jlong millis) {
+ return functions->RawMonitorWait(this, monitor, millis);
+ }
+
+ jvmtiError RawMonitorNotify(jrawMonitorID monitor) {
+ return functions->RawMonitorNotify(this, monitor);
+ }
+
+ jvmtiError RawMonitorNotifyAll(jrawMonitorID monitor) {
+ return functions->RawMonitorNotifyAll(this, monitor);
+ }
+
+ jvmtiError SetJNIFunctionTable(const jniNativeInterface* function_table) {
+ return functions->SetJNIFunctionTable(this, function_table);
+ }
+
+ jvmtiError GetJNIFunctionTable(jniNativeInterface** function_table) {
+ return functions->GetJNIFunctionTable(this, function_table);
+ }
+
+ jvmtiError SetEventCallbacks(const jvmtiEventCallbacks* callbacks,
+ jint size_of_callbacks) {
+ return functions->SetEventCallbacks(this, callbacks, size_of_callbacks);
+ }
+
+ jvmtiError SetEventNotificationMode(jvmtiEventMode mode,
+ jvmtiEvent event_type,
+ jthread event_thread,
+ ...) {
+ return functions->SetEventNotificationMode(this, mode, event_type, event_thread);
+ }
+
+ jvmtiError GenerateEvents(jvmtiEvent event_type) {
+ return functions->GenerateEvents(this, event_type);
+ }
+
+ jvmtiError GetExtensionFunctions(jint* extension_count_ptr,
+ jvmtiExtensionFunctionInfo** extensions) {
+ return functions->GetExtensionFunctions(this, extension_count_ptr, extensions);
+ }
+
+ jvmtiError GetExtensionEvents(jint* extension_count_ptr,
+ jvmtiExtensionEventInfo** extensions) {
+ return functions->GetExtensionEvents(this, extension_count_ptr, extensions);
+ }
+
+ jvmtiError SetExtensionEventCallback(jint extension_event_index,
+ jvmtiExtensionEvent callback) {
+ return functions->SetExtensionEventCallback(this, extension_event_index, callback);
+ }
+
+ jvmtiError GetPotentialCapabilities(jvmtiCapabilities* capabilities_ptr) {
+ return functions->GetPotentialCapabilities(this, capabilities_ptr);
+ }
+
+ jvmtiError AddCapabilities(const jvmtiCapabilities* capabilities_ptr) {
+ return functions->AddCapabilities(this, capabilities_ptr);
+ }
+
+ jvmtiError RelinquishCapabilities(const jvmtiCapabilities* capabilities_ptr) {
+ return functions->RelinquishCapabilities(this, capabilities_ptr);
+ }
+
+ jvmtiError GetCapabilities(jvmtiCapabilities* capabilities_ptr) {
+ return functions->GetCapabilities(this, capabilities_ptr);
+ }
+
+ jvmtiError GetCurrentThreadCpuTimerInfo(jvmtiTimerInfo* info_ptr) {
+ return functions->GetCurrentThreadCpuTimerInfo(this, info_ptr);
+ }
+
+ jvmtiError GetCurrentThreadCpuTime(jlong* nanos_ptr) {
+ return functions->GetCurrentThreadCpuTime(this, nanos_ptr);
+ }
+
+ jvmtiError GetThreadCpuTimerInfo(jvmtiTimerInfo* info_ptr) {
+ return functions->GetThreadCpuTimerInfo(this, info_ptr);
+ }
+
+ jvmtiError GetThreadCpuTime(jthread thread,
+ jlong* nanos_ptr) {
+ return functions->GetThreadCpuTime(this, thread, nanos_ptr);
+ }
+
+ jvmtiError GetTimerInfo(jvmtiTimerInfo* info_ptr) {
+ return functions->GetTimerInfo(this, info_ptr);
+ }
+
+ jvmtiError GetTime(jlong* nanos_ptr) {
+ return functions->GetTime(this, nanos_ptr);
+ }
+
+ jvmtiError GetAvailableProcessors(jint* processor_count_ptr) {
+ return functions->GetAvailableProcessors(this, processor_count_ptr);
+ }
+
+ jvmtiError AddToBootstrapClassLoaderSearch(const char* segment) {
+ return functions->AddToBootstrapClassLoaderSearch(this, segment);
+ }
+
+ jvmtiError AddToSystemClassLoaderSearch(const char* segment) {
+ return functions->AddToSystemClassLoaderSearch(this, segment);
+ }
+
+ jvmtiError GetSystemProperties(jint* count_ptr,
+ char*** property_ptr) {
+ return functions->GetSystemProperties(this, count_ptr, property_ptr);
+ }
+
+ jvmtiError GetSystemProperty(const char* property,
+ char** value_ptr) {
+ return functions->GetSystemProperty(this, property, value_ptr);
+ }
+
+ jvmtiError SetSystemProperty(const char* property,
+ const char* value) {
+ return functions->SetSystemProperty(this, property, value);
+ }
+
+ jvmtiError GetPhase(jvmtiPhase* phase_ptr) {
+ return functions->GetPhase(this, phase_ptr);
+ }
+
+ jvmtiError DisposeEnvironment() {
+ return functions->DisposeEnvironment(this);
+ }
+
+ jvmtiError SetEnvironmentLocalStorage(const void* data) {
+ return functions->SetEnvironmentLocalStorage(this, data);
+ }
+
+ jvmtiError GetEnvironmentLocalStorage(void** data_ptr) {
+ return functions->GetEnvironmentLocalStorage(this, data_ptr);
+ }
+
+ jvmtiError GetVersionNumber(jint* version_ptr) {
+ return functions->GetVersionNumber(this, version_ptr);
+ }
+
+ jvmtiError GetErrorName(jvmtiError error,
+ char** name_ptr) {
+ return functions->GetErrorName(this, error, name_ptr);
+ }
+
+ jvmtiError SetVerboseFlag(jvmtiVerboseFlag flag,
+ jboolean value) {
+ return functions->SetVerboseFlag(this, flag, value);
+ }
+
+ jvmtiError GetJLocationFormat(jvmtiJlocationFormat* format_ptr) {
+ return functions->GetJLocationFormat(this, format_ptr);
+ }
+
+#endif /* __cplusplus */
+};
+
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif /* __cplusplus */
+
+#endif /* !_JAVA_JVMTI_H_ */
+
diff --git a/love2dToAPK/tools/tools/jdk-win/include/jvmticmlr.h b/love2dToAPK/tools/tools/jdk-win/include/jvmticmlr.h
new file mode 100644
index 0000000..a9c88f3
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/include/jvmticmlr.h
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ */
+
+/*
+ * This header file defines the data structures sent by the VM
+ * through the JVMTI CompiledMethodLoad callback function via the
+ * "void * compile_info" parameter. The memory pointed to by the
+ * compile_info parameter may not be referenced after returning from
+ * the CompiledMethodLoad callback. These are VM implementation
+ * specific data structures that may evolve in future releases. A
+ * JVMTI agent should interpret a non-NULL compile_info as a pointer
+ * to a region of memory containing a list of records. In a typical
+ * usage scenario, a JVMTI agent would cast each record to a
+ * jvmtiCompiledMethodLoadRecordHeader, a struct that represents
+ * arbitrary information. This struct contains a kind field to indicate
+ * the kind of information being passed, and a pointer to the next
+ * record. If the kind field indicates inlining information, then the
+ * agent would cast the record to a jvmtiCompiledMethodLoadInlineRecord.
+ * This record contains an array of PCStackInfo structs, which indicate
+ * for every pc address what are the methods on the invocation stack.
+ * The "methods" and "bcis" fields in each PCStackInfo struct specify a
+ * 1-1 mapping between these inlined methods and their bytecode indices.
+ * This can be used to derive the proper source lines of the inlined
+ * methods.
+ */
+
+#ifndef _JVMTI_CMLR_H_
+#define _JVMTI_CMLR_H_
+
+enum {
+ JVMTI_CMLR_MAJOR_VERSION_1 = 0x00000001,
+ JVMTI_CMLR_MINOR_VERSION_0 = 0x00000000,
+
+ JVMTI_CMLR_MAJOR_VERSION = 0x00000001,
+ JVMTI_CMLR_MINOR_VERSION = 0x00000000
+
+ /*
+ * This comment is for the "JDK import from HotSpot" sanity check:
+ * version: 1.0.0
+ */
+};
+
+typedef enum {
+ JVMTI_CMLR_DUMMY = 1,
+ JVMTI_CMLR_INLINE_INFO = 2
+} jvmtiCMLRKind;
+
+/*
+ * Record that represents arbitrary information passed through JVMTI
+ * CompiledMethodLoadEvent void pointer.
+ */
+typedef struct _jvmtiCompiledMethodLoadRecordHeader {
+ jvmtiCMLRKind kind; /* id for the kind of info passed in the record */
+ jint majorinfoversion; /* major and minor info version values. Init'ed */
+ jint minorinfoversion; /* to current version value in jvmtiExport.cpp. */
+
+ struct _jvmtiCompiledMethodLoadRecordHeader* next;
+} jvmtiCompiledMethodLoadRecordHeader;
+
+/*
+ * Record that gives information about the methods on the compile-time
+ * stack at a specific pc address of a compiled method. Each element in
+ * the methods array maps to same element in the bcis array.
+ */
+typedef struct _PCStackInfo {
+ void* pc; /* the pc address for this compiled method */
+ jint numstackframes; /* number of methods on the stack */
+ jmethodID* methods; /* array of numstackframes method ids */
+ jint* bcis; /* array of numstackframes bytecode indices */
+} PCStackInfo;
+
+/*
+ * Record that contains inlining information for each pc address of
+ * an nmethod.
+ */
+typedef struct _jvmtiCompiledMethodLoadInlineRecord {
+ jvmtiCompiledMethodLoadRecordHeader header; /* common header for casting */
+ jint numpcs; /* number of pc descriptors in this nmethod */
+ PCStackInfo* pcinfo; /* array of numpcs pc descriptors */
+} jvmtiCompiledMethodLoadInlineRecord;
+
+/*
+ * Dummy record used to test that we can pass records with different
+ * information through the void pointer provided that they can be cast
+ * to a jvmtiCompiledMethodLoadRecordHeader.
+ */
+
+typedef struct _jvmtiCompiledMethodLoadDummyRecord {
+ jvmtiCompiledMethodLoadRecordHeader header; /* common header for casting */
+ char message[50];
+} jvmtiCompiledMethodLoadDummyRecord;
+
+#endif
diff --git a/love2dToAPK/tools/tools/jdk-win/include/win32/bridge/AccessBridgeCallbacks.h b/love2dToAPK/tools/tools/jdk-win/include/win32/bridge/AccessBridgeCallbacks.h
new file mode 100644
index 0000000..96653c9
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/include/win32/bridge/AccessBridgeCallbacks.h
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ */
+
+/*
+ * AccessBridgeCallbacks.h 1.17 05/03/21
+ */
+
+/*
+ * Header file defining callback typedefs for Windows routines
+ * which are called from Java (responding to events, etc.).
+ */
+
+#ifndef __AccessBridgeCallbacks_H__
+#define __AccessBridgeCallbacks_H__
+
+#include <jni.h>
+#include "AccessBridgePackages.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void (*AccessBridge_PropertyChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source,
+ wchar_t *property, wchar_t *oldValue, wchar_t *newValue);
+
+typedef void (*AccessBridge_JavaShutdownFP) (long vmID);
+typedef void (*AccessBridge_JavaShutdownFP) (long vmID);
+
+typedef void (*AccessBridge_FocusGainedFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+typedef void (*AccessBridge_FocusLostFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+
+typedef void (*AccessBridge_CaretUpdateFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+
+typedef void (*AccessBridge_MouseClickedFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+typedef void (*AccessBridge_MouseEnteredFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+typedef void (*AccessBridge_MouseExitedFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+typedef void (*AccessBridge_MousePressedFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+typedef void (*AccessBridge_MouseReleasedFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+
+typedef void (*AccessBridge_MenuCanceledFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+typedef void (*AccessBridge_MenuDeselectedFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+typedef void (*AccessBridge_MenuSelectedFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+typedef void (*AccessBridge_PopupMenuCanceledFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+typedef void (*AccessBridge_PopupMenuWillBecomeInvisibleFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+typedef void (*AccessBridge_PopupMenuWillBecomeVisibleFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+
+typedef void (*AccessBridge_PropertyNameChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source,
+ wchar_t *oldName, wchar_t *newName);
+typedef void (*AccessBridge_PropertyDescriptionChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source,
+ wchar_t *oldDescription, wchar_t *newDescription);
+typedef void (*AccessBridge_PropertyStateChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source,
+ wchar_t *oldState, wchar_t *newState);
+typedef void (*AccessBridge_PropertyValueChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source,
+ wchar_t *oldValue, wchar_t *newValue);
+typedef void (*AccessBridge_PropertySelectionChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+typedef void (*AccessBridge_PropertyTextChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+typedef void (*AccessBridge_PropertyCaretChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source,
+ int oldPosition, int newPosition);
+typedef void (*AccessBridge_PropertyVisibleDataChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source);
+typedef void (*AccessBridge_PropertyChildChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 source,
+ JOBJECT64 oldChild, JOBJECT64 newChild);
+typedef void (*AccessBridge_PropertyActiveDescendentChangeFP) (long vmID, JOBJECT64 event,
+ JOBJECT64 source,
+ JOBJECT64 oldActiveDescendent,
+ JOBJECT64 newActiveDescendent);
+
+typedef void (*AccessBridge_PropertyTableModelChangeFP) (long vmID, JOBJECT64 event, JOBJECT64 src,
+ wchar_t *oldValue, wchar_t *newValue);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/love2dToAPK/tools/tools/jdk-win/include/win32/bridge/AccessBridgeCalls.c b/love2dToAPK/tools/tools/jdk-win/include/win32/bridge/AccessBridgeCalls.c
new file mode 100644
index 0000000..c96f385
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/include/win32/bridge/AccessBridgeCalls.c
@@ -0,0 +1,1111 @@
+/*
+ * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ */
+
+/*
+ * @(#)AccessBridgeCalls.c 1.25 05/08/22
+ */
+
+/*
+ * Wrapper functions around calls to the AccessBridge DLL
+ */
+
+
+#include <windows.h>
+#include <jni.h>
+
+
+//#define ACCESSBRIDGE_32
+//#define ACCESSBRIDGE_64
+
+#include "AccessBridgeCalls.h"
+#include "AccessBridgeDebug.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ HINSTANCE theAccessBridgeInstance;
+ AccessBridgeFPs theAccessBridge;
+
+ BOOL theAccessBridgeInitializedFlag = FALSE;
+
+#define LOAD_FP(result, type, name) \
+ PrintDebugString("LOAD_FP loading: %s ...", name); \
+ if ((theAccessBridge.result = \
+ (type) GetProcAddress(theAccessBridgeInstance, name)) == (type) 0) { \
+ PrintDebugString("LOAD_FP failed: %s", name); \
+ return FALSE; \
+ }
+
+ BOOL initializeAccessBridge() {
+
+#ifdef ACCESSBRIDGE_ARCH_32 // For 32bit AT new bridge
+ theAccessBridgeInstance = LoadLibrary("WINDOWSACCESSBRIDGE-32");
+#else
+#ifdef ACCESSBRIDGE_ARCH_64 // For 64bit AT new bridge
+ theAccessBridgeInstance = LoadLibrary("WINDOWSACCESSBRIDGE-64");
+#else // legacy
+ theAccessBridgeInstance = LoadLibrary("WINDOWSACCESSBRIDGE");
+#endif
+#endif
+ if (theAccessBridgeInstance != 0) {
+ LOAD_FP(Windows_run, Windows_runFP, "Windows_run");
+
+ LOAD_FP(SetJavaShutdown, SetJavaShutdownFP, "setJavaShutdownFP");
+ LOAD_FP(SetFocusGained, SetFocusGainedFP, "setFocusGainedFP");
+ LOAD_FP(SetFocusLost, SetFocusLostFP, "setFocusLostFP");
+
+ LOAD_FP(SetCaretUpdate, SetCaretUpdateFP, "setCaretUpdateFP");
+
+ LOAD_FP(SetMouseClicked, SetMouseClickedFP, "setMouseClickedFP");
+ LOAD_FP(SetMouseEntered, SetMouseEnteredFP, "setMouseEnteredFP");
+ LOAD_FP(SetMouseExited, SetMouseExitedFP, "setMouseExitedFP");
+ LOAD_FP(SetMousePressed, SetMousePressedFP, "setMousePressedFP");
+ LOAD_FP(SetMouseReleased, SetMouseReleasedFP, "setMouseReleasedFP");
+
+ LOAD_FP(SetMenuCanceled, SetMenuCanceledFP, "setMenuCanceledFP");
+ LOAD_FP(SetMenuDeselected, SetMenuDeselectedFP, "setMenuDeselectedFP");
+ LOAD_FP(SetMenuSelected, SetMenuSelectedFP, "setMenuSelectedFP");
+ LOAD_FP(SetPopupMenuCanceled, SetPopupMenuCanceledFP, "setPopupMenuCanceledFP");
+ LOAD_FP(SetPopupMenuWillBecomeInvisible, SetPopupMenuWillBecomeInvisibleFP, "setPopupMenuWillBecomeInvisibleFP");
+ LOAD_FP(SetPopupMenuWillBecomeVisible, SetPopupMenuWillBecomeVisibleFP, "setPopupMenuWillBecomeVisibleFP");
+
+ LOAD_FP(SetPropertyNameChange, SetPropertyNameChangeFP, "setPropertyNameChangeFP");
+ LOAD_FP(SetPropertyDescriptionChange, SetPropertyDescriptionChangeFP, "setPropertyDescriptionChangeFP");
+ LOAD_FP(SetPropertyStateChange, SetPropertyStateChangeFP, "setPropertyStateChangeFP");
+ LOAD_FP(SetPropertyValueChange, SetPropertyValueChangeFP, "setPropertyValueChangeFP");
+ LOAD_FP(SetPropertySelectionChange, SetPropertySelectionChangeFP, "setPropertySelectionChangeFP");
+ LOAD_FP(SetPropertyTextChange, SetPropertyTextChangeFP, "setPropertyTextChangeFP");
+ LOAD_FP(SetPropertyCaretChange, SetPropertyCaretChangeFP, "setPropertyCaretChangeFP");
+ LOAD_FP(SetPropertyVisibleDataChange, SetPropertyVisibleDataChangeFP, "setPropertyVisibleDataChangeFP");
+ LOAD_FP(SetPropertyChildChange, SetPropertyChildChangeFP, "setPropertyChildChangeFP");
+ LOAD_FP(SetPropertyActiveDescendentChange, SetPropertyActiveDescendentChangeFP, "setPropertyActiveDescendentChangeFP");
+
+ LOAD_FP(SetPropertyTableModelChange, SetPropertyTableModelChangeFP, "setPropertyTableModelChangeFP");
+
+ LOAD_FP(ReleaseJavaObject, ReleaseJavaObjectFP, "releaseJavaObject");
+ LOAD_FP(GetVersionInfo, GetVersionInfoFP, "getVersionInfo");
+
+ LOAD_FP(IsJavaWindow, IsJavaWindowFP, "isJavaWindow");
+ LOAD_FP(IsSameObject, IsSameObjectFP, "isSameObject");
+ LOAD_FP(GetAccessibleContextFromHWND, GetAccessibleContextFromHWNDFP, "getAccessibleContextFromHWND");
+ LOAD_FP(getHWNDFromAccessibleContext, getHWNDFromAccessibleContextFP, "getHWNDFromAccessibleContext");
+
+ LOAD_FP(GetAccessibleContextAt, GetAccessibleContextAtFP, "getAccessibleContextAt");
+ LOAD_FP(GetAccessibleContextWithFocus, GetAccessibleContextWithFocusFP, "getAccessibleContextWithFocus");
+ LOAD_FP(GetAccessibleContextInfo, GetAccessibleContextInfoFP, "getAccessibleContextInfo");
+ LOAD_FP(GetAccessibleChildFromContext, GetAccessibleChildFromContextFP, "getAccessibleChildFromContext");
+ LOAD_FP(GetAccessibleParentFromContext, GetAccessibleParentFromContextFP, "getAccessibleParentFromContext");
+
+ /* begin AccessibleTable */
+ LOAD_FP(getAccessibleTableInfo, getAccessibleTableInfoFP, "getAccessibleTableInfo");
+ LOAD_FP(getAccessibleTableCellInfo, getAccessibleTableCellInfoFP, "getAccessibleTableCellInfo");
+
+ LOAD_FP(getAccessibleTableRowHeader, getAccessibleTableRowHeaderFP, "getAccessibleTableRowHeader");
+ LOAD_FP(getAccessibleTableColumnHeader, getAccessibleTableColumnHeaderFP, "getAccessibleTableColumnHeader");
+
+ LOAD_FP(getAccessibleTableRowDescription, getAccessibleTableRowDescriptionFP, "getAccessibleTableRowDescription");
+ LOAD_FP(getAccessibleTableColumnDescription, getAccessibleTableColumnDescriptionFP, "getAccessibleTableColumnDescription");
+
+ LOAD_FP(getAccessibleTableRowSelectionCount, getAccessibleTableRowSelectionCountFP,
+ "getAccessibleTableRowSelectionCount");
+ LOAD_FP(isAccessibleTableRowSelected, isAccessibleTableRowSelectedFP,
+ "isAccessibleTableRowSelected");
+ LOAD_FP(getAccessibleTableRowSelections, getAccessibleTableRowSelectionsFP,
+ "getAccessibleTableRowSelections");
+
+ LOAD_FP(getAccessibleTableColumnSelectionCount, getAccessibleTableColumnSelectionCountFP,
+ "getAccessibleTableColumnSelectionCount");
+ LOAD_FP(isAccessibleTableColumnSelected, isAccessibleTableColumnSelectedFP,
+ "isAccessibleTableColumnSelected");
+ LOAD_FP(getAccessibleTableColumnSelections, getAccessibleTableColumnSelectionsFP,
+ "getAccessibleTableColumnSelections");
+
+ LOAD_FP(getAccessibleTableRow, getAccessibleTableRowFP,
+ "getAccessibleTableRow");
+ LOAD_FP(getAccessibleTableColumn, getAccessibleTableColumnFP,
+ "getAccessibleTableColumn");
+ LOAD_FP(getAccessibleTableIndex, getAccessibleTableIndexFP,
+ "getAccessibleTableIndex");
+
+ /* end AccessibleTable */
+
+ /* AccessibleRelationSet */
+ LOAD_FP(getAccessibleRelationSet, getAccessibleRelationSetFP, "getAccessibleRelationSet");
+
+ /* AccessibleHypertext */
+ LOAD_FP(getAccessibleHypertext, getAccessibleHypertextFP, "getAccessibleHypertext");
+ LOAD_FP(activateAccessibleHyperlink, activateAccessibleHyperlinkFP, "activateAccessibleHyperlink");
+ LOAD_FP(getAccessibleHyperlinkCount, getAccessibleHyperlinkCountFP, "getAccessibleHyperlinkCount");
+ LOAD_FP(getAccessibleHypertextExt, getAccessibleHypertextExtFP, "getAccessibleHypertextExt");
+ LOAD_FP(getAccessibleHypertextLinkIndex, getAccessibleHypertextLinkIndexFP, "getAccessibleHypertextLinkIndex");
+ LOAD_FP(getAccessibleHyperlink, getAccessibleHyperlinkFP, "getAccessibleHyperlink");
+
+ /* Accessible KeyBinding, Icon and Action */
+ LOAD_FP(getAccessibleKeyBindings, getAccessibleKeyBindingsFP, "getAccessibleKeyBindings");
+ LOAD_FP(getAccessibleIcons, getAccessibleIconsFP, "getAccessibleIcons");
+ LOAD_FP(getAccessibleActions, getAccessibleActionsFP, "getAccessibleActions");
+ LOAD_FP(doAccessibleActions, doAccessibleActionsFP, "doAccessibleActions");
+
+ /* AccessibleText */
+ LOAD_FP(GetAccessibleTextInfo, GetAccessibleTextInfoFP, "getAccessibleTextInfo");
+ LOAD_FP(GetAccessibleTextItems, GetAccessibleTextItemsFP, "getAccessibleTextItems");
+ LOAD_FP(GetAccessibleTextSelectionInfo, GetAccessibleTextSelectionInfoFP, "getAccessibleTextSelectionInfo");
+ LOAD_FP(GetAccessibleTextAttributes, GetAccessibleTextAttributesFP, "getAccessibleTextAttributes");
+ LOAD_FP(GetAccessibleTextRect, GetAccessibleTextRectFP, "getAccessibleTextRect");
+ LOAD_FP(GetAccessibleTextLineBounds, GetAccessibleTextLineBoundsFP, "getAccessibleTextLineBounds");
+ LOAD_FP(GetAccessibleTextRange, GetAccessibleTextRangeFP, "getAccessibleTextRange");
+
+ LOAD_FP(GetCurrentAccessibleValueFromContext, GetCurrentAccessibleValueFromContextFP, "getCurrentAccessibleValueFromContext");
+ LOAD_FP(GetMaximumAccessibleValueFromContext, GetMaximumAccessibleValueFromContextFP, "getMaximumAccessibleValueFromContext");
+ LOAD_FP(GetMinimumAccessibleValueFromContext, GetMinimumAccessibleValueFromContextFP, "getMinimumAccessibleValueFromContext");
+
+ LOAD_FP(AddAccessibleSelectionFromContext, AddAccessibleSelectionFromContextFP, "addAccessibleSelectionFromContext");
+ LOAD_FP(ClearAccessibleSelectionFromContext, ClearAccessibleSelectionFromContextFP, "clearAccessibleSelectionFromContext");
+ LOAD_FP(GetAccessibleSelectionFromContext, GetAccessibleSelectionFromContextFP, "getAccessibleSelectionFromContext");
+ LOAD_FP(GetAccessibleSelectionCountFromContext, GetAccessibleSelectionCountFromContextFP, "getAccessibleSelectionCountFromContext");
+ LOAD_FP(IsAccessibleChildSelectedFromContext, IsAccessibleChildSelectedFromContextFP, "isAccessibleChildSelectedFromContext");
+ LOAD_FP(RemoveAccessibleSelectionFromContext, RemoveAccessibleSelectionFromContextFP, "removeAccessibleSelectionFromContext");
+ LOAD_FP(SelectAllAccessibleSelectionFromContext, SelectAllAccessibleSelectionFromContextFP, "selectAllAccessibleSelectionFromContext");
+
+ LOAD_FP(setTextContents, setTextContentsFP, "setTextContents");
+ LOAD_FP(getParentWithRole, getParentWithRoleFP, "getParentWithRole");
+ LOAD_FP(getTopLevelObject, getTopLevelObjectFP, "getTopLevelObject");
+ LOAD_FP(getParentWithRoleElseRoot, getParentWithRoleElseRootFP, "getParentWithRoleElseRoot");
+ LOAD_FP(getObjectDepth, getObjectDepthFP, "getObjectDepth");
+ LOAD_FP(getActiveDescendent, getActiveDescendentFP, "getActiveDescendent");
+
+ // additional methods for Teton
+ LOAD_FP(getVirtualAccessibleName, getVirtualAccessibleNameFP, "getVirtualAccessibleName");
+ LOAD_FP(requestFocus, requestFocusFP, "requestFocus");
+ LOAD_FP(selectTextRange, selectTextRangeFP, "selectTextRange");
+ LOAD_FP(getTextAttributesInRange, getTextAttributesInRangeFP, "getTextAttributesInRange");
+ LOAD_FP(getVisibleChildrenCount, getVisibleChildrenCountFP, "getVisibleChildrenCount");
+ LOAD_FP(getVisibleChildren, getVisibleChildrenFP, "getVisibleChildren");
+ LOAD_FP(setCaretPosition, setCaretPositionFP, "setCaretPosition");
+ LOAD_FP(getCaretLocation, getCaretLocationFP, "getCaretLocation");
+
+ LOAD_FP(getEventsWaiting, getEventsWaitingFP, "getEventsWaiting");
+
+ theAccessBridge.Windows_run();
+
+ theAccessBridgeInitializedFlag = TRUE;
+ PrintDebugString("theAccessBridgeInitializedFlag = TRUE");
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+ }
+
+
+ BOOL shutdownAccessBridge() {
+ BOOL result;
+ DWORD error;
+ theAccessBridgeInitializedFlag = FALSE;
+ if (theAccessBridgeInstance != (HANDLE) 0) {
+ result = FreeLibrary(theAccessBridgeInstance);
+ if (result != TRUE) {
+ error = GetLastError();
+ }
+ return TRUE;
+ }
+ return FALSE;
+ }
+
+
+ void SetJavaShutdown(AccessBridge_JavaShutdownFP fp) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.SetJavaShutdown(fp);
+ }
+ }
+
+ void SetFocusGained(AccessBridge_FocusGainedFP fp) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.SetFocusGained(fp);
+ }
+ }
+
+ void SetFocusLost(AccessBridge_FocusLostFP fp) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.SetFocusLost(fp);
+ }
+ }
+
+
+ void SetCaretUpdate(AccessBridge_CaretUpdateFP fp) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.SetCaretUpdate(fp);
+ }
+ }
+
+
+ void SetMouseClicked(AccessBridge_MouseClickedFP fp) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.SetMouseClicked(fp);
+ }
+ }
+
+ void SetMouseEntered(AccessBridge_MouseEnteredFP fp) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.SetMouseEntered(fp);
+ }
+ }
+
+ void SetMouseExited(AccessBridge_MouseExitedFP fp) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.SetMouseExited(fp);
+ }
+ }
+
+ void SetMousePressed(AccessBridge_MousePressedFP fp) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.SetMousePressed(fp);
+ }
+ }
+
+ void SetMouseReleased(AccessBridge_MouseReleasedFP fp) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.SetMouseReleased(fp);
+ }
+ }
+
+
+ void SetMenuCanceled(AccessBridge_MenuCanceledFP fp) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.SetMenuCanceled(fp);
+ }
+ }
+
+ void SetMenuDeselected(AccessBridge_MenuDeselectedFP fp) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.SetMenuDeselected(fp);
+ }
+ }
+
+ void SetMenuSelected(AccessBridge_MenuSelectedFP fp) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.SetMenuSelected(fp);
+ }
+ }
+
+ void SetPopupMenuCanceled(AccessBridge_PopupMenuCanceledFP fp) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.SetPopupMenuCanceled(fp);
+ }
+ }
+
+ void SetPopupMenuWillBecomeInvisible(AccessBridge_PopupMenuWillBecomeInvisibleFP fp) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.SetPopupMenuWillBecomeInvisible(fp);
+ }
+ }
+
+ void SetPopupMenuWillBecomeVisible(AccessBridge_PopupMenuWillBecomeVisibleFP fp) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.SetPopupMenuWillBecomeVisible(fp);
+ }
+ }
+
+
+ void SetPropertyNameChange(AccessBridge_PropertyNameChangeFP fp) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.SetPropertyNameChange(fp);
+ }
+ }
+
+ void SetPropertyDescriptionChange(AccessBridge_PropertyDescriptionChangeFP fp) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.SetPropertyDescriptionChange(fp);
+ }
+ }
+
+ void SetPropertyStateChange(AccessBridge_PropertyStateChangeFP fp) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.SetPropertyStateChange(fp);
+ }
+ }
+
+ void SetPropertyValueChange(AccessBridge_PropertyValueChangeFP fp) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.SetPropertyValueChange(fp);
+ }
+ }
+
+ void SetPropertySelectionChange(AccessBridge_PropertySelectionChangeFP fp) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.SetPropertySelectionChange(fp);
+ }
+ }
+
+ void SetPropertyTextChange(AccessBridge_PropertyTextChangeFP fp) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.SetPropertyTextChange(fp);
+ }
+ }
+
+ void SetPropertyCaretChange(AccessBridge_PropertyCaretChangeFP fp) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.SetPropertyCaretChange(fp);
+ }
+ }
+
+ void SetPropertyVisibleDataChange(AccessBridge_PropertyVisibleDataChangeFP fp) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.SetPropertyVisibleDataChange(fp);
+ }
+ }
+
+ void SetPropertyChildChange(AccessBridge_PropertyChildChangeFP fp) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.SetPropertyChildChange(fp);
+ }
+ }
+
+ void SetPropertyActiveDescendentChange(AccessBridge_PropertyActiveDescendentChangeFP fp) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.SetPropertyActiveDescendentChange(fp);
+ }
+ }
+
+ void SetPropertyTableModelChange(AccessBridge_PropertyTableModelChangeFP fp) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.SetPropertyTableModelChange(fp);
+ }
+ }
+
+ /**
+ * General routines
+ */
+ void ReleaseJavaObject(long vmID, Java_Object object) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.ReleaseJavaObject(vmID, object);
+ }
+ }
+
+ BOOL GetVersionInfo(long vmID, AccessBridgeVersionInfo *info) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.GetVersionInfo(vmID, info);
+ }
+ return FALSE;
+ }
+
+
+ /**
+ * Window routines
+ */
+ BOOL IsJavaWindow(HWND window) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ BOOL ret ;
+ ret = theAccessBridge.IsJavaWindow(window);
+ return ret ;
+
+ }
+ return FALSE;
+ }
+
+
+ /**
+ * Returns the virtual machine ID and AccessibleContext for a top-level window
+ */
+ BOOL GetAccessibleContextFromHWND(HWND target, long *vmID, AccessibleContext *ac) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.GetAccessibleContextFromHWND(target, vmID, ac);
+ }
+ return FALSE;
+ }
+
+ /**
+ * Returns the HWND from the AccessibleContext of a top-level window. Returns 0
+ * on error or if the AccessibleContext does not refer to a top-level window.
+ */
+ HWND getHWNDFromAccessibleContext(long vmID, JOBJECT64 accesibleContext) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getHWNDFromAccessibleContext(vmID, accesibleContext);
+ }
+ return (HWND)0;
+ }
+
+ /**
+ * returns whether two objects are the same
+ */
+ BOOL IsSameObject(long vmID, JOBJECT64 obj1, JOBJECT64 obj2) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.IsSameObject(vmID, obj1, obj2);
+ }
+ return FALSE;
+ }
+
+ /**
+ * Sets editable text contents. The AccessibleContext must implement AccessibleEditableText and
+ * be editable. The maximum text length is MAX_STRING_SIZE - 1.
+ * Returns whether successful
+ */
+ BOOL setTextContents (const long vmID, const AccessibleContext accessibleContext, const wchar_t *text) {
+
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.setTextContents(vmID, accessibleContext, text);
+ }
+ return FALSE;
+ }
+
+ /**
+ * Returns the Accessible Context with the specified role that is the
+ * ancestor of a given object. The role is one of the role strings
+ * defined in AccessBridgePackages.h
+ * If there is no ancestor object that has the specified role,
+ * returns (AccessibleContext)0.
+ */
+ AccessibleContext getParentWithRole (const long vmID, const AccessibleContext accessibleContext,
+ const wchar_t *role) {
+
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getParentWithRole(vmID, accessibleContext, role);
+ }
+ return (AccessibleContext)0;
+ }
+
+ /**
+ * Returns the Accessible Context with the specified role that is the
+ * ancestor of a given object. The role is one of the role strings
+ * defined in AccessBridgePackages.h. If an object with the specified
+ * role does not exist, returns the top level object for the Java Window.
+ * Returns (AccessibleContext)0 on error.
+ */
+ AccessibleContext getParentWithRoleElseRoot (const long vmID, const AccessibleContext accessibleContext,
+ const wchar_t *role) {
+
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getParentWithRoleElseRoot(vmID, accessibleContext, role);
+ }
+ return (AccessibleContext)0;
+ }
+
+ /**
+ * Returns the Accessible Context for the top level object in
+ * a Java Window. This is same Accessible Context that is obtained
+ * from GetAccessibleContextFromHWND for that window. Returns
+ * (AccessibleContext)0 on error.
+ */
+ AccessibleContext getTopLevelObject (const long vmID, const AccessibleContext accessibleContext) {
+
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getTopLevelObject(vmID, accessibleContext);
+ }
+ return (AccessibleContext)0;
+ }
+
+ /**
+ * Returns how deep in the object hierarchy a given object is.
+ * The top most object in the object hierarchy has an object depth of 0.
+ * Returns -1 on error.
+ */
+ int getObjectDepth (const long vmID, const AccessibleContext accessibleContext) {
+
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getObjectDepth(vmID, accessibleContext);
+ }
+ return -1;
+ }
+
+ /**
+ * Returns the Accessible Context of the current ActiveDescendent of an object.
+ * This method assumes the ActiveDescendent is the component that is currently
+ * selected in a container object.
+ * Returns (AccessibleContext)0 on error or if there is no selection.
+ */
+ AccessibleContext getActiveDescendent (const long vmID, const AccessibleContext accessibleContext) {
+
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getActiveDescendent(vmID, accessibleContext);
+ }
+ return (AccessibleContext)0;
+ }
+
+
+ /**
+ * Accessible Context routines
+ */
+ BOOL GetAccessibleContextAt(long vmID, AccessibleContext acParent,
+ jint x, jint y, AccessibleContext *ac) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.GetAccessibleContextAt(vmID, acParent, x, y, ac);
+ }
+ return FALSE;
+ }
+
+ BOOL GetAccessibleContextWithFocus(HWND window, long *vmID, AccessibleContext *ac) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.GetAccessibleContextWithFocus(window, vmID, ac);
+ }
+ return FALSE;
+ }
+
+ BOOL GetAccessibleContextInfo(long vmID, AccessibleContext ac, AccessibleContextInfo *info) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.GetAccessibleContextInfo(vmID, ac, info);
+ }
+ return FALSE;
+ }
+
+ AccessibleContext GetAccessibleChildFromContext(long vmID, AccessibleContext ac, jint index) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.GetAccessibleChildFromContext(vmID, ac, index);
+ }
+ return (AccessibleContext) 0;
+ }
+
+ AccessibleContext GetAccessibleParentFromContext(long vmID, AccessibleContext ac) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.GetAccessibleParentFromContext(vmID, ac);
+ }
+ return (AccessibleContext) 0;
+ }
+
+ /* begin AccessibleTable routines */
+
+ /*
+ * get information about an AccessibleTable
+ */
+ BOOL getAccessibleTableInfo(long vmID, AccessibleContext acParent, AccessibleTableInfo *tableInfo) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getAccessibleTableInfo(vmID, acParent, tableInfo);
+ }
+ return FALSE;
+ }
+
+ /*
+ * get information about an AccessibleTable cell
+ */
+ BOOL getAccessibleTableCellInfo(long vmID, AccessibleTable accessibleTable,
+ jint row, jint column, AccessibleTableCellInfo *tableCellInfo) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getAccessibleTableCellInfo(vmID, accessibleTable, row, column, tableCellInfo);
+ }
+ return FALSE;
+ }
+
+ /*
+ * get information about an AccessibleTable row header
+ */
+ BOOL getAccessibleTableRowHeader(long vmID, AccessibleContext acParent, AccessibleTableInfo *tableInfo) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getAccessibleTableRowHeader(vmID, acParent, tableInfo);
+ }
+ return FALSE;
+ }
+
+ /*
+ * get information about an AccessibleTable column header
+ */
+ BOOL getAccessibleTableColumnHeader(long vmID, AccessibleContext acParent, AccessibleTableInfo *tableInfo) {
+
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getAccessibleTableColumnHeader(vmID, acParent, tableInfo);
+ }
+ return FALSE;
+ }
+
+ /*
+ * return a description of an AccessibleTable row header
+ */
+ AccessibleContext getAccessibleTableRowDescription(long vmID, AccessibleContext acParent, jint row) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getAccessibleTableRowDescription(vmID, acParent, row);
+ }
+ return (AccessibleContext)0;
+ }
+
+ /*
+ * return a description of an AccessibleTable column header
+ */
+ AccessibleContext getAccessibleTableColumnDescription(long vmID, AccessibleContext acParent, jint column) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getAccessibleTableColumnDescription(vmID, acParent, column);
+ }
+ return (AccessibleContext)0;
+ }
+
+ /*
+ * return the number of rows selected in an AccessibleTable
+ */
+ jint getAccessibleTableRowSelectionCount(long vmID, AccessibleTable table) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getAccessibleTableRowSelectionCount(vmID, table);
+ }
+ return -1;
+ }
+
+ /*
+ * return whether a row is selected in an AccessibleTable
+ */
+ BOOL isAccessibleTableRowSelected(long vmID, AccessibleTable table, jint row) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.isAccessibleTableRowSelected(vmID, table, row);
+ }
+ return FALSE;
+ }
+
+ /*
+ * get an array of selected rows in an AccessibleTable
+ */
+ BOOL getAccessibleTableRowSelections(long vmID, AccessibleTable table, jint count, jint *selections) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getAccessibleTableRowSelections(vmID, table, count, selections);
+ }
+ return FALSE;
+ }
+
+ /*
+ * return the number of columns selected in an AccessibleTable
+ */
+ jint getAccessibleTableColumnSelectionCount(long vmID, AccessibleTable table) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getAccessibleTableColumnSelectionCount(vmID, table);
+ }
+ return -1;
+ }
+
+ /*
+ * return whether a column is selected in an AccessibleTable
+ */
+ BOOL isAccessibleTableColumnSelected(long vmID, AccessibleTable table, jint column) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.isAccessibleTableColumnSelected(vmID, table, column);
+ }
+ return FALSE;
+ }
+
+ /*
+ * get an array of columns selected in an AccessibleTable
+ */
+ BOOL getAccessibleTableColumnSelections(long vmID, AccessibleTable table, jint count, jint *selections) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getAccessibleTableColumnSelections(vmID, table, count, selections);
+ }
+ return FALSE;
+ }
+
+ /*
+ * return the row number for a cell at a given index
+ */
+ jint
+ getAccessibleTableRow(long vmID, AccessibleTable table, jint index) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getAccessibleTableRow(vmID, table, index);
+ }
+ return -1;
+ }
+
+ /*
+ * return the column number for a cell at a given index
+ */
+ jint
+ getAccessibleTableColumn(long vmID, AccessibleTable table, jint index) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getAccessibleTableColumn(vmID, table, index);
+ }
+ return -1;
+ }
+
+ /*
+ * return the index of a cell at a given row and column
+ */
+ jint
+ getAccessibleTableIndex(long vmID, AccessibleTable table, jint row, jint column) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getAccessibleTableIndex(vmID, table, row, column);
+ }
+ return -1;
+ }
+
+ /* end AccessibleTable routines */
+
+
+ /**
+ * Accessible Text routines
+ */
+ BOOL GetAccessibleTextInfo(long vmID, AccessibleText at, AccessibleTextInfo *textInfo, jint x, jint y) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.GetAccessibleTextInfo(vmID, at, textInfo, x, y);
+ }
+ return FALSE;
+ }
+
+ BOOL GetAccessibleTextItems(long vmID, AccessibleText at, AccessibleTextItemsInfo *textItems, jint index) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.GetAccessibleTextItems(vmID, at, textItems, index);
+ }
+ return FALSE;
+ }
+
+ BOOL GetAccessibleTextSelectionInfo(long vmID, AccessibleText at, AccessibleTextSelectionInfo *textSelection) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.GetAccessibleTextSelectionInfo(vmID, at, textSelection);
+ }
+ return FALSE;
+ }
+
+ BOOL GetAccessibleTextAttributes(long vmID, AccessibleText at, jint index, AccessibleTextAttributesInfo *attributes) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.GetAccessibleTextAttributes(vmID, at, index, attributes);
+ }
+ return FALSE;
+ }
+
+ BOOL GetAccessibleTextRect(long vmID, AccessibleText at, AccessibleTextRectInfo *rectInfo, jint index) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.GetAccessibleTextRect(vmID, at, rectInfo, index);
+ }
+ return FALSE;
+ }
+
+ BOOL GetAccessibleTextLineBounds(long vmID, AccessibleText at, jint index, jint *startIndex, jint *endIndex) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.GetAccessibleTextLineBounds(vmID, at, index, startIndex, endIndex);
+ }
+ return FALSE;
+ }
+
+ BOOL GetAccessibleTextRange(long vmID, AccessibleText at, jint start, jint end, wchar_t *text, short len) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.GetAccessibleTextRange(vmID, at, start, end, text, len);
+ }
+ return FALSE;
+ }
+
+ /**
+ * AccessibleRelationSet routines
+ */
+ BOOL getAccessibleRelationSet(long vmID, AccessibleContext accessibleContext,
+ AccessibleRelationSetInfo *relationSetInfo) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getAccessibleRelationSet(vmID, accessibleContext, relationSetInfo);
+ }
+ return FALSE;
+ }
+
+ /**
+ * AccessibleHypertext routines
+ */
+
+ // Gets AccessibleHypertext for an AccessibleContext
+ BOOL getAccessibleHypertext(long vmID, AccessibleContext accessibleContext,
+ AccessibleHypertextInfo *hypertextInfo) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getAccessibleHypertext(vmID, accessibleContext, hypertextInfo);
+ }
+ return FALSE;
+ }
+
+ // Activates an AccessibleHyperlink for an AccessibleContext
+ BOOL activateAccessibleHyperlink(long vmID, AccessibleContext accessibleContext,
+ AccessibleHyperlink accessibleHyperlink) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.activateAccessibleHyperlink(vmID, accessibleContext, accessibleHyperlink);
+ }
+ return FALSE;
+ }
+
+ /*
+ * Returns the number of hyperlinks in a component
+ * Maps to AccessibleHypertext.getLinkCount.
+ * Returns -1 on error.
+ */
+ jint getAccessibleHyperlinkCount(const long vmID,
+ const AccessibleContext accessibleContext) {
+
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getAccessibleHyperlinkCount(vmID, accessibleContext);
+ }
+ return -1;
+ }
+
+ /*
+ * This method is used to iterate through the hyperlinks in a component. It
+ * returns hypertext information for a component starting at hyperlink index
+ * nStartIndex. No more than MAX_HYPERLINKS AccessibleHypertextInfo objects will
+ * be returned for each call to this method.
+ * returns FALSE on error.
+ */
+ BOOL getAccessibleHypertextExt(const long vmID,
+ const AccessibleContext accessibleContext,
+ const jint nStartIndex,
+ /* OUT */ AccessibleHypertextInfo *hypertextInfo) {
+
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getAccessibleHypertextExt(vmID,
+ accessibleContext,
+ nStartIndex,
+ hypertextInfo);
+ }
+ return FALSE;
+ }
+
+ /*
+ * Returns the index into an array of hyperlinks that is associated with
+ * a character index in document;
+ * Maps to AccessibleHypertext.getLinkIndex.
+ * Returns -1 on error.
+ */
+ jint getAccessibleHypertextLinkIndex(const long vmID,
+ const AccessibleHypertext hypertext,
+ const jint nIndex) {
+
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getAccessibleHypertextLinkIndex(vmID,
+ hypertext,
+ nIndex);
+ }
+ return -1;
+ }
+
+ /*
+ * Returns the nth hyperlink in a document.
+ * Maps to AccessibleHypertext.getLink.
+ * Returns -1 on error
+ */
+ BOOL getAccessibleHyperlink(const long vmID,
+ const AccessibleHypertext hypertext,
+ const jint nIndex,
+ /* OUT */ AccessibleHyperlinkInfo *hyperlinkInfo) {
+
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getAccessibleHyperlink(vmID,
+ hypertext,
+ nIndex,
+ hyperlinkInfo);
+ }
+ return FALSE;
+ }
+
+
+ /* Accessible KeyBindings, Icons and Actions */
+ BOOL getAccessibleKeyBindings(long vmID, AccessibleContext accessibleContext,
+ AccessibleKeyBindings *keyBindings) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getAccessibleKeyBindings(vmID, accessibleContext, keyBindings);
+ }
+ return FALSE;
+ }
+
+ BOOL getAccessibleIcons(long vmID, AccessibleContext accessibleContext,
+ AccessibleIcons *icons) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getAccessibleIcons(vmID, accessibleContext, icons);
+ }
+ return FALSE;
+ }
+
+ BOOL getAccessibleActions(long vmID, AccessibleContext accessibleContext,
+ AccessibleActions *actions) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getAccessibleActions(vmID, accessibleContext, actions);
+ }
+ return FALSE;
+ }
+
+ BOOL doAccessibleActions(long vmID, AccessibleContext accessibleContext,
+ AccessibleActionsToDo *actionsToDo, jint *failure) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.doAccessibleActions(vmID, accessibleContext, actionsToDo, failure);
+ }
+ return FALSE;
+ }
+
+ /**
+ * Accessible Value routines
+ */
+ BOOL GetCurrentAccessibleValueFromContext(long vmID, AccessibleValue av, wchar_t *value, short len) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.GetCurrentAccessibleValueFromContext(vmID, av, value, len);
+ }
+ return FALSE;
+ }
+
+ BOOL GetMaximumAccessibleValueFromContext(long vmID, AccessibleValue av, wchar_t *value, short len) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.GetMaximumAccessibleValueFromContext(vmID, av, value, len);
+ }
+ return FALSE;
+ }
+
+ BOOL GetMinimumAccessibleValueFromContext(long vmID, AccessibleValue av, wchar_t *value, short len) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.GetMinimumAccessibleValueFromContext(vmID, av, value, len);
+ }
+ return FALSE;
+ }
+
+
+ /**
+ * Accessible Selection routines
+ */
+ void addAccessibleSelectionFromContext(long vmID, AccessibleSelection as, int i) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.AddAccessibleSelectionFromContext(vmID, as, i);
+ }
+ }
+
+ void clearAccessibleSelectionFromContext(long vmID, AccessibleSelection as) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.ClearAccessibleSelectionFromContext(vmID, as);
+ }
+ }
+
+ JOBJECT64 GetAccessibleSelectionFromContext(long vmID, AccessibleSelection as, int i) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.GetAccessibleSelectionFromContext(vmID, as, i);
+ }
+ return (JOBJECT64) 0;
+ }
+
+ int GetAccessibleSelectionCountFromContext(long vmID, AccessibleSelection as) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.GetAccessibleSelectionCountFromContext(vmID, as);
+ }
+ return -1;
+ }
+
+ BOOL IsAccessibleChildSelectedFromContext(long vmID, AccessibleSelection as, int i) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.IsAccessibleChildSelectedFromContext(vmID, as, i);
+ }
+ return FALSE;
+ }
+
+ void RemoveAccessibleSelectionFromContext(long vmID, AccessibleSelection as, int i) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.RemoveAccessibleSelectionFromContext(vmID, as, i);
+ }
+ }
+
+ void SelectAllAccessibleSelectionFromContext(long vmID, AccessibleSelection as) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ theAccessBridge.SelectAllAccessibleSelectionFromContext(vmID, as);
+ }
+ }
+
+ /**
+ * Additional methods for Teton
+ */
+
+ /**
+ * Gets the AccessibleName for a component based upon the JAWS algorithm. Returns
+ * whether successful.
+ *
+ * Bug ID 4916682 - Implement JAWS AccessibleName policy
+ */
+ BOOL getVirtualAccessibleName(const long vmID, const AccessibleContext accessibleContext,
+ wchar_t *name, int len) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getVirtualAccessibleName(vmID, accessibleContext, name, len);
+ }
+ return FALSE;
+ }
+
+ /**
+ * Request focus for a component. Returns whether successful;
+ *
+ * Bug ID 4944757 - requestFocus method needed
+ */
+ BOOL requestFocus(const long vmID, const AccessibleContext accessibleContext) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.requestFocus(vmID, accessibleContext);
+ }
+ return FALSE;
+ }
+
+ /**
+ * Selects text between two indices. Selection includes the text at the start index
+ * and the text at the end index. Returns whether successful;
+ *
+ * Bug ID 4944758 - selectTextRange method needed
+ */
+ BOOL selectTextRange(const long vmID, const AccessibleContext accessibleContext,
+ const int startIndex, const int endIndex) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.selectTextRange(vmID, accessibleContext, startIndex, endIndex);
+ }
+ return FALSE;
+ }
+
+ /**
+ * Get text attributes between two indices. The attribute list includes the text at the
+ * start index and the text at the end index. Returns whether successful;
+ *
+ * Bug ID 4944761 - getTextAttributes between two indices method needed
+ */
+ BOOL getTextAttributesInRange(const long vmID, const AccessibleContext accessibleContext,
+ const int startIndex, const int endIndex,
+ AccessibleTextAttributesInfo *attributes, short *len) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getTextAttributesInRange(vmID, accessibleContext, startIndex,
+ endIndex, attributes, len);
+ }
+ return FALSE;
+ }
+
+ /**
+ * Returns the number of visible children of a component. Returns -1 on error.
+ *
+ * Bug ID 4944762- getVisibleChildren for list-like components needed
+ */
+ int getVisibleChildrenCount(const long vmID, const AccessibleContext accessibleContext) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getVisibleChildrenCount(vmID, accessibleContext);
+ }
+ return FALSE;
+ }
+
+ /**
+ * Gets the visible children of an AccessibleContext. Returns whether successful;
+ *
+ * Bug ID 4944762- getVisibleChildren for list-like components needed
+ */
+ BOOL getVisibleChildren(const long vmID, const AccessibleContext accessibleContext,
+ const int startIndex, VisibleChildrenInfo *visibleChildrenInfo) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getVisibleChildren(vmID, accessibleContext, startIndex,
+ visibleChildrenInfo);
+ }
+ return FALSE;
+ }
+
+ /**
+ * Set the caret to a text position. Returns whether successful;
+ *
+ * Bug ID 4944770 - setCaretPosition method needed
+ */
+ BOOL setCaretPosition(const long vmID, const AccessibleContext accessibleContext,
+ const int position) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.setCaretPosition(vmID, accessibleContext, position);
+ }
+ return FALSE;
+ }
+
+ /**
+ * Gets the text caret location
+ */
+ BOOL getCaretLocation(long vmID, AccessibleContext ac, AccessibleTextRectInfo *rectInfo, jint index) {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getCaretLocation(vmID, ac, rectInfo, index);
+ }
+ return FALSE;
+ }
+
+ /**
+ * Gets the number of events waiting to fire
+ */
+ int getEventsWaiting() {
+ if (theAccessBridgeInitializedFlag == TRUE) {
+ return theAccessBridge.getEventsWaiting();
+ }
+ return FALSE;
+ }
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/love2dToAPK/tools/tools/jdk-win/include/win32/bridge/AccessBridgeCalls.h b/love2dToAPK/tools/tools/jdk-win/include/win32/bridge/AccessBridgeCalls.h
new file mode 100644
index 0000000..d4eab9e
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/include/win32/bridge/AccessBridgeCalls.h
@@ -0,0 +1,686 @@
+/*
+ * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ */
+
+/*
+ * Wrapper functions around calls to the AccessBridge DLL
+ */
+
+#include <windows.h>
+#include <jni.h>
+#include "AccessBridgeCallbacks.h"
+#include "AccessBridgePackages.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define null NULL
+
+ typedef JOBJECT64 AccessibleContext;
+ typedef JOBJECT64 AccessibleText;
+ typedef JOBJECT64 AccessibleValue;
+ typedef JOBJECT64 AccessibleSelection;
+ typedef JOBJECT64 Java_Object;
+ typedef JOBJECT64 PropertyChangeEvent;
+ typedef JOBJECT64 FocusEvent;
+ typedef JOBJECT64 CaretEvent;
+ typedef JOBJECT64 MouseEvent;
+ typedef JOBJECT64 MenuEvent;
+ typedef JOBJECT64 AccessibleTable;
+ typedef JOBJECT64 AccessibleHyperlink;
+ typedef JOBJECT64 AccessibleHypertext;
+
+
+ typedef void (*Windows_runFP) ();
+
+ typedef void (*SetPropertyChangeFP) (AccessBridge_PropertyChangeFP fp);
+
+ typedef void (*SetJavaShutdownFP) (AccessBridge_JavaShutdownFP fp);
+ typedef void (*SetFocusGainedFP) (AccessBridge_FocusGainedFP fp);
+ typedef void (*SetFocusLostFP) (AccessBridge_FocusLostFP fp);
+
+ typedef void (*SetCaretUpdateFP) (AccessBridge_CaretUpdateFP fp);
+
+ typedef void (*SetMouseClickedFP) (AccessBridge_MouseClickedFP fp);
+ typedef void (*SetMouseEnteredFP) (AccessBridge_MouseEnteredFP fp);
+ typedef void (*SetMouseExitedFP) (AccessBridge_MouseExitedFP fp);
+ typedef void (*SetMousePressedFP) (AccessBridge_MousePressedFP fp);
+ typedef void (*SetMouseReleasedFP) (AccessBridge_MouseReleasedFP fp);
+
+ typedef void (*SetMenuCanceledFP) (AccessBridge_MenuCanceledFP fp);
+ typedef void (*SetMenuDeselectedFP) (AccessBridge_MenuDeselectedFP fp);
+ typedef void (*SetMenuSelectedFP) (AccessBridge_MenuSelectedFP fp);
+ typedef void (*SetPopupMenuCanceledFP) (AccessBridge_PopupMenuCanceledFP fp);
+ typedef void (*SetPopupMenuWillBecomeInvisibleFP) (AccessBridge_PopupMenuWillBecomeInvisibleFP fp);
+ typedef void (*SetPopupMenuWillBecomeVisibleFP) (AccessBridge_PopupMenuWillBecomeVisibleFP fp);
+
+ typedef void (*SetPropertyNameChangeFP) (AccessBridge_PropertyNameChangeFP fp);
+ typedef void (*SetPropertyDescriptionChangeFP) (AccessBridge_PropertyDescriptionChangeFP fp);
+ typedef void (*SetPropertyStateChangeFP) (AccessBridge_PropertyStateChangeFP fp);
+ typedef void (*SetPropertyValueChangeFP) (AccessBridge_PropertyValueChangeFP fp);
+ typedef void (*SetPropertySelectionChangeFP) (AccessBridge_PropertySelectionChangeFP fp);
+ typedef void (*SetPropertyTextChangeFP) (AccessBridge_PropertyTextChangeFP fp);
+ typedef void (*SetPropertyCaretChangeFP) (AccessBridge_PropertyCaretChangeFP fp);
+ typedef void (*SetPropertyVisibleDataChangeFP) (AccessBridge_PropertyVisibleDataChangeFP fp);
+ typedef void (*SetPropertyChildChangeFP) (AccessBridge_PropertyChildChangeFP fp);
+ typedef void (*SetPropertyActiveDescendentChangeFP) (AccessBridge_PropertyActiveDescendentChangeFP fp);
+
+ typedef void (*SetPropertyTableModelChangeFP) (AccessBridge_PropertyTableModelChangeFP fp);
+
+ typedef void (*ReleaseJavaObjectFP) (long vmID, Java_Object object);
+
+ typedef BOOL (*GetVersionInfoFP) (long vmID, AccessBridgeVersionInfo *info);
+
+ typedef BOOL (*IsJavaWindowFP) (HWND window);
+ typedef BOOL (*IsSameObjectFP) (long vmID, JOBJECT64 obj1, JOBJECT64 obj2);
+ typedef BOOL (*GetAccessibleContextFromHWNDFP) (HWND window, long *vmID, AccessibleContext *ac);
+ typedef HWND (*getHWNDFromAccessibleContextFP) (long vmID, AccessibleContext ac);
+
+ typedef BOOL (*GetAccessibleContextAtFP) (long vmID, AccessibleContext acParent,
+ jint x, jint y, AccessibleContext *ac);
+ typedef BOOL (*GetAccessibleContextWithFocusFP) (HWND window, long *vmID, AccessibleContext *ac);
+ typedef BOOL (*GetAccessibleContextInfoFP) (long vmID, AccessibleContext ac, AccessibleContextInfo *info);
+ typedef AccessibleContext (*GetAccessibleChildFromContextFP) (long vmID, AccessibleContext ac, jint i);
+ typedef AccessibleContext (*GetAccessibleParentFromContextFP) (long vmID, AccessibleContext ac);
+
+ /* begin AccessibleTable */
+ typedef BOOL (*getAccessibleTableInfoFP) (long vmID, AccessibleContext ac, AccessibleTableInfo *tableInfo);
+ typedef BOOL (*getAccessibleTableCellInfoFP) (long vmID, AccessibleTable accessibleTable,
+ jint row, jint column, AccessibleTableCellInfo *tableCellInfo);
+
+ typedef BOOL (*getAccessibleTableRowHeaderFP) (long vmID, AccessibleContext acParent, AccessibleTableInfo *tableInfo);
+ typedef BOOL (*getAccessibleTableColumnHeaderFP) (long vmID, AccessibleContext acParent, AccessibleTableInfo *tableInfo);
+
+ typedef AccessibleContext (*getAccessibleTableRowDescriptionFP) (long vmID, AccessibleContext acParent, jint row);
+ typedef AccessibleContext (*getAccessibleTableColumnDescriptionFP) (long vmID, AccessibleContext acParent, jint column);
+
+ typedef jint (*getAccessibleTableRowSelectionCountFP) (long vmID, AccessibleTable table);
+ typedef BOOL (*isAccessibleTableRowSelectedFP) (long vmID, AccessibleTable table, jint row);
+ typedef BOOL (*getAccessibleTableRowSelectionsFP) (long vmID, AccessibleTable table, jint count,
+ jint *selections);
+
+ typedef jint (*getAccessibleTableColumnSelectionCountFP) (long vmID, AccessibleTable table);
+ typedef BOOL (*isAccessibleTableColumnSelectedFP) (long vmID, AccessibleTable table, jint column);
+ typedef BOOL (*getAccessibleTableColumnSelectionsFP) (long vmID, AccessibleTable table, jint count,
+ jint *selections);
+
+ typedef jint (*getAccessibleTableRowFP) (long vmID, AccessibleTable table, jint index);
+ typedef jint (*getAccessibleTableColumnFP) (long vmID, AccessibleTable table, jint index);
+ typedef jint (*getAccessibleTableIndexFP) (long vmID, AccessibleTable table, jint row, jint column);
+ /* end AccessibleTable */
+
+ /* AccessibleRelationSet */
+ typedef BOOL (*getAccessibleRelationSetFP) (long vmID, AccessibleContext accessibleContext,
+ AccessibleRelationSetInfo *relationSetInfo);
+
+ /* AccessibleHypertext */
+ typedef BOOL (*getAccessibleHypertextFP)(long vmID, AccessibleContext accessibleContext,
+ AccessibleHypertextInfo *hypertextInfo);
+
+ typedef BOOL (*activateAccessibleHyperlinkFP)(long vmID, AccessibleContext accessibleContext,
+ AccessibleHyperlink accessibleHyperlink);
+
+ typedef jint (*getAccessibleHyperlinkCountFP)(const long vmID,
+ const AccessibleContext accessibleContext);
+
+ typedef BOOL (*getAccessibleHypertextExtFP) (const long vmID,
+ const AccessibleContext accessibleContext,
+ const jint nStartIndex,
+ AccessibleHypertextInfo *hypertextInfo);
+
+ typedef jint (*getAccessibleHypertextLinkIndexFP)(const long vmID,
+ const AccessibleHypertext hypertext,
+ const jint nIndex);
+
+ typedef BOOL (*getAccessibleHyperlinkFP)(const long vmID,
+ const AccessibleHypertext hypertext,
+ const jint nIndex,
+ AccessibleHyperlinkInfo *hyperlinkInfo);
+
+
+ /* Accessible KeyBindings, Icons and Actions */
+ typedef BOOL (*getAccessibleKeyBindingsFP)(long vmID, AccessibleContext accessibleContext,
+ AccessibleKeyBindings *keyBindings);
+
+ typedef BOOL (*getAccessibleIconsFP)(long vmID, AccessibleContext accessibleContext,
+ AccessibleIcons *icons);
+
+ typedef BOOL (*getAccessibleActionsFP)(long vmID, AccessibleContext accessibleContext,
+ AccessibleActions *actions);
+
+ typedef BOOL (*doAccessibleActionsFP)(long vmID, AccessibleContext accessibleContext,
+ AccessibleActionsToDo *actionsToDo, jint *failure);
+
+
+ /* AccessibleText */
+
+ typedef BOOL (*GetAccessibleTextInfoFP) (long vmID, AccessibleText at, AccessibleTextInfo *textInfo, jint x, jint y);
+ typedef BOOL (*GetAccessibleTextItemsFP) (long vmID, AccessibleText at, AccessibleTextItemsInfo *textItems, jint index);
+ typedef BOOL (*GetAccessibleTextSelectionInfoFP) (long vmID, AccessibleText at, AccessibleTextSelectionInfo *textSelection);
+ typedef BOOL (*GetAccessibleTextAttributesFP) (long vmID, AccessibleText at, jint index, AccessibleTextAttributesInfo *attributes);
+ typedef BOOL (*GetAccessibleTextRectFP) (long vmID, AccessibleText at, AccessibleTextRectInfo *rectInfo, jint index);
+ typedef BOOL (*GetAccessibleTextLineBoundsFP) (long vmID, AccessibleText at, jint index, jint *startIndex, jint *endIndex);
+ typedef BOOL (*GetAccessibleTextRangeFP) (long vmID, AccessibleText at, jint start, jint end, wchar_t *text, short len);
+
+ typedef BOOL (*GetCurrentAccessibleValueFromContextFP) (long vmID, AccessibleValue av, wchar_t *value, short len);
+ typedef BOOL (*GetMaximumAccessibleValueFromContextFP) (long vmID, AccessibleValue av, wchar_t *value, short len);
+ typedef BOOL (*GetMinimumAccessibleValueFromContextFP) (long vmID, AccessibleValue av, wchar_t *value, short len);
+
+ typedef void (*AddAccessibleSelectionFromContextFP) (long vmID, AccessibleSelection as, int i);
+ typedef void (*ClearAccessibleSelectionFromContextFP) (long vmID, AccessibleSelection as);
+ typedef JOBJECT64 (*GetAccessibleSelectionFromContextFP) (long vmID, AccessibleSelection as, int i);
+ typedef int (*GetAccessibleSelectionCountFromContextFP) (long vmID, AccessibleSelection as);
+ typedef BOOL (*IsAccessibleChildSelectedFromContextFP) (long vmID, AccessibleSelection as, int i);
+ typedef void (*RemoveAccessibleSelectionFromContextFP) (long vmID, AccessibleSelection as, int i);
+ typedef void (*SelectAllAccessibleSelectionFromContextFP) (long vmID, AccessibleSelection as);
+
+ /* Utility methods */
+
+ typedef BOOL (*setTextContentsFP) (const long vmID, const AccessibleContext ac, const wchar_t *text);
+ typedef AccessibleContext (*getParentWithRoleFP) (const long vmID, const AccessibleContext ac, const wchar_t *role);
+ typedef AccessibleContext (*getParentWithRoleElseRootFP) (const long vmID, const AccessibleContext ac, const wchar_t *role);
+ typedef AccessibleContext (*getTopLevelObjectFP) (const long vmID, const AccessibleContext ac);
+ typedef int (*getObjectDepthFP) (const long vmID, const AccessibleContext ac);
+ typedef AccessibleContext (*getActiveDescendentFP) (const long vmID, const AccessibleContext ac);
+
+
+ typedef BOOL (*getVirtualAccessibleNameFP) (const long vmID, const AccessibleContext accessibleContext,
+ wchar_t *name, int len);
+
+ typedef BOOL (*requestFocusFP) (const long vmID, const AccessibleContext accessibleContext);
+
+ typedef BOOL (*selectTextRangeFP) (const long vmID, const AccessibleContext accessibleContext,
+ const int startIndex, const int endIndex);
+
+ typedef BOOL (*getTextAttributesInRangeFP) (const long vmID, const AccessibleContext accessibleContext,
+ const int startIndex, const int endIndex,
+ AccessibleTextAttributesInfo *attributes, short *len);
+
+ typedef int (*getVisibleChildrenCountFP) (const long vmID, const AccessibleContext accessibleContext);
+
+ typedef BOOL (*getVisibleChildrenFP) (const long vmID, const AccessibleContext accessibleContext,
+ const int startIndex, VisibleChildrenInfo *children);
+
+ typedef BOOL (*setCaretPositionFP) (const long vmID, const AccessibleContext accessibleContext, const int position);
+
+ typedef BOOL (*getCaretLocationFP) (long vmID, AccessibleContext ac, AccessibleTextRectInfo *rectInfo, jint index);
+
+ typedef int (*getEventsWaitingFP) ();
+
+ typedef struct AccessBridgeFPsTag {
+ Windows_runFP Windows_run;
+
+ SetPropertyChangeFP SetPropertyChange;
+
+ SetJavaShutdownFP SetJavaShutdown;
+ SetFocusGainedFP SetFocusGained;
+ SetFocusLostFP SetFocusLost;
+
+ SetCaretUpdateFP SetCaretUpdate;
+
+ SetMouseClickedFP SetMouseClicked;
+ SetMouseEnteredFP SetMouseEntered;
+ SetMouseExitedFP SetMouseExited;
+ SetMousePressedFP SetMousePressed;
+ SetMouseReleasedFP SetMouseReleased;
+
+ SetMenuCanceledFP SetMenuCanceled;
+ SetMenuDeselectedFP SetMenuDeselected;
+ SetMenuSelectedFP SetMenuSelected;
+ SetPopupMenuCanceledFP SetPopupMenuCanceled;
+ SetPopupMenuWillBecomeInvisibleFP SetPopupMenuWillBecomeInvisible;
+ SetPopupMenuWillBecomeVisibleFP SetPopupMenuWillBecomeVisible;
+
+ SetPropertyNameChangeFP SetPropertyNameChange;
+ SetPropertyDescriptionChangeFP SetPropertyDescriptionChange;
+ SetPropertyStateChangeFP SetPropertyStateChange;
+ SetPropertyValueChangeFP SetPropertyValueChange;
+ SetPropertySelectionChangeFP SetPropertySelectionChange;
+ SetPropertyTextChangeFP SetPropertyTextChange;
+ SetPropertyCaretChangeFP SetPropertyCaretChange;
+ SetPropertyVisibleDataChangeFP SetPropertyVisibleDataChange;
+ SetPropertyChildChangeFP SetPropertyChildChange;
+ SetPropertyActiveDescendentChangeFP SetPropertyActiveDescendentChange;
+
+ SetPropertyTableModelChangeFP SetPropertyTableModelChange;
+
+ ReleaseJavaObjectFP ReleaseJavaObject;
+ GetVersionInfoFP GetVersionInfo;
+
+ IsJavaWindowFP IsJavaWindow;
+ IsSameObjectFP IsSameObject;
+ GetAccessibleContextFromHWNDFP GetAccessibleContextFromHWND;
+ getHWNDFromAccessibleContextFP getHWNDFromAccessibleContext;
+
+ GetAccessibleContextAtFP GetAccessibleContextAt;
+ GetAccessibleContextWithFocusFP GetAccessibleContextWithFocus;
+ GetAccessibleContextInfoFP GetAccessibleContextInfo;
+ GetAccessibleChildFromContextFP GetAccessibleChildFromContext;
+ GetAccessibleParentFromContextFP GetAccessibleParentFromContext;
+
+ getAccessibleTableInfoFP getAccessibleTableInfo;
+ getAccessibleTableCellInfoFP getAccessibleTableCellInfo;
+
+ getAccessibleTableRowHeaderFP getAccessibleTableRowHeader;
+ getAccessibleTableColumnHeaderFP getAccessibleTableColumnHeader;
+
+ getAccessibleTableRowDescriptionFP getAccessibleTableRowDescription;
+ getAccessibleTableColumnDescriptionFP getAccessibleTableColumnDescription;
+
+ getAccessibleTableRowSelectionCountFP getAccessibleTableRowSelectionCount;
+ isAccessibleTableRowSelectedFP isAccessibleTableRowSelected;
+ getAccessibleTableRowSelectionsFP getAccessibleTableRowSelections;
+
+ getAccessibleTableColumnSelectionCountFP getAccessibleTableColumnSelectionCount;
+ isAccessibleTableColumnSelectedFP isAccessibleTableColumnSelected;
+ getAccessibleTableColumnSelectionsFP getAccessibleTableColumnSelections;
+
+ getAccessibleTableRowFP getAccessibleTableRow;
+ getAccessibleTableColumnFP getAccessibleTableColumn;
+ getAccessibleTableIndexFP getAccessibleTableIndex;
+
+ getAccessibleRelationSetFP getAccessibleRelationSet;
+
+ getAccessibleHypertextFP getAccessibleHypertext;
+ activateAccessibleHyperlinkFP activateAccessibleHyperlink;
+ getAccessibleHyperlinkCountFP getAccessibleHyperlinkCount;
+ getAccessibleHypertextExtFP getAccessibleHypertextExt;
+ getAccessibleHypertextLinkIndexFP getAccessibleHypertextLinkIndex;
+ getAccessibleHyperlinkFP getAccessibleHyperlink;
+
+ getAccessibleKeyBindingsFP getAccessibleKeyBindings;
+ getAccessibleIconsFP getAccessibleIcons;
+ getAccessibleActionsFP getAccessibleActions;
+ doAccessibleActionsFP doAccessibleActions;
+
+ GetAccessibleTextInfoFP GetAccessibleTextInfo;
+ GetAccessibleTextItemsFP GetAccessibleTextItems;
+ GetAccessibleTextSelectionInfoFP GetAccessibleTextSelectionInfo;
+ GetAccessibleTextAttributesFP GetAccessibleTextAttributes;
+ GetAccessibleTextRectFP GetAccessibleTextRect;
+ GetAccessibleTextLineBoundsFP GetAccessibleTextLineBounds;
+ GetAccessibleTextRangeFP GetAccessibleTextRange;
+
+ GetCurrentAccessibleValueFromContextFP GetCurrentAccessibleValueFromContext;
+ GetMaximumAccessibleValueFromContextFP GetMaximumAccessibleValueFromContext;
+ GetMinimumAccessibleValueFromContextFP GetMinimumAccessibleValueFromContext;
+
+ AddAccessibleSelectionFromContextFP AddAccessibleSelectionFromContext;
+ ClearAccessibleSelectionFromContextFP ClearAccessibleSelectionFromContext;
+ GetAccessibleSelectionFromContextFP GetAccessibleSelectionFromContext;
+ GetAccessibleSelectionCountFromContextFP GetAccessibleSelectionCountFromContext;
+ IsAccessibleChildSelectedFromContextFP IsAccessibleChildSelectedFromContext;
+ RemoveAccessibleSelectionFromContextFP RemoveAccessibleSelectionFromContext;
+ SelectAllAccessibleSelectionFromContextFP SelectAllAccessibleSelectionFromContext;
+
+ setTextContentsFP setTextContents;
+ getParentWithRoleFP getParentWithRole;
+ getTopLevelObjectFP getTopLevelObject;
+ getParentWithRoleElseRootFP getParentWithRoleElseRoot;
+ getObjectDepthFP getObjectDepth;
+ getActiveDescendentFP getActiveDescendent;
+
+ getVirtualAccessibleNameFP getVirtualAccessibleName;
+ requestFocusFP requestFocus;
+ selectTextRangeFP selectTextRange;
+ getTextAttributesInRangeFP getTextAttributesInRange;
+ getVisibleChildrenCountFP getVisibleChildrenCount;
+ getVisibleChildrenFP getVisibleChildren;
+ setCaretPositionFP setCaretPosition;
+ getCaretLocationFP getCaretLocation;
+
+ getEventsWaitingFP getEventsWaiting;
+
+ } AccessBridgeFPs;
+
+
+ /**
+ * Initialize the world
+ */
+ BOOL initializeAccessBridge();
+ BOOL shutdownAccessBridge();
+
+ /**
+ * Window routines
+ */
+ BOOL IsJavaWindow(HWND window);
+
+ // Returns the virtual machine ID and AccessibleContext for a top-level window
+ BOOL GetAccessibleContextFromHWND(HWND target, long *vmID, AccessibleContext *ac);
+
+ // Returns the HWND from the AccessibleContext of a top-level window
+ HWND getHWNDFromAccessibleContext(long vmID, AccessibleContext ac);
+
+
+ /**
+ * Event handling routines
+ */
+ void SetJavaShutdown(AccessBridge_JavaShutdownFP fp);
+ void SetFocusGained(AccessBridge_FocusGainedFP fp);
+ void SetFocusLost(AccessBridge_FocusLostFP fp);
+
+ void SetCaretUpdate(AccessBridge_CaretUpdateFP fp);
+
+ void SetMouseClicked(AccessBridge_MouseClickedFP fp);
+ void SetMouseEntered(AccessBridge_MouseEnteredFP fp);
+ void SetMouseExited(AccessBridge_MouseExitedFP fp);
+ void SetMousePressed(AccessBridge_MousePressedFP fp);
+ void SetMouseReleased(AccessBridge_MouseReleasedFP fp);
+
+ void SetMenuCanceled(AccessBridge_MenuCanceledFP fp);
+ void SetMenuDeselected(AccessBridge_MenuDeselectedFP fp);
+ void SetMenuSelected(AccessBridge_MenuSelectedFP fp);
+ void SetPopupMenuCanceled(AccessBridge_PopupMenuCanceledFP fp);
+ void SetPopupMenuWillBecomeInvisible(AccessBridge_PopupMenuWillBecomeInvisibleFP fp);
+ void SetPopupMenuWillBecomeVisible(AccessBridge_PopupMenuWillBecomeVisibleFP fp);
+
+ void SetPropertyNameChange(AccessBridge_PropertyNameChangeFP fp);
+ void SetPropertyDescriptionChange(AccessBridge_PropertyDescriptionChangeFP fp);
+ void SetPropertyStateChange(AccessBridge_PropertyStateChangeFP fp);
+ void SetPropertyValueChange(AccessBridge_PropertyValueChangeFP fp);
+ void SetPropertySelectionChange(AccessBridge_PropertySelectionChangeFP fp);
+ void SetPropertyTextChange(AccessBridge_PropertyTextChangeFP fp);
+ void SetPropertyCaretChange(AccessBridge_PropertyCaretChangeFP fp);
+ void SetPropertyVisibleDataChange(AccessBridge_PropertyVisibleDataChangeFP fp);
+ void SetPropertyChildChange(AccessBridge_PropertyChildChangeFP fp);
+ void SetPropertyActiveDescendentChange(AccessBridge_PropertyActiveDescendentChangeFP fp);
+
+ void SetPropertyTableModelChange(AccessBridge_PropertyTableModelChangeFP fp);
+
+
+ /**
+ * General routines
+ */
+ void ReleaseJavaObject(long vmID, Java_Object object);
+ BOOL GetVersionInfo(long vmID, AccessBridgeVersionInfo *info);
+ HWND GetHWNDFromAccessibleContext(long vmID, JOBJECT64 accesibleContext);
+
+ /**
+ * Accessible Context routines
+ */
+ BOOL GetAccessibleContextAt(long vmID, AccessibleContext acParent,
+ jint x, jint y, AccessibleContext *ac);
+ BOOL GetAccessibleContextWithFocus(HWND window, long *vmID, AccessibleContext *ac);
+ BOOL GetAccessibleContextInfo(long vmID, AccessibleContext ac, AccessibleContextInfo *info);
+ AccessibleContext GetAccessibleChildFromContext(long vmID, AccessibleContext ac, jint index);
+ AccessibleContext GetAccessibleParentFromContext(long vmID, AccessibleContext ac);
+
+ /**
+ * Accessible Text routines
+ */
+ BOOL GetAccessibleTextInfo(long vmID, AccessibleText at, AccessibleTextInfo *textInfo, jint x, jint y);
+ BOOL GetAccessibleTextItems(long vmID, AccessibleText at, AccessibleTextItemsInfo *textItems, jint index);
+ BOOL GetAccessibleTextSelectionInfo(long vmID, AccessibleText at, AccessibleTextSelectionInfo *textSelection);
+ BOOL GetAccessibleTextAttributes(long vmID, AccessibleText at, jint index, AccessibleTextAttributesInfo *attributes);
+ BOOL GetAccessibleTextRect(long vmID, AccessibleText at, AccessibleTextRectInfo *rectInfo, jint index);
+ BOOL GetAccessibleTextLineBounds(long vmID, AccessibleText at, jint index, jint *startIndex, jint *endIndex);
+ BOOL GetAccessibleTextRange(long vmID, AccessibleText at, jint start, jint end, wchar_t *text, short len);
+
+ /* begin AccessibleTable routines */
+ BOOL getAccessibleTableInfo(long vmID, AccessibleContext acParent, AccessibleTableInfo *tableInfo);
+
+ BOOL getAccessibleTableCellInfo(long vmID, AccessibleTable accessibleTable, jint row, jint column,
+ AccessibleTableCellInfo *tableCellInfo);
+
+ BOOL getAccessibleTableRowHeader(long vmID, AccessibleContext acParent, AccessibleTableInfo *tableInfo);
+ BOOL getAccessibleTableColumnHeader(long vmID, AccessibleContext acParent, AccessibleTableInfo *tableInfo);
+
+ AccessibleContext getAccessibleTableRowDescription(long vmID, AccessibleContext acParent, jint row);
+ AccessibleContext getAccessibleTableColumnDescription(long vmID, AccessibleContext acParent, jint column);
+
+ jint getAccessibleTableRowSelectionCount(long vmID, AccessibleTable table);
+ BOOL isAccessibleTableRowSelected(long vmID, AccessibleTable table, jint row);
+ BOOL getAccessibleTableRowSelections(long vmID, AccessibleTable table, jint count, jint *selections);
+
+ jint getAccessibleTableColumnSelectionCount(long vmID, AccessibleTable table);
+ BOOL isAccessibleTableColumnSelected(long vmID, AccessibleTable table, jint column);
+ BOOL getAccessibleTableColumnSelections(long vmID, AccessibleTable table, jint count, jint *selections);
+
+ jint getAccessibleTableRow(long vmID, AccessibleTable table, jint index);
+ jint getAccessibleTableColumn(long vmID, AccessibleTable table, jint index);
+ jint getAccessibleTableIndex(long vmID, AccessibleTable table, jint row, jint column);
+ /* end AccessibleTable */
+
+ /* ----- AccessibleRelationSet routines */
+ BOOL getAccessibleRelationSet(long vmID, AccessibleContext accessibleContext,
+ AccessibleRelationSetInfo *relationSetInfo);
+
+ /* ----- AccessibleHypertext routines */
+
+ /*
+ * Returns hypertext information associated with a component.
+ */
+ BOOL getAccessibleHypertext(long vmID, AccessibleContext accessibleContext,
+ AccessibleHypertextInfo *hypertextInfo);
+
+ /*
+ * Requests that a hyperlink be activated.
+ */
+ BOOL activateAccessibleHyperlink(long vmID, AccessibleContext accessibleContext,
+ AccessibleHyperlink accessibleHyperlink);
+
+ /*
+ * Returns the number of hyperlinks in a component
+ * Maps to AccessibleHypertext.getLinkCount.
+ * Returns -1 on error.
+ */
+ jint getAccessibleHyperlinkCount(const long vmID,
+ const AccessibleHypertext hypertext);
+
+ /*
+ * This method is used to iterate through the hyperlinks in a component. It
+ * returns hypertext information for a component starting at hyperlink index
+ * nStartIndex. No more than MAX_HYPERLINKS AccessibleHypertextInfo objects will
+ * be returned for each call to this method.
+ * Returns FALSE on error.
+ */
+ BOOL getAccessibleHypertextExt(const long vmID,
+ const AccessibleContext accessibleContext,
+ const jint nStartIndex,
+ /* OUT */ AccessibleHypertextInfo *hypertextInfo);
+
+ /*
+ * Returns the index into an array of hyperlinks that is associated with
+ * a character index in document; maps to AccessibleHypertext.getLinkIndex
+ * Returns -1 on error.
+ */
+ jint getAccessibleHypertextLinkIndex(const long vmID,
+ const AccessibleHypertext hypertext,
+ const jint nIndex);
+
+ /*
+ * Returns the nth hyperlink in a document
+ * Maps to AccessibleHypertext.getLink.
+ * Returns FALSE on error
+ */
+ BOOL getAccessibleHyperlink(const long vmID,
+ const AccessibleHypertext hypertext,
+ const jint nIndex,
+ /* OUT */ AccessibleHyperlinkInfo *hyperlinkInfo);
+
+ /* Accessible KeyBindings, Icons and Actions */
+
+ /*
+ * Returns a list of key bindings associated with a component.
+ */
+ BOOL getAccessibleKeyBindings(long vmID, AccessibleContext accessibleContext,
+ AccessibleKeyBindings *keyBindings);
+
+ /*
+ * Returns a list of icons associate with a component.
+ */
+ BOOL getAccessibleIcons(long vmID, AccessibleContext accessibleContext,
+ AccessibleIcons *icons);
+
+ /*
+ * Returns a list of actions that a component can perform.
+ */
+ BOOL getAccessibleActions(long vmID, AccessibleContext accessibleContext,
+ AccessibleActions *actions);
+
+ /*
+ * Request that a list of AccessibleActions be performed by a component.
+ * Returns TRUE if all actions are performed. Returns FALSE
+ * when the first requested action fails in which case "failure"
+ * contains the index of the action that failed.
+ */
+ BOOL doAccessibleActions(long vmID, AccessibleContext accessibleContext,
+ AccessibleActionsToDo *actionsToDo, jint *failure);
+
+
+
+ /* Additional utility methods */
+
+ /*
+ * Returns whether two object references refer to the same object.
+ */
+ BOOL IsSameObject(long vmID, JOBJECT64 obj1, JOBJECT64 obj2);
+
+ /**
+ * Sets editable text contents. The AccessibleContext must implement AccessibleEditableText and
+ * be editable. The maximum text length that can be set is MAX_STRING_SIZE - 1.
+ * Returns whether successful
+ */
+ BOOL setTextContents (const long vmID, const AccessibleContext accessibleContext, const wchar_t *text);
+
+ /**
+ * Returns the Accessible Context with the specified role that is the
+ * ancestor of a given object. The role is one of the role strings
+ * defined in AccessBridgePackages.h
+ * If there is no ancestor object that has the specified role,
+ * returns (AccessibleContext)0.
+ */
+ AccessibleContext getParentWithRole (const long vmID, const AccessibleContext accessibleContext,
+ const wchar_t *role);
+
+ /**
+ * Returns the Accessible Context with the specified role that is the
+ * ancestor of a given object. The role is one of the role strings
+ * defined in AccessBridgePackages.h. If an object with the specified
+ * role does not exist, returns the top level object for the Java Window.
+ * Returns (AccessibleContext)0 on error.
+ */
+ AccessibleContext getParentWithRoleElseRoot (const long vmID, const AccessibleContext accessibleContext,
+ const wchar_t *role);
+
+ /**
+ * Returns the Accessible Context for the top level object in
+ * a Java Window. This is same Accessible Context that is obtained
+ * from GetAccessibleContextFromHWND for that window. Returns
+ * (AccessibleContext)0 on error.
+ */
+ AccessibleContext getTopLevelObject (const long vmID, const AccessibleContext accessibleContext);
+
+ /**
+ * Returns how deep in the object hierarchy a given object is.
+ * The top most object in the object hierarchy has an object depth of 0.
+ * Returns -1 on error.
+ */
+ int getObjectDepth (const long vmID, const AccessibleContext accessibleContext);
+
+ /**
+ * Returns the Accessible Context of the current ActiveDescendent of an object.
+ * This method assumes the ActiveDescendent is the component that is currently
+ * selected in a container object.
+ * Returns (AccessibleContext)0 on error or if there is no selection.
+ */
+ AccessibleContext getActiveDescendent (const long vmID, const AccessibleContext accessibleContext);
+
+ /**
+ /**
+ * Accessible Value routines
+ */
+ BOOL GetCurrentAccessibleValueFromContext(long vmID, AccessibleValue av, wchar_t *value, short len);
+ BOOL GetMaximumAccessibleValueFromContext(long vmID, AccessibleValue av, wchar_t *value, short len);
+ BOOL GetMinimumAccessibleValueFromContext(long vmID, AccessibleValue av, wchar_t *value, short len);
+
+ /**
+ * Accessible Selection routines
+ */
+ void AddAccessibleSelectionFromContext(long vmID, AccessibleSelection as, int i);
+ void ClearAccessibleSelectionFromContext(long vmID, AccessibleSelection as);
+ JOBJECT64 GetAccessibleSelectionFromContext(long vmID, AccessibleSelection as, int i);
+ int GetAccessibleSelectionCountFromContext(long vmID, AccessibleSelection as);
+ BOOL IsAccessibleChildSelectedFromContext(long vmID, AccessibleSelection as, int i);
+ void RemoveAccessibleSelectionFromContext(long vmID, AccessibleSelection as, int i);
+ void SelectAllAccessibleSelectionFromContext(long vmID, AccessibleSelection as);
+
+ /**
+ * Additional methods for Teton
+ */
+
+ /**
+ * Gets the AccessibleName for a component based upon the JAWS algorithm. Returns
+ * whether successful.
+ *
+ * Bug ID 4916682 - Implement JAWS AccessibleName policy
+ */
+ BOOL getVirtualAccessibleName(const long vmID, const AccessibleContext accessibleContext,
+ wchar_t *name, int len);
+
+ /**
+ * Request focus for a component. Returns whether successful.
+ *
+ * Bug ID 4944757 - requestFocus method needed
+ */
+ BOOL requestFocus(const long vmID, const AccessibleContext accessibleContext);
+
+ /**
+ * Selects text between two indices. Selection includes the text at the start index
+ * and the text at the end index. Returns whether successful.
+ *
+ * Bug ID 4944758 - selectTextRange method needed
+ */
+ BOOL selectTextRange(const long vmID, const AccessibleContext accessibleContext, const int startIndex,
+ const int endIndex);
+
+ /**
+ * Get text attributes between two indices. The attribute list includes the text at the
+ * start index and the text at the end index. Returns whether successful;
+ *
+ * Bug ID 4944761 - getTextAttributes between two indices method needed
+ */
+ BOOL getTextAttributesInRange(const long vmID, const AccessibleContext accessibleContext,
+ const int startIndex, const int endIndex,
+ AccessibleTextAttributesInfo *attributes, short *len);
+
+ /**
+ * Returns the number of visible children of a component. Returns -1 on error.
+ *
+ * Bug ID 4944762- getVisibleChildren for list-like components needed
+ */
+ int getVisibleChildrenCount(const long vmID, const AccessibleContext accessibleContext);
+
+ /**
+ * Gets the visible children of an AccessibleContext. Returns whether successful.
+ *
+ * Bug ID 4944762- getVisibleChildren for list-like components needed
+ */
+ BOOL getVisibleChildren(const long vmID, const AccessibleContext accessibleContext,
+ const int startIndex,
+ VisibleChildrenInfo *visibleChildrenInfo);
+
+ /**
+ * Set the caret to a text position. Returns whether successful.
+ *
+ * Bug ID 4944770 - setCaretPosition method needed
+ */
+ BOOL setCaretPosition(const long vmID, const AccessibleContext accessibleContext,
+ const int position);
+
+ /**
+ * Gets the text caret location
+ */
+ BOOL getCaretLocation(long vmID, AccessibleContext ac,
+ AccessibleTextRectInfo *rectInfo, jint index);
+
+ /**
+ * Gets the number of events waiting to fire
+ */
+ int getEventsWaiting();
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/love2dToAPK/tools/tools/jdk-win/include/win32/bridge/AccessBridgePackages.h b/love2dToAPK/tools/tools/jdk-win/include/win32/bridge/AccessBridgePackages.h
new file mode 100644
index 0000000..42e9460
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/include/win32/bridge/AccessBridgePackages.h
@@ -0,0 +1,2195 @@
+/*
+ * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.
+ * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ */
+
+/*
+ * Header file for packages of paramaters passed between Java Accessibility
+ * and native Assistive Technologies
+ */
+
+#ifndef __AccessBridgePackages_H__
+#define __AccessBridgePackages_H__
+
+#include <jni.h>
+#include <windows.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef ACCESSBRIDGE_ARCH_LEGACY
+typedef jobject JOBJECT64;
+typedef HWND ABHWND64;
+#define ABHandleToLong
+#define ABLongToHandle
+#else
+typedef jlong JOBJECT64;
+typedef long ABHWND64;
+#define ABHandleToLong HandleToLong
+#define ABLongToHandle LongToHandle
+#endif
+
+#define MAX_BUFFER_SIZE 10240
+#define MAX_STRING_SIZE 1024
+#define SHORT_STRING_SIZE 256
+
+ // object types
+ typedef JOBJECT64 AccessibleContext;
+ typedef JOBJECT64 AccessibleText;
+ typedef JOBJECT64 AccessibleValue;
+ typedef JOBJECT64 AccessibleSelection;
+ typedef JOBJECT64 Java_Object;
+ typedef JOBJECT64 PropertyChangeEvent;
+ typedef JOBJECT64 FocusEvent;
+ typedef JOBJECT64 CaretEvent;
+ typedef JOBJECT64 MouseEvent;
+ typedef JOBJECT64 MenuEvent;
+ typedef JOBJECT64 AccessibleTable;
+ typedef JOBJECT64 AccessibleHyperlink;
+ typedef JOBJECT64 AccessibleHypertext;
+
+ /**
+ ******************************************************
+ * Java event types
+ ******************************************************
+ */
+
+#define cPropertyChangeEvent (jlong) 1 // 1
+#define cFocusGainedEvent (jlong) 2 // 2
+#define cFocusLostEvent (jlong) 4 // 4
+#define cCaretUpdateEvent (jlong) 8 // 8
+#define cMouseClickedEvent (jlong) 16 // 10
+#define cMouseEnteredEvent (jlong) 32 // 20
+#define cMouseExitedEvent (jlong) 64 // 40
+#define cMousePressedEvent (jlong) 128 // 80
+#define cMouseReleasedEvent (jlong) 256 // 100
+#define cMenuCanceledEvent (jlong) 512 // 200
+#define cMenuDeselectedEvent (jlong) 1024 // 400
+#define cMenuSelectedEvent (jlong) 2048 // 800
+#define cPopupMenuCanceledEvent (jlong) 4096 // 1000
+#define cPopupMenuWillBecomeInvisibleEvent (jlong) 8192 // 2000
+#define cPopupMenuWillBecomeVisibleEvent (jlong) 16384 // 4000
+#define cJavaShutdownEvent (jlong) 32768 // 8000
+
+ /**
+ ******************************************************
+ * Accessible Roles
+ * Defines all AccessibleRoles in Local.US
+ ******************************************************
+ */
+
+ /**
+ * Object is used to alert the user about something.
+ */
+#define ACCESSIBLE_ALERT L"alert"
+
+ /**
+ * The header for a column of data.
+ */
+#define ACCESSIBLE_COLUMN_HEADER L"column header"
+
+ /**
+ * Object that can be drawn into and is used to trap
+ * events.
+ * see ACCESSIBLE_FRAME
+ * see ACCESSIBLE_GLASS_PANE
+ * see ACCESSIBLE_LAYERED_PANE
+ */
+#define ACCESSIBLE_CANVAS L"canvas"
+
+ /**
+ * A list of choices the user can select from. Also optionally
+ * allows the user to enter a choice of their own.
+ */
+#define ACCESSIBLE_COMBO_BOX L"combo box"
+
+ /**
+ * An iconified internal frame in a DESKTOP_PANE.
+ * see ACCESSIBLE_DESKTOP_PANE
+ * see ACCESSIBLE_INTERNAL_FRAME
+ */
+#define ACCESSIBLE_DESKTOP_ICON L"desktop icon"
+
+ /**
+ * A frame-like object that is clipped by a desktop pane. The
+ * desktop pane, internal frame, and desktop icon objects are
+ * often used to create multiple document interfaces within an
+ * application.
+ * see ACCESSIBLE_DESKTOP_ICON
+ * see ACCESSIBLE_DESKTOP_PANE
+ * see ACCESSIBLE_FRAME
+ */
+#define ACCESSIBLE_INTERNAL_FRAME L"internal frame"
+
+ /**
+ * A pane that supports internal frames and
+ * iconified versions of those internal frames.
+ * see ACCESSIBLE_DESKTOP_ICON
+ * see ACCESSIBLE_INTERNAL_FRAME
+ */
+#define ACCESSIBLE_DESKTOP_PANE L"desktop pane"
+
+ /**
+ * A specialized pane whose primary use is inside a DIALOG
+ * see ACCESSIBLE_DIALOG
+ */
+#define ACCESSIBLE_OPTION_PANE L"option pane"
+
+ /**
+ * A top level window with no title or border.
+ * see ACCESSIBLE_FRAME
+ * see ACCESSIBLE_DIALOG
+ */
+#define ACCESSIBLE_WINDOW L"window"
+
+ /**
+ * A top level window with a title bar, border, menu bar, etc. It is
+ * often used as the primary window for an application.
+ * see ACCESSIBLE_DIALOG
+ * see ACCESSIBLE_CANVAS
+ * see ACCESSIBLE_WINDOW
+ */
+#define ACCESSIBLE_FRAME L"frame"
+
+ /**
+ * A top level window with title bar and a border. A dialog is similar
+ * to a frame, but it has fewer properties and is often used as a
+ * secondary window for an application.
+ * see ACCESSIBLE_FRAME
+ * see ACCESSIBLE_WINDOW
+ */
+#define ACCESSIBLE_DIALOG L"dialog"
+
+ /**
+ * A specialized dialog that lets the user choose a color.
+ */
+#define ACCESSIBLE_COLOR_CHOOSER L"color chooser"
+
+
+ /**
+ * A pane that allows the user to navigate through
+ * and select the contents of a directory. May be used
+ * by a file chooser.
+ * see ACCESSIBLE_FILE_CHOOSER
+ */
+#define ACCESSIBLE_DIRECTORY_PANE L"directory pane"
+
+ /**
+ * A specialized dialog that displays the files in the directory
+ * and lets the user select a file, browse a different directory,
+ * or specify a filename. May use the directory pane to show the
+ * contents of a directory.
+ * see ACCESSIBLE_DIRECTORY_PANE
+ */
+#define ACCESSIBLE_FILE_CHOOSER L"file chooser"
+
+ /**
+ * An object that fills up space in a user interface. It is often
+ * used in interfaces to tweak the spacing between components,
+ * but serves no other purpose.
+ */
+#define ACCESSIBLE_FILLER L"filler"
+
+ /**
+ * A hypertext anchor
+ */
+#define ACCESSIBLE_HYPERLINK L"hyperlink"
+
+ /**
+ * A small fixed size picture, typically used to decorate components.
+ */
+#define ACCESSIBLE_ICON L"icon"
+
+ /**
+ * An object used to present an icon or short string in an interface.
+ */
+#define ACCESSIBLE_LABEL L"label"
+
+ /**
+ * A specialized pane that has a glass pane and a layered pane as its
+ * children.
+ * see ACCESSIBLE_GLASS_PANE
+ * see ACCESSIBLE_LAYERED_PANE
+ */
+#define ACCESSIBLE_ROOT_PANE L"root pane"
+
+ /**
+ * A pane that is guaranteed to be painted on top
+ * of all panes beneath it.
+ * see ACCESSIBLE_ROOT_PANE
+ * see ACCESSIBLE_CANVAS
+ */
+#define ACCESSIBLE_GLASS_PANE L"glass pane"
+
+ /**
+ * A specialized pane that allows its children to be drawn in layers,
+ * providing a form of stacking order. This is usually the pane that
+ * holds the menu bar as well as the pane that contains most of the
+ * visual components in a window.
+ * see ACCESSIBLE_GLASS_PANE
+ * see ACCESSIBLE_ROOT_PANE
+ */
+#define ACCESSIBLE_LAYERED_PANE L"layered pane"
+
+ /**
+ * An object that presents a list of objects to the user and allows the
+ * user to select one or more of them. A list is usually contained
+ * within a scroll pane.
+ * see ACCESSIBLE_SCROLL_PANE
+ * see ACCESSIBLE_LIST_ITEM
+ */
+#define ACCESSIBLE_LIST L"list"
+
+ /**
+ * An object that presents an element in a list. A list is usually
+ * contained within a scroll pane.
+ * see ACCESSIBLE_SCROLL_PANE
+ * see ACCESSIBLE_LIST
+ */
+#define ACCESSIBLE_LIST_ITEM L"list item"
+
+ /**
+ * An object usually drawn at the top of the primary dialog box of
+ * an application that contains a list of menus the user can choose
+ * from. For example, a menu bar might contain menus for "File,"
+ * "Edit," and "Help."
+ * see ACCESSIBLE_MENU
+ * see ACCESSIBLE_POPUP_MENU
+ * see ACCESSIBLE_LAYERED_PANE
+ */
+#define ACCESSIBLE_MENU_BAR L"menu bar"
+
+ /**
+ * A temporary window that is usually used to offer the user a
+ * list of choices, and then hides when the user selects one of
+ * those choices.
+ * see ACCESSIBLE_MENU
+ * see ACCESSIBLE_MENU_ITEM
+ */
+#define ACCESSIBLE_POPUP_MENU L"popup menu"
+
+ /**
+ * An object usually found inside a menu bar that contains a list
+ * of actions the user can choose from. A menu can have any object
+ * as its children, but most often they are menu items, other menus,
+ * or rudimentary objects such as radio buttons, check boxes, or
+ * separators. For example, an application may have an "Edit" menu
+ * that contains menu items for "Cut" and "Paste."
+ * see ACCESSIBLE_MENU_BAR
+ * see ACCESSIBLE_MENU_ITEM
+ * see ACCESSIBLE_SEPARATOR
+ * see ACCESSIBLE_RADIO_BUTTON
+ * see ACCESSIBLE_CHECK_BOX
+ * see ACCESSIBLE_POPUP_MENU
+ */
+#define ACCESSIBLE_MENU L"menu"
+
+ /**
+ * An object usually contained in a menu that presents an action
+ * the user can choose. For example, the "Cut" menu item in an
+ * "Edit" menu would be an action the user can select to cut the
+ * selected area of text in a document.
+ * see ACCESSIBLE_MENU_BAR
+ * see ACCESSIBLE_SEPARATOR
+ * see ACCESSIBLE_POPUP_MENU
+ */
+#define ACCESSIBLE_MENU_ITEM L"menu item"
+
+ /**
+ * An object usually contained in a menu to provide a visual
+ * and logical separation of the contents in a menu. For example,
+ * the "File" menu of an application might contain menu items for
+ * "Open," "Close," and "Exit," and will place a separator between
+ * "Close" and "Exit" menu items.
+ * see ACCESSIBLE_MENU
+ * see ACCESSIBLE_MENU_ITEM
+ */
+#define ACCESSIBLE_SEPARATOR L"separator"
+
+ /**
+ * An object that presents a series of panels (or page tabs), one at a
+ * time, through some mechanism provided by the object. The most common
+ * mechanism is a list of tabs at the top of the panel. The children of
+ * a page tab list are all page tabs.
+ * see ACCESSIBLE_PAGE_TAB
+ */
+#define ACCESSIBLE_PAGE_TAB_LIST L"page tab list"
+
+ /**
+ * An object that is a child of a page tab list. Its sole child is
+ * the panel that is to be presented to the user when the user
+ * selects the page tab from the list of tabs in the page tab list.
+ * see ACCESSIBLE_PAGE_TAB_LIST
+ */
+#define ACCESSIBLE_PAGE_TAB L"page tab"
+
+ /**
+ * A generic container that is often used to group objects.
+ */
+#define ACCESSIBLE_PANEL L"panel"
+
+ /**
+ * An object used to indicate how much of a task has been completed.
+ */
+#define ACCESSIBLE_PROGRESS_BAR L"progress bar"
+
+ /**
+ * A text object used for passwords, or other places where the
+ * text contents is not shown visibly to the user
+ */
+#define ACCESSIBLE_PASSWORD_TEXT L"password text"
+
+ /**
+ * An object the user can manipulate to tell the application to do
+ * something.
+ * see ACCESSIBLE_CHECK_BOX
+ * see ACCESSIBLE_TOGGLE_BUTTON
+ * see ACCESSIBLE_RADIO_BUTTON
+ */
+#define ACCESSIBLE_PUSH_BUTTON L"push button"
+
+ /**
+ * A specialized push button that can be checked or unchecked, but
+ * does not provide a separate indicator for the current state.
+ * see ACCESSIBLE_PUSH_BUTTON
+ * see ACCESSIBLE_CHECK_BOX
+ * see ACCESSIBLE_RADIO_BUTTON
+ */
+#define ACCESSIBLE_TOGGLE_BUTTON L"toggle button"
+
+ /**
+ * A choice that can be checked or unchecked and provides a
+ * separate indicator for the current state.
+ * see ACCESSIBLE_PUSH_BUTTON
+ * see ACCESSIBLE_TOGGLE_BUTTON
+ * see ACCESSIBLE_RADIO_BUTTON
+ */
+#define ACCESSIBLE_CHECK_BOX L"check box"
+
+ /**
+ * A specialized check box that will cause other radio buttons in the
+ * same group to become unchecked when this one is checked.
+ * see ACCESSIBLE_PUSH_BUTTON
+ * see ACCESSIBLE_TOGGLE_BUTTON
+ * see ACCESSIBLE_CHECK_BOX
+ */
+#define ACCESSIBLE_RADIO_BUTTON L"radio button"
+
+ /**
+ * The header for a row of data.
+ */
+#define ACCESSIBLE_ROW_HEADER L"row header"
+
+ /**
+ * An object that allows a user to incrementally view a large amount
+ * of information. Its children can include scroll bars and a viewport.
+ * see ACCESSIBLE_SCROLL_BAR
+ * see ACCESSIBLE_VIEWPORT
+ */
+#define ACCESSIBLE_SCROLL_PANE L"scroll pane"
+
+ /**
+ * An object usually used to allow a user to incrementally view a
+ * large amount of data. Usually used only by a scroll pane.
+ * see ACCESSIBLE_SCROLL_PANE
+ */
+#define ACCESSIBLE_SCROLL_BAR L"scroll bar"
+
+ /**
+ * An object usually used in a scroll pane. It represents the portion
+ * of the entire data that the user can see. As the user manipulates
+ * the scroll bars, the contents of the viewport can change.
+ * see ACCESSIBLE_SCROLL_PANE
+ */
+#define ACCESSIBLE_VIEWPORT L"viewport"
+
+ /**
+ * An object that allows the user to select from a bounded range. For
+ * example, a slider might be used to select a number between 0 and 100.
+ */
+#define ACCESSIBLE_SLIDER L"slider"
+
+ /**
+ * A specialized panel that presents two other panels at the same time.
+ * Between the two panels is a divider the user can manipulate to make
+ * one panel larger and the other panel smaller.
+ */
+#define ACCESSIBLE_SPLIT_PANE L"split pane"
+
+ /**
+ * An object used to present information in terms of rows and columns.
+ * An example might include a spreadsheet application.
+ */
+#define ACCESSIBLE_TABLE L"table"
+
+ /**
+ * An object that presents text to the user. The text is usually
+ * editable by the user as opposed to a label.
+ * see ACCESSIBLE_LABEL
+ */
+#define ACCESSIBLE_TEXT L"text"
+
+ /**
+ * An object used to present hierarchical information to the user.
+ * The individual nodes in the tree can be collapsed and expanded
+ * to provide selective disclosure of the tree's contents.
+ */
+#define ACCESSIBLE_TREE L"tree"
+
+ /**
+ * A bar or palette usually composed of push buttons or toggle buttons.
+ * It is often used to provide the most frequently used functions for an
+ * application.
+ */
+#define ACCESSIBLE_TOOL_BAR L"tool bar"
+
+ /**
+ * An object that provides information about another object. The
+ * accessibleDescription property of the tool tip is often displayed
+ * to the user in a small L"help bubble" when the user causes the
+ * mouse to hover over the object associated with the tool tip.
+ */
+#define ACCESSIBLE_TOOL_TIP L"tool tip"
+
+ /**
+ * An AWT component, but nothing else is known about it.
+ * see ACCESSIBLE_SWING_COMPONENT
+ * see ACCESSIBLE_UNKNOWN
+ */
+#define ACCESSIBLE_AWT_COMPONENT L"awt component"
+
+ /**
+ * A Swing component, but nothing else is known about it.
+ * see ACCESSIBLE_AWT_COMPONENT
+ * see ACCESSIBLE_UNKNOWN
+ */
+#define ACCESSIBLE_SWING_COMPONENT L"swing component"
+
+ /**
+ * The object contains some Accessible information, but its role is
+ * not known.
+ * see ACCESSIBLE_AWT_COMPONENT
+ * see ACCESSIBLE_SWING_COMPONENT
+ */
+#define ACCESSIBLE_UNKNOWN L"unknown"
+
+ /**
+ * A STATUS_BAR is an simple component that can contain
+ * multiple labels of status information to the user.
+ */
+#define ACCESSIBLE_STATUS_BAR L"status bar"
+
+ /**
+ * A DATE_EDITOR is a component that allows users to edit
+ * java.util.Date and java.util.Time objects
+ */
+#define ACCESSIBLE_DATE_EDITOR L"date editor"
+
+ /**
+ * A SPIN_BOX is a simple spinner component and its main use
+ * is for simple numbers.
+ */
+#define ACCESSIBLE_SPIN_BOX L"spin box"
+
+ /**
+ * A FONT_CHOOSER is a component that lets the user pick various
+ * attributes for fonts.
+ */
+#define ACCESSIBLE_FONT_CHOOSER L"font chooser"
+
+ /**
+ * A GROUP_BOX is a simple container that contains a border
+ * around it and contains components inside it.
+ */
+#define ACCESSIBLE_GROUP_BOX L"group box"
+
+ /**
+ * A text header
+ */
+#define ACCESSIBLE_HEADER L"header"
+
+ /**
+ * A text footer
+ */
+#define ACCESSIBLE_FOOTER L"footer"
+
+ /**
+ * A text paragraph
+ */
+#define ACCESSIBLE_PARAGRAPH L"paragraph"
+
+ /**
+ * A ruler is an object used to measure distance
+ */
+#define ACCESSIBLE_RULER L"ruler"
+
+ /**
+ * A role indicating the object acts as a formula for
+ * calculating a value. An example is a formula in
+ * a spreadsheet cell.
+ */
+#define ACCESSIBLE_EDITBAR L"editbar"
+
+ /**
+ * A role indicating the object monitors the progress
+ * of some operation.
+ */
+#define PROGRESS_MONITOR L"progress monitor"
+
+
+ /**
+ ******************************************************
+ * Accessibility event types
+ ******************************************************
+ */
+
+#define cPropertyNameChangeEvent (jlong) 1 // 1
+#define cPropertyDescriptionChangeEvent (jlong) 2 // 2
+#define cPropertyStateChangeEvent (jlong) 4 // 4
+#define cPropertyValueChangeEvent (jlong) 8 // 8
+#define cPropertySelectionChangeEvent (jlong) 16 // 10
+#define cPropertyTextChangeEvent (jlong) 32 // 20
+#define cPropertyCaretChangeEvent (jlong) 64 // 40
+#define cPropertyVisibleDataChangeEvent (jlong) 128 // 80
+#define cPropertyChildChangeEvent (jlong) 256 // 100
+#define cPropertyActiveDescendentChangeEvent (jlong) 512 // 200
+#define cPropertyTableModelChangeEvent (jlong) 1024 // 400
+
+ /**
+ ******************************************************
+ * optional AccessibleContext interfaces
+ *
+ * This version of the bridge reuses the accessibleValue
+ * field in the AccessibleContextInfo struct to represent
+ * additional optional interfaces that are supported by
+ * the Java AccessibleContext. This is backwardly compatable
+ * because the old accessibleValue was set to the BOOL
+ * value TRUE (i.e., 1) if the AccessibleValue interface is
+ * supported.
+ ******************************************************
+ */
+
+#define cAccessibleValueInterface (jlong) 1 // 1 << 1 (TRUE)
+#define cAccessibleActionInterface (jlong) 2 // 1 << 2
+#define cAccessibleComponentInterface (jlong) 4 // 1 << 3
+#define cAccessibleSelectionInterface (jlong) 8 // 1 << 4
+#define cAccessibleTableInterface (jlong) 16 // 1 << 5
+#define cAccessibleTextInterface (jlong) 32 // 1 << 6
+#define cAccessibleHypertextInterface (jlong) 64 // 1 << 7
+
+
+ /**
+ ******************************************************
+ * Accessibility information bundles
+ ******************************************************
+ */
+
+ typedef struct AccessBridgeVersionInfoTag {
+ wchar_t VMversion[SHORT_STRING_SIZE]; // output of "java -version"
+ wchar_t bridgeJavaClassVersion[SHORT_STRING_SIZE]; // version of the AccessBridge.class
+ wchar_t bridgeJavaDLLVersion[SHORT_STRING_SIZE]; // version of JavaAccessBridge.dll
+ wchar_t bridgeWinDLLVersion[SHORT_STRING_SIZE]; // version of WindowsAccessBridge.dll
+ } AccessBridgeVersionInfo;
+
+
+ typedef struct AccessibleContextInfoTag {
+ wchar_t name[MAX_STRING_SIZE]; // the AccessibleName of the object
+ wchar_t description[MAX_STRING_SIZE]; // the AccessibleDescription of the object
+
+ wchar_t role[SHORT_STRING_SIZE]; // localized AccesibleRole string
+ wchar_t role_en_US[SHORT_STRING_SIZE]; // AccesibleRole string in the en_US locale
+ wchar_t states[SHORT_STRING_SIZE]; // localized AccesibleStateSet string (comma separated)
+ wchar_t states_en_US[SHORT_STRING_SIZE]; // AccesibleStateSet string in the en_US locale (comma separated)
+
+ jint indexInParent; // index of object in parent
+ jint childrenCount; // # of children, if any
+
+ jint x; // screen coords in pixels
+ jint y; // "
+ jint width; // pixel width of object
+ jint height; // pixel height of object
+
+ BOOL accessibleComponent; // flags for various additional
+ BOOL accessibleAction; // Java Accessibility interfaces
+ BOOL accessibleSelection; // FALSE if this object doesn't
+ BOOL accessibleText; // implement the additional interface
+ // in question
+
+ // BOOL accessibleValue; // old BOOL indicating whether AccessibleValue is supported
+ BOOL accessibleInterfaces; // new bitfield containing additional interface flags
+
+ } AccessibleContextInfo;
+
+
+
+ // AccessibleText packages
+ typedef struct AccessibleTextInfoTag {
+ jint charCount; // # of characters in this text object
+ jint caretIndex; // index of caret
+ jint indexAtPoint; // index at the passsed in point
+ } AccessibleTextInfo;
+
+ typedef struct AccessibleTextItemsInfoTag {
+ wchar_t letter;
+ wchar_t word[SHORT_STRING_SIZE];
+ wchar_t sentence[MAX_STRING_SIZE];
+ } AccessibleTextItemsInfo;
+
+ typedef struct AccessibleTextSelectionInfoTag {
+ jint selectionStartIndex;
+ jint selectionEndIndex;
+ wchar_t selectedText[MAX_STRING_SIZE];
+ } AccessibleTextSelectionInfo;
+
+ typedef struct AccessibleTextRectInfoTag {
+ jint x; // bounding rect of char at index
+ jint y; // "
+ jint width; // "
+ jint height; // "
+ } AccessibleTextRectInfo;
+
+ // standard attributes for text; note: tabstops are not supported
+ typedef struct AccessibleTextAttributesInfoTag {
+ BOOL bold;
+ BOOL italic;
+ BOOL underline;
+ BOOL strikethrough;
+ BOOL superscript;
+ BOOL subscript;
+
+ wchar_t backgroundColor[SHORT_STRING_SIZE];
+ wchar_t foregroundColor[SHORT_STRING_SIZE];
+ wchar_t fontFamily[SHORT_STRING_SIZE];
+ jint fontSize;
+
+ jint alignment;
+ jint bidiLevel;
+
+ jfloat firstLineIndent;
+ jfloat leftIndent;
+ jfloat rightIndent;
+ jfloat lineSpacing;
+ jfloat spaceAbove;
+ jfloat spaceBelow;
+
+ wchar_t fullAttributesString[MAX_STRING_SIZE];
+ } AccessibleTextAttributesInfo;
+
+ /**
+ ******************************************************
+ * IPC management typedefs
+ ******************************************************
+ */
+
+#define cMemoryMappedNameSize 255
+
+ /**
+ * sent by the WindowsDLL -> the memory-mapped file is setup
+ *
+ */
+ typedef struct MemoryMappedFileCreatedPackageTag {
+// HWND bridgeWindow; // redundant, but easier to get to here...
+ ABHWND64 bridgeWindow; // redundant, but easier to get to here...
+ char filename[cMemoryMappedNameSize];
+ } MemoryMappedFileCreatedPackage;
+
+
+
+
+ /**
+ * sent when a new JavaVM attaches to the Bridge
+ *
+ */
+ typedef struct JavaVMCreatedPackageTag {
+ ABHWND64 bridgeWindow;
+ long vmID;
+ } JavaVMCreatedPackage;
+
+ /**
+ * sent when a JavaVM detatches from the Bridge
+ *
+ */
+ typedef struct JavaVMDestroyedPackageTag {
+ ABHWND64 bridgeWindow;
+ } JavaVMDestroyedPackage;
+
+ /**
+ * sent when a new AT attaches to the Bridge
+ *
+ */
+ typedef struct WindowsATCreatedPackageTag {
+ ABHWND64 bridgeWindow;
+ } WindowsATCreatedPackage;
+
+ /**
+ * sent when an AT detatches from the Bridge
+ *
+ */
+ typedef struct WindowsATDestroyedPackageTag {
+ ABHWND64 bridgeWindow;
+ } WindowsATDestroyedPackage;
+
+
+ /**
+ * sent by JVM Bridges in response to a WindowsATCreate
+ * message; saying "howdy, welcome to the neighborhood"
+ *
+ */
+ typedef struct JavaVMPresentNotificationPackageTag {
+ ABHWND64 bridgeWindow;
+ long vmID;
+ } JavaVMPresentNotificationPackage;
+
+ /**
+ * sent by AT Bridges in response to a JavaVMCreate
+ * message; saying "howdy, welcome to the neighborhood"
+ *
+ */
+ typedef struct WindowsATPresentNotificationPackageTag {
+ ABHWND64 bridgeWindow;
+ } WindowsATPresentNotificationPackage;
+
+
+ /**
+ ******************************************************
+ * Core packages
+ ******************************************************
+ */
+
+ typedef struct ReleaseJavaObjectPackageTag {
+ long vmID;
+ JOBJECT64 object;
+ } ReleaseJavaObjectPackage;
+
+ typedef struct GetAccessBridgeVersionPackageTag {
+ long vmID; // can't get VM info w/out a VM!
+ AccessBridgeVersionInfo rVersionInfo;
+ } GetAccessBridgeVersionPackage;
+
+ typedef struct IsSameObjectPackageTag {
+ long vmID;
+ JOBJECT64 obj1;
+ JOBJECT64 obj2;
+ jboolean rResult;
+ } IsSameObjectPackage;
+
+ /**
+ ******************************************************
+ * Windows packages
+ ******************************************************
+ */
+
+ typedef struct IsJavaWindowPackageTag {
+ jint window;
+ jboolean rResult;
+ } IsJavaWindowPackage;
+
+ typedef struct GetAccessibleContextFromHWNDPackageTag {
+ jint window;
+ long rVMID;
+ JOBJECT64 rAccessibleContext;
+ } GetAccessibleContextFromHWNDPackage;
+
+ typedef struct GetHWNDFromAccessibleContextPackageTag {
+ JOBJECT64 accessibleContext;
+ ABHWND64 rHWND;
+ } GetHWNDFromAccessibleContextPackage;
+
+ /**
+******************************************************
+* AccessibleContext packages
+******************************************************
+*/
+
+ typedef struct GetAccessibleContextAtPackageTag {
+ jint x;
+ jint y;
+ long vmID;
+ JOBJECT64 AccessibleContext; // look within this AC
+ JOBJECT64 rAccessibleContext;
+ } GetAccessibleContextAtPackage;
+
+ typedef struct GetAccessibleContextWithFocusPackageTag {
+ long rVMID;
+ JOBJECT64 rAccessibleContext;
+ } GetAccessibleContextWithFocusPackage;
+
+ typedef struct GetAccessibleContextInfoPackageTag {
+ long vmID;
+ JOBJECT64 AccessibleContext;
+ AccessibleContextInfo rAccessibleContextInfo;
+ } GetAccessibleContextInfoPackage;
+
+ typedef struct GetAccessibleChildFromContextPackageTag {
+ long vmID;
+ JOBJECT64 AccessibleContext;
+ jint childIndex;
+ JOBJECT64 rAccessibleContext;
+ } GetAccessibleChildFromContextPackage;
+
+ typedef struct GetAccessibleParentFromContextPackageTag {
+ long vmID;
+ JOBJECT64 AccessibleContext;
+ JOBJECT64 rAccessibleContext;
+ } GetAccessibleParentFromContextPackage;
+
+ /**
+******************************************************
+* AccessibleTable packages
+******************************************************
+*/
+
+#define MAX_TABLE_SELECTIONS 64
+
+ // table information
+ typedef struct AccessibleTableInfoTag {
+ JOBJECT64 caption; // AccesibleContext
+ JOBJECT64 summary; // AccessibleContext
+ jint rowCount;
+ jint columnCount;
+ JOBJECT64 accessibleContext;
+ JOBJECT64 accessibleTable;
+ } AccessibleTableInfo;
+
+ typedef struct GetAccessibleTableInfoPackageTag {
+ long vmID;
+ JOBJECT64 accessibleContext;
+ AccessibleTableInfo rTableInfo;
+ } GetAccessibleTableInfoPackage;
+
+ // table cell information
+ typedef struct AccessibleTableCellInfoTag {
+ JOBJECT64 accessibleContext;
+ jint index;
+ jint row;
+ jint column;
+ jint rowExtent;
+ jint columnExtent;
+ jboolean isSelected;
+ } AccessibleTableCellInfo;
+
+ typedef struct GetAccessibleTableCellInfoPackageTag {
+ long vmID;
+ JOBJECT64 accessibleTable;
+ jint row;
+ jint column;
+ AccessibleTableCellInfo rTableCellInfo;
+ } GetAccessibleTableCellInfoPackage;
+
+ typedef struct GetAccessibleTableRowHeaderPackageTag {
+ long vmID;
+ JOBJECT64 accessibleContext;
+ AccessibleTableInfo rTableInfo;
+ } GetAccessibleTableRowHeaderPackage;
+
+ typedef struct GetAccessibleTableColumnHeaderPackageTag {
+ long vmID;
+ JOBJECT64 accessibleContext;
+ AccessibleTableInfo rTableInfo;
+ } GetAccessibleTableColumnHeaderPackage;
+
+ typedef struct GetAccessibleTableRowDescriptionPackageTag {
+ long vmID;
+ JOBJECT64 accessibleContext;
+ jint row;
+ JOBJECT64 rAccessibleContext;
+ } GetAccessibleTableRowDescriptionPackage;
+
+ typedef struct GetAccessibleTableColumnDescriptionPackageTag {
+ long vmID;
+ JOBJECT64 accessibleContext;
+ jint column;
+ JOBJECT64 rAccessibleContext;
+ } GetAccessibleTableColumnDescriptionPackage;
+
+ typedef struct GetAccessibleTableRowSelectionCountPackageTag {
+ long vmID;
+ JOBJECT64 accessibleTable;
+ jint rCount;
+ } GetAccessibleTableRowSelectionCountPackage;
+
+ typedef struct IsAccessibleTableRowSelectedPackageTag {
+ long vmID;
+ JOBJECT64 accessibleTable;
+ jint row;
+ jboolean rResult;
+ } IsAccessibleTableRowSelectedPackage;
+
+ typedef struct GetAccessibleTableRowSelectionsPackageTag {
+ long vmID;
+ JOBJECT64 accessibleTable;
+ jint count;
+ jint rSelections[MAX_TABLE_SELECTIONS];
+ } GetAccessibleTableRowSelectionsPackage;
+
+ typedef struct GetAccessibleTableColumnSelectionCountPackageTag {
+ long vmID;
+ JOBJECT64 accessibleTable;
+ jint rCount;
+ } GetAccessibleTableColumnSelectionCountPackage;
+
+ typedef struct IsAccessibleTableColumnSelectedPackageTag {
+ long vmID;
+ JOBJECT64 accessibleTable;
+ jint column;
+ jboolean rResult;
+ } IsAccessibleTableColumnSelectedPackage;
+
+ typedef struct GetAccessibleTableColumnSelectionsPackageTag {
+ long vmID;
+ JOBJECT64 accessibleTable;
+ jint count;
+ jint rSelections[MAX_TABLE_SELECTIONS];
+ } GetAccessibleTableColumnSelectionsPackage;
+
+
+ typedef struct GetAccessibleTableRowPackageTag {
+ long vmID;
+ JOBJECT64 accessibleTable;
+ jint index;
+ jint rRow;
+ } GetAccessibleTableRowPackage;
+
+ typedef struct GetAccessibleTableColumnPackageTag {
+ long vmID;
+ JOBJECT64 accessibleTable;
+ jint index;
+ jint rColumn;
+ } GetAccessibleTableColumnPackage;
+
+ typedef struct GetAccessibleTableIndexPackageTag {
+ long vmID;
+ JOBJECT64 accessibleTable;
+ jint row;
+ jint column;
+ jint rIndex;
+ } GetAccessibleTableIndexPackage;
+
+
+ /**
+ ******************************************************
+ * AccessibleRelationSet packages
+ ******************************************************
+ */
+
+#define MAX_RELATION_TARGETS 25
+#define MAX_RELATIONS 5
+
+ typedef struct AccessibleRelationInfoTag {
+ wchar_t key[SHORT_STRING_SIZE];
+ jint targetCount;
+ JOBJECT64 targets[MAX_RELATION_TARGETS]; // AccessibleContexts
+ } AccessibleRelationInfo;
+
+ typedef struct AccessibleRelationSetInfoTag {
+ jint relationCount;
+ AccessibleRelationInfo relations[MAX_RELATIONS];
+ } AccessibleRelationSetInfo;
+
+ typedef struct GetAccessibleRelationSetPackageTag {
+ long vmID;
+ JOBJECT64 accessibleContext;
+ AccessibleRelationSetInfo rAccessibleRelationSetInfo;
+ } GetAccessibleRelationSetPackage;
+
+ /**
+ ******************************************************
+ * AccessibleHypertext packagess
+ ******************************************************
+ */
+
+#define MAX_HYPERLINKS 64 // maximum number of hyperlinks returned
+
+ // hyperlink information
+ typedef struct AccessibleHyperlinkInfoTag {
+ wchar_t text[SHORT_STRING_SIZE]; // the hyperlink text
+ jint startIndex; //index in the hypertext document where the link begins
+ jint endIndex; //index in the hypertext document where the link ends
+ JOBJECT64 accessibleHyperlink; // AccessibleHyperlink object
+ } AccessibleHyperlinkInfo;
+
+ // hypertext information
+ typedef struct AccessibleHypertextInfoTag {
+ jint linkCount; // number of hyperlinks
+ AccessibleHyperlinkInfo links[MAX_HYPERLINKS]; // the hyperlinks
+ JOBJECT64 accessibleHypertext; // AccessibleHypertext object
+ } AccessibleHypertextInfo;
+
+ // struct for sending a message to get the hypertext for an AccessibleContext
+ typedef struct GetAccessibleHypertextPackageTag {
+ long vmID; // the virtual machine ID
+ JOBJECT64 accessibleContext; // AccessibleContext with hypertext
+ AccessibleHypertextInfo rAccessibleHypertextInfo; // returned hypertext
+ } GetAccessibleHypertextPackage;
+
+ // struct for sending an message to activate a hyperlink
+ typedef struct ActivateAccessibleHyperlinkPackageTag {
+ long vmID; // the virtual machine ID
+ JOBJECT64 accessibleContext; // AccessibleContext containing the link
+ JOBJECT64 accessibleHyperlink; // the link to activate
+ BOOL rResult; // hyperlink activation return value
+ } ActivateAccessibleHyperlinkPackage;
+
+ // struct for sending a message to get the number of hyperlinks in a component
+ typedef struct GetAccessibleHyperlinkCountPackageTag {
+ long vmID; // the virtual machine ID
+ JOBJECT64 accessibleContext; // AccessibleContext containing AccessibleHypertext
+ jint rLinkCount; // link count return value
+ } GetAccessibleHyperlinkCountPackage;
+
+ // struct for sending a message to get the hypertext for an AccessibleContext
+ // starting at a specified index in the document
+ typedef struct GetAccessibleHypertextExtPackageTag {
+ long vmID; // the virtual machine ID
+ JOBJECT64 accessibleContext; // AccessibleContext with hypertext
+ jint startIndex; // start index in document
+ AccessibleHypertextInfo rAccessibleHypertextInfo; // returned hypertext
+ BOOL rSuccess; // whether call succeeded
+ } GetAccessibleHypertextExtPackage;
+
+ // struct for sending a message to get the nth hyperlink in a document;
+ // maps to AccessibleHypertext.getLink
+ typedef struct GetAccessibleHyperlinkPackageTag {
+ long vmID; // the virtual machine ID
+ JOBJECT64 hypertext; // AccessibleHypertext
+ jint linkIndex; // hyperlink index
+ AccessibleHyperlinkInfo rAccessibleHyperlinkInfo; // returned hyperlink
+ } GetAccessibleHyperlinkPackage;
+
+ // struct for sending a message to get the index into an array
+ // of hyperlinks that is associated with a character index in a
+ // document; maps to AccessibleHypertext.getLinkIndex
+ typedef struct GetAccessibleHypertextLinkIndexPackageTag {
+ long vmID; // the virtual machine ID
+ JOBJECT64 hypertext; // AccessibleHypertext
+ jint charIndex; // character index in document
+ jint rLinkIndex; // returned hyperlink index
+ } GetAccessibleHypertextLinkIndexPackage;
+
+ /**
+ ******************************************************
+ * Accessible Key Bindings packages
+ ******************************************************
+ */
+
+#define MAX_KEY_BINDINGS 10
+
+ // keyboard character modifiers
+#define ACCESSIBLE_SHIFT_KEYSTROKE 1
+#define ACCESSIBLE_CONTROL_KEYSTROKE 2
+#define ACCESSIBLE_META_KEYSTROKE 4
+#define ACCESSIBLE_ALT_KEYSTROKE 8
+#define ACCESSIBLE_ALT_GRAPH_KEYSTROKE 16
+#define ACCESSIBLE_BUTTON1_KEYSTROKE 32
+#define ACCESSIBLE_BUTTON2_KEYSTROKE 64
+#define ACCESSIBLE_BUTTON3_KEYSTROKE 128
+#define ACCESSIBLE_FKEY_KEYSTROKE 256 // F key pressed, character contains 1-24
+#define ACCESSIBLE_CONTROLCODE_KEYSTROKE 512 // Control code key pressed, character contains control code.
+
+// The supported control code keys are:
+#define ACCESSIBLE_VK_BACK_SPACE 8
+#define ACCESSIBLE_VK_DELETE 127
+#define ACCESSIBLE_VK_DOWN 40
+#define ACCESSIBLE_VK_END 35
+#define ACCESSIBLE_VK_HOME 36
+#define ACCESSIBLE_VK_INSERT 155
+#define ACCESSIBLE_VK_KP_DOWN 225
+#define ACCESSIBLE_VK_KP_LEFT 226
+#define ACCESSIBLE_VK_KP_RIGHT 227
+#define ACCESSIBLE_VK_KP_UP 224
+#define ACCESSIBLE_VK_LEFT 37
+#define ACCESSIBLE_VK_PAGE_DOWN 34
+#define ACCESSIBLE_VK_PAGE_UP 33
+#define ACCESSIBLE_VK_RIGHT 39
+#define ACCESSIBLE_VK_UP 38
+
+ // a key binding associates with a component
+ typedef struct AccessibleKeyBindingInfoTag {
+ jchar character; // the key character
+ jint modifiers; // the key modifiers
+ } AccessibleKeyBindingInfo;
+
+ // all of the key bindings associated with a component
+ typedef struct AccessibleKeyBindingsTag {
+ int keyBindingsCount; // number of key bindings
+ AccessibleKeyBindingInfo keyBindingInfo[MAX_KEY_BINDINGS];
+ } AccessibleKeyBindings;
+
+ // struct to get the key bindings associated with a component
+ typedef struct GetAccessibleKeyBindingsPackageTag {
+ long vmID; // the virtual machine id
+ JOBJECT64 accessibleContext; // the component
+ AccessibleKeyBindings rAccessibleKeyBindings; // the key bindings
+ } GetAccessibleKeyBindingsPackage;
+
+ /**
+******************************************************
+* AccessibleIcon packages
+******************************************************
+*/
+#define MAX_ICON_INFO 8
+
+ // an icon assocated with a component
+ typedef struct AccessibleIconInfoTag {
+ wchar_t description[SHORT_STRING_SIZE]; // icon description
+ jint height; // icon height
+ jint width; // icon width
+ } AccessibleIconInfo;
+
+ // all of the icons associated with a component
+ typedef struct AccessibleIconsTag {
+ jint iconsCount; // number of icons
+ AccessibleIconInfo iconInfo[MAX_ICON_INFO]; // the icons
+ } AccessibleIcons;
+
+ // struct to get the icons associated with a component
+ typedef struct GetAccessibleIconsPackageTag {
+ long vmID; // the virtual machine id
+ JOBJECT64 accessibleContext; // the component
+ AccessibleIcons rAccessibleIcons; // the icons
+ } GetAccessibleIconsPackage;
+
+
+ /**
+******************************************************
+* AccessibleAction packages
+******************************************************
+*/
+#define MAX_ACTION_INFO 256
+#define MAX_ACTIONS_TO_DO 32
+
+ // an action assocated with a component
+ typedef struct AccessibleActionInfoTag {
+ wchar_t name[SHORT_STRING_SIZE]; // action name
+ } AccessibleActionInfo;
+
+ // all of the actions associated with a component
+ typedef struct AccessibleActionsTag {
+ jint actionsCount; // number of actions
+ AccessibleActionInfo actionInfo[MAX_ACTION_INFO]; // the action information
+ } AccessibleActions;
+
+ // struct for requesting the actions associated with a component
+ typedef struct GetAccessibleActionsPackageTag {
+ long vmID;
+ JOBJECT64 accessibleContext; // the component
+ AccessibleActions rAccessibleActions; // the actions
+ } GetAccessibleActionsPackage;
+
+ // list of AccessibleActions to do
+ typedef struct AccessibleActionsToDoTag {
+ jint actionsCount; // number of actions to do
+ AccessibleActionInfo actions[MAX_ACTIONS_TO_DO];// the accessible actions to do
+ } AccessibleActionsToDo;
+
+ // struct for sending an message to do one or more actions
+ typedef struct DoAccessibleActionsPackageTag {
+ long vmID; // the virtual machine ID
+ JOBJECT64 accessibleContext; // component to do the action
+ AccessibleActionsToDo actionsToDo; // the accessible actions to do
+ BOOL rResult; // action return value
+ jint failure; // index of action that failed if rResult is FALSE
+ } DoAccessibleActionsPackage;
+
+ /**
+******************************************************
+* AccessibleText packages
+******************************************************
+*/
+
+ typedef struct GetAccessibleTextInfoPackageTag {
+ long vmID;
+ JOBJECT64 AccessibleContext;
+ jint x;
+ jint y;
+ AccessibleTextInfo rTextInfo;
+ } GetAccessibleTextInfoPackage;
+
+ typedef struct GetAccessibleTextItemsPackageTag {
+ long vmID;
+ JOBJECT64 AccessibleContext;
+ jint index;
+ AccessibleTextItemsInfo rTextItemsInfo;
+ } GetAccessibleTextItemsPackage;
+
+ typedef struct GetAccessibleTextSelectionInfoPackageTag {
+ long vmID;
+ JOBJECT64 AccessibleContext;
+ AccessibleTextSelectionInfo rTextSelectionItemsInfo;
+ } GetAccessibleTextSelectionInfoPackage;
+
+ typedef struct GetAccessibleTextAttributeInfoPackageTag {
+ long vmID;
+ JOBJECT64 AccessibleContext;
+ jint index;
+ AccessibleTextAttributesInfo rAttributeInfo;
+ } GetAccessibleTextAttributeInfoPackage;
+
+ typedef struct GetAccessibleTextRectInfoPackageTag {
+ long vmID;
+ JOBJECT64 AccessibleContext;
+ jint index;
+ AccessibleTextRectInfo rTextRectInfo;
+ } GetAccessibleTextRectInfoPackage;
+
+ typedef struct GetCaretLocationPackageTag {
+ long vmID;
+ JOBJECT64 AccessibleContext;
+ jint index;
+ AccessibleTextRectInfo rTextRectInfo;
+ } GetCaretLocationPackage;
+
+ typedef struct GetAccessibleTextLineBoundsPackageTag {
+ long vmID;
+ JOBJECT64 AccessibleContext;
+ jint index;
+ jint rLineStart;
+ jint rLineEnd;
+ } GetAccessibleTextLineBoundsPackage;
+
+ typedef struct GetAccessibleTextRangePackageTag {
+ long vmID;
+ JOBJECT64 AccessibleContext;
+ jint start;
+ jint end;
+ wchar_t rText[MAX_BUFFER_SIZE];
+ } GetAccessibleTextRangePackage;
+
+ /**
+******************************************************
+*
+* Utility method packages
+******************************************************
+*/
+
+ typedef struct SetTextContentsPackageTag {
+ long vmID;
+ JOBJECT64 accessibleContext; // the text field
+ wchar_t text[MAX_STRING_SIZE]; // the text
+ BOOL rResult;
+ } SetTextContentsPackage;
+
+ typedef struct GetParentWithRolePackageTag {
+ long vmID;
+ JOBJECT64 accessibleContext;
+ wchar_t role[SHORT_STRING_SIZE]; // one of Accessible Roles above
+ JOBJECT64 rAccessibleContext;
+ } GetParentWithRolePackage;
+
+ typedef struct GetTopLevelObjectPackageTag {
+ long vmID;
+ JOBJECT64 accessibleContext;
+ JOBJECT64 rAccessibleContext;
+ } GetTopLevelObjectPackage;
+
+ typedef struct GetParentWithRoleElseRootPackageTag {
+ long vmID;
+ JOBJECT64 accessibleContext;
+ wchar_t role[SHORT_STRING_SIZE]; // one of Accessible Roles above
+ JOBJECT64 rAccessibleContext;
+ } GetParentWithRoleElseRootPackage;
+
+ typedef struct GetObjectDepthPackageTag {
+ long vmID;
+ JOBJECT64 accessibleContext;
+ jint rResult;
+ } GetObjectDepthPackage;
+
+ typedef struct GetActiveDescendentPackageTag {
+ long vmID;
+ JOBJECT64 accessibleContext;
+ JOBJECT64 rAccessibleContext;
+ } GetActiveDescendentPackage;
+
+ /**
+******************************************************
+* AccessibleValue packages
+******************************************************
+*/
+
+ typedef struct GetCurrentAccessibleValueFromContextPackageTag {
+ long vmID;
+ JOBJECT64 AccessibleContext;
+ wchar_t rValue[SHORT_STRING_SIZE];
+ } GetCurrentAccessibleValueFromContextPackage;
+
+ typedef struct GetMaximumAccessibleValueFromContextPackageTag {
+ long vmID;
+ JOBJECT64 AccessibleContext;
+ wchar_t rValue[SHORT_STRING_SIZE];
+ } GetMaximumAccessibleValueFromContextPackage;
+
+ typedef struct GetMinimumAccessibleValueFromContextPackageTag {
+ long vmID;
+ JOBJECT64 AccessibleContext;
+ wchar_t rValue[SHORT_STRING_SIZE];
+ } GetMinimumAccessibleValueFromContextPackage;
+
+
+ /**
+******************************************************
+* AccessibleSelection packages
+******************************************************
+*/
+
+ typedef struct AddAccessibleSelectionFromContextPackageTag {
+ long vmID;
+ JOBJECT64 AccessibleContext;
+ jint index;
+ } AddAccessibleSelectionFromContextPackage;
+
+ typedef struct ClearAccessibleSelectionFromContextPackageTag {
+ long vmID;
+ JOBJECT64 AccessibleContext;
+ } ClearAccessibleSelectionFromContextPackage;
+
+ typedef struct GetAccessibleSelectionFromContextPackageTag {
+ long vmID;
+ JOBJECT64 AccessibleContext;
+ jint index;
+ JOBJECT64 rAccessibleContext;
+ } GetAccessibleSelectionFromContextPackage;
+
+ typedef struct GetAccessibleSelectionCountFromContextPackageTag {
+ long vmID;
+ JOBJECT64 AccessibleContext;
+ jint rCount;
+ } GetAccessibleSelectionCountFromContextPackage;
+
+ typedef struct IsAccessibleChildSelectedFromContextPackageTag {
+ long vmID;
+ JOBJECT64 AccessibleContext;
+ jint index;
+ jboolean rResult;
+ } IsAccessibleChildSelectedFromContextPackage;
+
+ typedef struct RemoveAccessibleSelectionFromContextPackageTag {
+ long vmID;
+ JOBJECT64 AccessibleContext;
+ jint index;
+ } RemoveAccessibleSelectionFromContextPackage;
+
+ typedef struct SelectAllAccessibleSelectionFromContextPackageTag {
+ long vmID;
+ JOBJECT64 AccessibleContext;
+ } SelectAllAccessibleSelectionFromContextPackage;
+
+
+ /**
+******************************************************
+* Java Event Notification Registration packages
+******************************************************
+*/
+
+ typedef struct AddJavaEventNotificationPackageTag {
+ jlong type;
+ //HWND DLLwindow;
+ ABHWND64 DLLwindow;
+ } AddJavaEventNotificationPackage;
+
+ typedef struct RemoveJavaEventNotificationPackageTag {
+ jlong type;
+ //HWND DLLwindow;
+ ABHWND64 DLLwindow;
+ } RemoveJavaEventNotificationPackage;
+
+
+ /**
+******************************************************
+* Accessibility Event Notification Registration packages
+******************************************************
+*/
+
+ typedef struct AddAccessibilityEventNotificationPackageTag {
+ jlong type;
+ //HWND DLLwindow;
+ ABHWND64 DLLwindow;
+ } AddAccessibilityEventNotificationPackage;
+
+ typedef struct RemoveAccessibilityEventNotificationPackageTag {
+ jlong type;
+ //HWND DLLwindow;
+ ABHWND64 DLLwindow;
+ } RemoveAccessibilityEventNotificationPackage;
+
+
+ /**
+******************************************************
+* Accessibility Property Change Event packages
+******************************************************
+*/
+
+ typedef struct PropertyCaretChangePackageTag {
+ long vmID;
+ JOBJECT64 Event;
+ JOBJECT64 AccessibleContextSource;
+ jint oldPosition;
+ jint newPosition;
+ } PropertyCaretChangePackage;
+
+ typedef struct PropertyDescriptionChangePackageTag {
+ long vmID;
+ JOBJECT64 Event;
+ JOBJECT64 AccessibleContextSource;
+ wchar_t oldDescription[SHORT_STRING_SIZE];
+ wchar_t newDescription[SHORT_STRING_SIZE];
+ } PropertyDescriptionChangePackage;
+
+ typedef struct PropertyNameChangePackageTag {
+ long vmID;
+ JOBJECT64 Event;
+ JOBJECT64 AccessibleContextSource;
+ wchar_t oldName[SHORT_STRING_SIZE];
+ wchar_t newName[SHORT_STRING_SIZE];
+ } PropertyNameChangePackage;
+
+ typedef struct PropertySelectionChangePackageTag {
+ long vmID;
+ JOBJECT64 Event;
+ JOBJECT64 AccessibleContextSource;
+ } PropertySelectionChangePackage;
+
+ typedef struct PropertyStateChangePackageTag {
+ long vmID;
+ JOBJECT64 Event;
+ JOBJECT64 AccessibleContextSource;
+ wchar_t oldState[SHORT_STRING_SIZE];
+ wchar_t newState[SHORT_STRING_SIZE];
+ } PropertyStateChangePackage;
+
+ typedef struct PropertyTextChangePackageTag {
+ long vmID;
+ JOBJECT64 Event;
+ JOBJECT64 AccessibleContextSource;
+ } PropertyTextChangePackage;
+
+ typedef struct PropertyValueChangePackageTag {
+ long vmID;
+ JOBJECT64 Event;
+ JOBJECT64 AccessibleContextSource;
+ wchar_t oldValue[SHORT_STRING_SIZE];
+ wchar_t newValue[SHORT_STRING_SIZE];
+ } PropertyValueChangePackage;
+
+ typedef struct PropertyVisibleDataChangePackageTag {
+ long vmID;
+ JOBJECT64 Event;
+ JOBJECT64 AccessibleContextSource;
+ } PropertyVisibleDataChangePackage;
+
+ typedef struct PropertyChildChangePackageTag {
+ long vmID;
+ JOBJECT64 Event;
+ JOBJECT64 AccessibleContextSource;
+ JOBJECT64 oldChildAccessibleContext;
+ JOBJECT64 newChildAccessibleContext;
+ } PropertyChildChangePackage;
+
+ typedef struct PropertyActiveDescendentChangePackageTag {
+ long vmID;
+ JOBJECT64 Event;
+ JOBJECT64 AccessibleContextSource;
+ JOBJECT64 oldActiveDescendentAccessibleContext;
+ JOBJECT64 newActiveDescendentAccessibleContext;
+ } PropertyActiveDescendentChangePackage;
+
+
+ // String format for newValue is:
+ // "type" one of "INSERT", "UPDATE" or "DELETE"
+ // "firstRow"
+ // "lastRow"
+ // "firstColumn"
+ // "lastColumn"
+ //
+ // oldValue is currently unused
+ //
+ typedef struct PropertyTableModelChangePackageTag {
+ long vmID;
+ JOBJECT64 Event;
+ JOBJECT64 AccessibleContextSource;
+ wchar_t oldValue[SHORT_STRING_SIZE];
+ wchar_t newValue[SHORT_STRING_SIZE];
+ } PropertyTableModelChangePackage;
+
+
+ /**
+******************************************************
+* Property Change Event packages
+******************************************************
+*/
+
+ /*
+ typedef struct PropertyChangePackageTag {
+ long vmID;
+ jobject Event;
+ jobject AccessibleContextSource;
+ char propertyName[SHORT_STRING_SIZE];
+ char oldValue[SHORT_STRING_SIZE]; // PropertyChangeEvent().getOldValue().toString()
+ char newValue[SHORT_STRING_SIZE]; // PropertyChangeEvent().getNewValue().toString()
+ } PropertyChangePackage;
+ */
+
+ /*
+ * Java shutdown event package
+ */
+ typedef struct JavaShutdownPackageTag {
+ long vmID;
+ } JavaShutdownPackage;
+
+
+ /**
+******************************************************
+* Focus Event packages
+******************************************************
+*/
+
+ typedef struct FocusGainedPackageTag {
+ long vmID;
+ JOBJECT64 Event;
+ JOBJECT64 AccessibleContextSource;
+ } FocusGainedPackage;
+
+ typedef struct FocusLostPackageTag {
+ long vmID;
+ JOBJECT64 Event;
+ JOBJECT64 AccessibleContextSource;
+ } FocusLostPackage;
+
+
+ /**
+******************************************************
+* Caret Event packages
+******************************************************
+*/
+
+ typedef struct CaretUpdatePackageTag {
+ long vmID;
+ JOBJECT64 Event;
+ JOBJECT64 AccessibleContextSource;
+ } CaretUpdatePackage;
+
+
+ /**
+******************************************************
+* Mouse Event packages
+******************************************************
+*/
+
+ typedef struct MouseClickedPackageTag {
+ long vmID;
+ JOBJECT64 Event;
+ JOBJECT64 AccessibleContextSource;
+ } MouseClickedPackage;
+
+ typedef struct MouseEnteredPackageTag {
+ long vmID;
+ JOBJECT64 Event;
+ JOBJECT64 AccessibleContextSource;
+ } MouseEnteredPackage;
+
+ typedef struct MouseExitedPackageTag {
+ long vmID;
+ JOBJECT64 Event;
+ JOBJECT64 AccessibleContextSource;
+ } MouseExitedPackage;
+
+ typedef struct MousePressedPackageTag {
+ long vmID;
+ JOBJECT64 Event;
+ JOBJECT64 AccessibleContextSource;
+ } MousePressedPackage;
+
+ typedef struct MouseReleasedPackageTag {
+ long vmID;
+ JOBJECT64 Event;
+ JOBJECT64 AccessibleContextSource;
+ } MouseReleasedPackage;
+
+
+ /**
+******************************************************
+* Menu/PopupMenu Event packages
+******************************************************
+*/
+
+ typedef struct MenuCanceledPackageTag {
+ long vmID;
+ JOBJECT64 Event;
+ JOBJECT64 AccessibleContextSource;
+ } MenuCanceledPackage;
+
+ typedef struct MenuDeselectedPackageTag {
+ long vmID;
+ JOBJECT64 Event;
+ JOBJECT64 AccessibleContextSource;
+ } MenuDeselectedPackage;
+
+ typedef struct MenuSelectedPackageTag {
+ long vmID;
+ JOBJECT64 Event;
+ JOBJECT64 AccessibleContextSource;
+ } MenuSelectedPackage;
+
+
+ typedef struct PopupMenuCanceledPackageTag {
+ long vmID;
+ JOBJECT64 Event;
+ JOBJECT64 AccessibleContextSource;
+ } PopupMenuCanceledPackage;
+
+ typedef struct PopupMenuWillBecomeInvisiblePackageTag {
+ long vmID;
+ JOBJECT64 Event;
+ JOBJECT64 AccessibleContextSource;
+ } PopupMenuWillBecomeInvisiblePackage;
+
+ typedef struct PopupMenuWillBecomeVisiblePackageTag {
+ long vmID;
+ JOBJECT64 Event;
+ JOBJECT64 AccessibleContextSource;
+ } PopupMenuWillBecomeVisiblePackage;
+
+ /**
+******************************************************
+* Additional methods for Teton
+******************************************************
+*/
+
+ /**
+ * Gets the AccessibleName for a component based upon the JAWS algorithm. Returns
+ * whether successful.
+ *
+ * Bug ID 4916682 - Implement JAWS AccessibleName policy
+ */
+ typedef struct GetVirtualAccessibleNamePackageTag {
+ long vmID;
+ AccessibleContext accessibleContext;
+ wchar_t rName[MAX_STRING_SIZE];
+ int len;
+ } GetVirtualAccessibleNamePackage;
+
+ /**
+ * Request focus for a component. Returns whether successful;
+ *
+ * Bug ID 4944757 - requestFocus method needed
+ */
+ typedef struct RequestFocusPackageTag {
+ long vmID;
+ AccessibleContext accessibleContext;
+ } RequestFocusPackage;
+
+ /**
+ * Selects text between two indices. Selection includes the text at the start index
+ * and the text at the end index. Returns whether successful;
+ *
+ * Bug ID 4944758 - selectTextRange method needed
+ */
+ typedef struct SelectTextRangePackageTag {
+ long vmID;
+ AccessibleContext accessibleContext;
+ jint startIndex;
+ jint endIndex;
+ } SelectTextRangePackage;
+
+ /**
+ * Gets the number of contiguous characters with the same attributes.
+ *
+ * Bug ID 4944761 - getTextAttributes between two indices method needed
+ */
+ typedef struct GetTextAttributesInRangePackageTag {
+ long vmID;
+ AccessibleContext accessibleContext;
+ jint startIndex; // start index (inclusive)
+ jint endIndex; // end index (inclusive)
+ AccessibleTextAttributesInfo attributes; // character attributes to match
+ short rLength; // number of contiguous characters with matching attributes
+ } GetTextAttributesInRangePackage;
+
+#define MAX_VISIBLE_CHILDREN 256
+
+ // visible children information
+ typedef struct VisibleChildenInfoTag {
+ int returnedChildrenCount; // number of children returned
+ AccessibleContext children[MAX_VISIBLE_CHILDREN]; // the visible children
+ } VisibleChildrenInfo;
+
+ // struct for sending a message to get the number of visible children
+ typedef struct GetVisibleChildrenCountPackageTag {
+ long vmID; // the virtual machine ID
+ JOBJECT64 accessibleContext; // AccessibleContext of parent component
+ jint rChildrenCount; // visible children count return value
+ } GetVisibleChildrenCountPackage;
+
+ // struct for sending a message to get the hypertext for an AccessibleContext
+ // starting at a specified index in the document
+ typedef struct GetVisibleChildrenPackageTag {
+ long vmID; // the virtual machine ID
+ JOBJECT64 accessibleContext; // AccessibleContext of parent component
+ jint startIndex; // start index for retrieving children
+ VisibleChildrenInfo rVisibleChildrenInfo; // returned info
+ BOOL rSuccess; // whether call succeeded
+ } GetVisibleChildrenPackage;
+
+ /**
+ * Set the caret to a text position. Returns whether successful;
+ *
+ * Bug ID 4944770 - setCaretPosition method needed
+ */
+ typedef struct SetCaretPositionPackageTag {
+ long vmID;
+ AccessibleContext accessibleContext;
+ jint position;
+ } SetCaretPositionPackage;
+
+
+ /**
+ ******************************************************
+ * Wrapping up all of the packages
+ ******************************************************
+ */
+
+ /**
+ * What is the type of this package
+ */
+ typedef enum PackageType {
+
+ cMemoryMappedFileCreatedPackage = 0x11000,
+
+ // many of these will go away...
+ cJavaVMCreatedPackage = 0x10000,
+ cJavaVMDestroyedPackage,
+ cWindowsATCreatedPackage,
+ cWindowsATDestroyedPackage,
+ cJavaVMPresentNotificationPackage,
+ cWindowsATPresentNotificationPackage,
+
+ cReleaseJavaObjectPackage = 1,
+ cGetAccessBridgeVersionPackage = 2,
+
+ cGetAccessibleContextFromHWNDPackage = 0x10,
+ cIsJavaWindowPackage,
+ cGetHWNDFromAccessibleContextPackage,
+
+ cGetAccessibleContextAtPackage = 0x100,
+ cGetAccessibleContextWithFocusPackage,
+ cGetAccessibleContextInfoPackage,
+ cGetAccessibleChildFromContextPackage,
+ cGetAccessibleParentFromContextPackage,
+ cIsSameObjectPackage,
+
+ cGetAccessibleTextInfoPackage = 0x200,
+ cGetAccessibleTextItemsPackage,
+ cGetAccessibleTextSelectionInfoPackage,
+ cGetAccessibleTextAttributeInfoPackage,
+ cGetAccessibleTextRectInfoPackage,
+ cGetAccessibleTextLineBoundsPackage,
+ cGetAccessibleTextRangePackage,
+
+ cGetCurrentAccessibleValueFromContextPackage = 0x300,
+ cGetMaximumAccessibleValueFromContextPackage,
+ cGetMinimumAccessibleValueFromContextPackage,
+
+ cAddAccessibleSelectionFromContextPackage = 0x400,
+ cClearAccessibleSelectionFromContextPackage,
+ cGetAccessibleSelectionFromContextPackage,
+ cGetAccessibleSelectionCountFromContextPackage,
+ cIsAccessibleChildSelectedFromContextPackage,
+ cRemoveAccessibleSelectionFromContextPackage,
+ cSelectAllAccessibleSelectionFromContextPackage,
+
+ cAddJavaEventNotificationPackage = 0x900,
+ cRemoveJavaEventNotificationPackage,
+ cAddAccessibilityEventNotificationPackage,
+ cRemoveAccessibilityEventNotificationPackage,
+
+ cPropertyChangePackage = 0x1000,
+
+ cJavaShutdownPackage = 0x1010,
+ cFocusGainedPackage,
+ cFocusLostPackage,
+
+ cCaretUpdatePackage = 0x1020,
+
+ cMouseClickedPackage = 0x1030,
+ cMouseEnteredPackage,
+ cMouseExitedPackage,
+ cMousePressedPackage,
+ cMouseReleasedPackage,
+
+ cMenuCanceledPackage = 0x1040,
+ cMenuDeselectedPackage,
+ cMenuSelectedPackage,
+ cPopupMenuCanceledPackage,
+ cPopupMenuWillBecomeInvisiblePackage,
+ cPopupMenuWillBecomeVisiblePackage,
+
+ cPropertyCaretChangePackage = 0x1100,
+ cPropertyDescriptionChangePackage,
+ cPropertyNameChangePackage,
+ cPropertySelectionChangePackage,
+ cPropertyStateChangePackage,
+ cPropertyTextChangePackage,
+ cPropertyValueChangePackage,
+ cPropertyVisibleDataChangePackage,
+ cPropertyChildChangePackage,
+ cPropertyActiveDescendentChangePackage,
+
+
+ // AccessibleTable
+ cGetAccessibleTableInfoPackage = 0x1200,
+ cGetAccessibleTableCellInfoPackage,
+
+ cGetAccessibleTableRowHeaderPackage,
+ cGetAccessibleTableColumnHeaderPackage,
+
+ cGetAccessibleTableRowDescriptionPackage,
+ cGetAccessibleTableColumnDescriptionPackage,
+
+ cGetAccessibleTableRowSelectionCountPackage,
+ cIsAccessibleTableRowSelectedPackage,
+ cGetAccessibleTableRowSelectionsPackage,
+
+ cGetAccessibleTableColumnSelectionCountPackage,
+ cIsAccessibleTableColumnSelectedPackage,
+ cGetAccessibleTableColumnSelectionsPackage,
+
+ cGetAccessibleTableRowPackage,
+ cGetAccessibleTableColumnPackage,
+ cGetAccessibleTableIndexPackage,
+
+ cPropertyTableModelChangePackage,
+
+
+ // AccessibleRelationSet
+ cGetAccessibleRelationSetPackage = 0x1300,
+
+ // AccessibleHypertext
+ cGetAccessibleHypertextPackage = 0x1400,
+ cActivateAccessibleHyperlinkPackage,
+ cGetAccessibleHyperlinkCountPackage,
+ cGetAccessibleHypertextExtPackage,
+ cGetAccessibleHypertextLinkIndexPackage,
+ cGetAccessibleHyperlinkPackage,
+
+ // Accessible KeyBinding, Icon and Action
+ cGetAccessibleKeyBindingsPackage = 0x1500,
+ cGetAccessibleIconsPackage,
+ cGetAccessibleActionsPackage,
+ cDoAccessibleActionsPackage,
+
+ // Utility methods
+ cSetTextContentsPackage = 0x1600,
+ cGetParentWithRolePackage,
+ cGetTopLevelObjectPackage,
+ cGetParentWithRoleElseRootPackage,
+ cGetObjectDepthPackage,
+ cGetActiveDescendentPackage,
+
+ // Additional methods for Teton
+ cGetVirtualAccessibleNamePackage = 0x1700,
+ cRequestFocusPackage,
+ cSelectTextRangePackage,
+ cGetTextAttributesInRangePackage,
+ cGetSameTextAttributesInRangePackage,
+ cGetVisibleChildrenCountPackage,
+ cGetVisibleChildrenPackage,
+ cSetCaretPositionPackage,
+ cGetCaretLocationPackage
+
+
+ } PackageType;
+
+
+ /**
+ * Union of all package contents
+ */
+ typedef union AllPackagesTag {
+
+ // Initial Rendezvous packages
+ MemoryMappedFileCreatedPackage memoryMappedFileCreatedPackage;
+
+ JavaVMCreatedPackage javaVMCreatedPackage;
+ JavaVMDestroyedPackage javaVMDestroyedPackage;
+ WindowsATCreatedPackage windowsATCreatedPackage;
+ WindowsATDestroyedPackage windowsATDestroyedPackage;
+ JavaVMPresentNotificationPackage javaVMPresentNotificationPackage;
+ WindowsATPresentNotificationPackage windowsATPresentNotificationPackage;
+
+ // Core packages
+ ReleaseJavaObjectPackage releaseJavaObject;
+ GetAccessBridgeVersionPackage getAccessBridgeVersion;
+
+ // Window packages
+ GetAccessibleContextFromHWNDPackage getAccessibleContextFromHWND;
+ GetHWNDFromAccessibleContextPackage getHWNDFromAccessibleContext;
+
+ // AccessibleContext packages
+ GetAccessibleContextAtPackage getAccessibleContextAt;
+ GetAccessibleContextWithFocusPackage getAccessibleContextWithFocus;
+ GetAccessibleContextInfoPackage getAccessibleContextInfo;
+ GetAccessibleChildFromContextPackage getAccessibleChildFromContext;
+ GetAccessibleParentFromContextPackage getAccessibleParentFromContext;
+
+ // AccessibleText packages
+ GetAccessibleTextInfoPackage getAccessibleTextInfo;
+ GetAccessibleTextItemsPackage getAccessibleTextItems;
+ GetAccessibleTextSelectionInfoPackage getAccessibleTextSelectionInfo;
+ GetAccessibleTextAttributeInfoPackage getAccessibleTextAttributeInfo;
+ GetAccessibleTextRectInfoPackage getAccessibleTextRectInfo;
+ GetAccessibleTextLineBoundsPackage getAccessibleTextLineBounds;
+ GetAccessibleTextRangePackage getAccessibleTextRange;
+
+ // AccessibleValue packages
+ GetCurrentAccessibleValueFromContextPackage getCurrentAccessibleValueFromContext;
+ GetMaximumAccessibleValueFromContextPackage getMaximumAccessibleValueFromContext;
+ GetMinimumAccessibleValueFromContextPackage getMinimumAccessibleValueFromContext;
+
+ // AccessibleSelection packages
+ AddAccessibleSelectionFromContextPackage addAccessibleSelectionFromContext;
+ ClearAccessibleSelectionFromContextPackage clearAccessibleSelectionFromContext;
+ GetAccessibleSelectionFromContextPackage getAccessibleSelectionFromContext;
+ GetAccessibleSelectionCountFromContextPackage getAccessibleSelectionCountFromContext;
+ IsAccessibleChildSelectedFromContextPackage isAccessibleChildSelectedFromContext;
+ RemoveAccessibleSelectionFromContextPackage removeAccessibleSelectionFromContext;
+ SelectAllAccessibleSelectionFromContextPackage selectAllAccessibleSelectionFromContext;
+
+ // Event Notification Registration packages
+ AddJavaEventNotificationPackage addJavaEventNotification;
+ RemoveJavaEventNotificationPackage removeJavaEventNotification;
+ AddAccessibilityEventNotificationPackage addAccessibilityEventNotification;
+ RemoveAccessibilityEventNotificationPackage removeAccessibilityEventNotification;
+
+ // Event contents packages
+ // PropertyChangePackage propertyChange;
+ PropertyCaretChangePackage propertyCaretChangePackage;
+ PropertyDescriptionChangePackage propertyDescriptionChangePackage;
+ PropertyNameChangePackage propertyNameChangePackage;
+ PropertySelectionChangePackage propertySelectionChangePackage;
+ PropertyStateChangePackage propertyStateChangePackage;
+ PropertyTextChangePackage propertyTextChangePackage;
+ PropertyValueChangePackage propertyValueChangePackage;
+ PropertyVisibleDataChangePackage propertyVisibleDataChangePackage;
+ PropertyChildChangePackage propertyChildChangePackage;
+ PropertyActiveDescendentChangePackage propertyActiveDescendentChangePackage;
+
+ PropertyTableModelChangePackage propertyTableModelChangePackage;
+
+ JavaShutdownPackage JavaShutdown;
+ FocusGainedPackage focusGained;
+ FocusLostPackage focusLost;
+
+ CaretUpdatePackage caretUpdate;
+
+ MouseClickedPackage mouseClicked;
+ MouseEnteredPackage mouseEntered;
+ MouseExitedPackage mouseExited;
+ MousePressedPackage mousePressed;
+ MouseReleasedPackage mouseReleased;
+
+ MenuCanceledPackage menuCanceled;
+ MenuDeselectedPackage menuDeselected;
+ MenuSelectedPackage menuSelected;
+ PopupMenuCanceledPackage popupMenuCanceled;
+ PopupMenuWillBecomeInvisiblePackage popupMenuWillBecomeInvisible;
+ PopupMenuWillBecomeVisiblePackage popupMenuWillBecomeVisible;
+
+ // AccessibleRelationSet
+ GetAccessibleRelationSetPackage getAccessibleRelationSet;
+
+ // AccessibleHypertext
+ GetAccessibleHypertextPackage _getAccessibleHypertext;
+ ActivateAccessibleHyperlinkPackage _activateAccessibleHyperlink;
+ GetAccessibleHyperlinkCountPackage _getAccessibleHyperlinkCount;
+ GetAccessibleHypertextExtPackage _getAccessibleHypertextExt;
+ GetAccessibleHypertextLinkIndexPackage _getAccessibleHypertextLinkIndex;
+ GetAccessibleHyperlinkPackage _getAccessibleHyperlink;
+
+ // Accessible KeyBinding, Icon and Action
+ GetAccessibleKeyBindingsPackage getAccessibleKeyBindings;
+ GetAccessibleIconsPackage getAccessibleIcons;
+ GetAccessibleActionsPackage getAccessibleActions;
+ DoAccessibleActionsPackage doAccessibleActions;
+
+ // utility methods
+ SetTextContentsPackage _setTextContents;
+ GetParentWithRolePackage _getParentWithRole;
+ GetTopLevelObjectPackage _getTopLevelObject;
+ GetParentWithRoleElseRootPackage _getParentWithRoleElseRoot;
+ GetObjectDepthPackage _getObjectDepth;
+ GetActiveDescendentPackage _getActiveDescendent;
+
+ // Additional methods for Teton
+ GetVirtualAccessibleNamePackage _getVirtualAccessibleName;
+ RequestFocusPackage _requestFocus;
+ SelectTextRangePackage _selectTextRange;
+ GetTextAttributesInRangePackage _getTextAttributesInRange;
+ GetVisibleChildrenCountPackage _getVisibleChildrenCount;
+ GetVisibleChildrenPackage _getVisibleChildren;
+ SetCaretPositionPackage _setCaretPosition;
+
+ } AllPackages;
+
+
+ /**
+ * Union of all Java-initiated package contents
+ */
+ typedef union JavaInitiatedPackagesTag {
+
+ // Initial Rendezvous packages
+ JavaVMCreatedPackage javaVMCreatedPackage;
+ JavaVMDestroyedPackage javaVMDestroyedPackage;
+ JavaVMPresentNotificationPackage javaVMPresentNotificationPackage;
+
+ // Event contents packages
+ PropertyCaretChangePackage propertyCaretChangePackage;
+ PropertyDescriptionChangePackage propertyDescriptionChangePackage;
+ PropertyNameChangePackage propertyNameChangePackage;
+ PropertySelectionChangePackage propertySelectionChangePackage;
+ PropertyStateChangePackage propertyStateChangePackage;
+ PropertyTextChangePackage propertyTextChangePackage;
+ PropertyValueChangePackage propertyValueChangePackage;
+ PropertyVisibleDataChangePackage propertyVisibleDataChangePackage;
+ PropertyChildChangePackage propertyChildChangePackage;
+ PropertyActiveDescendentChangePackage propertyActiveDescendentChangePackage;
+
+ PropertyTableModelChangePackage propertyTableModelChangePackage;
+
+ JavaShutdownPackage JavaShutdown;
+ FocusGainedPackage focusGained;
+ FocusLostPackage focusLost;
+
+ CaretUpdatePackage caretUpdate;
+
+ MouseClickedPackage mouseClicked;
+ MouseEnteredPackage mouseEntered;
+ MouseExitedPackage mouseExited;
+ MousePressedPackage mousePressed;
+ MouseReleasedPackage mouseReleased;
+
+ MenuCanceledPackage menuCanceled;
+ MenuDeselectedPackage menuDeselected;
+ MenuSelectedPackage menuSelected;
+ PopupMenuCanceledPackage popupMenuCanceled;
+ PopupMenuWillBecomeInvisiblePackage popupMenuWillBecomeInvisible;
+ PopupMenuWillBecomeVisiblePackage popupMenuWillBecomeVisible;
+
+ } JavaInitiatedPackages;
+
+
+ /**
+ * Union of all Windows-initiated package contents
+ */
+ typedef union WindowsInitiatedPackagesTag {
+
+ // Initial Rendezvous packages
+ MemoryMappedFileCreatedPackage memoryMappedFileCreatedPackage;
+
+ WindowsATCreatedPackage windowsATCreatedPackage;
+ WindowsATDestroyedPackage windowsATDestroyedPackage;
+ WindowsATPresentNotificationPackage windowsATPresentNotificationPackage;
+
+ // Core packages
+ ReleaseJavaObjectPackage releaseJavaObject;
+ GetAccessBridgeVersionPackage getAccessBridgeVersion;
+
+ // Window packages
+ GetAccessibleContextFromHWNDPackage getAccessibleContextFromHWND;
+ GetHWNDFromAccessibleContextPackage getHWNDFromAccessibleContext;
+
+ // AccessibleContext packages
+ GetAccessibleContextAtPackage getAccessibleContextAt;
+ GetAccessibleContextWithFocusPackage getAccessibleContextWithFocus;
+ GetAccessibleContextInfoPackage getAccessibleContextInfo;
+ GetAccessibleChildFromContextPackage getAccessibleChildFromContext;
+ GetAccessibleParentFromContextPackage getAccessibleParentFromContext;
+
+ // AccessibleText packages
+ GetAccessibleTextInfoPackage getAccessibleTextInfo;
+ GetAccessibleTextItemsPackage getAccessibleTextItems;
+ GetAccessibleTextSelectionInfoPackage getAccessibleTextSelectionInfo;
+ GetAccessibleTextAttributeInfoPackage getAccessibleTextAttributeInfo;
+ GetAccessibleTextRectInfoPackage getAccessibleTextRectInfo;
+ GetAccessibleTextLineBoundsPackage getAccessibleTextLineBounds;
+ GetAccessibleTextRangePackage getAccessibleTextRange;
+
+ // AccessibleValue packages
+ GetCurrentAccessibleValueFromContextPackage getCurrentAccessibleValueFromContext;
+ GetMaximumAccessibleValueFromContextPackage getMaximumAccessibleValueFromContext;
+ GetMinimumAccessibleValueFromContextPackage getMinimumAccessibleValueFromContext;
+
+ // AccessibleSelection packages
+ AddAccessibleSelectionFromContextPackage addAccessibleSelectionFromContext;
+ ClearAccessibleSelectionFromContextPackage clearAccessibleSelectionFromContext;
+ GetAccessibleSelectionFromContextPackage getAccessibleSelectionFromContext;
+ GetAccessibleSelectionCountFromContextPackage getAccessibleSelectionCountFromContext;
+ IsAccessibleChildSelectedFromContextPackage isAccessibleChildSelectedFromContext;
+ RemoveAccessibleSelectionFromContextPackage removeAccessibleSelectionFromContext;
+ SelectAllAccessibleSelectionFromContextPackage selectAllAccessibleSelectionFromContext;
+
+ // Event Notification Registration packages
+ AddJavaEventNotificationPackage addJavaEventNotification;
+ RemoveJavaEventNotificationPackage removeJavaEventNotification;
+ AddAccessibilityEventNotificationPackage addAccessibilityEventNotification;
+ RemoveAccessibilityEventNotificationPackage removeAccessibilityEventNotification;
+
+ // AccessibleTable
+ GetAccessibleTableInfoPackage _getAccessibleTableInfo;
+ GetAccessibleTableCellInfoPackage _getAccessibleTableCellInfo;
+
+ GetAccessibleTableRowHeaderPackage _getAccessibleTableRowHeader;
+ GetAccessibleTableColumnHeaderPackage _getAccessibleTableColumnHeader;
+
+ GetAccessibleTableRowDescriptionPackage _getAccessibleTableRowDescription;
+ GetAccessibleTableColumnDescriptionPackage _getAccessibleTableColumnDescription;
+
+ GetAccessibleTableRowSelectionCountPackage _getAccessibleTableRowSelectionCount;
+ IsAccessibleTableRowSelectedPackage _isAccessibleTableRowSelected;
+ GetAccessibleTableRowSelectionsPackage _getAccessibleTableRowSelections;
+
+ GetAccessibleTableColumnSelectionCountPackage _getAccessibleTableColumnSelectionCount;
+ IsAccessibleTableColumnSelectedPackage _isAccessibleTableColumnSelected;
+ GetAccessibleTableColumnSelectionsPackage _getAccessibleTableColumnSelections;
+
+ GetAccessibleTableRowPackage _getAccessibleTableRow;
+ GetAccessibleTableColumnPackage _getAccessibleTableColumn;
+ GetAccessibleTableIndexPackage _getAccessibleTableIndex;
+
+ // AccessibleRelationSet
+ GetAccessibleRelationSetPackage _getAccessibleRelationSet;
+
+ // Accessible KeyBindings, Icons and Actions
+ GetAccessibleKeyBindingsPackage _getAccessibleKeyBindings;
+ GetAccessibleIconsPackage _getAccessibleIcons;
+ GetAccessibleActionsPackage _getAccessibleActions;
+ DoAccessibleActionsPackage _doAccessibleActions;
+
+
+ IsSameObjectPackage _isSameObject;
+
+ // utility methods
+ SetTextContentsPackage _setTextContents;
+ GetParentWithRolePackage _getParentWithRole;
+ GetTopLevelObjectPackage _getTopLevelObject;
+ GetParentWithRoleElseRootPackage _getParentWithRoleElseRoot;
+ GetObjectDepthPackage _getObjectDepth;
+ GetActiveDescendentPackage _getActiveDescendent;
+
+ // Additional methods for Teton
+ GetVirtualAccessibleNamePackage _getVirtualAccessibleName;
+ RequestFocusPackage _requestFocus;
+ SelectTextRangePackage _selectTextRange;
+ GetTextAttributesInRangePackage _getTextAttributesInRange;
+ GetVisibleChildrenCountPackage _getVisibleChildrenCount;
+ GetVisibleChildrenPackage _getVisibleChildren;
+ SetCaretPositionPackage _setCaretPosition;
+
+
+ } WindowsInitiatedPackages;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/love2dToAPK/tools/tools/jdk-win/include/win32/jawt_md.h b/love2dToAPK/tools/tools/jdk-win/include/win32/jawt_md.h
new file mode 100644
index 0000000..66e7256
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/include/win32/jawt_md.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved.
+ * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ */
+
+#ifndef _JAVASOFT_JAWT_MD_H_
+#define _JAVASOFT_JAWT_MD_H_
+
+#include <windows.h>
+#include "jawt.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Win32-specific declarations for AWT native interface.
+ * See notes in jawt.h for an example of use.
+ */
+typedef struct jawt_Win32DrawingSurfaceInfo {
+ /* Native window, DDB, or DIB handle */
+ union {
+ HWND hwnd;
+ HBITMAP hbitmap;
+ void* pbits;
+ };
+ /*
+ * This HDC should always be used instead of the HDC returned from
+ * BeginPaint() or any calls to GetDC().
+ */
+ HDC hdc;
+ HPALETTE hpalette;
+} JAWT_Win32DrawingSurfaceInfo;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !_JAVASOFT_JAWT_MD_H_ */
diff --git a/love2dToAPK/tools/tools/jdk-win/include/win32/jni_md.h b/love2dToAPK/tools/tools/jdk-win/include/win32/jni_md.h
new file mode 100644
index 0000000..3808001
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/include/win32/jni_md.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 1996, 1998, Oracle and/or its affiliates. All rights reserved.
+ * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ */
+
+#ifndef _JAVASOFT_JNI_MD_H_
+#define _JAVASOFT_JNI_MD_H_
+
+#define JNIEXPORT __declspec(dllexport)
+#define JNIIMPORT __declspec(dllimport)
+#define JNICALL __stdcall
+
+typedef long jint;
+typedef __int64 jlong;
+typedef signed char jbyte;
+
+#endif /* !_JAVASOFT_JNI_MD_H_ */
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/COPYRIGHT b/love2dToAPK/tools/tools/jdk-win/jre/COPYRIGHT
new file mode 100644
index 0000000..defd406
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/COPYRIGHT
@@ -0,0 +1,69 @@
+Copyright 1993, 2015, Oracle and/or its affiliates.
+All rights reserved.
+
+This software and related documentation are provided under a
+license agreement containing restrictions on use and
+disclosure and are protected by intellectual property laws.
+Except as expressly permitted in your license agreement or
+allowed by law, you may not use, copy, reproduce, translate,
+broadcast, modify, license, transmit, distribute, exhibit,
+perform, publish, or display any part, in any form, or by
+any means. Reverse engineering, disassembly, or
+decompilation of this software, unless required by law for
+interoperability, is prohibited.
+
+The information contained herein is subject to change
+without notice and is not warranted to be error-free. If you
+find any errors, please report them to us in writing.
+
+If this is software or related documentation that is
+delivered to the U.S. Government or anyone licensing it on
+behalf of the U.S. Government, the following notice is
+applicable:
+
+U.S. GOVERNMENT END USERS: Oracle programs, including any
+operating system, integrated software, any programs
+installed on the hardware, and/or documentation, delivered
+to U.S. Government end users are "commercial computer
+software" pursuant to the applicable Federal Acquisition
+Regulation and agency-specific supplemental regulations. As
+such, use, duplication, disclosure, modification, and
+adaptation of the programs, including any operating system,
+integrated software, any programs installed on the hardware,
+and/or documentation, shall be subject to license terms and
+license restrictions applicable to the programs. No other
+rights are granted to the U.S. Government.
+
+This software or hardware is developed for general use in a
+variety of information management applications. It is not
+developed or intended for use in any inherently dangerous
+applications, including applications that may create a risk
+of personal injury. If you use this software or hardware in
+dangerous applications, then you shall be responsible to
+take all appropriate fail-safe, backup, redundancy, and
+other measures to ensure its safe use. Oracle Corporation
+and its affiliates disclaim any liability for any damages
+caused by use of this software or hardware in dangerous
+applications.
+
+Oracle and Java are registered trademarks of Oracle and/or
+its affiliates. Other names may be trademarks of their
+respective owners.
+
+Intel and Intel Xeon are trademarks or registered trademarks
+of Intel Corporation. All SPARC trademarks are used under
+license and are trademarks or registered trademarks of SPARC
+International, Inc. AMD, Opteron, the AMD logo, and the AMD
+Opteron logo are trademarks or registered trademarks of
+Advanced Micro Devices. UNIX is a registered trademark of
+The Open Group.
+
+This software or hardware and documentation may provide
+access to or information on content, products, and services
+from third parties. Oracle Corporation and its affiliates
+are not responsible for and expressly disclaim all
+warranties of any kind with respect to third-party content,
+products, and services. Oracle Corporation and its
+affiliates will not be responsible for any loss, costs, or
+damages incurred due to your access to or use of third-party
+content, products, or services.
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/LICENSE b/love2dToAPK/tools/tools/jdk-win/jre/LICENSE
new file mode 100644
index 0000000..39e216a
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/LICENSE
@@ -0,0 +1 @@
+Please refer to http://java.com/license
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/README.txt b/love2dToAPK/tools/tools/jdk-win/jre/README.txt
new file mode 100644
index 0000000..cdb30f2
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/README.txt
@@ -0,0 +1 @@
+Please refer to http://java.com/licensereadme
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/THIRDPARTYLICENSEREADME-JAVAFX.txt b/love2dToAPK/tools/tools/jdk-win/jre/THIRDPARTYLICENSEREADME-JAVAFX.txt
new file mode 100644
index 0000000..ff9bbd0
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/THIRDPARTYLICENSEREADME-JAVAFX.txt
@@ -0,0 +1,1531 @@
+DO NOT TRANSLATE OR LOCALIZE
+
+***************************************************************************
+
+%%The following software may be included in this product:
+Microsoft DirectShow - Base Classes
+
+Use of any of this software is governed by the terms of the license below:
+
+MSDN - Information on Terms of Use
+
+Updated: February 13, 2008
+
+ON THIS PAGE
+
+ * ACCEPTANCE OF TERMS
+ * PRIVACY AND PROTECTION OF PERSONAL INFORMATION
+ * NOTICE SPECIFIC TO APIs AVAILABLE ON THIS WEB SITE
+ * NOTICE SPECIFIC TO SOFTWARE AVAILABLE ON THIS WEB SITE
+ * NOTICE SPECIFIC TO DOCUMENTATION AVAILABLE ON THIS WEB SITE
+ * NOTICES REGARDING SOFTWARE, DOCUMENTATION, APIS AND SERVICES AVAILABLE ON
+THIS WEB SITE
+ * RESERVATION OF RIGHTS
+ * MEMBER ACCOUNT, PASSWORD, AND SECURITY
+ * NO UNLAWFUL OR PROHIBITED USE
+ * USE OF SERVICES
+ * MATERIALS PROVIDED TO MICROSOFT OR POSTED AT ANY MICROSOFT WEB SITE
+ * NOTICES AND PROCEDURE FOR MAKING CLAIMS OF COPYRIGHT INFRINGEMENT
+ * LINKS TO THIRD PARTY SITES
+ * UNSOLICITED IDEA SUBMISSION POLICY
+ * COPYRIGHT NOTICE & FAQ
+ * TRADEMARKS
+
+ACCEPTANCE OF TERMS.
+
+Microsoft provides you with access to a variety of resources on this website
+(“Web Site”), including documentation and other product information
+(collectively the “Documentation”), download areas, communication forums, and
+other services (collectively "Services"), software, including developer tools
+and sample code (collectively “Software”), and Application Program Interface
+information (“APIs”). The Documentation, Services, Software, and APIs
+(including any updates, enhancements, new features, and/or the addition of any
+new Web properties to the Web Site), are subject to the following Terms of Use
+("TOU"), unless we have provided those items to you under more specific terms,
+in which case, those more specific terms will apply to the relevant item.
+Microsoft reserves the right to update the TOU at any time without notice to
+you. The most current version of the TOU can be reviewed by clicking on the
+"Terms of Use" hypertext link located at the bottom of our Web pages.
+
+Top of page
+PRIVACY AND PROTECTION OF PERSONAL INFORMATION.
+
+See the Privacy Statement disclosures relating to the collection and use of your
+information.
+
+Top of page
+NOTICE SPECIFIC TO APIS AVAILABLE ON THIS WEB SITE.
+
+Microsoft publishes information on a number of APIs on this Web Site. Microsoft
+will not assert any of its patent rights on account of your products calling
+these APIs in order to receive services from the Microsoft product that exposes
+the APIs.
+
+Top of page
+NOTICE SPECIFIC TO SOFTWARE AVAILABLE ON THIS WEB SITE.
+
+All Software is the copyrighted work of Microsoft and/or its suppliers. Use of
+the Software is governed by the terms of the end user license agreement, if any,
+which accompanies or is included with the Software ("License Agreement").
+
+If Microsoft makes Software available on this Web Site without a License
+Agreement, you may use such Software to design, develop and test your programs
+to run on Microsoft products and services.
+
+If Microsoft makes any code marked as “sample” available on this Web Site
+without a License Agreement, then that code is licensed to you under the terms
+of the Microsoft Limited Public License.
+
+The Software is made available for download solely for use by end users
+according to the License Agreement or these TOU. Any reproduction or
+redistribution of the Software not in accordance with the License Agreement or
+these TOU is expressly prohibited.
+
+WITHOUT LIMITING THE FOREGOING, COPYING OR REPRODUCTION OF THE SOFTWARE TO ANY
+OTHER SERVER OR LOCATION FOR FURTHER REPRODUCTION OR REDISTRIBUTION IS EXPRESSLY
+PROHIBITED, UNLESS SUCH REPRODUCTION OR REDISTRIBUTION IS EXPRESSLY PERMITTED BY
+THE LICENSE AGREEMENT ACCOMPANYING SUCH SOFTWARE.
+
+FOR YOUR CONVENIENCE, MICROSOFT MAY MAKE AVAILABLE ON THIS WEB SITE, TOOLS AND
+UTILITIES FOR USE AND/OR DOWNLOAD. MICROSOFT DOES NOT MAKE ANY ASSURANCES WITH
+REGARD TO THE ACCURACY OF THE RESULTS OR OUTPUT THAT DERIVES FROM SUCH USE OF
+ANY SUCH TOOLS AND UTILITIES. PLEASE RESPECT THE INTELLECTUAL PROPERTY RIGHTS OF
+OTHERS WHEN USING THE TOOLS AND UTILITIES MADE AVAILABLE ON THIS WEB SITE.
+
+RESTRICTED RIGHTS LEGEND. Any Software which is downloaded from the Web Site for
+or on behalf of the United States of America, its agencies and/or
+instrumentalities ("U.S. Government"), is provided with Restricted Rights... Use,
+duplication, or disclosure by the U.S. Government is subject to restrictions as
+set forth in subparagraph (c)(1)(ii) of the Rights in Technical Data and
+Computer Software clause at DFARS 252.227-7013 or subparagraphs (c)(1) and (2)
+of the Commercial Computer Software - Restricted Rights at 48 CFR 52.227-19, as
+applicable. Manufacturer is Microsoft Corporation, One Microsoft Way, Redmond,
+WA 98052-6399.
+
+Top of page
+NOTICE SPECIFIC TO DOCUMENTATION AVAILABLE ON THIS WEB SITE.
+
+All Documentation is the copyrighted work of Microsoft and/or its suppliers. Use
+of the Documentation is governed by the terms of the license agreement, if any,
+which accompanies or is included with the Documentation ("Documentation License
+Agreement").
+
+If Documentation is made available to you on this Web Site without a
+Documentation License Agreement, then You may annotate, translate, and make a
+reasonable number of copies of the Documentation for your internal use in
+designing, developing, and testing your software, products and services, and you
+may distribute a reasonable amount of portions of the Documentation as necessary
+to document your software, products, and services. You may not publish any such
+annotations or translations. You must preserve the below copyright notice in
+all copies of the Documentation and ensure that both the copyright notice and
+this permission notice appear in those copies. Accredited educational
+institutions, such as K-12, universities, private/public colleges, and state
+community colleges, may download and reproduce the Documentation for
+distribution in the classroom. Distribution outside the classroom requires
+express written permission. Use for any other purpose is expressly prohibited
+
+The Documentation does not include the design or layout of the Microsoft.com Web
+site or any other Microsoft owned, operated, licensed or controlled site.
+Elements of Microsoft Web sites are protected by trade dress, trademark, unfair
+competition, and other laws and may not be copied or imitated in whole or in
+part. No logo, graphic, sound or image from any Microsoft Web site may be copied
+or retransmitted unless expressly permitted by Microsoft.
+
+THE DOCUMENTATION AND RELATED GRAPHICS PUBLISHED ON THE WEB SITE COULD INCLUDE
+TECHNICAL INACCURACIES OR TYPOGRAPHICAL ERRORS. CHANGES ARE PERIODICALLY ADDED
+TO THE INFORMATION IN THIS WEB SITE. MICROSOFT AND/OR ITS RESPECTIVE SUPPLIERS
+MAY MAKE IMPROVEMENTS AND/OR CHANGES IN THE PRODUCT(S) AND/OR THE PROGRAM(S)
+DESCRIBED IN THIS WEB SITE AT ANY TIME.
+
+Top of page
+NOTICES REGARDING SOFTWARE, DOCUMENTATION, APIS AND SERVICES AVAILABLE ON THIS
+WEB SITE.
+
+THE SOFTWARE, DOCUMENTATION, APIS, AND SERVICES ARE WARRANTED, IF AT ALL, ONLY
+ACCORDING TO THE TERMS OF ASEPARATE AGREEMENT THAT COVERS THE APPLICABLE
+SOFTWARE, DOCUMENTATION, APIS, OR SERVICES. EXCEPT AS WARRANTED IN THAT SEPARATE
+AGREEMENT (IF ANY), MICROSOFT CORPORATION HEREBY DISCLAIMS ALL WARRANTIES AND
+CONDITIONS WITH REGARD TO THE SOFTWARE, DOCUMENTATION, APIS, AND SERVICES,
+INCLUDING ALL WARRANTIES AND CONDITIONS OF MERCHANTABILITY, WHETHER EXPRESS,
+IMPLIED OR STATUTORY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT.
+
+IN NO EVENT SHALL MICROSOFT AND/OR ITS RESPECTIVE SUPPLIERS BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF SOFTWARE, DOCUMENTATION, APIS, PROVISION OF OR FAILURE TO PROVIDE
+SERVICES, OR INFORMATION AVAILABLE FROM ANY OF THE FOREGOING SOFTWARE,
+DOCUMENTATION, APIS OR SERVICES.
+
+Top of page
+RESERVATION OF RIGHTS.
+
+Microsoft reserves all rights not expressly granted under these TOU, and no
+other rights are granted under these TOU by implication or estoppel or otherwise.
+
+Top of page
+MEMBER ACCOUNT, PASSWORD, AND SECURITY.
+
+If any of the Services requires you to open an account, you must complete the
+registration process by providing us with current, complete and accurate
+information as prompted by the applicable registration form. You also will
+choose a password and a user name. You are entirely responsible for maintaining
+the confidentiality of your password and account. Furthermore, you are entirely
+responsible for any and all activities that occur under your account. You agree
+to notify Microsoft immediately of any unauthorized use of your account or any
+other breach of security. Microsoft will not be liable for any loss that you may
+incur as a result of someone else using your password or account, either with or
+without your knowledge. However, you could be held liable for losses incurred by
+Microsoft or another party due to someone else using your account or password.
+You may not use anyone else's account at any time, without the permission of the
+account holder.
+
+Top of page
+NO UNLAWFUL OR PROHIBITED USE.
+
+As a condition of your use of the Services, you will not use the Services for
+any purpose that is unlawful or prohibited by these terms, conditions, and
+notices. You may not use the Services in any manner that could damage, disable,
+overburden, or impair any Microsoft server, or the network(s) connected to any
+Microsoft server, or interfere with any other party's use and enjoyment of any
+Services. You may not attempt to gain unauthorized access to any Services, other
+accounts, computer systems or networks connected to any Microsoft server or to
+any of the Services, through hacking, password mining or any other means. You
+may not obtain or attempt to obtain any materials or information through any
+means not intentionally made available through the Services.
+
+Top of page
+USE OF SERVICES.
+
+The Services may contain e-mail services, bulletin board services, chat areas,
+news groups, forums, communities, personal web pages, calendars, photo albums,
+file cabinets and/or other message or communication facilities designed to
+enable you to communicate with others (each a "Communication Service" and
+collectively "Communication Services"). You agree to use the Communication
+Services only to post, send and receive messages and material that are proper
+and, when applicable, related to the particular Communication Service. By way of
+example, and not as a limitation, you agree that when using the Communication
+Services, you will not:
+
+ * Use the Communication Services in connection with surveys, contests,
+pyramid schemes, chain letters, junk email, spamming or any duplicative or
+unsolicited messages (commercial or otherwise).
+ * Defame, abuse, harass, stalk, threaten or otherwise violate the legal
+rights (such as rights of privacy and publicity) of others.
+ * Publish, post, upload, distribute or disseminate any inappropriate,
+profane, defamatory, obscene, indecent or unlawful topic, name, material or
+information.
+ * Upload, or otherwise make available, files that contain images,
+photographs, software or other material protected by intellectual property laws,
+including, by way of example, and not as limitation, copyright or trademark laws
+(or by rights of privacy or publicity) unless you own or control the rights
+thereto or have received all necessary consent to do the same.
+ * Use any material or information, including images or photographs, which
+are made available through the Services in any manner that infringes any
+copyright, trademark, patent, trade secret, or other proprietary right of any party.
+ * Upload files that contain viruses, Trojan horses, worms, time bombs,
+cancelbots, corrupted files, or any other similar software or programs that may
+damage the operation of another's computer or property of another.
+ * Advertise or offer to sell or buy any goods or services for any business
+purpose, unless such Communication Services specifically allows such messages.
+ * Download any file posted by another user of a Communication Service that
+you know, or reasonably should know, cannot be legally reproduced, displayed,
+performed, and/or distributed in such manner.
+ * Falsify or delete any copyright management information, such as author
+attributions, legal or other proper notices or proprietary designations or
+labels of the origin or source of software or other material contained in a file
+that is uploaded.
+ * Restrict or inhibit any other user from using and enjoying the
+Communication Services.
+ * Violate any code of conduct or other guidelines which may be applicable
+for any particular Communication Service.
+ * Harvest or otherwise collect information about others, including e-mail
+addresses.
+ * Violate any applicable laws or regulations.
+ * Create a false identity for the purpose of misleading others.
+ * Use, download or otherwise copy, or provide (whether or not for a fee) to
+a person or entity any directory of users of the Services or other user or usage
+information or any portion thereof.
+
+Microsoft has no obligation to monitor the Communication Services. However,
+Microsoft reserves the right to review materials posted to the Communication
+Services and to remove any materials in its sole discretion. Microsoft reserves
+the right to terminate your access to any or all of the Communication Services
+at any time, without notice, for any reason whatsoever.
+
+Microsoft reserves the right at all times to disclose any information as
+Microsoft deems necessary to satisfy any applicable law, regulation, legal
+process or governmental request, or to edit, refuse to post or to remove any
+information or materials, in whole or in part, in Microsoft's sole discretion.
+
+Always use caution when giving out any personally identifiable information about
+yourself or your children in any Communication Services. Microsoft does not
+control or endorse the content, messages or information found in any
+Communication Services and, therefore, Microsoft specifically disclaims any
+liability with regard to the Communication Services and any actions resulting
+from your participation in any Communication Services. Managers and hosts are
+not authorized Microsoft spokespersons, and their views do not necessarily
+reflect those of Microsoft.
+
+Materials uploaded to the Communication Services may be subject to posted
+limitations on usage, reproduction and/or dissemination; you are responsible for
+adhering to such limitations if you download the materials.
+
+Top of page
+MATERIALS PROVIDED TO MICROSOFT OR POSTED AT ANY MICROSOFT WEB SITE.
+
+Microsoft does not claim ownership of the materials you provide to Microsoft
+(including feedback and suggestions) or post, upload, input or submit to any
+Services or its associated services for review by the general public, or by the
+members of any public or private community, (each a "Submission" and
+collectively "Submissions"). However, by posting, uploading, inputting,
+providing or submitting ("Posting") your Submission you are granting Microsoft,
+its affiliated companies, necessary sublicensees (including third parties whose
+products , technologies and services use or interface with any specific parts of
+a Microsoft software or service that includes the Submission) , without charge,
+the right to use, share and commercialize your Submission in any way and for
+any purpose. You will not give any Submission that is subject to a license that
+requires Microsoft to license its software or documentation to third parties
+because we include your Submission in them.
+
+Microsoft is under no obligation to post or use any Submission you may provide,
+and Microsoft may remove any Submission at any time in its sole discretion.
+
+By Posting a Submission you warrant and represent that you own or otherwise
+control all of the rights to your Submission as described in these TOU
+including, without limitation, all the rights necessary for you to Post the
+Submissions.
+
+In addition to the warranty and representation set forth above, by Posting a
+Submission that contains images, photographs, pictures or that are otherwise
+graphical in whole or in part ("Images"), you warrant and represent that (a) you
+are the copyright owner of such Images, or that the copyright owner of such
+Images has granted you permission to use such Images or any content and/or
+images contained in such Images consistent with the manner and purpose of your
+use and as otherwise permitted by these TOU, (b) you have the rights necessary
+to grant the licenses and sublicenses described in these TOU, and (c) that each
+person depicted in such Images, if any, has provided consent to the use of the
+Images as set forth in these TOU, including, by way of example, and not as a
+limitation, the distribution, public display and reproduction of such Images. By
+Posting Images, you are granting (a) to all members of your private community
+(for each such Images available to members of such private community), and/or
+(b) to the general public (for each such Images available anywhere on the
+Services or Web Site, other than a private community), permission to use your
+Images in connection with the use, as permitted by these TOU, of any of the
+Services or Web Site, (including, by way of example, and not as a limitation,
+making prints and gift items which include such Images), and including, without
+limitation, a non-exclusive, world-wide, royalty-free license to: copy,
+distribute, transmit, publicly display, publicly perform, reproduce, edit,
+translate and reformat your Images without having your name attached to such
+Images, and the right to sublicense such rights to any supplier of the Services.
+The licenses granted in the preceding sentences for a Images will terminate at
+the time you completely remove such Images from the Services or Web Site,
+provided that such termination shall not affect any licenses granted in
+connection with such Images prior to the time you completely remove such Images.
+No compensation will be paid with respect to the use of your Images.
+
+Top of page
+NOTICES AND PROCEDURE FOR MAKING CLAIMS OF COPYRIGHT INFRINGEMENT.
+
+Pursuant to Title 17, United States Code, Section 512(c)(2), notifications of
+claimed copyright infringement should be sent to Service Provider's Designated
+Agent. ALL INQUIRIES NOT RELEVANT TO THE FOLLOWING PROCEDURE WILL NOT RECEIVE A
+RESPONSE.
+
+See Notice and Procedure for Making Claims of Copyright Infringement.
+
+Top of page
+LINKS TO THIRD PARTY SITES.
+
+THE LINKS IN THIS AREA WILL LET YOU LEAVE MICROSOFT'S SITE. THE LINKED SITES ARE
+NOT UNDER THE CONTROL OF MICROSOFT AND MICROSOFT IS NOT RESPONSIBLE FOR THE
+CONTENTS OF ANY LINKED SITE OR ANY LINK CONTAINED IN A LINKED SITE, OR ANY
+CHANGES OR UPDATES TO SUCH SITES. MICROSOFT IS NOT RESPONSIBLE FOR WEBCASTING OR
+ANY OTHER FORM OF TRANSMISSION RECEIVED FROM ANY LINKED SITE. MICROSOFT IS
+PROVIDING THESE LINKS TO YOU ONLY AS A CONVENIENCE, AND THE INCLUSION OF ANY
+LINK DOES NOT IMPLY ENDORSEMENT BY MICROSOFT OF THE SITE.
+
+Top of page
+UNSOLICITED IDEA SUBMISSION POLICY.
+
+MICROSOFT OR ANY OF ITS EMPLOYEES DO NOT ACCEPT OR CONSIDER UNSOLICITED IDEAS,
+INCLUDING IDEAS FOR NEW ADVERTISING CAMPAIGNS, NEW PROMOTIONS, NEW PRODUCTS OR
+TECHNOLOGIES, PROCESSES, MATERIALS, MARKETING PLANS OR NEW PRODUCT NAMES. PLEASE
+DO NOT SEND ANY ORIGINAL CREATIVE ARTWORK, SAMPLES, DEMOS, OR OTHER WORKS... THE
+SOLE PURPOSE OF THIS POLICY IS TO AVOID POTENTIAL MISUNDERSTANDINGS OR DISPUTES
+WHEN MICROSOFT'S PRODUCTS OR MARKETING STRATEGIES MIGHT SEEM SIMILAR TO IDEAS
+SUBMITTED TO MICROSOFT. SO, PLEASE DO NOT SEND YOUR UNSOLICITED IDEAS TO
+MICROSOFT OR ANYONE AT MICROSOFT. IF, DESPITE OUR REQUEST THAT YOU NOT SEND US
+YOUR IDEAS AND MATERIALS, YOU STILL SEND THEM, PLEASE UNDERSTAND THAT MICROSOFT
+MAKES NO ASSURANCES THAT YOUR IDEAS AND MATERIALS WILL BE TREATED AS
+CONFIDENTIAL OR PROPRIETARY.
+
+Top of page
+COPYRIGHT NOTICE & FAQ.
+
+© 2008 Microsoft Corporation. All rights reserved.
+
+The following is provided for informational purposes only and should not be
+construed as legal advice. If you need legal advice, contact a lawyer.
+
+What is copyright?
+
+Copyright law protects original works, such as websites, books, music,
+paintings, photos and video. A work is “original” if it contains some elements
+you created and did not borrow from others. Typically, when you create an
+original work, you own the copyright. As the copyright owner, you can control
+how others use your work. For example, if you write a movie script, you have the
+right to, and can prevent others from, copying your script, sharing it with
+others (“distributing it”), making a movie or book from your script (a
+“derivative work”), or publicly performing your script as a play or movie. You
+also have the ability to sell or give away these rights. In other words, you
+could sell the right to make a movie based on your script to a movie studio.
+
+If you use someone else’s copyrighted materials without permission, that use
+generally violates the copyright owner's exclusive rights, and is copyright
+infringement. So if you create a new work and include parts of other people’s
+works in it (such as an existing photo, lengthy quotes from a book or a loop
+from a song), you must own or have permission to use the elements you borrow.
+For example, if your script is based on an existing popular series, you should
+obtain permission to use the elements you borrow from the series.
+
+Copyright law is different from the law of personal property. If you buy a
+physical object, such as a movie on DVD, you own the physical object. You do
+not, however, obtain ownership of the “copyrights” (the rights to make copies,
+distribute, make derivatives and publicly perform or display) in the content of
+the movie. The fact that you have obtained physical possession of a DVD does not
+automatically grant you the right to copy or share it.
+
+If you make your own movie, it may include many copyrighted works in it. So, if
+you decide to make a movie based on your script, you must either create all
+elements of it on your own, or have permission to use the elements you borrow.
+Especially keep in mind that photos or artwork hanging on the walls of your sets
+and music on the soundtrack (even if you own the CD or MP3) may be copyrighted.
+You should not include copyrighted works such as these in your movie without
+authorization.
+
+A few other things to keep in mind are:
+
+ 1. Just because a work does not include a copyright notice (e.g., © 2006
+Microsoft Corporation) does not mean the work is in the public domain. Copyright
+notices are generally not required for works to be protected by copyright.
+ 2. Just because a work is easily available on the internet or elsewhere does
+not mean you may use the work freely. Look for terms of use, such as Creative
+Commons, that explain how works you find on the Internet may be used.
+
+Isn't it in the public domain?
+
+Just because a work is freely available, does not mean it is in the “public
+domain.” Copyright is for a limited term; it does not last forever. In the
+copyright context, “public domain” means the copyright term has expired. Once a
+work is in the public domain, it may be freely used without permission from the
+copyright owner.
+
+Determining the term of copyright can be complex, particularly because copyright
+laws vary from country to country. Also, even if the copyright on a work has
+expired, you should be careful about how you use a public domain work. For
+example, a book may be in the public domain, but it might not be ok to scan the
+book cover to cover and post it on the internet. This is because the particular
+version of the book may contain new copyrightable material that is not in the
+public domain, such as cover art or footnotes.
+
+What about fair use?
+
+In limited situations, you can use copyrighted works without permission from the
+copyright holder. It can be difficult to figure out whether use of copyrighted
+works without permission is legal, though, because the laws in this area are
+often vague and vary from country to country.
+
+The copyright law in the United States has a doctrine called “fair use”. Fair
+use provides a defense to copyright infringement in some circumstances. For
+example, fair use allows documentary filmmakers to use very short clips of
+copyrighted movies, music and news footage without permission from the copyright
+owner. Fair use is a difficult concept because determining whether something is
+a fair use involves weighing four factors. Unfortunately, weighing the fair use
+factors rarely results in a clear-cut answer.
+
+Rather than applying a fair use test, many other countries have specific
+exceptions to copyright infringement. The number and type of exceptions vary by
+country, but they frequently allow copyrighted materials to be used without
+permission from the copyright holder for activities such as nonprofit research,
+teaching, news reporting, or private study.
+
+If you incorrectly decide that something is a fair use or falls into an
+exception to copyright infringement, you could be held criminally and civilly
+liable and have to pay damages. We suggest you talk to a lawyer if you have
+questions regarding fair uses of copyrighted works.
+
+What happens if you upload copyrighted materials to one of our websites without
+permission?
+
+By law, we are required to take down videos, music, photographs or other content
+you upload onto a website hosted by Microsoft if we learn that it infringes
+someone else’s copyright. If you believe that we have mistakenly taken down
+content you uploaded that you own or have permission to upload, you can also let
+us know that. Finally, if you upload infringing content repeatedly, we will
+terminate your account and you could face criminal and civil penalties. So
+please, respect other people’s copyrights.
+
+What if my stuff is on a Microsoft website without my permission?
+
+If you believe that anything on a website hosted by Microsoft infringes your
+copyright, let us know. Just provide us with the information requested here and
+we will see that your copyrighted works are taken down.
+
+What if I don't want my website crawled?
+
+Microsoft search services (MSN Search and Windows Live Search) follow the Robots
+Exclusion Standards. This means that you can control which pages Microsoft
+search engines index and how often Microsoft bots access your website. To learn
+how to do so, or for more information regarding Microsoft’s webcrawling and site
+indexing practices, please visit http://search.msn.com/docs/siteowner.aspx.
+
+Top of page
+TRADEMARKS.
+
+Trademark information is available at
+http://www.microsoft.com/library/toolbar/3.0/trademarks/en-us.mspx.
+
+Any rights not expressly granted herein are reserved.
+
+Send your questions to the appropriate contact as listed below:
+
+ * Microsoft Web properties, contact homepage@microsoft.com.
+ * MSN Web properties, contact webmaster@msn.com.
+ * Hotmail, contact support@hotmail.com; for spam/privacy issues, contact
+abuse@hotmail.com or hotmailprivacy@hotmail.com.
+ * Piracy questions can be routed to piracy@microsoft.com or by calling
+1-800-R-U-LEGIT.
+
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Microsoft Public License (Ms-PL)
+Mon, 2007-10-15 19:23 — nelson
+
+This license governs use of the accompanying software. If you use the software, you
+accept this license. If you do not accept the license, do not use the software.
+
+1. Definitions
+The terms "reproduce," "reproduction," "derivative works," and "distribution"
+have the
+same meaning here as under U.S. copyright law.
+A "contribution" is the original software, or any additions or changes to the
+software.
+A "contributor" is any person that distributes its contribution under this license.
+"Licensed patents" are a contributor's patent claims that read directly on its
+contribution.
+
+2. Grant of Rights
+(A) Copyright Grant- Subject to the terms of this license, including the license
+conditions and limitations in section 3, each contributor grants you a
+non-exclusive, worldwide, royalty-free copyright license to reproduce its
+contribution, prepare derivative works of its contribution, and distribute its
+contribution or any derivative works that you create.
+(B) Patent Grant- Subject to the terms of this license, including the license
+conditions and limitations in section 3, each contributor grants you a
+non-exclusive, worldwide, royalty-free license under its licensed patents to
+make, have made, use, sell, offer for sale, import, and/or otherwise dispose of
+its contribution in the software or derivative works of the contribution in the
+software.
+
+3. Conditions and Limitations
+(A) No Trademark License- This license does not grant you rights to use any
+contributors' name, logo, or trademarks.
+(B) If you bring a patent claim against any contributor over patents that you
+claim are infringed by the software, your patent license from such contributor
+to the software ends automatically.
+(C) If you distribute any portion of the software, you must retain all
+copyright, patent, trademark, and attribution notices that are present in the
+software.
+(D) If you distribute any portion of the software in source code form, you may
+do so only under this license by including a complete copy of this license with
+your distribution. If you distribute any portion of the software in compiled or
+object code form, you may only do so under a license that complies with this
+license.
+(E) The software is licensed "as-is." You bear the risk of using it. The
+contributors give no express warranties, guarantees or conditions. You may have
+additional consumer rights under your local laws which this license cannot
+change. To the extent permitted under your local laws, the contributors exclude
+the implied warranties of merchantability, fitness for a particular purpose and
+non-infringement.
+
+***************************************************************************
+
+%%The following software may be included in this product:
+Apache Batik
+
+Use of any of this software is governed by the terms of the license below:
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution..."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
+
+***************************************************************************
+
+%%The following software may be included in this product:
+ASM
+
+Use of any of this software is governed by the terms of the license below:
+
+Copyright (c) 2000-2005 INRIA, France Telecom
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holders nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGE.
+
+***************************************************************************
+
+%%The following software may be included in this product:
+JPEG
+
+Use of any of this software is governed by the terms of the license below:
+
+Taken from code......
+
+LEGAL ISSUES
+============
+
+In plain English:
+
+1. We don't promise that this software works. (But if you find any bugs,
+ please let us know!)
+2. You can use this software for whatever you want. You don't have to pay us.
+3. You may not pretend that you wrote this software. If you use it in a
+ program, you must acknowledge somewhere in your documentation that
+ you've used the IJG code.
+
+In legalese:
+
+The authors make NO WARRANTY or representation, either express or implied,
+with respect to this software, its quality, accuracy, merchantability, or
+fitness for a particular purpose. This software is provided "AS IS", and you,
+its user, assume the entire risk as to its quality and accuracy.
+
+This software is copyright (C) 1991-1998, Thomas G. Lane.
+All Rights Reserved except as specified below.
+
+Permission is hereby granted to use, copy, modify, and distribute this
+software (or portions thereof) for any purpose, without fee, subject to these
+conditions:
+(1) If any part of the source code for this software is distributed, then this
+README file must be included, with this copyright and no-warranty notice
+unaltered; and any additions, deletions, or changes to the original files
+must be clearly indicated in accompanying documentation.
+(2) If only executable code is distributed, then the accompanying
+documentation must state that "this software is based in part on the work of
+the Independent JPEG Group".
+(3) Permission for use of this software is granted only if the user accepts
+full responsibility for any undesirable consequences; the authors accept
+NO LIABILITY for damages of any kind.
+
+These conditions apply to any software derived from or based on the IJG code,
+not just to the unmodified library. If you use our work, you ought to
+acknowledge us.
+
+Permission is NOT granted for the use of any IJG author's name or company name
+in advertising or publicity relating to this software or products derived from
+it. This software may be referred to only as "the Independent JPEG Group's
+software".
+
+We specifically permit and encourage the use of this software as the basis of
+commercial products, provided that all warranty or liability claims are
+assumed by the product vendor.
+
+
+ansi2knr.c is included in this distribution by permission of L. Peter Deutsch,
+sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA.
+ansi2knr.c is NOT covered by the above copyright and conditions, but instead
+by the usual distribution terms of the Free Software Foundation; principally,
+that you must include source code if you redistribute it. (See the file
+ansi2knr.c for full details.) However, since ansi2knr.c is not needed as part
+of any program generated from the IJG code, this does not limit you more than
+the foregoing paragraphs do.
+
+The Unix configuration script "configure" was produced with GNU Autoconf.
+It is copyright by the Free Software Foundation but is freely distributable.
+The same holds for its supporting scripts (config.guess, config.sub,
+ltconfig, ltmain.sh). Another support script, install-sh, is copyright
+by M.I.T. but is also freely distributable.
+
+It appears that the arithmetic coding option of the JPEG spec is covered by
+patents owned by IBM, AT&T, and Mitsubishi. Hence arithmetic coding cannot
+legally be used without obtaining one or more licenses. For this reason,
+support for arithmetic coding has been removed from the free JPEG software.
+(Since arithmetic coding provides only a marginal gain over the unpatented
+Huffman mode, it is unlikely that very many implementations will support it.)
+So far as we are aware, there are no patent restrictions on the remaining
+code.
+
+The IJG distribution formerly included code to read and write GIF files.
+To avoid entanglement with the Unisys LZW patent, GIF reading support has
+been removed altogether, and the GIF writer has been simplified to produce
+"uncompressed GIFs". This technique does not use the LZW algorithm; the
+resulting GIF files are larger than usual, but are readable by all standard
+GIF decoders.
+
+We are required to state that
+ "The Graphics Interchange Format(c) is the Copyright property of
+ CompuServe Incorporated. GIF(sm) is a Service Mark property of
+ CompuServe Incorporated."
+
+Additional License(s)
+
+"copyright"
+
+***************************************************************************
+
+MD5 License
+"THE BEER-WARE LICENSE" (Revision 42):
+ wrote this file. As long as you retain this
+notice you can do whatever you want with this stuff. If we meet some
+day, and you think this stuff is worth it, you can buy me a beer in
+return. Poul-Henning Kamp
+
+
+
+
+
+***************************************************************************
+
+
+%%The following software may be included in this product:
+ANTLR Java runtime binary only jar
+
+Use of any of this software is governed by the terms of the license below:
+
+ANTLR 3 License
+
+[The BSD License]
+Copyright (c) 2003-2007, Terence Parr
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation and/or
+other materials provided with the distribution.
+ * Neither the name of the author nor the names of its contributors may be
+used to endorse or promote products derived from this software without specific
+prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+***************************************************************************
+
+%%The following software may be included in this product:
+gstreamer
+
+You are receiving a copy of the GStreamer library in object code in the
+JavaFX runtime or JavaFX SDK. A
+copy of the Oracle modified GStreamer library in source code is located
+at http://oss.oracle.com/projects/gstreamer-mods/ . The terms of the
+Oracle license do NOT apply to the GStreamer program; it is licensed under
+the following license, separately from the Oracle programs you receive. If
+you do not wish to install this program, you may not wish to install
+the JavaFX Runtime or JavaFX SDK.
+
+Use of any of this software is governed by the terms of the license below:
+
+GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999
+Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
+[This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and
+change it. By contrast, the GNU General Public Licenses are intended to guarantee
+your freedom to share and change free software--to make sure the software is free
+for all its users.
+This license, the Lesser General Public License, applies to some specially
+designated software packages--typically libraries--of the Free Software Foundation
+and other authors who decide to use it. You can use it too, but we suggest you first
+think carefully about whether this license or the ordinary General Public License is
+the better strategy to use in any particular case, based on the explanations below.
+When we speak of free software, we are referring to freedom of use, not price. Our
+General Public Licenses are designed to make sure that you have the freedom to
+distribute copies of free software (and charge for this service if you wish); that
+you receive source code or can get it if you want it; that you can change the
+software and use pieces of it in new free programs; and that you are informed that
+you can do these things.
+To protect your rights, we need to make restrictions that forbid distributors to
+deny you these rights or to ask you to surrender these rights. These restrictions
+translate to certain responsibilities for you if you distribute copies of the
+library or if you modify it.
+For example, if you distribute copies of the library, whether gratis or for a fee,
+you must give the recipients all the rights that we gave you. You must make sure
+that they, too, receive or can get the source code. If you link other code with the
+library, you must provide complete object files to the recipients, so that they can
+relink them with the library after making changes to the library and recompiling it.
+And you must show them these terms so they know their rights.
+We protect your rights with a two-step method: (1) we copyright the library, and (2)
+we offer you this license, which gives you legal permission to copy, distribute
+and/or modify the library.
+To protect each distributor, we want to make it very clear that there is no warranty
+for the free library. Also, if the library is modified by someone else and passed
+on, the recipients should know that what they have is not the original version, so
+that the original author's reputation will not be affected by problems that might be
+introduced by others.
+Finally, software patents pose a constant threat to the existence of any free
+program. We wish to make sure that a company cannot effectively restrict the users
+of a free program by obtaining a restrictive license from a patent holder.
+Therefore, we insist that any patent license obtained for a version of the library
+must be consistent with the full freedom of use specified in this license.
+Most GNU software, including some libraries, is covered by the ordinary GNU General
+Public License. This license, the GNU Lesser General Public License, applies to
+certain designated libraries, and is quite different from the ordinary General
+Public License. We use this license for certain libraries in order to permit linking
+those libraries into non-free programs.
+When a program is linked with a library, whether statically or using a shared
+library, the combination of the two is legally speaking a combined work, a
+derivative of the original library. The ordinary General Public License therefore
+permits such linking only if the entire combination fits its criteria of freedom.
+The Lesser General Public License permits more lax criteria for linking other code
+with the library.
+We call this license the "Lesser" General Public License because it does Less to
+protect the user's freedom than the ordinary General Public License. It also
+provides other free software developers Less of an advantage over competing non-free
+programs. These disadvantages are the reason we use the ordinary General Public
+License for many libraries. However, the Lesser license provides advantages in
+certain special circumstances.
+For example, on rare occasions, there may be a special need to encourage the widest
+possible use of a certain library, so that it becomes a de-facto standard. To
+achieve this, non-free programs must be allowed to use the library. A more frequent
+case is that a free library does the same job as widely used non-free libraries. In
+this case, there is little to gain by limiting the free library to free software
+only, so we use the Lesser General Public License.
+In other cases, permission to use a particular library in non-free programs enables
+a greater number of people to use a large body of free software. For example,
+permission to use the GNU C Library in non-free programs enables many more people to
+use the whole GNU operating system, as well as its variant, the GNU/Linux operating
+system.
+Although the Lesser General Public License is Less protective of the users' freedom,
+it does ensure that the user of a program that is linked with the Library has the
+freedom and the wherewithal to run that program using a modified version of the
+Library.
+The precise terms and conditions for copying, distribution and modification follow.
+Pay close attention to the difference between a "work based on the library" and a
+"work that uses the library". The former contains code derived from the library,
+whereas the latter must be combined with the library in order to run.
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which
+contains a notice placed by the copyright holder or other authorized party saying it
+may be distributed under the terms of this Lesser General Public License (also
+called "this License"). Each licensee is addressed as "you".
+A "library" means a collection of software functions and/or data prepared so as to
+be conveniently linked with application programs (which use some of those functions
+and data) to form executables.
+The "Library", below, refers to any such software library or work which has been
+distributed under these terms. A "work based on the Library" means either the
+Library or any derivative work under copyright law: that is to say, a work
+containing the Library or a portion of it, either verbatim or with modifications
+and/or translated straightforwardly into another language. (Hereinafter, translation
+is included without limitation in the term "modification".)
+"Source code" for a work means the preferred form of the work for making
+modifications to it. For a library, complete source code means all the source code
+for all modules it contains, plus any associated interface definition files, plus
+the scripts used to control compilation and installation of the library.
+Activities other than copying, distribution and modification are not covered by this
+License; they are outside its scope. The act of running a program using the Library
+is not restricted, and output from such a program is covered only if its contents
+constitute a work based on the Library (independent of the use of the Library in a
+tool for writing it). Whether that is true depends on what the Library does and what
+the program that uses the Library does.
+1. You may copy and distribute verbatim copies of the Library's complete source code
+as you receive it, in any medium, provided that you conspicuously and appropriately
+publish on each copy an appropriate copyright notice and disclaimer of warranty;
+keep intact all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the Library.
+You may charge a fee for the physical act of transferring a copy, and you may at
+your option offer warranty protection in exchange for a fee.
+2. You may modify your copy or copies of the Library or any portion of it, thus
+forming a work based on the Library, and copy and distribute such modifications or
+work under the terms of Section 1 above, provided that you also meet all of these
+conditions:
+a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you
+changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third
+parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to
+be supplied by an application program that uses the facility, other than as an
+argument passed when the facility is invoked, then you must make a good faith effort
+to ensure that, in the event an application does not supply such function or table,
+the facility still operates, and performs whatever part of its purpose remains
+meaningful. (For example, a function in a library to compute square roots has a purpose that is
+entirely well-defined independent of the application. Therefore, Subsection 2d
+requires that any application-supplied function or table used by this function must
+be optional: if the application does not supply it, the square root function must
+still compute square roots.)
+These requirements apply to the modified work as a whole. If identifiable sections
+of that work are not derived from the Library, and can be reasonably considered
+independent and separate works in themselves, then this License, and its terms, do
+not apply to those sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based on the
+Library, the distribution of the whole must be on the terms of this License, whose
+permissions for other licensees extend to the entire whole, and thus to each and
+every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to
+work written entirely by you; rather, the intent is to exercise the right to control
+the distribution of derivative or collective works based on the Library.
+In addition, mere aggregation of another work not based on the Library with the
+Library (or with a work based on the Library) on a volume of a storage or
+distribution medium does not bring the other work under the scope of this License.
+3. You may opt to apply the terms of the ordinary GNU General Public License instead
+of this License to a given copy of the Library. To do this, you must alter all the
+notices that refer to this License, so that they refer to the ordinary GNU General
+Public License, version 2, instead of to this License. (If a newer version than
+version 2 of the ordinary GNU General Public License has appeared, then you can
+specify that version instead if you wish.) Do not make any other change in these
+notices.
+Once this change is made in a given copy, it is irreversible for that copy, so the
+ordinary GNU General Public License applies to all subsequent copies and derivative
+works made from that copy.
+This option is useful when you wish to copy part of the code of the Library into a
+program that is not a library.
+4. You may copy and distribute the Library (or a portion or derivative of it, under
+Section 2) in object code or executable form under the terms of Sections 1 and 2
+above provided that you accompany it with the complete corresponding machine-
+readable source code, which must be distributed under the terms of Sections 1 and 2
+above on a medium customarily used for software interchange.
+If distribution of object code is made by offering access to copy from a designated
+place, then offering equivalent access to copy the source code from the same place
+satisfies the requirement to distribute the source code, even though third parties
+are not compelled to copy the source along with the object code.
+5. A program that contains no derivative of any portion of the Library, but is
+designed to work with the Library by being compiled or linked with it, is called a
+"work that uses the Library". Such a work, in isolation, is not a derivative work of
+the Library, and therefore falls outside the scope of this License.
+However, linking a "work that uses the Library" with the Library creates an
+executable that is a derivative of the Library (because it contains portions of the
+Library), rather than a "work that uses the library". The executable is therefore
+covered by this License. Section 6 states terms for distribution of such
+executables.
+When a "work that uses the Library" uses material from a header file that is part of
+the Library, the object code for the work may be a derivative work of the Library
+even though the source code is not. Whether this is true is especially significant
+if the work can be linked without the Library, or if the work is itself a library.
+The threshold for this to be true is not precisely defined by law.
+If such an object file uses only numerical parameters, data structure layouts and
+accessors, and small macros and small inline functions (ten lines or less in
+length), then the use of the object file is unrestricted, regardless of whether it
+is legally a derivative work. (Executables containing this object code plus portions
+of the Library will still fall under Section 6.)
+Otherwise, if the work is a derivative of the Library, you may distribute the object
+code for the work under the terms of Section 6. Any executables containing that work
+also fall under Section 6, whether or not they are linked directly with the Library
+itself.
+6. As an exception to the Sections above, you may also combine or link a "work that
+uses the Library" with the Library to produce a work containing portions of the
+Library, and distribute that work under terms of your choice, provided that the
+terms permit modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+You must give prominent notice with each copy of the work that the Library is used
+in it and that the Library and its use are covered by this License. You must supply
+a copy of this License. If the work during execution displays copyright notices, you
+must include the copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one of these
+things:
+a) Accompany the work with the complete corresponding machine-readable source code
+for the Library including whatever changes were used in the work (which must be
+distributed under Sections 1 and 2 above); and, if the work is an executable linked
+with the Library, with the complete machine-readable "work that uses the Library",
+as object code and/or source code, so that the user can modify the Library and then
+relink to produce a modified executable containing the modified Library. (It is
+understood that the user who changes the contents of definitions files in the
+Library will not necessarily be able to recompile the application to use the
+modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable
+mechanism is one that (1) uses at run time a copy of the library already present on
+the user's computer system, rather than copying library functions into the
+executable, and (2) will operate properly with a modified version of the library, if
+the user installs one, as long as the modified version is interface-compatible with
+the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give
+the same user the materials specified in Subsection 6a, above, for a charge no more
+than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated
+place, offer equivalent access to copy the above specified materials from the same
+place. e) Verify that the user has already received a copy of these materials or that you
+have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must
+include any data and utility programs needed for reproducing the executable from it.
+However, as a special exception, the materials to be distributed need not include
+anything that is normally distributed (in either source or binary form) with the
+major components (compiler, kernel, and so on) of the operating system on which the
+executable runs, unless that component itself accompanies the executable.
+It may happen that this requirement contradicts the license restrictions of other
+proprietary libraries that do not normally accompany the operating system. Such a
+contradiction means you cannot use both them and the Library together in an
+executable that you distribute.
+7. You may place library facilities that are a work based on the Library side-by-
+side in a single library together with other library facilities not covered by this
+License, and distribute such a combined library, provided that the separate
+distribution of the work based on the Library and of the other library facilities is
+otherwise permitted, and provided that you do these two things:
+a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
+9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
+10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
+11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
+If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
+It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
+12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
+13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
+Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the
+Free Software Foundation.
+14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
+NO WARRANTY
+15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH
+YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE
+OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
+To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. one line to give the library's name and an idea of what it does. Copyright (C) year name of author
+This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
+This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail.
+You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
+Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+signature of Ty Coon, 1 April 1990 Ty Coon, President of Vice That's all there is to it!
+
+***************************************************************************
+
+%%The following software may be included in this product:
+JFXtras Core v 0.5
+
+Use of any of this software is governed by the terms of the license below:
+Copyright (c) 2008-2009, JFXtras Group
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+3. Neither the name of JFXtras nor the names of its contributors may be used
+ to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+
+***************************************************************************
+
+%%The following software may be included in this product:
+Webkit
+
+You are receiving a copy of the WebKit library in object code in the
+JavaFX runtime or JavaFX SDK.
+A copy of the Oracle modified WebKit library in source code is located
+at http://oss.oracle.com/projects/webkit-java-mods/ . The terms of the
+Oracle license do NOT apply to the WebKit program; it is licensed under
+the following license separately from the Oracle programs you receive.
+If you do not wish to install this program, you may not wish to install
+the JavaFX runtime or JavaFX SDK.
+
+Use of any of this software is governed by the terms of the license below:
+
+GNU LIBRARY GENERAL PUBLIC LICENSE
+Version 2, June 1991
+Copyright (C) 1991 Free Software Foundation, Inc.
+51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL. It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+Preamble
+The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
+This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, too.
+When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
+To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it.
+For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
+Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library.
+Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations.
+Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
+Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license.
+The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such.
+Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better.
+However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries.
+The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library.
+Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one.
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you".
+A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
+The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
+"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
+Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
+1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
+You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
+2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
+a) The modified work must itself be a software library.
+b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
+c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
+d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
+These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
+Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
+In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
+3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
+Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
+This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
+4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
+If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
+5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
+However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
+When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
+If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
+Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
+6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
+You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
+a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
+b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
+c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
+d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
+For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
+It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
+7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
+a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
+b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
+8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
+9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
+10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
+11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
+If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
+It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
+This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
+12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
+13. The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
+Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
+14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
+NO WARRANTY
+15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+
+
+***************************************************************************
+
+%%The following software may be included in this product:
+zlib
+
+
+/* zlib.h -- interface of the 'zlib' general purpose compression library
+ version 1.2.2, October 3rd, 2004
+
+ Copyright (C) 1995-2004 Jean-loup Gailly and Mark Adler
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jean-loup Gailly jloup@gzip.org
+ Mark Adler madler@alumni.caltech.edu
+
+*/
+
+***************************************************************************
+
+%%The following software may be included in this product:
+libpng
+
+This copy of the libpng notices is provided for your convenience. In case of
+any discrepancy between this copy and the notices in the file png.h that is
+included in the libpng distribution, the latter shall prevail.
+
+COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
+
+If you modify libpng you may insert additional notices immediately following
+this sentence.
+
+This code is released under the libpng license.
+
+libpng versions 1.2.6, August 15, 2004, through 1.5.0, January 6, 2011, are
+Copyright (c) 2004, 2006-2010 Glenn Randers-Pehrson, and are
+distributed according to the same disclaimer and license as libpng-1.2.5
+with the following individual added to the list of Contributing Authors
+
+ Cosmin Truta
+
+libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
+Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
+distributed according to the same disclaimer and license as libpng-1.0.6
+with the following individuals added to the list of Contributing Authors
+
+ Simon-Pierre Cadieux
+ Eric S. Raymond
+ Gilles Vollant
+
+and with the following additions to the disclaimer:
+
+ There is no warranty against interference with your enjoyment of the
+ library or against infringement. There is no warranty that our
+ efforts or the library will fulfill any of your particular purposes
+ or needs. This library is provided with all faults, and the entire
+ risk of satisfactory quality, performance, accuracy, and effort is with
+ the user.
+
+libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
+Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are
+distributed according to the same disclaimer and license as libpng-0.96,
+with the following individuals added to the list of Contributing Authors:
+
+ Tom Lane
+ Glenn Randers-Pehrson
+ Willem van Schaik
+
+libpng versions 0.89, June 1996, through 0.96, May 1997, are
+Copyright (c) 1996, 1997 Andreas Dilger
+Distributed according to the same disclaimer and license as libpng-0.88,
+with the following individuals added to the list of Contributing Authors:
+
+ John Bowler
+ Kevin Bracey
+ Sam Bushell
+ Magnus Holmgren
+ Greg Roelofs
+ Tom Tanner
+
+libpng versions 0.5, May 1995, through 0.88, January 1996, are
+Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
+
+For the purposes of this copyright and license, "Contributing Authors"
+is defined as the following set of individuals:
+
+ Andreas Dilger
+ Dave Martindale
+ Guy Eric Schalnat
+ Paul Schmidt
+ Tim Wegner
+
+The PNG Reference Library is supplied "AS IS". The Contributing Authors
+and Group 42, Inc. disclaim all warranties, expressed or implied,
+including, without limitation, the warranties of merchantability and of
+fitness for any purpose. The Contributing Authors and Group 42, Inc.
+assume no liability for direct, indirect, incidental, special, exemplary,
+or consequential damages, which may result from the use of the PNG
+Reference Library, even if advised of the possibility of such damage.
+
+Permission is hereby granted to use, copy, modify, and distribute this
+source code, or portions hereof, for any purpose, without fee, subject
+to the following restrictions:
+
+1. The origin of this source code must not be misrepresented.
+
+2. Altered versions must be plainly marked as such and must not
+ be misrepresented as being the original source.
+
+3. This Copyright notice may not be removed or altered from any
+ source or altered source distribution.
+
+The Contributing Authors and Group 42, Inc. specifically permit, without
+fee, and encourage the use of this source code as a component to
+supporting the PNG file format in commercial products. If you use this
+source code in a product, acknowledgment is not required but would be
+appreciated.
+
+
+A "png_get_copyright" function is available, for convenient use in "about"
+boxes and the like:
+
+ printf("%s",png_get_copyright(NULL));
+
+Also, the PNG logo (in PNG format, of course) is supplied in the
+files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
+
+Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a
+certification mark of the Open Source Initiative.
+
+Glenn Randers-Pehrson
+glennrp at users.sourceforge.net
+January 6, 2011
+
+***************************************************************************
+
+%%The following software may be included in this product:
+libxml
+
+The MIT License
+Copyright (c) <year> <copyright holders>
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+***************************************************************************
+
+%%The following software may be included in this product:
+libxslt
+
+The MIT License
+
+Copyright (c) <year> <copyright holders>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/THIRDPARTYLICENSEREADME.txt b/love2dToAPK/tools/tools/jdk-win/jre/THIRDPARTYLICENSEREADME.txt
new file mode 100644
index 0000000..cd88baf
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/THIRDPARTYLICENSEREADME.txt
@@ -0,0 +1,3605 @@
+DO NOT TRANSLATE OR LOCALIZE.
+-----------------------------
+
+%% This notice is provided with respect to ASM Bytecode Manipulation
+Framework v5.0.3, which may be included with JRE 8, and JDK 8, and
+OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Copyright (c) 2000-2011 France Télécom
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holders nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGE.
+
+--- end of LICENSE ---
+
+--------------------------------------------------------------------------------
+
+%% This notice is provided with respect to BSDiff v4.3, which may be
+included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Copyright 2003-2005 Colin Percival
+All rights reserved
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted providing that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to CodeViewer 1.0, which may be
+included with JDK 8.
+
+--- begin of LICENSE ---
+
+Copyright 1999 by CoolServlets.com.
+
+Any errors or suggested improvements to this class can be reported as
+instructed on CoolServlets.com. We hope you enjoy this program... your
+comments will encourage further development! This software is distributed
+under the terms of the BSD License. Redistribution and use in source and
+binary forms, with or without modification, are permitted provided that the
+following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+Neither name of CoolServlets.com nor the names of its contributors may be
+used to endorse or promote products derived from this software without
+specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY COOLSERVLETS.COM AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Cryptix AES 3.2.0, which may be
+included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Cryptix General License
+
+Copyright (c) 1995-2005 The Cryptix Foundation Limited.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ 1. Redistributions of source code must retain the copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE CRYPTIX FOUNDATION LIMITED AND
+CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE CRYPTIX FOUNDATION LIMITED OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to CUP Parser Generator for
+Java 0.10k, which may be included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Copyright 1996-1999 by Scott Hudson, Frank Flannery, C. Scott Ananian
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted, provided
+that the above copyright notice appear in all copies and that both the
+copyright notice and this permission notice and warranty disclaimer appear in
+supporting documentation, and that the names of the authors or their
+employers not be used in advertising or publicity pertaining to distribution of
+the software without specific, written prior permission.
+
+The authors and their employers disclaim all warranties with regard to
+this software, including all implied warranties of merchantability and fitness.
+In no event shall the authors or their employers be liable for any special,
+indirect or consequential damages or any damages whatsoever resulting from
+loss of use, data or profits, whether in an action of contract, negligence or
+other tortious action, arising out of or in connection with the use or
+performance of this software.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Document Object Model (DOM) Level 2
+& 3, which may be included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+W3C SOFTWARE NOTICE AND LICENSE
+
+http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
+
+This work (and included software, documentation such as READMEs, or other
+related items) is being provided by the copyright holders under the following
+license. By obtaining, using and/or copying this work, you (the licensee)
+agree that you have read, understood, and will comply with the following terms
+and conditions.
+
+Permission to copy, modify, and distribute this software and its
+documentation, with or without modification, for any purpose and without fee
+or royalty is hereby granted, provided that you include the following on ALL
+copies of the software and documentation or portions thereof, including
+modifications:
+
+ 1.The full text of this NOTICE in a location viewable to users of the
+ redistributed or derivative work.
+
+ 2.Any pre-existing intellectual property disclaimers, notices, or terms and
+ conditions. If none exist, the W3C Software Short Notice should be included
+ (hypertext is preferred, text is permitted) within the body of any
+ redistributed or derivative code.
+
+ 3.Notice of any changes or modifications to the files, including the date
+ changes were made. (We recommend you provide URIs to the location from
+ which the code is derived.)
+
+THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS
+MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
+LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR
+PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY
+THIRD PARTY PATENTS,COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
+
+COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL
+OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR
+DOCUMENTATION. The name and trademarks of copyright holders may NOT be used
+in advertising or publicity pertaining to the software without specific,
+written prior permission. Title to copyright in this software and any
+associated documentation will at all times remain with copyright holders.
+
+____________________________________
+
+This formulation of W3C's notice and license became active on December 31
+2002. This version removes the copyright ownership notice such that this
+license can be used with materials other than those owned by the W3C, reflects
+that ERCIM is now a host of the W3C, includes references to this specific
+dated version of the license, and removes the ambiguous grant of "use".
+Otherwise, this version is the same as the previous version and is written so
+as to preserve the Free Software Foundation's assessment of GPL compatibility
+and OSI's certification under the Open Source Definition. Please see our
+Copyright FAQ for common questions about using materials from our site,
+including specific terms and conditions for packages like libwww, Amaya, and
+Jigsaw. Other questions about this notice can be directed to
+site-policy@w3.org.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Dynalink v0.5, which may be
+included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Copyright (c) 2009-2013, Attila Szegedi
+
+All rights reserved.Redistribution and use in source and binary forms, with or
+without modification, are permitted provided that the following conditions are
+met:* Redistributions of source code must retain the above copyright notice,
+this list of conditions and the following disclaimer. * Redistributions in
+binary form must reproduce the above copyright notice, this list of
+conditions and the following disclaimer in the documentation and/or other
+materials provided with the distribution. * Neither the name of Attila
+Szegedi nor the names of its contributors may be used to endorse or promote
+products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THEPOSSIBILITY OF SUCH DAMAGE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Elliptic Curve Cryptography, which
+may be included with JRE 8, JDK 8, and OpenJDK 8.
+
+You are receiving a copy of the Elliptic Curve Cryptography library in source
+form with the JDK 8 and OpenJDK 8 source distributions, and as object code in
+the JRE 8 & JDK 8 runtimes.
+
+In the case of the JRE 8 & JDK 8 runtimes, the terms of the Oracle license do
+NOT apply to the Elliptic Curve Cryptography library; it is licensed under the
+following license, separately from Oracle's JDK & JRE. If you do not wish to
+install the Elliptic Curve Cryptography library, you may delete the library
+named libsunec.so (on Solaris and Linux systems) or sunec.dll (on Windows
+systems) from the JRE bin directory reserved for native libraries.
+
+
+--- begin of LICENSE ---
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to ECMAScript Language
+Specification ECMA-262 Edition 5.1 which may be included with
+JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Copyright notice
+Copyright © 2011 Ecma International
+Ecma International
+Rue du Rhone 114
+CH-1204 Geneva
+Tel: +41 22 849 6000
+Fax: +41 22 849 6001
+Web: http://www.ecma-international.org
+
+This document and possible translations of it may be copied and furnished to
+others, and derivative works that comment on or otherwise explain it or assist
+in its implementation may be prepared, copied, published, and distributed, in
+whole or in part, without restriction of any kind, provided that the above
+copyright notice and this section are included on all such copies and derivative
+works. However, this document itself may not be modified in any way, including
+by removing the copyright notice or references to Ecma International, except as
+needed for the purpose of developing any document or deliverable produced by
+Ecma International (in which case the rules applied to copyrights must be
+followed) or as required to translate it into languages other than English. The
+limited permissions granted above are perpetual and will not be revoked by Ecma
+International or its successors or assigns. This document and the information
+contained herein is provided on an "AS IS" basis and ECMA INTERNATIONAL
+DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY
+WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY OWNERSHIP
+RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
+PURPOSE." Software License
+
+All Software contained in this document ("Software)" is protected by copyright
+and is being made available under the "BSD License", included below. This
+Software may be subject to third party rights (rights from parties other than
+Ecma International), including patent rights, and no licenses under such third
+party rights are granted under this license even if the third party concerned is
+a member of Ecma International. SEE THE ECMA CODE OF CONDUCT IN PATENT MATTERS
+AVAILABLE AT http://www.ecma-international.org/memento/codeofconduct.htm FOR
+INFORMATION REGARDING THE LICENSING OF PATENT CLAIMS THAT ARE REQUIRED TO
+IMPLEMENT ECMA INTERNATIONAL STANDARDS*. Redistribution and use in source and
+binary forms, with or without modification, are permitted provided that the
+following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation and/or
+other materials provided with the distribution.
+
+3. Neither the name of the authors nor Ecma International may be used to endorse
+or promote products derived from this software without specific prior written
+permission.
+
+THIS SOFTWARE IS PROVIDED BY THE ECMA INTERNATIONAL "AS IS" AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL ECMA INTERNATIONAL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+OF SUCH DAMAGE.
+--- end of LICENSE ---
+
+%% This notice is provided with respect to Dynalink library which is included
+with the Nashorn technology.
+
+--- begin of LICENSE ---
+Copyright (c) 2009-2013, Attila Szegedi
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+* Neither the name of the copyright holder nor the names of
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--- end of LICENSE ---
+
+%% This notice is provided with respect to Joni library which is included
+with the Nashorn technology.
+
+--- begin of LICENSE ---
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to FontConfig 2.5, which may be
+included with JRE 8, JDK 8, and OpenJDK 8 source distributions on
+Linux and Solaris.
+
+--- begin of LICENSE ---
+
+Copyright © 2001,2003 Keith Packard
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that the
+above copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation, and that
+the name of Keith Packard not be used in advertising or publicity pertaining
+to distribution of the software without specific, written prior permission.
+Keith Packard makes no representations about the suitability of this software
+for any purpose. It is provided "as is" without express or implied warranty.
+
+KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL KEITH
+PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
+DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to IAIK PKCS#11 Wrapper,
+which may be included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+IAIK PKCS#11 Wrapper License
+
+Copyright (c) 2002 Graz University of Technology. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+3. The end-user documentation included with the redistribution, if any, must
+ include the following acknowledgment:
+
+ "This product includes software developed by IAIK of Graz University of
+ Technology."
+
+ Alternately, this acknowledgment may appear in the software itself, if and
+ wherever such third-party acknowledgments normally appear.
+
+4. The names "Graz University of Technology" and "IAIK of Graz University of
+ Technology" must not be used to endorse or promote products derived from this
+ software without prior written permission.
+
+5. Products derived from this software may not be called "IAIK PKCS Wrapper",
+ nor may "IAIK" appear in their name, without prior written permission of
+ Graz University of Technology.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+LICENSOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to ICU4C 4.0.1 and ICU4J 4.4, which
+may be included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Copyright (c) 1995-2010 International Business Machines Corporation and others
+
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, and/or sell copies of the
+Software, and to permit persons to whom the Software is furnished to do so,
+provided that the above copyright notice(s) and this permission notice appear
+in all copies of the Software and that both the above copyright notice(s) and
+this permission notice appear in supporting documentation.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN
+NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE
+LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY
+DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder shall not
+be used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization of the copyright holder.
+All trademarks and registered trademarks mentioned herein are the property of
+their respective owners.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to IJG JPEG 6b, which may be
+included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+This software is copyright (C) 1991-1998, Thomas G. Lane.
+All Rights Reserved except as specified below.
+
+Permission is hereby granted to use, copy, modify, and distribute this
+software (or portions thereof) for any purpose, without fee, subject to these
+conditions:
+(1) If any part of the source code for this software is distributed, then this
+README file must be included, with this copyright and no-warranty notice
+unaltered; and any additions, deletions, or changes to the original files
+must be clearly indicated in accompanying documentation.
+(2) If only executable code is distributed, then the accompanying
+documentation must state that "this software is based in part on the work of
+the Independent JPEG Group".
+(3) Permission for use of this software is granted only if the user accepts
+full responsibility for any undesirable consequences; the authors accept
+NO LIABILITY for damages of any kind.
+
+These conditions apply to any software derived from or based on the IJG code,
+not just to the unmodified library. If you use our work, you ought to
+acknowledge us.
+
+Permission is NOT granted for the use of any IJG author's name or company name
+in advertising or publicity relating to this software or products derived from
+it. This software may be referred to only as "the Independent JPEG Group's
+software".
+
+We specifically permit and encourage the use of this software as the basis of
+commercial products, provided that all warranty or liability claims are
+assumed by the product vendor.
+
+--- end of LICENSE ---
+
+--------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Joni v1.1.9, which may be
+included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to JOpt-Simple v3.0, which may be
+included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+ Copyright (c) 2004-2009 Paul R. Holser, Jr.
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+--- end of LICENSE ---
+
+--------------------------------------------------------------------------------
+
+%% This notice is provided with respect to JSON, which may be included
+with JRE 8 & JDK 8.
+
+--- begin of LICENSE ---
+
+Copyright (c) 2002 JSON.org
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+The Software shall be used for Good, not Evil.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Kerberos functionality, which
+which may be included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+ (C) Copyright IBM Corp. 1999 All Rights Reserved.
+ Copyright 1997 The Open Group Research Institute. All rights reserved.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Kerberos functionality from
+FundsXpress, INC., which may be included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+ Copyright (C) 1998 by the FundsXpress, INC.
+
+ All rights reserved.
+
+ Export of this software from the United States of America may require
+ a specific license from the United States Government. It is the
+ responsibility of any person or organization contemplating export to
+ obtain such a license before exporting.
+
+ WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
+ distribute this software and its documentation for any purpose and
+ without fee is hereby granted, provided that the above copyright
+ notice appear in all copies and that both that copyright notice and
+ this permission notice appear in supporting documentation, and that
+ the name of FundsXpress. not be used in advertising or publicity pertaining
+ to distribution of the software without specific, written prior
+ permission. FundsXpress makes no representations about the suitability of
+ this software for any purpose. It is provided "as is" without express
+ or implied warranty.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Kronos OpenGL headers, which may be
+included with JDK 8 and OpenJDK 8 source distributions.
+
+--- begin of LICENSE ---
+
+ Copyright (c) 2007 The Khronos Group Inc.
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and/or associated documentation files (the "Materials"), to
+ deal in the Materials without restriction, including without limitation the
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ sell copies of the Materials, and to permit persons to whom the Materials are
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Materials.
+
+ THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS IN THE
+ MATERIALS.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% Portions Copyright Eastman Kodak Company 1992
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to libpng 1.6.16, which may be
+included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+This copy of the libpng notices is provided for your convenience. In case of
+any discrepancy between this copy and the notices in the file png.h that is
+included in the libpng distribution, the latter shall prevail.
+
+COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
+
+If you modify libpng you may insert additional notices immediately following
+this sentence.
+
+This code is released under the libpng license.
+
+libpng versions 1.2.6, August 15, 2004, through 1.6.16, December 22, 2014, are
+Copyright (c) 2004, 2006-2014 Glenn Randers-Pehrson, and are
+distributed according to the same disclaimer and license as libpng-1.2.5
+with the following individual added to the list of Contributing Authors
+
+ Cosmin Truta
+
+libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
+Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
+distributed according to the same disclaimer and license as libpng-1.0.6
+with the following individuals added to the list of Contributing Authors
+
+ Simon-Pierre Cadieux
+ Eric S. Raymond
+ Gilles Vollant
+
+and with the following additions to the disclaimer:
+
+ There is no warranty against interference with your enjoyment of the
+ library or against infringement. There is no warranty that our
+ efforts or the library will fulfill any of your particular purposes
+ or needs. This library is provided with all faults, and the entire
+ risk of satisfactory quality, performance, accuracy, and effort is with
+ the user.
+
+libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
+Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are
+distributed according to the same disclaimer and license as libpng-0.96,
+with the following individuals added to the list of Contributing Authors:
+
+ Tom Lane
+ Glenn Randers-Pehrson
+ Willem van Schaik
+
+libpng versions 0.89, June 1996, through 0.96, May 1997, are
+Copyright (c) 1996, 1997 Andreas Dilger
+Distributed according to the same disclaimer and license as libpng-0.88,
+with the following individuals added to the list of Contributing Authors:
+
+ John Bowler
+ Kevin Bracey
+ Sam Bushell
+ Magnus Holmgren
+ Greg Roelofs
+ Tom Tanner
+
+libpng versions 0.5, May 1995, through 0.88, January 1996, are
+Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
+
+For the purposes of this copyright and license, "Contributing Authors"
+is defined as the following set of individuals:
+
+ Andreas Dilger
+ Dave Martindale
+ Guy Eric Schalnat
+ Paul Schmidt
+ Tim Wegner
+
+The PNG Reference Library is supplied "AS IS". The Contributing Authors
+and Group 42, Inc. disclaim all warranties, expressed or implied,
+including, without limitation, the warranties of merchantability and of
+fitness for any purpose. The Contributing Authors and Group 42, Inc.
+assume no liability for direct, indirect, incidental, special, exemplary,
+or consequential damages, which may result from the use of the PNG
+Reference Library, even if advised of the possibility of such damage.
+
+Permission is hereby granted to use, copy, modify, and distribute this
+source code, or portions hereof, for any purpose, without fee, subject
+to the following restrictions:
+
+1. The origin of this source code must not be misrepresented.
+
+2. Altered versions must be plainly marked as such and must not
+ be misrepresented as being the original source.
+
+3. This Copyright notice may not be removed or altered from any
+ source or altered source distribution.
+
+The Contributing Authors and Group 42, Inc. specifically permit, without
+fee, and encourage the use of this source code as a component to
+supporting the PNG file format in commercial products. If you use this
+source code in a product, acknowledgment is not required but would be
+appreciated.
+
+
+A "png_get_copyright" function is available, for convenient use in "about"
+boxes and the like:
+
+ printf("%s",png_get_copyright(NULL));
+
+Also, the PNG logo (in PNG format, of course) is supplied in the
+files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
+
+Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a
+certification mark of the Open Source Initiative.
+
+Glenn Randers-Pehrson
+glennrp at users.sourceforge.net
+December 22, 2014
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to libungif 4.1.3, which may be
+included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+The GIFLIB distribution is Copyright (c) 1997 Eric S. Raymond
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Little CMS 2.5, which may be
+included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Little CMS
+Copyright (c) 1998-2011 Marti Maria Saguer
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% Lucida is a registered trademark or trademark of Bigelow & Holmes in the
+U.S. and other countries.
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Mesa 3D Graphics Library v4.1,
+which may be included with JRE 8, JDK 8, and OpenJDK 8 source distributions.
+
+--- begin of LICENSE ---
+
+ Mesa 3-D graphics library
+ Version: 4.1
+
+ Copyright (C) 1999-2002 Brian Paul All Rights Reserved.
+
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the "Software"),
+ to deal in the Software without restriction, including without limitation
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ and/or sell copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Mozilla Network Security
+Services (NSS), which is supplied with the JDK test suite in the OpenJDK
+source code repository. It is licensed under Mozilla Public License (MPL),
+version 2.0.
+
+The NSS libraries are supplied in executable form, built from unmodified
+NSS source code labeled with the "NSS_3_16_RTM" HG tag.
+
+The NSS source code is available in the OpenJDK source code repository at:
+ jdk/test/sun/security/pkcs11/nss/src
+
+The NSS libraries are available in the OpenJDK source code repository at:
+ jdk/test/sun/security/pkcs11/nss/lib
+
+--- begin of LICENSE ---
+
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+ means each individual or legal entity that creates, contributes to
+ the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+ means the combination of the Contributions of others (if any) used
+ by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+ means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+ means Source Code Form to which the initial Contributor has attached
+ the notice in Exhibit A, the Executable Form of such Source Code
+ Form, and Modifications of such Source Code Form, in each case
+ including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+ means
+
+ (a) that the initial Contributor has attached the notice described
+ in Exhibit B to the Covered Software; or
+
+ (b) that the Covered Software was made available under the terms of
+ version 1.1 or earlier of the License, but not also under the
+ terms of a Secondary License.
+
+1.6. "Executable Form"
+ means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+ means a work that combines Covered Software with other material, in
+ a separate file or files, that is not Covered Software.
+
+1.8. "License"
+ means this document.
+
+1.9. "Licensable"
+ means having the right to grant, to the maximum extent possible,
+ whether at the time of the initial grant or subsequently, any and
+ all of the rights conveyed by this License.
+
+1.10. "Modifications"
+ means any of the following:
+
+ (a) any file in Source Code Form that results from an addition to,
+ deletion from, or modification of the contents of Covered
+ Software; or
+
+ (b) any new file in Source Code Form that contains any Covered
+ Software.
+
+1.11. "Patent Claims" of a Contributor
+ means any patent claim(s), including without limitation, method,
+ process, and apparatus claims, in any patent Licensable by such
+ Contributor that would be infringed, but for the grant of the
+ License, by the making, using, selling, offering for sale, having
+ made, import, or transfer of either its Contributions or its
+ Contributor Version.
+
+1.12. "Secondary License"
+ means either the GNU General Public License, Version 2.0, the GNU
+ Lesser General Public License, Version 2.1, the GNU Affero General
+ Public License, Version 3.0, or any later versions of those
+ licenses.
+
+1.13. "Source Code Form"
+ means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+ means an individual or a legal entity exercising rights under this
+ License. For legal entities, "You" includes any entity that
+ controls, is controlled by, or is under common control with You. For
+ purposes of this definition, "control" means (a) the power, direct
+ or indirect, to cause the direction or management of such entity,
+ whether by contract or otherwise, or (b) ownership of more than
+ fifty percent (50%) of the outstanding shares or beneficial
+ ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+ Licensable by such Contributor to use, reproduce, make available,
+ modify, display, perform, distribute, and otherwise exploit its
+ Contributions, either on an unmodified basis, with Modifications, or
+ as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+ for sale, have made, import, and otherwise transfer either its
+ Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+ or
+
+(b) for infringements caused by: (i) Your and any other third party's
+ modifications of Covered Software, or (ii) the combination of its
+ Contributions with other software (except as part of its Contributor
+ Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+ its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+ Form, as described in Section 3.1, and You must inform recipients of
+ the Executable Form how they can obtain a copy of such Source Code
+ Form by reasonable means in a timely manner, at a charge no more
+ than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+ License, or sublicense it under different terms, provided that the
+ license for the Executable Form does not attempt to limit or alter
+ the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+* *
+* 6. Disclaimer of Warranty *
+* ------------------------- *
+* *
+* Covered Software is provided under this License on an "as is" *
+* basis, without warranty of any kind, either expressed, implied, or *
+* statutory, including, without limitation, warranties that the *
+* Covered Software is free of defects, merchantable, fit for a *
+* particular purpose or non-infringing. The entire risk as to the *
+* quality and performance of the Covered Software is with You. *
+* Should any Covered Software prove defective in any respect, You *
+* (not any Contributor) assume the cost of any necessary servicing, *
+* repair, or correction. This disclaimer of warranty constitutes an *
+* essential part of this License. No use of any Covered Software is *
+* authorized under this License except under this disclaimer. *
+* *
+************************************************************************
+
+************************************************************************
+* *
+* 7. Limitation of Liability *
+* -------------------------- *
+* *
+* Under no circumstances and under no legal theory, whether tort *
+* (including negligence), contract, or otherwise, shall any *
+* Contributor, or anyone who distributes Covered Software as *
+* permitted above, be liable to You for any direct, indirect, *
+* special, incidental, or consequential damages of any character *
+* including, without limitation, damages for lost profits, loss of *
+* goodwill, work stoppage, computer failure or malfunction, or any *
+* and all other commercial damages or losses, even if such party *
+* shall have been informed of the possibility of such damages. This *
+* limitation of liability shall not apply to liability for death or *
+* personal injury resulting from such party's negligence to the *
+* extent applicable law prohibits such limitation. Some *
+* jurisdictions do not allow the exclusion or limitation of *
+* incidental or consequential damages, so this exclusion and *
+* limitation may not apply to You. *
+* *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+ This Source Code Form is subject to the terms of the Mozilla Public
+ License, v. 2.0. If a copy of the MPL was not distributed with this
+ file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+ This Source Code Form is "Incompatible With Secondary Licenses", as
+ defined by the Mozilla Public License, v. 2.0.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to PC/SC Lite for Suse Linux v.1.1.1,
+which may be included with JRE 8, JDK 8, and OpenJDK 8 on Linux and Solaris.
+
+--- begin of LICENSE ---
+
+Copyright (c) 1999-2004 David Corcoran <corcoran@linuxnet.com>
+Copyright (c) 1999-2004 Ludovic Rousseau <ludovic.rousseau (at) free.fr>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+3. All advertising materials mentioning features or use of this software
+ must display the following acknowledgement:
+ This product includes software developed by:
+ David Corcoran <corcoran@linuxnet.com>
+ http://www.linuxnet.com (MUSCLE)
+4. The name of the author may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+Changes to this license can be made only by the copyright author with
+explicit written consent.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to PorterStemmer v4, which may be
+included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+See: http://tartarus.org/~martin/PorterStemmer
+
+The software is completely free for any purpose, unless notes at the head of
+the program text indicates otherwise (which is rare). In any case, the notes
+about licensing are never more restrictive than the BSD License.
+
+In every case where the software is not written by me (Martin Porter), this
+licensing arrangement has been endorsed by the contributor, and it is
+therefore unnecessary to ask the contributor again to confirm it.
+
+I have not asked any contributors (or their employers, if they have them) for
+proofs that they have the right to distribute their software in this way.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Relax NG Object/Parser v.20050510,
+which may be included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Copyright (c) Kohsuke Kawaguchi
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions: The above copyright
+notice and this permission notice shall be included in all copies or
+substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to RelaxNGCC v1.12, which may be
+included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Copyright (c) 2000-2003 Daisuke Okajima and Kohsuke Kawaguchi.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+3. The end-user documentation included with the redistribution, if any, must
+ include the following acknowledgment:
+
+ "This product includes software developed by Daisuke Okajima
+ and Kohsuke Kawaguchi (http://relaxngcc.sf.net/)."
+
+Alternately, this acknowledgment may appear in the software itself, if and
+wherever such third-party acknowledgments normally appear.
+
+4. The names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission. For
+ written permission, please contact the copyright holders.
+
+5. Products derived from this software may not be called "RELAXNGCC", nor may
+ "RELAXNGCC" appear in their name, without prior written permission of the
+ copyright holders.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE APACHE
+SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to SAX 2.0.1, which may be included
+with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+ SAX is free!
+
+ In fact, it's not possible to own a license to SAX, since it's been placed in
+ the public domain.
+
+ No Warranty
+
+ Because SAX is released to the public domain, there is no warranty for the
+ design or for the software implementation, to the extent permitted by
+ applicable law. Except when otherwise stated in writing the copyright holders
+ and/or other parties provide SAX "as is" without warranty of any kind, either
+ expressed or implied, including, but not limited to, the implied warranties
+ of merchantability and fitness for a particular purpose. The entire risk as
+ to the quality and performance of SAX is with you. Should SAX prove
+ defective, you assume the cost of all necessary servicing, repair or
+ correction.
+
+ In no event unless required by applicable law or agreed to in writing will
+ any copyright holder, or any other party who may modify and/or redistribute
+ SAX, be liable to you for damages, including any general, special, incidental
+ or consequential damages arising out of the use or inability to use SAX
+ (including but not limited to loss of data or data being rendered inaccurate
+ or losses sustained by you or third parties or a failure of the SAX to
+ operate with any other programs), even if such holder or other party has been
+ advised of the possibility of such damages.
+
+ Copyright Disclaimers
+
+ This page includes statements to that effect by David Megginson, who would
+ have been able to claim copyright for the original work. SAX 1.0
+
+ Version 1.0 of the Simple API for XML (SAX), created collectively by the
+ membership of the XML-DEV mailing list, is hereby released into the public
+ domain.
+
+ No one owns SAX: you may use it freely in both commercial and non-commercial
+ applications, bundle it with your software distribution, include it on a
+ CD-ROM, list the source code in a book, mirror the documentation at your own
+ web site, or use it in any other way you see fit.
+
+ David Megginson, sax@megginson.com
+ 1998-05-11
+
+ SAX 2.0
+
+ I hereby abandon any property rights to SAX 2.0 (the Simple API for XML), and
+ release all of the SAX 2.0 source code, compiled code, and documentation
+ contained in this distribution into the Public Domain. SAX comes with NO
+ WARRANTY or guarantee of fitness for any purpose.
+
+ David Megginson, david@megginson.com
+ 2000-05-05
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to SoftFloat version 2b, which may be
+included with JRE 8, JDK 8, and OpenJDK 8 on Linux/ARM.
+
+--- begin of LICENSE ---
+
+Use of any of this software is governed by the terms of the license below:
+
+SoftFloat was written by me, John R. Hauser. This work was made possible in
+part by the International Computer Science Institute, located at Suite 600,
+1947 Center Street, Berkeley, California 94704. Funding was partially
+provided by the National Science Foundation under grant MIP-9311980. The
+original version of this code was written as part of a project to build
+a fixed-point vector processor in collaboration with the University of
+California at Berkeley, overseen by Profs. Nelson Morgan and John Wawrzynek.
+
+THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort
+has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
+TIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO
+PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL
+LOSSES, COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO
+FURTHERMORE EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER
+SCIENCE INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES,
+COSTS, OR OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE
+SOFTWARE.
+
+Derivative works are acceptable, even for commercial purposes, provided
+that the minimal documentation requirements stated in the source code are
+satisfied.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Sparkle 1.5,
+which may be included with JRE 8 on Mac OS X.
+
+--- begin of LICENSE ---
+
+Copyright (c) 2012 Sparkle.org and Andy Matuschak
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% Portions licensed from Taligent, Inc.
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Thai Dictionary, which may be
+included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Copyright (C) 1982 The Royal Institute, Thai Royal Government.
+
+Copyright (C) 1998 National Electronics and Computer Technology Center,
+National Science and Technology Development Agency,
+Ministry of Science Technology and Environment,
+Thai Royal Government.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Unicode 6.2.0 & CLDR 21.0.1
+which may be included with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+Unicode Terms of Use
+
+For the general privacy policy governing access to this site, see the Unicode
+Privacy Policy. For trademark usage, see the Unicode® Consortium Name and
+Trademark Usage Policy.
+
+A. Unicode Copyright.
+ 1. Copyright © 1991-2013 Unicode, Inc. All rights reserved.
+
+ 2. Certain documents and files on this website contain a legend indicating
+ that "Modification is permitted." Any person is hereby authorized,
+ without fee, to modify such documents and files to create derivative
+ works conforming to the Unicode® Standard, subject to Terms and
+ Conditions herein.
+
+ 3. Any person is hereby authorized, without fee, to view, use, reproduce,
+ and distribute all documents and files solely for informational
+ purposes in the creation of products supporting the Unicode Standard,
+ subject to the Terms and Conditions herein.
+
+ 4. Further specifications of rights and restrictions pertaining to the use
+ of the particular set of data files known as the "Unicode Character
+ Database" can be found in Exhibit 1.
+
+ 5. Each version of the Unicode Standard has further specifications of
+ rights and restrictions of use. For the book editions (Unicode 5.0 and
+ earlier), these are found on the back of the title page. The online
+ code charts carry specific restrictions. All other files, including
+ online documentation of the core specification for Unicode 6.0 and
+ later, are covered under these general Terms of Use.
+
+ 6. No license is granted to "mirror" the Unicode website where a fee is
+ charged for access to the "mirror" site.
+
+ 7. Modification is not permitted with respect to this document. All copies
+ of this document must be verbatim.
+
+B. Restricted Rights Legend. Any technical data or software which is licensed
+ to the United States of America, its agencies and/or instrumentalities
+ under this Agreement is commercial technical data or commercial computer
+ software developed exclusively at private expense as defined in FAR 2.101,
+ or DFARS 252.227-7014 (June 1995), as applicable. For technical data, use,
+ duplication, or disclosure by the Government is subject to restrictions as
+ set forth in DFARS 202.227-7015 Technical Data, Commercial and Items (Nov
+ 1995) and this Agreement. For Software, in accordance with FAR 12-212 or
+ DFARS 227-7202, as applicable, use, duplication or disclosure by the
+ Government is subject to the restrictions set forth in this Agreement.
+
+C. Warranties and Disclaimers.
+ 1. This publication and/or website may include technical or typographical
+ errors or other inaccuracies . Changes are periodically added to the
+ information herein; these changes will be incorporated in new editions
+ of the publication and/or website. Unicode may make improvements and/or
+ changes in the product(s) and/or program(s) described in this
+ publication and/or website at any time.
+
+ 2. If this file has been purchased on magnetic or optical media from
+ Unicode, Inc. the sole and exclusive remedy for any claim will be
+ exchange of the defective media within ninety (90) days of original
+ purchase.
+
+ 3. EXCEPT AS PROVIDED IN SECTION C.2, THIS PUBLICATION AND/OR SOFTWARE IS
+ PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND EITHER EXPRESS, IMPLIED,
+ OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
+ UNICODE AND ITS LICENSORS ASSUME NO RESPONSIBILITY FOR ERRORS OR
+ OMISSIONS IN THIS PUBLICATION AND/OR SOFTWARE OR OTHER DOCUMENTS WHICH
+ ARE REFERENCED BY OR LINKED TO THIS PUBLICATION OR THE UNICODE WEBSITE.
+
+D. Waiver of Damages. In no event shall Unicode or its licensors be liable for
+ any special, incidental, indirect or consequential damages of any kind, or
+ any damages whatsoever, whether or not Unicode was advised of the
+ possibility of the damage, including, without limitation, those resulting
+ from the following: loss of use, data or profits, in connection with the
+ use, modification or distribution of this information or its derivatives.
+
+E.Trademarks & Logos.
+ 1. The Unicode Word Mark and the Unicode Logo are trademarks of Unicode,
+ Inc. “The Unicode Consortium” and “Unicode, Inc.” are trade names of
+ Unicode, Inc. Use of the information and materials found on this
+ website indicates your acknowledgement of Unicode, Inc.’s exclusive
+ worldwide rights in the Unicode Word Mark, the Unicode Logo, and the
+ Unicode trade names.
+
+ 2. The Unicode Consortium Name and Trademark Usage Policy (“Trademark
+ Policy”) are incorporated herein by reference and you agree to abide by
+ the provisions of the Trademark Policy, which may be changed from time
+ to time in the sole discretion of Unicode, Inc.
+
+ 3. All third party trademarks referenced herein are the property of their
+ respective owners.
+
+Miscellaneous.
+ 1. Jurisdiction and Venue. This server is operated from a location in the
+ State of California, United States of America. Unicode makes no
+ representation that the materials are appropriate for use in other
+ locations. If you access this server from other locations, you are
+ responsible for compliance with local laws. This Agreement, all use of
+ this site and any claims and damages resulting from use of this site are
+ governed solely by the laws of the State of California without regard to
+ any principles which would apply the laws of a different jurisdiction.
+ The user agrees that any disputes regarding this site shall be resolved
+ solely in the courts located in Santa Clara County, California. The user
+ agrees said courts have personal jurisdiction and agree to waive any
+ right to transfer the dispute to any other forum.
+
+ 2. Modification by Unicode. Unicode shall have the right to modify this
+ Agreement at any time by posting it to this site. The user may not
+ assign any part of this Agreement without Unicode’s prior written
+ consent.
+
+ 3. Taxes. The user agrees to pay any taxes arising from access to this
+ website or use of the information herein, except for those based on
+ Unicode’s net income.
+
+ 4. Severability. If any provision of this Agreement is declared invalid or
+ unenforceable, the remaining provisions of this Agreement shall remain
+ in effect.
+
+ 5. Entire Agreement. This Agreement constitutes the entire agreement
+ between the parties.
+
+EXHIBIT 1
+UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE
+
+Unicode Data Files include all data files under the directories
+http://www.unicode.org/Public/, http://www.unicode.org/reports/, and
+http://www.unicode.org/cldr/data/. Unicode Data Files do not include PDF
+online code charts under the directory http://www.unicode.org/Public/.
+Software includes any source code published in the Unicode Standard or under
+the directories http://www.unicode.org/Public/,
+http://www.unicode.org/reports/, and http://www.unicode.org/cldr/data/.
+
+NOTICE TO USER: Carefully read the following legal agreement. BY DOWNLOADING,
+INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA FILES ("DATA
+FILES"), AND/OR SOFTWARE ("SOFTWARE"), YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO
+BE BOUND BY, ALL OF THE TERMS AND CONDITIONS OF THIS AGREEMENT. IF YOU DO NOT
+AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE THE DATA FILES OR
+SOFTWARE.
+
+COPYRIGHT AND PERMISSION NOTICE
+
+Copyright © 1991-2012 Unicode, Inc. All rights reserved. Distributed under the
+Terms of Use in http://www.unicode.org/copyright.html.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the Unicode data files and any associated documentation (the "Data Files")
+or Unicode software and any associated documentation (the "Software") to deal
+in the Data Files or Software without restriction, including without
+limitation the rights to use, copy, modify, merge, publish, distribute, and/or
+sell copies of the Data Files or Software, and to permit persons to whom the
+Data Files or Software are furnished to do so, provided that (a) the above
+copyright notice(s) and this permission notice appear with all copies of the
+Data Files or Software, (b) both the above copyright notice(s) and this
+permission notice appear in associated documentation, and (c) there is clear
+notice in each modified Data File or in the Software as well as in the
+documentation associated with the Data File(s) or Software that the data or
+software has been modified.
+
+THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD
+PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN
+THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
+DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE
+DATA FILES OR SOFTWARE.
+
+Except as contained in this notice, the name of a copyright holder shall not
+be used in advertising or otherwise to promote the sale, use or other dealings
+in these Data Files or Software without prior written authorization of the
+copyright holder.
+
+Unicode and the Unicode logo are trademarks of Unicode, Inc. in the United
+States and other countries. All third party trademarks referenced herein are
+the property of their respective owners.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to UPX v3.01, which may be included
+with JRE 8 on Windows.
+
+--- begin of LICENSE ---
+
+Use of any of this software is governed by the terms of the license below:
+
+
+ ooooo ooo ooooooooo. ooooooo ooooo
+ `888' `8' `888 `Y88. `8888 d8'
+ 888 8 888 .d88' Y888..8P
+ 888 8 888ooo88P' `8888'
+ 888 8 888 .8PY888.
+ `88. .8' 888 d8' `888b
+ `YbodP' o888o o888o o88888o
+
+
+ The Ultimate Packer for eXecutables
+ Copyright (c) 1996-2000 Markus Oberhumer & Laszlo Molnar
+ http://wildsau.idv.uni-linz.ac.at/mfx/upx.html
+ http://www.nexus.hu/upx
+ http://upx.tsx.org
+
+
+PLEASE CAREFULLY READ THIS LICENSE AGREEMENT, ESPECIALLY IF YOU PLAN
+TO MODIFY THE UPX SOURCE CODE OR USE A MODIFIED UPX VERSION.
+
+
+ABSTRACT
+========
+
+ UPX and UCL are copyrighted software distributed under the terms
+ of the GNU General Public License (hereinafter the "GPL").
+
+ The stub which is imbedded in each UPX compressed program is part
+ of UPX and UCL, and contains code that is under our copyright. The
+ terms of the GNU General Public License still apply as compressing
+ a program is a special form of linking with our stub.
+
+ As a special exception we grant the free usage of UPX for all
+ executables, including commercial programs.
+ See below for details and restrictions.
+
+
+COPYRIGHT
+=========
+
+ UPX and UCL are copyrighted software. All rights remain with the authors.
+
+ UPX is Copyright (C) 1996-2000 Markus Franz Xaver Johannes Oberhumer
+ UPX is Copyright (C) 1996-2000 Laszlo Molnar
+
+ UCL is Copyright (C) 1996-2000 Markus Franz Xaver Johannes Oberhumer
+
+
+GNU GENERAL PUBLIC LICENSE
+==========================
+
+ UPX and the UCL library are free software; you can redistribute them
+ and/or modify them under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of
+ the License, or (at your option) any later version.
+
+ UPX and UCL are distributed in the hope that they will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING.
+
+
+SPECIAL EXCEPTION FOR COMPRESSED EXECUTABLES
+============================================
+
+ The stub which is imbedded in each UPX compressed program is part
+ of UPX and UCL, and contains code that is under our copyright. The
+ terms of the GNU General Public License still apply as compressing
+ a program is a special form of linking with our stub.
+
+ Hereby Markus F.X.J. Oberhumer and Laszlo Molnar grant you special
+ permission to freely use and distribute all UPX compressed programs
+ (including commercial ones), subject to the following restrictions:
+
+ 1. You must compress your program with a completely unmodified UPX
+ version; either with our precompiled version, or (at your option)
+ with a self compiled version of the unmodified UPX sources as
+ distributed by us.
+ 2. This also implies that the UPX stub must be completely unmodfied, i.e.
+ the stub imbedded in your compressed program must be byte-identical
+ to the stub that is produced by the official unmodified UPX version.
+ 3. The decompressor and any other code from the stub must exclusively get
+ used by the unmodified UPX stub for decompressing your program at
+ program startup. No portion of the stub may get read, copied,
+ called or otherwise get used or accessed by your program.
+
+
+ANNOTATIONS
+===========
+
+ - You can use a modified UPX version or modified UPX stub only for
+ programs that are compatible with the GNU General Public License.
+
+ - We grant you special permission to freely use and distribute all UPX
+ compressed programs. But any modification of the UPX stub (such as,
+ but not limited to, removing our copyright string or making your
+ program non-decompressible) will immediately revoke your right to
+ use and distribute a UPX compressed program.
+
+ - UPX is not a software protection tool; by requiring that you use
+ the unmodified UPX version for your proprietary programs we
+ make sure that any user can decompress your program. This protects
+ both you and your users as nobody can hide malicious code -
+ any program that cannot be decompressed is highly suspicious
+ by definition.
+
+ - You can integrate all or part of UPX and UCL into projects that
+ are compatible with the GNU GPL, but obviously you cannot grant
+ any special exceptions beyond the GPL for our code in your project.
+
+ - We want to actively support manufacturers of virus scanners and
+ similar security software. Please contact us if you would like to
+ incorporate parts of UPX or UCL into such a product.
+
+
+
+Markus F.X.J. Oberhumer Laszlo Molnar
+markus.oberhumer@jk.uni-linz.ac.at ml1050@cdata.tvnet.hu
+
+Linz, Austria, 25 Feb 2000
+
+Additional License(s)
+
+The UPX license file is at http://upx.sourceforge.net/upx-license.html.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to Xfree86-VidMode Extension 1.0,
+which may be included with JRE 8, JDK 8, and OpenJDK 8 on Linux and Solaris.
+
+--- begin of LICENSE ---
+
+Version 1.1 of XFree86 ProjectLicence.
+
+Copyright (C) 1994-2004 The XFree86 Project, Inc. All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicence, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so,subject to the following conditions:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice,this list of conditions, and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution, and in the same place
+ and form as other copyright, license and disclaimer information.
+
+ 3. The end-user documentation included with the redistribution, if any,must
+ include the following acknowledgment: "This product includes
+ software developed by The XFree86 Project, Inc (http://www.xfree86.org/) and
+ its contributors", in the same place and form as other third-party
+ acknowledgments. Alternately, this acknowledgment may appear in the software
+ itself, in the same form and location as other such third-party
+ acknowledgments.
+
+ 4. Except as contained in this notice, the name of The XFree86 Project,Inc
+ shall not be used in advertising or otherwise to promote the sale, use
+ or other dealings in this Software without prior written authorization from
+ The XFree86 Project, Inc.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+ EVENT SHALL THE XFREE86 PROJECT, INC OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL,SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO,PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ DAMAGE.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to X Window System 6.8.2, which may be
+included with JRE 8, JDK 8, and OpenJDK 8 on Linux and Solaris.
+
+--- begin of LICENSE ---
+
+ Licenses
+The X.Org Foundation March 2004
+
+1. Introduction
+
+The X.org Foundation X Window System distribution is a compilation of code and
+documentation from many sources. This document is intended primarily as a
+guide to the licenses used in the distribution: you must check each file
+and/or package for precise redistribution terms. None-the-less, this summary
+may be useful to many users. No software incorporating the XFree86 1.1 license
+has been incorporated.
+
+This document is based on the compilation from XFree86.
+
+2. XFree86 License
+
+XFree86 code without an explicit copyright is covered by the following
+copyright/license:
+
+Copyright (C) 1994-2003 The XFree86 Project, Inc. All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the XFree86 Project shall not
+be used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from the XFree86 Project.
+
+3. Other Licenses
+
+Portions of code are covered by the following licenses/copyrights. See
+individual files for the copyright dates.
+
+3.1. X/MIT Copyrights
+
+3.1.1. X Consortium
+
+Copyright (C) <date> X Consortium
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE X
+CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the X Consortium shall not be
+used in advertising or otherwise to promote the sale, use or other dealings in
+this Software without prior written authorization from the X Consortium.
+
+X Window System is a trademark of X Consortium, Inc.
+
+3.1.2. The Open Group
+
+Copyright <date> The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that the
+above copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings in
+this Software without prior written authorization from The Open Group. 3.2.
+Berkeley-based copyrights:
+
+o
+3.2.1. General
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ 3. The name of the author may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE. 3.2.2. UCB/LBL
+
+Copyright (c) 1993 The Regents of the University of California. All rights
+reserved.
+
+This software was developed by the Computer Systems Engineering group at
+Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and contributed to
+Berkeley.
+
+All advertising materials mentioning features or use of this software must
+display the following acknowledgement: This product includes software
+developed by the University of California, Lawrence Berkeley Laboratory.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ 3. All advertising materials mentioning features or use of this software
+ must display the following acknowledgement: This product includes software
+ developed by the University of California, Berkeley and its contributors.
+
+ 4. Neither the name of the University nor the names of its contributors may
+ be used to endorse or promote products derived from this software without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3.2.3. The
+NetBSD Foundation, Inc.
+
+Copyright (c) 2003 The NetBSD Foundation, Inc. All rights reserved.
+
+This code is derived from software contributed to The NetBSD Foundation by Ben
+Collver <collver1@attbi.com>
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ 3. All advertising materials mentioning features or use of this software
+ must display the following acknowledgement: This product includes software
+ developed by the NetBSD Foundation, Inc. and its contributors.
+
+ 4. Neither the name of The NetBSD Foundation nor the names of its
+ contributors may be used to endorse or promote products derived from this
+ software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS ``AS
+IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3.2.4. Theodore
+Ts'o.
+
+Copyright Theodore Ts'o, 1994, 1995, 1996, 1997, 1998, 1999. All rights
+reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ and the entire permission notice in its entirety, including the disclaimer
+ of warranties.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ 3. he name of the author may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE, ALL OF WHICH ARE HEREBY DISCLAIMED. IN NO
+EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE. 3.2.5. Theo de Raadt and Damien Miller
+
+Copyright (c) 1995,1999 Theo de Raadt. All rights reserved. Copyright (c)
+2001-2002 Damien Miller. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE. 3.2.6. Todd C. Miller
+
+Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+
+Permission to use, copy, modify, and distribute this software for any purpose
+with or without fee is hereby granted, provided that the above copyright
+notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND TODD C. MILLER DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL TODD C. MILLER BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 3.2.7. Thomas
+Winischhofer
+
+Copyright (C) 2001-2004 Thomas Winischhofer
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ 3. The name of the author may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE. 3.3. NVIDIA Corp
+
+Copyright (c) 1996 NVIDIA, Corp. All rights reserved.
+
+NOTICE TO USER: The source code is copyrighted under U.S. and international
+laws. NVIDIA, Corp. of Sunnyvale, California owns the copyright and as design
+patents pending on the design and interface of the NV chips. Users and
+possessors of this source code are hereby granted a nonexclusive, royalty-free
+copyright and design patent license to use this code in individual and
+commercial software.
+
+Any use of this source code must include, in the user documentation and
+internal comments to the code, notices to the end user as follows:
+
+Copyright (c) 1996 NVIDIA, Corp. NVIDIA design patents pending in the U.S. and
+foreign countries.
+
+NVIDIA, CORP. MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE
+CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED
+WARRANTY OF ANY KIND. NVIDIA, CORP. DISCLAIMS ALL WARRANTIES WITH REGARD TO
+THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA, CORP. BE LIABLE
+FOR ANY SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, OR ANY
+DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. 3.4. GLX Public
+License
+
+GLX PUBLIC LICENSE (Version 1.0 (2/11/99)) ("License")
+
+Subject to any third party claims, Silicon Graphics, Inc. ("SGI") hereby
+grants permission to Recipient (defined below), under Recipient's copyrights
+in the Original Software (defined below), to use, copy, modify, merge,
+publish, distribute, sublicense and/or sell copies of Subject Software
+(defined below), and to permit persons to whom the Subject Software is
+furnished in accordance with this License to do the same, subject to all of
+the following terms and conditions, which Recipient accepts by engaging in any
+such use, copying, modifying, merging, publishing, distributing, sublicensing
+or selling:
+
+1. Definitions.
+
+ (a) "Original Software" means source code of computer software code which
+ is described in Exhibit A as Original Software.
+
+ (b) "Modifications" means any addition to or deletion from the substance
+ or structure of either the Original Software or any previous
+ Modifications. When Subject Software is released as a series of files, a
+ Modification means (i) any addition to or deletion from the contents of a
+ file containing Original Software or previous Modifications and (ii) any
+ new file that contains any part of the Original Code or previous
+ Modifications.
+
+ (c) "Subject Software" means the Original Software or Modifications or the
+ combination of the Original Software and Modifications, or portions of any
+ of the foregoing.
+
+ (d) "Recipient" means an individual or a legal entity exercising rights
+ under, and complying with all of the terms of, this License. For legal
+ entities, "Recipient" includes any entity which controls, is controlled
+ by, or is under common control with Recipient. For purposes of this
+ definition, "control" of an entity means (a) the power, direct or
+ indirect, to direct or manage such entity, or (b) ownership of fifty
+ percent (50%) or more of the outstanding shares or beneficial ownership of
+ such entity.
+
+2. Redistribution of Source Code Subject to These Terms. Redistributions of
+Subject Software in source code form must retain the notice set forth in
+Exhibit A, below, in every file. A copy of this License must be included in
+any documentation for such Subject Software where the recipients' rights
+relating to Subject Software are described. Recipient may distribute the
+source code version of Subject Software under a license of Recipient's choice,
+which may contain terms different from this License, provided that (i)
+Recipient is in compliance with the terms of this License, and (ii) the
+license terms include this Section 2 and Sections 3, 4, 7, 8, 10, 12 and 13 of
+this License, which terms may not be modified or superseded by any other terms
+of such license. If Recipient distributes the source code version under a
+different license Recipient must make it absolutely clear that any terms which
+differ from this License are offered by Recipient alone, not by SGI. Recipient
+hereby agrees to indemnify SGI for any liability incurred by SGI as a result
+of any such terms Recipient offers.
+
+3. Redistribution in Executable Form. The notice set forth in Exhibit A must
+be conspicuously included in any notice in an executable version of Subject
+Software, related documentation or collateral in which Recipient describes the
+user's rights relating to the Subject Software. Recipient may distribute the
+executable version of Subject Software under a license of Recipient's choice,
+which may contain terms different from this License, provided that (i)
+Recipient is in compliance with the terms of this License, and (ii) the
+license terms include this Section 3 and Sections 4, 7, 8, 10, 12 and 13 of
+this License, which terms may not be modified or superseded by any other terms
+of such license. If Recipient distributes the executable version under a
+different license Recipient must make it absolutely clear that any terms which
+differ from this License are offered by Recipient alone, not by SGI. Recipient
+hereby agrees to indemnify SGI for any liability incurred by SGI as a result
+of any such terms Recipient offers.
+
+4. Termination. This License and the rights granted hereunder will terminate
+automatically if Recipient fails to comply with terms herein and fails to cure
+such breach within 30 days of the breach. Any sublicense to the Subject
+Software which is properly granted shall survive any termination of this
+License absent termination by the terms of such sublicense. Provisions which,
+by their nature, must remain in effect beyond the termination of this License
+shall survive.
+
+5. No Trademark Rights. This License does not grant any rights to use any
+trade name, trademark or service mark whatsoever. No trade name, trademark or
+service mark of SGI may be used to endorse or promote products derived from
+the Subject Software without prior written permission of SGI.
+
+6. No Other Rights. This License does not grant any rights with respect to the
+OpenGL API or to any software or hardware implementation thereof or to any
+other software whatsoever, nor shall any other rights or licenses not
+expressly granted hereunder arise by implication, estoppel or otherwise with
+respect to the Subject Software. Title to and ownership of the Original
+Software at all times remains with SGI. All rights in the Original Software
+not expressly granted under this License are reserved.
+
+7. Compliance with Laws; Non-Infringement. Recipient shall comply with all
+applicable laws and regulations in connection with use and distribution of the
+Subject Software, including but not limited to, all export and import control
+laws and regulations of the U.S. government and other countries. Recipient may
+not distribute Subject Software that (i) in any way infringes (directly or
+contributorily) the rights (including patent, copyright, trade secret,
+trademark or other intellectual property rights of any kind) of any other
+person or entity or (ii) breaches any representation or warranty, express,
+implied or statutory, which under any applicable law it might be deemed to
+have been distributed.
+
+8. Claims of Infringement. If Recipient at any time has knowledge of any one
+or more third party claims that reproduction, modification, use, distribution,
+import or sale of Subject Software (including particular functionality or code
+incorporated in Subject Software) infringes the third party's intellectual
+property rights, Recipient must place in a well-identified web page bearing
+the title "LEGAL" a description of each such claim and a description of the
+party making each such claim in sufficient detail that a user of the Subject
+Software will know whom to contact regarding the claim. Also, upon gaining
+such knowledge of any such claim, Recipient must conspicuously include the URL
+for such web page in the Exhibit A notice required under Sections 2 and 3,
+above, and in the text of any related documentation, license agreement or
+collateral in which Recipient describes end user's rights relating to the
+Subject Software. If Recipient obtains such knowledge after it makes Subject
+Software available to any other person or entity, Recipient shall take other
+steps (such as notifying appropriate mailing lists or newsgroups) reasonably
+calculated to inform those who received the Subject Software that new
+knowledge has been obtained.
+
+9. DISCLAIMER OF WARRANTY. SUBJECT SOFTWARE IS PROVIDED ON AN "AS IS" BASIS,
+WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT
+LIMITATION, WARRANTIES THAT THE SUBJECT SOFTWARE IS FREE OF DEFECTS,
+MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON- INFRINGING. SGI ASSUMES NO
+RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE. SHOULD ANY SOFTWARE
+PROVE DEFECTIVE IN ANY RESPECT, SGI ASSUMES NO COST OR LIABILITY FOR ANY
+SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN
+ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY SUBJECT SOFTWARE IS AUTHORIZED
+HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+10. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY,
+WHETHER TORT (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE OR STRICT LIABILITY),
+CONTRACT, OR OTHERWISE, SHALL SGI OR ANY SGI LICENSOR BE LIABLE FOR ANY
+DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
+CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK
+STOPPAGE, LOSS OF DATA, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
+COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF
+THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY
+TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SGI's NEGLIGENCE TO
+THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT
+ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
+THAT EXCLUSION AND LIMITATION MAY NOT APPLY TO RECIPIENT.
+
+11. Indemnity. Recipient shall be solely responsible for damages arising,
+directly or indirectly, out of its utilization of rights under this License.
+Recipient will defend, indemnify and hold harmless Silicon Graphics, Inc. from
+and against any loss, liability, damages, costs or expenses (including the
+payment of reasonable attorneys fees) arising out of Recipient's use,
+modification, reproduction and distribution of the Subject Software or out of
+any representation or warranty made by Recipient.
+
+12. U.S. Government End Users. The Subject Software is a "commercial item"
+consisting of "commercial computer software" as such terms are defined in
+title 48 of the Code of Federal Regulations and all U.S. Government End Users
+acquire only the rights set forth in this License and are subject to the terms
+of this License.
+
+13. Miscellaneous. This License represents the complete agreement concerning
+subject matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed so as to achieve as nearly as
+possible the same economic effect as the original provision and the remainder
+of this License will remain in effect. This License shall be governed by and
+construed in accordance with the laws of the United States and the State of
+California as applied to agreements entered into and to be performed entirely
+within California between California residents. Any litigation relating to
+this License shall be subject to the exclusive jurisdiction of the Federal
+Courts of the Northern District of California (or, absent subject matter
+jurisdiction in such courts, the courts of the State of California), with
+venue lying exclusively in Santa Clara County, California, with the losing
+party responsible for costs, including without limitation, court costs and
+reasonable attorneys fees and expenses. The application of the United Nations
+Convention on Contracts for the International Sale of Goods is expressly
+excluded. Any law or regulation which provides that the language of a contract
+shall be construed against the drafter shall not apply to this License.
+
+Exhibit A
+
+The contents of this file are subject to Sections 2, 3, 4, 7, 8, 10, 12 and 13
+of the GLX Public License Version 1.0 (the "License"). You may not use this
+file except in compliance with those sections of the License. You may obtain a
+copy of the License at Silicon Graphics, Inc., attn: Legal Services, 2011 N.
+Shoreline Blvd., Mountain View, CA 94043 or at
+http://www.sgi.com/software/opensource/glx/license.html.
+
+Software distributed under the License is distributed on an "AS IS" basis. ALL
+WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED
+WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF NON-
+INFRINGEMENT. See the License for the specific language governing rights and
+limitations under the License.
+
+The Original Software is GLX version 1.2 source code, released February, 1999.
+The developer of the Original Software is Silicon Graphics, Inc. Those
+portions of the Subject Software created by Silicon Graphics, Inc. are
+Copyright (c) 1991-9 Silicon Graphics, Inc. All Rights Reserved. 3.5. CID
+Font Code Public License
+
+CID FONT CODE PUBLIC LICENSE (Version 1.0 (3/31/99))("License")
+
+Subject to any applicable third party claims, Silicon Graphics, Inc. ("SGI")
+hereby grants permission to Recipient (defined below), under SGI's copyrights
+in the Original Software (defined below), to use, copy, modify, merge,
+publish, distribute, sublicense and/or sell copies of Subject Software
+(defined below) in both source code and executable form, and to permit persons
+to whom the Subject Software is furnished in accordance with this License to
+do the same, subject to all of the following terms and conditions, which
+Recipient accepts by engaging in any such use, copying, modifying, merging,
+publication, distributing, sublicensing or selling:
+
+1. Definitions.
+
+ a. "Original Software" means source code of computer software code that is
+ described in Exhibit A as Original Software.
+
+ b. "Modifications" means any addition to or deletion from the substance or
+ structure of either the Original Software or any previous Modifications.
+ When Subject Software is released as a series of files, a Modification
+ means (i) any addition to or deletion from the contents of a file
+ containing Original Software or previous Modifications and (ii) any new
+ file that contains any part of the Original Code or previous
+ Modifications.
+
+ c. "Subject Software" means the Original Software or Modifications or the
+ combination of the Original Software and Modifications, or portions of any
+ of the foregoing.
+
+ d. "Recipient" means an individual or a legal entity exercising rights
+ under the terms of this License. For legal entities, "Recipient" includes
+ any entity that controls, is controlled by, or is under common control
+ with Recipient. For purposes of this definition, "control" of an entity
+ means (i) the power, direct or indirect, to direct or manage such entity,
+ or (ii) ownership of fifty percent (50%) or more of the outstanding shares
+ or beneficial ownership of such entity.
+
+ e. "Required Notice" means the notice set forth in Exhibit A to this
+ License.
+
+ f. "Accompanying Technology" means any software or other technology that
+ is not a Modification and that is distributed or made publicly available
+ by Recipient with the Subject Software. Separate software files that do
+ not contain any Original Software or any previous Modification shall not
+ be deemed a Modification, even if such software files are aggregated as
+ part of a product, or in any medium of storage, with any file that does
+ contain Original Software or any previous Modification.
+
+2. License Terms. All distribution of the Subject Software must be made
+subject to the terms of this License. A copy of this License and the Required
+Notice must be included in any documentation for Subject Software where
+Recipient's rights relating to Subject Software and/or any Accompanying
+Technology are described. Distributions of Subject Software in source code
+form must also include the Required Notice in every file distributed. In
+addition, a ReadMe file entitled "Important Legal Notice" must be distributed
+with each distribution of one or more files that incorporate Subject Software.
+That file must be included with distributions made in both source code and
+executable form. A copy of the License and the Required Notice must be
+included in that file. Recipient may distribute Accompanying Technology under
+a license of Recipient's choice, which may contain terms different from this
+License, provided that (i) Recipient is in compliance with the terms of this
+License, (ii) such other license terms do not modify or supersede the terms of
+this License as applicable to the Subject Software, (iii) Recipient hereby
+indemnifies SGI for any liability incurred by SGI as a result of the
+distribution of Accompanying Technology or the use of other license terms.
+
+3. Termination. This License and the rights granted hereunder will terminate
+automatically if Recipient fails to comply with terms herein and fails to cure
+such breach within 30 days of the breach. Any sublicense to the Subject
+Software that is properly granted shall survive any termination of this
+License absent termination by the terms of such sublicense. Provisions which,
+by their nature, must remain in effect beyond the termination of this License
+shall survive.
+
+4. Trademark Rights. This License does not grant any rights to use any trade
+name, trademark or service mark whatsoever. No trade name, trademark or
+service mark of SGI may be used to endorse or promote products derived from or
+incorporating any Subject Software without prior written permission of SGI.
+
+5. No Other Rights. No rights or licenses not expressly granted hereunder
+shall arise by implication, estoppel or otherwise. Title to and ownership of
+the Original Software at all times remains with SGI. All rights in the
+Original Software not expressly granted under this License are reserved.
+
+6. Compliance with Laws; Non-Infringement. Recipient shall comply with all
+applicable laws and regulations in connection with use and distribution of the
+Subject Software, including but not limited to, all export and import control
+laws and regulations of the U.S. government and other countries. Recipient may
+not distribute Subject Software that (i) in any way infringes (directly or
+contributorily) the rights (including patent, copyright, trade secret,
+trademark or other intellectual property rights of any kind) of any other
+person or entity, or (ii) breaches any representation or warranty, express,
+implied or statutory, which under any applicable law it might be deemed to
+have been distributed.
+
+7. Claims of Infringement. If Recipient at any time has knowledge of any one
+or more third party claims that reproduction, modification, use, distribution,
+import or sale of Subject Software (including particular functionality or code
+incorporated in Subject Software) infringes the third party's intellectual
+property rights, Recipient must place in a well-identified web page bearing
+the title "LEGAL" a description of each such claim and a description of the
+party making each such claim in sufficient detail that a user of the Subject
+Software will know whom to contact regarding the claim. Also, upon gaining
+such knowledge of any such claim, Recipient must conspicuously include the URL
+for such web page in the Required Notice, and in the text of any related
+documentation, license agreement or collateral in which Recipient describes
+end user's rights relating to the Subject Software. If Recipient obtains such
+knowledge after it makes Subject Software available to any other person or
+entity, Recipient shall take other steps (such as notifying appropriate
+mailing lists or newsgroups) reasonably calculated to provide such knowledge
+to those who received the Subject Software.
+
+8. DISCLAIMER OF WARRANTY. SUBJECT SOFTWARE IS PROVIDED ON AN "AS IS" BASIS,
+WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT
+LIMITATION, WARRANTIES THAT THE SUBJECT SOFTWARE IS FREE OF DEFECTS,
+MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. SGI ASSUMES NO
+RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE. SHOULD ANY SOFTWARE
+PROVE DEFECTIVE IN ANY RESPECT, SGI ASSUMES NO COST OR LIABILITY FOR ANY
+SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN
+ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY SUBJECT SOFTWARE IS AUTHORIZED
+HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+9. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY,
+WHETHER TORT (INCLUDING, WITHOUT LIMITATION, NEGLIGENCE OR STRICT LIABILITY),
+CONTRACT, OR OTHERWISE, SHALL SGI OR ANY SGI LICENSOR BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SUBJECT SOFTWARE OR
+THE USE OR OTHER DEALINGS IN THE SUBJECT SOFTWARE. SOME JURISDICTIONS DO NOT
+ALLOW THE EXCLUSION OR LIMITATION OF CERTAIN DAMAGES, SO THIS EXCLUSION AND
+LIMITATION MAY NOT APPLY TO RECIPIENT TO THE EXTENT SO DISALLOWED.
+
+10. Indemnity. Recipient shall be solely responsible for damages arising,
+directly or indirectly, out of its utilization of rights under this License.
+Recipient will defend, indemnify and hold SGI and its successors and assigns
+harmless from and against any loss, liability, damages, costs or expenses
+(including the payment of reasonable attorneys fees) arising out of
+(Recipient's use, modification, reproduction and distribution of the Subject
+Software or out of any representation or warranty made by Recipient.
+
+11. U.S. Government End Users. The Subject Software is a "commercial item"
+consisting of "commercial computer software" as such terms are defined in
+title 48 of the Code of Federal Regulations and all U.S. Government End Users
+acquire only the rights set forth in this License and are subject to the terms
+of this License.
+
+12. Miscellaneous. This License represents the complete agreement concerning
+subject matter hereof. If any provision of this License is held to be
+unenforceable by any judicial or administrative authority having proper
+jurisdiction with respect thereto, such provision shall be reformed so as to
+achieve as nearly as possible the same economic effect as the original
+provision and the remainder of this License will remain in effect. This
+License shall be governed by and construed in accordance with the laws of the
+United States and the State of California as applied to agreements entered
+into and to be performed entirely within California between California
+residents. Any litigation relating to this License shall be subject to the
+exclusive jurisdiction of the Federal Courts of the Northern District of
+California (or, absent subject matter jurisdiction in such courts, the courts
+of the State of California), with venue lying exclusively in Santa Clara
+County, California, with the losing party responsible for costs, including
+without limitation, court costs and reasonable attorneys fees and expenses.
+The application of the United Nations Convention on Contracts for the
+International Sale of Goods is expressly excluded. Any law or regulation that
+provides that the language of a contract shall be construed against the
+drafter shall not apply to this License.
+
+Exhibit A
+
+Copyright (c) 1994-1999 Silicon Graphics, Inc.
+
+The contents of this file are subject to the CID Font Code Public License
+Version 1.0 (the "License"). You may not use this file except in compliance
+with the License. You may obtain a copy of the License at Silicon Graphics,
+Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA 94043
+or at http://www.sgi.com/software/opensource/cid/license.html
+
+Software distributed under the License is distributed on an "AS IS" basis. ALL
+WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED
+WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF
+NON-INFRINGEMENT. See the License for the specific language governing rights
+and limitations under the License.
+
+The Original Software (as defined in the License) is CID font code that was
+developed by Silicon Graphics, Inc. Those portions of the Subject Software (as
+defined in the License) that were created by Silicon Graphics, Inc. are
+Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved.
+
+[NOTE: When using this text in connection with Subject Software delivered
+solely in object code form, Recipient may replace the words "this file" with
+"this software" in both the first and second sentences.] 3.6. Bitstream Vera
+Fonts Copyright
+
+The fonts have a generous copyright, allowing derivative works (as long as
+"Bitstream" or "Vera" are not in the names), and full redistribution (so long
+as they are not *sold* by themselves). They can be be bundled, redistributed
+and sold with any software.
+
+The fonts are distributed under the following copyright:
+
+Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a
+trademark of Bitstream, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of the fonts accompanying this license ("Fonts") and associated documentation
+files (the "Font Software"), to reproduce and distribute the Font Software,
+including without limitation the rights to use, copy, merge, publish,
+distribute, and/or sell copies of the Font Software, and to permit persons to
+whom the Font Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright and trademark notices and this permission notice shall be
+included in all copies of one or more of the Font Software typefaces.
+
+The Font Software may be modified, altered, or added to, and in particular the
+designs of glyphs or characters in the Fonts may be modified and additional
+glyphs or characters may be added to the Fonts, only if the fonts are renamed
+to names not containing either the words "Bitstream" or the word "Vera".
+
+This License becomes null and void to the extent applicable to Fonts or Font
+Software that has been modified and is distributed under the "Bitstream Vera"
+names.
+
+The Font Software may be sold as part of a larger software package but no copy
+of one or more of the Font Software typefaces may be sold by itself.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION
+BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL,
+SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO
+USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
+
+Except as contained in this notice, the names of Gnome, the Gnome Foundation,
+and Bitstream Inc., shall not be used in advertising or otherwise to promote
+the sale, use or other dealings in this Font Software without prior written
+authorization from the Gnome Foundation or Bitstream Inc., respectively. For
+further information, contact: fonts at gnome dot org. 3.7. Bigelow & Holmes
+Inc and URW++ GmbH Luxi font license
+
+Luxi fonts copyright (c) 2001 by Bigelow & Holmes Inc. Luxi font instruction
+code copyright (c) 2001 by URW++ GmbH. All Rights Reserved. Luxi is a
+registered trademark of Bigelow & Holmes Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of these Fonts and associated documentation files (the "Font Software"), to
+deal in the Font Software, including without limitation the rights to use,
+copy, merge, publish, distribute, sublicense, and/or sell copies of the Font
+Software, and to permit persons to whom the Font Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright and trademark notices and this permission notice shall be
+included in all copies of one or more of the Font Software.
+
+The Font Software may not be modified, altered, or added to, and in particular
+the designs of glyphs or characters in the Fonts may not be modified nor may
+additional glyphs or characters be added to the Fonts. This License becomes
+null and void when the Fonts or Font Software have been modified.
+
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT,
+TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BIGELOW & HOLMES INC. OR URW++
+GMBH. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY
+GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR
+INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT
+SOFTWARE.
+
+Except as contained in this notice, the names of Bigelow & Holmes Inc. and
+URW++ GmbH. shall not be used in advertising or otherwise to promote the sale,
+use or other dealings in this Font Software without prior written
+authorization from Bigelow & Holmes Inc. and URW++ GmbH.
+
+For further information, contact:
+
+info@urwpp.de or design@bigelowandholmes.com
+
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to zlib v1.2.8, which may be included
+with JRE 8, JDK 8, and OpenJDK 8.
+
+--- begin of LICENSE ---
+
+ version 1.2.8, April 28th, 2013
+
+ Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jean-loup Gailly Mark Adler
+ jloup@gzip.org madler@alumni.caltech.edu
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
+%% This notice is provided with respect to the following which may be
+included with JRE 8, JDK 8, and OpenJDK 8.
+
+ Apache Commons Math 3.2
+ Apache Derby 10.11.1.2
+ Apache Jakarta BCEL 5.1
+ Apache Jakarta Regexp 1.4
+ Apache Santuario XML Security for Java 1.5.4
+ Apache Xalan-Java 2.7.1
+ Apache Xerces Java 2.10.0
+ Apache XML Resolver 1.1
+ Dynalink 0.5
+
+
+--- begin of LICENSE ---
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
+
+--- end of LICENSE ---
+
+-------------------------------------------------------------------------------
+
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/Welcome.html b/love2dToAPK/tools/tools/jdk-win/jre/Welcome.html
new file mode 100644
index 0000000..4553aec
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/Welcome.html
@@ -0,0 +1,28 @@
+<html>
+<head>
+<title>
+Welcome to the Java(TM) Platform
+</title>
+</head>
+<body>
+
+<h2>Welcome to the Java<SUP><FONT SIZE=-2>TM</FONT></SUP> Platform</h2>
+<p> Welcome to the Java<SUP><FONT SIZE=-2>TM</FONT></SUP> Standard Edition Runtime
+ Environment. This provides complete runtime support for Java applications.
+<p> The runtime environment includes the Java<SUP><FONT SIZE=-2>TM</FONT></SUP>
+ Plug-in product which supports the Java environment inside web browsers.
+<h3>References</h3>
+<p>
+See the <a href="http://download.oracle.com/javase/7/docs/technotes/guides/plugin/">Java Plug-in</a> product
+documentation for more information on using the Java Plug-in product.
+<p> See the <a href=
+"http://www.oracle.com/technetwork/java/javase/overview/"
+>Java Platform</a> web site for
+ more information on the Java Platform.
+<hr>
+<font size="-2">
+Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved.
+</font>
+<p>
+</body>
+</html>
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/accessibility.properties b/love2dToAPK/tools/tools/jdk-win/jre/lib/accessibility.properties
new file mode 100644
index 0000000..d9f12e3
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/accessibility.properties
@@ -0,0 +1,6 @@
+#
+# Load the Java Access Bridge class into the JVM
+#
+#assistive_technologies=com.sun.java.accessibility.AccessBridge
+#screen_magnifier_present=true
+
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/calendars.properties b/love2dToAPK/tools/tools/jdk-win/jre/lib/calendars.properties
new file mode 100644
index 0000000..87a8630
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/calendars.properties
@@ -0,0 +1,60 @@
+# Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+# ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+
+#
+# Japanese imperial calendar
+#
+# Meiji since 1868-01-01 00:00:00 local time (Gregorian)
+# Taisho since 1912-07-30 00:00:00 local time (Gregorian)
+# Showa since 1926-12-25 00:00:00 local time (Gregorian)
+# Heisei since 1989-01-08 00:00:00 local time (Gregorian)
+calendar.japanese.type: LocalGregorianCalendar
+calendar.japanese.eras: \
+ name=Meiji,abbr=M,since=-3218832000000; \
+ name=Taisho,abbr=T,since=-1812153600000; \
+ name=Showa,abbr=S,since=-1357603200000; \
+ name=Heisei,abbr=H,since=600220800000
+
+#
+# Taiwanese calendar
+# Minguo since 1911-01-01 00:00:00 local time (Gregorian)
+calendar.taiwanese.type: LocalGregorianCalendar
+calendar.taiwanese.eras: \
+ name=MinGuo,since=-1830384000000
+
+#
+# Thai Buddhist calendar
+# Buddhist Era since -542-01-01 00:00:00 local time (Gregorian)
+calendar.thai-buddhist.type: LocalGregorianCalendar
+calendar.thai-buddhist.eras: \
+ name=BuddhistEra,abbr=B.E.,since=-79302585600000
+calendar.thai-buddhist.year-boundary: \
+ day1=4-1,since=-79302585600000; \
+ day1=1-1,since=-915148800000
+
+#
+# Hijrah calendars
+#
+calendar.hijrah.Hijrah-umalqura: hijrah-config-umalqura.properties
+calendar.hijrah.Hijrah-umalqura.type: islamic-umalqura
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/charsets.jar b/love2dToAPK/tools/tools/jdk-win/jre/lib/charsets.jar
new file mode 100644
index 0000000..097db83
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/charsets.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/classlist b/love2dToAPK/tools/tools/jdk-win/jre/lib/classlist
new file mode 100644
index 0000000..debed79
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/classlist
@@ -0,0 +1,2378 @@
+com/sun/java/swing/SwingUtilities3
+com/sun/java/swing/plaf/windows/WindowsPopupWindow
+com/sun/java/swing/plaf/windows/WindowsTabbedPaneUI
+com/sun/swing/internal/plaf/basic/resources/basic
+com/sun/swing/internal/plaf/metal/resources/metal
+java/applet/Applet
+java/awt/AWTEvent
+java/awt/AWTEvent$1
+java/awt/AWTEventMulticaster
+java/awt/AWTKeyStroke
+java/awt/AWTKeyStroke$1
+java/awt/ActiveEvent
+java/awt/Adjustable
+java/awt/AlphaComposite
+java/awt/BasicStroke
+java/awt/BorderLayout
+java/awt/BufferCapabilities
+java/awt/Canvas
+java/awt/CardLayout
+java/awt/CardLayout$Card
+java/awt/Color
+java/awt/Component
+java/awt/Component$1
+java/awt/Component$3
+java/awt/Component$AWTTreeLock
+java/awt/Component$AccessibleAWTComponent
+java/awt/Component$BaselineResizeBehavior
+java/awt/Component$BltBufferStrategy
+java/awt/Component$BltSubRegionBufferStrategy
+java/awt/Component$DummyRequestFocusController
+java/awt/Component$FlipBufferStrategy
+java/awt/ComponentOrientation
+java/awt/Composite
+java/awt/Conditional
+java/awt/Container
+java/awt/Container$1
+java/awt/Container$AccessibleAWTContainer
+java/awt/ContainerOrderFocusTraversalPolicy
+java/awt/Cursor
+java/awt/Cursor$1
+java/awt/Cursor$CursorDisposer
+java/awt/DefaultFocusTraversalPolicy
+java/awt/DefaultKeyboardFocusManager
+java/awt/DefaultKeyboardFocusManager$1
+java/awt/DefaultKeyboardFocusManager$DefaultKeyboardFocusManagerSentEvent
+java/awt/DefaultKeyboardFocusManager$TypeAheadMarker
+java/awt/Dialog
+java/awt/Dialog$ModalExclusionType
+java/awt/Dialog$ModalityType
+java/awt/Dimension
+java/awt/Event
+java/awt/EventDispatchThread
+java/awt/EventDispatchThread$1
+java/awt/EventDispatchThread$HierarchyEventFilter
+java/awt/EventFilter
+java/awt/EventFilter$FilterAction
+java/awt/EventQueue
+java/awt/EventQueue$1
+java/awt/EventQueue$1AWTInvocationLock
+java/awt/EventQueue$2
+java/awt/EventQueue$3
+java/awt/EventQueue$4
+java/awt/EventQueue$5
+java/awt/FlowLayout
+java/awt/FocusTraversalPolicy
+java/awt/Font
+java/awt/Font$FontAccessImpl
+java/awt/FontMetrics
+java/awt/Frame
+java/awt/Frame$1
+java/awt/Graphics
+java/awt/Graphics2D
+java/awt/GraphicsCallback
+java/awt/GraphicsCallback$PaintCallback
+java/awt/GraphicsConfiguration
+java/awt/GraphicsDevice
+java/awt/GraphicsEnvironment
+java/awt/GraphicsEnvironment$1
+java/awt/GridLayout
+java/awt/Image
+java/awt/Image$1
+java/awt/ImageCapabilities
+java/awt/ImageMediaEntry
+java/awt/Insets
+java/awt/ItemSelectable
+java/awt/KeyEventDispatcher
+java/awt/KeyEventPostProcessor
+java/awt/KeyboardFocusManager
+java/awt/KeyboardFocusManager$1
+java/awt/KeyboardFocusManager$3
+java/awt/KeyboardFocusManager$HeavyweightFocusRequest
+java/awt/KeyboardFocusManager$LightweightFocusRequest
+java/awt/Label
+java/awt/LayoutManager
+java/awt/LayoutManager2
+java/awt/LightweightDispatcher
+java/awt/LightweightDispatcher$2
+java/awt/MediaEntry
+java/awt/MediaTracker
+java/awt/MenuBar
+java/awt/MenuComponent
+java/awt/MenuContainer
+java/awt/ModalEventFilter
+java/awt/Paint
+java/awt/Panel
+java/awt/Point
+java/awt/PrintGraphics
+java/awt/Queue
+java/awt/Rectangle
+java/awt/RenderingHints
+java/awt/RenderingHints$Key
+java/awt/SentEvent
+java/awt/SequencedEvent
+java/awt/SequencedEvent$1
+java/awt/Shape
+java/awt/SplashScreen
+java/awt/Stroke
+java/awt/Toolkit
+java/awt/Toolkit$1
+java/awt/Toolkit$2
+java/awt/Toolkit$3
+java/awt/Toolkit$4
+java/awt/Toolkit$5
+java/awt/Toolkit$DesktopPropertyChangeSupport
+java/awt/Toolkit$DesktopPropertyChangeSupport$1
+java/awt/Toolkit$SelectiveAWTEventListener
+java/awt/Toolkit$ToolkitEventMulticaster
+java/awt/Transparency
+java/awt/TrayIcon
+java/awt/VKCollection
+java/awt/Window
+java/awt/Window$1
+java/awt/Window$1DisposeAction
+java/awt/Window$Type
+java/awt/Window$WindowDisposerRecord
+java/awt/color/ColorSpace
+java/awt/color/ICC_ColorSpace
+java/awt/color/ICC_Profile
+java/awt/color/ICC_Profile$1
+java/awt/color/ICC_ProfileRGB
+java/awt/datatransfer/ClipboardOwner
+java/awt/datatransfer/FlavorMap
+java/awt/datatransfer/FlavorTable
+java/awt/datatransfer/SystemFlavorMap
+java/awt/dnd/DropTarget
+java/awt/dnd/DropTargetContext
+java/awt/dnd/DropTargetListener
+java/awt/dnd/peer/DragSourceContextPeer
+java/awt/dnd/peer/DropTargetPeer
+java/awt/event/AWTEventListener
+java/awt/event/AWTEventListenerProxy
+java/awt/event/ActionEvent
+java/awt/event/ActionListener
+java/awt/event/AdjustmentEvent
+java/awt/event/AdjustmentListener
+java/awt/event/ComponentAdapter
+java/awt/event/ComponentEvent
+java/awt/event/ComponentListener
+java/awt/event/ContainerEvent
+java/awt/event/ContainerListener
+java/awt/event/FocusAdapter
+java/awt/event/FocusEvent
+java/awt/event/FocusListener
+java/awt/event/HierarchyBoundsListener
+java/awt/event/HierarchyListener
+java/awt/event/InputEvent
+java/awt/event/InputEvent$1
+java/awt/event/InputMethodEvent
+java/awt/event/InputMethodListener
+java/awt/event/InvocationEvent
+java/awt/event/InvocationEvent$1
+java/awt/event/ItemEvent
+java/awt/event/ItemListener
+java/awt/event/KeyAdapter
+java/awt/event/KeyEvent
+java/awt/event/KeyEvent$1
+java/awt/event/KeyListener
+java/awt/event/MouseAdapter
+java/awt/event/MouseEvent
+java/awt/event/MouseListener
+java/awt/event/MouseMotionAdapter
+java/awt/event/MouseMotionListener
+java/awt/event/MouseWheelListener
+java/awt/event/NativeLibLoader
+java/awt/event/NativeLibLoader$1
+java/awt/event/PaintEvent
+java/awt/event/TextListener
+java/awt/event/WindowAdapter
+java/awt/event/WindowEvent
+java/awt/event/WindowFocusListener
+java/awt/event/WindowListener
+java/awt/event/WindowStateListener
+java/awt/font/FontRenderContext
+java/awt/font/GlyphVector
+java/awt/font/LineMetrics
+java/awt/font/TextAttribute
+java/awt/geom/AffineTransform
+java/awt/geom/Dimension2D
+java/awt/geom/GeneralPath
+java/awt/geom/Line2D
+java/awt/geom/Line2D$Float
+java/awt/geom/LineIterator
+java/awt/geom/Path2D
+java/awt/geom/Path2D$Float
+java/awt/geom/PathIterator
+java/awt/geom/Point2D
+java/awt/geom/Point2D$Float
+java/awt/geom/RectIterator
+java/awt/geom/Rectangle2D
+java/awt/geom/Rectangle2D$Float
+java/awt/geom/RectangularShape
+java/awt/im/InputContext
+java/awt/im/InputMethodRequests
+java/awt/im/spi/InputMethod
+java/awt/im/spi/InputMethodContext
+java/awt/im/spi/InputMethodDescriptor
+java/awt/image/BufferStrategy
+java/awt/image/BufferedImage
+java/awt/image/BufferedImage$1
+java/awt/image/ColorModel
+java/awt/image/ColorModel$1
+java/awt/image/ComponentSampleModel
+java/awt/image/DataBuffer
+java/awt/image/DataBuffer$1
+java/awt/image/DataBufferByte
+java/awt/image/DataBufferInt
+java/awt/image/DirectColorModel
+java/awt/image/FilteredImageSource
+java/awt/image/ImageConsumer
+java/awt/image/ImageFilter
+java/awt/image/ImageObserver
+java/awt/image/ImageProducer
+java/awt/image/IndexColorModel
+java/awt/image/PackedColorModel
+java/awt/image/PixelInterleavedSampleModel
+java/awt/image/RGBImageFilter
+java/awt/image/Raster
+java/awt/image/RenderedImage
+java/awt/image/SampleModel
+java/awt/image/SinglePixelPackedSampleModel
+java/awt/image/VolatileImage
+java/awt/image/WritableRaster
+java/awt/image/WritableRenderedImage
+java/awt/peer/CanvasPeer
+java/awt/peer/ComponentPeer
+java/awt/peer/ContainerPeer
+java/awt/peer/FontPeer
+java/awt/peer/FramePeer
+java/awt/peer/KeyboardFocusManagerPeer
+java/awt/peer/LabelPeer
+java/awt/peer/LightweightPeer
+java/awt/peer/PanelPeer
+java/awt/peer/WindowPeer
+java/awt/print/PrinterGraphics
+java/beans/ChangeListenerMap
+java/beans/PropertyChangeEvent
+java/beans/PropertyChangeListener
+java/beans/PropertyChangeListenerProxy
+java/beans/PropertyChangeSupport
+java/beans/PropertyChangeSupport$PropertyChangeListenerMap
+java/beans/VetoableChangeListener
+java/io/Bits
+java/io/BufferedInputStream
+java/io/BufferedOutputStream
+java/io/BufferedReader
+java/io/BufferedWriter
+java/io/ByteArrayInputStream
+java/io/ByteArrayOutputStream
+java/io/Closeable
+java/io/DataInput
+java/io/DataInputStream
+java/io/DataOutput
+java/io/DataOutputStream
+java/io/DefaultFileSystem
+java/io/EOFException
+java/io/ExpiringCache
+java/io/ExpiringCache$1
+java/io/ExpiringCache$Entry
+java/io/Externalizable
+java/io/File
+java/io/File$PathStatus
+java/io/FileDescriptor
+java/io/FileDescriptor$1
+java/io/FileInputStream
+java/io/FileInputStream$1
+java/io/FileNotFoundException
+java/io/FileOutputStream
+java/io/FileOutputStream$1
+java/io/FilePermission
+java/io/FilePermission$1
+java/io/FilePermissionCollection
+java/io/FileReader
+java/io/FileSystem
+java/io/FileWriter
+java/io/FilenameFilter
+java/io/FilterInputStream
+java/io/FilterOutputStream
+java/io/FilterReader
+java/io/Flushable
+java/io/IOException
+java/io/InputStream
+java/io/InputStreamReader
+java/io/InterruptedIOException
+java/io/ObjectInput
+java/io/ObjectInputStream
+java/io/ObjectInputStream$BlockDataInputStream
+java/io/ObjectInputStream$GetField
+java/io/ObjectInputStream$GetFieldImpl
+java/io/ObjectInputStream$HandleTable
+java/io/ObjectInputStream$HandleTable$HandleList
+java/io/ObjectInputStream$PeekInputStream
+java/io/ObjectInputStream$ValidationList
+java/io/ObjectOutput
+java/io/ObjectOutputStream
+java/io/ObjectOutputStream$BlockDataOutputStream
+java/io/ObjectOutputStream$HandleTable
+java/io/ObjectOutputStream$ReplaceTable
+java/io/ObjectStreamClass
+java/io/ObjectStreamClass$1
+java/io/ObjectStreamClass$2
+java/io/ObjectStreamClass$3
+java/io/ObjectStreamClass$4
+java/io/ObjectStreamClass$5
+java/io/ObjectStreamClass$Caches
+java/io/ObjectStreamClass$ClassDataSlot
+java/io/ObjectStreamClass$EntryFuture
+java/io/ObjectStreamClass$ExceptionInfo
+java/io/ObjectStreamClass$FieldReflector
+java/io/ObjectStreamClass$FieldReflectorKey
+java/io/ObjectStreamClass$MemberSignature
+java/io/ObjectStreamClass$WeakClassKey
+java/io/ObjectStreamConstants
+java/io/ObjectStreamField
+java/io/OutputStream
+java/io/OutputStreamWriter
+java/io/PrintStream
+java/io/PushbackInputStream
+java/io/RandomAccessFile
+java/io/RandomAccessFile$1
+java/io/Reader
+java/io/SerialCallbackContext
+java/io/Serializable
+java/io/StringReader
+java/io/StringWriter
+java/io/UnsupportedEncodingException
+java/io/WinNTFileSystem
+java/io/Writer
+java/lang/AbstractStringBuilder
+java/lang/Appendable
+java/lang/ApplicationShutdownHooks
+java/lang/ApplicationShutdownHooks$1
+java/lang/ArithmeticException
+java/lang/ArrayIndexOutOfBoundsException
+java/lang/ArrayStoreException
+java/lang/AutoCloseable
+java/lang/Boolean
+java/lang/BootstrapMethodError
+java/lang/Byte
+java/lang/CharSequence
+java/lang/Character
+java/lang/Character$CharacterCache
+java/lang/CharacterData
+java/lang/CharacterData00
+java/lang/CharacterDataLatin1
+java/lang/Class
+java/lang/Class$1
+java/lang/Class$3
+java/lang/Class$4
+java/lang/Class$AnnotationData
+java/lang/Class$Atomic
+java/lang/Class$ReflectionData
+java/lang/ClassCastException
+java/lang/ClassFormatError
+java/lang/ClassLoader
+java/lang/ClassLoader$2
+java/lang/ClassLoader$3
+java/lang/ClassLoader$NativeLibrary
+java/lang/ClassLoader$ParallelLoaders
+java/lang/ClassLoaderHelper
+java/lang/ClassNotFoundException
+java/lang/ClassValue$ClassValueMap
+java/lang/CloneNotSupportedException
+java/lang/Cloneable
+java/lang/Comparable
+java/lang/Compiler
+java/lang/Compiler$1
+java/lang/Double
+java/lang/Enum
+java/lang/Error
+java/lang/Exception
+java/lang/ExceptionInInitializerError
+java/lang/Float
+java/lang/IllegalAccessError
+java/lang/IllegalAccessException
+java/lang/IllegalArgumentException
+java/lang/IllegalMonitorStateException
+java/lang/IllegalStateException
+java/lang/IncompatibleClassChangeError
+java/lang/IndexOutOfBoundsException
+java/lang/InheritableThreadLocal
+java/lang/InstantiationException
+java/lang/Integer
+java/lang/Integer$IntegerCache
+java/lang/InternalError
+java/lang/InterruptedException
+java/lang/Iterable
+java/lang/LinkageError
+java/lang/Long
+java/lang/Long$LongCache
+java/lang/Math
+java/lang/NoClassDefFoundError
+java/lang/NoSuchFieldException
+java/lang/NoSuchMethodError
+java/lang/NoSuchMethodException
+java/lang/NullPointerException
+java/lang/Number
+java/lang/NumberFormatException
+java/lang/Object
+java/lang/OutOfMemoryError
+java/lang/Package
+java/lang/ProcessEnvironment
+java/lang/ProcessEnvironment$CheckedEntry
+java/lang/ProcessEnvironment$CheckedEntrySet
+java/lang/ProcessEnvironment$CheckedEntrySet$1
+java/lang/ProcessEnvironment$EntryComparator
+java/lang/ProcessEnvironment$NameComparator
+java/lang/Readable
+java/lang/ReflectiveOperationException
+java/lang/Runnable
+java/lang/Runtime
+java/lang/RuntimeException
+java/lang/RuntimePermission
+java/lang/SecurityException
+java/lang/SecurityManager
+java/lang/Short
+java/lang/Short$ShortCache
+java/lang/Shutdown
+java/lang/Shutdown$Lock
+java/lang/StackOverflowError
+java/lang/StackTraceElement
+java/lang/StrictMath
+java/lang/String
+java/lang/String$CaseInsensitiveComparator
+java/lang/StringBuffer
+java/lang/StringBuilder
+java/lang/StringCoding
+java/lang/StringCoding$StringDecoder
+java/lang/StringCoding$StringEncoder
+java/lang/StringIndexOutOfBoundsException
+java/lang/System
+java/lang/System$2
+java/lang/SystemClassLoaderAction
+java/lang/Terminator
+java/lang/Terminator$1
+java/lang/Thread
+java/lang/Thread$State
+java/lang/Thread$UncaughtExceptionHandler
+java/lang/ThreadDeath
+java/lang/ThreadGroup
+java/lang/ThreadLocal
+java/lang/ThreadLocal$ThreadLocalMap
+java/lang/ThreadLocal$ThreadLocalMap$Entry
+java/lang/Throwable
+java/lang/Throwable$PrintStreamOrWriter
+java/lang/Throwable$WrappedPrintStream
+java/lang/UnsatisfiedLinkError
+java/lang/UnsupportedOperationException
+java/lang/VirtualMachineError
+java/lang/Void
+java/lang/annotation/Annotation
+java/lang/invoke/CallSite
+java/lang/invoke/ConstantCallSite
+java/lang/invoke/DirectMethodHandle
+java/lang/invoke/Invokers
+java/lang/invoke/LambdaForm
+java/lang/invoke/LambdaForm$NamedFunction
+java/lang/invoke/MemberName
+java/lang/invoke/MemberName$Factory
+java/lang/invoke/MethodHandle
+java/lang/invoke/MethodHandleImpl
+java/lang/invoke/MethodHandleNatives
+java/lang/invoke/MethodHandleStatics
+java/lang/invoke/MethodHandleStatics$1
+java/lang/invoke/MethodType
+java/lang/invoke/MethodType$ConcurrentWeakInternSet
+java/lang/invoke/MethodType$ConcurrentWeakInternSet$WeakEntry
+java/lang/invoke/MethodTypeForm
+java/lang/invoke/MutableCallSite
+java/lang/invoke/VolatileCallSite
+java/lang/ref/FinalReference
+java/lang/ref/Finalizer
+java/lang/ref/Finalizer$FinalizerThread
+java/lang/ref/PhantomReference
+java/lang/ref/Reference
+java/lang/ref/Reference$Lock
+java/lang/ref/Reference$ReferenceHandler
+java/lang/ref/ReferenceQueue
+java/lang/ref/ReferenceQueue$Lock
+java/lang/ref/ReferenceQueue$Null
+java/lang/ref/SoftReference
+java/lang/ref/WeakReference
+java/lang/reflect/AccessibleObject
+java/lang/reflect/AnnotatedElement
+java/lang/reflect/Array
+java/lang/reflect/Constructor
+java/lang/reflect/Executable
+java/lang/reflect/Field
+java/lang/reflect/GenericDeclaration
+java/lang/reflect/InvocationHandler
+java/lang/reflect/InvocationTargetException
+java/lang/reflect/Member
+java/lang/reflect/Method
+java/lang/reflect/Modifier
+java/lang/reflect/Parameter
+java/lang/reflect/Proxy
+java/lang/reflect/Proxy$KeyFactory
+java/lang/reflect/Proxy$ProxyClassFactory
+java/lang/reflect/ReflectAccess
+java/lang/reflect/ReflectPermission
+java/lang/reflect/Type
+java/lang/reflect/WeakCache
+java/math/BigInteger
+java/math/BigInteger$UnsafeHolder
+java/math/MutableBigInteger
+java/math/RoundingMode
+java/math/SignedMutableBigInteger
+java/net/AbstractPlainDatagramSocketImpl
+java/net/AbstractPlainDatagramSocketImpl$1
+java/net/AbstractPlainSocketImpl
+java/net/AbstractPlainSocketImpl$1
+java/net/Authenticator
+java/net/BindException
+java/net/ConnectException
+java/net/DatagramPacket
+java/net/DatagramPacket$1
+java/net/DatagramSocket
+java/net/DatagramSocket$1
+java/net/DatagramSocketImpl
+java/net/DefaultDatagramSocketImplFactory$1
+java/net/DefaultInterface
+java/net/DualStackPlainDatagramSocketImpl
+java/net/DualStackPlainSocketImpl
+java/net/FileNameMap
+java/net/HttpURLConnection
+java/net/Inet4Address
+java/net/Inet4AddressImpl
+java/net/Inet6Address
+java/net/Inet6Address$Inet6AddressHolder
+java/net/Inet6AddressImpl
+java/net/InetAddress
+java/net/InetAddress$1
+java/net/InetAddress$2
+java/net/InetAddress$Cache
+java/net/InetAddress$Cache$Type
+java/net/InetAddress$CacheEntry
+java/net/InetAddress$InetAddressHolder
+java/net/InetAddressImpl
+java/net/InetAddressImplFactory
+java/net/InetSocketAddress
+java/net/InetSocketAddress$InetSocketAddressHolder
+java/net/InterfaceAddress
+java/net/JarURLConnection
+java/net/MalformedURLException
+java/net/MulticastSocket
+java/net/NetworkInterface
+java/net/NetworkInterface$1
+java/net/NoRouteToHostException
+java/net/Parts
+java/net/PlainSocketImpl
+java/net/PlainSocketImpl$1
+java/net/Proxy
+java/net/Proxy$Type
+java/net/ProxySelector
+java/net/ServerSocket
+java/net/Socket
+java/net/SocketAddress
+java/net/SocketException
+java/net/SocketImpl
+java/net/SocketImplFactory
+java/net/SocketOptions
+java/net/SocketTimeoutException
+java/net/SocksConsts
+java/net/SocksSocketImpl
+java/net/SocksSocketImpl$3
+java/net/TwoStacksPlainDatagramSocketImpl
+java/net/URI
+java/net/URI$Parser
+java/net/URL
+java/net/URLClassLoader
+java/net/URLClassLoader$1
+java/net/URLClassLoader$2
+java/net/URLClassLoader$3
+java/net/URLClassLoader$3$1
+java/net/URLClassLoader$7
+java/net/URLConnection
+java/net/URLConnection$1
+java/net/URLStreamHandler
+java/net/URLStreamHandlerFactory
+java/net/UnknownHostException
+java/nio/Bits
+java/nio/Bits$1
+java/nio/Buffer
+java/nio/ByteBuffer
+java/nio/ByteBufferAsCharBufferB
+java/nio/ByteBufferAsIntBufferB
+java/nio/ByteBufferAsShortBufferB
+java/nio/ByteOrder
+java/nio/CharBuffer
+java/nio/DirectByteBuffer
+java/nio/DirectByteBuffer$Deallocator
+java/nio/DirectLongBufferU
+java/nio/HeapByteBuffer
+java/nio/HeapCharBuffer
+java/nio/IntBuffer
+java/nio/LongBuffer
+java/nio/MappedByteBuffer
+java/nio/ShortBuffer
+java/nio/channels/ByteChannel
+java/nio/channels/Channel
+java/nio/channels/FileChannel
+java/nio/channels/GatheringByteChannel
+java/nio/channels/InterruptibleChannel
+java/nio/channels/NetworkChannel
+java/nio/channels/ReadableByteChannel
+java/nio/channels/ScatteringByteChannel
+java/nio/channels/SeekableByteChannel
+java/nio/channels/SelectableChannel
+java/nio/channels/SocketChannel
+java/nio/channels/WritableByteChannel
+java/nio/channels/spi/AbstractInterruptibleChannel
+java/nio/channels/spi/AbstractInterruptibleChannel$1
+java/nio/channels/spi/AbstractSelectableChannel
+java/nio/charset/Charset
+java/nio/charset/CharsetDecoder
+java/nio/charset/CharsetEncoder
+java/nio/charset/CoderResult
+java/nio/charset/CoderResult$1
+java/nio/charset/CoderResult$2
+java/nio/charset/CoderResult$Cache
+java/nio/charset/CodingErrorAction
+java/nio/charset/StandardCharsets
+java/nio/charset/spi/CharsetProvider
+java/nio/file/Path
+java/nio/file/Watchable
+java/nio/file/attribute/FileAttribute
+java/security/AccessControlContext
+java/security/AccessController
+java/security/AlgorithmParameters
+java/security/AlgorithmParametersSpi
+java/security/AllPermission
+java/security/AllPermissionCollection
+java/security/BasicPermission
+java/security/BasicPermissionCollection
+java/security/CodeSigner
+java/security/CodeSource
+java/security/GeneralSecurityException
+java/security/Guard
+java/security/InvalidKeyException
+java/security/Key
+java/security/KeyException
+java/security/MessageDigest
+java/security/MessageDigest$Delegate
+java/security/MessageDigestSpi
+java/security/NoSuchAlgorithmException
+java/security/Permission
+java/security/PermissionCollection
+java/security/Permissions
+java/security/Principal
+java/security/PrivateKey
+java/security/PrivilegedAction
+java/security/PrivilegedActionException
+java/security/PrivilegedExceptionAction
+java/security/ProtectionDomain
+java/security/ProtectionDomain$1
+java/security/ProtectionDomain$3
+java/security/ProtectionDomain$Key
+java/security/Provider
+java/security/Provider$EngineDescription
+java/security/Provider$Service
+java/security/Provider$ServiceKey
+java/security/Provider$UString
+java/security/PublicKey
+java/security/SecureClassLoader
+java/security/Security
+java/security/Security$1
+java/security/Signature
+java/security/Signature$Delegate
+java/security/SignatureException
+java/security/SignatureSpi
+java/security/UnresolvedPermission
+java/security/cert/Certificate
+java/security/interfaces/DSAKey
+java/security/interfaces/DSAParams
+java/security/interfaces/DSAPrivateKey
+java/security/interfaces/DSAPublicKey
+java/security/spec/AlgorithmParameterSpec
+java/security/spec/DSAParameterSpec
+java/text/AttributedCharacterIterator$Attribute
+java/text/CharacterIterator
+java/text/Collator
+java/text/DateFormat
+java/text/DateFormat$Field
+java/text/DateFormatSymbols
+java/text/DecimalFormat
+java/text/DecimalFormatSymbols
+java/text/DigitList
+java/text/DontCareFieldPosition
+java/text/DontCareFieldPosition$1
+java/text/EntryPair
+java/text/FieldPosition
+java/text/Format
+java/text/Format$Field
+java/text/Format$FieldDelegate
+java/text/MergeCollation
+java/text/MessageFormat
+java/text/MessageFormat$Field
+java/text/NumberFormat
+java/text/NumberFormat$Field
+java/text/ParseException
+java/text/PatternEntry
+java/text/PatternEntry$Parser
+java/text/RBCollationTables
+java/text/RBCollationTables$BuildAPI
+java/text/RuleBasedCollator
+java/text/SimpleDateFormat
+java/text/spi/BreakIteratorProvider
+java/text/spi/CollatorProvider
+java/text/spi/DateFormatProvider
+java/text/spi/DateFormatSymbolsProvider
+java/text/spi/DecimalFormatSymbolsProvider
+java/text/spi/NumberFormatProvider
+java/util/AbstractCollection
+java/util/AbstractList
+java/util/AbstractList$Itr
+java/util/AbstractList$ListItr
+java/util/AbstractMap
+java/util/AbstractQueue
+java/util/AbstractSequentialList
+java/util/AbstractSet
+java/util/ArrayDeque
+java/util/ArrayList
+java/util/ArrayList$Itr
+java/util/ArrayList$ListItr
+java/util/ArrayList$SubList
+java/util/ArrayList$SubList$1
+java/util/Arrays
+java/util/Arrays$ArrayList
+java/util/Arrays$LegacyMergeSort
+java/util/BitSet
+java/util/Calendar
+java/util/Calendar$Builder
+java/util/Collection
+java/util/Collections
+java/util/Collections$3
+java/util/Collections$EmptyEnumeration
+java/util/Collections$EmptyIterator
+java/util/Collections$EmptyList
+java/util/Collections$EmptyMap
+java/util/Collections$EmptySet
+java/util/Collections$SetFromMap
+java/util/Collections$SynchronizedCollection
+java/util/Collections$SynchronizedMap
+java/util/Collections$SynchronizedSet
+java/util/Collections$UnmodifiableCollection
+java/util/Collections$UnmodifiableCollection$1
+java/util/Collections$UnmodifiableList
+java/util/Collections$UnmodifiableList$1
+java/util/Collections$UnmodifiableMap
+java/util/Collections$UnmodifiableRandomAccessList
+java/util/Collections$UnmodifiableSet
+java/util/ComparableTimSort
+java/util/Comparator
+java/util/Currency
+java/util/Currency$1
+java/util/Currency$CurrencyNameGetter
+java/util/Date
+java/util/Deque
+java/util/Dictionary
+java/util/Enumeration
+java/util/EventListener
+java/util/EventListenerProxy
+java/util/EventObject
+java/util/GregorianCalendar
+java/util/HashMap
+java/util/HashMap$EntryIterator
+java/util/HashMap$EntrySet
+java/util/HashMap$HashIterator
+java/util/HashMap$KeyIterator
+java/util/HashMap$KeySet
+java/util/HashMap$Node
+java/util/HashMap$TreeNode
+java/util/HashMap$ValueIterator
+java/util/HashMap$Values
+java/util/HashSet
+java/util/Hashtable
+java/util/Hashtable$Entry
+java/util/Hashtable$EntrySet
+java/util/Hashtable$Enumerator
+java/util/Hashtable$ValueCollection
+java/util/IdentityHashMap
+java/util/IdentityHashMap$IdentityHashMapIterator
+java/util/IdentityHashMap$KeyIterator
+java/util/IdentityHashMap$KeySet
+java/util/IdentityHashMap$ValueIterator
+java/util/IdentityHashMap$Values
+java/util/Iterator
+java/util/LinkedHashMap
+java/util/LinkedHashMap$Entry
+java/util/LinkedHashMap$LinkedEntryIterator
+java/util/LinkedHashMap$LinkedEntrySet
+java/util/LinkedHashMap$LinkedHashIterator
+java/util/LinkedHashMap$LinkedKeyIterator
+java/util/LinkedHashMap$LinkedKeySet
+java/util/LinkedList
+java/util/LinkedList$ListItr
+java/util/LinkedList$Node
+java/util/List
+java/util/ListIterator
+java/util/ListResourceBundle
+java/util/Locale
+java/util/Locale$1
+java/util/Locale$Cache
+java/util/Locale$Category
+java/util/Locale$LocaleKey
+java/util/Map
+java/util/Map$Entry
+java/util/MissingResourceException
+java/util/NavigableMap
+java/util/Objects
+java/util/PriorityQueue
+java/util/Properties
+java/util/Properties$LineReader
+java/util/PropertyResourceBundle
+java/util/Queue
+java/util/Random
+java/util/RandomAccess
+java/util/ResourceBundle
+java/util/ResourceBundle$1
+java/util/ResourceBundle$BundleReference
+java/util/ResourceBundle$CacheKey
+java/util/ResourceBundle$CacheKeyReference
+java/util/ResourceBundle$Control
+java/util/ResourceBundle$Control$1
+java/util/ResourceBundle$Control$CandidateListCache
+java/util/ResourceBundle$LoaderReference
+java/util/ResourceBundle$RBClassLoader
+java/util/ResourceBundle$RBClassLoader$1
+java/util/ResourceBundle$SingleFormatControl
+java/util/ServiceLoader
+java/util/ServiceLoader$1
+java/util/ServiceLoader$LazyIterator
+java/util/Set
+java/util/SortedMap
+java/util/Stack
+java/util/StringTokenizer
+java/util/TimSort
+java/util/TimeZone
+java/util/TimeZone$1
+java/util/TreeMap
+java/util/TreeMap$Entry
+java/util/Vector
+java/util/Vector$1
+java/util/Vector$Itr
+java/util/Vector$ListItr
+java/util/WeakHashMap
+java/util/WeakHashMap$Entry
+java/util/WeakHashMap$KeySet
+java/util/concurrent/BlockingQueue
+java/util/concurrent/ConcurrentHashMap
+java/util/concurrent/ConcurrentHashMap$BaseIterator
+java/util/concurrent/ConcurrentHashMap$CollectionView
+java/util/concurrent/ConcurrentHashMap$CounterCell
+java/util/concurrent/ConcurrentHashMap$EntrySetView
+java/util/concurrent/ConcurrentHashMap$ForwardingNode
+java/util/concurrent/ConcurrentHashMap$KeyIterator
+java/util/concurrent/ConcurrentHashMap$KeySetView
+java/util/concurrent/ConcurrentHashMap$Node
+java/util/concurrent/ConcurrentHashMap$Segment
+java/util/concurrent/ConcurrentHashMap$Traverser
+java/util/concurrent/ConcurrentHashMap$ValueIterator
+java/util/concurrent/ConcurrentHashMap$ValuesView
+java/util/concurrent/ConcurrentMap
+java/util/concurrent/CopyOnWriteArrayList
+java/util/concurrent/DelayQueue
+java/util/concurrent/Delayed
+java/util/concurrent/TimeUnit
+java/util/concurrent/TimeUnit$1
+java/util/concurrent/TimeUnit$2
+java/util/concurrent/TimeUnit$3
+java/util/concurrent/TimeUnit$4
+java/util/concurrent/TimeUnit$5
+java/util/concurrent/TimeUnit$6
+java/util/concurrent/TimeUnit$7
+java/util/concurrent/atomic/AtomicBoolean
+java/util/concurrent/atomic/AtomicInteger
+java/util/concurrent/atomic/AtomicLong
+java/util/concurrent/atomic/AtomicMarkableReference
+java/util/concurrent/atomic/AtomicMarkableReference$Pair
+java/util/concurrent/atomic/AtomicReferenceFieldUpdater
+java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl
+java/util/concurrent/atomic/AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl$1
+java/util/concurrent/locks/AbstractOwnableSynchronizer
+java/util/concurrent/locks/AbstractQueuedSynchronizer
+java/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject
+java/util/concurrent/locks/AbstractQueuedSynchronizer$Node
+java/util/concurrent/locks/Condition
+java/util/concurrent/locks/Lock
+java/util/concurrent/locks/LockSupport
+java/util/concurrent/locks/ReadWriteLock
+java/util/concurrent/locks/ReentrantLock
+java/util/concurrent/locks/ReentrantLock$NonfairSync
+java/util/concurrent/locks/ReentrantLock$Sync
+java/util/concurrent/locks/ReentrantReadWriteLock
+java/util/concurrent/locks/ReentrantReadWriteLock$NonfairSync
+java/util/concurrent/locks/ReentrantReadWriteLock$ReadLock
+java/util/concurrent/locks/ReentrantReadWriteLock$Sync
+java/util/concurrent/locks/ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter
+java/util/concurrent/locks/ReentrantReadWriteLock$WriteLock
+java/util/function/BiFunction
+java/util/jar/Attributes
+java/util/jar/Attributes$Name
+java/util/jar/JarEntry
+java/util/jar/JarFile
+java/util/jar/JarFile$JarEntryIterator
+java/util/jar/JarFile$JarFileEntry
+java/util/jar/JarVerifier
+java/util/jar/JarVerifier$3
+java/util/jar/JavaUtilJarAccessImpl
+java/util/jar/Manifest
+java/util/jar/Manifest$FastInputStream
+java/util/logging/Handler
+java/util/logging/Level
+java/util/logging/Level$KnownLevel
+java/util/logging/LogManager
+java/util/logging/LogManager$1
+java/util/logging/LogManager$2
+java/util/logging/LogManager$3
+java/util/logging/LogManager$5
+java/util/logging/LogManager$Cleaner
+java/util/logging/LogManager$LogNode
+java/util/logging/LogManager$LoggerContext
+java/util/logging/LogManager$LoggerContext$1
+java/util/logging/LogManager$LoggerWeakRef
+java/util/logging/LogManager$RootLogger
+java/util/logging/LogManager$SystemLoggerContext
+java/util/logging/Logger
+java/util/logging/Logger$1
+java/util/logging/LoggingPermission
+java/util/logging/LoggingProxyImpl
+java/util/spi/CalendarDataProvider
+java/util/spi/CurrencyNameProvider
+java/util/spi/LocaleNameProvider
+java/util/spi/LocaleServiceProvider
+java/util/spi/ResourceBundleControlProvider
+java/util/spi/TimeZoneNameProvider
+java/util/zip/CRC32
+java/util/zip/Checksum
+java/util/zip/DeflaterOutputStream
+java/util/zip/GZIPInputStream
+java/util/zip/Inflater
+java/util/zip/InflaterInputStream
+java/util/zip/ZStreamRef
+java/util/zip/ZipCoder
+java/util/zip/ZipConstants
+java/util/zip/ZipEntry
+java/util/zip/ZipFile
+java/util/zip/ZipFile$1
+java/util/zip/ZipFile$ZipEntryIterator
+java/util/zip/ZipFile$ZipFileInflaterInputStream
+java/util/zip/ZipFile$ZipFileInputStream
+java/util/zip/ZipInputStream
+java/util/zip/ZipUtils
+javax/accessibility/Accessible
+javax/accessibility/AccessibleAction
+javax/accessibility/AccessibleBundle
+javax/accessibility/AccessibleComponent
+javax/accessibility/AccessibleContext
+javax/accessibility/AccessibleExtendedComponent
+javax/accessibility/AccessibleRelationSet
+javax/accessibility/AccessibleState
+javax/accessibility/AccessibleText
+javax/accessibility/AccessibleValue
+javax/security/auth/Destroyable
+javax/sound/sampled/Control$Type
+javax/sound/sampled/DataLine
+javax/sound/sampled/DataLine$Info
+javax/sound/sampled/FloatControl$Type
+javax/sound/sampled/Line
+javax/sound/sampled/Line$Info
+javax/sound/sampled/LineUnavailableException
+javax/sound/sampled/UnsupportedAudioFileException
+javax/swing/AbstractAction
+javax/swing/AbstractButton
+javax/swing/AbstractButton$AccessibleAbstractButton
+javax/swing/AbstractButton$Handler
+javax/swing/AbstractCellEditor
+javax/swing/AbstractListModel
+javax/swing/Action
+javax/swing/ActionMap
+javax/swing/AncestorNotifier
+javax/swing/ArrayTable
+javax/swing/BorderFactory
+javax/swing/BoundedRangeModel
+javax/swing/Box
+javax/swing/Box$Filler
+javax/swing/BoxLayout
+javax/swing/BufferStrategyPaintManager
+javax/swing/BufferStrategyPaintManager$BufferInfo
+javax/swing/ButtonGroup
+javax/swing/ButtonModel
+javax/swing/CellEditor
+javax/swing/CellRendererPane
+javax/swing/ClientPropertyKey
+javax/swing/ClientPropertyKey$1
+javax/swing/ComboBoxEditor
+javax/swing/ComboBoxModel
+javax/swing/ComponentInputMap
+javax/swing/DefaultBoundedRangeModel
+javax/swing/DefaultButtonModel
+javax/swing/DefaultCellEditor
+javax/swing/DefaultCellEditor$1
+javax/swing/DefaultCellEditor$EditorDelegate
+javax/swing/DefaultComboBoxModel
+javax/swing/DefaultListCellRenderer
+javax/swing/DefaultListCellRenderer$UIResource
+javax/swing/DefaultListModel
+javax/swing/DefaultListSelectionModel
+javax/swing/DefaultSingleSelectionModel
+javax/swing/DropMode
+javax/swing/FocusManager
+javax/swing/GrayFilter
+javax/swing/Icon
+javax/swing/ImageIcon
+javax/swing/ImageIcon$1
+javax/swing/ImageIcon$2
+javax/swing/ImageIcon$2$1
+javax/swing/ImageIcon$3
+javax/swing/InputMap
+javax/swing/InternalFrameFocusTraversalPolicy
+javax/swing/JButton
+javax/swing/JCheckBox
+javax/swing/JCheckBoxMenuItem
+javax/swing/JCheckBoxMenuItem$AccessibleJCheckBoxMenuItem
+javax/swing/JComboBox
+javax/swing/JComboBox$1
+javax/swing/JComboBox$KeySelectionManager
+javax/swing/JComponent
+javax/swing/JComponent$1
+javax/swing/JComponent$2
+javax/swing/JComponent$AccessibleJComponent
+javax/swing/JDialog
+javax/swing/JEditorPane
+javax/swing/JFrame
+javax/swing/JInternalFrame
+javax/swing/JLabel
+javax/swing/JLayer
+javax/swing/JLayeredPane
+javax/swing/JList
+javax/swing/JList$3
+javax/swing/JList$ListSelectionHandler
+javax/swing/JMenu
+javax/swing/JMenu$MenuChangeListener
+javax/swing/JMenu$WinListener
+javax/swing/JMenuBar
+javax/swing/JMenuItem
+javax/swing/JMenuItem$AccessibleJMenuItem
+javax/swing/JMenuItem$MenuItemFocusListener
+javax/swing/JPanel
+javax/swing/JPopupMenu
+javax/swing/JPopupMenu$Separator
+javax/swing/JProgressBar
+javax/swing/JProgressBar$ModelListener
+javax/swing/JRadioButton
+javax/swing/JRadioButtonMenuItem
+javax/swing/JRootPane
+javax/swing/JRootPane$1
+javax/swing/JRootPane$RootLayout
+javax/swing/JScrollBar
+javax/swing/JScrollBar$ModelListener
+javax/swing/JScrollPane
+javax/swing/JScrollPane$ScrollBar
+javax/swing/JSeparator
+javax/swing/JSlider
+javax/swing/JSlider$ModelListener
+javax/swing/JSplitPane
+javax/swing/JTabbedPane
+javax/swing/JTabbedPane$ModelListener
+javax/swing/JTabbedPane$Page
+javax/swing/JTable
+javax/swing/JTable$2
+javax/swing/JTable$5
+javax/swing/JTable$Resizable2
+javax/swing/JTable$Resizable3
+javax/swing/JTextArea
+javax/swing/JTextField
+javax/swing/JTextField$NotifyAction
+javax/swing/JTextField$ScrollRepainter
+javax/swing/JToggleButton
+javax/swing/JToggleButton$ToggleButtonModel
+javax/swing/JToolBar
+javax/swing/JToolBar$DefaultToolBarLayout
+javax/swing/JToolBar$Separator
+javax/swing/JToolTip
+javax/swing/JTree
+javax/swing/JTree$TreeModelHandler
+javax/swing/JTree$TreeSelectionRedirector
+javax/swing/JViewport
+javax/swing/JViewport$ViewListener
+javax/swing/JWindow
+javax/swing/KeyStroke
+javax/swing/KeyboardManager
+javax/swing/KeyboardManager$ComponentKeyStrokePair
+javax/swing/LayoutComparator
+javax/swing/LayoutFocusTraversalPolicy
+javax/swing/ListCellRenderer
+javax/swing/ListModel
+javax/swing/ListSelectionModel
+javax/swing/LookAndFeel
+javax/swing/MenuElement
+javax/swing/MenuSelectionManager
+javax/swing/MultiUIDefaults
+javax/swing/MutableComboBoxModel
+javax/swing/Popup$HeavyWeightWindow
+javax/swing/RepaintManager
+javax/swing/RepaintManager$1
+javax/swing/RepaintManager$1$1
+javax/swing/RepaintManager$2
+javax/swing/RepaintManager$3
+javax/swing/RepaintManager$DisplayChangedHandler
+javax/swing/RepaintManager$PaintManager
+javax/swing/RepaintManager$ProcessingRunnable
+javax/swing/RootPaneContainer
+javax/swing/ScrollPaneConstants
+javax/swing/ScrollPaneLayout
+javax/swing/ScrollPaneLayout$UIResource
+javax/swing/Scrollable
+javax/swing/SingleSelectionModel
+javax/swing/SizeRequirements
+javax/swing/SortingFocusTraversalPolicy
+javax/swing/SwingConstants
+javax/swing/SwingContainerOrderFocusTraversalPolicy
+javax/swing/SwingDefaultFocusTraversalPolicy
+javax/swing/SwingPaintEventDispatcher
+javax/swing/SwingUtilities
+javax/swing/SwingUtilities$SharedOwnerFrame
+javax/swing/Timer
+javax/swing/Timer$DoPostEvent
+javax/swing/TimerQueue
+javax/swing/TimerQueue$1
+javax/swing/TimerQueue$DelayedTimer
+javax/swing/ToolTipManager
+javax/swing/ToolTipManager$AccessibilityKeyListener
+javax/swing/ToolTipManager$MoveBeforeEnterListener
+javax/swing/ToolTipManager$insideTimerAction
+javax/swing/ToolTipManager$outsideTimerAction
+javax/swing/ToolTipManager$stillInsideTimerAction
+javax/swing/TransferHandler
+javax/swing/TransferHandler$DropHandler
+javax/swing/TransferHandler$HasGetTransferHandler
+javax/swing/TransferHandler$SwingDropTarget
+javax/swing/TransferHandler$TransferAction
+javax/swing/TransferHandler$TransferSupport
+javax/swing/UIDefaults
+javax/swing/UIDefaults$ActiveValue
+javax/swing/UIDefaults$LazyInputMap
+javax/swing/UIDefaults$LazyValue
+javax/swing/UIDefaults$TextAndMnemonicHashMap
+javax/swing/UIManager
+javax/swing/UIManager$1
+javax/swing/UIManager$2
+javax/swing/UIManager$LAFState
+javax/swing/UIManager$LookAndFeelInfo
+javax/swing/UnsupportedLookAndFeelException
+javax/swing/ViewportLayout
+javax/swing/WindowConstants
+javax/swing/border/AbstractBorder
+javax/swing/border/BevelBorder
+javax/swing/border/Border
+javax/swing/border/CompoundBorder
+javax/swing/border/EmptyBorder
+javax/swing/border/EtchedBorder
+javax/swing/border/LineBorder
+javax/swing/border/MatteBorder
+javax/swing/border/TitledBorder
+javax/swing/event/AncestorListener
+javax/swing/event/CaretEvent
+javax/swing/event/CaretListener
+javax/swing/event/CellEditorListener
+javax/swing/event/ChangeEvent
+javax/swing/event/ChangeListener
+javax/swing/event/DocumentEvent
+javax/swing/event/DocumentEvent$ElementChange
+javax/swing/event/DocumentEvent$EventType
+javax/swing/event/DocumentListener
+javax/swing/event/EventListenerList
+javax/swing/event/ListDataEvent
+javax/swing/event/ListDataListener
+javax/swing/event/ListSelectionEvent
+javax/swing/event/ListSelectionListener
+javax/swing/event/MenuDragMouseListener
+javax/swing/event/MenuEvent
+javax/swing/event/MenuKeyListener
+javax/swing/event/MenuListener
+javax/swing/event/MouseInputAdapter
+javax/swing/event/MouseInputListener
+javax/swing/event/PopupMenuListener
+javax/swing/event/RowSorterListener
+javax/swing/event/SwingPropertyChangeSupport
+javax/swing/event/TableColumnModelEvent
+javax/swing/event/TableColumnModelListener
+javax/swing/event/TableModelEvent
+javax/swing/event/TableModelListener
+javax/swing/event/TreeExpansionListener
+javax/swing/event/TreeModelEvent
+javax/swing/event/TreeModelListener
+javax/swing/event/TreeSelectionEvent
+javax/swing/event/TreeSelectionListener
+javax/swing/event/UndoableEditEvent
+javax/swing/event/UndoableEditListener
+javax/swing/filechooser/FileFilter
+javax/swing/filechooser/FileSystemView
+javax/swing/filechooser/FileSystemView$1
+javax/swing/filechooser/WindowsFileSystemView
+javax/swing/plaf/ActionMapUIResource
+javax/swing/plaf/BorderUIResource
+javax/swing/plaf/BorderUIResource$CompoundBorderUIResource
+javax/swing/plaf/BorderUIResource$EmptyBorderUIResource
+javax/swing/plaf/BorderUIResource$LineBorderUIResource
+javax/swing/plaf/ButtonUI
+javax/swing/plaf/ColorUIResource
+javax/swing/plaf/ComboBoxUI
+javax/swing/plaf/ComponentInputMapUIResource
+javax/swing/plaf/ComponentUI
+javax/swing/plaf/DimensionUIResource
+javax/swing/plaf/FontUIResource
+javax/swing/plaf/InputMapUIResource
+javax/swing/plaf/InsetsUIResource
+javax/swing/plaf/LabelUI
+javax/swing/plaf/ListUI
+javax/swing/plaf/MenuBarUI
+javax/swing/plaf/MenuItemUI
+javax/swing/plaf/PanelUI
+javax/swing/plaf/PopupMenuUI
+javax/swing/plaf/ProgressBarUI
+javax/swing/plaf/RootPaneUI
+javax/swing/plaf/ScrollBarUI
+javax/swing/plaf/ScrollPaneUI
+javax/swing/plaf/SeparatorUI
+javax/swing/plaf/SliderUI
+javax/swing/plaf/SplitPaneUI
+javax/swing/plaf/TabbedPaneUI
+javax/swing/plaf/TableHeaderUI
+javax/swing/plaf/TableUI
+javax/swing/plaf/TextUI
+javax/swing/plaf/ToolBarUI
+javax/swing/plaf/TreeUI
+javax/swing/plaf/UIResource
+javax/swing/plaf/ViewportUI
+javax/swing/plaf/basic/BasicArrowButton
+javax/swing/plaf/basic/BasicBorders
+javax/swing/plaf/basic/BasicBorders$ButtonBorder
+javax/swing/plaf/basic/BasicBorders$MarginBorder
+javax/swing/plaf/basic/BasicBorders$RadioButtonBorder
+javax/swing/plaf/basic/BasicBorders$RolloverMarginBorder
+javax/swing/plaf/basic/BasicBorders$SplitPaneBorder
+javax/swing/plaf/basic/BasicBorders$SplitPaneDividerBorder
+javax/swing/plaf/basic/BasicButtonListener
+javax/swing/plaf/basic/BasicButtonUI
+javax/swing/plaf/basic/BasicCheckBoxMenuItemUI
+javax/swing/plaf/basic/BasicComboBoxEditor
+javax/swing/plaf/basic/BasicComboBoxEditor$BorderlessTextField
+javax/swing/plaf/basic/BasicComboBoxEditor$UIResource
+javax/swing/plaf/basic/BasicComboBoxRenderer
+javax/swing/plaf/basic/BasicComboBoxRenderer$UIResource
+javax/swing/plaf/basic/BasicComboBoxUI
+javax/swing/plaf/basic/BasicComboBoxUI$ComboBoxLayoutManager
+javax/swing/plaf/basic/BasicComboBoxUI$DefaultKeySelectionManager
+javax/swing/plaf/basic/BasicComboBoxUI$Handler
+javax/swing/plaf/basic/BasicComboBoxUI$PropertyChangeHandler
+javax/swing/plaf/basic/BasicComboPopup
+javax/swing/plaf/basic/BasicComboPopup$1
+javax/swing/plaf/basic/BasicComboPopup$EmptyListModelClass
+javax/swing/plaf/basic/BasicComboPopup$Handler
+javax/swing/plaf/basic/BasicGraphicsUtils
+javax/swing/plaf/basic/BasicHTML
+javax/swing/plaf/basic/BasicLabelUI
+javax/swing/plaf/basic/BasicListUI
+javax/swing/plaf/basic/BasicListUI$Handler
+javax/swing/plaf/basic/BasicListUI$ListTransferHandler
+javax/swing/plaf/basic/BasicLookAndFeel
+javax/swing/plaf/basic/BasicLookAndFeel$1
+javax/swing/plaf/basic/BasicLookAndFeel$2
+javax/swing/plaf/basic/BasicLookAndFeel$AWTEventHelper
+javax/swing/plaf/basic/BasicMenuBarUI
+javax/swing/plaf/basic/BasicMenuBarUI$Handler
+javax/swing/plaf/basic/BasicMenuItemUI
+javax/swing/plaf/basic/BasicMenuItemUI$Handler
+javax/swing/plaf/basic/BasicMenuUI
+javax/swing/plaf/basic/BasicMenuUI$Handler
+javax/swing/plaf/basic/BasicPanelUI
+javax/swing/plaf/basic/BasicPopupMenuUI
+javax/swing/plaf/basic/BasicPopupMenuUI$BasicMenuKeyListener
+javax/swing/plaf/basic/BasicPopupMenuUI$BasicPopupMenuListener
+javax/swing/plaf/basic/BasicPopupMenuUI$MenuKeyboardHelper
+javax/swing/plaf/basic/BasicPopupMenuUI$MenuKeyboardHelper$1
+javax/swing/plaf/basic/BasicPopupMenuUI$MouseGrabber
+javax/swing/plaf/basic/BasicProgressBarUI
+javax/swing/plaf/basic/BasicProgressBarUI$Handler
+javax/swing/plaf/basic/BasicRadioButtonMenuItemUI
+javax/swing/plaf/basic/BasicRadioButtonUI
+javax/swing/plaf/basic/BasicRootPaneUI
+javax/swing/plaf/basic/BasicRootPaneUI$RootPaneInputMap
+javax/swing/plaf/basic/BasicScrollBarUI
+javax/swing/plaf/basic/BasicScrollBarUI$ArrowButtonListener
+javax/swing/plaf/basic/BasicScrollBarUI$Handler
+javax/swing/plaf/basic/BasicScrollBarUI$ModelListener
+javax/swing/plaf/basic/BasicScrollBarUI$PropertyChangeHandler
+javax/swing/plaf/basic/BasicScrollBarUI$ScrollListener
+javax/swing/plaf/basic/BasicScrollBarUI$TrackListener
+javax/swing/plaf/basic/BasicScrollPaneUI
+javax/swing/plaf/basic/BasicScrollPaneUI$Handler
+javax/swing/plaf/basic/BasicSeparatorUI
+javax/swing/plaf/basic/BasicSliderUI
+javax/swing/plaf/basic/BasicSliderUI$Actions
+javax/swing/plaf/basic/BasicSliderUI$Handler
+javax/swing/plaf/basic/BasicSliderUI$PropertyChangeHandler
+javax/swing/plaf/basic/BasicSliderUI$ScrollListener
+javax/swing/plaf/basic/BasicSliderUI$TrackListener
+javax/swing/plaf/basic/BasicSplitPaneDivider
+javax/swing/plaf/basic/BasicSplitPaneDivider$DividerLayout
+javax/swing/plaf/basic/BasicSplitPaneDivider$MouseHandler
+javax/swing/plaf/basic/BasicSplitPaneDivider$OneTouchActionHandler
+javax/swing/plaf/basic/BasicSplitPaneUI
+javax/swing/plaf/basic/BasicSplitPaneUI$1
+javax/swing/plaf/basic/BasicSplitPaneUI$BasicHorizontalLayoutManager
+javax/swing/plaf/basic/BasicSplitPaneUI$Handler
+javax/swing/plaf/basic/BasicTabbedPaneUI
+javax/swing/plaf/basic/BasicTabbedPaneUI$Handler
+javax/swing/plaf/basic/BasicTabbedPaneUI$TabbedPaneLayout
+javax/swing/plaf/basic/BasicTabbedPaneUI$TabbedPaneScrollLayout
+javax/swing/plaf/basic/BasicTableHeaderUI
+javax/swing/plaf/basic/BasicTableHeaderUI$1
+javax/swing/plaf/basic/BasicTableHeaderUI$MouseInputHandler
+javax/swing/plaf/basic/BasicTableUI
+javax/swing/plaf/basic/BasicTableUI$Handler
+javax/swing/plaf/basic/BasicTableUI$TableTransferHandler
+javax/swing/plaf/basic/BasicTextAreaUI
+javax/swing/plaf/basic/BasicTextFieldUI
+javax/swing/plaf/basic/BasicTextUI
+javax/swing/plaf/basic/BasicTextUI$BasicCaret
+javax/swing/plaf/basic/BasicTextUI$BasicCursor
+javax/swing/plaf/basic/BasicTextUI$BasicHighlighter
+javax/swing/plaf/basic/BasicTextUI$DragListener
+javax/swing/plaf/basic/BasicTextUI$FocusAction
+javax/swing/plaf/basic/BasicTextUI$RootView
+javax/swing/plaf/basic/BasicTextUI$TextActionWrapper
+javax/swing/plaf/basic/BasicTextUI$TextTransferHandler
+javax/swing/plaf/basic/BasicTextUI$UpdateHandler
+javax/swing/plaf/basic/BasicToggleButtonUI
+javax/swing/plaf/basic/BasicToolBarSeparatorUI
+javax/swing/plaf/basic/BasicToolBarUI
+javax/swing/plaf/basic/BasicToolBarUI$DockingListener
+javax/swing/plaf/basic/BasicToolBarUI$Handler
+javax/swing/plaf/basic/BasicTreeUI
+javax/swing/plaf/basic/BasicTreeUI$Actions
+javax/swing/plaf/basic/BasicTreeUI$Handler
+javax/swing/plaf/basic/BasicTreeUI$NodeDimensionsHandler
+javax/swing/plaf/basic/BasicTreeUI$TreeTransferHandler
+javax/swing/plaf/basic/BasicViewportUI
+javax/swing/plaf/basic/ComboPopup
+javax/swing/plaf/basic/DefaultMenuLayout
+javax/swing/plaf/basic/DragRecognitionSupport$BeforeDrag
+javax/swing/plaf/basic/LazyActionMap
+javax/swing/plaf/metal/BumpBuffer
+javax/swing/plaf/metal/DefaultMetalTheme
+javax/swing/plaf/metal/DefaultMetalTheme$FontDelegate
+javax/swing/plaf/metal/DefaultMetalTheme$FontDelegate$1
+javax/swing/plaf/metal/MetalBorders
+javax/swing/plaf/metal/MetalBorders$ButtonBorder
+javax/swing/plaf/metal/MetalBorders$Flush3DBorder
+javax/swing/plaf/metal/MetalBorders$MenuBarBorder
+javax/swing/plaf/metal/MetalBorders$MenuItemBorder
+javax/swing/plaf/metal/MetalBorders$PopupMenuBorder
+javax/swing/plaf/metal/MetalBorders$RolloverButtonBorder
+javax/swing/plaf/metal/MetalBorders$RolloverMarginBorder
+javax/swing/plaf/metal/MetalBorders$ScrollPaneBorder
+javax/swing/plaf/metal/MetalBorders$TextFieldBorder
+javax/swing/plaf/metal/MetalBorders$ToggleButtonBorder
+javax/swing/plaf/metal/MetalBorders$ToolBarBorder
+javax/swing/plaf/metal/MetalBumps
+javax/swing/plaf/metal/MetalButtonUI
+javax/swing/plaf/metal/MetalCheckBoxUI
+javax/swing/plaf/metal/MetalComboBoxButton
+javax/swing/plaf/metal/MetalComboBoxButton$1
+javax/swing/plaf/metal/MetalComboBoxEditor
+javax/swing/plaf/metal/MetalComboBoxEditor$1
+javax/swing/plaf/metal/MetalComboBoxEditor$EditorBorder
+javax/swing/plaf/metal/MetalComboBoxEditor$UIResource
+javax/swing/plaf/metal/MetalComboBoxIcon
+javax/swing/plaf/metal/MetalComboBoxUI
+javax/swing/plaf/metal/MetalComboBoxUI$MetalComboBoxLayoutManager
+javax/swing/plaf/metal/MetalComboBoxUI$MetalPropertyChangeListener
+javax/swing/plaf/metal/MetalIconFactory
+javax/swing/plaf/metal/MetalIconFactory$CheckBoxIcon
+javax/swing/plaf/metal/MetalIconFactory$CheckBoxMenuItemIcon
+javax/swing/plaf/metal/MetalIconFactory$FolderIcon16
+javax/swing/plaf/metal/MetalIconFactory$HorizontalSliderThumbIcon
+javax/swing/plaf/metal/MetalIconFactory$MenuArrowIcon
+javax/swing/plaf/metal/MetalIconFactory$MenuItemArrowIcon
+javax/swing/plaf/metal/MetalIconFactory$RadioButtonIcon
+javax/swing/plaf/metal/MetalIconFactory$RadioButtonMenuItemIcon
+javax/swing/plaf/metal/MetalIconFactory$TreeFolderIcon
+javax/swing/plaf/metal/MetalIconFactory$VerticalSliderThumbIcon
+javax/swing/plaf/metal/MetalLabelUI
+javax/swing/plaf/metal/MetalLookAndFeel
+javax/swing/plaf/metal/MetalLookAndFeel$AATextListener
+javax/swing/plaf/metal/MetalLookAndFeel$FontActiveValue
+javax/swing/plaf/metal/MetalLookAndFeel$MetalLazyValue
+javax/swing/plaf/metal/MetalLookAndFeel$MetalLazyValue$1
+javax/swing/plaf/metal/MetalPopupMenuSeparatorUI
+javax/swing/plaf/metal/MetalProgressBarUI
+javax/swing/plaf/metal/MetalRadioButtonUI
+javax/swing/plaf/metal/MetalRootPaneUI
+javax/swing/plaf/metal/MetalScrollBarUI
+javax/swing/plaf/metal/MetalScrollBarUI$ScrollBarListener
+javax/swing/plaf/metal/MetalScrollButton
+javax/swing/plaf/metal/MetalScrollPaneUI
+javax/swing/plaf/metal/MetalScrollPaneUI$1
+javax/swing/plaf/metal/MetalSeparatorUI
+javax/swing/plaf/metal/MetalSliderUI
+javax/swing/plaf/metal/MetalSliderUI$MetalPropertyListener
+javax/swing/plaf/metal/MetalSplitPaneDivider
+javax/swing/plaf/metal/MetalSplitPaneDivider$1
+javax/swing/plaf/metal/MetalSplitPaneDivider$2
+javax/swing/plaf/metal/MetalSplitPaneUI
+javax/swing/plaf/metal/MetalTabbedPaneUI
+javax/swing/plaf/metal/MetalTabbedPaneUI$TabbedPaneLayout
+javax/swing/plaf/metal/MetalTextFieldUI
+javax/swing/plaf/metal/MetalTheme
+javax/swing/plaf/metal/MetalToggleButtonUI
+javax/swing/plaf/metal/MetalToolBarUI
+javax/swing/plaf/metal/MetalToolBarUI$MetalDockingListener
+javax/swing/plaf/metal/MetalTreeUI
+javax/swing/plaf/metal/MetalTreeUI$LineListener
+javax/swing/plaf/metal/MetalUtils
+javax/swing/plaf/metal/OceanTheme
+javax/swing/plaf/metal/OceanTheme$1
+javax/swing/plaf/metal/OceanTheme$2
+javax/swing/plaf/metal/OceanTheme$3
+javax/swing/plaf/metal/OceanTheme$4
+javax/swing/plaf/metal/OceanTheme$5
+javax/swing/plaf/metal/OceanTheme$6
+javax/swing/plaf/synth/SynthConstants
+javax/swing/plaf/synth/SynthUI
+javax/swing/table/AbstractTableModel
+javax/swing/table/DefaultTableCellRenderer
+javax/swing/table/DefaultTableColumnModel
+javax/swing/table/DefaultTableModel
+javax/swing/table/JTableHeader
+javax/swing/table/TableCellEditor
+javax/swing/table/TableCellRenderer
+javax/swing/table/TableColumn
+javax/swing/table/TableColumnModel
+javax/swing/table/TableModel
+javax/swing/text/AbstractDocument
+javax/swing/text/AbstractDocument$1
+javax/swing/text/AbstractDocument$AbstractElement
+javax/swing/text/AbstractDocument$AttributeContext
+javax/swing/text/AbstractDocument$BidiElement
+javax/swing/text/AbstractDocument$BidiRootElement
+javax/swing/text/AbstractDocument$BranchElement
+javax/swing/text/AbstractDocument$Content
+javax/swing/text/AbstractDocument$DefaultDocumentEvent
+javax/swing/text/AbstractDocument$ElementEdit
+javax/swing/text/AbstractDocument$InsertStringResult
+javax/swing/text/AbstractDocument$LeafElement
+javax/swing/text/AttributeSet
+javax/swing/text/AttributeSet$CharacterAttribute
+javax/swing/text/AttributeSet$ColorAttribute
+javax/swing/text/AttributeSet$FontAttribute
+javax/swing/text/AttributeSet$ParagraphAttribute
+javax/swing/text/Caret
+javax/swing/text/DefaultCaret
+javax/swing/text/DefaultCaret$Handler
+javax/swing/text/DefaultEditorKit
+javax/swing/text/DefaultEditorKit$BeepAction
+javax/swing/text/DefaultEditorKit$BeginAction
+javax/swing/text/DefaultEditorKit$BeginLineAction
+javax/swing/text/DefaultEditorKit$BeginParagraphAction
+javax/swing/text/DefaultEditorKit$BeginWordAction
+javax/swing/text/DefaultEditorKit$CopyAction
+javax/swing/text/DefaultEditorKit$CutAction
+javax/swing/text/DefaultEditorKit$DefaultKeyTypedAction
+javax/swing/text/DefaultEditorKit$DeleteNextCharAction
+javax/swing/text/DefaultEditorKit$DeletePrevCharAction
+javax/swing/text/DefaultEditorKit$DeleteWordAction
+javax/swing/text/DefaultEditorKit$DumpModelAction
+javax/swing/text/DefaultEditorKit$EndAction
+javax/swing/text/DefaultEditorKit$EndLineAction
+javax/swing/text/DefaultEditorKit$EndParagraphAction
+javax/swing/text/DefaultEditorKit$EndWordAction
+javax/swing/text/DefaultEditorKit$InsertBreakAction
+javax/swing/text/DefaultEditorKit$InsertContentAction
+javax/swing/text/DefaultEditorKit$InsertTabAction
+javax/swing/text/DefaultEditorKit$NextVisualPositionAction
+javax/swing/text/DefaultEditorKit$NextWordAction
+javax/swing/text/DefaultEditorKit$PageAction
+javax/swing/text/DefaultEditorKit$PasteAction
+javax/swing/text/DefaultEditorKit$PreviousWordAction
+javax/swing/text/DefaultEditorKit$ReadOnlyAction
+javax/swing/text/DefaultEditorKit$SelectAllAction
+javax/swing/text/DefaultEditorKit$SelectLineAction
+javax/swing/text/DefaultEditorKit$SelectParagraphAction
+javax/swing/text/DefaultEditorKit$SelectWordAction
+javax/swing/text/DefaultEditorKit$ToggleComponentOrientationAction
+javax/swing/text/DefaultEditorKit$UnselectAction
+javax/swing/text/DefaultEditorKit$VerticalPageAction
+javax/swing/text/DefaultEditorKit$WritableAction
+javax/swing/text/DefaultHighlighter
+javax/swing/text/DefaultHighlighter$DefaultHighlightPainter
+javax/swing/text/DefaultHighlighter$SafeDamager
+javax/swing/text/Document
+javax/swing/text/EditorKit
+javax/swing/text/Element
+javax/swing/text/FieldView
+javax/swing/text/GapContent
+javax/swing/text/GapContent$InsertUndo
+javax/swing/text/GapContent$MarkData
+javax/swing/text/GapContent$MarkVector
+javax/swing/text/GapContent$StickyPosition
+javax/swing/text/GapVector
+javax/swing/text/Highlighter
+javax/swing/text/Highlighter$Highlight
+javax/swing/text/Highlighter$HighlightPainter
+javax/swing/text/JTextComponent
+javax/swing/text/JTextComponent$1
+javax/swing/text/JTextComponent$DefaultKeymap
+javax/swing/text/JTextComponent$KeymapActionMap
+javax/swing/text/JTextComponent$KeymapWrapper
+javax/swing/text/JTextComponent$MutableCaretEvent
+javax/swing/text/Keymap
+javax/swing/text/LayeredHighlighter
+javax/swing/text/LayeredHighlighter$LayerPainter
+javax/swing/text/MutableAttributeSet
+javax/swing/text/PlainDocument
+javax/swing/text/PlainView
+javax/swing/text/Position
+javax/swing/text/Position$Bias
+javax/swing/text/Segment
+javax/swing/text/SegmentCache
+javax/swing/text/SegmentCache$CachedSegment
+javax/swing/text/SimpleAttributeSet
+javax/swing/text/SimpleAttributeSet$EmptyAttributeSet
+javax/swing/text/Style
+javax/swing/text/StyleConstants
+javax/swing/text/StyleConstants$CharacterConstants
+javax/swing/text/StyleConstants$ColorConstants
+javax/swing/text/StyleConstants$FontConstants
+javax/swing/text/StyleConstants$ParagraphConstants
+javax/swing/text/StyleContext
+javax/swing/text/StyleContext$FontKey
+javax/swing/text/StyleContext$KeyEnumeration
+javax/swing/text/StyleContext$NamedStyle
+javax/swing/text/StyleContext$SmallAttributeSet
+javax/swing/text/TabExpander
+javax/swing/text/TextAction
+javax/swing/text/Utilities
+javax/swing/text/View
+javax/swing/text/ViewFactory
+javax/swing/tree/AbstractLayoutCache
+javax/swing/tree/AbstractLayoutCache$NodeDimensions
+javax/swing/tree/DefaultMutableTreeNode
+javax/swing/tree/DefaultMutableTreeNode$PreorderEnumeration
+javax/swing/tree/DefaultTreeCellEditor
+javax/swing/tree/DefaultTreeCellEditor$1
+javax/swing/tree/DefaultTreeCellEditor$DefaultTextField
+javax/swing/tree/DefaultTreeCellEditor$EditorContainer
+javax/swing/tree/DefaultTreeCellRenderer
+javax/swing/tree/DefaultTreeModel
+javax/swing/tree/DefaultTreeSelectionModel
+javax/swing/tree/MutableTreeNode
+javax/swing/tree/PathPlaceHolder
+javax/swing/tree/RowMapper
+javax/swing/tree/TreeCellEditor
+javax/swing/tree/TreeCellRenderer
+javax/swing/tree/TreeModel
+javax/swing/tree/TreeNode
+javax/swing/tree/TreePath
+javax/swing/tree/TreeSelectionModel
+javax/swing/tree/VariableHeightLayoutCache
+javax/swing/tree/VariableHeightLayoutCache$TreeStateNode
+javax/swing/undo/AbstractUndoableEdit
+javax/swing/undo/CompoundEdit
+javax/swing/undo/UndoableEdit
+javax/xml/parsers/DocumentBuilder
+javax/xml/parsers/DocumentBuilderFactory
+javax/xml/parsers/FactoryFinder
+javax/xml/parsers/FactoryFinder$1
+javax/xml/parsers/ParserConfigurationException
+javax/xml/parsers/SecuritySupport
+javax/xml/parsers/SecuritySupport$2
+javax/xml/parsers/SecuritySupport$5
+org/w3c/dom/Attr
+org/w3c/dom/CDATASection
+org/w3c/dom/CharacterData
+org/w3c/dom/Comment
+org/w3c/dom/DOMException
+org/w3c/dom/Document
+org/w3c/dom/DocumentFragment
+org/w3c/dom/DocumentType
+org/w3c/dom/Element
+org/w3c/dom/Entity
+org/w3c/dom/EntityReference
+org/w3c/dom/NamedNodeMap
+org/w3c/dom/Node
+org/w3c/dom/NodeList
+org/w3c/dom/Notation
+org/w3c/dom/ProcessingInstruction
+org/w3c/dom/Text
+org/w3c/dom/events/DocumentEvent
+org/w3c/dom/events/Event
+org/w3c/dom/events/EventException
+org/w3c/dom/events/EventTarget
+org/w3c/dom/events/MutationEvent
+org/w3c/dom/ranges/DocumentRange
+org/w3c/dom/ranges/Range
+org/w3c/dom/traversal/DocumentTraversal
+org/w3c/dom/traversal/NodeIterator
+org/w3c/dom/traversal/TreeWalker
+org/xml/sax/AttributeList
+org/xml/sax/ContentHandler
+org/xml/sax/DTDHandler
+org/xml/sax/EntityResolver
+org/xml/sax/ErrorHandler
+org/xml/sax/InputSource
+org/xml/sax/Locator
+org/xml/sax/SAXException
+org/xml/sax/SAXNotRecognizedException
+org/xml/sax/SAXNotSupportedException
+org/xml/sax/SAXParseException
+org/xml/sax/helpers/DefaultHandler
+sun/awt/AWTAccessor
+sun/awt/AWTAccessor$AWTEventAccessor
+sun/awt/AWTAccessor$ClientPropertyKeyAccessor
+sun/awt/AWTAccessor$ComponentAccessor
+sun/awt/AWTAccessor$ContainerAccessor
+sun/awt/AWTAccessor$CursorAccessor
+sun/awt/AWTAccessor$DefaultKeyboardFocusManagerAccessor
+sun/awt/AWTAccessor$EventQueueAccessor
+sun/awt/AWTAccessor$FrameAccessor
+sun/awt/AWTAccessor$InputEventAccessor
+sun/awt/AWTAccessor$InvocationEventAccessor
+sun/awt/AWTAccessor$KeyEventAccessor
+sun/awt/AWTAccessor$KeyboardFocusManagerAccessor
+sun/awt/AWTAccessor$SequencedEventAccessor
+sun/awt/AWTAccessor$ToolkitAccessor
+sun/awt/AWTAccessor$WindowAccessor
+sun/awt/AWTAutoShutdown
+sun/awt/AWTAutoShutdown$1
+sun/awt/AppContext
+sun/awt/AppContext$1
+sun/awt/AppContext$2
+sun/awt/AppContext$3
+sun/awt/AppContext$6
+sun/awt/AppContext$GetAppContextLock
+sun/awt/AppContext$PostShutdownEventRunnable
+sun/awt/AppContext$State
+sun/awt/CausedFocusEvent
+sun/awt/CausedFocusEvent$Cause
+sun/awt/ComponentFactory
+sun/awt/ConstrainableGraphics
+sun/awt/DisplayChangedListener
+sun/awt/EmbeddedFrame
+sun/awt/EventQueueDelegate
+sun/awt/EventQueueItem
+sun/awt/ExtendedKeyCodes
+sun/awt/FontConfiguration
+sun/awt/FontConfiguration$2
+sun/awt/FontDescriptor
+sun/awt/GlobalCursorManager
+sun/awt/GlobalCursorManager$NativeUpdater
+sun/awt/HeadlessToolkit
+sun/awt/InputMethodSupport
+sun/awt/KeyboardFocusManagerPeerImpl
+sun/awt/KeyboardFocusManagerPeerProvider
+sun/awt/LightweightFrame
+sun/awt/ModalExclude
+sun/awt/ModalityListener
+sun/awt/MostRecentKeyValue
+sun/awt/NativeLibLoader
+sun/awt/NativeLibLoader$1
+sun/awt/NullComponentPeer
+sun/awt/OSInfo
+sun/awt/OSInfo$1
+sun/awt/OSInfo$OSType
+sun/awt/OSInfo$WindowsVersion
+sun/awt/PaintEventDispatcher
+sun/awt/PeerEvent
+sun/awt/PlatformFont
+sun/awt/PostEventQueue
+sun/awt/RepaintArea
+sun/awt/RequestFocusController
+sun/awt/SubRegionShowable
+sun/awt/SunDisplayChanger
+sun/awt/SunGraphicsCallback
+sun/awt/SunHints
+sun/awt/SunHints$Key
+sun/awt/SunHints$LCDContrastKey
+sun/awt/SunHints$Value
+sun/awt/SunToolkit
+sun/awt/SunToolkit$ModalityListenerList
+sun/awt/Symbol
+sun/awt/Symbol$Encoder
+sun/awt/TimedWindowEvent
+sun/awt/Win32FontManager
+sun/awt/Win32FontManager$1
+sun/awt/Win32FontManager$2
+sun/awt/Win32GraphicsConfig
+sun/awt/Win32GraphicsDevice
+sun/awt/Win32GraphicsEnvironment
+sun/awt/WindowClosingListener
+sun/awt/WindowClosingSupport
+sun/awt/dnd/SunDragSourceContextPeer
+sun/awt/dnd/SunDropTargetEvent
+sun/awt/event/IgnorePaintEvent
+sun/awt/geom/PathConsumer2D
+sun/awt/im/ExecutableInputMethodManager
+sun/awt/im/ExecutableInputMethodManager$3
+sun/awt/im/InputContext
+sun/awt/im/InputMethodAdapter
+sun/awt/im/InputMethodContext
+sun/awt/im/InputMethodLocator
+sun/awt/im/InputMethodManager
+sun/awt/im/InputMethodWindow
+sun/awt/image/BufImgSurfaceData
+sun/awt/image/BufImgSurfaceData$ICMColorData
+sun/awt/image/BufImgSurfaceManager
+sun/awt/image/BufImgVolatileSurfaceManager
+sun/awt/image/BufferedImageDevice
+sun/awt/image/BufferedImageGraphicsConfig
+sun/awt/image/ByteComponentRaster
+sun/awt/image/ByteInterleavedRaster
+sun/awt/image/BytePackedRaster
+sun/awt/image/FetcherInfo
+sun/awt/image/GifFrame
+sun/awt/image/GifImageDecoder
+sun/awt/image/ImageConsumerQueue
+sun/awt/image/ImageDecoder
+sun/awt/image/ImageDecoder$1
+sun/awt/image/ImageFetchable
+sun/awt/image/ImageFetcher
+sun/awt/image/ImageFetcher$1
+sun/awt/image/ImageRepresentation
+sun/awt/image/ImageWatched
+sun/awt/image/ImageWatched$Link
+sun/awt/image/ImageWatched$WeakLink
+sun/awt/image/InputStreamImageSource
+sun/awt/image/IntegerComponentRaster
+sun/awt/image/IntegerInterleavedRaster
+sun/awt/image/NativeLibLoader
+sun/awt/image/NativeLibLoader$1
+sun/awt/image/OffScreenImage
+sun/awt/image/PNGFilterInputStream
+sun/awt/image/PNGImageDecoder
+sun/awt/image/PixelConverter
+sun/awt/image/PixelConverter$Argb
+sun/awt/image/PixelConverter$ArgbBm
+sun/awt/image/PixelConverter$ArgbPre
+sun/awt/image/PixelConverter$Bgrx
+sun/awt/image/PixelConverter$ByteGray
+sun/awt/image/PixelConverter$Rgba
+sun/awt/image/PixelConverter$RgbaPre
+sun/awt/image/PixelConverter$Rgbx
+sun/awt/image/PixelConverter$Ushort4444Argb
+sun/awt/image/PixelConverter$Ushort555Rgb
+sun/awt/image/PixelConverter$Ushort555Rgbx
+sun/awt/image/PixelConverter$Ushort565Rgb
+sun/awt/image/PixelConverter$UshortGray
+sun/awt/image/PixelConverter$Xbgr
+sun/awt/image/PixelConverter$Xrgb
+sun/awt/image/SunVolatileImage
+sun/awt/image/SunWritableRaster
+sun/awt/image/SunWritableRaster$DataStealer
+sun/awt/image/SurfaceManager
+sun/awt/image/SurfaceManager$FlushableCacheData
+sun/awt/image/SurfaceManager$ImageAccessor
+sun/awt/image/SurfaceManager$ProxiedGraphicsConfig
+sun/awt/image/ToolkitImage
+sun/awt/image/URLImageSource
+sun/awt/image/VolatileSurfaceManager
+sun/awt/resources/awt
+sun/awt/util/IdentityArrayList
+sun/awt/windows/ThemeReader
+sun/awt/windows/WCanvasPeer
+sun/awt/windows/WColor
+sun/awt/windows/WComponentPeer
+sun/awt/windows/WComponentPeer$2
+sun/awt/windows/WDesktopProperties
+sun/awt/windows/WDesktopProperties$WinPlaySound
+sun/awt/windows/WFontConfiguration
+sun/awt/windows/WFontPeer
+sun/awt/windows/WFramePeer
+sun/awt/windows/WGlobalCursorManager
+sun/awt/windows/WInputMethod
+sun/awt/windows/WInputMethodDescriptor
+sun/awt/windows/WKeyboardFocusManagerPeer
+sun/awt/windows/WLabelPeer
+sun/awt/windows/WObjectPeer
+sun/awt/windows/WPanelPeer
+sun/awt/windows/WToolkit
+sun/awt/windows/WToolkit$1
+sun/awt/windows/WToolkit$2
+sun/awt/windows/WToolkit$3
+sun/awt/windows/WToolkit$3$1
+sun/awt/windows/WToolkit$ToolkitDisposer
+sun/awt/windows/WWindowPeer
+sun/awt/windows/WWindowPeer$ActiveWindowListener
+sun/awt/windows/WWindowPeer$GuiDisposedListener
+sun/awt/windows/WingDings
+sun/awt/windows/WingDings$Encoder
+sun/dc/DuctusRenderingEngine
+sun/dc/path/PathConsumer
+sun/dc/pr/PathDasher
+sun/dc/pr/PathDasher$1
+sun/dc/pr/PathStroker
+sun/dc/pr/PathStroker$1
+sun/font/AttributeValues
+sun/font/CMap
+sun/font/CMap$CMapFormat4
+sun/font/CMap$NullCMapClass
+sun/font/CharToGlyphMapper
+sun/font/CompositeFont
+sun/font/CompositeFontDescriptor
+sun/font/CompositeGlyphMapper
+sun/font/CompositeStrike
+sun/font/CoreMetrics
+sun/font/EAttribute
+sun/font/FileFont
+sun/font/FileFontStrike
+sun/font/Font2D
+sun/font/Font2DHandle
+sun/font/FontAccess
+sun/font/FontDesignMetrics
+sun/font/FontDesignMetrics$KeyReference
+sun/font/FontDesignMetrics$MetricsKey
+sun/font/FontFamily
+sun/font/FontLineMetrics
+sun/font/FontManager
+sun/font/FontManagerFactory
+sun/font/FontManagerFactory$1
+sun/font/FontManagerForSGE
+sun/font/FontManagerNativeLibrary
+sun/font/FontManagerNativeLibrary$1
+sun/font/FontScaler
+sun/font/FontStrike
+sun/font/FontStrikeDesc
+sun/font/FontStrikeDisposer
+sun/font/FontUtilities
+sun/font/FontUtilities$1
+sun/font/GlyphList
+sun/font/PhysicalFont
+sun/font/PhysicalStrike
+sun/font/StandardGlyphVector
+sun/font/StandardGlyphVector$GlyphStrike
+sun/font/StrikeCache
+sun/font/StrikeCache$1
+sun/font/StrikeCache$DisposableStrike
+sun/font/StrikeCache$SoftDisposerRef
+sun/font/StrikeMetrics
+sun/font/SunFontManager
+sun/font/SunFontManager$1
+sun/font/SunFontManager$11
+sun/font/SunFontManager$12
+sun/font/SunFontManager$2
+sun/font/SunFontManager$3
+sun/font/SunFontManager$FamilyDescription
+sun/font/SunFontManager$FontRegistrationInfo
+sun/font/SunFontManager$T1Filter
+sun/font/SunFontManager$TTFilter
+sun/font/T2KFontScaler
+sun/font/T2KFontScaler$1
+sun/font/TrueTypeFont
+sun/font/TrueTypeFont$1
+sun/font/TrueTypeFont$DirectoryEntry
+sun/font/TrueTypeFont$TTDisposerRecord
+sun/font/TrueTypeGlyphMapper
+sun/font/Type1Font
+sun/io/Win32ErrorMode
+sun/java2d/DefaultDisposerRecord
+sun/java2d/DestSurfaceProvider
+sun/java2d/Disposer
+sun/java2d/Disposer$1
+sun/java2d/Disposer$2
+sun/java2d/Disposer$PollDisposable
+sun/java2d/DisposerRecord
+sun/java2d/DisposerTarget
+sun/java2d/FontSupport
+sun/java2d/InvalidPipeException
+sun/java2d/NullSurfaceData
+sun/java2d/ScreenUpdateManager
+sun/java2d/StateTrackable
+sun/java2d/StateTrackable$State
+sun/java2d/StateTrackableDelegate
+sun/java2d/StateTrackableDelegate$2
+sun/java2d/StateTracker
+sun/java2d/StateTracker$1
+sun/java2d/StateTracker$2
+sun/java2d/SunGraphics2D
+sun/java2d/SunGraphicsEnvironment
+sun/java2d/SunGraphicsEnvironment$1
+sun/java2d/Surface
+sun/java2d/SurfaceData
+sun/java2d/SurfaceData$PixelToPgramLoopConverter
+sun/java2d/SurfaceData$PixelToShapeLoopConverter
+sun/java2d/SurfaceDataProxy
+sun/java2d/SurfaceDataProxy$1
+sun/java2d/SurfaceManagerFactory
+sun/java2d/WindowsSurfaceManagerFactory
+sun/java2d/cmm/ProfileActivator
+sun/java2d/cmm/ProfileDeferralInfo
+sun/java2d/cmm/ProfileDeferralMgr
+sun/java2d/d3d/D3DContext$D3DContextCaps
+sun/java2d/d3d/D3DGraphicsConfig
+sun/java2d/d3d/D3DGraphicsDevice
+sun/java2d/d3d/D3DGraphicsDevice$1
+sun/java2d/d3d/D3DGraphicsDevice$1Result
+sun/java2d/d3d/D3DRenderQueue
+sun/java2d/d3d/D3DRenderQueue$1
+sun/java2d/d3d/D3DScreenUpdateManager
+sun/java2d/d3d/D3DScreenUpdateManager$1
+sun/java2d/d3d/D3DScreenUpdateManager$1$1
+sun/java2d/d3d/D3DSurfaceData
+sun/java2d/d3d/D3DSurfaceData$D3DWindowSurfaceData
+sun/java2d/loops/Blit
+sun/java2d/loops/BlitBg
+sun/java2d/loops/CompositeType
+sun/java2d/loops/CustomComponent
+sun/java2d/loops/DrawGlyphList
+sun/java2d/loops/DrawGlyphListAA
+sun/java2d/loops/DrawGlyphListLCD
+sun/java2d/loops/DrawLine
+sun/java2d/loops/DrawParallelogram
+sun/java2d/loops/DrawPath
+sun/java2d/loops/DrawPolygons
+sun/java2d/loops/DrawRect
+sun/java2d/loops/FillParallelogram
+sun/java2d/loops/FillPath
+sun/java2d/loops/FillRect
+sun/java2d/loops/FillSpans
+sun/java2d/loops/FontInfo
+sun/java2d/loops/GeneralRenderer
+sun/java2d/loops/GraphicsPrimitive
+sun/java2d/loops/GraphicsPrimitiveMgr
+sun/java2d/loops/GraphicsPrimitiveMgr$1
+sun/java2d/loops/GraphicsPrimitiveMgr$2
+sun/java2d/loops/GraphicsPrimitiveMgr$PrimitiveSpec
+sun/java2d/loops/GraphicsPrimitiveProxy
+sun/java2d/loops/MaskBlit
+sun/java2d/loops/MaskFill
+sun/java2d/loops/RenderCache
+sun/java2d/loops/RenderCache$Entry
+sun/java2d/loops/RenderLoops
+sun/java2d/loops/ScaledBlit
+sun/java2d/loops/SurfaceType
+sun/java2d/loops/TransformHelper
+sun/java2d/loops/XORComposite
+sun/java2d/opengl/OGLGraphicsConfig
+sun/java2d/opengl/WGLGraphicsConfig
+sun/java2d/pipe/AAShapePipe
+sun/java2d/pipe/AATextRenderer
+sun/java2d/pipe/AlphaColorPipe
+sun/java2d/pipe/AlphaPaintPipe
+sun/java2d/pipe/CompositePipe
+sun/java2d/pipe/DrawImage
+sun/java2d/pipe/DrawImagePipe
+sun/java2d/pipe/GeneralCompositePipe
+sun/java2d/pipe/GlyphListLoopPipe
+sun/java2d/pipe/GlyphListPipe
+sun/java2d/pipe/LCDTextRenderer
+sun/java2d/pipe/LoopBasedPipe
+sun/java2d/pipe/LoopPipe
+sun/java2d/pipe/NullPipe
+sun/java2d/pipe/OutlineTextRenderer
+sun/java2d/pipe/ParallelogramPipe
+sun/java2d/pipe/PixelDrawPipe
+sun/java2d/pipe/PixelFillPipe
+sun/java2d/pipe/PixelToParallelogramConverter
+sun/java2d/pipe/PixelToShapeConverter
+sun/java2d/pipe/Region
+sun/java2d/pipe/Region$ImmutableRegion
+sun/java2d/pipe/RegionIterator
+sun/java2d/pipe/RenderBuffer
+sun/java2d/pipe/RenderQueue
+sun/java2d/pipe/RenderingEngine
+sun/java2d/pipe/RenderingEngine$1
+sun/java2d/pipe/ShapeDrawPipe
+sun/java2d/pipe/ShapeSpanIterator
+sun/java2d/pipe/SolidTextRenderer
+sun/java2d/pipe/SpanClipRenderer
+sun/java2d/pipe/SpanIterator
+sun/java2d/pipe/SpanShapeRenderer
+sun/java2d/pipe/SpanShapeRenderer$Composite
+sun/java2d/pipe/TextPipe
+sun/java2d/pipe/TextRenderer
+sun/java2d/pipe/ValidatePipe
+sun/java2d/pipe/hw/AccelGraphicsConfig
+sun/java2d/pipe/hw/AccelSurface
+sun/java2d/pipe/hw/BufferedContextProvider
+sun/java2d/pipe/hw/ContextCapabilities
+sun/java2d/windows/GDIBlitLoops
+sun/java2d/windows/GDIRenderer
+sun/java2d/windows/GDIWindowSurfaceData
+sun/java2d/windows/WindowsFlags
+sun/java2d/windows/WindowsFlags$1
+sun/launcher/LauncherHelper
+sun/launcher/LauncherHelper$FXHelper
+sun/misc/ASCIICaseInsensitiveComparator
+sun/misc/Cleaner
+sun/misc/CompoundEnumeration
+sun/misc/ExtensionDependency
+sun/misc/FDBigInteger
+sun/misc/FileURLMapper
+sun/misc/FloatingDecimal
+sun/misc/FloatingDecimal$1
+sun/misc/FloatingDecimal$ASCIIToBinaryBuffer
+sun/misc/FloatingDecimal$ASCIIToBinaryConverter
+sun/misc/FloatingDecimal$BinaryToASCIIBuffer
+sun/misc/FloatingDecimal$BinaryToASCIIConverter
+sun/misc/FloatingDecimal$ExceptionalBinaryToASCIIBuffer
+sun/misc/FloatingDecimal$PreparedASCIIToBinaryBuffer
+sun/misc/IOUtils
+sun/misc/JarIndex
+sun/misc/JavaAWTAccess
+sun/misc/JavaIOFileDescriptorAccess
+sun/misc/JavaLangAccess
+sun/misc/JavaNetAccess
+sun/misc/JavaNioAccess
+sun/misc/JavaSecurityAccess
+sun/misc/JavaSecurityProtectionDomainAccess
+sun/misc/JavaUtilJarAccess
+sun/misc/JavaUtilZipFileAccess
+sun/misc/Launcher
+sun/misc/Launcher$AppClassLoader
+sun/misc/Launcher$AppClassLoader$1
+sun/misc/Launcher$BootClassPathHolder
+sun/misc/Launcher$BootClassPathHolder$1
+sun/misc/Launcher$ExtClassLoader
+sun/misc/Launcher$ExtClassLoader$1
+sun/misc/Launcher$Factory
+sun/misc/MetaIndex
+sun/misc/NativeSignalHandler
+sun/misc/OSEnvironment
+sun/misc/Perf
+sun/misc/Perf$GetPerfAction
+sun/misc/PerfCounter
+sun/misc/PerfCounter$CoreCounters
+sun/misc/PerfCounter$WindowsClientCounters
+sun/misc/PerformanceLogger
+sun/misc/PerformanceLogger$TimeData
+sun/misc/PostVMInitHook
+sun/misc/Resource
+sun/misc/SharedSecrets
+sun/misc/Signal
+sun/misc/SignalHandler
+sun/misc/SoftCache
+sun/misc/SoftCache$ValueCell
+sun/misc/URLClassPath
+sun/misc/URLClassPath$1
+sun/misc/URLClassPath$2
+sun/misc/URLClassPath$3
+sun/misc/URLClassPath$FileLoader
+sun/misc/URLClassPath$JarLoader
+sun/misc/URLClassPath$JarLoader$1
+sun/misc/URLClassPath$JarLoader$2
+sun/misc/URLClassPath$Loader
+sun/misc/Unsafe
+sun/misc/VM
+sun/misc/Version
+sun/net/DefaultProgressMeteringPolicy
+sun/net/InetAddressCachePolicy
+sun/net/InetAddressCachePolicy$1
+sun/net/InetAddressCachePolicy$2
+sun/net/NetHooks
+sun/net/NetProperties
+sun/net/NetProperties$1
+sun/net/ProgressMeteringPolicy
+sun/net/ProgressMonitor
+sun/net/ResourceManager
+sun/net/spi/DefaultProxySelector
+sun/net/spi/DefaultProxySelector$1
+sun/net/spi/DefaultProxySelector$3
+sun/net/spi/DefaultProxySelector$NonProxyInfo
+sun/net/spi/nameservice/NameService
+sun/net/util/IPAddressUtil
+sun/net/util/URLUtil
+sun/net/www/MessageHeader
+sun/net/www/MimeEntry
+sun/net/www/MimeTable
+sun/net/www/MimeTable$1
+sun/net/www/MimeTable$DefaultInstanceHolder
+sun/net/www/MimeTable$DefaultInstanceHolder$1
+sun/net/www/ParseUtil
+sun/net/www/URLConnection
+sun/net/www/protocol/file/FileURLConnection
+sun/net/www/protocol/file/Handler
+sun/net/www/protocol/http/Handler
+sun/net/www/protocol/jar/Handler
+sun/net/www/protocol/jar/JarFileFactory
+sun/net/www/protocol/jar/JarURLConnection
+sun/net/www/protocol/jar/JarURLConnection$JarURLInputStream
+sun/net/www/protocol/jar/URLJarFile
+sun/net/www/protocol/jar/URLJarFile$URLJarFileCloseController
+sun/net/www/protocol/jar/URLJarFile$URLJarFileEntry
+sun/nio/ByteBuffered
+sun/nio/ch/DirectBuffer
+sun/nio/ch/FileChannelImpl
+sun/nio/ch/FileDispatcher
+sun/nio/ch/FileDispatcherImpl
+sun/nio/ch/IOStatus
+sun/nio/ch/IOUtil
+sun/nio/ch/IOUtil$1
+sun/nio/ch/Interruptible
+sun/nio/ch/NativeDispatcher
+sun/nio/ch/NativeThread
+sun/nio/ch/NativeThreadSet
+sun/nio/ch/Util
+sun/nio/ch/Util$1
+sun/nio/ch/Util$BufferCache
+sun/nio/cs/ArrayDecoder
+sun/nio/cs/ArrayEncoder
+sun/nio/cs/FastCharsetProvider
+sun/nio/cs/HistoricallyNamedCharset
+sun/nio/cs/ISO_8859_1
+sun/nio/cs/MS1252
+sun/nio/cs/SingleByte
+sun/nio/cs/SingleByte$Decoder
+sun/nio/cs/SingleByte$Encoder
+sun/nio/cs/StandardCharsets
+sun/nio/cs/StandardCharsets$Aliases
+sun/nio/cs/StandardCharsets$Cache
+sun/nio/cs/StandardCharsets$Classes
+sun/nio/cs/StreamDecoder
+sun/nio/cs/StreamEncoder
+sun/nio/cs/Surrogate
+sun/nio/cs/Surrogate$Parser
+sun/nio/cs/US_ASCII
+sun/nio/cs/UTF_16
+sun/nio/cs/UTF_16$Decoder
+sun/nio/cs/UTF_16BE
+sun/nio/cs/UTF_16LE
+sun/nio/cs/UTF_16LE$Decoder
+sun/nio/cs/UTF_16LE$Encoder
+sun/nio/cs/UTF_8
+sun/nio/cs/UTF_8$Decoder
+sun/nio/cs/UTF_8$Encoder
+sun/nio/cs/Unicode
+sun/nio/cs/UnicodeDecoder
+sun/nio/cs/UnicodeEncoder
+sun/print/PrinterGraphicsConfig
+sun/reflect/AccessorGenerator
+sun/reflect/BootstrapConstructorAccessorImpl
+sun/reflect/ByteVector
+sun/reflect/ByteVectorFactory
+sun/reflect/ByteVectorImpl
+sun/reflect/CallerSensitive
+sun/reflect/ClassDefiner
+sun/reflect/ClassDefiner$1
+sun/reflect/ClassFileAssembler
+sun/reflect/ClassFileConstants
+sun/reflect/ConstantPool
+sun/reflect/ConstructorAccessor
+sun/reflect/ConstructorAccessorImpl
+sun/reflect/DelegatingClassLoader
+sun/reflect/DelegatingConstructorAccessorImpl
+sun/reflect/DelegatingMethodAccessorImpl
+sun/reflect/FieldAccessor
+sun/reflect/FieldAccessorImpl
+sun/reflect/Label
+sun/reflect/Label$PatchInfo
+sun/reflect/LangReflectAccess
+sun/reflect/MagicAccessorImpl
+sun/reflect/MethodAccessor
+sun/reflect/MethodAccessorGenerator
+sun/reflect/MethodAccessorGenerator$1
+sun/reflect/MethodAccessorImpl
+sun/reflect/NativeConstructorAccessorImpl
+sun/reflect/NativeMethodAccessorImpl
+sun/reflect/Reflection
+sun/reflect/ReflectionFactory
+sun/reflect/ReflectionFactory$1
+sun/reflect/ReflectionFactory$GetReflectionFactoryAction
+sun/reflect/SerializationConstructorAccessorImpl
+sun/reflect/UTF8
+sun/reflect/UnsafeFieldAccessorFactory
+sun/reflect/UnsafeFieldAccessorImpl
+sun/reflect/UnsafeObjectFieldAccessorImpl
+sun/reflect/UnsafeQualifiedStaticFieldAccessorImpl
+sun/reflect/UnsafeQualifiedStaticIntegerFieldAccessorImpl
+sun/reflect/UnsafeQualifiedStaticLongFieldAccessorImpl
+sun/reflect/UnsafeQualifiedStaticObjectFieldAccessorImpl
+sun/reflect/UnsafeStaticFieldAccessorImpl
+sun/reflect/annotation/AnnotationType
+sun/reflect/generics/repository/AbstractRepository
+sun/reflect/generics/repository/ClassRepository
+sun/reflect/generics/repository/GenericDeclRepository
+sun/reflect/misc/MethodUtil
+sun/reflect/misc/MethodUtil$1
+sun/reflect/misc/ReflectUtil
+sun/security/action/GetBooleanAction
+sun/security/action/GetIntegerAction
+sun/security/action/GetPropertyAction
+sun/security/jca/GetInstance
+sun/security/jca/GetInstance$Instance
+sun/security/jca/ProviderConfig
+sun/security/jca/ProviderConfig$2
+sun/security/jca/ProviderList
+sun/security/jca/ProviderList$1
+sun/security/jca/ProviderList$2
+sun/security/jca/ProviderList$3
+sun/security/jca/ProviderList$ServiceList
+sun/security/jca/ProviderList$ServiceList$1
+sun/security/jca/Providers
+sun/security/jca/ServiceId
+sun/security/provider/ByteArrayAccess
+sun/security/provider/DSA
+sun/security/provider/DSA$LegacyDSA
+sun/security/provider/DSA$SHA1withDSA
+sun/security/provider/DSAParameters
+sun/security/provider/DSAPublicKey
+sun/security/provider/DigestBase
+sun/security/provider/NativePRNG
+sun/security/provider/NativePRNG$Blocking
+sun/security/provider/NativePRNG$NonBlocking
+sun/security/provider/SHA
+sun/security/provider/Sun
+sun/security/provider/SunEntries
+sun/security/provider/SunEntries$1
+sun/security/util/ByteArrayLexOrder
+sun/security/util/ByteArrayTagOrder
+sun/security/util/Debug
+sun/security/util/DerEncoder
+sun/security/util/DerIndefLenConverter
+sun/security/util/DerInputBuffer
+sun/security/util/DerInputStream
+sun/security/util/DerOutputStream
+sun/security/util/DerValue
+sun/security/util/ManifestEntryVerifier
+sun/security/util/ObjectIdentifier
+sun/security/util/SignatureFileVerifier
+sun/security/x509/AlgorithmId
+sun/security/x509/X509Key
+sun/swing/DefaultLookup
+sun/swing/ImageIconUIResource
+sun/swing/JLightweightFrame
+sun/swing/MenuItemLayoutHelper
+sun/swing/MenuItemLayoutHelper$ColumnAlignment
+sun/swing/MenuItemLayoutHelper$LayoutResult
+sun/swing/MenuItemLayoutHelper$RectSize
+sun/swing/PrintColorUIResource
+sun/swing/StringUIClientPropertyKey
+sun/swing/SwingAccessor
+sun/swing/SwingAccessor$JTextComponentAccessor
+sun/swing/SwingLazyValue
+sun/swing/SwingLazyValue$1
+sun/swing/SwingUtilities2
+sun/swing/SwingUtilities2$2
+sun/swing/SwingUtilities2$AATextInfo
+sun/swing/SwingUtilities2$LSBCacheEntry
+sun/swing/UIAction
+sun/swing/UIClientPropertyKey
+sun/swing/table/DefaultTableCellHeaderRenderer
+sun/swing/table/DefaultTableCellHeaderRenderer$EmptyIcon
+sun/text/ComposedCharIter
+sun/text/IntHashtable
+sun/text/UCompactIntArray
+sun/text/normalizer/CharTrie
+sun/text/normalizer/CharTrie$FriendAgent
+sun/text/normalizer/ICUBinary
+sun/text/normalizer/ICUBinary$Authenticate
+sun/text/normalizer/ICUData
+sun/text/normalizer/IntTrie
+sun/text/normalizer/NormalizerDataReader
+sun/text/normalizer/NormalizerImpl
+sun/text/normalizer/NormalizerImpl$AuxTrieImpl
+sun/text/normalizer/NormalizerImpl$DecomposeArgs
+sun/text/normalizer/NormalizerImpl$FCDTrieImpl
+sun/text/normalizer/NormalizerImpl$NormTrieImpl
+sun/text/normalizer/Trie
+sun/text/normalizer/Trie$DataManipulate
+sun/text/normalizer/UTF16
+sun/text/normalizer/UnicodeMatcher
+sun/text/normalizer/UnicodeSet
+sun/text/resources/CollationData
+sun/text/resources/FormatData
+sun/text/resources/en/FormatData_en
+sun/text/resources/en/FormatData_en_US
+sun/util/CoreResourceBundleControl
+sun/util/PreHashedMap
+sun/util/ResourceBundleEnumeration
+sun/util/calendar/AbstractCalendar
+sun/util/calendar/BaseCalendar
+sun/util/calendar/BaseCalendar$Date
+sun/util/calendar/CalendarDate
+sun/util/calendar/CalendarSystem
+sun/util/calendar/CalendarUtils
+sun/util/calendar/Gregorian
+sun/util/calendar/Gregorian$Date
+sun/util/calendar/ZoneInfo
+sun/util/calendar/ZoneInfoFile
+sun/util/calendar/ZoneInfoFile$1
+sun/util/calendar/ZoneInfoFile$Checksum
+sun/util/calendar/ZoneInfoFile$ZoneOffsetTransitionRule
+sun/util/locale/BaseLocale
+sun/util/locale/BaseLocale$Cache
+sun/util/locale/BaseLocale$Key
+sun/util/locale/InternalLocaleBuilder
+sun/util/locale/InternalLocaleBuilder$CaseInsensitiveChar
+sun/util/locale/LanguageTag
+sun/util/locale/LocaleObjectCache
+sun/util/locale/LocaleObjectCache$CacheEntry
+sun/util/locale/LocaleUtils
+sun/util/locale/ParseStatus
+sun/util/locale/StringTokenIterator
+sun/util/locale/provider/AuxLocaleProviderAdapter
+sun/util/locale/provider/AuxLocaleProviderAdapter$NullProvider
+sun/util/locale/provider/AvailableLanguageTags
+sun/util/locale/provider/CalendarDataProviderImpl
+sun/util/locale/provider/CalendarDataUtility
+sun/util/locale/provider/CalendarDataUtility$CalendarWeekParameterGetter
+sun/util/locale/provider/CalendarProviderImpl
+sun/util/locale/provider/CollatorProviderImpl
+sun/util/locale/provider/CurrencyNameProviderImpl
+sun/util/locale/provider/DateFormatSymbolsProviderImpl
+sun/util/locale/provider/DecimalFormatSymbolsProviderImpl
+sun/util/locale/provider/JRELocaleProviderAdapter
+sun/util/locale/provider/JRELocaleProviderAdapter$1
+sun/util/locale/provider/LocaleDataMetaInfo
+sun/util/locale/provider/LocaleProviderAdapter
+sun/util/locale/provider/LocaleProviderAdapter$1
+sun/util/locale/provider/LocaleProviderAdapter$Type
+sun/util/locale/provider/LocaleResources
+sun/util/locale/provider/LocaleResources$ResourceReference
+sun/util/locale/provider/LocaleServiceProviderPool
+sun/util/locale/provider/LocaleServiceProviderPool$LocalizedObjectGetter
+sun/util/locale/provider/NumberFormatProviderImpl
+sun/util/locale/provider/ResourceBundleBasedAdapter
+sun/util/locale/provider/SPILocaleProviderAdapter
+sun/util/locale/provider/SPILocaleProviderAdapter$1
+sun/util/locale/provider/TimeZoneNameProviderImpl
+sun/util/locale/provider/TimeZoneNameUtility
+sun/util/locale/provider/TimeZoneNameUtility$TimeZoneNameGetter
+sun/util/logging/LoggingProxy
+sun/util/logging/LoggingSupport
+sun/util/logging/LoggingSupport$1
+sun/util/logging/LoggingSupport$2
+sun/util/logging/PlatformLogger
+sun/util/logging/PlatformLogger$1
+sun/util/logging/PlatformLogger$DefaultLoggerProxy
+sun/util/logging/PlatformLogger$JavaLoggerProxy
+sun/util/logging/PlatformLogger$Level
+sun/util/logging/PlatformLogger$LoggerProxy
+sun/util/logging/resources/logging
+sun/util/resources/CalendarData
+sun/util/resources/CurrencyNames
+sun/util/resources/LocaleData
+sun/util/resources/LocaleData$1
+sun/util/resources/LocaleData$LocaleDataResourceBundleControl
+sun/util/resources/LocaleNamesBundle
+sun/util/resources/OpenListResourceBundle
+sun/util/resources/ParallelListResourceBundle
+sun/util/resources/ParallelListResourceBundle$KeySet
+sun/util/resources/TimeZoneNames
+sun/util/resources/TimeZoneNamesBundle
+sun/util/resources/en/CalendarData_en
+sun/util/resources/en/CurrencyNames_en_US
+sun/util/resources/en/TimeZoneNames_en
+sun/util/spi/CalendarProvider
+# 729efa63b41fc759
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/cmm/CIEXYZ.pf b/love2dToAPK/tools/tools/jdk-win/jre/lib/cmm/CIEXYZ.pf
new file mode 100644
index 0000000..db3ba20
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/cmm/CIEXYZ.pf
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/cmm/GRAY.pf b/love2dToAPK/tools/tools/jdk-win/jre/lib/cmm/GRAY.pf
new file mode 100644
index 0000000..e31a4a7
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/cmm/GRAY.pf
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/cmm/LINEAR_RGB.pf b/love2dToAPK/tools/tools/jdk-win/jre/lib/cmm/LINEAR_RGB.pf
new file mode 100644
index 0000000..eadae04
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/cmm/LINEAR_RGB.pf
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/cmm/PYCC.pf b/love2dToAPK/tools/tools/jdk-win/jre/lib/cmm/PYCC.pf
new file mode 100644
index 0000000..1c49e0b
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/cmm/PYCC.pf
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/cmm/sRGB.pf b/love2dToAPK/tools/tools/jdk-win/jre/lib/cmm/sRGB.pf
new file mode 100644
index 0000000..7f9d18d
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/cmm/sRGB.pf
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/content-types.properties b/love2dToAPK/tools/tools/jdk-win/jre/lib/content-types.properties
new file mode 100644
index 0000000..8949352
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/content-types.properties
@@ -0,0 +1,276 @@
+#sun.net.www MIME content-types table
+#
+# Property fields:
+#
+# <description> ::= 'description' '=' <descriptive string>
+# <extensions> ::= 'file_extensions' '=' <comma-delimited list, include '.'>
+# <image> ::= 'icon' '=' <filename of icon image>
+# <action> ::= 'browser' | 'application' | 'save' | 'unknown'
+# <application> ::= 'application' '=' <command line template>
+#
+
+#
+# The "we don't know anything about this data" type(s).
+# Used internally to mark unrecognized types.
+#
+content/unknown: description=Unknown Content
+unknown/unknown: description=Unknown Data Type
+
+#
+# The template we should use for temporary files when launching an application
+# to view a document of given type.
+#
+temp.file.template: c:\\temp\\%s
+
+#
+# The "real" types.
+#
+application/octet-stream: \
+ description=Generic Binary Stream;\
+ file_extensions=.saveme,.dump,.hqx,.arc,.obj,.lib,.bin,.exe,.zip,.gz
+
+application/oda: \
+ description=ODA Document;\
+ file_extensions=.oda
+
+application/pdf: \
+ description=Adobe PDF Format;\
+ file_extensions=.pdf
+
+application/postscript: \
+ description=Postscript File;\
+ file_extensions=.eps,.ai,.ps;\
+ icon=ps
+
+application/rtf: \
+ description=Wordpad Document;\
+ file_extensions=.rtf;\
+ action=application;\
+ application=wordpad.exe %s
+
+application/x-dvi: \
+ description=TeX DVI File;\
+ file_extensions=.dvi
+
+application/x-hdf: \
+ description=Hierarchical Data Format;\
+ file_extensions=.hdf;\
+ action=save
+
+application/x-latex: \
+ description=LaTeX Source;\
+ file_extensions=.latex
+
+application/x-netcdf: \
+ description=Unidata netCDF Data Format;\
+ file_extensions=.nc,.cdf;\
+ action=save
+
+application/x-tex: \
+ description=TeX Source;\
+ file_extensions=.tex
+
+application/x-texinfo: \
+ description=Gnu Texinfo;\
+ file_extensions=.texinfo,.texi
+
+application/x-troff: \
+ description=Troff Source;\
+ file_extensions=.t,.tr,.roff
+
+application/x-troff-man: \
+ description=Troff Manpage Source;\
+ file_extensions=.man
+
+application/x-troff-me: \
+ description=Troff ME Macros;\
+ file_extensions=.me
+
+application/x-troff-ms: \
+ description=Troff MS Macros;\
+ file_extensions=.ms
+
+application/x-wais-source: \
+ description=Wais Source;\
+ file_extensions=.src,.wsrc
+
+application/zip: \
+ description=Zip File;\
+ file_extensions=.zip;\
+ icon=zip;\
+ action=save
+
+application/x-bcpio: \
+ description=Old Binary CPIO Archive;\
+ file_extensions=.bcpio;\
+ action=save
+
+application/x-cpio: \
+ description=Unix CPIO Archive;\
+ file_extensions=.cpio;\
+ action=save
+
+application/x-gtar: \
+ description=Gnu Tar Archive;\
+ file_extensions=.gtar;\
+ icon=tar;\
+ action=save
+
+application/x-shar: \
+ description=Shell Archive;\
+ file_extensions=.sh,.shar;\
+ action=save
+
+application/x-sv4cpio: \
+ description=SVR4 CPIO Archive;\
+ file_extensions=.sv4cpio;\
+ action=save
+
+application/x-sv4crc: \
+ description=SVR4 CPIO with CRC;\
+ file_extensions=.sv4crc;\
+ action=save
+
+application/x-tar: \
+ description=Tar Archive;\
+ file_extensions=.tar;\
+ icon=tar;\
+ action=save
+
+application/x-ustar: \
+ description=US Tar Archive;\
+ file_extensions=.ustar;\
+ action=save
+
+audio/basic: \
+ description=Basic Audio;\
+ file_extensions=.snd,.au;\
+ icon=audio
+
+audio/x-aiff: \
+ description=Audio Interchange Format File;\
+ file_extensions=.aifc,.aif,.aiff;\
+ icon=aiff
+
+audio/x-wav: \
+ description=Wav Audio;\
+ file_extensions=.wav;\
+ icon=wav;\
+ action=application;\
+ application=mplayer.exe %s
+
+image/gif: \
+ description=GIF Image;\
+ file_extensions=.gif;\
+ icon=gif;\
+ action=browser
+
+image/ief: \
+ description=Image Exchange Format;\
+ file_extensions=.ief
+
+image/jpeg: \
+ description=JPEG Image;\
+ file_extensions=.jfif,.jfif-tbnl,.jpe,.jpg,.jpeg;\
+ icon=jpeg;\
+ action=browser
+
+image/tiff: \
+ description=TIFF Image;\
+ file_extensions=.tif,.tiff;\
+ icon=tiff
+
+image/vnd.fpx: \
+ description=FlashPix Image;\
+ file_extensions=.fpx,.fpix
+
+image/x-cmu-rast: \
+ description=CMU Raster Image;\
+ file_extensions=.ras
+
+image/x-portable-anymap: \
+ description=PBM Anymap Image;\
+ file_extensions=.pnm
+
+image/x-portable-bitmap: \
+ description=PBM Bitmap Image;\
+ file_extensions=.pbm
+
+image/x-portable-graymap: \
+ description=PBM Graymap Image;\
+ file_extensions=.pgm
+
+image/x-portable-pixmap: \
+ description=PBM Pixmap Image;\
+ file_extensions=.ppm
+
+image/x-rgb: \
+ description=RGB Image;\
+ file_extensions=.rgb
+
+image/x-xbitmap: \
+ description=X Bitmap Image;\
+ file_extensions=.xbm,.xpm
+
+image/x-xwindowdump: \
+ description=X Window Dump Image;\
+ file_extensions=.xwd
+
+image/png: \
+ description=PNG Image;\
+ file_extensions=.png;\
+ icon=png;\
+ action=browser
+
+image/bmp: \
+ description=Bitmap Image;\
+ file_extensions=.bmp;
+
+text/html: \
+ description=HTML Document;\
+ file_extensions=.htm,.html;\
+ icon=html
+
+text/plain: \
+ description=Plain Text;\
+ file_extensions=.text,.c,.cc,.c++,.h,.pl,.txt,.java,.el;\
+ icon=text;\
+ action=browser
+
+text/tab-separated-values: \
+ description=Tab Separated Values Text;\
+ file_extensions=.tsv
+
+text/x-setext: \
+ description=Structure Enhanced Text;\
+ file_extensions=.etx
+
+video/mpeg: \
+ description=MPEG Video Clip;\
+ file_extensions=.mpg,.mpe,.mpeg;\
+ icon=mpeg
+
+video/quicktime: \
+ description=QuickTime Video Clip;\
+ file_extensions=.mov,.qt
+
+application/x-troff-msvideo: \
+ description=AVI Video;\
+ file_extensions=.avi;\
+ icon=avi;\
+ action=application;\
+ application=mplayer.exe %s
+
+video/x-sgi-movie: \
+ description=SGI Movie;\
+ file_extensions=.movie,.mv
+
+message/rfc822: \
+ description=Internet Email Message;\
+ file_extensions=.mime
+
+application/xml: \
+ description=XML document;\
+ file_extensions=.xml
+
+
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/currency.data b/love2dToAPK/tools/tools/jdk-win/jre/lib/currency.data
new file mode 100644
index 0000000..1f8cf4b
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/currency.data
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/deploy.jar b/love2dToAPK/tools/tools/jdk-win/jre/lib/deploy.jar
new file mode 100644
index 0000000..5d589ad
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/deploy.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/access-bridge.jar b/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/access-bridge.jar
new file mode 100644
index 0000000..55bcb49
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/access-bridge.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/cldrdata.jar b/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/cldrdata.jar
new file mode 100644
index 0000000..df22411
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/cldrdata.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/dnsns.jar b/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/dnsns.jar
new file mode 100644
index 0000000..cd08a9e
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/dnsns.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/jaccess.jar b/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/jaccess.jar
new file mode 100644
index 0000000..aa2f72b
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/jaccess.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/jfxrt.jar b/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/jfxrt.jar
new file mode 100644
index 0000000..640d61e
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/jfxrt.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/localedata.jar b/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/localedata.jar
new file mode 100644
index 0000000..be43f82
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/localedata.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/meta-index b/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/meta-index
new file mode 100644
index 0000000..0fa753b
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/meta-index
@@ -0,0 +1,71 @@
+% VERSION 2
+% WARNING: this file is auto-generated; do not edit
+% UNSUPPORTED: this file and its format may change and/or
+% may be removed in a future release
+! access-bridge-32.jar
+com/sun/java/accessibility/
+! access-bridge.jar
+com/sun/java/accessibility/
+! cldrdata.jar
+sun/text
+sun/util
+# dnsns.jar
+META-INF/services/sun.net.spi.nameservice.NameServiceDescriptor
+sun/net
+! jaccess.jar
+com/sun/java/accessibility/
+# localedata.jar
+sun/text
+sun/util
+# nashorn.jar
+jdk/nashorn
+META-INF/services/javax.script.ScriptEngineFactory
+jdk/internal
+# sunec.jar
+sun/security
+META-INF/ORACLE_J.RSA
+META-INF/ORACLE_J.SF
+# sunjce_provider.jar
+com/sun/crypto/
+META-INF/ORACLE_J.RSA
+META-INF/ORACLE_J.SF
+# sunmscapi.jar
+sun/security
+META-INF/ORACLE_J.RSA
+META-INF/ORACLE_J.SF
+# sunpkcs11.jar
+sun/security
+META-INF/ORACLE_J.RSA
+META-INF/ORACLE_J.SF
+# zipfs.jar
+META-INF/services/java.nio.file.spi.FileSystemProvider
+com/sun/nio/
+# jfxrt.jar
+META-INF/INDEX.LIST
+com/sun/deploy/uitoolkit/impl/fx/
+com/sun/glass/events/
+com/sun/glass/ui/
+com/sun/glass/utils/
+com/sun/javafx/
+com/sun/media/jfxmedia/
+com/sun/media/jfxmediaimpl/
+com/sun/openpisces/
+com/sun/pisces/
+com/sun/prism/
+com/sun/scenario/
+com/sun/webkit/
+javafx/animation/
+javafx/application/
+javafx/beans/
+javafx/collections/
+javafx/concurrent/
+javafx/css/
+javafx/embed/swing/
+javafx/event/
+javafx/fxml/
+javafx/geometry/
+javafx/print/
+javafx/scene/
+javafx/stage/
+javafx/util/
+netscape/javascript/
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/nashorn.jar b/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/nashorn.jar
new file mode 100644
index 0000000..d1a74ad
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/nashorn.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/sunec.jar b/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/sunec.jar
new file mode 100644
index 0000000..c65eabc
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/sunec.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/sunjce_provider.jar b/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/sunjce_provider.jar
new file mode 100644
index 0000000..ffa2a70
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/sunjce_provider.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/sunmscapi.jar b/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/sunmscapi.jar
new file mode 100644
index 0000000..deffe57
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/sunmscapi.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/sunpkcs11.jar b/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/sunpkcs11.jar
new file mode 100644
index 0000000..1f662dd
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/sunpkcs11.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/zipfs.jar b/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/zipfs.jar
new file mode 100644
index 0000000..fde41a0
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/ext/zipfs.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/flavormap.properties b/love2dToAPK/tools/tools/jdk-win/jre/lib/flavormap.properties
new file mode 100644
index 0000000..c80f1cf
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/flavormap.properties
@@ -0,0 +1,77 @@
+#
+# This properties file is used to initialize the default
+# java.awt.datatransfer.SystemFlavorMap. It contains the Win32 platform-
+# specific, default mappings between common Win32 Clipboard atoms and platform-
+# independent MIME type strings, which will be converted into
+# java.awt.datatransfer.DataFlavors.
+#
+# These default mappings may be augmented by specifying the
+#
+# AWT.DnD.flavorMapFileURL
+#
+# property in the appropriate awt.properties file. The specified properties URL
+# will be loaded into the SystemFlavorMap.
+#
+# The standard format is:
+#
+# <native>=<MIME type>
+#
+# <native> should be a string identifier that the native platform will
+# recognize as a valid data format. <MIME type> should specify both a MIME
+# primary type and a MIME subtype separated by a '/'. The MIME type may include
+# parameters, where each parameter is a key/value pair separated by '=', and
+# where each parameter to the MIME type is separated by a ';'.
+#
+# Because SystemFlavorMap implements FlavorTable, developers are free to
+# duplicate both native keys and DataFlavor values. If a mapping contains a
+# duplicate key or value, earlier mappings which included this key or value
+# will be preferred.
+#
+# Mappings whose values specify DataFlavors with primary MIME types of
+# "text", and which support the charset parameter, should specify the exact
+# format in which the native platform expects the data. The "charset"
+# parameter specifies the char to byte encoding, the "eoln" parameter
+# specifies the end-of-line marker, and the "terminators" parameter specifies
+# the number of terminating NUL bytes. Note that "eoln" and "terminators"
+# are not standardized MIME type parameters. They are specific to this file
+# format ONLY. They will not appear in any of the DataFlavors returned by the
+# SystemFlavorMap at the Java level.
+#
+# If the "charset" parameter is omitted, or has zero length, the platform
+# default encoding is assumed. If the "eoln" parameter is omitted, or has
+# zero length, "\n" is assumed. If the "terminators" parameter is omitted,
+# or has a value less than zero, zero is assumed.
+#
+# Upon initialization, the data transfer subsystem will record the specified
+# details of the native text format, but the default SystemFlavorMap will
+# present a large set of synthesized DataFlavors which map, in both
+# directions, to the native. After receiving data from the application in one
+# of the synthetic DataFlavors, the data transfer subsystem will transform
+# the data stream into the format specified in this file before passing the
+# transformed stream to the native system.
+#
+# Mappings whose values specify DataFlavors with primary MIME types of
+# "text", but which do not support the charset parameter, will be treated as
+# opaque, 8-bit data. They will not undergo any transformation process, and
+# any "charset", "eoln", or "terminators" parameters specified in this file
+# will be ignored.
+#
+# See java.awt.datatransfer.DataFlavor.selectBestTextFlavor for a list of
+# text flavors which support the charset parameter.
+
+UNICODE\ TEXT=text/plain;charset=utf-16le;eoln="\r\n";terminators=2
+TEXT=text/plain;eoln="\r\n";terminators=1
+HTML\ Format=text/html;charset=utf-8;eoln="\r\n";terminators=1
+Rich\ Text\ Format=text/rtf
+HDROP=application/x-java-file-list;class=java.util.List
+PNG=image/x-java-image;class=java.awt.Image
+JFIF=image/x-java-image;class=java.awt.Image
+DIB=image/x-java-image;class=java.awt.Image
+ENHMETAFILE=image/x-java-image;class=java.awt.Image
+METAFILEPICT=image/x-java-image;class=java.awt.Image
+LOCALE=application/x-java-text-encoding;class="[B"
+UniformResourceLocator=application/x-java-url;class=java.net.URL
+UniformResourceLocator=text/uri-list;eoln="\r\n";terminators=1
+UniformResourceLocator=text/plain;eoln="\r\n";terminators=1
+FileGroupDescriptorW=application/x-java-file-list;class=java.util.List
+FileGroupDescriptor=application/x-java-file-list;class=java.util.List
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/fontconfig.bfc b/love2dToAPK/tools/tools/jdk-win/jre/lib/fontconfig.bfc
new file mode 100644
index 0000000..d535ac9
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/fontconfig.bfc
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/fontconfig.properties.src b/love2dToAPK/tools/tools/jdk-win/jre/lib/fontconfig.properties.src
new file mode 100644
index 0000000..9e2d5ec
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/fontconfig.properties.src
@@ -0,0 +1,300 @@
+#
+#
+# Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+# ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+
+# Version
+
+version=1
+
+# Component Font Mappings
+
+allfonts.chinese-ms936=SimSun
+allfonts.chinese-ms936-extb=SimSun-ExtB
+allfonts.chinese-gb18030=SimSun-18030
+allfonts.chinese-gb18030-extb=SimSun-ExtB
+allfonts.chinese-hkscs=MingLiU_HKSCS
+allfonts.chinese-ms950-extb=MingLiU-ExtB
+allfonts.devanagari=Mangal
+allfonts.dingbats=Wingdings
+allfonts.lucida=Lucida Sans Regular
+allfonts.symbol=Symbol
+allfonts.thai=Lucida Sans Regular
+allfonts.georgian=Sylfaen
+
+serif.plain.alphabetic=Times New Roman
+serif.plain.chinese-ms950=MingLiU
+serif.plain.chinese-ms950-extb=MingLiU-ExtB
+serif.plain.hebrew=David
+serif.plain.japanese=MS Mincho
+serif.plain.korean=Batang
+
+serif.bold.alphabetic=Times New Roman Bold
+serif.bold.chinese-ms950=PMingLiU
+serif.bold.chinese-ms950-extb=PMingLiU-ExtB
+serif.bold.hebrew=David Bold
+serif.bold.japanese=MS Mincho
+serif.bold.korean=Batang
+
+serif.italic.alphabetic=Times New Roman Italic
+serif.italic.chinese-ms950=PMingLiU
+serif.italic.chinese-ms950-extb=PMingLiU-ExtB
+serif.italic.hebrew=David
+serif.italic.japanese=MS Mincho
+serif.italic.korean=Batang
+
+serif.bolditalic.alphabetic=Times New Roman Bold Italic
+serif.bolditalic.chinese-ms950=PMingLiU
+serif.bolditalic.chinese-ms950-extb=PMingLiU-ExtB
+serif.bolditalic.hebrew=David Bold
+serif.bolditalic.japanese=MS Mincho
+serif.bolditalic.korean=Batang
+
+sansserif.plain.alphabetic=Arial
+sansserif.plain.chinese-ms950=MingLiU
+sansserif.plain.chinese-ms950-extb=MingLiU-ExtB
+sansserif.plain.hebrew=David
+sansserif.plain.japanese=MS Gothic
+sansserif.plain.korean=Gulim
+
+sansserif.bold.alphabetic=Arial Bold
+sansserif.bold.chinese-ms950=PMingLiU
+sansserif.bold.chinese-ms950-extb=PMingLiU-ExtB
+sansserif.bold.hebrew=David Bold
+sansserif.bold.japanese=MS Gothic
+sansserif.bold.korean=Gulim
+
+sansserif.italic.alphabetic=Arial Italic
+sansserif.italic.chinese-ms950=PMingLiU
+sansserif.italic.chinese-ms950-extb=PMingLiU-ExtB
+sansserif.italic.hebrew=David
+sansserif.italic.japanese=MS Gothic
+sansserif.italic.korean=Gulim
+
+sansserif.bolditalic.alphabetic=Arial Bold Italic
+sansserif.bolditalic.chinese-ms950=PMingLiU
+sansserif.bolditalic.chinese-ms950-extb=PMingLiU-ExtB
+sansserif.bolditalic.hebrew=David Bold
+sansserif.bolditalic.japanese=MS Gothic
+sansserif.bolditalic.korean=Gulim
+
+monospaced.plain.alphabetic=Courier New
+monospaced.plain.chinese-ms950=MingLiU
+monospaced.plain.chinese-ms950-extb=MingLiU-ExtB
+monospaced.plain.hebrew=Courier New
+monospaced.plain.japanese=MS Gothic
+monospaced.plain.korean=GulimChe
+
+monospaced.bold.alphabetic=Courier New Bold
+monospaced.bold.chinese-ms950=PMingLiU
+monospaced.bold.chinese-ms950-extb=PMingLiU-ExtB
+monospaced.bold.hebrew=Courier New Bold
+monospaced.bold.japanese=MS Gothic
+monospaced.bold.korean=GulimChe
+
+monospaced.italic.alphabetic=Courier New Italic
+monospaced.italic.chinese-ms950=PMingLiU
+monospaced.italic.chinese-ms950-extb=PMingLiU-ExtB
+monospaced.italic.hebrew=Courier New
+monospaced.italic.japanese=MS Gothic
+monospaced.italic.korean=GulimChe
+
+monospaced.bolditalic.alphabetic=Courier New Bold Italic
+monospaced.bolditalic.chinese-ms950=PMingLiU
+monospaced.bolditalic.chinese-ms950-extb=PMingLiU-ExtB
+monospaced.bolditalic.hebrew=Courier New Bold
+monospaced.bolditalic.japanese=MS Gothic
+monospaced.bolditalic.korean=GulimChe
+
+dialog.plain.alphabetic=Arial
+dialog.plain.chinese-ms950=MingLiU
+dialog.plain.chinese-ms950-extb=MingLiU-ExtB
+dialog.plain.hebrew=David
+dialog.plain.japanese=MS Gothic
+dialog.plain.korean=Gulim
+
+dialog.bold.alphabetic=Arial Bold
+dialog.bold.chinese-ms950=PMingLiU
+dialog.bold.chinese-ms950-extb=PMingLiU-ExtB
+dialog.bold.hebrew=David Bold
+dialog.bold.japanese=MS Gothic
+dialog.bold.korean=Gulim
+
+dialog.italic.alphabetic=Arial Italic
+dialog.italic.chinese-ms950=PMingLiU
+dialog.italic.chinese-ms950-extb=PMingLiU-ExtB
+dialog.italic.hebrew=David
+dialog.italic.japanese=MS Gothic
+dialog.italic.korean=Gulim
+
+dialog.bolditalic.alphabetic=Arial Bold Italic
+dialog.bolditalic.chinese-ms950=PMingLiU
+dialog.bolditalic.chinese-ms950-extb=PMingLiU-ExtB
+dialog.bolditalic.hebrew=David Bold
+dialog.bolditalic.japanese=MS Gothic
+dialog.bolditalic.korean=Gulim
+
+dialoginput.plain.alphabetic=Courier New
+dialoginput.plain.chinese-ms950=MingLiU
+dialoginput.plain.chinese-ms950-extb=MingLiU-ExtB
+dialoginput.plain.hebrew=David
+dialoginput.plain.japanese=MS Gothic
+dialoginput.plain.korean=Gulim
+
+dialoginput.bold.alphabetic=Courier New Bold
+dialoginput.bold.chinese-ms950=PMingLiU
+dialoginput.bold.chinese-ms950-extb=PMingLiU-ExtB
+dialoginput.bold.hebrew=David Bold
+dialoginput.bold.japanese=MS Gothic
+dialoginput.bold.korean=Gulim
+
+dialoginput.italic.alphabetic=Courier New Italic
+dialoginput.italic.chinese-ms950=PMingLiU
+dialoginput.italic.chinese-ms950-extb=PMingLiU-ExtB
+dialoginput.italic.hebrew=David
+dialoginput.italic.japanese=MS Gothic
+dialoginput.italic.korean=Gulim
+
+dialoginput.bolditalic.alphabetic=Courier New Bold Italic
+dialoginput.bolditalic.chinese-ms950=PMingLiU
+dialoginput.bolditalic.chinese-ms950-extb=PMingLiU-ExtB
+dialoginput.bolditalic.hebrew=David Bold
+dialoginput.bolditalic.japanese=MS Gothic
+dialoginput.bolditalic.korean=Gulim
+
+# Search Sequences
+
+sequence.allfonts=alphabetic/default,dingbats,symbol
+
+sequence.serif.GBK=alphabetic,chinese-ms936,dingbats,symbol,chinese-ms936-extb
+sequence.sansserif.GBK=alphabetic,chinese-ms936,dingbats,symbol,chinese-ms936-extb
+sequence.monospaced.GBK=chinese-ms936,alphabetic,dingbats,symbol,chinese-ms936-extb
+sequence.dialog.GBK=alphabetic,chinese-ms936,dingbats,symbol,chinese-ms936-extb
+sequence.dialoginput.GBK=alphabetic,chinese-ms936,dingbats,symbol,chinese-ms936-extb
+
+sequence.serif.GB18030=alphabetic,chinese-gb18030,dingbats,symbol,chinese-gb18030-extb
+sequence.sansserif.GB18030=alphabetic,chinese-gb18030,dingbats,symbol,chinese-gb18030-extb
+sequence.monospaced.GB18030=chinese-gb18030,alphabetic,dingbats,symbol,chinese-gb18030-extb
+sequence.dialog.GB18030=alphabetic,chinese-gb18030,dingbats,symbol,chinese-gb18030-extb
+sequence.dialoginput.GB18030=alphabetic,chinese-gb18030,dingbats,symbol,chinese-gb18030-extb
+
+sequence.serif.x-windows-950=alphabetic,chinese-ms950,dingbats,symbol,chinese-ms950-extb
+sequence.sansserif.x-windows-950=alphabetic,chinese-ms950,dingbats,symbol,chinese-ms950-extb
+sequence.monospaced.x-windows-950=chinese-ms950,alphabetic,dingbats,symbol,chinese-ms950-extb
+sequence.dialog.x-windows-950=alphabetic,chinese-ms950,dingbats,symbol,chinese-ms950-extb
+sequence.dialoginput.x-windows-950=alphabetic,chinese-ms950,dingbats,symbol,chinese-ms950-extb
+
+sequence.serif.x-MS950-HKSCS=alphabetic,chinese-ms950,chinese-hkscs,dingbats,symbol,chinese-ms950-extb
+sequence.sansserif.x-MS950-HKSCS=alphabetic,chinese-ms950,chinese-hkscs,dingbats,symbol,chinese-ms950-extb
+sequence.monospaced.x-MS950-HKSCS=chinese-ms950,alphabetic,chinese-hkscs,dingbats,symbol,chinese-ms950-extb
+sequence.dialog.x-MS950-HKSCS=alphabetic,chinese-ms950,chinese-hkscs,dingbats,symbol,chinese-ms950-extb
+sequence.dialoginput.x-MS950-HKSCS=alphabetic,chinese-ms950,chinese-hkscs,dingbats,symbol,chinese-ms950-extb
+
+sequence.serif.x-MS950-HKSCS-XP=alphabetic,chinese-ms950,chinese-hkscs,dingbats,symbol,chinese-ms950-extb
+sequence.sansserif.x-MS950-HKSCS-XP=alphabetic,chinese-ms950,chinese-hkscs,dingbats,symbol,chinese-ms950-extb
+sequence.monospaced.x-MS950-HKSCS-XP=chinese-ms950,alphabetic,chinese-hkscs,dingbats,symbol,chinese-ms950-extb
+sequence.dialog.x-MS950-HKSCS-XP=alphabetic,chinese-ms950,chinese-hkscs,dingbats,symbol,chinese-ms950-extb
+sequence.dialoginput.x-MS950-HKSCS-XP=alphabetic,chinese-ms950,chinese-hkscs,dingbats,symbol,chinese-ms950-extb
+
+sequence.allfonts.UTF-8.hi=alphabetic/1252,devanagari,dingbats,symbol
+sequence.allfonts.UTF-8.ja=alphabetic,japanese,devanagari,dingbats,symbol
+
+sequence.allfonts.windows-1255=hebrew,alphabetic/1252,dingbats,symbol
+
+sequence.serif.windows-31j=alphabetic,japanese,dingbats,symbol
+sequence.sansserif.windows-31j=alphabetic,japanese,dingbats,symbol
+sequence.monospaced.windows-31j=japanese,alphabetic,dingbats,symbol
+sequence.dialog.windows-31j=alphabetic,japanese,dingbats,symbol
+sequence.dialoginput.windows-31j=alphabetic,japanese,dingbats,symbol
+
+sequence.serif.x-windows-949=alphabetic,korean,dingbats,symbol
+sequence.sansserif.x-windows-949=alphabetic,korean,dingbats,symbol
+sequence.monospaced.x-windows-949=korean,alphabetic,dingbats,symbol
+sequence.dialog.x-windows-949=alphabetic,korean,dingbats,symbol
+sequence.dialoginput.x-windows-949=alphabetic,korean,dingbats,symbol
+
+sequence.allfonts.x-windows-874=alphabetic,thai,dingbats,symbol
+
+sequence.fallback=lucida,\
+ chinese-ms950,chinese-hkscs,chinese-ms936,chinese-gb18030,\
+ japanese,korean,chinese-ms950-extb,chinese-ms936-extb,georgian
+
+# Exclusion Ranges
+
+exclusion.alphabetic=0700-1e9f,1f00-20ab,20ad-f8ff
+exclusion.chinese-gb18030=0390-03d6,2200-22ef,2701-27be
+exclusion.hebrew=0041-005a,0060-007a,007f-00ff,20ac-20ac
+
+# Monospaced to Proportional width variant mapping
+# (Experimental private syntax)
+proportional.MS_Gothic=MS PGothic
+proportional.MS_Mincho=MS PMincho
+proportional.MingLiU=PMingLiU
+proportional.MingLiU-ExtB=PMingLiU-ExtB
+
+# Font File Names
+
+filename.Arial=ARIAL.TTF
+filename.Arial_Bold=ARIALBD.TTF
+filename.Arial_Italic=ARIALI.TTF
+filename.Arial_Bold_Italic=ARIALBI.TTF
+
+filename.Courier_New=COUR.TTF
+filename.Courier_New_Bold=COURBD.TTF
+filename.Courier_New_Italic=COURI.TTF
+filename.Courier_New_Bold_Italic=COURBI.TTF
+
+filename.Times_New_Roman=TIMES.TTF
+filename.Times_New_Roman_Bold=TIMESBD.TTF
+filename.Times_New_Roman_Italic=TIMESI.TTF
+filename.Times_New_Roman_Bold_Italic=TIMESBI.TTF
+
+filename.SimSun=SIMSUN.TTC
+filename.SimSun-18030=SIMSUN18030.TTC
+filename.SimSun-ExtB=SIMSUNB.TTF
+
+filename.MingLiU=MINGLIU.TTC
+filename.MingLiU-ExtB=MINGLIUB.TTC
+filename.PMingLiU=MINGLIU.TTC
+filename.PMingLiU-ExtB=MINGLIUB.TTC
+filename.MingLiU_HKSCS=hkscsm3u.ttf
+
+filename.David=DAVID.TTF
+filename.David_Bold=DAVIDBD.TTF
+
+filename.MS_Mincho=MSMINCHO.TTC
+filename.MS_PMincho=MSMINCHO.TTC
+filename.MS_Gothic=MSGOTHIC.TTC
+filename.MS_PGothic=MSGOTHIC.TTC
+
+filename.Gulim=gulim.TTC
+filename.Batang=batang.TTC
+filename.GulimChe=gulim.TTC
+
+filename.Lucida_Sans_Regular=LucidaSansRegular.ttf
+filename.Mangal=MANGAL.TTF
+filename.Symbol=SYMBOL.TTF
+filename.Wingdings=WINGDING.TTF
+
+filename.Sylfaen=sylfaen.ttf
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/hijrah-config-umalqura.properties b/love2dToAPK/tools/tools/jdk-win/jre/lib/hijrah-config-umalqura.properties
new file mode 100644
index 0000000..e45ac32
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/hijrah-config-umalqura.properties
@@ -0,0 +1,369 @@
+# Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+# ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+# This properties file defines a Hijrah calendar variant.
+#
+# Fields:
+#
+# <version> ::= 'version' '=' <version string>
+# <id> ::= 'id' '=' <id string>
+# <type> ::= 'type' '=' <type string>
+# <iso-start> ::= 'iso-start' '=' <start date in the ISO calendar>
+# <year> ::= <yyyy> '=' <nn nn nn nn nn nn nn nn nn nn nn nn>
+#
+# version ... (Required)
+#
+# id ... (Required)
+# Identifies the Java Chronology
+#
+# type ... (Required)
+# Identifies the type of calendar in the standard calendar ID scheme
+# iso-start ... (Required)
+# Specifies the corresponding ISO date to the first Hijrah day
+# in the defined range of dates
+#
+# year ... (Required)
+# Number of days for each month of a Hijrah year
+# * Each line defines a year. The years must be in chronological
+# order and no gap is allowed.
+# * Each line is in the form indicated above. <yyyy> is a Hijrah year and
+# nn is the number of days for a month listed in the order of the months.
+# * Each year must have 12 months.
+# * Each month should be 29 or 30 days long.
+# * There must be one or more space characters between the months.
+#
+
+# Version of this definition
+version=1.8.0_1
+
+# Java chronology ID
+id=Hijrah-umalqura
+
+# Standard calendar type specification
+type=islamic-umalqura
+
+# defines the corresponding ISO date to the earliest Hijrah date
+iso-start=1882-11-12
+
+# 1 2 3 4 5 6 7 8 9 10 11 12
+1300=30 29 30 29 30 29 30 29 30 29 30 29
+1301=30 30 29 30 29 30 29 30 29 30 29 29
+1302=30 30 30 29 30 30 29 29 30 29 29 30
+1303=29 30 30 29 30 30 29 30 29 30 29 29
+1304=29 30 30 29 30 30 30 29 30 29 30 29
+1305=29 29 30 30 29 30 30 29 30 30 29 29
+1306=30 29 30 29 30 29 30 29 30 30 29 30
+1307=29 30 29 30 29 30 29 30 29 30 29 30
+1308=29 30 30 29 30 29 30 29 30 29 29 30
+1309=29 30 30 30 30 29 29 30 29 29 30 29
+1310=30 29 30 30 30 29 30 29 30 29 29 30
+1311=29 30 29 30 30 30 29 30 29 30 29 29
+1312=30 29 30 29 30 30 29 30 30 29 30 29
+1313=29 30 29 30 29 30 29 30 30 30 29 29
+1314=30 30 29 30 29 29 30 29 30 30 29 30
+1315=29 30 30 29 30 29 29 30 29 30 29 30
+1316=29 30 30 30 29 30 29 29 30 29 30 29
+1317=30 29 30 30 29 30 29 30 29 30 29 29
+1318=30 29 30 30 29 30 30 29 30 29 30 29
+1319=29 30 29 30 30 29 30 29 30 30 29 30
+1320=29 30 29 29 30 29 30 29 30 30 30 29
+1321=30 29 30 29 29 30 29 29 30 30 30 30
+1322=29 30 29 30 29 29 29 30 29 30 30 30
+1323=29 30 30 29 30 29 29 29 30 29 30 30
+1324=29 30 30 29 30 29 30 29 29 30 29 30
+1325=30 29 30 29 30 30 29 30 29 30 29 30
+1326=29 29 30 29 30 30 29 30 29 30 30 29
+1327=30 29 29 30 29 30 29 30 30 29 30 30
+1328=29 30 29 29 30 29 29 30 30 30 29 30
+1329=30 29 30 29 29 30 29 29 30 30 29 30
+1330=30 30 29 30 29 29 30 29 29 30 30 29
+1331=30 30 29 30 30 29 29 30 29 30 29 30
+1332=29 30 29 30 30 29 30 29 30 30 29 29
+1333=30 29 29 30 30 29 30 30 29 30 30 29
+1334=29 29 30 29 30 29 30 30 30 29 30 29
+1335=30 29 30 29 29 30 29 30 30 29 30 30
+1336=29 30 29 30 29 29 30 29 30 29 30 30
+1337=30 29 30 29 30 29 29 30 29 30 29 30
+1338=29 30 30 29 30 30 29 29 30 29 30 29
+1339=30 29 30 29 30 30 30 29 30 29 29 30
+1340=29 29 30 29 30 30 30 30 29 30 29 29
+1341=30 29 29 30 29 30 30 30 29 30 30 29
+1342=29 29 30 29 30 29 30 30 29 30 30 29
+1343=30 29 29 30 29 30 29 30 29 30 30 29
+1344=30 29 30 29 30 30 29 29 30 29 30 29
+1345=30 29 30 30 30 29 30 29 29 30 29 29
+1346=30 29 30 30 30 30 29 30 29 29 30 29
+1347=29 30 29 30 30 30 29 30 30 29 29 30
+1348=29 29 30 29 30 30 29 30 30 30 29 29
+1349=30 29 29 30 29 30 30 29 30 30 29 30
+1350=29 30 29 30 29 30 29 29 30 30 29 30
+1351=30 29 30 29 30 29 30 29 29 30 29 30
+1352=30 29 30 30 29 30 29 30 29 29 30 29
+1353=30 29 30 30 30 29 30 29 29 30 29 30
+1354=29 30 29 30 30 29 30 30 29 30 29 29
+1355=30 29 29 30 30 29 30 30 29 30 30 29
+1356=29 30 29 30 29 30 29 30 29 30 30 30
+1357=29 29 30 29 30 29 29 30 29 30 30 30
+1358=29 30 29 30 29 30 29 29 30 29 30 30
+1359=29 30 30 29 30 29 30 29 29 29 30 30
+1360=29 30 30 30 29 30 29 30 29 29 30 29
+1361=30 29 30 30 29 30 30 29 29 30 29 30
+1362=29 30 29 30 29 30 30 29 30 29 30 29
+1363=30 29 30 29 30 29 30 29 30 29 30 30
+1364=29 30 29 30 29 29 30 29 30 29 30 30
+1365=30 30 29 29 30 29 29 30 29 30 29 30
+1366=30 30 29 30 29 30 29 29 30 29 30 29
+1367=30 30 29 30 30 29 30 29 29 30 29 30
+1368=29 30 29 30 30 30 29 29 30 29 30 29
+1369=30 29 30 29 30 30 29 30 29 30 30 29
+1370=30 29 29 30 29 30 29 30 29 30 30 30
+1371=29 30 29 29 30 29 30 29 30 29 30 30
+1372=30 29 29 30 29 30 29 29 30 29 30 30
+1373=30 29 30 29 30 29 30 29 29 30 29 30
+1374=30 29 30 30 29 30 29 30 29 29 30 29
+1375=30 29 30 30 29 30 30 29 30 29 30 29
+1376=29 30 29 30 29 30 30 30 29 30 29 30
+1377=29 29 30 29 29 30 30 30 29 30 30 29
+1378=30 29 29 29 30 29 30 30 29 30 30 30
+1379=29 30 29 29 29 30 29 30 30 29 30 30
+1380=29 30 29 30 29 30 29 30 29 30 29 30
+1381=29 30 29 30 30 29 30 29 30 29 29 30
+1382=29 30 29 30 30 29 30 30 29 30 29 29
+1383=30 29 29 30 30 30 29 30 30 29 30 29
+1384=29 30 29 29 30 30 29 30 30 30 29 30
+1385=29 29 30 29 29 30 30 29 30 30 30 29
+1386=30 29 29 30 29 29 30 30 29 30 30 29
+1387=30 29 30 29 30 29 30 29 30 29 30 29
+1388=30 30 29 30 29 30 29 30 29 30 29 29
+1389=30 30 29 30 30 29 30 30 29 29 30 29
+1390=29 30 29 30 30 30 29 30 29 30 29 30
+1391=29 29 30 29 30 30 29 30 30 29 30 29
+1392=30 29 29 30 29 30 29 30 30 29 30 30
+1393=29 30 29 29 30 29 30 29 30 29 30 30
+1394=30 29 30 29 29 30 29 30 29 30 29 30
+1395=30 29 30 30 29 30 29 29 30 29 29 30
+1396=30 29 30 30 29 30 30 29 29 30 29 29
+1397=30 29 30 30 29 30 30 30 29 29 29 30
+1398=29 30 29 30 30 29 30 30 29 30 29 29
+1399=30 29 30 29 30 29 30 30 29 30 29 30
+1400=30 29 30 29 29 30 29 30 29 30 29 30
+1401=30 30 29 30 29 29 30 29 29 30 29 30
+1402=30 30 30 29 30 29 29 30 29 29 30 29
+1403=30 30 30 29 30 30 29 29 30 29 29 30
+1404=29 30 30 29 30 30 29 30 29 30 29 29
+1405=30 29 30 29 30 30 30 29 30 29 29 30
+1406=30 29 29 30 29 30 30 29 30 29 30 30
+1407=29 30 29 29 30 29 30 29 30 29 30 30
+1408=30 29 30 29 30 29 29 30 29 29 30 30
+1409=30 30 29 30 29 30 29 29 30 29 29 30
+1410=30 30 29 30 30 29 30 29 29 30 29 29
+1411=30 30 29 30 30 29 30 30 29 29 30 29
+1412=30 29 30 29 30 29 30 30 30 29 29 30
+1413=29 30 29 29 30 29 30 30 30 29 30 29
+1414=30 29 30 29 29 30 29 30 30 29 30 30
+1415=29 30 29 30 29 29 30 29 30 29 30 30
+1416=30 29 30 29 30 29 29 30 29 30 29 30
+1417=30 29 30 30 29 29 30 29 30 29 30 29
+1418=30 29 30 30 29 30 29 30 29 30 29 30
+1419=29 30 29 30 29 30 29 30 30 30 29 29
+1420=29 30 29 29 30 29 30 30 30 30 29 30
+1421=29 29 30 29 29 29 30 30 30 30 29 30
+1422=30 29 29 30 29 29 29 30 30 30 29 30
+1423=30 29 30 29 30 29 29 30 29 30 29 30
+1424=30 29 30 30 29 30 29 29 30 29 30 29
+1425=30 29 30 30 29 30 29 30 30 29 30 29
+1426=29 30 29 30 29 30 30 29 30 30 29 30
+1427=29 29 30 29 30 29 30 30 29 30 30 29
+1428=30 29 29 30 29 29 30 30 30 29 30 30
+1429=29 30 29 29 30 29 29 30 30 29 30 30
+1430=29 30 30 29 29 30 29 30 29 30 29 30
+1431=29 30 30 29 30 29 30 29 30 29 29 30
+1432=29 30 30 30 29 30 29 30 29 30 29 29
+1433=30 29 30 30 29 30 30 29 30 29 30 29
+1434=29 30 29 30 29 30 30 29 30 30 29 29
+1435=30 29 30 29 30 29 30 29 30 30 29 30
+1436=29 30 29 30 29 30 29 30 29 30 29 30
+1437=30 29 30 30 29 29 30 29 30 29 29 30
+1438=30 29 30 30 30 29 29 30 29 29 30 29
+1439=30 29 30 30 30 29 30 29 30 29 29 30
+1440=29 30 29 30 30 30 29 30 29 30 29 29
+1441=30 29 30 29 30 30 29 30 30 29 30 29
+1442=29 30 29 30 29 30 29 30 30 29 30 29
+1443=30 29 30 29 30 29 30 29 30 29 30 30
+1444=29 30 29 30 30 29 29 30 29 30 29 30
+1445=29 30 30 30 29 30 29 29 30 29 29 30
+1446=29 30 30 30 29 30 30 29 29 30 29 29
+1447=30 29 30 30 30 29 30 29 30 29 30 29
+1448=29 30 29 30 30 29 30 30 29 30 29 30
+1449=29 29 30 29 30 29 30 30 29 30 30 29
+1450=30 29 30 29 29 30 29 30 29 30 30 29
+1451=30 30 30 29 29 30 29 29 30 30 29 30
+1452=30 29 30 30 29 29 30 29 29 30 29 30
+1453=30 29 30 30 29 30 29 30 29 29 30 29
+1454=30 29 30 30 29 30 30 29 30 29 30 29
+1455=29 30 29 30 30 29 30 29 30 30 29 30
+1456=29 29 30 29 30 29 30 29 30 30 30 29
+1457=30 29 29 30 29 29 30 29 30 30 30 30
+1458=29 30 29 29 30 29 29 30 29 30 30 30
+1459=29 30 30 29 29 30 29 29 30 29 30 30
+1460=29 30 30 29 30 29 30 29 29 30 29 30
+1461=29 30 30 29 30 29 30 29 30 30 29 29
+1462=30 29 30 29 30 30 29 30 29 30 30 29
+1463=29 30 29 30 29 30 29 30 30 30 29 30
+1464=29 30 29 29 30 29 29 30 30 30 29 30
+1465=30 29 30 29 29 30 29 29 30 30 29 30
+1466=30 30 29 30 29 29 29 30 29 30 30 29
+1467=30 30 29 30 30 29 29 30 29 30 29 30
+1468=29 30 29 30 30 29 30 29 30 29 30 29
+1469=29 30 29 30 30 29 30 30 29 30 29 30
+1470=29 29 30 29 30 30 29 30 30 29 30 29
+1471=30 29 29 30 29 30 29 30 30 29 30 30
+1472=29 30 29 29 30 29 30 29 30 30 29 30
+1473=29 30 29 30 30 29 29 30 29 30 29 30
+1474=29 30 30 29 30 30 29 29 30 29 30 29
+1475=29 30 30 29 30 30 30 29 29 30 29 29
+1476=30 29 30 29 30 30 30 29 30 29 30 29
+1477=29 30 29 29 30 30 30 30 29 30 29 30
+1478=29 29 30 29 30 29 30 30 29 30 30 29
+1479=30 29 29 30 29 30 29 30 29 30 30 29
+1480=30 29 30 29 30 29 30 29 30 29 30 29
+1481=30 29 30 30 29 30 29 30 29 30 29 29
+1482=30 29 30 30 30 30 29 30 29 29 30 29
+1483=29 30 29 30 30 30 29 30 30 29 29 30
+1484=29 29 30 29 30 30 30 29 30 29 30 29
+1485=30 29 29 30 29 30 30 29 30 30 29 30
+1486=29 30 29 29 30 29 30 29 30 30 29 30
+1487=30 29 30 29 30 29 29 30 29 30 29 30
+1488=30 29 30 30 29 30 29 29 30 29 30 29
+1489=30 29 30 30 30 29 30 29 29 30 29 30
+1490=29 30 29 30 30 29 30 30 29 29 30 29
+1491=30 29 29 30 30 29 30 30 29 30 29 30
+1492=29 30 29 29 30 30 29 30 29 30 30 29
+1493=30 29 30 29 30 29 29 30 29 30 30 30
+1494=29 30 29 30 29 30 29 29 29 30 30 30
+1495=29 30 30 29 30 29 29 30 29 29 30 30
+1496=29 30 30 30 29 30 29 29 30 29 29 30
+1497=30 29 30 30 29 30 29 30 29 30 29 30
+1498=29 30 29 30 29 30 30 29 30 29 30 29
+1499=30 29 30 29 29 30 30 29 30 29 30 30
+1500=29 30 29 30 29 29 30 29 30 29 30 30
+1501=30 29 30 29 30 29 29 29 30 29 30 30
+1502=30 30 29 30 29 30 29 29 29 30 30 29
+1503=30 30 29 30 30 29 30 29 29 29 30 30
+1504=29 30 29 30 30 30 29 29 30 29 30 29
+1505=30 29 30 29 30 30 29 30 29 30 30 29
+1506=29 30 29 29 30 30 29 30 30 29 30 30
+1507=29 29 30 29 29 30 30 29 30 29 30 30
+1508=30 29 29 30 29 30 29 29 30 29 30 30
+1509=30 29 30 29 30 29 30 29 29 30 29 30
+1510=30 29 30 30 29 30 29 30 29 29 30 29
+1511=30 29 30 30 29 30 30 29 30 29 29 30
+1512=29 30 29 30 29 30 30 30 29 30 29 30
+1513=29 29 29 30 29 30 30 30 29 30 30 29
+1514=30 29 29 29 30 29 30 30 29 30 30 30
+1515=29 29 30 29 29 30 29 30 30 29 30 30
+1516=29 30 29 30 29 29 30 29 30 29 30 30
+1517=29 30 29 30 29 30 30 29 29 30 29 30
+1518=29 30 29 30 30 29 30 30 29 30 29 29
+1519=30 29 29 30 30 30 29 30 30 29 30 29
+1520=29 30 29 29 30 30 30 29 30 30 29 30
+1521=29 29 29 30 29 30 30 29 30 30 29 30
+1522=30 29 29 29 30 29 30 30 29 30 30 29
+1523=30 29 30 29 30 29 30 29 29 30 30 29
+1524=30 30 29 30 29 30 29 30 29 29 30 29
+1525=30 30 29 30 30 29 30 29 30 29 29 30
+1526=29 30 29 30 30 30 29 30 29 30 29 29
+1527=30 29 30 29 30 30 29 30 30 29 30 29
+1528=30 29 29 30 29 30 29 30 30 29 30 30
+1529=29 30 29 29 30 29 30 29 30 29 30 30
+1530=29 30 30 29 29 30 29 30 29 29 30 30
+1531=29 30 30 30 29 29 30 29 30 29 29 30
+1532=29 30 30 30 29 30 30 29 29 29 30 29
+1533=30 29 30 30 30 29 30 29 30 29 29 30
+1534=29 30 29 30 30 29 30 30 29 29 30 29
+1535=30 29 30 29 30 29 30 30 29 30 29 30
+1536=29 30 29 30 29 30 29 30 29 30 29 30
+1537=30 29 30 30 29 29 30 29 29 30 29 30
+1538=30 30 29 30 30 29 29 30 29 29 30 29
+1539=30 30 30 29 30 30 29 29 30 29 29 30
+1540=29 30 30 29 30 30 29 30 29 29 30 29
+1541=30 29 30 29 30 30 30 29 30 29 29 30
+1542=29 30 29 30 29 30 30 29 30 29 30 30
+1543=29 30 29 29 30 29 30 29 30 29 30 30
+1544=30 29 30 29 29 30 29 30 29 30 29 30
+1545=30 30 29 30 29 29 30 29 30 29 29 30
+1546=30 30 29 30 29 30 29 30 29 30 29 29
+1547=30 30 29 30 30 29 30 29 30 29 30 29
+1548=30 29 29 30 30 29 30 30 29 30 29 30
+1549=29 30 29 29 30 29 30 30 30 29 30 29
+1550=30 29 30 29 29 29 30 30 30 29 30 30
+1551=29 30 29 29 30 29 29 30 30 29 30 30
+1552=30 29 30 29 29 30 29 29 30 30 29 30
+1553=30 29 30 29 30 29 30 29 30 29 30 29
+1554=30 29 30 29 30 30 29 30 29 30 29 30
+1555=29 29 30 29 30 30 29 30 30 29 30 29
+1556=30 29 29 30 29 30 29 30 30 30 29 30
+1557=29 30 29 29 29 30 29 30 30 30 30 29
+1558=30 29 30 29 29 29 30 29 30 30 30 29
+1559=30 30 29 29 30 29 29 30 30 29 30 29
+1560=30 30 29 30 29 30 29 30 29 30 29 30
+1561=29 30 30 29 30 29 30 30 29 29 30 29
+1562=29 30 30 29 30 29 30 30 30 29 29 30
+1563=29 30 29 29 30 29 30 30 30 29 30 29
+1564=30 29 30 29 29 30 29 30 30 30 29 30
+1565=29 30 29 30 29 29 30 29 30 30 29 30
+1566=30 29 30 29 30 29 29 30 29 30 29 30
+1567=30 29 30 30 29 30 29 30 29 29 30 29
+1568=30 29 30 30 30 29 30 29 30 29 29 29
+1569=30 29 30 30 30 29 30 30 29 30 29 29
+1570=29 30 29 30 30 29 30 30 30 29 29 30
+1571=29 29 30 29 30 30 29 30 30 29 30 29
+1572=30 29 29 30 29 30 29 30 30 29 30 29
+1573=30 29 30 30 29 30 29 29 30 29 30 29
+1574=30 30 29 30 30 29 30 29 29 30 29 29
+1575=30 30 30 29 30 30 29 30 29 29 29 30
+1576=29 30 30 29 30 30 30 29 30 29 29 29
+1577=30 29 30 30 29 30 30 29 30 29 30 29
+1578=29 30 29 30 29 30 30 29 30 30 29 30
+1579=29 30 29 30 29 29 30 30 29 30 29 30
+1580=29 30 30 29 30 29 29 30 29 30 29 30
+1581=30 30 29 30 29 30 29 29 30 29 30 29
+1582=30 30 29 30 30 29 30 29 30 29 29 29
+1583=30 30 29 30 30 30 29 30 29 30 29 29
+1584=29 30 30 29 30 30 29 30 30 29 30 29
+1585=29 30 29 30 29 30 29 30 30 29 30 30
+1586=29 29 30 29 30 29 29 30 30 30 29 30
+1587=29 30 30 29 29 29 30 29 30 29 30 30
+1588=30 29 30 30 29 29 29 30 29 30 29 30
+1589=30 29 30 30 29 30 29 29 30 29 30 29
+1590=30 29 30 30 30 29 29 30 29 30 29 30
+1591=29 30 29 30 30 29 30 29 30 29 30 29
+1592=30 29 30 29 30 29 30 29 30 30 30 29
+1593=30 29 29 30 29 29 30 29 30 30 30 29
+1594=30 30 29 29 30 29 29 29 30 30 30 30
+1595=29 30 29 30 29 29 30 29 29 30 30 30
+1596=29 30 30 29 30 29 29 30 29 30 29 30
+1597=29 30 30 29 30 29 30 29 30 29 30 29
+1598=30 29 30 29 30 30 29 30 29 30 30 29
+1599=29 30 29 30 29 30 29 30 30 30 29 30
+1600=29 29 30 29 30 29 29 30 30 30 29 30
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/i386/jvm.cfg b/love2dToAPK/tools/tools/jdk-win/jre/lib/i386/jvm.cfg
new file mode 100644
index 0000000..f7d26f0
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/i386/jvm.cfg
@@ -0,0 +1,34 @@
+# Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
+# ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+# List of JVMs that can be used as an option to java, javac, etc.
+# Order is important -- first in this list is the default JVM.
+# NOTE that this both this file and its format are UNSUPPORTED and
+# WILL GO AWAY in a future release.
+#
+# You may also select a JVM in an arbitrary location with the
+# "-XXaltjvm=<jvm_dir>" option, but that too is unsupported
+# and may not be available in a future release.
+#
+-client KNOWN
+-server KNOWN
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/javafx.properties b/love2dToAPK/tools/tools/jdk-win/jre/lib/javafx.properties
new file mode 100644
index 0000000..6d74a5a
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/javafx.properties
@@ -0,0 +1 @@
+javafx.runtime.version=8.0.45
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/javaws.jar b/love2dToAPK/tools/tools/jdk-win/jre/lib/javaws.jar
new file mode 100644
index 0000000..5f09a0c
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/javaws.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/jce.jar b/love2dToAPK/tools/tools/jdk-win/jre/lib/jce.jar
new file mode 100644
index 0000000..648a829
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/jce.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/jfr.jar b/love2dToAPK/tools/tools/jdk-win/jre/lib/jfr.jar
new file mode 100644
index 0000000..9b2c1b0
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/jfr.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/jfr/default.jfc b/love2dToAPK/tools/tools/jdk-win/jre/lib/jfr/default.jfc
new file mode 100644
index 0000000..493d81c
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/jfr/default.jfc
@@ -0,0 +1,556 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Recommended way to edit .jfc files is to use Java Mission Control,
+ see Window -> Flight Recorder Template Manager.
+-->
+
+<configuration version="1.0" name="Continuous" description="Low overhead configuration safe for continuous use in production environments, typically less than 1 % overhead." provider="Oracle">
+
+ <producer uri="http://www.oracle.com/hotspot/jvm/" label="Oracle JDK">
+
+ <control>
+
+ <!--
+ Contents of the control element is not read by the JVM, it's used
+ by Java Mission Control to change settings that carry the control attribute.
+ -->
+
+ <selection name="gc-level" default="detailed" label="Garbage Collector">
+ <option label="Off" name="off">off</option>
+ <option label="Normal" name="detailed">normal</option>
+ <option label="All" name="all">all</option>
+ </selection>
+
+ <condition name="gc-enabled-normal" true="true" false="false">
+ <or>
+ <test name="gc-level" operator="equal" value="normal"/>
+ <test name="gc-level" operator="equal" value="all"/>
+ </or>
+ </condition>
+
+ <condition name="gc-enabled-all" true="true" false="false">
+ <test name="gc-level" operator="equal" value="all"/>
+ </condition>
+
+ <selection name="compiler-level" default="normal" label="Compiler">
+ <option label="Off" name="off">off</option>
+ <option label="Normal" name="normal">normal</option>
+ <option label="Detailed" name="detailed">detailed</option>
+ <option label="All" name="all">all</option>
+ </selection>
+
+ <condition name="compiler-enabled" true="false" false="true">
+ <test name="compiler-level" operator="equal" value="off"/>
+ </condition>
+
+ <condition name="compiler-enabled-failure" true="true" false="false">
+ <or>
+ <test name="compiler-level" operator="equal" value="detailed"/>
+ <test name="compiler-level" operator="equal" value="all"/>
+ </or>
+ </condition>
+
+ <condition name="compiler-sweeper-threshold" true="0 ms" false="100 ms">
+ <test name="compiler-level" operator="equal" value="all"/>
+ </condition>
+
+ <condition name="compiler-compilation-threshold" true="1000 ms">
+ <test name="compiler-level" operator="equal" value="normal"/>
+ </condition>
+
+ <condition name="compiler-compilation-threshold" true="100 ms">
+ <test name="compiler-level" operator="equal" value="detailed"/>
+ </condition>
+
+ <condition name="compiler-compilation-threshold" true="0 ms">
+ <test name="compiler-level" operator="equal" value="all"/>
+ </condition>
+
+ <condition name="compiler-phase-threshold" true="60 s">
+ <test name="compiler-level" operator="equal" value="normal"/>
+ </condition>
+
+ <condition name="compiler-phase-threshold" true="10 s">
+ <test name="compiler-level" operator="equal" value="detailed"/>
+ </condition>
+
+ <condition name="compiler-phase-threshold" true="0 s">
+ <test name="compiler-level" operator="equal" value="all"/>
+ </condition>
+
+ <selection name="method-sampling-interval" default="normal" label="Method Sampling">
+ <option label="Off" name="off">999 d</option>
+ <option label="Normal" name="normal">20 ms</option>
+ <option label="Maximum" name="maximum">10 ms</option>
+ </selection>
+
+ <condition name="method-sampling-enabled" true="false" false="true">
+ <test name="method-sampling-interval" operator="equal" value="999 d"/>
+ </condition>
+
+ <selection name="thread-dump-interval" default="normal" label="Thread Dump">
+ <option label="Off" name="off">999 d</option>
+ <option label="At least Once" name="normal">everyChunk</option>
+ <option label="Every 60 s" name="everyMinute">60 s</option>
+ <option label="Every 10 s" name="everyTenSecond">10 s</option>
+ <option label="Every 1 s" name="everySecond">1 s</option>
+ </selection>
+
+ <condition name="thread-dump-enabled" true="false" false="true">
+ <test name="thread-dump-interval" operator="equal" value="999 d"/>
+ </condition>
+
+ <selection name="exception-level" default="errors" label="Exceptions">
+ <option label="Off" name="off">off</option>
+ <option label="Errors Only" name="errors">errors</option>
+ <option label="All Exceptions, including Errors" name="all">all</option>
+ </selection>
+
+ <condition name="enable-errors" true="true" false="false">
+ <or>
+ <test name="exception-level" operator="equal" value="errors"/>
+ <test name="exception-level" operator="equal" value="all"/>
+ </or>
+ </condition>
+
+ <condition name="enable-exceptions" true="true" false="false">
+ <test name="exception-level" operator="equal" value="all"/>
+ </condition>
+
+ <text name="synchronization-threshold" label="Synchronization Threshold" contentType="timespan" minimum="0 s">20 ms</text>
+
+ <text name="file-io-threshold" label="File I/O Threshold" contentType="timespan" minimum="0 s">20 ms</text>
+
+ <text name="socket-io-threshold" label="Socket I/O Threshold" contentType="timespan" minimum="0 s">20 ms</text>
+
+ <flag name="heap-statistics-enabled" label="Heap Statistics">false</flag>
+
+ <flag name="class-loading-enabled" label="Class Loading">false</flag>
+
+ <flag name="allocation-profiling-enabled" label="Allocation Profiling">false</flag>
+
+ </control>
+
+ <event path="java/statistics/thread_allocation">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="java/statistics/class_loading">
+ <setting name="enabled">true</setting>
+ <setting name="period">1000 ms</setting>
+ </event>
+
+ <event path="java/statistics/threads">
+ <setting name="enabled">true</setting>
+ <setting name="period">1000 ms</setting>
+ </event>
+
+ <event path="java/thread_start">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="java/thread_end">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="java/thread_sleep">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="synchronization-threshold">20 ms</setting>
+ </event>
+
+ <event path="java/thread_park">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="synchronization-threshold">20 ms</setting>
+ </event>
+
+ <event path="java/monitor_enter">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="synchronization-threshold">20 ms</setting>
+ </event>
+
+ <event path="java/monitor_wait">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="synchronization-threshold">20 ms</setting>
+ </event>
+
+ <event path="vm/class/load">
+ <setting name="enabled" control="class-loading-enabled">false</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/class/unload">
+ <setting name="enabled" control="class-loading-enabled">false</setting>
+ </event>
+
+ <event path="vm/info">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/initial_system_property">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/prof/execution_sample">
+ <setting name="enabled" control="method-sampling-enabled">true</setting>
+ <setting name="period" control="method-sampling-interval">20 ms</setting>
+ </event>
+
+ <event path="vm/prof/execution_sampling_info">
+ <setting name="enabled">false</setting>
+ <setting name="threshold">1 ms</setting>
+ </event>
+
+ <event path="vm/runtime/execute_vm_operation">
+ <setting name="enabled">true</setting>
+ <setting name="threshold">10 ms</setting>
+ </event>
+
+ <event path="vm/runtime/thread_dump">
+ <setting name="enabled" control="thread-dump-enabled">true</setting>
+ <setting name="period" control="thread-dump-interval">everyChunk</setting>
+ </event>
+
+ <event path="vm/flag/long">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/flag/ulong">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/flag/double">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/flag/boolean">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/flag/string">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/flag/long_changed">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="vm/flag/ulong_changed">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="vm/flag/double_changed">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="vm/flag/boolean_changed">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="vm/flag/string_changed">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="vm/gc/detailed/object_count">
+ <setting name="enabled" control="heap-statistics-enabled">false</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/gc/configuration/gc">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/gc/configuration/heap">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/gc/configuration/young_generation">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/gc/configuration/tlab">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/gc/configuration/survivor">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/gc/detailed/object_count_after_gc">
+ <setting name="enabled">false</setting>
+ </event>
+
+ <event path="vm/gc/heap/summary">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/heap/ps_summary">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/heap/metaspace_summary">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/metaspace/gc_threshold">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/metaspace/allocation_failure">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="vm/gc/metaspace/out_of_memory">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="vm/gc/metaspace/chunk_free_list_summary">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/collector/garbage_collection">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/collector/parold_garbage_collection">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/collector/young_garbage_collection">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/collector/old_garbage_collection">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/collector/g1_garbage_collection">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/phases/pause">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/phases/pause_level_1">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/phases/pause_level_2">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/phases/pause_level_3">
+ <setting name="enabled" control="gc-enabled-all">false</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/reference/statistics">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/detailed/promotion_failed">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/detailed/evacuation_failed">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/detailed/evacuation_info">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/detailed/concurrent_mode_failure">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/compiler/config">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/compiler/stats">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">1000 ms</setting>
+ </event>
+
+ <event path="vm/compiler/compilation">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="threshold" control="compiler-compilation-threshold">1000 ms</setting>
+ </event>
+
+ <event path="vm/compiler/phase">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="threshold" control="compiler-phase-threshold">60 s</setting>
+ </event>
+
+ <event path="vm/compiler/failure">
+ <setting name="enabled" control="compiler-enabled-failure">false</setting>
+ </event>
+
+ <event path="vm/code_sweeper/config">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/code_sweeper/stats">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/code_sweeper/sweep">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="threshold" control="compiler-sweeper-threshold">100 ms</setting>
+ </event>
+
+ <event path="vm/code_cache/config">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/code_cache/stats">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/code_cache/full">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ </event>
+
+ <event path="os/information">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="os/processor/cpu_information">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="os/processor/context_switch_rate">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">10 s</setting>
+ </event>
+
+ <event path="os/processor/cpu_load">
+ <setting name="enabled">true</setting>
+ <setting name="period">1000 ms</setting>
+ </event>
+
+ <event path="os/processor/cpu_tsc">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="os/system_process">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="os/initial_environment_variable">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="os/memory/physical_memory">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="java/object_alloc_in_new_TLAB">
+ <setting name="enabled" control="allocation-profiling-enabled">false</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="java/object_alloc_outside_TLAB">
+ <setting name="enabled" control="allocation-profiling-enabled">false</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ </producer>
+
+ <producer uri="http://www.oracle.com/hotspot/jdk/" label="Oracle JDK">
+
+ <event path="java/file_read">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="http://www.oracle.com/hotspot/jvm/file-io-threshold">20 ms</setting>
+ </event>
+
+ <event path="java/file_write">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="http://www.oracle.com/hotspot/jvm/file-io-threshold">20 ms</setting>
+ </event>
+
+ <event path="java/socket_read">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="http://www.oracle.com/hotspot/jvm/socket-io-threshold">20 ms</setting>
+ </event>
+
+ <event path="java/socket_write">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="http://www.oracle.com/hotspot/jvm/socket-io-threshold">20 ms</setting>
+ </event>
+
+ <event path="java/exception_throw">
+ <setting name="enabled" control="http://www.oracle.com/hotspot/jvm/enable-exceptions">false</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="java/error_throw">
+ <setting name="enabled" control="http://www.oracle.com/hotspot/jvm/enable-errors">true</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="java/statistics/throwables">
+ <setting name="enabled">true</setting>
+ <setting name="period">1000 ms</setting>
+ </event>
+
+ </producer>
+
+ <producer uri="http://www.oracle.com/hotspot/jfr-info/" label="Oracle JDK">
+
+ <event path="recordings/recording">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="recordings/recording_setting">
+ <setting name="enabled">true</setting>
+ </event>
+
+ </producer>
+
+</configuration>
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/jfr/profile.jfc b/love2dToAPK/tools/tools/jdk-win/jre/lib/jfr/profile.jfc
new file mode 100644
index 0000000..bfbe142
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/jfr/profile.jfc
@@ -0,0 +1,556 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Recommended way to edit .jfc files is to use Java Mission Control,
+ see Window -> Flight Recorder Template Manager.
+-->
+
+<configuration version="1.0" name="Profiling" description="Low overhead configuration for profiling, typically around 2 % overhead." provider="Oracle">
+
+ <producer uri="http://www.oracle.com/hotspot/jvm/" label="Oracle JDK">
+
+ <control>
+
+ <!--
+ Contents of the control element is not read by the JVM, it's used
+ by Java Mission Control to change settings that carry the control attribute.
+ -->
+
+ <selection name="gc-level" default="detailed" label="Garbage Collector">
+ <option label="Off" name="off">off</option>
+ <option label="Normal" name="detailed">normal</option>
+ <option label="All" name="all">all</option>
+ </selection>
+
+ <condition name="gc-enabled-normal" true="true" false="false">
+ <or>
+ <test name="gc-level" operator="equal" value="normal"/>
+ <test name="gc-level" operator="equal" value="all"/>
+ </or>
+ </condition>
+
+ <condition name="gc-enabled-all" true="true" false="false">
+ <test name="gc-level" operator="equal" value="all"/>
+ </condition>
+
+ <selection name="compiler-level" default="detailed" label="Compiler">
+ <option label="Off" name="off">off</option>
+ <option label="Normal" name="normal">normal</option>
+ <option label="Detailed" name="detailed">detailed</option>
+ <option label="All" name="all">all</option>
+ </selection>
+
+ <condition name="compiler-enabled" true="false" false="true">
+ <test name="compiler-level" operator="equal" value="off"/>
+ </condition>
+
+ <condition name="compiler-enabled-failure" true="true" false="false">
+ <or>
+ <test name="compiler-level" operator="equal" value="detailed"/>
+ <test name="compiler-level" operator="equal" value="all"/>
+ </or>
+ </condition>
+
+ <condition name="compiler-sweeper-threshold" true="0 ms" false="100 ms">
+ <test name="compiler-level" operator="equal" value="all"/>
+ </condition>
+
+ <condition name="compiler-compilation-threshold" true="1000 ms">
+ <test name="compiler-level" operator="equal" value="normal"/>
+ </condition>
+
+ <condition name="compiler-compilation-threshold" true="100 ms">
+ <test name="compiler-level" operator="equal" value="detailed"/>
+ </condition>
+
+ <condition name="compiler-compilation-threshold" true="0 ms">
+ <test name="compiler-level" operator="equal" value="all"/>
+ </condition>
+
+ <condition name="compiler-phase-threshold" true="60 s">
+ <test name="compiler-level" operator="equal" value="normal"/>
+ </condition>
+
+ <condition name="compiler-phase-threshold" true="10 s">
+ <test name="compiler-level" operator="equal" value="detailed"/>
+ </condition>
+
+ <condition name="compiler-phase-threshold" true="0 s">
+ <test name="compiler-level" operator="equal" value="all"/>
+ </condition>
+
+ <selection name="method-sampling-interval" default="maximum" label="Method Sampling">
+ <option label="Off" name="off">999 d</option>
+ <option label="Normal" name="normal">20 ms</option>
+ <option label="Maximum" name="maximum">10 ms</option>
+ </selection>
+
+ <condition name="method-sampling-enabled" true="false" false="true">
+ <test name="method-sampling-interval" operator="equal" value="999 d"/>
+ </condition>
+
+ <selection name="thread-dump-interval" default="everyMinute" label="Thread Dump">
+ <option label="Off" name="off">999 d</option>
+ <option label="At least Once" name="normal">everyChunk</option>
+ <option label="Every 60 s" name="everyMinute">60 s</option>
+ <option label="Every 10 s" name="everyTenSecond">10 s</option>
+ <option label="Every 1 s" name="everySecond">1 s</option>
+ </selection>
+
+ <condition name="thread-dump-enabled" true="false" false="true">
+ <test name="thread-dump-interval" operator="equal" value="999 d"/>
+ </condition>
+
+ <selection name="exception-level" default="errors" label="Exceptions">
+ <option label="Off" name="off">off</option>
+ <option label="Errors Only" name="errors">errors</option>
+ <option label="All Exceptions, including Errors" name="all">all</option>
+ </selection>
+
+ <condition name="enable-errors" true="true" false="false">
+ <or>
+ <test name="exception-level" operator="equal" value="errors"/>
+ <test name="exception-level" operator="equal" value="all"/>
+ </or>
+ </condition>
+
+ <condition name="enable-exceptions" true="true" false="false">
+ <test name="exception-level" operator="equal" value="all"/>
+ </condition>
+
+ <text name="synchronization-threshold" label="Synchronization Threshold" contentType="timespan" minimum="0 s">10 ms</text>
+
+ <text name="file-io-threshold" label="File I/O Threshold" contentType="timespan" minimum="0 s">10 ms</text>
+
+ <text name="socket-io-threshold" label="Socket I/O Threshold" contentType="timespan" minimum="0 s">10 ms</text>
+
+ <flag name="heap-statistics-enabled" label="Heap Statistics">false</flag>
+
+ <flag name="class-loading-enabled" label="Class Loading">false</flag>
+
+ <flag name="allocation-profiling-enabled" label="Allocation Profiling">true</flag>
+
+ </control>
+
+ <event path="java/statistics/thread_allocation">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="java/statistics/class_loading">
+ <setting name="enabled">true</setting>
+ <setting name="period">1000 ms</setting>
+ </event>
+
+ <event path="java/statistics/threads">
+ <setting name="enabled">true</setting>
+ <setting name="period">1000 ms</setting>
+ </event>
+
+ <event path="java/thread_start">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="java/thread_end">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="java/thread_sleep">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="synchronization-threshold">10 ms</setting>
+ </event>
+
+ <event path="java/thread_park">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="synchronization-threshold">10 ms</setting>
+ </event>
+
+ <event path="java/monitor_enter">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="synchronization-threshold">10 ms</setting>
+ </event>
+
+ <event path="java/monitor_wait">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="synchronization-threshold">10 ms</setting>
+ </event>
+
+ <event path="vm/class/load">
+ <setting name="enabled" control="class-loading-enabled">false</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/class/unload">
+ <setting name="enabled" control="class-loading-enabled">false</setting>
+ </event>
+
+ <event path="vm/info">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/initial_system_property">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/prof/execution_sample">
+ <setting name="enabled" control="method-sampling-enabled">true</setting>
+ <setting name="period" control="method-sampling-interval">10 ms</setting>
+ </event>
+
+ <event path="vm/prof/execution_sampling_info">
+ <setting name="enabled">false</setting>
+ <setting name="threshold">1 ms</setting>
+ </event>
+
+ <event path="vm/runtime/execute_vm_operation">
+ <setting name="enabled">true</setting>
+ <setting name="threshold">10 ms</setting>
+ </event>
+
+ <event path="vm/runtime/thread_dump">
+ <setting name="enabled" control="thread-dump-enabled">true</setting>
+ <setting name="period" control="thread-dump-interval">60 s</setting>
+ </event>
+
+ <event path="vm/flag/long">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/flag/ulong">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/flag/double">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/flag/boolean">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/flag/string">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/flag/long_changed">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="vm/flag/ulong_changed">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="vm/flag/double_changed">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="vm/flag/boolean_changed">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="vm/flag/string_changed">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="vm/gc/detailed/object_count">
+ <setting name="enabled" control="heap-statistics-enabled">false</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/gc/configuration/gc">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/gc/configuration/heap">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/gc/configuration/young_generation">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/gc/configuration/tlab">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/gc/configuration/survivor">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/gc/detailed/object_count_after_gc">
+ <setting name="enabled">false</setting>
+ </event>
+
+ <event path="vm/gc/heap/summary">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/heap/ps_summary">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/heap/metaspace_summary">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/metaspace/gc_threshold">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/metaspace/allocation_failure">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="vm/gc/metaspace/out_of_memory">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="vm/gc/metaspace/chunk_free_list_summary">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/collector/garbage_collection">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/collector/parold_garbage_collection">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/collector/young_garbage_collection">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/collector/old_garbage_collection">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/collector/g1_garbage_collection">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/phases/pause">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/phases/pause_level_1">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/phases/pause_level_2">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/phases/pause_level_3">
+ <setting name="enabled" control="gc-enabled-all">false</setting>
+ <setting name="threshold">0 ms</setting>
+ </event>
+
+ <event path="vm/gc/reference/statistics">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/detailed/promotion_failed">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/detailed/evacuation_failed">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/detailed/evacuation_info">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/gc/detailed/concurrent_mode_failure">
+ <setting name="enabled" control="gc-enabled-normal">true</setting>
+ </event>
+
+ <event path="vm/compiler/config">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/compiler/stats">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">1000 ms</setting>
+ </event>
+
+ <event path="vm/compiler/compilation">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="threshold" control="compiler-compilation-threshold">100 ms</setting>
+ </event>
+
+ <event path="vm/compiler/phase">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="threshold" control="compiler-phase-threshold">10 s</setting>
+ </event>
+
+ <event path="vm/compiler/failure">
+ <setting name="enabled" control="compiler-enabled-failure">true</setting>
+ </event>
+
+ <event path="vm/code_sweeper/config">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/code_sweeper/stats">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/code_sweeper/sweep">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="threshold" control="compiler-sweeper-threshold">100 ms</setting>
+ </event>
+
+ <event path="vm/code_cache/config">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/code_cache/stats">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="vm/code_cache/full">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ </event>
+
+ <event path="os/information">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="os/processor/cpu_information">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="os/processor/context_switch_rate">
+ <setting name="enabled" control="compiler-enabled">true</setting>
+ <setting name="period">10 s</setting>
+ </event>
+
+ <event path="os/processor/cpu_load">
+ <setting name="enabled">true</setting>
+ <setting name="period">1000 ms</setting>
+ </event>
+
+ <event path="os/processor/cpu_tsc">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="os/system_process">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="os/initial_environment_variable">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="os/memory/physical_memory">
+ <setting name="enabled">true</setting>
+ <setting name="period">everyChunk</setting>
+ </event>
+
+ <event path="java/object_alloc_in_new_TLAB">
+ <setting name="enabled" control="allocation-profiling-enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="java/object_alloc_outside_TLAB">
+ <setting name="enabled" control="allocation-profiling-enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ </producer>
+
+ <producer uri="http://www.oracle.com/hotspot/jdk/" label="Oracle JDK">
+
+ <event path="java/file_read">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="http://www.oracle.com/hotspot/jvm/file-io-threshold">10 ms</setting>
+ </event>
+
+ <event path="java/file_write">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="http://www.oracle.com/hotspot/jvm/file-io-threshold">10 ms</setting>
+ </event>
+
+ <event path="java/socket_read">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="http://www.oracle.com/hotspot/jvm/socket-io-threshold">10 ms</setting>
+ </event>
+
+ <event path="java/socket_write">
+ <setting name="enabled">true</setting>
+ <setting name="stackTrace">true</setting>
+ <setting name="threshold" control="http://www.oracle.com/hotspot/jvm/socket-io-threshold">10 ms</setting>
+ </event>
+
+ <event path="java/exception_throw">
+ <setting name="enabled" control="http://www.oracle.com/hotspot/jvm/enable-exceptions">false</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="java/error_throw">
+ <setting name="enabled" control="http://www.oracle.com/hotspot/jvm/enable-errors">true</setting>
+ <setting name="stackTrace">true</setting>
+ </event>
+
+ <event path="java/statistics/throwables">
+ <setting name="enabled">true</setting>
+ <setting name="period">1000 ms</setting>
+ </event>
+
+ </producer>
+
+ <producer uri="http://www.oracle.com/hotspot/jfr-info/" label="Oracle JDK">
+
+ <event path="recordings/recording">
+ <setting name="enabled">true</setting>
+ </event>
+
+ <event path="recordings/recording_setting">
+ <setting name="enabled">true</setting>
+ </event>
+
+ </producer>
+
+</configuration>
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/jfxswt.jar b/love2dToAPK/tools/tools/jdk-win/jre/lib/jfxswt.jar
new file mode 100644
index 0000000..334f882
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/jfxswt.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/jsse.jar b/love2dToAPK/tools/tools/jdk-win/jre/lib/jsse.jar
new file mode 100644
index 0000000..cfb1d6d
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/jsse.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/jvm.hprof.txt b/love2dToAPK/tools/tools/jdk-win/jre/lib/jvm.hprof.txt
new file mode 100644
index 0000000..3c8e5fc
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/jvm.hprof.txt
@@ -0,0 +1,86 @@
+Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+ - Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ - Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ - Neither the name of Oracle nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+Header for -agentlib:hprof (or -Xrunhprof) ASCII Output (JDK 5.0 JVMTI based)
+
+WARNING! This file format is under development, and is subject to
+change without notice.
+
+This file contains the following types of records:
+
+THREAD START
+THREAD END mark the lifetime of Java threads
+
+TRACE represents a Java stack trace. Each trace consists
+ of a series of stack frames. Other records refer to
+ TRACEs to identify (1) where object allocations have
+ taken place, (2) the frames in which GC roots were
+ found, and (3) frequently executed methods.
+
+HEAP DUMP is a complete snapshot of all live objects in the Java
+ heap. Following distinctions are made:
+
+ ROOT root set as determined by GC
+ CLS classes
+ OBJ instances
+ ARR arrays
+
+SITES is a sorted list of allocation sites. This identifies
+ the most heavily allocated object types, and the TRACE
+ at which those allocations occurred.
+
+CPU SAMPLES is a statistical profile of program execution. The VM
+ periodically samples all running threads, and assigns
+ a quantum to active TRACEs in those threads. Entries
+ in this record are TRACEs ranked by the percentage of
+ total quanta they consumed; top-ranked TRACEs are
+ typically hot spots in the program.
+
+CPU TIME is a profile of program execution obtained by measuring
+ the time spent in individual methods (excluding the time
+ spent in callees), as well as by counting the number of
+ times each method is called. Entries in this record are
+ TRACEs ranked by the percentage of total CPU time. The
+ "count" field indicates the number of times each TRACE
+ is invoked.
+
+MONITOR TIME is a profile of monitor contention obtained by measuring
+ the time spent by a thread waiting to enter a monitor.
+ Entries in this record are TRACEs ranked by the percentage
+ of total monitor contention time and a brief description
+ of the monitor. The "count" field indicates the number of
+ times the monitor was contended at that TRACE.
+
+MONITOR DUMP is a complete snapshot of all the monitors and threads in
+ the System.
+
+HEAP DUMP, SITES, CPU SAMPLES|TIME and MONITOR DUMP|TIME records are generated
+at program exit. They can also be obtained during program execution by typing
+Ctrl-\ (on Solaris) or by typing Ctrl-Break (on Win32).
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/logging.properties b/love2dToAPK/tools/tools/jdk-win/jre/lib/logging.properties
new file mode 100644
index 0000000..65cf1b1
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/logging.properties
@@ -0,0 +1,59 @@
+############################################################
+# Default Logging Configuration File
+#
+# You can use a different file by specifying a filename
+# with the java.util.logging.config.file system property.
+# For example java -Djava.util.logging.config.file=myfile
+############################################################
+
+############################################################
+# Global properties
+############################################################
+
+# "handlers" specifies a comma separated list of log Handler
+# classes. These handlers will be installed during VM startup.
+# Note that these classes must be on the system classpath.
+# By default we only configure a ConsoleHandler, which will only
+# show messages at the INFO and above levels.
+handlers= java.util.logging.ConsoleHandler
+
+# To also add the FileHandler, use the following line instead.
+#handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler
+
+# Default global logging level.
+# This specifies which kinds of events are logged across
+# all loggers. For any given facility this global level
+# can be overriden by a facility specific level
+# Note that the ConsoleHandler also has a separate level
+# setting to limit messages printed to the console.
+.level= INFO
+
+############################################################
+# Handler specific properties.
+# Describes specific configuration info for Handlers.
+############################################################
+
+# default file output is in user's home directory.
+java.util.logging.FileHandler.pattern = %h/java%u.log
+java.util.logging.FileHandler.limit = 50000
+java.util.logging.FileHandler.count = 1
+java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
+
+# Limit the message that are printed on the console to INFO and above.
+java.util.logging.ConsoleHandler.level = INFO
+java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
+
+# Example to customize the SimpleFormatter output format
+# to print one-line log message like this:
+# <level>: <log message> [<date/time>]
+#
+# java.util.logging.SimpleFormatter.format=%4$s: %5$s [%1$tc]%n
+
+############################################################
+# Facility specific properties.
+# Provides extra control for each logger.
+############################################################
+
+# For example, set the com.xyz.foo logger to only log SEVERE
+# messages:
+com.xyz.foo.level = SEVERE
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/management-agent.jar b/love2dToAPK/tools/tools/jdk-win/jre/lib/management-agent.jar
new file mode 100644
index 0000000..48e538d
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/management-agent.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/management/jmxremote.access b/love2dToAPK/tools/tools/jdk-win/jre/lib/management/jmxremote.access
new file mode 100644
index 0000000..ce80b47
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/management/jmxremote.access
@@ -0,0 +1,79 @@
+######################################################################
+# Default Access Control File for Remote JMX(TM) Monitoring
+######################################################################
+#
+# Access control file for Remote JMX API access to monitoring.
+# This file defines the allowed access for different roles. The
+# password file (jmxremote.password by default) defines the roles and their
+# passwords. To be functional, a role must have an entry in
+# both the password and the access files.
+#
+# The default location of this file is $JRE/lib/management/jmxremote.access
+# You can specify an alternate location by specifying a property in
+# the management config file $JRE/lib/management/management.properties
+# (See that file for details)
+#
+# The file format for password and access files is syntactically the same
+# as the Properties file format. The syntax is described in the Javadoc
+# for java.util.Properties.load.
+# A typical access file has multiple lines, where each line is blank,
+# a comment (like this one), or an access control entry.
+#
+# An access control entry consists of a role name, and an
+# associated access level. The role name is any string that does not
+# itself contain spaces or tabs. It corresponds to an entry in the
+# password file (jmxremote.password). The access level is one of the
+# following:
+# "readonly" grants access to read attributes of MBeans.
+# For monitoring, this means that a remote client in this
+# role can read measurements but cannot perform any action
+# that changes the environment of the running program.
+# "readwrite" grants access to read and write attributes of MBeans,
+# to invoke operations on them, and optionally
+# to create or remove them. This access should be granted
+# only to trusted clients, since they can potentially
+# interfere with the smooth operation of a running program.
+#
+# The "readwrite" access level can optionally be followed by the "create" and/or
+# "unregister" keywords. The "unregister" keyword grants access to unregister
+# (delete) MBeans. The "create" keyword grants access to create MBeans of a
+# particular class or of any class matching a particular pattern. Access
+# should only be granted to create MBeans of known and trusted classes.
+#
+# For example, the following entry would grant readwrite access
+# to "controlRole", as well as access to create MBeans of the class
+# javax.management.monitor.CounterMonitor and to unregister any MBean:
+# controlRole readwrite \
+# create javax.management.monitor.CounterMonitorMBean \
+# unregister
+# or equivalently:
+# controlRole readwrite unregister create javax.management.monitor.CounterMBean
+#
+# The following entry would grant readwrite access as well as access to create
+# MBeans of any class in the packages javax.management.monitor and
+# javax.management.timer:
+# controlRole readwrite \
+# create javax.management.monitor.*,javax.management.timer.* \
+# unregister
+#
+# The \ character is defined in the Properties file syntax to allow continuation
+# lines as shown here. A * in a class pattern matches a sequence of characters
+# other than dot (.), so javax.management.monitor.* matches
+# javax.management.monitor.CounterMonitor but not
+# javax.management.monitor.foo.Bar.
+#
+# A given role should have at most one entry in this file. If a role
+# has no entry, it has no access.
+# If multiple entries are found for the same role name, then the last
+# access entry is used.
+#
+#
+# Default access control entries:
+# o The "monitorRole" role has readonly access.
+# o The "controlRole" role has readwrite access and can create the standard
+# Timer and Monitor MBeans defined by the JMX API.
+
+monitorRole readonly
+controlRole readwrite \
+ create javax.management.monitor.*,javax.management.timer.* \
+ unregister
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/management/jmxremote.password.template b/love2dToAPK/tools/tools/jdk-win/jre/lib/management/jmxremote.password.template
new file mode 100644
index 0000000..a7e7daa
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/management/jmxremote.password.template
@@ -0,0 +1,64 @@
+# ----------------------------------------------------------------------
+# Template for jmxremote.password
+#
+# o Copy this template to jmxremote.password
+# o Set the user/password entries in jmxremote.password
+# o Change the permission of jmxremote.password to read-only
+# by the owner.
+#
+# See below for the location of jmxremote.password file.
+# ----------------------------------------------------------------------
+
+##############################################################
+# Password File for Remote JMX Monitoring
+##############################################################
+#
+# Password file for Remote JMX API access to monitoring. This
+# file defines the different roles and their passwords. The access
+# control file (jmxremote.access by default) defines the allowed
+# access for each role. To be functional, a role must have an entry
+# in both the password and the access files.
+#
+# Default location of this file is $JRE/lib/management/jmxremote.password
+# You can specify an alternate location by specifying a property in
+# the management config file $JRE/lib/management/management.properties
+# or by specifying a system property (See that file for details).
+
+
+##############################################################
+# File permissions of the jmxremote.password file
+##############################################################
+# Since there are cleartext passwords stored in this file,
+# this file must be readable by ONLY the owner,
+# otherwise the program will exit with an error.
+#
+# The file format for password and access files is syntactically the same
+# as the Properties file format. The syntax is described in the Javadoc
+# for java.util.Properties.load.
+# Typical password file has multiple lines, where each line is blank,
+# a comment (like this one), or a password entry.
+#
+#
+# A password entry consists of a role name and an associated
+# password. The role name is any string that does not itself contain
+# spaces or tabs. The password is again any string that does not
+# contain spaces or tabs. Note that passwords appear in the clear in
+# this file, so it is a good idea not to use valuable passwords.
+#
+# A given role should have at most one entry in this file. If a role
+# has no entry, it has no access.
+# If multiple entries are found for the same role name, then the last one
+# is used.
+#
+# In a typical installation, this file can be read by anybody on the
+# local machine, and possibly by people on other machines.
+# For # security, you should either restrict the access to this file,
+# or specify another, less accessible file in the management config file
+# as described above.
+#
+# Following are two commented-out entries. The "measureRole" role has
+# password "QED". The "controlRole" role has password "R&D".
+#
+# monitorRole QED
+# controlRole R&D
+
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/management/management.properties b/love2dToAPK/tools/tools/jdk-win/jre/lib/management/management.properties
new file mode 100644
index 0000000..db08b78
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/management/management.properties
@@ -0,0 +1,318 @@
+#####################################################################
+# Default Configuration File for Java Platform Management
+#####################################################################
+#
+# The Management Configuration file (in java.util.Properties format)
+# will be read if one of the following system properties is set:
+# -Dcom.sun.management.jmxremote.port=<port-number>
+# or -Dcom.sun.management.snmp.port=<port-number>
+# or -Dcom.sun.management.config.file=<this-file>
+#
+# The default Management Configuration file is:
+#
+# $JRE/lib/management/management.properties
+#
+# Another location for the Management Configuration File can be specified
+# by the following property on the Java command line:
+#
+# -Dcom.sun.management.config.file=<this-file>
+#
+# If -Dcom.sun.management.config.file=<this-file> is set, the port
+# number for the management agent can be specified in the config file
+# using the following lines:
+#
+# ################ Management Agent Port #########################
+#
+# For setting the JMX RMI agent port use the following line
+# com.sun.management.jmxremote.port=<port-number>
+#
+# For setting the SNMP agent port use the following line
+# com.sun.management.snmp.port=<port-number>
+
+#####################################################################
+# Optional Instrumentation
+#####################################################################
+#
+# By default only the basic instrumentation with low overhead is on.
+# The following properties allow to selectively turn on optional
+# instrumentation which are off by default and may have some
+# additional overhead.
+#
+# com.sun.management.enableThreadContentionMonitoring
+#
+# This option enables thread contention monitoring if the
+# Java virtual machine supports such instrumentation.
+# Refer to the specification for the java.lang.management.ThreadMBean
+# interface - see isThreadContentionMonitoringSupported() method.
+#
+
+# To enable thread contention monitoring, uncomment the following line
+# com.sun.management.enableThreadContentionMonitoring
+
+#####################################################################
+# SNMP Management Properties
+#####################################################################
+#
+# If the system property -Dcom.sun.management.snmp.port=<port-number>
+# is set then
+# - The SNMP agent (with the Java virtual machine MIB) is started
+# that listens on the specified port for incoming SNMP requests.
+# - the following properties for read for SNMP management.
+#
+# The configuration can be specified only at startup time.
+# Later changes to the above system property (e.g. via setProperty method), this
+# config file, or the ACL file has no effect to the running SNMP agent.
+#
+
+#
+# ##################### SNMP Trap Port #########################
+#
+# com.sun.management.snmp.trap=<trap-destination-port-number>
+# Specifies the remote port number at which managers are expected
+# to listen for trap. For each host defined in the ACL file,
+# the SNMP agent will send traps at <host>:<trap-destination-port-number>
+# Default for this property is 162.
+#
+
+# To set port for sending traps to a different port use the following line
+# com.sun.management.snmp.trap=<trap-destination-port-number>
+
+#
+# ################ SNMP listen interface #########################
+#
+# com.sun.management.snmp.interface=<InetAddress>
+# Specifies the local interface on which the SNMP agent will bind.
+# This is useful when running on machines which have several
+# interfaces defined. It makes it possible to listen to a specific
+# subnet accessible through that interface.
+# Default for this property is "localhost".
+#
+# The format of the value for that property is any string accepted
+# by java.net.InetAddress.getByName(String).
+#
+
+# For restricting the port on which SNMP agent listens use the following line
+# com.sun.management.snmp.interface=<InetAddress>
+
+#
+# #################### SNMP ACL file #########################
+#
+# com.sun.management.snmp.acl=true|false
+# Default for this property is true. (Case for true/false ignored)
+# If this property is specified as false then the ACL file
+# is not checked: all manager hosts are allowed all access.
+#
+
+# For SNMP without checking ACL file uncomment the following line
+# com.sun.management.snmp.acl=false
+
+#
+# com.sun.management.snmp.acl.file=filepath
+# Specifies location for ACL file
+# This is optional - default location is
+# $JRE/lib/management/snmp.acl
+#
+# If the property "com.sun.management.snmp.acl" is set to false,
+# then this property and the ACL file are ignored.
+# Otherwise the ACL file must exist and be in the valid format.
+# If the ACL file is empty or non existent then no access is allowed.
+#
+# The SNMP agent will read the ACL file at startup time.
+# Modification to the ACL file has no effect to any running SNMP
+# agents which read that ACL file at startup.
+#
+
+# For a non-default acl file location use the following line
+# com.sun.management.snmp.acl.file=filepath
+
+#####################################################################
+# RMI Management Properties
+#####################################################################
+#
+# If system property -Dcom.sun.management.jmxremote.port=<port-number>
+# is set then
+# - A MBean server is started
+# - JRE Platform MBeans are registered in the MBean server
+# - RMI connector is published in a private readonly registry at
+# specified port using a well known name, "jmxrmi"
+# - the following properties are read for JMX remote management.
+#
+# The configuration can be specified only at startup time.
+# Later changes to above system property (e.g. via setProperty method),
+# this config file, the password file, or the access file have no effect to the
+# running MBean server, the connector, or the registry.
+#
+
+#
+# ########## RMI connector settings for local management ##########
+#
+# com.sun.management.jmxremote.local.only=true|false
+# Default for this property is true. (Case for true/false ignored)
+# If this property is specified as true then the local JMX RMI connector
+# server will only accept connection requests from clients running on
+# the host where the out-of-the-box JMX management agent is running.
+# In order to ensure backwards compatibility this property could be
+# set to false. However, deploying the local management agent in this
+# way is discouraged because the local JMX RMI connector server will
+# accept connection requests from any client either local or remote.
+# For remote management the remote JMX RMI connector server should
+# be used instead with authentication and SSL/TLS encryption enabled.
+#
+
+# For allowing the local management agent accept local
+# and remote connection requests use the following line
+# com.sun.management.jmxremote.local.only=false
+
+#
+# ###################### RMI SSL #############################
+#
+# com.sun.management.jmxremote.ssl=true|false
+# Default for this property is true. (Case for true/false ignored)
+# If this property is specified as false then SSL is not used.
+#
+
+# For RMI monitoring without SSL use the following line
+# com.sun.management.jmxremote.ssl=false
+
+# com.sun.management.jmxremote.ssl.config.file=filepath
+# Specifies the location of the SSL configuration file. A properties
+# file can be used to supply the keystore and truststore location and
+# password settings thus avoiding to pass them as cleartext in the
+# command-line.
+#
+# The current implementation of the out-of-the-box management agent will
+# look up and use the properties specified below to configure the SSL
+# keystore and truststore, if present:
+# javax.net.ssl.keyStore=<keystore-location>
+# javax.net.ssl.keyStorePassword=<keystore-password>
+# javax.net.ssl.trustStore=<truststore-location>
+# javax.net.ssl.trustStorePassword=<truststore-password>
+# Any other properties in the file will be ignored. This will allow us
+# to extend the property set in the future if required by the default
+# SSL implementation.
+#
+# If the property "com.sun.management.jmxremote.ssl" is set to false,
+# then this property is ignored.
+#
+
+# For supplying the keystore settings in a file use the following line
+# com.sun.management.jmxremote.ssl.config.file=filepath
+
+# com.sun.management.jmxremote.ssl.enabled.cipher.suites=<cipher-suites>
+# The value of this property is a string that is a comma-separated list
+# of SSL/TLS cipher suites to enable. This property can be specified in
+# conjunction with the previous property "com.sun.management.jmxremote.ssl"
+# in order to control which particular SSL/TLS cipher suites are enabled
+# for use by accepted connections. If this property is not specified then
+# the SSL/TLS RMI Server Socket Factory uses the SSL/TLS cipher suites that
+# are enabled by default.
+#
+
+# com.sun.management.jmxremote.ssl.enabled.protocols=<protocol-versions>
+# The value of this property is a string that is a comma-separated list
+# of SSL/TLS protocol versions to enable. This property can be specified in
+# conjunction with the previous property "com.sun.management.jmxremote.ssl"
+# in order to control which particular SSL/TLS protocol versions are
+# enabled for use by accepted connections. If this property is not
+# specified then the SSL/TLS RMI Server Socket Factory uses the SSL/TLS
+# protocol versions that are enabled by default.
+#
+
+# com.sun.management.jmxremote.ssl.need.client.auth=true|false
+# Default for this property is false. (Case for true/false ignored)
+# If this property is specified as true in conjunction with the previous
+# property "com.sun.management.jmxremote.ssl" then the SSL/TLS RMI Server
+# Socket Factory will require client authentication.
+#
+
+# For RMI monitoring with SSL client authentication use the following line
+# com.sun.management.jmxremote.ssl.need.client.auth=true
+
+# com.sun.management.jmxremote.registry.ssl=true|false
+# Default for this property is false. (Case for true/false ignored)
+# If this property is specified as true then the RMI registry used
+# to bind the RMIServer remote object is protected with SSL/TLS
+# RMI Socket Factories that can be configured with the properties:
+# com.sun.management.jmxremote.ssl.config.file
+# com.sun.management.jmxremote.ssl.enabled.cipher.suites
+# com.sun.management.jmxremote.ssl.enabled.protocols
+# com.sun.management.jmxremote.ssl.need.client.auth
+# If the two properties below are true at the same time, i.e.
+# com.sun.management.jmxremote.ssl=true
+# com.sun.management.jmxremote.registry.ssl=true
+# then the RMIServer remote object and the RMI registry are
+# both exported with the same SSL/TLS RMI Socket Factories.
+#
+
+# For using an SSL/TLS protected RMI registry use the following line
+# com.sun.management.jmxremote.registry.ssl=true
+
+#
+# ################ RMI User authentication ################
+#
+# com.sun.management.jmxremote.authenticate=true|false
+# Default for this property is true. (Case for true/false ignored)
+# If this property is specified as false then no authentication is
+# performed and all users are allowed all access.
+#
+
+# For RMI monitoring without any checking use the following line
+# com.sun.management.jmxremote.authenticate=false
+
+#
+# ################ RMI Login configuration ###################
+#
+# com.sun.management.jmxremote.login.config=<config-name>
+# Specifies the name of a JAAS login configuration entry to use when
+# authenticating users of RMI monitoring.
+#
+# Setting this property is optional - the default login configuration
+# specifies a file-based authentication that uses the password file.
+#
+# When using this property to override the default login configuration
+# then the named configuration entry must be in a file that gets loaded
+# by JAAS. In addition, the login module(s) specified in the configuration
+# should use the name and/or password callbacks to acquire the user's
+# credentials. See the NameCallback and PasswordCallback classes in the
+# javax.security.auth.callback package for more details.
+#
+# If the property "com.sun.management.jmxremote.authenticate" is set to
+# false, then this property and the password & access files are ignored.
+#
+
+# For a non-default login configuration use the following line
+# com.sun.management.jmxremote.login.config=<config-name>
+
+#
+# ################ RMI Password file location ##################
+#
+# com.sun.management.jmxremote.password.file=filepath
+# Specifies location for password file
+# This is optional - default location is
+# $JRE/lib/management/jmxremote.password
+#
+# If the property "com.sun.management.jmxremote.authenticate" is set to
+# false, then this property and the password & access files are ignored.
+# Otherwise the password file must exist and be in the valid format.
+# If the password file is empty or non-existent then no access is allowed.
+#
+
+# For a non-default password file location use the following line
+# com.sun.management.jmxremote.password.file=filepath
+
+#
+# ################ RMI Access file location #####################
+#
+# com.sun.management.jmxremote.access.file=filepath
+# Specifies location for access file
+# This is optional - default location is
+# $JRE/lib/management/jmxremote.access
+#
+# If the property "com.sun.management.jmxremote.authenticate" is set to
+# false, then this property and the password & access files are ignored.
+# Otherwise, the access file must exist and be in the valid format.
+# If the access file is empty or non-existent then no access is allowed.
+#
+
+# For a non-default password file location use the following line
+# com.sun.management.jmxremote.access.file=filepath
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/management/snmp.acl.template b/love2dToAPK/tools/tools/jdk-win/jre/lib/management/snmp.acl.template
new file mode 100644
index 0000000..0e76676
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/management/snmp.acl.template
@@ -0,0 +1,110 @@
+# ----------------------------------------------------------------------
+# Template for SNMP Access Control List File
+#
+# o Copy this template to snmp.acl
+# o Set access control for SNMP support
+# o Change the permission of snmp.acl to be read-only
+# by the owner.
+#
+# See below for the location of snmp.acl file.
+# ----------------------------------------------------------------------
+
+############################################################
+# SNMP Access Control List File
+############################################################
+#
+# Default location of this file is $JRE/lib/management/snmp.acl.
+# You can specify an alternate location by specifying a property in
+# the management config file $JRE/lib/management/management.properties
+# or by specifying a system property (See that file for details).
+#
+
+
+##############################################################
+# File permissions of the snmp.acl file
+##############################################################
+#
+# Since there are cleartext community strings stored in this file,
+# this ACL file must be readable by ONLY the owner,
+# otherwise the program will exit with an error.
+#
+##############################################################
+# Format of the acl group
+##############################################################
+#
+# communities: a list of SNMP community strings to which the
+# access control applies separated by commas.
+#
+# access: either "read-only" or "read-write".
+#
+# managers: a list of hosts to be granted the access rights.
+# Each can be expressed as any one of the following:
+# - hostname: hubble
+# - ip v4 and v6 addresses: 123.456.789.12 , fe80::a00:20ff:fe9b:ea82
+# - ip v4 and v6 netmask prefix notation: 123.456.789.0/24,
+# fe80::a00:20ff:fe9b:ea82/64
+# see RFC 2373 (http://www.ietf.org/rfc/rfc2373.txt)
+#
+# An example of two community groups for multiple hosts:
+# acl = {
+# {
+# communities = public, private
+# access = read-only
+# managers = hubble, snowbell, nanak
+# }
+# {
+# communities = jerry
+# access = read-write
+# managers = hubble, telescope
+# }
+# }
+#
+##############################################################
+# Format of the trap group
+##############################################################
+#
+# trap-community: a single SNMP community string that will be included
+# in the traps sent to the hosts.
+#
+# hosts: a list of hosts to which the SNMP agent will send traps.
+#
+# An example of two trap community definitions for multiple hosts:
+# trap = {
+# {
+# trap-community = public
+# hosts = hubble, snowbell
+# }
+# {
+# trap-community = private
+# hosts = telescope
+# }
+# }
+#
+############################################################
+#
+# Update the community strings (public and private) below
+# before copying this template file
+#
+# Common SNMP ACL Example
+# ------------------------
+#
+# o Only localhost can connect, and access rights
+# are limited to read-only
+# o Traps are sent to localhost only
+#
+#
+# acl = {
+# {
+# communities = public, private
+# access = read-only
+# managers = localhost
+# }
+# }
+#
+#
+# trap = {
+# {
+# trap-community = public
+# hosts = localhost
+# }
+# }
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/meta-index b/love2dToAPK/tools/tools/jdk-win/jre/lib/meta-index
new file mode 100644
index 0000000..24a8e0a
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/meta-index
@@ -0,0 +1,92 @@
+% VERSION 2
+% WARNING: this file is auto-generated; do not edit
+% UNSUPPORTED: this file and its format may change and/or
+% may be removed in a future release
+# charsets.jar
+sun/nio
+sun/awt
+# jce.jar
+javax/crypto
+sun/security
+META-INF/ORACLE_J.RSA
+META-INF/ORACLE_J.SF
+# jfr.jar
+oracle/jrockit/
+jdk/jfr
+com/oracle/jrockit/
+! jsse.jar
+sun/security
+com/sun/net/
+! management-agent.jar
+@ resources.jar
+com/sun/java/util/jar/pack/
+META-INF/services/sun.util.spi.XmlPropertiesProvider
+META-INF/services/javax.print.PrintServiceLookup
+com/sun/corba/
+META-INF/services/javax.sound.midi.spi.SoundbankReader
+sun/print
+META-INF/services/javax.sound.midi.spi.MidiFileReader
+META-INF/services/sun.java2d.cmm.CMMServiceProvider
+javax/swing
+META-INF/services/javax.sound.sampled.spi.AudioFileReader
+META-INF/services/javax.sound.midi.spi.MidiDeviceProvider
+sun/net
+META-INF/services/javax.sound.sampled.spi.AudioFileWriter
+com/sun/imageio/
+META-INF/services/sun.java2d.pipe.RenderingEngine
+META-INF/mimetypes.default
+META-INF/services/javax.sound.midi.spi.MidiFileWriter
+sun/rmi
+javax/sql
+META-INF/services/com.sun.tools.internal.ws.wscompile.Plugin
+com/sun/rowset/
+META-INF/services/javax.print.StreamPrintServiceFactory
+META-INF/mailcap.default
+java/lang
+sun/text
+javax/xml
+META-INF/services/javax.sound.sampled.spi.MixerProvider
+com/sun/xml/
+META-INF/services/com.sun.tools.internal.xjc.Plugin
+com/sun/java/swing/
+com/sun/jndi/
+com/sun/org/
+META-INF/services/javax.sound.sampled.spi.FormatConversionProvider
+! rt.jar
+com/sun/java/util/jar/pack/
+java/
+org/ietf/
+com/sun/beans/
+com/sun/tracing/
+com/sun/java/browser/
+com/sun/corba/
+com/sun/media/
+com/sun/awt/
+com/sun/management/
+sun/
+com/sun/jmx/
+com/sun/demo/
+com/sun/imageio/
+com/sun/net/
+com/sun/rmi/
+org/w3c/
+com/sun/swing/
+com/sun/activation/
+com/sun/nio/
+com/sun/rowset/
+org/jcp/
+com/sun/istack/
+jdk/
+com/sun/naming/
+org/xml/
+org/omg/
+com/sun/security/
+com/sun/image/
+com/sun/xml/
+com/sun/java/swing/
+com/oracle/
+com/sun/java_cup/
+com/sun/jndi/
+com/sun/accessibility/
+com/sun/org/
+javax/
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/net.properties b/love2dToAPK/tools/tools/jdk-win/jre/lib/net.properties
new file mode 100644
index 0000000..da78a84
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/net.properties
@@ -0,0 +1,74 @@
+############################################################
+# Default Networking Configuration File
+#
+# This file may contain default values for the networking system properties.
+# These values are only used when the system properties are not specified
+# on the command line or set programatically.
+# For now, only the various proxy settings can be configured here.
+############################################################
+
+# Whether or not the DefaultProxySelector will default to System Proxy
+# settings when they do exist.
+# Set it to 'true' to enable this feature and check for platform
+# specific proxy settings
+# Note that the system properties that do explicitely set proxies
+# (like http.proxyHost) do take precedence over the system settings
+# even if java.net.useSystemProxies is set to true.
+
+java.net.useSystemProxies=false
+
+#------------------------------------------------------------------------
+# Proxy configuration for the various protocol handlers.
+# DO NOT uncomment these lines if you have set java.net.useSystemProxies
+# to true as the protocol specific properties will take precedence over
+# system settings.
+#------------------------------------------------------------------------
+
+# HTTP Proxy settings. proxyHost is the name of the proxy server
+# (e.g. proxy.mydomain.com), proxyPort is the port number to use (default
+# value is 80) and nonProxyHosts is a '|' separated list of hostnames which
+# should be accessed directly, ignoring the proxy server (default value is
+# localhost & 127.0.0.1).
+#
+# http.proxyHost=
+# http.proxyPort=80
+http.nonProxyHosts=localhost|127.*|[::1]
+#
+# HTTPS Proxy Settings. proxyHost is the name of the proxy server
+# (e.g. proxy.mydomain.com), proxyPort is the port number to use (default
+# value is 443). The HTTPS protocol handlers uses the http nonProxyHosts list.
+#
+# https.proxyHost=
+# https.proxyPort=443
+#
+# FTP Proxy settings. proxyHost is the name of the proxy server
+# (e.g. proxy.mydomain.com), proxyPort is the port number to use (default
+# value is 80) and nonProxyHosts is a '|' separated list of hostnames which
+# should be accessed directly, ignoring the proxy server (default value is
+# localhost & 127.0.0.1).
+#
+# ftp.proxyHost=
+# ftp.proxyPort=80
+ftp.nonProxyHosts=localhost|127.*|[::1]
+#
+# Gopher Proxy settings. proxyHost is the name of the proxy server
+# (e.g. proxy.mydomain.com), proxyPort is the port number to use (default
+# value is 80)
+#
+# gopher.proxyHost=
+# gopher.proxyPort=80
+#
+# Socks proxy settings. socksProxyHost is the name of the proxy server
+# (e.g. socks.domain.com), socksProxyPort is the port number to use
+# (default value is 1080)
+#
+# socksProxyHost=
+# socksProxyPort=1080
+#
+# HTTP Keep Alive settings. remainingData is the maximum amount of data
+# in kilobytes that will be cleaned off the underlying socket so that it
+# can be reused (default value is 512K), queuedConnections is the maximum
+# number of Keep Alive connections to be on the queue for clean up (default
+# value is 10).
+# http.KeepAlive.remainingData=512
+# http.KeepAlive.queuedConnections=10
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/plugin.jar b/love2dToAPK/tools/tools/jdk-win/jre/lib/plugin.jar
new file mode 100644
index 0000000..cc5325c
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/plugin.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/psfont.properties.ja b/love2dToAPK/tools/tools/jdk-win/jre/lib/psfont.properties.ja
new file mode 100644
index 0000000..98a895f
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/psfont.properties.ja
@@ -0,0 +1,119 @@
+#
+#
+# Copyright (c) 1996, 2000, Oracle and/or its affiliates. All rights reserved.
+# ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+
+#
+# Japanese PostScript printer property file
+#
+font.num=16
+#
+serif=serif
+timesroman=serif
+sansserif=sansserif
+helvetica=sansserif
+monospaced=monospaced
+courier=monospaced
+dialog=sansserif
+dialoginput=monospaced
+#
+serif.latin1.plain=Times-Roman
+serif.latin1.italic=Times-Italic
+serif.latin1.bolditalic=Times-BoldItalic
+serif.latin1.bold=Times-Bold
+#
+sansserif.latin1.plain=Helvetica
+sansserif.latin1.italic=Helvetica-Oblique
+sansserif.latin1.bolditalic=Helvetica-BoldOblique
+sansserif.latin1.bold=Helvetica-Bold
+#
+monospaced.latin1.plain=Courier
+monospaced.latin1.italic=Courier-Oblique
+monospaced.latin1.bolditalic=Courier-BoldOblique
+monospaced.latin1.bold=Courier-Bold
+#
+serif.x11jis0208.plain=Ryumin-Light-H
+serif.x11jis0208.italic=Ryumin-Light-H
+serif.x11jis0208.bolditalic=Ryumin-Light-H
+serif.x11jis0208.bold=Ryumin-Light-H
+#
+sansserif.x11jis0208.plain=GothicBBB-Medium-H
+sansserif.x11jis0208.italic=GothicBBB-Medium-H
+sansserif.x11jis0208.bolditalic=GothicBBB-Medium-H
+sansserif.x11jis0208.bold=GothicBBB-Medium-H
+#
+monospaced.x11jis0208.plain=GothicBBB-Medium-H
+monospaced.x11jis0208.italic=GothicBBB-Medium-H
+monospaced.x11jis0208.bolditalic=GothicBBB-Medium-H
+monospaced.x11jis0208.bold=GothicBBB-Medium-H
+#
+serif.x11jis0201.plain=Ryumin-Light.Hankaku
+serif.x11jis0201.italic=Ryumin-Light.Hankaku
+serif.x11jis0201.bolditalic=Ryumin-Light.Hankaku
+serif.x11jis0201.bold=Ryumin-Light.Hankaku
+#
+sansserif.x11jis0201.plain=GothicBBB-Medium.Hankaku
+sansserif.x11jis0201.italic=GothicBBB-Medium.Hankaku
+sansserif.x11jis0201.bolditalic=GothicBBB-Medium.Hankaku
+sansserif.x11jis0201.bold=GothicBBB-Medium.Hankaku
+#
+monospaced.x11jis0201.plain=GothicBBB-Medium.Hankaku
+monospaced.x11jis0201.italic=GothicBBB-Medium.Hankaku
+monospaced.x11jis0201.bolditalic=GothicBBB-Medium.Hankaku
+monospaced.x11jis0201.bold=GothicBBB-Medium.Hankaku
+#
+Helvetica=0
+Helvetica-Bold=1
+Helvetica-Oblique=2
+Helvetica-BoldOblique=3
+Times-Roman=4
+Times-Bold=5
+Times-Italic=6
+Times-BoldItalic=7
+Courier=8
+Courier-Bold=9
+Courier-Oblique=10
+Courier-BoldOblique=11
+GothicBBB-Medium-H=12
+Ryumin-Light-H=13
+GothicBBB-Medium.Hankaku=14
+Ryumin-Light.Hankaku=15
+#
+font.0=Helvetica ISOF
+font.1=Helvetica-Bold ISOF
+font.2=Helvetica-Oblique ISOF
+font.3=Helvetica-BoldOblique ISOF
+font.4=Times-Roman ISOF
+font.5=Times-Bold ISOF
+font.6=Times-Italic ISOF
+font.7=Times-BoldItalic ISOF
+font.8=Courier ISOF
+font.9=Courier-Bold ISOF
+font.10=Courier-Oblique ISOF
+font.11=Courier-BoldOblique ISOF
+font.12=GothicBBB-Medium-H findfont
+font.13=Ryumin-Light-H findfont
+font.14=GothicBBB-Medium.Hankaku findfont
+font.15=Ryumin-Light.Hankaku findfont
+#
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/psfontj2d.properties b/love2dToAPK/tools/tools/jdk-win/jre/lib/psfontj2d.properties
new file mode 100644
index 0000000..085f57b
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/psfontj2d.properties
@@ -0,0 +1,323 @@
+#
+#
+# Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved.
+# ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+#
+
+#
+# PostScript printer property file for Java 2D printing.
+#
+# WARNING: This is an internal implementation file, not a public file.
+# Any customisation or reliance on the existence of this file and its
+# contents or syntax is discouraged and unsupported.
+# It may be incompatibly changed or removed without any notice.
+#
+#
+font.num=35
+#
+# Legacy logical font family names and logical font aliases should all
+# map to the primary logical font names.
+#
+serif=serif
+times=serif
+timesroman=serif
+sansserif=sansserif
+helvetica=sansserif
+dialog=sansserif
+dialoginput=monospaced
+monospaced=monospaced
+courier=monospaced
+#
+# Next, physical fonts which can be safely mapped to standard postscript fonts
+# These keys generally map to a value which is the same as the key, so
+# the key/value is just a way to say the font has a mapping.
+# Sometimes however we map more than one screen font to the same PS font.
+#
+avantgarde=avantgarde_book
+avantgarde_book=avantgarde_book
+avantgarde_demi=avantgarde_demi
+avantgarde_book_oblique=avantgarde_book_oblique
+avantgarde_demi_oblique=avantgarde_demi_oblique
+#
+itcavantgarde=avantgarde_book
+itcavantgarde=avantgarde_book
+itcavantgarde_demi=avantgarde_demi
+itcavantgarde_oblique=avantgarde_book_oblique
+itcavantgarde_demi_oblique=avantgarde_demi_oblique
+#
+bookman=bookman_light
+bookman_light=bookman_light
+bookman_demi=bookman_demi
+bookman_light_italic=bookman_light_italic
+bookman_demi_italic=bookman_demi_italic
+#
+# Exclude "helvetica" on its own as that's a legacy name for a logical font
+helvetica_bold=helvetica_bold
+helvetica_oblique=helvetica_oblique
+helvetica_bold_oblique=helvetica_bold_oblique
+#
+itcbookman_light=bookman_light
+itcbookman_demi=bookman_demi
+itcbookman_light_italic=bookman_light_italic
+itcbookman_demi_italic=bookman_demi_italic
+#
+# Exclude "courier" on its own as that's a legacy name for a logical font
+courier_bold=courier_bold
+courier_oblique=courier_oblique
+courier_bold_oblique=courier_bold_oblique
+#
+courier_new=courier
+courier_new_bold=courier_bold
+#
+monotype_century_schoolbook=newcenturyschoolbook
+monotype_century_schoolbook_bold=newcenturyschoolbook_bold
+monotype_century_schoolbook_italic=newcenturyschoolbook_italic
+monotype_century_schoolbook_bold_italic=newcenturyschoolbook_bold_italic
+#
+newcenturyschoolbook=newcenturyschoolbook
+newcenturyschoolbook_bold=newcenturyschoolbook_bold
+newcenturyschoolbook_italic=newcenturyschoolbook_italic
+newcenturyschoolbook_bold_italic=newcenturyschoolbook_bold_italic
+#
+palatino=palatino
+palatino_bold=palatino_bold
+palatino_italic=palatino_italic
+palatino_bold_italic=palatino_bold_italic
+#
+# Exclude "times" on its own as that's a legacy name for a logical font
+times_bold=times_roman_bold
+times_italic=times_roman_italic
+times_bold_italic=times_roman_bold_italic
+#
+times_roman=times_roman
+times_roman_bold=times_roman_bold
+times_roman_italic=times_roman_italic
+times_roman_bold_italic=times_roman_bold_italic
+#
+times_new_roman=times_roman
+times_new_roman_bold=times_roman_bold
+times_new_roman_italic=times_roman_italic
+times_new_roman_bold_italic=times_roman_bold_italic
+#
+zapfchancery_italic=zapfchancery_italic
+itczapfchancery_italic=zapfchancery_italic
+#
+# Next the mapping of the font name + charset + style to Postscript font name
+# for the logical fonts.
+#
+serif.latin1.plain=Times-Roman
+serif.latin1.bold=Times-Bold
+serif.latin1.italic=Times-Italic
+serif.latin1.bolditalic=Times-BoldItalic
+serif.symbol.plain=Symbol
+serif.dingbats.plain=ZapfDingbats
+serif.symbol.bold=Symbol
+serif.dingbats.bold=ZapfDingbats
+serif.symbol.italic=Symbol
+serif.dingbats.italic=ZapfDingbats
+serif.symbol.bolditalic=Symbol
+serif.dingbats.bolditalic=ZapfDingbats
+#
+sansserif.latin1.plain=Helvetica
+sansserif.latin1.bold=Helvetica-Bold
+sansserif.latin1.italic=Helvetica-Oblique
+sansserif.latin1.bolditalic=Helvetica-BoldOblique
+sansserif.symbol.plain=Symbol
+sansserif.dingbats.plain=ZapfDingbats
+sansserif.symbol.bold=Symbol
+sansserif.dingbats.bold=ZapfDingbats
+sansserif.symbol.italic=Symbol
+sansserif.dingbats.italic=ZapfDingbats
+sansserif.symbol.bolditalic=Symbol
+sansserif.dingbats.bolditalic=ZapfDingbats
+#
+monospaced.latin1.plain=Courier
+monospaced.latin1.bold=Courier-Bold
+monospaced.latin1.italic=Courier-Oblique
+monospaced.latin1.bolditalic=Courier-BoldOblique
+monospaced.symbol.plain=Symbol
+monospaced.dingbats.plain=ZapfDingbats
+monospaced.symbol.bold=Symbol
+monospaced.dingbats.bold=ZapfDingbats
+monospaced.symbol.italic=Symbol
+monospaced.dingbats.italic=ZapfDingbats
+monospaced.symbol.bolditalic=Symbol
+monospaced.dingbats.bolditalic=ZapfDingbats
+#
+# Next the mapping of the font name + charset + style to Postscript font name
+# for the physical fonts. Since these always report style as plain, the
+# style key is always plain. So we map using the face name to the correct
+# style for the postscript font. This is possible since the face names can
+# be replied upon to be different for each style.
+# However an application may try to create a Font applying a style to an
+# physical name. We want to map to the correct Postscript font there too
+# if possible but we do not map cases where the application tries to
+# augment a style (eg ask for a bold version of a bold font)
+# Defer to the 2D package to attempt create an artificially styled version
+#
+avantgarde_book.latin1.plain=AvantGarde-Book
+avantgarde_demi.latin1.plain=AvantGarde-Demi
+avantgarde_book_oblique.latin1.plain=AvantGarde-BookOblique
+avantgarde_demi_oblique.latin1.plain=AvantGarde-DemiOblique
+#
+avantgarde_book.latin1.bold=AvantGarde-Demi
+avantgarde_book.latin1.italic=AvantGarde-BookOblique
+avantgarde_book.latin1.bolditalic=AvantGarde-DemiOblique
+avantgarde_demi.latin1.italic=AvantGarde-DemiOblique
+avantgarde_book_oblique.latin1.bold=AvantGarde-DemiOblique
+#
+bookman_light.latin1.plain=Bookman-Light
+bookman_demi.latin1.plain=Bookman-Demi
+bookman_light_italic.latin1.plain=Bookman-LightItalic
+bookman_demi_italic.latin1.plain=Bookman-DemiItalic
+#
+bookman_light.latin1.bold=Bookman-Demi
+bookman_light.latin1.italic=Bookman-LightItalic
+bookman_light.latin1.bolditalic=Bookman-DemiItalic
+bookman_light_bold.latin1.italic=Bookman-DemiItalic
+bookman_light_italic.latin1.bold=Bookman-DemiItalic
+#
+courier.latin1.plain=Courier
+courier_bold.latin1.plain=Courier-Bold
+courier_oblique.latin1.plain=Courier-Oblique
+courier_bold_oblique.latin1.plain=Courier-BoldOblique
+courier.latin1.bold=Courier-Bold
+courier.latin1.italic=Courier-Oblique
+courier.latin1.bolditalic=Courier-BoldOblique
+courier_bold.latin1.italic=Courier-BoldOblique
+courier_italic.latin1.bold=Courier-BoldOblique
+#
+helvetica_bold.latin1.plain=Helvetica-Bold
+helvetica_oblique.latin1.plain=Helvetica-Oblique
+helvetica_bold_oblique.latin1.plain=Helvetica-BoldOblique
+helvetica.latin1.bold=Helvetica-Bold
+helvetica.latin1.italic=Helvetica-Oblique
+helvetica.latin1.bolditalic=Helvetica-BoldOblique
+helvetica_bold.latin1.italic=Helvetica-BoldOblique
+helvetica_italic.latin1.bold=Helvetica-BoldOblique
+#
+newcenturyschoolbook.latin1.plain=NewCenturySchlbk-Roman
+newcenturyschoolbook_bold.latin1.plain=NewCenturySchlbk-Bold
+newcenturyschoolbook_italic.latin1.plain=NewCenturySchlbk-Italic
+newcenturyschoolbook_bold_italic.latin1.plain=NewCenturySchlbk-BoldItalic
+newcenturyschoolbook.latin1.bold=NewCenturySchlbk-Bold
+newcenturyschoolbook.latin1.italic=NewCenturySchlbk-Italic
+newcenturyschoolbook.latin1.bolditalic=NewCenturySchlbk-BoldItalic
+newcenturyschoolbook_bold.latin1.italic=NewCenturySchlbk-BoldItalic
+newcenturyschoolbook_italic.latin1.bold=NewCenturySchlbk-BoldItalic
+#
+palatino.latin1.plain=Palatino-Roman
+palatino_bold.latin1.plain=Palatino-Bold
+palatino_italic.latin1.plain=Palatino-Italic
+palatino_bold_italic.latin1.plain=Palatino-BoldItalic
+palatino.latin1.bold=Palatino-Bold
+palatino.latin1.italic=Palatino-Italic
+palatino.latin1.bolditalic=Palatino-BoldItalic
+palatino_bold.latin1.italic=Palatino-BoldItalic
+palatino_italic.latin1.bold=Palatino-BoldItalic
+#
+times_roman.latin1.plain=Times-Roman
+times_roman_bold.latin1.plain=Times-Bold
+times_roman_italic.latin1.plain=Times-Italic
+times_roman_bold_italic.latin1.plain=Times-BoldItalic
+times_roman.latin1.bold=Times-Bold
+times_roman.latin1.italic=Times-Italic
+times_roman.latin1.bolditalic=Times-BoldItalic
+times_roman_bold.latin1.italic=Times-BoldItalic
+times_roman_italic.latin1.bold=Times-BoldItalic
+#
+zapfchancery_italic.latin1.plain=ZapfChancery-MediumItalic
+#
+# Finally the mappings of PS font names to indexes.
+#
+AvantGarde-Book=0
+AvantGarde-BookOblique=1
+AvantGarde-Demi=2
+AvantGarde-DemiOblique=3
+Bookman-Demi=4
+Bookman-DemiItalic=5
+Bookman-Light=6
+Bookman-LightItalic=7
+Courier=8
+Courier-Bold=9
+Courier-BoldOblique=10
+Courier-Oblique=11
+Helvetica=12
+Helvetica-Bold=13
+Helvetica-BoldOblique=14
+Helvetica-Narrow=15
+Helvetica-Narrow-Bold=16
+Helvetica-Narrow-BoldOblique=17
+Helvetica-Narrow-Oblique=18
+Helvetica-Oblique=19
+NewCenturySchlbk-Bold=20
+NewCenturySchlbk-BoldItalic=21
+NewCenturySchlbk-Italic=22
+NewCenturySchlbk-Roman=23
+Palatino-Bold=24
+Palatino-BoldItalic=25
+Palatino-Italic=26
+Palatino-Roman=27
+Symbol=28
+Times-Bold=29
+Times-BoldItalic=30
+Times-Italic=31
+Times-Roman=32
+ZapfDingbats=33
+ZapfChancery-MediumItalic=34
+#
+font.0=AvantGarde-Book ISOF
+font.1=AvantGarde-BookOblique ISOF
+font.2=AvantGarde-Demi ISOF
+font.3=AvantGarde-DemiOblique ISOF
+font.4=Bookman-Demi ISOF
+font.5=Bookman-DemiItalic ISOF
+font.6=Bookman-Light ISOF
+font.7=Bookman-LightItalic ISOF
+font.8=Courier ISOF
+font.9=Courier-Bold ISOF
+font.10=Courier-BoldOblique ISOF
+font.11=Courier-Oblique ISOF
+font.12=Helvetica ISOF
+font.13=Helvetica-Bold ISOF
+font.14=Helvetica-BoldOblique ISOF
+font.15=Helvetica-Narrow ISOF
+font.16=Helvetica-Narrow-Bold ISOF
+font.17=Helvetica-Narrow-BoldOblique ISOF
+font.18=Helvetica-Narrow-Oblique ISOF
+font.19=Helvetica-Oblique ISOF
+font.20=NewCenturySchlbk-Bold ISOF
+font.21=NewCenturySchlbk-BoldItalic ISOF
+font.22=NewCenturySchlbk-Italic ISOF
+font.23=NewCenturySchlbk-Roman ISOF
+font.24=Palatino-Bold ISOF
+font.25=Palatino-BoldItalic ISOF
+font.26=Palatino-Italic ISOF
+font.27=Palatino-Roman ISOF
+font.28=Symbol findfont
+font.29=Times-Bold ISOF
+font.30=Times-BoldItalic ISOF
+font.31=Times-Italic ISOF
+font.32=Times-Roman ISOF
+font.33=ZapfDingbats findfont
+font.34=ZapfChancery-MediumItalic ISOF
+#
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/resources.jar b/love2dToAPK/tools/tools/jdk-win/jre/lib/resources.jar
new file mode 100644
index 0000000..9438c56
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/resources.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/rt.jar b/love2dToAPK/tools/tools/jdk-win/jre/lib/rt.jar
new file mode 100644
index 0000000..85f2af2
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/rt.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/security/US_export_policy.jar b/love2dToAPK/tools/tools/jdk-win/jre/lib/security/US_export_policy.jar
new file mode 100644
index 0000000..3d331bb
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/security/US_export_policy.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/security/blacklist b/love2dToAPK/tools/tools/jdk-win/jre/lib/security/blacklist
new file mode 100644
index 0000000..9dfe2f3
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/security/blacklist
@@ -0,0 +1,95 @@
+# JNLPAppletLauncher applet-launcher.jar
+SHA1-Digest-Manifest: 5Bo5/eg892hQ9mgbUW56iDmsp1k=
+
+# 7066583
+SHA1-Digest-Manifest: x17xGEFzBRXY2pLtXiIbp8J7U9M=
+SHA1-Digest-Manifest: ya6YNTzMCFYUO4lwhmz9OWhhIz8=
+SHA1-Digest-Manifest: YwuPyF/KMcxcQhgxilzNybFM2+8=
+
+# 7066809
+SHA1-Digest-Manifest: dBKbNW1PZSjJ0lGcCeewcCrYx5g=
+SHA1-Digest-Manifest: lTYCkD1wm5uDcp2G2PNPcADG/ds=
+SHA1-Digest-Manifest: GKwQJtblDEuSVf3LdC1ojpUJRGg=
+
+# 7186931
+SHA1-Digest-Manifest: 0CUppG7J6IL8xHqPCnA377Koahw=
+SHA1-Digest-Manifest: 3aJU1qSK6IYmt5MSh2IIIj5G1XE=
+SHA1-Digest-Manifest: 8F4F0TXA4ureZbfEXWIFm76QGg4=
+SHA1-Digest-Manifest: B1NaDg834Bgg+VE9Ca+tDZOd2BI=
+SHA1-Digest-Manifest: bOoQga+XxC3j0HiP552+fYCdswo=
+SHA1-Digest-Manifest: C4mtepHAyIKiAjjqOm6xYMo8TkM=
+SHA1-Digest-Manifest: cDXEH+bR01R8QVxL+KFKYqFgsR0=
+SHA1-Digest-Manifest: cO2ccW2cckTvpR0HVgQa362PyHI=
+SHA1-Digest-Manifest: D/TyRle6Sl+CDuBFmdOPy03ERaw=
+SHA1-Digest-Manifest: eJfWm86yHp2Oz5U8WrMKbpv6GGA=
+SHA1-Digest-Manifest: g3mA5HqcRBlKaUVQsapnKhOSEas=
+SHA1-Digest-Manifest: HSPXCvBNG/PaSXg8thDGqSeZlR8=
+SHA1-Digest-Manifest: iMHjGyv5gEnTi8uj68yzalml8XQ=
+SHA1-Digest-Manifest: jd5MvBoWh7aHiUa1v15lqXVQ9y4=
+SHA1-Digest-Manifest: L0l3WOuMNWujmXo5+O/GtmGyyYk=
+SHA1-Digest-Manifest: l4meuozuSFLkTZTS6xW3sixdlBI=
+SHA1-Digest-Manifest: l93uYyDZGyynzYTknp31yyuNivU=
+SHA1-Digest-Manifest: lbhLWSopUIqPQ08UVIA927Y7jZQ=
+SHA1-Digest-Manifest: nv5+0eBNHpRIsB9D6TmEbWoNCTs=
+SHA1-Digest-Manifest: obWCTaz3uOZwDBDZUsbrrTKoDig=
+SHA1-Digest-Manifest: odqJCMnKdgvQLOCAMSWEj1EPQTc=
+SHA1-Digest-Manifest: OfQZHjo8GK14bHD4z4dDIp4ZFjE=
+SHA1-Digest-Manifest: PVAkXuUCgiDQI19GPrw01Vz4rGQ=
+SHA1-Digest-Manifest: Q9HXbUcSCjhwkgpk5NNVG/sArVA=
+SHA1-Digest-Manifest: qMVUh9i3yJcTKpuZYSFZH9dspqE=
+SHA1-Digest-Manifest: TFYT30IirbYk89l/uKykM6g2cVQ=
+SHA1-Digest-Manifest: trhKo6XiSGxRrS//rCL9e3Ca6D4=
+SHA1-Digest-Manifest: uWffvhFaWVw3lrER/SJH7Hl4yFg=
+SHA1-Digest-Manifest: vSd+kv1p+3jrVK9FjDCBJcoy5us=
+SHA1-Digest-Manifest: WX77FlRyFyeUriu+xi/PE1uLALU=
+SHA1-Digest-Manifest: WyqHV02O4PYZkcbidH4HKlp/8hY=
+SHA1-Digest-Manifest: Y82nn7CFTu1XAOCDjemWwyPLssg=
+
+# 8002218
+SHA1-Digest-Manifest: saJIx2dYM4ac+paV09g7hyvF7rs=
+SHA1-Digest-Manifest: hYV/Hs2xEIHeidB+9ZVjAtTBr/g=
+
+# 8016260
+SHA1-Digest-Manifest: 0smdeWASG13zex3fGDxo83K7qYo=
+SHA1-Digest-Manifest: 4WnMPDBMLBjDfKvAj69W0KuSS8w=
+SHA1-Digest-Manifest: 8j/GuWpBhLDCVZBHU1MQNOiDsvM=
+SHA1-Digest-Manifest: AR4m0ypEY28WDWxcbuFu9kj5Zjc=
+SHA1-Digest-Manifest: GfE+OoJReiuOJ+pKLOZu+Vu0WEM=
+SHA1-Digest-Manifest: X3VMVm3b45zxF3/ADtQHa/uIKJU=
+SHA1-Digest-Manifest: arC0JJpAy9ZvSEXRYy49Ye2CibQ=
+SHA1-Digest-Manifest: pkjJdE2tSwj6et5Bi4mMWF5acSc=
+SHA1-Digest-Manifest: sn3aY301ITBSofNBRNcr7ThjaGI=
+
+# 8017544
+SHA1-Digest-Manifest: fkUYOYVHwIrvWEVwB1HAcovhNEc=
+
+# 8021173
+SHA1-Digest-Manifest: Dz2BT/+NVo3sql0U3m5sPFdH/VA=
+
+# 8037056
+SHA1-Digest-Manifest: MVlhreomxYWnvgDArNM90zet5W0=
+SHA1-Digest-Manifest: w5irJZDYfOvvHy+O/VIIz2cKw3w=
+SHA1-Digest-Manifest: KPRzEcU95ksGJcok+QoDFLuH1QQ=
+SHA1-Digest-Manifest: ez41Owng2PUbr2C5rioCQQsm/b0=
+SHA-256-Digest-Manifest: VLL/4H0q9NvvtmcFOJ4Xby/5A8CLvniP17VCOFDh7sU=
+SHA1-Digest-Manifest: pmEfDqcnm+9D5OfuJbCdyl/5KhQ=
+SHA1-Digest-Manifest: HG+pOMGiD4nq7aBST8PmLBRXYSo=
+SHA1-Digest-Manifest: 44zEyySUXrZjoYLatw4tftx8clM=
+SHA1-Digest-Manifest: fK87QwgSCJzZ/6qEPFG3AkrKvZg=
+SHA1-Digest-Manifest: jElS0V6NAE1eAGRcoipqAh4m3gE=
+SHA1-Digest-Manifest: XBjfIsdA7VHbWJhwq2jQtm82bL0=
+SHA1-Digest-Manifest: /pFoxkI0CBIj8WqLDYR5jpaQ3uU=
+SHA1-Digest-Manifest: LbWvEAjCRxp5eJGBM23aT+HIkD4=
+SHA1-Digest-Manifest: GIOU0xrFoKvwp/fe0MV5BeQG2dQ=
+SHA1-Digest-Manifest: Tb/mRuIKYF7NBYRSZycBgpHaj6s=
+SHA1-Digest-Manifest: wD5oyERifHf8PXCgztVoSicsEHc=
+SHA1-Digest-Manifest: rWsJWE9ROgb01ZMvLIboUaKFdYg=
+SHA1-Digest-Manifest: BYVBeMAT5dhNcv11cG8w00udM2I=
+SHA1-Digest-Manifest: 3+g4kzj8ObkUJBTmbbgrXInfziU=
+SHA-256-Digest-Manifest: Kx3zq14JuV5ByE35cwkegUnCsiAvBRa4Q6iNQ/JO7I0=
+SHA1-Digest-Manifest: L+0tzPoloVGMtoykhAuZASD3g0g=
+
+# 8067454
+SHA1-Digest-Manifest: mF8yk1Hxc1uH9UorvfG2GJ+ScqY=
+SHA1-Digest-Manifest: yUcLgsHB7H6rf04gLNe0ikKrmfI=
+SHA1-Digest-Manifest: UcdnWBajIuVvJjoGHAPA11Gkg7E=
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/security/blacklisted.certs b/love2dToAPK/tools/tools/jdk-win/jre/lib/security/blacklisted.certs
new file mode 100644
index 0000000..aeac08f
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/security/blacklisted.certs
@@ -0,0 +1,19 @@
+Algorithm=SHA-256
+14E6D2764A4B06701C6CBC376A253775F79C782FBCB6C0EE6F99DE4BA1024ADD
+31C8FD37DB9B56E708B03D1F01848B068C6DA66F36FB5D82C008C6040FA3E133
+3946901F46B0071E90D78279E82FABABCA177231A704BE72C5B0E8918566EA66
+450F1B421BB05C8609854884559C323319619E8B06B001EA2DCBB74A23AA3BE2
+4CBBF8256BC9888A8007B2F386940A2E394378B0D903CBB3863C5A6394B889CE
+4FEE0163686ECBD65DB968E7494F55D84B25486D438E9DE558D629D28CD4D176
+5E83124D68D24E8E177E306DF643D5EA99C5A94D6FC34B072F7544A1CABB7C7B
+76A45A496031E4DD2D7ED23E8F6FF97DBDEA980BAAC8B0BA94D7EDB551348645
+8A1BD21661C60015065212CC98B1ABB50DFD14C872A208E66BAE890F25C448AF
+9ED8F9B0E8E42A1656B8E1DD18F42BA42DC06FE52686173BA2FC70E756F207DC
+A686FEE577C88AB664D0787ECDFFF035F4806F3DE418DC9E4D516324FFF02083
+B8686723E415534BC0DBD16326F9486F85B0B0799BF6639334E61DAAE67F36CD
+D24566BF315F4E597D6E381C87119FB4198F5E9E2607F5F4AB362EF7E2E7672F
+D3A936E1A7775A45217C8296A1F22AC5631DCDEC45594099E78EEEBBEDCBA967
+DF21016B00FC54F9FE3BC8B039911BB216E9162FAD2FD14D990AB96E951B49BE
+F5B6F88F75D391A4B1EB336F9E201239FB6B1377DB8CFA7B84736216E5AFFFD7
+FC02FD48DB92D4DCE6F11679D38354CF750CFC7F584A520EB90BDE80E241F2BD
+FDEDB5BDFCB67411513A61AEE5CB5B5D7C52AF06028EFC996CC1B05B1D6CEA2B
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/security/cacerts b/love2dToAPK/tools/tools/jdk-win/jre/lib/security/cacerts
new file mode 100644
index 0000000..9e1e8a8
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/security/cacerts
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/security/java.policy b/love2dToAPK/tools/tools/jdk-win/jre/lib/security/java.policy
new file mode 100644
index 0000000..120694d
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/security/java.policy
@@ -0,0 +1,49 @@
+
+// Standard extensions get all permissions by default
+
+grant codeBase "file:${{java.ext.dirs}}/*" {
+ permission java.security.AllPermission;
+};
+
+// default permissions granted to all domains
+
+grant {
+ // Allows any thread to stop itself using the java.lang.Thread.stop()
+ // method that takes no argument.
+ // Note that this permission is granted by default only to remain
+ // backwards compatible.
+ // It is strongly recommended that you either remove this permission
+ // from this policy file or further restrict it to code sources
+ // that you specify, because Thread.stop() is potentially unsafe.
+ // See the API specification of java.lang.Thread.stop() for more
+ // information.
+ permission java.lang.RuntimePermission "stopThread";
+
+ // allows anyone to listen on dynamic ports
+ permission java.net.SocketPermission "localhost:0", "listen";
+
+ // "standard" properies that can be read by anyone
+
+ permission java.util.PropertyPermission "java.version", "read";
+ permission java.util.PropertyPermission "java.vendor", "read";
+ permission java.util.PropertyPermission "java.vendor.url", "read";
+ permission java.util.PropertyPermission "java.class.version", "read";
+ permission java.util.PropertyPermission "os.name", "read";
+ permission java.util.PropertyPermission "os.version", "read";
+ permission java.util.PropertyPermission "os.arch", "read";
+ permission java.util.PropertyPermission "file.separator", "read";
+ permission java.util.PropertyPermission "path.separator", "read";
+ permission java.util.PropertyPermission "line.separator", "read";
+
+ permission java.util.PropertyPermission "java.specification.version", "read";
+ permission java.util.PropertyPermission "java.specification.vendor", "read";
+ permission java.util.PropertyPermission "java.specification.name", "read";
+
+ permission java.util.PropertyPermission "java.vm.specification.version", "read";
+ permission java.util.PropertyPermission "java.vm.specification.vendor", "read";
+ permission java.util.PropertyPermission "java.vm.specification.name", "read";
+ permission java.util.PropertyPermission "java.vm.version", "read";
+ permission java.util.PropertyPermission "java.vm.vendor", "read";
+ permission java.util.PropertyPermission "java.vm.name", "read";
+};
+
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/security/java.security b/love2dToAPK/tools/tools/jdk-win/jre/lib/security/java.security
new file mode 100644
index 0000000..7746fff
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/security/java.security
@@ -0,0 +1,528 @@
+#
+# This is the "master security properties file".
+#
+# An alternate java.security properties file may be specified
+# from the command line via the system property
+#
+# -Djava.security.properties=<URL>
+#
+# This properties file appends to the master security properties file.
+# If both properties files specify values for the same key, the value
+# from the command-line properties file is selected, as it is the last
+# one loaded.
+#
+# Also, if you specify
+#
+# -Djava.security.properties==<URL> (2 equals),
+#
+# then that properties file completely overrides the master security
+# properties file.
+#
+# To disable the ability to specify an additional properties file from
+# the command line, set the key security.overridePropertiesFile
+# to false in the master security properties file. It is set to true
+# by default.
+
+# In this file, various security properties are set for use by
+# java.security classes. This is where users can statically register
+# Cryptography Package Providers ("providers" for short). The term
+# "provider" refers to a package or set of packages that supply a
+# concrete implementation of a subset of the cryptography aspects of
+# the Java Security API. A provider may, for example, implement one or
+# more digital signature algorithms or message digest algorithms.
+#
+# Each provider must implement a subclass of the Provider class.
+# To register a provider in this master security properties file,
+# specify the Provider subclass name and priority in the format
+#
+# security.provider.<n>=<className>
+#
+# This declares a provider, and specifies its preference
+# order n. The preference order is the order in which providers are
+# searched for requested algorithms (when no specific provider is
+# requested). The order is 1-based; 1 is the most preferred, followed
+# by 2, and so on.
+#
+# <className> must specify the subclass of the Provider class whose
+# constructor sets the values of various properties that are required
+# for the Java Security API to look up the algorithms or other
+# facilities implemented by the provider.
+#
+# There must be at least one provider specification in java.security.
+# There is a default provider that comes standard with the JDK. It
+# is called the "SUN" provider, and its Provider subclass
+# named Sun appears in the sun.security.provider package. Thus, the
+# "SUN" provider is registered via the following:
+#
+# security.provider.1=sun.security.provider.Sun
+#
+# (The number 1 is used for the default provider.)
+#
+# Note: Providers can be dynamically registered instead by calls to
+# either the addProvider or insertProviderAt method in the Security
+# class.
+
+#
+# List of providers and their preference orders (see above):
+#
+security.provider.1=sun.security.provider.Sun
+security.provider.2=sun.security.rsa.SunRsaSign
+security.provider.3=sun.security.ec.SunEC
+security.provider.4=com.sun.net.ssl.internal.ssl.Provider
+security.provider.5=com.sun.crypto.provider.SunJCE
+security.provider.6=sun.security.jgss.SunProvider
+security.provider.7=com.sun.security.sasl.Provider
+security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
+security.provider.9=sun.security.smartcardio.SunPCSC
+security.provider.10=sun.security.mscapi.SunMSCAPI
+
+#
+# Sun Provider SecureRandom seed source.
+#
+# Select the primary source of seed data for the "SHA1PRNG" and
+# "NativePRNG" SecureRandom implementations in the "Sun" provider.
+# (Other SecureRandom implementations might also use this property.)
+#
+# On Unix-like systems (for example, Solaris/Linux/MacOS), the
+# "NativePRNG" and "SHA1PRNG" implementations obtains seed data from
+# special device files such as file:/dev/random.
+#
+# On Windows systems, specifying the URLs "file:/dev/random" or
+# "file:/dev/urandom" will enable the native Microsoft CryptoAPI seeding
+# mechanism for SHA1PRNG.
+#
+# By default, an attempt is made to use the entropy gathering device
+# specified by the "securerandom.source" Security property. If an
+# exception occurs while accessing the specified URL:
+#
+# SHA1PRNG:
+# the traditional system/thread activity algorithm will be used.
+#
+# NativePRNG:
+# a default value of /dev/random will be used. If neither
+# are available, the implementation will be disabled.
+# "file" is the only currently supported protocol type.
+#
+# The entropy gathering device can also be specified with the System
+# property "java.security.egd". For example:
+#
+# % java -Djava.security.egd=file:/dev/random MainClass
+#
+# Specifying this System property will override the
+# "securerandom.source" Security property.
+#
+# In addition, if "file:/dev/random" or "file:/dev/urandom" is
+# specified, the "NativePRNG" implementation will be more preferred than
+# SHA1PRNG in the Sun provider.
+#
+securerandom.source=file:/dev/random
+
+#
+# A list of known strong SecureRandom implementations.
+#
+# To help guide applications in selecting a suitable strong
+# java.security.SecureRandom implementation, Java distributions should
+# indicate a list of known strong implementations using the property.
+#
+# This is a comma-separated list of algorithm and/or algorithm:provider
+# entries.
+#
+securerandom.strongAlgorithms=Windows-PRNG:SunMSCAPI,SHA1PRNG:SUN
+
+#
+# Class to instantiate as the javax.security.auth.login.Configuration
+# provider.
+#
+login.configuration.provider=sun.security.provider.ConfigFile
+
+#
+# Default login configuration file
+#
+#login.config.url.1=file:${user.home}/.java.login.config
+
+#
+# Class to instantiate as the system Policy. This is the name of the class
+# that will be used as the Policy object.
+#
+policy.provider=sun.security.provider.PolicyFile
+
+# The default is to have a single system-wide policy file,
+# and a policy file in the user's home directory.
+policy.url.1=file:${java.home}/lib/security/java.policy
+policy.url.2=file:${user.home}/.java.policy
+
+# whether or not we expand properties in the policy file
+# if this is set to false, properties (${...}) will not be expanded in policy
+# files.
+policy.expandProperties=true
+
+# whether or not we allow an extra policy to be passed on the command line
+# with -Djava.security.policy=somefile. Comment out this line to disable
+# this feature.
+policy.allowSystemProperty=true
+
+# whether or not we look into the IdentityScope for trusted Identities
+# when encountering a 1.1 signed JAR file. If the identity is found
+# and is trusted, we grant it AllPermission.
+policy.ignoreIdentityScope=false
+
+#
+# Default keystore type.
+#
+keystore.type=jks
+
+#
+# List of comma-separated packages that start with or equal this string
+# will cause a security exception to be thrown when
+# passed to checkPackageAccess unless the
+# corresponding RuntimePermission ("accessClassInPackage."+package) has
+# been granted.
+package.access=sun.,\
+ com.sun.xml.internal.,\
+ com.sun.imageio.,\
+ com.sun.istack.internal.,\
+ com.sun.jmx.,\
+ com.sun.media.sound.,\
+ com.sun.naming.internal.,\
+ com.sun.proxy.,\
+ com.sun.corba.se.,\
+ com.sun.org.apache.bcel.internal.,\
+ com.sun.org.apache.regexp.internal.,\
+ com.sun.org.apache.xerces.internal.,\
+ com.sun.org.apache.xpath.internal.,\
+ com.sun.org.apache.xalan.internal.extensions.,\
+ com.sun.org.apache.xalan.internal.lib.,\
+ com.sun.org.apache.xalan.internal.res.,\
+ com.sun.org.apache.xalan.internal.templates.,\
+ com.sun.org.apache.xalan.internal.utils.,\
+ com.sun.org.apache.xalan.internal.xslt.,\
+ com.sun.org.apache.xalan.internal.xsltc.cmdline.,\
+ com.sun.org.apache.xalan.internal.xsltc.compiler.,\
+ com.sun.org.apache.xalan.internal.xsltc.trax.,\
+ com.sun.org.apache.xalan.internal.xsltc.util.,\
+ com.sun.org.apache.xml.internal.res.,\
+ com.sun.org.apache.xml.internal.security.,\
+ com.sun.org.apache.xml.internal.serializer.utils.,\
+ com.sun.org.apache.xml.internal.utils.,\
+ com.sun.org.glassfish.,\
+ com.oracle.xmlns.internal.,\
+ com.oracle.webservices.internal.,\
+ oracle.jrockit.jfr.,\
+ org.jcp.xml.dsig.internal.,\
+ jdk.internal.,\
+ jdk.nashorn.internal.,\
+ jdk.nashorn.tools.,\
+ com.sun.activation.registries.,\
+ com.sun.java.accessibility.,\
+ com.sun.browser.,\
+ com.sun.glass.,\
+ com.sun.javafx.,\
+ com.sun.media.,\
+ com.sun.openpisces.,\
+ com.sun.prism.,\
+ com.sun.scenario.,\
+ com.sun.t2k.,\
+ com.sun.pisces.,\
+ com.sun.webkit.,\
+ jdk.management.resource.internal.
+
+#
+# List of comma-separated packages that start with or equal this string
+# will cause a security exception to be thrown when
+# passed to checkPackageDefinition unless the
+# corresponding RuntimePermission ("defineClassInPackage."+package) has
+# been granted.
+#
+# by default, none of the class loaders supplied with the JDK call
+# checkPackageDefinition.
+#
+package.definition=sun.,\
+ com.sun.xml.internal.,\
+ com.sun.imageio.,\
+ com.sun.istack.internal.,\
+ com.sun.jmx.,\
+ com.sun.media.sound.,\
+ com.sun.naming.internal.,\
+ com.sun.proxy.,\
+ com.sun.corba.se.,\
+ com.sun.org.apache.bcel.internal.,\
+ com.sun.org.apache.regexp.internal.,\
+ com.sun.org.apache.xerces.internal.,\
+ com.sun.org.apache.xpath.internal.,\
+ com.sun.org.apache.xalan.internal.extensions.,\
+ com.sun.org.apache.xalan.internal.lib.,\
+ com.sun.org.apache.xalan.internal.res.,\
+ com.sun.org.apache.xalan.internal.templates.,\
+ com.sun.org.apache.xalan.internal.utils.,\
+ com.sun.org.apache.xalan.internal.xslt.,\
+ com.sun.org.apache.xalan.internal.xsltc.cmdline.,\
+ com.sun.org.apache.xalan.internal.xsltc.compiler.,\
+ com.sun.org.apache.xalan.internal.xsltc.trax.,\
+ com.sun.org.apache.xalan.internal.xsltc.util.,\
+ com.sun.org.apache.xml.internal.res.,\
+ com.sun.org.apache.xml.internal.security.,\
+ com.sun.org.apache.xml.internal.serializer.utils.,\
+ com.sun.org.apache.xml.internal.utils.,\
+ com.sun.org.glassfish.,\
+ com.oracle.xmlns.internal.,\
+ com.oracle.webservices.internal.,\
+ oracle.jrockit.jfr.,\
+ org.jcp.xml.dsig.internal.,\
+ jdk.internal.,\
+ jdk.nashorn.internal.,\
+ jdk.nashorn.tools.,\
+ com.sun.activation.registries.,\
+ com.sun.java.accessibility.,\
+ com.sun.browser.,\
+ com.sun.glass.,\
+ com.sun.javafx.,\
+ com.sun.media.,\
+ com.sun.openpisces.,\
+ com.sun.prism.,\
+ com.sun.scenario.,\
+ com.sun.t2k.,\
+ com.sun.pisces.,\
+ com.sun.webkit.,\
+ jdk.management.resource.internal.
+
+#
+# Determines whether this properties file can be appended to
+# or overridden on the command line via -Djava.security.properties
+#
+security.overridePropertiesFile=true
+
+#
+# Determines the default key and trust manager factory algorithms for
+# the javax.net.ssl package.
+#
+ssl.KeyManagerFactory.algorithm=SunX509
+ssl.TrustManagerFactory.algorithm=PKIX
+
+#
+# The Java-level namelookup cache policy for successful lookups:
+#
+# any negative value: caching forever
+# any positive value: the number of seconds to cache an address for
+# zero: do not cache
+#
+# default value is forever (FOREVER). For security reasons, this
+# caching is made forever when a security manager is set. When a security
+# manager is not set, the default behavior in this implementation
+# is to cache for 30 seconds.
+#
+# NOTE: setting this to anything other than the default value can have
+# serious security implications. Do not set it unless
+# you are sure you are not exposed to DNS spoofing attack.
+#
+#networkaddress.cache.ttl=-1
+
+# The Java-level namelookup cache policy for failed lookups:
+#
+# any negative value: cache forever
+# any positive value: the number of seconds to cache negative lookup results
+# zero: do not cache
+#
+# In some Microsoft Windows networking environments that employ
+# the WINS name service in addition to DNS, name service lookups
+# that fail may take a noticeably long time to return (approx. 5 seconds).
+# For this reason the default caching policy is to maintain these
+# results for 10 seconds.
+#
+#
+networkaddress.cache.negative.ttl=10
+
+#
+# Properties to configure OCSP for certificate revocation checking
+#
+
+# Enable OCSP
+#
+# By default, OCSP is not used for certificate revocation checking.
+# This property enables the use of OCSP when set to the value "true".
+#
+# NOTE: SocketPermission is required to connect to an OCSP responder.
+#
+# Example,
+# ocsp.enable=true
+
+#
+# Location of the OCSP responder
+#
+# By default, the location of the OCSP responder is determined implicitly
+# from the certificate being validated. This property explicitly specifies
+# the location of the OCSP responder. The property is used when the
+# Authority Information Access extension (defined in RFC 3280) is absent
+# from the certificate or when it requires overriding.
+#
+# Example,
+# ocsp.responderURL=http://ocsp.example.net:80
+
+#
+# Subject name of the OCSP responder's certificate
+#
+# By default, the certificate of the OCSP responder is that of the issuer
+# of the certificate being validated. This property identifies the certificate
+# of the OCSP responder when the default does not apply. Its value is a string
+# distinguished name (defined in RFC 2253) which identifies a certificate in
+# the set of certificates supplied during cert path validation. In cases where
+# the subject name alone is not sufficient to uniquely identify the certificate
+# then both the "ocsp.responderCertIssuerName" and
+# "ocsp.responderCertSerialNumber" properties must be used instead. When this
+# property is set then those two properties are ignored.
+#
+# Example,
+# ocsp.responderCertSubjectName="CN=OCSP Responder, O=XYZ Corp"
+
+#
+# Issuer name of the OCSP responder's certificate
+#
+# By default, the certificate of the OCSP responder is that of the issuer
+# of the certificate being validated. This property identifies the certificate
+# of the OCSP responder when the default does not apply. Its value is a string
+# distinguished name (defined in RFC 2253) which identifies a certificate in
+# the set of certificates supplied during cert path validation. When this
+# property is set then the "ocsp.responderCertSerialNumber" property must also
+# be set. When the "ocsp.responderCertSubjectName" property is set then this
+# property is ignored.
+#
+# Example,
+# ocsp.responderCertIssuerName="CN=Enterprise CA, O=XYZ Corp"
+
+#
+# Serial number of the OCSP responder's certificate
+#
+# By default, the certificate of the OCSP responder is that of the issuer
+# of the certificate being validated. This property identifies the certificate
+# of the OCSP responder when the default does not apply. Its value is a string
+# of hexadecimal digits (colon or space separators may be present) which
+# identifies a certificate in the set of certificates supplied during cert path
+# validation. When this property is set then the "ocsp.responderCertIssuerName"
+# property must also be set. When the "ocsp.responderCertSubjectName" property
+# is set then this property is ignored.
+#
+# Example,
+# ocsp.responderCertSerialNumber=2A:FF:00
+
+#
+# Policy for failed Kerberos KDC lookups:
+#
+# When a KDC is unavailable (network error, service failure, etc), it is
+# put inside a blacklist and accessed less often for future requests. The
+# value (case-insensitive) for this policy can be:
+#
+# tryLast
+# KDCs in the blacklist are always tried after those not on the list.
+#
+# tryLess[:max_retries,timeout]
+# KDCs in the blacklist are still tried by their order in the configuration,
+# but with smaller max_retries and timeout values. max_retries and timeout
+# are optional numerical parameters (default 1 and 5000, which means once
+# and 5 seconds). Please notes that if any of the values defined here is
+# more than what is defined in krb5.conf, it will be ignored.
+#
+# Whenever a KDC is detected as available, it is removed from the blacklist.
+# The blacklist is reset when krb5.conf is reloaded. You can add
+# refreshKrb5Config=true to a JAAS configuration file so that krb5.conf is
+# reloaded whenever a JAAS authentication is attempted.
+#
+# Example,
+# krb5.kdc.bad.policy = tryLast
+# krb5.kdc.bad.policy = tryLess:2,2000
+krb5.kdc.bad.policy = tryLast
+
+# Algorithm restrictions for certification path (CertPath) processing
+#
+# In some environments, certain algorithms or key lengths may be undesirable
+# for certification path building and validation. For example, "MD2" is
+# generally no longer considered to be a secure hash algorithm. This section
+# describes the mechanism for disabling algorithms based on algorithm name
+# and/or key length. This includes algorithms used in certificates, as well
+# as revocation information such as CRLs and signed OCSP Responses.
+#
+# The syntax of the disabled algorithm string is described as this Java
+# BNF-style:
+# DisabledAlgorithms:
+# " DisabledAlgorithm { , DisabledAlgorithm } "
+#
+# DisabledAlgorithm:
+# AlgorithmName [Constraint]
+#
+# AlgorithmName:
+# (see below)
+#
+# Constraint:
+# KeySizeConstraint
+#
+# KeySizeConstraint:
+# keySize Operator DecimalInteger
+#
+# Operator:
+# <= | < | == | != | >= | >
+#
+# DecimalInteger:
+# DecimalDigits
+#
+# DecimalDigits:
+# DecimalDigit {DecimalDigit}
+#
+# DecimalDigit: one of
+# 1 2 3 4 5 6 7 8 9 0
+#
+# The "AlgorithmName" is the standard algorithm name of the disabled
+# algorithm. See "Java Cryptography Architecture Standard Algorithm Name
+# Documentation" for information about Standard Algorithm Names. Matching
+# is performed using a case-insensitive sub-element matching rule. (For
+# example, in "SHA1withECDSA" the sub-elements are "SHA1" for hashing and
+# "ECDSA" for signatures.) If the assertion "AlgorithmName" is a
+# sub-element of the certificate algorithm name, the algorithm will be
+# rejected during certification path building and validation. For example,
+# the assertion algorithm name "DSA" will disable all certificate algorithms
+# that rely on DSA, such as NONEwithDSA, SHA1withDSA. However, the assertion
+# will not disable algorithms related to "ECDSA".
+#
+# A "Constraint" provides further guidance for the algorithm being specified.
+# The "KeySizeConstraint" requires a key of a valid size range if the
+# "AlgorithmName" is of a key algorithm. The "DecimalInteger" indicates the
+# key size specified in number of bits. For example, "RSA keySize <= 1024"
+# indicates that any RSA key with key size less than or equal to 1024 bits
+# should be disabled, and "RSA keySize < 1024, RSA keySize > 2048" indicates
+# that any RSA key with key size less than 1024 or greater than 2048 should
+# be disabled. Note that the "KeySizeConstraint" only makes sense to key
+# algorithms.
+#
+# Note: This property is currently used by Oracle's PKIX implementation. It
+# is not guaranteed to be examined and used by other implementations.
+#
+# Example:
+# jdk.certpath.disabledAlgorithms=MD2, DSA, RSA keySize < 2048
+#
+#
+jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024
+
+# Algorithm restrictions for Secure Socket Layer/Transport Layer Security
+# (SSL/TLS) processing
+#
+# In some environments, certain algorithms or key lengths may be undesirable
+# when using SSL/TLS. This section describes the mechanism for disabling
+# algorithms during SSL/TLS security parameters negotiation, including
+# protocol version negotiation, cipher suites selection, peer authentication
+# and key exchange mechanisms.
+#
+# Disabled algorithms will not be negotiated for SSL/TLS connections, even
+# if they are enabled explicitly in an application.
+#
+# For PKI-based peer authentication and key exchange mechanisms, this list
+# of disabled algorithms will also be checked during certification path
+# building and validation, including algorithms used in certificates, as
+# well as revocation information such as CRLs and signed OCSP Responses.
+# This is in addition to the jdk.certpath.disabledAlgorithms property above.
+#
+# See the specification of "jdk.certpath.disabledAlgorithms" for the
+# syntax of the disabled algorithm string.
+#
+# Note: This property is currently used by Oracle's JSSE implementation.
+# It is not guaranteed to be examined and used by other implementations.
+#
+# Example:
+# jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
+jdk.tls.disabledAlgorithms=SSLv3
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/security/javaws.policy b/love2dToAPK/tools/tools/jdk-win/jre/lib/security/javaws.policy
new file mode 100644
index 0000000..708d0c7
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/security/javaws.policy
@@ -0,0 +1,5 @@
+
+grant codeBase "file:${jnlpx.home}/javaws.jar" {
+ permission java.security.AllPermission;
+};
+
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/security/local_policy.jar b/love2dToAPK/tools/tools/jdk-win/jre/lib/security/local_policy.jar
new file mode 100644
index 0000000..db97d19
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/security/local_policy.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/security/trusted.libraries b/love2dToAPK/tools/tools/jdk-win/jre/lib/security/trusted.libraries
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/security/trusted.libraries
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/sound.properties b/love2dToAPK/tools/tools/jdk-win/jre/lib/sound.properties
new file mode 100644
index 0000000..68309d1
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/sound.properties
@@ -0,0 +1,39 @@
+############################################################
+# Sound Configuration File
+############################################################
+#
+# This properties file is used to specify default service
+# providers for javax.sound.midi.MidiSystem and
+# javax.sound.sampled.AudioSystem.
+#
+# The following keys are recognized by MidiSystem methods:
+#
+# javax.sound.midi.Receiver
+# javax.sound.midi.Sequencer
+# javax.sound.midi.Synthesizer
+# javax.sound.midi.Transmitter
+#
+# The following keys are recognized by AudioSystem methods:
+#
+# javax.sound.sampled.Clip
+# javax.sound.sampled.Port
+# javax.sound.sampled.SourceDataLine
+# javax.sound.sampled.TargetDataLine
+#
+# The values specify the full class name of the service
+# provider, or the device name.
+#
+# See the class descriptions for details.
+#
+# Example 1:
+# Use MyDeviceProvider as default for SourceDataLines:
+# javax.sound.sampled.SourceDataLine=com.xyz.MyDeviceProvider
+#
+# Example 2:
+# Specify the default Synthesizer by its name "InternalSynth".
+# javax.sound.midi.Synthesizer=#InternalSynth
+#
+# Example 3:
+# Specify the default Receiver by provider and name:
+# javax.sound.midi.Receiver=com.sun.media.sound.MidiProvider#SunMIDI1
+#
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/tzdb.dat b/love2dToAPK/tools/tools/jdk-win/jre/lib/tzdb.dat
new file mode 100644
index 0000000..4357143
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/tzdb.dat
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/jre/lib/tzmappings b/love2dToAPK/tools/tools/jdk-win/jre/lib/tzmappings
new file mode 100644
index 0000000..0a0b8ad
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/jre/lib/tzmappings
@@ -0,0 +1,202 @@
+#
+# This file describes mapping information between Windows and Java
+# time zones.
+# Format: Each line should include a colon separated fields of Windows
+# time zone registry key, time zone mapID, locale (which is most
+# likely used in the time zone), and Java time zone ID. Blank lines
+# and lines that start with '#' are ignored. Data lines must be sorted
+# by mapID (ASCII order).
+#
+# NOTE
+# This table format is not a public interface of any Java
+# platforms. No applications should depend on this file in any form.
+#
+# This table has been generated by a program and should not be edited
+# manually.
+#
+Romance:-1,64::Europe/Paris:
+Romance Standard Time:-1,64::Europe/Paris:
+Warsaw:-1,65::Europe/Warsaw:
+Central Europe:-1,66::Europe/Prague:
+Central Europe Standard Time:-1,66::Europe/Prague:
+Prague Bratislava:-1,66::Europe/Prague:
+W. Central Africa Standard Time:-1,66:AO:Africa/Luanda:
+FLE:-1,67:FI:Europe/Helsinki:
+FLE Standard Time:-1,67:FI:Europe/Helsinki:
+GFT:-1,67::Europe/Athens:
+GFT Standard Time:-1,67::Europe/Athens:
+GTB:-1,67::Europe/Athens:
+GTB Standard Time:-1,67::Europe/Athens:
+Israel:-1,70::Asia/Jerusalem:
+Israel Standard Time:-1,70::Asia/Jerusalem:
+Arab:-1,71::Asia/Riyadh:
+Arab Standard Time:-1,71::Asia/Riyadh:
+Arabic Standard Time:-1,71:IQ:Asia/Baghdad:
+E. Africa:-1,71:KE:Africa/Nairobi:
+E. Africa Standard Time:-1,71:KE:Africa/Nairobi:
+Saudi Arabia:-1,71::Asia/Riyadh:
+Saudi Arabia Standard Time:-1,71::Asia/Riyadh:
+Iran:-1,72::Asia/Tehran:
+Iran Standard Time:-1,72::Asia/Tehran:
+Afghanistan:-1,73::Asia/Kabul:
+Afghanistan Standard Time:-1,73::Asia/Kabul:
+India:-1,74::Asia/Calcutta:
+India Standard Time:-1,74::Asia/Calcutta:
+Myanmar Standard Time:-1,74::Asia/Rangoon:
+Nepal Standard Time:-1,74::Asia/Katmandu:
+Sri Lanka:-1,74:LK:Asia/Colombo:
+Sri Lanka Standard Time:-1,74:LK:Asia/Colombo:
+Beijing:-1,75::Asia/Shanghai:
+China:-1,75::Asia/Shanghai:
+China Standard Time:-1,75::Asia/Shanghai:
+AUS Central:-1,76::Australia/Darwin:
+AUS Central Standard Time:-1,76::Australia/Darwin:
+Cen. Australia:-1,76::Australia/Adelaide:
+Cen. Australia Standard Time:-1,76::Australia/Adelaide:
+Vladivostok:-1,77::Asia/Vladivostok:
+Vladivostok Standard Time:-1,77::Asia/Vladivostok:
+West Pacific:-1,77:GU:Pacific/Guam:
+West Pacific Standard Time:-1,77:GU:Pacific/Guam:
+E. South America:-1,80::America/Sao_Paulo:
+E. South America Standard Time:-1,80::America/Sao_Paulo:
+Greenland Standard Time:-1,80:GL:America/Godthab:
+Newfoundland:-1,81::America/St_Johns:
+Newfoundland Standard Time:-1,81::America/St_Johns:
+Pacific SA:-1,82::America/Santiago:
+Pacific SA Standard Time:-1,82::America/Santiago:
+SA Western:-1,82:BO:America/La_Paz:
+SA Western Standard Time:-1,82:BO:America/La_Paz:
+SA Pacific:-1,83::America/Bogota:
+SA Pacific Standard Time:-1,83::America/Bogota:
+US Eastern:-1,84::America/Indianapolis:
+US Eastern Standard Time:-1,84::America/Indianapolis:
+Central America Standard Time:-1,85::America/Regina:
+Mexico:-1,85::America/Mexico_City:
+Mexico Standard Time:-1,85::America/Mexico_City:
+Canada Central:-1,86::America/Regina:
+Canada Central Standard Time:-1,86::America/Regina:
+US Mountain:-1,87::America/Phoenix:
+US Mountain Standard Time:-1,87::America/Phoenix:
+GMT:0,1::Europe/London:
+GMT Standard Time:0,1::Europe/London:
+Ekaterinburg:10,11::Asia/Yekaterinburg:
+Ekaterinburg Standard Time:10,11::Asia/Yekaterinburg:
+West Asia:10,11:UZ:Asia/Tashkent:
+West Asia Standard Time:10,11:UZ:Asia/Tashkent:
+Central Asia:12,13::Asia/Almaty:
+Central Asia Standard Time:12,13::Asia/Almaty:
+N. Central Asia Standard Time:12,13::Asia/Novosibirsk:
+Bangkok:14,15::Asia/Bangkok:
+Bangkok Standard Time:14,15::Asia/Bangkok:
+North Asia Standard Time:14,15::Asia/Krasnoyarsk:
+SE Asia:14,15::Asia/Bangkok:
+SE Asia Standard Time:14,15::Asia/Bangkok:
+North Asia East Standard Time:16,17:RU:Asia/Irkutsk:
+Singapore:16,17:SG:Asia/Singapore:
+Singapore Standard Time:16,17:SG:Asia/Singapore:
+Taipei:16,17::Asia/Taipei:
+Taipei Standard Time:16,17::Asia/Taipei:
+W. Australia:16,17:AU:Australia/Perth:
+W. Australia Standard Time:16,17:AU:Australia/Perth:
+Korea:18,19:KR:Asia/Seoul:
+Korea Standard Time:18,19:KR:Asia/Seoul:
+Tokyo:18,19::Asia/Tokyo:
+Tokyo Standard Time:18,19::Asia/Tokyo:
+Yakutsk:18,19:RU:Asia/Yakutsk:
+Yakutsk Standard Time:18,19:RU:Asia/Yakutsk:
+Central European:2,3:CS:Europe/Belgrade:
+Central European Standard Time:2,3:CS:Europe/Belgrade:
+W. Europe:2,3::Europe/Berlin:
+W. Europe Standard Time:2,3::Europe/Berlin:
+Tasmania:20,-1::Australia/Hobart:
+Tasmania Standard Time:20,-1::Australia/Hobart:
+AUS Eastern:20,21::Australia/Sydney:
+AUS Eastern Standard Time:20,21::Australia/Sydney:
+E. Australia:20,21::Australia/Brisbane:
+E. Australia Standard Time:20,21::Australia/Brisbane:
+Sydney Standard Time:20,21::Australia/Sydney:
+Tasmania Standard Time:20,65::Australia/Hobart:
+Central Pacific:22,23::Pacific/Guadalcanal:
+Central Pacific Standard Time:22,23::Pacific/Guadalcanal:
+Dateline:24,25::GMT-1200:
+Dateline Standard Time:24,25::GMT-1200:
+Fiji:24,25::Pacific/Fiji:
+Fiji Standard Time:24,25::Pacific/Fiji:
+Samoa:26,27::Pacific/Apia:
+Samoa Standard Time:26,27::Pacific/Apia:
+Hawaiian:28,29::Pacific/Honolulu:
+Hawaiian Standard Time:28,29::Pacific/Honolulu:
+Alaskan:30,31::America/Anchorage:
+Alaskan Standard Time:30,31::America/Anchorage:
+Pacific:32,33::America/Los_Angeles:
+Pacific Standard Time:32,33::America/Los_Angeles:
+Mexico Standard Time 2:34,35:MX:America/Chihuahua:
+Mountain:34,35::America/Denver:
+Mountain Standard Time:34,35::America/Denver:
+Central:36,37::America/Chicago:
+Central Standard Time:36,37::America/Chicago:
+Eastern:38,39::America/New_York:
+Eastern Standard Time:38,39::America/New_York:
+E. Europe:4,5::EET:
+E. Europe Standard Time:4,5::EET:
+Egypt:4,68::Africa/Cairo:
+Egypt Standard Time:4,68::Africa/Cairo:
+South Africa:4,69::Africa/Harare:
+South Africa Standard Time:4,69::Africa/Harare:
+Atlantic:40,41::America/Halifax:
+Atlantic Standard Time:40,41::America/Halifax:
+SA Eastern:42,43:GF:America/Cayenne:
+SA Eastern Standard Time:42,43:GF:America/Cayenne:
+Mid-Atlantic:44,45::Atlantic/South_Georgia:
+Mid-Atlantic Standard Time:44,45::Atlantic/South_Georgia:
+Azores:46,47::Atlantic/Azores:
+Azores Standard Time:46,47::Atlantic/Azores:
+Cape Verde Standard Time:46,47::Atlantic/Cape_Verde:
+Russian:6,7::Europe/Moscow:
+Russian Standard Time:6,7::Europe/Moscow:
+New Zealand:78,79::Pacific/Auckland:
+New Zealand Standard Time:78,79::Pacific/Auckland:
+Tonga Standard Time:78,79::Pacific/Tongatapu:
+Arabian:8,9::Asia/Muscat:
+Arabian Standard Time:8,9::Asia/Muscat:
+Caucasus:8,9:AM:Asia/Yerevan:
+Caucasus Standard Time:8,9:AM:Asia/Yerevan:
+GMT Standard Time:88,89::GMT:
+Greenwich:88,89::GMT:
+Greenwich Standard Time:88,89::GMT:
+Argentina Standard Time:900,900::America/Buenos_Aires:
+Azerbaijan Standard Time:901,901:AZ:Asia/Baku:
+Bangladesh Standard Time:902,902::Asia/Dhaka:
+Central Brazilian Standard Time:903,903:BR:America/Cuiaba:
+Central Standard Time (Mexico):904,904::America/Mexico_City:
+Georgian Standard Time:905,905:GE:Asia/Tbilisi:
+Jordan Standard Time:906,906:JO:Asia/Amman:
+Kamchatka Standard Time:907,907:RU:Asia/Kamchatka:
+Mauritius Standard Time:908,908:MU:Indian/Mauritius:
+Middle East Standard Time:909,909:LB:Asia/Beirut:
+Montevideo Standard Time:910,910:UY:America/Montevideo:
+Morocco Standard Time:911,911:MA:Africa/Casablanca:
+Mountain Standard Time (Mexico):912,912:MX:America/Chihuahua:
+Namibia Standard Time:913,913:NA:Africa/Windhoek:
+Pacific Standard Time (Mexico):914,914:MX:America/Tijuana:
+Pakistan Standard Time:915,915::Asia/Karachi:
+Paraguay Standard Time:916,916:PY:America/Asuncion:
+Syria Standard Time:917,917:SY:Asia/Damascus:
+UTC:918,918::UTC:
+UTC+12:919,919::GMT+1200:
+UTC-02:920,920::GMT-0200:
+UTC-11:921,921::GMT-1100:
+Ulaanbaatar Standard Time:922,922::Asia/Ulaanbaatar:
+Venezuela Standard Time:923,923::America/Caracas:
+Magadan Standard Time:924,924::Asia/Magadan:
+Kaliningrad Standard Time:925,925:RU:Europe/Kaliningrad:
+Turkey Standard Time:926,926::Asia/Istanbul:
+Bahia Standard Time:927,927::America/Bahia:
+Libya Standard Time:928,928:LY:Africa/Tripoli:
+Belarus Standard Time:929,929:BY:Europe/Minsk:
+Line Islands Standard Time:930,930::Pacific/Kiritimati:
+Russia Time Zone 10:931,931::Asia/Srednekolymsk:
+Russia Time Zone 11:932,932::Asia/Anadyr:
+Russia Time Zone 3:933,933::Europe/Samara:
+Western Brazilian Standard Time:934,934:BR:America/Rio_Branco:
+Armenian Standard Time:935,935:AM:Asia/Yerevan:
diff --git a/love2dToAPK/tools/tools/jdk-win/lib/ant-javafx.jar b/love2dToAPK/tools/tools/jdk-win/lib/ant-javafx.jar
new file mode 100644
index 0000000..5216008
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/lib/ant-javafx.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/lib/ct.sym b/love2dToAPK/tools/tools/jdk-win/lib/ct.sym
new file mode 100644
index 0000000..99ac56b
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/lib/ct.sym
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/lib/dt.jar b/love2dToAPK/tools/tools/jdk-win/lib/dt.jar
new file mode 100644
index 0000000..c1927e5
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/lib/dt.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/lib/ir.idl b/love2dToAPK/tools/tools/jdk-win/lib/ir.idl
new file mode 100644
index 0000000..a210041
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/lib/ir.idl
@@ -0,0 +1,778 @@
+/*
+ * Copyright (c) 1999, 2001, Oracle and/or its affiliates. All rights reserved.
+ * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ */
+
+/*
+ * This file contains OMG IDL from CORBA V2.0, July 1995.
+ * It also contains the TypeCode creation APIs in CORBA::ORB
+ **/
+
+#pragma prefix "omg.org"
+
+module CORBA {
+ typedef string Identifier;
+ typedef string ScopedName;
+ typedef string RepositoryId;
+
+ enum DefinitionKind {
+ dk_none, dk_all,
+ dk_Attribute, dk_Constant, dk_Exception, dk_Interface,
+ dk_Module, dk_Operation, dk_Typedef,
+ dk_Alias, dk_Struct, dk_Union, dk_Enum,
+ dk_Primitive, dk_String, dk_Sequence, dk_Array,
+ dk_Repository,
+ dk_Wstring, dk_Fixed,
+ dk_Value, dk_ValueBox, dk_ValueMember, // orbos 98-01-18: Objects By Value
+ dk_Native
+ };
+
+
+ interface IRObject
+ /**
+ An IRObject IDL interface represents the most generic interface
+ from which all other Interface Repository interfaces are derived,
+ even the Repository itself.
+ */
+ {
+ // read interface
+ readonly attribute DefinitionKind def_kind;
+
+ // write interface
+ void destroy ();
+ };
+
+
+
+ typedef string VersionSpec;
+
+ interface Contained;
+ interface Repository;
+ interface Container;
+
+ interface Contained : IRObject
+ /**
+ The Contained Interface is inherited by all Interface Repository
+ interfaces that are contained by other objects.
+ */
+ {
+ // read/write interface
+
+ attribute RepositoryId id;
+ attribute Identifier name;
+ attribute VersionSpec version;
+
+ // read interface
+
+ readonly attribute Container defined_in;
+ readonly attribute ScopedName absolute_name;
+ readonly attribute Repository containing_repository;
+
+ struct Description {
+ DefinitionKind kind;
+ any value;
+ };
+
+ Description describe ();
+
+ // write interface
+
+ void move (
+ in Container new_container,
+ in Identifier new_name,
+ in VersionSpec new_version
+ );
+ };
+
+
+ interface ModuleDef;
+ interface ConstantDef;
+ interface IDLType;
+ interface StructDef;
+ interface UnionDef;
+ interface EnumDef;
+ interface AliasDef;
+ interface InterfaceDef;
+ interface ExceptionDef;
+ interface ValueDef; // orbos 98-01-18: Objects By Value
+ interface ValueMemberDef; // orbos 98-01-18: Objects By Value
+ interface ValueBoxDef; // orbos 98-01-18: Objects By Value
+ interface NativeDef;
+
+
+ typedef sequence <InterfaceDef> InterfaceDefSeq;
+
+
+ typedef sequence <Contained> ContainedSeq;
+
+ struct StructMember {
+ Identifier name;
+ TypeCode type;
+ IDLType type_def;
+ };
+ typedef sequence <StructMember> StructMemberSeq;
+
+ struct UnionMember {
+ Identifier name;
+ any label;
+ TypeCode type;
+ IDLType type_def;
+ };
+ typedef sequence <UnionMember> UnionMemberSeq;
+
+
+ typedef sequence <Identifier> EnumMemberSeq;
+
+ // orbos 98-01-18: Objects By Value -- begin
+ typedef short Visibility;
+ const Visibility PRIVATE_MEMBER = 0;
+ const Visibility PUBLIC_MEMBER = 1;
+
+ struct ValueMember {
+ Identifier name;
+ RepositoryId id;
+ RepositoryId defined_in;
+ VersionSpec version;
+ TypeCode type;
+ IDLType type_def;
+ Visibility access;
+ };
+ typedef sequence <ValueMember> ValueMemberSeq;
+
+ struct Initializer {
+ StructMemberSeq members;
+ };
+ typedef sequence <Initializer> InitializerSeq;
+
+ typedef sequence <ValueDef> ValueDefSeq;
+
+ // orbos 98-01-18: Objects By Value -- end
+
+
+ interface Container : IRObject
+ /**
+ The Container interface is used to form a containment hierarchy
+ in the Interface Repository. A Container can contain any number
+ of objects derived from the Contained interface.
+ */
+ {
+ // read interface
+
+ Contained lookup ( in ScopedName search_name);
+
+ ContainedSeq contents (
+ in DefinitionKind limit_type,
+ in boolean exclude_inherited
+ );
+
+ ContainedSeq lookup_name (
+ in Identifier search_name,
+ in long levels_to_search,
+ in DefinitionKind limit_type,
+ in boolean exclude_inherited
+ );
+
+ struct Description {
+ Contained contained_object;
+ DefinitionKind kind;
+ any value;
+ };
+
+ typedef sequence<Description> DescriptionSeq;
+
+ DescriptionSeq describe_contents (
+ in DefinitionKind limit_type,
+ in boolean exclude_inherited,
+ in long max_returned_objs
+ );
+
+ // write interface
+
+ ModuleDef create_module (
+ in RepositoryId id,
+ in Identifier name,
+ in VersionSpec version
+ );
+
+ ConstantDef create_constant (
+ in RepositoryId id,
+ in Identifier name,
+ in VersionSpec version,
+ in IDLType type,
+ in any value
+ );
+
+ StructDef create_struct (
+ in RepositoryId id,
+ in Identifier name,
+ in VersionSpec version,
+ in StructMemberSeq members
+ );
+
+ UnionDef create_union (
+ in RepositoryId id,
+ in Identifier name,
+ in VersionSpec version,
+ in IDLType discriminator_type,
+ in UnionMemberSeq members
+ );
+
+ EnumDef create_enum (
+ in RepositoryId id,
+ in Identifier name,
+ in VersionSpec version,
+ in EnumMemberSeq members
+ );
+
+ AliasDef create_alias (
+ in RepositoryId id,
+ in Identifier name,
+ in VersionSpec version,
+ in IDLType original_type
+ );
+
+ ExceptionDef create_exception (
+ in RepositoryId id,
+ in Identifier name,
+ in VersionSpec version,
+ in StructMemberSeq members
+ );
+
+
+ InterfaceDef create_interface (
+ in RepositoryId id,
+ in Identifier name,
+ in VersionSpec version,
+ in boolean is_abstract,
+ in InterfaceDefSeq base_interfaces
+ );
+
+ // orbos 98-01-18: Objects By Value
+ ValueDef create_value(
+ in RepositoryId id,
+ in Identifier name,
+ in VersionSpec version,
+ in boolean is_custom,
+ in boolean is_abstract,
+ in octet flags, // must be 0
+ in ValueDef base_value,
+ in boolean has_safe_base,
+ in ValueDefSeq abstract_base_values,
+ in InterfaceDefSeq supported_interfaces,
+ in InitializerSeq initializers
+ );
+
+ // orbos 98-01-18: Objects By Value
+ ValueBoxDef create_value_box(
+ in RepositoryId id,
+ in Identifier name,
+ in VersionSpec version,
+ in IDLType original_type_def
+ );
+
+ NativeDef create_native(
+ in RepositoryId id,
+ in Identifier name,
+ in VersionSpec version
+ );
+
+ };
+
+
+
+ interface IDLType : IRObject
+ /**
+ The IDLType interface is an abstract interface inherited by all
+ IR objects that represent the OMG IDL types. It provides access
+ to the TypeCode describing the type, and is used in defining the
+ other interfaces wherever definitions of IDLType must be referenced.
+ */
+ {
+ readonly attribute TypeCode type;
+ };
+
+
+
+ interface PrimitiveDef;
+ interface StringDef;
+ interface SequenceDef;
+ interface ArrayDef;
+
+ enum PrimitiveKind {
+ pk_null, pk_void, pk_short, pk_long, pk_ushort, pk_ulong,
+ pk_float, pk_double, pk_boolean, pk_char, pk_octet,
+ pk_any, pk_TypeCode, pk_Principal, pk_string, pk_objref
+ };
+
+ interface Repository : Container
+ /**
+ Repository is an interface that provides global access to the
+ Interface Repository. Repository objects can contain constants,
+ typedefs, exceptions, interfaces, and modules.
+ */
+ {
+ // read interface
+
+ Contained lookup_id (in RepositoryId search_id);
+
+ PrimitiveDef get_primitive (in PrimitiveKind kind);
+
+ // write interface
+
+ StringDef create_string (in unsigned long bound);
+
+ SequenceDef create_sequence (
+ in unsigned long bound,
+ in IDLType element_type
+ );
+
+ ArrayDef create_array (
+ in unsigned long length,
+ in IDLType element_type
+ );
+ };
+
+
+ interface ModuleDef : Container, Contained
+ /**
+ A ModuleDef can contain constants, typedefs, exceptions, interfaces,
+ and other module objects.
+ */
+ {
+ };
+
+ struct ModuleDescription {
+ Identifier name;
+ RepositoryId id;
+ RepositoryId defined_in;
+ VersionSpec version;
+ };
+
+
+ interface ConstantDef : Contained
+ /**
+ A ConstantDef object defines a named constant.
+ */
+ {
+ readonly attribute TypeCode type;
+ attribute IDLType type_def;
+ attribute any value;
+ };
+
+ struct ConstantDescription {
+ Identifier name;
+ RepositoryId id;
+ RepositoryId defined_in;
+ VersionSpec version;
+ TypeCode type;
+ any value;
+ };
+
+
+ interface TypedefDef : Contained, IDLType
+ /**
+ TypedefDef is an abstract interface used as a base interface for
+ all named non-object types(structures, unions, enumerations,
+ aliases). The TypedefDef interface is not inherited by the definition
+ objects for the primitive or anonymous types.
+ */
+ {
+ };
+
+ struct TypeDescription {
+ Identifier name;
+ RepositoryId id;
+ RepositoryId defined_in;
+ VersionSpec version;
+ TypeCode type;
+ };
+
+
+ interface StructDef : TypedefDef, Container
+ /**
+ A StructDef represents an OMG IDL structure definition.
+ */
+ {
+ attribute StructMemberSeq members;
+ };
+
+
+ interface UnionDef : TypedefDef, Container
+ /**
+ A UnionDef represents an OMG IDL union definition.
+ */
+ {
+ readonly attribute TypeCode discriminator_type;
+ attribute IDLType discriminator_type_def;
+ attribute UnionMemberSeq members;
+ };
+
+
+ interface EnumDef : TypedefDef
+ /**
+ A EnumDef represents an OMG IDL enum definition.
+ */
+ {
+ attribute EnumMemberSeq members;
+ };
+
+
+ interface AliasDef : TypedefDef
+ /**
+ An AliasDef represents an OMG IDL typedef that aliases other
+ definition.
+ */
+ {
+ attribute IDLType original_type_def;
+ };
+
+
+ interface PrimitiveDef: IDLType
+ /**
+ A PrimitiveDef represents one of the IDL primitive types. As
+ primitive types are unnamed, this interface is not derived from
+ TypedefDef or Contained.
+ */
+ {
+ readonly attribute PrimitiveKind kind;
+ };
+
+
+ interface StringDef : IDLType
+ /**
+ A StringDef represents an OMG IDL string type. As string
+ types are anonymous, this interface is not derived from TypedefDef
+ or Contained.
+ */
+ {
+ attribute unsigned long bound;
+ };
+
+
+ interface SequenceDef : IDLType
+ /**
+ A SequenceDef represents an OMG IDL sequence type. As sequence
+ types are anonymous, this interface is not derived from TypedefDef
+ or Contained.
+ */
+ {
+ attribute unsigned long bound;
+ readonly attribute TypeCode element_type;
+ attribute IDLType element_type_def;
+ };
+
+ interface ArrayDef : IDLType
+ /**
+ An ArrayDef represents an OMG IDL array type. As array
+ types are anonymous, this interface is not derived from TypedefDef
+ or Contained.
+ */
+ {
+ attribute unsigned long length;
+ readonly attribute TypeCode element_type;
+ attribute IDLType element_type_def;
+ };
+
+
+ interface ExceptionDef : Contained, Container
+ /**
+ An ExceptionDef represents an exception definition.
+ */
+ {
+ readonly attribute TypeCode type;
+ attribute StructMemberSeq members;
+ };
+ struct ExceptionDescription {
+ Identifier name;
+ RepositoryId id;
+ RepositoryId defined_in;
+ VersionSpec version;
+ TypeCode type;
+ };
+
+
+
+ enum AttributeMode {ATTR_NORMAL, ATTR_READONLY};
+
+ interface AttributeDef : Contained
+ /**
+ An AttributeDef represents the information that defines an
+ attribute of an interface.
+ */
+ {
+ readonly attribute TypeCode type;
+ attribute IDLType type_def;
+ attribute AttributeMode mode;
+ };
+
+ struct AttributeDescription {
+ Identifier name;
+ RepositoryId id;
+ RepositoryId defined_in;
+ VersionSpec version;
+ TypeCode type;
+ AttributeMode mode;
+ };
+
+
+
+ enum OperationMode {OP_NORMAL, OP_ONEWAY};
+
+ enum ParameterMode {PARAM_IN, PARAM_OUT, PARAM_INOUT};
+ struct ParameterDescription {
+ Identifier name;
+ TypeCode type;
+ IDLType type_def;
+ ParameterMode mode;
+ };
+ typedef sequence <ParameterDescription> ParDescriptionSeq;
+
+ typedef Identifier ContextIdentifier;
+ typedef sequence <ContextIdentifier> ContextIdSeq;
+
+ typedef sequence <ExceptionDef> ExceptionDefSeq;
+ typedef sequence <ExceptionDescription> ExcDescriptionSeq;
+
+ interface OperationDef : Contained
+ /**
+ An OperationDef represents the information that defines an
+ operation of an interface.
+ */
+ {
+ readonly attribute TypeCode result;
+ attribute IDLType result_def;
+ attribute ParDescriptionSeq params;
+ attribute OperationMode mode;
+ attribute ContextIdSeq contexts;
+ attribute ExceptionDefSeq exceptions;
+ };
+
+ struct OperationDescription {
+ Identifier name;
+ RepositoryId id;
+ RepositoryId defined_in;
+ VersionSpec version;
+ TypeCode result;
+ OperationMode mode;
+ ContextIdSeq contexts;
+ ParDescriptionSeq parameters;
+ ExcDescriptionSeq exceptions;
+ };
+
+
+
+ typedef sequence <RepositoryId> RepositoryIdSeq;
+ typedef sequence <OperationDescription> OpDescriptionSeq;
+ typedef sequence <AttributeDescription> AttrDescriptionSeq;
+
+ interface InterfaceDef : Container, Contained, IDLType
+ /**
+ An InterfaceDef object represents an interface definition. It can
+ contains constants, typedefs, exceptions, operations, and
+ attributes.
+ */
+ {
+ // read/write interface
+
+ attribute InterfaceDefSeq base_interfaces;
+ attribute boolean is_abstract;
+
+ // read interface
+
+ boolean is_a (in RepositoryId interface_id);
+
+ struct FullInterfaceDescription {
+ Identifier name;
+ RepositoryId id;
+ RepositoryId defined_in;
+ VersionSpec version;
+ boolean is_abstract;
+ OpDescriptionSeq operations;
+ AttrDescriptionSeq attributes;
+ RepositoryIdSeq base_interfaces;
+ TypeCode type;
+ };
+
+ FullInterfaceDescription describe_interface();
+
+ // write interface
+
+ AttributeDef create_attribute (
+ in RepositoryId id,
+ in Identifier name,
+ in VersionSpec version,
+ in IDLType type,
+ in AttributeMode mode
+ );
+
+ OperationDef create_operation (
+ in RepositoryId id,
+ in Identifier name,
+ in VersionSpec version,
+ in IDLType result,
+ in OperationMode mode,
+ in ParDescriptionSeq params,
+ in ExceptionDefSeq exceptions,
+ in ContextIdSeq contexts
+ );
+ };
+
+ struct InterfaceDescription {
+ Identifier name;
+ RepositoryId id;
+ RepositoryId defined_in;
+ VersionSpec version;
+ RepositoryIdSeq base_interfaces;
+ };
+
+
+ // orbos 98-01-18: Objects By Value -- begin
+
+ interface ValueMemberDef : Contained
+
+ /** A <code>ValueMemberDef</code> object represents the public
+ and private data member definition of a <code>Value</code> type
+ */
+
+ {
+ readonly attribute TypeCode type;
+ attribute IDLType type_def;
+ attribute Visibility access;
+ };
+
+ interface ValueDef : Container, Contained, IDLType
+ /**
+ A ValueDef object represents the definition of the
+ <code>Value</code> object used to pass the object state
+ between hosts
+ */
+
+ {
+ // read/write interface
+ attribute InterfaceDefSeq supported_interfaces;
+ attribute InitializerSeq initializers;
+ attribute ValueDef base_value;
+ attribute ValueDefSeq abstract_base_values;
+ attribute boolean is_abstract;
+ attribute boolean is_custom;
+ attribute octet flags; // always 0
+ attribute boolean has_safe_base;
+
+ // read interface
+ boolean is_a(in RepositoryId value_id);
+
+ struct FullValueDescription {
+ Identifier name;
+ RepositoryId id;
+ boolean is_abstract;
+ boolean is_custom;
+ octet flags; // always 0
+ RepositoryId defined_in;
+ VersionSpec version;
+ OpDescriptionSeq operations;
+ AttrDescriptionSeq attributes;
+ ValueMemberSeq members;
+ InitializerSeq initializers;
+ RepositoryIdSeq supported_interfaces;
+ RepositoryIdSeq abstract_base_values;
+ boolean has_safe_base;
+ RepositoryId base_value;
+ TypeCode type;
+ };
+
+ FullValueDescription describe_value();
+
+ // write interface
+
+ ValueMemberDef create_value_member(
+ in RepositoryId id,
+ in Identifier name,
+ in VersionSpec version,
+ in IDLType type_def,
+ in Visibility access
+ );
+
+ AttributeDef create_attribute(
+ in RepositoryId id,
+ in Identifier name,
+ in VersionSpec version,
+ in IDLType type,
+ in AttributeMode mode
+ );
+
+ OperationDef create_operation(
+ in RepositoryId id,
+ in Identifier name,
+ in VersionSpec version,
+ in IDLType result,
+ in OperationMode mode,
+ in ParDescriptionSeq params,
+ in ExceptionDefSeq exceptions,
+ in ContextIdSeq contexts
+ );
+ };
+ struct ValueDescription {
+ Identifier name;
+ RepositoryId id;
+ boolean is_abstract;
+ boolean is_custom;
+ octet flags; // always 0
+ RepositoryId defined_in;
+ VersionSpec version;
+ RepositoryIdSeq supported_interfaces;
+ RepositoryIdSeq abstract_base_values;
+ boolean has_safe_base;
+ RepositoryId base_value;
+ };
+
+ interface ValueBoxDef : IDLType
+
+ /** ValueBoxDef is an interface that reresents a value type with
+ a single data member inside its state section and no
+ inheritance or methods. For example, when transmitting a
+ string or sequence as an actual parameter on an interface
+ operation or as a data member of a value type that is an
+ actual parameter, it may be important to preserve any sharing
+ of the string or sequence within the object graph being
+ transmitted. Because current IDL data types do not preserve
+ referential integrity in this way, this requirement is
+ conveniently handled by using a value type. Value types also
+ support the transmission of nulls (as a distinguished value),
+ whereas IDL data types such as string and sequence (which are
+ mapped to empty strings and sequences) do not. The Java to IDL
+ mapping requires both preservation of referential integrity
+ and transmission of nulls. Because it would be cumbersome to
+ require the full IDL syntax for a value type for this specific
+ usage, this shorthand notation is introduced to cover this use
+ of value types for simple containment of a single data member.
+ */
+
+{
+ attribute IDLType original_type_def;
+ };
+
+ // orbos 98-01-18: Objects By Value -- end
+
+ interface NativeDef : TypedefDef {
+ };
+};
diff --git a/love2dToAPK/tools/tools/jdk-win/lib/javafx-mx.jar b/love2dToAPK/tools/tools/jdk-win/lib/javafx-mx.jar
new file mode 100644
index 0000000..8d62d3b
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/lib/javafx-mx.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/lib/jawt.lib b/love2dToAPK/tools/tools/jdk-win/lib/jawt.lib
new file mode 100644
index 0000000..5bf438e
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/lib/jawt.lib
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/lib/jconsole.jar b/love2dToAPK/tools/tools/jdk-win/lib/jconsole.jar
new file mode 100644
index 0000000..8bb1640
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/lib/jconsole.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/lib/jvm.lib b/love2dToAPK/tools/tools/jdk-win/lib/jvm.lib
new file mode 100644
index 0000000..3c41c32
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/lib/jvm.lib
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/lib/orb.idl b/love2dToAPK/tools/tools/jdk-win/lib/orb.idl
new file mode 100644
index 0000000..fcd077d
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/lib/orb.idl
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved.
+ * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ */
+
+// IDL not generated by rmic, do not edit
+// These are all in IDL module CORBA
+// The Java classes are in the package org.omg.CORBA
+// See ValueType Semantics:Standard Value Box Definitions (5.3) in CORBA 2.3 spec
+
+#ifndef __org_omg_CORBA__
+#define __org_omg_CORBA__
+
+#pragma prefix "omg.org"
+
+module CORBA{
+
+ valuetype StringValue string;
+ valuetype WStringValue wstring;
+
+};
+
+#include "ir.idl"
+
+#pragma prefix ""
+
+#endif
diff --git a/love2dToAPK/tools/tools/jdk-win/lib/packager.jar b/love2dToAPK/tools/tools/jdk-win/lib/packager.jar
new file mode 100644
index 0000000..ad97fe3
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/lib/packager.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/lib/sa-jdi.jar b/love2dToAPK/tools/tools/jdk-win/lib/sa-jdi.jar
new file mode 100644
index 0000000..8c4323c
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/lib/sa-jdi.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/lib/tools.jar b/love2dToAPK/tools/tools/jdk-win/lib/tools.jar
new file mode 100644
index 0000000..ff38292
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/lib/tools.jar
Binary files differ
diff --git a/love2dToAPK/tools/tools/jdk-win/release b/love2dToAPK/tools/tools/jdk-win/release
new file mode 100644
index 0000000..8552a54
--- /dev/null
+++ b/love2dToAPK/tools/tools/jdk-win/release
@@ -0,0 +1,6 @@
+JAVA_VERSION="1.8.0_45"
+OS_NAME="Windows"
+OS_VERSION="5.1"
+OS_ARCH="i586"
+SOURCE=" .:d195213dc77e corba:681b5c54c9a8 deploy:8ceddb02649f hotspot:13990387b643 hotspot/make/closed:05aa2680eb9f hotspot/src/closed:91caea42673b hotspot/test/closed:60b47b8c1721 install:4318d1f7b3a5 jaxp:1c4cdf942059 jaxws:1a0139074296 jdk:d177c684b874 jdk/make/closed:137c6a750834 jdk/src/closed:f47229507b9a jdk/test/closed:42d53147784b langtools:3c7d5e1ec7e5 nashorn:7a2d26de1826 pubs:b60ba41c22d2 sponsors:9a5a318d7ca6"
+BUILD_TYPE="commercial"
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/.classpath b/love2dToAPK/tools/tools/love-android-sdl2/.classpath
new file mode 100644
index 0000000..5176974
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
+ <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
+ <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="src" path="gen"/>
+ <classpathentry kind="output" path="bin/classes"/>
+</classpath>
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/.project b/love2dToAPK/tools/tools/love-android-sdl2/.project
new file mode 100644
index 0000000..b058e2a
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/.project
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>love_android_sdl2</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
+ <triggers>full,incremental,</triggers>
+ <arguments>
+ <dictionary>
+ <key>LaunchConfigHandle</key>
+ <value>&lt;project&gt;/.externalToolBuilders/[Löve] Generate Internal Scripts.launch</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
+ <triggers>full,incremental,</triggers>
+ <arguments>
+ <dictionary>
+ <key>LaunchConfigHandle</key>
+ <value>&lt;project&gt;/.externalToolBuilders/ndk-build.launch</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>com.android.ide.eclipse.adt.ApkBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>com.android.ide.eclipse.adt.AndroidNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/AndroidManifest.xml b/love2dToAPK/tools/tools/love-android-sdl2/AndroidManifest.xml
new file mode 100644
index 0000000..6468bbd
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/AndroidManifest.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest package="love.to.android"
+ android:versionCode="15"
+ android:versionName="0.9.2"
+ android:installLocation="auto" xmlns:android="http://schemas.android.com/apk/res/android">
+ <uses-permission android:name="android.permission.INTERNET"/>
+ <uses-permission android:name="android.permission.VIBRATE"/>
+ <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
+ <!-- Allow writing to external storage -->
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+
+ <application
+ android:allowBackup="true"
+ android:icon="@drawable/ic_launcher"
+ android:label="loveToAndroid Game"
+ android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
+ <service android:name=".DownloadService" />
+ <activity
+ android:name="LtaActivity"
+ android:configChanges="orientation|screenSize"
+ android:label="loveToAndroid Game"
+ android:launchMode="singleTop"
+ android:screenOrientation="landscape" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ <category android:name="tv.ouya.intent.category.GAME"/>
+ </intent-filter>
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="file" />
+ <data android:scheme="content" />
+ <data android:mimeType="application/x-love-game" />
+ </intent-filter>
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="file" />
+ <data android:mimeType="*/*" />
+ <data android:pathPattern=".*\\.love" />
+ <data android:host="*" />
+ </intent-filter>
+ </activity>
+ <activity
+ android:name="DownloadActivity"
+ android:noHistory="true" >
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <data android:scheme="http"
+ android:host="*"
+ android:pathPrefix="*"
+ android:mimeType="*/*"
+ android:pathPattern=".*\\.love" />
+ <data android:scheme="https"
+ android:host="*"
+ android:pathPrefix="*"
+ android:mimeType="*/*"
+ android:pathPattern=".*\\.love" />
+ </intent-filter>
+ </activity>
+ </application>
+
+ <!-- Android 2.3.3 -->
+ <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="18" />
+
+ <!-- OpenGL ES 2.0 -->
+ <uses-feature android:glEsVersion="0x00020000" />
+</manifest>
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/README.md b/love2dToAPK/tools/tools/love-android-sdl2/README.md
new file mode 100644
index 0000000..7c95d6f
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/README.md
@@ -0,0 +1,140 @@
+Android Port of LÖVE, the awesome 2D game engine LÖVE (http://love2d.org)
+Copyright (c) 2013-2014 Martin Felis <martin@fysx.org>
+
+Instructions:
+-------------
+
+For detailed instructions please refer to the wiki at [https://bitbucket.org/MartinFelis/love-android-sdl2/wiki/Home](https://bitbucket.org/MartinFelis/love-android-sdl2/wiki/Home).
+
+Download:
+---------
+
+You can download pre-built Android packages from
+[https://bitbucket.org/MartinFelis/love-android-sdl2/downloads](https://bitbucket.org/MartinFelis/love-android-sdl2/downloads)
+that allow you to run .love files by opening them using a file manager of
+your choice.
+
+Quick Start:
+------------
+
+Install the Android NDK and the Android SDK with SDK API 12 and run
+
+ ndk-build -j4
+
+and after that
+
+ ant debug
+
+in the root folder of this project or load the project using Eclipse and
+compile/run it using Eclipse.
+
+This should give you a .apk file in the bin/ subdirectory that you can then
+install on your phone.
+
+Bugs:
+-----
+
+Bugs and feature requests should be reported to the issue tracker at [https://bitbucket.org/MartinFelis/love-android-sdl2/issues?status=new&status=open](https://bitbucket.org/MartinFelis/love-android-sdl2/issues?status=new&status=open).
+
+Changelog:
+----------
+
+0.9.1b:
+
+* added love.system.vibrate(seconds)
+* print statements are now redirected to logcat. Output is prefixed with "[LOVE] "
+* removed DevIL, libpng, libjpeg, libmng, and libtiff
+* pngs are loaded using lodepng and jpegs using libturbo-jpeg
+* repeatedly fixed a bug which caused Release builds to crash
+* update to latest mobile-common branch
+
+0.9.1a:
+
+* using latest SDL\_androidgl.c (fixes some random performance issues)
+* using latest love-android @ changeset 8659be0e75a3 (adds support for
+ compressed textures)
+
+0.9.1:
+
+* uses 0.9.1 API
+* fixed crash on Moto G (and possibly other devices). This was a nasty bug that would just show a blue screen without an error message. The bug was resolved using the help of headchant
+* fixed loading of jpegs (it probably hasn't worked up to now)
+* fixed issues with looping over active touches. This fix was sponsored by slime!
+
+beta2:
+
+* fixed bug with canvases
+* fixed writing of files when no identity in conf.lua was set
+* added file association (somewhat experimental)
+
+beta1:
+
+* fixed nasty crash on startup bug
+* fixed love.filesystem.getDirectoryItems()
+
+alpha9:
+
+* Packaged games do not get duplicated for loading, instead are loaded from memory (!!!)
+* Using inofficial physfs 2.1
+* Removed love.android.getDisplayMetrics(), instead use love.window.getPixelScale()
+* Properly link LGPL libraries dynamically. Everything else is linked statically
+* Added an icon (design by @josefnpat)
+* Fixed crash on startup on OUYA (and possibly other devices)
+
+alpha8:
+
+* Exposing DisplayMetrics in love.android.getDisplayMetrics())
+* Accelerometer is now available as a joystick
+* enabled armv6 compilation (larger files, better compatibility with Tegra2 devices)
+* updated to latest mobile-common branch (including (very) basic multi-touch gesture tracking)
+* updated OpenAL from 1.13 to 1.15.1
+* updated jpeg library from 8c to 9a
+* updated lcms from 2.2 to 2.5
+* updated libogg from 1.3.0 to 1.3.1
+* updated libvorbis from 1.3.2 to 1.3.4
+* updated mpg123 from 1.13.4 to 1.17.0
+
+alpha7:
+
+* love.system.getOS() now returns "Android"
+* hardware search key is reported as "search"
+* switched to mobile-common branch
+* using new love.touch module (love.touchpressed(id,x,y,p), love.touchmoved(id,x,y,p), love.touchmoved(id,x,y,p))
+* added LOVE_ANDROID define
+
+License:
+--------
+
+This project contains code from multiple projects using various licenses.
+Please look into the folders of jni/<projectname>/ for the respective
+licenses. A possibly incomplete overview of dependent and included
+libraries and licenses is the following:
+
+* FreeType2 (FreeType Project License)
+* libjpeg-turbo (custom license)
+* libmodplug (public domain)
+* libogg (BSD License)
+* libvorbis (BSD License)
+* LuaJIT (MIT License)
+* mpg123 (LGPL 2.1 License)
+* openal-soft (LGPL 2 License)
+* physfs (zlib License)
+* SDL2 (zlib License)
+
+This project also includes LÖVE, which itself is licensed under the zlib
+license but includes the following libraries that are subject to other
+licenses:
+
+* modified Box2D (original Box2D license is zlib)
+* ddsparse (MIT License)
+* enet (MIT License)
+* glad (MIT License)
+* lodepng (zlib License)
+* luasocket (MIT License)
+* SimplexNoise1234 (public domain)
+* stb_image (public domain)
+* utf8 (Boost License)
+* wuff (public domain)
+
+As for the other code, modifications to LÖVE, and build system files are
+are published under the zlib license (same as LÖVE).
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/ant.properties b/love2dToAPK/tools/tools/love-android-sdl2/ant.properties
new file mode 100644
index 0000000..b0971e8
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/ant.properties
@@ -0,0 +1,17 @@
+# This file is used to override default values used by the Ant build system.
+#
+# This file must be checked into Version Control Systems, as it is
+# integral to the build system of your project.
+
+# This file is only used by the Ant script.
+
+# You can use this to override default values such as
+# 'source.dir' for the location of your java source folder and
+# 'out.dir' for the location of your output folder.
+
+# You can also use it define how the release builds are signed by declaring
+# the following properties:
+# 'key.store' for the location of your keystore and
+# 'key.alias' for the name of the key to use.
+# The password will be asked during the build when you use the 'release' target.
+
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/assets/game.love b/love2dToAPK/tools/tools/love-android-sdl2/assets/game.love
new file mode 100644
index 0000000..f2690b4
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/assets/game.love
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/build.properties b/love2dToAPK/tools/tools/love-android-sdl2/build.properties
new file mode 100644
index 0000000..edc7f23
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/build.properties
@@ -0,0 +1,17 @@
+# This file is used to override default values used by the Ant build system.
+#
+# This file must be checked in Version Control Systems, as it is
+# integral to the build system of your project.
+
+# This file is only used by the Ant script.
+
+# You can use this to override default values such as
+# 'source.dir' for the location of your java source folder and
+# 'out.dir' for the location of your output folder.
+
+# You can also use it define how the release builds are signed by declaring
+# the following properties:
+# 'key.store' for the location of your keystore and
+# 'key.alias' for the name of the key to use.
+# The password will be asked during the build when you use the 'release' target.
+
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/build.xml b/love2dToAPK/tools/tools/love-android-sdl2/build.xml
new file mode 100644
index 0000000..8b4e1cb
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/build.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- This should be changed to the name of your project -->
+<project name="love_android_sdl2" default="help">
+
+ <!-- The local.properties file is created and updated by the 'android' tool.
+ It contains the path to the SDK. It should *NOT* be checked into
+ Version Control Systems. -->
+ <property file="local.properties" />
+
+ <!-- The ant.properties file can be created by you. It is only edited by the
+ 'android' tool to add properties to it.
+ This is the place to change some Ant specific build properties.
+ Here are some properties you may want to change/update:
+
+ source.dir
+ The name of the source directory. Default is 'src'.
+ out.dir
+ The name of the output directory. Default is 'bin'.
+
+ For other overridable properties, look at the beginning of the rules
+ files in the SDK, at tools/ant/build.xml
+
+ Properties related to the SDK location or the project target should
+ be updated using the 'android' tool with the 'update' action.
+
+ This file is an integral part of the build system for your
+ application and should be checked into Version Control Systems.
+
+ -->
+ <property file="ant.properties" />
+
+ <!-- if sdk.dir was not set from one of the property file, then
+ get it from the ANDROID_HOME env var.
+ This must be done before we load project.properties since
+ the proguard config can use sdk.dir -->
+ <property environment="env" />
+ <condition property="sdk.dir" value="${env.ANDROID_HOME}">
+ <isset property="env.ANDROID_HOME" />
+ </condition>
+
+ <!-- The project.properties file is created and updated by the 'android'
+ tool, as well as ADT.
+
+ This contains project specific properties such as project target, and library
+ dependencies. Lower level build properties are stored in ant.properties
+ (or in .classpath for Eclipse projects).
+
+ This file is an integral part of the build system for your
+ application and should be checked into Version Control Systems. -->
+ <loadproperties srcFile="project.properties" />
+
+ <!-- quick check on sdk.dir -->
+ <fail
+ message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
+ unless="sdk.dir"
+ />
+
+ <!--
+ Import per project custom build rules if present at the root of the project.
+ This is the place to put custom intermediary targets such as:
+ -pre-build
+ -pre-compile
+ -post-compile (This is typically used for code obfuscation.
+ Compiled code location: ${out.classes.absolute.dir}
+ If this is not done in place, override ${out.dex.input.absolute.dir})
+ -post-package
+ -post-build
+ -pre-clean
+ -->
+ <import file="custom_rules.xml" optional="true" />
+
+ <!-- Import the actual build file.
+
+ To customize existing targets, there are two options:
+ - Customize only one target:
+ - copy/paste the target into this file, *before* the
+ <import> task.
+ - customize it to your needs.
+ - Customize the whole content of build.xml
+ - copy/paste the content of the rules files (minus the top node)
+ into this file, replacing the <import> task.
+ - customize to your needs.
+
+ ***********************
+ ****** IMPORTANT ******
+ ***********************
+ In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
+ in order to avoid having your file be overridden by tools such as "android update project"
+ -->
+ <!-- version-tag: 1 -->
+ <import file="${sdk.dir}/tools/ant/build.xml" />
+
+</project>
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/default.properties b/love2dToAPK/tools/tools/love-android-sdl2/default.properties
new file mode 100644
index 0000000..116a50e
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/default.properties
@@ -0,0 +1,11 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system use,
+# "build.properties", and override values to adapt the script to your
+# project structure.
+
+# Project target.
+target=android-19
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/gen/R.java.d b/love2dToAPK/tools/tools/love-android-sdl2/gen/R.java.d
new file mode 100644
index 0000000..103191a
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/gen/R.java.d
@@ -0,0 +1,4 @@
+C:\Users\jakst070500\source\repos\love2dToAPK\love2dToAPK\bin\Debug\tools\tools\love-android-sdl2\gen\love\to\android\R.java \
+ : C:\Users\jakst070500\source\repos\love2dToAPK\love2dToAPK\bin\Debug\tools\tools\love-android-sdl2\res\drawable-xxhdpi\ic_launcher.png \
+C:\Users\jakst070500\source\repos\love2dToAPK\love2dToAPK\bin\Debug\tools\tools\love-android-sdl2\bin\res\drawable-xxhdpi\ic_launcher.png \
+C:\Users\jakst070500\source\repos\love2dToAPK\love2dToAPK\bin\Debug\tools\tools\love-android-sdl2\bin\AndroidManifest.xml \
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/gen/love/to/android/BuildConfig.java b/love2dToAPK/tools/tools/love-android-sdl2/gen/love/to/android/BuildConfig.java
new file mode 100644
index 0000000..40d1d2e
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/gen/love/to/android/BuildConfig.java
@@ -0,0 +1,6 @@
+/** Automatically generated file. DO NOT MODIFY */
+package love.to.android;
+
+public final class BuildConfig {
+ public final static boolean DEBUG = true;
+} \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/gen/love/to/android/R.java b/love2dToAPK/tools/tools/love-android-sdl2/gen/love/to/android/R.java
new file mode 100644
index 0000000..78919f9
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/gen/love/to/android/R.java
@@ -0,0 +1,16 @@
+/* AUTO-GENERATED FILE. DO NOT MODIFY.
+ *
+ * This class was automatically generated by the
+ * aapt tool from the resource data it found. It
+ * should not be modified by hand.
+ */
+
+package love.to.android;
+
+public final class R {
+ public static final class attr {
+ }
+ public static final class drawable {
+ public static final int ic_launcher=0x7f020000;
+ }
+}
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/gen/love/to/android1219203756/BuildConfig.java b/love2dToAPK/tools/tools/love-android-sdl2/gen/love/to/android1219203756/BuildConfig.java
new file mode 100644
index 0000000..6962343
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/gen/love/to/android1219203756/BuildConfig.java
@@ -0,0 +1,6 @@
+/** Automatically generated file. DO NOT MODIFY */
+package love.to.android1219203756;
+
+public final class BuildConfig {
+ public final static boolean DEBUG = true;
+} \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/gen/love/to/android1219203756/R.java b/love2dToAPK/tools/tools/love-android-sdl2/gen/love/to/android1219203756/R.java
new file mode 100644
index 0000000..1373c84
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/gen/love/to/android1219203756/R.java
@@ -0,0 +1,16 @@
+/* AUTO-GENERATED FILE. DO NOT MODIFY.
+ *
+ * This class was automatically generated by the
+ * aapt tool from the resource data it found. It
+ * should not be modified by hand.
+ */
+
+package love.to.android1219203756;
+
+public final class R {
+ public static final class attr {
+ }
+ public static final class drawable {
+ public static final int ic_launcher=0x7f020000;
+ }
+}
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/gen/love/to/android1220074642/BuildConfig.java b/love2dToAPK/tools/tools/love-android-sdl2/gen/love/to/android1220074642/BuildConfig.java
new file mode 100644
index 0000000..f42922e
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/gen/love/to/android1220074642/BuildConfig.java
@@ -0,0 +1,6 @@
+/** Automatically generated file. DO NOT MODIFY */
+package love.to.android1220074642;
+
+public final class BuildConfig {
+ public final static boolean DEBUG = true;
+} \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/gen/love/to/android1220074642/R.java b/love2dToAPK/tools/tools/love-android-sdl2/gen/love/to/android1220074642/R.java
new file mode 100644
index 0000000..6617e6f
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/gen/love/to/android1220074642/R.java
@@ -0,0 +1,16 @@
+/* AUTO-GENERATED FILE. DO NOT MODIFY.
+ *
+ * This class was automatically generated by the
+ * aapt tool from the resource data it found. It
+ * should not be modified by hand.
+ */
+
+package love.to.android1220074642;
+
+public final class R {
+ public static final class attr {
+ }
+ public static final class drawable {
+ public static final int ic_launcher=0x7f020000;
+ }
+}
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi-v7a/libgnustl_shared.so b/love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi-v7a/libgnustl_shared.so
new file mode 100644
index 0000000..f781d87
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi-v7a/libgnustl_shared.so
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi-v7a/liblove.so b/love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi-v7a/liblove.so
new file mode 100644
index 0000000..a9d5313
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi-v7a/liblove.so
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi-v7a/libmpg123.so b/love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi-v7a/libmpg123.so
new file mode 100644
index 0000000..1f9d627
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi-v7a/libmpg123.so
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi-v7a/libopenal.so b/love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi-v7a/libopenal.so
new file mode 100644
index 0000000..b05d291
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi-v7a/libopenal.so
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi/libgnustl_shared.so b/love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi/libgnustl_shared.so
new file mode 100644
index 0000000..0d4161b
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi/libgnustl_shared.so
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi/liblove.so b/love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi/liblove.so
new file mode 100644
index 0000000..356a593
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi/liblove.so
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi/libmpg123.so b/love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi/libmpg123.so
new file mode 100644
index 0000000..1ce4b1c
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi/libmpg123.so
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi/libopenal.so b/love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi/libopenal.so
new file mode 100644
index 0000000..f62b0d1
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/libs/armeabi/libopenal.so
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/original/AndroidManifest.xml b/love2dToAPK/tools/tools/love-android-sdl2/original/AndroidManifest.xml
new file mode 100644
index 0000000..6468bbd
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/original/AndroidManifest.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest package="love.to.android"
+ android:versionCode="15"
+ android:versionName="0.9.2"
+ android:installLocation="auto" xmlns:android="http://schemas.android.com/apk/res/android">
+ <uses-permission android:name="android.permission.INTERNET"/>
+ <uses-permission android:name="android.permission.VIBRATE"/>
+ <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
+ <!-- Allow writing to external storage -->
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+
+ <application
+ android:allowBackup="true"
+ android:icon="@drawable/ic_launcher"
+ android:label="loveToAndroid Game"
+ android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
+ <service android:name=".DownloadService" />
+ <activity
+ android:name="LtaActivity"
+ android:configChanges="orientation|screenSize"
+ android:label="loveToAndroid Game"
+ android:launchMode="singleTop"
+ android:screenOrientation="landscape" >
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ <category android:name="tv.ouya.intent.category.GAME"/>
+ </intent-filter>
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="file" />
+ <data android:scheme="content" />
+ <data android:mimeType="application/x-love-game" />
+ </intent-filter>
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="file" />
+ <data android:mimeType="*/*" />
+ <data android:pathPattern=".*\\.love" />
+ <data android:host="*" />
+ </intent-filter>
+ </activity>
+ <activity
+ android:name="DownloadActivity"
+ android:noHistory="true" >
+ <intent-filter>
+ <action android:name="android.intent.action.VIEW" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <data android:scheme="http"
+ android:host="*"
+ android:pathPrefix="*"
+ android:mimeType="*/*"
+ android:pathPattern=".*\\.love" />
+ <data android:scheme="https"
+ android:host="*"
+ android:pathPrefix="*"
+ android:mimeType="*/*"
+ android:pathPattern=".*\\.love" />
+ </intent-filter>
+ </activity>
+ </application>
+
+ <!-- Android 2.3.3 -->
+ <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="18" />
+
+ <!-- OpenGL ES 2.0 -->
+ <uses-feature android:glEsVersion="0x00020000" />
+</manifest>
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/original/love/to/android/LtaActivity.java b/love2dToAPK/tools/tools/love-android-sdl2/original/love/to/android/LtaActivity.java
new file mode 100644
index 0000000..f27c11f
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/original/love/to/android/LtaActivity.java
@@ -0,0 +1,4 @@
+package love.to.android;
+import org.love2d.android.GameActivity;
+
+public class LtaActivity extends GameActivity {}
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/project.properties b/love2dToAPK/tools/tools/love-android-sdl2/project.properties
new file mode 100644
index 0000000..4ab1256
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/project.properties
@@ -0,0 +1,14 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system edit
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+#
+# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
+#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
+
+# Project target.
+target=android-19
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/res/drawable-xxhdpi/ic_launcher.png b/love2dToAPK/tools/tools/love-android-sdl2/res/drawable-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..e0567f6
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/res/drawable-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/src/love/to/android/LtaActivity.java b/love2dToAPK/tools/tools/love-android-sdl2/src/love/to/android/LtaActivity.java
new file mode 100644
index 0000000..f27c11f
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/src/love/to/android/LtaActivity.java
@@ -0,0 +1,4 @@
+package love.to.android;
+import org.love2d.android.GameActivity;
+
+public class LtaActivity extends GameActivity {}
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/src/org/libsdl/app/SDLActivity.java b/love2dToAPK/tools/tools/love-android-sdl2/src/org/libsdl/app/SDLActivity.java
new file mode 100644
index 0000000..e579bec
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/src/org/libsdl/app/SDLActivity.java
@@ -0,0 +1,1676 @@
+package org.libsdl.app;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.lang.reflect.Method;
+
+import android.app.*;
+import android.content.*;
+import android.text.InputType;
+import android.view.*;
+import android.view.inputmethod.BaseInputConnection;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputConnection;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.AbsoluteLayout;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.os.*;
+import android.util.Log;
+import android.util.SparseArray;
+import android.graphics.*;
+import android.graphics.drawable.Drawable;
+import android.media.*;
+import android.hardware.*;
+import android.content.pm.ActivityInfo;
+
+/**
+ SDL Activity
+*/
+public class SDLActivity extends Activity {
+ private static final String TAG = "SDL";
+
+ // Keep track of the paused state
+ public static boolean mIsPaused, mIsSurfaceReady, mHasFocus;
+ public static boolean mExitCalledFromJava;
+
+ /** If shared libraries (e.g. SDL or the native application) could not be loaded. */
+ public static boolean mBrokenLibraries;
+
+ // If we want to separate mouse and touch events.
+ // This is only toggled in native code when a hint is set!
+ public static boolean mSeparateMouseAndTouch;
+
+ // Main components
+ protected static SDLActivity mSingleton;
+ protected static SDLSurface mSurface;
+ protected static View mTextEdit;
+ protected static ViewGroup mLayout;
+ protected static SDLJoystickHandler mJoystickHandler;
+
+ // This is what SDL runs in. It invokes SDL_main(), eventually
+ protected static Thread mSDLThread;
+
+ // Audio
+ protected static AudioTrack mAudioTrack;
+
+ /**
+ * This method is called by SDL before loading the native shared libraries.
+ * It can be overridden to provide names of shared libraries to be loaded.
+ * The default implementation returns the defaults. It never returns null.
+ * An array returned by a new implementation must at least contain "SDL2".
+ * Also keep in mind that the order the libraries are loaded may matter.
+ * @return names of shared libraries to be loaded (e.g. "SDL2", "main").
+ */
+ protected String[] getLibraries() {
+ return new String[] {
+ "SDL2",
+ // "SDL2_image",
+ // "SDL2_mixer",
+ // "SDL2_net",
+ // "SDL2_ttf",
+ "main"
+ };
+ }
+
+ // Load the .so
+ public void loadLibraries() {
+ for (String lib : getLibraries()) {
+ System.loadLibrary(lib);
+ }
+ }
+
+ /**
+ * This method is called by SDL before starting the native application thread.
+ * It can be overridden to provide the arguments after the application name.
+ * The default implementation returns an empty array. It never returns null.
+ * @return arguments for the native application.
+ */
+ protected String[] getArguments() {
+ return new String[0];
+ }
+
+ public static void initialize() {
+ // The static nature of the singleton and Android quirkyness force us to initialize everything here
+ // Otherwise, when exiting the app and returning to it, these variables *keep* their pre exit values
+ mSingleton = null;
+ mSurface = null;
+ mTextEdit = null;
+ mLayout = null;
+ mJoystickHandler = null;
+ mSDLThread = null;
+ mAudioTrack = null;
+ mExitCalledFromJava = false;
+ mBrokenLibraries = false;
+ mIsPaused = false;
+ mIsSurfaceReady = false;
+ mHasFocus = true;
+ }
+
+ // Setup
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ Log.v(TAG, "Device: " + android.os.Build.DEVICE);
+ Log.v(TAG, "Model: " + android.os.Build.MODEL);
+ Log.v(TAG, "onCreate(): " + mSingleton);
+ super.onCreate(savedInstanceState);
+
+ startNative();
+
+ // Load shared libraries
+ String errorMsgBrokenLib = "";
+ try {
+ loadLibraries();
+ } catch(UnsatisfiedLinkError e) {
+ System.err.println(e.getMessage());
+ mBrokenLibraries = true;
+ errorMsgBrokenLib = e.getMessage();
+ } catch(Exception e) {
+ System.err.println(e.getMessage());
+ mBrokenLibraries = true;
+ errorMsgBrokenLib = e.getMessage();
+ }
+
+ if (mBrokenLibraries)
+ {
+ AlertDialog.Builder dlgAlert = new AlertDialog.Builder(this);
+ dlgAlert.setMessage("An error occurred while trying to start the application. Please try again and/or reinstall."
+ + System.getProperty("line.separator")
+ + System.getProperty("line.separator")
+ + "Error: " + errorMsgBrokenLib);
+ dlgAlert.setTitle("SDL Error");
+ dlgAlert.setPositiveButton("Exit",
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog,int id) {
+ // if this button is clicked, close current activity
+ SDLActivity.mSingleton.finish();
+ }
+ });
+ dlgAlert.setCancelable(false);
+ dlgAlert.create().show();
+
+ return;
+ }
+
+ // Get filename from "Open with" of another application
+ Intent intent = getIntent();
+
+ if (intent != null && intent.getData() != null) {
+ String filename = intent.getData().getPath();
+ if (filename != null) {
+ Log.v(TAG, "Got filename: " + filename);
+ SDLActivity.onNativeDropFile(filename);
+ }
+ }
+ }
+
+ // Events
+ @Override
+ protected void onPause() {
+ Log.v(TAG, "onPause()");
+ super.onPause();
+
+ if (SDLActivity.mBrokenLibraries) {
+ return;
+ }
+
+ SDLActivity.handlePause();
+ }
+
+ @Override
+ protected void onResume() {
+ Log.v(TAG, "onResume()");
+ super.onResume();
+
+ if (SDLActivity.mBrokenLibraries) {
+ return;
+ }
+
+ SDLActivity.handleResume();
+ }
+
+
+ @Override
+ public void onWindowFocusChanged(boolean hasFocus) {
+ super.onWindowFocusChanged(hasFocus);
+ Log.v(TAG, "onWindowFocusChanged(): " + hasFocus);
+
+ if (SDLActivity.mBrokenLibraries) {
+ return;
+ }
+
+ SDLActivity.mHasFocus = hasFocus;
+ if (hasFocus) {
+ SDLActivity.handleResume();
+ }
+ }
+
+ @Override
+ public void onLowMemory() {
+ Log.v(TAG, "onLowMemory()");
+ super.onLowMemory();
+
+ if (SDLActivity.mBrokenLibraries) {
+ return;
+ }
+
+ SDLActivity.nativeLowMemory();
+ }
+
+ /** Ends the native thread.
+ */
+ public void resetNative() {
+ Log.v("SDL", "resetNative()");
+
+ // Send a quit message to the application
+ SDLActivity.mExitCalledFromJava = true;
+ SDLActivity.nativeQuit();
+
+ // Now wait for the SDL thread to quit
+ if (SDLActivity.mSDLThread != null) {
+ try {
+ SDLActivity.mSDLThread.join();
+ } catch(Exception e) {
+ Log.v("SDL", "Problem stopping thread: " + e);
+ }
+ SDLActivity.mSDLThread = null;
+
+ //Log.v("SDL", "Finished waiting for SDL thread");
+ }
+
+ SDLActivity.initialize();
+ }
+
+ public void startNative() {
+ Log.v("SDL", "startNative()");
+ SDLActivity.initialize();
+ // So we can call stuff from static callbacks
+ mSingleton = this;
+
+ // Set up the surface
+ mSurface = new SDLSurface(getApplication());
+
+ if(Build.VERSION.SDK_INT >= 12) {
+ mJoystickHandler = new SDLJoystickHandler_API12();
+ }
+ else {
+ mJoystickHandler = new SDLJoystickHandler();
+ }
+
+ mLayout = new AbsoluteLayout(this);
+ mLayout.addView(mSurface);
+
+ setContentView(mLayout);
+ }
+
+ @Override
+ protected void onDestroy() {
+ Log.v(TAG, "onDestroy()");
+
+ if (SDLActivity.mBrokenLibraries) {
+ super.onDestroy();
+ // Reset everything in case the user re opens the app
+ SDLActivity.initialize();
+ return;
+ }
+
+ resetNative();
+
+ super.onDestroy();
+ // Reset everything in case the user re opens the app
+ SDLActivity.initialize();
+ }
+
+ @Override
+ public boolean dispatchKeyEvent(KeyEvent event) {
+
+ if (SDLActivity.mBrokenLibraries) {
+ return false;
+ }
+
+ int keyCode = event.getKeyCode();
+ // Ignore certain special keys so they're handled by Android
+ if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN ||
+ keyCode == KeyEvent.KEYCODE_VOLUME_UP ||
+ keyCode == KeyEvent.KEYCODE_CAMERA ||
+ keyCode == 168 || /* API 11: KeyEvent.KEYCODE_ZOOM_IN */
+ keyCode == 169 /* API 11: KeyEvent.KEYCODE_ZOOM_OUT */
+ ) {
+ return false;
+ }
+ return super.dispatchKeyEvent(event);
+ }
+
+ /** Called by onPause or surfaceDestroyed. Even if surfaceDestroyed
+ * is the first to be called, mIsSurfaceReady should still be set
+ * to 'true' during the call to onPause (in a usual scenario).
+ */
+ public static void handlePause() {
+ if (!SDLActivity.mIsPaused && SDLActivity.mIsSurfaceReady) {
+ SDLActivity.mIsPaused = true;
+ SDLActivity.nativePause();
+ mSurface.handlePause();
+ }
+ }
+
+ /** Called by onResume or surfaceCreated. An actual resume should be done only when the surface is ready.
+ * Note: Some Android variants may send multiple surfaceChanged events, so we don't need to resume
+ * every time we get one of those events, only if it comes after surfaceDestroyed
+ */
+ public static void handleResume() {
+ if (SDLActivity.mIsPaused && SDLActivity.mIsSurfaceReady && SDLActivity.mHasFocus) {
+ SDLActivity.mIsPaused = false;
+ SDLActivity.nativeResume();
+ mSurface.handleResume();
+ }
+ }
+
+ /* The native thread has finished */
+ public static void handleNativeExit() {
+ SDLActivity.mSDLThread = null;
+ mSingleton.finish();
+ }
+
+
+ // Messages from the SDLMain thread
+ static final int COMMAND_CHANGE_TITLE = 1;
+ static final int COMMAND_UNUSED = 2;
+ static final int COMMAND_TEXTEDIT_HIDE = 3;
+ static final int COMMAND_SET_KEEP_SCREEN_ON = 5;
+
+ protected static final int COMMAND_USER = 0x8000;
+
+ /**
+ * This method is called by SDL if SDL did not handle a message itself.
+ * This happens if a received message contains an unsupported command.
+ * Method can be overwritten to handle Messages in a different class.
+ * @param command the command of the message.
+ * @param param the parameter of the message. May be null.
+ * @return if the message was handled in overridden method.
+ */
+ protected boolean onUnhandledMessage(int command, Object param) {
+ return false;
+ }
+
+ /**
+ * A Handler class for Messages from native SDL applications.
+ * It uses current Activities as target (e.g. for the title).
+ * static to prevent implicit references to enclosing object.
+ */
+ protected static class SDLCommandHandler extends Handler {
+ @Override
+ public void handleMessage(Message msg) {
+ Context context = getContext();
+ if (context == null) {
+ Log.e(TAG, "error handling message, getContext() returned null");
+ return;
+ }
+ switch (msg.arg1) {
+ case COMMAND_CHANGE_TITLE:
+ if (context instanceof Activity) {
+ ((Activity) context).setTitle((String)msg.obj);
+ } else {
+ Log.e(TAG, "error handling message, getContext() returned no Activity");
+ }
+ break;
+ case COMMAND_TEXTEDIT_HIDE:
+ if (mTextEdit != null) {
+ mTextEdit.setVisibility(View.GONE);
+
+ InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
+ imm.hideSoftInputFromWindow(mTextEdit.getWindowToken(), 0);
+ }
+ break;
+ case COMMAND_SET_KEEP_SCREEN_ON:
+ {
+ Window window = ((Activity) context).getWindow();
+ if (window != null) {
+ if ((msg.obj instanceof Integer) && (((Integer) msg.obj).intValue() != 0)) {
+ window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+ } else {
+ window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+ }
+ }
+ break;
+ }
+ default:
+ if ((context instanceof SDLActivity) && !((SDLActivity) context).onUnhandledMessage(msg.arg1, msg.obj)) {
+ Log.e(TAG, "error handling message, command is " + msg.arg1);
+ }
+ }
+ }
+ }
+
+ // Handler for the messages
+ Handler commandHandler = new SDLCommandHandler();
+
+ // Send a message from the SDLMain thread
+ boolean sendCommand(int command, Object data) {
+ Message msg = commandHandler.obtainMessage();
+ msg.arg1 = command;
+ msg.obj = data;
+ return commandHandler.sendMessage(msg);
+ }
+
+ // C functions we call
+ public static native int nativeInit(Object arguments);
+ public static native void nativeLowMemory();
+ public static native void nativeQuit();
+ public static native void nativePause();
+ public static native void nativeResume();
+ public static native void onNativeDropFile(String filename);
+ public static native void onNativeResize(int x, int y, int format, float rate);
+ public static native int onNativePadDown(int device_id, int keycode);
+ public static native int onNativePadUp(int device_id, int keycode);
+ public static native void onNativeJoy(int device_id, int axis,
+ float value);
+ public static native void onNativeHat(int device_id, int hat_id,
+ int x, int y);
+ public static native void onNativeKeyDown(int keycode);
+ public static native void onNativeKeyUp(int keycode);
+ public static native void onNativeKeyboardFocusLost();
+ public static native void onNativeMouse(int button, int action, float x, float y);
+ public static native void onNativeTouch(int touchDevId, int pointerFingerId,
+ int action, float x,
+ float y, float p);
+ public static native void onNativeAccel(float x, float y, float z);
+ public static native void onNativeSurfaceChanged();
+ public static native void onNativeSurfaceDestroyed();
+ public static native int nativeAddJoystick(int device_id, String name,
+ int is_accelerometer, int nbuttons,
+ int naxes, int nhats, int nballs);
+ public static native int nativeRemoveJoystick(int device_id);
+ public static native String nativeGetHint(String name);
+
+ /**
+ * This method is called by SDL using JNI.
+ */
+ public static boolean setActivityTitle(String title) {
+ // Called from SDLMain() thread and can't directly affect the view
+ return mSingleton.sendCommand(COMMAND_CHANGE_TITLE, title);
+ }
+
+ /**
+ * This method is called by SDL using JNI.
+ */
+ public static boolean sendMessage(int command, int param) {
+ return mSingleton.sendCommand(command, Integer.valueOf(param));
+ }
+
+ /**
+ * This method is called by SDL using JNI.
+ */
+ public static Context getContext() {
+ return mSingleton;
+ }
+
+ /**
+ * This method is called by SDL using JNI.
+ * @return result of getSystemService(name) but executed on UI thread.
+ */
+ public Object getSystemServiceFromUiThread(final String name) {
+ final Object lock = new Object();
+ final Object[] results = new Object[2]; // array for writable variables
+ synchronized (lock) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ synchronized (lock) {
+ results[0] = getSystemService(name);
+ results[1] = Boolean.TRUE;
+ lock.notify();
+ }
+ }
+ });
+ if (results[1] == null) {
+ try {
+ lock.wait();
+ } catch (InterruptedException ex) {
+ ex.printStackTrace();
+ }
+ }
+ }
+ return results[0];
+ }
+
+ static class ShowTextInputTask implements Runnable {
+ /*
+ * This is used to regulate the pan&scan method to have some offset from
+ * the bottom edge of the input region and the top edge of an input
+ * method (soft keyboard)
+ */
+ static final int HEIGHT_PADDING = 15;
+
+ public int x, y, w, h;
+
+ public ShowTextInputTask(int x, int y, int w, int h) {
+ this.x = x;
+ this.y = y;
+ this.w = w;
+ this.h = h;
+ }
+
+ @Override
+ public void run() {
+ AbsoluteLayout.LayoutParams params = new AbsoluteLayout.LayoutParams(
+ w, h + HEIGHT_PADDING, x, y);
+
+ if (mTextEdit == null) {
+ mTextEdit = new DummyEdit(getContext());
+
+ mLayout.addView(mTextEdit, params);
+ } else {
+ mTextEdit.setLayoutParams(params);
+ }
+
+ mTextEdit.setVisibility(View.VISIBLE);
+ mTextEdit.requestFocus();
+
+ InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
+ imm.showSoftInput(mTextEdit, 0);
+ }
+ }
+
+ /**
+ * This method is called by SDL using JNI.
+ */
+ public static boolean showTextInput(int x, int y, int w, int h) {
+ // Transfer the task to the main thread as a Runnable
+ return mSingleton.commandHandler.post(new ShowTextInputTask(x, y, w, h));
+ }
+
+ /**
+ * This method is called by SDL using JNI.
+ */
+ public static Surface getNativeSurface() {
+ return SDLActivity.mSurface.getNativeSurface();
+ }
+
+ // Audio
+
+ /**
+ * This method is called by SDL using JNI.
+ */
+ public static int audioInit(int sampleRate, boolean is16Bit, boolean isStereo, int desiredFrames) {
+ int channelConfig = isStereo ? AudioFormat.CHANNEL_CONFIGURATION_STEREO : AudioFormat.CHANNEL_CONFIGURATION_MONO;
+ int audioFormat = is16Bit ? AudioFormat.ENCODING_PCM_16BIT : AudioFormat.ENCODING_PCM_8BIT;
+ int frameSize = (isStereo ? 2 : 1) * (is16Bit ? 2 : 1);
+
+ Log.v(TAG, "SDL audio: wanted " + (isStereo ? "stereo" : "mono") + " " + (is16Bit ? "16-bit" : "8-bit") + " " + (sampleRate / 1000f) + "kHz, " + desiredFrames + " frames buffer");
+
+ // Let the user pick a larger buffer if they really want -- but ye
+ // gods they probably shouldn't, the minimums are horrifyingly high
+ // latency already
+ desiredFrames = Math.max(desiredFrames, (AudioTrack.getMinBufferSize(sampleRate, channelConfig, audioFormat) + frameSize - 1) / frameSize);
+
+ if (mAudioTrack == null) {
+ mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sampleRate,
+ channelConfig, audioFormat, desiredFrames * frameSize, AudioTrack.MODE_STREAM);
+
+ // Instantiating AudioTrack can "succeed" without an exception and the track may still be invalid
+ // Ref: https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/media/java/android/media/AudioTrack.java
+ // Ref: http://developer.android.com/reference/android/media/AudioTrack.html#getState()
+
+ if (mAudioTrack.getState() != AudioTrack.STATE_INITIALIZED) {
+ Log.e(TAG, "Failed during initialization of Audio Track");
+ mAudioTrack = null;
+ return -1;
+ }
+
+ mAudioTrack.play();
+ }
+
+ Log.v(TAG, "SDL audio: got " + ((mAudioTrack.getChannelCount() >= 2) ? "stereo" : "mono") + " " + ((mAudioTrack.getAudioFormat() == AudioFormat.ENCODING_PCM_16BIT) ? "16-bit" : "8-bit") + " " + (mAudioTrack.getSampleRate() / 1000f) + "kHz, " + desiredFrames + " frames buffer");
+
+ return 0;
+ }
+
+ /**
+ * This method is called by SDL using JNI.
+ */
+ public static void audioWriteShortBuffer(short[] buffer) {
+ for (int i = 0; i < buffer.length; ) {
+ int result = mAudioTrack.write(buffer, i, buffer.length - i);
+ if (result > 0) {
+ i += result;
+ } else if (result == 0) {
+ try {
+ Thread.sleep(1);
+ } catch(InterruptedException e) {
+ // Nom nom
+ }
+ } else {
+ Log.w(TAG, "SDL audio: error return from write(short)");
+ return;
+ }
+ }
+ }
+
+ /**
+ * This method is called by SDL using JNI.
+ */
+ public static void audioWriteByteBuffer(byte[] buffer) {
+ for (int i = 0; i < buffer.length; ) {
+ int result = mAudioTrack.write(buffer, i, buffer.length - i);
+ if (result > 0) {
+ i += result;
+ } else if (result == 0) {
+ try {
+ Thread.sleep(1);
+ } catch(InterruptedException e) {
+ // Nom nom
+ }
+ } else {
+ Log.w(TAG, "SDL audio: error return from write(byte)");
+ return;
+ }
+ }
+ }
+
+ /**
+ * This method is called by SDL using JNI.
+ */
+ public static void audioQuit() {
+ if (mAudioTrack != null) {
+ mAudioTrack.stop();
+ mAudioTrack = null;
+ }
+ }
+
+ // Input
+
+ /**
+ * This method is called by SDL using JNI.
+ * @return an array which may be empty but is never null.
+ */
+ public static int[] inputGetInputDeviceIds(int sources) {
+ int[] ids = InputDevice.getDeviceIds();
+ int[] filtered = new int[ids.length];
+ int used = 0;
+ for (int i = 0; i < ids.length; ++i) {
+ InputDevice device = InputDevice.getDevice(ids[i]);
+ if ((device != null) && ((device.getSources() & sources) != 0)) {
+ filtered[used++] = device.getId();
+ }
+ }
+ return Arrays.copyOf(filtered, used);
+ }
+
+ // Joystick glue code, just a series of stubs that redirect to the SDLJoystickHandler instance
+ public static boolean handleJoystickMotionEvent(MotionEvent event) {
+ return mJoystickHandler.handleMotionEvent(event);
+ }
+
+ /**
+ * This method is called by SDL using JNI.
+ */
+ public static void pollInputDevices() {
+ if (SDLActivity.mSDLThread != null) {
+ mJoystickHandler.pollInputDevices();
+ }
+ }
+
+ // APK expansion files support
+
+ /** com.android.vending.expansion.zipfile.ZipResourceFile object or null. */
+ private Object expansionFile;
+
+ /** com.android.vending.expansion.zipfile.ZipResourceFile's getInputStream() or null. */
+ private Method expansionFileMethod;
+
+ /**
+ * This method was called by SDL using JNI.
+ * @deprecated because of an incorrect name
+ */
+ @Deprecated
+ public InputStream openAPKExtensionInputStream(String fileName) throws IOException {
+ return openAPKExpansionInputStream(fileName);
+ }
+
+ /**
+ * This method is called by SDL using JNI.
+ * @return an InputStream on success or null if no expansion file was used.
+ * @throws IOException on errors. Message is set for the SDL error message.
+ */
+ public InputStream openAPKExpansionInputStream(String fileName) throws IOException {
+ // Get a ZipResourceFile representing a merger of both the main and patch files
+ if (expansionFile == null) {
+ String mainHint = nativeGetHint("SDL_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION");
+ if (mainHint == null) {
+ return null; // no expansion use if no main version was set
+ }
+ String patchHint = nativeGetHint("SDL_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION");
+ if (patchHint == null) {
+ return null; // no expansion use if no patch version was set
+ }
+
+ Integer mainVersion;
+ Integer patchVersion;
+ try {
+ mainVersion = Integer.valueOf(mainHint);
+ patchVersion = Integer.valueOf(patchHint);
+ } catch (NumberFormatException ex) {
+ ex.printStackTrace();
+ throw new IOException("No valid file versions set for APK expansion files", ex);
+ }
+
+ try {
+ // To avoid direct dependency on Google APK expansion library that is
+ // not a part of Android SDK we access it using reflection
+ expansionFile = Class.forName("com.android.vending.expansion.zipfile.APKExpansionSupport")
+ .getMethod("getAPKExpansionZipFile", Context.class, int.class, int.class)
+ .invoke(null, this, mainVersion, patchVersion);
+
+ expansionFileMethod = expansionFile.getClass()
+ .getMethod("getInputStream", String.class);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ expansionFile = null;
+ expansionFileMethod = null;
+ throw new IOException("Could not access APK expansion support library", ex);
+ }
+ }
+
+ // Get an input stream for a known file inside the expansion file ZIPs
+ InputStream fileStream;
+ try {
+ fileStream = (InputStream)expansionFileMethod.invoke(expansionFile, fileName);
+ } catch (Exception ex) {
+ // calling "getInputStream" failed
+ ex.printStackTrace();
+ throw new IOException("Could not open stream from APK expansion file", ex);
+ }
+
+ if (fileStream == null) {
+ // calling "getInputStream" was successful but null was returned
+ throw new IOException("Could not find path in APK expansion file");
+ }
+
+ return fileStream;
+ }
+
+ // Messagebox
+
+ /** Result of current messagebox. Also used for blocking the calling thread. */
+ protected final int[] messageboxSelection = new int[1];
+
+ /** Id of current dialog. */
+ protected int dialogs = 0;
+
+ /**
+ * This method is called by SDL using JNI.
+ * Shows the messagebox from UI thread and block calling thread.
+ * buttonFlags, buttonIds and buttonTexts must have same length.
+ * @param buttonFlags array containing flags for every button.
+ * @param buttonIds array containing id for every button.
+ * @param buttonTexts array containing text for every button.
+ * @param colors null for default or array of length 5 containing colors.
+ * @return button id or -1.
+ */
+ public int messageboxShowMessageBox(
+ final int flags,
+ final String title,
+ final String message,
+ final int[] buttonFlags,
+ final int[] buttonIds,
+ final String[] buttonTexts,
+ final int[] colors) {
+
+ messageboxSelection[0] = -1;
+
+ // sanity checks
+
+ if ((buttonFlags.length != buttonIds.length) && (buttonIds.length != buttonTexts.length)) {
+ return -1; // implementation broken
+ }
+
+ // collect arguments for Dialog
+
+ final Bundle args = new Bundle();
+ args.putInt("flags", flags);
+ args.putString("title", title);
+ args.putString("message", message);
+ args.putIntArray("buttonFlags", buttonFlags);
+ args.putIntArray("buttonIds", buttonIds);
+ args.putStringArray("buttonTexts", buttonTexts);
+ args.putIntArray("colors", colors);
+
+ // trigger Dialog creation on UI thread
+
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ showDialog(dialogs++, args);
+ }
+ });
+
+ // block the calling thread
+
+ synchronized (messageboxSelection) {
+ try {
+ messageboxSelection.wait();
+ } catch (InterruptedException ex) {
+ ex.printStackTrace();
+ return -1;
+ }
+ }
+
+ // return selected value
+
+ return messageboxSelection[0];
+ }
+
+ @Override
+ protected Dialog onCreateDialog(int ignore, Bundle args) {
+
+ // TODO set values from "flags" to messagebox dialog
+
+ // get colors
+
+ int[] colors = args.getIntArray("colors");
+ int backgroundColor;
+ int textColor;
+ int buttonBorderColor;
+ int buttonBackgroundColor;
+ int buttonSelectedColor;
+ if (colors != null) {
+ int i = -1;
+ backgroundColor = colors[++i];
+ textColor = colors[++i];
+ buttonBorderColor = colors[++i];
+ buttonBackgroundColor = colors[++i];
+ buttonSelectedColor = colors[++i];
+ } else {
+ backgroundColor = Color.TRANSPARENT;
+ textColor = Color.TRANSPARENT;
+ buttonBorderColor = Color.TRANSPARENT;
+ buttonBackgroundColor = Color.TRANSPARENT;
+ buttonSelectedColor = Color.TRANSPARENT;
+ }
+
+ // create dialog with title and a listener to wake up calling thread
+
+ final Dialog dialog = new Dialog(this);
+ dialog.setTitle(args.getString("title"));
+ dialog.setCancelable(false);
+ dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
+ @Override
+ public void onDismiss(DialogInterface unused) {
+ synchronized (messageboxSelection) {
+ messageboxSelection.notify();
+ }
+ }
+ });
+
+ // create text
+
+ TextView message = new TextView(this);
+ message.setGravity(Gravity.CENTER);
+ message.setText(args.getString("message"));
+ if (textColor != Color.TRANSPARENT) {
+ message.setTextColor(textColor);
+ }
+
+ // create buttons
+
+ int[] buttonFlags = args.getIntArray("buttonFlags");
+ int[] buttonIds = args.getIntArray("buttonIds");
+ String[] buttonTexts = args.getStringArray("buttonTexts");
+
+ final SparseArray<Button> mapping = new SparseArray<Button>();
+
+ LinearLayout buttons = new LinearLayout(this);
+ buttons.setOrientation(LinearLayout.HORIZONTAL);
+ buttons.setGravity(Gravity.CENTER);
+ for (int i = 0; i < buttonTexts.length; ++i) {
+ Button button = new Button(this);
+ final int id = buttonIds[i];
+ button.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ messageboxSelection[0] = id;
+ dialog.dismiss();
+ }
+ });
+ if (buttonFlags[i] != 0) {
+ // see SDL_messagebox.h
+ if ((buttonFlags[i] & 0x00000001) != 0) {
+ mapping.put(KeyEvent.KEYCODE_ENTER, button);
+ }
+ if ((buttonFlags[i] & 0x00000002) != 0) {
+ mapping.put(111, button); /* API 11: KeyEvent.KEYCODE_ESCAPE */
+ }
+ }
+ button.setText(buttonTexts[i]);
+ if (textColor != Color.TRANSPARENT) {
+ button.setTextColor(textColor);
+ }
+ if (buttonBorderColor != Color.TRANSPARENT) {
+ // TODO set color for border of messagebox button
+ }
+ if (buttonBackgroundColor != Color.TRANSPARENT) {
+ Drawable drawable = button.getBackground();
+ if (drawable == null) {
+ // setting the color this way removes the style
+ button.setBackgroundColor(buttonBackgroundColor);
+ } else {
+ // setting the color this way keeps the style (gradient, padding, etc.)
+ drawable.setColorFilter(buttonBackgroundColor, PorterDuff.Mode.MULTIPLY);
+ }
+ }
+ if (buttonSelectedColor != Color.TRANSPARENT) {
+ // TODO set color for selected messagebox button
+ }
+ buttons.addView(button);
+ }
+
+ // create content
+
+ LinearLayout content = new LinearLayout(this);
+ content.setOrientation(LinearLayout.VERTICAL);
+ content.addView(message);
+ content.addView(buttons);
+ if (backgroundColor != Color.TRANSPARENT) {
+ content.setBackgroundColor(backgroundColor);
+ }
+
+ // add content to dialog and return
+
+ dialog.setContentView(content);
+ dialog.setOnKeyListener(new Dialog.OnKeyListener() {
+ @Override
+ public boolean onKey(DialogInterface d, int keyCode, KeyEvent event) {
+ Button button = mapping.get(keyCode);
+ if (button != null) {
+ if (event.getAction() == KeyEvent.ACTION_UP) {
+ button.performClick();
+ }
+ return true; // also for ignored actions
+ }
+ return false;
+ }
+ });
+
+ return dialog;
+ }
+}
+
+/**
+ Simple nativeInit() runnable
+*/
+class SDLMain implements Runnable {
+ @Override
+ public void run() {
+ // Runs SDL_main()
+ SDLActivity.nativeInit(SDLActivity.mSingleton.getArguments());
+
+ //Log.v("SDL", "SDL thread terminated");
+ }
+}
+
+
+/**
+ SDLSurface. This is what we draw on, so we need to know when it's created
+ in order to do anything useful.
+
+ Because of this, that's where we set up the SDL thread
+*/
+class SDLSurface extends SurfaceView implements SurfaceHolder.Callback,
+ View.OnKeyListener, View.OnTouchListener, SensorEventListener {
+
+ // Sensors
+ protected static SensorManager mSensorManager;
+ protected static Display mDisplay;
+
+ // Keep track of the surface size to normalize touch events
+ protected static float mWidth, mHeight;
+
+ // Startup
+ public SDLSurface(Context context) {
+ super(context);
+ getHolder().addCallback(this);
+
+ setFocusable(true);
+ setFocusableInTouchMode(true);
+ requestFocus();
+ setOnKeyListener(this);
+ setOnTouchListener(this);
+
+ mDisplay = ((WindowManager)context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
+ mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
+
+ if(Build.VERSION.SDK_INT >= 12) {
+ setOnGenericMotionListener(new SDLGenericMotionListener_API12());
+ }
+
+ // Some arbitrary defaults to avoid a potential division by zero
+ mWidth = 1.0f;
+ mHeight = 1.0f;
+ }
+
+ public void handlePause() {
+ enableSensor(Sensor.TYPE_ACCELEROMETER, false);
+ }
+
+ public void handleResume() {
+ setFocusable(true);
+ setFocusableInTouchMode(true);
+ requestFocus();
+ setOnKeyListener(this);
+ setOnTouchListener(this);
+ enableSensor(Sensor.TYPE_ACCELEROMETER, true);
+ }
+
+ public Surface getNativeSurface() {
+ return getHolder().getSurface();
+ }
+
+ // Called when we have a valid drawing surface
+ @Override
+ public void surfaceCreated(SurfaceHolder holder) {
+ Log.v("SDL", "surfaceCreated()");
+ holder.setType(SurfaceHolder.SURFACE_TYPE_GPU);
+ }
+
+ // Called when we lose the surface
+ @Override
+ public void surfaceDestroyed(SurfaceHolder holder) {
+ Log.v("SDL", "surfaceDestroyed()");
+ // Call this *before* setting mIsSurfaceReady to 'false'
+ SDLActivity.handlePause();
+ SDLActivity.mIsSurfaceReady = false;
+ SDLActivity.onNativeSurfaceDestroyed();
+ }
+
+ // Called when the surface is resized
+ @Override
+ public void surfaceChanged(SurfaceHolder holder,
+ int format, int width, int height) {
+ Log.v("SDL", "surfaceChanged()");
+
+ int sdlFormat = 0x15151002; // SDL_PIXELFORMAT_RGB565 by default
+ switch (format) {
+ case PixelFormat.A_8:
+ Log.v("SDL", "pixel format A_8");
+ break;
+ case PixelFormat.LA_88:
+ Log.v("SDL", "pixel format LA_88");
+ break;
+ case PixelFormat.L_8:
+ Log.v("SDL", "pixel format L_8");
+ break;
+ case PixelFormat.RGBA_4444:
+ Log.v("SDL", "pixel format RGBA_4444");
+ sdlFormat = 0x15421002; // SDL_PIXELFORMAT_RGBA4444
+ break;
+ case PixelFormat.RGBA_5551:
+ Log.v("SDL", "pixel format RGBA_5551");
+ sdlFormat = 0x15441002; // SDL_PIXELFORMAT_RGBA5551
+ break;
+ case PixelFormat.RGBA_8888:
+ Log.v("SDL", "pixel format RGBA_8888");
+ sdlFormat = 0x16462004; // SDL_PIXELFORMAT_RGBA8888
+ break;
+ case PixelFormat.RGBX_8888:
+ Log.v("SDL", "pixel format RGBX_8888");
+ sdlFormat = 0x16261804; // SDL_PIXELFORMAT_RGBX8888
+ break;
+ case PixelFormat.RGB_332:
+ Log.v("SDL", "pixel format RGB_332");
+ sdlFormat = 0x14110801; // SDL_PIXELFORMAT_RGB332
+ break;
+ case PixelFormat.RGB_565:
+ Log.v("SDL", "pixel format RGB_565");
+ sdlFormat = 0x15151002; // SDL_PIXELFORMAT_RGB565
+ break;
+ case PixelFormat.RGB_888:
+ Log.v("SDL", "pixel format RGB_888");
+ // Not sure this is right, maybe SDL_PIXELFORMAT_RGB24 instead?
+ sdlFormat = 0x16161804; // SDL_PIXELFORMAT_RGB888
+ break;
+ default:
+ Log.v("SDL", "pixel format unknown " + format);
+ break;
+ }
+
+ mWidth = width;
+ mHeight = height;
+ SDLActivity.onNativeResize(width, height, sdlFormat, mDisplay.getRefreshRate());
+ Log.v("SDL", "Window size: " + width + "x" + height);
+
+
+ boolean skip = false;
+ int requestedOrientation = SDLActivity.mSingleton.getRequestedOrientation();
+
+ if (requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
+ {
+ // Accept any
+ }
+ else if (requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
+ {
+ if (mWidth > mHeight) {
+ skip = true;
+ }
+ } else if (requestedOrientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
+ if (mWidth < mHeight) {
+ skip = true;
+ }
+ }
+
+ // Special Patch for Square Resolution: Black Berry Passport
+ if (skip) {
+ double min = Math.min(mWidth, mHeight);
+ double max = Math.max(mWidth, mHeight);
+
+ if (max / min < 1.20) {
+ Log.v("SDL", "Don't skip on such aspect-ratio. Could be a square resolution.");
+ skip = false;
+ }
+ }
+
+ if (skip) {
+ Log.v("SDL", "Skip .. Surface is not ready.");
+ return;
+ }
+
+
+ // Set mIsSurfaceReady to 'true' *before* making a call to handleResume
+ SDLActivity.mIsSurfaceReady = true;
+ SDLActivity.onNativeSurfaceChanged();
+
+
+ if (SDLActivity.mSDLThread == null) {
+ // This is the entry point to the C app.
+ // Start up the C app thread and enable sensor input for the first time
+
+ final Thread sdlThread = new Thread(new SDLMain(), "SDLThread");
+ enableSensor(Sensor.TYPE_ACCELEROMETER, true);
+ sdlThread.start();
+
+ // Set up a listener thread to catch when the native thread ends
+ SDLActivity.mSDLThread = new Thread(new Runnable(){
+ @Override
+ public void run(){
+ try {
+ sdlThread.join();
+ }
+ catch(Exception e){}
+ finally{
+ // Native thread has finished
+ if (! SDLActivity.mExitCalledFromJava) {
+ SDLActivity.handleNativeExit();
+ }
+ }
+ }
+ }, "SDLThreadListener");
+ SDLActivity.mSDLThread.start();
+ }
+
+ if (SDLActivity.mHasFocus) {
+ SDLActivity.handleResume();
+ }
+ }
+
+ // Key events
+ @Override
+ public boolean onKey(View v, int keyCode, KeyEvent event) {
+ // Dispatch the different events depending on where they come from
+ // Some SOURCE_DPAD or SOURCE_GAMEPAD are also SOURCE_KEYBOARD
+ // So, we try to process them as DPAD or GAMEPAD events first, if that fails we try them as KEYBOARD
+
+ if ( (event.getSource() & InputDevice.SOURCE_GAMEPAD) != 0 ||
+ (event.getSource() & InputDevice.SOURCE_DPAD) != 0 ) {
+ if (event.getAction() == KeyEvent.ACTION_DOWN) {
+ if (SDLActivity.onNativePadDown(event.getDeviceId(), keyCode) == 0) {
+ return true;
+ }
+ } else if (event.getAction() == KeyEvent.ACTION_UP) {
+ if (SDLActivity.onNativePadUp(event.getDeviceId(), keyCode) == 0) {
+ return true;
+ }
+ }
+ }
+
+ if( (event.getSource() & InputDevice.SOURCE_KEYBOARD) != 0) {
+ if (event.getAction() == KeyEvent.ACTION_DOWN) {
+ //Log.v("SDL", "key down: " + keyCode);
+ SDLActivity.onNativeKeyDown(keyCode);
+ return true;
+ }
+ else if (event.getAction() == KeyEvent.ACTION_UP) {
+ //Log.v("SDL", "key up: " + keyCode);
+ SDLActivity.onNativeKeyUp(keyCode);
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ // Touch events
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ /* Ref: http://developer.android.com/training/gestures/multi.html */
+ final int touchDevId = event.getDeviceId();
+ final int pointerCount = event.getPointerCount();
+ int action = event.getActionMasked();
+ int pointerFingerId;
+ int mouseButton;
+ int i = -1;
+ float x,y,p;
+
+ // !!! FIXME: dump this SDK check after 2.0.4 ships and require API14.
+ if (event.getSource() == InputDevice.SOURCE_MOUSE && SDLActivity.mSeparateMouseAndTouch) {
+ if (Build.VERSION.SDK_INT < 14) {
+ mouseButton = 1; // For Android==12 all mouse buttons are the left button
+ } else {
+ try {
+ mouseButton = (Integer) event.getClass().getMethod("getButtonState").invoke(event);
+ } catch(Exception e) {
+ mouseButton = 1; // oh well.
+ }
+ }
+ SDLActivity.onNativeMouse(mouseButton, action, event.getX(0), event.getY(0));
+ } else {
+ switch(action) {
+ case MotionEvent.ACTION_MOVE:
+ for (i = 0; i < pointerCount; i++) {
+ pointerFingerId = event.getPointerId(i);
+ x = event.getX(i) / mWidth;
+ y = event.getY(i) / mHeight;
+ p = event.getPressure(i);
+ if (p > 1.0f) {
+ // may be larger than 1.0f on some devices
+ // see the documentation of getPressure(i)
+ p = 1.0f;
+ }
+ SDLActivity.onNativeTouch(touchDevId, pointerFingerId, action, x, y, p);
+ }
+ break;
+
+ case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_DOWN:
+ // Primary pointer up/down, the index is always zero
+ i = 0;
+ case MotionEvent.ACTION_POINTER_UP:
+ case MotionEvent.ACTION_POINTER_DOWN:
+ // Non primary pointer up/down
+ if (i == -1) {
+ i = event.getActionIndex();
+ }
+
+ pointerFingerId = event.getPointerId(i);
+ x = event.getX(i) / mWidth;
+ y = event.getY(i) / mHeight;
+ p = event.getPressure(i);
+ if (p > 1.0f) {
+ // may be larger than 1.0f on some devices
+ // see the documentation of getPressure(i)
+ p = 1.0f;
+ }
+ SDLActivity.onNativeTouch(touchDevId, pointerFingerId, action, x, y, p);
+ break;
+
+ case MotionEvent.ACTION_CANCEL:
+ for (i = 0; i < pointerCount; i++) {
+ pointerFingerId = event.getPointerId(i);
+ x = event.getX(i) / mWidth;
+ y = event.getY(i) / mHeight;
+ p = event.getPressure(i);
+ if (p > 1.0f) {
+ // may be larger than 1.0f on some devices
+ // see the documentation of getPressure(i)
+ p = 1.0f;
+ }
+ SDLActivity.onNativeTouch(touchDevId, pointerFingerId, MotionEvent.ACTION_UP, x, y, p);
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ return true;
+ }
+
+ // Sensor events
+ public void enableSensor(int sensortype, boolean enabled) {
+ // TODO: This uses getDefaultSensor - what if we have >1 accels?
+ if (enabled) {
+ mSensorManager.registerListener(this,
+ mSensorManager.getDefaultSensor(sensortype),
+ SensorManager.SENSOR_DELAY_GAME, null);
+ } else {
+ mSensorManager.unregisterListener(this,
+ mSensorManager.getDefaultSensor(sensortype));
+ }
+ }
+
+ @Override
+ public void onAccuracyChanged(Sensor sensor, int accuracy) {
+ // TODO
+ }
+
+ @Override
+ public void onSensorChanged(SensorEvent event) {
+ if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
+ float x, y;
+ switch (mDisplay.getRotation()) {
+ case Surface.ROTATION_90:
+ x = -event.values[1];
+ y = event.values[0];
+ break;
+ case Surface.ROTATION_270:
+ x = event.values[1];
+ y = -event.values[0];
+ break;
+ case Surface.ROTATION_180:
+ x = -event.values[1];
+ y = -event.values[0];
+ break;
+ default:
+ x = event.values[0];
+ y = event.values[1];
+ break;
+ }
+ SDLActivity.onNativeAccel(-x / SensorManager.GRAVITY_EARTH,
+ y / SensorManager.GRAVITY_EARTH,
+ event.values[2] / SensorManager.GRAVITY_EARTH - 1);
+ }
+ }
+}
+
+/* This is a fake invisible editor view that receives the input and defines the
+ * pan&scan region
+ */
+class DummyEdit extends View implements View.OnKeyListener {
+ InputConnection ic;
+
+ public DummyEdit(Context context) {
+ super(context);
+ setFocusableInTouchMode(true);
+ setFocusable(true);
+ setOnKeyListener(this);
+ }
+
+ @Override
+ public boolean onCheckIsTextEditor() {
+ return true;
+ }
+
+ @Override
+ public boolean onKey(View v, int keyCode, KeyEvent event) {
+
+ // This handles the hardware keyboard input
+ if (event.isPrintingKey()) {
+ if (event.getAction() == KeyEvent.ACTION_DOWN) {
+ ic.commitText(String.valueOf((char) event.getUnicodeChar()), 1);
+ }
+ return true;
+ }
+
+ if (event.getAction() == KeyEvent.ACTION_DOWN) {
+ SDLActivity.onNativeKeyDown(keyCode);
+ return true;
+ } else if (event.getAction() == KeyEvent.ACTION_UP) {
+ SDLActivity.onNativeKeyUp(keyCode);
+ return true;
+ }
+
+ return false;
+ }
+
+ //
+ @Override
+ public boolean onKeyPreIme (int keyCode, KeyEvent event) {
+ // As seen on StackOverflow: http://stackoverflow.com/questions/7634346/keyboard-hide-event
+ // FIXME: Discussion at http://bugzilla.libsdl.org/show_bug.cgi?id=1639
+ // FIXME: This is not a 100% effective solution to the problem of detecting if the keyboard is showing or not
+ // FIXME: A more effective solution would be to change our Layout from AbsoluteLayout to Relative or Linear
+ // FIXME: And determine the keyboard presence doing this: http://stackoverflow.com/questions/2150078/how-to-check-visibility-of-software-keyboard-in-android
+ // FIXME: An even more effective way would be if Android provided this out of the box, but where would the fun be in that :)
+ if (event.getAction()==KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
+ if (SDLActivity.mTextEdit != null && SDLActivity.mTextEdit.getVisibility() == View.VISIBLE) {
+ SDLActivity.onNativeKeyboardFocusLost();
+ }
+ }
+ return super.onKeyPreIme(keyCode, event);
+ }
+
+ @Override
+ public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
+ ic = new SDLInputConnection(this, true);
+
+ outAttrs.inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD;
+ outAttrs.imeOptions = EditorInfo.IME_FLAG_NO_EXTRACT_UI
+ | 33554432 /* API 11: EditorInfo.IME_FLAG_NO_FULLSCREEN */;
+
+ return ic;
+ }
+}
+
+class SDLInputConnection extends BaseInputConnection {
+
+ public SDLInputConnection(View targetView, boolean fullEditor) {
+ super(targetView, fullEditor);
+
+ }
+
+ @Override
+ public boolean sendKeyEvent(KeyEvent event) {
+
+ /*
+ * This handles the keycodes from soft keyboard (and IME-translated
+ * input from hardkeyboard)
+ */
+ int keyCode = event.getKeyCode();
+ if (event.getAction() == KeyEvent.ACTION_DOWN) {
+ if (event.isPrintingKey()) {
+ commitText(String.valueOf((char) event.getUnicodeChar()), 1);
+ }
+ SDLActivity.onNativeKeyDown(keyCode);
+ return true;
+ } else if (event.getAction() == KeyEvent.ACTION_UP) {
+
+ SDLActivity.onNativeKeyUp(keyCode);
+ return true;
+ }
+ return super.sendKeyEvent(event);
+ }
+
+ @Override
+ public boolean commitText(CharSequence text, int newCursorPosition) {
+
+ nativeCommitText(text.toString(), newCursorPosition);
+
+ return super.commitText(text, newCursorPosition);
+ }
+
+ @Override
+ public boolean setComposingText(CharSequence text, int newCursorPosition) {
+
+ nativeSetComposingText(text.toString(), newCursorPosition);
+
+ return super.setComposingText(text, newCursorPosition);
+ }
+
+ public native void nativeCommitText(String text, int newCursorPosition);
+
+ public native void nativeSetComposingText(String text, int newCursorPosition);
+
+ @Override
+ public boolean deleteSurroundingText(int beforeLength, int afterLength) {
+ // Workaround to capture backspace key. Ref: http://stackoverflow.com/questions/14560344/android-backspace-in-webview-baseinputconnection
+ if (beforeLength == 1 && afterLength == 0) {
+ // backspace
+ return super.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL))
+ && super.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DEL));
+ }
+
+ return super.deleteSurroundingText(beforeLength, afterLength);
+ }
+}
+
+/* A null joystick handler for API level < 12 devices (the accelerometer is handled separately) */
+class SDLJoystickHandler {
+
+ /**
+ * Handles given MotionEvent.
+ * @param event the event to be handled.
+ * @return if given event was processed.
+ */
+ public boolean handleMotionEvent(MotionEvent event) {
+ return false;
+ }
+
+ /**
+ * Handles adding and removing of input devices.
+ */
+ public void pollInputDevices() {
+ }
+}
+
+/* Actual joystick functionality available for API >= 12 devices */
+class SDLJoystickHandler_API12 extends SDLJoystickHandler {
+
+ static class SDLJoystick {
+ public int device_id;
+ public String name;
+ public ArrayList<InputDevice.MotionRange> axes;
+ public ArrayList<InputDevice.MotionRange> hats;
+ }
+ static class RangeComparator implements Comparator<InputDevice.MotionRange> {
+ @Override
+ public int compare(InputDevice.MotionRange arg0, InputDevice.MotionRange arg1) {
+ return arg0.getAxis() - arg1.getAxis();
+ }
+ }
+
+ private ArrayList<SDLJoystick> mJoysticks;
+
+ public SDLJoystickHandler_API12() {
+
+ mJoysticks = new ArrayList<SDLJoystick>();
+ }
+
+ @Override
+ public void pollInputDevices() {
+ int[] deviceIds = InputDevice.getDeviceIds();
+ // It helps processing the device ids in reverse order
+ // For example, in the case of the XBox 360 wireless dongle,
+ // so the first controller seen by SDL matches what the receiver
+ // considers to be the first controller
+
+ for(int i=deviceIds.length-1; i>-1; i--) {
+ SDLJoystick joystick = getJoystick(deviceIds[i]);
+ if (joystick == null) {
+ joystick = new SDLJoystick();
+ InputDevice joystickDevice = InputDevice.getDevice(deviceIds[i]);
+
+ if (
+ (joystickDevice.getSources() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0
+ ||
+ (joystickDevice.getSources() & InputDevice.SOURCE_CLASS_BUTTON) != 0
+ )
+ {
+ joystick.device_id = deviceIds[i];
+ joystick.name = joystickDevice.getName();
+ joystick.axes = new ArrayList<InputDevice.MotionRange>();
+ joystick.hats = new ArrayList<InputDevice.MotionRange>();
+
+ List<InputDevice.MotionRange> ranges = joystickDevice.getMotionRanges();
+ Collections.sort(ranges, new RangeComparator());
+ for (InputDevice.MotionRange range : ranges ) {
+ if ((range.getSource() & InputDevice.SOURCE_CLASS_JOYSTICK) != 0 ) {
+ if (range.getAxis() == MotionEvent.AXIS_HAT_X ||
+ range.getAxis() == MotionEvent.AXIS_HAT_Y) {
+ joystick.hats.add(range);
+ }
+ else {
+ joystick.axes.add(range);
+ }
+ }
+ }
+
+ mJoysticks.add(joystick);
+ SDLActivity.nativeAddJoystick(joystick.device_id, joystick.name, 0, -1,
+ joystick.axes.size(), joystick.hats.size()/2, 0);
+ }
+ }
+ }
+
+ /* Check removed devices */
+ ArrayList<Integer> removedDevices = new ArrayList<Integer>();
+ for(int i=0; i < mJoysticks.size(); i++) {
+ int device_id = mJoysticks.get(i).device_id;
+ int j;
+ for (j=0; j < deviceIds.length; j++) {
+ if (device_id == deviceIds[j]) break;
+ }
+ if (j == deviceIds.length) {
+ removedDevices.add(Integer.valueOf(device_id));
+ }
+ }
+
+ for(int i=0; i < removedDevices.size(); i++) {
+ int device_id = removedDevices.get(i).intValue();
+ SDLActivity.nativeRemoveJoystick(device_id);
+ for (int j=0; j < mJoysticks.size(); j++) {
+ if (mJoysticks.get(j).device_id == device_id) {
+ mJoysticks.remove(j);
+ break;
+ }
+ }
+ }
+ }
+
+ protected SDLJoystick getJoystick(int device_id) {
+ for(int i=0; i < mJoysticks.size(); i++) {
+ if (mJoysticks.get(i).device_id == device_id) {
+ return mJoysticks.get(i);
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public boolean handleMotionEvent(MotionEvent event) {
+ if ( (event.getSource() & InputDevice.SOURCE_JOYSTICK) != 0) {
+ int actionPointerIndex = event.getActionIndex();
+ int action = event.getActionMasked();
+ switch(action) {
+ case MotionEvent.ACTION_MOVE:
+ SDLJoystick joystick = getJoystick(event.getDeviceId());
+ if ( joystick != null ) {
+ for (int i = 0; i < joystick.axes.size(); i++) {
+ InputDevice.MotionRange range = joystick.axes.get(i);
+ /* Normalize the value to -1...1 */
+ float value = ( event.getAxisValue( range.getAxis(), actionPointerIndex) - range.getMin() ) / range.getRange() * 2.0f - 1.0f;
+ SDLActivity.onNativeJoy(joystick.device_id, i, value );
+ }
+ for (int i = 0; i < joystick.hats.size(); i+=2) {
+ int hatX = Math.round(event.getAxisValue( joystick.hats.get(i).getAxis(), actionPointerIndex ) );
+ int hatY = Math.round(event.getAxisValue( joystick.hats.get(i+1).getAxis(), actionPointerIndex ) );
+ SDLActivity.onNativeHat(joystick.device_id, i/2, hatX, hatY );
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ return true;
+ }
+}
+
+class SDLGenericMotionListener_API12 implements View.OnGenericMotionListener {
+ // Generic Motion (mouse hover, joystick...) events go here
+ @Override
+ public boolean onGenericMotion(View v, MotionEvent event) {
+ float x, y;
+ int action;
+
+ switch ( event.getSource() ) {
+ case InputDevice.SOURCE_JOYSTICK:
+ case InputDevice.SOURCE_GAMEPAD:
+ case InputDevice.SOURCE_DPAD:
+ SDLActivity.handleJoystickMotionEvent(event);
+ return true;
+
+ case InputDevice.SOURCE_MOUSE:
+ action = event.getActionMasked();
+ switch (action) {
+ case MotionEvent.ACTION_SCROLL:
+ x = event.getAxisValue(MotionEvent.AXIS_HSCROLL, 0);
+ y = event.getAxisValue(MotionEvent.AXIS_VSCROLL, 0);
+ SDLActivity.onNativeMouse(0, action, x, y);
+ return true;
+
+ case MotionEvent.ACTION_HOVER_MOVE:
+ x = event.getX(0);
+ y = event.getY(0);
+
+ SDLActivity.onNativeMouse(0, action, x, y);
+ return true;
+
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ // Event was not managed
+ return false;
+ }
+}
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/src/org/love2d/android/DownloadActivity.java b/love2dToAPK/tools/tools/love-android-sdl2/src/org/love2d/android/DownloadActivity.java
new file mode 100644
index 0000000..6a65c75
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/src/org/love2d/android/DownloadActivity.java
@@ -0,0 +1,24 @@
+package org.love2d.android;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+
+public class DownloadActivity extends Activity {
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ Uri uri = this.getIntent().getData();
+
+ if (uri.getScheme().equals("http")) {
+ String url = uri.toString();
+ Intent intent = new Intent(this, DownloadService.class);
+ intent.putExtra("url", url);
+ startService(intent);
+ };
+
+ finish();
+ }
+ }
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/src/org/love2d/android/DownloadService.java b/love2dToAPK/tools/tools/love-android-sdl2/src/org/love2d/android/DownloadService.java
new file mode 100644
index 0000000..8bfd3fa
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/src/org/love2d/android/DownloadService.java
@@ -0,0 +1,96 @@
+package org.love2d.android;
+
+import java.util.List;
+
+import android.app.DownloadManager;
+import android.app.IntentService;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Environment;
+import android.util.Log;
+
+public class DownloadService extends IntentService {
+ public DownloadService() {
+ super("DownloadService");
+ }
+
+ @Override
+ public void onDestroy() {
+ Log.d("DownloadService", "destroying");
+ unregisterReceiver(downloadReceiver);
+ }
+
+ @Override
+ protected void onHandleIntent(Intent intent) {
+ Log.d ("DownloadService", "service started");
+
+ String url = intent.getStringExtra("url");
+ Uri uri = Uri.parse(url);
+
+ Log.d("DownloadService", "Downloading from url: " + url + "file = " + uri.getLastPathSegment());
+
+ DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
+ request.setDescription("LÖVE Game Download");
+ request.setTitle(uri.getLastPathSegment());
+ request.setMimeType ("application/x-love-game");
+
+ // in order for this if to run, you must use the android 3.2 to compile your app
+ if (Build.VERSION.SDK_INT >= 11) {
+ DownloadRequestSettings_API11 settings = new DownloadRequestSettings_API11();
+ settings.setup (request);
+ }
+ request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, uri.getLastPathSegment());
+ // get download service and enqueue file
+
+ Log.d("DownloadActivity", "creating manager");
+ DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
+ Log.d("DownloadActivity", "enqueuing download");
+ manager.enqueue(request);
+
+ Log.d("DownloadActivity", "download receiver = " + downloadReceiver);
+ IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
+ registerReceiver(downloadReceiver, intentFilter);
+ }
+
+ /**
+ * @param context used to check the device version and DownloadManager information
+ * @return true if the download manager is available
+ */
+ public static boolean isDownloadManagerAvailable(Context context) {
+ try {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD) {
+ return false;
+ }
+ Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.addCategory(Intent.CATEGORY_LAUNCHER);
+ intent.setClassName("com.android.providers.downloads.ui", "com.android.providers.downloads.ui.DownloadList");
+ List<ResolveInfo> list = context.getPackageManager().queryIntentActivities(intent,
+ PackageManager.MATCH_DEFAULT_ONLY);
+ return list.size() > 0;
+ } catch (Exception e) {
+ return false;
+ }
+ }
+
+ private BroadcastReceiver downloadReceiver = new BroadcastReceiver() {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Log.d("DownloadActivity", "downloadReceiver intent called");
+
+ }
+ };
+}
+
+class DownloadRequestSettings_API11 {
+ public static void setup (DownloadManager.Request request) {
+ request.allowScanningByMediaScanner();
+ request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
+ }
+}
diff --git a/love2dToAPK/tools/tools/love-android-sdl2/src/org/love2d/android/GameActivity.java b/love2dToAPK/tools/tools/love-android-sdl2/src/org/love2d/android/GameActivity.java
new file mode 100644
index 0000000..215fe83
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-android-sdl2/src/org/love2d/android/GameActivity.java
@@ -0,0 +1,253 @@
+package org.love2d.android;
+
+import org.libsdl.app.SDLActivity;
+
+import java.util.List;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+import android.app.Activity;
+import android.app.DownloadManager;
+import android.app.ProgressDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.Handler;
+import android.os.PowerManager;
+import android.os.ResultReceiver;
+import android.os.Vibrator;
+import android.util.Log;
+import android.util.DisplayMetrics;
+import android.widget.Toast;
+import android.view.*;
+import android.content.pm.PackageManager;
+
+public class GameActivity extends SDLActivity {
+ private static DisplayMetrics metrics = new DisplayMetrics();
+ private static String gamePath = "";
+ private static Context context;
+ private static Vibrator vibrator = null;
+ private static boolean immersiveActive = false;
+
+ @Override
+ protected String[] getLibraries() {
+ return new String[] {
+ "gnustl_shared",
+ "mpg123",
+ "openal",
+ "love",
+ };
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ Log.d("GameActivity", "started");
+
+ context = this.getApplicationContext();
+
+ String permission = "android.permission.VIBRATE";
+ int res = context.checkCallingOrSelfPermission(permission);
+ if (res == PackageManager.PERMISSION_GRANTED) {
+ vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
+ } else {
+ Log.d("GameActivity", "Vibration disabled: could not get vibration permission.");
+ }
+
+ handleIntent (this.getIntent());
+
+ super.onCreate(savedInstanceState);
+ getWindowManager().getDefaultDisplay().getMetrics(metrics);
+ }
+
+ @Override
+ protected void onNewIntent (Intent intent) {
+ Log.d("GameActivity", "onNewIntent() with " + intent);
+ handleIntent (intent);
+ resetNative();
+ startNative();
+ };
+
+ protected void handleIntent (Intent intent) {
+ Uri game = intent.getData();
+ if (game != null) {
+ if (game.getScheme().equals ("file")) {
+ Log.d("GameActivity", "Received intent with path: " + game.getPath());
+
+ // If we were given the path of a main.lua then use its
+ // directory. Otherwise use full path.
+ List<String> path_segments = game.getPathSegments();
+ if (path_segments.get(path_segments.size() - 1).equals("main.lua")) {
+ gamePath = game.getPath().substring(0, game.getPath().length() - "main.lua".length());
+ } else {
+ gamePath = game.getPath();
+ }
+ } else {
+ copyGameToCache (game);
+ }
+
+ Log.d("GameActivity", "new gamePath: " + gamePath);
+ }
+ };
+
+ @Override
+ protected void onDestroy() {
+ if (vibrator != null) {
+ Log.d("GameActivity", "Cancelling vibration");
+ vibrator.cancel();
+ }
+ super.onDestroy();
+ }
+
+ @Override
+ protected void onPause() {
+ if (vibrator != null) {
+ Log.d("GameActivity", "Cancelling vibration");
+ vibrator.cancel();
+ }
+ super.onPause();
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ if (immersiveActive) {
+ getWindow().getDecorView().setSystemUiVisibility(
+ View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+ | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+ | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+ | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
+ | View.SYSTEM_UI_FLAG_FULLSCREEN
+ | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
+ }
+ }
+
+ public void setImmersiveMode (boolean immersive_mode) {
+ if (android.os.Build.VERSION.SDK_INT < 11) {
+ // The API getWindow().getDecorView().setSystemUiVisibility() was
+ // added in Android 11 (a.k.a. Honeycomb, a.k.a. 3.0.x). If we run
+ // on this we do nothing.
+ return;
+ }
+
+ immersiveActive = immersive_mode;
+
+ final Object lock = new Object();
+ final boolean immersive_enabled = immersive_mode;
+ synchronized (lock) {
+ runOnUiThread (new Runnable() {
+ @Override
+ public void run() {
+ synchronized (lock) {
+ if (immersive_enabled) {
+ getWindow().getDecorView().setSystemUiVisibility(
+ View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+ | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+ | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+ | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
+ | View.SYSTEM_UI_FLAG_FULLSCREEN
+ | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
+ } else {
+ getWindow().getDecorView().setSystemUiVisibility(
+ View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+ | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+ );
+ }
+
+ lock.notify();
+ }
+ }
+ });
+ };
+ }
+
+ public boolean getImmersiveMode () {
+ return immersiveActive;
+ }
+
+ public static String getGamePath() {
+ Log.d ("GameActivity", "called getGamePath(), game path = " + gamePath);
+ return gamePath;
+ }
+
+ public static DisplayMetrics getMetrics() {
+ return metrics;
+ }
+
+ public static void vibrate (double seconds) {
+ if (vibrator != null) {
+ vibrator.vibrate((long) (seconds * 1000.));
+ }
+ }
+
+ public static void openURL (String url) {
+ Log.d ("GameActivity", "opening url = " + url);
+ Intent i = new Intent(Intent.ACTION_VIEW);
+ i.setData(Uri.parse(url));
+ i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ context.startActivity(i);
+ }
+
+ void copyGameToCache (Uri sourceuri)
+ {
+ String destinationFilename = this.getCacheDir().getPath()+"/downloaded.love";
+ gamePath = destinationFilename;
+
+ BufferedOutputStream bos = null;
+ try {
+ bos = new BufferedOutputStream(new FileOutputStream(destinationFilename, false));
+ } catch (IOException e) {
+ Log.d ("GameActivity", "Could not open destination file:" + e.getMessage());
+ }
+
+ int chunk_read = 0;
+ int bytes_written = 0;
+
+ BufferedInputStream bis = null;
+ if (sourceuri.getScheme().equals("content")) {
+ try {
+ bis = new BufferedInputStream(getContentResolver().openInputStream(sourceuri));
+ } catch (IOException e) {
+ Log.d ("GameActivity", "Could not open game file:" + e.getMessage());
+ }
+ } else {
+ Log.d ("GameActivity", "Unsupported scheme: " + sourceuri.getScheme());
+ }
+
+ if (bis != null) {
+ // actual copying
+ try {
+ byte[] buf = new byte[1024];
+ chunk_read = bis.read(buf);
+ do {
+ bos.write(buf, 0, chunk_read);
+ bytes_written += chunk_read;
+ chunk_read = bis.read(buf);
+ } while(chunk_read != -1);
+ } catch (IOException e) {
+ Log.d ("GameActivity", "Copying failed:" + e.getMessage());
+ }
+ }
+
+ // close streams
+ try {
+ if (bis != null) bis.close();
+ if (bos != null) bos.close();
+ } catch (IOException e) {
+ Log.d ("GameActivity", "Copying failed: " + e.getMessage());
+ }
+
+ Log.d("GameActivity", "Copied " + bytes_written + " bytes");
+ }
+}
diff --git a/love2dToAPK/tools/tools/love-old-win/DevIL.dll b/love2dToAPK/tools/tools/love-old-win/DevIL.dll
new file mode 100644
index 0000000..063de68
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-old-win/DevIL.dll
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-old-win/OpenAL32.dll b/love2dToAPK/tools/tools/love-old-win/OpenAL32.dll
new file mode 100644
index 0000000..2f44e32
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-old-win/OpenAL32.dll
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-old-win/SDL2.dll b/love2dToAPK/tools/tools/love-old-win/SDL2.dll
new file mode 100644
index 0000000..9913c55
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-old-win/SDL2.dll
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-old-win/changes.txt b/love2dToAPK/tools/tools/love-old-win/changes.txt
new file mode 100644
index 0000000..71e796f
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-old-win/changes.txt
@@ -0,0 +1,831 @@
+LOVE 0.9.2 [Baby Inspector]
+---------------------------
+
+ Released: 2015-02-14
+
+ * Added Lua 5.3's UTF-8 module (via utf8 = require("utf8")).
+ * Added Shader:getExternVariable.
+ * Added several new canvas texture formats.
+ * Added love.graphics.getCanvasFormats.
+ * Added love.graphics.getCompressedImageFormats.
+ * Added ParticleSystem:setQuads.
+ * Added ParticleSystem:setLinearDamping.
+ * Added SpriteBatch:flush.
+ * Added love.graphics.getStats.
+ * Added "mirroredrepeat" wrap mode.
+ * Added love.audio.setDopplerScale and love.audio.getDopplerScale.
+ * Added optional duration argument to Joystick:setVibration.
+ * Added love.joystick.loadGamepadMappings and love.joystick.saveGamepadMappings.
+ * Added Joint:setUserData and Joint:getUserData.
+ * Added Joint:getBodies.
+ * Added GearJoint:getJoints.
+ * Added Contact:getFixtures and Body:getContactList.
+ * Added Body:getWorld.
+ * Added Body:getJointList.
+ * Added Body/Contact/Fixture/Joint/World:isDestroyed.
+ * Added love.mousemoved event callback.
+ * Added love.mouse.setRelativeMode and love.mouse.getRelativeMode.
+ * Added Scancode enums, love.keyboard.getKeyFromScancode, and love.keyboard.getScancodeFromKey.
+ * Added love.window.getDisplayName.
+ * Added love.window.minimize.
+ * Added love.window.maximize.
+ * Added love.window.showMessageBox.
+ * Added 'refreshrate' field to the table returned by love.window.getMode.
+ * Added love.window.toPixels and love.window.fromPixels.
+ * Added love.window.setPosition and love.window.getPosition, and 'x' and 'y' fields to love.window.setMode and t.window in love.conf.
+ * Added love.filesystem.isSymlink, love.filesystem.setSymlinksEnabled, and love.filesystem.areSymlinksEnabled.
+ * Added love.filesystem.getRealDirectory.
+
+ * Deprecated SpriteBatch:bind and SpriteBatch:unbind.
+ * Deprecated all uses of the name 'FSAA' in favor of 'MSAA'.
+ * Deprecated the 'hdrcanvas' graphics feature enum in favor of getCanvasFormats.
+ * Deprecated the 'dxt' and 'bc5' graphics feature enums in favor of getCompressedImageFormats.
+
+ * Fixed crashes when love objects are used in multiple threads.
+ * Fixed love.filesystem.setIdentity breaking in some situations when called multiple times.
+ * Fixed the default love.filesystem identity when in Fused mode in Windows.
+ * Fixed love.system.openURL sometimes blocking indefinitely on Linux.
+ * Fixed love.joystick.setGamepadMapping.
+ * Fixed the order of vertices in ChainShapes.
+ * Fixed love.mouse.getPosition returning outdated values if love.mouse.setPosition is used in the same frame.
+ * Fixed love.graphics.newFont to error when given an invalid size argument.
+ * Fixed the filename and backtrace given when love.graphics.print errors.
+ * Fixed a small memory leak if love.graphics.newCanvas errors.
+ * Fixed shader:getWarnings returning unnecessary information.
+ * Fixed some cases of noncompliant shader code not properly erroring on some nvidia drivers.
+ * Fixed a potential crash when Shader objects are garbage collected.
+ * Fixed a potential small memory leak triggered when love.graphics.newShader errors.
+ * Fixed love.graphics.newMesh(vertexcount, ...) causing the Mesh to do instanced rendering.
+ * Fixed Mesh:getVertexMap.
+ * Fixed Image:refresh generating mipmaps multiple times if mipmap filtering is enabled.
+ * Fixed Image:setMipmapFilter to not keep bad state around if it errors.
+ * Fixed Mesh:setDrawRange when the Mesh has a vertex map set.
+ * Fixed internal detection of the 'position' and 'effect' shader functions.
+ * Fixed Texture memory leak when Meshes are garbage collected.
+ * Fixed the default line join mode to be 'miter' instead of an undefined value.
+ * Fixed the default error handler text size when highdpi mode is enabled on a Retina monitor.
+ * Fixed the default error handler background color when sRGB mode is enabled for the window.
+ * Fixed love.window.setMode to fall back to the largest available mode if a width or height greater than the largest supported is specified and fullscreen is used.
+ * Fixed the state of wireframe mode when love.window.setMode is called.
+ * Fixed Canvas:getPixel to error if the coordinates are not within the Canvas' size.
+ * Fixed detection of compressed textures to work regardless of the file's extension.
+
+ * Renamed all cases of FSAA to MSAA. The FSAA names still exist for backward-compatibility.
+
+ * Updated the Windows executable to automatically prefer the higher performance GPU on nvidia Optimus systems.
+ * Updated the --console command-line argument in Windows to open the console before conf.lua is loaded.
+ * Updated t.console and the --console command-line argument in Windows to use the existing Console window, if love was launched from one.
+ * Updated the love executable to verify that the love library's version matches.
+ * Updated the Lua wrapper code for modules to avoid crashes when the module's instance is created, deleted, and recreated.
+ * Updated internal code for handling garbage collection of love objects to be more efficient.
+ * Updated love's initialization code to trigger a Lua error if love.conf has an error in it.
+ * Updated the paths returned by love.filesystem.getSaveDirectory and friends to strip double-slashes from the string.
+ * Updated the error message when love.filesystem.write or File:open fails because the directory doesn't exist.
+ * Updated the error message when love.math.setRandomseed(0) is attempted.
+ * Updated the error message when invalid UTF-8 strings are used in love functions that expect UTF-8.
+ * Updated love.physics.newPolygonShape and love.physics.newChainShape to accept a table of vertices.
+ * Updated love.physics.newChainShape to error if the number of arguments is invalid.
+ * Updated love.thread.newThread to accept a literal string of code directly.
+ * Updated love-created threads to use names visible in external debuggers.
+ * Updated SpriteBatch:unbind to use less VRAM if the SpriteBatch has the static usage hint.
+ * Updated love.graphics.newImage, love.image.newImageData, etc. to leave less Lua-owned memory around.
+ * Updated love.graphics.push to accept different stack types to push. Current types are "transform" and "all".
+ * Updated love shaders to accept GLSL ES precision qualifiers on variables, although they do nothing.
+ * Updated the error message for love.graphics.newShader to be less cryptic if an invalid filename is given.
+ * Updated compressed texture loading code to allow BC6 and BC7 compressed textures (if the graphics driver supports them.)
+
+LOVE 0.9.1 [Baby Inspector]
+---------------------------
+
+ Released: 2014-04-01
+
+ * Added Source:clone.
+ * Added blend mode "screen".
+ * Added ParticleSystem:clone.
+ * Added ParticleSystem:moveTo, has smoother emitter movement compared to setPosition.
+ * Added ParticleSystem:setRelativeRotation.
+ * Added love.graphics.setWireframe for debugging.
+ * Added Mesh:setDrawRange and Mesh:getDrawRange.
+ * Added CircleShape:getPoint and CircleShape:setPoint.
+ * Added Mesh/SpriteBatch/ParticleSystem:setTexture, accepts Canvases and Images.
+ * Added high-dpi window support for Retina displays in OS X, via the 'highdpi' window flag.
+ * Added love.window.getPixelScale.
+ * Added love.graphics.getSystemLimit.
+ * Added antialiasing support to Canvases.
+ * Added Canvas:getFSAA.
+ * Added 'love_ScreenSize' built-in variable in shaders.
+ * Added love.getVersion.
+ * Added support for gamma-correct rendering.
+ * Added love.graphics.isSupported("srgb").
+ * Added love.math.gammaToLinear and love.math.linearToGamma.
+ * Added RandomGenerator:getState and RandomGenerator:setState.
+ * Added Body:setUserData and Body:getUserData.
+ * Added some missing obscure key constants.
+ * Added optional callback function argument to love.filesystem.getDirectoryItems.
+ * Added love.system.openURL.
+
+ * Deprecated Mesh/SpriteBatch/ParticleSystem:setImage.
+ * Deprecated love.graphics.getMaxImageSize and love.graphics.getMaxPointSize.
+
+ * Fixed love.graphics.scale with negative values causing incorrect line widths.
+ * Fixed Joystick:isDown using 0-based button index arguments.
+ * Fixed Source:setPitch to error when infinity or NaN is given.
+ * Fixed love.graphics.setCanvas() to restore the proper viewport and scissor rectangles.
+ * Fixed TrueType font glyphs which request a monochrome bitmap pixel mode.
+ * Fixed love.graphics.reset causing crashes when called in between love.graphics.push/pop.
+ * Fixed tab characters ("\t") to display properly with love.graphics.print.
+ * Fixed love.graphics.isCreated to return false when love.window.setMode fails completely.
+ * Fixed love.window.setMode to not destroy OpenGL resources before checking whether a fullsceren size is supported.
+ * Fixed World:getBodyList and World:getJointList causing hard crashes.
+ * Fixed loading BC4 compressed textures.
+ * Fixed SoundData objects being initialized with garbage values.
+ * Fixed 8-bit SoundData samples when used in love.audio Sources.
+
+ * Updated the error text for love.filesystem’s module searchers when require fails.
+ * Updated the love.filesystem module searchers to be tried after package.preload instead of before.
+ * Updated love.graphics.newParticleSystem, newSpriteBatch, and newMesh to accept Canvases.
+ * Updated Canvas drawing code, texture coordinates are no longer flipped vertically.
+ * Updated Canvas:renderTo to work properly if a Canvas is currently active.
+ * Updated ParticleSystem:setEmissionRate to accept non-integer numbers.
+ * Updated Source:play to return a boolean indicating success.
+ * Updated t.console in conf.lua to create the console before modules are loaded in Windows.
+ * Updated Mesh vertex maps (index buffers) to use less space in VRAM.
+ * Updated love.graphics.newMesh and Mesh:setVertices to default the UV parameters to 0,0.
+ * Updated Fixture:set/getUserData to work in Coroutines.
+ * Updated fullscreen-desktop and resizable window modes in OS X to use Mac OS 10.7's fullscreen Spaces.
+ * Updated love.filesystem's C library loader to look in paths added via love.filesystem.mount, in Fused mode.
+ * Updated the default love.run code to make initial love.math.random calls more random.
+
+LOVE 0.9.0 [Baby Inspector]
+---------------------------
+
+ Released: 2013-12-13
+
+ * Added better multiplayer networking support via ENet.
+ * Added --fused command line argument, to simulate fusing.
+ * Added liblove.
+ * Added the ability to have exit values.
+ * Added exit value of 1 in case of error by default.
+ * Added basic support for the file:// uri scheme.
+ * Added love.filesystem.isFused.
+ * Added love.filesystem.getIdentity.
+ * Added love.filesystem.append.
+ * Added love.filesystem.getSize.
+ * Added love.filesystem.mount and love.filesystem.unmount.
+ * Added optional file search order parameter to love.filesystem.setIdentity.
+ * Added File:isOpen and File:getMode.
+ * Added Fie:setBuffer, File:getBuffer, and File:flush.
+ * Added textinput event for unicode text input.
+ * Added love.keyboard.setTextInput and love.keyboard.hasTextInput.
+ * Added previously internal Rasterizer and GlyphData object methods.
+ * Added support for UTF-8 ImageFonts.
+ * Added Font:getAscent/getDescent/getBaseline.
+ * Added Font:setFilter/getFilter.
+ * Added Font:hasGlyphs.
+ * Added angle, scale, and shear parameters to love.graphics.printf.
+ * Added HDR canvas support.
+ * Added mipmapping support (has isSupported test).
+ * Added vertex shader support.
+ * Added boolean support to Shader:send.
+ * Added Canvas:getPixel.
+ * Added blend mode "replace".
+ * Added line join modes.
+ * Added Mesh objects, allowing for arbitrary textured polygons.
+ * Added multiple render target support to love.graphics.setCanvas.
+ * Added love.graphics.setColorMask.
+ * Added love.graphics.origin.
+ * Added love.graphics.getRendererInfo.
+ * Added love.graphics.getMaxImageSize.
+ * Added SpriteBatch:getCount and SpriteBatch:getBufferSize.
+ * Added SpriteBatch:getColor.
+ * Added ParticleSystem:emit.
+ * Added ParticleSystem:setInsertMode and ParticleSystem:getInsertMode.
+ * Added many ParticleSystem getter methods.
+ * Added DXT compressed texture support via love.image.newCompressedData.
+ * Added love.image.isCompressed and Image:isCompressed.
+ * Added Image/Canvas/ImageData:getDimensions.
+ * Added anisotropic filtering support for Images, Canvases, and Fonts.
+ * Added Image:refresh.
+ * Added Image:getData.
+ * Added SoundData:getDuration and SoundData:getSampleCount.
+ * Added Source:isPlaying.
+ * Added Source:setRelative and Source:isRelative.
+ * Added Source:setCone and Source:getCone.
+ * Added Source:getChannels.
+ * Added new Channels API for love.thread.
+ * Added limited table support to Channel:push.
+ * Added Thread:getError.
+ * Added Thread:isRunning.
+ * Added threaderror event.
+ * Added love.math module.
+ * Added a platform-independent (good) random implementation to love.math.
+ * Added RandomGenerator objects.
+ * Added BezierCurve objects.
+ * Added love.math.triangulate and love.math.isConvex.
+ * Added love.math.noise.
+ * Added love.timer.getAverageDelta.
+ * Added Data:getString.
+ * Added Contact:getChildren.
+ * Added love.system module.
+ * Added love.system.getClipboardText and love.system.setClipboardText.
+ * Added love.system.getOS and love.system.getProcessorCount.
+ * Added love.window module.
+ * Added love.window.isVisible.
+ * Added flags to love.window.setMode.
+ * Added monitor choosing support to love.window.setMode.
+ * Added support for resizable, borderless, and non-centered windows.
+ * Added support for "fullscreen-desktop" mode.
+ * Added window resize and visible events.
+ * Added love.window.getDimensions.
+ * Added love.window.getIcon.
+ * Added t.window.icon to love.conf.
+ * Added love.mousefocus and love.window.hasMouseFocus.
+ * Added custom hardware cursors via love.mouse.newCursor.
+ * Added love.mouse.setX/setY.
+ * Added Joystick objects.
+ * Added love.joystick.getJoystick.
+ * Added joystick connect and disconnect events.
+ * Added joystickaxis and joystickhat events.
+ * Added unified Gamepad API for joysticks which have a similar layout to the Xbox controller.
+ * Added joystick vibration support, works with most common gamepads.
+ * OPTIONAL: Added support for Game Music Emu.
+
+ * Fixed fused mode in OS X.
+ * Fixed printing to the console in Windows before love.load is called.
+ * Fixed the default love.run to not include the time taken by love.load in the first frame's dt.
+ * Fixed the error screen not always appearing until the next input event.
+ * Fixed love.event.clear.
+ * Fixed love.mouse.setPosition when called in love.load.
+ * Fixed scaling in several love.physics functions.
+ * Fixed Box2D exception in World:update.
+ * Fixed many uncaught Box2D / love.physics exceptions for Bodies and Joints.
+ * Fixed ChainShape:getPoints running out of Lua stack space and crashing.
+ * Fixed File:read reading past end of file.
+ * Fixed love.filesystem.setIdentity not removing read access from old directories.
+ * Fixed possible memory leak in utf-8 decoder.
+ * Fixed spacing for the last character in an ImageFont.
+ * Fixed line wrapping in love.graphics.printf.
+ * Fixed love.graphics.printf to error if the wrap limit is negative.
+ * Fixed love.graphics.print truncating strings with embedded zeros.
+ * Fixed crashes with font drawing on some ATI cards.
+ * Fixed artifacts when drawing lines at huge scale.
+ * Fixed Fonts and Canvases ignoring default image filter.
+ * Fixed scissor boxes when a canvas is set after love.graphics.setScissor is called.
+ * Fixed love.graphics.getLineWidth returning incorrect values.
+ * Fixed love.graphics.getColor on some Windows systems.
+ * Fixed alpha blend mode.
+ * Fixed multiplicative blend mode.
+ * Fixed love.graphics.getPointStyle.
+ * Fixed line numbers in shader errors.
+ * Fixed Shader:send with Images and Canvases failing sometimes.
+ * Fixed Shader:send to keep a reference to sent Images and Canvases.
+ * Fixed crash when binding SpriteBatches multiple times.
+ * Fixed SpriteBatches with more than 16,384 sprites.
+ * Fixed particle draw order for ParticleSystems.
+ * Fixed ParticleSystem:setSizes resetting the size variation.
+ * Fixed the graphics viewport not matching the window size when using an unsupported fullscreen mode.
+ * Fixed getMode and friends returning wrong values when using desktop size.
+ * Fixed keyrepeat settings being lost after (indirect) setMode.
+ * Fixed the icon being reset after setMode.
+ * Fixed memory leak in the mp3 decoder.
+ * Fixed sound issues with some versions of OpenAL soft, by enabling direct channels.
+ * Fixed 'random' hangs in audio.
+ * Fixed love.sound.newDecoder not accepting FileData.
+ * Fixed case (in)sensitivity of sound file extension parsing.
+ * Fixed looping support in tracker music formats.
+ * Fixed skipping/looping issues when playing streaming audio Sources.
+ * Fixed race condition in Source:play.
+ * Fixed WAVE sound playback.
+
+ * Moved love's startup to modules/love.
+ * Moved window-related functions from love.graphics to love.window.
+
+ * Renamed love's boot script to 'love.boot', which can be required.
+ * Renamed love.filesystem.mkdir to love.filesystem.createDirectory.
+ * Renamed love.filesystem.enumerate to love.filesystem.getDirectoryItems.
+ * Renamed World:setAllowSleeping to World:setSleepingAllowed.
+ * Renamed ChainShape:setPrevVertex to ChainShape:setPreviousVertex.
+ * Renamed Joint:enableMotor to Joint:setMotorEnabled.
+ * Renamed Joint:enableLimit and Joint:isLimitEnabled to Joint:setLimitsEnabled and Joint:hasLimitsEnabled.
+ * Renamed t.screen to t.window in love.conf.
+ * Renamed love.graphics.setCaption to love.window.setTitle.
+ * Renamed PixelEffect to Shader (but now with vertex shaders).
+ * Renamed love.graphics.setDefaultImageFilter to love.graphics.setDefaultFilter.
+ * Renamed ParticleSystem:setSprite to ParticleSystem:setImage.
+ * Renamed ParticleSystem:setGravity to ParticleSystem:setLinearAcceleration.
+ * Renamed ParticleSystem:setLifetime/setParticleLife to setEmitter/ParticleLifetime.
+ * Renamed ParticleSystem:count and all getNum* functions to get*Count.
+ * Renamed Source:setDistance to Source:setAttenuationDistances.
+ * Renamed SoundData:getBits and Decoder:getBits to SoundData:getBitDepth and Decoder:getBitDepth.
+ * Renamed love.mouse.setGrab to love.mouse.setGrabbed.
+
+ * Removed release mode.
+ * Removed love.keyboard.getKeyRepeat (see love.keyboard.hasKeyRepeat).
+ * Removed the unicode argument from love.keypressed (see love.textinput).
+ * Removed love.graphics.drawTest.
+ * Removed love.graphics.quad/triangle.
+ * Removed love.graphics.setColorMode.
+ * Removed love.graphics.newStencil.
+ * Removed love.graphics.setLine/setPoint.
+ * Removed love.graphics.drawq (functionality is merged into love.graphics.draw).
+ * Removed SpriteBatch:addq/setq (functionality is merged into SpriteBatch:add/set).
+ * Removed Quad:flip.
+ * Removed ParticleSystem:isFull/isEmpty.
+ * Removed ParticleSystem:getX/getY.
+ * Removed love.graphics.checkMode.
+ * Removed love.joystick.open and friends.
+ * Removed love.joystick module functions which operated on individual joysticks (see Joystick objects).
+ * Removed joystick ball support.
+ * Removed thread names.
+ * Removed old thread messaging API (see Channels).
+ * Removed love.timer.getMicroTime.
+
+ * Updated functions which return love objects to re-use the Lua-side object instead of always recreating it.
+ * Updated the windows console, it now tries to re-use an active one first.
+ * Updated error handling, error handlers now get resolved when the error occurs.
+ * Updated order of sleep/present in love.run (now draws, *then* sleeps).
+ * Updated love.filesystem to try to create the appdata directory if it doesn't exist yet.
+ * Updated the default filesystem identity to omit file extension.
+ * Updated love.filesystem.newFile to optionally open the file.
+ * Updated most love.filesystem functions to return nil, error on internal failure.
+ * Updated love.keyboard.setKeyRepeat to take a boolean argument instead of numbers.
+ * Updated love.keypressed's second argument to be a boolean indicating key repeat.
+ * Updated keyboard key constants for some more modern keyboard keys.
+ * Updated window code to use adaptive vsync when available, if vsync is enabled.
+ * updated love.graphics.print's x and y arguments to default to 0.
+ * Updated the setFilter and setWrap methods, the second argument is now optional.
+ * Updated Font and ParticleSystem rendering code, now more performant.
+ * Updated SpriteBatch code, now more performant when adding/setting and (un)binding.
+ * Updated Canvas code to support more systems.
+ * Updated Canvas:getImageData and love.graphics.newScreenshot to be more efficient.
+ * Updated love.graphics.newScreenshot to create a fully opaque image by default.
+ * Updated error messages when sending bad values to Shaders.
+ * Updated love.graphics.newParticleSystem to have a default buffer size of 1000.
+ * Updated ImageData:setPixel to accept a table and default to 255 alpha.
+ * Updated ImageData:mapPixel, is now more efficient and accepts optional x,y,w,h arguments.
+ * Updated love.image memory handling, improves errors and thread-safety.
+ * Updated all love object constructors to optionally accept FileData if they accept a filename.
+ * Updated allocation for SoundData, it's more efficient and less wasteful.
+ * Updated SoundData:set/getSample to error for invalid samples.
+ * Updated Source:set* functions to default z to 0.
+ * Updated Source:seek to error for negative offsets.
+ * Updated Thread:start to accept arguments which get passed to the thread.
+ * Updated love.timer.getFPS to be microsecond-accurate.
+ * Updated love.timer.getTime to be microsecond-accurate and monotonic.
+ * Updated Box2D to version 2.3.0.
+
+LOVE 0.8.0 [Rubber Piggy]
+-------------------------
+
+ Released: 2012-04-02
+
+ * Added release error screen.
+ * Added alpha to love.graphics.setBackgroundColor.
+ * Added Canvas:clear(r, g, b, a).
+ * Added Canvas support to love.graphics.drawq.
+ * Added Canvas:getWidth and Canvas:getHeight.
+ * Added love.graphics.arc.
+ * Added seek and tell to Source objects.
+ * Added color interpolation to ParticleSystem.
+ * Added automatic PO2 padding for systems not supporting the OpenGL extension.
+ * Added UTF-8 support for fonts.
+ * Added Box2D error handling for some commonly failing functions.
+ * Added ability for fused release games to have their write dir in appdata.
+ * Added shear transformation to drawing functions.
+ * Added origin to font printing.
+ * Added love.graphics.getMode.
+ * Added per-sprite colors on SpriteBatches.
+ * Added PixelEffects.
+ * Added love.graphics.isSupported.
+ * Added love.graphics.getCanvas.
+ * Added love.event.quit.
+ * Added stencil masks.
+ * Added alternative SpriteBatch provider, it should work everywhere now.
+ * Added a loader for binary modules.
+ * Added Thread:getKeys.
+ * Added option of fractions for Quads.
+ * Added PNG, JPEG and GIF support to ImageData:encode.
+ * Added 64-bit support for Mac OS X.
+ * Added premultiplied blending mode.
+ * Added functions to set/get default image filter modes.
+ * Added SpriteBatch:set.
+ * Added new events system, with support for custom events and long event names.
+ * Added sound attenuation by distance.
+ * Added SpriteBatch:getImage.
+ * Added combine color mode.
+ * Added automatic random seeding to love.run.
+ * Added support for the subtract BlendMode on older graphics cards.
+ * Added love._os field, which contains the OS the game is running on.
+
+ * Fixed wrapping for single words.
+ * Fixed tracebacks not showing filenames.
+ * Fixed love.graphics.push/pop capable of causing overflows/underflows.
+ * Fixed setScissor on Canvases.
+ * Fixed several issues with audio, e.g. clicks and pops in mp3s.
+ * Fixed crashes when bodies were destroyed during collisions.
+ * Fixed bound SpriteBatches corrupting when drawing.
+ * Fixed thread-safety issues with ImageData.
+ * Fixed memory leaks in audio sources.
+ * Fixed thread's set (previously send) accidentally changing the type.
+ * Fixed SoundData allocating the wrong number of samples.
+ * Fixed SpriteBatch support on Intel cards.
+ * Fixed love.filesystem.lines() leaking.
+ * Fixed most leaking on unclosed File objects.
+ * Fixed crashes when operating on non-existent files.
+ * Fixed a bug where empty files on windows would never reach eof.
+ * Fixed crash when SoundData runs out of memory.
+ * Fixed ordering of loaders, love should have priority over lua.
+ * Fixed several miscellaneous memory leaks.
+ * Fixed a few cases where strings with \0 in them would not be stored correctly.
+ * Fixed love's startup time being in the first dt.
+ * Fixed internal string conversions, they are faster now.
+ * Fixed (bad) performance of ImageData:paste.
+ * Fixed love.graphics.toggleFullscreen not maintaining graphics state.
+
+ * Renamed SpriteBatch's lock/unlock to bind/unbind.
+ * Renamed Framebuffer to Canvas.
+ * Renamed love.thread.send/receive to set/get.
+ * Renamed love.graphics.setRenderTarget to setCanvas.
+
+ * Removed canvas auto-clearing.
+ * Removed EncodedImageData.
+ * Removed old syntax for require (with extension).
+ * Removed love.graphics.setFont([file], [size]).
+ * Removed Thread:kill.
+
+ * Updated love.joystick to be 1-indexed.
+ * Updated Sources to update more cleanly and control more intuitively.
+ * Updated font engine.
+ * Updated line drawing to a custom system.
+ * Updated love.timer.sleep to use seconds, like the rest of love.
+ * Updated love.timer to be more accurate.
+ * Updated love.graphics.circle to have max(10, r) as default for segments.
+ * Updated ImageData:encode to write to files directly.
+ * Updated version compatibility system to actually do something.
+ * Updated love.run's order, events are checked just before update.
+ * Updated Box2D to version 2.2.1.
+
+LOVE 0.7.2 [Game Slave]
+-----------------------
+
+ Released: 2011-05-04
+
+ * Added Framebuffer:get/setWrap.
+ * Added love.event.clear.
+ * Added support for any number of arguments to love.keyboard.isDown, love.mouse.isDown and love.joystick.isDown.
+ * Added SpriteBatch:setImage().
+
+ * Fixed fused games not working.
+ * Fixed ParticleSystem:setSize ignoring the variation argument.
+ * Fixed some file-opening exceptions not being caught.
+ * Fixed files loaded by libmodplug being too loud.
+ * Fixed paths with periods in them not working.
+ * Fixed love.graphics.getBlendMode not detecting subtractive and multiplicative blend modes.
+ * Fixed crash when there was no memory available for newImageData(w, h).
+
+ * Updated PhysicsFS version to 2.0.2 on Windows
+ * Updated OpenAL Soft version to 1.13 on Windows
+ * Updated libmodplug version to 0.8.8.1 on Windows
+ * Updated FreeType version to 2.4.4 on Windows
+ * Updated libmpg123 version to 1.13.2 on Windows
+ * Windows binary no longer depends on VC2005 runtime.
+ * Windows binary no longer depends on SSE2 support.
+
+LOVE 0.7.1 [Game Slave]
+-----------------------
+
+ Released: 2011-02-14
+
+ * Added source:isPaused()
+ * Added error when initial window can't be created.
+ * Added framebuffer filter modes.
+ * Added love.filesystem.getLastModified.
+ * Added filter modes for ImageFonts.
+ * Added dead key support by using "unknown" key with correct unicode value.
+ * Added 0 width and height in love.conf. (for current desktop resolution)
+ * Added alpha support when encoding TGA images.
+
+ * Fixed a lot of bugs regarding zero characters in threads.
+ * Fixed handling of a directory named "love" in current directory.
+ * Fixed a few unhandled errors in setScissor.
+ * Fixed a bug where old physics callbacks were never dereferenced.
+ * Fixed loss of mouse visibility settings on setMode.
+ * Fixed creation of a framebuffer unbinding current framebuffer.
+ * Fixed several race conditions in love.thread.
+ * Fixed 'love .', so it won't use lovedir/. as save dir.
+ * Fixed setLineHeight.
+ * Fixed extended ascii and ImageFonts.
+ * Fixed printf's line wrapping.
+ * Fixed crash when playing sounds.
+ * Fixed playback of mp3s with arbitrary sample rates.
+ * Fixed handling of negative indices in love.joystick.
+ * Fixed toggleFullscreen.
+ * Fixed unexpected behaviour with hash tables to love.graphics.line.
+ * Fixed mouse coordinates being capped after setMode.
+ * Fixed setFont's error handling on a non-existant file.
+ * Fixed issue where Windows builds would hard crash on Lua errors
+
+ * Removed custom sample rates for Decoders.
+
+LOVE 0.7.0 [Game Slave]
+-----------------------
+
+ Released: 2010-12-05
+
+ * Added love.thread.
+ * Added love.font.
+ * Added love.graphics.Framebuffer.
+ * Added Source:play, Source:pause, etc.
+ * Added Source:isStatic().
+ * Added get/setPosition, get/setVelocity, and get/setDirection to Source.
+ * Added get/setGroupIndex to CircleShape and PolygonShape.
+ * Added Font:getWrap.
+ * Added identity field to love.conf.
+ * Added love.quit callback.
+ * Added love.focus callback.
+ * Added extra meter parameter to love.physics.newWorld.
+ * Added love.graphics.setIcon.
+ * Added way to make the window desktop resolution.
+ * Added subtractive and multiplicative blend modes.
+ * Added body:getAllowSleeping.
+ * Added shape:getBody.
+ * Added love.filesystem.FileData for public usage.
+ * Added base64 support for love.filesystem.FileData.
+ * Added table support for love.graphics.setColor and love.graphics.setBackgroundColor.
+ * Added love.graphics.hasFocus().
+ * Added ?/init.lua to the loader.
+
+ * Fixed the debug module not being an upvalue of the error handlers. (you can now override debug)
+ * Fixed some cases when love.audio.pause and friends, were acting on everything, not just the passed Source.
+ * Fixed setFixedRotation enabling other flags.
+ * Fixed a bug in the loader (for require).
+ * Fixed ParticleSystem::setSprite not retaining the new image.
+ * Fixed setMode removing images settings (wrapping, filters).
+ * Fixed shape:getBody, it's now exposed for LÖVE usage.
+ * Fixed DistanceJoint:getType() returning "circle" - it now returns "distance".
+ * Fixed SpriteBatches being unaffected by setColor
+ * Fixed the audio bug.
+ * Fixed invalid FSAA values crashing LÖVE.
+ * Fixed a bunch of compiler warnings.
+ * Fixed OS X not properly using UTIs for .love files.
+ * Fixed the modplug decoder not properly handeling files that fail to load.
+ * Fixed a memory leak in setFont.
+ * Fixed bug where errors in threads wouldn't get picked up by demand.
+ * Fixed part of the bug with newlines when scaling text (rotating still messes up the lines).
+ * Fixed the bug where newImageFont would try to created ImageData out of ImageData.
+ * Fixed error handler not resetting the blend mode.
+
+ * Changed fonts, they're now po2 safe.
+ * Changed the traceback in the error screen.
+ * Changed font origin to top-left.
+ * Changed linux save dir location to obey to Freedesktop.org's XDG specs. (~/.local/share/love by default.)
+
+ * Removed font functions from love.graphics.
+ * Removed love.physics.newWorld(w, h). Use love.physics.newWorld(x1, y1, x2, y2) instead.
+
+LOVE 0.6.2 [Jiggly Juice]
+-------------------------
+
+ Released: 2010-03-06
+
+ * Fixed a bug causing ImageFonts to cut off some pixels.
+ * Fixed a bug where filled rectangles were too small.
+ * Fixed a bug in Image:setFilter where it would switch the parameters.
+ * Fixed a bug in ImageRasterizer where it wasn't using the data.
+ * Image filter and wrap modes now use string constants as well.
+ * Fixed double-transform bug in SpriteBatch.
+ * Errors are reported on stdout again.
+ * Another fix for the icons on ubuntu.
+
+LOVE 0.6.1 [Jiggly Juice]
+-------------------------
+
+ Released: 2010-02-07
+
+ * Added Shape:setGroupIndex and getGroupIndex.
+ * Added Body:setFixedRotation and Body:getFixedRotation.
+ * Added Body:setInertia.
+ * Added CircleShape:getLocalCenter and CircleShape:getWorldCenter.
+ * Added icons and file associations for the debs.
+ * Added the demos folder to the Mac OS X DMG.
+ * It's now possible to run a .love from Resources in Mac OS X, thanks to Steve Johnson.
+ * Fixed a bug with multiple Sources on the same Music.
+ * Fixed a bug so the mouse doesn't get crippled when the keyboard is disabled.
+ * Fixed a bug where love.graphics.rectangle drew a too large rectangle.
+ * Fixed a bug where memory wouldn't be released correctly.
+ * Fixed epic physics typo (getRestituion->getRestitution).
+ * Fixed crash on opening non-existent image.
+ * The error screen redraws when an event occurs.
+ * The default love.run() now gracefully handles disabled modules.
+ * The debian packages should now successfully include icons, file associations, etc, and should give the correct architecture.
+ * Added support for drawing polylines to love.graphics.line - the syntax is the same as love.graphics.polygon.
+ * Removed Music and Sound. There are now only sources.
+ * Improved the stability of love.audio/love.sound.
+
+LOVE 0.6.0 [Jiggly Juice]
+-------------------------
+
+ Released: 2009-12-24
+
+ * Lost track of 0.6.0 changes a long while ago. Don't trust the list below.
+
+ * Added love.graphics.print()/printf().
+ * Added unicode-translated parameter to love.keypressed().
+ * Added love.event.
+ * Added love.filesystem.setIdentity().
+ * Added OpenAL dependency.
+
+ * Fixed love.fileystem problems with internal \0 in strings.
+ * Fixed love.filesystem.mkdir/remove not working when write directory not set.
+ * Fixed position of Window.
+
+ * Changed parameter order of draws().
+ * Changed origin for images to top-left.
+ * Changed love.filesystem.open to accept mode (removed from love.filesystem.newFile).
+ * Changed love.filesystem.read() which now returns two parameters (data, length).
+ * Changed love.filesystem.write() which now takes up to four parameters (file, data, length, mode).
+ * Changed default color mode to "modulate".
+ * Changed name of love.color_normal to "replace".
+ * Changed name of love.blend_normal to "alpha".
+ * Changed the conf file format.
+
+ * Removed Color object.
+ * Removed Animation.
+ * Removed several constants.
+ * Removed love.graphics.draw() for strings.
+ * Removed love.system.
+ * Removed SWIG.
+ * Removed boost.
+ * Removed SDL_mixer.
+
+
+LOVE 0.5.0 [Salted Nuts]
+------------------------
+
+ Released: 2009-01-02
+
+ * Added love.joystick.
+ * Added network support via LuaSocket.
+ * Added support for loading of appended .love-file.
+
+ * Added love.filesystem.lines().
+ * Added a loader function to enable use of normal require().
+ * Added love.filesystem.load().
+ * Added love.filesystem.getSaveDirectory()
+ * Added love.filesystem.getWorkingDirectory()
+
+ * Added optional explicit destruction of Box2D objects.
+ * Added shape:testSegment().
+ * Added love.graphics.screenshot() (.bmp only).
+ * Added default size (12) to font-related functions.
+ * Added love.graphics.setFont( filename, size )
+ * Added love.graphics.setLineStippe and related functions.
+ * Added love.graphics.setPointSize and related functions.
+
+ * Changed love.filesystem.read() to accept file name.
+ * Changed love.filesystem.write() to accept file name.
+ * Changed love.graphics.triangle() to accept CCW and CW ordering.
+
+ * Fixed love.graphics.read adding bogus characters at the end of string.
+ * Fixed epic swigfusion bug.
+ * Fixed love.graphics.getFont so it returns nil if no font is present.
+ * Fixed bug where love.graphics.getBlendMode() always returns blend_normal.
+ * Fixed bug which caused error screen to be scissored (when enabled).
+ * Fixed Body:setAngle to accept degrees like everything else.
+
+ * Cleaned up love::File and love_physfs.
+ * Cleaned up love::Reference so it stores its reference in _G.
+
+LOVE 0.4.0 [Taco Beam]
+----------------------
+
+ Released: 2008-08-29
+
+ * Added love.physics. (YES!)
+ * Added love.audio.setMode().
+ * Added love.audio.setChannels().
+ * Added love.graphics.polygon().
+ * Added love.graphics.setScissor() and love.graphics.getScissor() to handle scissoring the graphical area.
+ * Fixed missing constants related to image optimization.
+ * Fixed memory leak related to love::File (thanks amnesiasoft!).
+
+
+LOVE 0.3.2 [Lemony Fresh]
+-------------------------
+
+ Released: 2008-07-04
+
+ * Added love.graphics.rectangle()
+ * Added love.graphics.setLineWidth()
+ * Added love.graphics.setLineStyle()
+ * Added love.graphics.getLineWidth()
+ * Added love.graphics.getLineStyle()
+ * Added love.mouse.getPosition()
+ * Added love.audio_loop
+ * Added love.timer.getTime()
+ * Changed love.graphics.quad() to accept CCW and CW ordering.
+ * Fixed default color mode bug.
+ * Fixed line width being applied unnecessarily.
+ * Fixed line width bug related to fullscreen toggle.
+ * Fixed music not looping.
+
+LOVE 0.3.1 [Space Meat]
+-----------------------
+
+ Released: 2008-06-21
+
+ * Fixed segfault related to graphics.
+ * Fixed wait-forever bug related to audio.
+ * Fixed error reporting not working across modules.
+ * Fixed bug where games with a trailing "/" would not start.
+ * Fixed bug which caused love.timer.sleep to delay for (way) too long.
+
+LOVE 0.3.0 [Mutant Vermin]
+--------------------------
+
+ Released: 2008-06-17
+
+ * Added ParticleSystem.
+ * Added visual error reporting.
+ * Added love.system for game control needs.
+ * Added input grabbing.
+ * Added functions in love.graphics for display management.
+ * Added love.graphics.point().
+ * Added functions in love.graphics for getting current color, font, etc.
+ * Added love.filesystem.enumerate() for getting folder contents.
+ * Added functions for setting the window caption.
+ * Added version checking. An error occurs if the game is incompatible.
+ * Fixed print() :)
+ * Removed all keyboard shortcuts.
+ * Save folders are now created only if required.
+ * On Windows, the new save location is %APPDATA%\LOVE\game
+
+LOVE 0.2.1 [Impending Doom]
+---------------------------
+
+ Released: 2008-03-29
+
+ * Added many functions in love.filesystem.
+ * Added a dedicated save-folder for each game.
+ * Added timer.sleep.
+ * Added line heights to font objects.
+ * Added love.graphics.getWidth/getHeight.
+ * Added scaling and rotation for text.
+ * Added variable spacing to ImageFont.
+ * Added support for variable line quality when drawing primitives.
+ * Added several functions for drawing sections of images. (love.graphics.draws)
+ * Added image optimization function and padding function.
+ * Added love.graphics.getWidth/Height.
+
+ * Split devices up into actual SWIG-modules. This means that:
+ - Functions are used like this: love.graphics.draw, not love.graphics:draw
+ - love.objects is no more. Objects are created by an appropriate device.
+ * How you draw primitives has been altered.
+ * draw(string, x, y, wrap, align) has become drawf(string, x, y, wrap, align)
+
+ * Changed getFps to getFPS.
+ * Escape is no more ... enter: Alt+F4.
+ * love.filesystem.include has been renamed to love.filesystem.require.
+ * ImageFonts now consider the spacing as well as the glyph size.
+ * Fixed a massive ImageFont bug which resulted in float-positioning failure.
+ * Fixed a bug when loading fonts where the specified size doesn't represent the true size of the font.
+
+ * Updated DevIL to version 1.6.8-rc2 (Windows)
+ * Updated FreeType to freetype-2.3.5-1 (Windows)
+ * Updated Lua to 5.1.3 (Windows)
+ * Updated SDL to 1.2.13 (Windows)
+ * Removed boost::filesystem.
+
+LOVE 0.2.0 [Mini-Moose]
+-----------------------
+
+ Released: 2008-02-06
+
+ * Added ImageFont
+ * Added Animation
+ * Added text formatting functions
+ * Added setCenter for Image and Animation.
+ * Added methods for rendering of scaled/rotated sprites.
+ * Added the drawing of basic shapes.
+ * Added default font and embedded resources.
+ * Added Ctrl+R for reload.
+ * Added blending and color modes.
+ * Fixed memory usage of Graphics.
+ * Fixed a bug where the set text color would change the color of any images rendered.
+ * Fixed CWD bug.
+ * Fixed titlebar. Game title is now displayed.
+
+
+LOVE 0.1.1 [Santa-Power]
+------------------------
+
+ Initial release!
+ Released: 2008-01-13
+
+ * Image loading and rendering.
+ * Sound loading and playing.
+ * Font loading and rendering.
+ * Lua-scriptable games.
+ * Config files.
+ * Stuff is loadable from archive files.
+ * Keyboard, mouse, display, timer, etc. (Basic devices).
diff --git a/love2dToAPK/tools/tools/love-old-win/game.ico b/love2dToAPK/tools/tools/love-old-win/game.ico
new file mode 100644
index 0000000..3a01034
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-old-win/game.ico
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-old-win/license.txt b/love2dToAPK/tools/tools/love-old-win/license.txt
new file mode 100644
index 0000000..5938573
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-old-win/license.txt
@@ -0,0 +1,979 @@
+This software uses LÖVE:
+
+LÖVE is Copyright (c) 2006-2015 LOVE Development Team
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented you must not
+claim that you wrote the original software. If you use this software
+in a product, an acknowledgment in the product documentation would be
+appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and must not be
+misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source
+distribution.
+
+---------
+
+This software uses LuaJIT:
+
+LuaJIT is Copyright (c) 2005-2014 Mike Pall
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+---------
+
+This software uses ENet:
+
+Copyright (c) 2002-2014 Lee Salzman
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+---------
+
+This software uses lua-enet:
+
+Copyright (C) 2011 by Leaf Corcoran
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+---------
+
+This software uses UTF8-CPP:
+
+Copyright 2006 Nemanja Trifunovic
+
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by
+this license (the "Software") to use, reproduce, display, distribute,
+execute, and transmit the Software, and to prepare derivative works of the
+Software, and to permit third-parties to whom the Software is furnished to
+do so, all subject to the following:
+
+The copyright notices in the Software and this entire statement, including
+the above license grant, this restriction and the following disclaimer,
+must be included in all copies of the Software, in whole or in part, and
+all derivative works of the Software, unless such copies or derivative
+works are solely in the form of machine-executable object code generated by
+a source language processor.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+---------
+
+This software uses the following LGPL libraries:
+
+ - libmpg123
+ Website: http://www.mpg123.de/
+ Source download: http://sourceforge.net/projects/mpg123/files/latest/download
+ - OpenAL Soft
+ Website: http://kcat.strangesoft.net/openal.html
+ Source download: http://kcat.strangesoft.net/openal.html#download
+ - DevIL
+ Website: http://openil.sourceforge.net/
+ Source download: http://downloads.sourceforge.net/openil/DevIL-1.7.8.tar.gz
+
+Following are the LGPL and GPL license texts:
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code
+keep intact all notices of the absence of any warranty and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/love2dToAPK/tools/tools/love-old-win/love.dll b/love2dToAPK/tools/tools/love-old-win/love.dll
new file mode 100644
index 0000000..7e235ab
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-old-win/love.dll
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-old-win/love.exe b/love2dToAPK/tools/tools/love-old-win/love.exe
new file mode 100644
index 0000000..3c99c46
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-old-win/love.exe
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-old-win/love.ico b/love2dToAPK/tools/tools/love-old-win/love.ico
new file mode 100644
index 0000000..73403ae
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-old-win/love.ico
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-old-win/lua51.dll b/love2dToAPK/tools/tools/love-old-win/lua51.dll
new file mode 100644
index 0000000..758b730
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-old-win/lua51.dll
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-old-win/mpg123.dll b/love2dToAPK/tools/tools/love-old-win/mpg123.dll
new file mode 100644
index 0000000..145c3a4
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-old-win/mpg123.dll
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-old-win/msvcp120.dll b/love2dToAPK/tools/tools/love-old-win/msvcp120.dll
new file mode 100644
index 0000000..a237d2d
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-old-win/msvcp120.dll
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-old-win/msvcr120.dll b/love2dToAPK/tools/tools/love-old-win/msvcr120.dll
new file mode 100644
index 0000000..8c36149
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-old-win/msvcr120.dll
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-old-win/readme.txt b/love2dToAPK/tools/tools/love-old-win/readme.txt
new file mode 100644
index 0000000..14c5818
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-old-win/readme.txt
@@ -0,0 +1,74 @@
+LÖVE is an *awesome* framework you can use to make 2D games in Lua. It's free, open-source, and works on Windows, Mac OS X and Linux.
+
+Documentation
+-------------
+
+We use our [wiki][wiki] for documentation.
+If you need further help, feel free to ask on our [forums][forums], and last but not least there's the irc channel [#love on OFTC][irc].
+
+Compilation
+-----------
+
+###Windows
+Follow the instructions at the [megasource][megasource] repository page.
+
+###*nix
+Run `platform/unix/automagic` from the repository root, then run ./configure and make.
+
+ $ platform/unix/automagic
+ $ ./configure
+ $ make
+
+###Mac OS X
+Download the required frameworks from [here][dependencies] and place them in `/Library/Frameworks/`.
+
+Then use the Xcode project found at `platform/macosx/love.xcodeproj`.
+
+Repository information
+----------------------
+
+We use the 'default' branch for development, and therefore it should not be considered stable.
+Also used is the 'minor' branch, which is used for features in the next minor version and it is
+not our development target (which would be the next revision - version numbers are formatted major.minor.revision.)
+
+We tag all our releases (since we started using mercurial), and have binary downloads available for them.
+
+Experimental changes are developed in the separate [love-experiments][love-experiments] repository.
+
+Builds
+------
+
+Releases are found in the 'downloads' section on bitbucket, are linked on [the site][site],
+and there's a ppa for ubuntu, [ppa:bartbes/love-stable][stableppa].
+
+There are also unstable/nightly builds:
+
+- Most can be found [here][builds].
+- For ubuntu linux they are in [ppa:bartbes/love-unstable][unstableppa]
+- For arch linux there's [love-hg][aur] in the AUR.
+
+Dependencies
+------------
+
+- SDL2
+- OpenGL
+- OpenAL
+- Lua / LuaJIT / LLVM-lua
+- DevIL with MNG and TIFF
+- FreeType
+- PhysicsFS
+- ModPlug
+- mpg123
+- Vorbisfile
+
+[site]: http://love2d.org
+[wiki]: http://love2d.org/wiki
+[forums]: http://love2d.org/forums
+[irc]: irc://irc.oftc.net/love
+[dependencies]: http://love2d.org/sdk
+[megasource]: https://bitbucket.org/rude/megasource
+[builds]: http://love2d.org/builds
+[stableppa]: https://launchpad.net/~bartbes/+archive/love-stable
+[unstableppa]: https://launchpad.net/~bartbes/+archive/love-unstable
+[aur]: http://aur.archlinux.org/packages.php?ID=35279
+[love-experiments]: https://bitbucket.org/bartbes/love-experiments
diff --git a/love2dToAPK/tools/tools/love-win/OpenAL32.dll b/love2dToAPK/tools/tools/love-win/OpenAL32.dll
new file mode 100644
index 0000000..f012fb9
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-win/OpenAL32.dll
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-win/SDL2.dll b/love2dToAPK/tools/tools/love-win/SDL2.dll
new file mode 100644
index 0000000..2dd42bb
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-win/SDL2.dll
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-win/changes.txt b/love2dToAPK/tools/tools/love-win/changes.txt
new file mode 100644
index 0000000..410df99
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-win/changes.txt
@@ -0,0 +1,1031 @@
+LOVE 0.10.1 [Super Toast]
+-------------------------
+
+Released: 2016-02-14
+
+ * Added a new love.conf flag t.externalstorage, which determines whether files are saved in internal or external storage on Android devices.
+ * Added a new variant of love.graphics.arc which can draw different types of arcs ("pie", "open", or "closed").
+ * Added "lighten" and "darken" BlendModes. They can only be used with the "premultiplied" BlendAlphaMode.
+ * Added the "lighten" GraphicsFeature constant.
+ * Added the ability to avoid clearing specific Canvases when calling love.graphics.clear, if multiple Canvases are active at once via love.graphics.setCanvas.
+ * Added Text:getDimensions.
+ * Added optional "collideconnected" argument to love.physics.newMotorJoint.
+
+ * Fixed a Lua error in the no-game screen if the window's height is too small.
+ * Fixed the default error handler to reset the mouse Cursor.
+ * Fixed love.filesystem functions crashing when called if liblove is used directly without calling love.filesystem.init.
+ * Fixed audio on Android to pause when the app is inactive, and resume when the app becomes active again.
+ * Fixed Source:setRelative to set the relative state of playing Sources to the passed value rather than an old cached one.
+ * Fixed the Video decoding thread hanging after Video:seek or when a Video finishes.
+ * Fixed Video:isPlaying to always return false after it finishes playing.
+ * Fixed RandomGenerator:random crashing if a nil 'self' is used.
+ * Fixed loading BMFont files which have characters with 0 width or height (a space character, for example).
+ * Fixed love.graphics.newFont causing crashes if FileData is passed in.
+ * Fixed love.graphics.clear(colortable) causing crashes on OpenGL ES 2 systems when a Canvas is active.
+ * Fixed a driver bug on some Android devices which caused all objects to show up as black.
+ * Fixed a driver bug on Windows with AMD graphics cards where love.graphics.clear would not always work.
+ * Fixed Shader:sendColor incorrectly converting alpha values from sRGB to linear RGB when gamma-correct rendering is enabled.
+ * Fixed love.graphics.newMesh(vertices) double-converting colors from sRGB to linear RGB when gamma-correct rendering is enabled.
+ * Fixed love.graphics.new* crashing when there is no graphics context/window.
+
+ * Updated the Windows executable to prefer the high-powered AMD graphics card on systems which have switchable Intel+AMD GPUs.
+ * Updated love.touch.getTouches to return the list of IDs in the relative order that the touches initially happened, instead of being in a random order.
+ * Updated the error messages caused by invalid or bad arguments to ImageData and SoundData methods to be more descriptive.
+
+
+LOVE 0.10.0 [Super Toast]
+-------------------------
+
+Released: 2015-12-22
+
+ * Added an iOS port.
+ * Added an Android port.
+ * Added the flag t.accelerometerjoystick to love.conf. Disables accelerometer-as-joystick functionality on mobile devices when false.
+ * Added the flag t.gammacorrect to love.conf (replaces t.window.srgb.) Enabling it globally enables gamma-correct rendering, when supported.
+ * Added video playback support for Ogg Theora videos, via love.graphics.newVideo and Video objects.
+ * Added love.video module. It is not used for displaying videos on-screen, only decoding them.
+ * Added love.touch module. Note that it has important differences from the touch implementation in the LÖVE 0.9 Android and iOS ports.
+ * Added love.touchpressed, love.touchreleased, and love.touchmoved.
+ * Added love.system.vibrate.
+ * Added love.filesystem.setRequirePath and love.filesystem.getRequirePath.
+ * Added an optional program exit argument to love.event.quit.
+ * Added love.filedropped and love.directorydropped event callback functions.
+ * Added love.lowmemory event callback function, called when the app is running out of memory on mobile operating systems.
+ * Added love.textedited event callback function, called when the user is compositing text (e.g. via an IME.)
+ * Added love.wheelmoved event callback function (replaces "wu" and "wd" constants for love.mousepressed.)
+ * Added love.mouse.hasCursor.
+ * Added a boolean argument to love.mousepressed and love.mousereleased indicating whether the button event originated from a touch press.
+ * Added optional x/y/width/height arguments to love.keyboard.setTextInput. They tell the system where text will show up so on-screen keyboards can avoid that area.
+ * Added Source:getType (replaces Source:isStatic.)
+ * Added Source:getDuration and Decoder:getDuration.
+ * Added an optional string argument containing raw pixel byte data to the width/height variant of love.image.newImageData.
+ * Added love.graphics.ellipse.
+ * Added rounded-rectangle support to love.graphics.rectangle.
+ * Added love.graphics.points (replaces love.graphics.point.)
+ * Added love.graphics.intersectScissor.
+ * Added an optional argument to love.graphics.setBlendMode which indicates whether to treat the colors of drawn objects as having pre-multiplied alpha.
+ * Added love.graphics.getSupported (replaces love.graphics.isSupported.)
+ * Added love.graphics.getSystemLimits (replaces love.graphics.getSystemLimit.)
+ * Added love.graphics.stencil and love.graphics.set/getStencilTest (replaces love.graphics.setStencil.)
+ * Added love.graphics.isActive.
+ * Added color arguments to love.graphics.clear. It no longer always uses the background color value.
+ * Added love.graphics.discard.
+ * Added love.graphics.isGammaCorrect.
+ * Added the "clampzero" WrapMode.
+ * Added the ability to specify custom mipmaps when creating an image, via love.graphics.newImage(filename, {mipmaps={mip1, mip2, ...}})
+ * Added optional x/y/width/height arguments to Image:refresh and Canvas:newImageData.
+ * Added Image:getFlags.
+ * Added one- and two-channel Canvas formats: r8, rg8, r16f, rg16f, r32f, and rg32f.
+ * Added support for different formats in each Canvas when using multi-canvas rendering. Added the "multicanvasformats" Graphics Feature constant.
+ * Added support for OpenGL ES 2 and 3.
+ * Added support for loading ETC, EAC, PVRTC, and ASTC compressed textures on systems that support them.
+ * Added custom vertex attribute support for Meshes via new variants of love.graphics.newMesh.
+ * Added Mesh:setVertexAttribute and Mesh:getVertexAttribute.
+ * Added Mesh:getVertexFormat.
+ * Added Mesh:flush.
+ * Added an optional 'startvertex' argument to Mesh:setVertices.
+ * Added the ability for love.graphics.newMesh and Mesh:setVertices to accept a Data object.
+ * Added Mesh:setAttributeEnabled and Mesh:isAttributeEnabled.
+ * Added Mesh:attachAttribute.
+ * Added SpriteBatch:attachAttribute.
+ * Added Shader:sendColor.
+ * Added new shader functions: gammaCorrectColor, gammaToLinear, and linearToGamma. The functions also have 'precise' and 'fast' variants.
+ * Added Text objects and love.graphics.newText.
+ * Added per-character color support to love.graphics.print/printf and to Text objects.
+ * Added BMFont bitmap font file support to love.graphics.newFont and love.font.
+ * Added kerning support for TrueType/OpenType and BMFont Fonts.
+ * Added an optional font hinting argument to love.graphics.newFont when loading TrueType fonts.
+ * Added an optional spacing argument to love.graphics.newImageFont, which applies additional spacing to all rendered glyphs.
+ * Added Font:setFallbacks.
+ * Added love.window.maximize.
+ * Added love.window.close.
+ * Added love.window.requestAttention.
+ * Added love.window.setDisplaySleepEnabled and love.window.isDisplaySleepEnabled.
+ * Added BezierCurve:renderSegment and BezierCurve:removeControlPoint.
+ * Added BezierCurve:getSegment.
+ * Added love.math.compress and love.math.decompress.
+ * Added Channel:performAtomic.
+
+ * Changed love.mousepressed, love.mousereleased, and love.mouse.isDown to use button numbers instead of named button constants.
+ * Changed love.keypressed to be love.keypressed(key, scancode, isrepeat).
+ * Changed love.keyreleased to be love.keyreleased(key, scancode).
+ * Changed Font:getWrap's second return value to be a table containing the text split into lines.
+ * Changed love.graphics.newImage's optional second argument to be a table of flags (flags are "mipmaps" and "linear".)
+ * Changed the arguments for the standard variants of love.graphics.newMesh to newMesh(vertices [, drawmode, usage]) and newMesh(vertexcount [, drawmode, usage]).
+ * Changed ImageData:encode to return a FileData object. ImageData:encode's first parameter is now the format to encode to, and the second parameter is an optional filename to write to.
+
+ * Renamed the "normal" Fullscreen Type to "exclusive".
+ * Renamed the DistanceModel constants "inverse clamped", "linear clamped", and "exponent clamped" to "inverseclamped", "linearclamped", and "exponentclamped".
+ * Renamed the "additive", "subtractive", and "multiplicative" BlendModes to "add", "subtract", and "multiply".
+ * Renamed the KeyConstant and Scancode representing the spacebar from " " to "space".
+ * Renamed File:eof to File:isEOF.
+ * Renamed Canvas:getImageData to Canvas:newImageData.
+ * Renamed love.image's CompressedData type to CompressedImageData.
+
+ * Removed callback variant of love.filesystem.getDirectoryItems.
+ * Removed the "wu" and "wd" constants for love.mousepressed (replaced by love.wheelmoved.)
+ * Removed the named mouse button constants (replaced by button numbers.)
+ * Removed Source:isStatic (replaced by Source:getType.)
+ * Removed image loading support for all (non-compressed texture) file formats except for PNG, JPEG, TGA, and BMP.
+ * Removed JPEG encoding support from ImageData:encode.
+ * Removed love.graphics.point (replaced by love.graphics.points.)
+ * Removed love.graphics.setPointStyle and love.graphics.getPointStyle.
+ * Removed love.graphics.isSupported (replaced by love.graphics.getSupported.)
+ * Removed love.graphics.getSystemLimit (replaced by love.graphics.getSystemLimits.)
+ * Removed love.graphics.setStencil (replaced by love.graphics.stencil and love.graphics.setStencilTest.)
+ * Removed the "canvas", "shader", "npot", "subtractive", and "mipmap" Graphics Feature constants (the features always have guaranteed support now.)
+ * Removed the "multicanvas" Graphics Feature constant (use love.graphics.getSystemLimits instead.)
+ * Removed the "srgb" Graphics Feature constant (use love.graphics.isGammaCorrect() or love.graphics.getCanvasFormats().srgb instead.)
+ * Removed the "srgb" flag in love.window.setMode and in the t.window table in love.conf (Replaced by t.gammacorrect.)
+ * Removed the "premultiplied" blend mode (love.graphics.setBlendMode("alpha", "premultiplied") now does the same thing.)
+ * Removed Canvas:getPixel (use Canvas:newImageData instead.)
+ * Removed Canvas:clear (use love.graphics.clear instead.)
+ * Removed Mesh:getVertices.
+ * Removed Mesh:setVertexColors and Mesh:hasVertexColors (use Mesh:setAttributeEnabled("VertexColor", enable) instead.)
+ * Removed functions deprecated in LOVE 0.9.1 and 0.9.2:
+ * Removed love.graphics.getMaxImageSize and love.graphics.getMaxPointSize (replaced by love.graphics.getSystemLimits.)
+ * Removed Mesh:set/getImage, SpriteBatch:set/getImage, and ParticleSystem:set/getImage (replaced by set/getTexture.)
+ * Removed SpriteBatch:bind/unbind.
+ * Removed Canvas:getFSAA and the "fsaa" flag in love.conf and love.window.setMode (replaced by Canvas:getMSAA and "msaa".)
+ * Removed the "dxt" and "bc5" Graphics Feature constant (replaced by love.graphics.getCompressedImageFormats.)
+ * Removed the "hdrcanvas" Graphics Feature constant (replaced by love.graphics.getCanvasFormats.)
+ * Removed love.window.getWidth/getHeight/getDimensions (use love.graphics.getWidth/getHeight/getDimensions or love.window.getMode instead.)
+
+ * Fixed utf8.char.
+ * Fixed detection of fused love games.
+ * Fixed World:getCallbacks and World:getContactFilter when used in coroutines.
+ * Fixed crashes when objects which store Lua callback functions are garbage collected after being used in coroutines.
+ * Fixed memory leaks in love.physics if World:destroy is never called. When a World is GCed it now destroys all objects it owns.
+ * Fixed love.keyboard.getKeyFromScancode crashing when an invalid scancode is given.
+ * Fixed decoding of 8-bit WAV files.
+ * Fixed a crash issue when rewinding streaming ogg Sources, when certain versions of libvorbis are used.
+ * Fixed love.audio.stop() not rewinding streaming Sources.
+ * Fixed the stencil buffer in Canvases when an unsupported MSAA value is used to create the Canvas.
+ * Fixed Canvas:renderTo to restore the previous Canvas if an error occurs in the passed function.
+ * Fixed love.graphics.draw(canvas) to cause an error if that Canvas is the active one.
+ * Fixed Mesh:getVertexMap to return nil rather than an empty table, if no vertex map has been set.
+ * Fixed love.graphics.getColorMask.
+ * Fixed the default offset for particles when ParticleSystem:setQuads or ParticleSystem:setTexture is used.
+ * Fixed love.graphics.shear resetting all love.graphics transformations.
+ * Fixed the "add" and "subtract" blend modes to no longer modify the alpha of the Canvas / screen.
+
+ * Improved the performance of World:rayCast and World:queryBoundingBox.
+ * Improved the performance of love.graphics.line and other line drawing functions, when the "smooth" LineStyle is used.
+ * Improved the performance of Shader:send when matrices are used.
+ * Improved the performance of ImageData and SoundData methods when LuaJIT's JIT compiler is enabled, by using efficient FFI code.
+ * Improved the performance of love.math.noise, love.math.gammaToLinear, love.math.linearToGamma, love.math.random, and RandomGenerator:random when LuaJIT's JIT compiler is enabled.
+
+ * Updated the compatibility warning notice to use a message box and to show the version specified in love.conf.
+ * Updated the compatibility warning notice to display before main.lua is loaded.
+ * Updated the __tostring metamethod of love objects to output the pointer value, similar to tostring(table).
+ * Updated World:setCallbacks, World:setContactFilter, World:queryBoundingBox, and World:rayCast to have improved argument type checking.
+ * Updated threads to load love.filesystem automatically.
+ * Updated love.filesystem to enable symlinks by default.
+ * Updated love.math.setRandomSeed and RandomGenerator:setSeed to produce better results for the first few random() calls.
+ * Updated love.math.random and RandomGenerator:random to produce slightly better results in general.
+ * Updated Source methods that deal with spatial audio to error rather than failing silently if the Source isn't mono.
+ * Updated the 3D and 4D variants of love.math.noise to use Perlin noise rather than Simplex noise, to avoid patent issues.
+ * Updated ImageFonts to no longer treat separator pixels as spacing.
+ * Updated the default font to use less memory.
+ * Updated the behavior of text wrapping with love.graphics.printf and Font:getWrap to work better.
+ * Updated love.graphics.print and love.graphics.printf to no longer automatically round the x and y position arguments.
+ * Updated some error messages for love.graphics.newImage to be more descriptive.
+ * Updated love.graphics color functions to automatically apply love.math.gammaToLinear to color values when gamma-correct rendering is enabled.
+ * Updated the 'normal' Canvas format to internally use 'srgb' rather than 'rgba8' when gamma-correct rendering is enabled.
+ * Updated love.graphics.setColor to affect all drawn objects, including ParticleSystems, SpriteBatches, and Meshes.
+ * Updated the default fullscreen type to be "desktop" rather than "exclusive".
+ * Updated the minimum runtime system requirements of LOVE to require OpenGL 2.1 or OpenGL ES 2 support.
+ * Updated the pixel shader effect function so screen_coords.y is 0 at the top of the screen instead of the bottom.
+ * Updated Images to require setting the mipmaps flag to true on creation in order to use mipmaps.
+ * Updated Images to allow mipmaps for non-power-of-two sizes.
+
+LOVE 0.9.2 [Baby Inspector]
+---------------------------
+
+ Released: 2015-02-14
+
+ * Added Lua 5.3's UTF-8 module (via utf8 = require("utf8")).
+ * Added Shader:getExternVariable.
+ * Added several new canvas texture formats.
+ * Added love.graphics.getCanvasFormats.
+ * Added love.graphics.getCompressedImageFormats.
+ * Added ParticleSystem:setQuads.
+ * Added ParticleSystem:setLinearDamping.
+ * Added SpriteBatch:flush.
+ * Added love.graphics.getStats.
+ * Added "mirroredrepeat" wrap mode.
+ * Added love.audio.setDopplerScale and love.audio.getDopplerScale.
+ * Added optional duration argument to Joystick:setVibration.
+ * Added love.joystick.loadGamepadMappings and love.joystick.saveGamepadMappings.
+ * Added Joint:setUserData and Joint:getUserData.
+ * Added Joint:getBodies.
+ * Added GearJoint:getJoints.
+ * Added Contact:getFixtures and Body:getContactList.
+ * Added Body:getWorld.
+ * Added Body:getJointList.
+ * Added Body/Contact/Fixture/Joint/World:isDestroyed.
+ * Added love.mousemoved event callback.
+ * Added love.mouse.setRelativeMode and love.mouse.getRelativeMode.
+ * Added Scancode enums, love.keyboard.getKeyFromScancode, and love.keyboard.getScancodeFromKey.
+ * Added love.window.getDisplayName.
+ * Added love.window.minimize.
+ * Added love.window.showMessageBox.
+ * Added 'refreshrate' field to the table returned by love.window.getMode.
+ * Added love.window.toPixels and love.window.fromPixels.
+ * Added love.window.setPosition and love.window.getPosition, and 'x' and 'y' fields to love.window.setMode and t.window in love.conf.
+ * Added love.filesystem.isSymlink, love.filesystem.setSymlinksEnabled, and love.filesystem.areSymlinksEnabled.
+ * Added love.filesystem.getRealDirectory.
+
+ * Deprecated SpriteBatch:bind and SpriteBatch:unbind.
+ * Deprecated all uses of the name 'FSAA' in favor of 'MSAA'.
+ * Deprecated the 'hdrcanvas' graphics feature enum in favor of getCanvasFormats.
+ * Deprecated the 'dxt' and 'bc5' graphics feature enums in favor of getCompressedImageFormats.
+
+ * Fixed crashes when love objects are used in multiple threads.
+ * Fixed love.filesystem.setIdentity breaking in some situations when called multiple times.
+ * Fixed the default love.filesystem identity when in Fused mode in Windows.
+ * Fixed love.system.openURL sometimes blocking indefinitely on Linux.
+ * Fixed love.joystick.setGamepadMapping.
+ * Fixed the order of vertices in ChainShapes.
+ * Fixed love.mouse.getPosition returning outdated values if love.mouse.setPosition is used in the same frame.
+ * Fixed love.graphics.newFont to error when given an invalid size argument.
+ * Fixed the filename and backtrace given when love.graphics.print errors.
+ * Fixed a small memory leak if love.graphics.newCanvas errors.
+ * Fixed shader:getWarnings returning unnecessary information.
+ * Fixed some cases of noncompliant shader code not properly erroring on some nvidia drivers.
+ * Fixed a potential crash when Shader objects are garbage collected.
+ * Fixed a potential small memory leak triggered when love.graphics.newShader errors.
+ * Fixed love.graphics.newMesh(vertexcount, ...) causing the Mesh to do instanced rendering.
+ * Fixed Mesh:getVertexMap.
+ * Fixed Image:refresh generating mipmaps multiple times if mipmap filtering is enabled.
+ * Fixed Image:setMipmapFilter to not keep bad state around if it errors.
+ * Fixed Mesh:setDrawRange when the Mesh has a vertex map set.
+ * Fixed internal detection of the 'position' and 'effect' shader functions.
+ * Fixed Texture memory leak when Meshes are garbage collected.
+ * Fixed the default line join mode to be 'miter' instead of an undefined value.
+ * Fixed the default error handler text size when highdpi mode is enabled on a Retina monitor.
+ * Fixed the default error handler background color when sRGB mode is enabled for the window.
+ * Fixed love.window.setMode to fall back to the largest available mode if a width or height greater than the largest supported is specified and fullscreen is used.
+ * Fixed the state of wireframe mode when love.window.setMode is called.
+ * Fixed Canvas:getPixel to error if the coordinates are not within the Canvas' size.
+ * Fixed detection of compressed textures to work regardless of the file's extension.
+
+ * Renamed all cases of FSAA to MSAA. The FSAA names still exist for backward-compatibility.
+
+ * Updated the Windows executable to automatically prefer the higher performance GPU on nvidia Optimus systems.
+ * Updated the --console command-line argument in Windows to open the console before conf.lua is loaded.
+ * Updated t.console and the --console command-line argument in Windows to use the existing Console window, if love was launched from one.
+ * Updated the love executable to verify that the love library's version matches.
+ * Updated the Lua wrapper code for modules to avoid crashes when the module's instance is created, deleted, and recreated.
+ * Updated internal code for handling garbage collection of love objects to be more efficient.
+ * Updated love's initialization code to trigger a Lua error if love.conf has an error in it.
+ * Updated the paths returned by love.filesystem.getSaveDirectory and friends to strip double-slashes from the string.
+ * Updated the error message when love.filesystem.write or File:open fails because the directory doesn't exist.
+ * Updated the error message when love.math.setRandomseed(0) is attempted.
+ * Updated the error message when invalid UTF-8 strings are used in love functions that expect UTF-8.
+ * Updated love.physics.newPolygonShape and love.physics.newChainShape to accept a table of vertices.
+ * Updated love.physics.newChainShape to error if the number of arguments is invalid.
+ * Updated love.thread.newThread to accept a literal string of code directly.
+ * Updated love-created threads to use names visible in external debuggers.
+ * Updated SpriteBatch:unbind to use less VRAM if the SpriteBatch has the static usage hint.
+ * Updated love.graphics.newImage, love.image.newImageData, etc. to leave less Lua-owned memory around.
+ * Updated love.graphics.push to accept different stack types to push. Current types are "transform" and "all".
+ * Updated love shaders to accept GLSL ES precision qualifiers on variables, although they do nothing.
+ * Updated the error message for love.graphics.newShader to be less cryptic if an invalid filename is given.
+ * Updated compressed texture loading code to allow BC6 and BC7 compressed textures (if the graphics driver supports them.)
+
+LOVE 0.9.1 [Baby Inspector]
+---------------------------
+
+ Released: 2014-04-01
+
+ * Added Source:clone.
+ * Added blend mode "screen".
+ * Added ParticleSystem:clone.
+ * Added ParticleSystem:moveTo, has smoother emitter movement compared to setPosition.
+ * Added ParticleSystem:setRelativeRotation.
+ * Added love.graphics.setWireframe for debugging.
+ * Added Mesh:setDrawRange and Mesh:getDrawRange.
+ * Added CircleShape:getPoint and CircleShape:setPoint.
+ * Added Mesh/SpriteBatch/ParticleSystem:setTexture, accepts Canvases and Images.
+ * Added high-dpi window support for Retina displays in OS X, via the 'highdpi' window flag.
+ * Added love.window.getPixelScale.
+ * Added love.graphics.getSystemLimit.
+ * Added antialiasing support to Canvases.
+ * Added Canvas:getFSAA.
+ * Added 'love_ScreenSize' built-in variable in shaders.
+ * Added love.getVersion.
+ * Added support for gamma-correct rendering.
+ * Added love.graphics.isSupported("srgb").
+ * Added love.math.gammaToLinear and love.math.linearToGamma.
+ * Added RandomGenerator:getState and RandomGenerator:setState.
+ * Added Body:setUserData and Body:getUserData.
+ * Added some missing obscure key constants.
+ * Added optional callback function argument to love.filesystem.getDirectoryItems.
+ * Added love.system.openURL.
+
+ * Deprecated Mesh/SpriteBatch/ParticleSystem:setImage.
+ * Deprecated love.graphics.getMaxImageSize and love.graphics.getMaxPointSize.
+
+ * Fixed love.graphics.scale with negative values causing incorrect line widths.
+ * Fixed Joystick:isDown using 0-based button index arguments.
+ * Fixed Source:setPitch to error when infinity or NaN is given.
+ * Fixed love.graphics.setCanvas() to restore the proper viewport and scissor rectangles.
+ * Fixed TrueType font glyphs which request a monochrome bitmap pixel mode.
+ * Fixed love.graphics.reset causing crashes when called in between love.graphics.push/pop.
+ * Fixed tab characters ("\t") to display properly with love.graphics.print.
+ * Fixed love.graphics.isCreated to return false when love.window.setMode fails completely.
+ * Fixed love.window.setMode to not destroy OpenGL resources before checking whether a fullsceren size is supported.
+ * Fixed World:getBodyList and World:getJointList causing hard crashes.
+ * Fixed loading BC4 compressed textures.
+ * Fixed SoundData objects being initialized with garbage values.
+ * Fixed 8-bit SoundData samples when used in love.audio Sources.
+
+ * Updated the error text for love.filesystem’s module searchers when require fails.
+ * Updated the love.filesystem module searchers to be tried after package.preload instead of before.
+ * Updated love.graphics.newParticleSystem, newSpriteBatch, and newMesh to accept Canvases.
+ * Updated Canvas drawing code, texture coordinates are no longer flipped vertically.
+ * Updated Canvas:renderTo to work properly if a Canvas is currently active.
+ * Updated ParticleSystem:setEmissionRate to accept non-integer numbers.
+ * Updated Source:play to return a boolean indicating success.
+ * Updated t.console in conf.lua to create the console before modules are loaded in Windows.
+ * Updated Mesh vertex maps (index buffers) to use less space in VRAM.
+ * Updated love.graphics.newMesh and Mesh:setVertices to default the UV parameters to 0,0.
+ * Updated Fixture:set/getUserData to work in Coroutines.
+ * Updated fullscreen-desktop and resizable window modes in OS X to use Mac OS 10.7's fullscreen Spaces.
+ * Updated love.filesystem's C library loader to look in paths added via love.filesystem.mount, in Fused mode.
+ * Updated the default love.run code to make initial love.math.random calls more random.
+
+LOVE 0.9.0 [Baby Inspector]
+---------------------------
+
+ Released: 2013-12-13
+
+ * Added better multiplayer networking support via ENet.
+ * Added --fused command line argument, to simulate fusing.
+ * Added liblove.
+ * Added the ability to have exit values.
+ * Added exit value of 1 in case of error by default.
+ * Added basic support for the file:// uri scheme.
+ * Added love.filesystem.isFused.
+ * Added love.filesystem.getIdentity.
+ * Added love.filesystem.append.
+ * Added love.filesystem.getSize.
+ * Added love.filesystem.mount and love.filesystem.unmount.
+ * Added optional file search order parameter to love.filesystem.setIdentity.
+ * Added File:isOpen and File:getMode.
+ * Added Fie:setBuffer, File:getBuffer, and File:flush.
+ * Added textinput event for unicode text input.
+ * Added love.keyboard.setTextInput and love.keyboard.hasTextInput.
+ * Added previously internal Rasterizer and GlyphData object methods.
+ * Added support for UTF-8 ImageFonts.
+ * Added Font:getAscent/getDescent/getBaseline.
+ * Added Font:setFilter/getFilter.
+ * Added Font:hasGlyphs.
+ * Added angle, scale, and shear parameters to love.graphics.printf.
+ * Added HDR canvas support.
+ * Added mipmapping support (has isSupported test).
+ * Added vertex shader support.
+ * Added boolean support to Shader:send.
+ * Added Canvas:getPixel.
+ * Added blend mode "replace".
+ * Added line join modes.
+ * Added Mesh objects, allowing for arbitrary textured polygons.
+ * Added multiple render target support to love.graphics.setCanvas.
+ * Added love.graphics.setColorMask.
+ * Added love.graphics.origin.
+ * Added love.graphics.getRendererInfo.
+ * Added love.graphics.getMaxImageSize.
+ * Added SpriteBatch:getCount and SpriteBatch:getBufferSize.
+ * Added SpriteBatch:getColor.
+ * Added ParticleSystem:emit.
+ * Added ParticleSystem:setInsertMode and ParticleSystem:getInsertMode.
+ * Added many ParticleSystem getter methods.
+ * Added DXT compressed texture support via love.image.newCompressedData.
+ * Added love.image.isCompressed and Image:isCompressed.
+ * Added Image/Canvas/ImageData:getDimensions.
+ * Added anisotropic filtering support for Images, Canvases, and Fonts.
+ * Added Image:refresh.
+ * Added Image:getData.
+ * Added SoundData:getDuration and SoundData:getSampleCount.
+ * Added Source:isPlaying.
+ * Added Source:setRelative and Source:isRelative.
+ * Added Source:setCone and Source:getCone.
+ * Added Source:getChannels.
+ * Added new Channels API for love.thread.
+ * Added limited table support to Channel:push.
+ * Added Thread:getError.
+ * Added Thread:isRunning.
+ * Added threaderror event.
+ * Added love.math module.
+ * Added a platform-independent (good) random implementation to love.math.
+ * Added RandomGenerator objects.
+ * Added BezierCurve objects.
+ * Added love.math.triangulate and love.math.isConvex.
+ * Added love.math.noise.
+ * Added love.timer.getAverageDelta.
+ * Added Data:getString.
+ * Added Contact:getChildren.
+ * Added love.system module.
+ * Added love.system.getClipboardText and love.system.setClipboardText.
+ * Added love.system.getOS and love.system.getProcessorCount.
+ * Added love.window module.
+ * Added love.window.isVisible.
+ * Added flags to love.window.setMode.
+ * Added monitor choosing support to love.window.setMode.
+ * Added support for resizable, borderless, and non-centered windows.
+ * Added support for "fullscreen-desktop" mode.
+ * Added window resize and visible events.
+ * Added love.window.getDimensions.
+ * Added love.window.getIcon.
+ * Added t.window.icon to love.conf.
+ * Added love.mousefocus and love.window.hasMouseFocus.
+ * Added custom hardware cursors via love.mouse.newCursor.
+ * Added love.mouse.setX/setY.
+ * Added Joystick objects.
+ * Added love.joystick.getJoystick.
+ * Added joystick connect and disconnect events.
+ * Added joystickaxis and joystickhat events.
+ * Added unified Gamepad API for joysticks which have a similar layout to the Xbox controller.
+ * Added joystick vibration support, works with most common gamepads.
+ * OPTIONAL: Added support for Game Music Emu.
+
+ * Fixed fused mode in OS X.
+ * Fixed printing to the console in Windows before love.load is called.
+ * Fixed the default love.run to not include the time taken by love.load in the first frame's dt.
+ * Fixed the error screen not always appearing until the next input event.
+ * Fixed love.event.clear.
+ * Fixed love.mouse.setPosition when called in love.load.
+ * Fixed scaling in several love.physics functions.
+ * Fixed Box2D exception in World:update.
+ * Fixed many uncaught Box2D / love.physics exceptions for Bodies and Joints.
+ * Fixed ChainShape:getPoints running out of Lua stack space and crashing.
+ * Fixed File:read reading past end of file.
+ * Fixed love.filesystem.setIdentity not removing read access from old directories.
+ * Fixed possible memory leak in utf-8 decoder.
+ * Fixed spacing for the last character in an ImageFont.
+ * Fixed line wrapping in love.graphics.printf.
+ * Fixed love.graphics.printf to error if the wrap limit is negative.
+ * Fixed love.graphics.print truncating strings with embedded zeros.
+ * Fixed crashes with font drawing on some ATI cards.
+ * Fixed artifacts when drawing lines at huge scale.
+ * Fixed Fonts and Canvases ignoring default image filter.
+ * Fixed scissor boxes when a canvas is set after love.graphics.setScissor is called.
+ * Fixed love.graphics.getLineWidth returning incorrect values.
+ * Fixed love.graphics.getColor on some Windows systems.
+ * Fixed alpha blend mode.
+ * Fixed multiplicative blend mode.
+ * Fixed love.graphics.getPointStyle.
+ * Fixed line numbers in shader errors.
+ * Fixed Shader:send with Images and Canvases failing sometimes.
+ * Fixed Shader:send to keep a reference to sent Images and Canvases.
+ * Fixed crash when binding SpriteBatches multiple times.
+ * Fixed SpriteBatches with more than 16,384 sprites.
+ * Fixed particle draw order for ParticleSystems.
+ * Fixed ParticleSystem:setSizes resetting the size variation.
+ * Fixed the graphics viewport not matching the window size when using an unsupported fullscreen mode.
+ * Fixed getMode and friends returning wrong values when using desktop size.
+ * Fixed keyrepeat settings being lost after (indirect) setMode.
+ * Fixed the icon being reset after setMode.
+ * Fixed memory leak in the mp3 decoder.
+ * Fixed sound issues with some versions of OpenAL soft, by enabling direct channels.
+ * Fixed 'random' hangs in audio.
+ * Fixed love.sound.newDecoder not accepting FileData.
+ * Fixed case (in)sensitivity of sound file extension parsing.
+ * Fixed looping support in tracker music formats.
+ * Fixed skipping/looping issues when playing streaming audio Sources.
+ * Fixed race condition in Source:play.
+ * Fixed WAVE sound playback.
+
+ * Moved love's startup to modules/love.
+ * Moved window-related functions from love.graphics to love.window.
+
+ * Renamed love's boot script to 'love.boot', which can be required.
+ * Renamed love.filesystem.mkdir to love.filesystem.createDirectory.
+ * Renamed love.filesystem.enumerate to love.filesystem.getDirectoryItems.
+ * Renamed World:setAllowSleeping to World:setSleepingAllowed.
+ * Renamed ChainShape:setPrevVertex to ChainShape:setPreviousVertex.
+ * Renamed Joint:enableMotor to Joint:setMotorEnabled.
+ * Renamed Joint:enableLimit and Joint:isLimitEnabled to Joint:setLimitsEnabled and Joint:hasLimitsEnabled.
+ * Renamed t.screen to t.window in love.conf.
+ * Renamed love.graphics.setCaption to love.window.setTitle.
+ * Renamed PixelEffect to Shader (but now with vertex shaders).
+ * Renamed love.graphics.setDefaultImageFilter to love.graphics.setDefaultFilter.
+ * Renamed ParticleSystem:setSprite to ParticleSystem:setImage.
+ * Renamed ParticleSystem:setGravity to ParticleSystem:setLinearAcceleration.
+ * Renamed ParticleSystem:setLifetime/setParticleLife to setEmitter/ParticleLifetime.
+ * Renamed ParticleSystem:count and all getNum* functions to get*Count.
+ * Renamed Source:setDistance to Source:setAttenuationDistances.
+ * Renamed SoundData:getBits and Decoder:getBits to SoundData:getBitDepth and Decoder:getBitDepth.
+ * Renamed love.mouse.setGrab to love.mouse.setGrabbed.
+
+ * Removed release mode.
+ * Removed love.keyboard.getKeyRepeat (see love.keyboard.hasKeyRepeat).
+ * Removed the unicode argument from love.keypressed (see love.textinput).
+ * Removed love.graphics.drawTest.
+ * Removed love.graphics.quad/triangle.
+ * Removed love.graphics.setColorMode.
+ * Removed love.graphics.newStencil.
+ * Removed love.graphics.setLine/setPoint.
+ * Removed love.graphics.drawq (functionality is merged into love.graphics.draw).
+ * Removed SpriteBatch:addq/setq (functionality is merged into SpriteBatch:add/set).
+ * Removed Quad:flip.
+ * Removed ParticleSystem:isFull/isEmpty.
+ * Removed ParticleSystem:getX/getY.
+ * Removed love.graphics.checkMode.
+ * Removed love.joystick.open and friends.
+ * Removed love.joystick module functions which operated on individual joysticks (see Joystick objects).
+ * Removed joystick ball support.
+ * Removed thread names.
+ * Removed old thread messaging API (see Channels).
+ * Removed love.timer.getMicroTime.
+
+ * Updated functions which return love objects to re-use the Lua-side object instead of always recreating it.
+ * Updated the windows console, it now tries to re-use an active one first.
+ * Updated error handling, error handlers now get resolved when the error occurs.
+ * Updated order of sleep/present in love.run (now draws, *then* sleeps).
+ * Updated love.filesystem to try to create the appdata directory if it doesn't exist yet.
+ * Updated the default filesystem identity to omit file extension.
+ * Updated love.filesystem.newFile to optionally open the file.
+ * Updated most love.filesystem functions to return nil, error on internal failure.
+ * Updated love.keyboard.setKeyRepeat to take a boolean argument instead of numbers.
+ * Updated love.keypressed's second argument to be a boolean indicating key repeat.
+ * Updated keyboard key constants for some more modern keyboard keys.
+ * Updated window code to use adaptive vsync when available, if vsync is enabled.
+ * updated love.graphics.print's x and y arguments to default to 0.
+ * Updated the setFilter and setWrap methods, the second argument is now optional.
+ * Updated Font and ParticleSystem rendering code, now more performant.
+ * Updated SpriteBatch code, now more performant when adding/setting and (un)binding.
+ * Updated Canvas code to support more systems.
+ * Updated Canvas:getImageData and love.graphics.newScreenshot to be more efficient.
+ * Updated love.graphics.newScreenshot to create a fully opaque image by default.
+ * Updated error messages when sending bad values to Shaders.
+ * Updated love.graphics.newParticleSystem to have a default buffer size of 1000.
+ * Updated ImageData:setPixel to accept a table and default to 255 alpha.
+ * Updated ImageData:mapPixel, is now more efficient and accepts optional x,y,w,h arguments.
+ * Updated love.image memory handling, improves errors and thread-safety.
+ * Updated all love object constructors to optionally accept FileData if they accept a filename.
+ * Updated allocation for SoundData, it's more efficient and less wasteful.
+ * Updated SoundData:set/getSample to error for invalid samples.
+ * Updated Source:set* functions to default z to 0.
+ * Updated Source:seek to error for negative offsets.
+ * Updated Thread:start to accept arguments which get passed to the thread.
+ * Updated love.timer.getFPS to be microsecond-accurate.
+ * Updated love.timer.getTime to be microsecond-accurate and monotonic.
+ * Updated Box2D to version 2.3.0.
+
+LOVE 0.8.0 [Rubber Piggy]
+-------------------------
+
+ Released: 2012-04-02
+
+ * Added release error screen.
+ * Added alpha to love.graphics.setBackgroundColor.
+ * Added Canvas:clear(r, g, b, a).
+ * Added Canvas support to love.graphics.drawq.
+ * Added Canvas:getWidth and Canvas:getHeight.
+ * Added love.graphics.arc.
+ * Added seek and tell to Source objects.
+ * Added color interpolation to ParticleSystem.
+ * Added automatic PO2 padding for systems not supporting the OpenGL extension.
+ * Added UTF-8 support for fonts.
+ * Added Box2D error handling for some commonly failing functions.
+ * Added ability for fused release games to have their write dir in appdata.
+ * Added shear transformation to drawing functions.
+ * Added origin to font printing.
+ * Added love.graphics.getMode.
+ * Added per-sprite colors on SpriteBatches.
+ * Added PixelEffects.
+ * Added love.graphics.isSupported.
+ * Added love.graphics.getCanvas.
+ * Added love.event.quit.
+ * Added stencil masks.
+ * Added alternative SpriteBatch provider, it should work everywhere now.
+ * Added a loader for binary modules.
+ * Added Thread:getKeys.
+ * Added option of fractions for Quads.
+ * Added PNG, JPEG and GIF support to ImageData:encode.
+ * Added 64-bit support for Mac OS X.
+ * Added premultiplied blending mode.
+ * Added functions to set/get default image filter modes.
+ * Added SpriteBatch:set.
+ * Added new events system, with support for custom events and long event names.
+ * Added sound attenuation by distance.
+ * Added SpriteBatch:getImage.
+ * Added combine color mode.
+ * Added automatic random seeding to love.run.
+ * Added support for the subtract BlendMode on older graphics cards.
+ * Added love._os field, which contains the OS the game is running on.
+
+ * Fixed wrapping for single words.
+ * Fixed tracebacks not showing filenames.
+ * Fixed love.graphics.push/pop capable of causing overflows/underflows.
+ * Fixed setScissor on Canvases.
+ * Fixed several issues with audio, e.g. clicks and pops in mp3s.
+ * Fixed crashes when bodies were destroyed during collisions.
+ * Fixed bound SpriteBatches corrupting when drawing.
+ * Fixed thread-safety issues with ImageData.
+ * Fixed memory leaks in audio sources.
+ * Fixed thread's set (previously send) accidentally changing the type.
+ * Fixed SoundData allocating the wrong number of samples.
+ * Fixed SpriteBatch support on Intel cards.
+ * Fixed love.filesystem.lines() leaking.
+ * Fixed most leaking on unclosed File objects.
+ * Fixed crashes when operating on non-existent files.
+ * Fixed a bug where empty files on windows would never reach eof.
+ * Fixed crash when SoundData runs out of memory.
+ * Fixed ordering of loaders, love should have priority over lua.
+ * Fixed several miscellaneous memory leaks.
+ * Fixed a few cases where strings with \0 in them would not be stored correctly.
+ * Fixed love's startup time being in the first dt.
+ * Fixed internal string conversions, they are faster now.
+ * Fixed (bad) performance of ImageData:paste.
+ * Fixed love.graphics.toggleFullscreen not maintaining graphics state.
+
+ * Renamed SpriteBatch's lock/unlock to bind/unbind.
+ * Renamed Framebuffer to Canvas.
+ * Renamed love.thread.send/receive to set/get.
+ * Renamed love.graphics.setRenderTarget to setCanvas.
+
+ * Removed canvas auto-clearing.
+ * Removed EncodedImageData.
+ * Removed old syntax for require (with extension).
+ * Removed love.graphics.setFont([file], [size]).
+ * Removed Thread:kill.
+
+ * Updated love.joystick to be 1-indexed.
+ * Updated Sources to update more cleanly and control more intuitively.
+ * Updated font engine.
+ * Updated line drawing to a custom system.
+ * Updated love.timer.sleep to use seconds, like the rest of love.
+ * Updated love.timer to be more accurate.
+ * Updated love.graphics.circle to have max(10, r) as default for segments.
+ * Updated ImageData:encode to write to files directly.
+ * Updated version compatibility system to actually do something.
+ * Updated love.run's order, events are checked just before update.
+ * Updated Box2D to version 2.2.1.
+
+LOVE 0.7.2 [Game Slave]
+-----------------------
+
+ Released: 2011-05-04
+
+ * Added Framebuffer:get/setWrap.
+ * Added love.event.clear.
+ * Added support for any number of arguments to love.keyboard.isDown, love.mouse.isDown and love.joystick.isDown.
+ * Added SpriteBatch:setImage().
+
+ * Fixed fused games not working.
+ * Fixed ParticleSystem:setSize ignoring the variation argument.
+ * Fixed some file-opening exceptions not being caught.
+ * Fixed files loaded by libmodplug being too loud.
+ * Fixed paths with periods in them not working.
+ * Fixed love.graphics.getBlendMode not detecting subtractive and multiplicative blend modes.
+ * Fixed crash when there was no memory available for newImageData(w, h).
+
+ * Updated PhysicsFS version to 2.0.2 on Windows
+ * Updated OpenAL Soft version to 1.13 on Windows
+ * Updated libmodplug version to 0.8.8.1 on Windows
+ * Updated FreeType version to 2.4.4 on Windows
+ * Updated libmpg123 version to 1.13.2 on Windows
+ * Windows binary no longer depends on VC2005 runtime.
+ * Windows binary no longer depends on SSE2 support.
+
+LOVE 0.7.1 [Game Slave]
+-----------------------
+
+ Released: 2011-02-14
+
+ * Added source:isPaused()
+ * Added error when initial window can't be created.
+ * Added framebuffer filter modes.
+ * Added love.filesystem.getLastModified.
+ * Added filter modes for ImageFonts.
+ * Added dead key support by using "unknown" key with correct unicode value.
+ * Added 0 width and height in love.conf. (for current desktop resolution)
+ * Added alpha support when encoding TGA images.
+
+ * Fixed a lot of bugs regarding zero characters in threads.
+ * Fixed handling of a directory named "love" in current directory.
+ * Fixed a few unhandled errors in setScissor.
+ * Fixed a bug where old physics callbacks were never dereferenced.
+ * Fixed loss of mouse visibility settings on setMode.
+ * Fixed creation of a framebuffer unbinding current framebuffer.
+ * Fixed several race conditions in love.thread.
+ * Fixed 'love .', so it won't use lovedir/. as save dir.
+ * Fixed setLineHeight.
+ * Fixed extended ascii and ImageFonts.
+ * Fixed printf's line wrapping.
+ * Fixed crash when playing sounds.
+ * Fixed playback of mp3s with arbitrary sample rates.
+ * Fixed handling of negative indices in love.joystick.
+ * Fixed toggleFullscreen.
+ * Fixed unexpected behaviour with hash tables to love.graphics.line.
+ * Fixed mouse coordinates being capped after setMode.
+ * Fixed setFont's error handling on a non-existant file.
+ * Fixed issue where Windows builds would hard crash on Lua errors
+
+ * Removed custom sample rates for Decoders.
+
+LOVE 0.7.0 [Game Slave]
+-----------------------
+
+ Released: 2010-12-05
+
+ * Added love.thread.
+ * Added love.font.
+ * Added love.graphics.Framebuffer.
+ * Added Source:play, Source:pause, etc.
+ * Added Source:isStatic().
+ * Added get/setPosition, get/setVelocity, and get/setDirection to Source.
+ * Added get/setGroupIndex to CircleShape and PolygonShape.
+ * Added Font:getWrap.
+ * Added identity field to love.conf.
+ * Added love.quit callback.
+ * Added love.focus callback.
+ * Added extra meter parameter to love.physics.newWorld.
+ * Added love.graphics.setIcon.
+ * Added way to make the window desktop resolution.
+ * Added subtractive and multiplicative blend modes.
+ * Added body:getAllowSleeping.
+ * Added shape:getBody.
+ * Added love.filesystem.FileData for public usage.
+ * Added base64 support for love.filesystem.FileData.
+ * Added table support for love.graphics.setColor and love.graphics.setBackgroundColor.
+ * Added love.graphics.hasFocus().
+ * Added ?/init.lua to the loader.
+
+ * Fixed the debug module not being an upvalue of the error handlers. (you can now override debug)
+ * Fixed some cases when love.audio.pause and friends, were acting on everything, not just the passed Source.
+ * Fixed setFixedRotation enabling other flags.
+ * Fixed a bug in the loader (for require).
+ * Fixed ParticleSystem::setSprite not retaining the new image.
+ * Fixed setMode removing images settings (wrapping, filters).
+ * Fixed shape:getBody, it's now exposed for LÖVE usage.
+ * Fixed DistanceJoint:getType() returning "circle" - it now returns "distance".
+ * Fixed SpriteBatches being unaffected by setColor
+ * Fixed the audio bug.
+ * Fixed invalid FSAA values crashing LÖVE.
+ * Fixed a bunch of compiler warnings.
+ * Fixed OS X not properly using UTIs for .love files.
+ * Fixed the modplug decoder not properly handeling files that fail to load.
+ * Fixed a memory leak in setFont.
+ * Fixed bug where errors in threads wouldn't get picked up by demand.
+ * Fixed part of the bug with newlines when scaling text (rotating still messes up the lines).
+ * Fixed the bug where newImageFont would try to created ImageData out of ImageData.
+ * Fixed error handler not resetting the blend mode.
+
+ * Changed fonts, they're now po2 safe.
+ * Changed the traceback in the error screen.
+ * Changed font origin to top-left.
+ * Changed linux save dir location to obey to Freedesktop.org's XDG specs. (~/.local/share/love by default.)
+
+ * Removed font functions from love.graphics.
+ * Removed love.physics.newWorld(w, h). Use love.physics.newWorld(x1, y1, x2, y2) instead.
+
+LOVE 0.6.2 [Jiggly Juice]
+-------------------------
+
+ Released: 2010-03-06
+
+ * Fixed a bug causing ImageFonts to cut off some pixels.
+ * Fixed a bug where filled rectangles were too small.
+ * Fixed a bug in Image:setFilter where it would switch the parameters.
+ * Fixed a bug in ImageRasterizer where it wasn't using the data.
+ * Image filter and wrap modes now use string constants as well.
+ * Fixed double-transform bug in SpriteBatch.
+ * Errors are reported on stdout again.
+ * Another fix for the icons on ubuntu.
+
+LOVE 0.6.1 [Jiggly Juice]
+-------------------------
+
+ Released: 2010-02-07
+
+ * Added Shape:setGroupIndex and getGroupIndex.
+ * Added Body:setFixedRotation and Body:getFixedRotation.
+ * Added Body:setInertia.
+ * Added CircleShape:getLocalCenter and CircleShape:getWorldCenter.
+ * Added icons and file associations for the debs.
+ * Added the demos folder to the Mac OS X DMG.
+ * It's now possible to run a .love from Resources in Mac OS X, thanks to Steve Johnson.
+ * Fixed a bug with multiple Sources on the same Music.
+ * Fixed a bug so the mouse doesn't get crippled when the keyboard is disabled.
+ * Fixed a bug where love.graphics.rectangle drew a too large rectangle.
+ * Fixed a bug where memory wouldn't be released correctly.
+ * Fixed epic physics typo (getRestituion->getRestitution).
+ * Fixed crash on opening non-existent image.
+ * The error screen redraws when an event occurs.
+ * The default love.run() now gracefully handles disabled modules.
+ * The debian packages should now successfully include icons, file associations, etc, and should give the correct architecture.
+ * Added support for drawing polylines to love.graphics.line - the syntax is the same as love.graphics.polygon.
+ * Removed Music and Sound. There are now only sources.
+ * Improved the stability of love.audio/love.sound.
+
+LOVE 0.6.0 [Jiggly Juice]
+-------------------------
+
+ Released: 2009-12-24
+
+ * Lost track of 0.6.0 changes a long while ago. Don't trust the list below.
+
+ * Added love.graphics.print()/printf().
+ * Added unicode-translated parameter to love.keypressed().
+ * Added love.event.
+ * Added love.filesystem.setIdentity().
+ * Added OpenAL dependency.
+
+ * Fixed love.fileystem problems with internal \0 in strings.
+ * Fixed love.filesystem.mkdir/remove not working when write directory not set.
+ * Fixed position of Window.
+
+ * Changed parameter order of draws().
+ * Changed origin for images to top-left.
+ * Changed love.filesystem.open to accept mode (removed from love.filesystem.newFile).
+ * Changed love.filesystem.read() which now returns two parameters (data, length).
+ * Changed love.filesystem.write() which now takes up to four parameters (file, data, length, mode).
+ * Changed default color mode to "modulate".
+ * Changed name of love.color_normal to "replace".
+ * Changed name of love.blend_normal to "alpha".
+ * Changed the conf file format.
+
+ * Removed Color object.
+ * Removed Animation.
+ * Removed several constants.
+ * Removed love.graphics.draw() for strings.
+ * Removed love.system.
+ * Removed SWIG.
+ * Removed boost.
+ * Removed SDL_mixer.
+
+
+LOVE 0.5.0 [Salted Nuts]
+------------------------
+
+ Released: 2009-01-02
+
+ * Added love.joystick.
+ * Added network support via LuaSocket.
+ * Added support for loading of appended .love-file.
+
+ * Added love.filesystem.lines().
+ * Added a loader function to enable use of normal require().
+ * Added love.filesystem.load().
+ * Added love.filesystem.getSaveDirectory()
+ * Added love.filesystem.getWorkingDirectory()
+
+ * Added optional explicit destruction of Box2D objects.
+ * Added shape:testSegment().
+ * Added love.graphics.screenshot() (.bmp only).
+ * Added default size (12) to font-related functions.
+ * Added love.graphics.setFont( filename, size )
+ * Added love.graphics.setLineStippe and related functions.
+ * Added love.graphics.setPointSize and related functions.
+
+ * Changed love.filesystem.read() to accept file name.
+ * Changed love.filesystem.write() to accept file name.
+ * Changed love.graphics.triangle() to accept CCW and CW ordering.
+
+ * Fixed love.graphics.read adding bogus characters at the end of string.
+ * Fixed epic swigfusion bug.
+ * Fixed love.graphics.getFont so it returns nil if no font is present.
+ * Fixed bug where love.graphics.getBlendMode() always returns blend_normal.
+ * Fixed bug which caused error screen to be scissored (when enabled).
+ * Fixed Body:setAngle to accept degrees like everything else.
+
+ * Cleaned up love::File and love_physfs.
+ * Cleaned up love::Reference so it stores its reference in _G.
+
+LOVE 0.4.0 [Taco Beam]
+----------------------
+
+ Released: 2008-08-29
+
+ * Added love.physics. (YES!)
+ * Added love.audio.setMode().
+ * Added love.audio.setChannels().
+ * Added love.graphics.polygon().
+ * Added love.graphics.setScissor() and love.graphics.getScissor() to handle scissoring the graphical area.
+ * Fixed missing constants related to image optimization.
+ * Fixed memory leak related to love::File (thanks amnesiasoft!).
+
+
+LOVE 0.3.2 [Lemony Fresh]
+-------------------------
+
+ Released: 2008-07-04
+
+ * Added love.graphics.rectangle()
+ * Added love.graphics.setLineWidth()
+ * Added love.graphics.setLineStyle()
+ * Added love.graphics.getLineWidth()
+ * Added love.graphics.getLineStyle()
+ * Added love.mouse.getPosition()
+ * Added love.audio_loop
+ * Added love.timer.getTime()
+ * Changed love.graphics.quad() to accept CCW and CW ordering.
+ * Fixed default color mode bug.
+ * Fixed line width being applied unnecessarily.
+ * Fixed line width bug related to fullscreen toggle.
+ * Fixed music not looping.
+
+LOVE 0.3.1 [Space Meat]
+-----------------------
+
+ Released: 2008-06-21
+
+ * Fixed segfault related to graphics.
+ * Fixed wait-forever bug related to audio.
+ * Fixed error reporting not working across modules.
+ * Fixed bug where games with a trailing "/" would not start.
+ * Fixed bug which caused love.timer.sleep to delay for (way) too long.
+
+LOVE 0.3.0 [Mutant Vermin]
+--------------------------
+
+ Released: 2008-06-17
+
+ * Added ParticleSystem.
+ * Added visual error reporting.
+ * Added love.system for game control needs.
+ * Added input grabbing.
+ * Added functions in love.graphics for display management.
+ * Added love.graphics.point().
+ * Added functions in love.graphics for getting current color, font, etc.
+ * Added love.filesystem.enumerate() for getting folder contents.
+ * Added functions for setting the window caption.
+ * Added version checking. An error occurs if the game is incompatible.
+ * Fixed print() :)
+ * Removed all keyboard shortcuts.
+ * Save folders are now created only if required.
+ * On Windows, the new save location is %APPDATA%\LOVE\game
+
+LOVE 0.2.1 [Impending Doom]
+---------------------------
+
+ Released: 2008-03-29
+
+ * Added many functions in love.filesystem.
+ * Added a dedicated save-folder for each game.
+ * Added timer.sleep.
+ * Added line heights to font objects.
+ * Added love.graphics.getWidth/getHeight.
+ * Added scaling and rotation for text.
+ * Added variable spacing to ImageFont.
+ * Added support for variable line quality when drawing primitives.
+ * Added several functions for drawing sections of images. (love.graphics.draws)
+ * Added image optimization function and padding function.
+ * Added love.graphics.getWidth/Height.
+
+ * Split devices up into actual SWIG-modules. This means that:
+ - Functions are used like this: love.graphics.draw, not love.graphics:draw
+ - love.objects is no more. Objects are created by an appropriate device.
+ * How you draw primitives has been altered.
+ * draw(string, x, y, wrap, align) has become drawf(string, x, y, wrap, align)
+
+ * Changed getFps to getFPS.
+ * Escape is no more ... enter: Alt+F4.
+ * love.filesystem.include has been renamed to love.filesystem.require.
+ * ImageFonts now consider the spacing as well as the glyph size.
+ * Fixed a massive ImageFont bug which resulted in float-positioning failure.
+ * Fixed a bug when loading fonts where the specified size doesn't represent the true size of the font.
+
+ * Updated DevIL to version 1.6.8-rc2 (Windows)
+ * Updated FreeType to freetype-2.3.5-1 (Windows)
+ * Updated Lua to 5.1.3 (Windows)
+ * Updated SDL to 1.2.13 (Windows)
+ * Removed boost::filesystem.
+
+LOVE 0.2.0 [Mini-Moose]
+-----------------------
+
+ Released: 2008-02-06
+
+ * Added ImageFont
+ * Added Animation
+ * Added text formatting functions
+ * Added setCenter for Image and Animation.
+ * Added methods for rendering of scaled/rotated sprites.
+ * Added the drawing of basic shapes.
+ * Added default font and embedded resources.
+ * Added Ctrl+R for reload.
+ * Added blending and color modes.
+ * Fixed memory usage of Graphics.
+ * Fixed a bug where the set text color would change the color of any images rendered.
+ * Fixed CWD bug.
+ * Fixed titlebar. Game title is now displayed.
+
+
+LOVE 0.1.1 [Santa-Power]
+------------------------
+
+ Initial release!
+ Released: 2008-01-13
+
+ * Image loading and rendering.
+ * Sound loading and playing.
+ * Font loading and rendering.
+ * Lua-scriptable games.
+ * Config files.
+ * Stuff is loadable from archive files.
+ * Keyboard, mouse, display, timer, etc. (Basic devices).
diff --git a/love2dToAPK/tools/tools/love-win/game.ico b/love2dToAPK/tools/tools/love-win/game.ico
new file mode 100644
index 0000000..ecc5c0d
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-win/game.ico
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-win/license.txt b/love2dToAPK/tools/tools/love-win/license.txt
new file mode 100644
index 0000000..85a6e37
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-win/license.txt
@@ -0,0 +1,977 @@
+This software uses LOVE:
+
+LOVE is Copyright (c) 2006-2016 LOVE Development Team
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented you must not
+claim that you wrote the original software. If you use this software
+in a product, an acknowledgment in the product documentation would be
+appreciated but is not required.
+
+2. Altered source versions must be plainly marked as such, and must not be
+misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source
+distribution.
+
+---------
+
+This software uses LuaJIT:
+
+LuaJIT is Copyright (c) 2005-2015 Mike Pall
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+---------
+
+This software uses ENet:
+
+Copyright (c) 2002-2014 Lee Salzman
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+---------
+
+This software uses lua-enet:
+
+Copyright (C) 2011 by Leaf Corcoran
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+---------
+
+This software uses UTF8-CPP:
+
+Copyright 2006 Nemanja Trifunovic
+
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by
+this license (the "Software") to use, reproduce, display, distribute,
+execute, and transmit the Software, and to prepare derivative works of the
+Software, and to permit third-parties to whom the Software is furnished to
+do so, all subject to the following:
+
+The copyright notices in the Software and this entire statement, including
+the above license grant, this restriction and the following disclaimer,
+must be included in all copies of the Software, in whole or in part, and
+all derivative works of the Software, unless such copies or derivative
+works are solely in the form of machine-executable object code generated by
+a source language processor.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+---------
+
+This software uses the following LGPL libraries on Windows, Mac OS X, Linux,
+and Android:
+
+ - libmpg123
+ Website: http://www.mpg123.de/
+ Source download: http://sourceforge.net/projects/mpg123/files/latest/download
+ - OpenAL Soft
+ Website: http://kcat.strangesoft.net/openal.html
+ Source download: http://kcat.strangesoft.net/openal.html#download
+
+Following are the LGPL and GPL license texts:
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code
+keep intact all notices of the absence of any warranty and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/love2dToAPK/tools/tools/love-win/love.dll b/love2dToAPK/tools/tools/love-win/love.dll
new file mode 100644
index 0000000..849a1ce
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-win/love.dll
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-win/love.exe b/love2dToAPK/tools/tools/love-win/love.exe
new file mode 100644
index 0000000..1d2172a
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-win/love.exe
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-win/love.ico b/love2dToAPK/tools/tools/love-win/love.ico
new file mode 100644
index 0000000..b703c98
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-win/love.ico
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-win/lua51.dll b/love2dToAPK/tools/tools/love-win/lua51.dll
new file mode 100644
index 0000000..78d2608
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-win/lua51.dll
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-win/mpg123.dll b/love2dToAPK/tools/tools/love-win/mpg123.dll
new file mode 100644
index 0000000..84da7db
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-win/mpg123.dll
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-win/msvcp120.dll b/love2dToAPK/tools/tools/love-win/msvcp120.dll
new file mode 100644
index 0000000..a237d2d
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-win/msvcp120.dll
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-win/msvcr120.dll b/love2dToAPK/tools/tools/love-win/msvcr120.dll
new file mode 100644
index 0000000..8c36149
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-win/msvcr120.dll
Binary files differ
diff --git a/love2dToAPK/tools/tools/love-win/readme.txt b/love2dToAPK/tools/tools/love-win/readme.txt
new file mode 100644
index 0000000..6bdf782
--- /dev/null
+++ b/love2dToAPK/tools/tools/love-win/readme.txt
@@ -0,0 +1,96 @@
+LÖVE is an *awesome* framework you can use to make 2D games in Lua. It's free, open-source, and works on Windows, Mac OS X, Linux, Android, and iOS.
+
+[![Build Status: Windows](https://ci.appveyor.com/api/projects/status/u1a69u5o5ej1pus4?svg=true)](https://ci.appveyor.com/project/AlexSzpakowski/love)
+
+Documentation
+-------------
+
+We use our [wiki][wiki] for documentation.
+If you need further help, feel free to ask on our [forums][forums], and last but not least there's the irc channel [#love on OFTC][irc].
+
+Compilation
+-----------
+
+###Windows
+Follow the instructions at the [megasource][megasource] repository page.
+
+###*nix
+Run `platform/unix/automagic` from the repository root, then run ./configure and make.
+
+ $ platform/unix/automagic
+ $ ./configure
+ $ make
+
+###Mac OS X
+Download the required frameworks from [here][dependencies] and place them in `/Library/Frameworks/`.
+
+Then use the Xcode project found at `platform/xcode/love.xcodeproj` to build the `love-macosx` target.
+
+###iOS
+Download the required libraries from [here][dependencies-ios] and place the `include` and `libraries` folders
+into the `platform/xcode/ios` folder.
+
+Then use the Xcode project found at `platform/xcode/love.xcodeproj` to build the `love-ios` target.
+
+See `readme-iOS.rtf` for more information.
+
+###Android
+Visit the [Android build repository][android-repository] for build instructions.
+
+Repository information
+----------------------
+
+We use the 'default' branch for development, and therefore it should not be considered stable.
+Also used is the 'minor' branch, which is used for features in the next minor version and it is
+not our development target (which would be the next revision - version numbers are formatted major.minor.revision.)
+
+We tag all our releases (since we started using mercurial), and have binary downloads available for them.
+
+Experimental changes are developed in the separate [love-experiments][love-experiments] repository.
+
+Contributing
+------------
+
+The best places to contribute are through the Bitbucket issue tracker and the official IRC channel.
+For code contributions, pull requests and patches are welcome. Be sure to read the [source code style guide][codestyle].
+
+Builds
+------
+
+Releases are found in the 'downloads' section on bitbucket, are linked on [the site][site],
+and there's a ppa for ubuntu, [ppa:bartbes/love-stable][stableppa].
+
+There are also unstable/nightly builds:
+
+- Most can be found [here][builds].
+- For ubuntu linux they are in [ppa:bartbes/love-unstable][unstableppa]
+- For arch linux there's [love-hg][aur] in the AUR.
+
+Dependencies
+------------
+
+- SDL2
+- OpenGL 2.1+ / OpenGL ES 2+
+- OpenAL
+- Lua / LuaJIT / LLVM-lua
+- FreeType
+- PhysicsFS
+- ModPlug
+- mpg123
+- Vorbisfile
+- Theora
+
+[site]: http://love2d.org
+[wiki]: http://love2d.org/wiki
+[forums]: http://love2d.org/forums
+[irc]: irc://irc.oftc.net/love
+[dependencies]: http://love2d.org/sdk
+[dependencies-ios]: https://bitbucket.org/rude/love/downloads/love-0.10.0-ios-libraries.zip
+[megasource]: https://bitbucket.org/rude/megasource
+[builds]: http://love2d.org/builds
+[stableppa]: https://launchpad.net/~bartbes/+archive/love-stable
+[unstableppa]: https://launchpad.net/~bartbes/+archive/love-unstable
+[aur]: http://aur.archlinux.org/packages/love-hg
+[love-experiments]: https://bitbucket.org/bartbes/love-experiments
+[codestyle]: https://love2d.org/wiki/Code_Style
+[android-repository]: https://bitbucket.org/MartinFelis/love-android-sdl2
diff --git a/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/ABOUT-NLS b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/ABOUT-NLS
new file mode 100644
index 0000000..3575535
--- /dev/null
+++ b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/ABOUT-NLS
@@ -0,0 +1,1111 @@
+1 Notes on the Free Translation Project
+***************************************
+
+Free software is going international! The Free Translation Project is
+a way to get maintainers of free software, translators, and users all
+together, so that free software will gradually become able to speak many
+languages. A few packages already provide translations for their
+messages.
+
+ If you found this `ABOUT-NLS' file inside a distribution, you may
+assume that the distributed package does use GNU `gettext' internally,
+itself available at your nearest GNU archive site. But you do _not_
+need to install GNU `gettext' prior to configuring, installing or using
+this package with messages translated.
+
+ Installers will find here some useful hints. These notes also
+explain how users should proceed for getting the programs to use the
+available translations. They tell how people wanting to contribute and
+work on translations can contact the appropriate team.
+
+ When reporting bugs in the `intl/' directory or bugs which may be
+related to internationalization, you should tell about the version of
+`gettext' which is used. The information can be found in the
+`intl/VERSION' file, in internationalized packages.
+
+1.1 Quick configuration advice
+==============================
+
+If you want to exploit the full power of internationalization, you
+should configure it using
+
+ ./configure --with-included-gettext
+
+to force usage of internationalizing routines provided within this
+package, despite the existence of internationalizing capabilities in the
+operating system where this package is being installed. So far, only
+the `gettext' implementation in the GNU C library version 2 provides as
+many features (such as locale alias, message inheritance, automatic
+charset conversion or plural form handling) as the implementation here.
+It is also not possible to offer this additional functionality on top
+of a `catgets' implementation. Future versions of GNU `gettext' will
+very likely convey even more functionality. So it might be a good idea
+to change to GNU `gettext' as soon as possible.
+
+ So you need _not_ provide this option if you are using GNU libc 2 or
+you have installed a recent copy of the GNU gettext package with the
+included `libintl'.
+
+1.2 INSTALL Matters
+===================
+
+Some packages are "localizable" when properly installed; the programs
+they contain can be made to speak your own native language. Most such
+packages use GNU `gettext'. Other packages have their own ways to
+internationalization, predating GNU `gettext'.
+
+ By default, this package will be installed to allow translation of
+messages. It will automatically detect whether the system already
+provides the GNU `gettext' functions. If not, the included GNU
+`gettext' library will be used. This library is wholly contained
+within this package, usually in the `intl/' subdirectory, so prior
+installation of the GNU `gettext' package is _not_ required.
+Installers may use special options at configuration time for changing
+the default behaviour. The commands:
+
+ ./configure --with-included-gettext
+ ./configure --disable-nls
+
+will, respectively, bypass any pre-existing `gettext' to use the
+internationalizing routines provided within this package, or else,
+_totally_ disable translation of messages.
+
+ When you already have GNU `gettext' installed on your system and run
+configure without an option for your new package, `configure' will
+probably detect the previously built and installed `libintl.a' file and
+will decide to use this. This might not be desirable. You should use
+the more recent version of the GNU `gettext' library. I.e. if the file
+`intl/VERSION' shows that the library which comes with this package is
+more recent, you should use
+
+ ./configure --with-included-gettext
+
+to prevent auto-detection.
+
+ The configuration process will not test for the `catgets' function
+and therefore it will not be used. The reason is that even an
+emulation of `gettext' on top of `catgets' could not provide all the
+extensions of the GNU `gettext' library.
+
+ Internationalized packages usually have many `po/LL.po' files, where
+LL gives an ISO 639 two-letter code identifying the language. Unless
+translations have been forbidden at `configure' time by using the
+`--disable-nls' switch, all available translations are installed
+together with the package. However, the environment variable `LINGUAS'
+may be set, prior to configuration, to limit the installed set.
+`LINGUAS' should then contain a space separated list of two-letter
+codes, stating which languages are allowed.
+
+1.3 Using This Package
+======================
+
+As a user, if your language has been installed for this package, you
+only have to set the `LANG' environment variable to the appropriate
+`LL_CC' combination. Here `LL' is an ISO 639 two-letter language code,
+and `CC' is an ISO 3166 two-letter country code. For example, let's
+suppose that you speak German and live in Germany. At the shell
+prompt, merely execute `setenv LANG de_DE' (in `csh'),
+`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash').
+This can be done from your `.login' or `.profile' file, once and for
+all.
+
+ You might think that the country code specification is redundant.
+But in fact, some languages have dialects in different countries. For
+example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The
+country code serves to distinguish the dialects.
+
+ The locale naming convention of `LL_CC', with `LL' denoting the
+language and `CC' denoting the country, is the one use on systems based
+on GNU libc. On other systems, some variations of this scheme are
+used, such as `LL' or `LL_CC.ENCODING'. You can get the list of
+locales supported by your system for your language by running the
+command `locale -a | grep '^LL''.
+
+ Not all programs have translations for all languages. By default, an
+English message is shown in place of a nonexistent translation. If you
+understand other languages, you can set up a priority list of languages.
+This is done through a different environment variable, called
+`LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG'
+for the purpose of message handling, but you still need to have `LANG'
+set to the primary language; this is required by other parts of the
+system libraries. For example, some Swedish users who would rather
+read translations in German than English for when Swedish is not
+available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'.
+
+ Special advice for Norwegian users: The language code for Norwegian
+bokma*l changed from `no' to `nb' recently (in 2003). During the
+transition period, while some message catalogs for this language are
+installed under `nb' and some older ones under `no', it's recommended
+for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and
+older translations are used.
+
+ In the `LANGUAGE' environment variable, but not in the `LANG'
+environment variable, `LL_CC' combinations can be abbreviated as `LL'
+to denote the language's main dialect. For example, `de' is equivalent
+to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT'
+(Portuguese as spoken in Portugal) in this context.
+
+1.4 Translating Teams
+=====================
+
+For the Free Translation Project to be a success, we need interested
+people who like their own language and write it well, and who are also
+able to synergize with other translators speaking the same language.
+Each translation team has its own mailing list. The up-to-date list of
+teams can be found at the Free Translation Project's homepage,
+`http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams"
+area.
+
+ If you'd like to volunteer to _work_ at translating messages, you
+should become a member of the translating team for your own language.
+The subscribing address is _not_ the same as the list itself, it has
+`-request' appended. For example, speakers of Swedish can send a
+message to `sv-request@li.org', having this message body:
+
+ subscribe
+
+ Keep in mind that team members are expected to participate
+_actively_ in translations, or at solving translational difficulties,
+rather than merely lurking around. If your team does not exist yet and
+you want to start one, or if you are unsure about what to do or how to
+get started, please write to `translation@iro.umontreal.ca' to reach the
+coordinator for all translator teams.
+
+ The English team is special. It works at improving and uniformizing
+the terminology in use. Proven linguistic skill are praised more than
+programming skill, here.
+
+1.5 Available Packages
+======================
+
+Languages are not equally supported in all packages. The following
+matrix shows the current state of internationalization, as of July
+2006. The matrix shows, in regard of each package, for which languages
+PO files have been submitted to translation coordination, with a
+translation percentage of at least 50%.
+
+ Ready PO files af am ar az be bg bs ca cs cy da de el en en_GB eo
+ +----------------------------------------------------+
+ GNUnet | [] |
+ a2ps | [] [] [] [] [] |
+ aegis | () |
+ ant-phone | () |
+ anubis | [] |
+ ap-utils | |
+ aspell | [] [] [] [] |
+ bash | [] [] [] |
+ batchelor | [] |
+ bfd | |
+ bibshelf | [] |
+ binutils | [] |
+ bison | [] [] |
+ bison-runtime | [] |
+ bluez-pin | [] [] [] [] [] |
+ cflow | [] |
+ clisp | [] [] |
+ console-tools | [] [] |
+ coreutils | [] [] [] [] |
+ cpio | |
+ cpplib | [] [] [] |
+ cryptonit | [] |
+ darkstat | [] () [] |
+ dialog | [] [] [] [] [] [] |
+ diffutils | [] [] [] [] [] [] |
+ doodle | [] |
+ e2fsprogs | [] [] |
+ enscript | [] [] [] [] |
+ error | [] [] [] [] |
+ fetchmail | [] [] () [] |
+ fileutils | [] [] |
+ findutils | [] [] [] |
+ flex | [] [] [] |
+ fslint | [] |
+ gas | |
+ gawk | [] [] [] |
+ gbiff | [] |
+ gcal | [] |
+ gcc | [] |
+ gettext-examples | [] [] [] [] [] |
+ gettext-runtime | [] [] [] [] [] |
+ gettext-tools | [] [] |
+ gimp-print | [] [] [] [] |
+ gip | [] |
+ gliv | [] |
+ glunarclock | [] |
+ gmult | [] [] |
+ gnubiff | () |
+ gnucash | () () [] |
+ gnucash-glossary | [] () |
+ gnuedu | |
+ gnulib | [] [] [] [] [] [] |
+ gnunet-gtk | |
+ gnutls | |
+ gpe-aerial | [] [] |
+ gpe-beam | [] [] |
+ gpe-calendar | [] [] |
+ gpe-clock | [] [] |
+ gpe-conf | [] [] |
+ gpe-contacts | |
+ gpe-edit | [] |
+ gpe-filemanager | |
+ gpe-go | [] |
+ gpe-login | [] [] |
+ gpe-ownerinfo | [] [] |
+ gpe-package | |
+ gpe-sketchbook | [] [] |
+ gpe-su | [] [] |
+ gpe-taskmanager | [] [] |
+ gpe-timesheet | [] |
+ gpe-today | [] [] |
+ gpe-todo | |
+ gphoto2 | [] [] [] [] |
+ gprof | [] [] |
+ gpsdrive | () () |
+ gramadoir | [] [] |
+ grep | [] [] [] [] [] [] |
+ gretl | |
+ gsasl | |
+ gss | |
+ gst-plugins | [] [] [] [] |
+ gst-plugins-base | [] [] [] |
+ gst-plugins-good | [] [] [] [] [] [] [] |
+ gstreamer | [] [] [] [] [] [] [] |
+ gtick | [] () |
+ gtkam | [] [] [] |
+ gtkorphan | [] [] |
+ gtkspell | [] [] [] [] |
+ gutenprint | [] |
+ hello | [] [] [] [] [] |
+ id-utils | [] [] |
+ impost | |
+ indent | [] [] [] |
+ iso_3166 | [] [] |
+ iso_3166_1 | [] [] [] [] [] |
+ iso_3166_2 | |
+ iso_3166_3 | [] |
+ iso_4217 | [] |
+ iso_639 | [] [] |
+ jpilot | [] |
+ jtag | |
+ jwhois | |
+ kbd | [] [] [] [] |
+ keytouch | |
+ keytouch-editor | |
+ keytouch-keyboa... | |
+ latrine | () |
+ ld | [] |
+ leafpad | [] [] [] [] [] |
+ libc | [] [] [] [] [] |
+ libexif | [] |
+ libextractor | [] |
+ libgpewidget | [] [] [] |
+ libgpg-error | [] |
+ libgphoto2 | [] [] |
+ libgphoto2_port | [] [] |
+ libgsasl | |
+ libiconv | [] [] |
+ libidn | [] [] |
+ lifelines | [] () |
+ lilypond | [] |
+ lingoteach | |
+ lynx | [] [] [] [] |
+ m4 | [] [] [] [] |
+ mailutils | [] |
+ make | [] [] |
+ man-db | [] () [] [] |
+ minicom | [] [] [] |
+ mysecretdiary | [] [] |
+ nano | [] [] () [] |
+ nano_1_0 | [] () [] [] |
+ opcodes | [] |
+ parted | |
+ pilot-qof | [] |
+ psmisc | [] |
+ pwdutils | |
+ python | |
+ qof | |
+ radius | [] |
+ recode | [] [] [] [] [] [] |
+ rpm | [] [] |
+ screem | |
+ scrollkeeper | [] [] [] [] [] [] [] [] |
+ sed | [] [] [] |
+ sh-utils | [] [] |
+ shared-mime-info | [] [] [] |
+ sharutils | [] [] [] [] [] [] |
+ shishi | |
+ silky | |
+ skencil | [] () |
+ sketch | [] () |
+ solfege | |
+ soundtracker | [] [] |
+ sp | [] |
+ stardict | [] |
+ system-tools-ba... | [] [] [] [] [] [] [] [] [] |
+ tar | [] |
+ texinfo | [] [] [] |
+ textutils | [] [] [] |
+ tin | () () |
+ tp-robot | [] |
+ tuxpaint | [] [] [] [] [] |
+ unicode-han-tra... | |
+ unicode-transla... | |
+ util-linux | [] [] [] [] |
+ vorbis-tools | [] [] [] [] |
+ wastesedge | () |
+ wdiff | [] [] [] [] |
+ wget | [] [] |
+ xchat | [] [] [] [] [] |
+ xkeyboard-config | |
+ xpad | [] [] |
+ +----------------------------------------------------+
+ af am ar az be bg bs ca cs cy da de el en en_GB eo
+ 11 0 1 2 8 21 1 42 43 2 62 99 18 1 16 16
+
+ es et eu fa fi fr ga gl gu he hi hr hu id is it
+ +--------------------------------------------------+
+ GNUnet | |
+ a2ps | [] [] [] () |
+ aegis | |
+ ant-phone | [] |
+ anubis | [] |
+ ap-utils | [] [] |
+ aspell | [] [] [] |
+ bash | [] [] [] |
+ batchelor | [] [] |
+ bfd | [] |
+ bibshelf | [] [] [] |
+ binutils | [] [] [] |
+ bison | [] [] [] [] [] [] |
+ bison-runtime | [] [] [] [] [] |
+ bluez-pin | [] [] [] [] [] |
+ cflow | |
+ clisp | [] [] |
+ console-tools | |
+ coreutils | [] [] [] [] [] [] |
+ cpio | [] [] [] |
+ cpplib | [] [] |
+ cryptonit | [] |
+ darkstat | [] () [] [] [] |
+ dialog | [] [] [] [] [] [] [] [] |
+ diffutils | [] [] [] [] [] [] [] [] [] |
+ doodle | [] [] |
+ e2fsprogs | [] [] [] |
+ enscript | [] [] [] |
+ error | [] [] [] [] [] |
+ fetchmail | [] |
+ fileutils | [] [] [] [] [] [] |
+ findutils | [] [] [] [] |
+ flex | [] [] [] |
+ fslint | [] |
+ gas | [] [] |
+ gawk | [] [] [] [] |
+ gbiff | [] |
+ gcal | [] [] |
+ gcc | [] |
+ gettext-examples | [] [] [] [] [] |
+ gettext-runtime | [] [] [] [] [] [] |
+ gettext-tools | [] [] [] |
+ gimp-print | [] [] |
+ gip | [] [] [] |
+ gliv | () |
+ glunarclock | [] [] [] |
+ gmult | [] [] [] |
+ gnubiff | () () |
+ gnucash | () () () |
+ gnucash-glossary | [] [] |
+ gnuedu | [] |
+ gnulib | [] [] [] [] [] [] [] [] |
+ gnunet-gtk | |
+ gnutls | |
+ gpe-aerial | [] [] |
+ gpe-beam | [] [] |
+ gpe-calendar | [] [] [] [] |
+ gpe-clock | [] [] [] [] |
+ gpe-conf | [] |
+ gpe-contacts | [] [] |
+ gpe-edit | [] [] [] [] |
+ gpe-filemanager | [] |
+ gpe-go | [] [] [] |
+ gpe-login | [] [] [] |
+ gpe-ownerinfo | [] [] [] [] [] |
+ gpe-package | [] |
+ gpe-sketchbook | [] [] |
+ gpe-su | [] [] [] [] |
+ gpe-taskmanager | [] [] [] |
+ gpe-timesheet | [] [] [] [] |
+ gpe-today | [] [] [] [] |
+ gpe-todo | [] |
+ gphoto2 | [] [] [] [] [] |
+ gprof | [] [] [] [] |
+ gpsdrive | () () [] () |
+ gramadoir | [] [] |
+ grep | [] [] [] [] [] [] [] [] [] [] [] [] |
+ gretl | [] [] [] |
+ gsasl | [] |
+ gss | [] |
+ gst-plugins | [] [] [] |
+ gst-plugins-base | [] [] |
+ gst-plugins-good | [] [] [] |
+ gstreamer | [] [] [] |
+ gtick | [] [] [] [] [] |
+ gtkam | [] [] [] [] |
+ gtkorphan | [] [] |
+ gtkspell | [] [] [] [] [] [] |
+ gutenprint | [] |
+ hello | [] [] [] [] [] [] [] [] [] [] [] [] [] |
+ id-utils | [] [] [] [] [] |
+ impost | [] [] |
+ indent | [] [] [] [] [] [] [] [] [] [] |
+ iso_3166 | [] [] [] |
+ iso_3166_1 | [] [] [] [] [] [] [] |
+ iso_3166_2 | [] |
+ iso_3166_3 | [] |
+ iso_4217 | [] [] [] [] |
+ iso_639 | [] [] [] [] [] |
+ jpilot | [] [] |
+ jtag | [] |
+ jwhois | [] [] [] [] [] |
+ kbd | [] [] |
+ keytouch | [] |
+ keytouch-editor | [] |
+ keytouch-keyboa... | [] |
+ latrine | [] [] [] |
+ ld | [] [] |
+ leafpad | [] [] [] [] [] [] |
+ libc | [] [] [] [] [] |
+ libexif | [] |
+ libextractor | [] |
+ libgpewidget | [] [] [] [] [] |
+ libgpg-error | |
+ libgphoto2 | [] [] [] |
+ libgphoto2_port | [] [] |
+ libgsasl | [] [] |
+ libiconv | [] |
+ libidn | [] [] |
+ lifelines | () |
+ lilypond | [] |
+ lingoteach | [] [] [] |
+ lynx | [] [] [] |
+ m4 | [] [] [] [] |
+ mailutils | [] [] |
+ make | [] [] [] [] [] [] [] [] |
+ man-db | () |
+ minicom | [] [] [] [] |
+ mysecretdiary | [] [] [] |
+ nano | [] () [] [] [] [] |
+ nano_1_0 | [] [] [] [] [] |
+ opcodes | [] [] [] [] |
+ parted | [] [] [] [] |
+ pilot-qof | |
+ psmisc | [] [] [] |
+ pwdutils | |
+ python | |
+ qof | |
+ radius | [] [] |
+ recode | [] [] [] [] [] [] [] [] |
+ rpm | [] [] |
+ screem | |
+ scrollkeeper | [] [] [] |
+ sed | [] [] [] [] [] |
+ sh-utils | [] [] [] [] [] [] [] |
+ shared-mime-info | [] [] [] [] [] [] |
+ sharutils | [] [] [] [] [] [] [] [] |
+ shishi | |
+ silky | [] |
+ skencil | [] [] |
+ sketch | [] [] |
+ solfege | [] |
+ soundtracker | [] [] [] |
+ sp | [] |
+ stardict | [] |
+ system-tools-ba... | [] [] [] [] [] [] [] [] |
+ tar | [] [] [] [] [] [] |
+ texinfo | [] [] |
+ textutils | [] [] [] [] [] |
+ tin | [] () |
+ tp-robot | [] [] [] [] |
+ tuxpaint | [] [] |
+ unicode-han-tra... | |
+ unicode-transla... | [] [] |
+ util-linux | [] [] [] [] [] [] [] |
+ vorbis-tools | [] [] |
+ wastesedge | () |
+ wdiff | [] [] [] [] [] [] [] [] |
+ wget | [] [] [] [] [] [] [] [] |
+ xchat | [] [] [] [] [] [] [] [] |
+ xkeyboard-config | [] [] [] [] |
+ xpad | [] [] [] |
+ +--------------------------------------------------+
+ es et eu fa fi fr ga gl gu he hi hr hu id is it
+ 89 21 16 2 41 119 61 14 1 8 1 6 61 30 0 53
+
+ ja ko ku ky lg lt lv mk mn ms mt nb ne nl nn no
+ +--------------------------------------------------+
+ GNUnet | |
+ a2ps | () [] [] () |
+ aegis | () |
+ ant-phone | [] |
+ anubis | [] [] [] |
+ ap-utils | [] |
+ aspell | [] [] |
+ bash | [] |
+ batchelor | [] [] |
+ bfd | |
+ bibshelf | [] |
+ binutils | |
+ bison | [] [] [] |
+ bison-runtime | [] [] [] |
+ bluez-pin | [] [] [] |
+ cflow | |
+ clisp | [] |
+ console-tools | |
+ coreutils | [] |
+ cpio | |
+ cpplib | [] |
+ cryptonit | [] |
+ darkstat | [] [] |
+ dialog | [] [] |
+ diffutils | [] [] [] |
+ doodle | |
+ e2fsprogs | [] |
+ enscript | [] |
+ error | [] |
+ fetchmail | [] [] |
+ fileutils | [] [] |
+ findutils | [] |
+ flex | [] [] |
+ fslint | [] [] |
+ gas | |
+ gawk | [] [] |
+ gbiff | [] |
+ gcal | |
+ gcc | |
+ gettext-examples | [] [] |
+ gettext-runtime | [] [] [] |
+ gettext-tools | [] [] |
+ gimp-print | [] [] |
+ gip | [] [] |
+ gliv | [] |
+ glunarclock | [] [] |
+ gmult | [] [] |
+ gnubiff | |
+ gnucash | () () |
+ gnucash-glossary | [] |
+ gnuedu | |
+ gnulib | [] [] [] [] |
+ gnunet-gtk | |
+ gnutls | |
+ gpe-aerial | [] |
+ gpe-beam | [] |
+ gpe-calendar | [] |
+ gpe-clock | [] [] |
+ gpe-conf | [] [] |
+ gpe-contacts | [] |
+ gpe-edit | [] [] |
+ gpe-filemanager | [] |
+ gpe-go | [] [] |
+ gpe-login | [] [] |
+ gpe-ownerinfo | [] |
+ gpe-package | [] |
+ gpe-sketchbook | [] [] |
+ gpe-su | [] [] |
+ gpe-taskmanager | [] [] [] |
+ gpe-timesheet | [] |
+ gpe-today | [] |
+ gpe-todo | |
+ gphoto2 | [] [] |
+ gprof | |
+ gpsdrive | () () () |
+ gramadoir | () |
+ grep | [] [] [] |
+ gretl | |
+ gsasl | [] |
+ gss | |
+ gst-plugins | [] |
+ gst-plugins-base | |
+ gst-plugins-good | [] |
+ gstreamer | [] |
+ gtick | [] |
+ gtkam | [] |
+ gtkorphan | [] |
+ gtkspell | [] [] |
+ gutenprint | |
+ hello | [] [] [] [] [] [] [] [] |
+ id-utils | [] |
+ impost | |
+ indent | [] [] |
+ iso_3166 | [] |
+ iso_3166_1 | [] [] |
+ iso_3166_2 | [] |
+ iso_3166_3 | [] |
+ iso_4217 | [] [] [] |
+ iso_639 | [] [] |
+ jpilot | () () () |
+ jtag | |
+ jwhois | [] |
+ kbd | [] |
+ keytouch | [] |
+ keytouch-editor | |
+ keytouch-keyboa... | |
+ latrine | [] |
+ ld | |
+ leafpad | [] [] |
+ libc | [] [] [] [] [] |
+ libexif | |
+ libextractor | |
+ libgpewidget | [] |
+ libgpg-error | |
+ libgphoto2 | [] |
+ libgphoto2_port | [] |
+ libgsasl | [] |
+ libiconv | |
+ libidn | [] [] |
+ lifelines | [] |
+ lilypond | |
+ lingoteach | [] |
+ lynx | [] [] |
+ m4 | [] [] |
+ mailutils | |
+ make | [] [] [] |
+ man-db | () |
+ minicom | [] |
+ mysecretdiary | [] |
+ nano | [] [] [] |
+ nano_1_0 | [] [] [] |
+ opcodes | [] |
+ parted | [] [] |
+ pilot-qof | |
+ psmisc | [] [] [] |
+ pwdutils | |
+ python | |
+ qof | |
+ radius | |
+ recode | [] |
+ rpm | [] [] |
+ screem | [] |
+ scrollkeeper | [] [] [] [] |
+ sed | [] [] |
+ sh-utils | [] [] |
+ shared-mime-info | [] [] [] [] [] |
+ sharutils | [] [] |
+ shishi | |
+ silky | [] |
+ skencil | |
+ sketch | |
+ solfege | |
+ soundtracker | |
+ sp | () |
+ stardict | [] [] |
+ system-tools-ba... | [] [] [] [] |
+ tar | [] [] [] |
+ texinfo | [] [] [] |
+ textutils | [] [] [] |
+ tin | |
+ tp-robot | [] |
+ tuxpaint | [] |
+ unicode-han-tra... | |
+ unicode-transla... | |
+ util-linux | [] [] |
+ vorbis-tools | [] |
+ wastesedge | [] |
+ wdiff | [] [] |
+ wget | [] [] |
+ xchat | [] [] [] [] |
+ xkeyboard-config | [] |
+ xpad | [] [] [] |
+ +--------------------------------------------------+
+ ja ko ku ky lg lt lv mk mn ms mt nb ne nl nn no
+ 40 24 2 1 1 3 1 2 3 21 0 15 1 101 5 3
+
+ nso or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta
+ +------------------------------------------------------+
+ GNUnet | |
+ a2ps | () [] [] [] [] [] [] |
+ aegis | () () |
+ ant-phone | [] [] |
+ anubis | [] [] [] |
+ ap-utils | () |
+ aspell | [] [] |
+ bash | [] [] [] |
+ batchelor | [] [] |
+ bfd | |
+ bibshelf | [] |
+ binutils | [] [] |
+ bison | [] [] [] [] [] |
+ bison-runtime | [] [] [] [] |
+ bluez-pin | [] [] [] [] [] [] [] [] [] |
+ cflow | [] |
+ clisp | [] |
+ console-tools | [] |
+ coreutils | [] [] [] [] |
+ cpio | [] [] [] |
+ cpplib | [] |
+ cryptonit | [] [] |
+ darkstat | [] [] [] [] [] [] |
+ dialog | [] [] [] [] [] [] [] [] [] |
+ diffutils | [] [] [] [] [] [] |
+ doodle | [] [] |
+ e2fsprogs | [] [] |
+ enscript | [] [] [] [] [] |
+ error | [] [] [] [] |
+ fetchmail | [] [] [] |
+ fileutils | [] [] [] [] [] |
+ findutils | [] [] [] [] [] [] |
+ flex | [] [] [] [] [] |
+ fslint | [] [] [] [] |
+ gas | |
+ gawk | [] [] [] [] |
+ gbiff | [] |
+ gcal | [] |
+ gcc | [] |
+ gettext-examples | [] [] [] [] [] [] [] [] |
+ gettext-runtime | [] [] [] [] [] [] [] [] |
+ gettext-tools | [] [] [] [] [] [] [] |
+ gimp-print | [] [] |
+ gip | [] [] [] [] |
+ gliv | [] [] [] [] |
+ glunarclock | [] [] [] [] [] [] |
+ gmult | [] [] [] [] |
+ gnubiff | () |
+ gnucash | () [] |
+ gnucash-glossary | [] [] [] |
+ gnuedu | |
+ gnulib | [] [] [] [] [] |
+ gnunet-gtk | [] |
+ gnutls | [] [] |
+ gpe-aerial | [] [] [] [] [] [] [] |
+ gpe-beam | [] [] [] [] [] [] [] |
+ gpe-calendar | [] [] [] [] [] [] [] [] |
+ gpe-clock | [] [] [] [] [] [] [] [] |
+ gpe-conf | [] [] [] [] [] [] [] |
+ gpe-contacts | [] [] [] [] [] |
+ gpe-edit | [] [] [] [] [] [] [] [] |
+ gpe-filemanager | [] [] |
+ gpe-go | [] [] [] [] [] [] |
+ gpe-login | [] [] [] [] [] [] [] [] |
+ gpe-ownerinfo | [] [] [] [] [] [] [] [] |
+ gpe-package | [] [] |
+ gpe-sketchbook | [] [] [] [] [] [] [] [] |
+ gpe-su | [] [] [] [] [] [] [] [] |
+ gpe-taskmanager | [] [] [] [] [] [] [] [] |
+ gpe-timesheet | [] [] [] [] [] [] [] [] |
+ gpe-today | [] [] [] [] [] [] [] [] |
+ gpe-todo | [] [] [] [] |
+ gphoto2 | [] [] [] [] [] |
+ gprof | [] [] [] |
+ gpsdrive | [] [] [] |
+ gramadoir | [] [] |
+ grep | [] [] [] [] [] [] [] [] |
+ gretl | [] |
+ gsasl | [] [] |
+ gss | [] [] [] |
+ gst-plugins | [] [] [] [] |
+ gst-plugins-base | [] |
+ gst-plugins-good | [] [] [] [] |
+ gstreamer | [] [] [] |
+ gtick | [] [] [] |
+ gtkam | [] [] [] [] |
+ gtkorphan | [] |
+ gtkspell | [] [] [] [] [] [] [] [] |
+ gutenprint | [] |
+ hello | [] [] [] [] [] [] [] [] |
+ id-utils | [] [] [] [] |
+ impost | [] |
+ indent | [] [] [] [] [] [] |
+ iso_3166 | [] [] [] [] [] [] |
+ iso_3166_1 | [] [] [] [] |
+ iso_3166_2 | |
+ iso_3166_3 | [] [] [] [] |
+ iso_4217 | [] [] [] [] |
+ iso_639 | [] [] [] [] |
+ jpilot | |
+ jtag | [] |
+ jwhois | [] [] [] [] |
+ kbd | [] [] [] |
+ keytouch | [] |
+ keytouch-editor | [] |
+ keytouch-keyboa... | [] |
+ latrine | [] [] |
+ ld | [] |
+ leafpad | [] [] [] [] [] [] |
+ libc | [] [] [] [] [] |
+ libexif | [] |
+ libextractor | [] [] |
+ libgpewidget | [] [] [] [] [] [] [] |
+ libgpg-error | [] [] |
+ libgphoto2 | [] |
+ libgphoto2_port | [] [] [] |
+ libgsasl | [] [] [] [] |
+ libiconv | |
+ libidn | [] [] () |
+ lifelines | [] [] |
+ lilypond | |
+ lingoteach | [] |
+ lynx | [] [] [] |
+ m4 | [] [] [] [] [] |
+ mailutils | [] [] [] [] |
+ make | [] [] [] [] |
+ man-db | [] [] |
+ minicom | [] [] [] [] [] |
+ mysecretdiary | [] [] [] [] |
+ nano | [] [] |
+ nano_1_0 | [] [] [] [] |
+ opcodes | [] [] |
+ parted | [] |
+ pilot-qof | [] |
+ psmisc | [] [] |
+ pwdutils | [] [] |
+ python | |
+ qof | [] |
+ radius | [] [] |
+ recode | [] [] [] [] [] [] [] |
+ rpm | [] [] [] [] |
+ screem | |
+ scrollkeeper | [] [] [] [] [] [] [] |
+ sed | [] [] [] [] [] [] [] [] [] |
+ sh-utils | [] [] [] |
+ shared-mime-info | [] [] [] [] [] |
+ sharutils | [] [] [] [] |
+ shishi | [] |
+ silky | [] |
+ skencil | [] [] [] |
+ sketch | [] [] [] |
+ solfege | [] |
+ soundtracker | [] [] |
+ sp | |
+ stardict | [] [] [] |
+ system-tools-ba... | [] [] [] [] [] [] [] [] [] |
+ tar | [] [] [] [] [] |
+ texinfo | [] [] [] [] |
+ textutils | [] [] [] |
+ tin | () |
+ tp-robot | [] |
+ tuxpaint | [] [] [] [] [] |
+ unicode-han-tra... | |
+ unicode-transla... | |
+ util-linux | [] [] [] [] |
+ vorbis-tools | [] [] |
+ wastesedge | |
+ wdiff | [] [] [] [] [] [] |
+ wget | [] [] [] [] |
+ xchat | [] [] [] [] [] [] [] |
+ xkeyboard-config | [] [] |
+ xpad | [] [] [] |
+ +------------------------------------------------------+
+ nso or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta
+ 0 2 3 58 31 53 5 76 72 5 42 48 12 51 130 2
+
+ tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu
+ +---------------------------------------------------+
+ GNUnet | [] | 2
+ a2ps | [] [] [] | 19
+ aegis | | 0
+ ant-phone | [] [] | 6
+ anubis | [] [] [] | 11
+ ap-utils | () [] | 4
+ aspell | [] [] [] | 14
+ bash | [] | 11
+ batchelor | [] [] | 9
+ bfd | | 1
+ bibshelf | [] | 7
+ binutils | [] [] [] | 9
+ bison | [] [] [] | 19
+ bison-runtime | [] [] [] | 16
+ bluez-pin | [] [] [] [] [] [] | 28
+ cflow | [] [] | 4
+ clisp | | 6
+ console-tools | [] [] | 5
+ coreutils | [] [] | 17
+ cpio | [] [] [] | 9
+ cpplib | [] [] [] [] | 11
+ cryptonit | | 5
+ darkstat | [] () () | 15
+ dialog | [] [] [] [] [] | 30
+ diffutils | [] [] [] [] | 28
+ doodle | [] | 6
+ e2fsprogs | [] [] | 10
+ enscript | [] [] [] | 16
+ error | [] [] [] [] | 18
+ fetchmail | [] [] | 12
+ fileutils | [] [] [] | 18
+ findutils | [] [] [] | 17
+ flex | [] [] | 15
+ fslint | [] | 9
+ gas | [] | 3
+ gawk | [] [] | 15
+ gbiff | [] | 5
+ gcal | [] | 5
+ gcc | [] [] [] | 6
+ gettext-examples | [] [] [] [] [] [] | 26
+ gettext-runtime | [] [] [] [] [] [] | 28
+ gettext-tools | [] [] [] [] [] | 19
+ gimp-print | [] [] | 12
+ gip | [] [] | 12
+ gliv | [] [] | 8
+ glunarclock | [] [] [] | 15
+ gmult | [] [] [] [] | 15
+ gnubiff | [] | 1
+ gnucash | () | 2
+ gnucash-glossary | [] [] | 9
+ gnuedu | [] | 2
+ gnulib | [] [] [] [] [] | 28
+ gnunet-gtk | | 1
+ gnutls | | 2
+ gpe-aerial | [] [] | 14
+ gpe-beam | [] [] | 14
+ gpe-calendar | [] [] [] [] | 19
+ gpe-clock | [] [] [] [] | 20
+ gpe-conf | [] [] | 14
+ gpe-contacts | [] [] | 10
+ gpe-edit | [] [] [] [] | 19
+ gpe-filemanager | [] | 5
+ gpe-go | [] [] | 14
+ gpe-login | [] [] [] [] [] | 20
+ gpe-ownerinfo | [] [] [] [] | 20
+ gpe-package | [] | 5
+ gpe-sketchbook | [] [] | 16
+ gpe-su | [] [] [] | 19
+ gpe-taskmanager | [] [] [] | 19
+ gpe-timesheet | [] [] [] [] | 18
+ gpe-today | [] [] [] [] [] | 20
+ gpe-todo | [] | 6
+ gphoto2 | [] [] [] [] | 20
+ gprof | [] [] | 11
+ gpsdrive | | 4
+ gramadoir | [] | 7
+ grep | [] [] [] [] | 33
+ gretl | | 4
+ gsasl | [] [] | 6
+ gss | [] | 5
+ gst-plugins | [] [] [] | 15
+ gst-plugins-base | [] [] [] | 9
+ gst-plugins-good | [] [] [] | 18
+ gstreamer | [] [] [] | 17
+ gtick | [] | 11
+ gtkam | [] | 13
+ gtkorphan | [] | 7
+ gtkspell | [] [] [] [] [] [] | 26
+ gutenprint | | 3
+ hello | [] [] [] [] [] | 39
+ id-utils | [] [] | 14
+ impost | [] | 4
+ indent | [] [] [] [] | 25
+ iso_3166 | [] [] [] | 15
+ iso_3166_1 | [] [] | 20
+ iso_3166_2 | | 2
+ iso_3166_3 | [] [] | 9
+ iso_4217 | [] [] | 14
+ iso_639 | [] | 14
+ jpilot | [] [] [] [] | 7
+ jtag | [] | 3
+ jwhois | [] [] [] | 13
+ kbd | [] [] | 12
+ keytouch | [] | 4
+ keytouch-editor | | 2
+ keytouch-keyboa... | | 2
+ latrine | [] [] | 8
+ ld | [] [] [] [] | 8
+ leafpad | [] [] [] [] | 23
+ libc | [] [] [] | 23
+ libexif | [] | 4
+ libextractor | [] | 5
+ libgpewidget | [] [] [] | 19
+ libgpg-error | [] | 4
+ libgphoto2 | [] | 8
+ libgphoto2_port | [] [] [] | 11
+ libgsasl | [] | 8
+ libiconv | [] | 4
+ libidn | [] [] | 10
+ lifelines | | 4
+ lilypond | | 2
+ lingoteach | [] | 6
+ lynx | [] [] [] | 15
+ m4 | [] [] [] | 18
+ mailutils | [] | 8
+ make | [] [] [] | 20
+ man-db | [] | 6
+ minicom | [] | 14
+ mysecretdiary | [] [] | 12
+ nano | [] [] | 15
+ nano_1_0 | [] [] [] | 18
+ opcodes | [] [] | 10
+ parted | [] [] [] | 10
+ pilot-qof | [] | 3
+ psmisc | [] | 10
+ pwdutils | [] | 3
+ python | | 0
+ qof | [] | 2
+ radius | [] | 6
+ recode | [] [] [] | 25
+ rpm | [] [] [] [] | 14
+ screem | [] | 2
+ scrollkeeper | [] [] [] [] | 26
+ sed | [] [] [] | 22
+ sh-utils | [] | 15
+ shared-mime-info | [] [] [] [] | 23
+ sharutils | [] [] [] | 23
+ shishi | | 1
+ silky | [] | 4
+ skencil | [] | 7
+ sketch | | 6
+ solfege | | 2
+ soundtracker | [] [] | 9
+ sp | [] | 3
+ stardict | [] [] [] [] | 11
+ system-tools-ba... | [] [] [] [] [] [] [] | 37
+ tar | [] [] [] [] | 19
+ texinfo | [] [] [] | 15
+ textutils | [] [] [] | 17
+ tin | | 1
+ tp-robot | [] [] [] | 10
+ tuxpaint | [] [] [] | 16
+ unicode-han-tra... | | 0
+ unicode-transla... | | 2
+ util-linux | [] [] [] | 20
+ vorbis-tools | [] [] | 11
+ wastesedge | | 1
+ wdiff | [] [] | 22
+ wget | [] [] [] | 19
+ xchat | [] [] [] [] | 28
+ xkeyboard-config | [] [] [] [] | 11
+ xpad | [] [] [] | 14
+ +---------------------------------------------------+
+ 77 teams tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu
+ 172 domains 0 1 1 78 39 0 135 13 1 50 3 54 0 2054
+
+ Some counters in the preceding matrix are higher than the number of
+visible blocks let us expect. This is because a few extra PO files are
+used for implementing regional variants of languages, or language
+dialects.
+
+ For a PO file in the matrix above to be effective, the package to
+which it applies should also have been internationalized and
+distributed as such by its maintainer. There might be an observable
+lag between the mere existence a PO file and its wide availability in a
+distribution.
+
+ If July 2006 seems to be old, you may fetch a more recent copy of
+this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date
+matrix with full percentage details can be found at
+`http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'.
+
+1.6 Using `gettext' in new packages
+===================================
+
+If you are writing a freely available program and want to
+internationalize it you are welcome to use GNU `gettext' in your
+package. Of course you have to respect the GNU Library General Public
+License which covers the use of the GNU `gettext' library. This means
+in particular that even non-free programs can use `libintl' as a shared
+library, whereas only free software can use `libintl' as a static
+library or use modified versions of `libintl'.
+
+ Once the sources are changed appropriately and the setup can handle
+the use of `gettext' the only thing missing are the translations. The
+Free Translation Project is also available for packages which are not
+developed inside the GNU project. Therefore the information given above
+applies also for every other Free Software Project. Contact
+`translation@iro.umontreal.ca' to make the `.pot' files available to
+the translation teams.
+
diff --git a/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/AUTHORS b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/AUTHORS
new file mode 100644
index 0000000..4474df9
--- /dev/null
+++ b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/AUTHORS
@@ -0,0 +1,5 @@
+GNU Sed was first authored by Jay Fenlason (hack@gnu.org)
+and later modified by Tom Lord (lord@gnu.org).
+
+It is currently being maintained by Ken Pizzini (ken@gnu.org)
+and Paolo Bonzini (bonzini@gnu.org).
diff --git a/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/BUGS b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/BUGS
new file mode 100644
index 0000000..138f3cd
--- /dev/null
+++ b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/BUGS
@@ -0,0 +1,133 @@
+* ABOUT BUGS
+
+Before reporting a bug, please check the list of known bugs
+and the list of oft-reported non-bugs (below).
+
+Bugs and comments may be sent to bonzini@gnu.org; please
+include in the Subject: header the first line of the output of
+``sed --version''.
+
+Please do not send a bug report like this:
+
+ [while building frobme-1.3.4]
+ $ configure
+ sed: file sedscr line 1: Unknown option to 's'
+
+If sed doesn't configure your favorite package, take a few extra
+minutes to identify the specific problem and make a stand-alone test
+case.
+
+A stand-alone test case includes all the data necessary to perform the
+test, and the specific invocation of sed that causes the problem. The
+smaller a stand-alone test case is, the better. A test case should
+not involve something as far removed from sed as ``try to configure
+frobme-1.3.4''. Yes, that is in principle enough information to look
+for the bug, but that is not a very practical prospect.
+
+
+
+* NON-BUGS
+
+`N' command on the last line
+
+ Most versions of sed exit without printing anything when the `N'
+ command is issued on the last line of a file. GNU sed instead
+ prints pattern space before exiting unless of course the `-n'
+ command switch has been specified. More information on the reason
+ behind this choice can be found in the Info manual.
+
+
+regex syntax clashes (problems with backslashes)
+
+ sed uses the Posix basic regular expression syntax. According to
+ the standard, the meaning of some escape sequences is undefined in
+ this syntax; notable in the case of GNU sed are `\|', `\+', `\?',
+ `\`', `\'', `\<', `\>', `\b', `\B', `\w', and `\W'.
+
+ As in all GNU programs that use Posix basic regular expressions, sed
+ interprets these escape sequences as meta-characters. So, `x\+'
+ matches one or more occurrences of `x'. `abc\|def' matches either
+ `abc' or `def'.
+
+ This syntax may cause problems when running scripts written for other
+ seds. Some sed programs have been written with the assumption that
+ `\|' and `\+' match the literal characters `|' and `+'. Such scripts
+ must be modified by removing the spurious backslashes if they are to
+ be used with recent versions of sed (not only GNU sed).
+
+ On the other hand, some scripts use `s|abc\|def||g' to remove occurrences
+ of _either_ `abc' or `def'. While this worked until sed 4.0.x, newer
+ versions interpret this as removing the string `abc|def'. This is
+ again undefined behavior according to POSIX, but this interpretation
+ is arguably more robust: the older one, for example, required that
+ the regex matcher parsed `\/' as `/' in the common case of escaping
+ a slash, which is again undefined behavior; the new behavior avoids
+ this, and this is good because the regex matcher is only partially
+ under our control.
+
+ In addition, GNU sed supports several escape characters (some of
+ which are multi-character) to insert non-printable characters
+ in scripts (`\a', `\c', `\d', `\o', `\r', `\t', `\v', `\x'). These
+ can cause similar problems with scripts written for other seds.
+
+
+-i clobbers read-only files
+
+ In short, `sed d -i' will let one delete the contents of
+ a read-only file, and in general the `-i' option will let
+ one clobber protected files. This is not a bug, but rather a
+ consequence of how the Unix filesystem works.
+
+ The permissions on a file say what can happen to the data
+ in that file, while the permissions on a directory say what can
+ happen to the list of files in that directory. `sed -i'
+ will not ever open for writing a file that is already on disk,
+ rather, it will work on a temporary file that is finally renamed
+ to the original name: if you rename or delete files, you're actually
+ modifying the contents of the directory, so the operation depends on
+ the permissions of the directory, not of the file). For this same
+ reason, sed will not let one use `-i' on a writeable file in a
+ read-only directory, and will break hard or symbolic links when
+ `-i' is used on such a file.
+
+
+`0a' does not work (gives an error)
+
+ There is no line 0. 0 is a special address that is only used to treat
+ addresses like `0,/RE/' as active when the script starts: if you
+ write `1,/abc/d' and the first line includes the word `abc', then
+ that match would be ignored because address ranges must span at least
+ two lines (barring the end of the file); but what you probably wanted is
+ to delete every line up to the first one including `abc', and this
+ is obtained with `0,/abc/d'.
+
+
+`[a-z]' is case insensitive
+`s/.*//' does not clear pattern space
+
+ You are encountering problems with locales. POSIX mandates that `[a-z]'
+ uses the current locale's collation order -- in C parlance, that means
+ strcoll(3) instead of strcmp(3). Some locales have a case insensitive
+ strcoll, others don't.
+
+ Another problem is that [a-z] tries to use collation symbols. This
+ only happens if you are on the GNU system, using GNU libc's regular
+ expression matcher instead of compiling the one supplied with GNU sed.
+ In a Danish locale, for example, the regular expression `^[a-z]$'
+ matches the string `aa', because `aa' is a single collating symbol that
+ comes after `a' and before `b'; `ll' behaves similarly in Spanish
+ locales, or `ij' in Dutch locales.
+
+ Another common localization-related problem happens if your input stream
+ includes invalid multibyte sequences. POSIX mandates that such
+ sequences are _not_ matched by `.', so that `s/.*//' will not clear
+ pattern space as you would expect. In fact, there is no way to clear
+ sed's buffers in the middle of the script in most multibyte locales
+ (including UTF-8 locales). For this reason, GNU sed provides a `z'
+ command (for `zap') as an extension.
+
+ However, to work around both of these problems, which may cause bugs
+ in shell scripts, you can set the LC_ALL environment variable to `C',
+ or set the locale on a more fine-grained basis with the other LC_*
+ environment variables.
+
diff --git a/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/COPYING b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/COPYING
new file mode 100644
index 0000000..4432540
--- /dev/null
+++ b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/COPYING
@@ -0,0 +1,676 @@
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
diff --git a/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/ChangeLog b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/ChangeLog
new file mode 100644
index 0000000..dcfb5f5
--- /dev/null
+++ b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/ChangeLog
@@ -0,0 +1,3185 @@
+2009-06-27 Paolo Bonzini <bonzini@gnu.org>
+
+ * configure.ac: Bump version.
+ * NEWS: Bump version.
+ * gnulib: Update.
+ * doc/sed.1: Regenerate.
+
+2009-06-25 Paolo Bonzini <bonzini@gnu.org>
+
+ * autoboot.conf: Add selinux-h.
+ * execute.c: Copy over file creation context before creating a new file.
+
+2009-06-25 Paolo Bonzini <bonzini@gnu.org>
+
+ * execute.c: Do not copy ACLs until the file is copied.
+ * utils.c (ck_mkstemp): Set a restrictive umask on temporary files.
+
+2009-06-26 Paolo Bonzini <bonzini@gnu.org>
+
+ * autoboot: Do not use GIT_CONFIG_LOCAL.
+
+2009-06-15 Paolo Bonzini <bonzini@gnu.org>
+
+ * autoboot.conf: Add memchr again.
+ * gnulib: Update.
+
+2009-06-11 Sergey Farbotka <z8sergey8z@gmail.com> (tiny change)
+
+ * sed/execute.c (open_next_file): Fix off-by-one causing problems
+ under Cygwin.
+
+2009-05-11 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/compile.c (snarf_char_class): Fix logic bug with [[[ in regular
+ expressions (and a possibly uninitialized use of variable delim stemming
+ from the bug). Uninitialized variable bug reported by Zhongxing Xu.
+ * testsuite/brackets.good: New.
+ * testsuite/brackets.inp: New.
+ * testsuite/brackets.sed: New.
+ * testsuite/Makefile.am: Add test.
+ * testsuite/Makefile.tests: Add test.
+
+2009-05-11 Paolo Bonzini <bonzini@gnu.org>
+
+ * configure.ac: Define COPYRIGHT_YEAR.
+ * Makefile.am (dist-hook): Test it.
+ * sed/mbcs.c: Fix copyright years.
+ * sed/sed.c: Fix copyright years. Change COPYRIGHT_NOTICE to
+ COPYRIGHT_YEAR.
+ * sed/utils.c: Fix copyright years.
+ * testsuite/version.gin: Use COPYRIGHT_YEAR.
+
+2009-04-30 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/compile.c: Declare bool arguments as int instead to please AIX XLC.
+ * sed/execute.c: Declare bool arguments as int instead to please AIX XLC.
+ * sed/utils.c: Declare bool arguments as int instead to please AIX XLC.
+ * sed/utils.h: Declare bool arguments as int instead to please AIX XLC.
+
+2009-04-27 Paolo Bonzini <bonzini@gnu.org>
+
+ * configure.ac: Bump version number.
+ * configure: Regenerate.
+
+2009-04-27 Paolo Bonzini <bonzini@gnu.org>
+
+ * configure.ac: Do not create homonymous links from builddir to srcdir.
+ * testsuite/Makefile.tests: Create readin.in2 here.
+ * testsuite/Makefile.am: Do not distribute it.
+
+2009-04-27 Paolo Bonzini <bonzini@gnu.org>
+
+ * autoboot.conf: Add rename.
+ * gnulib: Update.
+
+2009-04-27 Paolo Bonzini <bonzini@gnu.org>
+
+ * configure.ac: XFAIL UTF-8 tests where appropriate.
+
+2009-04-27 Paolo Bonzini <bonzini@gnu.org>
+
+ * testsuite/Makefile.tests: Handle CRLF endings for mingw.
+
+2009-04-27 Paolo Bonzini <bonzini@gnu.org>
+
+ * configure.ac: Link readin.in2 into builddir.
+ * configure: Regenerate.
+ * doc/Makefile.am: Do not distribute sed.html. Do not update
+ sed.texi if the output does not change.
+ * sed/Makefile.am: Order libraries according to their dependencies.
+ * sed/compile.c (get_openfile): Declare FAIL as int.
+ * sed/sed.c: Avoid printf ("") if REG_PERL is not defined.
+ * testsuite/eval.in2: Do not include in the repository.
+ * testsuite/Makefile.am: Clean always eval.in2 and never readin.in2.
+ * testsuite/Makefile.tests: Provide a default empty definition of TIME
+ and remove rules for readin.in2.
+
+2009-03-31 Paolo Bonzini <bonzini@gnu.org>
+
+ * bootstrap.sh.in: Add __bool_true_false_are_defined.
+ * bootstrap.sh: Regenerate.
+ * basicdefs.h: Do not provide bool definitions for BOOTSTRAP at all.
+
+2009-03-31 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/sed.c (contact): New.
+ (usage): From here.
+ (main): Use it for `sed --version' too.
+
+ * configure.ac: Point to GNU project mailing lists.
+ * sed/sed.c (contact): Use PACKAGE_BUGREPORT.
+ * testsuite/version.gin: Likewise.
+ * testsuite/version.good: Regenerate.
+ * doc/sed.1: Regenerate.
+
+ * bootstrap.sh.in (PACKAGE_BUGREPORT): New.
+ * bootstrap.sh: Regenerate.
+
+2009-03-31 Paolo Bonzini <bonzini@gnu.org>
+
+ * testsuite/Makefile.am: Distribute utf8-3 and utf8-4 test files.
+
+2009-02-17 Paolo Bonzini <bonzini@gnu.org>
+
+ * testsuite/Makefile.tests: Rewrite rule for utf8-[1234].
+ Reported by Ralf Wildenhues.
+
+2009-02-17 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/sed.c (usage): Print homepage URL.
+ * testsuite/version.gin: Update.
+
+2009-01-28 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/sed.c (usage): Only print the bug report address for `sed --help'.
+ (main): Print it for `sed --version' too.
+ * testsuite/version.gin: Adapt.
+ * testsuite/Makefile.tests: Refine help message test.
+
+2009-01-23 Paolo Bonzini <bonzini@gnu.org>
+ Hideo AOKI <hideo.aoki.tk@hitachi.com>
+
+ * sed/compile.c (match_slash): Fix MBCS behavior.
+ * sed/sed.h (MBSINIT): New.
+
+2009-01-20 Paolo Bonzini <bonzini@gnu.org>
+
+ * autoboot.conf, bootstrap.sh.in: Remove memchr, memcmp, memmove
+ compatibility code.
+ * gnulib: Update.
+
+2009-01-09 Paolo Bonzini <bonzini@gnu.org>
+
+ * tests/SPENCER.tests: Add testcases for glibc bugzilla 697.
+ * gnulib: Update.
+
+2009-01-05 Paolo Bonzini <bonzini@gnu.org>
+
+ * execute.c (read_pattern_space): Reset hold space at end-of-file
+ if input->reset_at_next_file.
+
+2008-12-31 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ Let --posix turn off more GNU extensions.
+ * sed/compile.c (mark_subst_opts): Turn off subst options i, I,
+ s, S, x, X, m, and M in --posix mode.
+ (compile_address): Disallow address modifiers, `FIRST~STEP',
+ `ADDR1,+N', and `ADDR1,~N' in --posix mode.
+ (compile_program): In --posix mode, do not accept e or z commands;
+ do not accept text between an a, c, or i command and the following
+ backslash; do not accept an argument to the l command.
+
+2008-12-22 Paolo Bonzini <bonzini@gnu.org>
+
+ * autoboot.conf: Request modules emulating mb functions.
+ * configure.ac: Do not look for mb functions here.
+
+2008-10-03 Paolo Bonzini <bonzini@gnu.org>
+ Jim Meyering <meyering@redhat.com>
+
+ * autoboot.conf: Add localcharset.
+ * Makefile.am: Remove intl subdir. Require Automake 1.10.
+ * configure.ac: Remove useless macros, switch to external gettext.
+ * lib/Makefile.am: Remove intl subdir from CPPFLAGS.
+ * sed/Makefile.am: Remove intl subdir from CPPFLAGS.
+
+2008-10-02 Paolo Bonzini <bonzini@gnu.org>
+
+ * autoboot: Sync with gnulib's build-aux/bootstrap.
+
+2008-09-29 Paolo Bonzini <bonzini@gnu.org>
+
+ * autoboot: Sync with gnulib's build-aux/bootstrap.
+
+2008-09-29 Paolo Bonzini <bonzini@gnu.org>
+
+ * testsuite/Makefile.am: Add the utf8-{1,2,3,4} tests.
+ * testsuite/Makefile.tests: Add the utf8-{1,2,3,4} tests.
+ * testsuite/runtest: Support skipping tests.
+ * testsuite/utf8-1.good: New.
+ * testsuite/utf8-1.inp: New.
+ * testsuite/utf8-1.sed: New.
+ * testsuite/utf8-2.good: New.
+ * testsuite/utf8-2.inp: New.
+ * testsuite/utf8-2.sed: New.
+ * testsuite/utf8-3.good: New.
+ * testsuite/utf8-3.inp: New.
+ * testsuite/utf8-3.sed: New.
+ * testsuite/utf8-4.good: New.
+ * testsuite/utf8-4.inp: New.
+ * testsuite/utf8-4.sed: New.
+
+2008-09-29 Paolo Bonzini <bonzini@gnu.org>
+
+ * BUGS: Document s/.*.// behavior with invalid multibyte sequences.
+ * NEWS: Document `z' extension.
+ * doc/sed-in.texi: Document both things.
+ * sed/compile.c (compile_program): Recognize `z'.
+ * sed/execute.c (execute_program): Execute `z'.
+ * testsuite/Makefile.am: Add badenc test.
+ * testsuite/Makefile.tests: Add badenc test.
+ * testsuite/badenc.good: New.
+ * testsuite/badenc.inp: New.
+ * testsuite/badenc.sed: New.
+
+2008-09-28 Paolo Bonzini <bonzini@gnu.org>
+
+ * basicdefs.h: Replace alloca cruft with alloca.h.
+ * bootstrap.sh.in: Update for new gnulib.
+ * bootstrap.sh: Update for new gnulib.
+ * configure.ac: Move gnulib macros earlier.
+ * sed/execute.c: Do not include acl.h when bootstrapping.
+
+2008-08-27 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/execute.c (closedown): Close the input file!
+
+2008-08-20 Paolo Bonzini <bonzini@gnu.org>
+
+ * configure.ac: Add gl_DISABLE_THREADS.
+
+2008-08-20 Ralf Wildenhues <ralf.wildenhues@gmx.de
+
+ * doc/sed-in.texi: Drop leading whitespace where appropriate,
+ do not use TABs.
+ * doc/sed.texi: Regnerate.
+
+2008-08-19 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/compile.c: Do not include strverscmp.c.
+
+2008-07-21 Paolo Bonzini <bonzini@gnu.org>
+
+ * doc/sed-in.texi: Remove northpark.edu address for sed FAQ.
+ * doc/sed.texi: Regenerate.
+
+2008-07-10 Paolo Bonzini <bonzini@gnu.org>
+
+ * doc/sed-in.texi: Make the description of ^ and $ more precise.
+ * doc/sed.texi: Regenerate.
+
+2008-06-04 Vladimir Marek <vladimir.marek@sun.com>
+
+ * basicdefs.h: Don't hardcode usage of prototypes on SunStudio.
+
+2008-05-15 Paolo Bonzini <bonzini@gnu.org>
+
+ * autoboot.conf: Update for newer gnulib.
+
+2008-05-15 Paolo Bonzini <bonzini@gnu.org>
+
+ * bootstrap.sh.in: Define bool, true, false. Reported by
+ Jason Stover. Adjust for gnulib changes.
+ * bootstrap.sh: Regenerate.
+
+2008-04-24 Paul Eggert <eggert@twinsun.com>
+
+ * sed/compile.c (match_slash): Treat 's&foo&\&&' compatibly with
+ traditional 'sed'.
+ * testsuite/bsd.sh: Add test case for this.
+ * testsuite/bsd.good: Add test case output.
+
+2008-04-24 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/compile.c (setup_replacement): Fix bug with \& in POSIX mode.
+
+2008-01-16 Jim Meyering <meyering@redhat.com>
+
+ * sed/execute.c (open_next_file, get_backup_file_name): Avoid
+ warnings from gcc.
+
+2008-01-16 Jim Meyering <meyering@redhat.com>
+
+ * sed/compile.c (snarf_char_class): Reverse order of conjuncts
+ so that "delim" is not used uninitialized.
+
+2008-01-16 Jim Meyering <meyering@redhat.com>
+
+ * sed/utils.c (panic): Remove declaration of unused local, "fd".
+
+2008-01-16 Jim Meyering <meyering@redhat.com>
+
+ * sed/execute.c (open_next_file, get_backup_file_name): Avoid
+ warnings from gcc. Avoid shadowing global "pipe".
+
+2008-01-16 Jim Meyering <meyering@redhat.com>
+
+ * autoboot.conf (gnulib_modules): Add stat-macros and pathmax.
+
+2007-10-25 Paolo Bonzini <bonzini@gnu.org>
+ Mike Frysinger <vapier@gentoo.org>
+
+ * doc/sed.x (q, Q): Document argument.
+ * configure.ac: Remove texi2html checks.
+ * doc/Makefile.am: Remove rules for sed.html, always distribute it.
+
+2007-08-14 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/execute.c (open_next_file): Follow symlink here...
+ (closedown): ... not here.
+
+2007-06-29 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/mbcs.c: Upgrade to GPLv3.
+ * sed/regexp.c: Upgrade to GPLv3.
+ * sed/sed.c: Upgrade to GPLv3.
+ * sed/sed.h: Upgrade to GPLv3.
+ * sed/utils.c: Upgrade to GPLv3.
+ * sed/utils.h: Upgrade to GPLv3.
+ * sed/compile.c: Upgrade to GPLv3.
+ * sed/execute.c: Upgrade to GPLv3.
+ * sed/fmt.c: Upgrade to GPLv3.
+
+2007-03-01 Masatake YAMATO <jet@gyve.org> (tiny change)
+
+ * sed/compile.c (compile_program): Accept 0,/REGEXP/ address
+ specification only if --posix is not specified.
+
+2007-02-05 Paolo Bonzini <bonzini@gnu.org>
+
+ * testsuite/bug-regex27.c, testsuite/bug-regex28.c: New, from
+ glibc (written by Jakub Jelinek).
+
+2007-01-26 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/compile.c (check_final_program): Don't set text if the
+ pending_text is initialized but empty.
+ * sed/execute.c (output_line): Don't print text if it is NULL.
+ * testsuite/Makefile.am (TESTS): Add insert.
+ * testsuite/Makefile.tests (insert): New.
+ * testsuite/insert.good, testsuite/insert.sed, testsuite/insert.inp: New
+ testcase from Jonas Koelker.
+
+2006-12-29 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/compile.c: Fix warnings.
+ * sed/execute.c: Fix warnings.
+
+2006-12-22 Bruno Haible <bruno@clisp.org>
+
+ * sed/utils.c: Include pathmax.
+ * sed/mbcs.c: Use local_charset.
+ * sed/execute.c: Copy with padding after the mbstate_t member.
+
+2006-12-21 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/mbcs.c: Include string.h (reported by Henning Nielsen Lund).
+ * sed/fmt.c: Likewise.
+ * sed/regexp.c: Likewise.
+
+2006-12-18 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/execute.c (closedown): Remove dead code.
+
+2006-12-17 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/utils.c: Include limits.h.
+
+2006-12-16 Paolo Bonzini <bonzini@gnu.org>
+
+ * doc/sed-in.texi: Document --follow-symlinks.
+
+2006-12-15 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/regexp.c: Disable all extensions on --posix.
+
+2006-09-24 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/execute.c: Support ACLs.
+ * lib/utils.c: Move...
+ * sed/utils.c: ... here, and remove xmalloc.
+
+2006-08-21 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/regexp.c: Accept NUL bytes for `.'. Accept 'a\(b' in
+ POSIXLY_CORRECT/POSIXLY_BASIC posixicity.
+
+2006-08-03 Paolo Bonzini <bonzini@gnu.org>
+
+ Revert this part of the previous change:
+
+ 2006-08-03 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/compile.c (get_openfile): Change second argument to char
+ and turn it into a string within the function. Adjust callers.
+
+2006-08-03 Paolo Bonzini <bonzini@gnu.org>
+ Corinna Vinschen <vinschen@redhat.com>
+
+ * lib/getline.c (getline): Remove Windows special casing.
+ * lib/utils.c (register_open_file, ck_fdopen): New.
+ (ck_fopen, ck_mkstemp): Use register_open_file.
+ * lib/utils.h (ck_fdopen): New.
+ * sed/execute.c (open_next_file): Reopen stdin.
+ * sed/sed.h (read_mode): New.
+ * sed/sed.c (read_mode): New.
+ (main): Set it on --binary.
+ (usage): Document --binary.
+ * sed/compile.c (get_openfile): Change second argument to char
+ and turn it into a string within the function. Adjust callers.
+ * sed/execute.c (dump_append_queue, open_next_file): Use it
+ as mode for ck_fopen.
+
+2006-08-03 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/execute.c (str_append): Use is_utf8 to skip useless work.
+ * sed/mbcs.c (initialize_mbcs): Look for a UTF-8 locale.
+ (is_utf8): New.
+ * sed/sed.h (is_utf8): New.
+
+2006-07-13 Paolo Bonzini <bonzini@gnu.org>
+
+ * bootstrap.sh.in: Add a few autoconfy tests.
+ * Makefile.am: Update distributed bootstrap.sh.
+
+2006-05-15 Hans-Bernhard Broeker <broeker@physik.rwth-aachen.de>
+
+ * sed/basicdefs.h (OB_MALLOC): Turn VCAST into void * cast.
+
+2006-02-03 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/compile.c (compile_program) <case 'y'>: Pass false to match_slash.
+
+2005-09-07 Paolo Bonzini <bonzini@gnu.org>
+
+ * lib/regcomp.c: Update from upstream.
+ * lib/regex.c: Update from upstream.
+ * lib/regex_.h: Update from upstream.
+ * lib/regex_internal.c: Update from upstream.
+ * lib/regex_internal.h: Update from upstream.
+ * lib/regexec.c: Update from upstream.
+
+2005-08-30 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/execute.c (reset_addresses): Never activate ADDR_IS_NUM_MOD
+ addresses.
+ * testsuite/modulo.good, testsuite/modulo.inp, testsuite/modulo.sed:
+ New.
+ * testsuite/Makefile.tests: Add new testcase.
+ * testsuite/Makefile.am: Add new testcase.
+ * testsuite/Makefile.in: Regenerate.
+
+2005-05-18 Maciej W. Rozycki <macro@linux-mips.org>
+
+ * configure.ac: Use a cache variable for the libcP test.
+ * configure: Regenerate.
+
+2005-05-16 Eero Hakkinen <eero17@bigfoot.com>
+
+ * sed/compile.c (snarf_char_class): Fix handling of
+ [^]xyz].
+
+2005-04-04 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/execute.c (process_files): Do not add a default
+ command-line in in-place editing mode.
+
+2005-02-10 Paolo Bonzini <bonzini@gnu.org>
+
+ * testsuite/Makefile.tests: Add new testcase.
+ * testsuite/Makefile.am: Add new testcase.
+ * testsuite/Makefile.in: Regenerate.
+ * testsuite/appquit.good, testsuite/appquit.inp,
+ testsuite/appquit.sed: New testcase.
+ * testsuite/readin.sed: Quit after the last r command.
+ * testsuite/readin.good: Adjust.
+ * sed/execute.c (execute_program): Dump the results of the
+ a/r/R commands just before quitting.
+
+2005-02-10 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/regexp.c: Fix off-by-one error in the "invalid reference
+ to subexpression" message. Debian bug 294339.
+
+2005-02-08 Paolo Bonzini <bonzini@gnu.org>
+
+ * lib/obstack.h: include config.h.
+
+2005-02-01 Paolo Bonzini <bonzini@gnu.org>
+
+ * doc/Makefile.am: Don't enable MAKEINFO_HTML and TEXI2HTML_HTML
+ rules unless BUILD_HTML.
+
+2005-01-25 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/regexp.c: Fix building on GCC 2.95 and earlier.
+
+2004-12-26 Paolo Bonzini <bonzini@gnu.org>
+
+ Do not use leftmost-longest matching for addresses.
+
+ * NEWS: Add a note about this.
+ * testsuite/recall2.good, testsuite/recall2.inp,
+ testsuite/recall2.sed: New test.
+ * testsuite/Makefile.am, testsuite/Makefile.tests: Add the
+ recall2 test.
+ * sed/sed.h (struct regex): New.
+ (struct addr, struct subst, compile_regex, match_regex,
+ release_regex): Use it instead of regex_t.
+ * sed/compile.c (compile_program): Update for new meaning of
+ the third parameter of compile_regex.
+ * sed/execute.c (do_subst): Pass less conservative value to
+ the regsize parameter of match_regex.
+ * sed/regexp.c (compile_regex_1): New, extracted out of
+ compile_regex. The third parameter, needed_sub, now includes
+ \0 (so 10 means that \0 .. \9 are needed). Pass RE_NO_SUB
+ if needed_sub is zero.
+ (compile_regex): Accept a struct regex instead of a regex_t.
+ Save the regular expression's text.
+ (match_regex): Accept a struct regex instead of a regex_t.
+ Recompile the pattern if it was compiled with RE_NO_SUB.
+ (release_regex): Accept a struct regex instead of a regex_t.
+
+ * doc/Makefile.am: Generate sed.texi correctly when
+ building outside srcdir.
+
+2004-12-26 Paolo Bonzini <bonzini@gnu.org>
+
+ * BUGS: Add section about [a-z] matching uppercase characters,
+ and other locale issues.
+ * doc/sed-in.texi [!PERL]: Likewise.
+
+2004-11-15 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/execute.c (str_append_modified): Copy the first character
+ when using \l or \u in a multi-byte configuration. Use
+ WCRTOMB instead of wcrtomb.
+ * sed/sed.h (WCRTOMB): New.
+
+2004-11-11 Paolo Bonzini <bonzini@gnu.org>
+
+ * tst-rxspecer.c: Do not mix instructions and
+ declarations.
+ * basicdefs.h: Include locale.h before #defining
+ gettext, to avoid breakage under Solaris.
+ * sed/sed.c: do not include locale.h.
+
+2004-11-03 Paolo Bonzini <bonzini@gnu.org>
+
+ * bug-regex11.c: Improve portability.
+ * bug-regex12.c: Improve portability.
+ * bug-regex13.c: Improve portability.
+ * bug-regex14.c: Improve portability.
+ * bug-regex21.c: Improve portability.
+ * bug-regex9.c: Improve portability.
+ * tst-boost.c: Improve portability.
+ * tst-pcre.c: Improve portability.
+ * tst-regex.c: Improve portability.
+ * tst-rxspencer.c: Improve portability.
+
+2004-10-08 Paolo Bonzini <bonzini@gnu.org>
+
+ * lib/utils.c (utils_id_s): Renamed to open_files.
+ (struct id): Renamed to struct open_file.
+
+2004-10-08 Jakub Jelinek <jakub@redhat.com>
+
+ * testsuite/Makefile.tests (bug-regex*, run-tests,
+ run-ptests): Use $(SED).
+ (version): Likewise; prepend $(SED) invocation with $(SEDENV).
+
+2004-08-16 Paolo Bonzini <bonzini@gnu.org>
+
+ *** Version 4.1.2 released.
+
+2004-08-06 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/compile.c (bad_command): Fix off-by-one error.
+ (snarf_char_class): Fix problem with [.....[] (i.e.
+ last char in class is a bracket.
+
+2004-06-30 Paolo Bonzini <bonzini@gnu.org>
+
+ *** Version 4.1.1 released.
+
+2004-06-29 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/compile.c (mark_subst_opts): Return int.
+ * sed/execute.c (open_next_file): Fix uninitialized
+ variable.
+
+2004-06-10 Paolo Bonzini <bonzini@gnu.org>
+
+ *** Version 4.1 released.
+
+2004-03-25 Paolo Bonzini <bonzini@gnu.org>
+
+ * lib/obstack.h: Get current version.
+
+2004-03-13 Paolo Bonzini <bonzini@gnu.org>
+
+ Exit as soon as possible on an I/O error, and with
+ a better error message.
+
+ * lib/utils.c (ck_mkstemp, ck_rename, ck_getline): New
+ functions. Save temporary files into utils_id_s.
+ (struct id): Add a field named temp.
+ (ck_fopen): Init the new temp field of struct id.
+ (panic): Unlink temporary files before exiting.
+ * sed/execute.c (read_file_line): Use ck_getline.
+ (closedown): Use ck_rename.
+ (open_next_file): Use ck_mkstemp.
+
+2004-01-20 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/sed.h (enum addr_state): New definition.
+ (enum addr_type): Remove ADDR_IS_NUM2.
+ (struct sed_cmd): Replace a1_matched with range_state.
+ * sed/compile.c (next_cmd_entry): Use range_state.
+ (compile_program): Death to ADDR_IS_NUM2. Compile
+ N,Mp as Np if N>=M.
+ * sed/execute.c (match_address_p): Rewritten. Handle
+ ADDR_IS_NUM here.
+ (match_an_address_p): Suit to new match_address_p.
+ (execute_program): Adjust to use range_state in `c'.
+ Handle addr_bang here.
+ (reset_addresses): Use range_state.
+
+ (struct input): New field "reset_at_next_file".
+ (read_pattern_space): Use it instead of "separate_files".
+ (process_files): Initialize it.
+
+2004-01-17 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/sed.h: Do not include wchar.h and wctype.h, and do
+ not include the alloca stuff.
+ * basicdefs.h: Move all that here.
+
+2004-01-15 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/regexp.c [REG_PERL]: Use REG_STARTEND instead of regexec2.
+
+2004-01-09 Paul Eggert <eggert@twinsun.com>
+ Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/sed.h (posixicity): New variable, replaces POSIXLY_CORRECT.
+ * sed/sed.c (main): Set it.
+ * sed/compile.c: Use it instead of POSIXLY_CORRECT.
+ * sed/execute.c: Use it instead of POSIXLY_CORRECT.
+ * doc/sed-in.texi: Document it and --posix.
+
+2004-01-05 Paul Eggert <eggert@twinsun.com>
+ Paolo Bonzini <bonzini@gnu.org>
+
+ * NEWS: Fix [\n] to match either backslash or n in POSIXLY_CORRECT mode.
+ * doc/sed-in.texi: Document this. Also, document regular expressions
+ a bit better overall, using terminology that's more similar to POSIX.
+ * sed/sed.h (enum text_types): New definition.
+ * sed/compile.c (normalize_text): Replace final parameter with one of
+ type normalize_text. If TEXT_REGEX and in POSIXLY_CORRECT mode,
+ grok character classes without replacing \n inside them.
+
+2004-01-03 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/execute.c (execute_program): print final line
+ after executing N, if not POSIXLY_CORRECT.
+
+2003-12-28 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/compile.c: fix "\\\n" in RHS of s command.
+ Reported by Mike Castle.
+ * testsuite/bkslashes.inp, testsuite/bkslashes.good,
+ testsuite/bkslashes.sed: New files.
+ * testsuite/Makefile.am, testsuite/Makefile.tests: Add
+ the bkslashes test.
+
+2003-12-16 Paolo Bonzini <bonzini@gnu.org>
+
+ *** Version 4.0b released.
+
+ * sed/mbcs.c: New file.
+ * sed/sed.h: Declare macros for mbcs.c.
+ * sed/compile.c: Use them.
+ (brlen): Moved to mbcs.c.
+ * sed/execute.c: Use them.
+ * sed/sed.c: call initialize_mbcs ().
+
+2003-12-14 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/regex.c (match_regex): fix memory leak.
+
+2003-11-27 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/execute.c (reset_addresses): leave addresses 0
+ and 0~STEP enabled.
+
+2003-11-15 Jakub Jelinek <jakub@redhat.com>
+
+ * sed/regex.c: Use fastmap.
+
+2003-09-21 Paolo Bonzini <bonzini@gnu.org>
+
+ *** Version 4.0a released.
+
+ * sed/execute.c (struct line): Add mbstate field.
+ (str_append): Keep mbstate up to date.
+ (str_append_modified): Likewise, and use towupper/towlower.
+ (line_init): Initialize mbstate.
+ (line_copy): Copy mbstate.
+ (line_append): Copy mbstate.
+
+2003-07-15 Stepan Kasal <kasal@ucw.cz>
+ Paolo Bonzini <bonzini@fnu.org>
+
+ Change the way we treat lines which are not terminated by a newline.
+ Such lines are printed without the terminating newline (as before)
+ but as soon as more text is sent to the same output stream, the
+ missing newline is printed, so that the two lines don't concatenate.
+
+ * sed/execute.c (output_file): Is now struct output; users adjusted
+ to access the fp field, call output_missing_newline before, and
+ call flush_output afterwards.
+ (read_file_line): Set line.chomped FALSE each time we encounter a
+ line without the newline terminator, no matter whether this is the
+ last input file or not, and no matter whether we are in
+ POSIXLY_CORRECT mode or not.
+ (output_missing_newline): New function which prints the suppressed
+ newline, if necessary.
+ (flush_output): New function for a common pattern.
+ (output_line): Use struct output, set its flag accordingly.
+ (dump_append_queue): Use `ck_fwrite' instead of output_line.
+ (do_list): Flush the output stream at the end.
+ (closedown): The code ``if(separate_files) rewind_read_files();''
+ (read_pattern_space): ... has been moved here.
+ (process_files): Don't do the default `p' at the end, ...
+ (execute_program): ... as this function is now responsible for it;
+ add the code to the end of the function and to the command `q';
+ the commands `d', `D' and `Q' thus no longer have to forge an empty
+ line.
+ (execute_program): Commands `c' and `i' no longer call the
+ function output_line with chomped==FALSE; instead, they chomp
+ the text and call the function with chomped==TRUE.
+ (execute_program): Command `e' no longer uses output_line; it
+ calls ck_fwrite directly. Commands `e', `L' and `=' flush
+ the output stream at the end.
+ * sed/compile.c (special_files): Use `struct output' instead of the
+ file name.
+ (get_openfile): ... special files are no longer copied to file_read
+ or file_write.
+ (fp_list): Move to sed.h (users adjusted) and rename as...
+ * sed/sed.h (struct output): ...this. New flag missing_newline
+ associated to the output stream.
+ (struct sed_cmd, struct subst): Use `struct output *' instead of mere
+ `FILE *'; adjust compile.c and execute.c.
+ * testsuite/noeolw.sed, testsuite/noeolw.good, testsuite/noeolw.1good,
+ testsuite/noeolw.2good: New tests
+
+2003-07-15 Stepan Kasal <kasal@ucw.cz>
+
+ * lib/utils.h, sed/sed.h: #include "basicdefs.h",
+ don't include it from various *.c files.
+ * sed/regex.c: Don't include regex.h as it's included via sed.h.
+
+2003-06-11 Paolo Bonzini <bonzini@gnu.org>
+
+ * lib/getline.c: Don't realloc with first param = NULL.
+
+2003-05-07 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/execute.c: Make treatment of ADDR_IS_NUM_MOD
+ simpler, and fix bugs in 0~5,+1
+ * sed/compile.c: Complain about addresses like 0
+ and 0,3 which are sources of misunderstandings.
+ Reported by Akim Demaille <akim@epita.fr>
+
+2003-03-25 Paolo Bonzini <bonzini@gnu.org>
+
+ *** Version 4.0.7 released
+
+ * sed/execute.c (append_replacement): Extract from
+ do_subst
+ (do_subst): Don't update count when a match was
+ skipped.
+ * testsuite/xbxcx3.good, testsuite/xbxcx3.sed,
+ testsuite/xbxcx3.inp: Regression tests
+
+2003-03-23 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/execute.c (do_subst): Fix several bugs with
+ numbered matches
+ * testsuite/numsub2.good, testsuite/numsub2.inp,
+ testsuite/numsub2.sed, testsuite/numsub3.good,
+ testsuite/numsub3.inp, testsuite/numsub3.sed,
+ testsuite/numsub4.good, testsuite/numsub4.inp,
+ testsuite/numsub4.sed, testsuite/numsub5.good,
+ testsuite/numsub5.inp, testsuite/numsub5.sed:
+ regression tests for the bugs
+
+2003-03-15 Paolo Bonzini <bonzini@gnu.org>
+
+ *** Version 4.0.6 released
+
+ * lib/mkstemp.c: Include sys/file.h if available for the
+ benefit of Ultrix
+
+2003-03-14 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/compile.c: Replace flagT with bool
+ * sed/execute.c: Replace flagT with bool
+ * sed/fmt.c: Replace flagT with bool
+ * sed/sed.c: Replace flagT with bool
+ * sed/regex.c: Replace flagT with bool
+
+2003-03-13 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/compile.c (compile_program): Understand parameter
+ of `v'.
+
+ * sed/sed.c (usage): Split help message into multiple
+ strings
+ (main): Don't understand -h and -V
+
+2003-03-12 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/compile.c (match_slash, snarf_char_class): More
+ multibyte character support
+ (brlen): New function
+ * testsuite/classes.good, testsuite/classes.inp,
+ testsuite/classes.sed: New files
+
+2003-03-10 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/compile.c (match_slash): Strip the \ in front of
+ slashes (so that the matcher sees x/ for s/x\///). Don't
+ match / and [ unless at the start of a character.
+
+2003-02-18 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/regex.c (compile_regex): // matches the last regular
+ expression even in POSIXLY_CORRECT mode.
+ * sed/compile.c (normalize_text): Treat multibyte character
+ sets correctly
+ (read_text): Don't swallow backslash sequences, run text
+ through normalize_text
+ (compile_program): Ditto for y command
+
+ * sed/compile.c (normalize_text): Add parameter that says
+ whether the text will be processed further to remove more
+ backslash escapes. Callers adjusted
+ (match_slash): Remove same parameter from here. Callers adjusted.
+
+2003-02-15 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/sed.h: Fix prototype for match_regex, declare re_registers
+ if REG_PERL
+ * sed/execute.c (do_subst): Use re_registers
+ * sed/regex.c (copy_regs): New function
+ [REG_PERL]: Use re_registers
+ [!REG_PERL]: Avoid using internal entry points, support pre-glibc
+ 2.3 regex for the sake of --without-included-regex.
+
+2003-01-04 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/sed.h: Move some stuff from here...
+ * sed/basicdefs.h: ...to here
+ * lib/utils.c (ck_fopen): Add FAIL parameter
+ * lib/utils.h: Adjust parameter
+ * sed/compile.c, sed/execute.c, sed/sed.c: Adjust callers
+
+ * sed/basicdefs.h: Add TRUE/FALSE
+ * sed/compile.c, sed/execute.c, sed/sed.c: Use them
+ * sed/fmt.c: Do not redefine them
+
+2003-01-02 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/sed.c: Bump copyright year
+
+2002-12-24 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/sed.c: Use bindtextdomain
+ * sed/basicdefs.h [__EMX__]: Define initialize_main
+ * lib/getline.c [__EMX__]: Strip trailing CR
+
+ * sed/regex.c: Don't use N_ on the lines that define
+ error messages, some compilers complain.
+
+2002-12-18 Paolo Bonzini <bonzini@gnu.org>
+
+ *** Version 4.0.5 released
+
+ * sed/compile.c: Don't use N_ on the lines that define
+ error messages, some compilers complain.
+
+2002-12-16 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/compile.c: Improvements to some error messages;
+ `a', `i', `l', `L', `r' accept two addresses except in
+ POSIXLY_CORRECT mode.
+
+2002-12-14 Paolo Bonzini <bonzini@gnu.org>
+
+ * lib/regex_internal.c: Fix problem on non-glibc
+ systems, from Jakub Jelinek
+ * lib/regex.c (RE_ENABLE_I18N): Conditionalize on
+ HAVE_MBRTOWC and HAVE_WCRTOMB.
+ * lib/getline.c: Fix compilation on non-glibc system
+ * lib/snprintf.c: Fix compilation on non-glibc system
+ * lib/basicdefs.h [P_]: Make more portable
+
+2002-12-12 Paolo Bonzini <bonzini@gnu.org>
+
+ *** Version 4.0.4 released
+
+2002-11-21 Paolo Bonzini <bonzini@gnu.org>
+
+ *** Version 4.0.3 released
+
+2002-11-19 Paolo Bonzini <bonzini@gnu.org>
+
+ *** Version 4.0.2 released
+
+2002-11-05 Paolo Bonzini <bonzini@gnu.org>
+
+ *** Version 4.0.1 released
+
+2002-10-23 Paolo Bonzini <bonzini@gnu.org>
+
+ *** Version 4.0 released
+
+2002-10-28 Paolo Bonzini <bonzini@gnu.org>
+
+ * lib/utils.c: Don't fail for EBADF in fflush
+ * src/sed.c: the_program is now a global
+
+2002-10-19 Paolo Bonzini <bonzini@gnu.org>
+
+ * src/sed.c: Print GNU sed in --version for GNU sed,
+ and super-sed for super-sed (thanks to Bruno Haible)
+
+2002-10-17 Paolo Bonzini <bonzini@gnu.org>
+
+ *** Version 3.96 released
+
+2002-10-16 Isamu Hasegawa <isamu@yamato.ibm.com>
+
+ * src/execute.c (execute_program): Multibyte 'y'
+ * src/compile.c (compile_program): Likewise
+ * src/sed.h: Likewise
+
+2002-10-08 Paolo Bonzini <bonzini@gnu.org>
+
+ *** Version 3.95 released
+
+2002-07-15 Paolo Bonzini <bonzini@gnu.org>
+
+ * src/sed.h: rfile --> fname, wfile --> fp
+ * src/compile.c (compile_command): Parse 'R' like 'w', use
+ separate lists for file read and file write
+ * src/compile.c (get_openfile): New name of get_writefile
+ * src/compile.c (rewind_read_files): New function
+ * src/sed.h: Declared here
+ * src/execute.c (closedown): And called here
+ * src/execute.c (append_queue): Added 'free' field
+ * src/execute.c (execute_program): Implement 'R'
+
+2002-06-09 Paolo Bonzini <bonzini@gnu.org>
+
+ * src/execute.c (do_subst): Replaced flag was set on every
+ regexp match, while the first matches should not set it
+ for s///N.
+
+2002-06-08 Paolo Bonzini <bonzini@gnu.org>
+
+ * src/compile.c (compile_file): Open the script in text mode
+ * lib/utils.c (utils_fp_name): Shorten the output
+ * lib/utils.c (ck_fread, ck_fwrite, ck_fflush): Clearerr
+ after printing an error.
+ * lib/utils.c (ck_fclose): Work on stdout as well if stream == NULL
+ and flush before closing to check for errors
+
+2002-05-30 Paolo Bonzini <bonzini@gnu.org>
+
+ * src/compile.c (compile_program): Implement W
+ * src/execute.c (execute_program): Likewise
+
+2002-04-23 Paolo Bonzini <bonzini@gnu.org>
+
+ * src/sed.c (usage, main): Parse -s
+ * src/sed.h (separate_files): New variable
+ * src/execute.c (separate_files): New variable
+ * src/execute.c (reset_addresses): New function to make range
+ addresses work separately on each file when using in-place
+ editing
+ * src/execute.c (execute_program): The `n' and `N' use test_eof
+ so that the script restarts at end of file, not at end of input
+ * src/execute.c (test_dollar_EOF): Make $ work separately
+ on each file when using -s; renamed to test_eof
+
+2002-02-28 Paolo Bonzini <bonzini@gnu.org>
+
+ * src/sed.h (struct sed_cmd): exit_status -> int_arg
+ * src/compile.c: Likewise
+ * src/execute.c: Likewise
+
+ * src/compile.c (compile_command): Parse `l' like
+ `q' and `Q'; default for int_arg is -1
+ * src/execute.c (do_list): New argument, used instead
+ of lcmd_out_line_len
+ (execute_program): Interpret int_arg for the `l' command;
+ return 0 for `q' and `Q' if int_arg is -1
+
+ * src/fmt.c: New file, looted from GNU textutils
+ * src/compile.c: Parse `L'
+ * src/execute.c: Execute `L'
+
+2002-02-14 Paolo Bonzini <bonzini@gnu.org>
+
+ * src/execute.c (str_append_modified): Fixed a stupid
+ bug (stop condition was *start == *end, meant to be
+ start == end)
+
+2002-02-05 Paolo Bonzini <bonzini@gnu.org>
+
+ * lib/utils.c: Added directory parameter to
+ temp_file_template
+ * lib/utils.h: Adjusted
+ * src/execute.c: Adjusted
+
+2002-01-29 Paolo Bonzini <bonzini@gnu.org>
+
+ * src/compile.c (mark_subst_opts): Signal an error if
+ there are multiple g or p options
+ * src/compile.c (compile_program): Raise appropriate
+ error if second string in y command is longer than
+ first (used to be "excess junk after command")
+
+2001-12-31 Paolo Bonzini <bonzini@gnu.org>
+
+ * lib/getline.c: Strip the terminating \r under Windows
+ or MS-DOS.
+
+ * testsuite/xemacs.sed, testsuite/xemacs.inp,
+ testsuite/xemacs.good: Submitted by John Fremlin
+ (john@fremlin.de)
+
+2001-12-27 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/execute.c (do_subst): Flags in optimized s/^xx/
+ commands were discarded (see the change below)
+
+2001-12-19 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/execute.c (resize_line): Limit inactive space to two
+ thirds of a buffer
+ * sed/execute.c (line_init): Initialize buf->active
+ * sed/execute.c (str_append, str_append_modified, line_copy,
+ do_list, do_subst, execute_program, process_files): Operate
+ on active space
+
+ * sed/execute.c (do_subst): Optimize s/^xx// by making a part
+ of the buffer inactive and s/xx$// by truncating it.
+ * sed/execute.c (execute_program): Optimize D by making a part
+ of the buffer inactive
+
+ * testsuite/uniq.sed, testsuite/uniq.inp, testsuite/uniq.good:
+ added to test P and D commands.
+ * testsuite/fasts.sed, testsuite/fasts.inp, testsuite/fasts.good:
+ added to test the new optimization done on the `s' command.
+
+2001-12-17 Paolo Bonzini <bonzini@gnu.org>
+
+ * testsuite/dc.inp: Also compute Easter of 2002 :-)
+
+ * sed/execute.c [!HAVE_FCHMOD]: Don't chmod the output file
+ if working in-place
+
+2001-11-12 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/sed.h (struct sed_cmd): a1 is a pointer too
+ * sed/compile.c: Likewise
+ * sed/execute.c: Likewise
+
+ * sed/compile.c: Use obstacks
+ * sed/execute.c: Likewise
+
+2001-11-09 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/compile.c (mark_subst_opts): Parse option `e',
+ preserve two occurrences of the `e' and `p' options.
+ * sed/execute.c (do_subst) [HAVE_POPEN]: Interpret option
+ `e' (evaluate, like Perl's but uses Bourne shell).
+ * sed/sed.h (struct subst): Add an `eval' flag.
+
+ * sed/compile.c (compile_program): Compile command `e'
+ like `c'.
+ * sed/execute.c (execute_program): Execute command `e'.
+
+2001-09-25 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/compile.c (get_writefile) [!POSIXLY_CORRECT]:
+ support /dev/stdout
+ * sed/execute.c (open_next_file, closedown): Support
+ in-place editing
+ * sed/execute.c (backup_file_name): New function to
+ support in-place editing
+ * sed/main.c (usage, main): Parse -i.
+ * sed/utils.c: Moved to lib directory
+
+ * lib/utils.c (temp_file_template): New function.
+ * sed/utils.h: Declared temp_file_template.
+
+2001-09-05 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/execute.c (do_subst): `baaac', if passed through
+ s/a*/x/g, gave `xbxxcx' rather than `xbxcx' (because an
+ empty string matched before the `c'. Fixed.
+
+ * sed/execute.c: Removed mmap support, I/O is done using
+ getline (slower but more bug-proof).
+ * sed/utils.c: Likewise.
+ * lib/getline.c: New file
+
+2001-03-22 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/compile.c (normalize_text) [POSIXLY_CORRECT]: Enable
+ escapes in modes other than BRE.
+
+2001-03-21 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/compile.c (normalize_text): Support \XXX in Perl mode,
+ \oXXX in non-Perl mode.
+
+2001-03-18 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/compile.c (compile_program): Fixed missing break when
+ compiling 'q' and 'Q'.
+
+ * sed/compile.c (check_final_program): Removed now spurious
+ call to compile_regex
+ * sed/regex.c (compile_regex): Don't track the last compiled
+ regex
+ * sed/regex.c (execute_regex): Track here the last compiled
+ regex
+
+2001-03-02 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/compile.c (setup_replacement): Support \[lLuUE] like
+ Perl and vi.
+ * sed/compile.c (new_replacement): Accept new parameter
+ to support \[lLUuE].
+ * sed/sed.h (enum replacement_types): New declaration
+ * sed/execute.c (do_subst): Use new function str_append_modified
+ to apply the changes required via \[lLUuE].
+ * sed/execute.c (str_append_modified): New function
+
+2001-03-02 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/compile.c (setup_replacement): Count the number of backreferences
+ that the RHS needs
+ * sed/regex.c (compile_regex): Check if there is a sufficient number
+ of backreferences (new argument needed_sub replaces nosub)
+ * sed/compile.c (compile_address, compile_program,
+ check_final_program): Callers adjusted
+
+2001-02-08 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/compile.c (compile_program): Added `Q' (quit without output)
+ * sed/execute.c (execute_program): Ditto
+
+ * sed/compile.c (compile_program): Fill in exit_status for `q' and `Q'
+ * sed/execute.c (execute_program): Return -1 for `go on', 0..255
+ to set the exit status
+ * sed/execute.c (process_files): Interpret new convention for
+ execute_program, return sed's exit code
+ * sed/sed.c (main): Return process_files's exit code
+ * sed/sed.h (struct sed_cmd): Declare exit_status
+
+2001-01-07 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/compile.c (compile_program): Added `T' (branch if failed)
+ * sed/execute.c (shrink_program, execute_program): Ditto
+
+2001-01-04 Paolo Bonzini <bonzini@gnu.org>
+
+ * testsuite/Makefile.am: Use automake's implementation
+ of `make check'. Removed the test targets
+ * testsuite/Makefile.tests: Moved the test targets here
+ (new file).
+ * testsuite/runtest: New file
+
+ * testsuite/Makefile.tests: `khadafy' test uses EREs.
+
+ * testsuite/spencer.inp: Removed the ^* test
+
+ * testsuite/spencer.sh: Don't rely on awk; more comments too
+
+2001-01-03 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/compile.c(snarf_char_class) [REG_PERL]: Don't parse
+ `\n' specially
+ * sed/compile.c(match_slash) [REG_PERL]: Ditto
+
+ * sed/compile.c(read_text) [REG_PERL]: Support [xX] modifiers
+ * sed/compile.c(mark_subst_opts) [REG_PERL]: Ditto
+
+2000-12-21 Paolo Bonzini <bonzini@gnu.org>
+
+ * lib/snprintf.c [BOOTSTRAP]: Don't include stdio.h
+ * lib/strerror.c [BOOTSTRAP]: Don't include stdio.h
+ * sed/execute.c [!HAVE_ISATTY]: Don't buffer stdin
+
+2000-12-11 Paolo Bonzini <bonzini@gnu.org>
+
+ * sed/compile.c(mark_subst_opts): Support [mMsS] flags
+ * sed/compile.c(read_text): Support [MS] flags for
+ addresses
+ * sed/regex.c(compile_regex): Support arbitrary flags for
+ regncomp.
+
+ * sed/regex.c(compile_regex) [REG_PERL]: Don't call
+ normalize_text.
+
+2000-12-08 Paolo Bonzini <bonzini@gnu.org>
+
+ * basicdefs.h: Moved here from the `sed' subdirectory.
+
+ * configure.in: Removed crap to pick a regex engine.
+ Added snprintf to the AC_REPLACE_FUNCS call.
+
+ * lib/snprintf.c: New file.
+
+ * sed/regex.c(compile_regex): Use regncomp
+ * sed/regex.c(match_regex): Use regexec2
+
+ * sed/compile.c(compile_program): Implemented the `v' command.
+
+ * sed/sed.c(main): Implemented the `r' and `R' options
+
+ * sed/sed.h: Replaced use_extended_syntax_t with
+ extended_regexp_flags to support Perl regular expressions.
+
+ * sed/execute.c(open_next_file): Don't mmap stdin (because
+ we cannot seek into it, so a redirected stdin's contents
+ would not be "eaten" by sed)
+
+Mon Aug 30 23:40:08 PDT 1999 Ken Pizzini <ken@gnu.org>
+
+ *** Version 3.02.80 released
+
+ * sed/execute.c(do_subst): lib/regex.c(re_search_2) seems to
+ want one extra backreference register; humor it.
+
+ * sed/regex.c(compile_regex): work around some odd assumptions
+ that lib/regex.c(re_compile_pattern) makes about our desired
+ RE syntax.
+
+ * configure.in: tweaked version to 3.02.80; added new entries
+ to the ALL_LINGUAS definition.
+
+ * doc/sed.1, doc/sed.texi, BUGS: explicitly request the output
+ of sed --version in bug-reporting instructions.
+
+ * doc/sed.texi: the old "informal seders list" is dead; document
+ the new sed-users mailing list instead (under Other Resources).
+
+
+Thu Aug 19 23:27:54 PDT 1999 Ken Pizzini <ken@gnu.org>
+
+ * sed/sed.h: Add explicit #include of "regex-sed.h" (rather
+ than relying on parent file doing so); change the "cmd_regex"
+ member of sed_cmd: make it a pointer (instead of a struct),
+ and change its name to cmd_subst; add prototypes for newly
+ exported functions bad_prog(), normalize_text(), compile_regex(),
+ match_regex(), and release_regex(); drop rx_testing variable.
+
+ * sed/compile.c: move the compile_regex() function to regex.c;
+ export bad_prog() and normalize_text() functions; eliminate the
+ rx_testing debris; rename the NOLEAKS symbol to more descriptive
+ DEBUG_LEAKS; make cmd_regex to cmd_subst fixes (see above);
+ make use of newly abstracted release_regex() function.
+
+ * sed/execute.c: abstract out the regex matching to
+ regex.c:match_regex(); NOLEAKS to DEBUG_LEAKS change;
+ cmd_regex to cmd_subst structure member name change.
+
+ * sed/execute.c(do_subst): use re_registers/regoff_t instead of
+ regmatch_t to hold the backreference registers, make "offset"
+ always be relative to the beginning of the string (rather than
+ a delta from "start"), defer some matching bookkeeping (e.g.,
+ not_bol_p) to match_regex().
+
+ * sed/sed.c(main): loose rx_testing variable; NOLEAKS
+ (aka DEBUG_LEAKS) code attempting to release
+ _nl_current_default_domain is problematic, so omit it.
+
+ * sed/regex.c: new file --- abstracts out the interface to the
+ regex engine so that less conditional code is required in
+ compile.c and execute.c, and so as to make a change of engine
+ easier; implements compile_regex() (which looks an awful lot
+ like the one that used to live in compile.c), match_regex(),
+ and (if DEBUG_LEAKS is set) release_regex().
+
+Sun Apr 18 04:40:46 PDT 1999 Ken Pizzini <ken@gnu.org>
+
+ * sed/sed.c(main): conditionalize calls to setlocale() and
+ textdomain() to only occur if their support is needed/wanted.
+
+Sun Apr 18 03:01:46 PDT 1999 Ken Pizzini <ken@gnu.org>
+
+ * bootstrap.sh: "foo || bar && baz" was not grouping like I
+ expected ("foo || (bar && baz)") under at least one shell,
+ so change the test for a pre-existing config.h file to an
+ if statement.
+
+ * bootstrap.sh: added -DUSE_REGEX_GNU_H option to the
+ compiler invocation, to ensure that we get a usable
+ regex library included.
+
+Sun Apr 18 02:59:42 PDT 1999 Ken Pizzini <ken@gnu.org>
+
+ * sed/sed.h, sed/utils.c: conditionalized inclusion of <libintl.h>
+ to occur only if ENABLE_NLS is defined.
+
+Sun Apr 18 01:48:45 PDT 1999 Ken Pizzini <ken@gnu.org>
+
+ * sed/compile.c(xofa,normalize_text,convert_number): change
+ name of xofa() function to convert_number(); change semantics
+ to do all of the work of the text->number conversion.
+
+ * sed/compile.c(normalize_text): add new \dDDD decimal
+ and \oOOO octal escapes.
+
+Sun Mar 28 21:05:07 PST 1999 Ken Pizzini <ken@gnu.org>
+
+ * sed/sed.c(main): if NOLEAKS is set, free up a word that
+ the call to textdomain() allocated.
+
+ * sed/execute.c(read_file_line): plug up (minor) memory leak:
+ if buffer.alloc==0 we may have malloc()'d 1 byte anyway,
+ so be sure to FREE(buffer.text) before calling line_init();
+
+Fri Mar 26 16:52:10 PST 1999 Ken Pizzini <ken@gnu.org>
+
+ * sed/compile.c(match_slash): somewhere between 3.02
+ and 3.02a we lost the ability to use a newline as
+ the s/// delimiter; restore this ability.
+
+ * sed/compile.c(compile_regex): forget about trying
+ to cache the compiled form of the last RE --- it
+ causes more problems than its worth. We now only
+ cache the source form.
+
+ * testsuite/help.good: update to reflect output containing
+ new options.
+
+Sun Dec 6 00:51:23 PST 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed/utils.c(ck_fwrite): fix i18n bug of using a printf
+ fragment of "item%s" to handle plural text.
+
+Mon Nov 23 11:03:40 PST 1998 Ken Pizzini <ken@gnu.org>
+
+ * doc/sed.1, doc/sed.texi: ran ispell over these
+ files to catch the more obvious typos...
+
+Sun Nov 1 00:09:07 PST 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed/execute.c(do_list): make a `lcmd_out_line_len'
+ (--line-length) of zero mean "infinite length",
+ i.e., "never wrap".
+
+Sat Oct 31 23:06:50 PST 1998 Ken Pizzini <ken@gnu.org>
+
+ * execute.c(match_an_address_p,process_files),
+ compile.c(compile_program): back out the "zero-address"
+ changes of 1998-09-27. It was a neat idea, but there are
+ too many dark corners which don't work well. The
+ special code for handling line ranges starting at
+ address zero (from 1998-08-31) are still there though:
+ this seems to work fine with no surprises.
+
+Sat Oct 31 22:18:59 PST 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed/sed.c, sed/sed.h, sed/execute.c: added new
+ `lcmd_out_line_len' variable. (Idea suggested by
+ Carlos J. G. Duarte <l38076@alfa.ist.utl.pt>.)
+ Also added ATOI macro (which uses strtoul() if available,
+ with fall-back to atoi()).
+ * sed/sed.c(main): attempt to use COLS environment variable
+ to set a reasonable `lcmd_out_line_len'; added -l/--line-length
+ command-line options to set the new `lcmd_out_line_len' flag.
+ * sed/sed.c(usage): documented new -l/--line-length options.
+ * sed/execute.c(do_list): use `lcmd_out_line_len' variable
+ instead of `LCMD_OUT_LINE_LEN'.
+ * sed/execute.c: deleted now obsolete LCMD_OUT_LINE_LEN define.
+ * configure.in: added strtoul to the AC_CHECK_FUNCS call.
+
+Sat Oct 31 21:37:17 PST 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed/sed.c, sed/sed.h, sed/execute.c: added new `force_unbuffered'
+ flag. (Idea suggested by Frank Strauss <strauss@escape.de>.)
+ * sed/sed.c(main): added -u/--unbuffered command-line options
+ to set the new `force_unbuffered' flag.
+ * sed/sed.c(usage): documented new -u/--unbuffered options.
+ * sed/execute.c: changed the name of the `is_tty' flag in struct
+ input to a more generic `no_buffering'; also removed HAVE_ISATTY
+ conditional on this member.
+ * sed/execute.c(slow_getline): removed HAVE_ISATTY conditonal
+ compilation of this function.
+ * sed/execute.c(output_line): if force_unbuffered is set,
+ then force a fflush() even if writing to stdout.
+ * sed/execute.c(open_next_file): added handling of the
+ new `force_unbuffered' flag so that slow_getline()
+ will always be used for input.
+ * sed/execute.c(read_file_line): changed the (conditionally
+ compiled) test of `input->is_tty' to (unconditionally)
+ use the new spelling `input->no_buffering'.
+
+Thu Oct 15 12:08:09 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * configure.in: deleted AC_ARG_PROGRAM call; this is already
+ done for us by AM_INIT_AUTOMAKE, and we were winding up
+ with a doubled-transform.
+
+Sun Sep 27 01:42:42 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * compile.c(compile_program): remove special-case code for matching
+ address range with a `0' beginning.
+
+ * compile.c(compile_address): change default addr_number to
+ be a pragmatically impossible countT value, instead of zero.
+
+ * execute.c: spell macro REGNEXEC() unconditionally instead of
+ playing with conditional definition of regnexec() macro.
+
+ * execute.c(match_an_address_p): added third argument (and changed
+ callers in match_address_p). Added special code to ignore
+ non-numeric matches when processing "line zero".
+
+ * execute.c(process_files): added a "line zero" pass through the
+ commands script.
+
+Sun Sep 27 00:20:53 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * compile.c(xofa,normalize_text): new functions.
+ * compile.c(compile_regex): cache last_compiled_re (with its
+ associated flags); add POSIXLY_CORRECT behavior for empty RE.
+ Make use of the new normalize_text() function.
+ * compile.c(setup_replacement): Make use of the new normalize_text()
+ function.
+
+Sat Sep 26 22:59:13 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * lib/regex-gnu.h: added missing prototype for regncomp().
+
+Mon Sep 14 20:47:23 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed/sed.c(main): use EXIT_SUCCESS instead of 0, in case
+ we are built on a system (such as VMS) where EXIT_SUCCESS
+ is distinct from 0.
+
+Wed Sep 9 22:17:28 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed/Makefile.am: added -I../intl the INCLUDES line; if we are
+ building in a directory outside the source tree and the system
+ we are building on does not have a <libintl.h> header, then
+ the build was failing, because libintl.h is a build-time
+ constructed source file.
+
+ * configure.in: tweaked version to be 3.02b.
+
+Wed Sep 9 19:28:14 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ *** Version 3.02a released
+
+ * sed/compile.c(mark_subst_opts,read_label,compile_program):
+ wherever we accept a ; as a command terminator, also allow a } or
+ a # to appear. (This allows for less cluttered-looking scripts,
+ such as: sed '/foo/{x;G}' (instead of: sed '/foo/{x;G;}').)
+
+Wed Sep 9 18:17:07 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed/compile.c(compile_regex): use regncomp() instead
+ of regcomp(), so that a script with NULs in its REs
+ will work in the expected manner.
+
+ * sed/compile.c(ADDNUL,REGNCOMP): added support macros
+ for above.
+
+ * lib/regex.c(regncomp,regcomp): added regncomp() and
+ made regcomp() a simple wrapper function.
+
+Mon Aug 31 21:48:30 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed/sed.c(compile_program): if the first address of
+ a range is the number 0 (or a 0~N sequence), start
+ out in the "a1_matched" state. This allows one
+ to match an initial chunk of a file without undue
+ convolutions for handling the case where the match
+ for the end of the sequence happens to be the first
+ line.
+
+Sun Aug 16 03:34:25 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed/compile.c(snarf_char_class,match_slash): simplify
+ handling of "premature newline" error. Also, get the
+ line number right in the error message if we encounter
+ a "premature newline" during char-class snarfing.
+
+Sun Aug 16 02:59:20 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed/compile.c: added N_() markers and corresponding gettext()
+ (er, _()) calls.
+
+ * Merged in i18n contribution from Erick Branderhorst
+ <Erick.Branderhorst@asml.nl>. His ChangeLog entry
+ for the changes I've incorporated so far:
+
+1998-07-24 Erick Branderhorst <Erick.Branderhorst@asml.nl>
+ * configure.in (ALL_LINGUAS, AM_GNU_GETTEXT): nl
+ * sed/{sed.h,utils.c}: #include <libintl.h> #define _(String)
+ gettext (String)
+ * sed/sed.c: #include <locale.h>
+ * po/POTFILES.in: sed/{compile,execute,sed,utils}.c
+ * run gettextize -f
+ * acconfig.h: #undef LOCALEDIR ENABLE_NLS HAVE_CATGETS
+ HAVE_GETTEXT HAVE_LC_MESSAGES HAVE_STPCPY
+
+Fri Aug 14 13:52:57 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * Merged code from 3.02 with a branched development
+ tree from late May; the following (out-of-order)
+ changelog entry is from the branched tree.
+
+Sat May 30 12:23:16 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed/compile.c, sed/execute.c: added (conditional on NOLEAKS macro)
+ code to free all dynamically allocated memory.
+
+ * sed/sed.c, sed/compile.c, sed/execute.c: much shuffling
+ of code --- ordered functions such that no forward
+ declarations are necessary, and placed all static prototypes
+ immediately before the actual function definition.
+ This accomplished two things: first, I find the new ordering
+ a more natural way to read the code than the previous
+ ordering, and second, the new ordering give the compiler
+ a better opportunity to discover inlining possibilities.
+ (The odd "prototype declaration+old-style definition"
+ style is used because I feel it is the least ugly way
+ of supporting K&R1 C while still getting the benefit of
+ prototypes when they are available.)
+
+ * sed/basicdefs.h: added MEMCPY() macro to hide the VCAST()s
+ that ought to be used with memcpy().
+
+ * sed/execute.c: Change calls to memcpy() to go through the
+ new MEMCPY() macro. Various prototypes: elide variable name
+ if it does not add any human-useful documentary information
+ to the bare type.
+
+ * sed/sed.c(main): Updated calls to compile_string() to add third
+ (length) argument. Changed call to obsolete close_all_files()
+ to a call to the new finish_program().
+
+ * sed/sed.c(map_file): Attempt to clean-up how "size" gets
+ cast and tested; remove spurious S_ISREG test (just let
+ mmap() fail if it doesn't support the underlying file type).
+
+ * sed/sed.c: Deleted old RX library stub declarations.
+
+ * sed/sed.c(map_file,unmap_file): added VCAST()s to the
+ mmap()/munmap() calls.
+
+ * sed/utils.c(ck_fclose): added support for ANSI C
+ functionality where passing a NULL argument means
+ to fclose() _all_ open streams. (Well, almost.
+ Only closes streams which were previously ck_fopen()ed,
+ as I don't care to figure out how to autoconf-detect
+ whether fclose(NULL) is properly supported on a given
+ platform.)
+
+ * sed/sed.h: Renamed `struct text_buf' member `text_len'
+ to `text_length'. Abstracted out `enum addr_types'
+ from `struct addr'; added new enum types num2,step,step_mod;
+ renamed mod to num_mod. De-unionized the regex,number,
+ {modulo-offset/step} components of `struct addr', in
+ anticipation of new features. Changed type of `a2' member
+ of `struct sed_cmd': now a pointer to save space.
+ Abstracted out `struct replacement' from `struct subst'.
+ Cleaned up declaration of `x' union of `struct addr'.
+ Fixed prototype for compile_string(). Replaced prototype
+ for old close_all_files() with one for new finish_program().
+
+ * sed/sed.h, sed/compile.c, sed/execute.c: changed to
+ simplify the data structures used for branches and
+ command blocks: simplified `struct vector'; made
+ `struct label' local to compile.c; `struct sed_cmd'
+ was modified to support a simpler design for branches
+ and blocks.
+
+ * sed/execute.c: Conditionally added ADDNUL() macro so that
+ the function call overhead is only incurred if nul_append()
+ _must_ be called. Made some commentary edits, including
+ typo fixes.
+ * sed/execute.c(resize_line): changed semantics of "len" argument
+ from "additional length" to "target length"; made
+ INITIAL_BUFFER_SIZE a minimum allocation length.
+ * sed/execute.c(str_append): adjusted to new resize_line()
+ semantics.
+ * sed/execute.c(line_copy): use FREE()+MALLOC() instead of
+ REALLOC() to avoid unnecessary copying of old text; add the
+ "try doubling first" allocation heuristic (just like
+ resize_line() does).
+ * sed/execute.c(line_exchange): new function.
+ * sed/execute.c(nul_append): make whole function (not just its
+ body) conditional on HAVE_REGNEXEC macro; adjust to new
+ resize_line() semantics.
+ * sed/execute.c(read_mem_line): use str_append() instead if
+ custom in-line code; compensate for new default of
+ "line.chomped = 0" in read_pattern_space() by setting
+ "line.chomped = 1" where appropriate.
+ * sed/execute.c(read_file_line): use different trigger to
+ determine that "buffer" is uninitialized, and do a full
+ initialization if required; use str_append() instead of custom
+ in-line code in two places; compensate for new default of
+ "line.chomped = 0" in read_pattern_space() by setting
+ "line.chomped = 1" where appropriate.
+ * sed/execute.c(output_line): don't bother calling ck_fwrite()
+ if length==0.
+ * sed/execute.c(release_append_queue): new function.
+ * sed/execute.c(dump_append_queue): use release_append_queue()
+ instead of in-line equivalent.
+ * sed/execute.c(read_pattern_space): conditionalize call to
+ dump_append_queue() for alleged performance reasons; changed
+ default "line.chomped" value to more common "1", and added an
+ assignment of "0" where this made a difference.
+ * sed/execute.c(match_an_address_p): deleted "is_addr2_p"
+ argument; reorder cases to match order in enum declaration; add
+ cases for new "addr_is_num2", "addr_is_step", and
+ "addr_is_step_mod" address types; alter nul_append() call to be
+ through ADDNUL() macro; fix to new struct member and enum
+ spellings in (formerly addr_is_mod); addr_is_num_mod case.
+ * sed/execute.c(match_address_p): remove oblsolete third argument
+ to calls to match_address_p(); alter references to sed_cmd
+ member a2 to reflect new pointer status; add new support for
+ a2->addr_type addr_is_step and addr_is_step_mod cases.
+ * sed/execute.c(do_subst): add NOLEAKS support logic; use
+ ADDNUL() wrapper to nul_append(); simplify replacement
+ expansion by using the new "struct replacement" data structure;
+ use line_exchange() function instead of custom in-line code.
+ * sed/execute.c(process_files): added NOLEAKS code.
+ * sed/execute.c(execute_program): updated implementations
+ of the `{', `}', `:', `b', and `t' commands; modified
+ `c' command gratuituosly; fixed potential memory
+ overrun in `D' command. Simplified how nonstandard
+ `loop increments' work. Use line_exchange() instead of
+ custom in-line code in 'x' case.
+ * sed/execute.c[EXPERIMENTAL_DASH_N_OPTIMIZATION conditional
+ code]: various modifications intended to keep this
+ code in sync with the new changes, but the code still
+ retains its previous bugs.
+
+ * sed/compile.c: use "exit(EXIT_FAILURE) instead of "exit(1)",
+ just in case we get compiled under VMS.
+ * sed/compile.c: Change type of prog_info.base to decrease needs
+ for casting; then elimiated the casts in question ;-).
+ * sed/compile.c: Added struct sed_label (moved from sed.h, then
+ modified).
+ * sed/compile.c: Removed "readit_p" flag from struct fp_list.
+ * sed/compile.c: Added module-global "blocks" variable.
+ * sed/compile.c: Extracted more error-message constant strings
+ to named variables.
+ * sed/compile.c(check_final_program): updated to
+ reflect new data structures and use new fucntions.
+ Added call to compile_regex() to release unneeded
+ memory.
+ * sed/compile.c: deleted obsolete new_vector() function;
+ abstracted new read_label() function; abstracted new
+ release_label() function; added new `blocks' module-static
+ variable.
+ * sed/compile.c(compile_program): updated implementations
+ of the `{', `}', `:', `b', and `t' commands; modified
+ initialization from NULL vector.
+ * sed/compile.c(compile_regex): added mechanism to
+ release memory consumed by the cached `last' RE.
+ * sed/compile.c(setup_jump,setup_label): updated
+ name (from setup_jump to setup_label) and prototype;
+ changed body to reflect data structure changes.
+ * sed/compile.c: Add OPEN_BRACE and CLOSE_BRACE macros for better
+ "vi" editing behavior.
+ * sed/compile.c(compile_filename,read_filename,get_writefile):
+ Replaced function compile_filename() with more orthogonal functions
+ read_filename(), get_writefile().
+ * sed/compile.c(compile_regex): Added ability to free the remembered
+ "last RE" in compile_regex (for benifit of "NOLEAKS" code).
+ * Made adjustments dictated by the change to struct sed_cmd which made
+ the a2 member a pointer-to-addr instead of an addr.
+ * sed/compile.c(setup_jump,read_label,setup_label,release_label):
+ Added functions read_label(), setup_label(), release_label(); deleted
+ function setup_jump().
+ * sed/compile.c(new_replacement,setup_replacement,release_replacement):
+ new functions.
+ * sed/compile.c: Adjusted to new spelling of text_buf member
+ ("text_length" instead of "text_len").
+ * sed/compile.c(new_vector): deleted function. (Due to new handling
+ of blocks, only one instance remained, and that one was just as
+ clear in-lined.)
+ * sed/compile.c(compile_string): Added third argument; it now
+ takes a counted string instead of a NUL-terminated string.
+ * sed/compile.c(compile_file): added variable "map_base" to
+ compensate for new type of prog_info.base.
+ * sed/compile.c(check_final_program): reflect new style of
+ handling blocks and struct sed_label.
+ * sed/compile.c(close_all_files,finish_program): replaced function
+ close_all_files() with more generic finish_program().
+ * sed/compile.c(read_text): added new feature: if first non-blank
+ character after the {a,i,c} command character is not "\", then
+ use the trailing text on that line as the (first) line of text.
+ Also added code conditional on NO_INPUT_INDENT to support the
+ "feature" of stripping leading blanks from each input line; I
+ do not read POSIX as permitting this behavior, nor do I think
+ it is a good idea, so it is disabled by default, but some have
+ argued that this blank-stripping is the "correct" behavior, so
+ I offer them the option of building their sed that way.
+ * sed/compile.c(compile_address): added xxx,+n and xxx,~n addressing;
+ simplified code.
+ * sed/compile.c(compile_program): added BAD_PLUS error detection;
+ adjusted to new cur_cmd->a2 pointer status; added addr_is_num2
+ detection; deleted pointless "a2->addr_number < a1.addr_number"
+ check (addr_is_num2 semantics handle this just fine); updated
+ code for '{', '}', ':', 'b', and 't' to reflect new design
+ of branch handling, including making use of new functions
+ related to the new design); added support for feature already
+ mentioned in read_text() where {a,i,c} commands are able to have
+ their text start on the same line as the command; changed some
+ error messages (hopefully for the better); localized variables
+ specific to individual commands (particularly 's' and 'y');
+ made use of new setup_replacement() function in 's' command.
+
+Mon Aug 10 19:58:49 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * doc/sed.texi, doc/sed.1: sedtut10.txt is apparently dead.
+ Deleted references to it and added a pointer to
+ http://seders.icheme.org/tutorials/. (Pointed out by
+ Joerg Heitkoetter <joerg@de.uu.net>.)
+
+Sat Aug 8 18:11:57 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * djgpp/config.btm: per request by Michel de Ruiter
+ <mdruiter@cs.vu.nl>, added "%1" to "%9" parameters.
+
+Mon Aug 3 11:44:55 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * doc/sed.texi: fix a couple of typos. (Submitted by
+ Alan Modra <alan@spri.levels.unisa.edu.au>.)
+
+Sat Aug 01 17:49:06 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ *** Version 3.02 released
+
+ * configure.in: Because of code change in 3.01a, bump the
+ minor revision number for the release (now 3.02).
+
+Sun Jul 26 16:07:55 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ *** Version 3.01a released
+
+ * sed/compile.c(snarf_char_class): the POSIX char-class
+ recognition loop forgot to update its concept of "prev"
+ as the loop progressed.
+
+ * testsuite/Makefile.am: The dependency of version.good
+ on [testsuite/]Makefile introduced in the previous
+ release was botched -- it referred to "Makefile"
+ as "$(srcdir)/Makefile, which of course doesn't work
+ if you aren't building in the source tree.
+
+ * djgpp/Makefile.am: add forgotten "config.btm" EXTRA_DIST
+ member.
+
+ * configure.in: update version.
+
+Tue Jul 21 06:04:42 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ *** Version 3.01 released
+
+ * configure.in: mark as release version!
+
+ * Makefile.am: add BUGS and THANKS to the EXTRA_DIST target.
+
+ * testsuite/Makefile.am: add dependency of version.good
+ on [testsuite/]Makefile.
+
+Mon Jul 20 12:38:10 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * djgpp/config.btm: New file to support the 4DOS alternative
+ to command.com. (Sumitted by Eli Zaretskii on behalf of
+ an anonymous 4DOS user.)
+
+Fri Jul 17 00:36:34 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ *** Version 3.01-beta18 released
+
+ * djgpp/config.sed: my "tweak" in beta17 was too
+ hastily considered. Back it out.
+
+ * configure.in: update to beta18.
+
+Wed Jul 15 01:02:15 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ *** Version 3.01-beta17 released
+
+ * djgpp/config.sed: tweak/simplify s,,, commands at end.
+
+ * configure.in: update to beta17.
+
+1998-07-14 Eli Zaretskii <eliz@is.elta.co.il>
+
+ * djgpp/config.sed: Edit all the occurences of = in the context of
+ --option=value, including in the help messages, into
+ --option:value, but leave DOS-style d:/foo/bar file names intact.
+
+ * djgpp/config.bat: Use --srcdir:foo instead of --srcdir=foo.
+
+ * testsuite/Makefile.am (help, version): Remove temporary files
+ explicitly, don't use shell wildcards, so it works under DOS 8+3
+ limits.
+
+Thu Jul 9 13:06:00 PDT 1998 16:51:43 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ *** Version 3.01-beta16 released
+
+ * djgpp/config.sed: tweak the configure script to use :
+ instead of = for --with-foo=bar option parsing, to
+ work around problems with how command.com handles =s.
+
+Wed Jul 8 16:51:43 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * djgpp/config.bat: correct inappropriate behavior that I
+ introduced in the beta13 changes (if first argument is
+ a directory, it needs to be handled as the --srcdir).
+
+ * testsuite/version.gin, testsuite/version.good, testsuite/Makefile.am:
+ Add target to automake to automatically update version.good
+ from (new file) version.gin, instead of hand-editing the version
+ number each release.
+
+ * testsuite/Makefile.am: miscellaneous gratuitious tweakage --
+ mainly adding $(RM) commands just because I didn't like
+ leaving the tmp* files from successful runs laying about.
+ Also some editorial comments.
+
+ * configure.in: update to beta16. Added and commented out
+ experiment with AC_OUTPUT() for testsuite/version.good.
+ Added code to properly handle bare (without =xxx)
+ "--with-regex" option.
+
+Sun Jul 5 21:02:16 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ *** Version 3.01-beta15 released
+
+ * sed/utils.c(ck_fflush), sed/utils.h, sed/execute.c(output_line):
+ add and use new ck_fflush() function.
+
+Sun Jul 5 15:23:47 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed/compile.c(bad_prog): add more detail to error
+ messages about -e strings.
+
+Sun Jul 5 14:29:45 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed/compile.c(mark_subst_opts), sed/execute.c(do_subst):
+ Define better semantics for interaction of the `g' flag
+ with a numeric flag to the s/// command. It used to
+ be that the `g' command siezed control; now the first
+ (number-1) matches are skipped and then `g' gets control
+ after that. (It is not clear whether this is a feature
+ sneaking in during late beta, or a bug fix; the changes
+ involved were trivial, so I decided to treat it as a bug
+ fix.)
+
+ * configure.in, testsuite/version.good: update to beta15.
+
+Sat Jul 4 09:54:45 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ *** Version 3.01-beta14 released
+
+ * sed/basicdefs.h, sed/compile.c, sed/execute.c:
+ per report by "Kaveh R. Ghazi" <ghazi@caip.rutgers.edu>,
+ copied the ISXXX macros from lib/regex.c so that
+ silly machines which require isascii() to be true
+ before the other isXXX() macros are valid will
+ still work.
+
+ * configure.in, testsuite/version.good: update to beta14.
+
+Thu Jul 2 23:46:13 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ *** Version 3.01-beta13 released
+
+ * configure.in, acconfig.h: set USE_REGEX_GNU_H symbol if we
+ are going to be using lib/regex.c.
+
+ * lib/Makefile.am, lib/regex.h, lib/regex-gnu.h, lib/regex.c:
+ rename lib/regex.h to lib/regex-gnu.h, so that those who
+ choose to use a different regex implementation will not
+ pick-up lib/regex.h when doing "#include <regex.h>".
+
+ * sed/regex-sed.h, sed/Makefile.am, sed/compile.c, sed/execute.c,
+ sed/sed.c: create sed/regex-sed.h which acts as a switch
+ to choose either lib/regex.h or the user-supplied <regex.h>,
+ depending on the value passed to configure's --with-regex=
+ option.
+
+Thu Jul 2 17:22:31 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * configure.in: if an alternative --with-regex= is given,
+ do an AC_CHECK_FUNCS(regnexec regexec) to ensure that
+ at least one of these functions is available. Also,
+ parallel changes for the default case.
+
+ * sed/execute.c, acconfig.h: retire use of the WITH_REGNEXEC
+ test macro in favor of HAVE_REGNEXEC test macro created
+ by above change.
+
+ * djgpp/config.bat: Play games to handle "install-sh",
+ DOS filename restrictions, GNU makefile default rules,
+ and getting a correct run of "configure" (contributed
+ by Eli Zaretskii <eliz@is.elta.co.il>).
+
+ * djgpp/Makefile.am, testsuite/Makefile.am, testsuite/Makefile.in,
+ Makefile.am, configure.in: Various automake targets
+ (such as distcheck) failed with old configuration.
+ The simplest solution was to just add these .am
+ files. (The testsuite/Makefile.in was just renamed to
+ testsuite/Makefile.am, then various redundant defines and
+ targets were deleted.) (Reported by Erick Branderhorst
+ <Erick.Branderhorst@asml.nl>.)
+
+ * testsuite/dc.good, testsuite/dc.inp: per suggestion from
+ Greg Ubben <gsu@romulus.ncsc.mil>, use base 16 output to
+ exercise even more of the dc.sed script.
+
+ * configure.in, testsuite/version.good: update to beta13.
+
+Sun Jun 28 16:21:02 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ *** Version 3.01-beta12 released
+
+ * doc/sed.texi: Avoid mixing @code and @samp markups together:
+ they look ugly in Info. Use @url and @email instead of @example.
+ Add indexes. (Basis of changes contributed by Eli Zaretskii.)
+
+ * djgpp/*, Makefile.am: add support for the DJGPP compiler,
+ contributed by Eli Zaretskii <eliz@is.elta.co.il>.
+
+ * dc.sed, testsuite/Makefile.in, testsuite/dc.inp, testsuite/dc.good:
+ added this remarkable script, written and contributed
+ by Greg Ubben <gsu@romulus.ncsc.mil>, both as a work of
+ art for general admiration, and also for use in regression
+ testing.
+
+ * configure.in, lib/Makefile.am: add --with-regex=regexlib
+ option, which overrides the use of lib/regex.c.
+
+ * configure.in, testsuite/version.good: update to beta12.
+
+Fri Jun 12 16:41:48 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ *** Version 3.01-beta11 released
+
+ * sed/compile.c: add module-static variables first_script
+ (for #n change below) and pending_text (for a/c/i change
+ below).
+
+ * sed/compile.c(compile_file), sed/compile.c(compile_program):
+ Instead of having #n trigger the -n option in *any file*,
+ have #n trigger the -n option only if they are the first
+ two bytes of the first script or script-file.
+
+ * sed/compile.c(compile_string), sed/compile.c(compile_file):
+ clear the first_script variable at end of these functions.
+
+ * sed/sed.h: tease out the struct text_buf declaration from
+ struct sed_cmd, so that a pointer to such can be passed
+ to new sed/compile.c(read_text) function.
+
+ * sed/compile.c(compile_program), sed/compile.c(read_text):
+ Tease out handling of text to a/c/i commands to new
+ read_text() function. Handle (via aid of pending_text
+ variable) texts which span more than one script/script-file
+ option. In particular, restore the ability to have this
+ work: sed -e '1i\' -e 'foo'
+
+ * sed/compile.c(check_final_program): close off any dangling
+ pending_text allocation.
+
+Thu Jun 11 11:17:46 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed/execute.c(do_subst): fixed two bugs: s/ */X/g was failing
+ to match the final empty string after the end of the pattern
+ space; and /^foo$/s/o/x/3p was printing, despite the failure
+ to do a substition.
+
+Fri Jun 5 04:40:24 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * configure.in: change the AC_ARG_WITH(regnexec, ...)
+ to be the more appropriate AC_ARG_ENABLE(regnexec, ...).
+
+ * configure.in, testsuite/version.good: update to beta11.
+
+Fri Jun 5 00:54:25 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ *** Version 3.01-beta10 released
+
+ * sed/execute.c: forgot to P_() the prototype and
+ old-style the declaration for bootstrap_memchr()!
+
+Thu Jun 4 18:42:30 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed/compile.c(snarf_char_class): added code to
+ recognize \n or \<newline> sequence within a
+ char-class as the newline character.
+
+Tue Jun 2 11:56:02 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * configure.in: added check for <sys/types.h> and
+ a AC_ARG_WITH(regnexec,...) check, to simplify use
+ of other regex libraries which have regexec() but
+ not regnexec(), with the corresponding loss of
+ functionality (regexps will not work right against
+ input lines which contain NULs).
+
+ * sed/execute.c: add nul_append() function, a #define
+ for a regnexec() -> regexec() macro (conditional on
+ the lack of the WITH_REGNEXEC symbol), and a couple
+ of calls to nul_append() (in match_an_address_p()
+ and do_subst()) to permit the use of the POSIX standard
+ regexec() function call instead of the suggested
+ regnexec() call.
+
+ * sed/compile.c, sed/execute.c, sed/sed.c: check for
+ <sys/types.h> and include it (before "regex.h") if
+ available. This makes it simpler to use the system's
+ regex library instead of the one in lib/regex.c, should
+ that be desired.
+
+Tue Jun 2 08:41:05 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed/basicdefs.h: define VCAST macros to allow sed to
+ compile on systems which predate the definition
+ of "void *", and yet still get feedback about
+ stupid programming errors from systems which *do*
+ know about "void *"s. Also define MALLOC, REALLOC,
+ MEMDUP, and FREE macros to keep under control the
+ degree of code ugliness which would otherwise be
+ introduced in making use of the VCAST macro.
+
+ * sed/compile.c, sed/execute.c, sed/sed.c, sed/utils.c:
+ pervasively use the new VCAST, MALLOC, REALLOC, MEMDUP,
+ and FREE macros wherever appropriate.
+
+ * sed/utils.c, sed/utils.h: correct type of first arguments
+ to ck_fread() and ck_fwrite() to be [const] VOID *.
+
+ * sed/basicdefs.h, sed/execute.c: protect against
+ the rumored systems which stupidly #define __STDC__ 0.
+
+ * testsuite/help.good, testsuite/Makefile.in: make
+ the ``help'' test insensitive to the spelling of
+ the executable's name. Also, enhanced `make clean'
+ target.
+
+ * doc/sed.texi, doc/sed.1: correct documentation of `q'
+ command; fix typos.
+
+ * configure, testsuite/version.good: update to beta10.
+
+Sat May 30 17:28:00 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ *** Version 3.01-beta9 released
+
+ * Makefile.am: make testsuite a normal SUBDIR.
+
+ * configure.in: discontinue using AC_ISC_POSIX --
+ check for -lcposix library instead; added
+ testsuite/Makefile to AC_OUTPUT list.
+
+ * lib/memmove.c(memmove): fixed wrong sense used
+ for HAVE_BCOPY test.
+
+ * sed/execute.c: checked more specifically for a version
+ of gcc which supports __attribute__ (i.e., >= 2.7).
+
+ * testsuite/*: renamed files to fit 14 char limit.
+
+ * testsuite/Makefile, testsuite/Makefile.in: Makefile
+ renamed to Makefile.in and then modified so that
+ "make -j check" from top directory will work.
+
+ * testsuite/subwrite.sed, testsuite/writeout.sed: changed
+ file name of the "w" command to be consistent with the
+ new naming used in testsuite/Makefile.in.
+
+ * doc/sed.1, doc/sed.texi: fixed some typos, formatting
+ glitches, and poor wordings.
+
+Sat May 30 04:02:29 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * configure.in: specify that config.h is to be derived
+ from config_h.in in order to avoid the braindead
+ DOS filesystem limitations.
+
+Fri May 29 21:56:30 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed/compile.c(compile_address), doc/sed.texi: gave
+ a better definition to the meaning of N~0 address
+ forms -- N~M addresses now mean that lines match
+ when there exists a non-negative x such that
+ lineno == N+x*M.
+
+Fri May 29 12:07:38 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed/compile.c(compile_address),
+ sed/execute.c(match_an_address_p): update semantics of
+ N~M address form: now N is the first line which will
+ match and M is the step between succeeding matches.
+ If N<M this works out to the same as before, but the
+ new behavior for N>=M seems more useful.
+
+ * doc/sed.1, doc/sed.texi: update documentation of N~M
+ address form; added "Other Resources" node to sed.texi;
+ minor formatting changes to some items in sed.1 with
+ an eye to improving clarity.
+
+ * configure.in, testsuite/version.good: update to beta9.
+
+Sat May 23 20:04:31 HST 1998 Ken Pizzini <ken@gnu.org>
+
+ *** Version 3.01-beta8 released
+
+ * sed/compile.c(compile_regex): forgot to make last_re be
+ a *copy* of the buffered text in today's earlier fix.
+
+ * sed/execute.c(read_file_line): EOF check was wrong --
+ it forgot to allow for the possibility that we were
+ appending to the end of the ``line'' (instead of merely
+ reading a fresh line).
+
+Sat May 23 18:07:18 HST 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed/compile.c(compile_regex): don't track compiled version
+ of regex -- the modifiers may change. Track the regex
+ source instead. (For "last regex" (aka //) notation.)
+
+ * configure.in, testsuite/version.good: update to beta8.
+
+Sat May 23 16:07:09 HST 1998 Ken Pizzini <ken@gnu.org>
+
+ *** Version 3.01-beta7 released
+
+ * sed/execute.c: #undef'd EXPERIMENTAL_DASH_N_OPTIMIZATION
+ because its code is buggy.
+
+Tue May 19 17:03:52 HST 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed/sed.c: label rx library code as such with #ifdefs
+ (instead of just #if 0).
+
+ * sed/compile.c(compile_program): make incremental
+ improvement to the "Unknown command" error message.
+
+Sat May 16 23:16:26 HST 1998 Ken Pizzini <ken@gnu.org>
+
+ * testsuite/Makefile: simplify: get rid of automatic run
+ against system's sed; don't time by default; allow for
+ alternative comparison command.
+
+ * configure.in, testsuite/version.good: update to beta7.
+
+Wed May 13 21:44:28 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ *** Version 3.01-beta6 released
+
+ * lib/Makefile.am: fix spelling of libsed_a_LIBADD in
+ libsed_a_DEPENDENCIES.
+
+ * configure.in, testsuite/version.good: update to beta6.
+
+Wed May 13 14:38:08 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ *** Version 3.01-beta5 released
+
+ * sed/execute.c(do_subst): added not_bol_p variable to track when
+ we have iterated past the beginning of the pattern.
+ [Thanks to Jim Meyering <meyering@ascend.com> for the bug report.]
+
+Wed May 13 13:54:04 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed/execute.c(bootstrap_memchr): new function. When
+ bootstrapping we don't know if we are on a 64-bit machine,
+ so lib/memchr.c breaks. Supply this (slow) implementation
+ just to get us bootstrapped.
+
+ * bootstrap.sh: add a #define BOOTSTRAP symbol; add -I.
+ for emphasis for the compiles in sed/; be explicit
+ about what files we're bothering to compile.
+
+ * configure.in, testsuite/version.good: update version
+ to beta5.
+
+Wed May 13 06:39:06 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ *** Version 3.01-beta4 released
+
+ * rename writeout.good? to wrtout?.good and subwrite.good? to
+ subwrt?.good to comply with DOS 8+3 file name restrictions.
+ [Eli Zaretskii <eliz@is.elta.co.il> suggested this to
+ simplify DJGPP ports, and it was easy.]
+
+ * testsuite/Makefile: reflect above name changes.
+
+Wed May 12 21:09:32 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed/sed.c(usage): fix non-portable omission of \n\ at end of
+ lines within long string.
+
+ * sed/sed.c(main): remove spurious argument to fprintf() in the
+ 'V'ersion output.
+
+ * sed/execute.c(line_append): embed newline between the two
+ text fragments unconditionally.
+
+ * sed/execute.c(do_subst): change structure assignment to memcpy()
+ (for portability reasons).
+
+ * README.bootstrap: suggest using -w option.
+
+Tue May 12 10:02:37 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * configure.in: use AC_REPLACE_FUNCS where appropriate.
+
+ * lib/Makefile.am: updated to reflect AC_REPLACE_FUNCS change in
+ configure.in.
+
+ * lib/memchr.c lib/memcmp.c: revert to standard GNU versions.
+
+ * lib/alloca.c: added this missing file.
+
+ * testsuite/version.good: updated for new version identifier.
+
+Mon May 11 18:50:56 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ *** Version 3.01-beta3 released
+
+ * sed/Makefile.am: fix INCLUDES to work right with VPATH.
+ [Thanks to Jim Meyering <meyering@ascend.com> for the bug report.]
+
+ * sed/sed.c(usage): make --help output more user-friendly?
+
+ * sed/execute.c(execute_program): fix bug in 'x' command introduced
+ in the alleged portability fix of May 9.
+
+ * configure.in: update version to 3.01-beta3.
+
+ * testsuite/version.good, testsuite/help.good: freshen with
+ latest output.
+
+Sat May 9 22:35:45 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ *** Version 3.01-beta2 released
+
+ * sed/sed.c: add #include <sys/types.h> in HAVE_MMAP
+ block (needed on some machines).
+
+ * lib/memmove.c: #include <memory.h>, if HAVE_MEMORY_H.
+
+Sat May 9 21:29:00 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * configure.in: remove dangling references to rx library;
+ added HEADER and FUNC checks for items used by source in
+ lib/.
+
+ * lib/ansidecl.h, lib/memcopy.h, lib/pagecopy.h, lib/string.h
+ lib/memcpy.c, lib/memmove.c: deletes these files. There
+ are still pieces of glibc missing to support these, and
+ it isn't worth the headache right now.
+
+ * lib/memmove.c: de novo, simpler version. Uses bcopy()
+ if available, and slow-but-simple code if not.
+
+ * lib/Makefile.am: remove references to deleted files.
+ Added forgotten reference to memcpy.c. Re-ordered
+ SOURCE entries to reflect dependencies for systems
+ which lack ranlib.
+
+ * sed/basicdefs.h: updated to reflect above changes to lib/,
+ and experience with non-STDC compilers.
+
+ * lib/regex.c: made regerror() function publicly visible.
+
+ * lib/strerror.c: use old-style function declaration.
+
+ * sed/compile.c, sed/execute.c, sed/sed.c, sed/utils.c,
+ sed/sed.h, sed/utils.h: ensure that private definitions of
+ some symbols do not cause problems when #include'ing system
+ headers (mainly by re-ordering the #include directives).
+ (This is particularly an issue for bootstrap.sh runs.)
+
+ * sed/execute.c (execute_program): use memcpy() instead of
+ structure assingment ('x' command), for portablility to
+ old compilers.
+
+ * sed/execute.c (slow_getline): use old-style function
+ declaration, with a P_ prototype.
+
+ * sed/sed.c: change the type of the fallback MAP_FAILED
+ definition to work on archaic systems. (Modern systems
+ should be defining it themselves, so the change from
+ void * shouldn't be a problem.)
+
+ * bootstrap.sh, README.bootstrap: actual testing of bootstrap
+ code revealed that I was too optimistic. Redesigned and
+ replaced implementation.
+
+ * testsuite/Makefile: ignore errors from reference-implementation
+ seds that aren't up to snuff.
+
+ * testsuite/help.good, testsuite/version.good: update to
+ current version's output.
+
+Fri May 8 15:08:28 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ *** Version 3.01-beta1 released
+
+ * sed/sed.c (main, usage): once again tweak the --help and
+ --version output to bettery comply with GNU coding standards.
+
+ * testsuite/help.good, testsuite/version.good: update to
+ reflect above change.
+
+ * doc/sed.texi: fix "Invoking" node's spelling to comply
+ with GNU standards.
+
+Fri May 8 11:43:10 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * doc/sed.1, doc/Makefile.am: wrote (very basic) man page.
+
+Thu May 7 20:40:21 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * lib/Makefile.am, lib/memmove.c, lib/memchr.c, lib/regex.c,
+ lib/memcpy.c, lib/regex.h, lib/memcopy.h, lib/string.h,
+ lib/pagecopy.h, lib/ansidecl.h: grab yet-another-version
+ from gnu.org for baseline and/or edit copyright boilerplate
+ using official lgpl2gpl.sed script. Take care not to
+ loose regnexec() interface or special conditional-compilation
+ code.
+
+Wed May 6 23:35:12 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * lib/regex.c, lib/regex.h: take from grep-2.1 distribution,
+ then trivially added the regnexec() interface.
+
+ * sed/sed.c, sed/compile.c, sed/execute.c: made modifications
+ to work with regex instead of rx.
+
+ * rx/*: deleted directory; the code is just too slow.
+ I think it will be easier to extend regex to fully
+ support POSIX.2 than to tune rx to be reasonable.
+ Even if this supposition is wrong, I'd rather make
+ the 3.01 release with the slightly deficient regex.
+
+ * Makefile.am lib/Makefile.am, sed/Makefile.am: made changes
+ related to the substitution of regex for rx.
+
+ * lib/Makefile.am, sed/Makefile.am: since regex is not a
+ ``compatability'' module, changed name of library to
+ ``libsed.a''.
+
+ * lib/memchr.c, lib/memcpy.c, lib/memmove.c: add conditional
+ compilation code to leave zero-sized .o file if system
+ already supports the implemented function.
+
+ * testsuite/help.good, testsuite/version.good: brought
+ up-to-date (once again).
+
+ * NEWS, ANNOUNCE: changes to reflect this batch of changes.
+
+Wed May 6 18:40:47 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed/execute.c: discovered awful bug in '}' handling:
+ it could read past the end of vec (because `n' was
+ being decremented below zero)! Needed to "continue"
+ instead of "break".
+
+Tue May 5 14:34:38 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * doc/sed.texi, doc/version.texi: wrote some rudimentary
+ texinfo documentation.
+
+ * ANNOUNCE, NEWS, README, README.rx, Makefile.am:
+ more updates for the upcoming beta-release.
+
+ * sed/compile.c, sed/execute.c, sed/sed.c, sed/utils.c,
+ sed/sed.h, lib/strerror.c: update copyright notice text.
+
+Fri May 1 15:41:37 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed/execute.c (match_an_address_p, match_address_p): if
+ the second element of an address range is a line number,
+ and that line number is *less than* (or equal to) the
+ current line number, we only match the one line (per
+ POSIX.2, section 4.55.7.1). [Bug discovered as reported
+ in the seders mailing list FAQ.]
+
+ * AUTHORS, NEWS, acconfig.h, configure.in, doc/Makefile.am,
+ lib/Makefile.am, sed/Makefile.am, lib/README,
+ testsuite/help.good, testsuite/version.good:
+ Updated in anticipation of the 3.01-beta1 release.
+ Reorganized development source tree to make creation
+ of a distribution simpler. Most notable changes were
+ to the various Makefile.am files and configure.in, but
+ some minor edits (such as deleting or changing #include
+ directives) have been made in many other source files.
+
+ * bootstrap.sh, README.bootstrap: created a mechanism for
+ creating sed on a system which lacks a working sed.
+
+Thu Apr 16 23:52:11 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed.h, sed.c, execute.c, compile.c: did a spell-check on
+ the comments; fixed several typos.
+
+Thu Apr 16 13:43:01 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * execute.c (do_subst): fixed bug where the "replaced" flag
+ was being set to one inappropriately when at least one
+ but fewer than sub->numb matches of the regexp were found.
+ (Thanks to Simon Taylor <staylor@hermes.iaccess.com.au>
+ for the bug report.)
+
+Wed Apr 15 11:35:31 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed.h, sed.c, compile.c, execute.c: having a concern that
+ a cast was being done inappropriately, and realizing that
+ there is no quick way to locate all casts in a program, I
+ went through and marked all casts with a simple macro.
+ Now it is a simple matter to locate the casts, and it is
+ also a simple matter to turn of casts for a lint session
+ (if it should be desired).
+
+Wed Apr 15 10:29:21 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * compile.c, sed.c: redo compile phase so that brace
+ expressions can be spread across multiple files.
+ For example:
+ printf '{' >a; printf 'l;d' >b; printf '}' >c
+ sed -f a -f b -f c foo
+ will now compile (and work), instead of complaining
+ about an unmatched '{'. The mess created in compile.c
+ allowed a little simplification to the command-line
+ processing of "-e" options in sed.c.
+
+ sed.h: added (opaque) err_info member to struct vector;
+ added comments to the members of struct vector.
+
+Wed Apr 14 23:50:50 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed.h, sed.c, compile.c, execute.c: added types countT and
+ flagT in order to clarify what various "int"s were doing.
+ Also makes it easy to change the type used for counts
+ (for example, to "unsigned long long") if desired, although
+ there are still some gotchas (such as the printf() format
+ for the '=' command).
+
+Tue Apr 14 17:34:54 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * execute.c (execute_program, process_files, count_branches,
+ shrink_program): Added a first attempt at program optimization.
+ We now can quit early if we are running with the "-n"
+ and all of the commands are known to be valid only for
+ lines less than the current line. Thus the "sed" in
+ "foo | sed -n 1,2p" will print read three lines, printint
+ the first two, and then quit, regardless of how much longer
+ "foo" might run or output. This optimization does not buy
+ much in most cases (it sometimes even costs a little),
+ but when it does help it can help big. The code is
+ all conditionally compiled based on the
+ EXPERIMENTAL_DASH_N_OPTIMIZATION symbol being #defined,
+ so it can be easily omitted if it causes problems.
+
+Tue Apr 14 12:25:06 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * execute.c (test_dollar_EOF, last_file_with_data_p):
+ test_dollar_EOF() was incorrectly returning a false (0)
+ when there were unprocessed files, none of which had any
+ data (either unopenable or zero-length). Created
+ last_file_with_data_p() to detect this situation, and
+ modified test_dollar_EOF() to make use of it.
+
+Thu Apr 2 23:02:18 PST 1998 Ken Pizzini <ken@gnu.org>
+
+ * compile.c (match_slash): match_slash() did not handle
+ [.coll.], [=equiv=], and [:class:] sequences within a
+ character class. Added snarf_char_class() [which is a
+ remote derivative of parse_char_class() from GNU ed-0.2]
+ to deal with the details, and altered match_slash()
+ to make use of it. Also created the trivial
+ add_then_next() to avoid clutter in snarf_char_class().
+
+Thu Apr 2 20:34:42 PST 1998 Ken Pizzini <ken@gnu.org>
+
+ * execute.c, sed.c, sed.h: There was a severe bug in
+ how the code handled "sed 5n a b" when "a" consists
+ of exactly five lines -- it behaved like "sed 5q a b"!
+
+ Rearranged where files get opened -- large scale
+ changes primarily involving main(), process_files(),
+ and read_pattern_space(), but also touching on several
+ other parts of execute.c. The read_pattern_space()
+ function became unwieldly and parts were split into
+ open_next_file(), closedown(), read_always_fail(),
+ read_mem_line(), and read_file_line(). The
+ at_end_of_file_p() function became obsolete and was
+ eliminated; test_dollar_EOF_p() was updated. A few
+ global and module-static variables were elminated, and
+ "struct line" was extended; comments were added to the
+ "struct line" declartation to document some important
+ dependencies in it.
+
+ I undertook the reorganization with dread, but I
+ feel that the new organization is an improvement
+ well beyond just fixing the bug that inspired it.
+
+Thu Apr 2 01:16:25 PST 1998 Ken Pizzini <ken@gnu.org>
+
+ * execute.c (read_file_line, slow_getline): the fread()
+ buffering code gives insufficient feedback to a user
+ running sed with a tty input device, so I created
+ slow_getline() for reading from a tty device.
+ Additionally, EOF detection has been made a little more
+ sensitive to avoid requiring multiple EOFs to be entered
+ from a tty.
+
+ * configure.in: added isatty() check.
+
+Wed Apr 1 11:04:30 PST 1998 Ken Pizzini <ken@gnu.org>
+
+ * configure.in (CPPFLAGS, LDFLAGS, LIBS):
+ Set to appropriate values if large file support needs
+ explicit enabling. Code fragment taken from a 1997-10-25
+ patch to gawk by Paul Eggert <eggert@twinsun.com>
+
+Thu Aug 14 17:43:27 PDT 1997 Ken Pizzini <ken@gnu.org>
+
+ * utils.c (ck_fclose): modified to ignore NULL parameter.
+
+Thu Aug 14 12:08:45 PDT 1997 Ken Pizzini <ken@gnu.org>
+
+ * execute.c: tweaked execute_program() to eliminate
+ gratuitous "goto" usage.
+
+Thu Aug 14 11:30:04 PDT 1997 Ken Pizzini <ken@gnu.org>
+
+ * compile.c: added case-insensitive modifier ('I') to
+ address and s/// regexps. The s/// case also accepts
+ the more popular 'i' modifier. (The address regexp
+ cannot use 'i' as a modifier, as that conflicts with
+ the use of the 'i'nsert command.)
+
+Thu Aug 14 09:29:06 PDT 1997 Ken Pizzini <ken@gnu.org>
+
+ * compile.c: abstracted out match_slash() from the s///, y///,
+ and address-regexp special-case codes.
+
+ * execute.c: made dump_append_queue() use ck_fread() instead
+ of hand-rolled error checking.
+
+Mon Jul 28 10:50:41 PDT 1997 Ken Pizzini <ken@gnu.org>
+
+ * sed.c, sed.h, execute.c: POSIX.2, section 4.55.7, says that
+ a newline must end *every* output line. But I think that
+ it is useful (when seding a binary file) to omit a trailing
+ newline if the input lacks one. Thus the addition of
+ POSIXLY_CORRECT behavior.
+
+ * execute.c: however, when seding multiple files my feeling
+ is that it makes sense to have each file but the last
+ behave as-if it ended in a newline. Modified read_pattern_space()
+ accordingly.
+
+ * utils.c: realized that add1_buffer(), for performance reasons,
+ shouldn't be calling memcpy() (indirectly via add_buffer()),
+ so rewrote it.
+
+Sat Jul 26 23:08:28 PDT 1997 Ken Pizzini <ken@gnu.org>
+
+ * execute.c: attempted to make read_pattern_space more
+ efficient for the the non-mmap() case.
+
+ * utils.c, utils.h, execute.c: new function ck_fread()
+ created and used.
+
+Sat Jul 26 20:22:14 PDT 1997 Ken Pizzini <ken@gnu.org>
+
+ * execute.c, compile.c, sed.c: abstracted the mmap()
+ interface into map_file()/unmap_file() [sed.c], and
+ changed the ad-hoc code in compile_file() [compile.c]
+ and process_file() [execute.c] to make use of the new
+ interface.
+
+Sat Jul 26 19:45:46 PDT 1997 Ken Pizzini <ken@gnu.org>
+
+ * execute.c, compile.c, configure.in: Check to see if mmap()
+ is available; if so make use of it on regular files.
+
+ * compile.c: compile_file() now closes the input file
+ when it is through!
+
+Sun Jul 20 23:57:02 PDT 1997 Ken Pizzini <ken@gnu.org>
+
+ * compile.c: modified parsing to permit whitespace in more
+ places where it makes sense;
+ added backslash escaping to the y/// command, per POSIX.
+
+ * execute.c: Merged append_pattern_space() into read_pattern_space();
+ moved body of 's' command to new function do_subst();
+ moved body of 'l' command to new function do_list();
+ changed output of 'l' command to conform to POSIX.2;
+ made line handling conform to POSIX; added output_line() function;
+ redesigned append-space algorithm; added append_queue structure and
+ the next_append_slot() and dump_append_queue() functions.
+
+ * sed.h: moved the definition of what is now struct subst
+ outside of the definition of struct sed_cmd.
+
+Sat Jul 19 16:29:09 PDT 1997 Ken Pizzini <ken@gnu.org>
+
+ * sed.c, execute.c, sed.h, Makefile.am: Separated out the
+ pieces dealing with executing the program from the top-level
+ parameter parsing and control.
+
+Sat Jul 19 01:16:35 PDT 1997 Ken Pizzini <ken@gnu.org>
+
+ * sed.c, compile.c, sed.h, Makefile.am: separate out the
+ pieces dealing with compiling the program from the pieces
+ dealing with interpreting the result.
+
+ * compile.c: add functions in_nonblank() and in_integer(),
+ and change interface to compile_address() with an eye
+ to making code clearer.
+
+Fri Jul 18 13:35:50 PDT 1997 Ken Pizzini <ken@gnu.org>
+
+ * utils.c: attempt at a quasi-unification of the
+ STDC and traditional C approaches to panic().
+
+ * sed.c: eliminate some gratuitous bit twiddling.
+ (Using flag bits can be a useful technique, but
+ this code is cleaner without them.)
+
+ * sed.c: place mutually exclusive members of struct addr
+ within a union, mainly to document the exclusivity;
+ eliminate unused structure members from struct fp_list;
+ eliminate unnecessary module-global variables;
+ remove some #if 0 code that is too odd to keep;
+ allegedly simplified the 'l' case of execute_program();
+ allegedly simplified inchar();
+ localized some static variables;
+ renamed some variables to better document their purpose;
+ removed some goto-s rendered obsolete by other changes.
+
+Thu Jul 17 15:30:44 PDT 1997 Ken Pizzini <ken@gnu.org>
+
+ * utils.c, utils.h, sed.c: added and made use of
+ ck_free() function.
+
+ * utils.c, utils.h, sed.c: changed all the *_buffer()
+ functions to take/return an incomplete type
+ "struct buffer *" instead of using VOID *.
+
+ * utils.c, utils.h, sed.c: renamed "finish_buffer()"
+ to "free_buffer()", on the premise that the new
+ name better describes the function's purpose.
+
+Wed Jul 16 13:52:14 PDT 1997 Ken Pizzini <ken@gnu.org>
+
+ * utils.c, utils.h, sed.c: added and made use of
+ ck_memdup() function.
+
+ * sed.c: protected a call to add1_buffer() in
+ compile_program() which could have tried to
+ push an EOF if a a/i/c command ended with
+ a '\', EOF sequence.
+
+ * utils.c: added sanity check to add1_buffer() so that
+ EOF will not be added to the buffer.
+
+Wed Jul 16 03:56:26 PDT 1997 Ken Pizzini <ken@gnu.org>
+
+ * configure.in, compat.h, compat.c: added memchr.
+
+ * sed.c: got rid of arbitrary NUM_FPS limit;
+ made global functions and variables "static" where appropriate;
+ make various cosmetic changes, hopefully improving readability;
+ simplified some redundant predicates;
+ simplified some code, but nothing fundamental (yet?).
+
+Wed Jul 16 00:24:54 PDT 1997 Ken Pizzini <ken@gnu.org>
+
+ * alloca.c, getopt.c, getopt.h, getopt1.c: updated from
+ versions in textutils-1.22.
+
+ * Makefile.in, Makefile.am, configure.in: put in automake support.
+
+ * basicdefs.h, compat.h, compat.c [, sed.c, utils.c]: took out
+ some very ugly compatibility #ifdefs and packaged into one
+ place.
+
+ * sed.c, utils.c: some gratuitous formatting changes.
+
+ * utils.c: changed datatype of utils_id_s in order to
+ eliminate arbitrary array size.
+
+Sun Jul 13 17:00:26 PDT 1997 Ken Pizzini <ken@gnu.org>
+
+ * sed.c, utils.c, utils.h: de-linting oriented cleanup.
+
+Sun Jul 13 00:46:48 PDT 1997 Ken Pizzini <ken@gnu.org>
+
+ * sed.c: fixed bug which caused SEGV for files missing a
+ final newline. Corrected calls to regnexec to pass the
+ proper parameters, in the proper order.
+
+Sat Dec 30 20:16:59 1995 Tom Lord <lord@beehive>
+
+ *** Version 3.00 released
+
+ * sed.c: Use posix entry points to regexp functions.
+ Fix enough bugs to pass the test-suite.
+
+....... Jason Molenda <crash@cygnus.com>
+
+ * testsuite/: trippy test suite.
+
+
+Wed May 11 07:46:24 1994 Chip Salzenberg (chip@fin.uucp)
+
+ *** Version 2.05 released
+
+ * sed.c (compile_address): Recognize numeric addresses.
+ Fixes typo made during installation of "~" feature.
+
+Sat Apr 30 17:17:38 1994 Tom Lord (lord@x1.cygnus.com)
+
+ *** Version 2.04 released
+
+ * sed.c: applied a patch from
+ From: kap1@tao.cpe.uchicago.edu (Dietrich Kappe)
+
+ Dietrich writes:
+
+ As my contribution to the creeping feature creature in sed,
+ here is a new type of address. The address has form n~m,
+ which means "the line number is equal to n modulo m." The
+ modifications to sed are trivial, and the general
+ usefulness of this address should be obvious. If m is 0 or
+ missing, 1 is used in its place (could be a bug or a
+ feature :-).
+
+Sat Apr 30 17:17:38 1994 Tom Lord (lord@x1.cygnus.com)
+
+ * rx.c (solve_destination): protect `solution' more carefully.
+ This is a cleanup of a patch from Kevin Buettner
+ (kev@cujo.geg.mot.com).
+
+Sat Apr 30 17:17:38 1994 Tom Lord (lord@x1.cygnus.com)
+
+ * rx.c: make translation tables unsigned chars
+
+ * sed.c (main): Compile accumulated -e commands as
+ soon as a -f command comes along. This ensures that
+ the commands are executed in the right order.
+
+Mon Oct 25 14:41:47 1993 Tom Lord (lord@rtl.cygnus.com)
+
+ * sed.c (execute_program): 'w' flushes the buffer after it
+ writes -- diagnosed by doug@research.att.com. 'r' and 'w' to
+ the same file is now supported -- hopefully even in a way that
+ satisfies Posix (it now behaves differently from some
+ /bin/sed's and the spec is hard to read so i'm not sure).
+
+ Also, 'r' of a non-existent file is now permitted.
+
+Mon Oct 11 21:06:10 1993 Tom Lord (lord@cygnus.com)
+
+ * sed.c (execute_program): remember that 'b' and 't' are more
+ like longjmp than goto. Patch from tom@basil.icce.rug.nl (Tom
+ R.Hageman)
+
+ * rx.c: patch from From: fin!chip@rutgers.edu (Chip
+ Salzenberg) to get rid of compiler warnings.
+
+
+Sat Aug 7 01:04:59 1993 Tom Lord (lord@unix7.andrew.cmu.edu)
+
+ *** Version 2.03 released
+
+ * sed.c (compile_regex): report error messages for bogus
+ regexps.
+
+ SEE ALSO: ChangeLog.rx
+
+
+Wed Jul 21 00:28:03 1993 Tom Lord (lord@unix8.andrew.cmu.edu)
+
+ * alloca.c: upgraded to a more recent version
+
+ * rx.c (re_search_2): prefer matches with longer
+ subexpressions to those with shorter ones, giving precedence
+ to low numbered subexpressions.
+
+ * rx.c (re_compile): don't free `params' if its null.
+
+Fri Jul 16 01:12:08 1993 Tom Lord (lord@unix8.andrew.cmu.edu)
+
+ * rx.[ch], sed.c: rx replaces regex.
+
+
+
+Thu May 27 11:13:03 1993 Tom Lord (lord@unix3.andrew.cmu.edu)
+
+ * sed.c (execute_program, match_addr): caught more cases
+ that need to be sensitive to a missing \n at EOF.
+
+Fri May 21 00:39:22 1993 Tom Lord (lord@unix8.andrew.cmu.edu)
+
+ * sed.c (execute_program): apply gaumondp's patch
+ to fix '\xabcxs/foo/bar/'.
+
+ * sed.c (execute_program):
+ If a second address is a regexp, never match it on the
+ same line as the first address.
+
+ * sed.c (compile_regexp):
+ Numeric ranges x,y s.t. y < x are now treated as x,x.
+ There was a bug in that they were being handled like x,x+1.
+
+ * sed.c (execute_program, read_pattern_space,
+ append_pattern_space) don't add newlines to lines
+ that don't have them.
+
+Wed May 19 13:34:45 1993 Tom Lord (lord@unix9.andrew.cmu.edu)
+
+ * sed.c (compile_program): grok \\n in comments.
+
+Mon May 17 16:34:50 1993 Tom Lord (lord@unix9.andrew.cmu.edu)
+
+ * alloca.c: new (standard) file
+
+ * configure.in: AC_CONSTified
+
+ * sed.c (compile_program): properly diagnose the error of
+ a missing command (e.g. sed /x/). (thanks gaumondp)
+
+ * sed.c (compile_regexp): handle character classes correctly.
+ Thanks gaumondp@ERE.UMontreal.CA
+ and schwab@issan.informatik.uni-dortmund.de.
+
+Thu May 6 12:37:18 1993 Tom Lord (lord@unix10.andrew.cmu.edu)
+
+ * sed.c (compile_filename, execute_program): don't use
+ `access' or `/dev/null'.
+
+ * sed.c (execute_program): 'N' at EOF should delete the pat buf.
+
+ * sed.c (compile_filename): truncate, don't append files
+ being openned for `w' or `s///w'
+
+ * sed.c (execute_program): -n switch shouldn't effect `i' or `c'.
+
+ * sed.c (compile_program): don't compile unescaped newlines
+ into the substitution string of an `s' command (they are an error).
+
+ * sed.c (compile_regex): correctly skip over character
+ sets that contain `]'.
+
+ * sed.c (execute_program): patch from gaumondp
+ Correctly handle empty-string matches in the case of an `s'
+ command with a repeat count.
+
+ * sed.c (compile_program): patch from gaumondp@ere.UMontreal.ca.
+ Don't consume characters after the label of a `b', `t' or `:' command.
+
+ * sed.c (compile_program): unmatched open braces are an error.
+
+ * sed.c (compile_file): when consuming an initial comment,
+ count lines correctly.
+
+Wed Nov 18 02:10:58 1992 Tom Lord (lord@unix2.andrew.cmu.edu)
+
+ * sed.c (execute_program): Made s///p print even if -n was
+ specified.
+
+ * sed.c (compile_string): Changed the type of this function to
+ fix a compile warning.
+
+Wed Nov 4 17:15:34 1992 Tom Lord (lord@unix7.andrew.cmu.edu)
+
+ * sed.c (main): Initialize the hold area to contain "\n"
+ instead of "". In execute_program, all lines are expected
+ to be newline terminated. Also, if H is the first command
+ in the script, the result is a pattern buffer that begins
+ with a blank line. Thanks to pinard@iro.umontreal.ca
+ (Francois Pinard) for pointing out this and many other bugs.
+
+ * sed.c (execute_program): Fixed a case of `D' command.
+ Thanks Chris Weber <weber@bucknell.edu>
+
+ * sed.c: added new tests of no_default_output to make -n work.
+ Thanks Andrew Herbert <andrew@werple.apana.org.au>
+
+ * sed.c, configure.in,Makefile.in: autoconfed bcopy and const.
+ Thanks "J.T. Conklin" <jtc@gain.com>
+
+ * sed.c: made prog_cur, prog_start, and prog_end unsigned so
+ that users could write `sed -e s//foo/g'.
+
+Tue Oct 13 00:04:05 1992 Tom Lord (lord@unix3.andrew.cmu.edu)
+
+ * sed.c (execute_program): fixed the cycling behavior of 'D'
+
+ * sed.c: integrated patch that closes files
+
+ * sed.c: changed regexp syntax
+
+Fri May 22 15:11:12 1992 Tom Lord (lord at moriarty.bh.andrew.cmu.edu)
+
+ * regex.c: this is not my change, but a pointer to the fact
+ that karl@gnu fixed some regexp bugs that were plaguing sed.
+
+Thu Apr 30 13:02:21 1992 Tom Lord (lord at unix3.andrew.cmu.edu)
+
+ * sed.c (compile_program, execute_program)
+ subprograms are now compiled with an explicit continuation ;)
+ return_v and return_i in struct vector. execute_program
+ no longer recurses to execute subprograms (case '{') and now
+ understands a return instruction (case '{').
+
+Tue Apr 28 17:13:04 1992 Tom Lord (lord at unix7.andrew.cmu.edu)
+
+ * sed.c (compile_address) added \?regexp? syntax for addresses.
+
+ * sed.c (main) added {} intervals to the obscure regexp
+ syntax.
+
+ * sed.c (compile_program) after calling compile_address,
+ normalize numeric addresses (make a2.addr_number > a1.addr_number).
+ This is necessary because line numbers must match exactly,
+ but sed does not try to match a2 until after a1 has matched,
+ yet a1,a2 where a2 <= a1 is defined to be equivelent to
+ a1,a1+1
+
+Sat Feb 29 10:55:54 1992 David J. MacKenzie (djm@nutrimat)
+
+ * sed.c (usage): Document long options as starting with `--'.
+
+Mon Dec 9 23:56:40 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
+
+ * sed.c: Include sys/types.h, for new regex.h.
+
+Tue Nov 5 02:16:01 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
+
+ * utils.c: Change NO_VFPRINTF to VPRINTF_MISSING, for
+ compatibility with autoconf.
+
+Mon Sep 2 22:02:40 1991 David J. MacKenzie (djm at apple-gunkies)
+
+ * sed.c (compile_regex): Treat \ as a normal character when in
+ a char class.
+
+Thu Aug 8 00:15:33 1991 David J. MacKenzie (djm at bleen)
+
+ * Version 1.08.
+
+ * sed.c (compile_filename): If reading a file fails, read
+ /dev/null instead. It's what Unix and POSIX do, effectively.
+
+ * sed.c (compile_regex): The 'slash' character doesn't
+ terminate the regex if it's in a character class.
+
+ * sed.c (main): If given no args, or bad option, print usage
+ message.
+ (usage): New function.
+
+ * sed.c (execute_program): Amount written for 'P' command was
+ wrong. From stephend@ksr.com (Stephen Davis).
+
+Wed Aug 7 16:51:14 1991 David J. MacKenzie (djm at apple-gunkies)
+
+ * sed.c (append_pattern_space): Check for buffer full before
+ instead of after writing to buffer. Don't need to test for
+ EOF initially anymore, due to the next change.
+ (execute_program): For 'n' and 'N' commands, if eof is reached
+ in input, quit the script like Unix sed does.
+ Fix memory allocation problems for 'a' and 'r' commands.
+ (compile_program): Fix off by one error in processing comments.
+ All of the above are from Tapani Tarvainen, tarvaine@tukki.jyu.fi.
+
+ * sed.c (setup_jump): Use isblank instead of testing for ' '
+ or '\t', for POSIX locales.
+
+ * utils.c (ck_strdup): Renamed from strdup.
+ * sed.c: Change callers.
+
+ * sed.c, utils.c: Clean up declarations and includes to get
+ rid of compiler warnings.
+
+ * sed.c (main): Add long-named options. Don't complain if -n
+ is given twice.
+
+Fri Aug 2 12:33:16 1991 David J. MacKenzie (djm at apple-gunkies)
+
+ * configure: Support +srcdir arg. Create config.status and
+ remove it and Makefile if interrupted while creating them.
+ * Makefile.in: Change DESTDIR to prefix.
+
+Mon Jul 15 13:07:39 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
+
+ * sed.c (main): Add -V option to print version number.
+ (USAGE): Mention -V.
+
+Mon Jul 8 01:42:22 1991 David J. MacKenzie (djm at geech.gnu.ai.mit.edu)
+
+ * sed.c: Define bcopy in terms of memcpy if STDC_HEADERS as
+ well as if USG.
+ (compile_filename): Don't glob filename (for 'r' and 'w'
+ commands). Unix sed doesn't do it and it's not very useful,
+ since it can only match 0 or 1 files.
+ (execute_program): Change '\a' to 007 since some compilers
+ don't recognize \a.
+ * utils.c: New file; code moved from sed.c.
+ * Replace Makefile with Makefile.in and configure.
+ Update README.
+
+Tue Mar 26 13:00:48 EST 1991 Jay Fenlason (hack@gnu.ai.mit.edu)
+
+ * sed.c (match_address) Added a trivial cast for portability.
+
+Mon Feb 25 13:23:29 EST 1991 Jay Fenlason (hack@ai.mit.edu)
+
+ * sed.c Changed 's' command to work with latest version of regex()
+ routines, which mysteriously changed somewhere in there. . .
+ A one-line patch from David Eckelkamp (eckelkamp@mcc.com).
+
+ Initialize the fastmap in the hopes that it'll make sed faster.
+
+Thu Feb 21 13:42:27 EST 1991 Jay Fenlason (hack@ai.mti.edu)
+
+ * sed.c Change panic to compile with other __STDC__ compilers.
+
+Wed Jan 30 10:46:38 EST 1991 Jay Fenlason (hack@ai.mit.edu)
+
+ * sed.c Changed version number. Made new release.
+
+Tue Nov 27 15:34:51 EST 1990 Jay Fenlason (hack@ai.mit.edu)
+
+ * sed.c (setup_jump) Don't blow chunks if there isn't a label
+ after a b or t command.
+
+ (main) Don't panic if it a branch command doesn't have
+ a label to branch to.
+
+ (main) Collect all the -e arguments together and parse them
+ all at once. This way, -e { -e mumble -e } will work.
+
+ All these small patches from David Schmidt (davids@isc-br.isc-br.com)
+
+Tue Sep 11 12:51:37 EDT 1990 Jay Fenlason (hack@ai.mit.edu)
+
+ * sed.c Changed some function forward declarations to use VOID *
+ instead of char *
+
+Mon Jul 16 11:12:54 EDT 1990 Jay Fenlason (hack@ai.mit.edu)
+
+ * sed.c (ck_malloc) Use malloc(1) instead of malloc(0) if given
+ a request for zero bytes.
+
+Tue Jun 5 02:05:37 1990 David J. MacKenzie (djm at albert.ai.mit.edu)
+
+ * sed.c: Remove excess newlines from calls to panic.
+ Reformat some comments to fit in 79 columns.
+ Base whether to use void * on __STDC__, not __GNU__.
+ (main): Add missing arg when printing usage message.
+ Print usage if given invalid arg.
+ (panic) [__STDC__]: Add missing ", ...".
+ (compile_filename): Print correct error message if glob_filename
+ returns NULL.
+
+Thu Apr 5 21:41:12 1990 Jim Kingdon (kingdon at pogo.ai.mit.edu)
+
+ * sed.c (execute_program, case 'r'): When need to realloc append.text,
+ multiply append.alloc by 2 instead of adding
+ cur_cmd->x.cmd_txt.text_len.
+
+Tue Mar 6 15:55:35 EST 1990 Jay Fenlason (hack@ai.mit.edu)
+
+ * sed.c (compile_regex) Allocate 10 bytes extra space needed by
+ re_compile_pattern.
+
+Sun Feb 25 16:32:10 1990 Jim Kingdon (kingdon at pogo.ai.mit.edu)
+
+ * sed.c (execute_program, case 'l'): Print \00 instead of \0.
+ Print backslash as \\ not \.
+ Print \xx instead of /xx.
+
+Thu Feb 1 14:02:28 EST 1990 hack@wookumz
+
+ * sed.c (memchr) Use () inside inner loop so it will work correctly.
+ A two character patch from Robert A Bruce (rab@allspice.berkeley.edu)
+
+Wed Sep 27 18:47:39 EDT 1989 hack@ai.mit.edu
+
+ * sed.c (compile_regex) New function. When compiling regex,
+ turn ^ into \` and $ into \' so that they won't match on embedded
+ newlines. UN*X pattern matching is a crock.
+ (compile_program, compile_address) call compile_regex.
+
+Mon Sep 18 10:15:32 EDT 1989 hack@ai.mit.edu
+
+ * sed.c (compile_program): define translate as unsigned char * so
+ that y command will work on non-ascii characters.
+
+ Changed version number to 1.06.
+
+Thu Sep 14 15:57:08 EDT 1989 hack@ai.mit.edu
+
+ * sed.c (compile_program) Let programs use ; to terminate } as
+ well as newline.
+
+ (read_file) Print an error msg to stderr if it can't open an
+ input file.
+
+Thu Mar 23 18:04:46 1989 Randall Smith (randy at apple-gunkies.ai.mit.edu)
+
+ * Makefile, sed.c: Added new copyright notice.
+
+ * Makefile: Make distributions which follow the symlinks.
+
+hack@ai.mit.edu
+
+ 1.05 Fixed error in 'r' (now does things in the right order)
+
+ 1.04 Fixed s/re/rep/[number]
+
+ 1.03 Fixes from Mike Haertel for regexps that match the
+ empty string, and for Ritchie stdio (non-sticky EOF)
+
+ 1.02 Fixed 't', 'b', ':' to trim leading spaces and tabs
+ Fixed \\ in replacement of 's' command
+ Added comments
+
+ 1.01 Added s/re/rep/[digits]
+ added #n as first line of script
+ added filename globbing
+ added 'l' command
+ All in the name of POSIX
+
+ 1.00 Began (thinking about) distributing this file
+
+Local Variables:
+mode: indented-text
+left-margin: 8
+version-control: never
+End:
diff --git a/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/INSTALL b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/INSTALL
new file mode 100644
index 0000000..23e5f25
--- /dev/null
+++ b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/INSTALL
@@ -0,0 +1,236 @@
+Installation Instructions
+*************************
+
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free
+Software Foundation, Inc.
+
+This file is free documentation; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+
+Basic Installation
+==================
+
+These are generic installation instructions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+ It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring. (Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.)
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+ The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'. You only need
+`configure.ac' if you want to change it or regenerate `configure' using
+a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes awhile. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 5. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+Compilers and Options
+=====================
+
+Some systems require unusual options for compilation or linking that the
+`configure' script does not know about. Run `./configure --help' for
+details on some of the pertinent environment variables.
+
+ You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment. Here
+is an example:
+
+ ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
+
+ *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not support the `VPATH'
+variable, you have to compile the package for one architecture at a
+time in the source code directory. After you have installed the
+package for one architecture, use `make distclean' before reconfiguring
+for another architecture.
+
+Installation Names
+==================
+
+By default, `make install' installs the package's commands under
+`/usr/local/bin', include files under `/usr/local/include', etc. You
+can specify an installation prefix other than `/usr/local' by giving
+`configure' the option `--prefix=PREFIX'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+pass the option `--exec-prefix=PREFIX' to `configure', the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files still use the regular prefix.
+
+ In addition, if you use an unusual directory layout you can give
+options like `--bindir=DIR' to specify different values for particular
+kinds of files. Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+There may be some features `configure' cannot figure out automatically,
+but needs to determine by the type of machine the package will run on.
+Usually, assuming the package is built to be run on the _same_
+architectures, `configure' can figure that out, but if it prints a
+message saying it cannot guess the machine type, give it the
+`--build=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+ CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+ OS KERNEL-OS
+
+ See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+ If you are _building_ compiler tools for cross-compiling, you should
+use the option `--target=TYPE' to select the type of system they will
+produce code for.
+
+ If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+If you want to set default values for `configure' scripts to share, you
+can create a site shell script called `config.site' that gives default
+values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+Variables not defined in a site shell script can be set in the
+environment passed to `configure'. However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost. In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'. For example:
+
+ ./configure CC=/usr/local2/bin/gcc
+
+causes the specified `gcc' to be used as the C compiler (unless it is
+overridden in the site shell script). Here is a another example:
+
+ /bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent
+configuration-related scripts to be executed by `/bin/bash'.
+
+`configure' Invocation
+======================
+
+`configure' recognizes the following options to control how it operates.
+
+`--help'
+`-h'
+ Print a summary of the options to `configure', and exit.
+
+`--version'
+`-V'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`--cache-file=FILE'
+ Enable the cache: use and save the results of the tests in FILE,
+ traditionally `config.cache'. FILE defaults to `/dev/null' to
+ disable caching.
+
+`--config-cache'
+`-C'
+ Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made. To
+ suppress all normal output, redirect it to `/dev/null' (any error
+ messages will still be shown).
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`configure' also accepts some other, not widely useful, options. Run
+`configure --help' for more details.
+
diff --git a/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/NEWS b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/NEWS
new file mode 100644
index 0000000..cd755d2
--- /dev/null
+++ b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/NEWS
@@ -0,0 +1,502 @@
+Sed 4.2.1
+
+* fix parsing of s/[[[[[[[[[]//
+
+* security contexts are preserved by -i too under SELinux
+
+* temporary files for sed -i are not made group/world-readable until
+ they are complete
+
+----------------------------------------------------------------------------
+Sed 4.2
+
+* now released under GPLv3
+
+* added a new extension `z` to clear pattern space even in the presence
+of invalid multibyte sequences
+
+* a preexisting GNU gettext installation is needed in order to compile
+GNU sed with NLS support
+
+* new option --follow-symlinks, available when editing a file in-place.
+This option may not be available on some systems (in this case, the
+option will *not* be a no-op; it will be completely unavailable).
+In the future, the option may be added as a no-op on systems without
+symbolic links at all, since in this case a no-op is effectively
+indistinguishable from a correct implementation.
+
+* hold-space is reset between different files in -i and -s modes.
+
+* multibyte processing fixed
+
+* the following GNU extensions are turned off by --posix: options [iImMsSxX]
+in the `s' command, address kinds `FIRST~STEP' and `ADDR1,+N' and `ADDR1,~N',
+line address 0, `e' or `z' commands, text between an `a' or `c' or `i'
+command and the following backslash, arguments to the `l' command.
+--posix disables all extensions to regular expressions.
+
+* fixed bug in 'i\' giving a segmentation violation if given alone.
+
+* much improved portability
+
+* much faster in UTF-8 locales
+
+* will correctly replace ACLs when using -i
+
+* will now accept NUL bytes for `.'
+
+----------------------------------------------------------------------------
+Sed 4.1.5
+
+* fix parsing of a negative character class not including a closed bracket,
+ like [^]] or [^]a-z].
+
+* fix parsing of [ inside an y command, like y/[/A/.
+
+* output the result of commands a, r, R when a q command is found.
+
+----------------------------------------------------------------------------
+Sed 4.1.4
+
+* \B correctly means "not on a word boundary" rather than "inside a word"
+
+* bugfixes for platform without internationalization
+
+* more thorough testing framework for tarballs (`make full-distcheck')
+
+----------------------------------------------------------------------------
+Sed 4.1.3
+
+* regex addresses do not use leftmost-longest matching. In other words,
+ /.\+/ only looks for a single character, and does not try to find as
+ many of them as possible like it used to do.
+
+* added a note to BUGS and the manual about changed interpretation
+ of `s|abc\|def||', and about localization issues.
+
+* fixed --disable-nls build problems on Solaris.
+
+* fixed `make check' in non-English locales.
+
+* `make check' tests the regex library by default if the included regex
+ is used (regex tests had to be enabled separately up to now).
+
+----------------------------------------------------------------------------
+Sed 4.1.2
+
+* fix bug in 'y' command in multi-byte character sets
+
+* fix severe bug in parsing of ranges with an embedded open bracket
+
+* fix off-by-one error when printing a "bad command" error
+
+----------------------------------------------------------------------------
+Sed 4.1.1
+
+* preserve permissions of in-place edited files
+
+* yield an error when running -i on terminals or other non regular files
+
+* do not interpret - as stdin when running in in-place editing mode
+
+* fix bug that prevented 's' command modifiers from working
+
+----------------------------------------------------------------------------
+Sed 4.1
+
+* // matches the last regular expression even in POSIXLY_CORRECT mode.
+
+* change the way we treat lines which are not terminated by a newline.
+Such lines are printed without the terminating newline (as before)
+but as soon as more text is sent to the same output stream, the
+missing newline is printed, so that the two lines don't concatenate.
+The behavior is now independent from POSIXLY_CORRECT because POSIX
+actually has undefined behavior in this case, and the new implementation
+arguably gives the ``least expected surprise''. Thanks to Stepan
+Kasal for the implementation.
+
+* documentation improvements, with updated references to the POSIX.2
+specification
+
+* error messages on I/O errors are better, and -i does not leave temporary
+files around (e.g. when running ``sed -i'' on a directory).
+
+* escapes are accepted in the y command (for example: y/o/\n/ transforms
+o's into newlines)
+
+* -i option tries to set the owner and group to the same as the input file
+
+* `L' command is deprecated and will be removed in sed 4.2.
+
+* line number addresses are processed differently -- this is supposedly
+conformant to POSIX and surely more idiot-proof. Line number addresses
+are not affected by jumping around them: they are activated and
+deactivated exactly where the script says, while previously
+ 5,8b
+ 1,5d
+would actually delete lines 1,2,3,4 and 9 (!).
+
+* multibyte characters are taken in consideration to compute the
+operands of s and y, provided you set LC_CTYPE correctly. They are
+also considered by \l, \L, \u, \U, \E.
+
+* [\n] matches either backslash or 'n' when POSIXLY_CORRECT.
+
+* new option --posix, disables all GNU extensions. POSIXLY_CORRECT only
+disables GNU extensions that violate the POSIX standard.
+
+* options -h and -V are not supported anymore, use --help and --version.
+
+* removed documentation for \s and \S which worked incorrectly
+
+* restored correct behavior for \w and \W: match [[:alnum:]_] and
+[^[:alnum:]_] (they used to match [[:alpha:]_] and [^[:alpha:]_]
+
+* the special address 0 can only be used in 0,/RE/ or 0~STEP addresses;
+other cases give an error (you are hindering portability for no reason
+if specifying 0,N and you are giving a dead command if specifying 0
+alone).
+
+* when a \ is used to escape the character that would terminate an operand
+of the s or y commands, the backslash is removed before the regex is
+compiled. This is left undefined by POSIX; this behavior makes `s+x\+++g'
+remove occurrences of `x+', consistently with `s/x\///g'. (However, if
+you enjoy yourself trying `s*x\***g', sed will use the `x*' regex, and you
+won't be able to pass down `x\*' while using * as the delimiter; ideas on
+how to simplify the parser in this respect, and/or gain more coherent
+semantics, are welcome).
+
+
+----------------------------------------------------------------------------
+Sed 4.0.9
+
+* 0 address behaves correctly in single-file (-i and -s) mode.
+
+* documentation improvements.
+
+* tested with many hosts and compilers.
+
+* updated regex matcher from upstream, with many bugfixes and speedups.
+
+* the `N' command's feature that is detailed in the BUGS file was disabled
+by the first change below in sed 4.0.8. The behavior has now been
+restored, and is only enabled if POSIXLY_CORRECT behavior is not
+requested.
+
+----------------------------------------------------------------------------
+Sed 4.0.8
+
+* fix `sed n' printing the last line twice.
+
+* fix incorrect error message for invalid character classes.
+
+* fix segmentation violation with repeated empty subexpressions.
+
+* fix incorrect parsing of ^ after escaped (.
+
+* more comprehensive test suite (and with many expected failures...)
+
+----------------------------------------------------------------------------
+Sed 4.0.7
+
+* VPATH builds working on non-glibc machines
+
+* fixed bug in s///Np: was printing even if less than N matches were
+found.
+
+* fixed infinite loop on s///N when LHS matched a null string and
+there were not enough matches in pattern space
+
+* behavior of s///N is consistent with s///g when the LHS can match
+a null string (and the infinite loop did not happen :-)
+
+* updated some translations
+
+----------------------------------------------------------------------------
+Sed 4.0.6
+
+* added parameter to `v' for the version of sed that is expected.
+
+* configure switch --without-included-regex to use the system regex matcher
+
+* fix for -i option under Cygwin
+
+----------------------------------------------------------------------------
+Sed 4.0.5
+
+* portability fixes
+
+* improvements to some error messages (e.g. y/abc/defg/ incorrectly said
+`excess characters after command' instead of `y arguments have different
+lengths')
+
+* `a', `i', `l', `L', `r' accept two addresses except in POSIXLY_CORRECT
+mode. Only `q' and `Q' do not accept two addresses in standard (GNU) mode.
+
+----------------------------------------------------------------------------
+Sed 4.0.4
+
+* documentation fixes
+
+* update regex matcher
+
+----------------------------------------------------------------------------
+Sed 4.0.3
+
+* fix packaging problem (two missing translation catalogs)
+
+----------------------------------------------------------------------------
+Sed 4.0.2
+
+* more translations
+
+* fix build problems (vpath builds and bootstrap builds)
+
+----------------------------------------------------------------------------
+Sed 4.0.1
+
+* Remove last vestiges of super-sed
+
+* man page automatically built
+
+* more translations provided
+
+* portability improvements
+
+----------------------------------------------------------------------------
+Sed 4.0
+
+* Update regex matcher
+
+----------------------------------------------------------------------------
+Sed 3.96
+
+* `y' command supports multibyte character sets
+
+* Update regex matcher
+
+----------------------------------------------------------------------------
+Sed 3.95
+
+* `R' command reads a single line from a file.
+
+* CR-LF pairs are always ignored under Windows, even if (under Cygwin)
+a disk is mounted as binary.
+
+* More attention to errors on stdout
+
+* New `W' command to write first line of pattern space to a file
+
+* Can customize line wrap width on single `l' commands
+
+* `L' command formats and reflows paragraphs like `fmt' does.
+
+* The test suite makefiles are better organized (this change is
+transparent however).
+
+* Compiles and bootstraps out-of-the-box under MinGW32 and Cygwin.
+
+* Optimizes cases when pattern space is truncated at its start or at
+its end by `D' or by a substitution command with an empty RHS.
+For example scripts like this,
+
+ seq 1 10000 | tr \\n \ | ./sed ':a; s/^[0-9][0-9]* //; ta'
+
+whose behavior was quadratic with previous versions of sed, have
+now linear behavior.
+
+* New command `e' to pipe the output of a command into the output
+of sed.
+
+* New option `e' to pass the output of the `s' command through the
+Bourne shell and get the result into pattern space.
+
+* Switched to obstacks in the parser -- less memory-related bugs
+(there were none AFAIK but you never know) and less memory usage.
+
+* New option -i, to support in-place editing a la Perl. Usually one
+had to use ed or, for more complex tasks, resort to Perl; this is
+not necessary anymore.
+
+* Dumped buffering code. The performance loss is 10%, but it caused
+bugs in systems with CRLF termination. The current solution is
+not definitive, though.
+
+* Bug fix: Made the behavior of s/A*/x/g (i.e. `s' command with a
+possibly empty LHS) more consistent:
+
+ pattern GNU sed 3.x GNU sed 4.x
+ B xBx xBx
+ BC xBxCx xBxCx
+ BAC xBxxCx xBxCx
+ BAAC xBxxCx xBxCx
+
+* Bug fix: the // empty regular expressions now refers to the last
+regular expression that was matched, rather than to the last
+regular expression that was compiled. This richer behavior seems
+to be the correct one (albeit neither one is POSIXLY_CORRECT).
+
+* Check for invalid backreferences in the RHS of the `s' command
+(e.g. s/1234/\1/)
+
+* Support for \[lLuUE] in the RHS of the `s' command like in Perl.
+
+* New regular expression matcher
+
+* Bug fix: if a file was redirected to be stdin, sed did not consume
+it. So
+ (sed d; sed G) < TESTFILE
+
+double-spaced TESTFILE, while the equivalent `useless use of cat'
+ cat TESTFILE | (sed d; sed G)
+
+printed nothing (which is the correct behavior). A test for this
+bug was added to the test suite.
+
+* The documentation is now much better, with a few examples provided,
+and a thorough description of regular expressions. The manual often
+refers to "GNU extensions", but if they are described here they are
+specific to this version.
+
+* Documented command-line option:
+ -r, --regexp-extended
+ Use extended regexps -- e.g. (abc+) instead of \(abc\+\)
+
+* Added feature to the `w' command and to the `w' option of the `s'
+command: if the file name is /dev/stderr, it means the standard
+error (inspired by awk); and similarly for /dev/stdout. This is
+disabled if POSIXLY_CORRECT is set.
+
+* Added `m' and `M' modifiers to `s' command for multi-line
+matching (Perl-style); in addresses, only `M' works.
+
+* Added `Q' command for `silent quit'; added ability to pass
+an exit code from a sed script to the caller.
+
+* Added `T' command for `branch if failed'.
+
+* Added `v' command, which is a do-nothing intended to fail on
+seds that do not support GNU sed 4.0's extensions.
+
+----------------------------------------------------------------------------
+Sed 3.02.80
+
+* Started new version nomenclature for pre-3.03 releases. (I'm being
+pessimistic in assuming that .90 won't give me enough breathing room.)
+
+* Bug fixes: the regncomp()/regnexec() interfaces proved to be inadequate to
+properly handle expressions such as "s/\</#/g". Re-abstracted the regex
+code in the sed/ tree, and now use the re_search_2() interface to the GNU
+regex routines. This change also fixed a bug where /./ did not match the
+NUL character. Had the glibc folk fix a bug in lib/regex.c where
+'s/0*\([0-9][0-9]\)/X\1X/' failed to match on input "002".
+
+* Added new command-line options:
+ -u, --unbuffered
+ Do not attempt to read-ahead more than required; do not buffer stdout.
+ -l N, --line-length=N
+ Specify the desired line-wrap length for the `l' command.
+ A length of "0" means "never wrap".
+
+* New internationalization translations added: fr ru de it el sk pt_BR sv
+(plus nl from 3.02a).
+
+* The s/// command now understands the following escapes
+(in both halves):
+ \a an "alert" (BEL)
+ \f a form-feed
+ \n a newline
+ \r a carriage-return
+ \t a horizontal tab
+ \v a vertical tab
+ \oNNN a character with the octal value NNN
+ \dNNN a character with the decimal value NNN
+ \xNN a character with the hexadecimal value NN
+This behavior is disabled if POSIXLY_CORRECT is set, at least for the
+time being (until I can be convinced that this behavior does not violate
+the POSIX standard). (Incidentally, \b (backspace) was omitted because
+of the conflict with the existing "word boundary" meaning. \ooo octal
+format was omitted because of the conflict with backreference syntax.)
+
+* If POSIXLY_CORRECT is set, the empty RE // now is the null match
+instead of "repeat the last REmatch". As far as I can tell
+this behavior is mandated by POSIX, but it would break too many
+legacy sed scripts to blithely change GNU sed's default behavior.
+
+----------------------------------------------------------------------------
+Sed 3.02a
+
+* Added internationalization support, and an initial (already out of date)
+set of Dutch message translations (both provided by Erick Branderhorst).
+
+* Added support for scripts like:
+ sed -e 1ifoo -e '$abar'
+(note no need for \ <newline> after a, i, and c commands).
+Also, conditionally (on NO_INPUT_INDENT) added
+experimental support for skipping leading whitespace on
+each {a,i,c} input line.
+
+* Added addressing of the form:
+ /foo/,+5 p (print from foo to 5th line following)
+ /foo/,~5 p (print from foo to next line whose line number is a multiple of 5)
+The first address of these can be any of the previously existing
+addressing types; the +N and ~N forms are only allowed as the
+second address of a range.
+
+* Added support for pseudo-address "0" as the first address in an
+address-range, simplifying scripts which happen to match the end
+address on the first line of input. For example, a script
+which deletes all lines from the beginning of the file to the
+first line which contains "foo" is now simply "sed 0,/foo/d",
+whereas before one had to go through contortions to deal with
+the possibility that "foo" might appear on the first line of
+the input.
+
+* Made NUL characters in regexps work "correctly" --- i.e., a NUL
+in a RE matches a NUL; it does not prematurely terminate the RE.
+(This only works in -f scripts, as the POSIX.1 exec*() interface
+only passes NUL-terminated strings, and so sed will only be able
+to see up to the first NUL in any -e scriptlet.)
+
+* Wherever a `;' is accepted as a command terminator, also allow a `}'
+or a `#' to appear. (This allows for less cluttered-looking scripts.)
+
+* Lots of internal changes that are only relevant to source junkies
+and development testing. Some of which might cause imperceptible
+performance improvements.
+
+----------------------------------------------------------------------------
+Sed 3.02
+
+* Fixed a bug in the parsing of character classes (e.g., /[[:space:]]/).
+Corrected an omission in djgpp/Makefile.am and an improper dependency
+in testsuite/Makefile.am.
+
+----------------------------------------------------------------------------
+Sed 3.01
+
+* This version of sed mainly contains bug fixes and portability
+enhancements, plus performance enhancements related to sed's handling
+of input files. Due to excess performance penalties, I have reverted
+(relative to 3.00) to using regex.c instead of the rx package for
+regular expression handling, at the expense of losing true POSIX.2
+BRE compatibility. However, performance related to regular expression
+handling *still* needs a fair bit of work.
+
+* One new feature has been added: regular expressions may be followed
+with an "I" directive ("i" was taken [the "i"nsert command]) to
+indicate that the regexp should be matched in a case-insensitive
+manner. Also of note are a new organization to the source code,
+new documentation, and a new maintainer.
+
+----------------------------------------------------------------------------
+Sed 3.0
+
+* This version of sed passes the new test-suite donated by
+Jason Molenda.
+
+* Overall performance has been improved in the following sense: Sed 3.0
+is often slightly slower than sed 2.05. On a few scripts, though, sed
+2.05 was so slow as to be nearly useless or to use up unreasonable
+amounts of memory. These problems have been fixed and in such cases,
+sed 3.0 should have acceptable performance.
diff --git a/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/README b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/README
new file mode 100644
index 0000000..3da31c2
--- /dev/null
+++ b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/README
@@ -0,0 +1,13 @@
+This is the GNU implementation of sed, the Unix stream editor.
+
+See the NEWS file for a brief summary and the ChangeLog for
+more detailed descriptions of changes.
+
+See the file INSTALL for generic compilation and installation
+instructions.
+
+See the file BUGS for instructions about reporting bugs.
+
+The file README.boot gives instructions for making a "bootstrap"
+version of sed on systems which lack any pre-existing and working
+version of sed.
diff --git a/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/README-alpha b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/README-alpha
new file mode 100644
index 0000000..9235efe
--- /dev/null
+++ b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/README-alpha
@@ -0,0 +1,8 @@
+This is an alpha version of GNU sed. Please try it on a wide
+range of scripts (especially configure scripts) and submit
+bug reports to bonzini@gnu.org.
+
+Thanks,
+
+Paolo Bonzini
+GNU sed maintainer
diff --git a/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/README.boot b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/README.boot
new file mode 100644
index 0000000..fd2d1a0
--- /dev/null
+++ b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/README.boot
@@ -0,0 +1,23 @@
+Because a working sed is a prerequisite for running the ``configure''
+script, I have provided the script ``bootstrap.sh'' which will attempt
+to build a version of sed adequate for running ``configure''. If it
+fails, edit the ``config.h'' file that was created according to the
+comments found therein, and then try running ``bootstrap.sh'' again.
+
+The bootstrap build is quite likely to babble on and on with
+various compiler warnings. You may want to tell bootstrap.sh
+how to invoke your compiler with warnings disabled. For example,
+with a Bourne-like shell and gcc one could use:
+ $ CC='gcc -w' sh bootstrap.sh
+or with a csh-like shell, one could try:
+ % env CC='gcc -w' sh bootstrap.sh
+
+Once you get a working version of sed, temporarily install sed/sed
+somewhere in your $PATH, and then really re-build the normal way
+(starting with ``sh configure''); the bootstrap version is almost
+certainly more crippled than it needs to be on your machine.
+
+I don't much care to hear about any bugs in ``bootstrap'' versions
+of sed beyond those which actually keep the ``bootstrap'' version from
+building, or sed's configure script from running properly. I am
+especially uninterested in compiler warnings from the bootstrap build.
diff --git a/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/THANKS b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/THANKS
new file mode 100644
index 0000000..76397d2
--- /dev/null
+++ b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/THANKS
@@ -0,0 +1,54 @@
+Akim Demaille <akim@epita.fr>
+Alan Modra <alan@spri.levels.unisa.edu.au>
+Arnold Robbins <arnold@skeeve.com>
+Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
+Andrew Herbert <andrew@werple.apana.org.au>
+Bruno Haible <haible@ilog.fr>
+Chip Salzenberg <chip@fin.uucp>
+Chris Weber <weber@bucknell.edu>
+Corinna Vinschen <vinschen@redhat.com>
+Daniel R. Grayson <dan@math.uiuc.edu>
+David Eckelkamp <eckelkamp@mcc.com>
+David J. MacKenzie <djm@nutrimat>
+David Schmidt <davids@isc-br.isc-br.com>
+Dietrich Kappe <kap1@tao.cpe.uchicago.edu>
+Doug McIlroy <doug@research.att.com>
+Eero Hakkinen <eero17@bigfoot.com>
+Eli Zaretskii <eliz@is.elta.co.il>
+Eric Pement <epement@moody.edu>
+Erick Branderhorst <Erick.Branderhorst@asml.nl>
+Francois Pinard <pinard@iro.umontreal.ca>
+Gaumond Pierre <gaumondp@ERE.UMontreal.CA>
+Greg Ubben <gsu@romulus.ncsc.mil>
+Isamu Hasegawa <isamu@yamato.ibm.com>
+J.T. Conklin <jtc@gain.com>
+Jakub Jelinek <jakub@redhat.com>
+Jason Molenda <crash@cygnus.com>
+Jim Meyering <meyering@ascend.com>
+Laurent Vogel <lvl@club-internet.fr>
+Karl Berry <karl@freefriends.org>
+Karl Heuer <kwzh@gnu.org>
+Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+Kevin Buettner <kev@cujo.geg.mot.com>
+Maciej W. Rozycki <macro@linux-mips.org>
+Mark Kettenis <kettenis@phys.uva.nl>
+Michael De La Rue <delarue@NTCCSC01WA.ntc.nokia.com>
+Michel de Ruiter <mdruiter@cs.vu.nl>
+Paul Eggert <eggert@twinsun.com>
+Robert A Bruce <rab@allspice.berkeley.edu>
+Ronnie Glasscock <Ronnie.N.Glasscock@bridge.bellsouth.com>
+Sergey Farbotka <z8sergey8z@gmail.com>
+Simon Taylor <simon@unisolve.com.au>
+Stepan Kasal <kasal@ucw.cz>
+Stephen Davis <stephend@ksr.com>
+Steve Ingram <si@maps-r-us.com>
+Tapani Tarvainen <tarvaine@tukki.jyu.fi>
+Timothy J Luoma <luomat@peak.org>
+Tom R.Hageman <tom@basil.icce.rug.nl>
+Ulrich Drepper <drepper@redhat.com>
+Vladimir Marek <vladimir.marek@sun.com>
+Vladimir Volovich <vvv@vvv.vsu.ru>
+Wichert Akkerman <wakkerma@debian.org>
+Zhongxing Xu <xuzhongxing@gmail.com>
+
+And the GNU translation teams.
diff --git a/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/po/ChangeLog b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/po/ChangeLog
new file mode 100644
index 0000000..0042d6f
--- /dev/null
+++ b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/po/ChangeLog
@@ -0,0 +1,53 @@
+2004-11-11 Paolo Bonzini <bonzini@gnu.org>
+
+ * Makevars: New.
+
+2004-11-02 gettextize <bug-gnu-utils@gnu.org>
+
+ * Makefile.in.in: Upgrade to gettext-0.10.40.
+
+2002-10-26 Paolo Bonzini <bonzini@gnu.org>
+
+ * po/*.po: updated from Translation Project
+
+2001-10-19 gettextize <bug-gnu-utils@gnu.org>
+
+ * Makefile.in.in: Upgrade to gettext-0.10.40.
+ * cat-id-tbl.c: Remove file.
+ * stamp-cat-id: Remove file.
+
+2001-03-02 Paolo Bonzini <bonzini@gnu.org>
+
+ * po/it.po: updated
+ * po/sed.pot: likewise.
+
+2000-12-10 Paolo Bonzini <bonzini@gnu.org>
+
+ * po/it.po: Italian translation reviewed for new POT file.
+ * po/sed.pot: updated
+
+Mon Mar 15 16:25:53 PST 1999 Ken Pizzini <ken@gnu.org>
+
+ * po/it.po: new translation file.
+
+Sun Feb 7 21:22:17 PST 1999 Ken Pizzini <ken@gnu.org>
+
+ * po/de.po: new translation file.
+
+Sat Dec 12 11:18:55 PST 1998 Ken Pizzini <ken@gnu.org>
+
+ * po/ru.po: new translation file.
+
+Sun Dec 6 00:51:23 PST 1998 Ken Pizzini <ken@gnu.org>
+
+ * po/fr.po: new translation file.
+
+Sun Aug 16 02:59:20 PDT 1998 Ken Pizzini <ken@gnu.org>
+
+ * sed/compile.c: added N_() markers and corresponding gettext()
+ (er, _()) calls.
+ * po/sed.pot: updated to reflect changed and newly marked text.
+
+1998-07-24 Erick Branderhorst <Erick.Branderhorst@asml.nl>
+
+ * po/nl.po: Dutch translation.
diff --git a/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex10.c b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex10.c
new file mode 100644
index 0000000..1a21617
--- /dev/null
+++ b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex10.c
@@ -0,0 +1,65 @@
+/* Test for re_match with non-zero start.
+ Copyright (C) 2002 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA. */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <locale.h>
+#include <stdio.h>
+#include <string.h>
+#include <regex.h>
+
+int
+main (void)
+{
+ struct re_pattern_buffer regex;
+ struct re_registers regs;
+ const char *s;
+ int match;
+ int result = 0;
+
+ regs.num_regs = 1;
+ memset (&regex, '\0', sizeof (regex));
+ s = re_compile_pattern ("[abc]*d", 7, &regex);
+ if (s != NULL)
+ {
+ puts ("re_compile_pattern return non-NULL value");
+ result = 1;
+ }
+ else
+ {
+ match = re_match (&regex, "foacabdxy", 9, 2, &regs);
+ if (match != 5)
+ {
+ printf ("re_match returned %d, expected 5\n", match);
+ result = 1;
+ }
+ else if (regs.start[0] != 2 || regs.end[0] != 7)
+ {
+ printf ("re_match returned %d..%d, expected 2..7\n",
+ regs.start[0], regs.end[0]);
+ result = 1;
+ }
+ puts (" -> OK");
+ }
+
+ return result;
+}
diff --git a/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex11.c b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex11.c
new file mode 100644
index 0000000..dbfa3f9
--- /dev/null
+++ b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex11.c
@@ -0,0 +1,143 @@
+/* Regular expression tests.
+ Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA. */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/types.h>
+#ifdef HAVE_MCHECK_H
+#include <mcheck.h>
+#endif
+#include <regex.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/* Tests supposed to match. */
+struct
+{
+ const char *pattern;
+ const char *string;
+ int flags, nmatch;
+ regmatch_t rm[5];
+} tests[] = {
+ /* Test for newline handling in regex. */
+ { "[^~]*~", "\nx~y", 0, 2, { { 0, 3 }, { -1, -1 } } },
+ /* Other tests. */
+ { "a(.*)b", "a b", REG_EXTENDED, 2, { { 0, 3 }, { 1, 2 } } },
+ { ".*|\\([KIO]\\)\\([^|]*\\).*|?[KIO]", "10~.~|P|K0|I10|O16|?KSb", 0, 3,
+ { { 0, 21 }, { 15, 16 }, { 16, 18 } } },
+ { ".*|\\([KIO]\\)\\([^|]*\\).*|?\\1", "10~.~|P|K0|I10|O16|?KSb", 0, 3,
+ { { 0, 21 }, { 8, 9 }, { 9, 10 } } },
+ { "^\\(a*\\)\\1\\{9\\}\\(a\\{0,9\\}\\)\\([0-9]*;.*[^a]\\2\\([0-9]\\)\\)",
+ "a1;;0a1aa2aaa3aaaa4aaaaa5aaaaaa6aaaaaaa7aaaaaaaa8aaaaaaaaa9aa2aa1a0", 0,
+ 5, { { 0, 67 }, { 0, 0 }, { 0, 1 }, { 1, 67 }, { 66, 67 } } },
+ /* Test for BRE expression anchoring. POSIX says just that this may match;
+ in glibc regex it always matched, so avoid changing it. */
+ { "\\(^\\|foo\\)bar", "bar", 0, 2, { { 0, 3 }, { -1, -1 } } },
+ { "\\(foo\\|^\\)bar", "bar", 0, 2, { { 0, 3 }, { -1, -1 } } },
+ /* In ERE this must be treated as an anchor. */
+ { "(^|foo)bar", "bar", REG_EXTENDED, 2, { { 0, 3 }, { -1, -1 } } },
+ { "(foo|^)bar", "bar", REG_EXTENDED, 2, { { 0, 3 }, { -1, -1 } } },
+ /* Here ^ cannot be treated as an anchor according to POSIX. */
+ { "(^|foo)bar", "(^|foo)bar", 0, 2, { { 0, 10 }, { -1, -1 } } },
+ { "(foo|^)bar", "(foo|^)bar", 0, 2, { { 0, 10 }, { -1, -1 } } },
+ /* More tests on backreferences. */
+ { "()\\1", "x", REG_EXTENDED, 2, { { 0, 0 }, { 0, 0 } } },
+ { "()x\\1", "x", REG_EXTENDED, 2, { { 0, 1 }, { 0, 0 } } },
+ { "()\\1*\\1*", "", REG_EXTENDED, 2, { { 0, 0 }, { 0, 0 } } },
+ { "([0-9]).*\\1(a*)", "7;7a6", REG_EXTENDED, 3, { { 0, 4 }, { 0, 1 }, { 3, 4 } } },
+ { "([0-9]).*\\1(a*)", "7;7a", REG_EXTENDED, 3, { { 0, 4 }, { 0, 1 }, { 3, 4 } } },
+ { "(b)()c\\1", "bcb", REG_EXTENDED, 3, { { 0, 3 }, { 0, 1 }, { 1, 1 } } },
+ { "()(b)c\\2", "bcb", REG_EXTENDED, 3, { { 0, 3 }, { 0, 0 }, { 0, 1 } } },
+ { "a(b)()c\\1", "abcb", REG_EXTENDED, 3, { { 0, 4 }, { 1, 2 }, { 2, 2 } } },
+ { "a()(b)c\\2", "abcb", REG_EXTENDED, 3, { { 0, 4 }, { 1, 1 }, { 1, 2 } } },
+ { "()(b)\\1c\\2", "bcb", REG_EXTENDED, 3, { { 0, 3 }, { 0, 0 }, { 0, 1 } } },
+ { "(b())\\2\\1", "bbbb", REG_EXTENDED, 3, { { 0, 2 }, { 0, 1 }, { 1, 1 } } },
+ { "a()(b)\\1c\\2", "abcb", REG_EXTENDED, 3, { { 0, 4 }, { 1, 1 }, { 1, 2 } } },
+ { "a()d(b)\\1c\\2", "adbcb", REG_EXTENDED, 3, { { 0, 5 }, { 1, 1 }, { 2, 3 } } },
+ { "a(b())\\2\\1", "abbbb", REG_EXTENDED, 3, { { 0, 3 }, { 1, 2 }, { 2, 2 } } },
+ { "(bb())\\2\\1", "bbbb", REG_EXTENDED, 3, { { 0, 4 }, { 0, 2 }, { 2, 2 } } },
+ { "^(.?)(.?)(.?)(.?)(.?).?\\5\\4\\3\\2\\1$",
+ "level", REG_NOSUB | REG_EXTENDED, 0, { { -1, -1 } } },
+ { "^(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.).?\\9\\8\\7\\6\\5\\4\\3\\2\\1$|^.?$",
+ "level", REG_NOSUB | REG_EXTENDED, 0, { { -1, -1 } } },
+ { "^(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.).?\\9\\8\\7\\6\\5\\4\\3\\2\\1$|^.?$",
+ "abcdedcba", REG_EXTENDED, 1, { { 0, 9 } } },
+#if 0
+ /* XXX Not used since they fail so far. */
+ { "^(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.).?\\9\\8\\7\\6\\5\\4\\3\\2\\1$|^.?$",
+ "ababababa", REG_EXTENDED, 1, { { 0, 9 } } },
+ { "^(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?).?\\9\\8\\7\\6\\5\\4\\3\\2\\1$",
+ "level", REG_NOSUB | REG_EXTENDED, 0, { { -1, -1 } } },
+ { "^(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?).?\\9\\8\\7\\6\\5\\4\\3\\2\\1$",
+ "ababababa", REG_EXTENDED, 1, { { 0, 9 } } },
+#endif
+};
+
+int
+main (void)
+{
+ regex_t re;
+ regmatch_t rm[5];
+ size_t i;
+ int n, ret = 0;
+
+#ifdef HAVE_MCHECK_H
+ mtrace ();
+#endif
+
+ for (i = 0; i < sizeof (tests) / sizeof (tests[0]); ++i)
+ {
+ n = regcomp (&re, tests[i].pattern, tests[i].flags);
+ if (n != 0)
+ {
+ char buf[500];
+ regerror (n, &re, buf, sizeof (buf));
+ printf ("%s: regcomp %lu failed: %s\n", tests[i].pattern, i, buf);
+ ret = 1;
+ continue;
+ }
+
+ if (regexec (&re, tests[i].string, tests[i].nmatch, rm, 0))
+ {
+ printf ("%s: regexec %lu failed\n", tests[i].pattern, i);
+ ret = 1;
+ regfree (&re);
+ continue;
+ }
+
+ for (n = 0; n < tests[i].nmatch; ++n)
+ if (rm[n].rm_so != tests[i].rm[n].rm_so
+ || rm[n].rm_eo != tests[i].rm[n].rm_eo)
+ {
+ if (tests[i].rm[n].rm_so == -1 && tests[i].rm[n].rm_eo == -1)
+ break;
+ printf ("%s: regexec %lu match failure rm[%d] %d..%d\n",
+ tests[i].pattern, i, n, rm[n].rm_so, rm[n].rm_eo);
+ ret = 1;
+ break;
+ }
+
+ regfree (&re);
+ }
+
+ return ret;
+}
diff --git a/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex12.c b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex12.c
new file mode 100644
index 0000000..a4db0cc
--- /dev/null
+++ b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex12.c
@@ -0,0 +1,81 @@
+/* Regular expression tests.
+ Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA. */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/types.h>
+#ifdef HAVE_MCHECK_H
+#include <mcheck.h>
+#endif
+#include <regex.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/* Tests supposed to not match. */
+struct
+{
+ const char *pattern;
+ const char *string;
+ int flags, nmatch;
+} tests[] = {
+ { "^<\\([^~]*\\)\\([^~]\\)[^~]*~\\1\\(.\\).*|=.*\\3.*\\2",
+ "<,.8~2,~so-|=-~.0,123456789<><", REG_NOSUB, 0 },
+ /* In ERE, all carets must be treated as anchors. */
+ { "a^b", "a^b", REG_EXTENDED, 0 }
+};
+
+int
+main (void)
+{
+ regex_t re;
+ regmatch_t rm[4];
+ size_t i;
+ int n, ret = 0;
+
+#ifdef HAVE_MCHECK_H
+ mtrace ();
+#endif
+
+ for (i = 0; i < sizeof (tests) / sizeof (tests[0]); ++i)
+ {
+ n = regcomp (&re, tests[i].pattern, tests[i].flags);
+ if (n != 0)
+ {
+ char buf[500];
+ regerror (n, &re, buf, sizeof (buf));
+ printf ("regcomp %lu failed: %s\n", i, buf);
+ ret = 1;
+ continue;
+ }
+
+ if (! regexec (&re, tests[i].string, tests[i].nmatch,
+ tests[i].nmatch ? rm : NULL, 0))
+ {
+ printf ("regexec %lu incorrectly matched\n", i);
+ ret = 1;
+ }
+
+ regfree (&re);
+ }
+
+ return ret;
+}
diff --git a/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex13.c b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex13.c
new file mode 100644
index 0000000..a28c5fa
--- /dev/null
+++ b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex13.c
@@ -0,0 +1,111 @@
+/* Regular expression tests.
+ Copyright (C) 2002 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>, 2002.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA. */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/types.h>
+#ifdef HAVE_MCHECK_H
+#include <mcheck.h>
+#endif
+#include <regex.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+static struct
+{
+ int syntax;
+ const char *pattern;
+ const char *string;
+ int start;
+} tests[] = {
+ {RE_BACKSLASH_ESCAPE_IN_LISTS, "[0\\-9]", "1", -1}, /* It should not match. */
+ {RE_BACKSLASH_ESCAPE_IN_LISTS, "[0\\-9]", "-", 0}, /* It should match. */
+ {RE_SYNTAX_POSIX_BASIC, "s1\n.*\ns3", "s1\ns2\ns3", 0},
+ {RE_SYNTAX_POSIX_EXTENDED, "ab{0}c", "ac", 0},
+ {RE_SYNTAX_POSIX_EXTENDED, "ab{0}c", "abc", -1},
+ {RE_SYNTAX_POSIX_EXTENDED, "ab{0}c", "abbc", -1},
+ /* Nested duplication. */
+ {RE_SYNTAX_POSIX_EXTENDED, "ab{1}{1}c", "ac", -1},
+ {RE_SYNTAX_POSIX_EXTENDED, "ab{1}{1}c", "abc", 0},
+ {RE_SYNTAX_POSIX_EXTENDED, "ab{1}{1}c", "abbc", -1},
+ {RE_SYNTAX_POSIX_EXTENDED, "ab{2}{2}c", "ac", -1},
+ {RE_SYNTAX_POSIX_EXTENDED, "ab{2}{2}c", "abbc", -1},
+ {RE_SYNTAX_POSIX_EXTENDED, "ab{2}{2}c", "abbbbc", 0},
+ {RE_SYNTAX_POSIX_EXTENDED, "ab{2}{2}c", "abbbbbc", -1},
+ {RE_SYNTAX_POSIX_EXTENDED, "ab{0}{1}c", "ac", 0},
+ {RE_SYNTAX_POSIX_EXTENDED, "ab{0}{1}c", "abc", -1},
+ {RE_SYNTAX_POSIX_EXTENDED, "ab{0}{1}c", "abbc", -1},
+ {RE_SYNTAX_POSIX_EXTENDED, "ab{1}{0}c", "ac", 0},
+ {RE_SYNTAX_POSIX_EXTENDED, "ab{1}{0}c", "abc", -1},
+ {RE_SYNTAX_POSIX_EXTENDED, "ab{1}{0}c", "abbc", -1},
+ {RE_SYNTAX_POSIX_EXTENDED, "ab{0}*c", "ac", 0},
+ {RE_SYNTAX_POSIX_EXTENDED, "ab{0}*c", "abc", -1},
+ {RE_SYNTAX_POSIX_EXTENDED, "ab{0}*c", "abbc", -1},
+ {RE_SYNTAX_POSIX_EXTENDED, "ab{0}?c", "ac", 0},
+ {RE_SYNTAX_POSIX_EXTENDED, "ab{0}?c", "abc", -1},
+ {RE_SYNTAX_POSIX_EXTENDED, "ab{0}?c", "abbc", -1},
+ {RE_SYNTAX_POSIX_EXTENDED, "ab{0}+c", "ac", 0},
+ {RE_SYNTAX_POSIX_EXTENDED, "ab{0}+c", "abc", -1},
+ {RE_SYNTAX_POSIX_EXTENDED, "ab{0}+c", "abbc", -1},
+};
+
+int
+main (void)
+{
+ struct re_pattern_buffer regbuf;
+ const char *err;
+ size_t i;
+ int ret = 0;
+
+#ifdef HAVE_MCHECK_H
+ mtrace ();
+#endif
+
+ for (i = 0; i < sizeof (tests) / sizeof (tests[0]); ++i)
+ {
+ int start;
+ re_set_syntax (tests[i].syntax);
+ memset (&regbuf, '\0', sizeof (regbuf));
+ err = re_compile_pattern (tests[i].pattern, strlen (tests[i].pattern),
+ &regbuf);
+ if (err != NULL)
+ {
+ printf ("re_compile_pattern failed: %s\n", err);
+ ret = 1;
+ continue;
+ }
+
+ start = re_search (&regbuf, tests[i].string, strlen (tests[i].string),
+ 0, strlen (tests[i].string), NULL);
+ if (start != tests[i].start)
+ {
+ printf ("re_search failed %d\n", start);
+ ret = 1;
+ regfree (&regbuf);
+ continue;
+ }
+ regfree (&regbuf);
+ }
+
+ return ret;
+}
diff --git a/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex14.c b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex14.c
new file mode 100644
index 0000000..4b296d8
--- /dev/null
+++ b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex14.c
@@ -0,0 +1,62 @@
+/* Tests re_comp and re_exec.
+ Copyright (C) 2002 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>, 2002.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA. */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define _REGEX_RE_COMP
+#include <sys/types.h>
+#ifdef HAVE_MCHECK_H
+#include <mcheck.h>
+#endif
+#include <regex.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main (void)
+{
+ const char *err;
+ size_t i;
+ int ret = 0;
+
+#ifdef HAVE_MCHECK_H
+ mtrace ();
+#endif
+
+ for (i = 0; i < 100; ++i)
+ {
+ err = re_comp ("a t.st");
+ if (err)
+ {
+ printf ("re_comp failed: %s\n", err);
+ ret = 1;
+ }
+
+ if (! re_exec ("This is a test."))
+ {
+ printf ("re_exec failed\n");
+ ret = 1;
+ }
+ }
+
+ return ret;
+}
diff --git a/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex15.c b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex15.c
new file mode 100644
index 0000000..76aa92d
--- /dev/null
+++ b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex15.c
@@ -0,0 +1,53 @@
+/* Test for memory/CPU leak in regcomp. */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/types.h>
+#include <sys/time.h>
+#ifdef HAVE_SYS_RESOURCE_H
+#include <sys/resource.h>
+#endif
+#include <regex.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define TEST_DATA_LIMIT (32 << 20)
+
+int
+main ()
+{
+#ifdef RLIMIT_DATA
+ regex_t re;
+ int reerr;
+
+ /* Try to avoid eating all memory if a test leaks. */
+ struct rlimit data_limit;
+ if (getrlimit (RLIMIT_DATA, &data_limit) == 0)
+ {
+ if ((rlim_t) TEST_DATA_LIMIT > data_limit.rlim_max)
+ data_limit.rlim_cur = data_limit.rlim_max;
+ else if (data_limit.rlim_cur > (rlim_t) TEST_DATA_LIMIT)
+ data_limit.rlim_cur = (rlim_t) TEST_DATA_LIMIT;
+ if (setrlimit (RLIMIT_DATA, &data_limit) < 0)
+ perror ("setrlimit: RLIMIT_DATA");
+ }
+ else
+ perror ("getrlimit: RLIMIT_DATA");
+
+ reerr = regcomp (&re, "^6?3?[25]?5?[14]*[25]*[69]*+[58]*87?4?$",
+ REG_EXTENDED | REG_NOSUB);
+ if (reerr != 0)
+ {
+ char buf[100];
+ regerror (reerr, &re, buf, sizeof buf);
+ printf ("regerror %s\n", buf);
+ return 1;
+ }
+
+ return 0;
+#else
+ return 77;
+#endif
+}
diff --git a/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex16.c b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex16.c
new file mode 100644
index 0000000..7a1d3c8
--- /dev/null
+++ b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex16.c
@@ -0,0 +1,39 @@
+/* Test re_compile_pattern error messages. */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <regex.h>
+
+int
+main (void)
+{
+ struct re_pattern_buffer re;
+ const char *s;
+ int ret = 0;
+
+ re_set_syntax (RE_SYNTAX_POSIX_EGREP);
+ memset (&re, 0, sizeof (re));
+ s = re_compile_pattern ("[[.invalid_collating_symbol.]]", 30, &re);
+ if (s == NULL || strcmp (s, "Invalid collation character"))
+ {
+ printf ("re_compile_pattern returned %s\n", s);
+ ret = 1;
+ }
+ s = re_compile_pattern ("[[=invalid_equivalence_class=]]", 31, &re);
+ if (s == NULL || strcmp (s, "Invalid collation character"))
+ {
+ printf ("re_compile_pattern returned %s\n", s);
+ ret = 1;
+ }
+ s = re_compile_pattern ("[[:invalid_character_class:]]", 29, &re);
+ if (s == NULL || strcmp (s, "Invalid character class name"))
+ {
+ printf ("re_compile_pattern returned %s\n", s);
+ ret = 1;
+ }
+ return ret;
+}
diff --git a/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex21.c b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex21.c
new file mode 100644
index 0000000..0232876
--- /dev/null
+++ b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex21.c
@@ -0,0 +1,53 @@
+/* Test for memory leaks in regcomp.
+ Copyright (C) 2003 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA. */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef HAVE_MCHECK_H
+#include <mcheck.h>
+#endif
+#include <regex.h>
+#include <stdio.h>
+
+int main (void)
+{
+ regex_t re;
+ int i;
+ int ret = 0;
+
+#ifdef HAVE_MCHECK_H
+ mtrace ();
+#endif
+
+ for (i = 0; i < 32; ++i)
+ {
+ if (regcomp (&re, "X-.+:.+Y=\".*\\.(A|B|C|D|E|F|G|H|I",
+ REG_EXTENDED | REG_ICASE) == 0)
+ {
+ puts ("regcomp unexpectedly succeeded");
+ ret = 1;
+ }
+ else
+ regfree (&re);
+ }
+ return ret;
+}
diff --git a/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex27.c b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex27.c
new file mode 100644
index 0000000..340ade9
--- /dev/null
+++ b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex27.c
@@ -0,0 +1,65 @@
+/* Test REG_NEWLINE.
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Jakub Jelinek <jakub@redhat.com>, 2007.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <config.h>
+#include <regex.h>
+#include <stdio.h>
+#include <string.h>
+
+struct tests
+{
+ const char *regex;
+ const char *string;
+ int cflags;
+ int retval;
+} tests[] = {
+ { "a.b", "a\nb", REG_EXTENDED | REG_NEWLINE, REG_NOMATCH },
+ { "a.b", "a\nb", REG_EXTENDED, 0 },
+ { "a[^x]b", "a\nb", REG_EXTENDED | REG_NEWLINE, REG_NOMATCH },
+ { "a[^x]b", "a\nb", REG_EXTENDED, 0 }
+};
+
+int
+main (void)
+{
+ regex_t r;
+ size_t i;
+ int ret = 0;
+
+ for (i = 0; i < sizeof (tests) / sizeof (tests[i]); ++i)
+ {
+ memset (&r, 0, sizeof (r));
+ if (regcomp (&r, tests[i].regex, tests[i].cflags))
+ {
+ printf ("regcomp %lu failed\n", i);
+ ret = 1;
+ continue;
+ }
+ int rv = regexec (&r, tests[i].string, 0, NULL, 0);
+ if (rv != tests[i].retval)
+ {
+ printf ("regexec %lu unexpected value %d != %d\n",
+ i, rv, tests[i].retval);
+ ret = 1;
+ }
+ regfree (&r);
+ }
+ return ret;
+}
diff --git a/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex28.c b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex28.c
new file mode 100644
index 0000000..f546b35
--- /dev/null
+++ b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex28.c
@@ -0,0 +1,76 @@
+/* Test RE_HAT_LISTS_NOT_NEWLINE and RE_DOT_NEWLINE.
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Jakub Jelinek <jakub@redhat.com>, 2007.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <config.h>
+#include <regex.h>
+#include <stdio.h>
+#include <string.h>
+
+struct tests
+{
+ const char *regex;
+ const char *string;
+ reg_syntax_t syntax;
+ int retval;
+} tests[] = {
+#define EGREP RE_SYNTAX_EGREP
+#define EGREP_NL (RE_SYNTAX_EGREP | RE_DOT_NEWLINE) & ~RE_HAT_LISTS_NOT_NEWLINE
+ { "a.b", "a\nb", EGREP, -1 },
+ { "a.b", "a\nb", EGREP_NL, 0 },
+ { "a[^x]b", "a\nb", EGREP, -1 },
+ { "a[^x]b", "a\nb", EGREP_NL, 0 },
+ /* While \S and \W are internally handled as [^[:space:]] and [^[:alnum:]_],
+ RE_HAT_LISTS_NOT_NEWLINE did not make any difference, so ensure
+ it doesn't change. */
+ { "a\\Sb", "a\nb", EGREP, -1 },
+ { "a\\Sb", "a\nb", EGREP_NL, -1 },
+ { "a\\Wb", "a\nb", EGREP, 0 },
+ { "a\\Wb", "a\nb", EGREP_NL, 0 }
+};
+
+int
+main (void)
+{
+ struct re_pattern_buffer r;
+ size_t i;
+ int ret = 0;
+
+ for (i = 0; i < sizeof (tests) / sizeof (tests[i]); ++i)
+ {
+ re_set_syntax (tests[i].syntax);
+ memset (&r, 0, sizeof (r));
+ if (re_compile_pattern (tests[i].regex, strlen (tests[i].regex), &r))
+ {
+ printf ("re_compile_pattern %lu failed\n", i);
+ ret = 1;
+ continue;
+ }
+ size_t len = strlen (tests[i].string);
+ int rv = re_search (&r, tests[i].string, len, 0, len, NULL);
+ if (rv != tests[i].retval)
+ {
+ printf ("re_search %lu unexpected value %d != %d\n",
+ i, rv, tests[i].retval);
+ ret = 1;
+ }
+ regfree (&r);
+ }
+ return ret;
+}
diff --git a/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex7.c b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex7.c
new file mode 100644
index 0000000..2051985
--- /dev/null
+++ b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex7.c
@@ -0,0 +1,96 @@
+/* Test for regs allocation in re_search and re_match.
+ Copyright (C) 2002 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Stepan Kasal <kasal@math.cas.cz>, 2002.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA. */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <regex.h>
+
+
+int
+main (void)
+{
+ struct re_pattern_buffer regex;
+ struct re_registers regs;
+ const char *s;
+ int match, n;
+ int result = 0;
+
+ memset (&regex, '\0', sizeof (regex));
+ regs.start = regs.end = NULL;
+ regs.num_regs = 0;
+ s = re_compile_pattern ("a", 1, &regex);
+ if (s != NULL)
+ {
+ puts ("failed to compile pattern \"a\"");
+ result = 1;
+ }
+ else
+ {
+ match = re_search (&regex, "baobab", 6, 0, 6, &regs);
+ n = 1;
+ if (match != 1)
+ {
+ printf ("re_search returned %d, expected 1\n", match);
+ result = 1;
+ }
+ else if (regs.num_regs <= n || regs.start[n] != -1 || regs.end[n] != -1)
+ {
+ puts ("re_search failed to fill the -1 sentinel");
+ result = 1;
+ }
+ }
+
+ free (regex.buffer);
+ memset (&regex, '\0', sizeof (regex));
+
+ s = re_compile_pattern ("\\(\\(\\(a\\)\\)\\)", 13, &regex);
+ if (s != NULL)
+ {
+ puts ("failed to compile pattern /\\(\\(\\(a\\)\\)\\)/");
+ result = 1;
+ }
+ else
+ {
+ match = re_match (&regex, "apl", 3, 0, &regs);
+ n = 4;
+ if (match != 1)
+ {
+ printf ("re_match returned %d, expected 1\n", match);
+ result = 1;
+ }
+ else if (regs.num_regs <= n || regs.start[n] != -1 || regs.end[n] != -1)
+ {
+ puts ("re_match failed to fill the -1 sentinel");
+ result = 1;
+ }
+ }
+
+ if (result == 0)
+ puts (" -> OK");
+
+ return result;
+}
diff --git a/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex8.c b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex8.c
new file mode 100644
index 0000000..e39ad59
--- /dev/null
+++ b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex8.c
@@ -0,0 +1,88 @@
+/* Test for the STOP parameter of re_match_2 and re_search_2.
+ Copyright (C) 2002 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Stepan Kasal <kasal@math.cas.cz>, 2002.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA. */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <regex.h>
+
+
+int
+main (void)
+{
+ struct re_pattern_buffer regex;
+ const char *s;
+ int match[4];
+
+ memset (&regex, '\0', sizeof (regex));
+
+ s = re_compile_pattern ("xy$", 3, &regex);
+ if (s != NULL)
+ {
+ puts ("failed to compile pattern \"xy$\"");
+ return 1;
+ }
+ else
+ match[0] = re_match_2(&regex,"xyz",3,NULL,0,0,NULL,2);
+
+ free (regex.buffer);
+ memset (&regex, '\0', sizeof (regex));
+
+ s = re_compile_pattern ("xy\\>", 4, &regex);
+ if (s != NULL)
+ {
+ puts ("failed to compile pattern \"xy\\>\"");
+ return 1;
+ }
+ else
+ match[1] = re_search_2(&regex,"xyz",3,NULL,0,0,2,NULL,2);
+
+ free (regex.buffer);
+ memset (&regex, '\0', sizeof (regex));
+
+ s = re_compile_pattern ("xy \\<", 5, &regex);
+ if (s != NULL)
+ {
+ puts ("failed to compile pattern \"xy \\<\"");
+ return 1;
+ }
+ else
+ {
+ match[2] = re_match_2(&regex,"xy ",4,NULL,0,0,NULL,3);
+ match[3] = re_match_2(&regex,"xy z",4,NULL,0,0,NULL,3);
+ }
+
+ if (match[0] != -1 || match[1] != -1 || match[2] != -1 || match[3] != 3)
+ {
+ printf ("re_{match,search}_2 returned %d,%d,%d,%d, expected -1,-1,-1,3\n",
+ match[0], match[1], match[2], match[3]);
+ return 1;
+ }
+
+ puts (" -> OK");
+
+ return 0;
+}
diff --git a/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex9.c b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex9.c
new file mode 100644
index 0000000..c0e9e18
--- /dev/null
+++ b/love2dToAPK/tools/tools/sed-win/contrib/sed/4.2.1/sed-4.2.1/sed-4.2.1-src/testsuite/bug-regex9.c
@@ -0,0 +1,75 @@
+/* Test for memory handling in regex.
+ Copyright (C) 2002 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper@redhat.com>, 2001.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301 USA. */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/types.h>
+#ifdef HAVE_MCHECK_H
+#include <mcheck.h>
+#endif
+#include <regex.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+
+static const char text[] = "#! /bin/sh";
+
+int
+main (void)
+{
+ regex_t re;
+ regmatch_t rm[2];
+ int n;
+
+#ifdef HAVE_MCHECK_H
+ mtrace ();
+#endif
+
+ n = regcomp (&re, "^#! */.*/(k|ba||pdk|z)sh", REG_EXTENDED);
+ if (n != 0)
+ {
+ char buf[500];
+ regerror (n, &re, buf, sizeof (buf));
+ printf ("regcomp failed: %s\n", buf);
+ exit (1);
+ }
+
+ for (n = 0; n < 20; ++n)
+ {
+ if (regexec (&re, text, 2, rm, 0))
+ {
+ puts ("regexec failed");
+ exit (2);
+ }
+ if (rm[0].rm_so != 0 || rm[0].rm_eo != 10
+ || rm[1].rm_so != 8 || rm[1].rm_eo != 8)
+ {
+ printf ("regexec match failure: %d %d %d %d\n",
+ rm[0].rm_so, rm[0].rm_eo, rm[1].rm_so, rm[1].rm_eo);
+ exit (3);
+ }
+ }
+
+ regfree (&re);
+
+ return 0;
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/CHANGELOG.md b/love2dToAPK/tools/tools/zbstudio-old-win/CHANGELOG.md
new file mode 100644
index 0000000..549b37f
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/CHANGELOG.md
@@ -0,0 +1,2364 @@
+# ZeroBrane Studio Changelog
+
+## v1.30 (Jan 21 2016)
+
+### Highlights
+ - Added `markers` panel to show and navigate bookmarks and breakpoints.
+ - Added saving/restoring bookmarks and breakpoints.
+ - Added breakpoint prev/next navigation (`Project | Breakpoint` menu).
+ - Added find/replace in selection to search operations.
+ - Added printing of editor tabs and Console/Output windows (available on Windows and OSX).
+ - Added recursive processing of configuration files (using `include` command).
+ - Added `outline.showcompact` setting to keep outline more compact for large files.
+ - Added opening multiple files from the `Open` dialog.
+ - Updated Corona API for v2015.2731 and added handling of type inheritance.
+ - Updated love2d API for v0.10.0.
+
+### Special thanks
+ - To [tmiv](https://github.com/tmiv) for allowing shortcuts to be added to tools menu items.
+ - To [Yonaba](https://github.com/Yonaba/) for French translation update.
+ - To [Leo Bartoloni](https://github.com/bartoleo) for Italian translation update.
+ - To [Inigo Sola](https://github.com/inigosola) for Spanish translation update.
+
+### Improvements
+ - Added `CloneMenu` package method (#166).
+ - Added Torch and Redis debugging links.
+ - Added `IsNew` method for documents (#166).
+ - Added `Print` method and updated core components to use it during launch.
+ - Added skipping `UPDATE_CONTENT` events on cursor blinks in `UPDATEUI` (#419).
+ - Added preserving markers after sorting/reindentation operations.
+ - Added editor `MarkerGetAll` method (#166).
+ - Added example on how to set breakpoint shortcuts used in v1.20 or earlier (#419).
+ - Added processing of `include` command without extension in config (#555).
+ - Added reporting of missing packages when using `package` command in config (#555).
+ - Added processing of `package` command without extension in config (#555).
+ - Added hint on using updated breakpoint shortcut (#419).
+ - Added breakpoint prev/next navigation (#419).
+ - Added `AttachMenu` package method (#166).
+ - Added `MarkerToggle` editor method (#166).
+ - Added `MarkerGotoNext` and `MarkerGotoPrev` editor methods (#166).
+ - Added local menu to the `Markers` panel to toggle markers (#419).
+ - Added saving/restoring bookmarks and breakpoints (#419).
+ - Added `BookmarkToggle` method to the editor (#166).
+ - Added `BreakpointToggle` method to the editor (#166).
+ - Added `markers` panel to show bookmarks and breakpoints (#419).
+ - Added `onEditorMarkerUpdate` event (#166).
+ - Added unfolding fragments that include activated line during debugging (closes #575).
+ - Added skipping comment when none is provided in the Stack (instead of showing `nil`).
+ - Added skipping comments in the lexer to avoid splitting statements (fixes #568).
+ - Added `GetExePath` method for the interpreter (#166).
+ - Added package `GetFilePath` method (#166).
+ - Added `showhiddenfiles` option to show hidden files in the filetree (closes #561).
+ - Added package `RemovePanel` method (#166).
+ - Added loading of custom package from the config file (closes #555).
+ - Added `Alt-Enter` to "replace all" when replace field is selected in the search panel.
+ - Added setting project directory to the selected directory to the project tree menu.
+ - Added ignoring `Ctrl-CapsLock` in the editor that was shrinking the font.
+ - Added recursive processing of configuration files with relative names (#555).
+ - Added moving cursor to the end of the pasted fragment (#556).
+ - Added workaround for copying UTF-8 invalid data to/from clipboard (#260, #556).
+ - Added `CloseAll` and `CloseAllExcept` document methods (#166).
+ - Added warning in the interpreter when a short name not generated on Windows (closes #559).
+ - Added check for recover record to be fully present.
+ - Added using `*Raw` methods when available for handling of invalid UTF-8 chars (#260, #556).
+ - Added `FileRemove` method (#166).
+ - Added package `onAppDone` method (#166).
+ - Added sorting the list of known extensions.
+ - Added `outline.showcompact` setting to keep outline more compact for large files (closes #549).
+ - Added updating selection boundaries after replace-in-selection (#547).
+ - Added resizing toolbar background after resizing the application window.
+ - Added timing to the tests.
+ - Added context menu item to clear text in the Console window.
+ - Added context menu to select a (clicked on) command in the Console window.
+ - Added `onMenuConsole` event (#166).
+ - Added reporting printing progress (#540).
+ - Added package `IsValidProperty` method (#166).
+ - Added separator to the print-related menu items on OSX (#540).
+ - Added header/footer printing (#540).
+ - Added printing of the current editor tab (closes #540).
+ - Add package `GetIndicators` method (#166).
+ - Added `editor.wrapmode` to configure wrapping mode in the editor.
+ - Added reporting of another instance running under a different user (closes #542).
+ - Added opening multiple files from the `Open` dialog (closes #541).
+ - Allowed reading input in the Output window without printing something first (closes #538).
+ - Allow shortcuts to be added to tools menu items
+ - Extended PATH on OSX with `/usr/local/bin` to provide access to tools in that folder (#356).
+ - Improved compatibility when running the IDE using Lua 5.2.
+ - Improved handling of names with Unicode chars during debugging on Windows (#559).
+ - Limited requesting attention on debugging starts to happen when debugging is suspended.
+ - Moved wxlua version number to a better location in the About screen.
+ - Optimized path generation in directory traversal (#260).
+ - Removed a workaround for wxlua build issue as it's no longer needed.
+ - Replaced `ConsoleClear` with `Erase` methods for the Console object.
+ - Removed search panel from the list of floated panels as it shouldn't be there.
+ - Removed `allowinteractivescript` setting as it doesn't need to be configurable (#538).
+ - Replaced `EditorIsModified` with document method calls.
+ - Spanish translation updated
+ - Switched to using client size instead of system metric to get screen width (#260).
+ - Switched to using `KEY` event in search panel to make it work with wxwidgets 3.1+ (#260).
+ - Switched to per-editor tracking in `UPDATEUI` event.
+ - Updated `interpreter` menu to use a clone to avoid Linux assertion.
+ - Updated Italian Translation (closes #586).
+ - Updated french translation as of df381b5 (see #70)
+ - Updated Russian translation (#70).
+ - Updated translation files with new messages (#70).
+ - Updated LuaForWindows interpreter to accept command line parameters (#582).
+ - Updated LuaForWindows interpreter to properly pass `arg` to the script (closes #582).
+ - Updated `GetDocument` to not fail when no editor is passed.
+ - Updated live coding to group number updates together for `Undo`/`Redo` purposes.
+ - Updated `Toggle Breakpoint` and `Break` shortcuts for consistency (#419).
+ - Updated love2d API for v0.10.0 (#247).
+ - Updated script to process new love2d API format (with `variants`).
+ - Updated showing filename of the missing interpreter in the project list (#570).
+ - Updated build scripts to use own wxwidgets repository to better sync build versions (#260).
+ - Updated build scripts to remove an error from the check for missing methods in wxlua.
+ - Updated README to remove outdated .ini reference from Estrela section.
+ - Updated instructions in the `estrela` configuration file to reference `include` command.
+ - Updated luasec build script to use the latest openSSL version (1.0.2d).
+ - Updated UTF-8 validation to use wxwidgets libraries for better performance (#556).
+ - Updated clipboard copy to make non-UTF-8 data to work on OSX (#260, #556).
+ - Updated Console history to work with UTF-8 invalid strings (#260, #556).
+ - Updated `Ctrl/Shift-Ins` and `Shift-Del` to work in all editors (#260, #556).
+ - Updated `Output` and `Console` to display invalid characters as is (#260, #556).
+ - Updated config sample to remove no longer needed `G` references.
+ - Updated config processing to simplify access to global functions.
+ - Updated config processing to allow use of `package` field.
+ - Updated windows launcher code to use manifest for hidpi awareness.
+ - Updated `AddConfig` method to accept single filename in addition to a list (#166).
+ - Updated event handling to better handle events that are executed once (#260).
+ - Updated `sample` package events for more accurate output.
+ - Updated default size/position for the first launch without saved settings.
+ - Updated tests to use a separate .ini file to minimize conflicts.
+ - Updated Corona API for v2015.2731.
+ - Updated Corona API processing script to follow Lua guidelines.
+ - Updated Corona API processing script to handle type inheritance.
+ - Updated `Save As`/`Open` command to use editor specific extensions instead of all.
+ - Updated capturing editor information during search to work with selections (#547, #416).
+ - Updated `Replace` and `Replace All` to take selection into account (#547, #416).
+ - Updated toolbar icons to fix black color in some images.
+ - Updated `SetDllDirectory` handling to avoid breaking dlopen with wxwidgets 3.1+ (#260).
+ - Updated Corona interpreter to avoid caching specified path.
+ - Updated tests to handle platform-specific tests.
+ - Updated directory traversing tests to work with smaller directories.
+ - Updated default file mask to match files without extension (#260).
+ - Updated tests to use a package instead of the obsolete app method.
+ - Updated wxwidget path in the build script to use git repository after wxwidgets migration.
+ - Updated menu shortcuts to avoid conflicts in the `File` menu (#540).
+ - Updated README with features in 1.20.
+
+### Fixes
+ - Fixed showing cursor in search panel fields after file search.
+ - Fixed reapplying markers after reloading modified file (#419).
+ - Fixed setting interpreter after launching with non-existing project.
+ - Fixed showing package errors during project switches (#555).
+ - Fixed `include` command not checking needed `packages` folders to load from (#555).
+ - Fixed resetting the default interpreter after selecting a non-existent one.
+ - Fixed restoring project-specific interpreter when switching projects (#570).
+ - Fixed restoring project-specific interpreter after relaunch (fixes #570).
+ - Fixed expanding sub-trees in project directory when set to the disk root on Windows.
+ - Fixed search navigation after selecting one variable instance (fixes #565).
+ - Fixed editing fragments in folded text (follow-up to d2ddc96a; #564).
+ - Fixed editing multiple selections when selection is in folded fragments (fixes #564).
+ - Fixed copy/paste on Windows when UTF-8 invalid strings end in new line (#260, #556).
+ - Fixed debugging of Busted scripts (closes #552).
+ - Fixed skipping editor tabs when clicked in some cases on OSX (closes #546).
+ - Fixed toolbar size not being adjusted on the very first launch.
+
+### Incompatibilities
+ - Changed `Toggle Breakpoint` shortcut from `F9` to `Ctrl/Cmd-F9`.
+ - Removed `Project | Break` shortcut to avoid conflict with breakpoint navigation.
+ - Removed `allowinteractivescript` setting as no longer needs to be configurable (#538).
+
+## v1.20 (Oct 08 2015)
+
+### Highlights
+ - Added symbol indexing of project files for project-wide search.
+ - Added support for `file@symbol` fuzzy search (#385).
+ - Added processing of `ini` setting relative to the IDE location (#483).
+ - Improved memory handling for large files.
+ - Improved application performance and memory usage.
+ - Improved auto-complete order of results and suggestions for case-sensitive matches.
+ - Updated Windows launcher to add dpi awareness for high dpi monitors.
+ - Upgraded Lua 5.3 interpreter to 5.3.1.
+ - Fixed a memory leak after a search panel is opened.
+ - Fixed an occasional crash from the filetree on Linux (#425, #464).
+ - Fixed recursive file traversal to skip directories when mask is specified.
+
+### Special thanks
+ - To [riidom](https://github.com/riidom) for German translation update.
+ - To [Yonaba](https://github.com/Yonaba/) for French translation update.
+ - To [Leo Bartoloni](https://github.com/bartoleo) for Italian translation update.
+ - To [Christoph Kubisch](https://github.com/pixeljetstream) for glslc updates.
+ - To Brigham Toskin for auto-complete improvements.
+ - To Joergen von Bargen for optimized UTF8 validation.
+ - To Nick Smith for Marmalade interpreter updates.
+
+### Improvements
+ - Added handling of translation messages that require pluralization (#70).
+ - Added check for non-zero file size before reporting load progress (#530).
+ - Added switching interpreters by clicking on the interpreter label in the status bar.
+ - Added handling of editor commands (Copy/Paste/SelectAll/Undo/Redo) in search panel controls.
+ - Added position to the end-of-file lexer token (closes #529).
+ - Added reporting when a file can't be removed from a project tree.
+ - Added explicit initialization for `editor.autoactivate` default setting.
+ - Added allowing `editor.saveallonrun` with `infervalue` static analyzer (closes #524).
+ - Added support for `include` command in config files.
+ - Added document `Close` method (#166).
+ - Added descriptions for new Lua 5.3 `math.*` and `coroutine.*` functions.
+ - Added functions new to Lua 5.3 to the list of keywords.
+ - Added reporting of deserialization failures for saved package data.
+ - Added collapsing white spaces from names shown in the Outline.
+ - Added workaround for a memory leak in wxlua after a search panel is opened.
+ - Added jumping to the current function in the outline (#515).
+ - Added highlighting current functions for better visibility (#515).
+ - Added skipping unneded fields from the symbol index to reduce memory usage (#515).
+ - Added showing position of the current function in the Outline (closes #515).
+ - Added explicit editor destroy during find and replace to conserve memory.
+ - Added explicit editor destroy during symbol indexing to conserve memory.
+ - Added turning jitting on when running under LuaJIT.
+ - Added `Run to Cursor` to the popup menu in the editor (#413).
+ - Added showing memory usage stats in the status bar configured by `showmemoryusage`.
+ - Added skipping opening a file from symbol search when nothing is matched.
+ - Added skipping directories during directory traversal (#499).
+ - Added `SetStatusFor` package method to set temporary status (#166).
+ - Added forcing immediate refresh of symbol index when requested from the menu (#499).
+ - Added `onMenuOutput` event (#166).
+ - Added `onMenuWatch` event (#166).
+ - Added disabling symbol indexing for directories/projects (#499).
+ - Added refreshing of symbol index to the project menu (#499).
+ - Added reporting of the number of files queued for indexing (#499).
+ - Added reporting when indexing is completed (#499).
+ - Added `GetOutline` package method (#166, #499).
+ - Added exclusion to not report `arg` as global in static analysis (closes #503).
+ - Added `commandbar.width` to set the width of command bar.
+ - Added skipping symbol index queue when symbol inactivity is not set (#499).
+ - Added setting different types of indentation guides.
+ - Added optimization with prefiltering for short patterns (#31, #499).
+ - Added status message during index update (#499).
+ - Added purging of outdated cache for symbol indexing (#499).
+ - Added symbol processing of tabs that are not saved yet (#499).
+ - Added indexing of project files (#499).
+ - Added `commandbar.maxitems` configuration setting (#499).
+ - Added caching of symbols for open files (#499).
+ - Added support for `file.lua@symbol` fuzzy search (#385).
+ - Added symbol search in all open files (#385).
+ - Added check to avoid loops in type assignment during auto-complete (#498).
+ - Added primitive handling of `require` in type assignments for known APIs (fixes #498).
+ - Added support for aborting file reading callback (#491).
+ - Added progress display when loading large files (#491).
+ - Added status methods: `GetStatus`, `PushStatus`, and `PopStatus` (#166).
+ - Added `onMenuOutline` callback (#166, #337).
+ - Added ability to toggle outline sorting from the local menu (#337, #494).
+ - Added activating Output panel after compilation errors.
+ - Added package `SetStatus` method (#166).
+ - Added `Ctrl/Cmd-Enter`/`Ctrl/Cmd-Shift-Enter` to add line after/before the current one (#334).
+ - Added ignoring current selection in auto-complete with `Shift-Enter` (closes #494).
+ - Added hiding auto-complete after typing one of the offered options (#494).
+ - Added activating Output notebook to show search results if it's hidden (#416).
+ - Added reporting of errors when unable to open file for static analysis.
+ - Added collapsing whitespaces in function parameters in the outline (#337).
+ - Added emphasis for the preference type in the config file template.
+ - Added `FileSize` method as the default one returns non-zero result for non-existing files.
+ - Added reporting of `FileWrite` failing to write the entire content.
+ - Added package methods `AddIndicator`, `GetIndicator`, and `RemoveIndicator` (#166).
+ - Added missing `Detach Process` id to keymap (pkulchenko/MobDebug#19).
+ - Added a check for `ini` setting pointing to a path with a writeable directory (#483).
+ - Added a check for `ini` setting pointing to a directory (#483).
+ - Added processing of `ini` setting relative to the IDE location (closes #483).
+ - Added Watch view refresh after switching focus when needed.
+ - Added Stack view refresh after switching focus when needed.
+ - Added forced `Refresh`/`Update` to improve redrawing of commandbar on Windows 8.
+ - Added a check for a window to be shown to avoid callback recursion on OSX (fixes #473).
+ - Added package `IsWindowShown` method (#166).
+ - Added package `onEditorPreClose` event (#166, closes #461).
+ - Added deleting the rest of the word on auto-complete (`acandtip.droprest`).
+ - Added closing editor tab when renaming to an open file from the project tree.
+ - Added refresh of the target file after renaming from the project tree.
+ - Added a check for object with a focus (occasionally triggered on Linux).
+ - Added workaround to fix crash on Linux from the project tree (#425, #464).
+ - Added `DoWhenIdle` package method (#166).
+ - Disabled unhiding one of wxwidgets windows that is only used for message passing (Windows).
+ - Disabled initial highlight when showing current function disabled in the outline (#515).
+ - Disabled dragging out search results tab to avoid unexpected results (#416).
+ - Enabled compilation during running/debugging (closes #479).
+ - Enabled static analysis during running/debugging (#479).
+ - Integrate ZeroBrane with Marmalade's Hub GUI
+ - Improved auto-complete suggestions for case-sensitive matches.
+ - Improved compactness of saved package settings (#166, #499).
+ - Improved performance of saving symbol index data (#499).
+ - Improved memory usage when closing large files (#491).
+ - Improved handling of large files (#491).
+ - Improved the order of results in auto-complete (closes #469).
+ - glslc tool: add menu option for pre-process mode
+ - Optimized saving package settings (#166, #499).
+ - Optimized UTF8 validation (thanks to Joergen von Bargen).
+ - Optimized handling of multi-line changes in the editor (closes #477).
+ - Removed forced garbage collection as it led to crashes on Linux (#425, closes #464).
+ - Revised: auto-complete results (amends #469, w/@pkulchenko patch)
+ - Switched to the bottom location for the search results by default (#416).
+ - Updated italian translations (thanks to Leo Bartoloni)
+ - Updated Russian translation (#70).
+ - Update de.lua (thanks to riidom)
+ - Updated french translation as of commit (thanks to Yonaba)
+ - Updated translation files for new messages (#70).
+ - Updated translation logic to accept empty tables for pluralization values (#70).
+ - Updated build scripts to use the most recent releases of LuaJIT and Lua 5.2.
+ - Updated OSX launcher to keep `DYLD_LIBRARY_PATH` if already set.
+ - Updated build scripts to use the most recent releases of LuaJIT and Lua 5.2.
+ - Update marmalade API definition to 7.9
+ - Updated static analyzer (luainspect) to take globals in 'required' files into account (#520).
+ - Updated static analyzer to refresh cache of 'required' modules (#520).
+ - Updated C/cpp spec to skip `if(...)` from the list of functions.
+ - Updated C/cpp spec to properly handle functions at the beginning of a file.
+ - Updated package data serialization to use simpler dumper for faster processing.
+ - Updated saving symbol index to be called less frequently (#499).
+ - Updated list of fields to skip from saved symbol index (#499).
+ - Updated Run/Debug to not force saving new tabs when `Start` file is set.
+ - Updated interpreter handling to allow setting of default value in the config (closes #518).
+ - Updated highlighting of the current function in the Outline to select one item (#515).
+ - Updated auto-complete to close when one of the options matches the current input.
+ - Updated applying limit to the commandbar results to allow them to be resorted.
+ - Updated status messages for better visibility on OSX during index refresh (#499).
+ - Updated tracking of editor updates to skip unneeded notifications on OSX (#499).
+ - Updated symbol refresh to do processing as soon as the path is known (#499).
+ - Updated symbol index to skip unused elements in serialization (#499).
+ - Updated prefiltering to limit prefix to avoid penalty for long `s.*s.*s...` (#31).
+ - Updated package `SetSettings` method to allow passing of additional parameters (#166).
+ - Updated status of files indexing for symbol search (#499).
+ - Updated `DoWhenIdle` handling to gracefully handle a long queue.
+ - Updated `Go To Symbol` to refresh files loaded in the preview (#499, #385).
+ - Updated symbol search to only refresh outline when it's not populated (#385).
+ - Updated search logic to avoid showing search results in recent files (#416).
+ - Updated line number handling to adjust for large files (#491).
+ - Updated `busted` interpreter to check for proper extension on Windows (closes #495).
+ - Updated handling of binary and utf8 validness checks for large files (#491).
+ - Updated build scripts for Lua 5.3 to use 5.3.1.
+ - Updated toolbar to show large icons by default on large screens.
+ - Updated outline to only retrieve entry text when there are tokens to process (#337).
+ - Updated getting text length without requesting editor content.
+ - Updated showing function indicator handling to allow for easier enabling.
+ - Updated indicator processing to use new API.
+ - Updated ID references in toolbar to use the new access method.
+ - Updated ID references in keymap to use the new access method.
+ - Updated `Detach Process` to allow access to it while the process is running.
+ - Updated metalua/static analyzer to accept long integer and imaginary numbers (closes #482).
+ - Updated internal parser to accept long integer, imaginary, and floating point hex numbers (#482).
+ - Updated internal parser to accept numbers that start with a period (#482).
+ - Updated compilation and static analysis to keep output when running/debugging (#479).
+ - Updated indentation after strings with brackets and escaped quotes (#324).
+ - Updated `AnalyzeString` to add filename parameter (closes #463).
+ - Updated Windows launcher to add dpi awareness for high dpi monitors.
+ - Upgraded Lua 5.3 interpreter to 5.3.1 on Linux (x86 and x64).
+ - Upgraded Lua 5.3 interpreter to 5.3.1 on OSX.
+ - Upgraded Lua 5.3 interpreter to 5.3.1 on Windows (closes #453, closes #460).
+ - Upgraded Mobdebug (0.628) to include `keyignore` serializer option.
+ - Upgraded Mobdebug (0.627) to improve debugging of code with overloaded `string` methods.
+ - Upgraded Mobdebug (0.624) to make `DONE` async and to add `__tostring` protection (closes #446).
+
+### Fixes
+ - Fixed text search and fuzzy symbol search in symlinks (#458, #530).
+ - Fixed opening only one tab for external debugging of dynamic code on Linux (closes #526).
+ - Fix live picking up debug vs release binaries (Marmalade)
+ - Fixed highlighting for those specs that don't have information on where functions end (#515).
+ - Fixed highlighting the current function when anonymous functions are hidden (#515).
+ - Fixed styling of comments that include markup inside markup (fixes #514).
+ - Fixed updating symbols in new files that haven't been indexed yet (#499).
+ - Fixed opening empty files (fixes #510).
+ - Fixed autocomplete for words that may include underscores in suggestions.
+ - Fixed crash on OSX during symbol indexing when filetree menu is open (#499).
+ - Fixed crash on Linux during symbol indexing when filetree menu is open (fixes #507).
+ - Fixed duplicates between variables and dynamic words in auto-complete.
+ - Fixed uncommenting of the last line in the selection to keep un/comment reversible (fixes #509).
+ - Fixed assignment parsing when the type value is re-assigned (#498).
+ - Fixed mouse selection in auto-complete on OSX (fixes #496).
+ - Fixed fuzzy file search to not double open already opened files (#31).
+ - Fixed indentation of lines that end with partial long strings with opening brackets (#324).
+ - Fixed indentation of lines with long strings that include opening brackets (#324).
+ - Fixed indicators on table fields after variables that look like multiple assignments (#492).
+ - Fixed indicators on table fields after variables (fixes #492).
+ - Fixed variable usage based on static analysis.
+ - Fixed initial select-and-find search.
+ - Fixed returning focus to the editor after find-in-files followed by page search (#416).
+ - Fixed performance of initial fuzzy search for line numbers (closes #476).
+ - Fixed Output tab name when debugging aborted after run-time error.
+ - Fixed recursive file traversal to skip directories when mask is specified.
+ - Fixed crash in `collectgarbage` from the filetree on Linux (#425, #464).
+
+## v1.10 (May 13 2015)
+
+### Highlights
+ - Redesigned search functionality; added incremental search and replace-in-files preview.
+ - Updated love2d API for v0.9.2.
+ - Upgraded Mobdebug (0.62) to add vararg processing.
+ - Added `excludelist`/`binarylist` to exclude files and folders.
+ - Added skipping binary files during find-in-files and fuzzy search.
+
+### Special thanks
+ - To [David Feng](https://github.com/DavidFeng) for fixing a broken symbolic link.
+ - To [Robert Machmer](https://github.com/rm-code) for updated German translation and fixes for love2d engine name/description.
+ - To [Derek Bailey](https://github.com/dbaileychess) for adding context menu item to update the contents of the tree.
+
+### Improvements
+ - Added closing search results with `Close Page` for consistency (#416).
+ - Added option to show search results in multipe tabs (#416).
+ - Added package `IsValidCtrl` method (#166).
+ - Added skipping binary files in commandbar (#31, #455).
+ - Added handling of `**` in exclusion masks (#455).
+ - Added `excludelist`/`binarylist` to exclude files and folders (closes #455).
+ - Added `search.autohide` option to hide search panel after search (#416).
+ - Added `debugger.requestattention` to configure focus switch (closes #449).
+ - Added closing search panel on `Escape` in the editor (closes #450, #416).
+ - Added `search.zoom` setting to zoom search results (#416).
+ - Added warning when interpreter can't be loaded and the default one is used.
+ - Added support for `wxImage` used in `imagemap` (#436).
+ - Added icon tint processing (`imagetint` option).
+ - Added `search.contextlinesbefore`/`search.contextlinesafter` settings (#416).
+ - Added `search.autocomplete` setting do configure search autocomplete (#416).
+ - Added auto-complete for find and replace fields (#416).
+ - Added saving search settings between restarts (#416).
+ - Added deleting of protected text in Cut/Paste operations (closes #412).
+ - Added refresh context menu item to update the contents of the tree (thanks to Derek Bailey).
+ - Added ignoring assignment in comments for auto-complete.
+ - Added preview screen to check changes in replace-in-files (#416).
+ - Added search toolbar button to set/unset context in search results (#416).
+ - Allowed for larger default size of docked panels (#424).
+ - Allowed closing `Search Results` tab while search is in progress (#416).
+ - Disabled refresh when `outlineinactivity=nil` and `showonefile=true` (#337).
+ - Improved incremental processing to avoid marking table fields as variables.
+ - Improved logic to skip binary files during search (#416).
+ - Moved cancelling auto-complete popup to idle event (fixed #447).
+ - Moved winapi dll to `clibs` folder to avoid conflict with other winapi versions.
+ - Optimized `Go To File` file traversal in commandbar (#31).
+ - Redesigned the search panel (closes #416; closes #398).
+ - Removed option to request attention from breakpoint activation (#449, closes #454).
+ - Removed warnings from loose parser to stop polluting stderr on Linux (#425).
+ - Removed hardcoded references to menu positions to simplify adding new items.
+ - Removed saving .bak files as it's replaced by replace-in-files preview (#416).
+ - Reorganized folding to allow more editor-like components to be foldable.
+ - Switched to using `wxFileSize` instead of `Length` (fixes #458).
+ - Updated event documentation.
+ - Upgraded Mobdebug (0.62) to add vararg processing.
+ - Updated build files to use release version of Lua 5.3 (#453).
+ - Updated Corona interpreter to allow debugging on Linux using Wine.
+ - Updated folder traversing logic to limit number of open folders (fixes #441).
+ - Update Readme.md to use correct name for the LOVE framework (thanks to Robert Machmer).
+ - Updated Linux build scripts to add `debug` option.
+ - Updated love2d interpreter to use proper engine name/description (closes #433) (thanks to Robert Machmer).
+ - Updated german translation (#432, #70).
+ - Updated love2d APU for v0.9.2 (#247).
+ - Update german translation (thanks to Robert Machmer).
+ - Updated `Select and Find` to capture selection for subsequent use (#416).
+ - Updated `Find Next/Prev` to continue search using the current find text (#416).
+ - Updated unfolding of folded lines before delete or overwrite.
+ - Updated folding to collapse only when clicked on the header.
+ - Updated config samples to use `ID.code` instead of obsolete `G.ID_code`.
+
+### Fixes
+ - Fixed crash on Windows by disabling events in Outline refresh (fixes #442).
+ - Fixed file traversing not to match `foo.bar!` for `*.bar' mask (#416).
+ - Fixed showing of not translated messages that require pluralization.
+ - fix broken symbolic link (thanks to David Feng).
+ - Fixed an empty popup (that could lead to a crash) when dynamic words is on.
+ - Fixed commandbar positioning on Linux affected by 5b665477 (#31).
+ - Fixed loose parser to handle multiple assignments (fixes #430).
+ - Fixed editor activation after dragging of inactive tab (fixes #427).
+ - Fixed indentation after comment with markdown markup (closes #428, #324).
+ - Fixed auto-complete issue causing looping warning (#143).
+ - Fix commandbar position with split editor tabs (#31).
+ - Fixed re-indenting of selection with comments at the top of the file (#324).
+ - Fixed restoring pane size after hide/show operations (fixes #424).
+
+### Incompatibilities
+ - Removed saving .bak files as it's replaced by replace-in-files preview.
+
+## v1.00 (Mar 13 2015)
+
+### Highlights
+ - Added directory mapping to the project tree (closes #223).
+ - Added `Run to Cursor` (closes #413).
+ - Added support to set/unset start file for a project (closes #411).
+ - Added opening/creating file from the command bar (#31).
+ - Added `staticanalyzer.infervalue` to enable deeper/slower analysis (#414).
+ - Updated Corona API for v2015.2576.
+
+### Improvements
+ - Added `staticanalyzer.infervalue` to enable deeper/slower analysis (#414).
+ - Added project path in the error reporting for love2d/corona interpreters.
+ - Added an example with enabling Emacs bindings in the editor.
+ - Added Russian translations for new messages (#70).
+ - Added a warning on class resolution taking too much time in auto-complete.
+ - Added check for empty/comment lines when breakpoints are set.
+ - Added directory mapping to the project tree (closes #223).
+ - Added `Run to Cursor` (closes #413).
+ - Added document method `GetTabText` (#166).
+ - Added showing love2d console when requested.
+ - Added support to set/unset start file for a project (closes #411).
+ - Added requesting attention for debugger even when the file is not activated.
+ - Added reporting of location in more cases when debugging is suspended.
+ - Added starting debugging even when the file is not opened in the IDE.
+ - Added switching project directory from the command bar (#31).
+ - Added trimming of trailing spaces in the directory name when switching projects.
+ - Added closing preview if the file failed to load in commandbar (#31).
+ - Added handling of `Ctrl/Cmd-Enter` in commandbar to force open file (#31).
+ - Added skipping loading files with empty and directory names.
+ - Added trimming of trailing spaces in the file name when loading a file.
+ - Added file selection in the project tree after saving a new file.
+ - Added opening/creating file from the command bar (#31).
+ - Disabled menu item for renaming/editing for mapped directories (#223).
+ - Disabled field checks for local parameters in staic analyzer (closes #421).
+ - Improved static analyzer to handle more cases with `infervalue` set (#414).
+ - Refactored use of image constants in the project tree.
+ - Refactored document modification tracking to remove `SetDocumentModified`.
+ - Refactored path normalization for project directory.
+ - Updated Corona API for v2015.2576.
+ - Updated static analyzer output formatting.
+ - Updated analyzer to also check value of `pairs` parameter (#414).
+ - Updated `debugging suspended` message to not trigger with `runonstart`.
+ - Updated messages in interpreters to fix line endings.
+ - Updated lettercase in menu items for consistency.
+ - Updated UpdateUI handling to fix multi-view refresh, as in DocumentMap (#352).
+ - Updated Outline to use editor tab text (instead of a file name).
+ - Updated message on failure to start debugging to add the file name.
+ - Updated `debugging suspended` message to put location in quotes.
+ - Updated line check in command bar to not trigger on Windows file names.
+ - updated glewgl api (glew 1.12.0)
+
+### Fixes
+ - Fixed analyzer to check value of `ipairs` parameter (fixes #414).
+ - Fixed OS detection on Linux that sets `DYLD_LIBRARY_PATH` (fixes #417).
+ - Fixed saving auto-recovery record with no editor tabs opened (fixes #418).
+ - Fixed looping in auto-complete when processing recursive assignments.
+ - Fixed filename used in the recovery message.
+ - Fixed Output/Console window to stay shown after failure to start debugging.
+ - Fixed an issue with search initiated from Output/Console panels (fixes #406).
+ - Fixed auto-complete for non-default `acandtip.strategy` values (fixed #409).
+ - Fixed loading file with absolute name and line number (fixes #408).
+
+## v0.95 (Jan 30 2015)
+
+### Highlights
+ - Added fuzzy search with `Go To File`, `Go To Symbol`, `Go To Line`, and `Insert Library Function`.
+ - Added auto-complete support for LDoc '@tparam' and '@param[type=...]'.
+ - Added armhf architecture support (thanks to Ard van Breemen).
+ - Updated static analyzer to support `goto`/labels and bitops for Lua 5.2/5.3.
+ - Updated internal parser to support Lua 5.2/5.3 syntax.
+ - Updated Mobdebug to improve Lua 5.3 compatibility (thanks to Andrew Starks).
+ - Update API descriptions with functions new in Lua 5.3.
+
+### Special thanks
+ - To [Ard van Breemen](https://github.com/ardje) for armhf architecture support.
+ - To [Evandro Costa](https://github.com/evandro-costa) for Brazilian Portuguese (pt-br) translation.
+ - To [Andrew Starks](https://github.com/andrewstarks) for Lua 5.3 compatibility improvements.
+ - To [Alexis Jarreau](https://github.com/Fringale) for French translation update.
+ - To [Leo Bartoloni](https://github.com/bartoleo) for Italian translation update.
+ - To [riidom](https://github.com/riidom) for German translation update.
+
+### Improvements
+ - Added showing/hiding Output/Console panel during debugging.
+ - Added `bordersize` to configure sash size.
+ - Added package `LoadFile` method (#166).
+ - Added Russian translation for new messages (#70).
+ - Added syntax highlighting for functions new in Lua 5.3.
+ - Added `commandbar.prefilter` to commandbar to improve performance (#31).
+ - Added custom formatting for APIs.
+ - Added `Insert Library Function` to `Navigate` menu.
+ - Added hiding tooltip/auto-complete popup after undo/redo/delete operations.
+ - Added `api` handling to the config to support custom APIs.
+ - Added Lapis and Moonscript debugging links to README.
+ - Added `Contributing` section to README.
+ - Added LICENSE link to README.
+ - Added Lua 5.3 links to README; updated links to remove '.html'.
+ - Added `PgUp` and `PgDn` navigation for commandbar (#31).
+ - Added auto-complete support for LDoc '@tparam' and '@param[type=...]'.
+ - Added Brazilian Portuguese (pt-br) translation.
+ - Added showing the symbol under cursor in `Go To Symbol` (#385).
+ - Added `editor:ValueFromPosition` method (#166).
+ - Added `Go To Symbol` support to the commandbar (#31, closes #385).
+ - Allowed renaming of files with different case in the project tree.
+ - Added update of file name in the Outline when editor tab is updated (#337).
+ - Added check for `styles` being reset in the config file (closes #383).
+ - Added loading file from project directory with "proj file" on command line.
+ - Added skipping of binary files in commandbar preview (#31).
+ - Added CONTRIBUTING file.
+ - Added clearing Output window before showing Find-in-Files results.
+ - Added default values for Outline config settings (#337).
+ - Added package `GetProjectNotebook` method (#166).
+ - Added saving Outline tab configuration in the Project notebook (#337).
+ - Added `outline.sort` option to sort items in the outline (#337).
+ - Added `outline.showflat` option to show flat outline (#337).
+ - Added package `GetOutlineTree` method (#166).
+ - Add support for armhf architecture
+ - Added document `Save` method (#166).
+ - Added `init.lua` to the search path (fixes `require 'dist'`).
+ - Added forced garbage collection when switching from the app.
+ - Added penalty for missing characters in fuzzy search (#31).
+ - Added line navigation to `Navigate` menu (#31).
+ - Added handling of line numbers in command bar (#31).
+ - Added caching to improve commandbar performance on large folders (#31).
+ - Added setting explicit focus on preview tab in commandbar (#31).
+ - Added preview on first selection in commandbar (#31).
+ - Added file preview to commandbar (#31).
+ - Added fuzzy search for files in commandbar (closes #31).
+ - Added displaying the list of current tabs for commandbar (#31).
+ - Added commandbar prototype for file navigation (#31).
+ - Added reset of tokens when editor content is reloaded (#337).
+ - Enabled html and C/cpp specs by default (#395).
+ - Improved handling of complex types in LDoc expressions in auto-complete.
+ - Improved failed search 'shake' visualization by forcing window redraw.
+ - Improved command line file check for relative files on Windows.
+ - Split console output into shorter lines to improve memory usage and handling.
+ - Renamed `debugger.stackmax*` settings to `debugger.maxdata*`.
+ - Removed double check for invalid UTF-8 output in console.
+ - Refactored ID handling to allow using `ID.COMMENT` in config files.
+ - Removed `wxwidgets` from the list of default APIs for Lua interpreters.
+ - Refactored handling of special symbols in commandbar (#31).
+ - Removed border from tree controls (#305).
+ - Updated language files with new messages (#70).
+ - Update API descriptions with functions new in Lua 5.3.
+ - Updated loose parser to support Lua 5.2+ labels.
+ - Updated loose parser to support `goto` and Lua 5.3 bitops.
+ - Updated Metalua to support Lua 5.3 bitops.
+ - Updated Metalua to support `goto`/labels in static analysis for Lua 5.2/5.3.
+ - Upgraded Mobdebug (v0.611) to fix tooltips during Corona debugging (closes #387).
+ - Updated `CommandBarShow` to accept text fragment to select (#31).
+ - Updated `GetKnownExtensions` to accept an optional extension to match against.
+ - Updated `FileRead` to accept optional length.
+ - Updated layout settings to use constants and new package API.
+ - Updated parser to avoid splitting `foo.bar` in incremental processing.
+ - Upgraded MobDebug (0.61) to add `basedir` support.
+ - Updated status refresh to only happen for the active editor.
+ - Updated toolbar UI checks to happen when running/debugging (#352).
+ - Updated Corona integration to hide console on OSX (2014.2393+).
+ - Upgraded Mobdebug to 0.613 to improve Lua 5.3 compatibility (#401); thanks to @andrewstarks.
+ - Updated usage instructions in README.
+ - Update de.lua
+
+### Incompatibilities
+ - Renamed `debugger.stackmax*` settings to `debugger.maxdata*`.
+ - Removed `wxwidgets` from the list of default APIs for Lua interpreters; use `api` config setting to include it.
+
+### Fixes
+ - Fixed search navigation to shift horizontally when `usewrap` is off.
+ - Fixed indentation for lines with mixed string separators (#324, #388).
+ - Fixed indentation for lines with escaped slashes (#324, closes #388).
+ - Fixed find-and-replace to replace in already selected fragment if matched.
+ - Fixed refresh of files in command bar preview when selected (#31).
+ - Fixed recovery of empty (`untitled`) tabs.
+ - Fixed an auto-complete issue after `repeat until <var>`.
+ - Fixed setting focus to the editor in commandbar with one tab (#31).
+ - Fixed auto-complete after text not separated by a whitespace or bracket.
+ - Fixed an error when disabling outline by setting `outlineinactivity=nil`.
+
+## v0.90 (Nov 08 2014)
+
+### Highlights
+ - Added function outline.
+ - Added Lua 5.3 (beta) binaries and debugging support.
+ - Added scope-aware auto-complete for local/global variables.
+ - Added hiding/showing files by type in the project/filetree.
+ - Added Esperanto (eo) translation.
+ - Improved compatibility with Lua 5.2 interpreter.
+ - Improved compatibility with system/custom Lua interpreter.
+
+### Special thanks
+ - To [cosmotect](https://github.com/cosmotect) for added Esperanto translation.
+ - To [riidom](https://github.com/riidom) for updated German translation.
+ - To [Christoph Kubisch](https://github.com/pixeljetstream) for glsl improvements.
+ - To [Wojciech Milkowski](https://github.com/milkowski) for making indentation guide configurable.
+ - To [sclark39](https://github.com/sclark39) for adding project dir to find dialog paths.
+
+### Improvements
+ - Added Lua 5.3 (beta) support and binaries.
+ - Added Russian translation for new messages (#70).
+ - Added `AddPackage` and `RemovePackage` methods (#166).
+ - Added `CreateBareEditor` package method (#166).
+ - Added `GetAPI` method for interpreter (#166).
+ - Added `GetOutputNotebook` package method (#166).
+ - Added `IsPanelDocked` package method (#166).
+ - Added `Run` and `Run as Scratchpad` buttons to the toolbar.
+ - Added `acandtip.maxlength` option for setting the length of a tooltip.
+ - Added `function` handling to the token processing.
+ - Added `imagemap` setting to support custom images.
+ - Added `onEditorCallTip` method (#166).
+ - Added `showonefile` option for the outline to always show one file (#337).
+ - Added an Esperanto (eo) translation.
+ - Added build support for Lua 5.3-alpha and luasocket for Lua 5.3.
+ - Added check for existing process id before stopping the process.
+ - Added check for pending data to improve re-starting debugging session.
+ - Added collapsing outlines for files in inactive tabs (#337).
+ - Added creating italic font if only the main one is provided.
+ - Added document `SetActive` method (#166).
+ - Added drag-and-drop support for the Outline tab (#337).
+ - Added example of enabling `Opt+Shift+Left/Right` shortcut on OSX.
+ - Added function outline (closes #337, closes #222).
+ - Added handling of `~` in launch command path.
+ - Added hiding/showing files by type in the project/filetree (closes #375).
+ - Added local/global indicators to function outline (#337).
+ - Added marking file after showing files in the tree (#375).
+ - Added navigation based on 'filename:line:pos' in the Output window.
+ - Added option for not/showing anonymous functions in the outline (#337).
+ - Added package `AddTool` and `RemoveTool` methods (#166).
+ - Added package `CreateImageList` method (#166).
+ - Added package `ExecuteCommand` method (#166).
+ - Added package `FindTopMenu` method (#166).
+ - Added package `GetAppName` method and removed hardcoded name references (#166).
+ - Added package `GetConsole` method (#166).
+ - Added package `GetKnownExtensions` method (#166).
+ - Added project dir to find dialog paths; thanks to @sclark39 (closes #358).
+ - Added rule to enable `Set From Current File` only when available.
+ - Added scope-aware auto-complete for local/global variables (closes #291).
+ - Added scrolling to the top of the outline when `showonefile` is set (#337).
+ - Added sending Corona SDK simulator output to the Output window on Windows.
+ - Added translation label for `Toggle Bookmark` toolbar icon (#70, #373).
+ - Added unindent on backspace (controlled by `editor.backspaceunindent`).
+ - Added view menu for the Outline window (#337).
+ - bugfix in output callback for commandline tools
+ - bugfix on extension change save-as, related to new indication handling
+ - cg/hlsl/glsl refine isfndef capture, mostly to react on GLSL's layout mechanism
+ - Disabled moving of Output/Console/Project tabs between panels.
+ - Disabled closing tabs in floating panels.
+ - Improved `ffitoapi` tool logic when no replacement is made.
+ - Improved compatibility with Lua 5.2 interpreter (closes #357).
+ - Improved scroll positioning in the outline after tab changes (#337).
+ - Improved support for non-lua specs in the outline (#337).
+ - Minor update to indentation guides handling (#371).
+ - Moved 'default' search path to be searched first (#357).
+ - Reduced rate of toolbar UI checks to improve performance (fixes #352).
+ - Reduced the number of focus changes in the outline (#337).
+ - Reduced unnecessary editor processing to improve performance (#352).
+ - Refactored `GetBitmap` package method (#166).
+ - Refactored `tools` interface to make it easy to add/remove tools.
+ - Refactored adding editor tab to ensure callbacks have document data.
+ - Refactored default `fprojdir` and `fworkdir` from the interpreter code.
+ - Refactored drag-and-drop processing for Project/Output window tabs (#377).
+ - Refactored panel docking; added `AddPanelDocked` package method (#166).
+ - Refactored timer usage for consistency.
+ - Remove function dropdown from the toolbar (#337).
+ - Removed menu separator from the Tools menu.
+ - Removed prepending libraries for debugging to LUA_CPATH when custom interpreter is specified.
+ - Removed reference to `funclist`, which is no longer needed.
+ - Removed unused image files.
+ - Renamed `markvars` method used in spec files to `marksymbols`.
+ - Renamed image files to have names correspond to the content.
+ - Reorganized default config settings.
+ - Reorganized token list processing to keep it within the editor.
+ - Restored removed function in Lua spec (partial revert of 713d0935).
+ - Switched to using `Is{Input|Error}Available` instead of `stream:CanRead`.
+ - updated luxinia2 related files
+ - Update de.lua
+ - Updated C-based specs to handle function calls without parameters.
+ - Updated C-based specs to use `marksymbols` to provide outline for C functions.
+ - Updated Lua 5.3 build scripts.
+ - Updated `AddPackage` to assign package file name (#166).
+ - Updated `RemoveMenuItem` to disconnect handlers attached to the main frame (#166).
+ - Updated `package.config` description to remove reference to Lua 5.2.
+ - Updated `showanonymous` to a label for anon functions in the outline (#337).
+ - Updated code based on static analysis suggestions.
+ - Updated command launch handling to allow output suppression.
+ - Updated function call indicator to support `isfncall` and `marksymbols`.
+ - Updated function indicator processing to use ranges.
+ - Updated handling of extensions to allow more symbols in extensions.
+ - Updated images in the outline; added `showmethodindicator` option (#337).
+ - Updated indicator processing to improve performance on large files.
+ - Updated interpreter processing to run after packages are loaded.
+ - Updated label for anonymous functions in the outline (#337).
+ - Updated language files with new messages (#70).
+ - Updated markup processing to allow for 3+ markup sequences.
+ - Updated markup processing to support links in non-editor documents.
+ - Updated messages for to match translations (#70).
+ - Updated method of collapsing outline to fix crash on OSX (#337, fixes #368).
+ - Updated outline logic to show on the very first launch (#337).
+ - Updated outline to always expand functions in the current file (#337).
+ - Updated outline to show files without functions (#337).
+ - Updated outline to track filename changes after `Save As` (#337).
+ - Updated outline to use `AddPackage` method (#337).
+ - Updated output callback processing not to run when nothing to process.
+ - Updated package `GetRootPath` to accept file/directory name (#166).
+ - Updated parser to avoid 'breaking' statements during incremental processing.
+ - Updated parser to handle `...` in function parameters.
+ - Updated parser to report function token before parameters (#337).
+ - Updated parser to store position for not-quite-valid function names.
+ - Updated processing of function indicators when auto-analyzer is off.
+ - Updated search/replace to always use the current editor/output/console tab.
+ - Updated static analizer to accept typedlua parser in addition to metalua.
+ - Updated tooltip processing to make it more consistent and better use space.
+ - Updated translation building script to handle non-string parameters (#70).
+ - Updated un/comment to keep the current selection and caret position (#360).
+ - Upgraded MobDebug (0.606) for `Detach Process` to correctly close debugging.
+ - Upgraded Mobdebug (0.607) to fix debugging after `Detach Process` command.
+
+### Incompatibilities
+ - Renamed `markvars` method used in spec files to `marksymbols`.
+
+### Fixes
+ - Fixed 'slow' mode of static analysis to work with Metalua 0.7.2.
+ - Fixed `Output` tab name after stopping/completing remote debugging.
+ - Fixed `Project` label shown untranslated in other languages (#70, #373).
+ - Fixed `Run` toolbar label not being translated (#70, #373).
+ - Fixed activation in `tree:FindItem` when new editor tab is opened (#166).
+ - Fixed an error when dragging Stack/Watch/other tabs between notebooks.
+ - Fixed an issue with removing first menu item in RemoveMenuItem (#166).
+ - Fixed an issue with searching in Output and Console windows.
+ - Fixed column indicator on lines with tabs (fixes #379).
+ - Fixed disabling Stack/Watch icons in the toolbar.
+ - Fixed error after using Enter multiple times in `Find in Files` on OSX.
+ - Fixed file renaming in the filetree after using `SaveAs`.
+ - Fixed flicker in the outline when auto-complete is shown (#337).
+ - Fixed focus switch after selecting a function in the outline and editing (#337).
+ - Fixed handling of remapped image files; improved error reporting.
+ - Fixed incorrect `binary not` calculation with wxlua and LuaJIT 2.1.
+ - Fixed index check during tab name update.
+ - Fixed keeping toolbar status after hiding it.
+ - Fixed localization in function outline (#337).
+ - Fixed localization to avoid error in `SaveAs` processing.
+ - Fixed navigation in function outline when `showonefile` is set (#337).
+ - Fixed not hiding directories when files without extension are hidden (#375).
+ - Fixed off-by-one error in function outline position tracking (#337).
+ - Fixed outline refresh after quick tab switches (#337).
+ - Fixed refresh of 'background' markers during debugging.
+ - Fixed replacement when selection doesn't match the text being searched for.
+ - Fixed search in files/directories with `%` in the name (fixes #369).
+ - Fixed storing position in `function` handling.
+ - Fixed stream reading for the Output to only include actually read chars.
+ - Fixed unused variables and constants based on static analysis.
+
+## v0.80 (Aug 31 2014)
+
+### Highlights
+ - Added support for expanding table elements in Watch window.
+ - Added editing of values in Watch window.
+ - Added highlighting all instances of selected text.
+ - Added replacing all selected instances using a dialog.
+ - Added saving (one-line) layout for editor tabs.
+ - Added support for `filename:<line>` and `filename:p<pos>` on the command line.
+ - Added search in Console and Output windows.
+ - Improved compatibility with Lua 5.2 to run the IDE.
+
+### Special thanks
+ - To [Li Jia](https://github.com/tiwb) for fixing remote path map when 'runonstart' option is set.
+
+### Improvements
+ - Added default values for `hotexit` and `saveallonrun` settings.
+ - Added debugger `GetHostName` and `GetPortNumber` methods (#166).
+ - Added a check for a local shortcut (F2/Del) being enabled before triggering.
+ - Added refresh of expanded Watch values.
+ - Added support for expanding table elements in Watch window.
+ - Added package `AddWatch` method (#166).
+ - Added `toolbar.iconsize` to configure toolbar icon size.
+ - Added `run-as-scratchpad` toolbar icon (hidden by default).
+ - Added `run` toolbar icon (hidden by default).
+ - Added `find-in-files` toolbar icon (hidden by default).
+ - Added support for disabling individual icons in the toolbar.
+ - Added replacing all selected instances using a dialog (closes #342).
+ - Added highlighting all instances of selected text (closes #344).
+ - Added `filetree.mousemove` option to disable drag-n-drop (closes #351).
+ - Added `suspended` to Output panel title when debugger is stopped (closes #350).
+ - Added a warning when remote console can't evaluate an expression (#350).
+ - Added handling of `osname` to package dependencies (#166).
+ - Added `onIdle` event (#166).
+ - Added `tree:FindItem` method (#166).
+ - Added package `Yield` method (#166).
+ - Added ability to set location of `ini` file from config.
+ - Added ability to load bitmap as toolbar icon.
+ - Added package `RemoveMenuItem` method (#166).
+ - Added ability to customize toolbar.
+ - Added saving (one-line) layout for editor tabs.
+ - Added centering of the screen after re-indenting and sorting (#337).
+ - Added local to variable 'activated' in function mapRemotePath
+ - Added centering of the screen after 'go to definition' and back (#337).
+ - Added centering of the screen after selection from the function list (#337).
+ - Added package `onEditorUpdateUI` event (#166).
+ - Added package `AddPanel` method (#166).
+ - Added package `GetUIManager` method (#166).
+ - Added editor `SetupKeywords` method (#166).
+ - Added document `GetFileExit` method (#166).
+ - Added `onEditorPainted` event (#166).
+ - Added support for `name:<line>` and `name:p<pos>` on the command line.
+ - Added error reporting on failure to load file from the command line.
+ - Added metalua components to MANIFEST (missing in packaging on OSX).
+ - Added saving auto-recovery record on switching from the application.
+ - Added `hotexit` option to exit without forcing to save files.
+ - Added setting of margin properties to support their reordering.
+ - Added error reporting on failure to delete directory from project tree.
+ - Added check for shortcut in conflict being enabled before activating (#233).
+ - Added workaround for missing `GetChildren` call in some wxlua configurations.
+ - Added unfolding modified lines to avoid leaving hidden lines in the editor.
+ - Added search in Console and Output windows (closes #313).
+ - Allowed double-click selection in the Output window (#313).
+ - Avoided system lib conflict when debugging by using bundled libs (fixes #355).
+ - Disabled editing on non-root watch elements.
+ - Disabled smart indentation for multi-line comments and strings (#324).
+ - Disabled re-indentation of multi-line comments/strings (#324).
+ - Disabled `Opt+Shift+Left/Right` shortcut as it conflicts with block selection.
+ - Enabled editing of values in Watch window.
+ - Enabled `editor.autoreload` by default.
+ - Improved config handling when `editor` configuration is removed/empty.
+ - Improved `autotabs` logic when the file starts with indentation.
+ - Improved auto-complete logic that tracks variable assignments (fixes #343).
+ - Improved cursor positioning after re-indenting or sorting.
+ - Improved compatibility with Lua5.2 to run the IDE.
+ - Increased default project history length to 20.
+ - Removed check for multiple references in stack values.
+ - Refactored stack processing to use methods to handle expandable table values.
+ - Refactored file name generation for compilation and static analysis.
+ - Removed erroneous message about failure to open '-psn...' file on OSX.
+ - Renamed all image files to remove cruft from their names.
+ - Simplified logic for watch processing.
+ - Switched from using TreeItemData to Lua tables for watch expressions.
+ - Switched to using tree control for watches.
+ - Updated copas library to support non-blocking requests using socket.http.
+ - Updated Stack and Watch views to better stringify keys.
+ - Updated watch menu to handle item under mouse cursor.
+ - Updated constants for image lists.
+ - Updated `FindMenuItem` method to search in the main and specified menus (#166).
+ - Updated `ide.config` to access wx, wxstc, and os through metatable.
+ - Updated recent projects/files handling to allow menus to be removed.
+ - Updated package `FindMenuItem` method (#166).
+ - Updated `autotabs` to respect `usetabs` when no indentation is present.
+ - Updated copy/cut to capture one instance when all are the same (closes #345).
+ - Updated default marker colors for lighter border (#305).
+ - Updated auto-recovery logic to skip missing files (fixes #323).
+
+### Fixes
+ - Fixed disabling auto-recovery on app switching.
+ - Fixed find-in-files error when used with editor not in focus (fixes #354).
+ - Fixed package `GetStack` method to return proper control (#166).
+ - Fixed Watch window background color on some Mint Linux systems.
+ - Fixed debugging error when `debugger.runonstart` is specified (fixes #348, #341).
+ - Fixed keybinding for `Ctrl-<punctuation>` working on Linux (fixes #346).
+ - Fixed localization based on static analysis.
+ - Fixed remote path map when 'runonstart' option is set.
+ - Fixed error reporting during Analyze (fixes #340).
+ - Fixed using image lists for stack/filetree to keep them in memory.
+ - Fixed indentation when Enter is hit at the middle of a line.
+ - Fixed formatting of `until` statements (fixes #335).
+ - Fixed formatting of strings including comments '--' (#335).
+ - Fixed restoring proper file names for unsaved tabs during auto-recovery.
+ - Fixed deleting 'dynamic words' when multiple lines are removed.
+ - Fixed `love.update` description (#247).
+ - Fixed indentation of strings starting from `endSomething` (#324).
+ - Fixed use of '%' in replacement for Lua5.2 compatibility (#153, #156, #143).
+ - Fixed warnings from static analysis.
+
+## v0.70 (Jun 18 2014)
+
+### Highlights
+ - Added support for OpenResty/Nginx, moonscript, and Lapis debugging.
+ - Added re-indentation of selected fragment or entire file.
+ - Added line mapping support for debugging Lua-based languages (e.g. moonscript).
+ - Added `editor.wrapindentmode` and `editor.wrapstartindent` settings.
+ - Fixed debugger compatibility with Lua 5.2.
+ - Fixed `F2` shortcut not working in file tree and watch panel.
+ - Fixed replace-in-files when saving backup copy is turned off.
+
+### Special thanks
+ - To [sclark39](https://github.com/sclark39) for `format.apptitle` option to format IDE title.
+ - To [Christoph Kubisch](https://github.com/pixeljetstream) for glslc improvements.
+ - To [Yonaba](https://github.com/Yonaba/) for updated French translation.
+
+### Improvements
+ - Added support for nginx debugging (Mobdebug 0.564).
+ - Added support for custom debugger initializer (global or interpreter-based).
+ - Added line mapping support for debugging Lua-based languages (e.g. moonscript).
+ - Added support to force local execution in console by prepending `!` (#326).
+ - Added setting proper `arg[0]` value during debugging (fixes #329).
+ - Added double click navigation in the Output window for unnamed files.
+ - Added centering of line after double click in the Output window.
+ - Added `editor.wrapindentmode` and `editor.wrapstartindent` settings.
+ - Added a workaround for focus switching between controls on OSX (#89, #327).
+ - Added assertion to ensure inserted editor is not in the notebook already.
+ - Added `format.apptitle` option to format IDE title (thanks to @sclark39).
+ - Added restoring cursor position after sorting/re-indenting.
+ - Added `onEditorUserlistSelection` event for userlist selection (#166).
+ - Added `onEditorAction` event for cut/copy/paste actions (#166).
+ - Added package `GetEditorWithFocus` method (#166).
+ - Added `editor.extradescent` option for line spacing (#305).
+ - Added centering of line on page after re-loading file with a known position.
+ - Added re-indentation of selected fragment or entire file (closes #324).
+ - Added sorting of the entire file if nothing is selected.
+ - Added `Edit | Source` sub-menu.
+ - Added centering line on page after bookmark navigation.
+ - Added `GetProjectTree`, `GetWatch`, and `GetStack` package calls (#166).
+ - Added bookmark-toggle toolbar icon (#233).
+ - Disabled message on failure to read symlinked folder content on Windows.
+ - Disabled breakpoint toggling when editor is not in focus.
+ - Disabled changing toolbar color with `auxwindow` as it only works for the dropdown.
+ - Increase font size for code fragments in markup (#305).
+ - glslc: change domain detection to be compatible with file.comp.glsl and file.tese
+ - Removed checks for specific errors in Local/Remote console.
+ - Removed focus handling workaround for editor tab changes (#89, #327).
+ - Renamed `menuformatrecentprojects` to `format.menurecentprojects` (#305).
+ - Removed handling of project dropdown in menu as it's no longer needed (#305).
+ - Reorganized menu shortcut conflict handling (#233).
+ - simplified glslc usage (compile and link based on file extensions)
+ - treat unreal shaders as hlsl
+ - Updated auto-complete logic to use configured spec separators.
+ - Updated logic for populating placeholders in dropdown menus.
+ - Updated french translation (thanks to @Yonaba)
+ - Updated menu items to stay enabled only when appropriate object has focus.
+ - Updated indentation logic for if/elseif/while/for split into 2+ lines (#324).
+ - Updated indentation logic to ignore comments (#324).
+ - Updated README with supported engines and installation instructions.
+ - Updated breakpoint-toggle toolbar icon to better match other icons (#305).
+ - Updated bookmark navigation to wrap around (#233).
+ - Updating sorting to keep original line endings.
+ - Upgraded metalua to v0.7.2.
+
+### Fixes
+ - Fixed setting control focus when the main frame is hidden.
+ - Fixed loading packages with dashes in filenames (fixes #330).
+ - Fixed toolbar to stay shown after failure to start debugging.
+ - Fixed focus on the editor after closing a dialog on OSX (fixes #328).
+ - Fixed crash on OSX when changing focus while the app is being closed (#327).
+ - Fixed some toolbar buttons being enabled with no editor tab open.
+ - Fixed toolbar stealing focus after closing floating panels and dropdowns (#327).
+ - Fixed restoring control focus when the app gets focus on OSX (fixes #327).
+ - Fixed activating editor when starting the app on OSX (#327).
+ - Fixed auto-complete to not offer the word the cursor is on.
+ - Fixed hiding auto-complete when the only option matches what's typed.
+ - Fixed an error when all editor tabs are closed.
+ - Fixed replace-in-files when saving backup copy is turned off.
+ - Fixed re-indenting of anonymous functions in tables (#324).
+ - Fixed `F2` shortcut not working in file tree and watch panel (#233).
+ - Fixed debugger compatibility with Lua 5.2 (Mobdebug 0.561).
+
+## v0.60 (May 11 2014)
+
+### Highlights
+ - Added support for switching breakpoints at run-time.
+ - Added bookmark handling.
+ - Added `Detach process` command to stop debugging and continue process.
+ - Added detaching debugger server.
+ - Added showing/hiding toolbar and status bar.
+ - Simplified user interface and updated application icons.
+ - Updated love2d API for v0.9.1.
+ - Updated Moai API for v1.5.
+ - Added `outputshell.usewrap` to set Output wrapping; on by default.
+ - Added `editor.wrapflags` to configure line wrapping indicators.
+ - Added `editor.foldflags`; set default to draw one line when folded.
+ - Added `editor.foldtype` with box, cirle, arrow, and plus types.
+ - Added `editor.extraascent` option to add line spacing.
+
+### Special thanks
+ - To [bartoleo](https://github.com/bartoleo) for italian translation update.
+ - To [riidom](https://github.com/riidom) for german translation update.
+ - To [sclark39](https://github.com/sclark39) for Copy Full Path implementation.
+ - To [DanielSWolf](https://github.com/DanielSWolf) for Moai API update for v1.5.
+ - To [madmaxoft](https://github.com/madmaxoft) for AnalyzeString patch.
+ - To [crumblingstatue](https://github.com/crumblingstatue) for Zoom update.
+ - To [SiENcE](https://github.com/SiENcE) for notepad++ colorscheme update.
+
+### Improvements
+ - Added new italian translations (thanks to @bartoleo)
+ - Added Russian translation for new messages (#70).
+ - Adding Copy Full Path to editor tabs, and a Clear Output Window option to the Output tab (thanks to @sclark39)
+ - Added support for packages in config files (#166).
+ - Added formatting for Recent Projects menu (#305).
+ - Added `Detach process` command to stop debugging and continue process.
+ - Added re/docking of Watch/Stack notebooks on tab background doubleclick (#305).
+ - Added bookmark handling (closes #233).
+ - Added `Clear items` to the Recent Files menu (ref #305).
+ - Added recent files dropdown to the toolbar (ref #305).
+ - Added applying new UI settings after upgrade (ref #305).
+ - Added toolbar button dropdown with recent projects (ref #305).
+ - Added `Choose Project Directory` to the toolbar (ref #305).
+ - Added floating/docking of notebooks on tab background doubleclick (ref #305).
+ - Added Recent Project menu refresh after switching projects (ref #305).
+ - Added setting project directory by renaming the filetree root element (#305).
+ - Added filetree popup menu with the list of projects (ref #305).
+ - Added 'Recent Projects' menu (ref #305).
+ - Added package `GetLaunchedProcess` call (ref #166).
+ - Added `IsRunning` and `IsConnected` API calls for the debugger (ref #166).
+ - Added `editor.wrapflags` to configure line wrapping indicators (ref #305).
+ - Added explicit sorting of files in the filetree.
+ - Added showing/hiding of the status bar (ref #305).
+ - Added auto-showing toolbar when debugging starts (ref #305).
+ - Added showing/hiding of the toolbar (ref #305).
+ - Added `outputshell.usewrap` to set Output wrapping; on by default (ref #305).
+ - Added `editor.foldflags`; set default to draw one line when folded (ref #305).
+ - Added `editor.extraascent` option to add line spacing (ref #305).
+ - Added explicit conversion to number for numeric settings.
+ - Added `editor.foldtype` with box, cirle, arrow, and plus types (ref #305).
+ - Added opening a new tab on double click on tab background (ref #305).
+ - Added ActivateItem method to the filetree API (ref #166).
+ - Added onFiletree* package events (ref #166).
+ - Added setting margin mask to allow for different margin order.
+ - Added support for switching breakpoints at run-time (closes #288).
+ - Added stopping debugging when debugger server is detached/stopped.
+ - Added opening file on one-click in icon/padding area in the filetree.
+ - Added AnalyzeString function (thanks to @madmaxoft).
+ - Added zooming for Output/Console windows (ref #290).
+ - Added IDs for Zoom menu items (ref #290).
+ - Add zoom actions with appropriate keyboard shortcuts to View menu (thanks to @crumblingstatue)
+ - Added detaching debugger server.
+ - Added skipping reporting for known globals in static analysis (closes #286).
+ - Added support for running zbstudio script from any folder on OSX.
+ - Adjusted `code` color in the comment markup for better visibility (#305).
+ - Changed order of stopping debugger and saving settings (ref #305).
+ - Cleaned unused variables and functions based on static analysis.
+ - Disallowed closing Output/Console/Project tabs (fixes #310).
+ - Disabled current project on the recent projects list (ref #305).
+ - Disable function call indicator by default to reduce clutter (ref #305).
+ - Disabled startng multiple find-in-files searches.
+ - Disabled editing/dragging of the project directory in the filetree.
+ - Enabled editor width auto-adjustment when wrapping is off.
+ - Enable retina support (`hidpi=true`) by default on OSX (#305).
+ - Increased default font size in the editor (ref #305).
+ - Increased wait time for Gideros player to start for more reliable launching.
+ - Made fold and marker margins wider (ref #305).
+ - Made jump-to-line in the Output window to work faster and more reliably.
+ - Moved `Project Directory` menu item lower to not activate on OSX (ref #305).
+ - Moved code to populate `wx` and `wxstc` descriptions to API files.
+ - Rearranged global functions in lua spec for simpler grouping (ref #79).
+ - Reduced sash (border between subsections) in all notebooks (ref #305).
+ - Reduced the line number margin width and default font size (ref #305).
+ - Refactored editor config references.
+ - Removed `Clear Dynamic Words` menu as it's rarely used.
+ - Removed the gripper on the toolbar (ref #305).
+ - Removed project selection dropdown from the filetree (ref #305).
+ - Removed paragraph conversion from love2d API conversion script (ref #247).
+ - Removed border around Output/Console panels (ref #305).
+ - Removed deprecated `startfile` interpreter option.
+ - Removed explicit margin numbers to make configuraton simpler.
+ - Removed border around editor components.
+ - Reordered markers to keep the curent line marker on top (#305).
+ - Reorganized and updated configuration examples.
+ - Set def linenumber font size as one smaller than editor font size (ref #305).
+ - Switched to plain background for the toolbar (ref #305).
+ - Switched to AuiToolBar as it provides buttons with dropdowns (ref #305).
+ - Upgraded Mobdebug (0.56).
+ - Upgraded debugger (mobdebug 0.553) to fix an issue with STEP command.
+ - Upgraded copas to the current version (v1.2.1).
+ - Updated default fonts for Windows and Linux for better looking ones (#305).
+ - Update de.lua (thanks to @riidom)
+ - Updated language files with new messages (#70).
+ - Updated copyright messages.
+ - Updated `Go To Line` menu item and its translations.
+ - Updated build scripts with a fix for a wxlua compilation issue (#260).
+ - Updated build prerequisites Linux install script.
+ - Updated default indicator color to more neutral one (#305).
+ - Updated OSX build script to use 10.7 SDK with 10.6 min-version (#260).
+ - Updated Mobdebug (0.555) to add support for `pause` debugger call.
+ - Updated lua interpreter to remove caching of executable path.
+ - Updated resetting pid only after completing non-debbugged process.
+ - Updated shortcut for Recent File navigation (ref #305).
+ - Updated application icons (ref #305).
+ - Updated stack/watch panel captions to be invisible (ref #305).
+ - Updated interpreters to check `ProgramFiles` env variable on Windows.
+ - Updated panel captions to be invisible (rev #305).
+ - Updated 'window unhide' logic (Windows only) to be called less frequently.
+ - Updated love2d interpreter to not hide the application window.
+ - Updated file sorting to be case-insensitive on all platforms.
+ - Updated filetree menu to use 'Edit Project Directory' on root element (#305).
+ - Updated love2d API to fix typos in descriptions (ref #247).
+ - Updated love2d API for v0.9.1 (ref #247).
+ - Updated love2d API conversion script to handle top-level functions (ref #247).
+ - Updated `PackageUnRegister` call to return the package on success (ref #166).
+ - Updated fold/wrap flag handling to work with wxwidgets 2.8 (ref #305).
+ - Updated breakpoint/currentline markers for less contrast colors (ref #305).
+ - Updated default folding to use lighter colors (ref #305).
+ - Updated default colors to have less contrast (ref #305).
+ - Updated Open file dialog to use current file or project location (closes #303).
+ - Updated Moai API for v1.5 (thanks to @DanielSWolf).
+ - Updated `autoanalyzer` option to more common spelling (analizer -> analyzer).
+ - Updated auto-complete to show in IDLE event for smoother processing.
+ - -minor color changes to notepad++ colorscheme (thanks to @SiENcE).
+
+### Incompatibilities
+ - Added opening a new tab on double click on tab background.
+ - Added re/docking of Watch/Stack notebooks on tab background doubleclick.
+ - Enabled retina support (`hidpi=true`) by default on OSX.
+ - Removed deprecated `startfile` interpreter option; use `startwith` option instead.
+ - Updated file sorting to be case-insensitive on all platforms.
+ - Updated `autoanalyzer` option to more common spelling (analizer -> analyzer).
+ - wxwidgets 2.8 is no longer supported (wxwidgets 2.9.5+ required).
+
+### Fixes
+ - Fixed Corona interpreter to clean debugger in `plugin` folder (Win).
+ - Fixed file tree activation of a deleted file.
+ - Fixed switching to full screen and restoring status bar on OSX (ref #305).
+ - Fixed right-click handling in filetree on OSX broken by 3709f61f (ref #166).
+ - Fixed usage of `self` in one of package API calls (ref #166).
+ - Fixed find dialog to stay on top after search directory selection on OSX.
+ - Fixed search result navigation after clicking beyond the end of line.
+ - Fixed an issue with running processes not terminated when closing IDE.
+ - Fixed an error after manual canceling Find-in-files dialog.
+ - Fixed an issue with deleting column-based selection (fixes #300).
+ - Fixed an error in variable indicator processing.
+ - Fixed looping when `valuetype` creates self-reference in APIs (ref #297).
+ - Fixed `elseif` auto-indentation (fixes #294).
+ - Fixed focus for Find field in the find dialog on some instances of OSX.
+
+## v0.50 (Mar 10 2014)
+
+### Highlights
+ - Fixed opening files and launching on OSX 10.6.x and 10.9.1+.
+ - Improved CPU utilization when idle on OSX.
+ - Added handling of command-line parameters.
+ - Implemented various auto-complete and tooltip improvements.
+ - Updated Love2d API for 0.9.0.
+ - Updated Corona API auto-complete/description to match v2014.2189 (G2.0).
+ - Updated Marmalade Quick API for v7.2.
+ - Updated French, German, Italian, and Russian translations.
+
+### Special thanks
+ - To [Asmageddon](https://github.com/Asmageddon) for fixed launching zbstudio from folders with spaces.
+ - To [Christoph Kubisch](https://github.com/pixeljetstream) for various luxinia2 fixes.
+ - To [Yonaba](https://github.com/Yonaba/) for updated French translation.
+ - To [riidom](https://github.com/riidom/) for updated German translation.
+ - To [bartoleo](https://github.com/bartoleo/) for updated Italian translations.
+
+### Improvements
+ - Added explicit focus for Find field in the find dialog on OSX.
+ - Added version dependency check for loaded plugins.
+ - Added `auxwindow` attribute to style auxiliary windows.
+ - Added sha2 library to provide sha256 hashing.
+ - Added package GetRootPath/GetPackagePath calls (ref #166).
+ - Added package FindMenuItem API call (ref #166).
+ - Added API call to analyze one file.
+ - Added restoring markers after external modification and file reload.
+ - Added displaying number of selected characters and instances (closes #274).
+ - Added using safe load for external data instead of loadstring.
+ - Added check for editor state during Edit menu display (ref #70).
+ - added italian translations; thanks to [bartoleo](https://github.com/bartoleo/).
+ - Added Russian translation for new items in the main menu (ref #70).
+ - Added package GetApp method (ref #166).
+ - Added package GetDebugger API call (ref #166).
+ - Added setting project directory passed as a parameter (second instance).
+ - Added Shift+Zoom to zoom all editors (closes #269).
+ - Added `alpha` setting for sel/seladd/caretlinebg styles.
+ - Added package GetToolBar API call (ref #166).
+ - Added `seladd` setting for styling additional selections.
+ - Added `Select and Find Next/Prev` (closes #268).
+ - Added showing search dialog for Quick Find on first search (closes #265).
+ - Added `nomousezoom` option for Console/Output windows (closes #266).
+ - Added error reporting when debugger server fails to start (closes #263).
+ - Added support for command line parameters for GSL-shell (ref #251).
+ - Added support for editor shortcuts and included standard OSX ones (closes #252).
+ - Added auto-complete for metamethods (closes #256).
+ - Added Minimize shortcut on OSX (closes #254).
+ - Added handling of command line parameters for love2d (ref #251).
+ - Added handling of command line parameters (closes #251).
+ - Added calling of end callback for detached processes.
+ - Added skipping compile check for non-lua files in scratchpad.
+ - Added handling of (optional) BOM in UTF-8 encoded files (closes #246).
+ - Added hint about removing backslash for invalid escape sequences.
+ - Adjusted tooltip position and content to always fit on the screen.
+ - allow tool exe paths to be set in config prior load
+ - Changed the order of applying styles to apply the main style last.
+ - Disabled singleinstance check by default on OSX (ref #204).
+ - Disable debugging termination when stack trace received from remote process.
+ - glsl: added imageSize to spec and api
+ - luxinia2 define some global vars if debugger is present
+ - luxinia2 support 32 and 64 bit runtime
+ - luxinia2: new setup, added support for debugging with main.lua and rudimentary scratchpad functionality
+ - Reduced the number of inactivity checks and timer calls (ref #204).
+ - Removed `calltipbg` attribute as it's replaced by `calltip.bg`.
+ - Removed unused files from metalua.
+ - Removed paragraph-to-newline conversion for API tooltips.
+ - Resolved conflict for Opt+Left (ref #252 and #203).
+ - Removed jumping to the current line after compilation errors.
+ - Switched to using temp files instead of -e option for debugging (ref #251).
+ - shader tools: allow relative directories for binaries
+ - shader specs: add isfncall definition to allow indication style
+ - Updated AddConfig/RemoveConfig to refresh styles after changes (ref #166).
+ - Updated Marmalade Quick API for v7.2.
+ - Updated Corona API for v2014.2189.
+ - Updated scheme picker to apply styles to all windows.
+ - Updated LfW interpreter to use project directory as current one (fixes #276).
+ - Updated README.
+ - Updated comment markup separators to apply markup in fewer cases.
+ - Updated French translation; thanks to [Yonaba](https://github.com/Yonaba/).
+ - Update de.lua; thanks to [riidom](https://github.com/riidom/).
+ - Updated Linux scripts to remove custom libpng/zlib as it's fixed in wxwidgets.
+ - Updated check for editor state during Edit menu display (ref #70).
+ - Updated Corona API auto-complete/description to match v2013.2100 (ref #73).
+ - Updated all language files with new messages (ref #70).
+ - Updated messages for better translation (ref #70).
+ - Updated love2d api with LineJoin and few other calls (ref #247).
+ - Updated OSX build script for wxwidgets 3.x (ref #260).
+ - Updated build script to compile wxwidgets 3.x on Windows (ref #260).
+ - Updated love2d api with some missing calls (ref #247).
+ - updated luxinia2 interpreter to reflect new luxinia2 structure
+ - Updated Love2d API for 0.9.0. (closes #247).
+ - Upgraded Mobdebug (0.551) to fix serialization of table/array indexes.
+ - updates to shader apis (bugfix in GLSL atomic description)
+
+### Incompatibilities
+ - Updated LfW interpreter to use project directory as current one (fixes #276).
+ - Removed `styles.calltipbg` as it is replaced by `styles.calltip.bg`.
+
+### Fixes
+ - Fixed shortcut menu generator to display default shortcuts.
+ - Fixed removing focus from editor when IDE loses focus on OSX (ref #204).
+ - Fixed hiding calltip and auto-complete when switching between tabs on OSX.
+ - Fixed handling of getenv returning general message (Mobdebug v0.5511).
+ - Fixed launching zbstudio from folders with spaces; thanks to @Asmageddon.
+ - Fixed `calltip` attribute to use/enable proper style.
+ - Fixed visibility of wrapped lines in console when going through history.
+ - Fixed syntax issues in definitions of IDE tables.
+ - Fixed an issue in metalua files when syntax error is reported.
+ - Fixed arrow key handling in Local console (fixes #279).
+ - Fixed removing temporary files in GSL-shell interpreter.
+ - Fixed tooltip positioning for long messages.
+ - Fixed current line in debugging after activation of files with wrapped lines.
+ - Fixed spurious ESC after activation on Windows when modifiers are pressed.
+ - Fixed skipping empty lines in tooltip formatting.
+ - Fixed comment markup at the end of a file.
+ - Fixed formatting calculations for tooltip to better fill the window.
+ - Fixed stopping debugging when switching projects with the same interpreter.
+ - Fixed auto-complete for classes with more than two levels.
+ - Fixed removal of paragraph breaks in tooltips after interpreter switch.
+ - Fixed API reloading that caused removal of paragraph breaks in tooltips.
+ - Fixed translations for stock menu items on Ubuntu 13.10 (ref #70).
+ - Fixed an issue with spec/tools/interpreters filters not working from config.
+ - Fixed messages script to work with LuaJIT.
+ - Fixed console output with multiple new lines at the end.
+ - Fixed issues on OSX 10.6.x and 10.9.1+ caused by flat namespace (fix #270, fix #264).
+ - Fixed an issue with `isfncall` spec property not being checked.
+ - Fixed function localization in menu handlers.
+ - Fixed default selection for search in case of multiple selections.
+ - Fixed dependency of lfs/git dlls on lualib.dll.
+ - Fixed an issue with activating proper tab after dragging.
+ - Fixed displaying local console output with invalid unicode characters.
+ - Fixed displaying script output with invalid unicode characters.
+ - Fixed drawing artifacts on Windows when line wrapping disabled (fixes #250).
+ - Fixed setting bom value for a new editor (fixes #258).
+ - Fixed auto-complete for values returned by 'core' functions (ref #256).
+
+## v0.40 (Dec 14 2013)
+
+### Highlights
+ - Added LuaDist integration.
+ - Added live coding support for GSL-shell.
+ - Added support for project settings.
+ - Added filetree operations.
+ - Added Busted interpreter.
+
+### Special thanks
+ - To Jayanth Acharya for SciTeLuaIDE color scheme.
+ - To Mike Richards for adding edge handling and styles.
+ - To [adamdmoss](https://github.com/adamdmoss) for Mobdebug API update.
+
+### Improvements
+ - Added live coding support for GSL-shell (closes #239).
+ - Added support for product-specific links in the Help menu.
+ - Added 'edge' style to the color schemes (ref #237).
+ - Added ability to set 'edge' style properties individually (ref #237).
+ - Add edge to styles
+ - Add fold margin checker color to styles
+ - Add edge line and fold margin checker color
+ - Added changing directory when launching on Linux (closes #157).
+ - Added setting PATH for LfW to allow loading of DLL dependencies.
+ - Added logic to set architecture dynamically for luadist (ref #225).
+ - Added luadist bootstrap dependencies for Linux (ref #225).
+ - Added option to load luadist as a module (ref #225).
+ - Added luadist bootstrap dependencies for OSX (ref #225).
+ - Added proxy dll for Lua 5.2 (ref #225).
+ - Added luadist bootstrap dependencies for Windows (ref #225).
+ - Added package GetInterpreters method (ref #166, #225).
+ - Added package AddConsoleAlias/RemoveConsoleAlias methods (ref #166, #225).
+ - Added version property to the Lua interpreters.
+ - Added new location for Marmalade Quick v7+ and s3e path logic (fixes #226).
+ - Added directory creation (if needed) to file saving.
+ - Added support for symlinks in the filetree (with recursion protection).
+ - Added package AddConfig/RemoveConfig methods (ref #166).
+ - Added package GetProject method (ref #166).
+ - Added package onProjectPreLoad method (ref #166).
+ - Added workaround for conflict with Scintilla shortcuts on Linux.
+ - Added 'Open with Default Program' to file tree operations (ref #123).
+ - Added toggling directory on Enter (ref #123).
+ - Added 'Copy Full Path' to file tree operations (ref #123).
+ - Added deleting file/directory to file tree operations (ref #123).
+ - Added processing of packages from `$HOME/.zbstudio/packages` folder (#166).
+ - Added 'New File' and 'New Directory' to file operations (ref #123).
+ - Added error reporting for failed rename operations (ref #123).
+ - Added re-opening editor tabs affected by directory move/rename (ref #123).
+ - Added package FindDocumentsByPartialPath method (ref #166).
+ - Added existing file overwrite confirmation when renaming (ref #123).
+ - Added existing file overwrite confirmation when saving.
+ - Added creating intermediate directories during file rename (ref #123).
+ - Added in-place editing of file and folder names (ref #123).
+ - Added refreshing editor tab after drag-n-drop operation (ref #123).
+ - Added drag-n-drop operation to move files in the project tree (ref #123).
+ - Added package AddMarker/RemoveMarker methods (ref #166).
+ - Added package GetStatusBar method (ref #166).
+ - Added package GetDocuments and document methods (ref #166).
+ - Added `EscapeMagic` function to escape magic characters.
+ - Added SciTeLuaIDE color scheme (thanks to Jayanth Acharya).
+ - Changed glslc option to reflect new version
+ - Disabled compilation check for scratchpad when `skipcompile` is set (ref #239).
+ - Disabled output activation for messages redirected to Console (ref #225).
+ - Disabled commenting for file types that don't specify line comments.
+ - Moved restoring project before loading files (ref #107).
+ - Reorganized loading configuration files (ref #107).
+ - Removed 'file no longer exists' message after moving opened files (ref #123).
+ - Removed some of the snippets as they are available as plugins.
+ - Store os specific clibs path to make it available to plugins.
+ - Tidy up estrela tools a bit (remove key strokes from cgc, remove luxinia res viewer, rename perforce files to get loaded again)
+ - Updated README.
+ - Updated samples with missing indicator constants (closes #243).
+ - Updated OSX executables and added 'fake' proxy for lua-dist support (ref #225).
+ - Updated handling of case-insensitive names during debugging on OSX (Mobdebug v0.545).
+ - Updated package onEditorPreSave to be called on SaveAs events (ref #166).
+ - Updated icon bundle to eliminate large icons.
+ - Updated application icon to a bit brighter one on OSX (closes #196).
+ - Updated build script on OSX to not require 10.6 SDK (closes #231).
+ - Updated menu definitions for consistency.
+ - Updated use of `unpack` for consistency and Lua 5.2 compatibility.
+ - Updated 'Open with Default Program' on Windows to work with spaces in names (#123).
+ - Updated cmake installation script to install to '/Applications' on OSX.
+ - Updated OSX build script to revert wxwidgets commit to fix auto-complete crash.
+ - Updated `Start debugging` hint to clarify.
+ - Updated single-click toggle to allow rename/move directories (ref #123).
+ - Updated normalization flags as some path parts were changed to dots.
+ - Updated editor tab processing using FindDocument method.
+ - Updated shortcut for Replace All to avoid conflict on OSX (fixes #220).
+ - Updated `SetDocumentModified` to use current tab text.
+
+### Fixes
+ - Fixed values 'captured' by redirected 'print' and not collected (fixes #240).
+ - Fixed typo in fold style definition (ref #237).
+ - Fixed console output being limited in addition to stack result limit.
+ - Fixed hang in auto-complete on expressions involving '...' (fixes #235).
+ - Fixed auto-complete for string values (broken by 933aacc2).
+ - Fixed crash when LUA_DEV environmental variable is not set (fixes #228).
+ - Fixed cmake cache filename (ref #225).
+ - Fixed incorrect UTF-8 sequence in UTF-8 validity check.
+ - Fixed Un/Comment menu for Output/Console windows.
+ - Fixed format of the file name reported after compilation errors.
+ - Fixed jumping to compilation error (if any) after Run/Debug.
+ - Fixed disabling 'Open with Default Program' on OSX (ref #123).
+ - Fixed file tree update after changes on OSX (ref #123).
+ - Fixed copying full path on OSX (ref #123).
+ - Fixed 'Open with Default Program' for paths with spaces on Windows (ref #123).
+ - Fixed folding issue (caused by `math.mod` not available in LuaJIT).
+ - Fixed debugger marker calculations to avoid marker conflicts.
+ - Fixed color references in marker config examples.
+ - Fixed Step Over/Out to stay in the same coroutine; Mobdebug 0.543 (closes #217).
+ - Fixed case sensitivity in matching of file name in error messages (fixes #216).
+ - Fixed tab text after SaveAs and loading files into the same tab.
+
+## v0.39 (Oct 06 2013)
+
+### Highlights
+ - Added Lua 5.2 support out of the box.
+ - Added suggesting dynamic words as fields in auto-complete.
+ - Added 'go to definition' (Ctrl/Cmd+Alt+Click) and 'jump to previous location' (Alt+Left).
+ - Added abbreviation of project directories to keep unique parts visible.
+ - Fixed breakpoints with Marmalade Quick.
+ - Switched to using LuaJIT interpreter by default.
+ - Upgraded Luasocket (3.0-rc1), copas, and coxpcall libraries.
+
+### Special thanks
+ - To Chow CheeWen for Chinese translation.
+ - To [Enrique García](https://github.com/kikito) for fixing `fixutf8` function.
+ - To [Riidom](https://github.com/Riidom) for German translation.
+ - To [ardente](https://github.com/ardente) for user home patch for Windows and separating Lua 5.1 and 5.2 paths in user config.
+ - To [Mika Attila](https://github.com/crumblingstatue) for code folding patch.
+ - To [Tim Mensch](https://github.com/TimMensch) for auto-save, auto-reload, and debugger improvements.
+ - To [Florian](https://github.com/SiENcE) for Notepad++ color scheme.
+ - To [Michal Kottman](https://github.com/mkottman) for 'go to definition' and Alt+Left navigation patch.
+ - To [Christoph Kubisch](https://github.com/CrazyButcher) for dx11 and glslc updates.
+ - To [jpoag](https://github.com/jpoag) for improved activation during debugging on Windows.
+
+### Improvements
+ - Added setting project directory when passed as a parameter.
+ - Added activation of windows with SDL_app class name (Moai support).
+ - Added support for joining/splitting Watch/Stack with Output/Console tabs.
+ - Added package GetSetting method (ref #166).
+ - Added selected index to package onMenuEditorTab event (ref #166).
+ - Added activation of windows with FREEGLUT class name (Moai support).
+ - Added hiding console window for Corona (2013.8.28+) applications (Windows).
+ - Added suggesting dynamic words as fields in auto-complete.
+ - Added socket.connect for compatibility with socket.core <3.0 (fixes #208).
+ - Added recalculating line number margin width after zooming (fixes #207).
+ - Added margin constants and removed unused variables.
+ - Added reporting of socket error for initial debugger calls (Mobdebug 0.5403).
+ - Added error handling/reporting for `debugger.outputfilter`.
+ - Added 'debug' option to OSX build script.
+ - Added ability to modify exe path in base interpreter (ref #197).
+ - Added package GetEditorNotebook method (ref #166).
+ - Added 'molokai' color scheme (ref #200).
+ - added hlsl spec and basic api (note: currently autocomplete doesn't work on object functions, need fix). also fixed cg syntax lexer settings
+ - Added file activation for abbreviated file names in error messages.
+ - Added abbreviation of project directories to keep unique parts visible.
+ - Added `debugger.redirect` configuration option.
+ - Added `editor.saveallonrun` configuration option.
+ - Added package GetOutput method (ref #166).
+ - Added package onAppLoad/onAppClose events (ref #166).
+ - Added package onIdleOnce event (ref #166).
+ - Added manifest to the Windows executable and re-signed.
+ - Added Notepad++ color scheme (thanks to Florian/SiENcE; closes #193).
+ - Added clearing document styles after saving file with a different extension.
+ - Added workaround to avoid crash on OSX after `Close All Pages` (closes #190).
+ - Added return type for string.* functions to assist in auto-complete (ref #189).
+ - Added handling of string literals in type assignments (closes #189).
+ - Added support for captures in regexp replacement (\1-\9).
+ - Added ability to cancel FindInFiles search by closing search dialog (ref #162).
+ - Added activating Output window before showing search results (ref #162).
+ - Added support for packages from different platforms to co-exist (ref #166).
+ - Added ability to save complex data in package settings (ref #166).
+ - Added support for multiple inheritance in auto-complete (ref #101).
+ - Added ability to add/remove API descriptions from plugins (ref #166).
+ - Added package GetSettings/SetSettings methods (ref #166).
+ - Added methods to save/restore package settings (ref #166).
+ - Added ability to add/remove specs from plugins (ref #166).
+ - Added ability to add/remove interpreters from plugins (ref #166).
+ - Added wxlua patch for twoface compatibility.
+ - Added `setfenv` for Lua 5.2 compatibility.
+ - Added links to project page and documentation (closes #180).
+ - Added German translation (thanks to Riidom; ref #70).
+ - Added default value to package config (ref #176).
+ - Added handling of ?51.dll and required DLLs for LuaForWindows interpreter.
+ - Added plugin::GetConfig method (ref #166).
+ - Added erasing current line in Console (ref #173).
+ - Added search/completion in the local and remote console (closes #173).
+ - Added package onAppFocus* events (ref #166; ref #172).
+ - Added Chinese translation (thanks to Chow CheeWen; ref #70).
+ - Added `editor.autoreload` to enable reload of updated files (ref #172).
+ - Added creating (missing) folders when saving a file (fixes #171).
+ - Added an example of styling individual keywords.
+ - Added fold indication of a current block (ref #168).
+ - Added reporting of process id for a conflicting process.
+ - allow to define separate lua 5.1 and 5.2 paths in user config
+ - Changed 'go to definition' to Ctrl/Cmd+Alt+Click (ref #203).
+ - Changed `un/comment` to act from the beginning of the line for multi-line selection.
+ - Disabled refreshing Watch/Stack windows when they get focus.
+ - Disabled markup styling for specs without comment styles.
+ - Disabled showing tooltip when auto-complete suggestions are shown.
+ - Disabled error reporting after debugging has been terminated.
+ - Disabled 'Fold' menu instead of removing when no folding is allowed (ref #169).
+ - dx11 and glslc updates
+ - Enabled editing watches with doubleclick or Enter.
+ - Enable Ctrl+Click and Alt+Left navigation on local variables
+ - Enabled support for xml/html folding.
+ - Enabled path remapping for local debugging.
+ - Enabled slower and more thorough static analysis (ref #149; ref #168).
+ - Improved file/debugger activation on Windows (ref #199).
+ - Improved IDE activation during debugging on Windows (closes #199); thanks to jpoag.
+ - Improved logic to jump to file/line indicated in error messages.
+ - Limited activation of code fragments to the beginning of debugging session.
+ - Make code folding optional (thanks to [Mika Attila](https://github.com/crumblingstatue))
+ - Moved 'Sort' menu to 'Edit'.
+ - OpenGL 4.4 and ARB extensions added as well as NV_gpu_shader5 functions
+ - Optimized handling of large tables in stack results.
+ - Optimized line count calculation for dynamic words when text is deleted.
+ - Optimized dynamic word processing for large files.
+ - Reduced CPU usage while idle (ref #204, #206).
+ - Renamed package onEditorPostSave event to onEditorSave for consistency (ref #166).
+ - Removed comment from default spec as it forces undesired markup styling.
+ - Removed auto-complete suggestion when it is already typed (ref #101).
+ - Reorganized auto-complete handling; should fix #164.
+ - Reorganized path separator handling to minimize use of global variables.
+ - Reorganized API processing to allow loading API description from a plugin.
+ - Replaced package onEditorActivated event with onEditorFocus* events (ref #166).
+ - Set search in subdirectories as default in Find in Files dialog (ref #162).
+ - Switched to using POSIX compatible regexp with '()' used for captures.
+ - Updated LICENSE information.
+ - Updated Windows build file for wxwidgets 3.0.
+ - Updated support for MOAI coroutine debugging (Mobdebug 0.541).
+ - Updated type assignment logic to remove spurious types.
+ - Updated Windows build script to enable gdb debugging.
+ - Updated OSX build script to not strip debug builds.
+ - Updated Corona interpreter to handle failure to copy debugger to Resources/ folder.
+ - Updated build scripts with proper INSTALL_PREFIX option.
+ - Updated CFBundleIdentifier in plist files to allow references from OSX programs.
+ - Updated un/comment to toggle selection as a group rather than line by line.
+ - Updated `NewFile` to accept a file name.
+ - Updated 'get hostname' logic to avoid using non-resolvable names (mostly on OSX).
+ - Updated tooltip to use the same type inference as auto-complete (ref #101).
+ - Updated Estrela reference in README.
+ - Updated build script on Windows to enable debugging (ref #164).
+ - Updated build script with a (temporary) fix for wxlua issue (mingw32).
+ - updated glewgl api for OpenGL4.4 and removed non-core duplicate functions/enums
+ - Updated static analyzer to report only first instance of 'unknown field'.
+ - Updated filename/source code heuristic in the debugger (Mobdebug 0.5362).
+ - Updated `SaveAll` to allow saving (only) files with filenames (ref #172).
+ - Upgraded copas and coxpcall libraries (closes #144).
+ - windows: adopt native user home (thanks to [ardente](https://github.com/ardente))
+
+### Fixes
+ - Fixed Lua 5.2 crash on OSX (added -O1).
+ - Fixed onInterpreterLoad to only be called when interpreter changes.
+ - fix the fixutf8 function (thanks to Enrique García).
+ - Fixed handling of source code fragments in the Stack view.
+ - Fixed Watch/Stack windows to refresh when shown.
+ - Fixed incorrect editor tab acted upon in split notebook situations.
+ - Fixed auto-complete suggestions for indentifiers matching partial function names.
+ - Fixed hiding launched windows when running/debugging (Windows).
+ - Fixed showing known functions in auto-complete.
+ - Fixed showing output with invalid UTF8 characters in Stack and Console windows.
+ - Fixed debugging on/off handling in 'main' thread for LuaJIT (MobDebug 0.5402).
+ - Fixed having duplicate tabs after SaveAs with existing file name.
+ - Fixed showing redirected 'print' messages after debugging is terminated.
+ - Fixed using default interpreter when no interpreter is selected.
+ - Fixed stepping through blocks with undefined variables when 'strict' is in effect (upgraded Mobdebug to 0.5401).
+ - Fixed loading of files with incorrect UTF-8 encoding and control characters (fixes #198).
+ - Fixed package sample to take into account new documents.
+ - Fixed crash on OSX after opening 'application' in 'Open File' dialog.
+ - Fixed windows resource file to properly reference the manifest.
+ - Fixed missing default api for files with unknown extensions.
+ - Fix spurious replacement after 'search, clear selection, replace' actions.
+ - Fixed using auto-complete with multiple selections (fixes #188).
+ - Fixed looping in auto-complete with array references (ref #143).
+ - Fixed showing auto-complete after comma.
+ - Fixed 'cannot get official hostname' message on low privilege accounts (fixes #183).
+ - Fixed displaying variable instances when code has invalid blocks (fixes #182).
+ - Fixed tooltip to ignore string parameters (ref #101).
+ - Fixed tooltip display between empty brackets (ref #101).
+ - Fixed indentation after lines with brackets in strings.
+ - Fixed indentation after lines with anonymous functions.
+ - Fixed indicator showing at the end of not terminated long comment.
+ - Fixed an issue with LUA_DEV including files instead of directories.
+ - Fixed project switching to close all files when switching to a subdirectory.
+ - Fixed saving projects that do not have any open files.
+ - Fixed debugger to accept filenames without '@'; thanks to Tim Mensch (closes #174).
+ - Fixed sorting when the sorted fragment ends with a newline.
+
+## v0.38 (Jun 21 2013)
+
+### Highlights
+ - Added source code debugging (to support LuaJava and other engines).
+ - Added scope-aware global/local/masked/masking variable highlighting.
+ - Added 'Go To Definition' and 'Rename All Instances'.
+ - Added package/plugin API.
+ - Added Retina display support (can be enabled with `hidpi` option).
+ - Improved auto-complete API with inheritance and table index support.
+
+### Special thanks
+ - To George Pimm for line of code navigation in the Stack Window.
+ - To Fringale for updated French translation.
+ - To Tom Burgel for LuaForWindows interpreter.
+
+### Improvements
+ - Added sorting of file lists on Linux (used in the filetree and file search).
+ - Added LuaForWindows interpreter (thanks to Tom Burgel).
+ - Added package onEditorCharAdded/onEditorKeyDown events (ref #166).
+ - Added support for changing the Corona simulator skin (closes #151).
+ - Added inheritance support for auto-complete API.
+ - Added package onEditor* events (closes #166).
+ - Added package onInterpreterLoad/onInterpreterClose events (ref #166).
+ - Added package onProjectLoad/onProjectClose events (ref #166).
+ - Added package onMenu* events (ref #166).
+ - Added package onRegister/onUnRegister events (ref #166).
+ - Added 'Show Location' to the Project/Filetree menu.
+ - Added `hidpi` option to enable HiDPI/Retina display support (closes #160).
+ - Added breakpoint support for unnamed code fragments.
+ - Added support for debugging (stepping through) unnamed code fragments.
+ - Added LuaSec to win32 build script.
+ - Added package/plugin processing.
+ - Added support for 'silent' execution of shell commands in markup.
+ - Added `Find Next/Previous` over selected variable instances (ref #163).
+ - Added `debugger.allowediting` option to allow editing while debugging.
+ - Added skiping binary files during file search (ref #162).
+ - Added yield to update search results during file search (ref #162).
+ - Added showing default extensions in the file search (ref #162).
+ - Added support for multiple file extensions in the file search (ref #162).
+ - Added saving folder to search files in (ref #162).
+ - Added selecting all instances with a double-click on a variable.
+ - Added `autoanalizer` option for dynamic static analysis.
+ - Added 'Go To Definition' and 'Rename All Instances'.
+ - Added initial support for indicating local/global variables.
+ - Added showing tooltip in any position over a term and showing 'values' (ref #101).
+ - Added disabling tooltip when context menu is shown.
+ - Added 'fixing' path returned by wxDirDialog; may be incorrect in 2.9.x.
+ - Added constant initialization missing on ArchLinux with wxlua 2.8.12.2 (fixes #155; ref #128).
+ - Added support for table valuetypes in auto-complete for `foo[index]:` (ref #101).
+ - Added navigation to the line of code in the Stack Window (thanks to George Pimm; closes #134).
+ - Added `Show Location` to the editor tab menu.
+ - Added support for absolute filenames in Markdown links.
+ - Allowed tab width and indentation to be set independently.
+ - Allowed closing editor tabs while debugger is running.
+ - Disabled following symlinks during directory scanning to avoid infinite loops.
+ - Disabled showing tooltip when the app is in the background (fixes #158).
+ - Disabled 'value' tooltip over variables that match known function names (ref #101).
+ - Improved error reporting in interpreters on failures to copy the debugger.
+ - Improved focus on the debugger when a breakpoint hits on OSX (fixes #141).
+ - Removed sorting in the Stack view to keep the order of table elements.
+ - Set default directory for Find in Files opened from a new file (#ref 162).
+ - Updated configuration example for variable indicators.
+ - Updated Stack view navigation to use clicked on instead of active item.
+ - Updated Gideros API/auto-complete reference.
+ - Updated markup to allow opening files from new buffers ('untitled').
+ - Updated build scripts to use luasocket 2.0.3.
+ - Updated linux build files to use latest zlib/libpng to fix png load on Gentoo.
+ - Updated 'Find in Files' to start in the project folder by default.
+ - Updated French translation with latest string changes (mostly for find/replace dialogs).
+ - Updated Marmalade Quick auto-complete API to use class inheritance.
+ - Updated Gideros auto-complete API to use class inheritance.
+ - Upgraded Mobdebug to 0.534 for debugging of source code fragments.
+
+### Fixes
+ - Fixed looping in auto-complete when indexes are used (fixes #143).
+ - Fixed possible duplicate paths in the filetree.
+ - Fixed missing numerical keys in serialized tables (upgraded Mobdebug to 0.535).
+ - Fixed styling of markup that can be affected by folded lines.
+ - Fixed value selection with multiple active selections.
+ - Fixed style compatibility with wxwidgets 2.8 (ref #128).
+ - Fixed error reporting by (internal) file operations.
+ - Fixed styling comments that start with markup symbols.
+ - Fixed restoring a session with one of the files deleted on disk (fixes #161).
+ - Fixed reporting variable instances for comment/string fragments.
+ - Fixed 'Rename Instances' to always reset previous selection.
+ - Fixed auto-complete error for '%dddd' strings (fixes #156).
+ - Fixed an issue with showing filenames that include '"?*:<>' on OSX/Linux.
+ - Fixed current line marker being shown using 'Run as Scratchpad' with 'runonstart' option.
+ - Fixed looping in auto-complete (fixes #151).
+ - Fixed incorrect localization that led to an error in 'Save' from tab menu.
+
+## v0.37 (May 09 2013)
+
+### Highlights
+ - Added Marmalade Quick auto-complete support and API documentation.
+ - Added full Marmalade Quick debugging support (requires Quick 1.1+).
+ - Improved Find/Replace behavior and functionality.
+ - Added Recent File history navigation.
+ - Added Preferences menu to simplify access to system/user settings.
+
+### Special thanks
+ - To Samuel Dionne-Riel for wxwidgets 2.8 compatibility updates.
+ - To Mat Hopwood for assistance with Marmalade Quick integration.
+
+### Improvements
+ - Added Preferences menu to simplify access to system/user settings.
+ - Added Russian translation for Find/Replace dialog and (ref #70).
+ - Added Russian translation for the Preferences menu (ref #70).
+ - Added 'shaking' Find/Replace window when text is not found (closes #146).
+ - Added 'wlua' to the list of recognized Lua extensions.
+ - Added disabling Recent Files menu if the list is empty.
+ - Added TomorrowContrast color scheme (thanks to Sergey Lerg).
+ - Added detaching a child process to avoid crash when exiting during debugging.
+ - Added Recent File history navigation (closes #66).
+ - Added Marmalade auto-complete support and API documentation.
+ - Added processing of `runonstart` when using remote debugging (closes #138).
+ - Added suggesting proper extension after 'Save/Save As' based on current spec.
+ - Added translation setup for Find/Replace dialog (closes #133).
+ - Added `nomousezoom` option to disable zoom with mouse wheel in the editor.
+ - Added selecting text and Cmd-F shortcut in Find dialog on OSX (ref #127).
+ - Improved file activation when debugging is started (closes #137).
+ - Reduced the minimum size of the Output/Console panel.
+ - Refactored Recent Files history to make it faster and simpler.
+ - Refactored and optimized directory scanning when loading IDE files.
+ - Separated settings for function dropdown and project tree fonts (fixes #148).
+ - Updated documentation about default EOL on OSX (ref #102).
+ - Updated highlighting in Watch windows to not use editor styles.
+ - Updated documentation for user settings (ref #113, #55).
+ - Updated Monokai color scheme to fix current line color.
+
+### Incompatibilities
+ - (dev) `FileSysGet` has been replaced with `FileSysGetRecursive` with a different signature.
+
+### Fixes
+ - Fixed hiding all panels when switching to Full Screen mode.
+ - Fixed loading a non-existing file.
+ - Fixed activation of non-existing files/folders in the Project tree.
+ - Fixed search results for lines without newline.
+ - Fixed Find/Replace in folders with Unicode names (fixes #147); improved performance.
+ - Fixed Un/Comment commands executed for empty lines.
+ - Fixed fold/unfold for files starting with block/comment.
+ - Fixed history after activating non-existing file in Recent Files.
+ - Fixed scrolling to restored cursor position on OSX (when `usewrap` = false).
+ - Fixed Find/Replace dialog to take Enter on OSX (fixes #140).
+ - Fixed 'breaking' after executing OUT command that never reaches the target level.
+ - Fixed stopping at a breakpoint at the initial line when `startwith` option is specified.
+ - Fixed activation of a file loaded into active tab.
+ - Fixed incorrect tab activation on OSX after using 'Open File'.
+ - Fixed editor activation when file is loaded into an existing tab.
+ - Fixed an error after opening non-existing file from 'Recent Files'.
+ - Fixed blocking on reading app output without processing other events.
+ - Fixed an issue with duplicate lines shown in the editor.
+ - Fixed 'Replace All' to take 'Wrap Around' into account (fixes #132).
+ - Fixed off-by-one error in searching consecutive matches.
+ - Fixed 'Quick Find' not working without current selection (fixes #131).
+ - Fixed looping in auto-complete on mistyped class (fixes #130).
+ - Fixed compatibility with wx2.8 (thanks to Samuel Dionne-Riel; closes #128).
+ - Fixed replacement logic in Find/Replace that could replace selected fragment (ref #127).
+ - Fixed an error caused by allowing multiple Search/Replace windows (fixes #127).
+
+## v0.361 (Apr 12 2013)
+
+### Improvements
+ - Added handling of Ctrl-Home and Ctrl-End on OSX (ref #89).
+ - Added line copy/cut for Ctrl-C/Ctrl-X with no selection.
+ - Updated About screen to be more configurable and flexible.
+ - Updated Russian translation (thanks to toiffel).
+
+### Fixes
+ - Fixed launch command for Corona debugging on Windows.
+ - Fixed 'control' check on OSX that changed with wx2.9.2+ (ref #89).
+ - Fixed wrong tab activated on OSX after using New file in some cases.
+ - Fixed cursor not being visible in some cases after file is loaded (ref #116).
+
+## v0.36 (Apr 08 2013)
+
+### Highlights
+ - Added 32bit and 64bit **Linux binaries**.
+ - Enabled **full debugging for Corona on OSX**.
+ - Improved **debugger performance**.
+ - Improved **performance of tab and project switching**.
+ - Added **multiple selection and multi-cursor editing**.
+ - Made Stack and Watch windows dockable and toggleable.
+
+### Special thanks
+ - To toiffel for build improvements and continuous work on wxwidgets 2.9 and Linux support.
+ - To Marcel van Herk for testing and feedback on Stack and Watch windows behavior.
+ - To Leo Bartoloni for Italian translation update.
+ - To Fringale for updated French translation.
+ - To neomantra for adding cdata processing in the serializer.
+
+### Improvements
+ - Added handling of case-insensitive filenames on OSX.
+ - Added cdata processing (thanks to neomantra).
+ - Added universal binaries for luasocket on OSX to allow debugging of 64bit applications (for example, LuaJIT) on OSX.
+ - Added update of Stack and Watch windows after 'Debugging suspended' message.
+ - Added toggling for View menu items.
+ - Added auto-show/hide Stack and Watch windows during debugging (closes #110).
+ - Added ignoring `-psn...` parameter on OSX when reading file names from command line.
+ - Added migration of configuration file on Windows (helps #89).
+ - Added check for different spellings of the same folder in the project tree.
+ - Added scripts to install build prerequisites on Linux (helps #89).
+ - Added linux binaries with support for x86 and x64 (helps #89).
+ - Added window list button to the notepad with editor tabs.
+ - Added centering of current line during debugging.
+ - Added multiple selection and multi-cursor editing (wx2.9.5+).
+ - Added dll proxy to make LfW libraries to work with the IDE.
+ - Disabled showing 'value' in auto-complete after 'a:' (helps #101).
+ - Enabled full debugging for Corona on OSX.
+ - Improved debugging performance.
+ - Improved performance of tab switching and project tree population.
+ - Improved handling of upvalues with __tostring method in the Stack window.
+ - Increased default font size for OSX; set 'Monaco' as default font (helps #89).
+ - Made stack and watch windows dockable (closes #103).
+ - Optimized project switching and added notebook freezing where possible (ref #89).
+ - Reduced flicker in the project tree when a file is opened (ref #89).
+ - Removed binary libraries not currently used.
+ - Set 'Courier New' as the default font on Linux (ref #89).
+ - Switched to 'native' menu on OSX and added 24x24 icons required (helps #89).
+ - Updated Italian translation (thanks to Leo Bartoloni)
+ - Updated 'method' type in auto-complete to only allow a:b syntax (closes #101).
+ - Updated language files (es, it, ru) with new messages (ref #70).
+ - Updated French translation with latest string changes, fixed a few typos (thanks to Fringale).
+ - Updated Stack and Watch window to not refresh when not visible.
+ - Upgraded Mobdebug (0.5222) to add serialization with metamethods and notification on incomplete output (closes #109).
+ - Updated error messages from loading configuration files.
+ - Updated Linux binaries to use libpng 1.6 with wxwidgets (helps #89).
+ - Updated Windows/OSX build files to only build components needed (helps #89).
+ - Updated windows executable to show properly scaled icons in the Explorer.
+ - Updated status bar to use no border around fields.
+ - Updated large icons for "native" toolbar on OSX (helps #89).
+ - Updated function call indicator to use round box with wxwidgets upgrade (helps #89).
+ - Updated handling of markdown styles to make it more robust (fixes #59).
+ - Updated README with Marmalade Quick support and Corona tutorial.
+
+### Incompatibilities
+ - Configuration file (.ini) location has changed on Windows. The current file will be copied to the new location.
+ - The debugger now stops on the next executable line after `.start()` call.
+
+### Fixes
+ - Fixed activating files in the project tree on a case insensitive system.
+ - Fixed the Stack view being partially hidden when the root item is too wide (ref #110).
+ - Fixed left side of the project panel being hidden when a file is activated (fixes #122).
+ - Fixed breakpoint not firing on the first executable line in debugging (helps #121).
+ - Fixed terminating debugging of an empty script.
+ - Fixed reporting of initial line during debugging.
+ - Fixed editor tab activation after closing another tab on Linux (ref #89).
+ - Fixed 'Show tooltip' shortcut not working on Linux (fixes #118; ref #89).
+ - Fixed cursor position being incorrectly restored (fixes #116; ref #89).
+ - Fixed a warning about empty project directory in local console.
+ - Fixed an issue with Enter used to select an item in project dropdown (ref #89).
+ - Fixed an issue with the Project tree when project and app directories are the same.
+ - Fixed debugger output not being suppressed on Linux and using wlua.
+ - Fixed a static analyzer issue with anonymous functions defined in expressions (fixes #3).
+
+## v0.35 (Feb 10 2013)
+
+### Highlights
+ - Added support for **debugging Lua 5.2 scripts**.
+ - Added support for **cross-platform remote debugging**.
+ - Added support for starting Gideros **on-device debugging**.
+ - Added support for live coding, script reloading, and coroutine debugging under LuaJIT.
+ - Added **Marmalade Quick** support.
+ - Added **live-coding for Corona** interpreter.
+ - Added editor tab popup menu with 'Close All', 'Close Other', and other items.
+
+### Special thanks
+ - To Roland Yonaba and Fringale for updates to French translation.
+ - To Fringale for enhanced line-endings handling.
+ - To toiffel for build improvements, continuous work on wxwidgets 2.9 support, and several patches.
+ - To Andy Bower for the stream of feedback on live coding and on-device debugging.
+
+### Improvements
+ - Added `debugger.runonstart` option to configure if debugging should run immediately after starting.
+ - Added `editor.checkeol` option to configure checking for eol encoding in loaded files.
+ - Added Marmalade Quick support.
+ - Added support for starting Gideros on-device debugging.
+ - Added requesting user attention when stopped during debugging.
+ - Added example for `defaulteol` configuration option.
+ - Added configuration option for compact folding (`editor.`).
+ - Added support for cross-platform remote debugging.
+ - Added support for script reloading and coroutine debugging under LuaJIT (MobDebug 0.514).
+ - Added Russian translation for new messages.
+ - Added handling of malformed UTF8 characters in files (fixes #97).
+ - Added support for debugging Lua 5.2 scripts.
+ - Added workaround for Moai require path issue (fixes #96; fixes #87).
+ - Added editor tab popup menu with 'Close All', 'Close Other', and other items.
+ - Added C/CPP specification file and a configuration example.
+ - Added XCode-like key mapping.
+ - Added removing of file: prefix and url decoding of filepaths (helps #89).
+ - Added a workaround for returning incorrect project folder (helps #89).
+ - Adjusted handling of filepath to work with relative and absolute paths (helps #89).
+ - Enabled live-coding for Corona interpreter.
+ - Improved line-endings handling (Fringale).
+ - Improved reporting of stack and serialization run-time errors.
+ - Updated Gideros interpreter to run debugging immediately after starting; Use `debugger.runonstart = false` to disable.
+ - Updated Linux startup script to use online versions of wxlua packages (deb files).
+ - Updated handling of file: prefix as it's different on Windows and OSX (helps #89).
+ - Updated messages in the starter script.
+ - Updated function call parsing to recognize "func{}" and "func''" syntax.
+ - Updated os.exit() call in local console to exit gracefully.
+ - Updated French translation with various fixes and tweaks (Fringale).
+ - Updated French translation with newly added strings (Fringale).
+ - Updated 'Close page' and its translations.
+ - Updated configuration examples and documentation (helps #55).
+ - Updated the size of the function list dropdown on Windows (helps #89).
+ - Typos fixes, small changes in French translation (Roland Yonaba).
+
+### Incompatibilities
+ - Gideros debugging is changed to start immediately; use `debugger.runonstart = false` to disable.
+ - Removed mosync support from the debugger into a separate module.
+ - Added mixed end-of-line reporting; use `editor.checkeol = false` to disable.
+ - Added reporting of malformed UTF-8.
+
+### Fixes
+ - Fixed a rare crash on OSX when closing IDE with an application running under debugger.
+ - Fixed path handling for metalua to avoid conflicts with other modules that may include lexer.lua file.
+ - Fixed executing commands in the Remote console immediately after `mobdebug.start()` (closes #100).
+ - Fixed invalid escape sequence that fails under LuaJIT.
+ - Fixed an issue with spec files when a separator (sep) is not specified.
+
+## v0.34 (Dec 12 2012)
+
+### Highlights
+ - Added **internationalization** support (with Russian, Italian, Spanish, and French translations).
+ - Added **key binding** configuration for menu and toolbar items.
+ - Added **Corona SDK integration** with debugging and auto-complete.
+ - Added **Moai scratchpad support**.
+ - Added **color scheme support** with several schemes included.
+ - Added **GSL-shell support**.
+ - Added ability to pause and resume scratchpad.
+
+### Special thanks
+ - To Srdjan Markovic for Corona auto-complete support and Zenburn color scheme.
+ - To Roland Yonaba for French translation.
+ - To Leo Bartoloni for Italian translation.
+ - To Inigo Sola for Spanish translation.
+ - To toiffel for Russian translation and several patches.
+ - To Fringale for spec and API files cleanup and update for Lua 5.2.
+ - To Marcel van Herk for assistance with scratchpad break/resume functionality.
+
+### Improvements
+ - Added an option to specify the width of the calltip.
+ - Added showing short descriptions in tooltip for functions without lib/package.
+ - Added 'Project Directory' menu.
+ - Added ability to pause scratchpad when the script is completed (closes #83).
+ - Added ability to pause and resume scratchpad.
+ - Added GSL-shell support (closes #72).
+ - Added more color schemes (Solarized and Monokai).
+ - Added customized yield function for debugging (MobDebug v0.508; closes #81).
+ - Added proper hiding of current line marker during debugging (except when tracing).
+ - Added Corona auto-complete support (thanks to Srdjan Markovic).
+ - Added logic to show application windows without explicitly listing their class (closes #80); Windows only.
+ - Added Moai scratchpad support.
+ - Added missing constants to Moai API.
+ - Added setting focus on the window when a file is loaded in the existing instance.
+ - Added two more wxwindow window classes to the list of windows to show (Windows).
+ - Added scheme picker script to test color schemes from the IDE.
+ - Added Zenburn as a color scheme.
+ - Added styling for markers and Output/Console windows.
+ - Added Italian translation (thanks to Leo Bartoloni).
+ - Added Spanish translation (thanks to Inigo Sola).
+ - Added reporting of run-time errors from remote processes (helps #73).
+ - Added 'tomorrow' color theme.
+ - Added redirect of remote 'print' commands for Gideros applications.
+ - Added check for 'main.lua' in Corona projects.
+ - Added ability to suspend a running application even when there is no editor tab or file to activate.
+ - Added serialization of remote 'print' results and an output filter for debugging (helps #73).
+ - Added redirect of remote 'print' commands to the Output window in the IDE (helps #73).
+ - Added Corona SDK support (closes #73).
+ - Added French translation (thanks to Roland Yonaba).
+ - Added (more) verbose output to debugger to assist in troubleshooting.
+ - Added handling of LUA_DEV to make loading Lua for Windows libraries working out of the box (fixes #71).
+ - Added internationalization support (closes #70).
+ - Added notes about estrela being gone and compatibility.
+ - Added multi-tab support for scratchpad.
+ - Added documentation on accelerator/shortcut syntax.
+ - Added key map to change key binding for menu and toolbar items from a config file (closes #64).
+ - Added hiding IDE while closing and saving configuration.
+ - Completed reorganization of front-end processing (closes #67 and #5).
+ - Disabled editor autoactivation during debugging when tracing is on.
+ - Disabled functions that are not available under Corona on OSX (helps #73).
+ - Disabled showing auto-complete when the only option is already typed.
+ - Disabled showing a calltip on mouse over when it's already active.
+ - Extended list of default folders for interpreters where executables are searched for.
+ - Finished Russian translation.
+ - Limited auto-showing windows to Lua interpreter only (related to #80).
+ - Removed window types from config as they are no longer needed to be listed.
+ - Switched to showing short tooltips by default as some of the updated Lua API descriptions are very long.
+ - Updated descriptions for io.* functions; moved file:* functions to a pseudo library (f); helps #84.
+ - Updated LICENSE to add remdebug license information.
+ - Updated tooltip to show shortened descriptions on mouse-over.
+ - Updated spec and API files for Lua 5.2 (thanks to Fringale).
+ - Updated MobDebug to v0.507 to fix serialization issues (closes #77).
+ - Updated style processing to support styling of markup and allow dynamic switching of color schemes.
+ - Updated Lua keyword definitions to improve grouping for styling (closes #79).
+ - Updated love2d api to an updated version as of 11/1/2012 (fixes #78).
+
+### Incompatibilities
+ - The default port in the debugger has been changed from 8171 to 8172 to avoid conflicts with existing RemDebug implementations.
+
+### Fixes
+ - Fixed an issue with overlapping auto-complete suggestions.
+ - Fixed auto-complete not working after closed brackets.
+ - Fixed tooltip being shown when mouse moving outside of the editor area.
+ - Fixed a font zooming bug with Ctrl+MouseWheel.
+ - Fixed file marking in the project tree after opening a new file.
+ - Fixed an issue with breakpoints not available after aborting tracing on Linux/OSX.
+ - Fixed an issue with running scratchpad when entry points are configured.
+ - Fixed Linux launcher to pass filename parameter to the IDE.
+ - Fixed fold style to properly set background color.
+ - Fixed an issue with a config file being loaded into the editor when specified in the command line.
+ - Fixed an issue with markdown formatting not working after setting styles from a config file (fixes #74).
+
+## v0.33 (Oct 22 2012)
+
+### Highlights
+ - Added **Linux support**.
+ - Added **Moai auto-complete**.
+ - Added **Gideros debugging, auto-complete, and live coding**.
+ - Added **syntax aware indentation**.
+ - Added **re/storing open files and interpreter** when switching project folders.
+
+### Special thanks
+ - To Andy Bower and Atilim Cetin for their assistance with Gideros integration and live coding.
+ - To toiffel for Linux/OSX/Windows CMake-based launcher build.
+ - To [Christoph Kubisch](https://github.com/CrazyButcher) for help with Estrela merge.
+
+### Improvements
+ - Added configuration option to specify hostname when the default one is not reachable (fixes #68).
+ - Added search for Moai and Love2d executables in default locations on OSX and Windows.
+ - Added handling of command line parameters on OSX and Linux; updated documentation.
+ - Added auto-recovery to save/restore editor content (fixes #23).
+ - Added syntax aware indentation.
+ - Added re/storing open files and interpreter when switching project folders.
+ - Added auto-activation of files requested during debugging.
+ - Added editor.autoactivate parameter (false by default) to enable activation.
+ - Added zbstudio.sh script to run on OSX/Linux; updated permissions (closes #15).
+ - Added variable ratio for sliders in scratchpad.
+ - Added Linux/OSX/Windows CMake-based launcher build (thanks to toiffel).
+ - Added configuration parameter for the number of characters typed before displaying auto-complete suggestions for dynamic words.
+ - Added proper closing of the application after Shutdown/Logoff events (fixes #57).
+ - Added Moai auto-complete (closes #52).
+ - Added hiding auto-complete suggestions on losing focus in the editor.
+ - Added proper reporting of errors in the stack window.
+ - Added wxlua.deb file and install script that pull and build all required dependencies on Linux (covers most of #15).
+ - Added osx executables and build files.
+ - Added disabling full screen mode when the last editor tab is closed.
+ - Added proper reporting of errors in config files.
+ - Added toggling folders in project pane by single click (fixes #41).
+ - Added examples for configuring tabs and moai entry points.
+ - Added reporting compilation success rate (fixes #39)
+ - Added shortcuts for adding and removing watches.
+ - Added highlighting rows with updated values in the Watch window.
+ - Added 'Add Watch Expression' and 'Evaluate in Console' context menu items in the editor.
+ - Added handling of canceling editing in adding a watch.
+ - Added Gideros auto-complete and live coding support (closes #62).
+ - Added Gideros integration on OSX; added search for gideros in default locations on Windows and OSX.
+ - Added Gideros integration and debugging support.
+ - Added debugging-related buttons to the toolbar.
+ - Improved reporting of compilation and run-time errors when running as scratchpad.
+ - Made debugger strict.lua and LuaJIT friendly (upgraded to MobDebug v0.502).
+ - Updated configuration example to avoid using ide.spec that is not available (fixes #67).
+ - Updated CMake build script to handle wildcards in the MANIFEST.
+ - Updated configuring toolbar size to improve Linux compatibility.
+ - Updated MobDebug to v0.497 to fix issues and improve performance.
+ - Updated a warning message about single instance communication.
+ - Updated cpath processing to allow Linux version to run side-by-side with Windows and Mac.
+ - Updated licensing information.
+ - Enabled scratchpad support in the debugger when interpreter is capable of providing it.
+ - Disabled auto-complete in comments and strings.
+ - Disabled toggling breakpoints while debugger is running (as they wouldn't be changed anyway).
+ - Disabled 'not activated file for debugging' message when auto-activation is disabled.
+ - Disabled tooltip when scratchpad is on (fixes #51).
+ - Disabled showing calltip when the editor is not in focus.
+ - Disabled showing calltip over markup in comments.
+ - Disabled 'Run as Scratchpad' in the menu for those intepreters that don't support scratchpad.
+ - Updated configuration examples to add editor settings and fix user.lua path.
+ - Moved all Estrela features into a separate bundle that can be loaded using cfg/estrela.lua config.
+ - Removed multiple file types offered in Save As dialog.
+
+### Incompatibilities
+ - Changed searching for user config in '$HOME/.zbstudio' from '$HOME/.zbs'.
+ - Temporarily removed the ability to modify spec-related configuration parameters from configuration files.
+
+### Fixes
+ - Fixed opening a non-existing file from the Recent Files list.
+ - Fixed Find/Replace dialog checkboxes that didn't react to clicks on OSX (fixes #63).
+ - Fixed an auto-complete issue with mixed case dynamic words (fixes #60).
+ - Fixed 'Trying to solve a NULL hostname' warning message.
+ - Fixed a typo that prevented a corner case in autocomplete from working.
+ - Fixed inconsistent error messages about various config files.
+ - Fixed an issue with auto-complete when dot or colon is used (fixes #56).
+ - Fixed an issue with debugging scripts started using absolute file path.
+ - Fixed setting working directory for interpreters to the file path when the project directory is not set.
+ - Fixed an issue with Backspace not closing auto-complete suggestions.
+ - Fixed enabling items in the Edit menu (fixes #56).
+ - Fixed function list in the toolbar on Mac (helps #14).
+ - Fixed deleting of comment blocks with hidden markup (fixes #40).
+ - Fixed an issue with function list when all editor tabs are closed.
+ - Fixed multiple calltips shown on Linux (helps #15).
+ - Fixed an issue with mouse cursor in scratchpad not properly updated on Linux (fixes #49; helps #15).
+ - Fixed an issue with static analyzer that failes on function names like a.b.c (fixes #50).
+ - Fixed disabling Paste menu on Linux when needed (fixes #46; helps #15).
+ - Fixed an issue with context menu on Linux (fixes #47; helps #15).
+ - Fixed debugger failure when debugging is initiated externally and there is an unsaved file in one of editor tabs.
+ - Fixed stopping the debugger when an editor tab where debugging happens is closed.
+ - Fixed enabling of several menu items with no editor tab (fixes #42).
+ - Fixed an issue with loading stock icons on Linux.
+ - Fixed Cut/Copy menu items to reflect proper status in the editor.
+ - Fixed typo in the static analyzer output.
+ - Resolved conflict between lua executable names on Windows and Mac.
+
+## v0.32 (Sep 03 2012)
+
+### Highlights
+ - Added **Unicode support** for file encoding and file paths on Windows (fixes #30).
+ - Added **Moai integration and debugging** (including debugging of Moai threads and callbacks).
+ - Added refresh of Stack and Watch windows after executing a statement in remote shell.
+ - Added **display of complex values** on multiple lines in shell with '='.
+ - Added calltip on mouseover for functions during editing and for variables/expressions during debugging.
+ - Added configuration options to set paths to lua and love2d executables.
+ - Added support for **coroutine debugging** with stepping through coroutine.resume/.yield calls.
+ - Updated wx.dll to wxlua 2.8.12.2 and wxwidgets 2.8.12.
+ - Signed zbstudio app and executable to avoid issues with files not being saved without admin privileges and to remove warning about 'unknown publisher' on windows (fixes #25).
+
+### Improvements
+ - Added calltip on mouseover for functions during editing and for variables/expressions during debugging.
+ - Added an IO filter to fix an issue with 0d0d0a line endings on Windows.
+ - Added support for debugging moai callbacks (upgraded to mobdebug v0.489).
+ - Added refresh of Stack and Watch windows to show updated values after executing a statement in remote shell.
+ - Added display of complex values on multiple lines in shell with '='.
+ - Added rockspec to the list of extensions for lua (fixes #37).
+ - Added a check to avoid evaluating keywords in tooltip.
+ - Added current interpreter to the status bar; adding closing debugger when the interpreter is changed.
+ - Added aborting scratchpad processing when an interpreter can't start or report a fatal error.
+ - Added support for unicode path files on Windows (fixes #30).
+ - Added an option to set path to lua executable.
+ - Added error handler to trap and display debugger errors.
+ - Added search in PATH for love2d executable.
+ - Added a workaround for GetExecutablePath() reporting 'wx.dll' instead of a proper exe name with wxlua 2.8.12.2 on Windows.
+ - Added reporting of function name of the form a.b and a:b in static analysis (fixes #27).
+ - Added ability for user to keep their settings file in their home directory.
+ - Added per user settings file. Users can now move their settings file to ~/.zbs/user.lua.
+ - Added ignoring Cmd-key combinations on Mac as this should be handled by wxwidgets, but is not (fixes #19).
+ - Added support for coroutine debugging with stepping through coroutine.resume/.yield calls.
+ - Changed reporting of program execution time from CPU time to user time.
+ - Changed the call to unhide windows to the async version (ShowWindowAsync) to avoid blocking the IDE when the application doesn't respond.
+ - Upgraded to wxlua 2.8.12.2 (wxwidgets 2.8.12; unicode version); added lua51.dll proxy (fixes #10 and #7).
+ - Updated love2d interpreter to use the project folder to check for main.lua.
+ - Updated test module to use stringified values for comparison.
+ - Updated status bar style to make it consistent across platforms.
+ - Removed .bak files from being replaced in when backup copies are saved.
+ - Removed explicit path conversions and comparisons.
+ - Refactored LUA_PATH/CPATH processing to set it for all interpreters.
+ - Signed zbstudio app and executable to avoid issues with files not being saved without admin privileges and to remove warning about 'unknown publisher' on windows (fixes #25).
+
+### Incompatibilities
+ - Reassigned hotkeys in the Project menu to minimize conflicts on Mac (reassigned Shift-F12 and F11).
+
+### Fixes
+ - Fixed an issue with double click on analylsis results being out-of-sync when the editor switched to another file (fixes #38)
+ - Fixed an issue with debugger not activating files with relative path information.
+ - Fixed 'break' command to work after coming from debugger calls (like on()).
+ - Fixed an issue with highlighting selected item in the project tree.
+ - Fixed evaluation of foo:bar in tooltip (now evaluates as foo.bar).
+ - Fixed debugger termination after internal errors.
+ - Fixed activating current file in the project tree on Mac (closes #29).
+ - Fixed running scripts with single quotes in path names.
+ - Fixed an issue with Run/Debug commands when IDE path includes exclamation mark ('!').
+ - Fixed an issue with the app not starting on those systems that don't have HOME environment variable; fixes #28.
+ - Fixed an issue with showing/hiding GUI windows that was occasionally causing a runtime error when the window disappears before it is manipulated.
+ - Fixed returning proper name for unsaved files in reporting compilation and static analysis results; moved default names to ide.config (fixes #26).
+ - Fixed pasting text into the Find dialog and project path box on Mac (fixes #22).
+ - Fixed handling of dashes in paths (upgraded to mobdebug 0.479).
+ - Reorganized handling of automcomplete event (to use AddPendingEvent instead of PostEvent) to avoid runtime application error.
+
+## v0.31 (Jul 14 2012)
+
+### Highlights
+ - Added **scratchpad support for love2d**.
+ - Added tooltip to display variable/expression values during debugging.
+ - Added **MacOS support**.
+
+### Improvements
+ - Added handling of balanced brackets in markup links.
+ - Added unit test module.
+ - Added reporting the number of traced lines during debugging.
+ - Added setting of PATH and CPATH to find proper libs on windows and mac os platforms.
+ - Added scratchpad support for love2d.
+ - Added reset of 'modified' status to keep tab names and their config settings correct upon exit.
+ - Added window title update and filetree refresh after SaveAs command.
+ - Added tooltip to display variable/expression values during debugging.
+ - Made 'View Stack Window' and 'View Watch Window' refresh window content if it's already shown.
+ - Removed setting the editor font in the config as the default font is different on different platforms.
+ - Removed extension from the template to match folders to make it more portable.
+ - Reorganized handling of font configuration and added font config for filetree (with a different size default on MacOS).
+ - Updated matching logic for function definitions to allow for a.b.c() definitions (fixes #17).
+
+### Fixes
+ - Fixed markup styling and file tree drawing on MacOS.
+ - Fixed detecting executable name in commands with spaces.
+ - Fixed incorrect folders reported in the file tree when no project directory is set and a file is open.
+ - Fixed incorrect filename reported in compile errors when the file is not saved.
+ - Fixed refresh of filetree on MacOS to get it displayed correctly when the app is started.
+ - Fixed an error thrown when a window with debugging is closed before the application being debugged is terminated.
+ - Fixed incorrect storing of settings for editor tabs with the same text (filename). This was causing only one tab displayed for multiple StyledText controls with interesting effects.
+ - Fixed an issue with launching a process when its output is not redirected to the IDE (fixes #16).
+ - Fixed console to evaluate 'function a() ... end' without errors.
+ - Fixed a compilation error caused by shebang in scripts.
+ - Fixed an issue with love2d path with spaces.
+ - Corrected resetting of project directory when it's already set and doesn't need to be changed.
+ - Added checks around ShowFullScreen() calls to avoid failures on those systems that don't provide it (linux/GTK).
+ - Added check for debugger calls to avoid errors when debugger is not loaded.
+ - Updated matching of links to make them less greedy (to avoid capturing link terminators).
+ - Upgraded deprecated constants and logic for compatibility with wxwidgets 2.9.x.
+ - Reset project directory if the current one doesn't exist.
+ - Removed styling of function calls and capturing definitions in strings and comments (fixed #18).
+ - Removed setting focus to the Output window when output is processed as it interfered with Run as Scratchpad.
+
+## v0.30 (Jun 27 2012)
+
+### Highlights
+ - Added **love2d support**.
+ - Added auto complete for love2d API.
+ - Added support for debugging processes running under LuaJIT.
+ - Added display of **hierarchical data in Stack window**.
+ - Added **pretty printing in Watch and Console** (local and remote) windows and handling of multiple results in Console.
+ - Added **Stack window to display stack information** and local/upvalue values for each stack frame.
+ - Added ability to **interact with scripts** by allowing text to be entered in the 'Output' window.
+
+### Improvements
+ - Added love2d support.
+ - Added auto complete for love2d API.
+ - Added support for debugging processes running under LuaJIT.
+ - Added display of hierarchical data in Stack window.
+ - Added execution time and updated messages in the Output window to be more consistent.
+ - Added displaying 'nil' values in local console when no result is returned by an expression.
+ - Added a check to refuse starting a new debugging session if there is one in progress already.
+ - Added handling of tail calls in the Stack window.
+ - Added pretty printing in Watch and Console (local and remote) windows and handling of multiple results in Console.
+ - Added Stack window to display stack information and local/upvalue values for each stack frame.
+ - Added ability to set font encoding in the config.
+ - Added restoring cursor position when a modified file is reloaded in the editor.
+ - Added ability to interact with scripts by allowing text to be entered in the 'Output' window.
+ - Improved logic in love2d integration to distinguish Debug and Run commands (closes #13).
+ - Improved reporting in static analysis for functions and global variables.
+ - Updated menus to avoid conflicts with MacOS shortcuts.
+ - Updated logic creating menubar to make it work correctly on MacOS with special Help/About items.
+ - Updated path handling to better detect how the app is started and to avoid loading dlls on non-windows platforms.
+ - Updated logic for detecting hostname (used in the debugger) to make sure it is resolvable.
+ - Changed order of lualibs/ and bin/ directories in package.path and package.cpath to load included modules first.
+ - Removed extensions from launch commands and updated display logic in the Output window.
+
+### Fixes
+ - Fixed aborting running/debugged programs on MacOS by adding MAKE_GROUP_LEADER option to wxExecute.
+ - Fixed an issue in the logic for setting breakpoints, which ignored breakpoints in luxinia2 debug sessions.
+ - Fixed logic in the local/remote console that returned incorrect error message on executing code like '%s':format(1).
+ - Fixed IDs for Project menu items to allow them to be removed from the menu if needed.
+ - Fixed an issue with remote application not terminating when IDE is closed while debugging is in progress.
+ - Fixed refreshing a modified file when the editor is set to read-only mode.
+ - Fixed saving/restoring configuration of 'Output'/'Console' tabs when IDE is closed while debugging is in progress.
+ - Fixed removing variable name in Watch window after escaping editing.
+ - Fixed #9 as it had incorrect logic in one of UTF filters.
+ - Fixed edit menu shortcuts to work in the 'Output' window (when allowed).
+ - Fixed reporting of processes that failed to start after 'Run' or 'Debug' commands.
+ - Fixed executable path matching to work on systems that don't have file extensions.
+ - Fixed #3 'unused parameter...' check not to fail on anonymous functions that are part of an expression.
+ - Moved processing of `user.lua` to a later phase after tools and specs are already loaded to allow modification of IDE configuration from `user.lua`. Closes #5.
+ - Added checks to prevent text modification in 'Output' and 'Console' windows. Fixes #8.
+ - Disabled 'Run as Scratchpad' if there is no debugger registered capable of running it.
+ - Disabled Stack and Watch updates when scratchpad is active as they interfere with application execution.
+
+## v0.29 (May 31 2012)
+
+### Highlights
+ - Added **scratchpad** (running live) functionality.
+ - Added **code analyzer** based on lua-inspect.
+ - Updated **comment styling** to follow markdown syntax.
+
+### Improvements
+ - Added scratchpad (running live) functionality.
+ - Added code analyzer based on lua-inspect.
+ - Added Ctrl(-Shift)-TAB navigation between tabs in the editor.
+ - Added navigation between editor tabs using Ctrl-PgUp and Ctrl-PgDn.
+ - Added reporting of assignment to global variables in the code analyzer.
+ - Added ability to turn external processes that connect to debugger into a scratchpad.
+ - Added exit from full screen mode using ESC key.
+ - Added reporting of compilation errors during debugging sessions.
+ - Added handling of more errors in the shell to allow calculations like '(1+2)' to be executed correctly.
+ - Added moving focus back to the notebook after unhiding/activating a wx window.
+ - Added missing mime/code.dll and reorganized socket module files (socket.*) to load correctly with require.
+ - Added stopping the debugger when a debugged program exits.
+ - Added to static analysis reporting of unused parameters in functions.
+ - Disabled warning in static analysis about unused 'self' in methods.
+ - Removed 'error during pre-compilation' message from compile errors.
+ - Updated comment styling to follow markdown syntax.
+
+### Fixes
+ - Fixed handling of scripts with comments in the remote shell.
+ - Fixed an issue with Analyze process when the analyzed script has compilation errors.
+ - Fixed an issue with scratchpad being on after Save dialog is canceled.
+ - Fixed about screen.
+
+## v0.28 (Mar 21 2012)
+
+### Highlights
+ - Added full screen mode.
+
+### Improvements
+ - Added option to activate output/console when Run/Debug/Compile commands are executed.
+ - Added full screen mode.
+ - Added killing a running process on IDE exit.
+ - Added killing a running process with Shift-F12.
+ - Disabled buffering of the output for scripts run from IDE.
+
+### Fixes
+ - Fixed 'Trace' command to continue working when a debugged file is not activated.
+ - Fixed an issue with saving a file when no project directory is set.
+ - Fixed missing semicolon in lualibs path; added path for debugger to search under lualibs.
+ - Fixed an issue with a missing path separator, which prevented debugging from executing step commands in some cases.
+ - Fixed missing slash on SaveAs by enforcing trailing slash for the project path.
+
+## v0.27 (Feb 14 2012)
+
+### Highlights
+ - Added markup formatting in the comments.
+
+### Improvements
+ - Added markup formatting in the comments.
+ - Added Debug and Run methods to simulate menu commands.
+ - Added setting a project folder on initial start.
+ - Added style processing for font name, font size, visibility and hotspot attributes.
+ - Added setting the current project directory for the shell to allow 'require' commands to work with local modules.
+ - Updated markup processing with run and debug commands, http link processing, and opening local files in a new window.
+ - Enforced visibility for shell prompt.
+
+### Fixes
+ - Fixed activation of a correct tab when one of the editor tabs is closed.
+ - Fixed an issue with file activation from a debugger.
+ - Fixed the issue of ClosePage method being called with two different parameters.
+ - Fixed the issue of the project dir being returned with two trailing slashes.
+ - Fixed an issue with activating the currenly edited file in the file tree.
+ - Wrapped DragAcceptFiles into a protected call to make it not fail on MacOS (compiled with wxwidgets 2.8.12).
+
+## v0.26 (Jan 18 2012)
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/LICENSE b/love2dToAPK/tools/tools/zbstudio-old-win/LICENSE
new file mode 100644
index 0000000..d05f7d2
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/LICENSE
@@ -0,0 +1,237 @@
+--[[ ZeroBrane Studio License ]]-------------------------------------------
+
+ZeroBrane Studio sources are released under the MIT License
+
+Copyright (c) 2011-2015 Paul Kulchenko (paul@kulchenko.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+--[[ Estrela Editor License ]]---------------------------------------------
+
+Estrela Editor sources are released under the MIT License
+
+Copyright (c) 2008-2012
+ Luxinia DevTeam:
+ Christoph Kubisch & Eike Decker
+ info at luxinia.de
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+--[[ wxLua License ]]------------------------------------------------------
+
+http://wxlua.sourceforge.net/
+
+Pre-Built binaries for wxLua/WxWindows
+
+Original wxLua Lua sample IDE:
+ Lomtick Software
+ J. Winwood & John Labenski
+ luascript at thersgb.net
+
+wxLua is based on
+wxWindows Library License, Version 3
+
+Copyright (c) 1998 Julian Smart, Robert Roebling et al
+
+Everyone is permitted to copy and distribute verbatim copies
+of this licence document, but changing it is not allowed.
+
+WXWINDOWS LIBRARY LICENCE
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+This library is free software; you can redistribute it and/or modify it
+under the terms of the GNU Library General Public Licence as published by
+the Free Software Foundation; either version 2 of the Licence, or (at
+your option) any later version.
+
+This library is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library
+General Public Licence for more details.
+
+You should have received a copy of the GNU Library General Public Licence
+along with this software, usually in a file named COPYING.LIB. If not,
+write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+Boston, MA 02111-1307 USA.
+
+EXCEPTION NOTICE
+
+1. As a special exception, the copyright holders of this library give
+permission for additional uses of the text contained in this release of
+the library as licenced under the wxWindows Library Licence, applying
+either version 3 of the Licence, or (at your option) any later version of
+the Licence as published by the copyright holders of version 3 of the
+Licence document.
+
+2. The exception is that you may use, copy, link, modify and distribute
+under the user's own terms, binary object code versions of works based
+on the Library.
+
+3. If you copy code from files distributed under the terms of the GNU
+General Public Licence or the GNU Library General Public Licence into a
+copy of this library, as this licence permits, the exception does not
+apply to the code that you add in this way. To avoid misleading anyone as
+to the status of such modified files, you must delete this exception
+notice from such code and/or adjust the licensing conditions notice
+accordingly.
+
+4. If you write modifications of your own for this library, it is your
+choice whether to permit this exception to apply to your modifications.
+If you do not wish that, you must delete the exception notice from such
+code and/or adjust the licensing conditions notice accordingly.
+
+--[[ Lua License ]]--------------------------------------------------------
+
+Copyright: © 1994-2006 Lua.org, PUC-Rio.
+Homepage: http://www.lua.org
+License: http://www.lua.org/copyright.html
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+--[[ LuaSockets License ]]-------------------------------------------------
+
+Copyright: © 2004-2006 Diego Nehab. All rights reserved.
+Homepage: http://www.cs.princeton.edu/~diego/professional/luasocket/
+License: http://www.lua.org/copyright.html (same as LUA)
+
+--[[ Serpent License ]]----------------------------------------------------
+
+Copyright (c) 2011-2013 Paul Kulchenko (paul@kulchenko.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+--[[ LuaJIT License ]]-----------------------------------------------------
+
+Copyright © 2005-2013 Mike Pall, released under the MIT open source license.
+
+--[[ WinAPI License ]]-----------------------------------------------------
+
+Copyright (C) 2011 Steve Donovan.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+--[[ MobDebug License ]]---------------------------------------------------
+
+MobDebug sources are released under the MIT License
+
+Copyright (c) 2011-2012 Paul Kulchenko (paul@kulchenko.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+--[[ RemDebug License ]]---------------------------------------------------
+
+Copyright (c) 2006 The Kepler Project.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/README.md b/love2dToAPK/tools/tools/zbstudio-old-win/README.md
new file mode 100644
index 0000000..4b40527
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/README.md
@@ -0,0 +1,113 @@
+# Project Description
+
+[ZeroBrane Studio](http://studio.zerobrane.com/) is a lightweight cross-platform Lua IDE with code completion,
+syntax highlighting, remote debugger, code analyzer, live coding,
+and debugging support for several Lua engines
+([Lua 5.1](http://studio.zerobrane.com/doc-lua-debugging),
+[Lua 5.2](http://studio.zerobrane.com/doc-lua52-debugging),
+[Lua 5.3](http://studio.zerobrane.com/doc-lua53-debugging),
+[LuaJIT](http://studio.zerobrane.com/doc-luajit-debugging),
+[LÖVE](http://notebook.kulchenko.com/zerobrane/love2d-debugging),
+[Moai](http://notebook.kulchenko.com/zerobrane/moai-debugging-with-zerobrane-studio),
+[Gideros](http://notebook.kulchenko.com/zerobrane/gideros-debugging-with-zerobrane-studio-ide),
+[Corona](http://notebook.kulchenko.com/zerobrane/debugging-and-live-coding-with-corona-sdk-applications-and-zerobrane-studio),
+[Marmalade Quick](http://notebook.kulchenko.com/zerobrane/marmalade-quick-debugging-with-zerobrane-studio),
+[Cocos2d-x](http://notebook.kulchenko.com/zerobrane/cocos2d-x-simulator-and-on-device-debugging-with-zerobrane-studio),
+[OpenResty/Nginx](http://notebook.kulchenko.com/zerobrane/debugging-openresty-nginx-lua-scripts-with-zerobrane-studio),
+[Torch7](http://notebook.kulchenko.com/zerobrane/torch-debugging-with-zerobrane-studio),
+[Redis](http://notebook.kulchenko.com/zerobrane/redis-lua-debugging-with-zerobrane-studio),
+[GSL-shell](http://notebook.kulchenko.com/zerobrane/gsl-shell-debugging-with-zerobrane-studio),
+[Adobe Lightroom](http://notebook.kulchenko.com/zerobrane/debugging-lightroom-plugins-zerobrane-studio-ide),
+[Lapis](http://notebook.kulchenko.com/zerobrane/lapis-debugging-with-zerobrane-studio),
+[Moonscript](http://notebook.kulchenko.com/zerobrane/moonscript-debugging-with-zerobrane-studio),
+and others). It originated from the [Estrela Editor](http://www.luxinia.de/index.php/Estrela/).
+
+![ZeroBrane Studio debugger screenshot](http://studio.zerobrane.com/images/debugging.png)
+
+## Features
+
+* Written in Lua, so easily customizable.
+* Small, portable, and cross-platform (Windows, Mac OSX, and Linux).
+* Auto-completion for functions, keywords, and custom APIs.
+* Interactive console to directly test code snippets with local and remote execution.
+* Integrated debugger with local and [remote debugging](http://studio.zerobrane.com/doc-remote-debugging)
+for [Lua 5.1](http://studio.zerobrane.com/doc-lua-debugging),
+[Lua 5.2](http://studio.zerobrane.com/doc-lua52-debugging),
+[Lua 5.3](http://studio.zerobrane.com/doc-lua53-debugging),
+[LuaJIT](http://studio.zerobrane.com/doc-luajit-debugging),
+and [other Lua engines](http://studio.zerobrane.com/documentation#debugging).
+* [Live coding](http://studio.zerobrane.com/documentation#live_coding)
+with [Lua](http://notebook.kulchenko.com/zerobrane/live-coding-in-lua-bret-victor-style),
+[LÖVE](http://notebook.kulchenko.com/zerobrane/live-coding-with-love),
+[Gideros](http://notebook.kulchenko.com/zerobrane/gideros-live-coding-with-zerobrane-studio-ide),
+[Moai](http://notebook.kulchenko.com/zerobrane/live-coding-with-moai-and-zerobrane-studio),
+[Corona SDK](http://notebook.kulchenko.com/zerobrane/debugging-and-live-coding-with-corona-sdk-applications-and-zerobrane-studio),
+GSL-shell, and other engines.
+* Function outline.
+* Fuzzy search with `Go To File`, project-wide `Go To Symbol`, and `Insert Library Function`.
+* Several ways to extend the current functionality:
+ - specs (`spec/`): specifications for file syntax, lexer, and keywords;
+ - apis (`api/`): descriptions for [code completion and tooltips](http://studio.zerobrane.com/doc-api-auto-complete);
+ - interpreters (`interpreters/`): components for setting debugging and run-time project environment;
+ - packages (`packages/`): [plugins](http://studio.zerobrane.com/doc-plugin) that provide additional functionality;
+ - config (`cfg/`): settings for styles, color themes, and other preferences;
+ - translations (`cfg/i18n/`): [translations](http://studio.zerobrane.com/doc-translation) of the menus and messages to other languages;
+ - tools (`tools/`): additional tools.
+
+## Documentation
+
+* A [short and simple overview](http://studio.zerobrane.com/doc-getting-started) for those who are new to this development environment.
+* A list of [frequently asked questions](http://studio.zerobrane.com/doc-faq) about the IDE.
+* [Tutorials and demos](http://studio.zerobrane.com/tutorials) that cover debugging and live coding for different environments.
+* [Tips and tricks](http://studio.zerobrane.com/doc-tips-and-tricks).
+
+## Installation
+
+ZeroBrane Studio can be installed into and run from any folder.
+No compilation is needed, although the scripts to compile required libraries for Windows, OSX, and Linux platforms are available in the `build/` folder.
+
+## Usage
+
+```
+Open file(s):
+ zbstudio [option] [<project directory>] <filename> [<filename>...]
+ non-options are treated as a project directory to set or a file to open
+
+Set project directory:
+ zbstudio <project directory> [<filename>...]
+ (0.39+) a directory passed as a parameter will be set as the project directory
+
+Override default configuration:
+ zbstudio -cfg "<luacode overriding config>" [<filename>]
+ e.g.: zbstudio -cfg "editor.fontsize=12" somefile.lua
+
+Load custom configuration:
+ zbstudio -cfg path/file.lua [<filename>]
+ e.g.: zbstudio -cfg cfg/estrela.lua
+```
+
+If you are loading a file, you can also request the cursor to be set on a particular line or at a particular position by using `filename:<line>` and `filename:p<pos>` syntax (0.71+).
+
+## Contributing
+
+See [CONTRIBUTING](CONTRIBUTING.md).
+
+## Author
+
+### ZeroBrane Studio and MobDebug
+
+ **ZeroBrane LLC:** Paul Kulchenko (paul@kulchenko.com)
+
+### Estrela Editor
+
+ **Luxinia Dev:** Christoph Kubisch (crazybutcher@luxinia.de)
+
+## Where is Estrela?
+
+The Estrela project has been merged into ZeroBrane Studio. If you have used Estrela
+for graphics shader authoring or luxinia, create/modify the `cfg/user.lua` and
+add `include "estrela"` (1.21+) to load all tools and specifications by default again.
+
+## License
+
+See [LICENSE](LICENSE).
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/api/cg/stdlib.lua b/love2dToAPK/tools/tools/zbstudio-old-win/api/cg/stdlib.lua
new file mode 100644
index 0000000..ac20661
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/api/cg/stdlib.lua
@@ -0,0 +1,205 @@
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local function fn (description)
+ local description2,returns,args = description:match("(.+)%-%s*(%b())%s*(%b())")
+ if not description2 then
+ return {type="function",description=description,
+ returns="(?)"}
+ end
+ return {type="function",description=description2,
+ returns=returns:gsub("^%s+",""):gsub("%s+$",""), args = args}
+end
+
+local function val (description)
+ return {type="value",description = description}
+end
+-- docs
+local api = {
+abs = fn "returns absolute value of scalars and vectors. - (typeN)(typeN)",
+acos = fn "returns arccosine of scalars and vectors. - (typeN)(typeN)",
+all = fn "returns true if a boolean scalar or all components of a boolean vector are true. - (bool)(boolN)",
+any = fn "returns true if a boolean scalar or any component of a boolean vector is true. - (bool)(boolN)",
+asin = fn "returns arcsine of scalars and vectors. - (typeN)(typeN)",
+atan = fn "returns arctangent of scalars and vectors. - (typeN)(typeN)",
+atan2 = fn "returns the arctangent of y/x. atan2 is well defined for every point other than the origin, even if x equals 0 and y does not equal 0. - (typeN)(typeN y, typeN x)",
+ceil = fn "returns smallest integer not less than a scalar or each vector component. - (typeN)(typeN)",
+clamp = fn "returns x clamped to the range [a,b]. - (typeN)(typeN x, a, b)",
+clip = fn "conditionally (<0) kill a pixel before output. - ()(typeN)",
+cos = fn "returns cosine of scalars and vectors. - (typeN)(typeN)",
+cosh = fn "returns hyperbolic cosine of scalars and vectors. - (typeN)(typeN)",
+cross = fn "returns the cross product of two three-component vectors. - (type3)(type3 a, b)",
+ddx = fn "returns approximate partial derivative with respect to window-space X. - (typeN)(typeN)",
+ddy = fn "returns approximate partial derivative with respect to window-space Y. - (typeN)(typeN)",
+degrees = fn "converts values of scalars and vectors from radians to degrees. - (typeN)(typeN)",
+determinant = fn "returns the scalar determinant of a square matrix. - (float)(floatNxN)",
+distance = fn "return the Euclidean distance between two points. - (typeN)(typeN a, b)",
+dot = fn "returns the scalar dot product of two vectors. - (type)(typeN a, b)",
+exp = fn "returns the base-e exponential of scalars and vectors. - (typeN)(typeN)",
+exp2 = fn "returns the base-2 exponential of scalars and vectors. - (typeN)(typeN)",
+faceforward = fn "returns a normal as-is if a vertex's eye-space position vector points in the opposite direction of a geometric normal, otherwise return the negated version of the normal. - (typeN)(typeN Nperturbated, Incident, Ngeometric)",
+floatToIntBits = fn "returns the 32-bit integer representation of an IEEE 754 floating-point scalar or vector - (intN)(floatN)",
+floatToRawIntBits = fn "returns the raw 32-bit integer representation of an IEEE 754 floating-point scalar or vector. - (intN)(floatN)",
+floor = fn "returns largest integer not greater than a scalar or each vector component. - (typeN)(typeN)",
+fmod = fn "returns the remainder of x/y with the same sign as x. - (typeN)(typeN x, y)",
+frac = fn "returns the fractional portion of a scalar or each vector component. - (typeN)(typeN)",
+frexp = fn "splits scalars and vectors into normalized fraction and a power of 2. - (typeN)(typeN x, out typeN e)",
+fwidth = fn "returns sum of approximate window-space partial derivatives magnitudes. - (typeN)(typeN)",
+intBitsToFloat = fn "returns the float value corresponding to a given bit represention.of a scalar int value or vector of int values. - (floatN)(intN)",
+isfinite = fn "test whether or not a scalar or each vector component is a finite value. - (boolN)(typeN)",
+isinf = fn "test whether or not a scalar or each vector component is infinite. - (boolN)(typeN)",
+isnan = fn "test whether or not a scalar or each vector component is not-a-number. - (boolN)(typeN)",
+ldexp = fn "returns x times 2 rained to n. - (typeN)(typeN a, n)",
+length = fn "return scalar Euclidean length of a vector. - (type)(typeN)",
+lerp = fn "lerp - returns linear interpolation of two scalars or vectors based on a weight. - (typeN)(typeN a, b, weight)",
+lit = fn "computes lighting coefficients for ambient(x), diffuse(y), and specular(z) lighting contributions (w=1). - (type4)(type NdotL, NdotH, specshiny)",
+log = fn "returns the natural logarithm of scalars and vectors. - (typeN)(typeN)",
+log10 = fn "returns the base-10 logarithm of scalars and vectors. - (typeN)(typeN)",
+log2 = fn "returns the base-2 logarithm of scalars and vectors. - (typeN)(typeN)",
+max = fn "returns the maximum of two scalars or each respective component of two vectors. - (typeN)(typeN a, b)",
+min = fn "returns the minimum of two scalars or each respective component of two vectors. - (typeN)(typeN a, b)",
+mul = fn "Returns the vector result of multiplying a matrix M by a column vector v; a row vector v by a matrix M; or a matrix A by a second matrix B. - (typeN)(typeNxN/typeN a, typeN/typeNxN b)",
+normalize = fn "Returns the normalized version of a vector, meaning a vector in the same direction as the original vector but with a Euclidean length of one. - (typeN)(typeN)",
+pow = fn "returns x to the y-th power of scalars and vectors. - (typeN)(typeN x, y)",
+radians = fn "converts values of scalars and vectors from degrees to radians. - (typeN)(typeN)",
+reflect = fn "returns the reflectiton vector given an incidence vector and a normal vector. - (typeN)(typeN incidence, normal)",
+refract = fn "computes a refraction vector. - (typeN)(typeN incidence, normal, type eta)",
+round = fn "returns the rounded value of scalars or vectors. - (typeN)(typeN a)",
+rsqrt = fn "returns reciprocal square root of scalars and vectors. 1/sqrt. - (typeN)(typeN)",
+saturate = fn "returns x saturated to the range [0,1]. - (typeN)(typeN)",
+sign = fn "returns sign (1 or -1) of scalar or each vector component. - (typeN)(typeN)",
+sin = fn "returns sine of scalars and vectors. - (typeN)(typeN)",
+sincos = fn "returns sine of scalars and vectors. - ()(typeN x, out typeN sin, out typeN cos)",
+sinh = fn "returns hyperbolic sine of scalars and vectors. - (typeN)(typeN)",
+sqrt = fn "returns square root of scalars and vectors. - (typeN)(typeN)",
+step = fn "implement a step function returning either zero or one (a <= b). - (typeN)(typeN a, b)",
+tan = fn "returns tangent of scalars and vectors. - (typeN)(typeN)",
+tanh = fn "returns hyperbolic tangent of scalars and vectors. - (typeN)(typeN)",
+transpose = fn "returns transpose matrix of a matrix. - (typeRxC)(typeCxR)",
+trunc = fn "returns largest integer not greater than a scalar or each vector component. - (typeN)(typeN)",
+
+tex1D = fn "performs a texture lookup in a given 1D sampler and, in some cases, a shadow comparison (as .y coord). May also use pre computed derivatives if those are provided. Texeloffset only in gp4 or higher profiles. - (float4)(sampler1D, float/float2 s, |float dx, dy|,[int texeloffset])",
+tex1Dbias = fn "performs a texture lookup with bias in a given sampler (as .w). - (float4)(sampler1D, float4 s, [int texeloffset])",
+tex1Dcmpbias = fn "performs a texture lookup with bias and shadow compare in a given sampler (compare as .y, bias as .w). - (float4)(sampler1D, float4 s, [int texeloffset])",
+tex1Dcmplod = fn "performs a texture lookup with a specified level of detail and a shadow compare in a given sampler (compare as .y, lod as .w). - (float4)(sampler1D, float4 s, [int texeloffset])",
+tex1Dfetch = fn "performs an unfiltered texture lookup in a given sampler (lod as .w). - (float4)(sampler1D, int4 s, [int texeloffset])",
+tex1Dlod = fn "performs a texture lookup with a specified level of detail in a given sampler (lod as .w) - (float4)(sampler1D, float4 s, [int texeloffset])",
+tex1Dproj = fn "performs a texture lookup with projection in a given sampler. May perform a shadow comparison if argument for shadow comparison is provided. (shadow in .y for float3 coord, proj in .y or .z) - (float4)(sampler1D, float2/float3 s, [int texeloff])",
+tex1Dsize = fn "returns the size of a given texture image for a given level of detail. (only gp4 profiles) - (int3)(sampler1D, int lod)",
+
+tex2D = fn "performs a texture lookup in a given 2D sampler and, in some cases, a shadow comparison (as .z coord). May also use pre computed derivatives if those are provided. Texeloffset only in gp4 or higher profiles. - (float4)(sampler2D, float2/float3 s, |float2 dx, dy|,[int texeloffset])",
+tex2Dbias = fn "performs a texture lookup with bias in a given sampler (as .w). - (float4)(sampler2D, float4 s, [int texeloffset])",
+tex2Dcmpbias = fn "performs a texture lookup with bias and shadow compare in a given sampler (compare as .z, bias as .w). - (float4)(sampler2D, float4 s, [int texeloffset])",
+tex2Dcmplod = fn "performs a texture lookup with a specified level of detail and a shadow compare in a given sampler (compare as .y, lod as .w). - (float4)(sampler2D, float4 s, [int texeloffset])",
+tex2Dfetch = fn "performs an unfiltered texture lookup in a given sampler (lod as .w). - (float4)(sampler2D, int4 s, [int texeloffset])",
+tex2Dlod = fn "performs a texture lookup with a specified level of detail in a given sampler (lod as .w) - (float4)(sampler2D, float4 s, [int texeloffset])",
+tex2Dproj = fn "performs a texture lookup with projection in a given sampler. May perform a shadow comparison if argument for shadow comparison is provided. (shadow in .z for float3 coord, proj in .z or .w) - (float4)(sampler2D, float3/float4 s, [int texeloff])",
+tex2Dsize = fn "returns the size of a given texture image for a given level of detail. (only gp4 profiles) - (int3)(sampler2D, int lod)",
+tex2Dgather = fn "returns 4 texels of a given single channel texture image for a given level of detail. (only gp4 profiles) - (int3)(sampler2D, int lod)",
+
+tex3D = fn "performs a texture lookup in a given 3D sampler. May also use pre computed derivatives if those are provided. Texeloffset only in gp4 or higher profiles. - (float4)(sampler3D, float3 s, {float3 dx, dy},[int texeloffset])",
+tex3Dbias = fn "performs a texture lookup with bias in a given sampler (as .w). - (float4)(sampler3D, float4 s, [int texeloffset])",
+tex3Dfetch = fn "performs an unfiltered texture lookup in a given sampler (lod as .w). - (float4)(sampler3D, int4 s, [int texeloffset])",
+tex3Dlod = fn "performs a texture lookup with a specified level of detail in a given sampler (lod as .w) - (float4)(sampler3D, float4 s, [int texeloffset])",
+tex3Dproj = fn "performs a texture lookup with projection in a given sampler. (proj in .w) - (float4)(sampler3D, float4 s, [int texeloff])",
+tex3Dsize = fn "returns the size of a given texture image for a given level of detail. (only gp4 profiles) - (int3)(sampler3D, int lod)",
+
+texBUF = fn "performs an unfiltered texture lookup in a given texture buffer sampler. (only gp4 profiles) - (float4)(samplerBUF, int s)",
+texBUFsize = fn "returns the size of a given texture image for a given level of detail. (only gp4 profiles) - (int3)(samplerBUF, int lod)",
+
+texRBUF = fn "performs a multi-sampled texture lookup in a renderbuffer. (only gp4 profiles) - (float4)(samplerRBUF, int2 s, int sample)",
+texRBUFsize = fn "returns the size of a given renderbuffer. (only gp4 profiles) - (int2)(samplerBUF)",
+
+texCUBE = fn "performs a texture lookup in a given CUBE sampler and, in some cases, a shadow comparison (float4 coord). May also use pre computed derivatives if those are provided. Texeloffset only in gp4 or higher profiles. - (float4)(samplerCUBE, float3/float4 s, |float3 dx, dy|)",
+texCUBEbias = fn "performs a texture lookup with bias in a given sampler (as .w). - (float4)(sampler1D, float4 s, [int texeloffset])",
+texCUBElod = fn "performs a texture lookup with a specified level of detail in a given sampler (lod as .w) - (float4)(sampler1D, float4 s, [int texeloffset])",
+texCUBEproj = fn "performs a texture lookup with projection in a given sampler. (proj in .w) - (float4)(samplerCUBE, float4 s)",
+texCUBEsize = fn "returns the size of a given texture image for a given level of detail. (only gp4 profiles) - (int3)(sampler1D, int lod)",
+
+texRECT = fn "performs a texture lookup in a given RECT sampler and, in some cases, a shadow comparison (as .z). May also use pre computed derivatives if those are provided. Texeloffset only in gp4 or higher profiles. - (float4)(samplerRECT, float2/float3 s, |float2 dx, dy|, [int texeloff])",
+texRECTbias = fn "performs a texture lookup with bias in a given sampler (as .w). - (float4)(samplerRECT, float4 s, [int texeloffset])",
+texRECTfetch = fn "performs an unfiltered texture lookup in a given sampler (lod as .w). - (float4)(samplerRECT, int4 s, [int texeloffset])",
+texRECTlod = fn "performs a texture lookup with a specified level of detail in a given sampler (lod as .w) - (float4)(samplerRECT, float4 s, [int texeloffset])",
+texRECTproj = fn "performs a texture lookup with projection in a given sampler. May perform a shadow comparison if argument for shadow comparison is provided. (shadow in .z for float3 coord, proj in .z or .w) - (float4)(samplerRECT, float3/float4 s, [int texeloff])",
+texRECTsize = fn "returns the size of a given texture image for a given level of detail. (only gp4 profiles) - (int3)(samplerRECT, int lod)",
+
+tex1DARRAY = fn "performs a texture lookup in a given 1D sampler array and, in some cases, a shadow comparison (as .z). May also use pre computed derivatives if those are provided. Texeloffset only in gp4 or higher profiles. - (float4)(sampler1DARRAY, float2/float3 s, {float dx, dy},[int texeloffset])",
+tex1DARRAYbias = fn "performs a texture lookup with bias in a given sampler (as .w). - (float4)(sampler1DARRAY, float4 s, [int texeloffset])",
+tex1DARRAYcmpbias = fn "performs a texture lookup with bias and shadow compare in a given sampler (layer as .y, compare as .z, bias as .w). - (float4)(sampler1DARRAY, float4 s, [int texeloffset])",
+tex1DARRAYcmplod = fn "performs a texture lookup with a specified level of detail and a shadow compare in a given sampler (compare as .z, lod as .w). - (float4)(sampler1DARRAY, float4 s, [int texeloffset])",
+tex1DARRAYfetch = fn "performs an unfiltered texture lookup in a given sampler (lod as .z). - (float4)(sampler1DARRAY, int3 s, [int texeloffset])",
+tex1DARRAYlod = fn "performs a texture lookup with a specified level of detail in a given sampler (lod as .z) - (float4)(sampler1DARRAY, float3 s, [int texeloffset])",
+tex1DARRAYproj = fn "performs a texture lookup with projection in a given sampler. May perform a shadow comparison if argument for shadow comparison is provided. (shadow in .z for float3 coord, proj in .z or .w) - (float4)(sampler1DARRAY, float3/float4 s, [int texeloff])",
+tex1DARRAYsize = fn "returns the size of a given texture image for a given level of detail. (only gp4 profiles) - (int3)(sampler1DARRAY, int lod)",
+
+tex2DARRAY = fn "performs a texture lookup in a given 2D sampler array and, in some cases, a shadow comparison (as .w coord). May also use pre computed derivatives if those are provided. Texeloffset only in gp4 or higher profiles. - (float4)(sampler2DARRAY, float3/float4 s, {float2 dx, dy},[int texeloffset])",
+tex2DARRAYbias = fn "performs a texture lookup with bias in a given sampler (as .w). - (float4)(sampler2DARRAY, float4 s, [int texeloffset])",
+tex2DARRAYfetch = fn "performs an unfiltered texture lookup in a given sampler (lod as .w). - (float4)(sampler2DARRAY, int4 s, [int texeloffset])",
+tex2DARRAYlod = fn "performs a texture lookup with a specified level of detail in a given sampler (lod as .w) - (float4)(sampler2DARRAY, float4 s, [int texeloffset])",
+tex2DARRAYproj = fn "performs a texture lookup with projection in a given sampler. May perform a shadow comparison if argument for shadow comparison is provided. (proj in .w) - (float4)(sampler2DARRAY, float4 s, [int texeloff])",
+tex2DARRAYsize = fn "returns the size of a given texture image for a given level of detail. (only gp4 profiles) - (int3)(sampler2DARRAY, int lod)",
+
+texCUBEARRAY = fn "performs a texture lookup in a given CUBE sampler array. May also use pre computed derivatives if those are provided. Texeloffset only in gp4 or higher profiles. - (float4)(samplerCUBEARRAY, float4 s, {float3 dx, dy},[int texeloffset])",
+texCUBEARRAYsize = fn "returns the size of a given texture image for a given level of detail. (only gp4 profiles) - (int3)(samplerCUBEARRAY, int lod)",
+
+unpack_4ubyte = fn "interprets the single float as 4 normalized unsigned bytes and returns the vector. (only nv/gp4 profiles) - (float4)(float)",
+pack_4ubyte = fn "packs the floats into a single storing as normalized unsigned bytes.(only nv/gp4 profiles) - (float)(float4)",
+unpack_4byte = fn "interprets the single float as 4 normalized signed bytes and returns the vector. (only nv/gp4 profiles) - (float4)(float)",
+pack_4ubyte = fn "packs the floats into a single storing as normalized signed bytes.(only nv/gp4 profiles) - (float)(float4)",
+unpack_4ushort = fn "interprets the single float as 2 normalized unsigned shorts and returns the vector. (only nv/gp4 profiles) - (float2)(float)",
+pack_4ushort = fn "packs the floats into a single storing as normalized unsigned shorts.(only nv/gp4 profiles) - (float)(float2)",
+unpack_2half = fn "interprets the single float as 2 16-bit floats and returns the vector. (only nv/gp4 profiles) - (float2)(float)",
+pack_2half = fn "packs the floats into a single storing as 16-bit floats.(only nv/gp4 profiles) - (float)(float2)",
+}
+
+local keyw =
+[[int half float float3 float4 float2 float3x3 float3x4 float4x3 float4x4
+float1x2 float2x1 float2x2 float2x3 float3x2 float1x3 float3x1 float4x1 float1x4
+float2x4 float4x2 double1x4 double4x4 double4x2 double4x3 double3x4 double2x4 double1x4
+double half half2 half3 half4 int2 int3 uint uint2 uint3 uint4
+int4 bool bool2 bool3 bool4 string struct typedef
+usampler usampler1D usampler2D usampler3D usamplerRECT usamplerCUBE isampler1DARRAY usampler2DARRAY usamplerCUBEARRAY
+isampler isampler1D isampler2D isampler3D isamplerRECT isamplerCUBE isampler1DARRAY isampler2DARRAY isamplerCUBEARRAY
+usamplerBUF isamplerBUF samplerBUF
+sampler sampler1D sampler2D sampler3D samplerRECT samplerCUBE sampler1DARRAY sampler2DARRAY samplerCUBEARRAY
+texture texture1D texture2D texture3D textureRECT textureCUBE texture1DARRAY texture2DARRAY textureCUBEARRAY
+
+decl do else extern false for if in inline inout out pass
+pixelshader return shared static string technique true
+uniform vector vertexshader void volatile while
+
+asm compile const auto break case catch char class const_cast continue default delete
+dynamic_cast enum explicit friend goto long mutable namespace new operator private protected
+public register reinterpret_case short signed sizeof static_cast switch template this throw
+try typename union unsigned using virtual
+
+POSITION PSIZE DIFFUSE SPECULAR TEXCOORD FOG COLOR COLOR0 COLOR1 COLOR2 COLOR3 TEXCOORD0 TEXCOORD1 TEXCOORD2 TEXCOORD3
+TEXCOORD4 TEXCOORD5 TEXCOORD6 TEXCOORD7 TEXCOORD8 TEXCOORD9 TEXCOORD10 TEXCOORD11 TEXCOORD12 TEXCOORD13 TEXCOORD14
+TEXCOORD15
+NORMAL WPOS
+ATTR0 ATTR1 ATTR2 ATTR3 ATTR4 ATTR5 ATTR6 ATTR7 ATTR8 ATTR9 ATTR10 ATTR11 ATTR12 ATTR13 ATTR14 ATTR15
+TEXUNIT0 TEXUNIT1 TEXUNIT2 TEXUNIT3 TEXUNIT4 TEXUNIT5 TEXUNIT6 TEXUNIT7 TEXUNIT8 TEXUNIT9 TEXUNIT10 TEXUNIT11 TEXUNIT12
+TEXUNIT13 TEXUNIT14 TEXUNIT15
+
+PROJ PROJECTION PROJECTIONMATRIX PROJMATRIX
+PROJMATRIXINV PROJINV PROJECTIONINV PROJINVERSE PROJECTIONINVERSE PROJINVMATRIX PROJECTIONINVMATRIX PROJINVERSEMATRIX PROJECTIONINVERSEMATRIX
+VIEW VIEWMATRIX VIEWMATRIXINV VIEWINV VIEWINVERSE VIEWINVERSEMATRIX VIEWINVMATRIX
+VIEWPROJECTION VIEWPROJ VIEWPROJMATRIX VIEWPROJECTIONMATRIX
+WORLD WORLDMATRIX WORLDVIEW WORLDVIEWMATRIX
+WORLDVIEWPROJ WORLDVIEWPROJECTION WORLDVIEWPROJMATRIX WORLDVIEWPROJECTIONMATRIX
+VIEWPORTSIZE VIEWPORTDIMENSION
+VIEWPORTSIZEINV VIEWPORTSIZEINVERSE VIEWPORTDIMENSIONINV VIEWPORTDIMENSIONINVERSE INVERSEVIEWPORTDIMENSIONS
+FOGCOLOR FOGDISTANCE CAMERAWORLDPOS CAMERAWORLDDIR
+
+CENTROID FLAT NOPERSPECTIVE FACE PRIMITIVEID VERTEXID
+
+]]
+
+-- keywords - shouldn't be left out
+for w in keyw:gmatch("([_%w]+)") do
+ api[w] = {type="keyword"}
+end
+
+return api
+
+
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/api/glsl/std.lua b/love2dToAPK/tools/tools/zbstudio-old-win/api/glsl/std.lua
new file mode 100644
index 0000000..300af6d
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/api/glsl/std.lua
@@ -0,0 +1,277 @@
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+-- function helpers
+
+local function fn (description)
+ local description2,returns,args = description:match("(.+)%-%s*(%b())%s*(%b())")
+ if not description2 then
+ return {type="function",description=description,
+ returns="(?)"}
+ end
+ return {type="function",description=description2,
+ returns=returns:gsub("^%s+",""):gsub("%s+$",""), args = args}
+end
+
+local function val (description)
+ return {type="value",description = description}
+end
+-- docs
+local api = {
+radians = fn "converts degrees to radians - (vecN)(vecN)",
+degrees = fn "converts radians to degrees - (vecN)(vecN)",
+sin = fn "returns sine of scalars and vectors. - (vecN)(vecN)",
+sinh = fn "returns hyperbolic sine of scalars and vectors. - (vecN)(vecN)",
+cos = fn "returns cosine of scalars and vectors. - (vecN)(vecN)",
+cosh = fn "returns hyperbolic cosine of scalars and vectors. - (vecN)(vecN)",
+atan = fn "returns arc tangent of scalars and vectors. - (vecN)([vecN y_over_x ]/[vecN y, vecN x])",
+asin = fn "returns arc sine of scalars and vectors. - (vecN)(vecN)",
+acos = fn "returns arc cosine of scalars and vectors. - (vecN)(vecN)",
+atan = fn "returns arc tangent of scalars and vectors. - (vecN)(vecN)",
+tan = fn "returns tangent of scalars and vectors. - (vecN)(vecN)",
+tanh = fn "returns hyperbolic tangent of scalars and vectors. - (vecN)(vecN)",
+acosh = fn "returns hyperbolic arc cosine of scalars and vectors. - (vecN)(vecN)",
+asinh = fn "returns hyperbolic arc sine of scalars and vectors. - (vecN)(vecN)",
+atanh = fn "returns hyperbolic arc tangent of scalars and vectors. - (vecN)(vecN)",
+
+exp = fn "returns the base-e exponential of scalars and vectors. - (vecN)(vecN)",
+exp2 = fn "returns the base-2 exponential of scalars and vectors. - (vecN)(vecN)",
+log = fn "returns the natural logarithm of scalars and vectors. - (vecN)(vecN)",
+log2 = fn "returns the base-2 logarithm of scalars and vectors. - (vecN)(vecN)",
+pow = fn "returns x to the y-th power of scalars and vectors. - (vecN)(vecN x, y)",
+sqrt = fn "returns square root of scalars and vectors. - (vecN)(vecN)",
+inversesqrt = fn "returns inverse square root of scalars and vectors. - (vecN)(vecN)",
+
+abs = fn "returns absolute value of scalars and vectors. - (vecN)(vecN)",
+sign = fn "returns sign (1 or -1) of scalar or each vector component. - (vecN)(vecN)",
+floor = fn "returns largest integer not greater than a scalar or each vector component. - (vecN)(vecN)",
+ceil = fn "returns smallest integer not less than a scalar or each vector component. - (vecN)(vecN)",
+trunc = fn "returns largest integer not greater than a scalar or each vector component. - (vecN)(vecN)",
+round = fn "returns the rounded value of scalars or vectors. - (vecN)(vecN a)",
+roundEven = fn "returns the nearest even integer value of scalars or vectors. - (vecN)(vecN a)",
+fract = fn "returns the fractional portion of a scalar or each vector component. - (vecN)(vecN)",
+mod = fn "modulus - (vecN)(vecN x, y)",
+modf = fn "separate integer and fractional parts. - (vecN)(vecN x, out vecN i)",
+max = fn "returns the maximum of two scalars or each respective component of two vectors. - (vecN)(vecN a, b)",
+min = fn "returns the minimum of two scalars or each respective component of two vectors. - (vecN)(vecN a, b)",
+mix = fn "returns linear interpolation of two scalars or vectors based on a weight. - (vecN)(vecN a, b, weight)",
+step = fn "implement a step function returning either zero or one (x >= edge). - (vecN)(vecN edge, x)",
+
+isinf = fn "test whether or not a scalar or each vector component is infinite. - (boolN)(vecN)",
+isnan = fn "test whether or not a scalar or each vector component is not-a-number. - (boolN)(vecN)",
+clamp = fn "returns x clamped to the range [a,b]. - (vecN)(vecN x, a, b)",
+smoothstep = fn "clip and smooth blend [a,b]. - (vecN)(vecN a, b, x)",
+floatBitsToInt = fn "returns the 32-bit integer representation of an IEEE 754 floating-point scalar or vector - (uintN/intN)(floatN)",
+intBitsToFloat = fn "returns the float value corresponding to a given bit represention.of a scalar int value or vector of int values. - (floatN)(intN)",
+uintBitsToFloat = fn "returns the float value corresponding to a given bit represention.of a scalar int value or vector of int values. - (floatN)(uintN)",
+doubleBitsToInt64 = fn "returns the 64-bit integer representation of an IEEE 754 double precision floating-point scalar or vector - (int64N)(doubleN)",
+doubleBitsToUint64 = fn "returns the 64-bit integer representation of an IEEE 754 double precision floating-point scalar or vector - (uint64N)(doubleN)",
+int64BitsToDouble = fn "returns the double value corresponding to a given bit represention.of a scalar int value or vector of int values. - (doubleN)(uint64N)",
+uint64BitsToDouble = fn "returns the double value corresponding to a given bit represention.of a scalar int value or vector of int values. - (doubleN)(uint64N)",
+
+fma = fn "return a*b + c, treated as single operation when using precise - (vecN a, vecN b, vecN c)",
+frexp = fn "splits scalars and vectors into normalized fraction [0.5,1.0) and a power of 2. - (vecN)(vecN x, out vecN e)",
+ldexp = fn "build floating point number from x and the corresponding integral exponen of 2 in exp. - (vecN)(vecN x, exp)",
+
+packUnorm2x16 = fn "Converts each comp. of v into 16-bit ints, packs results into the returned 32-bit uint. - (uint)(vec2 v)",
+packUnorm4x8 = fn "Converts each comp. of v into 8-bit ints, packs results into the returned 32-bit uint. - (uint)(vec4 v)",
+packSnorm4x8 = fn "Converts each comp. of v into 8-bit ints, packs results into the returned 32-bit uint. - (uint)(vec4 v)",
+packDouble2x32 = fn "Packs components of v into a 64-bit value and returns a double-prec value. - (double)(uvec2 v)",
+packHalf2x16 = fn "Converts each comp. of v into 16-bit half float, packs results into the returned 32-bit uint. - (uint)(vec2 v)",
+packInt2x32 = fn "Packs two 32 bit into one 64-bit value. - (int64_t)(ivec2)",
+packUint2x32 = fn "Packs two 32 bit into one 64-bit value. - (uint64_t)(uvec2)",
+packFloat2x16 = fn "returns an unsigned integer obtained by interpreting the components of a two-component 16-bit floating-point as integers and packing them into 32 bit. - (uint)(f16vec2 v)",
+
+unpackUnorm2x16 = fn "Unpacks 32-bit p into two 16-bit uints and converts them to normalized float. - (vec2)(uint p)",
+unpackUnorm4x8 = fn "Unpacks 32-bit p into four 8-bit uints and converts them to normalized float. - (vec4)(uint p)",
+unpackSnorm4x8 = fn "Unpacks 32-bit p into four 8-bit uints and converts them to normalized float. - (vec4)(uint p)",
+unpackDouble2x32 = fn "Returns a 2 component vector representation of v. - (uvec2)(double v)",
+unpackHalf2x16 = fn "Interprets p as two 16-bit half floats and returns them as vector. - (vec2)(uint p)",
+unpackInt2x32 = fn "Unpacks 64-bit into two 32-bit values. - (ivec2)(int64_t)",
+unpackUint2x32 = fn "Unpacks 64-bit into two 32-bit values. - (uvec2)(uint64_t)",
+unpackFloat2x16 = fn "returns a two-component vector with 16-bit floating-point components obtained by unpacking a 32-bit unsigned integer into a pair of 16-bit values. - (f16vec2)(uint)",
+
+
+length = fn "return scalar Euclidean length of a vector. - (type)(vecN)",
+distance = fn "return the Euclidean distance between two points. - (vecN)(vecN a, b)",
+dot = fn "returns the scalar dot product of two vectors. - (type)(vecN a, b)",
+cross = fn "returns the cross product of two three-component vectors. - (type3)(type3 a, b)",
+normalize = fn "Returns the normalized version of a vector, meaning a vector in the same direction as the original vector but with a Euclidean length of one. - (vecN)(vecN)",
+reflect = fn "returns the reflectiton vector given an incidence vector and a normal vector. - (vecN)(vecN incidence, normal)",
+refract = fn "computes a refraction vector. - (vecN)(vecN incidence, normal, type eta)",
+faceforward = fn "returns a normal as-is if a vertex's eye-space position vector points in the opposite direction of a geometric normal, otherwise return the negated version of the normal. - (vecN)(vecN Nperturbated, Incident, Ngeometric)",
+
+determinant = fn "returns the scalar determinant of a square matrix. - (float)(matN)",
+transpose = fn "returns transpose matrix of a matrix. - (matNxM)(matMxN)",
+inverse = fn "returns inverse matrix of a matrix. - (matN)(mat)",
+matrixCompMult = fn "component-wise multiply. - (mat)(mat a, b)",
+outerProduct = fn "outer product. - (matNxM)(vecM c, vecN r)",
+
+all = fn "returns true if a boolean scalar or all components of a boolean vector are true. - (bool)(boolN)",
+any = fn "returns true if a boolean scalar or any component of a boolean vector is true. - (bool)(boolN)",
+["not"] = fn "returns logical complement. - (boolN)(boolN)",
+lessThan = fn "returns retusult of component-wise comparison. - (boolN)(vecN a,b)",
+lessThanEqual = fn "returns retusult of component-wise comparison. - (boolN)(vecN a,b)",
+greaterThan = fn "returns retusult of component-wise comparison. - (boolN)(vecN a,b)",
+greaterThanEqual = fn "returns retusult of component-wise comparison. - (boolN)(vecN a,b)",
+equal = fn "returns retusult of component-wise comparison. - (boolN)(vecN a,b)",
+notEqual = fn "returns retusult of component-wise comparison. - (boolN)(vecN a,b)",
+
+uaddCarry = fn "Adds 32-bit uintx and y, returning the sum modulo 2^32. - (uintN)(uintN x, y, out carry)",
+usubBorrow = fn "Subtracts y from x, returning the difference if non-negative otherwise 2^32 plus the difference. - (uint)(uint x, y, out borrow)",
+umulExtended = fn "Multiplies 32-bit integers x and y producing 64-bit result. (uintN)(uintN x, y, out msb, out lsb)",
+imulExtended = fn "Multiplies 32-bit integers x and y producing 64-bit result. (intN)(intN x, y, out msb, out lsb)",
+bitfieldExtract = fn "Extracts bits (offset, offset + bits -1) from value and returns them in lsb of result. - (intN)(intN value, int offset, int bits)",
+bitfieldInsert = fn "Returns the insertion the bits lsb of insert into base. - (intN)(intN base insert, int offset, int bits)",
+bitfieldReverse = fn "Returns the reversal of the bits. - (intN)(intN)",
+bitCount = fn "returns the number of bits set to 1. - (intN)(intN)",
+findLSB = fn "returns bit number of lsb. - (intN)(intN)",
+findMSB = fn "returns bit number of msb. - (intN)(intN)",
+
+discard = fn "conditionally (<0) kill a pixel before output. - ()(vecN)",
+dFdx = fn "returns approximate partial derivative with respect to window-space X. - (vecN)(vecN)",
+dFdxCoarse = fn "returns approximate partial derivative with respect to window-space X. - (vecN)(vecN)",
+dFdxFine = fn "returns approximate partial derivative with respect to window-space X. - (vecN)(vecN)",
+dFdy = fn "returns approximate partial derivative with respect to window-space Y. - (vecN)(vecN)",
+dFdyCoarse = fn "returns approximate partial derivative with respect to window-space Y. - (vecN)(vecN)",
+dFdyFine = fn "returns approximate partial derivative with respect to window-space Y. - (vecN)(vecN)",
+fwidth = fn "returns abs sum of approximate window-space partial derivatives magnitudes. - (vecN)(vecN)",
+fwidthFine = fn "returns abs sum of approximate window-space partial derivatives magnitudes. - (vecN)(vecN)",
+fwidthCoarse = fn "returns abs sum of approximate window-space partial derivatives magnitudes. - (vecN)(vecN)",
+interpolateAtCentroid = fn "Return value of interpolant sampled inside pixel and the primitive. - (floatN)(floatN)",
+interpolateAtSample = fn "Return value of interpolant at the location fo sample. - (floatN)(floatN, int sample)",
+interpolateAtOffset = fn "Return value of interpolant sampled at fixed offset offset from pixel center. - (floatN)(floatN, vec2 offset)",
+
+noise1 = fn "returns noise value. - (float)(float)",
+noise2 = fn "returns noise value. - (vec2)(float)",
+noise3 = fn "returns noise value. - (vec3)(float)",
+noise4 = fn "returns noise value. - (vec4)(float)",
+
+EmitStreamVertex = fn "Emits values of the output variables of the current output primitive stream. - ()(int stream)",
+EndStreamPrimitive = fn "Completes current output primitive stream and starts a new one. - ()(int stream)",
+EmitVertex= fn "Emits values of the output variable of the current output primitive. - ()()",
+EndPrimitive = fn "Completes current output primitive and starts a new one. - ()()",
+barrier = fn "Synchronizes across shader invocations. - ()()",
+
+memoryBarrier = fn "control ordering of memory transactions issued by shader thread. - ()()",
+memoryBarrierAtomicCounter = fn "control ordering of memory transactions issued by shader thread. - ()()",
+memoryBarrierShared = fn "control ordering of memory transactions issued by shader thread. - ()()",
+memoryBarrierBuffer = fn "control ordering of memory transactions issued by shader thread. - ()()",
+memoryBarrierImage = fn "control ordering of memory transactions issued by shader thread. - ()()",
+groupMemoryBarrier = fn "control ordering of memory transactions issued by shader thread. - ()()",
+imageAtomicAdd = fn "performs atomic operation on individual texels returns old value. - (uint)(imageN, intN coord, [int sample], uint data)",
+imageAtomicMin = fn "performs atomic operation on individual texels returns old value. - (uint)(imageN, intN coord, [int sample], uint data)",
+imageAtomicMax = fn "performs atomic operation on individual texels returns old value. - (uint)(imageN, intN coord, [int sample], uint data)",
+imageAtomicIncWrap = fn "performs atomic operation on individual texels returns old value. - (uint)(imageN, intN coord, [int sample], uint data)",
+imageAtomicDecWrap = fn "performs atomic operation on individual texels returns old value. - (uint)(imageN, intN coord, [int sample], uint data)",
+imageAtomicAnd = fn "performs atomic operation on individual texels returns old value. - (uint)(imageN, intN coord, [int sample], uint data)",
+imageAtomicOr = fn "performs atomic operation on individual texels returns old value. - (uint)(imageN, intN coord, [int sample], uint data)",
+imageAtomicXor = fn "performs atomic operation on individual texels returns old value. - (uint)(imageN, intN coord, [int sample], uint data)",
+imageAtomicExchange = fn "performs atomic operation on individual texels returns old value. - (uint)(imageN, intN coord, [int sample], uint data)",
+imageAtomicCompSwap = fn "performs atomic operation on individual texels returns old value. - (uint)(imageN, intN coord, [int sample], uint data)",
+imageStore = fn "stores the texel at the coordinate. - ()(imageN, intN coord, [int sample], vecN data)",
+imageLoad = fn "loads the texel at the coordinate. - (vecN)(imageN, intN coord, [int sample])",
+imageSize = fn "returns the size of the image. - (ivecN)(imageN)",
+imageSamples = fn "returns the samples of the multi-sampled image. - (int)(image2DMSN)",
+
+atomicCounterIncrement = fn "increments counter and returns old value. - (uint)(atomic_uint)",
+atomicCounterDecrement = fn "decrements counter and returns old value. - (uint)(atomic_uint)",
+atomicCounter = fn "returns current counter value. - (uint)(atomic_uint)",
+atomicMin = fn "performs atomic operation on memory location (ssbo/shared) returns old value. - (uint)(inout uint mem, uint data)",
+atomicMax = fn "performs atomic operation on memory location (ssbo/shared) returns old value. - (uint)(inout uint mem, uint data)",
+atomicAdd = fn "performs atomic operation on memory location (ssbo/shared) returns old value. - (uint)(inout uint mem, uint data)",
+atomicAnd = fn "performs atomic operation on memory location (ssbo/shared) returns old value. - (uint)(inout uint mem, uint data)",
+atomicOr = fn "performs atomic operation on memory location (ssbo/shared) returns old value. - (uint)(inout uint mem, uint data)",
+atomicXor = fn "performs atomic operation on memory location (ssbo/shared) returns old value. - (uint)(inout uint mem, uint data)",
+atomicExchange = fn "performs atomic operation on memory location (ssbo/shared) returns old value. - (uint)(inout uint mem, uint data)",
+atomicCompSwap = fn "performs atomic operation on memory location (ssbo/shared) returns old value. - (uint)(inout uint mem, uint data)",
+
+textureSize = fn "returns the size of the texture (no lod required: Rect, MS and Buffer). - (intN)(samplerN, [int lod])",
+textureSamples = fn "returns the samples of the multi-sampled texture. - (int)(texture2DMSN)",
+textureQueryLod = fn "returns the lod values for a given coordinate. - (vec2)(samplerN, vecN coord)",
+texture = fn "performs a texture lookup. Shadow samplers require base N+1 coordinate. Lod bias is optional (illegal for MS, Buffer, Rect). - (vec4)(samplerN, vecN coord, [float bias])",
+textureProj = fn "performas a projective texture lookup (only Nd samplers + Rect). Shadows require N+1 base coordinate, no Lod bias allowed for Rect. - (vec4)(samplerN, vecN+1 coord, [float bias])",
+textureLod = fn "performs a lookup with explicit LOD. Shadows require N+1 base coordinate. Illegal function for Rect, MS, Buffer. - (vec4)(samplerN, vecN coord, float lod)",
+textureOffset = fn "offset added before texture lookup. Illegal for MS, Buffer, Cube. - (vec4)(samplerN, vecN coord, intN offset, [float bias])",
+textureProjOffset = fn "projective texture lookup with offset. Illegal for MS, Buffer, Cube, Array. - (vec4)(samplerN, vecN+1 coord, intN offset, [float bias])",
+textureLodOffset = fn "offset added with explicit LOD. - (vec4)(samplerN, vecN coord, intN offset, int lod)",
+textureProjLodOffset = fn "projective lookup with offset and explicit LOD. - (vec4)(samplerN, vecN+1 coord, intN offset, int lod)",
+textureGrad = fn "lookup with explicit gradients. Illegal for MS, Buffer. - (vec4)(samplerN, vecN coord, gradX, gradY)",
+textureGradOffset = fn "lookup with explicit gradients and offset. Illegal for MS, Buffer, Cube. - (vec4)(samplerN, vecN coord, gradX, gradY, intN offset)",
+textureProjGradOffset = fn "projective lookup with expicit gradients and offset. Illegal for MS, Buffer, Cube. - (vec4)(samplerN, vecN+1 coord, vecN gradX, gradY, intN offset)",
+textureGather = fn "gather lookup (pixel quad of 4 single channel samples at once). Component 0: x, 1: y ... is ignored for shadow samplers instead reference value must be passed. Only 2D/Cube. Illegal for MS. - (vec4)(samplerN, vecN coord, [int comp] / float shadowRefZ)",
+textureGatherOffset = fn "gather lookup (pixel quad of 4 single channel samples at once) with offset. Component 0: x, 1: y ... is ignored for shadow samplers instead reference value must be passed. Only 2D/Cube. Illegal for MS. - (vec4)(samplerN, vecN coord, [float shadowRefZ], intN offset / intN offset[4] , [int comp])",
+texelFetch = fn "integer coordinate lookup for a single texel. No lod parameter for Buffer, MS, Rect. Illegal for Cube - (vec4)(samplerN, intN coord, [int lod/sample])",
+texelFetchOffset = fn "integer coordinate lookup for a single texel with offset. No lod parameter for Buffer, MS, Rect. Illegal for Cube, Buffer, MS. - (vec4)(samplerN, intN coord, [int lod/sample], intN offset)",
+
+anyInvocationARB = fn "returns true if and only if <value> is true for at least one active invocation in the group. - (bool)(bool value)",
+allInvocationsARB = fn "returns true if and only if <value> is true for all active invocations in the group - (bool)(bool value)",
+allInvocationsEqualARB = fn "returns true if <value> is the same for all active invocation in the group. - (bool)(bool value)",
+}
+
+local keyw =
+[[ int uint half float bool double atomic_uint binding offset
+ vec2 vec3 vec4 dvec2 dvec3 dvec4
+ ivec2 ivec3 ivec4 uvec2 uvec3 uvec4 bvec2 bvec3 bvec4
+ mat2 mat3 mat4 mat2x2 mat3x3 mat4x4 mat2x3 mat3x2 mat4x2 mat2x4 mat4x3 mat3x4
+ dmat2 dmat3 dmat4 dmat2x2 dmat3x3 dmat4x4 dmat2x3 dmat3x2 dmat4x2 dmat2x4 dmat4x3 dmat3x4
+ float16_t f16vec2 f16vec3 f16vec4
+ float32_t f32vec2 f32vec3 f32vec4
+ float64_t f64vec2 f64vec3 f64vec4
+ int8_t i8vec2 i8vec3 i8vec4
+ int8_t i8vec2 i8vec3 i8vec4
+ int16_t i16vec2 i16vec3 i16vec4
+ int32_t i32vec2 i32vec3 i32vec4
+ int64_t i64vec2 i64vec3 i64vec4
+ uint8_t u8vec2 u8vec3 u8vec4
+ uint16_t u16vec2 u16vec3 u16vec4
+ uint32_t u32vec2 u32vec3 u32vec4
+ uint64_t u64vec2 u64vec3 u64vec4
+ struct typedef void
+ usampler1D usampler2D usampler3D usampler2DRect usamplerCube isampler1DArray usampler2DARRAY usamplerCubeArray usampler2DMS usampler2DMSArray
+ isampler1D isampler2D isampler3D isampler2DRect isamplerCube isampler1DArray isampler2DARRAY isamplerCubeArray isampler2DMS isampler2DMSArray
+ sampler1D sampler2D sampler3D sampler2DRect samplerCube sampler1DArray sampler2DArray samplerCubeArray sampler2DMS sampler2DMSArray
+ sampler1DShadow sampler2DShadow sampler2DRectShadow sampler1DArrayShadow sampler2DArrayShadow samplerCubeArrayShadow
+ usamplerBuffer isamplerBuffer samplerBuffer samplerRenderbuffer isamplerRenderbuffer usamplerRenderbuffer
+ in out inout uniform const centroid sample attribute varying patch index true false
+ return switch case for do while if else break continue main inline
+ layout location vertices line_strip triangle_strip max_vertices stream
+ triangles quads equal_spacing isolines fractional_even_spacing lines points
+ fractional_odd_spacing cw ccw point_mode lines_adjacency triangles_adjacency
+ invocations offset align xfb_offset xfb_buffer
+ origin_upper_left pixel_center_integer depth_greater depth_greater depth_greater depth_unchanged
+ smooth flat noperspective highp mediump lowp shared packed std140 std430 row_major column_major buffer
+ gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor gl_Color gl_SecondaryColor
+ subroutine gl_Position gl_FragCoord
+ gl_VertexID gl_InstanceID gl_Normal gl_Vertex gl_MultiTexCoord0 gl_MultiTexCoord1
+ gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6
+ gl_MultiTexCoord7 gl_FogCoord gl_PointSize gl_ClipDistance
+ gl_TexCoord gl_FogFragCoord gl_ClipVertex gl_in
+ gl_PatchVerticesIn
+ gl_PrimitiveID gl_InvocationID gl_TessLevelOuter gl_TessLevelInner gl_TessCoord
+ gl_InvocationID gl_PrimitiveIDIn gl_Layer gl_ViewportIndex gl_FrontFacing
+ gl_PointCoord gl_SampleID gl_SamplePosition gl_FragColor
+ gl_FragData gl_FragDepth gl_SampleMask
+ gl_NumWorkGroups gl_WorkGroupSize gl_WorkGroupID gl_LocalInvocationID gl_GlobalInvocationID gl_LocalInvocationIndex
+ local_size_x local_size_y local_size_z
+ gl_BaseVertexARB gl_BaseInstanceARB gl_DrawIDARB
+ bindless_sampler bound_sampler bindless_image bound_image early_fragment_tests
+ gl_HelperInvocation gl_CullDistance gl_MaxSamples
+
+ coherent volatile restrict readonly writeonly
+ image1D image2D image3D image2DRect imageCube imageBuffer image1DArray image2DArray imageCubeArray image2DMS image2DMSArray
+ uimage1D uimage2D uimage3D uimage2DRect uimageCube uimageBuffer uimage1DArray uimage2DArray uimageCubeArray uimage2DMS uimage2DMSArray
+ iimage1D iimage2D iimage3D iimage2DRect iimageCube iimageBuffer iimage1DArray iimage2DArray iimageCubeArray iimage2DMS iimage2DMSArray
+ size1x8 size1x16 size1x32 size2x32 size4x32 rgba32f rgba16f rg32f rg16f r32f r16f rgba8 rgba16 r11f_g11f_b10f rgb10_a2ui
+ rgb10_a2i rg16 rg8 r16 r8 rgba32i rgba16i rgba8i rg32i rg16i rg8i r32i r16i r8i rgba32ui rgba16ui rgba8ui rg32ui rg16ui rg8ui
+ r32ui r16ui r8ui rgba16_snorm rgba8_snorm rg16_snorm rg8_snorm r16_snorm r8_snorm
+]]
+
+-- keywords - shouldn't be left out
+for w in keyw:gmatch("([a-zA-Z_0-9]+)") do
+ api[w] = {type="keyword"}
+end
+
+return api
+
+
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/api/lua/baselib.lua b/love2dToAPK/tools/tools/zbstudio-old-win/api/lua/baselib.lua
new file mode 100644
index 0000000..45a2fba
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/api/lua/baselib.lua
@@ -0,0 +1,1238 @@
+return {
+ -- covers Lua 5.1, Lua 5.2, and Lua 5.3;
+ -- Lua 5.2 and Lua 5.3 specific items are marked with
+ -- FUNCTION/ARGUMENT/ARGS/VALUE ADDED/DEPRECATED IN Lua 5.2 or Lua 5.3.
+
+ -- Keywords
+ ["and"] = {type = "keyword"},
+ ["break"] = {type = "keyword"},
+ ["do"] = {type = "keyword"},
+ ["else"] = {type = "keyword"},
+ ["elseif"] = {type = "keyword"},
+ ["end"] = {type = "keyword"},
+ ["for"] = {type = "keyword"},
+ ["function"] = {type = "keyword"},
+ ["goto"] = {type = "keyword"},
+ ["if"] = {type = "keyword"},
+ ["in"] = {type = "keyword"},
+ ["local"] = {type = "keyword"},
+ ["not"] = {type = "keyword"},
+ ["or"] = {type = "keyword"},
+ ["repeat"] = {type = "keyword"},
+ ["return"] = {type = "keyword"},
+ ["then"] = {type = "keyword"},
+ ["until"] = {type = "keyword"},
+ ["while"] = {type = "keyword"},
+
+ -- Boolean values
+ ["false"] = {type = "value"},
+ ["nil"] = {type = "value"},
+ ["true"] = {type = "value"},
+
+ -- Basic library
+ _ENV = {
+ type = "value",
+ description = "VALUE ADDED IN Lua 5.2.",
+ },
+ _G = {
+ type = "value",
+ description = "A global variable (not a function) that holds the global environment.\nLua itself does not use this variable; changing its value does not affect any environment, nor vice-versa.",
+ },
+ _VERSION = {
+ type = "value",
+ description = "A global variable (not a function) that holds a string containing the current interpreter version.",
+ },
+ assert = {
+ type = "function",
+ description = "Issues an error when the value of its argument v is false (i.e., nil or false); otherwise, returns all its arguments.\nmessage is an error message; when absent, it defaults to \"assertion failed!\"",
+ args = "(v: any [, message: string])",
+ returns = "(...)",
+ },
+ collectgarbage = {
+ type = "function",
+ description = "This function is a generic interface to the garbage collector.\nIt performs different functions according to its first argument, opt:\n* \"collect\": performs a full garbage-collection cycle. This is the default option.\n* \"stop\": stops automatic execution of the garbage collector. The collector will run only when explicitly invoked, until a call to restart it.\n* \"restart\": restarts automatic execution of the garbage collector.\n* \"count\": returns the total memory in use by Lua (in Kbytes) and a second value with the total memory in bytes modulo 1024 (SECOND RETURN ADDED IN Lua 5.2). The first value has a fractional part, so the following equality is always true:\nk, b = collectgarbage(\"count\")\nassert(k*1024 == math.floor(k)*1024 + b)\n(The second result is useful when Lua is compiled with a non floating-point type for numbers.)\n* \"step\": performs a garbage-collection step. The step \"size\" is controlled by arg (larger values mean more steps) in a non-specified way. If you want to control the step size you must experimentally tune the value of arg. Returns true if the step finished a collection cycle.\n* \"setpause\": sets arg as the new value for the pause of the collector. Returns the previous value for pause.\n* \"setstepmul\": sets arg as the new value for the step multiplier of the collector. Returns the previous value for step.\n* \"isrunning\": returns a boolean that tells whether the collector is running (i.e., not stopped). VALUE ADDED IN Lua 5.2.\n* \"generational\": changes the collector to generational mode. This is an experimental feature. VALUE ADDED IN Lua 5.2.\n* \"incremental\": changes the collector to incremental mode. This is the default mode. VALUE ADDED IN Lua 5.2.",
+ args = "([opt: string [, arg: number]])",
+ returns = "(...)",
+ },
+ dofile = {
+ type = "function",
+ description = "Opens the named file and executes its contents as a Lua chunk.\nWhen called without arguments, dofile executes the contents of the standard input (stdin). Returns all values returned by the chunk. In case of errors, dofile propagates the error to its caller (that is, dofile does not run in protected mode).",
+ args = "([filename: string])",
+ returns = "(...)",
+ },
+ error = {
+ type = "function",
+ description = "Terminates the last protected function called and returns message as the error message.\nFunction error never returns.\nUsually, error adds some information about the error position at the beginning of the message, if the message is a string. The level argument specifies how to get the error position. With level 1 (the default), the error position is where the error function was called. Level 2 points the error to where the function that called error was called; and so on. Passing a level 0 avoids the addition of error position information to the message.",
+ args = "(message: string [, level: number])",
+ returns = "()",
+ },
+ getfenv = {
+ type = "function",
+ description = "Returns the current environment in use by the function.\n\nf can be a Lua function or a number that specifies the function at that stack level: Level 1 is the function calling getfenv. If the given function is not a Lua function, or if f is 0, getfenv returns the global environment. The default for f is 1.\n\nFUNCTION DEPRECATED IN Lua 5.2.",
+ args = "([f: function|number])",
+ returns = "(table)",
+ },
+ getmetatable = {
+ type = "function",
+ description = "If object does not have a metatable, returns nil. Otherwise, if the object's metatable has a \"__metatable\" field, returns the associated value. Otherwise, returns the metatable of the given object.",
+ args = "(object: any)",
+ returns = "(table|nil)",
+ valuetype = "m",
+ },
+ ipairs = {
+ type = "function",
+ description = "If t has a metamethod __ipairs, calls it with t as argument and returns the first three results from the call. METAMETHOD BEHAVIOR ADDED IN Lua 5.2.\nOtherwise, returns three values: an iterator function, the table t, and 0, so that the construction\nfor i,v in ipairs(t) do body end\nwill iterate over the pairs (1,t[1]), (2,t[2]), ..., up to the first integer key absent from the table.",
+ args = "(t: table)",
+ returns = "(function, table, number)",
+ },
+ load = {
+ type = "function",
+ description = "Loads a chunk.\nIf ld is a string, the chunk is this string. If ld is a function, load calls it repeatedly to get the chunk pieces. Each call to ld must return a string that concatenates with previous results. A return of an empty string, nil, or no value signals the end of the chunk.\nIf there are no syntactic errors, returns the compiled chunk as a function; otherwise, returns nil plus the error message.\nIf the resulting function has upvalues, the first upvalue is set to the value of the global environment or to env, if that parameter is given. When loading main chunks, the first upvalue will be the _ENV variable. ARGUMENT ADDED IN Lua 5.2.\nsource is used as the source of the chunk for error messages and debug information. When absent, it defaults to ld, if ld is a string, or to \"=(load)\" otherwise.\nThe string mode controls whether the chunk can be text or binary (that is, a precompiled chunk). It may be the string \"b\" (only binary chunks), \"t\" (only text chunks), or \"bt\" (both binary and text). The default is \"bt\". ARGUMENT ADDED IN Lua 5.2.",
+ args = "(ld: string|function [, source: string [, mode: string [, env: table]]])",
+ returns = "(function|nil [, string])",
+ },
+ loadfile = {
+ type = "function",
+ description = "Loads a chunk from file filename or from the standard input, if no file name is given.\nIf there are no syntactic errors, returns the compiled chunk as a function; otherwise, returns nil plus the error message.\nIf the resulting function has upvalues, the first upvalue is set to the value of the global environment or to env, if that parameter is given. ARGUMENT ADDED IN Lua 5.2. When loading main chunks, the first upvalue will be the _ENV variable.\nThe string mode controls whether the chunk can be text or binary (that is, a precompiled chunk). It may be the string \"b\" (only binary chunks), \"t\" (only text chunks), or \"bt\" (both binary and text). The default is \"bt\". ARGUMENT ADDED IN Lua 5.2.",
+ args = "([filename: string [, mode: string [, env: table]]])",
+ returns = "(function|nil [, string])",
+ },
+ loadstring = {
+ type = "function",
+ description = "Loads a chunk from the given string.\nIf there are no errors, returns the compiled chunk as a function; otherwise, returns nil plus the error message. The environment of the returned function is the global environment.\nTo load and run a given string, use the idiom\nassert(loadstring(s))()\nWhen absent, chunkname defaults to the given string.\nFUNCTION DEPRECATED IN Lua 5.2.",
+ args = "(string: string [, chunkname: string])",
+ returns = "(function|nil [, string])",
+ },
+ next = {
+ type = "function",
+ description = "Allows a program to traverse all fields of a table.\nIts first argument is a table and its second argument is an index in this table. next returns the next index of the table and its associated value. When called with nil as its second argument, next returns an initial index and its associated value. When called with the last index, or with nil in an empty table, next returns nil. If the second argument is absent, then it is interpreted as nil. In particular, you can use next(t) to check whether a table is empty.\nThe order in which the indices are enumerated is not specified, even for numeric indices. (To traverse a table in numeric order, use a numerical for.)\nThe behavior of next is undefined if, during the traversal, you assign any value to a non-existent field in the table. You may however modify existing fields. In particular, you may clear existing fields.",
+ args = "(table: table [, index: any])",
+ returns = "(any [, any])",
+ },
+ pairs = {
+ type = "function",
+ description = "If t has a metamethod __pairs, calls it with t as argument and returns the first three results from the call. METAMETHOD BEHAVIOR ADDED IN Lua 5.2.\nOtherwise, returns three values: the next function, the table t, and nil, so that the construction\nfor k,v in pairs(t) do body end\nwill iterate over all key–value pairs of table t.\nSee function next for the caveats of modifying the table during its traversal.",
+ args = "(t: table)",
+ returns = "(function, table, nil)",
+ },
+ pcall = {
+ type = "function",
+ description = "Calls function f with the given arguments in protected mode.\nThis means that any error inside f is not propagated; instead, pcall catches the error and returns a status code. Its first result is the status code (a boolean), which is true if the call succeeds without errors. In such case, pcall also returns all results from the call, after this first result. In case of any error, pcall returns false plus the error message.",
+ args = "(f: function [, arg1: any, ...])",
+ returns = "(boolean, ...)",
+ },
+ print = {
+ type = "function",
+ description = "Receives any number of arguments and prints their values to stdout, using the tostring function to convert each argument to a string.\nprint is not intended for formatted output, but only as a quick way to show a value, for instance for debugging. For complete control over the output, use string.format and io.write.",
+ args = "(...)",
+ returns = "()",
+ },
+ rawequal = {
+ type = "function",
+ description = "Checks whether v1 is equal to v2, without invoking any metamethod.\nReturns a boolean.",
+ args = "(v1: any, v2: any)",
+ returns = "(boolean)",
+ },
+ rawget = {
+ type = "function",
+ description = "Gets the real value of table[index], without invoking any metamethod.\ntable must be a table; index may be any value.",
+ args = "(table: table, index: any)",
+ returns = "(any)",
+ },
+ rawlen = {
+ type = "function",
+ description = "Returns the length of the object v, which must be a table or a string, without invoking any metamethod.\nReturns an integer number.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(v: table|string)",
+ returns = "(number)",
+ },
+ rawset = {
+ type = "function",
+ description = "Sets the real value of table[index] to value, without invoking any metamethod.\ntable must be a table, index any value different from nil and NaN, and value any Lua value.\nThis function returns table.",
+ args = "(table: table, index: any, value: any)",
+ returns = "(table)",
+ },
+ select = {
+ type = "function",
+ description = "If index is a number, returns all arguments after argument number index.\nA negative number indexes from the end (-1 is the last argument). NEGATIVE VALUE ADDED IN Lua 5.2.\nOtherwise, index must be the string \"#\", and select returns the total number of extra arguments it received.",
+ args = "(index: number|string, ...)",
+ returns = "(...)",
+ },
+ setfenv = {
+ type = "function",
+ description = "Sets the environment to be used by the given function.\nf can be a Lua function or a number that specifies the function at that stack level: Level 1 is the function calling setfenv. setfenv returns the given function.\nAs a special case, when f is 0 setfenv changes the environment of the running thread. In this case, setfenv returns no values.\nFUNCTION DEPRECATED IN Lua 5.2.",
+ args = "(f: function|number, table: table)",
+ returns = "([function])",
+ },
+ setmetatable = {
+ type = "function",
+ description = "Sets the metatable for the given table.\n(You cannot change the metatable of other types from Lua, only from C.)\nIf metatable is nil, removes the metatable of the given table. If the original metatable has a \"__metatable\" field, raises an error.\nThis function returns table.",
+ args = "(table: table, metatable: table|nil)",
+ returns = "(table)",
+ valuetype = "m",
+ },
+ tonumber = {
+ type = "function",
+ description = "When called with no base, tonumber tries to convert its argument to a number. If the argument is already a number or a string convertible to a number, then tonumber returns this number; otherwise, it returns nil.\nWhen called with base, then e should be a string to be interpreted as an integer numeral in that base. The base may be any integer between 2 and 36, inclusive. In bases above 10, the letter 'A' (in either upper or lower case) represents 10, 'B' represents 11, and so forth, with 'Z' representing 35. If the string e is not a valid numeral in the given base, the function returns nil.",
+ args = "(e: any [, base: number])",
+ returns = "(number|nil)",
+ },
+ tostring = {
+ type = "function",
+ description = "Receives a value of any type and converts it to a string in a reasonable format.\n(For complete control of how numbers are converted, use string.format.)\nIf the metatable of v has a \"__tostring\" field, then tostring calls the corresponding value with v as argument, and uses the result of the call as its result.",
+ args = "(v: any)",
+ returns = "(string)",
+ valuetype = "string",
+ },
+ type = {
+ type = "function",
+ description = "Returns the type of its only argument, coded as a string.\nThe possible results of this function are \"nil\" (a string, not the value nil), \"number\", \"string\", \"boolean\", \"table\", \"function\", \"thread\", and \"userdata\".",
+ args = "(v: any)",
+ returns = "(string)",
+ },
+ unpack = {
+ type = "function",
+ description = "Returns the elements from the given table.\nThis function is equivalent to\nreturn list[i], list[i+1], ···, list[j]\nexcept that the above code can be written only for a fixed number of elements. By default, i is 1 and j is the length of the list, as defined by the length operator.\nFUNCTION DEPRECATED IN Lua 5.2.",
+ args = "(list: table [, i: number [, j: number]])",
+ returns = "(...)",
+ },
+ xpcall = {
+ type = "function",
+ description = "Calls function f with the given arguments in protected mode, using msgh as a message handler.\nThis means that any error inside f is not propagated; instead, xpcall catches the error, calls the msgh function with the original error object, and returns a status code. Its first result is the status code (a boolean), which is true if the call succeeds without errors. In such case, xpcall also returns all results from the call, after this first result. In case of any error, xpcall returns false plus the result from msgh.\nADDITIONAL ARGS ADDED IN Lua 5.2.",
+ args = "(f: function, msgh: function [, arg1: any, ...])",
+ returns = "(boolean, ...)",
+ },
+
+ -- Coroutine library
+ coroutine = {
+ type = "lib",
+ description = "The operations related to coroutines comprise a sub-library of the basic library and come inside the table coroutine.\nLua supports coroutines, also called collaborative multithreading. A coroutine in Lua represents an independent thread of execution. Unlike threads in multithread systems, however, a coroutine only suspends its execution by explicitly calling a yield function.",
+ childs = {
+ create = {
+ type = "function",
+ description = "Creates a new coroutine, with body f.\nf must be a Lua function. Returns this new coroutine, an object with type \"thread\".",
+ args = "(f: function)",
+ returns = "(thread)",
+ },
+ resume = {
+ type = "function",
+ description = "Starts or continues the execution of coroutine co.\nThe first time you resume a coroutine, it starts running its body. The values val1, ... are passed as the arguments to the body function. If the coroutine has yielded, resume restarts it; the values val1, ... are passed as the results from the yield.\nIf the coroutine runs without any errors, resume returns true plus any values passed to yield (if the coroutine yields) or any values returned by the body function (if the coroutine terminates). If there is any error, resume returns false plus the error message.",
+ args = "(co: thread [, val1: any, ...])",
+ returns = "(boolean, ...)",
+ },
+ running = {
+ type = "function",
+ description = "Returns the running coroutine plus a boolean, true when the running coroutine is the main one.\nBOOLEAN RETURN ADDED IN Lua 5.2.",
+ args = "()",
+ returns = "(thread, boolean)",
+ },
+ status = {
+ type = "function",
+ description = "Returns the status of coroutine co, as a string.\nThe status can be one of the following: \"running\", if the coroutine is running (that is, it called status); \"suspended\", if the coroutine is suspended in a call to yield, or if it has not started running yet; \"normal\" if the coroutine is active but not running (that is, it has resumed another coroutine); and \"dead\" if the coroutine has finished its body function, or if it has stopped with an error.",
+ args = "(co: thread)",
+ returns = "(string)",
+ },
+ wrap = {
+ type = "function",
+ description = "Creates a new coroutine, with body f.\nf must be a Lua function. Returns a function that resumes the coroutine each time it is called. Any arguments passed to the function behave as the extra arguments to resume. Returns the same values returned by resume, except the first boolean. In case of error, propagates the error.",
+ args = "(f: function)",
+ returns = "(function)",
+ },
+ yield = {
+ type = "function",
+ description = "Suspends the execution of the calling coroutine.\nAny arguments to yield are passed as extra results to resume.",
+ args = "(...)",
+ returns = "()",
+ },
+ isyieldable = {
+ type = "function",
+ description = "Returns true when the running coroutine can yield. A running coroutine is yieldable if it is not the main thread and it is not inside a non-yieldable C function.\nFUNCTION ADDED IN Lua 5.3.",
+ args = "()",
+ returns = "(boolean)",
+ },
+ },
+ },
+
+ -- Module/Package library
+ module = {
+ type = "function",
+ description = "Creates a module.\nIf there is a table in package.loaded[name], this table is the module. Otherwise, if there is a global table t with the given name, this table is the module. Otherwise creates a new table t and sets it as the value of the global name and the value of package.loaded[name]. This function also initializes t._NAME with the given name, t._M with the module (t itself), and t._PACKAGE with the package name (the full module name minus last component; see below). Finally, module sets t as the new environment of the current function and the new value of package.loaded[name], so that require returns t.\nIf name is a compound name (that is, one with components separated by dots), module creates (or reuses, if they already exist) tables for each component.\nThis function can receive optional options after the module name, where each option is a function to be applied over the module.\nFUNCTION DEPRECATED IN Lua 5.2.",
+ args = "(name: string [, ...])",
+ returns = "()",
+ },
+ require = {
+ type = "function",
+ description = "Loads the given module.\nThe function starts by looking into the package.loaded table to determine whether modname is already loaded. If it is, then require returns the value stored at package.loaded[modname]. Otherwise, it tries to find a loader for the module.\nTo find a loader, require is guided by the package.searchers sequence. By changing this sequence, we can change how require looks for a module. The following explanation is based on the default configuration for package.searchers.\nFirst require queries package.preload[modname]. If it has a value, this value (which should be a function) is the loader. Otherwise require searches for a Lua loader using the path stored in package.path. If that also fails, it searches for a C loader using the path stored in package.cpath. If that also fails, it tries an all-in-one loader (see package.searchers).\nOnce a loader is found, require calls the loader with two arguments: modname and an extra value dependent on how it got the loader. (If the loader came from a file, this extra value is the file name.) If the loader returns any non-nil value, require assigns the returned value to package.loaded[modname]. If the loader does not return a non-nil value and has not assigned any value to package.loaded[modname], then require assigns true to this entry. In any case, require returns the final value of package.loaded[modname].\nIf there is any error loading or running the module, or if it cannot find any loader for the module, then require raises an error.",
+ args = "(modname: string)",
+ returns = "(any)",
+ },
+ package = {
+ type = "lib",
+ description = "The package library provides basic facilities for loading modules in Lua.\nIt exports one function directly in the global environment: require. Everything else is exported in a table package.",
+ childs = {
+ config = {
+ type = "value",
+ description = "A string describing some compile-time configurations for packages.\nThis string is a sequence of lines:\n* The first line is the directory separator string. Default is '\\' for Windows and '/' for all other systems.\n* The second line is the character that separates templates in a path. Default is ';'.\n* The third line is the string that marks the substitution points in a template. Default is '?'.\n* The fourth line is a string that, in a path in Windows, is replaced by the executable's directory. Default is '!'.\n* The fifth line is a mark to ignore all text before it when building the luaopen_ function name. Default is '-'.",
+ },
+ cpath = {
+ type = "value",
+ description = "The path used by require to search for a C loader.\nLua initializes the C path package.cpath in the same way it initializes the Lua path package.path, using the environment variable LUA_CPATH_5_2 or the environment variable LUA_CPATH or a default path defined in luaconf.h.",
+ },
+ loaded = {
+ type = "value",
+ description = "A table used by require to control which modules are already loaded.\nWhen you require a module modname and package.loaded[modname] is not false, require simply returns the value stored there.\nThis variable is only a reference to the real table; assignments to this variable do not change the table used by require.",
+ },
+ loaders = {
+ type = "value",
+ description = "A table used by require to control how to load modules.\nEach entry in this table is a searcher function. When looking for a module, require calls each of these searchers in ascending order, with the module name (the argument given to require) as its sole parameter. The function can return another function (the module loader) or a string explaining why it did not find that module (or nil if it has nothing to say). Lua initializes this table with four functions.\nThe first searcher simply looks for a loader in the package.preload table.\nThe second searcher looks for a loader as a Lua library, using the path stored at package.path. A path is a sequence of templates separated by semicolons. For each template, the searcher will change each interrogation mark in the template by filename, which is the module name with each dot replaced by a \"directory separator\" (such as \"/\" in Unix); then it will try to open the resulting file name.\nThe third searcher looks for a loader as a C library, using the path given by the variable package.cpath. Once it finds a C library, this searcher first uses a dynamic link facility to link the application with the library. Then it tries to find a C function inside the library to be used as the loader. The name of this C function is the string \"luaopen_\" concatenated with a copy of the module name where each dot is replaced by an underscore. Moreover, if the module name has a hyphen, its prefix up to (and including) the first hyphen is removed.\nThe fourth searcher tries an all-in-one loader. It searches the C path for a library for the root name of the given module. If found, it looks into it for an open function for the submodule. With this facility, a package can pack several C submodules into one single library, with each submodule keeping its original open function.\nVALUE DEPRECATED IN Lua 5.2.",
+ },
+ loadlib = {
+ type = "function",
+ description = "Dynamically links the host program with the C library libname.\nIf funcname is \"*\", then it only links with the library, making the symbols exported by the library available to other dynamically linked libraries. VALUE ADDED IN Lua 5.2.\nOtherwise, it looks for a function funcname inside the library and returns this function as a C function. (So, funcname must follow the prototype lua_CFunction).\nThis is a low-level function. It completely bypasses the package and module system. Unlike require, it does not perform any path searching and does not automatically adds extensions. libname must be the complete file name of the C library, including if necessary a path and an extension. funcname must be the exact name exported by the C library (which may depend on the C compiler and linker used).\nThis function is not supported by Standard C. As such, it is only available on some platforms (Windows, Linux, Mac OS X, Solaris, BSD, plus other Unix systems that support the dlfcn standard).",
+ args = "(libname: string, funcname: string)",
+ returns = "([function])",
+ },
+ path = {
+ type = "value",
+ description = "The path used by require to search for a Lua loader.\nAt start-up, Lua initializes this variable with the value of the environment variable LUA_PATH_5_2 or the environment variable LUA_PATH or with a default path defined in luaconf.h, if those environment variables are not defined. Any \";;\" in the value of the environment variable is replaced by the default path.",
+ },
+ preload = {
+ type = "value",
+ description = "A table to store loaders for specific modules (see require).\nThis variable is only a reference to the real table; assignments to this variable do not change the table used by require.",
+ },
+ searchers = {
+ type = "value",
+ description = "A table used by require to control how to load modules.\nEach entry in this table is a searcher function. When looking for a module, require calls each of these searchers in ascending order, with the module name (the argument given to require) as its sole parameter. The function can return another function (the module loader) plus an extra value that will be passed to that loader, or a string explaining why it did not find that module (or nil if it has nothing to say).\nLua initializes this table with four searcher functions.\nThe first searcher simply looks for a loader in the package.preload table.\nThe second searcher looks for a loader as a Lua library, using the path stored at package.path. The search is done as described in function package.searchpath.\nThe third searcher looks for a loader as a C library, using the path given by the variable package.cpath. Again, the search is done as described in function package.searchpath. Once it finds a C library, this searcher first uses a dynamic link facility to link the application with the library. Then it tries to find a C function inside the library to be used as the loader. The name of this C function is the string \"luaopen_\" concatenated with a copy of the module name where each dot is replaced by an underscore. Moreover, if the module name has a hyphen, its prefix up to (and including) the first hyphen is removed.\nThe fourth searcher tries an all-in-one loader. It searches the C path for a library for the root name of the given module. If found, it looks into it for an open function for the submodule. With this facility, a package can pack several C submodules into one single library, with each submodule keeping its original open function.\nAll searchers except the first one (preload) return as the extra value the file name where the module was found, as returned by package.searchpath. The first searcher returns no extra value.\nVALUE ADDED IN Lua 5.2.",
+ },
+ searchpath = {
+ type = "function",
+ description = "Searches for the given name in the given path.\nA path is a string containing a sequence of templates separated by semicolons. For each template, the function replaces each interrogation mark (if any) in the template with a copy of name wherein all occurrences of sep (a dot, by default) were replaced by rep (the system's directory separator, by default), and then tries to open the resulting file name.\nReturns the resulting name of the first file that it can open in read mode (after closing the file), or nil plus an error message if none succeeds. (This error message lists all file names it tried to open.)\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(name: string, path: string [, sep: string [, rep: string]])",
+ returns = "(string|nil [, string])",
+ },
+ seeall = {
+ type = "function",
+ description = "Sets a metatable for module with its __index field referring to the global environment, so that this module inherits values from the global environment.\nTo be used as an option to function module.\nFUNCTION DEPRECATED IN Lua 5.2.",
+ args = "(module: table)",
+ returns = "()",
+ },
+ },
+ },
+
+ -- String library
+ string = {
+ type = "lib",
+ description = "This library provides generic functions for string manipulation, such as finding and extracting substrings, and pattern matching.\nWhen indexing a string in Lua, the first character is at position 1 (not at 0, as in C). Indices are allowed to be negative and are interpreted as indexing backwards, from the end of the string. Thus, the last character is at position -1, and so on.\nThe string library provides all its functions inside the table string. It also sets a metatable for strings where the __index field points to the string table. Therefore, you can use the string functions in object-oriented style. For instance, string.byte(s,i) can be written as s:byte(i).\nThe string library assumes one-byte character encodings.",
+ childs = {
+ byte = {
+ type = "function",
+ description = "Returns the internal numerical codes of the characters s[i], s[i+1], ..., s[j].\nThe default value for i is 1; the default value for j is i. These indices are corrected following the same rules of function string.sub.\nNumerical codes are not necessarily portable across platforms.",
+ args = "(s: string [, i: number [, j: number]])",
+ returns = "(number [, ...])",
+ },
+ char = {
+ type = "function",
+ description = "Receives zero or more integers. Returns a string with length equal to the number of arguments, in which each character has the internal numerical code equal to its corresponding argument.\nNumerical codes are not necessarily portable across platforms.",
+ args = "(...)",
+ returns = "(string)",
+ valuetype = "string",
+ },
+ dump = {
+ type = "function",
+ description = "Returns a string containing a binary representation of the given function, so that a later load on this string returns a copy of the function (but with new upvalues).",
+ args = "(function: function)",
+ returns = "(string)",
+ valuetype = "string",
+ },
+ find = {
+ type = "function",
+ description = "Looks for the first match of pattern in the string s.\nIf it finds a match, then find returns the indices of s where this occurrence starts and ends; otherwise, it returns nil.\nA third, optional numerical argument init specifies where to start the search; its default value is 1 and can be negative. A value of true as a fourth, optional argument plain turns off the pattern matching facilities, so the function does a plain \"find substring\" operation, with no characters in pattern being considered magic. Note that if plain is given, then init must be given as well.\nIf the pattern has captures, then in a successful match the captured values are also returned, after the two indices.",
+ args = "(s: string, pattern: string [, init: number [, plain: boolean]])",
+ returns = "(number|nil [, number [, ...]])",
+ },
+ format = {
+ type = "function",
+ description = "Returns a formatted version of its variable number of arguments following the description given in its first argument (which must be a string).\nThe format string follows the same rules as the C function sprintf. The only differences are that the options/modifiers *, h, L, l, n, and p are not supported and that there is an extra option, q. The q option formats a string between double quotes, using escape sequences when necessary to ensure that it can safely be read back by the Lua interpreter.\nOptions A and a (when available) (VALUES ADDED IN Lua 5.2), E, e, f, G, and g all expect a number as argument. Options c, d, i, o, u, X, and x also expect a number, but the range of that number may be limited by the underlying C implementation. For options o, u, X, and x, the number cannot be negative. Option q expects a string; option s expects a string without embedded zeros. If the argument to option s is not a string, it is converted to one following the same rules of tostring (BEHAVIOR ADDED IN Lua 5.2).",
+ args = "(formatstring, ...)",
+ returns = "(string)",
+ valuetype = "string",
+ },
+ gmatch = {
+ type = "function",
+ description = "Returns an iterator function that, each time it is called, returns the next captures from pattern over the string s.\nIf pattern specifies no captures, then the whole match is produced in each call.\nFor this function, a caret '^' at the start of a pattern does not work as an anchor, as this would prevent the iteration.",
+ args = "(s: string, pattern: string)",
+ returns = "(function)",
+ },
+ pack = {
+ type = "function",
+ description = "Returns a binary string containing the values v1, v2, etc. packed (that is, serialized in binary form) according to the format string fmt.\nFUNCTION ADDED IN Lua 5.3.",
+ args = "(fmt: string, v1, v2, ...)",
+ returns = "(string)",
+ valuetype = "string",
+ },
+ unpack = {
+ type = "function",
+ description = "Returns the values packed in string s (see string.pack) according to the format string fmt. An optional pos marks where to start reading in s (default is 1). After the read values, this function also returns the index of the first unread byte in s.\nFUNCTION ADDED IN Lua 5.3.",
+ args = "(fmt: string, s: string [, pos: number])",
+ returns = "(values)",
+ },
+ packsize = {
+ type = "function",
+ description = "Returns the size of a string resulting from string.pack with the given format. The format string cannot have the variable-length options 's' or 'z'.\nFUNCTION ADDED IN Lua 5.3.",
+ args = "(fmt: string)",
+ returns = "(number)",
+ },
+ gsub = {
+ type = "function",
+ description = "Returns a copy of s in which all (or the first n, if given) occurrences of the pattern have been replaced by a replacement string specified by repl, which can be a string, a table, or a function.\ngsub also returns, as its second value, the total number of matches that occurred. The name gsub comes from Global SUBstitution.\nIf repl is a string, then its value is used for replacement. The character % works as an escape character: any sequence in repl of the form %d, with d between 1 and 9, stands for the value of the d-th captured substring. The sequence %0 stands for the whole match. The sequence %% stands for a single %.\nIf repl is a table, then the table is queried for every match, using the first capture as the key.\nIf repl is a function, then this function is called every time a match occurs, with all captured substrings passed as arguments, in order.\nIn any case, if the pattern specifies no captures, then it behaves as if the whole pattern was inside a capture.\nIf the value returned by the table query or by the function call is a string or a number, then it is used as the replacement string; otherwise, if it is false or nil, then there is no replacement (that is, the original match is kept in the string).",
+ args = "(s: string, pattern: string, repl: string|table|function [, n: number])",
+ returns = "(string, number)",
+ valuetype = "string",
+ },
+ len = {
+ type = "function",
+ description = "Receives a string and returns its length.\nThe empty string \"\" has length 0. Embedded zeros are counted, so \"a\\000bc\\000\" has length 5.",
+ args = "(s: string)",
+ returns = "(number)",
+ },
+ lower = {
+ type = "function",
+ description = "Receives a string and returns a copy of this string with all uppercase letters changed to lowercase.\nAll other characters are left unchanged. The definition of what an uppercase letter is depends on the current locale.",
+ args = "(s: string)",
+ returns = "(string)",
+ valuetype = "string",
+ },
+ match = {
+ type = "function",
+ description = "Looks for the first match of pattern in the string s.\nIf it finds one, then match returns the captures from the pattern; otherwise it returns nil.\nIf pattern specifies no captures, then the whole match is returned. A third, optional numerical argument init specifies where to start the search; its default value is 1 and can be negative.",
+ args = "(s: string, pattern: string [, init: number])",
+ returns = "(string|nil [,...])",
+ valuetype = "string",
+ },
+ rep = {
+ type = "function",
+ description = "Returns a string that is the concatenation of n copies of the string s separated by the string sep.\nThe default value for sep is the empty string (that is, no separator). ARGUMENT ADDED IN Lua 5.2.",
+ args = "(s: string, n: number [, sep: string])",
+ returns = "(string)",
+ valuetype = "string",
+ },
+ reverse = {
+ type = "function",
+ description = "Returns a string that is the string s reversed.",
+ args = "(s: string)",
+ returns = "(string)",
+ valuetype = "string",
+ },
+ sub = {
+ type = "function",
+ description = "Returns the substring of s that starts at i and continues until j; i and j can be negative.\nIf j is absent, then it is assumed to be equal to -1 (which is the same as the string length). In particular, the call string.sub(s,1,j) returns a prefix of s with length j, and string.sub(s, -i) returns a suffix of s with length i.\nIf, after the translation of negative indices, i is less than 1, it is corrected to 1. If j is greater than the string length, it is corrected to that length. If, after these corrections, i is greater than j, the function returns the empty string.",
+ args = "(s: string, i: number [, j: number])",
+ returns = "(string)",
+ valuetype = "string",
+ },
+ upper = {
+ type = "function",
+ description = "Receives a string and returns a copy of this string with all lowercase letters changed to uppercase.\nAll other characters are left unchanged. The definition of what a lowercase letter is depends on the current locale.",
+ args = "(s: string)",
+ returns = "(string)",
+ valuetype = "string",
+ },
+ },
+ },
+
+ -- Table library
+ table = {
+ type = "lib",
+ description = "This library provides generic functions for table manipulation. It provides all its functions inside the table table.\nRemember that, whenever an operation needs the length of a table, the table should be a proper sequence or have a __len metamethod. All functions ignore non-numeric keys in tables given as arguments.\nFor performance reasons, all table accesses (get/set) performed by these functions are raw.",
+ childs = {
+ concat = {
+ type = "function",
+ description = "Given a list where all elements are strings or numbers, returns list[i]..sep..list[i+1] ··· sep..list[j].\nThe default value for sep is the empty string, the default for i is 1, and the default for j is #list. If i is greater than j, returns the empty string.",
+ args = "(list: table [, sep: string [, i: number [, j: number]]])",
+ returns = "(string)",
+ valuetype = "string",
+ },
+ insert = {
+ type = "function",
+ description = "Inserts element value at position pos in list, shifting up the elements list[pos], list[pos+1], ···, list[#list].\nThe default value for pos is #list+1, so that a call table.insert(t,x) inserts x at the end of list t.",
+ args = "(list: table, [pos: number,] value: any)",
+ returns = "()",
+ },
+ maxn = {
+ type = "function",
+ description = "Returns the largest positive numerical index of the given table, or zero if the table has no positive numerical indices.\n(To do its job this function does a linear traversal of the whole table.)\nFUNCTION DEPRECATED IN Lua 5.2.",
+ args = "(table: table)",
+ returns = "(number)",
+ },
+ pack = {
+ type = "function",
+ description = "Returns a new table with all parameters stored into keys 1, 2, etc. and with a field \"n\" with the total number of parameters.\nNote that the resulting table may not be a sequence.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(...)",
+ returns = "(table)",
+ },
+ move = {
+ type = "function",
+ description = "Moves elements from table a1 to table a2. This function performs the equivalent to the following multiple assignment: a2[t],··· = a1[f],···,a1[e]. The default for a2 is a1. The destination range can overlap with the source range. Index f must be positive.\nFUNCTION ADDED IN Lua 5.3.",
+ args = "(a1: table, f, e, t [,a2: table])",
+ returns = "()",
+ },
+ remove = {
+ type = "function",
+ description = "Removes from list the element at position pos, shifting down the elements list[pos+1], list[pos+2], ···, list[#list] and erasing element list[#list].\nReturns the value of the removed element.\nThe default value for pos is #list, so that a call table.remove(t) removes the last element of list t.",
+ args = "(list: table [, pos: number])",
+ returns = "(any)",
+ },
+ sort = {
+ type = "function",
+ description = "Sorts list elements in a given order, in-place, from list[1] to list[#list].\nIf comp is given, then it must be a function that receives two list elements and returns true when the first element must come before the second in the final order (so that not comp(list[i+1],list[i]) will be true after the sort). If comp is not given, then the standard Lua operator < is used instead.\nThe sort algorithm is not stable; that is, elements considered equal by the given order may have their relative positions changed by the sort.",
+ args = "(list: table [, comp: function])",
+ returns = "()",
+ },
+ unpack = {
+ type = "function",
+ description = "Returns the elements from the given table.\nThis function is equivalent to\nreturn list[i], list[i+1], ···, list[j]\nBy default, i is 1 and j is #list.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(list: table [, i: number [, j: number]])",
+ returns = "(...)",
+ },
+ },
+ },
+
+ -- Math library
+ math = {
+ type = "lib",
+ description = "This library is an interface to the standard C math library. It provides all its functions inside the table math.",
+ childs = {
+ abs = {
+ type = "function",
+ description = "Returns the absolute value of x.",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ acos = {
+ type = "function",
+ description = "Returns the arc cosine of x (in radians).",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ asin = {
+ type = "function",
+ description = "Returns the arc sine of x (in radians).",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ atan = {
+ type = "function",
+ description = "Returns the arc tangent of x (in radians).",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ atan2 = {
+ type = "function",
+ description = "Returns the arc tangent of y/x (in radians), but uses the signs of both parameters to find the quadrant of the result.\n(It also handles correctly the case of x being zero.)",
+ args = "(y: number, x: number)",
+ returns = "(number)",
+ },
+ ceil = {
+ type = "function",
+ description = "Returns the smallest integer larger than or equal to x.",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ cos = {
+ type = "function",
+ description = "Returns the cosine of x (assumed to be in radians).",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ cosh = {
+ type = "function",
+ description = "Returns the hyperbolic cosine of x.",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ deg = {
+ type = "function",
+ description = "Returns the angle x (given in radians) in degrees.",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ exp = {
+ type = "function",
+ description = "Returns the value exp(x).",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ floor = {
+ type = "function",
+ description = "Returns the largest integer smaller than or equal to x.",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ fmod = {
+ type = "function",
+ description = "Returns the remainder of the division of x by y that rounds the quotient towards zero.",
+ args = "(x: number, y: number)",
+ returns = "(number)",
+ },
+ frexp = {
+ type = "function",
+ description = "Returns m and e such that x = m2^e, e is an integer and the absolute value of m is in the range [0.5, 1) (or zero when x is zero).",
+ args = "(x: number)",
+ returns = "(number, number)",
+ },
+ huge = {
+ type = "value",
+ description = "The value HUGE_VAL, a value larger than or equal to any other numerical value.",
+ },
+ ldexp = {
+ type = "function",
+ description = "Returns m2^e (e should be an integer).",
+ args = "(m: number, e: number)",
+ returns = "(number)",
+ },
+ log = {
+ type = "function",
+ description = "Returns the logarithm of x in the given base.\nThe default for base is e (so that the function returns the natural logarithm of x). ARGUMENT ADDED IN Lua 5.2.",
+ args = "(x: number [, base: number])",
+ returns = "(number)",
+ },
+ log10 = {
+ type = "function",
+ description = "Returns the base-10 logarithm of x.\nFUNCTION DEPRECATED IN Lua 5.2.",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ max = {
+ type = "function",
+ description = "Returns the maximum value among its arguments.",
+ args = "(x: number, ...)",
+ returns = "(number)",
+ },
+ min = {
+ type = "function",
+ description = "Returns the minimum value among its arguments.",
+ args = "(x: number, ...)",
+ returns = "(number)",
+ },
+ modf = {
+ type = "function",
+ description = "Returns two numbers, the integral part of x and the fractional part of x.",
+ args = "(x: number)",
+ returns = "(number, number)",
+ },
+ pi = {
+ type = "value",
+ description = "The value of pi.",
+ },
+ mininteger = {
+ type = "value",
+ description = "An integer with the minimum value for an integer.\nVALUE ADDED IN Lua 5.3.",
+ },
+ maxinteger = {
+ type = "value",
+ description = "An integer with the maximum value for an integer.\nVALUE ADDED IN Lua 5.3.",
+ },
+ pow = {
+ type = "function",
+ description = "Returns x^y.\n(You can also use the expression x^y to compute this value.)",
+ args = "(x: number, y: number)",
+ returns = "(number)",
+ },
+ rad = {
+ type = "function",
+ description = "Returns the angle x (given in degrees) in radians.",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ random = {
+ type = "function",
+ description = "This function is an interface to the simple pseudo-random generator function rand provided by Standard C.\n(No guarantees can be given for its statistical properties.)\nWhen called without arguments, returns a uniform pseudo-random real number in the range [0,1). When called with an integer number m, math.random returns a uniform pseudo-random integer in the range [1, m]. When called with two integer numbers m and n, math.random returns a uniform pseudo-random integer in the range [m, n].",
+ args = "([m: number [, n: number]])",
+ returns = "(number)",
+ },
+ randomseed = {
+ type = "function",
+ description = "Sets x as the \"seed\" for the pseudo-random generator: equal seeds produce equal sequences of numbers.",
+ args = "(x: number)",
+ returns = "()",
+ },
+ sin = {
+ type = "function",
+ description = "Returns the sine of x (assumed to be in radians).",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ sinh = {
+ type = "function",
+ description = "Returns the hyperbolic sine of x.",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ sqrt = {
+ type = "function",
+ description = "Returns the square root of x.\n(You can also use the expression x^0.5 to compute this value.)",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ tan = {
+ type = "function",
+ description = "Returns the tangent of x (assumed to be in radians).",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ tanh = {
+ type = "function",
+ description = "Returns the hyperbolic tangent of x.",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ type = {
+ type = "function",
+ description = [[Returns "integer" if x is an integer, "float" if it is a float, or nil if x is not a number.\nFUNCTION ADDED IN Lua 5.3.]],
+ args = "(x: number)",
+ returns = "(string)",
+ },
+ tointeger = {
+ type = "function",
+ description = "If the value x is convertible to an integer, returns that integer. Otherwise, returns nil.\nFUNCTION ADDED IN Lua 5.3.",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ ult = {
+ type = "function",
+ description = "Returns a boolean, true if integer m is below integer n when they are compared as unsigned integers.\nFUNCTION ADDED IN Lua 5.3.",
+ args = "(m: number, n: number)",
+ returns = "(boolean)",
+ },
+ },
+ },
+
+ -- Bitwise library
+ bit32 = {
+ type = "lib",
+ description = "This library provides bitwise operations. It provides all its functions inside the table bit32.\nUnless otherwise stated, all functions accept numeric arguments in the range (-2^51,+2^51); each argument is normalized to the remainder of its division by 2^32 and truncated to an integer (in some unspecified way), so that its final value falls in the range [0,2^32 - 1]. Similarly, all results are in the range [0,2^32 - 1]. Note that bit32.bnot(0) is 0xFFFFFFFF, which is different from -1.",
+ childs = {
+ arshift = {
+ type = "function",
+ description = "Returns the number x shifted disp bits to the right.\nThe number disp may be any representable integer. Negative displacements shift to the left.\nThis shift operation is what is called arithmetic shift. Vacant bits on the left are filled with copies of the higher bit of x; vacant bits on the right are filled with zeros. In particular, displacements with absolute values higher than 31 result in zero or 0xFFFFFFFF (all original bits are shifted out).\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(x: number, disp: number)",
+ returns = "(number)",
+ },
+ band = {
+ type = "function",
+ description = "Returns the bitwise and of its operands.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(...)",
+ returns = "(number)",
+ },
+ bnot = {
+ type = "function",
+ description = "Returns the bitwise negation of x.\nFor any integer x, the following identity holds:\nassert(bit32.bnot(x) == (-1 - x) % 2^32)\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ bor = {
+ type = "function",
+ description = "Returns the bitwise or of its operands.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(...)",
+ returns = "(number)",
+ },
+ btest = {
+ type = "function",
+ description = "Returns a boolean signaling whether the bitwise and of its operands is different from zero.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(...)",
+ returns = "(boolean)",
+ },
+ bxor = {
+ type = "function",
+ description = "Returns the bitwise exclusive or of its operands.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(...)",
+ returns = "(number)",
+ },
+ extract = {
+ type = "function",
+ description = "Returns the unsigned number formed by the bits field to field + width - 1 from n.\nBits are numbered from 0 (least significant) to 31 (most significant). All accessed bits must be in the range [0, 31].\nThe default for width is 1.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(n: number, field: number [, width: number])",
+ returns = "(number)",
+ },
+ replace = {
+ type = "function",
+ description = "Returns a copy of n with the bits field to field + width - 1 replaced by the value v.\nBits are numbered from 0 (least significant) to 31 (most significant). All accessed bits must be in the range [0, 31].\nThe default for width is 1.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(n: number, v: number, field: number [, width: number])",
+ returns = "(number)",
+ },
+ lrotate = {
+ type = "function",
+ description = "Returns the number x rotated disp bits to the left.\nThe number disp may be any representable integer.\nFor any valid displacement, the following identity holds:\nassert(bit32.lrotate(x, disp) == bit32.lrotate(x, disp % 32))\nIn particular, negative displacements rotate to the right.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(x: number, disp: number)",
+ returns = "(number)",
+ },
+ lshift = {
+ type = "function",
+ description = "Returns the number x shifted disp bits to the left.\nThe number disp may be any representable integer. Negative displacements shift to the right. In any direction, vacant bits are filled with zeros. In particular, displacements with absolute values higher than 31 result in zero (all bits are shifted out).\nFor positive displacements, the following equality holds:\nassert(bit32.lshift(b, disp) == (b * 2^disp) % 2^32)\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(x: number, disp: number)",
+ returns = "(number)",
+ },
+ rrotate = {
+ type = "function",
+ description = "Returns the number x rotated disp bits to the right.\nThe number disp may be any representable integer.\nFor any valid displacement, the following identity holds:\nassert(bit32.rrotate(x, disp) == bit32.rrotate(x, disp % 32))\nIn particular, negative displacements rotate to the left.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(x: number, disp: number)",
+ returns = "(number)",
+ },
+ rshift = {
+ type = "function",
+ description = "Returns the number x shifted disp bits to the right.\nThe number disp may be any representable integer. Negative displacements shift to the left. In any direction, vacant bits are filled with zeros. In particular, displacements with absolute values higher than 31 result in zero (all bits are shifted out).\nFor positive displacements, the following equality holds:\nassert(bit32.rshift(b, disp) == math.floor(b % 2^32 / 2^disp))\nThis shift operation is what is called logical shift.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(x: number, disp: number)",
+ returns = "(number)",
+ },
+ },
+ },
+
+ -- I/O library
+ io = {
+ type = "lib",
+ description = "The I/O library provides two different styles for file manipulation. The first one uses implicit file descriptors; that is, there are operations to set a default input file and a default output file, and all input/output operations are over these default files. The second style uses explicit file descriptors.\nWhen using implicit file descriptors, all operations are supplied by table io. When using explicit file descriptors, the operation io.open returns a file descriptor and then all operations are supplied as methods of the file descriptor.\nThe table io also provides three predefined file descriptors with their usual meanings from C: io.stdin, io.stdout, and io.stderr. The I/O library never closes these files.\nUnless otherwise stated, all I/O functions return nil on failure (plus an error message as a second result and a system-dependent error code as a third result) and some value different from nil on success.",
+ childs = {
+ stdin = { type = "value" },
+ stdout = { type = "value" },
+ stderr = { type = "value" },
+ close = {
+ type = "function",
+ description = "Closes file. Equivalent to file:close().\nWithout a file, closes the default output file.",
+ args = "([file: file])",
+ returns = "(boolean|nil [, string, number])",
+ },
+ flush = {
+ type = "function",
+ description = "Saves any written data to the default output file. Equivalent to io.output():flush().",
+ args = "()",
+ returns = "()",
+ },
+ input = {
+ type = "function",
+ description = "When called with a file name, it opens the named file (in text mode), and sets its handle as the default input file. When called with a file handle, it simply sets this file handle as the default input file. When called without parameters, it returns the current default input file.\nIn case of errors this function raises the error, instead of returning an error code.",
+ args = "([file: string|file])",
+ returns = "([file])",
+ valuetype = "f",
+ },
+ lines = {
+ type = "function",
+ description = "Opens the given file name in read mode and returns an iterator function that, each time it is called, reads the file according to the given formats.\nWhen no format is given, uses \"*l\" as a default. ARGUMENT ADDED IN Lua 5.2.\nWhen the iterator function detects the end of file, it returns nil (to finish the loop) and automatically closes the file.\nThe call io.lines() (with no file name) is equivalent to io.input():lines(); that is, it iterates over the lines of the default input file. In this case it does not close the file when the loop ends.\nIn case of errors this function raises the error, instead of returning an error code.",
+ args = "([filename: string, ...])",
+ returns = "(function)",
+ },
+ open = {
+ type = "function",
+ description = "This function opens a file, in the mode specified in the string mode.\nIt returns a new file handle, or, in case of errors, nil plus an error message.\nThe mode string can be any of the following:\n* \"r\": read mode (the default);\n* \"w\": write mode;\n* \"a\": append mode;\n* \"r+\": update mode, all previous data is preserved;\n* \"w+\": update mode, all previous data is erased;\n* \"a+\": append update mode, previous data is preserved, writing is only allowed at the end of file.\nThe mode string can also have a 'b' at the end, which is needed in some systems to open the file in binary mode.",
+ args = "(filename: string [, mode: string])",
+ returns = "(file|nil [, string])",
+ valuetype = "f",
+ },
+ output = {
+ type = "function",
+ description = "When called with a file name, it opens the named file (in text mode), and sets its handle as the default output file. When called with a file handle, it simply sets this file handle as the default output file. When called without parameters, it returns the current default output file.\nIn case of errors this function raises the error, instead of returning an error code.",
+ args = "([file: string|file])",
+ returns = "([file])",
+ valuetype = "f",
+ },
+ popen = {
+ type = "function",
+ description = "Starts program prog in a separated process and returns a file handle that you can use to read data from this program (if mode is \"r\", the default) or to write data to this program (if mode is \"w\").\nThis function is system dependent and is not available on all platforms.",
+ args = "(prog: string [, mode: string])",
+ returns = "(file|nil [, string])",
+ valuetype = "f",
+ },
+ read = {
+ type = "function",
+ description = "Reads the default input file, according to the given formats. Equivalent to io.input():read(...).",
+ args = "(...)",
+ returns = "(...)",
+ },
+ tmpfile = {
+ type = "function",
+ description = "Returns a handle for a temporary file.\nThis file is opened in update mode and it is automatically removed when the program ends.",
+ args = "()",
+ returns = "(file)",
+ valuetype = "f",
+ },
+ type = {
+ type = "function",
+ description = "Checks whether obj is a valid file handle.\nReturns the string \"file\" if obj is an open file handle, \"closed file\" if obj is a closed file handle, or nil if obj is not a file handle.",
+ args = "(obj: file)",
+ returns = "(string|nil)",
+ },
+ write = {
+ type = "function",
+ description = "Writes the value of each of its arguments to the default output file. Equivalent to io.output():write(...).",
+ args = "(...)",
+ returns = "(file|nil [, string])",
+ },
+ },
+ },
+
+ f = {
+ type = "class",
+ description = "Pseudoclass for operations on file handles.",
+ childs = {
+ close = {
+ type = "method",
+ description = "Closes file.\nNote that files are automatically closed when their handles are garbage collected, but that takes an unpredictable amount of time to happen.\nWhen closing a file handle created with io.popen, file:close returns the same values returned by os.execute. RETURN SPECIAL CASE ADDED IN Lua 5.2.",
+ args = "(file: file)",
+ returns = "(boolean|nil [, string, number])",
+ },
+ flush = {
+ type = "method",
+ description = "Saves any written data to file.",
+ args = "(file: file)",
+ returns = "(boolean|nil [, string])",
+ },
+ lines = {
+ type = "method",
+ description = "Returns an iterator function that, each time it is called, reads the file according to the given formats.\nWhen no format is given, uses \"*l\" as a default. ARGUMENT ADDED IN Lua 5.2.\nUnlike io.lines, this function does not close the file when the loop ends.\nIn case of errors this function raises the error, instead of returning an error code.",
+ args = "(file: file, ...)",
+ returns = "(function)",
+ },
+ read = {
+ type = "method",
+ description = "Reads the file file, according to the given formats, which specify what to read.\nFor each format, the function returns a string (or a number) with the characters read, or nil if it cannot read data with the specified format. When called without formats, it uses a default format that reads the next line (see below).\nThe available formats are\n* \"*n\": reads a number; this is the only format that returns a number instead of a string.\n* \"*a\": reads the whole file, starting at the current position. On end of file, it returns the empty string.\n* \"*l\": reads the next line skipping the end of line, returning nil on end of file. This is the default format.\n* \"*L\": reads the next line keeping the end of line (if present), returning nil on end of file. VALUE ADDED IN Lua 5.2.\n* number: reads a string with up to this number of bytes, returning nil on end of file. If number is zero, it reads nothing and returns an empty string, or nil on end of file.",
+ args = "(file: file, ...)",
+ returns = "(...)",
+ },
+ seek = {
+ type = "method",
+ description = "Sets and gets the file position, measured from the beginning of the file, to the position given by offset plus a base specified by the string whence.\nThe string whence is specified as follows:\n* \"set\": base is position 0 (beginning of the file);\n* \"cur\": base is current position;\n* \"end\": base is end of file.\nIn case of success, seek returns the final file position, measured in bytes from the beginning of the file. If seek fails, it returns nil, plus a string describing the error.\nThe default value for whence is \"cur\", and for offset is 0. Therefore, the call file:seek() returns the current file position, without changing it; the call file:seek(\"set\") sets the position to the beginning of the file (and returns 0); and the call file:seek(\"end\") sets the position to the end of the file, and returns its size.",
+ args = "(file: file, [whence: string [, offset: number]])",
+ returns = "(number|nil [, string])",
+ },
+ setvbuf = {
+ type = "method",
+ description = "Sets the buffering mode for an output file.\nThere are three available modes:\n* \"no\": no buffering; the result of any output operation appears immediately.\n* \"full\": full buffering; output operation is performed only when the buffer is full or when you explicitly flush the file (see io.flush).\n* \"line\": line buffering; output is buffered until a newline is output or there is any input from some special files (such as a terminal device).\nFor the last two cases, size specifies the size of the buffer, in bytes. The default is an appropriate size.",
+ args = "(file: file, mode: string [, size: number])",
+ returns = "(boolean|nil [, string])",
+ },
+ write = {
+ type = "method",
+ description = "Writes the value of each of its arguments to file.\nThe arguments must be strings or numbers.\nIn case of success, this function returns file (RETURN CHANGED IN Lua 5.2, BOOLEAN IN LUA 5.1). Otherwise it returns nil plus a string describing the error.",
+ args = "(file: file, ...)",
+ returns = "(file|nil [, string])",
+ },
+ },
+ },
+
+ m = {
+ type = "class",
+ description = "Pseudoclass for metamethods.",
+ childs = {
+ __add = {
+ type = "function",
+ description = "The + operation.",
+ args = "(op1, op2)",
+ returns = "(value)",
+ },
+ __sub = {
+ type = "function",
+ description = "The - operation.",
+ args = "(op1, op2)",
+ returns = "(value)",
+ },
+ __mul = {
+ type = "function",
+ description = "The * operation.",
+ args = "(op1, op2)",
+ returns = "(value)",
+ },
+ __div = {
+ type = "function",
+ description = "The / operation.",
+ args = "(op1, op2)",
+ returns = "(value)",
+ },
+ __mod = {
+ type = "function",
+ description = "The % operation. Behavior similar to the 'add' operation, with the operation o1 - floor(o1/o2)*o2 as the primitive operation.",
+ args = "(op1, op2)",
+ returns = "(value)",
+ },
+ __pow = {
+ type = "function",
+ description = "The ^ (exponentiation) operation. Behavior similar to the 'add' operation, with the function pow (from the C math library) as the primitive operation.",
+ args = "(op1, op2)",
+ returns = "(value)",
+ },
+ __concat = {
+ type = "function",
+ description = "The .. (concatenation) operation.",
+ args = "(op1, op2)",
+ returns = "(value)",
+ },
+ __unm = {
+ type = "function",
+ description = "The unary - operation.",
+ args = "(op)",
+ returns = "(value)",
+ },
+ __len = {
+ type = "function",
+ description = "The # (length) operation.",
+ args = "(op)",
+ returns = "(value)",
+ },
+ __eq = {
+ type = "function",
+ description = "The == operation. A metamethod is selected only when both values being compared have the same type and the same metamethod for the selected operation, and the values are either tables or full userdata.",
+ args = "(op1, op2)",
+ returns = "(boolean)",
+ },
+ __lt = {
+ type = "function",
+ description = "The < operation.",
+ args = "(op1, op2)",
+ returns = "(boolean)",
+ },
+ __le = {
+ type = "function",
+ description = "The <= operation. Note that, in the absence of a 'le' metamethod, Lua tries the 'lt', assuming that a <= b is equivalent to not (b < a).",
+ args = "(op1, op2)",
+ returns = "(boolean)",
+ },
+ __index = {
+ type = "function",
+ description = "The indexing access table[key]. Note that the metamethod is tried only when key is not present in table. When table is not a table, no key is ever present, so the metamethod is always tried.",
+ args = "(table, key)",
+ returns = "(value)",
+ },
+ __newindex = {
+ type = "function",
+ description = "The indexing assignment table[key] = value. Note that the metamethod is tried only when key is not present in table.",
+ args = "(table, key, value)",
+ returns = "(value)",
+ },
+ __call = {
+ type = "function",
+ description = "This method is called when Lua calls a value.",
+ args = "(func, ...)",
+ returns = "(values)",
+ },
+ __tostring = {
+ type = "function",
+ description = "Control string representation. When the builtin 'tostring(table)' function is called, if the metatable for myTable has a __tostring property set to a function, that function is invoked (passing table to it) and the return value is used as the string representation.",
+ args = "(op)",
+ returns = "(value)",
+ },
+ __pairs = {
+ type = "function",
+ description = "This method is called when pairs() is called and returns the first three results from the call (Lua 5.2+).",
+ args = "(table)",
+ returns = "(iterator, table, key)",
+ },
+ __ipairs = {
+ type = "function",
+ description = "This method is called when ipairs() is called and returns the first three results from the call (Lua 5.2+).",
+ args = "(table)",
+ returns = "(iterator, table, index)",
+ },
+ __gc = {
+ type = "function",
+ description = "Finalizer method. When userdata/table is set to be garbage collected, if the metatable has a __gc field pointing to a function, that function is first invoked, passing the userdata to it. Starting from Lua 5.2 this method is also called for tables.",
+ args = "(func, ...)",
+ returns = "(values)",
+ },
+ __mode = {
+ type = "value",
+ description = "Value that controls 'weakness' of the table. If the __mode field is a string containing the character 'k', the keys in the table are weak. If __mode contains 'v', the values in the table are weak.",
+ },
+ __metatable = {
+ type = "value",
+ description = "Value to hide the metatable. This value is returned as the result of getmetatable() call.",
+ },
+ },
+ },
+
+ -- OS library
+ os = {
+ type = "lib",
+ description = "This library is implemented through table os.",
+ childs = {
+ clock = {
+ type = "function",
+ description = "Returns an approximation of the amount in seconds of CPU time used by the program.",
+ args = "()",
+ returns = "(number)",
+ },
+ date = {
+ type = "function",
+ description = "Returns a string or a table containing date and time, formatted according to the given string format.\nIf the time argument is present, this is the time to be formatted (see the os.time function for a description of this value). Otherwise, date formats the current time.\nIf format starts with '!', then the date is formatted in Coordinated Universal Time. After this optional character, if format is the string \"*t\", then date returns a table with the following fields: year (four digits), month (1–12), day (1–31), hour (0–23), min (0–59), sec (0–61), wday (weekday, Sunday is 1), yday (day of the year), and isdst (daylight saving flag, a boolean). This last field may be absent if the information is not available.\nIf format is not \"*t\", then date returns the date as a string, formatted according to the same rules as the C function strftime.\nWhen called without arguments, date returns a reasonable date and time representation that depends on the host system and on the current locale (that is, os.date() is equivalent to os.date(\"%c\")).\nOn some systems, this function may be not thread safe.",
+ args = "([format: string [, time: number]])",
+ returns = "(string|table)",
+ },
+ difftime = {
+ type = "function",
+ description = "Returns the number of seconds from time t1 to time t2.\nIn POSIX, Windows, and some other systems, this value is exactly t2-t1.",
+ args = "(t2: number, t1: number)",
+ returns = "(number)",
+ },
+ execute = {
+ type = "function",
+ description = "This function is equivalent to the C function system. It passes command to be executed by an operating system shell.\nRETURNS IN Lua 5.2:\nIts first result is true if the command terminated successfully, or nil otherwise. After this first result the function returns a string and a number, as follows:\n* \"exit\": the command terminated normally; the following number is the exit status of the command.\n* \"signal\": the command was terminated by a signal; the following number is the signal that terminated the command.\nWhen called without a command, os.execute returns a boolean that is true if a shell is available.\nRETURNS IN LUA 5.1:\nIt returns a status code, which is system-dependent. If command is absent, then it returns nonzero if a shell is available and zero otherwise.",
+ args = "([command: string])",
+ returns = "(boolean|nil [, string, number])",
+ },
+ exit = {
+ type = "function",
+ description = "Calls the C function exit to terminate the host program.\nIf code is true, the returned status is EXIT_SUCCESS; if code is false, the returned status is EXIT_FAILURE; if code is a number, the returned status is this number. The default value for code is true. BOOLEAN VALUE ADDED IN Lua 5.2.\nIf the optional second argument close is true, closes the Lua state before exiting. ARGUMENT ADDED IN Lua 5.2.",
+ args = "([code: boolean|number [, close: boolean]])",
+ returns = "()",
+ },
+ getenv = {
+ type = "function",
+ description = "Returns the value of the process environment variable varname, or nil if the variable is not defined.",
+ args = "(varname: string)",
+ returns = "(string|nil)",
+ },
+ remove = {
+ type = "function",
+ description = "Deletes the file (or empty directory, on POSIX systems) with the given name.\nIf this function fails, it returns nil, plus a string describing the error and the error code.",
+ args = "(filename: string)",
+ returns = "(boolean|nil [, string, number])",
+ },
+ rename = {
+ type = "function",
+ description = "Renames file or directory named oldname to newname.\nIf this function fails, it returns nil, plus a string describing the error and the error code.",
+ args = "(oldname: string, newname: string)",
+ returns = "(boolean|nil [, string, number])",
+ },
+ setlocale = {
+ type = "function",
+ description = "Sets the current locale of the program.\nlocale is a system-dependent string specifying a locale; category is an optional string describing which category to change: \"all\", \"collate\", \"ctype\", \"monetary\", \"numeric\", or \"time\"; the default category is \"all\". The function returns the name of the new locale, or nil if the request cannot be honored.\nIf locale is the empty string, the current locale is set to an implementation-defined native locale. If locale is the string \"C\", the current locale is set to the standard C locale.When called with nil as the first argument, this function only returns the name of the current locale for the given category.",
+ args = "(locale: string [, category: string])",
+ returns = "(string|nil)",
+ },
+ time = {
+ type = "function",
+ description = "Returns the current time when called without arguments, or a time representing the date and time specified by the given table.\nThis table must have fields year, month, and day, and may have fields hour (default is 12), min (default is 0), sec (default is 0), and isdst (default is nil). For a description of these fields, see the os.date function.\nThe returned value is a number, whose meaning depends on your system. In POSIX, Windows, and some other systems, this number counts the number of seconds since some given start time (the \"epoch\"). In other systems, the meaning is not specified, and the number returned by time can be used only as an argument to os.date and os.difftime.",
+ args = "([table: table])",
+ returns = "(number)",
+ },
+ tmpname = {
+ type = "function",
+ description = "Returns a string with a file name that can be used for a temporary file.\nThe file must be explicitly opened before its use and explicitly removed when no longer needed.\nOn POSIX systems, this function also creates a file with that name, to avoid security risks. (Someone else might create the file with wrong permissions in the time between getting the name and creating the file.) You still have to open the file to use it and to remove it (even if you do not use it).\nWhen possible, you may prefer to use io.tmpfile, which automatically removes the file when the program ends.",
+ args = "()",
+ returns = "(string)",
+ },
+ },
+ },
+
+ -- Debug library
+ debug = {
+ type = "lib",
+ description = "This library provides the functionality of the debug interface to Lua programs.\nYou should exert care when using this library. Several of its functions violate basic assumptions about Lua code (e.g., that variables local to a function cannot be accessed from outside; that userdata metatables cannot be changed by Lua code; that Lua programs do not crash) and therefore can compromise otherwise secure code. Moreover, some functions in this library may be slow.\nAll functions in this library are provided inside the debug table. All functions that operate over a thread have an optional first argument which is the thread to operate over. The default is always the current thread.",
+ childs = {
+ debug = {
+ type = "function",
+ description = "Enters an interactive mode with the user, running each string that the user enters.\nUsing simple commands and other debug facilities, the user can inspect global and local variables, change their values, evaluate expressions, and so on. A line containing only the word cont finishes this function, so that the caller continues its execution.\nNote that commands for debug.debug are not lexically nested within any function and so have no direct access to local variables.",
+ args = "()",
+ returns = "()",
+ },
+ getfenv = {
+ type = "function",
+ description = "Returns the environment of object o.\nFUNCTION DEPRECATED IN Lua 5.2.",
+ args = "(o: any)",
+ returns = "(table)",
+ },
+ gethook = {
+ type = "function",
+ description = "Returns the current hook settings of the thread, as three values: the current hook function, the current hook mask, and the current hook count (as set by the debug.sethook function).",
+ args = "([thread: thread])",
+ returns = "(function, string, number)",
+ },
+ getinfo = {
+ type = "function",
+ description = "Returns a table with information about a function.\nYou can give the function directly or you can give a number as the value of f, which means the function running at level f of the call stack of the given thread: level 0 is the current function (getinfo itself); level 1 is the function that called getinfo (except for tail calls, which do not count on the stack); and so on. If f is a number larger than the number of active functions, then getinfo returns nil.\nThe returned table can contain all the fields returned by lua_getinfo, with the string what describing which fields to fill in. The default for what is to get all information available, except the table of valid lines. If present, the option 'f' adds a field named func with the function itself. If present, the option 'L' adds a field named activelines with the table of valid lines.",
+ args = "([thread: thread,] f: function|number [, what: string])",
+ returns = "(table|nil)",
+ },
+ getlocal = {
+ type = "function",
+ description = "This function returns the name and the value of the local variable with index local of the function at level f of the stack.\nThis function accesses not only explicit local variables, but also parameters, temporaries, etc.\nThe first parameter or local variable has index 1, and so on, until the last active variable. Negative indices refer to vararg parameters; -1 is the first vararg parameter (NEGATIVE VALUE ADDED IN Lua 5.2). The function returns nil if there is no variable with the given index, and raises an error when called with a level out of range. (You can call debug.getinfo to check whether the level is valid.)\nVariable names starting with '(' (open parentheses) represent internal variables (loop control variables, temporaries, varargs, and C function locals).\nThe parameter f may also be a function. In that case, getlocal returns only the name of function parameters. VALUE ADDED IN Lua 5.2.",
+ args = "([thread: thread,] f: number|function, local: number)",
+ returns = "(string|nil, any)",
+ },
+ getmetatable = {
+ type = "function",
+ description = "Returns the metatable of the given value or nil if it does not have a metatable.",
+ args = "(value: any)",
+ returns = "(table|nil)",
+ },
+ getregistry = {
+ type = "function",
+ description = "Returns the registry table.",
+ args = "()",
+ returns = "()",
+ },
+ getupvalue = {
+ type = "function",
+ description = "This function returns the name and the value of the upvalue with index up of the function f.\nThe function returns nil if there is no upvalue with the given index.",
+ args = "(f: function, up: number)",
+ returns = "(string|nil, any)",
+ },
+ getuservalue = {
+ type = "function",
+ description = "Returns the Lua value associated to u.\nIf u is not a userdata, returns nil.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(u: userdata)",
+ returns = "(table|nil)",
+ },
+ setfenv = {
+ type = "function",
+ description = "Sets the environment of the given object to the given table. Returns object.\nFUNCTION DEPRECATED IN Lua 5.2.",
+ args = "(object: any, table: table)",
+ returns = "(any)",
+ },
+ sethook = {
+ type = "function",
+ description = "Sets the given function as a hook.\nThe string mask and the number count describe when the hook will be called. The string mask may have the following characters, with the given meaning:\n* 'c': the hook is called every time Lua calls a function;\n* 'r': the hook is called every time Lua returns from a function;\n* 'l': the hook is called every time Lua enters a new line of code.\nWith a count different from zero, the hook is called after every count instructions.\nWhen called without arguments, debug.sethook turns off the hook.\nWhen the hook is called, its first parameter is a string describing the event that has triggered its call: \"call\" (or \"tail call\"), \"return\", \"line\", and \"count\". For line events, the hook also gets the new line number as its second parameter. Inside a hook, you can call getinfo with level 2 to get more information about the running function (level 0 is the getinfo function, and level 1 is the hook function).",
+ args = "([thread: thread,] hook: function, mask: string [, count: number])",
+ returns = "()",
+ },
+ setlocal = {
+ type = "function",
+ description = "This function assigns the value value to the local variable with index local of the function at level level of the stack.\nThe function returns nil if there is no local variable with the given index, and raises an error when called with a level out of range. (You can call getinfo to check whether the level is valid.) Otherwise, it returns the name of the local variable.\nSee debug.getlocal for more information about variable indices and names.",
+ args = "([thread: thread,] level: number, local: number, value: any)",
+ returns = "(string|nil)",
+ },
+ setmetatable = {
+ type = "function",
+ description = "Sets the metatable for the given value to the given table (which can be nil).\nReturns value. RETURN ADDED IN Lua 5.2.",
+ args = "(value: any, table: table|nil)",
+ returns = "(any)",
+ },
+ setupvalue = {
+ type = "function",
+ description = "This function assigns the value value to the upvalue with index up of the function f.\nThe function returns nil if there is no upvalue with the given index. Otherwise, it returns the name of the upvalue.",
+ args = "(f: function, up: number, value: any)",
+ returns = "(string|nil)",
+ },
+ setuservalue = {
+ type = "function",
+ description = "Sets the given value as the Lua value associated to the given udata.\nvalue must be a table or nil; udata must be a full userdata.\nReturns udata.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(udata: userdata, value: table|nil)",
+ returns = "(userdata)",
+ },
+ traceback = {
+ type = "function",
+ description = "If message is present but is neither a string nor nil, this function returns message without further processing. Otherwise, it returns a string with a traceback of the call stack.\nAn optional message string is appended at the beginning of the traceback. An optional level number tells at which level to start the traceback (default is 1, the function calling traceback).",
+ args = "([thread: thread,] [message: any [, level: number]])",
+ returns = "(string)",
+ },
+ upvalueid = {
+ type = "function",
+ description = "Returns an unique identifier (as a light userdata) for the upvalue numbered n from the given function.\nThese unique identifiers allow a program to check whether different closures share upvalues. Lua closures that share an upvalue (that is, that access a same external local variable) will return identical ids for those upvalue indices.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(f: function, n: number)",
+ returns = "(userdata)",
+ },
+ upvaluejoin = {
+ type = "function",
+ description = "Make the n1-th upvalue of the Lua closure f1 refer to the n2-th upvalue of the Lua closure f2.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(f1: function, n1: number, f2: function, n2: number)",
+ returns = "()",
+ },
+ },
+ },
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/api/lua/love2d.lua b/love2dToAPK/tools/tools/zbstudio-old-win/api/lua/love2d.lua
new file mode 100644
index 0000000..4c8ee88
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/api/lua/love2d.lua
@@ -0,0 +1,6566 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+
+-- converted from love_api.lua in https://github.com/rm-code/love-api
+-- (API for LÖVE 0.10.0 as of Dec 23, 2015)
+-- Earlier versins used love_api.lua from http://love2d.org/forums/viewtopic.php?f=3&t=1796&start=50#p166908
+-- the conversion script is at the bottom of this file
+
+local love = {
+ childs = {
+ audio = {
+ childs = {
+ DistanceModel = {
+ childs = {
+ exponent = {
+ description = "Exponential attenuation.",
+ type = "value"
+ },
+ exponentclamped = {
+ description = "Exponential attenuation. Gain is clamped. In version 0.9.2 and older this is named exponent clamped.",
+ type = "value"
+ },
+ inverse = {
+ description = "Inverse distance attenuation.",
+ type = "value"
+ },
+ inverseclamped = {
+ description = "Inverse distance attenuation. Gain is clamped. In version 0.9.2 and older this is named inverse clamped.",
+ type = "value"
+ },
+ linear = {
+ description = "Linear attenuation.",
+ type = "value"
+ },
+ linearclamped = {
+ description = "Linear attenuation. Gain is clamped. In version 0.9.2 and older this is named linear clamped.",
+ type = "value"
+ },
+ none = {
+ description = "Sources do not get attenuated.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ Source = {
+ childs = {
+ getAttenuationDistances = {
+ args = "()",
+ description = "Returns the reference and maximum distance of the source.",
+ returns = "(ref: number, max: number)",
+ type = "function"
+ },
+ getChannels = {
+ args = "()",
+ description = "Gets the number of channels in the Source. Only 1-channel (mono) Sources can use directional and positional effects.",
+ returns = "(channels: number)",
+ type = "function"
+ },
+ getCone = {
+ args = "()",
+ description = "Gets the Source's directional volume cones. Together with Source:setDirection, the cone angles allow for the Source's volume to vary depending on its direction.",
+ returns = "(innerAngle: number, outerAngle: number, outerVolume: number)",
+ type = "function"
+ },
+ getDirection = {
+ args = "()",
+ description = "Gets the direction of the Source.",
+ returns = "(x: number, y: number, z: number)",
+ type = "function"
+ },
+ getDuration = {
+ args = "(unit: TimeUnit)",
+ description = "Gets the duration of the Source. For streaming Sources it may not always be sample-accurate, and may return -1 if the duration cannot be determined at all.",
+ returns = "(duration: number)",
+ type = "function"
+ },
+ getPitch = {
+ args = "()",
+ description = "Gets the current pitch of the Source.",
+ returns = "(pitch: number)",
+ type = "function"
+ },
+ getPosition = {
+ args = "()",
+ description = "Gets the position of the Source.",
+ returns = "(x: number, y: number, z: number)",
+ type = "function"
+ },
+ getRolloff = {
+ args = "()",
+ description = "Returns the rolloff factor of the source.",
+ returns = "(rolloff: number)",
+ type = "function"
+ },
+ getType = {
+ args = "()",
+ description = "Gets the type (static or stream) of the Source.",
+ returns = "(sourcetype: SourceType)",
+ type = "function"
+ },
+ getVelocity = {
+ args = "()",
+ description = "Gets the velocity of the Source.",
+ returns = "(x: number, y: number, z: number)",
+ type = "function"
+ },
+ getVolume = {
+ args = "()",
+ description = "Gets the current volume of the Source.",
+ returns = "(volume: number)",
+ type = "function"
+ },
+ getVolumeLimits = {
+ args = "()",
+ description = "Returns the volume limits of the source.",
+ returns = "(min: number, max: number)",
+ type = "function"
+ },
+ isLooping = {
+ args = "()",
+ description = "Returns whether the Source will loop.",
+ returns = "(loop: boolean)",
+ type = "function"
+ },
+ isPaused = {
+ args = "()",
+ description = "Returns whether the Source is paused.",
+ returns = "(paused: boolean)",
+ type = "function"
+ },
+ isPlaying = {
+ args = "()",
+ description = "Returns whether the Source is playing.",
+ returns = "(playing: boolean)",
+ type = "function"
+ },
+ isStopped = {
+ args = "()",
+ description = "Returns whether the Source is stopped.",
+ returns = "(stopped: boolean)",
+ type = "function"
+ },
+ pause = {
+ args = "()",
+ description = "Pauses the Source.",
+ returns = "()",
+ type = "function"
+ },
+ play = {
+ args = "()",
+ description = "Starts playing the Source.",
+ returns = "(success: boolean)",
+ type = "function"
+ },
+ resume = {
+ args = "()",
+ description = "Resumes a paused Source.",
+ returns = "()",
+ type = "function"
+ },
+ rewind = {
+ args = "()",
+ description = "Rewinds a Source.",
+ returns = "()",
+ type = "function"
+ },
+ seek = {
+ args = "(position: number, unit: TimeUnit)",
+ description = "Sets the playing position of the Source.",
+ returns = "()",
+ type = "function"
+ },
+ setAttenuationDistances = {
+ args = "(ref: number, max: number)",
+ description = "Sets the reference and maximum distance of the source.",
+ returns = "()",
+ type = "function"
+ },
+ setCone = {
+ args = "(innerAngle: number, outerAngle: number, outerVolume: number)",
+ description = "Sets the Source's directional volume cones. Together with Source:setDirection, the cone angles allow for the Source's volume to vary depending on its direction.",
+ returns = "()",
+ type = "function"
+ },
+ setDirection = {
+ args = "(x: number, y: number, z: number)",
+ description = "Sets the direction vector of the Source. A zero vector makes the source non-directional.",
+ returns = "()",
+ type = "function"
+ },
+ setLooping = {
+ args = "(loop: boolean)",
+ description = "Sets whether the Source should loop.",
+ returns = "()",
+ type = "function"
+ },
+ setPitch = {
+ args = "(pitch: number)",
+ description = "Sets the pitch of the Source.",
+ returns = "()",
+ type = "function"
+ },
+ setPosition = {
+ args = "(x: number, y: number, z: number)",
+ description = "Sets the position of the Source.",
+ returns = "()",
+ type = "function"
+ },
+ setRolloff = {
+ args = "(rolloff: number)",
+ description = "Sets the rolloff factor.",
+ returns = "()",
+ type = "function"
+ },
+ setVelocity = {
+ args = "(x: number, y: number, z: number)",
+ description = "Sets the velocity of the Source.\n\nThis does not change the position of the Source, but is used to calculate the doppler effect.",
+ returns = "()",
+ type = "function"
+ },
+ setVolume = {
+ args = "(volume: number)",
+ description = "Sets the volume of the Source.",
+ returns = "()",
+ type = "function"
+ },
+ setVolumeLimits = {
+ args = "(min: number, max: number)",
+ description = "Sets the volume limits of the source. The limits have to be numbers from 0 to 1.",
+ returns = "()",
+ type = "function"
+ },
+ stop = {
+ args = "()",
+ description = "Stops a Source.",
+ returns = "()",
+ type = "function"
+ },
+ tell = {
+ args = "(unit: TimeUnit)",
+ description = "Gets the currently playing position of the Source.",
+ returns = "(position: number)",
+ type = "function"
+ }
+ },
+ description = "A Source represents audio you can play back. You can do interesting things with Sources, like set the volume, pitch, and its position relative to the listener.",
+ type = "lib"
+ },
+ SourceType = {
+ childs = {
+ static = {
+ description = "Decode the entire sound at once.",
+ type = "value"
+ },
+ stream = {
+ description = "Stream the sound; decode it gradually.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ TimeUnit = {
+ childs = {
+ samples = {
+ description = "Audio samples.",
+ type = "value"
+ },
+ seconds = {
+ description = "Regular seconds.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ getDopplerScale = {
+ args = "()",
+ description = "Gets the current global scale factor for velocity-based doppler effects.",
+ returns = "(scale: number)",
+ type = "function"
+ },
+ getOrientation = {
+ args = "()",
+ description = "Returns the orientation of the listener.",
+ returns = "(fx: number, fy: number, fz: number, ux: number, uy: number, uz: number)",
+ type = "function"
+ },
+ getPosition = {
+ args = "()",
+ description = "Returns the position of the listener.",
+ returns = "(x: number, y: number, z: number)",
+ type = "function"
+ },
+ getSourceCount = {
+ args = "()",
+ description = "Returns the number of sources which are currently playing or paused.",
+ returns = "(numSources: number)",
+ type = "function"
+ },
+ getVelocity = {
+ args = "()",
+ description = "Returns the velocity of the listener.",
+ returns = "(x: number, y: number, z: number)",
+ type = "function"
+ },
+ getVolume = {
+ args = "()",
+ description = "Returns the master volume.",
+ returns = "(volume: number)",
+ type = "function"
+ },
+ newSource = {
+ args = "(filename: string, type: SourceType)",
+ description = "Creates a new Source from a file or SoundData. Sources created from SoundData are always static.",
+ returns = "(source: Source)",
+ type = "function"
+ },
+ pause = {
+ args = "(source: Source)",
+ description = "Pauses all audio",
+ returns = "()",
+ type = "function"
+ },
+ play = {
+ args = "(source: Source)",
+ description = "Plays the specified Source.",
+ returns = "()",
+ type = "function"
+ },
+ resume = {
+ args = "(source: Source)",
+ description = "Resumes all audio",
+ returns = "()",
+ type = "function"
+ },
+ rewind = {
+ args = "(source: Source)",
+ description = "Rewinds all playing audio.",
+ returns = "()",
+ type = "function"
+ },
+ setDistanceModel = {
+ args = "(model: DistanceModel)",
+ description = "Sets the distance attenuation model.",
+ returns = "()",
+ type = "function"
+ },
+ setDopplerScale = {
+ args = "(scale: number)",
+ description = "Sets a global scale factor for velocity-based doppler effects. The default scale value is 1.",
+ returns = "()",
+ type = "function"
+ },
+ setOrientation = {
+ args = "(fx: number, fy: number, fz: number, ux: number, uy: number, uz: number)",
+ description = "Sets the orientation of the listener.",
+ returns = "()",
+ type = "function"
+ },
+ setPosition = {
+ args = "(x: number, y: number, z: number)",
+ description = "Sets the position of the listener, which determines how sounds play.",
+ returns = "()",
+ type = "function"
+ },
+ setVelocity = {
+ args = "(x: number, y: number, z: number)",
+ description = "Sets the velocity of the listener.",
+ returns = "()",
+ type = "function"
+ },
+ setVolume = {
+ args = "(volume: number)",
+ description = "Sets the master volume.",
+ returns = "()",
+ type = "function"
+ },
+ stop = {
+ args = "(source: Source)",
+ description = "Stops all playing audio.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Provides an interface to create noise with the user's speakers.",
+ type = "class"
+ },
+ directorydropped = {
+ args = "(path: string)",
+ description = "Callback function triggered when a directory is dragged and dropped onto the window.",
+ returns = "()",
+ type = "function"
+ },
+ draw = {
+ args = "()",
+ description = "Callback function used to draw on the screen every frame.",
+ returns = "()",
+ type = "function"
+ },
+ errhand = {
+ args = "(msg: string)",
+ description = "The error handler, used to display error messages.",
+ returns = "()",
+ type = "function"
+ },
+ event = {
+ childs = {
+ Event = {
+ childs = {
+ focus = {
+ description = "Window focus gained or lost",
+ type = "value"
+ },
+ joystickaxis = {
+ description = "Joystick axis motion",
+ type = "value"
+ },
+ joystickhat = {
+ description = "Joystick hat pressed",
+ type = "value"
+ },
+ joystickpressed = {
+ description = "Joystick pressed",
+ type = "value"
+ },
+ joystickreleased = {
+ description = "Joystick released",
+ type = "value"
+ },
+ keypressed = {
+ description = "Key pressed",
+ type = "value"
+ },
+ keyreleased = {
+ description = "Key released",
+ type = "value"
+ },
+ mousefocus = {
+ description = "Window mouse focus gained or lost",
+ type = "value"
+ },
+ mousepressed = {
+ description = "Mouse pressed",
+ type = "value"
+ },
+ mousereleased = {
+ description = "Mouse released",
+ type = "value"
+ },
+ quit = {
+ description = "Quit",
+ type = "value"
+ },
+ resize = {
+ description = "Window size changed by the user",
+ type = "value"
+ },
+ threaderror = {
+ description = "A Lua error has occurred in a thread.",
+ type = "value"
+ },
+ visible = {
+ description = "Window is minimized or un-minimized by the user",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ poll = {
+ args = "()",
+ description = "Returns an iterator for messages in the event queue.",
+ returns = "(i: function)",
+ type = "function"
+ },
+ pump = {
+ args = "()",
+ description = "Pump events into the event queue. This is a low-level function, and is usually not called by the user, but by love.run. Note that this does need to be called for any OS to think you're still running, and if you want to handle OS-generated events at all (think callbacks). love.event.pump can only be called from the main thread, but afterwards, the rest of love.event can be used from any other thread.",
+ returns = "()",
+ type = "function"
+ },
+ push = {
+ args = "(e: Event, a: mixed, b: mixed, c: mixed, d: mixed)",
+ description = "Adds an event to the event queue.",
+ returns = "()",
+ type = "function"
+ },
+ quit = {
+ args = "()",
+ description = "Adds the quit event to the queue.\n\nThe quit event is a signal for the event handler to close LÖVE. It's possible to abort the exit process with the love.quit callback.",
+ returns = "()",
+ type = "function"
+ },
+ wait = {
+ args = "()",
+ description = "Like love.event.poll but blocks until there is an event in the queue.",
+ returns = "(e: Event, a: mixed, b: mixed, c: mixed, d: mixed)",
+ type = "function"
+ }
+ },
+ description = "Manages events, like keypresses.",
+ type = "lib"
+ },
+ filedropped = {
+ args = "(file: File)",
+ description = "Callback function triggered when a file is dragged and dropped onto the window.",
+ returns = "()",
+ type = "function"
+ },
+ filesystem = {
+ childs = {
+ BufferMode = {
+ childs = {
+ full = {
+ description = "Full buffering. Write and append operations are always buffered until the buffer size limit is reached.",
+ type = "value"
+ },
+ line = {
+ description = "Line buffering. Write and append operations are buffered until a newline is output or the buffer size limit is reached.",
+ type = "value"
+ },
+ none = {
+ description = "No buffering. The result of write and append operations appears immediately.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ File = {
+ childs = {
+ flush = {
+ args = "()",
+ description = "Flushes any buffered written data in the file to the disk.",
+ returns = "(success: boolean, err: string)",
+ type = "function"
+ },
+ getBuffer = {
+ args = "()",
+ description = "Gets the buffer mode of a file.",
+ returns = "(mode: BufferMode, size: number)",
+ type = "function"
+ },
+ getMode = {
+ args = "()",
+ description = "Gets the FileMode the file has been opened with.",
+ returns = "(mode: FileMode)",
+ type = "function"
+ },
+ getSize = {
+ args = "()",
+ description = "Returns the file size.",
+ returns = "(size: number)",
+ type = "function"
+ },
+ isEOF = {
+ args = "()",
+ description = "Gets whether end-of-file has been reached.",
+ returns = "(eof: boolean)",
+ type = "function"
+ },
+ isOpen = {
+ args = "()",
+ description = "Gets whether the file is open.",
+ returns = "(open: boolean)",
+ type = "function"
+ },
+ lines = {
+ args = "()",
+ description = "Iterate over all the lines in a file",
+ returns = "(iterator: function)",
+ type = "function"
+ },
+ open = {
+ args = "(mode: FileMode)",
+ description = "Open the file for write, read or append.\n\nIf you are getting the error message \"Could not set write directory\", try setting the save directory. This is done either with love.filesystem.setIdentity or by setting the identity field in love.conf.",
+ returns = "(ok: boolean)",
+ type = "function"
+ },
+ read = {
+ args = "(bytes: number)",
+ description = "Read a number of bytes from a file.",
+ returns = "(contents: string, size: number)",
+ type = "function"
+ },
+ seek = {
+ args = "(position: number)",
+ description = "Seek to a position in a file.",
+ returns = "(success: boolean)",
+ type = "function"
+ },
+ setBuffer = {
+ args = "(mode: BufferMode, size: number)",
+ description = "Sets the buffer mode for a file opened for writing or appending. Files with buffering enabled will not write data to the disk until the buffer size limit is reached, depending on the buffer mode.",
+ returns = "(success: boolean, errorstr: string)",
+ type = "function"
+ },
+ write = {
+ args = "(data: string, size: number)",
+ description = "Write data to a file.",
+ returns = "(success: boolean)",
+ type = "function"
+ }
+ },
+ description = "Represents a file on the filesystem.",
+ type = "lib"
+ },
+ FileData = {
+ childs = {
+ getFilename = {
+ args = "()",
+ description = "Gets the filename of the FileData.",
+ returns = "(name: string)",
+ type = "function"
+ }
+ },
+ description = "Data representing the contents of a file.",
+ type = "lib"
+ },
+ FileDecoder = {
+ childs = {
+ base64 = {
+ description = "The data is base64-encoded.",
+ type = "value"
+ },
+ file = {
+ description = "The data is unencoded.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ FileMode = {
+ childs = {
+ a = {
+ description = "Open a file for append.",
+ type = "value"
+ },
+ c = {
+ description = "Do not open a file (represents a closed file.)",
+ type = "value"
+ },
+ r = {
+ description = "Open a file for read.",
+ type = "value"
+ },
+ w = {
+ description = "Open a file for write.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ areSymlinksEnabled = {
+ args = "()",
+ description = "Gets whether love.filesystem follows symbolic links.",
+ returns = "(enable: boolean)",
+ type = "function"
+ },
+ createDirectory = {
+ args = "(name: string)",
+ description = "Creates a directory.",
+ returns = "(ok: boolean)",
+ type = "function"
+ },
+ exists = {
+ args = "(filename: string)",
+ description = "Check whether a file or directory exists.",
+ returns = "(e: boolean)",
+ type = "function"
+ },
+ getAppdataDirectory = {
+ args = "()",
+ description = "Returns the application data directory (could be the same as getUserDirectory)",
+ returns = "(path: string)",
+ type = "function"
+ },
+ getDirectoryItems = {
+ args = "(dir: string)",
+ description = "Returns a table with the names of files and subdirectories in the specified path. The table is not sorted in any way; the order is undefined.\n\nIf the path passed to the function exists in the game and the save directory, it will list the files and directories from both places.",
+ returns = "(items: table)",
+ type = "function"
+ },
+ getIdentity = {
+ args = "(name: string)",
+ description = "Gets the write directory name for your game. Note that this only returns the name of the folder to store your files in, not the full location.",
+ returns = "()",
+ type = "function"
+ },
+ getLastModified = {
+ args = "(filename: string)",
+ description = "Gets the last modification time of a file.",
+ returns = "(modtime: number, errormsg: string)",
+ type = "function"
+ },
+ getRealDirectory = {
+ args = "(filepath: string)",
+ description = "Gets the platform-specific absolute path of the directory containing a filepath.\n\nThis can be used to determine whether a file is inside the save directory or the game's source .love.",
+ returns = "(realdir: string)",
+ type = "function"
+ },
+ getRequirePath = {
+ args = "()",
+ description = "Gets the filesystem paths that will be searched when require is called.\n\nThe paths string returned by this function is a sequence of path templates separated by semicolons. The argument passed to require will be inserted in place of any question mark (\"?\") character in each template (after the dot characters in the argument passed to require are replaced by directory separators.)\n\nThe paths are relative to the game's source and save directories, as well as any paths mounted with love.filesystem.mount.",
+ returns = "(paths: string)",
+ type = "function"
+ },
+ getSaveDirectory = {
+ args = "()",
+ description = "Gets the full path to the designated save directory. This can be useful if you want to use the standard io library (or something else) to read or write in the save directory.",
+ returns = "(path: string)",
+ type = "function"
+ },
+ getSize = {
+ args = "(filename: string)",
+ description = "Gets the size in bytes of a file.",
+ returns = "(size: number, errormsg: string)",
+ type = "function"
+ },
+ getSourceBaseDirectory = {
+ args = "()",
+ description = "Returns the full path to the directory containing the .love file. If the game is fused to the LÖVE executable, then the directory containing the executable is returned.\n\nIf love.filesystem.isFused is true, the path returned by this function can be passed to love.filesystem.mount, which will make the directory containing the main game readable by love.filesystem.",
+ returns = "(path: string)",
+ type = "function"
+ },
+ getUserDirectory = {
+ args = "()",
+ description = "Returns the path of the user's directory.",
+ returns = "(path: string)",
+ type = "function"
+ },
+ getWorkingDirectory = {
+ args = "()",
+ description = "Gets the current working directory.",
+ returns = "(path: string)",
+ type = "function"
+ },
+ isDirectory = {
+ args = "(path: string)",
+ description = "Check whether something is a directory.",
+ returns = "(is_dir: boolean)",
+ type = "function"
+ },
+ isFile = {
+ args = "(path: string)",
+ description = "Check whether something is a file.",
+ returns = "(is_file: boolean)",
+ type = "function"
+ },
+ isFused = {
+ args = "()",
+ description = "Gets whether the game is in fused mode or not.\n\nIf a game is in fused mode, its save directory will be directly in the Appdata directory instead of Appdata/LOVE/. The game will also be able to load C Lua dynamic libraries which are located in the save directory.\n\nA game is in fused mode if the source .love has been fused to the executable (see Game Distribution), or if \"--fused\" has been given as a command-line argument when starting the game.",
+ returns = "(fused: boolean)",
+ type = "function"
+ },
+ isSymlink = {
+ args = "(path: string)",
+ description = "Gets whether a filepath is actually a symbolic link.\n\nIf symbolic links are not enabled (via love.filesystem.setSymlinksEnabled), this function will always return false.",
+ returns = "(symlink: boolean)",
+ type = "function"
+ },
+ lines = {
+ args = "(name: string)",
+ description = "Iterate over the lines in a file.",
+ returns = "(iterator: function)",
+ type = "function"
+ },
+ load = {
+ args = "(name: string)",
+ description = "Load a file (but not run it).",
+ returns = "(chunk: function)",
+ type = "function"
+ },
+ mount = {
+ args = "(archive: string, mountpoint: string)",
+ description = "Mounts a zip file or folder in the game's save directory for reading.",
+ returns = "(success: boolean)",
+ type = "function"
+ },
+ newFile = {
+ args = "(filename: string, mode: FileMode)",
+ description = "Creates a new File object. It needs to be opened before it can be accessed.",
+ returns = "(file: File, errorstr: string)",
+ type = "function"
+ },
+ newFileData = {
+ args = "(contents: string, name: string, decoder: FileDecoder)",
+ description = "Creates a new FileData object.",
+ returns = "(data: FileData)",
+ type = "function"
+ },
+ read = {
+ args = "(name: string, bytes: number)",
+ description = "Read the contents of a file.",
+ returns = "(contents: string, size: number)",
+ type = "function"
+ },
+ remove = {
+ args = "(name: string)",
+ description = "Removes a file or directory.",
+ returns = "(ok: boolean)",
+ type = "function"
+ },
+ setIdentity = {
+ args = "(name: string, searchorder: SearchOrder)",
+ description = "Sets the write directory for your game. Note that you can only set the name of the folder to store your files in, not the location.",
+ returns = "()",
+ type = "function"
+ },
+ setRequirePath = {
+ args = "(paths: string)",
+ description = "Sets the filesystem paths that will be searched when require is called.\n\nThe paths string given to this function is a sequence of path templates separated by semicolons. The argument passed to require will be inserted in place of any question mark (\"?\") character in each template (after the dot characters in the argument passed to require are replaced by directory separators.)\n\nThe paths are relative to the game's source and save directories, as well as any paths mounted with love.filesystem.mount.",
+ returns = "()",
+ type = "function"
+ },
+ setSource = {
+ args = "(path: string)",
+ description = "Sets the source of the game, where the code is present. This function can only be called once, and is normally automatically done by LÖVE.",
+ returns = "()",
+ type = "function"
+ },
+ setSymlinksEnabled = {
+ args = "(enable: boolean)",
+ description = "Sets whether love.filesystem follows symbolic links. Sets whether love.filesystem follows symbolic links. It is enabled by default in version 0.10.0 and newer, and disabled by default in 0.9.2.",
+ returns = "()",
+ type = "function"
+ },
+ unmount = {
+ args = "(archive: string)",
+ description = "Unmounts a zip file or folder previously mounted for reading with love.filesystem.mount.",
+ returns = "(success: boolean)",
+ type = "function"
+ },
+ write = {
+ args = "(name: string, data: string, size: number)",
+ description = "Write data to a file.\n\nIf you are getting the error message \"Could not set write directory\", try setting the save directory. This is done either with love.filesystem.setIdentity or by setting the identity field in love.conf.",
+ returns = "(success: boolean)",
+ type = "function"
+ }
+ },
+ description = "Provides an interface to the user's filesystem.",
+ type = "class"
+ },
+ focus = {
+ args = "(f: boolean)",
+ description = "Callback function triggered when window receives or loses focus.",
+ returns = "()",
+ type = "function"
+ },
+ gamepadaxis = {
+ args = "(joystick: Joystick, axis: GamepadAxis)",
+ description = "Called when a Joystick's virtual gamepad axis is moved.",
+ returns = "()",
+ type = "function"
+ },
+ gamepadpressed = {
+ args = "(joystick: Joystick, button: GamepadButton)",
+ description = "Called when a Joystick's virtual gamepad button is pressed.",
+ returns = "()",
+ type = "function"
+ },
+ gamepadreleased = {
+ args = "(joystick: Joystick, button: GamepadButton)",
+ description = "Called when a Joystick's virtual gamepad button is released.",
+ returns = "()",
+ type = "function"
+ },
+ getVersion = {
+ args = "()",
+ description = "Gets the current running version of LÖVE.",
+ returns = "(major: number, minor: number, revision: number, codename: string)",
+ type = "function"
+ },
+ graphics = {
+ childs = {
+ AlignMode = {
+ childs = {
+ center = {
+ description = "Align text center.",
+ type = "value"
+ },
+ left = {
+ description = "Align text left.",
+ type = "value"
+ },
+ right = {
+ description = "Align text right.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ AreaSpreadDistribution = {
+ childs = {
+ none = {
+ description = "No distribution - area spread is disabled.",
+ type = "value"
+ },
+ normal = {
+ description = "Normal (gaussian) distribution.",
+ type = "value"
+ },
+ uniform = {
+ description = "Uniform distribution.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ BlendMode = {
+ childs = {
+ add = {
+ description = "The pixel colors of what's drawn are added to the pixel colors already on the screen. The alpha of the screen is not modified.",
+ type = "value"
+ },
+ alpha = {
+ description = "Alpha blending (normal). The alpha of what's drawn determines its opacity.",
+ type = "value"
+ },
+ multiply = {
+ description = "The pixel colors of what's drawn are multiplied with the pixel colors already on the screen (darkening them). The alpha of drawn objects is multiplied with the alpha of the screen rather than determining how much the colors on the screen are affected, even when the \"alphamultiply\" BlendAlphaMode is used.",
+ type = "value"
+ },
+ replace = {
+ description = "The colors of what's drawn completely replace what was on the screen, with no additional blending.",
+ type = "value"
+ },
+ screen = {
+ description = "\"Screen\" blending.",
+ type = "value"
+ },
+ subtract = {
+ description = "The pixel colors of what's drawn are subtracted from the pixel colors already on the screen. The alpha of the screen is not modified.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ Canvas = {
+ childs = {
+ getFilter = {
+ args = "()",
+ description = "Gets the filter mode of the Canvas.",
+ returns = "(min: FilterMode, mag: FilterMode, anisotropy: number)",
+ type = "function"
+ },
+ getFormat = {
+ args = "()",
+ description = "Gets the texture format of the Canvas.",
+ returns = "(format: CanvasFormat)",
+ type = "function"
+ },
+ getHeight = {
+ args = "()",
+ description = "Gets the height of the Canvas.",
+ returns = "(height: number)",
+ type = "function"
+ },
+ getMSAA = {
+ args = "()",
+ description = "Gets the number of multisample antialiasing (MSAA) samples used when drawing to the Canvas.\n\nThis may be different than the number used as an argument to love.graphics.newCanvas if the system running LÖVE doesn't support that number.",
+ returns = "(samples: number)",
+ type = "function"
+ },
+ getWidth = {
+ args = "()",
+ description = "Gets the width of the Canvas.",
+ returns = "(width: number)",
+ type = "function"
+ },
+ getWrap = {
+ args = "()",
+ description = "Gets the wrapping properties of a Canvas.\n\nThis function returns the currently set horizontal and vertical wrapping modes for the Canvas.",
+ returns = "(horizontal: WrapMode, vertical: WrapMode)",
+ type = "function"
+ },
+ isActive = {
+ args = "()",
+ description = "Gets whether the graphics module is able to be used. If it is not active, love.graphics function and method calls will not work correctly and may cause the program to crash. The graphics module is inactive if a window is not open, or if the app is in the background on iOS. Typically the app's execution will be automatically paused by the system, in the latter case.",
+ returns = "()",
+ type = "function"
+ },
+ newImageData = {
+ args = "(x: number, y: number, width: number, height: number)",
+ description = "Generates ImageData from the contents of the Canvas.",
+ returns = "(data: ImageData)",
+ type = "function"
+ },
+ renderTo = {
+ args = "(func: function)",
+ description = "Render to the Canvas using a function.",
+ returns = "()",
+ type = "function"
+ },
+ setFilter = {
+ args = "(min: FilterMode, mag: FilterMode, anisotropy: number)",
+ description = "Sets the filter of the Canvas.",
+ returns = "()",
+ type = "function"
+ },
+ setWrap = {
+ args = "(horizontal: WrapMode, vertical: WrapMode)",
+ description = "Sets the wrapping properties of a Canvas.\n\nThis function sets the way the edges of a Canvas are treated if it is scaled or rotated. If the WrapMode is set to \"clamp\", the edge will not be interpolated. If set to \"repeat\", the edge will be interpolated with the pixels on the opposing side of the framebuffer.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "A Canvas is used for off-screen rendering. Think of it as an invisible screen that you can draw to, but that will not be visible until you draw it to the actual visible screen. It is also known as \"render to texture\".\n\nBy drawing things that do not change position often (such as background items) to the Canvas, and then drawing the entire Canvas instead of each item, you can reduce the number of draw operations performed each frame.",
+ type = "lib"
+ },
+ CanvasFormat = {
+ childs = {
+ hdr = {
+ description = "A format suitable for high dynamic range content - an alias for the rgba16f format, normally.",
+ type = "value"
+ },
+ normal = {
+ description = "The default Canvas format - usually an alias for the rgba8 format, or the srgb format if gamma-correct rendering is enabled in LÖVE 0.10.0 and newer.",
+ type = "value"
+ },
+ r8 = {
+ description = "Single-channel (red component) format (8 bpp.)",
+ type = "value"
+ },
+ r16f = {
+ description = "Floating point single-channel format (16 bpp.) Color values can range from [-65504, +65504].",
+ type = "value"
+ },
+ r32f = {
+ description = "Floating point single-channel format (32 bpp.) Color values can range from [-65504, +65504].",
+ type = "value"
+ },
+ rg8 = {
+ description = "Two channels (red and green components) with 8 bits per channel (16 bpp.)",
+ type = "value"
+ },
+ rg11b10f = {
+ description = "Floating point RGB with 11 bits in the red and green channels, and 10 bits in the blue channel (32 bpp.) There is no alpha channel. Color values can range from [0, +65024].",
+ type = "value"
+ },
+ rg16f = {
+ description = "Floating point two-channel format with 16 bits per channel (32 bpp.) Color values can range from [-65504, +65504].",
+ type = "value"
+ },
+ rg32f = {
+ description = "Floating point two-channel format with 32 bits per channel (64 bpp.) Color values can range from [-65504, +65504].",
+ type = "value"
+ },
+ rgb5a1 = {
+ description = "RGB with 5 bits each, and a 1-bit alpha channel (16 bpp.)",
+ type = "value"
+ },
+ rgb10a2 = {
+ description = "RGB with 10 bits per channel, and a 2-bit alpha channel (32 bpp.)",
+ type = "value"
+ },
+ rgb565 = {
+ description = "RGB with 5, 6, and 5 bits each, respectively (16 bpp). There is no alpha channel in this format.",
+ type = "value"
+ },
+ rgba4 = {
+ description = "4 bits per channel (16 bpp) RGBA.",
+ type = "value"
+ },
+ rgba8 = {
+ description = "8 bits per channel (32 bpp) RGBA. Color channel values range from 0-255 (0-1 in shaders.)",
+ type = "value"
+ },
+ rgba16f = {
+ description = "Floating point RGBA with 16 bits per channel (64 bpp.) Color values can range from [-65504, +65504].",
+ type = "value"
+ },
+ rgba32f = {
+ description = "Floating point RGBA with 32 bits per channel (128 bpp.) Color values can range from [-65504, +65504].",
+ type = "value"
+ },
+ srgb = {
+ description = "The same as rgba8, but the Canvas is interpreted as being in the sRGB color space. Everything drawn to the Canvas will be converted from linear RGB to sRGB. When the Canvas is drawn (or used in a shader), it will be decoded from sRGB to linear RGB. This reduces color banding when doing gamma-correct rendering, since sRGB encoding has more precision than linear RGB for darker colors.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ DrawMode = {
+ childs = {
+ fill = {
+ description = "Draw filled shape.",
+ type = "value"
+ },
+ line = {
+ description = "Draw outlined shape.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ FilterMode = {
+ childs = {
+ linear = {
+ description = "Scale image with linear interpolation.",
+ type = "value"
+ },
+ nearest = {
+ description = "Scale image with nearest neighbor interpolation.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ Font = {
+ childs = {
+ getBaseline = {
+ args = "()",
+ description = "Gets the baseline of the Font. Most scripts share the notion of a baseline: an imaginary horizontal line on which characters rest. In some scripts, parts of glyphs lie below the baseline.",
+ returns = "(baseline: number)",
+ type = "function"
+ },
+ getDescent = {
+ args = "()",
+ description = "Gets the descent of the Font. The descent spans the distance between the baseline and the lowest descending glyph in a typeface.",
+ returns = "(descent: number)",
+ type = "function"
+ },
+ getFilter = {
+ args = "()",
+ description = "Gets the filter mode for a font.",
+ returns = "(min: FilterMode, mag: FilterMode, anisotropy: number)",
+ type = "function"
+ },
+ getHeight = {
+ args = "()",
+ description = "Gets the height of the Font. The height of the font is the size including any spacing; the height which it will need.",
+ returns = "(height: number)",
+ type = "function"
+ },
+ getLineHeight = {
+ args = "()",
+ description = "Gets the line height. This will be the value previously set by Font:setLineHeight, or 1.0 by default.",
+ returns = "(height: number)",
+ type = "function"
+ },
+ getWidth = {
+ args = "(line: string)",
+ description = "Determines the horizontal size a line of text needs. Does not support line-breaks.",
+ returns = "(width: number)",
+ type = "function"
+ },
+ getWrap = {
+ args = "(text: string, wraplimit: number)",
+ description = "Gets formatting information for text, given a wrap limit.\n\nThis function accounts for newlines correctly (i.e. '\\n').",
+ returns = "(width: number, wrappedtext: table)",
+ type = "function"
+ },
+ hasGlyph = {
+ args = "(character: string)",
+ description = "Gets whether the font can render a particular character.",
+ returns = "(hasglyph: boolean)",
+ type = "function"
+ },
+ setFallbacks = {
+ args = "(fallbackfont1: Font, ...: Font)",
+ description = "Sets other Fonts to use if this Font doesn't have a specific character. When that happens, the glyph from the first fallback Font to have the character will be used, instead of a blank box or other 'no character' symbol being used.",
+ returns = "()",
+ type = "function"
+ },
+ setFilter = {
+ args = "(min: FilterMode, mag: FilterMode, anisotropy: number)",
+ description = "Sets the filter mode for a font.",
+ returns = "()",
+ type = "function"
+ },
+ setLineHeight = {
+ args = "(height: number)",
+ description = "Sets the line height. When rendering the font in lines the actual height will be determined by the line height multiplied by the height of the font. The default is 1.0.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Defines the shape of characters than can be drawn onto the screen.",
+ type = "lib"
+ },
+ GraphicsFeature = {
+ childs = {
+ clampzero = {
+ description = "Whether the \"clampzero\" WrapMode is supported.",
+ type = "value"
+ },
+ multicanvasformats = {
+ description = "Whether multiple Canvases with different formats can be used in the same love.graphics.setCanvas call.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ GraphicsLimit = {
+ childs = {
+ canvasmsaa = {
+ description = "The maximum number of antialiasing samples for a Canvas.",
+ type = "value"
+ },
+ multicanvas = {
+ description = "The maximum number of simultaneously active canvases (via love.graphics.setCanvas).",
+ type = "value"
+ },
+ pointsize = {
+ description = "The maximum size of points.",
+ type = "value"
+ },
+ texturesize = {
+ description = "The maximum width or height of Images and Canvases.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ Image = {
+ childs = {
+ getDimensions = {
+ args = "()",
+ description = "Gets the width and height of the Image.",
+ returns = "(width: number, height: number)",
+ type = "function"
+ },
+ getFilter = {
+ args = "()",
+ description = "Gets the filter mode for an image.",
+ returns = "(min: FilterMode, mag: FilterMode)",
+ type = "function"
+ },
+ getFlags = {
+ args = "()",
+ description = "Gets the flags used when the image was created.",
+ returns = "()",
+ type = "function"
+ },
+ getHeight = {
+ args = "()",
+ description = "Gets the height of the Image.",
+ returns = "(height: number)",
+ type = "function"
+ },
+ getMipmapFilter = {
+ args = "()",
+ description = "Gets the mipmap filter mode for an Image.",
+ returns = "(mode: FilterMode, sharpness: number)",
+ type = "function"
+ },
+ getWidth = {
+ args = "()",
+ description = "Gets the width of the Image.",
+ returns = "(width: number)",
+ type = "function"
+ },
+ getWrap = {
+ args = "()",
+ description = "Gets the wrapping properties of an Image.\n\nThis function returns the currently set horizontal and vertical wrapping modes for the image.",
+ returns = "(horizontal: WrapMode, vertical: WrapMode)",
+ type = "function"
+ },
+ refresh = {
+ args = "(x: number, y: number, width: number, height: number)",
+ description = "Reloads the Image's contents from the ImageData or CompressedData used to create the image.",
+ returns = "()",
+ type = "function"
+ },
+ setFilter = {
+ args = "(min: FilterMode, mag: FilterMode)",
+ description = "Sets the filter mode for an image.",
+ returns = "()",
+ type = "function"
+ },
+ setMipmapFilter = {
+ args = "(filtermode: FilterMode, sharpness: number)",
+ description = "Sets the mipmap filter mode for an Image.\n\nMipmapping is useful when drawing an image at a reduced scale. It can improve performance and reduce aliasing issues.\n\nIn 0.10.0 and newer, the Image must be created with the mipmaps flag enabled for the mipmap filter to have any effect.",
+ returns = "()",
+ type = "function"
+ },
+ setWrap = {
+ args = "(horizontal: WrapMode, vertical: WrapMode)",
+ description = "Sets the wrapping properties of an Image.\n\nThis function sets the way an Image is repeated when it is drawn with a Quad that is larger than the image's extent. An image may be clamped or set to repeat in both horizontal and vertical directions. Clamped images appear only once, but repeated ones repeat as many times as there is room in the Quad.\n\nIf you use a Quad that is larger than the image extent and do not use repeated tiling, there may be an unwanted visual effect of the image stretching all the way to fill the Quad. If this is the case, setting Image:getWrap(\"repeat\", \"repeat\") for all the images to be repeated, and using Quad of appropriate size will result in the best visual appearance.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Drawable image type.",
+ type = "lib"
+ },
+ LineJoin = {
+ childs = {
+ bevel = {
+ description = "Bevel style.",
+ type = "value"
+ },
+ miter = {
+ description = "Miter style.",
+ type = "value"
+ },
+ none = {
+ description = "None style.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ LineStyle = {
+ childs = {
+ rough = {
+ description = "Draw rough lines.",
+ type = "value"
+ },
+ smooth = {
+ description = "Draw smooth lines.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ Mesh = {
+ childs = {
+ getDrawMode = {
+ args = "()",
+ description = "Gets the mode used when drawing the Mesh.",
+ returns = "(mode: MeshDrawMode)",
+ type = "function"
+ },
+ getDrawRange = {
+ args = "()",
+ description = "Gets the range of vertices used when drawing the Mesh.\n\nIf the Mesh's draw range has not been set previously with Mesh:setDrawRange, this function will return nil.",
+ returns = "(min: number, max: number)",
+ type = "function"
+ },
+ getTexture = {
+ args = "()",
+ description = "Gets the texture (Image or Canvas) used when drawing the Mesh.",
+ returns = "(texture: Texture)",
+ type = "function"
+ },
+ getVertex = {
+ args = "(index: number)",
+ description = "Gets the properties of a vertex in the Mesh.",
+ returns = "(attributecomponent: number, ...: number)",
+ type = "function"
+ },
+ getVertexAttribute = {
+ args = "(vertexindex: number, attributeindex: number)",
+ description = "Gets the properties of a specific attribute within a vertex in the Mesh.\n\nMeshes without a custom vertex format specified in love.graphics.newMesh have position as their first attribute, texture coordinates as their second attribute, and color as their third attribute.",
+ returns = "(value1: number, value2: number, ...: number)",
+ type = "function"
+ },
+ getVertexCount = {
+ args = "()",
+ description = "Returns the total number of vertices in the Mesh.",
+ returns = "(num: number)",
+ type = "function"
+ },
+ getVertexFormat = {
+ args = "()",
+ description = "Gets the vertex format that the Mesh was created with.",
+ returns = "(format: table)",
+ type = "function"
+ },
+ getVertexMap = {
+ args = "()",
+ description = "Gets the vertex map for the Mesh. The vertex map describes the order in which the vertices are used when the Mesh is drawn. The vertices, vertex map, and mesh draw mode work together to determine what exactly is displayed on the screen.\n\nIf no vertex map has been set previously via Mesh:setVertexMap, then this function will return nil in LÖVE 0.10.0+, or an empty table in 0.9.2 and older.",
+ returns = "(vertex_map: table)",
+ type = "function"
+ },
+ isAttributeEnabled = {
+ args = "(name: string)",
+ description = "Gets whether a specific vertex attribute in the Mesh is enabled. Vertex data from disabled attributes is not used when drawing the Mesh.",
+ returns = "(enabled: boolean)",
+ type = "function"
+ },
+ setAttributeEnabled = {
+ args = "(name: string, enable: boolean)",
+ description = "Enables or disables a specific vertex attribute in the Mesh. Vertex data from disabled attributes is not used when drawing the Mesh.",
+ returns = "()",
+ type = "function"
+ },
+ setDrawMode = {
+ args = "(mode: MeshDrawMode)",
+ description = "Sets the mode used when drawing the Mesh.",
+ returns = "()",
+ type = "function"
+ },
+ setDrawRange = {
+ args = "(min: number, max: number)",
+ description = "Restricts the drawn vertices of the Mesh to a subset of the total.\n\nIf a vertex map is used with the Mesh, this method will set a subset of the values in the vertex map array to use, instead of a subset of the total vertices in the Mesh.\n\nFor example, if Mesh:setVertexMap(1, 2, 3, 1, 3, 4) and Mesh:setDrawRange(4, 6) are called, vertices 1, 3, and 4 will be drawn.",
+ returns = "()",
+ type = "function"
+ },
+ setTexture = {
+ args = "(texture: Texture)",
+ description = "Sets the texture (Image or Canvas) used when drawing the Mesh.\n\nWhen called without an argument disables the texture. Untextured meshes have a white color by default.",
+ returns = "()",
+ type = "function"
+ },
+ setVertex = {
+ args = "(index: number, attributecomponent: number, ...: number)",
+ description = "Sets the properties of a vertex in the Mesh.",
+ returns = "()",
+ type = "function"
+ },
+ setVertexAttribute = {
+ args = "(vertexindex: number, attributeindex: number, value1: number, value2: number, ...: number)",
+ description = "Sets the properties of a specific attribute within a vertex in the Mesh.\n\nMeshes without a custom vertex format specified in love.graphics.newMesh have position as their first attribute, texture coordinates as their second attribute, and color as their third attribute.",
+ returns = "()",
+ type = "function"
+ },
+ setVertexColors = {
+ args = "(on: boolean)",
+ description = "Sets if the per-vertex colors are used when rendering instead of the constant color (constant color being love.graphics.setColor or SpriteBatch:setColor)\n\nThe per-vertex colors are automatically enabled by default when making a new Mesh or when doing Mesh:setVertex, but only if at least one vertex color is not the default (255,255,255,255).",
+ returns = "()",
+ type = "function"
+ },
+ setVertexMap = {
+ args = "(vertex_map: table)",
+ description = "Sets the vertex map for a Mesh. The vertex map describes the order in which the vertices are used when the Mesh is drawn.\n\nThe vertex map allows you to re-order or reuse vertices when drawing without changing the actual vertex parameters or duplicating vertices. It is especially useful when combined with different Mesh draw modes.",
+ returns = "()",
+ type = "function"
+ },
+ setVertices = {
+ args = "(vertices: table, startvertex: number)",
+ description = "Replaces all vertices in the Mesh with new ones.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "A 2D polygon mesh used for drawing arbitrary textured shapes.",
+ type = "lib"
+ },
+ MeshDrawMode = {
+ childs = {
+ fan = {
+ description = "The vertices create a \"fan\" shape with the first vertex acting as the hub point. Can be easily used to draw simple convex polygons.",
+ type = "value"
+ },
+ points = {
+ description = "The vertices are drawn as unconnected points (see love.graphics.setPointSize.)",
+ type = "value"
+ },
+ strip = {
+ description = "The vertices create a series of connected triangles using vertices 1, 2, 3, then 3, 2, 4 (note the order), then 3, 4, 5 and so on.",
+ type = "value"
+ },
+ triangles = {
+ description = "The vertices create unconnected triangles.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ ParticleInsertMode = {
+ childs = {
+ bottom = {
+ description = "Particles are inserted at the bottom of the ParticleSystem's list of particles.",
+ type = "value"
+ },
+ random = {
+ description = "Particles are inserted at random positions in the ParticleSystem's list of particles.",
+ type = "value"
+ },
+ top = {
+ description = "Particles are inserted at the top of the ParticleSystem's list of particles.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ ParticleSystem = {
+ childs = {
+ emit = {
+ args = "(numparticles: number)",
+ description = "Emits a burst of particles from the particle emitter.",
+ returns = "()",
+ type = "function"
+ },
+ getAreaSpread = {
+ args = "()",
+ description = "Gets the area-based spawn parameters for the particles.",
+ returns = "(distribution: AreaSpreadDistribution, dx: number, dy: number)",
+ type = "function"
+ },
+ getBufferSize = {
+ args = "()",
+ description = "Gets the size of the buffer (the max allowed amount of particles in the system).",
+ returns = "(buffer: number)",
+ type = "function"
+ },
+ getColors = {
+ args = "()",
+ description = "Gets a series of colors to apply to the particle sprite. The particle system will interpolate between each color evenly over the particle's lifetime. Color modulation needs to be activated for this function to have any effect.\n\nArguments are passed in groups of four, representing the components of the desired RGBA value. At least one color must be specified. A maximum of eight may be used.",
+ returns = "(r1: number, g1: number, b1: number, a1: number, r2: number, g2: number, b2: number, a2: number, ...: number)",
+ type = "function"
+ },
+ getCount = {
+ args = "()",
+ description = "Gets the amount of particles that are currently in the system.",
+ returns = "(count: number)",
+ type = "function"
+ },
+ getDirection = {
+ args = "()",
+ description = "Gets the direction the particles will be emitted in.",
+ returns = "(direction: number)",
+ type = "function"
+ },
+ getEmissionRate = {
+ args = "()",
+ description = "Gets the amount of particles emitted per second.",
+ returns = "(rate: number)",
+ type = "function"
+ },
+ getEmitterLifetime = {
+ args = "()",
+ description = "Gets how long the particle system should emit particles (if -1 then it emits particles forever).",
+ returns = "(life: number)",
+ type = "function"
+ },
+ getInsertMode = {
+ args = "()",
+ description = "Gets the mode to use when the ParticleSystem adds new particles.",
+ returns = "(mode: ParticleInsertMode)",
+ type = "function"
+ },
+ getLinearAcceleration = {
+ args = "()",
+ description = "Gets the linear acceleration (acceleration along the x and y axes) for particles.\n\nEvery particle created will accelerate along the x and y axes between xmin,ymin and xmax,ymax.",
+ returns = "(xmin: number, ymin: number, xmax: number, ymax: number)",
+ type = "function"
+ },
+ getLinearDamping = {
+ args = "()",
+ description = "Gets the amount of linear damping (constant deceleration) for particles.",
+ returns = "(min: number, max: number)",
+ type = "function"
+ },
+ getOffset = {
+ args = "()",
+ description = "Get the offget position which the particle sprite is rotated around. If this function is not used, the particles rotate around their center.",
+ returns = "(x: number, y: number)",
+ type = "function"
+ },
+ getParticleLifetime = {
+ args = "()",
+ description = "Gets the life of the particles.",
+ returns = "(min: number, max: number)",
+ type = "function"
+ },
+ getPosition = {
+ args = "()",
+ description = "Gets the position of the emitter.",
+ returns = "(x: number, y: number)",
+ type = "function"
+ },
+ getRadialAcceleration = {
+ args = "()",
+ description = "Get the radial acceleration (away from the emitter).",
+ returns = "(min: number, max: number)",
+ type = "function"
+ },
+ getRotation = {
+ args = "()",
+ description = "Gets the rotation of the image upon particle creation (in radians).",
+ returns = "(min: number, max: number)",
+ type = "function"
+ },
+ getSizeVariation = {
+ args = "()",
+ description = "Gets the degree of variation (0 meaning no variation and 1 meaning full variation between start and end).",
+ returns = "(variation: number)",
+ type = "function"
+ },
+ getSizes = {
+ args = "()",
+ description = "Gets a series of sizes by which to scale a particle sprite. 1.0 is normal size. The particle system will interpolate between each size evenly over the particle's lifetime.\n\nAt least one size must be specified. A maximum of eight may be used.",
+ returns = "(size1: number, size2: number, ...: number)",
+ type = "function"
+ },
+ getSpeed = {
+ args = "()",
+ description = "Gets the speed of the particles.",
+ returns = "(min: number, max: number)",
+ type = "function"
+ },
+ getSpin = {
+ args = "()",
+ description = "Gets the spin of the sprite.",
+ returns = "(min: number, max: number)",
+ type = "function"
+ },
+ getSpinVariation = {
+ args = "()",
+ description = "Gets the degree of variation (0 meaning no variation and 1 meaning full variation between start and end).",
+ returns = "(variation: number)",
+ type = "function"
+ },
+ getSpread = {
+ args = "()",
+ description = "Gets the amount of spread for the system.",
+ returns = "(spread: number)",
+ type = "function"
+ },
+ getTangentialAcceleration = {
+ args = "()",
+ description = "Gets the tangential acceleration (acceleration perpendicular to the particle's direction).",
+ returns = "(min: number, max: number)",
+ type = "function"
+ },
+ getTexture = {
+ args = "()",
+ description = "Gets the Image or Canvas which is to be emitted.",
+ returns = "(texture: Texture)",
+ type = "function"
+ },
+ hasRelativeRotation = {
+ args = "()",
+ description = "Gets whether particle angles and rotations are relative to their velocities. If enabled, particles are aligned to the angle of their velocities and rotate relative to that angle.",
+ returns = "(enabled: boolean)",
+ type = "function"
+ },
+ isActive = {
+ args = "()",
+ description = "Checks whether the particle system is actively emitting particles.",
+ returns = "(active: boolean)",
+ type = "function"
+ },
+ isPaused = {
+ args = "()",
+ description = "Checks whether the particle system is paused.",
+ returns = "(paused: boolean)",
+ type = "function"
+ },
+ isStopped = {
+ args = "()",
+ description = "Checks whether the particle system is stopped.",
+ returns = "(stopped: boolean)",
+ type = "function"
+ },
+ moveTo = {
+ args = "(x: number, y: number)",
+ description = "Moves the position of the emitter. This results in smoother particle spawning behaviour than if ParticleSystem:setPosition is used every frame.",
+ returns = "()",
+ type = "function"
+ },
+ pause = {
+ args = "()",
+ description = "Pauses the particle emitter.",
+ returns = "()",
+ type = "function"
+ },
+ reset = {
+ args = "()",
+ description = "Resets the particle emitter, removing any existing particles and resetting the lifetime counter.",
+ returns = "()",
+ type = "function"
+ },
+ setAreaSpread = {
+ args = "(distribution: AreaSpreadDistribution, dx: number, dy: number)",
+ description = "Sets area-based spawn parameters for the particles. Newly created particles will spawn in an area around the emitter based on the parameters to this function.",
+ returns = "()",
+ type = "function"
+ },
+ setBufferSize = {
+ args = "(buffer: number)",
+ description = "Sets the size of the buffer (the max allowed amount of particles in the system).",
+ returns = "()",
+ type = "function"
+ },
+ setColors = {
+ args = "(r1: number, g1: number, b1: number, a1: number, r2: number, g2: number, b2: number, a2: number, ...: number)",
+ description = "Sets a series of colors to apply to the particle sprite. The particle system will interpolate between each color evenly over the particle's lifetime. Color modulation needs to be activated for this function to have any effect.\n\nArguments are passed in groups of four, representing the components of the desired RGBA value. At least one color must be specified. A maximum of eight may be used.",
+ returns = "()",
+ type = "function"
+ },
+ setDirection = {
+ args = "(direction: number)",
+ description = "Sets the direction the particles will be emitted in.",
+ returns = "()",
+ type = "function"
+ },
+ setEmissionRate = {
+ args = "(rate: number)",
+ description = "Sets the amount of particles emitted per second.",
+ returns = "()",
+ type = "function"
+ },
+ setEmitterLifetime = {
+ args = "(life: number)",
+ description = "Sets how long the particle system should emit particles (if -1 then it emits particles forever).",
+ returns = "()",
+ type = "function"
+ },
+ setInsertMode = {
+ args = "(mode: ParticleInsertMode)",
+ description = "Sets the mode to use when the ParticleSystem adds new particles.",
+ returns = "()",
+ type = "function"
+ },
+ setLinearAcceleration = {
+ args = "(xmin: number, ymin: number, xmax: number, ymax: number)",
+ description = "Sets the linear acceleration (acceleration along the x and y axes) for particles.\n\nEvery particle created will accelerate along the x and y axes between xmin,ymin and xmax,ymax.",
+ returns = "()",
+ type = "function"
+ },
+ setLinearDamping = {
+ args = "(min: number, max: number)",
+ description = "Sets the amount of linear damping (constant deceleration) for particles.",
+ returns = "()",
+ type = "function"
+ },
+ setOffset = {
+ args = "(x: number, y: number)",
+ description = "Set the offset position which the particle sprite is rotated around. If this function is not used, the particles rotate around their center.",
+ returns = "()",
+ type = "function"
+ },
+ setParticleLifetime = {
+ args = "(min: number, max: number)",
+ description = "Sets the life of the particles.",
+ returns = "()",
+ type = "function"
+ },
+ setPosition = {
+ args = "(x: number, y: number)",
+ description = "Sets the position of the emitter.",
+ returns = "()",
+ type = "function"
+ },
+ setQuads = {
+ args = "(quad1: Quad, quad2: Quad)",
+ description = "Sets a series of Quads to use for the particle sprites. Particles will choose a Quad from the list based on the particle's current lifetime, allowing for the use of animated sprite sheets with ParticleSystems.",
+ returns = "()",
+ type = "function"
+ },
+ setRadialAcceleration = {
+ args = "(min: number, max: number)",
+ description = "Set the radial acceleration (away from the emitter).",
+ returns = "()",
+ type = "function"
+ },
+ setRelativeRotation = {
+ args = "(enable: boolean)",
+ description = "Sets whether particle angles and rotations are relative to their velocities. If enabled, particles are aligned to the angle of their velocities and rotate relative to that angle.",
+ returns = "()",
+ type = "function"
+ },
+ setRotation = {
+ args = "(min: number, max: number)",
+ description = "Sets the rotation of the image upon particle creation (in radians).",
+ returns = "()",
+ type = "function"
+ },
+ setSizeVariation = {
+ args = "(variation: number)",
+ description = "Sets the degree of variation (0 meaning no variation and 1 meaning full variation between start and end).",
+ returns = "()",
+ type = "function"
+ },
+ setSizes = {
+ args = "(size1: number, size2: number, ...: number)",
+ description = "Sets a series of sizes by which to scale a particle sprite. 1.0 is normal size. The particle system will interpolate between each size evenly over the particle's lifetime.\n\nAt least one size must be specified. A maximum of eight may be used.",
+ returns = "()",
+ type = "function"
+ },
+ setSpeed = {
+ args = "(min: number, max: number)",
+ description = "Sets the speed of the particles.",
+ returns = "()",
+ type = "function"
+ },
+ setSpin = {
+ args = "(min: number, max: number)",
+ description = "Sets the spin of the sprite.",
+ returns = "()",
+ type = "function"
+ },
+ setSpinVariation = {
+ args = "(variation: number)",
+ description = "Sets the degree of variation (0 meaning no variation and 1 meaning full variation between start and end).",
+ returns = "()",
+ type = "function"
+ },
+ setSpread = {
+ args = "(spread: number)",
+ description = "Sets the amount of spread for the system.",
+ returns = "()",
+ type = "function"
+ },
+ setTangentialAcceleration = {
+ args = "(min: number, max: number)",
+ description = "Sets the tangential acceleration (acceleration perpendicular to the particle's direction).",
+ returns = "()",
+ type = "function"
+ },
+ setTexture = {
+ args = "(texture: Texture)",
+ description = "Sets the Image or Canvas which is to be emitted.",
+ returns = "()",
+ type = "function"
+ },
+ start = {
+ args = "()",
+ description = "Starts the particle emitter.",
+ returns = "()",
+ type = "function"
+ },
+ stop = {
+ args = "()",
+ description = "Stops the particle emitter, resetting the lifetime counter.",
+ returns = "()",
+ type = "function"
+ },
+ update = {
+ args = "(dt: number)",
+ description = "Updates the particle system; moving, creating and killing particles.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Used to create cool effects, like fire. The particle systems are created and drawn on the screen using functions in love.graphics. They also need to be updated in the update(dt) callback for you to see any changes in the particles emitted.",
+ type = "lib"
+ },
+ PointStyle = {
+ childs = {
+ rough = {
+ description = "Draw rough points.",
+ type = "value"
+ },
+ smooth = {
+ description = "Draw smooth points.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ Quad = {
+ childs = {
+ setViewport = {
+ args = "()",
+ description = "Sets the texture coordinates according to a viewport.",
+ returns = "(x: number, y: number, w: number, h: number)",
+ type = "function"
+ }
+ },
+ description = "A quadrilateral (a polygon with four sides and four corners) with texture coordinate information.\n\nQuads can be used to select part of a texture to draw. In this way, one large texture atlas can be loaded, and then split up into sub-images.",
+ type = "lib"
+ },
+ Shader = {
+ childs = {
+ getWarnings = {
+ args = "()",
+ description = "Returns any warning and error messages from compiling the shader code. This can be used for debugging your shaders if there's anything the graphics hardware doesn't like.",
+ returns = "(warnings: string)",
+ type = "function"
+ },
+ send = {
+ args = "(name: string, number: number, ...: number)",
+ description = "Sends one or more values to a special (extern) variable inside the shader.",
+ returns = "()",
+ type = "function"
+ },
+ sendColor = {
+ args = "(name: string, color: table, ...: table)",
+ description = "Sends one or more colors to a special (extern / uniform) vec3 or vec4 variable inside the shader. The color components must be in the range of [0, 255], unlike Shader:send. The colors are gamma-corrected if global gamma-correction is enabled.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "A Shader is used for advanced hardware-accelerated pixel or vertex manipulation. These effects are written in a language based on GLSL (OpenGL Shading Language) with a few things simplified for easier coding.\n\nPotential uses for pixel effects include HDR/bloom, motion blur, grayscale/invert/sepia/any kind of color effect, reflection/refraction, distortions, and much more!",
+ type = "lib"
+ },
+ SpriteBatch = {
+ childs = {
+ attachAttribute = {
+ args = "(name: string, mesh: Mesh)",
+ description = "Attaches a per-vertex attribute from a Mesh onto this SpriteBatch, for use when drawing. This can be combined with a Shader to augment a SpriteBatch with per-vertex or additional per-sprite information instead of just having per-sprite colors.\n\nEach sprite in a SpriteBatch has 4 vertices in the following order: top-left, bottom-left, top-right, bottom-right. The index returned by SpriteBatch:add (and used by SpriteBatch:set) can be multiplied by 4 to determine the first vertex in a specific sprite.",
+ returns = "()",
+ type = "function"
+ },
+ clear = {
+ args = "()",
+ description = "Removes all sprites from the buffer.",
+ returns = "()",
+ type = "function"
+ },
+ flush = {
+ args = "()",
+ description = "Immediately sends all new and modified sprite data in the batch to the graphics card.",
+ returns = "()",
+ type = "function"
+ },
+ getBufferSize = {
+ args = "()",
+ description = "Gets the maximum number of sprites the SpriteBatch can hold.",
+ returns = "(size: number)",
+ type = "function"
+ },
+ getColor = {
+ args = "(r: number, g: number, b: number, a: number)",
+ description = "Gets the color that will be used for the next add and set operations.\n\nIf no color has been set with SpriteBatch:setColor or the current SpriteBatch color has been cleared, this method will return nil.",
+ returns = "()",
+ type = "function"
+ },
+ getCount = {
+ args = "()",
+ description = "Gets the amount of sprites currently in the SpriteBatch.",
+ returns = "(count: number)",
+ type = "function"
+ },
+ getTexture = {
+ args = "()",
+ description = "Returns the Image or Canvas used by the SpriteBatch.",
+ returns = "(texture: Texture)",
+ type = "function"
+ },
+ set = {
+ args = "(id: number, x: number, y: number, r: number, sx: number, sy: number, ox: number, oy: number, kx: number, ky: number)",
+ description = "Changes a sprite in the batch. This requires the identifier returned by add and addq.",
+ returns = "()",
+ type = "function"
+ },
+ setBufferSize = {
+ args = "(size: number)",
+ description = "Sets the maximum number of sprites the SpriteBatch can hold. Existing sprites in the batch (up to the new maximum) will not be cleared when this function is called.",
+ returns = "()",
+ type = "function"
+ },
+ setColor = {
+ args = "(r: number, g: number, b: number, a: number)",
+ description = "Sets the color that will be used for the next add and set operations. Calling the function without arguments will clear the color.\n\nThe global color set with love.graphics.setColor will not work on the SpriteBatch if any of the sprites has its own color.",
+ returns = "()",
+ type = "function"
+ },
+ setTexture = {
+ args = "(texture: Texture)",
+ description = "Replaces the Image or Canvas used for the sprites.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Using a single image, draw any number of identical copies of the image using a single call to love.graphics.draw. This can be used, for example, to draw repeating copies of a single background image.\n\nA SpriteBatch can be even more useful when the underlying image is a Texture Atlas (a single image file containing many independent images); by adding Quad to the batch, different sub-images from within the atlas can be drawn.",
+ type = "lib"
+ },
+ SpriteBatchUsage = {
+ childs = {
+ dynamic = {
+ description = "The object's data will change repeatedly during its lifetime.",
+ type = "value"
+ },
+ static = {
+ description = "The object will not be modified after initial sprites or vertices are added.",
+ type = "value"
+ },
+ stream = {
+ description = "The object data will always change between draws.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ StackType = {
+ childs = {
+ all = {
+ description = "All love.graphics state, including transform state.",
+ type = "value"
+ },
+ transform = {
+ description = "The transformation stack (love.graphics.translate, love.graphics.rotate, etc.)",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ Text = {
+ childs = {
+ addf = {
+ args = "(textstring: string, wraplimit: number, align: AlignMode, x: number, y: number, angle: number, sx: number, sy: number, ox: number, oy: number, kx: number, ky: number)",
+ description = "Adds additional formatted / colored text to the Text object at the specified position.",
+ returns = "(index: number)",
+ type = "function"
+ },
+ clear = {
+ args = "()",
+ description = "Clears the contents of the Text object.",
+ returns = "()",
+ type = "function"
+ },
+ getFont = {
+ args = "()",
+ description = "Gets the Font used with the Text object.",
+ returns = "(font: Font)",
+ type = "function"
+ },
+ getHeight = {
+ args = "(index: number)",
+ description = "Gets the height of the text in pixels.",
+ returns = "(height: number)",
+ type = "function"
+ },
+ getWidth = {
+ args = "(index: number)",
+ description = "Gets the width of the text in pixels.",
+ returns = "(width: number)",
+ type = "function"
+ },
+ set = {
+ args = "(textstring: string)",
+ description = "Replaces the contents of the Text object with a new unformatted string.",
+ returns = "()",
+ type = "function"
+ },
+ setFont = {
+ args = "(font: Font)",
+ description = "Replaces the Font used with the text.",
+ returns = "()",
+ type = "function"
+ },
+ setf = {
+ args = "(textstring: string, wraplimit: number, align: AlignMode)",
+ description = "Replaces the contents of the Text object with a new formatted string.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Drawable text.",
+ type = "lib"
+ },
+ TextureFormat = {
+ childs = {
+ hdr = {
+ description = "Only usable in Canvases. The HDR texture format: floating point 16 bits per channel (64 bpp) RGBA.",
+ type = "value"
+ },
+ normal = {
+ description = "The default texture format: 8 bits per channel (32 bpp) RGBA.",
+ type = "value"
+ },
+ srgb = {
+ description = "The same as normal, but the texture is interpreted as being in the sRGB color space. It will be decoded from sRGB to linear RGB when drawn or sampled from in a shader. For Canvases, this will also convert everything drawn to the Canvas from linear RGB to sRGB.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ WrapMode = {
+ childs = {
+ clamp = {
+ description = "How the image wraps inside a Quad with a larger quad size than image size. This also affects how Meshes with texture coordinates which are outside the range of [0, 1] are drawn, and the color returned by the Texel Shader function when using it to sample from texture coordinates outside of the range of [0, 1].",
+ type = "value"
+ },
+ clampzero = {
+ description = "Clamp the texture. Fills the area outside the texture's normal range with transparent black (or opaque black for textures with no alpha channel.)",
+ type = "value"
+ },
+ mirroredrepeat = {
+ description = "Repeat the texture, flipping it each time it repeats. May produce better visual results than the repeat mode when the texture doesn't seamlessly tile.",
+ type = "value"
+ },
+ ["repeat"] = {
+ description = "Repeat the image. Fills the whole available extent.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ circle = {
+ args = "(mode: DrawMode, x: number, y: number, radius: number, segments: number)",
+ description = "Draws a circle.",
+ returns = "()",
+ type = "function"
+ },
+ clear = {
+ args = "(r: number, g: number, b: number, a: number)",
+ description = "Clears the screen to the background color in LÖVE 0.9.2 and earlier, or to the specified color in 0.10.0 and newer.\n\nThis function is called automatically before love.draw in the default love.run function. See the example in love.run for a typical use of this function.\n\nNote that the scissor area bounds the cleared region.",
+ returns = "()",
+ type = "function"
+ },
+ discard = {
+ args = "(discardcolor: boolean, discardstencil: boolean)",
+ description = "Discards (trashes) the contents of the screen or active Canvas. This is a performance optimization function with niche use cases.\n\nIf the active Canvas has just been changed and the \"replace\" BlendMode is about to be used to draw something which covers the entire screen, calling love.graphics.discard rather than calling love.graphics.clear or doing nothing may improve performance on mobile devices.\n\nOn some desktop systems this function may do nothing.",
+ returns = "()",
+ type = "function"
+ },
+ draw = {
+ args = "(drawable: Drawable, x: number, y: number, r: number, sx: number, sy: number, ox: number, oy: number, kx: number, ky: number)",
+ description = "Draws objects on screen. Drawable objects are loaded images, but may be other kinds of Drawable objects, such as a ParticleSystem.\n\nIn addition to simple drawing, this function can rotate and scale the object at the same time, as well as offset the image (for example, to center the image at the chosen coordinates).\n\nlove.graphics.draw anchors from the top left corner by default.\n\nYou can specify a negative value for sx or sy to flip the drawable horizontally or vertically.\n\nThe pivotal point is (x, y) on the screen and (ox, oy) in the internal coordinate system of the drawable object, before rotation and scaling. The object is scaled by (sx, sy), then rotated by r around the pivotal point.\n\nThe origin offset values are most often used to shift the images up and left by half of its height and width, so that (effectively) the specified x and y coordinates are where the center of the image will end up.",
+ returns = "()",
+ type = "function"
+ },
+ ellipse = {
+ args = "(mode: DrawMode, x: number, y: number, radiusx: number, radiusy: number)",
+ description = "Draws an ellipse.",
+ returns = "()",
+ type = "function"
+ },
+ getBackgroundColor = {
+ args = "()",
+ description = "Gets the current background color.",
+ returns = "(r: number, g: number, b: number, a: number)",
+ type = "function"
+ },
+ getBlendMode = {
+ args = "()",
+ description = "Gets the blending mode.",
+ returns = "(mode: BlendMode)",
+ type = "function"
+ },
+ getCanvas = {
+ args = "()",
+ description = "Gets the current target Canvas.",
+ returns = "(canvas: Canvas)",
+ type = "function"
+ },
+ getCanvasFormats = {
+ args = "()",
+ description = "Gets the available Canvas formats, and whether each is supported.",
+ returns = "(formats: table)",
+ type = "function"
+ },
+ getColor = {
+ args = "()",
+ description = "Gets the current color.",
+ returns = "(r: number, g: number, b: number, a: number)",
+ type = "function"
+ },
+ getColorMask = {
+ args = "()",
+ description = "Gets the active color components used when drawing. Normally all 4 components are active unless love.graphics.setColorMask has been used.\n\nThe color mask determines whether individual components of the colors of drawn objects will affect the color of the screen. They affect love.graphics.clear and Canvas:clear as well.",
+ returns = "(r: boolean, g: boolean, b: boolean, a: boolean)",
+ type = "function"
+ },
+ getCompressedImageFormats = {
+ args = "()",
+ description = "Gets the available compressed image formats, and whether each is supported.",
+ returns = "(formats: table)",
+ type = "function"
+ },
+ getDefaultFilter = {
+ args = "()",
+ description = "Returns the default scaling filters used with Images, Canvases, and Fonts.",
+ returns = "(min: FilterMode, mag: FilterMode, anisotropy: number)",
+ type = "function"
+ },
+ getDimensions = {
+ args = "()",
+ description = "Gets the width and height of the window.",
+ returns = "(width: number, height: number)",
+ type = "function"
+ },
+ getFSAA = {
+ args = "()",
+ description = "Gets the number of antialiasing samples used when drawing to the Canvas.\n\nThis may be different than the number used as an argument to love.graphics.newCanvas if the system running LÖVE doesn't support that number.",
+ returns = "(samples: number)",
+ type = "function"
+ },
+ getFont = {
+ args = "()",
+ description = "Gets the current Font object.",
+ returns = "(font: Font)",
+ type = "function"
+ },
+ getFullscreenModes = {
+ args = "()",
+ description = "Gets a list of supported fullscreen modes.",
+ returns = "(modes: table)",
+ type = "function"
+ },
+ getHeight = {
+ args = "()",
+ description = "Gets the height of the window.",
+ returns = "(height: number)",
+ type = "function"
+ },
+ getLineJoin = {
+ args = "()",
+ description = "Gets the line join style.",
+ returns = "(join: LineJoin)",
+ type = "function"
+ },
+ getLineStyle = {
+ args = "()",
+ description = "Gets the line style.",
+ returns = "(style: LineStyle)",
+ type = "function"
+ },
+ getLineWidth = {
+ args = "()",
+ description = "Gets the current line width.",
+ returns = "(width: number)",
+ type = "function"
+ },
+ getPointSize = {
+ args = "()",
+ description = "Gets the point size.",
+ returns = "(size: number)",
+ type = "function"
+ },
+ getRendererInfo = {
+ args = "()",
+ description = "Gets information about the system's video card and drivers.",
+ returns = "(name: string, version: string, vendor: string, device: string)",
+ type = "function"
+ },
+ getScissor = {
+ args = "()",
+ description = "Gets the current scissor box.",
+ returns = "(x: number, y: number, width: number, height: number)",
+ type = "function"
+ },
+ getShader = {
+ args = "()",
+ description = "Returns the current Shader. Returns nil if none is set.",
+ returns = "(shader: Shader)",
+ type = "function"
+ },
+ getStats = {
+ args = "()",
+ description = "Gets performance-related rendering statistics.",
+ returns = "(drawcalls: number, canvasswitches: number, texturememory: number, images: number, canvases: number, fonts: number)",
+ type = "function"
+ },
+ getStencilTest = {
+ args = "()",
+ description = "Gets whether stencil testing is enabled.\n\nWhen stencil testing is enabled, the geometry of everything that is drawn will be clipped / stencilled out based on whether it intersects with what has been previously drawn to the stencil buffer.\n\nEach Canvas has its own stencil buffer.",
+ returns = "(enabled: boolean, inverted: boolean)",
+ type = "function"
+ },
+ getSupported = {
+ args = "()",
+ description = "Gets the optional graphics features and whether they're supported on the system.\n\nSome older or low-end systems don't always support all graphics features.",
+ returns = "(features: table)",
+ type = "function"
+ },
+ getSystemLimits = {
+ args = "()",
+ description = "Gets the system-dependent maximum values for love.graphics features.",
+ returns = "(limits: table)",
+ type = "function"
+ },
+ getWidth = {
+ args = "()",
+ description = "Gets the width of the window.",
+ returns = "(width: number)",
+ type = "function"
+ },
+ intersectScissor = {
+ args = "(x: number, y: number, width: number, height: number)",
+ description = "Sets the scissor to the rectangle created by the intersection of the specified rectangle with the existing scissor. If no scissor is active yet, it behaves like love.graphics.setScissor.\n\nThe scissor limits the drawing area to a specified rectangle. This affects all graphics calls, including love.graphics.clear.\n\nThe dimensions of the scissor is unaffected by graphical transformations (translate, scale, ...).",
+ returns = "()",
+ type = "function"
+ },
+ isGammaCorrect = {
+ args = "()",
+ description = "Gets whether gamma-correct rendering is supported and enabled. It can be enabled by setting t.gammacorrect = true in love.conf.\n\nNot all devices support gamma-correct rendering, in which case it will be automatically disabled and this function will return false. It is supported on desktop systems which have graphics cards that are capable of using OpenGL 3 / DIrectX 10, and iOS devices that can use OpenGL ES 3.",
+ returns = "(gammacorrect: boolean)",
+ type = "function"
+ },
+ isWireframe = {
+ args = "()",
+ description = "Gets whether wireframe mode is used when drawing.",
+ returns = "(wireframe: boolean)",
+ type = "function"
+ },
+ line = {
+ args = "(x1: number, y1: number, x2: number, y2: number, ...: number)",
+ description = "Draws lines between points.",
+ returns = "()",
+ type = "function"
+ },
+ newCanvas = {
+ args = "(width: number, height: number, texture_type: TextureFormat, fsaa: number)",
+ description = "Creates a new Canvas object for offscreen rendering.\n\nAntialiased Canvases have slightly higher system requirements than normal Canvases. Additionally, the supported maximum number of FSAA samples varies depending on the system. Use love.graphics.getSystemLimit to check.\n\nIf the number of FSAA samples specified is greater than the maximum supported by the system, the Canvas will still be created but only using the maximum supported amount (this includes 0.)",
+ returns = "(canvas: Canvas)",
+ type = "function"
+ },
+ newFont = {
+ args = "(filename: string, size: number)",
+ description = "Creates a new Font.",
+ returns = "(font: Font)",
+ type = "function"
+ },
+ newImage = {
+ args = "(filename: string)",
+ description = "Creates a new Image from a filepath, FileData, an ImageData, or a CompressedImageData, and optionally generates or specifies mipmaps for the image.",
+ returns = "(image: Image)",
+ type = "function"
+ },
+ newImageFont = {
+ args = "(filename: string, glyphs: string)",
+ description = "Creates a new Font by loading a specifically formatted image. There can be up to 256 glyphs.\n\nIn versions prior to 0.9.0, LÖVE expects ISO 8859-1 encoding for the glyphs string.",
+ returns = "(font: Font)",
+ type = "function"
+ },
+ newMesh = {
+ args = "(vertices: table, mode: MeshDrawMode, usage: SpriteBatchUsage)",
+ description = "Creates a new Mesh.\n\nUse Mesh:setTexture if the Mesh should be textured with an Image or Canvas when it's drawn.",
+ returns = "(mesh: Mesh)",
+ type = "function"
+ },
+ newParticleSystem = {
+ args = "(texture: Texture, buffer: number)",
+ description = "Creates a new ParticleSystem.",
+ returns = "(system: ParticleSystem)",
+ type = "function"
+ },
+ newQuad = {
+ args = "(x: number, y: number, width: number, height: number, sw: number, sh: number)",
+ description = "Creates a new Quad.\n\nThe purpose of a Quad is to describe the result of the following transformation on any drawable object. The object is first scaled to dimensions sw * sh. The Quad then describes the rectangular area of dimensions width * height whose upper left corner is at position (x, y) inside the scaled object.",
+ returns = "(quad: Quad)",
+ type = "function"
+ },
+ newScreenshot = {
+ args = "()",
+ description = "Creates a screenshot and returns the image data.",
+ returns = "(screenshot: ImageData)",
+ type = "function"
+ },
+ newShader = {
+ args = "(code: string)",
+ description = "Creates a new Shader object for hardware-accelerated vertex and pixel effects. A Shader contains either vertex shader code, pixel shader code, or both.\n\nVertex shader code must contain at least one function, named position, which is the function that will produce transformed vertex positions of drawn objects in screen-space.\n\nPixel shader code must contain at least one function, named effect, which is the function that will produce the color which is blended onto the screen for each pixel a drawn object touches.",
+ returns = "(shader: Shader)",
+ type = "function"
+ },
+ newSpriteBatch = {
+ args = "(texture: Texture, size: number, usage: SpriteBatchUsage)",
+ description = "Creates a new SpriteBatch object.",
+ returns = "(spriteBatch: SpriteBatch)",
+ type = "function"
+ },
+ newText = {
+ args = "(font: Font, textstring: string)",
+ description = "Creates a new Font.",
+ returns = "(text: Text)",
+ type = "function"
+ },
+ newVideo = {
+ args = "(filename: string, loadaudio: boolean)",
+ description = "Creates a new drawable Video. Currently only Ogg Theora video files are supported.",
+ returns = "(video: Video)",
+ type = "function"
+ },
+ origin = {
+ args = "()",
+ description = "Resets the current coordinate transformation.\n\nThis function is always used to reverse any previous calls to love.graphics.rotate, love.graphics.scale, love.graphics.shear or love.graphics.translate. It returns the current transformation state to its defaults.",
+ returns = "()",
+ type = "function"
+ },
+ points = {
+ args = "(x: number, y: number, ...: number)",
+ description = "Draws one or more points.",
+ returns = "()",
+ type = "function"
+ },
+ polygon = {
+ args = "(mode: DrawMode, ...: number)",
+ description = "Draw a polygon.\n\nFollowing the mode argument, this function can accept multiple numeric arguments or a single table of numeric arguments. In either case the arguments are interpreted as alternating x and y coordinates of the polygon's vertices.\n\nWhen in fill mode, the polygon must be convex and simple or rendering artifacts may occur.",
+ returns = "()",
+ type = "function"
+ },
+ pop = {
+ args = "()",
+ description = "Pops the current coordinate transformation from the transformation stack.\n\nThis function is always used to reverse a previous push operation. It returns the current transformation state to what it was before the last preceding push. For an example, see the description of love.graphics.push.",
+ returns = "()",
+ type = "function"
+ },
+ present = {
+ args = "()",
+ description = "Displays the results of drawing operations on the screen.\n\nThis function is used when writing your own love.run function. It presents all the results of your drawing operations on the screen. See the example in love.run for a typical use of this function.",
+ returns = "()",
+ type = "function"
+ },
+ print = {
+ args = "(text: string, x: number, y: number, r: number, sx: number, sy: number, ox: number, oy: number, kx: number, ky: number)",
+ description = "Draws text on screen. If no Font is set, one will be created and set (once) if needed.\n\nWhen using translation and scaling functions while drawing text, this function assumes the scale occurs first. If you don't script with this in mind, the text won't be in the right position, or possibly even on screen.\n\nlove.graphics.print stops at the first '\0' (null) character. This can bite you if you are appending keystrokes to form your string, as some of those are multi-byte unicode characters which will likely contain null bytes.",
+ returns = "()",
+ type = "function"
+ },
+ printf = {
+ args = "(text: string, x: number, y: number, limit: number, align: AlignMode, r: number, sx: number, sy: number, ox: number, oy: number, kx: number, ky: number)",
+ description = "Draws formatted text, with word wrap and alignment.\n\nSee additional notes in love.graphics.print.",
+ returns = "()",
+ type = "function"
+ },
+ push = {
+ args = "(stack: StackType)",
+ description = "Copies and pushes the current coordinate transformation to the transformation stack.\n\nThis function is always used to prepare for a corresponding pop operation later. It stores the current coordinate transformation state into the transformation stack and keeps it active. Later changes to the transformation can be undone by using the pop operation, which returns the coordinate transform to the state it was in before calling push.",
+ returns = "()",
+ type = "function"
+ },
+ rectangle = {
+ args = "(mode: DrawMode, x: number, y: number, width: number, height: number)",
+ description = "Draws a rectangle.",
+ returns = "()",
+ type = "function"
+ },
+ reset = {
+ args = "()",
+ description = "Resets the current graphics settings.\n\nCalling reset makes the current drawing color white, the current background color black, resets any active Canvas or Shader, and removes any scissor settings. It sets the BlendMode to alpha. It also sets both the point and line drawing modes to smooth and their sizes to 1.0.",
+ returns = "()",
+ type = "function"
+ },
+ rotate = {
+ args = "(angle: number)",
+ description = "Rotates the coordinate system in two dimensions.\n\nCalling this function affects all future drawing operations by rotating the coordinate system around the origin by the given amount of radians. This change lasts until love.draw exits.",
+ returns = "()",
+ type = "function"
+ },
+ scale = {
+ args = "(sx: number, sy: number)",
+ description = "Scales the coordinate system in two dimensions.\n\nBy default the coordinate system in LÖVE corresponds to the display pixels in horizontal and vertical directions one-to-one, and the x-axis increases towards the right while the y-axis increases downwards. Scaling the coordinate system changes this relation.\n\nAfter scaling by sx and sy, all coordinates are treated as if they were multiplied by sx and sy. Every result of a drawing operation is also correspondingly scaled, so scaling by (2, 2) for example would mean making everything twice as large in both x- and y-directions. Scaling by a negative value flips the coordinate system in the corresponding direction, which also means everything will be drawn flipped or upside down, or both. Scaling by zero is not a useful operation.\n\nScale and translate are not commutative operations, therefore, calling them in different orders will change the outcome.\n\nScaling lasts until love.draw exits.",
+ returns = "()",
+ type = "function"
+ },
+ setBackgroundColor = {
+ args = "(r: number, g: number, b: number, a: number)",
+ description = "Sets the background color.",
+ returns = "()",
+ type = "function"
+ },
+ setBlendMode = {
+ args = "(mode: BlendMode)",
+ description = "Sets the blending mode.",
+ returns = "()",
+ type = "function"
+ },
+ setCanvas = {
+ args = "(canvas: Canvas, ...: Canvas)",
+ description = "Sets the render target to one or more Canvases. All drawing operations until the next love.graphics.setCanvas call will be redirected to the specified canvases and not shown on the screen.\n\nAll canvas arguments must have the same widths and heights and the same texture type. Normally the same thing will be drawn on each canvas, but that can be changed if a pixel shader is used with the \"effects\" function instead of the regular effect.\n\nNot all computers support Canvases, and not all computers which support Canvases will support multiple render targets. Use love.graphics.isSupported to check.\n\nnWhen called without arguments, the render target is reset to the screen.",
+ returns = "()",
+ type = "function"
+ },
+ setColor = {
+ args = "(red: number, green: number, blue: number, alpha: number)",
+ description = "Sets the color used for drawing.",
+ returns = "()",
+ type = "function"
+ },
+ setColorMask = {
+ args = "(red: boolean, green: boolean, blue: boolean, alpha: boolean)",
+ description = "Sets the color mask. Enables or disables specific color components when rendering and clearing the screen. For example, if red is set to false, no further changes will be made to the red component of any pixels.\n\nEnables all color components when called without arguments.",
+ returns = "()",
+ type = "function"
+ },
+ setDefaultFilter = {
+ args = "(min: FilterMode, mag: FilterMode, anisotropy: number)",
+ description = "Sets the default scaling filters used with Images, Canvases, and Fonts.\n\nThis function does not apply retroactively to loaded images.",
+ returns = "()",
+ type = "function"
+ },
+ setFont = {
+ args = "(font: Font)",
+ description = "Set an already-loaded Font as the current font or create and load a new one from the file and size.\n\nIt's recommended that Font objects are created with love.graphics.newFont in the loading stage and then passed to this function in the drawing stage.",
+ returns = "()",
+ type = "function"
+ },
+ setInvertedStencil = {
+ args = "(stencilFunction: function)",
+ description = "Defines an inverted stencil for the drawing operations or releases the active one.\n\nIt's the same as love.graphics.setStencil with the mask inverted.\n\nCalling the function without arguments releases the active stencil.",
+ returns = "()",
+ type = "function"
+ },
+ setLineJoin = {
+ args = "(join: LineJoin)",
+ description = "Sets the line join style.",
+ returns = "()",
+ type = "function"
+ },
+ setLineStyle = {
+ args = "(style: LineStyle)",
+ description = "Sets the line style.",
+ returns = "()",
+ type = "function"
+ },
+ setLineWidth = {
+ args = "(width: number)",
+ description = "Sets the line width.",
+ returns = "()",
+ type = "function"
+ },
+ setNewFont = {
+ args = "(size: number)",
+ description = "Creates and sets a new font.",
+ returns = "(font: Font)",
+ type = "function"
+ },
+ setPointSize = {
+ args = "(size: number)",
+ description = "Sets the point size.",
+ returns = "()",
+ type = "function"
+ },
+ setScissor = {
+ args = "(x: number, y: number, width: number, height: number)",
+ description = "Sets or disables scissor.\n\nThe scissor limits the drawing area to a specified rectangle. This affects all graphics calls, including love.graphics.clear.",
+ returns = "()",
+ type = "function"
+ },
+ setShader = {
+ args = "(shader: Shader)",
+ description = "Sets or resets a Shader as the current pixel effect or vertex shaders. All drawing operations until the next love.graphics.setShader will be drawn using the Shader object specified.\n\nDisables the shaders when called without arguments.",
+ returns = "()",
+ type = "function"
+ },
+ setStencilTest = {
+ args = "(comparemode: CompareMode, comparevalue: number)",
+ description = "Configures or disables stencil testing.\n\nWhen stencil testing is enabled, the geometry of everything that is drawn afterward will be clipped / stencilled out based on a comparison between the arguments of this function and the stencil value of each pixel that the geometry touches. The stencil values of pixels are affected via love.graphics.stencil.\n\nEach Canvas has its own per-pixel stencil values.",
+ returns = "()",
+ type = "function"
+ },
+ setWireframe = {
+ args = "(enable: boolean)",
+ description = "Sets whether wireframe lines will be used when drawing.\n\nWireframe mode should only be used for debugging. The lines drawn with it enabled do not behave like regular love.graphics lines: their widths don't scale with the coordinate transformations or with love.graphics.setLineWidth, and they don't use the smooth LineStyle.",
+ returns = "()",
+ type = "function"
+ },
+ shear = {
+ args = "(kx: number, ky: number)",
+ description = "Shears the coordinate system.",
+ returns = "()",
+ type = "function"
+ },
+ stencil = {
+ args = "(stencilfunction: function, action: StencilAction, value: number, keepvalues: boolean)",
+ description = "Draws geometry as a stencil.\n\nThe geometry drawn by the supplied function sets invisible stencil values of pixels, instead of setting pixel colors. The stencil values of pixels can act like a mask / stencil - love.graphics.setStencilTest can be used afterward to determine how further rendering is affected by the stencil values in each pixel.\n\nEach Canvas has its own per-pixel stencil values. Stencil values are within the range of [0, 255].",
+ returns = "()",
+ type = "function"
+ },
+ translate = {
+ args = "(dx: number, dy: number)",
+ description = "Translates the coordinate system in two dimensions.\n\nWhen this function is called with two numbers, dx, and dy, all the following drawing operations take effect as if their x and y coordinates were x+dx and y+dy.\n\nScale and translate are not commutative operations, therefore, calling them in different orders will change the outcome.\n\nThis change lasts until love.graphics.clear is called (which is called automatically before love.draw in the default love.run function), or a love.graphics.pop reverts to a previous coordinate system state.\n\nTranslating using whole numbers will prevent tearing/blurring of images and fonts draw after translating.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "The primary responsibility for the love.graphics module is the drawing of lines, shapes, text, Images and other Drawable objects onto the screen. Its secondary responsibilities include loading external files (including Images and Fonts) into memory, creating specialized objects (such as ParticleSystems or Framebuffers) and managing screen geometry.\n\nLÖVE's coordinate system is rooted in the upper-left corner of the screen, which is at location (0, 0). The x-axis is horizontal: larger values are further to the right. The y-axis is vertical: larger values are further towards the bottom.\n\nIn many cases, you draw images or shapes in terms of their upper-left corner (See the picture above).\n\nMany of the functions are used to manipulate the graphics coordinate system, which is essentially the way coordinates are mapped to the display. You can change the position, scale, and even rotation in this way.",
+ type = "class"
+ },
+ image = {
+ childs = {
+ CompressedImageData = {
+ childs = {
+ getFormat = {
+ args = "()",
+ description = "Gets the format of the CompressedImageData.",
+ returns = "(format: CompressedImageFormat)",
+ type = "function"
+ },
+ getHeight = {
+ args = "(level: number)",
+ description = "Gets the height of the CompressedImageData.",
+ returns = "(height: number)",
+ type = "function"
+ },
+ getMipmapCount = {
+ args = "(mipmaps: number)",
+ description = "Gets the number of mipmap levels in the CompressedImageData. The base mipmap level (original image) is included in the count.",
+ returns = "()",
+ type = "function"
+ },
+ getWidth = {
+ args = "(level: number)",
+ description = "Gets the width of the CompressedImageData.",
+ returns = "(width: number)",
+ type = "function"
+ }
+ },
+ description = "Represents compressed image data designed to stay compressed in RAM.\n\nCompressedImageData encompasses standard compressed texture formats such as DXT1, DXT5, and BC5 / 3Dc.\n\nYou can't draw CompressedImageData directly to the screen. See Image for that.",
+ type = "lib"
+ },
+ CompressedImageFormat = {
+ childs = {
+ ASTC4x4 = {
+ description = "The 4x4 pixels per block variant of the ASTC format. RGBA data at 8 bits per pixel.",
+ type = "value"
+ },
+ ASTC5x4 = {
+ description = "The 5x4 pixels per block variant of the ASTC format. RGBA data at 6.4 bits per pixel.",
+ type = "value"
+ },
+ ASTC5x5 = {
+ description = "The 5x5 pixels per block variant of the ASTC format. RGBA data at 5.12 bits per pixel.",
+ type = "value"
+ },
+ ASTC6x5 = {
+ description = "The 6x5 pixels per block variant of the ASTC format. RGBA data at 4.27 bits per pixel.",
+ type = "value"
+ },
+ ASTC6x6 = {
+ description = "The 6x6 pixels per block variant of the ASTC format. RGBA data at 3.56 bits per pixel.",
+ type = "value"
+ },
+ ASTC8x5 = {
+ description = "The 8x5 pixels per block variant of the ASTC format. RGBA data at 3.2 bits per pixel.",
+ type = "value"
+ },
+ ASTC8x6 = {
+ description = "The 8x6 pixels per block variant of the ASTC format. RGBA data at 2.67 bits per pixel.",
+ type = "value"
+ },
+ ASTC8x8 = {
+ description = "The 8x8 pixels per block variant of the ASTC format. RGBA data at 2 bits per pixel.",
+ type = "value"
+ },
+ ASTC10x5 = {
+ description = "The 10x5 pixels per block variant of the ASTC format. RGBA data at 2.56 bits per pixel.",
+ type = "value"
+ },
+ ASTC10x6 = {
+ description = "The 10x6 pixels per block variant of the ASTC format. RGBA data at 2.13 bits per pixel.",
+ type = "value"
+ },
+ ASTC10x8 = {
+ description = "The 10x8 pixels per block variant of the ASTC format. RGBA data at 1.6 bits per pixel.",
+ type = "value"
+ },
+ ASTC10x10 = {
+ description = "The 10x10 pixels per block variant of the ASTC format. RGBA data at 1.28 bits per pixel.",
+ type = "value"
+ },
+ ASTC12x10 = {
+ description = "The 12x10 pixels per block variant of the ASTC format. RGBA data at 1.07 bits per pixel.",
+ type = "value"
+ },
+ ASTC12x12 = {
+ description = "The 12x12 pixels per block variant of the ASTC format. RGBA data at 0.89 bits per pixel.",
+ type = "value"
+ },
+ BC4 = {
+ description = "The BC4 format (also known as 3Dc+ or ATI1.) Stores just the red channel, at 4 bits per pixel.",
+ type = "value"
+ },
+ BC4s = {
+ description = "The signed variant of the BC4 format. Same as above but the pixel values in the texture are in the range of [-1, 1] instead of [0, 1] in shaders.",
+ type = "value"
+ },
+ BC5 = {
+ description = "The BC5 format (also known as 3Dc or ATI2.) Stores red and green channels at 8 bits per pixel.",
+ type = "value"
+ },
+ BC5s = {
+ description = "The signed variant of the BC5 format.",
+ type = "value"
+ },
+ BC6h = {
+ description = "The BC6H format. Stores half-precision floating-point RGB data in the range of [0, 65504] at 8 bits per pixel. Suitable for HDR images on desktop systems.",
+ type = "value"
+ },
+ BC6hs = {
+ description = "The signed variant of the BC6H format. Stores RGB data in the range of [-65504, +65504].",
+ type = "value"
+ },
+ BC7 = {
+ description = "The BC7 format (also known as BPTC.) Stores RGB or RGBA data at 8 bits per pixel.",
+ type = "value"
+ },
+ DXT1 = {
+ description = "The DXT1 format. RGB data at 4 bits per pixel (compared to 32 bits for ImageData and regular Images.) Suitable for fully opaque images. Suitable for fully opaque images on desktop systems.",
+ type = "value"
+ },
+ DXT3 = {
+ description = "The DXT3 format. RGBA data at 8 bits per pixel. Smooth variations in opacity do not mix well with this format.",
+ type = "value"
+ },
+ DXT5 = {
+ description = "The DXT5 format. RGBA data at 8 bits per pixel. Recommended for images with varying opacity on desktop systems.",
+ type = "value"
+ },
+ EACr = {
+ description = "The single-channel variant of the EAC format. Stores just the red channel, at 4 bits per pixel.",
+ type = "value"
+ },
+ EACrg = {
+ description = "The two-channel variant of the EAC format. Stores red and green channels at 8 bits per pixel.",
+ type = "value"
+ },
+ EACrgs = {
+ description = "The signed two-channel variant of the EAC format.",
+ type = "value"
+ },
+ EACrs = {
+ description = "The signed single-channel variant of the EAC format. Same as above but pixel values in the texture are in the range of [-1, 1] instead of [0, 1] in shaders.",
+ type = "value"
+ },
+ ETC1 = {
+ description = "The ETC1 format. RGB data at 4 bits per pixel. Suitable for fully opaque images on older Android devices.",
+ type = "value"
+ },
+ ETC2rgb = {
+ description = "The RGB variant of the ETC2 format. RGB data at 4 bits per pixel. Suitable for fully opaque images on newer mobile devices.",
+ type = "value"
+ },
+ ETC2rgba = {
+ description = "The RGBA variant of the ETC2 format. RGBA data at 8 bits per pixel. Recommended for images with varying opacity on newer mobile devices.",
+ type = "value"
+ },
+ ETC2rgba1 = {
+ description = "The RGBA variant of the ETC2 format where pixels are either fully transparent or fully opaque. RGBA data at 4 bits per pixel.",
+ type = "value"
+ },
+ PVR1rgb2 = {
+ description = "The 2 bit per pixel RGB variant of the PVRTC1 format. Stores RGB data at 2 bits per pixel. Textures compressed with PVRTC1 formats must be square and power-of-two sized.",
+ type = "value"
+ },
+ PVR1rgb4 = {
+ description = "The 4 bit per pixel RGB variant of the PVRTC1 format. Stores RGB data at 4 bits per pixel.",
+ type = "value"
+ },
+ PVR1rgba2 = {
+ description = "The 2 bit per pixel RGBA variant of the PVRTC1 format.",
+ type = "value"
+ },
+ PVR1rgba4 = {
+ description = "The 4 bit per pixel RGBA variant of the PVRTC1 format.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ ImageData = {
+ childs = {
+ getDimensions = {
+ args = "()",
+ description = "Gets the width and height of the ImageData.",
+ returns = "(width: number, height: number)",
+ type = "function"
+ },
+ getHeight = {
+ args = "()",
+ description = "Gets the height of the ImageData.",
+ returns = "(height: number)",
+ type = "function"
+ },
+ getPixel = {
+ args = "(x: number, y: number)",
+ description = "Gets the pixel at the specified position.\n\nValid x and y values start at 0 and go up to image width and height minus 1.",
+ returns = "(r: number, g: number, b: number, a: number)",
+ type = "function"
+ },
+ getWidth = {
+ args = "()",
+ description = "Gets the width of the ImageData.",
+ returns = "(width: number)",
+ type = "function"
+ },
+ mapPixel = {
+ args = "(pixelFunction: function)",
+ description = "Transform an image by applying a function to every pixel.\n\nThis function is a higher order function. It takes another function as a parameter, and calls it once for each pixel in the ImageData.\n\nThe function parameter is called with six parameters for each pixel in turn. The parameters are numbers that represent the x and y coordinates of the pixel and its red, green, blue and alpha values. The function parameter can return up to four number values, which become the new r, g, b and a values of the pixel. If the function returns fewer values, the remaining components are set to 0.",
+ returns = "()",
+ type = "function"
+ },
+ paste = {
+ args = "(source: ImageData, dx: number, dy: number, sx: number, sy: number, sw: number, sh: number)",
+ description = "Paste into ImageData from another source ImageData.",
+ returns = "()",
+ type = "function"
+ },
+ setPixel = {
+ args = "(x: number, y: number, r: number, g: number, b: number, a: number)",
+ description = "Sets the color of a pixel.\n\nValid x and y values start at 0 and go up to image width and height minus 1.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Raw (decoded) image data.\n\nYou can't draw ImageData directly to screen. See Image for that.",
+ type = "lib"
+ },
+ ImageFormat = {
+ childs = {
+ png = {
+ description = "PNG image format.",
+ type = "value"
+ },
+ tga = {
+ description = "Targa image format.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ newCompressedData = {
+ args = "(filename: string)",
+ description = "Create a new CompressedImageData object from a compressed image file. LÖVE supports several compressed texture formats, enumerated in the CompressedImageFormat page.",
+ returns = "(compressedImageData: CompressedImageData)",
+ type = "function"
+ },
+ newImageData = {
+ args = "(width: number, height: number)",
+ description = "Create a new ImageData object.",
+ returns = "(imageData: ImageData)",
+ type = "function"
+ }
+ },
+ description = "Provides an interface to decode encoded image data.",
+ type = "class"
+ },
+ joystick = {
+ childs = {
+ GamepadAxis = {
+ childs = {
+ leftx = {
+ description = "The x-axis of the left thumbstick.",
+ type = "value"
+ },
+ lefty = {
+ description = "The y-axis of the left thumbstick.",
+ type = "value"
+ },
+ rightx = {
+ description = "The x-axis of the right thumbstick.",
+ type = "value"
+ },
+ righty = {
+ description = "The y-axis of the right thumbstick.",
+ type = "value"
+ },
+ triggerleft = {
+ description = "Left analog trigger.",
+ type = "value"
+ },
+ triggerright = {
+ description = "Right analog trigger.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ GamepadButton = {
+ childs = {
+ a = {
+ description = "Bottom face button (A).",
+ type = "value"
+ },
+ b = {
+ description = "Right face button (B).",
+ type = "value"
+ },
+ back = {
+ description = "Back button.",
+ type = "value"
+ },
+ dpdown = {
+ description = "D-pad down.",
+ type = "value"
+ },
+ dpleft = {
+ description = "D-pad left.",
+ type = "value"
+ },
+ dpright = {
+ description = "D-pad right.",
+ type = "value"
+ },
+ dpup = {
+ description = "D-pad up.",
+ type = "value"
+ },
+ guide = {
+ description = "Guide button.",
+ type = "value"
+ },
+ leftshoulder = {
+ description = "Left bumper.",
+ type = "value"
+ },
+ leftstick = {
+ description = "Left stick click button.",
+ type = "value"
+ },
+ rightshoulder = {
+ description = "Right bumper.",
+ type = "value"
+ },
+ rightstick = {
+ description = "Right stick click button.",
+ type = "value"
+ },
+ start = {
+ description = "Start button.",
+ type = "value"
+ },
+ x = {
+ description = "Left face button (X).",
+ type = "value"
+ },
+ y = {
+ description = "Top face button (Y).",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ Joystick = {
+ childs = {
+ getAxis = {
+ args = "(axis: number)",
+ description = "Gets the direction of an axis.",
+ returns = "(direction: number)",
+ type = "function"
+ },
+ getAxisCount = {
+ args = "()",
+ description = "Gets the number of axes on the joystick.",
+ returns = "(axes: number)",
+ type = "function"
+ },
+ getButtonCount = {
+ args = "()",
+ description = "Gets the number of buttons on the joystick.",
+ returns = "(buttons: number)",
+ type = "function"
+ },
+ getGUID = {
+ args = "()",
+ description = "Gets a stable GUID unique to the type of the physical joystick which does not change over time. For example, all Sony Dualshock 3 controllers in OS X have the same GUID. The value is platform-dependent.",
+ returns = "(guid: string)",
+ type = "function"
+ },
+ getGamepadAxis = {
+ args = "(axis: GamepadAxis)",
+ description = "Gets the direction of a virtual gamepad axis. If the Joystick isn't recognized as a gamepad or isn't connected, this function will always return 0.",
+ returns = "(direction: number)",
+ type = "function"
+ },
+ getGamepadMapping = {
+ args = "(axis: GamepadAxis)",
+ description = "Gets the button, axis or hat that a virtual gamepad input is bound to.",
+ returns = "(inputtype: JoystickInputType, inputindex: number, hatdirection: JoystickHat)",
+ type = "function"
+ },
+ getHat = {
+ args = "(hat: number)",
+ description = "Gets the direction of a hat.",
+ returns = "(direction: JoystickHat)",
+ type = "function"
+ },
+ getHatCount = {
+ args = "()",
+ description = "Gets the number of hats on the joystick.",
+ returns = "(hats: number)",
+ type = "function"
+ },
+ getID = {
+ args = "()",
+ description = "Gets the joystick's unique identifier. The identifier will remain the same for the life of the game, even when the Joystick is disconnected and reconnected, but it will change when the game is re-launched.",
+ returns = "(id: number, instanceid: number)",
+ type = "function"
+ },
+ getName = {
+ args = "()",
+ description = "Gets the name of the joystick.",
+ returns = "(name: string)",
+ type = "function"
+ },
+ getVibration = {
+ args = "()",
+ description = "Gets the current vibration motor strengths on a Joystick with rumble support.",
+ returns = "(left: number, right: number)",
+ type = "function"
+ },
+ isConnected = {
+ args = "()",
+ description = "Gets whether the Joystick is connected.",
+ returns = "(connected: boolean)",
+ type = "function"
+ },
+ isDown = {
+ args = "(...: number)",
+ description = "Checks if a button on the Joystick is pressed.",
+ returns = "(anyDown: boolean)",
+ type = "function"
+ },
+ isGamepad = {
+ args = "()",
+ description = "Gets whether the Joystick is recognized as a gamepad. If this is the case, the Joystick's buttons and axes can be used in a standardized manner across different operating systems and joystick models via Joystick:getGamepadAxis and related functions.\n\nLÖVE automatically recognizes most popular controllers with a similar layout to the Xbox 360 controller as gamepads, but you can add more with love.joystick.setGamepadMapping.",
+ returns = "(isgamepad: boolean)",
+ type = "function"
+ },
+ isGamepadDown = {
+ args = "(...: GamepadButton)",
+ description = "Checks if a virtual gamepad button on the Joystick is pressed. If the Joystick is not recognized as a Gamepad or isn't connected, then this function will always return false.",
+ returns = "(anyDown: boolean)",
+ type = "function"
+ },
+ isVibrationSupported = {
+ args = "()",
+ description = "Gets whether the Joystick supports vibration.",
+ returns = "(supported: boolean)",
+ type = "function"
+ },
+ setVibration = {
+ args = "(left: number, right: number)",
+ description = "Sets the vibration motor speeds on a Joystick with rumble support.",
+ returns = "(success: boolean)",
+ type = "function"
+ }
+ },
+ description = "Represents a physical joystick.",
+ type = "lib"
+ },
+ JoystickHat = {
+ childs = {
+ c = {
+ description = "Centered",
+ type = "value"
+ },
+ d = {
+ description = "Down",
+ type = "value"
+ },
+ l = {
+ description = "Left",
+ type = "value"
+ },
+ ld = {
+ description = "Left+Down",
+ type = "value"
+ },
+ lu = {
+ description = "Left+Up",
+ type = "value"
+ },
+ r = {
+ description = "Right",
+ type = "value"
+ },
+ rd = {
+ description = "Right+Down",
+ type = "value"
+ },
+ ru = {
+ description = "Right+Up",
+ type = "value"
+ },
+ u = {
+ description = "Up",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ JoystickInputType = {
+ childs = {
+ axis = {
+ description = "Analog axis.",
+ type = "value"
+ },
+ button = {
+ description = "Button.",
+ type = "value"
+ },
+ hat = {
+ description = "8-direction hat value.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ getJoysticks = {
+ args = "()",
+ description = "Gets a list of connected Joysticks.",
+ returns = "(joysticks: table)",
+ type = "function"
+ },
+ loadGamepadMappings = {
+ args = "(filename: string)",
+ description = "Loads a gamepad mappings string or file created with love.joystick.saveGamepadMappings.",
+ returns = "()",
+ type = "function"
+ },
+ saveGamepadMappings = {
+ args = "(filename: string)",
+ description = "Saves the virtual gamepad mappings of all Joysticks that are recognized as gamepads and have either been recently used or their gamepad bindings have been modified.",
+ returns = "(mappings: string)",
+ type = "function"
+ },
+ setGamepadMapping = {
+ args = "(guid: string, button: GamepadButton, inputtype: JoystickInputType, inputindex: number, hatdirection: JoystickHat)",
+ description = "Binds a virtual gamepad input to a button, axis or hat for all Joysticks of a certain type. For example, if this function is used with a GUID returned by a Dualshock 3 controller in OS X, the binding will affect Joystick:getGamepadAxis and Joystick:isGamepadDown for all Dualshock 3 controllers used with the game when run in OS X.\n\nLÖVE includes built-in gamepad bindings for many common controllers. This function lets you change the bindings or add new ones for types of Joysticks which aren't recognized as gamepads by default.\n\nThe virtual gamepad buttons and axes are designed around the Xbox 360 controller layout.",
+ returns = "(success: boolean)",
+ type = "function"
+ }
+ },
+ description = "Provides an interface to the user's joystick.",
+ type = "class"
+ },
+ joystickadded = {
+ args = "(joystick: Joystick)",
+ description = "Called when a Joystick is connected.\n\nThis callback is also triggered after love.load for every Joystick which was already connected when the game started up.",
+ returns = "()",
+ type = "function"
+ },
+ joystickaxis = {
+ args = "(joystick: Joystick, axis: number, value: number)",
+ description = "Called when a joystick axis moves.",
+ returns = "()",
+ type = "function"
+ },
+ joystickhat = {
+ args = "(joystick: Joystick, hat: number, direction: JoystickHat)",
+ description = "Called when a joystick hat direction changes.",
+ returns = "()",
+ type = "function"
+ },
+ joystickpressed = {
+ args = "(joystick: number, button: number)",
+ description = "Called when a joystick button is pressed.",
+ returns = "()",
+ type = "function"
+ },
+ joystickreleased = {
+ args = "(joystick: number, button: number)",
+ description = "Called when a joystick button is released.",
+ returns = "()",
+ type = "function"
+ },
+ joystickremoved = {
+ args = "(joystick: Joystick)",
+ description = "Called when a Joystick is disconnected.",
+ returns = "()",
+ type = "function"
+ },
+ keyboard = {
+ childs = {
+ KeyConstant = {
+ childs = {
+ ["!"] = {
+ description = "Exclamation mark key",
+ type = "value"
+ },
+ ["\""] = {
+ description = "Double quote key",
+ type = "value"
+ },
+ ["#"] = {
+ description = "Hash key",
+ type = "value"
+ },
+ ["$"] = {
+ description = "Dollar key",
+ type = "value"
+ },
+ ["&"] = {
+ description = "Ampersand key",
+ type = "value"
+ },
+ ["'"] = {
+ description = "Single quote key",
+ type = "value"
+ },
+ ["("] = {
+ description = "Left parenthesis key",
+ type = "value"
+ },
+ [")"] = {
+ description = "Right parenthesis key",
+ type = "value"
+ },
+ ["*"] = {
+ description = "Asterisk key",
+ type = "value"
+ },
+ ["+"] = {
+ description = "Plus key",
+ type = "value"
+ },
+ [","] = {
+ description = "Comma key",
+ type = "value"
+ },
+ ["-"] = {
+ description = "Hyphen-minus key",
+ type = "value"
+ },
+ ["."] = {
+ description = "Full stop key",
+ type = "value"
+ },
+ ["/"] = {
+ description = "Slash key",
+ type = "value"
+ },
+ ["0"] = {
+ description = "The zero key",
+ type = "value"
+ },
+ ["1"] = {
+ description = "The one key",
+ type = "value"
+ },
+ ["2"] = {
+ description = "The two key",
+ type = "value"
+ },
+ ["3"] = {
+ description = "The three key",
+ type = "value"
+ },
+ ["4"] = {
+ description = "The four key",
+ type = "value"
+ },
+ ["5"] = {
+ description = "The five key",
+ type = "value"
+ },
+ ["6"] = {
+ description = "The six key",
+ type = "value"
+ },
+ ["7"] = {
+ description = "The seven key",
+ type = "value"
+ },
+ ["8"] = {
+ description = "The eight key",
+ type = "value"
+ },
+ ["9"] = {
+ description = "The nine key",
+ type = "value"
+ },
+ [":"] = {
+ description = "Colon key",
+ type = "value"
+ },
+ [";"] = {
+ description = "Semicolon key",
+ type = "value"
+ },
+ ["<"] = {
+ description = "Less-than key",
+ type = "value"
+ },
+ ["="] = {
+ description = "Equal key",
+ type = "value"
+ },
+ [">"] = {
+ description = "Greater-than key",
+ type = "value"
+ },
+ ["?"] = {
+ description = "Question mark key",
+ type = "value"
+ },
+ ["@"] = {
+ description = "At sign key",
+ type = "value"
+ },
+ ["["] = {
+ description = "Left square bracket key",
+ type = "value"
+ },
+ ["\\"] = {
+ description = "Backslash key",
+ type = "value"
+ },
+ ["]"] = {
+ description = "Right square bracket key",
+ type = "value"
+ },
+ ["^"] = {
+ description = "Caret key",
+ type = "value"
+ },
+ _ = {
+ description = "Underscore key",
+ type = "value"
+ },
+ ["`"] = {
+ description = "Grave accent key",
+ notes = "Also known as the \"Back tick\" key",
+ type = "value"
+ },
+ a = {
+ description = "The A key",
+ type = "value"
+ },
+ appback = {
+ description = "Application back key",
+ type = "value"
+ },
+ appbookmarks = {
+ description = "Application bookmarks key",
+ type = "value"
+ },
+ appforward = {
+ description = "Application forward key",
+ type = "value"
+ },
+ apphome = {
+ description = "Application home key",
+ type = "value"
+ },
+ apprefresh = {
+ description = "Application refresh key",
+ type = "value"
+ },
+ appsearch = {
+ description = "Application search key",
+ type = "value"
+ },
+ b = {
+ description = "The B key",
+ type = "value"
+ },
+ backspace = {
+ description = "Backspace key",
+ type = "value"
+ },
+ ["break"] = {
+ description = "Break key",
+ type = "value"
+ },
+ c = {
+ description = "The C key",
+ type = "value"
+ },
+ calculator = {
+ description = "Calculator key",
+ type = "value"
+ },
+ capslock = {
+ description = "Caps-lock key",
+ notes = "Caps-on is a key press. Caps-off is a key release.",
+ type = "value"
+ },
+ clear = {
+ description = "Clear key",
+ type = "value"
+ },
+ compose = {
+ description = "Compose key",
+ type = "value"
+ },
+ d = {
+ description = "The D key",
+ type = "value"
+ },
+ delete = {
+ description = "Delete key",
+ type = "value"
+ },
+ down = {
+ description = "Down cursor key",
+ type = "value"
+ },
+ e = {
+ description = "The E key",
+ type = "value"
+ },
+ ["end"] = {
+ description = "End key",
+ type = "value"
+ },
+ escape = {
+ description = "Escape key",
+ type = "value"
+ },
+ euro = {
+ description = "Euro (&euro;) key",
+ type = "value"
+ },
+ f = {
+ description = "The F key",
+ type = "value"
+ },
+ f1 = {
+ description = "The 1st function key",
+ type = "value"
+ },
+ f2 = {
+ description = "The 2nd function key",
+ type = "value"
+ },
+ f3 = {
+ description = "The 3rd function key",
+ type = "value"
+ },
+ f4 = {
+ description = "The 4th function key",
+ type = "value"
+ },
+ f5 = {
+ description = "The 5th function key",
+ type = "value"
+ },
+ f6 = {
+ description = "The 6th function key",
+ type = "value"
+ },
+ f7 = {
+ description = "The 7th function key",
+ type = "value"
+ },
+ f8 = {
+ description = "The 8th function key",
+ type = "value"
+ },
+ f9 = {
+ description = "The 9th function key",
+ type = "value"
+ },
+ f10 = {
+ description = "The 10th function key",
+ type = "value"
+ },
+ f11 = {
+ description = "The 11th function key",
+ type = "value"
+ },
+ f12 = {
+ description = "The 12th function key",
+ type = "value"
+ },
+ f13 = {
+ description = "The 13th function key",
+ type = "value"
+ },
+ f14 = {
+ description = "The 14th function key",
+ type = "value"
+ },
+ f15 = {
+ description = "The 15th function key",
+ type = "value"
+ },
+ g = {
+ description = "The G key",
+ type = "value"
+ },
+ h = {
+ description = "The H key",
+ type = "value"
+ },
+ help = {
+ description = "Help key",
+ type = "value"
+ },
+ home = {
+ description = "Home key",
+ type = "value"
+ },
+ i = {
+ description = "The I key",
+ type = "value"
+ },
+ insert = {
+ description = "Insert key",
+ type = "value"
+ },
+ j = {
+ description = "The J key",
+ type = "value"
+ },
+ k = {
+ description = "The K key",
+ type = "value"
+ },
+ ["kp*"] = {
+ description = "The numpad multiplication key",
+ type = "value"
+ },
+ ["kp+"] = {
+ description = "The numpad addition key",
+ type = "value"
+ },
+ ["kp-"] = {
+ description = "The numpad substraction key",
+ type = "value"
+ },
+ ["kp."] = {
+ description = "The numpad decimal point key",
+ type = "value"
+ },
+ ["kp/"] = {
+ description = "The numpad division key",
+ type = "value"
+ },
+ kp0 = {
+ description = "The numpad zero key",
+ type = "value"
+ },
+ kp1 = {
+ description = "The numpad one key",
+ type = "value"
+ },
+ kp2 = {
+ description = "The numpad two key",
+ type = "value"
+ },
+ kp3 = {
+ description = "The numpad three key",
+ type = "value"
+ },
+ kp4 = {
+ description = "The numpad four key",
+ type = "value"
+ },
+ kp5 = {
+ description = "The numpad five key",
+ type = "value"
+ },
+ kp6 = {
+ description = "The numpad six key",
+ type = "value"
+ },
+ kp7 = {
+ description = "The numpad seven key",
+ type = "value"
+ },
+ kp8 = {
+ description = "The numpad eight key",
+ type = "value"
+ },
+ kp9 = {
+ description = "The numpad nine key",
+ type = "value"
+ },
+ ["kp="] = {
+ description = "The numpad equals key",
+ type = "value"
+ },
+ kpenter = {
+ description = "The numpad enter key",
+ type = "value"
+ },
+ l = {
+ description = "The L key",
+ type = "value"
+ },
+ lalt = {
+ description = "Left alt key",
+ type = "value"
+ },
+ lctrl = {
+ description = "Left control key",
+ type = "value"
+ },
+ left = {
+ description = "Left cursor key",
+ type = "value"
+ },
+ lmeta = {
+ description = "Left meta key",
+ type = "value"
+ },
+ lshift = {
+ description = "Left shift key",
+ type = "value"
+ },
+ lsuper = {
+ description = "Left super key",
+ type = "value"
+ },
+ m = {
+ description = "The M key",
+ type = "value"
+ },
+ mail = {
+ description = "Mail key",
+ type = "value"
+ },
+ menu = {
+ description = "Menu key",
+ type = "value"
+ },
+ mode = {
+ description = "Mode key",
+ type = "value"
+ },
+ n = {
+ description = "The N key",
+ type = "value"
+ },
+ numlock = {
+ description = "Num-lock key",
+ type = "value"
+ },
+ o = {
+ description = "The O key",
+ type = "value"
+ },
+ p = {
+ description = "The P key",
+ type = "value"
+ },
+ pagedown = {
+ description = "Page down key",
+ type = "value"
+ },
+ pageup = {
+ description = "Page up key",
+ type = "value"
+ },
+ pause = {
+ description = "Pause key",
+ type = "value"
+ },
+ power = {
+ description = "Power key",
+ type = "value"
+ },
+ print = {
+ description = "Print key",
+ type = "value"
+ },
+ q = {
+ description = "The Q key",
+ type = "value"
+ },
+ r = {
+ description = "The R key",
+ type = "value"
+ },
+ ralt = {
+ description = "Right alt key",
+ type = "value"
+ },
+ rctrl = {
+ description = "Right control key",
+ type = "value"
+ },
+ ["return"] = {
+ description = "Return key",
+ notes = "Also known as the Enter key",
+ type = "value"
+ },
+ right = {
+ description = "Right cursor key",
+ type = "value"
+ },
+ rmeta = {
+ description = "Right meta key",
+ type = "value"
+ },
+ rshift = {
+ description = "Right shift key",
+ type = "value"
+ },
+ rsuper = {
+ description = "Right super key",
+ type = "value"
+ },
+ s = {
+ description = "The S key",
+ type = "value"
+ },
+ scrollock = {
+ description = "Scroll-lock key",
+ type = "value"
+ },
+ space = {
+ description = "Space key",
+ notes = "In version 0.9.2 and earlier this is represented by the actual space character",
+ type = "value"
+ },
+ sysreq = {
+ description = "System request key",
+ type = "value"
+ },
+ t = {
+ description = "The T key",
+ type = "value"
+ },
+ tab = {
+ description = "Tab key",
+ type = "value"
+ },
+ u = {
+ description = "The U key",
+ type = "value"
+ },
+ undo = {
+ description = "Undo key",
+ type = "value"
+ },
+ up = {
+ description = "Up cursor key",
+ type = "value"
+ },
+ v = {
+ description = "The V key",
+ type = "value"
+ },
+ w = {
+ description = "The W key",
+ type = "value"
+ },
+ www = {
+ description = "WWW key",
+ type = "value"
+ },
+ x = {
+ description = "The X key",
+ type = "value"
+ },
+ y = {
+ description = "The Y key",
+ type = "value"
+ },
+ z = {
+ description = "The Z key",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ getScancodeFromKey = {
+ args = "(key: KeyConstant)",
+ description = "Gets the hardware scancode corresponding to the given key.\n\nUnlike key constants, Scancodes are keyboard layout-independent. For example the scancode \"w\" will be generated if the key in the same place as the \"w\" key on an American keyboard is pressed, no matter what the key is labelled or what the user's operating system settings are.\n\nScancodes are useful for creating default controls that have the same physical locations on on all systems.",
+ returns = "(scancode: Scancode)",
+ type = "function"
+ },
+ hasKeyRepeat = {
+ args = "()",
+ description = "Gets whether key repeat is enabled.",
+ returns = "(enabled: boolean)",
+ type = "function"
+ },
+ hasTextInput = {
+ args = "()",
+ description = "Gets whether text input events are enabled.",
+ returns = "(enabled: boolean)",
+ type = "function"
+ },
+ isDown = {
+ args = "(key: KeyConstant)",
+ description = "Checks whether a certain key is down. Not to be confused with love.keypressed or love.keyreleased.",
+ returns = "(down: boolean)",
+ type = "function"
+ },
+ isScancodeDown = {
+ args = "(scancode: Scancode, ...: Scancode)",
+ description = "Checks whether the specified Scancodes are pressed. Not to be confused with love.keypressed or love.keyreleased.\n\nUnlike regular KeyConstants, Scancodes are keyboard layout-independent. The scancode \"w\" is used if the key in the same place as the \"w\" key on an American keyboard is pressed, no matter what the key is labelled or what the user's operating system settings are.",
+ returns = "(down: boolean)",
+ type = "function"
+ },
+ setKeyRepeat = {
+ args = "(enable: boolean)",
+ description = "Enables or disables key repeat. It is disabled by default.\n\nThe interval between repeats depends on the user's system settings.",
+ returns = "()",
+ type = "function"
+ },
+ setTextInput = {
+ args = "(enable: boolean)",
+ description = "Enables or disables text input events. It is enabled by default on Windows, Mac, and Linux, and disabled by default on iOS and Android.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Provides an interface to the user's keyboard.",
+ type = "lib"
+ },
+ keypressed = {
+ args = "(key: KeyConstant, scancode: Scancode, isrepeat: boolean)",
+ description = "Callback function triggered when a key is pressed.",
+ returns = "()",
+ type = "function"
+ },
+ keyreleased = {
+ args = "(key: KeyConstant)",
+ description = "Callback function triggered when a keyboard key is released.",
+ returns = "()",
+ type = "function"
+ },
+ load = {
+ args = "(arg: table)",
+ description = "This function is called exactly once at the beginning of the game.",
+ returns = "()",
+ type = "function"
+ },
+ lowmemory = {
+ args = "()",
+ description = "Callback function triggered when the system is running out of memory on mobile devices.\n\n Mobile operating systems may forcefully kill the game if it uses too much memory, so any non-critical resource should be removed if possible (by setting all variables referencing the resources to nil, and calling collectgarbage()), when this event is triggered. Sounds and images in particular tend to use the most memory.",
+ returns = "()",
+ type = "function"
+ },
+ math = {
+ childs = {
+ BezierCurve = {
+ childs = {
+ getControlPoint = {
+ args = "(i: number)",
+ description = "Get coordinates of the i-th control point. Indices start with 1.",
+ returns = "(x: number, y: number)",
+ type = "function"
+ },
+ getControlPointCount = {
+ args = "()",
+ description = "Get the number of control points in the Bézier curve.",
+ returns = "(count: number)",
+ type = "function"
+ },
+ getDegree = {
+ args = "()",
+ description = "Get degree of the Bézier curve. The degree is equal to number-of-control-points - 1.",
+ returns = "(degree: number)",
+ type = "function"
+ },
+ getDerivative = {
+ args = "()",
+ description = "Get the derivative of the Bézier curve.\n\nThis function can be used to rotate sprites moving along a curve in the direction of the movement and compute the direction perpendicular to the curve at some parameter t.",
+ returns = "(derivative: BezierCurve)",
+ type = "function"
+ },
+ getSegment = {
+ args = "(startpoint: number, endpoint: number)",
+ description = "Gets a BezierCurve that corresponds to the specified segment of this BezierCurve.",
+ returns = "(curve: BezierCurve)",
+ type = "function"
+ },
+ insertControlPoint = {
+ args = "(x: number, y: number, i: number)",
+ description = "Insert control point after the i-th control point. Indices start with 1. Negative indices wrap around: -1 is the last control point, -2 the one before the last, etc.",
+ returns = "()",
+ type = "function"
+ },
+ removeControlPoint = {
+ args = "(index: number)",
+ description = "Removes the specified control point.",
+ returns = "()",
+ type = "function"
+ },
+ render = {
+ args = "(depth: number)",
+ description = "Get a list of coordinates to be used with love.graphics.line.\n\nThis function samples the Bézier curve using recursive subdivision. You can control the recursion depth using the depth parameter.\n\nIf you are just interested to know the position on the curve given a parameter, use BezierCurve:evalulate.",
+ returns = "(coordinates: table)",
+ type = "function"
+ },
+ renderSegment = {
+ args = "(startpoint: number, endpoint: number, depth: number)",
+ description = "Get a list of coordinates on a specific part of the curve, to be used with love.graphics.line.\n\nThis function samples the Bézier curve using recursive subdivision. You can control the recursion depth using the depth parameter.\n\nIf you are just need to know the position on the curve given a parameter, use BezierCurve:evaluate.",
+ returns = "(coordinates: table)",
+ type = "function"
+ },
+ rotate = {
+ args = "(angle: number, ox: number, oy: number)",
+ description = "Rotate the Bézier curve by an angle.",
+ returns = "()",
+ type = "function"
+ },
+ scale = {
+ args = "(s: number, ox: number, oy: number)",
+ description = "Scale the Bézier curve by a factor.",
+ returns = "()",
+ type = "function"
+ },
+ setControlPoint = {
+ args = "(i: number, ox: number, oy: number)",
+ description = "Set coordinates of the i-th control point. Indices start with 1.",
+ returns = "()",
+ type = "function"
+ },
+ translate = {
+ args = "(dx: number, dy: number)",
+ description = "Move the Bézier curve by an offset.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "A Bézier curve object that can evaluate and render Bézier curves of arbitrary degree.",
+ type = "lib"
+ },
+ CompressedData = {
+ childs = {
+ getFormat = {
+ args = "()",
+ description = "Gets the compression format of the CompressedData.",
+ returns = "(format: CompressedDataFormat)",
+ type = "function"
+ }
+ },
+ description = "Represents byte data compressed using a specific algorithm.\n\nlove.math.decompress can be used to de-compress the data.",
+ type = "lib"
+ },
+ CompressedDataFormat = {
+ childs = {
+ gzip = {
+ description = "The gzip format is DEFLATE-compressed data with a slightly larger header than zlib. Since it uses DEFLATE it has the same compression characteristics as the zlib format.",
+ type = "value"
+ },
+ lz4 = {
+ description = "The LZ4 compression format. Compresses and decompresses very quickly, but the compression ratio is not the best. LZ4-HC is used when compression level 9 is specified.",
+ type = "value"
+ },
+ zlib = {
+ description = "The zlib format is DEFLATE-compressed data with a small bit of header data. Compresses relatively slowly and decompresses moderately quickly, and has a decent compression ratio.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ RandomGenerator = {
+ childs = {
+ getState = {
+ args = "()",
+ description = "Gets the current state of the random number generator. This returns an opaque implementation-dependent string which is only useful for later use with RandomGenerator:setState.\n\nThis is different from RandomGenerator:getSeed in that getState gets the RandomGenerator's current state, whereas getSeed gets the previously set seed number.\n\nThe value of the state string does not depend on the current operating system.",
+ returns = "(state: string)",
+ type = "function"
+ },
+ random = {
+ args = "(max: number)",
+ description = "Generates a pseudo-random number in a platform independent manner.",
+ returns = "(number: number)",
+ type = "function"
+ },
+ randomNormal = {
+ args = "(stddev: number, mean: number)",
+ description = "Get a normally distributed pseudo random number.",
+ returns = "(number: number)",
+ type = "function"
+ },
+ setSeed = {
+ args = "(seed: number)",
+ description = "Sets the seed of the random number generator using the specified integer number.",
+ returns = "()",
+ type = "function"
+ },
+ setState = {
+ args = "(state: string)",
+ description = "Sets the current state of the random number generator. The value used as an argument for this function is an opaque implementation-dependent string and should only originate from a previous call to RandomGenerator:getState.\n\nThis is different from RandomGenerator:setSeed in that setState directly sets the RandomGenerator's current implementation-dependent state, whereas setSeed gives it a new seed value.\n\nThe effect of the state string does not depend on the current operating system.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "A random number generation object which has its own random state.",
+ type = "lib"
+ },
+ decompress = {
+ args = "(compressedData: CompressedData)",
+ description = "Decompresses a CompressedData or previously compressed string or Data object.",
+ returns = "(rawstring: string)",
+ type = "function"
+ },
+ gammaToLinear = {
+ args = "(r: number, g: number, b: number)",
+ description = "Converts a color from gamma-space (sRGB) to linear-space (RGB). This is useful when doing gamma-correct rendering using colors created based on what they look like on-screen.\n\nGamma-space sRGB has more precision in the lower end than linear RGB. Using this function to convert from sRGB to RGB can result in non-integer color values, which get truncated to integers and lose precision when used with other functions such as love.graphics.setColor.",
+ returns = "(lr: number, lg: number, lb: number)",
+ type = "function"
+ },
+ getRandomSeed = {
+ args = "()",
+ description = "Gets the seed of the random number generator.\n\nThe state is split into two numbers due to Lua's use of doubles for all number values - doubles can't accurately represent integer values above 2^53.",
+ returns = "(low: number, high: number)",
+ type = "function"
+ },
+ getRandomState = {
+ args = "()",
+ description = "Gets the current state of the random number generator. This returns an opaque implementation-dependent string which is only useful for later use with RandomGenerator:setState.\n\nThis is different from RandomGenerator:getSeed in that getState gets the RandomGenerator's current state, whereas getSeed gets the previously set seed number.\n\nThe value of the state string does not depend on the current operating system.",
+ returns = "(state: string)",
+ type = "function"
+ },
+ isConvex = {
+ args = "(vertices: table)",
+ description = "Checks whether a polygon is convex.\n\nPolygonShapes in love.physics, some forms of Mesh, and polygons drawn with love.graphics.polygon must be simple convex polygons.",
+ returns = "(convex: boolean)",
+ type = "function"
+ },
+ linearToGamma = {
+ args = "(lr: number, lg: number, lb: number)",
+ description = "Converts a color from linear-space (RGB) to gamma-space (sRGB). This is useful when storing linear RGB color values in an image, because the linear RGB color space has less precision than sRGB for dark colors, which can result in noticeable color banding when drawing.\n\nIn general, colors chosen based on what they look like on-screen are already in gamma-space and should not be double-converted. Colors calculated using math are often in the linear RGB space.",
+ returns = "(cr: number, cg: number, cb: number)",
+ type = "function"
+ },
+ newBezierCurve = {
+ args = "(vertices: table)",
+ description = "Creates a new BezierCurve object.\n\nThe number of vertices in the control polygon determines the degree of the curve, e.g. three vertices define a quadratic (degree 2) Bézier curve, four vertices define a cubic (degree 3) Bézier curve, etc.",
+ returns = "(curve: BezierCurve)",
+ type = "function"
+ },
+ newRandomGenerator = {
+ args = "(low: number, high: number)",
+ description = "Creates a new RandomGenerator object which is completely independent of other RandomGenerator objects and random functions.",
+ returns = "(rng: RandomGenerator)",
+ type = "function"
+ },
+ noise = {
+ args = "(x: number)",
+ description = "Generates a Simplex or Perlin noise value in 1-4 dimensions.\n\nSimplex noise is closely related to Perlin noise. It is widely used for procedural content generation.\n\nThere are many webpages which discuss Perlin and Simplex noise in detail.",
+ returns = "(value: number)",
+ type = "function"
+ },
+ random = {
+ args = "(max: number)",
+ description = "Generates a pseudo-random number in a platform independent manner.",
+ returns = "(number: number)",
+ type = "function"
+ },
+ randomNormal = {
+ args = "(stddev: number, mean: number)",
+ description = "Get a normally distributed pseudo random number.",
+ returns = "(number: number)",
+ type = "function"
+ },
+ setRandomSeed = {
+ args = "(seed: number)",
+ description = "Sets the seed of the random number generator using the specified integer number.",
+ returns = "()",
+ type = "function"
+ },
+ setRandomState = {
+ args = "(state: string)",
+ description = "Gets the current state of the random number generator. This returns an opaque implementation-dependent string which is only useful for later use with RandomGenerator:setState.\n\nThis is different from RandomGenerator:getSeed in that getState gets the RandomGenerator's current state, whereas getSeed gets the previously set seed number.\n\nThe value of the state string does not depend on the current operating system.",
+ returns = "()",
+ type = "function"
+ },
+ triangulate = {
+ args = "(polygon: table)",
+ description = "Triangulate a simple polygon.",
+ returns = "(triangles: table)",
+ type = "function"
+ }
+ },
+ description = "Provides system-independent mathematical functions.",
+ type = "class"
+ },
+ mouse = {
+ childs = {
+ Cursor = {
+ childs = {
+ getType = {
+ args = "()",
+ description = "Gets the type of the Cursor.",
+ returns = "(cursortype: CursorType)",
+ type = "function"
+ }
+ },
+ description = "Represents a hardware cursor.",
+ type = "lib"
+ },
+ CursorType = {
+ childs = {
+ arrow = {
+ description = "An arrow pointer.",
+ type = "value"
+ },
+ crosshair = {
+ description = "Crosshair symbol.",
+ type = "value"
+ },
+ hand = {
+ description = "Hand symbol.",
+ type = "value"
+ },
+ ibeam = {
+ description = "An I-beam, normally used when mousing over editable or selectable text.",
+ type = "value"
+ },
+ image = {
+ description = "The cursor is using a custom image.",
+ type = "value"
+ },
+ no = {
+ description = "Slashed circle or crossbones.",
+ type = "value"
+ },
+ sizeall = {
+ description = "Four-pointed arrow pointing up, down, left, and right.",
+ type = "value"
+ },
+ sizenesw = {
+ description = "Double arrow pointing to the top-right and bottom-left.",
+ type = "value"
+ },
+ sizens = {
+ description = "Double arrow pointing up and down.",
+ type = "value"
+ },
+ sizenwse = {
+ description = "Double arrow pointing to the top-left and bottom-right.",
+ type = "value"
+ },
+ sizewe = {
+ description = "Double arrow pointing left and right.",
+ type = "value"
+ },
+ wait = {
+ description = "Wait graphic.",
+ type = "value"
+ },
+ waitarrow = {
+ description = "Small wait cursor with an arrow pointer.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ getPosition = {
+ args = "()",
+ description = "Returns the current position of the mouse.",
+ returns = "(x: number, y: number)",
+ type = "function"
+ },
+ getRelativeMode = {
+ args = "()",
+ description = "Gets whether relative mode is enabled for the mouse.\n\nIf relative mode is enabled, the cursor is hidden and doesn't move when the mouse does, but relative mouse motion events are still generated via love.mousemoved. This lets the mouse move in any direction indefinitely without the cursor getting stuck at the edges of the screen.\n\nThe reported position of the mouse is not updated while relative mode is enabled, even when relative mouse motion events are generated.",
+ returns = "(enabled: boolean)",
+ type = "function"
+ },
+ getSystemCursor = {
+ args = "(ctype: CursorType)",
+ description = "Gets a Cursor object representing a system-native hardware cursor.\n\n Hardware cursors are framerate-independent and work the same way as normal operating system cursors. Unlike drawing an image at the mouse's current coordinates, hardware cursors never have visible lag between when the mouse is moved and when the cursor position updates, even at low framerates.",
+ returns = "(cursor: Cursor)",
+ type = "function"
+ },
+ getX = {
+ args = "()",
+ description = "Returns the current x position of the mouse.",
+ returns = "(x: number)",
+ type = "function"
+ },
+ getY = {
+ args = "()",
+ description = "Returns the current y position of the mouse.",
+ returns = "(y: number)",
+ type = "function"
+ },
+ hasCursor = {
+ args = "()",
+ description = "Gets whether cursor functionality is supported.\n\nIf it isn't supported, calling love.mouse.newCursor and love.mouse.getSystemCursor will cause an error. Mobile devices do not support cursors.",
+ returns = "(hascursor: boolean)",
+ type = "function"
+ },
+ isDown = {
+ args = "(button: number, ...: number)",
+ description = "Checks whether a certain mouse button is down. This function does not detect mousewheel scrolling; you must use the love.wheelmoved (or love.mousepressed in version 0.9.2 and older) callback for that.",
+ returns = "(down: boolean)",
+ type = "function"
+ },
+ isGrabbed = {
+ args = "()",
+ description = "Checks if the mouse is grabbed.",
+ returns = "(grabbed: boolean)",
+ type = "function"
+ },
+ isVisible = {
+ args = "()",
+ description = "Checks if the cursor is visible.",
+ returns = "(visible: boolean)",
+ type = "function"
+ },
+ newCursor = {
+ args = "(imageData: ImageData, hotx: number, hoty: number)",
+ description = "Creates a new hardware Cursor object from an image file or ImageData.\n\nHardware cursors are framerate-independent and work the same way as normal operating system cursors. Unlike drawing an image at the mouse's current coordinates, hardware cursors never have visible lag between when the mouse is moved and when the cursor position updates, even at low frameratesn\n\nThe hot spot is the point the operating system uses to determine what was clicked and at what position the mouse cursor is. For example, the normal arrow pointer normally has its hot spot at the top left of the image, but a crosshair cursor might have it in the middle.",
+ returns = "(cursor: Cursor)",
+ type = "function"
+ },
+ setCursor = {
+ args = "(cursor: Cursor)",
+ description = "Sets the current mouse cursor.\n\nResets the current mouse cursor to the default when called without arguments.",
+ returns = "()",
+ type = "function"
+ },
+ setGrabbed = {
+ args = "(grab: boolean)",
+ description = "Grabs the mouse and confines it to the window.",
+ returns = "()",
+ type = "function"
+ },
+ setPosition = {
+ args = "(x: number, y: number)",
+ description = "Sets the position of the mouse.",
+ returns = "()",
+ type = "function"
+ },
+ setRelativeMode = {
+ args = "(enable: boolean)",
+ description = "Sets whether relative mode is enabled for the mouse.\n\nWhen relative mode is enabled, the cursor is hidden and doesn't move when the mouse does, but relative mouse motion events are still generated via love.mousemoved. This lets the mouse move in any direction indefinitely without the cursor getting stuck at the edges of the screen.\n\nThe reported position of the mouse is not updated while relative mode is enabled, even when relative mouse motion events are generated.",
+ returns = "()",
+ type = "function"
+ },
+ setVisible = {
+ args = "(visible: boolean)",
+ description = "Sets the visibility of the cursor.",
+ returns = "()",
+ type = "function"
+ },
+ setX = {
+ args = "(x: number)",
+ description = "Sets the current X position of the mouse.",
+ returns = "()",
+ type = "function"
+ },
+ setY = {
+ args = "(y: number)",
+ description = "Sets the current Y position of the mouse.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Provides an interface to the user's mouse.",
+ type = "class"
+ },
+ mousefocus = {
+ args = "(f: boolean)",
+ description = "Callback function triggered when window receives or loses mouse focus.",
+ returns = "()",
+ type = "function"
+ },
+ mousemoved = {
+ args = "(x: number, y: number, dx: number, dy: number)",
+ description = "Callback function triggered when the mouse is moved.",
+ returns = "()",
+ type = "function"
+ },
+ mousepressed = {
+ args = "(x: number, y: number, button: number, isTouch: boolean)",
+ description = "Callback function triggered when a mouse button is pressed.",
+ returns = "()",
+ type = "function"
+ },
+ mousereleased = {
+ args = "(x: number, y: number, button: number, isTouch: boolean)",
+ description = "Callback function triggered when a mouse button is released.",
+ returns = "()",
+ type = "function"
+ },
+ physics = {
+ childs = {
+ Body = {
+ childs = {
+ applyForce = {
+ args = "(fx: number, fy: number)",
+ description = "Apply force to a Body.\n\nA force pushes a body in a direction. A body with with a larger mass will react less. The reaction also depends on how long a force is applied: since the force acts continuously over the entire timestep, a short timestep will only push the body for a short time. Thus forces are best used for many timesteps to give a continuous push to a body (like gravity). For a single push that is independent of timestep, it is better to use Body:applyLinearImpulse.\n\nIf the position to apply the force is not given, it will act on the center of mass of the body. The part of the force not directed towards the center of mass will cause the body to spin (and depends on the rotational inertia).\n\nNote that the force components and position must be given in world coordinates.",
+ returns = "()",
+ type = "function"
+ },
+ applyLinearImpulse = {
+ args = "(ix: number, iy: number)",
+ description = "Applies an impulse to a body. This makes a single, instantaneous addition to the body momentum.\n\nAn impulse pushes a body in a direction. A body with with a larger mass will react less. The reaction does not depend on the timestep, and is equivalent to applying a force continuously for 1 second. Impulses are best used to give a single push to a body. For a continuous push to a body it is better to use Body:applyForce.\n\nIf the position to apply the impulse is not given, it will act on the center of mass of the body. The part of the impulse not directed towards the center of mass will cause the body to spin (and depends on the rotational inertia).\n\nNote that the impulse components and position must be given in world coordinates.",
+ returns = "()",
+ type = "function"
+ },
+ applyTorque = {
+ args = "(torque: number)",
+ description = "Apply torque to a body.\n\nTorque is like a force that will change the angular velocity (spin) of a body. The effect will depend on the rotational inertia a body has.",
+ returns = "()",
+ type = "function"
+ },
+ destroy = {
+ args = "()",
+ description = "Explicitly destroys the Body. When you don't have time to wait for garbage collection, this function may be used to free the object immediately, but note that an error will occur if you attempt to use the object after calling this function.",
+ returns = "()",
+ type = "function"
+ },
+ getAngle = {
+ args = "()",
+ description = "Get the angle of the body.\n\nThe angle is measured in radians. If you need to transform it to degrees, use math.deg.\n\nA value of 0 radians will mean \"looking to the right\". Although radians increase counter-clockwise, the y-axis points down so it becomes clockwise from our point of view.",
+ returns = "(angle: number)",
+ type = "function"
+ },
+ getAngularDamping = {
+ args = "()",
+ description = "Gets the Angular damping of the Body\n\nThe angular damping is the rate of decrease of the angular velocity over time: A spinning body with no damping and no external forces will continue spinning indefinitely. A spinning body with damping will gradually stop spinning.\n\nDamping is not the same as friction - they can be modelled together. However, only damping is provided by Box2D (and LÖVE).\n\nDamping parameters should be between 0 and infinity, with 0 meaning no damping, and infinity meaning full damping. Normally you will use a damping value between 0 and 0.1.",
+ returns = "(damping: number)",
+ type = "function"
+ },
+ getAngularVelocity = {
+ args = "()",
+ description = "Get the angular velocity of the Body.\n\nThe angular velocity is the rate of change of angle over time.\n\nIt is changed in World:update by applying torques, off centre forces/impulses, and angular damping. It can be set directly with Body:setAngularVelocity.\n\nIf you need the rate of change of position over time, use Body:getLinearVelocity.",
+ returns = "(w: number)",
+ type = "function"
+ },
+ getContactList = {
+ args = "()",
+ description = "Gets a list of all Contacts attached to the Body.",
+ returns = "(contacts: table)",
+ type = "function"
+ },
+ getFixtureList = {
+ args = "()",
+ description = "Returns a table with all fixtures.",
+ returns = "(fixtures: table)",
+ type = "function"
+ },
+ getGravityScale = {
+ args = "()",
+ description = "Returns the gravity scale factor.",
+ returns = "(scale: number)",
+ type = "function"
+ },
+ getInertia = {
+ args = "()",
+ description = "Gets the rotational inertia of the body.\n\nThe rotational inertia is how hard is it to make the body spin. It is set with the 4th argument to Body:setMass, or automatically with Body:setMassFromShapes.",
+ returns = "(inertia: number)",
+ type = "function"
+ },
+ getJointList = {
+ args = "()",
+ description = "Returns a table containing the Joints attached to this Body.",
+ returns = "(joints: table)",
+ type = "function"
+ },
+ getLinearDamping = {
+ args = "()",
+ description = "Gets the linear damping of the Body.\n\nThe linear damping is the rate of decrease of the linear velocity over time. A moving body with no damping and no external forces will continue moving indefinitely, as is the case in space. A moving body with damping will gradually stop moving.\n\nDamping is not the same as friction - they can be modelled together. However, only damping is provided by Box2D (and LÖVE).",
+ returns = "(damping: number)",
+ type = "function"
+ },
+ getLinearVelocity = {
+ args = "()",
+ description = "Gets the linear velocity of the Body from its center of mass.\n\nThe linear velocity is the rate of change of position over time.\n\nIf you need the rate of change of angle over time, use Body:getAngularVelocity. If you need to get the linear velocity of a point different from the center of mass:\n\nBody:getLinearVelocityFromLocalPoint allows you to specify the point in local coordinates.\n\nBody:getLinearVelocityFromWorldPoint allows you to specify the point in world coordinates.",
+ returns = "(x: number, y: number)",
+ type = "function"
+ },
+ getLinearVelocityFromLocalPoint = {
+ args = "(x: number, y: number)",
+ description = "Get the linear velocity of a point on the body.\n\nThe linear velocity for a point on the body is the velocity of the body center of mass plus the velocity at that point from the body spinning.\n\nThe point on the body must given in local coordinates. Use Body:getLinearVelocityFromWorldPoint to specify this with world coordinates.",
+ returns = "(vx: number, vy: number)",
+ type = "function"
+ },
+ getLinearVelocityFromWorldPoint = {
+ args = "(x: number, y: number)",
+ description = "Get the linear velocity of a point on the body.\n\nThe linear velocity for a point on the body is the velocity of the body center of mass plus the velocity at that point from the body spinning.\n\nThe point on the body must given in world coordinates. Use Body:getLinearVelocityFromLocalPoint to specify this with local coordinates.",
+ returns = "(vx: number, vy: number)",
+ type = "function"
+ },
+ getLocalCenter = {
+ args = "()",
+ description = "Get the center of mass position in local coordinates.\n\nUse Body:getWorldCenter to get the center of mass in world coordinates.",
+ returns = "(x: number, y: number)",
+ type = "function"
+ },
+ getLocalPoint = {
+ args = "(world_x: number, world_y: number)",
+ description = "Transform a point from world coordinates to local coordinates.",
+ returns = "(local_x: number, local_y: number)",
+ type = "function"
+ },
+ getLocalVector = {
+ args = "(world_x: number, world_y: number)",
+ description = "Transform a vector from world coordinates to local coordinates.",
+ returns = "(local_x: number, local_y: number)",
+ type = "function"
+ },
+ getMass = {
+ args = "()",
+ description = "Get the mass of the body.",
+ returns = "(mass: number)",
+ type = "function"
+ },
+ getMassData = {
+ args = "()",
+ description = "Returns the mass, its center, and the rotational inertia.",
+ returns = "(x: number, y: number, mass: number, inertia: number)",
+ type = "function"
+ },
+ getPosition = {
+ args = "()",
+ description = "Get the position of the body.\n\nNote that this may not be the center of mass of the body.",
+ returns = "(x: number, y: number)",
+ type = "function"
+ },
+ getType = {
+ args = "()",
+ description = "Returns the type of the body.",
+ returns = "(type: BodyType)",
+ type = "function"
+ },
+ getUserData = {
+ args = "()",
+ description = "Returns the Lua value associated with this Body.\n\nUse this function in one thread only.",
+ returns = "(value: value)",
+ type = "function"
+ },
+ getWorld = {
+ args = "()",
+ description = "Gets the World the body lives in.",
+ returns = "(world: World)",
+ type = "function"
+ },
+ getWorldCenter = {
+ args = "()",
+ description = "Get the center of mass position in world coordinates.\n\nUse Body:getLocalCenter to get the center of mass in local coordinates.",
+ returns = "(x: number, y: number)",
+ type = "function"
+ },
+ getWorldPoint = {
+ args = "(local_x: number, local_y: number)",
+ description = "Transform a point from local coordinates to world coordinates.",
+ returns = "(world_x: number, world_y: number)",
+ type = "function"
+ },
+ getWorldPoints = {
+ args = "(x1: number, y1: number, x2: number, y2: number, ...: number)",
+ description = "Transforms multiple points from local coordinates to world coordinates.",
+ returns = "(x1: number, y1: number, x2: number, y2: number, ...: number)",
+ type = "function"
+ },
+ getWorldVector = {
+ args = "(local_x: number, local_y: number)",
+ description = "Transform a vector from local coordinates to world coordinates.",
+ returns = "(world_x: number, world_y: number)",
+ type = "function"
+ },
+ getX = {
+ args = "()",
+ description = "Get the x position of the body in world coordinates.",
+ returns = "(x: number)",
+ type = "function"
+ },
+ getY = {
+ args = "()",
+ description = "Get the y position of the body in world coordinates.",
+ returns = "(y: number)",
+ type = "function"
+ },
+ isActive = {
+ args = "()",
+ description = "Returns whether the body is actively used in the simulation.",
+ returns = "(status: boolean)",
+ type = "function"
+ },
+ isAwake = {
+ args = "()",
+ description = "Returns the sleep status of the body.",
+ returns = "(status: boolean)",
+ type = "function"
+ },
+ isBullet = {
+ args = "()",
+ description = "Get the bullet status of a body.\n\nThere are two methods to check for body collisions:\n\nat their location when the world is updated (default)\n\nusing continuous collision detection (CCD)\n\nThe default method is efficient, but a body moving very quickly may sometimes jump over another body without producing a collision. A body that is set as a bullet will use CCD. This is less efficient, but is guaranteed not to jump when moving quickly.\n\nNote that static bodies (with zero mass) always use CCD, so your walls will not let a fast moving body pass through even if it is not a bullet.",
+ returns = "(status: boolean)",
+ type = "function"
+ },
+ isDestroyed = {
+ args = "()",
+ description = "Gets whether the Body is destroyed. Destroyed bodies cannot be used.",
+ returns = "(destroyed: boolean)",
+ type = "function"
+ },
+ isFixedRotation = {
+ args = "()",
+ description = "Returns whether the body rotation is locked.",
+ returns = "(fixed: boolean)",
+ type = "function"
+ },
+ isSleepingAllowed = {
+ args = "()",
+ description = "Returns the sleeping behaviour of the body.",
+ returns = "(status: boolean)",
+ type = "function"
+ },
+ resetMassData = {
+ args = "()",
+ description = "Resets the mass of the body by recalculating it from the mass properties of the fixtures.",
+ returns = "()",
+ type = "function"
+ },
+ setActive = {
+ args = "(active: boolean)",
+ description = "Sets whether the body is active in the world.\n\nAn inactive body does not take part in the simulation. It will not move or cause any collisions.",
+ returns = "()",
+ type = "function"
+ },
+ setAngle = {
+ args = "(angle: number)",
+ description = "Set the angle of the body.\n\nThe angle is measured in radians. If you need to transform it from degrees, use math.rad.\n\nA value of 0 radians will mean \"looking to the right\". .Although radians increase counter-clockwise, the y-axis points down so it becomes clockwise from our point of view.\n\nIt is possible to cause a collision with another body by changing its angle.",
+ returns = "()",
+ type = "function"
+ },
+ setAngularDamping = {
+ args = "(damping: number)",
+ description = "Sets the angular damping of a Body.\n\nSee Body:getAngularDamping for a definition of angular damping.\n\nAngular damping can take any value from 0 to infinity. It is recommended to stay between 0 and 0.1, though. Other values will look unrealistic.",
+ returns = "()",
+ type = "function"
+ },
+ setAngularVelocity = {
+ args = "(w: number)",
+ description = "Sets the angular velocity of a Body.\n\nThe angular velocity is the rate of change of angle over time.\n\nThis function will not accumulate anything; any impulses previously applied since the last call to World:update will be lost.",
+ returns = "()",
+ type = "function"
+ },
+ setAwake = {
+ args = "(awake: boolean)",
+ description = "Wakes the body up or puts it to sleep.",
+ returns = "()",
+ type = "function"
+ },
+ setBullet = {
+ args = "(status: boolean)",
+ description = "Set the bullet status of a body.\n\nThere are two methods to check for body collisions:\n\nat their location when the world is updated (default)\n\nusing continuous collision detection (CCD)\n\nThe default method is efficient, but a body moving very quickly may sometimes jump over another body without producing a collision. A body that is set as a bullet will use CCD. This is less efficient, but is guaranteed not to jump when moving quickly.\n\nNote that static bodies (with zero mass) always use CCD, so your walls will not let a fast moving body pass through even if it is not a bullet.",
+ returns = "()",
+ type = "function"
+ },
+ setFixedRotation = {
+ args = "(fixed: boolean)",
+ description = "Set whether a body has fixed rotation.\n\nBodies with fixed rotation don't vary the speed at which they rotate.",
+ returns = "()",
+ type = "function"
+ },
+ setGravityScale = {
+ args = "(scale: number)",
+ description = "Sets a new gravity scale factor for the body.",
+ returns = "()",
+ type = "function"
+ },
+ setInertia = {
+ args = "(inertia: number)",
+ description = "Set the inertia of a body.\n\nThis value can also be set by the fourth argument of Body:setMass.",
+ returns = "()",
+ type = "function"
+ },
+ setLinearDamping = {
+ args = "(ld: number)",
+ description = "Sets the linear damping of a Body\n\nSee Body:getLinearDamping for a definition of linear damping.\n\nLinear damping can take any value from 0 to infinity. It is recommended to stay between 0 and 0.1, though. Other values will make the objects look \"floaty\".",
+ returns = "()",
+ type = "function"
+ },
+ setLinearVelocity = {
+ args = "(x: number, y: number)",
+ description = "Sets a new linear velocity for the Body.\n\nThis function will not accumulate anything; any impulses previously applied since the last call to World:update will be lost.",
+ returns = "()",
+ type = "function"
+ },
+ setMass = {
+ args = "(mass: number)",
+ description = "Sets the mass in kilograms.",
+ returns = "()",
+ type = "function"
+ },
+ setMassData = {
+ args = "(x: number, y: number, mass: number, inertia: number)",
+ description = "Overrides the calculated mass data.",
+ returns = "()",
+ type = "function"
+ },
+ setPosition = {
+ args = "(x: number, y: number)",
+ description = "Set the position of the body.\n\nNote that this may not be the center of mass of the body.",
+ returns = "()",
+ type = "function"
+ },
+ setSleepingAllowed = {
+ args = "(allowed: boolean)",
+ description = "Sets the sleeping behaviour of the body.",
+ returns = "()",
+ type = "function"
+ },
+ setType = {
+ args = "(type: BodyType)",
+ description = "Sets a new body type.",
+ returns = "()",
+ type = "function"
+ },
+ setUserData = {
+ args = "(value: value)",
+ description = "Associates a Lua value with the Body.\n\nTo delete the reference, explicitly pass nil.\n\nUse this function in one thread only.",
+ returns = "()",
+ type = "function"
+ },
+ setX = {
+ args = "(x: number)",
+ description = "Set the x position of the body.",
+ returns = "()",
+ type = "function"
+ },
+ setY = {
+ args = "(y: number)",
+ description = "Set the y position of the body.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Bodies are objects with velocity and position.",
+ type = "lib"
+ },
+ BodyType = {
+ childs = {
+ dynamic = {
+ description = "Dynamic bodies collide with all bodies.",
+ type = "value"
+ },
+ kinematic = {
+ description = "Kinematic bodies only collide with dynamic bodies.",
+ type = "value"
+ },
+ static = {
+ description = "Static bodies do not move.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ ChainShape = {
+ childs = {
+ getPoint = {
+ args = "(index: number)",
+ description = "Returns a point of the shape.",
+ returns = "(x: number, y: number)",
+ type = "function"
+ },
+ getPoints = {
+ args = "()",
+ description = "Returns all points of the shape.",
+ returns = "(x1: number, y1: number, x2: number, y2: number, ...: number)",
+ type = "function"
+ },
+ getVertexCount = {
+ args = "()",
+ description = "Returns the number of vertices the shape has.",
+ returns = "(count: number)",
+ type = "function"
+ },
+ setNextVertex = {
+ args = "(x: number, y: number)",
+ description = "Sets a vertex that establishes a connection to the next shape.\n\nThis can help prevent unwanted collisions when a flat shape slides along the edge and moves over to the new shape.",
+ returns = "()",
+ type = "function"
+ },
+ setPreviousVertex = {
+ args = "(x: number, y: number)",
+ description = "Sets a vertex that establishes a connection to the previous shape.\n\nThis can help prevent unwanted collisions when a flat shape slides along the edge and moves over to the new shape.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "A ChainShape consists of multiple line segments. It can be used to create the boundaries of your terrain. The shape does not have volume and can only collide with PolygonShape and CircleShape.\n\nUnlike the PolygonShape, the ChainShape does not have a vertices limit or has to form a convex shape, but self intersections are not supported.",
+ type = "lib"
+ },
+ CircleShape = {
+ childs = {
+ getRadius = {
+ args = "()",
+ description = "Gets the radius of the circle shape.",
+ returns = "(radius: number)",
+ type = "function"
+ },
+ setPoint = {
+ args = "(x: number, y: number)",
+ description = "Sets the location of the center of the circle shape.",
+ returns = "()",
+ type = "function"
+ },
+ setRadius = {
+ args = "(radius: number)",
+ description = "Sets the radius of the circle.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Circle extends Shape and adds a radius and a local position.",
+ type = "lib"
+ },
+ Contact = {
+ childs = {
+ getFriction = {
+ args = "()",
+ description = "Get the friction between two shapes that are in contact.",
+ returns = "(friction: number)",
+ type = "function"
+ },
+ getNormal = {
+ args = "()",
+ description = "Get the normal vector between two shapes that are in contact.\n\nThis function returns the coordinates of a unit vector that points from the first shape to the second.",
+ returns = "(nx: number, ny: number)",
+ type = "function"
+ },
+ getPositions = {
+ args = "()",
+ description = "Returns the contact points of the two colliding fixtures. There can be one or two points.",
+ returns = "(x1: number, y1: number, x2: number, y2: number)",
+ type = "function"
+ },
+ getRestitution = {
+ args = "()",
+ description = "Get the restitution between two shapes that are in contact.",
+ returns = "(restitution: number)",
+ type = "function"
+ },
+ isEnabled = {
+ args = "()",
+ description = "Returns whether the contact is enabled. The collision will be ignored if a contact gets disabled in the post solve callback.",
+ returns = "(enabled: boolean)",
+ type = "function"
+ },
+ isTouching = {
+ args = "()",
+ description = "Returns whether the two colliding fixtures are touching each other.",
+ returns = "(touching: boolean)",
+ type = "function"
+ },
+ resetFriction = {
+ args = "()",
+ description = "Resets the contact friction to the mixture value of both fixtures.",
+ returns = "()",
+ type = "function"
+ },
+ resetRestitution = {
+ args = "()",
+ description = "Resets the contact restitution to the mixture value of both fixtures.",
+ returns = "()",
+ type = "function"
+ },
+ setEnabled = {
+ args = "(enabled: boolean)",
+ description = "Enables or disables the contact.",
+ returns = "()",
+ type = "function"
+ },
+ setFriction = {
+ args = "(friction: number)",
+ description = "Sets the contact friction.",
+ returns = "()",
+ type = "function"
+ },
+ setRestitution = {
+ args = "(restitution: number)",
+ description = "Sets the contact restitution.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Contacts are objects created to manage collisions in worlds.",
+ type = "lib"
+ },
+ DistanceJoint = {
+ childs = {
+ getFrequency = {
+ args = "()",
+ description = "Gets the response speed.",
+ returns = "(Hz: number)",
+ type = "function"
+ },
+ getLength = {
+ args = "()",
+ description = "Gets the equilibrium distance between the two Bodies.",
+ returns = "(l: number)",
+ type = "function"
+ },
+ setDampingRatio = {
+ args = "(ratio: number)",
+ description = "Sets the damping ratio.",
+ returns = "()",
+ type = "function"
+ },
+ setFrequency = {
+ args = "(Hz: number)",
+ description = "Sets the response speed.",
+ returns = "()",
+ type = "function"
+ },
+ setLength = {
+ args = "(l: number)",
+ description = "Sets the equilibrium distance between the two Bodies.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Keeps two bodies at the same distance.",
+ type = "lib"
+ },
+ EdgeShape = {
+ childs = {
+ getPoints = {
+ args = "()",
+ description = "Returns the local coordinates of the edge points.",
+ returns = "(x1: number, y1: number, x2: number, y2: number)",
+ type = "function"
+ }
+ },
+ description = "A EdgeShape is a line segment. They can be used to create the boundaries of your terrain. The shape does not have volume and can only collide with PolygonShape and CircleShape.",
+ type = "lib"
+ },
+ Fixture = {
+ childs = {
+ getBody = {
+ args = "()",
+ description = "Returns the body to which the fixture is attached.",
+ returns = "(body: Body)",
+ type = "function"
+ },
+ getBoundingBox = {
+ args = "(index: number)",
+ description = "Returns the points of the fixture bounding box. In case the fixture has multiple children a 1-based index can be specified. For example, a fixture will have multiple children with a chain shape.",
+ returns = "(topLeftX: number, topLeftY: number, bottomRightX: number, bottomRightY: number)",
+ type = "function"
+ },
+ getCategory = {
+ args = "()",
+ description = "Returns the categories the fixture belongs to.",
+ returns = "(category1: number, category2: number, ...: number)",
+ type = "function"
+ },
+ getDensity = {
+ args = "()",
+ description = "Returns the density of the fixture.",
+ returns = "(density: number)",
+ type = "function"
+ },
+ getFilterData = {
+ args = "()",
+ description = "Returns the filter data of the fixture. Categories and masks are encoded as the bits of a 16-bit integer.",
+ returns = "(categories: number, mask: number, group: number)",
+ type = "function"
+ },
+ getFriction = {
+ args = "()",
+ description = "Returns the friction of the fixture.",
+ returns = "(friction: number)",
+ type = "function"
+ },
+ getGroupIndex = {
+ args = "()",
+ description = "Returns the group the fixture belongs to. Fixtures with the same group will always collide if the group is positive or never collide if it's negative. The group zero means no group.\n\nThe groups range from -32768 to 32767.",
+ returns = "(group: number)",
+ type = "function"
+ },
+ getMask = {
+ args = "()",
+ description = "Returns the category mask of the fixture.",
+ returns = "(mask1: number, mask2: number, ...: number)",
+ type = "function"
+ },
+ getMassData = {
+ args = "()",
+ description = "Returns the mass, its center and the rotational inertia.",
+ returns = "(x: number, y: number, mass: number, inertia: number)",
+ type = "function"
+ },
+ getRestitution = {
+ args = "()",
+ description = "Returns the restitution of the fixture.",
+ returns = "(restitution: number)",
+ type = "function"
+ },
+ getShape = {
+ args = "()",
+ description = "Returns the shape of the fixture. This shape is a reference to the actual data used in the simulation. It's possible to change its values between timesteps.\n\nDo not call any functions on this shape after the parent fixture has been destroyed. This shape will point to an invalid memory address and likely cause crashes if you interact further with it.",
+ returns = "(shape: Shape)",
+ type = "function"
+ },
+ getUserData = {
+ args = "()",
+ description = "Returns the Lua value associated with this fixture.\n\nUse this function in one thread only.",
+ returns = "(value: mixed)",
+ type = "function"
+ },
+ isDestroyed = {
+ args = "()",
+ description = "Gets whether the Fixture is destroyed. Destroyed fixtures cannot be used.",
+ returns = "(destroyed: boolean)",
+ type = "function"
+ },
+ isSensor = {
+ args = "()",
+ description = "Returns whether the fixture is a sensor.",
+ returns = "(sensor: boolean)",
+ type = "function"
+ },
+ rayCast = {
+ args = "(x1: number, y1: number, x2: number, y1: number, maxFraction: number, childIndex: number)",
+ description = "Casts a ray against the shape of the fixture and returns the surface normal vector and the line position where the ray hit. If the ray missed the shape, nil will be returned.\n\nThe ray starts on the first point of the input line and goes towards the second point of the line. The fourth argument is the maximum distance the ray is going to travel as a scale factor of the input line length.\n\nThe childIndex parameter is used to specify which child of a parent shape, such as a ChainShape, will be ray casted. For ChainShapes, the index of 1 is the first edge on the chain. Ray casting a parent shape will only test the child specified so if you want to test every shape of the parent, you must loop through all of its children.\n\nThe world position of the impact can be calculated by multiplying the line vector with the third return value and adding it to the line starting point.\n\nhitx, hity = x1 + (x2 - x1) * fraction, y1 + (y2 - y1) * fraction",
+ returns = "(x: number, y: number, fraction: number)",
+ type = "function"
+ },
+ setCategory = {
+ args = "(category1: number, category2: number, ...: number)",
+ description = "Sets the categories the fixture belongs to. There can be up to 16 categories represented as a number from 1 to 16.",
+ returns = "()",
+ type = "function"
+ },
+ setDensity = {
+ args = "(density: number)",
+ description = "Sets the density of the fixture. Call Body:resetMassData if this needs to take effect immediately.",
+ returns = "()",
+ type = "function"
+ },
+ setFilterData = {
+ args = "(categories: number, mask: number, group: number)",
+ description = "Sets the filter data of the fixture.\n\nGroups, categories, and mask can be used to define the collision behaviour of the fixture.\n\nIf two fixtures are in the same group they either always collide if the group is positive, or never collide if it's negative. Is the group zero or they do not match, then the contact filter checks if the fixtures select a category of the other fixture with their masks. The fixtures do not collide if that's not the case. If they do have each others categories selected, the return value of the custom contact filter will be used. They always collide if none was set.\n\nThere can be up to 16 categories. Categories and masks are encoded as the bits of a 16-bit integer.",
+ returns = "()",
+ type = "function"
+ },
+ setFriction = {
+ args = "(friction: number)",
+ description = "Sets the friction of the fixture.",
+ returns = "()",
+ type = "function"
+ },
+ setGroupIndex = {
+ args = "(group: number)",
+ description = "Sets the group the fixture belongs to. Fixtures with the same group will always collide if the group is positive or never collide if it's negative. The group zero means no group.\n\nThe groups range from -32768 to 32767.",
+ returns = "()",
+ type = "function"
+ },
+ setMask = {
+ args = "(mask1: number, mask2: number, ...: number)",
+ description = "Sets the category mask of the fixture. There can be up to 16 categories represented as a number from 1 to 16.\n\nThis fixture will collide with the fixtures that are in the selected categories if the other fixture also has a category of this fixture selected.",
+ returns = "()",
+ type = "function"
+ },
+ setRestitution = {
+ args = "(restitution: number)",
+ description = "Sets the restitution of the fixture.",
+ returns = "()",
+ type = "function"
+ },
+ setSensor = {
+ args = "(sensor: boolean)",
+ description = "Sets whether the fixture should act as a sensor.\n\nSensor do not produce collisions responses, but the begin and end callbacks will still be called for this fixture.",
+ returns = "()",
+ type = "function"
+ },
+ setUserData = {
+ args = "(value: mixed)",
+ description = "Associates a Lua value with the fixture.\n\nUse this function in one thread only.",
+ returns = "()",
+ type = "function"
+ },
+ testPoint = {
+ args = "(x: number, y: number)",
+ description = "Checks if a point is inside the shape of the fixture.",
+ returns = "(isInside: boolean)",
+ type = "function"
+ }
+ },
+ description = "Fixtures attach shapes to bodies.",
+ type = "lib"
+ },
+ FrictionJoint = {
+ childs = {
+ getMaxTorque = {
+ args = "()",
+ description = "Gets the maximum friction torque in Newton-meters.",
+ returns = "(torque: number)",
+ type = "function"
+ },
+ setMaxForce = {
+ args = "(maxForce: number)",
+ description = "Sets the maximum friction force in Newtons.",
+ returns = "()",
+ type = "function"
+ },
+ setMaxTorque = {
+ args = "(torque: number)",
+ description = "Sets the maximum friction torque in Newton-meters.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "A FrictionJoint applies friction to a body.",
+ type = "lib"
+ },
+ GearJoint = {
+ childs = {
+ getRatio = {
+ args = "()",
+ description = "Get the ratio of a gear joint.",
+ returns = "(ratio: number)",
+ type = "function"
+ },
+ setRatio = {
+ args = "(ratio: number)",
+ description = "Set the ratio of a gear joint.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Keeps bodies together in such a way that they act like gears.",
+ type = "lib"
+ },
+ Joint = {
+ childs = {
+ getAnchors = {
+ args = "()",
+ description = "Get the anchor points of the joint.",
+ returns = "(x1: number, y1: number, x2: number, y2: number)",
+ type = "function"
+ },
+ getBodies = {
+ args = "()",
+ description = "Gets the bodies that the Joint is attached to.",
+ returns = "(bodyA: Body, bodyB: Body)",
+ type = "function"
+ },
+ getCollideConnected = {
+ args = "()",
+ description = "Gets whether the connected Bodies collide.",
+ returns = "(c: boolean)",
+ type = "function"
+ },
+ getReactionForce = {
+ args = "()",
+ description = "Gets the reaction force on Body 2 at the joint anchor.",
+ returns = "(x: number, y: number)",
+ type = "function"
+ },
+ getReactionTorque = {
+ args = "(invdt: number)",
+ description = "Returns the reaction torque on the second body.",
+ returns = "(torque: number)",
+ type = "function"
+ },
+ getType = {
+ args = "()",
+ description = "Gets an string representing the type.",
+ returns = "(type: JointType)",
+ type = "function"
+ },
+ getUserData = {
+ args = "()",
+ description = "Returns the Lua value associated with this Joint.",
+ returns = "(value: mixed)",
+ type = "function"
+ },
+ isDestroyed = {
+ args = "()",
+ description = "Gets whether the Joint is destroyed. Destroyed joints cannot be used.",
+ returns = "(destroyed: boolean)",
+ type = "function"
+ },
+ setCollideConnected = {
+ args = "(collide: boolean)",
+ description = "Sets whether the connected Bodies should collide with eachother.",
+ returns = "()",
+ type = "function"
+ },
+ setUserData = {
+ args = "(value: mixed)",
+ description = "Associates a Lua value with the Joint.\n\nTo delete the reference, explicitly pass nil.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Attach multiple bodies together to interact in unique ways.",
+ type = "lib"
+ },
+ JointType = {
+ childs = {
+ distance = {
+ description = "A DistanceJoint.",
+ type = "value"
+ },
+ friction = {
+ description = "A FrictionJoint.",
+ type = "value"
+ },
+ gear = {
+ description = "A GearJoint.",
+ type = "value"
+ },
+ mouse = {
+ description = "A MouseJoint.",
+ type = "value"
+ },
+ prismatic = {
+ description = "A PrismaticJoint.",
+ type = "value"
+ },
+ pulley = {
+ description = "A PulleyJoint.",
+ type = "value"
+ },
+ revolute = {
+ description = "A RevoluteJoint.",
+ type = "value"
+ },
+ rope = {
+ description = "A RopeJoint.",
+ type = "value"
+ },
+ weld = {
+ description = "A WeldJoint.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ MouseJoint = {
+ childs = {
+ getFrequency = {
+ args = "()",
+ description = "Returns the frequency.",
+ returns = "(freq: number)",
+ type = "function"
+ },
+ getMaxForce = {
+ args = "()",
+ description = "Gets the highest allowed force.",
+ returns = "(f: number)",
+ type = "function"
+ },
+ getTarget = {
+ args = "()",
+ description = "Gets the target point.",
+ returns = "(x: number, y: number)",
+ type = "function"
+ },
+ setDampingRatio = {
+ args = "(ratio: number)",
+ description = "Sets a new damping ratio.",
+ returns = "()",
+ type = "function"
+ },
+ setFrequency = {
+ args = "(freq: number)",
+ description = "Sets a new frequency.",
+ returns = "()",
+ type = "function"
+ },
+ setMaxForce = {
+ args = "(f: number)",
+ description = "Sets the highest allowed force.",
+ returns = "()",
+ type = "function"
+ },
+ setTarget = {
+ args = "(x: number, y: number)",
+ description = "Sets the target point.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "For controlling objects with the mouse.",
+ type = "lib"
+ },
+ PolygonShape = {
+ childs = {
+ getPoints = {
+ args = "()",
+ description = "Get the local coordinates of the polygon's vertices.\n\nThis function has a variable number of return values. It can be used in a nested fashion with love.graphics.polygon.\n\nThis function may have up to 16 return values, since it returns two values for each vertex in the polygon. In other words, it can return the coordinates of up to 8 points.",
+ returns = "(x1: number, y1: number, x2: number, y2: number, ...: number)",
+ type = "function"
+ }
+ },
+ description = "Polygon is a convex polygon with up to 8 sides.",
+ type = "lib"
+ },
+ PrismaticJoint = {
+ childs = {
+ getJointSpeed = {
+ args = "()",
+ description = "Get the current joint angle speed.",
+ returns = "(s: number)",
+ type = "function"
+ },
+ getJointTranslation = {
+ args = "()",
+ description = "Get the current joint translation.",
+ returns = "(t: number)",
+ type = "function"
+ },
+ getLimits = {
+ args = "()",
+ description = "Gets the joint limits.",
+ returns = "(lower: number, upper: number)",
+ type = "function"
+ },
+ getLowerLimit = {
+ args = "()",
+ description = "Gets the lower limit.",
+ returns = "(lower: number)",
+ type = "function"
+ },
+ getMaxMotorForce = {
+ args = "()",
+ description = "Gets the maximum motor force.",
+ returns = "(f: number)",
+ type = "function"
+ },
+ getMotorForce = {
+ args = "()",
+ description = "Get the current motor force.",
+ returns = "(f: number)",
+ type = "function"
+ },
+ getMotorSpeed = {
+ args = "()",
+ description = "Gets the motor speed.",
+ returns = "(s: number)",
+ type = "function"
+ },
+ getUpperLimit = {
+ args = "()",
+ description = "Gets the upper limit.",
+ returns = "(upper: number)",
+ type = "function"
+ },
+ hasLimitsEnabled = {
+ args = "()",
+ description = "Checks whether the limits are enabled.",
+ returns = "(enabled: boolean)",
+ type = "function"
+ },
+ isMotorEnabled = {
+ args = "()",
+ description = "Checks whether the motor is enabled.",
+ returns = "(enabled: boolean)",
+ type = "function"
+ },
+ setLimits = {
+ args = "(lower: number, upper: number)",
+ description = "Sets the limits.",
+ returns = "()",
+ type = "function"
+ },
+ setLowerLimit = {
+ args = "(lower: number)",
+ description = "Sets the lower limit.",
+ returns = "()",
+ type = "function"
+ },
+ setMaxMotorForce = {
+ args = "(f: number)",
+ description = "Set the maximum motor force.",
+ returns = "()",
+ type = "function"
+ },
+ setMotorEnabled = {
+ args = "(enable: boolean)",
+ description = "Starts or stops the joint motor.",
+ returns = "()",
+ type = "function"
+ },
+ setMotorSpeed = {
+ args = "(s: number)",
+ description = "Sets the motor speed.",
+ returns = "()",
+ type = "function"
+ },
+ setUpperLimit = {
+ args = "(upper: number)",
+ description = "Sets the upper limit.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Restricts relative motion between Bodies to one shared axis.",
+ type = "lib"
+ },
+ PulleyJoint = {
+ childs = {
+ getGroundAnchors = {
+ args = "()",
+ description = "Get the ground anchor positions in world coordinates.",
+ returns = "(a1x: number, a1y: number, a2x: number, a2y: number)",
+ type = "function"
+ },
+ getLengthA = {
+ args = "()",
+ description = "Get the current length of the rope segment attached to the first body.",
+ returns = "(length: number)",
+ type = "function"
+ },
+ getLengthB = {
+ args = "()",
+ description = "Get the current length of the rope segment attached to the second body.",
+ returns = "(length: number)",
+ type = "function"
+ },
+ getMaxLengths = {
+ args = "()",
+ description = "Get the maximum lengths of the rope segments.",
+ returns = "(len1: number, len2: number)",
+ type = "function"
+ },
+ getRatio = {
+ args = "()",
+ description = "Get the pulley ratio.",
+ returns = "(ratio: number)",
+ type = "function"
+ },
+ setConstant = {
+ args = "(length: number)",
+ description = "Set the total length of the rope.\n\nSetting a new length for the rope updates the maximum length values of the joint.",
+ returns = "()",
+ type = "function"
+ },
+ setMaxLengths = {
+ args = "(max1: number, max2: number)",
+ description = "Set the maximum lengths of the rope segments.\n\nThe physics module also imposes maximum values for the rope segments. If the parameters exceed these values, the maximum values are set instead of the requested values.",
+ returns = "()",
+ type = "function"
+ },
+ setRatio = {
+ args = "(ratio: number)",
+ description = "Set the pulley ratio.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Allows you to simulate bodies connected through pulleys.",
+ type = "lib"
+ },
+ RevoluteJoint = {
+ childs = {
+ getJointAngle = {
+ args = "()",
+ description = "Get the current joint angle.",
+ returns = "(angle: number)",
+ type = "function"
+ },
+ getJointSpeed = {
+ args = "()",
+ description = "Get the current joint angle speed.",
+ returns = "(s: number)",
+ type = "function"
+ },
+ getLimits = {
+ args = "()",
+ description = "Gets the joint limits.",
+ returns = "(lower: number, upper: number)",
+ type = "function"
+ },
+ getLowerLimit = {
+ args = "()",
+ description = "Gets the lower limit.",
+ returns = "(lower: number)",
+ type = "function"
+ },
+ getMaxMotorTorque = {
+ args = "()",
+ description = "Gets the maximum motor force.",
+ returns = "(f: number)",
+ type = "function"
+ },
+ getMotorSpeed = {
+ args = "()",
+ description = "Gets the motor speed.",
+ returns = "(s: number)",
+ type = "function"
+ },
+ getMotorTorque = {
+ args = "()",
+ description = "Get the current motor force.",
+ returns = "(f: number)",
+ type = "function"
+ },
+ getUpperLimit = {
+ args = "()",
+ description = "Gets the upper limit.",
+ returns = "(upper: number)",
+ type = "function"
+ },
+ hasLimitsEnabled = {
+ args = "()",
+ description = "Checks whether limits are enabled.",
+ returns = "(enabled: boolean)",
+ type = "function"
+ },
+ isMotorEnabled = {
+ args = "()",
+ description = "Checks whether the motor is enabled.",
+ returns = "(enabled: boolean)",
+ type = "function"
+ },
+ setLimits = {
+ args = "(lower: number, upper: number)",
+ description = "Sets the limits.",
+ returns = "()",
+ type = "function"
+ },
+ setLowerLimit = {
+ args = "(lower: number)",
+ description = "Sets the lower limit.",
+ returns = "()",
+ type = "function"
+ },
+ setMaxMotorTorque = {
+ args = "(f: number)",
+ description = "Set the maximum motor force.",
+ returns = "()",
+ type = "function"
+ },
+ setMotorEnabled = {
+ args = "(enable: boolean)",
+ description = "Starts or stops the joint motor.",
+ returns = "()",
+ type = "function"
+ },
+ setMotorSpeed = {
+ args = "(s: number)",
+ description = "Sets the motor speed.",
+ returns = "()",
+ type = "function"
+ },
+ setUpperLimit = {
+ args = "(upper: number)",
+ description = "Sets the upper limit.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Allow two Bodies to revolve around a shared point.",
+ type = "lib"
+ },
+ RopeJoint = {
+ childs = {
+ getMaxLength = {
+ args = "()",
+ description = "Gets the maximum length of a RopeJoint.",
+ returns = "(maxLength: number)",
+ type = "function"
+ }
+ },
+ description = "The RopeJoint enforces a maximum distance between two points on two bodies. It has no other effect.",
+ type = "lib"
+ },
+ Shape = {
+ childs = {
+ computeMass = {
+ args = "(density: number)",
+ description = "Computes the mass properties for the shape with the specified density.",
+ returns = "(x: number, y: number, mass: number, inertia: number)",
+ type = "function"
+ },
+ getChildCount = {
+ args = "()",
+ description = "Returns the number of children the shape has.",
+ returns = "(count: number)",
+ type = "function"
+ },
+ getRadius = {
+ args = "()",
+ description = "Gets the radius of the shape.",
+ returns = "(radius: number)",
+ type = "function"
+ },
+ getType = {
+ args = "()",
+ description = "Gets a string representing the Shape. This function can be useful for conditional debug drawing.",
+ returns = "(type: ShapeType)",
+ type = "function"
+ },
+ rayCast = {
+ args = "(x1: number, y1: number, x2: number, y2: number, maxFraction: number, tx: number, ty: number, tr: number, childIndex: number)",
+ description = "Casts a ray against the shape and returns the surface normal vector and the line position where the ray hit. If the ray missed the shape, nil will be returned. The Shape can be transformed to get it into the desired position.\n\nThe ray starts on the first point of the input line and goes towards the second point of the line. The fourth argument is the maximum distance the ray is going to travel as a scale factor of the input line length.\n\nThe childIndex parameter is used to specify which child of a parent shape, such as a ChainShape, will be ray casted. For ChainShapes, the index of 1 is the first edge on the chain. Ray casting a parent shape will only test the child specified so if you want to test every shape of the parent, you must loop through all of its children.\n\nThe world position of the impact can be calculated by multiplying the line vector with the third return value and adding it to the line starting point.\n\nhitx, hity = x1 + (x2 - x1) * fraction, y1 + (y2 - y1) * fraction",
+ returns = "(xn: number, yn: number, fraction: number)",
+ type = "function"
+ },
+ testPoint = {
+ args = "(x: number, y: number)",
+ description = "Checks whether a point lies inside the shape. This is particularly useful for mouse interaction with the shapes. By looping through all shapes and testing the mouse position with this function, we can find which shapes the mouse touches.",
+ returns = "(hit: boolean)",
+ type = "function"
+ }
+ },
+ description = "Shapes are solid 2d geometrical objects used in love.physics.\n\nShapes are attached to a Body via a Fixture. The Shape object is copied when this happens. Shape position is relative to Body position.",
+ type = "lib"
+ },
+ ShapeType = {
+ childs = {
+ chain = {
+ description = "The Shape is a ChainShape.",
+ type = "value"
+ },
+ circle = {
+ description = "The Shape is a CircleShape.",
+ type = "value"
+ },
+ edge = {
+ description = "The Shape is a EdgeShape.",
+ type = "value"
+ },
+ polygon = {
+ description = "The Shape is a PolygonShape.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ WeldJoint = {
+ childs = {
+ getFrequency = {
+ args = "()",
+ description = "Returns the frequency.",
+ returns = "(freq: number)",
+ type = "function"
+ },
+ setDampingRatio = {
+ args = "(ratio: number)",
+ description = "The new damping ratio.",
+ returns = "()",
+ type = "function"
+ },
+ setFrequency = {
+ args = "(freq: number)",
+ description = "Sets a new frequency.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "A WeldJoint essentially glues two bodies together.",
+ type = "lib"
+ },
+ WheelJoint = {
+ childs = {
+ getJointTranslation = {
+ args = "()",
+ description = "Returns the current joint translation.",
+ returns = "(position: number)",
+ type = "function"
+ },
+ getLimits = {
+ args = "()",
+ description = "Gets the joint limits.",
+ returns = "(lower: number, upper: number)",
+ type = "function"
+ },
+ getMaxMotorTorque = {
+ args = "()",
+ description = "Returns the maximum motor torque.",
+ returns = "(maxTorque: number)",
+ type = "function"
+ },
+ getMotorSpeed = {
+ args = "()",
+ description = "Returns the speed of the motor.",
+ returns = "(speed: number)",
+ type = "function"
+ },
+ getMotorTorque = {
+ args = "(invdt: number)",
+ description = "Returns the current torque on the motor.",
+ returns = "(torque: number)",
+ type = "function"
+ },
+ getSpringDampingRatio = {
+ args = "()",
+ description = "Returns the damping ratio.",
+ returns = "(ratio: number)",
+ type = "function"
+ },
+ getSpringFrequency = {
+ args = "()",
+ description = "Returns the spring frequency.",
+ returns = "(freq: number)",
+ type = "function"
+ },
+ setMaxMotorTorque = {
+ args = "(maxTorque: number)",
+ description = "Sets a new maximum motor torque.",
+ returns = "()",
+ type = "function"
+ },
+ setMotorEnabled = {
+ args = "(enable: boolean)",
+ description = "Starts and stops the joint motor.",
+ returns = "()",
+ type = "function"
+ },
+ setMotorSpeed = {
+ args = "(speed: number)",
+ description = "Sets a new speed for the motor.",
+ returns = "()",
+ type = "function"
+ },
+ setSpringDampingRatio = {
+ args = "(ratio: number)",
+ description = "Sets a new damping ratio.",
+ returns = "()",
+ type = "function"
+ },
+ setSpringFrequency = {
+ args = "(freq: number)",
+ description = "Sets a new spring frequency.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Restricts a point on the second body to a line on the first body.",
+ type = "lib"
+ },
+ World = {
+ childs = {
+ getBodyCount = {
+ args = "()",
+ description = "Get the number of bodies in the world.",
+ returns = "(n: number)",
+ type = "function"
+ },
+ getBodyList = {
+ args = "()",
+ description = "Returns a table with all bodies.",
+ returns = "(bodies: table)",
+ type = "function"
+ },
+ getCallbacks = {
+ args = "()",
+ description = "Returns functions for the callbacks during the world update.",
+ returns = "(beginContact: function, endContact: function, preSolve: function, postSolve: function)",
+ type = "function"
+ },
+ getContactCount = {
+ args = "()",
+ description = "Returns the number of contacts in the world.",
+ returns = "(n: number)",
+ type = "function"
+ },
+ getContactFilter = {
+ args = "()",
+ description = "Returns the function for collision filtering.",
+ returns = "(contactFilter: function)",
+ type = "function"
+ },
+ getContactList = {
+ args = "()",
+ description = "Returns a table with all contacts.",
+ returns = "(contacts: table)",
+ type = "function"
+ },
+ getGravity = {
+ args = "()",
+ description = "Get the gravity of the world.",
+ returns = "(x: number, y: number)",
+ type = "function"
+ },
+ getJointCount = {
+ args = "()",
+ description = "Get the number of joints in the world.",
+ returns = "(n: number)",
+ type = "function"
+ },
+ getJointList = {
+ args = "()",
+ description = "Returns a table with all joints.",
+ returns = "(joints: table)",
+ type = "function"
+ },
+ isDestroyed = {
+ args = "()",
+ description = "Gets whether the World is destroyed. Destroyed worlds cannot be used.",
+ returns = "(destroyed: boolean)",
+ type = "function"
+ },
+ isLocked = {
+ args = "()",
+ description = "Returns if the world is updating its state.\n\nThis will return true inside the callbacks from World:setCallbacks.",
+ returns = "(locked: boolean)",
+ type = "function"
+ },
+ isSleepingAllowed = {
+ args = "()",
+ description = "Returns the sleep behaviour of the world.",
+ returns = "(allowSleep: boolean)",
+ type = "function"
+ },
+ queryBoundingBox = {
+ args = "(topLeftX: number, topLeftY: number, bottomRightX: number, bottomRightY: number, callback: function)",
+ description = "Calls a function for each fixture inside the specified area.",
+ returns = "()",
+ type = "function"
+ },
+ rayCast = {
+ args = "(x1: number, y1: number, x2: number, y2: number, callback: function)",
+ description = "Casts a ray and calls a function with the fixtures that intersect it. You cannot make any assumptions about the order of the callbacks.\n\nEach time the function gets called, 6 arguments get passed to it. The first is the fixture intersecting the ray. The second and third are the coordinates of the intersection point. The fourth and fifth is the surface normal vector of the shape edge. The sixth argument is the position of the intersection on the ray as a number from 0 to 1 (or even higher if the ray length was changed with the return value).\n\nThe ray can be controlled with the return value. A positive value sets a new ray length where 1 is the default value. A value of 0 terminates the ray. If the callback function returns -1, the intersection gets ignored as if it didn't happen.\n\nThere is a bug in 0.8.0 where the normal vector passed to the callback function gets scaled by love.physics.getMeter.",
+ returns = "()",
+ type = "function"
+ },
+ setCallbacks = {
+ args = "(beginContact: function, endContact: function, preSolve: function, postSolve: function)",
+ description = "Sets functions for the collision callbacks during the world update.\n\nFour Lua functions can be given as arguments. The value nil removes a function.\n\nWhen called, each function will be passed three arguments. The first two arguments are the colliding fixtures and the third argument is the Contact between them. The PostSolve callback additionally gets the normal and tangent impulse for each contact point.",
+ returns = "()",
+ type = "function"
+ },
+ setContactFilter = {
+ args = "(filter: function)",
+ description = "Sets a function for collision filtering.\n\nIf the group and category filtering doesn't generate a collision decision, this function gets called with the two fixtures as arguments. The function should return a boolean value where true means the fixtures will collide and false means they will pass through each other.",
+ returns = "()",
+ type = "function"
+ },
+ setGravity = {
+ args = "(x: number, y: number)",
+ description = "Set the gravity of the world.",
+ returns = "()",
+ type = "function"
+ },
+ setSleepingAllowed = {
+ args = "(allowSleep: boolean)",
+ description = "Set the sleep behaviour of the world.\n\nA sleeping body is much more efficient to simulate than when awake.\n\nIf sleeping is allowed, any body that has come to rest will sleep.",
+ returns = "()",
+ type = "function"
+ },
+ translateOrigin = {
+ args = "(x: number, y: number)",
+ description = "Translates the World's origin. Useful in large worlds where floating point precision issues become noticeable at far distances from the origin.",
+ returns = "()",
+ type = "function"
+ },
+ update = {
+ args = "(dt: number)",
+ description = "Update the state of the world.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "A world is an object that contains all bodies and joints.",
+ type = "lib"
+ },
+ getMeter = {
+ args = "()",
+ description = "Get the scale of the world.\n\nThe world scale is the number of pixels per meter. Try to keep your shape sizes less than 10 times this scale.\n\nThis is important because the physics in Box2D is tuned to work well for objects of size 0.1m up to 10m. All physics coordinates are divided by this number for the physics calculations.",
+ returns = "(scale: number)",
+ type = "function"
+ },
+ newBody = {
+ args = "(world: World, x: number, y: number, type: BodyType)",
+ description = "Creates a new body.\n\nThere are three types of bodies. Static bodies do not move, have a infinite mass, and can be used for level boundaries. Dynamic bodies are the main actors in the simulation, they collide with everything. Kinematic bodies do not react to forces and only collide with dynamic bodies.\n\nThe mass of the body gets calculated when a Fixture is attached or removed, but can be changed at any time with Body:setMass or Body:resetMassData.",
+ returns = "(body: Body)",
+ type = "function"
+ },
+ newChainShape = {
+ args = "(loop: boolean, x1: number, y1: number, x2: number, y2: number, ...: number)",
+ description = "Creates a new ChainShape.",
+ returns = "(shape: ChainShape)",
+ type = "function"
+ },
+ newCircleShape = {
+ args = "(radius: number)",
+ description = "Creates a new CircleShape.",
+ returns = "(shape: CircleShape)",
+ type = "function"
+ },
+ newDistanceJoint = {
+ args = "(body1: Body, body2: Body, x1: number, y1: number, x2: number, y2: number, collideConnected: boolean)",
+ description = "Create a distance joint between two bodies.\n\nThis joint constrains the distance between two points on two bodies to be constant. These two points are specified in world coordinates and the two bodies are assumed to be in place when this joint is created. The first anchor point is connected to the first body and the second to the second body, and the points define the length of the distance joint.",
+ returns = "(joint: DistanceJoint)",
+ type = "function"
+ },
+ newEdgeShape = {
+ args = "(x1: number, y1: number, x2: number, y2: number)",
+ description = "Creates a edge shape.",
+ returns = "(shape: EdgeShape)",
+ type = "function"
+ },
+ newFixture = {
+ args = "(body: Body, shape: Shape, density: number)",
+ description = "Creates and attaches a Fixture to a body.",
+ returns = "(fixture: Fixture)",
+ type = "function"
+ },
+ newFrictionJoint = {
+ args = "(body1: Body, body2: Body, x: number, y: number, collideConnected: boolean)",
+ description = "Create a friction joint between two bodies. A FrictionJoint applies friction to a body.",
+ returns = "(joint: FrictionJoint)",
+ type = "function"
+ },
+ newGearJoint = {
+ args = "(joint1: Joint, joint2: Joint, ratio: number, collideConnected: boolean)",
+ description = "Create a gear joint connecting two joints.\n\nThe gear joint connects two joints that must be either prismatic or revolute joints. Using this joint requires that the joints it uses connect their respective bodies to the ground and have the ground as the first body. When destroying the bodies and joints you must make sure you destroy the gear joint before the other joints.\n\nThe gear joint has a ratio the determines how the angular or distance values of the connected joints relate to each other. The formula coordinate1 + ratio * coordinate2 always has a constant value that is set when the gear joint is created.",
+ returns = "(joint: Joint)",
+ type = "function"
+ },
+ newMouseJoint = {
+ args = "(body: Body, x: number, y: number)",
+ description = "Create a joint between a body and the mouse.\n\nThis joint actually connects the body to a fixed point in the world. To make it follow the mouse, the fixed point must be updated every timestep (example below).\n\nThe advantage of using a MouseJoint instead of just changing a body position directly is that collisions and reactions to other joints are handled by the physics engine.",
+ returns = "(joint: Joint)",
+ type = "function"
+ },
+ newPolygonShape = {
+ args = "(x1: number, y1: number, x2: number, y2: number, ...: number)",
+ description = "Creates a new PolygonShape.\n\nThis shape can have 8 vertices at most, and must form a convex shape.",
+ returns = "(shape: PolygonShape)",
+ type = "function"
+ },
+ newPrismaticJoint = {
+ args = "(body1: Body, body2: Body, x: number, y: number, ax: number, ay: number, collideConnected: boolean)",
+ description = "Create a prismatic joints between two bodies.\n\nA prismatic joint constrains two bodies to move relatively to each other on a specified axis. It does not allow for relative rotation. Its definition and operation are similar to a revolute joint, but with translation and force substituted for angle and torque.",
+ returns = "(joint: PrismaticJoint)",
+ type = "function"
+ },
+ newPulleyJoint = {
+ args = "(body1: Body, body2: Body, gx1: number, gy1: number, gx2: number, gy2: number, x1: number, y1: number, x2: number, y2: number, ratio: number, collideConnected: boolean)",
+ description = "Create a pulley joint to join two bodies to each other and the ground.\n\nThe pulley joint simulates a pulley with an optional block and tackle. If the ratio parameter has a value different from one, then the simulated rope extends faster on one side than the other. In a pulley joint the total length of the simulated rope is the constant length1 + ratio * length2, which is set when the pulley joint is created.\n\nPulley joints can behave unpredictably if one side is fully extended. It is recommended that the method setMaxLengths be used to constrain the maximum lengths each side can attain.",
+ returns = "(joint: Joint)",
+ type = "function"
+ },
+ newRectangleShape = {
+ args = "(width: number, height: number)",
+ description = "Shorthand for creating rectangluar PolygonShapes.\n\nBy default, the local origin is located at the center of the rectangle as opposed to the top left for graphics.",
+ returns = "(shape: PolygonShape)",
+ type = "function"
+ },
+ newRevoluteJoint = {
+ args = "(body1: Body, body2: Body, x: number, y: number, collideConnected: number)",
+ description = "Creates a pivot joint between two bodies.\n\nThis joint connects two bodies to a point around which they can pivot.",
+ returns = "(joint: Joint)",
+ type = "function"
+ },
+ newRopeJoint = {
+ args = "(body1: Body, body2: Body, x1: number, y1: number, x2: number, y2: number, maxLength: number, collideConnected: boolean)",
+ description = "Create a joint between two bodies. Its only function is enforcing a max distance between these bodies.",
+ returns = "(joint: RopeJoint)",
+ type = "function"
+ },
+ newWeldJoint = {
+ args = "(body1: Body, body2: Body, x: number, y: number, collideConnected: boolean)",
+ description = "Create a friction joint between two bodies. A WeldJoint essentially glues two bodies together.",
+ returns = "(joint: WeldJoint)",
+ type = "function"
+ },
+ newWheelJoint = {
+ args = "(body1: Body, body2: Body, x: number, y: number, ax: number, ay: number, collideConnected: boolean)",
+ description = "Creates a wheel joint.",
+ returns = "(joint: WheelJoint)",
+ type = "function"
+ },
+ newWorld = {
+ args = "(xg: number, yg: number, sleep: boolean)",
+ description = "Creates a new World.",
+ returns = "(world: World)",
+ type = "function"
+ },
+ setMeter = {
+ args = "(scale: number)",
+ description = "Sets the pixels to meter scale factor.\n\nAll coordinates in the physics module are divided by this number and converted to meters, and it creates a convenient way to draw the objects directly to the screen without the need for graphics transformations.\n\nIt is recommended to create shapes no larger than 10 times the scale. This is important because Box2D is tuned to work well with shape sizes from 0.1 to 10 meters. The default meter scale is 30.\n\nlove.physics.setMeter does not apply retroactively to created objects. Created objects retain their meter coordinates but the scale factor will affect their pixel coordinates.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Can simulate 2D rigid body physics in a realistic manner. This module is based on Box2D, and this API corresponds to the Box2D API as closely as possible.",
+ type = "class"
+ },
+ quit = {
+ args = "()",
+ description = "Callback function triggered when the game is closed.",
+ returns = "(r: boolean)",
+ type = "function"
+ },
+ resize = {
+ args = "(w: number, h: number)",
+ description = "Called when the window is resized, for example if the user resizes the window, or if love.window.setMode is called with an unsupported width or height in fullscreen and the window chooses the closest appropriate size.\n\nCalls to love.window.setMode will only trigger this event if the width or height of the window after the call doesn't match the requested width and height. This can happen if a fullscreen mode is requested which doesn't match any supported mode, or if the fullscreen type is 'desktop' and the requested width or height don't match the desktop resolution.",
+ returns = "()",
+ type = "function"
+ },
+ run = {
+ args = "()",
+ description = "The main function, containing the main loop. A sensible default is used when left out.",
+ returns = "()",
+ type = "function"
+ },
+ sound = {
+ childs = {
+ Decoder = {
+ childs = {
+ getChannels = {
+ args = "()",
+ description = "Returns the number of channels in the stream.",
+ returns = "(channels: number)",
+ type = "function"
+ },
+ getDuration = {
+ args = "()",
+ description = "Gets the duration of the sound file. It may not always be sample-accurate, and it may return -1 if the duration cannot be determined at all.",
+ returns = "(duration: number)",
+ type = "function"
+ },
+ getSampleRate = {
+ args = "()",
+ description = "Returns the sample rate of the Decoder.",
+ returns = "(rate: number)",
+ type = "function"
+ }
+ },
+ description = "An object which can gradually decode a sound file.",
+ type = "lib"
+ },
+ SoundData = {
+ childs = {
+ getChannels = {
+ args = "()",
+ description = "Returns the number of channels in the stream.",
+ returns = "(channels: number)",
+ type = "function"
+ },
+ getDuration = {
+ args = "()",
+ description = "Returns the number of channels in the stream.",
+ returns = "(duration: number)",
+ type = "function"
+ },
+ getSample = {
+ args = "(i: number)",
+ description = "Gets the sample at the specified position.",
+ returns = "(sample: number)",
+ type = "function"
+ },
+ getSampleCount = {
+ args = "()",
+ description = "Returns the sample count of the SoundData.",
+ returns = "(count: number)",
+ type = "function"
+ },
+ getSampleRate = {
+ args = "()",
+ description = "Returns the sample rate of the SoundData.",
+ returns = "(rate: number)",
+ type = "function"
+ },
+ setSample = {
+ args = "(i: number, sample: number)",
+ description = "Sets the sample at the specified position.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Contains raw audio samples. You can not play SoundData back directly. You must wrap a Source object around it.",
+ type = "lib"
+ },
+ newSoundData = {
+ args = "(filename: string)",
+ description = "Creates new SoundData from a file. It's also possible to create SoundData with a custom sample rate, channel and bit depth.\n\nThe sound data will be decoded to the memory in a raw format. It is recommended to create only short sounds like effects, as a 3 minute song uses 30 MB of memory this way.",
+ returns = "(soundData: SoundData)",
+ type = "function"
+ }
+ },
+ description = "This module is responsible for decoding sound files. It can't play the sounds, see love.audio for that.",
+ type = "class"
+ },
+ system = {
+ childs = {
+ PowerState = {
+ childs = {
+ battery = {
+ description = "Not plugged in, running on a battery.",
+ type = "value"
+ },
+ charged = {
+ description = "Plugged in, battery is fully charged.",
+ type = "value"
+ },
+ charging = {
+ description = "Plugged in, charging battery.",
+ type = "value"
+ },
+ nobattery = {
+ description = "Plugged in, no battery available.",
+ type = "value"
+ },
+ unknown = {
+ description = "Cannot determine power status.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ getOS = {
+ args = "()",
+ description = "Gets the current operating system. In general, LÖVE abstracts away the need to know the current operating system, but there are a few cases where it can be useful (especially in combination with os.execute.)",
+ returns = "(os_string: string)",
+ type = "function"
+ },
+ getPowerInfo = {
+ args = "()",
+ description = "Gets information about the system's power supply.",
+ returns = "(state: PowerState, percent: number, seconds: number)",
+ type = "function"
+ },
+ getProcessorCount = {
+ args = "()",
+ description = "Gets the number of CPU cores in the system.\n\nThe number includes the threads reported if technologies such as Intel's Hyper-threading are enabled. For example, on a 4-core CPU with Hyper-threading, this function will return 8.",
+ returns = "(cores: number)",
+ type = "function"
+ },
+ openURL = {
+ args = "(url: string)",
+ description = "Opens a URL with the user's web or file browser.",
+ returns = "(success: boolean)",
+ type = "function"
+ },
+ setClipboardText = {
+ args = "(text: string)",
+ description = "Puts text in the clipboard.",
+ returns = "()",
+ type = "function"
+ },
+ vibrate = {
+ args = "(seconds: number)",
+ description = "Causes the device to vibrate, if possible. Currently this will only work on Android and iOS devices that have a built-in vibration motor.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Provides access to information about the user's system.",
+ type = "lib"
+ },
+ textedited = {
+ args = "(text: string, start: number, length: number)",
+ description = "Called when the candidate text for an IME (Input Method Editor) has changed.\n\nThe candidate text is not the final text that the user will eventually choose. Use love.textinput for that.",
+ returns = "()",
+ type = "function"
+ },
+ textinput = {
+ args = "(text: string)",
+ description = "Called when text has been entered by the user. For example if shift-2 is pressed on an American keyboard layout, the text \"@\" will be generated.",
+ returns = "()",
+ type = "function"
+ },
+ thread = {
+ childs = {
+ Channel = {
+ childs = {
+ demand = {
+ args = "()",
+ description = "Retrieves the value of a Channel message and removes it from the message queue.\n\nThe value of the message can be a boolean, string, number, LÖVE userdata, or a simple flat table. It waits until a message is in the queue then returns the message value.",
+ returns = "(value: value)",
+ type = "function"
+ },
+ getCount = {
+ args = "()",
+ description = "Retrieves the number of messages in the thread Channel queue.",
+ returns = "(count: number)",
+ type = "function"
+ },
+ peek = {
+ args = "()",
+ description = "Retrieves the value of a Channel message, but leaves it in the queue.\n\nThe value of the message can be a boolean, string, number or a LÖVE userdata. It returns nil if there's no message in the queue.",
+ returns = "(value: value)",
+ type = "function"
+ },
+ performAtomic = {
+ args = "(func: function, arg1: any, ...: any)",
+ description = "Executes the specified function atomically with respect to this Channel.\n\nCalling multiple methods in a row on the same Channel is often useful. However if multiple Threads are calling this Channel's methods at the same time, the different calls on each Thread might end up interleaved (e.g. one or more of the second thread's calls may happen in between the first thread's calls.)\n\nThis method avoids that issue by making sure the Thread calling the method has exclusive access to the Channel until the specified function has returned.",
+ returns = "(ret1: any, ...: any)",
+ type = "function"
+ },
+ pop = {
+ args = "()",
+ description = "Retrieves the value of a Channel message and removes it from the message queue.\n\nThe value of the message can be a boolean, string, number, LÖVE userdata, or a simple flat table. It returns nil if there are no messages in the queue.",
+ returns = "(value: value)",
+ type = "function"
+ },
+ push = {
+ args = "(value: value)",
+ description = "Send a message to the thread Channel.\n\nThe value of the message can be a boolean, string, number, LÖVE userdata, or a simple flat table. Foreign userdata (Lua's files, LuaSocket, ENet, ...), functions, and tables inside tables are not supported.",
+ returns = "()",
+ type = "function"
+ },
+ supply = {
+ args = "(value: value)",
+ description = "Send a message to the thread Channel and wait for a thread to accept it.\n\nThe value of the message can be a boolean, string, number, LÖVE userdata, or a simple flat table. Foreign userdata (Lua's files, LuaSocket, ENet, ...), functions, and tables inside tables are not supported.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "A channel is a way to send and receive data to and from different threads.",
+ type = "lib"
+ },
+ Thread = {
+ childs = {
+ isRunning = {
+ args = "()",
+ description = "Returns whether the thread is currently running.\n\nThreads which are not running can be (re)started with Thread:start.",
+ returns = "()",
+ type = "function"
+ },
+ start = {
+ args = "(arg1: value, arg2: value, ...: value)",
+ description = "Starts the thread.\n\nThreads can be restarted after they have completed their execution.",
+ returns = "()",
+ type = "function"
+ },
+ wait = {
+ args = "()",
+ description = "Wait for a thread to finish. This call will block until the thread finishes.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "A Thread is a chunk of code that can run in parallel with other threads.\n\nThreads will place all Lua errors in \"error\". To retrieve the error, call Thread:get('error') in the main thread.",
+ type = "lib"
+ },
+ newChannel = {
+ args = "()",
+ description = "Create a new unnamed thread channel.\n\nOne use for them is to pass new unnamed channels to other threads via Channel:push",
+ returns = "(channel: Channel)",
+ type = "function"
+ },
+ newThread = {
+ args = "(filename: string)",
+ description = "Creates a new Thread from a File or Data object.",
+ returns = "(thread: Thread)",
+ type = "function"
+ }
+ },
+ description = "Allows you to work with threads.\n\nThreads are separate Lua environments, running in parallel to the main code. As their code runs separately, they can be used to compute complex operations without adversely affecting the frame rate of the main thread. However, as they are separate environments, they cannot access the variables and functions of the main thread, and communication between threads is limited.\n\nAll LOVE objects (userdata) are shared among threads so you'll only have to send their references across threads. You may run into concurrency issues if you manipulate an object on multiple threads at the same time.\n\nWhen a Thread is started, it only loads the love.thread module. Every other module has to be loaded with require.",
+ type = "class"
+ },
+ threaderror = {
+ args = "(thread: Thread, errorstr: string)",
+ description = "Callback function triggered when a Thread encounters an error.",
+ returns = "()",
+ type = "function"
+ },
+ timer = {
+ childs = {
+ getDelta = {
+ args = "()",
+ description = "Returns the time between the last two frames.",
+ returns = "(dt: number)",
+ type = "function"
+ },
+ getFPS = {
+ args = "()",
+ description = "Returns the current frames per second.",
+ returns = "(fps: number)",
+ type = "function"
+ },
+ getTime = {
+ args = "()",
+ description = "Returns the value of a timer with an unspecified starting time. This function should only be used to calculate differences between points in time, as the starting time of the timer is unknown.",
+ returns = "(time: number)",
+ type = "function"
+ },
+ sleep = {
+ args = "(s: number)",
+ description = "Sleeps the program for the specified amount of time.",
+ returns = "()",
+ type = "function"
+ },
+ step = {
+ args = "()",
+ description = "Measures the time between two frames. Calling this changes the return value of love.timer.getDelta.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Provides an interface to the user's clock.",
+ type = "lib"
+ },
+ touch = {
+ childs = {
+ getPressure = {
+ args = "(id: light userdata)",
+ description = "Gets the current pressure of the specified touch-press.",
+ returns = "(pressure: number)",
+ type = "function"
+ },
+ getTouches = {
+ args = "()",
+ description = "Gets a list of all active touch-presses.",
+ returns = "(touches: table)",
+ type = "function"
+ }
+ },
+ description = "Provides an interface to touch-screen presses.",
+ type = "lib"
+ },
+ touchmoved = {
+ args = "(id: light userdata, x: number, y: number, pressure: number)",
+ description = "Callback function triggered when a touch press moves inside the touch screen.",
+ returns = "()",
+ type = "function"
+ },
+ touchpressed = {
+ args = "(id: light userdata, x: number, y: number, pressure: number)",
+ description = "Callback function triggered when the touch screen is touched.",
+ returns = "()",
+ type = "function"
+ },
+ touchreleased = {
+ args = "(id: light userdata, x: number, y: number, pressure: number)",
+ description = "Callback function triggered when the touch screen stops being touched.",
+ returns = "()",
+ type = "function"
+ },
+ update = {
+ args = "(dt: number)",
+ description = "Callback function triggered when a key is pressed.",
+ returns = "()",
+ type = "function"
+ },
+ video = {
+ childs = {
+ Video = {
+ childs = {
+ getFilter = {
+ args = "()",
+ description = "Gets the scaling filters used when drawing the Video.",
+ returns = "(min: FilterMode, mag: FilterMode, anisotropy: number)",
+ type = "function"
+ },
+ getHeight = {
+ args = "()",
+ description = "Gets the height of the Video in pixels.",
+ returns = "(height: number)",
+ type = "function"
+ },
+ getSource = {
+ args = "()",
+ description = "Gets the audio Source used for playing back the video's audio. May return nil if the video has no audio, or if Video:setSource is called with a nil argument.",
+ returns = "(source: Source)",
+ type = "function"
+ },
+ getStream = {
+ args = "()",
+ description = "Gets the VideoStream object used for decoding and controlling the video.",
+ returns = "(stream: VideoStream)",
+ type = "function"
+ },
+ getWidth = {
+ args = "()",
+ description = "Gets the width of the Video in pixels.",
+ returns = "(width: number)",
+ type = "function"
+ },
+ isPlaying = {
+ args = "()",
+ description = "Gets whether the Video is currently playing.",
+ returns = "(playing: boolean)",
+ type = "function"
+ },
+ pause = {
+ args = "()",
+ description = "Pauses the Video.",
+ returns = "()",
+ type = "function"
+ },
+ play = {
+ args = "()",
+ description = "Starts playing the Video. In order for the video to appear onscreen it must be drawn with love.graphics.draw.",
+ returns = "()",
+ type = "function"
+ },
+ rewind = {
+ args = "()",
+ description = "Rewinds the Video to the beginning.",
+ returns = "()",
+ type = "function"
+ },
+ seek = {
+ args = "(offset: number)",
+ description = "Sets the current playback position of the Video.",
+ returns = "()",
+ type = "function"
+ },
+ setFilter = {
+ args = "(min: FilterMode, mag: FilterMode, anisotropy: number)",
+ description = "Sets the scaling filters used when drawing the Video.",
+ returns = "()",
+ type = "function"
+ },
+ setSource = {
+ args = "(source: Source)",
+ description = "Sets the audio Source used for playing back the video's audio. The audio Source also controls playback speed and synchronization.",
+ returns = "()",
+ type = "function"
+ },
+ tell = {
+ args = "(seconds: number)",
+ description = "Gets the current playback position of the Video.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "A drawable video.",
+ type = "lib"
+ },
+ newVideoStream = {
+ args = "(filename: string)",
+ description = "Creates a new VideoStream. Currently only Ogg Theora video files are supported. VideoStreams can't draw videos, see love.graphics.newVideo for that.",
+ returns = "(videostream: VideoStream)",
+ type = "function"
+ }
+ },
+ description = "This module is responsible for decoding, controlling, and streaming video files.\n\nIt can't draw the videos, see love.graphics.newVideo and Video objects for that.",
+ type = "class"
+ },
+ visible = {
+ args = "(v: boolean)",
+ description = "Callback function triggered when window is minimized/hidden or unminimized by the user.",
+ returns = "()",
+ type = "function"
+ },
+ wheelmoved = {
+ args = "(x: number, y: number)",
+ description = "Callback function triggered when the mouse wheel is moved.",
+ returns = "()",
+ type = "function"
+ },
+ window = {
+ childs = {
+ FullscreenType = {
+ childs = {
+ desktop = {
+ description = "Sometimes known as borderless fullscreen windowed mode. A borderless screen-sized window is created which sits on top of all desktop UI elements. The window is automatically resized to match the dimensions of the desktop, and its size cannot be changed.",
+ type = "value"
+ },
+ exclusive = {
+ description = "Standard exclusive-fullscreen mode. Changes the display mode (actual resolution) of the monitor.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ fromPixels = {
+ args = "(pixelvalue: number)",
+ description = "Converts a number from pixels to density-independent units.\n\nThe pixel density inside the window might be greater (or smaller) than the \"size\" of the window. For example on a retina screen in Mac OS X with the highdpi window flag enabled, the window may take up the same physical size as an 800x600 window, but the area inside the window uses 1600x1200 pixels. love.window.fromPixels(1600) would return 800 in that case.\n\nThis function converts coordinates from pixels to the size users are expecting them to display at onscreen. love.window.toPixels does the opposite. The highdpi window flag must be enabled to use the full pixel density of a Retina screen on Mac OS X and iOS. The flag currently does nothing on Windows and Linux, and on Android it is effectively always enabled.\n\nMost LÖVE functions return values and expect arguments in terms of pixels rather than density-independent units.",
+ returns = "(value: number)",
+ type = "function"
+ },
+ getDisplayName = {
+ args = "(displayindex: number)",
+ description = "Gets the name of a display.",
+ returns = "(name: string)",
+ type = "function"
+ },
+ getFullscreen = {
+ args = "()",
+ description = "Gets whether the window is fullscreen.",
+ returns = "(fullscreen: boolean, fstype: FullscreenType)",
+ type = "function"
+ },
+ getFullscreenModes = {
+ args = "(display: number)",
+ description = "Gets a list of supported fullscreen modes.",
+ returns = "(modes: table)",
+ type = "function"
+ },
+ getIcon = {
+ args = "()",
+ description = "Gets the window icon.",
+ returns = "(imagedata: ImageData)",
+ type = "function"
+ },
+ getMode = {
+ args = "()",
+ description = "Returns the current display mode.",
+ returns = "(width: number, height: number, flags: table)",
+ type = "function"
+ },
+ getPixelScale = {
+ args = "()",
+ description = "Gets the DPI scale factor associated with the window.\n\nThe pixel density inside the window might be greater (or smaller) than the \"size\" of the window. For example on a retina screen in Mac OS X with the highdpi window flag enabled, the window may take up the same physical size as an 800x600 window, but the area inside the window uses 1600x1200 pixels. love.window.getPixelScale() would return 2.0 in that case.\n\nThe love.window.fromPixels and love.window.toPixels functions can also be used to convert between units.\n\nThe highdpi window flag must be enabled to use the full pixel density of a Retina screen on Mac OS X and iOS. The flag currently does nothing on Windows and Linux, and on Android it is effectively always enabled.",
+ returns = "(scale: number)",
+ type = "function"
+ },
+ getPosition = {
+ args = "()",
+ description = "Gets the position of the window on the screen.\n\nThe window position is in the coordinate space of the display it is currently in.",
+ returns = "(x: number, y: number, display: number)",
+ type = "function"
+ },
+ getTitle = {
+ args = "()",
+ description = "Gets the window title.",
+ returns = "(title: string)",
+ type = "function"
+ },
+ hasFocus = {
+ args = "()",
+ description = "Checks if the game window has keyboard focus.",
+ returns = "(focus: boolean)",
+ type = "function"
+ },
+ hasMouseFocus = {
+ args = "()",
+ description = "Checks if the game window has mouse focus.",
+ returns = "(focus: boolean)",
+ type = "function"
+ },
+ isCreated = {
+ args = "()",
+ description = "Checks if the window has been created.",
+ returns = "(created: boolean)",
+ type = "function"
+ },
+ isDisplaySleepEnabled = {
+ args = "()",
+ description = "Gets whether the display is allowed to sleep while the program is running.\n\nDisplay sleep is disabled by default. Some types of input (e.g. joystick button presses) might not prevent the display from sleeping, if display sleep is allowed.",
+ returns = "(enabled: boolean)",
+ type = "function"
+ },
+ isVisible = {
+ args = "()",
+ description = "Checks if the game window is visible.\n\nThe window is considered visible if it's not minimized and the program isn't hidden.",
+ returns = "(visible: boolean)",
+ type = "function"
+ },
+ maximize = {
+ args = "()",
+ description = "Makes the window as large as possible.\n\nThis function has no effect if the window isn't resizable, since it essentially programmatically presses the window's \"maximize\" button.",
+ returns = "()",
+ type = "function"
+ },
+ minimize = {
+ args = "()",
+ description = "Minimizes the window to the system's task bar / dock.",
+ returns = "()",
+ type = "function"
+ },
+ requestAttention = {
+ args = "(continuous: boolean)",
+ description = "Causes the window to request the attention of the user if it is not in the foreground.\n\nIn Windows the taskbar icon will flash, and in OS X the dock icon will bounce.",
+ returns = "()",
+ type = "function"
+ },
+ setDisplaySleepEnabled = {
+ args = "(enable: boolean)",
+ description = "Sets whether the display is allowed to sleep while the program is running.\n\nDisplay sleep is disabled by default. Some types of input (e.g. joystick button presses) might not prevent the display from sleeping, if display sleep is allowed.",
+ returns = "()",
+ type = "function"
+ },
+ setFullscreen = {
+ args = "(fullscreen: boolean)",
+ description = "Enters or exits fullscreen. The display to use when entering fullscreen is chosen based on which display the window is currently in, if multiple monitors are connected.\n\nIf fullscreen mode is entered and the window size doesn't match one of the monitor's display modes (in normal fullscreen mode) or the window size doesn't match the desktop size (in 'desktop' fullscreen mode), the window will be resized appropriately. The window will revert back to its original size again when fullscreen mode is exited using this function.",
+ returns = "(success: boolean)",
+ type = "function"
+ },
+ setIcon = {
+ args = "(imagedata: ImageData)",
+ description = "Sets the window icon until the game is quit. Not all operating systems support very large icon images.",
+ returns = "(success: boolean)",
+ type = "function"
+ },
+ setMode = {
+ args = "(width: number, height: number, flags: table)",
+ description = "Sets the display mode and properties of the window.\n\nIf width or height is 0, setMode will use the width and height of the desktop.\n\nChanging the display mode may have side effects: for example, canvases will be cleared and values sent to shaders with Shader:send will be erased. Make sure to save the contents of canvases beforehand or re-draw to them afterward if you need to.",
+ returns = "(success: boolean)",
+ type = "function"
+ },
+ setPosition = {
+ args = "(x: number, y: number, display: number)",
+ description = "Sets the position of the window on the screen.\n\nThe window position is in the coordinate space of the specified display.",
+ returns = "()",
+ type = "function"
+ },
+ setTitle = {
+ args = "(title: string)",
+ description = "Sets the window title.",
+ returns = "()",
+ type = "function"
+ },
+ showMessageBox = {
+ args = "(title: string, message: string, type: MessageBoxType, attachtowindow: boolean)",
+ description = "Displays a message box dialog above the love window. The message box contains a title, optional text, and buttons.",
+ returns = "(success: boolean)",
+ type = "function"
+ },
+ toPixels = {
+ args = "(value: number)",
+ description = "Converts a number from density-independent units to pixels.\n\nThe pixel density inside the window might be greater (or smaller) than the \"size\" of the window. For example on a retina screen in Mac OS X with the highdpi window flag enabled, the window may take up the same physical size as an 800x600 window, but the area inside the window uses 1600x1200 pixels. love.window.toPixels(800) would return 1600 in that case.\n\nThis is used to convert coordinates from the size users are expecting them to display at onscreen to pixels. love.window.fromPixels does the opposite. The highdpi window flag must be enabled to use the full pixel density of a Retina screen on Mac OS X and iOS. The flag currently does nothing on Windows and Linux, and on Android it is effectively always enabled.\n\nMost LÖVE functions return values and expect arguments in terms of pixels rather than density-independent units.",
+ returns = "(pixelvalue: number)",
+ type = "function"
+ }
+ },
+ description = "Provides an interface for modifying and retrieving information about the program's window.",
+ type = "lib"
+ }
+ },
+ description = "Love2d modules, functions, and callbacks.",
+ type = "lib"
+}
+
+do return {love = love} end
+
+-- the following code is used to convert love_api.lua to a proper format
+love = dofile('love_api.lua')
+
+-- conversion script
+local function convert(l)
+ local function merge(...) -- merges tables into one table
+ local r = {}
+ for _,v in pairs({...}) do
+ for _,e in pairs(v) do table.insert(r, e) end
+ end
+ return r
+ end
+ local function params(t) -- merges parameters and return results
+ if not t then return end
+ local r = {}
+ for _,v in ipairs(t) do
+ table.insert(r, v.name .. ': ' .. v.type)
+ end
+ return '(' .. table.concat(r, ", ") .. ')'
+ end
+
+ if l.modules then
+ l.description = 'Love2d modules, functions, and callbacks.'
+ l.type = "lib"
+ l.childs = merge(l.modules, l.functions or {}, l.callbacks or {})
+ l.types = nil -- don't need types
+ l.callbacks = nil
+ l.functions = nil
+ l.modules = nil
+ end
+
+ if not l.childs then return end
+
+ for n,v in ipairs(l.childs) do
+ if v.functions and #v.functions > 1 and #v.functions[1] == 0 then
+ io.stderr:write("Alternative signature ignored for "..v.name..".\n")
+ table.remove(v.functions, 1)
+ end
+ v.childs = merge(v.types, v.functions, v.constants, v.enums)
+ if v.name then
+ l.childs[v.name] = v
+ v.name = nil
+ end
+ if #v.childs > 0 and v.childs[1] then
+ if v.childs[1].returns then v.returns = params(v.childs[1].returns) end
+ if v.childs[1].arguments then v.args = params(v.childs[1].arguments) end
+ end
+ -- some nodes have first chils as empty and the data is in the second one (Mouse.setCursor)
+ if v.variants and #v.variants > 0 then
+ v.returns = params(v.variants[1] and v.variants[1].returns or v.variants[2] and v.variants[2].returns)
+ end
+ if v.variants and #v.variants > 0 then
+ v.args = params(v.variants[1] and v.variants[1].arguments or v.variants[2] and v.variants[2].arguments)
+ end
+ local nochildren = #v.childs == 0 or v.returns or v.args
+ v.type = nochildren and ((v.returns or v.args or v.variants) and "function" or "value")
+ or v.types and "class"
+ or v.constants and "class"
+ or v.functions and "lib"
+ or "function"
+ if v.constants then v.description = "class constants" end
+ v.variants = nil
+ v.types = nil
+ v.functions = nil
+ v.constants = nil
+ v.enums = nil
+ v.supertypes = nil
+ v.constructors = nil
+ if nochildren then v.childs = nil end
+ if v.type == "function" then
+ v.args = v.args or '()'
+ v.returns = v.returns or '()'
+ end
+ l.childs[n] = nil
+ convert(v)
+ end
+ return l
+end
+
+package.path = package.path .. ';../../lualibs/?/?.lua;../../lualibs/?.lua'
+package.cpath = package.cpath .. ';../../bin/clibs/?.dll'
+print((require 'mobdebug').line(convert(love), {indent = ' ', comment = false}))
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/api/lua/luajit2.lua b/love2dToAPK/tools/tools/zbstudio-old-win/api/lua/luajit2.lua
new file mode 100644
index 0000000..07d9074
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/api/lua/luajit2.lua
@@ -0,0 +1,52 @@
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+-- function helpers
+
+local function fn (description)
+ local description2,returns,args = description:match("(.+)%-%s*(%b())%s*(%b())")
+ if not description2 then
+ return {type="function",description=description,
+ returns="(?)"}
+ end
+ returns = returns:gsub("^%s+",""):gsub("%s+$","")
+ local ret = returns:sub(2,-2)
+ local vt = ret:match("^%[?string") and "string"
+ vt = vt or ret:match("^%[?table") and "table"
+ vt = vt or ret:match("^%[?file") and "io"
+ return {type="function",description=description2,
+ returns=returns, args = args, valuetype = vt}
+end
+
+local function val (description)
+ return {type="value",description = description}
+end
+
+---------------------------
+
+local api = {
+ffi = {
+ description = "FFI",
+ type = "lib",
+ childs = {
+ cdef = fn "Adds multiple C declarations for types or external symbols - ()(string)",
+ load = fn "This loads the dynamic library given by name and returns a new C library namespace which binds to its symbols. On POSIX systems, if global is true, the library symbols are loaded into the global namespace, too. - (userdata)(string,[global])",
+ new = fn "The following API functions create cdata objects (type() returns 'cdata'). All created cdata objects are garbage collected. - (cdata)(string/ctype,nelement,init...)",
+ typeof = fn "Creates a ctype object for the given ct. - (ctype)(ct)",
+ cast = fn "Creates a scalar cdata object for the given ct. The cdata object is initialized with init according to C casting rules. - (cdata)(ctype,cdata init)",
+ metatype = fn "Creates a ctype object for the given ct and associates it with a metatable. Only struct/union types, complex numbers and vectors are allowed. Other types may be wrapped in a struct, if needed. - (cdata)(ct,table meta)",
+ gc = fn "Associates a finalizer with a pointer or aggregate cdata object. The cdata object is returned unchanged. - (cdata)(ct,function finalizer)",
+ sizeof = fn "Returns the size of ct in bytes. Returns nil if the size is not known. - (number)(ct,[nelem])",
+ alignof = fn "Returns the minimum required alignment for ct in bytes. - (number)(ct)",
+ offsetof = fn "Returns the offset (in bytes) of field relative to the start of ct, which must be a struct. Additionally returns the position and the field size (in bits) for bit fields. - (number)(ct, field)",
+ istype = fn "Returns true if obj has the C type given by ct. Returns false otherwise. - (boolean)(ct,obj)",
+ string = fn "Creates an interned Lua string from the data pointed to by ptr. If the optional argument len is missing, ptr is converted to a 'char *' and the data is assumed to be zero-terminated. The length of the string is computed with strlen(). - (string)(ptr, [number len])",
+ copy = fn "Copies the data pointed to by src to dst. dst is converted to a 'void *' and src is converted to a 'const void *'. - ()(dst,[src,len] / [string])",
+ fill = fn "Fills the data pointed to by dst with len constant bytes, given by c. If c is omitted, the data is zero-filled. - ()(dst, len, [c])",
+ abi = fn "Returns true if param (a Lua string) applies for the target ABI (Application Binary Interface). Returns false otherwise. 32bit 64bit lq be fpu softfp hardfp eabi win. - (boolean)(string)",
+ os = val "string value of OS",
+ }
+},
+}
+
+return api \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/api/lua/wxwidgets.lua b/love2dToAPK/tools/tools/zbstudio-old-win/api/lua/wxwidgets.lua
new file mode 100644
index 0000000..6882928
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/api/lua/wxwidgets.lua
@@ -0,0 +1,24 @@
+local function populateAPI(t)
+ local api = {}
+ for k,v in pairs(t) do
+ api[k] = {
+ type = (type(v) == "function" and "function" or "value"),
+ description = "",
+ returns = "",
+ }
+ end
+ return api
+end
+
+return {
+ wx = {
+ type = "lib",
+ description = "wx lib",
+ childs = populateAPI(wx),
+ },
+ wxstc = {
+ type = "lib",
+ description = "wxSTC lib",
+ childs = populateAPI(wxstc),
+ },
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/api/opencl/std.lua b/love2dToAPK/tools/tools/zbstudio-old-win/api/opencl/std.lua
new file mode 100644
index 0000000..675d945
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/api/opencl/std.lua
@@ -0,0 +1,278 @@
+local funcstring =
+[[
+get_work_dim() Returns the number of dimensions in use
+get_global_size(uint dimindx) Returns the number of global work-items specified for dimension identified by dimindx
+get_global_id(uint dimindx) Returns the unique global work-item ID value for dimension identified by dimindx
+get_local_size(uint dimindx) Returns the number of local work-items specified in dimension identified by dimindx
+get_local_id(uint dimindx) Returns the unique local work-item ID i.e. a work-item within a specific work-group for dimension identified by dimindx.
+get_num_groups(uint dimindx) Returns the number of work-groups that will execute a kernel for dimension identified by dimindx
+get_group_id(uint dimindx) Returns the work-group ID
+acos(gentype) Arc cosine function
+acosh(gentype) Inverse hyperbolic cosine
+acospi(gentype) Compute acos (x) / PI
+asin(gentype) Arc sine function
+asinh(gentype) Inverse hyperbolic sine
+asinpi(gentype x) Compute asin (x) / PI
+atan(gentype y_over_x) Arc tangent function
+atan2(gentype y, gentype x) Arc tangent of y / x
+atanh(gentype) Hyperbolic arc tangent.
+atanpi(gentype x) Compute atan (x) / PI
+atan2pi(gentype y, gentype x) Compute atan2 (y, x) / PI
+cbrt(gentype) Compute cube-root
+ceil(gentype) Round to integral value using the round to +ve infinity rounding mode
+copysign(gentype x, gentype y) Returns x with its sign changed to match the sign of y
+cos(gentype) Compute cosine
+cosh(gentype) Compute hyperbolic consine
+cospi(gentype x) Compute cos (PI*x)
+erfc(gentype) Complementary error function
+erf(gentype) Error function encountered in integrating the normal distribution
+exp(gentype x) Compute the base- e exponential of x
+exp2(gentype) Exponential base 2 function
+exp10(gentype) Exponential base 10 function
+expm1(gentype x) Compute e^x - 1.0
+fabs(gentype) Compute absolute value of a floating-point number
+fdim(gentype x, gentype y) x - y if x > y, +0 if x is less than or equal to y
+floor(gentype) Round to integral value using the round to –ve infinity rounding mode
+fma(gentype a, gentype b, gentype c) Returns the correctly rounded floating-point representation of the sum of c with the infinitely precise product of a and b
+fmax(gentype x, gentype y) Returns y if x < y, otherwise it returns x
+fmin(gentype x, gentype y) Returns y if y < x, otherwise it returns x
+fmod(gentype x, gentype y) Modulus. Returns x – y * trunc (x/y)
+fract(gentype x, gentype *iptr) Returns fmin( x – floor (x), 0x1.fffffep-1f ).
+frexp(gentype x, intn *exp) Extract mantissa and exponent from x
+hypot(gentype x, gentype y) Compute the value of the square root of x2+y2
+ilogb(gentype x) Return the exponent as an integer value
+ldexp(gentype x, intn n) Multiply x by 2 to the power n
+lgamma(gentype x) Returns the natural logarithm of the absolute value of the gamma function
+lgamma_r(gentype x, intn *signp) Returns the natural logarithm of the absolute value of the gamma function
+log(gentype) Compute natural logarithm
+log2(gentype) Compute a base 2 logarithm
+log10(gentype) Compute a base 10 logarithm
+log1p(gentype x) Compute loge(1.0 + x)
+logb(gentype x) Compute the exponent of x, which is the integral part of logr|x|
+mad(gentype a, gentype b, gentype c) Approximates a * b + c.
+modf(gentype x, gentype *iptr) Decompose a floating-point number
+nan(uintn nancode) Returns a quiet NaN
+nextafter(gentype x, gentype y) Computes the next representable single-precision floating-point value following x in the direction of y.
+pow(gentype x, gentype y) Compute x to the power y
+pown(gentype x, intn y) Compute x to the power y, where y is an integer
+powr(gentype x, gentype y) Compute x to the power y, where x is >= 0
+remainder(gentype x, gentype y) r = x - n*y, where n is the integer nearest the exact value of x/y
+remquo(gentype x, gentype y, intn *quo) r = x - n*y, where n is the integer nearest the exact value of x/y
+rint(gentype) Round to integral value (using round to nearest even rounding mode)
+rootn(gentype x, intn y) Compute x to the power 1/y
+round(gentype x) Return the integral value nearest to x rounding halfway cases away from zero
+rsqrt(gentype) Compute inverse square root
+sin(gentype) Compute sine
+sincos(gentype x, gentype *cosval) Compute sine and cosine of x
+sinh(gentype) Compute hyperbolic sine.
+sinpi(gentype x) Compute sin (PI*x)
+sqrt(gentype) Compute square root
+tan(gentype) Compute tangent
+tanh(gentype) Compute hyperbolic tangent
+tanpi(gentype x) Compute tan (PI*x)
+tgamma(gentype) Compute the gamma function
+trunc(gentype) Round to integral value using the round to zero
+abs(gentype x) Returns |x|
+abs_diff(gentype x, gentype y) Returns |x – y| without modulo overflow
+add_sat(gentype x, gentype y) Returns x + y and saturates the result
+hadd(gentype x, gentype y) Returns (x + y) >> 1
+rhadd(gentype x, gentype y) Returns (x + y + 1) >> 1
+clz(gentype x) Returns the number of leading 0-bits in x, starting at the most significant bit position.
+mad_hi(gentype a, gentype b, gentype c) Returns mul_hi(a, b) + c
+mad_sat(gentype a, gentype b, gentype c) Returns a * b + c and saturates the result
+max(gentype x, gentype y) Returns y if x < y, otherwise it returns x
+min(gentype x, gentype y) Returns y if y < x, otherwise it returns x
+mul_hi(gentype x, gentype y) Computes x * y and returns the high half of the product of x and y
+rotate(gentype v, gentype i)
+sub_sat(gentype x, gentype y) Returns x - y and saturates the result
+upsample(charn hi, ucharn lo) result[i] = ((short)hi[i] << 8) | lo[i]
+mad24(gentype x, gentype y, gentype z)
+mul24(gentype x, gentype y)
+clamp(gentype x, gentype minval, gentype maxval) Returns fmin(fmax(x, minval), maxval)
+degrees(gentype radians) Converts radians to degrees
+max(gentype x, gentype y)
+min(gentype x, gentype y)
+mix(gentype x, gentype y, gentype a) Returns the linear blend of x&y: x + (y – x) * a
+radians(gentype degrees) Converts degrees to radians
+step(gentype edge, gentype x) Returns 0.0 if x < edge, otherwise it returns 1.0
+smoothstep(genType edge0, genType edge1, genType x)
+sign(gentype x)
+cross(float4 p0, float4 p1) Returns the cross product of p0.xyz and p1.xyz.
+dot(gentype p0, gentype p1) Compute dot product
+distance(gentype p0, gentype p1) Returns the distance between p0 and p1
+length(gentype p) Return the length of vecto
+normalize(gentype p) Returns a vector in the same direction as p but with length of 1.
+fast_distance(gentype p0, gentype p1) Returns fast_length(p0 – p1).
+fast_length(gentype p) Returns the length of vector
+fast_normalize(gentype p) Returns a vector in the same direction as p but with length of 1.
+read_imagef(image2d_t image, sampler_t sampler, int2 coord)
+read_imagei(image2d_t image, sampler_t sampler, int2 coord)
+read_imageui(image2d_t image, sampler_t sampler, int2 coord)
+write_imagef(image2d_t image, int2 coord, float4 color)
+write_imagei(image2d_t image, int2 coord, int4 color)
+write_imageui(image2d_t image, int2 coord, unsigned int4 color)
+get_image_width(image2d_t image)
+get_image_width(image3d_t image)
+get_image_height(image2d_t image)
+get_image_height(image3d_t image)
+get_image_channel_data_type(image2d_t image)
+get_image_channel_data_type(image3d_t image)
+get_image_channel_order(image2d_t image)
+get_image_channel_order(image3d_t image)
+get_image_dim(image2d_t image)
+get_image_dim(image3d_t image)
+barrier(cl_mem_fence_flags flags) All work-items in a work-group executing the kernel must execute this function before any are allowed to continue execution beyond the barrier.
+mem_fence(cl_mem_fence_flags flags) Orders loads and stores of a work-item executing a kernel.
+read_mem_fence(cl_mem_fence_flags flags) Read memory barrier that orders only loads.
+write_mem_fence(cl_mem_fence_flags flags) Write memory barrier that orders only stores.
+async_work_group_copy(gentype *dst, const gentype *src, size_t num_elements, event_t event) Perform an async copy of num_elements gentype elements from src to dst.
+wait_group_events(int num_events, event_t *event_list) Wait for events that identify the async_work_group_copy operations to complete.
+prefetch(const __global gentype *p, size_t num_elements) Prefetch num_elements * sizeof(gentype) bytes into the global cache.
+vload2(size_t offset, const type *p) Read vector data from memory
+vload4(size_t offset, const type *p) Read vector data from memory
+vload8(size_t offset, const type *p) Read vector data from memory
+vload16(size_t offset, const type *p) Read vector data from memory
+vstore2(type2 data, size_t offset, type *p) Write vector data to memory
+vstore4(type4 data, size_t offset, type *p) Write vector data to memory
+vstore8(type8 data, size_t offset, type *p) Write vector data to memory
+vstore16(type16 data, size_t offset, type *p) Write vector data to memory
+]]
+
+local function fn (description)
+ local description2,returns,args = description:match("(.+)%-%s*(%b())%s*(%b())")
+ if not description2 then
+ return {type="function",description=description,
+ returns="(?)"}
+ end
+ return {type="function",description=description2,
+ returns=returns:gsub("^%s+",""):gsub("%s+$",""), args = args}
+end
+
+local function val (description)
+ return {type="value",description = description}
+end
+-- docs
+local api = {
+}
+
+
+local convtypes = [[bool char uchar short ushort int uint long ulong float double]]
+local convout = {}
+for i in convtypes:gmatch("([%w_]+)") do
+ local suffix = {"","_rte","_rtz","_rtp","_rtn"}
+ for k,t in ipairs(suffix) do
+ table.insert(convout,"convert_"..i..t)
+ table.insert(convout,"convert_"..i.."_sat"..t)
+ local vectors = {2,4,8,16}
+ for n,v in ipairs(vectors) do
+ table.insert(convout,"convert_"..i..v..t)
+ table.insert(convout,"convert_"..i..v.."_sat"..t)
+ end
+ end
+end
+convout = table.concat(convout, " ")
+
+local astypes = [[int uint uchar ushort float double size_t ptrdiff_t intptr_t uintptr_t
+ long ulong char short unsigned
+ float2 float4 float8 float16
+ double2 double4 double8 double16
+ char2 char4 char8 char16
+ uchar2 uchar4 uchar8 uchar16
+ short2 short4 short8 short16
+ ushort2 ushort4 ushort8 ushort16
+ int2 int4 int8 int16
+ uint2 uint4 uint8 uint16
+ long2 long4 long8 long16
+ ulong2 ulong4 ulong8 ulong16]]
+
+local astypeout = {}
+for i in astypes:gmatch("([%w_]+)") do
+ table.insert(astypeout, "as_"..i)
+end
+astypeout = table.concat(astypeout, " ")
+
+local keyw = astypeout.." "..convout.." "..[[
+ int uint uchar ushort half float bool double size_t ptrdiff_t intptr_t uintptr_t void
+ long ulong char short unsigned
+ half2 half4 half8 half16
+ float2 float4 float8 float16
+ double2 double4 double8 double16
+ char2 char4 char8 char16
+ uchar2 uchar4 uchar8 uchar16
+ short2 short4 short8 short16
+ ushort2 ushort4 ushort8 ushort16
+ int2 int4 int8 int16
+ uint2 uint4 uint8 uint16
+ long2 long4 long8 long16
+ ulong2 ulong4 ulong8 ulong16
+ image2d_t image3d_t sampler_t event_t cl_image_format
+
+ struct typedef void const
+ return switch case for do while if else break continue volatile
+ CLK_A CLK_R CLK_RG CLK_RGB CLK_RGBA CLK_ARGB CLK_BGRA CLK_INTENSITY CLK_LUMINANCE
+
+ MAXFLOAT HUGE_VALF INFINITY NAN
+ CLK_LOCAL_MEM_FENCE CLK_GLOBAL_MEM_FENCE
+ CLK_SNORM_INT8
+ CLK_SNORM_INT16
+ CLK_UNORM_INT8
+ CLK_UNORM_INT16
+ CLK_UNORM_SHORT_565
+ CLK_UNORM_SHORT_555
+ CLK_UNORM_SHORT_101010
+ CLK_SIGNED_INT8
+ CLK_SIGNED_INT16
+ CLK_SIGNED_INT32
+ CLK_UNSIGNED_INT8
+ CLK_UNSIGNED_INT16
+ CLK_UNSIGNED_INT32
+ CLK_HALF_FLOAT
+ CLK_FLOAT
+ __FILE__ __LINE__ __OPENCL_VERSION__ __ENDIAN_LITTLE__
+ __ROUNDING_MODE__ __IMAGE_SUPPORT__ __FAST_RELAXED_MATH__
+
+ __kernel kernel __attribute__ __read_only __write_only read_only write_only
+ __constant constant __local local __global global __private private
+ vec_type_hint work_group_size_hint reqd_work_group_size
+ aligned packed endian host device
+
+ async_work_group_copy wait_group_events prefetch
+ clamp min max degrees radians sign smoothstep step mix
+ mem_fence read_mem_fence write_mem_fence
+ cross prod distance dot length normalize fast_distance fast_length fast_normalize
+ read_image write_image get_image_width get_image_height get_image_depth
+ get_image_channel_data_type get_image_channel_order
+ get_image_dim
+ abs abs_diff add_sat clz hadd mad24 mad_hi mad_sat
+ mul24 mul_hi rhadd rotate sub_sat upsample
+ read_imagei write_imagei read_imageui write_imageui
+ read_imagef write_imagef
+
+ isequal isnotequal isgreater isgreaterequal isless islessequal islessgreater
+ isfinite isinf isnan isnormal isordered isunordered signbit any all bitselect select
+
+ acos acosh acospi asin asinh asinpi atan atan2 atanh atanpi atan2pi
+ cbrt ceil copysign cos half_cos native_cos cosh cospi half_divide native_divide
+ erf erfc exp half_exp native_exp exp2 half_exp2 native_exp2 exp10 half_exp10 native_exp10
+ expm1 fabs fdim floor fma fmax fmin fmod fract frexp hypot ilogb
+ ldexp lgamma lgamma_r log half_log native_log log2 half_log2 native_log2
+ log10 half_log10 native_log10 log1p logb mad modf nan nextafter
+ pow pown powr half_powr native_powr half_recip native_recip
+ remainder remquo rint round rootn rsqrt half_rsqrt native_rsqrt
+ sin half_sin native_sin sincos sinh sinpi sqrt half_sqrt native_sqrt
+ tan half_tan native_tan tanh tanpi tgamma trunc
+
+ barrier
+ vload2 vload4 vload8 vload16
+ vload_half vload_half2 vload_half4 vload_half8 vload_half16 vloada_half4 vloada_half8 vloada_half16
+ vstore2 vstore4 vstore8 vstore16
+ vstore_half vstore_half2 vstore_half4 vstore_half8 vstore_half16 vstorea_half4 vstorea_half8 vstorea_half16
+ get_global_id get_global_size get_group_id get_local_id get_local_size get_num_groups get_work_dim
+]]
+
+-- keywords - shouldn't be left out
+for w in keyw:gmatch("([a-zA-Z_0-9]+)") do
+ api[w] = {type="keyword"}
+end
+
+return api \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/cfg/estrela.lua b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/estrela.lua
new file mode 100644
index 0000000..102e1a8
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/estrela.lua
@@ -0,0 +1,19 @@
+-- If you have used Estrela for graphics shader authoring or luxinia,
+-- create/modify the `user.lua` file in the current folder
+-- and add `include "estrela"` (1.21+) to load all tools and specifications by default again.
+
+-- load all tools, specs, and interpreters
+local all = function() return true end
+load.tools(all)
+load.specs(all)
+load.interpreters(all)
+
+-- this flag means that toggling between projects, will not affect the
+-- list of opened files (old estrela default).
+projectautoopen = false
+
+-- default search paths for luxinia
+local luxpath = os.getenv("LUXINIA")
+path.luxinia = luxpath and luxpath.."/" or "../luxinia/engine/"
+local luxpath2 = os.getenv("LUXINIA2")
+path.luxinia2 = luxpath2 and luxpath2.."/" or "../luxinia2/runtime/bin_Windows_x86/"
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/cn.lua b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/cn.lua
new file mode 100644
index 0000000..0e78d46
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/cn.lua
@@ -0,0 +1,344 @@
+return {
+ ["%s event failed: %s"] = nil, -- src\editor\package.lua
+ ["%s%% formatted..."] = nil, -- src\editor\print.lua
+ ["%s%% loaded..."] = nil, -- src\editor\commands.lua
+ ["&About"] = "关于(&A)", -- src\editor\menu_help.lua
+ ["&Add Watch"] = "添加监视(&A)", -- src\editor\debugger.lua
+ ["&Break"] = "中断", -- src\editor\menu_project.lua
+ ["&Close Page"] = "关闭页面", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Community"] = nil, -- src\editor\menu_help.lua
+ ["&Compile"] = "编译", -- src\editor\menu_project.lua
+ ["&Copy Value"] = nil, -- src\editor\debugger.lua
+ ["&Copy"] = "复制", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Default Layout"] = "布局", -- src\editor\menu_view.lua
+ ["&Delete Watch"] = "删除监视", -- src\editor\debugger.lua
+ ["&Delete"] = nil, -- src\editor\filetree.lua
+ ["&Documentation"] = nil, -- src\editor\menu_help.lua
+ ["&Edit Project Directory"] = nil, -- src\editor\filetree.lua
+ ["&Edit Value"] = nil, -- src\editor\debugger.lua
+ ["&Edit Watch"] = "编辑监视", -- src\editor\debugger.lua
+ ["&Edit"] = "编辑", -- src\editor\menu_edit.lua
+ ["&File"] = "文件", -- src\editor\menu_file.lua
+ ["&Find"] = "查找", -- src\editor\menu_search.lua
+ ["&Fold/Unfold All"] = "全 折叠/展开", -- src\editor\menu_edit.lua
+ ["&Frequently Asked Questions"] = nil, -- src\editor\menu_help.lua
+ ["&Getting Started Guide"] = nil, -- src\editor\menu_help.lua
+ ["&Help"] = "帮助", -- src\editor\menu_help.lua
+ ["&New Directory"] = nil, -- src\editor\filetree.lua
+ ["&New"] = "新建", -- src\editor\menu_file.lua
+ ["&Open..."] = "打开...", -- src\editor\menu_file.lua
+ ["&Output/Console Window"] = "输出/主控台视窗", -- src\editor\menu_view.lua
+ ["&Paste"] = "粘贴", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Print..."] = nil, -- src\editor\print.lua
+ ["&Project Page"] = nil, -- src\editor\menu_help.lua
+ ["&Project"] = "项目", -- src\editor\menu_project.lua
+ ["&Redo"] = "重做", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Rename"] = nil, -- src\editor\filetree.lua
+ ["&Replace"] = "替换", -- src\editor\menu_search.lua
+ ["&Run"] = "执行", -- src\editor\menu_project.lua
+ ["&Save"] = "保存", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Search"] = "搜索", -- src\editor\menu_search.lua
+ ["&Select Command"] = nil, -- src\editor\gui.lua
+ ["&Sort"] = "分类", -- src\editor\menu_edit.lua
+ ["&Stack Window"] = "叠视窗/堆栈视窗", -- src\editor\menu_view.lua
+ ["&Start Debugger Server"] = "开启除错器伺服机", -- src\editor\menu_project.lua
+ ["&Status Bar"] = nil, -- src\editor\menu_view.lua
+ ["&Tool Bar"] = nil, -- src\editor\menu_view.lua
+ ["&Tutorials"] = nil, -- src\editor\menu_help.lua
+ ["&Undo"] = "撤消", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&View"] = "视图", -- src\editor\menu_view.lua
+ ["&Watch Window"] = "监视视窗", -- src\editor\menu_view.lua
+ ["About %s"] = "关于 %s", -- src\editor\menu_help.lua
+ ["Add To Scratchpad"] = nil, -- src\editor\editor.lua
+ ["Add Watch Expression"] = "添加监视表达式", -- src\editor\editor.lua
+ ["All files"] = "全部文件", -- src\editor\commands.lua
+ ["Allow external process to start debugging"] = "允许外部进程开启除错", -- src\editor\menu_project.lua
+ ["Analyze the source code"] = "分析源代码", -- src\editor\inspect.lua
+ ["Analyze"] = "分析", -- src\editor\inspect.lua
+ ["Auto Complete Identifiers"] = "自动补全标识符", -- src\editor\menu_edit.lua
+ ["Auto complete while typing"] = "当输入时自动补全", -- src\editor\menu_edit.lua
+ ["Binary file is shown as read-only as it is only partially loaded."] = nil, -- src\editor\commands.lua
+ ["Bookmark"] = nil, -- src\editor\menu_edit.lua
+ ["Break execution at the next executed line of code"] = "执行下一语句之后中断执行", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Breakpoint"] = nil, -- src\editor\menu_project.lua
+ ["C&lear Console Window"] = nil, -- src\editor\gui.lua
+ ["C&lear Output Window"] = "清除输出视窗", -- src\editor\gui.lua, src\editor\menu_project.lua
+ ["C&omment/Uncomment"] = "注释/消除注释", -- src\editor\menu_edit.lua
+ ["Can't evaluate the expression while the application is running."] = nil, -- src\editor\debugger.lua
+ ["Can't open file '%s': %s"] = nil, -- src\editor\findreplace.lua, src\editor\singleinstance.lua, src\editor\inspect.lua, src\editor\outline.lua
+ ["Can't process auto-recovery record; invalid format: %s."] = "不能处理自动恢复存档: %s", -- src\editor\commands.lua
+ ["Can't replace in read-only text."] = nil, -- src\editor\findreplace.lua
+ ["Can't run the entry point script ('%s')."] = "不能执行entry point脚本 ('%s')", -- src\editor\debugger.lua
+ ["Can't start debugger server at %s:%d: %s."] = nil, -- src\editor\debugger.lua
+ ["Can't start debugging for '%s'."] = nil, -- src\editor\debugger.lua
+ ["Can't start debugging session due to internal error '%s'."] = "除错动作失败 '%s'.", -- src\editor\debugger.lua
+ ["Can't start debugging without an opened file or with the current file not being saved ('%s')."] = "不能启动除错,没有文档被开启或当前更改过的文档还没保存('%s')", -- src\editor\debugger.lua
+ ["Can't stop debugger server as it is not started."] = nil, -- src\editor\debugger.lua
+ ["Cancelled by the user."] = nil, -- src\editor\findreplace.lua
+ ["Choose a directory to map"] = nil, -- src\editor\filetree.lua
+ ["Choose a project directory"] = "选择项目文件夹", -- src\editor\toolbar.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Choose a search directory"] = nil, -- src\editor\findreplace.lua
+ ["Choose..."] = "请选...", -- src\editor\findreplace.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Clear Items"] = nil, -- src\editor\findreplace.lua, src\editor\menu_file.lua
+ ["Clear items from this list"] = nil, -- src\editor\menu_file.lua
+ ["Clear the output window before compiling or debugging"] = "编译或除错前清除输出视窗", -- src\editor\menu_project.lua
+ ["Close &Other Pages"] = "关闭其他页面", -- src\editor\gui.lua
+ ["Close A&ll Pages"] = "关闭全部页面", -- src\editor\gui.lua
+ ["Close the current editor window"] = "关闭当前编译视窗", -- src\editor\menu_file.lua
+ ["Co&ntinue"] = "继续", -- src\editor\menu_project.lua
+ ["Col: %d"] = "列: %d", -- src\editor\editor.lua
+ ["Command Line Parameters..."] = nil, -- src\editor\menu_project.lua
+ ["Command line parameters"] = nil, -- src\editor\menu_project.lua
+ ["Comment or uncomment current or selected lines"] = "注释/消除注释 当前或被选的语句", -- src\editor\menu_edit.lua
+ ["Compilation error"] = "编译错误", -- src\editor\commands.lua, src\editor\debugger.lua
+ ["Compilation successful; %.0f%% success rate (%d/%d)."] = "编译成功; 成功率: %.0f%% (%d/%d).", -- src\editor\commands.lua
+ ["Compile the current file"] = "编译当前的文档", -- src\editor\menu_project.lua
+ ["Complete &Identifier"] = "补全标识符", -- src\editor\menu_edit.lua
+ ["Complete the current identifier"] = "补全当前标识符", -- src\editor\menu_edit.lua
+ ["Consider removing backslash from escape sequence '%s'."] = nil, -- src\editor\commands.lua
+ ["Copy Full Path"] = nil, -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Copy selected text to clipboard"] = "复制被选的text到clipboard", -- src\editor\menu_edit.lua
+ ["Correct &Indentation"] = nil, -- src\editor\menu_edit.lua
+ ["Couldn't activate file '%s' for debugging; continuing without it."] = "不能激活 '%s' 以除错; 省略后继续进行", -- src\editor\debugger.lua
+ ["Create an empty document"] = "新建空文档", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Cu&t"] = "剪切", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Cut selected text to clipboard"] = "剪切被选的text到clipboard", -- src\editor\menu_edit.lua
+ ["Debugger server started at %s:%d."] = "除错伺服器起始于 %s:%d.", -- src\editor\debugger.lua
+ ["Debugger server stopped at %s:%d."] = nil, -- src\editor\debugger.lua
+ ["Debugging session completed (%s)."] = "除错会话完成 (%s)", -- src\editor\debugger.lua
+ ["Debugging session started in '%s'."] = "除错会话于 '%s' 起始", -- src\editor\debugger.lua
+ ["Debugging suspended at '%s:%s' (couldn't activate the file)."] = "除错挂起于 '%s:%s' (不能激活文档).", -- src\editor\debugger.lua
+ ["Detach &Process"] = nil, -- src\editor\menu_project.lua
+ ["Disable Indexing For '%s'"] = nil, -- src\editor\outline.lua
+ ["Do you want to delete '%s'?"] = nil, -- src\editor\filetree.lua
+ ["Do you want to overwrite it?"] = nil, -- src\editor\commands.lua
+ ["Do you want to reload it?"] = "需要重新导入吗?", -- src\editor\editor.lua
+ ["Do you want to save the changes to '%s'?"] = "需要把更改保存于 '%s'?", -- src\editor\commands.lua
+ ["E&xit"] = "离开", -- src\editor\menu_file.lua
+ ["Enable Indexing"] = nil, -- src\editor\outline.lua
+ ["Enter Lua code and press Enter to run it."] = "输入Lua代码然后按 <Enter> 以执行", -- src\editor\shellbox.lua
+ ["Enter command line parameters (use Cancel to clear)"] = nil, -- src\editor\menu_project.lua
+ ["Enter replacement text"] = nil, -- src\editor\editor.lua
+ ["Error while loading API file: %s"] = "导入API档时出错误: %s", -- src\editor\autocomplete.lua
+ ["Error while loading configuration file: %s"] = "导入configuration档时出错误: %s", -- src\editor\style.lua
+ ["Error while processing API file: %s"] = "处理API档时出错误: %s", -- src\editor\autocomplete.lua
+ ["Error while processing configuration file: %s"] = "处理configuration档时出错误: %s", -- src\editor\style.lua
+ ["Error"] = "错误", -- src\editor\commands.lua
+ ["Evaluate In Console"] = nil, -- src\editor\editor.lua
+ ["Execute the current project/file and keep updating the code to see immediate results"] = "执行当前项目/文档和更新代码以便得到执行结果", -- src\editor\menu_project.lua
+ ["Execute the current project/file"] = "执行当前项目/文档", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Execution error"] = "执行出错误", -- src\editor\debugger.lua
+ ["Exit program"] = "离开程式", -- src\editor\menu_file.lua
+ ["File '%s' has been modified on disk."] = "磁碟上的文档 '%s' 已被更改", -- src\editor\editor.lua
+ ["File '%s' has more recent timestamp than restored '%s'; please review before saving."] = "文档 '%s' 的时间戳比 '%s' 更新近; 请检验后再保存", -- src\editor\commands.lua
+ ["File '%s' is missing and can't be recovered."] = nil, -- src\editor\commands.lua
+ ["File '%s' no longer exists."] = "文档 '%s' 已不存在", -- src\editor\menu_file.lua, src\editor\editor.lua
+ ["File already exists."] = nil, -- src\editor\commands.lua
+ ["File history"] = "文档历史", -- src\editor\menu_file.lua
+ ["Find &In Files"] = "在文档中查找", -- src\editor\menu_search.lua
+ ["Find &Next"] = "查找下一个", -- src\editor\menu_search.lua
+ ["Find &Previous"] = "查找上一个", -- src\editor\menu_search.lua
+ ["Find and insert library function"] = nil, -- src\editor\menu_search.lua
+ ["Find and replace text in files"] = "在文档中查找text然后更换", -- src\editor\menu_search.lua
+ ["Find and replace text"] = "查找text然后更换", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find in files"] = "在文档中查找", -- src\editor\toolbar.lua
+ ["Find text in files"] = "在文档中查找text", -- src\editor\menu_search.lua
+ ["Find text"] = "查找text", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find the earlier text occurence"] = "查找之前出现的text", -- src\editor\menu_search.lua
+ ["Find the next text occurrence"] = "查找之後将出现的text", -- src\editor\menu_search.lua
+ ["Find"] = "查找", -- src\editor\toolbar.lua
+ ["Fold or unfold all code folds"] = "折叠/展开所有代码折叠", -- src\editor\menu_edit.lua
+ ["Formatting page %d..."] = nil, -- src\editor\print.lua
+ ["Found %d instance."] = {}, -- src\editor\findreplace.lua
+ ["Found auto-recovery record and restored saved session."] = "找到自动恢复存档和恢复已存对话", -- src\editor\commands.lua
+ ["Full &Screen"] = "全屏", -- src\editor\menu_view.lua
+ ["Go To Definition"] = nil, -- src\editor\editor.lua
+ ["Go To File..."] = nil, -- src\editor\menu_search.lua
+ ["Go To Line..."] = "到...行", -- src\editor\menu_search.lua
+ ["Go To Next Bookmark"] = nil, -- src\editor\menu_edit.lua
+ ["Go To Next Breakpoint"] = nil, -- src\editor\menu_project.lua
+ ["Go To Previous Bookmark"] = nil, -- src\editor\menu_edit.lua
+ ["Go To Previous Breakpoint"] = nil, -- src\editor\menu_project.lua
+ ["Go To Symbol..."] = nil, -- src\editor\menu_search.lua
+ ["Go to file"] = nil, -- src\editor\menu_search.lua
+ ["Go to line"] = "到...行", -- src\editor\menu_search.lua
+ ["Go to symbol"] = nil, -- src\editor\menu_search.lua
+ ["Hide '.%s' Files"] = nil, -- src\editor\filetree.lua
+ ["INS"] = "INS", -- src\editor\editor.lua
+ ["Ignore and don't index symbols from files in the selected directory"] = nil, -- src\editor\outline.lua
+ ["Ignored error in debugger initialization code: %s."] = nil, -- src\editor\debugger.lua
+ ["Indexing %d files: '%s'..."] = nil, -- src\editor\outline.lua
+ ["Indexing completed."] = nil, -- src\editor\outline.lua
+ ["Insert Library Function..."] = nil, -- src\editor\menu_search.lua
+ ["Known Files"] = "所知的文档", -- src\editor\commands.lua
+ ["Ln: %d"] = "行: %d", -- src\editor\editor.lua
+ ["Local console"] = "本地主控台", -- src\editor\gui.lua, src\editor\shellbox.lua
+ ["Lua &Interpreter"] = "Lua 解释器", -- src\editor\menu_project.lua
+ ["Map Directory..."] = nil, -- src\editor\filetree.lua
+ ["Mapped remote request for '%s' to '%s'."] = "映射远程请求 '%s' 至 '%s'", -- src\editor\debugger.lua
+ ["Markers Window"] = nil, -- src\editor\menu_view.lua
+ ["Markers"] = nil, -- src\editor\markers.lua
+ ["Match case"] = "case匹配", -- src\editor\toolbar.lua
+ ["Match whole word"] = "全句匹配", -- src\editor\toolbar.lua
+ ["Mixed end-of-line encodings detected."] = "发现混杂的EOL编码", -- src\editor\commands.lua
+ ["Navigate"] = nil, -- src\editor\menu_search.lua
+ ["New &File"] = nil, -- src\editor\filetree.lua
+ ["OVR"] = "OVR", -- src\editor\editor.lua
+ ["Open With Default Program"] = nil, -- src\editor\filetree.lua
+ ["Open an existing document"] = "打开现存文档", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Open file"] = "打开文档", -- src\editor\commands.lua
+ ["Outline Window"] = nil, -- src\editor\menu_view.lua
+ ["Outline"] = nil, -- src\editor\outline.lua
+ ["Output (running)"] = "输出 (进行中)", -- src\editor\debugger.lua, src\editor\output.lua
+ ["Output (suspended)"] = nil, -- src\editor\debugger.lua
+ ["Output"] = "输出", -- src\editor\debugger.lua, src\editor\output.lua, src\editor\gui.lua, src\editor\settings.lua
+ ["Page Setup..."] = nil, -- src\editor\print.lua
+ ["Paste text from the clipboard"] = "从clipboard粘贴text", -- src\editor\menu_edit.lua
+ ["Preferences"] = "首选项", -- src\editor\menu_edit.lua
+ ["Prepend '!' to force local execution."] = nil, -- src\editor\shellbox.lua
+ ["Prepend '=' to show complex values on multiple lines."] = "在多行展现复杂值请前置 '='", -- src\editor\shellbox.lua
+ ["Press cancel to abort."] = "按 <cancel> 以退出", -- src\editor\commands.lua
+ ["Print the current document"] = nil, -- src\editor\print.lua
+ ["Program '%s' started in '%s' (pid: %d)."] = "程式 '%s' 执行于 '%s' (pid: %d).", -- src\editor\output.lua
+ ["Program can't start because conflicting process is running as '%s'."] = "程序不能启动因为有名为 '%s' 的冲突进程", -- src\editor\output.lua
+ ["Program completed in %.2f seconds (pid: %d)."] = "程序于 %.2f 秒完成 (pid: %d).", -- src\editor\output.lua
+ ["Program starting as '%s'."] = "程式以 '%s' 执行", -- src\editor\output.lua
+ ["Program stopped (pid: %d)."] = "程式停止 (pid: %d).", -- src\editor\debugger.lua
+ ["Program unable to run as '%s'."] = "程式不能以 '%s' 执行", -- src\editor\output.lua
+ ["Project Directory"] = "项目文件夹", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Project history"] = nil, -- src\editor\menu_file.lua
+ ["Project"] = "项目", -- src\editor\filetree.lua
+ ["Project/&FileTree Window"] = "项目/文档树 视窗", -- src\editor\menu_view.lua
+ ["Provide command line parameters"] = nil, -- src\editor\menu_project.lua
+ ["Queued %d files to index."] = nil, -- src\editor\menu_search.lua
+ ["R/O"] = "唯读", -- src\editor\editor.lua
+ ["R/W"] = "读写", -- src\editor\editor.lua
+ ["Re&place In Files"] = "在文档中替换", -- src\editor\menu_search.lua
+ ["Re-indent selected lines"] = nil, -- src\editor\menu_edit.lua
+ ["Reached end of selection and wrapped around."] = nil, -- src\editor\findreplace.lua
+ ["Reached end of text and wrapped around."] = nil, -- src\editor\findreplace.lua
+ ["Recent Files"] = "最近的文档", -- src\editor\menu_file.lua
+ ["Recent Projects"] = nil, -- src\editor\menu_file.lua
+ ["Redo last edit undone"] = "重做最后被取消的编辑", -- src\editor\menu_edit.lua
+ ["Refresh Index"] = nil, -- src\editor\outline.lua
+ ["Refresh indexed symbols from files in the selected directory"] = nil, -- src\editor\outline.lua
+ ["Refresh"] = "刷新", -- src\editor\filetree.lua
+ ["Refused a request to start a new debugging session as there is one in progress already."] = "因为有另一个除错在进行,拒绝开启新的除错对话", -- src\editor\debugger.lua
+ ["Regular expression"] = "正则表达式", -- src\editor\toolbar.lua
+ ["Remote console"] = "远程主控台", -- src\editor\shellbox.lua
+ ["Rename All Instances"] = nil, -- src\editor\editor.lua
+ ["Replace All Selections"] = nil, -- src\editor\editor.lua
+ ["Replace all"] = "更换全部", -- src\editor\toolbar.lua
+ ["Replace next instance"] = nil, -- src\editor\toolbar.lua
+ ["Replaced %d instance."] = {}, -- src\editor\findreplace.lua
+ ["Replaced an invalid UTF8 character with %s."] = "以%s更换无效的UTF8字元", -- src\editor\commands.lua
+ ["Reset to default layout"] = "重置缺省布局", -- src\editor\menu_view.lua
+ ["Run As Scratchpad"] = "以Scratchpad执行", -- src\editor\menu_project.lua
+ ["Run To Cursor"] = nil, -- src\editor\menu_project.lua, src\editor\editor.lua
+ ["Run as Scratchpad"] = "以Scratchpad执行", -- src\editor\toolbar.lua
+ ["Run to cursor"] = nil, -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["S&top Debugging"] = "停止除错", -- src\editor\menu_project.lua
+ ["S&top Process"] = "停止进程", -- src\editor\menu_project.lua
+ ["Save &As..."] = "另存为...", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["Save A&ll"] = "全部存档", -- src\editor\menu_file.lua
+ ["Save Changes?"] = "存档更新?", -- src\editor\commands.lua
+ ["Save all open documents"] = "保存所有开启的文档", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Save file as"] = "文档另存为", -- src\editor\commands.lua
+ ["Save file?"] = "保存文档?", -- src\editor\commands.lua
+ ["Save the current document to a file with a new name"] = "用新档案名称保存当前文档", -- src\editor\menu_file.lua
+ ["Save the current document"] = "保存当前文档", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Saved auto-recover at %s."] = "在 %s 存档自动恢复", -- src\editor\commands.lua
+ ["Scratchpad error"] = "暂存器错误", -- src\editor\debugger.lua
+ ["Search direction"] = nil, -- src\editor\toolbar.lua
+ ["Search in selection"] = nil, -- src\editor\toolbar.lua
+ ["Search in subdirectories"] = nil, -- src\editor\toolbar.lua
+ ["Searching for '%s'."] = nil, -- src\editor\findreplace.lua
+ ["Sel: %d/%d"] = nil, -- src\editor\editor.lua
+ ["Select &All"] = "选全部", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Select And Find Next"] = nil, -- src\editor\menu_search.lua
+ ["Select And Find Previous"] = nil, -- src\editor\menu_search.lua
+ ["Select all text in the editor"] = "选编辑器内的所有text", -- src\editor\menu_edit.lua
+ ["Select the word under cursor and find its next occurrence"] = nil, -- src\editor\menu_search.lua
+ ["Select the word under cursor and find its previous occurrence"] = nil, -- src\editor\menu_search.lua
+ ["Set As Start File"] = nil, -- src\editor\filetree.lua
+ ["Set From Current File"] = "从当前文档设置", -- src\editor\menu_project.lua
+ ["Set To Project Directory"] = nil, -- src\editor\findreplace.lua
+ ["Set To Selected Directory"] = nil, -- src\editor\filetree.lua
+ ["Set project directory from current file"] = "从当前文档设置项目文件夹", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Set project directory to the selected one"] = nil, -- src\editor\filetree.lua
+ ["Set search directory"] = nil, -- src\editor\toolbar.lua
+ ["Set the interpreter to be used"] = "设置解释器", -- src\editor\menu_project.lua
+ ["Set the project directory to be used"] = "设置项目文件夹", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Settings: System"] = "设置: 系统", -- src\editor\menu_edit.lua
+ ["Settings: User"] = "设置: 用户", -- src\editor\menu_edit.lua
+ ["Show &Tooltip"] = "展现tooltip", -- src\editor\menu_edit.lua
+ ["Show All Files"] = nil, -- src\editor\filetree.lua
+ ["Show Hidden Files"] = nil, -- src\editor\filetree.lua
+ ["Show Location"] = nil, -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Show all files"] = nil, -- src\editor\filetree.lua
+ ["Show context"] = nil, -- src\editor\toolbar.lua
+ ["Show files previously hidden"] = nil, -- src\editor\filetree.lua
+ ["Show multiple result windows"] = nil, -- src\editor\toolbar.lua
+ ["Show tooltip for current position; place cursor after opening bracket of function"] = "在当前的位置展现tooltip; 把游标放置于函数的开括号之后", -- src\editor\menu_edit.lua
+ ["Show/Hide the status bar"] = nil, -- src\editor\menu_view.lua
+ ["Show/Hide the toolbar"] = nil, -- src\editor\menu_view.lua
+ ["Sort By Name"] = nil, -- src\editor\outline.lua
+ ["Sort selected lines"] = "对被选的行进行排列", -- src\editor\menu_edit.lua
+ ["Source"] = nil, -- src\editor\menu_edit.lua
+ ["Stack"] = "堆栈", -- src\editor\debugger.lua
+ ["Start &Debugging"] = "开始除错", -- src\editor\menu_project.lua
+ ["Start or continue debugging"] = nil, -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step &Into"] = "除错运行 进入子程序/函数", -- src\editor\menu_project.lua
+ ["Step &Over"] = "除错运行 掠过子程序/函数", -- src\editor\menu_project.lua
+ ["Step O&ut"] = "除错运行 离开子程序/函数", -- src\editor\menu_project.lua
+ ["Step into"] = "除错运行 进入子程序/函数", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step out of the current function"] = "除错运行 离开当前的函数", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step over"] = "除错运行 掠过子程序/函数", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop debugging and continue running the process"] = nil, -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop the currently running process"] = "终止目前进行着的进程", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Switch to or from full screen mode"] = "切换全屏模式", -- src\editor\menu_view.lua
+ ["Symbol Index"] = nil, -- src\editor\outline.lua
+ ["Text not found."] = "寻找不到text", -- src\editor\findreplace.lua
+ ["The API file must be located in a subdirectory of the API directory."] = "API file必须存放在API文件夹中的子文件夹", -- src\editor\autocomplete.lua
+ ["Toggle Bookmark"] = nil, -- src\editor\markers.lua, src\editor\menu_edit.lua
+ ["Toggle Breakpoint"] = "切换中断点", -- src\editor\markers.lua, src\editor\menu_project.lua
+ ["Toggle bookmark"] = nil, -- src\editor\toolbar.lua, src\editor\menu_edit.lua, src\editor\markers.lua
+ ["Toggle breakpoint"] = "切换中断点", -- src\editor\markers.lua, src\editor\toolbar.lua
+ ["Tr&ace"] = "追踪", -- src\editor\menu_project.lua
+ ["Trace execution showing each executed line"] = "执行追踪展示每一执行过的语句", -- src\editor\menu_project.lua
+ ["Unable to create directory '%s'."] = nil, -- src\editor\filetree.lua
+ ["Unable to create file '%s'."] = nil, -- src\editor\filetree.lua
+ ["Unable to delete directory '%s': %s"] = nil, -- src\editor\filetree.lua
+ ["Unable to delete file '%s': %s"] = nil, -- src\editor\filetree.lua
+ ["Unable to load file '%s'."] = "导出文件失败 '%s'.", -- src\editor\commands.lua
+ ["Unable to rename file '%s'."] = nil, -- src\editor\filetree.lua
+ ["Unable to save file '%s': %s"] = "保存文件失败 '%s': %s", -- src\editor\commands.lua
+ ["Unable to stop program (pid: %d), code %d."] = "停止程序失败 (pid: %d), 代码 %d.", -- src\editor\debugger.lua
+ ["Undo last edit"] = "清除前编辑动作", -- src\editor\menu_edit.lua
+ ["Unmap Directory"] = nil, -- src\editor\filetree.lua
+ ["Unset '%s' As Start File"] = nil, -- src\editor\filetree.lua
+ ["Updated %d file."] = {}, -- src\editor\findreplace.lua
+ ["Updating symbol index and settings..."] = nil, -- src\editor\outline.lua
+ ["Use %s to close."] = nil, -- src\editor\findreplace.lua
+ ["Use '%s' to see full description."] = "用 '%s' 来看全解析", -- src\editor\editor.lua
+ ["Use '%s' to show line endings and '%s' to convert them."] = "用 '%s' 来显示语句的终结和 '%s' 来进行转换", -- src\editor\commands.lua
+ ["Use 'clear' to clear the shell output and the history."] = "用 'clear' 来清除shell的输出和历史", -- src\editor\shellbox.lua
+ ["Use Shift-Enter for multiline code."] = "用 <Shift-Enter> 来处理多行代码", -- src\editor\shellbox.lua
+ ["View the markers window"] = nil, -- src\editor\menu_view.lua
+ ["View the outline window"] = nil, -- src\editor\menu_view.lua
+ ["View the output/console window"] = "查看输出/主控台视窗", -- src\editor\menu_view.lua
+ ["View the project/filetree window"] = "查看项目/文件树视窗", -- src\editor\menu_view.lua
+ ["View the stack window"] = "查看堆栈视窗", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["View the watch window"] = "查看监视视窗", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["Watch"] = "监视", -- src\editor\debugger.lua
+ ["Welcome to the interactive Lua interpreter."] = "欢迎来到互动 Lua interpreter.", -- src\editor\shellbox.lua
+ ["Wrap around"] = "卷绕", -- src\editor\toolbar.lua
+ ["You must save the program first."] = "必须先保存程序", -- src\editor\commands.lua
+ ["Zoom In"] = nil, -- src\editor\menu_view.lua
+ ["Zoom Out"] = nil, -- src\editor\menu_view.lua
+ ["Zoom to 100%"] = nil, -- src\editor\menu_view.lua
+ ["Zoom"] = nil, -- src\editor\menu_view.lua
+ ["on line %d"] = "在 %d 行", -- src\editor\debugger.lua, src\editor\editor.lua, src\editor\commands.lua
+ ["traced %d instruction"] = "追踪 %d 指令", -- src\editor\debugger.lua
+ ["unknown error"] = nil, -- src\editor\debugger.lua
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/de.lua b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/de.lua
new file mode 100644
index 0000000..0705078
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/de.lua
@@ -0,0 +1,345 @@
+return {
+ [0] = function(c) return c == 1 and 1 or 2 end, -- plural
+ ["%s event failed: %s"] = "Ereignis fehlgeschlagen : %s", -- src\editor\package.lua
+ ["%s%% formatted..."] = nil, -- src\editor\print.lua
+ ["%s%% loaded..."] = "%s%% geladen...", -- src\editor\commands.lua
+ ["&About"] = "&Über", -- src\editor\menu_help.lua
+ ["&Add Watch"] = "&Beobachtungspunkt hinzufügen", -- src\editor\debugger.lua
+ ["&Break"] = "&Unterbrechung", -- src\editor\menu_project.lua
+ ["&Close Page"] = "S&eite schließen", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Community"] = "&Community", -- src\editor\menu_help.lua
+ ["&Compile"] = "&Compiler", -- src\editor\menu_project.lua
+ ["&Copy Value"] = "Wert kopieren", -- src\editor\debugger.lua
+ ["&Copy"] = "&Kopieren", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Default Layout"] = "Standard-&Layout", -- src\editor\menu_view.lua
+ ["&Delete Watch"] = "&Beobachtungspunkt entfernen", -- src\editor\debugger.lua
+ ["&Delete"] = "&Entfernen", -- src\editor\filetree.lua
+ ["&Documentation"] = "&Dokumentation", -- src\editor\menu_help.lua
+ ["&Edit Project Directory"] = "Projektverzeichnis ändern", -- src\editor\filetree.lua
+ ["&Edit Value"] = "Wert editieren", -- src\editor\debugger.lua
+ ["&Edit Watch"] = "&Beobachtungspunkt bearbeiten", -- src\editor\debugger.lua
+ ["&Edit"] = "&Bearbeiten", -- src\editor\menu_edit.lua
+ ["&File"] = "&Datei", -- src\editor\menu_file.lua
+ ["&Find"] = "&Finden", -- src\editor\menu_search.lua
+ ["&Fold/Unfold All"] = "A&lles ein-/ausklappen", -- src\editor\menu_edit.lua
+ ["&Frequently Asked Questions"] = "&FAQ", -- src\editor\menu_help.lua
+ ["&Getting Started Guide"] = "&Anfängerleitfaden", -- src\editor\menu_help.lua
+ ["&Help"] = "&Hilfe", -- src\editor\menu_help.lua
+ ["&New Directory"] = "&Neuer Ordner", -- src\editor\filetree.lua
+ ["&New"] = "&Neu", -- src\editor\menu_file.lua
+ ["&Open..."] = "&Öffnen...", -- src\editor\menu_file.lua
+ ["&Output/Console Window"] = "&Ausgabefenster/Konsole", -- src\editor\menu_view.lua
+ ["&Paste"] = "&Einfügen", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Print..."] = nil, -- src\editor\print.lua
+ ["&Project Page"] = "&Projektseite", -- src\editor\menu_help.lua
+ ["&Project"] = "&Projekt", -- src\editor\menu_project.lua
+ ["&Redo"] = "&Wiederholen", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Rename"] = "&Umbenennen", -- src\editor\filetree.lua
+ ["&Replace"] = "&Ersetzen", -- src\editor\menu_search.lua
+ ["&Run"] = "&Starten", -- src\editor\menu_project.lua
+ ["&Save"] = "&Speichern", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Search"] = "&Suchen", -- src\editor\menu_search.lua
+ ["&Select Command"] = nil, -- src\editor\gui.lua
+ ["&Sort"] = "&Sortieren", -- src\editor\menu_edit.lua
+ ["&Stack Window"] = "&Stapel/Stack", -- src\editor\menu_view.lua
+ ["&Start Debugger Server"] = "De&bugserver starten", -- src\editor\menu_project.lua
+ ["&Status Bar"] = "S&tatuszeile", -- src\editor\menu_view.lua
+ ["&Tool Bar"] = "&Werkzeugleiste", -- src\editor\menu_view.lua
+ ["&Tutorials"] = "&Tutorien", -- src\editor\menu_help.lua
+ ["&Undo"] = "&Rückgängig", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&View"] = "&Ansicht", -- src\editor\menu_view.lua
+ ["&Watch Window"] = "&Beobachtungspunkte", -- src\editor\menu_view.lua
+ ["About %s"] = "Über %s", -- src\editor\menu_help.lua
+ ["Add To Scratchpad"] = "Zu Entwurf hinzufügen", -- src\editor\editor.lua
+ ["Add Watch Expression"] = "Beobachtungspunkt hinzufügen", -- src\editor\editor.lua
+ ["All files"] = "Alle Dateien", -- src\editor\commands.lua
+ ["Allow external process to start debugging"] = "Externem Prozeß erlauben, den Debugger zu starten", -- src\editor\menu_project.lua
+ ["Analyze the source code"] = "Quellcode analysieren", -- src\editor\inspect.lua
+ ["Analyze"] = "&Analyseroutine", -- src\editor\inspect.lua
+ ["Auto Complete Identifiers"] = "Auto-Vervollständigen von Bezeichnern", -- src\editor\menu_edit.lua
+ ["Auto complete while typing"] = "Auto-Vervollständigen beim Tippen", -- src\editor\menu_edit.lua
+ ["Binary file is shown as read-only as it is only partially loaded."] = "Binärdatei ist als schreibgeschützt angezeigt, da sie nur teilweise geladen wurde.", -- src\editor\commands.lua
+ ["Bookmark"] = "Lese&zeichen", -- src\editor\menu_edit.lua
+ ["Break execution at the next executed line of code"] = "Programmausführung bei der nächsten ausgeführten Zeile stoppen", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Breakpoint"] = nil, -- src\editor\menu_project.lua
+ ["C&lear Console Window"] = nil, -- src\editor\gui.lua
+ ["C&lear Output Window"] = "Ausgabefenster l&öschen", -- src\editor\gui.lua, src\editor\menu_project.lua
+ ["C&omment/Uncomment"] = "(Aus-)/K&ommentieren", -- src\editor\menu_edit.lua
+ ["Can't evaluate the expression while the application is running."] = "Kann den Ausdruck nicht auswerten solange die Anwendung läuft.", -- src\editor\debugger.lua
+ ["Can't open file '%s': %s"] = "Kann Datei '%s' nicht öffnen: %s", -- src\editor\findreplace.lua, src\editor\singleinstance.lua, src\editor\inspect.lua, src\editor\outline.lua
+ ["Can't process auto-recovery record; invalid format: %s."] = "Auto-Wiederherstellen nicht möglich; ungültiges Format: %s.", -- src\editor\commands.lua
+ ["Can't replace in read-only text."] = "Ersetzen in schreibgeschütztem Text nicht möglich.", -- src\editor\findreplace.lua
+ ["Can't run the entry point script ('%s')."] = "Kann Script für Einsprungspunkt ('%s') nicht ausführen.", -- src\editor\debugger.lua
+ ["Can't start debugger server at %s:%d: %s."] = "Kann Debugserver nicht starten (%s:%d): %s.", -- src\editor\debugger.lua
+ ["Can't start debugging for '%s'."] = "Kann Debuggen nicht starten für '%s'.", -- src\editor\debugger.lua
+ ["Can't start debugging session due to internal error '%s'."] = "Debugging kann nicht gestartet werden wegen internem Fehler '%s'.", -- src\editor\debugger.lua
+ ["Can't start debugging without an opened file or with the current file not being saved ('%s')."] = "Debugging kann ohne geöffnete Datei nicht gestartet werden oder wenn die aktuelle Datei nicht gespeichert ist ('%s').", -- src\editor\debugger.lua
+ ["Can't stop debugger server as it is not started."] = "Kann Debugserver nicht stoppen wenn er vorher nicht gestartet wurde.", -- src\editor\debugger.lua
+ ["Cancelled by the user."] = "Durch Benutzer abgebrochen.", -- src\editor\findreplace.lua
+ ["Choose a directory to map"] = "Bitte Verzeichnis wählen zum virtuellen Einbinden", -- src\editor\filetree.lua
+ ["Choose a project directory"] = "Projektverzeichnis auswählen", -- src\editor\toolbar.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Choose a search directory"] = "Bitte Verzeichnis zum Durchsuchen auswählen.", -- src\editor\findreplace.lua
+ ["Choose..."] = "Wählen...", -- src\editor\findreplace.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Clear Items"] = "Liste &löschen", -- src\editor\findreplace.lua, src\editor\menu_file.lua
+ ["Clear items from this list"] = "Diese Liste löschen", -- src\editor\menu_file.lua
+ ["Clear the output window before compiling or debugging"] = "Vor Kompilieren oder Debuggen das Ausgabefenster löschen", -- src\editor\menu_project.lua
+ ["Close &Other Pages"] = "A&ndere Seiten schließen", -- src\editor\gui.lua
+ ["Close A&ll Pages"] = "&Alle Seiten schließen", -- src\editor\gui.lua
+ ["Close the current editor window"] = "Aktuelles Editorfenster schließen", -- src\editor\menu_file.lua
+ ["Co&ntinue"] = "&Fortsetzen", -- src\editor\menu_project.lua
+ ["Col: %d"] = "Spalte: %d", -- src\editor\editor.lua
+ ["Command Line Parameters..."] = "Kommandozeilenparameter...", -- src\editor\menu_project.lua
+ ["Command line parameters"] = "Kommandozeilenparameter", -- src\editor\menu_project.lua
+ ["Comment or uncomment current or selected lines"] = "Ausgewählte bzw. aktive Zeile (un-)kommentieren", -- src\editor\menu_edit.lua
+ ["Compilation error"] = "Fehler beim Kompilieren", -- src\editor\commands.lua, src\editor\debugger.lua
+ ["Compilation successful; %.0f%% success rate (%d/%d)."] = "Kompilieren erfolgreich; Erfolgsquote von %.0f%% (%d/%d).", -- src\editor\commands.lua
+ ["Compile the current file"] = "Aktuelle Datei kompilieren", -- src\editor\menu_project.lua
+ ["Complete &Identifier"] = "&Bezeichner vervollständigen", -- src\editor\menu_edit.lua
+ ["Complete the current identifier"] = " Aktuellen Bezeichner vervollständigen", -- src\editor\menu_edit.lua
+ ["Consider removing backslash from escape sequence '%s'."] = "Möglicherweise muß `\' aus '%s' entfernt werden.", -- src\editor\commands.lua
+ ["Copy Full Path"] = "Kopiere Pfadangabe", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Copy selected text to clipboard"] = "Text in Zwischenablage kopieren", -- src\editor\menu_edit.lua
+ ["Correct &Indentation"] = "E&inzug korrigieren", -- src\editor\menu_edit.lua
+ ["Couldn't activate file '%s' for debugging; continuing without it."] = "Konnte Datei '%s' zwecks nicht Debugging aktivieren; fahre ohne die Datei fort.", -- src\editor\debugger.lua
+ ["Create an empty document"] = "Leeres Dokument anlegen", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Cu&t"] = "A&usschneiden", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Cut selected text to clipboard"] = "Schneide ausgewählten Text in die Zwischenablage hinein", -- src\editor\menu_edit.lua
+ ["Debugger server started at %s:%d."] = "Debugserver gestartet als %s:%d.", -- src\editor\debugger.lua
+ ["Debugger server stopped at %s:%d."] = "Debugserver gestoppt als %s:%d.", -- src\editor\debugger.lua
+ ["Debugging session completed (%s)."] = "Debugging Session beendet (%s).", -- src\editor\debugger.lua
+ ["Debugging session started in '%s'."] = "Debugging Session gestartet '%s'.", -- src\editor\debugger.lua
+ ["Debugging suspended at '%s:%s' (couldn't activate the file)."] = "Debugging angehalten bei '%s:%s' (konnte Datei nicht aktivieren).", -- src\editor\debugger.lua
+ ["Detach &Process"] = "Prozeß abkoppeln", -- src\editor\menu_project.lua
+ ["Disable Indexing For '%s'"] = "Indizieren ausschalten für '%s'", -- src\editor\outline.lua
+ ["Do you want to delete '%s'?"] = "Soll '%s' gelöscht werden?", -- src\editor\filetree.lua
+ ["Do you want to overwrite it?"] = "Überschreiben?", -- src\editor\commands.lua
+ ["Do you want to reload it?"] = "Neu laden?", -- src\editor\editor.lua
+ ["Do you want to save the changes to '%s'?"] = "Änderungen an '%s' speichern?", -- src\editor\commands.lua
+ ["E&xit"] = "&Beenden", -- src\editor\menu_file.lua
+ ["Enable Indexing"] = "Indizieren aktivieren", -- src\editor\outline.lua
+ ["Enter Lua code and press Enter to run it."] = "Lua-Code eingeben und Enter drücken zum Ausführen.", -- src\editor\shellbox.lua
+ ["Enter command line parameters (use Cancel to clear)"] = "Kommandozeilenparameter eingeben (Cancel zum löschen)", -- src\editor\menu_project.lua
+ ["Enter replacement text"] = "Neuen Text eingeben", -- src\editor\editor.lua
+ ["Error while loading API file: %s"] = "Fehler beim Laden von API-Datei: %s", -- src\editor\autocomplete.lua
+ ["Error while loading configuration file: %s"] = "Fehler beim Laden von Konfigurationsdatei: %s", -- src\editor\style.lua
+ ["Error while processing API file: %s"] = "Fehler beim Lesen von API-Datei: %s", -- src\editor\autocomplete.lua
+ ["Error while processing configuration file: %s"] = "Fehler beim Lesen von Konfiguratonsdatei: %s", -- src\editor\style.lua
+ ["Error"] = "Fehler", -- src\editor\commands.lua
+ ["Evaluate In Console"] = "In Konsole auswerten", -- src\editor\editor.lua
+ ["Execute the current project/file and keep updating the code to see immediate results"] = "Aktuelles Projekt/ aktuelle Datei ausführen und Quellcode ändern, um Ergebnisse in Echtzeit zu sehen", -- src\editor\menu_project.lua
+ ["Execute the current project/file"] = "Aktuelles Projekt/ aktuelle Datei ausführen", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Execution error"] = "Fehler bei Ausführung", -- src\editor\debugger.lua
+ ["Exit program"] = "Programm beenden", -- src\editor\menu_file.lua
+ ["File '%s' has been modified on disk."] = "Datei '%s' wurde auf der Festplatte geändert.", -- src\editor\editor.lua
+ ["File '%s' has more recent timestamp than restored '%s'; please review before saving."] = "Datei '%s' hat neueren Zeitstempel als wiederhergestellte Datei '%s'; bitte vor dem Speichern kontrollieren.", -- src\editor\commands.lua
+ ["File '%s' is missing and can't be recovered."] = "Datei '%s' fehlt und kann nicht wiederhergestellt werden.", -- src\editor\commands.lua
+ ["File '%s' no longer exists."] = "Datei '%s' existiert nicht mehr.", -- src\editor\menu_file.lua, src\editor\editor.lua
+ ["File already exists."] = "Datei existiert bereits.", -- src\editor\commands.lua
+ ["File history"] = "Dateiverlauf", -- src\editor\menu_file.lua
+ ["Find &In Files"] = "Finde &in Dateien", -- src\editor\menu_search.lua
+ ["Find &Next"] = "Finde &Nächste", -- src\editor\menu_search.lua
+ ["Find &Previous"] = "Finde &Vorherige", -- src\editor\menu_search.lua
+ ["Find and insert library function"] = "Suchen und Einfügen von Funktion aus Bibliothek", -- src\editor\menu_search.lua
+ ["Find and replace text in files"] = "Finde und ersetze Text in Dateien", -- src\editor\menu_search.lua
+ ["Find and replace text"] = "Finde und ersetze Text", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find in files"] = "Finde in dateien", -- src\editor\toolbar.lua
+ ["Find text in files"] = "Finde Text in Dateien", -- src\editor\menu_search.lua
+ ["Find text"] = "Finde Text", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find the earlier text occurence"] = "Finde vorheriges Auftreten des Textes", -- src\editor\menu_search.lua
+ ["Find the next text occurrence"] = "Finde nächstes Auftreten des Textes", -- src\editor\menu_search.lua
+ ["Find"] = "Finden", -- src\editor\toolbar.lua
+ ["Fold or unfold all code folds"] = "Alle Stellen im Code ein-/ausklappen ", -- src\editor\menu_edit.lua
+ ["Formatting page %d..."] = nil, -- src\editor\print.lua
+ ["Found %d instance."] = {"Eine Instanz gefunden", "%d Instanzen gefunden."}, -- src\editor\findreplace.lua
+ ["Found auto-recovery record and restored saved session."] = "Autowiederherstellen-Aufzeichnung gefunden und vorherige Sitzung wiederhergestellt.", -- src\editor\commands.lua
+ ["Full &Screen"] = "&Vollbild", -- src\editor\menu_view.lua
+ ["Go To Definition"] = "Gehe zu Definition", -- src\editor\editor.lua
+ ["Go To File..."] = "Gehe zu Datei...", -- src\editor\menu_search.lua
+ ["Go To Line..."] = "Gehe zu Zeile...", -- src\editor\menu_search.lua
+ ["Go To Next Bookmark"] = "Zu nächstem Lesezeichen", -- src\editor\menu_edit.lua
+ ["Go To Next Breakpoint"] = nil, -- src\editor\menu_project.lua
+ ["Go To Previous Bookmark"] = "Zu vorherigem Lesezeichen", -- src\editor\menu_edit.lua
+ ["Go To Previous Breakpoint"] = nil, -- src\editor\menu_project.lua
+ ["Go To Symbol..."] = "Gehe zu Symbol...", -- src\editor\menu_search.lua
+ ["Go to file"] = "Gehe zu Datei", -- src\editor\menu_search.lua
+ ["Go to line"] = "Gehe zu Zeile", -- src\editor\menu_search.lua
+ ["Go to symbol"] = "Gehe zu Symbol", -- src\editor\menu_search.lua
+ ["Hide '.%s' Files"] = "Verstecke '.%s' Dateien", -- src\editor\filetree.lua
+ ["INS"] = "INS", -- src\editor\editor.lua
+ ["Ignore and don't index symbols from files in the selected directory"] = "Dateien im ausgewählten Verzeichnis ignorieren und keine Symbole indizieren.", -- src\editor\outline.lua
+ ["Ignored error in debugger initialization code: %s."] = "Ignorierter Fehler im Debugger-Init-Code: %s.", -- src\editor\debugger.lua
+ ["Indexing %d files: '%s'..."] = "%d Dateien indizieren: '%s'...", -- src\editor\outline.lua
+ ["Indexing completed."] = "Indizierung abgeschlossen.", -- src\editor\outline.lua
+ ["Insert Library Function..."] = "Füge Funktion aus Bibliothek ein", -- src\editor\menu_search.lua
+ ["Known Files"] = "Bekannte Dateien", -- src\editor\commands.lua
+ ["Ln: %d"] = "Zeile: %d", -- src\editor\editor.lua
+ ["Local console"] = "Lokale Konsole", -- src\editor\gui.lua, src\editor\shellbox.lua
+ ["Lua &Interpreter"] = "&Lua Interpreter", -- src\editor\menu_project.lua
+ ["Map Directory..."] = "Verzeichnis virtuell einbinden...", -- src\editor\filetree.lua
+ ["Mapped remote request for '%s' to '%s'."] = "Fern-Aufforderung für '%s' auf '%s' abgebildet.", -- src\editor\debugger.lua
+ ["Markers Window"] = nil, -- src\editor\menu_view.lua
+ ["Markers"] = nil, -- src\editor\markers.lua
+ ["Match case"] = "Groß-/Kleinschreibung", -- src\editor\toolbar.lua
+ ["Match whole word"] = "Ganzes Wort", -- src\editor\toolbar.lua
+ ["Mixed end-of-line encodings detected."] = "Gemischte End-of-Line Kodierung entdeckt.", -- src\editor\commands.lua
+ ["Navigate"] = "Navigieren", -- src\editor\menu_search.lua
+ ["New &File"] = "Neue &Datei", -- src\editor\filetree.lua
+ ["OVR"] = "OVR", -- src\editor\editor.lua
+ ["Open With Default Program"] = "Mit Standardanwendung öffnen", -- src\editor\filetree.lua
+ ["Open an existing document"] = "Öffne existierendes Dokument", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Open file"] = "Öffne Datei", -- src\editor\commands.lua
+ ["Outline Window"] = "Übersichtsfenster", -- src\editor\menu_view.lua
+ ["Outline"] = "Übersicht", -- src\editor\outline.lua
+ ["Output (running)"] = "Ausgabe (ausgeführt)", -- src\editor\debugger.lua, src\editor\output.lua
+ ["Output (suspended)"] = "Ausgabe (angehalten)", -- src\editor\debugger.lua
+ ["Output"] = "Ausgabe", -- src\editor\debugger.lua, src\editor\output.lua, src\editor\gui.lua, src\editor\settings.lua
+ ["Page Setup..."] = nil, -- src\editor\print.lua
+ ["Paste text from the clipboard"] = "Text aus Zwischenablage einfügen", -- src\editor\menu_edit.lua
+ ["Preferences"] = "Einstellungen", -- src\editor\menu_edit.lua
+ ["Prepend '!' to force local execution."] = "'!' voranstellen um lokale Ausführung zu erzwingen.", -- src\editor\shellbox.lua
+ ["Prepend '=' to show complex values on multiple lines."] = "'=' voranstellen, um komplexe Ausdrücke auf mehrere Zeilen zu verteilen.", -- src\editor\shellbox.lua
+ ["Press cancel to abort."] = "Abbrechen Drücken zum Beenden.", -- src\editor\commands.lua
+ ["Print the current document"] = nil, -- src\editor\print.lua
+ ["Program '%s' started in '%s' (pid: %d)."] = "Programm '%s' gestartet in '%s' (pid : %d).", -- src\editor\output.lua
+ ["Program can't start because conflicting process is running as '%s'."] = "Programm kann nicht starten, da blockierender Prozeß als '%s' läuft.", -- src\editor\output.lua
+ ["Program completed in %.2f seconds (pid: %d)."] = "Programm beendet nach %.2f Sekunden (pid : %d).", -- src\editor\output.lua
+ ["Program starting as '%s'."] = "Programm gestartet als '%s'.", -- src\editor\output.lua
+ ["Program stopped (pid: %d)."] = "Programm gestoppt (pid: %d).", -- src\editor\debugger.lua
+ ["Program unable to run as '%s'."] = "Programm kann nicht als '%s' laufen.", -- src\editor\output.lua
+ ["Project Directory"] = "&Projektverzeichnis", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Project history"] = "Liste bisheriger Projekte", -- src\editor\menu_file.lua
+ ["Project"] = "Projekt", -- src\editor\filetree.lua
+ ["Project/&FileTree Window"] = "&Projekt/Datei Fenster", -- src\editor\menu_view.lua
+ ["Provide command line parameters"] = "Kommandozeilenparameter angeben", -- src\editor\menu_project.lua
+ ["Queued %d files to index."] = "%d Dateien zum Indizieren vorgemerkt.", -- src\editor\menu_search.lua
+ ["R/O"] = "R/O", -- src\editor\editor.lua
+ ["R/W"] = "R/W", -- src\editor\editor.lua
+ ["Re&place In Files"] = "Ersetze in &Dateien", -- src\editor\menu_search.lua
+ ["Re-indent selected lines"] = "Ausgewählte Zeilen neu einrücken", -- src\editor\menu_edit.lua
+ ["Reached end of selection and wrapped around."] = nil, -- src\editor\findreplace.lua
+ ["Reached end of text and wrapped around."] = "Ende des Textes erreicht, setze am Beginn fort.", -- src\editor\findreplace.lua
+ ["Recent Files"] = "Letzte Dateien", -- src\editor\menu_file.lua
+ ["Recent Projects"] = "Letzte Projekte", -- src\editor\menu_file.lua
+ ["Redo last edit undone"] = "Stelle letzte rückgängig gemachte Bearbeitung wieder her", -- src\editor\menu_edit.lua
+ ["Refresh Index"] = "Index erneuern", -- src\editor\outline.lua
+ ["Refresh indexed symbols from files in the selected directory"] = "Erneuere indizierte Symbole in Dateien des ausgewählten Verzeichnisses", -- src\editor\outline.lua
+ ["Refresh"] = "Aktualisieren", -- src\editor\filetree.lua
+ ["Refused a request to start a new debugging session as there is one in progress already."] = "Starten einer neuen Debuggingsession abgelehnt, da bereits eine läuft.", -- src\editor\debugger.lua
+ ["Regular expression"] = "Regulärer Ausdruck", -- src\editor\toolbar.lua
+ ["Remote console"] = "Fernsteuerungs-Konsole", -- src\editor\shellbox.lua
+ ["Rename All Instances"] = "Umbenennen aller Instanzen", -- src\editor\editor.lua
+ ["Replace All Selections"] = "Alle Auswahlen ersetzen", -- src\editor\editor.lua
+ ["Replace all"] = "Alles ersetzen", -- src\editor\toolbar.lua
+ ["Replace next instance"] = "Nächste Instanz ersetzen", -- src\editor\toolbar.lua
+ ["Replaced %d instance."] = {"Eine Instanz ersetzt.", "%d Instanzen ersetzt."}, -- src\editor\findreplace.lua
+ ["Replaced an invalid UTF8 character with %s."] = "Unbekanntes UTF8-Symbol ersetzt mit %s.", -- src\editor\commands.lua
+ ["Reset to default layout"] = "Standard-Layout wiederherstellen", -- src\editor\menu_view.lua
+ ["Run As Scratchpad"] = "Als &Entwurf starten", -- src\editor\menu_project.lua
+ ["Run To Cursor"] = "Stoppe Ausführung an Cursorposition", -- src\editor\menu_project.lua, src\editor\editor.lua
+ ["Run as Scratchpad"] = "Als &Entwurf starten", -- src\editor\toolbar.lua
+ ["Run to cursor"] = "Stoppe Ausführung an Cursorposition", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["S&top Debugging"] = "Debugging a&nhalten", -- src\editor\menu_project.lua
+ ["S&top Process"] = "Prozeß &anhalten", -- src\editor\menu_project.lua
+ ["Save &As..."] = "S&peichern als...", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["Save A&ll"] = "&Alle Speichern", -- src\editor\menu_file.lua
+ ["Save Changes?"] = "Änderungen speichern?", -- src\editor\commands.lua
+ ["Save all open documents"] = "Alle offenen Dokumente speichern", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Save file as"] = "Datei speichern als", -- src\editor\commands.lua
+ ["Save file?"] = "Datei speichern?", -- src\editor\commands.lua
+ ["Save the current document to a file with a new name"] = "Aktuelles Dokument unter neuem Namen speichern", -- src\editor\menu_file.lua
+ ["Save the current document"] = "Aktuelles Dokument speichern", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Saved auto-recover at %s."] = "%s Autowiederherstellen gespeichert.", -- src\editor\commands.lua
+ ["Scratchpad error"] = "Fehler im Entwurf", -- src\editor\debugger.lua
+ ["Search direction"] = "Suchrichtung", -- src\editor\toolbar.lua
+ ["Search in selection"] = nil, -- src\editor\toolbar.lua
+ ["Search in subdirectories"] = "Suche in Unterverzeichnissen", -- src\editor\toolbar.lua
+ ["Searching for '%s'."] = "Suche nach '%s'.", -- src\editor\findreplace.lua
+ ["Sel: %d/%d"] = "Ausgew.: %d/%d", -- src\editor\editor.lua
+ ["Select &All"] = "&Alles Auswählen", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Select And Find Next"] = "Auswählen und nächstes finden", -- src\editor\menu_search.lua
+ ["Select And Find Previous"] = "Auswählen und vorheriges finden", -- src\editor\menu_search.lua
+ ["Select all text in the editor"] = "Kompletten Text im Editor auswählen", -- src\editor\menu_edit.lua
+ ["Select the word under cursor and find its next occurrence"] = "Wort unter dem Cursor auswählen und nächstes Auftauchen finden", -- src\editor\menu_search.lua
+ ["Select the word under cursor and find its previous occurrence"] = "Wort unter dem Cursor auswählen und vorheriges Auftauchen finden", -- src\editor\menu_search.lua
+ ["Set As Start File"] = "Als Startdatei definieren.", -- src\editor\filetree.lua
+ ["Set From Current File"] = "Anhand der aktuellen Datei festlegen", -- src\editor\menu_project.lua
+ ["Set To Project Directory"] = "Setze als Projektverzeichnis", -- src\editor\findreplace.lua
+ ["Set To Selected Directory"] = nil, -- src\editor\filetree.lua
+ ["Set project directory from current file"] = "Lege Projektverzeichnis anhand der aktuellen Datei fest", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Set project directory to the selected one"] = nil, -- src\editor\filetree.lua
+ ["Set search directory"] = "Setze Suchverzeichnis", -- src\editor\toolbar.lua
+ ["Set the interpreter to be used"] = "Wähle zu benutzenden Interpreter aus", -- src\editor\menu_project.lua
+ ["Set the project directory to be used"] = "Lege zu benutzendes Projektverzeichnis fest", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Settings: System"] = "Einstellungen: System", -- src\editor\menu_edit.lua
+ ["Settings: User"] = "Einstellungen: Nutzer", -- src\editor\menu_edit.lua
+ ["Show &Tooltip"] = "&Tooltip zeigen", -- src\editor\menu_edit.lua
+ ["Show All Files"] = "Zeige alle Dateien", -- src\editor\filetree.lua
+ ["Show Hidden Files"] = "Zeige versteckte Dateien", -- src\editor\filetree.lua
+ ["Show Location"] = "Ordner öffnen", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Show all files"] = "Zeige alle Dateien", -- src\editor\filetree.lua
+ ["Show context"] = "Zeige Kontext", -- src\editor\toolbar.lua
+ ["Show files previously hidden"] = "Zeige Dateien die zuvor versteckt wurden", -- src\editor\filetree.lua
+ ["Show multiple result windows"] = "Zeige mehrere Ergebnisfenster", -- src\editor\toolbar.lua
+ ["Show tooltip for current position; place cursor after opening bracket of function"] = "Zeige Tooltip für aktuelle Position; setze Cursor hinter die öffnende Klammer der Funktion", -- src\editor\menu_edit.lua
+ ["Show/Hide the status bar"] = "Statuszeile zeigen/verstecken", -- src\editor\menu_view.lua
+ ["Show/Hide the toolbar"] = "Werkzeugleiste zeigen/verstecken", -- src\editor\menu_view.lua
+ ["Sort By Name"] = "Sortiere nach Namen", -- src\editor\outline.lua
+ ["Sort selected lines"] = "Ausgewählte Zeilen sortieren", -- src\editor\menu_edit.lua
+ ["Source"] = "Source", -- src\editor\menu_edit.lua
+ ["Stack"] = "Stack", -- src\editor\debugger.lua
+ ["Start &Debugging"] = "&Debugging starten", -- src\editor\menu_project.lua
+ ["Start or continue debugging"] = "Debuggen starten/fortsetzen", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step &Into"] = "Schritt h&inein", -- src\editor\menu_project.lua
+ ["Step &Over"] = "&Überspringen", -- src\editor\menu_project.lua
+ ["Step O&ut"] = "Schritt &raus", -- src\editor\menu_project.lua
+ ["Step into"] = "Schritt hinein", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step out of the current function"] = "Schritt aus der aktuellen Funktion heraus", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step over"] = "Überspringen", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop debugging and continue running the process"] = "Beende debuggen und setze den Prozeß fort", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop the currently running process"] = "Aktuell laufenden Prozeß stoppen", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Switch to or from full screen mode"] = "Vollbild an/aus", -- src\editor\menu_view.lua
+ ["Symbol Index"] = "Symbolindex", -- src\editor\outline.lua
+ ["Text not found."] = "Text nicht gefunden.", -- src\editor\findreplace.lua
+ ["The API file must be located in a subdirectory of the API directory."] = "Die API-Datei muß sich in einem Unterverzeichnis des API-Verzeichnisses befinden.", -- src\editor\autocomplete.lua
+ ["Toggle Bookmark"] = "Lesezeichen setzen/löschen", -- src\editor\markers.lua, src\editor\menu_edit.lua
+ ["Toggle Breakpoint"] = "Haltepunkt an/aus", -- src\editor\markers.lua, src\editor\menu_project.lua
+ ["Toggle bookmark"] = "Lesezeichen setzen/löschen", -- src\editor\toolbar.lua, src\editor\menu_edit.lua, src\editor\markers.lua
+ ["Toggle breakpoint"] = "Haltepunkt an/aus", -- src\editor\markers.lua, src\editor\toolbar.lua
+ ["Tr&ace"] = "Ablauf &verfolgen", -- src\editor\menu_project.lua
+ ["Trace execution showing each executed line"] = "Ablaufverfolgung zeigt jede ausgeführte Zeile an", -- src\editor\menu_project.lua
+ ["Unable to create directory '%s'."] = "Kann kein Verzeichnis '%s' erstellen.", -- src\editor\filetree.lua
+ ["Unable to create file '%s'."] = "Kann Datei '%s' nicht erstellen.", -- src\editor\filetree.lua
+ ["Unable to delete directory '%s': %s"] = "Scheitern beim Löschen von Verzeichnis '%s': %s", -- src\editor\filetree.lua
+ ["Unable to delete file '%s': %s"] = "Kann Datei '%s' nicht löschen: %s", -- src\editor\filetree.lua
+ ["Unable to load file '%s'."] = "Scheitern beim Laden von Datei '%s'.", -- src\editor\commands.lua
+ ["Unable to rename file '%s'."] = "Scheitern beim umbenennen von Datei '%s'.", -- src\editor\filetree.lua
+ ["Unable to save file '%s': %s"] = "Scheitern beim Speichern von Datei '%s' : %s", -- src\editor\commands.lua
+ ["Unable to stop program (pid: %d), code %d."] = "Scheitern beim Stoppen des Prozesses (pid : %d), code %d.", -- src\editor\debugger.lua
+ ["Undo last edit"] = "Letzte Änderung rückgängig machen", -- src\editor\menu_edit.lua
+ ["Unmap Directory"] = "virtuelle Einbindung beenden", -- src\editor\filetree.lua
+ ["Unset '%s' As Start File"] = "'%s' ist nicht mehr Startdatei", -- src\editor\filetree.lua
+ ["Updated %d file."] = {"Eine Datei aktualisiert", "%d Dateien aktualisiert."}, -- src\editor\findreplace.lua
+ ["Updating symbol index and settings..."] = "Aktualisiere Symbolindex und Einstellungen...", -- src\editor\outline.lua
+ ["Use %s to close."] = "%s zum Schließen.", -- src\editor\findreplace.lua
+ ["Use '%s' to see full description."] = "'%s' für eine komplette Beschreibung.", -- src\editor\editor.lua
+ ["Use '%s' to show line endings and '%s' to convert them."] = "'%s' um Zeilenende-Codes zu sehen, und '%s' um sie zu konvertieren.", -- src\editor\commands.lua
+ ["Use 'clear' to clear the shell output and the history."] = "'clear' um Ausgabefenster und Verlauf zu löschen.", -- src\editor\shellbox.lua
+ ["Use Shift-Enter for multiline code."] = "<Umsch-Eingabetaste> für Code in mehreren Zeilen.", -- src\editor\shellbox.lua
+ ["View the markers window"] = nil, -- src\editor\menu_view.lua
+ ["View the outline window"] = "Übersichtsfenster ansehen", -- src\editor\menu_view.lua
+ ["View the output/console window"] = "Ausgabe-/Konsolenfenster ansehen", -- src\editor\menu_view.lua
+ ["View the project/filetree window"] = "Projekt-/Dateifenster ansehen", -- src\editor\menu_view.lua
+ ["View the stack window"] = "Stapel/Stack-Fenster ansehen", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["View the watch window"] = "Fenster für Beobachtungspunkte ansehen", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["Watch"] = "Beobachtungspunkte", -- src\editor\debugger.lua
+ ["Welcome to the interactive Lua interpreter."] = "Willkommen zum interaktiven Lua-Interpretr!", -- src\editor\shellbox.lua
+ ["Wrap around"] = "Am Anfang fortsetzen", -- src\editor\toolbar.lua
+ ["You must save the program first."] = "Erst das Programm speichern.", -- src\editor\commands.lua
+ ["Zoom In"] = "Hineinzoomen", -- src\editor\menu_view.lua
+ ["Zoom Out"] = "Herauszoomen", -- src\editor\menu_view.lua
+ ["Zoom to 100%"] = "Zoom zurücksetzen (100%)", -- src\editor\menu_view.lua
+ ["Zoom"] = "Zoom", -- src\editor\menu_view.lua
+ ["on line %d"] = "in Zeile %d", -- src\editor\debugger.lua, src\editor\editor.lua, src\editor\commands.lua
+ ["traced %d instruction"] = {"%d Anweisung verfolgt", "%d Anweisungen verfolgt"}, -- src\editor\debugger.lua
+ ["unknown error"] = "Unbekannter Fehler", -- src\editor\debugger.lua
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/en.lua b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/en.lua
new file mode 100644
index 0000000..16e9b98
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/en.lua
@@ -0,0 +1,7 @@
+return {
+ [0] = function(c) return c == 1 and 1 or 2 end, -- plural
+ ["traced %d instruction"] = {"traced %d instruction", "traced %d instructions"}, -- src\editor\debugger.lua
+ ["Found %d instance."] = {"Found %d instance.", "Found %d instances."}, -- src\editor\findreplace.lua
+ ["Replaced %d instance."] = {"Replaced %d instance.", "Replaced %d instances."}, -- src\editor\findreplace.lua
+ ["Updated %d file."] = {"Updated %d file.", "Updated %d files."}, -- src\editor\findreplace.lua
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/eo.lua b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/eo.lua
new file mode 100644
index 0000000..4d3d2fd
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/eo.lua
@@ -0,0 +1,346 @@
+--- Traduko fare de cosmotect
+return {
+ [0] = function(c) return c == 1 and 1 or 2 end, -- plural
+ ["%s event failed: %s"] = "%s evento malplenumiĝas: %s", -- src\editor\package.lua
+ ["%s%% formatted..."] = nil, -- src\editor\print.lua
+ ["%s%% loaded..."] = nil, -- src\editor\commands.lua
+ ["&About"] = "&Pri", -- src\editor\menu_help.lua
+ ["&Add Watch"] = "&Aldoni observadaĵon", -- src\editor\debugger.lua
+ ["&Break"] = "&Haltigi", -- src\editor\menu_project.lua
+ ["&Close Page"] = "&Fermi paĝon", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Community"] = "&Komunumo", -- src\editor\menu_help.lua
+ ["&Compile"] = "&Kompili", -- src\editor\menu_project.lua
+ ["&Copy Value"] = nil, -- src\editor\debugger.lua
+ ["&Copy"] = "&Kopii", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Default Layout"] = "&Defaŭlta aranĝo", -- src\editor\menu_view.lua
+ ["&Delete Watch"] = "&Forigi observadaĵon", -- src\editor\debugger.lua
+ ["&Delete"] = "&Forigi", -- src\editor\filetree.lua
+ ["&Documentation"] = "&Dokumentado", -- src\editor\menu_help.lua
+ ["&Edit Project Directory"] = "&Redakti projektan dosierujon", -- src\editor\filetree.lua
+ ["&Edit Value"] = "&Redakti valoron", -- src\editor\debugger.lua
+ ["&Edit Watch"] = "&Redakti observadaĵon", -- src\editor\debugger.lua
+ ["&Edit"] = "&Redakti", -- src\editor\menu_edit.lua
+ ["&File"] = "&Dosiero", -- src\editor\menu_file.lua
+ ["&Find"] = "Tra&serĉi", -- src\editor\menu_search.lua
+ ["&Fold/Unfold All"] = "&Kaŝi/Malkaŝi ĉion", -- src\editor\menu_edit.lua
+ ["&Frequently Asked Questions"] = "&Oftaj demandoj", -- src\editor\menu_help.lua
+ ["&Getting Started Guide"] = "&Ekgvidilo", -- src\editor\menu_help.lua
+ ["&Help"] = "&Helpo", -- src\editor\menu_help.lua
+ ["&New Directory"] = "&Nova dosierujo", -- src\editor\filetree.lua
+ ["&New"] = "&Nova paĝo", -- src\editor\menu_file.lua
+ ["&Open..."] = "&Malfermi...", -- src\editor\menu_file.lua
+ ["&Output/Console Window"] = "&Eliga/Konzola fenestro", -- src\editor\menu_view.lua
+ ["&Paste"] = "&Alglui", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Print..."] = nil, -- src\editor\print.lua
+ ["&Project Page"] = "&Projektpaĝo", -- src\editor\menu_help.lua
+ ["&Project"] = "&Projekto", -- src\editor\menu_project.lua
+ ["&Redo"] = "&Refari", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Rename"] = "&Renomigi", -- src\editor\filetree.lua
+ ["&Replace"] = "&Anstataŭi", -- src\editor\menu_search.lua
+ ["&Run"] = "&Plenumi", -- src\editor\menu_project.lua
+ ["&Save"] = "&Konservi", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Search"] = "&Serĉi", -- src\editor\menu_search.lua
+ ["&Select Command"] = nil, -- src\editor\gui.lua
+ ["&Sort"] = "&Ordi", -- src\editor\menu_edit.lua
+ ["&Stack Window"] = "&Staka fenestro", -- src\editor\menu_view.lua
+ ["&Start Debugger Server"] = "&Ekfunkciigi sencimigilo-servilon", -- src\editor\menu_project.lua
+ ["&Status Bar"] = "&Stata breto", -- src\editor\menu_view.lua
+ ["&Tool Bar"] = "&Ilobreto", -- src\editor\menu_view.lua
+ ["&Tutorials"] = "&Lerniloj", -- src\editor\menu_help.lua
+ ["&Undo"] = "&Malfari", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&View"] = "&Vidi", -- src\editor\menu_view.lua
+ ["&Watch Window"] = "&Observada fenestro", -- src\editor\menu_view.lua
+ ["About %s"] = "Pri %s", -- src\editor\menu_help.lua
+ ["Add To Scratchpad"] = "Aldoni al malnetdosiero", -- src\editor\editor.lua
+ ["Add Watch Expression"] = "Aldoni observadaĵan esprimon", -- src\editor\editor.lua
+ ["All files"] = "Ĉiuj dosieroj", -- src\editor\commands.lua
+ ["Allow external process to start debugging"] = "Lasi eksteran procezon ek-sencimigi", -- src\editor\menu_project.lua
+ ["Analyze the source code"] = "Analizi fontkodon", -- src\editor\inspect.lua
+ ["Analyze"] = "Analizi", -- src\editor\inspect.lua
+ ["Auto Complete Identifiers"] = "Aŭtomate kompletigi fontkodnomojn", -- src\editor\menu_edit.lua
+ ["Auto complete while typing"] = "Aŭtomate kompletigi dumtajpe", -- src\editor\menu_edit.lua
+ ["Binary file is shown as read-only as it is only partially loaded."] = nil, -- src\editor\commands.lua
+ ["Bookmark"] = "Legosigno", -- src\editor\menu_edit.lua
+ ["Break execution at the next executed line of code"] = "Haltigi plenumon ĉe la sekva plenumata linio da fontkodo", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Breakpoint"] = nil, -- src\editor\menu_project.lua
+ ["C&lear Console Window"] = nil, -- src\editor\gui.lua
+ ["C&lear Output Window"] = "Viŝi eligan fenestron", -- src\editor\gui.lua, src\editor\menu_project.lua
+ ["C&omment/Uncomment"] = "F&orkomenti/Eksforkomenti", -- src\editor\menu_edit.lua
+ ["Can't evaluate the expression while the application is running."] = "Ne povas malkodi la esprimon dum funkciatas la aplikaĵo.", -- src\editor\debugger.lua
+ ["Can't open file '%s': %s"] = "Ne povas malfermi la dosieron '%s': %s", -- src\editor\findreplace.lua, src\editor\singleinstance.lua, src\editor\inspect.lua, src\editor\outline.lua
+ ["Can't process auto-recovery record; invalid format: %s."] = "Ne povas analizi aŭtomatrestaŭran dosieron; neprava dosierformo: %s.", -- src\editor\commands.lua
+ ["Can't replace in read-only text."] = nil, -- src\editor\findreplace.lua
+ ["Can't run the entry point script ('%s')."] = "Ne povas plenumi la enirejan skripton", -- src\editor\debugger.lua
+ ["Can't start debugger server at %s:%d: %s."] = "Ne povas ekfunkciigi sencimigilo-servilon ĉe %s:%d: %s.", -- src\editor\debugger.lua
+ ["Can't start debugging for '%s'."] = nil, -- src\editor\debugger.lua
+ ["Can't start debugging session due to internal error '%s'."] = "Ne povas komenci sencimigan seancon pro interna eraro", -- src\editor\debugger.lua
+ ["Can't start debugging without an opened file or with the current file not being saved ('%s')."] = "Ne povas ek-sencimigon sen malfermita dosiero aŭ kun la kuranta dosiero nekonserviĝas ('%s').", -- src\editor\debugger.lua
+ ["Can't stop debugger server as it is not started."] = "Ne povas malfunkciigi sencimigilo-servilon, ĉar ĝi ne funkciantas", -- src\editor\debugger.lua
+ ["Cancelled by the user."] = "Nuligita per la uzanto", -- src\editor\findreplace.lua
+ ["Choose a directory to map"] = nil, -- src\editor\filetree.lua
+ ["Choose a project directory"] = "Elekti projektan dosierujon", -- src\editor\toolbar.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Choose a search directory"] = nil, -- src\editor\findreplace.lua
+ ["Choose..."] = "Elekti...", -- src\editor\findreplace.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Clear Items"] = "Viŝi anojn", -- src\editor\findreplace.lua, src\editor\menu_file.lua
+ ["Clear items from this list"] = "Senlistigi tiujn ĉi anojn", -- src\editor\menu_file.lua
+ ["Clear the output window before compiling or debugging"] = "Viŝi la eligan fenestron antaŭ kompilado aŭ sencimigado", -- src\editor\menu_project.lua
+ ["Close &Other Pages"] = "Fermi &aliajn paĝojn", -- src\editor\gui.lua
+ ["Close A&ll Pages"] = "Fermi ĉiujn paĝojn", -- src\editor\gui.lua
+ ["Close the current editor window"] = "Fermi la kurantan redaktilan fenestron", -- src\editor\menu_file.lua
+ ["Co&ntinue"] = "Daŭrigi", -- src\editor\menu_project.lua
+ ["Col: %d"] = "Kol: %d", -- src\editor\editor.lua
+ ["Command Line Parameters..."] = "Komandliniaj parametroj", -- src\editor\menu_project.lua
+ ["Command line parameters"] = "Komandliniaj parametroj", -- src\editor\menu_project.lua
+ ["Comment or uncomment current or selected lines"] = "Forkomenti aŭ eksforkomenti la kurantan aŭ la elektitajn liniojn", -- src\editor\menu_edit.lua
+ ["Compilation error"] = "Eraro de kompilo", -- src\editor\commands.lua, src\editor\debugger.lua
+ ["Compilation successful; %.0f%% success rate (%d/%d)."] = "Kompilo sukcesa; %.0f%% elcentaĵo da sukceso (%d/%d).", -- src\editor\commands.lua
+ ["Compile the current file"] = "Kompili la kurantan dosieron", -- src\editor\menu_project.lua
+ ["Complete &Identifier"] = "Finfari &fontkodnomon", -- src\editor\menu_edit.lua
+ ["Complete the current identifier"] = "Finfari la kurantan fontkodnomon", -- src\editor\menu_edit.lua
+ ["Consider removing backslash from escape sequence '%s'."] = "Kontemplu forigi maloblikvon el eskapsekvenco '%s'.", -- src\editor\commands.lua
+ ["Copy Full Path"] = "Kopii plenan vojon", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Copy selected text to clipboard"] = "Kopii elektitan tekston al la tondejo", -- src\editor\menu_edit.lua
+ ["Correct &Indentation"] = "Korekti &alineon", -- src\editor\menu_edit.lua
+ ["Couldn't activate file '%s' for debugging; continuing without it."] = "Ne povis aktivi la dosieron '%s' por sencimigi; daŭrantas sen ĝi.", -- src\editor\debugger.lua
+ ["Create an empty document"] = "Krei malplenan dokumenton", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Cu&t"] = "El&tondi", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Cut selected text to clipboard"] = "Eltondi la elektitan tekston al la tondejo", -- src\editor\menu_edit.lua
+ ["Debugger server started at %s:%d."] = "Sencimigilo-servilon ekfunkciiĝis ĉe %s:%d.", -- src\editor\debugger.lua
+ ["Debugger server stopped at %s:%d."] = "Sencimigilo-servilon malfunkciiĝis ĉe %s:%d.", -- src\editor\debugger.lua
+ ["Debugging session completed (%s)."] = "Sencimiga seanco estas finita (%s).", -- src\editor\debugger.lua
+ ["Debugging session started in '%s'."] = "Sencimiga seanco komencitas en '%s'.", -- src\editor\debugger.lua
+ ["Debugging suspended at '%s:%s' (couldn't activate the file)."] = "La sencimigo estis finetita ĉe '%s:%s' (ne povis aktivi la dosieron).", -- src\editor\debugger.lua
+ ["Detach &Process"] = "Deigi &procezon", -- src\editor\menu_project.lua
+ ["Disable Indexing For '%s'"] = nil, -- src\editor\outline.lua
+ ["Do you want to delete '%s'?"] = "Ĉu vi volas forigi je '%s'?", -- src\editor\filetree.lua
+ ["Do you want to overwrite it?"] = "Ĉu vi volas superskribi ĉi tiun?", -- src\editor\commands.lua
+ ["Do you want to reload it?"] = "Ĉu vi volas reŝarĝi tiun ĉi?", -- src\editor\editor.lua
+ ["Do you want to save the changes to '%s'?"] = "Ĉu vi volas konservi ĉiujn ŝanĝojn, kiuj enfaris je '%s'?", -- src\editor\commands.lua
+ ["E&xit"] = "&Eliri", -- src\editor\menu_file.lua
+ ["Enable Indexing"] = nil, -- src\editor\outline.lua
+ ["Enter Lua code and press Enter to run it."] = "Enigu fontkodon de Lua kaj premu enenklavon por plenumi ĝin.", -- src\editor\shellbox.lua
+ ["Enter command line parameters (use Cancel to clear)"] = "Enigu komandliniajn parametrojn (uzu nulig-butonon por viŝi)", -- src\editor\menu_project.lua
+ ["Enter replacement text"] = "Enigu anstataŭigan tekston", -- src\editor\editor.lua
+ ["Error while loading API file: %s"] = "Eraro okazis dum ŝargado de API-a dosiero: %s", -- src\editor\autocomplete.lua
+ ["Error while loading configuration file: %s"] = "Eraro okazis dum ŝargado de agorda dosiero: %s", -- src\editor\style.lua
+ ["Error while processing API file: %s"] = "Eraro okazis dum analizado de API-a dosiero: %s", -- src\editor\autocomplete.lua
+ ["Error while processing configuration file: %s"] = "Eraro okazis dum analizado de agorda dosiero: %s", -- src\editor\style.lua
+ ["Error"] = "Eraro", -- src\editor\commands.lua
+ ["Evaluate In Console"] = "Malkodi en la konzolo", -- src\editor\editor.lua
+ ["Execute the current project/file and keep updating the code to see immediate results"] = "Plenumi la kurantan projekton/dosieron, kaj ĝisdatigadi la fontkodon por vidi tujajn rezultojn", -- src\editor\menu_project.lua
+ ["Execute the current project/file"] = "Plenumi la kurantan projekton/dosieron", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Execution error"] = "Eraro de plenumo", -- src\editor\debugger.lua
+ ["Exit program"] = "Eliri programon", -- src\editor\menu_file.lua
+ ["File '%s' has been modified on disk."] = "La dosiero nome de '%s' ŝanĝitis en disko.", -- src\editor\editor.lua
+ ["File '%s' has more recent timestamp than restored '%s'; please review before saving."] = "La dosiero nome de '%s' havas pli freŝan tempindikon, ol la ripardosiero '%s'; bonvolu ekzameni ĝin antaû konservi.", -- src\editor\commands.lua
+ ["File '%s' is missing and can't be recovered."] = "La dosiero nome de '%s' forestas kaj ne povas esti reakirita.", -- src\editor\commands.lua
+ ["File '%s' no longer exists."] = "La dosiero nome de '%s' ne plu ekzistas.", -- src\editor\menu_file.lua, src\editor\editor.lua
+ ["File already exists."] = "Jam ekzistas tiu ĉi dosiero.", -- src\editor\commands.lua
+ ["File history"] = "Dosiera historio", -- src\editor\menu_file.lua
+ ["Find &In Files"] = "Traserĉi &en dosieroj", -- src\editor\menu_search.lua
+ ["Find &Next"] = "&Pluserĉi", -- src\editor\menu_search.lua
+ ["Find &Previous"] = "Traserĉi &antaŭanta", -- src\editor\menu_search.lua
+ ["Find and insert library function"] = nil, -- src\editor\menu_search.lua
+ ["Find and replace text in files"] = "Traserĉi kaj anstataŭi tekston en dosieroj", -- src\editor\menu_search.lua
+ ["Find and replace text"] = "Traserĉi kaj anstataŭi tekston", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find in files"] = "Traserĉi en dosieroj", -- src\editor\toolbar.lua
+ ["Find text in files"] = "Traserĉi tekston en dosieroj", -- src\editor\menu_search.lua
+ ["Find text"] = "Traserĉi tekston", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find the earlier text occurence"] = "Traserĉi la antaŭantan aperaĵon da teksto", -- src\editor\menu_search.lua
+ ["Find the next text occurrence"] = "Pluserĉi la aperaĵon da teksto", -- src\editor\menu_search.lua
+ ["Find"] = "Traserĉi", -- src\editor\toolbar.lua
+ ["Fold or unfold all code folds"] = "Kaŝi aŭ malkaŝi ĉiujn faldaĵojn da fontkodoj", -- src\editor\menu_edit.lua
+ ["Formatting page %d..."] = nil, -- src\editor\print.lua
+ ["Found %d instance."] = {}, -- src\editor\findreplace.lua
+ ["Found auto-recovery record and restored saved session."] = "Trovis aŭtomatrestaŭran dosieron kaj riparis konservitan seancon.", -- src\editor\commands.lua
+ ["Full &Screen"] = "Plenekrana &reĝimo", -- src\editor\menu_view.lua
+ ["Go To Definition"] = "Iri al deklaro", -- src\editor\editor.lua
+ ["Go To File..."] = nil, -- src\editor\menu_search.lua
+ ["Go To Line..."] = "Iri al linio...", -- src\editor\menu_search.lua
+ ["Go To Next Bookmark"] = "Iri al sekvanta legosigno", -- src\editor\menu_edit.lua
+ ["Go To Next Breakpoint"] = nil, -- src\editor\menu_project.lua
+ ["Go To Previous Bookmark"] = "Iri al antaŭanta legosigno", -- src\editor\menu_edit.lua
+ ["Go To Previous Breakpoint"] = nil, -- src\editor\menu_project.lua
+ ["Go To Symbol..."] = nil, -- src\editor\menu_search.lua
+ ["Go to file"] = nil, -- src\editor\menu_search.lua
+ ["Go to line"] = "Iri al linio", -- src\editor\menu_search.lua
+ ["Go to symbol"] = nil, -- src\editor\menu_search.lua
+ ["Hide '.%s' Files"] = nil, -- src\editor\filetree.lua
+ ["INS"] = "INS", -- src\editor\editor.lua
+ ["Ignore and don't index symbols from files in the selected directory"] = nil, -- src\editor\outline.lua
+ ["Ignored error in debugger initialization code: %s."] = "Ignoris eraron en pravaloriza kodo de la sencimigilo: %s.", -- src\editor\debugger.lua
+ ["Indexing %d files: '%s'..."] = nil, -- src\editor\outline.lua
+ ["Indexing completed."] = nil, -- src\editor\outline.lua
+ ["Insert Library Function..."] = nil, -- src\editor\menu_search.lua
+ ["Known Files"] = "Konataj dosieroj", -- src\editor\commands.lua
+ ["Ln: %d"] = "Ln: %d", -- src\editor\editor.lua
+ ["Local console"] = "Loka konzolo", -- src\editor\gui.lua, src\editor\shellbox.lua
+ ["Lua &Interpreter"] = "Interpretilo de Lua", -- src\editor\menu_project.lua
+ ["Map Directory..."] = nil, -- src\editor\filetree.lua
+ ["Mapped remote request for '%s' to '%s'."] = "Mapi faran peton pri '%s' al '%s'.", -- src\editor\debugger.lua
+ ["Markers Window"] = nil, -- src\editor\menu_view.lua
+ ["Markers"] = nil, -- src\editor\markers.lua
+ ["Match case"] = "Atenti usklecon", -- src\editor\toolbar.lua
+ ["Match whole word"] = "Atenti plenan vorton", -- src\editor\toolbar.lua
+ ["Mixed end-of-line encodings detected."] = "Detektis kodoprezentojn miksitajn linifinajn", -- src\editor\commands.lua
+ ["Navigate"] = nil, -- src\editor\menu_search.lua
+ ["New &File"] = "Nova &dosiero", -- src\editor\filetree.lua
+ ["OVR"] = "SUS", -- src\editor\editor.lua
+ ["Open With Default Program"] = "Malfermi per la defaŭlta programo", -- src\editor\filetree.lua
+ ["Open an existing document"] = "Malfermi jaman dokumenton", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Open file"] = "Malfermi dosieron", -- src\editor\commands.lua
+ ["Outline Window"] = "Skemo-fenestro", -- src\editor\menu_view.lua
+ ["Outline"] = "Skemo", -- src\editor\outline.lua
+ ["Output (running)"] = "Eligo (funkciata)", -- src\editor\debugger.lua, src\editor\output.lua
+ ["Output (suspended)"] = "Eligo (finetita)", -- src\editor\debugger.lua
+ ["Output"] = "Eligo", -- src\editor\debugger.lua, src\editor\output.lua, src\editor\gui.lua, src\editor\settings.lua
+ ["Page Setup..."] = nil, -- src\editor\print.lua
+ ["Paste text from the clipboard"] = "Alglui tekston el la tondejo", -- src\editor\menu_edit.lua
+ ["Preferences"] = "Preferoj", -- src\editor\menu_edit.lua
+ ["Prepend '!' to force local execution."] = "Antaŭdoni je '!' por altrudi lokan plenumon.", -- src\editor\shellbox.lua
+ ["Prepend '=' to show complex values on multiple lines."] = "Antaŭdoni je '=' por montri komplikajn valorojn sur multaj linioj.", -- src\editor\shellbox.lua
+ ["Press cancel to abort."] = "Premu nulig-butonon por fini.", -- src\editor\commands.lua
+ ["Print the current document"] = nil, -- src\editor\print.lua
+ ["Program '%s' started in '%s' (pid: %d)."] = "La programo nome de '%s' komencitas en '%s' (pid: %d).", -- src\editor\output.lua
+ ["Program can't start because conflicting process is running as '%s'."] = "La programo ne povas komenci, ĉar konflikta procezo funkcias kiel je la '%s'.", -- src\editor\output.lua
+ ["Program completed in %.2f seconds (pid: %d)."] = "La programo finfaris post %.2f sekundoj", -- src\editor\output.lua
+ ["Program starting as '%s'."] = "La programo komencas kiel je '%s'.", -- src\editor\output.lua
+ ["Program stopped (pid: %d)."] = "La programo finis (pid: %d).", -- src\editor\debugger.lua
+ ["Program unable to run as '%s'."] = "La programo ne kapablas plenumi kiel je '%s'.", -- src\editor\output.lua
+ ["Project Directory"] = "Projekta dosierujo", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Project history"] = "Projekta historio", -- src\editor\menu_file.lua
+ ["Project"] = "Projekto", -- src\editor\filetree.lua
+ ["Project/&FileTree Window"] = "Projekta/&Dosierarba Fenestro", -- src\editor\menu_view.lua
+ ["Provide command line parameters"] = "Doni komandliniajn parametrojn", -- src\editor\menu_project.lua
+ ["Queued %d files to index."] = nil, -- src\editor\menu_search.lua
+ ["R/O"] = "L/A", -- src\editor\editor.lua
+ ["R/W"] = "L/S", -- src\editor\editor.lua
+ ["Re&place In Files"] = "Anstataŭi en dosieroj", -- src\editor\menu_search.lua
+ ["Re-indent selected lines"] = "Realinei elektitajn liniojn", -- src\editor\menu_edit.lua
+ ["Reached end of selection and wrapped around."] = nil, -- src\editor\findreplace.lua
+ ["Reached end of text and wrapped around."] = nil, -- src\editor\findreplace.lua
+ ["Recent Files"] = "Antaŭnelongaj dosieroj", -- src\editor\menu_file.lua
+ ["Recent Projects"] = "Antaŭnelongaj projektoj", -- src\editor\menu_file.lua
+ ["Redo last edit undone"] = "Refari lastan redakton", -- src\editor\menu_edit.lua
+ ["Refresh Index"] = nil, -- src\editor\outline.lua
+ ["Refresh indexed symbols from files in the selected directory"] = nil, -- src\editor\outline.lua
+ ["Refresh"] = "Refreŝigu", -- src\editor\filetree.lua
+ ["Refused a request to start a new debugging session as there is one in progress already."] = "Peto por komenci novan sencimigan seancon malakceptis, ĉar seanco jam faratas.", -- src\editor\debugger.lua
+ ["Regular expression"] = "Regul&esprimo", -- src\editor\toolbar.lua
+ ["Remote console"] = "Fora konzolo", -- src\editor\shellbox.lua
+ ["Rename All Instances"] = "Renomigi ĉiujn aperaĵojn", -- src\editor\editor.lua
+ ["Replace All Selections"] = "Anstataŭi ĉiujn elektojn", -- src\editor\editor.lua
+ ["Replace all"] = "Anstataŭi ĉion", -- src\editor\toolbar.lua
+ ["Replace next instance"] = nil, -- src\editor\toolbar.lua
+ ["Replaced %d instance."] = {}, -- src\editor\findreplace.lua
+ ["Replaced an invalid UTF8 character with %s."] = "Anstataŭis UTF8-an signon per %s.", -- src\editor\commands.lua
+ ["Reset to default layout"] = "Rekomenciĝi al defaŭltan aranĝon", -- src\editor\menu_view.lua
+ ["Run As Scratchpad"] = "Plenumi kiel malnetdosieron", -- src\editor\menu_project.lua
+ ["Run To Cursor"] = nil, -- src\editor\menu_project.lua, src\editor\editor.lua
+ ["Run as Scratchpad"] = "Plenumi kiel malnetdosieron", -- src\editor\toolbar.lua
+ ["Run to cursor"] = nil, -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["S&top Debugging"] = "&Fini sencimigo", -- src\editor\menu_project.lua
+ ["S&top Process"] = "&Fini procezon", -- src\editor\menu_project.lua
+ ["Save &As..."] = "Konservi &kiel...", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["Save A&ll"] = "Konservi ĉ&ion", -- src\editor\menu_file.lua
+ ["Save Changes?"] = "Ĉu konservi ĉiujn ŝanĝojn?", -- src\editor\commands.lua
+ ["Save all open documents"] = "Konservi ĉiujn malfermajn dokumentojn", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Save file as"] = "Konservi dosieron kiel", -- src\editor\commands.lua
+ ["Save file?"] = "Ĉu konservi dosieron?", -- src\editor\commands.lua
+ ["Save the current document to a file with a new name"] = "Konservi la kurantan dokumenton kun dosiero novanome", -- src\editor\menu_file.lua
+ ["Save the current document"] = "Konservi la kurantan dokumenton", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Saved auto-recover at %s."] = "Konservis aŭtomatrestaŭron je %s.", -- src\editor\commands.lua
+ ["Scratchpad error"] = "Eraro de malnetdosiero", -- src\editor\debugger.lua
+ ["Search direction"] = nil, -- src\editor\toolbar.lua
+ ["Search in selection"] = nil, -- src\editor\toolbar.lua
+ ["Search in subdirectories"] = nil, -- src\editor\toolbar.lua
+ ["Searching for '%s'."] = nil, -- src\editor\findreplace.lua
+ ["Sel: %d/%d"] = "Ele: %d/%d", -- src\editor\editor.lua
+ ["Select &All"] = "Elekti &ĉion", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Select And Find Next"] = "Elekti kaj pluserĉi", -- src\editor\menu_search.lua
+ ["Select And Find Previous"] = "Elekti kaj traserĉi antaŭantan", -- src\editor\menu_search.lua
+ ["Select all text in the editor"] = "Elekti la tekston en la redaktilo", -- src\editor\menu_edit.lua
+ ["Select the word under cursor and find its next occurrence"] = "Elekti la vorton sub la tajpmontrilo, kaj pluserĉi", -- src\editor\menu_search.lua
+ ["Select the word under cursor and find its previous occurrence"] = "Elekti la vorton sub la tajpmontrilo, kaj traserĉi antaŭantan", -- src\editor\menu_search.lua
+ ["Set As Start File"] = nil, -- src\editor\filetree.lua
+ ["Set From Current File"] = "Precizigi per la kuranta dosiero", -- src\editor\menu_project.lua
+ ["Set To Project Directory"] = nil, -- src\editor\findreplace.lua
+ ["Set To Selected Directory"] = nil, -- src\editor\filetree.lua
+ ["Set project directory from current file"] = "Precizigi la projektan dosierujon per la kurantan dosieron", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Set project directory to the selected one"] = nil, -- src\editor\filetree.lua
+ ["Set search directory"] = nil, -- src\editor\toolbar.lua
+ ["Set the interpreter to be used"] = "Precizigi la interpretiloton", -- src\editor\menu_project.lua
+ ["Set the project directory to be used"] = "Precizigi la projekt-dosierujoton", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Settings: System"] = "Agordoj de la sistemo", -- src\editor\menu_edit.lua
+ ["Settings: User"] = "Agordoj de la uzanto", -- src\editor\menu_edit.lua
+ ["Show &Tooltip"] = "Montri &ŝpruchelpilon", -- src\editor\menu_edit.lua
+ ["Show All Files"] = nil, -- src\editor\filetree.lua
+ ["Show Hidden Files"] = nil, -- src\editor\filetree.lua
+ ["Show Location"] = "Montri lokon", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Show all files"] = nil, -- src\editor\filetree.lua
+ ["Show context"] = nil, -- src\editor\toolbar.lua
+ ["Show files previously hidden"] = nil, -- src\editor\filetree.lua
+ ["Show multiple result windows"] = nil, -- src\editor\toolbar.lua
+ ["Show tooltip for current position; place cursor after opening bracket of function"] = "Montri ŝpruchelpilon pri la kuranta pozicio; meti la tajpmontrilon preter la ronda ekkrampo de la funkcio", -- src\editor\menu_edit.lua
+ ["Show/Hide the status bar"] = "Montri/Kaŝi la statan breton", -- src\editor\menu_view.lua
+ ["Show/Hide the toolbar"] = "Montri/Kaŝi la ilobreton", -- src\editor\menu_view.lua
+ ["Sort By Name"] = nil, -- src\editor\outline.lua
+ ["Sort selected lines"] = "Ordi la elektitajn liniojn", -- src\editor\menu_edit.lua
+ ["Source"] = "Fontkodo", -- src\editor\menu_edit.lua
+ ["Stack"] = "Stako", -- src\editor\debugger.lua
+ ["Start &Debugging"] = "Ek-&sencimigi", -- src\editor\menu_project.lua
+ ["Start or continue debugging"] = "Komenci aŭ pluigi sencimigon", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step &Into"] = "Eniri &enen", -- src\editor\menu_project.lua
+ ["Step &Over"] = "Trans&salti", -- src\editor\menu_project.lua
+ ["Step O&ut"] = "Eliri el", -- src\editor\menu_project.lua
+ ["Step into"] = "Eniri enen", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step out of the current function"] = "Eliri el la kuranta funkcio", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step over"] = "Transsalti", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop debugging and continue running the process"] = "Fini sencimigon kaj plenumadi la procezon", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop the currently running process"] = "Fini la nunfunkciatan procezon", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Switch to or from full screen mode"] = "Interŝanĝi al aŭ el plenekrana reĝimo", -- src\editor\menu_view.lua
+ ["Symbol Index"] = nil, -- src\editor\outline.lua
+ ["Text not found."] = "Teksto ne trovitis", -- src\editor\findreplace.lua
+ ["The API file must be located in a subdirectory of the API directory."] = "La dosiero de API devas troviĝi en subdosierujo de la API-a dosierujo.", -- src\editor\autocomplete.lua
+ ["Toggle Bookmark"] = "Baskuli legosignon", -- src\editor\markers.lua, src\editor\menu_edit.lua
+ ["Toggle Breakpoint"] = "Baskuli haltopunkto", -- src\editor\markers.lua, src\editor\menu_project.lua
+ ["Toggle bookmark"] = "Baskuli legosignon", -- src\editor\toolbar.lua, src\editor\menu_edit.lua, src\editor\markers.lua
+ ["Toggle breakpoint"] = "Baskuli haltopunkto", -- src\editor\markers.lua, src\editor\toolbar.lua
+ ["Tr&ace"] = "Spuri", -- src\editor\menu_project.lua
+ ["Trace execution showing each executed line"] = "Spurili plenumon per montri ĉiun plenumitan linion", -- src\editor\menu_project.lua
+ ["Unable to create directory '%s'."] = "Ne kapablas krei je la dosierujo '%s'.", -- src\editor\filetree.lua
+ ["Unable to create file '%s'."] = "Ne kapablas krei je la dosiero '%s'.", -- src\editor\filetree.lua
+ ["Unable to delete directory '%s': %s"] = "Ne kapablas forigi je la dosierujo '%s': %s", -- src\editor\filetree.lua
+ ["Unable to delete file '%s': %s"] = nil, -- src\editor\filetree.lua
+ ["Unable to load file '%s'."] = "Ne kapablas ŝarĝi je la dosiero '%s'.", -- src\editor\commands.lua
+ ["Unable to rename file '%s'."] = "Ne kapablas renomigi je la dosiero '%s'.", -- src\editor\filetree.lua
+ ["Unable to save file '%s': %s"] = "Ne kapablas konservi je la dosiero '%s': %s", -- src\editor\commands.lua
+ ["Unable to stop program (pid: %d), code %d."] = "Ne kapablas fini la programon (pid: %d), kodo %d.", -- src\editor\debugger.lua
+ ["Undo last edit"] = "Malfari la antaŭan redakton", -- src\editor\menu_edit.lua
+ ["Unmap Directory"] = nil, -- src\editor\filetree.lua
+ ["Unset '%s' As Start File"] = nil, -- src\editor\filetree.lua
+ ["Updated %d file."] = {}, -- src\editor\findreplace.lua
+ ["Updating symbol index and settings..."] = nil, -- src\editor\outline.lua
+ ["Use %s to close."] = nil, -- src\editor\findreplace.lua
+ ["Use '%s' to see full description."] = "Uzu je '%s' por vidi plenan priskribon", -- src\editor\editor.lua
+ ["Use '%s' to show line endings and '%s' to convert them."] = "Uzu je '%s' por montri linifinojn kaj je '%s' por konverti ilin", -- src\editor\commands.lua
+ ["Use 'clear' to clear the shell output and the history."] = "Tajpu 'clear' por viŝi la eligon kaj historion de la ŝelo.", -- src\editor\shellbox.lua
+ ["Use Shift-Enter for multiline code."] = "Uzu <Majuskligklavon-Enenklavon> por plurlinia fontkodo.", -- src\editor\shellbox.lua
+ ["View the markers window"] = nil, -- src\editor\menu_view.lua
+ ["View the outline window"] = "Vidi la skemo-fenestron", -- src\editor\menu_view.lua
+ ["View the output/console window"] = "Vidi la eligo/konzolo-fenestron", -- src\editor\menu_view.lua
+ ["View the project/filetree window"] = "Vidi la projekto/dosierarbo-fenestron", -- src\editor\menu_view.lua
+ ["View the stack window"] = "Vidi la stako-fenestron", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["View the watch window"] = "Vidi la observado-fenestron", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["Watch"] = "Observado", -- src\editor\debugger.lua
+ ["Welcome to the interactive Lua interpreter."] = "Bonvenon al la interaga interpretilo de Lua.", -- src\editor\shellbox.lua
+ ["Wrap around"] = "Ĉirkaŭflui", -- src\editor\toolbar.lua
+ ["You must save the program first."] = "Vi unue devas konservi la programon.", -- src\editor\commands.lua
+ ["Zoom In"] = "Zomi", -- src\editor\menu_view.lua
+ ["Zoom Out"] = "Malzomi", -- src\editor\menu_view.lua
+ ["Zoom to 100%"] = "Zomi al 100%", -- src\editor\menu_view.lua
+ ["Zoom"] = "Zomo", -- src\editor\menu_view.lua
+ ["on line %d"] = "sur la linio %d", -- src\editor\debugger.lua, src\editor\editor.lua, src\editor\commands.lua
+ ["traced %d instruction"] = {"spuris je %d instrukcio", "spuris je %d instrukcioj"}, -- src\editor\debugger.lua
+ ["unknown error"] = "obskura eraro", -- src\editor\debugger.lua
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/es.lua b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/es.lua
new file mode 100644
index 0000000..a098a31
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/es.lua
@@ -0,0 +1,346 @@
+--- Traducción realiazada por Iñigo Sola
+return {
+ [0] = function(c) return c == 1 and 1 or 2 end, -- plural
+ ["%s event failed: %s"] = "El evento %s ha fallado: %s", -- src\editor\package.lua
+ ["%s%% formatted..."] = "%s%% formateado...", -- src\editor\print.lua
+ ["%s%% loaded..."] = "%s%% cargado...", -- src\editor\commands.lua
+ ["&About"] = "&Acerca de...", -- src\editor\menu_help.lua
+ ["&Add Watch"] = "&Añadir inspección", -- src\editor\debugger.lua
+ ["&Break"] = "Ruptura", -- src\editor\menu_project.lua
+ ["&Close Page"] = "&Cerrar página", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Community"] = "&Comunidad", -- src\editor\menu_help.lua
+ ["&Compile"] = "&Compilar", -- src\editor\menu_project.lua
+ ["&Copy Value"] = "&Copiar valor", -- src\editor\debugger.lua
+ ["&Copy"] = "&Copiar", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Default Layout"] = "&Diseño por defecto", -- src\editor\menu_view.lua
+ ["&Delete Watch"] = "Eliminar inspección", -- src\editor\debugger.lua
+ ["&Delete"] = "Eliminar", -- src\editor\filetree.lua
+ ["&Documentation"] = "&Documentación", -- src\editor\menu_help.lua
+ ["&Edit Project Directory"] = "&Editar directorio del proyecto", -- src\editor\filetree.lua
+ ["&Edit Value"] = "&Editar valor", -- src\editor\debugger.lua
+ ["&Edit Watch"] = "&Editar inspección", -- src\editor\debugger.lua
+ ["&Edit"] = "&Editar", -- src\editor\menu_edit.lua
+ ["&File"] = "Archivo", -- src\editor\menu_file.lua
+ ["&Find"] = "Buscar", -- src\editor\menu_search.lua
+ ["&Fold/Unfold All"] = "Plegar/desplegar todo", -- src\editor\menu_edit.lua
+ ["&Frequently Asked Questions"] = "Preguntas &Frecuentes", -- src\editor\menu_help.lua
+ ["&Getting Started Guide"] = "&Guía de iniciación", -- src\editor\menu_help.lua
+ ["&Help"] = "Ayuda", -- src\editor\menu_help.lua
+ ["&New Directory"] = "&Nuevo directorio", -- src\editor\filetree.lua
+ ["&New"] = "&Nuevo", -- src\editor\menu_file.lua
+ ["&Open..."] = "&Abrir...", -- src\editor\menu_file.lua
+ ["&Output/Console Window"] = "Salida/Consola", -- src\editor\menu_view.lua
+ ["&Paste"] = "Pegar", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Print..."] = "Im&primir", -- src\editor\print.lua
+ ["&Project Page"] = "&Página de proyecto", -- src\editor\menu_help.lua
+ ["&Project"] = "Proyecto", -- src\editor\menu_project.lua
+ ["&Redo"] = "Rehacer", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Rename"] = "&Renombrar", -- src\editor\filetree.lua
+ ["&Replace"] = "Remplazar", -- src\editor\menu_search.lua
+ ["&Run"] = "Ejecutar", -- src\editor\menu_project.lua
+ ["&Save"] = "Guardar", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Search"] = "Buscar", -- src\editor\menu_search.lua
+ ["&Select Command"] = "&Seleccionar comando", -- src\editor\gui.lua
+ ["&Sort"] = "Clasificar", -- src\editor\menu_edit.lua
+ ["&Stack Window"] = "Ventana de la pila de ejecución", -- src\editor\menu_view.lua
+ ["&Start Debugger Server"] = "Lanzar servidor de depuración", -- src\editor\menu_project.lua
+ ["&Status Bar"] = "Barra de e&stado", -- src\editor\menu_view.lua
+ ["&Tool Bar"] = "Barra de herramientas", -- src\editor\menu_view.lua
+ ["&Tutorials"] = "&Tutoriales", -- src\editor\menu_help.lua
+ ["&Undo"] = "Deshacer", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&View"] = "Ver", -- src\editor\menu_view.lua
+ ["&Watch Window"] = "Ventana de inspección", -- src\editor\menu_view.lua
+ ["About %s"] = "Acerca de %s", -- src\editor\menu_help.lua
+ ["Add To Scratchpad"] = "Añadir al borrador", -- src\editor\editor.lua
+ ["Add Watch Expression"] = "Añadir expresión de inspección", -- src\editor\editor.lua
+ ["All files"] = "Todos los archivos", -- src\editor\commands.lua
+ ["Allow external process to start debugging"] = "Permitir proceso externo para iniciar depuración", -- src\editor\menu_project.lua
+ ["Analyze the source code"] = "Analizar el código fuente", -- src\editor\inspect.lua
+ ["Analyze"] = "Analizar", -- src\editor\inspect.lua
+ ["Auto Complete Identifiers"] = "Autocompletar identificadores", -- src\editor\menu_edit.lua
+ ["Auto complete while typing"] = "Autocompletar mientras se escribe", -- src\editor\menu_edit.lua
+ ["Binary file is shown as read-only as it is only partially loaded."] = "El archivo binario es mostrado como solo lectura ya que solo ha sido cargado parcialmente.", -- src\editor\commands.lua
+ ["Bookmark"] = "Marcador", -- src\editor\menu_edit.lua
+ ["Break execution at the next executed line of code"] = "Parar ejecución en la siguiente línea de código", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Breakpoint"] = "Punto de ruptura", -- src\editor\menu_project.lua
+ ["C&lear Console Window"] = "Limpiar ventana de Consola", -- src\editor\gui.lua
+ ["C&lear Output Window"] = "Limpiar ventana de Salida", -- src\editor\gui.lua, src\editor\menu_project.lua
+ ["C&omment/Uncomment"] = "Comentar/descomentar", -- src\editor\menu_edit.lua
+ ["Can't evaluate the expression while the application is running."] = "No se puede evaluar la expresión mientras la aplicación se está ejecutando.", -- src\editor\debugger.lua
+ ["Can't open file '%s': %s"] = "No se puede abrir el archivo '%s': %s", -- src\editor\findreplace.lua, src\editor\singleinstance.lua, src\editor\inspect.lua, src\editor\outline.lua
+ ["Can't process auto-recovery record; invalid format: %s."] = "No se puede procesar la autorrecuperación; formato inválido: %s.", -- src\editor\commands.lua
+ ["Can't replace in read-only text."] = "No se puede remplazar en modo solo lectura.", -- src\editor\findreplace.lua
+ ["Can't run the entry point script ('%s')."] = "No se pude ejecutar el punto de entrada del script (%s).", -- src\editor\debugger.lua
+ ["Can't start debugger server at %s:%d: %s."] = "No se puede iniciar el servidor de depuración %s:%d: %s.", -- src\editor\debugger.lua
+ ["Can't start debugging for '%s'."] = "No se puede iniciar la depuración para '%s'.", -- src\editor\debugger.lua
+ ["Can't start debugging session due to internal error '%s'."] = "No se puede iniciar la sesión de depuración debido a un error interno '%s'.'", -- src\editor\debugger.lua
+ ["Can't start debugging without an opened file or with the current file not being saved ('%s')."] = "No se puede iniciar la depuración sin abrir un archivo o si no ha sido guardado ('%s').", -- src\editor\debugger.lua
+ ["Can't stop debugger server as it is not started."] = "No se puede parar el servidor de puración ya que no se ha iniciado.", -- src\editor\debugger.lua
+ ["Cancelled by the user."] = "Cancelado por el usuario.", -- src\editor\findreplace.lua
+ ["Choose a directory to map"] = "Elegir un directorio para mapear", -- src\editor\filetree.lua
+ ["Choose a project directory"] = "Elegir un directorio de proyecto", -- src\editor\toolbar.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Choose a search directory"] = "Elegir un directorio de búsqueda", -- src\editor\findreplace.lua
+ ["Choose..."] = "Elegir...", -- src\editor\findreplace.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Clear Items"] = "Limpiar objetos", -- src\editor\findreplace.lua, src\editor\menu_file.lua
+ ["Clear items from this list"] = "Limpiar objectos de esta lista", -- src\editor\menu_file.lua
+ ["Clear the output window before compiling or debugging"] = "Limpiar la ventana de salida antes de compilar o depurar", -- src\editor\menu_project.lua
+ ["Close &Other Pages"] = "Cerrar &Otras Páginas", -- src\editor\gui.lua
+ ["Close A&ll Pages"] = "Cerrar todas las páginas", -- src\editor\gui.lua
+ ["Close the current editor window"] = "Cerrar la ventana actual del editor", -- src\editor\menu_file.lua
+ ["Co&ntinue"] = "Continuar", -- src\editor\menu_project.lua
+ ["Col: %d"] = "Col: %d", -- src\editor\editor.lua
+ ["Command Line Parameters..."] = "Parámetros de línea de comandos...", -- src\editor\menu_project.lua
+ ["Command line parameters"] = "Parámetros de línea de comandos", -- src\editor\menu_project.lua
+ ["Comment or uncomment current or selected lines"] = {"Comentar o descomentar la línea activa (seleccionada)","Comentar o descomentar las líneas activas (seleccionadas)"}, -- src\editor\menu_edit.lua
+ ["Compilation error"] = "Error de compilación", -- src\editor\commands.lua, src\editor\debugger.lua
+ ["Compilation successful; %.0f%% success rate (%d/%d)."] = "Compilación exitosa; factor de éxito: %.0f%% (%d/%d).", -- src\editor\commands.lua
+ ["Compile the current file"] = "Compilar el archivo actual", -- src\editor\menu_project.lua
+ ["Complete &Identifier"] = "Completar identificador", -- src\editor\menu_edit.lua
+ ["Complete the current identifier"] = "Completar el actual identificador", -- src\editor\menu_edit.lua
+ ["Consider removing backslash from escape sequence '%s'."] = "Considerar la eliminación de las barras invertidas de la secuencia de escape '%s'.", -- src\editor\commands.lua
+ ["Copy Full Path"] = "Copiar ruta completa", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Copy selected text to clipboard"] = "Copiar el texto seleccionado al portapapeles", -- src\editor\menu_edit.lua
+ ["Correct &Indentation"] = "Corregir &Identación", -- src\editor\menu_edit.lua
+ ["Couldn't activate file '%s' for debugging; continuing without it."] = "No se pudo activar el archivo '%s' para la depuración; continuar sin él.", -- src\editor\debugger.lua
+ ["Create an empty document"] = "Crear un documento en blanco", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Cu&t"] = "Cortar", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Cut selected text to clipboard"] = "Cortar el texto selecionado al portapapeles", -- src\editor\menu_edit.lua
+ ["Debugger server started at %s:%d."] = "Servidor de depuración inciado en %s:%d.", -- src\editor\debugger.lua
+ ["Debugger server stopped at %s:%d."] = "Seridor de depuración parado en %s:%d.", -- src\editor\debugger.lua
+ ["Debugging session completed (%s)."] = "Sesión de depuración completada (%s).", -- src\editor\debugger.lua
+ ["Debugging session started in '%s'."] = "Sesión de depuración iniciada en '%s'.", -- src\editor\debugger.lua
+ ["Debugging suspended at '%s:%s' (couldn't activate the file)."] = "Depuración suspendida en '%s:%s' (no se pudo activar el archivo)", -- src\editor\debugger.lua
+ ["Detach &Process"] = "Separar &Proceso", -- src\editor\menu_project.lua
+ ["Disable Indexing For '%s'"] = "Deshabilitar indexación para '%s'", -- src\editor\outline.lua
+ ["Do you want to delete '%s'?"] = "¿Quieres borrar '%s'?", -- src\editor\filetree.lua
+ ["Do you want to overwrite it?"] = "¿Quieres sobrescribirlo?", -- src\editor\commands.lua
+ ["Do you want to reload it?"] = "¿Quieres recargarlo?", -- src\editor\editor.lua
+ ["Do you want to save the changes to '%s'?"] = "¿Quieres guardar los cambios en '%s'?", -- src\editor\commands.lua
+ ["E&xit"] = "Salir", -- src\editor\menu_file.lua
+ ["Enable Indexing"] = "Habilitar indexación", -- src\editor\outline.lua
+ ["Enter Lua code and press Enter to run it."] = "Introduce código Lua y pulsa <Entrer> para ejecutarlo.", -- src\editor\shellbox.lua
+ ["Enter command line parameters (use Cancel to clear)"] = "Introduce parámetros de línea de comandos (usa Cancel para limpiar)", -- src\editor\menu_project.lua
+ ["Enter replacement text"] = "Introduce el texto de remplazo", -- src\editor\editor.lua
+ ["Error while loading API file: %s"] = "Error mientras se cargaba el archivo de API: %s", -- src\editor\autocomplete.lua
+ ["Error while loading configuration file: %s"] = "Error mientras se cargaba el fichero de configuración: %s", -- src\editor\style.lua
+ ["Error while processing API file: %s"] = "Error mientras se procesaba el archivo de API: %s", -- src\editor\autocomplete.lua
+ ["Error while processing configuration file: %s"] = "Error mientras se procesaba el fichero de configuración: %s", -- src\editor\style.lua
+ ["Error"] = "Error", -- src\editor\commands.lua
+ ["Evaluate In Console"] = "Evaluar en consola", -- src\editor\editor.lua
+ ["Execute the current project/file and keep updating the code to see immediate results"] = "Ejecutar el proyecto/archivo actual y manteniendo actualizado el código para ver resultados en tiempo real", -- src\editor\menu_project.lua
+ ["Execute the current project/file"] = "Ejecutar el proyecto/archivo actual", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Execution error"] = "Error de ejecución", -- src\editor\debugger.lua
+ ["Exit program"] = "Salir del programa", -- src\editor\menu_file.lua
+ ["File '%s' has been modified on disk."] = "El archivo '%s' ha sido modificado en el disco.", -- src\editor\editor.lua
+ ["File '%s' has more recent timestamp than restored '%s'; please review before saving."] = "El archivo '%s' tiene una fecha más reciente que el restaurado '%s'; por favor, revísalo antes de guardar.", -- src\editor\commands.lua
+ ["File '%s' is missing and can't be recovered."] = "El archivo '%s' no se encuenta y no puede ser recuperado.", -- src\editor\commands.lua
+ ["File '%s' no longer exists."] = "El archivo '%s' no existe.", -- src\editor\menu_file.lua, src\editor\editor.lua
+ ["File already exists."] = "El fichero ya existe", -- src\editor\commands.lua
+ ["File history"] = "Historial de archivos", -- src\editor\menu_file.lua
+ ["Find &In Files"] = "Buscar en archivos", -- src\editor\menu_search.lua
+ ["Find &Next"] = "Buscar siguiente", -- src\editor\menu_search.lua
+ ["Find &Previous"] = "Buscar anterior", -- src\editor\menu_search.lua
+ ["Find and insert library function"] = "Buscar e insertar función de librería", -- src\editor\menu_search.lua
+ ["Find and replace text in files"] = "Buscar y remplazar texto en archivos", -- src\editor\menu_search.lua
+ ["Find and replace text"] = "Buscar y rempleazar texto", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find in files"] = "Buscar en ficheros", -- src\editor\toolbar.lua
+ ["Find text in files"] = "Buscar texto en archivos", -- src\editor\menu_search.lua
+ ["Find text"] = "Buscar texto", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find the earlier text occurence"] = "Buscar la anterior aparición del texto", -- src\editor\menu_search.lua
+ ["Find the next text occurrence"] = "Buscar la siguiente aparecición del texto", -- src\editor\menu_search.lua
+ ["Find"] = "Buscar", -- src\editor\toolbar.lua
+ ["Fold or unfold all code folds"] = "Plegar o desplegar todo el código plegado", -- src\editor\menu_edit.lua
+ ["Formatting page %d..."] = "Formateando página %d...", -- src\editor\print.lua
+ ["Found %d instance."] = {"Encontrada una instancia", "Encontradas %d instancias"}, -- src\editor\findreplace.lua
+ ["Found auto-recovery record and restored saved session."] = "Encontrada autorrecuperación y sesión restaurada.", -- src\editor\commands.lua
+ ["Full &Screen"] = "Pantalla completa", -- src\editor\menu_view.lua
+ ["Go To Definition"] = "Ir a definición", -- src\editor\editor.lua
+ ["Go To File..."] = "Ir a fichero...", -- src\editor\menu_search.lua
+ ["Go To Line..."] = "Ir a línea...", -- src\editor\menu_search.lua
+ ["Go To Next Bookmark"] = "Ir al siguiente marcador", -- src\editor\menu_edit.lua
+ ["Go To Next Breakpoint"] = "Ir al siguiente punto de ruptura", -- src\editor\menu_project.lua
+ ["Go To Previous Bookmark"] = "Ir al marcador anterior", -- src\editor\menu_edit.lua
+ ["Go To Previous Breakpoint"] = "Ir al punto de ruptura anterior", -- src\editor\menu_project.lua
+ ["Go To Symbol..."] = "Ir a símbolo...", -- src\editor\menu_search.lua
+ ["Go to file"] = "Ir a archivo", -- src\editor\menu_search.lua
+ ["Go to line"] = "Ir a línea", -- src\editor\menu_search.lua
+ ["Go to symbol"] = "Ir a símbolo", -- src\editor\menu_search.lua
+ ["Hide '.%s' Files"] = "Ocultar archivos '.%s'", -- src\editor\filetree.lua
+ ["INS"] = "INS", -- src\editor\editor.lua
+ ["Ignore and don't index symbols from files in the selected directory"] = "Ignorar y no indexar símbolos de archivos en el directorio seleccionado", -- src\editor\outline.lua
+ ["Ignored error in debugger initialization code: %s."] = "Error ignorado en código de inicialización de depurador: %s.", -- src\editor\debugger.lua
+ ["Indexing %d files: '%s'..."] = "Indexando %d archivos: '%s'...", -- src\editor\outline.lua
+ ["Indexing completed."] = "Indexado completado.", -- src\editor\outline.lua
+ ["Insert Library Function..."] = "Insertar función de librería...", -- src\editor\menu_search.lua
+ ["Known Files"] = "Archivos conocidos", -- src\editor\commands.lua
+ ["Ln: %d"] = "Ln: %d", -- src\editor\editor.lua
+ ["Local console"] = "Consola local", -- src\editor\gui.lua, src\editor\shellbox.lua
+ ["Lua &Interpreter"] = "Intérprete Lua", -- src\editor\menu_project.lua
+ ["Map Directory..."] = "Mapeo de directorio...", -- src\editor\filetree.lua
+ ["Mapped remote request for '%s' to '%s'."] = "Mapeada petición remota de '%s' a '%s'.", -- src\editor\debugger.lua
+ ["Markers Window"] = "Ventana de marcas", -- src\editor\menu_view.lua
+ ["Markers"] = "Marcas", -- src\editor\markers.lua
+ ["Match case"] = "Emparejar mayúsculas/minúsuclas", -- src\editor\toolbar.lua
+ ["Match whole word"] = "Emparejar palabras completas", -- src\editor\toolbar.lua
+ ["Mixed end-of-line encodings detected."] = "Detectadas condificaciones de final de línea distintas", -- src\editor\commands.lua
+ ["Navigate"] = "Navegar", -- src\editor\menu_search.lua
+ ["New &File"] = "Nuevo %Fichero", -- src\editor\filetree.lua
+ ["OVR"] = "OVR", -- src\editor\editor.lua
+ ["Open With Default Program"] = "Abrir con programa por defecto", -- src\editor\filetree.lua
+ ["Open an existing document"] = "Abrir un documento existente", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Open file"] = "Abrir archivo", -- src\editor\commands.lua
+ ["Outline Window"] = "Ventana de esquema", -- src\editor\menu_view.lua
+ ["Outline"] = "Esquema", -- src\editor\outline.lua
+ ["Output (running)"] = "Salida (en ejecución)", -- src\editor\debugger.lua, src\editor\output.lua
+ ["Output (suspended)"] = "Salida (suspendida)", -- src\editor\debugger.lua
+ ["Output"] = "Salida", -- src\editor\debugger.lua, src\editor\output.lua, src\editor\gui.lua, src\editor\settings.lua
+ ["Page Setup..."] = "Configuración de página", -- src\editor\print.lua
+ ["Paste text from the clipboard"] = "Pegar texto desde el portapapeles", -- src\editor\menu_edit.lua
+ ["Preferences"] = "Preferencias", -- src\editor\menu_edit.lua
+ ["Prepend '!' to force local execution."] = "Antepón '!' para forzar una ejecución local.", -- src\editor\shellbox.lua
+ ["Prepend '=' to show complex values on multiple lines."] = "Antepón '=' para ver valores complejos en líneas múltiples", -- src\editor\shellbox.lua
+ ["Press cancel to abort."] = "Presiona cancelar para abortar.", -- src\editor\commands.lua
+ ["Print the current document"] = "Imprimir el documento actual", -- src\editor\print.lua
+ ["Program '%s' started in '%s' (pid: %d)."] = "Programa '%s' iniciado en '%s' (pid: %d).", -- src\editor\output.lua
+ ["Program can't start because conflicting process is running as '%s'."] = "El programa no puede iniciarse porque hay un proceso conflictivo en ejecución como '%s'.", -- src\editor\output.lua
+ ["Program completed in %.2f seconds (pid: %d)."] = "Programa completado en %.2f segundos (pid: %d).", -- src\editor\output.lua
+ ["Program starting as '%s'."] = "Programa iniciado como '%s'.", -- src\editor\output.lua
+ ["Program stopped (pid: %d)."] = "Programa parado (pid: %d).", -- src\editor\debugger.lua
+ ["Program unable to run as '%s'."] = "No se puede ejecutar el programa como '%s'.", -- src\editor\output.lua
+ ["Project Directory"] = "Directorio de proyecto", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Project history"] = "Historial de proyecto", -- src\editor\menu_file.lua
+ ["Project"] = "Proyecto", -- src\editor\filetree.lua
+ ["Project/&FileTree Window"] = "Ventana de proyecto/árbol de archivos", -- src\editor\menu_view.lua
+ ["Provide command line parameters"] = "Proveer parámetros de línea de comandos", -- src\editor\menu_project.lua
+ ["Queued %d files to index."] = "Encolar %d ficheros al índice", -- src\editor\menu_search.lua
+ ["R/O"] = "R/O", -- src\editor\editor.lua
+ ["R/W"] = "R/W", -- src\editor\editor.lua
+ ["Re&place In Files"] = "Remplazar en archivos", -- src\editor\menu_search.lua
+ ["Re-indent selected lines"] = "Volver a indentar las líneas seleccionadas", -- src\editor\menu_edit.lua
+ ["Reached end of selection and wrapped around."] = "Alcanzado el final de la selección y vuelta a empezar.", -- src\editor\findreplace.lua
+ ["Reached end of text and wrapped around."] = "Alcanzado el final del texto y vuelta a empezar", -- src\editor\findreplace.lua
+ ["Recent Files"] = "Archivos recientes", -- src\editor\menu_file.lua
+ ["Recent Projects"] = "Projectos recientes", -- src\editor\menu_file.lua
+ ["Redo last edit undone"] = "Rehacer la última edición deshecha", -- src\editor\menu_edit.lua
+ ["Refresh Index"] = "Refrescar índice", -- src\editor\outline.lua
+ ["Refresh indexed symbols from files in the selected directory"] = "Refrescar símbolos indexados en los ficheros del directorio seleccionado", -- src\editor\outline.lua
+ ["Refresh"] = "Refrescar", -- src\editor\filetree.lua
+ ["Refused a request to start a new debugging session as there is one in progress already."] = "No se pudo lanzar una nueva sesión de depuración porque ya hay una en curso.", -- src\editor\debugger.lua
+ ["Regular expression"] = "Expresión regular", -- src\editor\toolbar.lua
+ ["Remote console"] = "Consola remota", -- src\editor\shellbox.lua
+ ["Rename All Instances"] = "Renombrar rodas las instancias", -- src\editor\editor.lua
+ ["Replace All Selections"] = "Remplazar todas las selecciones", -- src\editor\editor.lua
+ ["Replace all"] = "Remplazar todo", -- src\editor\toolbar.lua
+ ["Replace next instance"] = "Reemplazar siguiente instancia", -- src\editor\toolbar.lua
+ ["Replaced %d instance."] = {"Remplazada una instancia", "Remplazada %d instancias."}, -- src\editor\findreplace.lua
+ ["Replaced an invalid UTF8 character with %s."] = "Remplazado un caracter UTF8 inválido con %s.", -- src\editor\commands.lua
+ ["Reset to default layout"] = "Restablecer el diseño por defecto", -- src\editor\menu_view.lua
+ ["Run As Scratchpad"] = "Ejecutar como borrador", -- src\editor\menu_project.lua
+ ["Run To Cursor"] = "Ejecutar hasta cursor", -- src\editor\menu_project.lua, src\editor\editor.lua
+ ["Run as Scratchpad"] = "Ejecutar como borrador", -- src\editor\toolbar.lua
+ ["Run to cursor"] = "Ejecutar hasta cursor", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["S&top Debugging"] = "Parar depuración", -- src\editor\menu_project.lua
+ ["S&top Process"] = "Parar proceso", -- src\editor\menu_project.lua
+ ["Save &As..."] = "Guardar como...", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["Save A&ll"] = "Guardar todo", -- src\editor\menu_file.lua
+ ["Save Changes?"] = "¿Guardar cambios?", -- src\editor\commands.lua
+ ["Save all open documents"] = "Guardar todos los documentos abiertos", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Save file as"] = "Guardar archivo como", -- src\editor\commands.lua
+ ["Save file?"] = "¿Guardar archivo?", -- src\editor\commands.lua
+ ["Save the current document to a file with a new name"] = "Guardar el documento actual en un archivo con un nombre nuevo", -- src\editor\menu_file.lua
+ ["Save the current document"] = "Guardar el documento actual", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Saved auto-recover at %s."] = "Guardar autorrecuperación en %s.", -- src\editor\commands.lua
+ ["Scratchpad error"] = "Error en el borrador", -- src\editor\debugger.lua
+ ["Search direction"] = "Dirección de búsqueda", -- src\editor\toolbar.lua
+ ["Search in selection"] = "Buscar en selección", -- src\editor\toolbar.lua
+ ["Search in subdirectories"] = "Buscar en subdirectorios", -- src\editor\toolbar.lua
+ ["Searching for '%s'."] = "Buscando para '%s'.", -- src\editor\findreplace.lua
+ ["Sel: %d/%d"] = "Sel: %d/%d", -- src\editor\editor.lua
+ ["Select &All"] = "Seleccionar todo", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Select And Find Next"] = "Seleccionar y buscar siguiente", -- src\editor\menu_search.lua
+ ["Select And Find Previous"] = "Seleccionar y buscar anterior", -- src\editor\menu_search.lua
+ ["Select all text in the editor"] = "Seleccionar todo el texto en el editor", -- src\editor\menu_edit.lua
+ ["Select the word under cursor and find its next occurrence"] = "Seleccionar palabra bajo cursor y encontrar la siguiente aparición", -- src\editor\menu_search.lua
+ ["Select the word under cursor and find its previous occurrence"] = "Seleccionar palabra bajo cursor y encontar la anterior aparición", -- src\editor\menu_search.lua
+ ["Set As Start File"] = "Establecer como fchero de inicio", -- src\editor\filetree.lua
+ ["Set From Current File"] = "Establecer fichero actual", -- src\editor\menu_project.lua
+ ["Set To Project Directory"] = "Establecer a directorio de proyecto", -- src\editor\findreplace.lua
+ ["Set To Selected Directory"] = "Establcer a directorio seleccionado", -- src\editor\filetree.lua
+ ["Set project directory from current file"] = "Establecer el directorio del proyecto del archivo actual", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Set project directory to the selected one"] = "Configurar el directorio de proyecto al seleccionado", -- src\editor\filetree.lua
+ ["Set search directory"] = "Establecer directorio de búsqueda", -- src\editor\toolbar.lua
+ ["Set the interpreter to be used"] = "Establecer el intérprete a ser usado", -- src\editor\menu_project.lua
+ ["Set the project directory to be used"] = "Establecer el directorio de proyecto para ser utilizado", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Settings: System"] = "Configuración: Sistema", -- src\editor\menu_edit.lua
+ ["Settings: User"] = "Configuración: Usuario", -- src\editor\menu_edit.lua
+ ["Show &Tooltip"] = "Ver tooltip", -- src\editor\menu_edit.lua
+ ["Show All Files"] = "Ver todos los ficheros", -- src\editor\filetree.lua
+ ["Show Hidden Files"] = "Ver ficheros ocultos", -- src\editor\filetree.lua
+ ["Show Location"] = "Ver ubicación", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Show all files"] = "Ver todos los ficheros", -- src\editor\filetree.lua
+ ["Show context"] = "Ver contexto", -- src\editor\toolbar.lua
+ ["Show files previously hidden"] = "Ver fichero previamente ocultados", -- src\editor\filetree.lua
+ ["Show multiple result windows"] = "Ver múltiples ventanas de resultados", -- src\editor\toolbar.lua
+ ["Show tooltip for current position; place cursor after opening bracket of function"] = "Ver tooltip para la posición actual; posicionar el cursor después de abrir el paréntisis de los argumentos de la función", -- src\editor\menu_edit.lua
+ ["Show/Hide the status bar"] = "Ver/Ocultar la barra de estado", -- src\editor\menu_view.lua
+ ["Show/Hide the toolbar"] = "Ver/Ocultar la barra de herramientas", -- src\editor\menu_view.lua
+ ["Sort By Name"] = "Ordenar por nombre", -- src\editor\outline.lua
+ ["Sort selected lines"] = "Clasificar las líneas seleccionadas", -- src\editor\menu_edit.lua
+ ["Source"] = "Fuente", -- src\editor\menu_edit.lua
+ ["Stack"] = "Pila", -- src\editor\debugger.lua
+ ["Start &Debugging"] = "Comenzar depuración", -- src\editor\menu_project.lua
+ ["Start or continue debugging"] = "Inciar o continuar depuración", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step &Into"] = "Paso dentro", -- src\editor\menu_project.lua
+ ["Step &Over"] = "Paso sin entrar", -- src\editor\menu_project.lua
+ ["Step O&ut"] = "Paso fuera", -- src\editor\menu_project.lua
+ ["Step into"] = "Paso dentro", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step out of the current function"] = "Hasta salir de la función actual", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step over"] = "Paso sin entrar", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop debugging and continue running the process"] = "Parar depuración y continuar ejecutando el proceso", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop the currently running process"] = "Parar el proceso en ejecución", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Switch to or from full screen mode"] = "Conmutar el modo de pantalla completa", -- src\editor\menu_view.lua
+ ["Symbol Index"] = "Índice de símbolo", -- src\editor\outline.lua
+ ["Text not found."] = "Texto no encontrado.", -- src\editor\findreplace.lua
+ ["The API file must be located in a subdirectory of the API directory."] = "El archivo de API debe ser almacenado en un subdirectorio del directorio de API.", -- src\editor\autocomplete.lua
+ ["Toggle Bookmark"] = "Conmutar marcador", -- src\editor\markers.lua, src\editor\menu_edit.lua
+ ["Toggle Breakpoint"] = "Conmutar punto de ruptura", -- src\editor\markers.lua, src\editor\menu_project.lua
+ ["Toggle bookmark"] = "Conmutar marcador", -- src\editor\toolbar.lua, src\editor\menu_edit.lua, src\editor\markers.lua
+ ["Toggle breakpoint"] = "Conmutar punto de ruptura", -- src\editor\markers.lua, src\editor\toolbar.lua
+ ["Tr&ace"] = "Traza", -- src\editor\menu_project.lua
+ ["Trace execution showing each executed line"] = "Traza de ejecución mostrando cada línea ejecutada", -- src\editor\menu_project.lua
+ ["Unable to create directory '%s'."] = "No se pudo crear el directorio '%s'.", -- src\editor\filetree.lua
+ ["Unable to create file '%s'."] = "No se pudo crear el fichero '%s'.", -- src\editor\filetree.lua
+ ["Unable to delete directory '%s': %s"] = "No se pudo borrar el directorio '%s': %s", -- src\editor\filetree.lua
+ ["Unable to delete file '%s': %s"] = "No se pudo borrar el ficheor '%s': %s", -- src\editor\filetree.lua
+ ["Unable to load file '%s'."] = "No se pudo cargar el archivo '%s'.", -- src\editor\commands.lua
+ ["Unable to rename file '%s'."] = "No se pudo renombrar el fichero '%s'", -- src\editor\filetree.lua
+ ["Unable to save file '%s': %s"] = "No se pudo guardar el archivo '%s': %s", -- src\editor\commands.lua
+ ["Unable to stop program (pid: %d), code %d."] = "No se puedo parar el programa (pid: %d), código %d.", -- src\editor\debugger.lua
+ ["Undo last edit"] = "Deshacer la última edición", -- src\editor\menu_edit.lua
+ ["Unmap Directory"] = "Desmapear directorio", -- src\editor\filetree.lua
+ ["Unset '%s' As Start File"] = "Quitar '%s' como fichero de inicio", -- src\editor\filetree.lua
+ ["Updated %d file."] = {"Un fichero actualizado", "%d ficheros actualizados"}, -- src\editor\findreplace.lua
+ ["Updating symbol index and settings..."] = "Actualizando índice de símbolos y configurando...", -- src\editor\outline.lua
+ ["Use %s to close."] = "Usa %s para cerrar.", -- src\editor\findreplace.lua
+ ["Use '%s' to see full description."] = "Usa '%s' para ver la descripción completa.", -- src\editor\editor.lua
+ ["Use '%s' to show line endings and '%s' to convert them."] = "Usa '%s' para ver los finales de línea y '%s' para convertirlos", -- src\editor\commands.lua
+ ["Use 'clear' to clear the shell output and the history."] = "Usa 'clear' para limpiar la consola de salida y el historial.", -- src\editor\shellbox.lua
+ ["Use Shift-Enter for multiline code."] = "Usa <Shift-Enter> para código multilínea.", -- src\editor\shellbox.lua
+ ["View the markers window"] = "Ver la ventana de marcas", -- src\editor\menu_view.lua
+ ["View the outline window"] = "Ver la ventana de esquema", -- src\editor\menu_view.lua
+ ["View the output/console window"] = "Ver ventana de salida/consola", -- src\editor\menu_view.lua
+ ["View the project/filetree window"] = "Ver la ventana de proyecto/árbol de archivos", -- src\editor\menu_view.lua
+ ["View the stack window"] = "Ver la ventana de la pila de ejecución", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["View the watch window"] = "Ver la ventana de observación", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["Watch"] = "Inspeccionar", -- src\editor\debugger.lua
+ ["Welcome to the interactive Lua interpreter."] = "Bienvenido al intérprete interactico de Lua.", -- src\editor\shellbox.lua
+ ["Wrap around"] = "Vuelta a empezar", -- src\editor\toolbar.lua
+ ["You must save the program first."] = "Debes guardar el programa primero", -- src\editor\commands.lua
+ ["Zoom In"] = "Acercar zoom", -- src\editor\menu_view.lua
+ ["Zoom Out"] = "Alejar zoom", -- src\editor\menu_view.lua
+ ["Zoom to 100%"] = "Zoom al 100%", -- src\editor\menu_view.lua
+ ["Zoom"] = "Zoom", -- src\editor\menu_view.lua
+ ["on line %d"] = "en la línea %d", -- src\editor\debugger.lua, src\editor\editor.lua, src\editor\commands.lua
+ ["traced %d instruction"] = {"%d instrucción trazada", "%d instrucciones trazadas"}, -- src\editor\debugger.lua
+ ["unknown error"] = "Error desconocido", -- src\editor\debugger.lua
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/fr.lua b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/fr.lua
new file mode 100644
index 0000000..b1550e2
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/fr.lua
@@ -0,0 +1,345 @@
+return {
+ [0] = function(c) return c == 1 and 1 or 2 end, -- plural
+ ["%s event failed: %s"] = "L'événement %s a échoué : %s", -- src\editor\package.lua
+ ["%s%% formatted..."] = "%s%% formattés...", -- src\editor\print.lua
+ ["%s%% loaded..."] = "%s%% chargé", -- src\editor\commands.lua
+ ["&About"] = "&À propos", -- src\editor\menu_help.lua
+ ["&Add Watch"] = "&Ajouter une expression", -- src\editor\debugger.lua
+ ["&Break"] = "&Interrompre", -- src\editor\menu_project.lua
+ ["&Close Page"] = "&Fermer la page", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Community"] = "&Communauté", -- src\editor\menu_help.lua
+ ["&Compile"] = "&Compiler", -- src\editor\menu_project.lua
+ ["&Copy Value"] = "Copier la &valeur", -- src\editor\debugger.lua
+ ["&Copy"] = "Co&pier", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Default Layout"] = "Affichage par &défaut", -- src\editor\menu_view.lua
+ ["&Delete Watch"] = "&Supprimer une expression", -- src\editor\debugger.lua
+ ["&Delete"] = "&Supprimer", -- src\editor\filetree.lua
+ ["&Documentation"] = "&Documentation", -- src\editor\menu_help.lua
+ ["&Edit Project Directory"] = "&Modifier le répertoire de projet", -- src\editor\filetree.lua
+ ["&Edit Value"] = "&Modifier une valeur", -- src\editor\debugger.lua
+ ["&Edit Watch"] = "&Modifier une expression", -- src\editor\debugger.lua
+ ["&Edit"] = "É&dition", -- src\editor\menu_edit.lua
+ ["&File"] = "&Fichier", -- src\editor\menu_file.lua
+ ["&Find"] = "&Rechercher", -- src\editor\menu_search.lua
+ ["&Fold/Unfold All"] = "Re&plier/Déplier tout", -- src\editor\menu_edit.lua
+ ["&Frequently Asked Questions"] = "&Foire aux questions" , -- src\editor\menu_help.lua
+ ["&Getting Started Guide"] = "&Guide de prise en main", -- src\editor\menu_help.lua
+ ["&Help"] = "Aid&e", -- src\editor\menu_help.lua
+ ["&New Directory"] = "&Nouveau répertoire", -- src\editor\filetree.lua
+ ["&New"] = "&Nouveau", -- src\editor\menu_file.lua
+ ["&Open..."] = "&Ouvrir...", -- src\editor\menu_file.lua
+ ["&Output/Console Window"] = "&Sortie/Console", -- src\editor\menu_view.lua
+ ["&Paste"] = "Co&ller", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Print..."] = "&Imprimer", -- src\editor\print.lua
+ ["&Project Page"] = "&Site web de ZeroBrane", -- src\editor\menu_help.lua
+ ["&Project"] = "&Projet", -- src\editor\menu_project.lua
+ ["&Redo"] = "&Rétablir", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Rename"] = "&Renommer", -- src\editor\filetree.lua
+ ["&Replace"] = "Re&mplacer", -- src\editor\menu_search.lua
+ ["&Run"] = "&Exécuter", -- src\editor\menu_project.lua
+ ["&Save"] = "&Enregistrer", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Search"] = "&Recherche", -- src\editor\menu_search.lua
+ ["&Select Command"] = "Selectionner la &Commande", -- src\editor\gui.lua
+ ["&Sort"] = "&Trier", -- src\editor\menu_edit.lua
+ ["&Stack Window"] = "&Pile d'exécution", -- src\editor\menu_view.lua
+ ["&Start Debugger Server"] = "Lancer le &serveur de débogage", -- src\editor\menu_project.lua
+ ["&Status Bar"] = "Barre d'&état", -- src\editor\menu_view.lua
+ ["&Tool Bar"] = "Barre d'&outils", -- src\editor\menu_view.lua
+ ["&Tutorials"] = "&Tutoriels", -- src\editor\menu_help.lua
+ ["&Undo"] = "&Annuler", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&View"] = "&Affichage", -- src\editor\menu_view.lua
+ ["&Watch Window"] = "E&xpressions espionnes", -- src\editor\menu_view.lua
+ ["About %s"] = "À propos de %s", -- src\editor\menu_help.lua
+ ["Add To Scratchpad"] = "Ajouter au brouillon", -- src\editor\editor.lua
+ ["Add Watch Expression"] = "Ajouter une expression espionne", -- src\editor\editor.lua
+ ["All files"] = "Tous les fichiers", -- src\editor\commands.lua
+ ["Allow external process to start debugging"] = "Autorise les processus externes à lancer le débogage", -- src\editor\menu_project.lua
+ ["Analyze the source code"] = "Analyse le code source", -- src\editor\inspect.lua
+ ["Analyze"] = "Analyser", -- src\editor\inspect.lua
+ ["Auto Complete Identifiers"] = "Auto-compléter les identifiants", -- src\editor\menu_edit.lua
+ ["Auto complete while typing"] = "Auto-complète lors de la saisie", -- src\editor\menu_edit.lua
+ ["Binary file is shown as read-only as it is only partially loaded."] = "Le fichier binaire est affiché en lecture seule parce qu'il a été chargé partiellement.", -- src\editor\commands.lua
+ ["Bookmark"] = "Marque-pages", -- src\editor\menu_edit.lua
+ ["Break execution at the next executed line of code"] = "Interrompt l'exécution à la ligne suivante", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Breakpoint"] = "Point d'arrêt", -- src\editor\menu_project.lua
+ ["C&lear Console Window"] = "E&ffacer la fenêtre console", -- src\editor\gui.lua
+ ["C&lear Output Window"] = "E&ffacer la fenêtre de sortie", -- src\editor\gui.lua, src\editor\menu_project.lua
+ ["C&omment/Uncomment"] = "Co&mmenter/Décommenter", -- src\editor\menu_edit.lua
+ ["Can't evaluate the expression while the application is running."] = "Impossible d'évaluer l'expression pendant que l'application est en cours d'exécution.", -- src\editor\debugger.lua
+ ["Can't open file '%s': %s"] = "Impossible d'ouvrir le fichier '%s': %s", -- src\editor\findreplace.lua, src\editor\singleinstance.lua, src\editor\inspect.lua, src\editor\outline.lua
+ ["Can't process auto-recovery record; invalid format: %s."] = "Impossible de lire la récupération automatique ; format invalide : %s.", -- src\editor\commands.lua
+ ["Can't replace in read-only text."] = "Impossible de remplacer dans un texte en lecture seule.", -- src\editor\findreplace.lua
+ ["Can't run the entry point script ('%s')."] = "Impossible d'exécuter le point d'entrée du script ('%s').", -- src\editor\debugger.lua
+ ["Can't start debugger server at %s:%d: %s."] = "Impossible de lancer le serveur de débogage à %s:%d: %s." , -- src\editor\debugger.lua
+ ["Can't start debugging for '%s'."] = "Impossible de lancer le débogage pour '%s'.", -- src\editor\debugger.lua
+ ["Can't start debugging session due to internal error '%s'."] = "Impossible de lancer la session de débogage : erreur interne '%s'.", -- src\editor\debugger.lua
+ ["Can't start debugging without an opened file or with the current file not being saved ('%s')."] = "Impossible de lancer le débogage si aucun fichier n'est ouvert ou si le fichier courant n'a pas été enregistré ('%s').", -- src\editor\debugger.lua
+ ["Can't stop debugger server as it is not started."] = "Impossible d'arrêter le serveur de débogage car il n'a pas été démarré.", -- src\editor\debugger.lua
+ ["Cancelled by the user."] = "Annulé par l'utilisateur.", -- src\editor\findreplace.lua
+ ["Choose a directory to map"] = "Choisir un répertoire à mapper", -- src\editor\filetree.lua
+ ["Choose a project directory"] = "Choisir un répertoire de projet", -- src\editor\toolbar.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Choose a search directory"] = "Choisir un répertoire dans lequel rechercher", -- src\editor\findreplace.lua
+ ["Choose..."] = "Choisir...", -- src\editor\findreplace.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Clear Items"] = "Effacer les éléments", -- src\editor\findreplace.lua, src\editor\menu_file.lua
+ ["Clear items from this list"] = "Efface les éléments de cette liste", -- src\editor\menu_file.lua
+ ["Clear the output window before compiling or debugging"] = "Efface la fenêtre de sortie avant compilation ou débogage", -- src\editor\menu_project.lua
+ ["Close &Other Pages"] = "Fermer les &autres pages", -- src\editor\gui.lua
+ ["Close A&ll Pages"] = "Fermer &toutes les pages", -- src\editor\gui.lua
+ ["Close the current editor window"] = "Ferme la fenêtre d'édition courante", -- src\editor\menu_file.lua
+ ["Co&ntinue"] = "Co&ntinuer", -- src\editor\menu_project.lua
+ ["Col: %d"] = "Col : %d", -- src\editor\editor.lua
+ ["Command Line Parameters..."] = "Paramètres de ligne de commande...", -- src\editor\menu_project.lua
+ ["Command line parameters"] = "Paramètres de ligne de commande", -- src\editor\menu_project.lua
+ ["Comment or uncomment current or selected lines"] = "Commente ou décommente les lignes courantes ou sélectionnées", -- src\editor\menu_edit.lua
+ ["Compilation error"] = "Erreur de compilation", -- src\editor\commands.lua, src\editor\debugger.lua
+ ["Compilation successful; %.0f%% success rate (%d/%d)."] = "Compilation réussie ; taux de succès : %.0f%% (%d/%d).", -- src\editor\commands.lua
+ ["Compile the current file"] = "Сompile le fichier courant", -- src\editor\menu_project.lua
+ ["Complete &Identifier"] = "Compléter l'&identifiant", -- src\editor\menu_edit.lua
+ ["Complete the current identifier"] = "Complète l'identifiant courant", -- src\editor\menu_edit.lua
+ ["Consider removing backslash from escape sequence '%s'."] = "Essayez de supprimer les antislashs dans '%s'.", -- src\editor\commands.lua
+ ["Copy Full Path"] = "Copier le chemin absolu", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Copy selected text to clipboard"] = "Copie le texte sélectionné dans le presse-papiers", -- src\editor\menu_edit.lua
+ ["Correct &Indentation"] = "Corriger l'&indentation", -- src\editor\menu_edit.lua
+ ["Couldn't activate file '%s' for debugging; continuing without it."] = "Impossible d'activer le fichier '%s' pour débogage ; poursuite du processus en ignorant le fichier.", -- src\editor\debugger.lua
+ ["Create an empty document"] = "Crée un document vierge", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Cu&t"] = "&Couper", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Cut selected text to clipboard"] = "Coupe le texte sélectionné et le copie dans le presse-papiers", -- src\editor\menu_edit.lua
+ ["Debugger server started at %s:%d."] = "Serveur de débogage démarré à %s:%d.", -- src\editor\debugger.lua
+ ["Debugger server stopped at %s:%d."] = "Serveur de débogage stoppé à %s:%d.", -- src\editor\debugger.lua
+ ["Debugging session completed (%s)."] = "Session de débogage terminée (%s).", -- src\editor\debugger.lua
+ ["Debugging session started in '%s'."] = "Session de débogage démarrée dans '%s'.", -- src\editor\debugger.lua
+ ["Debugging suspended at '%s:%s' (couldn't activate the file)."] = "Débogage interrompu à '%s:%s' (impossible d'activer le fichier).", -- src\editor\debugger.lua
+ ["Detach &Process"] = "Détacher le p&rocessus", -- src\editor\menu_project.lua
+ ["Disable Indexing For '%s'"] = "Désactiver l'indexation pour '%s'", -- src\editor\outline.lua
+ ["Do you want to delete '%s'?"] = "Voulez-vous effacer '%s' ?", -- src\editor\filetree.lua
+ ["Do you want to overwrite it?"] = "Voulez-vous l'écraser ?", -- src\editor\commands.lua
+ ["Do you want to reload it?"] = "Voulez-vous le recharger ?", -- src\editor\editor.lua
+ ["Do you want to save the changes to '%s'?"] = "Voulez-vous enregistrer les modifications dans '%s' ?", -- src\editor\commands.lua
+ ["E&xit"] = "&Quitter", -- src\editor\menu_file.lua
+ ["Enable Indexing"] = "Activer l'indexation", -- src\editor\outline.lua
+ ["Enter Lua code and press Enter to run it."] = "Saisissez du code Lua et appuyez sur <Entrée> pour l´exécuter.", -- src\editor\shellbox.lua
+ ["Enter command line parameters (use Cancel to clear)"] = "Saisissez les paramètres de ligne de commande (cliquez sur Annuler pour effacer)", -- src\editor\menu_project.lua
+ ["Enter replacement text"] = "Saisissez le texte de remplacement", -- src\editor\editor.lua
+ ["Error while loading API file: %s"] = "Erreur lors du chargement du fichier d'API : %s", -- src\editor\autocomplete.lua
+ ["Error while loading configuration file: %s"] = "Erreur lors du chargement du fichier de configuration : %s", -- src\editor\style.lua
+ ["Error while processing API file: %s"] = "Erreur lors de la lecture du fichier d'API : %s", -- src\editor\autocomplete.lua
+ ["Error while processing configuration file: %s"] = "Erreur lors de la lecture du fichier de configuration : %s", -- src\editor\style.lua
+ ["Error"] = "Erreur", -- src\editor\commands.lua
+ ["Evaluate In Console"] = "Évaluer dans la console", -- src\editor\editor.lua
+ ["Execute the current project/file and keep updating the code to see immediate results"] = "Exécute le projet/fichier courant en prenant en compte à la volée les modifications de code", -- src\editor\menu_project.lua
+ ["Execute the current project/file"] = "Exécute le projet/fichier courant", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Execution error"] = "Erreur d'exécution", -- src\editor\debugger.lua
+ ["Exit program"] = "Quitte le programme", -- src\editor\menu_file.lua
+ ["File '%s' has been modified on disk."] = "Le fichier '%s' a été modifié sur le disque.", -- src\editor\editor.lua
+ ["File '%s' has more recent timestamp than restored '%s'; please review before saving."] = "Le fichier '%s' a un horodatage plus récent que celui restauré '%s' ; veuillez vérifier avant d'enregistrer.", -- src\editor\commands.lua
+ ["File '%s' is missing and can't be recovered."] = "Le fichier '%s' est manquant et ne peut pas être récupéré.", -- src\editor\commands.lua
+ ["File '%s' no longer exists."] = "Le fichier '%s' n'existe plus.", -- src\editor\menu_file.lua, src\editor\editor.lua
+ ["File already exists."] = "Le fichier existe déjà.", -- src\editor\commands.lua
+ ["File history"] = "Historique de fichier", -- src\editor\menu_file.lua
+ ["Find &In Files"] = "Rec&hercher dans les fichiers", -- src\editor\menu_search.lua
+ ["Find &Next"] = "Rechercher le &suivant", -- src\editor\menu_search.lua
+ ["Find &Previous"] = "Rechercher le &précédent", -- src\editor\menu_search.lua
+ ["Find and insert library function"] = "Recherche et insère une fonction d'une bibliothèque", -- src\editor\menu_search.lua
+ ["Find and replace text in files"] = "Recherche et remplace le texte dans les fichiers", -- src\editor\menu_search.lua
+ ["Find and replace text"] = "Recherche et remplace le texte", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find in files"] = "Rechercher dans les fichiers", -- src\editor\toolbar.lua
+ ["Find text in files"] = "Recherche le texte dans les fichiers", -- src\editor\menu_search.lua
+ ["Find text"] = "Recherche le texte", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find the earlier text occurence"] = "Recherche l'occurrence précédente du texte", -- src\editor\menu_search.lua
+ ["Find the next text occurrence"] = "Recherche l'occurrence suivante du texte", -- src\editor\menu_search.lua
+ ["Find"] = "Rechercher ", -- src\editor\toolbar.lua
+ ["Fold or unfold all code folds"] = "Replie ou déplie tous les blocs de code", -- src\editor\menu_edit.lua
+ ["Formatting page %d..."] = "Formattage de la page %d en cours...", -- src\editor\print.lua
+ ["Found %d instance."] = {"%d occurence trouvée.", "%d occurences trouvées."}, -- src\editor\findreplace.lua
+ ["Found auto-recovery record and restored saved session."] = "Une récupération automatique a été trouvée et la session a été restaurée.", -- src\editor\commands.lua
+ ["Full &Screen"] = "Plein é&cran", -- src\editor\menu_view.lua
+ ["Go To Definition"] = "Aller à la définition", -- src\editor\editor.lua
+ ["Go To File..."] = "Aller au fichier...", -- src\editor\menu_search.lua
+ ["Go To Line..."] = "Aller à la ligne...", -- src\editor\menu_search.lua
+ ["Go To Next Bookmark"] = "Aller au marque-page suivant", -- src\editor\menu_edit.lua
+ ["Go To Next Breakpoint"] = "Aller au prochain point d'arrêt", -- src\editor\menu_project.lua
+ ["Go To Previous Bookmark"] = "Aller au marque-page précédent", -- src\editor\menu_edit.lua
+ ["Go To Previous Breakpoint"] = "Aller au point d'arrêt précédent", -- src\editor\menu_project.lua
+ ["Go To Symbol..."] = "Aller au symbole...", -- src\editor\menu_search.lua
+ ["Go to file"] = "Permet d'accéder directement à un fichier", -- src\editor\menu_search.lua
+ ["Go to line"] = "Permet d'accéder directement à une ligne", -- src\editor\menu_search.lua
+ ["Go to symbol"] = "Permet d'accéder directement à un symbole", -- src\editor\menu_search.lua
+ ["Hide '.%s' Files"] = "Masquer les fichiers '.%s'", -- src\editor\filetree.lua
+ ["INS"] = "INS", -- src\editor\editor.lua
+ ["Ignore and don't index symbols from files in the selected directory"] = "Ignorer et ne pas indexer les symboles dans les fichiers provenant du répertoire sélectionné", -- src\editor\outline.lua
+ ["Ignored error in debugger initialization code: %s."] = "Une erreur dans le code d'initialisation du debogage a été ignorée: %s.", -- src\editor\debugger.lua
+ ["Indexing %d files: '%s'..."] = "%d fichiers indexés: '%s'...", -- src\editor\outline.lua
+ ["Indexing completed."] = "Indexation terminée.", -- src\editor\outline.lua
+ ["Insert Library Function..."] = "Insérer une fonction d'une bibliothèque...", -- src\editor\menu_search.lua
+ ["Known Files"] = "Fichiers connus", -- src\editor\commands.lua
+ ["Ln: %d"] = "Lig : %d", -- src\editor\editor.lua
+ ["Local console"] = "Console locale", -- src\editor\gui.lua, src\editor\shellbox.lua
+ ["Lua &Interpreter"] = "Interpréteur L&ua", -- src\editor\menu_project.lua
+ ["Map Directory..."] = "Mapper un répertoire...", -- src\editor\filetree.lua
+ ["Mapped remote request for '%s' to '%s'."] = "La requête distante pour '%s' a été associée à '%s'.", -- src\editor\debugger.lua
+ ["Markers Window"] = "Fenêtre des marqueurs", -- src\editor\menu_view.lua
+ ["Markers"] = "Marqueurs", -- src\editor\markers.lua
+ ["Match case"] = "Respecter la casse", -- src\editor\toolbar.lua
+ ["Match whole word"] = "Mot entier uniquement", -- src\editor\toolbar.lua
+ ["Mixed end-of-line encodings detected."] = "Plusieurs codages de fin de ligne ont été détectés.", -- src\editor\commands.lua
+ ["Navigate"] = "Naviguer", -- src\editor\menu_search.lua
+ ["New &File"] = "Nouveau &fichier", -- src\editor\filetree.lua
+ ["OVR"] = "OVR", -- src\editor\editor.lua
+ ["Open With Default Program"] = "Ouvrir avec le programme par défaut", -- src\editor\filetree.lua
+ ["Open an existing document"] = "Ouvre un document existant", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Open file"] = "Ouvrir un fichier", -- src\editor\commands.lua
+ ["Outline Window"] = "Structure", -- src\editor\menu_view.lua
+ ["Outline"] = "Structure", -- src\editor\outline.lua
+ ["Output (running)"] = "Sortie (en cours d'exécution)", -- src\editor\debugger.lua, src\editor\output.lua
+ ["Output (suspended)"] = "Sortie (interrompu)", -- src\editor\debugger.lua
+ ["Output"] = "Sortie", -- src\editor\debugger.lua, src\editor\output.lua, src\editor\gui.lua, src\editor\settings.lua
+ ["Page Setup..."] = "Configuration de la page...", -- src\editor\print.lua
+ ["Paste text from the clipboard"] = "Colle le texte depuis le presse-papiers", -- src\editor\menu_edit.lua
+ ["Preferences"] = "Préférences", -- src\editor\menu_edit.lua
+ ["Prepend '!' to force local execution."] = "Préfixez par '!' pour forcer une execution locale.", -- src\editor\shellbox.lua
+ ["Prepend '=' to show complex values on multiple lines."] = "Préfixez par '=' pour afficher les valeurs complexes sur plusieurs lignes.", -- src\editor\shellbox.lua
+ ["Press cancel to abort."] = "Cliquez sur Annuler pour annuler.", -- src\editor\commands.lua
+ ["Print the current document"] = "Imprimer le document courant", -- src\editor\print.lua
+ ["Program '%s' started in '%s' (pid: %d)."] = "Programme '%s' démarré dans '%s' (pid : %d).", -- src\editor\output.lua
+ ["Program can't start because conflicting process is running as '%s'."] = "Le programme ne peut démarrer à cause d'un conflit de processus avec '%s' (en cours d'exécution).", -- src\editor\output.lua
+ ["Program completed in %.2f seconds (pid: %d)."] = "Programme terminé en %.2f secondes (pid : %d).", -- src\editor\output.lua
+ ["Program starting as '%s'."] = "Programme démarré en tant que '%s'.", -- src\editor\output.lua
+ ["Program stopped (pid: %d)."] = "Programme stoppé (pid : %d).", -- src\editor\debugger.lua
+ ["Program unable to run as '%s'."] = "Impossible d'exécuter le programme en tant que '%s'.", -- src\editor\output.lua
+ ["Project Directory"] = "Répertoire de projet", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Project history"] = "Historique de projet", -- src\editor\menu_file.lua
+ ["Project"] = "Projet", -- src\editor\filetree.lua
+ ["Project/&FileTree Window"] = "&Explorateur de projet", -- src\editor\menu_view.lua
+ ["Provide command line parameters"] = "Définit les paramètres de ligne de commande", -- src\editor\menu_project.lua
+ ["Queued %d files to index."] = "%d fichiers mis en attente pour l'indexation.", -- src\editor\menu_search.lua
+ ["R/O"] = "R/O", -- src\editor\editor.lua
+ ["R/W"] = "R/W", -- src\editor\editor.lua
+ ["Re&place In Files"] = "Remp&lacer dans les fichiers", -- src\editor\menu_search.lua
+ ["Re-indent selected lines"] = "Ré-indente les lignes sélectionnées", -- src\editor\menu_edit.lua
+ ["Reached end of selection and wrapped around."] = "Fin de sélection atteinte et repositionnement en début de sélection.", -- src\editor\findreplace.lua
+ ["Reached end of text and wrapped around."] = "Fin de texte atteinte et repositionnement en début de texte.", -- src\editor\findreplace.lua
+ ["Recent Files"] = "Fichiers récents", -- src\editor\menu_file.lua
+ ["Recent Projects"] = "Projets récents", -- src\editor\menu_file.lua
+ ["Redo last edit undone"] = "Rétablit la dernière modification", -- src\editor\menu_edit.lua
+ ["Refresh Index"] = "Actualiser l'index", -- src\editor\outline.lua
+ ["Refresh indexed symbols from files in the selected directory"] = "Actualiser les symboles indexés à partir des fichiers du répertoire sélectionné", -- src\editor\outline.lua
+ ["Refresh"] = "Rafraîchir", -- src\editor\filetree.lua
+ ["Refused a request to start a new debugging session as there is one in progress already."] = "Une requête de lancement de débogage a été refusée car une session de débogage est déjà en cours.", -- src\editor\debugger.lua
+ ["Regular expression"] = "Expression régulière", -- src\editor\toolbar.lua
+ ["Remote console"] = "Console à distance", -- src\editor\shellbox.lua
+ ["Rename All Instances"] = "Renommer toutes les occurrences", -- src\editor\editor.lua
+ ["Replace All Selections"] = "Remplacer toutes les sélections", -- src\editor\editor.lua
+ ["Replace all"] = "Remplacer tout", -- src\editor\toolbar.lua
+ ["Replace next instance"] = "Remplacer l'occurence suivante", -- src\editor\toolbar.lua
+ ["Replaced %d instance."] = {"%d occurence remplacée.","%d occurences remplacées."}, -- src\editor\findreplace.lua
+ ["Replaced an invalid UTF8 character with %s."] = "Un caractère UTF8 invalide a été remplacé par %s.", -- src\editor\commands.lua
+ ["Reset to default layout"] = "Restaure l'affichage par défaut", -- src\editor\menu_view.lua
+ ["Run As Scratchpad"] = "Exécuter comme brouillon", -- src\editor\menu_project.lua
+ ["Run To Cursor"] = "Exécuter jusqu'au curseur", -- src\editor\menu_project.lua, src\editor\editor.lua
+ ["Run as Scratchpad"] = "Exécuter comme brouillon", -- src\editor\toolbar.lua
+ ["Run to cursor"] = "Exécuter jusqu'au curseur", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["S&top Debugging"] = "&Arrêter le débogage", -- src\editor\menu_project.lua
+ ["S&top Process"] = "&Arrêter le processus", -- src\editor\menu_project.lua
+ ["Save &As..."] = "Enregistrer &sous...", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["Save A&ll"] = "Enregistrer &tout", -- src\editor\menu_file.lua
+ ["Save Changes?"] = "Enregistrer les modifications ?", -- src\editor\commands.lua
+ ["Save all open documents"] = "Enregistre tous les documents ouverts", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Save file as"] = "Enregistrer le fichier sous", -- src\editor\commands.lua
+ ["Save file?"] = "Enregistrer le fichier ?", -- src\editor\commands.lua
+ ["Save the current document to a file with a new name"] = "Enregistre le document courant sous un nouveau nom", -- src\editor\menu_file.lua
+ ["Save the current document"] = "Enregistre le document courant", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Saved auto-recover at %s."] = "Récup. auto enregistrée à %s.", -- src\editor\commands.lua
+ ["Scratchpad error"] = "Erreur dans le brouillon", -- src\editor\debugger.lua
+ ["Search direction"] = "Direction de recherche", -- src\editor\toolbar.lua
+ ["Search in selection"] = "Rechercher dans la sélection", -- src\editor\toolbar.lua
+ ["Search in subdirectories"] = "Rechercher dans les sous-répertoires", -- src\editor\toolbar.lua
+ ["Searching for '%s'."] = "Recherche de '%s'.", -- src\editor\findreplace.lua
+ ["Sel: %d/%d"] = "Sel: %d/%d", -- src\editor\editor.lua
+ ["Select &All"] = "Sélectionner &tout", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Select And Find Next"] = "Sélectionner et rechercher le suivant", -- src\editor\menu_search.lua
+ ["Select And Find Previous"] = "Sélectionner et rerchercher le précédent", -- src\editor\menu_search.lua
+ ["Select all text in the editor"] = "Sélectionne tout le texte dans l'éditeur", -- src\editor\menu_edit.lua
+ ["Select the word under cursor and find its next occurrence"] = "Sélectionne le mot sous le curseur et recherche son occurence suivante", -- src\editor\menu_search.lua
+ ["Select the word under cursor and find its previous occurrence"] = "Sélectionne le mot sous le curseur et recherche son occurence précédente", -- src\editor\menu_search.lua
+ ["Set As Start File"] = "Définir le fichier en tant que point d'entrée", -- src\editor\filetree.lua
+ ["Set From Current File"] = "Définir à partir du fichier courant", -- src\editor\menu_project.lua
+ ["Set To Project Directory"] = "Utiliser le répertoire de projet", -- src\editor\findreplace.lua
+ ["Set To Selected Directory"] = "Utiliser le répertoire sélectionné", -- src\editor\filetree.lua
+ ["Set project directory from current file"] = "Définit le répertoire de projet à partir du chemin du fichier courant", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Set project directory to the selected one"] = "Faire du répertoire sélectionné le répertoire de projet", -- src\editor\filetree.lua
+ ["Set search directory"] = "Définir le répertoire de recherche", -- src\editor\toolbar.lua
+ ["Set the interpreter to be used"] = "Définit l'interpréteur à utiliser", -- src\editor\menu_project.lua
+ ["Set the project directory to be used"] = "Définit le répertoire de projet à utiliser", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Settings: System"] = "Paramètres : Système", -- src\editor\menu_edit.lua
+ ["Settings: User"] = "Paramètres : Utilisateur", -- src\editor\menu_edit.lua
+ ["Show &Tooltip"] = "Afficher l'info-&bulle", -- src\editor\menu_edit.lua
+ ["Show All Files"] = "Afficher tous les fichiers", -- src\editor\filetree.lua
+ ["Show Hidden Files"] = "Afficher les fichiers masqués", -- src\editor\filetree.lua
+ ["Show Location"] = "Afficher l'emplacement", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Show all files"] = "Affiche tous les fichiers", -- src\editor\filetree.lua
+ ["Show context"] = "Affiche le contexte", -- src\editor\toolbar.lua
+ ["Show files previously hidden"] = "Affiche les fichiers précédemment masqués", -- src\editor\filetree.lua
+ ["Show multiple result windows"] = "Affiche les multiples fenêtres de résultat", -- src\editor\toolbar.lua
+ ["Show tooltip for current position; place cursor after opening bracket of function"] = "Affiche l'info-bulle pour la position courante ; placez le curseur après la parenthèse ouvrante de la fonction", -- src\editor\menu_edit.lua
+ ["Show/Hide the status bar"] = "Affiche/Masque la barre d'état", -- src\editor\menu_view.lua
+ ["Show/Hide the toolbar"] = "Affiche/Masque la barre d'outils", -- src\editor\menu_view.lua
+ ["Sort By Name"] = "Trie par nom", -- src\editor\outline.lua
+ ["Sort selected lines"] = "Trie les lignes sélectionnées", -- src\editor\menu_edit.lua
+ ["Source"] = "Code", -- src\editor\menu_edit.lua
+ ["Stack"] = "Pile d'exécution", -- src\editor\debugger.lua
+ ["Start &Debugging"] = "Lancer le &débogage", -- src\editor\menu_project.lua
+ ["Start or continue debugging"] = "Démarre ou continue le debogage", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step &Into"] = "Pas à pas détai&llé", -- src\editor\menu_project.lua
+ ["Step &Over"] = "Pas à pas so&mmaire", -- src\editor\menu_project.lua
+ ["Step O&ut"] = "Pas à pas so&rtant", -- src\editor\menu_project.lua
+ ["Step into"] = "Rentre dans l'instruction suivante", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step out of the current function"] = "Sort de la fonction courante", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step over"] = "Enjambe l'instruction suivante", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop debugging and continue running the process"] = "Arrête le débogage et continue l'exécution du processus", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop the currently running process"] = "Arrête le processus en cours d'exécution", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Switch to or from full screen mode"] = "Active ou désactive le mode plein écran", -- src\editor\menu_view.lua
+ ["Symbol Index"] = "Index des symboles", -- src\editor\outline.lua
+ ["Text not found."] = "Texte non trouvé.", -- src\editor\findreplace.lua
+ ["The API file must be located in a subdirectory of the API directory."] = "Le fichier d'API doit être placé dans un sous-répertoire du répertoire d'API.", -- src\editor\autocomplete.lua
+ ["Toggle Bookmark"] = "Créer/Supprimer un marque-page", -- src\editor\markers.lua, src\editor\menu_edit.lua
+ ["Toggle Breakpoint"] = "Créer/Supprimer un point d'arrêt", -- src\editor\markers.lua, src\editor\menu_project.lua
+ ["Toggle bookmark"] = "Crée ou supprime un marque-page", -- src\editor\toolbar.lua, src\editor\menu_edit.lua, src\editor\markers.lua
+ ["Toggle breakpoint"] = "Crée ou supprime un point d'arrêt", -- src\editor\markers.lua, src\editor\toolbar.lua
+ ["Tr&ace"] = "&Tracer", -- src\editor\menu_project.lua
+ ["Trace execution showing each executed line"] = "Trace l'exécution en affichant chaque ligne de code exécutée", -- src\editor\menu_project.lua
+ ["Unable to create directory '%s'."] = "Impossible de créer le répertoire '%s'.", -- src\editor\filetree.lua
+ ["Unable to create file '%s'."] = "Impossible de créer le fichier '%s'.", -- src\editor\filetree.lua
+ ["Unable to delete directory '%s': %s"] = "Impossible de supprimer le répertoire '%s': %s", -- src\editor\filetree.lua
+ ["Unable to delete file '%s': %s"] = "Impossible de supprimer le fichier '%s': %s", -- src\editor\filetree.lua
+ ["Unable to load file '%s'."] = "Impossible de charger le le fichier '%s'.", -- src\editor\commands.lua
+ ["Unable to rename file '%s'."] = "Impossible de renommer le fichier '%s'.", -- src\editor\filetree.lua
+ ["Unable to save file '%s': %s"] = "Impossible d'enregistrer le fichier '%s' : %s", -- src\editor\commands.lua
+ ["Unable to stop program (pid: %d), code %d."] = "Impossible d'arrêter le programme (pid : %d), code %d.", -- src\editor\debugger.lua
+ ["Undo last edit"] = "Annule la dernière modification", -- src\editor\menu_edit.lua
+ ["Unmap Directory"] = "Démapper le répertoire", -- src\editor\filetree.lua
+ ["Unset '%s' As Start File"] = "Ne plus utiliser le fichier '%s' en tant que point d'entrée", -- src\editor\filetree.lua
+ ["Updated %d file."] = {"%d fichier mis à jour.","%d fichiers mis à jour."}, -- src\editor\findreplace.lua
+ ["Updating symbol index and settings..."] = "Mise à jour en cours de l'index des symboles et des paramètres...", -- src\editor\outline.lua
+ ["Use %s to close."] = "Utiliser %s pour fermer.", -- src\editor\findreplace.lua
+ ["Use '%s' to see full description."] = "Utilisez '%s' pour voir la description complète.", -- src\editor\editor.lua
+ ["Use '%s' to show line endings and '%s' to convert them."] = "Utilisez '%s' pour afficher les fins de ligne et '%s' pour les convertir.", -- src\editor\commands.lua
+ ["Use 'clear' to clear the shell output and the history."] = "Utilisez 'clear' pour effacer la sortie console et l´historique.", -- src\editor\shellbox.lua
+ ["Use Shift-Enter for multiline code."] = "Appuyez sur <Shift-Entrée> pour du code multiligne.", -- src\editor\shellbox.lua
+ ["View the markers window"] = "Afficher la fenêtre des marqueurs", -- src\editor\menu_view.lua
+ ["View the outline window"] = "Affiche la fenêtre de structure", -- src\editor\menu_view.lua
+ ["View the output/console window"] = "Affiche la fenêtre de sortie/console", -- src\editor\menu_view.lua
+ ["View the project/filetree window"] = "Affiche la fenêtre d'explorateur de projet", -- src\editor\menu_view.lua
+ ["View the stack window"] = "Affiche la fenêtre de pile d'exécution", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["View the watch window"] = "Affiche la fenêtre d'expressions espionnes", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["Watch"] = "Expressions espionnes", -- src\editor\debugger.lua
+ ["Welcome to the interactive Lua interpreter."] = "Bienvenue dans l´interpréteur interactif Lua.", -- src\editor\shellbox.lua
+ ["Wrap around"] = "Boucler", -- src\editor\toolbar.lua
+ ["You must save the program first."] = "Vous devez d'abord enregistrer le programme.", -- src\editor\commands.lua
+ ["Zoom In"] = "Zoomer", -- src\editor\menu_view.lua
+ ["Zoom Out"] = "Dézoomer", -- src\editor\menu_view.lua
+ ["Zoom to 100%"] = "Zoomer à 100%", -- src\editor\menu_view.lua
+ ["Zoom"] = "Zoom", -- src\editor\menu_view.lua
+ ["on line %d"] = "à la ligne %d", -- src\editor\debugger.lua, src\editor\editor.lua, src\editor\commands.lua
+ ["traced %d instruction"] = {"%d instruction tracée", "%d instructions tracées"}, -- src\editor\debugger.lua
+ ["unknown error"] = "erreur inconnue", -- src\editor\debugger.lua
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/it.lua b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/it.lua
new file mode 100644
index 0000000..5911a3c
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/it.lua
@@ -0,0 +1,345 @@
+return {
+ [0] = function(c) return c == 1 and 1 or 2 end, -- plural
+ ["%s event failed: %s"] = "L'evento %s è fallito : %s", -- src\editor\package.lua
+ ["%s%% formatted..."] = "%s%% formattato...", -- src\editor\print.lua
+ ["%s%% loaded..."] = "%s%% caricato...", -- src\editor\commands.lua
+ ["&About"] = "Informazioni", -- src\editor\menu_help.lua
+ ["&Add Watch"] = "&Aggiungi Espressione di Controllo", -- src\editor\debugger.lua
+ ["&Break"] = "Interrompi", -- src\editor\menu_project.lua
+ ["&Close Page"] = "&Chiudi pagina", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Community"] = "&Comunità", -- src\editor\menu_help.lua
+ ["&Compile"] = "&Compila", -- src\editor\menu_project.lua
+ ["&Copy Value"] = "&Copia Valore", -- src\editor\debugger.lua
+ ["&Copy"] = "&Copia", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Default Layout"] = "Visualizzazione di &Default", -- src\editor\menu_view.lua
+ ["&Delete Watch"] = "Elimina Espressione di Controllo", -- src\editor\debugger.lua
+ ["&Delete"] = "Elimina", -- src\editor\filetree.lua
+ ["&Documentation"] = "Documentazione", -- src\editor\menu_help.lua
+ ["&Edit Project Directory"] = "Modifica directory di progetto", -- src\editor\filetree.lua
+ ["&Edit Value"] = "Modifica Valore", -- src\editor\debugger.lua
+ ["&Edit Watch"] = "Modifica Espressione di Controllo", -- src\editor\debugger.lua
+ ["&Edit"] = "Modifica", -- src\editor\menu_edit.lua
+ ["&File"] = "File", -- src\editor\menu_file.lua
+ ["&Find"] = "Ricerca", -- src\editor\menu_search.lua
+ ["&Fold/Unfold All"] = "Apri/Chiudi tutto", -- src\editor\menu_edit.lua
+ ["&Frequently Asked Questions"] = "Domande &Frequenti", -- src\editor\menu_help.lua
+ ["&Getting Started Guide"] = "&Guida Introduttiva", -- src\editor\menu_help.lua
+ ["&Help"] = "Aiuto", -- src\editor\menu_help.lua
+ ["&New Directory"] = "&Nuova Directory", -- src\editor\filetree.lua
+ ["&New"] = "&Nuovo", -- src\editor\menu_file.lua
+ ["&Open..."] = "&Apri...", -- src\editor\menu_file.lua
+ ["&Output/Console Window"] = "Finestra di Output/Console", -- src\editor\menu_view.lua
+ ["&Paste"] = "Incolla", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Print..."] = "Stampa...", -- src\editor\print.lua
+ ["&Project Page"] = "&Pagina di Progetto", -- src\editor\menu_help.lua
+ ["&Project"] = "&Progetto", -- src\editor\menu_project.lua
+ ["&Redo"] = "&Ripeti", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Rename"] = "&Rinomina", -- src\editor\filetree.lua
+ ["&Replace"] = "Sostituisci", -- src\editor\menu_search.lua
+ ["&Run"] = "Lancia", -- src\editor\menu_project.lua
+ ["&Save"] = "&Salva", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Search"] = "Ricerca", -- src\editor\menu_search.lua
+ ["&Select Command"] = "Seleziona Comando", -- src\editor\gui.lua
+ ["&Sort"] = "Ordina", -- src\editor\menu_edit.lua
+ ["&Stack Window"] = "Stack di chiamate", -- src\editor\menu_view.lua
+ ["&Start Debugger Server"] = "Avvia Debugger Server", -- src\editor\menu_project.lua
+ ["&Status Bar"] = "Barra di stato", -- src\editor\menu_view.lua
+ ["&Tool Bar"] = "Barra degli strumenti", -- src\editor\menu_view.lua
+ ["&Tutorials"] = "Guide", -- src\editor\menu_help.lua
+ ["&Undo"] = "Annulla", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&View"] = "Visualizza", -- src\editor\menu_view.lua
+ ["&Watch Window"] = "Finestra Espressioni di Controllo", -- src\editor\menu_view.lua
+ ["About %s"] = "Informazioni su %s", -- src\editor\menu_help.lua
+ ["Add To Scratchpad"] = "Aggiungi a Scratchpad ", -- src\editor\editor.lua
+ ["Add Watch Expression"] = "Aggiungi Espressione di Controllo", -- src\editor\editor.lua
+ ["All files"] = "Tutti i files", -- src\editor\commands.lua
+ ["Allow external process to start debugging"] = "Permetti a processi esterni di avviare il debug", -- src\editor\menu_project.lua
+ ["Analyze the source code"] = "Analizza il codice", -- src\editor\inspect.lua
+ ["Analyze"] = "Analizza", -- src\editor\inspect.lua
+ ["Auto Complete Identifiers"] = "Autocompletamento identificatori", -- src\editor\menu_edit.lua
+ ["Auto complete while typing"] = "Autocompletamento in linea", -- src\editor\menu_edit.lua
+ ["Binary file is shown as read-only as it is only partially loaded."] = "Il file binario è aperto in sola lettura, poichè caricato solo parzialmente.", -- src\editor\commands.lua
+ ["Bookmark"] = "Segnalibro", -- src\editor\menu_edit.lua
+ ["Break execution at the next executed line of code"] = "Interrompi l'esecuzione alla successiva riga di codice ", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Breakpoint"] = "Punto di Interruzione", -- src\editor\menu_project.lua
+ ["C&lear Console Window"] = "Pulisci finestra console", -- src\editor\gui.lua
+ ["C&lear Output Window"] = "Pulisci finestra di output", -- src\editor\gui.lua, src\editor\menu_project.lua
+ ["C&omment/Uncomment"] = "Commenta/Scommenta", -- src\editor\menu_edit.lua
+ ["Can't evaluate the expression while the application is running."] = "Impossibile interpretare l'espressione se l'applicazione è in esecuzione.", -- src\editor\debugger.lua
+ ["Can't open file '%s': %s"] = "Impossibile aprire il file '%s': %s", -- src\editor\findreplace.lua, src\editor\singleinstance.lua, src\editor\inspect.lua, src\editor\outline.lua
+ ["Can't process auto-recovery record; invalid format: %s."] = "Impossibile procedere all'auto-recovery; Formato non valido: %s.", -- src\editor\commands.lua
+ ["Can't replace in read-only text."] = "Impossibile sostituire in un testo in sola lettura", -- src\editor\findreplace.lua
+ ["Can't run the entry point script ('%s')."] = "Impossibile eseguire il punto di ingresos dello script (%s).", -- src\editor\debugger.lua
+ ["Can't start debugger server at %s:%d: %s."] = "Impossibile lanciare il server debugger a %s:%d: %s.", -- src\editor\debugger.lua
+ ["Can't start debugging for '%s'."] = "Impossibile iniziare il debug perchè '%s'.", -- src\editor\debugger.lua
+ ["Can't start debugging session due to internal error '%s'."] = "Impossibile lanciare la sessione di debug: errore interno '%s'.'", -- src\editor\debugger.lua
+ ["Can't start debugging without an opened file or with the current file not being saved ('%s')."] = "Impossibile lanciare il debug senza aver aperto un file o se il file corrente non è stato salvato ('%s').", -- src\editor\debugger.lua
+ ["Can't stop debugger server as it is not started."] = "Impossibile fermare il server debugger perchè non è stato avviato", -- src\editor\debugger.lua
+ ["Cancelled by the user."] = "Annullato dall'utente", -- src\editor\findreplace.lua
+ ["Choose a directory to map"] = "Scegli una directory da mappare", -- src\editor\filetree.lua
+ ["Choose a project directory"] = "Scegli la directory di un progetto", -- src\editor\toolbar.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Choose a search directory"] = "Scegli una directory di ricerca", -- src\editor\findreplace.lua
+ ["Choose..."] = "Scegli...", -- src\editor\findreplace.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Clear Items"] = "Pulisci elementi", -- src\editor\findreplace.lua, src\editor\menu_file.lua
+ ["Clear items from this list"] = "Pulisci elementi della lista", -- src\editor\menu_file.lua
+ ["Clear the output window before compiling or debugging"] = "Pulisci la finestra di output prima di compilare o lanciare debug", -- src\editor\menu_project.lua
+ ["Close &Other Pages"] = "Chidi le Altre Pagine", -- src\editor\gui.lua
+ ["Close A&ll Pages"] = "Chiudi Tutte le Pagine", -- src\editor\gui.lua
+ ["Close the current editor window"] = "Chiude la finestra dell'edit corrente", -- src\editor\menu_file.lua
+ ["Co&ntinue"] = "Co&ntinua", -- src\editor\menu_project.lua
+ ["Col: %d"] = "Col: %d", -- src\editor\editor.lua
+ ["Command Line Parameters..."] = "Parametri Riga di Comando...", -- src\editor\menu_project.lua
+ ["Command line parameters"] = "Parametri Riga di Comando", -- src\editor\menu_project.lua
+ ["Comment or uncomment current or selected lines"] = "Commenta o scommenta la linea corrente o selezionat", -- src\editor\menu_edit.lua
+ ["Compilation error"] = "Errore di compilazione", -- src\editor\commands.lua, src\editor\debugger.lua
+ ["Compilation successful; %.0f%% success rate (%d/%d)."] = "Compilazione riuscita; tasso di successo : %.0f%% (%d/%d).", -- src\editor\commands.lua
+ ["Compile the current file"] = "Compila il file corrente", -- src\editor\menu_project.lua
+ ["Complete &Identifier"] = "Completa l'&Identificatore", -- src\editor\menu_edit.lua
+ ["Complete the current identifier"] = "Completa l'identificatore corrente", -- src\editor\menu_edit.lua
+ ["Consider removing backslash from escape sequence '%s'."] = "Prova a rimuovere i backslash dalla sequenza di escape '%s'.", -- src\editor\commands.lua
+ ["Copy Full Path"] = "Copia Path Completo", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Copy selected text to clipboard"] = "Copia il testo selezionato negli appunti", -- src\editor\menu_edit.lua
+ ["Correct &Indentation"] = "Correggi &Indentazione", -- src\editor\menu_edit.lua
+ ["Couldn't activate file '%s' for debugging; continuing without it."] = "Impossibile attivare il file '%s' per debug; si prosegue senza.", -- src\editor\debugger.lua
+ ["Create an empty document"] = "Crea un documento vuoto", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Cu&t"] = "&Taglia", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Cut selected text to clipboard"] = "Taglia il testo selezionato e mette negli appunti", -- src\editor\menu_edit.lua
+ ["Debugger server started at %s:%d."] = "Server Debugger iniziato %s:%d.", -- src\editor\debugger.lua
+ ["Debugger server stopped at %s:%d."] = "Server Debugger fermato %s:%d.", -- src\editor\debugger.lua
+ ["Debugging session completed (%s)."] = "Sessione di debug completata (%s).", -- src\editor\debugger.lua
+ ["Debugging session started in '%s'."] = "Sessione di debug iniziata da '%s'.", -- src\editor\debugger.lua
+ ["Debugging suspended at '%s:%s' (couldn't activate the file)."] = "Debug sospeso a '%s:%s' (impossibile attivare il file).", -- src\editor\debugger.lua
+ ["Detach &Process"] = "Scollega Processo", -- src\editor\menu_project.lua
+ ["Disable Indexing For '%s'"] = "Disabilita Indicizzazione per '%s'", -- src\editor\outline.lua
+ ["Do you want to delete '%s'?"] = "Vuoi eliminare '%s'?", -- src\editor\filetree.lua
+ ["Do you want to overwrite it?"] = "Vuoi sovrascrivere '%s'?", -- src\editor\commands.lua
+ ["Do you want to reload it?"] = "Vuoi ricaricarlo?", -- src\editor\editor.lua
+ ["Do you want to save the changes to '%s'?"] = "Vuoi salvare le modifiche a '%s'?", -- src\editor\commands.lua
+ ["E&xit"] = "Uscita", -- src\editor\menu_file.lua
+ ["Enable Indexing"] = "Abilita Indicizzazione", -- src\editor\outline.lua
+ ["Enter Lua code and press Enter to run it."] = "Inserisci codice Lua e premi <Enter> per eseguirlo.", -- src\editor\shellbox.lua
+ ["Enter command line parameters (use Cancel to clear)"] = "Inserisci i parametri riga di comando (Annulla per pulire)", -- src\editor\menu_project.lua
+ ["Enter replacement text"] = "Inserisci il testo da sostituire", -- src\editor\editor.lua
+ ["Error while loading API file: %s"] = "Errore durante il caricamento del file API: %s", -- src\editor\autocomplete.lua
+ ["Error while loading configuration file: %s"] = "Errore nel caricamento del file di configurazione: %s", -- src\editor\style.lua
+ ["Error while processing API file: %s"] = "Errore durante l'elaborazione del file API: %s", -- src\editor\autocomplete.lua
+ ["Error while processing configuration file: %s"] = "Errore durante l'elaborazione del file di configurazione: %s", -- src\editor\style.lua
+ ["Error"] = "Errore", -- src\editor\commands.lua
+ ["Evaluate In Console"] = "Elabora in console", -- src\editor\editor.lua
+ ["Execute the current project/file and keep updating the code to see immediate results"] = "Esegue il progetto/file corrente e permette di modificare il codice per vedere i risultati in tempo reale", -- src\editor\menu_project.lua
+ ["Execute the current project/file"] = "Esegue il progetto/file corrente", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Execution error"] = "Errore di esecuzione", -- src\editor\debugger.lua
+ ["Exit program"] = "Uscita dal programma", -- src\editor\menu_file.lua
+ ["File '%s' has been modified on disk."] = "Il file '%s' e' stato modificato sul disco.", -- src\editor\editor.lua
+ ["File '%s' has more recent timestamp than restored '%s'; please review before saving."] = "Il file '%s' ha un timestamp più recente di quello ripristinato '%s'; verificare prima di salvare.", -- src\editor\commands.lua
+ ["File '%s' is missing and can't be recovered."] = "Il file '%s' non è stato trovato e non può essere recuperato.", -- src\editor\commands.lua
+ ["File '%s' no longer exists."] = "Il file '%s' non esiste piu'.", -- src\editor\menu_file.lua, src\editor\editor.lua
+ ["File already exists."] = "Il file esiste già.", -- src\editor\commands.lua
+ ["File history"] = "Storia del file", -- src\editor\menu_file.lua
+ ["Find &In Files"] = "Ricerca nei files", -- src\editor\menu_search.lua
+ ["Find &Next"] = "Cerca il successivo", -- src\editor\menu_search.lua
+ ["Find &Previous"] = "Cerca il precedente", -- src\editor\menu_search.lua
+ ["Find and insert library function"] = "Trova e inserisci funzione di libreria", -- src\editor\menu_search.lua
+ ["Find and replace text in files"] = "Cerca e sostituisci testo nei files", -- src\editor\menu_search.lua
+ ["Find and replace text"] = "Cerca e sostituisci testo", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find in files"] = "Ricerca nei files", -- src\editor\toolbar.lua
+ ["Find text in files"] = "Cerca testo nei files", -- src\editor\menu_search.lua
+ ["Find text"] = "Cerca testo", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find the earlier text occurence"] = "Cerca la precedente occorrenza nel testo", -- src\editor\menu_search.lua
+ ["Find the next text occurrence"] = "Cerca la successiva occorrenza nel testo", -- src\editor\menu_search.lua
+ ["Find"] = "Ricerca", -- src\editor\toolbar.lua
+ ["Fold or unfold all code folds"] = "Apri o chiudi tutti i blocchi di codice", -- src\editor\menu_edit.lua
+ ["Formatting page %d..."] = "Formattazione pagina %d...", -- src\editor\print.lua
+ ["Found %d instance."] = {"Trovata %d istanza.", "Trovate %d istanze."}, -- src\editor\findreplace.lua
+ ["Found auto-recovery record and restored saved session."] = "Trovato punto di auto-revcovery e ripristinata la sessione salvata", -- src\editor\commands.lua
+ ["Full &Screen"] = "Schermo intero", -- src\editor\menu_view.lua
+ ["Go To Definition"] = "Vai a Definizione", -- src\editor\editor.lua
+ ["Go To File..."] = "Vai al File...", -- src\editor\menu_search.lua
+ ["Go To Line..."] = "Vai a riga...", -- src\editor\menu_search.lua
+ ["Go To Next Bookmark"] = "Vai al Prossimo Segnalibro", -- src\editor\menu_edit.lua
+ ["Go To Next Breakpoint"] = "Vai al Prossimo Punto di Interruzione", -- src\editor\menu_project.lua
+ ["Go To Previous Bookmark"] = "Vai al Precedente Segnalibro", -- src\editor\menu_edit.lua
+ ["Go To Previous Breakpoint"] = "Vail al Precedente Punto di Interruzione", -- src\editor\menu_project.lua
+ ["Go To Symbol..."] = "Vai al Simbolo...", -- src\editor\menu_search.lua
+ ["Go to file"] = "Vai al file", -- src\editor\menu_search.lua
+ ["Go to line"] = "Vai alla riga", -- src\editor\menu_search.lua
+ ["Go to symbol"] = "Vai al simbolo", -- src\editor\menu_search.lua
+ ["Hide '.%s' Files"] = "Nascondi Files '.%s'", -- src\editor\filetree.lua
+ ["INS"] = "INS", -- src\editor\editor.lua
+ ["Ignore and don't index symbols from files in the selected directory"] = "Ignora e non indicizzare simboli nella directory selezionata", -- src\editor\outline.lua
+ ["Ignored error in debugger initialization code: %s."] = "Errore ignorato durante l'inizializzaione del debugger codice: %s.", -- src\editor\debugger.lua
+ ["Indexing %d files: '%s'..."] = "Indicizzazione %d file: '%s'...", -- src\editor\outline.lua
+ ["Indexing completed."] = "Indicizzazione completata", -- src\editor\outline.lua
+ ["Insert Library Function..."] = "Inserisci Funzione di Libreria...", -- src\editor\menu_search.lua
+ ["Known Files"] = "Files conosciuti", -- src\editor\commands.lua
+ ["Ln: %d"] = "Ln: %d", -- src\editor\editor.lua
+ ["Local console"] = "Console locale", -- src\editor\gui.lua, src\editor\shellbox.lua
+ ["Lua &Interpreter"] = "&Interprete Lua", -- src\editor\menu_project.lua
+ ["Map Directory..."] = "Mappa directory...", -- src\editor\filetree.lua
+ ["Mapped remote request for '%s' to '%s'."] = "Richiesta remota '%s' mappata su '%s'.", -- src\editor\debugger.lua
+ ["Markers Window"] = "Finestra Marcatori", -- src\editor\menu_view.lua
+ ["Markers"] = "Marcatori", -- src\editor\markers.lua
+ ["Match case"] = "Maiuscole/Minuscole", -- src\editor\toolbar.lua
+ ["Match whole word"] = "Intera parola", -- src\editor\toolbar.lua
+ ["Mixed end-of-line encodings detected."] = "Trovata codifica Fine-Riga mista.", -- src\editor\commands.lua
+ ["Navigate"] = "Naviga", -- src\editor\menu_search.lua
+ ["New &File"] = "Nuovo &File", -- src\editor\filetree.lua
+ ["OVR"] = "OVR", -- src\editor\editor.lua
+ ["Open With Default Program"] = "Apri con programma predefinito", -- src\editor\filetree.lua
+ ["Open an existing document"] = "Apri un documento esistente", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Open file"] = "Apri un file", -- src\editor\commands.lua
+ ["Outline Window"] = "Finestra Outline", -- src\editor\menu_view.lua
+ ["Outline"] = "Outline", -- src\editor\outline.lua
+ ["Output (running)"] = "Output (in corso d'esecuzione)", -- src\editor\debugger.lua, src\editor\output.lua
+ ["Output (suspended)"] = "Output (sospeso)", -- src\editor\debugger.lua
+ ["Output"] = "Output", -- src\editor\debugger.lua, src\editor\output.lua, src\editor\gui.lua, src\editor\settings.lua
+ ["Page Setup..."] = "Impostazione Pagina...", -- src\editor\print.lua
+ ["Paste text from the clipboard"] = "Incolla testo dagli appunti", -- src\editor\menu_edit.lua
+ ["Preferences"] = "Preferenze", -- src\editor\menu_edit.lua
+ ["Prepend '!' to force local execution."] = "Prefissa con '!' per forzare l'esecuzione locale", -- src\editor\shellbox.lua
+ ["Prepend '=' to show complex values on multiple lines."] = "Prefissa con '=' per visualizzare valori complessi su piu` righe", -- src\editor\shellbox.lua
+ ["Press cancel to abort."] = "Premi cancel per bloccare.", -- src\editor\commands.lua
+ ["Print the current document"] = "Stampa il documento corrente", -- src\editor\print.lua
+ ["Program '%s' started in '%s' (pid: %d)."] = "Programma '%s' partito da '%s' (pid: %d).", -- src\editor\output.lua
+ ["Program can't start because conflicting process is running as '%s'."] = "Il programma non puo' partire perchè in conflitto con il processo in esecuzione '%s'.", -- src\editor\output.lua
+ ["Program completed in %.2f seconds (pid: %d)."] = "Programma completato in %.2f secondi (pid: %d).", -- src\editor\output.lua
+ ["Program starting as '%s'."] = "Programma partito da '%s'.", -- src\editor\output.lua
+ ["Program stopped (pid: %d)."] = "Programma fermato (pid: %d).", -- src\editor\debugger.lua
+ ["Program unable to run as '%s'."] = "Il programma non puo' partire '%s'.", -- src\editor\output.lua
+ ["Project Directory"] = "Directory del Progetto", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Project history"] = "Storia del Progetto", -- src\editor\menu_file.lua
+ ["Project"] = "Progetto", -- src\editor\filetree.lua
+ ["Project/&FileTree Window"] = "Progetto/Explorer", -- src\editor\menu_view.lua
+ ["Provide command line parameters"] = "Fornire parametri riga di comando", -- src\editor\menu_project.lua
+ ["Queued %d files to index."] = "Accodati %d file per indicizzazione.", -- src\editor\menu_search.lua
+ ["R/O"] = "R/O", -- src\editor\editor.lua
+ ["R/W"] = "R/W", -- src\editor\editor.lua
+ ["Re&place In Files"] = "Sostituisci nei files", -- src\editor\menu_search.lua
+ ["Re-indent selected lines"] = "Re-indenta le linee selezionate", -- src\editor\menu_edit.lua
+ ["Reached end of selection and wrapped around."] = "Raggiunta la fine della selezione e ricominciato da inizio ", -- src\editor\findreplace.lua
+ ["Reached end of text and wrapped around."] = "Raggiunta la fine del testo e ricominciato da inizio", -- src\editor\findreplace.lua
+ ["Recent Files"] = "Files recenti", -- src\editor\menu_file.lua
+ ["Recent Projects"] = "Progetti Recenti", -- src\editor\menu_file.lua
+ ["Redo last edit undone"] = "Ripeti l'ultima azione annullata", -- src\editor\menu_edit.lua
+ ["Refresh Index"] = "Aggiorna Indici", -- src\editor\outline.lua
+ ["Refresh indexed symbols from files in the selected directory"] = "Aggiorna simboli indicizzati dai files nella directory selezionata", -- src\editor\outline.lua
+ ["Refresh"] = "Rinfrescare", -- src\editor\filetree.lua
+ ["Refused a request to start a new debugging session as there is one in progress already."] = "Impossibile aprire una nuova sessione di debug in quanto ne esiste una in corso", -- src\editor\debugger.lua
+ ["Regular expression"] = "Regular expression", -- src\editor\toolbar.lua
+ ["Remote console"] = "Console remota", -- src\editor\shellbox.lua
+ ["Rename All Instances"] = "Rinomina tutte le occorrenze", -- src\editor\editor.lua
+ ["Replace All Selections"] = "Sostituisci Tutte le Selezioni", -- src\editor\editor.lua
+ ["Replace all"] = "Sostituisci Tutto", -- src\editor\toolbar.lua
+ ["Replace next instance"] = "Sostituisci istanza successiva", -- src\editor\toolbar.lua
+ ["Replaced %d instance."] = {"Sostituita %d istanza.", "Sostituite %d istanze."}, -- src\editor\findreplace.lua
+ ["Replaced an invalid UTF8 character with %s."] = "Sostituito un carattere UTF8 invalido con %s.", -- src\editor\commands.lua
+ ["Reset to default layout"] = "Ritorna al default layout", -- src\editor\menu_view.lua
+ ["Run As Scratchpad"] = "Esegui in Scratchpad (Live coding)", -- src\editor\menu_project.lua
+ ["Run To Cursor"] = "Esegui fino al Cursore", -- src\editor\menu_project.lua, src\editor\editor.lua
+ ["Run as Scratchpad"] = "Esegui in Scratchpad (Live coding)", -- src\editor\toolbar.lua
+ ["Run to cursor"] = "Esegui fino al cursore", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["S&top Debugging"] = "Ferma il debugger", -- src\editor\menu_project.lua
+ ["S&top Process"] = "Ferma il processo", -- src\editor\menu_project.lua
+ ["Save &As..."] = "S&alva con nome...", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["Save A&ll"] = "Sa&lva tutto", -- src\editor\menu_file.lua
+ ["Save Changes?"] = "Vuoi salvare le modifiche?", -- src\editor\commands.lua
+ ["Save all open documents"] = "Salva tutti i documenti aperti", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Save file as"] = "Salva il file con nome", -- src\editor\commands.lua
+ ["Save file?"] = "Vuoi salvare il file?", -- src\editor\commands.lua
+ ["Save the current document to a file with a new name"] = "Salva il documento corrente in un file con un nuovo nome", -- src\editor\menu_file.lua
+ ["Save the current document"] = "Salva il documento corrente", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Saved auto-recover at %s."] = "Salvato auto-recover a %s.", -- src\editor\commands.lua
+ ["Scratchpad error"] = "Errore durente Scratchpad", -- src\editor\debugger.lua
+ ["Search direction"] = "Direzione ricerca", -- src\editor\toolbar.lua
+ ["Search in selection"] = "Ricerca nella selezione", -- src\editor\toolbar.lua
+ ["Search in subdirectories"] = "Ricerca nelle sotto-directory", -- src\editor\toolbar.lua
+ ["Searching for '%s'."] = "Ricerca di '%s'.", -- src\editor\findreplace.lua
+ ["Sel: %d/%d"] = "Sel: %d/%d", -- src\editor\editor.lua
+ ["Select &All"] = "Selezion&a Tutto", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Select And Find Next"] = "Seleziona e trova successivo", -- src\editor\menu_search.lua
+ ["Select And Find Previous"] = "Seleziona e trova precedente", -- src\editor\menu_search.lua
+ ["Select all text in the editor"] = "Seleziona tutto il testo nell'editor", -- src\editor\menu_edit.lua
+ ["Select the word under cursor and find its next occurrence"] = "Seleziona la parola e trova successivo", -- src\editor\menu_search.lua
+ ["Select the word under cursor and find its previous occurrence"] = "Seleziona la parola e trova precedente", -- src\editor\menu_search.lua
+ ["Set As Start File"] = "Imposta come File di Partenza", -- src\editor\filetree.lua
+ ["Set From Current File"] = "Impostato da file corrente", -- src\editor\menu_project.lua
+ ["Set To Project Directory"] = "Imposta a Directory di Progetto", -- src\editor\findreplace.lua
+ ["Set To Selected Directory"] = "Imposta a Directory Selezionata", -- src\editor\filetree.lua
+ ["Set project directory from current file"] = "Definisci la directory del progeetto dal file corrente", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Set project directory to the selected one"] = "Imposta la directory di progetto dalla directory selezionata", -- src\editor\filetree.lua
+ ["Set search directory"] = "Imposta directory ricerca", -- src\editor\toolbar.lua
+ ["Set the interpreter to be used"] = "Definisci l'interprete da utilizzare", -- src\editor\menu_project.lua
+ ["Set the project directory to be used"] = "Imposta la directory di progetto da usare", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Settings: System"] = "Impostazioni: Sistema", -- src\editor\menu_edit.lua
+ ["Settings: User"] = "Impostazioni: Utente", -- src\editor\menu_edit.lua
+ ["Show &Tooltip"] = "Mos&tra i consigli", -- src\editor\menu_edit.lua
+ ["Show All Files"] = "Mostra Tutti i File", -- src\editor\filetree.lua
+ ["Show Hidden Files"] = "Mostra File nascosti", -- src\editor\filetree.lua
+ ["Show Location"] = "Mostra posizione", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Show all files"] = "Mostra tutti i file", -- src\editor\filetree.lua
+ ["Show context"] = "Mostra contesto", -- src\editor\toolbar.lua
+ ["Show files previously hidden"] = "Mostra i file precedentemente nascosti", -- src\editor\filetree.lua
+ ["Show multiple result windows"] = "Mostra più finestre dei risultati", -- src\editor\toolbar.lua
+ ["Show tooltip for current position; place cursor after opening bracket of function"] = "Mostra i consigli per la posizione corrente; muovi il cursore dopo la parentesi o la funzione", -- src\editor\menu_edit.lua
+ ["Show/Hide the status bar"] = "Mostra/Nascondi la barra di stato", -- src\editor\menu_view.lua
+ ["Show/Hide the toolbar"] = "Mostra/Nascondi la barra degli strumenti", -- src\editor\menu_view.lua
+ ["Sort By Name"] = "Ordina per Nome", -- src\editor\outline.lua
+ ["Sort selected lines"] = "Ordina le righe selezionate", -- src\editor\menu_edit.lua
+ ["Source"] = "Sorgente", -- src\editor\menu_edit.lua
+ ["Stack"] = "Stack", -- src\editor\debugger.lua
+ ["Start &Debugging"] = "Inizia il &Debug", -- src\editor\menu_project.lua
+ ["Start or continue debugging"] = "Inizia o continua il debug", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step &Into"] = "Step &Into", -- src\editor\menu_project.lua
+ ["Step &Over"] = "Step &Over", -- src\editor\menu_project.lua
+ ["Step O&ut"] = "Step O&ut", -- src\editor\menu_project.lua
+ ["Step into"] = "Step into", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step out of the current function"] = "Contina fino all'uscita della funzione", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step over"] = "Continua senza entrare nella funzione", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop debugging and continue running the process"] = "Ferma il debug e continua l'esecuzione del processo", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop the currently running process"] = "Ferma il processo in esecuzione", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Switch to or from full screen mode"] = "Passa da tutto schermo a finestra", -- src\editor\menu_view.lua
+ ["Symbol Index"] = "Indice Simboli", -- src\editor\outline.lua
+ ["Text not found."] = "Testo non trovato.", -- src\editor\findreplace.lua
+ ["The API file must be located in a subdirectory of the API directory."] = "Il file API deve essere presente in una sottodirectory o nella direcotory API.", -- src\editor\autocomplete.lua
+ ["Toggle Bookmark"] = "Attiva/Disattiva Segnalibro", -- src\editor\markers.lua, src\editor\menu_edit.lua
+ ["Toggle Breakpoint"] = "Attiva/Disattiva Breakpoint", -- src\editor\markers.lua, src\editor\menu_project.lua
+ ["Toggle bookmark"] = "Attiva/Disattiva Segnalibro", -- src\editor\toolbar.lua, src\editor\menu_edit.lua, src\editor\markers.lua
+ ["Toggle breakpoint"] = "Attiva/Disattiva Breakpoint", -- src\editor\markers.lua, src\editor\toolbar.lua
+ ["Tr&ace"] = "Tr&ace", -- src\editor\menu_project.lua
+ ["Trace execution showing each executed line"] = "Traccia l'esecuzione mostrando le righe eseguite", -- src\editor\menu_project.lua
+ ["Unable to create directory '%s'."] = "Impossibile creare la directory '%s'.", -- src\editor\filetree.lua
+ ["Unable to create file '%s'."] = "Impossibile creare il file '%s'.", -- src\editor\filetree.lua
+ ["Unable to delete directory '%s': %s"] = "Impossibile cancellare la directory '%s': %s", -- src\editor\filetree.lua
+ ["Unable to delete file '%s': %s"] = "Impossibile cancellare file '%s': %s", -- src\editor\filetree.lua
+ ["Unable to load file '%s'."] = "Impossibile aprire il file '%s'.", -- src\editor\commands.lua
+ ["Unable to rename file '%s'."] = "Impossibile rinominare il file '%s'.", -- src\editor\filetree.lua
+ ["Unable to save file '%s': %s"] = "Impossibile salvare il file '%s': %s", -- src\editor\commands.lua
+ ["Unable to stop program (pid: %d), code %d."] = "Impossibile fermare il programma (pid: %d), code %d.", -- src\editor\debugger.lua
+ ["Undo last edit"] = "Annulla l'ultima azione di edit", -- src\editor\menu_edit.lua
+ ["Unmap Directory"] = "Togli mappatura Directory", -- src\editor\filetree.lua
+ ["Unset '%s' As Start File"] = "Togli '%s' come File di Partenza", -- src\editor\filetree.lua
+ ["Updated %d file."] = {"Aggiornato %d file.", "Aggiornati %d file."}, -- src\editor\findreplace.lua
+ ["Updating symbol index and settings..."] = "Aggiornamento indice simbili e impostazioni...", -- src\editor\outline.lua
+ ["Use %s to close."] = "Utilizza %s per chiudere.", -- src\editor\findreplace.lua
+ ["Use '%s' to see full description."] = "Utilizza '%s' per vedere la descrizione completa.", -- src\editor\editor.lua
+ ["Use '%s' to show line endings and '%s' to convert them."] = "Utilizza '%s' per vedere la fine della riga e '%s' per convertirli.", -- src\editor\commands.lua
+ ["Use 'clear' to clear the shell output and the history."] = "Utilizza 'clear' per pulire l`output e lo storico.", -- src\editor\shellbox.lua
+ ["Use Shift-Enter for multiline code."] = "Premi <Shift-Invio> per inserire piu` righe di codice.", -- src\editor\shellbox.lua
+ ["View the markers window"] = "Visualizza la finestra dei marcatori", -- src\editor\menu_view.lua
+ ["View the outline window"] = "Visualizza la finestra di outline", -- src\editor\menu_view.lua
+ ["View the output/console window"] = "Mostra la finestra di output/console", -- src\editor\menu_view.lua
+ ["View the project/filetree window"] = "Mostra la finestra di progetto/explorer", -- src\editor\menu_view.lua
+ ["View the stack window"] = "Mostra la finestra dello Stack", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["View the watch window"] = "Mostra la finestra delle Espressioni di Controllo", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["Watch"] = "Watch", -- src\editor\debugger.lua
+ ["Welcome to the interactive Lua interpreter."] = "Benvenuti nell`interprete interattivo Lua.", -- src\editor\shellbox.lua
+ ["Wrap around"] = "Wrap around", -- src\editor\toolbar.lua
+ ["You must save the program first."] = "Devi prima salvare il programma", -- src\editor\commands.lua
+ ["Zoom In"] = "Zoom In", -- src\editor\menu_view.lua
+ ["Zoom Out"] = "Zoom Out", -- src\editor\menu_view.lua
+ ["Zoom to 100%"] = "Zoom a 100%", -- src\editor\menu_view.lua
+ ["Zoom"] = "Zoom", -- src\editor\menu_view.lua
+ ["on line %d"] = "alla linea %d", -- src\editor\debugger.lua, src\editor\editor.lua, src\editor\commands.lua
+ ["traced %d instruction"] = {"tracciata %d istruzione", "%d istruzioni tracciate"}, -- src\editor\debugger.lua
+ ["unknown error"] = "errore sconosciuto", -- src\editor\debugger.lua
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/pt-br.lua b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/pt-br.lua
new file mode 100644
index 0000000..42f3220
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/pt-br.lua
@@ -0,0 +1,347 @@
+--- @author Evandro Costa <evandro.co>
+--- @date 26/12/2014
+return {
+ [0] = function(c) return c == 1 and 1 or 2 end, -- plural
+ ["%s event failed: %s"] = "Evento %s falhou: %s", -- src\editor\package.lua
+ ["%s%% formatted..."] = nil, -- src\editor\print.lua
+ ["%s%% loaded..."] = nil, -- src\editor\commands.lua
+ ["&About"] = "Sobre", -- src\editor\menu_help.lua
+ ["&Add Watch"] = "&Adicionar observador", -- src\editor\debugger.lua
+ ["&Break"] = "Interromper", -- src\editor\menu_project.lua
+ ["&Close Page"] = "Fe&char guia", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Community"] = "&Comunidade", -- src\editor\menu_help.lua
+ ["&Compile"] = "&Compilar", -- src\editor\menu_project.lua
+ ["&Copy Value"] = nil, -- src\editor\debugger.lua
+ ["&Copy"] = "&Copiar", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Default Layout"] = "Re&definir painéis", -- src\editor\menu_view.lua
+ ["&Delete Watch"] = "Remover observa&dor", -- src\editor\debugger.lua
+ ["&Delete"] = "Apagar", -- src\editor\filetree.lua
+ ["&Documentation"] = "&Documentação", -- src\editor\menu_help.lua
+ ["&Edit Project Directory"] = "&Editar pasta do projeto", -- src\editor\filetree.lua
+ ["&Edit Value"] = "&Editar valor", -- src\editor\debugger.lua
+ ["&Edit Watch"] = "&Editar observador", -- src\editor\debugger.lua
+ ["&Edit"] = "&Editar", -- src\editor\menu_edit.lua
+ ["&File"] = "Arquivo", -- src\editor\menu_file.lua
+ ["&Find"] = "Localizar", -- src\editor\menu_search.lua
+ ["&Fold/Unfold All"] = "Expandir/Recolher tudo", -- src\editor\menu_edit.lua
+ ["&Frequently Asked Questions"] = "Perguntas &frequentes", -- src\editor\menu_help.lua
+ ["&Getting Started Guide"] = "Primeiros passos", -- src\editor\menu_help.lua
+ ["&Help"] = "Ajuda", -- src\editor\menu_help.lua
+ ["&New Directory"] = "&Nova pasta", -- src\editor\filetree.lua
+ ["&New"] = "&Novo", -- src\editor\menu_file.lua
+ ["&Open..."] = "Abrir...", -- src\editor\menu_file.lua
+ ["&Output/Console Window"] = "Saída/Console", -- src\editor\menu_view.lua
+ ["&Paste"] = "Colar", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Print..."] = nil, -- src\editor\print.lua
+ ["&Project Page"] = "&Página do projeto", -- src\editor\menu_help.lua
+ ["&Project"] = "&Projeto", -- src\editor\menu_project.lua
+ ["&Redo"] = "&Refazer", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Rename"] = "&Renomear", -- src\editor\filetree.lua
+ ["&Replace"] = "Substitui&r", -- src\editor\menu_search.lua
+ ["&Run"] = "Executa&r", -- src\editor\menu_project.lua
+ ["&Save"] = "&Salvar", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Search"] = "Localizar", -- src\editor\menu_search.lua
+ ["&Select Command"] = nil, -- src\editor\gui.lua
+ ["&Sort"] = "Ordenar", -- src\editor\menu_edit.lua
+ ["&Stack Window"] = "Pilha de execução", -- src\editor\menu_view.lua
+ ["&Start Debugger Server"] = "Iniciar &servidor de depuração", -- src\editor\menu_project.lua
+ ["&Status Bar"] = "Barra de &status", -- src\editor\menu_view.lua
+ ["&Tool Bar"] = "Barra de ferramen&tas", -- src\editor\menu_view.lua
+ ["&Tutorials"] = "&Tutoriais", -- src\editor\menu_help.lua
+ ["&Undo"] = "Desfazer", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&View"] = "Exibir", -- src\editor\menu_view.lua
+ ["&Watch Window"] = "Observador", -- src\editor\menu_view.lua
+ ["About %s"] = "Sobre %s", -- src\editor\menu_help.lua
+ ["Add To Scratchpad"] = "Adicionar ao rascunho", -- src\editor\editor.lua
+ ["Add Watch Expression"] = "Adicionar observador", -- src\editor\editor.lua
+ ["All files"] = "Todos os arquivos", -- src\editor\commands.lua
+ ["Allow external process to start debugging"] = "Permitir processo externo para iniciar a depuração", -- src\editor\menu_project.lua
+ ["Analyze the source code"] = "Analisar o código-fonte", -- src\editor\inspect.lua
+ ["Analyze"] = "Analisar", -- src\editor\inspect.lua
+ ["Auto Complete Identifiers"] = "Autocompletar identificadores", -- src\editor\menu_edit.lua
+ ["Auto complete while typing"] = "Autocompletar ao digitar", -- src\editor\menu_edit.lua
+ ["Binary file is shown as read-only as it is only partially loaded."] = nil, -- src\editor\commands.lua
+ ["Bookmark"] = "Marcador", -- src\editor\menu_edit.lua
+ ["Break execution at the next executed line of code"] = "Interromper execução na próxima linha de código", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Breakpoint"] = nil, -- src\editor\menu_project.lua
+ ["C&lear Console Window"] = nil, -- src\editor\gui.lua
+ ["C&lear Output Window"] = "&Limpar janela de saída", -- src\editor\gui.lua, src\editor\menu_project.lua
+ ["C&omment/Uncomment"] = "C&omentar/Descomentar", -- src\editor\menu_edit.lua
+ ["Can't evaluate the expression while the application is running."] = "Impossível executar a expressão enquanto a aplicação estiver em execução.", -- src\editor\debugger.lua
+ ["Can't open file '%s': %s"] = "Impossível abrir o arquivo '%s': %s", -- src\editor\findreplace.lua, src\editor\singleinstance.lua, src\editor\inspect.lua, src\editor\outline.lua
+ ["Can't process auto-recovery record; invalid format: %s."] = "Impossível de processar registro de autorrecuperação; formato inválido: %s.", -- src\editor\commands.lua
+ ["Can't replace in read-only text."] = nil, -- src\editor\findreplace.lua
+ ["Can't run the entry point script ('%s')."] = "Impossível de executar o ponto de entrada do script ('%s').", -- src\editor\debugger.lua
+ ["Can't start debugger server at %s:%d: %s."] = "Impossível de iniciar o sevidor de depuração em %s:%d: %s.", -- src\editor\debugger.lua
+ ["Can't start debugging for '%s'."] = nil, -- src\editor\debugger.lua
+ ["Can't start debugging session due to internal error '%s'."] = "Impossível iniciar sessão de depuração devido ao erro interno '%s'.", -- src\editor\debugger.lua
+ ["Can't start debugging without an opened file or with the current file not being saved ('%s')."] = "Impossível iniciar depuração sem abrir um arquivo ou se o arquivo atual não foi salvo ainda ('%s').", -- src\editor\debugger.lua
+ ["Can't stop debugger server as it is not started."] = "Impossível interromper servidor de depuração se ele não foi iniciado.", -- src\editor\debugger.lua
+ ["Cancelled by the user."] = "Cancelado pelo usuário", -- src\editor\findreplace.lua
+ ["Choose a directory to map"] = nil, -- src\editor\filetree.lua
+ ["Choose a project directory"] = "Selecionar pasta do projeto", -- src\editor\toolbar.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Choose a search directory"] = nil, -- src\editor\findreplace.lua
+ ["Choose..."] = "Selecionar...", -- src\editor\findreplace.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Clear Items"] = "Limpar itens", -- src\editor\findreplace.lua, src\editor\menu_file.lua
+ ["Clear items from this list"] = "Limpar itens desta lista", -- src\editor\menu_file.lua
+ ["Clear the output window before compiling or debugging"] = "Limpar janela de saída antes de compilar ou depurar", -- src\editor\menu_project.lua
+ ["Close &Other Pages"] = "Fechar &outras guias", -- src\editor\gui.lua
+ ["Close A&ll Pages"] = "Fechar todas as guias", -- src\editor\gui.lua
+ ["Close the current editor window"] = "Fechar janela do editor atual", -- src\editor\menu_file.lua
+ ["Co&ntinue"] = "Co&ntinuar", -- src\editor\menu_project.lua
+ ["Col: %d"] = "Col: %d", -- src\editor\editor.lua
+ ["Command Line Parameters..."] = "Parâmetros da linha de comandos...", -- src\editor\menu_project.lua
+ ["Command line parameters"] = "Parâmetros da linha de comandos", -- src\editor\menu_project.lua
+ ["Comment or uncomment current or selected lines"] = {"Comentar ou descomentar a linha atual", "Comentar ou descomentar as linhas selecionadas"}, -- src\editor\menu_edit.lua
+ ["Compilation error"] = "Erro na compilação", -- src\editor\commands.lua, src\editor\debugger.lua
+ ["Compilation successful; %.0f%% success rate (%d/%d)."] = "Compilação com êxito; taxa de sucesso: %.0f%% (%d/%d).", -- src\editor\commands.lua
+ ["Compile the current file"] = "Compilar arquivo atual", -- src\editor\menu_project.lua
+ ["Complete &Identifier"] = "Completar &identificador", -- src\editor\menu_edit.lua
+ ["Complete the current identifier"] = "Completar o identificador atual", -- src\editor\menu_edit.lua
+ ["Consider removing backslash from escape sequence '%s'."] = "Considere a remoção da contrabarra da sequência de escape '%s'.", -- src\editor\commands.lua
+ ["Copy Full Path"] = "Copiar o caminho completo", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Copy selected text to clipboard"] = "Copiar texto selecionado para a área de transfêrencia", -- src\editor\menu_edit.lua
+ ["Correct &Indentation"] = "Corr&igir recuo", -- src\editor\menu_edit.lua
+ ["Couldn't activate file '%s' for debugging; continuing without it."] = "Impossível ativar o arquivo '%s' para a depuração; continuando sem ele.", -- src\editor\debugger.lua
+ ["Create an empty document"] = "Criar um documento em branco", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Cu&t"] = "Recor&tar", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Cut selected text to clipboard"] = "Recortar texto selecionado para a área de transfêrencia", -- src\editor\menu_edit.lua
+ ["Debugger server started at %s:%d."] = "Servidor de depuração iniciado em %s:%d.", -- src\editor\debugger.lua
+ ["Debugger server stopped at %s:%d."] = "Servidor de depuração interrompido em %s:%d.", -- src\editor\debugger.lua
+ ["Debugging session completed (%s)."] = "Sessão de depuração completada (%s).", -- src\editor\debugger.lua
+ ["Debugging session started in '%s'."] = "Sessão de depuração iniciada em '%s'.", -- src\editor\debugger.lua
+ ["Debugging suspended at '%s:%s' (couldn't activate the file)."] = "Depuração suspendida em '%s:%s' (impossível ativar o arquivo).", -- src\editor\debugger.lua
+ ["Detach &Process"] = "Separar &processo", -- src\editor\menu_project.lua
+ ["Disable Indexing For '%s'"] = nil, -- src\editor\outline.lua
+ ["Do you want to delete '%s'?"] = "Deseja mesmo apagar '%s'?", -- src\editor\filetree.lua
+ ["Do you want to overwrite it?"] = "Deseja mesmo sobrescrevê-lo?", -- src\editor\commands.lua
+ ["Do you want to reload it?"] = "Deseja mesmo atualizá-lo?", -- src\editor\editor.lua
+ ["Do you want to save the changes to '%s'?"] = "Deseja salvar as alterações em '%s'?", -- src\editor\commands.lua
+ ["E&xit"] = "Sair", -- src\editor\menu_file.lua
+ ["Enable Indexing"] = nil, -- src\editor\outline.lua
+ ["Enter Lua code and press Enter to run it."] = "Digite o código Lua e pressione Enter para executá-lo.", -- src\editor\shellbox.lua
+ ["Enter command line parameters (use Cancel to clear)"] = "Digite os parâmetros da linha de comandos (use Cancelar para limpar)", -- src\editor\menu_project.lua
+ ["Enter replacement text"] = "Digite o texto para substituir", -- src\editor\editor.lua
+ ["Error while loading API file: %s"] = "Erro ao carregar arquivo de API: %s", -- src\editor\autocomplete.lua
+ ["Error while loading configuration file: %s"] = "Erro ao carregar arquivo de configuração: %s", -- src\editor\style.lua
+ ["Error while processing API file: %s"] = "Erro ao processar arquivo de API: %s", -- src\editor\autocomplete.lua
+ ["Error while processing configuration file: %s"] = "Erro ao processar arquivo de configuração: %s", -- src\editor\style.lua
+ ["Error"] = "Erro", -- src\editor\commands.lua
+ ["Evaluate In Console"] = "Executar no console", -- src\editor\editor.lua
+ ["Execute the current project/file and keep updating the code to see immediate results"] = "Executar o projeto/arquivo atual, mantendo o código atualizado para ver os resultados em tempo real", -- src\editor\menu_project.lua
+ ["Execute the current project/file"] = "Executar o projeto/arquivo atual", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Execution error"] = "Erro na execução", -- src\editor\debugger.lua
+ ["Exit program"] = "Sair do programa", -- src\editor\menu_file.lua
+ ["File '%s' has been modified on disk."] = "Arquivo '%s' foi alterado no disco.", -- src\editor\editor.lua
+ ["File '%s' has more recent timestamp than restored '%s'; please review before saving."] = "Arquivo '%s' possui uma data mais recente do que o restaurado '%s'; verifique antes de salvar.", -- src\editor\commands.lua
+ ["File '%s' is missing and can't be recovered."] = "Arquivo '%s' está faltando e não pode ser restaurado.", -- src\editor\commands.lua
+ ["File '%s' no longer exists."] = "Arquivo '%s' não existe mais.", -- src\editor\menu_file.lua, src\editor\editor.lua
+ ["File already exists."] = "Arquivo já existe", -- src\editor\commands.lua
+ ["File history"] = "Histórico do arquivo", -- src\editor\menu_file.lua
+ ["Find &In Files"] = "Local&izar em arquivos", -- src\editor\menu_search.lua
+ ["Find &Next"] = "Localizar próximo", -- src\editor\menu_search.lua
+ ["Find &Previous"] = "Localizar anterior", -- src\editor\menu_search.lua
+ ["Find and insert library function"] = "Localizar e inserir função de biblioteca", -- src\editor\menu_search.lua
+ ["Find and replace text in files"] = "Localizar e substituir texto em arquivos", -- src\editor\menu_search.lua
+ ["Find and replace text"] = "Localizar e substituir texto", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find in files"] = "Localizar em arquivos", -- src\editor\toolbar.lua
+ ["Find text in files"] = "Localizar texto em arquivos", -- src\editor\menu_search.lua
+ ["Find text"] = "Localizar texto", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find the earlier text occurence"] = "Localizar a ocorrência anterior do texto", -- src\editor\menu_search.lua
+ ["Find the next text occurrence"] = "Localizar a ocorrência posterior do texto", -- src\editor\menu_search.lua
+ ["Find"] = "Localizar", -- src\editor\toolbar.lua
+ ["Fold or unfold all code folds"] = "Expandir ou recolher todos os blocos do código", -- src\editor\menu_edit.lua
+ ["Formatting page %d..."] = nil, -- src\editor\print.lua
+ ["Found %d instance."] = {}, -- src\editor\findreplace.lua
+ ["Found auto-recovery record and restored saved session."] = "Registro de autorrecuperação encontrado e sessão restaurada.", -- src\editor\commands.lua
+ ["Full &Screen"] = "Tela inteira", -- src\editor\menu_view.lua
+ ["Go To Definition"] = "Ir para a definição", -- src\editor\editor.lua
+ ["Go To File..."] = "Ir para o arquivo...", -- src\editor\menu_search.lua
+ ["Go To Line..."] = "Ir para a linha...", -- src\editor\menu_search.lua
+ ["Go To Next Bookmark"] = "Ir para o próximo marcador", -- src\editor\menu_edit.lua
+ ["Go To Next Breakpoint"] = nil, -- src\editor\menu_project.lua
+ ["Go To Previous Bookmark"] = "Ir para o marcador anterior", -- src\editor\menu_edit.lua
+ ["Go To Previous Breakpoint"] = nil, -- src\editor\menu_project.lua
+ ["Go To Symbol..."] = "Ir para o símbolo...", -- src\editor\menu_search.lua
+ ["Go to file"] = "Ir para o arquivo", -- src\editor\menu_search.lua
+ ["Go to line"] = "Ir para a linha", -- src\editor\menu_search.lua
+ ["Go to symbol"] = "Ir para o símbolo", -- src\editor\menu_search.lua
+ ["Hide '.%s' Files"] = "Ocultar arquivos '.%s'", -- src\editor\filetree.lua
+ ["INS"] = "INS", -- src\editor\editor.lua
+ ["Ignore and don't index symbols from files in the selected directory"] = nil, -- src\editor\outline.lua
+ ["Ignored error in debugger initialization code: %s."] = "Erro ignorado no código de inicialização do depurador: %s.", -- src\editor\debugger.lua
+ ["Indexing %d files: '%s'..."] = nil, -- src\editor\outline.lua
+ ["Indexing completed."] = nil, -- src\editor\outline.lua
+ ["Insert Library Function..."] = "Inserir função de biblioteca...", -- src\editor\menu_search.lua
+ ["Known Files"] = "Arquivos conhecidos", -- src\editor\commands.lua
+ ["Ln: %d"] = "Ln: %d", -- src\editor\editor.lua
+ ["Local console"] = "Console local", -- src\editor\gui.lua, src\editor\shellbox.lua
+ ["Lua &Interpreter"] = "&Interpretador Lua", -- src\editor\menu_project.lua
+ ["Map Directory..."] = nil, -- src\editor\filetree.lua
+ ["Mapped remote request for '%s' to '%s'."] = "Solicitação remota '%s' mapeada para '%s'.", -- src\editor\debugger.lua
+ ["Markers Window"] = nil, -- src\editor\menu_view.lua
+ ["Markers"] = nil, -- src\editor\markers.lua
+ ["Match case"] = "Diferenciar maiúsc/minúsc", -- src\editor\toolbar.lua
+ ["Match whole word"] = "Somente palavras inteiras", -- src\editor\toolbar.lua
+ ["Mixed end-of-line encodings detected."] = "Multíplas codificações de fim-de-linha encontradas.", -- src\editor\commands.lua
+ ["Navigate"] = "Navegar", -- src\editor\menu_search.lua
+ ["New &File"] = "Novo arquivo", -- src\editor\filetree.lua
+ ["OVR"] = "OVR", -- src\editor\editor.lua
+ ["Open With Default Program"] = "Abrir com o programa padrão", -- src\editor\filetree.lua
+ ["Open an existing document"] = "Abrir um documento existente", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Open file"] = "Abrir arquivo", -- src\editor\commands.lua
+ ["Outline Window"] = "Saída", -- src\editor\menu_view.lua
+ ["Outline"] = "Definições", -- src\editor\outline.lua
+ ["Output (running)"] = "Saída (executando)", -- src\editor\debugger.lua, src\editor\output.lua
+ ["Output (suspended)"] = "Saída (suspendido)", -- src\editor\debugger.lua
+ ["Output"] = "Saída", -- src\editor\debugger.lua, src\editor\output.lua, src\editor\gui.lua, src\editor\settings.lua
+ ["Page Setup..."] = nil, -- src\editor\print.lua
+ ["Paste text from the clipboard"] = "Colar texto da área de transfêrencia", -- src\editor\menu_edit.lua
+ ["Preferences"] = "Preferências", -- src\editor\menu_edit.lua
+ ["Prepend '!' to force local execution."] = "Prefixe com '!' para forçar a execução local.", -- src\editor\shellbox.lua
+ ["Prepend '=' to show complex values on multiple lines."] = "Prefixe com '=' para exibir valores complexos em multíplas linhas.", -- src\editor\shellbox.lua
+ ["Press cancel to abort."] = "Pressionar cancelar para abortar.", -- src\editor\commands.lua
+ ["Print the current document"] = nil, -- src\editor\print.lua
+ ["Program '%s' started in '%s' (pid: %d)."] = "Programa '%s' iniciado em '%s' (pid: %d).", -- src\editor\output.lua
+ ["Program can't start because conflicting process is running as '%s'."] = "Impossível iniciar programa porque um processo conflitante está em execução como '%s'.", -- src\editor\output.lua
+ ["Program completed in %.2f seconds (pid: %d)."] = "Programa completado em %.2f segundos (pid: %d).", -- src\editor\output.lua
+ ["Program starting as '%s'."] = "Iniciando programa como '%s'.", -- src\editor\output.lua
+ ["Program stopped (pid: %d)."] = "Programa interrompido (pid: %d).", -- src\editor\debugger.lua
+ ["Program unable to run as '%s'."] = "Impossível de executar programa como '%s'.", -- src\editor\output.lua
+ ["Project Directory"] = "Pasta do projeto", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Project history"] = "Histórico do projeto", -- src\editor\menu_file.lua
+ ["Project"] = "Projeto", -- src\editor\filetree.lua
+ ["Project/&FileTree Window"] = "Projeto/Hierarquia de arquivos", -- src\editor\menu_view.lua
+ ["Provide command line parameters"] = "Informar os parâmetros da linha de comandos", -- src\editor\menu_project.lua
+ ["Queued %d files to index."] = nil, -- src\editor\menu_search.lua
+ ["R/O"] = "R/O", -- src\editor\editor.lua
+ ["R/W"] = "R/W", -- src\editor\editor.lua
+ ["Re&place In Files"] = "Substituir em arquivos", -- src\editor\menu_search.lua
+ ["Re-indent selected lines"] = "Inserir recuos nas linhas selecionadas", -- src\editor\menu_edit.lua
+ ["Reached end of selection and wrapped around."] = nil, -- src\editor\findreplace.lua
+ ["Reached end of text and wrapped around."] = nil, -- src\editor\findreplace.lua
+ ["Recent Files"] = "Arquivos recentes", -- src\editor\menu_file.lua
+ ["Recent Projects"] = "Projetos recentes", -- src\editor\menu_file.lua
+ ["Redo last edit undone"] = "Refazer última edição desfeita", -- src\editor\menu_edit.lua
+ ["Refresh Index"] = nil, -- src\editor\outline.lua
+ ["Refresh indexed symbols from files in the selected directory"] = nil, -- src\editor\outline.lua
+ ["Refresh"] = "Refrescar", -- src\editor\filetree.lua
+ ["Refused a request to start a new debugging session as there is one in progress already."] = "Solicitação de início de uma nova sessão de depuração recusado porque já existe um em progresso.", -- src\editor\debugger.lua
+ ["Regular expression"] = "Expressão regular", -- src\editor\toolbar.lua
+ ["Remote console"] = "Console remoto", -- src\editor\shellbox.lua
+ ["Rename All Instances"] = "Renomear todas as instâncias", -- src\editor\editor.lua
+ ["Replace All Selections"] = "Substituir todas as seleções", -- src\editor\editor.lua
+ ["Replace all"] = "Substituir tudo", -- src\editor\toolbar.lua
+ ["Replace next instance"] = nil, -- src\editor\toolbar.lua
+ ["Replaced %d instance."] = {}, -- src\editor\findreplace.lua
+ ["Replaced an invalid UTF8 character with %s."] = "Caractere UTF8 inválido susbtituído por %s.", -- src\editor\commands.lua
+ ["Reset to default layout"] = "Redefinir painéis para o padrão", -- src\editor\menu_view.lua
+ ["Run As Scratchpad"] = "Executar como rascunho", -- src\editor\menu_project.lua
+ ["Run To Cursor"] = nil, -- src\editor\menu_project.lua, src\editor\editor.lua
+ ["Run as Scratchpad"] = "Executar como rascunho", -- src\editor\toolbar.lua
+ ["Run to cursor"] = nil, -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["S&top Debugging"] = "In&terromper depuração", -- src\editor\menu_project.lua
+ ["S&top Process"] = "In&terromper processo", -- src\editor\menu_project.lua
+ ["Save &As..."] = "S&alvar como...", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["Save A&ll"] = "Sa&lvar tudo", -- src\editor\menu_file.lua
+ ["Save Changes?"] = "Salvar alterações?", -- src\editor\commands.lua
+ ["Save all open documents"] = "Salvar todos os documentos abertos", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Save file as"] = "Salvar arquivo como", -- src\editor\commands.lua
+ ["Save file?"] = "Salvar arquivo?", -- src\editor\commands.lua
+ ["Save the current document to a file with a new name"] = "Salvar documento atual para um arquivo com outro nome", -- src\editor\menu_file.lua
+ ["Save the current document"] = "Salvar documento atual", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Saved auto-recover at %s."] = "Autorrecuperação salvo às %s.", -- src\editor\commands.lua
+ ["Scratchpad error"] = "Erro no rascunho", -- src\editor\debugger.lua
+ ["Search direction"] = nil, -- src\editor\toolbar.lua
+ ["Search in selection"] = nil, -- src\editor\toolbar.lua
+ ["Search in subdirectories"] = nil, -- src\editor\toolbar.lua
+ ["Searching for '%s'."] = nil, -- src\editor\findreplace.lua
+ ["Sel: %d/%d"] = "Sel: %d/%d", -- src\editor\editor.lua
+ ["Select &All"] = "Selecion&ar tudo", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Select And Find Next"] = "Selecionar e localizar próxima", -- src\editor\menu_search.lua
+ ["Select And Find Previous"] = "Selecionar e localizar anterior", -- src\editor\menu_search.lua
+ ["Select all text in the editor"] = "Selecionar todo o texto do editor", -- src\editor\menu_edit.lua
+ ["Select the word under cursor and find its next occurrence"] = "Selecionar palavra no cursor e localizar sua próxima ocorrência", -- src\editor\menu_search.lua
+ ["Select the word under cursor and find its previous occurrence"] = "Selecionar palavra no cursor e localizar sua ocorrência anterior", -- src\editor\menu_search.lua
+ ["Set As Start File"] = nil, -- src\editor\filetree.lua
+ ["Set From Current File"] = "Alterar para o arquivo atual", -- src\editor\menu_project.lua
+ ["Set To Project Directory"] = nil, -- src\editor\findreplace.lua
+ ["Set To Selected Directory"] = nil, -- src\editor\filetree.lua
+ ["Set project directory from current file"] = "Alterar pasta do projeto para a pasta do arquivo atual", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Set project directory to the selected one"] = nil, -- src\editor\filetree.lua
+ ["Set search directory"] = nil, -- src\editor\toolbar.lua
+ ["Set the interpreter to be used"] = "Alterar interpretador a ser utilizado", -- src\editor\menu_project.lua
+ ["Set the project directory to be used"] = "Alterar pasta do projeto a ser utilizado", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Settings: System"] = "Opções: Sistema", -- src\editor\menu_edit.lua
+ ["Settings: User"] = "Opções: Usuário", -- src\editor\menu_edit.lua
+ ["Show &Tooltip"] = "Exibir dica", -- src\editor\menu_edit.lua
+ ["Show All Files"] = "Exibir todos os arquivos", -- src\editor\filetree.lua
+ ["Show Hidden Files"] = "Exibir arquivos ocultos", -- src\editor\filetree.lua
+ ["Show Location"] = "Exibir pasta no sistema", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Show all files"] = "Exibir todos os arquivos", -- src\editor\filetree.lua
+ ["Show context"] = nil, -- src\editor\toolbar.lua
+ ["Show files previously hidden"] = "Exibir arquivos anteriormente ocultos", -- src\editor\filetree.lua
+ ["Show multiple result windows"] = nil, -- src\editor\toolbar.lua
+ ["Show tooltip for current position; place cursor after opening bracket of function"] = "Exibir dica para a posição atual; posicione o cursor após abrir o parênteses da função", -- src\editor\menu_edit.lua
+ ["Show/Hide the status bar"] = "Exibir/Ocultar a barra de status", -- src\editor\menu_view.lua
+ ["Show/Hide the toolbar"] = "Exibir/Ocultar a barra de ferramentas", -- src\editor\menu_view.lua
+ ["Sort By Name"] = nil, -- src\editor\outline.lua
+ ["Sort selected lines"] = "Ordenar linhas selecionadas", -- src\editor\menu_edit.lua
+ ["Source"] = "Código", -- src\editor\menu_edit.lua
+ ["Stack"] = "Pilha de execução", -- src\editor\debugger.lua
+ ["Start &Debugging"] = "Iniciar &depuração", -- src\editor\menu_project.lua
+ ["Start or continue debugging"] = "Iniciar ou continuar depuração", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step &Into"] = "Passar para dentro", -- src\editor\menu_project.lua
+ ["Step &Over"] = "Passar s&obre", -- src\editor\menu_project.lua
+ ["Step O&ut"] = "Passar para fora", -- src\editor\menu_project.lua
+ ["Step into"] = "Passar para dentro", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step out of the current function"] = "Passar para fora da função atual", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step over"] = "Passar para fora", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop debugging and continue running the process"] = "Interromper depuração e continuar executando o processo", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop the currently running process"] = "Interromper o processo atual em execução", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Switch to or from full screen mode"] = "Entrar/Sair do modo tela inteira", -- src\editor\menu_view.lua
+ ["Symbol Index"] = nil, -- src\editor\outline.lua
+ ["Text not found."] = "Texto não encontrado.", -- src\editor\findreplace.lua
+ ["The API file must be located in a subdirectory of the API directory."] = "O arquivo de API deve estar localizado em uma subpasta da pasta de API", -- src\editor\autocomplete.lua
+ ["Toggle Bookmark"] = "Alternar marcador", -- src\editor\markers.lua, src\editor\menu_edit.lua
+ ["Toggle Breakpoint"] = "Alternar ponto de interrupção", -- src\editor\markers.lua, src\editor\menu_project.lua
+ ["Toggle bookmark"] = "Alternar marcador", -- src\editor\toolbar.lua, src\editor\menu_edit.lua, src\editor\markers.lua
+ ["Toggle breakpoint"] = "Alternar ponto de interrupção", -- src\editor\markers.lua, src\editor\toolbar.lua
+ ["Tr&ace"] = "R&astrear", -- src\editor\menu_project.lua
+ ["Trace execution showing each executed line"] = "Rastrear execução exibindo cada linha de código executada", -- src\editor\menu_project.lua
+ ["Unable to create directory '%s'."] = "Impossível criar pasta '%s'.", -- src\editor\filetree.lua
+ ["Unable to create file '%s'."] = "Impossível criar arquivo '%s'.", -- src\editor\filetree.lua
+ ["Unable to delete directory '%s': %s"] = "Impossível apagar a pasta '%s': %s", -- src\editor\filetree.lua
+ ["Unable to delete file '%s': %s"] = nil, -- src\editor\filetree.lua
+ ["Unable to load file '%s'."] = "Impossível carregar o arquivo '%s'.", -- src\editor\commands.lua
+ ["Unable to rename file '%s'."] = "Impossível renomear o arquivo '%s'.", -- src\editor\filetree.lua
+ ["Unable to save file '%s': %s"] = "Impossível salvar o arquivo '%s': %s", -- src\editor\commands.lua
+ ["Unable to stop program (pid: %d), code %d."] = "Impossível de interromper programa (pid: %d), código %d.", -- src\editor\debugger.lua
+ ["Undo last edit"] = "Refazer última edição", -- src\editor\menu_edit.lua
+ ["Unmap Directory"] = nil, -- src\editor\filetree.lua
+ ["Unset '%s' As Start File"] = nil, -- src\editor\filetree.lua
+ ["Updated %d file."] = {}, -- src\editor\findreplace.lua
+ ["Updating symbol index and settings..."] = nil, -- src\editor\outline.lua
+ ["Use %s to close."] = nil, -- src\editor\findreplace.lua
+ ["Use '%s' to see full description."] = "Use '%s' para ver a descrição completa.", -- src\editor\editor.lua
+ ["Use '%s' to show line endings and '%s' to convert them."] = "Use '%s' para exibir os finais de linha e '%s' para convertê-los.", -- src\editor\commands.lua
+ ["Use 'clear' to clear the shell output and the history."] = "Use 'clear' para limpar a saída e o histórico.", -- src\editor\shellbox.lua
+ ["Use Shift-Enter for multiline code."] = "Usar Shift-Enter para adicionar uma nova linha ao código.", -- src\editor\shellbox.lua
+ ["View the markers window"] = nil, -- src\editor\menu_view.lua
+ ["View the outline window"] = "Exibir a janela de definições", -- src\editor\menu_view.lua
+ ["View the output/console window"] = "Exibir a janela de saída/console", -- src\editor\menu_view.lua
+ ["View the project/filetree window"] = "Exibir janela do projeto/hierarquia de arquivos", -- src\editor\menu_view.lua
+ ["View the stack window"] = "Exibir janela da pilha de execução", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["View the watch window"] = "Exibir janela do observador", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["Watch"] = "Observador", -- src\editor\debugger.lua
+ ["Welcome to the interactive Lua interpreter."] = "Bem-vindo ao interpretador do Lua.", -- src\editor\shellbox.lua
+ ["Wrap around"] = "Repetir direção", -- src\editor\toolbar.lua
+ ["You must save the program first."] = "Você deve salvar o programa primeiro.", -- src\editor\commands.lua
+ ["Zoom In"] = "Ampliar", -- src\editor\menu_view.lua
+ ["Zoom Out"] = "Afastar", -- src\editor\menu_view.lua
+ ["Zoom to 100%"] = "Ir para 100%", -- src\editor\menu_view.lua
+ ["Zoom"] = "Zoom", -- src\editor\menu_view.lua
+ ["on line %d"] = "na linha %d", -- src\editor\debugger.lua, src\editor\editor.lua, src\editor\commands.lua
+ ["traced %d instruction"] = {"%d instrução rastreada", "%d instruções rastreadas"}, -- src\editor\debugger.lua
+ ["unknown error"] = "erro desconhecido", -- src\editor\debugger.lua
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/ru.lua b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/ru.lua
new file mode 100644
index 0000000..3c9939f
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/i18n/ru.lua
@@ -0,0 +1,345 @@
+return {
+ [0] = function(c) c = (c-9)%100 < 9 and 9 or (c-1)%10 return c == 0 and 1 or c < 4 and 2 or 3 end, -- plural
+ ["%s event failed: %s"] = "%s обработчик события вернул ошибку: %s", -- src\editor\package.lua
+ ["%s%% formatted..."] = "%s%% отформатировано...", -- src\editor\print.lua
+ ["%s%% loaded..."] = "%s%% загружено...", -- src\editor\commands.lua
+ ["&About"] = "&О программе", -- src\editor\menu_help.lua
+ ["&Add Watch"] = "&Добавить выражение", -- src\editor\debugger.lua
+ ["&Break"] = "Пр&ервать", -- src\editor\menu_project.lua
+ ["&Close Page"] = "&Закрыть", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Community"] = nil, -- src\editor\menu_help.lua
+ ["&Compile"] = "&Компилировать", -- src\editor\menu_project.lua
+ ["&Copy Value"] = "Копировать значение", -- src\editor\debugger.lua
+ ["&Copy"] = "&Копировать", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Default Layout"] = "Вид по &умолчанию", -- src\editor\menu_view.lua
+ ["&Delete Watch"] = "&Удалить выражение", -- src\editor\debugger.lua
+ ["&Delete"] = "&Удалить", -- src\editor\filetree.lua
+ ["&Documentation"] = "Документация", -- src\editor\menu_help.lua
+ ["&Edit Project Directory"] = "&Редактировать папку проекта", -- src\editor\filetree.lua
+ ["&Edit Value"] = "&Редактировать значение", -- src\editor\debugger.lua
+ ["&Edit Watch"] = "&Редактировать выражение", -- src\editor\debugger.lua
+ ["&Edit"] = "&Правка", -- src\editor\menu_edit.lua
+ ["&File"] = "&Файл", -- src\editor\menu_file.lua
+ ["&Find"] = "&Найти", -- src\editor\menu_search.lua
+ ["&Fold/Unfold All"] = "Св&ернуть/развернуть все", -- src\editor\menu_edit.lua
+ ["&Frequently Asked Questions"] = "&Часто задаваемые вопросы", -- src\editor\menu_help.lua
+ ["&Getting Started Guide"] = nil, -- src\editor\menu_help.lua
+ ["&Help"] = "&Справка", -- src\editor\menu_help.lua
+ ["&New Directory"] = "&Новая папка", -- src\editor\filetree.lua
+ ["&New"] = "Соз&дать", -- src\editor\menu_file.lua
+ ["&Open..."] = "&Открыть...", -- src\editor\menu_file.lua
+ ["&Output/Console Window"] = "Окно &вывода/консоли", -- src\editor\menu_view.lua
+ ["&Paste"] = "В&ставить", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Print..."] = "Печать...", -- src\editor\print.lua
+ ["&Project Page"] = "Страница проекта", -- src\editor\menu_help.lua
+ ["&Project"] = "Пр&оект", -- src\editor\menu_project.lua
+ ["&Redo"] = "Верну&ть", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Rename"] = "Переименовать", -- src\editor\filetree.lua
+ ["&Replace"] = "За&менить", -- src\editor\menu_search.lua
+ ["&Run"] = "За&пустить", -- src\editor\menu_project.lua
+ ["&Save"] = "&Сохранить", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Search"] = "По&иск", -- src\editor\menu_search.lua
+ ["&Select Command"] = "Выбрать команду", -- src\editor\gui.lua
+ ["&Sort"] = "&Cортировать", -- src\editor\menu_edit.lua
+ ["&Stack Window"] = "Окно &стека", -- src\editor\menu_view.lua
+ ["&Start Debugger Server"] = "Запустить сервер отла&дки", -- src\editor\menu_project.lua
+ ["&Status Bar"] = "Панель состояния", -- src\editor\menu_view.lua
+ ["&Tool Bar"] = "Панель инструментов", -- src\editor\menu_view.lua
+ ["&Tutorials"] = "&Обучающие материалы", -- src\editor\menu_help.lua
+ ["&Undo"] = "&Отменить", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&View"] = "&Вид", -- src\editor\menu_view.lua
+ ["&Watch Window"] = "Окно &выражений", -- src\editor\menu_view.lua
+ ["About %s"] = "О %s", -- src\editor\menu_help.lua
+ ["Add To Scratchpad"] = "Добавить в черновик", -- src\editor\editor.lua
+ ["Add Watch Expression"] = "Добавить выражение", -- src\editor\editor.lua
+ ["All files"] = "Все файлы", -- src\editor\commands.lua
+ ["Allow external process to start debugging"] = "Разрешить внешнему процессу начать отладку", -- src\editor\menu_project.lua
+ ["Analyze the source code"] = "Проанализировать исходный код", -- src\editor\inspect.lua
+ ["Analyze"] = "Анализировать", -- src\editor\inspect.lua
+ ["Auto Complete Identifiers"] = "Автодополнение идентификаторов", -- src\editor\menu_edit.lua
+ ["Auto complete while typing"] = "Автоматически дополнять идентификаторы при наборе", -- src\editor\menu_edit.lua
+ ["Binary file is shown as read-only as it is only partially loaded."] = "Двоичный файл открыт только для чтения, так как загружен частично.", -- src\editor\commands.lua
+ ["Bookmark"] = "Закладка", -- src\editor\menu_edit.lua
+ ["Break execution at the next executed line of code"] = "Прервать выполнение на следующей строке", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Breakpoint"] = "Точка останова", -- src\editor\menu_project.lua
+ ["C&lear Console Window"] = "Очистить ок&но консоли", -- src\editor\gui.lua
+ ["C&lear Output Window"] = "Очистить ок&но вывода", -- src\editor\gui.lua, src\editor\menu_project.lua
+ ["C&omment/Uncomment"] = "Зако&мментировать/раскомментировать", -- src\editor\menu_edit.lua
+ ["Can't evaluate the expression while the application is running."] = "Невозможно вычеслить значение выражения пока приложение выполняется.", -- src\editor\debugger.lua
+ ["Can't open file '%s': %s"] = "Ошибка открытия файла '%s': %s", -- src\editor\findreplace.lua, src\editor\singleinstance.lua, src\editor\inspect.lua, src\editor\outline.lua
+ ["Can't process auto-recovery record; invalid format: %s."] = "Ошибка обработки записи автоматического восстановления; неверный формат: %s.", -- src\editor\commands.lua
+ ["Can't replace in read-only text."] = "Ошибка замены в тексте не доступном для записи.", -- src\editor\findreplace.lua
+ ["Can't run the entry point script ('%s')."] = "Ошибка выполнения стартового скрипта ('%s').", -- src\editor\debugger.lua
+ ["Can't start debugger server at %s:%d: %s."] = "Невозможно запустить сервер отладки %s:%d: %s", -- src\editor\debugger.lua
+ ["Can't start debugging for '%s'."] = "Невозможно начать отладку для '%s'.", -- src\editor\debugger.lua
+ ["Can't start debugging session due to internal error '%s'."] = "Невозможно начать отладочную сессию из-за внутренней ошибки '%s'.", -- src\editor\debugger.lua
+ ["Can't start debugging without an opened file or with the current file not being saved ('%s')."] = "Невозможно начать отладку без открытого файла или с несохраненным текущим файлом ('%s').", -- src\editor\debugger.lua
+ ["Can't stop debugger server as it is not started."] = "Невозможно остановить сервер отладки пока он не запущен", -- src\editor\debugger.lua
+ ["Cancelled by the user."] = "Отменено пользователем.", -- src\editor\findreplace.lua
+ ["Choose a directory to map"] = "Выберите папку для добавления в список", -- src\editor\filetree.lua
+ ["Choose a project directory"] = "Выберите папку проекта", -- src\editor\toolbar.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Choose a search directory"] = "Выберите папку поиска", -- src\editor\findreplace.lua
+ ["Choose..."] = "Выбрать...", -- src\editor\findreplace.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Clear Items"] = "Очистить список", -- src\editor\findreplace.lua, src\editor\menu_file.lua
+ ["Clear items from this list"] = "Удалить элементы из списка", -- src\editor\menu_file.lua
+ ["Clear the output window before compiling or debugging"] = "Очистить окно вывода перед компиляцией или отладкой", -- src\editor\menu_project.lua
+ ["Close &Other Pages"] = "Закрыть &остальные вкладки", -- src\editor\gui.lua
+ ["Close A&ll Pages"] = "Закрыть &все вкладки", -- src\editor\gui.lua
+ ["Close the current editor window"] = "Закрыть текущее окно редактирования", -- src\editor\menu_file.lua
+ ["Co&ntinue"] = "Пр&одолжить", -- src\editor\menu_project.lua
+ ["Col: %d"] = "Стб: %d", -- src\editor\editor.lua
+ ["Command Line Parameters..."] = "Параметры командной строки...", -- src\editor\menu_project.lua
+ ["Command line parameters"] = "Параметры командной строки", -- src\editor\menu_project.lua
+ ["Comment or uncomment current or selected lines"] = "Закомментировать или раскомментировать текущую или выделенные строки", -- src\editor\menu_edit.lua
+ ["Compilation error"] = "Ошибка компиляции", -- src\editor\commands.lua, src\editor\debugger.lua
+ ["Compilation successful; %.0f%% success rate (%d/%d)."] = "Компиляция завершена успешно; процент успеха: %.0f%% (%d/%d).", -- src\editor\commands.lua
+ ["Compile the current file"] = "Скомпилировать текущий файл", -- src\editor\menu_project.lua
+ ["Complete &Identifier"] = "Дополнить &идентификатор", -- src\editor\menu_edit.lua
+ ["Complete the current identifier"] = "Дополнить текущий идентификатор", -- src\editor\menu_edit.lua
+ ["Consider removing backslash from escape sequence '%s'."] = "Рассмотрите вариант удаления backslash из строки '%s'.", -- src\editor\commands.lua
+ ["Copy Full Path"] = "Скопировать полный путь", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Copy selected text to clipboard"] = "Скопировать выделенный текст в буфер обмена", -- src\editor\menu_edit.lua
+ ["Correct &Indentation"] = "Откорректировать отступ", -- src\editor\menu_edit.lua
+ ["Couldn't activate file '%s' for debugging; continuing without it."] = "Невозможно открыть файл '%s' для отладки; выполнение будет продолжено без него.", -- src\editor\debugger.lua
+ ["Create an empty document"] = "Создать новый документ", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Cu&t"] = "Вы&резать", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Cut selected text to clipboard"] = "Вырезать выделенный текст в буфер обмена", -- src\editor\menu_edit.lua
+ ["Debugger server started at %s:%d."] = "Сервер отладки запущен на %s:%d.", -- src\editor\debugger.lua
+ ["Debugger server stopped at %s:%d."] = "Сервер отладки остановлен %s:%d.", -- src\editor\debugger.lua
+ ["Debugging session completed (%s)."] = "Отладочная сессия завершена (%s).", -- src\editor\debugger.lua
+ ["Debugging session started in '%s'."] = "Отладочная сессия запущена в '%s'.", -- src\editor\debugger.lua
+ ["Debugging suspended at '%s:%s' (couldn't activate the file)."] = "Отладка остановлена в '%s:%s' (невозможно активировать файл).", -- src\editor\debugger.lua
+ ["Detach &Process"] = "Отсоединить процесс", -- src\editor\menu_project.lua
+ ["Disable Indexing For '%s'"] = "Запретить индексирование для '%s'", -- src\editor\outline.lua
+ ["Do you want to delete '%s'?"] = "Удалить '%s'?", -- src\editor\filetree.lua
+ ["Do you want to overwrite it?"] = "Переписать его?", -- src\editor\commands.lua
+ ["Do you want to reload it?"] = "Перезагрузить его?", -- src\editor\editor.lua
+ ["Do you want to save the changes to '%s'?"] = "Сохранить изменения в '%s'?", -- src\editor\commands.lua
+ ["E&xit"] = "Вы&ход", -- src\editor\menu_file.lua
+ ["Enable Indexing"] = "Разрешить индекcирование", -- src\editor\outline.lua
+ ["Enter Lua code and press Enter to run it."] = "Введите код на Lua и нажмите Enter для выполнения.", -- src\editor\shellbox.lua
+ ["Enter command line parameters (use Cancel to clear)"] = "Введите параметры командной строки (Cancel чтобы очистить)", -- src\editor\menu_project.lua
+ ["Enter replacement text"] = "Введите текст замены", -- src\editor\editor.lua
+ ["Error while loading API file: %s"] = "Ошибка загрузки файла определений API: %s", -- src\editor\autocomplete.lua
+ ["Error while loading configuration file: %s"] = "Ошибка загрузки файла конфигурации: %s", -- src\editor\style.lua
+ ["Error while processing API file: %s"] = "Ошибка обработки файла определений API: %s", -- src\editor\autocomplete.lua
+ ["Error while processing configuration file: %s"] = "Ошибка обработки файла конфигурации: %s", -- src\editor\style.lua
+ ["Error"] = "Ошибка", -- src\editor\commands.lua
+ ["Evaluate In Console"] = "Выполнить в консоли", -- src\editor\editor.lua
+ ["Execute the current project/file and keep updating the code to see immediate results"] = "Запустить текущий проект/файл и продолжать вносить изменения в код с немедленным выводом результатов", -- src\editor\menu_project.lua
+ ["Execute the current project/file"] = "Запустить текущий проект/файл", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Execution error"] = "Ошибка выполнения", -- src\editor\debugger.lua
+ ["Exit program"] = "Выйти из программы", -- src\editor\menu_file.lua
+ ["File '%s' has been modified on disk."] = "Файл '%s' был изменен на диске.", -- src\editor\editor.lua
+ ["File '%s' has more recent timestamp than restored '%s'; please review before saving."] = "Файл '%s' имеет более позднее время модификации, чем восстановленный '%s'; пожалуйста просмотрите его перед сохранением.", -- src\editor\commands.lua
+ ["File '%s' is missing and can't be recovered."] = "Файл '%s' отсутствует и не может быть восстановлен.", -- src\editor\commands.lua
+ ["File '%s' no longer exists."] = "Файл '%s' больше не существует.", -- src\editor\menu_file.lua, src\editor\editor.lua
+ ["File already exists."] = "Файл уже существует.", -- src\editor\commands.lua
+ ["File history"] = "История файлов", -- src\editor\menu_file.lua
+ ["Find &In Files"] = "Н&айти в файлах", -- src\editor\menu_search.lua
+ ["Find &Next"] = "Найти &далее", -- src\editor\menu_search.lua
+ ["Find &Previous"] = "Найти &ранее", -- src\editor\menu_search.lua
+ ["Find and insert library function"] = "Найти и вставить библиотечную функцию", -- src\editor\menu_search.lua
+ ["Find and replace text in files"] = "Найти и заменить текст в файлах", -- src\editor\menu_search.lua
+ ["Find and replace text"] = "Найти и заменить текст", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find in files"] = "Найти в файлах", -- src\editor\toolbar.lua
+ ["Find text in files"] = "Найти текст в файлах", -- src\editor\menu_search.lua
+ ["Find text"] = "Найти текст", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find the earlier text occurence"] = "Найти предыдущее вхождение текста", -- src\editor\menu_search.lua
+ ["Find the next text occurrence"] = "Найти следующее вхождение текста", -- src\editor\menu_search.lua
+ ["Find"] = "Найти", -- src\editor\toolbar.lua
+ ["Fold or unfold all code folds"] = "Свернуть или развернуть все блоки кода", -- src\editor\menu_edit.lua
+ ["Formatting page %d..."] = "Отформатировано страницы %d...", -- src\editor\print.lua
+ ["Found %d instance."] = {"Найдено %d совпадение.", "Найдено %d совпадения.", "Найдено %d совпадений."}, -- src\editor\findreplace.lua
+ ["Found auto-recovery record and restored saved session."] = "Найдена запись авто-восстановления и восстановлена сохраненная сессия.", -- src\editor\commands.lua
+ ["Full &Screen"] = "Во весь экр&ан", -- src\editor\menu_view.lua
+ ["Go To Definition"] = "Перейти к определению", -- src\editor\editor.lua
+ ["Go To File..."] = "Перейти к файлу...", -- src\editor\menu_search.lua
+ ["Go To Line..."] = "Перейти к строке...", -- src\editor\menu_search.lua
+ ["Go To Next Bookmark"] = "Перейти к следующей закладке", -- src\editor\menu_edit.lua
+ ["Go To Next Breakpoint"] = "Перейти к следующей точке останова", -- src\editor\menu_project.lua
+ ["Go To Previous Bookmark"] = "Перейти к предыдущей закладке", -- src\editor\menu_edit.lua
+ ["Go To Previous Breakpoint"] = "Перейти к предыдущей точке останова", -- src\editor\menu_project.lua
+ ["Go To Symbol..."] = "Перейти к символу...", -- src\editor\menu_search.lua
+ ["Go to file"] = "Перейти к файлу", -- src\editor\menu_search.lua
+ ["Go to line"] = "Перейти к строке", -- src\editor\menu_search.lua
+ ["Go to symbol"] = "Перейти к символу", -- src\editor\menu_search.lua
+ ["Hide '.%s' Files"] = "Спрятать '.%s' файлы", -- src\editor\filetree.lua
+ ["INS"] = "ВСТ", -- src\editor\editor.lua
+ ["Ignore and don't index symbols from files in the selected directory"] = "Игнорировать и не индексировать файлы в выбранной папке", -- src\editor\outline.lua
+ ["Ignored error in debugger initialization code: %s."] = "Проигнорирована ошибка в коде инициализации отладчика: %s.", -- src\editor\debugger.lua
+ ["Indexing %d files: '%s'..."] = "Индексировано %d: '%s'...", -- src\editor\outline.lua
+ ["Indexing completed."] = "Индексирование закончено.", -- src\editor\outline.lua
+ ["Insert Library Function..."] = "Вставить библиотечную функцию...", -- src\editor\menu_search.lua
+ ["Known Files"] = "Файлы Lua", -- src\editor\commands.lua
+ ["Ln: %d"] = "Стр: %d", -- src\editor\editor.lua
+ ["Local console"] = "Локальная консоль", -- src\editor\gui.lua, src\editor\shellbox.lua
+ ["Lua &Interpreter"] = "&Интерпретатор Lua", -- src\editor\menu_project.lua
+ ["Map Directory..."] = "Добавить папку в список", -- src\editor\filetree.lua
+ ["Mapped remote request for '%s' to '%s'."] = "Удаленный запрос для '%s' отображен на '%s'.", -- src\editor\debugger.lua
+ ["Markers Window"] = "Окно маркеров", -- src\editor\menu_view.lua
+ ["Markers"] = "Маркеры", -- src\editor\markers.lua
+ ["Match case"] = "Совпадение регистра", -- src\editor\toolbar.lua
+ ["Match whole word"] = "Совпадение целого слова", -- src\editor\toolbar.lua
+ ["Mixed end-of-line encodings detected."] = "Обнаружены смешанные символы конца строки.", -- src\editor\commands.lua
+ ["Navigate"] = "Перейти", -- src\editor\menu_search.lua
+ ["New &File"] = "Новый файл", -- src\editor\filetree.lua
+ ["OVR"] = "ЗАМ", -- src\editor\editor.lua
+ ["Open With Default Program"] = "Открыть используя программу по умолчанию", -- src\editor\filetree.lua
+ ["Open an existing document"] = "Открыть существующий документ", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Open file"] = "Открыть файл", -- src\editor\commands.lua
+ ["Outline Window"] = "Окно структуры", -- src\editor\menu_view.lua
+ ["Outline"] = "Структура", -- src\editor\outline.lua
+ ["Output (running)"] = "Вывод (запущен)", -- src\editor\debugger.lua, src\editor\output.lua
+ ["Output (suspended)"] = "Вывод (приостановлен)", -- src\editor\debugger.lua
+ ["Output"] = "Вывод", -- src\editor\debugger.lua, src\editor\output.lua, src\editor\gui.lua, src\editor\settings.lua
+ ["Page Setup..."] = "Параметры страницы...", -- src\editor\print.lua
+ ["Paste text from the clipboard"] = "Вставить текст из буфера обмена", -- src\editor\menu_edit.lua
+ ["Preferences"] = "Настройки", -- src\editor\menu_edit.lua
+ ["Prepend '!' to force local execution."] = "Укажите '=' в начале выражения для выполнения в локальной консоли", -- src\editor\shellbox.lua
+ ["Prepend '=' to show complex values on multiple lines."] = "Укажите '=' в начале выражения для отображения сложных значений на нескольких строках.", -- src\editor\shellbox.lua
+ ["Press cancel to abort."] = "Нажмите Отмена для завершения.", -- src\editor\commands.lua
+ ["Print the current document"] = "Печать текущего документа", -- src\editor\print.lua
+ ["Program '%s' started in '%s' (pid: %d)."] = "Программа '%s' запущена в '%s' (pid: %d).", -- src\editor\output.lua
+ ["Program can't start because conflicting process is running as '%s'."] = "Программа не может быть запущена из-за конфликтующего процесса, выполняющегося как '%s'.", -- src\editor\output.lua
+ ["Program completed in %.2f seconds (pid: %d)."] = "Программа завершена за %.2f секунд (pid: %d).", -- src\editor\output.lua
+ ["Program starting as '%s'."] = "Программа запускается как '%s'.", -- src\editor\output.lua
+ ["Program stopped (pid: %d)."] = "Программа завершена (pid: %d).", -- src\editor\debugger.lua
+ ["Program unable to run as '%s'."] = "Программа не может быть запущена как '%s'.", -- src\editor\output.lua
+ ["Project Directory"] = "Папка проекта", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Project history"] = "История проектов", -- src\editor\menu_file.lua
+ ["Project"] = "Проект", -- src\editor\filetree.lua
+ ["Project/&FileTree Window"] = "Окно &проекта/списка файлов", -- src\editor\menu_view.lua
+ ["Provide command line parameters"] = "Установить параметры командной строки", -- src\editor\menu_project.lua
+ ["Queued %d files to index."] = "Помещено %d файлов в очередь на индексирование.", -- src\editor\menu_search.lua
+ ["R/O"] = "R/O", -- src\editor\editor.lua
+ ["R/W"] = "R/W", -- src\editor\editor.lua
+ ["Re&place In Files"] = "Замени&ть в файлах", -- src\editor\menu_search.lua
+ ["Re-indent selected lines"] = "Исправить отступ в выделенных строчках", -- src\editor\menu_edit.lua
+ ["Reached end of selection and wrapped around."] = "Достигнут конец выделенного текста и произведен возврат к началу.", -- src\editor\findreplace.lua
+ ["Reached end of text and wrapped around."] = "Достигнут конец текста и произведен возврат к началу.", -- src\editor\findreplace.lua
+ ["Recent Files"] = "Недавние файлы", -- src\editor\menu_file.lua
+ ["Recent Projects"] = "Недавние проекты", -- src\editor\menu_file.lua
+ ["Redo last edit undone"] = "Вернуть последнее отмененное изменение", -- src\editor\menu_edit.lua
+ ["Refresh Index"] = "Обновить индекс", -- src\editor\outline.lua
+ ["Refresh indexed symbols from files in the selected directory"] = "Обновить индекс символов из файлов в выбранной папке", -- src\editor\outline.lua
+ ["Refresh"] = "Oбновление", -- src\editor\filetree.lua
+ ["Refused a request to start a new debugging session as there is one in progress already."] = "Отказано в запросе на запуск новой отладочной сессии, поскольку одна сессия уже выполняется.", -- src\editor\debugger.lua
+ ["Regular expression"] = "Регулярное выражение", -- src\editor\toolbar.lua
+ ["Remote console"] = "Удаленная консоль", -- src\editor\shellbox.lua
+ ["Rename All Instances"] = "Переименовать все совпадения", -- src\editor\editor.lua
+ ["Replace All Selections"] = "Заменить все выделенные фрагменты", -- src\editor\editor.lua
+ ["Replace all"] = "Заменить все", -- src\editor\toolbar.lua
+ ["Replace next instance"] = "Заменить следующее совпадение", -- src\editor\toolbar.lua
+ ["Replaced %d instance."] = {"Заменено %d совпадение.", "Заменено %d совпадения.", "Заменено %d совпадений."}, -- src\editor\findreplace.lua
+ ["Replaced an invalid UTF8 character with %s."] = "Некорректный символ UTF8 заменен на %s.", -- src\editor\commands.lua
+ ["Reset to default layout"] = "Установить расположение окон по умолчанию", -- src\editor\menu_view.lua
+ ["Run As Scratchpad"] = "Запустить как черновик", -- src\editor\menu_project.lua
+ ["Run To Cursor"] = "Выполнить до курсора", -- src\editor\menu_project.lua, src\editor\editor.lua
+ ["Run as Scratchpad"] = "Запустить как черновик", -- src\editor\toolbar.lua
+ ["Run to cursor"] = "Выполнить до курсора", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["S&top Debugging"] = "&Завершить отладку", -- src\editor\menu_project.lua
+ ["S&top Process"] = "&Завершить процесс", -- src\editor\menu_project.lua
+ ["Save &As..."] = "Сохранить &как...", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["Save A&ll"] = "Сохранить &все", -- src\editor\menu_file.lua
+ ["Save Changes?"] = "Сохранить изменения?", -- src\editor\commands.lua
+ ["Save all open documents"] = "Сохранить все открытые документы", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Save file as"] = "Сохранить файл как", -- src\editor\commands.lua
+ ["Save file?"] = "Сохранить файл?", -- src\editor\commands.lua
+ ["Save the current document to a file with a new name"] = "Сохранить текущий документ в файл под новым именем", -- src\editor\menu_file.lua
+ ["Save the current document"] = "Сохранить текущий документ", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Saved auto-recover at %s."] = "Сохранено авто-восст в %s.", -- src\editor\commands.lua
+ ["Scratchpad error"] = "Ошибка в черновике", -- src\editor\debugger.lua
+ ["Search direction"] = "Направление поиска", -- src\editor\toolbar.lua
+ ["Search in selection"] = "Поиск в выделенном тексте", -- src\editor\toolbar.lua
+ ["Search in subdirectories"] = "Поиск во вложенных папках", -- src\editor\toolbar.lua
+ ["Searching for '%s'."] = "Искать '%s'.", -- src\editor\findreplace.lua
+ ["Sel: %d/%d"] = "Выд: %d/%d", -- src\editor\editor.lua
+ ["Select &All"] = "Выделить &все", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Select And Find Next"] = "Выделить и найти далее", -- src\editor\menu_search.lua
+ ["Select And Find Previous"] = "Выделить и найти ранее", -- src\editor\menu_search.lua
+ ["Select all text in the editor"] = "Выделить весь текст в редакторе", -- src\editor\menu_edit.lua
+ ["Select the word under cursor and find its next occurrence"] = "Выделить слово под курсором и найти далее", -- src\editor\menu_search.lua
+ ["Select the word under cursor and find its previous occurrence"] = "Выделить слово под курсором и найти ранее", -- src\editor\menu_search.lua
+ ["Set As Start File"] = "Установить как файл запуска", -- src\editor\filetree.lua
+ ["Set From Current File"] = "Установить по текущему файлу", -- src\editor\menu_project.lua
+ ["Set To Project Directory"] = "Установить папку проекта", -- src\editor\findreplace.lua
+ ["Set To Selected Directory"] = "Установить выбранную папку как проект", -- src\editor\filetree.lua
+ ["Set project directory from current file"] = "Установить папку проекта по текущему файлу", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Set project directory to the selected one"] = "Установить выбранную папку как папку проекта", -- src\editor\filetree.lua
+ ["Set search directory"] = "Установить папку поиска", -- src\editor\toolbar.lua
+ ["Set the interpreter to be used"] = "Установить используемый интерпретатор", -- src\editor\menu_project.lua
+ ["Set the project directory to be used"] = "Установить используемую папку проекта", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Settings: System"] = "Установки: Системы", -- src\editor\menu_edit.lua
+ ["Settings: User"] = "Установки: Пользователя", -- src\editor\menu_edit.lua
+ ["Show &Tooltip"] = "Показать &подсказку", -- src\editor\menu_edit.lua
+ ["Show All Files"] = "Показать все файлы", -- src\editor\filetree.lua
+ ["Show Hidden Files"] = "Показать спрятанные файлы", -- src\editor\filetree.lua
+ ["Show Location"] = "Показать файл в папке", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Show all files"] = "Показать все файлы", -- src\editor\filetree.lua
+ ["Show context"] = "Показать контекст", -- src\editor\toolbar.lua
+ ["Show files previously hidden"] = "Показать ранее спрятанные файлы", -- src\editor\filetree.lua
+ ["Show multiple result windows"] = "Показать результаты поиска в разных окнах", -- src\editor\toolbar.lua
+ ["Show tooltip for current position; place cursor after opening bracket of function"] = "Показать подсказку в текущей позиции; переместите курсор в позицию после открывающей скобки функции", -- src\editor\menu_edit.lua
+ ["Show/Hide the status bar"] = "Показать/спрятать панель состояния", -- src\editor\menu_view.lua
+ ["Show/Hide the toolbar"] = "Показать/спрятать панель инструментов", -- src\editor\menu_view.lua
+ ["Sort By Name"] = "Сортировать по имени", -- src\editor\outline.lua
+ ["Sort selected lines"] = "Отсортировать выделенные строки", -- src\editor\menu_edit.lua
+ ["Source"] = "Исходный код", -- src\editor\menu_edit.lua
+ ["Stack"] = "Стек", -- src\editor\debugger.lua
+ ["Start &Debugging"] = "Начать &отладку", -- src\editor\menu_project.lua
+ ["Start or continue debugging"] = "Начать или продолжить отладку", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step &Into"] = "&Войти", -- src\editor\menu_project.lua
+ ["Step &Over"] = "&Следующая строка", -- src\editor\menu_project.lua
+ ["Step O&ut"] = "В&ыйти", -- src\editor\menu_project.lua
+ ["Step into"] = "Войти в функцию", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step out of the current function"] = "Выйти из текущей функции", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step over"] = "Перейти на следующую строку", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop debugging and continue running the process"] = "Завершить отладку и продолжить текущий процесс", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop the currently running process"] = "Завершить текущий процесс", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Switch to or from full screen mode"] = "Переключить полноэкранный режим", -- src\editor\menu_view.lua
+ ["Symbol Index"] = "Индекс символов", -- src\editor\outline.lua
+ ["Text not found."] = "Текст не найден.", -- src\editor\findreplace.lua
+ ["The API file must be located in a subdirectory of the API directory."] = "Файл определений API должен быть расположен внутри папки API.", -- src\editor\autocomplete.lua
+ ["Toggle Bookmark"] = "Установить/Снять закладку", -- src\editor\markers.lua, src\editor\menu_edit.lua
+ ["Toggle Breakpoint"] = "Установить/Снять точку останова", -- src\editor\markers.lua, src\editor\menu_project.lua
+ ["Toggle bookmark"] = "Установить/Снять закладку", -- src\editor\toolbar.lua, src\editor\menu_edit.lua, src\editor\markers.lua
+ ["Toggle breakpoint"] = "Установить/Снять точку останова", -- src\editor\markers.lua, src\editor\toolbar.lua
+ ["Tr&ace"] = "Т&рассировка", -- src\editor\menu_project.lua
+ ["Trace execution showing each executed line"] = "Отслеживать выполнение, показывая каждую выполненную строку", -- src\editor\menu_project.lua
+ ["Unable to create directory '%s'."] = "Ошибка создания папки '%s'.", -- src\editor\filetree.lua
+ ["Unable to create file '%s'."] = "Ошибка создания файла '%s'.", -- src\editor\filetree.lua
+ ["Unable to delete directory '%s': %s"] = "Ошибка удаления папки '%s': %s", -- src\editor\filetree.lua
+ ["Unable to delete file '%s': %s"] = "Ошибка удаления файла '%s': %s", -- src\editor\filetree.lua
+ ["Unable to load file '%s'."] = "Ошибка загрузки файла '%s'.", -- src\editor\commands.lua
+ ["Unable to rename file '%s'."] = "Ошибка переименования файла '%s'.", -- src\editor\filetree.lua
+ ["Unable to save file '%s': %s"] = "Ошибка сохранения файла '%s': %s", -- src\editor\commands.lua
+ ["Unable to stop program (pid: %d), code %d."] = "Невозможно завершить программу (pid: %d), код %d.", -- src\editor\debugger.lua
+ ["Undo last edit"] = "Отменить последнее действие", -- src\editor\menu_edit.lua
+ ["Unmap Directory"] = "Убрать папку из списка", -- src\editor\filetree.lua
+ ["Unset '%s' As Start File"] = "Отменить '%s' как файл запуска", -- src\editor\filetree.lua
+ ["Updated %d file."] = {"Обновлен %d файл.", "Обновлено %d файла.", "Обновлено %d файлов."}, -- src\editor\findreplace.lua
+ ["Updating symbol index and settings..."] = "Обновляется индекс символов и установки...", -- src\editor\outline.lua
+ ["Use %s to close."] = "Используйте %s для закрытия.", -- src\editor\findreplace.lua
+ ["Use '%s' to see full description."] = "Используйте '%s' для полного описания.", -- src\editor\editor.lua
+ ["Use '%s' to show line endings and '%s' to convert them."] = "Используйте '%s' для отображения символов конца строки и '%s' для их преобразования.", -- src\editor\commands.lua
+ ["Use 'clear' to clear the shell output and the history."] = "Используйте команду 'clear' для очистки содержимого окна и истории.", -- src\editor\shellbox.lua
+ ["Use Shift-Enter for multiline code."] = "Используйте Shift-Enter для многострочного кода.", -- src\editor\shellbox.lua
+ ["View the markers window"] = "Показать окно маркеров", -- src\editor\menu_view.lua
+ ["View the outline window"] = "Показать окно структуры", -- src\editor\menu_view.lua
+ ["View the output/console window"] = "Показать окно вывода/консоли", -- src\editor\menu_view.lua
+ ["View the project/filetree window"] = "Показать окно проекта/списка файлов", -- src\editor\menu_view.lua
+ ["View the stack window"] = "Показать окно стека", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["View the watch window"] = "Показать окно выражений", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["Watch"] = "Выражение", -- src\editor\debugger.lua
+ ["Welcome to the interactive Lua interpreter."] = "Добро пожаловать в интерактивный интерпретатор Lua.", -- src\editor\shellbox.lua
+ ["Wrap around"] = "Продолжить сначала", -- src\editor\toolbar.lua
+ ["You must save the program first."] = "Вы должны сначала сохранить программу.", -- src\editor\commands.lua
+ ["Zoom In"] = "Приблизить", -- src\editor\menu_view.lua
+ ["Zoom Out"] = "Удалить", -- src\editor\menu_view.lua
+ ["Zoom to 100%"] = "Установить 100%", -- src\editor\menu_view.lua
+ ["Zoom"] = "Установить масштаб", -- src\editor\menu_view.lua
+ ["on line %d"] = "в строке %d", -- src\editor\debugger.lua, src\editor\editor.lua, src\editor\commands.lua
+ ["traced %d instruction"] = {"выполнена %d инструкция", "выполнено %d инструкции", "выполнено %d инструкций"}, -- src\editor\debugger.lua
+ ["unknown error"] = "неизвестная ошибка", -- src\editor\debugger.lua
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/cfg/scheme-picker.lua b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/scheme-picker.lua
new file mode 100644
index 0000000..0a3ffde
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/scheme-picker.lua
@@ -0,0 +1,28 @@
+--[[
+1. Pick a color scheme by clicking on its name:
+ - [Tomorrow](macro:inline(ApplyStyleConfig('cfg/tomorrow.lua','Tomorrow'); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = c.styles.text; ReApplySpecAndStyles()))
+ - [TomorrowContrast](macro:inline(ApplyStyleConfig('cfg/tomorrow.lua','TomorrowContrast'); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = c.styles.text; ReApplySpecAndStyles()))
+ - [TomorrowNight](macro:inline(ApplyStyleConfig('cfg/tomorrow.lua','TomorrowNight'); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = c.styles.text; ReApplySpecAndStyles()))
+ - [TomorrowNightBlue](macro:inline(ApplyStyleConfig('cfg/tomorrow.lua','TomorrowNightBlue'); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = c.styles.text; ReApplySpecAndStyles()))
+ - [TomorrowNightBright](macro:inline(ApplyStyleConfig('cfg/tomorrow.lua','TomorrowNightBright'); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = c.styles.text; ReApplySpecAndStyles()))
+ - [TomorrowNightEighties](macro:inline(ApplyStyleConfig('cfg/tomorrow.lua','TomorrowNightEighties'); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = c.styles.text; ReApplySpecAndStyles()))
+ - [Zenburn](macro:inline(ApplyStyleConfig('cfg/tomorrow.lua','Zenburn'); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = c.styles.text; ReApplySpecAndStyles()))
+ - [Monokai](macro:inline(ApplyStyleConfig('cfg/tomorrow.lua','Monokai'); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = c.styles.text; ReApplySpecAndStyles()))
+ - [Molokai](macro:inline(ApplyStyleConfig('cfg/tomorrow.lua','Molokai'); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = c.styles.text; ReApplySpecAndStyles()))
+ - [SolarizedDark](macro:inline(ApplyStyleConfig('cfg/tomorrow.lua','SolarizedDark'); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = c.styles.text; ReApplySpecAndStyles()))
+ - [SolarizedLight](macro:inline(ApplyStyleConfig('cfg/tomorrow.lua','SolarizedLight'); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = c.styles.text; ReApplySpecAndStyles()))
+ - [Notepad++](macro:inline(ApplyStyleConfig('cfg/tomorrow.lua','NotepadPlusPlus'); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = c.styles.text; ReApplySpecAndStyles()))
+ - [SciTeLuaIDE](macro:inline(ApplyStyleConfig('cfg/tomorrow.lua','SciTeLuaIDE'); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = c.styles.text; ReApplySpecAndStyles()))
+
+ - [ZeroBrane Studio](macro:inline(ide.config.styles = StylesGetDefault(); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = {}; ReApplySpecAndStyles()))
+
+2. Add the following code with the scheme you selected to `cfg/user.lua`.
+--]]
+
+styles = loadfile('cfg/tomorrow.lua')('TomorrowNightBlue')
+stylesoutshell = styles -- apply the same scheme to Output/Console windows
+styles.auxwindow = styles.text -- apply text colors to auxiliary windows
+styles.calltip = styles.text -- apply text colors to tooltips
+
+-- code example
+if false and true then func(1, 2, 3) end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/cfg/tomorrow.lua b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/tomorrow.lua
new file mode 100644
index 0000000..6d88f7f
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/tomorrow.lua
@@ -0,0 +1,311 @@
+-- This is a file that sets color scheme based on Tomorrow format.
+-- Copyright 2011-14 Paul Kulchenko, ZeroBrane LLC
+
+-- Tomorrow colors from https://github.com/chriskempson/tomorrow-theme
+-- Zenburn colors from https://github.com/jnurmine/Zenburn/blob/master/colors/zenburn.vim (contributed by Srdjan Marković)
+-- Monokai colors from http://www.monokai.nl/blog/2006/07/15/textmate-color-theme/
+-- Molokai colors based on https://github.com/tomasr/molokai/blob/master/colors/molokai.vim
+-- Solarized colors from https://github.com/altercation/vim-colors-solarized
+
+local theme = ...
+
+local function h2d(n) return 0+('0x'..n) end
+local function H(c, bg) c = c:gsub('#','')
+ -- since alpha is not implemented, convert RGBA to RGB
+ -- assuming 0 is transparent and 255 is opaque
+ -- based on http://stackoverflow.com/a/2645218/1442917
+ local bg = bg and H(bg) or {255, 255, 255}
+ local a = #c > 6 and h2d(c:sub(7,8))/255 or 1
+ local r, g, b = h2d(c:sub(1,2)), h2d(c:sub(3,4)), h2d(c:sub(5,6))
+ return {
+ math.min(255, math.floor((1-a)*bg[1]+a*r)),
+ math.min(255, math.floor((1-a)*bg[2]+a*g)),
+ math.min(255, math.floor((1-a)*bg[3]+a*b))}
+end
+
+local colors = {
+ Tomorrow = {
+ Background = H'ffffff',
+ CurrentLine = H'efefef',
+ Selection = H'd6d6d6',
+ Foreground = H'4d4d4c',
+ Comment = H'8e908c',
+ Red = H'c82829',
+ Orange = H'f5871f',
+ Yellow = H'eab700',
+ Green = H'718c00',
+ Aqua = H'3e999f',
+ Blue = H'4271ae',
+ Purple = H'8959a8',
+ },
+ TomorrowContrast = { -- contributed by Sergey Lerg
+ Background = H'f7f7f7',
+ CurrentLine = H'efefef',
+ Selection = H'd6d6d6',
+ Foreground = H'202020',
+ Comment = H'8e908c',
+ Red = H'4669ff', --numbers
+ Orange = H'f5871f',
+ Yellow = H'eab700',
+ Green = H'108010', --strings
+ Aqua = H'4060b0', --built in functions
+ Blue = H'101080', --keywords
+ Purple = H'a01090',
+ },
+ TomorrowNight = {
+ Background = H'1d1f21',
+ CurrentLine = H'282a2e',
+ Selection = H'373b41',
+ Foreground = H'c5c8c6',
+ Comment = H'969896',
+ Red = H'cc6666',
+ Orange = H'de935f',
+ Yellow = H'f0c674',
+ Green = H'b5bd68',
+ Aqua = H'8abeb7',
+ Blue = H'81a2be',
+ Purple = H'b294bb',
+ },
+ TomorrowNightEighties = {
+ Background = H'2d2d2d',
+ CurrentLine = H'393939',
+ Selection = H'515151',
+ Foreground = H'cccccc',
+ Comment = H'999999',
+ Red = H'f2777a',
+ Orange = H'f99157',
+ Yellow = H'ffcc66',
+ Green = H'99cc99',
+ Aqua = H'66cccc',
+ Blue = H'6699cc',
+ Purple = H'cc99cc',
+ },
+ TomorrowNightBlue = {
+ Background = H'002451',
+ CurrentLine = H'00346e',
+ Selection = H'003f8e',
+ Foreground = H'ffffff',
+ Comment = H'7285b7',
+ Red = H'ff9da4',
+ Orange = H'ffc58f',
+ Yellow = H'ffeead',
+ Green = H'd1f1a9',
+ Aqua = H'99ffff',
+ Blue = H'bbdaff',
+ Purple = H'ebbbff',
+ },
+ TomorrowNightBright = {
+ Background = H'000000',
+ CurrentLine = H'2a2a2a',
+ Selection = H'424242',
+ Foreground = H'eaeaea',
+ Comment = H'969896',
+ Red = H'd54e53',
+ Orange = H'e78c45',
+ Yellow = H'e7c547',
+ Green = H'b9ca4a',
+ Aqua = H'70c0b1',
+ Blue = H'7aa6da',
+ Purple = H'c397d8',
+ },
+ Zenburn = {
+ Background = H'3f3f3f',
+ CurrentLine = H'363636',
+ Selection = H'1f1f1f',
+ Foreground = H'dcdccc',
+ Comment = H'7f9f7f',
+ Red = H'8cd0d3',
+ Orange = H'dfaf8f',
+ Yellow = H'e3ceab',
+ Green = H'cc9393',
+ Aqua = H'dca3a3',
+ Blue = H'f0dfaf',
+ Purple = H'efef8f',
+ },
+ Monokai = {
+ Background = H'272822',
+ CurrentLine = H'2D2F29',
+ Selection = H'49483E',
+ Foreground = H'F8F8F2',
+ Comment = H'75715E',
+ Red = H'AE81FF',
+ Orange = H'AE81FF',
+ Yellow = H'F8F8F2',
+ Green = H'E6DB74',
+ Aqua = H'66D9EF',
+ Blue = H'F92672',
+ Purple = H'A6E22E',
+ },
+ Molokai = {
+ Background = H'1B1D1E',
+ CurrentLine = H'293739',
+ Selection = H'49483E',
+ Foreground = H'F8F8F2',
+ Comment = H'7E8E91',
+ Red = H'AE81FF',
+ Orange = H'AE81FF',
+ Yellow = H'F8F8F2',
+ Green = H'E6DB74',
+ Aqua = H'66D9EF',
+ Blue = H'F92672',
+ Purple = H'A6E22E',
+ },
+ SolarizedDark = {
+ Background = H'042029',
+ CurrentLine = H'0A2933',
+ Selection = H'073642',
+ Foreground = H'839496',
+ Comment = H'586E75',
+ Red = H'D33682',
+ Orange = H'B58900',
+ Yellow = H'839496',
+ Green = H'2AA198',
+ Aqua = H'839496',
+ Blue = H'859900',
+ Purple = H'268BD2',
+ },
+ SolarizedLight = {
+ Background = H'FDF6E3',
+ CurrentLine = H'EEE8D5',
+ Selection = H'E0E0D0',
+ Foreground = H'586E75',
+ Comment = H'93A1A1',
+ Red = H'D33682',
+ Orange = H'B58900',
+ Yellow = H'586E75',
+ Green = H'2AA198',
+ Aqua = H'586E75',
+ Blue = H'859900',
+ Purple = H'268BD2',
+ },
+ NotepadPlusPlus = { -- contributed by Florian (https://github.com/SiENcE)
+ Background = H'FFFFFF',
+ CurrentLine = H'E9E2FF',
+ Selection = H'C0C0C0',
+ Foreground = H'000000',
+ Comment = H'008000',
+ Red = H'FF6900',
+ Orange = H'FF0000',
+ Yellow = H'FF4E00',
+ Green = H'808080',
+ Aqua = H'000080',
+ Blue = H'2123FF',
+ Purple = H'8000FF',
+ },
+ SciTeLuaIDE = { -- contributed by Jayanth Acharya
+ Background = H'1B1D1E',
+ CurrentLine = H'293739',
+ Selection = H'49483E',
+ Foreground = H'F8F8F2', -- super-light-gray (everything else)
+ Comment = H'00FF00', -- bright green (comments)
+ Red = H'F92672', -- purple (numbers)
+ Orange = H'AE81FF', -- lavendar?? (numbers)
+ Yellow = H'F8F8F2', -- light-gray
+ Green = H'FF8000', -- amber (string literal)
+ Aqua = H'808080', -- gray (operators, separators etc.)
+ Blue = H'0066FF', -- semi-blue (keywords)
+ Purple = H'A6E22E', -- light-grass-green
+ },
+}
+
+-- add more of the specified color (keeping all in 0-255 range)
+local mixer = function(c, n, more)
+ if not c or #c == 0 then return c end
+ local c = {c[1], c[2], c[3]} -- create a copy, so it can be modified
+ c[n] = c[n] + more
+ local excess = c[n] - 255
+ if excess > 0 then
+ for clr = 1, 3 do
+ c[clr] = n == clr and 255 or c[clr] > excess and c[clr] - excess or 0
+ end
+ end
+ return c
+end
+
+local C = colors[theme] or colors.Tomorrow
+return {
+ -- wxstc.wxSTC_LUA_DEFAULT
+ lexerdef = {fg = C.Foreground},
+ -- wxstc.wxSTC_LUA_COMMENT, wxstc.wxSTC_LUA_COMMENTLINE, wxstc.wxSTC_LUA_COMMENTDOC
+ comment = {fg = C.Comment, fill = true},
+ -- wxstc.wxSTC_LUA_STRING, wxstc.wxSTC_LUA_CHARACTER, wxstc.wxSTC_LUA_LITERALSTRING
+ stringtxt = {fg = C.Green},
+ -- wxstc.wxSTC_LUA_STRINGEOL
+ stringeol = {fg = C.Green, fill = true},
+ -- wxstc.wxSTC_LUA_PREPROCESSOR
+ preprocessor = {fg = C.Orange},
+ -- wxstc.wxSTC_LUA_OPERATOR
+ operator = {fg = C.Aqua},
+ -- wxstc.wxSTC_LUA_NUMBER
+ number = {fg = C.Red},
+
+ -- wxstc.wxSTC_LUA_WORD, wxstc.wxSTC_LUA_WORD2-8
+ keywords0 = {fg = C.Blue, b = true},
+ keywords1 = {fg = C.Aqua, b = false},
+ keywords2 = {fg = C.Aqua, b = true},
+ keywords3 = {fg = C.Purple, b = false},
+ keywords4 = {fg = C.Purple, b = false},
+ keywords5 = {fg = C.Purple, b = false},
+ keywords6 = {fg = C.Purple, b = false},
+ keywords7 = {fg = C.Purple, b = false},
+
+ -- common (inherit fg/bg from text)
+ -- wxstc.wxSTC_LUA_IDENTIFIER
+ text = {fg = C.Foreground, bg = C.Background},
+ linenumber = {fg = C.Comment},
+ bracematch = {fg = C.Orange, b = true},
+ bracemiss = {fg = C.Red, b = true},
+ ctrlchar = {fg = C.Yellow},
+ indent = {fg = C.Comment},
+ calltip = nil,
+
+ -- common special (need custom fg & bg)
+ sel = {bg = C.Selection},
+ caret = {fg = C.Foreground},
+ caretlinebg = {bg = C.CurrentLine},
+ fold = {fg = C.Comment, bg = C.Background, sel = mixer(C.Comment, 1, 96)},
+ whitespace = {fg = C.Comment, bg = C.Background},
+ edge = {},
+
+ indicator = {
+ fncall = {fg = C.Purple, st = wxstc.wxSTC_INDIC_HIDDEN},
+ --[[ other possible values are:
+ wxSTC_INDIC_PLAIN Single-line underline
+ wxSTC_INDIC_SQUIGGLE Squiggly underline
+ wxSTC_INDIC_TT Line of small T-shapes
+ wxSTC_INDIC_DIAGONAL Diagonal hatching
+ wxSTC_INDIC_STRIKE Strike-out
+ wxSTC_INDIC_BOX Box
+ wxSTC_INDIC_ROUNDBOX Rounded Box
+ --]]
+ -- these indicators have all different default styles
+ varlocal = {fg = C.Foreground},
+ varglobal = {fg = C.Foreground},
+ varmasked = {fg = C.Foreground},
+ varmasking = {fg = C.Foreground},
+ },
+
+ -- markup
+ ['['] = {hs = mixer(C.Comment, 3, 64)},
+ ['|'] = {fg = mixer(mixer(C.Comment, 1, 64), 3, 64)},
+
+ -- markers
+ marker = {
+ message = {bg = C.Selection},
+ output = {bg = C.CurrentLine},
+ prompt = {fg = C.Foreground, bg = C.Background},
+ error = {bg = mixer(C.Background, 1, 32)},
+ },
+}
+
+--[[
+
+---- Solarized license ----
+
+Copyright (c) 2011 Ethan Schoonover
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+--]]
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/cfg/user-sample.lua b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/user-sample.lua
new file mode 100644
index 0000000..302ccf2
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/user-sample.lua
@@ -0,0 +1,170 @@
+--[[-- This file shows examples of settings you can adjust.
+
+Configuration files with preferences are loaded in the following order:
+1. cfg/user.lua (system-wide configuration)
+2. HOME/.zbstudio/user.lua (per-user configuration)
+3. -cfg <lua code fragment|filename> (command line configuration)
+
+See [configuration](http://studio.zerobrane.com/doc-configuration.html) page for information about location of configuration files.
+
+--]]--
+
+-- to modify loaded configuration for recognized extensions for lua files
+-- (no longer needed in v1.21+) local G = ... -- this now points to the global environment
+local luaspec = ide.specs.lua
+luaspec.exts[#luaspec.exts+1] = "luaz"
+luaspec.keywords[1] = luaspec.keywords[1] .. ' foo'
+
+-- to modify a key mapping; see the full list of IDs in src/editor/keymap.lua
+-- starting from v0.95, ID.<menuid> can be used instead of G.ID_<menuid>
+keymap[ID.STARTDEBUG] = "Ctrl-Shift-D"
+
+-- to change font size to 12
+editor.fontsize = 12 -- this is mapped to ide.config.editor.fontsize
+editor.fontname = "Courier New"
+filehistorylength = 20 -- this is mapped to ide.config.filehistorylength
+
+-- to specify full path to love2d *executable*; this is only needed
+-- if the game folder and the executable are NOT in the same folder.
+path.love2d = 'd:/lua/love/love'
+
+-- to specify full path to moai *executable* if it's not in one of PATH folders
+path.moai = 'd:/lua/moai/moai'
+-- Moai config.lua file is searched in the following places: (1) MOAI_CONFIG,
+-- (2) project directory (if set) or folder with the current file,
+-- (3) folder with the moai executable.
+
+-- to specify full path to gideros *executable* if it's not in one of PATH folders
+path.gideros = 'd:/Program Files/Gideros/GiderosPlayer.exe'
+
+-- to specify full path to corona *executable* if it's not in one of PATH folders
+path.corona = 'd:/path/to/Corona SDK/Corona Simulator.exe'
+
+-- to specify full path to lua interpreter if you need to use your own version
+path.lua = 'd:/lua/lua'
+
+-- to specify full path to GSL-shell *executable* if it's not in one of PATH folders
+path.gslshell = [[D:\Lua\gsl-shell\gsl-shell.exe]]
+
+-- to provide output filter for those engines that support redirecting
+-- of "print" output to the IDE (like Corona SDK or Gideros)
+debugger.outputfilter = function(m) return #m < 124 and m or m:sub(1,120).."...\n" end
+
+-- to fix an issue with 0d0d0a line endings in MOAI examples,
+-- which may negatively affect breakpoints during debugging
+editor.iofilter = "0d0d0aFix"
+
+-- to have 4 spaces when TAB is used in the editor
+editor.tabwidth = 4
+
+-- to have TABs stored in the file (to allow mixing tabs and spaces)
+editor.usetabs = true
+
+-- to disable wrapping of long lines in the editor
+editor.usewrap = false
+
+-- to turn dynamic words on and to start suggestions after 4 characters
+acandtip.nodynwords = false
+acandtip.startat = 4
+
+-- to automatically open files requested during debugging
+editor.autoactivate = true
+
+-- to specify a list of MOAI entrypoints
+moai = { entrypoints = { "main.lua", "source/main.lua" } }
+
+-- to specify language to use in the IDE (requires a file in cfg/i18n folder)
+language = "ru"
+
+-- to change background color (or other colors in the IDE);
+-- see cfg/tomorrow.lua for example/details on what other colors to change
+styles.text = {bg = {240,240,220}}
+
+-- to change the default color scheme; check tomorrow.lua for the list
+-- of supported schemes or use cfg/scheme-picker.lua to pick a scheme.
+-- (no longer needed in v1.21+) local G = ... -- this now points to the global environment
+styles = loadfile('cfg/tomorrow.lua')('Tomorrow')
+-- also apply the same scheme to Output and Console windows
+stylesoutshell = styles
+
+-- to change markers used in console and output windows
+styles.marker = styles.marker or {}
+styles.marker.message = {ch = wxstc.wxSTC_MARK_ARROWS, fg = {0, 0, 0}, bg = {240, 240, 240}}
+styles.marker.output = {ch = wxstc.wxSTC_MARK_BACKGROUND, fg = {0, 0, 0}, bg = {240, 240, 240}}
+styles.marker.prompt = {ch = wxstc.wxSTC_MARK_CHARACTER+('>'):byte(), fg = {0, 0, 0}, bg = {240, 240, 240}}
+stylesoutshell = styles
+
+-- to disable indicators (underlining) on function calls
+-- styles.indicator.fncall = nil
+
+-- to change the color of the indicator used for function calls
+styles.indicator.fncall.fg = {240,0,0}
+
+-- to change the type of the indicator used for function calls
+styles.indicator.fncall.st = wxstc.wxSTC_INDIC_PLAIN
+ --[[ other possible values are:
+ wxSTC_INDIC_DOTS Dotted underline; wxSTC_INDIC_PLAIN Single-line underline
+ wxSTC_INDIC_TT Line of Tshapes; wxSTC_INDIC_SQUIGGLE Squiggly underline
+ wxSTC_INDIC_STRIKE Strike-out; wxSTC_INDIC_SQUIGGLELOW Squiggly underline (2 pixels)
+ wxSTC_INDIC_BOX Box; wxSTC_INDIC_ROUNDBOX Rounded Box
+ wxSTC_INDIC_DASH Dashed underline; wxSTC_INDIC_STRAIGHTBOX Box with trasparency
+ wxSTC_INDIC_DOTBOX Dotted rectangle; wxSTC_INDIC_DIAGONAL Diagonal hatching
+ wxSTC_INDIC_HIDDEN No visual effect;
+ --]]
+
+-- to enable additional spec files (like spec/glsl.lua)
+load.specs(function(file) return file:find('spec[/\\]glsl%.lua$') end)
+
+-- to specify a default EOL encoding to be used for new files:
+-- `wxstc.wxSTC_EOL_CRLF` or `wxstc.wxSTC_EOL_LF`;
+-- `nil` means OS default: CRLF on Windows and LF on Linux/Unix and OSX.
+-- (OSX had CRLF as a default until v0.36, which fixed it).
+editor.defaulteol = wxstc.wxSTC_EOL_LF
+
+-- to turn off checking for mixed end-of-line encodings in loaded files
+editor.checkeol = false
+
+-- to force execution to continue immediately after starting debugging;
+-- set to `false` to disable (the interpreter will stop on the first line or
+-- when debugging starts); some interpreters may use `true` or `false`
+-- by default, but can be still reconfigured with this setting.
+debugger.runonstart = true
+
+-- to set compact fold that doesn't include empty lines after a block
+editor.foldcompact = true
+
+-- to disable zoom with mouse wheel as it may be too sensitive on OSX
+editor.nomousezoom = true
+
+-- to specify a skin for Corona simulator (OSX only);
+-- you can also change it between runs from Local Console by executing
+-- `ide.config.corona = {skin = 'iPad'}`
+corona = { skin = "iPad" }
+
+-- to style individual keywords; `return` and `break` are shown in red
+-- (no longer needed in v1.21+) local G = ... -- this now points to the global environment
+local luaspec = ide.specs.lua
+
+local num = #luaspec.keywords
+-- take a new slot in the list of keywords (starting from 1)
+luaspec.keywords[num+1] = 'return break'
+-- remove 'return' from the list of "regular" keywords
+luaspec.keywords[1] = luaspec.keywords[1]:gsub(' return', ''):gsub(' break', '')
+
+-- assign new style to the added slot (starting from 0)
+styles["keywords"..num] = {fg = {240, 0, 0}, b = true}
+
+-- enable `Opt+Shift+Left/Right` shortcut on OSX
+editor.keymap[#editor.keymap+1] = {wxstc.wxSTC_KEY_LEFT, wxstc.wxSTC_SCMOD_ALT+wxstc.wxSTC_SCMOD_SHIFT, wxstc.wxSTC_CMD_WORDLEFTEXTEND, "Macintosh"}
+editor.keymap[#editor.keymap+1] = {wxstc.wxSTC_KEY_RIGHT, wxstc.wxSTC_SCMOD_ALT+wxstc.wxSTC_SCMOD_SHIFT, wxstc.wxSTC_CMD_WORDRIGHTENDEXTEND, "Macintosh"}
+
+-- enable Emacs bindings to use `Ctrl-A` and `Ctrl-E` to go to the line start/end
+editor.keymap[#editor.keymap+1] = {('A'):byte(), wxstc.wxSTC_SCMOD_CTRL, wxstc.wxSTC_CMD_HOME}
+editor.keymap[#editor.keymap+1] = {('E'):byte(), wxstc.wxSTC_SCMOD_CTRL, wxstc.wxSTC_CMD_LINEEND}
+keymap[ID.SELECTALL] = nil -- remove `Ctrl-A` shortcut from `SelectAll`
+
+-- updated shortcuts to use them as of v1.20
+keymap[ID.BREAK] = "Shift-F9"
+keymap[ID.BREAKPOINTTOGGLE] = "F9"
+keymap[ID.BREAKPOINTNEXT] = ""
+keymap[ID.BREAKPOINTPREV] = ""
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/cfg/user.lua b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/user.lua
new file mode 100644
index 0000000..b71d023
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/user.lua
@@ -0,0 +1,56 @@
+--[[-- This file shows examples of settings you can adjust.
+
+Configuration files with preferences are loaded in the following order:
+1. cfg/user.lua (system-wide configuration)
+2. HOME/.zbstudio/user.lua (per-user configuration)
+3. -cfg <lua code fragment|filename> (command line configuration)
+
+See [configuration](http://studio.zerobrane.com/doc-configuration.html) page for information about location of configuration files.
+
+--]]--
+
+-- to modify a key mapping; see the full list of IDs in src/editor/keymap.lua
+-- starting from v0.95, ID.<menuid> can be used instead of G.ID_<menuid>
+keymap[ID.RUN] = "Ctrl-R"
+keymap[ID.REPLACE] = nil
+
+-- to change font size to 12
+editor.fontsize = 14 -- this is mapped to ide.config.editor.fontsize
+--editor.fontname = "Courier New"
+filehistorylength = 20 -- this is mapped to ide.config.filehistorylength
+
+-- to specify full path to love2d *executable*; this is only needed
+-- if the game folder and the executable are NOT in the same folder.
+path.love2d = '../tools/love-old-win/love.exe'
+
+-- to disable wrapping of long lines in the editor
+editor.usewrap = true
+
+-- to specify language to use in the IDE (requires a file in cfg/i18n folder)
+language = "en"
+
+-- do not offer dynamic (user entered) words; set to false to collect all words from all open editor tabs and offer them as part of the auto-complete list.
+acandtip.nodynwords = true
+
+-- to change the default color scheme; check tomorrow.lua for the list
+-- of supported schemes or use cfg/scheme-picker.lua to pick a scheme.
+-- (no longer needed in v1.21+) local G = ... -- this now points to the global environment
+styles = loadfile('cfg/tomorrow.lua')('Tomorrow')
+
+--TURN OFF UNDERLINING
+styles.indicator = {}
+
+-- also apply the same scheme to Output and Console windows
+stylesoutshell = styles
+
+-- to set compact fold that doesn't include empty lines after a block
+--editor.foldcompact = true
+
+-- set the default interpreter used for new projects
+interpreter = "love2d"
+
+-- https://github.com/pkulchenko/ZeroBraneStudio/issues/645
+ide.interpreters.love2d.skipcompile=true
+
+-- don't open output on run
+activateoutput = false
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/cfg/xcode-keys.lua b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/xcode-keys.lua
new file mode 100644
index 0000000..2fec8a2
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/cfg/xcode-keys.lua
@@ -0,0 +1,73 @@
+-- Copy the content of this file to user.lua;
+-- see the [configuration](http://studio.zerobrane.com/doc-configuration.html) page for details.
+
+-- Alt-Shift-Cmd-X (Alt maps to Option, Ctrl maps to Command)
+-- The mapping is largely based on [Xcode Keyboard Shortcuts](http://developer.apple.com/library/mac/#documentation/IDEs/Conceptual/xcode_help-command_shortcuts/MenuCommands/MenuCommands014.html).
+local xcode = {
+-- File menu
+ [ID.NEW] = "Ctrl-N",
+ [ID.OPEN] = "Ctrl-O",
+ [ID.CLOSE] = "Ctrl-W",
+ [ID.SAVE] = "Ctrl-S",
+ [ID.SAVEAS] = "Shift-Ctrl-S",
+ [ID.SAVEALL] = "Alt-Ctrl-S",
+ [ID.RECENTFILES] = "",
+ [ID.EXIT] = "Ctrl-Q",
+-- Edit menu
+ [ID.CUT] = "Ctrl-X",
+ [ID.COPY] = "Ctrl-C",
+ [ID.PASTE] = "Ctrl-V",
+ [ID.SELECTALL] = "Ctrl-A",
+ [ID.UNDO] = "Ctrl-Z",
+ [ID.REDO] = "Shift-Ctrl-Z",
+ [ID.SHOWTOOLTIP] = "Ctrl-T",
+ [ID.AUTOCOMPLETE] = "Ctrl-K",
+ [ID.AUTOCOMPLETEENABLE] = "",
+ [ID.COMMENT] = "Ctrl-U",
+ [ID.FOLD] = "F12",
+ [ID.CLEARDYNAMICWORDS] = "",
+-- Search menu
+ [ID.FIND] = "Ctrl-F",
+ [ID.FINDNEXT] = "Ctrl-G",
+ [ID.FINDPREV] = "Shift-Ctrl-G",
+ [ID.REPLACE] = "Alt-Ctrl-F",
+ [ID.FINDINFILES] = "Shift-Ctrl-F",
+ [ID.REPLACEINFILES] = "Alt-Shift-Ctrl-F",
+ [ID.SORT] = "",
+-- View menu
+ [ID.VIEWFILETREE] = "Shift-Ctrl-P",
+ [ID.VIEWOUTPUT] = "Shift-Ctrl-O",
+ [ID.VIEWWATCHWINDOW] = "Shift-Ctrl-W",
+ [ID.VIEWCALLSTACK] = "Shift-Ctrl-S",
+ [ID.VIEWDEFAULTLAYOUT] = "",
+ [ID.VIEWFULLSCREEN] = "Shift-Ctrl-A",
+-- Project menu
+ [ID.RUN] = "Ctrl-R",
+ [ID.RUNNOW] = "Shift-Ctrl-R",
+ [ID.COMPILE] = "Ctrl-B",
+ [ID.ANALYZE] = "Shift-Ctrl-B",
+ [ID.STARTDEBUG] = "F5",
+ [ID.ATTACHDEBUG] = "",
+ [ID.STOPDEBUG] = "Ctrl-.",
+ [ID.STEP] = "F7",
+ [ID.STEPOVER] = "F6",
+ [ID.STEPOUT] = "F8",
+ [ID.TRACE] = "",
+ [ID.BREAK] = "Ctrl-Y",
+ [ID.BREAKPOINTTOGGLE] = "Ctrl-\\",
+ [ID.CLEAROUTPUT] = "",
+ [ID.INTERPRETER] = "",
+ [ID.PROJECTDIR] = "",
+-- Help menu
+ [ID.ABOUT] = "F1",
+-- Watch window menu items
+ [ID.ADDWATCH] = "Ins",
+ [ID.EDITWATCH] = "F2",
+ [ID.DELETEWATCH] = "Del",
+-- Editor popup menu items
+ [ID.QUICKADDWATCH] = "",
+ [ID.QUICKEVAL] = "",
+}
+
+local G = ...
+for id, key in G.pairs(xcode) do keymap[id] = key end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/interpreters/love2d.lua b/love2dToAPK/tools/tools/zbstudio-old-win/interpreters/love2d.lua
new file mode 100644
index 0000000..9059584
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/interpreters/love2d.lua
@@ -0,0 +1,61 @@
+-- Copyright 2011-12 Paul Kulchenko, ZeroBrane LLC
+
+local love2d
+local win = ide.osname == "Windows"
+local mac = ide.osname == "Macintosh"
+
+return {
+ name = "LÖVE",
+ description = "LÖVE game engine",
+ api = {"baselib", "love2d"},
+ frun = function(self,wfilename,rundebug)
+ love2d = love2d or ide.config.path.love2d -- check if the path is configured
+ if not love2d then
+ local sep = win and ';' or ':'
+ local default =
+ win and (GenerateProgramFilesPath('love', sep)..sep)
+ or mac and ('/Applications/love.app/Contents/MacOS'..sep)
+ or ''
+ local path = default
+ ..(os.getenv('PATH') or '')..sep
+ ..(GetPathWithSep(self:fworkdir(wfilename)))..sep
+ ..(os.getenv('HOME') and GetPathWithSep(os.getenv('HOME'))..'bin' or '')
+ local paths = {}
+ for p in path:gmatch("[^"..sep.."]+") do
+ love2d = love2d or GetFullPathIfExists(p, win and 'love.exe' or 'love')
+ table.insert(paths, p)
+ end
+ if not love2d then
+ DisplayOutputLn("Can't find love2d executable in any of the following folders: "
+ ..table.concat(paths, ", "))
+ return
+ end
+ end
+
+ if not GetFullPathIfExists(self:fworkdir(wfilename), 'main.lua') then
+ DisplayOutputLn(("Can't find 'main.lua' file in the current project folder: '%s'.")
+ :format(self:fworkdir(wfilename)))
+ return
+ end
+
+ if rundebug then
+ DebuggerAttachDefault({runstart = ide.config.debugger.runonstart == true})
+ end
+
+ -- suppress hiding ConsoleWindowClass as this is used by Love console
+ local uhw = ide.config.unhidewindow
+ local cwc = uhw and uhw.ConsoleWindowClass
+ if uhw then uhw.ConsoleWindowClass = 0 end
+
+ local params = ide.config.arg.any or ide.config.arg.love2d
+ local cmd = ('"%s" "%s"%s%s'):format(love2d, self:fworkdir(wfilename),
+ params and " "..params or "", rundebug and ' -debug' or '')
+ -- CommandLineRun(cmd,wdir,tooutput,nohide,stringcallback,uid,endcallback)
+ return CommandLineRun(cmd,self:fworkdir(wfilename),true,true,nil,nil,
+ function() if uhw then uhw.ConsoleWindowClass = cwc end end)
+ end,
+ hasdebugger = true,
+ fattachdebug = function(self) DebuggerAttachDefault() end,
+ scratchextloop = true,
+ takeparameters = true,
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/interpreters/luabase.lua b/love2dToAPK/tools/tools/zbstudio-old-win/interpreters/luabase.lua
new file mode 100644
index 0000000..d33edc2
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/interpreters/luabase.lua
@@ -0,0 +1,101 @@
+function MakeLuaInterpreter(version, name)
+
+local function exePath(self, version)
+ local version = tostring(version):gsub('%.','')
+ local mainpath = ide.editorFilename:gsub("[^/\\]+$","")
+ local macExe = mainpath..([[bin/lua.app/Contents/MacOS/lua%s]]):format(version)
+ return ide.config.path['lua'..version]
+ or (ide.osname == "Windows" and mainpath..([[bin\lua%s.exe]]):format(version))
+ or (ide.osname == "Unix" and mainpath..([[bin/linux/%s/lua%s]]):format(ide.osarch, version))
+ or (wx.wxFileExists(macExe) and macExe or mainpath..([[bin/lua%s]]):format(version))
+end
+
+return {
+ name = ("Lua%s"):format(name or version or ""),
+ description = ("Lua%s interpreter with debugger"):format(name or version or ""),
+ api = {"baselib"},
+ luaversion = version or '5.1',
+ fexepath = exePath,
+ frun = function(self,wfilename,rundebug)
+ local exe = self:fexepath(version or "")
+ local filepath = wfilename:GetFullPath()
+
+ do
+ -- if running on Windows and can't open the file, this may mean that
+ -- the file path includes unicode characters that need special handling
+ local fh = io.open(filepath, "r")
+ if fh then fh:close() end
+ if ide.osname == 'Windows' and pcall(require, "winapi")
+ and wfilename:FileExists() and not fh then
+ winapi.set_encoding(winapi.CP_UTF8)
+ local shortpath = winapi.short_path(filepath)
+ if shortpath == filepath then
+ DisplayOutputLn(
+ ("Can't get short path for a Unicode file name '%s' to open the file.")
+ :format(filepath))
+ DisplayOutputLn(
+ ("You can enable short names by using `fsutil 8dot3name set %s: 0` and recreate the file or directory.")
+ :format(wfilename:GetVolume()))
+ end
+ filepath = shortpath
+ end
+ end
+
+ if rundebug then
+ DebuggerAttachDefault({runstart = ide.config.debugger.runonstart == true})
+
+ -- update arg to point to the proper file
+ rundebug = ('if arg then arg[0] = [[%s]] end '):format(filepath)..rundebug
+
+ local tmpfile = wx.wxFileName()
+ tmpfile:AssignTempFileName(".")
+ filepath = tmpfile:GetFullPath()
+ local f = io.open(filepath, "w")
+ if not f then
+ DisplayOutputLn("Can't open temporary file '"..filepath.."' for writing.")
+ return
+ end
+ f:write(rundebug)
+ f:close()
+ end
+ local params = ide.config.arg.any or ide.config.arg.lua
+ local code = ([[-e "io.stdout:setvbuf('no')" "%s"]]):format(filepath)
+ local cmd = '"'..exe..'" '..code..(params and " "..params or "")
+
+ -- modify CPATH to work with other Lua versions
+ local envname = "LUA_CPATH"
+ if version then
+ local env = "LUA_CPATH_"..string.gsub(version, '%.', '_')
+ if os.getenv(env) then envname = env end
+ end
+
+ local cpath = os.getenv(envname)
+ if rundebug and cpath and not ide.config.path['lua'..(version or "")] then
+ -- prepend osclibs as the libraries may be needed for debugging,
+ -- but only if no path.lua is set as it may conflict with system libs
+ wx.wxSetEnv(envname, ide.osclibs..';'..cpath)
+ end
+ if version and cpath then
+ local cpath = os.getenv(envname)
+ local clibs = string.format('/clibs%s/', version):gsub('%.','')
+ if not cpath:find(clibs, 1, true) then cpath = cpath:gsub('/clibs/', clibs) end
+ wx.wxSetEnv(envname, cpath)
+ end
+
+ -- CommandLineRun(cmd,wdir,tooutput,nohide,stringcallback,uid,endcallback)
+ local pid = CommandLineRun(cmd,self:fworkdir(wfilename),true,false,nil,nil,
+ function() if rundebug then wx.wxRemoveFile(filepath) end end)
+
+ if (rundebug or version) and cpath then wx.wxSetEnv(envname, cpath) end
+ return pid
+ end,
+ hasdebugger = true,
+ fattachdebug = function(self) DebuggerAttachDefault() end,
+ scratchextloop = false,
+ unhideanywindow = true,
+ takeparameters = true,
+}
+
+end
+
+return nil -- as this is not a real interpreter
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/interpreters/luadeb.lua b/love2dToAPK/tools/tools/zbstudio-old-win/interpreters/luadeb.lua
new file mode 100644
index 0000000..49af279
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/interpreters/luadeb.lua
@@ -0,0 +1,2 @@
+dofile 'interpreters/luabase.lua'
+return MakeLuaInterpreter()
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/interpreters/luadeb52.lua b/love2dToAPK/tools/tools/zbstudio-old-win/interpreters/luadeb52.lua
new file mode 100644
index 0000000..989afbc
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/interpreters/luadeb52.lua
@@ -0,0 +1,2 @@
+dofile 'interpreters/luabase.lua'
+return MakeLuaInterpreter(5.2, ' 5.2')
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/interpreters/luadeb53.lua b/love2dToAPK/tools/tools/zbstudio-old-win/interpreters/luadeb53.lua
new file mode 100644
index 0000000..4b08672
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/interpreters/luadeb53.lua
@@ -0,0 +1,4 @@
+dofile 'interpreters/luabase.lua'
+local interpreter = MakeLuaInterpreter(5.3, ' 5.3')
+interpreter.skipcompile = true
+return interpreter
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/copas/copas.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/copas/copas.lua
new file mode 100644
index 0000000..dd68591
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/copas/copas.lua
@@ -0,0 +1,636 @@
+-------------------------------------------------------------------------------
+-- Copas - Coroutine Oriented Portable Asynchronous Services
+--
+-- A dispatcher based on coroutines that can be used by TCP/IP servers.
+-- Uses LuaSocket as the interface with the TCP/IP stack.
+--
+-- Authors: Andre Carregal, Javier Guerra, and Fabio Mascarenhas
+-- Contributors: Diego Nehab, Mike Pall, David Burgess, Leonardo Godinho,
+-- Thomas Harning Jr., and Gary NG
+--
+-- Copyright 2005 - Kepler Project (www.keplerproject.org)
+--
+-- $Id: copas.lua,v 1.37 2009/04/07 22:09:52 carregal Exp $
+-------------------------------------------------------------------------------
+
+if package.loaded["socket.http"] then
+ error("you must require copas before require'ing socket.http")
+end
+
+local socket = require "socket"
+local gettime = socket.gettime
+local coxpcall = require "coxpcall"
+
+local WATCH_DOG_TIMEOUT = 120
+local UDP_DATAGRAM_MAX = 8192
+
+-- Redefines LuaSocket functions with coroutine safe versions
+-- (this allows the use of socket.http from within copas)
+local function statusHandler(status, ...)
+ if status then return ... end
+ local err = (...)
+ if type(err) == "table" then
+ return nil, err[1]
+ else
+ error(err)
+ end
+end
+
+function socket.protect(func)
+ return function (...)
+ return statusHandler(coxpcall.pcall(func, ...))
+ end
+end
+
+function socket.newtry(finalizer)
+ return function (...)
+ local status = (...)
+ if not status then
+ coxpcall.pcall(finalizer, select(2, ...))
+ error({ (select(2, ...)) }, 0)
+ end
+ return ...
+ end
+end
+
+-- end of LuaSocket redefinitions
+
+local copas = {}
+
+-- Meta information is public even if beginning with an "_"
+copas._COPYRIGHT = "Copyright (C) 2005-2010 Kepler Project"
+copas._DESCRIPTION = "Coroutine Oriented Portable Asynchronous Services"
+copas._VERSION = "Copas 1.2.1"
+
+-- Close the socket associated with the current connection after the handler finishes
+copas.autoclose = true
+
+-------------------------------------------------------------------------------
+-- Simple set implementation based on LuaSocket's tinyirc.lua example
+-- adds a FIFO queue for each value in the set
+-------------------------------------------------------------------------------
+local function newset()
+ local reverse = {}
+ local set = {}
+ local q = {}
+ setmetatable(set, { __index = {
+ insert = function(set, value)
+ if not reverse[value] then
+ set[#set + 1] = value
+ reverse[value] = #set
+ end
+ end,
+
+ remove = function(set, value)
+ local index = reverse[value]
+ if index then
+ reverse[value] = nil
+ local top = set[#set]
+ set[#set] = nil
+ if top ~= value then
+ reverse[top] = index
+ set[index] = top
+ end
+ end
+ end,
+
+ push = function (set, key, itm)
+ local qKey = q[key]
+ if qKey == nil then
+ q[key] = {itm}
+ else
+ qKey[#qKey + 1] = itm
+ end
+ end,
+
+ pop = function (set, key)
+ local t = q[key]
+ if t ~= nil then
+ local ret = table.remove (t, 1)
+ if t[1] == nil then
+ q[key] = nil
+ end
+ return ret
+ end
+ end
+ }})
+ return set
+end
+
+local fnil = function()end
+local _sleeping = {
+ times = {}, -- list with wake-up times
+ cos = {}, -- list with coroutines, index matches the 'times' list
+ lethargy = {}, -- list of coroutines sleeping without a wakeup time
+
+ insert = fnil,
+ remove = fnil,
+ push = function(self, sleeptime, co)
+ if not co then return end
+ if sleeptime<0 then
+ --sleep until explicit wakeup through copas.wakeup
+ self.lethargy[co] = true
+ return
+ else
+ sleeptime = gettime() + sleeptime
+ end
+ local t, c = self.times, self.cos
+ local i, cou = 1, #t
+ --TODO: do a binary search
+ while i<=cou and t[i]<=sleeptime do i=i+1 end
+ table.insert(t, i, sleeptime)
+ table.insert(c, i, co)
+ end,
+ getnext = function(self) -- returns delay until next sleep expires, or nil if there is none
+ local t = self.times
+ local delay = t[1] and t[1] - gettime() or nil
+
+ return delay and math.max(delay, 0) or nil
+ end,
+ -- find the thread that should wake up to the time
+ pop = function(self, time)
+ local t, c = self.times, self.cos
+ if #t==0 or time<t[1] then return end
+ local co = c[1]
+ table.remove(t, 1)
+ table.remove(c, 1)
+ return co
+ end,
+ wakeup = function(self, co)
+ local let = self.lethargy
+ if let[co] then
+ self:push(0, co)
+ let[co] = nil
+ else
+ let = self.cos
+ for i=1,#let do
+ if let[i]==co then
+ table.remove(let, i)
+ local tm = self.times[i]
+ table.remove(self.times, i)
+ self:push(0, co)
+ return
+ end
+ end
+ end
+ end
+} --_sleeping
+
+local _servers = newset() -- servers being handled
+local _reading_log = {}
+local _writing_log = {}
+
+local _reading = newset() -- sockets currently being read
+local _writing = newset() -- sockets currently being written
+
+-------------------------------------------------------------------------------
+-- Coroutine based socket I/O functions.
+-------------------------------------------------------------------------------
+-- reads a pattern from a client and yields to the reading set on timeouts
+-- UDP: a UDP socket expects a second argument to be a number, so it MUST
+-- be provided as the 'pattern' below defaults to a string. Will throw a
+-- 'bad argument' error if omitted.
+function copas.receive(client, pattern, part)
+ local s, err
+ pattern = pattern or "*l"
+ repeat
+ s, err, part = client:receive(pattern, part)
+ if s or err ~= "timeout" then
+ _reading_log[client] = nil
+ return s, err, part
+ end
+ _reading_log[client] = gettime()
+ coroutine.yield(client, _reading)
+ until false
+end
+
+-- receives data from a client over UDP. Not available for TCP.
+-- (this is a copy of receive() method, adapted for receivefrom() use)
+function copas.receivefrom(client, size)
+ local s, err, port
+ size = size or UDP_DATAGRAM_MAX
+ repeat
+ s, err, port = client:receivefrom(size) -- upon success err holds ip address
+ if s or err ~= "timeout" then
+ _reading_log[client] = nil
+ return s, err, port
+ end
+ _reading_log[client] = gettime()
+ coroutine.yield(client, _reading)
+ until false
+end
+
+-- same as above but with special treatment when reading chunks,
+-- unblocks on any data received.
+function copas.receivePartial(client, pattern, part)
+ local s, err
+ pattern = pattern or "*l"
+ repeat
+ s, err, part = client:receive(pattern, part)
+ if s or ( (type(pattern)=="number") and part~="" and part ~=nil ) or
+ err ~= "timeout" then
+ _reading_log[client] = nil
+ return s, err, part
+ end
+ _reading_log[client] = gettime()
+ coroutine.yield(client, _reading)
+ until false
+end
+
+-- sends data to a client. The operation is buffered and
+-- yields to the writing set on timeouts
+-- Note: from and to parameters will be ignored by/for UDP sockets
+function copas.send(client, data, from, to)
+ local s, err,sent
+ from = from or 1
+ local lastIndex = from - 1
+
+ repeat
+ s, err, lastIndex = client:send(data, lastIndex + 1, to)
+ -- adds extra corrotine swap
+ -- garantees that high throuput dont take other threads to starvation
+ if (math.random(100) > 90) then
+ _writing_log[client] = gettime()
+ coroutine.yield(client, _writing)
+ end
+ if s or err ~= "timeout" then
+ _writing_log[client] = nil
+ return s, err,lastIndex
+ end
+ _writing_log[client] = gettime()
+ coroutine.yield(client, _writing)
+ until false
+end
+
+-- sends data to a client over UDP. Not available for TCP.
+-- (this is a copy of send() method, adapted for sendto() use)
+function copas.sendto(client, data, ip, port)
+ local s, err,sent
+
+ repeat
+ s, err = client:sendto(data, ip, port)
+ -- adds extra corrotine swap
+ -- garantees that high throuput dont take other threads to starvation
+ if (math.random(100) > 90) then
+ _writing_log[client] = gettime()
+ coroutine.yield(client, _writing)
+ end
+ if s or err ~= "timeout" then
+ _writing_log[client] = nil
+ return s, err
+ end
+ _writing_log[client] = gettime()
+ coroutine.yield(client, _writing)
+ until false
+end
+
+-- waits until connection is completed
+function copas.connect(skt, host, port)
+ skt:settimeout(0)
+ local ret, err
+ repeat
+ ret, err = skt:connect (host, port)
+ if ret or err ~= "timeout" then
+ _writing_log[skt] = nil
+ return ret, err
+ end
+ _writing_log[skt] = gettime()
+ coroutine.yield(skt, _writing)
+ until false
+ return ret, err
+end
+
+-- flushes a client write buffer (deprecated)
+function copas.flush(client)
+end
+
+-- wraps a TCP socket to use Copas methods (send, receive, flush and settimeout)
+local _skt_mt = {__index = {
+ send = function (self, data, from, to)
+ return copas.send (self.socket, data, from, to)
+ end,
+
+ receive = function (self, pattern, prefix)
+ if (self.timeout==0) then
+ return copas.receivePartial(self.socket, pattern, prefix)
+ end
+ return copas.receive(self.socket, pattern, prefix)
+ end,
+
+ flush = function (self)
+ return copas.flush(self.socket)
+ end,
+
+ settimeout = function (self,time)
+ self.timeout=time
+ return true
+ end,
+
+ skip = function(self, ...) return self.socket:skip(...) end,
+
+ close = function(self, ...) return self.socket:close(...) end,
+ }}
+
+-- wraps a UDP socket, copy of TCP one adapted for UDP.
+-- Mainly adds sendto() and receivefrom()
+local _skt_mt_udp = {__index = {
+ send = function (self, data)
+ return copas.send (self.socket, data)
+ end,
+
+ sendto = function (self, data, ip, port)
+ return copas.sendto (self.socket, data, ip, port)
+ end,
+
+ receive = function (self, size)
+ return copas.receive (self.socket, (size or UDP_DATAGRAM_MAX))
+ end,
+
+ receivefrom = function (self, size)
+ return copas.receivefrom (self.socket, (size or UDP_DATAGRAM_MAX))
+ end,
+
+ flush = function (self)
+ return copas.flush (self.socket)
+ end,
+
+ settimeout = function (self,time)
+ self.timeout=time
+ return true
+ end,
+ }}
+
+function copas.wrap (skt)
+ if string.sub(tostring(skt),1,3) == "udp" then
+ return setmetatable ({socket = skt}, _skt_mt_udp)
+ else
+ return setmetatable ({socket = skt}, _skt_mt)
+ end
+end
+
+--------------------------------------------------
+-- Error handling
+--------------------------------------------------
+
+local _errhandlers = {} -- error handler per coroutine
+
+function copas.setErrorHandler (err)
+ local co = coroutine.running()
+ if co then
+ _errhandlers [co] = err
+ end
+end
+
+local function _deferror (msg, co, skt)
+ print (msg, co, skt)
+end
+
+-------------------------------------------------------------------------------
+-- Thread handling
+-------------------------------------------------------------------------------
+
+local function _doTick (co, skt, ...)
+ if not co then return end
+
+ local ok, res, new_q = coroutine.resume(co, skt, ...)
+
+ if ok and res and new_q then
+ new_q:insert (res)
+ new_q:push (res, co)
+ else
+ if not ok then coxpcall.pcall (_errhandlers [co] or _deferror, res, co, skt) end
+ if skt and copas.autoclose then skt:close() end
+ _errhandlers [co] = nil
+ end
+end
+
+-- accepts a connection on socket input
+local function _accept(input, handler)
+ local client = input:accept()
+ if client then
+ client:settimeout(0)
+ local co = coroutine.create(handler)
+ _doTick (co, client)
+ --_reading:insert(client)
+ end
+ return client
+end
+
+-- handle threads on a queue
+local function _tickRead (skt)
+ _doTick (_reading:pop (skt), skt)
+end
+
+local function _tickWrite (skt)
+ _doTick (_writing:pop (skt), skt)
+end
+
+-------------------------------------------------------------------------------
+-- Adds a server/handler pair to Copas dispatcher
+-------------------------------------------------------------------------------
+local function addTCPserver(server, handler, timeout)
+ server:settimeout(timeout or 0.1)
+ _servers[server] = handler
+ _reading:insert(server)
+end
+
+local function addUDPserver(server, handler, timeout)
+ server:settimeout(timeout or 0)
+ local co = coroutine.create(handler)
+ _reading:insert(server)
+ _doTick (co, server)
+end
+
+function copas.addserver(server, handler, timeout)
+ if string.sub(tostring(server),1,3) == "udp" then
+ addUDPserver(server, handler, timeout)
+ else
+ addTCPserver(server, handler, timeout)
+ end
+end
+
+function copas.removeserver(server)
+ _servers[server] = nil
+ _reading:remove(server)
+ return server:close()
+end
+
+-------------------------------------------------------------------------------
+-- Adds an new courotine thread to Copas dispatcher
+-------------------------------------------------------------------------------
+function copas.addthread(thread, ...)
+ if type(thread) ~= "thread" then
+ thread = coroutine.create(thread)
+ end
+ _doTick (thread, nil, ...)
+ return thread
+end
+
+-------------------------------------------------------------------------------
+-- tasks registering
+-------------------------------------------------------------------------------
+
+local _tasks = {}
+
+local function addtaskRead (tsk)
+ -- lets tasks call the default _tick()
+ tsk.def_tick = _tickRead
+
+ _tasks [tsk] = true
+end
+
+local function addtaskWrite (tsk)
+ -- lets tasks call the default _tick()
+ tsk.def_tick = _tickWrite
+
+ _tasks [tsk] = true
+end
+
+local function tasks ()
+ return next, _tasks
+end
+
+-------------------------------------------------------------------------------
+-- main tasks: manage readable and writable socket sets
+-------------------------------------------------------------------------------
+-- a task to check ready to read events
+local _readable_t = {
+ events = function(self)
+ local i = 0
+ return function ()
+ i = i + 1
+ return self._evs [i]
+ end
+ end,
+
+ tick = function (self, input)
+ local handler = _servers[input]
+ if handler then
+ input = _accept(input, handler)
+ else
+ _reading:remove (input)
+ self.def_tick (input)
+ end
+ end
+}
+
+addtaskRead (_readable_t)
+
+
+-- a task to check ready to write events
+local _writable_t = {
+ events = function (self)
+ local i = 0
+ return function ()
+ i = i + 1
+ return self._evs [i]
+ end
+ end,
+
+ tick = function (self, output)
+ _writing:remove (output)
+ self.def_tick (output)
+ end
+}
+
+addtaskWrite (_writable_t)
+--
+--sleeping threads task
+local _sleeping_t = {
+ tick = function (self, time, ...)
+ _doTick(_sleeping:pop(time), ...)
+ end
+}
+
+-- yields the current coroutine and wakes it after 'sleeptime' seconds.
+-- If sleeptime<0 then it sleeps until explicitly woken up using 'wakeup'
+function copas.sleep(sleeptime)
+ coroutine.yield((sleeptime or 0), _sleeping)
+end
+
+-- Wakes up a sleeping coroutine 'co'.
+function copas.wakeup(co)
+ _sleeping:wakeup(co)
+end
+
+local last_cleansing = 0
+
+-------------------------------------------------------------------------------
+-- Checks for reads and writes on sockets
+-------------------------------------------------------------------------------
+local function _select (timeout)
+ local err
+ local now = gettime()
+ local duration = function(t2, t1) return t2-t1 end
+
+ _readable_t._evs, _writable_t._evs, err = socket.select(_reading, _writing, timeout)
+ local r_evs, w_evs = _readable_t._evs, _writable_t._evs
+
+ if duration(now, last_cleansing) > WATCH_DOG_TIMEOUT then
+ last_cleansing = now
+ for k,v in pairs(_reading_log) do
+ if not r_evs[k] and duration(now, v) > WATCH_DOG_TIMEOUT then
+ _reading_log[k] = nil
+ r_evs[#r_evs + 1] = k
+ r_evs[k] = #r_evs
+ end
+ end
+
+ for k,v in pairs(_writing_log) do
+ if not w_evs[k] and duration(now, v) > WATCH_DOG_TIMEOUT then
+ _writing_log[k] = nil
+ w_evs[#w_evs + 1] = k
+ w_evs[k] = #w_evs
+ end
+ end
+ end
+
+ if err == "timeout" and #r_evs + #w_evs > 0 then
+ return nil
+ else
+ return err
+ end
+end
+
+
+-------------------------------------------------------------------------------
+-- Dispatcher loop step.
+-- Listen to client requests and handles them
+-- Returns false if no data was handled (timeout), or true if there was data
+-- handled (or nil + error message)
+-------------------------------------------------------------------------------
+function copas.step(timeout)
+ _sleeping_t:tick(gettime())
+
+ -- Need to wake up the select call it time for the next sleeping event
+ local nextwait = _sleeping:getnext()
+ if nextwait then
+ timeout = timeout and math.min(nextwait, timeout) or nextwait
+ end
+
+ local err = _select (timeout)
+ if err == "timeout" then return false end
+
+ if err then
+ error(err)
+ end
+
+ for tsk in tasks() do
+ for ev in tsk:events() do
+ tsk:tick (ev)
+ end
+ end
+ return true
+end
+
+-------------------------------------------------------------------------------
+-- Dispatcher endless loop.
+-- Listen to client requests and handles them forever
+-------------------------------------------------------------------------------
+function copas.loop(timeout)
+ while true do
+ copas.step(timeout)
+ end
+end
+
+return copas
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/coxpcall/coxpcall.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/coxpcall/coxpcall.lua
new file mode 100644
index 0000000..c34bb72
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/coxpcall/coxpcall.lua
@@ -0,0 +1,68 @@
+-------------------------------------------------------------------------------
+-- Coroutine safe xpcall and pcall versions
+--
+-- Encapsulates the protected calls with a coroutine based loop, so errors can
+-- be dealed without the usual Lua 5.x pcall/xpcall issues with coroutines
+-- yielding inside the call to pcall or xpcall.
+--
+-- Authors: Roberto Ierusalimschy and Andre Carregal
+-- Contributors: Thomas Harning Jr., Ignacio Burgueo, Fabio Mascarenhas
+--
+-- Copyright 2005 - Kepler Project (www.keplerproject.org)
+--
+-- $Id: coxpcall.lua,v 1.13 2008/05/19 19:20:02 mascarenhas Exp $
+-------------------------------------------------------------------------------
+
+-- Lua 5.2 makes this module a no-op
+if _VERSION == "Lua 5.2" then
+ copcall = pcall
+ coxpcall = xpcall
+ return { pcall = pcall, xpcall = xpcall }
+end
+
+-------------------------------------------------------------------------------
+-- Implements xpcall with coroutines
+-------------------------------------------------------------------------------
+local performResume, handleReturnValue
+local oldpcall, oldxpcall = pcall, xpcall
+local pack = table.pack or function(...) return {n = select("#", ...), ...} end
+local unpack = table.unpack or unpack
+
+function handleReturnValue(err, co, status, ...)
+ if not status then
+ return false, err(debug.traceback(co, (...)), ...)
+ end
+ if coroutine.status(co) == 'suspended' then
+ return performResume(err, co, coroutine.yield(...))
+ else
+ return true, ...
+ end
+end
+
+function performResume(err, co, ...)
+ return handleReturnValue(err, co, coroutine.resume(co, ...))
+end
+
+function coxpcall(f, err, ...)
+ local res, co = oldpcall(coroutine.create, f)
+ if not res then
+ local params = pack(...)
+ local newf = function() return f(unpack(params, 1, params.n)) end
+ co = coroutine.create(newf)
+ end
+ return performResume(err, co, ...)
+end
+
+-------------------------------------------------------------------------------
+-- Implements pcall with coroutines
+-------------------------------------------------------------------------------
+
+local function id(trace, ...)
+ return ...
+end
+
+function copcall(f, ...)
+ return coxpcall(f, id, ...)
+end
+
+return { pcall = copcall, xpcall = coxpcall } \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/config.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/config.lua
new file mode 100644
index 0000000..3139750
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/config.lua
@@ -0,0 +1,112 @@
+-- Luadist configuration
+
+module ("dist.config", package.seeall)
+
+local sys = require "dist.sys"
+local utils = require "dist.utils"
+local win = (os.getenv('WINDIR') or (os.getenv('OS') or ''):match('[Ww]indows'))
+ and not (os.getenv('OSTYPE') or ''):match('cygwin') -- exclude cygwin
+
+-- System information ------------------------------------------------
+version = "0.2.7" -- Current LuaDist version
+-- set initial architecture as it's important for path separators
+arch = win and "Windows" or "Linux" -- Host architecture
+type = "x86" -- Host type
+
+-- Directories -------------------------------------------------------
+root_dir = os.getenv("DIST_ROOT") or utils.get_luadist_location() or sys.path_separator()
+temp_dir = "tmp"
+cache_dir = sys.make_path(temp_dir, "cache")
+distinfos_dir = sys.make_path("share", "luadist-git", "dists")
+test_dir = sys.make_path("share", "luadist-git", "test")
+
+-- Files -------------------------------------------------------------
+manifest_file = sys.make_path(cache_dir, ".gitmodules")
+dep_cache_file = sys.make_path(cache_dir, ".depcache")
+log_file = sys.make_path(temp_dir, "luadist.log")
+cache_file = ""
+
+-- Repositories ------------------------------------------------------
+repos = {
+ "git://github.com/LuaDist/Repository.git",
+}
+
+upload_url = "git@github.com:LuaDist" -- must not contain trailing '/'
+
+-- Settings ----------------------------------------------------------
+debug = false -- Use debug mode.
+verbose = false -- Print verbose output.
+simulate = false -- Only simulate installation of packages.
+binary = true -- Use binary version of modules.
+source = true -- Use source version of modules.
+test = false -- Run CTest before install.
+
+cache = true -- Use cache.
+cache_timeout = 3 * 60 * 60 -- Cache timeout in seconds.
+
+dep_cache = true -- Use cache for dependency information (tree functionality).
+
+-- Components (of modules) that will be installed.
+components = {
+ "Runtime", "Library", "Header", "Data", "Documentation", "Example", "Test", "Other", "Unspecified"
+}
+
+-- Available log levels are: DEBUG, INFO, WARN, ERROR, FATAL (see dist.logger for more information).
+print_log_level = "WARN" -- Minimum level for log messages to be printed (nil to disable).
+write_log_level = "INFO" -- Minimum level for log messages to be logged (nil to disable).
+
+
+-- CMake variables ---------------------------------------------------
+variables = {
+ --- Install defaults
+ INSTALL_BIN = "bin",
+ INSTALL_LIB = "lib",
+ INSTALL_INC = "include",
+ INSTALL_ETC = "etc",
+ INSTALL_LMOD = "lib/lua",
+ INSTALL_CMOD = "lib/lua",
+
+ --- LuaDist specific variables
+ DIST_VERSION = version,
+ DIST_ARCH = arch,
+ DIST_TYPE = type,
+
+ -- CMake specific setup
+ CMAKE_GENERATOR = win and "MinGW Makefiles" or "Unix Makefiles",
+ CMAKE_BUILD_TYPE = "MinSizeRel",
+
+ -- RPath functionality
+ CMAKE_SKIP_BUILD_RPATH = "FALSE",
+ CMAKE_BUILD_WITH_INSTALL_RPATH = "FALSE",
+ CMAKE_INSTALL_RPATH = "$ORIGIN/../lib",
+ CMAKE_INSTALL_RPATH_USE_LINK_PATH = "TRUE",
+ CMAKE_INSTALL_NAME_DIR = "@executable_path/../lib",
+
+ -- OSX specific
+ CMAKE_OSX_ARCHITECTURES = "",
+}
+
+-- Building ----------------------------------------------------------
+cmake = "cmake"
+ctest = "ctest"
+
+cache_command = cmake .. " -C cache.cmake"
+build_command = cmake .. " --build . --clean-first"
+
+install_component_command = " -DCOMPONENT=#COMPONENT# -P cmake_install.cmake"
+
+test_command = ctest .. " -V ."
+
+strip_option = " -DCMAKE_INSTALL_DO_STRIP=true"
+cache_debug_options = "-DCMAKE_VERBOSE_MAKEFILE=true -DCMAKE_BUILD_TYPE=Debug"
+build_debug_options = ""
+
+-- Add -j option to make in case of unix makefiles to speed up builds
+if (variables.CMAKE_GENERATOR == "Unix Makefiles") then
+ build_command = build_command .. " -- -j6"
+end
+
+-- Add -j option to make in case of MinGW makefiles to speed up builds
+if (variables.CMAKE_GENERATOR == "MinGW Makefiles") then
+ build_command = "set SHELL=cmd.exe && " .. build_command .. " -- -j"
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/constraints.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/constraints.lua
new file mode 100644
index 0000000..1b5cfec
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/constraints.lua
@@ -0,0 +1,271 @@
+-- Note: the code of this module is borrowed from the original LuaDist project
+
+
+
+--- LuaDist version constraints functions
+-- Peter Drahoš, LuaDist Project, 2010
+-- Original Code borrowed from LuaRocks Project
+
+--- Version constraints handling functions.
+-- Dependencies are represented in LuaDist through strings with
+-- a dist name followed by a comma-separated list of constraints.
+-- Each constraint consists of an operator and a version number.
+-- In this string format, version numbers are represented as
+-- naturally as possible, like they are used by upstream projects
+-- (e.g. "2.0beta3"). Internally, LuaDist converts them to a purely
+-- numeric representation, allowing comparison following some
+-- "common sense" heuristics. The precise specification of the
+-- comparison criteria is the source code of this module, but the
+-- test/test_deps.lua file included with LuaDist provides some
+-- insights on what these criteria are.
+
+module ("dist.constraints", package.seeall)
+
+
+local operators = {
+ ["=="] = "==",
+ ["~="] = "~=",
+ [">"] = ">",
+ ["<"] = "<",
+ [">="] = ">=",
+ ["<="] = "<=",
+ ["~>"] = "~>",
+ -- plus some convenience translations
+ [""] = "==",
+ ["-"] = "==",
+ ["="] = "==",
+ ["!="] = "~="
+}
+
+local deltas = {
+ scm = -100,
+ rc = -1000,
+ pre = -10000,
+ beta = -100000,
+ alpha = -1000000,
+ work = -10000000,
+}
+
+local version_mt = {
+ --- Equality comparison for versions.
+ -- All version numbers must be equal.
+ -- If both versions have revision numbers, they must be equal;
+ -- otherwise the revision number is ignored.
+ -- @param v1 table: version table to compare.
+ -- @param v2 table: version table to compare.
+ -- @return boolean: true if they are considered equivalent.
+ __eq = function(v1, v2)
+ if #v1 ~= #v2 then
+ return false
+ end
+ for i = 1, #v1 do
+ if v1[i] ~= v2[i] then
+ return false
+ end
+ end
+ if v1.revision and v2.revision then
+ return (v1.revision == v2.revision)
+ end
+ return true
+ end,
+ --- Size comparison for versions.
+ -- All version numbers are compared.
+ -- If both versions have revision numbers, they are compared;
+ -- otherwise the revision number is ignored.
+ -- @param v1 table: version table to compare.
+ -- @param v2 table: version table to compare.
+ -- @return boolean: true if v1 is considered lower than v2.
+ __lt = function(v1, v2)
+ for i = 1, math.max(#v1, #v2) do
+ local v1i, v2i = v1[i] or 0, v2[i] or 0
+ if v1i ~= v2i then
+ return (v1i < v2i)
+ end
+ end
+ if v1.revision and v2.revision then
+ return (v1.revision < v2.revision)
+ end
+ return false
+ end
+}
+
+local version_cache = {}
+setmetatable(version_cache, {
+ __mode = "kv"
+})
+
+--- Parse a version string, converting to table format.
+-- A version table contains all components of the version string
+-- converted to numeric format, stored in the array part of the table.
+-- If the version contains a revision, it is stored numerically
+-- in the 'revision' field. The original string representation of
+-- the string is preserved in the 'string' field.
+-- Returned version tables use a metatable
+-- allowing later comparison through relational operators.
+-- @param vstring string: A version number in string format.
+-- @return table or nil: A version table or nil
+-- if the input string contains invalid characters.
+function parseVersion(vstring)
+ if not vstring then return nil end
+ assert(type(vstring) == "string")
+
+ local cached = version_cache[vstring]
+ if cached then
+ return cached
+ end
+
+ local version = {}
+ local i = 1
+
+ local function add_token(number)
+ version[i] = version[i] and version[i] + number/100000 or number
+ i = i + 1
+ end
+
+ -- trim leading and trailing spaces
+ vstring = vstring:match("^%s*(.*)%s*$")
+ version.string = vstring
+ -- store revision separately if any
+ local main, revision = vstring:match("(.*)%-(%d+)$")
+ if revision then
+ vstring = main
+ version.revision = tonumber(revision)
+ end
+ while #vstring > 0 do
+ -- extract a number
+ local token, rest = vstring:match("^(%d+)[%.%-%_]*(.*)")
+ if token then
+ add_token(tonumber(token))
+ else
+ -- extract a word
+ token, rest = vstring:match("^(%a+)[%.%-%_]*(.*)")
+ if not token then
+ return nil
+ end
+ local last = #version
+ version[i] = deltas[token] or (token:byte() / 1000)
+ end
+ vstring = rest
+ end
+ setmetatable(version, version_mt)
+ version_cache[vstring] = version
+ return version
+end
+
+--- Utility function to compare version numbers given as strings.
+-- @param a string: one version.
+-- @param b string: another version.
+-- @return boolean: True if a > b.
+function compareVersions(a, b)
+ return parseVersion(a) > parseVersion(b)
+end
+
+--- Consumes a constraint from a string, converting it to table format.
+-- For example, a string ">= 1.0, > 2.0" is converted to a table in the
+-- format {op = ">=", version={1,0}} and the rest, "> 2.0", is returned
+-- back to the caller.
+-- @param input string: A list of constraints in string format.
+-- @return (table, string) or nil: A table representing the same
+-- constraints and the string with the unused input, or nil if the
+-- input string is invalid.
+local function parseConstraint(input)
+ assert(type(input) == "string")
+
+ local op, version, rest = input:match("^([<>=~!]*)%s*([%w%.%_%-]+)[%s,]*(.*)")
+ op = operators[op]
+ version = parseVersion(version)
+ if not op or not version then return nil end
+ return { op = op, version = version }, rest
+end
+
+--- Convert a list of constraints from string to table format.
+-- For example, a string ">= 1.0, < 2.0" is converted to a table in the format
+-- {{op = ">=", version={1,0}}, {op = "<", version={2,0}}}.
+-- Version tables use a metatable allowing later comparison through
+-- relational operators.
+-- @param input string: A list of constraints in string format.
+-- @return table or nil: A table representing the same constraints,
+-- or nil if the input string is invalid.
+function parseConstraints(input)
+ assert(type(input) == "string")
+
+ local constraints, constraint = {}, nil
+ while #input > 0 do
+ constraint, input = parseConstraint(input)
+ if constraint then
+ table.insert(constraints, constraint)
+ else
+ return nil
+ end
+ end
+ return constraints
+end
+
+--- A more lenient check for equivalence between versions.
+-- This returns true if the requested components of a version
+-- match and ignore the ones that were not given. For example,
+-- when requesting "2", then "2", "2.1", "2.3.5-9"... all match.
+-- When requesting "2.1", then "2.1", "2.1.3" match, but "2.2"
+-- doesn't.
+-- @param version string or table: Version to be tested; may be
+-- in string format or already parsed into a table.
+-- @param requested string or table: Version requested; may be
+-- in string format or already parsed into a table.
+-- @return boolean: True if the tested version matches the requested
+-- version, false otherwise.
+local function partialMatch(version, requested)
+ assert(type(version) == "string" or type(version) == "table")
+ assert(type(requested) == "string" or type(version) == "table")
+
+ if type(version) ~= "table" then version = parseVersion(version) end
+ if type(requested) ~= "table" then requested = parseVersion(requested) end
+ if not version or not requested then return false end
+
+ for i = 1, #requested do
+ if requested[i] ~= version[i] then return false end
+ end
+ if requested.revision then
+ return requested.revision == version.revision
+ end
+ return true
+end
+
+--- Check if a version satisfies a set of constraints.
+-- @param version table: A version in table format
+-- @param constraints table: An array of constraints in table format.
+-- @return boolean: True if version satisfies all constraints,
+-- false otherwise.
+function matchConstraints(version, constraints)
+ assert(type(version) == "table")
+ assert(type(constraints) == "table")
+ local ok = true
+ setmetatable(version, version_mt)
+ for _, constr in pairs(constraints) do
+ local constr_version = constr.version
+ setmetatable(constr.version, version_mt)
+ if constr.op == "==" then ok = version == constr_version
+ elseif constr.op == "~=" then ok = version ~= constr_version
+ elseif constr.op == ">" then ok = version > constr_version
+ elseif constr.op == "<" then ok = version < constr_version
+ elseif constr.op == ">=" then ok = version >= constr_version
+ elseif constr.op == "<=" then ok = version <= constr_version
+ elseif constr.op == "~>" then ok = partialMatch(version, constr_version)
+ end
+ if not ok then break end
+ end
+ return ok
+end
+
+--- Check if a version string is satisfied by a constraint string.
+-- @param version string: A version in string format
+-- @param constraints string: Constraints in string format.
+-- @return boolean: True if version satisfies all constraints,
+-- false otherwise.
+function constraint_satisfied(version, constraints)
+ local const = parseConstraints(constraints)
+ local ver = parseVersion(version)
+ if const and ver then
+ return matchConstraints(ver, const)
+ end
+ return nil, "Error parsing versions."
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/depends.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/depends.lua
new file mode 100644
index 0000000..2a6b7f0
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/depends.lua
@@ -0,0 +1,770 @@
+-- Utility functions for dependencies
+
+module ("dist.depends", package.seeall)
+
+local cfg = require "dist.config"
+local mf = require "dist.manifest"
+local sys = require "dist.sys"
+local const = require "dist.constraints"
+local utils = require "dist.utils"
+local package = require "dist.package"
+
+-- Return all packages with specified names from manifest.
+-- Names can also contain version constraint (e.g. 'copas>=1.2.3', 'saci-1.0' etc.).
+function find_packages(package_names, manifest)
+ if type(package_names) == "string" then package_names = {package_names} end
+ manifest = manifest or mf.get_manifest()
+ assert(type(package_names) == "table", "depends.find_packages: Argument 'package_names' is not a table or string.")
+ assert(type(manifest) == "table", "depends.find_packages: Argument 'manifest' is not a table.")
+
+ local packages_found = {}
+ -- find matching packages in manifest
+ for _, pkg_to_find in pairs(package_names) do
+ local pkg_name, pkg_constraint = split_name_constraint(pkg_to_find)
+ pkg_name = utils.escape_magic(pkg_name):gsub("%%%*",".*")
+ for _, repo_pkg in pairs(manifest) do
+ if string.match(repo_pkg.name, "^" .. pkg_name .. "$") and (not pkg_constraint or satisfies_constraint(repo_pkg.version, pkg_constraint)) then
+ table.insert(packages_found, repo_pkg)
+ end
+ end
+ end
+ return packages_found
+end
+
+-- Return manifest consisting of packages installed in specified deploy_dir directory
+function get_installed(deploy_dir)
+ deploy_dir = deploy_dir or cfg.root_dir
+ assert(type(deploy_dir) == "string", "depends.get_installed: Argument 'deploy_dir' is not a string.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local distinfos_path = sys.make_path(deploy_dir, cfg.distinfos_dir)
+ local manifest = {}
+
+ if not sys.is_dir(distinfos_path) then return {} end
+
+ -- from all directories of packages installed in deploy_dir
+ for dir in sys.get_directory(distinfos_path) do
+
+ if dir ~= "." and dir ~= ".." and sys.is_dir(sys.make_path(distinfos_path, dir)) then
+ local pkg_dist_dir = sys.make_path(distinfos_path, dir)
+
+ -- load the dist.info file
+ for file in sys.get_directory(pkg_dist_dir) do
+ local pkg_dist_file = sys.make_path(pkg_dist_dir, file)
+
+ if sys.is_file(pkg_dist_file) then
+ table.insert(manifest, mf.load_distinfo(pkg_dist_file))
+ end
+ end
+
+ end
+
+ end
+ return manifest
+end
+
+-- If 'pkg.selected' == true then returns 'selected' else 'installed'.
+-- Used in error messages.
+local function selected_or_installed(pkg)
+ assert(type(pkg) == "table", "depends.selected_or_installed: Argument 'pkg' is not a table.")
+ if pkg.selected == true then
+ return "selected"
+ else
+ return "installed"
+ end
+end
+
+-- Return whether the 'package_name' is installed according to the the manifest 'installed_pkgs'
+-- If optional 'version_wanted' constraint is specified, then installed packages must
+-- also satisfy specified version constraint.
+-- If package is installed but doesn't satisfy version constraint, error message
+-- is returned as the second value.
+function is_installed(package_name, installed_pkgs, version_wanted)
+ assert(type(package_name) == "string", "depends.is_installed: Argument 'package_name' is not a string.")
+ assert(type(installed_pkgs) == "table", "depends.is_installed: Argument 'installed_pkgs' is not a table.")
+ assert(type(version_wanted) == "string" or type(version_wanted) == "nil", "depends.is_installed: Argument 'version_wanted' is not a string or nil.")
+
+ local pkg_is_installed, err = false, nil
+
+ for _, installed_pkg in pairs(installed_pkgs) do
+
+ -- check if package_name is in installed
+ if package_name == installed_pkg.name then
+
+ -- check if package is installed in satisfying version
+ if not version_wanted or satisfies_constraint(installed_pkg.version, version_wanted) then
+ pkg_is_installed = true
+ break
+ else
+ err = "Package '" .. package_name .. (version_wanted and " " .. version_wanted or "") .. "' needed, but " .. selected_or_installed(installed_pkg) .. " at version '" .. installed_pkg.version .. "'."
+ break
+ end
+ end
+
+ end
+ return pkg_is_installed, err
+end
+
+-- Check whether the package 'pkg' conflicts with 'installed_pkg' and return
+-- false or error message.
+local function packages_conflicts(pkg, installed_pkg)
+ assert(type(pkg) == "table", "depends.packages_conflicts: Argument 'pkg' is not a table.")
+ assert(type(installed_pkg) == "table", "depends.packages_conflicts: Argument 'installed_pkg' is not a table.")
+
+ -- check if pkg doesn't provide an already installed_pkg
+ if pkg.provides then
+ -- for all of pkg's provides
+ for _, provided_pkg in pairs(get_provides(pkg)) do
+ if provided_pkg.name == installed_pkg.name then
+ return "Package '" .. pkg_full_name(pkg.name, pkg.version, pkg.was_scm_version) .. "' provides '" .. pkg_full_name(provided_pkg.name, provided_pkg.version) .. "' but package '" .. pkg_full_name(installed_pkg.name, installed_pkg.version) .. "' is already " .. selected_or_installed(installed_pkg) .. "."
+ end
+ end
+ end
+
+ -- check for conflicts of package to install with installed package
+ if pkg.conflicts then
+ for _, conflict in pairs (pkg.conflicts) do
+ if conflict == installed_pkg.name then
+ return "Package '" .. pkg_full_name(pkg.name, pkg.version, pkg.was_scm_version) .. "' conflicts with already " .. selected_or_installed(installed_pkg) .. " package '" .. pkg_full_name(installed_pkg.name, installed_pkg.version) .. "'."
+ end
+ end
+ end
+
+ -- check for conflicts of installed package with package to install
+ if installed_pkg.conflicts then
+
+ -- direct conflicts with 'pkg'
+ for _, conflict in pairs (installed_pkg.conflicts) do
+ if conflict == pkg.name then
+ return "Already " .. selected_or_installed(installed_pkg) .. " package '" .. pkg_full_name(installed_pkg.name, installed_pkg.version) .. "' conflicts with package '" .. pkg_full_name(pkg.name, pkg.version, pkg.was_scm_version) .. "'."
+ end
+ end
+
+ -- conflicts with 'provides' of 'pkg' (packages provided by package to install)
+ if pkg.provides then
+ for _, conflict in pairs (installed_pkg.conflicts) do
+ -- for all of pkg's provides
+ for _, provided_pkg in pairs(get_provides(pkg)) do
+ if conflict == provided_pkg.name then
+ return "Already '" .. selected_or_installed(installed_pkg) .. " package '" .. pkg_full_name(installed_pkg.name, installed_pkg.version) .. "' conflicts with package '" .. pkg_full_name(provided_pkg.name, provided_pkg.version) .. "' provided by '" .. pkg_full_name(pkg.name, pkg.version, pkg.was_scm_version) .. "'."
+ end
+ end
+ end
+ end
+ end
+
+ -- no conflicts found
+ return false
+end
+
+-- Return table of package dependencies 'depends' with OS specific dependencies extracted.
+--
+-- OS specific dependencies are stored in a subtable with 'arch' as a key.
+-- E.g. this table containing OS specific dependencies:
+-- depends = {
+-- "lua~>5.1",
+-- "luadist-git>=0.1",
+-- Linux = {
+-- "iup>=3.6",
+-- "wxlua>=2.8.10.0",
+-- },
+-- Windows = {
+-- "luagd>=2.0.33r2",
+-- "luacom>=1.4.1",
+-- },
+-- }
+--
+-- ...will be on the 'Linux' architecture (determined by cfg.arch) converted into:
+-- depends = {
+-- "lua~>5.1",
+-- "luadist-git>=0.1",
+-- "iup>=3.6",
+-- "wxlua>=2.8.10.0",
+-- }
+function extract_os_specific_depends(depends)
+ assert(type(depends) == "table", "depends.extract_os_specific_depends: Argument 'depends' is not a table.")
+ local extracted = {}
+ for k, depend in pairs(depends) do
+ -- if 'depend' is a table, then it must be a table of OS specific
+ -- dependencies, so extract it if it's for this architecture
+ if type(depend) == "table" then
+ if k == cfg.arch then
+ for _, os_specific_depend in pairs(depend) do
+ table.insert(extracted, os_specific_depend)
+ end
+ end
+ else
+ table.insert(extracted, depend)
+ end
+ end
+ return extracted
+end
+
+-- Return all packages needed in order to install package 'pkg'
+-- and with specified 'installed' packages in the system using 'manifest'.
+-- 'pkg' can also contain version constraint (e.g. 'copas>=1.2.3', 'saci-1.0' etc.).
+--
+-- This function also downloads packages to get information about their dependencies.
+-- Directory where the package was downloaded is stored in 'download_dir' attribute
+-- of that package in the table of packages returned by this function.
+--
+-- Optional argument 'dependency_manifest' is a table of dependencies examined
+-- from previous installations etc. It can be used to speed-up the dependency
+-- resolving procedure for example.
+--
+-- When optional 'force_no_download' parameter is set to true, then information
+-- about packages won't be downloaded during dependency resolving, assuming that
+-- entries in the provided manifest are already complete.
+--
+-- When optional 'suppress_printing' parameter is set to true, then messages
+-- for the user won't be printed during dependency resolving.
+--
+-- Optional argument 'deploy_dir' is used just as a temporary place to place
+-- the downloaded packages into.
+--
+-- 'dependency_parents' is table of all packages encountered so far when resolving dependencies
+-- and is used to detect and deal with circular dependencies. Leave it 'nil'
+-- and it will do its job just fine :-).
+--
+-- 'tmp_installed' is internal table used in recursion and should be left 'nil' when
+-- calling this function from other context. It is used for passing the changes
+-- in installed packages between the recursive calls of this function.
+--
+-- TODO: refactor this spaghetti code!
+local function get_packages_to_install(pkg, installed, manifest, dependency_manifest, force_no_download, suppress_printing, deploy_dir, dependency_parents, tmp_installed)
+ manifest = manifest or mf.get_manifest()
+ dependency_manifest = dependency_manifest or {}
+ force_no_download = force_no_download or false
+ suppress_printing = suppress_printing or false
+ deploy_dir = deploy_dir or cfg.root_dir
+ dependency_parents = dependency_parents or {}
+
+ -- set helper table 'tmp_installed'
+ tmp_installed = tmp_installed or utils.deepcopy(installed)
+
+ assert(type(pkg) == "string", "depends.get_packages_to_install: Argument 'pkg' is not a string.")
+ assert(type(installed) == "table", "depends.get_packages_to_install: Argument 'installed' is not a table.")
+ assert(type(manifest) == "table", "depends.get_packages_to_install: Argument 'manifest' is not a table.")
+ assert(type(dependency_manifest) == "table", "depends.get_packages_to_install: Argument 'dependency_manifest' is not a table.")
+ assert(type(force_no_download) == "boolean", "depends.get_packages_to_install: Argument 'force_no_download' is not a boolean.")
+ assert(type(suppress_printing) == "boolean", "depends.get_packages_to_install: Argument 'suppress_printing' is not a boolean.")
+ assert(type(deploy_dir) == "string", "depends.get_packages_to_install: Argument 'deploy_dir' is not a string.")
+ assert(type(dependency_parents) == "table", "depends.get_packages_to_install: Argument 'dependency_parents' is not a table.")
+ assert(type(tmp_installed) == "table", "depends.get_packages_to_install: Argument 'tmp_installed' is not a table.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ --[[ for future debugging:
+ print('resolving: '.. pkg)
+ print(' installed: ', utils.table_tostring(installed))
+ print(' tmp_installed: ', utils.table_tostring(tmp_installed))
+ --]]
+
+ -- check if package is already installed
+ local pkg_name, pkg_constraint = split_name_constraint(pkg)
+ local pkg_is_installed, err = is_installed(pkg_name, tmp_installed, pkg_constraint)
+ if pkg_is_installed then return {} end
+ if err then return nil, err end
+
+ -- table of packages needed to be installed (will be returned)
+ local to_install = {}
+
+ -- find out available versions of 'pkg' and insert them into manifest
+ if not force_no_download then
+ local versions, err = package.retrieve_versions(pkg, manifest, suppress_printing)
+ if not versions then return nil, err end
+ for _, version in pairs(versions) do
+ table.insert(manifest, version)
+ end
+ end
+
+ -- find candidates & sort them
+ local candidates_to_install = find_packages(pkg, manifest)
+ if #candidates_to_install == 0 then
+ return nil, "No suitable candidate for '" .. pkg .. "' found."
+ end
+ candidates_to_install = sort_by_versions(candidates_to_install)
+
+ for _, pkg in pairs(candidates_to_install) do
+
+ --[[ for future debugging:
+ print(' candidate: '.. pkg.name..'-'..pkg.version)
+ print(' installed: ', utils.table_tostring(installed))
+ print(' tmp_installed: ', utils.table_tostring(tmp_installed))
+ print(' to_install: ', utils.table_tostring(to_install))
+ print(' -is installed: ', is_installed(pkg.name, tmp_installed, pkg_constraint))
+ --]]
+
+ -- if there's an error from the previous candidate, print the reason for trying another one
+ if not suppress_printing and err then print(" - trying another candidate due to: " .. err) end
+
+ -- clear the state from the previous candidate
+ pkg_is_installed, err = false, nil
+
+ -- check whether this package has already been added to 'tmp_installed' by another of its candidates
+ pkg_is_installed, err = is_installed(pkg.name, tmp_installed, pkg_constraint)
+ if pkg_is_installed then break end
+
+ -- preserve information about the 'scm' version, because pkg.version
+ -- will be rewritten by information taken from pkg's dist.info file
+ local was_scm_version = (pkg.version == "scm")
+
+ -- Try to obtain cached dependency information from the dependency manifest
+ if dependency_manifest[pkg.name .. "-" .. pkg.version] and cfg.dep_cache then
+ pkg = dependency_manifest[pkg.name .. "-" .. pkg.version]
+ else
+ -- download info about the package if not already downloaded and downloading not prohibited
+ if not (pkg.download_dir or force_no_download) then
+ local path_or_err
+ pkg, path_or_err = package.retrieve_pkg_info(pkg, deploy_dir, suppress_printing)
+ if not pkg then
+ err = "Error when resolving dependencies: " .. path_or_err
+ else
+ -- set path to downloaded package - used to indicate that the
+ -- package was already downloaded, to delete unused but downloaded
+ -- packages and also to install choosen packages
+ pkg.download_dir = path_or_err
+ end
+ end
+ end
+
+ if pkg and was_scm_version then pkg.was_scm_version = true end
+
+ -- check arch & type
+ if not err then
+ if not (pkg.arch == "Universal" or pkg.arch == cfg.arch) or
+ not (pkg.type == "all" or pkg.type == "source" or pkg.type == cfg.type) then
+ err = "Package '" .. pkg_full_name(pkg.name, pkg.version) .. "' doesn't have required arch and type."
+ end
+ end
+
+ -- checks for conflicts with other installed (or previously selected) packages
+ if not err then
+ for _, installed_pkg in pairs(tmp_installed) do
+ err = packages_conflicts(pkg, installed_pkg)
+ if err then break end
+ end
+ end
+
+ -- if pkg passed all of the above tests
+ if not err then
+
+ -- check if pkg's dependencies are satisfied
+ if pkg.depends then
+
+ -- insert pkg into the stack of circular dependencies detection
+ table.insert(dependency_parents, pkg.name)
+
+ -- extract all OS specific dependencies of pkg
+ pkg.depends = extract_os_specific_depends(pkg.depends)
+
+ -- for all dependencies of pkg
+ for _, depend in pairs(pkg.depends) do
+ local dep_name = split_name_constraint(depend)
+
+ -- detect circular dependencies using 'dependency_parents'
+ local is_circular_dependency = false
+ for _, parent in pairs(dependency_parents) do
+ if dep_name == parent then
+ is_circular_dependency = true
+ break
+ end
+ end
+
+ -- if circular dependencies not detected
+ if not is_circular_dependency then
+
+ -- recursively call this function on the candidates of this pkg's dependency
+ local depends_to_install, dep_err = get_packages_to_install(depend, installed, manifest, dependency_manifest, force_no_download, suppress_printing, deploy_dir, dependency_parents, tmp_installed)
+
+ -- if any suitable dependency packages were found, insert them to the 'to_install' table
+ if depends_to_install then
+ for _, depend_to_install in pairs(depends_to_install) do
+
+ -- add some meta information
+ if not depend_to_install.selected_by then
+ depend_to_install.selected_by = pkg.name .. "-" .. pkg.version
+ end
+
+ table.insert(to_install, depend_to_install)
+ table.insert(tmp_installed, depend_to_install)
+ table.insert(installed, depend_to_install)
+ end
+ else
+ err = "Error getting dependency of '" .. pkg_full_name(pkg.name, pkg.version) .. "': " .. dep_err
+ break
+ end
+
+ -- if circular dependencies detected
+ else
+ err = "Error getting dependency of '" .. pkg_full_name(pkg.name, pkg.version) .. "': '" .. dep_name .. "' is a circular dependency."
+ break
+ end
+ end
+
+ -- remove last package from the stack of circular dependencies detection
+ table.remove(dependency_parents)
+ end
+
+ -- if no error occured
+ if not err then
+ -- add pkg and it's provides to the fake table of installed packages, with
+ -- property 'selected' set, indicating that the package isn't
+ -- really installed in the system, just selected to be installed (this is used e.g. in error messages)
+ pkg.selected = true
+ table.insert(tmp_installed, pkg)
+ if pkg.provides then
+ for _, provided_pkg in pairs(get_provides(pkg)) do
+ provided_pkg.selected = true
+ table.insert(tmp_installed, provided_pkg)
+ end
+ end
+ -- add pkg to the table of packages to install
+ table.insert(to_install, pkg)
+
+ -- if some error occured
+ else
+ -- delete the downloaded package
+ if pkg.download_dir and not cfg.debug then sys.delete(pkg.download_dir) end
+
+ -- set tables of 'packages to install' and 'installed packages' to their original state
+
+ to_install = {}
+ tmp_installed = utils.deepcopy(installed)
+ -- add provided packages to installed ones
+ for _, installed_pkg in pairs(tmp_installed) do
+ for _, pkg in pairs(get_provides(installed_pkg)) do
+ table.insert(tmp_installed, pkg)
+ end
+ end
+ end
+
+ -- if error occured
+ else
+ -- delete the downloaded package
+ if pkg and pkg.download_dir and not cfg.debug then sys.delete(pkg.download_dir) end
+
+ -- if pkg is already installed, skip checking its other candidates
+ if pkg_is_installed then break end
+ end
+ end
+
+ -- if package is not installed and no suitable candidates were found, return the last error
+ if #to_install == 0 and not pkg_is_installed then
+ return nil, err
+ else
+ return to_install
+ end
+end
+
+-- Resolve dependencies and return all packages needed in order to install
+-- 'packages' into the system with already 'installed' packages, using 'manifest'.
+-- Also return the table of the dependencies determined during the process
+-- as the second return value.
+--
+-- Optional argument 'dependency_manifest' is a table of dependencies examined
+-- from previous installations etc. It can be used to speed-up the dependency
+-- resolving procedure for example.
+--
+-- Optional argument 'deploy_dir' is used as a temporary place to place the
+-- downloaded packages into.
+--
+-- When optional 'force_no_download' parameter is set to true, then information
+-- about packages won't be downloaded during dependency resolving, assuming that
+-- entries in manifest are complete.
+--
+-- When optional 'suppress_printing' parameter is set to true, then messages
+-- for the user won't be printed during dependency resolving.
+function get_depends(packages, installed, manifest, dependency_manifest, deploy_dir, force_no_download, suppress_printing)
+ if not packages then return {} end
+ manifest = manifest or mf.get_manifest()
+ dependency_manifest = dependency_manifest or {}
+ deploy_dir = deploy_dir or cfg.root_dir
+ force_no_download = force_no_download or false
+ suppress_printing = suppress_printing or false
+ if type(packages) == "string" then packages = {packages} end
+
+ assert(type(packages) == "table", "depends.get_depends: Argument 'packages' is not a table or string.")
+ assert(type(installed) == "table", "depends.get_depends: Argument 'installed' is not a table.")
+ assert(type(manifest) == "table", "depends.get_depends: Argument 'manifest' is not a table.")
+ assert(type(dependency_manifest) == "table", "depends.get_depends: Argument 'dependency_manifest' is not a table.")
+ assert(type(deploy_dir) == "string", "depends.get_depends: Argument 'deploy_dir' is not a string.")
+ assert(type(force_no_download) == "boolean", "depends.get_depends: Argument 'force_no_download' is not a boolean.")
+ assert(type(suppress_printing) == "boolean", "depends.get_depends: Argument 'suppress_printing' is not a boolean.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local tmp_installed = utils.deepcopy(installed)
+
+ -- add provided packages to installed ones
+ for _, installed_pkg in pairs(tmp_installed) do
+ for _, pkg in pairs(get_provides(installed_pkg)) do
+ table.insert(tmp_installed, pkg)
+ end
+ end
+
+ -- If 'pkg' contains valid (architecture specific) path separator,
+ -- it is treated like a path to already downloaded package and
+ -- we assume that user wants to use this specific version of the
+ -- module to be installed. Hence, we will add information about
+ -- this version into the manifest and also remove references to
+ -- any other versions of this module from the manifest. This will
+ -- enforce the version of the module required by the user.
+ for k, pkg in pairs(packages) do
+ if pkg:find(sys.path_separator()) then
+ local pkg_dir = sys.abs_path(pkg)
+ local pkg_info, err = mf.load_distinfo(sys.make_path(pkg_dir, "dist.info"))
+ if not pkg_info then return nil, err end
+
+ -- add information about location of the package, also to prevent downloading it again
+ pkg_info.download_dir = pkg_dir
+ -- mark package to skip deleting its directory after installation
+ pkg_info.preserve_pkg_dir = true
+
+ -- set default arch/type if not explicitly stated and package is of source type
+ if package.is_source_type(pkg_dir) then
+ pkg_info = package.ensure_source_arch_and_type(pkg_info)
+ elseif not (pkg_info.arch and pkg_info.type) then
+ return nil, pkg_dir .. ": binary package missing arch or type in 'dist.info'."
+ end
+
+ -- update manifest
+ manifest = utils.filter(manifest, function(p) return p.name ~= pkg_info.name and true end)
+ table.insert(manifest, pkg_info)
+
+ -- update packages to install
+ pkg = pkg_info.name .. "-" .. pkg_info.version
+ packages[k] = pkg
+ end
+ end
+
+ local to_install = {}
+
+ -- get packages needed to satisfy the dependencies
+ for _, pkg in pairs(packages) do
+
+ local needed_to_install, err = get_packages_to_install(pkg, tmp_installed, manifest, dependency_manifest, force_no_download, suppress_printing, deploy_dir)
+
+ -- if everything's fine
+ if needed_to_install then
+
+ for _, needed_pkg in pairs(needed_to_install) do
+
+ -- TODO: why not to use 'installed' instead of 'tmp_installed'?
+ -- It's because provides aren't searched for by find()
+ -- function inside the update_dependency_manifest().
+ dependency_manifest = update_dependency_manifest(needed_pkg, tmp_installed, needed_to_install, dependency_manifest)
+
+ table.insert(to_install, needed_pkg)
+ table.insert(tmp_installed, needed_pkg)
+ -- add provides of needed_pkg to installed ones
+ for _, provided_pkg in pairs(get_provides(needed_pkg)) do
+ -- copy 'selected' property
+ provided_pkg.selected = needed_pkg.selected
+ table.insert(tmp_installed, provided_pkg)
+ end
+ end
+ -- if error occured
+ else
+ -- delete already downloaded packages
+ for _, pkg in pairs(to_install) do
+ if pkg.download_dir and not cfg.debug then sys.delete(pkg.download_dir) end
+ end
+ return nil, "Cannot resolve dependencies for '" .. pkg .. "': ".. err
+ end
+ end
+
+ return to_install, dependency_manifest
+end
+
+-- Return table of packages provided by specified package (from it's 'provides' field)
+function get_provides(package)
+ assert(type(package) == "table", "depends.get_provides: Argument 'package' is not a table.")
+ if not package.provides then return {} end
+
+ local provided = {}
+ for _, provided_name in pairs(package.provides) do
+ local pkg = {}
+ pkg.name, pkg.version = split_name_constraint(provided_name)
+ pkg.type = package.type
+ pkg.arch = package.arch
+ pkg.provided = package.name .. "-" .. package.version
+ table.insert(provided, pkg)
+ end
+ return provided
+end
+
+-- Return package name and version constraint from full package version constraint specification
+-- E. g.:
+-- for 'luaexpat-1.2.3' return: 'luaexpat' , '1.2.3'
+-- for 'luajit >= 1.2' return: 'luajit' , '>=1.2'
+function split_name_constraint(version_constraint)
+ assert(type(version_constraint) == "string", "depends.split_name_constraint: Argument 'version_constraint' is not a string.")
+
+ local split = version_constraint:find("[%s=~<>-]+%d") or version_constraint:find("[%s=~<>-]+scm")
+
+ if split then
+ return version_constraint:sub(1, split - 1), version_constraint:sub(split):gsub("[%s-]", "")
+ else
+ return version_constraint, nil
+ end
+end
+
+-- Return only packages that can be installed on the specified architecture and type
+function filter_packages_by_arch_and_type(packages, req_arch, req_type)
+ assert(type(packages) == "table", "depends.filter_packages_by_arch_and_type: Argument 'packages' is not a table.")
+ assert(type(req_arch) == "string", "depends.filter_packages_by_arch_and_type: Argument 'req_arch' is not a string.")
+ assert(type(req_type) == "string", "depends.filter_packages_by_arch_and_type: Argument 'pkg_type' is not a string.")
+
+ return utils.filter(packages,
+ function (pkg)
+ return (pkg.arch == "Universal" or pkg.arch == req_arch) and
+ (pkg.type == "all" or pkg.type == "source" or pkg.type == req_type)
+ end)
+end
+
+-- Return only packages that contain one of the specified strings in their 'name-version'.
+-- Case is ignored. If no strings are specified, return all the packages.
+-- Argument 'search_in_desc' specifies if search also in description of packages.
+function filter_packages_by_strings(packages, strings, search_in_desc)
+ if type(strings) == "string" then strings = {strings} end
+ assert(type(packages) == "table", "depends.filter_packages_by_strings: Argument 'packages' is not a table.")
+ assert(type(strings) == "table", "depends.filter_packages_by_strings: Argument 'strings' is not a string or table.")
+
+ if #strings ~= 0 then
+ return utils.filter(packages,
+ function (pkg)
+ for _,str in pairs(strings) do
+ local name = pkg.name .. "-" .. pkg.version
+ if search_in_desc then
+ name = name .. " " .. (pkg.desc or "")
+ end
+ if string.find(string.lower(name), string.lower(str), 1 ,true) ~= nil then return true end
+ end
+ end)
+ else
+ return packages
+ end
+end
+
+
+-- Return full package name and version string (e.g. 'luajit-2.0'). When version
+-- is nil or '' then return only name (e.g. 'luajit') and when name is nil or ''
+-- then return '<unknown>'. Optional 'was_scm_version' argument is a boolean,
+-- stating whether the package was originally selected for installation as a 'scm' version.
+function pkg_full_name(name, version, was_scm_version)
+ name = name or ""
+ version = version or ""
+ was_scm_version = was_scm_version or false
+ if type(version) == "number" then version = tostring(version) end
+
+ assert(type(name) == "string", "depends.pkg_full_name: Argument 'name' is not a string.")
+ assert(type(version) == "string", "depends.pkg_full_name: Argument 'version' is not a string.")
+
+ if was_scm_version then version = version .. " [scm version]" end
+
+ if name == "" then
+ return "<unknown>"
+ else
+ return name .. ((version ~= "") and "-" .. version or "")
+ end
+end
+
+-- Return table of packages, sorted descendingly by versions (newer ones are moved to the top).
+function sort_by_versions(packages)
+ assert(type(packages) == "table", "depends.sort_by_versions: Argument 'packages' is not a table.")
+ return utils.sort(packages, function (a, b) return compare_versions(a.version, b.version) end)
+end
+
+-- Return table of packages, sorted alphabetically by name and then descendingly by version.
+function sort_by_names(packages)
+ assert(type(packages) == "table", "depends.sort_by_names: Argument 'packages' is not a table.")
+ return utils.sort(packages, function (a, b)
+ if a.name == b.name then
+ return compare_versions(a.version, b.version)
+ else
+ return a.name < b.name
+ end
+ end)
+end
+
+-- Return if version satisfies the specified constraint
+function satisfies_constraint(version, constraint)
+ assert(type(version) == "string", "depends.satisfies_constraint: Argument 'version' is not a string.")
+ assert(type(constraint) == "string", "depends.satisfies_constraint: Argument 'constraint' is not a string.")
+ return const.constraint_satisfied(version, constraint)
+end
+
+-- For package versions, return whether: 'version_a' > 'version_b'
+function compare_versions(version_a, version_b)
+ assert(type(version_a) == "string", "depends.compare_versions: Argument 'version_a' is not a string.")
+ assert(type(version_b) == "string", "depends.compare_versions: Argument 'version_b' is not a string.")
+ return const.compareVersions(version_a, version_b)
+end
+
+-- Returns 'dep_manifest' updated with information about the 'pkg'.
+-- 'installed' is table with installed packages
+-- 'to_install' is table with packages that are selected for installation
+-- Packages satisfying the dependencies will be searched for in these two tables.
+function update_dependency_manifest(pkg, installed, to_install, dep_manifest)
+ dep_manifest = dep_manifest or {}
+ assert(type(pkg) == "table", "depends.update_dependency_manifest: Argument 'pkg' is not a table.")
+ assert(type(installed) == "table", "depends.update_dependency_manifest: Argument 'installed' is not a table.")
+ assert(type(to_install) == "table", "depends.update_dependency_manifest: Argument 'to_install' is not a table.")
+ assert(type(dep_manifest) == "table", "depends.update_dependency_manifest: Argument 'dep_manifest' is not a table.")
+
+ local name_ver = pkg.name .. "-" .. (pkg.was_scm_version and "scm" or pkg.version)
+
+ -- add to manifest
+ if not dep_manifest[name_ver] then
+ dep_manifest[name_ver] = {}
+ dep_manifest[name_ver].name = pkg.name
+ dep_manifest[name_ver].version = pkg.version
+ dep_manifest[name_ver].was_scm_version = pkg.was_scm_version
+ dep_manifest[name_ver].arch = pkg.arch
+ dep_manifest[name_ver].type = pkg.type
+ dep_manifest[name_ver].path = pkg.path
+ dep_manifest[name_ver].depends = pkg.depends
+ dep_manifest[name_ver].conflicts = pkg.conflicts
+ dep_manifest[name_ver].provides = pkg.provides
+ dep_manifest[name_ver].license = pkg.license
+ dep_manifest[name_ver].desc = pkg.desc
+ dep_manifest[name_ver].url = pkg.url
+ dep_manifest[name_ver].author = pkg.author
+ dep_manifest[name_ver].maintainer = pkg.maintainer
+
+ -- add information which dependency is satisfied by which package
+ if pkg.depends then
+
+ -- TODO: Won't it be better to add OS-specific 'satisfied_by' metadata in a format like OS-specific 'depends' ?
+ local all_deps = extract_os_specific_depends(pkg.depends)
+
+ dep_manifest[name_ver].satisfied_by = {}
+ for _, depend in pairs(all_deps) do
+
+ -- find package satisfying the dependency
+ local satisfying = find_packages(depend, installed)[1] or find_packages(depend, to_install)[1]
+ satisfying = satisfying.name .. "-" .. satisfying.version
+ dep_manifest[name_ver].satisfied_by[depend] = satisfying
+
+ -- check whether the satisfying package isn't provided by other one
+ local provided_by = utils.filter(installed, function(pkg)
+ return pkg.provides and utils.contains(pkg.provides, satisfying)
+ end)
+ if #provided_by == 0 then
+ provided_by = utils.filter(to_install, function(pkg)
+ return pkg.provides and utils.contains(pkg.provides, satisfying)
+ end)
+ end
+
+ if #provided_by ~= 0 then
+ if not dep_manifest[name_ver].satisfying_provided_by then
+ dep_manifest[name_ver].satisfying_provided_by = {}
+ end
+ dep_manifest[name_ver].satisfying_provided_by[satisfying] = provided_by[1].name .. "-" .. provided_by[1].version
+ end
+ end
+
+ end
+ end
+
+ return dep_manifest
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/git.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/git.lua
new file mode 100644
index 0000000..808f74d
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/git.lua
@@ -0,0 +1,306 @@
+-- Encapsulated Git functionality
+
+module ("dist.git", package.seeall)
+
+require "git"
+local sys = require "dist.sys"
+local cfg = require "dist.config"
+
+
+-- Clone the repository from url to dest_dir
+function clone(repository_url, dest_dir, depth, branch)
+ assert(type(repository_url) == "string", "git.clone: Argument 'repository_url' is not a string.")
+ assert(type(dest_dir) == "string", "git.clone: Argument 'dest_dir' is not a string.")
+ dest_dir = sys.abs_path(dest_dir)
+
+ local command = "git clone " .. repository_url
+
+ if depth then
+ assert(type(depth) == "number", "git.clone: Argument 'depth' is not a number.")
+ command = command .. " --depth " .. depth
+ end
+
+ if branch then
+ assert(type(branch) == "string", "git.clone: Argument 'branch' is not a string.")
+ command = command .. " -b " .. branch
+ end
+
+ command = command .. " " .. sys.quote(dest_dir)
+ if sys.exists(dest_dir) then sys.delete(dest_dir) end
+ sys.make_dir(dest_dir)
+
+ -- change the current working directory to dest_dir
+ local prev_current_dir = sys.current_dir()
+ sys.change_dir(dest_dir)
+
+ -- execute git clone
+ if not cfg.debug then command = command .. " -q " end
+ local ok, err = sys.exec(command)
+
+ -- change the current working directory back
+ sys.change_dir(prev_current_dir)
+
+ return ok, err
+end
+
+-- Return table of all refs of the remote repository at the 'git_url'. Ref_type can be "tags" or "heads".
+local function get_remote_refs(git_url, ref_type)
+ assert(type(git_url) == "string", "git.get_remote_refs: Argument 'git_url' is not a string.")
+ assert(type(ref_type) == "string", "git.get_remote_refs: Argument 'ref_type' is not a string.")
+ assert(ref_type == "tags" or ref_type == "heads", "git.get_remote_refs: Argument 'ref_type' is not \"tags\" or \"heads\".")
+
+ local refs = {}
+
+ local ok, refs_or_err = pcall(git.protocol.remotes, git_url)
+ if not ok then return nil, "Error getting refs of the remote repository '" .. git_url .. "': " .. refs_or_err end
+
+ for ref, sha in pairs(refs_or_err) do
+ if ref:match("%S+/" .. ref_type .. "/%S+") and not ref:match("%^{}") then
+ table.insert(refs, ref:match("%S+/" .. ref_type .. "/(%S+)"))
+ end
+ end
+
+ return refs
+end
+
+-- Return table of all tags of the repository at the 'git_url'
+function get_remote_tags(git_url)
+ return get_remote_refs(git_url, "tags")
+end
+
+-- Return table of all branches of the repository at the 'git_url'
+function get_remote_branches(git_url)
+ return get_remote_refs(git_url, "heads")
+end
+
+-- Checkout specified ref in specified git_repo_dir
+function checkout_ref(ref, git_repo_dir, orphaned)
+ git_repo_dir = git_repo_dir or sys.current_dir()
+ orphaned = orphaned or false
+ assert(type(ref) == "string", "git.checkout_ref: Argument 'ref' is not a string.")
+ assert(type(git_repo_dir) == "string", "git.checkout_ref: Argument 'git_repo_dir' is not a string.")
+ assert(type(orphaned) == "boolean", "git.checkout_ref: Argument 'orphaned' is not a boolean.")
+ git_repo_dir = sys.abs_path(git_repo_dir)
+
+ local command = "git checkout "
+ if orphaned then command = command .. " --orphan " end
+ command = command .. " " .. ref .. " -f"
+ if not cfg.debug then command = command .. " -q " end
+
+ local ok, err
+ if git_repo_dir ~= sys.current_dir() then
+ local prev_current_dir = sys.current_dir()
+ sys.change_dir(git_repo_dir)
+ ok, err = sys.exec(command)
+ sys.change_dir(prev_current_dir)
+ else
+ ok, err = sys.exec(command)
+ end
+
+ return ok, err
+end
+
+-- Checkout specified sha in specified git_repo_dir
+function checkout_sha(sha, git_repo_dir)
+ git_repo_dir = git_repo_dir or sys.current_dir()
+ assert(type(sha) == "string", "git.checkout_sha: Argument 'sha' is not a string.")
+ assert(type(git_repo_dir) == "string", "git.checkout_sha: Argument 'git_repo_dir' is not a string.")
+ git_repo_dir = sys.abs_path(git_repo_dir)
+
+ local dir_changed, prev_current_dir
+
+ if git_repo_dir ~= sys.current_dir() then
+ prev_current_dir = sys.current_dir()
+ sys.change_dir(git_repo_dir)
+ dir_changed = true
+ end
+
+ local ok, repo_or_err = pcall(git.repo.open, git_repo_dir)
+ if not ok then return nil, "Error when opening the git repository '" .. git_repo_dir .. "': " .. repo_or_err end
+
+ local err
+ ok, err = pcall(repo_or_err.checkout, repo_or_err, sha, git_repo_dir)
+ if not ok then return nil, "Error when checking out the sha '" .. sha .. "' in the git repository '" .. git_repo_dir .. "': " .. err end
+
+ repo_or_err:close()
+ if dir_changed then sys.change_dir(prev_current_dir) end
+
+ return true
+end
+
+-- Create an empty git repository in given directory.
+function init(dir)
+ dir = dir or sys.current_dir()
+ assert(type(dir) == "string", "git.init: Argument 'dir' is not a string.")
+ dir = sys.abs_path(dir)
+
+ -- create the 'dir' first, since it causes 'git init' to fail on Windows
+ -- when the parent directory of 'dir' doesn't exist
+ local ok, err = sys.make_dir(dir)
+ if not ok then return nil, err end
+
+ local command = "git init " .. sys.quote(dir)
+ if not cfg.debug then command = command .. " -q " end
+ return sys.exec(command)
+end
+
+-- Add all files in the 'repo_dir' to the git index. The 'repo_dir' must be
+-- in the initialized git repository.
+function add_all(repo_dir)
+ repo_dir = repo_dir or sys.current_dir()
+ assert(type(repo_dir) == "string", "git.add_all: Argument 'repo_dir' is not a string.")
+ repo_dir = sys.abs_path(repo_dir)
+
+ local ok, prev_dir, msg
+ ok, prev_dir = sys.change_dir(repo_dir);
+ if not ok then return nil, err end
+
+ ok, msg = sys.exec("git add -A -f " .. sys.quote(repo_dir))
+ sys.change_dir(prev_dir)
+
+ return ok, msg
+end
+
+-- Commit all indexed files in 'repo_dir' with the given commit 'message'.
+-- The 'repo_dir' must be in the initialized git repository.
+function commit(message, repo_dir)
+ repo_dir = repo_dir or sys.current_dir()
+ message = message or "commit by luadist-git"
+ assert(type(message) == "string", "git.commit: Argument 'message' is not a string.")
+ assert(type(repo_dir) == "string", "git.commit: Argument 'repo_dir' is not a string.")
+ repo_dir = sys.abs_path(repo_dir)
+
+ local ok, prev_dir, msg
+ ok, prev_dir = sys.change_dir(repo_dir);
+ if not ok then return nil, err end
+
+ local command = "git commit -m " .. sys.quote(message)
+ if not cfg.debug then command = command .. " -q " end
+ ok, msg = sys.exec(command)
+ sys.change_dir(prev_dir)
+
+ return ok, msg
+end
+
+
+-- Rename branch 'old_name' to 'new_name'. -- The 'repo_dir' must be
+-- in the initialized git repository and the branch 'new_name' must
+-- not already exist in that repository.
+function rename_branch(old_name, new_name, repo_dir)
+ repo_dir = repo_dir or sys.current_dir()
+ assert(type(old_name) == "string", "git.rename_branch: Argument 'old_name' is not a string.")
+ assert(type(new_name) == "string", "git.rename_branch: Argument 'new_name' is not a string.")
+ assert(type(repo_dir) == "string", "git.rename_branch: Argument 'repo_dir' is not a string.")
+ repo_dir = sys.abs_path(repo_dir)
+
+ local ok, prev_dir, msg
+ ok, prev_dir = sys.change_dir(repo_dir);
+ if not ok then return nil, err end
+
+ ok, msg = sys.exec("git branch -m " .. old_name .. " " .. new_name)
+ sys.change_dir(prev_dir)
+
+ return ok, msg
+end
+
+-- Push the ref 'ref_name' from the 'repo_dir' to the remote git
+-- repository 'git_repo_url'. If 'all_tags' is set to true, all tags
+-- will be pushed, in addition to the explicitly given ref.
+-- If 'delete' is set to 'true' then the explicitly given remote ref
+-- will be deleted, not pushed.
+function push_ref(repo_dir, ref_name, git_repo_url, all_tags, delete)
+ repo_dir = repo_dir or sys.current_dir()
+ all_tags = all_tags or false
+ delete = delete or false
+ assert(type(repo_dir) == "string", "git.push_ref: Argument 'repo_dir' is not a string.")
+ assert(type(git_repo_url) == "string", "git.push_ref: Argument 'git_repo_url' is not a string.")
+ assert(type(ref_name) == "string", "git.push_ref: Argument 'ref_name' is not a string.")
+ assert(type(all_tags) == "boolean", "git.push_ref: Argument 'all_tags' is not a boolean.")
+ assert(type(delete) == "boolean", "git.push_ref: Argument 'delete' is not a boolean.")
+ repo_dir = sys.abs_path(repo_dir)
+
+ local ok, prev_dir, msg
+ ok, prev_dir = sys.change_dir(repo_dir);
+ if not ok then return nil, err end
+
+ local command = "git push " .. git_repo_url
+ if all_tags then command = command .. " --tags " end
+ if delete then command = command .. " --delete " end
+ command = command .. " " .. ref_name .. " -f "
+ if not cfg.debug then command = command .. " -q " end
+
+ ok, msg = sys.exec(command)
+ sys.change_dir(prev_dir)
+
+ return ok, msg
+end
+
+-- Creates the tag 'tag_name' in given 'repo_dir', which must be
+-- in the initialized git repository
+function create_tag(repo_dir, tag_name)
+ repo_dir = repo_dir or sys.current_dir()
+ assert(type(repo_dir) == "string", "git.create_tag: Argument 'repo_dir' is not a string.")
+ assert(type(tag_name) == "string", "git.create_tag: Argument 'tag_name' is not a string.")
+ repo_dir = sys.abs_path(repo_dir)
+
+ local ok, prev_dir, msg
+ ok, prev_dir = sys.change_dir(repo_dir);
+ if not ok then return nil, err end
+
+ ok, msg = sys.exec("git tag " .. tag_name .. " -f ")
+ sys.change_dir(prev_dir)
+
+ return ok, msg
+end
+
+-- Fetch given 'ref_name' from the remote 'git_repo_url' to the local repository
+-- 'repo_dir' and return its sha. 'ref_type' can be "tag" or "head".
+local function fetch_ref(repo_dir, git_repo_url, ref_name, ref_type)
+ repo_dir = repo_dir or sys.current_dir()
+ assert(type(repo_dir) == "string", "git.fetch_ref: Argument 'repo_dir' is not a string.")
+ assert(type(git_repo_url) == "string", "git.fetch_ref: Argument 'git_repo_url' is not a string.")
+ assert(type(ref_name) == "string", "git.fetch_ref: Argument 'ref_name' is not a string.")
+ assert(type(ref_type) == "string", "git.fetch_ref: Argument 'ref_type' is not a string.")
+ assert(ref_type == "tag" or ref_type == "head", "git.get_remote_refs: Argument 'ref_type' is not \"tag\" or \"head\".")
+ repo_dir = sys.abs_path(repo_dir)
+
+ local refstring = "refs/" .. ref_type .. "s/" .. ref_name
+
+ local suppress_fetch_progress = not cfg.debug
+ local ok, repo_or_err = pcall(git.repo.open, repo_dir)
+ if not ok then return nil, "Error when opening the git repository '" .. repo_dir .. "': " .. repo_or_err end
+
+ local ok, pack_or_err, sha = pcall(git.protocol.fetch, git_repo_url, repo_or_err, refstring, suppress_fetch_progress)
+ if not ok then return nil, "Error when fetching ref '" .. refstring .. "' from git repository '" .. git_repo_url .. "': " .. pack_or_err end
+
+ repo_or_err:close()
+ pack_or_err:close()
+
+ return sha
+end
+
+-- Fetch given 'tag_name' from the remote 'git_repo_url' to the local repository
+-- 'repo_dir' and save it as a tag with the same 'tag_name'.
+function fetch_tag(repo_dir, git_repo_url, tag_name)
+ return fetch_ref(repo_dir, git_repo_url, tag_name, "tag")
+end
+
+-- Fetch given 'branch_name' from the remote 'git_repo_url' to the local repository
+-- 'repo_dir' and save it as a branch with the same 'branch_name'.
+function fetch_branch(repo_dir, git_repo_url, branch_name)
+ return fetch_ref(repo_dir, git_repo_url, branch_name, "head")
+end
+
+-- Create the git repository and return the repo object (which can be used in checkout_sha etc.)
+-- If the 'dir' exists, it's deleted prior to creating the git repository.
+function create_repo(dir)
+ assert(type(dir) == "string", "git.create_repo: Argument 'dir' is not a string.")
+
+ if sys.exists(dir) then sys.delete(dir) end
+
+ local ok, repo_or_err = pcall(git.repo.create, dir)
+ if not ok then return nil, "Error when creating the git repository '" .. dir .. "': " .. repo_or_err end
+
+ repo_or_err:close()
+ return true
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/init.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/init.lua
new file mode 100644
index 0000000..50c4b7e
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/init.lua
@@ -0,0 +1,349 @@
+-- main API of LuaDist
+
+module ("dist", package.seeall)
+
+local cfg = require "dist.config"
+local depends = require "dist.depends"
+local git = require "dist.git"
+local sys = require "dist.sys"
+local package = require "dist.package"
+local mf = require "dist.manifest"
+local utils = require "dist.utils"
+
+-- Return the deployment directory.
+function get_deploy_dir()
+ return sys.abs_path(cfg.root_dir)
+end
+
+-- Return packages deployed in 'deploy_dir' also with their provides.
+function get_deployed(deploy_dir)
+ deploy_dir = deploy_dir or cfg.root_dir
+ assert(type(deploy_dir) == "string", "dist.get_deployed: Argument 'deploy_dir' is not a string.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local deployed = depends.get_installed(deploy_dir)
+ local provided = {}
+
+ for _, pkg in pairs(deployed) do
+ for _, provided_pkg in pairs(depends.get_provides(pkg)) do
+ provided_pkg.provided_by = pkg.name .. "-" .. pkg.version
+ table.insert(provided, provided_pkg)
+ end
+ end
+
+ for _, provided_pkg in pairs(provided) do
+ table.insert(deployed, provided_pkg)
+ end
+
+ deployed = depends.sort_by_names(deployed)
+ return deployed
+end
+
+-- Download new 'manifest_file' from repository and returns it.
+-- Return nil and error message on error.
+function update_manifest(deploy_dir)
+ deploy_dir = deploy_dir or cfg.root_dir
+ assert(type(deploy_dir) == "string", "dist.update_manifest: Argument 'deploy_dir' is not a string.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ -- TODO: use 'deploy_dir' argument in manifest functions
+
+ -- retrieve the new manifest (forcing no cache use)
+ local manifest, err = mf.get_manifest(nil, true)
+
+ if manifest then
+ return manifest
+ else
+ return nil, err
+ end
+end
+
+-- Install 'package_names' to 'deploy_dir', using optional CMake 'variables'.
+function install(package_names, deploy_dir, variables)
+ if not package_names then return true end
+ deploy_dir = deploy_dir or cfg.root_dir
+ if type(package_names) == "string" then package_names = {package_names} end
+
+ assert(type(package_names) == "table", "dist.install: Argument 'package_names' is not a table or string.")
+ assert(type(deploy_dir) == "string", "dist.install: Argument 'deploy_dir' is not a string.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ -- find installed packages
+ local installed = depends.get_installed(deploy_dir)
+
+ -- get manifest
+ local manifest, err = mf.get_manifest()
+ if not manifest then return nil, "Error getting manifest: " .. err end
+
+ -- get dependency manifest
+ -- TODO: Is it good that dep_manifest is deploy_dir-specific?
+ -- Probably it'd be better not to be specific, but then there're
+ -- problems with 'provides'. E.g. What to do if there's a module
+ -- installed, that is provided by two different modules in two deploy_dirs?
+ local dep_manifest_file = sys.abs_path(sys.make_path(deploy_dir, cfg.dep_cache_file))
+ local dep_manifest, status = {}
+ if sys.exists(dep_manifest_file) and not utils.cache_timeout_expired(cfg.cache_timeout, dep_manifest_file) then
+ status, dep_manifest = mf.load_manifest(dep_manifest_file)
+ if not dep_manifest then return nil, status end
+ end
+
+ -- resolve dependencies
+ local dependencies, dep_manifest_or_err = depends.get_depends(package_names, installed, manifest, dep_manifest, deploy_dir, false, false)
+ if not dependencies then return nil, dep_manifest_or_err end
+ if #dependencies == 0 then return nil, "No packages to install." end
+
+ -- save updated dependency manifest
+ local ok, err = sys.make_dir(sys.parent_dir(dep_manifest_file))
+ if not ok then return nil, err end
+ ok, err = mf.save_manifest(dep_manifest_or_err, dep_manifest_file)
+ if not ok then return nil, err end
+
+ -- fetch the packages from repository
+ local fetched_pkgs = {}
+ for _, pkg in pairs(dependencies) do
+ local fetched_pkg, err = package.fetch_pkg(pkg, sys.make_path(deploy_dir, cfg.temp_dir))
+ if not fetched_pkg then return nil, err end
+ table.insert(fetched_pkgs, fetched_pkg)
+ end
+
+ -- install fetched packages
+ for _, pkg in pairs(fetched_pkgs) do
+ local ok, err = package.install_pkg(pkg.download_dir, deploy_dir, variables, pkg.preserve_pkg_dir)
+ if not ok then return nil, err end
+ end
+
+ return true
+end
+
+-- Manually deploy packages from 'package_dirs' to 'deploy_dir', using optional
+-- CMake 'variables'. The 'package_dirs' are preserved (will not be deleted).
+function make(deploy_dir, package_dirs, variables)
+ deploy_dir = deploy_dir or cfg.root_dir
+ package_dirs = package_dirs or {}
+
+ assert(type(deploy_dir) == "string", "dist.make: Argument 'deploy_dir' is not a string.")
+ assert(type(package_dirs) == "table", "dist.make: Argument 'package_dirs' is not a table.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ for _, dir in pairs(package_dirs) do
+ local ok, err = package.install_pkg(sys.abs_path(dir), deploy_dir, variables, true)
+ if not ok then return nil, err end
+ end
+ return true
+end
+
+-- Remove 'package_names' from 'deploy_dir' and return the number of removed
+-- packages.
+function remove(package_names, deploy_dir)
+ deploy_dir = deploy_dir or cfg.root_dir
+ if type(package_names) == "string" then package_names = {package_names} end
+
+ assert(type(package_names) == "table", "dist.remove: Argument 'package_names' is not a string or table.")
+ assert(type(deploy_dir) == "string", "dist.remove: Argument 'deploy_dir' is not a string.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local pkgs_to_remove = {}
+ local installed = depends.get_installed(deploy_dir)
+
+ -- find packages to remove
+ if #package_names == 0 then
+ pkgs_to_remove = installed
+ else
+ pkgs_to_remove = depends.find_packages(package_names, installed)
+ end
+
+ -- remove them
+ for _, pkg in pairs(pkgs_to_remove) do
+ local pkg_distinfo_dir = sys.make_path(cfg.distinfos_dir, pkg.name .. "-" .. pkg.version)
+ local ok, err = package.remove_pkg(pkg_distinfo_dir, deploy_dir)
+ if not ok then return nil, err end
+ end
+
+ return #pkgs_to_remove
+end
+
+-- Download 'pkg_names' to 'fetch_dir' and return the table of their directories.
+function fetch(pkg_names, fetch_dir)
+ fetch_dir = fetch_dir or sys.current_dir()
+ assert(type(pkg_names) == "table", "dist.fetch: Argument 'pkg_names' is not a string or table.")
+ assert(type(fetch_dir) == "string", "dist.fetch: Argument 'fetch_dir' is not a string.")
+ fetch_dir = sys.abs_path(fetch_dir)
+
+ local manifest = mf.get_manifest()
+
+ local pkgs_to_fetch = {}
+ for _, pkg_name in pairs(pkg_names) do
+
+ -- retrieve available versions
+ local versions, err = package.retrieve_versions(pkg_name, manifest)
+ if not versions then return nil, err end
+ for _, version in pairs(versions) do
+ table.insert(manifest, version)
+ end
+
+ local packages = depends.find_packages(pkg_name, manifest)
+ if #packages == 0 then return nil, "No packages found for '" .. pkg_name .. "'." end
+
+ packages = depends.sort_by_versions(packages)
+ table.insert(pkgs_to_fetch, packages[1])
+ end
+
+ local fetched_dirs = {}
+ for _, pkg in pairs(pkgs_to_fetch) do
+ local fetched_pkg, err = package.fetch_pkg(pkg, fetch_dir)
+ if not fetched_pkg then return nil, err end
+ table.insert(fetched_dirs, fetched_pkg.download_dir)
+ end
+
+ return fetched_dirs
+end
+
+-- Upload binary version of given modules installed in the specified
+-- 'deploy_dir' to the repository specified by provided base url.
+-- Return the number of uploaded packages.
+--
+-- Organization of uploaded modules and their repositories is subject
+-- to the following conventions:
+-- - destination repository is: 'DEST_GIT_BASE_URL/MODULE_NAME'
+-- - module will be uploaded to the branch: 'ARCH-TYPE' according
+-- to the arch and type of the user's machine
+-- - the module will be tagged as: 'VERSION-ARCH-TYPE' (if the tag already
+-- exists, it will be overwritten)
+--
+-- E.g. assume that the module 'lua-5.1.4' is installed on the 32bit Linux
+-- system (Linux-i686). When this function is called with the module name
+-- 'lua' and base url 'git@github.com:LuaDist', then the binary version
+-- of the module 'lua', that is installed on the machine, will be uploaded
+-- to the branch 'Linux-i686' of the repository 'git@github.com:LuaDist/lua.git'
+-- and tagged as '5.1.4-Linux-i686'.
+function upload_modules(deploy_dir, module_names, dest_git_base_url)
+ deploy_dir = deploy_dir or cfg.root_dir
+ if type(module_names) == "string" then module_names = {module_names} end
+ assert(type(deploy_dir) == "string", "dist.upload_module: Argument 'deploy_dir' is not a string.")
+ assert(type(module_names) == "table", "dist.upload_module: Argument 'module_name' is not a string or table.")
+ assert(type(dest_git_base_url) == "string", "dist.upload_module: Argument 'dest_git_base_url' is not a string.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local modules_to_upload = {}
+ local installed = depends.get_installed(deploy_dir)
+
+ -- find modules to upload
+ if #module_names == 0 then
+ modules_to_upload = installed
+ else
+ modules_to_upload = depends.find_packages(module_names, installed)
+ end
+
+ for _, installed_module in pairs(modules_to_upload) do
+
+ -- set names
+ local branch_name = cfg.arch .. "-" .. cfg.type
+ local tag_name = installed_module.version .. "-" .. branch_name
+ local full_name = installed_module.name .. "-" .. tag_name
+ local tmp_dir = sys.make_path(deploy_dir, cfg.temp_dir, full_name .. "-to-upload")
+ local dest_git_url = dest_git_base_url .. "/" .. installed_module.name .. ".git"
+ local distinfo_file = sys.make_path(deploy_dir, cfg.distinfos_dir, installed_module.name .. "-" .. installed_module.version, "dist.info")
+
+ -- create temporary directory (delete previous if already exists)
+ if sys.exists(tmp_dir) then sys.delete(tmp_dir) end
+ local ok, err = sys.make_dir(tmp_dir)
+ if not ok then return nil, err end
+
+ -- copy the module files for all enabled components
+ for _, component in ipairs(cfg.components) do
+ if installed_module.files[component] then
+ for _, file in ipairs(installed_module.files[component]) do
+ local file_path = sys.make_path(deploy_dir, file)
+ local dest_dir = sys.parent_dir(sys.make_path(tmp_dir, file))
+ if sys.is_file(file_path) then
+ sys.make_dir(dest_dir)
+ sys.copy(file_path, dest_dir)
+ end
+ end
+ end
+ end
+
+ -- add module's dist.info file
+ sys.copy(distinfo_file, tmp_dir)
+
+ -- create git repo
+ ok, err = git.init(tmp_dir)
+ if not ok then return nil, "Error initializing empty git repository in '" .. tmp_dir .. "': " .. err end
+
+ -- add all files
+ ok, err = git.add_all(tmp_dir)
+ if not ok then return nil, "Error adding all files to the git index in '" .. tmp_dir .. "': " .. err end
+
+ -- create commit
+ ok, err = git.commit("[luadist-git] add " .. full_name .. " [ci skip]", tmp_dir)
+ if not ok then return nil, "Error commiting changes in '" .. tmp_dir .. "': " .. err end
+
+ -- rename branch
+ ok, err = git.rename_branch("master", branch_name, tmp_dir)
+ if not ok then return nil, "Error renaming branch 'master' to '" .. branch_name .. "' in '" .. tmp_dir .. "': " .. err end
+
+ -- create tag
+ ok, err = git.create_tag(tmp_dir, tag_name)
+ if not ok then return nil, "Error creating tag '" .. tag_name .. "' in '" .. tmp_dir .. "': " .. err end
+
+ print("Uploading " .. full_name .. " to " .. dest_git_url .. "...")
+
+ -- push to the repository
+ ok, err = git.push_ref(tmp_dir, branch_name, dest_git_url, true)
+ if not ok then return nil, "Error when pushing branch '" .. branch_name .. "' and tag '" .. tag_name .. "' to '" .. dest_git_url .. "': " .. err end
+
+ -- delete temporary directory (if not in debug mode)
+ if not cfg.debug then sys.delete(tmp_dir) end
+ end
+
+ return #modules_to_upload
+end
+
+-- Returns table with information about module's dependencies, using the cache.
+function dependency_info(module, deploy_dir)
+ cache_file = cache_file or sys.abs_path(sys.make_path(cfg.root_dir, cfg.dep_cache_file))
+ assert(type(module) == "string", "dist.dependency_info: Argument 'module' is not a string.")
+ assert(type(deploy_dir) == "string", "dist.dependency_info: Argument 'deploy_dir' is not a string.")
+
+ -- get manifest
+ local manifest, err = mf.get_manifest()
+ if not manifest then return nil, "Error getting manifest: " .. err end
+
+ -- get dependency manifest
+ -- TODO: Is it good that dep_manifest is deploy_dir-specific?
+ -- Probably it'd be better not to be specific, but then there're
+ -- problems with 'provides'. E.g. What to do if there's a module
+ -- installed, that is provided by two different modules in two deploy_dirs?
+ local dep_manifest_file = sys.abs_path(sys.make_path(deploy_dir, cfg.dep_cache_file))
+ local dep_manifest, status = {}
+ if sys.exists(dep_manifest_file) and cfg.cache and not utils.cache_timeout_expired(cfg.cache_timeout, dep_manifest_file) then
+ status, dep_manifest = mf.load_manifest(dep_manifest_file)
+ if not dep_manifest then return nil, status end
+ end
+
+ -- force getting the dependency information
+ local installed = {}
+
+ -- resolve dependencies
+ local dependencies, dep_manifest_or_err = depends.get_depends(module, installed, manifest, dep_manifest, deploy_dir, false, true and not cfg.debug)
+ if not dependencies then return nil, dep_manifest_or_err end
+
+ -- save updated dependency manifest
+ local ok, err = sys.make_dir(sys.parent_dir(dep_manifest_file))
+ if not ok then return nil, err end
+ ok, err = mf.save_manifest(dep_manifest_or_err, dep_manifest_file)
+ if not ok then return nil, err end
+
+ -- collect just relevant dependencies from dependency manifest
+ local relevant_deps = {}
+ for _, dep in pairs(dependencies) do
+ local name_ver = dep.name .. "-" .. (dep.was_scm_version and "scm" or dep.version)
+ if dep_manifest_or_err[name_ver] then
+ table.insert(relevant_deps, dep_manifest_or_err[name_ver])
+ else
+ return nil, "Error: dependency information for '" .. name_ver .. "' not found in dependency manifest."
+ end
+ end
+
+ return relevant_deps
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/logger.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/logger.lua
new file mode 100644
index 0000000..7843223
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/logger.lua
@@ -0,0 +1,64 @@
+-- Simple logger for LuaDist.
+
+module ("dist.logger", package.seeall)
+
+local cfg = require "dist.config"
+local sys = require "dist.sys"
+
+-- Open 'log_file' and return a log, or nil and error msg on error.
+local function get_log(log_file)
+ log_file = log_file or cfg.log_file
+ assert(type(log_file) == "string", "log.get_log: Argument 'log_file' is not a string.")
+ log_file = sys.abs_path(log_file)
+
+ sys.make_dir(sys.parent_dir(log_file))
+ local log, err = io.open(log_file, "a")
+ if not log then
+ return nil, "Error: can't open a logfile '" .. log_file .. "': " .. err
+ else
+ return log
+ end
+end
+
+-- Set the default log.
+local log_file = get_log(cfg.log_file)
+
+-- Log levels used.
+local log_levels = {
+ DEBUG = 0, -- Fine-grained informational events that are most useful to debug an application.
+ INFO = 1, -- Informational messages that highlight the progress of the application at coarse-grained level.
+ WARN = 2, -- Potentially harmful situations.
+ ERROR = 3, -- Error events that might still allow the application to continue running.
+ FATAL = 4, -- Very severe error events that would presumably lead the application to abort.
+}
+
+-- Write 'message' with 'level' to 'log'.
+local function write(level, ...)
+ assert(type(level) == "string", "log.write: Argument 'level' is not a string.")
+ assert(#arg > 0, "log.write: No message arguments provided.")
+ assert(type(log_levels[level]) == "number", "log.write: Unknown log level used: '" .. level .. "'.")
+
+ level = level:upper()
+ local message = table.concat(arg, " ")
+
+ -- Check if writing for this log level is enabled.
+ if cfg.write_log_level and log_levels[level] >= log_levels[cfg.write_log_level] then
+ log_file:write(os.date("%Y-%m-%d %H:%M:%S") .. " [" .. level .. "]\t" .. message .. "\n")
+ log_file:flush()
+ end
+
+ -- Check if printing for this log level is enabled.
+ if cfg.print_log_level and log_levels[level] >= log_levels[cfg.print_log_level] then
+ print(message)
+ end
+end
+
+-- Functions with defined log levels for simple use.
+function debug(...) return write("DEBUG", ...) end
+function info(...) return write("INFO", ...) end
+function warn(...) return write("WARN", ...) end
+function error(...) return write("ERROR", ...) end
+function fatal(...) return write("FATAL", ...) end
+
+-- Function with explicitly specified log level.
+function log(level, ...) return write(level, ...) end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/manifest.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/manifest.lua
new file mode 100644
index 0000000..ccaad13
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/manifest.lua
@@ -0,0 +1,248 @@
+-- Working with manifest and dist.info files
+
+module ("dist.manifest", package.seeall)
+
+local cfg = require "dist.config"
+local git = require "dist.git"
+local sys = require "dist.sys"
+local utils = require "dist.utils"
+
+-- Return the manifest table from 'manifest_file'. If the manifest is in cache,
+-- then the cached version is used. You can set the cache timeout value in
+-- 'config.cache_timeout' variable.
+-- If optional 'force_no_cache' parameter is true, then the cache is not used.
+function get_manifest(manifest_file, force_no_cache)
+ manifest_file = manifest_file or sys.make_path(cfg.root_dir, cfg.manifest_file)
+ force_no_cache = force_no_cache or false
+
+ assert(type(manifest_file) == "string", "manifest.get_manifest: Argument 'manifest_file' is not a string.")
+ assert(type(force_no_cache) == "boolean", "manifest.get_manifest: Argument 'force_no_cache' is not a boolean.")
+ manifest_file = sys.abs_path(manifest_file)
+
+ -- download new manifest to the cache if not present or cache not used or cache expired
+ if not sys.exists(manifest_file) or force_no_cache or not cfg.cache or utils.cache_timeout_expired(cfg.cache_timeout, manifest_file) then
+ local manifest_dest = sys.parent_dir(manifest_file) or sys.current_dir()
+ local ok, err = download_manifest(manifest_dest, cfg.repos)
+ if not ok then return nil, "Error when downloading manifest: " .. err end
+ end
+
+ -- load manifest from cache
+ local status, ret = load_manifest(manifest_file)
+ if not status then return nil, "Error when loading manifest: " .. ret end
+
+ return ret
+end
+
+-- Download manifest from the table of git 'repository_urls' to 'dest_dir' and return true on success
+-- and nil and error message on error.
+function download_manifest(dest_dir, repository_urls)
+ dest_dir = dest_dir or sys.make_path(cfg.root_dir, cfg.cache_dir)
+ repository_urls = repository_urls or cfg.repos
+ if type(repository_urls) == "string" then repository_urls = {repository_urls} end
+
+ assert(type(dest_dir) == "string", "manifest.download_manifest: Argument 'dest_dir' is not a string.")
+ assert(type(repository_urls) == "table", "manifest.download_manifest: Argument 'repository_urls' is not a table or string.")
+ dest_dir = sys.abs_path(dest_dir)
+
+ -- define used files and directories
+ local manifest_filename = sys.extract_name(cfg.manifest_file)
+ local manifest_file = sys.make_path(dest_dir, manifest_filename)
+ local temp_dir = sys.make_path(cfg.root_dir, cfg.temp_dir)
+
+ -- ensure that destination directory exists
+ local ok, err = sys.make_dir(dest_dir)
+ if not ok then return nil, err end
+
+ -- retrieve manifests from repositories and collect them into one manifest table
+ local manifest = {}
+
+ if #repository_urls == 0 then return nil, "No repository url specified." end
+
+ print("Downloading repository information...")
+ for k, repo in pairs(repository_urls) do
+ local clone_dir = sys.make_path(temp_dir, "repository_" .. tostring(k))
+
+ -- clone the repo and add its '.gitmodules' file to the manifest table
+
+ ok, err = git.create_repo(clone_dir)
+
+ local sha
+ if ok then sha, err = git.fetch_branch(clone_dir, repo, "master") end
+ if sha then ok, err = git.checkout_sha(sha, clone_dir) end
+
+ if not (ok and sha) then
+ if not cfg.debug then sys.delete(clone_dir) end
+ return nil, "Error when downloading the manifest from repository with url: '" .. repo .. "': " .. err
+ else
+ for _, pkg in pairs(load_gitmodules(sys.make_path(clone_dir, ".gitmodules"))) do
+ table.insert(manifest, pkg)
+ end
+ end
+ if not cfg.debug then sys.delete(clone_dir) end
+ end
+
+ -- save the new manifest table to the file
+ ok, err = save_manifest(manifest, manifest_file)
+ if not ok then return nil, err end
+
+ return true
+end
+
+-- A secure loadfile function
+-- If file code chunk has upvalues, the first upvalue is set to the given
+-- environement, if that parameter is given, or to the value of the global environment.
+local function secure_loadfile(file, env)
+ assert(type(file) == "string", "secure_loadfile: Argument 'file' is not a string.")
+
+ -- use the given (or create a new) restricted environment
+ local env = env or {}
+
+ -- load the file and run in a protected call with the restricted env
+ -- setfenv is deprecated in lua 5.2 in favor of giving env in arguments
+ -- the additional loadfile arguments are simply ignored for previous lua versions
+ local f, err = loadfile(file, 'bt', env)
+ if f then
+ if setfenv ~= nil then
+ setfenv(f, env)
+ end
+ return pcall(f)
+ else
+ return nil, err
+ end
+end
+
+-- Load and return manifest table from the manifest file.
+-- If manifest file not present, return nil.
+function load_manifest(manifest_file)
+ manifest_file = manifest_file or sys.make_path(cfg.root_dir, cfg.manifest_file)
+
+ return secure_loadfile(sys.abs_path(manifest_file))
+end
+
+-- Load '.gitmodules' file and returns manifest table.
+-- If the file is not present, return nil.
+function load_gitmodules(gitmodules_file)
+ gitmodules_file = gitmodules_file or sys.make_path(cfg.root_dir, cfg.manifest_file)
+ assert(type(gitmodules_file) == "string", "manifest.load_gitmodules: Argument 'gitmodules_file' is not a string.")
+ gitmodules_file = sys.abs_path(gitmodules_file)
+
+ if sys.exists(gitmodules_file) then
+ -- load the .gitmodules file
+ local file, err = io.open(gitmodules_file, "r")
+ if not file then return nil, "Error when opening the .gitmodules file '" .. gitmodules_file .. "':" .. err end
+
+ local mf_text = file:read("*a")
+ file:close()
+ if not mf_text then return nil, "Error when reading the .gitmodules file '" .. gitmodules_file .. "':" .. err end
+
+ manifest = {}
+ for url in mf_text:gmatch("git://%S+/%S+") do
+ pkg = {name = url:match("git://%S+/(%S+)%.git") or url:match("git://%S+/(%S+)"), version = "scm", path = url}
+ table.insert(manifest, pkg)
+ end
+
+ return manifest
+ else
+ return nil, "Error when loading the .gitmodules: file '" .. gitmodules_file .. "' doesn't exist."
+ end
+end
+
+-- Save manifest table to the 'file'
+function save_manifest(manifest_table, file)
+ assert(type(manifest_table) == "table", "manifest.save_distinfo: Argument 'manifest_table' is not a table.")
+ assert(type(file) == "string", "manifest.save_distinfo: Argument 'file' is not a string.")
+ file = sys.abs_path(file)
+
+ -- Print table 'tbl' to io stream 'file'.
+ local function print_table(file, tbl, in_nested_table)
+ for k, v in pairs(tbl) do
+ -- print key
+ if in_nested_table then file:write("\t\t") end
+ if type(k) ~= "number" then
+ file:write("['" .. k .. "']" .. " = ")
+ end
+ -- print value
+ if type(v) == "table" then
+ file:write("{\n")
+ print_table(file, v, true)
+ if in_nested_table then file:write("\t") end
+ file:write("\t}")
+ else
+ if in_nested_table then file:write("\t") end
+ if type(v) == "string" then
+ file:write('[[' .. v .. ']]')
+ else
+ file:write(tostring(v))
+ end
+ end
+ file:write(",\n")
+ end
+ end
+
+ local manifest_file = io.open(file, "w")
+ if not manifest_file then return nil, "Error when saving manifest: cannot open the file '" .. file .. "'." end
+
+ manifest_file:write('return {\n')
+ print_table(manifest_file, manifest_table)
+ manifest_file:write('},\ntrue')
+ manifest_file:close()
+
+ return true
+end
+
+-- Load and return package info table from the distinfo_file file.
+-- If file not present, return nil.
+function load_distinfo(distinfo_file)
+ assert(type(distinfo_file) == "string", "manifest.load_distinfo: Argument 'distinfo_file' is not a string.")
+ distinfo_file = sys.abs_path(distinfo_file)
+
+ -- load the distinfo file
+ local distinfo_env = {}
+ local status, ret = secure_loadfile(distinfo_file, distinfo_env)
+ if not status then return nil, "Error when loading package info: " .. ret end
+
+ return distinfo_env
+end
+
+-- Save distinfo table to the 'file'
+function save_distinfo(distinfo_table, file)
+ assert(type(distinfo_table) == "table", "manifest.save_distinfo: Argument 'distinfo_table' is not a table.")
+ assert(type(file) == "string", "manifest.save_distinfo: Argument 'file' is not a string.")
+ file = sys.abs_path(file)
+
+ -- Print table 'tbl' to io stream 'file'.
+ local function print_table(file, tbl, in_nested_table)
+ for k, v in pairs(tbl) do
+ -- print key
+ if type(k) ~= "number" then
+ file:write(k .. " = ")
+ end
+ -- print value
+ if type(v) == "table" then
+ file:write("{\n")
+ print_table(file, v, true)
+ file:write("}\n")
+ elseif type(v) == "string" then
+ if in_nested_table then
+ file:write('[[' .. v .. ']]')
+ else
+ file:write('"' .. v .. '"')
+ end
+ else
+ file:write(v)
+ end
+ if in_nested_table then
+ file:write(",")
+ end
+ file:write("\n")
+ end
+ end
+
+ local distinfo_file = io.open(file, "w")
+ if not distinfo_file then return nil, "Error when saving dist-info table: cannot open the file '" .. file .. "'." end
+
+ print_table(distinfo_file, distinfo_table)
+ distinfo_file:close()
+
+ return true
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/package.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/package.lua
new file mode 100644
index 0000000..da399c1
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/package.lua
@@ -0,0 +1,596 @@
+-- Package functions
+
+module ("dist.package", package.seeall)
+
+local cfg = require "dist.config"
+local git = require "dist.git"
+local sys = require "dist.sys"
+local mf = require "dist.manifest"
+local utils = require "dist.utils"
+local depends = require "dist.depends"
+
+-- Return whether the package in given 'pkg_dir' is of a source type.
+function is_source_type(pkg_dir)
+ assert(type(pkg_dir) == "string", "package.is_source_type: Argument 'pkg_dir' is not a string.")
+ pkg_dir = sys.abs_path(pkg_dir)
+ return utils.to_boolean(sys.exists(sys.make_path(pkg_dir, "CMakeLists.txt")))
+end
+
+-- Ensure proper arch and type for the given source 'dist_info' table and return it.
+-- WARNING: this function should be used only for 'dist_info' tables of modules that are of a source type!
+function ensure_source_arch_and_type(dist_info)
+ assert(type(dist_info) == "table", "package.ensure_source_arch_and_type: Argument 'dist_info' is not a table.")
+ dist_info.arch = dist_info.arch or "Universal"
+ dist_info.type = dist_info.type or "source"
+ return dist_info
+end
+
+-- Remove package from 'pkg_distinfo_dir' of 'deploy_dir'.
+function remove_pkg(pkg_distinfo_dir, deploy_dir)
+ deploy_dir = deploy_dir or cfg.root_dir
+ assert(type(pkg_distinfo_dir) == "string", "package.remove_pkg: Argument 'pkg_distinfo_dir' is not a string.")
+ assert(type(deploy_dir) == "string", "package.remove_pkg: Argument 'deploy_dir' is not a string.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local abs_pkg_distinfo_dir = sys.make_path(deploy_dir, pkg_distinfo_dir)
+
+ -- check for 'dist.info'
+ local info, err = mf.load_distinfo(sys.make_path(abs_pkg_distinfo_dir, "dist.info"))
+ if not info then return nil, "Error removing package from '" .. pkg_distinfo_dir .. "' - it doesn't contain valid 'dist.info' file." end
+ if not info.files then return nil, "File '" .. sys.make_path(pkg_distinfo_dir, "dist.info") .."' doesn't contain list of installed files." end
+
+ -- remove files installed as components of this package
+ for _, component in ipairs(cfg.components) do
+ if info.files[component] then
+ for i = #info.files[component], 1, -1 do
+ local f = info.files[component][i]
+ f = sys.make_path(deploy_dir,f)
+ if sys.is_file(f) then
+ sys.delete(f)
+ elseif sys.is_dir(f) then
+ local dir_files, err = sys.get_file_list(f)
+ if not dir_files then return nil, "Error removing package in '" .. abs_pkg_distinfo_dir .. "': " .. err end
+ if #dir_files == 0 then sys.delete(f) end
+ end
+ -- delete also all parent directories if empty
+ local parents = sys.parents_up_to(f, deploy_dir)
+ for _, parent in ipairs(parents) do
+ if sys.is_dir(parent) then
+ local dir_files, err = sys.get_file_list(parent)
+ if not dir_files then return nil, "Error removing package in '" .. abs_pkg_distinfo_dir .. "': " .. err end
+ if #dir_files == 0 then
+ sys.delete(parent)
+ end
+ end
+ end
+ end
+ end
+ end
+
+ -- remove removed components also from 'dist.info'
+ for _, component in ipairs(cfg.components) do
+ info.files[component] = nil
+ end
+
+ -- delete the package information from deploy_dir
+ local ok = sys.delete(abs_pkg_distinfo_dir)
+ if not ok then return nil, "Error removing package in '" .. abs_pkg_distinfo_dir .. "'." end
+
+ -- if the package was not completely removed (e.g. some components remain),
+ -- save the new version of its 'dist.info'
+ local comp_num = 0
+ for _, _ in pairs(info.files) do comp_num = comp_num + 1 end
+ if comp_num ~= 0 then
+ sys.make_dir(abs_pkg_distinfo_dir)
+ local ok, err = mf.save_distinfo(info, sys.make_path(abs_pkg_distinfo_dir, "dist.info"))
+ if not ok then return nil, "Error resaving the 'dist.info': " .. err end
+ end
+
+ return ok
+end
+
+-- Install package from 'pkg_dir' to 'deploy_dir', using optional CMake 'variables'.
+-- Optional 'preserve_pkg_dir' argument specified whether to preserve the 'pkg_dir'.
+function install_pkg(pkg_dir, deploy_dir, variables, preserve_pkg_dir)
+ deploy_dir = deploy_dir or cfg.root_dir
+ variables = variables or {}
+ preserve_pkg_dir = preserve_pkg_dir or false
+
+ assert(type(pkg_dir) == "string", "package.install_pkg: Argument 'pkg_dir' is not a string.")
+ assert(type(deploy_dir) == "string", "package.install_pkg: Argument 'deploy_dir' is not a string.")
+ assert(type(variables) == "table", "package.install_pkg: Argument 'variables' is not a table.")
+ assert(type(preserve_pkg_dir) == "boolean", "package.install_pkg: Argument 'preserve_pkg_dir' is not a boolean.")
+
+ pkg_dir = sys.abs_path(pkg_dir)
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ -- check for dist.info
+ local info, err = mf.load_distinfo(sys.make_path(pkg_dir, "dist.info"))
+ if not info then return nil, "Error installing: the directory '" .. pkg_dir .. "' doesn't exist or doesn't contain valid 'dist.info' file." end
+
+ -- check if the package is source
+ if is_source_type(pkg_dir) then info = ensure_source_arch_and_type(info) end
+
+ -- check package's architecture
+ if not (info.arch == "Universal" or info.arch == cfg.arch) then
+ return nil, "Error installing '" .. info.name .. "-" .. info.version .. "': architecture '" .. info.arch .. "' is not suitable for this machine."
+ end
+
+ -- check package's type
+ if not (info.type == "all" or info.type == "source" or info.type == cfg.type) then
+ return nil, "Error installing '" .. info.name .. "-" .. info.version .. "': architecture type '" .. info.type .. "' is not suitable for this machine."
+ end
+
+ local ok, err
+
+ -- if package is of binary type, just deploy it
+ if info.type ~= "source" then
+ ok, err = deploy_binary_pkg(pkg_dir, deploy_dir)
+
+ -- else build and then deploy
+ else
+
+ -- check if we have cmake
+ ok = utils.system_dependency_available("cmake", "cmake --version")
+ if not ok then return nil, "Error when installing: Command 'cmake' not available on the system." end
+
+ -- set cmake variables
+ local cmake_variables = {}
+
+ -- set variables from config file
+ for k, v in pairs(cfg.variables) do
+ cmake_variables[k] = v
+ end
+
+ -- set variables specified as argument
+ for k, v in pairs(variables) do
+ cmake_variables[k] = v
+ end
+
+ cmake_variables.CMAKE_INCLUDE_PATH = table.concat({cmake_variables.CMAKE_INCLUDE_PATH or "", sys.make_path(deploy_dir, "include")}, ";")
+ cmake_variables.CMAKE_LIBRARY_PATH = table.concat({cmake_variables.CMAKE_LIBRARY_PATH or "", sys.make_path(deploy_dir, "lib"), sys.make_path(deploy_dir, "bin")}, ";")
+ cmake_variables.CMAKE_PROGRAM_PATH = table.concat({cmake_variables.CMAKE_PROGRAM_PATH or "", sys.make_path(deploy_dir, "bin")}, ";")
+
+ -- build the package and deploy it
+ ok, err = build_pkg(pkg_dir, deploy_dir, cmake_variables)
+ if not ok then return nil, err end
+
+ end
+
+ -- delete directory of fetched package
+ if not (cfg.debug or preserve_pkg_dir) then sys.delete(pkg_dir) end
+
+ return ok, err
+end
+
+-- Build and deploy package from 'src_dir' to 'deploy_dir' using 'variables'.
+-- Return directory to which the package was built or nil on error.
+-- 'variables' is table of optional CMake variables.
+function build_pkg(src_dir, deploy_dir, variables)
+ deploy_dir = deploy_dir or cfg.root_dir
+ variables = variables or {}
+
+ assert(type(src_dir) == "string", "package.build_pkg: Argument 'src_dir' is not a string.")
+ assert(type(deploy_dir) == "string", "package.build_pkg: Argument 'deploy_dir' is not a string.")
+ assert(type(variables) == "table", "package.build_pkg: Argument 'variables' is not a table.")
+
+ src_dir = sys.abs_path(src_dir)
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ -- check for dist.info
+ local info, err = mf.load_distinfo(sys.make_path(src_dir, "dist.info"))
+ if not info then return nil, "Error building package from '" .. src_dir .. "': it doesn't contain valid 'dist.info' file." end
+ local pkg_name = info.name .. "-" .. info.version
+
+ -- set machine information
+ info.arch = cfg.arch
+ info.type = cfg.type
+
+ -- create CMake build dir
+ local cmake_build_dir = sys.abs_path(sys.make_path(deploy_dir, cfg.temp_dir, pkg_name .. "-CMake-build"))
+ sys.make_dir(cmake_build_dir)
+
+ -- create cmake cache
+ variables["CMAKE_INSTALL_PREFIX"] = deploy_dir
+ local cache_file = io.open(sys.make_path(cmake_build_dir, "cache.cmake"), "w")
+ if not cache_file then return nil, "Error creating CMake cache file in '" .. cmake_build_dir .. "'" end
+
+ -- Fill in cache variables
+ for k,v in pairs(variables) do
+ cache_file:write("SET(" .. k .. " " .. sys.quote(v):gsub("\\+", "/") .. " CACHE STRING \"\" FORCE)\n")
+ end
+
+ -- If user cache file is provided then append it
+ if cfg.cache_file ~= "" then
+ local user_cache = io.open(sys.abs_path(cfg.cache_file), "r")
+ if user_cache then
+ cache_file:write(user_cache:read("*all").."\n")
+ user_cache:close()
+ end
+ end
+ cache_file:close()
+
+ src_dir = sys.abs_path(src_dir)
+ print("Building " .. sys.extract_name(src_dir) .. "...")
+
+ -- set cmake cache command
+ local cache_command = cfg.cache_command
+ if cfg.debug then cache_command = cache_command .. " " .. cfg.cache_debug_options end
+
+ -- set cmake build command
+ local build_command = cfg.build_command
+ if cfg.debug then build_command = build_command .. " " .. cfg.build_debug_options end
+
+ -- set the cmake cache
+ local ok = sys.exec("cd " .. sys.quote(cmake_build_dir) .. " && " .. cache_command .. " " .. sys.quote(src_dir))
+ if not ok then return nil, "Error preloading the CMake cache script '" .. sys.make_path(cmake_build_dir, "cache.cmake") .. "'" end
+
+ -- build with cmake
+ ok = sys.exec("cd " .. sys.quote(cmake_build_dir) .. " && " .. build_command)
+ if not ok then return nil, "Error building with CMake in directory '" .. cmake_build_dir .. "'" end
+
+ -- if this is only simulation, exit sucessfully, skipping the next actions
+ if cfg.simulate then
+ return true, "Simulated build and deployment of package '" .. pkg_name .. "' sucessfull."
+ end
+
+ -- table to collect files installed in the components
+ info.files = {}
+
+ -- install the components
+ for _, component in ipairs(cfg.components) do
+ local strip_option = ""
+ if not cfg.debug and component ~= "Library" then strip_option = cfg.strip_option end
+
+ local ok = sys.exec("cd " .. sys.quote(cmake_build_dir) .. " && " .. cfg.cmake .. " " .. strip_option .. " " ..cfg.install_component_command:gsub("#COMPONENT#", component))
+
+ if not ok then return nil, "Error when installing the component '" .. component .. "' with CMake in directory '" .. cmake_build_dir .. "'" end
+
+ local install_mf = sys.make_path(cmake_build_dir, "install_manifest_" .. component .. ".txt")
+ local mf, err
+ local component_files = {}
+
+ -- collect files installed in this component
+ if sys.exists(install_mf) then
+ mf, err = io.open(install_mf, "r")
+ if not mf then return nil, "Error when opening the CMake installation manifest '" .. install_mf .. "': " .. err end
+ for line in mf:lines() do
+ line = sys.check_separators(line)
+ local file = line:gsub(utils.escape_magic(deploy_dir .. sys.path_separator()), "")
+ table.insert(component_files, file)
+ end
+ mf:close()
+
+ -- add list of component files to the 'dist.info'
+ if #component_files > 0 then info.files[component] = component_files end
+ end
+ end
+-- if bookmark == 0 then return nil, "Package did not install any files!" end
+
+ -- test with ctest
+ if cfg.test then
+ print("Testing " .. sys.extract_name(src_dir) .. " ...")
+ ok = sys.exec("cd " .. sys.quote(deploy_dir) .. " && " .. cfg.test_command)
+ if not ok then return nil, "Error when testing the module '" .. pkg_name .. "' with CTest." end
+ end
+
+ -- save modified 'dist.info' file
+ local pkg_distinfo_dir = sys.make_path(deploy_dir, cfg.distinfos_dir, pkg_name)
+ sys.make_dir(pkg_distinfo_dir)
+ ok, err = mf.save_distinfo(info, sys.make_path(pkg_distinfo_dir, "dist.info"))
+ if not ok then return nil, err end
+
+ -- clean up
+ if not cfg.debug then sys.delete(cmake_build_dir) end
+
+ return true, "Package '" .. pkg_name .. "' successfully builded and deployed to '" .. deploy_dir .. "'."
+end
+
+-- Deploy binary package from 'pkg_dir' to 'deploy_dir' by copying.
+function deploy_binary_pkg(pkg_dir, deploy_dir)
+ deploy_dir = deploy_dir or cfg.root_dir
+
+ assert(type(pkg_dir) == "string", "package.deploy_binary_pkg: Argument 'pkg_dir' is not a string.")
+ assert(type(deploy_dir) == "string", "package.deploy_binary_pkg: Argument 'deploy_dir' is not a string.")
+
+ pkg_dir = sys.abs_path(pkg_dir)
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ -- check for dist.info
+ local info, err = mf.load_distinfo(sys.make_path(pkg_dir, "dist.info"))
+ if not info then return nil, "Error deploying package from '" .. pkg_dir .. "': it doesn't contain valid 'dist.info' file." end
+ local pkg_name = info.name .. "-" .. info.version
+
+ -- if this is only simulation, exit sucessfully, skipping the next actions
+ if cfg.simulate then
+ return true, "Simulated deployment of package '" .. pkg_name .. "' sucessfull."
+ end
+
+ -- copy all components of the module to the deploy_dir
+ for _, component in ipairs(cfg.components) do
+ if info.files[component] then
+ for _, file in ipairs(info.files[component]) do
+ local dest_dir = sys.make_path(deploy_dir, sys.parent_dir(file))
+
+ local ok, err = sys.make_dir(dest_dir)
+ if not ok then return nil, "Error when deploying package '" .. pkg_name .. "': cannot create directory '" .. dest_dir .. "': " .. err end
+
+ ok, err = sys.copy(sys.make_path(pkg_dir, file), dest_dir)
+ if not ok then return nil, "Error when deploying package '" .. pkg_name .. "': cannot copy file '" .. file .. "' to the directory '" .. dest_dir .. "': " .. err end
+ end
+ end
+ end
+
+ -- copy dist.info to register the module as installed
+ local pkg_distinfo_dir = sys.make_path(deploy_dir, cfg.distinfos_dir, pkg_name)
+ sys.make_dir(pkg_distinfo_dir)
+ ok, err = mf.save_distinfo(info, sys.make_path(pkg_distinfo_dir, "dist.info"))
+ if not ok then return nil, err end
+
+ return true, "Package '" .. pkg_name .. "' successfully deployed to '" .. deploy_dir .. "'."
+end
+
+-- Fetch package (table 'pkg') to download_dir. Return the original 'pkg' table
+-- with 'pkg.download_dir' containing path to the directory of the
+-- downloaded package.
+--
+-- When optional 'suppress_printing' parameter is set to true, then messages
+-- for the user won't be printed during run of this function.
+--
+-- If the 'pkg' already contains the information about download directory (pkg.download_dir),
+-- we assume the package was already downloaded there and won't download it again.
+function fetch_pkg(pkg, download_dir, suppress_printing)
+ download_dir = download_dir or sys.current_dir()
+ suppress_printing = suppress_printing or false
+ assert(type(pkg) == "table", "package.fetch_pkg: Argument 'pkg' is not a table.")
+ assert(type(download_dir) == "string", "package.fetch_pkg: Argument 'download_dir' is not a string.")
+ assert(type(suppress_printing) == "boolean", "package.fetch_pkg: Argument 'suppress_printing' is not a boolean.")
+ assert(type(pkg.name) == "string", "package.fetch_pkg: Argument 'pkg.name' is not a string.")
+ assert(type(pkg.version) == "string", "package.fetch_pkg: Argument 'pkg.version' is not a string.")
+
+ -- if the package is already downloaded don't download it again
+ if pkg.download_dir then return pkg end
+
+ assert(type(pkg.path) == "string", "package.fetch_pkg: Argument 'pkg.path' is not a string.")
+ download_dir = sys.abs_path(download_dir)
+
+ local pkg_full_name = pkg.name .. "-" .. pkg.version
+ local repo_url = pkg.path
+ local clone_dir = sys.abs_path(sys.make_path(download_dir, pkg_full_name))
+ pkg.download_dir = clone_dir
+
+ -- check if download_dir already exists, assuming the package was already downloaded
+ if sys.exists(sys.make_path(clone_dir, "dist.info")) then
+ if cfg.cache and not utils.cache_timeout_expired(cfg.cache_timeout, clone_dir) then
+ if not suppress_printing then print("'" .. pkg_full_name .. "' already in cache, skipping downloading (use '-cache=false' to force download).") end
+ return pkg
+ else
+ sys.delete(sys.make_path(clone_dir))
+ end
+ end
+
+ local bin_tag = pkg.version .. "-" .. cfg.arch .. "-" .. cfg.type
+ local use_binary = false
+
+ if cfg.binary then
+ -- check if binary version of the module for this arch & type available
+ local avail_tags, err = git.get_remote_tags(repo_url)
+ if not avail_tags then return nil, err end
+
+ if utils.contains(avail_tags, bin_tag) then
+ use_binary = true
+ end
+ end
+
+ -- init the git repository
+ local ok, err = git.create_repo(clone_dir)
+ if not ok then return nil, err end
+
+ -- Fetch the desired ref (from the pkg's remote repo) and checkout into it.
+
+ if use_binary then
+
+ if not suppress_printing then print("Getting " .. pkg_full_name .. " (binary)...") end
+
+ -- We fetch the binary tag.
+ local sha
+ if ok then sha, err = git.fetch_tag(clone_dir, repo_url, bin_tag) end
+ if sha then ok, err = git.checkout_sha(sha, clone_dir) end
+
+ elseif cfg.source then
+
+ if not suppress_printing then print("Getting " .. pkg_full_name .. " (source)...") end
+
+ -- If we want the 'scm' version, we fetch the 'master' branch, otherwise
+ -- we fetch the tag, matching the desired package version.
+ if ok and pkg.version ~= "scm" then
+ local sha
+ sha, err = git.fetch_tag(clone_dir, repo_url, pkg.version)
+ if sha then ok, err = git.checkout_sha(sha, clone_dir) end
+ elseif ok then
+ local sha
+ sha, err = git.fetch_branch(clone_dir, repo_url, "master")
+ if sha then ok, err = git.checkout_sha(sha, clone_dir) end
+ end
+
+ else
+ ok = false
+ if cfg.binary then
+ err = "Binary version of module not available and using source modules disabled."
+ else
+ err = "Using both binary and source modules disabled."
+ end
+ end
+
+ if not ok then
+ -- clean up
+ if not cfg.debug then sys.delete(clone_dir) end
+ return nil, "Error fetching package '" .. pkg_full_name .. "' from '" .. pkg.path .. "' to '" .. download_dir .. "': " .. err
+ end
+
+ -- delete '.git' directory
+ if not cfg.debug then sys.delete(sys.make_path(clone_dir, ".git")) end
+
+ return pkg
+end
+
+-- Return table with information about available versions of 'package'.
+--
+-- When optional 'suppress_printing' parameter is set to true, then messages
+-- for the user won't be printed during run of this function.
+function retrieve_versions(package, manifest, suppress_printing)
+ suppress_printing = suppress_printing or false
+ assert(type(package) == "string", "package.retrieve_versions: Argument 'string' is not a string.")
+ assert(type(manifest) == "table", "package.retrieve_versions: Argument 'manifest' is not a table.")
+ assert(type(suppress_printing) == "boolean", "package.retrieve_versions: Argument 'suppress_printing' is not a boolean.")
+
+ -- get package table
+ local pkg_name = depends.split_name_constraint(package)
+ local tmp_packages = depends.find_packages(pkg_name, manifest)
+
+ if #tmp_packages == 0 then
+ return nil, "No suitable candidate for package '" .. package .. "' found."
+ else
+ package = tmp_packages[1]
+ end
+
+ -- if the package's already downloaded, we assume it's desired to install the downloaded version
+ if package.download_dir then
+ local pkg_type = "binary"
+ if is_source_type(package.download_dir) then pkg_type = "source" end
+ if not suppress_printing then print("Using " .. package.name .. "-" .. package.version .. " (" .. pkg_type .. ") provided by " .. package.download_dir) end
+ return {package}
+ end
+
+ if not suppress_printing then print("Finding out available versions of " .. package.name .. "...") end
+
+ -- get available versions
+ local tags, err = git.get_remote_tags(package.path)
+ if not tags then return nil, "Error when retrieving versions of package '" .. package.name .. "': " .. err end
+
+ -- filter out tags of binary packages
+ local versions = utils.filter(tags, function (tag) return tag:match("^[^%-]+%-?[^%-]*$") and true end)
+
+ packages = {}
+
+ -- create package information
+ for _, version in pairs(versions) do
+ pkg = {}
+ pkg.name = package.name
+ pkg.version = version
+ pkg.path = package.path
+ table.insert(packages, pkg)
+ end
+
+ return packages
+end
+
+-- Return table with information from package's dist.info and path to downloaded
+-- package. Optional argument 'deploy_dir' is used just as a temporary
+-- place to place the downloaded packages into.
+--
+-- When optional 'suppress_printing' parameter is set to true, then messages
+-- for the user won't be printed during the execution of this function.
+function retrieve_pkg_info(package, deploy_dir, suppress_printing)
+ deploy_dir = deploy_dir or cfg.root_dir
+ assert(type(package) == "table", "package.retrieve_pkg_info: Argument 'package' is not a table.")
+ assert(type(deploy_dir) == "string", "package.retrieve_pkg_info: Argument 'deploy_dir' is not a string.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local tmp_dir = sys.abs_path(sys.make_path(deploy_dir, cfg.temp_dir))
+
+ -- download the package
+ local fetched_pkg, err = fetch_pkg(package, tmp_dir, suppress_printing)
+ if not fetched_pkg then return nil, "Error when retrieving the info about '" .. package.name .. "': " .. err end
+
+ -- load information from 'dist.info'
+ local info, err = mf.load_distinfo(sys.make_path(fetched_pkg.download_dir, "dist.info"))
+ if not info then return nil, err end
+
+ -- add other attributes
+ if package.path then info.path = package.path end
+ if package.was_scm_version then info.was_scm_version = package.was_scm_version end
+
+ -- set default arch/type if not explicitly stated and package is of source type
+ if is_source_type(fetched_pkg.download_dir) then
+ info = ensure_source_arch_and_type(info)
+ elseif not (info.arch and info.type) then
+ return nil, fetched_pkg.download_dir .. ": binary package missing arch or type in 'dist.info'."
+ end
+
+ return info, fetched_pkg.download_dir
+end
+
+-- Return manifest, augmented with info about all available versions
+-- of package 'pkg'. Optional argument 'deploy_dir' is used just as a temporary
+-- place to place the downloaded packages into.
+-- Optional argument 'installed' is manifest of all installed packages. When
+-- specified, info from installed packages won't be downloaded from repo,
+-- but the dist.info from installed package will be used.
+function get_versions_info(pkg, manifest, deploy_dir, installed)
+ deploy_dir = deploy_dir or cfg.root_dir
+ assert(type(pkg) == "string", "package.get_versions_info: Argument 'pkg' is not a string.")
+ assert(type(manifest) == "table", "package.get_versions_info: Argument 'manifest' is not a table.")
+ assert(type(deploy_dir) == "string", "package.get_versions_info: Argument 'deploy_dir' is not a string.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ -- find all available versions of package
+ local versions, err = retrieve_versions(pkg, manifest)
+ if not versions then return nil, err end
+
+ -- collect info about all retrieved versions
+ local infos = {}
+ for _, version in pairs(versions) do
+
+ local info, path_or_err
+ local installed_version = {}
+
+ -- find out whether this 'version' is installed so we can use it's dist.info
+ if type(installed) == "table" then installed_version = depends.find_packages(version.name .. "-" .. version.version, installed) end
+
+ -- get info
+ if #installed_version > 0 then
+ print("Using dist.info from installed " .. version.name .. "-" .. version.version)
+ info = installed_version[1]
+ info.path = version.path
+ info.from_installed = true -- flag that dist.info of installed package was used
+ else
+ info, path_or_err = retrieve_pkg_info(version, deploy_dir)
+ if not info then return nil, path_or_err end
+ sys.delete(path_or_err)
+ end
+ table.insert(infos, info)
+ end
+
+ -- found and add an implicit 'scm' version
+ local pkg_name = depends.split_name_constraint(pkg)
+ local found = depends.find_packages(pkg_name, manifest)
+ if #found == 0 then return nil, "No suitable candidate for package '" .. pkg .. "' found." end
+ local scm_info, path_or_err = retrieve_pkg_info({name = pkg_name, version = "scm", path = found[1].path})
+ if not scm_info then return nil, path_or_err end
+ sys.delete(path_or_err)
+ scm_info.version = "scm"
+ table.insert(infos, scm_info)
+
+ local tmp_manifest = utils.deepcopy(manifest)
+
+ -- add collected info to the temp. manifest, replacing existing tables
+ for _, info in pairs(infos) do
+ local already_in_manifest = false
+ -- find if this version is already in manifest
+ for idx, pkg in ipairs(tmp_manifest) do
+ -- if yes, replace it
+ if pkg.name == info.name and pkg.version == info.version then
+ tmp_manifest[idx] = info
+ already_in_manifest = true
+ break
+ end
+ end
+ -- if not, just normally add to the manifest
+ if not already_in_manifest then
+ table.insert(tmp_manifest, info)
+ end
+ end
+
+ return tmp_manifest
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/sys.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/sys.lua
new file mode 100644
index 0000000..803df12
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/sys.lua
@@ -0,0 +1,386 @@
+-- System functions
+
+module ("dist.sys", package.seeall)
+
+local cfg = require "dist.config"
+local utils = require "dist.utils"
+local lfs = require "lfs"
+
+-- Return the path separator according to the platform.
+function path_separator()
+ if cfg.arch == "Windows" then
+ return "\\"
+ else
+ return "/"
+ end
+end
+
+-- Return path with wrong separators replaced with the right ones.
+function check_separators(path)
+ assert(type(path) == "string", "sys.check_separators: Argument 'path' is not a string.")
+ if cfg.arch == "Windows" then
+ return path:gsub("/", "\\")
+ else
+ return path
+ end
+end
+
+-- Return the path with the unnecessary trailing separator removed.
+function remove_trailing(path)
+ assert(type(path) == "string", "sys.remove_trailing: Argument 'path' is not a string.")
+ if path:sub(-1) == path_separator() and not is_root(path) then path = path:sub(1,-2) end
+ return path
+end
+
+-- Return the path with the all occurences of '/.' or '\.' (representing
+-- the current directory) removed.
+function remove_curr_dir_dots(path)
+ assert(type(path) == "string", "sys.remove_curr_dir_dots: Argument 'path' is not a string.")
+ while path:match(path_separator() .. "%." .. path_separator()) do -- match("/%./")
+ path = path:gsub(path_separator() .. "%." .. path_separator(), path_separator()) -- gsub("/%./", "/")
+ end
+ return path:gsub(path_separator() .. "%.$", "") -- gsub("/%.$", "")
+end
+
+-- Return string argument quoted for a command line usage.
+function quote(argument)
+ assert(type(argument) == "string", "sys.quote: Argument 'argument' is not a string.")
+
+ -- TODO: This seems like a not very nice hack. Why is it needed?
+ -- Wouldn't it be better to fix the problem where it originates?
+ -- replace '/' path separators for '\' on Windows
+ if cfg.arch == "Windows" and argument:match("^[%u%U.]?:?[/\\].*") then
+ argument = argument:gsub("//","\\"):gsub("/","\\")
+ end
+
+ -- Windows doesn't recognize paths starting with two slashes or backslashes
+ -- so we double every backslash except for the first one
+ if cfg.arch == "Windows" and argument:match("^[/\\].*") then
+ local prefix = argument:sub(1,1)
+ argument = argument:sub(2):gsub("\\", "\\\\")
+ argument = prefix .. argument
+ else
+ argument = argument:gsub("\\", "\\\\")
+ end
+ argument = argument:gsub('"', '\\"')
+
+ return '"' .. argument .. '"'
+end
+
+-- Run the system command (in current directory).
+-- Return true on success, nil on fail and log string.
+-- When optional 'force_verbose' parameter is true, then the output will be shown
+-- even when not in debug or verbose mode.
+function exec(command, force_verbose)
+ force_verbose = force_verbose or false
+ assert(type(command) == "string", "sys.exec: Argument 'command' is not a string.")
+ assert(type(force_verbose) == "boolean", "sys.exec: Argument 'force_verbose' is not a boolean.")
+
+ if not (cfg.verbose or cfg.debug or force_verbose) then
+ if cfg.arch == "Windows" then
+ command = command .. " > NUL 2>&1"
+ else
+ command = command .. " > /dev/null 2>&1"
+ end
+ end
+
+ if cfg.debug then print("Executing the command: " .. command) end
+ local ok, str, status = os.execute(command)
+
+ -- os.execute returned values on failure are:
+ -- nil or true, "exit", n or true, "signal", n for lua >= 5.2
+ -- status ~= 0 for lua 5.x < 5.2
+ if ok == nil or (str == "exit" and status ~= 0) or str == "signal" or (ok ~= 0 and ok ~= true) then
+ return nil, "Error when running the command: " .. command
+ else
+ return true, "Sucessfully executed the command: " .. command
+ end
+end
+
+-- Execute the 'command' and returns its output as a string.
+function capture_output(command)
+ assert(type(command) == "string", "sys.exec: Argument 'command' is not a string.")
+
+ local executed, err = io.popen(command, "r")
+ if not executed then return nil, "Error running the command '" .. command .. "':" .. err end
+
+ local captured, err = executed:read("*a")
+ if not captured then return nil, "Error reading the output of command '" .. command .. "':" .. err end
+
+ executed:close()
+ return captured
+end
+
+-- Return whether the path is a root.
+function is_root(path)
+ assert(type(path) == "string", "sys.is_root: Argument 'path' is not a string.")
+ return utils.to_boolean(path:find("^[a-zA-Z]:[/\\]$") or path:find("^[/\\]$"))
+end
+
+-- Return whether the path is absolute.
+function is_abs(path)
+ assert(type(path) == "string", "sys.is_abs: Argument 'path' is not a string.")
+ return utils.to_boolean(path:find("^[a-zA-Z]:[/\\].*$") or path:find("^[/\\].*$"))
+end
+
+-- Return whether the specified file or directory exists.
+function exists(path)
+ assert(type(path) == "string", "sys.exists: Argument 'path' is not a string.")
+ local attr, err = lfs.attributes(path)
+ return utils.to_boolean(attr), err
+end
+
+-- Return whether the 'file' exists and is a file.
+function is_file(file)
+ assert(type(file) == "string", "sys.is_file: Argument 'file' is not a string.")
+ return lfs.attributes(file, "mode") == "file"
+end
+
+-- Return whether the 'dir' exists and is a directory.
+function is_dir(dir)
+ assert(type(dir) == "string", "sys.is_dir: Argument 'dir' is not a string.")
+ return lfs.attributes(dir, "mode") == "directory"
+end
+
+-- Return the current working directory
+function current_dir()
+ local dir, err = lfs.currentdir()
+ if not dir then return nil, err end
+ return dir
+end
+
+-- Return an iterator over the directory 'dir'.
+-- If 'dir' doesn't exist or is not a directory, return nil and error message.
+function get_directory(dir)
+ dir = dir or current_dir()
+ assert(type(dir) == "string", "sys.get_directory: Argument 'dir' is not a string.")
+ if is_dir(dir) then
+ return lfs.dir(dir)
+ else
+ return nil, "Error: '".. dir .. "' is not a directory."
+ end
+end
+
+-- Extract file or directory name from its path.
+function extract_name(path)
+ assert(type(path) == "string", "sys.extract_name: Argument 'path' is not a string.")
+ if is_root(path) then return path end
+
+ path = remove_trailing(path)
+ path = path:gsub("^.*" .. path_separator(), "")
+ return path
+end
+
+-- Return parent directory of the 'path' or nil if there's no parent directory.
+-- If 'path' is a path to file, return the directory the file is in.
+function parent_dir(path)
+ assert(type(path) == "string", "sys.parent_dir: Argument 'path' is not a string.")
+ path = remove_curr_dir_dots(path)
+ path = remove_trailing(path)
+
+ local dir = path:gsub(utils.escape_magic(extract_name(path)) .. "$", "")
+ if dir == "" then
+ return nil
+ else
+ return make_path(dir)
+ end
+end
+
+-- Returns the table of all parent directories of 'path' up to the directory
+-- specified by 'boundary_path' (exclusive).
+function parents_up_to(path, boundary_path)
+ assert(type(path) == "string", "sys.parents_up_to: Argument 'path' is not a string.")
+ assert(type(boundary_path) == "string", "sys.parents_up_to: Argument 'boundary_path' is not a string.")
+ boundary_path = remove_trailing(boundary_path)
+
+ -- helper function to recursively collect the parent directories
+ local function collect_parents(_path, _parents)
+ local _parent = parent_dir(_path)
+ if _parent and _parent ~= boundary_path then
+ table.insert(_parents, _parent)
+ return collect_parents(_parent, _parents)
+ else
+ return _parents
+ end
+ end
+
+ return collect_parents(path, {})
+end
+
+-- Compose path composed from specified parts or current
+-- working directory when no part specified.
+function make_path(...)
+ -- arg is deprecated in lua 5.2 in favor of table.pack we mimic here
+ local arg = {n=select('#',...),...}
+ local parts = arg
+ assert(type(parts) == "table", "sys.make_path: Argument 'parts' is not a table.")
+
+ local path, err
+ if parts.n == 0 then
+ path, err = current_dir()
+ else
+ path, err = table.concat(parts, path_separator())
+ end
+ if not path then return nil, err end
+
+ -- squeeze repeated occurences of a file separator
+ path = path:gsub(path_separator() .. "+", path_separator())
+
+ -- remove unnecessary trailing path separator
+ path = remove_trailing(path)
+
+ return path
+end
+
+-- Return absolute path from 'path'
+function abs_path(path)
+ assert(type(path) == "string", "sys.get_abs_path: Argument 'path' is not a string.")
+ if is_abs(path) then return path end
+
+ local cur_dir, err = current_dir()
+ if not cur_dir then return nil, err end
+
+ return make_path(cur_dir, path)
+end
+
+-- Returns path to the temporary directory of OS.
+function tmp_dir()
+ return os.getenv("TMPDIR") or os.getenv("TEMP") or os.getenv("TMP") or "/tmp"
+end
+
+-- Returns temporary file (or directory) path (with optional prefix).
+function tmp_name(prefix)
+ prefix = prefix or ""
+ assert(type(prefix) == "string", "sys.tmp_name: Argument 'prefix' is not a string.")
+ return make_path(tmp_dir(), prefix .. "luadist_" .. utils.rand(10000000000))
+end
+
+-- Return table of all paths in 'dir'
+function get_file_list(dir)
+ dir = dir or current_dir()
+ assert(type(dir) == "string", "sys.get_directory: Argument 'dir' is not a string.")
+ if not exists(dir) then return nil, "Error getting file list of '" .. dir .. "': directory doesn't exist." end
+
+ local function collect(path, all_paths)
+ for item in get_directory(path) do
+
+ local item_path = make_path(path, item)
+ local _, last = item_path:find(dir .. path_separator(), 1, true)
+ local path_to_insert = item_path:sub(last + 1)
+
+ if is_file(item_path) then
+ table.insert(all_paths, path_to_insert)
+ elseif is_dir(item_path) and item ~= "." and item ~= ".." then
+ table.insert(all_paths, path_to_insert)
+ collect(item_path, all_paths)
+ end
+ end
+ end
+
+ local all_paths = {}
+ collect(dir, all_paths)
+
+ return all_paths
+end
+
+-- Return time of the last modification of 'file'.
+function last_modification_time(file)
+ assert(type(file) == "string", "sys.last_modification_time: Argument 'file' is not a string.")
+ return lfs.attributes(file, "modification")
+end
+
+-- Return the current time (in seconds since epoch).
+function current_time()
+ return os.time()
+end
+
+-- Change the current working directory and return 'true' and previous working
+-- directory on success and 'nil' and error message on error.
+function change_dir(dir_name)
+ assert(type(dir_name) == "string", "sys.change_dir: Argument 'dir_name' is not a string.")
+ local prev_dir = current_dir()
+ local ok, err = lfs.chdir(dir_name)
+ if ok then
+ return ok, prev_dir
+ else
+ return nil, err
+ end
+end
+
+-- Make a new directory, making also all of its parent directories that doesn't exist.
+function make_dir(dir_name)
+ assert(type(dir_name) == "string", "sys.make_dir: Argument 'dir_name' is not a string.")
+ if exists(dir_name) then
+ return true
+ else
+ local par_dir = parent_dir(dir_name)
+ if par_dir then
+ local ok, err = make_dir(par_dir)
+ if not ok then return nil, err end
+ end
+ return lfs.mkdir(dir_name)
+ end
+end
+
+-- Move file (or directory) to the destination directory
+function move_to(file_or_dir, dest_dir)
+ assert(type(file_or_dir) == "string", "sys.move_to: Argument 'file_or_dir' is not a string.")
+ assert(type(dest_dir) == "string", "sys.move_to: Argument 'dest_dir' is not a string.")
+ assert(is_dir(dest_dir), "sys.move_to: Destination '" .. dest_dir .."' is not a directory.")
+
+ -- Extract file/dir name from its path
+ local file_or_dir_name = extract_name(file_or_dir)
+
+ return os.rename(file_or_dir, make_path(dest_dir, file_or_dir_name))
+end
+
+-- rename file (or directory) to the new name.
+function rename(file, new_name)
+ assert(type(file) == "string", "sys.rename: Argument 'file' is not a string.")
+ assert(type(new_name) == "string", "sys.rename: Argument 'new_name' is not a string.")
+ assert(not exists(new_name), "sys.rename: desired filename already exists.")
+
+ return os.rename(file, new_name)
+end
+
+-- Copy 'source' to the destination directory 'dest_dir'.
+-- If 'source' is a directory, then recursive copying is used.
+-- For non-recursive copying of directories use the make_dir() function.
+function copy(source, dest_dir)
+ assert(type(source) == "string", "sys.copy: Argument 'file_or_dir' is not a string.")
+ assert(type(dest_dir) == "string", "sys.copy: Argument 'dest_dir' is not a string.")
+ assert(is_dir(dest_dir), "sys.copy: destination '" .. dest_dir .."' is not a directory.")
+
+ if cfg.arch == "Windows" then
+ if is_dir(source) then
+ make_dir(make_path(dest_dir, extract_name(source)))
+ return exec("xcopy /E /I /Y /Q " .. quote(source) .. " " .. quote(dest_dir .. "\\" .. extract_name(source)))
+ else
+ return exec("copy /Y " .. quote(source) .. " " .. quote(dest_dir))
+ end
+ else
+ if is_dir(source) then
+ return exec("cp -fRH " .. quote(source) .. " " .. quote(dest_dir))
+ else
+ return exec("cp -fH " .. quote(source) .. " " .. quote(dest_dir))
+ end
+ end
+end
+
+-- Delete the specified file or directory
+function delete(path)
+ assert(type(path) == "string", "sys.delete: Argument 'path' is not a string.")
+ assert(is_abs(path), "sys.delete: Argument 'path' is not an absolute path.")
+
+ if cfg.arch == "Windows" then
+ if not exists(path) then
+ return true
+ elseif is_file(path) then
+ return os.remove(path)
+ else
+ return exec("rd /S /Q " .. quote(path))
+ end
+ else
+ return exec("rm -rf " .. quote(path))
+ end
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/utils.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/utils.lua
new file mode 100644
index 0000000..392654c
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/dist/utils.lua
@@ -0,0 +1,151 @@
+-- System functions
+
+module ("dist.utils", package.seeall)
+
+local sys = require "dist.sys"
+
+-- Returns a deep copy of 'table' with reference to the same metadata table.
+-- Source: http://lua-users.org/wiki/CopyTable
+function deepcopy(object)
+ local lookup_table = {}
+ local function _copy(object)
+ if type(object) ~= "table" then
+ return object
+ elseif lookup_table[object] then
+ return lookup_table[object]
+ end
+ local new_table = {}
+ lookup_table[object] = new_table
+ for index, value in pairs(object) do
+ new_table[_copy(index)] = _copy(value)
+ end
+ return setmetatable(new_table, getmetatable(object))
+ end
+ return _copy(object)
+end
+
+-- Return deep copy of table 'array', containing only items for which 'predicate_fn' returns true.
+function filter(array, predicate_fn)
+ assert(type(array) == "table", "utils.filter: Argument 'array' is not a table.")
+ assert(type(predicate_fn) == "function", "utils.filter: Argument 'predicate_fn' is not a function.")
+ local filtered = {}
+ for _,v in pairs(array) do
+ if predicate_fn(v) == true then table.insert(filtered, deepcopy(v)) end
+ end
+ return filtered
+end
+
+-- Return deep copy of table 'array', sorted according to the 'compare_fn' function.
+function sort(array, compare_fn)
+ assert(type(array) == "table", "utils.sort: Argument 'array' is not a table.")
+ assert(type(compare_fn) == "function", "utils.sort: Argument 'compare_fn' is not a function.")
+ local sorted = deepcopy(array)
+ table.sort(sorted, compare_fn)
+ return sorted
+end
+
+-- Return whether the 'value' is in the table 'tbl'.
+function contains(tbl, value)
+ assert(type(tbl) == "table", "utils.contains: Argument 'tbl' is not a table.")
+ for _,v in pairs(tbl) do
+ if v == value then return true end
+ end
+ return false
+end
+
+-- Return single line string consisting of values in 'tbl' separated by comma.
+-- Used for printing the dependencies/provides/conflicts.
+function table_tostring(tbl, label)
+ assert(type(tbl) == "table", "utils.table_tostring: Argument 'tbl' is not a table.")
+ local str = ""
+ for k,v in pairs(tbl) do
+ if type(v) == "table" then
+ str = str .. table_tostring(v, k)
+ else
+ if label ~= nil then
+ str = str .. tostring(v) .. " [" .. tostring(label) .. "]" .. ", "
+ else
+ str = str .. tostring(v) .. ", "
+ end
+ end
+ end
+ return str
+end
+
+-- Return table made up from values of the string, separated by separator.
+function make_table(str, separator)
+ assert(type(str) == "string", "utils.make_table: Argument 'str' is not a string.")
+ assert(type(separator) == "string", "utils.make_table: Argument 'separator' is not a string.")
+
+ local tbl = {}
+ for val in str:gmatch("(.-)" .. separator) do
+ table.insert(tbl, val)
+ end
+ local last_val = str:gsub(".-" .. separator, "")
+ if last_val and last_val ~= "" then
+ table.insert(tbl, last_val)
+ end
+ return tbl
+end
+
+-- Return whether the 'cache_timeout' for 'file' has expired.
+function cache_timeout_expired(cache_timeout, file)
+ assert(type(cache_timeout) == "number", "utils.cache_timeout_expired: Argument 'cache_timeout' is not a number.")
+ assert(type(file) == "string", "utils.cache_timeout_expired: Argument 'file' is not a string.")
+ return sys.last_modification_time(file) + cache_timeout < sys.current_time()
+end
+
+-- Return the string 'str', with all magic (pattern) characters escaped.
+function escape_magic(str)
+ assert(type(str) == "string", "utils.escape: Argument 'str' is not a string.")
+ local escaped = str:gsub('[%-%.%+%[%]%(%)%^%%%?%*%^%$]','%%%1')
+ return escaped
+end
+
+-- Return the boolean representation of an 'arg'.
+function to_boolean(arg)
+ return not not arg
+end
+
+
+math.randomseed(os.time())
+
+-- Return pseudo-random number in range [0, 1], [1, n] or [n, m].
+function rand(...)
+ return math.random(...)
+end
+
+-- Perform check of system dependency, which isn't provided in the LuaDist
+-- installation itself and if it is missing, print instructions how
+-- to install it. The 'command' is used for testing, 'name' when printing
+-- information to the user.
+function system_dependency_available(name, command)
+ assert(type(name) == "string", "utils.system_dependency_available: Argument 'name' is not a string.")
+ assert(type(command) == "string", "utils.system_dependency_available: Argument 'command' is not a string.")
+
+ if not sys.exec(command) then
+ print("Error: command '" .. name .. "' not found on system. See installation instructions at\nhttps://github.com/LuaDist/Repository/wiki/Installation-of-System-Dependencies")
+ return false
+ end
+
+ return true
+end
+
+-- Obtain LuaDist location by checking available package locations
+function get_luadist_location()
+ local paths = {}
+ local path = package.path:gsub("([^;]+)", function(c) table.insert(paths, c) end)
+
+ for _, path in pairs(paths) do
+ if (sys.is_abs(path) and path:find("[/\\]lib[/\\]lua[/\\]%?.lua$")) then
+ -- Remove path to lib/lua
+ path = path:gsub("[/\\]lib[/\\]lua[/\\]%?.lua$", "")
+ -- Clean the path up a bit
+ path = path:gsub("[/\\]bin[/\\]%.[/\\]%.%.", "")
+ path = path:gsub("[/\\]bin[/\\]%.%.", "")
+ return path
+ end
+ end
+ return nil
+end
+
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/git.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/git.lua
new file mode 100644
index 0000000..96b4058
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/git.lua
@@ -0,0 +1,5 @@
+require 'git.util'
+require 'git.objects'
+require 'git.pack'
+require 'git.repo'
+require 'git.protocol'
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/git/objects.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/git/objects.lua
new file mode 100644
index 0000000..85de9b0
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/git/objects.lua
@@ -0,0 +1,121 @@
+local util = require 'git.util'
+
+local assert, next, io, print, os, type, string, pairs, tostring =
+ assert, next, io, print, os, type, string, pairs, tostring
+local join_path = git.util.join_path
+
+local require = require
+
+local isPosix = package.config:sub(1,1) == '/' -- wild guess
+
+module(...)
+
+Commit = {}
+Commit.__index = Commit
+
+function Commit:tree()
+ return self.repo:tree(self.tree_sha)
+end
+
+function Commit:checkout(path)
+ assert(path, 'path argument missing')
+ self:tree():checkoutTo(path)
+end
+
+
+Tree = {}
+Tree.__index = function (t,k)
+ if Tree[k] then return Tree[k] end
+ return t:entry(k)
+end
+
+function Tree:entries()
+ return function(t, n)
+ local n, entry = next(t, n)
+ if entry then
+ local object
+ if entry.type == 'tree' then
+ object = self.repo:tree(entry.id)
+ elseif entry.type == 'blob' then
+ object = self.repo:blob(entry.id)
+ object.mode = entry.mode
+ elseif entry.type == 'commit' then
+ -- this is possibly a commit in a submodule,
+ -- do not retrieve it from current repo
+ object = entry
+ else
+ error('Unknown entry type: ' .. entry.type)
+ end
+ return n, entry.type, object
+ end
+ end, self._entries
+end
+
+function Tree:entry(n)
+ local e = self._entries[n]
+ if not e then return end
+ if e.type == 'tree' then
+ return self.repo:tree(e.id)
+ elseif e.type == 'commit' then
+ return self.repo:commit(e.id)
+ elseif e.type == 'blob' then
+ return self.repo:blob(e.id)
+ else
+ error('Unknown entry type: ' .. e.type)
+ end
+end
+
+function Tree:walk(func, path)
+ path = path or '.'
+ assert(type(func) == "function", "argument is not a function")
+ local function walk(tree, path)
+ for name, type, entry in tree:entries() do
+ local entry_path = join_path(path, name)
+ func(entry, entry_path, type)
+
+ if type == "tree" then
+ walk(entry, entry_path)
+ end
+ end
+ end
+ walk(self, path)
+end
+
+function Tree:checkoutTo(path)
+ util.make_dir(path)
+ self:walk(function (entry, entry_path, type)
+ if type == 'tree' then
+ util.make_dir(entry_path)
+ elseif type == 'blob' then
+ local out = assert(io.open(entry_path, 'wb'))
+ out:write(entry:content())
+ out:close()
+ if isPosix then
+ local mode = entry.mode:sub(-3,-1) -- fixme: is this ok?
+ local cmd = 'chmod '..mode..' "'..entry_path..'"'
+ os.execute(cmd)
+ end
+ elseif type == 'commit' then
+ -- this is a submodule referencing a commit,
+ -- make a directory for it
+ util.make_dir(entry_path)
+ else
+ error('Unknown entry type: ', type)
+ end
+ end, path)
+end
+
+Blob = {}
+Blob.__index = Blob
+
+function Blob:content()
+ if self.stored then
+ local f = self.repo:raw_object(self.id)
+ local ret = f:read('*a') or ""
+ f:close()
+ return ret
+ else
+ return self.data
+ end
+end
+
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/git/pack.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/git/pack.lua
new file mode 100644
index 0000000..f1597c3
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/git/pack.lua
@@ -0,0 +1,316 @@
+local io = io
+local core = require 'git.core'
+
+local assert, pcall, print, select, setmetatable, string, type, unpack =
+ assert, pcall, print, select, setmetatable, string, type, unpack
+
+local ord = string.byte
+local fmt = string.format
+local concat, insert = table.concat, table.insert
+
+local band = core.band
+local rshift, lshift = core.rshift, core.lshift
+
+local to_hex = git.util.to_hex
+local from_hex = git.util.from_hex
+local object_sha = git.util.object_sha
+local binary_sha = git.util.binary_sha
+local readable_sha = git.util.readable_sha
+local tmpfile = git.util.tmpfile
+local reader = git.util.reader
+
+module(...)
+
+-- read git/Documentation/technical/pack-format.txt for some inspiration
+
+-- 1 = commit, 2 = tree ...
+local types = {'commit', 'tree', 'blob', 'tag', '???', 'ofs_delta', 'ref_delta'}
+
+-- read a 4 byte unsigned integer stored in network order
+local function read_int(f)
+ local s = f:read(4)
+ local a,b,c,d = s:byte(1,4)
+ return a*256^3 + b*256^2 + c*256 + d
+end
+
+-- read in the type and file length
+local function read_object_header(f)
+ local b = ord(f:read(1))
+ local type = band(rshift(b, 4), 0x7)
+ local len = band(b, 0xF)
+ local ofs = 0
+ while band(b, 0x80) ~= 0 do
+ b = ord(f:read(1))
+ len = len + lshift(band(b, 0x7F), ofs * 7 + 4)
+ ofs = ofs + 1
+ end
+ return len, type
+end
+
+-- reads in the delta header and returns the offset where original data is stored
+local function read_delta_header(f)
+ local b = ord(f:read(1))
+ local offset = band(b, 0x7F)
+ while band(b, 0x80) ~= 0 do
+ offset = offset + 1
+ b = ord(f:read(1))
+ offset = lshift(offset, 7) + band(b, 0x7F)
+ end
+ return offset
+end
+
+-- read just enough of file `f` to uncompress `size` bytes
+local function uncompress_by_len(f, size)
+ local z = core.inflate()
+ local chunks = {}
+ local CHUNK_SIZE = 1024
+ local curr_pos = f:seek()
+ local inflated, eof, total
+ -- read until end of zlib-compresed stream
+ while not eof do
+ local data = f:read(CHUNK_SIZE)
+ inflated, eof, total = z(data)
+ insert(chunks, inflated)
+ end
+ -- repair the current position in stream
+ f:seek('set', curr_pos + total)
+ return concat(chunks)
+end
+
+-- uncompress the object from the current location in `f`
+local function unpack_object(f, len, type)
+ local data = uncompress_by_len(f, len)
+ return data, len, type
+end
+
+-- returns a size value encoded in delta data
+local function delta_size(f)
+ local size = 0
+ local i = 0
+ repeat
+ local b = ord(f:read(1))
+ size = size + lshift(band(b, 0x7F), i)
+ i = i + 7
+ until band(b, 0x80) == 0
+ return size
+end
+
+-- returns a patched object from string `base` according to `delta` data
+local function patch_object(base, delta, base_type)
+ -- insert delta codes into temporary file
+ local df = reader(delta)
+
+ -- retrieve original and result size (for checks)
+ local orig_size = delta_size(df)
+ assert(#base == orig_size, fmt('#base(%d) ~= orig_size(%d)', #base, orig_size))
+
+ local result_size = delta_size(df)
+ local size = result_size
+
+ local result = {}
+
+ -- process the delta codes
+ local cmd = df:read(1)
+ while cmd do
+ cmd = ord(cmd)
+ if cmd == 0 then
+ error('unexpected delta code 0')
+ elseif band(cmd, 0x80) ~= 0 then -- copy a selected part of base data
+ local cp_off, cp_size = 0, 0
+ -- retrieve offset
+ if band(cmd, 0x01) ~= 0 then cp_off = ord(df:read(1)) end
+ if band(cmd, 0x02) ~= 0 then cp_off = cp_off + ord(df:read(1))*256 end
+ if band(cmd, 0x04) ~= 0 then cp_off = cp_off + ord(df:read(1))*256^2 end
+ if band(cmd, 0x08) ~= 0 then cp_off = cp_off + ord(df:read(1))*256^3 end
+ -- retrieve size
+ if band(cmd, 0x10) ~= 0 then cp_size = ord(df:read(1)) end
+ if band(cmd, 0x20) ~= 0 then cp_size = cp_size + ord(df:read(1))*256 end
+ if band(cmd, 0x40) ~= 0 then cp_size = cp_size + ord(df:read(1))*256^2 end
+ if cp_size == 0 then cp_size = 0x10000 end
+ if cp_off + cp_size > #base or cp_size > size then break end
+ -- get the data and append it to result
+ local data = base:sub(cp_off + 1, cp_off + cp_size)
+ insert(result, data)
+ size = size - cp_size
+ else -- insert new data
+ if cmd > size then break end
+ local data = df:read(cmd)
+ insert(result, data)
+ size = size - cmd
+ end
+ cmd = df:read(1)
+ end
+
+ df:close()
+
+ result = concat(result)
+ assert(#result == result_size, fmt('#result(%d) ~= result_size(%d)', #result, result_size))
+ return result, result_size, base_type
+end
+
+Pack = {}
+Pack.__index = Pack
+
+-- read an object from the current location in pack, or from a specific `offset`
+-- if specified
+function Pack:read_object(offset, ignore_data)
+ local f = self.pack_file
+ if offset then
+ f:seek('set', offset)
+ end
+ local curr_pos = f:seek()
+
+ local len, type = read_object_header(f)
+ if type < 5 then -- commit, tree, blob, tag
+ return unpack_object(f, len, type)
+ elseif type == 6 then -- ofs_delta
+ local offset = read_delta_header(f)
+ local delta_data = uncompress_by_len(f, len)
+ if not ignore_data then
+ -- the offset is negative from the current location
+ local base, base_len, base_type = self:read_object(curr_pos - offset)
+ return patch_object(base, delta_data, base_type)
+ end
+ elseif type == 7 then -- ref_delta
+ local sha = f:read(20)
+ local delta_data = uncompress_by_len(f, len)
+ if not ignore_data then
+ -- lookup the object in the pack by sha
+ -- FIXME: maybe lookup in repo/other packs
+ local base_offset = self.index[binary_sha(sha)]
+ local base, base_len, base_type = self:read_object(base_offset)
+ return patch_object(base, delta_data, base_type)
+ end
+ else
+ error('unknown object type: '..type)
+ end
+end
+
+-- returns true if this pack contains the given object
+function Pack:has_object(sha)
+ return self.index[binary_sha(sha)] ~= nil
+end
+
+-- if the object name `sha` exists in the pack, returns a temporary file with the
+-- object content, length and type, otherwise returns nil
+function Pack:get_object(sha)
+ local offset = self.index[binary_sha(sha)]
+ if not offset then
+ print('!!! Failed to find object', readable_sha(sha))
+ end
+
+ local data, len, type = self:read_object(offset)
+ print(readable_sha(sha), len, type, data)
+ local f = tmpfile()
+ f:write(data)
+ f:seek('set', 0)
+
+ return f, len, types[type]
+end
+
+function Pack:unpack(repo)
+ for i=1, self.nobjects do
+ local offset = self.offsets[i]
+ local data, len, type = self:read_object(offset)
+ repo:store_object(data, len, types[type])
+ end
+end
+
+-- parses the index
+function Pack:parse_index(index_file)
+ local f = index_file
+
+ local head = f:read(4)
+ assert(head == '\255tOc', "Incorrect header: " .. head)
+ local version = read_int(f)
+ assert(version == 2, "Incorrect version: " .. version)
+
+ -- first the fanout table (how many objects are in the index, whose
+ -- first byte is below or equal to i)
+ local fanout = {}
+ for i=0, 255 do
+ local nobjs = read_int(f)
+ fanout[i] = nobjs
+ end
+
+ -- the last element in fanout is the number of all objects in index
+ local count = fanout[255]
+
+ -- then come the sorted object names (=sha hash)
+ local tmp = {}
+ for i=1,count do
+ local sha = f:read(20)
+ tmp[i] = { sha = sha }
+ end
+
+ -- then the CRCs (assume ok, skip them)
+ for i=1, count do
+ local crc = f:read(4)
+ end
+
+ -- then come the offsets - read just the 32bit ones, does not handle packs > 2G
+ for i=1, count do
+ local offset = read_int(f)
+ tmp[i].offset = offset
+ end
+
+ -- construct the lookup table
+ local lookup = {}
+ for i=1, count do
+ lookup[tmp[i].sha] = tmp[i].offset
+ end
+ self.index = lookup
+end
+
+-- constructs the index/offsets if the index file is missing
+function Pack:construct_index(path)
+ local index = {}
+ for i=1, self.nobjects do
+ local offset = self.offsets[i]
+ local data, len, type = self:read_object(offset)
+ local sha = object_sha(data, len, types[type])
+ index[binary_sha(sha)] = offset
+ end
+ self.index = index
+end
+
+function Pack:close()
+ self.pack_file:close()
+end
+
+function Pack.open(path)
+ local fp = assert(io.open(path, 'rb')) -- stays open
+
+ -- read the pack header
+ local head = fp:read(4)
+ assert(head == 'PACK', "Incorrect header: " .. head)
+ local version = read_int(fp)
+ assert(version == 2, "Incorrect version: " .. version)
+ local nobj = read_int(fp)
+
+ local pack = setmetatable({
+ offsets = {},
+ nobjects = nobj,
+ pack_file = fp,
+ }, Pack)
+
+ -- fill the offsets by traversing through the pack
+ for i=1,nobj do
+ pack.offsets[i] = fp:seek()
+ -- ignore the object data, we only need the offset in the pack
+ pack:read_object(nil, true)
+ end
+
+ -- read the index
+ local fi = io.open((path:gsub('%.pack$', '.idx')), 'rb')
+ if fi then
+ pack:parse_index(fi)
+ fi:close()
+ else
+ pack:construct_index(path)
+ end
+
+ return pack
+end
+
+return Pack \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/git/protocol.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/git/protocol.lua
new file mode 100644
index 0000000..7bad2e2
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/git/protocol.lua
@@ -0,0 +1,188 @@
+local socket = require 'socket'
+local urllib = require 'socket.url'
+local lfs = require 'lfs'
+
+local Repo = git.repo.Repo
+local Pack = git.pack.Pack
+local join_path = git.util.join_path
+local parent_dir = git.util.parent_dir
+local make_dir = git.util.make_dir
+local correct_separators = git.util.correct_separators
+
+local assert, error, getmetatable, io, os, pairs, print, require, string, tonumber =
+ assert, error, getmetatable, io, os, pairs, print, require, string, tonumber
+
+local _VERSION, newproxy = _VERSION, newproxy
+
+module(...)
+
+local GIT_PORT = 9418
+
+local function git_connect(host)
+ local sock = assert(socket.connect(host, GIT_PORT))
+ local gitsocket = {}
+
+ function gitsocket:send(data)
+ if not data then -- flush packet
+ sock:send('0000')
+ else
+ local len = #data + 4
+ len = string.format("%04x", len)
+ assert(sock:send(len .. data))
+ end
+ end
+
+ function gitsocket:receive()
+ local len = assert(sock:receive(4))
+ len = tonumber(len, 16)
+ if len == 0 then return end -- flush packet
+ local data = assert(sock:receive(len - 4))
+ return data
+ end
+
+ function gitsocket:close()
+ sock:close()
+ end
+
+ return gitsocket
+end
+
+local function addFinalizer(object, finalizer)
+ if _VERSION <= "Lua 5.1" then
+ local gc = newproxy(true)
+ getmetatable(gc).__gc = finalizer
+ object.__gc = gc
+ else
+ local mt = getmetatable(object)
+ if mt then mt.__gc = finalizer
+ else setmetatable(object, {__gc = finalizer})
+ end
+ end
+end
+
+local function git_fetch(host, path, repo, head, supress_progress)
+ local s = git_connect(host)
+ s:send('git-upload-pack '..path..'\0host='..host..'\0')
+
+ local refs, refsbyname = {}, {}
+ repeat
+ local ref = s:receive()
+ if ref then
+ local sha, name = ref:sub(1,40), ref:sub(42, -2)
+ refs[sha] = name
+ refsbyname[name] = sha
+ end
+ until not ref
+
+ local wantedSha
+ local headsha = head and refsbyname[head]
+
+ for sha, ref in pairs(refs) do
+ -- we implicitly want this ref
+ local wantObject = true
+ -- unless we ask for a specific head
+ if headsha then
+ if sha ~= headsha then
+ wantObject = false
+ else
+ wantedSha = sha
+ end
+ end
+ -- or we already have it
+ if repo and repo:has_object(sha) then
+ wantObject = false
+ end
+ if wantObject then
+ s:send('want '..sha..' multi_ack_detailed side-band-64k ofs-delta\n')
+ end
+ end
+
+ if head and not wantedSha then
+ error("Server does not have "..head)
+ end
+
+ s:send('deepen 1')
+ s:send()
+ while s:receive() do end
+ s:send('done\n')
+
+ assert(s:receive() == "NAK\n")
+
+ local packname = os.tmpname() .. '.pack'
+ local packfile = assert(io.open(packname, 'wb'))
+ repeat
+ local got = s:receive()
+ if got then
+ -- get sideband channel, 1=pack data, 2=progress, 3=error
+ local cmd = string.byte(got:sub(1,1))
+ local data = got:sub(2)
+ if cmd == 1 then
+ packfile:write(data)
+ elseif cmd == 2 then
+ if not supress_progress then io.write(data) end
+ else
+ error(data)
+ end
+ end
+ until not got
+
+ packfile:close()
+ s:close()
+
+ local pack = Pack.open(packname)
+ if repo then
+ pack:unpack(repo)
+ repo.isShallow = true
+ if wantedSha then
+ local headfile = correct_separators(join_path(repo.dir, head))
+ assert(make_dir(parent_dir(headfile)))
+ local f = assert(io.open(headfile, 'wb'))
+ f:write(wantedSha)
+ f:close()
+ end
+ end
+
+ addFinalizer(pack, function()
+ os.remove(packname)
+ end)
+
+ return pack, wantedSha
+end
+
+function fetch(url, repo, head, supress_progress)
+ if repo then assert(getmetatable(repo) == Repo, "arg #2 is not a repository") end
+ url = urllib.parse(url)
+ if url.scheme == 'git' then
+ local pack, sha = git_fetch(url.host, url.path, repo, head, supress_progress)
+ return pack, sha
+ else
+ error('unsupported scheme: '..url.scheme)
+ end
+end
+
+function remotes(url)
+ -- TODO: refactor common code
+ url = assert(urllib.parse(url))
+
+ if url.scheme ~= 'git' then
+ error('unsupported scheme: '..url.scheme)
+ end
+
+ local host, path = url.host, url.path
+
+ local s = git_connect(host)
+ s:send('git-upload-pack '..path..'\0host='..host..'\0')
+
+ local remote = {}
+ repeat
+ local ref = s:receive()
+ if ref then
+ local sha, name = ref:sub(1,40), ref:sub(42, -2)
+ remote[name] = sha
+ end
+ until not ref
+
+ s:close()
+
+ return remote
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/git/repo.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/git/repo.lua
new file mode 100644
index 0000000..07b7207
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/git/repo.lua
@@ -0,0 +1,283 @@
+local util = require 'git.util'
+local objects = require 'git.objects'
+local core = require 'git.core'
+local pack = require 'git.pack'
+
+local join_path = util.join_path
+local decompressed = util.decompressed
+local read_until_nul = util.read_until_nul
+local to_hex = util.to_hex
+local object_sha = util.object_sha
+local readable_sha = util.readable_sha
+
+local deflate = core.deflate
+
+local lfs = require 'lfs'
+local assert, error, io, ipairs, print, os, setmetatable, string, table =
+ assert, error, io, ipairs, print, os, setmetatable, string, table
+
+module(...)
+
+Repo = {}
+Repo.__index = Repo
+
+-- retrieves an object identified by `sha` from the repository or its packs
+-- returns a file-like object (supports 'read', 'seek' and 'close'), the size
+-- of the object and its type
+-- errors when the object does not exist
+function Repo:raw_object(sha)
+ -- first, look in 'objects' directory
+ -- first byte of sha is the directory, the rest is name of object file
+ sha = readable_sha(sha)
+ local dir = sha:sub(1,2)
+ local file = sha:sub(3)
+ local path = join_path(self.dir, 'objects', dir, file)
+
+ if not lfs.attributes(path, 'size') then
+ -- then, try to look in packs
+ for _, pack in ipairs(self.packs) do
+ local obj, len, typ = pack:get_object(sha)
+ if obj then
+ return obj, len, typ
+ end
+ end
+ error('Object not found in object neither in packs: '..sha)
+ else
+ -- the objects are zlib compressed
+ local f = decompressed(path)
+
+ -- retrieve the type and length - <type> SP <len> \0 <data...>
+ local content = read_until_nul(f)
+ local typ, len = content:match('(%w+) (%d+)')
+
+ return f, len, typ
+ end
+end
+
+--- Store a new object into the repository in `objects` directory.
+-- @param data A string containing the contents of the new file.
+-- @param len The length of the data.
+-- @param type One of 'commit', 'blob', 'tree', 'tag'
+function Repo:store_object(data, len, type)
+ local sha = readable_sha(object_sha(data, len, type))
+ local dir = sha:sub(1,2)
+ local file = sha:sub(3)
+ util.make_dir(join_path(self.dir, 'objects', dir))
+ local path = join_path(self.dir, 'objects', dir, file)
+ local fo = assert(io.open(path, 'wb'))
+ local header = type .. ' ' .. len .. '\0'
+ local compressed = deflate()(header .. data, "finish")
+ fo:write(compressed)
+ fo:close()
+end
+
+local function resolvetag(f)
+ local tag
+ local line = f:read()
+ while line do
+ tag = line:match('^object (%x+)$')
+ if tag then break end
+ line = f:read()
+ end
+ f:close()
+ return tag
+end
+
+function Repo:commit(sha)
+ local f, len, typ = self:raw_object(sha)
+ while typ == 'tag' do
+ sha = assert(resolvetag(f), 'could not parse tag for '..readable_sha(sha))
+ f, len, typ = self:raw_object(sha)
+ end
+ assert(typ == 'commit', string.format('%s (%s) is not a commit', sha, typ))
+
+ local commit = { id = sha, repo = self, stored = true, parents = {} }
+ repeat
+ local line = f:read()
+ if not line then break end
+
+ local space = line:find(' ') or 0
+ local word = line:sub(1, space - 1)
+ local afterSpace = line:sub(space + 1)
+
+ if word == 'tree' then
+ commit.tree_sha = afterSpace
+ elseif word == 'parent' then
+ table.insert(commit.parents, afterSpace)
+ elseif word == 'author' then
+ commit.author = afterSpace
+ elseif word == 'committer' then
+ commit.committer = afterSpace
+ elseif commit.message then
+ table.insert(commit.message, line)
+ elseif line == '' then
+ commit.message = {}
+ end
+ until false -- ends with break
+ f:close()
+
+ commit.message = table.concat(commit.message, '\n')
+
+ return setmetatable(commit, objects.Commit)
+end
+
+function Repo:tree(sha)
+ local f, len, typ = self:raw_object(sha)
+ assert(typ == 'tree', string.format('%s (%s) is not a tree', sha, typ))
+
+ local tree = { id = sha, repo = self, stored = true, _entries = {} }
+
+ while true do
+ local info = read_until_nul(f)
+ if not info then break end
+ local entry_sha = to_hex(f:read(20))
+ local mode, name = info:match('^(%d+)%s(.+)$')
+ local entry_type = 'blob'
+ if mode == '40000' then
+ entry_type = 'tree'
+ elseif mode == '160000' then
+ entry_type = 'commit'
+ end
+ tree._entries[name] = { mode = mode, id = entry_sha, type = entry_type }
+ end
+
+ f:close()
+
+ return setmetatable(tree, objects.Tree)
+end
+
+-- retrieves a Blob
+function Repo:blob(sha)
+ local f, len, typ = self:raw_object(sha)
+ f:close() -- can be reopened in Blob:content()
+
+ assert(typ == 'blob', string.format('%s (%s) is not a blob', sha, typ))
+ return setmetatable({
+ id = sha,
+ len = len,
+ repo = self,
+ stored = true }, objects.Blob)
+end
+
+function Repo:head()
+ return self:commit(self.refs.HEAD)
+end
+
+function Repo:has_object(sha)
+ local dir = sha:sub(1,2)
+ local file = sha:sub(3)
+ local path = join_path(self.dir, 'objects', dir, file)
+
+ if lfs.attributes(path, 'size') then return true end
+
+ for _, pack in ipairs(self.packs) do
+ local has = pack:has_object(sha)
+ if has then return true end
+ end
+
+ return false
+end
+
+function Repo:checkout(sha, target)
+ if not target then target = self.workDir end
+ assert(target, 'target directory not specified')
+
+ local commit = self:commit(sha)
+ commit:checkout(target)
+
+ -- if the repo was checked out using the deepen command (one level of history only)
+ -- mark the commit's parent as shalow, that is it has no history
+ if self.isShallow then
+ -- if it has a parent, mark it shallow
+ if commit.parents[1] then
+ local f = assert(io.open(self.dir .. '/shallow', "w"))
+ f:write(commit.parents[1], '\n')
+ f:close()
+ end
+ end
+end
+
+function Repo:close()
+ for _, pack in ipairs(self.packs) do
+ pack:close()
+ end
+end
+
+function create(dir)
+ if not dir:match('%.git.?$') then
+ dir = join_path(dir, '.git')
+ end
+
+ util.make_dir(dir)
+ util.make_dir(dir .. '/branches')
+ util.make_dir(dir .. '/hooks')
+ util.make_dir(dir .. '/info')
+ util.make_dir(dir .. '/objects/info')
+ util.make_dir(dir .. '/objects/pack')
+ util.make_dir(dir .. '/refs/heads')
+ util.make_dir(dir .. '/refs/tags')
+ util.make_dir(dir .. '/refs/remotes')
+
+ do
+ local f = assert(io.open(dir .. "/HEAD", "w"))
+ f:write("ref: refs/heads/master\n")
+ f:close()
+ end
+
+ local refs = {}
+ local packs = {}
+
+ return setmetatable({
+ dir = dir,
+ refs = refs,
+ packs = packs,
+ }, Repo)
+end
+
+-- opens a repository located in working directory `dir` or directly a .git repo
+function open(dir)
+ local workDir = dir
+ if not dir:match('%.git.?$') then
+ dir = join_path(dir, '.git')
+ else
+ workDir = nil -- no working directory, working directly with repo
+ end
+
+ local refs = {}
+ for _,d in ipairs{'refs/heads', 'refs/tags'} do
+ for fn in lfs.dir(join_path(dir, d)) do
+ if fn ~= '.' and fn ~= '..' then
+ local path = join_path(dir, d, fn)
+ local f = assert(io.open(path), 'rb')
+ local ref = f:read()
+ refs[join_path(d, fn)] = ref
+ f:close()
+ end
+ end
+ end
+
+ local packs = {}
+ for fn in lfs.dir(join_path(dir, 'objects/pack')) do
+ if fn:match('%.pack$') then
+ local path = join_path(dir, 'objects/pack', fn)
+ table.insert(packs, pack.open(path))
+ end
+ end
+
+ local head = io.open(join_path(dir, 'HEAD'), 'rb')
+ if head then
+ local src = head:read()
+ local HEAD = src:match('ref: (.-)$')
+ refs.HEAD = refs[HEAD]
+ head:close()
+ end
+
+ return setmetatable({
+ dir = dir,
+ workDir = workDir,
+ refs = refs,
+ packs = packs,
+ }, Repo)
+end
+
+return Repo
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/git/util.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/git/util.lua
new file mode 100644
index 0000000..4b51c80
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/git/util.lua
@@ -0,0 +1,233 @@
+local lfs = require 'lfs'
+local core = require 'git.core'
+local deflate = core.deflate
+local inflate = core.inflate
+local sha = core.sha
+
+module(..., package.seeall)
+
+local BUF_SIZE = 4096
+
+local dirsep = package.config:sub(1,1)
+
+-- replaces '/' path separators on Windows with the correct ones ('\\')
+function correct_separators(path)
+ return path:gsub('/', dirsep)
+end
+
+-- joins several path components into a single path, uses system-specific directory
+-- separator, cleans input, i.e. join_path('a/', 'b', 'c/') => 'a/b/c'
+function join_path(...)
+ local n = select('#', ...)
+ local args = {...}
+ for i=1,n do
+ args[i] = args[i]:gsub(dirsep..'?$', '')
+ end
+ return table.concat(args, dirsep, 1, n)
+end
+
+-- Return the path with the all occurences of '/.' or '\.' (representing
+-- the current directory) removed.
+local function remove_curr_dir_dots(path)
+ while path:match(dirsep .. "%." .. dirsep) do -- match("/%./")
+ path = path:gsub(dirsep .. "%." .. dirsep, dirsep) -- gsub("/%./", "/")
+ end
+ return path:gsub(dirsep .. "%.$", "") -- gsub("/%.$", "")
+end
+
+-- Return whether the path is a root.
+local function is_root(path)
+ return path:find("^[%u%U.]?:?[/\\]$")
+end
+
+-- Return the path with the unnecessary trailing separator removed.
+local function remove_trailing(path)
+ if path:sub(-1) == dirsep and not is_root(path) then path = path:sub(1,-2) end
+ return path
+end
+
+-- Extract file or directory name from its path.
+local function extract_name(path)
+ if is_root(path) then return path end
+
+ path = remove_trailing(path)
+ path = path:gsub("^.*" .. dirsep, "")
+ return path
+end
+
+-- Return the string 'str', with all magic (pattern) characters escaped.
+local function escape_magic(str)
+ local escaped = str:gsub('[%-%.%+%[%]%(%)%^%%%?%*%^%$]','%%%1')
+ return escaped
+end
+
+-- Return parent directory of the 'path' or nil if there's no parent directory.
+-- If 'path' is a path to file, return the directory the file is in.
+function parent_dir(path)
+ path = remove_curr_dir_dots(path)
+ path = remove_trailing(path)
+
+ local dir = path:gsub(escape_magic(extract_name(path)) .. "$", "")
+ if dir == "" then
+ return nil
+ else
+ return remove_trailing(dir)
+ end
+end
+
+-- Make a new directory, making also all of its parent directories that doesn't exist.
+function make_dir(path)
+ if lfs.attributes(path) then
+ return true
+ else
+ local par_dir = parent_dir(path)
+ if par_dir then
+ assert(make_dir(par_dir))
+ end
+ return lfs.mkdir(path)
+ end
+end
+
+
+-- Reader class
+-- adapted from Penlight: https://raw.github.com/stevedonovan/Penlight/master/lua/pl/stringio.lua
+
+local SR = {}
+SR.__index = SR
+
+function SR:_read(fmt)
+ local i,str = self.i,self.str
+ local sz = #str
+ if i > sz then return nil, "past end of file" end
+ local res
+ if fmt == '*l' or fmt == '*L' then
+ local idx = str:find('\n',i) or (sz+1)
+ res = str:sub(i,fmt == '*l' and idx-1 or idx)
+ self.i = idx+1
+ elseif fmt == '*a' then
+ res = str:sub(i)
+ self.i = sz+1
+ elseif fmt == '*n' then
+ local _,i2,i2,idx
+ _,idx = str:find ('%s*%d+',i)
+ _,i2 = str:find ('^%.%d+',idx+1)
+ if i2 then idx = i2 end
+ _,i2 = str:find ('^[eE][%+%-]*%d+',idx+1)
+ if i2 then idx = i2 end
+ local val = str:sub(i,idx)
+ res = tonumber(val)
+ self.i = idx+1
+ elseif type(fmt) == 'number' then
+ res = str:sub(i,i+fmt-1)
+ self.i = i + fmt
+ else
+ error("bad read format",2)
+ end
+ return res
+ end
+
+function SR:read(...)
+ if select('#',...) == 0 then
+ return self:_read('*l')
+ else
+ local res, fmts = {},{...}
+ for i = 1, #fmts do
+ res[i] = self:_read(fmts[i])
+ end
+ return unpack(res)
+ end
+ end
+
+function SR:seek(whence,offset)
+ local base
+ whence = whence or 'cur'
+ offset = offset or 0
+ if whence == 'set' then
+ base = 1
+ elseif whence == 'cur' then
+ base = self.i
+ elseif whence == 'end' then
+ base = #self.str
+ end
+ self.i = base + offset
+ return self.i
+end
+
+function SR:close() -- for compatibility only
+end
+
+--- create a file-like object for reading from a given string.
+-- @param s The input string.
+function reader(s)
+ return setmetatable({str=s,i=1},SR)
+end
+
+
+-- decompress the file and return a handle to temporary uncompressed file
+function decompressed(path)
+ local fi = assert(io.open(path, 'rb'))
+ local result = {}
+
+ local z = inflate()
+ repeat
+ local str = fi:read(BUF_SIZE)
+ local data = z(str)
+ if type(data) == 'string' then
+ result[#result+1] = data
+ else print('!!!', data) end
+ until not str
+ fi:close()
+
+ return reader(table.concat(result))
+end
+
+-- reads until the byte \0, consumes it and returns the string up to the \0
+function read_until_nul(f)
+ local t = {}
+ repeat
+ local c = f:read(1)
+ if c and c ~= '\0' then t[#t+1] = c end
+ until not c or c == '\0'
+ if #t > 0 then
+ return table.concat(t)
+ else
+ return nil
+ end
+end
+
+-- converts a string to lowercase hex
+function to_hex(s)
+ return (s:gsub('.', function(c)
+ return string.format('%02x', string.byte(c))
+ end))
+end
+
+-- converts a string from hex to binary
+function from_hex(s)
+ return (s:gsub('..', function(cc)
+ return string.char(tonumber(cc, 16))
+ end))
+end
+
+-- always returns readable (hex) hash
+function readable_sha(s)
+ if #s ~= 40 then return to_hex(s)
+ else return s end
+end
+
+-- always returns binary hash
+function binary_sha(s)
+ if #s ~= 20 then return from_hex(s)
+ else return s end
+end
+
+function object_sha(data, len, type)
+ local header = type .. ' ' .. len .. '\0'
+ local res = sha(header .. data)
+ return res
+end
+
+function deflate(data)
+ local c = deflate()
+ return c(data, "finish")
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/ltn12.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/ltn12.lua
new file mode 100644
index 0000000..5b10f56
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/ltn12.lua
@@ -0,0 +1,298 @@
+-----------------------------------------------------------------------------
+-- LTN12 - Filters, sources, sinks and pumps.
+-- LuaSocket toolkit.
+-- Author: Diego Nehab
+-----------------------------------------------------------------------------
+
+-----------------------------------------------------------------------------
+-- Declare module
+-----------------------------------------------------------------------------
+local string = require("string")
+local table = require("table")
+local base = _G
+local _M = {}
+if module then -- heuristic for exporting a global package table
+ ltn12 = _M
+end
+local filter,source,sink,pump = {},{},{},{}
+
+_M.filter = filter
+_M.source = source
+_M.sink = sink
+_M.pump = pump
+
+-- 2048 seems to be better in windows...
+_M.BLOCKSIZE = 2048
+_M._VERSION = "LTN12 1.0.3"
+
+-----------------------------------------------------------------------------
+-- Filter stuff
+-----------------------------------------------------------------------------
+-- returns a high level filter that cycles a low-level filter
+function filter.cycle(low, ctx, extra)
+ base.assert(low)
+ return function(chunk)
+ local ret
+ ret, ctx = low(ctx, chunk, extra)
+ return ret
+ end
+end
+
+-- chains a bunch of filters together
+-- (thanks to Wim Couwenberg)
+function filter.chain(...)
+ local arg = {...}
+ local n = select('#',...)
+ local top, index = 1, 1
+ local retry = ""
+ return function(chunk)
+ retry = chunk and retry
+ while true do
+ if index == top then
+ chunk = arg[index](chunk)
+ if chunk == "" or top == n then return chunk
+ elseif chunk then index = index + 1
+ else
+ top = top+1
+ index = top
+ end
+ else
+ chunk = arg[index](chunk or "")
+ if chunk == "" then
+ index = index - 1
+ chunk = retry
+ elseif chunk then
+ if index == n then return chunk
+ else index = index + 1 end
+ else base.error("filter returned inappropriate nil") end
+ end
+ end
+ end
+end
+
+-----------------------------------------------------------------------------
+-- Source stuff
+-----------------------------------------------------------------------------
+-- create an empty source
+local function empty()
+ return nil
+end
+
+function source.empty()
+ return empty
+end
+
+-- returns a source that just outputs an error
+function source.error(err)
+ return function()
+ return nil, err
+ end
+end
+
+-- creates a file source
+function source.file(handle, io_err)
+ if handle then
+ return function()
+ local chunk = handle:read(_M.BLOCKSIZE)
+ if not chunk then handle:close() end
+ return chunk
+ end
+ else return source.error(io_err or "unable to open file") end
+end
+
+-- turns a fancy source into a simple source
+function source.simplify(src)
+ base.assert(src)
+ return function()
+ local chunk, err_or_new = src()
+ src = err_or_new or src
+ if not chunk then return nil, err_or_new
+ else return chunk end
+ end
+end
+
+-- creates string source
+function source.string(s)
+ if s then
+ local i = 1
+ return function()
+ local chunk = string.sub(s, i, i+_M.BLOCKSIZE-1)
+ i = i + _M.BLOCKSIZE
+ if chunk ~= "" then return chunk
+ else return nil end
+ end
+ else return source.empty() end
+end
+
+-- creates rewindable source
+function source.rewind(src)
+ base.assert(src)
+ local t = {}
+ return function(chunk)
+ if not chunk then
+ chunk = table.remove(t)
+ if not chunk then return src()
+ else return chunk end
+ else
+ table.insert(t, chunk)
+ end
+ end
+end
+
+function source.chain(src, f)
+ base.assert(src and f)
+ local last_in, last_out = "", ""
+ local state = "feeding"
+ local err
+ return function()
+ if not last_out then
+ base.error('source is empty!', 2)
+ end
+ while true do
+ if state == "feeding" then
+ last_in, err = src()
+ if err then return nil, err end
+ last_out = f(last_in)
+ if not last_out then
+ if last_in then
+ base.error('filter returned inappropriate nil')
+ else
+ return nil
+ end
+ elseif last_out ~= "" then
+ state = "eating"
+ if last_in then last_in = "" end
+ return last_out
+ end
+ else
+ last_out = f(last_in)
+ if last_out == "" then
+ if last_in == "" then
+ state = "feeding"
+ else
+ base.error('filter returned ""')
+ end
+ elseif not last_out then
+ if last_in then
+ base.error('filter returned inappropriate nil')
+ else
+ return nil
+ end
+ else
+ return last_out
+ end
+ end
+ end
+ end
+end
+
+-- creates a source that produces contents of several sources, one after the
+-- other, as if they were concatenated
+-- (thanks to Wim Couwenberg)
+function source.cat(...)
+ local arg = {...}
+ local src = table.remove(arg, 1)
+ return function()
+ while src do
+ local chunk, err = src()
+ if chunk then return chunk end
+ if err then return nil, err end
+ src = table.remove(arg, 1)
+ end
+ end
+end
+
+-----------------------------------------------------------------------------
+-- Sink stuff
+-----------------------------------------------------------------------------
+-- creates a sink that stores into a table
+function sink.table(t)
+ t = t or {}
+ local f = function(chunk, err)
+ if chunk then table.insert(t, chunk) end
+ return 1
+ end
+ return f, t
+end
+
+-- turns a fancy sink into a simple sink
+function sink.simplify(snk)
+ base.assert(snk)
+ return function(chunk, err)
+ local ret, err_or_new = snk(chunk, err)
+ if not ret then return nil, err_or_new end
+ snk = err_or_new or snk
+ return 1
+ end
+end
+
+-- creates a file sink
+function sink.file(handle, io_err)
+ if handle then
+ return function(chunk, err)
+ if not chunk then
+ handle:close()
+ return 1
+ else return handle:write(chunk) end
+ end
+ else return sink.error(io_err or "unable to open file") end
+end
+
+-- creates a sink that discards data
+local function null()
+ return 1
+end
+
+function sink.null()
+ return null
+end
+
+-- creates a sink that just returns an error
+function sink.error(err)
+ return function()
+ return nil, err
+ end
+end
+
+-- chains a sink with a filter
+function sink.chain(f, snk)
+ base.assert(f and snk)
+ return function(chunk, err)
+ if chunk ~= "" then
+ local filtered = f(chunk)
+ local done = chunk and ""
+ while true do
+ local ret, snkerr = snk(filtered, err)
+ if not ret then return nil, snkerr end
+ if filtered == done then return 1 end
+ filtered = f(done)
+ end
+ else return 1 end
+ end
+end
+
+-----------------------------------------------------------------------------
+-- Pump stuff
+-----------------------------------------------------------------------------
+-- pumps one chunk from the source to the sink
+function pump.step(src, snk)
+ local chunk, src_err = src()
+ local ret, snk_err = snk(chunk, src_err)
+ if chunk and ret then return 1
+ else return nil, src_err or snk_err end
+end
+
+-- pumps all data from a source to a sink, using a step function
+function pump.all(src, snk, step)
+ base.assert(src and snk)
+ step = step or pump.step
+ while true do
+ local ret, err = step(src, snk)
+ if not ret then
+ if err then return nil, err
+ else return 1 end
+ end
+ end
+end
+
+return _M
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/lua_lexer_loose.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/lua_lexer_loose.lua
new file mode 100644
index 0000000..678a693
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/lua_lexer_loose.lua
@@ -0,0 +1,212 @@
+--[[
+ lua_lexer_loose.lua.
+ Loose lexing of Lua code. See README.
+
+ WARNING: This code is preliminary and may have errors
+ in its current form.
+
+ (c) 2013 David Manura. MIT License.
+--]]
+
+local M = {}
+
+-- based on LuaBalanced
+local function match_string(s, pos)
+ pos = pos or 1
+ local posa = pos
+ local c = s:sub(pos,pos)
+ if c == '"' or c == "'" then
+ pos = pos + 1
+ while 1 do
+ pos = s:find("[" .. c .. "\\]", pos)
+ if not pos then return s:sub(posa), #s + 1 end -- not terminated string
+ if s:sub(pos,pos) == c then
+ local part = s:sub(posa, pos)
+ return part, pos + 1
+ else
+ pos = pos + 2
+ end
+ end
+ else
+ local sc = s:match("^%[(=*)%[", pos)
+ if sc then
+ local _; _, pos = s:find("%]" .. sc .. "%]", pos)
+ if not pos then return s:sub(posa), #s + 1 end -- not terminated string
+ local part = s:sub(posa, pos)
+ return part, pos + 1
+ else
+ return nil, pos
+ end
+ end
+end
+
+-- based on LuaBalanced
+local function match_comment(s, pos)
+ pos = pos or 1
+ if s:sub(pos, pos+1) ~= '--' then
+ return nil, pos
+ end
+ pos = pos + 2
+ if s:sub(pos,pos) == '[' then
+ local partt, post = match_string(s, pos)
+ if partt then
+ return '--' .. partt, post
+ end
+ end
+ local part; part, pos = s:match('^([^\n]*\n?)()', pos)
+ return '--' .. part, pos
+end
+
+-- note: matches invalid numbers too (for example, 0x)
+local function match_numberlike(s, pos)
+ local hex = s:match('^0[xX]', pos)
+ if hex then pos = pos + #hex end
+
+ local longint = (hex and '^%x+' or '^%d+') .. '[uU]?[lL][lL]'
+ local mantissa1 = hex and '^%x+%.?%x*' or '^%d+%.?%d*'
+ local mantissa2 = hex and '^%.%x+' or '^%.%d+'
+ local exponent = hex and '^[pP][+%-]?%x*' or '^[eE][+%-]?%d*'
+ local imaginary = '^[iI]'
+ local tok = s:match(longint, pos)
+ if not tok then
+ tok = s:match(mantissa1, pos) or s:match(mantissa2, pos)
+ if tok then
+ local tok2 = s:match(exponent, pos + #tok)
+ if tok2 then tok = tok..tok2 end
+ tok2 = s:match(imaginary, pos + #tok)
+ if tok2 then tok = tok..tok2 end
+ end
+ end
+ return tok and (hex or '') .. tok or hex
+end
+
+local function newset(s)
+ local t = {}
+ for c in s:gmatch'.' do t[c] = true end
+ return t
+end
+local function qws(s)
+ local t = {}
+ for k in s:gmatch'%S+' do t[k] = true end
+ return t
+end
+
+local sym = newset("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_")
+local dig = newset('0123456789')
+local name = "([_A-Za-z][_A-Za-z0-9]*)"
+local op = newset('=~<>.+-*/%^#=<>;:,.{}[]()')
+
+op['=='] = true
+op['<='] = true
+op['>='] = true
+op['~='] = true
+op['..'] = true
+op['<<'] = true
+op['>>'] = true
+op['//'] = true
+
+local is_keyword = qws[[
+ and break do else elseif end false for function if
+ in local nil not or repeat return
+ then true until while goto]]
+
+function M.lex(code, f, pos)
+ local pos = pos or 1
+ local tok = code:match('^#![^\n]*\n', pos) -- shebang
+ if tok then f('Shebang', tok, 1) pos = pos + #tok end
+ while pos <= #code do
+ local p2, n2, n1, n3 = code:match('^%s*()((%S)(%S?))', pos)
+ if not p2 then assert(code:sub(pos):match('^%s*$')); break end
+ pos = p2
+
+ if sym[n1] then
+ local tok = code:match('^'..name, pos)
+ assert(tok)
+ if is_keyword[tok] then
+ f('Keyword', tok, pos)
+ else
+ f('Id', tok, pos)
+ end
+ pos = pos + #tok
+ elseif n2 == '--' then
+ local tok, pos2 = match_comment(code, pos)
+ assert(tok)
+ f('Comment', tok, pos)
+ pos = pos2
+ elseif n2 == '::' then
+ local tok = code:match('^(::%s*'..name..'%s*::)', pos)
+ if tok then
+ f('Label', tok, pos)
+ pos = pos + #tok
+ else
+ f('Unknown', code:sub(pos, pos+1), pos) -- unterminated label
+ pos = pos + 2
+ end
+ elseif n1 == '\'' or n1 == '\"' or n2 == '[[' or n2 == '[=' then
+ local tok = match_string(code, pos)
+ if tok then
+ f('String', tok, pos)
+ pos = pos + #tok
+ else
+ f('Unknown', code:sub(pos), pos) -- unterminated string
+ pos = #code + 1
+ end
+ elseif dig[n1] or (n1 == '.' and dig[n3]) then
+ local tok = match_numberlike(code, pos)
+ assert(tok)
+ f('Number', tok, pos)
+ pos = pos + #tok
+ elseif op[n2] then
+ if n2 == '..' and code:match('^%.', pos+2) then
+ tok = '...'
+ else
+ tok = n2
+ end
+ f('Keyword', tok, pos)
+ pos = pos + #tok
+ elseif op[n1] then
+ local tok = n1
+ f('Keyword', tok, pos)
+ pos = pos + #tok
+ else
+ f('Unknown', n1, pos)
+ pos = pos + 1
+ end
+ end
+end
+
+local Stream = {}
+Stream.__index = Stream
+function Stream:next(val)
+ if self._next then
+ local _next = self._next
+ self._next = nil
+ return _next
+ else
+ self._next = nil
+ return self.f()
+ end
+end
+function Stream:peek()
+ if self._next then
+ return self._next
+ else
+ local _next = self.f()
+ self._next = _next
+ return _next
+ end
+end
+
+function M.lexc(code, f, pos)
+ local yield = coroutine.yield
+ local func = coroutine.wrap(f or function()
+ M.lex(code, function(tag, name, pos)
+ -- skip Comment tags as they may arbitrarily split statements and affects their processing
+ if tag ~= 'Comment' then yield {tag=tag, name, lineinfo=pos} end
+ end, pos)
+ yield {tag='Eof', lineinfo = #code+1}
+ end)
+ return setmetatable({f=func}, Stream)
+end
+
+return M
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/lua_parser_loose.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/lua_parser_loose.lua
new file mode 100644
index 0000000..e64493f
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/lua_parser_loose.lua
@@ -0,0 +1,337 @@
+--[[
+ lua_parser_loose.lua.
+ Loose parsing of Lua code. See README.
+ (c) 2013 David Manura. MIT License.
+--]]
+
+local PARSE = {}
+
+local unpack = table.unpack or unpack
+local LEX = require 'lua_lexer_loose'
+
+--[[
+ Loose parser.
+
+ lx - lexer stream of Lua tokens.
+ f(event...) - callback function to send events to.
+
+ Events generated:
+ 'Var', name, lineinfo - variable declaration that immediately comes into scope.
+ 'VarSelf', name, lineinfo - same as 'Var' but for implicit 'self' parameter
+ in method definitions. lineinfo is zero-width space after '('
+ 'VarNext', name, lineinfo - variable definition that comes into scope
+ upon next statement.
+ 'VarInside', name, lineinfo - variable definition that comes into scope
+ inside following block. Used for control variables in 'for' statements.
+ 'Id', name, lineinfo - reference to variable.
+ 'String', name - string or table field.
+ 'Scope', opt - beginning of scope block.
+ 'EndScope', nil, lineinfo - end of scope block.
+ 'FunctionCall', name, lineinfo - function call (in addition to other events).
+ 'Function', name, lineinfo - function definition.
+--]]
+function PARSE.parse_scope(lx, f, level)
+ local cprev = {tag='Eof'}
+
+ -- stack of scopes.
+ local scopes = {{}}
+ for l = 2, (level or 1) do scopes[l] = {} end
+
+ local function scope_begin(opt, lineinfo, nobreak)
+ scopes[#scopes+1] = {}
+ f('Scope', opt, lineinfo, nobreak)
+ end
+ local function scope_end(opt, lineinfo)
+ local scope = #scopes
+ if scope > 1 then table.remove(scopes) end
+ local inside_local = false
+ for scope = scope-1, 1, -1 do
+ if scopes[scope].inside_local then inside_local = true; break end
+ end
+ f('EndScope', opt, lineinfo, inside_local)
+ end
+
+ local function parse_function_list(has_self, name, pos)
+ local c = lx:next(); assert(c[1] == '(')
+ f('Statement', c[1], c.lineinfo, true) -- generate Statement for function definition
+ scope_begin(c[1], c.lineinfo, true)
+
+ local vars = {} -- accumulate vars (if any) to send after 'Function'
+ if has_self then
+ local lineinfo = c.lineinfo+1 -- zero size
+ table.insert(vars, {'VarSelf', 'self', lineinfo, true})
+ end
+ while true do
+ local n = lx:peek()
+ if not (n.tag == 'Id' or n.tag == 'Keyword' and n[1] == '...') then break end
+ local c = lx:next()
+ if c.tag == 'Id' then table.insert(vars, {'Var', c[1], c.lineinfo, true}) end
+ -- ignore '...' in this case
+ if lx:peek()[1] == ',' then lx:next() end
+ end
+ if lx:peek()[1] == ')' then
+ lx:next()
+ f('Function', name, pos or c.lineinfo, true)
+ end
+ for _, var in ipairs(vars) do f(unpack(var)) end
+ end
+
+ while true do
+ local c = lx:next()
+
+ -- Detect end of previous statement
+ if c.tag == 'Eof' -- trigger 'Statement' at the end of file
+ or c.tag == 'Keyword' and (
+ c[1] == 'break' or c[1] == 'goto' or c[1] == 'do' or c[1] == 'while' or
+ c[1] == 'repeat' or c[1] == 'if' or c[1] == 'for' or c[1] == 'function' and lx:peek().tag == 'Id' or
+ c[1] == 'local' or c[1] == ';' or c[1] == 'until' or c[1] == 'return' or c[1] == 'end') or
+ c.tag == 'Id' and
+ (cprev.tag == 'Id' or
+ cprev.tag == 'Keyword' and
+ (cprev[1] == ']' or cprev[1] == ')' or cprev[1] == '}' or
+ cprev[1] == '...' or cprev[1] == 'end' or
+ cprev[1] == 'true' or cprev[1] == 'false' or
+ cprev[1] == 'nil') or
+ cprev.tag == 'Number' or cprev.tag == 'String')
+ then
+ if scopes[#scopes].inside_until then scope_end(nil, c.lineinfo) end
+ local scope = #scopes
+ if not scopes[scope].inside_table then scopes[scope].inside_local = nil end
+ f('Statement', c[1], c.lineinfo,
+ scopes[scope].inside_local or c[1] == 'local' or c[1] == 'function' or c[1] == 'end')
+ end
+
+ if c.tag == 'Eof' then break end
+
+ -- Process token(s)
+ if c.tag == 'Keyword' then
+
+ if c[1] == 'local' and lx:peek().tag == 'Keyword' and lx:peek()[1] == 'function' then
+ -- local function
+ local c = lx:next(); assert(c[1] == 'function')
+ if lx:peek().tag == 'Id' then
+ c = lx:next()
+ f('Var', c[1], c.lineinfo, true)
+ if lx:peek()[1] == '(' then parse_function_list(nil, c[1], c.lineinfo) end
+ end
+ elseif c[1] == 'function' then
+ if lx:peek()[1] == '(' then -- inline function
+ parse_function_list()
+ elseif lx:peek().tag == 'Id' then -- function definition statement
+ c = lx:next(); assert(c.tag == 'Id')
+ local name = c[1]
+ local pos = c.lineinfo
+ f('Id', name, pos, true)
+ local has_self
+ while lx:peek()[1] ~= '(' and lx:peek().tag ~= 'Eof' do
+ c = lx:next()
+ name = name .. c[1]
+ if c.tag == 'Id' then
+ f('String', c[1], c.lineinfo, true)
+ elseif c.tag == 'Keyword' and c[1] == ':' then
+ has_self = true
+ end
+ end
+ if lx:peek()[1] == '(' then parse_function_list(has_self, name, pos) end
+ end
+ elseif c[1] == 'local' and lx:peek().tag == 'Id' then
+ scopes[#scopes].inside_local = true
+ c = lx:next()
+ f('VarNext', c[1], c.lineinfo, true)
+ while lx:peek().tag == 'Keyword' and lx:peek()[1] == ',' do
+ c = lx:next(); if lx:peek().tag ~= 'Id' then break end
+ c = lx:next()
+ f('VarNext', c[1], c.lineinfo, true)
+ end
+ elseif c[1] == 'for' and lx:peek().tag == 'Id' then
+ c = lx:next()
+ f('VarInside', c[1], c.lineinfo, true)
+ while lx:peek().tag == 'Keyword' and lx:peek()[1] == ',' do
+ c = lx:next(); if lx:peek().tag ~= 'Id' then break end
+ c = lx:next()
+ f('VarInside', c[1], c.lineinfo, true)
+ end
+ elseif c[1] == 'goto' and lx:peek().tag == 'Id' then
+ lx:next()
+ elseif c[1] == 'do' then
+ scope_begin('do', c.lineinfo)
+ -- note: do/while/for statement scopes all begin at 'do'.
+ elseif c[1] == 'repeat' or c[1] == 'then' then
+ scope_begin(c[1], c.lineinfo)
+ elseif c[1] == 'end' or c[1] == 'elseif' then
+ scope_end(c[1], c.lineinfo)
+ elseif c[1] == 'else' then
+ scope_end(nil, c.lineinfo)
+ scope_begin(c[1], c.lineinfo)
+ elseif c[1] == 'until' then
+ scopes[#scopes].inside_until = true
+ elseif c[1] == '{' then
+ scopes[#scopes].inside_table = (scopes[#scopes].inside_table or 0) + 1
+ elseif c[1] == '}' then
+ local newval = (scopes[#scopes].inside_table or 0) - 1
+ newval = newval >= 1 and newval or nil
+ scopes[#scopes].inside_table = newval
+ end
+ elseif c.tag == 'Id' then
+ local scope = #scopes
+ local inside_local = scopes[scope].inside_local ~= nil
+ local inside_table = scopes[scope].inside_table
+ local cnext = lx:peek()
+ if cnext.tag == 'Keyword' and (cnext[1] == '(' or cnext[1] == '{')
+ or cnext.tag == 'String' then
+ f('FunctionCall', c[1], c.lineinfo, inside_local)
+ end
+ -- either this is inside a table or it continues from a comma,
+ -- which may be a field assignment, so assume it's in a table
+ if (inside_table or cprev[1] == ',') and cnext.tag == 'Keyword' and cnext[1] == '=' then
+ -- table field; table fields are tricky to handle during incremental
+ -- processing as "a = 1" may be either an assignment (in which case
+ -- 'a' is Id) or a field initialization (in which case it's a String).
+ -- Since it's not possible to decide between two cases in isolation,
+ -- this is not a good place to insert a break; instead, the break is
+ -- inserted at the location of the previous keyword, which allows
+ -- to properly handle those cases. The desired location of
+ -- the restart point is returned as the `nobreak` value.
+ f('String', c[1], c.lineinfo,
+ inside_local or cprev and cprev.tag == 'Keyword' and cprev.lineinfo)
+ elseif cprev.tag == 'Keyword' and (cprev[1] == ':' or cprev[1] == '.') then
+ f('String', c[1], c.lineinfo, true)
+ else
+ f('Id', c[1], c.lineinfo, true)
+ -- this looks like the left side of (multi-variable) assignment
+ -- unless it's a part of `= var, field = value`, so skip if inside a table
+ if not inside_table and not (cprev and cprev.tag == 'Keyword' and cprev[1] == '=') then
+ while lx:peek().tag == 'Keyword' and lx:peek()[1] == ',' do
+ local c = lx:next(); if lx:peek().tag ~= 'Id' then break end
+ c = lx:next()
+ f('Id', c[1], c.lineinfo, true)
+ end
+ end
+ end
+ end
+
+ if c.tag ~= 'Comment' then cprev = c end
+ end
+end
+
+--[[
+ This is similar to parse_scope but determines if variables are local or global.
+
+ lx - lexer stream of Lua tokens.
+ f(event...) - callback function to send events to.
+
+ Events generated:
+ 'Id', name, lineinfo, 'local'|'global'
+ (plus all events in parse_scope)
+--]]
+function PARSE.parse_scope_resolve(lx, f, vars)
+ local NEXT = {} -- unique key
+ local INSIDE = {} -- unique key
+ local function newscope(vars, opt, lineinfo)
+ local newvars = opt=='do' and vars[INSIDE] or {}
+ if newvars == vars[INSIDE] then vars[INSIDE] = false end
+ newvars[INSIDE]=false
+ newvars[NEXT]=false
+ local level = (vars[0] or 0) + 1
+ newvars[0] = level -- keep the current level
+ newvars[-1] = lineinfo -- keep the start of the scope
+ newvars[level] = newvars -- reference the current vars table
+ return setmetatable(newvars, {__index=vars})
+ end
+
+ vars = vars or newscope({[0] = 0}, nil, 1)
+ vars[NEXT] = false -- vars that come into scope upon next statement
+ vars[INSIDE] = false -- vars that come into scope upon entering block
+ PARSE.parse_scope(lx, function(op, name, lineinfo, nobreak)
+ -- in some (rare) cases VarNext can follow Statement event (which copies
+ -- vars[NEXT]). This may cause vars[0] to be `nil`, so default to 1.
+ local var = op:find("^Var") and
+ {fpos = lineinfo, at = (vars[0] or 1) + (op == 'VarInside' and 1 or 0),
+ masked = vars[name], self = (op == 'VarSelf') or nil } or nil
+ if op == 'Var' or op == 'VarSelf' then
+ vars[name] = var
+ elseif op == 'VarNext' then
+ vars[NEXT] = vars[NEXT] or {}
+ vars[NEXT][name] = var
+ elseif op == 'VarInside' then
+ vars[INSIDE] = vars[INSIDE] or {}
+ vars[INSIDE][name] = var
+ elseif op == 'Scope' then
+ vars = newscope(vars, name, lineinfo)
+ elseif op == 'EndScope' then
+ local mt = getmetatable(vars)
+ if mt ~= nil then vars = mt.__index end
+ elseif op == 'Id'
+ or op == 'String' or op == 'FunctionCall' or op == 'Function' then
+ -- Just make callback
+ elseif op == 'Statement' then -- beginning of statement
+ -- Apply vars that come into scope upon beginning of statement.
+ if vars[NEXT] then
+ for k,v in pairs(vars[NEXT]) do
+ vars[k] = v; vars[NEXT][k] = nil
+ end
+ end
+ else
+ assert(false)
+ end
+ f(op, name, lineinfo, vars, nobreak)
+ end, vars[0])
+end
+
+function PARSE.extract_vars(code, f)
+ local lx = LEX.lexc(code)
+
+ local char0 = 1 -- next char offset to write
+ local function gen(char1, nextchar0)
+ char0 = nextchar0
+ end
+
+ PARSE.parse_scope_resolve(lx, function(op, name, lineinfo, other)
+ if op == 'Id' then
+ f('Id', name, other, lineinfo)
+ elseif op == 'Var' or op == 'VarNext' or op == 'VarInside' then
+ gen(lineinfo, lineinfo+#name)
+ f('Var', name, "local", lineinfo)
+ end -- ignore 'VarSelf' and others
+ end)
+ gen(#code+1, nil)
+end
+
+--[[
+ Converts 5.2 code to 5.1 style code with explicit _ENV variables.
+ Example: "function f(_ENV, x) print(x, y)" -->
+ "function _ENV.f(_ENV, x) _ENV.print(x, _ENV.y) end"
+
+ code - string of Lua code. Assumed to be valid Lua (FIX: 5.1 or 5.2?)
+ f(s) - call back function to send chunks of Lua code output to. Example: io.stdout.
+--]]
+function PARSE.replace_env(code, f)
+ if not f then return PARSE.accumulate(PARSE.replace_env, code) end
+ PARSE.extract_vars(code, function(op, name, other)
+ if op == 'Id' then
+ f(other == 'global' and '_ENV.' .. name or name)
+ elseif op == 'Var' or op == 'Other' then
+ f(name)
+ end
+ end)
+end
+
+-- helper function. Can be passed as argument `f` to functions
+-- like `replace_env` above to accumulate fragments into a single string.
+function PARSE.accumulator()
+ local ts = {}
+ local mt = {}
+ mt.__index = mt
+ function mt:__call(s) ts[#ts+1] = s end
+ function mt:result() return table.concat(ts) end
+ return setmetatable({}, mt)
+end
+
+-- helper function
+function PARSE.accumulate(g, code)
+ local accum = PARSE.accumulator()
+ g(code, accum)
+ return accum:result()
+end
+
+return PARSE
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luadist.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luadist.lua
new file mode 100644
index 0000000..da875dc
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luadist.lua
@@ -0,0 +1,746 @@
+#!/usr/bin/env lua
+
+-- Command line interface to LuaDist-git.
+
+local dist = require "dist"
+local utils = require "dist.utils"
+local depends = require "dist.depends"
+local package = require "dist.package"
+local mf = require "dist.manifest"
+local cfg = require "dist.config"
+local sys = require "dist.sys"
+
+-- CLI commands of Luadist.
+local commands
+commands = {
+
+ -- Print help for this command line interface.
+ ["help"] = {
+ help = [[
+Usage: luadist [DEPLOYMENT_DIRECTORY] <COMMAND> [ARGUMENTS...] [-VARIABLES...]
+
+ Commands:
+
+ help - print this help
+ install - install modules
+ remove - remove modules
+ refresh - update information about modules in repositories
+ list - list installed modules
+ info - show information about modules
+ search - search repositories for modules
+ fetch - download modules
+ make - manually deploy modules from local paths
+ upload - upload installed modules to their repositories
+ tree - print dependency tree of a module
+ selftest - run the selftest of LuaDist
+
+ To get help on specific command, run:
+
+ luadist help <COMMAND>
+ ]],
+ run = function (deploy_dir, help_item)
+ deploy_dir = deploy_dir or dist.get_deploy_dir()
+ help_item = help_item or {}
+ assert(type(deploy_dir) == "string", "luadist.help: Argument 'deploy_dir' is not a string.")
+ assert(type(help_item) == "table", "luadist.help: Argument 'help_item' is not a table.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ if not help_item or not commands[help_item[1]] then
+ help_item = "help"
+ else
+ help_item = help_item[1]
+ end
+
+ print_info()
+ print(commands[help_item].help)
+ return 0
+ end
+ },
+
+ -- Install modules.
+ ["install"] = {
+ help = [[
+Usage: luadist [DEPLOYMENT_DIRECTORY] install MODULES... [-VARIABLES...]
+
+ The 'install' command will install specified MODULES to
+ DEPLOYMENT_DIRECTORY. LuaDist will also automatically resolve, download
+ and install all dependencies.
+
+ If DEPLOYMENT_DIRECTORY is not specified, the deployment directory
+ of LuaDist is used.
+
+ You can use * (an asterisk sign) in the name of the module as a wildcard
+ with the meaning 'any symbols' (in most shells, the module name then must
+ be quoted to prevent the expansion of asterisk by the shell itself).
+
+ Optional CMake VARIABLES in -D format (e.g. -Dvariable=value) or LuaDist
+ configuration VARIABLES (e.g. -variable=value) can be specified.
+
+ The -simulate configuration option makes LuaDist only to simulate the
+ installation of modules (no modules will be really installed).
+ ]],
+
+ run = function (deploy_dir, modules, cmake_variables)
+ deploy_dir = deploy_dir or dist.get_deploy_dir()
+ if type(modules) == "string" then modules = {modules} end
+ cmake_variables = cmake_variables or {}
+ assert(type(deploy_dir) == "string", "luadist.install: Argument 'deploy_dir' is not a string.")
+ assert(type(modules) == "table", "luadist.install: Argument 'modules' is not a string or table.")
+ assert(type(cmake_variables) == "table", "luadist.install: Argument 'cmake_variables' is not a table.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ if cfg.simulate then
+ print("NOTE: this is just simulation.")
+ end
+
+ if #modules == 0 then
+ print("No modules to install specified.")
+ return 0
+ end
+
+ local ok, err = dist.install(modules, deploy_dir, cmake_variables)
+ if not ok then
+ print(err)
+ os.exit(1)
+ else
+ print((cfg.simulate and "Simulated installation" or "Installation") .. " successful.")
+ return 0
+ end
+ end
+ },
+
+ -- Remove modules.
+ ["remove"] = {
+ help = [[
+Usage: luadist [DEPLOYMENT_DIRECTORY] remove MODULES... [-VARIABLES...]
+
+ The 'remove' command will remove specified MODULES from
+ DEPLOYMENT_DIRECTORY. If no module is specified, all modules
+ will be removed.
+
+ If DEPLOYMENT_DIRECTORY is not specified, the deployment directory
+ of LuaDist is used. If no MODULES are specified, all installed modules
+ will be removed.
+
+ You can use * (an asterisk sign) in the name of the module as a wildcard
+ with the meaning 'any symbols' (in most shells, the module name then must
+ be quoted to prevent the expansion of asterisk by the shell itself).
+
+ Optional LuaDist configuration VARIABLES (e.g. -variable=value) can be
+ specified.
+
+ WARNING: dependencies between modules are NOT taken into account when
+ removing modules!
+ ]],
+
+ run = function (deploy_dir, modules)
+ deploy_dir = deploy_dir or dist.get_deploy_dir()
+ if type(modules) == "string" then modules = {modules} end
+ assert(type(deploy_dir) == "string", "luadist.remove: Argument 'deploy_dir' is not a string.")
+ assert(type(modules) == "table", "luadist.remove: Argument 'modules' is not a string or table.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local num, err = dist.remove(modules, deploy_dir)
+ if not num then
+ print(err)
+ os.exit(1)
+ else
+ print("Removed modules: " .. num)
+ return 0
+ end
+ end
+ },
+
+ -- Update repositories.
+ ["refresh"] = {
+ help = [[
+Usage: luadist [DEPLOYMENT_DIRECTORY] refresh [-VARIABLES...]
+
+ The 'refresh' command will update information about modules in all software
+ repositories of specified DEPLOYMENT_DIRECTORY. Also, the cached dependency
+ manifest, built from previous installations or invocations of 'tree'
+ functionality will be deleted.
+
+ If DEPLOYMENT_DIRECTORY is not specified, the deployment directory
+ of LuaDist is used.
+
+ Optional LuaDist configuration VARIABLES (e.g. -variable=value) can be
+ specified.
+ ]],
+
+ run = function (deploy_dir)
+ deploy_dir = deploy_dir or dist.get_deploy_dir()
+ assert(type(deploy_dir) == "string", "luadist.refresh: Argument 'deploy_dir' is not a string.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ -- TODO: should be deleting the dep_manifest decoupled from refreshing the repository info?
+ -- delete cached dependency manifest
+ local dep_manifest_file = sys.abs_path(sys.make_path(deploy_dir, cfg.dep_cache_file))
+ local dep_mf_deleted = false
+ if sys.exists(dep_manifest_file) then
+ sys.delete(dep_manifest_file)
+ dep_mf_deleted = true
+ end
+
+ -- refresh repository information
+ local ok, err = dist.update_manifest(deploy_dir)
+ if not ok then
+ print(err)
+ os.exit(1)
+ else
+ print("Repositories successfuly updated" .. (dep_mf_deleted and " and dependency cache deleted" or "") .. ".")
+ return 0
+ end
+ end
+ },
+
+ -- Manually deploy modules.
+ ["make"] = {
+ help = [[
+Usage: luadist [DEPLOYMENT_DIRECTORY] make MODULE_PATHS... [-VARIABLES...]
+
+ The 'make' command will manually deploy modules from specified local
+ MODULE_PATHS into the DEPLOYMENT_DIRECTORY.
+
+ The MODULE_PATHS will be preserved. If DEPLOYMENT_DIRECTORY is not
+ specified, the deployment directory of LuaDist is used.
+
+ Optional CMake VARIABLES in -D format (e.g. -Dvariable=value) or LuaDist
+ configuration VARIABLES (e.g. -variable=value) can be specified.
+
+ The -simulate configuration option makes LuaDist only to simulate the
+ deployment of modules (no modules will be really deployed).
+
+ WARNING: this command does NOT check whether the dependencies of deployed
+ modules are satisfied or not!
+ ]],
+
+ run = function (deploy_dir, module_paths, cmake_variables)
+ deploy_dir = deploy_dir or dist.get_deploy_dir()
+ module_paths = module_paths or {}
+ cmake_variables = cmake_variables or {}
+ assert(type(deploy_dir) == "string", "luadist.make: Argument 'deploy_dir' is not a string.")
+ assert(type(module_paths) == "table", "luadist.make: Argument 'module_paths' is not a table.")
+ assert(type(cmake_variables) == "table", "luadist.make: Argument 'cmake_variables' is not a table.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ if cfg.simulate then
+ print("NOTE: this is just simulation.")
+ end
+
+ if #module_paths == 0 then
+ print("No module paths to deploy specified.")
+ return 0
+ end
+
+ local ok, err = dist.make(deploy_dir, module_paths, cmake_variables)
+ if not ok then
+ print(err)
+ os.exit(1)
+ end
+ print((cfg.simulate and "Simulated deployment" or "Deployment") .. " successful.")
+ return 0
+ end
+ },
+
+ -- Download modules.
+ ["fetch"] = {
+ help = [[
+Usage: luadist [FETCH_DIRECTORY] fetch MODULES... [-VARIABLES...]
+
+ The 'fetch' command will download specified MODULES to the FETCH_DIRECTORY.
+
+ If no FETCH_DIRECTORY is specified, the temporary directory of LuaDist
+ deployment directory (i.e. ']] .. cfg.temp_dir .. [[') is used.
+ If the version is not specified in module name, the most recent version
+ available will be downloaded.
+
+ Optional LuaDist configuration VARIABLES (e.g. -variable=value) can be
+ specified.
+ ]],
+
+ run = function (fetch_dir, modules)
+ fetch_dir = fetch_dir or dist.get_deploy_dir()
+ modules = modules or {}
+ assert(type(fetch_dir) == "string", "luadist.fetch: Argument 'fetch_dir' is not a string.")
+ assert(type(modules) == "table", "luadist.fetch: Argument 'modules' is not a table.")
+ fetch_dir = sys.abs_path(fetch_dir)
+
+ -- if the default parameter (i.e. deploy_dir) is passed, use the default temp_dir
+ if fetch_dir == dist.get_deploy_dir() then
+ fetch_dir = sys.make_path(fetch_dir, cfg.temp_dir)
+ end
+
+ if #modules == 0 then
+ print("No modules to download specified.")
+ return 0
+ end
+
+ local ok, err = dist.fetch(modules, fetch_dir)
+ if not ok then
+ print(err)
+ os.exit(1)
+ else
+ print("Modules successfuly downloaded to '" .. fetch_dir .. "'.")
+ return 0
+ end
+ end
+ },
+
+ -- Upload modules.
+ ["upload"] = {
+ help = [[
+Usage: luadist [DEPLOYMENT_DIRECTORY] upload MODULES... [-VARIABLES...]
+
+ The 'upload' command will upload the binary versions of specified MODULES,
+ installed in the DEPLOYMENT_DIRECTORY, to their LuaDist repositories.
+
+ Base url of repositories is given by configuration variable 'upload_url'
+ (by default ']] .. cfg.upload_url .. [[') which you can change.
+ E.g.: Binary version of module 'lua', installed in DEPLOYMENT_DIRECTORY,
+ will now be uploaded to repository ']] .. cfg.upload_url .. [[lua.git'.
+
+ Organization of uploaded modules and their repositories is subject
+ to the conventions described in more detail in the source code
+ of the 'dist.upload_modules()' function (file 'dist/init.lua').
+
+ If DEPLOYMENT_DIRECTORY is not specified, the deployment directory
+ of LuaDist is used. If no MODULES are specified, all installed modules
+ will be uploaded.
+
+ You can use * (an asterisk sign) in the name of the module as a wildcard
+ with the meaning 'any symbols' (in most shells, the module name then must
+ be quoted to prevent the expansion of asterisk by the shell itself).
+
+ Optional LuaDist configuration VARIABLES (e.g. -variable=value) can be
+ specified.
+ ]],
+
+ run = function (deploy_dir, modules)
+ -- check if we have git
+ local ok = utils.system_dependency_available("git", "git --version")
+ if not ok then os.exit(1) end
+
+ deploy_dir = deploy_dir or dist.get_deploy_dir()
+ if type(modules) == "string" then modules = {modules} end
+ assert(type(deploy_dir) == "string", "luadist.upload: Argument 'deploy_dir' is not a string.")
+ assert(type(modules) == "table", "luadist.upload: Argument 'modules' is not a string or table.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local num, err = dist.upload_modules(deploy_dir, modules, cfg.upload_url)
+ if not num then
+ print(err)
+ os.exit(1)
+ else
+ print("Uploaded modules: " .. num)
+ return 0
+ end
+ end
+ },
+
+ -- List installed modules.
+ ["list"] = {
+ help = [[
+Usage: luadist [DEPLOYMENT_DIRECTORY] list [STRINGS...] [-VARIABLES...]
+
+ The 'list' command will list all modules installed in specified
+ DEPLOYMENT_DIRECTORY, which contain one or more optional STRINGS.
+
+ If DEPLOYMENT_DIRECTORY is not specified, the deployment directory
+ of LuaDist is used. If STRINGS are not specified, all installed modules
+ are listed.
+
+ Optional LuaDist configuration VARIABLES (e.g. -variable=value) can be
+ specified.
+ ]],
+
+ run = function (deploy_dir, strings)
+ deploy_dir = deploy_dir or dist.get_deploy_dir()
+ strings = strings or {}
+ assert(type(deploy_dir) == "string", "luadist.list: Argument 'deploy_dir' is not a string.")
+ assert(type(strings) == "table", "luadist.list: Argument 'strings' is not a table.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local deployed = dist.get_deployed(deploy_dir)
+ deployed = depends.filter_packages_by_strings(deployed, strings)
+
+ print("\nInstalled modules:")
+ print("==================\n")
+ for _, pkg in pairs(deployed) do
+ print(" " .. pkg.name .. "-" .. pkg.version .. "\t(" .. pkg.arch .. "-" .. pkg.type .. ")" .. (pkg.provided_by and "\t [provided by " .. pkg.provided_by .. "]" or ""))
+ end
+ print()
+ return 0
+ end
+ },
+
+ -- Search for modules in repositories.
+ ["search"] = {
+ help = [[
+Usage: luadist [DEPLOYMENT_DIRECTORY] search [STRINGS...] [-VARIABLES...]
+
+ The 'search' command will list all modules from repositories, which contain
+ one or more STRINGS.
+
+ If no STRINGS are specified, all available modules are listed.
+
+ Optional LuaDist configuration VARIABLES (e.g. -variable=value) can be
+ specified.
+ ]],
+
+ run = function (deploy_dir, strings)
+ deploy_dir = deploy_dir or dist.get_deploy_dir()
+ strings = strings or {}
+ assert(type(deploy_dir) == "string", "luadist.search: Argument 'deploy_dir' is not a string.")
+ assert(type(strings) == "table", "luadist.search: Argument 'strings' is not a table.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local available, err = mf.get_manifest()
+ if not available then
+ print(err)
+ os.exit(1)
+ end
+
+ available = depends.filter_packages_by_strings(available, strings)
+ available = depends.sort_by_names(available)
+
+ print("\nModules found:")
+ print("==============\n")
+ for _, pkg in pairs(available) do
+ print(" " .. pkg.name)
+ end
+ print()
+ return 0
+ end
+ },
+
+ -- Show information about modules.
+ ["info"] = {
+ help = [[
+Usage: luadist [DEPLOYMENT_DIRECTORY] info [MODULES...] [-VARIABLES...]
+
+ The 'info' command shows information about specified modules from
+ repositories. This command also shows whether modules are installed
+ in DEPLOYMENT_DIRECTORY.
+
+ If no MODULES are specified, all available modules are shown.
+ If DEPLOYMENT_DIRECTORY is not specified, the deployment directory
+ of LuaDist is used.
+
+ Optional LuaDist configuration VARIABLES (e.g. -variable=value) can be
+ specified.
+ ]],
+
+ run = function (deploy_dir, modules)
+ deploy_dir = deploy_dir or dist.get_deploy_dir()
+ modules = modules or {}
+ assert(type(deploy_dir) == "string", "luadist.info: Argument 'deploy_dir' is not a string.")
+ assert(type(modules) == "table", "luadist.info: Argument 'modules' is not a table.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local manifest, err = mf.get_manifest()
+ if not manifest then
+ print(err)
+ os.exit(1)
+ end
+
+ -- if no packages specified explicitly, show just info from .gitmodules for all packages available
+ if #modules == 0 then
+
+ modules = manifest
+ modules = depends.sort_by_names(modules)
+ local deployed = dist.get_deployed(deploy_dir)
+
+ print("")
+ for _, pkg in pairs(modules) do
+ print(" " .. pkg.name)
+ print(" Repository url: " .. (pkg.path or "N/A"))
+ print()
+ end
+ return 0
+
+ -- if some packages explicitly specified, retrieve and show detailed info about them
+ else
+
+ if #modules > 5 then
+ print("NOTE: More than 5 modules specified - operation may take a longer time.")
+ end
+
+ local deployed = dist.get_deployed(deploy_dir)
+
+ for _, module in pairs(modules) do
+ manifest, err = package.get_versions_info(module, manifest, deploy_dir, deployed)
+ if not manifest then
+ print(err)
+ os.exit(1)
+ end
+ end
+
+ modules = depends.find_packages(modules, manifest)
+ modules = depends.sort_by_names(modules)
+
+ print("")
+ for _, pkg in pairs(modules) do
+ print(" " .. pkg.name .. "-" .. pkg.version .. " (" .. pkg.arch .. "-" .. pkg.type ..")" .. (pkg.from_installed and " [info taken from installed version]" or ""))
+ print(" Description: " .. (pkg.desc or "N/A"))
+ print(" Author: " .. (pkg.author or "N/A"))
+ print(" Homepage: " .. (pkg.url or "N/A"))
+ print(" License: " .. (pkg.license or "N/A"))
+ print(" Repository url: " .. (pkg.path or "N/A"))
+ print(" Maintainer: " .. (pkg.maintainer or "N/A"))
+ if pkg.provides then print(" Provides: " .. utils.table_tostring(pkg.provides)) end
+ if pkg.depends then print(" Depends: " .. utils.table_tostring(pkg.depends)) end
+ if pkg.conflicts then print(" Conflicts: " .. utils.table_tostring(pkg.conflicts)) end
+ print(" State: " .. (depends.is_installed(pkg.name, deployed, pkg.version) and "installed" or "not installed"))
+ print()
+ end
+ return 0
+ end
+
+ end
+ },
+
+ -- Print dependency tree.
+ ["tree"] = {
+ help = [[
+Usage: luadist [DEPLOYMENT_DIRECTORY] tree [MODULES...] [-VARIABLES...]
+
+ The 'tree' command prints dependency tree for specified modules.
+
+ If no MODULES are specified, trees for all available modules are printed.
+ This information about modules is being cached in dependency manifest.
+
+ Optional LuaDist configuration VARIABLES (e.g. -variable=value) can be
+ specified.
+ ]],
+
+ run = function (deploy_dir, modules)
+ deploy_dir = deploy_dir or dist.get_deploy_dir()
+ modules = modules or {}
+ assert(type(deploy_dir) == "string", "luadist.info: Argument 'deploy_dir' is not a string.")
+ assert(type(modules) == "table", "luadist.info: Argument 'modules' is not a table.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local manifest, err = mf.get_manifest()
+ if not manifest then
+ print(err)
+ os.exit(1)
+ end
+
+ -- if no modules specified explicitly, assume all modules
+ if #modules == 0 then modules = depends.sort_by_names(manifest) end
+ print("Getting dependency information... (this may take a lot of time)")
+
+ for _, module in pairs(modules) do
+
+ -- if all modules are being queried, extract the name
+ if type(module) == "table" then module = module.name end
+
+ local dep_manifest, err = dist.dependency_info(module, deploy_dir)
+ if not dep_manifest then
+ print(err)
+ os.exit(1)
+ else
+
+ -- print the dependency tree
+ local heading = "Dependency tree for '" .. module .. "' (on " .. cfg.arch .. "-" .. cfg.type .. "):"
+ print("\n" .. heading .. "")
+ print(string.rep("=", #heading) .. "\n")
+
+ for _, pkg in pairs(dep_manifest) do
+
+ local pkg_version, pkg_tag = pkg.version, pkg.version
+ if pkg.was_scm_version then
+ pkg_version, pkg_tag = "scm", "HEAD"
+ end
+ print(" " .. pkg.name .. "-" .. pkg_version .. " (" .. pkg.path .. ", " .. pkg_tag .. ")")
+ if pkg.depends then
+ for _, dep in pairs(pkg.depends) do
+ if type(dep) ~= "table" then
+ local found = depends.sort_by_versions(depends.find_packages(dep, dep_manifest))[1]
+ if not found then
+ print("Could not find the dependency '" .. dep .. "' in the dependency manifest.")
+ os.exit(1)
+ end
+ print(" * " .. found.name .. "-" .. found.version .. " (" .. found.path .. ", " .. found.version .. ")")
+ end
+ end
+ end
+ print()
+ end
+
+ end
+ end
+ return 0
+
+ end
+ },
+
+ -- Selftest of LuaDist.
+ ["selftest"] = {
+ help = [[
+Usage: luadist [TEST_DIRECTORY] selftest [-VARIABLES...]
+
+ The 'selftest' command runs tests of LuaDist, located in TEST_DIRECTORY and
+ displays the results.
+
+ If no TEST_DIRECTORY is specified, the default test directory of LuaDist
+ deployment directory (i.e. ']] .. cfg.test_dir .. [[') is used.
+
+ Optional LuaDist configuration VARIABLES (e.g. -variable=value) can be
+ specified.
+ ]],
+
+ run = function (test_dir)
+ test_dir = test_dir or dist.get_deploy_dir()
+ assert(type(test_dir) == "string", "luadist.selftest: Argument 'deploy_dir' is not a string.")
+ test_dir = sys.abs_path(test_dir)
+
+ -- if the default parameter (i.e. deploy_dir) is passed, use the default test_dir
+ if test_dir == dist.get_deploy_dir() then
+ test_dir = sys.make_path(test_dir, cfg.test_dir)
+ end
+
+ -- try to get an iterator over test files and check it
+ local test_iterator, err = sys.get_directory(test_dir)
+ if not test_iterator then
+ print("Running tests from '" .. test_dir .. "' failed: " .. err)
+ os.exit(1)
+ end
+
+ -- run the tests
+ print("\nRunning tests:")
+ print("==============")
+ for test_file in sys.get_directory(test_dir) do
+ test_file = sys.make_path(test_dir, test_file)
+ if sys.is_file(test_file) then
+ print()
+ print(sys.extract_name(test_file) .. ":")
+ dofile(test_file)
+ end
+ end
+ print()
+ return 0
+ end
+ },
+}
+
+-- Run the functionality of LuaDist 'command' in the 'deploy_dir' with other items
+-- or settings/variables starting at 'other_idx' index of special variable 'arg'.
+local function run_command(deploy_dir, command, other_idx)
+ deploy_dir = deploy_dir or dist.get_deploy_dir()
+ assert(type(deploy_dir) == "string", "luadist.run_command: Argument 'deploy_dir' is not a string.")
+ assert(type(command) == "string", "luadist.run_command: Argument 'command' is not a string.")
+ assert(not other_idx or type(other_idx) == "number", "luadist.run_command: Argument 'other_idx' is not a number.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local items = {}
+ local cmake_variables = {}
+
+ -- parse items after the command (and LuaDist or CMake variables)
+ if other_idx then
+ for i = other_idx, #arg do
+
+ -- CMake variable
+ if arg[i]:match("^%-D(.-)=(.*)$") then
+ local variable, value = arg[i]:match("^%-D(.-)=(.*)$")
+ cmake_variables[variable] = value
+
+ -- LuaDist variable
+ elseif arg[i]:match("^%-(.-)=(.*)$") then
+ local variable, value = arg[i]:match("^%-(.-)=(.*)$")
+ apply_settings(variable, value)
+
+ -- LuaDist boolean variable with implicit 'true' value
+ elseif arg[i]:match("^%-(.-)$") then
+ local variable, value = arg[i]:match("^%-(.-)$")
+ apply_settings(variable, "true")
+
+ -- not a LuaDist or CMake variable
+ else
+ table.insert(items, arg[i])
+ end
+ end
+ end
+
+ -- run the required LuaDist functionality
+ return commands[command].run(sys.abs_path(deploy_dir), items, cmake_variables)
+end
+
+-- Print information about Luadist (version, license, etc.).
+function print_info()
+ print([[
+LuaDist-git ]].. cfg.version .. [[ - Lua package manager for the LuaDist deployment system.
+Released under the MIT License. See https://github.com/luadist/luadist-git
+ ]])
+ return 0
+end
+
+-- Convenience function for printing the main luadist help.
+function print_help()
+ return run_command(nil, "help")
+end
+
+-- Set the LuaDist 'variable' to the 'value'.
+-- See available settings in 'dist.config' module.
+function apply_settings(variable, value)
+ assert(type(variable) == "string", "luadist.apply_settings: Argument 'variable' is not a string.")
+ assert(type(value) == "string", "luadist.apply_settings: Argument 'value' is not a string.")
+
+ -- check whether the settings variable exists
+ if cfg[variable] == nil then
+ print("Unknown LuaDist configuration option: '" .. variable .. "'.")
+ os.exit(1)
+
+ -- ensure the right type
+
+ elseif type(cfg[variable]) == "boolean" then
+ value = value:lower()
+ if value == "true" or value == "yes" or value == "on" or value == "1" then
+ value = true
+ elseif value == "false" or value == "no" or value == "off" or value == "0" then
+ value = false
+ else
+ print("Value of LuaDist option '" .. variable .. "' must be a boolean.")
+ os.exit(1)
+ end
+
+ elseif type(cfg[variable]) == "number" then
+ value = tonumber(value)
+ if not value then
+ print("Value of LuaDist option '" .. variable .. "' must be a number.")
+ os.exit(1)
+ end
+
+ elseif type(cfg[variable]) == "table" then
+ local err
+ value, err = utils.make_table(value, ",")
+ if not value then
+ print("Error when parsing the LuaDist variable '" .. variable .. "': " .. err)
+ os.exit(1)
+ end
+ end
+
+ -- set the LuaDist variable
+ cfg[variable] = value
+
+end
+
+-- Parse command line input and run the required command.
+if pcall(debug.getlocal, 4, 1) then
+ return commands -- return commands when used as module
+elseif not commands[arg[1]] and commands[arg[2]] then
+ -- deploy_dir specified
+ return run_command(arg[1], arg[2], 3)
+elseif commands[arg[1]] then
+ -- deploy_dir not specified
+ return run_command(dist.get_deploy_dir(), arg[1], 2)
+else
+ -- unknown command
+ if arg[1] then
+ print("Unknown command '" .. arg[1] .. "'. Printing help...\n")
+ print_help()
+ os.exit(1)
+ end
+ return print_help()
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/ast.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/ast.lua
new file mode 100644
index 0000000..12244d9
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/ast.lua
@@ -0,0 +1,915 @@
+-- luainspect.ast - Lua Abstract Syntax Tree (AST) and token list operations.
+--
+-- Two main structures are maintained. A Metalua-style AST represents the
+-- nested syntactic structure obtained from the parse.
+-- A separate linear ordered list of tokens represents the syntactic structure
+-- from the lexing, including line information (character positions only not row/columns),
+-- comments, and keywords, which is originally built from the lineinfo attributes
+-- injected by Metalua into the AST (IMPROVE: it probably would be simpler
+-- to obtain this from the lexer directly rather then inferring it from the parsing).
+-- During AST manipulations, the lineinfo maintained in the AST is ignored
+-- because it was found more difficult to maintain and not in the optimal format.
+--
+-- The contained code deals with
+-- - Building the AST from source.
+-- - Building the tokenlist from the AST lineinfo.
+-- - Querying the AST+tokenlist.
+-- - Modifying the AST+tokenlist (including incremental parsing source -> AST)
+-- - Annotating the AST with navigational info (e.g. parent links) to assist queries.
+-- - Dumping the tokenlist for debugging.
+--
+-- (c) 2010 David Manura, MIT License.
+
+
+--! require 'luainspect.typecheck' (context)
+
+local mlc = require 'metalua.compiler'.new()
+
+local M = {}
+
+--[=TESTSUITE
+-- utilities
+local ops = {}
+ops['=='] = function(a,b) return a == b end
+local function check(opname, a, b)
+ local op = assert(ops[opname])
+ if not op(a,b) then
+ error("fail == " .. tostring(a) .. " " .. tostring(b))
+ end
+end
+--]=]
+
+-- CATEGORY: debug
+local function DEBUG(...)
+ if LUAINSPECT_DEBUG then
+ print('DEBUG:', ...)
+ end
+end
+
+
+-- Converts character position to row,column position in string src.
+-- Add values are 1-indexed.
+function M.pos_to_linecol(pos, src)
+ local linenum = 1
+ local lasteolpos = 0
+ for eolpos in src:gmatch"()\n" do
+ if eolpos > pos then break end
+ linenum = linenum + 1
+ lasteolpos = eolpos
+ end
+ local colnum = pos - lasteolpos
+ return linenum, colnum
+end
+
+-- Removes any sheband ("#!") line from Lua source string.
+-- CATEGORY: Lua parsing
+function M.remove_shebang(src)
+ local shebang = src:match("^#![^\r\n]*")
+ return shebang and (" "):rep(#shebang) .. src:sub(#shebang+1) or src
+end
+
+
+-- Custom version of loadstring that parses out line number info
+-- CATEGORY: Lua parsing
+function M.loadstring(src)
+ local f, err = loadstring(src, "")
+ if f then
+ return f
+ else
+ err = err:gsub('^%[string ""%]:', "")
+ local linenum = assert(err:match("(%d+):"))
+ local colnum = 0
+ local linenum2 = err:match("^%d+: '[^']+' expected %(to close '[^']+' at line (%d+)")
+ return nil, err, linenum, colnum, linenum2
+ end
+end
+
+
+-- helper for ast_from_string. Raises on error.
+-- FIX? filename currently ignored in Metalua
+-- CATEGORY: Lua parsing
+local function ast_from_string_helper(src, filename)
+ return mlc:src_to_ast(src, filename)
+end
+
+
+-- Counts number of lines in text.
+-- Warning: the decision of whether to count a trailing new-line in a file
+-- or an empty file as a line is a little subjective. This function currently
+-- defines the line count as 1 plus the number of new line characters.
+-- CATEGORY: utility/string
+local function linecount(text)
+ local n = 1
+ for _ in text:gmatch'\n' do
+ n = n + 1
+ end
+ return n
+end
+
+
+-- Converts Lua source string to Lua AST (via mlp/gg).
+-- CATEGORY: Lua parsing
+function M.ast_from_string(src, filename)
+ local ok, ast = pcall(ast_from_string_helper, src, filename)
+ if not ok then
+ local err = ast
+ err = err:match('[^\n]*')
+ err = err:gsub("^.-:%s*line", "line")
+ -- mlp.chunk prepending this is undesirable. error(msg,0) would be better in gg.lua. Reported.
+ -- TODO-Metalua: remove when fixed in Metalua.
+ local linenum, colnum = err:match("line (%d+), char (%d+)")
+ if not linenum then
+ -- Metalua libraries may return "...gg.lua:56: .../mlp_misc.lua:179: End-of-file expected"
+ -- without the normal line/char numbers given things like "if x then end end". Should be
+ -- fixed probably with gg.parse_error in _chunk in mlp_misc.lua.
+ -- TODO-Metalua: remove when fixed in Metalua.
+ linenum = linecount(src)
+ colnum = 1
+ end
+ local linenum2 = nil
+ return nil, err, linenum, colnum, linenum2
+ else
+ return ast
+ end
+end
+
+
+-- Simple comment parser. Returns Metalua-style comment.
+-- CATEGORY: Lua lexing
+local function quick_parse_comment(src)
+ local s = src:match"^%-%-([^\n]*)()\n$"
+ if s then return {s, 1, #src, 'short'} end
+ local _, s = src:match(lexer.lexer.patterns.long_comment .. '\r?\n?$')
+ if s then return {s, 1, #src, 'long'} end
+ return nil
+end
+--FIX:check new-line correctness
+--note: currently requiring \n at end of single line comment to avoid
+-- incremental compilation with `--x\nf()` and removing \n from still
+-- recognizing as comment `--x`.
+-- currently allowing \r\n at end of long comment since Metalua includes
+-- it in lineinfo of long comment (FIX:Metalua?)
+
+
+-- Gets length of longest prefix string in both provided strings.
+-- Returns max n such that text1:sub(1,n) == text2:sub(1,n) and n <= max(#text1,#text2)
+-- CATEGORY: string utility
+local function longest_prefix(text1, text2)
+ local nmin = 0
+ local nmax = math.min(#text1, #text2)
+ while nmax > nmin do
+ local nmid = math.ceil((nmin+nmax)/2)
+ if text1:sub(1,nmid) == text2:sub(1,nmid) then
+ nmin = nmid
+ else
+ nmax = nmid-1
+ end
+ end
+ return nmin
+end
+
+
+-- Gets length of longest postfix string in both provided strings.
+-- Returns max n such that text1:sub(-n) == text2:sub(-n) and n <= max(#text1,#text2)
+-- CATEGORY: string utility
+local function longest_postfix(text1, text2)
+ local nmin = 0
+ local nmax = math.min(#text1, #text2)
+ while nmax > nmin do
+ local nmid = math.ceil((nmin+nmax)/2)
+ if text1:sub(-nmid) == text2:sub(-nmid) then --[*]
+ nmin = nmid
+ else
+ nmax = nmid-1
+ end
+ end
+ return nmin
+end -- differs from longest_prefix only on line [*]
+
+
+
+-- Determines AST node that must be re-evaluated upon changing code string from
+-- `src` to `bsrc`, given previous top_ast/tokenlist/src.
+-- Note: decorates top_ast as side-effect.
+-- If preserve is true, then does not expand AST match even if replacement is invalid.
+-- CATEGORY: AST/tokenlist manipulation
+function M.invalidated_code(top_ast, tokenlist, src, bsrc, preserve)
+ -- Converts posiiton range in src to position range in bsrc.
+ local function range_transform(src_fpos, src_lpos)
+ local src_nlpos = #src - src_lpos
+ local bsrc_fpos = src_fpos
+ local bsrc_lpos = #bsrc - src_nlpos
+ return bsrc_fpos, bsrc_lpos
+ end
+
+ if src == bsrc then return end -- up-to-date
+
+ -- Find range of positions in src that differences correspond to.
+ -- Note: for zero byte range, src_pos2 = src_pos1 - 1.
+ local npre = longest_prefix(src, bsrc)
+ local npost = math.min(#src-npre, longest_postfix(src, bsrc))
+ -- note: min avoids overlap ambiguity
+ local src_fpos, src_lpos = 1 + npre, #src - npost
+
+ -- Find smallest AST node containing src range above. May also
+ -- be contained in (smaller) comment or whitespace.
+ local match_ast, match_comment, iswhitespace =
+ M.smallest_ast_containing_range(top_ast, tokenlist, src_fpos, src_lpos)
+ DEBUG('invalidate-smallest:', match_ast and (match_ast.tag or 'notag'), match_comment, iswhitespace)
+
+ -- Determine which (ast, comment, or whitespace) to match, and get its pos range in src and bsrc.
+ local srcm_fpos, srcm_lpos, bsrcm_fpos, bsrcm_lpos, mast, mtype
+ if iswhitespace then
+ mast, mtype = nil, 'whitespace'
+ srcm_fpos, srcm_lpos = src_fpos, src_lpos
+ elseif match_comment then
+ mast, mtype = match_comment, 'comment'
+ srcm_fpos, srcm_lpos = match_comment.fpos, match_comment.lpos
+ else
+ mast, mtype = match_ast, 'ast'
+ repeat
+ srcm_fpos, srcm_lpos = M.ast_pos_range(mast, tokenlist)
+ if not srcm_fpos then
+ if mast == top_ast then
+ srcm_fpos, srcm_lpos = 1, #src
+ break
+ else
+ M.ensure_parents_marked(top_ast)
+ mast = mast.parent
+ end
+ end
+ until srcm_fpos
+ end
+ bsrcm_fpos, bsrcm_lpos = range_transform(srcm_fpos, srcm_lpos)
+
+ -- Never expand match if preserve specified.
+ if preserve then
+ return srcm_fpos, srcm_lpos, bsrcm_fpos, bsrcm_lpos, mast, mtype
+ end
+
+ -- Determine if replacement could break parent nodes.
+ local isreplacesafe
+ if mtype == 'whitespace' then
+ if bsrc:sub(bsrcm_fpos, bsrcm_lpos):match'^%s*$' then -- replaced with whitespace
+ if bsrc:sub(bsrcm_fpos-1, bsrcm_lpos+1):match'%s' then -- not eliminating whitespace
+ isreplacesafe = true
+ end
+ end
+ elseif mtype == 'comment' then
+ local m2src = bsrc:sub(bsrcm_fpos, bsrcm_lpos)
+ DEBUG('invalidate-comment[' .. m2src .. ']')
+ if quick_parse_comment(m2src) then -- replaced with comment
+ isreplacesafe = true
+ end
+ end
+ if isreplacesafe then -- return on safe replacement
+ return srcm_fpos, srcm_lpos, bsrcm_fpos, bsrcm_lpos, mast, mtype
+ end
+
+ -- Find smallest containing statement block that will compile (or top_ast).
+ while 1 do
+ match_ast = M.get_containing_statementblock(match_ast, top_ast)
+ if match_ast == top_ast then
+ return 1,#src, 1, #bsrc, match_ast, 'statblock'
+ -- entire AST invalidated
+ end
+ local srcm_fpos, srcm_lpos = M.ast_pos_range(match_ast, tokenlist)
+ local bsrcm_fpos, bsrcm_lpos = range_transform(srcm_fpos, srcm_lpos)
+ local msrc = bsrc:sub(bsrcm_fpos, bsrcm_lpos)
+ DEBUG('invalidate-statblock:', match_ast and match_ast.tag, '[' .. msrc .. ']')
+ if loadstring(msrc) then -- compiled
+ return srcm_fpos, srcm_lpos, bsrcm_fpos, bsrcm_lpos, match_ast, 'statblock'
+ end
+ M.ensure_parents_marked(top_ast)
+ match_ast = match_ast.parent
+ end
+end
+
+
+-- Walks AST `ast` in arbitrary order, visiting each node `n`, executing `fdown(n)` (if specified)
+-- when doing down and `fup(n)` (if specified) when going if.
+-- CATEGORY: AST walk
+function M.walk(ast, fdown, fup)
+ assert(type(ast) == 'table')
+ if fdown then fdown(ast) end
+ for _,bast in ipairs(ast) do
+ if type(bast) == 'table' then
+ M.walk(bast, fdown, fup)
+ end
+ end
+ if fup then fup(ast) end
+end
+
+
+-- Replaces contents of table t1 with contents of table t2.
+-- Does not change metatable (if any).
+-- This function is useful for swapping one AST node with another
+-- while preserving any references to the node.
+-- CATEGORY: table utility
+function M.switchtable(t1, t2)
+ for k in pairs(t1) do t1[k] = nil end
+ for k in pairs(t2) do t1[k] = t2[k] end
+end
+
+
+-- Inserts all elements in list bt at index i in list t.
+-- CATEGORY: table utility
+local function tinsertlist(t, i, bt)
+ local oldtlen, delta = #t, i - 1
+ for ti = #t + 1, #t + #bt do t[ti] = false end -- preallocate (avoid holes)
+ for ti = oldtlen, i, -1 do t[ti + #bt] = t[ti] end -- shift
+ for bi = 1, #bt do t[bi + delta] = bt[bi] end -- fill
+end
+--[=[TESTSUITE:
+local function _tinsertlist(t, i, bt)
+ for bi=#bt,1,-1 do table.insert(t, i, bt[bi]) end
+end -- equivalent but MUCH less efficient for large tables
+local function _tinsertlist(t, i, bt)
+ for bi=1,#bt do table.insert(t, i+bi-1, bt[bi]) end
+end -- equivalent but MUCH less efficient for large tables
+local t = {}; tinsertlist(t, 1, {}); assert(table.concat(t)=='')
+local t = {}; tinsertlist(t, 1, {2,3}); assert(table.concat(t)=='23')
+local t = {4}; tinsertlist(t, 1, {2,3}); assert(table.concat(t)=='234')
+local t = {2}; tinsertlist(t, 2, {3,4}); assert(table.concat(t)=='234')
+local t = {4,5}; tinsertlist(t, 1, {2,3}); assert(table.concat(t)=='2345')
+local t = {2,5}; tinsertlist(t, 2, {3,4}); assert(table.concat(t)=='2345')
+local t = {2,3}; tinsertlist(t, 3, {4,5}); assert(table.concat(t)=='2345')
+print 'DONE'
+--]=]
+
+
+
+-- Gets list of keyword positions related to node ast in source src
+-- note: ast must be visible, i.e. have lineinfo (e.g. unlike `Id "self" definition).
+-- Note: includes operators.
+-- Note: Assumes ast Metalua-style lineinfo is valid.
+-- CATEGORY: tokenlist build
+function M.get_keywords(ast, src)
+ local list = {}
+ if not ast.lineinfo then return list end
+ -- examine space between each pair of children i and j.
+ -- special cases: 0 is before first child and #ast+1 is after last child
+
+ -- Put children in lexical order.
+ -- Some binary operations have arguments reversed from lexical order.
+ -- For example, `a > b` becomes `Op{'lt', `Id 'b', `Id 'a'}
+ local oast =
+ (ast.tag == 'Op' and #ast == 3 and tostring(ast[2].lineinfo.first):match('|L(%d+)') > tostring(ast[3].lineinfo.first):match('|L(%d+)'))
+ and {ast[1], ast[3], ast[2]} or ast
+
+ local i = 0
+ while i <= #ast do
+ -- j is node following i that has lineinfo
+ local j = i+1; while j < #ast+1 and not oast[j].lineinfo do j=j+1 end
+
+ -- Get position range [fpos,lpos] between subsequent children.
+ local fpos
+ if i == 0 then -- before first child
+ fpos = tonumber(tostring(ast.lineinfo.first):match('|L(%d+)'))
+ else
+ local last = oast[i].lineinfo.last; local c = last.comments
+ fpos = (c and #c > 0 and c[#c][3] or tostring(last):match('|L(%d+)')) + 1
+ end
+ local lpos
+ if j == #ast+1 then -- after last child
+ lpos = tonumber(tostring(ast.lineinfo.last):match('|L(%d+)'))
+ else
+ local first = oast[j].lineinfo.first; local c = first.comments
+ lpos = (c and #c > 0 and c[1][2] or tostring(first):match('|L(%d+)')) - 1
+ end
+
+ -- Find keyword in range.
+ local spos = fpos
+ repeat
+ local mfpos, tok, mlppos = src:match("^%s*()(%a+)()", spos)
+ if not mfpos then
+ mfpos, tok, mlppos = src:match("^%s*()(%p+)()", spos)
+ end
+ if mfpos then
+ local mlpos = mlppos-1
+ if mlpos > lpos then mlpos = lpos end
+ if mlpos >= mfpos then
+ list[#list+1] = mfpos
+ list[#list+1] = mlpos
+ end
+ end
+ spos = mlppos
+ until not spos or spos > lpos
+ -- note: finds single keyword. in `local function` returns only `local`
+ --DEBUG(i,j ,'test[' .. src:sub(fpos, lpos) .. ']')
+
+ i = j -- next
+
+ --DESIGN:Lua: comment: string.match accepts a start position but not a stop position
+ end
+ return list
+end
+-- Q:Metalua: does ast.lineinfo[loc].comments imply #ast.lineinfo[loc].comments > 0 ?
+
+
+
+-- Generates ordered list of tokens in top_ast/src.
+-- Note: currently ignores operators and parens.
+-- Note: Modifies ast.
+-- Note: Assumes ast Metalua-style lineinfo is valid.
+-- CATEGORY: AST/tokenlist query
+local isterminal = {Nil=true, Dots=true, True=true, False=true, Number=true, String=true,
+ Dots=true, Id=true}
+local function compare_tokens_(atoken, btoken) return atoken.fpos < btoken.fpos end
+function M.ast_to_tokenlist(top_ast, src)
+ local tokens = {} -- {nbytes=#src}
+ local isseen = {}
+ M.walk(top_ast, function(ast)
+ if isterminal[ast.tag] then -- Extract terminal
+ local token = ast
+ if ast.lineinfo then
+ token.fpos = tonumber(tostring(ast.lineinfo.first):match('|L(%d+)'))
+ token.lpos = tonumber(tostring(ast.lineinfo.last):match('|L(%d+)'))
+ token.ast = ast
+ table.insert(tokens, token)
+ end
+ else -- Extract non-terminal
+ local keywordposlist = M.get_keywords(ast, src)
+ for i=1,#keywordposlist,2 do
+ local fpos, lpos = keywordposlist[i], keywordposlist[i+1]
+ local toksrc = src:sub(fpos, lpos)
+ local token = {tag='Keyword', fpos=fpos, lpos=lpos, ast=ast, toksrc}
+ table.insert(tokens, token)
+ end
+ end
+ -- Extract comments
+ for i=1,2 do
+ local comments = ast.lineinfo and ast.lineinfo[i==1 and 'first' or 'last'].comments
+ if comments then for _, comment in ipairs(comments) do
+ if not isseen[comment] then
+ comment.tag = 'Comment'
+ local token = comment
+ token.fpos = tonumber(tostring(comment.lineinfo.first):match('|L(%d+)'))
+ token.lpos = tonumber(tostring(comment.lineinfo.last):match('|L(%d+)'))
+ token.ast = comment
+ table.insert(tokens, token)
+ isseen[comment] = true
+ end
+ end end
+ end
+ end, nil)
+ table.sort(tokens, compare_tokens_)
+ return tokens
+end
+
+
+-- Gets tokenlist range [fidx,lidx] covered by ast. Returns nil,nil if not found.
+--FIX:PERFORMANCE:this is slow on large files.
+-- CATEGORY: AST/tokenlist query
+function M.ast_idx_range_in_tokenlist(tokenlist, ast)
+ -- Get list of primary nodes under ast.
+ local isold = {}; M.walk(ast, function(ast) isold[ast] = true end)
+ -- Get range.
+ local fidx, lidx
+ for idx=1,#tokenlist do
+ local token = tokenlist[idx]
+ if isold[token.ast] then
+ lidx = idx
+ if not fidx then fidx = idx end
+ end
+ end
+ return fidx, lidx
+end
+
+
+-- Gets index range in tokenlist overlapped by character position range [fpos, lpos].
+-- For example, `do ff() end` with range ` ff() ` would match tokens `ff()`.
+-- Tokens partly inside range are counted, so range `f()` would match tokens `ff()`.
+-- If lidx = fidx - 1, then position range is whitespace between tokens lidx (on left)
+-- and fidx (on right), and this may include token pseudoindices 0 (start of file) and
+-- #tokenlist+1 (end of file).
+-- Note: lpos == fpos - 1 indicates zero-width range between chars lpos and fpos.
+-- CATEGORY: tokenlist query
+function M.tokenlist_idx_range_over_pos_range(tokenlist, fpos, lpos)
+ -- Find first/last indices of tokens overlapped (even partly) by position range.
+ local fidx, lidx
+ for idx=1,#tokenlist do
+ local token = tokenlist[idx]
+ --if (token.fpos >= fpos and token.fpos <= lpos) or (token.lpos >= fpos and token.lpos <= lpos) then -- token overlaps range
+ if fpos <= token.lpos and lpos >= token.fpos then -- range overlaps token (even partially)
+ if not fidx then fidx = idx end
+ lidx = idx
+ end
+ end
+ if not fidx then -- on fail, check between tokens
+ for idx=1,#tokenlist+1 do -- between idx-1 and idx
+ local tokfpos, toklpos = tokenlist[idx-1] and tokenlist[idx-1].lpos, tokenlist[idx] and tokenlist[idx].fpos
+ if (not tokfpos or fpos > tokfpos) and (not toklpos or lpos < toklpos) then -- range between tokens
+ return idx, idx-1
+ end
+ end
+ end
+ return fidx, lidx
+end
+--[=[TESTSUITE
+local function test(...)
+ return table.concat({M.tokenlist_idx_range_over_pos_range(...)}, ',')
+end
+check('==', test({}, 2, 2), "1,0") -- no tokens
+check('==', test({{tag='Id', fpos=1, lpos=1}}, 2, 2), "2,1") -- right of one token
+check('==', test({{tag='Id', fpos=3, lpos=3}}, 2, 2), "1,0") -- left of one token
+check('==', test({{tag='Id', fpos=3, lpos=4}}, 2, 3), "1,1") -- left partial overlap one token
+check('==', test({{tag='Id', fpos=3, lpos=4}}, 4, 5), "1,1") -- right partial overlap one token
+check('==', test({{tag='Id', fpos=3, lpos=6}}, 4, 5), "1,1") -- partial inner overlap one token
+check('==', test({{tag='Id', fpos=3, lpos=6}}, 3, 6), "1,1") -- exact overlap one token
+check('==', test({{tag='Id', fpos=4, lpos=5}}, 3, 6), "1,1") -- extra overlap one token
+check('==', test({{tag='Id', fpos=2, lpos=3}, {tag='Id', fpos=5, lpos=6}}, 4, 4), "2,1") -- between tokens, " " exact
+check('==', test({{tag='Id', fpos=2, lpos=3}, {tag='Id', fpos=5, lpos=6}}, 4, 3), "2,1") -- between tokens, "" on left
+check('==', test({{tag='Id', fpos=2, lpos=3}, {tag='Id', fpos=5, lpos=6}}, 5, 4), "2,1") -- between tokens, "" on right
+check('==', test({{tag='Id', fpos=2, lpos=3}, {tag='Id', fpos=4, lpos=5}}, 4, 3), "2,1") -- between tokens, "" exact
+--]=]
+
+-- Removes tokens in tokenlist covered by ast.
+-- CATEGORY: tokenlist manipulation
+local function remove_ast_in_tokenlist(tokenlist, ast)
+ local fidx, lidx = M.ast_idx_range_in_tokenlist(tokenlist, ast)
+ if fidx then -- note: fidx implies lidx
+ for idx=lidx,fidx,-1 do table.remove(tokenlist, idx) end
+ end
+end
+
+
+-- Inserts tokens from btokenlist into tokenlist. Preserves sort.
+-- CATEGORY: tokenlist manipulation
+local function insert_tokenlist(tokenlist, btokenlist)
+ local ftoken = btokenlist[1]
+ if ftoken then
+ -- Get index in tokenlist in which to insert tokens in btokenlist.
+ local fidx
+ for idx=1,#tokenlist do
+ if tokenlist[idx].fpos > ftoken.fpos then fidx = idx; break end
+ end
+ fidx = fidx or #tokenlist + 1 -- else append
+
+ -- Insert tokens.
+ tinsertlist(tokenlist, fidx, btokenlist)
+ end
+end
+
+
+-- Get character position range covered by ast in tokenlist. Returns nil,nil on not found.
+-- CATEGORY: AST/tokenlist query
+function M.ast_pos_range(ast, tokenlist) -- IMPROVE:style: ast_idx_range_in_tokenlist has params reversed
+ local fidx, lidx = M.ast_idx_range_in_tokenlist(tokenlist, ast)
+ if fidx then
+ return tokenlist[fidx].fpos, tokenlist[lidx].lpos
+ else
+ return nil, nil
+ end
+end
+
+
+-- Gets string representation of AST node. nil if none.
+-- IMPROVE: what if node is empty block?
+-- CATEGORY: AST/tokenlist query
+function M.ast_to_text(ast, tokenlist, src) -- IMPROVE:style: ast_idx_range_in_tokenlist has params reversed
+ local fpos, lpos = M.ast_pos_range(ast, tokenlist)
+ if fpos then
+ return src:sub(fpos, lpos)
+ else
+ return nil
+ end
+end
+
+
+
+-- Gets smallest AST node in top_ast/tokenlist/src
+-- completely containing position range [pos1, pos2].
+-- careful: "function" is not part of the `Function node.
+-- If range is inside comment, returns comment also.
+-- If range is inside whitespace, then returns true in third return value.
+-- CATEGORY: AST/tokenlist query
+function M.smallest_ast_containing_range(top_ast, tokenlist, pos1, pos2)
+ local f0idx, l0idx = M.tokenlist_idx_range_over_pos_range(tokenlist, pos1, pos2)
+
+ -- Find enclosing AST.
+ M.ensure_parents_marked(top_ast)
+ local fidx, lidx = f0idx, l0idx
+ while tokenlist[fidx] and not tokenlist[fidx].ast.parent do fidx = fidx - 1 end
+ while tokenlist[lidx] and not tokenlist[lidx].ast.parent do lidx = lidx + 1 end
+ -- DEBUG(fidx, lidx, f0idx, l0idx, #tokenlist, pos1, pos2, tokenlist[fidx], tokenlist[lidx])
+ local ast = not (tokenlist[fidx] and tokenlist[lidx]) and top_ast or
+ M.common_ast_parent(tokenlist[fidx].ast, tokenlist[lidx].ast, top_ast)
+ -- DEBUG('m2', tokenlist[fidx], tokenlist[lidx], top_ast, ast, ast and ast.tag)
+ if l0idx == f0idx - 1 then -- whitespace
+ return ast, nil, true
+ elseif l0idx == f0idx and tokenlist[l0idx].tag == 'Comment' then
+ return ast, tokenlist[l0idx], nil
+ else
+ return ast, nil, nil
+ end
+end
+--IMPROVE: handle string edits and maybe others
+
+
+-- Gets smallest statement block containing position pos or
+-- nearest statement block before pos, whichever is smaller, given ast/tokenlist.
+function M.current_statementblock(ast, tokenlist, pos)
+ local fidx,lidx = M.tokenlist_idx_range_over_pos_range(tokenlist, pos, pos)
+ if fidx > lidx then fidx = lidx end -- use nearest backward
+
+ -- Find closest AST node backward
+ while fidx >= 1 and tokenlist[fidx].tag == 'Comment' do fidx=fidx-1 end
+
+ if fidx < 1 then return ast, false end
+ local mast = tokenlist[fidx].ast
+ if not mast then return ast, false end
+ mast = M.get_containing_statementblock(mast, ast)
+ local isafter = false
+ if mast.tag2 ~= 'Block' then
+ local mfidx,mlidx = M.ast_idx_range_in_tokenlist(tokenlist, mast)
+ if pos > mlidx then
+ isafter = true
+ end
+ end
+
+ return mast, isafter
+end
+
+-- Gets index of bast in ast (nil if not found).
+-- CATEGORY: AST query
+function M.ast_idx(ast, bast)
+ for idx=1,#ast do
+ if ast[idx] == bast then return idx end
+ end
+ return nil
+end
+
+
+-- Gets parent of ast and index of ast in parent.
+-- Root node top_ast must also be provided. Returns nil, nil if ast is root.
+-- Note: may call mark_parents.
+-- CATEGORY: AST query
+function M.ast_parent_idx(top_ast, ast)
+ if ast == top_ast then return nil, nil end
+ M.ensure_parents_marked(top_ast); assert(ast.parent)
+ local idx = M.ast_idx(ast.parent, ast)
+ return ast.parent, idx
+end
+
+
+-- Gets common parent of aast and bast. Always returns value.
+-- Must provide root top_ast too.
+-- CATEGORY: AST query
+function M.common_ast_parent(aast, bast, top_ast)
+ M.ensure_parents_marked(top_ast)
+ local isparent = {}
+ local tast = bast; repeat isparent[tast] = true; tast = tast.parent until not tast
+ local uast = aast; repeat if isparent[uast] then return uast end; uast = uast.parent until not uast
+ assert(false)
+end
+
+
+-- Replaces old_ast with new_ast/new_tokenlist in top_ast/tokenlist.
+-- Note: assumes new_ast is a block. assumes old_ast is a statement or block.
+-- CATEGORY: AST/tokenlist
+function M.replace_statements(top_ast, tokenlist, old_ast, new_ast, new_tokenlist)
+ remove_ast_in_tokenlist(tokenlist, old_ast)
+ insert_tokenlist(tokenlist, new_tokenlist)
+ if old_ast == top_ast then -- special case: no parent
+ M.switchtable(old_ast, new_ast) -- note: safe since block is not in tokenlist.
+ else
+ local parent_ast, idx = M.ast_parent_idx(top_ast, old_ast)
+ table.remove(parent_ast, idx)
+ tinsertlist(parent_ast, idx, new_ast)
+ end
+
+ -- fixup annotations
+ for _,bast in ipairs(new_ast) do
+ if top_ast.tag2 then M.mark_tag2(bast, bast.tag == 'Do' and 'StatBlock' or 'Block') end
+ if old_ast.parent then M.mark_parents(bast, old_ast.parent) end
+ end
+end
+
+
+-- Adjusts lineinfo in tokenlist.
+-- All char positions starting at pos1 are shifted by delta number of chars.
+-- CATEGORY: tokenlist
+function M.adjust_lineinfo(tokenlist, pos1, delta)
+ for _,token in ipairs(tokenlist) do
+ if token.fpos >= pos1 then
+ token.fpos = token.fpos + delta
+ end
+ if token.lpos >= pos1 then
+ token.lpos = token.lpos + delta
+ end
+ end
+ --tokenlist.nbytes = tokenlist.nbytes + delta
+end
+
+
+-- For each node n in ast, sets n.parent to parent node of n.
+-- Assumes ast.parent will be parent_ast (may be nil)
+-- CATEGORY: AST query
+function M.mark_parents(ast, parent_ast)
+ ast.parent = parent_ast
+ for _,ast2 in ipairs(ast) do
+ if type(ast2) == 'table' then
+ M.mark_parents(ast2, ast)
+ end
+ end
+end
+
+
+-- Calls mark_parents(ast) if ast not marked.
+-- CATEGORY: AST query
+function M.ensure_parents_marked(ast)
+ if ast[1] and not ast[1].parent then M.mark_parents(ast) end
+end
+
+
+-- For each node n in ast, sets n.tag2 to context string:
+-- 'Block' - node is block
+-- 'Stat' - node is statement
+-- 'StatBlock' - node is statement and block (i.e. `Do)
+-- 'Exp' - node is expression
+-- 'Explist' - node is expression list (or identifier list)
+-- 'Pair' - node is key-value pair in table constructor
+-- note: ast.tag2 will be set to context.
+-- CATEGORY: AST query
+local iscertainstat = {Do=true, Set=true, While=true, Repeat=true, If=true,
+ Fornum=true, Forin=true, Local=true, Localrec=true, Return=true, Break=true}
+function M.mark_tag2(ast, context)
+ context = context or 'Block'
+ ast.tag2 = context
+ for i,bast in ipairs(ast) do
+ if type(bast) == 'table' then
+ local nextcontext
+ if bast.tag == 'Do' then
+ nextcontext = 'StatBlock'
+ elseif iscertainstat[bast.tag] then
+ nextcontext = 'Stat'
+ elseif bast.tag == 'Call' or bast.tag == 'Invoke' then
+ nextcontext = context == 'Block' and 'Stat' or 'Exp'
+ --DESIGN:Metalua: these calls actually contain expression lists,
+ -- but the expression list is not represented as a complete node
+ -- by Metalua (as blocks are in `Do statements)
+ elseif bast.tag == 'Pair' then
+ nextcontext = 'Pair'
+ elseif not bast.tag then
+ if ast.tag == 'Set' or ast.tag == 'Local' or ast.tag == 'Localrec'
+ or ast.tag == 'Forin' and i <= 2
+ or ast.tag == 'Function' and i == 1
+ then
+ nextcontext = 'Explist'
+ else
+ nextcontext = 'Block'
+ end
+ else
+ nextcontext = 'Exp'
+ end
+ M.mark_tag2(bast, nextcontext)
+ end
+ end
+end
+
+
+-- Gets smallest statement or block containing or being `ast`.
+-- The AST root node `top_ast` must also be provided.
+-- Note: may decorate AST as side-effect (mark_tag2/mark_parents).
+-- top_ast is assumed a block, so this is always successful.
+-- CATEGORY: AST query
+function M.get_containing_statementblock(ast, top_ast)
+ if not top_ast.tag2 then M.mark_tag2(top_ast) end
+ if ast.tag2 == 'Stat' or ast.tag2 == 'StatBlock' or ast.tag2 == 'Block' then
+ return ast
+ else
+ M.ensure_parents_marked(top_ast)
+ return M.get_containing_statementblock(ast.parent, top_ast)
+ end
+end
+
+
+-- Finds smallest statement, block, or comment AST in ast/tokenlist containing position
+-- range [fpos, lpos]. If allowexpand is true (default nil) and located AST
+-- coincides with position range, then next containing statement is used
+-- instead (this allows multiple calls to further expand the statement selection).
+-- CATEGORY: AST query
+function M.select_statementblockcomment(ast, tokenlist, fpos, lpos, allowexpand)
+--IMPROVE: rename ast to top_ast
+ local match_ast, comment_ast = M.smallest_ast_containing_range(ast, tokenlist, fpos, lpos)
+ local select_ast = comment_ast or M.get_containing_statementblock(match_ast, ast)
+ local nfpos, nlpos = M.ast_pos_range(select_ast, tokenlist)
+ --DEBUG('s', nfpos, nlpos, fpos, lpos, match_ast.tag, select_ast.tag)
+ if allowexpand and fpos == nfpos and lpos == nlpos then
+ if comment_ast then
+ -- Select enclosing statement.
+ select_ast = match_ast
+ nfpos, nlpos = M.ast_pos_range(select_ast, tokenlist)
+ else
+ -- note: multiple times may be needed to expand selection. For example, in
+ -- `for x=1,2 do f() end` both the statement `f()` and block `f()` have
+ -- the same position range.
+ M.ensure_parents_marked(ast)
+ while select_ast.parent and fpos == nfpos and lpos == nlpos do
+ select_ast = M.get_containing_statementblock(select_ast.parent, ast)
+ nfpos, nlpos = M.ast_pos_range(select_ast, tokenlist)
+ end
+ end
+ end
+ return nfpos, nlpos
+end
+
+
+-- Converts tokenlist to string representation for debugging.
+-- CATEGORY: tokenlist debug
+function M.dump_tokenlist(tokenlist)
+ local ts = {}
+ for i,token in ipairs(tokenlist) do
+ ts[#ts+1] = 'tok.' .. i .. ': [' .. token.fpos .. ',' .. token.lpos .. '] '
+ .. tostring(token[1]) .. ' ' .. tostring(token.ast.tag)
+ end
+ return table.concat(ts, '\n') -- .. 'nbytes=' .. tokenlist.nbytes .. '\n'
+end
+
+
+--FIX:Q: does this handle Unicode ok?
+
+--FIX?:Metalua: fails on string with escape sequence '\/'. The Reference Manual
+-- doesn't say this sequence is valid though.
+
+--FIX:Metalua: In `local --[[x]] function --[[y]] f() end`,
+-- 'x' comment omitted from AST.
+
+--FIX:Metalua: `do --[[x]] end` doesn't generate comments in AST.
+-- `if x then --[[x]] end` and `while 1 do --[[x]] end` generates
+-- comments in first/last of block
+
+--FIX:Metalua: `--[[x]] f() --[[y]]` returns lineinfo around `f()`.
+-- `--[[x]] --[[y]]` returns lineinfo around everything.
+
+--FIX:Metalua: `while 1 do --[[x]] --[[y]] end` returns first > last
+-- lineinfo for contained block
+
+--FIX:Metalua: search for "PATCHED:LuaInspect" in the metalualib folder.
+
+--FIX?:Metalua: loadstring parses "--x" but metalua omits the comment in the AST
+
+--FIX?:Metalua: `local x` is generating `Local{{`Id{x}}, {}}`, which
+-- has no lineinfo on {}. This is contrary to the Metalua
+-- spec: `Local{ {ident+} {expr+}? }.
+-- Other things like `self` also generate no lineinfo.
+-- The ast2.lineinfo above avoids this.
+
+--FIX:Metalua: Metalua shouldn't overwrite ipairs/pairs. Note: Metalua version
+-- doesn't set errorlevel correctly.
+
+--Q:Metalua: Why does `return --[[y]] z --[[x]]` have
+-- lineinfo.first.comments, lineinfo.last.comments,
+-- plus lineinfo.comments (which is the same as lineinfo.first.comments) ?
+
+--CAUTION:Metalua: `do f() end` returns lineinfo around `do f() end`, while
+-- `while 1 do f() end` returns lineinfo around `f()` for inner block.
+
+--CAUTION:Metalua: The lineinfo on Metalua comments is inconsistent with other
+-- nodes
+
+--CAUTION:Metalua: lineinfo of table in `f{}` is [3,2], of `f{ x,y }` it's [4,6].
+-- This is inconsistent with `x={}` which is [3,4] and `f""` which is [1,2]
+-- for the string.
+
+--CAUTION:Metalua: only the `function()` form of `Function includes `function`
+-- in lineinfo. 'function' is part of `Localrec and `Set in syntactic sugar form.
+
+
+--[=[TESTSUITE
+-- test longest_prefix/longest_postfix
+local function pr(text1, text2)
+ local lastv
+ local function same(v)
+ assert(not lastv or v == lastv); lastv = v; return v
+ end
+ local function test1(text1, text2) -- test prefix/postfix
+ same(longest_prefix(text1, text2))
+ same(longest_postfix(text1:reverse(), text2:reverse()))
+ end
+ local function test2(text1, text2) -- test swap
+ test1(text1, text2)
+ test1(text2, text1)
+ end
+ for _,extra in ipairs{"", "x", "xy", "xyz"} do -- test extra chars
+ test2(text1, text2..extra)
+ test2(text2, text1..extra)
+ end
+ return lastv
+end
+check('==', pr("",""), 0)
+check('==', pr("a",""), 0)
+check('==', pr("a","a"), 1)
+check('==', pr("ab",""), 0)
+check('==', pr("ab","a"), 1)
+check('==', pr("ab","ab"), 2)
+check('==', pr("abcdefg","abcdefgh"), 7)
+--]=]
+
+--[=[TESTSUITE
+print 'DONE'
+--]=]
+
+
+return M
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/compat_env.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/compat_env.lua
new file mode 100644
index 0000000..326b3b4
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/compat_env.lua
@@ -0,0 +1,390 @@
+--[[
+
+ compat_env v$(_VERSION) - Lua 5.1/5.2 environment compatibility functions
+
+SYNOPSIS
+
+ -- Get load/loadfile compatibility functions only if using 5.1.
+ local CL = pcall(load, '') and _G or require 'compat_env'
+ local load = CL.load
+ local loadfile = CL.loadfile
+
+ -- The following now works in both Lua 5.1 and 5.2:
+ assert(load('return 2*pi', nil, 't', {pi=math.pi}))()
+ assert(loadfile('ex.lua', 't', {print=print}))()
+
+ -- Get getfenv/setfenv compatibility functions only if using 5.2.
+ local getfenv = _G.getfenv or require 'compat_env'.getfenv
+ local setfenv = _G.setfenv or require 'compat_env'.setfenv
+ local function f() return x end
+ setfenv(f, {x=2})
+ print(x, getfenv(f).x) --> 2, 2
+
+DESCRIPTION
+
+ This module provides Lua 5.1/5.2 environment related compatibility functions.
+ This includes implementations of Lua 5.2 style `load` and `loadfile`
+ for use in Lua 5.1. It also includes Lua 5.1 style `getfenv` and `setfenv`
+ for use in Lua 5.2.
+
+API
+
+ local CL = require 'compat_env'
+
+ CL.load (ld [, source [, mode [, env] ] ]) --> f [, err]
+
+ This behaves the same as the Lua 5.2 `load` in both
+ Lua 5.1 and 5.2.
+ http://www.lua.org/manual/5.2/manual.html#pdf-load
+
+ CL.loadfile ([filename [, mode [, env] ] ]) --> f [, err]
+
+ This behaves the same as the Lua 5.2 `loadfile` in both
+ Lua 5.1 and 5.2.
+ http://www.lua.org/manual/5.2/manual.html#pdf-loadfile
+
+ CL.getfenv ([f]) --> t
+
+ This is identical to the Lua 5.1 `getfenv` in Lua 5.1.
+ This behaves similar to the Lua 5.1 `getfenv` in Lua 5.2.
+ When a global environment is to be returned, or when `f` is a
+ C function, this returns `_G` since Lua 5.2 doesn't have
+ (thread) global and C function environments. This will also
+ return `_G` if the Lua function `f` lacks an `_ENV`
+ upvalue, but it will raise an error if uncertain due to lack of
+ debug info. It is not normally considered good design to use
+ this function; when possible, use `load` or `loadfile` instead.
+ http://www.lua.org/manual/5.1/manual.html#pdf-getfenv
+
+ CL.setfenv (f, t)
+
+ This is identical to the Lua 5.1 `setfenv` in Lua 5.1.
+ This behaves similar to the Lua 5.1 `setfenv` in Lua 5.2.
+ This will do nothing if `f` is a Lua function that
+ lacks an `_ENV` upvalue, but it will raise an error if uncertain
+ due to lack of debug info. See also Design Notes below.
+ It is not normally considered good design to use
+ this function; when possible, use `load` or `loadfile` instead.
+ http://www.lua.org/manual/5.1/manual.html#pdf-setfenv
+
+DESIGN NOTES
+
+ This module intends to provide robust and fairly complete reimplementations
+ of the environment related Lua 5.1 and Lua 5.2 functions.
+ No effort is made, however, to simulate rare or difficult to simulate features,
+ such as thread environments, although this is liable to change in the future.
+ Such 5.1 capabilities are discouraged and ideally
+ removed from 5.1 code, thereby allowing your code to work in both 5.1 and 5.2.
+
+ In Lua 5.2, a `setfenv(f, {})`, where `f` lacks any upvalues, will be silently
+ ignored since there is no `_ENV` in this function to write to, and the
+ environment will have no effect inside the function anyway. However,
+ this does mean that `getfenv(setfenv(f, t))` does not necessarily equal `t`,
+ which is incompatible with 5.1 code (a possible workaround would be [1]).
+ If `setfenv(f, {})` has an upvalue but no debug info, then this will raise
+ an error to prevent inadvertently executing potentially untrusted code in the
+ global environment.
+
+ It is not normally considered good design to use `setfenv` and `getfenv`
+ (one reason they were removed in 5.2). When possible, consider replacing
+ these with `load` or `loadfile`, which are more restrictive and have native
+ implementations in 5.2.
+
+ This module might be merged into a more general Lua 5.1/5.2 compatibility
+ library (e.g. a full reimplementation of Lua 5.2 `_G`). However,
+ `load/loadfile/getfenv/setfenv` perhaps are among the more cumbersome
+ functions not to have.
+
+INSTALLATION
+
+ Download compat_env.lua:
+
+ wget https://raw.github.com/gist/1654007/compat_env.lua
+
+ Copy compat_env.lua into your LUA_PATH.
+
+ Alternately, unpack, test, and install into LuaRocks:
+
+ wget https://raw.github.com/gist/1422205/sourceunpack.lua
+ lua sourceunpack.lua compat_env.lua
+ (cd out && luarocks make)
+
+Related work
+
+ http://lua-users.org/wiki/LuaVersionCompatibility
+ https://github.com/stevedonovan/Penlight/blob/master/lua/pl/utils.lua
+ - penlight implementations of getfenv/setfenv
+ http://lua-users.org/lists/lua-l/2010-06/msg00313.html
+ - initial getfenv/setfenv implementation
+
+References
+
+ [1] http://lua-users.org/lists/lua-l/2010-06/msg00315.html
+
+Copyright
+
+(c) 2012 David Manura. Licensed under the same terms as Lua 5.1/5.2 (MIT license).
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+--]]---------------------------------------------------------------------
+
+local M = {_TYPE='module', _NAME='compat_env', _VERSION='0.2.20120124'}
+
+local function check_chunk_type(s, mode)
+ local nmode = mode or 'bt'
+ local is_binary = s and #s > 0 and s:byte(1) == 27
+ if is_binary and not nmode:match'b' then
+ return nil, ("attempt to load a binary chunk (mode is '%s')"):format(mode)
+ elseif not is_binary and not nmode:match't' then
+ return nil, ("attempt to load a text chunk (mode is '%s')"):format(mode)
+ end
+ return true
+end
+
+local IS_52_LOAD = pcall(load, '')
+if IS_52_LOAD then
+ M.load = _G.load
+ M.loadfile = _G.loadfile
+else
+ -- 5.2 style `load` implemented in 5.1
+ function M.load(ld, source, mode, env)
+ local f
+ if type(ld) == 'string' then
+ local s = ld
+ local ok, err = check_chunk_type(s, mode); if not ok then return ok, err end
+ local err; f, err = loadstring(s, source); if not f then return f, err end
+ elseif type(ld) == 'function' then
+ local ld2 = ld
+ if (mode or 'bt') ~= 'bt' then
+ local first = ld()
+ local ok, err = check_chunk_type(first, mode); if not ok then return ok, err end
+ ld2 = function()
+ if first then
+ local chunk=first; first=nil; return chunk
+ else return ld() end
+ end
+ end
+ local err; f, err = load(ld2, source); if not f then return f, err end
+ else
+ error(("bad argument #1 to 'load' (function expected, got %s)"):format(type(ld)), 2)
+ end
+ if env then setfenv(f, env) end
+ return f
+ end
+
+ -- 5.2 style `loadfile` implemented in 5.1
+ function M.loadfile(filename, mode, env)
+ if (mode or 'bt') ~= 'bt' then
+ local ioerr
+ local fh, err = io.open(filename, 'rb'); if not fh then return fh, err end
+ local function ld() local chunk; chunk,ioerr = fh:read(4096); return chunk end
+ local f, err = M.load(ld, filename and '@'..filename, mode, env)
+ fh:close()
+ if not f then return f, err end
+ if ioerr then return nil, ioerr end
+ return f
+ else
+ local f, err = loadfile(filename); if not f then return f, err end
+ if env then setfenv(f, env) end
+ return f
+ end
+ end
+end
+
+if _G.setfenv then -- Lua 5.1
+ M.setfenv = _G.setfenv
+ M.getfenv = _G.getfenv
+else -- >= Lua 5.2
+ -- helper function for `getfenv`/`setfenv`
+ local function envlookup(f)
+ local name, val
+ local up = 0
+ local unknown
+ repeat
+ up=up+1; name, val = debug.getupvalue(f, up)
+ if name == '' then unknown = true end
+ until name == '_ENV' or name == nil
+ if name ~= '_ENV' then
+ up = nil
+ if unknown then error("upvalues not readable in Lua 5.2 when debug info missing", 3) end
+ end
+ return (name == '_ENV') and up, val, unknown
+ end
+
+ -- helper function for `getfenv`/`setfenv`
+ local function envhelper(f, name)
+ if type(f) == 'number' then
+ if f < 0 then
+ error(("bad argument #1 to '%s' (level must be non-negative)"):format(name), 3)
+ elseif f < 1 then
+ error("thread environments unsupported in Lua 5.2", 3) --[*]
+ end
+ f = debug.getinfo(f+2, 'f').func
+ elseif type(f) ~= 'function' then
+ error(("bad argument #1 to '%s' (number expected, got %s)"):format(type(name, f)), 2)
+ end
+ return f
+ end
+ -- [*] might simulate with table keyed by coroutine.running()
+
+ -- 5.1 style `setfenv` implemented in 5.2
+ function M.setfenv(f, t)
+ local f = envhelper(f, 'setfenv')
+ local up, val, unknown = envlookup(f)
+ if up then
+ debug.upvaluejoin(f, up, function() return up end, 1) -- unique upvalue [*]
+ debug.setupvalue(f, up, t)
+ else
+ local what = debug.getinfo(f, 'S').what
+ if what ~= 'Lua' and what ~= 'main' then -- not Lua func
+ error("'setfenv' cannot change environment of given object", 2)
+ end -- else ignore no _ENV upvalue (warning: incompatible with 5.1)
+ end
+ end
+ -- [*] http://lua-users.org/lists/lua-l/2010-06/msg00313.html
+
+ -- 5.1 style `getfenv` implemented in 5.2
+ function M.getfenv(f)
+ if f == 0 or f == nil then return _G end -- simulated behavior
+ local f = envhelper(f, 'setfenv')
+ local up, val = envlookup(f)
+ if not up then return _G end -- simulated behavior [**]
+ return val
+ end
+ -- [**] possible reasons: no _ENV upvalue, C function
+end
+
+
+return M
+
+--[[ FILE rockspec.in
+
+package = 'compat_env'
+version = '$(_VERSION)-1'
+source = {
+ url = 'https://raw.github.com/gist/1654007/$(GITID)/compat_env.lua',
+ --url = 'https://raw.github.com/gist/1654007/compat_env.lua', -- latest raw
+ --url = 'https://gist.github.com/gists/1654007/download',
+ md5 = '$(MD5)'
+}
+description = {
+ summary = 'Lua 5.1/5.2 environment compatibility functions',
+ detailed = [=[
+ Provides Lua 5.1/5.2 environment related compatibility functions.
+ This includes implementations of Lua 5.2 style `load` and `loadfile`
+ for use in Lua 5.1. It also includes Lua 5.1 style `getfenv` and `setfenv`
+ for use in Lua 5.2.
+ ]=],
+ license = 'MIT/X11',
+ homepage = 'https://gist.github.com/1654007',
+ maintainer = 'David Manura'
+}
+dependencies = {} -- Lua 5.1 or 5.2
+build = {
+ type = 'builtin',
+ modules = {
+ ['compat_env'] = 'compat_env.lua'
+ }
+}
+
+--]]---------------------------------------------------------------------
+
+--[[ FILE test.lua
+
+-- test.lua - test suite for compat_env module.
+
+local CL = require 'compat_env'
+local load = CL.load
+local loadfile = CL.loadfile
+local setfenv = CL.setfenv
+local getfenv = CL.getfenv
+
+local function checkeq(a, b, e)
+ if a ~= b then error(
+ 'not equal ['..tostring(a)..'] ['..tostring(b)..'] ['..tostring(e)..']')
+ end
+end
+local function checkerr(pat, ok, err)
+ assert(not ok, 'checkerr')
+ assert(type(err) == 'string' and err:match(pat), err)
+end
+
+-- test `load`
+checkeq(load('return 2')(), 2)
+checkerr('expected near', load'return 2 2')
+checkerr('text chunk', load('return 2', nil, 'b'))
+checkerr('text chunk', load('', nil, 'b'))
+checkerr('binary chunk', load('\027', nil, 't'))
+checkeq(load('return 2*x',nil,'bt',{x=5})(), 10)
+checkeq(debug.getinfo(load('')).source, '')
+checkeq(debug.getinfo(load('', 'foo')).source, 'foo')
+
+-- test `loadfile`
+local fh = assert(io.open('tmp.lua', 'wb'))
+fh:write('return (...) or x')
+fh:close()
+checkeq(loadfile('tmp.lua')(2), 2)
+checkeq(loadfile('tmp.lua', 't')(2), 2)
+checkerr('text chunk', loadfile('tmp.lua', 'b'))
+checkeq(loadfile('tmp.lua', nil, {x=3})(), 3)
+checkeq(debug.getinfo(loadfile('tmp.lua')).source, '@tmp.lua')
+checkeq(debug.getinfo(loadfile('tmp.lua', 't', {})).source, '@tmp.lua')
+os.remove'tmp.lua'
+
+-- test `setfenv`/`getfenv`
+x = 5
+local a,b=true; local function f(c) if a then return x,b,c end end
+setfenv(f, {x=3})
+checkeq(f(), 3)
+checkeq(getfenv(f).x, 3)
+checkerr('cannot change', pcall(setfenv, string.len, {})) -- C function
+checkeq(getfenv(string.len), _G) -- C function
+local function g()
+ setfenv(1, {x=4})
+ checkeq(getfenv(1).x, 4)
+ return x
+end
+checkeq(g(), 4) -- numeric level
+if _G._VERSION ~= 'Lua 5.1' then
+ checkerr('unsupported', pcall(setfenv, 0, {}))
+end
+checkeq(getfenv(0), _G)
+checkeq(getfenv(), _G) -- no arg
+checkeq(x, 5) -- main unaltered
+setfenv(function()end, {}) -- no upvalues, ignore
+checkeq(getfenv(function()end), _G) -- no upvaluse
+if _G._VERSION ~= 'Lua 5.1' then
+ checkeq(getfenv(setfenv(function()end, {})), _G) -- warning: incompatible with 5.1
+end
+x = nil
+
+print 'OK'
+
+--]]---------------------------------------------------------------------
+
+--[[ FILE CHANGES.txt
+0.2.20120124
+ Renamed module to compat_env (from compat_load)
+ Add getfenv/setfenv functions
+
+0.1.20120121
+ Initial public release
+--]]
+
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/dump.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/dump.lua
new file mode 100644
index 0000000..6a6e980
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/dump.lua
@@ -0,0 +1,90 @@
+-- Recursive object dumper, for debugging.
+-- (c) 2010 David Manura, MIT License.
+
+local M = {}
+
+-- My own object dumper.
+-- Intended for debugging, not serialization, with compact formatting.
+-- Robust against recursion.
+-- Renders Metalua table tag fields specially {tag=X, ...} --> "`X{...}".
+-- On first call, only pass parameter o.
+-- CATEGORY: AST debug
+local ignore_keys_ = {lineinfo=true}
+local norecurse_keys_ = {parent=true, ast=true}
+local function dumpstring_key_(k, isseen, newindent)
+ local ks = type(k) == 'string' and k:match'^[%a_][%w_]*$' and k or
+ '[' .. M.dumpstring(k, isseen, newindent) .. ']'
+ return ks
+end
+local function sort_keys_(a, b)
+ if type(a) == 'number' and type(b) == 'number' then
+ return a < b
+ elseif type(a) == 'number' then
+ return false
+ elseif type(b) == 'number' then
+ return true
+ elseif type(a) == 'string' and type(b) == 'string' then
+ return a < b
+ else
+ return tostring(a) < tostring(b) -- arbitrary
+ end
+end
+function M.dumpstring(o, isseen, indent, key)
+ isseen = isseen or {}
+ indent = indent or ''
+
+ if type(o) == 'table' then
+ if isseen[o] or norecurse_keys_[key] then
+ return (type(o.tag) == 'string' and '`' .. o.tag .. ':' or '') .. tostring(o)
+ else isseen[o] = true end -- avoid recursion
+
+ local used = {}
+
+ local tag = o.tag
+ local s = '{'
+ if type(o.tag) == 'string' then
+ s = '`' .. tag .. s; used['tag'] = true
+ end
+ local newindent = indent .. ' '
+
+ local ks = {}; for k in pairs(o) do ks[#ks+1] = k end
+ table.sort(ks, sort_keys_)
+ --for i,k in ipairs(ks) do print ('keys', k) end
+
+ local forcenummultiline
+ for k in pairs(o) do
+ if type(k) == 'number' and type(o[k]) == 'table' then forcenummultiline = true end
+ end
+
+ -- inline elements
+ for _,k in ipairs(ks) do
+ if used[k] then -- skip
+ elseif ignore_keys_[k] then used[k] = true
+ elseif (type(k) ~= 'number' or not forcenummultiline) and
+ type(k) ~= 'table' and (type(o[k]) ~= 'table' or norecurse_keys_[k])
+ then
+ s = s .. dumpstring_key_(k, isseen, newindent) .. '=' .. M.dumpstring(o[k], isseen, newindent, k) .. ', '
+ used[k] = true
+ end
+ end
+
+ -- elements on separate lines
+ local done
+ for _,k in ipairs(ks) do
+ if not used[k] then
+ if not done then s = s .. '\n'; done = true end
+ s = s .. newindent .. dumpstring_key_(k, isseen) .. '=' .. M.dumpstring(o[k], isseen, newindent, k) .. ',\n'
+ end
+ end
+ s = s:gsub(',(%s*)$', '%1')
+ s = s .. (done and indent or '') .. '}'
+ return s
+ elseif type(o) == 'string' then
+ return string.format('%q', o)
+ else
+ return tostring(o)
+ end
+end
+
+return M
+
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/globals.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/globals.lua
new file mode 100644
index 0000000..0730909
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/globals.lua
@@ -0,0 +1,222 @@
+-- LuaInspect.globals - identifier scope analysis
+-- Locates locals, globals, and their definitions.
+--
+-- (c) D.Manura, 2008-2010, MIT license.
+
+-- based on http://lua-users.org/wiki/DetectingUndefinedVariables
+
+local M = {}
+
+--! require 'luainspect.typecheck' (context)
+
+local LA = require "luainspect.ast"
+
+local function definelocal(scope, name, ast)
+ if scope[name] then
+ scope[name].localmasked = true
+ ast.localmasking = scope[name]
+ end
+ scope[name] = ast
+ if name == '_' then ast.isignore = true end
+end
+
+-- Resolves scoping and usages of variable in AST.
+-- Data Notes:
+-- ast.localdefinition refers to lexically scoped definition of `Id node `ast`.
+-- If ast.localdefinition == ast then ast is a "lexical definition".
+-- If ast.localdefinition == nil, then variable is global.
+-- ast.functionlevel is the number of functions the AST is contained in.
+-- ast.functionlevel is defined iff ast is a lexical definition.
+-- ast.isparam is true iff ast is a lexical definition and a function parameter.
+-- ast.isset is true iff ast is a lexical definition and exists an assignment on it.
+-- ast.isused is true iff ast is a lexical definition and has been referred to.
+-- ast.isignore is true if local variable should be ignored (e.g. typically "_")
+-- ast.localmasking - for a lexical definition, this is set to the lexical definition
+-- this is masking (i.e. same name). nil if not masking.
+-- ast.localmasked - true iff lexical definition masked by another lexical definition.
+-- ast.isfield is true iff `String node ast is used for field access on object,
+-- e.g. x.y or x['y'].z
+-- ast.previous - For `Index{o,s} or `Invoke{o,s,...}, s.previous == o
+local function traverse(ast, scope, globals, level, functionlevel)
+ scope = scope or {}
+
+ local blockrecurse
+ ast.level = level
+
+ -- operations on walking down the AST
+ if ast.tag == 'Local' then
+ blockrecurse = 1
+ -- note: apply new scope after processing values
+ elseif ast.tag == 'Localrec' then
+ local namelist_ast, valuelist_ast = ast[1], ast[2]
+ for _,value_ast in ipairs(namelist_ast) do
+ assert(value_ast.tag == 'Id')
+ local name = value_ast[1]
+ local parentscope = getmetatable(scope).__index
+ definelocal(parentscope, name, value_ast)
+ value_ast.localdefinition = value_ast
+ value_ast.functionlevel = functionlevel
+ value_ast.level = level+1
+ end
+ blockrecurse = 1
+ elseif ast.tag == 'Id' then
+ local name = ast[1]
+ if scope[name] then
+ ast.localdefinition = scope[name]
+ ast.functionlevel = functionlevel
+ scope[name].isused = true
+ else -- global, do nothing
+ end
+ elseif ast.tag == 'Function' then
+ local paramlist_ast, body_ast = ast[1], ast[2]
+ functionlevel = functionlevel + 1
+ for _,param_ast in ipairs(paramlist_ast) do
+ local name = param_ast[1]
+ assert(param_ast.tag == 'Id' or param_ast.tag == 'Dots')
+ if param_ast.tag == 'Id' then
+ definelocal(scope, name, param_ast)
+ param_ast.localdefinition = param_ast
+ param_ast.functionlevel = functionlevel
+ param_ast.isparam = true
+ end
+ param_ast.level = level+1
+ end
+ blockrecurse = 1
+ elseif ast.tag == 'Set' then
+ local reflist_ast, valuelist_ast = ast[1], ast[2]
+ for _,ref_ast in ipairs(reflist_ast) do
+ if ref_ast.tag == 'Id' then
+ local name = ref_ast[1]
+ if scope[name] then
+ scope[name].isset = true
+ else
+ if not globals[name] then
+ globals[name] = {set=ref_ast}
+ end
+ end
+ end
+ ref_ast.level = level+1
+ end
+ --ENHANCE? We could differentiate assignments to x (which indicates that
+ -- x is not const) and assignments to a member of x (which indicates that
+ -- x is not a pointer to const) and assignments to any nested member of x
+ -- (which indicates that x it not a transitive const).
+ elseif ast.tag == 'Fornum' then
+ blockrecurse = 1
+ elseif ast.tag == 'Forin' then
+ blockrecurse = 1
+ end
+
+ -- recurse (depth-first search down the AST)
+ if ast.tag == 'Repeat' then
+ local block_ast, cond_ast = ast[1], ast[2]
+ local scope = scope
+ for _,stat_ast in ipairs(block_ast) do
+ scope = setmetatable({}, {__index = scope})
+ traverse(stat_ast, scope, globals, level+1, functionlevel)
+ end
+ scope = setmetatable({}, {__index = scope})
+ traverse(cond_ast, scope, globals, level+1, functionlevel)
+ elseif ast.tag == 'Fornum' then
+ local name_ast, block_ast = ast[1], ast[#ast]
+ -- eval value list in current scope
+ for i=2, #ast-1 do traverse(ast[i], scope, globals, level+1, functionlevel) end
+ -- eval body in next scope
+ local name = name_ast[1]
+ definelocal(scope, name, name_ast)
+ name_ast.localdefinition = name_ast
+ name_ast.functionlevel = functionlevel
+ traverse(block_ast, scope, globals, level+1, functionlevel)
+ elseif ast.tag == 'Forin' then
+ local namelist_ast, vallist_ast, block_ast = ast[1], ast[2], ast[3]
+ -- eval value list in current scope
+ traverse(vallist_ast, scope, globals, level+1, functionlevel)
+ -- eval body in next scope
+ for _,name_ast in ipairs(namelist_ast) do
+ local name = name_ast[1]
+ definelocal(scope, name, name_ast)
+ name_ast.localdefinition = name_ast
+ name_ast.functionlevel = functionlevel
+ name_ast.level = level+1
+ end
+ traverse(block_ast, scope, globals, level+1, functionlevel)
+ else -- normal
+ for i,v in ipairs(ast) do
+ if i ~= blockrecurse and type(v) == 'table' then
+ local scope = setmetatable({}, {__index = scope})
+ traverse(v, scope, globals, level+1, functionlevel)
+ end
+ end
+ end
+
+ -- operations on walking up the AST
+ if ast.tag == 'Local' then
+ -- Unlike Localrec, variables come into scope after evaluating values.
+ local namelist_ast, valuelist_ast = ast[1], ast[2]
+ for _,name_ast in ipairs(namelist_ast) do
+ assert(name_ast.tag == 'Id')
+ local name = name_ast[1]
+ local parentscope = getmetatable(scope).__index
+ definelocal(parentscope, name, name_ast)
+ name_ast.localdefinition = name_ast
+ name_ast.functionlevel = functionlevel
+ name_ast.level = level+1
+ end
+ elseif ast.tag == 'Index' then
+ if ast[2].tag == 'String' then
+ ast[2].isfield = true
+ ast[2].previous = ast[1]
+ end
+ elseif ast.tag == 'Invoke' then
+ assert(ast[2].tag == 'String')
+ ast[2].isfield = true
+ ast[2].previous = ast[1]
+ end
+end
+
+function M.globals(ast)
+ -- Default list of defined variables.
+ local scope = setmetatable({}, {})
+ local globals = {}
+ traverse(ast, scope, globals, 1, 1) -- Start check.
+
+ return globals
+end
+
+
+-- Gets locals in scope of statement of block ast. If isafter is true and ast is statement,
+-- uses scope just after statement ast.
+-- Assumes 'parent' attributes on ast are marked.
+-- Returns table mapping name -> AST local definition.
+function M.variables_in_scope(ast, isafter)
+ local scope = {}
+ local cast = ast
+ while cast.parent do
+ local midx = LA.ast_idx(cast.parent, cast)
+ for idx=1,midx do
+ local bast = cast.parent[idx]
+ if bast.tag == 'Localrec' or bast.tag == 'Local' and (idx < midx or isafter) then
+ local names_ast = bast[1]
+ for bidx=1,#names_ast do
+ local name_ast = names_ast[bidx]
+ local name = name_ast[1]
+ scope[name] = name_ast
+ end
+ elseif cast ~= ast and (bast.tag == 'For' or bast.tag == 'Forin' or bast.tag == 'Function') then
+ local names_ast = bast[1]
+ for bidx=1,#names_ast do
+ local name_ast = names_ast[bidx]
+ if name_ast.tag == 'Id' then --Q: or maybe `Dots should be included
+ local name = name_ast[1]
+ scope[name] = name_ast
+ end
+ end
+ end
+ end
+ cast = cast.parent
+ end
+ return scope
+end
+
+
+return M
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/init.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/init.lua
new file mode 100644
index 0000000..bab48fa
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/init.lua
@@ -0,0 +1,1454 @@
+-- luainspect.init - core LuaInspect source analysis.
+--
+-- This module is a bit more high level than luainspect.ast. It deals more with
+-- interpretation/inference of semantics of an AST. It also uses luainspect.globals,
+-- which does the basic semantic interpretation of globals/locals.
+--
+-- (c) 2010 David Manura, MIT License.
+
+local M = {}
+
+-- This is the API version. It is an ISO8601 date expressed as a fraction.
+M.APIVERSION = 0.20100805
+
+local LA = require "luainspect.ast"
+local LD = require "luainspect.dump"
+local LG = require "luainspect.globals"
+local LS = require "luainspect.signatures"
+local T = require "luainspect.types"
+local COMPAT = require "luainspect.compat_env"
+
+--! require 'luainspect.typecheck' (context)
+
+local ENABLE_RETURN_ANALYSIS = true
+local DETECT_DEADCODE = false -- may require more validation (false positives)
+
+
+-- Functional forms of Lua operators.
+-- Note: variable names like _1 are intentional. These affect debug info and
+-- will display in any error messages.
+local ops = {}
+ops['add'] = function(_1,_2) return _1+_2 end
+ops['sub'] = function(_1,_2) return _1-_2 end
+ops['mul'] = function(_1,_2) return _1*_2 end
+ops['div'] = function(_1,_2) return _1/_2 end
+ops['mod'] = function(_1,_2) return _1%_2 end
+ops['pow'] = function(_1,_2) return _1^_2 end
+ops['concat'] = function(_1,_2) return _1.._2 end
+ops['eq'] = function(_1,_2) return _1==_2 end
+ops['lt'] = function(_1,_2) return _1<_2 end
+ops['le'] = function(_1,_2) return _1<=_2 end
+ops['and'] = function(_1,_2) return _1 and _2 end
+ops['or'] = function(_1,_2) return _1 or _2 end
+ops['not'] = function(_1) return not _1 end
+ops['len'] = function(_1) return #_1 end
+ops['unm'] = function(_1) return -_1 end
+
+
+-- Performs binary operation. Supports types.
+local function dobinop(opid, a, b)
+ if (a == T.number or b == T.number) and
+ (a == T.number or type(a) == 'number' ) and
+ (b == T.number or type(b) == 'number' )
+ then
+ if opid == 'eq' or opid == 'lt' or opid == 'le' then
+ return T.boolean
+ elseif opid == 'concat' then
+ return T.string
+ else
+ return T.number
+ end
+ elseif (a == T.string or b == T.string) and
+ (a == T.string or type(a) == 'string' ) and
+ (b == T.string or type(b) == 'string' )
+ then
+ if opid == 'concat' or opid == 'and' or opid == 'or' then
+ return T.string
+ elseif opid == 'eq' or opid == 'lt' or opid == 'le' then
+ return T.boolean
+ else
+ return T.number
+ end
+ elseif (a == T.boolean or b == T.boolean) and
+ (a == T.boolean or type(a) == 'boolean' ) and
+ (b == T.boolean or type(b) == 'boolean' )
+ then
+ if opid == 'eq' or opid == 'and' or opid == 'or' then
+ return T.boolean
+ else
+ error('invalid operation on booleans: ' .. opid, 0)
+ end
+ elseif T.istype[a] or T.istype[b] then
+ return T.universal
+ else
+ return ops[opid](a, b)
+ end
+end
+
+
+-- Performs unary operation. Supports types.
+local function dounop(opid, a)
+ if opid == 'not' then
+ if T.istype[a] then
+ return T.boolean
+ else
+ return ops[opid](a)
+ end
+ elseif a == T.number then
+ if opid == 'unm' then
+ return T.number
+ else -- 'len'
+ error('invalid operation on number: ' .. opid, 0)
+ end
+ elseif a == T.string then
+ return T.number
+ elseif a == T.boolean then
+ error('invalid operation on boolean: ' .. opid, 0)
+ elseif T.istype[a] then
+ return nil, 'unknown'
+ else
+ return ops[opid](a)
+ end
+end
+
+-- Like info in debug.getinfo but inferred by static analysis.
+-- object -> {fpos=fpos, source="@" .. source, fast=ast, tokenlist=tokenlist}
+-- Careful: value may reference key (affects pre-5.2 which lacks emphemerons).
+-- See also ast.nocollect.
+M.debuginfo = setmetatable({}, {__mode='v'})
+
+-- Modules loaded via require_inspect.
+-- module name string -> {return value, AST node}
+-- note: AST node is maintained to prevent nocollect fields in ast being collected.
+-- note: not a weak table.
+M.package_loaded = {}
+
+-- Stringifies interpreted value for debugging.
+-- CATEGORY: debug
+local function debugvalue(ast)
+ local s
+ if ast then
+ s = ast.value ~= T.universal and 'known:' .. tostring(ast.value) or 'unknown'
+ else
+ s = '?'
+ end
+ return s
+end
+
+
+-- Reads contents of text file in path, in binary mode.
+-- On error, returns nil and error message.
+local function readfile(path)
+ local fh, err = io.open(path, 'rb')
+ if fh then
+ local data; data, err = fh:read'*a'
+ if data then return data end
+ end
+ return nil, err
+end
+
+-- Similar to string.gsub but with plain replacement (similar to option in string.match)
+-- http://lua-users.org/lists/lua-l/2002-04/msg00118.html
+-- CATEGORY: utility/string
+local function plain_gsub(s, pattern, repl)
+ repl = repl:gsub('(%%)', '%%%%')
+ return s:gsub(pattern, repl)
+end
+
+-- Infer name of variable or literal that AST node represents.
+-- This is for debugging messages.
+local function infer_name(ast)
+ if ast == nil then return nil
+ elseif ast.tag == 'Id' then return "'"..ast[1].."'"
+ elseif ast.tag == 'Number' then return 'number'
+ elseif ast.tag == 'String' then return 'string'
+ elseif ast.tag == 'True' then return 'true'
+ elseif ast.tag == 'False' then return 'false'
+ elseif ast.tag == 'Nil' then return 'nil'
+ else return nil end
+end
+
+--[[
+ This is like `pcall` but any error string returned does not contain the
+ "chunknamem:currentline: " prefix (based on luaL_where) if the error occurred
+ in the current file. This avoids error messages in user code (f)
+ being reported as being inside this module if this module calls user code.
+ Also, local variable names _1, _2, etc. in error message are replaced with names
+ inferred (if any) from corresponding AST nodes in list `asts` (note: nil's in asts skip replacement).
+--]]
+local _prefix
+local _clean
+local function pzcall(f, asts, ...)
+ _prefix = _prefix or select(2, pcall(function() error'' end)):gsub(':%d+: *$', '') -- note: specific to current file.
+ _clean = _clean or function(asts, ok, ...)
+ if ok then return true, ...
+ else
+ local err = ...
+ if type(err) == 'string' then
+ if err:sub(1,#_prefix) == _prefix then
+ local more = err:match('^:%d+: *(.*)', #_prefix+1)
+ if more then
+ err = more
+ err = err:gsub([[local '_(%d+)']], function(name) return infer_name(asts[tonumber(name)]) end)
+ end
+ end
+ end
+ return ok, err
+ end
+ end
+ return _clean(asts, pcall(f, ...))
+end
+
+-- Loads source code of given module name.
+-- Returns code followed by path.
+-- note: will also search in the directory `spath` and its parents.
+-- This should preferrably be an absolute path or it might not work correctly.
+-- It must be slash terminated.
+-- CATEGORY: utility/package
+local function load_module_source(name, spath)
+ -- Append parent directories to list of paths to search.
+ local package_path = package.path
+ local ppath = spath
+ repeat
+ package_path = package_path .. ';' .. ppath .. '?.lua;' .. ppath .. '?/init.lua'
+ local nsub
+ ppath, nsub = ppath:gsub('[^\\/]+[\\/]$', '')
+ until nsub == 0
+
+ for spec in package_path:gmatch'[^;]+' do
+ local testpath = plain_gsub(spec, '%?', (name:gsub('%.', '/')))
+ local src, err_ = readfile(testpath)
+ if src then return src, testpath end
+ end
+ return nil
+end
+
+
+-- Clears global state.
+-- This includes cached inspected modules.
+function M.clear_cache()
+ for k,v in pairs(M.package_loaded) do
+ M.package_loaded[k] = nil
+ end
+end
+
+
+-- Gets all keywords related to AST `ast`, where `top_ast` is the root of `ast`
+-- and `src` is source code of `top_ast`
+-- Related keywords are defined as all keywords directly associated with block containing node
+-- `ast`. Furthermore, break statements are related to containing loop statements,
+-- and return statements are related to containing function statement (if any).
+-- function declaration syntactic sugar is handled specially too to ensure the 'function' keyword
+-- is highlighted even though it may be outside of the `Function AST.
+--
+-- Returns token list or nil if not applicable. Returned `ast` is AST containing related keywords.
+-- CATEGORY: keyword comprehension
+local iskeystat = {Do=true, While=true, Repeat=true, If=true, Fornum=true, Forin=true,
+ Local=true, Localrec=true, Return=true, Break=true, Function=true,
+ Set=true -- note: Set for `function name`
+}
+local isloop = {While=true, Repeat=true, Fornum=true, Forin=true}
+local isblock = {Do=true, While=true, Repeat=true, If=true, Fornum=true, Forin=true, Function=true}
+function M.related_keywords(ast, top_ast, tokenlist, src)
+ -- Expand or contract AST for certain contained statements.
+ local more
+ if ast.tag == 'Return' then
+ -- if `return` selected, that consider containing function selected (if any)
+ if not ast.parent then LA.mark_parents(top_ast) end
+ local ancestor_ast = ast.parent
+ while ancestor_ast ~= nil and ancestor_ast.tag ~= 'Function' do
+ ancestor_ast = ancestor_ast.parent
+ end
+ if ancestor_ast then ast = ancestor_ast end -- but only change if exists
+ elseif ast.tag == 'Break' then
+ -- if `break` selected, that consider containing loop selected
+ if not ast.parent then LA.mark_parents(top_ast) end
+ local ancestor_ast = ast.parent
+ while ancestor_ast ~= nil and not isloop[ancestor_ast.tag] do
+ ancestor_ast = ancestor_ast.parent
+ end
+ ast = ancestor_ast
+ elseif ast.tag == 'Set' then
+ local val1_ast = ast[2][1]
+ if val1_ast.tag == 'Function' then
+ local token = tokenlist[LA.ast_idx_range_in_tokenlist(tokenlist, ast)]
+ if token.tag == 'Keyword' and token[1] == 'function' then -- function with syntactic sugar `function f`
+ ast = ast[2][1] -- select `Function node
+ else
+ more = true
+ end
+ else
+ more = true
+ end
+ elseif ast.tag == 'Localrec' and ast[2][1].tag == 'Function' then
+ -- if `local function f` selected, which becomes a `Localrec, consider `Function node.
+ ast = ast[2][1]
+ --IMPROVE: only contract ast if `function` part of `local function` is selected.
+ else
+ more = true
+ end
+ if more then -- not yet handled
+ -- Consider containing block.
+ if not ast.parent then LA.mark_parents(top_ast) end
+ local ancestor_ast = ast
+ while ancestor_ast ~= top_ast and not isblock[ancestor_ast.tag] do
+ ancestor_ast = ancestor_ast.parent
+ end
+ ast = ancestor_ast
+ end
+
+ -- keywords in statement/block.
+ if iskeystat[ast.tag] then
+ local keywords = {}
+ for i=1,#tokenlist do
+ local token = tokenlist[i]
+ if token.ast == ast and token.tag == 'Keyword' then
+ keywords[#keywords+1] = token
+ end
+ end
+
+ -- Expand keywords for certaining statements.
+ if ast.tag == 'Function' then
+ -- if `Function, also select 'function' and 'return' keywords
+ local function f(ast)
+ for _,cast in ipairs(ast) do
+ if type(cast) == 'table' then
+ if cast.tag == 'Return' then
+ local token = tokenlist[LA.ast_idx_range_in_tokenlist(tokenlist, cast)]
+ keywords[#keywords+1] = token
+ elseif cast.tag ~= 'Function' then f(cast) end
+ end
+ end
+ end
+ f(ast)
+ if not ast.parent then LA.mark_parents(top_ast) end
+ local grand_ast = ast.parent.parent
+ if grand_ast.tag == 'Set' then
+ local token = tokenlist[LA.ast_idx_range_in_tokenlist(tokenlist, grand_ast)]
+ if token.tag == 'Keyword' and token[1] == 'function' then
+ keywords[#keywords+1] = token
+ end
+ elseif grand_ast.tag == 'Localrec' then
+ local tidx = LA.ast_idx_range_in_tokenlist(tokenlist, grand_ast)
+ repeat tidx = tidx + 1 until not tokenlist[tidx] or (tokenlist[tidx].tag == 'Keyword' and tokenlist[tidx][1] == 'function')
+ local token = tokenlist[tidx]
+ keywords[#keywords+1] = token
+ end
+ elseif isloop[ast.tag] then
+ -- if loop, also select 'break' keywords
+ local function f(ast)
+ for _,cast in ipairs(ast) do
+ if type(cast) == 'table' then
+ if cast.tag == 'Break' then
+ local tidx = LA.ast_idx_range_in_tokenlist(tokenlist, cast)
+ keywords[#keywords+1] = tokenlist[tidx]
+ elseif not isloop[cast.tag] then f(cast) end
+ end
+ end
+ end
+ f(ast)
+ end
+
+ return keywords, ast
+ end
+ return nil, ast
+end
+
+
+-- Mark tokenlist (top_ast/tokenlist/src) with keywordid AST attributes.
+-- All keywords related to each other have the same keyword ID integer.
+-- NOTE: This is not done/undone by inspect/uninspect.
+-- CATEGORY: keyword comprehension
+function M.mark_related_keywords(top_ast, tokenlist, src)
+ local id = 0
+ local idof = {}
+ for _, token in ipairs(tokenlist) do
+ if token.tag == 'Keyword' and not idof[token] then
+ id = id + 1
+ local match_ast =
+ LA.smallest_ast_containing_range(top_ast, tokenlist, token.fpos, token.lpos)
+ local ktokenlist = M.related_keywords(match_ast, top_ast, tokenlist, src)
+ if ktokenlist then
+ for _, ktoken in ipairs(ktokenlist) do
+ ktoken.keywordid = id
+ idof[ktoken] = true
+ end
+ end
+ -- note: related_keywords may return a keyword set not containing given keyword.
+ end
+ end
+end
+
+
+-- function for t[k]
+local function tindex(_1, _2) return _1[_2] end
+
+local unescape = {['d'] = '.'}
+
+
+
+-- Sets known value on ast to v if ast not pegged.
+-- CATEGORY: utility function for infer_values.
+local function set_value(ast, v)
+ if not ast.isvaluepegged then
+ ast.value = v
+ end
+end
+
+
+local function known(o)
+ return not T.istype[o]
+end
+local function unknown(o)
+ return T.istype[o]
+end
+
+
+-- CATEGORY: utility function for infer_values.
+local function tastnewindex(t_ast, k_ast, v_ast)
+ if known(t_ast.value) and known(k_ast.value) and known(v_ast.value) then
+ local _1, _2, _3 = t_ast.value, k_ast.value, v_ast.value
+ if _1[_2] ~= nil and _3 ~= _1[_2] then -- multiple values
+ return T.universal
+ else
+ _1[_2] = _3
+ return _3
+ end
+ else
+ return T.universal
+ end
+end
+
+
+-- Gets expected number of parameters for function (min, max) values.
+-- In case of vararg, max is unknown and set to nil.
+local function function_param_range(ast)
+ local names_ast = ast[1]
+ if #names_ast >= 1 and names_ast[#names_ast].tag == 'Dots' then
+ return #names_ast-1, nil
+ else
+ return #names_ast, #names_ast
+ end
+end
+
+-- Gets number of arguments to function call: (min, max) range.
+-- In case of trailing vararg or function call, max is unknown and set to nil.
+local function call_arg_range(ast)
+ if ast.tag == 'Invoke' then
+ if #ast >= 3 and
+ (ast[#ast].tag == 'Dots' or ast[#ast].tag == 'Call' or ast[#ast].tag == 'Invoke')
+ then
+ return #ast-2, nil
+ else
+ return #ast-1, #ast-1
+ end
+ else
+ if #ast >= 2 and
+ (ast[#ast].tag == 'Dots' or ast[#ast].tag == 'Call' or ast[#ast].tag == 'Invoke')
+ then
+ return #ast-2, nil
+ else
+ return #ast-1, #ast-1
+ end
+ end
+end
+
+
+-- Reports warning. List of strings.
+local function warn(report, ...)
+ report('warning: ' .. table.concat({...}, ' '))
+end
+
+-- Reports status messages. List of strings.
+local function status(report, ...)
+ report('status: ' .. table.concat({...}, ' '))
+end
+
+-- unique value used to detect require loops (A require B require A)
+local REQUIRE_SENTINEL = function() end
+
+-- Gets single return value of chunk ast. Assumes ast is inspected.
+local function chunk_return_value(ast)
+ local vinfo
+ if ENABLE_RETURN_ANALYSIS then
+ local info = M.debuginfo[ast.value]
+ local retvals = info and info.retvals
+ if retvals then
+ vinfo = retvals[1]
+ else
+ vinfo = T.universal
+ end
+ else
+ if ast[#ast] and ast[#ast].tag == 'Return' and ast[#ast][1] then
+ vinfo = ast[#ast][1]
+ else
+ vinfo = T.universal
+ end
+ end
+ return vinfo
+end
+
+-- Version of require that does source analysis (inspect) on module.
+function M.require_inspect(name, report, spath)
+ local plinfo = M.package_loaded[name]
+ if plinfo == REQUIRE_SENTINEL then
+ warn(report, "loop in require when loading " .. name)
+ return nil
+ end
+ if plinfo then return plinfo[1] end
+ status(report, 'loading:' .. name)
+ M.package_loaded[name] = REQUIRE_SENTINEL -- avoid recursion on require loops
+ local msrc, mpath = load_module_source(name, spath)
+ local vinfo, mast
+ if msrc then
+ local err; mast, err = LA.ast_from_string(msrc, mpath)
+ if mast then
+ local mtokenlist = LA.ast_to_tokenlist(mast, msrc)
+ M.inspect(mast, mtokenlist, msrc, report)
+ vinfo = chunk_return_value(mast)
+ else
+ vinfo = T.error(err)
+ warn(report, err, " ", mpath) --Q:error printing good?
+ end
+ else
+ warn(report, 'module not found: ' .. name)
+ vinfo = T.error'module not found' --IMPROVE: include search paths?
+ end
+ M.package_loaded[name] = {vinfo, mast}
+ return vinfo, mast
+end
+
+
+-- Marks AST node and all children as dead (ast.isdead).
+local function mark_dead(ast)
+ LA.walk(ast, function(bast) bast.isdead = true end)
+end
+
+-- Gets list of `Return statement ASTs in `Function (or chunk) f_ast, not including
+-- return's in nested functions. Also returns boolean `has_implicit` indicating
+-- whether function may return by exiting the function without a return statement.
+-- Returns that are never exected are omitted (e.g. last return is omitted in
+-- `function f() if x then return 1 else return 2 end return 3 end`).
+-- Also marks AST nodes with ast.isdead (dead-code).
+local function get_func_returns(f_ast)
+ local isalwaysreturn = {}
+ local returns = {}
+ local function f(ast, isdead)
+ for _,cast in ipairs(ast) do if type(cast) == 'table' then
+ if isdead then mark_dead(cast) end -- even if DETECT_DEADCODE disabled
+ if cast.tag ~= 'Function' and not isdead then -- skip nested functions
+ f(cast, isdead) -- depth-first traverse
+ end
+ if ast.tag ~= 'If' and isalwaysreturn[cast] then isdead = true end
+ -- subsequent statements in block never executed
+ end end
+
+ -- Code on walking up AST: propagate children to parents
+ if ast.tag == 'Return' then
+ returns[#returns+1] = ast
+ isalwaysreturn[ast] = true
+ elseif ast.tag == 'If' then
+ if #ast%2 ~= 0 then -- has 'else' block
+ local isreturn = true
+ for i=2,#ast do
+ if (i%2==0 or i==#ast) and not isalwaysreturn[ast[i]] then isreturn = nil; break end
+ end
+ isalwaysreturn[ast] = isreturn
+ end
+ else -- note: iterates not just blocks, but should be ok
+ for i=1,#ast do
+ if isalwaysreturn[ast[i]] then
+ isalwaysreturn[ast] = true; break
+ end
+ end
+ end
+ end
+ f(f_ast, false)
+ local block_ast = f_ast.tag == 'Function' and f_ast[2] or f_ast
+ local has_implicit = not isalwaysreturn[block_ast]
+ return returns, has_implicit
+end
+
+-- temporary hack?
+local function valnode_normalize(valnode)
+ if valnode then
+ return valnode.value
+ else
+ return T.none
+ end
+end
+
+
+-- Gets return value at given return argument index, given list of `Return statements.
+-- Return value is a superset of corresponding types in list of statements.
+-- Example: {`Return{1,2,3}, `Return{1,3,'z'}} would return
+-- 1, T.number, and T.universal for retidx 1, 2 and 3 respectively.
+local function get_return_value(returns, retidx)
+ if #returns == 0 then return T.none
+ elseif #returns == 1 then
+ return valnode_normalize(returns[1][retidx])
+ else
+ local combined_value = valnode_normalize(returns[1][retidx])
+ for i=2,#returns do
+ local cur_value = valnode_normalize(returns[i][retidx])
+ combined_value = T.superset_types(combined_value, cur_value)
+ if combined_value == T.universal then -- can't expand set further
+ return combined_value
+ end
+ end
+ return combined_value
+ --TODO: handle values with possibly any number of return values, like f()
+ end
+end
+
+
+-- Gets return values (or types) on `Function (or chunk) represented by given AST.
+local function get_func_return_values(f_ast)
+ local returns, has_implicit = get_func_returns(f_ast)
+ if has_implicit then returns[#returns+1] = {tag='Return'} end
+ local returnvals = {n=0}
+ for retidx=1,math.huge do
+ local value = get_return_value(returns, retidx)
+ if value == T.none then break end
+ returnvals[#returnvals+1] = value
+ returnvals.n = returnvals.n + 1
+ end
+ return returnvals
+end
+-- Example: AST of `function(x) if x then return 1,2,3 else return 1,3,"z" end end`
+-- returns {1, T.number, T.universal}.
+
+
+-- Given list of values, return the first nvalues values plus the rest of the values
+-- as a tuple. Useful for things like
+-- local ok, values = valuesandtuple(1, pcall(f))
+-- CATEGORY: utility function (list)
+local function valuesandtuple(nvalues, ...)
+ if nvalues >= 1 then
+ return (...), valuesandtuple(nvalues-1, select(2, ...))
+ else
+ return {n=select('#', ...), ...}
+ end
+end
+
+
+-- Infers values of variables. Also marks dead code (ast.isdead).
+--FIX/WARNING - this probably needs more work
+-- Sets top_ast.valueglobals, ast.value, ast.valueself
+-- CATEGORY: code interpretation
+function M.infer_values(top_ast, tokenlist, src, report)
+ if not top_ast.valueglobals then top_ast.valueglobals = {} end
+
+
+ -- infer values
+ LA.walk(top_ast, function(ast) -- walk down
+ if ast.tag == 'Function' then
+ local paramlist_ast = ast[1]
+ for i=1,#paramlist_ast do local param_ast = paramlist_ast[i]
+ if param_ast.value == nil then param_ast.value = T.universal end
+ end
+ end
+ end, function(ast) -- walk up
+ -- process `require` statements.
+ if ast.tag == 'Local' or ast.tag == 'Localrec' then
+ local vars_ast, values_ast = ast[1], ast[2]
+ local valuelist = #values_ast > 0 and values_ast[#values_ast].valuelist
+ for i=1,#vars_ast do
+ local var_ast, value_ast = vars_ast[i], values_ast[i]
+ local value
+ if value_ast then
+ value = value_ast.value
+ elseif valuelist then
+ local vlidx = i - #values_ast + 1
+ value = valuelist.sizeunknown and vlidx > valuelist.n and T.universal or valuelist[vlidx]
+ end
+ set_value(var_ast, value)
+ end
+ elseif ast.tag == 'Set' then -- note: implementation similar to 'Local'
+ local vars_ast, values_ast = ast[1], ast[2]
+ local valuelist = #values_ast > 0 and values_ast[#values_ast].valuelist
+ for i=1,#vars_ast do
+ local var_ast, value_ast = vars_ast[i], values_ast[i]
+ local value
+ if value_ast then
+ value = value_ast.value
+ elseif valuelist then
+ local vlidx = i - #values_ast + 1
+ value = valuelist.sizeunknown and vlidx > valuelist.n and T.universal or valuelist[vlidx]
+ end
+ if var_ast.tag == 'Index' then
+ local t_ast, k_ast = var_ast[1], var_ast[2]
+ if not T.istype[t_ast.value] then -- note: don't mutate types
+ local v_ast = {value=value}
+ local ok; ok, var_ast.value = pzcall(tastnewindex, {t_ast, k_ast, v_ast}, t_ast, k_ast, v_ast)
+ if not ok then var_ast.value = T.error(var_ast.value) end
+ --FIX: propagate to localdefinition?
+ end
+ else
+ assert(var_ast.tag == 'Id', var_ast.tag)
+ if var_ast.localdefinition then
+ set_value(var_ast, value)
+ else -- global
+ local name = var_ast[1]
+ top_ast.valueglobals[name] = value
+ end
+ end
+ --FIX: propagate to definition or localdefinition?
+ end
+ elseif ast.tag == 'Fornum' then
+ local var_ast = ast[1]
+ set_value(var_ast, T.number)
+ elseif ast.tag == 'Forin' then
+ local varlist_ast, iter_ast = ast[1], ast[2]
+ if #iter_ast == 1 and iter_ast[1].tag == 'Call' and iter_ast[1][1].value == ipairs then
+ for i, var_ast in ipairs(varlist_ast) do
+ if i == 1 then set_value(var_ast, T.number)
+ -- handle the type of the value as the type of the first element
+ -- in the table that is a parameter for ipairs
+ elseif i == 2 then
+ local t_ast = iter_ast[1][2]
+ local value = T.universal
+ if (known(t_ast.value) or T.istabletype[t_ast.value]) then
+ local ok; ok, value = pzcall(tindex, {t_ast, {tag='Number', 1}}, t_ast.value, 1)
+ if not ok then value = T.error(t_ast.value) end
+ end
+ set_value(var_ast, value)
+ else set_value(var_ast, nil) end
+ end
+ elseif #iter_ast == 1 and iter_ast[1].tag == 'Call' and iter_ast[1][1].value == pairs then
+ local t_ast = iter_ast[1][2]
+ local value = T.universal
+ local key
+ if t_ast.value and (known(t_ast.value) or T.istabletype[t_ast.value]) then
+ key = next(t_ast.value)
+ local ok; ok, value = pzcall(tindex, {t_ast, {tag='String', key}}, t_ast.value, key)
+ if not ok then value = T.error(t_ast.value) end
+ end
+
+ for i, var_ast in ipairs(varlist_ast) do
+ if i == 1 then set_value(var_ast, type(key))
+ elseif i == 2 then set_value(var_ast, value)
+ else set_value(var_ast, nil) end
+ end
+ else -- general case, unknown iterator
+ for _, var_ast in ipairs(varlist_ast) do
+ set_value(var_ast, T.universal)
+ end
+ end
+ elseif ast.tag == 'Id' then
+ if ast.localdefinition then
+ local localdefinition = ast.localdefinition
+ if not localdefinition.isset then -- IMPROVE: support non-const (isset false) too
+ set_value(ast, localdefinition.value)
+ end
+ else -- global
+ local name = ast[1]
+ local v = top_ast.valueglobals[name]
+ if v ~= nil then
+ ast.value = v
+ else
+ local ok; ok, ast.value = pzcall(tindex, {{tag='Id', '_G'}, {tag='String', name}}, _G, name)
+ if not ok then ast.value = T.error(ast.value) end
+ end
+ end
+ elseif ast.tag == 'Index' then
+ local t_ast, k_ast = ast[1], ast[2]
+ if (known(t_ast.value) or T.istabletype[t_ast.value]) and known(k_ast.value) then
+ local ok; ok, ast.value = pzcall(tindex, {t_ast, k_ast}, t_ast.value, k_ast.value)
+ if not ok then ast.value = T.error(ast.value) end
+ end
+ elseif ast.tag == 'Call' or ast.tag == 'Invoke' then
+ -- Determine function to call (infer via index if method call).
+ local isinvoke = ast.tag == 'Invoke'
+ if isinvoke then
+ local t, k = ast[1].value, ast[2].value
+ if known(t) and known(k) then
+ local ok; ok, ast.valueself = pzcall(tindex, {ast[1], ast[2]}, t, k)
+ if not ok then ast.valueself = T.error(ast.valueself) end
+ end
+ end
+ local func; if isinvoke then func = ast.valueself else func = ast[1].value end
+
+ -- Handle function call.
+ local argvalues_concrete = true; do -- true iff all arguments known precisely.
+ if #ast >= 2 then
+ local firstargvalue; if isinvoke then firstargvalue = ast.valueself else firstargvalue = ast[2].value end
+ if unknown(firstargvalue) then
+ argvalues_concrete = false
+ else -- test remaining args
+ for i=3,#ast do if unknown(ast[i].value) then argvalues_concrete = false; break end end
+ end
+ end
+ end
+ local found
+ if known(func) and argvalues_concrete then -- attempt call with concrete args
+ -- Get list of values of arguments.
+ local argvalues; do
+ argvalues = {n=#ast-1}; for i=1,argvalues.n do argvalues[i] = ast[i+1].value end
+ if isinvoke then argvalues[1] = ast.valueself end -- `self`
+ end
+ -- Any call to require is handled specially (source analysis).
+ if func == require and type(argvalues[1]) == 'string' then
+ local spath = tostring(ast.lineinfo.first):gsub('<C|','<'):match('<([^|]+)') -- a HACK? relies on AST lineinfo
+ local val, mast = M.require_inspect(argvalues[1], report, spath:gsub('[^\\/]+$', ''))
+ if known(val) and val ~= nil then
+ ast.value = val
+ found = true
+ end -- note: on nil value, assumes analysis failed (not found). This is a heuristic only.
+ if mast and mast.valueglobals then ast.valueglobals = mast.valueglobals end
+ end
+ -- Attempt call if safe.
+ if not found and (LS.safe_function[func] or func == pcall and LS.safe_function[argvalues[1]]) then
+ local ok; ok, ast.valuelist = valuesandtuple(1, pcall(func, unpack(argvalues,1,argvalues.n)))
+ ast.value = ast.valuelist[1]; if not ok then ast.value = T.error(ast.value) end
+ found = true
+ end
+ end
+ if not found then
+ -- Attempt mock function. Note: supports nonconcrete args too.
+ local mf = LS.mock_functions[func]
+ if mf then
+ ast.valuelist = mf.outputs; ast.value = ast.valuelist[1]
+ else
+ -- Attempt infer from return statements in function source.
+ local info = M.debuginfo[func]
+ if not info then -- try match from dynamic debug info
+ local dinfo = type(func) == 'function' and debug.getinfo(func)
+ if dinfo then
+ local source, linedefined = dinfo.source, dinfo.linedefined
+ if source and linedefined then
+ local sourceline = source .. ':' .. linedefined
+ info = M.debuginfo[sourceline]
+ end
+ end
+ end
+ local retvals = info and info.retvals
+ if retvals then
+ ast.valuelist = retvals; ast.value = ast.valuelist[1]
+ else
+ -- Could not infer.
+ ast.valuelist = {n=0, sizeunknown=true}; ast.value = T.universal
+ end
+ end
+ end
+ elseif ast.tag == 'String' or ast.tag == 'Number' then
+ ast.value = ast[1]
+ elseif ast.tag == 'True' or ast.tag == 'False' then
+ ast.value = (ast.tag == 'True')
+ elseif ast.tag == 'Function' or ast == top_ast then -- includes chunk
+ if ast.value == nil then -- avoid redefinition
+ local x
+ local val = function() x=nil end
+ local fpos = LA.ast_pos_range(ast, tokenlist)
+ local source, linenum = tostring(ast.lineinfo.first):gsub('<C|','<'):match('<([^|]+)|L(%d+)') -- a HACK? relies on AST lineinfo
+ local retvals
+ if ENABLE_RETURN_ANALYSIS then
+ retvals = get_func_return_values(ast) --Q:move outside of containing conditional?
+ end
+ local info = {fpos=fpos, source="@" .. source, fast=ast, tokenlist=tokenlist, retvals=retvals, top_ast = top_ast}
+ M.debuginfo[val] = info
+ local sourceline = '@' .. source .. ':' .. linenum
+ local oldinfo = M.debuginfo[sourceline]
+ if oldinfo then
+ if oldinfo.fast ~= ast then
+ -- Two functions on the same source line cannot necessarily be disambiguated.
+ -- Unfortuntely, Lua debuginfo lacks exact character position.
+ -- http://lua-users.org/lists/lua-l/2010-08/msg00273.html
+ -- So, just disable info if ambiguous. Note: a slight improvement is to use the lastlinedefined.
+ M.debuginfo[sourceline] = false
+ end
+ else
+ if oldinfo == nil then
+ M.debuginfo[sourceline] = info -- store by sourceline too for quick lookup from dynamic debug info
+ end -- else false (do nothing)
+ end
+ ast.value = val
+ ast.nocollect = info -- prevents garbage collection while ast exists
+ end
+ elseif ast.tag == 'Table' then
+ if ast.value == nil then -- avoid redefinition
+ local value = {}
+ local n = 1
+ for _,east in ipairs(ast) do
+ if east.tag == 'Pair' then
+ local kast, vast = east[1], east[2]
+ if known(kast.value) and known(vast.value) then
+ if kast.value == nil then
+ -- IMPROVE? warn in some way?
+ else
+ value[kast.value] = vast.value
+ end
+ end
+ else
+ if known(east.value) then
+ value[n] = east.value
+ end
+ n = n + 1
+ end
+ end
+ --table.foreach(value, print)
+ ast.value = value
+ end
+ elseif ast.tag == 'Paren' then
+ ast.value = ast[1].value
+ elseif ast.tag == 'Op' then
+ local opid, aast, bast = ast[1], ast[2], ast[3]
+ local ok
+ if bast then
+ ok, ast.value = pzcall(dobinop, {aast, bast}, opid, aast.value, bast.value)
+ else
+ ok, ast.value = pzcall(dounop, {aast}, opid, aast.value)
+ end
+ if not ok then ast.value = T.error(ast.value) end
+ elseif ast.tag == 'If' then
+ -- detect dead-code
+ if DETECT_DEADCODE then
+ for i=2,#ast,2 do local valnode = ast[i-1]
+ local bval = T.boolean_cast(valnode.value)
+ if bval == false then -- certainly false
+ mark_dead(ast[i])
+ elseif bval == true then -- certainly true
+ for ii=i+1,#ast do if ii%2 == 0 or ii==#ast then -- following blocks are dead
+ mark_dead(ast[ii])
+ end end
+ break
+ end
+ end
+ end
+ -- IMPROVE? `if true return end; f()` - f could be marked as deadcode
+ elseif ast.tag == 'While' then
+ -- detect dead-code
+ if DETECT_DEADCODE then
+ local expr_ast, body_ast = ast[1], ast[2]
+ if T.boolean_cast(expr_ast.value) == false then
+ mark_dead(body_ast)
+ end
+ end
+ end
+ end)
+end
+
+
+-- Labels variables with unique identifiers.
+-- Sets ast.id, ast.resolvedname
+-- CATEGORY: code interpretation
+function M.mark_identifiers(ast)
+ local id = 0
+ local seen_globals = {}
+ LA.walk(ast, function(ast)
+ if ast.tag == 'Id' or ast.isfield then
+ if ast.localdefinition then
+ if ast.localdefinition == ast then -- lexical definition
+ id = id + 1
+ ast.id = id
+ else
+ ast.id = ast.localdefinition.id
+ end
+ elseif ast.isfield then
+ local previousid = ast.previous.id
+ if not previousid then -- note: ("abc"):upper() has no previous ID
+ id = id + 1
+ previousid = id
+ end
+ local name = previousid .. '.' .. ast[1]:gsub('%%', '%%'):gsub('%.', '%d')
+ if not seen_globals[name] then
+ id = id + 1
+ seen_globals[name] = id
+ end
+ ast.id = seen_globals[name]
+
+ -- also resolve name
+ local previousresolvedname = ast.previous.resolvedname
+ if previousresolvedname then
+ ast.resolvedname = previousresolvedname .. '.' .. ast[1]:gsub('%%', '%%'):gsub('%.', '%d')
+ end
+ else -- global
+ local name = ast[1]
+ if not seen_globals[name] then
+ id = id + 1
+ seen_globals[name] = id
+ end
+ ast.id = seen_globals[name]
+
+ -- also resolve name
+ ast.resolvedname = ast[1]
+ end
+ end
+ end)
+end
+
+
+-- Environment in which to execute special comments (see below).
+local env = setmetatable({}, {__index=_G})
+env.context = env
+
+env.number = T.number
+env.string = T.string
+env.boolean = T.boolean
+env.error = T.error
+
+
+-- Applies value to all identifiers with name matching pattern.
+-- This command is callable inside special comments.
+-- CATEGORY: code interpretation / special comment command
+function env.apply_value(pattern, val)
+ local function f(ast)
+ if ast.tag == 'Id' and ast[1]:match(pattern) then
+ ast.value = val; ast.isvaluepegged = true
+ end
+ for _,bast in ipairs(ast) do
+ if type(bast) == 'table' then
+ f(bast)
+ end
+ end
+ end
+ f(env.ast) -- ast from environment
+ --UNUSED:
+ -- for i=env.asti, #env.ast do
+ -- local bast = env.ast[i]
+ -- if type(bast) == 'table' then f(bast) end
+ --end
+end
+
+
+-- Evaluates all special comments (i.e. comments prefixed by '!') in code.
+-- This is similar to luaanalyze.
+-- CATEGORY: code interpretation / special comments
+function M.eval_comments(ast, tokenlist, report)
+ local function eval(command, ast)
+ --DEBUG('!', command:gsub('%s+$', ''), ast.tag)
+ local f, err = COMPAT.load(command, nil, 't', env)
+ if f then
+ env.ast = ast
+ local ok, err = pcall(f, ast)
+ if not ok then warn(report, err, ': ', command) end
+ env.ast = nil
+ else
+ warn(report, err, ': ', command)
+ end
+ end
+
+ for idx=1,#tokenlist do
+ local token = tokenlist[idx]
+ if token.tag == 'Comment' then
+ local command = token[1]:match'^!(.*)'
+ if command then
+ local mast = LA.smallest_ast_containing_range(ast, tokenlist, token.fpos, token.lpos)
+ eval(command, mast)
+ end
+ end
+ end
+end
+--IMPROVE: in `do f() --[[!g()]] h()` only apply g to h.
+
+
+
+
+-- Partially undoes effects of inspect().
+-- Note: does not undo mark_tag2 and mark_parents (see replace_statements).
+-- CATEGORY: code interpretation
+function M.uninspect(top_ast)
+ -- remove ast from M.debuginfo
+ for k, info in pairs(M.debuginfo) do
+ if info and info.top_ast == top_ast then
+ M.debuginfo[k] = nil
+ end
+ end
+
+ -- Clean ast.
+ LA.walk(top_ast, function(ast)
+ -- undo inspect_globals.globals
+ ast.localdefinition = nil
+ ast.functionlevel = nil
+ ast.isparam = nil
+ ast.isset = nil
+ ast.isused = nil
+ ast.isignore = nil
+ ast.isfield = nil
+ ast.previous = nil
+ ast.localmasked = nil
+ ast.localmasking = nil
+
+ -- undo mark_identifiers
+ ast.id = nil
+ ast.resolvedname = nil
+
+ -- undo infer_values
+ ast.value = nil
+ ast.valueself = nil
+ ast.valuelist = nil
+ ast.isdead = nil -- via get_func_returns
+ ast.isvaluepegged = nil
+
+ -- undo walk setting ast.seevalue
+ ast.seevalue = nil
+
+ -- undo walk setting ast.definedglobal
+ ast.definedglobal = nil
+
+ -- undo notes
+ ast.note = nil
+
+ ast.nocollect = nil
+
+ -- undo infer_values
+ ast.valueglobals = nil
+ end)
+end
+
+
+-- Main inspection routine. Inspects top_ast/tokenlist.
+-- Error/status messages are sent to function `report`.
+-- CATEGORY: code interpretation
+function M.inspect(top_ast, tokenlist, src, report)
+ --DEBUG: local t0 = os.clock()
+ if not report then -- compat for older version of lua-inspect
+ assert('inspect signature changed; please upgrade your code')
+ end
+
+ report = report or function() end
+
+ local globals = LG.globals(top_ast)
+
+ M.mark_identifiers(top_ast)
+
+ M.eval_comments(top_ast, tokenlist, report)
+
+ M.infer_values(top_ast, tokenlist, src, report)
+ M.infer_values(top_ast, tokenlist, src, report) -- two passes to handle forward declarations of globals (IMPROVE: more passes?)
+
+ -- Make some nodes as having values related to its parent.
+ -- This allows clicking on `bar` in `foo.bar` to display
+ -- the value of `foo.bar` rather than just "bar".
+ LA.walk(top_ast, function(ast)
+ if ast.tag == 'Index' then
+ ast[2].seevalue = ast
+ elseif ast.tag == 'Invoke' then
+ ast[2].seevalue = {value=ast.valueself, parent=ast}
+ end
+ end)
+
+ local function eval_name_helper(name)
+ local var = _G
+ for part in (name .. '.'):gmatch("([^.]*)%.") do
+ part = part:gsub('%%(.)', unescape)
+ if type(var) ~= 'table' and type(var) ~= 'userdata' then return nil end --TODO:improve?
+ var = var[part]
+ if var == nil then return nil end
+ end
+ return var
+ end
+ local function eval_name(name)
+ local ok, o = pzcall(eval_name_helper, {}, name)
+ if ok then return o else return nil end
+ end
+
+ LA.walk(top_ast, function(ast)
+ if top_ast ~= ast and ast.valueglobals then
+ for k in pairs(ast.valueglobals) do globals[k] = {set = ast} end
+ ast.valueglobals = nil
+ end
+ if ast.tag == 'Id' or ast.isfield then
+ local vname = ast[1]
+ --TODO: rename definedglobal to definedfield for clarity
+ local atype = ast.localdefinition and 'local' or ast.isfield and 'field' or 'global'
+ local definedglobal = ast.resolvedname and eval_name(ast.resolvedname) ~= nil or
+ atype == 'global' and (globals[vname] and globals[vname].set) or nil
+ ast.definedglobal = definedglobal
+ -- FIX: _G includes modules imported by inspect.lua, which is not desired
+ elseif ast.tag == 'Call' or ast.tag == 'Invoke' then
+ -- Argument count check.
+ local value = ast.valueself or ast[1].value
+ local info = M.debuginfo[value]
+ local fast = info and info.fast
+ if fast or LS.argument_counts[value] then
+ local nparammin, nparammax
+ if fast then
+ nparammin, nparammax = function_param_range(info.fast)
+ else
+ nparammin, nparammax = unpack(LS.argument_counts[value])
+ end
+ local nargmin, nargmax = call_arg_range(ast)
+ --print('DEBUG:', nparammin, nparammax, nargmin, nargmax)
+ local iswarn
+ local target_ast = ast.tag == 'Call' and ast[1] or ast[2]
+ if (nargmax or math.huge) < nparammin then
+ ast.note = "Too few arguments; "
+ iswarn = true
+ elseif nargmin > (nparammax or math.huge) then
+ ast.note = "Too many arguments; "
+ iswarn = true
+ end
+ if iswarn then
+ ast.note = ast.note .. "expected "
+ .. nparammin .. (nparammax == nparammin and "" or " to " .. (nparammax or "infinity"))
+ .. " but got "
+ .. nargmin .. (nargmax == nargmin and "" or " to " .. (nargmax or "infinity")) .. "."
+ end
+ end
+ end
+ end)
+end
+
+
+-- Resolves identifier to value [*]
+function M.resolve_id(id, scope, valueglobals, _G)
+ local val
+ if scope[id] then
+ val = scope[id].value
+ elseif valueglobals[id] ~= nil then
+ val = valueglobals[id]
+ else
+ val = _G[id] -- assumes not raise
+ end
+ return val
+end
+
+-- Resolves prefix chain expression to value. [*]
+-- On error returns nil and error object
+function M.resolve_prefixexp(ids, scope, valueglobals, _G)
+ local _1 = M.resolve_id(ids[1], scope, valueglobals, _G)
+ local ok, err = pzcall(function()
+ for i=2,#ids do
+ _1 = _1[ids[i]]
+ end
+ end, {})
+ if err then return nil, err or '?' end
+ return _1
+end
+
+-- Gets local scope at given 1-indexed char position
+function M.get_scope(pos1, ast, tokenlist)
+ local mast, isafter = LA.current_statementblock(ast, tokenlist, pos1)
+ local scope = LG.variables_in_scope(mast, isafter)
+ return scope
+end
+
+-- Gets names in prefix expression ids (as returned by resolve_prefixexp). [*]
+function M.names_in_prefixexp(ids, pos, ast, tokenlist)
+ local scope = M.get_scope(pos, ast, tokenlist)
+ --FIX: above does not handle `for x=1,2 do| print(x) end` where '|' is cursor position.
+ local names = {}
+ if #ids == 0 then -- global
+ for name in pairs(scope) do names[#names+1] = name end
+ for name in pairs(ast.valueglobals) do names[#names+1] = name end
+ for name in pairs(_G) do names[#names+1] = name end
+ else -- field
+ local t, err_ = M.resolve_prefixexp(ids, scope, ast.valueglobals, _G)
+ if type(t) == 'table' then -- note: err_ implies false here
+ for name in pairs(t) do names[#names+1] = name end
+ end
+ end
+ return names
+end
+
+-- Gets signature (function argument string or helpinfo string) on value.
+-- Returns nil on not found.
+function M.get_signature_of_value(value)
+ local info = M.debuginfo[value] -- first try this
+ if info and info.fast then
+ local fidx, lidx = LA.ast_idx_range_in_tokenlist(info.tokenlist, info.fast[1])
+ local ts = {}
+ if fidx then
+ for i=fidx,lidx do
+ local token = info.tokenlist[i]
+ ts[#ts+1] = token.tag == 'Dots' and '...' or token[1]
+ end
+ end
+ local sig = 'function(' .. table.concat(ts, ' ') .. ')'
+ if info.retvals then
+ local vals = info.retvals
+ local ts = {}
+ if vals.n == 0 then
+ sig = sig .. " no returns"
+ else
+ for i=1,vals.n do local val = vals[i]
+ ts[#ts+1] = T.istype[val] and tostring(val) or LD.dumpstring(val) --Q:dumpstring too verbose?
+ end
+ sig = sig .. " returns " .. table.concat(ts, ", ")
+ end
+ end
+ return sig
+ end
+ local sig = LS.value_signatures[value] -- else try this
+ return sig
+end
+
+
+-- Gets signature (function argument string or helpinfo string) on variable ast.
+-- Returns nil on not found.
+function M.get_signature(ast)
+ if known(ast.value) then
+ return M.get_signature_of_value(ast.value)
+ end
+end
+
+
+-- Gets 1-indexed character (or line) position and filename of
+-- definition associated with AST node (if any).
+function M.ast_to_definition_position(ast, tokenlist)
+ local local_ast = ast.localdefinition
+ local fpos, fline, path
+ if local_ast then
+ local tidx = LA.ast_idx_range_in_tokenlist(tokenlist, local_ast)
+ if tidx then
+ local spath = tostring(ast.lineinfo.first):gsub('<C|','<'):match('<([^|]+)') -- a HACK? using lineinfo
+ fpos = tokenlist[tidx].fpos; path = spath
+ end
+ end
+ if not fpos then
+ local valueast = ast.seevalue or ast
+ local val = valueast and valueast.value
+ local info = M.debuginfo[val] or type(val) == 'function' and debug.getinfo(val)
+ if info then
+ if info.source:match'^@' then
+ path = info.source:match'@(.*)'
+ if info.linedefined then
+ fline = info.linedefined
+ else
+ fpos = info.fpos
+ end
+ end
+ end
+ end
+ return fpos, fline, path
+end
+
+
+-- Returns true iff value in ast node is known in some way.
+function M.is_known_value(ast)
+ local vast = ast.seevalue or ast
+ return vast.definedglobal or known(vast.value) and vast.value ~= nil
+end
+
+
+-- Gets list of variable attributes for AST node.
+function M.get_var_attributes(ast)
+ local vast = ast.seevalue or ast
+ local attributes = {}
+ if ast.localdefinition then
+ attributes[#attributes+1] = "local"
+ if ast.localdefinition.functionlevel < ast.functionlevel then
+ attributes[#attributes+1] = 'upvalue'
+ end
+ if ast.localdefinition.isparam then
+ attributes[#attributes+1] = "param"
+ end
+ if not ast.localdefinition.isused then attributes[#attributes+1] = 'unused' end
+ if ast.isignore then attributes[#attributes+1] = 'ignore' end
+ if ast.localdefinition.isset then attributes[#attributes+1] = 'mutatebind'
+ else attributes[#attributes+1] = 'constbind' end
+ if ast.localmasking then
+ attributes[#attributes+1] = "masking"
+ end
+ if ast.localmasked then
+ attributes[#attributes+1] = "masked"
+ end
+ elseif ast.tag == 'Id' then -- global
+ attributes[#attributes+1] = (M.is_known_value(vast) and "known" or "unknown")
+ attributes[#attributes+1] = "global"
+ elseif ast.isfield then
+ attributes[#attributes+1] = (M.is_known_value(vast) and "known" or "unknown")
+ attributes[#attributes+1] = "field"
+ else
+ attributes[#attributes+1] = "FIX" -- shouldn't happen?
+ end
+ if vast.parent and (vast.parent.tag == 'Call' or vast.parent.tag == 'Invoke')
+ and vast.parent.note
+ then
+ attributes[#attributes+1] = 'warn'
+ end
+ return attributes
+end
+
+
+-- Gets detailed information about value in AST node, as string.
+function M.get_value_details(ast, tokenlist, src)
+ local lines = {}
+
+ if not ast then return '?' end
+
+ local vast = ast.seevalue or ast
+
+ lines[#lines+1] = "attributes: " .. table.concat(M.get_var_attributes(ast), " ")
+
+ lines[#lines+1] = "value: " .. tostring(vast.value)
+
+ local sig = M.get_signature(vast)
+ if sig then
+ local kind = sig:find '%w%s*%b()$' and 'signature' or 'description'
+ lines[#lines+1] = kind .. ": " .. sig
+ end
+
+ local fpos, fline, path = M.ast_to_definition_position(ast, tokenlist)
+ if fpos or fline then
+ local fcol
+ if fpos then
+ fline, fcol = LA.pos_to_linecol(fpos, src)
+ end
+ local location = path .. ":" .. (fline) .. (fcol and ":" .. fcol or "")
+ lines[#lines+1] = "location defined: " .. location
+ end
+
+ if ast.localdefinition and ast.localmasking then
+ local fpos = LA.ast_pos_range(ast.localmasking, tokenlist)
+ if fpos then
+ local linenum = LA.pos_to_linecol(fpos, src)
+ lines[#lines+1] = "masking definition at line: " .. linenum
+ end
+ end
+
+ -- Render warning notes attached to calls/invokes.
+ local note = vast.parent and (vast.parent.tag == 'Call' or vast.parent.tag == 'Invoke')
+ and vast.parent.note
+ if note then
+ lines[#lines+1] = "WARNING: " .. note
+ end
+
+ return table.concat(lines, "\n")
+end
+
+
+-- Gets list of all warnings, as strings.
+-- In HTML Tidy format (which supports column numbers in SciTE, although is
+-- slightly verbose and lacks filename).
+function M.list_warnings(tokenlist, src)
+ local warnings = {}
+ local ttoken
+ local function warn(msg)
+ local linenum, colnum = LA.pos_to_linecol(ttoken.fpos, src)
+ warnings[#warnings+1] = "line " .. linenum .. " column " .. colnum .. " - " .. msg
+ end
+ local isseen = {}
+ for i,token in ipairs(tokenlist) do ttoken = token
+ if token.ast then
+ local ast = token.ast
+ if ast.localmasking then
+ local pos = LA.ast_pos_range(ast.localmasking, tokenlist)
+ local linenum = pos and LA.pos_to_linecol(pos, src)
+ warn("local " .. ast[1] .. " masks another local" .. (pos and " on line " .. linenum or ""))
+ end
+ if ast.localdefinition == ast and not ast.isused and not ast.isignore then
+ warn("unused local " .. ast[1])
+ end
+ if ast.isfield and not(known(ast.seevalue.value) and ast.seevalue.value ~= nil) then
+ warn("unknown field " .. ast[1])
+ elseif ast.tag == 'Id' and not ast.localdefinition and not ast.definedglobal then
+ warn("unknown global " .. ast[1])
+ end
+ local vast = ast.seevalue or ast
+ local note = vast.parent and (vast.parent.tag == 'Call' or vast.parent.tag == 'Invoke')
+ and vast.parent.note
+ if note and not isseen[vast.parent] then
+ isseen[vast.parent] = true
+ local esrc = LA.ast_to_text(vast.parent, tokenlist, src)
+ -- IMPROVE: large items like `f(function() ... end)` may be shortened.
+ warn(note .. (esrc and "for " .. esrc or ""))
+ end
+ end
+ end
+ return warnings
+end
+
+
+return M
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/signatures.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/signatures.lua
new file mode 100644
index 0000000..145ed3f
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/signatures.lua
@@ -0,0 +1,433 @@
+local M = {}
+
+local T = require "luainspect.types"
+
+-- signatures of known globals
+M.global_signatures = {
+ assert = "assert (v [, message])",
+ collectgarbage = "collectgarbage (opt [, arg])",
+ dofile = "dofile (filename)",
+ error = "error (message [, level])",
+ _G = "(table)",
+ getfenv = "getfenv ([f])",
+ getmetatable = "getmetatable (object)",
+ ipairs = "ipairs (t)",
+ load = "load (func [, chunkname])",
+ loadfile = "loadfile ([filename])",
+ loadstring = "loadstring (string [, chunkname])",
+ next = "next (table [, index])",
+ pairs = "pairs (t)",
+ pcall = "pcall (f, arg1, ...)",
+ print = "print (...)",
+ rawequal = "rawequal (v1, v2)",
+ rawget = "rawget (table, index)",
+ rawset = "rawset (table, index, value)",
+ select = "select (index, ...)",
+ setfenv = "setfenv (f, table)",
+ setmetatable = "setmetatable (table, metatable)",
+ tonumber = "tonumber (e [, base])",
+ tostring = "tostring (e)",
+ type = "type (v)",
+ unpack = "unpack (list [, i [, j]])",
+ _VERSION = "(string)",
+ xpcall = "xpcall (f, err)",
+ module = "module (name [, ...])",
+ require = "require (modname)",
+ coroutine = "(table) coroutine manipulation library",
+ debug = "(table) debug facilities library",
+ io = "(table) I/O library",
+ math = "(table) math functions libary",
+ os = "(table) OS facilities library",
+ package = "(table) package library",
+ string = "(table) string manipulation library",
+ table = "(table) table manipulation library",
+ ["coroutine.create"] = "coroutine.create (f)",
+ ["coroutine.resume"] = "coroutine.resume (co [, val1, ...])",
+ ["coroutine.running"] = "coroutine.running ()",
+ ["coroutine.status"] = "coroutine.status (co)",
+ ["coroutine.wrap"] = "coroutine.wrap (f)",
+ ["coroutine.yield"] = "coroutine.yield (...)",
+ ["debug.debug"] = "debug.debug ()",
+ ["debug.getfenv"] = "debug.getfenv (o)",
+ ["debug.gethook"] = "debug.gethook ([thread])",
+ ["debug.getinfo"] = "debug.getinfo ([thread,] function [, what])",
+ ["debug.getlocal"] = "debug.getlocal ([thread,] level, local)",
+ ["debug.getmetatable"] = "debug.getmetatable (object)",
+ ["debug.getregistry"] = "debug.getregistry ()",
+ ["debug.getupvalue"] = "debug.getupvalue (func, up)",
+ ["debug.setfenv"] = "debug.setfenv (object, table)",
+ ["debug.sethook"] = "debug.sethook ([thread,] hook, mask [, count])",
+ ["debug.setlocal"] = "debug.setlocal ([thread,] level, local, value)",
+ ["debug.setmetatable"] = "debug.setmetatable (object, table)",
+ ["debug.setupvalue"] = "debug.setupvalue (func, up, value)",
+ ["debug.traceback"] = "debug.traceback ([thread,] [message] [, level])",
+ ["io.close"] = "io.close ([file])",
+ ["io.flush"] = "io.flush ()",
+ ["io.input"] = "io.input ([file])",
+ ["io.lines"] = "io.lines ([filename])",
+ ["io.open"] = "io.open (filename [, mode])",
+ ["io.output"] = "io.output ([file])",
+ ["io.popen"] = "io.popen (prog [, mode])",
+ ["io.read"] = "io.read (...)",
+ ["io.tmpfile"] = "io.tmpfile ()",
+ ["io.type"] = "io.type (obj)",
+ ["io.write"] = "io.write (...)",
+ ["math.abs"] = "math.abs (x)",
+ ["math.acos"] = "math.acos (x)",
+ ["math.asin"] = "math.asin (x)",
+ ["math.atan"] = "math.atan (x)",
+ ["math.atan2"] = "math.atan2 (y, x)",
+ ["math.ceil"] = "math.ceil (x)",
+ ["math.cos"] = "math.cos (x)",
+ ["math.cosh"] = "math.cosh (x)",
+ ["math.deg"] = "math.deg (x)",
+ ["math.exp"] = "math.exp (x)",
+ ["math.floor"] = "math.floor (x)",
+ ["math.fmod"] = "math.fmod (x, y)",
+ ["math.frexp"] = "math.frexp (x)",
+ ["math.huge"] = "math.huge",
+ ["math.ldexp"] = "math.ldexp (m, e)",
+ ["math.log"] = "math.log (x)",
+ ["math.log10"] = "math.log10 (x)",
+ ["math.max"] = "math.max (x, ...)",
+ ["math.min"] = "math.min (x, ...)",
+ ["math.modf"] = "math.modf (x)",
+ ["math.pi"] = "math.pi",
+ ["math.pow"] = "math.pow (x, y)",
+ ["math.rad"] = "math.rad (x)",
+ ["math.random"] = "math.random ([m [, n]])",
+ ["math.randomseed"] = "math.randomseed (x)",
+ ["math.sin"] = "math.sin (x)",
+ ["math.sinh"] = "math.sinh (x)",
+ ["math.sqrt"] = "math.sqrt (x)",
+ ["math.tan"] = "math.tan (x)",
+ ["math.tanh"] = "math.tanh (x)",
+ ["os.clock"] = "os.clock ()",
+ ["os.date"] = "os.date ([format [, time]])",
+ ["os.difftime"] = "os.difftime (t2, t1)",
+ ["os.execute"] = "os.execute ([command])",
+ ["os.exit"] = "os.exit ([code])",
+ ["os.getenv"] = "os.getenv (varname)",
+ ["os.remove"] = "os.remove (filename)",
+ ["os.rename"] = "os.rename (oldname, newname)",
+ ["os.setlocale"] = "os.setlocale (locale [, category])",
+ ["os.time"] = "os.time ([table])",
+ ["os.tmpname"] = "os.tmpname ()",
+ ["package.cpath"] = "package.cpath",
+ ["package.loaded"] = "package.loaded",
+ ["package.loaders"] = "package.loaders",
+ ["package.loadlib"] = "package.loadlib (libname, funcname)",
+ ["package.path"] = "package.path",
+ ["package.preload"] = "package.preload",
+ ["package.seeall"] = "package.seeall (module)",
+ ["string.byte"] = "string.byte (s [, i [, j]])",
+ ["string.char"] = "string.char (...)",
+ ["string.dump"] = "string.dump (function)",
+ ["string.find"] = "string.find (s, pattern [, init [, plain]])",
+ ["string.format"] = "string.format (formatstring, ...)",
+ ["string.gmatch"] = "string.gmatch (s, pattern)",
+ ["string.gsub"] = "string.gsub (s, pattern, repl [, n])",
+ ["string.len"] = "string.len (s)",
+ ["string.lower"] = "string.lower (s)",
+ ["string.match"] = "string.match (s, pattern [, init])",
+ ["string.rep"] = "string.rep (s, n)",
+ ["string.reverse"] = "string.reverse (s)",
+ ["string.sub"] = "string.sub (s, i [, j])",
+ ["string.upper"] = "string.upper (s)",
+ ["table.concat"] = "table.concat (table [, sep [, i [, j]]])",
+ ["table.insert"] = "table.insert (table, [pos,] value)",
+ ["table.maxn"] = "table.maxn (table)",
+ ["table.remove"] = "table.remove (table [, pos])",
+ ["table.sort"] = "table.sort (table [, comp])",
+}
+
+-- utility function. Converts e.g. name 'math.sqrt' to its value.
+local function resolve_global_helper_(name)
+ local o = _G
+ for fieldname in name:gmatch'[^%.]+' do o = o[fieldname] end
+ return o
+end
+local function resolve_global(name)
+ local a, b = pcall(resolve_global_helper_, name)
+ if a then return b else return nil, b end
+end
+
+-- Same as global_signatures but maps value (not name) to signature.
+M.value_signatures = {}
+local isobject = {['function']=true, ['table']=true, ['userdata']=true, ['coroutine']=true}
+for name,sig in pairs(M.global_signatures) do
+ local val, err = resolve_global(name)
+ if isobject[type(val)] then
+ M.value_signatures[val] = sig
+ end
+end
+
+-- min,max argument counts.
+M.argument_counts = {
+ [assert] = {1,2},
+ [collectgarbage] = {1,2},
+ [dofile] = {1},
+ [error] = {1,2},
+ [getfenv or false] = {0,1},
+ [getmetatable] = {1,1},
+ [ipairs] = {1,1},
+ [load] = {1,2},
+ [loadfile] = {0,1},
+ [loadstring] = {1,2},
+ [next] = {1,2},
+ [pairs] = {1,1},
+ [pcall] = {1,math.huge},
+ [print] = {0,math.huge},
+ [rawequal] = {2,2},
+ [rawget] = {2,2},
+ [rawset] = {3,3},
+ [select] = {1, math.huge},
+ [setfenv or false] = {2,2},
+ [setmetatable] = {2,2},
+ [tonumber] = {1,2},
+ [tostring] = {1},
+ [type] = {1},
+ [unpack] = {1,3},
+ [xpcall] = {2,2},
+ [module] = {1,math.huge},
+ [require] = {1,1},
+ [coroutine.create] = {1,1},
+ [coroutine.resume] = {1, math.huge},
+ [coroutine.running] = {0,0},
+ [coroutine.status] = {1,1},
+ [coroutine.wrap] = {1,1},
+ [coroutine.yield] = {0,math.huge},
+ [debug.debug] = {0,0},
+ [debug.getfenv or false] = {1,1},
+ [debug.gethook] = {0,1},
+ [debug.getinfo] = {1,3},
+ [debug.getlocal] = {2,3},
+ [debug.getmetatable] = {1,1},
+ [debug.getregistry] = {0,0},
+ [debug.getupvalue] = {2,2},
+ [debug.setfenv or false] = {2,2},
+ [debug.sethook] = {2,4},
+ [debug.setlocal] = {3,4},
+ [debug.setmetatable] = {2,2},
+ [debug.setupvalue] = {3,3},
+ [debug.traceback] = {0,3},
+ [io.close] = {0,1},
+ [io.flush] = {0,0},
+ [io.input] = {0,1},
+ [io.lines] = {0,1},
+ [io.open] = {1,2},
+ [io.output] = {0,1},
+ [io.popen] = {1,2},
+ [io.read] = {0,math.huge},
+ [io.tmpfile] = {0},
+ [io.type] = {1},
+ [io.write] = {0,math.huge},
+ [math.abs] = {1},
+ [math.acos] = {1},
+ [math.asin] = {1},
+ [math.atan] = {1},
+ [math.atan2] = {2,2},
+ [math.ceil] = {1,1},
+ [math.cos] = {1,1},
+ [math.cosh] = {1,1},
+ [math.deg] = {1,1},
+ [math.exp] = {1,1},
+ [math.floor] = {1,1},
+ [math.fmod] = {2,2},
+ [math.frexp] = {1,1},
+ [math.ldexp] = {2,2},
+ [math.log] = {1,1},
+ [math.log10] = {1,1},
+ [math.max] = {1,math.huge},
+ [math.min] = {1,math.huge},
+ [math.modf] = {1,1},
+ [math.pow] = {2,2},
+ [math.rad] = {1,1},
+ [math.random] = {0,2},
+ [math.randomseed] = {1,1},
+ [math.sin] = {1,1},
+ [math.sinh] = {1,1},
+ [math.sqrt] = {1,1},
+ [math.tan] = {1,1},
+ [math.tanh] = {1,1},
+ [os.clock] = {0,0},
+ [os.date] = {0,2},
+ [os.difftime] = {2,2},
+ [os.execute] = {0,1},
+ [os.exit] = {0,1},
+ [os.getenv] = {1,1},
+ [os.remove] = {1,1},
+ [os.rename] = {2,2},
+ [os.setlocale] = {1,2},
+ [os.time] = {0,1},
+ [os.tmpname] = {0,0},
+ [package.loadlib] = {2,2},
+ [package.seeall] = {1,1},
+ [string.byte] = {1,3},
+ [string.char] = {0,math.huge},
+ [string.dump] = {1,1},
+ [string.find] = {2,4},
+ [string.format] = {1,math.huge},
+ [string.gmatch] = {2,2},
+ [string.gsub] = {3,4},
+ [string.len] = {1,1},
+ [string.lower] = {1,1},
+ [string.match] = {2,3},
+ [string.rep] = {2,2},
+ [string.reverse] = {1,1},
+ [string.sub] = {2,3},
+ [string.upper] = {1,1},
+ [table.concat] = {1,4},
+ [table.insert] = {2,3},
+ [table.maxn] = {1,1},
+ [table.remove] = {1,2},
+ [table.sort] = {1,2},
+ [false] = nil -- trick (relies on potentially undefined behavior)
+}
+
+
+-- functions with zero or nearly zero side-effects, and with deterministic results, that may be evaluated by the analyzer.
+M.safe_function = {
+ [require] = true,
+ [rawequal] = true,
+ [rawget] = true,
+ [require] = true, -- sort of
+ [select] = true,
+ [tonumber] = true,
+ [tostring] = true,
+ [type] = true,
+ [unpack] = true,
+ [coroutine.create] = true,
+ -- [coroutine.resume]
+ [coroutine.running] = true,
+ [coroutine.status] = true,
+ [coroutine.wrap] = true,
+ --[coroutine.yield]
+ -- [debug.debug]
+ --[debug.getfenv] = true,
+ [debug.gethook] = true,
+ [debug.getinfo] = true,
+ [debug.getlocal] = true,
+ [debug.getmetatable] = true,
+ [debug.getregistry] = true,
+ [debug.getupvalue] = true,
+ -- [debug.setfenv]
+ -- [debug.sethook]
+ -- [debug.setlocal]
+ -- [debug.setmetatable]
+ -- [debug.setupvalue]
+ -- [debug.traceback] = true,
+ [io.type] = true,
+ -- skip all other io.*
+ [math.abs] = true,
+ [math.acos] = true,
+ [math.asin] = true,
+ [math.atan] = true,
+ [math.atan2] = true,
+ [math.ceil] = true,
+ [math.cos] = true,
+ [math.cosh] = true,
+ [math.deg] = true,
+ [math.exp] = true,
+ [math.floor] = true,
+ [math.fmod] = true,
+ [math.frexp] = true,
+ [math.ldexp] = true,
+ [math.log] = true,
+ [math.log10] = true,
+ [math.max] = true,
+ [math.min] = true,
+ [math.modf] = true,
+ [math.pow] = true,
+ [math.rad] = true,
+ --[math.random]
+ --[math.randomseed]
+ [math.sin] = true,
+ [math.sinh] = true,
+ [math.sqrt] = true,
+ [math.tan] = true,
+ [math.tanh] = true,
+ [os.clock] = true, -- safe but non-deterministic
+ [os.date] = true,-- safe but non-deterministic
+ [os.difftime] = true,
+ --[os.execute]
+ --[os.exit]
+ [os.getenv] = true, -- though depends on environment
+ --[os.remove]
+ --[os.rename]
+ --[os.setlocale]
+ [os.time] = true, -- safe but non-deterministic
+ --[os.tmpname]
+ [string.byte] = true,
+ [string.char] = true,
+ [string.dump] = true,
+ [string.find] = true,
+ [string.format] = true,
+ [string.gmatch] = true,
+ [string.gsub] = true,
+ [string.len] = true,
+ [string.lower] = true,
+ [string.match] = true,
+ [string.rep] = true,
+ [string.reverse] = true,
+ [string.sub] = true,
+ [string.upper] = true,
+ [table.maxn] = true,
+}
+
+M.mock_functions = {}
+
+-- TODO:IMPROVE
+local function mockfunction(func, ...)
+ local inputs = {n=0}
+ local outputs = {n=0}
+ local isoutputs
+ for i=1,select('#', ...) do
+ local v = select(i, ...)
+ if type(v) == 'table' then v = v[1] end
+ if v == 'N' or v == 'I' then v = T.number end
+ if v == '->' then
+ isoutputs = true
+ elseif isoutputs then
+ outputs[#outputs+1] = v; outputs.n = outputs.n + 1
+ else
+ inputs[#inputs+1] = v; inputs.n = inputs.n + 1
+ end
+ end
+ M.mock_functions[func] = {inputs=inputs, outputs=outputs}
+end
+
+
+mockfunction(math.abs, 'N', '->', {'N',0,math.huge})
+mockfunction(math.acos, {'N',-1,1}, '->', {'N',0,math.pi/2})
+mockfunction(math.asin, {'N',-1,1}, '->', {'N',-math.pi/2,math.pi/2})
+mockfunction(math.atan, {'N',-math.huge,math.huge}, '->',
+ {'N',-math.pi/2,math.pi/2})
+--FIX atan2
+mockfunction(math.ceil, 'N','->','I')
+mockfunction(math.cos, 'N','->',{'N',-1,1})
+mockfunction(math.cosh, 'N','->',{'N',1,math.huge})
+mockfunction(math.deg, 'N','->','N')
+mockfunction(math.exp, 'N','->',{'N',0,math.huge})
+mockfunction(math.floor, 'N','->','I')
+mockfunction(math.fmod, 'N','N','->','N')
+mockfunction(math.frexp, 'N','->',{'N',-1,1},'->','I')
+mockfunction(math.ldexp, {'N','I'},'->','N')
+mockfunction(math.log, {'N',0,math.huge},'->','N')
+mockfunction(math.log10, {'N',0,math.huge},'->','N')
+-- function max(...) print 'NOT IMPL'end
+-- function min(...) print 'NOT IMPL'end
+mockfunction(math.modf, 'N','->','I',{'N',-1,1})
+
+mockfunction(math.pow, 'N','N','->','N') -- improve?
+mockfunction(math.rad, 'N','->','N')
+-- random = function() print 'NOT IMPL' end
+mockfunction(math.randomseed, 'N')
+mockfunction(math.sin, 'N','->',{'N',-1,1})
+mockfunction(math.sinh, 'N','->','N')
+mockfunction(math.sqrt, {'N',0,math.huge},'->',{'N',0,math.huge})
+mockfunction(math.tan, 'N','->','N') -- improve?
+mockfunction(math.tanh, 'N','->',{'N',-1,1})
+
+
+return M
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/typecheck.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/typecheck.lua
new file mode 100644
index 0000000..549f8fe
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/typecheck.lua
@@ -0,0 +1,40 @@
+-- luainspect.typecheck - Type definitions used to check LuaInspect itself.
+--
+-- (c) 2010 David Manura, MIT License.
+
+local T = require "luainspect.types"
+
+local ast_mt = {__tostring = function(s) return 'AST' end}
+
+return function(context)
+ -- AST type.
+ local ast = T.table {
+ tag = T.string,
+ lineinfo=T.table{first=T.table{comments=T.table{T.table{T.string,T.number,T.number}},T.number,T.number,T.number,T.string},
+ ast=T.table{comments=T.table{T.table{T.string,T.number,T.number}},T.number,T.number,T.number,T.string}},
+ isfield=T.boolean, tag2=T.string,
+ value=T.universal, valueself=T.number, valuelist=T.table{n=T.number, isvaluepegged=T.boolean},
+ resolvedname=T.string, definedglobal=T.boolean, id=T.number, isparam=T.boolean, isset=T.boolean, isused=T.boolean,
+ isignore=T.boolean,
+ functionlevel=T.number, localmasked=T.boolean, note=T.string, nocollect=T.table{}, isdead=T.boolean}
+ -- FIX: some of these are "boolean or nil" actually
+ ast.localdefinition=ast; ast.localmasking = ast
+ ast.previous = ast; ast.parent = ast
+ ast.seevalue = ast; ast.seenote=ast
+ setmetatable(ast, ast_mt)
+
+ ast[1] = ast; ast[2] = ast
+ context.apply_value('ast$', ast)
+
+ -- Token type.
+ context.apply_value('token$', T.table{
+ tag=T.string, fpos=T.number, lpos=T.number, keywordid=T.number, ast=ast, [1]=T.string
+ })
+
+ -- Lua source code string type.
+ context.apply_value('src$', '')
+
+ -- SciTE syler object type.
+ local nf = function()end
+ context.apply_value('^styler$', T.table{SetState=nf, More=nf, Current=nf, Forward=nf, StartStyling=nf, EndStyling=nf, language=T.string})
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/types.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/types.lua
new file mode 100644
index 0000000..7994eb0
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/luainspect/types.lua
@@ -0,0 +1,130 @@
+local T = {} -- types
+
+-- istype[o] iff o represents a type (i.e. set of values)
+T.istype = {}
+
+-- iserror[o] iff o represents an error type (created via T.error).
+T.iserror = {}
+
+-- istabletype[o] iff o represents a table type (created by T.table).
+T.istabletype = {}
+
+-- Number type
+T.number = {}
+setmetatable(T.number, T.number)
+function T.number.__tostring(self)
+ return 'number'
+end
+T.istype[T.number] = true
+
+-- String type
+T.string = {}
+setmetatable(T.string, T.string)
+function T.string.__tostring(self)
+ return 'string'
+end
+T.istype[T.string] = true
+
+-- Boolean type
+T.boolean = {}
+setmetatable(T.boolean, T.boolean)
+function T.boolean.__tostring(self)
+ return 'boolean'
+end
+T.istype[T.boolean] = true
+
+-- Table type
+function T.table(t)
+ T.istype[t] = true
+ T.istabletype[t] = true
+ return t
+end
+
+-- Universal type. This is a superset of all other types.
+T.universal = {}
+setmetatable(T.universal, T.universal)
+function T.universal.__tostring(self)
+ return 'unknown'
+end
+T.istype[T.universal] = true
+
+-- nil type. Represents `nil` but can be stored in tables.
+T['nil'] = {}
+setmetatable(T['nil'], T['nil'])
+T['nil'].__tostring = function(self)
+ return 'nil'
+end
+T.istype[T['nil']] = true
+
+-- None type. Represents a non-existent value, in a similar way
+-- that `none` is used differently from `nil` in the Lua C API.
+T.none = {}
+setmetatable(T.none, T.none)
+function T.none.__tostring(self)
+ return 'none'
+end
+T.istype[T.none] = true
+
+-- Error type
+local CError = {}; CError.__index = CError
+function CError.__tostring(self) return "error:" .. tostring(self.value) end
+function T.error(val)
+ local self = setmetatable({value=val}, CError)
+ T.istype[self] = true
+ T.iserror[self] = true
+ return self
+end
+
+
+-- Gets a type that is a superset of the two given types.
+function T.superset_types(a, b)
+ if T.iserror[a] then return a end
+ if T.iserror[b] then return b end
+ if rawequal(a, b) then -- note: including nil == nil
+ return a
+ elseif type(a) == 'string' or a == T.string then
+ if type(b) == 'string' or b == T.string then
+ return T.string
+ else
+ return T.universal
+ end
+ elseif type(a) == 'number' or a == T.number then
+ if type(b) == 'number' or b == T.number then
+ return T.number
+ else
+ return T.universal
+ end
+ elseif type(a) == 'boolean' or a == T.boolean then
+ if type(b) == 'boolean' or b == T.boolean then
+ return T.boolean
+ else
+ return T.universal
+ end
+ else
+ return T.universal -- IMPROVE
+ end
+end
+--[[TESTS:
+assert(T.superset_types(2, 2) == 2)
+assert(T.superset_types(2, 3) == T.number)
+assert(T.superset_types(2, T.number) == T.number)
+assert(T.superset_types(T.number, T.string) == T.universal)
+print 'DONE'
+--]]
+
+-- Determines whether type `o` certainly evaluates to true (true),
+-- certainly evaluates to false (false) or could evaluate to either
+-- true of false ('?').
+function T.boolean_cast(o)
+ if T.iserror[o] then -- special case
+ return '?'
+ elseif o == nil or o == false or o == T['nil'] then -- all subsets of {nil, false}
+ return false
+ elseif o == T.universal or o == T.boolean then -- all supersets of boolean
+ return '?'
+ else -- all subsets of universal - {nil, false}
+ return true
+ end
+end
+
+return T
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler.lua
new file mode 100644
index 0000000..e534cf4
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler.lua
@@ -0,0 +1,162 @@
+---------------------------------------------------------------------------
+-- Copyright (c) 2006-2013 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+--------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+--
+-- Convert between various code representation formats. Atomic
+-- converters are written in extenso, others are composed automatically
+-- by chaining the atomic ones together in a closure.
+--
+-- Supported formats are:
+--
+-- * srcfile: the name of a file containing sources.
+-- * src: these sources as a single string.
+-- * lexstream: a stream of lexemes.
+-- * ast: an abstract syntax tree.
+-- * proto: a (Yueliang) struture containing a high level
+-- representation of bytecode. Largely based on the
+-- Proto structure in Lua's VM
+-- * bytecode: a string dump of the function, as taken by
+-- loadstring() and produced by string.dump().
+-- * function: an executable lua function in RAM.
+--
+--------------------------------------------------------------------------------
+
+require 'checks'
+
+local M = { }
+
+--------------------------------------------------------------------------------
+-- Order of the transformations. if 'a' is on the left of 'b', then a 'a' can
+-- be transformed into a 'b' (but not the other way around).
+-- M.sequence goes for numbers to format names, M.order goes from format
+-- names to numbers.
+--------------------------------------------------------------------------------
+M.sequence = {
+ 'srcfile', 'src', 'lexstream', 'ast', 'proto', 'bytecode', 'function' }
+
+local arg_types = {
+ srcfile = { 'string', '?string' },
+ src = { 'string', '?string' },
+ lexstream = { 'lexer.stream', '?string' },
+ ast = { 'table', '?string' },
+ proto = { 'table', '?string' },
+ bytecode = { 'string', '?string' },
+}
+
+M.order= { }; for a,b in pairs(M.sequence) do M.order[b]=a end
+
+local CONV = { } -- conversion metatable __index
+
+function CONV :srcfile_to_src(x, name)
+ checks('metalua.compiler', 'string', '?string')
+ name = name or '@'..x
+ local f, msg = io.open (x, 'rb')
+ if not f then error(msg) end
+ local r, msg = f :read '*a'
+ if not r then error("Cannot read file '"..x.."': "..msg) end
+ f :close()
+ return r, name
+end
+
+function CONV :src_to_lexstream(src, name)
+ checks('metalua.compiler', 'string', '?string')
+ local r = self.parser.lexer :newstream (src, name)
+ return r, name
+end
+
+function CONV :lexstream_to_ast(lx, name)
+ checks('metalua.compiler', 'lexer.stream', '?string')
+ local r = self.parser.chunk(lx)
+ r.source = name
+ return r, name
+end
+
+local bytecode_compiler = nil -- cache to avoid repeated `pcall(require(...))`
+local function get_bytecode_compiler()
+ if bytecode_compiler then return bytecode_compiler else
+ local status, result = pcall(require, 'metalua.compiler.bytecode')
+ if status then
+ bytecode_compiler = result
+ return result
+ elseif string.match(result, "not found") then
+ error "Compilation only available with full Metalua"
+ else error (result) end
+ end
+end
+
+function CONV :ast_to_proto(ast, name)
+ checks('metalua.compiler', 'table', '?string')
+ return get_bytecode_compiler().ast_to_proto(ast, name), name
+end
+
+function CONV :proto_to_bytecode(proto, name)
+ return get_bytecode_compiler().proto_to_bytecode(proto), name
+end
+
+function CONV :bytecode_to_function(bc, name)
+ checks('metalua.compiler', 'string', '?string')
+ return loadstring(bc, name)
+end
+
+-- Create all sensible combinations
+for i=1,#M.sequence do
+ local src = M.sequence[i]
+ for j=i+2, #M.sequence do
+ local dst = M.sequence[j]
+ local dst_name = src.."_to_"..dst
+ local my_arg_types = arg_types[src]
+ local functions = { }
+ for k=i, j-1 do
+ local name = M.sequence[k].."_to_"..M.sequence[k+1]
+ local f = assert(CONV[name], name)
+ table.insert (functions, f)
+ end
+ CONV[dst_name] = function(self, a, b)
+ checks('metalua.compiler', unpack(my_arg_types))
+ for _, f in ipairs(functions) do
+ a, b = f(self, a, b)
+ end
+ return a, b
+ end
+ --printf("Created M.%s out of %s", dst_name, table.concat(n, ', '))
+ end
+end
+
+
+--------------------------------------------------------------------------------
+-- This one goes in the "wrong" direction, cannot be composed.
+--------------------------------------------------------------------------------
+function CONV :function_to_bytecode(...) return string.dump(...) end
+
+function CONV :ast_to_src(...)
+ require 'metalua.loader' -- ast_to_string isn't written in plain lua
+ return require 'metalua.compiler.ast_to_src' (...)
+end
+
+local MT = { __index=CONV, __type='metalua.compiler' }
+
+function M.new()
+ local parser = require 'metalua.compiler.parser' .new()
+ local self = { parser = parser }
+ setmetatable(self, MT)
+ return self
+end
+
+return M \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser.lua
new file mode 100644
index 0000000..74997ae
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser.lua
@@ -0,0 +1,42 @@
+--------------------------------------------------------------------------------
+-- Copyright (c) 2006-2013 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+--------------------------------------------------------------------------------
+
+-- Export all public APIs from sub-modules, squashed into a flat spacename
+
+local MT = { __type='metalua.compiler.parser' }
+
+local MODULE_REL_NAMES = { "annot.grammar", "expr", "meta", "misc",
+ "stat", "table", "ext" }
+
+local function new()
+ local M = {
+ lexer = require "metalua.compiler.parser.lexer" ();
+ extensions = { } }
+ for _, rel_name in ipairs(MODULE_REL_NAMES) do
+ local abs_name = "metalua.compiler.parser."..rel_name
+ local extender = require (abs_name)
+ if not M.extensions[abs_name] then
+ if type (extender) == 'function' then extender(M) end
+ M.extensions[abs_name] = extender
+ end
+ end
+ return setmetatable(M, MT)
+end
+
+return { new = new }
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/annot/generator.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/annot/generator.lua
new file mode 100644
index 0000000..a8fcd62
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/annot/generator.lua
@@ -0,0 +1,48 @@
+--------------------------------------------------------------------------------
+-- Copyright (c) 2006-2013 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+--------------------------------------------------------------------------------
+
+require 'checks'
+local gg = require 'metalua.grammar.generator'
+local M = { }
+
+function M.opt(mlc, primary, a_type)
+ checks('table', 'table|function', 'string')
+ return gg.sequence{
+ primary,
+ gg.onkeyword{ "#", function() return assert(mlc.annot[a_type]) end },
+ builder = function(x)
+ local t, annot = unpack(x)
+ return annot and { tag='Annot', t, annot } or t
+ end }
+end
+
+-- split a list of "foo" and "`Annot{foo, annot}" into a list of "foo"
+-- and a list of "annot".
+-- No annot list is returned if none of the elements were annotated.
+function M.split(lst)
+ local x, a, some = { }, { }, false
+ for i, p in ipairs(lst) do
+ if p.tag=='Annot' then
+ some, x[i], a[i] = true, unpack(p)
+ else x[i] = p end
+ end
+ if some then return x, a else return lst end
+end
+
+return M
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/annot/grammar.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/annot/grammar.lua
new file mode 100644
index 0000000..7ce3ec4
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/annot/grammar.lua
@@ -0,0 +1,112 @@
+--------------------------------------------------------------------------------
+-- Copyright (c) 2006-2013 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+--------------------------------------------------------------------------------
+
+local gg = require 'metalua.grammar.generator'
+
+return function(M)
+ local _M = gg.future(M)
+ M.lexer :add '->'
+ local A = { }
+ local _A = gg.future(A)
+ M.annot = A
+
+ -- Type identifier: Lua keywords such as `"nil"` allowed.
+ function M.annot.tid(lx)
+ local w = lx :next()
+ local t = w.tag
+ if t=='Keyword' and w[1] :match '^[%a_][%w_]*$' or w.tag=='Id'
+ then return {tag='TId'; lineinfo=w.lineinfo; w[1]}
+ else return gg.parse_error (lx, 'tid expected') end
+ end
+
+ local field_types = { var='TVar'; const='TConst';
+ currently='TCurrently'; field='TField' }
+
+ -- TODO check lineinfo
+ function M.annot.tf(lx)
+ local tk = lx:next()
+ local w = tk[1]
+ local tag = field_types[w]
+ if not tag then error ('Invalid field type '..w)
+ elseif tag=='TField' then return {tag='TField'} else
+ local te = M.te(lx)
+ return {tag=tag; te}
+ end
+ end
+
+ M.annot.tebar_content = gg.list{
+ name = 'tebar content',
+ primary = _A.te,
+ separators = { ",", ";" },
+ terminators = ")" }
+
+ M.annot.tebar = gg.multisequence{
+ name = 'annot.tebar',
+ --{ '*', builder = 'TDynbar' }, -- maybe not user-available
+ { '(', _A.tebar_content, ')',
+ builder = function(x) return x[1] end },
+ { _A.te }
+ }
+
+ M.annot.te = gg.multisequence{
+ name = 'annot.te',
+ { _A.tid, builder=function(x) return x[1] end },
+ { '*', builder = 'TDyn' },
+ { "[",
+ gg.list{
+ primary = gg.sequence{
+ _M.expr, "=", _A.tf,
+ builder = 'TPair'
+ },
+ separators = { ",", ";" },
+ terminators = { "]", "|" } },
+ gg.onkeyword{ "|", _A.tf },
+ "]",
+ builder = function(x)
+ local fields, other = unpack(x)
+ return { tag='TTable', other or {tag='TField'}, fields }
+ end }, -- "[ ... ]"
+ { '(', _A.tebar_content, ')', '->', '(', _A.tebar_content, ')',
+ builder = function(x)
+ local p, r = unpack(x)
+ return {tag='TFunction', p, r }
+ end } }
+
+ M.annot.ts = gg.multisequence{
+ name = 'annot.ts',
+ { 'return', _A.tebar_content, builder='TReturn' },
+ { _A.tid, builder = function(x)
+ if x[1][1]=='pass' then return {tag='TPass'}
+ else error "Bad statement type" end
+ end } }
+
+-- TODO: add parsers for statements:
+-- #return tebar
+-- #alias = te
+-- #ell = tf
+--[[
+ M.annot.stat_annot = gg.sequence{
+ gg.list{ primary=_A.tid, separators='.' },
+ '=',
+ XXX??,
+ builder = 'Annot' }
+--]]
+
+ return M.annot
+end \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/common.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/common.lua
new file mode 100644
index 0000000..1d6290e
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/common.lua
@@ -0,0 +1,27 @@
+--------------------------------------------------------------------------------
+-- Copyright (c) 2006-2013 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+--------------------------------------------------------------------------------
+
+-- Shared common parser table. It will be filled by parser.init(),
+-- and every other module will be able to call its elements at runtime.
+--
+-- If the table was directly created in parser.init, a circular
+-- dependency would be created: parser.init depends on other modules to fill the table,
+-- so other modules can't simultaneously depend on it.
+
+return { } \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/expr.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/expr.lua
new file mode 100644
index 0000000..b162e8a
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/expr.lua
@@ -0,0 +1,213 @@
+-------------------------------------------------------------------------------
+-- Copyright (c) 2006-2013 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+-------------------------------------------------------------------------------
+
+-------------------------------------------------------------------------------
+--
+-- Exported API:
+-- * [mlp.expr()]
+-- * [mlp.expr_list()]
+-- * [mlp.func_val()]
+--
+-------------------------------------------------------------------------------
+
+local pp = require 'metalua.pprint'
+local gg = require 'metalua.grammar.generator'
+local annot = require 'metalua.compiler.parser.annot.generator'
+
+return function(M)
+ local _M = gg.future(M)
+ local _table = gg.future(M, 'table')
+ local _meta = gg.future(M, 'meta') -- TODO move to ext?
+ local _annot = gg.future(M, 'annot') -- TODO move to annot
+
+ --------------------------------------------------------------------------------
+ -- Non-empty expression list. Actually, this isn't used here, but that's
+ -- handy to give to users.
+ --------------------------------------------------------------------------------
+ M.expr_list = gg.list{ primary=_M.expr, separators="," }
+
+ --------------------------------------------------------------------------------
+ -- Helpers for function applications / method applications
+ --------------------------------------------------------------------------------
+ M.func_args_content = gg.list{
+ name = "function arguments",
+ primary = _M.expr,
+ separators = ",",
+ terminators = ")" }
+
+ -- Used to parse methods
+ M.method_args = gg.multisequence{
+ name = "function argument(s)",
+ { "{", _table.content, "}" },
+ { "(", _M.func_args_content, ")", builder = unpack },
+ { "+{", _meta.quote_content, "}" },
+ -- TODO lineinfo?
+ function(lx) local r = M.opt_string(lx); return r and {r} or { } end }
+
+ --------------------------------------------------------------------------------
+ -- [func_val] parses a function, from opening parameters parenthese to
+ -- "end" keyword included. Used for anonymous functions as well as
+ -- function declaration statements (both local and global).
+ --
+ -- It's wrapped in a [_func_val] eta expansion, so that when expr
+ -- parser uses the latter, they will notice updates of [func_val]
+ -- definitions.
+ --------------------------------------------------------------------------------
+ M.func_params_content = gg.list{
+ name="function parameters",
+ gg.multisequence{ { "...", builder = "Dots" }, annot.opt(M, _M.id, 'te') },
+ separators = ",", terminators = {")", "|"} }
+
+ -- TODO move to annot
+ M.func_val = gg.sequence{
+ name = "function body",
+ "(", _M.func_params_content, ")", _M.block, "end",
+ builder = function(x)
+ local params, body = unpack(x)
+ local annots, some = { }, false
+ for i, p in ipairs(params) do
+ if p.tag=='Annot' then
+ params[i], annots[i], some = p[1], p[2], true
+ else annots[i] = false end
+ end
+ if some then return { tag='Function', params, body, annots }
+ else return { tag='Function', params, body } end
+ end }
+
+ local func_val = function(lx) return M.func_val(lx) end
+
+ --------------------------------------------------------------------------------
+ -- Default parser for primary expressions
+ --------------------------------------------------------------------------------
+ function M.id_or_literal (lx)
+ local a = lx:next()
+ if a.tag~="Id" and a.tag~="String" and a.tag~="Number" then
+ local msg
+ if a.tag=='Eof' then
+ msg = "End of file reached when an expression was expected"
+ elseif a.tag=='Keyword' then
+ msg = "An expression was expected, and `"..a[1]..
+ "' can't start an expression"
+ else
+ msg = "Unexpected expr token " .. pp.tostring (a)
+ end
+ gg.parse_error (lx, msg)
+ end
+ return a
+ end
+
+
+ --------------------------------------------------------------------------------
+ -- Builder generator for operators. Wouldn't be worth it if "|x|" notation
+ -- were allowed, but then lua 5.1 wouldn't compile it
+ --------------------------------------------------------------------------------
+
+ -- opf1 = |op| |_,a| `Op{ op, a }
+ local function opf1 (op) return
+ function (_,a) return { tag="Op", op, a } end end
+
+ -- opf2 = |op| |a,_,b| `Op{ op, a, b }
+ local function opf2 (op) return
+ function (a,_,b) return { tag="Op", op, a, b } end end
+
+ -- opf2r = |op| |a,_,b| `Op{ op, b, a } -- (args reversed)
+ local function opf2r (op) return
+ function (a,_,b) return { tag="Op", op, b, a } end end
+
+ local function op_ne(a, _, b)
+ -- This version allows to remove the "ne" operator from the AST definition.
+ -- However, it doesn't always produce the exact same bytecode as Lua 5.1.
+ return { tag="Op", "not",
+ { tag="Op", "eq", a, b, lineinfo= {
+ first = a.lineinfo.first, last = b.lineinfo.last } } }
+ end
+
+
+ --------------------------------------------------------------------------------
+ --
+ -- complete expression
+ --
+ --------------------------------------------------------------------------------
+
+ -- FIXME: set line number. In [expr] transformers probably
+ M.expr = gg.expr {
+ name = "expression",
+ primary = gg.multisequence{
+ name = "expr primary",
+ { "(", _M.expr, ")", builder = "Paren" },
+ { "function", _M.func_val, builder = unpack },
+ { "-{", _meta.splice_content, "}", builder = unpack },
+ { "+{", _meta.quote_content, "}", builder = unpack },
+ { "nil", builder = "Nil" },
+ { "true", builder = "True" },
+ { "false", builder = "False" },
+ { "...", builder = "Dots" },
+ { "{", _table.content, "}", builder = unpack },
+ _M.id_or_literal },
+
+ infix = {
+ name = "expr infix op",
+ { "+", prec = 60, builder = opf2 "add" },
+ { "-", prec = 60, builder = opf2 "sub" },
+ { "*", prec = 70, builder = opf2 "mul" },
+ { "/", prec = 70, builder = opf2 "div" },
+ { "%", prec = 70, builder = opf2 "mod" },
+ { "^", prec = 90, builder = opf2 "pow", assoc = "right" },
+ { "//", prec = 70, builder = opf2 "idiv" },
+ { "&", prec = 36, builder = opf2 "band" },
+ { "|", prec = 32, builder = opf2 "bor" },
+ { "~", prec = 34, builder = opf2 "bxor" },
+ { "<<", prec = 38, builder = opf2 "shl" },
+ { ">>", prec = 38, builder = opf2 "shr" },
+ { "..", prec = 40, builder = opf2 "concat", assoc = "right" },
+ { "==", prec = 30, builder = opf2 "eq" },
+ { "~=", prec = 30, builder = op_ne },
+ { "<", prec = 30, builder = opf2 "lt" },
+ { "<=", prec = 30, builder = opf2 "le" },
+ { ">", prec = 30, builder = opf2r "lt" },
+ { ">=", prec = 30, builder = opf2r "le" },
+ { "and",prec = 20, builder = opf2 "and" },
+ { "or", prec = 10, builder = opf2 "or" } },
+
+ prefix = {
+ name = "expr prefix op",
+ { "not", prec = 80, builder = opf1 "not" },
+ { "#", prec = 80, builder = opf1 "len" },
+ { "~", prec = 80, builder = opf2 "bnot" },
+ { "-", prec = 80, builder = opf1 "unm" } },
+
+ suffix = {
+ name = "expr suffix op",
+ { "[", _M.expr, "]", builder = function (tab, idx)
+ return {tag="Index", tab, idx[1]} end},
+ { ".", _M.id, builder = function (tab, field)
+ return {tag="Index", tab, _M.id2string(field[1])} end },
+ { "(", _M.func_args_content, ")", builder = function(f, args)
+ return {tag="Call", f, unpack(args[1])} end },
+ { "{", _table.content, "}", builder = function (f, arg)
+ return {tag="Call", f, arg[1]} end},
+ { ":", _M.id, _M.method_args, builder = function (obj, post)
+ local m_name, args = unpack(post)
+ return {tag="Invoke", obj, _M.id2string(m_name), unpack(args)} end},
+ { "+{", _meta.quote_content, "}", builder = function (f, arg)
+ return {tag="Call", f, arg[1] } end },
+ default = { name="opt_string_arg", parse = _M.opt_string, builder = function(f, arg)
+ return {tag="Call", f, arg } end } } }
+ return M
+end \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/ext.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/ext.lua
new file mode 100644
index 0000000..4e9d395
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/ext.lua
@@ -0,0 +1,96 @@
+-------------------------------------------------------------------------------
+-- Copyright (c) 2006-2013 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+-------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+--
+-- Non-Lua syntax extensions
+--
+--------------------------------------------------------------------------------
+
+local gg = require 'metalua.grammar.generator'
+
+return function(M)
+
+ local _M = gg.future(M)
+
+ ---------------------------------------------------------------------------
+ -- Algebraic Datatypes
+ ----------------------------------------------------------------------------
+ local function adt (lx)
+ local node = _M.id (lx)
+ local tagval = node[1]
+ -- tagkey = `Pair{ `String "key", `String{ -{tagval} } }
+ local tagkey = { tag="Pair", {tag="String", "tag"}, {tag="String", tagval} }
+ if lx:peek().tag == "String" or lx:peek().tag == "Number" then
+ -- TODO support boolean litterals
+ return { tag="Table", tagkey, lx:next() }
+ elseif lx:is_keyword (lx:peek(), "{") then
+ local x = M.table.table (lx)
+ table.insert (x, 1, tagkey)
+ return x
+ else return { tag="Table", tagkey } end
+ end
+
+ M.adt = gg.sequence{ "`", adt, builder = unpack }
+
+ M.expr.primary :add(M.adt)
+
+ ----------------------------------------------------------------------------
+ -- Anonymous lambda
+ ----------------------------------------------------------------------------
+ M.lambda_expr = gg.sequence{
+ "|", _M.func_params_content, "|", _M.expr,
+ builder = function (x)
+ local li = x[2].lineinfo
+ return { tag="Function", x[1],
+ { {tag="Return", x[2], lineinfo=li }, lineinfo=li } }
+ end }
+
+ M.expr.primary :add (M.lambda_expr)
+
+ --------------------------------------------------------------------------------
+ -- Allows to write "a `f` b" instead of "f(a, b)". Taken from Haskell.
+ --------------------------------------------------------------------------------
+ function M.expr_in_backquotes (lx) return M.expr(lx, 35) end -- 35=limited precedence
+ M.expr.infix :add{ name = "infix function",
+ "`", _M.expr_in_backquotes, "`", prec = 35, assoc="left",
+ builder = function(a, op, b) return {tag="Call", op[1], a, b} end }
+
+ --------------------------------------------------------------------------------
+ -- C-style op+assignments
+ -- TODO: no protection against side-effects in LHS vars.
+ --------------------------------------------------------------------------------
+ local function op_assign(kw, op)
+ local function rhs(a, b) return { tag="Op", op, a, b } end
+ local function f(a,b)
+ if #a ~= #b then gg.parse_error "assymetric operator+assignment" end
+ local right = { }
+ local r = { tag="Set", a, right }
+ for i=1, #a do right[i] = { tag="Op", op, a[i], b[i] } end
+ return r
+ end
+ M.lexer :add (kw)
+ M.assignments[kw] = f
+ end
+
+ local ops = { add='+='; sub='-='; mul='*='; div='/=' }
+ for ast_op_name, keyword in pairs(ops) do op_assign(keyword, ast_op_name) end
+
+ return M
+end \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/lexer.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/lexer.lua
new file mode 100644
index 0000000..024c479
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/lexer.lua
@@ -0,0 +1,44 @@
+--------------------------------------------------------------------------------
+-- Copyright (c) 2006-2014 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+--------------------------------------------------------------------------------
+
+----------------------------------------------------------------------
+-- Generate a new lua-specific lexer, derived from the generic lexer.
+----------------------------------------------------------------------
+
+local generic_lexer = require 'metalua.grammar.lexer'
+
+return function()
+ local lexer = generic_lexer.lexer :clone()
+
+ local keywords = {
+ "and", "break", "do", "else", "elseif",
+ "end", "false", "for", "function",
+ "goto", -- Lua5.2
+ "if",
+ "in", "local", "nil", "not", "or", "repeat",
+ "return", "then", "true", "until", "while",
+ "...", "..", "==", ">=", "<=", "~=",
+ "<<", ">>", "//", -- Lua5.3
+ "::", -- Lua5.2
+ "+{", "-{" } -- Metalua
+
+ for _, w in ipairs(keywords) do lexer :add (w) end
+
+ return lexer
+end \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/meta.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/meta.lua
new file mode 100644
index 0000000..71eb3c3
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/meta.lua
@@ -0,0 +1,138 @@
+-------------------------------------------------------------------------------
+-- Copyright (c) 2006-2014 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+-------------------------------------------------------------------------------
+
+-- Compile-time metaprogramming features: splicing ASTs generated during compilation,
+-- AST quasi-quoting helpers.
+
+local gg = require 'metalua.grammar.generator'
+
+return function(M)
+ local _M = gg.future(M)
+ M.meta={ }
+ local _MM = gg.future(M.meta)
+
+ --------------------------------------------------------------------------------
+ -- External splicing: compile an AST into a chunk, load and evaluate
+ -- that chunk, and replace the chunk by its result (which must also be
+ -- an AST).
+ --------------------------------------------------------------------------------
+
+ -- TODO: that's not part of the parser
+ function M.meta.eval (ast)
+ -- TODO: should there be one mlc per splice, or per parser instance?
+ local mlc = require 'metalua.compiler'.new()
+ local f = mlc :ast_to_function (ast, '=splice')
+ local result=f(M) -- splices act on the current parser
+ return result
+ end
+
+ ----------------------------------------------------------------------------
+ -- Going from an AST to an AST representing that AST
+ -- the only hash-part key being lifted is `"tag"`.
+ -- Doesn't lift subtrees protected inside a `Splice{ ... }.
+ -- e.g. change `Foo{ 123 } into
+ -- `Table{ `Pair{ `String "tag", `String "foo" }, `Number 123 }
+ ----------------------------------------------------------------------------
+ local function lift (t)
+ --print("QUOTING:", table.tostring(t, 60,'nohash'))
+ local cases = { }
+ function cases.table (t)
+ local mt = { tag = "Table" }
+ --table.insert (mt, { tag = "Pair", quote "quote", { tag = "True" } })
+ if t.tag == "Splice" then
+ assert (#t==1, "Invalid splice")
+ local sp = t[1]
+ return sp
+ elseif t.tag then
+ table.insert (mt, { tag="Pair", lift "tag", lift(t.tag) })
+ end
+ for _, v in ipairs (t) do
+ table.insert (mt, lift(v))
+ end
+ return mt
+ end
+ function cases.number (t) return { tag = "Number", t, quote = true } end
+ function cases.string (t) return { tag = "String", t, quote = true } end
+ function cases.boolean (t) return { tag = t and "True" or "False", t, quote = true } end
+ local f = cases [type(t)]
+ if f then return f(t) else error ("Cannot quote an AST containing "..tostring(t)) end
+ end
+ M.meta.lift = lift
+
+ --------------------------------------------------------------------------------
+ -- when this variable is false, code inside [-{...}] is compiled and
+ -- avaluated immediately. When it's true (supposedly when we're
+ -- parsing data inside a quasiquote), [-{foo}] is replaced by
+ -- [`Splice{foo}], which will be unpacked by [quote()].
+ --------------------------------------------------------------------------------
+ local in_a_quote = false
+
+ --------------------------------------------------------------------------------
+ -- Parse the inside of a "-{ ... }"
+ --------------------------------------------------------------------------------
+ function M.meta.splice_content (lx)
+ local parser_name = "expr"
+ if lx:is_keyword (lx:peek(2), ":") then
+ local a = lx:next()
+ lx:next() -- skip ":"
+ assert (a.tag=="Id", "Invalid splice parser name")
+ parser_name = a[1]
+ end
+ -- TODO FIXME running a new parser with the old lexer?!
+ local parser = require 'metalua.compiler.parser'.new()
+ local ast = parser [parser_name](lx)
+ if in_a_quote then -- only prevent quotation in this subtree
+ --printf("SPLICE_IN_QUOTE:\n%s", _G.table.tostring(ast, "nohash", 60))
+ return { tag="Splice", ast }
+ else -- convert in a block, eval, replace with result
+ if parser_name == "expr" then ast = { { tag="Return", ast } }
+ elseif parser_name == "stat" then ast = { ast }
+ elseif parser_name ~= "block" then
+ error ("splice content must be an expr, stat or block") end
+ --printf("EXEC THIS SPLICE:\n%s", _G.table.tostring(ast, "nohash", 60))
+ return M.meta.eval (ast)
+ end
+ end
+
+ M.meta.splice = gg.sequence{ "-{", _MM.splice_content, "}", builder=unpack }
+
+ --------------------------------------------------------------------------------
+ -- Parse the inside of a "+{ ... }"
+ --------------------------------------------------------------------------------
+ function M.meta.quote_content (lx)
+ local parser
+ if lx:is_keyword (lx:peek(2), ":") then -- +{parser: content }
+ local parser_name = M.id(lx)[1]
+ parser = M[parser_name]
+ lx:next() -- skip ":"
+ else -- +{ content }
+ parser = M.expr
+ end
+
+ local prev_iq = in_a_quote
+ in_a_quote = true
+ --print("IN_A_QUOTE")
+ local content = parser (lx)
+ local q_content = M.meta.lift (content)
+ in_a_quote = prev_iq
+ return q_content
+ end
+
+ return M
+end \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/misc.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/misc.lua
new file mode 100644
index 0000000..22a63f4
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/misc.lua
@@ -0,0 +1,147 @@
+-------------------------------------------------------------------------------
+-- Copyright (c) 2006-2013 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+-------------------------------------------------------------------------------
+
+-------------------------------------------------------------------------------
+--
+-- Summary: metalua parser, miscellaneous utility functions.
+--
+-------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+--
+-- Exported API:
+-- * [mlp.fget()]
+-- * [mlp.id()]
+-- * [mlp.opt_id()]
+-- * [mlp.id_list()]
+-- * [mlp.string()]
+-- * [mlp.opt_string()]
+-- * [mlp.id2string()]
+--
+--------------------------------------------------------------------------------
+
+local gg = require 'metalua.grammar.generator'
+
+-- TODO: replace splice-aware versions with naive ones, move etensions in ./meta
+
+return function(M)
+ local _M = gg.future(M)
+
+
+ --------------------------------------------------------------------------------
+ -- Try to read an identifier (possibly as a splice), or return [false] if no
+ -- id is found.
+ --------------------------------------------------------------------------------
+ function M.opt_id (lx)
+ local a = lx:peek();
+ if lx:is_keyword (a, "-{") then
+ local v = M.meta.splice(lx)
+ if v.tag ~= "Id" and v.tag ~= "Splice" then
+ gg.parse_error(lx, "Bad id splice")
+ end
+ return v
+ elseif a.tag == "Id" then return lx:next()
+ else return false end
+ end
+
+ --------------------------------------------------------------------------------
+ -- Mandatory reading of an id: causes an error if it can't read one.
+ --------------------------------------------------------------------------------
+ function M.id (lx)
+ return M.opt_id (lx) or gg.parse_error(lx,"Identifier expected")
+ end
+
+ --------------------------------------------------------------------------------
+ -- Common helper function
+ --------------------------------------------------------------------------------
+ M.id_list = gg.list { primary = _M.id, separators = "," }
+
+ --------------------------------------------------------------------------------
+ -- Converts an identifier into a string. Hopefully one day it'll handle
+ -- splices gracefully, but that proves quite tricky.
+ --------------------------------------------------------------------------------
+ function M.id2string (id)
+ --print("id2string:", disp.ast(id))
+ if id.tag == "Id" then id.tag = "String"; return id
+ elseif id.tag == "Splice" then
+ error ("id2string on splice not implemented")
+ -- Evaluating id[1] will produce `Id{ xxx },
+ -- and we want it to produce `String{ xxx }.
+ -- The following is the plain notation of:
+ -- +{ `String{ `Index{ `Splice{ -{id[1]} }, `Number 1 } } }
+ return { tag="String", { tag="Index", { tag="Splice", id[1] },
+ { tag="Number", 1 } } }
+ else error ("Identifier expected: "..table.tostring(id, 'nohash')) end
+ end
+
+ --------------------------------------------------------------------------------
+ -- Read a string, possibly spliced, or return an error if it can't
+ --------------------------------------------------------------------------------
+ function M.string (lx)
+ local a = lx:peek()
+ if lx:is_keyword (a, "-{") then
+ local v = M.meta.splice(lx)
+ if v.tag ~= "String" and v.tag ~= "Splice" then
+ gg.parse_error(lx,"Bad string splice")
+ end
+ return v
+ elseif a.tag == "String" then return lx:next()
+ else error "String expected" end
+ end
+
+ --------------------------------------------------------------------------------
+ -- Try to read a string, or return false if it can't. No splice allowed.
+ --------------------------------------------------------------------------------
+ function M.opt_string (lx)
+ return lx:peek().tag == "String" and lx:next()
+ end
+
+ --------------------------------------------------------------------------------
+ -- Chunk reader: block + Eof
+ --------------------------------------------------------------------------------
+ function M.skip_initial_sharp_comment (lx)
+ -- Dirty hack: I'm happily fondling lexer's private parts
+ -- FIXME: redundant with lexer:newstream()
+ lx :sync()
+ local i = lx.src:match ("^#.-\n()", lx.i)
+ if i then
+ lx.i = i
+ lx.column_offset = i
+ lx.line = lx.line and lx.line + 1 or 1
+ end
+ end
+
+ local function chunk (lx)
+ if lx:peek().tag == 'Eof' then
+ return { } -- handle empty files
+ else
+ M.skip_initial_sharp_comment (lx)
+ local chunk = M.block (lx)
+ if lx:peek().tag ~= "Eof" then
+ gg.parse_error(lx, "End-of-file expected")
+ end
+ return chunk
+ end
+ end
+
+ -- chunk is wrapped in a sequence so that it has a "transformer" field.
+ M.chunk = gg.sequence { chunk, builder = unpack }
+
+ return M
+end \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/stat.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/stat.lua
new file mode 100644
index 0000000..f7abb7b
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/stat.lua
@@ -0,0 +1,283 @@
+------------------------------------------------------------------------------
+-- Copyright (c) 2006-2013 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+-------------------------------------------------------------------------------
+
+-------------------------------------------------------------------------------
+--
+-- Summary: metalua parser, statement/block parser. This is part of the
+-- definition of module [mlp].
+--
+-------------------------------------------------------------------------------
+
+-------------------------------------------------------------------------------
+--
+-- Exports API:
+-- * [mlp.stat()]
+-- * [mlp.block()]
+-- * [mlp.for_header()]
+--
+-------------------------------------------------------------------------------
+
+local lexer = require 'metalua.grammar.lexer'
+local gg = require 'metalua.grammar.generator'
+
+local annot = require 'metalua.compiler.parser.annot.generator'
+
+--------------------------------------------------------------------------------
+-- List of all keywords that indicate the end of a statement block. Users are
+-- likely to extend this list when designing extensions.
+--------------------------------------------------------------------------------
+
+
+return function(M)
+ local _M = gg.future(M)
+
+ M.block_terminators = { "else", "elseif", "end", "until", ")", "}", "]" }
+
+ -- FIXME: this must be handled from within GG!!!
+ -- FIXME: there's no :add method in the list anyway. Added by gg.list?!
+ function M.block_terminators :add(x)
+ if type (x) == "table" then for _, y in ipairs(x) do self :add (y) end
+ else table.insert (self, x) end
+ end
+
+ ----------------------------------------------------------------------------
+ -- list of statements, possibly followed by semicolons
+ ----------------------------------------------------------------------------
+ M.block = gg.list {
+ name = "statements block",
+ terminators = M.block_terminators,
+ primary = function (lx)
+ -- FIXME use gg.optkeyword()
+ local x = M.stat (lx)
+ if lx:is_keyword (lx:peek(), ";") then lx:next() end
+ return x
+ end }
+
+ ----------------------------------------------------------------------------
+ -- Helper function for "return <expr_list>" parsing.
+ -- Called when parsing return statements.
+ -- The specific test for initial ";" is because it's not a block terminator,
+ -- so without it gg.list would choke on "return ;" statements.
+ -- We don't make a modified copy of block_terminators because this list
+ -- is sometimes modified at runtime, and the return parser would get out of
+ -- sync if it was relying on a copy.
+ ----------------------------------------------------------------------------
+ local return_expr_list_parser = gg.multisequence{
+ { ";" , builder = function() return { } end },
+ default = gg.list {
+ _M.expr, separators = ",", terminators = M.block_terminators } }
+
+
+ local for_vars_list = gg.list{
+ name = "for variables list",
+ primary = _M.id,
+ separators = ",",
+ terminators = "in" }
+
+ ----------------------------------------------------------------------------
+ -- for header, between [for] and [do] (exclusive).
+ -- Return the `Forxxx{...} AST, without the body element (the last one).
+ ----------------------------------------------------------------------------
+ function M.for_header (lx)
+ local vars = M.id_list(lx)
+ if lx :is_keyword (lx:peek(), "=") then
+ if #vars ~= 1 then
+ gg.parse_error (lx, "numeric for only accepts one variable")
+ end
+ lx:next() -- skip "="
+ local exprs = M.expr_list (lx)
+ if #exprs < 2 or #exprs > 3 then
+ gg.parse_error (lx, "numeric for requires 2 or 3 boundaries")
+ end
+ return { tag="Fornum", vars[1], unpack (exprs) }
+ else
+ if not lx :is_keyword (lx :next(), "in") then
+ gg.parse_error (lx, '"=" or "in" expected in for loop')
+ end
+ local exprs = M.expr_list (lx)
+ return { tag="Forin", vars, exprs }
+ end
+ end
+
+ ----------------------------------------------------------------------------
+ -- Function def parser helper: id ( . id ) *
+ ----------------------------------------------------------------------------
+ local function fn_builder (list)
+ local acc = list[1]
+ local first = acc.lineinfo.first
+ for i = 2, #list do
+ local index = M.id2string(list[i])
+ local li = lexer.new_lineinfo(first, index.lineinfo.last)
+ acc = { tag="Index", acc, index, lineinfo=li }
+ end
+ return acc
+ end
+ local func_name = gg.list{ _M.id, separators = ".", builder = fn_builder }
+
+ ----------------------------------------------------------------------------
+ -- Function def parser helper: ( : id )?
+ ----------------------------------------------------------------------------
+ local method_name = gg.onkeyword{ name = "method invocation", ":", _M.id,
+ transformers = { function(x) return x and x.tag=='Id' and M.id2string(x) end } }
+
+ ----------------------------------------------------------------------------
+ -- Function def builder
+ ----------------------------------------------------------------------------
+ local function funcdef_builder(x)
+ local name, method, func = unpack(x)
+ if method then
+ name = { tag="Index", name, method,
+ lineinfo = {
+ first = name.lineinfo.first,
+ last = method.lineinfo.last } }
+ table.insert (func[1], 1, {tag="Id", "self"})
+ end
+ local r = { tag="Set", {name}, {func} }
+ r[1].lineinfo = name.lineinfo
+ r[2].lineinfo = func.lineinfo
+ return r
+ end
+
+
+ ----------------------------------------------------------------------------
+ -- if statement builder
+ ----------------------------------------------------------------------------
+ local function if_builder (x)
+ local cond_block_pairs, else_block, r = x[1], x[2], {tag="If"}
+ local n_pairs = #cond_block_pairs
+ for i = 1, n_pairs do
+ local cond, block = unpack(cond_block_pairs[i])
+ r[2*i-1], r[2*i] = cond, block
+ end
+ if else_block then table.insert(r, #r+1, else_block) end
+ return r
+ end
+
+ --------------------------------------------------------------------------------
+ -- produce a list of (expr,block) pairs
+ --------------------------------------------------------------------------------
+ local elseifs_parser = gg.list {
+ gg.sequence { _M.expr, "then", _M.block , name='elseif parser' },
+ separators = "elseif",
+ terminators = { "else", "end" }
+ }
+
+ local annot_expr = gg.sequence {
+ _M.expr,
+ gg.onkeyword{ "#", gg.future(M, 'annot').tf },
+ builder = function(x)
+ local e, a = unpack(x)
+ if a then return { tag='Annot', e, a }
+ else return e end
+ end }
+
+ local annot_expr_list = gg.list {
+ primary = annot.opt(M, _M.expr, 'tf'), separators = ',' }
+
+ ------------------------------------------------------------------------
+ -- assignments and calls: statements that don't start with a keyword
+ ------------------------------------------------------------------------
+ local function assign_or_call_stat_parser (lx)
+ local e = annot_expr_list (lx)
+ local a = lx:is_keyword(lx:peek())
+ local op = a and M.assignments[a]
+ -- TODO: refactor annotations
+ if op then
+ --FIXME: check that [e] is a LHS
+ lx :next()
+ local annots
+ e, annots = annot.split(e)
+ local v = M.expr_list (lx)
+ if type(op)=="string" then return { tag=op, e, v, annots }
+ else return op (e, v) end
+ else
+ assert (#e > 0)
+ if #e > 1 then
+ gg.parse_error (lx,
+ "comma is not a valid statement separator; statement can be "..
+ "separated by semicolons, or not separated at all")
+ elseif e[1].tag ~= "Call" and e[1].tag ~= "Invoke" then
+ local typename
+ if e[1].tag == 'Id' then
+ typename = '("'..e[1][1]..'") is an identifier'
+ elseif e[1].tag == 'Op' then
+ typename = "is an arithmetic operation"
+ else typename = "is of type '"..(e[1].tag or "<list>").."'" end
+ gg.parse_error (lx,
+ "This expression %s; "..
+ "a statement was expected, and only function and method call "..
+ "expressions can be used as statements", typename);
+ end
+ return e[1]
+ end
+ end
+
+ M.local_stat_parser = gg.multisequence{
+ -- local function <name> <func_val>
+ { "function", _M.id, _M.func_val, builder =
+ function(x)
+ local vars = { x[1], lineinfo = x[1].lineinfo }
+ local vals = { x[2], lineinfo = x[2].lineinfo }
+ return { tag="Localrec", vars, vals }
+ end },
+ -- local <id_list> ( = <expr_list> )?
+ default = gg.sequence{
+ gg.list{
+ primary = annot.opt(M, _M.id, 'tf'),
+ separators = ',' },
+ gg.onkeyword{ "=", _M.expr_list },
+ builder = function(x)
+ local annotated_left, right = unpack(x)
+ local left, annotations = annot.split(annotated_left)
+ return {tag="Local", left, right or { }, annotations }
+ end } }
+
+ ------------------------------------------------------------------------
+ -- statement
+ ------------------------------------------------------------------------
+ M.stat = gg.multisequence {
+ name = "statement",
+ { "do", _M.block, "end", builder =
+ function (x) return { tag="Do", unpack (x[1]) } end },
+ { "for", _M.for_header, "do", _M.block, "end", builder =
+ function (x) x[1][#x[1]+1] = x[2]; return x[1] end },
+ { "function", func_name, method_name, _M.func_val, builder=funcdef_builder },
+ { "while", _M.expr, "do", _M.block, "end", builder = "While" },
+ { "repeat", _M.block, "until", _M.expr, builder = "Repeat" },
+ { "local", _M.local_stat_parser, builder = unpack },
+ { "return", return_expr_list_parser, builder =
+ function(x) x[1].tag='Return'; return x[1] end },
+ { "goto", _M.id, builder =
+ function(x) x[1].tag='Goto'; return x[1] end },
+ { "::", _M.id, "::", builder =
+ function(x) x[1].tag='Label'; return x[1] end },
+ { "break", builder = function() return { tag="Break" } end },
+ { "-{", gg.future(M, 'meta').splice_content, "}", builder = unpack },
+ { "if", gg.nonempty(elseifs_parser), gg.onkeyword{ "else", M.block }, "end",
+ builder = if_builder },
+ default = assign_or_call_stat_parser }
+
+ M.assignments = {
+ ["="] = "Set"
+ }
+
+ function M.assignments:add(k, v) self[k] = v end
+
+ return M
+end \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/table.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/table.lua
new file mode 100644
index 0000000..11102d9
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/compiler/parser/table.lua
@@ -0,0 +1,77 @@
+--------------------------------------------------------------------------------
+-- Copyright (c) 2006-2013 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+--------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+--
+-- Exported API:
+-- * [M.table_bracket_field()]
+-- * [M.table_field()]
+-- * [M.table_content()]
+-- * [M.table()]
+--
+-- KNOWN BUG: doesn't handle final ";" or "," before final "}"
+--
+--------------------------------------------------------------------------------
+
+local gg = require 'metalua.grammar.generator'
+
+return function(M)
+
+ M.table = { }
+ local _table = gg.future(M.table)
+ local _expr = gg.future(M).expr
+
+ --------------------------------------------------------------------------------
+ -- `[key] = value` table field definition
+ --------------------------------------------------------------------------------
+ M.table.bracket_pair = gg.sequence{ "[", _expr, "]", "=", _expr, builder = "Pair" }
+
+ --------------------------------------------------------------------------------
+ -- table element parser: list value, `id = value` pair or `[value] = value` pair.
+ --------------------------------------------------------------------------------
+ function M.table.element (lx)
+ if lx :is_keyword (lx :peek(), "[") then return M.table.bracket_pair(lx) end
+ local e = M.expr (lx)
+ if not lx :is_keyword (lx :peek(), "=") then return e end
+ lx :next(); -- skip the "="
+ local key = M.id2string(e) -- will fail on non-identifiers
+ local val = M.expr(lx)
+ local r = { tag="Pair", key, val }
+ r.lineinfo = { first = key.lineinfo.first, last = val.lineinfo.last }
+ return r
+ end
+
+ -----------------------------------------------------------------------------
+ -- table constructor, without enclosing braces; returns a full table object
+ -----------------------------------------------------------------------------
+ M.table.content = gg.list {
+ -- eta expansion to allow patching the element definition
+ primary = _table.element,
+ separators = { ",", ";" },
+ terminators = "}",
+ builder = "Table" }
+
+ --------------------------------------------------------------------------------
+ -- complete table constructor including [{...}]
+ --------------------------------------------------------------------------------
+ -- TODO beware, stat and expr use only table.content, this can't be patched.
+ M.table.table = gg.sequence{ "{", _table.content, "}", builder = unpack }
+
+ return M
+end \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/grammar/generator.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/grammar/generator.lua
new file mode 100644
index 0000000..4633c6e
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/grammar/generator.lua
@@ -0,0 +1,832 @@
+--------------------------------------------------------------------------------
+-- Copyright (c) 2006-2013 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+--------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+--
+-- Summary: parser generator. Collection of higher order functors,
+-- which allow to build and combine parsers. Relies on a lexer
+-- that supports the same API as the one exposed in mll.lua.
+--
+--------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+--
+-- Exported API:
+--
+-- Parser generators:
+-- * [gg.sequence()]
+-- * [gg.multisequence()]
+-- * [gg.expr()]
+-- * [gg.list()]
+-- * [gg.onkeyword()]
+-- * [gg.optkeyword()]
+--
+-- Other functions:
+-- * [gg.parse_error()]
+-- * [gg.make_parser()]
+-- * [gg.is_parser()]
+--
+--------------------------------------------------------------------------------
+
+local M = { }
+
+local lexer = require 'metalua.grammar.lexer'
+
+--------------------------------------------------------------------------------
+-- Symbol generator: [gensym()] returns a guaranteed-to-be-unique identifier.
+-- The main purpose is to avoid variable capture in macros.
+--
+-- If a string is passed as an argument, theis string will be part of the
+-- id name (helpful for macro debugging)
+--------------------------------------------------------------------------------
+local gensymidx = 0
+
+function M.gensym (arg)
+ gensymidx = gensymidx + 1
+ return { tag="Id", string.format(".%i.%s", gensymidx, arg or "")}
+end
+
+
+-------------------------------------------------------------------------------
+-- parser metatable, which maps __call to method parse, and adds some
+-- error tracing boilerplate.
+-------------------------------------------------------------------------------
+local parser_metatable = { }
+
+function parser_metatable :__call (lx, ...)
+ return self :parse (lx, ...)
+end
+
+-------------------------------------------------------------------------------
+-- Turn a table into a parser, mainly by setting the metatable.
+-------------------------------------------------------------------------------
+function M.make_parser(kind, p)
+ p.kind = kind
+ if not p.transformers then p.transformers = { } end
+ function p.transformers:add (x)
+ table.insert (self, x)
+ end
+ setmetatable (p, parser_metatable)
+ return p
+end
+
+-------------------------------------------------------------------------------
+-- Return true iff [x] is a parser.
+-- If it's a gg-generated parser, return the name of its kind.
+-------------------------------------------------------------------------------
+function M.is_parser (x)
+ return type(x)=="function" or getmetatable(x)==parser_metatable and x.kind
+end
+
+-------------------------------------------------------------------------------
+-- Parse a sequence, without applying builder nor transformers.
+-------------------------------------------------------------------------------
+local function raw_parse_sequence (lx, p)
+ local r = { }
+ for i=1, #p do
+ local e=p[i]
+ if type(e) == "string" then
+ local kw = lx :next()
+ if not lx :is_keyword (kw, e) then
+ M.parse_error(
+ lx, "A keyword was expected, probably `%s'.", e)
+ end
+ elseif M.is_parser (e) then
+ table.insert (r, e(lx))
+ else -- Invalid parser definition, this is *not* a parsing error
+ error(string.format(
+ "Sequence `%s': element #%i is neither a string nor a parser: %s",
+ p.name, i, table.tostring(e)))
+ end
+ end
+ return r
+end
+
+-------------------------------------------------------------------------------
+-- Parse a multisequence, without applying multisequence transformers.
+-- The sequences are completely parsed.
+-------------------------------------------------------------------------------
+local function raw_parse_multisequence (lx, sequence_table, default)
+ local seq_parser = sequence_table[lx:is_keyword(lx:peek())]
+ if seq_parser then return seq_parser (lx)
+ elseif default then return default (lx)
+ else return false end
+end
+
+-------------------------------------------------------------------------------
+-- Applies all transformers listed in parser on ast.
+-------------------------------------------------------------------------------
+local function transform (ast, parser, fli, lli)
+ if parser.transformers then
+ for _, t in ipairs (parser.transformers) do ast = t(ast) or ast end
+ end
+ if type(ast) == 'table' then
+ local ali = ast.lineinfo
+ if not ali or ali.first~=fli or ali.last~=lli then
+ ast.lineinfo = lexer.new_lineinfo(fli, lli)
+ end
+ end
+ return ast
+end
+
+-------------------------------------------------------------------------------
+-- Generate a tracable parsing error (not implemented yet)
+-------------------------------------------------------------------------------
+function M.parse_error(lx, fmt, ...)
+ local li = lx:lineinfo_left()
+ local file, line, column, offset, positions
+ if li then
+ file, line, column, offset = li.source, li.line, li.column, li.offset
+ positions = { first = li, last = li }
+ else
+ line, column, offset = -1, -1, -1
+ end
+
+ local msg = string.format("line %i, char %i: "..fmt, line, column, ...)
+ if file and file~='?' then msg = "file "..file..", "..msg end
+
+ local src = lx.src
+ if offset>0 and src then
+ local i, j = offset, offset
+ while src:sub(i,i) ~= '\n' and i>=0 do i=i-1 end
+ while src:sub(j,j) ~= '\n' and j<=#src do j=j+1 end
+ local srcline = src:sub (i+1, j-1)
+ local idx = string.rep (" ", column).."^"
+ msg = string.format("%s\n>>> %s\n>>> %s", msg, srcline, idx)
+ end
+ --lx :kill()
+ error(msg)
+end
+
+-------------------------------------------------------------------------------
+--
+-- Sequence parser generator
+--
+-------------------------------------------------------------------------------
+-- Input fields:
+--
+-- * [builder]: how to build an AST out of sequence parts. let [x] be the list
+-- of subparser results (keywords are simply omitted). [builder] can be:
+-- - [nil], in which case the result of parsing is simply [x]
+-- - a string, which is then put as a tag on [x]
+-- - a function, which takes [x] as a parameter and returns an AST.
+--
+-- * [name]: the name of the parser. Used for debug messages
+--
+-- * [transformers]: a list of AST->AST functions, applied in order on ASTs
+-- returned by the parser.
+--
+-- * Table-part entries corresponds to keywords (strings) and subparsers
+-- (function and callable objects).
+--
+-- After creation, the following fields are added:
+-- * [parse] the parsing function lexer->AST
+-- * [kind] == "sequence"
+-- * [name] is set, if it wasn't in the input.
+--
+-------------------------------------------------------------------------------
+function M.sequence (p)
+ M.make_parser ("sequence", p)
+
+ -------------------------------------------------------------------
+ -- Parsing method
+ -------------------------------------------------------------------
+ function p:parse (lx)
+
+ -- Raw parsing:
+ local fli = lx:lineinfo_right()
+ local seq = raw_parse_sequence (lx, self)
+ local lli = lx:lineinfo_left()
+
+ -- Builder application:
+ local builder, tb = self.builder, type (self.builder)
+ if tb == "string" then seq.tag = builder
+ elseif tb == "function" or builder and builder.__call then seq = builder(seq)
+ elseif builder == nil then -- nothing
+ else error ("Invalid builder of type "..tb.." in sequence") end
+ seq = transform (seq, self, fli, lli)
+ assert (not seq or seq.lineinfo)
+ return seq
+ end
+
+ -------------------------------------------------------------------
+ -- Construction
+ -------------------------------------------------------------------
+ -- Try to build a proper name
+ if p.name then
+ -- don't touch existing name
+ elseif type(p[1])=="string" then -- find name based on 1st keyword
+ if #p==1 then p.name=p[1]
+ elseif type(p[#p])=="string" then
+ p.name = p[1] .. " ... " .. p[#p]
+ else p.name = p[1] .. " ..." end
+ else -- can't find a decent name
+ p.name = "unnamed_sequence"
+ end
+
+ return p
+end --</sequence>
+
+
+-------------------------------------------------------------------------------
+--
+-- Multiple, keyword-driven, sequence parser generator
+--
+-------------------------------------------------------------------------------
+-- in [p], useful fields are:
+--
+-- * [transformers]: as usual
+--
+-- * [name]: as usual
+--
+-- * Table-part entries must be sequence parsers, or tables which can
+-- be turned into a sequence parser by [gg.sequence]. These
+-- sequences must start with a keyword, and this initial keyword
+-- must be different for each sequence. The table-part entries will
+-- be removed after [gg.multisequence] returns.
+--
+-- * [default]: the parser to run if the next keyword in the lexer is
+-- none of the registered initial keywords. If there's no default
+-- parser and no suitable initial keyword, the multisequence parser
+-- simply returns [false].
+--
+-- After creation, the following fields are added:
+--
+-- * [parse] the parsing function lexer->AST
+--
+-- * [sequences] the table of sequences, indexed by initial keywords.
+--
+-- * [add] method takes a sequence parser or a config table for
+-- [gg.sequence], and adds/replaces the corresponding sequence
+-- parser. If the keyword was already used, the former sequence is
+-- removed and a warning is issued.
+--
+-- * [get] method returns a sequence by its initial keyword
+--
+-- * [kind] == "multisequence"
+--
+-------------------------------------------------------------------------------
+function M.multisequence (p)
+ M.make_parser ("multisequence", p)
+
+ -------------------------------------------------------------------
+ -- Add a sequence (might be just a config table for [gg.sequence])
+ -------------------------------------------------------------------
+ function p :add (s)
+ -- compile if necessary:
+ local keyword = type(s)=='table' and s[1]
+ if type(s)=='table' and not M.is_parser(s) then M.sequence(s) end
+ if M.is_parser(s)~='sequence' or type(keyword)~='string' then
+ if self.default then -- two defaults
+ error ("In a multisequence parser, all but one sequences "..
+ "must start with a keyword")
+ else self.default = s end -- first default
+ else
+ if self.sequences[keyword] then -- duplicate keyword
+ -- TODO: warn that initial keyword `keyword` is overloaded in multiseq
+ end
+ self.sequences[keyword] = s
+ end
+ end -- </multisequence.add>
+
+ -------------------------------------------------------------------
+ -- Get the sequence starting with this keyword. [kw :: string]
+ -------------------------------------------------------------------
+ function p :get (kw) return self.sequences [kw] end
+
+ -------------------------------------------------------------------
+ -- Remove the sequence starting with keyword [kw :: string]
+ -------------------------------------------------------------------
+ function p :del (kw)
+ if not self.sequences[kw] then
+ -- TODO: warn that we try to delete a non-existent entry
+ end
+ local removed = self.sequences[kw]
+ self.sequences[kw] = nil
+ return removed
+ end
+
+ -------------------------------------------------------------------
+ -- Parsing method
+ -------------------------------------------------------------------
+ function p :parse (lx)
+ local fli = lx:lineinfo_right()
+ local x = raw_parse_multisequence (lx, self.sequences, self.default)
+ local lli = lx:lineinfo_left()
+ return transform (x, self, fli, lli)
+ end
+
+ -------------------------------------------------------------------
+ -- Construction
+ -------------------------------------------------------------------
+ -- Register the sequences passed to the constructor. They're going
+ -- from the array part of the parser to the hash part of field
+ -- [sequences]
+ p.sequences = { }
+ for i=1, #p do p :add (p[i]); p[i] = nil end
+
+ -- FIXME: why is this commented out?
+ --if p.default and not is_parser(p.default) then sequence(p.default) end
+ return p
+end --</multisequence>
+
+
+-------------------------------------------------------------------------------
+--
+-- Expression parser generator
+--
+-------------------------------------------------------------------------------
+--
+-- Expression configuration relies on three tables: [prefix], [infix]
+-- and [suffix]. Moreover, the primary parser can be replaced by a
+-- table: in this case the [primary] table will be passed to
+-- [gg.multisequence] to create a parser.
+--
+-- Each of these tables is a modified multisequence parser: the
+-- differences with respect to regular multisequence config tables are:
+--
+-- * the builder takes specific parameters:
+-- - for [prefix], it takes the result of the prefix sequence parser,
+-- and the prefixed expression
+-- - for [infix], it takes the left-hand-side expression, the results
+-- of the infix sequence parser, and the right-hand-side expression.
+-- - for [suffix], it takes the suffixed expression, and the result
+-- of the suffix sequence parser.
+--
+-- * the default field is a list, with parameters:
+-- - [parser] the raw parsing function
+-- - [transformers], as usual
+-- - [prec], the operator's precedence
+-- - [assoc] for [infix] table, the operator's associativity, which
+-- can be "left", "right" or "flat" (default to left)
+--
+-- In [p], useful fields are:
+-- * [transformers]: as usual
+-- * [name]: as usual
+-- * [primary]: the atomic expression parser, or a multisequence config
+-- table (mandatory)
+-- * [prefix]: prefix operators config table, see above.
+-- * [infix]: infix operators config table, see above.
+-- * [suffix]: suffix operators config table, see above.
+--
+-- After creation, these fields are added:
+-- * [kind] == "expr"
+-- * [parse] as usual
+-- * each table is turned into a multisequence, and therefore has an
+-- [add] method
+--
+-------------------------------------------------------------------------------
+function M.expr (p)
+ M.make_parser ("expr", p)
+
+ -------------------------------------------------------------------
+ -- parser method.
+ -- In addition to the lexer, it takes an optional precedence:
+ -- it won't read expressions whose precedence is lower or equal
+ -- to [prec].
+ -------------------------------------------------------------------
+ function p :parse (lx, prec)
+ prec = prec or 0
+
+ ------------------------------------------------------
+ -- Extract the right parser and the corresponding
+ -- options table, for (pre|in|suff)fix operators.
+ -- Options include prec, assoc, transformers.
+ ------------------------------------------------------
+ local function get_parser_info (tab)
+ local p2 = tab :get (lx :is_keyword (lx :peek()))
+ if p2 then -- keyword-based sequence found
+ local function parser(lx) return raw_parse_sequence(lx, p2) end
+ return parser, p2
+ else -- Got to use the default parser
+ local d = tab.default
+ if d then return d.parse or d.parser, d
+ else return false, false end
+ end
+ end
+
+ ------------------------------------------------------
+ -- Look for a prefix sequence. Multiple prefixes are
+ -- handled through the recursive [p.parse] call.
+ -- Notice the double-transform: one for the primary
+ -- expr, and one for the one with the prefix op.
+ ------------------------------------------------------
+ local function handle_prefix ()
+ local fli = lx :lineinfo_right()
+ local p2_func, p2 = get_parser_info (self.prefix)
+ local op = p2_func and p2_func (lx)
+ if op then -- Keyword-based sequence found
+ local ili = lx :lineinfo_right() -- Intermediate LineInfo
+ local e = p2.builder (op, self :parse (lx, p2.prec))
+ local lli = lx :lineinfo_left()
+ return transform (transform (e, p2, ili, lli), self, fli, lli)
+ else -- No prefix found, get a primary expression
+ local e = self.primary(lx)
+ local lli = lx :lineinfo_left()
+ return transform (e, self, fli, lli)
+ end
+ end --</expr.parse.handle_prefix>
+
+ ------------------------------------------------------
+ -- Look for an infix sequence+right-hand-side operand.
+ -- Return the whole binary expression result,
+ -- or false if no operator was found.
+ ------------------------------------------------------
+ local function handle_infix (e)
+ local p2_func, p2 = get_parser_info (self.infix)
+ if not p2 then return false end
+
+ -----------------------------------------
+ -- Handle flattening operators: gather all operands
+ -- of the series in [list]; when a different operator
+ -- is found, stop, build from [list], [transform] and
+ -- return.
+ -----------------------------------------
+ if (not p2.prec or p2.prec>prec) and p2.assoc=="flat" then
+ local fli = lx:lineinfo_right()
+ local pflat, list = p2, { e }
+ repeat
+ local op = p2_func(lx)
+ if not op then break end
+ table.insert (list, self:parse (lx, p2.prec))
+ local _ -- We only care about checking that p2==pflat
+ _, p2 = get_parser_info (self.infix)
+ until p2 ~= pflat
+ local e2 = pflat.builder (list)
+ local lli = lx:lineinfo_left()
+ return transform (transform (e2, pflat, fli, lli), self, fli, lli)
+
+ -----------------------------------------
+ -- Handle regular infix operators: [e] the LHS is known,
+ -- just gather the operator and [e2] the RHS.
+ -- Result goes in [e3].
+ -----------------------------------------
+ elseif p2.prec and p2.prec>prec or
+ p2.prec==prec and p2.assoc=="right" then
+ local fli = e.lineinfo.first -- lx:lineinfo_right()
+ local op = p2_func(lx)
+ if not op then return false end
+ local e2 = self:parse (lx, p2.prec)
+ local e3 = p2.builder (e, op, e2)
+ local lli = lx:lineinfo_left()
+ return transform (transform (e3, p2, fli, lli), self, fli, lli)
+
+ -----------------------------------------
+ -- Check for non-associative operators, and complain if applicable.
+ -----------------------------------------
+ elseif p2.assoc=="none" and p2.prec==prec then
+ M.parse_error (lx, "non-associative operator!")
+
+ -----------------------------------------
+ -- No infix operator suitable at that precedence
+ -----------------------------------------
+ else return false end
+
+ end --</expr.parse.handle_infix>
+
+ ------------------------------------------------------
+ -- Look for a suffix sequence.
+ -- Return the result of suffix operator on [e],
+ -- or false if no operator was found.
+ ------------------------------------------------------
+ local function handle_suffix (e)
+ -- FIXME bad fli, must take e.lineinfo.first
+ local p2_func, p2 = get_parser_info (self.suffix)
+ if not p2 then return false end
+ if not p2.prec or p2.prec>=prec then
+ --local fli = lx:lineinfo_right()
+ local fli = e.lineinfo.first
+ local op = p2_func(lx)
+ if not op then return false end
+ local lli = lx:lineinfo_left()
+ e = p2.builder (e, op)
+ e = transform (transform (e, p2, fli, lli), self, fli, lli)
+ return e
+ end
+ return false
+ end --</expr.parse.handle_suffix>
+
+ ------------------------------------------------------
+ -- Parser body: read suffix and (infix+operand)
+ -- extensions as long as we're able to fetch more at
+ -- this precedence level.
+ ------------------------------------------------------
+ local e = handle_prefix()
+ repeat
+ local x = handle_suffix (e); e = x or e
+ local y = handle_infix (e); e = y or e
+ until not (x or y)
+
+ -- No transform: it already happened in operators handling
+ return e
+ end --</expr.parse>
+
+ -------------------------------------------------------------------
+ -- Construction
+ -------------------------------------------------------------------
+ if not p.primary then p.primary=p[1]; p[1]=nil end
+ for _, t in ipairs{ "primary", "prefix", "infix", "suffix" } do
+ if not p[t] then p[t] = { } end
+ if not M.is_parser(p[t]) then M.multisequence(p[t]) end
+ end
+ function p:add(...) return self.primary:add(...) end
+ return p
+end --</expr>
+
+
+-------------------------------------------------------------------------------
+--
+-- List parser generator
+--
+-------------------------------------------------------------------------------
+-- In [p], the following fields can be provided in input:
+--
+-- * [builder]: takes list of subparser results, returns AST
+-- * [transformers]: as usual
+-- * [name]: as usual
+--
+-- * [terminators]: list of strings representing the keywords which
+-- might mark the end of the list. When non-empty, the list is
+-- allowed to be empty. A string is treated as a single-element
+-- table, whose element is that string, e.g. ["do"] is the same as
+-- [{"do"}].
+--
+-- * [separators]: list of strings representing the keywords which can
+-- separate elements of the list. When non-empty, one of these
+-- keyword has to be found between each element. Lack of a separator
+-- indicates the end of the list. A string is treated as a
+-- single-element table, whose element is that string, e.g. ["do"]
+-- is the same as [{"do"}]. If [terminators] is empty/nil, then
+-- [separators] has to be non-empty.
+--
+-- After creation, the following fields are added:
+-- * [parse] the parsing function lexer->AST
+-- * [kind] == "list"
+--
+-------------------------------------------------------------------------------
+function M.list (p)
+ M.make_parser ("list", p)
+
+ -------------------------------------------------------------------
+ -- Parsing method
+ -------------------------------------------------------------------
+ function p :parse (lx)
+
+ ------------------------------------------------------
+ -- Used to quickly check whether there's a terminator
+ -- or a separator immediately ahead
+ ------------------------------------------------------
+ local function peek_is_in (keywords)
+ return keywords and lx:is_keyword(lx:peek(), unpack(keywords)) end
+
+ local x = { }
+ local fli = lx :lineinfo_right()
+
+ -- if there's a terminator to start with, don't bother trying
+ local is_empty_list = self.terminators and (peek_is_in (self.terminators) or lx:peek().tag=="Eof")
+ if not is_empty_list then
+ repeat
+ local item = self.primary(lx)
+ table.insert (x, item) -- read one element
+ until
+ -- There's a separator list specified, and next token isn't in it.
+ -- Otherwise, consume it with [lx:next()]
+ self.separators and not(peek_is_in (self.separators) and lx:next()) or
+ -- Terminator token ahead
+ peek_is_in (self.terminators) or
+ -- Last reason: end of file reached
+ lx:peek().tag=="Eof"
+ end
+
+ local lli = lx:lineinfo_left()
+
+ -- Apply the builder. It can be a string, or a callable value,
+ -- or simply nothing.
+ local b = self.builder
+ if b then
+ if type(b)=="string" then x.tag = b -- b is a string, use it as a tag
+ elseif type(b)=="function" then x=b(x)
+ else
+ local bmt = getmetatable(b)
+ if bmt and bmt.__call then x=b(x) end
+ end
+ end
+ return transform (x, self, fli, lli)
+ end --</list.parse>
+
+ -------------------------------------------------------------------
+ -- Construction
+ -------------------------------------------------------------------
+ if not p.primary then p.primary = p[1]; p[1] = nil end
+ if type(p.terminators) == "string" then p.terminators = { p.terminators }
+ elseif p.terminators and #p.terminators == 0 then p.terminators = nil end
+ if type(p.separators) == "string" then p.separators = { p.separators }
+ elseif p.separators and #p.separators == 0 then p.separators = nil end
+
+ return p
+end --</list>
+
+
+-------------------------------------------------------------------------------
+--
+-- Keyword-conditioned parser generator
+--
+-------------------------------------------------------------------------------
+--
+-- Only apply a parser if a given keyword is found. The result of
+-- [gg.onkeyword] parser is the result of the subparser (modulo
+-- [transformers] applications).
+--
+-- lineinfo: the keyword is *not* included in the boundaries of the
+-- resulting lineinfo. A review of all usages of gg.onkeyword() in the
+-- implementation of metalua has shown that it was the appropriate choice
+-- in every case.
+--
+-- Input fields:
+--
+-- * [name]: as usual
+--
+-- * [transformers]: as usual
+--
+-- * [peek]: if non-nil, the conditioning keyword is left in the lexeme
+-- stream instead of being consumed.
+--
+-- * [primary]: the subparser.
+--
+-- * [keywords]: list of strings representing triggering keywords.
+--
+-- * Table-part entries can contain strings, and/or exactly one parser.
+-- Strings are put in [keywords], and the parser is put in [primary].
+--
+-- After the call, the following fields will be set:
+--
+-- * [parse] the parsing method
+-- * [kind] == "onkeyword"
+-- * [primary]
+-- * [keywords]
+--
+-------------------------------------------------------------------------------
+function M.onkeyword (p)
+ M.make_parser ("onkeyword", p)
+
+ -------------------------------------------------------------------
+ -- Parsing method
+ -------------------------------------------------------------------
+ function p :parse (lx)
+ if lx :is_keyword (lx:peek(), unpack(self.keywords)) then
+ local fli = lx:lineinfo_right()
+ if not self.peek then lx:next() end
+ local content = self.primary (lx)
+ local lli = lx:lineinfo_left()
+ local li = content.lineinfo or { }
+ fli, lli = li.first or fli, li.last or lli
+ return transform (content, p, fli, lli)
+ else return false end
+ end
+
+ -------------------------------------------------------------------
+ -- Construction
+ -------------------------------------------------------------------
+ if not p.keywords then p.keywords = { } end
+ for _, x in ipairs(p) do
+ if type(x)=="string" then table.insert (p.keywords, x)
+ else assert (not p.primary and M.is_parser (x)); p.primary = x end
+ end
+ assert (next (p.keywords), "Missing trigger keyword in gg.onkeyword")
+ assert (p.primary, 'no primary parser in gg.onkeyword')
+ return p
+end --</onkeyword>
+
+
+-------------------------------------------------------------------------------
+--
+-- Optional keyword consummer pseudo-parser generator
+--
+-------------------------------------------------------------------------------
+--
+-- This doesn't return a real parser, just a function. That function parses
+-- one of the keywords passed as parameters, and returns it. It returns
+-- [false] if no matching keyword is found.
+--
+-- Notice that tokens returned by lexer already carry lineinfo, therefore
+-- there's no need to add them, as done usually through transform() calls.
+-------------------------------------------------------------------------------
+function M.optkeyword (...)
+ local args = {...}
+ if type (args[1]) == "table" then
+ assert (#args == 1)
+ args = args[1]
+ end
+ for _, v in ipairs(args) do assert (type(v)=="string") end
+ return function (lx)
+ local x = lx:is_keyword (lx:peek(), unpack (args))
+ if x then lx:next(); return x
+ else return false end
+ end
+end
+
+
+-------------------------------------------------------------------------------
+--
+-- Run a parser with a special lexer
+--
+-------------------------------------------------------------------------------
+--
+-- This doesn't return a real parser, just a function.
+-- First argument is the lexer class to be used with the parser,
+-- 2nd is the parser itself.
+-- The resulting parser returns whatever the argument parser does.
+--
+-------------------------------------------------------------------------------
+function M.with_lexer(new_lexer, parser)
+
+ -------------------------------------------------------------------
+ -- Most gg functions take their parameters in a table, so it's
+ -- better to silently accept when with_lexer{ } is called with
+ -- its arguments in a list:
+ -------------------------------------------------------------------
+ if not parser and #new_lexer==2 and type(new_lexer[1])=='table' then
+ return M.with_lexer(unpack(new_lexer))
+ end
+
+ -------------------------------------------------------------------
+ -- Save the current lexer, switch it for the new one, run the parser,
+ -- restore the previous lexer, even if the parser caused an error.
+ -------------------------------------------------------------------
+ return function (lx)
+ local old_lexer = getmetatable(lx)
+ lx:sync()
+ setmetatable(lx, new_lexer)
+ local status, result = pcall(parser, lx)
+ lx:sync()
+ setmetatable(lx, old_lexer)
+ if status then return result else error(result) end
+ end
+end
+
+--------------------------------------------------------------------------------
+--
+-- Make sure a parser is used and returns successfully.
+--
+--------------------------------------------------------------------------------
+function M.nonempty(primary)
+ local p = M.make_parser('non-empty list', { primary = primary, name=primary.name })
+ function p :parse (lx)
+ local fli = lx:lineinfo_right()
+ local content = self.primary (lx)
+ local lli = lx:lineinfo_left()
+ local li = content.lineinfo or { }
+ fli, lli = li.first or fli, li.last or lli
+ if #content == 0 then
+ M.parse_error (lx, "`%s' must not be empty.", self.name or "list")
+ else
+ return transform (content, self, fli, lli)
+ end
+ end
+ return p
+end
+
+local FUTURE_MT = { }
+function FUTURE_MT:__tostring() return "<Proxy parser module>" end
+function FUTURE_MT:__newindex(key, value) error "don't write in futures" end
+function FUTURE_MT :__index (parser_name)
+ return function(...)
+ local p, m = rawget(self, '__path'), self.__module
+ if p then for _, name in ipairs(p) do
+ m=rawget(m, name)
+ if not m then error ("Submodule '"..name.."' undefined") end
+ end end
+ local f = rawget(m, parser_name)
+ if not f then error ("Parser '"..parser_name.."' undefined") end
+ return f(...)
+ end
+end
+
+function M.future(module, ...)
+ checks('table')
+ local path = ... and {...}
+ if path then for _, x in ipairs(path) do
+ assert(type(x)=='string', "Bad future arg")
+ end end
+ local self = { __module = module,
+ __path = path }
+ return setmetatable(self, FUTURE_MT)
+end
+
+return M
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/grammar/lexer.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/grammar/lexer.lua
new file mode 100644
index 0000000..8840ea8
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/grammar/lexer.lua
@@ -0,0 +1,678 @@
+-------------------------------------------------------------------------------
+-- Copyright (c) 2006-2013 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+-------------------------------------------------------------------------------
+
+require 'checks'
+
+local M = { }
+
+local lexer = { alpha={ }, sym={ } }
+lexer.__index=lexer
+lexer.__type='lexer.stream'
+
+M.lexer = lexer
+
+
+local debugf = function() end
+-- local debugf=printf
+
+----------------------------------------------------------------------
+-- Some locale settings produce bad results, e.g. French locale
+-- expect float numbers to use commas instead of periods.
+-- TODO: change number parser into something loclae-independent,
+-- locales are nasty.
+----------------------------------------------------------------------
+os.setlocale('C')
+
+local MT = { }
+
+M.metatables=MT
+
+----------------------------------------------------------------------
+-- Create a new metatable, for a new class of objects.
+----------------------------------------------------------------------
+local function new_metatable(name)
+ local mt = { __type = 'lexer.'..name };
+ mt.__index = mt
+ MT[name] = mt
+end
+
+
+----------------------------------------------------------------------
+-- Position: represent a point in a source file.
+----------------------------------------------------------------------
+new_metatable 'position'
+
+local position_idx=1
+
+function M.new_position(line, column, offset, source)
+ checks('number', 'number', 'number', 'string')
+ local id = position_idx; position_idx = position_idx+1
+ return setmetatable({line=line, column=column, offset=offset,
+ source=source, id=id}, MT.position)
+end
+
+function MT.position :__tostring()
+ return string.format("<%s%s|L%d|C%d|K%d>",
+ self.comments and "C|" or "",
+ self.source, self.line, self.column, self.offset)
+end
+
+
+
+----------------------------------------------------------------------
+-- Position factory: convert offsets into line/column/offset positions.
+----------------------------------------------------------------------
+new_metatable 'position_factory'
+
+function M.new_position_factory(src, src_name)
+ -- assert(type(src)=='string')
+ -- assert(type(src_name)=='string')
+ local lines = { 1 }
+ for offset in src :gmatch '\n()' do table.insert(lines, offset) end
+ local max = #src+1
+ table.insert(lines, max+1) -- +1 includes Eof
+ return setmetatable({ src_name=src_name, line2offset=lines, max=max },
+ MT.position_factory)
+end
+
+function MT.position_factory :get_position (offset)
+ -- assert(type(offset)=='number')
+ assert(offset<=self.max)
+ local line2offset = self.line2offset
+ local left = self.last_left or 1
+ if offset<line2offset[left] then left=1 end
+ local right = left+1
+ if line2offset[right]<=offset then right = right+1 end
+ if line2offset[right]<=offset then right = #line2offset end
+ while true do
+ -- print (" trying lines "..left.."/"..right..", offsets "..line2offset[left]..
+ -- "/"..line2offset[right].." for offset "..offset)
+ -- assert(line2offset[left]<=offset)
+ -- assert(offset<line2offset[right])
+ -- assert(left<right)
+ if left+1==right then break end
+ local middle = math.floor((left+right)/2)
+ if line2offset[middle]<=offset then left=middle else right=middle end
+ end
+ -- assert(left+1==right)
+ -- printf("found that offset %d is between %d and %d, hence on line %d",
+ -- offset, line2offset[left], line2offset[right], left)
+ local line = left
+ local column = offset - line2offset[line] + 1
+ self.last_left = left
+ return M.new_position(line, column, offset, self.src_name)
+end
+
+
+
+----------------------------------------------------------------------
+-- Lineinfo: represent a node's range in a source file;
+-- embed information about prefix and suffix comments.
+----------------------------------------------------------------------
+new_metatable 'lineinfo'
+
+function M.new_lineinfo(first, last)
+ checks('lexer.position', 'lexer.position')
+ return setmetatable({first=first, last=last}, MT.lineinfo)
+end
+
+function MT.lineinfo :__tostring()
+ local fli, lli = self.first, self.last
+ local line = fli.line; if line~=lli.line then line =line ..'-'..lli.line end
+ local column = fli.column; if column~=lli.column then column=column..'-'..lli.column end
+ local offset = fli.offset; if offset~=lli.offset then offset=offset..'-'..lli.offset end
+ return string.format("<%s%s|L%s|C%s|K%s%s>",
+ fli.comments and "C|" or "",
+ fli.source, line, column, offset,
+ lli.comments and "|C" or "")
+end
+
+----------------------------------------------------------------------
+-- Token: atomic Lua language element, with a category, a content,
+-- and some lineinfo relating it to its original source.
+----------------------------------------------------------------------
+new_metatable 'token'
+
+function M.new_token(tag, content, lineinfo)
+ --printf("TOKEN `%s{ %q, lineinfo = %s} boundaries %d, %d",
+ -- tag, content, tostring(lineinfo), lineinfo.first.id, lineinfo.last.id)
+ return setmetatable({tag=tag, lineinfo=lineinfo, content}, MT.token)
+end
+
+function MT.token :__tostring()
+ --return string.format("`%s{ %q, %s }", self.tag, self[1], tostring(self.lineinfo))
+ return string.format("`%s %q", self.tag, self[1])
+end
+
+
+----------------------------------------------------------------------
+-- Comment: series of comment blocks with associated lineinfo.
+-- To be attached to the tokens just before and just after them.
+----------------------------------------------------------------------
+new_metatable 'comment'
+
+function M.new_comment(lines)
+ local first = lines[1].lineinfo.first
+ local last = lines[#lines].lineinfo.last
+ local lineinfo = M.new_lineinfo(first, last)
+ return setmetatable({lineinfo=lineinfo, unpack(lines)}, MT.comment)
+end
+
+function MT.comment :text()
+ local last_line = self[1].lineinfo.last.line
+ local acc = { }
+ for i, line in ipairs(self) do
+ local nreturns = line.lineinfo.first.line - last_line
+ table.insert(acc, ("\n"):rep(nreturns))
+ table.insert(acc, line[1])
+ end
+ return table.concat(acc)
+end
+
+function M.new_comment_line(text, lineinfo, nequals)
+ checks('string', 'lexer.lineinfo', '?number')
+ return { lineinfo = lineinfo, text, nequals }
+end
+
+
+
+----------------------------------------------------------------------
+-- Patterns used by [lexer :extract] to decompose the raw string into
+-- correctly tagged tokens.
+----------------------------------------------------------------------
+lexer.patterns = {
+ spaces = "^[ \r\n\t]*()",
+ short_comment = "^%-%-([^\n]*)\n?()",
+ --final_short_comment = "^%-%-([^\n]*)()$",
+ long_comment = "^%-%-%[(=*)%[\n?(.-)%]%1%]()",
+ long_string = "^%[(=*)%[\n?(.-)%]%1%]()",
+ number_longint = "^%d+[uU]?[lL][lL]()",
+ number_longint_hex = "^%x+[uU]?[lL][lL]()",
+ number_mantissa = { "^%d+%.?%d*()", "^%d*%.%d+()" },
+ number_mantissa_hex = { "^%x+%.?%x*()", "^%x*%.%x+()" }, --Lua5.1 and Lua5.2
+ number_exponent = "^[eE][%+%-]?%d+()",
+ number_exponent_hex = "^[pP][%+%-]?%d+()", --Lua5.2
+ number_hex = "^0[xX]()",
+ number_imaginary = "^[iI]()",
+ word = "^([%a_][%w_]*)()",
+}
+
+----------------------------------------------------------------------
+-- unescape a whole string, applying [unesc_digits] and
+-- [unesc_letter] as many times as required.
+----------------------------------------------------------------------
+local function unescape_string (s)
+
+ -- Turn the digits of an escape sequence into the corresponding
+ -- character, e.g. [unesc_digits("123") == string.char(123)].
+ local function unesc_digits (backslashes, digits)
+ if #backslashes%2==0 then
+ -- Even number of backslashes, they escape each other, not the digits.
+ -- Return them so that unesc_letter() can treat them
+ return backslashes..digits
+ else
+ -- Remove the odd backslash, which escapes the number sequence.
+ -- The rest will be returned and parsed by unesc_letter()
+ backslashes = backslashes :sub (1,-2)
+ end
+ local k, j, i = digits :reverse() :byte(1, 3)
+ local z = string.byte "0"
+ local code = (k or z) + 10*(j or z) + 100*(i or z) - 111*z
+ if code > 255 then
+ error ("Illegal escape sequence '\\"..digits..
+ "' in string: ASCII codes must be in [0..255]")
+ end
+ local c = string.char (code)
+ if c == '\\' then c = '\\\\' end -- parsed by unesc_letter (test: "\092b" --> "\\b")
+ return backslashes..c
+ end
+
+ -- Turn hex digits of escape sequence into char.
+ local function unesc_hex(backslashes, digits)
+ if #backslashes%2==0 then
+ return backslashes..'x'..digits
+ else
+ backslashes = backslashes :sub (1,-2)
+ end
+ local c = string.char(tonumber(digits,16))
+ if c == '\\' then c = '\\\\' end -- parsed by unesc_letter (test: "\x5cb" --> "\\b")
+ return backslashes..c
+ end
+
+ -- Handle Lua 5.2 \z sequences
+ local function unesc_z(backslashes, more)
+ if #backslashes%2==0 then
+ return backslashes..more
+ else
+ return backslashes :sub (1,-2)
+ end
+ end
+
+ -- Take a letter [x], and returns the character represented by the
+ -- sequence ['\\'..x], e.g. [unesc_letter "n" == "\n"].
+ local function unesc_letter(x)
+ local t = {
+ a = "\a", b = "\b", f = "\f",
+ n = "\n", r = "\r", t = "\t", v = "\v",
+ ["\\"] = "\\", ["'"] = "'", ['"'] = '"', ["\n"] = "\n" }
+ return t[x] or x
+ end
+
+ s = s: gsub ("(\\+)(z%s*)", unesc_z) -- Lua 5.2
+ s = s: gsub ("(\\+)([0-9][0-9]?[0-9]?)", unesc_digits)
+ s = s: gsub ("(\\+)x([0-9a-fA-F][0-9a-fA-F])", unesc_hex) -- Lua 5.2
+ s = s: gsub ("\\(%D)",unesc_letter)
+ return s
+end
+
+lexer.extractors = {
+ "extract_long_comment", "extract_short_comment",
+ "extract_short_string", "extract_word", "extract_number",
+ "extract_long_string", "extract_symbol" }
+
+
+
+----------------------------------------------------------------------
+-- Really extract next token from the raw string
+-- (and update the index).
+-- loc: offset of the position just after spaces and comments
+-- previous_i: offset in src before extraction began
+----------------------------------------------------------------------
+function lexer :extract ()
+ local attached_comments = { }
+ local function gen_token(...)
+ local token = M.new_token(...)
+ if #attached_comments>0 then -- attach previous comments to token
+ local comments = M.new_comment(attached_comments)
+ token.lineinfo.first.comments = comments
+ if self.lineinfo_last_extracted then
+ self.lineinfo_last_extracted.comments = comments
+ end
+ attached_comments = { }
+ end
+ token.lineinfo.first.facing = self.lineinfo_last_extracted
+ self.lineinfo_last_extracted.facing = assert(token.lineinfo.first)
+ self.lineinfo_last_extracted = assert(token.lineinfo.last)
+ return token
+ end
+ while true do -- loop until a non-comment token is found
+
+ -- skip whitespaces
+ self.i = self.src:match (self.patterns.spaces, self.i)
+ if self.i>#self.src then
+ local fli = self.posfact :get_position (#self.src+1)
+ local lli = self.posfact :get_position (#self.src+1) -- ok?
+ local tok = gen_token("Eof", "eof", M.new_lineinfo(fli, lli))
+ tok.lineinfo.last.facing = lli
+ return tok
+ end
+ local i_first = self.i -- loc = position after whitespaces
+
+ -- try every extractor until a token is found
+ for _, extractor in ipairs(self.extractors) do
+ local tag, content, xtra = self [extractor] (self)
+ if tag then
+ local fli = self.posfact :get_position (i_first)
+ local lli = self.posfact :get_position (self.i-1)
+ local lineinfo = M.new_lineinfo(fli, lli)
+ if tag=='Comment' then
+ local prev_comment = attached_comments[#attached_comments]
+ if not xtra -- new comment is short
+ and prev_comment and not prev_comment[2] -- prev comment is short
+ and prev_comment.lineinfo.last.line+1==fli.line then -- adjascent lines
+ -- concat with previous comment
+ prev_comment[1] = prev_comment[1].."\n"..content -- TODO quadratic, BAD!
+ prev_comment.lineinfo.last = lli
+ else -- accumulate comment
+ local comment = M.new_comment_line(content, lineinfo, xtra)
+ table.insert(attached_comments, comment)
+ end
+ break -- back to skipping spaces
+ else -- not a comment: real token, then
+ return gen_token(tag, content, lineinfo)
+ end -- if token is a comment
+ end -- if token found
+ end -- for each extractor
+ end -- while token is a comment
+end -- :extract()
+
+
+
+
+----------------------------------------------------------------------
+-- Extract a short comment.
+----------------------------------------------------------------------
+function lexer :extract_short_comment()
+ -- TODO: handle final_short_comment
+ local content, j = self.src :match (self.patterns.short_comment, self.i)
+ if content then self.i=j; return 'Comment', content, nil end
+end
+
+----------------------------------------------------------------------
+-- Extract a long comment.
+----------------------------------------------------------------------
+function lexer :extract_long_comment()
+ local equals, content, j = self.src:match (self.patterns.long_comment, self.i)
+ if j then self.i = j; return "Comment", content, #equals end
+end
+
+----------------------------------------------------------------------
+-- Extract a '...' or "..." short string.
+----------------------------------------------------------------------
+function lexer :extract_short_string()
+ local k = self.src :sub (self.i,self.i) -- first char
+ if k~=[[']] and k~=[["]] then return end -- no match'
+ local i = self.i + 1
+ local j = i
+ while true do
+ local x,y; x, j, y = self.src :match ("([\\\r\n"..k.."])()(.?)", j) -- next interesting char
+ if x == '\\' then
+ if y == 'z' then -- Lua 5.2 \z
+ j = self.src :match ("^%s*()", j+1)
+ else
+ j=j+1 -- escaped char
+ end
+ elseif x == k then break -- end of string
+ else
+ assert (not x or x=='\r' or x=='\n')
+ return nil, 'Unterminated string'
+ end
+ end
+ self.i = j
+
+ return 'String', unescape_string (self.src :sub (i,j-2))
+end
+
+----------------------------------------------------------------------
+-- Extract Id or Keyword.
+----------------------------------------------------------------------
+function lexer :extract_word()
+ local word, j = self.src:match (self.patterns.word, self.i)
+ if word then
+ self.i = j
+ return (self.alpha [word] and 'Keyword' or 'Id'), word
+ end
+end
+
+----------------------------------------------------------------------
+-- Extract Number.
+----------------------------------------------------------------------
+function lexer :extract_number()
+ local patt = self.patterns
+ local s = self.src
+ local j = s:match(patt.number_hex, self.i)
+ local hex = j ~= nil
+ local longint = hex and patt.number_longint_hex or patt.number_longint
+ local mantissa1 = hex and patt.number_mantissa_hex[1] or patt.number_mantissa[1]
+ local mantissa2 = hex and patt.number_mantissa_hex[2] or patt.number_mantissa[2]
+ local exponent = hex and patt.number_exponent_hex or patt.number_exponent
+ if not hex then j = self.i end
+
+ local t = s:match(longint, j)
+ if t then
+ j = t
+ else
+ j = s:match(mantissa1, j) or s:match(mantissa2, j)
+ if not j then return end
+ j = s:match(exponent, j) or j
+ j = s:match(patt.number_imaginary, j) or j
+ end
+
+ local str = self.src:sub (self.i, j-1)
+ self.i = j
+ -- Number found, interpret with tonumber() and return it
+ -- return str as the fallback when processing formats not supported by the current interpreter
+ return 'Number', (tonumber (str) or str)
+end
+
+----------------------------------------------------------------------
+-- Extract long string.
+----------------------------------------------------------------------
+function lexer :extract_long_string()
+ local _, content, j = self.src :match (self.patterns.long_string, self.i)
+ if j then self.i = j; return 'String', content end
+end
+
+----------------------------------------------------------------------
+-- Extract symbol.
+----------------------------------------------------------------------
+function lexer :extract_symbol()
+ local k = self.src:sub (self.i,self.i)
+ local symk = self.sym [k] -- symbols starting with `k`
+ if not symk then
+ self.i = self.i + 1
+ return 'Keyword', k
+ end
+ for _, sym in pairs (symk) do
+ if sym == self.src:sub (self.i, self.i + #sym - 1) then
+ self.i = self.i + #sym
+ return 'Keyword', sym
+ end
+ end
+ self.i = self.i+1
+ return 'Keyword', k
+end
+
+----------------------------------------------------------------------
+-- Add a keyword to the list of keywords recognized by the lexer.
+----------------------------------------------------------------------
+function lexer :add (w, ...)
+ assert(not ..., "lexer :add() takes only one arg, although possibly a table")
+ if type (w) == "table" then
+ for _, x in ipairs (w) do self :add (x) end
+ else
+ if w:match (self.patterns.word .. "$") then self.alpha [w] = true
+ elseif w:match "^%p%p+$" then
+ local k = w:sub(1,1)
+ local list = self.sym [k]
+ if not list then list = { }; self.sym [k] = list end
+ table.insert (list, w)
+ elseif w:match "^%p$" then return
+ else error "Invalid keyword" end
+ end
+end
+
+----------------------------------------------------------------------
+-- Return the [n]th next token, without consuming it.
+-- [n] defaults to 1. If it goes pass the end of the stream, an EOF
+-- token is returned.
+----------------------------------------------------------------------
+function lexer :peek (n)
+ if not n then n=1 end
+ if n > #self.peeked then
+ for i = #self.peeked+1, n do
+ self.peeked [i] = self :extract()
+ end
+ end
+ return self.peeked [n]
+end
+
+----------------------------------------------------------------------
+-- Return the [n]th next token, removing it as well as the 0..n-1
+-- previous tokens. [n] defaults to 1. If it goes pass the end of the
+-- stream, an EOF token is returned.
+----------------------------------------------------------------------
+function lexer :next (n)
+ n = n or 1
+ self :peek (n)
+ local a
+ for i=1,n do
+ a = table.remove (self.peeked, 1)
+ -- TODO: is this used anywhere? I think not. a.lineinfo.last may be nil.
+ --self.lastline = a.lineinfo.last.line
+ end
+ self.lineinfo_last_consumed = a.lineinfo.last
+ return a
+end
+
+----------------------------------------------------------------------
+-- Returns an object which saves the stream's current state.
+----------------------------------------------------------------------
+-- FIXME there are more fields than that to save
+function lexer :save () return { self.i; {unpack(self.peeked) } } end
+
+----------------------------------------------------------------------
+-- Restore the stream's state, as saved by method [save].
+----------------------------------------------------------------------
+-- FIXME there are more fields than that to restore
+function lexer :restore (s) self.i=s[1]; self.peeked=s[2] end
+
+----------------------------------------------------------------------
+-- Resynchronize: cancel any token in self.peeked, by emptying the
+-- list and resetting the indexes
+----------------------------------------------------------------------
+function lexer :sync()
+ local p1 = self.peeked[1]
+ if p1 then
+ local li_first = p1.lineinfo.first
+ if li_first.comments then li_first=li_first.comments.lineinfo.first end
+ self.i = li_first.offset
+ self.column_offset = self.i - li_first.column
+ self.peeked = { }
+ self.attached_comments = p1.lineinfo.first.comments or { }
+ end
+end
+
+----------------------------------------------------------------------
+-- Take the source and offset of an old lexer.
+----------------------------------------------------------------------
+function lexer :takeover(old)
+ self :sync(); old :sync()
+ for _, field in ipairs{ 'i', 'src', 'attached_comments', 'posfact' } do
+ self[field] = old[field]
+ end
+ return self
+end
+
+----------------------------------------------------------------------
+-- Return the current position in the sources. This position is between
+-- two tokens, and can be within a space / comment area, and therefore
+-- have a non-null width. :lineinfo_left() returns the beginning of the
+-- separation area, :lineinfo_right() returns the end of that area.
+--
+-- ____ last consummed token ____ first unconsummed token
+-- / /
+-- XXXXX <spaces and comments> YYYYY
+-- \____ \____
+-- :lineinfo_left() :lineinfo_right()
+----------------------------------------------------------------------
+function lexer :lineinfo_right()
+ return self :peek(1).lineinfo.first
+end
+
+function lexer :lineinfo_left()
+ return self.lineinfo_last_consumed
+end
+
+----------------------------------------------------------------------
+-- Create a new lexstream.
+----------------------------------------------------------------------
+function lexer :newstream (src_or_stream, name)
+ name = name or "?"
+ if type(src_or_stream)=='table' then -- it's a stream
+ return setmetatable ({ }, self) :takeover (src_or_stream)
+ elseif type(src_or_stream)=='string' then -- it's a source string
+ local src = src_or_stream
+ local pos1 = M.new_position(1, 1, 1, name)
+ local stream = {
+ src_name = name; -- Name of the file
+ src = src; -- The source, as a single string
+ peeked = { }; -- Already peeked, but not discarded yet, tokens
+ i = 1; -- Character offset in src
+ attached_comments = { },-- comments accumulator
+ lineinfo_last_extracted = pos1,
+ lineinfo_last_consumed = pos1,
+ posfact = M.new_position_factory (src_or_stream, name)
+ }
+ setmetatable (stream, self)
+
+ -- Skip initial sharp-bang for Unix scripts
+ -- FIXME: redundant with mlp.chunk()
+ if src and src :match "^#!" then
+ local endofline = src :find "\n"
+ stream.i = endofline and (endofline + 1) or #src
+ end
+ return stream
+ else
+ assert(false, ":newstream() takes a source string or a stream, not a "..
+ type(src_or_stream))
+ end
+end
+
+----------------------------------------------------------------------
+-- If there's no ... args, return the token a (whose truth value is
+-- true) if it's a `Keyword{ }, or nil. If there are ... args, they
+-- have to be strings. if the token a is a keyword, and it's content
+-- is one of the ... args, then returns it (it's truth value is
+-- true). If no a keyword or not in ..., return nil.
+----------------------------------------------------------------------
+function lexer :is_keyword (a, ...)
+ if not a or a.tag ~= "Keyword" then return false end
+ local words = {...}
+ if #words == 0 then return a[1] end
+ for _, w in ipairs (words) do
+ if w == a[1] then return w end
+ end
+ return false
+end
+
+----------------------------------------------------------------------
+-- Cause an error if the next token isn't a keyword whose content
+-- is listed among ... args (which have to be strings).
+----------------------------------------------------------------------
+function lexer :check (...)
+ local words = {...}
+ local a = self :next()
+ local function err ()
+ error ("Got " .. tostring (a) ..
+ ", expected one of these keywords : '" ..
+ table.concat (words,"', '") .. "'") end
+ if not a or a.tag ~= "Keyword" then err () end
+ if #words == 0 then return a[1] end
+ for _, w in ipairs (words) do
+ if w == a[1] then return w end
+ end
+ err ()
+end
+
+----------------------------------------------------------------------
+--
+----------------------------------------------------------------------
+function lexer :clone()
+ local alpha_clone, sym_clone = { }, { }
+ for word in pairs(self.alpha) do alpha_clone[word]=true end
+ for letter, list in pairs(self.sym) do sym_clone[letter] = { unpack(list) } end
+ local clone = { alpha=alpha_clone, sym=sym_clone }
+ setmetatable(clone, self)
+ clone.__index = clone
+ return clone
+end
+
+----------------------------------------------------------------------
+-- Cancel everything left in a lexer, all subsequent attempts at
+-- `:peek()` or `:next()` will return `Eof`.
+----------------------------------------------------------------------
+function lexer :kill()
+ self.i = #self.src+1
+ self.peeked = { }
+ self.attached_comments = { }
+ self.lineinfo_last = self.posfact :get_position (#self.src+1)
+end
+
+return M
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/pprint.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/pprint.lua
new file mode 100644
index 0000000..73a842b
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/metalua/pprint.lua
@@ -0,0 +1,295 @@
+-------------------------------------------------------------------------------
+-- Copyright (c) 2006-2013 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+----------------------------------------------------------------------
+
+----------------------------------------------------------------------
+----------------------------------------------------------------------
+--
+-- Lua objects pretty-printer
+--
+----------------------------------------------------------------------
+----------------------------------------------------------------------
+
+local M = { }
+
+M.DEFAULT_CFG = {
+ hide_hash = false; -- Print the non-array part of tables?
+ metalua_tag = true; -- Use Metalua's backtick syntax sugar?
+ fix_indent = nil; -- If a number, number of indentation spaces;
+ -- If false, indent to the previous brace.
+ line_max = nil; -- If a number, tries to avoid making lines with
+ -- more than this number of chars.
+ initial_indent = 0; -- If a number, starts at this level of indentation
+ keywords = { }; -- Set of keywords which must not use Lua's field
+ -- shortcuts {["foo"]=...} -> {foo=...}
+}
+
+local function valid_id(cfg, x)
+ if type(x) ~= "string" then return false end
+ if not x:match "^[a-zA-Z_][a-zA-Z0-9_]*$" then return false end
+ if cfg.keywords and cfg.keywords[x] then return false end
+ return true
+end
+
+local __tostring_cache = setmetatable({ }, {__mode='k'})
+
+-- Retrieve the string produced by `__tostring` metamethod if present,
+-- return `false` otherwise. Cached in `__tostring_cache`.
+local function __tostring(x)
+ local the_string = __tostring_cache[x]
+ if the_string~=nil then return the_string end
+ local mt = getmetatable(x)
+ if mt then
+ local __tostring = mt.__tostring
+ if __tostring then
+ the_string = __tostring(x)
+ __tostring_cache[x] = the_string
+ return the_string
+ end
+ end
+ if x~=nil then __tostring_cache[x] = false end -- nil is an illegal key
+ return false
+end
+
+local xlen -- mutually recursive with `xlen_type`
+
+local xlen_cache = setmetatable({ }, {__mode='k'})
+
+-- Helpers for the `xlen` function
+local xlen_type = {
+ ["nil"] = function ( ) return 3 end;
+ number = function (x) return #tostring(x) end;
+ boolean = function (x) return x and 4 or 5 end;
+ string = function (x) return #string.format("%q",x) end;
+}
+
+function xlen_type.table (adt, cfg, nested)
+ local custom_string = __tostring(adt)
+ if custom_string then return #custom_string end
+
+ -- Circular referenced objects are printed with the plain
+ -- `tostring` function in nested positions.
+ if nested [adt] then return #tostring(adt) end
+ nested [adt] = true
+
+ local has_tag = cfg.metalua_tag and valid_id(cfg, adt.tag)
+ local alen = #adt
+ local has_arr = alen>0
+ local has_hash = false
+ local x = 0
+
+ if not cfg.hide_hash then
+ -- first pass: count hash-part
+ for k, v in pairs(adt) do
+ if k=="tag" and has_tag then
+ -- this is the tag -> do nothing!
+ elseif type(k)=="number" and k<=alen and math.fmod(k,1)==0 and k>0 then
+ -- array-part pair -> do nothing!
+ else
+ has_hash = true
+ if valid_id(cfg, k) then x=x+#k
+ else x = x + xlen (k, cfg, nested) + 2 end -- count surrounding brackets
+ x = x + xlen (v, cfg, nested) + 5 -- count " = " and ", "
+ end
+ end
+ end
+
+ for i = 1, alen do x = x + xlen (adt[i], nested) + 2 end -- count ", "
+
+ nested[adt] = false -- No more nested calls
+
+ if not (has_tag or has_arr or has_hash) then return 3 end
+ if has_tag then x=x+#adt.tag+1 end
+ if not (has_arr or has_hash) then return x end
+ if not has_hash and alen==1 and type(adt[1])~="table" then
+ return x-2 -- substract extraneous ", "
+ end
+ return x+2 -- count "{ " and " }", substract extraneous ", "
+end
+
+
+-- Compute the number of chars it would require to display the table
+-- on a single line. Helps to decide whether some carriage returns are
+-- required. Since the size of each sub-table is required many times,
+-- it's cached in [xlen_cache].
+xlen = function (x, cfg, nested)
+ -- no need to compute length for 1-line prints
+ if not cfg.line_max then return 0 end
+ nested = nested or { }
+ if x==nil then return #"nil" end
+ local len = xlen_cache[x]
+ if len then return len end
+ local f = xlen_type[type(x)]
+ if not f then return #tostring(x) end
+ len = f (x, cfg, nested)
+ xlen_cache[x] = len
+ return len
+end
+
+local function consider_newline(p, len)
+ if not p.cfg.line_max then return end
+ if p.current_offset + len <= p.cfg.line_max then return end
+ if p.indent < p.current_offset then
+ p:acc "\n"; p:acc ((" "):rep(p.indent))
+ p.current_offset = p.indent
+ end
+end
+
+local acc_value
+
+local acc_type = {
+ ["nil"] = function(p) p:acc("nil") end;
+ number = function(p, adt) p:acc (tostring (adt)) end;
+ string = function(p, adt) p:acc ((string.format ("%q", adt):gsub("\\\n", "\\n"))) end;
+ boolean = function(p, adt) p:acc (adt and "true" or "false") end }
+
+-- Indentation:
+-- * if `cfg.fix_indent` is set to a number:
+-- * add this number of space for each level of depth
+-- * return to the line as soon as it flushes things further left
+-- * if not, tabulate to one space after the opening brace.
+-- * as a result, it never saves right-space to return before first element
+
+function acc_type.table(p, adt)
+ if p.nested[adt] then p:acc(tostring(adt)); return end
+ p.nested[adt] = true
+
+ local has_tag = p.cfg.metalua_tag and valid_id(p.cfg, adt.tag)
+ local alen = #adt
+ local has_arr = alen>0
+ local has_hash = false
+
+ local previous_indent = p.indent
+
+ if has_tag then p:acc("`"); p:acc(adt.tag) end
+
+ local function indent(p)
+ if not p.cfg.fix_indent then p.indent = p.current_offset
+ else p.indent = p.indent + p.cfg.fix_indent end
+ end
+
+ -- First pass: handle hash-part
+ if not p.cfg.hide_hash then
+ for k, v in pairs(adt) do
+
+ if has_tag and k=='tag' then -- pass the 'tag' field
+ elseif type(k)=="number" and k<=alen and k>0 and math.fmod(k,1)==0 then
+ -- pass array-part keys (consecutive ints less than `#adt`)
+ else -- hash-part keys
+ if has_hash then p:acc ", " else -- 1st hash-part pair ever found
+ p:acc "{ "; indent(p)
+ end
+
+ -- Determine whether a newline is required
+ local is_id, expected_len=valid_id(p.cfg, k)
+ if is_id then expected_len=#k+xlen(v, p.cfg, p.nested)+#" = , "
+ else expected_len = xlen(k, p.cfg, p.nested)+xlen(v, p.cfg, p.nested)+#"[] = , " end
+ consider_newline(p, expected_len)
+
+ -- Print the key
+ if is_id then p:acc(k); p:acc " = " else
+ p:acc "["; acc_value (p, k); p:acc "] = "
+ end
+
+ acc_value (p, v) -- Print the value
+ has_hash = true
+ end
+ end
+ end
+
+ -- Now we know whether there's a hash-part, an array-part, and a tag.
+ -- Tag and hash-part are already printed if they're present.
+ if not has_tag and not has_hash and not has_arr then p:acc "{ }";
+ elseif has_tag and not has_hash and not has_arr then -- nothing, tag already in acc
+ else
+ assert (has_hash or has_arr) -- special case { } already handled
+ local no_brace = false
+ if has_hash and has_arr then p:acc ", "
+ elseif has_tag and not has_hash and alen==1 and type(adt[1])~="table" then
+ -- No brace required; don't print "{", remember not to print "}"
+ p:acc (" "); acc_value (p, adt[1]) -- indent= indent+(cfg.fix_indent or 0))
+ no_brace = true
+ elseif not has_hash then
+ -- Braces required, but not opened by hash-part handler yet
+ p:acc "{ "; indent(p)
+ end
+
+ -- 2nd pass: array-part
+ if not no_brace and has_arr then
+ local expected_len = xlen(adt[1], p.cfg, p.nested)
+ consider_newline(p, expected_len)
+ acc_value(p, adt[1]) -- indent+(cfg.fix_indent or 0)
+ for i=2, alen do
+ p:acc ", ";
+ consider_newline(p, xlen(adt[i], p.cfg, p.nested))
+ acc_value (p, adt[i]) --indent+(cfg.fix_indent or 0)
+ end
+ end
+ if not no_brace then p:acc " }" end
+ end
+ p.nested[adt] = false -- No more nested calls
+ p.indent = previous_indent
+end
+
+
+function acc_value(p, v)
+ local custom_string = __tostring(v)
+ if custom_string then p:acc(custom_string) else
+ local f = acc_type[type(v)]
+ if f then f(p, v) else p:acc(tostring(v)) end
+ end
+end
+
+
+-- FIXME: new_indent seems to be always nil?!s detection
+-- FIXME: accumulator function should be configurable,
+-- so that print() doesn't need to bufferize the whole string
+-- before starting to print.
+function M.tostring(t, cfg)
+
+ cfg = cfg or M.DEFAULT_CFG or { }
+
+ local p = {
+ cfg = cfg;
+ indent = 0;
+ current_offset = cfg.initial_indent or 0;
+ buffer = { };
+ nested = { };
+ acc = function(self, str)
+ table.insert(self.buffer, str)
+ self.current_offset = self.current_offset + #str
+ end;
+ }
+ acc_value(p, t)
+ return table.concat(p.buffer)
+end
+
+function M.print(...) return print(M.tostring(...)) end
+function M.sprintf(fmt, ...)
+ local args={...}
+ for i, v in pairs(args) do
+ local t=type(v)
+ if t=='table' then args[i]=M.tostring(v)
+ elseif t=='nil' then args[i]='nil' end
+ end
+ return string.format(fmt, unpack(args))
+end
+
+function M.printf(...) print(M.sprintf(...)) end
+
+return M \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/mime.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/mime.lua
new file mode 100644
index 0000000..642cd9c
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/mime.lua
@@ -0,0 +1,90 @@
+-----------------------------------------------------------------------------
+-- MIME support for the Lua language.
+-- Author: Diego Nehab
+-- Conforming to RFCs 2045-2049
+-----------------------------------------------------------------------------
+
+-----------------------------------------------------------------------------
+-- Declare module and import dependencies
+-----------------------------------------------------------------------------
+local base = _G
+local ltn12 = require("ltn12")
+local mime = require("mime.core")
+local io = require("io")
+local string = require("string")
+local _M = mime
+
+-- encode, decode and wrap algorithm tables
+local encodet, decodet, wrapt = {},{},{}
+
+_M.encodet = encodet
+_M.decodet = decodet
+_M.wrapt = wrapt
+
+-- creates a function that chooses a filter by name from a given table
+local function choose(table)
+ return function(name, opt1, opt2)
+ if base.type(name) ~= "string" then
+ name, opt1, opt2 = "default", name, opt1
+ end
+ local f = table[name or "nil"]
+ if not f then
+ base.error("unknown key (" .. base.tostring(name) .. ")", 3)
+ else return f(opt1, opt2) end
+ end
+end
+
+-- define the encoding filters
+encodet['base64'] = function()
+ return ltn12.filter.cycle(_M.b64, "")
+end
+
+encodet['quoted-printable'] = function(mode)
+ return ltn12.filter.cycle(_M.qp, "",
+ (mode == "binary") and "=0D=0A" or "\r\n")
+end
+
+-- define the decoding filters
+decodet['base64'] = function()
+ return ltn12.filter.cycle(_M.unb64, "")
+end
+
+decodet['quoted-printable'] = function()
+ return ltn12.filter.cycle(_M.unqp, "")
+end
+
+local function format(chunk)
+ if chunk then
+ if chunk == "" then return "''"
+ else return string.len(chunk) end
+ else return "nil" end
+end
+
+-- define the line-wrap filters
+wrapt['text'] = function(length)
+ length = length or 76
+ return ltn12.filter.cycle(_M.wrp, length, length)
+end
+wrapt['base64'] = wrapt['text']
+wrapt['default'] = wrapt['text']
+
+wrapt['quoted-printable'] = function()
+ return ltn12.filter.cycle(_M.qpwrp, 76, 76)
+end
+
+-- function that choose the encoding, decoding or wrap algorithm
+_M.encode = choose(encodet)
+_M.decode = choose(decodet)
+_M.wrap = choose(wrapt)
+
+-- define the end-of-line normalization filter
+function _M.normalize(marker)
+ return ltn12.filter.cycle(_M.eol, 0, marker)
+end
+
+-- high level stuffing filter
+function _M.stuff()
+ return ltn12.filter.cycle(_M.dot, 2)
+end
+
+return _M \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/mobdebug/mobdebug.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/mobdebug/mobdebug.lua
new file mode 100644
index 0000000..3f5fdfc
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/mobdebug/mobdebug.lua
@@ -0,0 +1,1609 @@
+--
+-- MobDebug -- Lua remote debugger
+-- Copyright 2011-15 Paul Kulchenko
+-- Based on RemDebug 1.0 Copyright Kepler Project 2005
+--
+
+-- use loaded modules or load explicitly on those systems that require that
+local require = require
+local io = io or require "io"
+local table = table or require "table"
+local string = string or require "string"
+local coroutine = coroutine or require "coroutine"
+local debug = require "debug"
+-- protect require "os" as it may fail on embedded systems without os module
+local os = os or (function(module)
+ local ok, res = pcall(require, module)
+ return ok and res or nil
+end)("os")
+
+local mobdebug = {
+ _NAME = "mobdebug",
+ _VERSION = 0.628,
+ _COPYRIGHT = "Paul Kulchenko",
+ _DESCRIPTION = "Mobile Remote Debugger for the Lua programming language",
+ port = os and os.getenv and tonumber((os.getenv("MOBDEBUG_PORT"))) or 8172,
+ checkcount = 200,
+ yieldtimeout = 0.02, -- yield timeout (s)
+ connecttimeout = 2, -- connect timeout (s)
+}
+
+local error = error
+local getfenv = getfenv
+local setfenv = setfenv
+local loadstring = loadstring or load -- "load" replaced "loadstring" in Lua 5.2
+local pairs = pairs
+local setmetatable = setmetatable
+local tonumber = tonumber
+local unpack = table.unpack or unpack
+local rawget = rawget
+local gsub, sub, find = string.gsub, string.sub, string.find
+
+-- if strict.lua is used, then need to avoid referencing some global
+-- variables, as they can be undefined;
+-- use rawget to avoid complaints from strict.lua at run-time.
+-- it's safe to do the initialization here as all these variables
+-- should get defined values (if any) before the debugging starts.
+-- there is also global 'wx' variable, which is checked as part of
+-- the debug loop as 'wx' can be loaded at any time during debugging.
+local genv = _G or _ENV
+local jit = rawget(genv, "jit")
+local MOAICoroutine = rawget(genv, "MOAICoroutine")
+
+-- ngx_lua debugging requires a special handling as its coroutine.*
+-- methods use a different mechanism that doesn't allow resume calls
+-- from debug hook handlers.
+-- Instead, the "original" coroutine.* methods are used.
+-- `rawget` needs to be used to protect against `strict` checks, but
+-- ngx_lua hides those in a metatable, so need to use that.
+local metagindex = getmetatable(genv) and getmetatable(genv).__index
+local ngx = type(metagindex) == "table" and metagindex.rawget and metagindex:rawget("ngx") or nil
+local corocreate = ngx and coroutine._create or coroutine.create
+local cororesume = ngx and coroutine._resume or coroutine.resume
+local coroyield = ngx and coroutine._yield or coroutine.yield
+local corostatus = ngx and coroutine._status or coroutine.status
+local corowrap = coroutine.wrap
+
+if not setfenv then -- Lua 5.2+
+ -- based on http://lua-users.org/lists/lua-l/2010-06/msg00314.html
+ -- this assumes f is a function
+ local function findenv(f)
+ local level = 1
+ repeat
+ local name, value = debug.getupvalue(f, level)
+ if name == '_ENV' then return level, value end
+ level = level + 1
+ until name == nil
+ return nil end
+ getfenv = function (f) return(select(2, findenv(f)) or _G) end
+ setfenv = function (f, t)
+ local level = findenv(f)
+ if level then debug.setupvalue(f, level, t) end
+ return f end
+end
+
+-- check for OS and convert file names to lower case on windows
+-- (its file system is case insensitive, but case preserving), as setting a
+-- breakpoint on x:\Foo.lua will not work if the file was loaded as X:\foo.lua.
+-- OSX and Windows behave the same way (case insensitive, but case preserving).
+-- OSX can be configured to be case-sensitive, so check for that. This doesn't
+-- handle the case of different partitions having different case-sensitivity.
+local win = os and os.getenv and (os.getenv('WINDIR') or (os.getenv('OS') or ''):match('[Ww]indows')) and true or false
+local mac = not win and (os and os.getenv and os.getenv('DYLD_LIBRARY_PATH') or not io.open("/proc")) and true or false
+local iscasepreserving = win or (mac and io.open('/library') ~= nil)
+
+-- turn jit off based on Mike Pall's comment in this discussion:
+-- http://www.freelists.org/post/luajit/Debug-hooks-and-JIT,2
+-- "You need to turn it off at the start if you plan to receive
+-- reliable hook calls at any later point in time."
+if jit and jit.off then jit.off() end
+
+local socket = require "socket"
+local coro_debugger
+local coro_debugee
+local coroutines = {}; setmetatable(coroutines, {__mode = "k"}) -- "weak" keys
+local events = { BREAK = 1, WATCH = 2, RESTART = 3, STACK = 4 }
+local breakpoints = {}
+local watches = {}
+local lastsource
+local lastfile
+local watchescnt = 0
+local abort -- default value is nil; this is used in start/loop distinction
+local seen_hook = false
+local checkcount = 0
+local step_into = false
+local step_over = false
+local step_level = 0
+local stack_level = 0
+local server
+local buf
+local outputs = {}
+local iobase = {print = print}
+local basedir = ""
+local deferror = "execution aborted at default debugee"
+local debugee = function ()
+ local a = 1
+ for _ = 1, 10 do a = a + 1 end
+ error(deferror)
+end
+local function q(s) return string.gsub(s, '([%(%)%.%%%+%-%*%?%[%^%$%]])','%%%1') end
+
+local serpent = (function() ---- include Serpent module for serialization
+local n, v = "serpent", 0.285 -- (C) 2012-15 Paul Kulchenko; MIT License
+local c, d = "Paul Kulchenko", "Lua serializer and pretty printer"
+local snum = {[tostring(1/0)]='1/0 --[[math.huge]]',[tostring(-1/0)]='-1/0 --[[-math.huge]]',[tostring(0/0)]='0/0'}
+local badtype = {thread = true, userdata = true, cdata = true}
+local getmetatable = debug and debug.getmetatable or getmetatable
+local keyword, globals, G = {}, {}, (_G or _ENV)
+for _,k in ipairs({'and', 'break', 'do', 'else', 'elseif', 'end', 'false',
+ 'for', 'function', 'goto', 'if', 'in', 'local', 'nil', 'not', 'or', 'repeat',
+ 'return', 'then', 'true', 'until', 'while'}) do keyword[k] = true end
+for k,v in pairs(G) do globals[v] = k end -- build func to name mapping
+for _,g in ipairs({'coroutine', 'debug', 'io', 'math', 'string', 'table', 'os'}) do
+ for k,v in pairs(type(G[g]) == 'table' and G[g] or {}) do globals[v] = g..'.'..k end end
+
+local function s(t, opts)
+ local name, indent, fatal, maxnum = opts.name, opts.indent, opts.fatal, opts.maxnum
+ local sparse, custom, huge = opts.sparse, opts.custom, not opts.nohuge
+ local space, maxl = (opts.compact and '' or ' '), (opts.maxlevel or math.huge)
+ local iname, comm = '_'..(name or ''), opts.comment and (tonumber(opts.comment) or math.huge)
+ local numformat = opts.numformat or "%.17g"
+ local seen, sref, syms, symn = {}, {'local '..iname..'={}'}, {}, 0
+ local function gensym(val) return '_'..(tostring(tostring(val)):gsub("[^%w]",""):gsub("(%d%w+)",
+ -- tostring(val) is needed because __tostring may return a non-string value
+ function(s) if not syms[s] then symn = symn+1; syms[s] = symn end return tostring(syms[s]) end)) end
+ local function safestr(s) return type(s) == "number" and tostring(huge and snum[tostring(s)] or numformat:format(s))
+ or type(s) ~= "string" and tostring(s) -- escape NEWLINE/010 and EOF/026
+ or ("%q"):format(s):gsub("\010","n"):gsub("\026","\\026") end
+ local function comment(s,l) return comm and (l or 0) < comm and ' --[['..select(2, pcall(tostring, s))..']]' or '' end
+ local function globerr(s,l) return globals[s] and globals[s]..comment(s,l) or not fatal
+ and safestr(select(2, pcall(tostring, s))) or error("Can't serialize "..tostring(s)) end
+ local function safename(path, name) -- generates foo.bar, foo[3], or foo['b a r']
+ local n = name == nil and '' or name
+ local plain = type(n) == "string" and n:match("^[%l%u_][%w_]*$") and not keyword[n]
+ local safe = plain and n or '['..safestr(n)..']'
+ return (path or '')..(plain and path and '.' or '')..safe, safe end
+ local alphanumsort = type(opts.sortkeys) == 'function' and opts.sortkeys or function(k, o, n) -- k=keys, o=originaltable, n=padding
+ local maxn, to = tonumber(n) or 12, {number = 'a', string = 'b'}
+ local function padnum(d) return ("%0"..tostring(maxn).."d"):format(tonumber(d)) end
+ table.sort(k, function(a,b)
+ -- sort numeric keys first: k[key] is not nil for numerical keys
+ return (k[a] ~= nil and 0 or to[type(a)] or 'z')..(tostring(a):gsub("%d+",padnum))
+ < (k[b] ~= nil and 0 or to[type(b)] or 'z')..(tostring(b):gsub("%d+",padnum)) end) end
+ local function val2str(t, name, indent, insref, path, plainindex, level)
+ local ttype, level, mt = type(t), (level or 0), getmetatable(t)
+ local spath, sname = safename(path, name)
+ local tag = plainindex and
+ ((type(name) == "number") and '' or name..space..'='..space) or
+ (name ~= nil and sname..space..'='..space or '')
+ if seen[t] then -- already seen this element
+ sref[#sref+1] = spath..space..'='..space..seen[t]
+ return tag..'nil'..comment('ref', level) end
+ -- protect from those cases where __tostring may fail
+ if type(mt) == 'table' and pcall(function() return mt.__tostring and mt.__tostring(t) end)
+ and (mt.__serialize or mt.__tostring) then -- knows how to serialize itself
+ seen[t] = insref or spath
+ if mt.__serialize then t = mt.__serialize(t) else t = tostring(t) end
+ ttype = type(t) end -- new value falls through to be serialized
+ if ttype == "table" then
+ if level >= maxl then return tag..'{}'..comment('max', level) end
+ seen[t] = insref or spath
+ if next(t) == nil then return tag..'{}'..comment(t, level) end -- table empty
+ local maxn, o, out = math.min(#t, maxnum or #t), {}, {}
+ for key = 1, maxn do o[key] = key end
+ if not maxnum or #o < maxnum then
+ local n = #o -- n = n + 1; o[n] is much faster than o[#o+1] on large tables
+ for key in pairs(t) do if o[key] ~= key then n = n + 1; o[n] = key end end end
+ if maxnum and #o > maxnum then o[maxnum+1] = nil end
+ if opts.sortkeys and #o > maxn then alphanumsort(o, t, opts.sortkeys) end
+ local sparse = sparse and #o > maxn -- disable sparsness if only numeric keys (shorter output)
+ for n, key in ipairs(o) do
+ local value, ktype, plainindex = t[key], type(key), n <= maxn and not sparse
+ if opts.valignore and opts.valignore[value] -- skip ignored values; do nothing
+ or opts.keyallow and not opts.keyallow[key]
+ or opts.keyignore and opts.keyignore[key]
+ or opts.valtypeignore and opts.valtypeignore[type(value)] -- skipping ignored value types
+ or sparse and value == nil then -- skipping nils; do nothing
+ elseif ktype == 'table' or ktype == 'function' or badtype[ktype] then
+ if not seen[key] and not globals[key] then
+ sref[#sref+1] = 'placeholder'
+ local sname = safename(iname, gensym(key)) -- iname is table for local variables
+ sref[#sref] = val2str(key,sname,indent,sname,iname,true) end
+ sref[#sref+1] = 'placeholder'
+ local path = seen[t]..'['..tostring(seen[key] or globals[key] or gensym(key))..']'
+ sref[#sref] = path..space..'='..space..tostring(seen[value] or val2str(value,nil,indent,path))
+ else
+ out[#out+1] = val2str(value,key,indent,insref,seen[t],plainindex,level+1)
+ end
+ end
+ local prefix = string.rep(indent or '', level)
+ local head = indent and '{\n'..prefix..indent or '{'
+ local body = table.concat(out, ','..(indent and '\n'..prefix..indent or space))
+ local tail = indent and "\n"..prefix..'}' or '}'
+ return (custom and custom(tag,head,body,tail) or tag..head..body..tail)..comment(t, level)
+ elseif badtype[ttype] then
+ seen[t] = insref or spath
+ return tag..globerr(t, level)
+ elseif ttype == 'function' then
+ seen[t] = insref or spath
+ local ok, res = pcall(string.dump, t)
+ local func = ok and ((opts.nocode and "function() --[[..skipped..]] end" or
+ "((loadstring or load)("..safestr(res)..",'@serialized'))")..comment(t, level))
+ return tag..(func or globerr(t, level))
+ else return tag..safestr(t) end -- handle all other types
+ end
+ local sepr = indent and "\n" or ";"..space
+ local body = val2str(t, name, indent) -- this call also populates sref
+ local tail = #sref>1 and table.concat(sref, sepr)..sepr or ''
+ local warn = opts.comment and #sref>1 and space.."--[[incomplete output with shared/self-references skipped]]" or ''
+ return not name and body..warn or "do local "..body..sepr..tail.."return "..name..sepr.."end"
+end
+
+local function deserialize(data, opts)
+ local env = (opts and opts.safe == false) and G
+ or setmetatable({}, {
+ __index = function(t,k) return t end,
+ __call = function(t,...) error("cannot call functions") end
+ })
+ local f, res = (loadstring or load)('return '..data, nil, nil, env)
+ if not f then f, res = (loadstring or load)(data, nil, nil, env) end
+ if not f then return f, res end
+ if setfenv then setfenv(f, env) end
+ return pcall(f)
+end
+
+local function merge(a, b) if b then for k,v in pairs(b) do a[k] = v end end; return a; end
+return { _NAME = n, _COPYRIGHT = c, _DESCRIPTION = d, _VERSION = v, serialize = s,
+ load = deserialize,
+ dump = function(a, opts) return s(a, merge({name = '_', compact = true, sparse = true}, opts)) end,
+ line = function(a, opts) return s(a, merge({sortkeys = true, comment = true}, opts)) end,
+ block = function(a, opts) return s(a, merge({indent = ' ', sortkeys = true, comment = true}, opts)) end }
+end)() ---- end of Serpent module
+
+mobdebug.line = serpent.line
+mobdebug.dump = serpent.dump
+mobdebug.linemap = nil
+mobdebug.loadstring = loadstring
+
+local function removebasedir(path, basedir)
+ if iscasepreserving then
+ -- check if the lowercased path matches the basedir
+ -- if so, return substring of the original path (to not lowercase it)
+ return path:lower():find('^'..q(basedir:lower()))
+ and path:sub(#basedir+1) or path
+ else
+ return string.gsub(path, '^'..q(basedir), '')
+ end
+end
+
+local function stack(start)
+ local function vars(f)
+ local func = debug.getinfo(f, "f").func
+ local i = 1
+ local locals = {}
+ -- get locals
+ while true do
+ local name, value = debug.getlocal(f, i)
+ if not name then break end
+ if string.sub(name, 1, 1) ~= '(' then locals[name] = {value, tostring(value)} end
+ i = i + 1
+ end
+ -- get varargs (these use negative indices)
+ i = 1
+ while true do
+ local name, value = debug.getlocal(f, -i)
+ if not name then break end
+ locals[name:gsub("%)$"," "..i..")")] = {value, tostring(value)}
+ i = i + 1
+ end
+ -- get upvalues
+ i = 1
+ local ups = {}
+ while func and true do -- check for func as it may be nil for tail calls
+ local name, value = debug.getupvalue(func, i)
+ if not name then break end
+ ups[name] = {value, tostring(value)}
+ i = i + 1
+ end
+ return locals, ups
+ end
+
+ local stack = {}
+ local linemap = mobdebug.linemap
+ for i = (start or 0), 100 do
+ local source = debug.getinfo(i, "Snl")
+ if not source then break end
+
+ local src = source.source
+ if src:find("@") == 1 then
+ src = src:sub(2):gsub("\\", "/")
+ if src:find("%./") == 1 then src = src:sub(3) end
+ end
+
+ table.insert(stack, { -- remove basedir from source
+ {source.name, removebasedir(src, basedir),
+ linemap and linemap(source.linedefined, source.source) or source.linedefined,
+ linemap and linemap(source.currentline, source.source) or source.currentline,
+ source.what, source.namewhat, source.short_src},
+ vars(i+1)})
+ if source.what == 'main' then break end
+ end
+ return stack
+end
+
+local function set_breakpoint(file, line)
+ if file == '-' and lastfile then file = lastfile
+ elseif iscasepreserving then file = string.lower(file) end
+ if not breakpoints[line] then breakpoints[line] = {} end
+ breakpoints[line][file] = true
+end
+
+local function remove_breakpoint(file, line)
+ if file == '-' and lastfile then file = lastfile
+ elseif file == '*' and line == 0 then breakpoints = {}
+ elseif iscasepreserving then file = string.lower(file) end
+ if breakpoints[line] then breakpoints[line][file] = nil end
+end
+
+local function has_breakpoint(file, line)
+ return breakpoints[line]
+ and breakpoints[line][iscasepreserving and string.lower(file) or file]
+end
+
+local function restore_vars(vars)
+ if type(vars) ~= 'table' then return end
+
+ -- locals need to be processed in the reverse order, starting from
+ -- the inner block out, to make sure that the localized variables
+ -- are correctly updated with only the closest variable with
+ -- the same name being changed
+ -- first loop find how many local variables there is, while
+ -- the second loop processes them from i to 1
+ local i = 1
+ while true do
+ local name = debug.getlocal(3, i)
+ if not name then break end
+ i = i + 1
+ end
+ i = i - 1
+ local written_vars = {}
+ while i > 0 do
+ local name = debug.getlocal(3, i)
+ if not written_vars[name] then
+ if string.sub(name, 1, 1) ~= '(' then
+ debug.setlocal(3, i, rawget(vars, name))
+ end
+ written_vars[name] = true
+ end
+ i = i - 1
+ end
+
+ i = 1
+ local func = debug.getinfo(3, "f").func
+ while true do
+ local name = debug.getupvalue(func, i)
+ if not name then break end
+ if not written_vars[name] then
+ if string.sub(name, 1, 1) ~= '(' then
+ debug.setupvalue(func, i, rawget(vars, name))
+ end
+ written_vars[name] = true
+ end
+ i = i + 1
+ end
+end
+
+local function capture_vars(level)
+ local vars = {}
+ local func = debug.getinfo(level or 3, "f").func
+ local i = 1
+ while true do
+ local name, value = debug.getupvalue(func, i)
+ if not name then break end
+ if string.sub(name, 1, 1) ~= '(' then vars[name] = value end
+ i = i + 1
+ end
+ i = 1
+ while true do
+ local name, value = debug.getlocal(level or 3, i)
+ if not name then break end
+ if string.sub(name, 1, 1) ~= '(' then vars[name] = value end
+ i = i + 1
+ end
+ -- returned 'vars' table plays a dual role: (1) it captures local values
+ -- and upvalues to be restored later (in case they are modified in "eval"),
+ -- and (2) it provides an environment for evaluated chunks.
+ -- getfenv(func) is needed to provide proper environment for functions,
+ -- including access to globals, but this causes vars[name] to fail in
+ -- restore_vars on local variables or upvalues with `nil` values when
+ -- 'strict' is in effect. To avoid this `rawget` is used in restore_vars.
+ setmetatable(vars, { __index = getfenv(func), __newindex = getfenv(func) })
+ return vars
+end
+
+local function stack_depth(start_depth)
+ for i = start_depth, 0, -1 do
+ if debug.getinfo(i, "l") then return i+1 end
+ end
+ return start_depth
+end
+
+local function is_safe(stack_level)
+ -- the stack grows up: 0 is getinfo, 1 is is_safe, 2 is debug_hook, 3 is user function
+ if stack_level == 3 then return true end
+ for i = 3, stack_level do
+ -- return if it is not safe to abort
+ local info = debug.getinfo(i, "S")
+ if not info then return true end
+ if info.what == "C" then return false end
+ end
+ return true
+end
+
+local function in_debugger()
+ local this = debug.getinfo(1, "S").source
+ -- only need to check few frames as mobdebug frames should be close
+ for i = 3, 7 do
+ local info = debug.getinfo(i, "S")
+ if not info then return false end
+ if info.source == this then return true end
+ end
+ return false
+end
+
+local function is_pending(peer)
+ -- if there is something already in the buffer, skip check
+ if not buf and checkcount >= mobdebug.checkcount then
+ peer:settimeout(0) -- non-blocking
+ buf = peer:receive(1)
+ peer:settimeout() -- back to blocking
+ checkcount = 0
+ end
+ return buf
+end
+
+local function readnext(peer, num)
+ peer:settimeout(0) -- non-blocking
+ local res, err, partial = peer:receive(num)
+ peer:settimeout() -- back to blocking
+ return res or partial or '', err
+end
+
+local function handle_breakpoint(peer)
+ -- check if the buffer has the beginning of SETB/DELB command;
+ -- this is to avoid reading the entire line for commands that
+ -- don't need to be handled here.
+ if not buf or not (buf:sub(1,1) == 'S' or buf:sub(1,1) == 'D') then return end
+
+ -- check second character to avoid reading STEP or other S* and D* commands
+ if #buf == 1 then buf = buf .. readnext(peer, 1) end
+ if buf:sub(2,2) ~= 'E' then return end
+
+ -- need to read few more characters
+ buf = buf .. readnext(peer, 5-#buf)
+ if buf ~= 'SETB ' and buf ~= 'DELB ' then return end
+
+ local res, _, partial = peer:receive() -- get the rest of the line; blocking
+ if not res then
+ if partial then buf = buf .. partial end
+ return
+ end
+
+ local _, _, cmd, file, line = (buf..res):find("^([A-Z]+)%s+(.-)%s+(%d+)%s*$")
+ if cmd == 'SETB' then set_breakpoint(file, tonumber(line))
+ elseif cmd == 'DELB' then remove_breakpoint(file, tonumber(line))
+ else
+ -- this looks like a breakpoint command, but something went wrong;
+ -- return here to let the "normal" processing to handle,
+ -- although this is likely to not go well.
+ return
+ end
+
+ buf = nil
+end
+
+local function debug_hook(event, line)
+ -- (1) LuaJIT needs special treatment. Because debug_hook is set for
+ -- *all* coroutines, and not just the one being debugged as in regular Lua
+ -- (http://lua-users.org/lists/lua-l/2011-06/msg00513.html),
+ -- need to avoid debugging mobdebug's own code as LuaJIT doesn't
+ -- always correctly generate call/return hook events (there are more
+ -- calls than returns, which breaks stack depth calculation and
+ -- 'step' and 'step over' commands stop working; possibly because
+ -- 'tail return' events are not generated by LuaJIT).
+ -- the next line checks if the debugger is run under LuaJIT and if
+ -- one of debugger methods is present in the stack, it simply returns.
+ if jit then
+ -- when luajit is compiled with LUAJIT_ENABLE_LUA52COMPAT,
+ -- coroutine.running() returns non-nil for the main thread.
+ local coro, main = coroutine.running()
+ if not coro or main then coro = 'main' end
+ local disabled = coroutines[coro] == false
+ or coroutines[coro] == nil and coro ~= (coro_debugee or 'main')
+ if coro_debugee and disabled or not coro_debugee and (disabled or in_debugger())
+ then return end
+ end
+
+ -- (2) check if abort has been requested and it's safe to abort
+ if abort and is_safe(stack_level) then error(abort) end
+
+ -- (3) also check if this debug hook has not been visited for any reason.
+ -- this check is needed to avoid stepping in too early
+ -- (for example, when coroutine.resume() is executed inside start()).
+ if not seen_hook and in_debugger() then return end
+
+ if event == "call" then
+ stack_level = stack_level + 1
+ elseif event == "return" or event == "tail return" then
+ stack_level = stack_level - 1
+ elseif event == "line" then
+ if mobdebug.linemap then
+ local ok, mappedline = pcall(mobdebug.linemap, line, debug.getinfo(2, "S").source)
+ if ok then line = mappedline end
+ if not line then return end
+ end
+
+ -- may need to fall through because of the following:
+ -- (1) step_into
+ -- (2) step_over and stack_level <= step_level (need stack_level)
+ -- (3) breakpoint; check for line first as it's known; then for file
+ -- (4) socket call (only do every Xth check)
+ -- (5) at least one watch is registered
+ if not (
+ step_into or step_over or breakpoints[line] or watchescnt > 0
+ or is_pending(server)
+ ) then checkcount = checkcount + 1; return end
+
+ checkcount = mobdebug.checkcount -- force check on the next command
+
+ -- this is needed to check if the stack got shorter or longer.
+ -- unfortunately counting call/return calls is not reliable.
+ -- the discrepancy may happen when "pcall(load, '')" call is made
+ -- or when "error()" is called in a function.
+ -- in either case there are more "call" than "return" events reported.
+ -- this validation is done for every "line" event, but should be "cheap"
+ -- as it checks for the stack to get shorter (or longer by one call).
+ -- start from one level higher just in case we need to grow the stack.
+ -- this may happen after coroutine.resume call to a function that doesn't
+ -- have any other instructions to execute. it triggers three returns:
+ -- "return, tail return, return", which needs to be accounted for.
+ stack_level = stack_depth(stack_level+1)
+
+ local caller = debug.getinfo(2, "S")
+
+ -- grab the filename and fix it if needed
+ local file = lastfile
+ if (lastsource ~= caller.source) then
+ file, lastsource = caller.source, caller.source
+ -- technically, users can supply names that may not use '@',
+ -- for example when they call loadstring('...', 'filename.lua').
+ -- Unfortunately, there is no reliable/quick way to figure out
+ -- what is the filename and what is the source code.
+ -- The following will work if the supplied filename uses Unix path.
+ if find(file, "^@") then
+ file = gsub(gsub(file, "^@", ""), "\\", "/")
+ -- need this conversion to be applied to relative and absolute
+ -- file names as you may write "require 'Foo'" to
+ -- load "foo.lua" (on a case insensitive file system) and breakpoints
+ -- set on foo.lua will not work if not converted to the same case.
+ if iscasepreserving then file = string.lower(file) end
+ if find(file, "%./") == 1 then file = sub(file, 3)
+ else file = gsub(file, "^"..q(basedir), "") end
+ -- some file systems allow newlines in file names; remove these.
+ file = gsub(file, "\n", ' ')
+ else
+ -- this is either a file name coming from loadstring("chunk", "file"),
+ -- or the actual source code that needs to be serialized (as it may
+ -- include newlines); assume it's a file name if it's all on one line.
+ if find(file, "[\r\n]") then
+ file = mobdebug.line(file)
+ else
+ if iscasepreserving then file = string.lower(file) end
+ file = gsub(gsub(file, "\\", "/"), find(file, "^%./") and "^%./" or "^"..q(basedir), "")
+ end
+ end
+
+ -- set to true if we got here; this only needs to be done once per
+ -- session, so do it here to at least avoid setting it for every line.
+ seen_hook = true
+ lastfile = file
+ end
+
+ if is_pending(server) then handle_breakpoint(server) end
+
+ local vars, status, res
+ if (watchescnt > 0) then
+ vars = capture_vars()
+ for index, value in pairs(watches) do
+ setfenv(value, vars)
+ local ok, fired = pcall(value)
+ if ok and fired then
+ status, res = cororesume(coro_debugger, events.WATCH, vars, file, line, index)
+ break -- any one watch is enough; don't check multiple times
+ end
+ end
+ end
+
+ -- need to get into the "regular" debug handler, but only if there was
+ -- no watch that was fired. If there was a watch, handle its result.
+ local getin = (status == nil) and
+ (step_into
+ -- when coroutine.running() return `nil` (main thread in Lua 5.1),
+ -- step_over will equal 'main', so need to check for that explicitly.
+ or (step_over and step_over == (coroutine.running() or 'main') and stack_level <= step_level)
+ or has_breakpoint(file, line)
+ or is_pending(server))
+
+ if getin then
+ vars = vars or capture_vars()
+ step_into = false
+ step_over = false
+ status, res = cororesume(coro_debugger, events.BREAK, vars, file, line)
+ end
+
+ -- handle 'stack' command that provides stack() information to the debugger
+ if status and res == 'stack' then
+ while status and res == 'stack' do
+ -- resume with the stack trace and variables
+ if vars then restore_vars(vars) end -- restore vars so they are reflected in stack values
+ -- this may fail if __tostring method fails at run-time
+ local ok, snapshot = pcall(stack, ngx and 5 or 4)
+ status, res = cororesume(coro_debugger, ok and events.STACK or events.BREAK, snapshot, file, line)
+ end
+ end
+
+ -- need to recheck once more as resume after 'stack' command may
+ -- return something else (for example, 'exit'), which needs to be handled
+ if status and res and res ~= 'stack' then
+ if not abort and res == "exit" then mobdebug.onexit(1, true); return end
+ if not abort and res == "done" then mobdebug.done(); return end
+ abort = res
+ -- only abort if safe; if not, there is another (earlier) check inside
+ -- debug_hook, which will abort execution at the first safe opportunity
+ if is_safe(stack_level) then error(abort) end
+ elseif not status and res then
+ error(res, 2) -- report any other (internal) errors back to the application
+ end
+
+ if vars then restore_vars(vars) end
+
+ -- last command requested Step Over/Out; store the current thread
+ if step_over == true then step_over = coroutine.running() or 'main' end
+ end
+end
+
+local function stringify_results(status, ...)
+ if not status then return status, ... end -- on error report as it
+
+ local t = {...}
+ for i,v in pairs(t) do -- stringify each of the returned values
+ local ok, res = pcall(mobdebug.line, v, {nocode = true, comment = 1})
+ t[i] = ok and res or ("%q"):format(res):gsub("\010","n"):gsub("\026","\\026")
+ end
+ -- stringify table with all returned values
+ -- this is done to allow each returned value to be used (serialized or not)
+ -- intependently and to preserve "original" comments
+ return pcall(mobdebug.dump, t, {sparse = false})
+end
+
+local function isrunning()
+ return coro_debugger and (corostatus(coro_debugger) == 'suspended' or corostatus(coro_debugger) == 'running')
+end
+
+-- this is a function that removes all hooks and closes the socket to
+-- report back to the controller that the debugging is done.
+-- the script that called `done` can still continue.
+local function done()
+ if not (isrunning() and server) then return end
+
+ if not jit then
+ for co, debugged in pairs(coroutines) do
+ if debugged then debug.sethook(co) end
+ end
+ end
+
+ debug.sethook()
+ server:close()
+
+ coro_debugger = nil -- to make sure isrunning() returns `false`
+ seen_hook = nil -- to make sure that the next start() call works
+ abort = nil -- to make sure that callback calls use proper "abort" value
+end
+
+local function debugger_loop(sev, svars, sfile, sline)
+ local command
+ local app, osname
+ local eval_env = svars or {}
+ local function emptyWatch () return false end
+ local loaded = {}
+ for k in pairs(package.loaded) do loaded[k] = true end
+
+ while true do
+ local line, err
+ local wx = rawget(genv, "wx") -- use rawread to make strict.lua happy
+ if (wx or mobdebug.yield) and server.settimeout then server:settimeout(mobdebug.yieldtimeout) end
+ while true do
+ line, err = server:receive()
+ if not line and err == "timeout" then
+ -- yield for wx GUI applications if possible to avoid "busyness"
+ app = app or (wx and wx.wxGetApp and wx.wxGetApp())
+ if app then
+ local win = app:GetTopWindow()
+ local inloop = app:IsMainLoopRunning()
+ osname = osname or wx.wxPlatformInfo.Get():GetOperatingSystemFamilyName()
+ if win and not inloop then
+ -- process messages in a regular way
+ -- and exit as soon as the event loop is idle
+ if osname == 'Unix' then wx.wxTimer(app):Start(10, true) end
+ local exitLoop = function()
+ win:Disconnect(wx.wxID_ANY, wx.wxID_ANY, wx.wxEVT_IDLE)
+ win:Disconnect(wx.wxID_ANY, wx.wxID_ANY, wx.wxEVT_TIMER)
+ app:ExitMainLoop()
+ end
+ win:Connect(wx.wxEVT_IDLE, exitLoop)
+ win:Connect(wx.wxEVT_TIMER, exitLoop)
+ app:MainLoop()
+ end
+ elseif mobdebug.yield then mobdebug.yield()
+ end
+ elseif not line and err == "closed" then
+ error("Debugger connection closed", 0)
+ else
+ -- if there is something in the pending buffer, prepend it to the line
+ if buf then line = buf .. line; buf = nil end
+ break
+ end
+ end
+ if server.settimeout then server:settimeout() end -- back to blocking
+ command = string.sub(line, string.find(line, "^[A-Z]+"))
+ if command == "SETB" then
+ local _, _, _, file, line = string.find(line, "^([A-Z]+)%s+(.-)%s+(%d+)%s*$")
+ if file and line then
+ set_breakpoint(file, tonumber(line))
+ server:send("200 OK\n")
+ else
+ server:send("400 Bad Request\n")
+ end
+ elseif command == "DELB" then
+ local _, _, _, file, line = string.find(line, "^([A-Z]+)%s+(.-)%s+(%d+)%s*$")
+ if file and line then
+ remove_breakpoint(file, tonumber(line))
+ server:send("200 OK\n")
+ else
+ server:send("400 Bad Request\n")
+ end
+ elseif command == "EXEC" then
+ local _, _, chunk = string.find(line, "^[A-Z]+%s+(.+)$")
+ if chunk then
+ local func, res = mobdebug.loadstring(chunk)
+ local status
+ if func then
+ setfenv(func, eval_env)
+ status, res = stringify_results(pcall(func))
+ end
+ if status then
+ server:send("200 OK " .. tostring(#res) .. "\n")
+ server:send(res)
+ else
+ -- fix error if not set (for example, when loadstring is not present)
+ if not res then res = "Unknown error" end
+ server:send("401 Error in Expression " .. tostring(#res) .. "\n")
+ server:send(res)
+ end
+ else
+ server:send("400 Bad Request\n")
+ end
+ elseif command == "LOAD" then
+ local _, _, size, name = string.find(line, "^[A-Z]+%s+(%d+)%s+(%S.-)%s*$")
+ size = tonumber(size)
+
+ if abort == nil then -- no LOAD/RELOAD allowed inside start()
+ if size > 0 then server:receive(size) end
+ if sfile and sline then
+ server:send("201 Started " .. sfile .. " " .. tostring(sline) .. "\n")
+ else
+ server:send("200 OK 0\n")
+ end
+ else
+ -- reset environment to allow required modules to load again
+ -- remove those packages that weren't loaded when debugger started
+ for k in pairs(package.loaded) do
+ if not loaded[k] then package.loaded[k] = nil end
+ end
+
+ if size == 0 and name == '-' then -- RELOAD the current script being debugged
+ server:send("200 OK 0\n")
+ coroyield("load")
+ else
+ -- receiving 0 bytes blocks (at least in luasocket 2.0.2), so skip reading
+ local chunk = size == 0 and "" or server:receive(size)
+ if chunk then -- LOAD a new script for debugging
+ local func, res = mobdebug.loadstring(chunk, "@"..name)
+ if func then
+ server:send("200 OK 0\n")
+ debugee = func
+ coroyield("load")
+ else
+ server:send("401 Error in Expression " .. tostring(#res) .. "\n")
+ server:send(res)
+ end
+ else
+ server:send("400 Bad Request\n")
+ end
+ end
+ end
+ elseif command == "SETW" then
+ local _, _, exp = string.find(line, "^[A-Z]+%s+(.+)%s*$")
+ if exp then
+ local func, res = mobdebug.loadstring("return(" .. exp .. ")")
+ if func then
+ watchescnt = watchescnt + 1
+ local newidx = #watches + 1
+ watches[newidx] = func
+ server:send("200 OK " .. tostring(newidx) .. "\n")
+ else
+ server:send("401 Error in Expression " .. tostring(#res) .. "\n")
+ server:send(res)
+ end
+ else
+ server:send("400 Bad Request\n")
+ end
+ elseif command == "DELW" then
+ local _, _, index = string.find(line, "^[A-Z]+%s+(%d+)%s*$")
+ index = tonumber(index)
+ if index > 0 and index <= #watches then
+ watchescnt = watchescnt - (watches[index] ~= emptyWatch and 1 or 0)
+ watches[index] = emptyWatch
+ server:send("200 OK\n")
+ else
+ server:send("400 Bad Request\n")
+ end
+ elseif command == "RUN" then
+ server:send("200 OK\n")
+
+ local ev, vars, file, line, idx_watch = coroyield()
+ eval_env = vars
+ if ev == events.BREAK then
+ server:send("202 Paused " .. file .. " " .. tostring(line) .. "\n")
+ elseif ev == events.WATCH then
+ server:send("203 Paused " .. file .. " " .. tostring(line) .. " " .. tostring(idx_watch) .. "\n")
+ elseif ev == events.RESTART then
+ -- nothing to do
+ else
+ server:send("401 Error in Execution " .. tostring(#file) .. "\n")
+ server:send(file)
+ end
+ elseif command == "STEP" then
+ server:send("200 OK\n")
+ step_into = true
+
+ local ev, vars, file, line, idx_watch = coroyield()
+ eval_env = vars
+ if ev == events.BREAK then
+ server:send("202 Paused " .. file .. " " .. tostring(line) .. "\n")
+ elseif ev == events.WATCH then
+ server:send("203 Paused " .. file .. " " .. tostring(line) .. " " .. tostring(idx_watch) .. "\n")
+ elseif ev == events.RESTART then
+ -- nothing to do
+ else
+ server:send("401 Error in Execution " .. tostring(#file) .. "\n")
+ server:send(file)
+ end
+ elseif command == "OVER" or command == "OUT" then
+ server:send("200 OK\n")
+ step_over = true
+
+ -- OVER and OUT are very similar except for
+ -- the stack level value at which to stop
+ if command == "OUT" then step_level = stack_level - 1
+ else step_level = stack_level end
+
+ local ev, vars, file, line, idx_watch = coroyield()
+ eval_env = vars
+ if ev == events.BREAK then
+ server:send("202 Paused " .. file .. " " .. tostring(line) .. "\n")
+ elseif ev == events.WATCH then
+ server:send("203 Paused " .. file .. " " .. tostring(line) .. " " .. tostring(idx_watch) .. "\n")
+ elseif ev == events.RESTART then
+ -- nothing to do
+ else
+ server:send("401 Error in Execution " .. tostring(#file) .. "\n")
+ server:send(file)
+ end
+ elseif command == "BASEDIR" then
+ local _, _, dir = string.find(line, "^[A-Z]+%s+(.+)%s*$")
+ if dir then
+ basedir = iscasepreserving and string.lower(dir) or dir
+ -- reset cached source as it may change with basedir
+ lastsource = nil
+ server:send("200 OK\n")
+ else
+ server:send("400 Bad Request\n")
+ end
+ elseif command == "SUSPEND" then
+ -- do nothing; it already fulfilled its role
+ elseif command == "DONE" then
+ coroyield("done")
+ return -- done with all the debugging
+ elseif command == "STACK" then
+ -- first check if we can execute the stack command
+ -- as it requires yielding back to debug_hook it cannot be executed
+ -- if we have not seen the hook yet as happens after start().
+ -- in this case we simply return an empty result
+ local vars, ev = {}
+ if seen_hook then
+ ev, vars = coroyield("stack")
+ end
+ if ev and ev ~= events.STACK then
+ server:send("401 Error in Execution " .. tostring(#vars) .. "\n")
+ server:send(vars)
+ else
+ local ok, res = pcall(mobdebug.dump, vars, {nocode = true, sparse = false})
+ if ok then
+ server:send("200 OK " .. tostring(res) .. "\n")
+ else
+ server:send("401 Error in Execution " .. tostring(#res) .. "\n")
+ server:send(res)
+ end
+ end
+ elseif command == "OUTPUT" then
+ local _, _, stream, mode = string.find(line, "^[A-Z]+%s+(%w+)%s+([dcr])%s*$")
+ if stream and mode and stream == "stdout" then
+ -- assign "print" in the global environment
+ local default = mode == 'd'
+ genv.print = default and iobase.print or corowrap(function()
+ -- wrapping into coroutine.wrap protects this function from
+ -- being stepped through in the debugger.
+ -- don't use vararg (...) as it adds a reference for its values,
+ -- which may affect how they are garbage collected
+ while true do
+ local tbl = {coroutine.yield()}
+ if mode == 'c' then iobase.print(unpack(tbl)) end
+ for n = 1, #tbl do
+ tbl[n] = select(2, pcall(mobdebug.line, tbl[n], {nocode = true, comment = false})) end
+ local file = table.concat(tbl, "\t").."\n"
+ server:send("204 Output " .. stream .. " " .. tostring(#file) .. "\n" .. file)
+ end
+ end)
+ if not default then genv.print() end -- "fake" print to start printing loop
+ server:send("200 OK\n")
+ else
+ server:send("400 Bad Request\n")
+ end
+ elseif command == "EXIT" then
+ server:send("200 OK\n")
+ coroyield("exit")
+ else
+ server:send("400 Bad Request\n")
+ end
+ end
+end
+
+local function connect(controller_host, controller_port)
+ local sock, err = socket.tcp()
+ if not sock then return nil, err end
+
+ if sock.settimeout then sock:settimeout(mobdebug.connecttimeout) end
+ local res, err = sock:connect(controller_host, tostring(controller_port))
+ if sock.settimeout then sock:settimeout() end
+
+ if not res then return nil, err end
+ return sock
+end
+
+local lasthost, lastport
+
+-- Starts a debug session by connecting to a controller
+local function start(controller_host, controller_port)
+ -- only one debugging session can be run (as there is only one debug hook)
+ if isrunning() then return end
+
+ lasthost = controller_host or lasthost
+ lastport = controller_port or lastport
+
+ controller_host = lasthost or "localhost"
+ controller_port = lastport or mobdebug.port
+
+ local err
+ server, err = mobdebug.connect(controller_host, controller_port)
+ if server then
+ -- correct stack depth which already has some calls on it
+ -- so it doesn't go into negative when those calls return
+ -- as this breaks subsequence checks in stack_depth().
+ -- start from 16th frame, which is sufficiently large for this check.
+ stack_level = stack_depth(16)
+
+ -- provide our own traceback function to report the error remotely
+ do
+ local dtraceback = debug.traceback
+ debug.traceback = function (...)
+ if select('#', ...) >= 1 then
+ local err, lvl = ...
+ if err and type(err) ~= 'thread' then
+ local trace = dtraceback(err, (lvl or 2)+1)
+ if genv.print == iobase.print then -- no remote redirect
+ return trace
+ else
+ genv.print(trace) -- report the error remotely
+ return -- don't report locally to avoid double reporting
+ end
+ end
+ end
+ -- direct call to debug.traceback: return the original.
+ -- debug.traceback(nil, level) doesn't work in Lua 5.1
+ -- (http://lua-users.org/lists/lua-l/2011-06/msg00574.html), so
+ -- simply remove first frame from the stack trace
+ return (dtraceback(...):gsub("(stack traceback:\n)[^\n]*\n", "%1"))
+ end
+ end
+ coro_debugger = corocreate(debugger_loop)
+ debug.sethook(debug_hook, "lcr")
+ seen_hook = nil -- reset in case the last start() call was refused
+ step_into = true -- start with step command
+ return true
+ else
+ print(("Could not connect to %s:%s: %s")
+ :format(controller_host, controller_port, err or "unknown error"))
+ end
+end
+
+local function controller(controller_host, controller_port, scratchpad)
+ -- only one debugging session can be run (as there is only one debug hook)
+ if isrunning() then return end
+
+ lasthost = controller_host or lasthost
+ lastport = controller_port or lastport
+
+ controller_host = lasthost or "localhost"
+ controller_port = lastport or mobdebug.port
+
+ local exitonerror = not scratchpad
+ local err
+ server, err = mobdebug.connect(controller_host, controller_port)
+ if server then
+ local function report(trace, err)
+ local msg = err .. "\n" .. trace
+ server:send("401 Error in Execution " .. tostring(#msg) .. "\n")
+ server:send(msg)
+ return err
+ end
+
+ seen_hook = true -- allow to accept all commands
+ coro_debugger = corocreate(debugger_loop)
+
+ while true do
+ step_into = true -- start with step command
+ abort = false -- reset abort flag from the previous loop
+ if scratchpad then checkcount = mobdebug.checkcount end -- force suspend right away
+
+ coro_debugee = corocreate(debugee)
+ debug.sethook(coro_debugee, debug_hook, "lcr")
+ local status, err = cororesume(coro_debugee)
+
+ -- was there an error or is the script done?
+ -- 'abort' state is allowed here; ignore it
+ if abort then
+ if tostring(abort) == 'exit' then break end
+ else
+ if status then -- normal execution is done
+ break
+ elseif err and not string.find(tostring(err), deferror) then
+ -- report the error back
+ -- err is not necessarily a string, so convert to string to report
+ report(debug.traceback(coro_debugee), tostring(err))
+ if exitonerror then break end
+ -- check if the debugging is done (coro_debugger is nil)
+ if not coro_debugger then break end
+ -- resume once more to clear the response the debugger wants to send
+ -- need to use capture_vars(2) as three would be the level of
+ -- the caller for controller(), but because of the tail call,
+ -- the caller may not exist;
+ -- This is not entirely safe as the user may see the local
+ -- variable from console, but they will be reset anyway.
+ -- This functionality is used when scratchpad is paused to
+ -- gain access to remote console to modify global variables.
+ local status, err = cororesume(coro_debugger, events.RESTART, capture_vars(2))
+ if not status or status and err == "exit" then break end
+ end
+ end
+ end
+ else
+ print(("Could not connect to %s:%s: %s")
+ :format(controller_host, controller_port, err or "unknown error"))
+ return false
+ end
+ return true
+end
+
+local function scratchpad(controller_host, controller_port)
+ return controller(controller_host, controller_port, true)
+end
+
+local function loop(controller_host, controller_port)
+ return controller(controller_host, controller_port, false)
+end
+
+local function on()
+ if not (isrunning() and server) then return end
+
+ -- main is set to true under Lua5.2 for the "main" chunk.
+ -- Lua5.1 returns co as `nil` in that case.
+ local co, main = coroutine.running()
+ if main then co = nil end
+ if co then
+ coroutines[co] = true
+ debug.sethook(co, debug_hook, "lcr")
+ else
+ if jit then coroutines.main = true end
+ debug.sethook(debug_hook, "lcr")
+ end
+end
+
+local function off()
+ if not (isrunning() and server) then return end
+
+ -- main is set to true under Lua5.2 for the "main" chunk.
+ -- Lua5.1 returns co as `nil` in that case.
+ local co, main = coroutine.running()
+ if main then co = nil end
+
+ -- don't remove coroutine hook under LuaJIT as there is only one (global) hook
+ if co then
+ coroutines[co] = false
+ if not jit then debug.sethook(co) end
+ else
+ if jit then coroutines.main = false end
+ if not jit then debug.sethook() end
+ end
+
+ -- check if there is any thread that is still being debugged under LuaJIT;
+ -- if not, turn the debugging off
+ if jit then
+ local remove = true
+ for _, debugged in pairs(coroutines) do
+ if debugged then remove = false; break end
+ end
+ if remove then debug.sethook() end
+ end
+end
+
+-- Handles server debugging commands
+local function handle(params, client, options)
+ local _, _, command = string.find(params, "^([a-z]+)")
+ local file, line, watch_idx
+ if command == "run" or command == "step" or command == "out"
+ or command == "over" or command == "exit" then
+ client:send(string.upper(command) .. "\n")
+ client:receive() -- this should consume the first '200 OK' response
+ while true do
+ local done = true
+ local breakpoint = client:receive()
+ if not breakpoint then
+ print("Program finished")
+ return
+ end
+ local _, _, status = string.find(breakpoint, "^(%d+)")
+ if status == "200" then
+ -- don't need to do anything
+ elseif status == "202" then
+ _, _, file, line = string.find(breakpoint, "^202 Paused%s+(.-)%s+(%d+)%s*$")
+ if file and line then
+ print("Paused at file " .. file .. " line " .. line)
+ end
+ elseif status == "203" then
+ _, _, file, line, watch_idx = string.find(breakpoint, "^203 Paused%s+(.-)%s+(%d+)%s+(%d+)%s*$")
+ if file and line and watch_idx then
+ print("Paused at file " .. file .. " line " .. line .. " (watch expression " .. watch_idx .. ": [" .. watches[watch_idx] .. "])")
+ end
+ elseif status == "204" then
+ local _, _, stream, size = string.find(breakpoint, "^204 Output (%w+) (%d+)$")
+ if stream and size then
+ local msg = client:receive(tonumber(size))
+ print(msg)
+ if outputs[stream] then outputs[stream](msg) end
+ -- this was just the output, so go back reading the response
+ done = false
+ end
+ elseif status == "401" then
+ local _, _, size = string.find(breakpoint, "^401 Error in Execution (%d+)$")
+ if size then
+ local msg = client:receive(tonumber(size))
+ print("Error in remote application: " .. msg)
+ return nil, nil, msg
+ end
+ else
+ print("Unknown error")
+ return nil, nil, "Debugger error: unexpected response '" .. breakpoint .. "'"
+ end
+ if done then break end
+ end
+ elseif command == "done" then
+ client:send(string.upper(command) .. "\n")
+ -- no response is expected
+ elseif command == "setb" or command == "asetb" then
+ _, _, _, file, line = string.find(params, "^([a-z]+)%s+(.-)%s+(%d+)%s*$")
+ if file and line then
+ -- if this is a file name, and not a file source
+ if not file:find('^".*"$') then
+ file = string.gsub(file, "\\", "/") -- convert slash
+ file = removebasedir(file, basedir)
+ end
+ client:send("SETB " .. file .. " " .. line .. "\n")
+ if command == "asetb" or client:receive() == "200 OK" then
+ set_breakpoint(file, line)
+ else
+ print("Error: breakpoint not inserted")
+ end
+ else
+ print("Invalid command")
+ end
+ elseif command == "setw" then
+ local _, _, exp = string.find(params, "^[a-z]+%s+(.+)$")
+ if exp then
+ client:send("SETW " .. exp .. "\n")
+ local answer = client:receive()
+ local _, _, watch_idx = string.find(answer, "^200 OK (%d+)%s*$")
+ if watch_idx then
+ watches[watch_idx] = exp
+ print("Inserted watch exp no. " .. watch_idx)
+ else
+ local _, _, size = string.find(answer, "^401 Error in Expression (%d+)$")
+ if size then
+ local err = client:receive(tonumber(size)):gsub(".-:%d+:%s*","")
+ print("Error: watch expression not set: " .. err)
+ else
+ print("Error: watch expression not set")
+ end
+ end
+ else
+ print("Invalid command")
+ end
+ elseif command == "delb" or command == "adelb" then
+ _, _, _, file, line = string.find(params, "^([a-z]+)%s+(.-)%s+(%d+)%s*$")
+ if file and line then
+ -- if this is a file name, and not a file source
+ if not file:find('^".*"$') then
+ file = string.gsub(file, "\\", "/") -- convert slash
+ file = removebasedir(file, basedir)
+ end
+ client:send("DELB " .. file .. " " .. line .. "\n")
+ if command == "adelb" or client:receive() == "200 OK" then
+ remove_breakpoint(file, line)
+ else
+ print("Error: breakpoint not removed")
+ end
+ else
+ print("Invalid command")
+ end
+ elseif command == "delallb" then
+ local file, line = "*", 0
+ client:send("DELB " .. file .. " " .. tostring(line) .. "\n")
+ if client:receive() == "200 OK" then
+ remove_breakpoint(file, line)
+ else
+ print("Error: all breakpoints not removed")
+ end
+ elseif command == "delw" then
+ local _, _, index = string.find(params, "^[a-z]+%s+(%d+)%s*$")
+ if index then
+ client:send("DELW " .. index .. "\n")
+ if client:receive() == "200 OK" then
+ watches[index] = nil
+ else
+ print("Error: watch expression not removed")
+ end
+ else
+ print("Invalid command")
+ end
+ elseif command == "delallw" then
+ for index, exp in pairs(watches) do
+ client:send("DELW " .. index .. "\n")
+ if client:receive() == "200 OK" then
+ watches[index] = nil
+ else
+ print("Error: watch expression at index " .. index .. " [" .. exp .. "] not removed")
+ end
+ end
+ elseif command == "eval" or command == "exec"
+ or command == "load" or command == "loadstring"
+ or command == "reload" then
+ local _, _, exp = string.find(params, "^[a-z]+%s+(.+)$")
+ if exp or (command == "reload") then
+ if command == "eval" or command == "exec" then
+ exp = (exp:gsub("%-%-%[(=*)%[.-%]%1%]", "") -- remove comments
+ :gsub("%-%-.-\n", " ") -- remove line comments
+ :gsub("\n", " ")) -- convert new lines
+ if command == "eval" then exp = "return " .. exp end
+ client:send("EXEC " .. exp .. "\n")
+ elseif command == "reload" then
+ client:send("LOAD 0 -\n")
+ elseif command == "loadstring" then
+ local _, _, _, file, lines = string.find(exp, "^([\"'])(.-)%1%s+(.+)")
+ if not file then
+ _, _, file, lines = string.find(exp, "^(%S+)%s+(.+)")
+ end
+ client:send("LOAD " .. tostring(#lines) .. " " .. file .. "\n")
+ client:send(lines)
+ else
+ local file = io.open(exp, "r")
+ if not file and pcall(require, "winapi") then
+ -- if file is not open and winapi is there, try with a short path;
+ -- this may be needed for unicode paths on windows
+ winapi.set_encoding(winapi.CP_UTF8)
+ local shortp = winapi.short_path(exp)
+ file = shortp and io.open(shortp, "r")
+ end
+ if not file then return nil, nil, "Cannot open file " .. exp end
+ -- read the file and remove the shebang line as it causes a compilation error
+ local lines = file:read("*all"):gsub("^#!.-\n", "\n")
+ file:close()
+
+ local file = string.gsub(exp, "\\", "/") -- convert slash
+ file = removebasedir(file, basedir)
+ client:send("LOAD " .. tostring(#lines) .. " " .. file .. "\n")
+ if #lines > 0 then client:send(lines) end
+ end
+ while true do
+ local params, err = client:receive()
+ if not params then
+ return nil, nil, "Debugger connection " .. (err or "error")
+ end
+ local done = true
+ local _, _, status, len = string.find(params, "^(%d+).-%s+(%d+)%s*$")
+ if status == "200" then
+ len = tonumber(len)
+ if len > 0 then
+ local status, res
+ local str = client:receive(len)
+ -- handle serialized table with results
+ local func, err = loadstring(str)
+ if func then
+ status, res = pcall(func)
+ if not status then err = res
+ elseif type(res) ~= "table" then
+ err = "received "..type(res).." instead of expected 'table'"
+ end
+ end
+ if err then
+ print("Error in processing results: " .. err)
+ return nil, nil, "Error in processing results: " .. err
+ end
+ print(unpack(res))
+ return res[1], res
+ end
+ elseif status == "201" then
+ _, _, file, line = string.find(params, "^201 Started%s+(.-)%s+(%d+)%s*$")
+ elseif status == "202" or params == "200 OK" then
+ -- do nothing; this only happens when RE/LOAD command gets the response
+ -- that was for the original command that was aborted
+ elseif status == "204" then
+ local _, _, stream, size = string.find(params, "^204 Output (%w+) (%d+)$")
+ if stream and size then
+ local msg = client:receive(tonumber(size))
+ print(msg)
+ if outputs[stream] then outputs[stream](msg) end
+ -- this was just the output, so go back reading the response
+ done = false
+ end
+ elseif status == "401" then
+ len = tonumber(len)
+ local res = client:receive(len)
+ print("Error in expression: " .. res)
+ return nil, nil, res
+ else
+ print("Unknown error")
+ return nil, nil, "Debugger error: unexpected response after EXEC/LOAD '" .. params .. "'"
+ end
+ if done then break end
+ end
+ else
+ print("Invalid command")
+ end
+ elseif command == "listb" then
+ for l, v in pairs(breakpoints) do
+ for f in pairs(v) do
+ print(f .. ": " .. l)
+ end
+ end
+ elseif command == "listw" then
+ for i, v in pairs(watches) do
+ print("Watch exp. " .. i .. ": " .. v)
+ end
+ elseif command == "suspend" then
+ client:send("SUSPEND\n")
+ elseif command == "stack" then
+ client:send("STACK\n")
+ local resp = client:receive()
+ local _, _, status, res = string.find(resp, "^(%d+)%s+%w+%s+(.+)%s*$")
+ if status == "200" then
+ local func, err = loadstring(res)
+ if func == nil then
+ print("Error in stack information: " .. err)
+ return nil, nil, err
+ end
+ local ok, stack = pcall(func)
+ if not ok then
+ print("Error in stack information: " .. stack)
+ return nil, nil, stack
+ end
+ for _,frame in ipairs(stack) do
+ print(mobdebug.line(frame[1], {comment = false}))
+ end
+ return stack
+ elseif status == "401" then
+ local _, _, len = string.find(resp, "%s+(%d+)%s*$")
+ len = tonumber(len)
+ local res = len > 0 and client:receive(len) or "Invalid stack information."
+ print("Error in expression: " .. res)
+ return nil, nil, res
+ else
+ print("Unknown error")
+ return nil, nil, "Debugger error: unexpected response after STACK"
+ end
+ elseif command == "output" then
+ local _, _, stream, mode = string.find(params, "^[a-z]+%s+(%w+)%s+([dcr])%s*$")
+ if stream and mode then
+ client:send("OUTPUT "..stream.." "..mode.."\n")
+ local resp = client:receive()
+ local _, _, status = string.find(resp, "^(%d+)%s+%w+%s*$")
+ if status == "200" then
+ print("Stream "..stream.." redirected")
+ outputs[stream] = type(options) == 'table' and options.handler or nil
+ else
+ print("Unknown error")
+ return nil, nil, "Debugger error: can't redirect "..stream
+ end
+ else
+ print("Invalid command")
+ end
+ elseif command == "basedir" then
+ local _, _, dir = string.find(params, "^[a-z]+%s+(.+)$")
+ if dir then
+ dir = string.gsub(dir, "\\", "/") -- convert slash
+ if not string.find(dir, "/$") then dir = dir .. "/" end
+
+ local remdir = dir:match("\t(.+)")
+ if remdir then dir = dir:gsub("/?\t.+", "/") end
+ basedir = dir
+
+ client:send("BASEDIR "..(remdir or dir).."\n")
+ local resp, err = client:receive()
+ if not resp then
+ print("Unknown error: "..err)
+ return nil, nil, "Debugger connection closed"
+ end
+ local _, _, status = string.find(resp, "^(%d+)%s+%w+%s*$")
+ if status == "200" then
+ print("New base directory is " .. basedir)
+ else
+ print("Unknown error")
+ return nil, nil, "Debugger error: unexpected response after BASEDIR"
+ end
+ else
+ print(basedir)
+ end
+ elseif command == "help" then
+ print("setb <file> <line> -- sets a breakpoint")
+ print("delb <file> <line> -- removes a breakpoint")
+ print("delallb -- removes all breakpoints")
+ print("setw <exp> -- adds a new watch expression")
+ print("delw <index> -- removes the watch expression at index")
+ print("delallw -- removes all watch expressions")
+ print("run -- runs until next breakpoint")
+ print("step -- runs until next line, stepping into function calls")
+ print("over -- runs until next line, stepping over function calls")
+ print("out -- runs until line after returning from current function")
+ print("listb -- lists breakpoints")
+ print("listw -- lists watch expressions")
+ print("eval <exp> -- evaluates expression on the current context and returns its value")
+ print("exec <stmt> -- executes statement on the current context")
+ print("load <file> -- loads a local file for debugging")
+ print("reload -- restarts the current debugging session")
+ print("stack -- reports stack trace")
+ print("output stdout <d|c|r> -- capture and redirect io stream (default|copy|redirect)")
+ print("basedir [<path>] -- sets the base path of the remote application, or shows the current one")
+ print("done -- stops the debugger and continues application execution")
+ print("exit -- exits debugger and the application")
+ else
+ local _, _, spaces = string.find(params, "^(%s*)$")
+ if spaces then
+ return nil, nil, "Empty command"
+ else
+ print("Invalid command")
+ return nil, nil, "Invalid command"
+ end
+ end
+ return file, line
+end
+
+-- Starts debugging server
+local function listen(host, port)
+ host = host or "*"
+ port = port or mobdebug.port
+
+ local socket = require "socket"
+
+ print("Lua Remote Debugger")
+ print("Run the program you wish to debug")
+
+ local server = socket.bind(host, port)
+ local client = server:accept()
+
+ client:send("STEP\n")
+ client:receive()
+
+ local breakpoint = client:receive()
+ local _, _, file, line = string.find(breakpoint, "^202 Paused%s+(.-)%s+(%d+)%s*$")
+ if file and line then
+ print("Paused at file " .. file )
+ print("Type 'help' for commands")
+ else
+ local _, _, size = string.find(breakpoint, "^401 Error in Execution (%d+)%s*$")
+ if size then
+ print("Error in remote application: ")
+ print(client:receive(size))
+ end
+ end
+
+ while true do
+ io.write("> ")
+ local file, line, err = handle(io.read("*line"), client)
+ if not file and not err then break end -- completed debugging
+ end
+
+ client:close()
+end
+
+local cocreate
+local function coro()
+ if cocreate then return end -- only set once
+ cocreate = cocreate or coroutine.create
+ coroutine.create = function(f, ...)
+ return cocreate(function(...)
+ mobdebug.on()
+ return f(...)
+ end, ...)
+ end
+end
+
+local moconew
+local function moai()
+ if moconew then return end -- only set once
+ moconew = moconew or (MOAICoroutine and MOAICoroutine.new)
+ if not moconew then return end
+ MOAICoroutine.new = function(...)
+ local thread = moconew(...)
+ -- need to support both thread.run and getmetatable(thread).run, which
+ -- was used in earlier MOAI versions
+ local mt = thread.run and thread or getmetatable(thread)
+ local patched = mt.run
+ mt.run = function(self, f, ...)
+ return patched(self, function(...)
+ mobdebug.on()
+ return f(...)
+ end, ...)
+ end
+ return thread
+ end
+end
+
+-- make public functions available
+mobdebug.setbreakpoint = set_breakpoint
+mobdebug.removebreakpoint = remove_breakpoint
+mobdebug.listen = listen
+mobdebug.loop = loop
+mobdebug.scratchpad = scratchpad
+mobdebug.handle = handle
+mobdebug.connect = connect
+mobdebug.start = start
+mobdebug.on = on
+mobdebug.off = off
+mobdebug.moai = moai
+mobdebug.coro = coro
+mobdebug.done = done
+mobdebug.pause = function() step_into = true end
+mobdebug.yield = nil -- callback
+mobdebug.onexit = os and os.exit or done
+mobdebug.basedir = function(b) if b then basedir = b end return basedir end
+
+return mobdebug
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/sha2.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/sha2.lua
new file mode 100644
index 0000000..66795d6
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/sha2.lua
@@ -0,0 +1,239 @@
+-- SHA-256 code in Lua 5.2; based on the pseudo-code from
+-- Wikipedia (http://en.wikipedia.org/wiki/SHA-2)
+-- from http://lua-users.org/wiki/SecureHashAlgorithm
+
+local band, rrotate, bxor, rshift, bnot =
+ bit32.band, bit32.rrotate, bit32.bxor, bit32.rshift, bit32.bnot
+
+local string, setmetatable, assert = string, setmetatable, assert
+
+-- Initialize table of round constants
+-- (first 32 bits of the fractional parts of the cube roots of the first
+-- 64 primes 2..311):
+local k = {
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
+ 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
+ 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
+ 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
+ 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
+ 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
+ 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
+ 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
+ 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
+ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
+ 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
+ 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
+ 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
+ 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,
+}
+
+
+-- transform a string of bytes in a string of hexadecimal digits
+local function str2hexa (s)
+ local h = string.gsub(s, ".", function(c)
+ return string.format("%02x", string.byte(c))
+ end)
+ return h
+end
+
+
+-- transform number 'l' in a big-endian sequence of 'n' bytes
+-- (coded as a string)
+local function num2s (l, n)
+ local s = ""
+ for i = 1, n do
+ local rem = l % 256
+ s = string.char(rem) .. s
+ l = (l - rem) / 256
+ end
+ return s
+end
+
+-- transform the big-endian sequence of four bytes starting at
+-- index 'i' in 's' into a number
+local function s232num (s, i)
+ local n = 0
+ for i = i, i + 3 do
+ n = n*256 + string.byte(s, i)
+ end
+ return n
+end
+
+
+-- append the bit '1' to the message
+-- append k bits '0', where k is the minimum number >= 0 such that the
+-- resulting message length (in bits) is congruent to 448 (mod 512)
+-- append length of message (before pre-processing), in bits, as 64-bit
+-- big-endian integer
+local function preproc (msg, len)
+ local extra = 64 - ((len + 1 + 8) % 64)
+ len = num2s(8 * len, 8) -- original len in bits, coded
+ msg = msg .. "\128" .. string.rep("\0", extra) .. len
+ assert(#msg % 64 == 0)
+ return msg
+end
+
+
+local function initH224 (H)
+ -- (second 32 bits of the fractional parts of the square roots of the
+ -- 9th through 16th primes 23..53)
+ H[1] = 0xc1059ed8
+ H[2] = 0x367cd507
+ H[3] = 0x3070dd17
+ H[4] = 0xf70e5939
+ H[5] = 0xffc00b31
+ H[6] = 0x68581511
+ H[7] = 0x64f98fa7
+ H[8] = 0xbefa4fa4
+ return H
+end
+
+
+local function initH256 (H)
+ -- (first 32 bits of the fractional parts of the square roots of the
+ -- first 8 primes 2..19):
+ H[1] = 0x6a09e667
+ H[2] = 0xbb67ae85
+ H[3] = 0x3c6ef372
+ H[4] = 0xa54ff53a
+ H[5] = 0x510e527f
+ H[6] = 0x9b05688c
+ H[7] = 0x1f83d9ab
+ H[8] = 0x5be0cd19
+ return H
+end
+
+
+local function digestblock (msg, i, H)
+
+ -- break chunk into sixteen 32-bit big-endian words w[1..16]
+ local w = {}
+ for j = 1, 16 do
+ w[j] = s232num(msg, i + (j - 1)*4)
+ end
+
+ -- Extend the sixteen 32-bit words into sixty-four 32-bit words:
+ for j = 17, 64 do
+ local v = w[j - 15]
+ local s0 = bxor(rrotate(v, 7), rrotate(v, 18), rshift(v, 3))
+ v = w[j - 2]
+ local s1 = bxor(rrotate(v, 17), rrotate(v, 19), rshift(v, 10))
+ w[j] = w[j - 16] + s0 + w[j - 7] + s1
+ end
+
+ -- Initialize hash value for this chunk:
+ local a, b, c, d, e, f, g, h =
+ H[1], H[2], H[3], H[4], H[5], H[6], H[7], H[8]
+
+ -- Main loop:
+ for i = 1, 64 do
+ local s0 = bxor(rrotate(a, 2), rrotate(a, 13), rrotate(a, 22))
+ local maj = bxor(band(a, b), band(a, c), band(b, c))
+ local t2 = s0 + maj
+ local s1 = bxor(rrotate(e, 6), rrotate(e, 11), rrotate(e, 25))
+ local ch = bxor (band(e, f), band(bnot(e), g))
+ local t1 = h + s1 + ch + k[i] + w[i]
+
+ h = g
+ g = f
+ f = e
+ e = d + t1
+ d = c
+ c = b
+ b = a
+ a = t1 + t2
+ end
+
+ -- Add (mod 2^32) this chunk's hash to result so far:
+ H[1] = band(H[1] + a)
+ H[2] = band(H[2] + b)
+ H[3] = band(H[3] + c)
+ H[4] = band(H[4] + d)
+ H[5] = band(H[5] + e)
+ H[6] = band(H[6] + f)
+ H[7] = band(H[7] + g)
+ H[8] = band(H[8] + h)
+
+end
+
+
+local function finalresult224 (H)
+ -- Produce the final hash value (big-endian):
+ return
+ str2hexa(num2s(H[1], 4)..num2s(H[2], 4)..num2s(H[3], 4)..num2s(H[4], 4)..
+ num2s(H[5], 4)..num2s(H[6], 4)..num2s(H[7], 4))
+end
+
+
+local function finalresult256 (H)
+ -- Produce the final hash value (big-endian):
+ return
+ str2hexa(num2s(H[1], 4)..num2s(H[2], 4)..num2s(H[3], 4)..num2s(H[4], 4)..
+ num2s(H[5], 4)..num2s(H[6], 4)..num2s(H[7], 4)..num2s(H[8], 4))
+end
+
+
+----------------------------------------------------------------------
+local HH = {} -- to reuse
+
+local function hash224 (msg)
+ msg = preproc(msg, #msg)
+ local H = initH224(HH)
+
+ -- Process the message in successive 512-bit (64 bytes) chunks:
+ for i = 1, #msg, 64 do
+ digestblock(msg, i, H)
+ end
+
+ return finalresult224(H)
+end
+
+
+local function hash256 (msg)
+ msg = preproc(msg, #msg)
+ local H = initH256(HH)
+
+ -- Process the message in successive 512-bit (64 bytes) chunks:
+ for i = 1, #msg, 64 do
+ digestblock(msg, i, H)
+ end
+
+ return finalresult256(H)
+end
+----------------------------------------------------------------------
+local mt = {}
+
+local function new256 ()
+ local o = {H = initH256({}), msg = "", len = 0}
+ setmetatable(o, mt)
+ return o
+end
+
+mt.__index = mt
+
+function mt:add (m)
+ self.msg = self.msg .. m
+ self.len = self.len + #m
+ local t = 0
+ while #self.msg - t >= 64 do
+ digestblock(self.msg, t + 1, self.H)
+ t = t + 64
+ end
+ self.msg = self.msg:sub(t + 1, -1)
+end
+
+
+function mt:close ()
+ self.msg = preproc(self.msg, self.len)
+ self:add("")
+ return finalresult256(self.H)
+end
+----------------------------------------------------------------------
+
+return {
+ hash224 = hash224,
+ hash256 = hash256,
+ new256 = new256,
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket.lua
new file mode 100644
index 0000000..c3b5f50
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket.lua
@@ -0,0 +1,165 @@
+-----------------------------------------------------------------------------
+-- LuaSocket helper module
+-- Author: Diego Nehab
+-----------------------------------------------------------------------------
+
+-----------------------------------------------------------------------------
+-- Declare module and import dependencies
+-----------------------------------------------------------------------------
+local base = _G
+local string = require("string")
+local math = require("math")
+local socket = require("socket.core")
+
+local _M = socket
+
+-- this is needed in case this library is used when "socket.core" is loaded,
+-- but has an older version of luasocket that does not include `connect`.
+if not socket.connect then
+ socket.connect = function (address, port, laddress, lport)
+ local sock, err = socket.tcp()
+ if not sock then return nil, err end
+ if laddress then
+ local res, err = sock:bind(laddress, lport, -1)
+ if not res then return nil, err end
+ end
+ local res, err = sock:connect(address, port)
+ if not res then return nil, err end
+ return sock
+ end
+end
+
+-----------------------------------------------------------------------------
+-- Exported auxiliar functions
+-----------------------------------------------------------------------------
+function _M.connect4(address, port, laddress, lport)
+ return socket.connect(address, port, laddress, lport, "inet")
+end
+
+function _M.connect6(address, port, laddress, lport)
+ return socket.connect(address, port, laddress, lport, "inet6")
+end
+
+function _M.bind(host, port, backlog)
+ if host == "*" then host = "0.0.0.0" end
+ local addrinfo, err = socket.dns.getaddrinfo(host);
+ if not addrinfo then return nil, err end
+ local sock, res
+ err = "no info on address"
+ for i, alt in base.ipairs(addrinfo) do
+ if alt.family == "inet" then
+ sock, err = socket.tcp()
+ else
+ sock, err = socket.tcp6()
+ end
+ if not sock then return nil, err end
+ sock:setoption("reuseaddr", true)
+ res, err = sock:bind(alt.addr, port)
+ if not res then
+ sock:close()
+ else
+ res, err = sock:listen(backlog)
+ if not res then
+ sock:close()
+ else
+ return sock
+ end
+ end
+ end
+ return nil, err
+end
+
+_M.try = _M.newtry()
+
+function _M.choose(table)
+ return function(name, opt1, opt2)
+ if base.type(name) ~= "string" then
+ name, opt1, opt2 = "default", name, opt1
+ end
+ local f = table[name or "nil"]
+ if not f then base.error("unknown key (".. base.tostring(name) ..")", 3)
+ else return f(opt1, opt2) end
+ end
+end
+
+-----------------------------------------------------------------------------
+-- Socket sources and sinks, conforming to LTN12
+-----------------------------------------------------------------------------
+-- create namespaces inside LuaSocket namespace
+local sourcet, sinkt = {}, {}
+_M.sourcet = sourcet
+_M.sinkt = sinkt
+
+_M.BLOCKSIZE = 2048
+
+sinkt["close-when-done"] = function(sock)
+ return base.setmetatable({
+ getfd = function() return sock:getfd() end,
+ dirty = function() return sock:dirty() end
+ }, {
+ __call = function(self, chunk, err)
+ if not chunk then
+ sock:close()
+ return 1
+ else return sock:send(chunk) end
+ end
+ })
+end
+
+sinkt["keep-open"] = function(sock)
+ return base.setmetatable({
+ getfd = function() return sock:getfd() end,
+ dirty = function() return sock:dirty() end
+ }, {
+ __call = function(self, chunk, err)
+ if chunk then return sock:send(chunk)
+ else return 1 end
+ end
+ })
+end
+
+sinkt["default"] = sinkt["keep-open"]
+
+_M.sink = _M.choose(sinkt)
+
+sourcet["by-length"] = function(sock, length)
+ return base.setmetatable({
+ getfd = function() return sock:getfd() end,
+ dirty = function() return sock:dirty() end
+ }, {
+ __call = function()
+ if length <= 0 then return nil end
+ local size = math.min(socket.BLOCKSIZE, length)
+ local chunk, err = sock:receive(size)
+ if err then return nil, err end
+ length = length - string.len(chunk)
+ return chunk
+ end
+ })
+end
+
+sourcet["until-closed"] = function(sock)
+ local done
+ return base.setmetatable({
+ getfd = function() return sock:getfd() end,
+ dirty = function() return sock:dirty() end
+ }, {
+ __call = function()
+ if done then return nil end
+ local chunk, err, partial = sock:receive(socket.BLOCKSIZE)
+ if not err then return chunk
+ elseif err == "closed" then
+ sock:close()
+ done = 1
+ return partial
+ else return nil, err end
+ end
+ })
+end
+
+
+sourcet["default"] = sourcet["until-closed"]
+
+_M.source = _M.choose(sourcet)
+
+return _M
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket/ftp.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket/ftp.lua
new file mode 100644
index 0000000..ea1145b
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket/ftp.lua
@@ -0,0 +1,285 @@
+-----------------------------------------------------------------------------
+-- FTP support for the Lua language
+-- LuaSocket toolkit.
+-- Author: Diego Nehab
+-----------------------------------------------------------------------------
+
+-----------------------------------------------------------------------------
+-- Declare module and import dependencies
+-----------------------------------------------------------------------------
+local base = _G
+local table = require("table")
+local string = require("string")
+local math = require("math")
+local socket = require("socket")
+local url = require("socket.url")
+local tp = require("socket.tp")
+local ltn12 = require("ltn12")
+socket.ftp = {}
+local _M = socket.ftp
+-----------------------------------------------------------------------------
+-- Program constants
+-----------------------------------------------------------------------------
+-- timeout in seconds before the program gives up on a connection
+_M.TIMEOUT = 60
+-- default port for ftp service
+_M.PORT = 21
+-- this is the default anonymous password. used when no password is
+-- provided in url. should be changed to your e-mail.
+_M.USER = "ftp"
+_M.PASSWORD = "anonymous@anonymous.org"
+
+-----------------------------------------------------------------------------
+-- Low level FTP API
+-----------------------------------------------------------------------------
+local metat = { __index = {} }
+
+function _M.open(server, port, create)
+ local tp = socket.try(tp.connect(server, port or _M.PORT, _M.TIMEOUT, create))
+ local f = base.setmetatable({ tp = tp }, metat)
+ -- make sure everything gets closed in an exception
+ f.try = socket.newtry(function() f:close() end)
+ return f
+end
+
+function metat.__index:portconnect()
+ self.try(self.server:settimeout(_M.TIMEOUT))
+ self.data = self.try(self.server:accept())
+ self.try(self.data:settimeout(_M.TIMEOUT))
+end
+
+function metat.__index:pasvconnect()
+ self.data = self.try(socket.tcp())
+ self.try(self.data:settimeout(_M.TIMEOUT))
+ self.try(self.data:connect(self.pasvt.ip, self.pasvt.port))
+end
+
+function metat.__index:login(user, password)
+ self.try(self.tp:command("user", user or _M.USER))
+ local code, reply = self.try(self.tp:check{"2..", 331})
+ if code == 331 then
+ self.try(self.tp:command("pass", password or _M.PASSWORD))
+ self.try(self.tp:check("2.."))
+ end
+ return 1
+end
+
+function metat.__index:pasv()
+ self.try(self.tp:command("pasv"))
+ local code, reply = self.try(self.tp:check("2.."))
+ local pattern = "(%d+)%D(%d+)%D(%d+)%D(%d+)%D(%d+)%D(%d+)"
+ local a, b, c, d, p1, p2 = socket.skip(2, string.find(reply, pattern))
+ self.try(a and b and c and d and p1 and p2, reply)
+ self.pasvt = {
+ ip = string.format("%d.%d.%d.%d", a, b, c, d),
+ port = p1*256 + p2
+ }
+ if self.server then
+ self.server:close()
+ self.server = nil
+ end
+ return self.pasvt.ip, self.pasvt.port
+end
+
+function metat.__index:port(ip, port)
+ self.pasvt = nil
+ if not ip then
+ ip, port = self.try(self.tp:getcontrol():getsockname())
+ self.server = self.try(socket.bind(ip, 0))
+ ip, port = self.try(self.server:getsockname())
+ self.try(self.server:settimeout(_M.TIMEOUT))
+ end
+ local pl = math.mod(port, 256)
+ local ph = (port - pl)/256
+ local arg = string.gsub(string.format("%s,%d,%d", ip, ph, pl), "%.", ",")
+ self.try(self.tp:command("port", arg))
+ self.try(self.tp:check("2.."))
+ return 1
+end
+
+function metat.__index:send(sendt)
+ self.try(self.pasvt or self.server, "need port or pasv first")
+ -- if there is a pasvt table, we already sent a PASV command
+ -- we just get the data connection into self.data
+ if self.pasvt then self:pasvconnect() end
+ -- get the transfer argument and command
+ local argument = sendt.argument or
+ url.unescape(string.gsub(sendt.path or "", "^[/\\]", ""))
+ if argument == "" then argument = nil end
+ local command = sendt.command or "stor"
+ -- send the transfer command and check the reply
+ self.try(self.tp:command(command, argument))
+ local code, reply = self.try(self.tp:check{"2..", "1.."})
+ -- if there is not a a pasvt table, then there is a server
+ -- and we already sent a PORT command
+ if not self.pasvt then self:portconnect() end
+ -- get the sink, source and step for the transfer
+ local step = sendt.step or ltn12.pump.step
+ local readt = {self.tp.c}
+ local checkstep = function(src, snk)
+ -- check status in control connection while downloading
+ local readyt = socket.select(readt, nil, 0)
+ if readyt[tp] then code = self.try(self.tp:check("2..")) end
+ return step(src, snk)
+ end
+ local sink = socket.sink("close-when-done", self.data)
+ -- transfer all data and check error
+ self.try(ltn12.pump.all(sendt.source, sink, checkstep))
+ if string.find(code, "1..") then self.try(self.tp:check("2..")) end
+ -- done with data connection
+ self.data:close()
+ -- find out how many bytes were sent
+ local sent = socket.skip(1, self.data:getstats())
+ self.data = nil
+ return sent
+end
+
+function metat.__index:receive(recvt)
+ self.try(self.pasvt or self.server, "need port or pasv first")
+ if self.pasvt then self:pasvconnect() end
+ local argument = recvt.argument or
+ url.unescape(string.gsub(recvt.path or "", "^[/\\]", ""))
+ if argument == "" then argument = nil end
+ local command = recvt.command or "retr"
+ self.try(self.tp:command(command, argument))
+ local code,reply = self.try(self.tp:check{"1..", "2.."})
+ if (code >= 200) and (code <= 299) then
+ recvt.sink(reply)
+ return 1
+ end
+ if not self.pasvt then self:portconnect() end
+ local source = socket.source("until-closed", self.data)
+ local step = recvt.step or ltn12.pump.step
+ self.try(ltn12.pump.all(source, recvt.sink, step))
+ if string.find(code, "1..") then self.try(self.tp:check("2..")) end
+ self.data:close()
+ self.data = nil
+ return 1
+end
+
+function metat.__index:cwd(dir)
+ self.try(self.tp:command("cwd", dir))
+ self.try(self.tp:check(250))
+ return 1
+end
+
+function metat.__index:type(type)
+ self.try(self.tp:command("type", type))
+ self.try(self.tp:check(200))
+ return 1
+end
+
+function metat.__index:greet()
+ local code = self.try(self.tp:check{"1..", "2.."})
+ if string.find(code, "1..") then self.try(self.tp:check("2..")) end
+ return 1
+end
+
+function metat.__index:quit()
+ self.try(self.tp:command("quit"))
+ self.try(self.tp:check("2.."))
+ return 1
+end
+
+function metat.__index:close()
+ if self.data then self.data:close() end
+ if self.server then self.server:close() end
+ return self.tp:close()
+end
+
+-----------------------------------------------------------------------------
+-- High level FTP API
+-----------------------------------------------------------------------------
+local function override(t)
+ if t.url then
+ local u = url.parse(t.url)
+ for i,v in base.pairs(t) do
+ u[i] = v
+ end
+ return u
+ else return t end
+end
+
+local function tput(putt)
+ putt = override(putt)
+ socket.try(putt.host, "missing hostname")
+ local f = _M.open(putt.host, putt.port, putt.create)
+ f:greet()
+ f:login(putt.user, putt.password)
+ if putt.type then f:type(putt.type) end
+ f:pasv()
+ local sent = f:send(putt)
+ f:quit()
+ f:close()
+ return sent
+end
+
+local default = {
+ path = "/",
+ scheme = "ftp"
+}
+
+local function parse(u)
+ local t = socket.try(url.parse(u, default))
+ socket.try(t.scheme == "ftp", "wrong scheme '" .. t.scheme .. "'")
+ socket.try(t.host, "missing hostname")
+ local pat = "^type=(.)$"
+ if t.params then
+ t.type = socket.skip(2, string.find(t.params, pat))
+ socket.try(t.type == "a" or t.type == "i",
+ "invalid type '" .. t.type .. "'")
+ end
+ return t
+end
+
+local function sput(u, body)
+ local putt = parse(u)
+ putt.source = ltn12.source.string(body)
+ return tput(putt)
+end
+
+_M.put = socket.protect(function(putt, body)
+ if base.type(putt) == "string" then return sput(putt, body)
+ else return tput(putt) end
+end)
+
+local function tget(gett)
+ gett = override(gett)
+ socket.try(gett.host, "missing hostname")
+ local f = _M.open(gett.host, gett.port, gett.create)
+ f:greet()
+ f:login(gett.user, gett.password)
+ if gett.type then f:type(gett.type) end
+ f:pasv()
+ f:receive(gett)
+ f:quit()
+ return f:close()
+end
+
+local function sget(u)
+ local gett = parse(u)
+ local t = {}
+ gett.sink = ltn12.sink.table(t)
+ tget(gett)
+ return table.concat(t)
+end
+
+_M.command = socket.protect(function(cmdt)
+ cmdt = override(cmdt)
+ socket.try(cmdt.host, "missing hostname")
+ socket.try(cmdt.command, "missing command")
+ local f = open(cmdt.host, cmdt.port, cmdt.create)
+ f:greet()
+ f:login(cmdt.user, cmdt.password)
+ f.try(f.tp:command(cmdt.command, cmdt.argument))
+ if cmdt.check then f.try(f.tp:check(cmdt.check)) end
+ f:quit()
+ return f:close()
+end)
+
+_M.get = socket.protect(function(gett)
+ if base.type(gett) == "string" then return sget(gett)
+ else return tget(gett) end
+end)
+
+return _M \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket/headers.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket/headers.lua
new file mode 100644
index 0000000..1eb8223
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket/headers.lua
@@ -0,0 +1,104 @@
+-----------------------------------------------------------------------------
+-- Canonic header field capitalization
+-- LuaSocket toolkit.
+-- Author: Diego Nehab
+-----------------------------------------------------------------------------
+local socket = require("socket")
+socket.headers = {}
+local _M = socket.headers
+
+_M.canonic = {
+ ["accept"] = "Accept",
+ ["accept-charset"] = "Accept-Charset",
+ ["accept-encoding"] = "Accept-Encoding",
+ ["accept-language"] = "Accept-Language",
+ ["accept-ranges"] = "Accept-Ranges",
+ ["action"] = "Action",
+ ["alternate-recipient"] = "Alternate-Recipient",
+ ["age"] = "Age",
+ ["allow"] = "Allow",
+ ["arrival-date"] = "Arrival-Date",
+ ["authorization"] = "Authorization",
+ ["bcc"] = "Bcc",
+ ["cache-control"] = "Cache-Control",
+ ["cc"] = "Cc",
+ ["comments"] = "Comments",
+ ["connection"] = "Connection",
+ ["content-description"] = "Content-Description",
+ ["content-disposition"] = "Content-Disposition",
+ ["content-encoding"] = "Content-Encoding",
+ ["content-id"] = "Content-ID",
+ ["content-language"] = "Content-Language",
+ ["content-length"] = "Content-Length",
+ ["content-location"] = "Content-Location",
+ ["content-md5"] = "Content-MD5",
+ ["content-range"] = "Content-Range",
+ ["content-transfer-encoding"] = "Content-Transfer-Encoding",
+ ["content-type"] = "Content-Type",
+ ["cookie"] = "Cookie",
+ ["date"] = "Date",
+ ["diagnostic-code"] = "Diagnostic-Code",
+ ["dsn-gateway"] = "DSN-Gateway",
+ ["etag"] = "ETag",
+ ["expect"] = "Expect",
+ ["expires"] = "Expires",
+ ["final-log-id"] = "Final-Log-ID",
+ ["final-recipient"] = "Final-Recipient",
+ ["from"] = "From",
+ ["host"] = "Host",
+ ["if-match"] = "If-Match",
+ ["if-modified-since"] = "If-Modified-Since",
+ ["if-none-match"] = "If-None-Match",
+ ["if-range"] = "If-Range",
+ ["if-unmodified-since"] = "If-Unmodified-Since",
+ ["in-reply-to"] = "In-Reply-To",
+ ["keywords"] = "Keywords",
+ ["last-attempt-date"] = "Last-Attempt-Date",
+ ["last-modified"] = "Last-Modified",
+ ["location"] = "Location",
+ ["max-forwards"] = "Max-Forwards",
+ ["message-id"] = "Message-ID",
+ ["mime-version"] = "MIME-Version",
+ ["original-envelope-id"] = "Original-Envelope-ID",
+ ["original-recipient"] = "Original-Recipient",
+ ["pragma"] = "Pragma",
+ ["proxy-authenticate"] = "Proxy-Authenticate",
+ ["proxy-authorization"] = "Proxy-Authorization",
+ ["range"] = "Range",
+ ["received"] = "Received",
+ ["received-from-mta"] = "Received-From-MTA",
+ ["references"] = "References",
+ ["referer"] = "Referer",
+ ["remote-mta"] = "Remote-MTA",
+ ["reply-to"] = "Reply-To",
+ ["reporting-mta"] = "Reporting-MTA",
+ ["resent-bcc"] = "Resent-Bcc",
+ ["resent-cc"] = "Resent-Cc",
+ ["resent-date"] = "Resent-Date",
+ ["resent-from"] = "Resent-From",
+ ["resent-message-id"] = "Resent-Message-ID",
+ ["resent-reply-to"] = "Resent-Reply-To",
+ ["resent-sender"] = "Resent-Sender",
+ ["resent-to"] = "Resent-To",
+ ["retry-after"] = "Retry-After",
+ ["return-path"] = "Return-Path",
+ ["sender"] = "Sender",
+ ["server"] = "Server",
+ ["smtp-remote-recipient"] = "SMTP-Remote-Recipient",
+ ["status"] = "Status",
+ ["subject"] = "Subject",
+ ["te"] = "TE",
+ ["to"] = "To",
+ ["trailer"] = "Trailer",
+ ["transfer-encoding"] = "Transfer-Encoding",
+ ["upgrade"] = "Upgrade",
+ ["user-agent"] = "User-Agent",
+ ["vary"] = "Vary",
+ ["via"] = "Via",
+ ["warning"] = "Warning",
+ ["will-retry-until"] = "Will-Retry-Until",
+ ["www-authenticate"] = "WWW-Authenticate",
+ ["x-mailer"] = "X-Mailer",
+}
+
+return _M \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket/http.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket/http.lua
new file mode 100644
index 0000000..ac4b2d6
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket/http.lua
@@ -0,0 +1,354 @@
+-----------------------------------------------------------------------------
+-- HTTP/1.1 client support for the Lua language.
+-- LuaSocket toolkit.
+-- Author: Diego Nehab
+-----------------------------------------------------------------------------
+
+-----------------------------------------------------------------------------
+-- Declare module and import dependencies
+-------------------------------------------------------------------------------
+local socket = require("socket")
+local url = require("socket.url")
+local ltn12 = require("ltn12")
+local mime = require("mime")
+local string = require("string")
+local headers = require("socket.headers")
+local base = _G
+local table = require("table")
+socket.http = {}
+local _M = socket.http
+
+-----------------------------------------------------------------------------
+-- Program constants
+-----------------------------------------------------------------------------
+-- connection timeout in seconds
+TIMEOUT = 60
+-- default port for document retrieval
+_M.PORT = 80
+-- user agent field sent in request
+_M.USERAGENT = socket._VERSION
+
+-----------------------------------------------------------------------------
+-- Reads MIME headers from a connection, unfolding where needed
+-----------------------------------------------------------------------------
+local function receiveheaders(sock, headers)
+ local line, name, value, err
+ headers = headers or {}
+ -- get first line
+ line, err = sock:receive()
+ if err then return nil, err end
+ -- headers go until a blank line is found
+ while line ~= "" do
+ -- get field-name and value
+ name, value = socket.skip(2, string.find(line, "^(.-):%s*(.*)"))
+ if not (name and value) then return nil, "malformed reponse headers" end
+ name = string.lower(name)
+ -- get next line (value might be folded)
+ line, err = sock:receive()
+ if err then return nil, err end
+ -- unfold any folded values
+ while string.find(line, "^%s") do
+ value = value .. line
+ line = sock:receive()
+ if err then return nil, err end
+ end
+ -- save pair in table
+ if headers[name] then headers[name] = headers[name] .. ", " .. value
+ else headers[name] = value end
+ end
+ return headers
+end
+
+-----------------------------------------------------------------------------
+-- Extra sources and sinks
+-----------------------------------------------------------------------------
+socket.sourcet["http-chunked"] = function(sock, headers)
+ return base.setmetatable({
+ getfd = function() return sock:getfd() end,
+ dirty = function() return sock:dirty() end
+ }, {
+ __call = function()
+ -- get chunk size, skip extention
+ local line, err = sock:receive()
+ if err then return nil, err end
+ local size = base.tonumber(string.gsub(line, ";.*", ""), 16)
+ if not size then return nil, "invalid chunk size" end
+ -- was it the last chunk?
+ if size > 0 then
+ -- if not, get chunk and skip terminating CRLF
+ local chunk, err, part = sock:receive(size)
+ if chunk then sock:receive() end
+ return chunk, err
+ else
+ -- if it was, read trailers into headers table
+ headers, err = receiveheaders(sock, headers)
+ if not headers then return nil, err end
+ end
+ end
+ })
+end
+
+socket.sinkt["http-chunked"] = function(sock)
+ return base.setmetatable({
+ getfd = function() return sock:getfd() end,
+ dirty = function() return sock:dirty() end
+ }, {
+ __call = function(self, chunk, err)
+ if not chunk then return sock:send("0\r\n\r\n") end
+ local size = string.format("%X\r\n", string.len(chunk))
+ return sock:send(size .. chunk .. "\r\n")
+ end
+ })
+end
+
+-----------------------------------------------------------------------------
+-- Low level HTTP API
+-----------------------------------------------------------------------------
+local metat = { __index = {} }
+
+function _M.open(host, port, create)
+ -- create socket with user connect function, or with default
+ local c = socket.try((create or socket.tcp)())
+ local h = base.setmetatable({ c = c }, metat)
+ -- create finalized try
+ h.try = socket.newtry(function() h:close() end)
+ -- set timeout before connecting
+ h.try(c:settimeout(_M.TIMEOUT))
+ h.try(c:connect(host, port or _M.PORT))
+ -- here everything worked
+ return h
+end
+
+function metat.__index:sendrequestline(method, uri)
+ local reqline = string.format("%s %s HTTP/1.1\r\n", method or "GET", uri)
+ return self.try(self.c:send(reqline))
+end
+
+function metat.__index:sendheaders(tosend)
+ local canonic = headers.canonic
+ local h = "\r\n"
+ for f, v in base.pairs(tosend) do
+ h = (canonic[f] or f) .. ": " .. v .. "\r\n" .. h
+ end
+ self.try(self.c:send(h))
+ return 1
+end
+
+function metat.__index:sendbody(headers, source, step)
+ source = source or ltn12.source.empty()
+ step = step or ltn12.pump.step
+ -- if we don't know the size in advance, send chunked and hope for the best
+ local mode = "http-chunked"
+ if headers["content-length"] then mode = "keep-open" end
+ return self.try(ltn12.pump.all(source, socket.sink(mode, self.c), step))
+end
+
+function metat.__index:receivestatusline()
+ local status = self.try(self.c:receive(5))
+ -- identify HTTP/0.9 responses, which do not contain a status line
+ -- this is just a heuristic, but is what the RFC recommends
+ if status ~= "HTTP/" then return nil, status end
+ -- otherwise proceed reading a status line
+ status = self.try(self.c:receive("*l", status))
+ local code = socket.skip(2, string.find(status, "HTTP/%d*%.%d* (%d%d%d)"))
+ return self.try(base.tonumber(code), status)
+end
+
+function metat.__index:receiveheaders()
+ return self.try(receiveheaders(self.c))
+end
+
+function metat.__index:receivebody(headers, sink, step)
+ sink = sink or ltn12.sink.null()
+ step = step or ltn12.pump.step
+ local length = base.tonumber(headers["content-length"])
+ local t = headers["transfer-encoding"] -- shortcut
+ local mode = "default" -- connection close
+ if t and t ~= "identity" then mode = "http-chunked"
+ elseif base.tonumber(headers["content-length"]) then mode = "by-length" end
+ return self.try(ltn12.pump.all(socket.source(mode, self.c, length),
+ sink, step))
+end
+
+function metat.__index:receive09body(status, sink, step)
+ local source = ltn12.source.rewind(socket.source("until-closed", self.c))
+ source(status)
+ return self.try(ltn12.pump.all(source, sink, step))
+end
+
+function metat.__index:close()
+ return self.c:close()
+end
+
+-----------------------------------------------------------------------------
+-- High level HTTP API
+-----------------------------------------------------------------------------
+local function adjusturi(reqt)
+ local u = reqt
+ -- if there is a proxy, we need the full url. otherwise, just a part.
+ if not reqt.proxy and not PROXY then
+ u = {
+ path = socket.try(reqt.path, "invalid path 'nil'"),
+ params = reqt.params,
+ query = reqt.query,
+ fragment = reqt.fragment
+ }
+ end
+ return url.build(u)
+end
+
+local function adjustproxy(reqt)
+ local proxy = reqt.proxy or PROXY
+ if proxy then
+ proxy = url.parse(proxy)
+ return proxy.host, proxy.port or 3128
+ else
+ return reqt.host, reqt.port
+ end
+end
+
+local function adjustheaders(reqt)
+ -- default headers
+ local lower = {
+ ["user-agent"] = _M.USERAGENT,
+ ["host"] = reqt.host,
+ ["connection"] = "close, TE",
+ ["te"] = "trailers"
+ }
+ -- if we have authentication information, pass it along
+ if reqt.user and reqt.password then
+ lower["authorization"] =
+ "Basic " .. (mime.b64(reqt.user .. ":" .. reqt.password))
+ end
+ -- override with user headers
+ for i,v in base.pairs(reqt.headers or lower) do
+ lower[string.lower(i)] = v
+ end
+ return lower
+end
+
+-- default url parts
+local default = {
+ host = "",
+ port = _M.PORT,
+ path ="/",
+ scheme = "http"
+}
+
+local function adjustrequest(reqt)
+ -- parse url if provided
+ local nreqt = reqt.url and url.parse(reqt.url, default) or {}
+ -- explicit components override url
+ for i,v in base.pairs(reqt) do nreqt[i] = v end
+ if nreqt.port == "" then nreqt.port = 80 end
+ socket.try(nreqt.host and nreqt.host ~= "",
+ "invalid host '" .. base.tostring(nreqt.host) .. "'")
+ -- compute uri if user hasn't overriden
+ nreqt.uri = reqt.uri or adjusturi(nreqt)
+ -- ajust host and port if there is a proxy
+ nreqt.host, nreqt.port = adjustproxy(nreqt)
+ -- adjust headers in request
+ nreqt.headers = adjustheaders(nreqt)
+ return nreqt
+end
+
+local function shouldredirect(reqt, code, headers)
+ return headers.location and
+ string.gsub(headers.location, "%s", "") ~= "" and
+ (reqt.redirect ~= false) and
+ (code == 301 or code == 302 or code == 303 or code == 307) and
+ (not reqt.method or reqt.method == "GET" or reqt.method == "HEAD")
+ and (not reqt.nredirects or reqt.nredirects < 5)
+end
+
+local function shouldreceivebody(reqt, code)
+ if reqt.method == "HEAD" then return nil end
+ if code == 204 or code == 304 then return nil end
+ if code >= 100 and code < 200 then return nil end
+ return 1
+end
+
+-- forward declarations
+local trequest, tredirect
+
+--[[local]] function tredirect(reqt, location)
+ local result, code, headers, status = trequest {
+ -- the RFC says the redirect URL has to be absolute, but some
+ -- servers do not respect that
+ url = url.absolute(reqt.url, location),
+ source = reqt.source,
+ sink = reqt.sink,
+ headers = reqt.headers,
+ proxy = reqt.proxy,
+ nredirects = (reqt.nredirects or 0) + 1,
+ create = reqt.create
+ }
+ -- pass location header back as a hint we redirected
+ headers = headers or {}
+ headers.location = headers.location or location
+ return result, code, headers, status
+end
+
+--[[local]] function trequest(reqt)
+ -- we loop until we get what we want, or
+ -- until we are sure there is no way to get it
+ local nreqt = adjustrequest(reqt)
+ local h = _M.open(nreqt.host, nreqt.port, nreqt.create)
+ -- send request line and headers
+ h:sendrequestline(nreqt.method, nreqt.uri)
+ h:sendheaders(nreqt.headers)
+ -- if there is a body, send it
+ if nreqt.source then
+ h:sendbody(nreqt.headers, nreqt.source, nreqt.step)
+ end
+ local code, status = h:receivestatusline()
+ -- if it is an HTTP/0.9 server, simply get the body and we are done
+ if not code then
+ h:receive09body(status, nreqt.sink, nreqt.step)
+ return 1, 200
+ end
+ local headers
+ -- ignore any 100-continue messages
+ while code == 100 do
+ headers = h:receiveheaders()
+ code, status = h:receivestatusline()
+ end
+ headers = h:receiveheaders()
+ -- at this point we should have a honest reply from the server
+ -- we can't redirect if we already used the source, so we report the error
+ if shouldredirect(nreqt, code, headers) and not nreqt.source then
+ h:close()
+ return tredirect(reqt, headers.location)
+ end
+ -- here we are finally done
+ if shouldreceivebody(nreqt, code) then
+ h:receivebody(headers, nreqt.sink, nreqt.step)
+ end
+ h:close()
+ return 1, code, headers, status
+end
+
+local function srequest(u, b)
+ local t = {}
+ local reqt = {
+ url = u,
+ sink = ltn12.sink.table(t)
+ }
+ if b then
+ reqt.source = ltn12.source.string(b)
+ reqt.headers = {
+ ["content-length"] = string.len(b),
+ ["content-type"] = "application/x-www-form-urlencoded"
+ }
+ reqt.method = "POST"
+ end
+ local code, headers, status = socket.skip(1, trequest(reqt))
+ return table.concat(t), code, headers, status
+end
+
+_M.request = socket.protect(function(reqt, body)
+ if base.type(reqt) == "string" then return srequest(reqt, body)
+ else return trequest(reqt) end
+end)
+
+return _M \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket/smtp.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket/smtp.lua
new file mode 100644
index 0000000..b113d00
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket/smtp.lua
@@ -0,0 +1,256 @@
+-----------------------------------------------------------------------------
+-- SMTP client support for the Lua language.
+-- LuaSocket toolkit.
+-- Author: Diego Nehab
+-----------------------------------------------------------------------------
+
+-----------------------------------------------------------------------------
+-- Declare module and import dependencies
+-----------------------------------------------------------------------------
+local base = _G
+local coroutine = require("coroutine")
+local string = require("string")
+local math = require("math")
+local os = require("os")
+local socket = require("socket")
+local tp = require("socket.tp")
+local ltn12 = require("ltn12")
+local headers = require("socket.headers")
+local mime = require("mime")
+
+socket.smtp = {}
+local _M = socket.smtp
+
+-----------------------------------------------------------------------------
+-- Program constants
+-----------------------------------------------------------------------------
+-- timeout for connection
+_M.TIMEOUT = 60
+-- default server used to send e-mails
+_M.SERVER = "localhost"
+-- default port
+_M.PORT = 25
+-- domain used in HELO command and default sendmail
+-- If we are under a CGI, try to get from environment
+_M.DOMAIN = os.getenv("SERVER_NAME") or "localhost"
+-- default time zone (means we don't know)
+_M.ZONE = "-0000"
+
+---------------------------------------------------------------------------
+-- Low level SMTP API
+-----------------------------------------------------------------------------
+local metat = { __index = {} }
+
+function metat.__index:greet(domain)
+ self.try(self.tp:check("2.."))
+ self.try(self.tp:command("EHLO", domain or _M.DOMAIN))
+ return socket.skip(1, self.try(self.tp:check("2..")))
+end
+
+function metat.__index:mail(from)
+ self.try(self.tp:command("MAIL", "FROM:" .. from))
+ return self.try(self.tp:check("2.."))
+end
+
+function metat.__index:rcpt(to)
+ self.try(self.tp:command("RCPT", "TO:" .. to))
+ return self.try(self.tp:check("2.."))
+end
+
+function metat.__index:data(src, step)
+ self.try(self.tp:command("DATA"))
+ self.try(self.tp:check("3.."))
+ self.try(self.tp:source(src, step))
+ self.try(self.tp:send("\r\n.\r\n"))
+ return self.try(self.tp:check("2.."))
+end
+
+function metat.__index:quit()
+ self.try(self.tp:command("QUIT"))
+ return self.try(self.tp:check("2.."))
+end
+
+function metat.__index:close()
+ return self.tp:close()
+end
+
+function metat.__index:login(user, password)
+ self.try(self.tp:command("AUTH", "LOGIN"))
+ self.try(self.tp:check("3.."))
+ self.try(self.tp:send(mime.b64(user) .. "\r\n"))
+ self.try(self.tp:check("3.."))
+ self.try(self.tp:send(mime.b64(password) .. "\r\n"))
+ return self.try(self.tp:check("2.."))
+end
+
+function metat.__index:plain(user, password)
+ local auth = "PLAIN " .. mime.b64("\0" .. user .. "\0" .. password)
+ self.try(self.tp:command("AUTH", auth))
+ return self.try(self.tp:check("2.."))
+end
+
+function metat.__index:auth(user, password, ext)
+ if not user or not password then return 1 end
+ if string.find(ext, "AUTH[^\n]+LOGIN") then
+ return self:login(user, password)
+ elseif string.find(ext, "AUTH[^\n]+PLAIN") then
+ return self:plain(user, password)
+ else
+ self.try(nil, "authentication not supported")
+ end
+end
+
+-- send message or throw an exception
+function metat.__index:send(mailt)
+ self:mail(mailt.from)
+ if base.type(mailt.rcpt) == "table" then
+ for i,v in base.ipairs(mailt.rcpt) do
+ self:rcpt(v)
+ end
+ else
+ self:rcpt(mailt.rcpt)
+ end
+ self:data(ltn12.source.chain(mailt.source, mime.stuff()), mailt.step)
+end
+
+function _M.open(server, port, create)
+ local tp = socket.try(tp.connect(server or _M.SERVER, port or _M.PORT,
+ _M.TIMEOUT, create))
+ local s = base.setmetatable({tp = tp}, metat)
+ -- make sure tp is closed if we get an exception
+ s.try = socket.newtry(function()
+ s:close()
+ end)
+ return s
+end
+
+-- convert headers to lowercase
+local function lower_headers(headers)
+ local lower = {}
+ for i,v in base.pairs(headers or lower) do
+ lower[string.lower(i)] = v
+ end
+ return lower
+end
+
+---------------------------------------------------------------------------
+-- Multipart message source
+-----------------------------------------------------------------------------
+-- returns a hopefully unique mime boundary
+local seqno = 0
+local function newboundary()
+ seqno = seqno + 1
+ return string.format('%s%05d==%05u', os.date('%d%m%Y%H%M%S'),
+ math.random(0, 99999), seqno)
+end
+
+-- send_message forward declaration
+local send_message
+
+-- yield the headers all at once, it's faster
+local function send_headers(tosend)
+ local canonic = headers.canonic
+ local h = "\r\n"
+ for f,v in base.pairs(tosend) do
+ h = (canonic[f] or f) .. ': ' .. v .. "\r\n" .. h
+ end
+ coroutine.yield(h)
+end
+
+-- yield multipart message body from a multipart message table
+local function send_multipart(mesgt)
+ -- make sure we have our boundary and send headers
+ local bd = newboundary()
+ local headers = lower_headers(mesgt.headers or {})
+ headers['content-type'] = headers['content-type'] or 'multipart/mixed'
+ headers['content-type'] = headers['content-type'] ..
+ '; boundary="' .. bd .. '"'
+ send_headers(headers)
+ -- send preamble
+ if mesgt.body.preamble then
+ coroutine.yield(mesgt.body.preamble)
+ coroutine.yield("\r\n")
+ end
+ -- send each part separated by a boundary
+ for i, m in base.ipairs(mesgt.body) do
+ coroutine.yield("\r\n--" .. bd .. "\r\n")
+ send_message(m)
+ end
+ -- send last boundary
+ coroutine.yield("\r\n--" .. bd .. "--\r\n\r\n")
+ -- send epilogue
+ if mesgt.body.epilogue then
+ coroutine.yield(mesgt.body.epilogue)
+ coroutine.yield("\r\n")
+ end
+end
+
+-- yield message body from a source
+local function send_source(mesgt)
+ -- make sure we have a content-type
+ local headers = lower_headers(mesgt.headers or {})
+ headers['content-type'] = headers['content-type'] or
+ 'text/plain; charset="iso-8859-1"'
+ send_headers(headers)
+ -- send body from source
+ while true do
+ local chunk, err = mesgt.body()
+ if err then coroutine.yield(nil, err)
+ elseif chunk then coroutine.yield(chunk)
+ else break end
+ end
+end
+
+-- yield message body from a string
+local function send_string(mesgt)
+ -- make sure we have a content-type
+ local headers = lower_headers(mesgt.headers or {})
+ headers['content-type'] = headers['content-type'] or
+ 'text/plain; charset="iso-8859-1"'
+ send_headers(headers)
+ -- send body from string
+ coroutine.yield(mesgt.body)
+end
+
+-- message source
+function send_message(mesgt)
+ if base.type(mesgt.body) == "table" then send_multipart(mesgt)
+ elseif base.type(mesgt.body) == "function" then send_source(mesgt)
+ else send_string(mesgt) end
+end
+
+-- set defaul headers
+local function adjust_headers(mesgt)
+ local lower = lower_headers(mesgt.headers)
+ lower["date"] = lower["date"] or
+ os.date("!%a, %d %b %Y %H:%M:%S ") .. (mesgt.zone or _M.ZONE)
+ lower["x-mailer"] = lower["x-mailer"] or socket._VERSION
+ -- this can't be overriden
+ lower["mime-version"] = "1.0"
+ return lower
+end
+
+function _M.message(mesgt)
+ mesgt.headers = adjust_headers(mesgt)
+ -- create and return message source
+ local co = coroutine.create(function() send_message(mesgt) end)
+ return function()
+ local ret, a, b = coroutine.resume(co)
+ if ret then return a, b
+ else return nil, a end
+ end
+end
+
+---------------------------------------------------------------------------
+-- High level SMTP API
+-----------------------------------------------------------------------------
+_M.send = socket.protect(function(mailt)
+ local s = _M.open(mailt.server, mailt.port, mailt.create)
+ local ext = s:greet(mailt.domain)
+ s:auth(mailt.user, mailt.password, ext)
+ s:send(mailt)
+ s:quit()
+ return s:close()
+end)
+
+return _M \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket/tp.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket/tp.lua
new file mode 100644
index 0000000..cbeff56
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket/tp.lua
@@ -0,0 +1,126 @@
+-----------------------------------------------------------------------------
+-- Unified SMTP/FTP subsystem
+-- LuaSocket toolkit.
+-- Author: Diego Nehab
+-----------------------------------------------------------------------------
+
+-----------------------------------------------------------------------------
+-- Declare module and import dependencies
+-----------------------------------------------------------------------------
+local base = _G
+local string = require("string")
+local socket = require("socket")
+local ltn12 = require("ltn12")
+
+socket.tp = {}
+local _M = socket.tp
+
+-----------------------------------------------------------------------------
+-- Program constants
+-----------------------------------------------------------------------------
+_M.TIMEOUT = 60
+
+-----------------------------------------------------------------------------
+-- Implementation
+-----------------------------------------------------------------------------
+-- gets server reply (works for SMTP and FTP)
+local function get_reply(c)
+ local code, current, sep
+ local line, err = c:receive()
+ local reply = line
+ if err then return nil, err end
+ code, sep = socket.skip(2, string.find(line, "^(%d%d%d)(.?)"))
+ if not code then return nil, "invalid server reply" end
+ if sep == "-" then -- reply is multiline
+ repeat
+ line, err = c:receive()
+ if err then return nil, err end
+ current, sep = socket.skip(2, string.find(line, "^(%d%d%d)(.?)"))
+ reply = reply .. "\n" .. line
+ -- reply ends with same code
+ until code == current and sep == " "
+ end
+ return code, reply
+end
+
+-- metatable for sock object
+local metat = { __index = {} }
+
+function metat.__index:check(ok)
+ local code, reply = get_reply(self.c)
+ if not code then return nil, reply end
+ if base.type(ok) ~= "function" then
+ if base.type(ok) == "table" then
+ for i, v in base.ipairs(ok) do
+ if string.find(code, v) then
+ return base.tonumber(code), reply
+ end
+ end
+ return nil, reply
+ else
+ if string.find(code, ok) then return base.tonumber(code), reply
+ else return nil, reply end
+ end
+ else return ok(base.tonumber(code), reply) end
+end
+
+function metat.__index:command(cmd, arg)
+ cmd = string.upper(cmd)
+ if arg then
+ return self.c:send(cmd .. " " .. arg.. "\r\n")
+ else
+ return self.c:send(cmd .. "\r\n")
+ end
+end
+
+function metat.__index:sink(snk, pat)
+ local chunk, err = c:receive(pat)
+ return snk(chunk, err)
+end
+
+function metat.__index:send(data)
+ return self.c:send(data)
+end
+
+function metat.__index:receive(pat)
+ return self.c:receive(pat)
+end
+
+function metat.__index:getfd()
+ return self.c:getfd()
+end
+
+function metat.__index:dirty()
+ return self.c:dirty()
+end
+
+function metat.__index:getcontrol()
+ return self.c
+end
+
+function metat.__index:source(source, step)
+ local sink = socket.sink("keep-open", self.c)
+ local ret, err = ltn12.pump.all(source, sink, step or ltn12.pump.step)
+ return ret, err
+end
+
+-- closes the underlying c
+function metat.__index:close()
+ self.c:close()
+ return 1
+end
+
+-- connect with server and return c object
+function _M.connect(host, port, timeout, create)
+ local c, e = (create or socket.tcp)()
+ if not c then return nil, e end
+ c:settimeout(timeout or _M.TIMEOUT)
+ local r, e = c:connect(host, port)
+ if not r then
+ c:close()
+ return nil, e
+ end
+ return base.setmetatable({c = c}, metat)
+end
+
+return _M \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket/url.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket/url.lua
new file mode 100644
index 0000000..7809535
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/socket/url.lua
@@ -0,0 +1,307 @@
+-----------------------------------------------------------------------------
+-- URI parsing, composition and relative URL resolution
+-- LuaSocket toolkit.
+-- Author: Diego Nehab
+-----------------------------------------------------------------------------
+
+-----------------------------------------------------------------------------
+-- Declare module
+-----------------------------------------------------------------------------
+local string = require("string")
+local base = _G
+local table = require("table")
+local socket = require("socket")
+
+socket.url = {}
+local _M = socket.url
+
+-----------------------------------------------------------------------------
+-- Module version
+-----------------------------------------------------------------------------
+_M._VERSION = "URL 1.0.3"
+
+-----------------------------------------------------------------------------
+-- Encodes a string into its escaped hexadecimal representation
+-- Input
+-- s: binary string to be encoded
+-- Returns
+-- escaped representation of string binary
+-----------------------------------------------------------------------------
+function _M.escape(s)
+ return (string.gsub(s, "([^A-Za-z0-9_])", function(c)
+ return string.format("%%%02x", string.byte(c))
+ end))
+end
+
+-----------------------------------------------------------------------------
+-- Protects a path segment, to prevent it from interfering with the
+-- url parsing.
+-- Input
+-- s: binary string to be encoded
+-- Returns
+-- escaped representation of string binary
+-----------------------------------------------------------------------------
+local function make_set(t)
+ local s = {}
+ for i,v in base.ipairs(t) do
+ s[t[i]] = 1
+ end
+ return s
+end
+
+-- these are allowed withing a path segment, along with alphanum
+-- other characters must be escaped
+local segment_set = make_set {
+ "-", "_", ".", "!", "~", "*", "'", "(",
+ ")", ":", "@", "&", "=", "+", "$", ",",
+}
+
+local function protect_segment(s)
+ return string.gsub(s, "([^A-Za-z0-9_])", function (c)
+ if segment_set[c] then return c
+ else return string.format("%%%02x", string.byte(c)) end
+ end)
+end
+
+-----------------------------------------------------------------------------
+-- Encodes a string into its escaped hexadecimal representation
+-- Input
+-- s: binary string to be encoded
+-- Returns
+-- escaped representation of string binary
+-----------------------------------------------------------------------------
+function _M.unescape(s)
+ return (string.gsub(s, "%%(%x%x)", function(hex)
+ return string.char(base.tonumber(hex, 16))
+ end))
+end
+
+-----------------------------------------------------------------------------
+-- Builds a path from a base path and a relative path
+-- Input
+-- base_path
+-- relative_path
+-- Returns
+-- corresponding absolute path
+-----------------------------------------------------------------------------
+local function absolute_path(base_path, relative_path)
+ if string.sub(relative_path, 1, 1) == "/" then return relative_path end
+ local path = string.gsub(base_path, "[^/]*$", "")
+ path = path .. relative_path
+ path = string.gsub(path, "([^/]*%./)", function (s)
+ if s ~= "./" then return s else return "" end
+ end)
+ path = string.gsub(path, "/%.$", "/")
+ local reduced
+ while reduced ~= path do
+ reduced = path
+ path = string.gsub(reduced, "([^/]*/%.%./)", function (s)
+ if s ~= "../../" then return "" else return s end
+ end)
+ end
+ path = string.gsub(reduced, "([^/]*/%.%.)$", function (s)
+ if s ~= "../.." then return "" else return s end
+ end)
+ return path
+end
+
+-----------------------------------------------------------------------------
+-- Parses a url and returns a table with all its parts according to RFC 2396
+-- The following grammar describes the names given to the URL parts
+-- <url> ::= <scheme>://<authority>/<path>;<params>?<query>#<fragment>
+-- <authority> ::= <userinfo>@<host>:<port>
+-- <userinfo> ::= <user>[:<password>]
+-- <path> :: = {<segment>/}<segment>
+-- Input
+-- url: uniform resource locator of request
+-- default: table with default values for each field
+-- Returns
+-- table with the following fields, where RFC naming conventions have
+-- been preserved:
+-- scheme, authority, userinfo, user, password, host, port,
+-- path, params, query, fragment
+-- Obs:
+-- the leading '/' in {/<path>} is considered part of <path>
+-----------------------------------------------------------------------------
+function _M.parse(url, default)
+ -- initialize default parameters
+ local parsed = {}
+ for i,v in base.pairs(default or parsed) do parsed[i] = v end
+ -- empty url is parsed to nil
+ if not url or url == "" then return nil, "invalid url" end
+ -- remove whitespace
+ -- url = string.gsub(url, "%s", "")
+ -- get fragment
+ url = string.gsub(url, "#(.*)$", function(f)
+ parsed.fragment = f
+ return ""
+ end)
+ -- get scheme
+ url = string.gsub(url, "^([%w][%w%+%-%.]*)%:",
+ function(s) parsed.scheme = s; return "" end)
+ -- get authority
+ url = string.gsub(url, "^//([^/]*)", function(n)
+ parsed.authority = n
+ return ""
+ end)
+ -- get query string
+ url = string.gsub(url, "%?(.*)", function(q)
+ parsed.query = q
+ return ""
+ end)
+ -- get params
+ url = string.gsub(url, "%;(.*)", function(p)
+ parsed.params = p
+ return ""
+ end)
+ -- path is whatever was left
+ if url ~= "" then parsed.path = url end
+ local authority = parsed.authority
+ if not authority then return parsed end
+ authority = string.gsub(authority,"^([^@]*)@",
+ function(u) parsed.userinfo = u; return "" end)
+ authority = string.gsub(authority, ":([^:%]]*)$",
+ function(p) parsed.port = p; return "" end)
+ if authority ~= "" then
+ -- IPv6?
+ parsed.host = string.match(authority, "^%[(.+)%]$") or authority
+ end
+ local userinfo = parsed.userinfo
+ if not userinfo then return parsed end
+ userinfo = string.gsub(userinfo, ":([^:]*)$",
+ function(p) parsed.password = p; return "" end)
+ parsed.user = userinfo
+ return parsed
+end
+
+-----------------------------------------------------------------------------
+-- Rebuilds a parsed URL from its components.
+-- Components are protected if any reserved or unallowed characters are found
+-- Input
+-- parsed: parsed URL, as returned by parse
+-- Returns
+-- a stringing with the corresponding URL
+-----------------------------------------------------------------------------
+function _M.build(parsed)
+ local ppath = _M.parse_path(parsed.path or "")
+ local url = _M.build_path(ppath)
+ if parsed.params then url = url .. ";" .. parsed.params end
+ if parsed.query then url = url .. "?" .. parsed.query end
+ local authority = parsed.authority
+ if parsed.host then
+ authority = parsed.host
+ if string.find(authority, ":") then -- IPv6?
+ authority = "[" .. authority .. "]"
+ end
+ if parsed.port then authority = authority .. ":" .. parsed.port end
+ local userinfo = parsed.userinfo
+ if parsed.user then
+ userinfo = parsed.user
+ if parsed.password then
+ userinfo = userinfo .. ":" .. parsed.password
+ end
+ end
+ if userinfo then authority = userinfo .. "@" .. authority end
+ end
+ if authority then url = "//" .. authority .. url end
+ if parsed.scheme then url = parsed.scheme .. ":" .. url end
+ if parsed.fragment then url = url .. "#" .. parsed.fragment end
+ -- url = string.gsub(url, "%s", "")
+ return url
+end
+
+-----------------------------------------------------------------------------
+-- Builds a absolute URL from a base and a relative URL according to RFC 2396
+-- Input
+-- base_url
+-- relative_url
+-- Returns
+-- corresponding absolute url
+-----------------------------------------------------------------------------
+function _M.absolute(base_url, relative_url)
+ if base.type(base_url) == "table" then
+ base_parsed = base_url
+ base_url = _M.build(base_parsed)
+ else
+ base_parsed = _M.parse(base_url)
+ end
+ local relative_parsed = _M.parse(relative_url)
+ if not base_parsed then return relative_url
+ elseif not relative_parsed then return base_url
+ elseif relative_parsed.scheme then return relative_url
+ else
+ relative_parsed.scheme = base_parsed.scheme
+ if not relative_parsed.authority then
+ relative_parsed.authority = base_parsed.authority
+ if not relative_parsed.path then
+ relative_parsed.path = base_parsed.path
+ if not relative_parsed.params then
+ relative_parsed.params = base_parsed.params
+ if not relative_parsed.query then
+ relative_parsed.query = base_parsed.query
+ end
+ end
+ else
+ relative_parsed.path = absolute_path(base_parsed.path or "",
+ relative_parsed.path)
+ end
+ end
+ return _M.build(relative_parsed)
+ end
+end
+
+-----------------------------------------------------------------------------
+-- Breaks a path into its segments, unescaping the segments
+-- Input
+-- path
+-- Returns
+-- segment: a table with one entry per segment
+-----------------------------------------------------------------------------
+function _M.parse_path(path)
+ local parsed = {}
+ path = path or ""
+ --path = string.gsub(path, "%s", "")
+ string.gsub(path, "([^/]+)", function (s) table.insert(parsed, s) end)
+ for i = 1, #parsed do
+ parsed[i] = _M.unescape(parsed[i])
+ end
+ if string.sub(path, 1, 1) == "/" then parsed.is_absolute = 1 end
+ if string.sub(path, -1, -1) == "/" then parsed.is_directory = 1 end
+ return parsed
+end
+
+-----------------------------------------------------------------------------
+-- Builds a path component from its segments, escaping protected characters.
+-- Input
+-- parsed: path segments
+-- unsafe: if true, segments are not protected before path is built
+-- Returns
+-- path: corresponding path stringing
+-----------------------------------------------------------------------------
+function _M.build_path(parsed, unsafe)
+ local path = ""
+ local n = #parsed
+ if unsafe then
+ for i = 1, n-1 do
+ path = path .. parsed[i]
+ path = path .. "/"
+ end
+ if n > 0 then
+ path = path .. parsed[n]
+ if parsed.is_directory then path = path .. "/" end
+ end
+ else
+ for i = 1, n-1 do
+ path = path .. protect_segment(parsed[i])
+ path = path .. "/"
+ end
+ if n > 0 then
+ path = path .. protect_segment(parsed[n])
+ if parsed.is_directory then path = path .. "/" end
+ end
+ end
+ if parsed.is_absolute then path = "/" .. path end
+ return path
+end
+
+return _M
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/ssl.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/ssl.lua
new file mode 100644
index 0000000..0170bc8
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/ssl.lua
@@ -0,0 +1,93 @@
+------------------------------------------------------------------------------
+-- LuaSec 0.4.1
+-- Copyright (C) 2006-2011 Bruno Silvestre
+--
+------------------------------------------------------------------------------
+
+module("ssl", package.seeall)
+
+require("ssl.core")
+require("ssl.context")
+
+
+_VERSION = "0.4.1"
+_COPYRIGHT = "LuaSec 0.4.1 - Copyright (C) 2006-2011 Bruno Silvestre\n" ..
+ "LuaSocket 2.0.2 - Copyright (C) 2004-2007 Diego Nehab"
+
+-- Export functions
+rawconnection = core.rawconnection
+rawcontext = context.rawcontext
+
+--
+--
+--
+local function optexec(func, param, ctx)
+ if param then
+ if type(param) == "table" then
+ return func(ctx, unpack(param))
+ else
+ return func(ctx, param)
+ end
+ end
+ return true
+end
+
+--
+--
+--
+function newcontext(cfg)
+ local succ, msg, ctx
+ -- Create the context
+ ctx, msg = context.create(cfg.protocol)
+ if not ctx then return nil, msg end
+ -- Mode
+ succ, msg = context.setmode(ctx, cfg.mode)
+ if not succ then return nil, msg end
+ -- Load the key
+ if cfg.key then
+ succ, msg = context.loadkey(ctx, cfg.key, cfg.password)
+ if not succ then return nil, msg end
+ end
+ -- Load the certificate
+ if cfg.certificate then
+ succ, msg = context.loadcert(ctx, cfg.certificate)
+ if not succ then return nil, msg end
+ end
+ -- Load the CA certificates
+ if cfg.cafile or cfg.capath then
+ succ, msg = context.locations(ctx, cfg.cafile, cfg.capath)
+ if not succ then return nil, msg end
+ end
+ -- Set the verification options
+ succ, msg = optexec(context.setverify, cfg.verify, ctx)
+ if not succ then return nil, msg end
+ -- Set SSL options
+ succ, msg = optexec(context.setoptions, cfg.options, ctx)
+ if not succ then return nil, msg end
+ -- Set the depth for certificate verification
+ if cfg.depth then
+ succ, msg = context.setdepth(ctx, cfg.depth)
+ if not succ then return nil, msg end
+ end
+ return ctx
+end
+
+--
+--
+--
+function wrap(sock, cfg)
+ local ctx, msg
+ if type(cfg) == "table" then
+ ctx, msg = newcontext(cfg)
+ if not ctx then return nil, msg end
+ else
+ ctx = cfg
+ end
+ local s, msg = core.create(ctx)
+ if s then
+ core.setfd(s, sock:getfd())
+ sock:setfd(core.invalidfd)
+ return s
+ end
+ return nil, msg
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/ssl/https.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/ssl/https.lua
new file mode 100644
index 0000000..00a7e5b
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/ssl/https.lua
@@ -0,0 +1,138 @@
+----------------------------------------------------------------------------
+-- LuaSec 0.4.1
+-- Copyright (C) 2009-2011 PUC-Rio
+--
+-- Author: Pablo Musa
+-- Author: Tomas Guisasola
+---------------------------------------------------------------------------
+
+local socket = require("socket")
+local ssl = require("ssl")
+local ltn12 = require("ltn12")
+local http = require("socket.http")
+local url = require("socket.url")
+
+local table = require("table")
+local string = require("string")
+
+local try = socket.try
+local type = type
+local pairs = pairs
+local getmetatable = getmetatable
+
+module("ssl.https")
+
+_VERSION = "0.4.1"
+_COPYRIGHT = "LuaSec 0.4.1 - Copyright (C) 2009-2011 PUC-Rio"
+
+-- Default settings
+PORT = 443
+
+local cfg = {
+ protocol = "tlsv1",
+ options = "all",
+ verify = "none",
+}
+
+--------------------------------------------------------------------
+-- Auxiliar Functions
+--------------------------------------------------------------------
+
+-- Insert default HTTPS port.
+local function default_https_port(u)
+ return url.build(url.parse(u, {port = PORT}))
+end
+
+-- Convert an URL to a table according to Luasocket needs.
+local function urlstring_totable(url, body, result_table)
+ url = {
+ url = default_https_port(url),
+ method = body and "POST" or "GET",
+ sink = ltn12.sink.table(result_table)
+ }
+ if body then
+ url.source = ltn12.source.string(body)
+ url.headers = {
+ ["content-length"] = #body,
+ ["content-type"] = "application/x-www-form-urlencoded",
+ }
+ end
+ return url
+end
+
+-- Forward calls to the real connection object.
+local function reg(conn)
+ local mt = getmetatable(conn.sock).__index
+ for name, method in pairs(mt) do
+ if type(method) == "function" then
+ conn[name] = function (self, ...)
+ return method(self.sock, ...)
+ end
+ end
+ end
+end
+
+-- Return a function which performs the SSL/TLS connection.
+local function tcp(params)
+ params = params or {}
+ -- Default settings
+ for k, v in pairs(cfg) do
+ params[k] = params[k] or v
+ end
+ -- Force client mode
+ params.mode = "client"
+ -- 'create' function for LuaSocket
+ return function ()
+ local conn = {}
+ conn.sock = try(socket.tcp())
+ local st = getmetatable(conn.sock).__index.settimeout
+ function conn:settimeout(...)
+ return st(self.sock, ...)
+ end
+ -- Replace TCP's connection function
+ function conn:connect(host, port)
+ try(self.sock:connect(host, port))
+ self.sock = try(ssl.wrap(self.sock, params))
+ try(self.sock:dohandshake())
+ reg(self, getmetatable(self.sock))
+ return 1
+ end
+ return conn
+ end
+end
+
+--------------------------------------------------------------------
+-- Main Function
+--------------------------------------------------------------------
+
+-- Make a HTTP request over secure connection. This function receives
+-- the same parameters of LuaSocket's HTTP module (except 'proxy' and
+-- 'redirect') plus LuaSec parameters.
+--
+-- @param url mandatory (string or table)
+-- @param body optional (string)
+-- @return (string if url == string or 1), code, headers, status
+--
+function request(url, body)
+ local result_table = {}
+ local stringrequest = type(url) == "string"
+ if stringrequest then
+ url = urlstring_totable(url, body, result_table)
+ else
+ url.url = default_https_port(url.url)
+ end
+ if http.PROXY or url.proxy then
+ return nil, "proxy not supported"
+ elseif url.redirect then
+ return nil, "redirect not supported"
+ elseif url.create then
+ return nil, "create function not permitted"
+ end
+ -- New 'create' function to establish a secure connection
+ url.create = tcp(url)
+ local res, code, headers, status = http.request(url)
+ if res and stringrequest then
+ return table.concat(result_table), code, headers, status
+ end
+ return res, code, headers, status
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/testwell.lua b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/testwell.lua
new file mode 100644
index 0000000..8172e34
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/lualibs/testwell.lua
@@ -0,0 +1,315 @@
+--
+-- Copyright (C) 2012 Paul Kulchenko
+-- A simple testing library
+-- Based on lua-TestMore : <http://fperrad.github.com/lua-TestMore/>
+-- Copyright (c) 2009-2011 Francois Perrad
+-- This library is licensed under the terms of the MIT/X11 license,
+-- like Lua itself.
+--
+
+local pairs = pairs
+local tostring = tostring
+local type = type
+local _G = _G or _ENV
+
+-----------------------------------------------------------
+
+local tb = {
+ curr_test = 0,
+ good_test = 0,
+ skip_test = 0,
+}
+
+function tb:print(...)
+ print(...)
+end
+
+function tb:note(...)
+ self:print(...)
+end
+
+function tb:diag(...)
+ local arg = {...}
+ for k, v in pairs(arg) do
+ arg[k] = tostring(v)
+ end
+ local msg = table.concat(arg)
+ msg = msg:gsub("\n", "\n# ")
+ msg = msg:gsub("\n# \n", "\n#\n")
+ msg = msg:gsub("\n# $", '')
+ self:print("# " .. msg)
+end
+
+function tb:ok(test, name, more)
+ self.curr_test = self.curr_test + 1
+ self.good_test = self.good_test + (test and 1 or 0)
+ self.skip_test = self.skip_test + (test == nil and 1 or 0)
+ name = tostring(name or '')
+ local out = ''
+ if not test then
+ out = "not "
+ end
+ out = out .. "ok " .. self.curr_test
+ if name ~= '' then
+ out = out .. " - " .. name
+ end
+ self:print(out)
+ if test == false then
+ self:diag(" Failed test " .. (name and ("'" .. name .. "'") or ''))
+ if debug then
+ local info = debug.getinfo(3)
+ local file = info.short_src
+ local line = info.currentline
+ self:diag(" in " .. file .. " at line " .. line .. ".")
+ end
+ self:diag(more)
+ end
+end
+
+function tb:done_testing(reset)
+ local c, g, s = self.curr_test, self.good_test, self.skip_test
+ if reset then
+ self.curr_test = 0
+ self.good_test = 0
+ self.skip_test = 0
+ end
+ return c, g, s
+end
+
+-----------------------------------------------------------
+
+local serpent = (function() ---- include Serpent module for serialization
+local n, v = "serpent", 0.15 -- (C) 2012 Paul Kulchenko; MIT License
+local c, d = "Paul Kulchenko", "Serializer and pretty printer of Lua data types"
+local snum = {[tostring(1/0)]='1/0 --[[math.huge]]',[tostring(-1/0)]='-1/0 --[[-math.huge]]',[tostring(0/0)]='0/0'}
+local badtype = {thread = true, userdata = true}
+local keyword, globals, G = {}, {}, (_G or _ENV)
+for _,k in ipairs({'and', 'break', 'do', 'else', 'elseif', 'end', 'false',
+ 'for', 'function', 'goto', 'if', 'in', 'local', 'nil', 'not', 'or', 'repeat',
+ 'return', 'then', 'true', 'until', 'while'}) do keyword[k] = true end
+for k,v in pairs(G) do globals[v] = k end -- build func to name mapping
+for _,g in ipairs({'coroutine', 'debug', 'io', 'math', 'string', 'table', 'os'}) do
+ for k,v in pairs(G[g]) do globals[v] = g..'.'..k end end
+
+local function s(t, opts)
+ local name, indent, fatal = opts.name, opts.indent, opts.fatal
+ local sparse, custom, huge = opts.sparse, opts.custom, not opts.nohuge
+ local space, maxl = (opts.compact and '' or ' '), (opts.maxlevel or math.huge)
+ local comm = opts.comment and (tonumber(opts.comment) or math.huge)
+ local seen, sref, syms, symn = {}, {}, {}, 0
+ local function gensym(val) return tostring(val):gsub("[^%w]",""):gsub("(%d%w+)",
+ function(s) if not syms[s] then symn = symn+1; syms[s] = symn end return syms[s] end) end
+ local function safestr(s) return type(s) == "number" and (huge and snum[tostring(s)] or s)
+ or type(s) ~= "string" and tostring(s) -- escape NEWLINE/010 and EOF/026
+ or ("%q"):format(s):gsub("\010","n"):gsub("\026","\\026") end
+ local function comment(s,l) return comm and (l or 0) < comm and ' --[['..tostring(s)..']]' or '' end
+ local function globerr(s,l) return globals[s] and globals[s]..comment(s,l) or not fatal
+ and safestr(tostring(s))..comment('err',l) or error("Can't serialize "..tostring(s)) end
+ local function safename(path, name) -- generates foo.bar, foo[3], or foo['b a r']
+ local n = name == nil and '' or name
+ local plain = type(n) == "string" and n:match("^[%l%u_][%w_]*$") and not keyword[n]
+ local safe = plain and n or '['..safestr(n)..']'
+ return (path or '')..(plain and path and '.' or '')..safe, safe end
+ local alphanumsort = type(opts.sortkeys) == 'function' and opts.sortkeys or function(o, n)
+ local maxn, to = tonumber(n) or 12, {number = 'a', string = 'b'}
+ local function padnum(d) return ("%0"..maxn.."d"):format(d) end
+ table.sort(o, function(a,b)
+ return (o[a] and 0 or to[type(a)] or 'z')..(tostring(a):gsub("%d+",padnum))
+ < (o[b] and 0 or to[type(b)] or 'z')..(tostring(b):gsub("%d+",padnum)) end) end
+ local function val2str(t, name, indent, path, plainindex, level)
+ local ttype, level = type(t), (level or 0)
+ local spath, sname = safename(path, name)
+ local tag = plainindex and
+ ((type(name) == "number") and '' or name..space..'='..space) or
+ (name ~= nil and sname..space..'='..space or '')
+ if seen[t] then
+ table.insert(sref, spath..space..'='..space..seen[t])
+ return tag..'nil'..comment('ref', level)
+ elseif badtype[ttype] then return tag..globerr(t, level)
+ elseif ttype == 'function' then
+ seen[t] = spath
+ local ok, res = pcall(string.dump, t)
+ local func = ok and ((opts.nocode and "function() end" or
+ "loadstring("..safestr(res)..",'@serialized')")..comment(t, level))
+ return tag..(func or globerr(t, level))
+ elseif ttype == "table" then
+ if level >= maxl then return tag..'{}'..comment('max', level) end
+ seen[t] = spath
+ if next(t) == nil then return tag..'{}'..comment(t, level) end -- table empty
+ local maxn, o, out = #t, {}, {}
+ for key = 1, maxn do table.insert(o, key) end
+ for key in pairs(t) do if not o[key] then table.insert(o, key) end end
+ if opts.sortkeys then alphanumsort(o, opts.sortkeys) end
+ for n, key in ipairs(o) do
+ local value, ktype, plainindex = t[key], type(key), n <= maxn and not sparse
+ if opts.ignore and opts.ignore[value] -- skip ignored values; do nothing
+ or sparse and value == nil then -- skipping nils; do nothing
+ elseif ktype == 'table' or ktype == 'function' then
+ if not seen[key] and not globals[key] then
+ table.insert(sref, 'local '..val2str(key,gensym(key),indent)) end
+ table.insert(sref, seen[t]..'['..(seen[key] or globals[key] or gensym(key))
+ ..']'..space..'='..space..(seen[value] or val2str(value,nil,indent)))
+ else
+ if badtype[ktype] then plainindex, key = true, '['..globerr(key, level+1)..']' end
+ table.insert(out,val2str(value,key,indent,spath,plainindex,level+1))
+ end
+ end
+ local prefix = string.rep(indent or '', level)
+ local head = indent and '{\n'..prefix..indent or '{'
+ local body = table.concat(out, ','..(indent and '\n'..prefix..indent or space))
+ local tail = indent and "\n"..prefix..'}' or '}'
+ return (custom and custom(tag,head,body,tail) or tag..head..body..tail)..comment(t, level)
+ else return tag..safestr(t) end -- handle all other types
+ end
+ local sepr = indent and "\n" or ";"..space
+ local body = val2str(t, name, indent) -- this call also populates sref
+ local tail = #sref>0 and table.concat(sref, sepr)..sepr or ''
+ return not name and body or "do local "..body..sepr..tail.."return "..name..sepr.."end"
+end
+
+local function merge(a, b) if b then for k,v in pairs(b) do a[k] = v end end; return a; end
+return { _NAME = n, _COPYRIGHT = c, _DESCRIPTION = d, _VERSION = v, serialize = s,
+ dump = function(a, opts) return s(a, merge({name = '_', compact = true, sparse = true}, opts)) end,
+ line = function(a, opts) return s(a, merge({sortkeys = true, comment = true}, opts)) end,
+ block = function(a, opts) return s(a, merge({indent = ' ', sortkeys = true, comment = true}, opts)) end }
+end)() ---- end of Serpent module
+
+-----------------------------------------------------------
+
+local m = {}
+
+function m.ok(test, name)
+ tb:ok(test, name)
+end
+
+local parms = {comment = false}
+function m.is(got, expected, name)
+ local tgot, texp = type(got), type(expected)
+ local vgot, vexp = serpent.line(got, parms), serpent.line(expected, parms)
+ local pass = vgot == vexp
+ if got == nil then pass = nil end
+ tb:ok(pass, name, not pass and
+ " got: " .. vgot .. " (" .. tgot .. ")" ..
+ "\n expected: " .. vexp .. " (" .. texp .. ")")
+end
+
+function m.isnt(got, expected, name)
+ local tgot, texp = type(got), type(expected)
+ local vgot, vexp = serpent.line(got, parms), serpent.line(expected, parms)
+ local pass = vgot ~= vexp
+ if got == nil then pass = nil end
+ tb:ok(pass, name, not pass and
+ " got: " .. vgot .. " (" .. tgot .. ")" ..
+ "\n expected: anything else")
+end
+
+function m.like(got, pattern, name)
+ if type(pattern) ~= 'string' then
+ return tb:ok(false, name, "pattern isn't a string : " .. tostring(pattern))
+ end
+
+ local pass = tostring(got):match(pattern)
+ if got == nil then pass = nil end
+ tb:ok(pass, name, not pass and
+ " '" .. tostring(got) .. "'" ..
+ "\n doesn't match '" .. pattern .. "'")
+end
+
+function m.unlike(got, pattern, name)
+ if type(pattern) ~= 'string' then
+ return tb:ok(false, name, "pattern isn't a string : " .. tostring(pattern))
+ end
+
+ local pass = not tostring(got):match(pattern)
+ if got == nil then pass = nil end
+ tb:ok(pass, name, not pass and
+ " '" .. tostring(got) .. "'" ..
+ "\n matches '" .. pattern .. "'")
+end
+
+local cmp = {
+ ['<'] = function (a, b) return a < b end,
+ ['<='] = function (a, b) return a <= b end,
+ ['>'] = function (a, b) return a > b end,
+ ['>='] = function (a, b) return a >= b end,
+ ['=='] = function (a, b) return a == b end,
+ ['~='] = function (a, b) return a ~= b end,
+}
+
+function m.cmp_ok(this, op, that, name)
+ local f = cmp[op]
+ if not f then
+ return tb:ok(false, name, "unknown operator : " .. tostring(op))
+ end
+
+ local pass = f(this, that)
+ if this == nil then pass = nil end
+ tb:ok(pass, name, not pass and
+ " " .. tostring(this) ..
+ "\n " .. op ..
+ "\n " .. tostring(that))
+end
+
+function m.type_ok(val, t, name)
+ if type(t) ~= 'string' then
+ return tb:ok(false, name, "type isn't a string : " .. tostring(t))
+ end
+
+ if type(val) == t then
+ tb:ok(true, name)
+ else
+ tb:ok(false, name,
+ " " .. tostring(val) .. " isn't a '" .. t .."', it's a '" .. type(val) .. "'")
+ end
+end
+
+function m.diag(...)
+ tb:diag(...)
+end
+
+function m.report()
+ local total, good, skipped = tb:done_testing(true)
+ if total == 0 then return end
+ local failed = total - good - skipped
+ local sum = ("(%d/%d/%d)."):format(good, skipped, total)
+ local num, msg = 0, ""
+ if good > 0 then
+ num, msg = good, msg .. "passed " .. good
+ end
+ if failed > 0 then
+ num, msg = failed, msg .. (#msg > 0 and (skipped > 0 and ", " or " and ") or "")
+ .. "failed " .. failed
+ end
+ if skipped > 0 then
+ num, msg = skipped, msg .. (#msg > 0 and ((good > 0 and failed > 0 and ',' or '') .." and ") or "")
+ .. "skipped " .. skipped
+ end
+ msg = ("Looks like you %s test%s of %d %s"):format(msg, (num > 1 and 's' or ''), total, sum)
+ if skipped == total then msg = "Looks like you skipped all tests " .. sum end
+ if good == total then msg = "All tests passed " .. sum end
+ tb:note(("1..%d # %s"):format(total, msg))
+end
+
+function m.ismain()
+ for l = 3, 64 do -- only check up to 64 level; no more needed
+ local info = debug.getinfo(l)
+ if not info then return true end
+ if info.func == require then return false end
+ end
+ return true
+end
+
+-- this is needed to call report() when the test object is destroyed
+if _VERSION >= "Lua 5.2" then
+ setmetatable(m, {__gc = m.report})
+else
+ -- keep sentinel alive until 'm' is garbage collected
+ m.sentinel = newproxy(true)
+ getmetatable(m.sentinel).__gc = m.report
+end
+
+for k, v in pairs(m) do -- injection
+ _G[k] = v
+end
+
+return m
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/spec/lua.lua b/love2dToAPK/tools/tools/zbstudio-old-win/spec/lua.lua
new file mode 100644
index 0000000..294976f
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/spec/lua.lua
@@ -0,0 +1,284 @@
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local funcdef = "([A-Za-z_][A-Za-z0-9_%.%:]*)%s*"
+local decindent = {
+ ['else'] = true, ['elseif'] = true, ['until'] = true, ['end'] = true}
+local incindent = {
+ ['else'] = true, ['elseif'] = true, ['for'] = true, ['do'] = true,
+ ['if'] = true, ['repeat'] = true, ['while'] = true}
+local function isfndef(str)
+ local l
+ local s,e,cap,par = string.find(str, "function%s+" .. funcdef .. "(%(.-%))")
+ -- try to match without brackets now, but only at the beginning of the line
+ if (not s) then
+ s,e,cap = string.find(str, "^%s*function%s+" .. funcdef)
+ end
+ -- try to match "foo = function()"
+ if (not s) then
+ s,e,cap,par = string.find(str, funcdef .. "=%s*function%s*(%(.-%))")
+ end
+ if (s) then
+ l = string.find(string.sub(str,1,s-1),"local%s+$")
+ cap = cap .. " " .. (par or "(?)")
+ end
+ return s,e,cap,l
+end
+local q = EscapeMagic
+
+local function ldoc(tx, typepatt)
+ local varname = "([%w_]+)"
+ -- <type> == ?string, ?|T1|T2
+ -- anything that follows optional "|..." is ignored
+ local typename = "%??"..typepatt
+ -- @tparam[...] <type> <paramname>
+ -- @param[type=<type>] <paramname>
+ -- @string[...] <paramname>; not handled
+ local t, v = tx:match("--%s*@tparam%b[]%s+"..typename.."%s+"..varname)
+ if not t then -- try without optional [...] part
+ t, v = tx:match("--%s*@tparam%s+"..typename.."%s+"..varname)
+ end
+ if not t then
+ t, v = tx:match("--%s*@param%s*%[type="..typename.."%]%s+"..varname)
+ end
+ return t, v
+end
+
+return {
+ exts = {"lua", "rockspec", "wlua"},
+ lexer = wxstc.wxSTC_LEX_LUA,
+ apitype = "lua",
+ linecomment = "--",
+ sep = ".:",
+ isdecindent = function(str)
+ str = str:gsub('%-%-%[=*%[.*%]=*%]',''):gsub('%-%-.*','')
+ -- this handles three different cases:
+ local term = (str:match("^%s*(%w+)%s*$")
+ or str:match("^%s*(elseif)[%s%(]")
+ or str:match("^%s*(until)[%s%(]")
+ or str:match("^%s*(else)%f[%W]")
+ )
+ -- (1) 'end', 'elseif', 'else', 'until'
+ local match = term and decindent[term]
+ -- (2) 'end)', 'end}', 'end,', and 'end;'
+ if not term then term, match = str:match("^%s*(end)%s*([%)%}]*)%s*[,;]?") end
+ -- endFoo could be captured as well; filter it out
+ if term and str:match("^%s*(end)%w") then term = nil end
+ -- (3) '},', '};', '),' and ');'
+ if not term then match = str:match("^%s*[%)%}]+%s*[,;]?%s*$") end
+
+ return match and 1 or 0, match and term and 1 or 0
+ end,
+ isincindent = function(str)
+ -- remove "long" comments and escaped slashes (to process \' and \" below)
+ str = str:gsub('%-%-%[=*%[.-%]=*%]',''):gsub('\\[\\\'"]','')
+ while true do
+ local num, sep = nil, str:match("['\"]")
+ if not sep then break end
+ str, num = str:gsub(sep..".-\\"..sep,sep):gsub(sep..".-"..sep,"")
+ if num == 0 then break end
+ end
+ str = (str
+ :gsub('%[=*%[.-%]=*%]','') -- remove long strings
+ :gsub('%[=*%[.*','') -- remove partial long strings
+ :gsub('%-%-.*','') -- strip comments after strings are processed
+ :gsub("%b()","()") -- remove all function calls
+ )
+
+ local term = str:match("^%s*(%w+)%W*")
+ local terminc = term and incindent[term] and 1 or 0
+ -- fix 'if' not terminated with 'then'
+ -- or 'then' not started with 'if'
+ if (term == 'if' or term == 'elseif') and not str:match("%f[%w]then%f[%W]")
+ or (term == 'for') and not str:match("%S%s+do%f[%W]")
+ or (term == 'while') and not str:match("%f[%w]do%f[%W]") then
+ terminc = 0
+ elseif not (term == 'if' or term == 'elseif') and str:match("%f[%w]then%f[%W]")
+ or not (term == 'for') and str:match("%S%s+do%f[%W]")
+ or not (term == 'while') and str:match("%f[%w]do%f[%W]") then
+ terminc = 1
+ end
+ local _, opened = str:gsub("([%{%(])", "%1")
+ local _, closed = str:gsub("([%}%)])", "%1")
+ local func = (isfndef(str) or str:match("%W+function%s*%(")) and 1 or 0
+ -- ended should only be used to negate term and func effects
+ local anon = str:match("%W+function%s*%(.+%Wend%W")
+ local ended = (terminc + func > 0) and (str:match("%W+end%s*$") or anon) and 1 or 0
+
+ return opened - closed + func + terminc - ended
+ end,
+ marksymbols = function(code, pos, vars)
+ local PARSE = require 'lua_parser_loose'
+ local LEX = require 'lua_lexer_loose'
+ local lx = LEX.lexc(code, nil, pos)
+ return coroutine.wrap(function()
+ local varnext = {}
+ PARSE.parse_scope_resolve(lx, function(op, name, lineinfo, vars, nobreak)
+ if not(op == 'Id' or op == 'Statement' or op == 'Var'
+ or op == 'Function' or op == 'String'
+ or op == 'VarNext' or op == 'VarInside' or op == 'VarSelf'
+ or op == 'FunctionCall' or op == 'Scope' or op == 'EndScope') then
+ return end -- "normal" return; not interested in other events
+
+ -- level needs to be adjusted for VarInside as it comes into scope
+ -- only after next block statement
+ local at = vars[0] and (vars[0] + (op == 'VarInside' and 1 or 0))
+ if op == 'Statement' then
+ for _, token in pairs(varnext) do coroutine.yield(unpack(token)) end
+ varnext = {}
+ elseif op == 'VarNext' or op == 'VarInside' then
+ table.insert(varnext, {'Var', name, lineinfo, vars, at, nobreak})
+ end
+
+ coroutine.yield(op, name, lineinfo, vars, op == 'Function' and at-1 or at, nobreak)
+ end, vars)
+ end)
+ end,
+
+ typeassigns = function(editor)
+ local maxlines = 48 -- scan up to this many lines back
+ local iscomment = editor.spec.iscomment
+ local assigns = {}
+ local endline = editor:GetCurrentLine()-1
+ local line = math.max(endline-maxlines, 0)
+
+ while (line <= endline) do
+ local ls = editor:PositionFromLine(line)
+ local tx = editor:GetLine(line) --= string
+ local s = bit.band(editor:GetStyleAt(ls + #tx:match("^%s*") + 2),31)
+
+ -- check for assignments
+ local sep = editor.spec.sep
+ local varname = "([%w_][%w_"..q(sep:sub(1,1)).."]*)"
+ local identifier = "([%w_][%w_"..q(sep).."%s]*)"
+
+ -- special hint
+ local typ, var = tx:match("%s*%-%-=%s*"..varname.."%s+"..identifier)
+ local ldoctype, ldocvar = ldoc(tx, varname)
+ if var and typ then
+ assigns[var] = typ:gsub("%s","")
+ elseif ldoctype and ldocvar then
+ assigns[ldocvar] = ldoctype
+ elseif not iscomment[s] then
+ -- real assignments
+ local var,typ = tx:match("%s*"..identifier.."%s*=%s*([^;]+)")
+
+ var = var and var:gsub("local",""):gsub("%s","")
+ -- handle `require` as a special case that returns a type that matches its parameter
+ -- (this is without deeper analysis on loaded files and should work most of the time)
+ local req = typ and typ:match("^require%s*%(?%s*['\"](.+)['\"]%s*%)?")
+ typ = req or typ
+ typ = (typ and typ
+ :gsub("%b()","")
+ :gsub("%b{}","")
+ :gsub("%b[]",".0")
+ -- replace concatenation with addition to avoid misidentifying types
+ :gsub("%.%.+","+")
+ -- remove comments; they may be in strings, but that's okay here
+ :gsub("%-%-.*",""))
+ if (typ and (typ:match(",") or typ:match("%sor%s") or typ:match("%sand%s"))) then
+ typ = nil
+ end
+ typ = typ and typ:gsub("%s","")
+ typ = typ and typ:gsub(".+", function(s)
+ return (s:find("^'[^']*'$")
+ or s:find('^"[^"]*"$')
+ or s:find('^%[=*%[.*%]=*%]$')) and 'string' or s
+ end)
+
+ -- filter out everything that is not needed
+ if typ and typ ~= 'string' -- special value for all strings
+ and (not typ:match('^'..identifier..'$') -- not an identifier
+ or typ:match('^%d') -- or a number
+ or editor.api.tip.keys[typ] -- or a keyword
+ ) then
+ typ = nil
+ end
+
+ if (var and typ) then
+ local class,func = typ:match(varname.."["..q(sep).."]"..varname)
+ if (assigns[typ] and not req) then
+ assigns[var] = assigns[typ]
+ elseif (func) then
+ local added
+ local funcnames = {"new","load","create"}
+ for _,v in ipairs(funcnames) do
+ if (func == v) then
+ assigns[var] = class
+ added = true
+ break
+ end
+ end
+ if (not added) then
+ -- let's hope autocomplete info can resolve this
+ assigns[var] = typ
+ end
+ else
+ assigns[var] = typ
+ end
+ end
+ end
+ line = line+1
+ end
+
+ return assigns
+ end,
+
+ lexerstyleconvert = {
+ text = {wxstc.wxSTC_LUA_IDENTIFIER,},
+
+ lexerdef = {wxstc.wxSTC_LUA_DEFAULT,},
+ comment = {wxstc.wxSTC_LUA_COMMENT,
+ wxstc.wxSTC_LUA_COMMENTLINE,
+ wxstc.wxSTC_LUA_COMMENTDOC,},
+ stringtxt = {wxstc.wxSTC_LUA_STRING,
+ wxstc.wxSTC_LUA_CHARACTER,
+ wxstc.wxSTC_LUA_LITERALSTRING,},
+ stringeol = {wxstc.wxSTC_LUA_STRINGEOL,},
+ preprocessor= {wxstc.wxSTC_LUA_PREPROCESSOR,},
+ operator = {wxstc.wxSTC_LUA_OPERATOR,},
+ number = {wxstc.wxSTC_LUA_NUMBER,},
+
+ keywords0 = {wxstc.wxSTC_LUA_WORD,},
+ keywords1 = {wxstc.wxSTC_LUA_WORD2,},
+ keywords2 = {wxstc.wxSTC_LUA_WORD3,},
+ keywords3 = {wxstc.wxSTC_LUA_WORD4,},
+ keywords4 = {wxstc.wxSTC_LUA_WORD5,},
+ keywords5 = {wxstc.wxSTC_LUA_WORD6,},
+ keywords6 = {wxstc.wxSTC_LUA_WORD7,},
+ keywords7 = {wxstc.wxSTC_LUA_WORD8,},
+ },
+
+ keywords = {
+ [[and break do else elseif end for function goto if in local not or repeat return then until while]],
+
+ [[_G _VERSION _ENV false io.stderr io.stdin io.stdout nil math.huge math.pi self true]],
+
+ [[assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring
+ module next pairs pcall print rawequal rawget rawlen rawset require
+ select setfenv setmetatable tonumber tostring type unpack xpcall]],
+
+ [[bit32.arshift bit32.band bit32.bnot bit32.bor bit32.btest bit32.bxor bit32.extract
+ bit32.lrotate bit32.lshift bit32.replace bit32.rrotate bit32.rshift
+ coroutine.create coroutine.resume coroutine.running coroutine.status coroutine.wrap coroutine.yield
+ coroutine.isyieldable
+ debug.debug debug.getfenv debug.gethook debug.getinfo debug.getlocal
+ debug.getmetatable debug.getregistry debug.getupvalue debug.getuservalue debug.setfenv
+ debug.sethook debug.setlocal debug.setmetatable debug.setupvalue debug.setuservalue
+ debug.traceback debug.upvalueid debug.upvaluejoin
+ io.close io.flush io.input io.lines io.open io.output io.popen io.read io.tmpfile io.type io.write
+ close flush lines read seek setvbuf write
+ math.abs math.acos math.asin math.atan math.atan2 math.ceil math.cos math.cosh math.deg math.exp
+ math.floor math.fmod math.frexp math.ldexp math.log math.log10 math.max math.min math.modf
+ math.pow math.rad math.random math.randomseed math.sin math.sinh math.sqrt math.tan math.tanh
+ math.type math.tointeger math.maxinteger math.mininteger math.ult
+ os.clock os.date os.difftime os.execute os.exit os.getenv os.remove os.rename os.setlocale os.time os.tmpname
+ package.loadlib package.searchpath package.seeall package.config
+ package.cpath package.loaded package.loaders package.path package.preload package.searchers
+ string.byte string.char string.dump string.find string.format string.gmatch string.gsub string.len
+ string.lower string.match string.rep string.reverse string.sub string.upper
+ byte find format gmatch gsub len lower match rep reverse sub upper
+ table.move, string.pack, string.unpack, string.packsize
+ table.concat table.insert table.maxn table.pack table.remove table.sort table.unpack]]
+ },
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/spec/text.lua b/love2dToAPK/tools/tools/zbstudio-old-win/spec/text.lua
new file mode 100644
index 0000000..c376542
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/spec/text.lua
@@ -0,0 +1,9 @@
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+return {
+ exts = {"txt"},
+ --lexer = wxstc.wxSTC_LEX_POV,
+ --apitype = "luxres",
+ linecomment = ">",
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/defs.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/defs.lua
new file mode 100644
index 0000000..cce1ffe
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/defs.lua
@@ -0,0 +1,332 @@
+-- About
+-- ----------------------------------------------------
+-- This file contains lua table definitons used by
+-- automatic loaded files, not part of the
+-- editor source.
+--
+-- /<app>/config.lua
+-- /cfg/user.lua
+-- /interpreters/*.lua
+-- /specs/*.lua
+-- /tools/*.lua
+-- /api/<apitype>/*.lua
+
+-- style definition
+-- ----------------------------------------------------
+-- all entries are optional
+stattr = {
+ fg = {r,g,b}, -- foreground color 0-255
+ bg = {r,g,b}, -- background color
+ i = false, -- italic
+ b = false, -- bold
+ u = false, -- underline
+ fill = true, -- fill to lineend
+ -- fn = "Lucida Console", -- font Face Name
+ -- fx = 11, -- font size
+ -- hs = true or {r,g,b}, -- turn hotspot on
+ -- use the specified color as activeForeground
+ -- use "hs = true", to turn it on without changing the color
+ -- HotspotActiveUnderline and HotspotSingleLine are on automatically
+ -- v = true, -- visibility for symbols of the current style
+}
+
+style = {
+ -- lexer specific (inherit fg/bg from text)
+ lexerdef = stattr,
+ comment = stattr,
+ stringtxt = stattr,
+ stringeol = stattr,
+ preprocessor = stattr,
+ operator = stattr,
+ number = stattr,
+
+ keywords0 = stattr,
+ keywords1 = stattr,
+ keywords2 = stattr,
+ keywords3 = stattr,
+ keywords4 = stattr,
+ keywords5 = stattr,
+ keywords6 = stattr,
+ keywords7 = stattr,
+
+ -- common (inherit fg/bg from text)
+ text = stattr,
+ linenumber = stattr,
+ bracematch = stattr,
+ bracemiss = stattr,
+ ctrlchar = stattr,
+ indent = stattr,
+ calltip = stattr,
+
+ -- common special (need custom fg & bg )
+ sel = nil,
+ caret = nil,
+ caretlinebg = nil,
+ fold = nil,
+ whitespace = nil,
+}
+
+-- config definition
+-- ----------------------------------------------------
+-- tables must exist
+-- content is optional
+-- config is loaded into existing config table
+config = {
+ path = { -- path for tools/interpreters
+ lua = "C:/lua/lua.exe", -- path to lua exe
+ },
+ editor = {
+ fontname = "Courier New", -- default font
+ fontsize = 10, -- default size
+ caretline = true, -- show active line
+ iofilter = nil, -- input/output filtering of strings
+ showfncall = true, -- use indicator to show function calls if spec allows
+ tabwidth = 4,
+ usetabs = true, -- if false then spaces are used
+ usewrap = true, -- if true then the text is wrapped in the editor
+ whitespace = false,
+ autotabs = true, -- if true test for tabs after file load,
+ -- sets "usetabs" to true for this file
+ calltipdelay = nil, -- delay to show calltip (in ms)
+ autoactivate = false, -- auto-activate/open files during debugging
+ smartindent = false, -- use smart indentation if spec allows
+ fold = true, -- enable code folding
+ foldcompact = true, -- use compact fold that includes empty lines
+ checkeol = true, -- check for eol encoding on loaded files and use it
+ -- also report mixed eol encodings
+ defaulteol = nil, -- default line-endings for new files; valid values are
+ -- wxstc.wxSTC_EOL_CRLF, wxstc.wxSTC_EOL_LF and nil (OS default)
+ nomousezoom = nil, -- disable zooming using mouse wheel
+ autoreload = nil, -- trigger auto-reload when file is updated
+ saveallonrun = nil, -- save all modified files before Run/Debug
+ indentguide = true, -- show indentation guides
+ backspaceunindent = true, -- unindent when backspace is used
+ },
+
+ default = {
+ name = 'untitled',
+ fullname = 'untitled.lua',
+ interpreter = 'luadeb',
+ },
+
+ debugger = {
+ verbose = false,
+ hostname = nil, -- hostname to use when the detected one is incorrect
+ port = nil, -- port number to use
+ runonstart = nil, -- if debugger should run immediately after starting
+ -- default values are different for different interpreters
+ redirect = nil, -- "d", "c", or "r" values for default, copy, or redirect
+ },
+
+ outputshell = { -- output and shell settings
+ fontname = "Courier New", -- default font
+ fontsize = 10, -- defult size
+ },
+
+ filetree = { -- filetree settings
+ fontname = nil, -- no default font as it is system dependent
+ fontsize = nil, -- no default size as it is system dependent
+ },
+
+ format = { -- various formatting strings
+ menurecentprojects = nil,
+ },
+
+ keymap = {}, -- mapping of menu IDs to hot keys
+ messages = {}, -- list of messages in a particular language
+ language = "en", -- current UI language
+
+ styles = {}, -- styles table as above for editor
+ stylesoutshell = {}, -- styles for output/shell
+
+ interpreter = "luadeb", -- the default "project" lua interpreter
+
+ autocomplete = true, -- whether autocomplete is on by default
+ autoanalyzer = true, -- whether auto syntax analyzer is on by default
+
+ acandtip = {
+ shorttip = false, -- tooltips are compact during typing
+ nodynwords = false, -- no dynamic words (user entered words)
+ ignorecase = false, -- ignores case when performing comparison with autocomplete list
+ symbols = true, -- include local/global symbols
+ startat = 2, -- start suggesting dynamic words after 2 characters
+ strategy = 2,
+ -- 0: is string comparison
+ -- 1: substring leading characters (camel case or _ separated)
+ -- 2: leading + any correctly ordered fragments (default)
+ width = 60, -- width of the tooltip text (in characters)
+ maxlength = 450, -- max length of the tooltip on the screen
+ },
+
+ arg = {}, -- command line arguments
+
+ savebak = false, -- if bak files are created on save
+
+ filehistorylength = 20, -- historylength for files
+
+ projecthistorylength = 15, -- historylength for project directories
+
+ singleinstance = true, -- if true creates a UDP server to run IDE once and to load files
+ singleinstanceport = 0xe493, -- UDP port for single instance communication
+
+ activateoutput = false, -- activate output/console on Run/Debug/Compile
+ unhidewindow = false, -- to unhide a gui window
+ projectautoopen = false, -- allow auto open/close files on a project switch
+ autorecoverinactivity = nil, -- period of inactivity (s) for autorecover
+ hidpi = false, -- HiDPI/Retina display support
+}
+
+-- application engine
+-- ----------------------------------------------------
+
+app = {
+ preinit = function() end, -- post spec/tool loading, but prior subsystems/ui generation
+ postinit = function() end, -- post init, prior starting mainloop
+ loadfilters = {
+ tools = function(file) return true end,
+ specs = function(file) return true end,
+ interpreters = function(file) return true end,
+ },
+ stringtable = { -- optional entries uses defaults otherwise
+ editor = nil, statuswelcome = nil,
+ -- ...
+ }
+}
+
+-- api definition
+-- ----------------------------------------------------
+-- hierarchy encoded into children
+
+api = {
+ -- global space words, e.g "table"
+ ["blah"] = {
+ -- "function", "class", "keyword", "value", "lib", "method"
+ -- method is for class:func functions
+ type = "function",
+ description = "this does something",
+
+ -- value/function/method:
+ -- for autocomplete type guessing, insert the string
+ -- that the variable name is replace with
+ -- e.g. "test = somefunc()" somefunc has valuetype of "math"
+ -- then typing "test." will be treated as "math." in
+ -- autcomplete logic
+ valuetype = "api.ClassName",
+
+ -- function:
+ args = "(blah,blubb)",
+ returns = "(foo)",
+
+ -- autogenerated post load:
+ -- concated hierarchy name (e.g. "lib.class")
+ classname = "blah",
+
+ -- children in the class hierarchy
+ childs = {
+ --.. recursive
+ }
+ },
+ ["blubb"] = {
+ --...
+ },
+}
+
+-- spec definition
+-- ----------------------------------------------------
+-- all entries are optional
+spec = {
+ exts = {"ext","ext2",},
+ -- compatible extensions
+
+ lexer = wxstc.wxSTC_LEX_LUA,
+ -- scintilla lexer
+
+ lexerstyleconvert = {
+ -- table mapping each styles to
+ -- appropriate lexer id
+ stringeol = {wxstc.wxSTC_LUA_STRINGEOL,},
+ -- ...
+ },
+
+ linecomment = "//",
+ -- string for linecomments
+
+ sep = "%.:",
+ -- class.function separator match string,
+ -- e.g in lua both . and : are allowed
+ -- default is "\1" which should yield no matches
+ -- and therefore disable class.func type autocompletion
+
+ isfncall = function(str) return from,to end,
+ -- function that detects positions for a substring that
+ -- stands for a functioncall, ie " call(..)" -> 2,5
+
+ apitype = "api",
+ -- which sub directory of "api" is relevant
+ -- api files handle autocomplete and tooltips
+ -- api won't affect syntax coloring
+
+ keywords = {
+ -- up to 8 strings containing space separated keywords
+ -- used by the lexer for coloring (NOT for autocomplete).
+ -- however each lexer supports varying amount
+ -- of keyword types
+
+ "foo bar word",
+ "more words",
+ }
+}
+
+-- tool definition
+-- ----------------------------------------------------
+-- main entries are optional
+tool = {
+ fninit = function(frame,menubar) end,
+ -- guarantees that ide is initialized
+ -- can be used for init
+ -- and adding custom menu
+
+ exec = {
+ -- quick exec action, listed under "Tools" menu
+ name = "",
+ description = "",
+ fn = function(wxfilename,projectdir) end,
+ }
+}
+
+-- debuginterface definition
+-- ----------------------------------------------------
+debuginterface = {
+ update = function(self) end, -- run in idle when active
+ close = function(self) end, -- run when closed
+
+ -- following are "debugging" actions and must return
+ -- error, running, [filePath, fileLine]
+ run = function(self) end,
+ step = function(self) end,
+ over = function(self) end,
+ out = function(self) end,
+ terminate = function(self) end,
+ breaknow = function(self) end,
+ breakpoint = function(self,file,line,state) end, -- set breakpoint state
+
+ -- returns result table if successful
+ evaluate = function(self, expressions, fnSetValues) end, -- for watches tables
+ stack = function(self) end, -- get stack information
+}
+
+-- interpreter definition-- ----------------------------------------------------
+interpreter = {
+ name = "",
+ description = "",
+ api = {"apifile_without_extension"}, -- (opt) to limit loaded lua apis
+ frun = function(self,wfilename,withdebugger) end,
+ fprojdir = function(self,wfilename) return "projpath_from_filename" end, -- (opt)
+ fattachdebug = function(self) end, -- (opt)
+ hasdebugger = false, -- if debugging is available
+ scratchextloop = nil, -- (opt) indicates scratchpad support
+ -- nil, no support for scratchpad;
+ -- false, scratchpad supported;
+ -- true, scratchpad supported and requires handling for external loop.
+ skipcompile = nil, -- don't compile before running if true
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/autocomplete.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/autocomplete.lua
new file mode 100644
index 0000000..f5bd9b9
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/autocomplete.lua
@@ -0,0 +1,652 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+local q = EscapeMagic
+
+-- api loading depends on Lua interpreter
+-- and loaded specs
+
+------------
+-- API
+
+local function newAPI(api)
+ api = api or {}
+ for i in pairs(api) do
+ api[i] = nil
+ end
+ -- tool tip info and reserved names
+ api.tip = {
+ staticnames = {},
+ keys = {},
+ finfo = {},
+ finfoclass = {},
+ shortfinfo = {},
+ shortfinfoclass = {},
+ }
+ -- autocomplete hierarchy
+ api.ac = {
+ childs = {},
+ }
+
+ return api
+end
+
+local apis = {
+ none = newAPI(),
+ lua = newAPI(),
+}
+
+function GetApi(apitype) return apis[apitype] or apis.none end
+
+----------
+-- API loading
+
+local function gennames(tab, prefix)
+ for i,v in pairs(tab) do
+ v.classname = (prefix and (prefix..".") or "")..i
+ if (v.childs) then
+ gennames(v.childs,v.classname)
+ end
+ end
+end
+
+local function addAPI(ftype, fname) -- relative to API directory
+ local env = apis[ftype] or newAPI()
+
+ local res
+ local api = ide.apis[ftype][fname]
+
+ if type(api) == 'table' then
+ res = api
+ else
+ local fn, err = loadfile(api)
+ if err then
+ DisplayOutputLn(TR("Error while loading API file: %s"):format(err))
+ return
+ end
+ local suc
+ suc, res = pcall(function() return fn(env.ac.childs) end)
+ if (not suc) then
+ DisplayOutputLn(TR("Error while processing API file: %s"):format(res))
+ return
+ end
+ -- cache the result
+ ide.apis[ftype][fname] = res
+ end
+ apis[ftype] = env
+
+ gennames(res)
+ for i,v in pairs(res) do env.ac.childs[i] = v end
+end
+
+local function loadallAPIs(only, subapis, known)
+ for ftype, v in pairs(only and {[only] = ide.apis[only]} or ide.apis) do
+ if (not known or known[ftype]) then
+ for fname in pairs(v) do
+ if (not subapis or subapis[fname]) then addAPI(ftype, fname) end
+ end
+ end
+ end
+end
+
+local function scanAPIs()
+ for _, file in ipairs(FileSysGetRecursive("api", true, "*.lua")) do
+ if not IsDirectory(file) then
+ local ftype, fname = file:match("api[/\\]([^/\\]+)[/\\](.*)%.")
+ if not ftype or not fname then
+ DisplayOutputLn(TR("The API file must be located in a subdirectory of the API directory."))
+ return
+ end
+ ide.apis[ftype] = ide.apis[ftype] or {}
+ ide.apis[ftype][fname] = file
+ end
+ end
+end
+
+---------
+-- ToolTip and reserved words list
+-- also fixes function descriptions
+
+local function fillTips(api,apibasename)
+ local apiac = api.ac
+ local tclass = api.tip
+
+ tclass.staticnames = {}
+ tclass.keys = {}
+ tclass.finfo = {}
+ tclass.finfoclass = {}
+ tclass.shortfinfo = {}
+ tclass.shortfinfoclass = {}
+
+ local staticnames = tclass.staticnames
+ local keys = tclass.keys
+ local finfo = tclass.finfo
+ local finfoclass = tclass.finfoclass
+ local shortfinfo = tclass.shortfinfo
+ local shortfinfoclass = tclass.shortfinfoclass
+
+ local function traverse (tab, libname, format)
+ if not tab.childs then return end
+ format = tab.format or format
+ for key,info in pairs(tab.childs) do
+ local fullkey = (libname ~= "" and libname.."." or "")..key
+ traverse(info, fullkey, format)
+
+ if info.type == "function" or info.type == "method" or info.type == "value" then
+ local frontname = (info.returns or "(?)").." "..fullkey.." "..(info.args or "(?)")
+ frontname = frontname:gsub("\n"," "):gsub("\t","")
+ local description = info.description or ""
+
+ -- build info
+ local inf = ((info.type == "value" and "" or frontname.."\n")
+ ..description)
+ local sentence = description:match("^(.-)%. ?\n")
+ local infshort = ((info.type == "value" and "" or frontname.."\n")
+ ..(sentence and sentence.."..." or description))
+ if type(format) == 'function' then -- apply custom formatting if requested
+ inf = format(fullkey, info, inf)
+ infshort = format(fullkey, info, infshort)
+ end
+ local infshortbatch = (info.returns and info.args) and frontname or infshort
+
+ -- add to infoclass
+ if not finfoclass[libname] then finfoclass[libname] = {} end
+ if not shortfinfoclass[libname] then shortfinfoclass[libname] = {} end
+ finfoclass[libname][key] = inf
+ shortfinfoclass[libname][key] = infshort
+
+ -- add to info
+ if not finfo[key] or #finfo[key]<200 then
+ if finfo[key] then finfo[key] = finfo[key] .. "\n\n"
+ else finfo[key] = "" end
+ finfo[key] = finfo[key] .. inf
+ elseif not finfo[key]:match("\n %(%.%.%.%)$") then
+ finfo[key] = finfo[key].."\n (...)"
+ end
+
+ -- add to shortinfo
+ if not shortfinfo[key] or #shortfinfo[key]<200 then
+ if shortfinfo[key] then shortfinfo[key] = shortfinfo[key] .. "\n"
+ else shortfinfo[key] = "" end
+ shortfinfo[key] = shortfinfo[key] .. infshortbatch
+ elseif not shortfinfo[key]:match("\n %(%.%.%.%)$") then
+ shortfinfo[key] = shortfinfo[key].."\n (...)"
+ end
+ end
+ if info.type == "keyword" then
+ keys[key] = true
+ end
+ staticnames[key] = true
+ end
+ end
+ traverse(apiac,apibasename)
+end
+
+local function generateAPIInfo(only)
+ for i,api in pairs(apis) do
+ if ((not only) or i == only) then
+ fillTips(api,"")
+ end
+ end
+end
+
+local function updateAssignCache(editor)
+ if (editor.spec.typeassigns and not editor.assignscache) then
+ local assigns = editor.spec.typeassigns(editor)
+ editor.assignscache = {
+ assigns = assigns,
+ line = editor:GetCurrentLine(),
+ }
+ end
+end
+
+-- assumes a tidied up string (no spaces, braces..)
+local function resolveAssign(editor,tx)
+ local ac = editor.api.ac
+ local sep = editor.spec.sep
+ local anysep = "["..q(sep).."]"
+ local assigns = editor.assignscache and editor.assignscache.assigns
+ local function getclass(tab,a)
+ local key,rest = a:match("([%w_]+)"..anysep.."(.*)")
+ key = tonumber(key) or key -- make this work for childs[0]
+ if (key and rest and tab.childs and tab.childs[key]) then
+ return getclass(tab.childs[key],rest)
+ end
+ -- process valuetype, but only if it doesn't reference the current tab
+ if (tab.valuetype and tab ~= ac.childs[tab.valuetype]) then
+ return getclass(ac,tab.valuetype..sep:sub(1,1)..a)
+ end
+ return tab,a
+ end
+
+ local c
+ if (assigns) then
+ -- find assign
+ local change, n, refs, stopat = true, 0, {}, os.clock() + 0.2
+ while (change) do
+ -- abort the check if the auto-complete is taking too long
+ if n > 50 and os.clock() > stopat then
+ if ide.config.acandtip.warning then
+ DisplayOutputLn("Warning: Auto-complete was aborted after taking too long to complete."
+ .. " Please report this warning along with the text you were typing to support@zerobrane.com.")
+ end
+ break
+ else
+ n = n + 1
+ end
+
+ local classname = nil
+ c = ""
+ change = false
+ for w,s in tx:gmatch("([%w_]+)("..anysep.."?)") do
+ local old = classname
+ -- check if what we have so far can be matched with a class name
+ -- this can happen if it's a reference to a value with a known type
+ classname = classname or assigns[c..w]
+ if (s ~= "" and old ~= classname) then
+ -- continue checking unless this can lead to recursive substitution
+ change = not classname:find("^"..w) and not classname:find("^"..c..w)
+ c = classname..s
+ else
+ c = c..w..s
+ end
+ end
+ -- check for loops in type assignment
+ if refs[tx] then break end
+ refs[tx] = c
+ tx = c
+ -- if there is any class duplication, abort the loop
+ if classname and select(2, c:gsub(classname, classname)) > 1 then break end
+ end
+ else
+ c = tx
+ end
+
+ -- then work from api
+ return getclass(ac,c)
+end
+
+function GetTipInfo(editor, content, short, fullmatch)
+ if not content then return end
+
+ updateAssignCache(editor)
+
+ -- try to resolve the class
+ content = content:gsub("%b[]",".0")
+ local tab = resolveAssign(editor, content)
+ local sep = editor.spec.sep
+ local anysep = "["..q(sep).."]"
+
+ local caller = content:match("([%w_]+)%(?%s*$")
+ local class = (tab and tab.classname
+ or caller and content:match("([%w_]+)"..anysep..caller.."%(?%s*$") or "")
+ local tip = editor.api.tip
+
+ local classtab = short and tip.shortfinfoclass or tip.finfoclass
+ local funcstab = short and tip.shortfinfo or tip.finfo
+
+ if (editor.assignscache and not (class and classtab[class])) then
+ local assigns = editor.assignscache.assigns
+ class = assigns and assigns[class] or class
+ end
+
+ local res = (caller and (class and classtab[class]) and classtab[class][caller]
+ or (not fullmatch and funcstab[caller] or nil))
+ -- some values may not have descriptions (for example, true/false);
+ -- don't return empty strings as they are displayed as empty tooltips.
+ return res and #res > 0 and res or nil
+end
+
+local function reloadAPI(only,subapis)
+ newAPI(apis[only])
+ loadallAPIs(only,subapis)
+ generateAPIInfo(only)
+end
+
+function ReloadLuaAPI()
+ local interp = ide.interpreter
+ local cfgapi = ide.config.api
+ local fname = interp and interp.fname
+ local intapi = cfgapi and fname and cfgapi[fname]
+ local apinames = {}
+ -- general APIs as configured
+ for _, v in ipairs(type(cfgapi) == 'table' and cfgapi or {}) do apinames[v] = true end
+ -- interpreter-specific APIs as configured
+ for _, v in ipairs(type(intapi) == 'table' and intapi or {}) do apinames[v] = true end
+ -- interpreter APIs
+ for _, v in ipairs(interp and interp.api or {}) do apinames[v] = true end
+ reloadAPI("lua",apinames)
+end
+
+do
+ local known = {}
+ for _, spec in pairs(ide.specs) do
+ if (spec.apitype) then
+ known[spec.apitype] = true
+ end
+ end
+ -- by defaul load every known api except lua
+ known.lua = false
+
+ scanAPIs()
+ loadallAPIs(nil,nil,known)
+ generateAPIInfo()
+end
+
+-------------
+-- Dynamic Words
+
+local dywordentries = {}
+local dynamicwords = {}
+
+local function addDynamicWord (api,word)
+ if api.tip.keys[word] or api.tip.staticnames[word] then return end
+ local cnt = dywordentries[word]
+ if cnt then
+ dywordentries[word] = cnt + 1
+ return
+ end
+ dywordentries[word] = 1
+ local wlow = word:lower()
+ for i=0,#word do
+ local k = wlow:sub(1,i)
+ dynamicwords[k] = dynamicwords[k] or {}
+ table.insert(dynamicwords[k], word)
+ end
+end
+local function removeDynamicWord (api,word)
+ if api.tip.keys[word] or api.tip.staticnames[word] then return end
+ local cnt = dywordentries[word]
+ if not cnt then return end
+
+ if (cnt == 1) then
+ dywordentries[word] = nil
+ for i=0,#word do
+ local wlow = word:lower()
+ local k = wlow : sub (1,i)
+ local page = dynamicwords[k]
+ if page then
+ local cnt = #page
+ for n=1,cnt do
+ if page[n] == word then
+ if cnt == 1 then
+ dynamicwords[k] = nil
+ else
+ table.remove(page,n)
+ end
+ break
+ end
+ end
+ end
+ end
+ else
+ dywordentries[word] = cnt - 1
+ end
+end
+function DynamicWordsReset ()
+ dywordentries = {}
+ dynamicwords = {}
+end
+
+local function getEditorLines(editor,line,numlines)
+ return editor:GetTextRangeDyn(
+ editor:PositionFromLine(line),editor:PositionFromLine(line+numlines+1))
+end
+
+function DynamicWordsAdd(editor,content,line,numlines)
+ if ide.config.acandtip.nodynwords then return end
+ local api = editor.api
+ local anysep = "["..q(editor.spec.sep).."]"
+ content = content or getEditorLines(editor,line,numlines)
+ for word in content:gmatch(anysep.."?%s*([a-zA-Z_]+[a-zA-Z_0-9]+)") do
+ addDynamicWord(api,word)
+ end
+end
+
+function DynamicWordsRem(editor,content,line,numlines)
+ if ide.config.acandtip.nodynwords then return end
+ local api = editor.api
+ local anysep = "["..q(editor.spec.sep).."]"
+ content = content or getEditorLines(editor,line,numlines)
+ for word in content:gmatch(anysep.."?%s*([a-zA-Z_]+[a-zA-Z_0-9]+)") do
+ removeDynamicWord(api,word)
+ end
+end
+
+function DynamicWordsRemoveAll(editor)
+ if ide.config.acandtip.nodynwords then return end
+ DynamicWordsRem(editor,editor:GetTextDyn())
+end
+
+------------
+-- Final Autocomplete
+
+local cachemain = {}
+local cachemethod = {}
+local laststrategy
+local function getAutoCompApiList(childs,fragment,method)
+ fragment = fragment:lower()
+ local strategy = ide.config.acandtip.strategy
+ if (laststrategy ~= strategy) then
+ cachemain = {}
+ cachemethod = {}
+ laststrategy = strategy
+ end
+
+ local cache = method and cachemethod or cachemain
+
+ if (strategy == 2) then
+ local wlist = cache[childs]
+ if not wlist then
+ wlist = " "
+ for i,v in pairs(childs) do
+ -- in some cases (tip.finfo), v may be a string; check for that first.
+ -- if a:b typed, then value (type == "value") not allowed
+ -- if a.b typed, then method (type == "method") not allowed
+ if type(v) ~= 'table' or (v.type and
+ ((method and v.type ~= "value")
+ or (not method and v.type ~= "method"))) then
+ wlist = wlist..i.." "
+ end
+ end
+ cache[childs] = wlist
+ end
+ local ret = {}
+ local g = string.gmatch
+ local pat = fragment ~= "" and ("%s("..fragment:gsub(".",
+ function(c)
+ local l = c:lower()..c:upper()
+ return "["..l.."][%w_]*"
+ end)..")") or "([%w_]+)"
+ pat = pat:gsub("%s","")
+ for c in g(wlist,pat) do
+ table.insert(ret,c)
+ end
+
+ return ret
+ end
+
+ if cache[childs] and cache[childs][fragment] then
+ return cache[childs][fragment]
+ end
+
+ local t = {}
+ cache[childs] = t
+
+ local sub = strategy == 1
+ for key,v in pairs(childs) do
+ -- in some cases (tip.finfo), v may be a string; check for that first.
+ -- if a:b typed, then value (type == "value") not allowed
+ -- if a.b typed, then method (type == "method") not allowed
+ if type(v) ~= 'table' or (v.type and
+ ((method and v.type ~= "value")
+ or (not method and v.type ~= "method"))) then
+ local used = {}
+ local kl = key:lower()
+ for i=0,#key do
+ local k = kl:sub(1,i)
+ t[k] = t[k] or {}
+ used[k] = true
+ table.insert(t[k],key)
+ end
+ if (sub) then
+ -- find camel case / _ separated subwords
+ -- glfwGetGammaRamp -> g, gg, ggr
+ -- GL_POINT_SPRIT -> g, gp, gps
+ local last = ""
+ for ks in string.gmatch(key,"([A-Z%d]*[a-z%d]*_?)") do
+ local k = last..(ks:sub(1,1):lower())
+ last = k
+
+ t[k] = t[k] or {}
+ if (not used[k]) then
+ used[k] = true
+ table.insert(t[k],key)
+ end
+ end
+ end
+ end
+ end
+
+ return t
+end
+
+function CreateAutoCompList(editor,key,pos)
+ local api = editor.api
+ local tip = api.tip
+ local ac = api.ac
+ local sep = editor.spec.sep
+
+ local method = key:match(":[^"..q(sep).."]*$") ~= nil
+
+ -- ignore keywords
+ if tip.keys[key] then return end
+
+ updateAssignCache(editor)
+
+ local tab,rest = resolveAssign(editor,key)
+ local progress = tab and tab.childs
+ ide:SetStatusFor(progress and tab.classname and ("Auto-completing '%s'..."):format(tab.classname) or "")
+ if not progress then return end
+
+ if (tab == ac) then
+ local _, krest = rest:match("([%w_]+)["..q(sep).."]([%w_]*)%s*$")
+ if (krest) then
+ tab = #krest >= (ide.config.acandtip.startat or 2) and tip.finfo or {}
+ rest = krest:gsub("[^%w_]","")
+ else
+ rest = rest:gsub("[^%w_]","")
+ end
+ else
+ rest = rest:gsub("[^%w_]","")
+ end
+
+ -- list from api
+ local apilist = getAutoCompApiList(tab.childs or tab,rest,method)
+
+ local function addInheritance(tab, apilist, seen)
+ if not tab.inherits then return end
+ for base in tab.inherits:gmatch("[%w_"..q(sep).."]+") do
+ local tab = ac
+ -- map "a.b.c" to class hierarchy (a.b.c)
+ for class in base:gmatch("[%w_]+") do tab = tab.childs[class] end
+
+ if tab and not seen[tab] then
+ seen[tab] = true
+ for _,v in pairs(getAutoCompApiList(tab.childs,rest,method)) do
+ table.insert(apilist, v)
+ end
+ addInheritance(tab, apilist, seen)
+ end
+ end
+ end
+
+ -- handle (multiple) inheritance; add matches from the parent class/lib
+ addInheritance(tab, apilist, {[tab] = true})
+
+ -- include local/global variables
+ if ide.config.acandtip.symbols and not key:find(q(sep)) then
+ local vars, context = {}
+ local tokens = editor:GetTokenList()
+ for _, token in ipairs(tokens) do
+ if token.fpos and pos and token.fpos > pos then break end
+ if token[1] == 'Id' or token[1] == 'Var' then
+ local var = token.name
+ if var:find(key, 1, true) == 1
+ -- skip the variable formed by what's being typed
+ and (not token.fpos or not pos or token.fpos < pos-#key) then
+ -- if it's a global variable, store in the auto-complete list,
+ -- but if it's local, store separately as it needs to be checked
+ table.insert(token.context[var] and vars or apilist, var)
+ end
+ context = token.context
+ end
+ end
+ for _, var in pairs(context and vars or {}) do
+ if context[var] then table.insert(apilist, var) end
+ end
+ end
+
+ -- include dynamic words
+ local last = key:match("([%w_]+)%s*$")
+ if (last and #last >= (ide.config.acandtip.startat or 2)) then
+ last = last:lower()
+ for i,v in ipairs(dynamicwords[last] or {}) do
+ -- ignore if word == last and sole user
+ if (v:lower() == last and dywordentries[v] == 1) then break end
+ table.insert(apilist, v)
+ end
+ end
+
+ local li
+ if apilist then
+ if (#rest > 0) then
+ local strategy = ide.config.acandtip.strategy
+
+ if (strategy == 2 and #apilist < 128) then
+ -- when matching "ret": "ret." < "re.t" < "r.et"
+ local patany = rest:gsub(".", function(c) return "["..c:lower()..c:upper().."](.-)" end)
+ local patcase = rest:gsub(".", function(c) return c.."(.-)" end)
+ local weights = {}
+ local penalty = 0.1
+ local function weight(str)
+ if not weights[str] then
+ local w = 0
+ str:gsub(patany,function(...)
+ local l = {...}
+ -- penalize gaps between matches, more so at the beginning
+ for n, v in ipairs(l) do w = w + #v * (1 + (#l-n)*penalty) end
+ end)
+ weights[str] = w + (str:find(patcase) and 0 or penalty)
+ end
+ return weights[str]
+ end
+ table.sort(apilist,function(a,b)
+ local ma, mb = weight(a), weight(b)
+ if (ma == mb) then return a:lower()<b:lower() end
+ return ma<mb
+ end)
+ else
+ table.sort(apilist,function(a,b)
+ local ma,mb = a:sub(1,#rest)==rest, b:sub(1,#rest)==rest
+ if (ma and mb) or (not ma and not mb) then return a<b end
+ return ma
+ end)
+ end
+ else
+ table.sort(apilist)
+ end
+
+ local prev = apilist[#apilist]
+ for i = #apilist-1,1,-1 do
+ if prev == apilist[i] then
+ table.remove(apilist, i+1)
+ else prev = apilist[i] end
+ end
+
+ li = table.concat(apilist," ")
+ end
+ return li and #li > 1024 and li:sub(1,1024).."..." or li
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/commandbar.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/commandbar.lua
new file mode 100644
index 0000000..26de6fd
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/commandbar.lua
@@ -0,0 +1,359 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+---------------------------------------------------------
+
+local unpack = table.unpack or unpack
+local maxlines = 8
+local row_height = 46
+
+function CommandBarShow(params)
+ local onDone, onUpdate, onItem, onSelection, defaultText, selectedText =
+ params.onDone, params.onUpdate, params.onItem, params.onSelection,
+ params.defaultText, params.selectedText
+ local row_width = ide.config.commandbar.width or 0
+ if row_width < 1 then
+ row_width = math.max(450, math.floor(row_width * ide:GetMainFrame():GetClientSize():GetWidth()))
+ end
+
+ local lines = {}
+ local linesnow = #lines
+ local linenow = 0
+
+ local nb = ide:GetEditorNotebook()
+ local pos = nb:GetScreenPosition()
+ if pos then
+ local miny
+ for p = 0, nb:GetPageCount()-1 do
+ local y = nb:GetPage(p):GetScreenPosition():GetY()
+ -- just in case, compare with the position of the notebook itself;
+ -- this is needed because the tabs that haven't been refreshed yet
+ -- may report 0 as their screen position on Linux, which is incorrect.
+ if y > pos:GetY() and (not miny or y < miny) then miny = y end
+ end
+ pos:SetX(pos:GetX()+nb:GetClientSize():GetWidth()-row_width-16)
+ pos:SetY((miny or pos:GetY())+2)
+ else
+ pos = wx.wxDefaultPosition
+ end
+
+ local frame = wx.wxFrame(ide:GetMainFrame(), wx.wxID_ANY, "Command Bar",
+ pos, wx.wxDefaultSize,
+ wx.wxFRAME_NO_TASKBAR + wx.wxFRAME_FLOAT_ON_PARENT + wx.wxNO_BORDER)
+ local panel = wx.wxPanel(frame or ide:GetMainFrame(), wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxDefaultSize, wx.wxFULL_REPAINT_ON_RESIZE)
+ local search = wx.wxTextCtrl(panel, wx.wxID_ANY, "\1",
+ wx.wxDefaultPosition,
+ -- make the text control a bit smaller on OSX
+ wx.wxSize(row_width, ide.osname == 'Macintosh' and 20 or 24),
+ wx.wxTE_PROCESS_ENTER + wx.wxTE_PROCESS_TAB + wx.wxNO_BORDER)
+ local results = wx.wxScrolledWindow(panel, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxSize(0, 0))
+
+ local style, styledef = ide.config.styles, StylesGetDefault()
+ local textcolor = wx.wxColour(unpack(style.text.fg or styledef.text.fg))
+ local backcolor = wx.wxColour(unpack(style.text.bg or styledef.text.bg))
+ local selcolor = wx.wxColour(unpack(style.caretlinebg.bg or styledef.caretlinebg.bg))
+ local pancolor = ide:GetUIManager():GetArtProvider():GetColor(wxaui.wxAUI_DOCKART_SASH_COLOUR)
+ local borcolor = ide:GetUIManager():GetArtProvider():GetColor(wxaui.wxAUI_DOCKART_BORDER_COLOUR)
+
+ search:SetBackgroundColour(backcolor)
+ search:SetForegroundColour(textcolor)
+
+ local nbrush = wx.wxBrush(backcolor, wx.wxSOLID)
+ local sbrush = wx.wxBrush(selcolor, wx.wxSOLID)
+ local bbrush = wx.wxBrush(pancolor, wx.wxSOLID)
+ local lpen = wx.wxPen(borcolor, 1, wx.wxDOT)
+ local bpen = wx.wxPen(borcolor, 1, wx.wxSOLID)
+
+ local sash = ide:GetUIManager():GetArtProvider():GetMetric(wxaui.wxAUI_DOCKART_SASH_SIZE)
+ local border = sash + 2
+ local hoffset = 4
+ local voffset = 4
+
+ local topSizer = wx.wxFlexGridSizer(2, 1, -border*2, 0)
+ topSizer:SetFlexibleDirection(wx.wxVERTICAL)
+ topSizer:AddGrowableRow(1, 1)
+ topSizer:Add(search, wx.wxSizerFlags(0):Expand():Border(wx.wxALL, border))
+ topSizer:Add(results, wx.wxSizerFlags(1):Expand():Border(wx.wxALL, border))
+ panel:SetSizer(topSizer)
+ topSizer:Fit(frame) -- fit the frame/panel around the controls
+
+ local minheight = frame:GetClientSize():GetHeight()
+
+ local tfont = ide:GetProjectTree():GetFont()
+ local ffont = (ide:GetEditor() or ide:CreateBareEditor()):GetFont()
+ ffont:SetPointSize(ffont:GetPointSize()+2)
+ local sfont = wx.wxFont(tfont)
+ tfont:SetPointSize(tfont:GetPointSize()+2)
+ search:SetFont(tfont)
+
+ -- make a one-time callback;
+ -- needed because KILL_FOCUS handler can be called after closing window
+ local function onExit(index)
+ onExit = function() end
+ onDone(index and lines[index], index, search:GetValue())
+ frame:Close()
+ end
+
+ local function onPaint(event)
+ -- adjust the scrollbar before working with the canvas
+ local _, starty = results:GetViewStart()
+ if #lines ~= linesnow then
+ -- adjust the starting line when the current line is the last one
+ if linenow > starty+maxlines then starty = starty + 1 end
+ results:SetScrollbars(1, row_height, 1, #lines, 0, starty*row_height, false)
+ linesnow = #lines
+ end
+
+ local dc = wx.wxMemoryDC(results)
+ results:PrepareDC(dc)
+
+ local size = results:GetVirtualSize()
+ local w,h = size:GetWidth(),size:GetHeight()
+ local bitmap = wx.wxBitmap(w,h)
+ dc:SelectObject(bitmap)
+
+ -- clear the background
+ dc:SetBackground(nbrush)
+ dc:Clear()
+
+ dc:SetTextForeground(textcolor)
+ dc:SetBrush(sbrush)
+ for r = 1, #lines do
+ if r == linenow then
+ dc:SetPen(wx.wxTRANSPARENT_PEN)
+ dc:DrawRectangle(0, row_height*(r-1), row_width, row_height+1)
+ end
+ dc:SetPen(lpen)
+ dc:DrawLine(hoffset, row_height*(r-1), row_width-hoffset*2, row_height*(r-1))
+
+ local fline, sline = onItem(lines[r])
+ if fline then
+ dc:SetFont(ffont)
+ dc:DrawText(fline, hoffset, row_height*(r-1)+voffset)
+ end
+ if sline then
+ dc:SetFont(sfont)
+ dc:DrawText(sline, hoffset, row_height*(r-1)+row_height/2+voffset)
+ end
+ end
+
+ dc:SetPen(wx.wxNullPen)
+ dc:SetBrush(wx.wxNullBrush)
+ dc:SelectObject(wx.wxNullBitmap)
+ dc:delete()
+
+ dc = wx.wxPaintDC(results)
+ dc:DrawBitmap(bitmap, 0, 0, true)
+ dc:delete()
+ end
+
+ local function onPanelPaint(event)
+ local dc = wx.wxBufferedPaintDC(panel)
+ dc:SetBrush(bbrush)
+ dc:SetPen(bpen)
+
+ local psize = panel:GetClientSize()
+ dc:DrawRectangle(0, 0, psize:GetWidth(), psize:GetHeight())
+ dc:DrawRectangle(sash+1, sash+1, psize:GetWidth()-2*(sash+1), psize:GetHeight()-2*(sash+1))
+
+ dc:SetPen(wx.wxNullPen)
+ dc:SetBrush(wx.wxNullBrush)
+ dc:delete()
+ end
+
+ local linewas -- line that was reported when updated
+ local function onTextUpdated(event)
+ local text = search:GetValue()
+ lines = onUpdate(text)
+ linenow = #text > 0 and #lines > 0 and 1 or 0
+ linewas = nil
+
+ local size = frame:GetClientSize()
+ local height = minheight + row_height*math.min(maxlines,#lines)
+ if height ~= size:GetHeight() then
+ results:SetScrollbars(1, 1, 1, 1, 0, 0, false)
+ size:SetHeight(height)
+ frame:SetClientSize(size)
+ end
+
+ results:Refresh()
+ end
+
+ local function onKeyDown(event)
+ local keycode = event:GetKeyCode()
+ if keycode == wx.WXK_RETURN then
+ onExit(linenow)
+ return
+ elseif event:GetModifiers() ~= wx.wxMOD_NONE then
+ event:Skip()
+ return
+ elseif keycode == wx.WXK_UP then
+ if linesnow > 0 then
+ linenow = linenow - 1
+ if linenow <= 0 then linenow = linesnow end
+ end
+ elseif keycode == wx.WXK_DOWN then
+ if linesnow > 0 then
+ linenow = linenow % linesnow + 1
+ end
+ elseif keycode == wx.WXK_PAGEDOWN then
+ if linesnow > 0 then
+ linenow = linenow + maxlines
+ if linenow > linesnow then linenow = linesnow end
+ end
+ elseif keycode == wx.WXK_PAGEUP then
+ if linesnow > 0 then
+ linenow = linenow - maxlines
+ if linenow <= 0 then linenow = 1 end
+ end
+ elseif keycode == wx.WXK_ESCAPE then
+ onExit(false)
+ return
+ else
+ event:Skip()
+ return
+ end
+
+ local _, starty = results:GetViewStart()
+ if linenow < starty+1 then results:Scroll(-1, linenow-1)
+ elseif linenow > starty+maxlines then results:Scroll(-1, linenow-maxlines) end
+ results:Refresh()
+ end
+
+ local function onMouseLeftDown(event)
+ local pos = event:GetPosition()
+ local _, y = results:CalcUnscrolledPosition(pos.x, pos.y)
+ onExit(math.floor(y / row_height)+1)
+ end
+
+ local function onIdle(event)
+ if linewas == linenow then return end
+ linewas = linenow
+ if linenow == 0 then return end
+
+ -- save the selection/insertion point as it's reset on Linux (wxwidgets 2.9.5)
+ local ip = search:GetInsertionPoint()
+ local f, t = search:GetSelection()
+
+ -- this may set focus to a different object/tab,
+ -- so disable the focus event and then set the focus back
+ search:SetEvtHandlerEnabled(false)
+ onSelection(lines[linenow], search:GetValue())
+ search:SetFocus()
+ search:SetEvtHandlerEnabled(true)
+ if ide.osname == 'Unix' then
+ search:SetInsertionPoint(ip)
+ search:SetSelection(f, t)
+ end
+ end
+
+ frame:Connect(wx.wxEVT_CLOSE_WINDOW, function() frame:Destroy() end)
+
+ panel:Connect(wx.wxEVT_PAINT, onPanelPaint)
+ panel:Connect(wx.wxEVT_ERASE_BACKGROUND, function() end)
+ panel:Connect(wx.wxEVT_IDLE, onIdle)
+
+ results:Connect(wx.wxEVT_PAINT, onPaint)
+ results:Connect(wx.wxEVT_LEFT_DOWN, onMouseLeftDown)
+ results:Connect(wx.wxEVT_ERASE_BACKGROUND, function() end)
+
+ search:SetFocus()
+ search:Connect(wx.wxEVT_KEY_DOWN, onKeyDown)
+ search:Connect(wx.wxEVT_COMMAND_TEXT_UPDATED, onTextUpdated)
+ search:Connect(wx.wxEVT_COMMAND_TEXT_ENTER, function() onExit(linenow) end)
+ search:Connect(wx.wxEVT_KILL_FOCUS, function() onExit() end)
+
+ frame:Show(true)
+ frame:Update()
+ frame:Refresh()
+
+ search:SetValue((defaultText or "")..(selectedText or ""))
+ search:SetSelection(#(defaultText or ""), -1)
+end
+
+local sep = "[/\\%-_ ]+"
+local weights = {onegram = 0.1, digram = 0.4, trigram = 0.5}
+local cache = {}
+local missing = 3 -- penalty for missing symbols (1 missing == N matching)
+local casemismatch = 0.9 -- score for case mismatch (%% of full match)
+local function score(p, v)
+ local function ngrams(str, num, low, needcache)
+ local key = str..'\1'..num
+ if cache[key] then return unpack(cache[key]) end
+
+ local t, l, p = {}, {}, 0
+ for i = 1, #str-num+1 do
+ local pair = str:sub(i, i+num-1)
+ p = p + (t[pair] and 0 or 1)
+ if low and pair:find('%u') then l[pair:lower()] = casemismatch end
+ t[pair] = 1
+ end
+ if needcache then cache[key] = {t, p, l} end
+ return t, p, l
+ end
+
+ local function overlap(pattern, value, num)
+ local ph, ps = ngrams(pattern, num, false, true)
+ local vh, vs, vl = ngrams(value, num, true)
+ if ps + vs == 0 then return 0 end
+
+ local is = 0 -- intersection of two sets of ngrams
+ for k in pairs(ph) do is = is + (vh[k] or vl[k:lower()] or 0) end
+ return is / (ps + vs) - (num == 1 and missing * (ps - is) / (ps + vs) or 0)
+ end
+
+ local key = p..'\2'..v
+ if not cache[key] then
+ local score = weights.onegram * overlap(p, v, 1)
+ if score > 0 then -- don't bother with those that can't even score 1grams
+ p = ' '..(p:gsub(sep, ' '))
+ v = ' '..(v:gsub(sep, ' '))
+ score = score + weights.digram * overlap(p, v, 2)
+ score = score + weights.trigram * overlap(' '..p, ' '..v, 3)
+ end
+ cache[key] = 2 * 100 * score
+ end
+ return cache[key]
+end
+
+function CommandBarScoreItems(t, pattern, limit)
+ local r, plen = {}, #pattern
+ local maxp = 0
+ local num = 0
+ local prefilter = ide.config.commandbar and ide.config.commandbar.prefilter
+ -- anchor for 1-2 symbol patterns to speed up search
+ local needanchor = prefilter and prefilter * 4 <= #t and plen <= 2
+ local filter = prefilter and prefilter <= #t
+ -- expand `abc` into `a.*b.*c`, but limit the prefix to avoid penalty for `s.*s.*s.*....`
+ and pattern:gsub("[^%w_]+",""):sub(1,4):lower():gsub(".", "%1.*"):gsub("%.%*$","")
+ or nil
+ for _, v in ipairs(t) do
+ if #v >= plen then
+ local match = filter and v:lower():find(filter)
+ -- check if the current name needs to be prefiltered or anchored (for better performance);
+ -- if it needs to be anchored, then anchor it at the beginning of the string or the word
+ if not filter or (match and (not needanchor or match == 1 or v:find("^[%p%s]", match-1))) then
+ local p = score(pattern, v)
+ maxp = math.max(p, maxp)
+ if p > 1 and p > maxp / 4 then
+ num = num + 1
+ r[num] = {v, p}
+ end
+ end
+ end
+ end
+ table.sort(r, function(a, b) return a[2] > b[2] end)
+ -- limit the list to be displayed
+ -- `r[limit+1] = nil` is not desired as the resulting table may be sorted incorrectly
+ if tonumber(limit) and limit < #r then
+ local tmp = r
+ r = {}
+ for i = 1, limit do r[i] = tmp[i] end
+ end
+ return r
+end
+
+ide:AddPackage('core.commandbar', {
+ -- reset ngram cache when switching projects to conserve memory
+ onProjectLoad = function() cache = {} end
+ })
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/commands.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/commands.lua
new file mode 100644
index 0000000..8695659
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/commands.lua
@@ -0,0 +1,1054 @@
+-- Copyright 2011-14 Paul Kulchenko, ZeroBrane LLC
+-- authors: Lomtik Software (J. Winwood & John Labenski)
+-- Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+local frame = ide.frame
+local notebook = frame.notebook
+local openDocuments = ide.openDocuments
+local uimgr = frame.uimgr
+local unpack = table.unpack or unpack
+
+local CURRENT_LINE_MARKER = StylesGetMarker("currentline")
+local CURRENT_LINE_MARKER_VALUE = 2^CURRENT_LINE_MARKER
+
+function NewFile(filename)
+ filename = filename or ide.config.default.fullname
+ local editor = CreateEditor()
+ editor:SetupKeywords(GetFileExt(filename))
+ local doc = AddEditor(editor, filename)
+ if doc then
+ PackageEventHandle("onEditorNew", editor)
+ SetEditorSelection(doc.index)
+ end
+ return editor
+end
+
+-- Find an editor page that hasn't been used at all, eg. an untouched NewFile()
+local function findUnusedEditor()
+ local editor
+ for _, document in pairs(openDocuments) do
+ if (document.editor:GetLength() == 0) and
+ (not document.isModified) and (not document.filePath) and
+ not (document.editor:GetReadOnly() == true) then
+ editor = document.editor
+ break
+ end
+ end
+ return editor
+end
+
+function LoadFile(filePath, editor, file_must_exist, skipselection)
+ filePath = filePath:gsub("%s+$","")
+ filePath = wx.wxFileName(filePath)
+ filePath:Normalize() -- make it absolute and remove all .. and . if possible
+ filePath = filePath:GetFullPath()
+
+ -- if the file name is empty or is a directory, don't do anything
+ if filePath == '' or wx.wxDirExists(filePath) then return nil end
+
+ -- prevent files from being reopened again
+ if (not editor) then
+ local doc = ide:FindDocument(filePath)
+ if doc then
+ if not skipselection and doc.index ~= notebook:GetSelection() then
+ -- selecting the same tab doesn't trigger PAGE_CHANGE event,
+ -- but moves the focus to the tab bar, which needs to be avoided.
+ notebook:SetSelection(doc.index)
+ end
+ return doc.editor
+ end
+ end
+
+ local filesize = FileSize(filePath)
+ if not filesize and file_must_exist then return nil end
+
+ local current = editor and editor:GetCurrentPos()
+ editor = editor or findUnusedEditor() or CreateEditor()
+ editor:Freeze()
+ editor:SetupKeywords(GetFileExt(filePath))
+ editor:MarkerDeleteAll(-1)
+ if filesize then editor:Allocate(filesize) end
+ editor:SetTextDyn("")
+ editor.bom = string.char(0xEF,0xBB,0xBF)
+
+ local inputfilter = GetConfigIOFilter("input")
+ local file_text
+ ide:PushStatus("")
+ FileRead(filePath, 1024*1024, function(s)
+ if not file_text then
+ -- remove BOM from UTF-8 encoded files; store BOM to add back when saving
+ if s and editor:GetCodePage() == wxstc.wxSTC_CP_UTF8 and s:find("^"..editor.bom) then
+ s = s:gsub("^"..editor.bom, "")
+ else
+ -- set to 'false' as checks for nil on wxlua objects may fail at run-time
+ editor.bom = false
+ end
+ file_text = s
+ end
+ if inputfilter then s = inputfilter(filePath, s) end
+ local expected = editor:GetLength() + #s
+ editor:AppendTextDyn(s)
+ -- if the length is not as expected, then either it's a binary file or invalid UTF8
+ if editor:GetLength() ~= expected then
+ -- skip binary files with unknown extensions as they may have any sequences
+ -- when using Raw methods, this can only happen for binary files (that include \0 chars)
+ if editor.useraw or editor.spec == ide.specs.none and IsBinary(s) then
+ DisplayOutputLn(("%s: %s"):format(filePath,
+ TR("Binary file is shown as read-only as it is only partially loaded.")))
+ file_text = ''
+ editor:SetReadOnly(true)
+ return false
+ end
+
+ -- handle invalid UTF8 characters
+ -- fix: doesn't handle characters split by callback buffer
+ local replacement, invalid = "\022"
+ s, invalid = FixUTF8(s, replacement)
+ if #invalid > 0 then
+ editor:AppendTextDyn(s)
+ local lastline = nil
+ for _, n in ipairs(invalid) do
+ local line = editor:LineFromPosition(n)
+ if line ~= lastline then
+ DisplayOutputLn(("%s:%d: %s"):format(filePath, line+1,
+ TR("Replaced an invalid UTF8 character with %s."):format(replacement)))
+ lastline = line
+ end
+ end
+ end
+ end
+ if filesize and filesize > 0 then
+ ide:PopStatus()
+ ide:PushStatus(TR("%s%% loaded..."):format(math.floor(100*editor:GetLength()/filesize)))
+ end
+ end)
+ ide:PopStatus()
+
+ editor:Colourise(0, -1)
+ editor:ResetTokenList() -- reset list of tokens if this is a reused editor
+ editor:Thaw()
+
+ local edcfg = ide.config.editor
+ if current then editor:GotoPos(current) end
+ if (file_text and edcfg.autotabs) then
+ -- use tabs if they are already used
+ -- or if "usetabs" is set and no space indentation is used in a file
+ editor:SetUseTabs(string.find(file_text, "\t") ~= nil
+ or edcfg.usetabs and (file_text:find("%f[^\r\n] ") or file_text:find("^ ")) == nil)
+ end
+
+ if (file_text and edcfg.checkeol) then
+ -- Auto-detect CRLF/LF line-endings
+ local foundcrlf = string.find(file_text,"\r\n") ~= nil
+ local foundlf = (string.find(file_text,"[^\r]\n") ~= nil)
+ or (string.find(file_text,"^\n") ~= nil) -- edge case: file beginning with LF and having no other LF
+ if foundcrlf and foundlf then -- file with mixed line-endings
+ DisplayOutputLn(("%s: %s")
+ :format(filePath, TR("Mixed end-of-line encodings detected.")..' '..
+ TR("Use '%s' to show line endings and '%s' to convert them.")
+ :format("ide:GetEditor():SetViewEOL(1)", "ide:GetEditor():ConvertEOLs(ide:GetEditor():GetEOLMode())")))
+ elseif foundcrlf then
+ editor:SetEOLMode(wxstc.wxSTC_EOL_CRLF)
+ elseif foundlf then
+ editor:SetEOLMode(wxstc.wxSTC_EOL_LF)
+ -- else (e.g. file is 1 line long or uses another line-ending): use default EOL mode
+ end
+ end
+
+ editor:EmptyUndoBuffer()
+ local doc = ide:GetDocument(editor)
+ if doc then -- existing editor; switch to the tab
+ notebook:SetSelection(doc:GetTabIndex())
+ else -- the editor has not been added to notebook
+ doc = AddEditor(editor, wx.wxFileName(filePath):GetFullName()
+ or ide.config.default.fullname)
+ end
+ doc.filePath = filePath
+ doc.fileName = wx.wxFileName(filePath):GetFullName()
+ doc.modTime = GetFileModTime(filePath)
+
+ doc:SetModified(false)
+ doc:SetTabText(doc:GetFileName())
+
+ -- activate the editor; this is needed for those cases when the editor is
+ -- created from some other element, for example, from a project tree.
+ if not skipselection then SetEditorSelection() end
+
+ PackageEventHandle("onEditorLoad", editor)
+
+ return editor
+end
+
+function ReLoadFile(filePath, editor, ...)
+ if not editor then return LoadFile(filePath, editor, ...) end
+
+ -- save all markers
+ local markers = editor:MarkerGetAll()
+ -- add the current line content to retrieved markers to compare later if needed
+ for _, marker in ipairs(markers) do marker[3] = editor:GetLineDyn(marker[1]) end
+ local lines = editor:GetLineCount()
+
+ -- load file into the same editor
+ editor = LoadFile(filePath, editor, ...)
+ if not editor then return end
+
+ if #markers > 0 then -- restore all markers
+ -- delete all markers as they may be restored by a different mechanism,
+ -- which may be limited to only restoring some markers
+ editor:MarkerDeleteAll(-1)
+ local samelinecount = lines == editor:GetLineCount()
+ for _, marker in ipairs(markers) do
+ local line, mask, text = unpack(marker)
+ if samelinecount then
+ -- restore marker at the same line number
+ editor:MarkerAddSet(line, mask)
+ else
+ -- find matching line in the surrounding area and restore marker there
+ for _, l in ipairs({line, line-1, line-2, line+1, line+2}) do
+ if text == editor:GetLineDyn(l) then
+ editor:MarkerAddSet(l, mask)
+ break
+ end
+ end
+ end
+ end
+ PackageEventHandle("onEditorMarkerUpdate", editor)
+ end
+
+ return editor
+end
+
+function ActivateFile(filename)
+ local name, suffix, value = filename:match('(.+):([lLpP]?)(%d+)$')
+ if name and not wx.wxFileExists(filename) then filename = name end
+
+ -- check if non-existing file can be loaded from the project folder;
+ -- this is to handle: "project file" used on the command line
+ if not wx.wxFileExists(filename) and not wx.wxIsAbsolutePath(filename) then
+ filename = GetFullPathIfExists(ide:GetProject(), filename) or filename
+ end
+
+ local opened = LoadFile(filename, nil, true)
+ if opened and value then
+ if suffix:upper() == 'P' then opened:GotoPosDelayed(tonumber(value))
+ else opened:GotoPosDelayed(opened:PositionFromLine(value-1))
+ end
+ end
+ return opened
+end
+
+local function getExtsString(ed)
+ local exts = ed and ed.spec and ed.spec.exts or {}
+ local knownexts = #exts > 0 and "*."..table.concat(exts, ";*.") or nil
+ return (knownexts and TR("Known Files").." ("..knownexts..")|"..knownexts.."|" or "")
+ .. TR("All files").." (*)|*"
+end
+
+function ReportError(msg)
+ return wx.wxMessageBox(msg, TR("Error"), wx.wxICON_ERROR + wx.wxOK + wx.wxCENTRE, ide.frame)
+end
+
+function OpenFile(event)
+ local editor = GetEditor()
+ local path = editor and ide:GetDocument(editor):GetFilePath() or nil
+ local fileDialog = wx.wxFileDialog(ide.frame, TR("Open file"),
+ (path and GetPathWithSep(path) or FileTreeGetDir() or ""),
+ "",
+ getExtsString(editor),
+ wx.wxFD_OPEN + wx.wxFD_FILE_MUST_EXIST + wx.wxFD_MULTIPLE)
+ if fileDialog:ShowModal() == wx.wxID_OK then
+ for _, path in ipairs(fileDialog:GetPaths()) do
+ if not LoadFile(path, nil, true) then
+ ReportError(TR("Unable to load file '%s'."):format(path))
+ end
+ end
+ end
+ fileDialog:Destroy()
+end
+
+-- save the file to filePath or if filePath is nil then call SaveFileAs
+function SaveFile(editor, filePath)
+ -- this event can be aborted
+ -- as SaveFileAs calls SaveFile, this event may be called two times:
+ -- first without filePath and then with filePath
+ if PackageEventHandle("onEditorPreSave", editor, filePath) == false then
+ return false
+ end
+
+ if not filePath then
+ return SaveFileAs(editor)
+ else
+ if ide.config.savebak then
+ local ok, err = FileRename(filePath, filePath..".bak")
+ if not ok then
+ ReportError(TR("Unable to save file '%s': %s"):format(filePath..".bak", err))
+ return
+ end
+ end
+
+ local st = ((editor:GetCodePage() == wxstc.wxSTC_CP_UTF8 and editor.bom or "")
+ .. editor:GetTextDyn())
+ if GetConfigIOFilter("output") then
+ st = GetConfigIOFilter("output")(filePath,st)
+ end
+
+ local ok, err = FileWrite(filePath, st)
+ if ok then
+ editor:SetSavePoint()
+ local doc = ide:GetDocument(editor)
+ doc.filePath = filePath
+ doc.fileName = wx.wxFileName(filePath):GetFullName()
+ doc.modTime = GetFileModTime(filePath)
+ doc:SetModified(false)
+ doc:SetTabText(doc:GetFileName())
+ SetAutoRecoveryMark()
+ FileTreeMarkSelected(filePath)
+
+ PackageEventHandle("onEditorSave", editor)
+
+ return true
+ else
+ ReportError(TR("Unable to save file '%s': %s"):format(filePath, err))
+ end
+ end
+
+ return false
+end
+
+function ApproveFileOverwrite()
+ return wx.wxMessageBox(
+ TR("File already exists.").."\n"..TR("Do you want to overwrite it?"),
+ GetIDEString("editormessage"),
+ wx.wxYES_NO + wx.wxCENTRE, ide.frame) == wx.wxYES
+end
+
+function SaveFileAs(editor)
+ local id = editor:GetId()
+ local saved = false
+ local filePath = (openDocuments[id].filePath
+ or ((FileTreeGetDir() or "")
+ ..(openDocuments[id].fileName or ide.config.default.name)))
+
+ local fn = wx.wxFileName(filePath)
+ fn:Normalize() -- want absolute path for dialog
+
+ local ext = fn:GetExt()
+ if (not ext or #ext == 0) and editor.spec and editor.spec.exts then
+ ext = editor.spec.exts[1]
+ -- set the extension on the file if assigned as this is used by OSX/Linux
+ -- to present the correct default "save as type" choice.
+ if ext then fn:SetExt(ext) end
+ end
+ local fileDialog = wx.wxFileDialog(ide.frame, TR("Save file as"),
+ fn:GetPath(wx.wxPATH_GET_VOLUME),
+ fn:GetFullName(),
+ -- specify the current extension plus all other extensions based on specs
+ (ext and #ext > 0 and "*."..ext.."|*."..ext.."|" or "")..getExtsString(editor),
+ wx.wxFD_SAVE)
+
+ if fileDialog:ShowModal() == wx.wxID_OK then
+ local filePath = fileDialog:GetPath()
+
+ -- check if there is another tab with the same name and prepare to close it
+ local existing = (ide:FindDocument(filePath) or {}).index
+ local cansave = fn:GetFullName() == filePath -- saving into the same file
+ or not wx.wxFileName(filePath):FileExists() -- or a new file
+ or ApproveFileOverwrite()
+
+ if cansave and SaveFile(editor, filePath) then
+ SetEditorSelection() -- update title of the editor
+ if ext ~= GetFileExt(filePath) then
+ -- new extension, so setup new keywords and re-apply indicators
+ editor:ClearDocumentStyle() -- remove styles from the document
+ editor:SetupKeywords(GetFileExt(filePath))
+ IndicateAll(editor)
+ IndicateFunctionsOnly(editor)
+ MarkupStyle(editor)
+ end
+ saved = true
+
+ if existing then
+ -- save the current selection as it may change after closing
+ local current = notebook:GetSelection()
+ ClosePage(existing)
+ -- restore the selection if it changed
+ if current ~= notebook:GetSelection() then
+ notebook:SetSelection(current)
+ end
+ end
+ end
+ end
+
+ fileDialog:Destroy()
+ return saved
+end
+
+function SaveAll(quiet)
+ for _, document in pairs(openDocuments) do
+ local editor = document.editor
+ local filePath = document.filePath
+
+ if (document.isModified or not document.filePath) -- need to save
+ and (document.filePath or not quiet) then -- have path or can ask user
+ SaveFile(editor, filePath) -- will call SaveFileAs if necessary
+ end
+ end
+end
+
+local function removePage(index)
+ local prevIndex = nil
+ local nextIndex = nil
+
+ -- try to preserve old selection
+ local selectIndex = notebook:GetSelection()
+ selectIndex = selectIndex ~= index and selectIndex
+
+ local delid = nil
+ for id, document in pairsSorted(openDocuments,
+ function(a, b) -- sort by document index
+ return openDocuments[a].index < openDocuments[b].index
+ end) do
+ local wasselected = document.index == selectIndex
+ if document.index < index then
+ prevIndex = document.index
+ elseif document.index == index then
+ delid = id
+ document.editor:Destroy()
+ elseif document.index > index then
+ document.index = document.index - 1
+ if nextIndex == nil then
+ nextIndex = document.index
+ end
+ end
+ if (wasselected) then
+ selectIndex = document.index
+ end
+ end
+
+ if (delid) then
+ openDocuments[delid] = nil
+ end
+
+ notebook:RemovePage(index)
+
+ if selectIndex then
+ notebook:SetSelection(selectIndex)
+ elseif nextIndex then
+ notebook:SetSelection(nextIndex)
+ elseif prevIndex then
+ notebook:SetSelection(prevIndex)
+ end
+
+ -- need to set editor selection as it's called *after* PAGE_CHANGED event
+ SetEditorSelection()
+end
+
+function ClosePage(selection)
+ local editor = GetEditor(selection)
+ local id = editor:GetId()
+
+ if PackageEventHandle("onEditorPreClose", editor) == false then
+ return false
+ end
+
+ if SaveModifiedDialog(editor, true) ~= wx.wxID_CANCEL then
+ DynamicWordsRemoveAll(editor)
+ local debugger = ide.debugger
+ -- check if the window with the scratchpad running is being closed
+ if debugger and debugger.scratchpad and debugger.scratchpad.editors
+ and debugger.scratchpad.editors[editor] then
+ DebuggerScratchpadOff()
+ end
+ -- check if the debugger is running and is using the current window;
+ -- abort the debugger if the current marker is in the window being closed
+ if debugger and debugger.server and
+ (editor:MarkerNext(0, CURRENT_LINE_MARKER_VALUE) >= 0) then
+ debugger.terminate()
+ end
+ PackageEventHandle("onEditorClose", editor)
+ removePage(ide.openDocuments[id].index)
+
+ -- disable full screen if the last tab is closed
+ if not (notebook:GetSelection() >= 0) then ShowFullScreen(false) end
+ return true
+ end
+ return false
+end
+
+function CloseAllPagesExcept(selection)
+ local toclose = {}
+ for _, document in pairs(ide.openDocuments) do
+ table.insert(toclose, document.index)
+ end
+
+ table.sort(toclose)
+
+ -- close pages for those files that match the project in the reverse order
+ -- (as ids shift when pages are closed)
+ for i = #toclose, 1, -1 do
+ if toclose[i] ~= selection then ClosePage(toclose[i]) end
+ end
+end
+
+-- Show a dialog to save a file before closing editor.
+-- returns wxID_YES, wxID_NO, or wxID_CANCEL if allow_cancel
+function SaveModifiedDialog(editor, allow_cancel)
+ local result = wx.wxID_NO
+ local id = editor:GetId()
+ local document = openDocuments[id]
+ local filePath = document.filePath
+ local fileName = document.fileName
+ if document.isModified then
+ local message = TR("Do you want to save the changes to '%s'?")
+ :format(fileName or ide.config.default.name)
+ local dlg_styles = wx.wxYES_NO + wx.wxCENTRE + wx.wxICON_QUESTION
+ if allow_cancel then dlg_styles = dlg_styles + wx.wxCANCEL end
+ local dialog = wx.wxMessageDialog(ide.frame, message,
+ TR("Save Changes?"),
+ dlg_styles)
+ result = dialog:ShowModal()
+ dialog:Destroy()
+ if result == wx.wxID_YES then
+ if not SaveFile(editor, filePath) then
+ return wx.wxID_CANCEL -- cancel if canceled save dialog
+ end
+ end
+ end
+
+ return result
+end
+
+function SaveOnExit(allow_cancel)
+ for _, document in pairs(openDocuments) do
+ if (SaveModifiedDialog(document.editor, allow_cancel) == wx.wxID_CANCEL) then
+ return false
+ end
+ end
+
+ -- if all documents have been saved or refused to save, then mark those that
+ -- are still modified as not modified (they don't need to be saved)
+ -- to keep their tab names correct
+ for _, document in pairs(openDocuments) do
+ if document.isModified then document:SetModified(false) end
+ end
+
+ return true
+end
+
+function SetAllEditorsReadOnly(enable)
+ for _, document in pairs(openDocuments) do
+ document.editor:SetReadOnly(enable)
+ end
+end
+
+-----------------
+-- Debug related
+
+function ClearAllCurrentLineMarkers()
+ for _, document in pairs(openDocuments) do
+ document.editor:MarkerDeleteAll(CURRENT_LINE_MARKER)
+ document.editor:Refresh() -- needed for background markers that don't get refreshed (wx2.9.5)
+ end
+end
+
+-- remove shebang line (#!) as it throws a compilation error as
+-- loadstring() doesn't allow it even though lua/loadfile accepts it.
+-- replace with a new line to keep the number of lines the same.
+function StripShebang(code) return (code:gsub("^#!.-\n", "\n")) end
+
+local compileOk, compileTotal = 0, 0
+function CompileProgram(editor, params)
+ local params = {
+ jumponerror = (params or {}).jumponerror ~= false,
+ reportstats = (params or {}).reportstats ~= false,
+ keepoutput = (params or {}).keepoutput,
+ }
+ local doc = ide:GetDocument(editor)
+ local filePath = doc:GetFilePath() or doc:GetFileName()
+ local func, err = loadstring(StripShebang(editor:GetTextDyn()), '@'..filePath)
+ local line = not func and tonumber(err:match(":(%d+)%s*:")) or nil
+
+ if not params.keepoutput then ClearOutput() end
+
+ compileTotal = compileTotal + 1
+ if func then
+ compileOk = compileOk + 1
+ if params.reportstats then
+ DisplayOutputLn(TR("Compilation successful; %.0f%% success rate (%d/%d).")
+ :format(compileOk/compileTotal*100, compileOk, compileTotal))
+ end
+ else
+ ActivateOutput()
+ DisplayOutputLn(TR("Compilation error").." "..TR("on line %d"):format(line)..":")
+ DisplayOutputLn((err:gsub("\n$", "")))
+ -- check for escapes invalid in LuaJIT/Lua 5.2 that are allowed in Lua 5.1
+ if err:find('invalid escape sequence') then
+ local s = editor:GetLineDyn(line-1)
+ local cleaned = s
+ :gsub('\\[abfnrtv\\"\']', ' ')
+ :gsub('(\\x[0-9a-fA-F][0-9a-fA-F])', function(s) return string.rep(' ', #s) end)
+ :gsub('(\\%d%d?%d?)', function(s) return string.rep(' ', #s) end)
+ :gsub('(\\z%s*)', function(s) return string.rep(' ', #s) end)
+ local invalid = cleaned:find("\\")
+ if invalid then
+ DisplayOutputLn(TR("Consider removing backslash from escape sequence '%s'.")
+ :format(s:sub(invalid,invalid+1)))
+ end
+ end
+ if line and params.jumponerror and line-1 ~= editor:GetCurrentLine() then
+ editor:GotoLine(line-1)
+ end
+ end
+
+ return func ~= nil -- return true if it compiled ok
+end
+
+------------------
+-- Save & Close
+
+function SaveIfModified(editor)
+ local id = editor:GetId()
+ if openDocuments[id].isModified then
+ local saved = false
+ if not openDocuments[id].filePath then
+ local ret = wx.wxMessageBox(
+ TR("You must save the program first.").."\n"..TR("Press cancel to abort."),
+ TR("Save file?"), wx.wxOK + wx.wxCANCEL + wx.wxCENTRE, ide.frame)
+ if ret == wx.wxOK then
+ saved = SaveFileAs(editor)
+ end
+ else
+ saved = SaveFile(editor, openDocuments[id].filePath)
+ end
+
+ if saved then
+ openDocuments[id].isModified = false
+ else
+ return false -- not saved
+ end
+ end
+
+ return true -- saved
+end
+
+function GetOpenFiles()
+ local opendocs = {}
+ for _, document in pairs(ide.openDocuments) do
+ if (document.filePath) then
+ local wxfname = wx.wxFileName(document.filePath)
+ wxfname:Normalize()
+
+ table.insert(opendocs, {filename=wxfname:GetFullPath(),
+ id=document.index, cursorpos = document.editor:GetCurrentPos()})
+ end
+ end
+
+ -- to keep tab order
+ table.sort(opendocs,function(a,b) return (a.id < b.id) end)
+
+ local id = GetEditor()
+ id = id and id:GetId()
+ return opendocs, {index = (id and openDocuments[id].index or 0)}
+end
+
+function SetOpenFiles(nametab,params)
+ for _, doc in ipairs(nametab) do
+ local editor = LoadFile(doc.filename,nil,true,true) -- skip selection
+ if editor then editor:GotoPosDelayed(doc.cursorpos or 0) end
+ end
+ notebook:SetSelection(params and params.index or 0)
+ SetEditorSelection()
+end
+
+local beforeFullScreenPerspective
+local statusbarShown
+
+function ShowFullScreen(setFullScreen)
+ if setFullScreen then
+ beforeFullScreenPerspective = uimgr:SavePerspective()
+
+ local panes = frame.uimgr:GetAllPanes()
+ for index = 0, panes:GetCount()-1 do
+ local name = panes:Item(index).name
+ if name ~= "notebook" then frame.uimgr:GetPane(name):Hide() end
+ end
+ uimgr:Update()
+ SetEditorSelection() -- make sure the focus is on the editor
+ elseif beforeFullScreenPerspective then
+ uimgr:LoadPerspective(beforeFullScreenPerspective, true)
+ beforeFullScreenPerspective = nil
+ end
+
+ -- On OSX, status bar is not hidden when switched to
+ -- full screen: http://trac.wxwidgets.org/ticket/14259; do manually.
+ -- need to turn off before showing full screen and turn on after,
+ -- otherwise the window is restored incorrectly and is reduced in size.
+ if ide.osname == 'Macintosh' and setFullScreen then
+ statusbarShown = frame:GetStatusBar():IsShown()
+ frame:GetStatusBar():Hide()
+ end
+
+ -- protect from systems that don't have ShowFullScreen (GTK on linux?)
+ pcall(function() frame:ShowFullScreen(setFullScreen) end)
+
+ if ide.osname == 'Macintosh' and not setFullScreen then
+ if statusbarShown then
+ frame:GetStatusBar():Show()
+ -- refresh AuiManager as the statusbar may be shown below the border
+ uimgr:Update()
+ end
+ end
+end
+
+function ProjectConfig(dir, config)
+ if config then ide.session.projects[dir] = config
+ else return unpack(ide.session.projects[dir] or {}) end
+end
+
+function SetOpenTabs(params)
+ local recovery, nametab = LoadSafe("return "..params.recovery)
+ if not recovery or not nametab then
+ DisplayOutputLn(TR("Can't process auto-recovery record; invalid format: %s."):format(nametab))
+ return
+ end
+ if not params.quiet then
+ DisplayOutputLn(TR("Found auto-recovery record and restored saved session."))
+ end
+ for _,doc in ipairs(nametab) do
+ -- check for missing file if no content is stored
+ if doc.filepath and not doc.content and not wx.wxFileExists(doc.filepath) then
+ DisplayOutputLn(TR("File '%s' is missing and can't be recovered.")
+ :format(doc.filepath))
+ else
+ local editor = (doc.filepath and LoadFile(doc.filepath,nil,true,true)
+ or findUnusedEditor() or NewFile(doc.filename))
+ local opendoc = ide:GetDocument(editor)
+ if doc.content then
+ editor:SetTextDyn(doc.content)
+ if doc.filepath and opendoc.modTime and doc.modified < opendoc.modTime:GetTicks() then
+ DisplayOutputLn(TR("File '%s' has more recent timestamp than restored '%s'; please review before saving.")
+ :format(doc.filepath, opendoc:GetTabText()))
+ end
+ opendoc:SetModified(true)
+ end
+ editor:GotoPosDelayed(doc.cursorpos or 0)
+ end
+ end
+ notebook:SetSelection(params and params.index or 0)
+ SetEditorSelection()
+end
+
+local function getOpenTabs()
+ local opendocs = {}
+ for _, document in pairs(ide.openDocuments) do
+ local editor = document:GetEditor()
+ table.insert(opendocs, {
+ filename = document:GetFileName(),
+ filepath = document:GetFilePath(),
+ tabname = document:GetTabText(),
+ modified = document:GetModTime() and document:GetModTime():GetTicks(), -- get number of seconds
+ content = document:IsModified() and editor:GetTextDyn() or nil,
+ id = document:GetTabIndex(),
+ cursorpos = editor:GetCurrentPos()})
+ end
+
+ -- to keep tab order
+ table.sort(opendocs, function(a,b) return (a.id < b.id) end)
+
+ local ed = GetEditor()
+ local doc = ed and ide:GetDocument(ed)
+ return opendocs, {index = (doc and doc:GetTabIndex() or 0)}
+end
+
+function SetAutoRecoveryMark()
+ ide.session.lastupdated = os.time()
+end
+
+local function generateRecoveryRecord(opentabs)
+ return require('mobdebug').line(opentabs, {comment = false})
+end
+
+local function saveHotExit()
+ local opentabs, params = getOpenTabs()
+ if #opentabs > 0 then
+ params.recovery = generateRecoveryRecord(opentabs)
+ params.quiet = true
+ SettingsSaveFileSession({}, params)
+ end
+end
+
+local function saveAutoRecovery(force)
+ if not ide.config.autorecoverinactivity then return end
+
+ local lastupdated = ide.session.lastupdated
+ if not force then
+ if not lastupdated or lastupdated < (ide.session.lastsaved or 0) then return end
+ end
+
+ local now = os.time()
+ if not force and lastupdated + ide.config.autorecoverinactivity > now then return end
+
+ -- find all open modified files and save them
+ local opentabs, params = getOpenTabs()
+ if #opentabs > 0 then
+ params.recovery = generateRecoveryRecord(opentabs)
+ SettingsSaveAll()
+ SettingsSaveFileSession({}, params)
+ ide.settings:Flush()
+ end
+ ide.session.lastsaved = now
+ ide:SetStatus(TR("Saved auto-recover at %s."):format(os.date("%H:%M:%S")))
+end
+
+local function fastWrap(func, ...)
+ -- ignore SetEditorSelection that is not needed as `func` may work on
+ -- multipe files, but editor needs to be selected once.
+ local SES = SetEditorSelection
+ SetEditorSelection = function() end
+ func(...)
+ SetEditorSelection = SES
+end
+
+function StoreRestoreProjectTabs(curdir, newdir, intfname)
+ local win = ide.osname == 'Windows'
+ local interpreter = intfname or ide.interpreter.fname
+ local current, closing, restore = notebook:GetSelection(), 0, false
+
+ if ide.osname ~= 'Macintosh' then notebook:Freeze() end
+
+ if curdir and #curdir > 0 then
+ local lowcurdir = win and string.lower(curdir) or curdir
+ local lownewdir = win and string.lower(newdir) or newdir
+ local projdocs, closdocs = {}, {}
+ for _, document in ipairs(GetOpenFiles()) do
+ local dpath = win and string.lower(document.filename) or document.filename
+ -- check if the filename is in the same folder
+ if dpath:find(lowcurdir, 1, true) == 1
+ and dpath:find("^[\\/]", #lowcurdir+1) then
+ table.insert(projdocs, document)
+ closing = closing + (document.id < current and 1 or 0)
+ -- only close if the file is not in new project as it would be reopened
+ if not dpath:find(lownewdir, 1, true)
+ or not dpath:find("^[\\/]", #lownewdir+1) then
+ table.insert(closdocs, document)
+ end
+ elseif document.id == current then restore = true end
+ end
+
+ -- adjust for the number of closing tabs on the left from the current one
+ current = current - closing
+
+ -- save opened files from this project
+ ProjectConfig(curdir, {projdocs,
+ {index = notebook:GetSelection() - current, interpreter = interpreter}})
+
+ -- close pages for those files that match the project in the reverse order
+ -- (as ids shift when pages are closed)
+ for i = #closdocs, 1, -1 do fastWrap(ClosePage, closdocs[i].id) end
+ end
+
+ local files, params = ProjectConfig(newdir)
+ if files then
+ -- provide fake index so that it doesn't activate it as the index may be not
+ -- quite correct if some of the existing files are already open in the IDE.
+ fastWrap(SetOpenFiles, files, {index = #files + notebook:GetPageCount()})
+ end
+
+ -- either interpreter is chosen for the project or the default value is set
+ if (params and params.interpreter) or (not params and ide.config.interpreter) then
+ ProjectSetInterpreter(params and params.interpreter or ide.config.interpreter)
+ end
+
+ if ide.osname ~= 'Macintosh' then notebook:Thaw() end
+
+ local index = params and params.index
+ if notebook:GetPageCount() == 0 then NewFile()
+ elseif restore and current >= 0 then notebook:SetSelection(current)
+ elseif index and index >= 0 and files[index+1] then
+ -- move the editor tab to the front with the file from the config
+ LoadFile(files[index+1].filename, nil, true)
+ SetEditorSelection() -- activate the editor in the active tab
+ end
+
+ -- remove current config as it may change; the current configuration is
+ -- stored with the general config.
+ -- The project configuration will be updated when the project is changed.
+ ProjectConfig(newdir, {})
+end
+
+local function closeWindow(event)
+ -- if the app is already exiting, then help it exit; wxwidgets on Windows
+ -- is supposed to report Shutdown/logoff events by setting CanVeto() to
+ -- false, but it doesn't happen. We simply leverage the fact that
+ -- CloseWindow is called several times in this case and exit. Similar
+ -- behavior has been also seen on Linux, so this logic applies everywhere.
+ if ide.exitingProgram then os.exit() end
+
+ ide.exitingProgram = true -- don't handle focus events
+
+ if not ide.config.hotexit and not SaveOnExit(event:CanVeto()) then
+ event:Veto()
+ ide.exitingProgram = false
+ return
+ end
+
+ ShowFullScreen(false)
+
+ PackageEventHandle("onAppClose")
+
+ -- first need to detach all processes IDE has launched as the current
+ -- process is likely to terminate before child processes are terminated,
+ -- which may lead to a crash when EVT_END_PROCESS event is called.
+ DetachChildProcess()
+ DebuggerShutdown()
+
+ SettingsSaveAll()
+ if ide.config.hotexit then saveHotExit() end
+ ide.settings:Flush()
+
+ do -- hide all floating panes first
+ local panes = frame.uimgr:GetAllPanes()
+ for index = 0, panes:GetCount()-1 do
+ local pane = frame.uimgr:GetPane(panes:Item(index).name)
+ if pane:IsFloating() then pane:Hide() end
+ end
+ end
+ frame.uimgr:Update() -- hide floating panes
+ frame.uimgr:UnInit()
+ frame:Hide() -- hide the main frame while the IDE exits
+
+ -- stop all the timers
+ for _, timer in pairs(ide.timers) do timer:Stop() end
+
+ event:Skip()
+
+ PackageEventHandle("onAppDone")
+end
+frame:Connect(wx.wxEVT_CLOSE_WINDOW, closeWindow)
+
+frame:Connect(wx.wxEVT_TIMER, function() saveAutoRecovery() end)
+
+-- in the presence of wxAuiToolbar, when (1) the app gets focus,
+-- (2) a floating panel is closed or (3) a toolbar dropdown is closed,
+-- the focus is always on the toolbar when the app gets focus,
+-- so to restore the focus correctly, need to track where the control is
+-- and to set the focus to the last element that had focus.
+-- it would be easier to track KILL_FOCUS events, but controls on OSX
+-- don't always generate KILL_FOCUS events (see relevant wxwidgets
+-- tickets: http://trac.wxwidgets.org/ticket/14142
+-- and http://trac.wxwidgets.org/ticket/14269)
+
+ide.editorApp:Connect(wx.wxEVT_SET_FOCUS, function(event)
+ if ide.exitingProgram then return end
+
+ local win = ide.frame:FindFocus()
+ if win then
+ local class = win:GetClassInfo():GetClassName()
+ -- don't set focus on the main frame or toolbar
+ if ide.infocus and (class == 'wxAuiToolBar' or class == 'wxFrame') then
+ -- check if the window is shown before returning focus to it,
+ -- as it may lead to a recursion in event handlers on OSX (wxwidgets 2.9.5).
+ pcall(function() if ide:IsWindowShown(ide.infocus) then ide.infocus:SetFocus() end end)
+ return
+ end
+
+ -- keep track of the current control in focus, but only on the main frame
+ -- don't try to "remember" any of the focus changes on various dialog
+ -- windows as those will disappear along with their controls
+ local grandparent = win:GetGrandParent()
+ local frameid = ide.frame:GetId()
+ local mainwin = grandparent and grandparent:GetId() == frameid
+ local parent = win:GetParent()
+ while parent do
+ local class = parent:GetClassInfo():GetClassName()
+ if (class == 'wxFrame' or class:find('^wx.*Dialog$'))
+ and parent:GetId() ~= frameid then
+ mainwin = false; break
+ end
+ parent = parent:GetParent()
+ end
+ if mainwin then
+ if ide.infocus and ide.infocus ~= win and ide.osname == 'Macintosh' then
+ -- kill focus on the control that had the focus as wxwidgets on OSX
+ -- doesn't do it: http://trac.wxwidgets.org/ticket/14142;
+ -- wrap into pcall in case the window is already deleted
+ local ev = wx.wxFocusEvent(wx.wxEVT_KILL_FOCUS)
+ pcall(function() ide.infocus:GetEventHandler():ProcessEvent(ev) end)
+ end
+ ide.infocus = win
+ end
+ end
+
+ event:Skip()
+end)
+
+local updateInterval = 250 -- time in ms
+wx.wxUpdateUIEvent.SetUpdateInterval(updateInterval)
+
+ide.editorApp:Connect(wx.wxEVT_ACTIVATE_APP,
+ function(event)
+ if not ide.exitingProgram then
+ if ide.osname == 'Macintosh' and ide.infocus and event:GetActive() then
+ -- restore focus to the last element that received it;
+ -- wrap into pcall in case the element has disappeared
+ -- while the application was out of focus
+ pcall(function() if ide:IsWindowShown(ide.infocus) then ide.infocus:SetFocus() end end)
+ end
+
+ local active = event:GetActive()
+ -- save auto-recovery record when making the app inactive
+ if not active then saveAutoRecovery(true) end
+
+ -- disable UI refresh when app is inactive, but only when not running
+ wx.wxUpdateUIEvent.SetUpdateInterval(
+ (active or ide:GetLaunchedProcess()) and updateInterval or -1)
+
+ PackageEventHandle(active and "onAppFocusSet" or "onAppFocusLost", ide.editorApp)
+ end
+ event:Skip()
+ end)
+
+if ide.config.autorecoverinactivity then
+ ide.timers.session = wx.wxTimer(frame)
+ -- check at least 5s to be never more than 5s off
+ ide.timers.session:Start(math.min(5, ide.config.autorecoverinactivity)*1000)
+end
+
+function PaneFloatToggle(window)
+ local pane = uimgr:GetPane(window)
+ if pane:IsFloating() then
+ pane:Dock()
+ else
+ pane:Float()
+ pane:FloatingPosition(pane.window:GetScreenPosition())
+ pane:FloatingSize(pane.window:GetSize())
+ end
+ uimgr:Update()
+end
+
+local cma, cman = 0, 1
+frame:Connect(wx.wxEVT_IDLE,
+ function(event)
+ local debugger = ide.debugger
+ if (debugger.update) then debugger.update() end
+ if (debugger.scratchpad) then DebuggerRefreshScratchpad() end
+ if IndicateIfNeeded() then event:RequestMore(true) end
+ PackageEventHandleOnce("onIdleOnce", event)
+ PackageEventHandle("onIdle", event)
+
+ -- process onidle events if any
+ if #ide.onidle > 0 then table.remove(ide.onidle)() end
+ if #ide.onidle > 0 then event:RequestMore(true) end -- request more if anything left
+
+ if ide.config.showmemoryusage then
+ local mem = collectgarbage("count")
+ local alpha = math.max(tonumber(ide.config.showmemoryusage) or 0, 1/cman)
+ cman = cman + 1
+ cma = alpha * mem + (1-alpha) * cma
+ ide:SetStatus(("cur: %sKb; avg: %sKb"):format(math.floor(mem), math.floor(cma)))
+ end
+
+ event:Skip() -- let other EVT_IDLE handlers to work on the event
+ end)
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/debugger.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/debugger.lua
new file mode 100644
index 0000000..26209c1
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/debugger.lua
@@ -0,0 +1,1696 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- Original authors: Lomtik Software (J. Winwood & John Labenski)
+-- Luxinia Dev (Eike Decker & Christoph Kubisch)
+-- Integration with MobDebug
+---------------------------------------------------------
+
+local copas = require "copas"
+local socket = require "socket"
+local mobdebug = require "mobdebug"
+local unpack = table.unpack or unpack
+
+local ide = ide
+local debugger = setmetatable(ide.debugger, ide.proto.Debugger)
+debugger.server = nil -- DebuggerServer object when debugging, else nil
+debugger.running = false -- true when the debuggee is running
+debugger.listening = false -- true when the debugger is listening for a client
+debugger.portnumber = ide.config.debugger.port or mobdebug.port -- the port # to use for debugging
+debugger.watchCtrl = nil -- the watch ctrl that shows watch information
+debugger.stackCtrl = nil -- the stack ctrl that shows stack information
+debugger.toggleview = {
+ bottomnotebook = true, -- output/console is "on" by default
+ stackpanel = false, watchpanel = false, toolbar = false }
+debugger.needrefresh = {} -- track components that may need a refresh
+debugger.hostname = ide.config.debugger.hostname or (function()
+ local hostname = socket.dns.gethostname()
+ return hostname and socket.dns.toip(hostname) and hostname or "localhost"
+end)()
+debugger.imglist = ide:CreateImageList("STACK", "VALUE-CALL", "VALUE-LOCAL", "VALUE-UP")
+
+local image = { STACK = 0, LOCAL = 1, UPVALUE = 2 }
+local notebook = ide.frame.notebook
+
+local CURRENT_LINE_MARKER = StylesGetMarker("currentline")
+local CURRENT_LINE_MARKER_VALUE = 2^CURRENT_LINE_MARKER
+local BREAKPOINT_MARKER = StylesGetMarker("breakpoint")
+local BREAKPOINT_MARKER_VALUE = 2^BREAKPOINT_MARKER
+
+local activate = {CHECKONLY = 1, NOREPORT = 2}
+
+local function serialize(value, options) return mobdebug.line(value, options) end
+
+local stackmaxlength = ide.config.debugger.maxdatalength
+local stackmaxnum = ide.config.debugger.maxdatanum
+local stackmaxlevel = ide.config.debugger.maxdatalevel
+local params = {comment = false, nocode = true, maxlevel = stackmaxlevel, maxnum = stackmaxnum}
+
+local function fixUTF8(...)
+ local t = {...}
+ -- convert to escaped decimal code as these can only appear in strings
+ local function fix(s) return '\\'..string.byte(s) end
+ for i = 1, #t do t[i] = FixUTF8(t[i], fix) end
+ return unpack(t)
+end
+
+local function trimToMaxLength(...)
+ local t = {...}
+ for i = 1, #t do
+ t[i] = t[i]:sub(1, stackmaxlength)..(#t[i] > stackmaxlength and '...' or '')
+ end
+ return unpack(t)
+end
+
+local q = EscapeMagic
+
+local function updateWatchesSync(onlyitem)
+ local watchCtrl = debugger.watchCtrl
+ local pane = ide.frame.uimgr:GetPane("watchpanel")
+ local shown = watchCtrl and (pane:IsOk() and pane:IsShown() or not pane:IsOk() and watchCtrl:IsShown())
+ local canupdate = (debugger.server and not debugger.running and not debugger.scratchpad
+ and not (debugger.options or {}).noeval)
+ if shown and canupdate then
+ local bgcl = watchCtrl:GetBackgroundColour()
+ local hicl = wx.wxColour(math.floor(bgcl:Red()*.9),
+ math.floor(bgcl:Green()*.9), math.floor(bgcl:Blue()*.9))
+
+ local root = watchCtrl:GetRootItem()
+ if not root or not root:IsOk() then return end
+
+ local item = onlyitem or watchCtrl:GetFirstChild(root)
+ while true do
+ if not item:IsOk() then break end
+
+ local expression = watchCtrl:GetItemExpression(item)
+ if expression then
+ local _, values, error = debugger.evaluate(expression)
+ local curchildren = watchCtrl:GetItemChildren(item)
+ if error then
+ error = error:gsub("%[.-%]:%d+:%s+","")
+ watchCtrl:SetItemValueIfExpandable(item, nil)
+ else
+ if #values == 0 then values = {'nil'} end
+ local _, res = LoadSafe("return "..values[1])
+ watchCtrl:SetItemValueIfExpandable(item, res)
+ end
+
+ local newval = (expression .. ' = '
+ .. (error and ('error: '..error) or table.concat(values, ", ")))
+ local val = watchCtrl:GetItemText(item)
+
+ watchCtrl:SetItemBackgroundColour(item, val ~= newval and hicl or bgcl)
+ watchCtrl:SetItemText(item, newval)
+
+ if onlyitem or val ~= newval then
+ local newchildren = watchCtrl:GetItemChildren(item)
+ if next(curchildren) ~= nil and next(newchildren) == nil then
+ watchCtrl:SetItemHasChildren(item, true)
+ watchCtrl:CollapseAndReset(item)
+ watchCtrl:SetItemHasChildren(item, false)
+ elseif next(curchildren) ~= nil and next(newchildren) ~= nil then
+ watchCtrl:CollapseAndReset(item)
+ watchCtrl:Expand(item)
+ end
+ end
+ end
+
+ if onlyitem then break end
+ item = watchCtrl:GetNextSibling(item)
+ end
+ elseif not shown and canupdate then
+ debugger.needrefresh.watches = true
+ end
+end
+
+local simpleType = {['nil'] = true, ['string'] = true, ['number'] = true, ['boolean'] = true}
+local callData = {}
+
+local function updateStackSync()
+ local stackCtrl = debugger.stackCtrl
+ local pane = ide.frame.uimgr:GetPane("stackpanel")
+ local shown = stackCtrl and (pane:IsOk() and pane:IsShown() or not pane:IsOk() and stackCtrl:IsShown())
+ local canupdate = debugger.server and not debugger.running and not debugger.scratchpad
+ if shown and canupdate then
+ local stack, _, err = debugger.stack()
+ if not stack or #stack == 0 then
+ stackCtrl:DeleteAll()
+ if err then -- report an error if any
+ stackCtrl:AppendItem(stackCtrl:AddRoot("Stack"), "Error: " .. err, image.STACK)
+ end
+ return
+ end
+ stackCtrl:Freeze()
+ stackCtrl:DeleteAll()
+
+ local root = stackCtrl:AddRoot("Stack")
+ callData = {} -- reset call cache
+ for _,frame in ipairs(stack) do
+ -- "main chunk at line 24"
+ -- "foo() at line 13 (defined at foobar.lua:11)"
+ -- call = { source.name, source.source, source.linedefined,
+ -- source.currentline, source.what, source.namewhat, source.short_src }
+ local call = frame[1]
+
+ -- format the function name to a readable user string
+ local func = call[5] == "main" and "main chunk"
+ or call[5] == "C" and (call[1] or "C function")
+ or call[5] == "tail" and "tail call"
+ or (call[1] or "anonymous function")
+
+ -- format the function treeitem text string, including the function name
+ local text = func ..
+ (call[4] == -1 and '' or " at line "..call[4]) ..
+ (call[5] ~= "main" and call[5] ~= "Lua" and ''
+ or (call[3] > 0 and " (defined at "..call[7]..":"..call[3]..")"
+ or " (defined in "..call[7]..")"))
+
+ -- create the new tree item for this level of the call stack
+ local callitem = stackCtrl:AppendItem(root, text, image.STACK)
+
+ -- register call data to provide stack navigation
+ callData[callitem:GetValue()] = { call[2], call[4] }
+
+ -- add the local variables to the call stack item
+ for name,val in pairs(frame[2]) do
+ -- format the variable name, value as a single line and,
+ -- if not a simple type, the string value.
+
+ -- comment can be not necessarily a string for tables with metatables
+ -- that provide its own __tostring method
+ local value, comment = val[1], fixUTF8(trimToMaxLength(tostring(val[2])))
+ local text = ("%s = %s%s"):
+ format(name, fixUTF8(trimToMaxLength(serialize(value, params))),
+ (simpleType[type(value)] or not val[2]) and "" or (" --[["..comment.."]]"))
+ local item = stackCtrl:AppendItem(callitem, text, image.LOCAL)
+ stackCtrl:SetItemValueIfExpandable(item, value)
+ end
+
+ -- add the upvalues for this call stack level to the tree item
+ for name,val in pairs(frame[3]) do
+ local value, comment = val[1], fixUTF8(trimToMaxLength(tostring(val[2])))
+ local text = ("%s = %s%s"):
+ format(name, fixUTF8(trimToMaxLength(serialize(value, params))),
+ (simpleType[type(value)] or not val[2]) and "" or (" --[["..comment.."]]"))
+ local item = stackCtrl:AppendItem(callitem, text, image.UPVALUE)
+ stackCtrl:SetItemValueIfExpandable(item, value)
+ end
+
+ stackCtrl:SortChildren(callitem)
+ stackCtrl:Expand(callitem)
+ end
+ stackCtrl:EnsureVisible(stackCtrl:GetFirstChild(root))
+ stackCtrl:SetScrollPos(wx.wxHORIZONTAL, 0, true)
+ stackCtrl:Thaw()
+ elseif not shown and canupdate then
+ debugger.needrefresh.stack = true
+ end
+end
+
+local function updateStackAndWatches()
+ -- check if the debugger is running and may be waiting for a response.
+ -- allow that request to finish, otherwise this function does nothing.
+ if debugger.running then debugger.update() end
+ if debugger.server and not debugger.running then
+ copas.addthread(function() updateStackSync() updateWatchesSync() end)
+ end
+end
+
+local function updateWatches(item)
+ -- check if the debugger is running and may be waiting for a response.
+ -- allow that request to finish, otherwise this function does nothing.
+ if debugger.running then debugger.update() end
+ if debugger.server and not debugger.running then
+ copas.addthread(function() updateWatchesSync(item) end)
+ end
+end
+
+local function updateStack()
+ -- check if the debugger is running and may be waiting for a response.
+ -- allow that request to finish, otherwise this function does nothing.
+ if debugger.running then debugger.update() end
+ if debugger.server and not debugger.running then
+ copas.addthread(function() updateStackSync() end)
+ end
+end
+
+local function debuggerToggleViews(show)
+ -- don't toggle if the current state is the same as the new one
+ local shown = debugger.toggleview.shown
+ if (show and shown) or (not show and not shown) then return end
+
+ debugger.toggleview.shown = nil
+
+ local mgr = ide.frame.uimgr
+ local refresh = false
+ for view, needed in pairs(debugger.toggleview) do
+ local bar = view == 'toolbar'
+ local pane = mgr:GetPane(view)
+ if show then -- starting debugging and pane is not shown
+ debugger.toggleview[view] = not pane:IsShown()
+ if debugger.toggleview[view] and (needed or bar)
+ and (not bar or not ide.frame:IsFullScreen()) then
+ pane:Show()
+ refresh = true
+ end
+ else -- completing debugging and pane is shown
+ debugger.toggleview[view] = pane:IsShown() and needed
+ if debugger.toggleview[view] then
+ pane:Hide()
+ refresh = true
+ end
+ end
+ end
+ if refresh then mgr:Update() end
+ if show then debugger.toggleview.shown = true end
+end
+
+local function killClient()
+ if (debugger.pid and wx.wxProcess.Exists(debugger.pid)) then
+ -- using SIGTERM for some reason kills not only the debugee process,
+ -- but also some system processes, which leads to a blue screen crash
+ -- (at least on Windows Vista SP2)
+ local ret = wx.wxProcess.Kill(debugger.pid, wx.wxSIGKILL, wx.wxKILL_CHILDREN)
+ if ret == wx.wxKILL_OK then
+ DisplayOutputLn(TR("Program stopped (pid: %d)."):format(debugger.pid))
+ elseif ret ~= wx.wxKILL_NO_PROCESS then
+ DisplayOutputLn(TR("Unable to stop program (pid: %d), code %d.")
+ :format(debugger.pid, ret))
+ end
+ end
+ debugger.pid = nil
+end
+
+local function activateDocument(file, line, activatehow)
+ if not file then return end
+
+ -- file can be a filename or serialized file content; deserialize first.
+ -- check if the filename starts with '"' and is deserializable
+ -- to avoid showing filenames that may look like valid lua code
+ -- (for example: 'mobdebug.lua').
+ local content
+ if not wx.wxFileName(file):FileExists() and file:find('^"') then
+ local ok, res = LoadSafe("return "..file)
+ if ok then content = res end
+ end
+
+ -- in some cases filename can be returned quoted if the chunk is loaded with
+ -- loadstring(chunk, "filename") instead of loadstring(chunk, "@filename")
+ if content then
+ -- if the returned content can be matched with a file, it's a file name
+ local fname = GetFullPathIfExists(debugger.basedir, content) or content
+ if wx.wxFileName(fname):FileExists() then file, content = fname, nil end
+ elseif not wx.wxIsAbsolutePath(file) and debugger.basedir then
+ file = debugger.basedir .. file
+ end
+
+ local activated
+ local indebugger = file:find('mobdebug%.lua$')
+ local fileName = wx.wxFileName(file)
+
+ for _, document in pairs(ide.openDocuments) do
+ local editor = document.editor
+ -- either the file name matches, or the content;
+ -- when checking for the content remove all newlines as they may be
+ -- reported differently from the original by the Lua engine.
+ if document.filePath and fileName:SameAs(wx.wxFileName(document.filePath))
+ or content and content:gsub("[\n\r]","") == editor:GetTextDyn():gsub("[\n\r]","") then
+ ClearAllCurrentLineMarkers()
+ if line then
+ if line == 0 then -- special case; find the first executable line
+ line = math.huge
+ local func = loadstring(editor:GetTextDyn())
+ if func then -- .activelines == {[3] = true, [4] = true, ...}
+ for l in pairs(debug.getinfo(func, "L").activelines) do
+ if l < line then line = l end
+ end
+ end
+ if line == math.huge then line = 1 end
+ end
+ local line = line - 1 -- editor line operations are zero-based
+ if debugger.runtocursor then
+ local ed, ln = unpack(debugger.runtocursor)
+ if ed:GetId() == editor:GetId() and ln == line then
+ DebuggerToggleBreakpoint(ed, ln)
+ debugger.runtocursor = nil
+ end
+ end
+ editor:MarkerAdd(line, CURRENT_LINE_MARKER)
+ editor:Refresh() -- needed for background markers that don't get refreshed (wx2.9.5)
+
+ -- expand fold if the activated line is in a folded fragment
+ if not editor:GetLineVisible(line) then editor:ToggleFold(editor:GetFoldParent(line)) end
+
+ -- found and marked what we are looking for;
+ -- don't need to activate with CHECKONLY (this assumes line is given)
+ if activatehow == activate.CHECKONLY then return editor end
+
+ local firstline = editor:DocLineFromVisible(editor:GetFirstVisibleLine())
+ local lastline = math.min(editor:GetLineCount(),
+ editor:DocLineFromVisible(editor:GetFirstVisibleLine() + editor:LinesOnScreen()))
+ -- if the line is already on the screen, then don't enforce policy
+ if line <= firstline or line >= lastline then
+ editor:EnsureVisibleEnforcePolicy(line)
+ end
+ end
+
+ local selection = document.index
+ RequestAttention()
+ notebook:SetSelection(selection)
+ SetEditorSelection(selection)
+
+ if content then
+ -- it's possible that the current editor tab already has
+ -- breakpoints that have been set based on its filepath;
+ -- if the content has been matched, then existing breakpoints
+ -- need to be removed and new ones set, based on the content.
+ if not debugger.editormap[editor] and document.filePath then
+ local filePath = document.filePath
+ local line = editor:MarkerNext(0, BREAKPOINT_MARKER_VALUE)
+ while filePath and line ~= -1 do
+ debugger.handle("delb " .. filePath .. " " .. (line+1))
+ debugger.handle("setb " .. file .. " " .. (line+1))
+ line = editor:MarkerNext(line + 1, BREAKPOINT_MARKER_VALUE)
+ end
+ end
+
+ -- keep track of those editors that have been activated based on
+ -- content rather than file names as their breakpoints have to be
+ -- specified in a different way
+ debugger.editormap[editor] = file
+ end
+
+ activated = editor
+ break
+ end
+ end
+
+ if not (activated or indebugger or debugger.loop or activatehow == activate.CHECKONLY)
+ and (ide.config.editor.autoactivate or content and activatehow == activate.NOREPORT) then
+ -- found file, but can't activate yet (because this part may be executed
+ -- in a different coroutine), so schedule pending activation.
+ if content or wx.wxFileName(file):FileExists() then
+ debugger.activate = {file, line, content}
+ return true -- report successful activation, even though it's pending
+ end
+
+ -- only report files once per session and if not asked to skip
+ if not debugger.missing[file] and activatehow ~= activate.NOREPORT then
+ debugger.missing[file] = true
+ DisplayOutputLn(TR("Couldn't activate file '%s' for debugging; continuing without it.")
+ :format(file))
+ end
+ end
+
+ return activated ~= nil
+end
+
+local function reSetBreakpoints()
+ -- remove all breakpoints that may still be present from the last session
+ -- this only matters for those remote clients that reload scripts
+ -- without resetting their breakpoints
+ debugger.handle("delallb")
+
+ -- go over all windows and find all breakpoints
+ if (not debugger.scratchpad) then
+ for _, document in pairs(ide.openDocuments) do
+ local editor = document.editor
+ local filePath = document.filePath
+ local line = editor:MarkerNext(0, BREAKPOINT_MARKER_VALUE)
+ while filePath and line ~= -1 do
+ debugger.handle("setb " .. filePath .. " " .. (line+1))
+ line = editor:MarkerNext(line + 1, BREAKPOINT_MARKER_VALUE)
+ end
+ end
+ end
+end
+
+debugger.shell = function(expression, isstatement)
+ -- check if the debugger is running and may be waiting for a response.
+ -- allow that request to finish, otherwise this function does nothing.
+ if debugger.running then debugger.update() end
+ if debugger.server and not debugger.running
+ and (not debugger.scratchpad or debugger.scratchpad.paused) then
+ copas.addthread(function ()
+ -- exec command is not expected to return anything.
+ -- eval command returns 0 or more results.
+ -- 'values' has a list of serialized results returned.
+ -- as it is not possible to distinguish between 0 results and one
+ -- 'nil' value returned, 'nil' is always returned in this case.
+ -- the first value returned by eval command is not used;
+ -- this may need to be taken into account by other debuggers.
+ local addedret, forceexpression = true, expression:match("^%s*=%s*")
+ expression = expression:gsub("^%s*=%s*","")
+ local _, values, err = debugger.evaluate(expression)
+ if not forceexpression and err then
+ _, values, err = debugger.execute(expression)
+ addedret = false
+ end
+
+ if err then
+ if addedret then err = err:gsub('^%[string "return ', '[string "') end
+ DisplayShellErr(err)
+ elseif addedret or #values > 0 then
+ if forceexpression then -- display elements as multi-line
+ for i,v in pairs(values) do -- stringify each of the returned values
+ local func = loadstring('return '..v) -- deserialize the value first
+ if func then -- if it's deserialized correctly
+ values[i] = (forceexpression and i > 1 and '\n' or '') ..
+ serialize(func(), {nocode = true, comment = 0,
+ -- if '=' is used, then use multi-line serialized output
+ indent = forceexpression and ' ' or nil})
+ end
+ end
+ end
+
+ -- if empty table is returned, then show nil if this was an expression
+ if #values == 0 and (forceexpression or not isstatement) then
+ values = {'nil'}
+ end
+ DisplayShell(unpack(values))
+ end
+
+ -- refresh Stack and Watch windows if executed a statement (and no err)
+ if isstatement and not err and not addedret and #values == 0 then
+ updateStackSync() updateWatchesSync()
+ end
+ end)
+ elseif debugger.server then
+ DisplayShellErr(TR("Can't evaluate the expression while the application is running."))
+ end
+end
+
+local function stoppedAtBreakpoint(file, line)
+ -- if this document can be activated and the current line has a breakpoint
+ local editor = activateDocument(file, line, activate.CHECKONLY)
+ if not editor then return false end
+
+ local current = editor:MarkerNext(0, CURRENT_LINE_MARKER_VALUE)
+ local breakpoint = editor:MarkerNext(current, BREAKPOINT_MARKER_VALUE)
+ return breakpoint > -1 and breakpoint == current
+end
+
+local function mapRemotePath(basedir, file, line, method)
+ if not file then return end
+
+ -- file is /foo/bar/my.lua; basedir is d:\local\path\
+ -- check for d:\local\path\my.lua, d:\local\path\bar\my.lua, ...
+ -- wxwidgets on Windows handles \\ and / as separators, but on OSX
+ -- and Linux it only handles 'native' separator;
+ -- need to translate for GetDirs to work.
+ local file = file:gsub("\\", "/")
+ local parts = wx.wxFileName(file):GetDirs()
+ local name = wx.wxFileName(file):GetFullName()
+
+ -- find the longest remote path that can be mapped locally
+ local longestpath, remotedir
+ while true do
+ local mapped = GetFullPathIfExists(basedir, name)
+ if mapped then
+ longestpath = mapped
+ remotedir = file:gsub(q(name):gsub("/", ".").."$", "")
+ end
+ if #parts == 0 then break end
+ name = table.remove(parts, #parts) .. "/" .. name
+ end
+
+ -- if found a local mapping under basedir
+ local activated = longestpath and activateDocument(longestpath, line, method or activate.NOREPORT)
+ if activated then
+ -- find remote basedir by removing the tail from remote file
+ debugger.handle("basedir " .. debugger.basedir .. "\t" .. remotedir)
+ -- reset breakpoints again as remote basedir has changed
+ reSetBreakpoints()
+ DisplayOutputLn(TR("Mapped remote request for '%s' to '%s'.")
+ :format(remotedir, debugger.basedir))
+
+ return longestpath
+ end
+
+ return nil
+end
+
+debugger.listen = function(start)
+ if start == false then
+ if debugger.listening then
+ debugger.terminate() -- terminate if running
+ copas.removeserver(debugger.listening)
+ DisplayOutputLn(TR("Debugger server stopped at %s:%d.")
+ :format(debugger.hostname, debugger.portnumber))
+ debugger.listening = false
+ else
+ DisplayOutputLn(TR("Can't stop debugger server as it is not started."))
+ end
+ return
+ end
+
+ local server, err = socket.bind("*", debugger.portnumber)
+ if not server then
+ DisplayOutputLn(TR("Can't start debugger server at %s:%d: %s.")
+ :format(debugger.hostname, debugger.portnumber, err or TR("unknown error")))
+ return
+ end
+ DisplayOutputLn(TR("Debugger server started at %s:%d.")
+ :format(debugger.hostname, debugger.portnumber))
+
+ copas.autoclose = false
+ copas.addserver(server, function (skt)
+ -- pull any pending data not processed yet
+ if debugger.running then debugger.update() end
+ if debugger.server then
+ DisplayOutputLn(TR("Refused a request to start a new debugging session as there is one in progress already."))
+ return
+ end
+
+ copas.setErrorHandler(function(error)
+ -- ignore errors that happen because debugging session is
+ -- terminated during handshake (server == nil in this case).
+ if debugger.server then
+ DisplayOutputLn(TR("Can't start debugging session due to internal error '%s'."):format(error))
+ end
+ debugger.terminate()
+ end)
+
+ local options = debugger.options or {}
+ -- this may be a remote call without using an interpreter and as such
+ -- debugger.options may not be set, but runonstart is still configured.
+ if not options.runstart then options.runstart = ide.config.debugger.runonstart end
+
+ -- support allowediting as set in the interpreter or config
+ if not options.allowediting then options.allowediting = ide.config.debugger.allowediting end
+
+ if not debugger.scratchpad and not options.allowediting then
+ SetAllEditorsReadOnly(true)
+ end
+
+ debugger.server = copas.wrap(skt)
+ debugger.socket = skt
+ debugger.loop = false
+ debugger.scratchable = false
+ debugger.stats = {line = 0}
+ debugger.missing = {}
+ debugger.editormap = {}
+ debugger.runtocursor = nil
+
+ local wxfilepath = GetEditorFileAndCurInfo()
+ local startfile = ide:GetProjectStartFile() or options.startwith
+ or (wxfilepath and wxfilepath:GetFullPath())
+
+ if not startfile then
+ DisplayOutputLn(TR("Can't start debugging without an opened file or with the current file not being saved ('%s').")
+ :format(ide.config.default.fullname))
+ return debugger.terminate()
+ end
+
+ local startpath = wx.wxFileName(startfile):GetPath(wx.wxPATH_GET_VOLUME + wx.wxPATH_GET_SEPARATOR)
+ local basedir = options.basedir or FileTreeGetDir() or startpath
+ -- guarantee that the path has a trailing separator
+ debugger.basedir = wx.wxFileName.DirName(basedir):GetFullPath()
+
+ -- load the remote file into the debugger
+ -- set basedir first, before loading to make sure that the path is correct
+ debugger.handle("basedir " .. debugger.basedir)
+
+ local init = options.init or ide.config.debugger.init
+ if init then
+ local _, _, err = debugger.execute(init)
+ if err then DisplayOutputLn(TR("Ignored error in debugger initialization code: %s."):format(err)) end
+ end
+
+ reSetBreakpoints()
+
+ local redirect = ide.config.debugger.redirect or options.redirect
+ if redirect then
+ debugger.handle("output stdout " .. redirect, nil,
+ { handler = function(m)
+ -- if it's an error returned, then handle the error
+ if m and m:find("stack traceback:", 1, true) then
+ -- this is an error message sent remotely
+ local ok, res = LoadSafe("return "..m)
+ if ok then
+ DisplayOutputLn(res)
+ return
+ end
+ end
+
+ if ide.config.debugger.outputfilter then
+ local ok, res = pcall(ide.config.debugger.outputfilter, m)
+ if ok then
+ m = res
+ else
+ DisplayOutputLn("Output filter failed: "..res)
+ return
+ end
+ elseif m then
+ local max = 240
+ m = #m < max+4 and m or m:sub(1,max) .. "...\n"
+ end
+ if m then DisplayOutputNoMarker(m) end
+ end})
+ end
+
+ if (options.startwith) then
+ local file, line, err = debugger.loadfile(options.startwith)
+ if err then
+ DisplayOutputLn(TR("Can't run the entry point script ('%s').")
+ :format(options.startwith)
+ .." "..TR("Compilation error")
+ ..":\n"..err)
+ return debugger.terminate()
+ elseif options.runstart and not debugger.scratchpad then
+ if stoppedAtBreakpoint(file, line) then
+ activateDocument(file, line)
+ options.runstart = false
+ end
+ elseif file and line then
+ DisplayOutputLn(TR("Debugging suspended at '%s:%s' (couldn't activate the file).")
+ :format(file, line))
+ end
+ elseif not (options.run or debugger.scratchpad) then
+ local file, line, err = debugger.loadfile(startfile)
+ -- "load" can work in two ways: (1) it can load the requested file
+ -- OR (2) it can "refuse" to load it if the client was started
+ -- with start() method, which can't load new files
+ -- if file and line are set, this indicates option #2
+ if err then
+ DisplayOutputLn(TR("Can't start debugging for '%s'."):format(startfile)
+ .." "..TR("Compilation error")
+ ..":\n"..err)
+ return debugger.terminate()
+ elseif options.runstart then
+ local file = (mapRemotePath(basedir, file, line or 0, activate.CHECKONLY)
+ or file or startfile)
+
+ if stoppedAtBreakpoint(file, line or 0) then
+ activateDocument(file, line or 0)
+ options.runstart = false
+ end
+ elseif file and line then
+ local activated = activateDocument(file, line, activate.NOREPORT)
+
+ -- if not found, check using full file path and reset basedir
+ if not activated and not wx.wxIsAbsolutePath(file) then
+ activated = activateDocument(startpath..file, line, activate.NOREPORT)
+ if activated then
+ debugger.basedir = startpath
+ debugger.handle("basedir " .. debugger.basedir)
+ -- reset breakpoints again as basedir has changed
+ reSetBreakpoints()
+ end
+ end
+
+ -- if not found and the files doesn't exist, it may be
+ -- a remote call; try to map it to the project folder.
+ -- also check for absolute path as it may need to be remapped
+ -- when autoactivation is disabled.
+ if not activated and (not wx.wxFileName(file):FileExists()
+ or wx.wxIsAbsolutePath(file)) then
+ if mapRemotePath(basedir, file, line, activate.NOREPORT) then
+ activated = true
+ end
+ end
+
+ if not activated then
+ DisplayOutputLn(TR("Debugging suspended at '%s:%s' (couldn't activate the file).")
+ :format(file, line))
+ end
+
+ -- debugger may still be available for scratchpad,
+ -- if the interpreter signals scratchpad support, so enable it.
+ debugger.scratchable = ide.interpreter.scratchextloop ~= nil
+ else
+ debugger.scratchable = true
+ local activated = activateDocument(startfile, 0) -- find the appropriate line
+ if not activated then
+ DisplayOutputLn(TR("Debugging suspended at '%s:%s' (couldn't activate the file).")
+ :format(startfile, '?'))
+ end
+ end
+ end
+
+ if (not options.noshell and not debugger.scratchpad) then
+ ShellSupportRemote(debugger.shell)
+ end
+
+ debuggerToggleViews(true)
+ updateStackSync()
+ updateWatchesSync()
+
+ DisplayOutputLn(TR("Debugging session started in '%s'."):format(debugger.basedir))
+
+ if (debugger.scratchpad) then
+ debugger.scratchpad.updated = true
+ else
+ if (options.runstart) then
+ ClearAllCurrentLineMarkers()
+ debugger.run()
+ end
+ if (options.run) then
+ local file, line = debugger.handle("run")
+ activateDocument(file, line)
+ end
+ end
+
+ -- request attention if the debugging is stopped
+ if not debugger.running then RequestAttention() end
+ -- refresh toolbar and menus in case the main app is not active
+ ide:GetMainFrame():UpdateWindowUI(wx.wxUPDATE_UI_FROMIDLE)
+ ide:GetToolBar():UpdateWindowUI(wx.wxUPDATE_UI_FROMIDLE)
+ end)
+ debugger.listening = server
+end
+
+local function nameOutputTab(name)
+ local nbk = ide.frame.bottomnotebook
+ local index = nbk:GetPageIndex(ide:GetOutput())
+ if index ~= -1 then nbk:SetPageText(index, name) end
+end
+
+debugger.handle = function(command, server, options)
+ local verbose = ide.config.debugger.verbose
+ local gprint = _G.print
+ _G.print = function (...) if verbose then DisplayOutputLn(...) end end
+
+ nameOutputTab(TR("Output (running)"))
+ debugger.running = true
+ if verbose then DisplayOutputLn("Debugger sent (command):", command) end
+ local file, line, err = mobdebug.handle(command, server or debugger.server, options)
+ if verbose then DisplayOutputLn("Debugger received (file, line, err):", file, line, err) end
+ debugger.running = false
+ -- only set suspended if the debugging hasn't been terminated
+ if debugger.server then nameOutputTab(TR("Output (suspended)")) end
+
+ _G.print = gprint
+ return file, line, err
+end
+
+debugger.exec = function(command, func)
+ if debugger.server and not debugger.running then
+ copas.addthread(function ()
+ -- execute a custom function (if any) in the context of this thread
+ if type(func) == 'function' then func() end
+ local out
+ local attempts = 0
+ while true do
+ -- clear markers before running the command
+ -- don't clear if running trace as the marker is then invisible,
+ -- and it needs to be visible during tracing
+ if not debugger.loop then ClearAllCurrentLineMarkers() end
+ debugger.breaking = false
+ local file, line, err = debugger.handle(out or command)
+ if out then out = nil end
+ if line == nil then
+ if err then DisplayOutputLn(err) end
+ DebuggerStop()
+ return
+ elseif not debugger.server then
+ -- it is possible that while debugger.handle call was executing
+ -- the debugging was terminated; simply return in this case.
+ return
+ else
+ if activateDocument(file, line) then
+ debugger.stats.line = debugger.stats.line + 1
+ if debugger.loop then
+ updateStackSync()
+ updateWatchesSync()
+ else
+ updateStackAndWatches()
+ return
+ end
+ else
+ -- clear the marker as it wasn't cleared earlier
+ if debugger.loop then ClearAllCurrentLineMarkers() end
+ -- we may be in some unknown location at this point;
+ -- If this happens, stop and report allowing users to set
+ -- breakpoints and step through.
+ if debugger.breaking then
+ DisplayOutputLn(TR("Debugging suspended at '%s:%s' (couldn't activate the file).")
+ :format(file, line))
+ updateStackAndWatches()
+ return
+ end
+ -- redo now; if the call is from the debugger, then repeat
+ -- the same command, except when it was "run" (switch to 'step');
+ -- this is needed to "break" execution that happens in on() call.
+ -- in all other cases get out of this file.
+ -- don't get out of "mobdebug", because it may happen with
+ -- start() or on() call, which will get us out of the current
+ -- file, which is not what we want.
+ -- Some engines (Corona SDK) report =?:0 as the current location.
+ -- repeat the same command, but check if this has been tried
+ -- too many times already; if so, get "out"
+ out = ((tonumber(line) == 0 and attempts < 10) and command
+ or (file:find('mobdebug%.lua$')
+ and (command == 'run' and 'step' or command) or "out"))
+ attempts = attempts + 1
+ end
+ end
+ end
+ end)
+ end
+end
+
+debugger.handleAsync = function(command)
+ if debugger.server and not debugger.running then
+ copas.addthread(function () debugger.handle(command) end)
+ end
+end
+debugger.handleDirect = function(command)
+ local sock = debugger.socket
+ if debugger.server and sock then
+ local running = debugger.running
+ -- this needs to be short as it will block the UI
+ sock:settimeout(0.25)
+ debugger.handle(command, sock)
+ sock:settimeout(0)
+ -- restore running status
+ debugger.running = running
+ end
+end
+
+debugger.loadfile = function(file)
+ local f, l, err = debugger.handle("load " .. file)
+ if not f and wx.wxFileExists(file) and err and err:find("Cannot open file") then
+ local content = FileRead(file)
+ if content then return debugger.loadstring(file, content) end
+ end
+ return f, l, err
+end
+debugger.loadstring = function(file, string)
+ return debugger.handle("loadstring '" .. file .. "' " .. string)
+end
+
+do
+ local nextupdatedelta = 0.250
+ local nextupdate = TimeGet() + nextupdatedelta
+ local function forceUpdateOnWrap(editor)
+ -- http://www.scintilla.org/ScintillaDoc.html#LineWrapping
+ -- Scintilla doesn't perform wrapping immediately after a content change
+ -- for performance reasons, so the activation calculations can be wrong
+ -- if there is wrapping that pushes the current line out of the screen.
+ -- force editor update that performs wrapping recalculation.
+ if ide.config.editor.usewrap then editor:Update(); editor:Refresh() end
+ end
+ debugger.update = function()
+ if debugger.server or debugger.listening and TimeGet() > nextupdate then
+ copas.step(0)
+ nextupdate = TimeGet() + nextupdatedelta
+ end
+
+ -- if there is any pending activation
+ if debugger.activate then
+ local file, line, content = unpack(debugger.activate)
+ debugger.activate = nil
+ if content then
+ local editor = NewFile()
+ editor:SetTextDyn(content)
+ if not ide.config.debugger.allowediting
+ and not (debugger.options or {}).allowediting then
+ editor:SetReadOnly(true)
+ end
+ forceUpdateOnWrap(editor)
+ activateDocument(file, line)
+ else
+ local editor = LoadFile(file)
+ if editor then
+ forceUpdateOnWrap(editor)
+ activateDocument(file, line)
+ end
+ end
+ end
+ end
+end
+
+local function isemptyline(editor, line)
+ local text = editor:GetLineDyn(line-1)
+ return not text:find("%S")
+ or (text:find("^%s*%-%-") ~= nil and text:find("^%s*%-%-%[=*%[") == nil)
+end
+
+debugger.terminate = function()
+ if debugger.server then
+ if debugger.pid then -- if there is PID, try local kill
+ killClient()
+ else -- otherwise, try graceful exit for the remote process
+ debugger.breaknow("exit")
+ end
+ DebuggerStop()
+ end
+end
+debugger.step = function() debugger.exec("step") end
+debugger.trace = function()
+ debugger.loop = true
+ debugger.exec("step")
+end
+debugger.runto = function(editor, line)
+ -- check if the location is valid for a breakpoint
+ if isemptyline(editor, line+1) then return end
+
+ local ed, ln = unpack(debugger.runtocursor or {})
+ local same = ed and ln and ed:GetId() == editor:GetId() and ln == line
+
+ -- check if there is already a breakpoint in the "run to" location;
+ -- if so, don't mark the location as "run to" as it will stop there anyway
+ if bit.band(editor:MarkerGet(line), BREAKPOINT_MARKER_VALUE) > 0
+ and not same then
+ debugger.runtocursor = nil
+ debugger.run()
+ return
+ end
+
+ -- save the location of the breakpoint
+ debugger.runtocursor = {editor, line}
+ -- set breakpoint and execute run
+ debugger.exec("run", function()
+ -- if run-to-cursor location is already set, then remove the breakpoint,
+ -- but only if this location is different
+ if ed and ln and not same then
+ DebuggerToggleBreakpoint(ed, ln)
+ debugger.wait()
+ end
+ if not same then
+ DebuggerToggleBreakpoint(editor, line)
+ debugger.wait()
+ end
+ end)
+end
+debugger.wait = function()
+ -- wait for all results to come back
+ while debugger.running do debugger.update() end
+end
+debugger.over = function() debugger.exec("over") end
+debugger.out = function() debugger.exec("out") end
+debugger.run = function() debugger.exec("run") end
+debugger.detach = function()
+ if debugger.running then
+ debugger.handleDirect("done")
+ debugger.server = nil
+ else
+ debugger.exec("done")
+ end
+end
+debugger.evaluate = function(expression) return debugger.handle('eval ' .. expression) end
+debugger.execute = function(expression) return debugger.handle('exec ' .. expression) end
+debugger.stack = function() return debugger.handle('stack') end
+debugger.breaknow = function(command)
+ -- stop if we're running a "trace" command
+ debugger.loop = false
+
+ -- force suspend command; don't use copas interface as it checks
+ -- for the other side "reading" and the other side is not reading anything.
+ -- use the "original" socket to send "suspend" command.
+ -- this will only break on the next Lua command.
+ if debugger.socket then
+ local running = debugger.running
+ -- this needs to be short as it will block the UI
+ debugger.socket:settimeout(0.25)
+ local file, line, err = debugger.handle(command or "suspend", debugger.socket)
+ debugger.socket:settimeout(0)
+ -- restore running status
+ debugger.running = running
+ debugger.breaking = true
+ -- don't need to do anything else as the earlier call (run, step, etc.)
+ -- will get the results (file, line) back and will update the UI
+ return file, line, err
+ end
+end
+debugger.breakpoint = function(file, line, state)
+ if debugger.running then
+ return debugger.handleDirect((state and "asetb " or "adelb ") .. file .. " " .. line)
+ end
+ return debugger.handleAsync((state and "setb " or "delb ") .. file .. " " .. line)
+end
+debugger.quickeval = function(var, callback)
+ if debugger.server and not debugger.running
+ and not debugger.scratchpad and not (debugger.options or {}).noeval then
+ copas.addthread(function ()
+ local _, values, err = debugger.evaluate(var)
+ local val = err
+ and err:gsub("%[.-%]:%d+:%s*","error: ")
+ or (var .. " = " .. (#values > 0 and values[1] or 'nil'))
+ if callback then callback(val) end
+ end)
+ end
+end
+
+local width, height = 360, 200
+
+local keyword = {}
+for _,k in ipairs({'and', 'break', 'do', 'else', 'elseif', 'end', 'false',
+ 'for', 'function', 'goto', 'if', 'in', 'local', 'nil', 'not', 'or', 'repeat',
+ 'return', 'then', 'true', 'until', 'while'}) do keyword[k] = true end
+
+local function stringifyKeyIntoPrefix(name, num)
+ return (type(name) == "number"
+ and (num and num == name and '' or ("[%s] = "):format(name))
+ or type(name) == "string" and (name:match("^[%l%u_][%w_]*$") and not keyword[name]
+ and ("%s = "):format(name)
+ or ("[%q] = "):format(name))
+ or ("[%s] = "):format(tostring(name)))
+end
+
+local function debuggerCreateStackWindow()
+ local stackCtrl = wx.wxTreeCtrl(ide.frame, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxSize(width, height),
+ wx.wxTR_LINES_AT_ROOT + wx.wxTR_HAS_BUTTONS + wx.wxTR_SINGLE
+ + wx.wxTR_HIDE_ROOT + wx.wxNO_BORDER)
+
+ debugger.stackCtrl = stackCtrl
+
+ stackCtrl:SetImageList(debugger.imglist)
+
+ local valuecache = {}
+ function stackCtrl:SetItemValueIfExpandable(item, value)
+ local expandable = type(value) == 'table' and next(value) ~= nil
+ if expandable then -- cache table value to expand when requested
+ valuecache[item:GetValue()] = value
+ end
+ self:SetItemHasChildren(item, expandable)
+ end
+
+ function stackCtrl:DeleteAll()
+ self:DeleteAllItems()
+ valuecache = {}
+ end
+
+ function stackCtrl:GetItemChildren(item)
+ return valuecache[item:GetValue()] or {}
+ end
+
+ stackCtrl:Connect(wx.wxEVT_COMMAND_TREE_ITEM_EXPANDING,
+ function (event)
+ local item_id = event:GetItem()
+ local count = stackCtrl:GetChildrenCount(item_id, false)
+ if count > 0 then return true end
+
+ local image = stackCtrl:GetItemImage(item_id)
+ local num = 1
+ for name,value in pairs(stackCtrl:GetItemChildren(item_id)) do
+ local strval = fixUTF8(trimToMaxLength(serialize(value, params)))
+ local text = stringifyKeyIntoPrefix(name, num)..strval
+ local item = stackCtrl:AppendItem(item_id, text, image)
+ stackCtrl:SetItemValueIfExpandable(item, value)
+
+ num = num + 1
+ if num > stackmaxnum then break end
+ end
+ return true
+ end)
+
+ stackCtrl:Connect(wx.wxEVT_SET_FOCUS, function(event)
+ if debugger.needrefresh.stack then
+ updateStack()
+ debugger.needrefresh.stack = false
+ end
+ end)
+
+ -- register navigation callback
+ stackCtrl:Connect(wx.wxEVT_LEFT_DCLICK, function (event)
+ local item_id = stackCtrl:HitTest(event:GetPosition())
+ if not item_id or not item_id:IsOk() then event:Skip() return end
+
+ local coords = callData[item_id:GetValue()]
+ if not coords then event:Skip() return end
+
+ local file, line = coords[1], coords[2]
+ if file:match("@") then file = string.sub(file, 2) end
+ file = GetFullPathIfExists(debugger.basedir, file)
+ if file then
+ local editor = LoadFile(file,nil,true)
+ editor:SetFocus()
+ if line then editor:GotoLine(line-1) end
+ end
+ end)
+
+ local layout = ide:GetSetting("/view", "uimgrlayout")
+ if layout and not layout:find("stackpanel") then
+ ide:AddPanelDocked(ide.frame.bottomnotebook, stackCtrl, "stackpanel", TR("Stack"))
+ else
+ ide:AddPanel(stackCtrl, "stackpanel", TR("Stack"))
+ end
+end
+
+local function debuggerCreateWatchWindow()
+ local watchCtrl = wx.wxTreeCtrl(ide.frame, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxSize(width, height),
+ wx.wxTR_LINES_AT_ROOT + wx.wxTR_HAS_BUTTONS + wx.wxTR_SINGLE
+ + wx.wxTR_HIDE_ROOT + wx.wxTR_EDIT_LABELS + wx.wxNO_BORDER)
+
+ debugger.watchCtrl = watchCtrl
+
+ local root = watchCtrl:AddRoot("Watch")
+ watchCtrl:SetImageList(debugger.imglist)
+
+ local defaultExpr = "watch expression"
+ local expressions = {} -- table to keep track of expressions
+
+ function watchCtrl:SetItemExpression(item, expr, value)
+ expressions[item:GetValue()] = expr
+ self:SetItemText(item, expr .. ' = ' .. (value or '?'))
+ self:SelectItem(item, true)
+ if not value then updateWatches(item) end
+ end
+
+ function watchCtrl:GetItemExpression(item)
+ return expressions[item:GetValue()]
+ end
+
+ local names = {}
+ function watchCtrl:SetItemName(item, name)
+ local nametype = type(name)
+ names[item:GetValue()] = (
+ (nametype == 'string' or nametype == 'number' or nametype == 'boolean')
+ and name or nil
+ )
+ end
+
+ function watchCtrl:GetItemName(item)
+ return names[item:GetValue()]
+ end
+
+ local valuecache = {}
+ function watchCtrl:SetItemValueIfExpandable(item, value)
+ local expandable = type(value) == 'table' and next(value) ~= nil
+ valuecache[item:GetValue()] = expandable and value or nil
+ self:SetItemHasChildren(item, expandable)
+ end
+
+ function watchCtrl:GetItemChildren(item)
+ return valuecache[item:GetValue()] or {}
+ end
+
+ function watchCtrl:IsWatch(item)
+ return item:IsOk() and watchCtrl:GetItemParent(item):GetValue() == root:GetValue()
+ end
+
+ function watchCtrl:IsEditable(item)
+ return (item and item:IsOk()
+ and (watchCtrl:IsWatch(item) or watchCtrl:GetItemName(item) ~= nil))
+ end
+
+ function watchCtrl:GetItemFullExpression(item)
+ local expr = ''
+ while true do
+ local name = watchCtrl:GetItemName(item)
+ expr = (watchCtrl:IsWatch(item)
+ and ('({%s})[1]'):format(watchCtrl:GetItemExpression(item))
+ or (type(name) == 'string' and '[%q]' or '[%s]'):format(tostring(name))
+ )..expr
+ if watchCtrl:IsWatch(item) then break end
+ item = watchCtrl:GetItemParent(item)
+ if not item:IsOk() then break end
+ end
+ return expr, item:IsOk() and item or nil
+ end
+
+ function watchCtrl:CopyItemValue(item)
+ local expr = self:GetItemFullExpression(item)
+
+ if debugger.running then debugger.update() end
+ if debugger.server and not debugger.running
+ and (not debugger.scratchpad or debugger.scratchpad.paused) then
+ copas.addthread(function ()
+ local _, values, error = debugger.evaluate(expr)
+ ide:CopyToClipboard(error and error:gsub("%[.-%]:%d+:%s+","")
+ or (#values == 0 and 'nil' or values[1]))
+ end)
+ end
+ end
+
+ function watchCtrl:UpdateItemValue(item, value)
+ local expr, itemupd = self:GetItemFullExpression(item)
+
+ if debugger.running then debugger.update() end
+ if debugger.server and not debugger.running
+ and (not debugger.scratchpad or debugger.scratchpad.paused) then
+ copas.addthread(function ()
+ local _, _, err = debugger.execute(expr..'='..value)
+ if err then
+ watchCtrl:SetItemText(item, 'error: '..err:gsub("%[.-%]:%d+:%s+",""))
+ elseif itemupd then
+ updateWatchesSync(itemupd)
+ end
+ updateStackSync()
+ end)
+ end
+ end
+
+ watchCtrl:Connect(wx.wxEVT_COMMAND_TREE_ITEM_EXPANDING,
+ function (event)
+ local item_id = event:GetItem()
+ local count = watchCtrl:GetChildrenCount(item_id, false)
+ if count > 0 then return true end
+
+ local image = watchCtrl:GetItemImage(item_id)
+ local num = 1
+ for name,value in pairs(watchCtrl:GetItemChildren(item_id)) do
+ local strval = fixUTF8(trimToMaxLength(serialize(value, params)))
+ local text = stringifyKeyIntoPrefix(name, num)..strval
+ local item = watchCtrl:AppendItem(item_id, text, image)
+ watchCtrl:SetItemValueIfExpandable(item, value)
+ watchCtrl:SetItemName(item, name)
+
+ num = num + 1
+ if num > stackmaxnum then break end
+ end
+ return true
+ end)
+
+ watchCtrl:Connect(wx.wxEVT_COMMAND_TREE_DELETE_ITEM,
+ function (event)
+ local value = event:GetItem():GetValue()
+ expressions[value] = nil
+ valuecache[value] = nil
+ names[value] = nil
+ end)
+
+ watchCtrl:Connect(wx.wxEVT_SET_FOCUS, function(event)
+ if debugger.needrefresh.watches then
+ updateWatches()
+ debugger.needrefresh.watches = false
+ end
+ end)
+
+
+ local item
+ -- wx.wxEVT_CONTEXT_MENU is only triggered over tree items on OSX,
+ -- but it needs to be also triggered below any item to add a watch,
+ -- so use RIGHT_DOWN instead
+ watchCtrl:Connect(wx.wxEVT_RIGHT_DOWN,
+ function (event)
+ -- store the item to be used in edit/delete actions
+ item = watchCtrl:HitTest(watchCtrl:ScreenToClient(wx.wxGetMousePosition()))
+ local editlabel = watchCtrl:IsWatch(item) and TR("&Edit Watch") or TR("&Edit Value")
+ local menu = wx.wxMenu {
+ { ID_ADDWATCH, TR("&Add Watch")..KSC(ID_ADDWATCH) },
+ { ID_EDITWATCH, editlabel..KSC(ID_EDITWATCH) },
+ { ID_DELETEWATCH, TR("&Delete Watch")..KSC(ID_DELETEWATCH) },
+ { ID_COPYWATCHVALUE, TR("&Copy Value")..KSC(ID_COPYWATCHVALUE) },
+ }
+ PackageEventHandle("onMenuWatch", menu, watchCtrl, event)
+ watchCtrl:PopupMenu(menu)
+ item = nil
+ end)
+
+ watchCtrl:Connect(ID_ADDWATCH, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event) watchCtrl:EditLabel(watchCtrl:AppendItem(root, defaultExpr, image.LOCAL)) end)
+
+ watchCtrl:Connect(ID_EDITWATCH, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event) watchCtrl:EditLabel(item or watchCtrl:GetSelection()) end)
+ watchCtrl:Connect(ID_EDITWATCH, wx.wxEVT_UPDATE_UI,
+ function (event) event:Enable(watchCtrl:IsEditable(item or watchCtrl:GetSelection())) end)
+
+ watchCtrl:Connect(ID_DELETEWATCH, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event) watchCtrl:Delete(item or watchCtrl:GetSelection()) end)
+ watchCtrl:Connect(ID_DELETEWATCH, wx.wxEVT_UPDATE_UI,
+ function (event) event:Enable(watchCtrl:IsWatch(item or watchCtrl:GetSelection())) end)
+
+ watchCtrl:Connect(ID_COPYWATCHVALUE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event) watchCtrl:CopyItemValue(item or watchCtrl:GetSelection()) end)
+ watchCtrl:Connect(ID_COPYWATCHVALUE, wx.wxEVT_UPDATE_UI, function (event)
+ -- allow copying only when the debugger is available
+ event:Enable(item:IsOk() and debugger.server and not debugger.running
+ and (not debugger.scratchpad or debugger.scratchpad.paused))
+ end)
+
+ local label
+ watchCtrl:Connect(wx.wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT,
+ function (event)
+ local item = event:GetItem()
+ if not (item:IsOk() and watchCtrl:IsEditable(item)) then
+ event:Veto()
+ return
+ end
+
+ label = watchCtrl:GetItemText(item)
+
+ if watchCtrl:IsWatch(item) then
+ local expr = watchCtrl:GetItemExpression(item)
+ if expr then watchCtrl:SetItemText(item, expr) end
+ else
+ local prefix = stringifyKeyIntoPrefix(watchCtrl:GetItemName(item))
+ local val = watchCtrl:GetItemText(item):gsub(q(prefix),'')
+ watchCtrl:SetItemText(item, val)
+ end
+ end)
+ watchCtrl:Connect(wx.wxEVT_COMMAND_TREE_END_LABEL_EDIT,
+ function (event)
+ event:Veto()
+
+ local item = event:GetItem()
+ if event:IsEditCancelled() then
+ if watchCtrl:GetItemText(item) == defaultExpr then
+ -- when Delete is called from END_EDIT, it causes infinite loop
+ -- on OSX (wxwidgets 2.9.5) as Delete calls END_EDIT again.
+ -- disable handlers during Delete and then enable back.
+ watchCtrl:SetEvtHandlerEnabled(false)
+ watchCtrl:Delete(item)
+ watchCtrl:SetEvtHandlerEnabled(true)
+ else
+ watchCtrl:SetItemText(item, label)
+ end
+ else
+ if watchCtrl:IsWatch(item) then
+ watchCtrl:SetItemExpression(item, event:GetLabel())
+ else
+ watchCtrl:UpdateItemValue(item, event:GetLabel())
+ end
+ end
+ event:Skip()
+ end)
+
+ local layout = ide:GetSetting("/view", "uimgrlayout")
+ if layout and not layout:find("watchpanel") then
+ ide:AddPanelDocked(ide.frame.bottomnotebook, watchCtrl, "watchpanel", TR("Watch"))
+ else
+ ide:AddPanel(watchCtrl, "watchpanel", TR("Watch"))
+ end
+end
+
+debuggerCreateStackWindow()
+debuggerCreateWatchWindow()
+
+----------------------------------------------
+-- public api
+
+DebuggerRefreshPanels = updateStackAndWatches
+
+function DebuggerAttachDefault(options)
+ debugger.options = options
+ if (debugger.listening) then return end
+ debugger.listen()
+end
+
+function DebuggerShutdown()
+ if debugger.server then debugger.terminate() end
+ if debugger.pid then killClient() end
+end
+
+function DebuggerStop(resetpid)
+ if (debugger.server) then
+ debugger.server = nil
+ SetAllEditorsReadOnly(false)
+ ShellSupportRemote(nil)
+ ClearAllCurrentLineMarkers()
+ DebuggerScratchpadOff()
+ debuggerToggleViews(false)
+ local lines = TR("traced %d instruction", debugger.stats.line):format(debugger.stats.line)
+ DisplayOutputLn(TR("Debugging session completed (%s)."):format(lines))
+ nameOutputTab(debugger.pid and TR("Output (running)") or TR("Output"))
+ if debugger.runtocursor then
+ local ed, ln = unpack(debugger.runtocursor)
+ DebuggerToggleBreakpoint(ed, ln)
+ end
+ else
+ -- it's possible that the application couldn't start, or that the
+ -- debugger in the application didn't start, which means there is
+ -- no debugger.server, but scratchpad may still be on. Turn it off.
+ DebuggerScratchpadOff()
+ end
+ -- reset pid for "running" (not debugged) processes
+ if resetpid then debugger.pid = nil end
+end
+
+local function debuggerMakeFileName(editor)
+ return ide:GetDocument(editor):GetFilePath()
+ or ide:GetDocument(editor):GetFileName()
+ or ide.config.default.fullname
+end
+
+function DebuggerToggleBreakpoint(editor, line, value)
+ local isset = bit.band(editor:MarkerGet(line), BREAKPOINT_MARKER_VALUE) > 0
+ if value ~= nil and isset == value then return end
+ local filePath = debugger.editormap and debugger.editormap[editor]
+ or debuggerMakeFileName(editor)
+ if isset then
+ -- if there is pending "run-to-cursor" call at this location, remove it
+ local ed, ln = unpack(debugger.runtocursor or {})
+ local same = ed and ln and ed:GetId() == editor:GetId() and ln == line
+ if same then debugger.runtocursor = nil end
+
+ editor:MarkerDelete(line, BREAKPOINT_MARKER)
+ if debugger.server then debugger.breakpoint(filePath, line+1, false) end
+ else
+ if isemptyline(editor, line+1) then return end
+
+ editor:MarkerAdd(line, BREAKPOINT_MARKER)
+ if debugger.server then debugger.breakpoint(filePath, line+1, true) end
+ end
+ PackageEventHandle("onEditorMarkerUpdate", editor, BREAKPOINT_MARKER, line+1, not isset)
+end
+
+-- scratchpad functions
+
+function DebuggerRefreshScratchpad()
+ if debugger.scratchpad and debugger.scratchpad.updated and not debugger.scratchpad.paused then
+
+ local scratchpadEditor = debugger.scratchpad.editor
+ if scratchpadEditor.spec.apitype
+ and scratchpadEditor.spec.apitype == "lua"
+ and not ide.interpreter.skipcompile
+ and not CompileProgram(scratchpadEditor, { jumponerror = false, reportstats = false })
+ then return end
+
+ local code = StripShebang(scratchpadEditor:GetTextDyn())
+ if debugger.scratchpad.running then
+ -- break the current execution first
+ -- don't try too frequently to avoid overwhelming the debugger
+ local now = TimeGet()
+ if now - debugger.scratchpad.running > 0.250 then
+ debugger.breaknow()
+ debugger.scratchpad.running = now
+ end
+ else
+ local clear = ide:GetMenuBar():IsChecked(ID_CLEAROUTPUT)
+ local filePath = debuggerMakeFileName(scratchpadEditor)
+
+ -- wrap into a function call to make "return" to work with scratchpad
+ code = "(function()"..code.."\nend)()"
+
+ -- this is a special error message that is generated at the very end
+ -- of each script to avoid exiting the (debugee) scratchpad process.
+ -- these errors are handled and not reported to the user
+ local errormsg = 'execution suspended at ' .. TimeGet()
+ local stopper = "error('" .. errormsg .. "')"
+ -- store if interpreter requires a special handling for external loop
+ local extloop = ide.interpreter.scratchextloop
+
+ local function reloadScratchpadCode()
+ debugger.scratchpad.running = TimeGet()
+ debugger.scratchpad.updated = false
+ debugger.scratchpad.runs = (debugger.scratchpad.runs or 0) + 1
+
+ if clear then ClearOutput(true) end
+
+ -- the code can be running in two ways under scratchpad:
+ -- 1. controlled by the application, requires stopper (most apps)
+ -- 2. controlled by some external loop (for example, love2d).
+ -- in the first case we need to reload the app after each change
+ -- in the second case, we need to load the app once and then
+ -- "execute" new code to reflect the changes (with some limitations).
+ local _, _, err
+ if extloop then -- if the execution is controlled by an external loop
+ if debugger.scratchpad.runs == 1
+ then _, _, err = debugger.loadstring(filePath, code)
+ else _, _, err = debugger.execute(code) end
+ else _, _, err = debugger.loadstring(filePath, code .. stopper) end
+
+ -- when execute() is used, it's not possible to distinguish between
+ -- compilation and run-time error, so just report as "Scratchpad error"
+ local prefix = extloop and TR("Scratchpad error") or TR("Compilation error")
+
+ if not err then
+ _, _, err = debugger.handle("run")
+ prefix = TR("Execution error")
+ end
+ if err and not err:find(errormsg) then
+ local fragment, line = err:match('.-%[string "([^\010\013]+)"%]:(%d+)%s*:')
+ -- make the code shorter to better see the error message
+ if prefix == TR("Scratchpad error") and fragment and #fragment > 30 then
+ err = err:gsub(q(fragment), function(s) return s:sub(1,30)..'...' end)
+ end
+ DisplayOutputLn(prefix
+ ..(line and (" "..TR("on line %d"):format(line)) or "")
+ ..":\n"..err:gsub('stack traceback:.+', ''):gsub('\n+$', ''))
+ end
+ debugger.scratchpad.running = false
+ end
+
+ copas.addthread(reloadScratchpadCode)
+ end
+ end
+end
+
+local numberStyle = wxstc.wxSTC_LUA_NUMBER
+
+function DebuggerScratchpadOn(editor)
+ -- first check if there is already scratchpad editor.
+ -- this may happen when more than one editor is being added...
+
+ if debugger.scratchpad and debugger.scratchpad.editors then
+ debugger.scratchpad.editors[editor] = true
+ else
+ debugger.scratchpad = {editor = editor, editors = {[editor] = true}}
+
+ -- check if the debugger is already running; this happens when
+ -- scratchpad is turned on after external script has connected
+ if debugger.server then
+ debugger.scratchpad.updated = true
+ ClearAllCurrentLineMarkers()
+ SetAllEditorsReadOnly(false)
+ ShellSupportRemote(nil) -- disable remote shell
+ DebuggerRefreshScratchpad()
+ elseif not ProjectDebug(true, "scratchpad") then
+ debugger.scratchpad = nil
+ return
+ end
+ end
+
+ local scratchpadEditor = editor
+ scratchpadEditor:StyleSetUnderline(numberStyle, true)
+ debugger.scratchpad.margin = scratchpadEditor:GetMarginWidth(0) +
+ scratchpadEditor:GetMarginWidth(1) + scratchpadEditor:GetMarginWidth(2)
+
+ scratchpadEditor:Connect(wxstc.wxEVT_STC_MODIFIED, function(event)
+ local evtype = event:GetModificationType()
+ if (bit.band(evtype,wxstc.wxSTC_MOD_INSERTTEXT) ~= 0 or
+ bit.band(evtype,wxstc.wxSTC_MOD_DELETETEXT) ~= 0 or
+ bit.band(evtype,wxstc.wxSTC_PERFORMED_UNDO) ~= 0 or
+ bit.band(evtype,wxstc.wxSTC_PERFORMED_REDO) ~= 0) then
+ debugger.scratchpad.updated = true
+ debugger.scratchpad.editor = scratchpadEditor
+ end
+ event:Skip()
+ end)
+
+ scratchpadEditor:Connect(wx.wxEVT_LEFT_DOWN, function(event)
+ local scratchpad = debugger.scratchpad
+
+ local point = event:GetPosition()
+ local pos = scratchpadEditor:PositionFromPoint(point)
+
+ -- are we over a number in the scratchpad? if not, it's not our event
+ if ((not scratchpad) or
+ (bit.band(scratchpadEditor:GetStyleAt(pos),31) ~= numberStyle)) then
+ event:Skip()
+ return
+ end
+
+ -- find start position and length of the number
+ local text = scratchpadEditor:GetTextDyn()
+
+ local nstart = pos
+ while nstart >= 0
+ and (bit.band(scratchpadEditor:GetStyleAt(nstart),31) == numberStyle)
+ do nstart = nstart - 1 end
+
+ local nend = pos
+ while nend < string.len(text)
+ and (bit.band(scratchpadEditor:GetStyleAt(nend),31) == numberStyle)
+ do nend = nend + 1 end
+
+ -- check if there is minus sign right before the number and include it
+ if nstart >= 0 and scratchpadEditor:GetTextRangeDyn(nstart,nstart+1) == '-' then
+ nstart = nstart - 1
+ end
+ scratchpad.start = nstart + 1
+ scratchpad.length = nend - nstart - 1
+ scratchpad.origin = scratchpadEditor:GetTextRangeDyn(nstart+1,nend)
+ if tonumber(scratchpad.origin) then
+ scratchpad.point = point
+ scratchpadEditor:BeginUndoAction()
+ scratchpadEditor:CaptureMouse()
+ end
+ end)
+
+ scratchpadEditor:Connect(wx.wxEVT_LEFT_UP, function(event)
+ if debugger.scratchpad and debugger.scratchpad.point then
+ debugger.scratchpad.point = nil
+ scratchpadEditor:EndUndoAction()
+ scratchpadEditor:ReleaseMouse()
+ wx.wxSetCursor(wx.wxNullCursor) -- restore cursor
+ else event:Skip() end
+ end)
+
+ scratchpadEditor:Connect(wx.wxEVT_MOTION, function(event)
+ local point = event:GetPosition()
+ local pos = scratchpadEditor:PositionFromPoint(point)
+ local scratchpad = debugger.scratchpad
+ local ipoint = scratchpad and scratchpad.point
+
+ -- record the fact that we are over a number or dragging slider
+ scratchpad.over = scratchpad and
+ (ipoint ~= nil or (bit.band(scratchpadEditor:GetStyleAt(pos),31) == numberStyle))
+
+ if ipoint then
+ local startpos = scratchpad.start
+ local endpos = scratchpad.start+scratchpad.length
+
+ -- calculate difference in point position
+ local dx = point.x - ipoint.x
+
+ -- calculate the number of decimal digits after the decimal point
+ local origin = scratchpad.origin
+ local decdigits = #(origin:match('%.(%d+)') or '')
+
+ -- calculate new value
+ local value = tonumber(origin) + dx * 10^-decdigits
+
+ -- convert new value back to string to check the number of decimal points
+ -- this is needed because the rate of change is determined by the
+ -- current value. For example, for number 1, the next value is 2,
+ -- but for number 1.1, the next is 1.2 and for 1.01 it is 1.02.
+ -- But if 1.01 becomes 1.00, the both zeros after the decimal point
+ -- need to be preserved to keep the increment ratio the same when
+ -- the user wants to release the slider and start again.
+ origin = tostring(value)
+ local newdigits = #(origin:match('%.(%d+)') or '')
+ if decdigits ~= newdigits then
+ origin = origin .. (origin:find('%.') and '' or '.') .. ("0"):rep(decdigits-newdigits)
+ end
+
+ -- update length
+ scratchpad.length = #origin
+
+ -- update the value in the document
+ scratchpadEditor:SetTargetStart(startpos)
+ scratchpadEditor:SetTargetEnd(endpos)
+ scratchpadEditor:ReplaceTarget(origin)
+ else event:Skip() end
+ end)
+
+ scratchpadEditor:Connect(wx.wxEVT_SET_CURSOR, function(event)
+ if (debugger.scratchpad and debugger.scratchpad.over) then
+ event:SetCursor(wx.wxCursor(wx.wxCURSOR_SIZEWE))
+ elseif debugger.scratchpad and ide.osname == 'Unix' then
+ -- restore the cursor manually on Linux since event:Skip() doesn't reset it
+ local ibeam = event:GetX() > debugger.scratchpad.margin
+ event:SetCursor(wx.wxCursor(ibeam and wx.wxCURSOR_IBEAM or wx.wxCURSOR_RIGHT_ARROW))
+ else event:Skip() end
+ end)
+
+ return true
+end
+
+function DebuggerScratchpadOff()
+ if not debugger.scratchpad then return end
+
+ for scratchpadEditor in pairs(debugger.scratchpad.editors) do
+ scratchpadEditor:StyleSetUnderline(numberStyle, false)
+ scratchpadEditor:Disconnect(wx.wxID_ANY, wx.wxID_ANY, wxstc.wxEVT_STC_MODIFIED)
+ scratchpadEditor:Disconnect(wx.wxID_ANY, wx.wxID_ANY, wx.wxEVT_MOTION)
+ scratchpadEditor:Disconnect(wx.wxID_ANY, wx.wxID_ANY, wx.wxEVT_LEFT_DOWN)
+ scratchpadEditor:Disconnect(wx.wxID_ANY, wx.wxID_ANY, wx.wxEVT_LEFT_UP)
+ scratchpadEditor:Disconnect(wx.wxID_ANY, wx.wxID_ANY, wx.wxEVT_SET_CURSOR)
+ end
+
+ wx.wxSetCursor(wx.wxNullCursor) -- restore cursor
+
+ debugger.scratchpad = nil
+ debugger.terminate()
+
+ -- disable menu if it is still enabled
+ -- (as this may be called when the debugger is being shut down)
+ local menuBar = ide.frame.menuBar
+ if menuBar:IsChecked(ID_RUNNOW) then menuBar:Check(ID_RUNNOW, false) end
+
+ return true
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/editor.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/editor.lua
new file mode 100644
index 0000000..3b42c23
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/editor.lua
@@ -0,0 +1,1619 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Lomtik Software (J. Winwood & John Labenski)
+-- Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local editorID = 100 -- window id to create editor pages with, incremented for new editors
+
+local openDocuments = ide.openDocuments
+local notebook = ide.frame.notebook
+local edcfg = ide.config.editor
+local styles = ide.config.styles
+local unpack = table.unpack or unpack
+local q = EscapeMagic
+
+local margin = { LINENUMBER = 0, MARKER = 1, FOLD = 2 }
+local linenumlen = 4 + 0.5
+local foldtypes = {
+ [0] = { wxstc.wxSTC_MARKNUM_FOLDEROPEN, wxstc.wxSTC_MARKNUM_FOLDER,
+ wxstc.wxSTC_MARKNUM_FOLDERSUB, wxstc.wxSTC_MARKNUM_FOLDERTAIL, wxstc.wxSTC_MARKNUM_FOLDEREND,
+ wxstc.wxSTC_MARKNUM_FOLDEROPENMID, wxstc.wxSTC_MARKNUM_FOLDERMIDTAIL,
+ },
+ box = { wxstc.wxSTC_MARK_BOXMINUS, wxstc.wxSTC_MARK_BOXPLUS,
+ wxstc.wxSTC_MARK_VLINE, wxstc.wxSTC_MARK_LCORNER, wxstc.wxSTC_MARK_BOXPLUSCONNECTED,
+ wxstc.wxSTC_MARK_BOXMINUSCONNECTED, wxstc.wxSTC_MARK_TCORNER,
+ },
+ circle = { wxstc.wxSTC_MARK_CIRCLEMINUS, wxstc.wxSTC_MARK_CIRCLEPLUS,
+ wxstc.wxSTC_MARK_VLINE, wxstc.wxSTC_MARK_LCORNERCURVE, wxstc.wxSTC_MARK_CIRCLEPLUSCONNECTED,
+ wxstc.wxSTC_MARK_CIRCLEMINUSCONNECTED, wxstc.wxSTC_MARK_TCORNERCURVE,
+ },
+ plus = { wxstc.wxSTC_MARK_MINUS, wxstc.wxSTC_MARK_PLUS },
+ arrow = { wxstc.wxSTC_MARK_ARROWDOWN, wxstc.wxSTC_MARK_ARROW },
+}
+
+-- ----------------------------------------------------------------------------
+-- Update the statusbar text of the frame using the given editor.
+-- Only update if the text has changed.
+local statusTextTable = { "OVR?", "R/O?", "Cursor Pos" }
+
+local function updateStatusText(editor)
+ local texts = { "", "", "" }
+ if ide.frame and editor then
+ local pos = editor:GetCurrentPos()
+ local selected = #editor:GetSelectedText()
+ local selections = ide.wxver >= "2.9.5" and editor:GetSelections() or 1
+
+ texts = {
+ iff(editor:GetOvertype(), TR("OVR"), TR("INS")),
+ iff(editor:GetReadOnly(), TR("R/O"), TR("R/W")),
+ table.concat({
+ TR("Ln: %d"):format(editor:LineFromPosition(pos) + 1),
+ TR("Col: %d"):format(editor:GetColumn(pos) + 1),
+ selected > 0 and TR("Sel: %d/%d"):format(selected, selections) or "",
+ }, ' ')}
+ end
+
+ if ide.frame then
+ for n in ipairs(texts) do
+ if (texts[n] ~= statusTextTable[n]) then
+ ide:SetStatus(texts[n], n)
+ statusTextTable[n] = texts[n]
+ end
+ end
+ end
+end
+
+local function updateBraceMatch(editor)
+ local pos = editor:GetCurrentPos()
+ local posp = pos > 0 and pos-1
+ local char = editor:GetCharAt(pos)
+ local charp = posp and editor:GetCharAt(posp)
+ local match = { [string.byte("<")] = true,
+ [string.byte(">")] = true,
+ [string.byte("(")] = true,
+ [string.byte(")")] = true,
+ [string.byte("{")] = true,
+ [string.byte("}")] = true,
+ [string.byte("[")] = true,
+ [string.byte("]")] = true,
+ }
+
+ pos = (match[char] and pos) or (charp and match[charp] and posp)
+
+ if (pos) then
+ -- don't match brackets in markup comments
+ local style = bit.band(editor:GetStyleAt(pos), 31)
+ if (MarkupIsSpecial and MarkupIsSpecial(style)
+ or editor.spec.iscomment[style]) then return end
+
+ local pos2 = editor:BraceMatch(pos)
+ if (pos2 == wxstc.wxSTC_INVALID_POSITION) then
+ editor:BraceBadLight(pos)
+ else
+ editor:BraceHighlight(pos,pos2)
+ end
+ editor.matchon = true
+ elseif(editor.matchon) then
+ editor:BraceBadLight(wxstc.wxSTC_INVALID_POSITION)
+ editor:BraceHighlight(wxstc.wxSTC_INVALID_POSITION,-1)
+ editor.matchon = false
+ end
+end
+
+-- Check if file is altered, show dialog to reload it
+local function isFileAlteredOnDisk(editor)
+ if not editor then return end
+
+ local id = editor:GetId()
+ if openDocuments[id] then
+ local filePath = openDocuments[id].filePath
+ local fileName = openDocuments[id].fileName
+ local oldModTime = openDocuments[id].modTime
+
+ if filePath and (string.len(filePath) > 0) and oldModTime and oldModTime:IsValid() then
+ local modTime = GetFileModTime(filePath)
+ if modTime == nil then
+ openDocuments[id].modTime = nil
+ wx.wxMessageBox(
+ TR("File '%s' no longer exists."):format(fileName),
+ GetIDEString("editormessage"),
+ wx.wxOK + wx.wxCENTRE, ide.frame)
+ elseif not editor:GetReadOnly() and modTime:IsValid() and oldModTime:IsEarlierThan(modTime) then
+ local ret = (edcfg.autoreload and (not ide:GetDocument(editor):IsModified()) and wx.wxYES)
+ or wx.wxMessageBox(
+ TR("File '%s' has been modified on disk."):format(fileName)
+ .."\n"..TR("Do you want to reload it?"),
+ GetIDEString("editormessage"),
+ wx.wxYES_NO + wx.wxCENTRE, ide.frame)
+
+ if ret ~= wx.wxYES or ReLoadFile(filePath, editor, true) then
+ openDocuments[id].modTime = GetFileModTime(filePath)
+ end
+ end
+ end
+ end
+end
+
+local function navigateToPosition(editor, fromPosition, toPosition, length)
+ table.insert(editor.jumpstack, fromPosition)
+ editor:GotoPosEnforcePolicy(toPosition)
+ if length then
+ editor:SetAnchor(toPosition + length)
+ end
+end
+
+local function navigateBack(editor)
+ if #editor.jumpstack == 0 then return end
+ local pos = table.remove(editor.jumpstack)
+ editor:GotoPosEnforcePolicy(pos)
+ return true
+end
+
+-- ----------------------------------------------------------------------------
+-- Get/Set notebook editor page, use nil for current page, returns nil if none
+function GetEditor(selection)
+ if selection == nil then
+ selection = notebook:GetSelection()
+ end
+ local editor
+ if (selection >= 0) and (selection < notebook:GetPageCount())
+ and (notebook:GetPage(selection):GetClassInfo():GetClassName()=="wxStyledTextCtrl") then
+ editor = notebook:GetPage(selection):DynamicCast("wxStyledTextCtrl")
+ end
+ return editor
+end
+
+-- init new notebook page selection, use nil for current page
+function SetEditorSelection(selection)
+ local editor = GetEditor(selection)
+ updateStatusText(editor) -- update even if nil
+ ide.frame:SetTitle(ExpandPlaceholders(ide.config.format.apptitle))
+
+ if editor then
+ editor:SetFocus()
+ editor:SetSTCFocus(true)
+
+ local id = editor:GetId()
+ FileTreeMarkSelected(openDocuments[id] and openDocuments[id].filePath or '')
+ AddToFileHistory(openDocuments[id] and openDocuments[id].filePath)
+ else
+ FileTreeMarkSelected('')
+ end
+
+ SetAutoRecoveryMark()
+end
+
+function GetEditorFileAndCurInfo(nochecksave)
+ local editor = GetEditor()
+ if (not (editor and (nochecksave or SaveIfModified(editor)))) then
+ return
+ end
+
+ local id = editor:GetId()
+ local filepath = openDocuments[id].filePath
+ if not filepath then return end
+
+ local fn = wx.wxFileName(filepath)
+ fn:Normalize()
+
+ local info = {}
+ info.pos = editor:GetCurrentPos()
+ info.line = editor:GetCurrentLine()
+ info.sel = editor:GetSelectedText()
+ info.sel = info.sel and info.sel:len() > 0 and info.sel or nil
+ info.selword = info.sel and info.sel:match("([^a-zA-Z_0-9]+)") or info.sel
+
+ return fn,info
+end
+
+function EditorAutoComplete(editor)
+ if not (editor and editor.spec) then return end
+
+ local pos = editor:GetCurrentPos()
+ -- don't do auto-complete in comments or strings.
+ -- the current position and the previous one have default style (0),
+ -- so we need to check two positions back.
+ local style = pos >= 2 and bit.band(editor:GetStyleAt(pos-2),31) or 0
+ if editor.spec.iscomment[style] or editor.spec.isstring[style] then return end
+
+ -- retrieve the current line and get a string to the current cursor position in the line
+ local line = editor:GetCurrentLine()
+ local linetx = editor:GetLineDyn(line)
+ local linestart = editor:PositionFromLine(line)
+ local localpos = pos-linestart
+
+ local lt = linetx:sub(1,localpos)
+ lt = lt:gsub("%s*(["..editor.spec.sep.."])%s*", "%1")
+ -- strip closed brace scopes
+ lt = lt:gsub("%b()","")
+ lt = lt:gsub("%b{}","")
+ lt = lt:gsub("%b[]",".0")
+ -- remove everything that can't be auto-completed
+ lt = lt:match("[%w_"..q(editor.spec.sep).."]*$")
+
+ -- know now which string is to be completed
+ local userList = CreateAutoCompList(editor, lt, pos)
+
+ -- don't show if what's typed so far matches one of the options
+ local right = linetx:sub(localpos+1,#linetx):match("^([%a_]+[%w_]*)")
+ local left = lt:match("[%w_]*$") -- extract one word on the left (without separators)
+ if userList and #userList > 0 and not userList:find("%f[%w_]"..left..(right or "").."%f[^%w_]") then
+ editor:UserListShow(1, userList)
+ elseif editor:AutoCompActive() then
+ editor:AutoCompCancel()
+ end
+end
+
+local ident = "([a-zA-Z_][a-zA-Z_0-9%.%:]*)"
+local function getValAtPosition(editor, pos)
+ local line = editor:LineFromPosition(pos)
+ local linetx = editor:GetLineDyn(line)
+ local linestart = editor:PositionFromLine(line)
+ local localpos = pos-linestart
+
+ local selected = editor:GetSelectionStart() ~= editor:GetSelectionEnd()
+ and pos >= editor:GetSelectionStart() and pos <= editor:GetSelectionEnd()
+
+ -- check if we have a selected text or an identifier.
+ -- for an identifier, check fragments on the left and on the right.
+ -- this is to match 'io' in 'i^o.print' and 'io.print' in 'io.pr^int'.
+ -- remove square brackets to make tbl[index].x show proper values.
+ local start = linetx:sub(1,localpos)
+ :gsub("%b[]", function(s) return ("."):rep(#s) end)
+ :find(ident.."$")
+
+ local right, funccall = linetx:sub(localpos+1,#linetx):match("^([a-zA-Z_0-9]*)%s*(['\"{%(]?)")
+ local var = selected
+ -- GetSelectedText() returns concatenated text when multiple instances
+ -- are selected, so get the selected text based on start/end
+ and editor:GetTextRangeDyn(editor:GetSelectionStart(), editor:GetSelectionEnd())
+ or (start and linetx:sub(start,localpos):gsub(":",".")..right or nil)
+
+ -- since this function can be called in different contexts, we need
+ -- to detect function call of different types:
+ -- 1. foo.b^ar(... -- the cursor (pos) is on the function name
+ -- 2. foo.bar(..^. -- the cursor (pos) is on the parameter list
+ -- "var" has value for #1 and the following fragment checks for #2
+
+ -- check if the style is the right one; this is to ignore
+ -- comments, strings, numbers (to avoid '1 = 1'), keywords, and such
+ local goodpos = true
+ if start and not selected then
+ local style = bit.band(editor:GetStyleAt(linestart+start),31)
+ if editor.spec.iscomment[style]
+ or (MarkupIsAny and MarkupIsAny(style)) -- markup in comments
+ or editor.spec.isstring[style]
+ or style == wxstc.wxSTC_LUA_NUMBER
+ or style == wxstc.wxSTC_LUA_WORD then
+ goodpos = false
+ end
+ end
+
+ local linetxtopos = linetx:sub(1,localpos)
+ funccall = (#funccall > 0) and goodpos and var
+ or (linetxtopos..")"):match(ident .. "%s*%b()$")
+ or (linetxtopos.."}"):match(ident .. "%s*%b{}$")
+ or (linetxtopos.."'"):match(ident .. "%s*'[^']*'$")
+ or (linetxtopos..'"'):match(ident .. '%s*"[^"]*"$')
+ or nil
+
+ -- don't do anything for strings or comments or numbers
+ if not goodpos then return nil, funccall end
+
+ return var, funccall
+end
+
+local function formatUpToX(s)
+ local x = math.max(20, ide.config.acandtip.width)
+ local splitstr = "([ \t]*)(%S*)([ \t]*)(\n?)"
+ local t = {""}
+ for prefix, word, suffix, newline in s:gmatch(splitstr) do
+ if #(t[#t]) + #prefix + #word > x and #t > 0 then
+ table.insert(t, word..suffix)
+ else
+ t[#t] = t[#t]..prefix..word..suffix
+ end
+ if #newline > 0 then table.insert(t, "") end
+ end
+ return table.concat(t, "\n")
+end
+
+local function callTipFitAndShow(editor, pos, tip)
+ local point = editor:PointFromPosition(pos)
+ local height = editor:TextHeight(pos)
+ local maxlines = math.max(1, math.floor(
+ math.max(editor:GetSize():GetHeight()-point:GetY()-height, point:GetY())/height-1
+ ))
+ -- cut the tip to not exceed the number of maxlines.
+ -- move the position to the left if needed to fit.
+ -- find the longest line in terms of width in pixels.
+ local maxwidth = 0
+ local lines = {}
+ for line in formatUpToX(tip):gmatch("[^\n]*\n?") do
+ local width = editor:TextWidth(wxstc.wxSTC_STYLE_DEFAULT, line)
+ if width > maxwidth then maxwidth = width end
+ table.insert(lines, line)
+ if #lines >= maxlines then
+ lines[#lines] = lines[#lines]:gsub("%s*\n$","")..'...'
+ break
+ end
+ end
+ tip = table.concat(lines, '')
+
+ local startpos = editor:PositionFromLine(editor:LineFromPosition(pos))
+ local afterwidth = editor:GetSize():GetWidth()-point:GetX()
+ if maxwidth > afterwidth then
+ local charwidth = editor:TextWidth(wxstc.wxSTC_STYLE_DEFAULT, 'A')
+ pos = math.max(startpos, pos - math.floor((maxwidth - afterwidth) / charwidth))
+ end
+
+ editor:CallTipShow(pos, tip)
+end
+
+function EditorCallTip(editor, pos, x, y)
+ -- don't show anything if the calltip/auto-complete is active;
+ -- this may happen after typing function name, while the mouse is over
+ -- a different function or when auto-complete is on for a parameter.
+ if editor:CallTipActive() or editor:AutoCompActive() then return end
+
+ -- don't activate if the window itself is not active (in the background)
+ if not ide.frame:IsActive() then return end
+
+ local var, funccall = editor:ValueFromPosition(pos)
+ -- if this is a value type rather than a function/method call, then use
+ -- full match to avoid calltip about coroutine.status for "status" vars
+ local tip = GetTipInfo(editor, funccall or var, false, not funccall)
+ local limit = ide.config.acandtip.maxlength
+ if ide.debugger and ide.debugger.server then
+ if var then
+ ide.debugger.quickeval(var, function(val)
+ if #val > limit then val = val:sub(1, limit-3).."..." end
+ -- check if the mouse position is specified and the mouse has moved,
+ -- then don't show the tooltip as it's already too late for it.
+ if x and y then
+ local mpos = wx.wxGetMousePosition()
+ if mpos.x ~= x or mpos.y ~= y then return end
+ end
+ if PackageEventHandle("onEditorCallTip", editor, val, funccall or var, true) ~= false then
+ callTipFitAndShow(editor, pos, val)
+ end
+ end)
+ end
+ elseif tip then
+ local oncalltip = PackageEventHandle("onEditorCallTip", editor, tip, funccall or var, false)
+ -- only shorten if shown on mouse-over. Use shortcut to get full info.
+ local showtooltip = ide.frame.menuBar:FindItem(ID_SHOWTOOLTIP)
+ local suffix = "...\n"
+ ..TR("Use '%s' to see full description."):format(showtooltip:GetLabel())
+ if x and y and #tip > limit then
+ tip = tip:sub(1, limit-#suffix):gsub("%W*%w*$","")..suffix
+ end
+ if oncalltip ~= false then callTipFitAndShow(editor, pos, tip) end
+ end
+end
+
+-- Indicator handling for functions and local/global variables
+local indicator = {
+ FNCALL = ide:GetIndicator("core.fncall"),
+ LOCAL = ide:GetIndicator("core.varlocal"),
+ GLOBAL = ide:GetIndicator("core.varglobal"),
+ MASKING = ide:GetIndicator("core.varmasking"),
+ MASKED = ide:GetIndicator("core.varmasked"),
+}
+
+function IndicateFunctionsOnly(editor, lines, linee)
+ local sindic = styles.indicator
+ if not (edcfg.showfncall and editor.spec and editor.spec.isfncall)
+ or not (sindic and sindic.fncall and sindic.fncall.st ~= wxstc.wxSTC_INDIC_HIDDEN) then return end
+
+ local lines = lines or 0
+ local linee = linee or editor:GetLineCount()-1
+
+ if (lines < 0) then return end
+
+ local isfncall = editor.spec.isfncall
+ local isinvalid = {}
+ for i,v in pairs(editor.spec.iscomment) do isinvalid[i] = v end
+ for i,v in pairs(editor.spec.iskeyword0) do isinvalid[i] = v end
+ for i,v in pairs(editor.spec.isstring) do isinvalid[i] = v end
+
+ editor:SetIndicatorCurrent(indicator.FNCALL)
+ for line=lines,linee do
+ local tx = editor:GetLineDyn(line)
+ local ls = editor:PositionFromLine(line)
+ editor:IndicatorClearRange(ls, #tx)
+
+ local from = 1
+ local off = -1
+ while from do
+ tx = from==1 and tx or string.sub(tx,from)
+
+ local f,t,w = isfncall(tx)
+
+ if (f) then
+ local p = ls+f+off
+ local s = bit.band(editor:GetStyleAt(p),31)
+ if not isinvalid[s] then editor:IndicatorFillRange(p, #w) end
+ off = off + t
+ end
+ from = t and (t+1)
+ end
+ end
+end
+
+local delayed = {}
+
+function IndicateIfNeeded()
+ local editor = GetEditor()
+ -- do the current one first
+ if delayed[editor] then return IndicateAll(editor) end
+ for ed in pairs(delayed) do return IndicateAll(ed) end
+end
+
+-- find all instances of a symbol at pos
+-- return table with [0] as the definition position (if local)
+local function indicateFindInstances(editor, name, pos)
+ local tokens = editor:GetTokenList()
+ local instances = {{[-1] = 1}}
+ local this
+ for _, token in ipairs(tokens) do
+ local op = token[1]
+
+ if op == 'EndScope' then -- EndScope has "new" level, so need +1
+ if this and token.fpos > pos and this == token.at+1 then break end
+
+ if #instances > 1 and instances[#instances][-1] == token.at+1 then
+ table.remove(instances)
+ end
+ elseif token.name == name then
+ if op == 'Id' then
+ table.insert(instances[#instances], token.fpos)
+ elseif op:find("^Var") then
+ if this and this == token.at then break end
+
+ -- if new Var is defined at the same level, replace the current frame;
+ -- if not, add a new one; skip implicit definition of "self" variable.
+ instances[#instances + (token.at > instances[#instances][-1] and 1 or 0)]
+ = {[0] = (not token.self and token.fpos or nil), [-1] = token.at}
+ end
+ if token.fpos <= pos and pos <= token.fpos+#name then this = instances[#instances][-1] end
+ end
+ end
+ instances[#instances][-1] = nil -- remove the current level
+ -- only return the list if "this" instance has been found;
+ -- this is to avoid reporting (improper) instances when checking for
+ -- comments, strings, table fields, etc.
+ return this and instances[#instances] or {}
+end
+
+function IndicateAll(editor, lines)
+ if not ide.config.autoanalyzer then return end
+
+ local d = delayed[editor]
+ delayed[editor] = nil -- assume this can be finished for now
+
+ -- this function can be called for an editor tab that is already closed
+ -- when there are still some pending events for it, so handle it.
+ if not ide:IsValidCtrl(editor) then return end
+
+ -- if markvars is not set in the spec, nothing else to do
+ if not (editor.spec and editor.spec.marksymbols) then return end
+
+ local indic = styles.indicator or {}
+
+ local pos, vars = d and d[1] or 1, d and d[2] or nil
+ local start = lines and editor:PositionFromLine(lines)+1 or nil
+ if d and start and pos >= start then
+ -- ignore delayed processing as the change is earlier in the text
+ pos, vars = 1, nil
+ end
+
+ local tokens = editor:GetTokenList()
+
+ if start then -- if the range is specified
+ local curindic = editor:GetIndicatorCurrent()
+ editor:SetIndicatorCurrent(indicator.MASKED)
+ for n = #tokens, 1, -1 do
+ local token = tokens[n]
+ -- find the last token before the range
+ if not token.nobreak and token.name and token.fpos+#token.name < start then
+ pos, vars = token.fpos+#token.name, token.context
+ break
+ end
+ -- unmask all variables from the rest of the list
+ if token[1] == 'Masked' then
+ editor:IndicatorClearRange(token.fpos-1, #token.name)
+ end
+ -- trim the list as it will be re-generated
+ table.remove(tokens, n)
+ end
+
+ -- Clear masked indicators from the current position to the end as these
+ -- will be re-calculated and re-applied based on masking variables.
+ -- This step is needed as some positions could have shifted after updates.
+ editor:IndicatorClearRange(pos-1, editor:GetLength()-pos+1)
+
+ editor:SetIndicatorCurrent(curindic)
+
+ -- need to cleanup vars as they may include variables from later
+ -- fragments (because the cut-point was arbitrary). Also need
+ -- to clean variables in other scopes, hence getmetatable use.
+ local vars = vars
+ while vars do
+ for name, var in pairs(vars) do
+ -- remove all variables that are created later than the current pos
+ -- skip all non-variable elements from the vars table
+ if type(name) == 'string' then
+ while type(var) == 'table' and var.fpos and (var.fpos > pos) do
+ var = var.masked -- restored a masked var
+ vars[name] = var
+ end
+ end
+ end
+ vars = getmetatable(vars) and getmetatable(vars).__index
+ end
+ else
+ if pos == 1 then -- if not continuing, then trim the list
+ tokens = editor:ResetTokenList()
+ end
+ end
+
+ local cleared = {}
+ for _, indic in ipairs {indicator.FNCALL, indicator.LOCAL, indicator.GLOBAL, indicator.MASKING} do
+ cleared[indic] = pos
+ end
+
+ local function IndicateOne(indic, pos, length)
+ editor:SetIndicatorCurrent(indic)
+ editor:IndicatorClearRange(cleared[indic]-1, pos-cleared[indic])
+ editor:IndicatorFillRange(pos-1, length)
+ cleared[indic] = pos+length
+ end
+
+ local s = TimeGet()
+ local canwork = start and 0.010 or 0.100 -- use shorter interval when typing
+ local f = editor.spec.marksymbols(editor:GetTextDyn(), pos, vars)
+ while true do
+ local op, name, lineinfo, vars, at, nobreak = f()
+ if not op then break end
+ local var = vars and vars[name]
+ local token = {op, name=name, fpos=lineinfo, at=at, context=vars,
+ self = (op == 'VarSelf') or nil, nobreak=nobreak}
+ if op == 'Function' then
+ vars['function'] = (vars['function'] or 0) + 1
+ end
+ if op == 'FunctionCall' then
+ if indic.fncall and edcfg.showfncall then
+ IndicateOne(indicator.FNCALL, lineinfo, #name)
+ end
+ elseif op ~= 'VarNext' and op ~= 'VarInside' and op ~= 'Statement' and op ~= 'String' then
+ table.insert(tokens, token)
+ end
+
+ -- indicate local/global variables
+ if op == 'Id'
+ and (var and indic.varlocal or not var and indic.varglobal) then
+ IndicateOne(var and indicator.LOCAL or indicator.GLOBAL, lineinfo, #name)
+ end
+
+ -- indicate masked values at the same level
+ if op == 'Var' and var and (var.masked and at == var.masked.at) then
+ local fpos = var.masked.fpos
+ -- indicate masked if it's not implicit self
+ if indic.varmasked and not var.masked.self then
+ editor:SetIndicatorCurrent(indicator.MASKED)
+ editor:IndicatorFillRange(fpos-1, #name)
+ table.insert(tokens, {"Masked", name=name, fpos=fpos, nobreak=nobreak})
+ end
+
+ if indic.varmasking then IndicateOne(indicator.MASKING, lineinfo, #name) end
+ end
+ -- in some rare cases `nobreak` may be a number indicating a desired
+ -- position from which to start in case of a break
+ if lineinfo and nobreak ~= true and (op == 'Statement' or op == 'String') and TimeGet()-s > canwork then
+ delayed[editor] = {tonumber(nobreak) or lineinfo, vars}
+ break
+ end
+ end
+
+ -- clear indicators till the end of processed fragment
+ pos = delayed[editor] and delayed[editor][1] or editor:GetLength()+1
+
+ -- don't clear "masked" indicators as those can be set out of order (so
+ -- last updated fragment is not always the last in terms of its position);
+ -- these indicators should be up-to-date to the end of the code fragment.
+ local funconly = ide.config.editor.showfncall and editor.spec.isfncall
+ for _, indic in ipairs {indicator.FNCALL, indicator.LOCAL, indicator.GLOBAL, indicator.MASKING} do
+ -- don't clear "funccall" indicators as those can be set based on
+ -- IndicateFunctionsOnly processing, which is dealt with separately
+ if indic ~= indicator.FNCALL or not funconly then IndicateOne(indic, pos, 0) end
+ end
+
+ local needmore = delayed[editor] ~= nil
+ if ide.config.outlineinactivity then
+ if needmore then ide.timers.outline:Stop()
+ else ide.timers.outline:Start(ide.config.outlineinactivity*1000, wx.wxTIMER_ONE_SHOT)
+ end
+ end
+ return needmore -- request more events if still need to work
+end
+
+-- ----------------------------------------------------------------------------
+-- Create an editor
+function CreateEditor(bare)
+ local editor = ide:CreateStyledTextCtrl(notebook, editorID,
+ wx.wxDefaultPosition, wx.wxSize(0, 0), wx.wxBORDER_NONE)
+
+ editorID = editorID + 1 -- increment so they're always unique
+
+ editor.matchon = false
+ editor.assignscache = false
+ editor.bom = false
+ editor.updated = 0
+ editor.jumpstack = {}
+ editor.ctrlcache = {}
+ editor.tokenlist = {}
+ editor.onidle = {}
+ -- populate cache with Ctrl-<letter> combinations for workaround on Linux
+ -- http://wxwidgets.10942.n7.nabble.com/Menu-shortcuts-inconsistentcy-issue-td85065.html
+ for id, shortcut in pairs(ide.config.keymap) do
+ local key = shortcut:match('^Ctrl[-+](.)$')
+ if key then editor.ctrlcache[key:byte()] = id end
+ end
+
+ -- populate editor keymap with configured combinations
+ for _, map in ipairs(edcfg.keymap or {}) do
+ local key, mod, cmd, os = unpack(map)
+ if not os or os == ide.osname then
+ if cmd then
+ editor:CmdKeyAssign(key, mod, cmd)
+ else
+ editor:CmdKeyClear(key, mod)
+ end
+ end
+ end
+
+ editor:SetBufferedDraw(not ide.config.hidpi and true or false)
+ editor:StyleClearAll()
+
+ editor:SetFont(ide.font.eNormal)
+ editor:StyleSetFont(wxstc.wxSTC_STYLE_DEFAULT, ide.font.eNormal)
+
+ editor:SetTabWidth(tonumber(edcfg.tabwidth) or 2)
+ editor:SetIndent(tonumber(edcfg.tabwidth) or 2)
+ editor:SetUseTabs(edcfg.usetabs and true or false)
+ editor:SetIndentationGuides(tonumber(edcfg.indentguide) or (edcfg.indentguide and true or false))
+ editor:SetViewWhiteSpace(edcfg.whitespace and true or false)
+
+ if (edcfg.usewrap) then
+ editor:SetWrapMode(edcfg.wrapmode)
+ editor:SetWrapStartIndent(0)
+ if ide.wxver >= "2.9.5" then
+ if edcfg.wrapflags then
+ editor:SetWrapVisualFlags(tonumber(edcfg.wrapflags) or wxstc.wxSTC_WRAPVISUALFLAG_NONE)
+ end
+ if edcfg.wrapstartindent then
+ editor:SetWrapStartIndent(tonumber(edcfg.wrapstartindent) or 0)
+ end
+ if edcfg.wrapindentmode then
+ editor:SetWrapIndentMode(edcfg.wrapindentmode)
+ end
+ end
+ else
+ editor:SetScrollWidth(100) -- set default width
+ editor:SetScrollWidthTracking(1) -- enable width auto-adjustment
+ end
+
+ if edcfg.defaulteol == wxstc.wxSTC_EOL_CRLF
+ or edcfg.defaulteol == wxstc.wxSTC_EOL_LF then
+ editor:SetEOLMode(edcfg.defaulteol)
+ -- else: keep wxStyledTextCtrl default behavior (CRLF on Windows, LF on Unix)
+ end
+
+ editor:SetCaretLineVisible(edcfg.caretline and true or false)
+
+ editor:SetVisiblePolicy(wxstc.wxSTC_VISIBLE_STRICT, 3)
+
+ editor:SetMarginType(margin.LINENUMBER, wxstc.wxSTC_MARGIN_NUMBER)
+ editor:SetMarginMask(margin.LINENUMBER, 0)
+ editor:SetMarginWidth(margin.LINENUMBER,
+ math.floor(linenumlen * editor:TextWidth(wxstc.wxSTC_STYLE_DEFAULT, "8")))
+
+ editor:SetMarginWidth(margin.MARKER, 18)
+ editor:SetMarginType(margin.MARKER, wxstc.wxSTC_MARGIN_SYMBOL)
+ editor:SetMarginMask(margin.MARKER, 0xffffffff - wxstc.wxSTC_MASK_FOLDERS)
+ editor:SetMarginSensitive(margin.MARKER, true)
+
+ editor:MarkerDefine(StylesGetMarker("currentline"))
+ editor:MarkerDefine(StylesGetMarker("breakpoint"))
+ editor:MarkerDefine(StylesGetMarker("bookmark"))
+
+ if edcfg.fold then
+ editor:SetMarginWidth(margin.FOLD, 18)
+ editor:SetMarginType(margin.FOLD, wxstc.wxSTC_MARGIN_SYMBOL)
+ editor:SetMarginMask(margin.FOLD, wxstc.wxSTC_MASK_FOLDERS)
+ editor:SetMarginSensitive(margin.FOLD, true)
+ end
+
+ editor:SetFoldFlags(tonumber(edcfg.foldflags) or wxstc.wxSTC_FOLDFLAG_LINEAFTER_CONTRACTED)
+
+ if ide.wxver >= "2.9.5" then
+ -- allow multiple selection and multi-cursor editing if supported
+ editor:SetMultipleSelection(1)
+ editor:SetAdditionalCaretsBlink(1)
+ editor:SetAdditionalSelectionTyping(1)
+ -- allow extra ascent/descent
+ editor:SetExtraAscent(tonumber(edcfg.extraascent) or 0)
+ editor:SetExtraDescent(tonumber(edcfg.extradescent) or 0)
+ end
+
+ do
+ local fg, bg = wx.wxWHITE, wx.wxColour(128, 128, 128)
+ local foldtype = foldtypes[edcfg.foldtype] or foldtypes.box
+ local foldmarkers = foldtypes[0]
+ for m = 1, #foldmarkers do
+ editor:MarkerDefine(foldmarkers[m], foldtype[m] or wxstc.wxSTC_MARK_EMPTY, fg, bg)
+ end
+ bg:delete()
+ end
+
+ if edcfg.calltipdelay and edcfg.calltipdelay > 0 then
+ editor:SetMouseDwellTime(edcfg.calltipdelay)
+ end
+
+ editor:AutoCompSetIgnoreCase(ide.config.acandtip.ignorecase)
+ if (ide.config.acandtip.strategy > 0) then
+ editor:AutoCompSetAutoHide(0)
+ editor:AutoCompStops([[ \n\t=-+():.,;*/!"'$%&~'#°^@?´`<>][|}{]])
+ end
+
+ function editor:GetTokenList() return self.tokenlist end
+ function editor:ResetTokenList() self.tokenlist = {}; return self.tokenlist end
+
+ function editor:SetupKeywords(...) return SetupKeywords(self, ...) end
+ function editor:ValueFromPosition(pos) return getValAtPosition(self, pos) end
+
+ function editor:MarkerGotoNext(marker)
+ local value = 2^marker
+ local line = editor:MarkerNext(editor:GetCurrentLine()+1, value)
+ if line == -1 then line = editor:MarkerNext(0, value) end
+ if line == -1 then return end
+ editor:GotoLine(line)
+ editor:EnsureVisibleEnforcePolicy(line)
+ return line
+ end
+ function editor:MarkerGotoPrev(marker)
+ local value = 2^marker
+ local line = editor:MarkerPrevious(editor:GetCurrentLine()-1, value)
+ if line == -1 then line = editor:MarkerPrevious(editor:GetLineCount(), value) end
+ if line == -1 then return end
+ editor:GotoLine(line)
+ editor:EnsureVisibleEnforcePolicy(line)
+ return line
+ end
+ function editor:MarkerToggle(marker, line, value)
+ line = line or editor:GetCurrentLine()
+ local isset = bit.band(editor:MarkerGet(line), 2^marker) > 0
+ if value ~= nil and isset == value then return end
+ if isset then
+ editor:MarkerDelete(line, marker)
+ else
+ editor:MarkerAdd(line, marker)
+ end
+ PackageEventHandle("onEditorMarkerUpdate", editor, marker, line, not isset)
+ end
+
+ function editor:BookmarkToggle(...) return self:MarkerToggle((StylesGetMarker("bookmark")), ...) end
+ function editor:BreakpointToggle(line, ...)
+ line = line or self:GetCurrentLine()
+ return DebuggerToggleBreakpoint(self, line, ...)
+ end
+
+ function editor:DoWhenIdle(func) table.insert(self.onidle, func) end
+
+ -- GotoPos should work by itself, but it doesn't (wx 2.9.5).
+ -- This is likely because the editor window hasn't been refreshed yet,
+ -- so its LinesOnScreen method returns 0/-1, which skews the calculations.
+ -- To avoid this, the caret line is made visible at the first opportunity.
+ do
+ local redolater
+ function editor:GotoPosDelayed(pos)
+ local badtime = self:LinesOnScreen() <= 0 -- -1 on OSX, 0 on Windows
+ if pos then
+ if badtime then
+ redolater = pos
+ -- without this GotoPos the content is not scrolled correctly on
+ -- Windows, but with this it's not scrolled correctly on OSX.
+ if ide.osname ~= 'Macintosh' then self:GotoPos(pos) end
+ else
+ redolater = nil
+ self:GotoPosEnforcePolicy(pos)
+ end
+ elseif not badtime and redolater then
+ -- reset the left margin first to make sure that the position
+ -- is set "from the left" to get the best content displayed.
+ self:SetXOffset(0)
+ self:GotoPosEnforcePolicy(redolater)
+ redolater = nil
+ end
+ end
+ end
+
+ if bare then return editor end -- bare editor doesn't have any event handlers
+
+ editor.ev = {}
+ editor:Connect(wxstc.wxEVT_STC_MARGINCLICK,
+ function (event)
+ local line = editor:LineFromPosition(event:GetPosition())
+ local marginno = event:GetMargin()
+ if marginno == margin.MARKER then
+ DebuggerToggleBreakpoint(editor, line)
+ elseif marginno == margin.FOLD then
+ local header = bit.band(editor:GetFoldLevel(line),
+ wxstc.wxSTC_FOLDLEVELHEADERFLAG) == wxstc.wxSTC_FOLDLEVELHEADERFLAG
+ if wx.wxGetKeyState(wx.WXK_SHIFT) and wx.wxGetKeyState(wx.WXK_CONTROL) then
+ editor:FoldSome()
+ elseif header then
+ editor:ToggleFold(line)
+ end
+ end
+ end)
+
+ editor:Connect(wxstc.wxEVT_STC_MODIFIED,
+ function (event)
+ if (editor.assignscache and editor:GetCurrentLine() ~= editor.assignscache.line) then
+ editor.assignscache = false
+ end
+ local evtype = event:GetModificationType()
+ if bit.band(evtype, wxstc.wxSTC_MOD_CHANGEMARKER) == 0 then
+ -- this event is being called on OSX too frequently, so skip these notifications
+ editor.updated = TimeGet()
+ end
+ local pos = event:GetPosition()
+ local firstLine = editor:LineFromPosition(pos)
+ local inserted = bit.band(evtype, wxstc.wxSTC_MOD_INSERTTEXT) ~= 0
+ local deleted = bit.band(evtype, wxstc.wxSTC_MOD_DELETETEXT) ~= 0
+ if (inserted or deleted) then
+ SetAutoRecoveryMark()
+
+ local linesChanged = inserted and event:GetLinesAdded() or 0
+ -- collate events if they are for the same line
+ local events = #editor.ev
+ if events == 0 or editor.ev[events][1] ~= firstLine then
+ editor.ev[events+1] = {firstLine, linesChanged}
+ elseif events > 0 and editor.ev[events][1] == firstLine then
+ editor.ev[events][2] = math.max(editor.ev[events][2], linesChanged)
+ end
+ DynamicWordsAdd(editor, nil, firstLine, linesChanged)
+ end
+
+ local beforeInserted = bit.band(evtype,wxstc.wxSTC_MOD_BEFOREINSERT) ~= 0
+ local beforeDeleted = bit.band(evtype,wxstc.wxSTC_MOD_BEFOREDELETE) ~= 0
+
+ if (beforeInserted or beforeDeleted) then
+ -- unfold the current line being changed if folded, but only if one selection
+ local lastLine = editor:LineFromPosition(pos+event:GetLength())
+ local selections = ide.wxver >= "2.9.5" and editor:GetSelections() or 1
+ if (not editor:GetFoldExpanded(firstLine)
+ or not editor:GetLineVisible(firstLine)
+ or not editor:GetLineVisible(lastLine))
+ and selections == 1 then
+ for line = firstLine, lastLine do
+ if not editor:GetLineVisible(line) then editor:ToggleFold(editor:GetFoldParent(line)) end
+ end
+ end
+ end
+
+ -- hide calltip/auto-complete after undo/redo/delete
+ local undodelete = (wxstc.wxSTC_MOD_DELETETEXT
+ + wxstc.wxSTC_PERFORMED_UNDO + wxstc.wxSTC_PERFORMED_REDO)
+ if bit.band(evtype, undodelete) ~= 0 then
+ editor:DoWhenIdle(function(editor)
+ if editor:CallTipActive() then editor:CallTipCancel() end
+ if editor:AutoCompActive() then editor:AutoCompCancel() end
+ end)
+ end
+
+ if ide.config.acandtip.nodynwords then return end
+ -- only required to track changes
+
+ if beforeDeleted then
+ local text = editor:GetTextRangeDyn(pos, pos+event:GetLength())
+ local _, numlines = text:gsub("\r?\n","%1")
+ DynamicWordsRem(editor,nil,firstLine, numlines)
+ end
+ if beforeInserted then
+ DynamicWordsRem(editor,nil,firstLine, 0)
+ end
+ end)
+
+ editor:Connect(wxstc.wxEVT_STC_CHARADDED,
+ function (event)
+ local LF = string.byte("\n")
+ local ch = event:GetKey()
+ local pos = editor:GetCurrentPos()
+ local line = editor:GetCurrentLine()
+ local linetx = editor:GetLineDyn(line)
+ local linestart = editor:PositionFromLine(line)
+ local localpos = pos-linestart
+ local linetxtopos = linetx:sub(1,localpos)
+
+ if PackageEventHandle("onEditorCharAdded", editor, event) == false then
+ -- this event has already been handled
+ elseif (ch == LF) then
+ -- auto-indent
+ if (line > 0) then
+ local indent = editor:GetLineIndentation(line - 1)
+ local linedone = editor:GetLineDyn(line - 1)
+
+ -- if the indentation is 0 and the current line is not empty,
+ -- but the previous line is empty, then take indentation from the
+ -- current line (instead of the previous one). This may happen when
+ -- CR is hit at the beginning of a line (rather than at the end).
+ if indent == 0 and not linetx:match("^[\010\013]*$")
+ and linedone:match("^[\010\013]*$") then
+ indent = editor:GetLineIndentation(line)
+ end
+
+ local ut = editor:GetUseTabs()
+ local tw = ut and editor:GetTabWidth() or editor:GetIndent()
+ local style = bit.band(editor:GetStyleAt(editor:PositionFromLine(line-1)), 31)
+
+ if edcfg.smartindent
+ -- don't apply smartindent to multi-line comments or strings
+ and not (editor.spec.iscomment[style]
+ or editor.spec.isstring[style]
+ or (MarkupIsAny and MarkupIsAny(style)))
+ and editor.spec.isdecindent and editor.spec.isincindent then
+ local closed, blockend = editor.spec.isdecindent(linedone)
+ local opened = editor.spec.isincindent(linedone)
+
+ -- if the current block is already indented, skip reverse indenting
+ if (line > 1) and (closed > 0 or blockend > 0)
+ and editor:GetLineIndentation(line-2) > indent then
+ -- adjust opened first; this is needed when use ENTER after })
+ if blockend == 0 then opened = opened + closed end
+ closed, blockend = 0, 0
+ end
+ editor:SetLineIndentation(line-1, indent - tw * closed)
+ indent = indent + tw * (opened - blockend)
+ if indent < 0 then indent = 0 end
+ end
+ editor:SetLineIndentation(line, indent)
+
+ indent = ut and (indent / tw) or indent
+ editor:GotoPos(editor:GetCurrentPos()+indent)
+ end
+
+ elseif ch == ("("):byte() then
+ local tip = GetTipInfo(editor,linetxtopos,ide.config.acandtip.shorttip)
+ if tip then
+ if editor:CallTipActive() then editor:CallTipCancel() end
+ if PackageEventHandle("onEditorCallTip", editor, tip) ~= false then
+ callTipFitAndShow(editor, pos, tip)
+ end
+ end
+
+ elseif ide.config.autocomplete then -- code completion prompt
+ local trigger = linetxtopos:match("["..editor.spec.sep.."%w_]+$")
+ if trigger and (#trigger > 1 or trigger:match("["..editor.spec.sep.."]")) then
+ editor:DoWhenIdle(function(editor) EditorAutoComplete(editor) end)
+ end
+ end
+ end)
+
+ editor:Connect(wxstc.wxEVT_STC_DWELLSTART,
+ function (event)
+ -- on Linux DWELLSTART event seems to be generated even for those
+ -- editor windows that are not active. What's worse, when generated
+ -- the event seems to report "old" position when retrieved using
+ -- event:GetX and event:GetY, so instead we use wxGetMousePosition.
+ local linux = ide.osname == 'Unix'
+ if linux and editor ~= GetEditor() then return end
+
+ -- check if this editor has focus; it may not when Stack/Watch window
+ -- is on top, but DWELL events are still triggered in this case.
+ -- Don't want to show calltip as it is still shown when the focus
+ -- is switched to a different application.
+ local focus = editor:FindFocus()
+ if focus and focus:GetId() ~= editor:GetId() then return end
+
+ -- event:GetX() and event:GetY() positions don't correspond to
+ -- the correct positions calculated using ScreenToClient (at least
+ -- on Windows and Linux), so use what's calculated.
+ local mpos = wx.wxGetMousePosition()
+ local cpos = editor:ScreenToClient(mpos)
+ local position = editor:PositionFromPointClose(cpos.x, cpos.y)
+ if position ~= wxstc.wxSTC_INVALID_POSITION then
+ EditorCallTip(editor, position, mpos.x, mpos.y)
+ end
+ event:Skip()
+ end)
+
+ editor:Connect(wxstc.wxEVT_STC_DWELLEND,
+ function (event)
+ if editor:CallTipActive() then editor:CallTipCancel() end
+ event:Skip()
+ end)
+
+ editor:Connect(wx.wxEVT_KILL_FOCUS,
+ function (event)
+ -- on OSX clicking on scrollbar in the popup is causing the editor to lose focus,
+ -- which causes canceling of auto-complete, which later cause crash because
+ -- the window is destroyed in wxwidgets after already being closed. Skip on OSX.
+ if ide.osname ~= 'Macintosh' and editor:AutoCompActive() then editor:AutoCompCancel() end
+ PackageEventHandle("onEditorFocusLost", editor)
+ event:Skip()
+ end)
+
+ local eol = {
+ [wxstc.wxSTC_EOL_CRLF] = "\r\n",
+ [wxstc.wxSTC_EOL_LF] = "\n",
+ [wxstc.wxSTC_EOL_CR] = "\r",
+ }
+ local function addOneLine(editor, adj)
+ local pos = editor:GetLineEndPosition(editor:LineFromPosition(editor:GetCurrentPos())+(adj or 0))
+ local added = eol[editor:GetEOLMode()] or "\n"
+ editor:InsertTextDyn(pos, added)
+ editor:SetCurrentPos(pos+#added)
+
+ local ev = wxstc.wxStyledTextEvent(wxstc.wxEVT_STC_CHARADDED)
+ ev:SetKey(string.byte("\n"))
+ editor:AddPendingEvent(ev)
+ end
+
+ editor:Connect(wxstc.wxEVT_STC_USERLISTSELECTION,
+ function (event)
+ if PackageEventHandle("onEditorUserlistSelection", editor, event) == false then
+ return
+ end
+
+ -- if used Shift-Enter, then skip auto complete and just do Enter
+ if wx.wxGetKeyState(wx.WXK_SHIFT) then return addOneLine(editor) end
+
+ if ide.wxver >= "2.9.5" and editor:GetSelections() > 1 then
+ local text = event:GetText()
+ -- capture all positions as the selection may change
+ local positions = {}
+ for s = 0, editor:GetSelections()-1 do
+ table.insert(positions, editor:GetSelectionNCaret(s))
+ end
+ -- process all selections from last to first
+ table.sort(positions)
+ local mainpos = editor:GetSelectionNCaret(editor:GetMainSelection())
+
+ editor:BeginUndoAction()
+ for s = #positions, 1, -1 do
+ local pos = positions[s]
+ local startpos = editor:WordStartPosition(pos, true)
+ editor:SetSelection(startpos, pos)
+ editor:ReplaceSelection(text)
+ -- if this is the main position, save new cursor position to restore
+ if pos == mainpos then mainpos = editor:GetCurrentPos()
+ elseif pos < mainpos then
+ -- adjust main position as earlier changes may affect it
+ mainpos = mainpos + #text - (pos - startpos)
+ end
+ end
+ editor:EndUndoAction()
+
+ editor:GotoPos(mainpos)
+ else
+ local pos = editor:GetCurrentPos()
+ local startpos = editor:WordStartPosition(pos, true)
+ local endpos = editor:WordEndPosition(pos, true)
+ editor:SetSelection(startpos, ide.config.acandtip.droprest and endpos or pos)
+ editor:ReplaceSelection(event:GetText())
+ end
+ end)
+
+ editor:Connect(wxstc.wxEVT_STC_SAVEPOINTREACHED,
+ function ()
+ local doc = ide:GetDocument(editor)
+ if doc then doc:SetModified(false) end
+ end)
+
+ editor:Connect(wxstc.wxEVT_STC_SAVEPOINTLEFT,
+ function ()
+ local doc = ide:GetDocument(editor)
+ if doc then doc:SetModified(true) end
+ end)
+
+ -- "updateStatusText" should be called in UPDATEUI event, but it creates
+ -- several performance problems on Windows (using wx2.9.5+) when
+ -- brackets or backspace is used (very slow screen repaint with 0.5s delay).
+ -- Moving it to PAINTED event creates problems on OSX (using wx2.9.5+),
+ -- where refresh of R/W and R/O status in the status bar is delayed.
+
+ editor:Connect(wxstc.wxEVT_STC_PAINTED,
+ function (event)
+ PackageEventHandle("onEditorPainted", editor, event)
+
+ if ide.osname == 'Windows' then
+ -- STC_PAINTED is called on multiple editors when they point to
+ -- the same document; only update status for the active one
+ if notebook:GetSelection() == notebook:GetPageIndex(editor) then
+ updateStatusText(editor)
+ end
+
+ if edcfg.usewrap ~= true and editor:AutoCompActive() then
+ -- showing auto-complete list leaves artifacts on the screen,
+ -- which can only be fixed by a forced refresh.
+ -- shows with wxSTC 3.21 and both wxwidgets 2.9.5 and 3.1
+ editor:Update()
+ editor:Refresh()
+ end
+ end
+
+ -- adjust line number margin, but only if it's already shown
+ local linecount = #tostring(editor:GetLineCount()) + 0.5
+ local mwidth = editor:GetMarginWidth(margin.LINENUMBER)
+ if mwidth > 0 then
+ local width = math.max(linecount, linenumlen) * editor:TextWidth(wxstc.wxSTC_STYLE_DEFAULT, "8")
+ if mwidth ~= width then editor:SetMarginWidth(margin.LINENUMBER, math.floor(width)) end
+ end
+ end)
+
+ editor.processedUpdateContent = 0
+ editor:Connect(wxstc.wxEVT_STC_UPDATEUI,
+ function (event)
+ -- some of UPDATEUI events may be triggered as the result of editor updates
+ -- from subsequent events (like PAINTED, which happens in documentmap plugin).
+ -- the reason for the `processed` check is that it is not possible
+ -- to completely skip all of these updates as this causes the issue
+ -- of markup styling becoming visible after text deletion by Backspace.
+ -- to avoid this, we allow the first update after any updates caused
+ -- by real changes; the rest of UPDATEUI events are skipped.
+ -- (use direct comparison, as need to skip events that just update content)
+ if event:GetUpdated() == wxstc.wxSTC_UPDATE_CONTENT
+ and not next(editor.ev) then
+ if editor.processedUpdateContent > 1 then return end
+ else
+ editor.processedUpdateContent = 0
+ end
+ editor.processedUpdateContent = editor.processedUpdateContent + 1
+
+ PackageEventHandle("onEditorUpdateUI", editor, event)
+
+ if ide.osname ~= 'Windows' then updateStatusText(editor) end
+
+ editor:GotoPosDelayed()
+ updateBraceMatch(editor)
+ local minupdated
+ for _,iv in ipairs(editor.ev) do
+ local line = iv[1]
+ if not minupdated or line < minupdated then minupdated = line end
+ IndicateFunctionsOnly(editor,line,line+iv[2])
+ end
+ if minupdated then
+ local ok, res = pcall(IndicateAll, editor, minupdated)
+ if not ok then DisplayOutputLn("Internal error: ",res,minupdated) end
+ end
+ local firstvisible = editor:DocLineFromVisible(editor:GetFirstVisibleLine())
+ local lastline = math.min(editor:GetLineCount(),
+ firstvisible + editor:LinesOnScreen())
+ -- lastline - editor:LinesOnScreen() can get negative; fix it
+ local firstline = math.min(math.max(0, lastline - editor:LinesOnScreen()),
+ firstvisible)
+ MarkupStyle(editor,minupdated or firstline,lastline)
+ editor.ev = {}
+ end)
+
+ editor:Connect(wx.wxEVT_IDLE,
+ function (event)
+ while #editor.onidle > 0 do table.remove(editor.onidle)(editor) end
+ end)
+
+ editor:Connect(wx.wxEVT_LEFT_DOWN,
+ function (event)
+ if MarkupHotspotClick then
+ local position = editor:PositionFromPointClose(event:GetX(),event:GetY())
+ if position ~= wxstc.wxSTC_INVALID_POSITION then
+ if MarkupHotspotClick(position, editor) then return end
+ end
+ end
+
+ if event:ControlDown() and event:AltDown()
+ -- ide.wxver >= "2.9.5"; fix after GetModifiers is added to wxMouseEvent in wxlua
+ and not event:ShiftDown() and not event:MetaDown() then
+ local point = event:GetPosition()
+ local pos = editor:PositionFromPointClose(point.x, point.y)
+ local value = pos ~= wxstc.wxSTC_INVALID_POSITION and editor:ValueFromPosition(pos) or nil
+ local instances = value and indicateFindInstances(editor, value, pos+1)
+ if instances and instances[0] then
+ navigateToPosition(editor, pos, instances[0]-1, #value)
+ return
+ end
+ end
+ event:Skip()
+ end)
+
+ if edcfg.nomousezoom then
+ -- disable zoom using mouse wheel as it triggers zooming when scrolling
+ -- on OSX with kinetic scroll and then pressing CMD.
+ editor:Connect(wx.wxEVT_MOUSEWHEEL,
+ function (event)
+ if wx.wxGetKeyState(wx.WXK_CONTROL) then return end
+ event:Skip()
+ end)
+ end
+
+ local inhandler = false
+ editor:Connect(wx.wxEVT_SET_FOCUS,
+ function (event)
+ event:Skip()
+ if inhandler or ide.exitingProgram then return end
+ inhandler = true
+ PackageEventHandle("onEditorFocusSet", editor)
+ isFileAlteredOnDisk(editor)
+ inhandler = false
+ end)
+
+ editor:Connect(wx.wxEVT_KEY_DOWN,
+ function (event)
+ local keycode = event:GetKeyCode()
+ local mod = event:GetModifiers()
+ local first, last = 0, notebook:GetPageCount()-1
+ if PackageEventHandle("onEditorKeyDown", editor, event) == false then
+ -- this event has already been handled
+ elseif keycode == wx.WXK_ESCAPE then
+ if editor:CallTipActive() or editor:AutoCompActive() then
+ event:Skip()
+ elseif ide.findReplace:IsShown() then
+ ide.findReplace:Hide()
+ elseif ide:GetMainFrame():IsFullScreen() then
+ ShowFullScreen(false)
+ end
+ -- Ctrl-Home and Ctrl-End don't work on OSX with 2.9.5+; fix it
+ elseif ide.osname == 'Macintosh' and ide.wxver >= "2.9.5"
+ and (mod == wx.wxMOD_RAW_CONTROL or mod == (wx.wxMOD_RAW_CONTROL + wx.wxMOD_SHIFT))
+ and (keycode == wx.WXK_HOME or keycode == wx.WXK_END) then
+ local pos = keycode == wx.WXK_HOME and 0 or editor:GetLength()
+ if event:ShiftDown() -- mark selection and scroll to caret
+ then editor:SetCurrentPos(pos) editor:EnsureCaretVisible()
+ else editor:GotoPos(pos) end
+ elseif mod == wx.wxMOD_RAW_CONTROL and keycode == wx.WXK_PAGEUP
+ or mod == (wx.wxMOD_RAW_CONTROL + wx.wxMOD_SHIFT) and keycode == wx.WXK_TAB then
+ if notebook:GetSelection() == first
+ then notebook:SetSelection(last)
+ else notebook:AdvanceSelection(false) end
+ elseif mod == wx.wxMOD_RAW_CONTROL
+ and (keycode == wx.WXK_PAGEDOWN or keycode == wx.WXK_TAB) then
+ if notebook:GetSelection() == last
+ then notebook:SetSelection(first)
+ else notebook:AdvanceSelection(true) end
+ elseif (keycode == wx.WXK_DELETE or keycode == wx.WXK_BACK)
+ and (mod == wx.wxMOD_NONE) then
+ -- Delete and Backspace behave the same way for selected text
+ if #(editor:GetSelectedText()) > 0 then
+ editor:ClearAny()
+ else
+ local pos = editor:GetCurrentPos()
+ if keycode == wx.WXK_BACK then
+ pos = pos - 1
+ if pos < 0 then return end
+ end
+
+ -- check if the modification is to one of "invisible" characters.
+ -- if not, proceed with "normal" processing as there are other
+ -- events that may depend on Backspace, for example, re-calculating
+ -- auto-complete suggestions.
+ local style = bit.band(editor:GetStyleAt(pos), 31)
+ if not MarkupIsSpecial or not MarkupIsSpecial(style) then
+ -- if BACKSPACE is used at tab stop, with spaces for indentation,
+ -- and only whilespaces on the left, reduce indent
+ if edcfg.backspaceunindent and keycode == wx.WXK_BACK and not editor:GetUseTabs() then
+ -- get the line number from the *current* position of the cursor
+ local line = editor:LineFromPosition(pos+1)
+ local text = editor:GetLineDyn(line):sub(1, pos-editor:PositionFromLine(line)+1)
+ local tw = editor:GetIndent()
+ -- if on the tab stop position and only white spaces on the left
+ if text:find('^%s+$') and #text % tw == 0 then
+ editor:SetLineIndentation(line, editor:GetLineIndentation(line) - tw)
+ editor:GotoPos(pos+1-tw)
+ return
+ end
+ end
+ event:Skip()
+ return
+ end
+
+ editor:SetTargetStart(pos)
+ editor:SetTargetEnd(pos+1)
+ editor:ReplaceTarget("")
+ end
+ elseif mod == wx.wxMOD_ALT and keycode == wx.WXK_LEFT then
+ -- if no "jump back" is needed, then do normal processing as this
+ -- combination can be mapped to some action
+ if not navigateBack(editor) then event:Skip() end
+ elseif (keycode == wx.WXK_RETURN or keycode == wx.WXK_NUMPAD_ENTER)
+ and (mod == wx.wxMOD_CONTROL or mod == (wx.wxMOD_CONTROL + wx.wxMOD_SHIFT)) then
+ addOneLine(editor, mod == (wx.wxMOD_CONTROL + wx.wxMOD_SHIFT) and -1 or 0)
+ elseif ide.osname == "Unix" and ide.wxver >= "2.9.5"
+ and mod == wx.wxMOD_CONTROL and editor.ctrlcache[keycode] then
+ ide.frame:AddPendingEvent(wx.wxCommandEvent(
+ wx.wxEVT_COMMAND_MENU_SELECTED, editor.ctrlcache[keycode]))
+ else
+ if ide.osname == 'Macintosh' and mod == wx.wxMOD_META then
+ return -- ignore a key press if Command key is also pressed
+ end
+ event:Skip()
+ end
+ end)
+
+ local function selectAllInstances(instances, name, curpos)
+ local this
+ local idx = 0
+ for _, pos in pairs(instances) do
+ pos = pos - 1 -- positions are 0-based in Scintilla
+ if idx == 0 then
+ -- clear selections first as there seems to be a bug (Scintilla 3.2.3)
+ -- that doesn't reset selection after right mouse click.
+ editor:ClearSelections()
+ editor:SetSelection(pos, pos+#name)
+ else
+ editor:AddSelection(pos+#name, pos)
+ end
+
+ -- check if this is the current selection
+ if curpos >= pos and curpos <= pos+#name then this = idx end
+ idx = idx + 1
+ end
+ if this then editor:SetMainSelection(this) end
+ -- set the current name as the search value to make subsequence searches look for it
+ ide.findReplace:SetFind(name)
+ end
+
+ editor:Connect(wxstc.wxEVT_STC_DOUBLECLICK,
+ function(event)
+ -- only activate selection of instances on Ctrl/Cmd-DoubleClick
+ if event:GetModifiers() == wx.wxMOD_CONTROL then
+ local pos = event:GetPosition()
+ local value = pos ~= wxstc.wxSTC_INVALID_POSITION and editor:ValueFromPosition(pos) or nil
+ local instances = value and indicateFindInstances(editor, value, pos+1)
+ if instances and (instances[0] or #instances > 0) then
+ selectAllInstances(instances, value, pos)
+ return
+ end
+ end
+
+ event:Skip()
+ end)
+
+ editor:Connect(wxstc.wxEVT_STC_ZOOM,
+ function(event)
+ -- if Shift+Zoom is used, then zoom all editors, not just the current one
+ if wx.wxGetKeyState(wx.WXK_SHIFT) then
+ local zoom = editor:GetZoom()
+ for _, doc in pairs(openDocuments) do
+ -- check the editor zoom level to avoid recursion
+ if doc.editor:GetZoom() ~= zoom then doc.editor:SetZoom(zoom) end
+ end
+ end
+ event:Skip()
+ end)
+
+ local pos, value, instances
+ editor:Connect(wx.wxEVT_CONTEXT_MENU,
+ function (event)
+ local point = editor:ScreenToClient(event:GetPosition())
+ pos = editor:PositionFromPointClose(point.x, point.y)
+ value = pos ~= wxstc.wxSTC_INVALID_POSITION and editor:ValueFromPosition(pos) or nil
+ instances = value and indicateFindInstances(editor, value, pos+1)
+
+ local occurrences = (not instances or #instances == 0) and ""
+ or (" (%d)"):format(#instances+(instances[0] and 1 or 0))
+ local line = instances and instances[0] and editor:LineFromPosition(instances[0]-1)+1
+ local def = line and " ("..TR("on line %d"):format(line)..")" or ""
+ local selections = ide.wxver >= "2.9.5" and editor:GetSelections() or 1
+
+ local menu = wx.wxMenu {
+ { ID_UNDO, TR("&Undo") },
+ { ID_REDO, TR("&Redo") },
+ { },
+ { ID_CUT, TR("Cu&t") },
+ { ID_COPY, TR("&Copy") },
+ { ID_PASTE, TR("&Paste") },
+ { ID_SELECTALL, TR("Select &All") },
+ { },
+ { ID_GOTODEFINITION, TR("Go To Definition")..def },
+ { ID_RENAMEALLINSTANCES, TR("Rename All Instances")..occurrences },
+ { ID_REPLACEALLSELECTIONS, TR("Replace All Selections") },
+ { },
+ { ID_QUICKADDWATCH, TR("Add Watch Expression") },
+ { ID_QUICKEVAL, TR("Evaluate In Console") },
+ { ID_ADDTOSCRATCHPAD, TR("Add To Scratchpad") },
+ { ID_RUNTO, TR("Run To Cursor") },
+ }
+
+ menu:Enable(ID_GOTODEFINITION, instances and instances[0])
+ menu:Enable(ID_RENAMEALLINSTANCES, instances and (instances[0] or #instances > 0)
+ or editor:GetSelectionStart() ~= editor:GetSelectionEnd())
+ menu:Enable(ID_REPLACEALLSELECTIONS, selections > 1)
+ menu:Enable(ID_QUICKADDWATCH, value ~= nil)
+ menu:Enable(ID_QUICKEVAL, value ~= nil)
+
+ local debugger = ide.debugger
+ menu:Enable(ID_ADDTOSCRATCHPAD, debugger.scratchpad
+ and debugger.scratchpad.editors and not debugger.scratchpad.editors[editor])
+
+ -- disable calltips that could open over the menu
+ local dwelltime = editor:GetMouseDwellTime()
+ editor:SetMouseDwellTime(0) -- disable dwelling
+
+ -- cancel calltip if it's already shown as it interferes with popup menu
+ if editor:CallTipActive() then editor:CallTipCancel() end
+
+ PackageEventHandle("onMenuEditor", menu, editor, event)
+
+ editor:PopupMenu(menu)
+ editor:SetMouseDwellTime(dwelltime) -- restore dwelling
+ end)
+
+ editor:Connect(ID_RUNTO, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ if pos ~= wxstc.wxSTC_INVALID_POSITION then
+ ide:GetDebugger().runto(editor, editor:LineFromPosition(pos))
+ end
+ end)
+
+ editor:Connect(ID_GOTODEFINITION, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ if value and instances[0] then
+ navigateToPosition(editor, editor:GetCurrentPos(), instances[0]-1, #value)
+ end
+ end)
+
+ editor:Connect(ID_RENAMEALLINSTANCES, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ if value and pos then
+ if not (instances and (instances[0] or #instances > 0)) then
+ -- if multiple instances (of a variable) are not detected,
+ -- then simply find all instances of (selected) `value`
+ instances = {}
+ local length, pos = editor:GetLength(), 0
+ while true do
+ editor:SetTargetStart(pos)
+ editor:SetTargetEnd(length)
+ pos = editor:SearchInTarget(value)
+ if pos == -1 then break end
+ table.insert(instances, pos+1)
+ pos = pos + #value
+ end
+ end
+ selectAllInstances(instances, value, pos)
+ end
+ end)
+
+ editor:Connect(ID_REPLACEALLSELECTIONS, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ local main = editor:GetMainSelection()
+ local text = wx.wxGetTextFromUser(
+ TR("Enter replacement text"),
+ TR("Replace All Selections"),
+ editor:GetTextRangeDyn(editor:GetSelectionNStart(main), editor:GetSelectionNEnd(main))
+ )
+ if not text or text == "" then return end
+
+ editor:BeginUndoAction()
+ for s = 0, editor:GetSelections()-1 do
+ local selst, selend = editor:GetSelectionNStart(s), editor:GetSelectionNEnd(s)
+ editor:SetTargetStart(selst)
+ editor:SetTargetEnd(selend)
+ editor:ReplaceTarget(text)
+ editor:SetSelectionNStart(s, selst)
+ editor:SetSelectionNEnd(s, selst+#text)
+ end
+ editor:EndUndoAction()
+ editor:SetMainSelection(main)
+ end)
+
+ editor:Connect(ID_QUICKADDWATCH, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event) ide:AddWatch(value) end)
+
+ editor:Connect(ID_QUICKEVAL, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event) ShellExecuteCode(value) end)
+
+ editor:Connect(ID_ADDTOSCRATCHPAD, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event) DebuggerScratchpadOn(editor) end)
+
+ return editor
+end
+
+-- ----------------------------------------------------------------------------
+-- Add an editor to the notebook
+function AddEditor(editor, name)
+ assert(notebook:GetPageIndex(editor) == -1, "Editor being added is not in the notebook: failed")
+
+ -- set the document properties
+ local id = editor:GetId()
+ local document = setmetatable({}, ide.proto.Document)
+ document.editor = editor
+ document.fileName = name
+ document.filePath = nil
+ document.modTime = nil
+ document.isModified = false
+ openDocuments[id] = document
+
+ -- add page only after document is created as there may be handlers
+ -- that expect the document (for example, onEditorFocusSet)
+ if not notebook:AddPage(editor, name, true) then
+ openDocuments[id] = nil
+ return
+ else
+ document.index = notebook:GetPageIndex(editor)
+ return document
+ end
+end
+
+function GetSpec(ext,forcespec)
+ local spec = forcespec
+
+ -- search proper spec
+ -- allow forcespec for "override"
+ if ext and not spec then
+ for _,curspec in pairs(ide.specs) do
+ local exts = curspec.exts
+ if (exts) then
+ for _,curext in ipairs(exts) do
+ if (curext == ext) then
+ spec = curspec
+ break
+ end
+ end
+ if (spec) then
+ break
+ end
+ end
+ end
+ end
+ return spec
+end
+
+function SetupKeywords(editor, ext, forcespec, styles, font, fontitalic)
+ local lexerstyleconvert = nil
+ local spec = forcespec or GetSpec(ext)
+ -- found a spec setup lexers and keywords
+ if spec then
+ editor:SetLexer(spec.lexer or wxstc.wxSTC_LEX_NULL)
+ lexerstyleconvert = spec.lexerstyleconvert
+
+ if (spec.keywords) then
+ for i,words in ipairs(spec.keywords) do
+ editor:SetKeyWords(i-1,words)
+ end
+ end
+
+ editor.api = GetApi(spec.apitype or "none")
+ editor.spec = spec
+ else
+ editor:SetLexer(wxstc.wxSTC_LEX_NULL)
+ editor:SetKeyWords(0, "")
+
+ editor.api = GetApi("none")
+ editor.spec = ide.specs.none
+ end
+
+ -- need to set folding property after lexer is set, otherwise
+ -- the folds are not shown (wxwidgets 2.9.5)
+ if edcfg.fold then
+ editor:SetProperty("fold", "1")
+ editor:SetProperty("fold.html", "1")
+ editor:SetProperty("fold.compact", edcfg.foldcompact and "1" or "0")
+ editor:SetProperty("fold.comment", "1")
+ end
+
+ -- quickfix to prevent weird looks, otherwise need to update styling mechanism for cpp
+ -- cpp "greyed out" styles are styleid + 64
+ editor:SetProperty("lexer.cpp.track.preprocessor", "0")
+ editor:SetProperty("lexer.cpp.update.preprocessor", "0")
+
+ -- create italic font if only main font is provided
+ if font and not fontitalic then
+ fontitalic = wx.wxFont(font)
+ fontitalic:SetStyle(wx.wxFONTSTYLE_ITALIC)
+ end
+
+ StylesApplyToEditor(styles or ide.config.styles, editor,
+ font or ide.font.eNormal,fontitalic or ide.font.eItalic,lexerstyleconvert)
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/filetree.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/filetree.lua
new file mode 100644
index 0000000..940fed1
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/filetree.lua
@@ -0,0 +1,903 @@
+-- Copyright 2011-16 Paul Kulchenko, ZeroBrane LLC
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+
+ide.filetree = {
+ projdir = "",
+ projdirlist = {},
+ projdirpartmap = {},
+ projtreeCtrl = nil,
+ imglist = ide:CreateImageList("PROJECT",
+ "FOLDER", "FILE-KNOWN", "FILE-NORMAL", "FILE-NORMAL-START",
+ "FOLDER-MAPPED"),
+ settings = {extensionignore = {}, startfile = {}, mapped = {}},
+}
+local filetree = ide.filetree
+local iscaseinsensitive = wx.wxFileName("A"):SameAs(wx.wxFileName("a"))
+local pathsep = GetPathSeparator()
+local q = EscapeMagic
+local image = {
+ DIRECTORY = 0, FILEKNOWN = 1, FILEOTHER = 2, FILEOTHERSTART = 3,
+ DIRECTORYMAPPED = 4,
+}
+
+MergeSettings(filetree.settings, ide:AddPackage('core.filetree', {}):GetSettings())
+
+-- generic tree
+-- ------------
+
+local function getIcon(name, isdir)
+ local startfile = GetFullPathIfExists(FileTreeGetDir(),
+ filetree.settings.startfile[FileTreeGetDir()])
+ local known = GetSpec(GetFileExt(name))
+ local icon = isdir and image.DIRECTORY or known and image.FILEKNOWN or image.FILEOTHER
+ if startfile and startfile == name then icon = image.FILEOTHERSTART end
+ return icon
+end
+
+local function treeAddDir(tree,parent_id,rootdir)
+ local items = {}
+ local item, cookie = tree:GetFirstChild(parent_id)
+ while item:IsOk() do
+ items[tree:GetItemText(item) .. tree:GetItemImage(item)] = item
+ item, cookie = tree:GetNextChild(parent_id, cookie)
+ end
+
+ local cache = {}
+ local curr
+ local files = FileSysGetRecursive(rootdir)
+ local dirmapped = {}
+ if tree:IsRoot(parent_id) then
+ local mapped = filetree.settings.mapped[FileTreeGetDir()] or {}
+ table.sort(mapped)
+ -- insert into files at the sorted order
+ for i, v in ipairs(mapped) do
+ table.insert(files, i, v)
+ dirmapped[v] = true
+ end
+ end
+
+ for _, file in ipairs(files) do
+ local name, dir = file:match("([^"..pathsep.."]+)("..pathsep.."?)$")
+ local isdir = #dir>0
+ if isdir or not filetree.settings.extensionignore[GetFileExt(name)] then
+ local icon = getIcon(file, isdir)
+
+ -- keep full name for the mapped directories
+ if dirmapped[file] then name, icon = file, image.DIRECTORYMAPPED end
+
+ local item = items[name .. icon]
+ if item then -- existing item
+ -- keep deleting items until we find item
+ while true do
+ local next = (curr
+ and tree:GetNextSibling(curr)
+ or tree:GetFirstChild(parent_id))
+ if not next:IsOk() or name == tree:GetItemText(next) then
+ curr = next
+ break
+ end
+ tree:Delete(next)
+ end
+ else -- new item
+ curr = (curr
+ and tree:InsertItem(parent_id, curr, name, icon)
+ or tree:PrependItem(parent_id, name, icon))
+ if isdir then tree:SetItemHasChildren(curr, FileDirHasContent(file)) end
+ end
+ if curr:IsOk() then cache[iscaseinsensitive and name:lower() or name] = curr end
+ end
+ end
+
+ -- delete any leftovers (something that exists in the tree, but not on disk)
+ while true do
+ local next = (curr
+ and tree:GetNextSibling(curr)
+ or tree:GetFirstChild(parent_id))
+ if not next:IsOk() then break end
+ tree:Delete(next)
+ end
+
+ -- cache the mapping from names to tree items
+ if ide.wxver >= "2.9.5" then
+ local data = wx.wxLuaTreeItemData()
+ data:SetData(cache)
+ tree:SetItemData(parent_id, data)
+ end
+
+ tree:SetItemHasChildren(parent_id,
+ tree:GetChildrenCount(parent_id, false) > 0)
+end
+
+local function treeSetRoot(tree,rootdir)
+ tree:DeleteAllItems()
+ if (not wx.wxDirExists(rootdir)) then return end
+
+ local root_id = tree:AddRoot(rootdir, image.DIRECTORY)
+ tree:SetItemHasChildren(root_id, true) -- make sure that the item can expand
+ tree:Expand(root_id) -- this will also populate the tree
+end
+
+local function findItem(tree, match)
+ local node = tree:GetRootItem()
+ local label = tree:GetItemText(node)
+
+ local s, e
+ if iscaseinsensitive then
+ s, e = string.find(match:lower(), label:lower(), 1, true)
+ else
+ s, e = string.find(match, label, 1, true)
+ end
+ if not s or s ~= 1 then return end
+
+ for token in string.gmatch(string.sub(match,e+1), "[^%"..pathsep.."]+") do
+ local data = tree:GetItemData(node)
+ local cache = data and data:GetData()
+ if cache and cache[iscaseinsensitive and token:lower() or token] then
+ node = cache[iscaseinsensitive and token:lower() or token]
+ else
+ -- token is missing; may need to re-scan the folder; maybe new file
+ local dir = tree:GetItemFullName(node)
+ treeAddDir(tree,node,dir)
+
+ local item, cookie = tree:GetFirstChild(node)
+ while true do
+ if not item:IsOk() then return end -- not found
+ if tree:GetItemText(item) == token then
+ node = item
+ break
+ end
+ item, cookie = tree:GetNextChild(node, cookie)
+ end
+ end
+ end
+
+ -- this loop exits only when a match is found
+ return node
+end
+
+local function treeSetConnectorsAndIcons(tree)
+ tree:AssignImageList(filetree.imglist)
+
+ local function isIt(item, imgtype) return tree:GetItemImage(item) == imgtype end
+
+ function tree:IsDirectory(item_id) return isIt(item_id, image.DIRECTORY) end
+ function tree:IsDirMapped(item_id) return isIt(item_id, image.DIRECTORYMAPPED) end
+ function tree:IsFileKnown(item_id) return isIt(item_id, image.FILEKNOWN) end
+ function tree:IsFileOther(item_id) return isIt(item_id, image.FILEOTHER) end
+ function tree:IsFileStart(item_id) return isIt(item_id, image.FILEOTHERSTART) end
+ function tree:IsRoot(item_id) return not tree:GetItemParent(item_id):IsOk() end
+
+ function tree:FindItem(match)
+ return findItem(self, (wx.wxIsAbsolutePath(match) or match == '') and match
+ or MergeFullPath(ide:GetProject(), match))
+ end
+
+ function tree:GetItemFullName(item_id)
+ local tree = self
+ local str = tree:GetItemText(item_id)
+ local cur = str
+
+ while (#cur > 0) do
+ item_id = tree:GetItemParent(item_id)
+ if not item_id:IsOk() then break end
+ cur = tree:GetItemText(item_id)
+ if cur and #cur > 0 then str = MergeFullPath(cur, str) end
+ end
+ -- as root may already include path separator, normalize the path
+ local fullPath = wx.wxFileName(str)
+ fullPath:Normalize()
+ return fullPath:GetFullPath()
+ end
+
+ function tree:RefreshChildren(node)
+ node = node or tree:GetRootItem()
+ treeAddDir(tree,node,tree:GetItemFullName(node))
+ local item, cookie = tree:GetFirstChild(node)
+ while true do
+ if not item:IsOk() then return end
+ if tree:IsExpanded(item) then tree:RefreshChildren(item) end
+ item, cookie = tree:GetNextChild(node, cookie)
+ end
+ end
+
+ local function refreshAncestors(node)
+ -- when this method is called from END_EDIT, it causes infinite loop
+ -- on OSX (wxwidgets 2.9.5) as Delete in treeAddDir calls END_EDIT again.
+ -- disable handlers while the tree is populated and then enable back.
+ tree:SetEvtHandlerEnabled(false)
+ while node:IsOk() do
+ local dir = tree:GetItemFullName(node)
+ treeAddDir(tree,node,dir)
+ node = tree:GetItemParent(node)
+ end
+ tree:SetEvtHandlerEnabled(true)
+ end
+
+ function tree:ActivateItem(item_id)
+ local name = tree:GetItemFullName(item_id)
+
+ local event = wx.wxTreeEvent(wx.wxEVT_COMMAND_TREE_ITEM_ACTIVATED, item_id:GetValue())
+ if PackageEventHandle("onFiletreeActivate", tree, event, item_id) == false then
+ return
+ end
+
+ -- refresh the folder
+ if (tree:IsDirectory(item_id) or tree:IsDirMapped(item_id)) then
+ if wx.wxDirExists(name) then treeAddDir(tree,item_id,name)
+ else refreshAncestors(tree:GetItemParent(item_id)) end -- stale content
+ else -- open file
+ if wx.wxFileExists(name) then LoadFile(name,nil,true)
+ else refreshAncestors(tree:GetItemParent(item_id)) end -- stale content
+ end
+ end
+
+ local function unMapDir(dir)
+ local project = FileTreeGetDir()
+ local mapped = filetree.settings.mapped[project] or {}
+ for k, m in ipairs(mapped) do
+ if m == dir then table.remove(mapped, k) end
+ end
+ filetree.settings.mapped[project] = mapped
+ refreshAncestors(tree:GetRootItem())
+ end
+ local function mapDir()
+ local project = FileTreeGetDir()
+ local dirPicker = wx.wxDirDialog(ide.frame, TR("Choose a directory to map"),
+ project ~= "" and project or wx.wxGetCwd(), wx.wxDIRP_DIR_MUST_EXIST)
+ if dirPicker:ShowModal(true) ~= wx.wxID_OK then return end
+ local dir = wx.wxFileName.DirName(FixDir(dirPicker:GetPath())):GetFullPath()
+ local mapped = filetree.settings.mapped[project] or {}
+ for _, m in ipairs(mapped) do
+ if m == dir then return end -- already on the list
+ end
+ table.insert(mapped, dir)
+ filetree.settings.mapped[project] = mapped
+ refreshAncestors(tree:GetRootItem())
+ end
+
+ local empty = ""
+ local function renameItem(itemsrc, target)
+ local cache = type(itemsrc) == 'table' and itemsrc or nil
+ local isdir = not cache and tree:IsDirectory(itemsrc) or cache and cache.isdir or false
+ local isnew = not cache and tree:GetItemText(itemsrc) == empty or cache and cache.isnew or false
+ local source = cache and cache.fullname or tree:GetItemFullName(itemsrc)
+ local fn = wx.wxFileName(target)
+
+ -- check if the target is the same as the source;
+ -- SameAs check is not used here as "Test" and "test" are the same
+ -- on case insensitive systems, but need to be allowed in renaming.
+ if source == target then return end
+
+ local docs = {}
+ if not isnew then -- find if source is already opened in the editor
+ docs = (isdir
+ and ide:FindDocumentsByPartialPath(source)
+ or {ide:FindDocument(source)})
+ for _, doc in ipairs(docs) do
+ if not isdir and PackageEventHandle("onEditorPreSave", doc.editor, source) == false then
+ return false
+ end
+ if SaveModifiedDialog(doc.editor, true) == wx.wxID_CANCEL then return end
+ end
+ end
+
+ -- check if existing file/dir is going to be overwritten
+ local overwrite = ((wx.wxFileExists(target) or wx.wxDirExists(target))
+ and not wx.wxFileName(source):SameAs(fn))
+ if overwrite and not ApproveFileOverwrite() then return false end
+
+ if not fn:Mkdir(tonumber(755,8), wx.wxPATH_MKDIR_FULL) then
+ ReportError(TR("Unable to create directory '%s'."):format(target))
+ return false
+ end
+
+ if isnew then -- new directory or file; create manually
+ if (isdir and not wx.wxFileName.DirName(target):Mkdir(tonumber(755,8), wx.wxPATH_MKDIR_FULL))
+ or (not isdir and not FileWrite(target, "")) then
+ ReportError(TR("Unable to create file '%s'."):format(target))
+ return false
+ end
+ else -- existing directory or file; rename/move it
+ local ok, err = FileRename(source, target)
+ if not ok then
+ ReportError(TR("Unable to rename file '%s'."):format(source)
+ .."\nError: "..err)
+ return false
+ end
+ end
+
+ refreshAncestors(cache and cache.parent or tree:GetItemParent(itemsrc))
+ -- load file(s) into the same editor (if any); will also refresh the tree
+ if #docs > 0 then
+ for _, doc in ipairs(docs) do
+ local fullpath = doc.filePath
+ doc.filePath = nil -- remove path to avoid "file no longer exists" message
+ -- when moving folders, /foo/bar/file.lua can be replaced with
+ -- /foo/baz/bar/file.lua, so change /foo/bar to /foo/baz/bar
+ local path = (not iscaseinsensitive and fullpath:gsub(q(source), target)
+ or fullpath:lower():gsub(q(source:lower()), target))
+ local editor = LoadFile(path)
+ -- check if the file was loaded into another editor;
+ -- this is possible if "foo" is renamed to "bar" and both are opened;
+ -- if this happens, then "bar" is refreshed and "foo" can be closed.
+ if doc.editor:GetId() ~= editor:GetId() then ClosePage(doc.index) end
+ if not isdir and editor then PackageEventHandle("onEditorSave", editor) end
+ end
+ else -- refresh the tree and select the new item
+ local itemdst = tree:FindItem(target)
+ if itemdst then
+ refreshAncestors(tree:GetItemParent(itemdst))
+ tree:SelectItem(itemdst)
+ tree:EnsureVisible(itemdst)
+ tree:SetScrollPos(wx.wxHORIZONTAL, 0, true)
+ end
+ end
+
+ -- refresh the target if it's open and has been overwritten
+ if overwrite and not isdir then
+ local doc = ide:FindDocument(target)
+ if doc then LoadFile(doc:GetFilePath(), doc:GetEditor()) end
+ end
+
+ return true
+ end
+ local function deleteItem(item_id)
+ -- if delete is for mapped directory, unmap it instead
+ if tree:IsDirMapped(item_id) then
+ unMapDir(tree:GetItemText(item_id))
+ return
+ end
+
+ local isdir = tree:IsDirectory(item_id)
+ local source = tree:GetItemFullName(item_id)
+
+ if isdir and FileDirHasContent(source..pathsep) then return false end
+ if wx.wxMessageBox(
+ TR("Do you want to delete '%s'?"):format(source),
+ GetIDEString("editormessage"),
+ wx.wxYES_NO + wx.wxCENTRE, ide.frame) ~= wx.wxYES then return false end
+
+ if isdir then
+ if not wx.wxRmdir(source) then
+ ReportError(TR("Unable to delete directory '%s': %s")
+ :format(source, wx.wxSysErrorMsg()))
+ end
+ else
+ local doc = ide:FindDocument(source)
+ if doc then ClosePage(doc.index) end
+ if not wx.wxRemoveFile(source) then
+ ReportError(TR("Unable to delete file '%s': %s")
+ :format(source, wx.wxSysErrorMsg()))
+ end
+ end
+ refreshAncestors(tree:GetItemParent(item_id))
+ return true
+ end
+
+ tree:Connect(wx.wxEVT_COMMAND_TREE_ITEM_EXPANDING,
+ function (event)
+ local item_id = event:GetItem()
+ local dir = tree:GetItemFullName(item_id)
+ if wx.wxDirExists(dir) then treeAddDir(tree,item_id,dir) -- refresh folder
+ else refreshAncestors(tree:GetItemParent(item_id)) end -- stale content
+ return true
+ end)
+ tree:Connect(wx.wxEVT_COMMAND_TREE_ITEM_ACTIVATED,
+ function (event)
+ tree:ActivateItem(event:GetItem())
+ end)
+
+ local function saveSettings()
+ ide:AddPackage('core.filetree', {}):SetSettings(filetree.settings)
+ end
+
+ -- refresh the tree
+ local function refreshChildren()
+ tree:RefreshChildren()
+ -- now mark the current file (if it was previously disabled)
+ local editor = ide:GetEditor()
+ if editor then FileTreeMarkSelected(ide:GetDocument(editor):GetFilePath()) end
+ end
+
+ -- handle context menu
+ local function addItem(item_id, name, img)
+ local isdir = tree:IsDirectory(item_id)
+ local parent = isdir and item_id or tree:GetItemParent(item_id)
+ if isdir then tree:Expand(item_id) end -- expand to populate if needed
+
+ local item = tree:PrependItem(parent, name, img)
+ tree:SetItemHasChildren(parent, true)
+ -- temporarily disable expand as we don't need this node populated
+ tree:SetEvtHandlerEnabled(false)
+ tree:EnsureVisible(item)
+ tree:SetEvtHandlerEnabled(true)
+ return item
+ end
+
+ local function unsetStartFile()
+ local project = FileTreeGetDir()
+ local startfile = filetree.settings.startfile[project]
+ filetree.settings.startfile[project] = nil
+ if startfile then
+ local item_id = tree:FindItem(startfile)
+ if item_id and item_id:IsOk() then
+ tree:SetItemImage(item_id, getIcon(tree:GetItemFullName(item_id)))
+ end
+ end
+ end
+
+ local function setStartFile(item_id)
+ local project = FileTreeGetDir()
+ local startfile = tree:GetItemFullName(item_id):gsub(project, "")
+ filetree.settings.startfile[project] = startfile
+ tree:SetItemImage(item_id, getIcon(tree:GetItemFullName(item_id)))
+ end
+
+ tree:Connect(ID_NEWFILE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ tree:EditLabel(addItem(tree:GetSelection(), empty, image.FILEOTHER))
+ end)
+ tree:Connect(ID_NEWDIRECTORY, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ tree:EditLabel(addItem(tree:GetSelection(), empty, image.DIRECTORY))
+ end)
+ tree:Connect(ID_RENAMEFILE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() tree:EditLabel(tree:GetSelection()) end)
+ tree:Connect(ID_DELETEFILE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() deleteItem(tree:GetSelection()) end)
+ tree:Connect(ID_COPYFULLPATH, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() ide:CopyToClipboard(tree:GetItemFullName(tree:GetSelection())) end)
+ tree:Connect(ID_OPENEXTENSION, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ local fname = tree:GetItemFullName(tree:GetSelection())
+ local ext = '.'..wx.wxFileName(fname):GetExt()
+ local ft = wx.wxTheMimeTypesManager:GetFileTypeFromExtension(ext)
+ if ft then
+ local cmd = ft:GetOpenCommand(fname:gsub('"','\\"'))
+ local pid = wx.wxExecute(cmd, wx.wxEXEC_ASYNC)
+ if ide.osname == 'Windows' and pid and pid > 0 then
+ -- some programs on Windows (for example, PhotoViewer) accept
+ -- files with spaces in names ONLY if they are not in quotes.
+ -- wait for the process that failed to open file to finish
+ -- and retry without quotes.
+ wx.wxMilliSleep(250) -- 250ms seems enough; picked empirically.
+ if not wx.wxProcess.Exists(pid) then
+ local cmd = ft:GetOpenCommand(""):gsub('""%s*$', '')..fname
+ wx.wxExecute(cmd, wx.wxEXEC_ASYNC)
+ end
+ end
+ end
+ end)
+ tree:Connect(ID_REFRESH, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() refreshChildren() end)
+ tree:Connect(ID_SHOWLOCATION, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() ShowLocation(tree:GetItemFullName(tree:GetSelection())) end)
+ tree:Connect(ID_HIDEEXTENSION, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ local ext = GetFileExt(tree:GetItemText(tree:GetSelection()))
+ filetree.settings.extensionignore[ext] = true
+ saveSettings()
+ refreshChildren()
+ end)
+ tree:Connect(ID_SHOWEXTENSIONALL, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ filetree.settings.extensionignore = {}
+ saveSettings()
+ refreshChildren()
+ end)
+ tree:Connect(ID_SETSTARTFILE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ unsetStartFile()
+ setStartFile(tree:GetSelection())
+ saveSettings()
+ end)
+ tree:Connect(ID_UNSETSTARTFILE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ unsetStartFile()
+ saveSettings()
+ end)
+ tree:Connect(ID_MAPDIRECTORY, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ mapDir()
+ saveSettings()
+ end)
+ tree:Connect(ID_UNMAPDIRECTORY, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ unMapDir(tree:GetItemText(tree:GetSelection()))
+ saveSettings()
+ end)
+ tree:Connect(ID_PROJECTDIRFROMDIR, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ ProjectUpdateProjectDir(tree:GetItemFullName(tree:GetSelection()))
+ end)
+
+ tree:Connect(wx.wxEVT_COMMAND_TREE_ITEM_MENU,
+ function (event)
+ local item_id = event:GetItem()
+ tree:SelectItem(item_id)
+
+ local renamelabel = (tree:IsRoot(item_id)
+ and TR("&Edit Project Directory")
+ or TR("&Rename"))
+ local fname = tree:GetItemText(item_id)
+ local ext = GetFileExt(fname)
+ local startfile = filetree.settings.startfile[FileTreeGetDir()]
+ local menu = wx.wxMenu {
+ { ID_NEWFILE, TR("New &File") },
+ { ID_NEWDIRECTORY, TR("&New Directory") },
+ { },
+ { ID_RENAMEFILE, renamelabel..KSC(ID_RENAMEFILE) },
+ { ID_DELETEFILE, TR("&Delete")..KSC(ID_DELETEFILE) },
+ { ID_REFRESH, TR("Refresh") },
+ { },
+ { ID_HIDEEXTENSION, TR("Hide '.%s' Files"):format(ext) },
+ { },
+ { ID_SETSTARTFILE, TR("Set As Start File") },
+ { ID_UNSETSTARTFILE, TR("Unset '%s' As Start File"):format(startfile or "<none>") },
+ { },
+ { ID_MAPDIRECTORY, TR("Map Directory...") },
+ { ID_UNMAPDIRECTORY, TR("Unmap Directory") },
+ { ID_OPENEXTENSION, TR("Open With Default Program") },
+ { ID_COPYFULLPATH, TR("Copy Full Path") },
+ { ID_SHOWLOCATION, TR("Show Location") },
+ }
+ local extlist = {
+ {},
+ { ID_SHOWEXTENSIONALL, TR("Show All Files"), TR("Show all files") },
+ }
+ for ext in pairs(filetree.settings.extensionignore) do
+ local id = ID("filetree.showextension."..ext)
+ table.insert(extlist, 1, {id, '.'..ext})
+ menu:Connect(id, wx.wxEVT_COMMAND_MENU_SELECTED, function()
+ filetree.settings.extensionignore[ext] = nil
+ saveSettings()
+ refreshChildren()
+ end)
+ end
+ local _, _, hideextpos = ide:FindMenuItem(ID_HIDEEXTENSION, menu)
+ assert(hideextpos, "Can't find HideExtension menu item")
+ menu:Insert(hideextpos+1, wx.wxMenuItem(menu, ID_SHOWEXTENSION,
+ TR("Show Hidden Files"), TR("Show files previously hidden"),
+ wx.wxITEM_NORMAL, wx.wxMenu(extlist)))
+
+ local projectdirectorymenu = wx.wxMenu {
+ { },
+ {ID_PROJECTDIRCHOOSE, TR("Choose...")..KSC(ID_PROJECTDIRCHOOSE), TR("Choose a project directory")},
+ {ID_PROJECTDIRFROMDIR, TR("Set To Selected Directory")..KSC(ID_PROJECTDIRFROMDIR), TR("Set project directory to the selected one")},
+ }
+ local projectdirectory = wx.wxMenuItem(menu, ID_PROJECTDIR,
+ TR("Project Directory"), TR("Set the project directory to be used"),
+ wx.wxITEM_NORMAL, projectdirectorymenu)
+ local _, _, unmapdirpos = ide:FindMenuItem(ID_UNMAPDIRECTORY, menu)
+ assert(unmapdirpos, "Can't find UnMapDirectory menu item")
+ menu:Insert(unmapdirpos+1, projectdirectory)
+ FileTreeProjectListUpdate(projectdirectorymenu, 0)
+
+ -- disable Delete on non-empty directories
+ local isdir = tree:IsDirectory(item_id)
+ local ismapped = tree:IsDirMapped(item_id)
+ menu:Destroy(ismapped and ID_MAPDIRECTORY or ID_UNMAPDIRECTORY)
+ if not startfile then menu:Destroy(ID_UNSETSTARTFILE) end
+ if ismapped then menu:Enable(ID_RENAMEFILE, false) end
+ if isdir then
+ local source = tree:GetItemFullName(item_id)
+ menu:Enable(ID_DELETEFILE, not FileDirHasContent(source..pathsep))
+ menu:Enable(ID_OPENEXTENSION, false)
+ menu:Enable(ID_HIDEEXTENSION, false)
+ else
+ local ft = wx.wxTheMimeTypesManager:GetFileTypeFromExtension('.'..ext)
+ menu:Enable(ID_OPENEXTENSION, ft and #ft:GetOpenCommand("") > 0)
+ menu:Enable(ID_HIDEEXTENSION, not filetree.settings.extensionignore[ext])
+ menu:Enable(ID_PROJECTDIRFROMDIR, false)
+ end
+ menu:Enable(ID_SETSTARTFILE, tree:IsFileOther(item_id) or tree:IsFileKnown(item_id))
+ menu:Enable(ID_SHOWEXTENSION, next(filetree.settings.extensionignore) ~= nil)
+
+ PackageEventHandle("onMenuFiletree", menu, tree, event)
+
+ -- stopping/restarting garbage collection is generally not needed,
+ -- but on Linux not stopping is causing crashes (wxwidgets 2.9.5 and 3.1.0)
+ -- when symbol indexing is done while popup menu is open (with gc methods in the trace).
+ -- this only happens when EVT_IDLE is called when popup menu is open.
+ collectgarbage("stop")
+
+ -- stopping UI updates is generally not needed as well,
+ -- but it's causing a crash on OSX (wxwidgets 2.9.5 and 3.1.0)
+ -- when symbol indexing is done while popup menu is open, so it's disabled
+ local interval = wx.wxUpdateUIEvent.GetUpdateInterval()
+ wx.wxUpdateUIEvent.SetUpdateInterval(-1) -- don't update
+
+ tree:PopupMenu(menu)
+ wx.wxUpdateUIEvent.SetUpdateInterval(interval)
+ collectgarbage("restart")
+ end)
+
+ tree:Connect(wx.wxEVT_RIGHT_DOWN,
+ function (event)
+ local item_id = tree:HitTest(event:GetPosition())
+ if PackageEventHandle("onFiletreeRDown", tree, event, item_id) == false then
+ return
+ end
+ event:Skip()
+ end)
+
+ -- toggle a folder on a single click
+ tree:Connect(wx.wxEVT_LEFT_DOWN,
+ function (event)
+ -- only toggle if this is a folder and the click is on the item line
+ -- (exclude the label as it's used for renaming and dragging)
+ local mask = (wx.wxTREE_HITTEST_ONITEMINDENT
+ + wx.wxTREE_HITTEST_ONITEMICON + wx.wxTREE_HITTEST_ONITEMRIGHT)
+ local item_id, flags = tree:HitTest(event:GetPosition())
+
+ if PackageEventHandle("onFiletreeLDown", tree, event, item_id) == false then
+ return
+ end
+
+ if item_id and bit.band(flags, mask) > 0 then
+ if tree:IsDirectory(item_id) then
+ tree:Toggle(item_id)
+ tree:SelectItem(item_id)
+ else
+ local name = tree:GetItemFullName(item_id)
+ if wx.wxFileExists(name) then LoadFile(name,nil,true) end
+ end
+ else
+ event:Skip()
+ end
+ return true
+ end)
+ local parent
+ tree:Connect(wx.wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT,
+ function (event)
+ local itemsrc = event:GetItem()
+ parent = tree:GetItemParent(itemsrc)
+ if not itemsrc:IsOk() or tree:IsDirMapped(itemsrc) then event:Veto() end
+ end)
+ tree:Connect(wx.wxEVT_COMMAND_TREE_END_LABEL_EDIT,
+ function (event)
+ -- veto the event to keep the original label intact as the tree
+ -- is going to be refreshed with the correct names.
+ event:Veto()
+
+ local itemsrc = event:GetItem()
+ if not itemsrc:IsOk() then return end
+
+ local label = event:GetLabel():gsub("^%s+$","") -- clean all spaces
+
+ -- edited the root element; set the new project directory if needed
+ local cancelled = event:IsEditCancelled()
+ if tree:IsRoot(itemsrc) then
+ if not cancelled and wx.wxDirExists(label) then
+ ProjectUpdateProjectDir(label)
+ end
+ return
+ end
+
+ if not parent or not parent:IsOk() then return end
+ local target = MergeFullPath(tree:GetItemFullName(parent), label)
+ if cancelled or label == empty then refreshAncestors(parent)
+ elseif target then
+ -- normally, none of this caching would be needed as `renameItem`
+ -- would be called to check if the item can be renamed;
+ -- however, as it may open a dialog box, on Linux it's causing a crash
+ -- (caused by the same END_LABEL_EDIT even triggered one more time),
+ -- so to protect from that, `renameItem` is called from IDLE event.
+ -- Unfortunately, by that time, the filetree item (`itemsrc`) may
+ -- already have incorrect state (as it's removed from the tree),
+ -- so its properties need to be cached to be used from IDLE event.
+ local cache = {
+ isdir = tree:IsDirectory(itemsrc),
+ isnew = tree:GetItemText(itemsrc) == empty,
+ fullname = tree:GetItemFullName(itemsrc),
+ parent = parent,
+ }
+ ide:DoWhenIdle(function()
+ if not renameItem(cache, target) then refreshAncestors(parent) end
+ end)
+ end
+ end)
+
+ local itemsrc
+ tree:Connect(wx.wxEVT_COMMAND_TREE_BEGIN_DRAG,
+ function (event)
+ if ide.config.filetree.mousemove and tree:GetItemParent(event:GetItem()):IsOk() then
+ itemsrc = event:GetItem()
+ event:Allow()
+ end
+ end)
+ tree:Connect(wx.wxEVT_COMMAND_TREE_END_DRAG,
+ function (event)
+ local itemdst = event:GetItem()
+ if not itemdst:IsOk() or not itemsrc:IsOk() then return end
+
+ -- check if itemdst is a folder
+ local target = tree:GetItemFullName(itemdst)
+ if wx.wxDirExists(target) then
+ local source = tree:GetItemFullName(itemsrc)
+ -- check if moving the directory and target is a subfolder of source
+ if (target..pathsep):find("^"..q(source)..pathsep) then return end
+ renameItem(itemsrc, MergeFullPath(target, tree:GetItemText(itemsrc)))
+ end
+ end)
+end
+
+-- project
+local projtree = wx.wxTreeCtrl(ide.frame, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxDefaultSize,
+ wx.wxTR_HAS_BUTTONS + wx.wxTR_SINGLE + wx.wxTR_LINES_AT_ROOT
+ + wx.wxTR_EDIT_LABELS + wx.wxNO_BORDER)
+projtree:SetFont(ide.font.fNormal)
+filetree.projtreeCtrl = projtree
+
+ide:GetProjectNotebook():AddPage(projtree, TR("Project"), true)
+
+-- proj connectors
+-- ---------------
+
+treeSetConnectorsAndIcons(projtree)
+
+-- proj functions
+-- ---------------
+
+function filetree:updateProjectDir(newdir)
+ if (not newdir) or not wx.wxDirExists(newdir) then return end
+ local dirname = wx.wxFileName.DirName(newdir)
+
+ if filetree.projdir and #filetree.projdir > 0
+ and dirname:SameAs(wx.wxFileName.DirName(filetree.projdir)) then return end
+
+ -- strip the last path separator if any
+ local newdir = dirname:GetPath(wx.wxPATH_GET_VOLUME)
+
+ -- save the current interpreter as it may be reset in onProjectClose
+ -- when the project event handlers manipulates interpreters
+ local intfname = ide.interpreter and ide.interpreter.fname
+
+ if filetree.projdir and #filetree.projdir > 0 then
+ PackageEventHandle("onProjectClose", filetree.projdir)
+ end
+
+ PackageEventHandle("onProjectPreLoad", newdir)
+
+ if ide.config.projectautoopen and filetree.projdir then
+ StoreRestoreProjectTabs(filetree.projdir, newdir, intfname)
+ end
+
+ filetree.projdir = newdir
+ filetree.projdirpartmap = {}
+
+ PrependStringToArray(
+ filetree.projdirlist,
+ newdir,
+ ide.config.projecthistorylength,
+ function(s1, s2) return dirname:SameAs(wx.wxFileName.DirName(s2)) end)
+
+ ProjectUpdateProjectDir(newdir,true)
+ treeSetRoot(projtree,newdir)
+
+ -- sync with the current editor window and activate selected file
+ local editor = GetEditor()
+ if editor then FileTreeMarkSelected(ide:GetDocument(editor):GetFilePath()) end
+
+ -- refresh Recent Projects menu item
+ ide.frame:AddPendingEvent(wx.wxUpdateUIEvent(ID_RECENTPROJECTS))
+
+ PackageEventHandle("onProjectLoad", newdir)
+end
+
+function FileTreeGetDir()
+ return (filetree.projdir and #filetree.projdir > 0
+ and wx.wxFileName.DirName(filetree.projdir):GetFullPath() or nil)
+end
+
+function FileTreeSetProjects(tab)
+ filetree.projdirlist = tab
+ if (tab and tab[1]) then
+ filetree:updateProjectDir(tab[1])
+ end
+end
+
+function FileTreeGetProjects()
+ return filetree.projdirlist
+end
+
+local function getProjectLabels()
+ local labels = {}
+ local fmt = ide.config.format.menurecentprojects or '%f'
+ for _, proj in ipairs(FileTreeGetProjects()) do
+ local config = ide.session.projects[proj]
+ local intfname = config and config[2] and config[2].interpreter or ide.interpreter:GetFileName()
+ local interpreter = intfname and ide.interpreters[intfname]
+ local parts = wx.wxFileName(proj..pathsep):GetDirs()
+ table.insert(labels, ExpandPlaceholders(fmt, {
+ f = proj,
+ i = interpreter and interpreter:GetName() or (intfname or '')..'?',
+ s = parts[#parts] or '',
+ }))
+ end
+ return labels
+end
+
+function FileTreeProjectListClear()
+ -- remove all items from the list except the current one
+ filetree.projdirlist = {FileTreeGetDir()}
+end
+
+function FileTreeProjectListUpdate(menu, items)
+ -- protect against recent project menu not being present
+ if not ide:FindMenuItem(ID_RECENTPROJECTS) then return end
+
+ local list = getProjectLabels()
+ for i=#list, 1, -1 do
+ local id = ID("file.recentprojects."..i)
+ local label = list[i]
+ if i <= items then -- this is an existing item; update the label
+ menu:FindItem(id):SetItemLabel(label)
+ else -- need to add an item
+ local item = wx.wxMenuItem(menu, id, label, "")
+ menu:Insert(items, item)
+ ide.frame:Connect(id, wx.wxEVT_COMMAND_MENU_SELECTED, function()
+ wx.wxSafeYield() -- let the menu on screen (if any) disappear
+ ProjectUpdateProjectDir(FileTreeGetProjects()[i])
+ end)
+ end
+ -- disable the currently selected project
+ if i == 1 then menu:Enable(id, false) end
+ end
+ for i=items, #list+1, -1 do -- delete the rest if the list got shorter
+ menu:Delete(menu:FindItemByPosition(i-1))
+ end
+ return #list
+end
+
+local curr_file
+function FileTreeMarkSelected(file)
+ if not file or not filetree.projdir or #filetree.projdir == 0 then return end
+
+ local item_id = wx.wxIsAbsolutePath(file) and projtree:FindItem(file)
+
+ -- if the select item is different from the current one
+ -- or the current one is the same, but not bold (which may happen when
+ -- the project is changed to one that includes the current item)
+ if curr_file ~= file
+ or item_id and not projtree:IsBold(item_id) then
+ if curr_file then
+ local curr_id = wx.wxIsAbsolutePath(curr_file) and projtree:FindItem(curr_file)
+ if curr_id and projtree:IsBold(curr_id) then
+ projtree:SetItemBold(curr_id, false)
+ end
+ end
+ if item_id then
+ projtree:EnsureVisible(item_id)
+ projtree:SetScrollPos(wx.wxHORIZONTAL, 0, true)
+ projtree:SetItemBold(item_id, true)
+ end
+ curr_file = file
+ if ide.wxver < "2.9.5" and ide.osname == 'Macintosh' then
+ projtree:Refresh()
+ end
+ end
+end
+
+function FileTreeFindByPartialName(name)
+ -- check if it's already cached
+ if filetree.projdirpartmap[name] then return filetree.projdirpartmap[name] end
+
+ -- this function may get a partial name that starts with ... and has
+ -- an abbreviated path (as generated by stack traces);
+ -- remove starting "..." if any and escape
+ local pattern = q(name:gsub("^%.%.%.","")):gsub("[\\/]", "[\\/]").."$"
+ local lpattern = pattern:lower()
+
+ for _, file in ipairs(FileSysGetRecursive(filetree.projdir, true)) do
+ if file:find(pattern) or iscaseinsensitive and file:lower():find(lpattern) then
+ filetree.projdirpartmap[name] = file
+ return file
+ end
+ end
+ return
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/findreplace.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/findreplace.lua
new file mode 100644
index 0000000..3159585
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/findreplace.lua
@@ -0,0 +1,1275 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Lomtik Software (J. Winwood & John Labenski)
+-- Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+local searchpanel = 'searchpanel'
+local q = EscapeMagic
+local unpack = table.unpack or unpack
+ide.findReplace = {
+ panel = nil, -- the control for find/replace
+ replace = false, -- is it a find or replace
+ infiles = false,
+ backfocus = nil, -- editor and position to return focus to
+ cureditor = nil, -- the editor being searched
+ reseditor = nil, -- the editor for search results
+ oveditor = nil, -- the editor is used for search during find-in-files
+ findCtrl = nil, -- the control that has the search text
+ replaceCtrl = nil, -- the control that has the replace text
+ scopeText = nil,
+ foundString = false, -- was the string found for the last search
+ curfilename = "", -- for search in files
+ inselection = false,
+ occurrences = 0,
+ files = 0,
+
+ settings = {
+ flags = {
+ WholeWord = false, -- match whole words
+ MatchCase = false, -- case sensitive
+ RegularExpr = false, -- use regex
+ Wrap = true, -- search wraps around
+ Down = true, -- search downwards in doc
+ Context = true, -- include context in search results
+ SubDirs = true, -- search in subdirectories
+ MultiResults = false, -- show multiple result tabs
+ },
+ flist = {},
+ rlist = {},
+ slist = {},
+ },
+
+ -- HasText() is there a string to search for
+ -- GetSelection() get currently selected string if it's on one line
+ -- Find(reverse) find the text
+ -- Show(replace) create the dialog
+ -- GetEditor() which editor to use
+}
+local findReplace = ide.findReplace
+local NOTFOUND = -1
+local replaceHintText = '<replace with>'
+local sep = ';'
+
+function findReplace:GetEditor(reset)
+ if reset or not ide:IsValidCtrl(self.cureditor) then self.cureditor = nil end
+ self.cureditor = ide:GetEditorWithLastFocus() or self.cureditor
+ return self.oveditor or self.cureditor or GetEditor()
+end
+
+-------------------- Find replace dialog
+
+local function setSearchFlags(editor)
+ local flags = wxstc.wxSTC_FIND_POSIX
+ local f = findReplace.settings.flags
+ if f.WholeWord then flags = flags + wxstc.wxSTC_FIND_WHOLEWORD end
+ if f.MatchCase then flags = flags + wxstc.wxSTC_FIND_MATCHCASE end
+ if f.RegularExpr then flags = flags + wxstc.wxSTC_FIND_REGEXP end
+ editor:SetSearchFlags(flags)
+end
+
+local function setTarget(editor, flags)
+ flags = flags or {}
+ local fDown, fAll, fWrap = flags.Down, flags.All, flags.Wrap
+ local len = editor:GetLength()
+ local selStart, selEnd = editor:GetSelectionStart(), editor:GetSelectionEnd()
+ local s, e
+ if fDown then
+ e = flags.EndPos or len
+ s = math.min(e, math.max(flags.StartPos or 0, iff(fAll, selStart, selEnd)))
+ else -- reverse the range for the backward search
+ e = flags.StartPos or 0
+ s = math.max(e, math.min(flags.EndPos or len, iff(fAll, selEnd, selStart)))
+ end
+ -- if wrap around and search all requested, then search the entire document
+ if fAll and fWrap then s, e = 0, len end
+ editor:SetTargetStart(s)
+ editor:SetTargetEnd(e)
+ return e
+end
+
+function findReplace:IsPreview(editor)
+ local ok, ispreview = pcall(function() return editor and editor.searchpreview end)
+ return ok and ispreview and true or false
+end
+
+function findReplace:CanSave(editor)
+ return editor and editor:GetModify() and self:IsPreview(editor) and editor or nil
+end
+
+function findReplace:HasText()
+ if not self.panel then self:createPanel() end
+ local findText = self.findCtrl:GetValue()
+ return findText ~= nil and #findText > 0 and findText or nil
+end
+
+function findReplace:SetStatus(msg)
+ if self.status then self.status:SetLabel(msg) end
+end
+
+function findReplace:SetFind(text)
+ if not self.panel then self:createPanel() end
+ local ctrl = self.findCtrl
+ if text and ctrl then
+ if ctrl:GetValue() ~= text then ctrl:ChangeValue(text) end
+ return text
+ end
+ return
+end
+
+function findReplace:GetFind(...) return self:HasText() end
+
+function findReplace:GetFlags() return self.settings.flags end
+
+function findReplace:SetReplace(text)
+ if not self.panel then self:createPanel() end
+ local ctrl = self.replaceCtrl
+ if text and ctrl then
+ if ctrl:GetValue() ~= text then ctrl:ChangeValue(text) end
+ return text
+ end
+ return
+end
+
+function findReplace:GetScope()
+ local scopeval = self.scope:GetValue()
+ local dir, mask = scopeval:match(('([^%s]*)%s%%s*(.+)'):format(sep,sep))
+ if not dir then dir = scopeval end
+ -- trip leading/trailing spaces from the directory
+ dir = dir:gsub("^%s+",""):gsub("%s+$","")
+ -- if the directory doesn't exist, treat it as the extension(s)
+ if not mask and not wx.wxDirExists(dir) and dir:find('%*') then
+ dir, mask = ide:GetProject() or wx.wxGetCwd(), (#dir > 0 and dir or nil)
+ end
+ return dir, mask
+end
+
+function findReplace:SetScope(dir, mask)
+ return dir .. (mask and (sep..' '..mask) or "")
+end
+
+function findReplace:GetScopeMRU(head)
+ local patt, match = "^"..q(head)
+ for _, v in ipairs(findReplace.settings.slist) do
+ if v:find(patt) then match = v; break end
+ end
+ return match
+end
+
+function findReplace:GetWordAtCaret()
+ local editor = self:GetEditor()
+ if editor then
+ local pos = editor:GetCurrentPos()
+ local text = editor:GetTextRangeDyn( -- try to select a word under caret
+ editor:WordStartPosition(pos, true), editor:WordEndPosition(pos, true))
+ if #text == 0 then
+ editor:GetTextRangeDyn( -- try to select a non-word under caret
+ editor:WordStartPosition(pos, false), editor:WordEndPosition(pos, false))
+ end
+ return #text > 0 and text or nil
+ end
+ return
+end
+
+function findReplace:GetSelection()
+ local editor = self:GetEditor()
+ if editor then
+ local startSel = editor:GetSelectionStart()
+ local endSel = editor:GetSelectionEnd()
+ if (startSel ~= endSel)
+ and (editor:LineFromPosition(startSel) == editor:LineFromPosition(endSel)) then
+ return editor:GetTextRangeDyn(startSel, endSel)
+ end
+ end
+ return
+end
+
+function findReplace:Find(reverse)
+ if not self.panel then self:createPanel() end
+ local findText = self.findCtrl:GetValue()
+
+ local msg = ""
+ local editor = self:GetEditor()
+ if editor and self:HasText() then
+ local fDown = iff(reverse, not self:GetFlags().Down, self:GetFlags().Down)
+ local bf = self.inselection and self.backfocus or {}
+ setSearchFlags(editor)
+ setTarget(editor, {Down = fDown, StartPos = bf.spos, EndPos = bf.epos})
+ local posFind = editor:SearchInTarget(findText)
+ if (posFind == NOTFOUND) and self:GetFlags().Wrap then
+ editor:SetTargetStart(iff(fDown, bf.spos or 0, bf.epos or editor:GetLength()))
+ editor:SetTargetEnd(iff(fDown, bf.epos or editor:GetLength(), bf.spos or 0))
+ posFind = editor:SearchInTarget(findText)
+ msg = (self.inselection
+ and TR("Reached end of selection and wrapped around.")
+ or TR("Reached end of text and wrapped around.")
+ )
+ end
+ if posFind == NOTFOUND then
+ self.foundString = false
+ msg = TR("Text not found.")
+ else
+ self.foundString = true
+ local start = editor:GetTargetStart()
+ local finish = editor:GetTargetEnd()
+ editor:ShowPosEnforcePolicy(finish)
+ editor:SetSelection(start, finish)
+ end
+ end
+ self:SetStatus(msg)
+ return self.foundString
+end
+
+-- returns true if something was found
+-- [inFileRegister(pos)] passing function will
+-- register every position item was found
+
+function findReplace:FindAll(inFileRegister)
+ if not self.panel then self:createPanel() end
+ local findText = self.findCtrl:GetValue()
+
+ local found = false
+ local editor = self:GetEditor()
+ if editor and self:HasText() then
+ local e = setTarget(editor, {All = true, Wrap = true})
+
+ setSearchFlags(editor)
+ while true do
+ local posFind = editor:SearchInTarget(findText)
+ if posFind == NOTFOUND then break end
+ inFileRegister(posFind, editor:GetTargetEnd()-posFind)
+ editor:SetTargetStart(editor:GetTargetEnd())
+ editor:SetTargetEnd(e)
+ found = true
+ end
+ if inFileRegister and found then inFileRegister() end
+ end
+
+ return found
+end
+
+local indicator = {
+ SEARCHMATCH = ide:GetIndicator("core.searchmatch"),
+}
+
+-- returns true if replacements were done
+function findReplace:Replace(fReplaceAll, resultsEditor)
+ if not self.panel then self:createPanel() end
+
+ local findText = self.findCtrl:GetValue()
+ local replaceText = self.replaceCtrl:GetValue()
+ if replaceText == replaceHintText then replaceText = "" end
+
+ local replaced = false
+ local editor = resultsEditor or self:GetEditor()
+ if editor and self:HasText() then
+ -- don't replace in read-only editors
+ if editor:GetReadOnly() then
+ self:SetStatus(TR("Can't replace in read-only text."))
+ return false
+ end
+
+ -- in the preview results always replace in the entire file
+ local bf = self.inselection and self.backfocus
+ local endTarget = (resultsEditor and setTarget(editor, {All = true, Wrap = true})
+ -- when selection is marked, only replace in the selection
+ or (bf and setTarget(editor, {Down = self:GetFlags().Down, All = fReplaceAll, StartPos = bf.spos, EndPos = bf.epos}))
+ -- in all other cases, replace as selected
+ or setTarget(editor, {Down = self:GetFlags().Down, All = fReplaceAll, Wrap = self:GetFlags().Wrap})
+ )
+
+ if fReplaceAll then
+ if resultsEditor then editor:SetIndicatorCurrent(indicator.SEARCHMATCH) end
+
+ setSearchFlags(editor)
+ local occurrences = 0
+ local posFind = editor:SearchInTarget(findText)
+ if posFind ~= NOTFOUND then
+ editor:BeginUndoAction()
+ while posFind ~= NOTFOUND do
+ local length = editor:GetLength()
+ -- if replace-in-files (resultsEditor) is being done,
+ -- then check that the match starts with %d+:
+ local match = true
+ if resultsEditor then
+ local line = editor:LineFromPosition(posFind)
+ local _, _, prefix = editor:GetLineDyn(line):find("^(%s*%d+: )")
+ match = prefix and posFind >= editor:PositionFromLine(line)+#prefix
+ end
+ if match then
+ local replaced = self:GetFlags().RegularExpr
+ and editor:ReplaceTargetRE(replaceText)
+ or editor:ReplaceTarget(replaceText)
+
+ -- mark replaced text
+ if resultsEditor then editor:IndicatorFillRange(posFind, replaced) end
+ occurrences = occurrences + 1
+ end
+
+ editor:SetTargetStart(editor:GetTargetEnd())
+ -- adjust the endTarget as the position could have changed;
+ -- can't simply subtract text length as it could be a regexp
+ local adjusted = editor:GetLength() - length
+ endTarget = endTarget + adjusted
+ -- also adjust the selection as the end marker can move after replacement
+ if bf and bf.epos then bf.epos = bf.epos + adjusted end
+ editor:SetTargetEnd(endTarget)
+ posFind = editor:SearchInTarget(findText)
+ end
+ editor:EndUndoAction()
+ replaced = true
+ end
+ self:SetStatus(
+ TR("Replaced %d instance.", occurrences):format(occurrences))
+ else
+ editor:TargetFromSelection()
+ -- check if there is anything selected as well as the user can
+ -- move the cursor after successful search
+ if editor:GetSelectionStart() ~= editor:GetSelectionEnd()
+ -- check that the current selection matches what's being searched for
+ and editor:SearchInTarget(findText) ~= NOTFOUND then
+ local length = editor:GetLength()
+ local start = editor:GetSelectionStart()
+ local replaced = self:GetFlags().RegularExpr
+ and editor:ReplaceTargetRE(replaceText)
+ or editor:ReplaceTarget(replaceText)
+ local adjusted = editor:GetLength() - length
+ if bf and bf.epos then bf.epos = bf.epos + adjusted end
+
+ editor:SetSelection(start, start + replaced)
+ self.foundString = false
+
+ replaced = true
+ end
+ self:Find()
+ end
+ end
+
+ return replaced
+end
+
+local oldline
+local FILE_MARKER = ide:GetMarker("searchmatchfile")
+local FILE_MARKER_VALUE = 2^FILE_MARKER
+local function getRawLine(ed, line) return (ed:GetLineDyn(line):gsub("[\n\r]+$","")) end
+local function onFileRegister(pos, length)
+ local editor = findReplace.oveditor
+ local reseditor = findReplace.reseditor
+ local posline = pos and editor:LineFromPosition(pos) + 1
+ local text = ""
+ local cfg = ide.config.search
+ local contextb = findReplace:GetFlags().Context and cfg.contextlinesbefore or 0
+ local contexta = findReplace:GetFlags().Context and cfg.contextlinesafter or 0
+ local lines = reseditor:GetLineCount() -- current number of lines
+
+ -- check if there is another match on the same line; do not add anything
+ if oldline ~= posline then
+ if posline and not oldline then
+ -- show file name and a bookmark marker
+ reseditor:AppendTextDyn(findReplace.curfilename.."\n")
+ reseditor:MarkerAdd(lines-1, FILE_MARKER)
+ reseditor:SetFoldLevel(lines-1, reseditor:GetFoldLevel(lines-1)
+ + wxstc.wxSTC_FOLDLEVELHEADERFLAG)
+ findReplace:SetStatus(GetFileName(findReplace.curfilename))
+
+ lines = lines + 1
+
+ -- show context lines before posline
+ for line = math.max(1, posline-contextb), posline-1 do
+ text = text .. ("%5d %s\n"):format(line, getRawLine(editor, line-1))
+ end
+ end
+ if posline and oldline then
+ -- show context lines between oldposline and posline
+ for line = oldline+1, math.min(posline-1, oldline+contexta) do
+ text = text .. ("%5d %s\n"):format(line, getRawLine(editor, line-1))
+ end
+ if contextb + contexta > 0 and posline-oldline > contextb + contexta + 1 then
+ text = text .. ("%5s\n"):format(("."):rep(#tostring(posline)))
+ end
+ for line = math.max(oldline+contexta+1, posline-contextb), posline-1 do
+ text = text .. ("%5d %s\n"):format(line, getRawLine(editor, line-1))
+ end
+ end
+ if posline then
+ text = text .. ("%5d: %s\n"):format(posline, getRawLine(editor, posline-1))
+ findReplace.lines = findReplace.lines + 1
+ elseif oldline then
+ -- show context lines after posline
+ for line = oldline+1, math.min(editor:GetLineCount(), oldline+contexta) do
+ text = text .. ("%5d %s\n"):format(line, getRawLine(editor, line-1))
+ end
+ text = text .. "\n"
+ end
+ oldline = posline
+
+ reseditor:AppendTextDyn(text)
+
+ for line = lines-1, reseditor:GetLineCount()-2 do
+ reseditor:SetFoldLevel(line, wxstc.wxSTC_FOLDLEVELBASE + 1)
+ end
+ end
+
+ if posline then
+ findReplace.occurrences = findReplace.occurrences + 1
+
+ -- get the added line
+ local markline = reseditor:GetLineCount()-2
+ -- get the match position in the file relative to the beginning of the line
+ local localpos = pos - editor:PositionFromLine(posline-1)
+ -- recalculate position in the search results relative to the line
+ local newpos = reseditor:PositionFromLine(markline)+localpos+7 -- add indent
+ reseditor:SetIndicatorCurrent(indicator.SEARCHMATCH)
+ reseditor:IndicatorFillRange(newpos, length)
+ end
+end
+
+local firstReadSize = 2048
+local knownBinary = {}
+local function checkBinary(ext, content)
+ if not content then return knownBinary[ext] end
+ if ext == "" then return IsBinary(content) end
+ if knownBinary[ext] == nil then knownBinary[ext] = IsBinary(content) end
+ return knownBinary[ext]
+end
+
+function findReplace:ProcInFiles(startdir,mask,subdirs)
+ if not self.panel then self:createPanel() end
+
+ local text = not self:GetFlags().RegularExpr and q(self.findCtrl:GetValue()) or nil
+ if text and not self:GetFlags().MatchCase then
+ text = text:gsub("%w",function(s) return "["..s:lower()..s:upper().."]" end)
+ end
+
+ local files = coroutine.wrap(function() FileSysGetRecursive(startdir, subdirs, mask, {yield = true, folder = false}) end)
+ while true do
+ local file = files()
+ if not file then break end
+
+ if checkBinary(GetFileExt(file)) ~= true then
+ self.curfilename = file
+ local filetext, err = FileRead(file, firstReadSize)
+ if not filetext then
+ DisplayOutputLn(TR("Can't open file '%s': %s"):format(file, err))
+ elseif not checkBinary(GetFileExt(file), filetext) then
+ -- read the rest if there is more to read in the file
+ if #filetext == firstReadSize then filetext = FileRead(file) end
+ if filetext and (not text or filetext:find(text)) then
+ self.oveditor:SetTextDyn(filetext)
+
+ if self:FindAll(onFileRegister) then self.files = self.files + 1 end
+
+ -- give time to the UI to refresh
+ ide:Yield()
+ -- the IDE may be quitting after Yield or the tab may be closed,
+ local ok, mgr = pcall(function() return ide:GetUIManager() end)
+ -- so check to make sure the manager is still active
+ if not (ok and mgr:GetPane(searchpanel):IsShown())
+ -- and check that the search results tab is still open
+ or not ide:IsValidCtrl(self.reseditor) then
+ return false
+ end
+ end
+ end
+ end
+ end
+ return true
+end
+
+local function makePlural(word, counter) return word..(counter == 1 and '' or 's') end
+
+function findReplace:RunInFiles(replace)
+ if not self.panel then self:createPanel() end
+ if not self:HasText() or self.oveditor then return end
+
+ self.oveditor = ide:CreateStyledTextCtrl(self.panel, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxSize(0,0), wx.wxBORDER_NONE)
+ self.occurrences = 0
+ self.lines = 0
+ self.files = 0
+ self.toolbar:UpdateWindowUI(wx.wxUPDATE_UI_FROMIDLE)
+ ide:Yield() -- let the update of the UI happen
+
+ -- save focus to restore after adding a page with search results
+ local ctrl = ide:GetMainFrame():FindFocus()
+ local findText = self.findCtrl:GetValue()
+ local flags = self:GetFlags()
+ local showaseditor = ide.config.search.showaseditor
+ local nb = ide:GetOutputNotebook()
+ local reseditor = self.reseditor
+ local resultsText = "Search Results"
+ local previewText = resultsText..": "
+ local valid = self:IsPreview(reseditor)
+ -- open new tab if the current one is not valid
+ -- or if multiple tabs are requested, but when searching for different text
+ if not valid or (flags.MultiResults and reseditor.searchpreview ~= findText) then
+ -- enable folds in the preview even if disabled in the editor
+ local fold = ide.config.editor.fold
+ ide.config.editor.fold = true
+ if showaseditor then
+ reseditor = NewFile(resultsText)
+ else
+ reseditor = ide:CreateBareEditor()
+ reseditor:SetupKeywords("")
+
+ local modpref = ide.MODPREF
+ local function setModified(modified)
+ local index = nb:GetPageIndex(reseditor)
+ local text = nb:GetPageText(index):gsub("^"..q(modpref), "")
+ nb:SetPageText(index, (modified and modpref or '')..text)
+ end
+ reseditor:Connect(wxstc.wxEVT_STC_SAVEPOINTREACHED,
+ function () setModified(false) end)
+ reseditor:Connect(wxstc.wxEVT_STC_SAVEPOINTLEFT,
+ function () setModified(true) end)
+ reseditor:Connect(wxstc.wxEVT_STC_MARGINCLICK,
+ function (event)
+ local editor = event:GetEventObject():DynamicCast('wxStyledTextCtrl')
+ local line = editor:LineFromPosition(event:GetPosition())
+ local header = bit.band(editor:GetFoldLevel(line),
+ wxstc.wxSTC_FOLDLEVELHEADERFLAG) == wxstc.wxSTC_FOLDLEVELHEADERFLAG
+ if wx.wxGetKeyState(wx.WXK_SHIFT) and wx.wxGetKeyState(wx.WXK_CONTROL) then
+ editor:FoldSome()
+ elseif header then
+ editor:ToggleFold(line)
+ end
+ end)
+
+ -- mark as searchpreview to allow AddPage to add "close" button
+ reseditor.searchpreview = findText
+ nb:AddPage(reseditor, previewText, true)
+ end
+ reseditor:SetWrapMode(wxstc.wxSTC_WRAP_NONE)
+ reseditor:SetIndentationGuides(false)
+ if tonumber(ide.config.search.zoom) then
+ reseditor:SetZoom(tonumber(ide.config.search.zoom))
+ end
+ for m = 0, ide.MAXMARGIN do -- hide all margins except folding
+ if reseditor:GetMarginWidth(m) > 0
+ and reseditor:GetMarginMask(m) ~= wxstc.wxSTC_MASK_FOLDERS then
+ reseditor:SetMarginWidth(m, 0)
+ end
+ end
+ reseditor:MarkerDefine(ide:GetMarker("searchmatchfile"))
+ reseditor:Connect(wx.wxEVT_LEFT_DCLICK, function(event)
+ if not wx.wxGetKeyState(wx.WXK_SHIFT)
+ and not wx.wxGetKeyState(wx.WXK_CONTROL)
+ and not wx.wxGetKeyState(wx.WXK_ALT) then
+ local point = event:GetPosition()
+ local margin = 0
+ for m = 0, ide.MAXMARGIN do margin = margin + reseditor:GetMarginWidth(m) end
+ if point:GetX() <= margin then return end
+
+ local pos = reseditor:PositionFromPoint(point)
+ local line = reseditor:LineFromPosition(pos)
+ local text = reseditor:GetLineDyn(line):gsub("[\n\r]+$","")
+ -- get line with the line number
+ local jumpline = text:match("^%s*(%d+)")
+ local file
+ if jumpline then
+ -- search back to find the file name
+ for curline = line-1, 0, -1 do
+ local text = reseditor:GetLineDyn(curline):gsub("[\n\r]+$","")
+ if not text:find("^%s") and wx.wxFileExists(text) then
+ file = text
+ break
+ end
+ end
+ else
+ file = text
+ jumpline = 1
+ end
+
+ -- activate the file and the line number
+ local editor = file and LoadFile(file,nil,true)
+ if editor then
+ editor:GotoLine(jumpline-1)
+ editor:EnsureVisibleEnforcePolicy(jumpline-1)
+ editor:SetFocus()
+ end
+ return
+ end
+
+ event:Skip()
+ end)
+
+ ide.config.editor.fold = fold
+ self.reseditor = reseditor
+ else
+ if showaseditor then
+ ide:GetDocument(reseditor):SetActive()
+ else
+ local index = nb:GetPageIndex(reseditor)
+ if nb:GetSelection() ~= index then nb:SetSelection(index) end
+ end
+ end
+ reseditor.replace = replace -- keep track of the current status
+ reseditor:ShowLines(0, reseditor:GetLineCount()-1)
+ reseditor:SetReadOnly(false)
+ reseditor:SetTextDyn('')
+ do -- update the preview name
+ local nb = showaseditor and ide:GetEditorNotebook() or nb
+ nb:SetPageText(nb:GetPageIndex(reseditor), previewText .. findText)
+ end
+ if not showaseditor and nb then -- show the bottom notebook if hidden
+ local uimgr = ide:GetUIManager()
+ if not uimgr:GetPane(nb):IsShown() then
+ uimgr:GetPane(nb):Show(true)
+ uimgr:Update()
+ end
+ end
+
+ self:SetStatus(TR("Searching for '%s'."):format(findText))
+ wx.wxSafeYield() -- allow the status to update
+
+ local startdir, mask = self:GetScope()
+ local completed = self:ProcInFiles(startdir, mask or "*", flags.SubDirs)
+
+ -- reseditor may already be closed, so check if it's valid first
+ if ide:IsValidCtrl(reseditor) then
+ reseditor:GotoPos(reseditor:GetLength())
+ reseditor:AppendTextDyn(("Searched for '%s'. "):format(findText))
+ if not completed then reseditor:AppendTextDyn("Cancelled by the user. ") end
+ reseditor:AppendTextDyn(("Found %d %s on %d %s in %d %s.")
+ :format(
+ self.occurrences, makePlural("instance", self.occurrences),
+ self.lines, makePlural("line", self.lines),
+ self.files, makePlural("file", self.files)))
+ reseditor:EmptyUndoBuffer() -- don't undo the changes in the results
+ reseditor:SetSavePoint() -- set unmodified status
+
+ if completed and replace and self.occurrences > 0 then
+ reseditor:AppendTextDyn("\n\n"
+ .."Review the changes and save this preview to apply them.\n"
+ .."You can also make other changes; only lines with : will be updated.\n"
+ .."Context lines (if any) are used as safety checks during the update.")
+ self:Replace(true, reseditor)
+ else
+ reseditor:SetReadOnly(true)
+ end
+ reseditor:EnsureVisibleEnforcePolicy(reseditor:GetLineCount()-1)
+ reseditor.searchpreview = findText
+ end
+
+ self:SetStatus(not completed and TR("Cancelled by the user.")
+ or TR("Found %d instance.", self.occurrences):format(self.occurrences))
+ self.oveditor:Destroy()
+ self.oveditor = nil
+ self.toolbar:UpdateWindowUI(wx.wxUPDATE_UI_FROMIDLE)
+
+ -- return focus to the control that had it if it's on the search panel
+ -- (as it could be changed by added results tab)
+ if ctrl and (ctrl:GetParent():GetId() == self.panel:GetId() or not showaseditor) then
+ -- set the focus temporarily on the search results tab as this provides a workaround
+ -- for the cursor disappearing in Search/Replace controls after results shown
+ -- in the same tab (somehow caused by `oveditor:Destroy()` call).
+ if ide:IsValidCtrl(reseditor) then reseditor:SetFocus() end
+ ctrl:SetFocus()
+ end
+
+ if completed and ide.config.search.autohide then self:Hide() end
+end
+
+local icons = {
+ find = {
+ internal = {
+ ID_FINDNEXT, ID_SEPARATOR,
+ ID_FINDOPTDIRECTION, ID_FINDOPTWRAPWROUND, ID_FINDOPTSELECTION,
+ ID_FINDOPTWORD, ID_FINDOPTCASE, ID_FINDOPTREGEX,
+ ID_SEPARATOR, ID_FINDOPTSTATUS,
+ },
+ infiles = {
+ ID_FINDNEXT, ID_SEPARATOR,
+ ID_FINDOPTCONTEXT, ID_FINDOPTMULTIRESULTS, ID_FINDOPTWORD,
+ ID_FINDOPTCASE, ID_FINDOPTREGEX, ID_FINDOPTSUBDIR,
+ ID_FINDOPTSCOPE, ID_FINDSETDIR,
+ ID_SEPARATOR, ID_FINDOPTSTATUS,
+ },
+ },
+ replace = {
+ internal = {
+ ID_FINDNEXT, ID_FINDREPLACENEXT, ID_FINDREPLACEALL, ID_SEPARATOR,
+ ID_FINDOPTDIRECTION, ID_FINDOPTWRAPWROUND, ID_FINDOPTSELECTION,
+ ID_FINDOPTWORD, ID_FINDOPTCASE, ID_FINDOPTREGEX,
+ ID_SEPARATOR, ID_FINDOPTSTATUS,
+ },
+ infiles = {
+ ID_FINDNEXT, ID_FINDREPLACEALL, ID_SEPARATOR,
+ ID_FINDOPTCONTEXT, ID_FINDOPTMULTIRESULTS, ID_FINDOPTWORD,
+ ID_FINDOPTCASE, ID_FINDOPTREGEX, ID_FINDOPTSUBDIR,
+ ID_FINDOPTSCOPE, ID_FINDSETDIR,
+ ID_SEPARATOR, ID_FINDOPTSTATUS,
+ },
+ },
+}
+
+function findReplace:createToolbar()
+ local ctrl, tb, scope, status =
+ self.panel, self.toolbar, self.scope, self.status
+ local icons = icons[self.replace and "replace" or "find"][self.infiles and "infiles" or "internal"]
+
+ local toolBmpSize = wx.wxSize(16, 16)
+ tb:Freeze()
+ tb:Clear()
+ for _, id in ipairs(icons) do
+ if id == ID_SEPARATOR then
+ tb:AddSeparator()
+ elseif id == ID_FINDOPTSCOPE then
+ tb:AddControl(scope)
+ elseif id == ID_FINDOPTSTATUS then
+ tb:AddControl(status)
+ else
+ local iconmap = ide.config.toolbar.iconmap[id]
+ if iconmap then
+ local icon, description = unpack(iconmap)
+ local isbitmap = type(icon) == "userdata" and icon:GetClassInfo():GetClassName() == "wxBitmap"
+ local bitmap = isbitmap and icon or ide:GetBitmap(icon, "TOOLBAR", toolBmpSize)
+ tb:AddTool(id, "", bitmap, (TR)(description))
+ end
+ end
+ end
+
+ local options = {
+ [ID_FINDOPTDIRECTION] = 'Down',
+ [ID_FINDOPTWRAPWROUND] = 'Wrap',
+ [ID_FINDOPTWORD] = 'WholeWord',
+ [ID_FINDOPTCASE] = 'MatchCase',
+ [ID_FINDOPTREGEX] = 'RegularExpr',
+ [ID_FINDOPTSUBDIR] = 'SubDirs',
+ [ID_FINDOPTCONTEXT] = 'Context',
+ [ID_FINDOPTMULTIRESULTS] = 'MultiResults',
+ }
+
+ for id, var in pairs(options) do
+ local tool = tb:FindTool(id)
+ if tool then
+ local flags = self:GetFlags()
+ tool:SetSticky(flags[var])
+ ctrl:Connect(id, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function ()
+ flags[var] = not flags[var]
+ self:SaveSettings()
+
+ tb:FindTool(id):SetSticky(flags[var])
+ tb:Refresh()
+ end)
+ end
+ end
+
+ local optseltool = tb:FindTool(ID_FINDOPTSELECTION)
+ if optseltool then
+ optseltool:SetSticky(self.inselection)
+ tb:EnableTool(ID_FINDOPTSELECTION, self.inselection)
+ ctrl:Connect(ID_FINDOPTSELECTION, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ self.inselection = not self.inselection
+ tb:FindTool(event:GetId()):SetSticky(self.inselection)
+ tb:Refresh()
+ end)
+ end
+
+ tb:SetToolDropDown(ID_FINDSETDIR, true)
+ tb:Connect(ID_FINDSETDIR, wxaui.wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN, function(event)
+ if event:IsDropDownClicked() then
+ local menu = wx.wxMenu()
+ local pos = tb:GetToolRect(event:GetId()):GetBottomLeft()
+ menu:Append(ID_FINDSETDIR, TR("Choose..."))
+ menu:Append(ID_FINDSETTOPROJDIR, TR("Set To Project Directory"))
+ menu:Enable(ID_FINDSETTOPROJDIR, ide:GetProject() ~= nil)
+ menu:Connect(ID_FINDSETTOPROJDIR, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ local _, mask = self:GetScope()
+ self:refreshToolbar(self:SetScope(ide:GetProject(), mask))
+ end)
+ if #self.settings.slist > 0 then menu:AppendSeparator() end
+ for i, text in ipairs(self.settings.slist) do
+ local id = ID("findreplace.scope."..i)
+ menu:Append(id, text)
+ menu:Connect(id, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() self:refreshToolbar(text) end)
+ end
+ menu:AppendSeparator()
+ menu:Append(ID_RECENTSCOPECLEAR, TR("Clear Items"))
+ menu:Enable(ID_RECENTSCOPECLEAR, #self.settings.slist > 0)
+ menu:Connect(ID_RECENTSCOPECLEAR, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ self.settings.slist = {}
+ self:SaveSettings()
+ end)
+ tb:PopupMenu(menu, pos)
+ else
+ event:Skip()
+ end
+ end)
+
+ tb:Realize()
+ tb:Thaw()
+
+ local sizer = ctrl:GetSizer()
+ if sizer then sizer:Layout() end
+end
+
+function findReplace:refreshToolbar(value)
+ local scope = self.scope
+ value = value or self.scope:GetValue()
+ self.scope:SetMinSize(wx.wxSize(scope:GetTextExtent(value..'AZ'), -1))
+ self:createToolbar()
+ self.scope:SetValue(value)
+end
+
+function findReplace:createPanel()
+ local ctrl = wx.wxPanel(ide:GetMainFrame(), wx.wxID_ANY, wx.wxDefaultPosition,
+ wx.wxDefaultSize, wx.wxFULL_REPAINT_ON_RESIZE)
+ local mgr = ide:GetUIManager()
+ mgr:AddPane(ctrl, wxaui.wxAuiPaneInfo()
+ :Name(searchpanel):CaptionVisible(false):PaneBorder(false):Hide())
+ mgr:Update()
+
+ local tb = wxaui.wxAuiToolBar(ctrl, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxDefaultSize, wxaui.wxAUI_TB_PLAIN_BACKGROUND)
+ local status = wx.wxStaticText(tb, wx.wxID_ANY, "")
+ local scope = wx.wxTextCtrl(tb, wx.wxID_ANY, "",
+ wx.wxDefaultPosition, wx.wxDefaultSize,
+ wx.wxTE_PROCESS_ENTER + wx.wxTE_PROCESS_TAB + wx.wxBORDER_STATIC)
+ -- limit the scope control height as it gets too large on Linux
+ scope:SetMaxSize(wx.wxSize(-1, 22))
+
+ self.panel = ctrl
+ self.status = status
+ self.toolbar = tb
+ self.scope = scope
+
+ self:createToolbar()
+
+ local style, styledef = ide.config.styles, StylesGetDefault()
+ local textcolor = wx.wxColour(unpack(style.text.fg or styledef.text.fg))
+ local backcolor = wx.wxColour(unpack(style.text.bg or styledef.text.bg))
+ local pancolor = tb:GetBackgroundColour()
+ local borcolor = ide:GetUIManager():GetArtProvider():GetColor(wxaui.wxAUI_DOCKART_BORDER_COLOUR)
+ local bpen = wx.wxPen(borcolor, 1, wx.wxSOLID)
+ local bbrush = wx.wxBrush(pancolor, wx.wxSOLID)
+ local tfont = ide:GetProjectTree():GetFont()
+ -- don't increase font size on Linux as it gets too large
+ tfont:SetPointSize(tfont:GetPointSize() + (ide.osname == 'Unix' and 0 or 1))
+
+ local findCtrl = wx.wxTextCtrl(ctrl, wx.wxID_ANY, "",
+ wx.wxDefaultPosition, wx.wxDefaultSize,
+ wx.wxTE_PROCESS_ENTER + wx.wxTE_PROCESS_TAB + wx.wxBORDER_STATIC)
+ local replaceCtrl = wx.wxTextCtrl(ctrl, wx.wxID_ANY, replaceHintText,
+ wx.wxDefaultPosition, wx.wxDefaultSize,
+ wx.wxTE_PROCESS_ENTER + wx.wxTE_PROCESS_TAB + wx.wxBORDER_STATIC)
+ self.ac = {[findCtrl:GetId()] = {}, [replaceCtrl:GetId()] = {}, [scope:GetId()] = {}}
+
+ local findSizer = wx.wxBoxSizer(wx.wxHORIZONTAL)
+ findSizer:Add(findCtrl, 1, wx.wxLEFT + wx.wxRIGHT + wx.wxALIGN_LEFT + wx.wxEXPAND + wx.wxFIXED_MINSIZE, 1)
+ findSizer:Add(replaceCtrl, 1, wx.wxLEFT + wx.wxRIGHT + wx.wxALIGN_LEFT + wx.wxEXPAND + wx.wxFIXED_MINSIZE, 1)
+ findSizer:Hide(1)
+
+ local mainSizer = wx.wxBoxSizer(wx.wxVERTICAL)
+ mainSizer:Add(tb, 0, wx.wxTOP + wx.wxLEFT + wx.wxRIGHT + wx.wxALIGN_LEFT + wx.wxEXPAND, 2)
+ mainSizer:Add(findSizer, 0, wx.wxALL + wx.wxALIGN_LEFT + wx.wxEXPAND, 2)
+
+ ctrl:SetSizer(mainSizer)
+ ctrl:GetSizer():Fit(ctrl)
+
+ for _, control in ipairs({findCtrl, replaceCtrl}) do
+ control:SetBackgroundColour(backcolor)
+ control:SetForegroundColour(textcolor)
+ control:SetFont(tfont)
+ end
+ scope:SetBackgroundColour(pancolor) -- set toolbar background
+ scope:SetFont(tfont)
+ status:SetFont(tfont)
+
+ local function updateLists()
+ PrependStringToArray(self.settings.flist, findCtrl:GetValue())
+ if self.replace then
+ local replaceText = replaceCtrl:GetValue()
+ if replaceText == replaceHintText then replaceText = "" end
+ PrependStringToArray(self.settings.rlist, replaceText)
+ end
+ if self.infiles then
+ PrependStringToArray(self.settings.slist, self.scope:GetValue())
+ end
+ self:SaveSettings()
+ return true
+ end
+
+ local function findNext()
+ updateLists()
+ if findReplace.infiles then
+ findReplace:RunInFiles(false)
+ else
+ findReplace:Find()
+ end
+ end
+
+ local function autoComplete(event)
+ if not ide.config.search.autocomplete then return end
+
+ local obj = event:GetEventObject():DynamicCast('wxTextCtrl')
+ local ac = self.ac[obj:GetId()]
+ if not ac then return end
+
+ local keycode, needac = ac.lastkeycode, ac.needautocomplete
+ if needac then ac.needautocomplete = false end
+ if not needac or not keycode then return end
+
+ -- if the last key was Delete or Backspace, don't autocomplete
+ if keycode == wx.WXK_DELETE or keycode == wx.WXK_BACK then return end
+
+ -- find match for the current text and add it to the control
+ local value = obj:GetValue()
+ if not value or #value == 0 then return end
+
+ local patt, match = "^"..q(value)
+ for _, v in ipairs(
+ obj:GetId() == self.findCtrl:GetId() and self.settings.flist or
+ obj:GetId() == self.replaceCtrl:GetId() and self.settings.rlist or
+ {}
+ ) do
+ if v:find(patt) then match = v; break end
+ end
+ if match then
+ obj:ChangeValue(match)
+ obj:SetSelection(#value, #match)
+ end
+ end
+
+ local function findIncremental(event)
+ -- don't do any incremental search when search in selection
+ if self.inselection then return end
+
+ if not self.infiles and self.backfocus and self.backfocus.position then
+ self:GetEditor():SetSelection(self.backfocus.position, self.backfocus.position)
+ end
+ -- don't search when used with "infiles", but still trigger autocomplete
+ if self.infiles or self:Find() then
+ self.ac[event:GetEventObject():DynamicCast('wxTextCtrl'):GetId()].needautocomplete = true
+ end
+ end
+
+ local function findReplaceNext()
+ updateLists()
+ if findReplace.replace then
+ if findReplace.infiles then
+ findReplace:RunInFiles(true)
+ else
+ local replaceAll = (wx.wxGetKeyState(wx.WXK_ALT)
+ and not wx.wxGetKeyState(wx.WXK_SHIFT) and not wx.wxGetKeyState(wx.WXK_CONTROL))
+ findReplace:Replace(replaceAll)
+ end
+ end
+ end
+
+ local function findReplaceAll()
+ updateLists()
+ if findReplace.replace then
+ if findReplace.infiles then
+ findReplace:RunInFiles(true)
+ else
+ findReplace:Replace(true)
+ end
+ end
+ end
+
+ local function onPanelPaint()
+ local dc = wx.wxBufferedPaintDC(ctrl)
+ local psize = ctrl:GetClientSize()
+ dc:SetBrush(bbrush)
+ dc:SetPen(bpen)
+ dc:DrawRectangle(0, 0, psize:GetWidth(), psize:GetHeight())
+ dc:SetPen(wx.wxNullPen)
+ dc:SetBrush(wx.wxNullBrush)
+ dc:delete()
+ end
+
+ ctrl:Connect(wx.wxEVT_PAINT, onPanelPaint)
+ ctrl:Connect(wx.wxEVT_ERASE_BACKGROUND, function() end)
+
+ local taborder = {findCtrl, replaceCtrl, scope}
+ local function keyHandle(event)
+ local keycode = event:GetKeyCode()
+ self.ac[event:GetEventObject():DynamicCast('wxTextCtrl'):GetId()].lastkeycode = keycode
+ if keycode == wx.WXK_ESCAPE then
+ self:Hide(event:ShiftDown())
+ elseif keycode == wx.WXK_TAB then
+ local id = event:GetId()
+ local order, pos = {}
+ for _, v in ipairs(taborder) do
+ if v:IsEnabled() and v:IsShown() then table.insert(order, v) end
+ if v:GetId() == id then pos = #order end
+ end
+ if not pos then return end
+ pos = pos + (event:ShiftDown() and -1 or 1)
+ if pos == 0 then pos = #order
+ elseif pos > #order then pos = 1
+ end
+ order[pos]:SetFocus()
+ if order[pos] ~= scope then order[pos]:SetSelection(-1, -1) end
+ else
+ event:Skip()
+ end
+ end
+
+ -- remember the current position in the editor when setting focus on find
+ local function refreshEditorInfo()
+ local ed = self:GetEditor()
+ if ed and ed ~= self.oveditor then
+ local spos, epos = ed:GetSelectionStart(), ed:GetSelectionEnd()
+ if not self.backfocus or self.backfocus.editor ~= ed then
+ self.backfocus = { editor = ed, spos = spos, epos = epos }
+ end
+ local bf = self.backfocus
+ bf.position = spos == epos and ed:GetCurrentPos() or spos
+ local inselection = ed:LineFromPosition(spos) ~= ed:LineFromPosition(epos)
+
+ -- when the focus is changed, don't remove current "inselection" status as the
+ -- selection may change to highlight the match; not doing this makes it difficult
+ -- to switch between searching and replacing without losing the current match
+ if inselection and (not self.inselection or bf.spos ~= spos or bf.epos ~= epos) then
+ bf.spos = spos
+ bf.epos = epos
+ self.inselection = inselection
+ self:refreshToolbar()
+ end
+ end
+ end
+ findCtrl:Connect(wx.wxEVT_SET_FOCUS,
+ function(event)
+ event:Skip()
+ refreshEditorInfo()
+ end)
+ findCtrl:Connect(wx.wxEVT_COMMAND_TEXT_ENTER, findNext)
+ findCtrl:Connect(wx.wxEVT_COMMAND_TEXT_UPDATED, findIncremental)
+ findCtrl:Connect(wx.wxEVT_KEY_DOWN, keyHandle)
+ replaceCtrl:Connect(wx.wxEVT_SET_FOCUS, function(event)
+ event:Skip()
+ refreshEditorInfo()
+ -- hide the replace hint; should be done with SetHint method,
+ -- but it's not yet available in wxlua 2.8.12
+ if replaceCtrl:GetValue() == replaceHintText then replaceCtrl:ChangeValue('') end
+ end)
+ replaceCtrl:Connect(wx.wxEVT_COMMAND_TEXT_ENTER, findReplaceNext)
+ replaceCtrl:Connect(wx.wxEVT_COMMAND_TEXT_UPDATED, function(event)
+ self.ac[event:GetEventObject():DynamicCast('wxTextCtrl'):GetId()].needautocomplete = true
+ end)
+ replaceCtrl:Connect(wx.wxEVT_KEY_DOWN, keyHandle)
+
+ -- autocomplete for find/replace can be done from TEXT_UPDATED event,
+ -- but SetSelection doesn't work from TEXT_UPDATED event on Linux,
+ -- which makes it impossible to select the suggested part.
+ -- IDLE event is used instead to provide autocomplete suggestions.
+ findCtrl:Connect(wx.wxEVT_IDLE, autoComplete)
+ replaceCtrl:Connect(wx.wxEVT_IDLE, autoComplete)
+
+ scope:Connect(wx.wxEVT_COMMAND_TEXT_ENTER, findNext)
+ scope:Connect(wx.wxEVT_KEY_DOWN, keyHandle)
+
+ local function notSearching(event) event:Enable(not self.oveditor) end
+ ctrl:Connect(ID_FINDNEXT, wx.wxEVT_UPDATE_UI, notSearching)
+ ctrl:Connect(ID_FINDREPLACENEXT, wx.wxEVT_UPDATE_UI, notSearching)
+ ctrl:Connect(ID_FINDREPLACEALL, wx.wxEVT_UPDATE_UI, notSearching)
+
+ ctrl:Connect(ID_FINDNEXT, wx.wxEVT_COMMAND_MENU_SELECTED, findNext)
+ ctrl:Connect(ID_FINDREPLACENEXT, wx.wxEVT_COMMAND_MENU_SELECTED, findReplaceNext)
+ ctrl:Connect(ID_FINDREPLACEALL, wx.wxEVT_COMMAND_MENU_SELECTED, findReplaceAll)
+
+ ctrl:Connect(ID_FINDSETDIR, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ local dir, mask = self:GetScope()
+ local filePicker = wx.wxDirDialog(ctrl, TR("Choose a search directory"),
+ dir or wx.wxGetCwd(), wx.wxFLP_USE_TEXTCTRL)
+ if filePicker:ShowModal(true) == wx.wxID_OK then
+ self:refreshToolbar(self:SetScope(FixDir(filePicker:GetPath()), mask))
+ end
+ end)
+
+ self.findCtrl = findCtrl
+ self.replaceCtrl = replaceCtrl
+ self.findSizer = findSizer
+end
+
+function findReplace:refreshPanel(replace, infiles)
+ if not self.panel then self:createPanel() end
+
+ self:GetEditor(true) -- remember the current editor
+
+ local ctrl = self.panel
+
+ -- check if a proper pane is already populated
+ if self.replace ~= replace or self.infiles ~= infiles then
+ self.replace = replace
+ self.infiles = infiles
+
+ if replace then
+ self.findSizer:Show(1)
+ if self.replaceCtrl:GetValue() == '' then
+ self.replaceCtrl:ChangeValue(replaceHintText)
+ end
+ else
+ self.findSizer:Hide(1)
+ end
+ self.findSizer:Layout()
+
+ self.scope:Show(infiles)
+ end
+
+ local value = self.scope:GetValue()
+ local ed = ide:GetEditor()
+ if ed and (not value or #value == 0) then
+ local doc = ide:GetDocument(ed)
+ local ext = doc:GetFileExt()
+ local proj = ide:GetProject()
+ value = (proj and self:GetScopeMRU(proj..sep) or
+ self:SetScope(proj or wx.wxGetCwd(), '*.'..(#ext > 0 and ext or '*')))
+ end
+ if ed then -- check if there is any selection
+ self.backfocus = nil
+ self.inselection = ed:LineFromPosition(ed:GetSelectionStart()) ~=
+ ed:LineFromPosition(ed:GetSelectionEnd())
+ end
+ self:refreshToolbar(value)
+
+ local mgr = ide:GetUIManager()
+ local pane = mgr:GetPane(searchpanel)
+ if not pane:IsShown() then
+ local size = ctrl:GetSize()
+ pane:Dock():Bottom():BestSize(size):MinSize(size):Layer(0):Row(1):Show()
+ mgr:Update()
+
+ self:SetStatus(TR("Use %s to close."):format("`Escape`"))
+ end
+
+ -- set value from the current selection (if any)
+ self.findCtrl:ChangeValue(self:GetSelection() or self.findCtrl:GetValue())
+
+ -- reset search when re-creating dialog to avoid modifying selected
+ -- fragment after successful search and updated replacement
+ self.foundString = false
+ self.findCtrl:SetFocus()
+ self.findCtrl:SetSelection(-1, -1) -- select the content
+end
+
+function findReplace:Show(replace,infiles)
+ self:refreshPanel(replace,infiles)
+end
+
+function findReplace:IsShown()
+ local pane = ide:GetUIManager():GetPane(searchpanel)
+ return pane:IsOk() and pane:IsShown()
+end
+
+function findReplace:Hide(restorepos)
+ local ctrl = self.panel:FindFocus()
+ if not ctrl or ctrl:GetParent():GetId() ~= self.panel:GetId() then
+ -- if focus outside of the search panel, do nothing
+ elseif self.backfocus and ide:IsValidCtrl(self.backfocus.editor) then
+ local editor = self.backfocus.editor
+ -- restore original position for Shift-Esc or failed search
+ if restorepos or self.foundString == false then
+ editor:SetSelection(self.backfocus.spos, self.backfocus.epos)
+ end
+ editor:SetFocus()
+ elseif self:IsPreview(self.reseditor) then -- there is a preview, go there
+ self.reseditor:SetFocus()
+ end
+
+ local mgr = ide:GetUIManager()
+ mgr:GetPane(searchpanel):Hide()
+ mgr:Update()
+end
+
+local package = ide:AddPackage('core.findreplace', {
+ onProjectLoad = function()
+ if not findReplace.panel then return end -- not set yet
+ local _, mask = findReplace:GetScope()
+ local proj = ide:GetProject()
+ -- find the last used scope for the same project on the scope history
+ findReplace:refreshToolbar(findReplace:GetScopeMRU(proj..sep)
+ or findReplace:SetScope(proj, mask))
+ end,
+
+ onEditorPreSave = function(self, editor, filePath)
+ if not findReplace:IsPreview(editor) then return end
+
+ local isModified = editor:GetModify()
+ if editor.replace and isModified then
+ findReplace:SetStatus("")
+
+ local line = NOTFOUND
+ local oveditor = ide:CreateStyledTextCtrl(findReplace.panel, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxSize(0,0), wx.wxBORDER_NONE)
+ local files, lines = 0, 0
+ local report
+ while true do
+ -- for each marker that marks a file (MarkerNext)
+ line = editor:MarkerNext(line + 1, FILE_MARKER_VALUE)
+ if line == NOTFOUND then break end
+
+ local fname = getRawLine(editor, line) -- get the file name
+ local filetext, err = FileRead(fname)
+ local mismatch = false
+ if filetext then
+ findReplace:SetStatus(GetFileName(fname))
+ wx.wxSafeYield()
+
+ oveditor:SetTextDyn(filetext)
+ while true do -- for each line following the file name
+ line = line + 1
+ local text = getRawLine(editor, line)
+ local lnum, lmark, ltext = text:match("^%s*(%d+)([ :]) (.*)")
+ if lnum then
+ lnum = tonumber(lnum)
+ if lmark == ':' then -- if the change line, then apply the change
+ local pos = oveditor:PositionFromLine(lnum-1)
+ if pos == NOTFOUND then
+ mismatch = lnum
+ break
+ end
+ oveditor:SetTargetStart(pos)
+ oveditor:SetTargetEnd(pos+#getRawLine(oveditor, lnum-1))
+ oveditor:ReplaceTarget(ltext)
+ lines = lines + 1
+ -- if the context line, then check the context
+ elseif getRawLine(oveditor, lnum-1) ~= ltext then
+ mismatch = lnum
+ break
+ end
+ -- if not placeholder line " ...", then abort
+ elseif not text:find("^%s*%.+$") then
+ break
+ end
+ end
+ if lines > 0 and not mismatch then -- save the file
+ local ok
+ ok, err = FileWrite(fname, oveditor:GetTextDyn())
+ if ok then files = files + 1 end
+ end
+ end
+ if err or mismatch then
+ report = (report or "") .. (("\n%s: %s")
+ :format(fname, mismatch and "mismatch on line "..mismatch or err))
+ end
+ end
+ oveditor:Destroy() -- destroy the editor to release its memory
+ if report then editor:AppendTextDyn("\n"..report) end
+ editor:AppendTextDyn(("\n\nUpdated %d %s in %d %s.")
+ :format(
+ lines, makePlural("line", lines),
+ files, makePlural("file", files)))
+ editor:EnsureVisibleEnforcePolicy(editor:GetLineCount()-1)
+ editor:SetSavePoint() -- set unmodified status when done
+ findReplace:SetStatus(TR("Updated %d file.", files):format(files))
+ return false
+
+ -- don't offer to save file if called from SaveFile;
+ -- can still be used with explicit SaveFileAs
+ elseif not filePath and not isModified then
+ return false
+ end
+ end
+ })
+
+function findReplace:SaveSettings() package:SetSettings(self.settings) end
+MergeSettings(findReplace.settings, package:GetSettings())
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/gui.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/gui.lua
new file mode 100644
index 0000000..f4ea34e
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/gui.lua
@@ -0,0 +1,567 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+-- Lomtik Software (J. Winwood & John Labenski)
+---------------------------------------------------------
+
+local ide = ide
+local unpack = table.unpack or unpack
+
+-- Pick some reasonable fixed width fonts to use for the editor
+local function setFont(style, config)
+ return wx.wxFont(config.fontsize or 10, wx.wxFONTFAMILY_MODERN, style,
+ wx.wxFONTWEIGHT_NORMAL, false, config.fontname or "",
+ config.fontencoding or wx.wxFONTENCODING_DEFAULT)
+end
+ide.font.eNormal = setFont(wx.wxFONTSTYLE_NORMAL, ide.config.editor)
+ide.font.eItalic = setFont(wx.wxFONTSTYLE_ITALIC, ide.config.editor)
+
+ide.font.oNormal = setFont(wx.wxFONTSTYLE_NORMAL, ide.config.outputshell)
+ide.font.oItalic = setFont(wx.wxFONTSTYLE_ITALIC, ide.config.outputshell)
+
+-- treeCtrl font requires slightly different handling
+do local gui, config = wx.wxTreeCtrl():GetFont(), ide.config.filetree
+ if config.fontsize then gui:SetPointSize(config.fontsize) end
+ if config.fontname then gui:SetFaceName(config.fontname) end
+ ide.font.fNormal = gui
+end
+
+-- ----------------------------------------------------------------------------
+-- Create the wxFrame
+-- ----------------------------------------------------------------------------
+local function createFrame()
+ local frame = wx.wxFrame(wx.NULL, wx.wxID_ANY, GetIDEString("editor"),
+ wx.wxDefaultPosition, wx.wxSize(1100, 700))
+ frame:Center()
+ -- wrap into protected call as DragAcceptFiles fails on MacOS with
+ -- wxwidgets 2.8.12 even though it should work according to change notes
+ -- for 2.8.10: "Implemented wxWindow::DragAcceptFiles() on all platforms."
+ pcall(function() frame:DragAcceptFiles(true) end)
+ frame:Connect(wx.wxEVT_DROP_FILES,function(evt)
+ local files = evt:GetFiles()
+ if not files or #files == 0 then return end
+ for _, f in ipairs(files) do
+ LoadFile(f,nil,true)
+ end
+ end)
+
+ -- update best size of the toolbar after resizing
+ frame:Connect(wx.wxEVT_SIZE, function(event)
+ local mgr = ide:GetUIManager()
+ local toolbar = mgr:GetPane("toolbar")
+ if toolbar and toolbar:IsOk() then
+ toolbar:BestSize(event:GetSize():GetWidth(), ide:GetToolBar():GetClientSize():GetHeight())
+ mgr:Update()
+ end
+ end)
+
+ local menuBar = wx.wxMenuBar()
+ local statusBar = frame:CreateStatusBar(5)
+ local section_width = statusBar:GetTextExtent("OVRW")
+ statusBar:SetStatusStyles({wx.wxSB_FLAT, wx.wxSB_FLAT, wx.wxSB_FLAT, wx.wxSB_FLAT, wx.wxSB_FLAT})
+ statusBar:SetStatusWidths({-1, section_width, section_width, section_width*5, section_width*4})
+ statusBar:SetStatusText(GetIDEString("statuswelcome"))
+ statusBar:Connect(wx.wxEVT_LEFT_DOWN, function (event)
+ local rect = wx.wxRect()
+ statusBar:GetFieldRect(4, rect)
+ if rect:Contains(event:GetPosition()) then -- click on the interpreter
+ local menuitem = ide:FindMenuItem(ID.INTERPRETER)
+ if menuitem then
+ local menu = ide:CloneMenu(menuitem:GetSubMenu())
+ if menu then statusBar:PopupMenu(menu) end
+ end
+ end
+ end)
+
+ local mgr = wxaui.wxAuiManager()
+ mgr:SetManagedWindow(frame)
+ -- allow the panes to be larger than the defalt 1/3 of the main window size
+ mgr:SetDockSizeConstraint(0.8,0.8)
+
+ frame.menuBar = menuBar
+ frame.statusBar = statusBar
+ frame.uimgr = mgr
+
+ return frame
+end
+
+local function SCinB(id) -- shortcut in brackets
+ local shortcut = KSC(id):gsub("\t","")
+ return shortcut and #shortcut > 0 and (" ("..shortcut..")") or ""
+end
+
+local function menuDropDownPosition(event)
+ local tb = event:GetEventObject():DynamicCast('wxAuiToolBar')
+ local rect = tb:GetToolRect(event:GetId())
+ return ide.frame:ScreenToClient(tb:ClientToScreen(rect:GetBottomLeft()))
+end
+
+local function tbIconSize()
+ -- use large icons by default on OSX and on large screens
+ local iconsize = (tonumber(ide.config.toolbar and ide.config.toolbar.iconsize)
+ or ((ide.osname == 'Macintosh' or wx.wxGetClientDisplayRect():GetWidth() >= 1500) and 24 or 16))
+ if iconsize ~= 24 then iconsize = 16 end
+ return iconsize
+end
+
+local function createToolBar(frame)
+ local toolBar = wxaui.wxAuiToolBar(frame, wx.wxID_ANY, wx.wxDefaultPosition, wx.wxDefaultSize,
+ wxaui.wxAUI_TB_PLAIN_BACKGROUND)
+
+ -- there are two sets of icons: use 24 on OSX and 16 on others.
+ local iconsize = tbIconSize()
+ local toolBmpSize = wx.wxSize(iconsize, iconsize)
+ local icons, prev = ide.config.toolbar.icons
+ for _, id in ipairs(icons) do
+ if icons[id] ~= false then -- skip explicitly disabled icons
+ if id == ID_SEPARATOR then
+ -- make sure that there are no two separators next to each other;
+ -- this may happen when some of the icons are disabled.
+ if prev ~= ID_SEPARATOR then toolBar:AddSeparator() end
+ else
+ local iconmap = ide.config.toolbar.iconmap[id]
+ if iconmap then
+ local icon, description = unpack(iconmap)
+ local isbitmap = type(icon) == "userdata" and icon:GetClassInfo():GetClassName() == "wxBitmap"
+ local bitmap = isbitmap and icon or ide:GetBitmap(icon, "TOOLBAR", toolBmpSize)
+ toolBar:AddTool(id, "", bitmap, (TR)(description)..SCinB(id))
+ end
+ end
+ prev = id
+ end
+ end
+
+ toolBar:SetToolDropDown(ID_OPEN, true)
+ toolBar:Connect(ID_OPEN, wxaui.wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN, function(event)
+ if event:IsDropDownClicked() then
+ local menu = wx.wxMenu()
+ FileRecentListUpdate(menu)
+ toolBar:PopupMenu(menu, menuDropDownPosition(event))
+ else
+ event:Skip()
+ end
+ end)
+
+ toolBar:SetToolDropDown(ID_PROJECTDIRCHOOSE, true)
+ toolBar:Connect(ID_PROJECTDIRCHOOSE, wxaui.wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN, function(event)
+ if event:IsDropDownClicked() then
+ local menu = wx.wxMenu()
+ FileTreeProjectListUpdate(menu, 0)
+ toolBar:PopupMenu(menu, menuDropDownPosition(event))
+ else
+ event:Skip()
+ end
+ end)
+
+ toolBar:GetArtProvider():SetElementSize(wxaui.wxAUI_TBART_GRIPPER_SIZE, 0)
+ toolBar:Realize()
+
+ frame.toolBar = toolBar
+ return toolBar
+end
+
+local function createNotebook(frame)
+ -- notebook for editors
+ local notebook = wxaui.wxAuiNotebook(frame, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxDefaultSize,
+ wxaui.wxAUI_NB_DEFAULT_STYLE + wxaui.wxAUI_NB_TAB_EXTERNAL_MOVE
+ + wxaui.wxAUI_NB_WINDOWLIST_BUTTON + wx.wxNO_BORDER)
+
+ -- wxEVT_SET_FOCUS could be used, but it only works on Windows with wx2.9.5+
+ notebook:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED,
+ function (event)
+ local ed = GetEditor(notebook:GetSelection())
+ local doc = ed and ed:GetId() and ide.openDocuments[ed:GetId()]
+
+ -- skip activation when any of the following is true:
+ -- (1) there is no document yet, the editor tab was just added,
+ -- so no changes needed as there will be a proper later call;
+ -- (2) the page change event was triggered after a tab is closed;
+ -- (3) on OSX from AddPage event when changing from the last tab
+ -- (this is to work around a duplicate event generated in this case
+ -- that first activates the added tab and then some other tab (2.9.5)).
+
+ local double = (ide.osname == 'Macintosh'
+ and event:GetOldSelection() == notebook:GetPageCount()
+ and debug:traceback():find("'AddPage'"))
+
+ if doc and event:GetOldSelection() ~= -1 and not double then
+ SetEditorSelection(notebook:GetSelection())
+ end
+ end)
+
+ notebook:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE,
+ function (event)
+ ClosePage(event:GetSelection())
+ event:Veto() -- don't propagate the event as the page is already closed
+ end)
+
+ notebook:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK,
+ function (event)
+ -- as this event can be on different tab controls,
+ -- need to find the control to add the page to
+ local tabctrl = event:GetEventObject():DynamicCast("wxAuiTabCtrl")
+ -- check if the active page is in the current control
+ local active = tabctrl:GetActivePage()
+ if (active >= 0 and tabctrl:GetPage(active).window
+ ~= notebook:GetPage(notebook:GetSelection())) then
+ -- if not, need to activate the control that was clicked on;
+ -- find the last window and switch to it (assuming there is always one)
+ assert(tabctrl:GetPageCount() >= 1, "Expected at least one page in a notebook tab control.")
+ local lastwin = tabctrl:GetPage(tabctrl:GetPageCount()-1).window
+ notebook:SetSelection(notebook:GetPageIndex(lastwin))
+ end
+ NewFile()
+ end)
+
+ -- tabs can be dragged around which may change their indexes;
+ -- when this happens stored indexes need to be updated to reflect the change.
+ -- there is DRAG_DONE event that I'd prefer to use, but it
+ -- doesn't fire for some reason using wxwidgets 2.9.5 (tested on Windows).
+ if ide.wxver >= "2.9.5" then
+ notebook:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_END_DRAG,
+ function (event)
+ for page = 0, notebook:GetPageCount()-1 do
+ local editor = GetEditor(page)
+ if editor then ide.openDocuments[editor:GetId()].index = page end
+ end
+ -- first set the selection on the dragged tab to reset its state
+ notebook:SetSelection(event:GetSelection())
+ -- select the content of the tab after drag is done
+ SetEditorSelection(event:GetSelection())
+ event:Skip()
+ end)
+ end
+
+ local selection
+ notebook:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_UP,
+ function (event)
+ -- event:GetSelection() returns the index *inside the current tab*;
+ -- for split notebooks, this may not be the same as the index
+ -- in the notebook we are interested in here
+ local idx = event:GetSelection()
+ local tabctrl = event:GetEventObject():DynamicCast("wxAuiTabCtrl")
+
+ -- save tab index the event is for
+ selection = notebook:GetPageIndex(tabctrl:GetPage(idx).window)
+
+ local menu = wx.wxMenu {
+ { ID_CLOSE, TR("&Close Page") },
+ { ID_CLOSEALL, TR("Close A&ll Pages") },
+ { ID_CLOSEOTHER, TR("Close &Other Pages") },
+ { },
+ { ID_SAVE, TR("&Save") },
+ { ID_SAVEAS, TR("Save &As...") },
+ { },
+ { ID_COPYFULLPATH, TR("Copy Full Path") },
+ { ID_SHOWLOCATION, TR("Show Location") },
+ }
+
+ PackageEventHandle("onMenuEditorTab", menu, notebook, event, selection)
+
+ notebook:PopupMenu(menu)
+ end)
+
+ local function IfAtLeastOneTab(event)
+ event:Enable(notebook:GetPageCount() > 0)
+ if ide.osname == 'Macintosh' and (event:GetId() == ID_CLOSEALL
+ or event:GetId() == ID_CLOSE and notebook:GetPageCount() <= 1)
+ then event:Enable(false) end
+ end
+
+ notebook:Connect(ID_SAVE, wx.wxEVT_COMMAND_MENU_SELECTED, function ()
+ ide:GetDocument(GetEditor(selection)):Save()
+ end)
+ notebook:Connect(ID_SAVE, wx.wxEVT_UPDATE_UI, function(event)
+ local doc = ide:GetDocument(GetEditor(selection))
+ event:Enable(doc:IsModified() or doc:IsNew())
+ end)
+ notebook:Connect(ID_SAVEAS, wx.wxEVT_COMMAND_MENU_SELECTED, function()
+ SaveFileAs(GetEditor(selection))
+ end)
+ notebook:Connect(ID_SAVEAS, wx.wxEVT_UPDATE_UI, IfAtLeastOneTab)
+ notebook:Connect(ID_CLOSE, wx.wxEVT_COMMAND_MENU_SELECTED, function()
+ ClosePage(selection)
+ end)
+ notebook:Connect(ID_CLOSE, wx.wxEVT_UPDATE_UI, IfAtLeastOneTab)
+ notebook:Connect(ID_CLOSEALL, wx.wxEVT_COMMAND_MENU_SELECTED, function()
+ CloseAllPagesExcept(nil)
+ end)
+ notebook:Connect(ID_CLOSEALL, wx.wxEVT_UPDATE_UI, IfAtLeastOneTab)
+ notebook:Connect(ID_CLOSEOTHER, wx.wxEVT_COMMAND_MENU_SELECTED, function ()
+ CloseAllPagesExcept(selection)
+ end)
+ notebook:Connect(ID_CLOSEOTHER, wx.wxEVT_UPDATE_UI, function (event)
+ event:Enable(notebook:GetPageCount() > 1)
+ end)
+ notebook:Connect(ID_SHOWLOCATION, wx.wxEVT_COMMAND_MENU_SELECTED, function()
+ ShowLocation(ide:GetDocument(GetEditor(selection)):GetFilePath())
+ end)
+ notebook:Connect(ID_SHOWLOCATION, wx.wxEVT_UPDATE_UI, IfAtLeastOneTab)
+
+ notebook:Connect(ID_COPYFULLPATH, wx.wxEVT_COMMAND_MENU_SELECTED, function()
+ ide:CopyToClipboard(ide:GetDocument(GetEditor(selection)):GetFilePath())
+ end)
+
+ frame.notebook = notebook
+ return notebook
+end
+
+local function addDND(notebook)
+ -- this handler allows dragging tabs into this notebook
+ notebook:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_ALLOW_DND,
+ function (event)
+ local notebookfrom = event:GetDragSource()
+ if notebookfrom ~= ide.frame.notebook then
+ -- disable cross-notebook movement of specific tabs
+ local win = notebookfrom:GetPage(event:GetSelection())
+ if not win then return end
+ local winid = win:GetId()
+ if winid == ide:GetOutput():GetId()
+ or winid == ide:GetConsole():GetId()
+ or winid == ide:GetProjectTree():GetId()
+ or ide.findReplace:IsPreview(win) -- search results preview
+ then return end
+
+ local mgr = ide.frame.uimgr
+ local pane = mgr:GetPane(notebookfrom)
+ if not pane:IsOk() then return end -- not a managed window
+ if pane:IsFloating() then
+ notebookfrom:GetParent():Hide()
+ else
+ pane:Hide()
+ mgr:Update()
+ end
+ mgr:DetachPane(notebookfrom)
+
+ -- this is a workaround for wxwidgets bug (2.9.5+) that combines
+ -- content from two windows when tab is dragged over an active tab.
+ local mouse = wx.wxGetMouseState()
+ local mouseatpoint = wx.wxPoint(mouse:GetX(), mouse:GetY())
+ local ok, tabs = pcall(function() return wx.wxFindWindowAtPoint(mouseatpoint):DynamicCast("wxAuiTabCtrl") end)
+ if ok then tabs:SetNoneActive() end
+
+ event:Allow()
+ end
+ end)
+
+ -- these handlers allow dragging tabs out of this notebook.
+ -- I couldn't find a good way to stop dragging event as it's not known
+ -- where the event is going to end when it's started, so we manipulate
+ -- the flag that allows splits and disable it when needed.
+ -- It is then enabled in BEGIN_DRAG event.
+ notebook:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_BEGIN_DRAG,
+ function (event)
+ event:Skip()
+
+ -- allow dragging if it was disabled earlier
+ local flags = notebook:GetWindowStyleFlag()
+ if bit.band(flags, wxaui.wxAUI_NB_TAB_SPLIT) == 0 then
+ notebook:SetWindowStyleFlag(flags + wxaui.wxAUI_NB_TAB_SPLIT)
+ end
+ end)
+
+ -- there is currently no support in wxAuiNotebook for dragging tabs out.
+ -- This is implemented as removing a tab that was dragged out and
+ -- recreating it with the right control. This is complicated by the fact
+ -- that tabs can be split, so if the destination is withing the area where
+ -- splits happen, the tab is not removed.
+ notebook:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_END_DRAG,
+ function (event)
+ event:Skip()
+
+ local mgr = ide.frame.uimgr
+ local win = mgr:GetPane(notebook).window
+ local x = win:GetScreenPosition():GetX()
+ local y = win:GetScreenPosition():GetY()
+ local w, h = win:GetSize():GetWidth(), win:GetSize():GetHeight()
+
+ local mouse = wx.wxGetMouseState()
+ local mx, my = mouse:GetX(), mouse:GetY()
+
+ if mx >= x and mx <= x + w and my >= y and my <= y + h then return end
+
+ -- disallow split as the target is outside the notebook
+ local flags = notebook:GetWindowStyleFlag()
+ if bit.band(flags, wxaui.wxAUI_NB_TAB_SPLIT) ~= 0 then
+ notebook:SetWindowStyleFlag(flags - wxaui.wxAUI_NB_TAB_SPLIT)
+ end
+
+ -- don't allow dragging out single tabs from tab ctrl
+ -- as wxwidgets doesn't like removing pages from split notebooks.
+ local tabctrl = event:GetEventObject():DynamicCast("wxAuiTabCtrl")
+ if tabctrl:GetPageCount() == 1 then return end
+
+ local idx = event:GetSelection() -- index within the current tab ctrl
+ local selection = notebook:GetPageIndex(tabctrl:GetPage(idx).window)
+ local label = notebook:GetPageText(selection)
+ local pane = ide:RestorePanelByLabel(label)
+ if not pane then return end
+
+ pane:FloatingPosition(mx-10, my-10)
+ pane:Show()
+ notebook:RemovePage(selection)
+ mgr:Update()
+ end)
+end
+
+local function createBottomNotebook(frame)
+ -- bottomnotebook (errorlog,shellbox)
+ local bottomnotebook = wxaui.wxAuiNotebook(frame, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxDefaultSize,
+ wxaui.wxAUI_NB_DEFAULT_STYLE + wxaui.wxAUI_NB_TAB_EXTERNAL_MOVE
+ - wxaui.wxAUI_NB_CLOSE_ON_ACTIVE_TAB + wx.wxNO_BORDER)
+
+ addDND(bottomnotebook)
+
+ bottomnotebook:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED,
+ function (event)
+ if not ide.findReplace then return end
+ local nb = event:GetEventObject():DynamicCast("wxAuiNotebook")
+ local preview = ide.findReplace:IsPreview(nb:GetPage(nb:GetSelection()))
+ local flags = nb:GetWindowStyleFlag()
+ if preview and bit.band(flags, wxaui.wxAUI_NB_CLOSE_ON_ACTIVE_TAB) == 0 then
+ nb:SetWindowStyleFlag(flags + wxaui.wxAUI_NB_CLOSE_ON_ACTIVE_TAB)
+ elseif not preview and bit.band(flags, wxaui.wxAUI_NB_CLOSE_ON_ACTIVE_TAB) ~= 0 then
+ nb:SetWindowStyleFlag(flags - wxaui.wxAUI_NB_CLOSE_ON_ACTIVE_TAB)
+ end
+ end)
+
+ -- disallow tabs closing
+ bottomnotebook:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE,
+ function (event)
+ local nb = event:GetEventObject():DynamicCast("wxAuiNotebook")
+ if ide.findReplace
+ and ide.findReplace:IsPreview(nb:GetPage(nb:GetSelection())) then
+ event:Skip()
+ else
+ event:Veto()
+ end
+ end)
+
+ local errorlog = ide:CreateStyledTextCtrl(bottomnotebook, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxDefaultSize, wx.wxBORDER_NONE)
+
+ errorlog:Connect(wx.wxEVT_CONTEXT_MENU,
+ function (event)
+ local menu = wx.wxMenu {
+ { ID_UNDO, TR("&Undo") },
+ { ID_REDO, TR("&Redo") },
+ { },
+ { ID_CUT, TR("Cu&t") },
+ { ID_COPY, TR("&Copy") },
+ { ID_PASTE, TR("&Paste") },
+ { ID_SELECTALL, TR("Select &All") },
+ { },
+ { ID_CLEAROUTPUT, TR("C&lear Output Window") },
+ }
+ PackageEventHandle("onMenuOutput", menu, errorlog, event)
+ errorlog:PopupMenu(menu)
+ end)
+
+ errorlog:Connect(ID_CLEAROUTPUT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event) ClearOutput(true) end)
+
+ local shellbox = ide:CreateStyledTextCtrl(bottomnotebook, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxDefaultSize, wx.wxBORDER_NONE)
+
+ local menupos
+ shellbox:Connect(wx.wxEVT_CONTEXT_MENU,
+ function (event)
+ local menu = wx.wxMenu {
+ { ID_UNDO, TR("&Undo") },
+ { ID_REDO, TR("&Redo") },
+ { },
+ { ID_CUT, TR("Cu&t") },
+ { ID_COPY, TR("&Copy") },
+ { ID_PASTE, TR("&Paste") },
+ { ID_SELECTALL, TR("Select &All") },
+ { },
+ { ID_SELECTCONSOLECOMMAND, TR("&Select Command") },
+ { ID_CLEARCONSOLE, TR("C&lear Console Window") },
+ }
+ menupos = event:GetPosition()
+ PackageEventHandle("onMenuConsole", menu, shellbox, event)
+ shellbox:PopupMenu(menu)
+ end)
+
+ shellbox:Connect(ID_SELECTCONSOLECOMMAND, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event) ConsoleSelectCommand(menupos) end)
+ shellbox:Connect(ID_CLEARCONSOLE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event) ide:GetConsole():Erase() end)
+
+ bottomnotebook:AddPage(errorlog, TR("Output"), true)
+ bottomnotebook:AddPage(shellbox, TR("Local console"), false)
+
+ bottomnotebook.errorlog = errorlog
+ bottomnotebook.shellbox = shellbox
+
+ frame.bottomnotebook = bottomnotebook
+ return bottomnotebook
+end
+
+local function createProjNotebook(frame)
+ local projnotebook = wxaui.wxAuiNotebook(frame, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxDefaultSize,
+ wxaui.wxAUI_NB_DEFAULT_STYLE + wxaui.wxAUI_NB_TAB_EXTERNAL_MOVE
+ - wxaui.wxAUI_NB_CLOSE_ON_ACTIVE_TAB + wx.wxNO_BORDER)
+
+ addDND(projnotebook)
+
+ -- disallow tabs closing
+ projnotebook:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE,
+ function (event) event:Veto() end)
+
+ frame.projnotebook = projnotebook
+ return projnotebook
+end
+
+-- ----------------------------------------------------------------------------
+-- Add the child windows to the frame
+
+local frame = createFrame()
+ide.frame = frame
+createToolBar(frame)
+createNotebook(frame)
+createProjNotebook(frame)
+createBottomNotebook(frame)
+
+do
+ local frame = ide.frame
+ local mgr = frame.uimgr
+
+ --[[mgr:AddPane(frame.toolBar, wxaui.wxAuiPaneInfo():
+ Name("toolbar"):Caption("Toolbar"):
+ ToolbarPane():Top():CloseButton(false):PaneBorder(false):
+ LeftDockable(false):RightDockable(false))]]--
+ mgr:AddPane(frame.notebook, wxaui.wxAuiPaneInfo():
+ Name("notebook"):
+ CenterPane():PaneBorder(false))
+ mgr:AddPane(frame.projnotebook, wxaui.wxAuiPaneInfo():
+ Name("projpanel"):CaptionVisible(false):
+ MinSize(200,200):FloatingSize(200,400):
+ Left():Layer(1):Position(1):PaneBorder(false):
+ CloseButton(true):MaximizeButton(false):PinButton(true))
+ mgr:AddPane(frame.bottomnotebook, wxaui.wxAuiPaneInfo():
+ Name("bottomnotebook"):CaptionVisible(false):
+ MinSize(100,100):BestSize(200,200):FloatingSize(400,200):
+ Bottom():Layer(1):Position(1):PaneBorder(false):
+ CloseButton(true):MaximizeButton(false):PinButton(true))
+ --mgr:GetPane("toolbar"):Show(false)
+ mgr:GetPane("projpanel"):Show(false)
+ mgr:GetPane("bottomnotebook"):Show(false)
+
+ if type(ide.config.bordersize) == 'number' then
+ for _, uimgr in pairs {mgr, frame.notebook:GetAuiManager(),
+ frame.bottomnotebook:GetAuiManager(), frame.projnotebook:GetAuiManager()} do
+ uimgr:GetArtProvider():SetMetric(wxaui.wxAUI_DOCKART_SASH_SIZE,
+ ide.config.bordersize)
+ end
+ end
+
+ for _, nb in pairs {frame.bottomnotebook, frame.projnotebook} do
+ nb:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK,
+ function() PaneFloatToggle(nb) end)
+ end
+
+ mgr.defaultPerspective = mgr:SavePerspective()
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/ids.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/ids.lua
new file mode 100644
index 0000000..d53ae83
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/ids.lua
@@ -0,0 +1,190 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Lomtik Software (J. Winwood & John Labenski)
+-- Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+-- Generate a unique new wxWindowID
+local ID_IDCOUNTER = wx.wxID_HIGHEST + 1
+function NewID()
+ ID_IDCOUNTER = ID_IDCOUNTER + 1
+ return ID_IDCOUNTER
+end
+
+-- some Ubuntu versions (Ubuntu 13.10) ignore labels on stock menu IDs,
+-- so don't use stock IDs on Linux
+local linux = ide.osname == 'Unix'
+
+ID_SEPARATOR = NewID()
+-- File menu
+ID_NEW = linux and NewID() or wx.wxID_NEW
+ID_OPEN = linux and NewID() or wx.wxID_OPEN
+ID_CLOSE = NewID()
+ID_CLOSEALL = NewID()
+ID_CLOSEOTHER = NewID()
+ID_NEWFILE = NewID()
+ID_NEWDIRECTORY = NewID()
+ID_RENAMEFILE = NewID()
+ID_DELETEFILE = NewID()
+ID_SAVE = linux and NewID() or wx.wxID_SAVE
+ID_SAVEAS = linux and NewID() or wx.wxID_SAVEAS
+ID_SAVEALL = NewID()
+ID_RECENTFILES = NewID()
+ID_RECENTFILESCLEAR = NewID()
+ID_RECENTFILESPREV = NewID()
+ID_RECENTFILESNEXT = NewID()
+ID_RECENTPROJECTS = NewID()
+ID_RECENTPROJECTSCLEAR = NewID()
+ID_RECENTPROJECTSPREV = NewID()
+ID_PRINT = NewID()
+ID_PAGESETUP = NewID()
+ID_EXIT = linux and NewID() or wx.wxID_EXIT
+-- Edit menu
+ID_CUT = linux and NewID() or wx.wxID_CUT
+ID_COPY = linux and NewID() or wx.wxID_COPY
+ID_PASTE = linux and NewID() or wx.wxID_PASTE
+ID_SELECTALL = linux and NewID() or wx.wxID_SELECTALL
+ID_UNDO = linux and NewID() or wx.wxID_UNDO
+ID_REDO = linux and NewID() or wx.wxID_REDO
+ID_SHOWTOOLTIP = NewID()
+ID_AUTOCOMPLETE = NewID()
+ID_AUTOCOMPLETEENABLE = NewID()
+ID_COMMENT = NewID()
+ID_FOLD = NewID()
+ID_CLEARDYNAMICWORDS = NewID()
+ID_SOURCE = NewID()
+ID_REINDENT = NewID()
+ID_BOOKMARK = NewID()
+ID_BOOKMARKTOGGLE = NewID()
+ID_BOOKMARKNEXT = NewID()
+ID_BOOKMARKPREV = NewID()
+ID_NAVIGATE = NewID()
+ID_NAVIGATETOFILE = NewID()
+ID_NAVIGATETOLINE = NewID()
+ID_NAVIGATETOSYMBOL = NewID()
+ID_NAVIGATETOMETHOD = NewID()
+-- don't use wx.wxID_PREFERENCES to avoid merging with OSX app menu, because
+-- Apple guidelines describe Preferences as a "normal" item without submenus.
+ID_PREFERENCES = NewID()
+ID_PREFERENCESSYSTEM = NewID()
+ID_PREFERENCESUSER = NewID()
+-- Search menu
+ID_FIND = linux and NewID() or wx.wxID_FIND
+ID_FINDNEXT = NewID()
+ID_FINDPREV = NewID()
+ID_FINDSELECTNEXT = NewID()
+ID_FINDSELECTPREV = NewID()
+ID_REPLACE = NewID()
+ID_FINDINFILES = NewID()
+ID_REPLACEINFILES = NewID()
+ID_SORT = NewID()
+-- View menu
+ID_VIEWFILETREE = NewID()
+ID_VIEWOUTPUT = NewID()
+ID_VIEWCALLSTACK = NewID()
+ID_VIEWWATCHWINDOW = NewID()
+ID_VIEWOUTLINE = NewID()
+ID_VIEWMARKERS = NewID()
+ID_VIEWTOOLBAR = NewID()
+ID_VIEWSTATUSBAR = NewID()
+ID_VIEWDEFAULTLAYOUT = NewID()
+ID_VIEWFULLSCREEN = NewID()
+ID_VIEWMINIMIZE = NewID()
+ID_ZOOM = NewID()
+ID_ZOOMRESET = NewID()
+ID_ZOOMIN = NewID()
+ID_ZOOMOUT = NewID()
+-- Project menu
+ID_BREAKPOINT = NewID()
+ID_BREAKPOINTTOGGLE = NewID()
+ID_BREAKPOINTNEXT = NewID()
+ID_BREAKPOINTPREV = NewID()
+ID_TOGGLEBREAKPOINT = ID_BREAKPOINTTOGGLE -- for compatibility; to remove after v1.30
+ID_COMPILE = NewID()
+ID_ANALYZE = NewID()
+ID_RUN = NewID()
+ID_RUNNOW = NewID()
+ID_ATTACHDEBUG = NewID()
+ID_STARTDEBUG = NewID()
+ID_STOPDEBUG = NewID()
+ID_DETACHDEBUG = NewID()
+ID_STEP = NewID()
+ID_STEPOVER = NewID()
+ID_STEPOUT = NewID()
+ID_RUNTO = NewID()
+ID_BREAK = NewID()
+ID_TRACE = NewID()
+ID_CLEAROUTPUT = NewID()
+ID_CLEARCONSOLE = NewID()
+ID_COMMANDLINEPARAMETERS = NewID()
+ID_INTERPRETER = NewID()
+ID_PROJECTDIR = NewID()
+ID_PROJECTDIRFROMFILE = NewID()
+ID_PROJECTDIRFROMDIR = NewID()
+ID_PROJECTDIRCHOOSE = NewID()
+-- Help menu
+ID_ABOUT = linux and NewID() or wx.wxID_ABOUT
+ID_HELPPROJECT = NewID()
+ID_HELPDOCUMENTATION = NewID()
+ID_HELPGETTINGSTARTED = NewID()
+ID_HELPTUTORIALS = NewID()
+ID_HELPFAQ = NewID()
+ID_HELPCOMMUNITY = NewID()
+-- Watch window menu items
+ID_ADDWATCH = NewID()
+ID_EDITWATCH = NewID()
+ID_DELETEWATCH = NewID()
+ID_COPYWATCHVALUE = NewID()
+-- Editor popup menu items
+ID_GOTODEFINITION = NewID()
+ID_RENAMEALLINSTANCES = NewID()
+ID_REPLACEALLSELECTIONS = NewID()
+ID_QUICKADDWATCH = NewID()
+ID_QUICKEVAL = NewID()
+ID_ADDTOSCRATCHPAD = NewID()
+-- filetree menu
+ID_HIDEEXTENSION = NewID()
+ID_SETSTARTFILE = NewID()
+ID_UNSETSTARTFILE = NewID()
+ID_SHOWEXTENSION = NewID()
+ID_SHOWEXTENSIONALL = NewID()
+ID_MAPDIRECTORY = NewID()
+ID_UNMAPDIRECTORY = NewID()
+ID_OPENEXTENSION = NewID()
+ID_COPYFULLPATH = NewID()
+ID_SHOWLOCATION = NewID()
+ID_REFRESH = NewID()
+ID_SYMBOLDIRREFRESH = NewID()
+ID_SYMBOLDIRINDEX = NewID()
+ID_SYMBOLDIRDISABLE = NewID()
+ID_SYMBOLDIRENABLE = NewID()
+-- outline menu
+ID_OUTLINESORT = NewID()
+-- console menu
+ID_SELECTCONSOLECOMMAND = NewID()
+-- search toolbar
+ID_FINDALL = NewID()
+ID_FINDREPLACENEXT = NewID()
+ID_FINDREPLACEALL = NewID()
+ID_FINDSETDIR = NewID()
+ID_FINDSETTOPROJDIR = NewID()
+ID_FINDOPTSCOPE = NewID()
+ID_FINDOPTSTATUS = NewID()
+ID_FINDOPTDIRECTION = NewID()
+ID_FINDOPTWRAPWROUND = NewID()
+ID_FINDOPTSELECTION = NewID()
+ID_FINDOPTWORD = NewID()
+ID_FINDOPTCASE = NewID()
+ID_FINDOPTREGEX = NewID()
+ID_FINDOPTCONTEXT = NewID()
+ID_FINDOPTSUBDIR = NewID()
+ID_FINDOPTMULTIRESULTS = NewID()
+ID_RECENTSCOPECLEAR = NewID()
+
+local ids = {}
+function IDgen (name)
+ ids[name] = ids[name] or NewID()
+ return ids[name]
+end
+function IDget (name) return ids[name] end
+
+ID = setmetatable({}, ide.proto.ID)
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/inspect.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/inspect.lua
new file mode 100644
index 0000000..a9eef01
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/inspect.lua
@@ -0,0 +1,243 @@
+-- Copyright 2012-15 Paul Kulchenko, ZeroBrane LLC
+-- Integration with LuaInspect
+---------------------------------------------------------
+
+local M, LA, LI, T = {}
+
+local function init()
+ if LA then return end
+
+ -- metalua is using 'checks', which noticeably slows the execution
+ -- stab it with out own
+ package.loaded.checks = {}
+ checks = function() end
+
+ LA = require "luainspect.ast"
+ LI = require "luainspect.init"
+ T = require "luainspect.types"
+end
+
+function M.pos2line(pos)
+ return pos and 1 + select(2, M.src:sub(1,pos):gsub(".-\n[^\n]*", ""))
+end
+
+function M.warnings_from_string(src, file)
+ init()
+
+ local ast, err, linenum, colnum = LA.ast_from_string(src, file)
+ if not ast and err then return nil, err, linenum, colnum end
+
+ LI.uninspect(ast)
+ if ide.config.staticanalyzer.infervalue then
+ local tokenlist = LA.ast_to_tokenlist(ast, src)
+ LI.clear_cache()
+ LI.inspect(ast, tokenlist, src)
+ LI.mark_related_keywords(ast, tokenlist, src)
+ else
+ -- stub out LI functions that depend on tokenlist,
+ -- which is not built in the "fast" mode
+ local ec, iv = LI.eval_comments, LI.infer_values
+ LI.eval_comments, LI.infer_values = function() end, function() end
+
+ LI.inspect(ast, nil, src)
+ LA.ensure_parents_marked(ast)
+
+ LI.eval_comments, LI.infer_values = ec, iv
+ end
+
+ local globinit = {arg = true} -- skip `arg` global variable
+ local spec = GetSpec(wx.wxFileName(file):GetExt())
+ for k in pairs(spec and GetApi(spec.apitype or "none").ac.childs or {}) do
+ globinit[k] = true
+ end
+
+ M.src, M.file = src, file
+ return M.show_warnings(ast, globinit)
+end
+
+local function cleanError(err)
+ return err and err:gsub(".-:%d+: file%s+",""):gsub(", line (%d+), char %d+", ":%1")
+end
+
+function AnalyzeFile(file)
+ local src, err = FileRead(file)
+ if not src and err then return nil, TR("Can't open file '%s': %s"):format(file, err) end
+
+ local warn, err, line, pos = M.warnings_from_string(src, file)
+ return warn, cleanError(err), line, pos
+end
+
+function AnalyzeString(src, file)
+ local warn, err, line, pos = M.warnings_from_string(src, file or "<string>")
+ return warn, cleanError(err), line, pos
+end
+
+function M.show_warnings(top_ast, globinit)
+ local warnings = {}
+ local function warn(msg, linenum, path)
+ warnings[#warnings+1] = (path or M.file or "?") .. ":" .. (linenum or M.pos2line(M.ast.pos) or 0) .. ": " .. msg
+ end
+ local function known(o) return not T.istype[o] end
+ local function index(f) -- build abc.def.xyz name recursively
+ if not f or f.tag ~= 'Index' or not f[1] or not f[2] then return end
+ local main = f[1].tag == 'Id' and f[1][1] or index(f[1])
+ return main and type(f[2][1]) == "string" and (main .. '.' .. f[2][1]) or nil
+ end
+ local globseen, isseen, fieldseen = globinit or {}, {}, {}
+ LA.walk(top_ast, function(ast)
+ M.ast = ast
+ local path, line = tostring(ast.lineinfo):gsub('<C|','<'):match('<([^|]+)|L(%d+)')
+ local name = ast[1]
+ -- check if we're masking a variable in the same scope
+ if ast.localmasking and name ~= '_' and
+ ast.level == ast.localmasking.level then
+ local linenum = ast.localmasking.lineinfo
+ and tostring(ast.localmasking.lineinfo.first):match('|L(%d+)')
+ or M.pos2line(ast.localmasking.pos)
+ local parent = ast.parent and ast.parent.parent
+ local func = parent and parent.tag == 'Localrec'
+ warn("local " .. (func and 'function' or 'variable') .. " '" ..
+ name .. "' masks earlier declaration " ..
+ (linenum and "on line " .. linenum or "in the same scope"),
+ line, path)
+ end
+ if ast.localdefinition == ast and not ast.isused and
+ not ast.isignore then
+ local parent = ast.parent and ast.parent.parent
+ local isparam = parent and parent.tag == 'Function'
+ if isparam then
+ if name ~= 'self' then
+ local func = parent.parent and parent.parent.parent
+ local assignment = not func.tag or func.tag == 'Set' or func.tag == 'Localrec'
+ -- anonymous functions can also be defined in expressions,
+ -- for example, 'Op' or 'Return' tags
+ local expression = not assignment and func.tag
+ local func1 = func[1][1]
+ local fname = assignment and func1 and type(func1[1]) == 'string'
+ and func1[1] or (func1 and func1.tag == 'Index' and index(func1))
+ -- "function foo(bar)" => func.tag == 'Set'
+ -- `Set{{`Id{"foo"}},{`Function{{`Id{"bar"}},{}}}}
+ -- "local function foo(bar)" => func.tag == 'Localrec'
+ -- "local _, foo = 1, function(bar)" => func.tag == 'Local'
+ -- "print(function(bar) end)" => func.tag == nil
+ -- "a = a or function(bar) end" => func.tag == nil
+ -- "return(function(bar) end)" => func.tag == 'Return'
+ -- "function tbl:foo(bar)" => func.tag == 'Set'
+ -- `Set{{`Index{`Id{"tbl"},`String{"foo"}}},{`Function{{`Id{"self"},`Id{"bar"}},{}}}}
+ -- "function tbl.abc:foo(bar)" => func.tag == 'Set'
+ -- `Set{{`Index{`Index{`Id{"tbl"},`String{"abc"}},`String{"foo"}}},{`Function{{`Id{"self"},`Id{"bar"}},{}}}},
+ warn("unused parameter '" .. name .. "'" ..
+ (func and (assignment or expression)
+ and (fname and func.tag
+ and (" in function '" .. fname .. "'")
+ or " in anonymous function")
+ or ""),
+ line, path)
+ end
+ else
+ if parent and parent.tag == 'Localrec' then -- local function foo...
+ warn("unused local function '" .. name .. "'", line, path)
+ else
+ warn("unused local variable '" .. name .. "'; "..
+ "consider removing or replacing with '_'", line, path)
+ end
+ end
+ end
+ -- added check for "fast" mode as ast.seevalue relies on value evaluation,
+ -- which is very slow even on simple and short scripts
+ if ide.config.staticanalyzer.infervalue and ast.isfield
+ and not(known(ast.seevalue.value) and ast.seevalue.value ~= nil) then
+ if not fieldseen[name] then
+ fieldseen[name] = true
+ local var = index(ast.parent)
+ local parent = ast.parent and var
+ and (" in '"..var:gsub("%."..name.."$","").."'")
+ or ""
+
+ local tblref = ast.parent and ast.parent[1]
+ local localparam = (tblref and tblref.localdefinition
+ and tblref.localdefinition.isparam)
+ if not localparam then
+ warn("first use of unknown field '" .. name .."'"..parent,
+ ast.lineinfo and tostring(ast.lineinfo.first):match('|L(%d+)'), path)
+ end
+ end
+ elseif ast.tag == 'Id' and not ast.localdefinition and not ast.definedglobal then
+ if not globseen[name] then
+ globseen[name] = true
+ local parent = ast.parent
+ -- if being called and not one of the parameters
+ if parent and parent.tag == 'Call' and parent[1] == ast then
+ warn("first use of unknown global function '" .. name .. "'", line, path)
+ else
+ warn("first use of unknown global variable '" .. name .. "'", line, path)
+ end
+ end
+ elseif ast.tag == 'Id' and not ast.localdefinition and ast.definedglobal then
+ local parent = ast.parent and ast.parent.parent
+ if parent and parent.tag == 'Set' and not globseen[name] -- report assignments to global
+ -- only report if it is on the left side of the assignment
+ -- this is a bit tricky as it can be assigned as part of a, b = c, d
+ -- `Set{ {lhs+} {expr+} } -- lhs1, lhs2... = e1, e2...
+ and parent[1] == ast.parent
+ and parent[2][1].tag ~= "Function" then -- but ignore global functions
+ warn("first assignment to global variable '" .. name .. "'", line, path)
+ globseen[name] = true
+ end
+ elseif (ast.tag == 'Set' or ast.tag == 'Local') and #(ast[2]) > #(ast[1]) then
+ warn(("value discarded in multiple assignment: %d values assigned to %d variable%s")
+ :format(#(ast[2]), #(ast[1]), #(ast[1]) > 1 and 's' or ''), line, path)
+ end
+ local vast = ast.seevalue or ast
+ local note = vast.parent
+ and (vast.parent.tag == 'Call' or vast.parent.tag == 'Invoke')
+ and vast.parent.note
+ if note and not isseen[vast.parent] and type(name) == "string" then
+ isseen[vast.parent] = true
+ warn("function '" .. name .. "': " .. note, line, path)
+ end
+ end)
+ return warnings
+end
+
+local frame = ide.frame
+
+-- insert after "Compile" item
+local _, menu, compilepos = ide:FindMenuItem(ID_COMPILE)
+if compilepos then
+ menu:Insert(compilepos+1, ID_ANALYZE, TR("Analyze")..KSC(ID_ANALYZE), TR("Analyze the source code"))
+end
+
+local function analyzeProgram(editor)
+ -- save all files (if requested) for "infervalue" analysis to keep the changes on disk
+ if ide.config.editor.saveallonrun and ide.config.staticanalyzer.infervalue then SaveAll(true) end
+ if ide:GetLaunchedProcess() == nil and not ide:GetDebugger():IsConnected() then ClearOutput() end
+ DisplayOutput("Analyzing the source code")
+ frame:Update()
+
+ local editorText = editor:GetTextDyn()
+ local doc = ide:GetDocument(editor)
+ local filePath = doc:GetFilePath() or doc:GetFileName()
+ local warn, err = M.warnings_from_string(editorText, filePath)
+ if err then -- report compilation error
+ DisplayOutputLn((": not completed.\n%s"):format(cleanError(err)))
+ return false
+ end
+
+ DisplayOutputLn((": %s warning%s.")
+ :format(#warn > 0 and #warn or 'no', #warn == 1 and '' or 's'))
+ DisplayOutputNoMarker(table.concat(warn, "\n") .. (#warn > 0 and "\n" or ""))
+
+ return true -- analyzed ok
+end
+
+frame:Connect(ID_ANALYZE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function ()
+ ActivateOutput()
+ local editor = GetEditor()
+ if not analyzeProgram(editor) then
+ CompileProgram(editor, { reportstats = false, keepoutput = true })
+ end
+ end)
+frame:Connect(ID_ANALYZE, wx.wxEVT_UPDATE_UI,
+ function (event) event:Enable(GetEditor() ~= nil) end)
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/iofilters.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/iofilters.lua
new file mode 100644
index 0000000..76e6135
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/iofilters.lua
@@ -0,0 +1,71 @@
+-- Copyright 2011-14 Paul Kulchenko, ZeroBrane LLC
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+
+ide.iofilters["GermanUtf8Ascii"] = {
+
+ -- this function converts some utf8 character output. It's a hack.
+ -- Since luxinia is not utf8 prepared, this is still necessary.
+ -- if you wish to turn this off, edit user.lua and set this filefunction to nil
+ output = function (fpath, content)
+ local utf8escape = ("string").char(195)
+ -- only simple cases are handled (umlauts)
+ local chr = ("string").char
+ local charconv = {
+ [chr(164)] = chr(228), -- ä
+ [chr(182)] = chr(246), -- ö
+ [chr(188)] = chr(252), -- ü
+ [chr(132)] = chr(196), -- Ä
+ [chr(150)] = chr(214), -- Ö
+ [chr(156)] = chr(220), -- Ü
+ [chr(159)] = chr(223), -- ß
+ }
+ return content : gsub (utf8escape.."(.)",charconv)
+ end,
+
+ -- this function is another hack to read an ANSI encoded
+ -- file and converts the umlauts to utf8 chars
+ input = function (fpath, content)
+ local utf8escape = ("string").char(195)
+ local chr = ("string").char
+ local charconv = {
+ [chr(228)] = utf8escape..chr(164), -- ä
+ [chr(246)] = utf8escape..chr(182), -- ö
+ [chr(252)] = utf8escape..chr(188), -- ü
+ [chr(196)] = utf8escape..chr(132), -- Ä
+ [chr(214)] = utf8escape..chr(150), -- Ö
+ [chr(220)] = utf8escape..chr(156), -- Ü
+ [chr(223)] = utf8escape..chr(159), -- ß
+ }
+ local lst = "["
+ for k in pairs(charconv) do lst = lst .. k end
+ lst = lst.."]"
+
+ return content:gsub(lst,charconv)
+ end,
+
+}
+
+ide.iofilters["0d0d0aFix"] = {
+ -- this function converts 0d0d0a line ending to 0d0a
+ input = function(fpath, content)
+ return content:gsub("\013\013\010","\013\010")
+ end,
+}
+
+--üäß
+
+for i,filter in pairs(ide.iofilters) do
+ if filter.input and filter.output then
+ assert(filter.output("",filter.input("","äöüÄÖÜß")),
+ "„”äöüÄÖÜß","UTF8-ANSI conversion failed: "..(i))
+ end
+end
+
+-- which: "input" or "output"
+function GetConfigIOFilter(which)
+ local filtername = ide.config.editor.iofilter
+ return (filtername and ide.iofilters[filtername] and ide.iofilters[filtername][which])
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/keymap.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/keymap.lua
new file mode 100644
index 0000000..13be885
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/keymap.lua
@@ -0,0 +1,136 @@
+local ide = ide
+
+--[[
+Accelerator general syntax is any combination of "CTRL", "ALT" and "SHIFT"
+strings (case doesn't matter) separated by either '-' or '+' characters and
+followed by the accelerator itself. The accelerator may be any alphanumeric
+character, any function key (from F1 to F12) or one of the special characters
+listed below (again, case doesn't matter):
+
+ DEL/DELETE Delete key
+ INS/INSERT Insert key
+ ENTER/RETURN Enter key
+ PGUP PageUp key
+ PGDN PageDown key
+ LEFT Left cursor arrow key
+ RIGHT Right cursor arrow key
+ UP Up cursor arrow key
+ DOWN Down cursor arrow key
+ HOME Home key
+ END End key
+ SPACE Space
+ TAB Tab key
+ ESC/ESCAPE Escape key (Windows only)
+--]]
+
+ide.config.keymap = {
+-- File menu
+ [ID.NEW] = "Ctrl-N",
+ [ID.OPEN] = "Ctrl-O",
+ [ID.CLOSE] = "Ctrl-W",
+ [ID.SAVE] = "Ctrl-S",
+ [ID.SAVEAS] = "Alt-Shift-S",
+ [ID.SAVEALL] = "",
+ [ID.RECENTFILES] = "",
+ [ID.RECENTFILESPREV] = "Ctrl-,",
+ [ID.RECENTFILESNEXT] = "Ctrl-.",
+ [ID.EXIT] = "Ctrl-Q",
+ [ID.RECENTPROJECTSPREV] = "Ctrl-Shift-<",
+-- Edit menu
+ [ID.CUT] = "Ctrl-X",
+ [ID.COPY] = "Ctrl-C",
+ [ID.PASTE] = "Ctrl-V",
+ [ID.SELECTALL] = "Ctrl-A",
+ [ID.UNDO] = "Ctrl-Z",
+ [ID.REDO] = "Ctrl-Y",
+ [ID.SHOWTOOLTIP] = "Ctrl-T",
+ [ID.AUTOCOMPLETE] = "Ctrl-K",
+ [ID.AUTOCOMPLETEENABLE] = "",
+ [ID.COMMENT] = "Ctrl-U",
+ [ID.FOLD] = "F12",
+ [ID.CLEARDYNAMICWORDS] = "",
+ [ID.REINDENT] = "Ctrl-I",
+ [ID.BOOKMARKTOGGLE] = "Ctrl-F2",
+ [ID.BOOKMARKNEXT] = "F2",
+ [ID.BOOKMARKPREV] = "Shift-F2",
+ [ID.NAVIGATETOFILE] = "Ctrl-P",
+ [ID.NAVIGATETOLINE] = "Ctrl-G",
+ [ID.NAVIGATETOSYMBOL] = "Ctrl-B",
+ [ID.NAVIGATETOMETHOD] = "Ctrl-;",
+-- Search menu
+ [ID.FIND] = "Ctrl-F",
+ [ID.FINDNEXT] = "F3",
+ [ID.FINDPREV] = "Shift-F3",
+ [ID.FINDSELECTNEXT] = "Ctrl-F3",
+ [ID.FINDSELECTPREV] = "Ctrl-Shift-F3",
+-- [ID.REPLACE] = "Ctrl-R",
+ [ID.FINDINFILES] = "Ctrl-Shift-F",
+ [ID.REPLACEINFILES] = "Ctrl-Shift-R",
+ [ID.SORT] = "",
+-- View menu
+ [ID.VIEWFILETREE] = "Ctrl-Shift-P",
+ [ID.VIEWOUTPUT] = "Ctrl-Shift-O",
+ [ID.VIEWWATCHWINDOW] = "Ctrl-Shift-W",
+ [ID.VIEWCALLSTACK] = "Ctrl-Shift-S",
+ [ID.VIEWDEFAULTLAYOUT] = "",
+ [ID.VIEWFULLSCREEN] = "Ctrl-Shift-A",
+ [ID.ZOOMRESET] = "Ctrl-0",
+ [ID.ZOOMIN] = "Ctrl-+",
+ [ID.ZOOMOUT] = "Ctrl--",
+-- Project menu
+ [ID.RUN] = "F6",
+ [ID.RUNNOW] = "Ctrl-F6",
+ [ID.COMPILE] = "F7",
+ [ID.ANALYZE] = "Shift-F7",
+ [ID.STARTDEBUG] = "F5",
+ [ID.ATTACHDEBUG] = "",
+ [ID.DETACHDEBUG] = "",
+ [ID.STOPDEBUG] = "Shift-F5",
+ [ID.STEP] = "F10",
+ [ID.STEPOVER] = "Shift-F10",
+ [ID.STEPOUT] = "Ctrl-F10",
+ [ID.RUNTO] = "Ctrl-Shift-F10",
+ [ID.TRACE] = "",
+ [ID.BREAK] = "",
+ [ID.BREAKPOINTTOGGLE] = "Ctrl-F9",
+ [ID.BREAKPOINTNEXT] = "F9",
+ [ID.BREAKPOINTPREV] = "Shift-F9",
+ [ID.CLEAROUTPUT] = "",
+ [ID.INTERPRETER] = "",
+ [ID.PROJECTDIR] = "",
+-- Help menu
+ [ID.ABOUT] = "F1",
+-- Watch window menu items
+ [ID.ADDWATCH] = "Ins",
+ [ID.EDITWATCH] = "F2",
+ [ID.DELETEWATCH] = "Del",
+-- Editor popup menu items
+ [ID.QUICKADDWATCH] = "",
+ [ID.QUICKEVAL] = "",
+-- Filetree popup menu items
+ [ID.RENAMEFILE] = "F2",
+ [ID.DELETEFILE] = "Del",
+}
+
+function KSC(id, default)
+ -- this is only for the rare case of someone assigning a complete list
+ -- to ide.config.keymap.
+ local keymap = ide.config.keymap
+ return (keymap[id] and "\t"..keymap[id]) or (default and "\t"..default) or ""
+end
+
+ide.config.editor.keymap = {
+ -- key, modifier, command, os: http://www.scintilla.org/ScintillaDoc.html#KeyboardCommands
+ -- Cmd+Left/Right moves to start/end of line
+ {wxstc.wxSTC_KEY_LEFT, wxstc.wxSTC_SCMOD_CTRL, wxstc.wxSTC_CMD_HOME, "Macintosh"},
+ {wxstc.wxSTC_KEY_RIGHT, wxstc.wxSTC_SCMOD_CTRL, wxstc.wxSTC_CMD_LINEEND, "Macintosh"},
+ -- Cmd+Shift+Left/Right selects to the beginning/end of the line
+ {wxstc.wxSTC_KEY_LEFT, wxstc.wxSTC_SCMOD_CTRL+wxstc.wxSTC_SCMOD_SHIFT, wxstc.wxSTC_CMD_HOMEEXTEND, "Macintosh"},
+ {wxstc.wxSTC_KEY_RIGHT, wxstc.wxSTC_SCMOD_CTRL+wxstc.wxSTC_SCMOD_SHIFT, wxstc.wxSTC_CMD_LINEENDEXTEND, "Macintosh"},
+ -- Cmd+Shift+Up/Down selects to the beginning/end of the text
+ {wxstc.wxSTC_KEY_UP, wxstc.wxSTC_SCMOD_CTRL+wxstc.wxSTC_SCMOD_SHIFT, wxstc.wxSTC_CMD_LINEUPEXTEND, "Macintosh"},
+ {wxstc.wxSTC_KEY_DOWN, wxstc.wxSTC_SCMOD_CTRL+wxstc.wxSTC_SCMOD_SHIFT, wxstc.wxSTC_CMD_LINEDOWNEXTEND, "Macintosh"},
+ -- Opt+Left/Right moves one word left (to the beginning)/right (to the end)
+ {wxstc.wxSTC_KEY_LEFT, wxstc.wxSTC_SCMOD_ALT, wxstc.wxSTC_CMD_WORDLEFT, "Macintosh"},
+ {wxstc.wxSTC_KEY_RIGHT, wxstc.wxSTC_SCMOD_ALT, wxstc.wxSTC_CMD_WORDRIGHTEND, "Macintosh"},
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/markers.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/markers.lua
new file mode 100644
index 0000000..0708f4c
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/markers.lua
@@ -0,0 +1,247 @@
+-- Copyright 2015 Paul Kulchenko, ZeroBrane LLC
+
+local ide = ide
+ide.markers = {
+ markersCtrl = nil,
+ imglist = ide:CreateImageList("MARKERS", "FILE-NORMAL", "DEBUG-BREAKPOINT-TOGGLE", "BOOKMARK-TOGGLE"),
+ needrefresh = {},
+ settings = {markers = {}},
+}
+
+local unpack = table.unpack or unpack
+local markers = ide.markers
+local caches = {}
+local image = { FILE = 0, BREAKPOINT = 1, BOOKMARK = 2 }
+local markertypes = {breakpoint = 0, bookmark = 0}
+local maskall = 0
+for markertype in pairs(markertypes) do
+ markertypes[markertype] = 2^ide:GetMarker(markertype)
+ maskall = maskall + markertypes[markertype]
+end
+
+local function resetMarkersTimer()
+ if ide.config.markersinactivity then
+ ide.timers.markers:Start(ide.config.markersinactivity*1000, wx.wxTIMER_ONE_SHOT)
+ end
+end
+
+local function needRefresh(editor)
+ ide.markers.needrefresh[editor] = true
+ resetMarkersTimer()
+end
+
+local function getMarkers(editor)
+ local edmarkers = {}
+ local line = editor:MarkerNext(0, maskall)
+ while line > -1 do
+ local markerval = editor:MarkerGet(line)
+ for markertype, val in pairs(markertypes) do
+ if bit.band(markerval, val) > 0 then
+ table.insert(edmarkers, {line, markertype})
+ end
+ end
+ line = editor:MarkerNext(line + 1, maskall)
+ end
+ return edmarkers
+end
+
+local function markersRefresh()
+ local ctrl = ide.markers.markersCtrl
+ local win = ide:GetMainFrame():FindFocus()
+ ctrl:Freeze()
+
+ for editor in pairs(ide.markers.needrefresh) do
+ local cache = caches[editor]
+ if cache then
+ local fileitem = cache.fileitem
+ if not fileitem then
+ local filename = ide:GetDocument(editor):GetTabText()
+ local root = ctrl:GetRootItem()
+ if not root or not root:IsOk() then return end
+ fileitem = ctrl:AppendItem(root, filename, image.FILE)
+ ctrl:SortChildren(root)
+ cache.fileitem = fileitem
+ end
+
+ -- disabling event handlers is not strictly necessary, but it's expected
+ -- to fix a crash on Windows that had DeleteChildren in the trace (#442).
+ ctrl:SetEvtHandlerEnabled(false)
+ ctrl:DeleteChildren(fileitem)
+ ctrl:SetEvtHandlerEnabled(true)
+
+ for _, edmarker in ipairs(getMarkers(editor)) do
+ local line, markertype = unpack(edmarker)
+ local text = ("%d: %s"):format(line+1, FixUTF8(editor:GetLineDyn(line)))
+ ctrl:AppendItem(fileitem, text:gsub("[\r\n]+$",""), image[markertype:upper()])
+ end
+
+ -- if no markers added, then remove the file from the markers list
+ ctrl:Expand(fileitem)
+ if not ctrl:ItemHasChildren(fileitem) then
+ ctrl:Delete(fileitem)
+ cache.fileitem = nil
+ end
+ end
+ end
+
+ ctrl:Thaw()
+ if win and win ~= ide:GetMainFrame():FindFocus() then win:SetFocus() end
+end
+
+local function item2editor(item_id)
+ for editor, cache in pairs(caches) do
+ if cache.fileitem and cache.fileitem:GetValue() == item_id:GetValue() then return editor end
+ end
+end
+
+local function createMarkersWindow()
+ local width, height = 360, 200
+ local ctrl = wx.wxTreeCtrl(ide.frame, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxSize(width, height),
+ wx.wxTR_LINES_AT_ROOT + wx.wxTR_HAS_BUTTONS + wx.wxTR_HIDE_ROOT + wx.wxNO_BORDER)
+
+ markers.markersCtrl = ctrl
+ ide.timers.markers = wx.wxTimer(ctrl)
+
+ ctrl:AddRoot("Markers")
+ ctrl:SetImageList(markers.imglist)
+ ctrl:SetFont(ide.font.fNormal)
+
+ function ctrl:ActivateItem(item_id, toggle)
+ local itemimage = ctrl:GetItemImage(item_id)
+ if itemimage == image.FILE then
+ -- activate editor tab
+ local editor = item2editor(item_id)
+ if editor then ide:GetDocument(editor):SetActive() end
+ else -- clicked on the marker item
+ local parent = ctrl:GetItemParent(item_id)
+ if parent:IsOk() and ctrl:GetItemImage(parent) == image.FILE then
+ local editor = item2editor(parent)
+ if editor then
+ local line = tonumber(ctrl:GetItemText(item_id):match("^(%d+):"))
+ if line then
+ if toggle then
+ local _ = (itemimage == image.BOOKMARK and editor:BookmarkToggle(line-1, false)
+ or itemimage == image.BREAKPOINT and editor:BreakpointToggle(line-1, false))
+ ctrl:Delete(item_id)
+ return -- don't activate the editor when the breakpoint is toggled
+ end
+ editor:GotoLine(line-1)
+ end
+ ide:GetDocument(editor):SetActive()
+ end
+ end
+ end
+ end
+
+ local function activateByPosition(event)
+ local mask = (wx.wxTREE_HITTEST_ONITEMINDENT + wx.wxTREE_HITTEST_ONITEMLABEL
+ + wx.wxTREE_HITTEST_ONITEMICON + wx.wxTREE_HITTEST_ONITEMRIGHT)
+ local item_id, flags = ctrl:HitTest(event:GetPosition())
+
+ if item_id and item_id:IsOk() and bit.band(flags, mask) > 0 then
+ ctrl:ActivateItem(item_id, bit.band(flags, wx.wxTREE_HITTEST_ONITEMICON) > 0)
+ else
+ event:Skip()
+ end
+ return true
+ end
+
+ ctrl:Connect(wx.wxEVT_TIMER, function() markersRefresh() end)
+ ctrl:Connect(wx.wxEVT_LEFT_DOWN, activateByPosition)
+ ctrl:Connect(wx.wxEVT_LEFT_DCLICK, activateByPosition)
+ ctrl:Connect(wx.wxEVT_COMMAND_TREE_ITEM_ACTIVATED, function(event)
+ ctrl:ActivateItem(event:GetItem())
+ end)
+
+ ctrl:Connect(wx.wxEVT_COMMAND_TREE_ITEM_MENU,
+ function (event)
+ local item_id = event:GetItem()
+ local ID_BOOKMARKTOGGLE = ID("markers.bookmarktoggle")
+ local ID_BREAKPOINTTOGGLE = ID("markers.breakpointtoggle")
+ local menu = wx.wxMenu {
+ { ID_BOOKMARKTOGGLE, TR("Toggle Bookmark"), TR("Toggle bookmark") },
+ { ID_BREAKPOINTTOGGLE, TR("Toggle Breakpoint"), TR("Toggle breakpoint") },
+ }
+ local activate = function() ctrl:ActivateItem(item_id, true) end
+ menu:Enable(ID_BOOKMARKTOGGLE, ctrl:GetItemImage(item_id) == image.BOOKMARK)
+ menu:Connect(ID_BOOKMARKTOGGLE, wx.wxEVT_COMMAND_MENU_SELECTED, activate)
+
+ menu:Enable(ID_BREAKPOINTTOGGLE, ctrl:GetItemImage(item_id) == image.BREAKPOINT)
+ menu:Connect(ID_BREAKPOINTTOGGLE, wx.wxEVT_COMMAND_MENU_SELECTED, activate)
+
+ PackageEventHandle("onMenuMarkers", menu, ctrl, event)
+
+ ctrl:PopupMenu(menu)
+ end)
+
+ local function reconfigure(pane)
+ pane:TopDockable(false):BottomDockable(false)
+ :MinSize(150,-1):BestSize(300,-1):FloatingSize(200,300)
+ end
+
+ local layout = ide:GetSetting("/view", "uimgrlayout")
+ if not layout or not layout:find("markerspanel") then
+ ide:AddPanelDocked(ide:GetOutputNotebook(), ctrl, "markerspanel", TR("Markers"), reconfigure, false)
+ else
+ ide:AddPanel(ctrl, "markerspanel", TR("Markers"), reconfigure)
+ end
+end
+
+createMarkersWindow()
+
+local package = ide:AddPackage('core.markers', {
+ -- save markers; remove tab from the list
+ onEditorClose = function(self, editor)
+ local cache = caches[editor]
+ if not cache then return end
+ if cache.fileitem then markers.markersCtrl:Delete(cache.fileitem) end
+ caches[editor] = nil
+ end,
+
+ -- schedule marker update if the change is for one of the editors with markers
+ onEditorUpdateUI = function(self, editor, event)
+ if not caches[editor] then return end
+ if bit.band(event:GetUpdated(), wxstc.wxSTC_UPDATE_CONTENT) == 0 then return end
+ needRefresh(editor)
+ end,
+
+ onEditorMarkerUpdate = function(self, editor)
+ -- if no marker, then all markers in a file need to be refreshed
+ if not caches[editor] then caches[editor] = {} end
+ needRefresh(editor)
+ markers:SaveMarkers(editor)
+ end,
+
+ onEditorSave = function(self, editor) markers:SaveMarkers(editor) end,
+ onEditorLoad = function(self, editor) markers:LoadMarkers(editor) end,
+ })
+
+function markers:SaveSettings() package:SetSettings(self.settings) end
+
+function markers:SaveMarkers(editor, force)
+ -- if the file has the name and has not been modified, save the breakpoints
+ -- this also works when the file is saved as the modified flag is already set to `false`
+ local doc = ide:GetDocument(editor)
+ local filepath = doc:GetFilePath()
+ if filepath and (force or not doc:IsModified()) then
+ -- remove it from the list if it has no breakpoints
+ local edmarkers = getMarkers(editor)
+ self.settings.markers[filepath] = #edmarkers > 0 and edmarkers or nil
+ self:SaveSettings()
+ end
+end
+
+function markers:LoadMarkers(editor)
+ local doc = ide:GetDocument(editor)
+ local filepath = doc:GetFilePath()
+ if filepath then
+ for _, edmarker in ipairs(self.settings.markers[filepath] or {}) do
+ local line, markertype = unpack(edmarker)
+ local _ = (markertype == "bookmark" and editor:BookmarkToggle(line, true)
+ or markertype == "breakpoint" and editor:BreakpointToggle(line, true))
+ end
+ end
+end
+
+MergeSettings(markers.settings, package:GetSettings())
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/markup.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/markup.lua
new file mode 100644
index 0000000..420543d
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/markup.lua
@@ -0,0 +1,214 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- styles for comment markup
+---------------------------------------------------------
+
+local MD_MARK_ITAL = '_' -- italic
+local MD_MARK_BOLD = '**' -- bold
+local MD_MARK_LINK = '[' -- link description start
+local MD_MARK_LINZ = ']' -- link description end
+local MD_MARK_LINA = '(' -- link URL start
+local MD_MARK_LINT = ')' -- link URL end
+local MD_MARK_HEAD = '#' -- header
+local MD_MARK_CODE = '`' -- code
+local MD_MARK_BOXD = '|' -- highlight
+local MD_MARK_MARK = ' ' -- separator
+local MD_LINK_NEWWINDOW = '+' -- indicator to open a new window for links
+local markup = {
+ [MD_MARK_BOXD] = {st=ide:AddIndicator("markup.boxd", 25), fg={127,0,127}, b=true},
+ [MD_MARK_CODE] = {st=ide:AddIndicator("markup.code", 26), fg={127,127,127}, fs=10},
+ [MD_MARK_HEAD] = {st=ide:AddIndicator("markup.head", 27), fn="Lucida Console", b=true},
+ [MD_MARK_LINK] = {st=ide:AddIndicator("markup.link", 28), u=true, hs={32,32,127}},
+ [MD_MARK_BOLD] = {st=ide:AddIndicator("markup.bold", 29), b=true},
+ [MD_MARK_ITAL] = {st=ide:AddIndicator("markup.ital", 30), i=true},
+ [MD_MARK_MARK] = {st=ide:AddIndicator("markup.mark", 31), v=false},
+}
+
+-- allow other editor features to recognize this special markup
+function MarkupIsSpecial(style) return style == 31 end
+function MarkupIsAny(style) return style >= 25 and style <= 31 end
+function MarkupAddStyles(styles)
+ local comment = styles.comment or {}
+ for key,value in pairs(markup) do
+ local style = styles[key] or {}
+ -- copy all style features by value
+ for feature in pairs(value) do
+ style[feature] = style[feature] or value[feature]
+ end
+ style.fg = style.fg or comment.fg
+ style.bg = style.bg or comment.bg
+ styles[key] = style
+ end
+end
+
+local q = EscapeMagic
+
+local MD_MARK_PTRN = '' -- combination of all markup marks that can start styling
+for key in pairs(markup) do
+ if key ~= MD_MARK_MARK then MD_MARK_PTRN = MD_MARK_PTRN .. q(key) end
+end
+MarkupAddStyles(ide.config.styles)
+
+function MarkupHotspotClick(pos, editor)
+ -- check if this is "our" hotspot event
+ if bit.band(editor:GetStyleAt(pos),31) ~= markup[MD_MARK_LINK].st then
+ -- not "our" style, so nothing to do for us here
+ return
+ end
+ local line = editor:LineFromPosition(pos)
+ local tx = editor:GetLineDyn(line)
+ pos = pos + #MD_MARK_LINK - editor:PositionFromLine(line) -- turn into relative position
+
+ -- extract the URL/command on the right side of the separator
+ local _,_,text = string.find(tx, q(MD_MARK_LINZ).."(%b"..MD_MARK_LINA..MD_MARK_LINT..")", pos)
+ if text then
+ text = text:gsub("^"..q(MD_MARK_LINA), ""):gsub(q(MD_MARK_LINT).."$", "")
+ local doc = ide:GetDocument(editor)
+ local filepath = doc and doc.filePath or FileTreeGetDir()
+ local _,_,http = string.find(text, [[^(https?:%S+)$]])
+ local _,_,command,code = string.find(text, [[^macro:(%w+)%((.*%S)%)$]])
+ if not command then _,_,command = string.find(text, [[^macro:(%w+)$]]) end
+
+ if command == 'shell' then
+ ShellExecuteCode(code)
+ elseif command == 'inline' then
+ ShellExecuteInline(code)
+ elseif command == 'run' then -- run the current file
+ ProjectRun()
+ elseif command == 'debug' then -- debug the current file
+ ProjectDebug()
+ elseif http then -- open the URL in a new browser window
+ wx.wxLaunchDefaultBrowser(http, 0)
+ elseif filepath then -- only check for saved files
+ -- check if requested to open in a new window
+ local newwindow = not doc or string.find(text, MD_LINK_NEWWINDOW, 1, true)
+ if newwindow then text = string.gsub(text, "^%" .. MD_LINK_NEWWINDOW, "") end
+ local filename = GetFullPathIfExists(
+ wx.wxFileName(filepath):GetPath(wx.wxPATH_GET_VOLUME), text)
+ if filename and
+ (newwindow or SaveModifiedDialog(editor, true) ~= wx.wxID_CANCEL) then
+ if not newwindow and ide.osname == 'Macintosh' then editor:GotoPos(0) end
+ LoadFile(filename,not newwindow and editor or nil,true)
+ end
+ end
+ end
+ return true
+end
+
+local function ismarkup (tx)
+ local start = 1
+ local marksep = "[%s!%?%.,;:%(%)]"
+ while true do
+ -- find a separator first
+ local st,_,sep,more = string.find(tx, "(["..MD_MARK_PTRN.."])(.)", start)
+ if not st then return end
+
+ -- check if this is a first character of a multi-character separator
+ if not markup[sep] then sep = sep .. (more or '') end
+
+ local s,e,cap
+ local qsep = q(sep)
+ local nonsep = ("[^%s]"):format(qsep)
+ local nonspace = ("[^%s]"):format(qsep.."%s")
+ if sep == MD_MARK_HEAD then
+ -- always search from the start of the line
+ -- [%w%p] set is needed to avoid continuing this markup to the next line
+ s,e,cap = string.find(tx,"^("..q(MD_MARK_HEAD)..".+[%w%p])")
+ elseif sep == MD_MARK_LINK then
+ -- allow everything based on balanced link separators
+ s,e,cap = string.find(tx,
+ "^(%b"..MD_MARK_LINK..MD_MARK_LINZ
+ .."%b"..MD_MARK_LINA..MD_MARK_LINT..")", st)
+ elseif markup[sep] then
+ -- try 2+ characters between separators first
+ -- if not found, try a single character
+ s,e,cap = string.find(tx,"^("..qsep..nonspace..nonsep.."-"..nonspace..qsep..")", st)
+ if not s then s,e,cap = string.find(tx,"^("..qsep..nonspace..qsep..")", st) end
+ end
+ if s and -- selected markup is surrounded by spaces or punctuation marks
+ (s == 1 or tx:sub(s-1, s-1):match(marksep)) and
+ (e == #tx or tx:sub(e+1, e+1):match(marksep))
+ then return s,e,cap,sep end
+ start = st+1
+ end
+end
+
+function MarkupStyle(editor, lines, linee)
+ local lines = lines or 0
+ if (lines < 0) then return end
+
+ -- if the current spec doesn't have any comments, nothing to style
+ if not next(editor.spec.iscomment) then return end
+
+ -- always style to the end as there may be comments that need re-styling
+ -- technically, this should be GetLineCount()-1, but we want to style
+ -- beyond the last line to make sure it is styled correctly
+ local linec = editor:GetLineCount()
+ local linee = linee or linec
+
+ local linecomment = editor.spec.linecomment
+ local iscomment = {}
+ for i,v in pairs(editor.spec.iscomment) do
+ iscomment[i] = v
+ end
+
+ local es = editor:GetEndStyled()
+ local needfix = false
+
+ for line=lines,linee do
+ local tx = editor:GetLineDyn(line)
+ local ls = editor:PositionFromLine(line)
+
+ local from = 1
+ local off = -1
+
+ -- doing WrapCount(line) when line == linec (which may be beyond
+ -- the last line) occasionally crashes the application on OSX.
+ local wrapped = line < linec and editor:WrapCount(line) or 0
+
+ while from do
+ tx = string.sub(tx,from)
+ local f,t,w,mark = ismarkup(tx)
+
+ if (f) then
+ local p = ls+f+off
+ local s = bit.band(editor:GetStyleAt(p), 31)
+ -- only style comments and only those that are not at the beginning
+ -- of the file to avoid styling shebang (#!) lines
+ -- also ignore matches for line comments (as defined in the spec)
+ if iscomment[s] and p > 0 and mark ~= linecomment then
+ local smark = #mark
+ local emark = #mark -- assumes end mark is the same length as start mark
+ if mark == MD_MARK_HEAD then
+ -- grab multiple MD_MARK_HEAD if present
+ local _,_,full = string.find(w,"^("..q(MD_MARK_HEAD).."+)")
+ smark,emark = #full,0
+ elseif mark == MD_MARK_LINK then
+ local lsep = w:find(q(MD_MARK_LINZ)..q(MD_MARK_LINA))
+ if lsep then emark = #w-lsep+#MD_MARK_LINT end
+ end
+ editor:StartStyling(p, 31)
+ editor:SetStyling(smark, markup[MD_MARK_MARK].st)
+ editor:SetStyling(t-f+1-smark-emark, markup[mark].st or markup[MD_MARK_MARK].st)
+ editor:SetStyling(emark, markup[MD_MARK_MARK].st)
+ end
+
+ off = off + t
+ end
+ from = t and (t+1)
+ end
+
+ -- has this line changed its wrapping because of invisible styling?
+ if wrapped > 1 and editor:WrapCount(line) < wrapped then needfix = true end
+ end
+ editor:StartStyling(es, 31)
+
+ -- if any wrapped lines have changed, then reset WrapMode to fix the drawing
+ if needfix then
+ -- this fixes an issue with duplicate lines in Scintilla when
+ -- invisible styles hide some of the content that would be wrapped.
+ local wrapmode = editor:GetWrapMode()
+ if wrapmode ~= wxstc.wxSTC_WRAP_NONE then editor:SetWrapMode(wrapmode) end
+ -- if some of the lines have folded, this can make not styled lines visible
+ MarkupStyle(editor, linee+1) -- style to the end in this case
+ end
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_edit.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_edit.lua
new file mode 100644
index 0000000..d095f6e
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_edit.lua
@@ -0,0 +1,390 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Lomtik Software (J. Winwood & John Labenski)
+-- Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+
+-- ---------------------------------------------------------------------------
+-- Create the Edit menu and attach the callback functions
+
+local frame = ide.frame
+local menuBar = frame.menuBar
+
+local editMenu = wx.wxMenu {
+ { ID_CUT, TR("Cu&t")..KSC(ID_CUT), TR("Cut selected text to clipboard") },
+ { ID_COPY, TR("&Copy")..KSC(ID_COPY), TR("Copy selected text to clipboard") },
+ { ID_PASTE, TR("&Paste")..KSC(ID_PASTE), TR("Paste text from the clipboard") },
+ { ID_SELECTALL, TR("Select &All")..KSC(ID_SELECTALL), TR("Select all text in the editor") },
+ { },
+ { ID_UNDO, TR("&Undo")..KSC(ID_UNDO), TR("Undo last edit") },
+ { ID_REDO, TR("&Redo")..KSC(ID_REDO), TR("Redo last edit undone") },
+ { },
+ { ID_SHOWTOOLTIP, TR("Show &Tooltip")..KSC(ID_SHOWTOOLTIP), TR("Show tooltip for current position; place cursor after opening bracket of function") },
+ { ID_AUTOCOMPLETE, TR("Complete &Identifier")..KSC(ID_AUTOCOMPLETE), TR("Complete the current identifier") },
+ { ID_AUTOCOMPLETEENABLE, TR("Auto Complete Identifiers")..KSC(ID_AUTOCOMPLETEENABLE), TR("Auto complete while typing"), wx.wxITEM_CHECK },
+ { },
+}
+
+editMenu:Append(ID_SOURCE, TR("Source"), wx.wxMenu {
+ { ID_COMMENT, TR("C&omment/Uncomment")..KSC(ID_COMMENT), TR("Comment or uncomment current or selected lines") },
+ { ID_REINDENT, TR("Correct &Indentation")..KSC(ID_REINDENT), TR("Re-indent selected lines") },
+ { ID_FOLD, TR("&Fold/Unfold All")..KSC(ID_FOLD), TR("Fold or unfold all code folds") },
+ { ID_SORT, TR("&Sort")..KSC(ID_SORT), TR("Sort selected lines") },
+})
+editMenu:Append(ID_BOOKMARK, TR("Bookmark"), wx.wxMenu {
+ { ID_BOOKMARKTOGGLE, TR("Toggle Bookmark")..KSC(ID_BOOKMARKTOGGLE), TR("Toggle bookmark") },
+ { ID_BOOKMARKNEXT, TR("Go To Next Bookmark")..KSC(ID_BOOKMARKNEXT) },
+ { ID_BOOKMARKPREV, TR("Go To Previous Bookmark")..KSC(ID_BOOKMARKPREV) },
+})
+editMenu:AppendSeparator()
+editMenu:Append(ID_PREFERENCES, TR("Preferences"), wx.wxMenu {
+ { ID_PREFERENCESSYSTEM, TR("Settings: System")..KSC(ID_PREFERENCESSYSTEM) },
+ { ID_PREFERENCESUSER, TR("Settings: User")..KSC(ID_PREFERENCESUSER) },
+})
+menuBar:Append(editMenu, TR("&Edit"))
+
+editMenu:Check(ID_AUTOCOMPLETEENABLE, ide.config.autocomplete)
+
+local function getCtrlWithFocus(edType)
+ local ctrl = ide:GetMainFrame():FindFocus()
+ return ctrl and ctrl:GetClassInfo():GetClassName() == edType and ctrl:DynamicCast(edType) or nil
+end
+
+local function onUpdateUIEditorInFocus(event)
+ event:Enable(GetEditorWithFocus(GetEditor()) ~= nil)
+end
+
+local function onUpdateUIEditMenu(event)
+ local menu_id = event:GetId()
+ local editor = GetEditorWithFocus()
+ if editor == nil then
+ local editor = getCtrlWithFocus("wxTextCtrl")
+ event:Enable(editor and (
+ menu_id == ID_PASTE and editor:CanPaste() or
+ menu_id == ID_UNDO and editor:CanUndo() or
+ menu_id == ID_REDO and editor:CanRedo() or
+ menu_id == ID_CUT and editor:CanCut() or
+ menu_id == ID_COPY and editor:CanCopy() or
+ menu_id == ID_SELECTALL and true
+ ) or false)
+ return
+ end
+
+ local alwaysOn = {
+ [ID_SELECTALL] = true,
+ -- allow Cut and Copy commands as these work on a line if no selection
+ [ID_COPY] = true, [ID_CUT] = true,
+ }
+ local enable =
+ -- pasting is allowed when the document is not read-only and the selection
+ -- (if any) has no protected text; since pasting handles protected text,
+ -- use GetReadOnly() instead of CanPaste()
+ menu_id == ID_PASTE and (not editor:GetReadOnly()) or
+ menu_id == ID_UNDO and editor:CanUndo() or
+ menu_id == ID_REDO and editor:CanRedo() or
+ alwaysOn[menu_id]
+ event:Enable(enable)
+end
+
+local function onEditMenu(event)
+ local menu_id = event:GetId()
+ local editor = GetEditorWithFocus()
+ if editor == nil then
+ local editor = getCtrlWithFocus("wxTextCtrl")
+ if not editor or not (
+ menu_id == ID_PASTE and editor:Paste() or
+ menu_id == ID_UNDO and editor:Undo() or
+ menu_id == ID_REDO and editor:Redo() or
+ menu_id == ID_CUT and editor:Cut() or
+ menu_id == ID_COPY and editor:Copy() or
+ menu_id == ID_SELECTALL and editor:SetSelection(-1, -1) or
+ true
+ ) then event:Skip() end
+ return
+ end
+
+ if PackageEventHandle("onEditorAction", editor, event) == false then
+ return
+ end
+
+ local copytext
+ if (menu_id == ID_CUT or menu_id == ID_COPY)
+ and ide.wxver >= "2.9.5" and editor:GetSelections() > 1 then
+ local main = editor:GetMainSelection()
+ copytext = editor:GetTextRangeDyn(editor:GetSelectionNStart(main), editor:GetSelectionNEnd(main))
+ for s = 0, editor:GetSelections()-1 do
+ if copytext ~= editor:GetTextRangeDyn(editor:GetSelectionNStart(s), editor:GetSelectionNEnd(s)) then
+ copytext = nil
+ break
+ end
+ end
+ end
+
+ local spos, epos = editor:GetSelectionStart(), editor:GetSelectionEnd()
+ if menu_id == ID_CUT then
+ if spos == epos then editor:LineCopy() else editor:CopyDyn() end
+ if spos == epos then
+ local line = editor:LineFromPosition(spos)
+ spos, epos = editor:PositionFromLine(line), editor:PositionFromLine(line+1)
+ editor:SetSelectionStart(spos)
+ editor:SetSelectionEnd(epos)
+ end
+ if spos ~= epos then editor:ClearAny() end
+ elseif menu_id == ID_COPY then
+ if spos == epos then editor:LineCopy() else editor:CopyDyn() end
+ elseif menu_id == ID_PASTE then
+ -- first clear the text in case there is any hidden markup
+ if spos ~= epos then editor:ClearAny() end
+ editor:PasteDyn()
+ elseif menu_id == ID_SELECTALL then editor:SelectAll()
+ elseif menu_id == ID_UNDO then editor:Undo()
+ elseif menu_id == ID_REDO then editor:Redo()
+ end
+
+ if copytext then editor:CopyText(#copytext, copytext) end
+end
+
+for _, event in pairs({ID_CUT, ID_COPY, ID_PASTE, ID_SELECTALL, ID_UNDO, ID_REDO}) do
+ frame:Connect(event, wx.wxEVT_COMMAND_MENU_SELECTED, onEditMenu)
+ frame:Connect(event, wx.wxEVT_UPDATE_UI, onUpdateUIEditMenu)
+end
+
+for _, event in pairs({
+ ID_BOOKMARKTOGGLE, ID_BOOKMARKNEXT, ID_BOOKMARKPREV,
+ ID_AUTOCOMPLETE, ID_SORT, ID_REINDENT, ID_SHOWTOOLTIP,
+}) do
+ frame:Connect(event, wx.wxEVT_UPDATE_UI, onUpdateUIEditorInFocus)
+end
+
+frame:Connect(ID_COMMENT, wx.wxEVT_UPDATE_UI,
+ function(event)
+ local editor = GetEditorWithFocus(GetEditor())
+ event:Enable(editor ~= nil
+ and ide:IsValidProperty(editor, "spec") and editor.spec
+ and editor.spec.linecomment and true or false)
+ end)
+
+local function generateConfigMessage(type)
+ return ([==[--[[--
+ Use this file to specify **%s** preferences.
+ Review [examples](+%s) or check [online documentation](%s) for details.
+--]]--
+]==])
+ :format(type, MergeFullPath(ide.editorFilename, "../cfg/user-sample.lua"),
+ "http://studio.zerobrane.com/documentation.html")
+end
+
+frame:Connect(ID_PREFERENCESSYSTEM, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function ()
+ local editor = LoadFile(ide.configs.system)
+ if editor and editor:GetLength() == 0 then
+ editor:AddTextDyn(generateConfigMessage("System")) end
+ end)
+
+frame:Connect(ID_PREFERENCESUSER, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function ()
+ local editor = LoadFile(ide.configs.user)
+ if editor and editor:GetLength() == 0 then
+ editor:AddTextDyn(generateConfigMessage("User")) end
+ end)
+frame:Connect(ID_PREFERENCESUSER, wx.wxEVT_UPDATE_UI,
+ function (event) event:Enable(ide.configs.user ~= nil) end)
+
+frame:Connect(ID_CLEARDYNAMICWORDS, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function () DynamicWordsReset() end)
+
+frame:Connect(ID_SHOWTOOLTIP, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ local editor = GetEditor()
+
+ if (editor:CallTipActive()) then
+ editor:CallTipCancel()
+ return
+ end
+
+ EditorCallTip(editor, editor:GetCurrentPos())
+ end)
+
+frame:Connect(ID_AUTOCOMPLETE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event) EditorAutoComplete(GetEditor()) end)
+
+frame:Connect(ID_AUTOCOMPLETEENABLE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event) ide.config.autocomplete = event:IsChecked() end)
+
+frame:Connect(ID_COMMENT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ local editor = GetEditor()
+ local lc = editor.spec.linecomment
+ if not lc then return end
+
+ -- for multi-line selection, always start the first line at the beginning
+ local ssel, esel = editor:GetSelectionStart(), editor:GetSelectionEnd()
+ local sline = editor:LineFromPosition(ssel)
+ local eline = editor:LineFromPosition(esel)
+ local sel = ssel ~= esel
+ local rect = editor:SelectionIsRectangle()
+ local qlc = lc:gsub(".", "%%%1")
+
+ -- figure out how to toggle comments; if there is at least one non-empty
+ -- line that doesn't start with a comment, need to comment
+ local comment = false
+ for line = sline, eline do
+ local pos = sel and (sline == eline or rect)
+ and ssel-editor:PositionFromLine(sline)+1 or 1
+ local text = editor:GetLineDyn(line)
+ local _, cpos = text:find("^%s*"..qlc, pos)
+ if not cpos and text:find("%S")
+ -- ignore last line when the end of selection is at the first position
+ and (line == sline or line < eline or esel-editor:PositionFromLine(line) > 0) then
+ comment = true
+ break
+ end
+ end
+
+ editor:BeginUndoAction()
+ -- go last to first as selection positions we captured may be affected
+ -- by text changes
+ for line = eline, sline, -1 do
+ local pos = sel and (sline == eline or rect) and ssel-editor:PositionFromLine(sline)+1 or 1
+ local text = editor:GetLineDyn(line)
+ local validline = (line == sline or line < eline or esel-editor:PositionFromLine(line) > 0)
+ local _, cpos = text:find("^%s*"..qlc, pos)
+ if not comment and cpos and validline then
+ editor:DeleteRange(cpos-#lc+editor:PositionFromLine(line), #lc)
+ elseif comment and text:find("%S") and validline then
+ editor:SetTargetStart(pos+editor:PositionFromLine(line)-1)
+ editor:SetTargetEnd(editor:GetTargetStart())
+ editor:ReplaceTarget(lc)
+ end
+ end
+ editor:EndUndoAction()
+ end)
+
+local function processSelection(editor, func)
+ local text = editor:GetSelectedText()
+ local line = editor:GetCurrentLine()
+ local posinline = editor:GetCurrentPos() - editor:PositionFromLine(line)
+ if #text == 0 then
+ editor:SelectAll()
+ text = editor:GetSelectedText()
+ end
+ local wholeline = text:find("\n$")
+ local buf = {}
+ for line in string.gmatch(text..(wholeline and "" or "\n"), "(.-\r?\n)") do
+ table.insert(buf, line)
+ end
+ if #buf > 0 then
+ if func then func(buf) end
+ -- add new line at the end if it was there
+ local newtext = table.concat(buf, ""):gsub("(\r?\n)$", wholeline and "%1" or "")
+ -- straightforward editor:ReplaceSelection() doesn't work reliably as
+ -- it sometimes doubles the context when the entire file is selected.
+ -- this seems like Scintilla issue, so use ReplaceTarget instead.
+ -- Since this doesn't work with rectangular selection, which
+ -- ReplaceSelection should handle (after wxwidgets 3.x upgrade), this
+ -- will need to be revisited when ReplaceSelection is updated.
+ if newtext ~= text then
+ editor:BeginUndoAction()
+ -- if there is at least one marker, then use a different mechanism to preserve them
+ -- simply saving markers, replacing text, and reapplying markers doesn't work as
+ -- they get reset after `undo/redo` operations.
+ local ssel, esel = editor:GetSelectionStart(), editor:GetSelectionEnd()
+ local sline = editor:LineFromPosition(ssel)
+ local eline = editor:LineFromPosition(esel)
+ if #editor:MarkerGetAll(nil, sline, eline) > 0 then
+ for line = #buf, 1, -1 do
+ editor:SetTargetStart(line == 1 and ssel or editor:PositionFromLine(sline+line-1))
+ editor:SetTargetEnd(line == eline-sline+1 and esel or editor:GetLineEndPosition(sline+line-1))
+ editor:ReplaceTarget((buf[line]:gsub("\r?\n$", "")))
+ end
+ else
+ editor:TargetFromSelection()
+ editor:ReplaceTarget(newtext)
+ end
+ editor:EndUndoAction()
+ end
+ end
+ editor:GotoPosEnforcePolicy(math.min(
+ editor:PositionFromLine(line)+posinline, editor:GetLineEndPosition(line)))
+end
+
+frame:Connect(ID_SORT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event) processSelection(GetEditor(), table.sort) end)
+
+local function reIndent(editor, buf)
+ local decindent, incindent = editor.spec.isdecindent, editor.spec.isincindent
+ if not (decindent and incindent) then return end
+
+ local edline = editor:LineFromPosition(editor:GetSelectionStart())
+ local indent = 0
+ local text = ""
+ -- find the last non-empty line in the previous block (if any)
+ for n = edline-1, 1, -1 do
+ indent = editor:GetLineIndentation(n)
+ text = editor:GetLineDyn(n)
+ if text:match("[^\r\n]") then break end
+ end
+
+ local ut = editor:GetUseTabs()
+ local tw = ut and editor:GetTabWidth() or editor:GetIndent()
+
+ local indents = {}
+ local isstatic = {}
+ for line = 1, #buf+1 do
+ local ls = editor:PositionFromLine(edline+line-1)
+ local style = bit.band(editor:GetStyleAt(ls), 31)
+ -- don't reformat multi-line comments or strings
+ isstatic[line] = (editor.spec.iscomment[style]
+ or editor.spec.isstring[style]
+ or (MarkupIsAny and MarkupIsAny(style)))
+ if not isstatic[line] or line == 1 or not isstatic[line-1] then
+ local closed, blockend = decindent(text)
+ local opened = incindent(text)
+
+ -- ignore impact from initial block endings as they are already indented
+ if line == 1 then blockend = 0 end
+
+ -- this only needs to be done for 2, #buf+1; do it and get out when done
+ if line > 1 then indents[line-1] = indents[line-1] - tw * closed end
+ if line > #buf then break end
+
+ indent = indent + tw * (opened - blockend)
+ if indent < 0 then indent = 0 end
+ end
+
+ indents[line] = indent
+ text = buf[line]
+ end
+
+ for line = 1, #buf do
+ if not isstatic[line] then
+ buf[line] = buf[line]:gsub("^[ \t]*",
+ not buf[line]:match("%S") and ""
+ or ut and ("\t"):rep(indents[line] / tw) or (" "):rep(indents[line]))
+ end
+ end
+end
+
+frame:Connect(ID_REINDENT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ local editor = GetEditor()
+ processSelection(editor, function(buf) reIndent(editor, buf) end)
+ end)
+
+frame:Connect(ID_FOLD, wx.wxEVT_UPDATE_UI,
+ function(event)
+ local editor = GetEditorWithFocus()
+ event:Enable(editor and editor:CanFold() or false)
+ end)
+frame:Connect(ID_FOLD, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event) GetEditorWithFocus():FoldSome() end)
+
+local BOOKMARK_MARKER = StylesGetMarker("bookmark")
+
+frame:Connect(ID_BOOKMARKTOGGLE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() GetEditor():BookmarkToggle() end)
+frame:Connect(ID_BOOKMARKNEXT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() GetEditor():MarkerGotoNext(BOOKMARK_MARKER) end)
+frame:Connect(ID_BOOKMARKPREV, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() GetEditor():MarkerGotoPrev(BOOKMARK_MARKER) end)
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_file.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_file.lua
new file mode 100644
index 0000000..d9e7c68
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_file.lua
@@ -0,0 +1,262 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Lomtik Software (J. Winwood & John Labenski)
+-- Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+local frame = ide.frame
+local menuBar = frame.menuBar
+local openDocuments = ide.openDocuments
+
+local fileMenu = wx.wxMenu({
+ { ID_NEW, TR("&New")..KSC(ID_NEW), TR("Create an empty document") },
+ { ID_OPEN, TR("&Open...")..KSC(ID_OPEN), TR("Open an existing document") },
+ { ID_CLOSE, TR("&Close Page")..KSC(ID_CLOSE), TR("Close the current editor window") },
+ { },
+ { ID_SAVE, TR("&Save")..KSC(ID_SAVE), TR("Save the current document") },
+ { ID_SAVEAS, TR("Save &As...")..KSC(ID_SAVEAS), TR("Save the current document to a file with a new name") },
+ { ID_SAVEALL, TR("Save A&ll")..KSC(ID_SAVEALL), TR("Save all open documents") },
+ { },
+ { ID_RECENTFILES, TR("Recent Files")..KSC(ID_RECENTFILES), TR("File history") },
+ { ID_RECENTPROJECTS, TR("Recent Projects")..KSC(ID_RECENTPROJECTS), TR("Project history") },
+ { },
+ { ID_EXIT, TR("E&xit")..KSC(ID_EXIT), TR("Exit program") }})
+menuBar:Append(fileMenu, TR("&File"))
+
+local filehistorymenu = wx.wxMenu({
+ { },
+ { ID_RECENTFILESCLEAR, TR("Clear Items")..KSC(ID_RECENTFILESCLEAR), TR("Clear items from this list") },
+})
+local projecthistorymenu = wx.wxMenu({
+ { },
+ { ID_RECENTPROJECTSCLEAR, TR("Clear Items")..KSC(ID_RECENTPROJECTSCLEAR), TR("Clear items from this list") },
+})
+ide:AttachMenu(ID_RECENTFILES, filehistorymenu)
+ide:AttachMenu(ID_RECENTPROJECTS, projecthistorymenu)
+
+do -- recent file history
+ local iscaseinsensitive = wx.wxFileName("A"):SameAs(wx.wxFileName("a"))
+ local function isSameAs(f1, f2)
+ return f1 == f2 or iscaseinsensitive and f1:lower() == f2:lower()
+ end
+
+ local filehistory = {[0] = 1}
+
+ -- add file to the file history removing duplicates
+ local function addFileHistory(filename)
+ -- a new (empty) tab is opened; don't change the history
+ if not filename then return end
+
+ local fn = wx.wxFileName(filename)
+ if fn:Normalize() then filename = fn:GetFullPath() end
+
+ local index = filehistory[0]
+
+ -- special case: selecting the current file (or moving through the history)
+ if filehistory[index] and isSameAs(filename, filehistory[index].filename) then return end
+
+ -- something else is selected
+ -- (1) flip the history from 1 to the current index
+ for i = 1, math.floor(index/2) do
+ filehistory[i], filehistory[index-i+1] = filehistory[index-i+1], filehistory[i]
+ end
+
+ -- (2) if the file is in the history, remove it
+ for i = #filehistory, 1, -1 do
+ if isSameAs(filename, filehistory[i].filename) then
+ table.remove(filehistory, i)
+ end
+ end
+
+ -- (3) add the file to the top and update the index
+ table.insert(filehistory, 1, {filename=filename})
+ filehistory[0] = 1
+
+ -- (4) remove all entries that are no longer needed
+ while #filehistory>ide.config.filehistorylength do table.remove(filehistory) end
+ end
+
+ local function remFileHistory(filename)
+ if not filename then return end
+
+ local fn = wx.wxFileName(filename)
+ if fn:Normalize() then filename = fn:GetFullPath() end
+
+ local index = filehistory[0]
+
+ -- special case: removing the current file
+ if filehistory[index] and isSameAs(filename, filehistory[index].filename) then
+ -- (1) flip the history from 1 to the current index
+ for i = 1, math.floor(index/2) do
+ filehistory[i], filehistory[index-i+1] = filehistory[index-i+1], filehistory[i]
+ end
+ end
+
+ -- (2) if the file is in the history, remove it
+ for i = #filehistory, 1, -1 do
+ if isSameAs(filename, filehistory[i].filename) then
+ table.remove(filehistory, i)
+ end
+ end
+
+ -- (3) update index
+ filehistory[0] = 1
+ end
+
+ local updateRecentFiles -- need forward declaration because of recursive refs
+
+ local function loadRecent(event)
+ local id = event:GetId()
+ local item = filehistorymenu:FindItem(id)
+ local filename = item:GetLabel()
+ local index = filehistory[0]
+ filehistory[0] = (
+ (index > 1 and id == ID("file.recentfiles."..(index-1)) and index-1) or
+ (index < #filehistory) and id == ID("file.recentfiles."..(index+1)) and index+1 or
+ 1)
+ if not LoadFile(filename, nil, true) then
+ wx.wxMessageBox(
+ TR("File '%s' no longer exists."):format(filename),
+ GetIDEString("editormessage"),
+ wx.wxOK + wx.wxCENTRE, ide.frame)
+ remFileHistory(filename)
+ updateRecentFiles(filehistory)
+ end
+ end
+
+ local items = 0
+ updateRecentFiles = function (list)
+ -- protect against recent files menu not being present
+ if not ide:FindMenuItem(ID_RECENTFILES) then return end
+
+ for i=1, #list do
+ local file = list[i].filename
+ local id = ID("file.recentfiles."..i)
+ local label = file..(
+ i == list[0]-1 and KSC(ID_RECENTFILESNEXT) or
+ i == list[0]+1 and KSC(ID_RECENTFILESPREV) or
+ "")
+ if i <= items then -- this is an existing item; update the label
+ filehistorymenu:FindItem(id):SetItemLabel(label)
+ else -- need to add an item
+ local item = wx.wxMenuItem(filehistorymenu, id, label, "")
+ filehistorymenu:Insert(i-1, item)
+ frame:Connect(id, wx.wxEVT_COMMAND_MENU_SELECTED, loadRecent)
+ end
+ end
+ for i=items, #list+1, -1 do -- delete the rest if the list got shorter
+ filehistorymenu:Delete(filehistorymenu:FindItemByPosition(i-1))
+ end
+ items = #list -- update the number of items for the next refresh
+
+ -- enable if there are any recent files
+ fileMenu:Enable(ID_RECENTFILES, #list > 0)
+ end
+
+ -- public methods
+ function GetFileHistory() return filehistory end
+ function SetFileHistory(fh)
+ filehistory = fh
+ filehistory[0] = 1
+ updateRecentFiles(filehistory)
+ end
+ function AddToFileHistory(filename)
+ addFileHistory(filename)
+ updateRecentFiles(filehistory)
+ end
+
+ function FileRecentListUpdate(menu)
+ local list = filehistory
+ for i=#list, 1, -1 do
+ local id = ID("file.recentfiles."..i)
+ local label = list[i].filename
+ local item = wx.wxMenuItem(menu, id, label, "")
+ menu:Insert(0, item)
+ ide.frame:Connect(id, wx.wxEVT_COMMAND_MENU_SELECTED, loadRecent)
+ end
+ end
+end
+
+frame:Connect(ID_NEW, wx.wxEVT_COMMAND_MENU_SELECTED, function() return NewFile() end)
+frame:Connect(ID_OPEN, wx.wxEVT_COMMAND_MENU_SELECTED, OpenFile)
+frame:Connect(ID_SAVE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function ()
+ local editor = ide.findReplace:CanSave(GetEditorWithFocus()) or GetEditor()
+ local doc = ide:GetDocument(editor)
+ SaveFile(editor, doc and doc:GetFilePath() or nil)
+ end)
+frame:Connect(ID_SAVE, wx.wxEVT_UPDATE_UI,
+ function (event)
+ local doc = ide:GetDocument(GetEditor())
+ event:Enable(ide.findReplace:CanSave(GetEditorWithFocus()) and true
+ or doc and (doc:IsModified() or doc:IsNew()) or false)
+ end)
+
+frame:Connect(ID_SAVEAS, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function ()
+ SaveFileAs(GetEditor())
+ end)
+frame:Connect(ID_SAVEAS, wx.wxEVT_UPDATE_UI,
+ function (event)
+ event:Enable(GetEditor() ~= nil)
+ end)
+
+frame:Connect(ID_SAVEALL, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ SaveAll()
+ end)
+frame:Connect(ID_SAVEALL, wx.wxEVT_UPDATE_UI,
+ function (event)
+ local atLeastOneModifiedDocument = false
+ for _, document in pairs(openDocuments) do
+ if document.isModified or not document.filePath then
+ atLeastOneModifiedDocument = true
+ break
+ end
+ end
+ event:Enable(atLeastOneModifiedDocument)
+ end)
+
+frame:Connect(ID_CLOSE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ local editor = GetEditorWithFocus()
+ local nb = ide:GetOutputNotebook()
+ local index = editor and nb:GetPageIndex(editor)
+ if index and ide.findReplace:IsPreview(editor) and index >= 0 then
+ nb:DeletePage(index) -- close preview tab
+ else
+ ClosePage() -- this will find the current editor tab
+ end
+ end)
+frame:Connect(ID_CLOSE, wx.wxEVT_UPDATE_UI,
+ function (event)
+ event:Enable(ide.findReplace:IsPreview(GetEditorWithFocus()) or GetEditor() ~= nil)
+ end)
+
+frame:Connect(ID_EXIT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ frame:Close() -- this will trigger wxEVT_CLOSE_WINDOW
+ end)
+
+frame:Connect(ID_RECENTPROJECTSCLEAR, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event) FileTreeProjectListClear() end)
+
+frame:Connect(ID_RECENTFILESCLEAR, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ SetFileHistory({})
+ local ed = ide:GetEditor()
+ if ed then AddToFileHistory(ide:GetDocument(ed):GetFilePath()) end
+ end)
+
+local recentprojects = 0
+frame:Connect(ID_RECENTPROJECTS, wx.wxEVT_UPDATE_UI,
+ function (event)
+ recentprojects = FileTreeProjectListUpdate(projecthistorymenu, recentprojects)
+ if not recentprojects then return end
+ local pos = 1 -- add shortcut for the previous project (if any)
+ if recentprojects > pos then
+ local item = projecthistorymenu:FindItemByPosition(pos)
+ item:SetItemLabel(item:GetItemLabelText()..KSC(ID_RECENTPROJECTSPREV))
+ end
+ event:Enable(recentprojects > 0)
+ end)
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_help.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_help.lua
new file mode 100644
index 0000000..e2f3f2f
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_help.lua
@@ -0,0 +1,118 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+---------------------------------------------------------
+
+local ide = ide
+-- ---------------------------------------------------------------------------
+-- Create the Help menu and attach the callback functions
+
+local frame = ide.frame
+local menuBar = frame.menuBar
+local mobdebug = require "mobdebug"
+
+local product = GetIDEString("help", "zerobranestudio")
+local url = "http://zerobrane.com/r/"..product.."-"
+local urls = {
+ [ID_HELPPROJECT] = "main",
+ [ID_HELPDOCUMENTATION] = "documentation",
+ [ID_HELPGETTINGSTARTED] = "gettingstarted",
+ [ID_HELPTUTORIALS] = "tutorials",
+ [ID_HELPFAQ] = "faq",
+ [ID_HELPCOMMUNITY] = "community",
+}
+
+local helpMenu = wx.wxMenu{
+ { ID_ABOUT, TR("&About")..KSC(ID_ABOUT), TR("About %s"):format(GetIDEString("editor")) },
+ { ID_HELPPROJECT, TR("&Project Page")..KSC(ID_HELPPROJECT) },
+ { ID_HELPDOCUMENTATION, TR("&Documentation")..KSC(ID_HELPDOCUMENTATION) },
+ { ID_HELPGETTINGSTARTED, TR("&Getting Started Guide")..KSC(ID_HELPGETTINGSTARTED) },
+ { ID_HELPTUTORIALS, TR("&Tutorials")..KSC(ID_HELPTUTORIALS) },
+ { ID_HELPFAQ, TR("&Frequently Asked Questions")..KSC(ID_HELPFAQ) },
+ { ID_HELPCOMMUNITY, TR("&Community")..KSC(ID_HELPCOMMUNITY) },
+}
+-- do not translate Help menu on Mac as it won't merge with "standard" menus
+menuBar:Append(helpMenu, ide.osname == 'Macintosh' and "&Help" or TR("&Help"))
+
+local function displayAbout(event)
+ local logo = ide:GetAppName().."/"..GetIDEString("logo")
+ local logoimg = wx.wxFileName(logo):FileExists() and
+ ([[<tr><td><img src="%s"></td></tr>]]):format(logo) or ""
+ local page = ([[
+ <html>
+ <body text="#777777">
+ <table border="0" width="100%%">
+ %s
+ <tr><td>
+ <table cellspacing="3" cellpadding="3" width="100%%">
+ <tr>
+ <td>
+ <b>ZeroBrane Studio (%s; MobDebug %s)</b><br>
+ <b>Copyright &copy; 2011-2015 ZeroBrane LLC</b><br>
+ Paul Kulchenko<br>
+ Licensed under the MIT License.
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <b>Based on Estrela Editor</b><br>
+ <b>Copyright &copy; 2008-2011 Luxinia DevTeam</b><br>
+ Christoph Kubisch, Eike Decker<br>
+ Licensed under the MIT License.
+ </td>
+ <td><img align="right" src="%s/res/estrela.png"></td>
+ </tr>
+ <tr>
+ <td>
+ <b>Based on wxLua editor</b><br>
+ <b>Copyright &copy; 2002-2005 Lomtick Software</b><br>
+ J. Winwood, John Labenski<br>
+ Licensed under wxWindows Library License, v3.
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <b>Built with %s, %s</b>
+ </td>
+ </tr>
+ </table>
+ </td></tr></table>
+ </body>
+ </html>]])
+ :format(logoimg, ide.VERSION, mobdebug._VERSION, ide:GetAppName(),
+ wx.wxVERSION_STRING, wxlua.wxLUA_VERSION_STRING)
+
+ local dlg = wx.wxDialog(frame, wx.wxID_ANY, TR("About %s"):format(GetIDEString("editor")))
+
+ -- this is needed because wxLuaHtmlWindow only seems to take into account
+ -- the initial size, but not the one set with SetSize using
+ -- wxlua 2.8.12.2 and wxwidgets 2.9.5+.
+ local tmp = wx.wxLuaHtmlWindow(dlg, wx.wxID_ANY, wx.wxDefaultPosition, wx.wxSize(450, 260))
+ tmp:SetPage(page)
+ local w = tmp:GetInternalRepresentation():GetWidth()
+ local h = tmp:GetInternalRepresentation():GetHeight()
+ tmp:Destroy()
+
+ local html = wx.wxLuaHtmlWindow(dlg, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxSize(w, h), wx.wxHW_SCROLLBAR_NEVER)
+
+ html:SetBorders(0)
+ html:SetPage(page)
+
+ local line = wx.wxStaticLine(dlg, wx.wxID_ANY)
+ local button = wx.wxButton(dlg, wx.wxID_OK, "OK")
+ button:SetDefault()
+
+ local topsizer = wx.wxBoxSizer(wx.wxVERTICAL)
+ topsizer:Add(html, 1, wx.wxEXPAND + wx.wxALL, 10)
+ topsizer:Add(line, 0, wx.wxEXPAND + wx.wxLEFT + wx.wxRIGHT, 10)
+ topsizer:Add(button, 0, wx.wxALL + wx.wxALIGN_RIGHT, 10)
+
+ dlg:SetSizerAndFit(topsizer)
+ dlg:ShowModal()
+ dlg:Destroy()
+end
+
+frame:Connect(ID_ABOUT, wx.wxEVT_COMMAND_MENU_SELECTED, displayAbout)
+for item, page in pairs(urls) do
+ frame:Connect(item, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() wx.wxLaunchDefaultBrowser(url..page, 0) end)
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_project.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_project.lua
new file mode 100644
index 0000000..22bf8f5
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_project.lua
@@ -0,0 +1,474 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Lomtik Software (J. Winwood & John Labenski)
+-- Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+local frame = ide.frame
+local menuBar = frame.menuBar
+local openDocuments = ide.openDocuments
+local debugger = ide.debugger
+local bottomnotebook = frame.bottomnotebook
+local uimgr = frame.uimgr
+
+------------------------
+-- Interpreters and Menu
+
+local debugTab = {
+ { ID_RUN, TR("&Run")..KSC(ID_RUN), TR("Execute the current project/file") },
+ { ID_RUNNOW, TR("Run As Scratchpad")..KSC(ID_RUNNOW), TR("Execute the current project/file and keep updating the code to see immediate results"), wx.wxITEM_CHECK },
+ { ID_COMPILE, TR("&Compile")..KSC(ID_COMPILE), TR("Compile the current file") },
+ { ID_STARTDEBUG, TR("Start &Debugging")..KSC(ID_STARTDEBUG), TR("Start or continue debugging") },
+ { ID_ATTACHDEBUG, TR("&Start Debugger Server")..KSC(ID_ATTACHDEBUG), TR("Allow external process to start debugging"), wx.wxITEM_CHECK },
+ { },
+ { ID_STOPDEBUG, TR("S&top Debugging")..KSC(ID_STOPDEBUG), TR("Stop the currently running process") },
+ { ID_DETACHDEBUG, TR("Detach &Process")..KSC(ID_DETACHDEBUG), TR("Stop debugging and continue running the process") },
+ { ID_STEP, TR("Step &Into")..KSC(ID_STEP), TR("Step into") },
+ { ID_STEPOVER, TR("Step &Over")..KSC(ID_STEPOVER), TR("Step over") },
+ { ID_STEPOUT, TR("Step O&ut")..KSC(ID_STEPOUT), TR("Step out of the current function") },
+ { ID_RUNTO, TR("Run To Cursor")..KSC(ID_RUNTO), TR("Run to cursor") },
+ { ID_TRACE, TR("Tr&ace")..KSC(ID_TRACE), TR("Trace execution showing each executed line") },
+ { ID_BREAK, TR("&Break")..KSC(ID_BREAK), TR("Break execution at the next executed line of code") },
+ { },
+ { ID_BREAKPOINT, TR("Breakpoint")..KSC(ID_BREAKPOINT) },
+ { },
+ { ID_CLEAROUTPUT, TR("C&lear Output Window")..KSC(ID_CLEAROUTPUT), TR("Clear the output window before compiling or debugging"), wx.wxITEM_CHECK },
+ { ID_COMMANDLINEPARAMETERS, TR("Command Line Parameters...")..KSC(ID_COMMANDLINEPARAMETERS), TR("Provide command line parameters") },
+}
+
+local targetDirMenu = wx.wxMenu{
+ {ID_PROJECTDIRCHOOSE, TR("Choose...")..KSC(ID_PROJECTDIRCHOOSE), TR("Choose a project directory")},
+ {ID_PROJECTDIRFROMFILE, TR("Set From Current File")..KSC(ID_PROJECTDIRFROMFILE), TR("Set project directory from current file")},
+}
+local targetMenu = wx.wxMenu({})
+local debugMenu = wx.wxMenu(debugTab)
+local debugMenuRun = {
+ start=TR("Start &Debugging")..KSC(ID_STARTDEBUG), continue=TR("Co&ntinue")..KSC(ID_STARTDEBUG)}
+local debugMenuStop = {
+ debugging=TR("S&top Debugging")..KSC(ID_STOPDEBUG), process=TR("S&top Process")..KSC(ID_STOPDEBUG)}
+debugMenu:Append(ID_PROJECTDIR, TR("Project Directory"), targetDirMenu, TR("Set the project directory to be used"))
+debugMenu:Append(ID_INTERPRETER, TR("Lua &Interpreter"), targetMenu, TR("Set the interpreter to be used"))
+menuBar:Append(debugMenu, TR("&Project"))
+
+ide:AttachMenu(ID_BREAKPOINT, wx.wxMenu {
+ { ID_BREAKPOINTTOGGLE, TR("Toggle Breakpoint")..KSC(ID_BREAKPOINTTOGGLE) },
+ { ID_BREAKPOINTNEXT, TR("Go To Next Breakpoint")..KSC(ID_BREAKPOINTNEXT) },
+ { ID_BREAKPOINTPREV, TR("Go To Previous Breakpoint")..KSC(ID_BREAKPOINTPREV) },
+})
+
+local interpreters
+local function selectInterpreter(id)
+ for id in pairs(interpreters) do
+ menuBar:Check(id, false)
+ menuBar:Enable(id, true)
+ end
+ menuBar:Check(id, true)
+ menuBar:Enable(id, false)
+
+ local changed = ide.interpreter ~= interpreters[id]
+ if ide.interpreter and changed then
+ PackageEventHandle("onInterpreterClose", ide.interpreter)
+ end
+ if interpreters[id] and changed then
+ PackageEventHandle("onInterpreterLoad", interpreters[id])
+ end
+
+ ide.interpreter = interpreters[id]
+
+ DebuggerShutdown()
+
+ ide:SetStatus(ide.interpreter.name or "", 4)
+ if changed then ReloadLuaAPI() end
+end
+
+function ProjectSetInterpreter(name)
+ local id = IDget("debug.interpreter."..name)
+ if id and interpreters[id] then
+ selectInterpreter(id)
+ else
+ DisplayOutputLn(("Can't find interpreter '%s'; using the default interpreter instead.")
+ :format(name))
+ local id = (
+ -- interpreter is set and is (still) on the list of known interpreters
+ IDget("debug.interpreter."..(ide.config.interpreter or ide.config.default.interpreter)) or
+ -- otherwise use default interpreter
+ ID("debug.interpreter."..ide.config.default.interpreter)
+ )
+ selectInterpreter(id)
+ end
+end
+
+local function evSelectInterpreter(event)
+ selectInterpreter(event:GetId())
+end
+
+function ProjectUpdateInterpreters()
+ assert(ide.interpreters, "no interpreters defined")
+
+ -- delete all existing items (if any)
+ local items = targetMenu:GetMenuItemCount()
+ for i = items, 1, -1 do
+ targetMenu:Delete(targetMenu:FindItemByPosition(i-1))
+ end
+
+ local names = {}
+ for file in pairs(ide.interpreters) do table.insert(names, file) end
+ table.sort(names)
+
+ interpreters = {}
+ for _, file in ipairs(names) do
+ local inter = ide.interpreters[file]
+ local id = ID("debug.interpreter."..file)
+ inter.fname = file
+ interpreters[id] = inter
+ targetMenu:Append(
+ wx.wxMenuItem(targetMenu, id, inter.name, inter.description, wx.wxITEM_CHECK))
+ frame:Connect(id, wx.wxEVT_COMMAND_MENU_SELECTED, evSelectInterpreter)
+ end
+
+ local id = (
+ -- interpreter is set and is (still) on the list of known interpreters
+ IDget("debug.interpreter."
+ ..(ide.interpreter and ide.interpreters[ide.interpreter.fname] and ide.interpreter.fname
+ or ide.config.interpreter or ide.config.default.interpreter)) or
+ -- otherwise use default interpreter
+ ID("debug.interpreter."..ide.config.default.interpreter)
+ )
+ selectInterpreter(id)
+end
+
+-----------------------------
+-- Project directory handling
+
+function ProjectUpdateProjectDir(projdir,skiptree)
+ -- strip trailing spaces as this may create issues with "path/ " on Windows
+ projdir = projdir:gsub("%s+$","")
+ local dir = wx.wxFileName.DirName(FixDir(projdir))
+ dir:Normalize() -- turn into absolute path if needed
+ if not wx.wxDirExists(dir:GetFullPath()) then return end
+
+ projdir = dir:GetPath(wx.wxPATH_GET_VOLUME) -- no trailing slash
+
+ ide.config.path.projectdir = projdir ~= "" and projdir or nil
+ ide:SetStatus(projdir)
+ frame:SetTitle(ExpandPlaceholders(ide.config.format.apptitle))
+ if (not skiptree) then ide.filetree:updateProjectDir(projdir) end
+ return true
+end
+
+local function projChoose(event)
+ local editor = GetEditor()
+ local fn = wx.wxFileName(
+ editor and openDocuments[editor:GetId()].filePath or "")
+ fn:Normalize() -- want absolute path for dialog
+
+ local projectdir = ide:GetProject()
+ local filePicker = wx.wxDirDialog(frame, TR("Choose a project directory"),
+ projectdir ~= "" and projectdir or wx.wxGetCwd(), wx.wxDIRP_DIR_MUST_EXIST)
+ if filePicker:ShowModal(true) == wx.wxID_OK then
+ return ProjectUpdateProjectDir(filePicker:GetPath())
+ end
+ return false
+end
+
+frame:Connect(ID_PROJECTDIRCHOOSE, wx.wxEVT_COMMAND_MENU_SELECTED, projChoose)
+
+local function projFromFile(event)
+ local editor = GetEditor()
+ if not editor then return end
+ local id = editor:GetId()
+ local filepath = openDocuments[id].filePath
+ if not filepath then return end
+ local fn = wx.wxFileName(filepath)
+ fn:Normalize() -- want absolute path for dialog
+
+ if ide.interpreter then
+ ProjectUpdateProjectDir(ide.interpreter:fprojdir(fn)) end
+end
+frame:Connect(ID_PROJECTDIRFROMFILE, wx.wxEVT_COMMAND_MENU_SELECTED, projFromFile)
+frame:Connect(ID_PROJECTDIRFROMFILE, wx.wxEVT_UPDATE_UI,
+ function (event)
+ local editor = GetEditor()
+ event:Enable(editor ~= nil and ide:GetDocument(editor):GetFilePath() ~= nil)
+ end)
+
+----------------------
+-- Interpreter Running
+
+local function getNameToRun(skipcheck)
+ local editor = GetEditor()
+ if not editor then return end
+
+ -- test compile it before we run it, if successful then ask to save
+ -- only compile if lua api
+ if editor.spec.apitype and
+ editor.spec.apitype == "lua" and
+ (not skipcheck) and
+ (not ide.interpreter.skipcompile) and
+ (not CompileProgram(editor, { reportstats = false })) then
+ return
+ end
+
+ local doc = ide:GetDocument(editor)
+ local name = ide:GetProjectStartFile() or doc:GetFilePath()
+ if not name then doc:SetModified(true) end
+ if not SaveIfModified(editor) then return end
+ if ide.config.editor.saveallonrun then SaveAll(true) end
+
+ return wx.wxFileName(name or doc:GetFilePath())
+end
+
+function ActivateOutput()
+ if not ide.config.activateoutput then return end
+ -- show output/errorlog pane
+ if not uimgr:GetPane(bottomnotebook):IsShown() then
+ uimgr:GetPane(bottomnotebook):Show(true)
+ uimgr:Update()
+ end
+ -- activate output/errorlog window
+ local index = bottomnotebook:GetPageIndex(bottomnotebook.errorlog)
+ if bottomnotebook:GetSelection() ~= index then
+ bottomnotebook:SetSelection(index)
+ end
+end
+
+local function runInterpreter(wfilename, withdebugger)
+ ClearOutput()
+ ActivateOutput()
+
+ ClearAllCurrentLineMarkers()
+ if not wfilename then return end
+ debugger.pid = ide.interpreter:frun(wfilename, withdebugger)
+ if debugger.pid then OutputEnableInput() end
+ return debugger.pid
+end
+
+function ProjectRun(skipcheck)
+ local fname = getNameToRun(skipcheck)
+ if not fname then return end
+ return runInterpreter(fname)
+end
+
+local debuggers = {
+ debug = "require('mobdebug').loop('%s',%d)",
+ scratchpad = "require('mobdebug').scratchpad('%s',%d)"
+}
+
+function ProjectDebug(skipcheck, debtype)
+ if (debugger.server ~= nil) then
+ if (debugger.scratchpad and debugger.scratchpad.paused) then
+ debugger.scratchpad.paused = nil
+ debugger.scratchpad.updated = true
+ ShellSupportRemote(nil) -- disable remote while Scratchpad running
+ elseif (not debugger.running) then
+ debugger.run()
+ end
+ else
+ local debcall = (debuggers[debtype or "debug"]):
+ format(ide.debugger.hostname, ide.debugger.portnumber)
+ local fname = getNameToRun(skipcheck)
+ if not fname then return end
+ return runInterpreter(fname, debcall) -- this may be pid or nil
+ end
+ return true
+end
+
+-----------------------
+-- Actions
+
+local BREAKPOINT_MARKER = StylesGetMarker("breakpoint")
+
+frame:Connect(ID_BREAKPOINTTOGGLE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() GetEditor():BreakpointToggle() end)
+frame:Connect(ID_BREAKPOINTTOGGLE, wx.wxEVT_UPDATE_UI,
+ function (event)
+ local editor = GetEditorWithFocus(GetEditor())
+ event:Enable((ide.interpreter) and (ide.interpreter.hasdebugger) and (editor ~= nil)
+ and (not debugger.scratchpad))
+ end)
+
+frame:Connect(ID_BREAKPOINTNEXT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ local BPNSC = KSC(ID_BREAKPOINTNEXT):gsub("\t","")
+ if not GetEditor():MarkerGotoNext(BREAKPOINT_MARKER) and BPNSC == "F9" then
+ local osx = ide.osname == "Macintosh"
+ DisplayOutputLn(("You used '%s' shortcut that has been changed from toggling a breakpoint to navigating to the next breakpoint in the document.")
+ :format(BPNSC))
+ DisplayOutputLn(("To toggle a breakpoint, use '%s' or click in the editor margin.")
+ :format(KSC(ID_BREAKPOINTTOGGLE):gsub("\t",""):gsub("Ctrl", osx and "Cmd" or "Ctrl")))
+ end
+ end)
+frame:Connect(ID_BREAKPOINTPREV, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() GetEditor():MarkerGotoPrev(BREAKPOINT_MARKER) end)
+
+frame:Connect(ID_BREAKPOINTNEXT, wx.wxEVT_UPDATE_UI,
+ function (event) event:Enable(GetEditor() ~= nil) end)
+frame:Connect(ID_BREAKPOINTPREV, wx.wxEVT_UPDATE_UI,
+ function (event) event:Enable(GetEditor() ~= nil) end)
+
+frame:Connect(ID_COMPILE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function ()
+ ActivateOutput()
+ CompileProgram(GetEditor(), {
+ keepoutput = ide:GetLaunchedProcess() ~= nil or ide:GetDebugger():IsConnected()
+ })
+ end)
+frame:Connect(ID_COMPILE, wx.wxEVT_UPDATE_UI,
+ function (event) event:Enable(GetEditor() ~= nil) end)
+
+frame:Connect(ID_RUN, wx.wxEVT_COMMAND_MENU_SELECTED, function () ProjectRun() end)
+frame:Connect(ID_RUN, wx.wxEVT_UPDATE_UI,
+ function (event)
+ local editor = GetEditor()
+ event:Enable((debugger.server == nil and debugger.pid == nil) and (editor ~= nil))
+ end)
+
+frame:Connect(ID_RUNNOW, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ if debugger.scratchpad then
+ DebuggerScratchpadOff()
+ else
+ DebuggerScratchpadOn(GetEditor())
+ end
+ end)
+frame:Connect(ID_RUNNOW, wx.wxEVT_UPDATE_UI,
+ function (event)
+ local editor = GetEditor()
+ -- allow scratchpad if there is no server or (there is a server and it is
+ -- allowed to turn it into a scratchpad) and we are not debugging anything
+ event:Enable((ide.interpreter) and (ide.interpreter.hasdebugger) and
+ (ide.interpreter.scratchextloop ~= nil) and -- nil == no scratchpad support
+ (editor ~= nil) and ((debugger.server == nil or debugger.scratchable)
+ and debugger.pid == nil or debugger.scratchpad ~= nil))
+ local isscratchpad = debugger.scratchpad ~= nil
+ menuBar:Check(ID_RUNNOW, isscratchpad)
+ local tool = ide:GetToolBar():FindTool(ID_RUNNOW)
+ if tool and tool:IsSticky() ~= isscratchpad then
+ tool:SetSticky(isscratchpad)
+ ide:GetToolBar():Refresh()
+ end
+ end)
+
+frame:Connect(ID_ATTACHDEBUG, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ if event:IsChecked() then
+ if (ide.interpreter.fattachdebug) then ide.interpreter:fattachdebug() end
+ else
+ debugger.listen(false) -- stop listening
+ end
+ end)
+frame:Connect(ID_ATTACHDEBUG, wx.wxEVT_UPDATE_UI,
+ function (event)
+ event:Enable(ide.interpreter and ide.interpreter.fattachdebug and true or false)
+ ide.frame.menuBar:Check(event:GetId(), debugger.listening and true or false)
+ end)
+
+frame:Connect(ID_STARTDEBUG, wx.wxEVT_COMMAND_MENU_SELECTED, function () ProjectDebug() end)
+frame:Connect(ID_STARTDEBUG, wx.wxEVT_UPDATE_UI,
+ function (event)
+ local editor = GetEditor()
+ event:Enable((ide.interpreter) and (ide.interpreter.hasdebugger) and
+ ((debugger.server == nil and debugger.pid == nil and editor ~= nil) or
+ (debugger.server ~= nil and not debugger.running)) and
+ (not debugger.scratchpad or debugger.scratchpad.paused))
+ local label = (debugger.server ~= nil)
+ and debugMenuRun.continue or debugMenuRun.start
+ if debugMenu:GetLabel(ID_STARTDEBUG) ~= label then
+ debugMenu:SetLabel(ID_STARTDEBUG, label)
+ end
+ end)
+
+frame:Connect(ID_STOPDEBUG, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function () DebuggerShutdown() end)
+frame:Connect(ID_STOPDEBUG, wx.wxEVT_UPDATE_UI,
+ function (event)
+ event:Enable(debugger.server ~= nil or debugger.pid ~= nil)
+ local label = (debugger.server == nil and debugger.pid ~= nil)
+ and debugMenuStop.process or debugMenuStop.debugging
+ if debugMenu:GetLabel(ID_STOPDEBUG) ~= label then
+ debugMenu:SetLabel(ID_STOPDEBUG, label)
+ end
+ end)
+
+frame:Connect(ID_DETACHDEBUG, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function () debugger.detach() end)
+frame:Connect(ID_DETACHDEBUG, wx.wxEVT_UPDATE_UI,
+ function (event)
+ event:Enable((debugger.server ~= nil) and (not debugger.scratchpad))
+ end)
+
+frame:Connect(ID_RUNTO, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function ()
+ local editor = GetEditor()
+ debugger.runto(editor, editor:GetCurrentLine())
+ end)
+frame:Connect(ID_RUNTO, wx.wxEVT_UPDATE_UI,
+ function (event)
+ local editor = GetEditor()
+ event:Enable((debugger.server ~= nil) and (not debugger.running)
+ and (editor ~= nil) and (not debugger.scratchpad))
+ end)
+
+frame:Connect(ID_STEP, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function () debugger.step() end)
+frame:Connect(ID_STEP, wx.wxEVT_UPDATE_UI,
+ function (event)
+ local editor = GetEditor()
+ event:Enable((debugger.server ~= nil) and (not debugger.running)
+ and (editor ~= nil) and (not debugger.scratchpad))
+ end)
+
+frame:Connect(ID_STEPOVER, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function () debugger.over() end)
+frame:Connect(ID_STEPOVER, wx.wxEVT_UPDATE_UI,
+ function (event)
+ local editor = GetEditor()
+ event:Enable((debugger.server ~= nil) and (not debugger.running)
+ and (editor ~= nil) and (not debugger.scratchpad))
+ end)
+
+frame:Connect(ID_STEPOUT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function () debugger.out() end)
+frame:Connect(ID_STEPOUT, wx.wxEVT_UPDATE_UI,
+ function (event)
+ local editor = GetEditor()
+ event:Enable((debugger.server ~= nil) and (not debugger.running)
+ and (editor ~= nil) and (not debugger.scratchpad))
+ end)
+
+frame:Connect(ID_TRACE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function () debugger.trace() end)
+frame:Connect(ID_TRACE, wx.wxEVT_UPDATE_UI,
+ function (event)
+ local editor = GetEditor()
+ event:Enable((debugger.server ~= nil) and (not debugger.running)
+ and (editor ~= nil) and (not debugger.scratchpad))
+ end)
+
+frame:Connect(ID_BREAK, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function ()
+ if debugger.server then
+ debugger.breaknow()
+ if debugger.scratchpad then
+ debugger.scratchpad.paused = true
+ ShellSupportRemote(debugger.shell)
+ end
+ end
+ end)
+frame:Connect(ID_BREAK, wx.wxEVT_UPDATE_UI,
+ function (event)
+ event:Enable(debugger.server ~= nil
+ and (debugger.running
+ or (debugger.scratchpad and not debugger.scratchpad.paused)))
+ end)
+
+frame:Connect(ID_COMMANDLINEPARAMETERS, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function ()
+ local params = wx.wxGetTextFromUser(TR("Enter command line parameters (use Cancel to clear)"),
+ TR("Command line parameters"), ide.config.arg.any or "")
+ ide.config.arg.any = params and #params > 0 and params or nil
+ end)
+frame:Connect(ID_COMMANDLINEPARAMETERS, wx.wxEVT_UPDATE_UI,
+ function (event)
+ event:Enable(ide.interpreter and ide.interpreter.takeparameters and true or false)
+ end)
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_search.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_search.lua
new file mode 100644
index 0000000..8fcad40
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_search.lua
@@ -0,0 +1,420 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Lomtik Software (J. Winwood & John Labenski)
+-- Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+local q = EscapeMagic
+local unpack = table.unpack or unpack
+
+local frame = ide.frame
+local menuBar = frame.menuBar
+local findReplace = ide.findReplace
+
+local findMenu = wx.wxMenu{
+ { ID_FIND, TR("&Find")..KSC(ID_FIND), TR("Find text") },
+ { ID_FINDNEXT, TR("Find &Next")..KSC(ID_FINDNEXT), TR("Find the next text occurrence") },
+ { ID_FINDPREV, TR("Find &Previous")..KSC(ID_FINDPREV), TR("Find the earlier text occurence") },
+ { ID_FINDSELECTNEXT, TR("Select And Find Next")..KSC(ID_FINDSELECTNEXT), TR("Select the word under cursor and find its next occurrence") },
+ { ID_FINDSELECTPREV, TR("Select And Find Previous")..KSC(ID_FINDSELECTPREV), TR("Select the word under cursor and find its previous occurrence") },
+ { ID_REPLACE, TR("&Replace")..KSC(ID_REPLACE), TR("Find and replace text") },
+ { },
+ { ID_FINDINFILES, TR("Find &In Files")..KSC(ID_FINDINFILES), TR("Find text in files") },
+ { ID_REPLACEINFILES, TR("Re&place In Files")..KSC(ID_REPLACEINFILES), TR("Find and replace text in files") },
+ { },
+}
+findMenu:Append(ID_NAVIGATE, TR("Navigate"), wx.wxMenu {
+ { ID_NAVIGATETOFILE, TR("Go To File...")..KSC(ID_NAVIGATETOFILE), TR("Go to file") },
+ { ID_NAVIGATETOLINE, TR("Go To Line...")..KSC(ID_NAVIGATETOLINE), TR("Go to line") },
+ { ID_NAVIGATETOSYMBOL, TR("Go To Symbol...")..KSC(ID_NAVIGATETOSYMBOL), TR("Go to symbol") },
+ { ID_NAVIGATETOMETHOD, TR("Insert Library Function...")..KSC(ID_NAVIGATETOMETHOD), TR("Find and insert library function") },
+})
+
+menuBar:Append(findMenu, TR("&Search"))
+
+local function onUpdateUISearchMenu(event) event:Enable(GetEditor() ~= nil) end
+
+frame:Connect(ID_FIND, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ findReplace:Show(false)
+ end)
+frame:Connect(ID_FIND, wx.wxEVT_UPDATE_UI, onUpdateUISearchMenu)
+
+frame:Connect(ID_REPLACE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ findReplace:Show(true)
+ end)
+frame:Connect(ID_REPLACE, wx.wxEVT_UPDATE_UI, onUpdateUISearchMenu)
+
+frame:Connect(ID_FINDINFILES, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ findReplace:Show(false,true)
+ end)
+frame:Connect(ID_REPLACEINFILES, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ findReplace:Show(true,true)
+ end)
+
+frame:Connect(ID_FINDNEXT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ local editor = GetEditor()
+ if editor and ide.wxver >= "2.9.5" and editor:GetSelections() > 1 then
+ local selection = editor:GetMainSelection() + 1
+ if selection >= editor:GetSelections() then selection = 0 end
+ editor:SetMainSelection(selection)
+ editor:ShowPosEnforcePolicy(editor:GetCurrentPos())
+ else
+ if findReplace:SetFind(findReplace:GetFind() or findReplace:GetSelection()) then
+ findReplace:Find()
+ else
+ findReplace:Show(false)
+ end
+ end
+ end)
+frame:Connect(ID_FINDNEXT, wx.wxEVT_UPDATE_UI, onUpdateUISearchMenu)
+
+frame:Connect(ID_FINDPREV, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ local editor = GetEditor()
+ if editor and ide.wxver >= "2.9.5" and editor:GetSelections() > 1 then
+ local selection = editor:GetMainSelection() - 1
+ if selection < 0 then selection = editor:GetSelections() - 1 end
+ editor:SetMainSelection(selection)
+ editor:ShowPosEnforcePolicy(editor:GetCurrentPos())
+ else
+ if findReplace:SetFind(findReplace:GetFind() or findReplace:GetSelection()) then
+ findReplace:Find(true) -- search up
+ else
+ findReplace:Show(false)
+ end
+ end
+ end)
+frame:Connect(ID_FINDPREV, wx.wxEVT_UPDATE_UI, onUpdateUISearchMenu)
+
+-- Select and Find behaves like Find if there is a current selection;
+-- if not, it selects a word under cursor (if any) and does find.
+
+frame:Connect(ID_FINDSELECTNEXT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ if findReplace:SetFind(findReplace:GetSelection() or findReplace:GetWordAtCaret()) then
+ findReplace:Find()
+ end
+ end)
+frame:Connect(ID_FINDSELECTNEXT, wx.wxEVT_UPDATE_UI, onUpdateUISearchMenu)
+
+frame:Connect(ID_FINDSELECTPREV, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ if findReplace:SetFind(findReplace:GetSelection() or findReplace:GetWordAtCaret()) then
+ findReplace:Find(true)
+ end
+ end)
+frame:Connect(ID_FINDSELECTPREV, wx.wxEVT_UPDATE_UI, onUpdateUISearchMenu)
+
+local markername = "commandbar.background"
+local mac = ide.osname == 'Macintosh'
+local win = ide.osname == 'Windows'
+local special = {SYMBOL = '@', LINE = ':', METHOD = ';'}
+local tabsep = "\0"
+local function name2index(name)
+ local p = name:find(tabsep)
+ return p and tonumber(name:sub(p + #tabsep)) or nil
+end
+local function navigateTo(default, selected)
+ local styles = ide.config.styles
+ local marker = ide:AddMarker(markername,
+ wxstc.wxSTC_MARK_BACKGROUND, styles.text.fg, styles.caretlinebg.bg)
+
+ local nb = ide:GetEditorNotebook()
+ local selection = nb:GetSelection()
+ local maxitems = ide.config.commandbar.maxitems
+ local files, preview, origline, functions, methods
+
+ local function markLine(ed, toline)
+ ed:MarkerDefine(ide:GetMarker(markername))
+ ed:MarkerDeleteAll(marker)
+ ed:MarkerAdd(toline-1, marker)
+ -- store the original line if not stored yet
+ origline = origline or (ed:GetCurrentLine()+1)
+ ed:EnsureVisibleEnforcePolicy(toline-1)
+ end
+
+ CommandBarShow({
+ defaultText = default or "",
+ selectedText = selected or "",
+ onDone = function(t, enter, text)
+ if not mac then nb:Freeze() end
+
+ -- delete all current line markers if any; restore line position
+ local ed = ide:GetEditor()
+ if ed and origline then
+ ed:MarkerDeleteAll(marker)
+ -- only restore original line if Escape was used (enter == false)
+ if enter == false then ed:EnsureVisibleEnforcePolicy(origline-1) end
+ end
+
+ local pindex = preview and nb:GetPageIndex(preview)
+ if enter then
+ local fline, sline, tabindex = unpack(t or {})
+
+ -- jump to symbol; tabindex has the position of the symbol
+ if text and text:find(special.SYMBOL) then
+ if sline and tabindex then
+ local index = name2index(sline)
+ local editor = index and nb:GetPage(index):DynamicCast("wxStyledTextCtrl")
+ if not editor then
+ local doc = ide:FindDocument(sline)
+ -- reload the file (including the preview to refresh its symbols in the outline)
+ editor = LoadFile(sline, (not doc or doc:GetTabIndex() == pindex) and preview or nil)
+ end
+ if editor then
+ if pindex and pindex ~= ide:GetDocument(editor):GetTabIndex() then ClosePage(pindex) end
+ editor:SetFocus() -- in case the focus is on some other panel
+ editor:GotoPos(tabindex-1)
+ editor:EnsureVisibleEnforcePolicy(editor:LineFromPosition(tabindex-1))
+ end
+ end
+ -- insert selected method
+ elseif text and text:find('^%s*'..special.METHOD) then
+ if ed then -- clean up text and insert at the current location
+ local method = sline
+ local isfunc = methods.desc[method][1]:find(q(method).."%s*%(")
+ local text = method .. (isfunc and "()" or "")
+ local pos = ed:GetCurrentPos()
+ ed:InsertTextDyn(pos, text)
+ ed:EnsureVisibleEnforcePolicy(ed:LineFromPosition(pos))
+ ed:GotoPos(pos + #method + (isfunc and 1 or 0))
+ if isfunc then -- show the tooltip
+ ide.frame:AddPendingEvent(wx.wxCommandEvent(
+ wx.wxEVT_COMMAND_MENU_SELECTED, ID_SHOWTOOLTIP))
+ end
+ end
+ -- set line position in the (current) editor if requested
+ elseif text and text:find(special.LINE..'(%d+)%s*$') then
+ local toline = tonumber(text:match(special.LINE..'(%d+)'))
+ if toline and ed then
+ ed:GotoLine(toline-1)
+ ed:EnsureVisibleEnforcePolicy(toline-1)
+ ed:SetFocus() -- in case the focus is on some other panel
+ end
+ elseif tabindex then -- switch to existing tab
+ SetEditorSelection(tabindex)
+ if pindex and pindex ~= tabindex then ClosePage(pindex) end
+ -- load a new file (into preview if set)
+ elseif sline or text then
+ -- 1. use "text" if Ctrl/Cmd-Enter is used
+ -- 2. otherwise use currently selected file
+ -- 3. otherwise use "text"
+ local file = (wx.wxGetKeyState(wx.WXK_CONTROL) and text) or sline or text
+ local fullPath = MergeFullPath(ide:GetProject(), file)
+ local doc = ide:FindDocument(fullPath)
+ -- if the document is already opened (not in the preview)
+ -- or can't be opened as a file or folder, then close the preview
+ if doc and doc.index ~= pindex
+ or not LoadFile(fullPath, preview or nil) and not ProjectUpdateProjectDir(fullPath) then
+ if pindex then ClosePage(pindex) end
+ end
+ end
+ elseif enter == nil then -- changed focus
+ -- do nothing; keep everything as is
+ else
+ -- close preview
+ if pindex then ClosePage(pindex) end
+ -- restore original selection if canceled
+ if nb:GetSelection() ~= selection then nb:SetSelection(selection) end
+ end
+ preview = nil
+ if not mac then nb:Thaw() end
+ end,
+ onUpdate = function(text)
+ local lines = {}
+ local projdir = ide:GetProject()
+
+ -- delete all current line markers if any
+ -- restore the original position if search text is updated
+ local ed = ide:GetEditor()
+ if ed and origline then ed:MarkerDeleteAll(marker) end
+
+ -- reset cached functions if no symbol search
+ if text and not text:find(special.SYMBOL) then
+ functions = nil
+ if ed and origline then ed:EnsureVisibleEnforcePolicy(origline-1) end
+ end
+ -- reset cached methods if no method search
+ if text and not text:find(special.METHOD) then methods = nil end
+
+ if text and text:find(special.SYMBOL) then
+ local file, symbol = text:match('^(.*)'..special.SYMBOL..'(.*)')
+ if not functions then
+ local nums, paths = {}, {}
+ functions = {pos = {}, src = {}}
+
+ local function populateSymbols(path, symbols)
+ for _, func in ipairs(symbols) do
+ table.insert(functions, func.name)
+ nums[func.name] = (nums[func.name] or 0) + 1
+ local num = nums[func.name]
+ functions.src[func.name..num] = path
+ functions.pos[func.name..num] = func.pos
+ end
+ end
+
+ local currentonly = #file > 0 and ed
+ local outline = ide:GetOutline()
+ for _, doc in pairs(currentonly and {ide:GetDocument(ed)} or ide:GetDocuments()) do
+ local path, editor = doc:GetFilePath(), doc:GetEditor()
+ if path then paths[path] = true end
+ populateSymbols(path or doc:GetFileName()..tabsep..doc:GetTabIndex(), outline:GetEditorSymbols(editor))
+ end
+
+ -- now add all other files in the project
+ if not currentonly and ide.config.commandbar.showallsymbols then
+ local n = 0
+ outline:RefreshSymbols(projdir, function(path)
+ local symbols = outline:GetFileSymbols(path)
+ if not paths[path] and symbols then populateSymbols(path, symbols) end
+ if not symbols then n = n + 1 end
+ end)
+ if n > 0 then ide:SetStatusFor(TR("Queued %d files to index."):format(n)) end
+ end
+ end
+ local nums = {}
+ if #symbol > 0 then
+ local topscore
+ for _, item in ipairs(CommandBarScoreItems(functions, symbol, maxitems)) do
+ local func, score = unpack(item)
+ topscore = topscore or score
+ nums[func] = (nums[func] or 0) + 1
+ local num = nums[func]
+ if score > topscore / 4 and score > 1 then
+ table.insert(lines, {("%2d %s"):format(score, func),
+ functions.src[func..num], functions.pos[func..num]})
+ end
+ end
+ else
+ for n, name in ipairs(functions) do
+ if n > maxitems then break end
+ nums[name] = (nums[name] or 0) + 1
+ local num = nums[name]
+ lines[n] = {name, functions.src[name..num], functions.pos[name..num]}
+ end
+ end
+ elseif ed and text and text:find('^%s*'..special.METHOD) then
+ if not methods then
+ methods = {desc = {}}
+ local num = 1
+ if ed.api and ed.api.tip and ed.api.tip.shortfinfoclass then
+ for libname, lib in pairs(ed.api.tip.shortfinfoclass) do
+ for method, val in pairs(lib) do
+ local signature, desc = val:match('(.-)\n(.*)')
+ local m = libname..'.'..method
+ desc = desc and desc:gsub("\n", " ") or val
+ methods[num] = m
+ methods.desc[m] = {signature or (libname..'.'..method), desc}
+ num = num + 1
+ end
+ end
+ end
+ end
+ local method = text:match(special.METHOD..'(.*)')
+ if #method > 0 then
+ local topscore
+ for _, item in ipairs(CommandBarScoreItems(methods, method, maxitems)) do
+ local method, score = unpack(item)
+ topscore = topscore or score
+ if score > topscore / 4 and score > 1 then
+ table.insert(lines, { score, method })
+ end
+ end
+ end
+ elseif text and text:find(special.LINE..'(%d*)%s*$') then
+ local toline = tonumber(text:match(special.LINE..'(%d+)'))
+ if toline and ed then markLine(ed, toline) end
+ elseif text and #text > 0 and projdir and #projdir > 0 then
+ -- populate the list of files
+ files = files or FileSysGetRecursive(projdir, true, "*",
+ {sort = false, path = false, folder = false, skipbinary = true})
+ local topscore
+ for _, item in ipairs(CommandBarScoreItems(files, text, maxitems)) do
+ local file, score = unpack(item)
+ topscore = topscore or score
+ if score > topscore / 4 and score > 1 then
+ table.insert(lines, {
+ ("%2d %s"):format(score, wx.wxFileName(file):GetFullName()),
+ file,
+ })
+ end
+ end
+ else
+ for _, doc in pairs(ide:GetDocuments()) do
+ lines[doc:GetTabIndex()+1] = {doc:GetFileName(), doc:GetFilePath(), doc:GetTabIndex()}
+ end
+ end
+ return lines
+ end,
+ onItem = function(t)
+ if methods then
+ local score, method = unpack(t)
+ return ("%2d %s"):format(score, methods.desc[method][1]), methods.desc[method][2]
+ else
+ return unpack(t)
+ end
+ end,
+ onSelection = function(t, text)
+ local _, file, tabindex = unpack(t)
+ local pos
+ if text and text:find(special.SYMBOL) then
+ pos, tabindex = tabindex, name2index(file)
+ elseif text and text:find(special.METHOD) then
+ return
+ end
+
+ if file then file = MergeFullPath(ide:GetProject(), file) end
+ -- disabling event handlers for the notebook and the editor
+ -- to minimize changes in the UI when editors are switched
+ -- or files in the preview are updated.
+ nb:SetEvtHandlerEnabled(false)
+ local doc = file and ide:FindDocument(file)
+ if doc and not tabindex then tabindex = doc:GetTabIndex() end
+ if tabindex then
+ local ed = nb:GetPage(tabindex)
+ ed:SetEvtHandlerEnabled(false)
+ if nb:GetSelection() ~= tabindex then nb:SetSelection(tabindex) end
+ ed:SetEvtHandlerEnabled(true)
+ elseif file then
+ -- skip binary files with unknown extensions
+ if #ide:GetKnownExtensions(GetFileExt(file)) > 0
+ or not IsBinary(FileRead(file, 2048)) then
+ preview = preview or NewFile()
+ preview:SetEvtHandlerEnabled(false)
+ LoadFile(file, preview, true, true)
+ preview:SetFocus()
+ -- force refresh since the panel covers the editor on OSX/Linux
+ -- this fixes the preview window not always redrawn on Linux
+ if not win then preview:Update() preview:Refresh() end
+ preview:SetEvtHandlerEnabled(true)
+ elseif preview then
+ ClosePage(nb:GetPageIndex(preview))
+ preview = nil
+ end
+ end
+ nb:SetEvtHandlerEnabled(true)
+
+ if text and text:find(special.SYMBOL) then
+ local ed = ide:GetEditor()
+ if ed then markLine(ed, ed:LineFromPosition(pos-1)+1) end
+ end
+ end,
+ })
+end
+
+frame:Connect(ID_NAVIGATETOFILE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() navigateTo("") end)
+frame:Connect(ID_NAVIGATETOLINE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() navigateTo(special.LINE) end)
+frame:Connect(ID_NAVIGATETOMETHOD, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() navigateTo(special.METHOD) end)
+frame:Connect(ID_NAVIGATETOSYMBOL, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ local ed = GetEditor()
+ navigateTo(special.SYMBOL, ed and ed:ValueFromPosition(ed:GetCurrentPos()))
+ end)
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_tools.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_tools.lua
new file mode 100644
index 0000000..885556c
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_tools.lua
@@ -0,0 +1,111 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+local frame = ide.frame
+local menuBar = frame.menuBar
+local unpack = table.unpack or unpack
+
+--[=[
+-- tool definition
+-- main entries are optional
+tool = {
+ fnmenu = function(frame,menubar),
+ -- can be used for init
+ -- and custom menu
+ exec = {
+ -- quick exec action
+ name = "",
+ description = "",
+ fn = function(filename, projectdir),
+ }
+}
+
+]=]
+
+local toolArgs = {}
+local cnt = 1
+
+local function name2id(name) return ID("tools.exec."..name) end
+
+do
+ local maxcnt = 10
+
+ local tools = {}
+ for name,tool in pairs(ide.tools) do
+ if (tool.exec and tool.exec.name) then
+ tool.fname = name
+ table.insert(tools,tool)
+ end
+ end
+
+ table.sort(tools,function(a,b) return a.exec.name < b.exec.name end)
+
+ -- todo config specifc ignore/priority list
+ for _, tool in ipairs(tools) do
+ local exec = tool.exec
+ if (exec and cnt < maxcnt and exec.name and exec.fn and exec.description) then
+ local id = name2id(tool.fname)
+ table.insert(toolArgs,{id, TR(exec.name) .. KSC(id), exec.description})
+ -- flag it
+ tool._execid = id
+ cnt = cnt + 1
+ end
+ end
+end
+
+local function addHandler(menu, id, command, updateui)
+ menu:Connect(id, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ local editor = GetEditor()
+ if (not editor) then return end
+
+ command(ide:GetDocument(editor):GetFilePath(), ide:GetProject())
+
+ return true
+ end)
+ menu:Connect(id, wx.wxEVT_UPDATE_UI,
+ updateui or function(event) event:Enable(GetEditor() ~= nil) end)
+end
+
+if (cnt > 1) then
+
+ -- Build Menu
+ local toolMenu = wx.wxMenu{
+ unpack(toolArgs)
+ }
+ menuBar:Append(toolMenu, "&Tools")
+
+ -- connect auto execs
+ for _, tool in pairs(ide.tools) do
+ if tool._execid then addHandler(toolMenu, tool._execid, tool.exec.fn) end
+ end
+end
+
+-- Generate Custom Menus/Init
+for _, tool in pairs(ide.tools) do
+ if tool.fninit then tool.fninit(frame, menuBar) end
+end
+
+function ToolsAddTool(name, command, updateui)
+ local toolMenu = ide:FindTopMenu('&Tools')
+ if not toolMenu then
+ local helpMenu, helpindex = ide:FindTopMenu('&Help')
+ if not helpMenu then helpindex = ide:GetMenuBar():GetMenuCount() end
+
+ toolMenu = wx.wxMenu{}
+ menuBar:Insert(helpindex, toolMenu, "&Tools")
+ end
+ local id = name2id(name)
+ toolMenu:Append(id, name)
+ addHandler(toolMenu, id, command, updateui)
+end
+
+function ToolsRemoveTool(name)
+ ide:RemoveMenuItem(name2id(name))
+ local toolMenu, toolindex = ide:FindTopMenu('&Tools')
+ if toolMenu and toolMenu:GetMenuItemCount() == 0 then
+ ide:GetMenuBar():Remove(toolindex)
+ end
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_view.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_view.lua
new file mode 100644
index 0000000..71f6648
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/menu_view.lua
@@ -0,0 +1,113 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Lomtik Software (J. Winwood & John Labenski)
+-- Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+local frame = ide.frame
+local menuBar = frame.menuBar
+local uimgr = frame.uimgr
+
+local viewMenu = wx.wxMenu {
+ { ID_VIEWFILETREE, TR("Project/&FileTree Window")..KSC(ID_VIEWFILETREE), TR("View the project/filetree window"), wx.wxITEM_CHECK },
+ { ID_VIEWOUTPUT, TR("&Output/Console Window")..KSC(ID_VIEWOUTPUT), TR("View the output/console window"), wx.wxITEM_CHECK },
+ { ID_VIEWWATCHWINDOW, TR("&Watch Window")..KSC(ID_VIEWWATCHWINDOW), TR("View the watch window"), wx.wxITEM_CHECK },
+ { ID_VIEWCALLSTACK, TR("&Stack Window")..KSC(ID_VIEWCALLSTACK), TR("View the stack window"), wx.wxITEM_CHECK },
+ { ID_VIEWOUTLINE, TR("Outline Window")..KSC(ID_VIEWOUTLINE), TR("View the outline window"), wx.wxITEM_CHECK },
+ { ID_VIEWMARKERS, TR("Markers Window")..KSC(ID_VIEWMARKERS), TR("View the markers window"), wx.wxITEM_CHECK },
+ { },
+ { ID_VIEWTOOLBAR, TR("&Tool Bar")..KSC(ID_VIEWTOOLBAR), TR("Show/Hide the toolbar"), wx.wxITEM_CHECK },
+ { ID_VIEWSTATUSBAR, TR("&Status Bar")..KSC(ID_VIEWSTATUSBAR), TR("Show/Hide the status bar"), wx.wxITEM_CHECK },
+ { },
+ { ID_VIEWDEFAULTLAYOUT, TR("&Default Layout")..KSC(ID_VIEWDEFAULTLAYOUT), TR("Reset to default layout") },
+ { ID_VIEWFULLSCREEN, TR("Full &Screen")..KSC(ID_VIEWFULLSCREEN), TR("Switch to or from full screen mode") },
+}
+
+do -- Add zoom submenu
+ local zoomMenu = wx.wxMenu{
+ {ID_ZOOMRESET, TR("Zoom to 100%")..KSC(ID_ZOOMRESET)},
+ {ID_ZOOMIN, TR("Zoom In")..KSC(ID_ZOOMIN)},
+ {ID_ZOOMOUT, TR("Zoom Out")..KSC(ID_ZOOMOUT)},
+ }
+
+ frame:Connect(ID_ZOOMRESET, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() local editor = GetEditorWithFocus()
+ if editor then editor:SetZoom(0) end end)
+ frame:Connect(ID_ZOOMIN, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() local editor = GetEditorWithFocus()
+ if editor then editor:SetZoom(editor:GetZoom()+1) end end)
+ frame:Connect(ID_ZOOMOUT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() local editor = GetEditorWithFocus()
+ if editor then editor:SetZoom(editor:GetZoom()-1) end end)
+
+ -- only enable if there is an editor
+ local iseditor = function (event) event:Enable(GetEditorWithFocus() ~= nil) end
+ for _, id in ipairs({ID_ZOOMRESET, ID_ZOOMIN, ID_ZOOMOUT}) do
+ frame:Connect(id, wx.wxEVT_UPDATE_UI, iseditor)
+ end
+
+ viewMenu:Append(ID_ZOOM, TR("Zoom"), zoomMenu)
+end
+
+menuBar:Append(viewMenu, TR("&View"))
+
+local panels = {
+ [ID_VIEWOUTPUT] = "bottomnotebook",
+ [ID_VIEWFILETREE] = "projpanel",
+ [ID_VIEWWATCHWINDOW] = "watchpanel",
+ [ID_VIEWCALLSTACK] = "stackpanel",
+ [ID_VIEWOUTLINE] = "outlinepanel",
+ [ID_VIEWMARKERS] = "markerspanel",
+ [ID_VIEWTOOLBAR] = "toolbar",
+}
+
+local function togglePanel(event)
+ local panel = panels[event:GetId()]
+ local pane = uimgr:GetPane(panel)
+ local shown = not pane:IsShown()
+ if not shown then pane:BestSize(pane.window:GetSize()) end
+ pane:Show(shown)
+ uimgr:Update()
+
+ return shown
+end
+
+local function checkPanel(event)
+ local pane = uimgr:GetPane(panels[event:GetId()])
+ event:Enable(pane:IsOk()) -- disable if doesn't exist
+ menuBar:Check(event:GetId(), pane:IsOk() and pane:IsShown())
+end
+
+frame:Connect(ID_VIEWDEFAULTLAYOUT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ uimgr:LoadPerspective(uimgr.defaultPerspective, true)
+ end)
+
+frame:Connect(ID_VIEWMINIMIZE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event) ide.frame:Iconize(true) end)
+
+frame:Connect(ID_VIEWFULLSCREEN, wx.wxEVT_COMMAND_MENU_SELECTED, function ()
+ ShowFullScreen(not frame:IsFullScreen())
+ end)
+frame:Connect(ID_VIEWFULLSCREEN, wx.wxEVT_UPDATE_UI,
+ function (event) event:Enable(GetEditor() ~= nil) end)
+
+frame:Connect(ID_VIEWOUTPUT, wx.wxEVT_COMMAND_MENU_SELECTED, togglePanel)
+frame:Connect(ID_VIEWFILETREE, wx.wxEVT_COMMAND_MENU_SELECTED, togglePanel)
+frame:Connect(ID_VIEWTOOLBAR, wx.wxEVT_COMMAND_MENU_SELECTED, togglePanel)
+frame:Connect(ID_VIEWOUTLINE, wx.wxEVT_COMMAND_MENU_SELECTED, togglePanel)
+frame:Connect(ID_VIEWMARKERS, wx.wxEVT_COMMAND_MENU_SELECTED, togglePanel)
+frame:Connect(ID_VIEWWATCHWINDOW, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event) if togglePanel(event) then DebuggerRefreshPanels() end end)
+frame:Connect(ID_VIEWCALLSTACK, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event) if togglePanel(event) then DebuggerRefreshPanels() end end)
+
+frame:Connect(ID_VIEWSTATUSBAR, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ frame:GetStatusBar():Show(menuBar:IsChecked(event:GetId()))
+ uimgr:Update()
+ end)
+frame:Connect(ID_VIEWSTATUSBAR, wx.wxEVT_UPDATE_UI,
+ function (event) menuBar:Check(event:GetId(), frame:GetStatusBar():IsShown()) end)
+
+for id in pairs(panels) do frame:Connect(id, wx.wxEVT_UPDATE_UI, checkPanel) end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/outline.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/outline.lua
new file mode 100644
index 0000000..cc1fbac
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/outline.lua
@@ -0,0 +1,679 @@
+-- Copyright 2014-15 Paul Kulchenko, ZeroBrane LLC
+
+local ide = ide
+ide.outline = {
+ outlineCtrl = nil,
+ imglist = ide:CreateImageList("OUTLINE", "FILE-NORMAL", "VALUE-LCALL",
+ "VALUE-GCALL", "VALUE-ACALL", "VALUE-SCALL", "VALUE-MCALL"),
+ settings = {
+ symbols = {},
+ ignoredirs = {},
+ },
+ needsaving = false,
+ indexqueue = {[0] = {}},
+ indexpurged = false, -- flag that the index has been purged from old records; once per session
+}
+
+local outline = ide.outline
+local image = { FILE = 0, LFUNCTION = 1, GFUNCTION = 2, AFUNCTION = 3,
+ SMETHOD = 4, METHOD = 5,
+}
+local q = EscapeMagic
+local caches = {}
+
+local function setData(ctrl, item, value)
+ if ide.wxver >= "2.9.5" then
+ local data = wx.wxLuaTreeItemData()
+ data:SetData(value)
+ ctrl:SetItemData(item, data)
+ end
+end
+
+local function resetOutlineTimer()
+ if ide.config.outlineinactivity then
+ ide.timers.outline:Start(ide.config.outlineinactivity*1000, wx.wxTIMER_ONE_SHOT)
+ end
+end
+
+local function resetIndexTimer(interval)
+ if ide.config.symbolindexinactivity and not ide.timers.symbolindex:IsRunning() then
+ ide.timers.symbolindex:Start(interval or ide.config.symbolindexinactivity*1000, wx.wxTIMER_ONE_SHOT)
+ end
+end
+
+local function outlineRefresh(editor, force)
+ if not editor then return end
+ local tokens = editor:GetTokenList()
+ local sep = editor.spec.sep
+ local varname = "([%w_][%w_"..q(sep:sub(1,1)).."]*)"
+ local funcs = {updated = TimeGet()}
+ local var = {}
+ local outcfg = ide.config.outline or {}
+ local scopes = {}
+ local funcnum = 0
+ local SCOPENUM, FUNCNUM = 1, 2
+ local text
+ for _, token in ipairs(tokens) do
+ local op = token[1]
+ if op == 'Var' or op == 'Id' then
+ var = {name = token.name, fpos = token.fpos, global = token.context[token.name] == nil}
+ elseif outcfg.showcurrentfunction and op == 'Scope' then
+ local fundepth = #scopes
+ if token.name == '(' then -- a function starts a new scope
+ funcnum = funcnum + 1 -- increment function count
+ local nested = fundepth == 0 or scopes[fundepth][SCOPENUM] > 0
+ scopes[fundepth + (nested and 1 or 0)] = {1, funcnum}
+ elseif fundepth > 0 then
+ scopes[fundepth][SCOPENUM] = scopes[fundepth][SCOPENUM] + 1
+ end
+ elseif outcfg.showcurrentfunction and op == 'EndScope' then
+ local fundepth = #scopes
+ if fundepth > 0 and scopes[fundepth][SCOPENUM] > 0 then
+ scopes[fundepth][SCOPENUM] = scopes[fundepth][SCOPENUM] - 1
+ if scopes[fundepth][SCOPENUM] == 0 then
+ local funcnum = scopes[fundepth][FUNCNUM]
+ if funcs[funcnum] then
+ funcs[funcnum].poe = token.fpos + (token.name and #token.name or 0)
+ end
+ table.remove(scopes)
+ end
+ end
+ elseif op == 'Function' then
+ local depth = token.context['function'] or 1
+ local name, pos = token.name, token.fpos
+ text = text or editor:GetTextDyn()
+ local _, _, rname, params = text:find('([^%(]*)(%b())', pos)
+ if name and rname:find(token.name, 1, true) ~= 1 then
+ name = rname:gsub("%s+$","")
+ end
+ if not name then
+ local s = editor:PositionFromLine(editor:LineFromPosition(pos-1))
+ local rest
+ rest, pos, name = text:sub(s+1, pos-1):match('%s*(.-)()'..varname..'%s*=%s*function%s*$')
+ if rest then
+ pos = s + pos
+ -- guard against "foo, bar = function() end" as it would get "bar"
+ if #rest>0 and rest:find(',') then name = nil end
+ end
+ end
+ local ftype = image.LFUNCTION
+ if not name then
+ ftype = image.AFUNCTION
+ elseif outcfg.showmethodindicator and name:find('['..q(sep)..']') then
+ ftype = name:find(q(sep:sub(1,1))) and image.SMETHOD or image.METHOD
+ elseif var.name == name and var.fpos == pos
+ or var.name and name:find('^'..var.name..'['..q(sep)..']') then
+ ftype = var.global and image.GFUNCTION or image.LFUNCTION
+ end
+ name = name or outcfg.showanonymous
+ funcs[#funcs+1] = {
+ name = ((name or '~')..params):gsub("%s+", " "),
+ skip = (not name) and true or nil,
+ depth = depth,
+ image = ftype,
+ pos = name and pos or token.fpos,
+ }
+ end
+ end
+
+ if force == nil then return funcs end
+
+ local ctrl = outline.outlineCtrl
+ local cache = caches[editor] or {}
+ caches[editor] = cache
+
+ -- add file
+ local filename = ide:GetDocument(editor):GetTabText()
+ local fileitem = cache.fileitem
+ if not fileitem then
+ local root = ctrl:GetRootItem()
+ if not root or not root:IsOk() then return end
+
+ if outcfg.showonefile then
+ fileitem = root
+ else
+ fileitem = ctrl:AppendItem(root, filename, image.FILE)
+ setData(ctrl, fileitem, editor)
+ ctrl:SetItemBold(fileitem, true)
+ ctrl:SortChildren(root)
+ end
+ cache.fileitem = fileitem
+ end
+
+ do -- check if any changes in the cached function list
+ local prevfuncs = cache.funcs or {}
+ local nochange = #funcs == #prevfuncs
+ local resort = {} -- items that need to be re-sorted
+ if nochange then
+ for n, func in ipairs(funcs) do
+ func.item = prevfuncs[n].item -- carry over cached items
+ if func.depth ~= prevfuncs[n].depth then
+ nochange = false
+ elseif nochange and prevfuncs[n].item then
+ if func.name ~= prevfuncs[n].name then
+ ctrl:SetItemText(prevfuncs[n].item, func.name)
+ if outcfg.sort then resort[ctrl:GetItemParent(prevfuncs[n].item)] = true end
+ end
+ if func.image ~= prevfuncs[n].image then
+ ctrl:SetItemImage(prevfuncs[n].item, func.image)
+ end
+ end
+ end
+ end
+ cache.funcs = funcs -- set new cache as positions may change
+ if nochange and not force then -- return if no visible changes
+ if outcfg.sort then -- resort items for all parents that have been modified
+ for item in pairs(resort) do ctrl:SortChildren(item) end
+ end
+ return
+ end
+ end
+
+ -- refresh the tree
+ -- refreshing shouldn't change the focus of the current element,
+ -- but it appears that DeleteChildren (wxwidgets 2.9.5 on Windows)
+ -- moves the focus from the current element to wxTreeCtrl.
+ -- need to save the window having focus and restore after the refresh.
+ local win = ide:GetMainFrame():FindFocus()
+
+ ctrl:Freeze()
+
+ -- disabling event handlers is not strictly necessary, but it's expected
+ -- to fix a crash on Windows that had DeleteChildren in the trace (#442).
+ ctrl:SetEvtHandlerEnabled(false)
+ ctrl:DeleteChildren(fileitem)
+ ctrl:SetEvtHandlerEnabled(true)
+
+ local edpos = editor:GetCurrentPos()+1
+ local stack = {fileitem}
+ local resort = {} -- items that need to be re-sorted
+ for n, func in ipairs(funcs) do
+ local depth = outcfg.showflat and 1 or func.depth
+ local parent = stack[depth]
+ while not parent do depth = depth - 1; parent = stack[depth] end
+ if not func.skip then
+ local item = ctrl:AppendItem(parent, func.name, func.image)
+ if ide.config.outline.showcurrentfunction
+ and edpos >= func.pos and func.poe and edpos <= func.poe then
+ ctrl:SetItemBold(item, true)
+ end
+ if outcfg.sort then resort[parent] = true end
+ setData(ctrl, item, n)
+ func.item = item
+ stack[func.depth+1] = item
+ end
+ func.skip = nil
+ end
+ if outcfg.sort then -- resort items for all parents that have been modified
+ for item in pairs(resort) do ctrl:SortChildren(item) end
+ end
+ if outcfg.showcompact then ctrl:Expand(fileitem) else ctrl:ExpandAllChildren(fileitem) end
+
+ -- scroll to the fileitem, but only if it's not a root item (as it's hidden)
+ if fileitem:GetValue() ~= ctrl:GetRootItem():GetValue() then
+ ctrl:ScrollTo(fileitem)
+ ctrl:SetScrollPos(wx.wxHORIZONTAL, 0, true)
+ else -- otherwise, scroll to the top
+ ctrl:SetScrollPos(wx.wxVERTICAL, 0, true)
+ end
+ ctrl:Thaw()
+
+ if win and win ~= ide:GetMainFrame():FindFocus() then win:SetFocus() end
+end
+
+local function indexFromQueue()
+ if #outline.indexqueue == 0 then return end
+
+ local editor = ide:GetEditor()
+ local inactivity = ide.config.symbolindexinactivity
+ if editor and inactivity and editor.updated > TimeGet()-inactivity then
+ -- reschedule timer for later time
+ resetIndexTimer()
+ else
+ local fname = table.remove(outline.indexqueue, 1)
+ outline.indexqueue[0][fname] = nil
+ -- check if fname is already loaded
+ ide:SetStatusFor(TR("Indexing %d files: '%s'..."):format(#outline.indexqueue+1, fname))
+ local content, err = FileRead(fname)
+ if content then
+ local editor = ide:CreateBareEditor()
+ editor:SetupKeywords(GetFileExt(fname))
+ editor:SetTextDyn(content)
+ editor:Colourise(0, -1)
+ editor:ResetTokenList()
+ while IndicateAll(editor) do end
+
+ outline:UpdateSymbols(fname, outlineRefresh(editor))
+ editor:Destroy()
+ else
+ DisplayOutputLn(TR("Can't open file '%s': %s"):format(fname, err))
+ end
+ if #outline.indexqueue == 0 then
+ outline:SaveSettings()
+ ide:SetStatusFor(TR("Indexing completed."))
+ end
+ ide:DoWhenIdle(indexFromQueue)
+ end
+ return
+end
+
+local function createOutlineWindow()
+ local REFRESH, REINDEX = 1, 2
+ local width, height = 360, 200
+ local ctrl = wx.wxTreeCtrl(ide.frame, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxSize(width, height),
+ wx.wxTR_LINES_AT_ROOT + wx.wxTR_HAS_BUTTONS
+ + wx.wxTR_HIDE_ROOT + wx.wxNO_BORDER)
+
+ outline.outlineCtrl = ctrl
+ ide.timers.outline = wx.wxTimer(ctrl, REFRESH)
+ ide.timers.symbolindex = wx.wxTimer(ctrl, REINDEX)
+
+ ctrl:AddRoot("Outline")
+ ctrl:SetImageList(outline.imglist)
+ ctrl:SetFont(ide.font.fNormal)
+
+ function ctrl:ActivateItem(item_id)
+ local data = ctrl:GetItemData(item_id)
+ if ctrl:GetItemImage(item_id) == image.FILE then
+ -- activate editor tab
+ local editor = data:GetData()
+ if not ide:GetEditorWithFocus(editor) then ide:GetDocument(editor):SetActive() end
+ else
+ -- activate tab and move cursor based on stored pos
+ -- get file parent
+ local onefile = (ide.config.outline or {}).showonefile
+ local parent = ctrl:GetItemParent(item_id)
+ if not onefile then -- find the proper parent
+ while parent:IsOk() and ctrl:GetItemImage(parent) ~= image.FILE do
+ parent = ctrl:GetItemParent(parent)
+ end
+ if not parent:IsOk() then return end
+ end
+ -- activate editor tab
+ local editor = onefile and GetEditor() or ctrl:GetItemData(parent):GetData()
+ local cache = caches[editor]
+ if editor and cache then
+ -- move to position in the file
+ editor:GotoPosEnforcePolicy(cache.funcs[data:GetData()].pos-1)
+ -- only set editor active after positioning as this may change focus,
+ -- which may regenerate the outline, which may invalidate `data` value
+ if not ide:GetEditorWithFocus(editor) then ide:GetDocument(editor):SetActive() end
+ end
+ end
+ end
+
+ local function activateByPosition(event)
+ local mask = (wx.wxTREE_HITTEST_ONITEMINDENT + wx.wxTREE_HITTEST_ONITEMLABEL
+ + wx.wxTREE_HITTEST_ONITEMICON + wx.wxTREE_HITTEST_ONITEMRIGHT)
+ local item_id, flags = ctrl:HitTest(event:GetPosition())
+
+ if item_id and item_id:IsOk() and bit.band(flags, mask) > 0 then
+ ctrl:ActivateItem(item_id)
+ else
+ event:Skip()
+ end
+ return true
+ end
+
+ ctrl:Connect(wx.wxEVT_TIMER, function(event)
+ if event:GetId() == REFRESH then outlineRefresh(GetEditor(), false) end
+ if event:GetId() == REINDEX then ide:DoWhenIdle(indexFromQueue) end
+ end)
+ ctrl:Connect(wx.wxEVT_LEFT_DOWN, activateByPosition)
+ ctrl:Connect(wx.wxEVT_LEFT_DCLICK, activateByPosition)
+ ctrl:Connect(wx.wxEVT_COMMAND_TREE_ITEM_ACTIVATED, function(event)
+ ctrl:ActivateItem(event:GetItem())
+ end)
+
+ ctrl:Connect(ID_OUTLINESORT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ ide.config.outline.sort = not ide.config.outline.sort
+ for editor, cache in pairs(caches) do
+ ide:SetStatus(("Refreshing '%s'..."):format(ide:GetDocument(editor):GetFileName()))
+ local isexpanded = ctrl:IsExpanded(cache.fileitem)
+ outlineRefresh(editor, true)
+ if not isexpanded then ctrl:Collapse(cache.fileitem) end
+ end
+ ide:SetStatus('')
+ end)
+
+ ctrl:Connect(wx.wxEVT_COMMAND_TREE_ITEM_MENU,
+ function (event)
+ local menu = wx.wxMenu {
+ { ID_OUTLINESORT, TR("Sort By Name"), "", wx.wxITEM_CHECK },
+ }
+ menu:Check(ID_OUTLINESORT, ide.config.outline.sort)
+
+ PackageEventHandle("onMenuOutline", menu, ctrl, event)
+
+ ctrl:PopupMenu(menu)
+ end)
+
+
+ local function reconfigure(pane)
+ pane:TopDockable(false):BottomDockable(false)
+ :MinSize(150,-1):BestSize(300,-1):FloatingSize(200,300)
+ end
+
+ local layout = ide:GetSetting("/view", "uimgrlayout")
+ if not layout or not layout:find("outlinepanel") then
+ ide:AddPanelDocked(ide:GetProjectNotebook(), ctrl, "outlinepanel", TR("Outline"), reconfigure, false)
+ else
+ ide:AddPanel(ctrl, "outlinepanel", TR("Outline"), reconfigure)
+ end
+end
+
+local function eachNode(eachFunc, root, recursive)
+ local ctrl = outline.outlineCtrl
+ local item = ctrl:GetFirstChild(root or ctrl:GetRootItem())
+ while true do
+ if not item:IsOk() then break end
+ if eachFunc and eachFunc(ctrl, item) then break end
+ if recursive and ctrl:ItemHasChildren(item) then eachNode(eachFunc, item, recursive) end
+ item = ctrl:GetNextSibling(item)
+ end
+end
+
+createOutlineWindow()
+
+local pathsep = GetPathSeparator()
+local function isInSubDir(name, path)
+ return #name > #path and path..pathsep == name:sub(1, #path+#pathsep)
+end
+
+local function isIgnoredInIndex(name)
+ local ignoredirs = outline.settings.ignoredirs
+ if ignoredirs[name] then return true end
+
+ -- check through ignored dirs to see if any of them match the file
+ for path in pairs(ignoredirs) do
+ if isInSubDir(name, path) then return true end
+ end
+
+ return false
+end
+
+local function purgeIndex(path)
+ local symbols = outline.settings.symbols
+ for name in pairs(symbols) do
+ if isInSubDir(name, path) then outline:UpdateSymbols(name, nil) end
+ end
+end
+
+local function purgeQueue(path)
+ local curqueue = outline.indexqueue
+ local newqueue = {[0] = {}}
+ for _, name in ipairs(curqueue) do
+ if not isInSubDir(name, path) then
+ table.insert(newqueue, name)
+ newqueue[0][name] = true
+ end
+ end
+ outline.indexqueue = newqueue
+end
+
+local function disableIndex(path)
+ outline.settings.ignoredirs[path] = true
+ outline:SaveSettings(true)
+
+ -- purge the path from the index and the (current) queue
+ purgeIndex(path)
+ purgeQueue(path)
+end
+
+local function enableIndex(path)
+ outline.settings.ignoredirs[path] = nil
+ outline:SaveSettings(true)
+ outline:RefreshSymbols(path)
+end
+
+local package = ide:AddPackage('core.outline', {
+ -- remove the editor from the list
+ onEditorClose = function(self, editor)
+ local cache = caches[editor]
+ local fileitem = cache and cache.fileitem
+ caches[editor] = nil -- remove from cache
+ if (ide.config.outline or {}).showonefile then return end
+ if fileitem then outline.outlineCtrl:Delete(fileitem) end
+ end,
+
+ -- handle rename of the file in the current editor
+ onEditorSave = function(self, editor)
+ if (ide.config.outline or {}).showonefile then return end
+ local cache = caches[editor]
+ local fileitem = cache and cache.fileitem
+ local doc = ide:GetDocument(editor)
+ local ctrl = outline.outlineCtrl
+ if doc and fileitem and ctrl:GetItemText(fileitem) ~= doc:GetTabText() then
+ ctrl:SetItemText(fileitem, doc:GetTabText())
+ end
+ local path = doc and doc:GetFilePath()
+ if path and cache and cache.funcs then
+ outline:UpdateSymbols(path, cache.funcs.updated > editor.updated and cache.funcs or nil)
+ outline:SaveSettings()
+ end
+ end,
+
+ -- go over the file items to turn bold on/off or collapse/expand
+ onEditorFocusSet = function(self, editor)
+ if (ide.config.outline or {}).showonefile and ide.config.outlineinactivity then
+ outlineRefresh(editor, true)
+ return
+ end
+
+ local cache = caches[editor]
+ local fileitem = cache and cache.fileitem
+ local ctrl = outline.outlineCtrl
+ local itemname = ide:GetDocument(editor):GetTabText()
+
+ -- update file name if it changed in the editor
+ if fileitem and ctrl:GetItemText(fileitem) ~= itemname then
+ ctrl:SetItemText(fileitem, itemname)
+ end
+
+ -- if the editor is not in the cache, which may happen if the user
+ -- quickly switches between tabs that don't have outline generated,
+ -- regenerate it manually
+ if not cache then resetOutlineTimer() end
+ resetIndexTimer()
+
+ eachNode(function(ctrl, item)
+ local found = fileitem and item:GetValue() == fileitem:GetValue()
+ if not found and ctrl:IsBold(item) then
+ ctrl:SetItemBold(item, false)
+ ctrl:CollapseAllChildren(item)
+ end
+ end)
+
+ if fileitem and not ctrl:IsBold(fileitem) then
+ -- run the following changes on idle as doing them inline is causing a strange
+ -- issue on OSX when clicking on a tab may skip several tabs (#546);
+ -- this is somehow caused by `ExpandAllChildren` triggered from `SetFocus` inside
+ -- `PAGE_CHANGED` handler for the notebook.
+ ide:DoWhenIdle(function()
+ ctrl:SetItemBold(fileitem, true)
+ if (ide.config.outline or {}).showcompact then
+ ctrl:Expand(fileitem)
+ else
+ ctrl:ExpandAllChildren(fileitem)
+ end
+ ctrl:ScrollTo(fileitem)
+ ctrl:SetScrollPos(wx.wxHORIZONTAL, 0, true)
+ end)
+ end
+ end,
+
+ onMenuFiletree = function(self, menu, tree, event)
+ local item_id = event:GetItem()
+ local name = tree:GetItemFullName(item_id)
+ local symboldirmenu = wx.wxMenu {
+ {ID_SYMBOLDIRREFRESH, TR("Refresh Index"), TR("Refresh indexed symbols from files in the selected directory")},
+ {ID_SYMBOLDIRDISABLE, TR("Disable Indexing For '%s'"):format(name), TR("Ignore and don't index symbols from files in the selected directory")},
+ }
+ local _, _, projdirpos = ide:FindMenuItem(ID_PROJECTDIR, menu)
+ if projdirpos then
+ local ignored = isIgnoredInIndex(name)
+ local enabledirmenu = wx.wxMenu()
+ local paths = {}
+ for path in pairs(outline.settings.ignoredirs) do table.insert(paths, path) end
+ table.sort(paths)
+ for i, path in ipairs(paths) do
+ local id = ID("file.enablesymboldir."..i)
+ enabledirmenu:Append(id, path, "")
+ tree:Connect(id, wx.wxEVT_COMMAND_MENU_SELECTED, function() enableIndex(path) end)
+ end
+
+ symboldirmenu:Append(wx.wxMenuItem(symboldirmenu, ID_SYMBOLDIRENABLE,
+ TR("Enable Indexing"), "", wx.wxITEM_NORMAL, enabledirmenu))
+ menu:Insert(projdirpos+1, wx.wxMenuItem(menu, ID_SYMBOLDIRINDEX,
+ TR("Symbol Index"), "", wx.wxITEM_NORMAL, symboldirmenu))
+
+ -- disable "enable" if it's empty
+ menu:Enable(ID_SYMBOLDIRENABLE, #paths > 0)
+ -- disable "refresh" and "disable" if the directory is ignored
+ -- or if any of the directories above it are ignored
+ menu:Enable(ID_SYMBOLDIRREFRESH, tree:IsDirectory(item_id) and not ignored)
+ menu:Enable(ID_SYMBOLDIRDISABLE, tree:IsDirectory(item_id) and not ignored)
+
+ tree:Connect(ID_SYMBOLDIRREFRESH, wx.wxEVT_COMMAND_MENU_SELECTED, function()
+ -- purge files in this directory as some might have been removed;
+ -- files will be purged based on time, but this is a good time to clean.
+ purgeIndex(name)
+ outline:RefreshSymbols(name)
+ resetIndexTimer(1) -- start after 1ms
+ end)
+ tree:Connect(ID_SYMBOLDIRDISABLE, wx.wxEVT_COMMAND_MENU_SELECTED, function()
+ disableIndex(name)
+ end)
+ end
+ end,
+
+ onEditorPainted = function(self, editor)
+ local ctrl = ide.outline.outlineCtrl
+ if not ide:IsWindowShown(ctrl) then return end
+
+ local cache = caches[editor]
+ if not cache or not ide.config.outline.showcurrentfunction then return end
+
+ local edpos = editor:GetCurrentPos()+1
+ local edline = editor:LineFromPosition(edpos-1)+1
+ if cache.pos and cache.pos == edpos then return end
+ if cache.line and cache.line == edline then return end
+
+ cache.pos = edpos
+ cache.line = edline
+
+ local n = 0
+ local MIN, MAX = 1, 2
+ local visible = {[MIN] = math.huge, [MAX] = 0}
+ local needshown = {[MIN] = math.huge, [MAX] = 0}
+
+ ctrl:Unselect()
+ -- scan all items recursively starting from the current file
+ eachNode(function(ctrl, item)
+ local func = cache.funcs[ctrl:GetItemData(item):GetData()]
+ local val = edpos >= func.pos and func.poe and edpos <= func.poe
+ if edline == editor:LineFromPosition(func.pos)+1
+ or (func.poe and edline == editor:LineFromPosition(func.poe)+1) then
+ cache.line = nil
+ end
+ ctrl:SetItemBold(item, val)
+ if val then ctrl:SelectItem(item, val) end
+
+ if not ide.config.outline.jumptocurrentfunction then return end
+ n = n + 1
+ -- check that this and the items around it are all visible;
+ -- this is to avoid the situation when the current item is only partially visible
+ local isvisible = ctrl:IsVisible(item) and ctrl:GetNextVisible(item):IsOk() and ctrl:GetPrevVisible(item):IsOk()
+ if val and not isvisible then
+ needshown[MIN] = math.min(needshown[MIN], n)
+ needshown[MAX] = math.max(needshown[MAX], n)
+ elseif isvisible then
+ visible[MIN] = math.min(visible[MIN], n)
+ visible[MAX] = math.max(visible[MAX], n)
+ end
+ end, cache.fileitem, true)
+
+ if not ide.config.outline.jumptocurrentfunction then return end
+ if needshown[MAX] > visible[MAX] then
+ ctrl:ScrollLines(needshown[MAX]-visible[MAX]) -- scroll forward to the last hidden line
+ elseif needshown[MIN] < visible[MIN] then
+ ctrl:ScrollLines(needshown[MIN]-visible[MIN]) -- scroll backward to the first hidden line
+ end
+ end,
+ })
+
+local function queuePath(path)
+ -- only queue if symbols inactivity is set, so files will be indexed
+ if ide.config.symbolindexinactivity and not outline.indexqueue[0][path] then
+ outline.indexqueue[0][path] = true
+ table.insert(outline.indexqueue, 1, path)
+ end
+end
+
+function outline:GetFileSymbols(path)
+ local symbols = self.settings.symbols[path]
+ -- queue path to process when appropriate
+ if not symbols then queuePath(path) end
+ return symbols
+end
+
+function outline:GetEditorSymbols(editor)
+ -- force token refresh (as these may be not updated yet)
+ if #editor:GetTokenList() == 0 then
+ while IndicateAll(editor) do end
+ end
+
+ -- only refresh the functions when none is present
+ if not caches[editor] or #caches[editor].funcs == 0 then outlineRefresh(editor, true) end
+ return caches[editor].funcs
+end
+
+function outline:RefreshSymbols(path, callback)
+ if isIgnoredInIndex(path) then return end
+
+ local exts = {}
+ for _, ext in pairs(ide:GetKnownExtensions()) do
+ local spec = GetSpec(ext)
+ if spec and spec.marksymbols then table.insert(exts, ext) end
+ end
+
+ local opts = {sort = false, folder = false, skipbinary = true, yield = true,
+ -- skip those directories that are on the "ignore" list
+ ondirectory = function(name) return outline.settings.ignoredirs[name] == nil end
+ }
+ local nextfile = coroutine.wrap(function() FileSysGetRecursive(path, true, table.concat(exts, ";"), opts) end)
+ while true do
+ local file = nextfile()
+ if not file then break end
+ if not isIgnoredInIndex(file) then (callback or queuePath)(file) end
+ end
+end
+
+function outline:UpdateSymbols(fname, symb)
+ local symbols = self.settings.symbols
+ symbols[fname] = symb
+
+ -- purge outdated records
+ local threshold = TimeGet() - 60*60*24*7 -- cache for 7 days
+ if not self.indexpurged then
+ for k, v in pairs(symbols) do
+ if v.updated < threshold then symbols[k] = nil end
+ end
+ self.indexpurged = true
+ end
+
+ self.needsaving = true
+end
+
+function outline:SaveSettings(force)
+ if self.needsaving or force then
+ ide:PushStatus(TR("Updating symbol index and settings..."))
+ package:SetSettings(self.settings, {keyignore = {depth = true, image = true, poe = true, item = true, skip = true}})
+ ide:PopStatus()
+ self.needsaving = false
+ end
+end
+
+MergeSettings(outline.settings, package:GetSettings())
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/output.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/output.lua
new file mode 100644
index 0000000..523ac8c
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/output.lua
@@ -0,0 +1,498 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Lomtik Software (J. Winwood & John Labenski)
+-- Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+local frame = ide.frame
+local bottomnotebook = frame.bottomnotebook
+local errorlog = bottomnotebook.errorlog
+
+-------
+-- setup errorlog
+local MESSAGE_MARKER = StylesGetMarker("message")
+local PROMPT_MARKER = StylesGetMarker("prompt")
+local PROMPT_MARKER_VALUE = 2^PROMPT_MARKER
+
+errorlog:Show(true)
+errorlog:SetFont(ide.font.oNormal)
+errorlog:StyleSetFont(wxstc.wxSTC_STYLE_DEFAULT, ide.font.oNormal)
+errorlog:SetBufferedDraw(not ide.config.hidpi and true or false)
+errorlog:StyleClearAll()
+errorlog:SetMarginWidth(1, 16) -- marker margin
+errorlog:SetMarginType(1, wxstc.wxSTC_MARGIN_SYMBOL)
+errorlog:MarkerDefine(StylesGetMarker("message"))
+errorlog:MarkerDefine(StylesGetMarker("prompt"))
+errorlog:SetReadOnly(true)
+if (ide.config.outputshell.usewrap) then
+ errorlog:SetWrapMode(wxstc.wxSTC_WRAP_WORD)
+ errorlog:SetWrapStartIndent(0)
+ errorlog:SetWrapVisualFlags(wxstc.wxSTC_WRAPVISUALFLAG_END)
+ errorlog:SetWrapVisualFlagsLocation(wxstc.wxSTC_WRAPVISUALFLAGLOC_END_BY_TEXT)
+end
+
+StylesApplyToEditor(ide.config.stylesoutshell,errorlog,ide.font.oNormal,ide.font.oItalic)
+
+function ClearOutput(force)
+ if not (force or ide:GetMenuBar():IsChecked(ID_CLEAROUTPUT)) then return end
+ errorlog:SetReadOnly(false)
+ errorlog:ClearAll()
+ errorlog:SetReadOnly(true)
+end
+
+local inputBound = 0 -- to track where partial output ends for input editing purposes
+local function getInputLine()
+ return errorlog:MarkerPrevious(errorlog:GetLineCount()+1, PROMPT_MARKER_VALUE)
+end
+local function getInputText(bound)
+ return errorlog:GetTextRangeDyn(
+ errorlog:PositionFromLine(getInputLine())+(bound or 0), errorlog:GetLength())
+end
+local function updateInputMarker()
+ local lastline = errorlog:GetLineCount()-1
+ errorlog:MarkerDeleteAll(PROMPT_MARKER)
+ errorlog:MarkerAdd(lastline, PROMPT_MARKER)
+ inputBound = #getInputText()
+end
+function OutputEnableInput() updateInputMarker() end
+
+function DisplayOutputNoMarker(...)
+ local message = ""
+ local cnt = select('#',...)
+ for i=1,cnt do
+ local v = select(i,...)
+ message = message..tostring(v)..(i<cnt and "\t" or "")
+ end
+
+ local promptLine = getInputLine()
+ local insertedAt = promptLine == -1 and errorlog:GetLength() or errorlog:PositionFromLine(promptLine) + inputBound
+ local current = errorlog:GetReadOnly()
+ errorlog:SetReadOnly(false)
+ errorlog:InsertTextDyn(insertedAt, errorlog.useraw and message or FixUTF8(message, "\022"))
+ errorlog:EmptyUndoBuffer()
+ errorlog:SetReadOnly(current)
+ errorlog:GotoPos(errorlog:GetLength())
+ if promptLine ~= -1 then updateInputMarker() end
+end
+function DisplayOutput(...)
+ errorlog:MarkerAdd(errorlog:GetLineCount()-1, MESSAGE_MARKER)
+ DisplayOutputNoMarker(...)
+end
+function DisplayOutputLn(...)
+ DisplayOutput(...)
+ DisplayOutputNoMarker("\n")
+end
+
+local streamins = {}
+local streamerrs = {}
+local streamouts = {}
+local customprocs = {}
+local textout = '' -- this is a buffer for any text sent to external scripts
+
+function DetachChildProcess()
+ for _, custom in pairs(customprocs) do
+ -- since processes are detached, their END_PROCESS event is not going
+ -- to be called; call endcallback() manually if registered.
+ if custom.endcallback then custom.endcallback() end
+ if custom.proc then custom.proc:Detach() end
+ end
+end
+
+function CommandLineRunning(uid)
+ for pid, custom in pairs(customprocs) do
+ if (custom.uid == uid and custom.proc and custom.proc.Exists(tonumber(pid))) then
+ return pid, custom.proc
+ end
+ end
+
+ return
+end
+
+function CommandLineToShell(uid,state)
+ for pid,custom in pairs(customprocs) do
+ if (pid == uid or custom.uid == uid) and custom.proc and custom.proc.Exists(tonumber(pid)) then
+ if (streamins[pid]) then streamins[pid].toshell = state end
+ if (streamerrs[pid]) then streamerrs[pid].toshell = state end
+ return true
+ end
+ end
+end
+
+-- logic to "unhide" wxwidget window using winapi
+pcall(require, 'winapi')
+local checkstart, checknext, checkperiod
+local pid = nil
+local function unHideWindow(pidAssign)
+ -- skip if not configured to do anything
+ if not ide.config.unhidewindow then return end
+ if pidAssign then
+ pid = pidAssign > 0 and pidAssign or nil
+ end
+ if pid and winapi then
+ local now = TimeGet()
+ if pidAssign and pidAssign > 0 then
+ checkstart, checknext, checkperiod = now, now, 0.02
+ end
+ if now - checkstart > 1 and checkperiod < 0.5 then
+ checkperiod = checkperiod * 2
+ end
+ if now >= checknext then
+ checknext = now + checkperiod
+ else
+ return
+ end
+ local wins = winapi.find_all_windows(function(w)
+ return w:get_process():get_pid() == pid
+ end)
+ local any = ide.interpreter.unhideanywindow
+ local show, hide, ignore = 1, 2, 0
+ for _,win in pairs(wins) do
+ -- win:get_class_name() can return nil if the window is already gone
+ -- between getting the list and this check.
+ local action = ide.config.unhidewindow[win:get_class_name()]
+ or (any and show or ignore)
+ if action == show and not win:is_visible()
+ or action == hide and win:is_visible() then
+ -- use show_async call (ShowWindowAsync) to avoid blocking the IDE
+ -- if the app is busy or is being debugged
+ win:show_async(action == show and winapi.SW_SHOW or winapi.SW_HIDE)
+ pid = nil -- indicate that unhiding is done
+ end
+ end
+ end
+end
+
+local function nameTab(tab, name)
+ local index = bottomnotebook:GetPageIndex(tab)
+ if index ~= -1 then bottomnotebook:SetPageText(index, name) end
+end
+
+function OutputSetCallbacks(pid, proc, callback, endcallback)
+ local streamin = proc and proc:GetInputStream()
+ local streamerr = proc and proc:GetErrorStream()
+ if streamin then
+ streamins[pid] = {stream=streamin, callback=callback,
+ proc=proc, check=proc and proc.IsInputAvailable}
+ end
+ if streamerr then
+ streamerrs[pid] = {stream=streamerr, callback=callback,
+ proc=proc, check=proc and proc.IsErrorAvailable}
+ end
+ customprocs[pid] = {proc=proc, endcallback=endcallback}
+end
+
+function CommandLineRun(cmd,wdir,tooutput,nohide,stringcallback,uid,endcallback)
+ if (not cmd) then return end
+
+ -- expand ~ at the beginning of the command
+ if ide.oshome and cmd:find('~') then
+ cmd = cmd:gsub([[^(['"]?)~]], '%1'..ide.oshome:gsub('[\\/]$',''), 1)
+ end
+
+ -- try to extract the name of the executable from the command
+ -- the executable may not have the extension and may be in quotes
+ local exename = string.gsub(cmd, "\\", "/")
+ local _,_,fullname = string.find(exename,'^[\'"]([^\'"]+)[\'"]')
+ exename = fullname and string.match(fullname,'/?([^/]+)$')
+ or string.match(exename,'/?([^/]-)%s') or exename
+
+ uid = uid or exename
+
+ if (CommandLineRunning(uid)) then
+ DisplayOutputLn(TR("Program can't start because conflicting process is running as '%s'.")
+ :format(cmd))
+ return
+ end
+
+ DisplayOutputLn(TR("Program starting as '%s'."):format(cmd))
+
+ local proc = wx.wxProcess(errorlog)
+ if (tooutput) then proc:Redirect() end -- redirect the output if requested
+
+ -- set working directory if specified
+ local oldcwd
+ if (wdir and #wdir > 0) then -- directory can be empty; ignore in this case
+ oldcwd = wx.wxFileName.GetCwd()
+ oldcwd = wx.wxFileName.SetCwd(wdir) and oldcwd
+ end
+
+ -- launch process
+ local params = wx.wxEXEC_ASYNC + wx.wxEXEC_MAKE_GROUP_LEADER + (nohide and wx.wxEXEC_NOHIDE or 0)
+ local pid = wx.wxExecute(cmd, params, proc)
+
+ if oldcwd then wx.wxFileName.SetCwd(oldcwd) end
+
+ -- For asynchronous execution, the return value is the process id and
+ -- zero value indicates that the command could not be executed.
+ -- The return value of -1 in this case indicates that we didn't launch
+ -- a new process, but connected to the running one (e.g. DDE under Windows).
+ if not pid or pid == -1 or pid == 0 then
+ DisplayOutputLn(TR("Program unable to run as '%s'."):format(cmd))
+ return
+ end
+
+ DisplayOutputLn(TR("Program '%s' started in '%s' (pid: %d).")
+ :format(uid, (wdir and wdir or wx.wxFileName.GetCwd()), pid))
+
+ OutputSetCallbacks(pid, proc, stringcallback, endcallback)
+ customprocs[pid].uid=uid
+ customprocs[pid].started = TimeGet()
+
+ local streamout = proc and proc:GetOutputStream()
+ if streamout then streamouts[pid] = {stream=streamout, callback=stringcallback, out=true} end
+
+ unHideWindow(pid)
+ nameTab(errorlog, TR("Output (running)"))
+
+ return pid
+end
+
+local readonce = 4096
+local maxread = readonce * 10 -- maximum number of bytes to read before pausing
+local function getStreams()
+ local function readStream(tab)
+ for _,v in pairs(tab) do
+ -- periodically stop reading to get a chance to process other events
+ local processed = 0
+ while (v.check(v.proc) and processed <= maxread) do
+ local str = v.stream:Read(readonce)
+ -- the buffer has readonce bytes, so cut it to the actual size
+ str = str:sub(1, v.stream:LastRead())
+ processed = processed + #str
+
+ local pfn
+ if (v.callback) then
+ str,pfn = v.callback(str)
+ end
+ if not str then
+ -- skip if nothing to display
+ elseif (v.toshell) then
+ DisplayShell(str)
+ else
+ DisplayOutputNoMarker(str)
+ if str and (getInputLine() > -1 or errorlog:GetReadOnly()) then
+ ActivateOutput()
+ updateInputMarker()
+ end
+ end
+ pfn = pfn and pfn()
+ end
+ end
+ end
+ local function sendStream(tab)
+ local str = textout
+ if not str then return end
+ textout = nil
+ str = str .. "\n"
+ for _,v in pairs(tab) do
+ local pfn
+ if (v.callback) then
+ str,pfn = v.callback(str)
+ end
+ v.stream:Write(str, #str)
+ updateInputMarker()
+ pfn = pfn and pfn()
+ end
+ end
+
+ readStream(streamins)
+ readStream(streamerrs)
+ sendStream(streamouts)
+end
+
+errorlog:Connect(wx.wxEVT_END_PROCESS, function(event)
+ local pid = event:GetPid()
+ if (pid ~= -1) then
+ getStreams()
+ streamins[pid] = nil
+ streamerrs[pid] = nil
+ streamouts[pid] = nil
+
+ if not customprocs[pid] then return end
+ if customprocs[pid].endcallback then customprocs[pid].endcallback() end
+ -- if this wasn't started with CommandLineRun, skip the rest
+ if not customprocs[pid].uid then return end
+
+ -- delete markers and set focus to the editor if there is an input marker
+ if errorlog:MarkerPrevious(errorlog:GetLineCount(), PROMPT_MARKER_VALUE) > -1 then
+ errorlog:MarkerDeleteAll(PROMPT_MARKER)
+ local editor = GetEditor()
+ -- check if editor still exists; it may not if the window is closed
+ if editor then editor:SetFocus() end
+ end
+ unHideWindow(0)
+ DebuggerStop(true)
+ nameTab(errorlog, TR("Output"))
+ DisplayOutputLn(TR("Program completed in %.2f seconds (pid: %d).")
+ :format(TimeGet() - customprocs[pid].started, pid))
+ customprocs[pid] = nil
+ end
+ end)
+
+errorlog:Connect(wx.wxEVT_IDLE, function()
+ if (#streamins or #streamerrs) then getStreams() end
+ if ide.osname == 'Windows' then unHideWindow() end
+ end)
+
+local jumptopatterns = {
+ -- <filename>(line,linepos):
+ "^%s*(.-)%((%d+),(%d+)%)%s*:",
+ -- <filename>(line):
+ "^%s*(.-)%((%d+).*%)%s*:",
+ --[string "<filename>"]:line:
+ '^.-%[string "([^"]+)"%]:(%d+)%s*:',
+ -- <filename>:line:linepos
+ "^%s*(.-):(%d+):(%d+):",
+ -- <filename>:line:
+ "^%s*(.-):(%d+)%s*:",
+}
+
+errorlog:Connect(wxstc.wxEVT_STC_DOUBLECLICK,
+ function(event)
+ local line = errorlog:GetCurrentLine()
+ local linetx = errorlog:GetLineDyn(line)
+
+ -- try to detect a filename and line in linetx
+ local fname, jumpline, jumplinepos
+ for _,pattern in ipairs(jumptopatterns) do
+ fname,jumpline,jumplinepos = linetx:match(pattern)
+ if (fname and jumpline) then break end
+ end
+
+ if not (fname and jumpline) then return end
+
+ -- fname may include name of executable, as in "path/to/lua: file.lua";
+ -- strip it and try to find match again if needed.
+ -- try the stripped name first as if it doesn't match, the longer
+ -- name may have parts that may be interpreter as network path and
+ -- may take few seconds to check.
+ local name
+ local fixedname = fname:match(":%s+(.+)")
+ if fixedname then
+ name = GetFullPathIfExists(FileTreeGetDir(), fixedname)
+ or FileTreeFindByPartialName(fixedname)
+ end
+ name = name
+ or GetFullPathIfExists(FileTreeGetDir(), fname)
+ or FileTreeFindByPartialName(fname)
+
+ local editor = LoadFile(name or fname,nil,true)
+ if not editor then
+ local ed = GetEditor()
+ if ed and ide:GetDocument(ed):GetFileName() == (name or fname) then
+ editor = ed
+ end
+ end
+ if editor then
+ jumpline = tonumber(jumpline)
+ jumplinepos = tonumber(jumplinepos)
+
+ editor:GotoPos(editor:PositionFromLine(math.max(0,jumpline-1))
+ + (jumplinepos and (math.max(0,jumplinepos-1)) or 0))
+ editor:EnsureVisibleEnforcePolicy(jumpline)
+ editor:SetFocus()
+ end
+
+ -- doubleclick can set selection, so reset it
+ local pos = event:GetPosition()
+ if pos == -1 then pos = errorlog:GetLineEndPosition(event:GetLine()) end
+ errorlog:SetSelection(pos, pos)
+ end)
+
+local function positionInLine(line)
+ return errorlog:GetCurrentPos() - errorlog:PositionFromLine(line)
+end
+local function caretOnInputLine(disallowLeftmost)
+ local inputLine = getInputLine()
+ local boundary = inputBound + (disallowLeftmost and 0 or -1)
+ return (errorlog:GetCurrentLine() > inputLine
+ or errorlog:GetCurrentLine() == inputLine
+ and positionInLine(inputLine) > boundary)
+end
+
+errorlog:Connect(wx.wxEVT_KEY_DOWN,
+ function (event)
+ -- this loop is only needed to allow to get to the end of function easily
+ -- "return" aborts the processing and ignores the key
+ -- "break" aborts the processing and processes the key normally
+ while true do
+ -- no special processing if it's readonly
+ if errorlog:GetReadOnly() then break end
+
+ local key = event:GetKeyCode()
+ if key == wx.WXK_UP or key == wx.WXK_NUMPAD_UP then
+ if errorlog:GetCurrentLine() > getInputLine() then break
+ else return end
+ elseif key == wx.WXK_DOWN or key == wx.WXK_NUMPAD_DOWN then
+ break -- can go down
+ elseif key == wx.WXK_LEFT or key == wx.WXK_NUMPAD_LEFT then
+ if not caretOnInputLine(true) then return end
+ elseif key == wx.WXK_BACK then
+ if not caretOnInputLine(true) then return end
+ elseif key == wx.WXK_DELETE or key == wx.WXK_NUMPAD_DELETE then
+ if not caretOnInputLine()
+ or errorlog:LineFromPosition(errorlog:GetSelectionStart()) < getInputLine() then
+ return
+ end
+ elseif key == wx.WXK_PAGEUP or key == wx.WXK_NUMPAD_PAGEUP
+ or key == wx.WXK_PAGEDOWN or key == wx.WXK_NUMPAD_PAGEDOWN
+ or key == wx.WXK_END or key == wx.WXK_NUMPAD_END
+ or key == wx.WXK_HOME or key == wx.WXK_NUMPAD_HOME
+ or key == wx.WXK_RIGHT or key == wx.WXK_NUMPAD_RIGHT
+ or key == wx.WXK_SHIFT or key == wx.WXK_CONTROL
+ or key == wx.WXK_ALT then
+ break
+ elseif key == wx.WXK_RETURN or key == wx.WXK_NUMPAD_ENTER then
+ if not caretOnInputLine()
+ or errorlog:LineFromPosition(errorlog:GetSelectionStart()) < getInputLine() then
+ return
+ end
+ errorlog:GotoPos(errorlog:GetLength()) -- move to the end
+ textout = (textout or '') .. getInputText(inputBound)
+ -- remove selection if any, otherwise the text gets replaced
+ errorlog:SetSelection(errorlog:GetSelectionEnd()+1,errorlog:GetSelectionEnd())
+ break -- don't need to do anything else with return
+ else
+ -- move cursor to end if not already there
+ if not caretOnInputLine() then
+ errorlog:GotoPos(errorlog:GetLength())
+ -- check if the selection starts before the input line and reset it
+ elseif errorlog:LineFromPosition(errorlog:GetSelectionStart()) < getInputLine(-1) then
+ errorlog:GotoPos(errorlog:GetLength())
+ errorlog:SetSelection(errorlog:GetSelectionEnd()+1,errorlog:GetSelectionEnd())
+ end
+ end
+ break
+ end
+ event:Skip()
+ end)
+
+local function inputEditable(line)
+ local inputLine = getInputLine()
+ local currentLine = line or errorlog:GetCurrentLine()
+ return inputLine > -1 and
+ (currentLine > inputLine or
+ currentLine == inputLine and positionInLine(inputLine) >= inputBound) and
+ not (errorlog:LineFromPosition(errorlog:GetSelectionStart()) < getInputLine())
+end
+
+errorlog:Connect(wxstc.wxEVT_STC_UPDATEUI,
+ function () errorlog:SetReadOnly(not inputEditable()) end)
+
+-- only allow copy/move text by dropping to the input line
+errorlog:Connect(wxstc.wxEVT_STC_DO_DROP,
+ function (event)
+ if not inputEditable(errorlog:LineFromPosition(event:GetPosition())) then
+ event:SetDragResult(wx.wxDragNone)
+ end
+ end)
+
+if ide.config.outputshell.nomousezoom then
+ -- disable zoom using mouse wheel as it triggers zooming when scrolling
+ -- on OSX with kinetic scroll and then pressing CMD.
+ errorlog:Connect(wx.wxEVT_MOUSEWHEEL,
+ function (event)
+ if wx.wxGetKeyState(wx.WXK_CONTROL) then return end
+ event:Skip()
+ end)
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/package.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/package.lua
new file mode 100644
index 0000000..004bcd0
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/package.lua
@@ -0,0 +1,735 @@
+-- Copyright 2013-15 Paul Kulchenko, ZeroBrane LLC
+---------------------------------------------------------
+
+local ide = ide
+local iscaseinsensitive = wx.wxFileName("A"):SameAs(wx.wxFileName("a"))
+local unpack = table.unpack or unpack
+local q = EscapeMagic
+
+local function eventHandle(handlers, event, ...)
+ local success
+ for package, handler in pairs(handlers) do
+ local ok, res = pcall(handler, package, ...)
+ if ok then
+ if res == false then success = false end
+ else
+ DisplayOutputLn(TR("%s event failed: %s"):format(event, res))
+ end
+ end
+ return success
+end
+
+local function getEventHandlers(packages, event)
+ local handlers = {}
+ for _, package in pairs(packages) do
+ if package[event] then handlers[package] = package[event] end
+ end
+ return handlers
+end
+
+function PackageEventHandle(event, ...)
+ return eventHandle(getEventHandlers(ide.packages, event), event, ...)
+end
+
+function PackageEventHandleOnce(event, ...)
+ -- copy packages as the event that is handled only once needs to be removed
+ local handlers = getEventHandlers(ide.packages, event)
+ -- remove all handlers as they need to be called only once
+ -- this allows them to be re-installed if needed
+ for _, package in pairs(ide.packages) do package[event] = nil end
+ return eventHandle(handlers, event, ...)
+end
+
+local function PackageEventHandleOne(file, event, ...)
+ local package = ide.packages[file]
+ if package and type(package[event]) == 'function' then
+ local ok, res = pcall(package[event], package, ...)
+ if ok then
+ if res == false then return false end
+ else
+ DisplayOutputLn(TR("%s event failed: %s"):format(event, res))
+ end
+ end
+end
+
+function PackageUnRegister(file, ...)
+ PackageEventHandleOne(file, "onUnRegister", ...)
+ -- remove from the list of installed packages
+ local package = ide.packages[file]
+ ide.packages[file] = nil
+ return package
+end
+
+function PackageRegister(file, ...)
+ if not ide.packages[file] then
+ local packages = {}
+ local package = MergeFullPath(
+ GetPathWithSep(ide.editorFilename), "packages/"..file..".lua")
+ LoadLuaFileExt(packages, package, ide.proto.Plugin)
+ packages[file].fname = file
+ ide.packages[file] = packages[file]
+ end
+ return PackageEventHandleOne(file, "onRegister", ...)
+end
+
+function ide:GetRootPath(path)
+ return MergeFullPath(GetPathWithSep(self.editorFilename), path or '')
+end
+function ide:GetPackagePath(packname)
+ return MergeFullPath(
+ self.oshome and MergeFullPath(self.oshome, '.'..self:GetAppName()..'/') or self:GetRootPath(),
+ MergeFullPath('packages', packname or '')
+ )
+end
+function ide:GetApp() return self.editorApp end
+function ide:GetAppName() return self.appname end
+function ide:GetEditor(index) return GetEditor(index) end
+function ide:GetEditorWithFocus(...) return GetEditorWithFocus(...) end
+function ide:GetEditorWithLastFocus()
+ -- make sure ide.infocus is still a valid component and not "some" userdata
+ return (self:IsValidCtrl(self.infocus)
+ and self.infocus:GetClassInfo():GetClassName() == "wxStyledTextCtrl"
+ and self.infocus:DynamicCast("wxStyledTextCtrl") or nil)
+end
+function ide:GetMenuBar() return self.frame.menuBar end
+function ide:GetStatusBar() return self.frame.statusBar end
+function ide:GetToolBar() return self.frame.toolBar end
+function ide:GetDebugger() return self.debugger end
+function ide:GetMainFrame() return self.frame end
+function ide:GetUIManager() return self.frame.uimgr end
+function ide:GetDocument(ed) return ed and self.openDocuments[ed:GetId()] end
+function ide:GetDocuments() return self.openDocuments end
+function ide:GetKnownExtensions(ext)
+ local knownexts, extmatch = {}, ext and ext:lower()
+ for _, spec in pairs(self.specs) do
+ for _, ext in ipairs(spec.exts or {}) do
+ if not extmatch or extmatch == ext:lower() then
+ table.insert(knownexts, ext)
+ end
+ end
+ end
+ table.sort(knownexts)
+ return knownexts
+end
+
+function ide:DoWhenIdle(func) table.insert(self.onidle, func) end
+
+function ide:FindTopMenu(item)
+ local index = self:GetMenuBar():FindMenu((TR)(item))
+ return self:GetMenuBar():GetMenu(index), index
+end
+function ide:FindMenuItem(itemid, menu)
+ local item, imenu = self:GetMenuBar():FindItem(itemid, menu)
+ if menu and not item then item = menu:FindItem(itemid) end
+ if not item then return end
+ menu = menu or imenu
+
+ for pos = 0, menu:GetMenuItemCount()-1 do
+ if menu:FindItemByPosition(pos):GetId() == itemid then
+ return item, menu, pos
+ end
+ end
+ return
+end
+function ide:AttachMenu(...)
+ -- AttachMenu([targetmenu,] id, submenu)
+ -- `targetmenu` is only needed for menus not attached to the main menubar
+ local menu, id, submenu = ...
+ if select('#', ...) == 2 then menu, id, submenu = nil, ... end
+ local item, menu, pos = self:FindMenuItem(id, menu)
+ if not item then return end
+
+ local menuitem = wx.wxMenuItem(menu, id, item:GetItemLabel(), item:GetHelp(), wx.wxITEM_NORMAL, submenu)
+ menu:Destroy(item)
+ return menu:Insert(pos, menuitem), pos
+end
+function ide:CloneMenu(menu)
+ if not menu then return end
+ local newmenu = wx.wxMenu()
+ local node = menu:GetMenuItems():GetFirst()
+ while node do
+ local item = node:GetData():DynamicCast("wxMenuItem")
+ newmenu:Append(item:GetId(), item:GetItemLabel(), item:GetHelp(), item:GetKind())
+ node = node:GetNext()
+ end
+ return newmenu
+end
+
+function ide:FindDocument(path)
+ local fileName = wx.wxFileName(path)
+ for _, doc in pairs(self:GetDocuments()) do
+ if doc.filePath and fileName:SameAs(wx.wxFileName(doc.filePath)) then
+ return doc
+ end
+ end
+ return
+end
+function ide:FindDocumentsByPartialPath(path)
+ local seps = "[\\/]"
+ -- add trailing path separator to make sure full directory match
+ if not path:find(seps.."$") then path = path .. GetPathSeparator() end
+ local pattern = "^"..q(path):gsub(seps, seps)
+ local lpattern = pattern:lower()
+
+ local docs = {}
+ for _, doc in pairs(self:GetDocuments()) do
+ if doc.filePath
+ and (doc.filePath:find(pattern)
+ or iscaseinsensitive and doc.filePath:lower():find(lpattern)) then
+ table.insert(docs, doc)
+ end
+ end
+ return docs
+end
+function ide:GetInterpreter() return self.interpreter end
+function ide:GetInterpreters() return self.interpreters end
+function ide:GetConfig() return self.config end
+function ide:GetOutput() return self.frame.bottomnotebook.errorlog end
+function ide:GetConsole() return self.frame.bottomnotebook.shellbox end
+function ide:GetEditorNotebook() return self.frame.notebook end
+function ide:GetOutputNotebook() return self.frame.bottomnotebook end
+function ide:GetOutline() return self.outline end
+function ide:GetProjectNotebook() return self.frame.projnotebook end
+function ide:GetProject() return FileTreeGetDir() end
+function ide:GetProjectStartFile()
+ local projectdir = FileTreeGetDir()
+ local startfile = self.filetree.settings.startfile[projectdir]
+ return MergeFullPath(projectdir, startfile), startfile
+end
+function ide:GetLaunchedProcess() return self.debugger and self.debugger.pid end
+function ide:GetProjectTree() return self.filetree.projtreeCtrl end
+function ide:GetOutlineTree() return self.outline.outlineCtrl end
+function ide:GetWatch() return self.debugger and self.debugger.watchCtrl end
+function ide:GetStack() return self.debugger and self.debugger.stackCtrl end
+
+local statusreset
+function ide:SetStatusFor(text, interval, field)
+ field = field or 0
+ interval = interval or 2
+ local statusbar = self:GetStatusBar()
+ if not ide.timers.status then
+ ide.timers.status = wx.wxTimer(statusbar)
+ statusbar:Connect(wx.wxEVT_TIMER, function(event) if statusreset then statusreset() end end)
+ end
+ statusreset = function()
+ if statusbar:GetStatusText(field) == text then statusbar:SetStatusText("", field) end
+ end
+ ide.timers.status:Start(interval*1000, wx.wxTIMER_ONE_SHOT)
+ statusbar:SetStatusText(text, field)
+end
+function ide:SetStatus(text, field) self:GetStatusBar():SetStatusText(text, field or 0) end
+function ide:GetStatus(field) return self:GetStatusBar():GetStatusText(field or 0) end
+function ide:PushStatus(text, field) self:GetStatusBar():PushStatusText(text, field or 0) end
+function ide:PopStatus(field) self:GetStatusBar():PopStatusText(field or 0) end
+function ide:Yield() wx.wxYield() end
+function ide:CreateBareEditor() return CreateEditor(true) end
+
+local rawMethods = {"AddTextDyn", "InsertTextDyn", "AppendTextDyn", "SetTextDyn",
+ "GetTextDyn", "GetLineDyn", "GetSelectedTextDyn", "GetTextRangeDyn"}
+local useraw = nil
+
+function ide:CreateStyledTextCtrl(...)
+ local editor = wxstc.wxStyledTextCtrl(...)
+ if not editor then return end
+
+ if useraw == nil then
+ useraw = true
+ for _, m in ipairs(rawMethods) do
+ if not pcall(function() return editor[m:gsub("Dyn", "Raw")] end) then useraw = false; break end
+ end
+ end
+
+ -- map all `GetTextDyn` to `GetText` or `GetTextRaw` if `*Raw` methods are present
+ editor.useraw = useraw
+ for _, m in ipairs(rawMethods) do
+ -- some `*Raw` methods return `nil` instead of `""` as their "normal" calls do
+ -- (for example, `GetLineRaw` and `GetTextRangeRaw` for parameters outside of text)
+ local def = m:find("^Get") and "" or nil
+ editor[m] = function(...) return editor[m:gsub("Dyn", useraw and "Raw" or "")](...) or def end
+ end
+
+ local suffix = "\1\0"
+ function editor:CopyDyn()
+ if not self.useraw then return self:Copy() end
+ -- check if selected fragment is a valid UTF-8 sequence
+ local text = self:GetSelectedTextRaw()
+ if text == "" or wx.wxString.FromUTF8(text) ~= "" then return self:Copy() end
+ local tdo = wx.wxTextDataObject()
+ -- append suffix as wxwidgets (3.1+ on Windows) truncate last char for odd-length strings
+ local workaround = ide.osname == "Windows" and (#text % 2 > 0) and suffix or ""
+ tdo:SetData(wx.wxDataFormat(wx.wxDF_TEXT), text..workaround)
+ local clip = wx.wxClipboard.Get()
+ clip:Open()
+ clip:SetData(tdo)
+ clip:Close()
+ end
+
+ function editor:PasteDyn()
+ if not self.useraw then return self:Paste() end
+ local tdo = wx.wxTextDataObject()
+ local clip = wx.wxClipboard.Get()
+ clip:Open()
+ clip:GetData(tdo)
+ clip:Close()
+ local ok, text = tdo:GetDataHere(wx.wxDataFormat(wx.wxDF_TEXT))
+ -- check if the fragment being pasted is a valid UTF-8 sequence
+ if not ok or text == "" or wx.wxString.FromUTF8(text) ~= "" then return self:Paste() end
+ if ide.osname == "Windows" then text = text:gsub(suffix.."+$","") end
+ self:AddTextRaw(text)
+ self:GotoPos(self:GetCurrentPos())
+ end
+
+ function editor:GotoPosEnforcePolicy(pos)
+ self:GotoPos(pos)
+ self:EnsureVisibleEnforcePolicy(self:LineFromPosition(pos))
+ end
+
+ function editor:CanFold()
+ local foldable = false
+ for m = 0, ide.MAXMARGIN do
+ if editor:GetMarginWidth(m) > 0
+ and editor:GetMarginMask(m) == wxstc.wxSTC_MASK_FOLDERS then
+ foldable = true
+ end
+ end
+ return foldable
+ end
+
+ -- circle through "fold all" => "hide base lines" => "unfold all"
+ function editor:FoldSome()
+ editor:Colourise(0, -1) -- update doc's folding info
+ local foldall = false -- at least on header unfolded => fold all
+ local hidebase = false -- at least one base is visible => hide all
+ local lines = editor:GetLineCount()
+
+ for ln = 0, lines-1 do
+ local foldRaw = editor:GetFoldLevel(ln)
+ local foldLvl = foldRaw % 4096
+ local foldHdr = (math.floor(foldRaw / 8192) % 2) == 1
+
+ -- at least one header is expanded
+ foldall = foldall or (foldHdr and editor:GetFoldExpanded(ln))
+
+ -- at least one base can be hidden
+ hidebase = hidebase or (
+ not foldHdr
+ and ln > 1 -- first line can't be hidden, so ignore it
+ and foldLvl == wxstc.wxSTC_FOLDLEVELBASE
+ and bit.band(foldRaw, wxstc.wxSTC_FOLDLEVELWHITEFLAG) == 0
+ and editor:GetLineVisible(ln))
+ end
+
+ -- shows lines; this doesn't change fold status for folded lines
+ if not foldall and not hidebase then editor:ShowLines(0, lines-1) end
+
+ for ln = 0, lines-1 do
+ local foldRaw = editor:GetFoldLevel(ln)
+ local foldLvl = foldRaw % 4096
+ local foldHdr = (math.floor(foldRaw / 8192) % 2) == 1
+
+ if foldall then
+ if foldHdr and editor:GetFoldExpanded(ln) then
+ editor:ToggleFold(ln)
+ end
+ elseif hidebase then
+ if not foldHdr and (foldLvl == wxstc.wxSTC_FOLDLEVELBASE) then
+ editor:HideLines(ln, ln)
+ end
+ else -- unfold all
+ if foldHdr and not editor:GetFoldExpanded(ln) then
+ editor:ToggleFold(ln)
+ end
+ end
+ end
+ editor:EnsureCaretVisible()
+ end
+
+ local function getMarginWidth(editor)
+ local width = 0
+ for m = 0, ide.MAXMARGIN do width = width + editor:GetMarginWidth(m) end
+ return width
+ end
+
+ function editor:ShowPosEnforcePolicy(pos)
+ local line = self:LineFromPosition(pos)
+ self:EnsureVisibleEnforcePolicy(line)
+ -- skip the rest if line wrapping is on
+ if editor:GetWrapMode() ~= wxstc.wxSTC_WRAP_NONE then return end
+ local xwidth = self:GetClientSize():GetWidth() - getMarginWidth(self)
+ local xoffset = self:GetTextExtent(self:GetLineDyn(line):sub(1, pos-self:PositionFromLine(line)+1))
+ self:SetXOffset(xoffset > xwidth and xoffset-xwidth or 0)
+ end
+
+ function editor:ClearAny()
+ local length = self:GetLength()
+ local selections = ide.wxver >= "2.9.5" and self:GetSelections() or 1
+ self:Clear() -- remove selected fragments
+
+ -- check if the modification has failed, which may happen
+ -- if there is "invisible" text in the selected fragment.
+ -- if there is only one selection, then delete manually.
+ if length == self:GetLength() and selections == 1 then
+ self:SetTargetStart(self:GetSelectionStart())
+ self:SetTargetEnd(self:GetSelectionEnd())
+ self:ReplaceTarget("")
+ end
+ end
+
+ function editor:MarkerGetAll(mask, from, to)
+ mask = mask or 2^24-1
+ local markers = {}
+ local line = editor:MarkerNext(from or 0, mask)
+ while line > -1 do
+ table.insert(markers, {line, editor:MarkerGet(line)})
+ if to and line > to then break end
+ line = editor:MarkerNext(line + 1, mask)
+ end
+ return markers
+ end
+
+ editor:Connect(wx.wxEVT_KEY_DOWN,
+ function (event)
+ local keycode = event:GetKeyCode()
+ local mod = event:GetModifiers()
+ if (keycode == wx.WXK_DELETE and mod == wx.wxMOD_SHIFT)
+ or (keycode == wx.WXK_INSERT and mod == wx.wxMOD_CONTROL)
+ or (keycode == wx.WXK_INSERT and mod == wx.wxMOD_SHIFT) then
+ local id = keycode == wx.WXK_DELETE and ID.CUT or mod == wx.wxMOD_SHIFT and ID.PASTE or ID.COPY
+ ide.frame:AddPendingEvent(wx.wxCommandEvent(wx.wxEVT_COMMAND_MENU_SELECTED, id))
+ elseif keycode == wx.WXK_CAPITAL and mod == wx.wxMOD_CONTROL then
+ -- ignore Ctrl+CapsLock
+ else
+ event:Skip()
+ end
+ end)
+ return editor
+end
+
+function ide:LoadFile(...) return LoadFile(...) end
+
+function ide:CopyToClipboard(text)
+ if wx.wxClipboard:Get():Open() then
+ wx.wxClipboard:Get():SetData(wx.wxTextDataObject(text))
+ wx.wxClipboard:Get():Close()
+ return true
+ end
+ return false
+end
+
+function ide:GetSetting(path, setting)
+ local settings = self.settings
+ local curpath = settings:GetPath()
+ settings:SetPath(path)
+ local ok, value = settings:Read(setting)
+ settings:SetPath(curpath)
+ return ok and value or nil
+end
+
+function ide:RemoveMenuItem(id, menu)
+ local _, menu, pos = self:FindMenuItem(id, menu)
+ if menu then
+ self:GetMainFrame():Disconnect(id, wx.wxID_ANY, wx.wxEVT_COMMAND_MENU_SELECTED)
+ self:GetMainFrame():Disconnect(id, wx.wxID_ANY, wx.wxEVT_UPDATE_UI)
+ menu:Disconnect(id, wx.wxID_ANY, wx.wxEVT_COMMAND_MENU_SELECTED)
+ menu:Disconnect(id, wx.wxID_ANY, wx.wxEVT_UPDATE_UI)
+ menu:Remove(id)
+
+ local positem = menu:FindItemByPosition(pos)
+ if (not positem or positem:GetKind() == wx.wxITEM_SEPARATOR)
+ and pos > 0
+ and (menu:FindItemByPosition(pos-1):GetKind() == wx.wxITEM_SEPARATOR) then
+ menu:Destroy(menu:FindItemByPosition(pos-1))
+ end
+ return true
+ end
+ return false
+end
+
+function ide:ExecuteCommand(cmd, wdir, callback, endcallback)
+ local proc = wx.wxProcess(self:GetOutput())
+ proc:Redirect()
+
+ local cwd
+ if (wdir and #wdir > 0) then -- ignore empty directory
+ cwd = wx.wxFileName.GetCwd()
+ cwd = wx.wxFileName.SetCwd(wdir) and cwd
+ end
+
+ local pid = wx.wxExecute(cmd, wx.wxEXEC_ASYNC, proc)
+ pid = pid ~= -1 and pid ~= 0 and pid or nil
+ if cwd then wx.wxFileName.SetCwd(cwd) end -- restore workdir
+ if not pid then return pid, wx.wxSysErrorMsg() end
+
+ OutputSetCallbacks(pid, proc, callback or function() end, endcallback)
+ return pid
+end
+
+function ide:CreateImageList(group, ...)
+ local _ = wx.wxLogNull() -- disable error reporting in popup
+ local size = wx.wxSize(16,16)
+ local imglist = wx.wxImageList(16,16)
+ for i = 1, select('#', ...) do
+ local icon, file = self:GetBitmap(select(i, ...), group, size)
+ if imglist:Add(icon) == -1 then
+ DisplayOutputLn(("Failed to add image '%s' to the image list.")
+ :format(file or select(i, ...)))
+ end
+ end
+ return imglist
+end
+
+local tintdef = 100
+local function iconFilter(bitmap, tint)
+ if type(tint) == 'function' then return tint(bitmap) end
+ if type(tint) ~= 'table' or #tint ~= 3 then return bitmap end
+
+ local tr, tg, tb = tint[1]/255, tint[2]/255, tint[3]/255
+ local pi = 0.299*tr + 0.587*tg + 0.114*tb -- pixel intensity
+ local perc = (tint[0] or tintdef)/tintdef
+ tr, tg, tb = tr*perc, tg*perc, tb*perc
+
+ local img = bitmap:ConvertToImage()
+ for x = 0, img:GetWidth()-1 do
+ for y = 0, img:GetHeight()-1 do
+ if not img:IsTransparent(x, y) then
+ local r, g, b = img:GetRed(x, y)/255, img:GetGreen(x, y)/255, img:GetBlue(x, y)/255
+ local gs = (r + g + b) / 3
+ local weight = 1-4*(gs-0.5)*(gs-0.5)
+ r = math.max(0, math.min(255, math.floor(255 * (gs + (tr-pi) * weight))))
+ g = math.max(0, math.min(255, math.floor(255 * (gs + (tg-pi) * weight))))
+ b = math.max(0, math.min(255, math.floor(255 * (gs + (tb-pi) * weight))))
+ img:SetRGB(x, y, r, g, b)
+ end
+ end
+ end
+ return wx.wxBitmap(img)
+end
+
+local icons = {} -- icon cache to avoid reloading the same icons
+function ide:GetBitmap(id, client, size)
+ local im = self.config.imagemap
+ local width = size:GetWidth()
+ local key = width.."/"..id
+ local keyclient = key.."-"..client
+ local mapped = im[keyclient] or im[id.."-"..client] or im[key] or im[id]
+ -- mapped may be a file name/path or wxImage object; take that into account
+ if type(im[id.."-"..client]) == 'string' then keyclient = width.."/"..im[id.."-"..client]
+ elseif type(im[keyclient]) == 'string' then keyclient = im[keyclient]
+ elseif type(im[id]) == 'string' then
+ id = im[id]
+ key = width.."/"..id
+ keyclient = key.."-"..client
+ end
+
+ local fileClient = self:GetAppName() .. "/res/" .. keyclient .. ".png"
+ local fileKey = self:GetAppName() .. "/res/" .. key .. ".png"
+ local isImage = type(mapped) == 'userdata' and mapped:GetClassInfo():GetClassName() == 'wxImage'
+ local file
+ if mapped and (isImage or wx.wxFileName(mapped):FileExists()) then file = mapped
+ elseif wx.wxFileName(fileClient):FileExists() then file = fileClient
+ elseif wx.wxFileName(fileKey):FileExists() then file = fileKey
+ else return wx.wxArtProvider.GetBitmap(id, client, size) end
+ local icon = icons[file] or iconFilter(wx.wxBitmap(file), self.config.imagetint)
+ icons[file] = icon
+ return icon, file
+end
+
+function ide:AddPackage(name, package)
+ self.packages[name] = setmetatable(package, self.proto.Plugin)
+ self.packages[name].fname = name
+ return self.packages[name]
+end
+function ide:RemovePackage(name) self.packages[name] = nil end
+
+function ide:AddWatch(watch, value)
+ local mgr = self.frame.uimgr
+ local pane = mgr:GetPane("watchpanel")
+ if (pane:IsOk() and not pane:IsShown()) then
+ pane:Show()
+ mgr:Update()
+ end
+
+ local watchCtrl = self.debugger.watchCtrl
+ if not watchCtrl then return end
+
+ local root = watchCtrl:GetRootItem()
+ if not root or not root:IsOk() then return end
+
+ local item = watchCtrl:GetFirstChild(root)
+ while true do
+ if not item:IsOk() then break end
+ if watchCtrl:GetItemExpression(item) == watch then
+ if value then watchCtrl:SetItemText(item, watch .. ' = ' .. tostring(value)) end
+ return item
+ end
+ item = watchCtrl:GetNextSibling(item)
+ end
+
+ item = watchCtrl:AppendItem(root, watch, 1)
+ watchCtrl:SetItemExpression(item, watch, value)
+ return item
+end
+
+function ide:AddInterpreter(name, interpreter)
+ self.interpreters[name] = setmetatable(interpreter, self.proto.Interpreter)
+ ProjectUpdateInterpreters()
+end
+function ide:RemoveInterpreter(name)
+ self.interpreters[name] = nil
+ ProjectUpdateInterpreters()
+end
+
+function ide:AddSpec(name, spec)
+ self.specs[name] = spec
+ UpdateSpecs()
+end
+function ide:RemoveSpec(name) self.specs[name] = nil end
+
+function ide:AddAPI(type, name, api)
+ self.apis[type] = self.apis[type] or {}
+ self.apis[type][name] = api
+end
+function ide:RemoveAPI(type, name) self.apis[type][name] = nil end
+
+function ide:AddConsoleAlias(alias, table) return ShellSetAlias(alias, table) end
+function ide:RemoveConsoleAlias(alias) return ShellSetAlias(alias, nil) end
+
+function ide:AddMarker(...) return StylesAddMarker(...) end
+function ide:GetMarker(marker) return StylesGetMarker(marker) end
+function ide:RemoveMarker(marker) StylesRemoveMarker(marker) end
+
+local indicators = {}
+function ide:AddIndicator(indic, num)
+ num = num or indicators[indic]
+ if not num then -- new indicator; find the smallest available number
+ local nums = {}
+ for _, indicator in pairs(indicators) do
+ if indicator >= wxstc.wxSTC_INDIC_CONTAINER then
+ nums[indicator-wxstc.wxSTC_INDIC_CONTAINER+1] = true
+ end
+ end
+ num = #nums + wxstc.wxSTC_INDIC_CONTAINER
+ if num > wxstc.wxSTC_INDIC_MAX then return end
+ end
+ indicators[indic] = num
+ return num
+end
+function ide:GetIndicator(indic) return indicators[indic] end
+function ide:GetIndicators() return indicators end
+function ide:RemoveIndicator(indic) indicators[indic] = nil end
+
+-- this provides a simple stack for saving/restoring current configuration
+local configcache = {}
+function ide:AddConfig(name, files)
+ if not name or configcache[name] then return end -- don't overwrite existing slots
+ if type(files) ~= "table" then files = {files} end -- allow to pass one value
+ configcache[name] = {
+ config = require('mobdebug').dump(self.config, {nocode = true}),
+ configmeta = getmetatable(self.config),
+ packages = {},
+ }
+ -- build a list of existing packages
+ local packages = {}
+ for package in pairs(self.packages) do packages[package] = true end
+ -- load config file(s)
+ for _, file in pairs(files) do LoadLuaConfig(MergeFullPath(name, file)) end
+ -- register newly added packages (if any)
+ for package in pairs(self.packages) do
+ if not packages[package] then -- this is a newly added package
+ PackageEventHandleOne(package, "onRegister")
+ configcache[name].packages[package] = true
+ end
+ end
+ ReApplySpecAndStyles() -- apply current config to the UI
+end
+function ide:RemoveConfig(name)
+ if not name or not configcache[name] then return end
+ -- unregister cached packages
+ for package in pairs(configcache[name].packages) do PackageUnRegister(package) end
+ -- load original config
+ local ok, res = LoadSafe(configcache[name].config)
+ if ok then
+ self.config = res
+ if configcache[name].configmeta then setmetatable(self.config, configcache[name].configmeta) end
+ else
+ DisplayOutputLn(("Error while restoring configuration: '%s'."):format(res))
+ end
+ configcache[name] = nil -- clear the slot after use
+ ReApplySpecAndStyles() -- apply current config to the UI
+end
+
+local panels = {}
+function ide:AddPanel(ctrl, panel, name, conf)
+ local width, height = 360, 200
+ local notebook = wxaui.wxAuiNotebook(self.frame, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxDefaultSize,
+ wxaui.wxAUI_NB_DEFAULT_STYLE + wxaui.wxAUI_NB_TAB_EXTERNAL_MOVE
+ - wxaui.wxAUI_NB_CLOSE_ON_ACTIVE_TAB + wx.wxNO_BORDER)
+ notebook:AddPage(ctrl, name, true)
+ notebook:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK,
+ function() PaneFloatToggle(notebook) end)
+ notebook:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE,
+ function(event) event:Veto() end)
+
+ local mgr = self.frame.uimgr
+ mgr:AddPane(notebook, wxaui.wxAuiPaneInfo():
+ Name(panel):Float():CaptionVisible(false):PaneBorder(false):
+ MinSize(width/2,height/2):
+ BestSize(width,height):FloatingSize(width,height):
+ PinButton(true):Hide())
+ if type(conf) == "function" then conf(mgr:GetPane(panel)) end
+ mgr.defaultPerspective = mgr:SavePerspective() -- resave default perspective
+
+ panels[name] = {ctrl, panel, name, conf}
+ return mgr:GetPane(panel), notebook
+end
+
+function ide:RemovePanel(panel)
+ local mgr = self.frame.uimgr
+ local pane = mgr:GetPane(panel)
+ if pane:IsOk() then
+ local win = pane.window
+ mgr:DetachPane(win)
+ win:Destroy()
+ mgr:Update()
+ end
+end
+
+function ide:AddPanelDocked(notebook, ctrl, panel, name, conf, activate)
+ notebook:AddPage(ctrl, name, activate ~= false)
+ panels[name] = {ctrl, panel, name, conf}
+ return notebook
+end
+function ide:IsPanelDocked(panel)
+ local layout = self:GetSetting("/view", "uimgrlayout")
+ return layout and not layout:find(panel)
+end
+
+function ide:IsValidCtrl(ctrl)
+ return ctrl and pcall(function() ctrl:GetId() end)
+end
+
+function ide:IsValidProperty(ctrl, prop)
+ return ide:IsValidCtrl(ctrl) and pcall(function() return ctrl[prop] end)
+end
+
+function ide:IsWindowShown(win)
+ while win do
+ if not win:IsShown() then return false end
+ win = win:GetParent()
+ end
+ return true
+end
+
+function ide:RestorePanelByLabel(name)
+ if not panels[name] then return end
+ return self:AddPanel(unpack(panels[name]))
+end
+
+function ide:AddTool(name, command, updateui)
+ return ToolsAddTool(name, command, updateui)
+end
+
+function ide:RemoveTool(name)
+ return ToolsRemoveTool(name)
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/print.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/print.lua
new file mode 100644
index 0000000..9b93dcd
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/print.lua
@@ -0,0 +1,195 @@
+-- Copyright 2015 Paul Kulchenko, ZeroBrane LLC
+---------------------------------------------------------
+
+local frame = ide:GetMainFrame()
+local margin = {top = 10, left = 10, bottom = 10, right = 10}
+local function printScaling(dc, printOut)
+ local pageSizeMM_x, pageSizeMM_y = printOut:GetPageSizeMM()
+
+ local ppiScr_x, ppiScr_y = printOut:GetPPIScreen()
+ local ppiPrn_x, ppiPrn_y = printOut:GetPPIPrinter()
+
+ local ppi_scale_x = ppiPrn_x/ppiScr_x
+ local ppi_scale_y = ppiPrn_y/ppiScr_y
+
+ -- get the size of DC in pixels and the number of pixels in the page
+ local dcSize_x, dcSize_y = dc:GetSize()
+ local pagePixSize_x, pagePixSize_y = printOut:GetPageSizePixels()
+
+ local dc_pagepix_scale_x = dcSize_x/pagePixSize_x
+ local dc_pagepix_scale_y = dcSize_y/pagePixSize_y
+
+ local dc_scale_x = ppi_scale_x * dc_pagepix_scale_x
+ local dc_scale_y = ppi_scale_y * dc_pagepix_scale_y
+
+ -- calculate the pixels / mm (25.4 mm = 1 inch)
+ local ppmm_x = ppiScr_x / 25.4
+ local ppmm_y = ppiScr_y / 25.4
+
+ -- adjust the page size for the pixels / mm scaling factor
+ local page_x = math.floor(pageSizeMM_x * ppmm_x)
+ local page_y = math.floor(pageSizeMM_y * ppmm_y)
+ local pageRect = wx.wxRect(0, 0, page_x, page_y)
+
+ -- get margins informations and convert to printer pixels
+ local top = math.floor(margin.top * ppmm_y)
+ local bottom = math.floor(margin.bottom * ppmm_y)
+ local left = math.floor(margin.left * ppmm_x)
+ local right = math.floor(margin.right * ppmm_x)
+
+ dc:SetUserScale(dc_scale_x, dc_scale_y)
+
+ local printRect = wx.wxRect(left, top, page_x-(left+right), page_y-(top+bottom))
+ return printRect, pageRect
+end
+
+local function connectPrintEvents(printer, printOut)
+ local editor = ide:GetEditorWithFocus()
+ local cfg = ide.config.print
+ local pages
+
+ function printOut:OnPrintPage(pageNum)
+ local dc = self:GetDC()
+ local printRect, pageRect = printScaling(dc, printOut)
+
+ -- print to an area smaller by the height of the header/footer
+ dc:SetFont(editor:GetFont())
+ local _, headerHeight = dc:GetTextExtent("qH")
+ local textRect = wx.wxRect(printRect)
+ if cfg.header then
+ textRect:SetY(textRect:GetY() + headerHeight*1.5)
+ textRect:SetHeight(textRect:GetHeight() - headerHeight*1.5)
+ end
+ if cfg.footer then
+ textRect:SetHeight(textRect:GetHeight() - headerHeight*1.5)
+ end
+
+ local selection = printer:GetPrintDialogData():GetSelection()
+ local spos = selection and editor:GetSelectionStart() or 1
+ local epos = selection and editor:GetSelectionEnd() or editor:GetLength()
+ if pageNum == nil then
+ pages = {}
+ ide:PushStatus("")
+ printOut.startTime = wx.wxNow()
+ local pos = spos
+ while pos < epos do
+ table.insert(pages, pos)
+ pos = editor:FormatRange(false, pos, epos, dc, dc, textRect, pageRect)
+ ide:PopStatus()
+ ide:PushStatus(TR("%s%% formatted..."):format(math.floor((pos-spos)*100.0/(epos-spos))))
+ end
+ if #pages == 0 then pages = {0} end
+ ide:PopStatus()
+ else
+ ide:SetStatusFor(TR("Formatting page %d..."):format(pageNum))
+ editor:FormatRange(true, pages[pageNum], epos, dc, dc, textRect, pageRect)
+
+ local c = wx.wxColour(127, 127, 127)
+ dc:SetPen(wx.wxPen(c, 1, wx.wxSOLID))
+ dc:SetTextForeground(c)
+
+ local doc = ide:GetDocument(editor)
+ local format = "([^\t]*)\t?([^\t]*)\t?([^\t]*)"
+ local placeholders = {
+ D = printOut.startTime,
+ p = pageNum,
+ P = #pages,
+ S = doc and doc:GetFileName() or "",
+ }
+ dc:SetFont(editor:GetFont())
+ if cfg.header then
+ local left, center, right = ExpandPlaceholders(cfg.header, placeholders):match(format)
+ dc:DrawText(left, printRect.X, printRect.Y)
+ dc:DrawText(center, printRect.Left + (printRect.Left + printRect.Width - dc:GetTextExtentSize(center).Width)/2, printRect.Y)
+ dc:DrawText(right, printRect.Left + printRect.Width - dc:GetTextExtentSize(right).Width, printRect.Y)
+ dc:DrawLine(printRect.X, printRect.Y + headerHeight, printRect.Left + printRect.Width, printRect.Y + headerHeight)
+ end
+ if cfg.footer then
+ local footerY = printRect.Y + printRect.Height - headerHeight
+ local left, center, right = ExpandPlaceholders(cfg.footer, placeholders):match(format)
+ dc:DrawText(left, printRect.X, footerY)
+ dc:DrawText(center, printRect.Left + (printRect.Left + printRect.Width - dc:GetTextExtentSize(center).Width)/2, footerY)
+ dc:DrawText(right, printRect.Left + printRect.Width - dc:GetTextExtentSize(right).Width, footerY)
+ dc:DrawLine(printRect.X, footerY, printRect.Left + printRect.Width, footerY)
+ end
+ end
+ return true
+ end
+ function printOut:HasPage(pageNum) return pages[pageNum] ~= nil end
+ function printOut:GetPageInfo()
+ -- on Linux `GetPageInfo` is called before the canvas is initialized, which prevents
+ -- proper calculation of the number of pages (wx2.9.5).
+ -- Return defaults here as it's going to be called once more in the right place.
+ if ide.osname == "Unix" and not pages then return 1, 9999, 1, 9999 end
+ local printDD = printer:GetPrintDialogData()
+ -- due to wxwidgets bug (http://trac.wxwidgets.org/ticket/17200), if `to` page is not set explicitly,
+ -- only one page is being printed when `selection` option is selected in the print dialog.
+ if printDD:GetSelection() then printDD:SetToPage(#pages) end -- set the page as a workaround
+ local tofrom = not printDD:GetSelection() and not printDD:GetAllPages()
+ return 1, #pages, tofrom and printDD:GetFromPage() or 1, tofrom and printDD:GetToPage() or #pages
+ end
+ function printOut:OnPreparePrinting() self:OnPrintPage() end
+end
+
+frame:Connect(ID_PAGESETUP, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ local pageSetupDD = wx.wxPageSetupDialogData()
+ pageSetupDD.MarginTopLeft = wx.wxPoint(margin.left, margin.top)
+ pageSetupDD.MarginBottomRight = wx.wxPoint(margin.right, margin.bottom)
+ pageSetupDD:EnableOrientation(false)
+ pageSetupDD:EnablePaper(false)
+
+ local pageSetupDialog = wx.wxPageSetupDialog(frame, pageSetupDD)
+ pageSetupDialog:ShowModal()
+ pageSetupDD = pageSetupDialog:GetPageSetupDialogData()
+ margin.top, margin.left = pageSetupDD.MarginTopLeft.y, pageSetupDD.MarginTopLeft.x
+ margin.bottom, margin.right = pageSetupDD.MarginBottomRight.y, pageSetupDD.MarginBottomRight.x
+ end)
+
+frame:Connect(ID_PRINT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ local cfg = ide.config.print
+ local editor = ide:GetEditorWithFocus()
+ editor:SetPrintMagnification(cfg.magnification)
+ editor:SetPrintColourMode(cfg.colourmode)
+ editor:SetPrintWrapMode(cfg.wrapmode)
+
+ -- only enable selection if there is something selected in the editor (ignore multiple selections)
+ local printDD = wx.wxPrintDialogData()
+ printDD:EnableSelection(editor:GetSelectionStart() ~= editor:GetSelectionEnd())
+
+ local printer = wx.wxPrinter(printDD)
+ local luaPrintout = wx.wxLuaPrintout()
+ connectPrintEvents(printer, luaPrintout)
+
+ -- save and hide indicators
+ local indics = {}
+ for _, num in pairs(ide:GetIndicators()) do
+ indics[num] = editor:IndicatorGetStyle(num)
+ editor:IndicatorSetStyle(num, wxstc.wxSTC_INDIC_HIDDEN)
+ end
+ -- bold keywords
+ local keywords = {}
+ for _, num in ipairs(ide:IsValidProperty(editor, 'spec') and editor.spec.lexerstyleconvert and editor.spec.lexerstyleconvert.keywords0 or {}) do
+ keywords[num] = editor:StyleGetBold(num)
+ editor:StyleSetBold(num, true)
+ end
+ local ok = printer:Print(frame, luaPrintout, true)
+ -- restore indicators
+ for n, style in pairs(indics) do editor:IndicatorSetStyle(n, style) end
+ for n, style in pairs(keywords) do editor:StyleSetBold(n, style) end
+ if not ok and printer:GetLastError() == wx.wxPRINTER_ERROR then
+ ReportError("There was a problem while printing.\nCheck if your current printer is set correctly.")
+ end
+ end)
+
+frame:Connect(ID_PRINT, wx.wxEVT_UPDATE_UI, function(event) event:Enable(ide:GetEditorWithFocus() ~= nil) end)
+
+local _, menu, epos = ide:FindMenuItem(ID.EXIT)
+-- disable printing on Unix/Linux as it generates incorrect layout (wx2.9.5, wx3.1)
+if ide.osname ~= "Unix" and menu and epos then
+ -- insert Print-repated menu items (going in the opposite order)
+ menu:Insert(epos-1, ID_PAGESETUP, TR("Page Setup..."), "")
+ menu:Insert(epos-1, ID_PRINT, TR("&Print..."), TR("Print the current document"))
+ menu:InsertSeparator(epos-1)
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/proto.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/proto.lua
new file mode 100644
index 0000000..fd24f50
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/proto.lua
@@ -0,0 +1,68 @@
+-- Copyright 2013-15 Paul Kulchenko, ZeroBrane LLC
+---------------------------------------------------------
+
+local q = EscapeMagic
+local modpref = ide.MODPREF
+
+ide.proto.Document = {__index = {
+ GetFileName = function(self) return self.fileName end,
+ GetFilePath = function(self) return self.filePath end,
+ GetFileExt = function(self) return GetFileExt(self.fileName) end,
+ GetModTime = function(self) return self.modTime end,
+ GetEditor = function(self) return self.editor end,
+ GetTabIndex = function(self) return self.index end,
+ IsModified = function(self) return self.isModified end,
+ IsNew = function(self) return self.filePath == nil end,
+ SetModified = function(self, modified)
+ self.isModified = modified
+ self:SetTabText()
+ end,
+ SetTabText = function(self, text)
+ ide:GetEditorNotebook():SetPageText(self.index,
+ (self.isModified and modpref or '')..(text or self:GetTabText()))
+ end,
+ GetTabText = function(self)
+ if self.index == nil then return self.fileName end
+ return ide:GetEditorNotebook():GetPageText(self.index):gsub("^"..q(modpref), "")
+ end,
+ SetActive = function(self) SetEditorSelection(self.index) end,
+ Save = function(self) return SaveFile(self.editor, self.filePath) end,
+ Close = function(self) return ClosePage(self.index) end,
+ CloseAll = function(self) return CloseAllPagesExcept(-1) end,
+ CloseAllExcept = function(self) return CloseAllPagesExcept(self.index) end,
+}}
+
+ide.proto.Plugin = {__index = {
+ GetName = function(self) return self.name end,
+ GetFileName = function(self) return self.fname end,
+ GetFilePath = function(self) return MergeFullPath(GetPathWithSep(ide.editorFilename), self.fpath) end,
+ GetConfig = function(self) return ide.config[self.fname] or {} end,
+ GetSettings = function(self) return SettingsRestorePackage(self.fname) end,
+ SetSettings = function(self, settings, opts) SettingsSavePackage(self.fname, settings, opts) end,
+}}
+
+ide.proto.Interpreter = {__index = {
+ GetName = function(self) return self.name end,
+ GetFileName = function(self) return self.fname end,
+ GetExePath = function(self, ...) return self:fexepath(...) end,
+ GetAPI = function(self) return self.api end,
+ fprojdir = function(self,wfilename)
+ return wfilename:GetPath(wx.wxPATH_GET_VOLUME)
+ end,
+ fworkdir = function (self,wfilename)
+ local proj = ide:GetProject()
+ return proj and proj:gsub("[\\/]$","") or wfilename:GetPath(wx.wxPATH_GET_VOLUME)
+ end,
+}}
+
+ide.proto.Debugger = {__index = {
+ IsRunning = function(self) return self.running end,
+ IsConnected = function(self) return self.server end,
+ GetHostName = function(self) return self.hostname end,
+ GetPortNumber = function(self) return self.portnumber end,
+}}
+
+ide.proto.ID = {
+ __index = function(_, id) return _G['ID_'..id] end,
+ __call = function(_, id) return IDgen(id) end,
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/settings.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/settings.lua
new file mode 100644
index 0000000..5f776b6
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/settings.lua
@@ -0,0 +1,593 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Lomtik Software (J. Winwood & John Labenski)
+-- Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+local layoutlabel = {
+ UIMANAGER = "uimgrlayout",
+ NOTEBOOK = "nblayout",
+ NOTEBOOKOUTPUT = "nbbtmlayout",
+ NOTEBOOKPROJECT = "nbprojlayout",
+ DOCKNOTEBOOK = "nbdocklayout",
+ DOCKNOTEBOOKOUTPUT = "nbbtmdocklayout",
+ DOCKNOTEBOOKPROJECT = "nbprojdocklayout",
+ STATUSBAR = "statusbar",
+}
+
+-- ----------------------------------------------------------------------------
+-- Initialize the wxConfig for loading/saving the preferences
+
+local ini = ide.config.ini
+-- if ini path is relative and includes a directory name, make it relative to the IDE location
+ini = ini and (not wx.wxIsAbsolutePath(ini) and wx.wxFileName(ini):GetDirCount() > 0
+ and MergeFullPath(GetPathWithSep(ide.editorFilename), ini) or ini)
+-- check that the ini file doesn't point to a directory
+if ini and (wx.wxFileName(ini):IsDir() or wx.wxIsAbsolutePath(ini) and wx.wxDirExists(ini)) then
+ print(("Can't use 'ini' configuration setting '%s' that points to a directory instead of a file; ignored.")
+ :format(ini))
+ ini = nil
+end
+-- check that the directory is writable
+if ini and wx.wxIsAbsolutePath(ini) and not wx.wxFileName(ini):IsDirWritable() then
+ print(("Can't use 'ini' configuration setting '%s' that points to a non-writable directory; ignored.")
+ :format(ini))
+ ini = nil
+end
+
+local settings = wx.wxFileConfig(GetIDEString("settingsapp"), GetIDEString("settingsvendor"), ini or "")
+ide.settings = settings
+
+local function settingsReadSafe(settings,what,default)
+ local cr,out = settings:Read(what,default)
+ return cr and out or default
+end
+
+-- ----------------------------------------------------------------------------
+-- wxConfig load/save preferences functions
+
+function SettingsRestoreFramePosition(window, windowName)
+ local path = settings:GetPath()
+ settings:SetPath("/"..windowName)
+
+ local s = tonumber(select(2,settings:Read("s", -1)))
+ local x = tonumber(select(2,settings:Read("x", 0)))
+ local y = tonumber(select(2,settings:Read("y", 0)))
+ local w = tonumber(select(2,settings:Read("w", 1100)))
+ local h = tonumber(select(2,settings:Read("h", 700)))
+
+ if (s ~= -1) and (s ~= 1) and (s ~= 2) then
+ local clientX, clientY, clientWidth, clientHeight = wx.wxClientDisplayRect()
+
+ if x < clientX then x = clientX end
+ if y < clientY then y = clientY end
+
+ if w > clientWidth then w = clientWidth end
+ if h > clientHeight then h = clientHeight end
+
+ window:SetSize(x, y, w, h)
+ elseif s == 1 then
+ window:Maximize(true)
+ end
+
+ settings:SetPath(path)
+end
+
+function SettingsSaveFramePosition(window, windowName)
+ local path = settings:GetPath()
+ settings:SetPath("/"..windowName)
+
+ local s = 0
+ local w, h = window:GetSizeWH()
+ local x, y = window:GetPositionXY()
+
+ if window:IsMaximized() then
+ s = 1
+ elseif window:IsIconized() then
+ s = 2
+ end
+
+ settings:Write("s", s==2 and 0 or s) -- iconized maybe - but that shouldnt be saved
+
+ if s == 0 then
+ settings:Write("x", x)
+ settings:Write("y", y)
+ settings:Write("w", w)
+ settings:Write("h", h)
+ end
+
+ settings:SetPath(path)
+end
+
+---
+-- (table) SettingsRestoreFileHistory (function)
+-- restores a list of recently loaded documents from the settings table
+-- a table is returned which contains tables each with a filename key, pointing to
+-- the filename
+function SettingsRestoreFileHistory(fntab)
+ local path = settings:GetPath()
+ local listname = "/filehistory"
+ settings:SetPath(listname)
+
+ local outtab = {}
+ local inlist = {}
+ for id=1,ide.config.filehistorylength do
+ local couldread, name = settings:Read(tostring(id), "")
+ if not couldread or name == "" then break end
+ if not inlist[name] then
+ inlist[name] = true
+ table.insert(outtab,{filename = name})
+ end
+ end
+
+ if fntab then fntab(outtab) end
+
+ settings:SetPath(path)
+
+ return outtab
+end
+
+function SettingsSaveFileHistory (filehistory)
+ local listname = "/filehistory"
+ local path = settings:GetPath()
+ settings:DeleteGroup(listname)
+ settings:SetPath(listname)
+
+ for i,doc in ipairs(filehistory) do
+ settings:Write(tostring(i), doc.filename)
+ end
+
+ settings:SetPath(path)
+end
+
+---
+-- () SettingsRestoreFileSession (function [, string section])
+-- restores a list of opened files from the file settings
+-- calls the given function with the restored table, a list
+-- of tables containing tables like
+-- {filename = "filename", cursorpos = <cursor position>}
+function SettingsRestoreFileSession(fntab, section)
+ local listname = section or "/session"
+ local path = settings:GetPath()
+ settings:SetPath(listname)
+ local outtab = {}
+ local params = {}
+ local ismore, key, index = settings:GetFirstEntry("", 0)
+ while (ismore) do
+ local couldread, value = settings:Read(key, "")
+ if tonumber(key) then
+ local fname,cursorpos = value:match("^(.+);(.-)$")
+ if (couldread and value ~= "") then
+ outtab[tonumber(key)] =
+ {filename = fname or value, cursorpos = tonumber(cursorpos) or 0}
+ end
+ else
+ params[key] = tonumber(value) or value
+ end
+ ismore, key, index = settings:GetNextEntry(index)
+ end
+
+ if fntab then fntab(outtab, params) end
+
+ settings:SetPath(path)
+
+ return outtab
+end
+
+---
+-- () SettingsSaveFileSession (table opendocs, table params [, string section])
+-- saves the list of currently opened documents (passed in the opendocs table)
+-- in the settings.
+function SettingsSaveFileSession(opendocs, params, section)
+ local listname = section or "/session"
+ local path = settings:GetPath()
+ settings:DeleteGroup(listname)
+ settings:SetPath(listname)
+
+ for i,doc in ipairs(opendocs) do
+ settings:Write(tostring(i), doc.filename..";"..doc.cursorpos)
+ end
+
+ -- save all other parameters
+ for k,v in pairs(params) do settings:Write(k, v) end
+
+ settings:SetPath(path)
+end
+
+---
+-- () SettingsRestoreProjectSession (function)
+function SettingsRestoreProjectSession(fntab)
+ local listname = "/projectsession"
+ local path = settings:GetPath()
+ settings:SetPath(listname)
+ local outtab = {}
+ local couldread = true
+ local id = 1
+ local name
+ while (couldread) do
+ couldread, name = settings:Read(tostring(id), "")
+ couldread = couldread and name ~= ""
+ if (couldread) then
+ if (wx.wxDirExists(name)) then
+ table.insert(outtab,name)
+
+ local function projsession(...) ProjectConfig(name, {...}) end
+ SettingsRestoreFileSession(projsession, listname .. "/" .. tostring(id))
+ end
+ id = id + 1
+ end
+ end
+
+ if fntab then fntab(outtab) end
+
+ settings:SetPath(path)
+
+ return outtab
+end
+
+---
+-- () SettingsSaveProjectSession (table projdirs)
+-- saves the list of currently active projects
+-- in the settings.
+function SettingsSaveProjectSession(projdirs)
+ local listname = "/projectsession"
+ local path = settings:GetPath()
+ settings:DeleteGroup(listname)
+ settings:SetPath(listname)
+
+ for i,dir in ipairs(projdirs) do
+ settings:Write(tostring(i), dir)
+
+ local opendocs, params = ProjectConfig(dir)
+ if opendocs then
+ SettingsSaveFileSession(opendocs, params, listname .. "/" .. tostring(i))
+ end
+ end
+
+ settings:SetPath(path)
+end
+
+function SettingsRestorePackage(package)
+ local packagename = "/package/"..package
+ local path = settings:GetPath()
+ settings:SetPath(packagename)
+ local outtab = {}
+ local ismore, key, index = settings:GetFirstEntry("", 0)
+ while (ismore) do
+ local couldread, value = settings:Read(key, "")
+ if couldread then
+ local ok, res = LoadSafe("return "..value)
+ if ok then outtab[key] = res
+ else
+ outtab[key] = nil
+ ide:Print(("Couldn't load and ignored '%s' settings for package '%s': %s")
+ :format(key, package, res))
+ end
+ end
+ ismore, key, index = settings:GetNextEntry(index)
+ end
+ settings:SetPath(path)
+ return outtab
+end
+
+local function plaindump(val, opts, done)
+ local keyignore = opts and opts.keyignore or {}
+ local final = done == nil
+ opts, done = opts or {}, done or {}
+ local t = type(val)
+ if t == "table" then
+ done[#done+1] = '{'
+ done[#done+1] = ''
+ for key, value in pairs (val) do
+ if not keyignore[key] then
+ done[#done+1] = '['
+ plaindump(key, opts, done)
+ done[#done+1] = ']='
+ plaindump(value, opts, done)
+ done[#done+1] = ","
+ end
+ end
+ done[#done] = '}'
+ elseif t == "string" then
+ done[#done+1] = ("%q"):format(val):gsub("\010","n"):gsub("\026","\\026")
+ elseif t == "number" then
+ done[#done+1] = ("%.17g"):format(val)
+ else
+ done[#done+1] = tostring(val)
+ end
+ return final and table.concat(done, '')
+end
+
+function SettingsSavePackage(package, values, opts)
+ local packagename = "/package/"..package
+ local path = settings:GetPath()
+
+ settings:DeleteGroup(packagename)
+ settings:SetPath(packagename)
+ for k,v in pairs(values or {}) do settings:Write(k, plaindump(v, opts)) end
+ settings:SetPath(path)
+end
+
+-----------------------------------
+
+local function saveNotebook(nb)
+ local cnt = nb:GetPageCount()
+
+ local function addTo(tab,key,value)
+ local out = tab[key] or {}
+ table.insert(out,value)
+ tab[key] = out
+ end
+
+ local pagesX = {}
+ local pagesY = {}
+
+ local str = "nblayout|"
+
+ for i=1,cnt do
+ local id = nb:GetPageText(i-1)
+ local pg = nb:GetPage(i-1)
+ local x,y = pg:GetPosition():GetXY()
+ addTo(pagesX,x,id)
+ addTo(pagesY,y,id)
+ end
+
+ local function sortedPages(tab)
+ local t = {}
+ for i in pairs(tab) do
+ table.insert(t,i)
+ end
+ table.sort(t)
+ return t
+ end
+
+ local sortedX = sortedPages(pagesX)
+ local sortedY = sortedPages(pagesY)
+
+ -- for now only support "1D" splits and prefer
+ -- dimension which has more, anything else
+ -- requires a more complex algorithm, yet to do
+
+ local pagesUse
+ local sortedUse
+ local split
+
+ if ( #sortedX >= #sortedY) then
+ pagesUse = pagesX
+ sortedUse = sortedX
+ split = "<X>"
+ else
+ pagesUse = pagesY
+ sortedUse = sortedY
+ split = "<Y>"
+ end
+
+ for _, v in ipairs(sortedUse) do
+ local pages = pagesUse[v]
+ for _, id in ipairs(pages) do
+ str = str..id.."|"
+ end
+ str = str..split.."|"
+ end
+
+ return str
+end
+
+local function loadNotebook(nb,str,fnIdConvert)
+ str = str:match("nblayout|(.+)")
+ if (not str) then return end
+ local cnt = nb:GetPageCount()
+ local sel = nb:GetSelection()
+
+ -- store old pages
+ local currentpages, order = {}, {}
+ for i=1,cnt do
+ local id = nb:GetPageText(i-1)
+ local newid = fnIdConvert and fnIdConvert(id) or id
+ currentpages[newid] = currentpages[newid] or {}
+ table.insert(currentpages[newid], {page = nb:GetPage(i-1), text = id, index = i-1})
+ order[i] = newid
+ end
+
+ -- remove them
+ for i=cnt,1,-1 do nb:RemovePage(i-1) end
+
+ -- read them and perform splits
+ local t = 0
+ local newsel
+ local function finishPage(page)
+ if (page.index == sel) then
+ newsel = t
+ end
+ t = t + 1
+ end
+
+ local direction
+ local splits = { X = wx.wxRIGHT, Y = wx.wxBOTTOM }
+ for cmd in str:gmatch("([^|]+)") do
+ local instr = cmd:match("<(%w)>")
+ if (not instr) then
+ local id = fnIdConvert and fnIdConvert(cmd) or cmd
+ local pageind = next(currentpages[id] or {})
+ if (pageind) then
+ local page = currentpages[id][pageind]
+ currentpages[id][pageind] = nil
+
+ nb:AddPage(page.page, page.text)
+ if (direction) then nb:Split(t, direction) end
+ finishPage(page)
+ end
+ end
+ direction = instr and splits[instr]
+ end
+
+ -- add anything we forgot; make sure page groups are in the order specified
+ for i=1,cnt do
+ local pagelist = currentpages[order[i]]
+ for _,page in pairs(pagelist) do
+ nb:AddPage(page.page, page.text)
+ finishPage(page)
+ end
+ end
+
+ -- set the active page as it was before
+ if (newsel) then nb:SetSelection(newsel) end
+end
+
+function SettingsRestoreView()
+ local listname = "/view"
+ local path = settings:GetPath()
+ settings:SetPath(listname)
+
+ local frame = ide.frame
+ local uimgr = frame.uimgr
+
+ local layoutcur = uimgr:SavePerspective()
+ local layout = settingsReadSafe(settings,layoutlabel.UIMANAGER,"")
+ if (layout ~= layoutcur) then
+ -- save the current toolbar besth and re-apply after perspective is loaded
+ -- bestw and besth has two separate issues:
+ -- (1) layout includes bestw that is only as wide as the toolbar size,
+ -- this leaves default background on the right side of the toolbar;
+ -- fix it by explicitly replacing with the screen width.
+ -- (2) besth may be wrong after icon size changes.
+ local toolbar = frame.uimgr:GetPane("toolbar")
+ local besth = toolbar:IsOk() and tonumber(uimgr:SavePaneInfo(toolbar):match("besth=([^;]+)"))
+
+ -- reload the perspective if the saved one is not empty as it's different from the default
+ if #layout > 0 then uimgr:LoadPerspective(layout, false) end
+
+ local screenw = frame:GetClientSize():GetWidth()
+ if toolbar:IsOk() and screenw > 0 then toolbar:BestSize(screenw, besth or -1) end
+
+ -- check if debugging panes are not mentioned and float them
+ for _, name in pairs({"stackpanel", "watchpanel"}) do
+ local pane = frame.uimgr:GetPane(name)
+ if pane:IsOk() and not layout:find(name) then pane:Float() end
+ end
+
+ -- check if the toolbar is not mentioned in the layout and show it
+ for _, name in pairs({"toolbar"}) do
+ local pane = frame.uimgr:GetPane(name)
+ if pane:IsOk() and not layout:find(name) then pane:Show() end
+ end
+
+ -- remove captions from all panes
+ local panes = frame.uimgr:GetAllPanes()
+ for index = 0, panes:GetCount()-1 do
+ uimgr:GetPane(panes:Item(index).name):CaptionVisible(false)
+ end
+ end
+
+ frame:GetStatusBar():Show(settingsReadSafe(settings,layoutlabel.STATUSBAR,true))
+
+ uimgr:Update()
+
+ layoutcur = saveNotebook(ide:GetOutputNotebook())
+ layout = settingsReadSafe(settings,layoutlabel.NOTEBOOKOUTPUT,layoutcur)
+ if (layout ~= layoutcur) then
+ loadNotebook(ide:GetOutputNotebook(),layout,
+ -- treat "Output (running)" same as "Output"
+ function(name) return
+ name:match(TR("Output")) or name:match("Output") or name end)
+ end
+
+ layoutcur = saveNotebook(ide:GetProjectNotebook())
+ layout = settingsReadSafe(settings,layoutlabel.NOTEBOOKPROJECT,layoutcur)
+ if (layout ~= layoutcur) then
+ loadNotebook(ide:GetProjectNotebook(),layout)
+ end
+
+ -- always select Output tab
+ local bottomnotebook = ide:GetOutputNotebook()
+ local index = bottomnotebook:GetPageIndex(bottomnotebook.errorlog)
+ if index >= 0 then bottomnotebook:SetSelection(index) end
+
+ layoutcur = saveNotebook(frame.notebook)
+ layout = settingsReadSafe(settings,layoutlabel.NOTEBOOK,layoutcur)
+ if (layout ~= layoutcur) then
+ loadNotebook(ide.frame.notebook,layout)
+ local openDocuments = ide.openDocuments
+ local nb = frame.notebook
+ local cnt = nb:GetPageCount()
+ for i=0,cnt-1 do
+ openDocuments[nb:GetPage(i):GetId()].index = i
+ end
+ end
+
+ -- restore configuration for notebook pages that have been split;
+ -- load saved dock_size values and update current values with saved ones
+ -- where dock_size configuration matches
+ for l, m in pairs({
+ [layoutlabel.DOCKNOTEBOOK] = ide:GetEditorNotebook():GetAuiManager(),
+ [layoutlabel.DOCKNOTEBOOKOUTPUT] = ide:GetOutputNotebook():GetAuiManager(),
+ [layoutlabel.DOCKNOTEBOOKPROJECT] = ide:GetProjectNotebook():GetAuiManager(),
+ }) do
+ -- ...|dock_size(5,0,0)=20|dock_size(2,1,0)=200|...
+ local prevlayout = settingsReadSafe(settings, l, "")
+ local curlayout = m:SavePerspective()
+ local newlayout = curlayout:gsub('(dock_size[^=]+=)(%d+)', function(t,v)
+ local val = prevlayout:match(EscapeMagic(t)..'(%d+)')
+ return t..(val or v)
+ end)
+ if newlayout ~= curlayout then m:LoadPerspective(newlayout) end
+ end
+
+ local editor = GetEditor()
+ if editor then editor:SetFocus() end
+
+ settings:SetPath(path)
+end
+
+function SettingsSaveView()
+ local listname = "/view"
+ local path = settings:GetPath()
+ settings:DeleteGroup(listname)
+ settings:SetPath(listname)
+
+ local frame = ide.frame
+ local uimgr = frame.uimgr
+
+ settings:Write(layoutlabel.UIMANAGER, uimgr:SavePerspective())
+ settings:Write(layoutlabel.NOTEBOOK, saveNotebook(ide:GetEditorNotebook()))
+ settings:Write(layoutlabel.NOTEBOOKOUTPUT, saveNotebook(ide:GetOutputNotebook()))
+ settings:Write(layoutlabel.NOTEBOOKPROJECT, saveNotebook(ide:GetProjectNotebook()))
+ settings:Write(layoutlabel.DOCKNOTEBOOK, ide:GetEditorNotebook():GetAuiManager():SavePerspective())
+ settings:Write(layoutlabel.DOCKNOTEBOOKOUTPUT, ide:GetOutputNotebook():GetAuiManager():SavePerspective())
+ settings:Write(layoutlabel.DOCKNOTEBOOKPROJECT, ide:GetProjectNotebook():GetAuiManager():SavePerspective())
+ settings:Write(layoutlabel.STATUSBAR, frame:GetStatusBar():IsShown())
+
+ settings:SetPath(path)
+end
+
+function SettingsRestoreEditorSettings()
+ local listname = "/editor"
+ local path = settings:GetPath()
+ settings:SetPath(listname)
+
+ local interpreter = settingsReadSafe(settings, "interpreter",
+ ide.config.interpreter or ide.config.default.interpreter)
+ ProjectSetInterpreter(interpreter)
+
+ settings:SetPath(path)
+end
+
+function SettingsSaveEditorSettings()
+ local listname = "/editor"
+ local path = settings:GetPath()
+ settings:DeleteGroup(listname)
+ settings:SetPath(listname)
+
+ settings:Write("interpreter", ide.interpreter and ide.interpreter.fname or ide.config.default.interpreter)
+
+ settings:SetPath(path)
+end
+
+function SettingsSaveAll()
+ SettingsSaveFileSession(GetOpenFiles())
+ SettingsSaveEditorSettings()
+ SettingsSaveProjectSession(FileTreeGetProjects())
+ SettingsSaveFileHistory(GetFileHistory())
+ SettingsSaveView()
+ SettingsSaveFramePosition(ide.frame, "MainFrame")
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/shellbox.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/shellbox.lua
new file mode 100644
index 0000000..f3fd52b
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/shellbox.lua
@@ -0,0 +1,574 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+local unpack = table.unpack or unpack
+
+local bottomnotebook = ide.frame.bottomnotebook
+local out = bottomnotebook.shellbox
+local remotesend
+
+local PROMPT_MARKER = StylesGetMarker("prompt")
+local PROMPT_MARKER_VALUE = 2^PROMPT_MARKER
+local ERROR_MARKER = StylesGetMarker("error")
+local OUTPUT_MARKER = StylesGetMarker("output")
+local MESSAGE_MARKER = StylesGetMarker("message")
+local ANY_MARKER_VALUE = 2^25-1 -- marker numbers 0 to 24 have no pre-defined function
+
+out:SetFont(ide.font.oNormal)
+out:StyleSetFont(wxstc.wxSTC_STYLE_DEFAULT, ide.font.oNormal)
+out:SetBufferedDraw(not ide.config.hidpi and true or false)
+out:StyleClearAll()
+
+out:SetTabWidth(ide.config.editor.tabwidth or 2)
+out:SetIndent(ide.config.editor.tabwidth or 2)
+out:SetUseTabs(ide.config.editor.usetabs and true or false)
+out:SetViewWhiteSpace(ide.config.editor.whitespace and true or false)
+out:SetIndentationGuides(true)
+
+out:SetWrapMode(wxstc.wxSTC_WRAP_WORD)
+out:SetWrapStartIndent(0)
+out:SetWrapVisualFlagsLocation(wxstc.wxSTC_WRAPVISUALFLAGLOC_END_BY_TEXT)
+out:SetWrapVisualFlags(wxstc.wxSTC_WRAPVISUALFLAG_END)
+
+out:MarkerDefine(StylesGetMarker("prompt"))
+out:MarkerDefine(StylesGetMarker("error"))
+out:MarkerDefine(StylesGetMarker("output"))
+out:MarkerDefine(StylesGetMarker("message"))
+out:SetReadOnly(false)
+
+SetupKeywords(out,"lua",nil,ide.config.stylesoutshell,ide.font.oNormal,ide.font.oItalic)
+
+local function getPromptLine()
+ local totalLines = out:GetLineCount()
+ return out:MarkerPrevious(totalLines+1, PROMPT_MARKER_VALUE)
+end
+
+local function getPromptText()
+ local prompt = getPromptLine()
+ return out:GetTextRangeDyn(out:PositionFromLine(prompt), out:GetLength())
+end
+
+local function setPromptText(text)
+ local length = out:GetLength()
+ out:SetSelectionStart(length - string.len(getPromptText()))
+ out:SetSelectionEnd(length)
+ out:ClearAny()
+ out:AddTextDyn(text)
+ -- refresh the output window to force recalculation of wrapped lines;
+ -- otherwise a wrapped part of the last line may not be visible.
+ out:Update(); out:Refresh()
+ out:GotoPos(out:GetLength())
+end
+
+local function positionInLine(line)
+ return out:GetCurrentPos() - out:PositionFromLine(line)
+end
+
+local function caretOnPromptLine(disallowLeftmost, line)
+ local promptLine = getPromptLine()
+ local currentLine = line or out:GetCurrentLine()
+ local boundary = disallowLeftmost and 0 or -1
+ return (currentLine > promptLine
+ or currentLine == promptLine and positionInLine(promptLine) > boundary)
+end
+
+local function chomp(line) return (line:gsub("%s+$", "")) end
+
+local function getInput(line)
+ local nextMarker = line
+ local count = out:GetLineCount()
+
+ repeat -- check until we find at least some marker
+ nextMarker = nextMarker+1
+ until out:MarkerGet(nextMarker) > 0 or nextMarker > count-1
+ return chomp(out:GetTextRangeDyn(
+ out:PositionFromLine(line), out:PositionFromLine(nextMarker)))
+end
+
+function ConsoleSelectCommand(point)
+ local cpos = out:ScreenToClient(point or wx.wxGetMousePosition())
+ local position = out:PositionFromPoint(cpos)
+ if position == wxstc.wxSTC_INVALID_POSITION then return end
+
+ local promptline = out:MarkerPrevious(out:LineFromPosition(position), PROMPT_MARKER_VALUE)
+ if promptline == wxstc.wxSTC_INVALID_POSITION then return end
+ local nextline = out:MarkerNext(promptline+1, ANY_MARKER_VALUE)
+ local epos = nextline ~= wxstc.wxSTC_INVALID_POSITION and out:PositionFromLine(nextline) or out:GetLength()
+ out:SetSelection(out:PositionFromLine(promptline), epos)
+ return true
+end
+
+local currentHistory
+local function getNextHistoryLine(forward, promptText)
+ local count = out:GetLineCount()
+ if currentHistory == nil then currentHistory = count end
+
+ if forward then
+ currentHistory = out:MarkerNext(currentHistory+1, PROMPT_MARKER_VALUE)
+ if currentHistory == -1 then
+ currentHistory = count
+ return ""
+ end
+ else
+ currentHistory = out:MarkerPrevious(currentHistory-1, PROMPT_MARKER_VALUE)
+ if currentHistory == -1 then
+ return ""
+ end
+ end
+ -- need to skip the current prompt line
+ -- or skip repeated commands
+ if currentHistory == getPromptLine()
+ or getInput(currentHistory) == promptText then
+ return getNextHistoryLine(forward, promptText)
+ end
+ return getInput(currentHistory)
+end
+
+local function getNextHistoryMatch(promptText)
+ local count = out:GetLineCount()
+ if currentHistory == nil then currentHistory = count end
+
+ local current = currentHistory
+ while true do
+ currentHistory = out:MarkerPrevious(currentHistory-1, PROMPT_MARKER_VALUE)
+ if currentHistory == -1 then -- restart search from the last item
+ currentHistory = count
+ elseif currentHistory ~= getPromptLine() then -- skip current prompt
+ local input = getInput(currentHistory)
+ if input:find(promptText, 1, true) == 1 then return input end
+ end
+ -- couldn't find anything and made a loop; get out
+ if currentHistory == current then return end
+ end
+
+ assert(false, "getNextHistoryMatch coudn't find a proper match")
+end
+
+local function shellPrint(marker, ...)
+ local cnt = select('#',...)
+ if cnt == 0 then return end -- return if nothing to print
+
+ local isPrompt = marker and (getPromptLine() > -1)
+
+ local text = ''
+ for i=1,cnt do
+ local x = select(i,...)
+ text = text .. tostring(x)..(i < cnt and "\t" or "")
+ end
+
+ -- split the text into smaller chunks as one large line
+ -- is difficult to handle for the editor
+ local prev, maxlength = 0, ide.config.debugger.maxdatalength
+ if #text > maxlength and not text:find("\n.") then
+ text = text:gsub("()(%s+)", function(p, s)
+ if p-prev >= maxlength then
+ prev = p
+ return "\n"
+ else
+ return s
+ end
+ end)
+ end
+
+ -- add "\n" if it is missing
+ text = text:gsub("\n+$", "") .. "\n"
+
+ local lines = out:GetLineCount()
+ local promptLine = isPrompt and getPromptLine() or nil
+ local insertLineAt = isPrompt and getPromptLine() or out:GetLineCount()-1
+ local insertAt = isPrompt and out:PositionFromLine(getPromptLine()) or out:GetLength()
+ out:InsertTextDyn(insertAt, out.useraw and text or FixUTF8(text, function (s) return '\\'..string.byte(s) end))
+ local linesAdded = out:GetLineCount() - lines
+
+ if marker then
+ if promptLine then out:MarkerDelete(promptLine, PROMPT_MARKER) end
+ for line = insertLineAt, insertLineAt + linesAdded - 1 do
+ out:MarkerAdd(line, marker)
+ end
+ if promptLine then out:MarkerAdd(promptLine+linesAdded, PROMPT_MARKER) end
+ end
+
+ out:EmptyUndoBuffer() -- don't allow the user to undo shell text
+ out:GotoPos(out:GetLength())
+ out:EnsureVisibleEnforcePolicy(out:GetLineCount()-1)
+end
+
+DisplayShell = function (...)
+ shellPrint(OUTPUT_MARKER, ...)
+end
+DisplayShellErr = function (...)
+ shellPrint(ERROR_MARKER, ...)
+end
+DisplayShellMsg = function (...)
+ shellPrint(MESSAGE_MARKER, ...)
+end
+DisplayShellDirect = function (...)
+ shellPrint(nil, ...)
+end
+DisplayShellPrompt = function (...)
+ -- don't print anything; just mark the line with a prompt mark
+ out:MarkerAdd(out:GetLineCount()-1, PROMPT_MARKER)
+end
+
+local function filterTraceError(err, addedret)
+ local err = err:match("(.-:%d+:.-)\n[^\n]*\n[^\n]*\n[^\n]*src/editor/shellbox.lua:.*in function 'executeShellCode'")
+ or err
+ err = err:gsub("stack traceback:.-\n[^\n]+\n?","")
+ if addedret then err = err:gsub('^%[string "return ', '[string "') end
+ err = err:match("(.*)\n[^\n]*%(tail call%): %?$") or err
+ return err
+end
+
+local function createenv ()
+ local env = {}
+ setmetatable(env,{__index = _G})
+
+ local function luafilename(level)
+ level = level and level + 1 or 2
+ local src
+ while (true) do
+ src = debug.getinfo(level)
+ if (src == nil) then return nil,level end
+ if (string.byte(src.source) == string.byte("@")) then
+ return string.sub(src.source,2),level
+ end
+ level = level + 1
+ end
+ end
+
+ local function luafilepath(level)
+ local src,level = luafilename(level)
+ if (src == nil) then return src,level end
+ src = string.gsub(src,"[\\/][^\\//]*$","")
+ return src,level
+ end
+
+ local function relativeFilename(file)
+ assert(type(file)=='string',"String as filename expected")
+ local name = file
+ local level = 3
+ while (name) do
+ if (wx.wxFileName(name):FileExists()) then return name end
+ name,level = luafilepath(level)
+ if (name == nil) then break end
+ name = name .. "/" .. file
+ end
+
+ return file
+ end
+
+ local function relativeFilepath(file)
+ local name = luafilepath(3)
+ return (file and name) and name.."/"..file or file or name
+ end
+
+ local _loadfile = loadfile
+ local function loadfile(file)
+ assert(type(file)=='string',"String as filename expected")
+ local name = relativeFilename(file)
+
+ return _loadfile(name)
+ end
+
+ local function dofile(file, ...)
+ assert(type(file) == 'string',"String as filename expected")
+ local fn,err = loadfile(file)
+ local args = {...}
+ if not fn then
+ DisplayShellErr(err)
+ else
+ setfenv(fn,env)
+ return fn(unpack(args))
+ end
+ end
+
+ local os = { exit = function()
+ ide.frame:AddPendingEvent(wx.wxCommandEvent(
+ wx.wxEVT_COMMAND_MENU_SELECTED, ID_EXIT))
+ end }
+ env.os = setmetatable(os, {__index = _G.os})
+ env.print = DisplayShell
+ env.dofile = dofile
+ env.loadfile = loadfile
+ env.RELFILE = relativeFilename
+ env.RELPATH = relativeFilepath
+
+ return env
+end
+
+local env = createenv()
+
+function ShellSetAlias(alias, table)
+ local value = env[alias]
+ env[alias] = table
+ return value
+end
+
+local function packResults(status, ...) return status, {...} end
+
+local function executeShellCode(tx)
+ if tx == nil or tx == '' then return end
+
+ local forcelocalprefix = '^!'
+ local forcelocal = tx:find(forcelocalprefix)
+ tx = tx:gsub(forcelocalprefix, '')
+
+ DisplayShellPrompt('')
+
+ -- try to compile as statement
+ local _, err = loadstring(tx)
+ local isstatement = not err
+
+ if remotesend and not forcelocal then remotesend(tx, isstatement); return end
+
+ local addedret, forceexpression = true, tx:match("^%s*=%s*")
+ tx = tx:gsub("^%s*=%s*","")
+ local fn
+ fn, err = loadstring("return "..tx)
+ if not forceexpression and err then
+ fn, err = loadstring(tx)
+ addedret = false
+ end
+
+ if fn == nil and err then
+ DisplayShellErr(filterTraceError(err, addedret))
+ elseif fn then
+ setfenv(fn,env)
+
+ -- set the project dir as the current dir to allow "require" calls
+ -- to work from shell
+ local projectDir, cwd = FileTreeGetDir(), nil
+ if projectDir and #projectDir > 0 then
+ cwd = wx.wxFileName.GetCwd()
+ wx.wxFileName.SetCwd(projectDir)
+ end
+
+ local ok, res = packResults(xpcall(fn,
+ function(err)
+ DisplayShellErr(filterTraceError(debug.traceback(err), addedret))
+ end))
+
+ -- restore the current dir
+ if cwd then wx.wxFileName.SetCwd(cwd) end
+
+ if ok and (addedret or #res > 0) then
+ if addedret then
+ local mobdebug = require "mobdebug"
+ for i,v in pairs(res) do -- stringify each of the returned values
+ res[i] = (forceexpression and i > 1 and '\n' or '') ..
+ mobdebug.line(v, {nocode = true, comment = 1,
+ -- if '=' is used, then use multi-line serialized output
+ indent = forceexpression and ' ' or nil})
+ end
+ -- add nil only if we are forced (using =) or if this is not a statement
+ -- this is needed to print 'nil' when asked for 'foo',
+ -- and don't print it when asked for 'print(1)'
+ if #res == 0 and (forceexpression or not isstatement) then
+ res = {'nil'}
+ end
+ end
+ DisplayShell(unpack(res))
+ end
+ end
+end
+
+function ShellSupportRemote(client)
+ remotesend = client
+
+ local index = bottomnotebook:GetPageIndex(out)
+ if index then
+ bottomnotebook:SetPageText(index,
+ client and TR("Remote console") or TR("Local console"))
+ end
+end
+
+function ShellExecuteFile(wfilename)
+ if (not wfilename) then return end
+ local cmd = 'dofile([['..wfilename:GetFullPath()..']])'
+ ShellExecuteCode(cmd)
+end
+
+ShellExecuteInline = executeShellCode
+function ShellExecuteCode(code)
+ local index = bottomnotebook:GetPageIndex(bottomnotebook.shellbox)
+ if ide.config.activateoutput and bottomnotebook:GetSelection() ~= index then
+ bottomnotebook:SetSelection(index)
+ end
+
+ DisplayShellDirect(code)
+ executeShellCode(code)
+end
+
+local function displayShellIntro()
+ DisplayShellMsg(TR("Welcome to the interactive Lua interpreter.").." "
+ ..TR("Enter Lua code and press Enter to run it.").."\n"
+ ..TR("Use Shift-Enter for multiline code.").." "
+ ..TR("Use 'clear' to clear the shell output and the history.").."\n"
+ ..TR("Prepend '=' to show complex values on multiple lines.").." "
+ ..TR("Prepend '!' to force local execution."))
+ DisplayShellPrompt('')
+end
+
+out:Connect(wx.wxEVT_KEY_DOWN,
+ function (event)
+ -- this loop is only needed to allow to get to the end of function easily
+ -- "return" aborts the processing and ignores the key
+ -- "break" aborts the processing and processes the key normally
+ while true do
+ local key = event:GetKeyCode()
+ if key == wx.WXK_UP or key == wx.WXK_NUMPAD_UP then
+ -- if we are below the prompt line, then allow to go up
+ -- through multiline entry
+ if out:GetCurrentLine() > getPromptLine() then break end
+
+ -- if we are not on the caret line, move normally
+ if not caretOnPromptLine() then break end
+
+ local promptText = getPromptText()
+ setPromptText(getNextHistoryLine(false, promptText))
+ return
+ elseif key == wx.WXK_DOWN or key == wx.WXK_NUMPAD_DOWN then
+ -- if we are above the last line, then allow to go down
+ -- through multiline entry
+ local totalLines = out:GetLineCount()-1
+ if out:GetCurrentLine() < totalLines then break end
+
+ -- if we are not on the caret line, move normally
+ if not caretOnPromptLine() then break end
+
+ local promptText = getPromptText()
+ setPromptText(getNextHistoryLine(true, promptText))
+ return
+ elseif key == wx.WXK_TAB then
+ -- if we are above the prompt line, then don't move
+ local promptline = getPromptLine()
+ if out:GetCurrentLine() < promptline then return end
+
+ local promptText = getPromptText()
+ -- save the position in the prompt text to restore
+ local pos = out:GetCurrentPos()
+ local text = promptText:sub(1, positionInLine(promptline))
+ if #text == 0 then return end
+
+ -- find the next match and set the prompt text
+ local match = getNextHistoryMatch(text)
+ if match then
+ setPromptText(match)
+ -- restore the position to make it easier to find the next match
+ out:GotoPos(pos)
+ end
+ return
+ elseif key == wx.WXK_ESCAPE then
+ setPromptText("")
+ return
+ elseif key == wx.WXK_BACK then
+ if not caretOnPromptLine(true) then return end
+ elseif key == wx.WXK_DELETE or key == wx.WXK_NUMPAD_DELETE then
+ if not caretOnPromptLine()
+ or out:LineFromPosition(out:GetSelectionStart()) < getPromptLine() then
+ return
+ end
+ elseif key == wx.WXK_PAGEUP or key == wx.WXK_NUMPAD_PAGEUP
+ or key == wx.WXK_PAGEDOWN or key == wx.WXK_NUMPAD_PAGEDOWN
+ or key == wx.WXK_END or key == wx.WXK_NUMPAD_END
+ or key == wx.WXK_HOME or key == wx.WXK_NUMPAD_HOME
+ or key == wx.WXK_LEFT or key == wx.WXK_NUMPAD_LEFT
+ or key == wx.WXK_RIGHT or key == wx.WXK_NUMPAD_RIGHT
+ or key == wx.WXK_SHIFT or key == wx.WXK_CONTROL
+ or key == wx.WXK_ALT then
+ break
+ elseif key == wx.WXK_RETURN or key == wx.WXK_NUMPAD_ENTER then
+ if not caretOnPromptLine()
+ or out:LineFromPosition(out:GetSelectionStart()) < getPromptLine() then
+ return
+ end
+
+ -- allow multiline entry for shift+enter
+ if caretOnPromptLine(true) and event:ShiftDown() then break end
+
+ local promptText = getPromptText()
+ if #promptText == 0 then return end -- nothing to execute, exit
+ if promptText == 'clear' then
+ out:Erase()
+ else
+ DisplayShellDirect('\n')
+ executeShellCode(promptText)
+ end
+ currentHistory = getPromptLine() -- reset history
+ return -- don't need to do anything else with return
+ else
+ -- move cursor to end if not already there
+ if not caretOnPromptLine() then
+ out:GotoPos(out:GetLength())
+ -- check if the selection starts before the prompt line and reset it
+ elseif out:LineFromPosition(out:GetSelectionStart()) < getPromptLine() then
+ out:GotoPos(out:GetLength())
+ out:SetSelection(out:GetSelectionEnd()+1,out:GetSelectionEnd())
+ end
+ end
+ break
+ end
+ event:Skip()
+ end)
+
+local function inputEditable(line)
+ return caretOnPromptLine(false, line) and
+ not (out:LineFromPosition(out:GetSelectionStart()) < getPromptLine())
+end
+
+-- new Scintilla (3.2.1) changed the way markers move when the text is updated
+-- ticket: http://sourceforge.net/p/scintilla/bugs/939/
+-- discussion: https://groups.google.com/forum/?hl=en&fromgroups#!topic/scintilla-interest/4giFiKG4VXo
+if ide.wxver >= "2.9.5" then
+ -- this is a workaround that stores a position of the last prompt marker
+ -- before insert and restores the same position after (as the marker)
+ -- could have moved if the text is added at the beginning of the line.
+ local promptAt
+ out:Connect(wxstc.wxEVT_STC_MODIFIED,
+ function (event)
+ local evtype = event:GetModificationType()
+ if bit.band(evtype, wxstc.wxSTC_MOD_BEFOREINSERT) ~= 0 then
+ local promptLine = getPromptLine()
+ if promptLine and event:GetPosition() == out:PositionFromLine(promptLine)
+ then promptAt = promptLine end
+ end
+ if bit.band(evtype, wxstc.wxSTC_MOD_INSERTTEXT) ~= 0 then
+ local promptLine = getPromptLine()
+ if promptLine and promptAt then
+ out:MarkerDelete(promptLine, PROMPT_MARKER)
+ out:MarkerAdd(promptAt, PROMPT_MARKER)
+ promptAt = nil
+ end
+ end
+ end)
+end
+
+out:Connect(wxstc.wxEVT_STC_UPDATEUI,
+ function (event) out:SetReadOnly(not inputEditable()) end)
+
+-- only allow copy/move text by dropping to the input line
+out:Connect(wxstc.wxEVT_STC_DO_DROP,
+ function (event)
+ if not inputEditable(out:LineFromPosition(event:GetPosition())) then
+ event:SetDragResult(wx.wxDragNone)
+ end
+ end)
+
+if ide.config.outputshell.nomousezoom then
+ -- disable zoom using mouse wheel as it triggers zooming when scrolling
+ -- on OSX with kinetic scroll and then pressing CMD.
+ out:Connect(wx.wxEVT_MOUSEWHEEL,
+ function (event)
+ if wx.wxGetKeyState(wx.WXK_CONTROL) then return end
+ event:Skip()
+ end)
+end
+
+displayShellIntro()
+
+function out:Erase()
+ self:ClearAll()
+ displayShellIntro()
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/singleinstance.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/singleinstance.lua
new file mode 100644
index 0000000..450cb6f
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/singleinstance.lua
@@ -0,0 +1,98 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+--[[ single instance
+open an UDP port - if it fails it is either because
+- IDE is running already
+- an application is already blocking that port
+if it fails it tries to contact the running application
+- if it confirms being the IDE we let that instance open it, finish our application
+- otherwise we throw an error message on the user and start like normal
+
+probably a pitfal: an instance is running but is not visible
+ (because it was finished though the UDP thing still runs)
+]]
+
+if not ide.config.singleinstance then return end
+
+local socket = require "socket"
+local port = ide.config.singleinstanceport
+local delay = tonumber(ide.config.singleinstance) or 1000 -- in ms
+local svr = socket.udp()
+local success = svr:setsockname("127.0.0.1",port) -- bind on local host
+local protocol = {client = {}, server = {}}
+
+protocol.client.greeting = "Is this you, my IDE? It's me, a new instance."
+protocol.server.greeting = "Yes it is me, running as: %s"
+protocol.client.requestloading = "Could you please load this file for me: %s"
+protocol.server.answerok = "Sure. You may now leave."
+
+if success then -- ok, server was started, we are solo
+ --TODO: if multiple files are to be opened, each file is handled one by one - we could create a single string instead...
+ ide.idletimer = wx.wxTimer(wx.wxGetApp())
+ ide.idletimer:Start(delay,false)
+ svr:settimeout(0) -- don't block
+ wx.wxGetApp():Connect(wx.wxEVT_TIMER, function()
+ if ide.exitingProgram then -- if exiting, terminate the timer loop
+ wx.wxGetApp():Disconnect(wx.wxEVT_TIMER)
+ return
+ end
+
+ local msg, ip, port = svr:receivefrom()
+ if msg then
+ if msg == protocol.client.greeting then
+ svr:sendto(protocol.server.greeting:format(wx.wxGetUserName()),ip,port)
+ elseif msg:match(protocol.client.requestloading:gsub("%%s",".+$")) then -- ok we need to open something
+ svr:sendto(protocol.server.answerok,ip,port)
+ local filename = msg:match(protocol.client.requestloading:gsub("%%s","(.+)$"))
+ if filename then
+ RequestAttention()
+ if wx.wxDirExists(filename) then
+ ProjectUpdateProjectDir(filename)
+ elseif not ActivateFile(filename) then
+ DisplayOutputLn(TR("Can't open file '%s': %s"):format(filename, wx.wxSysErrorMsg()))
+ end
+ end
+ end
+ end
+ end)
+else -- something different is running on our port
+ local cln = socket.udp()
+ cln:setpeername("127.0.0.1",port)
+ cln:settimeout(2)
+ cln:send(protocol.client.greeting)
+
+ local msg = cln:receive()
+ local arg = ide.arg
+ if msg and msg:match(protocol.server.greeting:gsub("%%s",".+$")) then
+ local username = msg:match(protocol.server.greeting:gsub("%%s","(.+)$"))
+ if username ~= wx.wxGetUserName() then
+ print(("Another instance is running under user '%s' and can't be activated. This instance will continue running, which may cause interference with the debugger."):format(username))
+ else
+ local failed = false
+ for index = 2, #arg do
+ local fileName = arg[index]
+ if fileName ~= "--"
+ -- on OSX, the command line includes -psn parameter, so ignore it
+ and (ide.osname ~= 'Macintosh' or not fileName:find("^-psn")) then
+ cln:send(protocol.client.requestloading:format(fileName))
+
+ local msg, err = cln:receive()
+ if msg ~= protocol.server.answerok then
+ failed = true
+ print(err,msg)
+ end
+ end
+ end
+ if failed then
+ print("The server instance failed to open the files, this instance will continue running.")
+ else -- done
+ os.exit(0)
+ end
+ end
+ else
+ print("The single instance communication has failed; there may be another instance running, which may cause interference with the debugger.")
+ end
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/style.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/style.lua
new file mode 100644
index 0000000..077fa41
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/style.lua
@@ -0,0 +1,441 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+----------
+-- Style
+--
+-- common style attributes
+-- ---------------------------
+-- fg foreground - {r,g,b} 0-255
+-- bg background - {r,g,b} 0-255
+-- alpha translucency - 0-255 (0 - transparent, 255 - opaque, 256 - opaque/faster)
+-- sel color of the selected block - {r,g,b} 0-255 (only applies to folds)
+-- u underline - boolean
+-- b bold - boolean
+-- i italic - boolean
+-- fill fill to end - boolean
+-- fn font Face Name - string ("Lucida Console")
+-- fs font size - number (11)
+-- hs turn hotspot on - true or {r,g,b} 0-255
+-- v visibility for symbols of the current style - boolean
+
+local unpack = table.unpack or unpack
+
+function StylesGetDefault()
+ return {
+ -- lexer specific (inherit fg/bg from text)
+ lexerdef = {fg = {160, 160, 160}},
+ comment = {fg = {128, 128, 128}},
+ stringtxt = {fg = {128, 32, 16}},
+ stringeol = {fg = {128, 32, 16}, bg = {224, 192, 224}, fill = true},
+ preprocessor = {fg = {128, 128, 0}},
+ operator = {fg = {64, 64, 64}},
+ number = {fg = {80, 112, 255}},
+
+ keywords0 = {fg = {32, 32, 192}},
+ keywords1 = {fg = {127, 32, 96}},
+ keywords2 = {fg = {32, 127, 96}},
+ keywords3 = {fg = {64, 32, 96}},
+ keywords4 = {fg = {127, 0, 95}},
+ keywords5 = {fg = {35, 95, 175}},
+ keywords6 = {fg = {0, 127, 127}},
+ keywords7 = {fg = {240, 255, 255}},
+
+ -- common (inherit fg/bg from text)
+ text = {fg = {64, 64, 64}, bg = {250, 250, 250}},
+ linenumber = {fg = {128, 128, 128}, bg = {250, 250, 250}},
+ bracematch = {fg = {32, 128, 255}, b = true},
+ bracemiss = {fg = {255, 128, 32}, b = true},
+ ctrlchar = nil,
+ indent = {fg = {192, 192, 230}, bg = {255, 255, 255}},
+ calltip = nil,
+
+ -- common special (need custom fg & bg)
+ sel = {bg = {208, 208, 208}},
+ caret = {fg = {0, 0, 0}},
+ caretlinebg = {bg = {240, 240, 230}},
+ fold = {fg = {192, 192, 192}, bg = {250, 250, 250}, sel = {160, 128, 224}},
+ whitespace = nil,
+ edge = {},
+
+ -- deprecated; allowed for backward compatibility in case someone does
+ -- fncall.fg = {...}
+ fncall = {},
+
+ -- markup
+ ['|'] = {fg = {127, 0, 127}},
+ ['`'] = {fg = {64, 128, 64}},
+ ['['] = {hs = {32, 32, 127}},
+
+ -- markers
+ marker = {
+ currentline = {},
+ breakpoint = {},
+ message = {},
+ output = {},
+ prompt = {},
+ error = {},
+ searchmatchfile = {},
+ },
+
+ -- indicators
+ indicator = {
+ fncall = {},
+ varlocal = {},
+ varglobal = {},
+ varmasking = {},
+ varmasked = {},
+ searchmatch = {},
+ },
+ }
+end
+
+local markers = {
+ breakpoint = {0, wxstc.wxSTC_MARK_CIRCLE, wx.wxColour(196, 64, 64), wx.wxColour(220, 64, 64)},
+ bookmark = {1, wxstc.wxSTC_MARK_SHORTARROW, wx.wxColour(16, 96, 128), wx.wxColour(96, 160, 220)},
+ currentline = {2, wxstc.wxSTC_MARK_ARROW, wx.wxColour(16, 128, 16), wx.wxColour(64, 220, 64)},
+ message = {3, wxstc.wxSTC_MARK_CHARACTER+(' '):byte(), wx.wxBLACK, wx.wxColour(220, 220, 220)},
+ output = {4, wxstc.wxSTC_MARK_BACKGROUND, wx.wxBLACK, wx.wxColour(240, 240, 240)},
+ prompt = {5, wxstc.wxSTC_MARK_ARROWS, wx.wxBLACK, wx.wxColour(220, 220, 220)},
+ error = {6, wxstc.wxSTC_MARK_BACKGROUND, wx.wxBLACK, wx.wxColour(255, 220, 220)},
+ searchmatchfile = {7, wxstc.wxSTC_MARK_EMPTY, wx.wxBLACK, wx.wxColour(196, 0, 0)},
+}
+function StylesGetMarker(marker) return unpack(markers[marker] or {}) end
+function StylesRemoveMarker(marker) markers[marker] = nil end
+function StylesAddMarker(marker, ch, fg, bg)
+ local num = (markers[marker] or {})[1]
+ if not num then -- new marker; find the smallest available marker number
+ local nums = {}
+ for _, mark in pairs(markers) do nums[mark[1]] = true end
+ num = #nums + 1
+ if num > 24 then return end -- 24 markers with no pre-defined functions
+ end
+ markers[marker] = {num, ch, wx.wxColour(unpack(fg)), wx.wxColour(unpack(bg))}
+ return num
+end
+
+local function applymarker(editor,marker,clrfg,clrbg,clrsel)
+ if (clrfg) then editor:MarkerSetForeground(marker,clrfg) end
+ if (clrbg) then editor:MarkerSetBackground(marker,clrbg) end
+ if (ide.wxver >= "2.9.5" and clrsel) then editor:MarkerSetBackgroundSelected(marker,clrsel) end
+end
+local specialmapping = {
+ sel = function(editor,style)
+ if (style.fg) then
+ editor:SetSelForeground(1,wx.wxColour(unpack(style.fg)))
+ else
+ editor:SetSelForeground(0,wx.wxWHITE)
+ end
+ if (style.bg) then
+ editor:SetSelBackground(1,wx.wxColour(unpack(style.bg)))
+ else
+ editor:SetSelBackground(0,wx.wxWHITE)
+ end
+ if (style.alpha and ide.wxver >= "2.9.5") then
+ editor:SetSelAlpha(style.alpha)
+ end
+
+ -- set alpha for additional selecton: 0 - transparent, 255 - opaque
+ if ide.wxver >= "2.9.5" then editor:SetAdditionalSelAlpha(127) end
+ end,
+
+ seladd = function(editor,style)
+ if ide.wxver >= "2.9.5" then
+ if (style.fg) then
+ editor:SetAdditionalSelForeground(wx.wxColour(unpack(style.fg)))
+ end
+ if (style.bg) then
+ editor:SetAdditionalSelBackground(wx.wxColour(unpack(style.bg)))
+ end
+ if (style.alpha) then
+ editor:SetAdditionalSelAlpha(style.alpha)
+ end
+ end
+ end,
+
+ caret = function(editor,style)
+ if (style.fg) then
+ editor:SetCaretForeground(wx.wxColour(unpack(style.fg)))
+ end
+ end,
+
+ caretlinebg = function(editor,style)
+ if (style.bg) then
+ editor:SetCaretLineBackground(wx.wxColour(unpack(style.bg)))
+ end
+ if (style.alpha and ide.wxver >= "2.9.5") then
+ editor:SetCaretLineBackAlpha(style.alpha)
+ end
+ end,
+
+ whitespace = function(editor,style)
+ if (style.fg) then
+ editor:SetWhitespaceForeground(1,wx.wxColour(unpack(style.fg)))
+ else
+ --editor:SetWhitespaceForeground(0)
+ end
+ if (style.bg) then
+ editor:SetWhitespaceBackground(1,wx.wxColour(unpack(style.bg)))
+ else
+ --editor:SetWhitespaceBackground(0)
+ end
+ end,
+
+ fold = function(editor,style)
+ local clrfg = style.fg and wx.wxColour(unpack(style.fg))
+ local clrbg = style.bg and wx.wxColour(unpack(style.bg))
+ local clrhi = style.hi and wx.wxColour(unpack(style.hi))
+ local clrsel = style.sel and wx.wxColour(unpack(style.sel))
+
+ -- if selected background is set then enable support for it
+ if ide.wxver >= "2.9.5" and clrsel then editor:MarkerEnableHighlight(true) end
+
+ if (clrfg or clrbg or clrsel) then
+ -- foreground and background are defined as opposite to what I'd expect
+ -- for fold markers in Scintilla's terminilogy:
+ -- background is the color of fold lines/boxes and foreground is the color
+ -- of everything around fold lines or inside fold boxes.
+ -- in the following code fg and bg are simply reversed
+ local clrfg, clrbg = clrbg, clrfg
+ applymarker(editor,wxstc.wxSTC_MARKNUM_FOLDEROPEN, clrfg, clrbg, clrsel)
+ applymarker(editor,wxstc.wxSTC_MARKNUM_FOLDER, clrfg, clrbg, clrsel)
+ applymarker(editor,wxstc.wxSTC_MARKNUM_FOLDERSUB, clrfg, clrbg, clrsel)
+ applymarker(editor,wxstc.wxSTC_MARKNUM_FOLDERTAIL, clrfg, clrbg, clrsel)
+ applymarker(editor,wxstc.wxSTC_MARKNUM_FOLDEREND, clrfg, clrbg, clrsel)
+ applymarker(editor,wxstc.wxSTC_MARKNUM_FOLDEROPENMID, clrfg, clrbg, clrsel)
+ applymarker(editor,wxstc.wxSTC_MARKNUM_FOLDERMIDTAIL, clrfg, clrbg, clrsel)
+ end
+ if clrbg then
+ -- the earlier calls only color the actual markers, but not the
+ -- overall fold background; SetFoldMargin calls below do this.
+ -- http://community.activestate.com/forum-topic/fold-margin-colors
+ -- http://www.scintilla.org/ScintillaDoc.html#SCI_SETFOLDMARGINCOLOUR
+ editor:SetFoldMarginColour(true, clrbg)
+ editor:SetFoldMarginHiColour(true, clrbg)
+ end
+ if clrhi then
+ editor:SetFoldMarginHiColour(true, clrhi)
+ end
+ end,
+
+ edge = function(editor,style)
+ if style.fg or style.col or style.mode then
+ editor:SetEdgeColour(wx.wxColour(unpack(style.fg or {220, 220, 220})))
+ editor:SetEdgeMode(style.mode or wxstc.wxSTC_EDGE_LINE)
+ editor:SetEdgeColumn(style.col or 80)
+ end
+ end,
+
+ marker = function(editor,markers)
+ for m, style in pairs(markers) do
+ local id, ch, fg, bg = StylesGetMarker(m)
+ if style.ch then ch = style.ch end
+ if style.fg then fg = wx.wxColour(unpack(style.fg)) end
+ if style.bg then bg = wx.wxColour(unpack(style.bg)) end
+ editor:MarkerDefine(id, ch, fg, bg)
+ end
+ end,
+
+ auxwindow = function(editor,style)
+ if not style then return end
+
+ -- don't color toolbars as they have their own color/style
+ local skipcolor = {wxAuiToolBar = true, wxToolBar = true}
+ local default = wxstc.wxSTC_STYLE_DEFAULT
+ local bg = style.bg and wx.wxColour(unpack(style.bg)) or editor:StyleGetBackground(default)
+ local fg = style.fg and wx.wxColour(unpack(style.fg)) or editor:StyleGetForeground(default)
+
+ local uimgr = ide.frame.uimgr
+ local panes = uimgr:GetAllPanes()
+ for index = 0, panes:GetCount()-1 do
+ local wind = uimgr:GetPane(panes:Item(index).name).window
+
+ -- wxlua compiled with STL doesn't provide GetChildren() method
+ -- as per http://sourceforge.net/p/wxlua/mailman/message/32500995/
+ local ok, children = pcall(function() return wind:GetChildren() end)
+ if not ok then break end
+
+ for child = 0, children:GetCount()-1 do
+ local data = children:Item(child):GetData()
+ local _, window = pcall(function() return data:DynamicCast("wxWindow") end)
+ if window and not skipcolor[window:GetClassInfo():GetClassName()] then
+ window:SetBackgroundColour(bg)
+ window:SetForegroundColour(fg)
+ window:Refresh()
+ end
+ end
+ end
+ end,
+}
+
+local defaultmapping = {
+ text = wxstc.wxSTC_STYLE_DEFAULT,
+ linenumber = wxstc.wxSTC_STYLE_LINENUMBER,
+ bracematch = wxstc.wxSTC_STYLE_BRACELIGHT,
+ bracemiss = wxstc.wxSTC_STYLE_BRACEBAD,
+ ctrlchar = wxstc.wxSTC_STYLE_CONTROLCHAR,
+ indent = wxstc.wxSTC_STYLE_INDENTGUIDE,
+ calltip = wxstc.wxSTC_STYLE_CALLTIP,
+}
+
+function StylesApplyToEditor(styles,editor,font,fontitalic,lexerconvert)
+ local defaultfg = styles.text and styles.text.fg and wx.wxColour(unpack(styles.text.fg)) or nil
+ local defaultbg = styles.text and styles.text.bg and wx.wxColour(unpack(styles.text.bg)) or nil
+
+ local function applystyle(style,id)
+ editor:StyleSetFont(id, style.i and fontitalic or font)
+ editor:StyleSetBold(id, style.b or false)
+ editor:StyleSetUnderline(id, style.u or false)
+ editor:StyleSetEOLFilled(id, style.fill or false)
+
+ if style.fn then editor:StyleSetFaceName(id, style.fn) end
+ if style.fs then editor:StyleSetSize(id, style.fs) end
+ if style.v ~= nil then editor:StyleSetVisible(id, style.v) end
+
+ if style.hs then
+ editor:StyleSetHotSpot(id, 1)
+ -- if passed a color (table) as value, set it as foreground
+ if type(style.hs) == 'table' then
+ local color = wx.wxColour(unpack(style.hs))
+ editor:SetHotspotActiveForeground(1, color)
+ end
+ editor:SetHotspotActiveUnderline(1)
+ editor:SetHotspotSingleLine(1)
+ end
+
+ if (style.fg or defaultfg) then
+ editor:StyleSetForeground(id, style.fg and wx.wxColour(unpack(style.fg)) or defaultfg)
+ end
+ if (style.bg or defaultbg) then
+ editor:StyleSetBackground(id, style.bg and wx.wxColour(unpack(style.bg)) or defaultbg)
+ end
+ end
+
+ editor:StyleResetDefault()
+ editor:SetFont(font)
+ if (styles.text) then
+ applystyle(styles.text,defaultmapping["text"])
+ else
+ applystyle({},defaultmapping["text"])
+ end
+ editor:StyleClearAll()
+
+ -- set the default linenumber font size based on the editor font size
+ if styles.linenumber and not styles.linenumber.fs then
+ styles.linenumber.fs = ide.config.editor.fontsize and (ide.config.editor.fontsize - 1) or nil
+ end
+
+ for name,style in pairs(styles) do
+ if (specialmapping[name]) then
+ specialmapping[name](editor,style)
+ elseif (defaultmapping[name]) then
+ applystyle(style,defaultmapping[name])
+ end
+
+ if (lexerconvert and lexerconvert[name]) then
+ local targets = lexerconvert[name]
+ for _, outid in pairs(targets) do
+ applystyle(style,outid)
+ end
+ -- allow to specify style numbers, but exclude those styles
+ -- that may conflict with indicator numbers
+ elseif (style.st and style.st > 8 and style.st < wxstc.wxSTC_STYLE_DEFAULT) then
+ applystyle(style,style.st)
+ end
+ end
+
+ -- additional selection (seladd) attributes can only be set after
+ -- normal selection (sel) attributes are set, so handle them again
+ if styles.seladd then specialmapping.seladd(editor, styles.seladd) end
+
+ -- calltip has a special style that needs to be enabled
+ if styles.calltip then editor:CallTipUseStyle(2) end
+
+ do
+ local defaultfg = {127,127,127}
+ local indic = styles.indicator or {}
+
+ -- use styles.fncall if not empty and if indic.fncall is empty
+ -- for backward compatibility
+ if type(styles.fncall) == 'table' and next(styles.fncall)
+ and not (type(indic.fncall) == 'table' and next(indic.fncall)) then indic.fncall = styles.fncall end
+
+ local fncall = ide:AddIndicator("core.fncall")
+ local varlocal = ide:AddIndicator("core.varlocal")
+ local varglobal = ide:AddIndicator("core.varglobal")
+ local varmasking = ide:AddIndicator("core.varmasking")
+ local varmasked = ide:AddIndicator("core.varmasked")
+ local searchmatch = ide:AddIndicator("core.searchmatch")
+
+ editor:IndicatorSetStyle(fncall, indic.fncall and indic.fncall.st or ide.wxver >= "2.9.5" and wxstc.wxSTC_INDIC_ROUNDBOX or wxstc.wxSTC_INDIC_TT)
+ editor:IndicatorSetForeground(fncall, wx.wxColour(unpack(indic.fncall and indic.fncall.fg or {128, 128, 255})))
+ editor:IndicatorSetStyle(varlocal, indic.varlocal and indic.varlocal.st or wxstc.wxSTC_INDIC_DOTS or wxstc.wxSTC_INDIC_TT)
+ editor:IndicatorSetForeground(varlocal, wx.wxColour(unpack(indic.varlocal and indic.varlocal.fg or defaultfg)))
+ editor:IndicatorSetStyle(varglobal, indic.varglobal and indic.varglobal.st or wxstc.wxSTC_INDIC_PLAIN)
+ editor:IndicatorSetForeground(varglobal, wx.wxColour(unpack(indic.varglobal and indic.varglobal.fg or defaultfg)))
+ editor:IndicatorSetStyle(varmasking, indic.varmasking and indic.varmasking.st or wxstc.wxSTC_INDIC_DASH or wxstc.wxSTC_INDIC_DIAGONAL)
+ editor:IndicatorSetForeground(varmasking, wx.wxColour(unpack(indic.varmasking and indic.varmasking.fg or defaultfg)))
+ editor:IndicatorSetStyle(varmasked, indic.varmasked and indic.varmasked.st or wxstc.wxSTC_INDIC_STRIKE)
+ editor:IndicatorSetForeground(varmasked, wx.wxColour(unpack(indic.varmasked and indic.varmasked.fg or defaultfg)))
+ editor:IndicatorSetStyle(searchmatch, indic.searchmatch and indic.searchmatch.st or wxstc.wxSTC_INDIC_BOX)
+ editor:IndicatorSetForeground(searchmatch, wx.wxColour(unpack(indic.searchmatch and indic.searchmatch.fg or {196, 0, 0})))
+ end
+end
+
+function ReApplySpecAndStyles()
+ -- re-register markup styles as they are special:
+ -- these styles need to be updated as they are based on comment styles
+ if MarkupAddStyles then MarkupAddStyles(ide.config.styles) end
+
+ local errorlog = ide.frame.bottomnotebook.errorlog
+ local shellbox = ide.frame.bottomnotebook.shellbox
+ SetupKeywords(shellbox,"lua",nil,ide.config.stylesoutshell,ide.font.oNormal,ide.font.oItalic)
+ StylesApplyToEditor(ide.config.stylesoutshell,errorlog,ide.font.oNormal,ide.font.oItalic)
+
+ for _, doc in pairs(ide:GetDocuments()) do
+ if doc.editor.spec then doc.editor:SetupKeywords(nil, doc.editor.spec) end
+ end
+end
+
+function ApplyStyleConfig(config, style)
+ if not wx.wxIsAbsolutePath(config)
+ then config = MergeFullPath(GetPathWithSep(ide.editorFilename), config) end
+
+ local cfg = {wxstc = wxstc, math = math, print = DisplayOutputLn,
+ path = {}, editor = {}, view ={}, acandtip = {}, outputshell = {}, debugger={}}
+ local cfgfn, err = loadfile(config)
+ if not cfgfn then
+ DisplayOutputLn(TR("Error while loading configuration file: %s"):format(err))
+ return
+ end
+
+ setfenv(cfgfn,cfg)
+ cfgfn, err = pcall(cfgfn,style)
+ if not cfgfn then
+ DisplayOutputLn(TR("Error while processing configuration file: %s"):format(err))
+ return
+ end
+
+ -- if no style assigned explicitly, but a table is returned, use it
+ if not (cfg.styles or cfg.stylesoutshell) and type(err) == 'table' then
+ cfg.styles = err
+ end
+
+ if cfg.styles or cfg.stylesoutshell then
+ if (cfg.styles) then
+ ide.config.styles = StylesGetDefault()
+ -- copy
+ for i,s in pairs(cfg.styles) do
+ ide.config.styles[i] = s
+ end
+ end
+ if (cfg.stylesoutshell) then
+ ide.config.stylesoutshell = StylesGetDefault()
+ -- copy
+ for i,s in pairs(cfg.stylesoutshell) do
+ ide.config.stylesoutshell[i] = s
+ end
+ end
+ ReApplySpecAndStyles()
+ end
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/toolbar.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/toolbar.lua
new file mode 100644
index 0000000..e7dd878
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/editor/toolbar.lua
@@ -0,0 +1,55 @@
+-- Copyright 2014-15 Paul Kulchenko, ZeroBrane LLC
+
+local TR = function(...) return ... end
+
+ide.config.toolbar.icons = {
+ ID.NEW, ID.OPEN, ID.SAVE, ID.SAVEALL, ID.PROJECTDIRFROMFILE, ID.PROJECTDIRCHOOSE,
+ ID.SEPARATOR,
+ ID.FIND, ID.REPLACE, ID.FINDINFILES,
+ ID.SEPARATOR,
+ ID.RUN, ID.STARTDEBUG, ID.RUNNOW, ID.STOPDEBUG, ID.DETACHDEBUG, ID.BREAK,
+ ID.STEP, ID.STEPOVER, ID.STEPOUT, ID.RUNTO,
+ ID.SEPARATOR,
+ ID.BREAKPOINTTOGGLE, ID.BOOKMARKTOGGLE, ID.VIEWCALLSTACK, ID.VIEWWATCHWINDOW,
+ [ID.FINDINFILES] = false,
+}
+
+ide.config.toolbar.iconmap = {
+ [ID.NEW] = {"FILE-NEW", TR("Create an empty document")},
+ [ID.OPEN] = {"FILE-OPEN", TR("Open an existing document")},
+ [ID.SAVE] = {"FILE-SAVE", TR("Save the current document")},
+ [ID.SAVEALL] = {"FILE-SAVE-ALL", TR("Save all open documents")},
+ [ID.PROJECTDIRFROMFILE]= {"DIR-SETUP-FILE", TR("Set project directory from current file")},
+ [ID.PROJECTDIRCHOOSE] = {"DIR-SETUP", TR("Choose a project directory")},
+ [ID.FIND] = {"FIND", TR("Find text")},
+ [ID.REPLACE] = {"FIND-AND-REPLACE", TR("Find and replace text")},
+ [ID.FINDINFILES] = {"FIND-IN-FILES", TR("Find in files")},
+ [ID.RUN] = {"RUN", TR("Execute the current project/file")},
+ [ID.RUNNOW] = {"RUN-NOW", TR("Run as Scratchpad")},
+ [ID.STARTDEBUG] = {"DEBUG-START", TR("Start or continue debugging")},
+ [ID.STOPDEBUG] = {"DEBUG-STOP", TR("Stop the currently running process")},
+ [ID.DETACHDEBUG]= {"DEBUG-DETACH", TR("Stop debugging and continue running the process")},
+ [ID.BREAK] = {"DEBUG-BREAK", TR("Break execution at the next executed line of code")},
+ [ID.RUNTO] = {"DEBUG-RUN-TO", TR("Run to cursor")},
+ [ID.STEP] = {"DEBUG-STEP-INTO", TR("Step into")},
+ [ID.STEPOVER] = {"DEBUG-STEP-OVER", TR("Step over")},
+ [ID.STEPOUT] = {"DEBUG-STEP-OUT", TR("Step out of the current function")},
+ [ID.BREAKPOINTTOGGLE] = {"DEBUG-BREAKPOINT-TOGGLE", TR("Toggle breakpoint")},
+ [ID.BOOKMARKTOGGLE] = {"BOOKMARK-TOGGLE", TR("Toggle bookmark")},
+ [ID.VIEWCALLSTACK] = {"DEBUG-CALLSTACK", TR("View the stack window")},
+ [ID.VIEWWATCHWINDOW] = {"DEBUG-WATCH", TR("View the watch window")},
+ -- search toolbar
+ [ID.FINDNEXT] = {"FIND", TR("Find")},
+ [ID.FINDREPLACENEXT] = {"FIND-REPLACE-NEXT", TR("Replace next instance")},
+ [ID.FINDREPLACEALL] = {"FIND-AND-REPLACE", TR("Replace all")},
+ [ID.FINDSETDIR] = {"FIND-OPT-SETDIR", TR("Set search directory")},
+ [ID.FINDOPTDIRECTION] = {"FIND-OPT-DOWN", TR("Search direction")},
+ [ID.FINDOPTWRAPWROUND] = {"FIND-OPT-WRAP-AROUND", TR("Wrap around")},
+ [ID.FINDOPTSELECTION] = {"FIND-OPT-SELECTION", TR("Search in selection")},
+ [ID.FINDOPTWORD] = {"FIND-OPT-WORD", TR("Match whole word")},
+ [ID.FINDOPTCASE] = {"FIND-OPT-CASE-SENSITIVE", TR("Match case")},
+ [ID.FINDOPTREGEX] = {"FIND-OPT-REGEX", TR("Regular expression")},
+ [ID.FINDOPTCONTEXT] = {"FIND-OPT-CONTEXT", TR("Show context")},
+ [ID.FINDOPTSUBDIR] = {"FIND-OPT-SUBDIR", TR("Search in subdirectories")},
+ [ID.FINDOPTMULTIRESULTS] = {"FIND-OPT-MULTI-RESULTS", TR("Show multiple result windows")},
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/main.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/main.lua
new file mode 100644
index 0000000..4d6b68c
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/main.lua
@@ -0,0 +1,774 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+-- put bin/ and lualibs/ first to avoid conflicts with included modules
+-- that may have other versions present somewhere else in path/cpath.
+local function isproc()
+ local file = io.open("/proc")
+ if file then file:close() end
+ return file ~= nil
+end
+local iswindows = os.getenv('WINDIR') or (os.getenv('OS') or ''):match('[Ww]indows')
+local islinux = not iswindows and isproc()
+local arch = "x86" -- use 32bit by default
+local unpack = table.unpack or unpack
+
+if islinux then
+ local file = io.popen("uname -m")
+ if file then
+ local machine=file:read("*l")
+ local archtype= { x86_64="x64", armv7l="armhf" }
+ arch = archtype[machine] or "x86"
+ file:close()
+ end
+end
+
+package.cpath = (
+ iswindows and 'bin/?.dll;bin/clibs/?.dll;' or
+ islinux and ('bin/linux/%s/lib?.so;bin/linux/%s/clibs/?.so;'):format(arch,arch) or
+ --[[isosx]] 'bin/lib?.dylib;bin/clibs/?.dylib;')
+ .. package.cpath
+package.path = 'lualibs/?.lua;lualibs/?/?.lua;lualibs/?/init.lua;lualibs/?/?/?.lua;lualibs/?/?/init.lua;'
+ .. package.path
+
+require("wx")
+require("bit")
+require("mobdebug")
+if jit and jit.on then jit.on() end -- turn jit "on" as "mobdebug" may turn it off for LuaJIT
+
+dofile "src/util.lua"
+
+-----------
+-- IDE
+--
+local pendingOutput = {}
+ide = {
+ MODPREF = "* ",
+ MAXMARGIN = 4,
+ config = {
+ path = {
+ projectdir = "",
+ app = nil,
+ },
+ editor = {
+ autoactivate = false,
+ foldcompact = true,
+ checkeol = true,
+ saveallonrun = false,
+ caretline = true,
+ showfncall = false,
+ autotabs = false,
+ usetabs = false,
+ tabwidth = 2,
+ usewrap = true,
+ wrapmode = wxstc.wxSTC_WRAP_WORD,
+ calltipdelay = 500,
+ smartindent = true,
+ fold = true,
+ autoreload = true,
+ indentguide = true,
+ backspaceunindent = true,
+ },
+ debugger = {
+ verbose = false,
+ hostname = nil,
+ port = nil,
+ runonstart = nil,
+ redirect = nil,
+ maxdatalength = 400,
+ maxdatanum = 400,
+ maxdatalevel = 3,
+ },
+ default = {
+ name = 'untitled',
+ fullname = 'untitled.lua',
+ interpreter = 'luadeb',
+ },
+ outputshell = {
+ usewrap = true,
+ },
+ filetree = {
+ mousemove = true,
+ },
+ outline = {
+ jumptocurrentfunction = true,
+ showanonymous = '~',
+ showcurrentfunction = true,
+ showcompact = false,
+ showflat = false,
+ showmethodindicator = false,
+ showonefile = false,
+ sort = false,
+ },
+ commandbar = {
+ prefilter = 250, -- number of records after which to apply filtering
+ maxitems = 30, -- max number of items to show
+ width = 0.35, -- <1 -- size in proportion to the app frame width; >1 -- size in pixels
+ showallsymbols = true,
+ },
+ staticanalyzer = {
+ infervalue = false, -- off by default as it's a slower mode
+ },
+ search = {
+ autocomplete = true,
+ contextlinesbefore = 2,
+ contextlinesafter = 2,
+ showaseditor = false,
+ zoom = 0,
+ autohide = false,
+ },
+ print = {
+ magnification = -3,
+ wrapmode = wxstc.wxSTC_WRAP_WORD,
+ colourmode = wxstc.wxSTC_PRINT_BLACKONWHITE,
+ header = "%S\t%D\t%p/%P",
+ footer = nil,
+ },
+ toolbar = {
+ icons = {},
+ iconmap = {},
+ },
+
+ keymap = {},
+ imagemap = {
+ ['VALUE-MCALL'] = 'VALUE-SCALL',
+ },
+ messages = {},
+ language = "en",
+
+ styles = nil,
+ stylesoutshell = nil,
+
+ autocomplete = true,
+ autoanalyzer = true,
+ acandtip = {
+ shorttip = true,
+ nodynwords = true,
+ ignorecase = false,
+ symbols = true,
+ droprest = true,
+ strategy = 2,
+ width = 60,
+ maxlength = 450,
+ warning = true,
+ },
+ arg = {}, -- command line arguments
+ api = {}, -- additional APIs to load
+
+ format = { -- various formatting strings
+ menurecentprojects = "%f | %i",
+ apptitle = "%T - %F",
+ },
+
+ activateoutput = true, -- activate output/console on Run/Debug/Compile
+ unhidewindow = false, -- to unhide a gui window
+ projectautoopen = true,
+ autorecoverinactivity = 10, -- seconds
+ outlineinactivity = 0.250, -- seconds
+ markersinactivity = 0.500, -- seconds
+ symbolindexinactivity = 2, -- seconds
+ filehistorylength = 20,
+ projecthistorylength = 20,
+ bordersize = 2,
+ savebak = false,
+ singleinstance = false,
+ singleinstanceport = 0xe493,
+ showmemoryusage = false,
+ showhiddenfiles = false,
+ hidpi = false, -- HiDPI/Retina display support
+ hotexit = false,
+ -- file exclusion lists
+ excludelist = {".svn/", ".git/", ".hg/", "CVS/", "*.pyc", "*.pyo", "*.exe", "*.dll", "*.obj","*.o", "*.a", "*.lib", "*.so", "*.dylib", "*.ncb", "*.sdf", "*.suo", "*.pdb", "*.idb", ".DS_Store", "*.class", "*.psd", "*.db"},
+ binarylist = {"*.jpg", "*.jpeg", "*.png", "*.gif", "*.ttf", "*.tga", "*.dds", "*.ico", "*.eot", "*.pdf", "*.swf", "*.jar", "*.zip", ".gz", ".rar"},
+ },
+ specs = {
+ none = {
+ sep = "\1",
+ }
+ },
+ tools = {},
+ iofilters = {},
+ interpreters = {},
+ packages = {},
+ apis = {},
+ timers = {},
+ onidle = {},
+
+ proto = {}, -- prototypes for various classes
+
+ app = nil, -- application engine
+ interpreter = nil, -- current Lua interpreter
+ frame = nil, -- gui related
+ debugger = {}, -- debugger related info
+ filetree = nil, -- filetree
+ findReplace = nil, -- find & replace handling
+ settings = nil, -- user settings (window pos, last files..)
+ session = {
+ projects = {}, -- project configuration for the current session
+ lastupdated = nil, -- timestamp of the last modification in any of the editors
+ lastsaved = nil, -- timestamp of the last recovery information saved
+ },
+
+ -- misc
+ exitingProgram = false, -- are we currently exiting, ID_EXIT
+ infocus = nil, -- last component with a focus
+ editorApp = wx.wxGetApp(),
+ editorFilename = nil,
+ openDocuments = {},-- open notebook editor documents[winId] = {
+ -- editor = wxStyledTextCtrl,
+ -- index = wxNotebook page index,
+ -- filePath = full filepath, nil if not saved,
+ -- fileName = just the filename,
+ -- modTime = wxDateTime of disk file or nil,
+ -- isModified = bool is the document modified? }
+ ignoredFilesList = {},
+ font = {
+ eNormal = nil,
+ eItalic = nil,
+ oNormal = nil,
+ oItalic = nil,
+ fNormal = nil,
+ },
+
+ osname = wx.wxPlatformInfo.Get():GetOperatingSystemFamilyName(),
+ osarch = arch,
+ oshome = os.getenv("HOME") or (iswindows and os.getenv('HOMEDRIVE') and os.getenv('HOMEPATH')
+ and (os.getenv('HOMEDRIVE')..os.getenv('HOMEPATH'))),
+ wxver = string.match(wx.wxVERSION_STRING, "[%d%.]+"),
+
+ test = {}, -- local functions used for testing
+
+ Print = function(self, ...)
+ if DisplayOutputLn then
+ -- flush any pending output
+ while #pendingOutput > 0 do DisplayOutputLn(unpack(table.remove(pendingOutput, 1))) end
+ -- print without parameters can be used for flushing, so skip the printing
+ if select('#', ...) > 0 then DisplayOutputLn(...) end
+ return
+ end
+ pendingOutput[#pendingOutput + 1] = {...}
+ end,
+}
+
+-- add wx.wxMOD_RAW_CONTROL as it's missing in wxlua 2.8.12.3;
+-- provide default for wx.wxMOD_CONTROL as it's missing in wxlua 2.8 that
+-- is available through Linux package managers
+if not wx.wxMOD_CONTROL then wx.wxMOD_CONTROL = 0x02 end
+if not wx.wxMOD_RAW_CONTROL then
+ wx.wxMOD_RAW_CONTROL = ide.osname == 'Macintosh' and 0x10 or wx.wxMOD_CONTROL
+end
+-- ArchLinux running 2.8.12.2 doesn't have wx.wxMOD_SHIFT defined
+if not wx.wxMOD_SHIFT then wx.wxMOD_SHIFT = 0x04 end
+-- wxDIR_NO_FOLLOW is missing in wxlua 2.8.12 as well
+if not wx.wxDIR_NO_FOLLOW then wx.wxDIR_NO_FOLLOW = 0x10 end
+if not wxaui.wxAUI_TB_PLAIN_BACKGROUND then wxaui.wxAUI_TB_PLAIN_BACKGROUND = 2^8 end
+
+if not setfenv then -- Lua 5.2
+ -- based on http://lua-users.org/lists/lua-l/2010-06/msg00314.html
+ -- this assumes f is a function
+ local function findenv(f)
+ local level = 1
+ repeat
+ local name, value = debug.getupvalue(f, level)
+ if name == '_ENV' then return level, value end
+ level = level + 1
+ until name == nil
+ return nil end
+ getfenv = function (f) return(select(2, findenv(f)) or _G) end
+ setfenv = function (f, t)
+ local level = findenv(f)
+ if level then debug.setupvalue(f, level, t) end
+ return f end
+end
+
+dofile "src/version.lua"
+
+for _, file in ipairs({"proto", "ids", "style", "keymap", "toolbar"}) do
+ dofile("src/editor/"..file..".lua")
+end
+
+ide.config.styles = StylesGetDefault()
+ide.config.stylesoutshell = StylesGetDefault()
+
+local function setLuaPaths(mainpath, osname)
+ -- use LUA_DEV to setup paths for Lua for Windows modules if installed
+ local luadev = osname == "Windows" and os.getenv('LUA_DEV')
+ if luadev and not wx.wxDirExists(luadev) then luadev = nil end
+ local luadev_path = (luadev
+ and ('LUA_DEV/?.lua;LUA_DEV/?/init.lua;LUA_DEV/lua/?.lua;LUA_DEV/lua/?/init.lua')
+ :gsub('LUA_DEV', (luadev:gsub('[\\/]$','')))
+ or nil)
+ local luadev_cpath = (luadev
+ and ('LUA_DEV/?.dll;LUA_DEV/?51.dll;LUA_DEV/clibs/?.dll;LUA_DEV/clibs/?51.dll')
+ :gsub('LUA_DEV', (luadev:gsub('[\\/]$','')))
+ or nil)
+
+ if luadev then
+ local path, clibs = os.getenv('PATH'), luadev:gsub('[\\/]$','')..'\\clibs'
+ if not path:find(clibs, 1, true) then wx.wxSetEnv('PATH', path..';'..clibs) end
+ end
+
+ -- (luaconf.h) in Windows, any exclamation mark ('!') in the path is replaced
+ -- by the path of the directory of the executable file of the current process.
+ -- this effectively prevents any path with an exclamation mark from working.
+ -- if the path has an excamation mark, allow Lua to expand it as this
+ -- expansion happens only once.
+ if osname == "Windows" and mainpath:find('%!') then mainpath = "!/../" end
+
+ -- if LUA_PATH or LUA_CPATH is not specified, then add ;;
+ -- ;; will be replaced with the default (c)path by the Lua interpreter
+ wx.wxSetEnv("LUA_PATH",
+ (os.getenv("LUA_PATH") or ';') .. ';'
+ .. "./?.lua;./?/init.lua;./lua/?.lua;./lua/?/init.lua" .. ';'
+ .. mainpath.."lualibs/?/?.lua;"..mainpath.."lualibs/?.lua;"
+ .. mainpath.."lualibs/?/?/init.lua;"..mainpath.."lualibs/?/init.lua"
+ .. (luadev_path and (';' .. luadev_path) or ''))
+
+ ide.osclibs = -- keep the list to use for other Lua versions
+ osname == "Windows" and mainpath.."bin/?.dll;"..mainpath.."bin/clibs/?.dll" or
+ osname == "Macintosh" and mainpath.."bin/lib?.dylib;"..mainpath.."bin/clibs/?.dylib" or
+ osname == "Unix" and mainpath..("bin/linux/%s/lib?.so;"):format(arch)
+ ..mainpath..("bin/linux/%s/clibs/?.so"):format(arch) or
+ assert(false, "Unexpected OS name")
+
+ wx.wxSetEnv("LUA_CPATH",
+ (os.getenv("LUA_CPATH") or ';') .. ';' .. ide.osclibs
+ .. (luadev_cpath and (';' .. luadev_cpath) or ''))
+
+ -- on some OSX versions, PATH is sanitized to not include even /usr/local/bin; add it
+ if osname == "Macintosh" then
+ local ok, path = wx.wxGetEnv("PATH")
+ if ok then wx.wxSetEnv("PATH", (#path > 0 and path..":" or "").."/usr/local/bin") end
+ end
+end
+
+ide.test.setLuaPaths = setLuaPaths
+
+---------------
+-- process args
+local filenames = {}
+local configs = {}
+do
+ local arg = {...}
+ -- application name is expected as the first argument
+ local fullPath = arg[1] or "zbstudio"
+
+ ide.arg = arg
+
+ -- on Windows use GetExecutablePath, which is Unicode friendly,
+ -- whereas wxGetCwd() is not (at least in wxlua 2.8.12.2).
+ -- some wxlua version on windows report wx.dll instead of *.exe.
+ local exepath = wx.wxStandardPaths.Get():GetExecutablePath()
+ if ide.osname == "Windows" and exepath:find("%.exe$") then
+ fullPath = exepath
+ elseif not wx.wxIsAbsolutePath(fullPath) then
+ fullPath = wx.wxGetCwd().."/"..fullPath
+ end
+
+ ide.editorFilename = fullPath
+ ide.appname = fullPath:match("([%w_-%.]+)$"):gsub("%.[^%.]*$","")
+ assert(ide.appname, "no application path defined")
+
+ for index = 2, #arg do
+ if (arg[index] == "-cfg" and index+1 <= #arg) then
+ table.insert(configs,arg[index+1])
+ elseif arg[index-1] ~= "-cfg"
+ -- on OSX command line includes -psn... parameter, don't include these
+ and (ide.osname ~= 'Macintosh' or not arg[index]:find("^-psn")) then
+ table.insert(filenames,arg[index])
+ end
+ end
+
+ setLuaPaths(GetPathWithSep(ide.editorFilename), ide.osname)
+end
+
+----------------------
+-- process application
+
+ide.app = dofile(ide.appname.."/app.lua")
+local app = assert(ide.app)
+
+local function loadToTab(filter, folder, tab, recursive, proto)
+ if filter and type(filter) ~= 'function' then
+ filter = app.loadfilters[filter] or nil
+ end
+ for _, file in ipairs(FileSysGetRecursive(folder, recursive, "*.lua")) do
+ if not filter or filter(file) then
+ LoadLuaFileExt(tab, file, proto)
+ end
+ end
+ return tab
+end
+
+local function loadInterpreters(filter)
+ loadToTab(filter or "interpreters", "interpreters", ide.interpreters, false,
+ ide.proto.Interpreter)
+end
+
+-- load tools
+local function loadTools(filter)
+ loadToTab(filter or "tools", "tools", ide.tools, false)
+end
+
+-- load packages
+local function processPackages(packages)
+ -- check dependencies and assign file names to each package
+ local skip = {}
+ for fname, package in pairs(packages) do
+ if type(package.dependencies) == 'table'
+ and package.dependencies.osname
+ and not package.dependencies.osname:find(ide.osname, 1, true) then
+ ide:Print(("Package '%s' not loaded: requires %s platform, but you are running %s.")
+ :format(fname, package.dependencies.osname, ide.osname))
+ skip[fname] = true
+ end
+
+ local needsversion = tonumber(package.dependencies)
+ or type(package.dependencies) == 'table' and tonumber(package.dependencies[1])
+ or -1
+ local isversion = tonumber(ide.VERSION)
+ if isversion and needsversion > isversion then
+ ide:Print(("Package '%s' not loaded: requires version %s, but you are running version %s.")
+ :format(fname, needsversion, ide.VERSION))
+ skip[fname] = true
+ end
+ package.fname = fname
+ end
+
+ for fname, package in pairs(packages) do
+ if not skip[fname] then ide.packages[fname] = package end
+ end
+end
+
+function UpdateSpecs()
+ for _, spec in pairs(ide.specs) do
+ spec.sep = spec.sep or "\1" -- default separator doesn't match anything
+ spec.iscomment = {}
+ spec.iskeyword0 = {}
+ spec.isstring = {}
+ if (spec.lexerstyleconvert) then
+ if (spec.lexerstyleconvert.comment) then
+ for _, s in pairs(spec.lexerstyleconvert.comment) do
+ spec.iscomment[s] = true
+ end
+ end
+ if (spec.lexerstyleconvert.keywords0) then
+ for _, s in pairs(spec.lexerstyleconvert.keywords0) do
+ spec.iskeyword0[s] = true
+ end
+ end
+ if (spec.lexerstyleconvert.stringtxt) then
+ for _, s in pairs(spec.lexerstyleconvert.stringtxt) do
+ spec.isstring[s] = true
+ end
+ end
+ end
+ end
+end
+
+-- load specs
+local function loadSpecs(filter)
+ loadToTab(filter or "specs", "spec", ide.specs, true)
+ UpdateSpecs()
+end
+
+function GetIDEString(keyword, default)
+ return app.stringtable[keyword] or default or keyword
+end
+
+----------------------
+-- process config
+
+-- set ide.config environment
+do
+ ide.configs = {
+ system = MergeFullPath("cfg", "user.lua"),
+ user = ide.oshome and MergeFullPath(ide.oshome, "."..ide.appname.."/user.lua"),
+ }
+ ide.configqueue = {}
+
+ local num = 0
+ local package = setmetatable({}, {
+ __index = function(_,k) return package[k] end,
+ __newindex = function(_,k,v) package[k] = v end,
+ __call = function(_,p)
+ -- package can be defined inline, like "package {...}"
+ if type(p) == 'table' then
+ num = num + 1
+ local name = 'config'..num..'package'
+ ide.packages[name] = setmetatable(p, ide.proto.Plugin)
+ -- package can be included as "package 'file.lua'" or "package 'folder/'"
+ elseif type(p) == 'string' then
+ local config = ide.configqueue[#ide.configqueue]
+ local pkg
+ for _, packagepath in ipairs({'.', 'packages/', '../packages/'}) do
+ local p = config and MergeFullPath(config.."/../"..packagepath, p)
+ pkg = wx.wxDirExists(p) and loadToTab(nil, p, {}, false, ide.proto.Plugin)
+ or wx.wxFileExists(p) and LoadLuaFileExt({}, p, ide.proto.Plugin)
+ or wx.wxFileExists(p..".lua") and LoadLuaFileExt({}, p..".lua", ide.proto.Plugin)
+ if pkg then
+ processPackages(pkg)
+ break
+ end
+ end
+ if not pkg then ide:Print(("Can't find '%s' to load package from."):format(p)) end
+ else
+ ide:Print(("Can't load package based on parameter of type '%s'."):format(type(p)))
+ end
+ end,
+ })
+
+ local includes = {}
+ local include = function(c)
+ if c then
+ for _, config in ipairs({ide.configqueue[#ide.configqueue], ide.configs.user, ide.configs.system}) do
+ local p = config and MergeFullPath(config.."/../", c)
+ includes[p] = (includes[p] or 0) + 1
+ if includes[p] > 1 or LoadLuaConfig(p) or LoadLuaConfig(p..".lua") then return end
+ includes[p] = includes[p] - 1
+ end
+ ide:Print(("Can't find configuration file '%s' to process."):format(c))
+ end
+ end
+
+ setmetatable(ide.config, {
+ __index = setmetatable({
+ load = {interpreters = loadInterpreters, specs = loadSpecs, tools = loadTools},
+ package = package,
+ include = include,
+ }, {__index = _G or _ENV})
+ })
+end
+
+LoadLuaConfig(ide.appname.."/config.lua")
+
+ide.editorApp:SetAppName(GetIDEString("settingsapp"))
+
+-- check if the .ini file needs to be migrated on Windows
+if ide.osname == 'Windows' and ide.wxver >= "2.9.5" then
+ -- Windows used to have local ini file kept in wx.wxGetHomeDir (before 2.9),
+ -- but since 2.9 it's in GetUserConfigDir(), so migrate it.
+ local ini = ide.editorApp:GetAppName() .. ".ini"
+ local old = wx.wxFileName(wx.wxGetHomeDir(), ini)
+ local new = wx.wxFileName(wx.wxStandardPaths.Get():GetUserConfigDir(), ini)
+ if old:FileExists() and not new:FileExists() then
+ FileCopy(old:GetFullPath(), new:GetFullPath())
+ ide:Print(("Migrated configuration file from '%s' to '%s'.")
+ :format(old:GetFullPath(), new:GetFullPath()))
+ end
+end
+
+----------------------
+-- process plugins
+
+if app.preinit then app.preinit() end
+
+loadInterpreters()
+loadSpecs()
+loadTools()
+
+do
+ -- process configs
+ LoadLuaConfig(ide.configs.system)
+ LoadLuaConfig(ide.configs.user)
+
+ -- process all other configs (if any)
+ for _, v in ipairs(configs) do LoadLuaConfig(v, true) end
+ configs = nil
+
+ -- check and apply default styles in case a user resets styles in the config
+ for _, styles in ipairs({"styles", "stylesoutshell"}) do
+ if not ide.config[styles] then
+ ide:Print(("Ignored incorrect value of '%s' setting in the configuration file")
+ :format(styles))
+ ide.config[styles] = StylesGetDefault()
+ end
+ end
+
+ local sep = GetPathSeparator()
+ if ide.config.language then
+ LoadLuaFileExt(ide.config.messages, "cfg"..sep.."i18n"..sep..ide.config.language..".lua")
+ end
+ -- always load 'en' as it's requires as a fallback for pluralization
+ if ide.config.language ~= 'en' then
+ LoadLuaFileExt(ide.config.messages, "cfg"..sep.."i18n"..sep.."en.lua")
+ end
+end
+
+processPackages(loadToTab(nil, "packages", {}, false, ide.proto.Plugin))
+if ide.oshome then
+ local userpackages = MergeFullPath(ide.oshome, "."..ide.appname.."/packages")
+ if wx.wxDirExists(userpackages) then
+ processPackages(loadToTab(nil, userpackages, {}, false, ide.proto.Plugin))
+ end
+end
+
+---------------
+-- Load App
+
+for _, file in ipairs({
+ "settings", "singleinstance", "iofilters", "package", "markup",
+ "gui", "filetree", "output", "debugger", "outline", "commandbar",
+ "editor", "findreplace", "commands", "autocomplete", "shellbox", "markers",
+ "menu_file", "menu_edit", "menu_search",
+ "menu_view", "menu_project", "menu_tools", "menu_help",
+ "print", "inspect" }) do
+ dofile("src/editor/"..file..".lua")
+end
+
+-- register all the plugins
+PackageEventHandle("onRegister")
+
+-- initialization that was delayed until configs processed and packages loaded
+ProjectUpdateInterpreters()
+
+-- load rest of settings
+SettingsRestoreFramePosition(ide.frame, "MainFrame")
+SettingsRestoreView()
+SettingsRestoreFileHistory(SetFileHistory)
+SettingsRestoreEditorSettings()
+SettingsRestoreProjectSession(FileTreeSetProjects)
+SettingsRestoreFileSession(function(tabs, params)
+ if params and params.recovery
+ then return SetOpenTabs(params)
+ else return SetOpenFiles(tabs, params) end
+end)
+
+-- ---------------------------------------------------------------------------
+-- Load the filenames
+
+do
+ for _, filename in ipairs(filenames) do
+ if filename ~= "--" then
+ if wx.wxDirExists(filename) then
+ ProjectUpdateProjectDir(filename)
+ elseif not ActivateFile(filename) then
+ DisplayOutputLn(("Can't open file '%s': %s"):format(filename, wx.wxSysErrorMsg()))
+ end
+ end
+ end
+ if ide:GetEditorNotebook():GetPageCount() == 0 then NewFile() end
+end
+
+if app.postinit then app.postinit() end
+
+-- this is a workaround for a conflict between global shortcuts and local
+-- shortcuts (like F2) used in the file tree or a watch panel.
+-- because of several issues on OSX (as described in details in this thread:
+-- https://groups.google.com/d/msg/wx-dev/juJj_nxn-_Y/JErF1h24UFsJ),
+-- the workaround installs a global event handler that manually re-routes
+-- conflicting events when the current focus is on a proper object.
+-- non-conflicting shortcuts are handled through key-down events.
+local remap = {
+ [ID_ADDWATCH] = ide:GetWatch(),
+ [ID_EDITWATCH] = ide:GetWatch(),
+ [ID_DELETEWATCH] = ide:GetWatch(),
+ [ID_RENAMEFILE] = ide:GetProjectTree(),
+ [ID_DELETEFILE] = ide:GetProjectTree(),
+}
+
+local function rerouteMenuCommand(obj, id)
+ -- check if the conflicting shortcut is enabled:
+ -- (1) SetEnabled wasn't called or (2) Enabled was set to `true`.
+ local uievent = wx.wxUpdateUIEvent(id)
+ obj:ProcessEvent(uievent)
+ if not uievent:GetSetEnabled() or uievent:GetEnabled() then
+ obj:AddPendingEvent(wx.wxCommandEvent(wx.wxEVT_COMMAND_MENU_SELECTED, id))
+ end
+end
+
+local function remapkey(event)
+ local keycode = event:GetKeyCode()
+ local mod = event:GetModifiers()
+ for id, obj in pairs(remap) do
+ local focus = obj:FindFocus()
+ if focus and focus:GetId() == obj:GetId() then
+ local ae = wx.wxAcceleratorEntry(); ae:FromString(KSC(id))
+ if ae:GetFlags() == mod and ae:GetKeyCode() == keycode then
+ rerouteMenuCommand(obj, id)
+ return
+ end
+ end
+ end
+ event:Skip()
+end
+ide:GetWatch():Connect(wx.wxEVT_KEY_DOWN, remapkey)
+ide:GetProjectTree():Connect(wx.wxEVT_KEY_DOWN, remapkey)
+
+local function resolveConflict(localid, globalid)
+ return function(event)
+ local shortcut = ide.config.keymap[localid]
+ for id, obj in pairs(remap) do
+ if ide.config.keymap[id]:lower() == shortcut:lower() then
+ local focus = obj:FindFocus()
+ if focus and focus:GetId() == obj:GetId() then
+ obj:AddPendingEvent(wx.wxCommandEvent(wx.wxEVT_COMMAND_MENU_SELECTED, id))
+ return
+ -- also need to check for children of objects
+ -- to avoid re-triggering events when labels are being edited
+ elseif focus and focus:GetParent():GetId() == obj:GetId() then
+ return
+ end
+ end
+ end
+ rerouteMenuCommand(ide.frame, globalid)
+ end
+end
+
+local at = {}
+for lid in pairs(remap) do
+ local shortcut = ide.config.keymap[lid]
+ -- find a (potential) conflict for this shortcut (if any)
+ for gid, ksc in pairs(ide.config.keymap) do
+ -- if the same shortcut is used elsewhere (not one of IDs being checked)
+ if shortcut:lower() == ksc:lower() and not remap[gid] then
+ local fakeid = NewID()
+ ide.frame:Connect(fakeid, wx.wxEVT_COMMAND_MENU_SELECTED,
+ resolveConflict(lid, gid))
+
+ local ae = wx.wxAcceleratorEntry(); ae:FromString(ksc)
+ table.insert(at, wx.wxAcceleratorEntry(ae:GetFlags(), ae:GetKeyCode(), fakeid))
+ end
+ end
+end
+
+if ide.osname == 'Macintosh' then
+ table.insert(at, wx.wxAcceleratorEntry(wx.wxACCEL_CTRL, ('M'):byte(), ID_VIEWMINIMIZE))
+end
+ide.frame:SetAcceleratorTable(wx.wxAcceleratorTable(at))
+
+-- only set menu bar *after* postinit handler as it may include adding
+-- app-specific menus (Help/About), which are not recognized by MacOS
+-- as special items unless SetMenuBar is done after menus are populated.
+ide.frame:SetMenuBar(ide.frame.menuBar)
+
+ide:Print() -- flush pending output (if any)
+
+PackageEventHandle("onAppLoad")
+
+-- The status bar content is drawn incorrectly if it is shown
+-- after being initially hidden.
+-- Show the statusbar and hide it after showing the frame, which fixes the issue.
+local statusbarfix = ide.osname == 'Windows' and not ide.frame:GetStatusBar():IsShown()
+if statusbarfix then ide.frame:GetStatusBar():Show(true) end
+
+ide.frame:Show(true)
+
+if statusbarfix then ide.frame:GetStatusBar():Show(false) end
+
+-- somehow having wxAuiToolbar "steals" the focus from the editor on OSX;
+-- have to set the focus implicitly on the current editor (if any)
+if ide.osname == 'Macintosh' then
+ local editor = GetEditor()
+ if editor then editor:SetFocus() end
+end
+
+wx.wxGetApp():MainLoop()
+
+-- There are several reasons for this call:
+-- (1) to fix a crash on OSX when closing with debugging in progress.
+-- (2) to fix a crash on Linux 32/64bit during GC cleanup in wxlua
+-- after an external process has been started from the IDE.
+-- (3) to fix exit on Windows when started as "bin\lua src\main.lua".
+os.exit()
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/util.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/util.lua
new file mode 100644
index 0000000..ad4cbe3
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/util.lua
@@ -0,0 +1,645 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Lomtik Software (J. Winwood & John Labenski)
+-- Luxinia Dev (Eike Decker & Christoph Kubisch)
+-- David Manura
+---------------------------------------------------------
+
+-- Equivalent to C's "cond ? a : b", all terms will be evaluated
+function iff(cond, a, b) if cond then return a else return b end end
+
+function EscapeMagic(s) return s:gsub('([%(%)%.%%%+%-%*%?%[%^%$%]])','%%%1') end
+
+function GetPathSeparator()
+ return string.char(wx.wxFileName.GetPathSeparator())
+end
+
+do
+ local sep = GetPathSeparator()
+ function IsDirectory(dir) return dir:find(sep.."$") end
+end
+
+function StripCommentsC(tx)
+ local out = ""
+ local lastc = ""
+ local skip
+ local skipline
+ local skipmulti
+ local tx = string.gsub(tx, "\r\n", "\n")
+ for c in tx:gmatch(".") do
+ local oc = c
+ local tu = lastc..c
+ skip = c == '/'
+
+ if ( not (skipmulti or skipline)) then
+ if (tu == "//") then
+ skipline = true
+ elseif (tu == "/*") then
+ skipmulti = true
+ c = ""
+ elseif (lastc == '/') then
+ oc = tu
+ end
+ elseif (skipmulti and tu == "*/") then
+ skipmulti = false
+ c = ""
+ elseif (skipline and lastc == "\n") then
+ out = out.."\n"
+ skipline = false
+ end
+
+ lastc = c
+ if (not (skip or skipline or skipmulti)) then
+ out = out..oc
+ end
+ end
+
+ return out..lastc
+end
+
+-- http://lua-users.org/wiki/EnhancedFileLines
+function FileLines(f)
+ local CHUNK_SIZE = 1024
+ local buffer = ""
+ local pos_beg = 1
+ return function()
+ local pos, chars
+ while 1 do
+ pos, chars = buffer:match('()([\r\n].)', pos_beg)
+ if pos or not f then
+ break
+ elseif f then
+ local chunk = f:read(CHUNK_SIZE)
+ if chunk then
+ buffer = buffer:sub(pos_beg) .. chunk
+ pos_beg = 1
+ else
+ f = nil
+ end
+ end
+ end
+ if not pos then
+ pos = #buffer
+ elseif chars == '\r\n' then
+ pos = pos + 1
+ end
+ local line = buffer:sub(pos_beg, pos)
+ pos_beg = pos + 1
+ if #line > 0 then
+ return line
+ end
+ end
+end
+
+function PrependStringToArray(t, s, maxstrings, issame)
+ if string.len(s) == 0 then return end
+ for i = #t, 1, -1 do
+ local v = t[i]
+ if v == s or issame and issame(s, v) then
+ table.remove(t, i) -- remove old copy
+ -- don't break here in case there are multiple copies to remove
+ end
+ end
+ table.insert(t, 1, s)
+ if #t > (maxstrings or 15) then table.remove(t, #t) end -- keep reasonable length
+end
+
+function GetFileModTime(filePath)
+ if filePath and #filePath > 0 then
+ local fn = wx.wxFileName(filePath)
+ if fn:FileExists() then
+ return fn:GetModificationTime()
+ end
+ end
+
+ return nil
+end
+
+function GetFileExt(filePath)
+ local match = filePath and filePath:gsub("%s+$",""):match("%.([^./\\]*)$")
+ return match and match:lower() or ''
+end
+
+function GetFileName(filePath)
+ return filePath and filePath:gsub("%s+$",""):match("([^/\\]*)$") or ''
+end
+
+function IsLuaFile(filePath)
+ return filePath and (string.len(filePath) > 4) and
+ (string.lower(string.sub(filePath, -4)) == ".lua")
+end
+
+function GetPathWithSep(wxfn)
+ if type(wxfn) == 'string' then wxfn = wx.wxFileName(wxfn) end
+ return wxfn:GetPath(bit.bor(wx.wxPATH_GET_VOLUME, wx.wxPATH_GET_SEPARATOR))
+end
+
+function FileDirHasContent(dir)
+ local f = wx.wxFindFirstFile(dir, wx.wxFILE + wx.wxDIR)
+ return #f>0
+end
+
+function FileSysGetRecursive(path, recursive, spec, opts)
+ local content = {}
+ local showhidden = ide.config and ide.config.showhiddenfiles
+ local sep = GetPathSeparator()
+ -- trip trailing separator and adjust the separator in the path
+ path = path:gsub("[\\/]$",""):gsub("[\\/]", sep)
+ local queue = {path}
+ local pathpatt = "^"..EscapeMagic(path)..sep.."?"
+ local optyield = (opts or {}).yield
+ local optfolder = (opts or {}).folder ~= false
+ local optsort = (opts or {}).sort ~= false
+ local optpath = (opts or {}).path ~= false
+ local optskipbinary = (opts or {}).skipbinary
+ local optondirectory = (opts or {}).ondirectory
+
+ local function spec2list(spec, list)
+ -- return empty list if no spec is provided
+ if spec == nil or spec == "*" or spec == "*.*" then return {}, 0 end
+ -- accept "*.lua" and "*.txt,*.wlua" combinations
+ if type(spec) == 'table' then spec = table.concat(spec, ",") end
+ local masknum, list = 0, list or {}
+ for m in spec:gmatch("[^%s;,]+") do
+ m = m:gsub("[\\/]", sep)
+ if m:find("^%*%.%w+"..sep.."?$") then
+ list[m:sub(2)] = true
+ else
+ -- escape all special characters
+ -- and replace (escaped) ** with .* and (escaped) * with [^\//]*
+ table.insert(list, EscapeMagic(m)
+ :gsub("%%%*%%%*", ".*"):gsub("%%%*", "[^/\\]*").."$")
+ end
+ masknum = masknum + 1
+ end
+ return list, masknum
+ end
+
+ local inmasks, masknum = spec2list(spec)
+ if masknum >= 2 then spec = nil end
+
+ local exmasks = spec2list(ide.config.excludelist or {})
+ if optskipbinary then -- add any binary files to the list to skip
+ exmasks = spec2list(type(optskipbinary) == 'table' and optskipbinary
+ or ide.config.binarylist or {}, exmasks)
+ end
+
+ local function ismatch(file, inmasks, exmasks)
+ -- convert extension 'foo' to '.foo', as need to distinguish file
+ -- from extension with the same name
+ local ext = '.'..GetFileExt(file)
+ -- check exclusions if needed
+ if exmasks[file] or exmasks[ext] then return false end
+ for _, mask in ipairs(exmasks) do
+ if file:find(mask) then return false end
+ end
+
+ -- return true if none of the exclusions match and no inclusion list
+ if not inmasks or not next(inmasks) then return true end
+
+ -- now check inclusions
+ if inmasks[file] or inmasks[ext] then return true end
+ for _, mask in ipairs(inmasks) do
+ if file:find(mask) then return true end
+ end
+ return false
+ end
+
+ local function report(fname)
+ if optyield then return coroutine.yield(fname) end
+ table.insert(content, fname)
+ end
+
+ local dir = wx.wxDir()
+ local function getDir(path)
+ dir:Open(path)
+ if not dir:IsOpened() then
+ if DisplayOutputLn and TR then
+ DisplayOutputLn(TR("Can't open '%s': %s"):format(path, wx.wxSysErrorMsg()))
+ end
+ return
+ end
+
+ -- recursion is done in all folders if requested,
+ -- but only those folders that match the spec are returned
+ local _ = wx.wxLogNull() -- disable error reporting; will report as needed
+ local found, file = dir:GetFirst("*",
+ wx.wxDIR_DIRS + ((showhidden == true or showhidden == wx.wxDIR_DIRS) and wx.wxDIR_HIDDEN or 0))
+ while found do
+ local fname = path..sep..file
+ if optfolder and ismatch(fname..sep, inmasks, exmasks) then
+ report((optpath and fname or fname:gsub(pathpatt, ""))..sep)
+ end
+
+ if recursive and ismatch(fname..sep, nil, exmasks)
+ and (not optondirectory or optondirectory(fname) ~= false)
+ -- check if this name already appears in the path earlier;
+ -- Skip the processing if it does as it could lead to infinite
+ -- recursion with circular references created by symlinks.
+ and select(2, fname:gsub(EscapeMagic(file..sep),'')) <= 2 then
+ table.insert(queue, fname)
+ end
+ found, file = dir:GetNext()
+ end
+ found, file = dir:GetFirst(spec or "*",
+ wx.wxDIR_FILES + ((showhidden == true or showhidden == wx.wxDIR_FILES) and wx.wxDIR_HIDDEN or 0))
+ while found do
+ local fname = path..sep..file
+ if ismatch(fname, inmasks, exmasks) then
+ report(optpath and fname or fname:gsub(pathpatt, ""))
+ end
+ found, file = dir:GetNext()
+ end
+ end
+ while #queue > 0 do getDir(table.remove(queue)) end
+
+ if optyield then return end
+
+ if optsort then
+ local prefix = '\001' -- prefix to sort directories first
+ local shadow = {}
+ for _, v in ipairs(content) do
+ shadow[v] = (v:sub(-1) == sep and prefix or '')..v:lower()
+ end
+ table.sort(content, function(a,b) return shadow[a] < shadow[b] end)
+ end
+
+ return content
+end
+
+local normalflags = wx.wxPATH_NORM_ABSOLUTE + wx.wxPATH_NORM_DOTS + wx.wxPATH_NORM_TILDE
+function GetFullPathIfExists(p, f)
+ if not p or not f then return end
+ local file = wx.wxFileName(f)
+ -- Normalize call is needed to make the case of p = '/abc/def' and
+ -- f = 'xyz/main.lua' work correctly. Normalize() returns true if done.
+ return (file:Normalize(normalflags, p)
+ and file:FileExists()
+ and file:GetFullPath()
+ or nil)
+end
+
+function MergeFullPath(p, f)
+ if not p or not f then return end
+ local file = wx.wxFileName(f)
+ -- Normalize call is needed to make the case of p = '/abc/def' and
+ -- f = 'xyz/main.lua' work correctly. Normalize() returns true if done.
+ return (file:Normalize(normalflags, p)
+ and file:GetFullPath()
+ or nil)
+end
+
+function FileWrite(file, content)
+ local _ = wx.wxLogNull() -- disable error reporting; will report as needed
+
+ if not wx.wxFileExists(file)
+ and not wx.wxFileName(file):Mkdir(tonumber(755,8), wx.wxPATH_MKDIR_FULL) then
+ return nil, wx.wxSysErrorMsg()
+ end
+
+ local file = wx.wxFile(file, wx.wxFile.write)
+ if not file:IsOpened() then return nil, wx.wxSysErrorMsg() end
+
+ local ok = file:Write(content, #content) == #content
+ file:Close()
+ return ok, not ok and wx.wxSysErrorMsg() or nil
+end
+
+function FileSize(fname)
+ if not wx.wxFileExists(fname) then return end
+ local size = wx.wxFileSize(fname)
+ -- size can be returned as 0 for symlinks, so check with wxFile:Length();
+ -- can't use wxFile:Length() as it's reported incorrectly for some non-seekable files
+ -- (see https://github.com/pkulchenko/ZeroBraneStudio/issues/458);
+ -- the combination of wxFileSize and wxFile:Length() should do the right thing.
+ if size == 0 then size = wx.wxFile(fname, wx.wxFile.read):Length() end
+ return size
+end
+
+function FileRead(fname, length, callback)
+ -- on OSX "Open" dialog allows to open applications, which are folders
+ if wx.wxDirExists(fname) then return nil, "Can't read directory as file." end
+
+ local _ = wx.wxLogNull() -- disable error reporting; will report as needed
+ local file = wx.wxFile(fname, wx.wxFile.read)
+ if not file:IsOpened() then return nil, wx.wxSysErrorMsg() end
+
+ if type(callback) == 'function' then
+ length = length or 8192
+ local pos = 0
+ while true do
+ local len, content = file:Read(length)
+ local res, msg = callback(content) -- may return `false` to signal to stop
+ if res == false then return false, msg or "Unknown error" end
+ if len < length then break end
+ pos = pos + len
+ file:Seek(pos)
+ end
+ return true, wx.wxSysErrorMsg()
+ end
+
+ local _, content = file:Read(length or FileSize(fname))
+ file:Close()
+ return content, wx.wxSysErrorMsg()
+end
+
+function FileRemove(file)
+ local _ = wx.wxLogNull() -- disable error reporting; will report as needed
+ return wx.wxRemoveFile(file), wx.wxSysErrorMsg()
+end
+
+function FileRename(file1, file2)
+ local _ = wx.wxLogNull() -- disable error reporting; will report as needed
+ return wx.wxRenameFile(file1, file2), wx.wxSysErrorMsg()
+end
+
+function FileCopy(file1, file2)
+ local _ = wx.wxLogNull() -- disable error reporting; will report as needed
+ return wx.wxCopyFile(file1, file2), wx.wxSysErrorMsg()
+end
+
+local ok, socket = pcall(require, "socket")
+TimeGet = ok and socket.gettime or os.clock
+
+function IsBinary(text) return text:find("[^\7\8\9\10\12\13\27\32-\255]") and true or false end
+
+function pairsSorted(t, f)
+ local a = {}
+ for n in pairs(t) do table.insert(a, n) end
+ table.sort(a, f)
+ local i = 0 -- iterator variable
+ local iter = function () -- iterator function
+ i = i + 1
+ if a[i] == nil then return nil
+ else return a[i], t[a[i]]
+ end
+ end
+ return iter
+end
+
+function FixUTF8(s, repl)
+ local p, len, invalid = 1, #s, {}
+ while p <= len do
+ if s:find("^[%z\1-\127]", p) then p = p + 1
+ elseif s:find("^[\194-\223][\128-\191]", p) then p = p + 2
+ elseif s:find( "^\224[\160-\191][\128-\191]", p)
+ or s:find("^[\225-\236][\128-\191][\128-\191]", p)
+ or s:find( "^\237[\128-\159][\128-\191]", p)
+ or s:find("^[\238-\239][\128-\191][\128-\191]", p) then p = p + 3
+ elseif s:find( "^\240[\144-\191][\128-\191][\128-\191]", p)
+ or s:find("^[\241-\243][\128-\191][\128-\191][\128-\191]", p)
+ or s:find( "^\244[\128-\143][\128-\191][\128-\191]", p) then p = p + 4
+ else
+ if not repl then return end -- just signal invalid UTF8 string
+ local repl = type(repl) == 'function' and repl(s:sub(p,p)) or repl
+ s = s:sub(1, p-1)..repl..s:sub(p+1)
+ table.insert(invalid, p)
+ -- adjust position/length as the replacement may be longer than one char
+ p = p + #repl
+ len = len + #repl - 1
+ end
+ end
+ return s, invalid
+end
+
+function RequestAttention()
+ local frame = ide.frame
+ if not frame:IsActive() then
+ frame:RequestUserAttention()
+ if ide.osname == "Macintosh" then
+ local cmd = [[osascript -e 'tell application "%s" to activate']]
+ wx.wxExecute(cmd:format(ide.editorApp:GetAppName()), wx.wxEXEC_ASYNC)
+ elseif ide.osname == "Windows" then
+ if frame:IsIconized() then frame:Iconize(false) end
+ frame:Raise() -- raise the window
+
+ local winapi = require 'winapi'
+ if winapi then
+ local pid = winapi.get_current_pid()
+ local wins = winapi.find_all_windows(function(w)
+ return w:get_process():get_pid() == pid
+ and w:get_class_name() == 'wxWindowNR'
+ end)
+ if wins and #wins > 0 then
+ -- found the window, now need to activate it:
+ -- send some input to the window and then
+ -- bring our window to foreground (doesn't work without some input)
+ -- send Attn key twice (down and up)
+ winapi.send_to_window(0xF6, false)
+ winapi.send_to_window(0xF6, true)
+ for _, w in ipairs(wins) do w:set_foreground() end
+ end
+ end
+ end
+ end
+end
+
+function TR(msg, count)
+ local messages = ide.config.messages
+ local lang = ide.config.language
+ local counter = messages[lang] and messages[lang][0]
+ local message = messages[lang] and messages[lang][msg]
+ -- if there is count and no corresponding message, then
+ -- get the message from the (default) english language,
+ -- otherwise the message is not going to be pluralized properly
+ if count and (not message or type(message) == 'table' and not next(message)) then
+ message, counter = messages.en[msg], messages.en[0]
+ end
+ return count and counter and message and type(message) == 'table'
+ and message[counter(count)] or (type(message) == 'string' and message or msg)
+end
+
+-- wxwidgets 2.9.x may report the last folder twice (depending on how the
+-- user selects the folder), which makes the selected folder incorrect.
+-- check if the last segment is repeated and drop it.
+function FixDir(path)
+ if wx.wxDirExists(path) then return path end
+
+ local dir = wx.wxFileName.DirName(path)
+ local dirs = dir:GetDirs()
+ if #dirs > 1 and dirs[#dirs] == dirs[#dirs-1] then dir:RemoveLastDir() end
+ return dir:GetFullPath()
+end
+
+function ShowLocation(fname)
+ local osxcmd = [[osascript -e 'tell application "Finder" to reveal POSIX file "%s"']]
+ .. [[ -e 'tell application "Finder" to activate']]
+ local wincmd = [[explorer /select,"%s"]]
+ local lnxcmd = [[xdg-open "%s"]] -- takes path, not a filename
+ local cmd =
+ ide.osname == "Windows" and wincmd:format(fname) or
+ ide.osname == "Macintosh" and osxcmd:format(fname) or
+ ide.osname == "Unix" and lnxcmd:format(wx.wxFileName(fname):GetPath())
+ if cmd then wx.wxExecute(cmd, wx.wxEXEC_ASYNC) end
+end
+
+function LoadLuaFileExt(tab, file, proto)
+ local cfgfn,err = loadfile(file)
+ if not cfgfn then
+ ide:Print(("Error while loading file: '%s'."):format(err))
+ else
+ local name = file:match("([a-zA-Z_0-9%-]+)%.lua$")
+ if not name then return end
+
+ -- check if os/arch matches to allow packages for different systems
+ local osvals = {windows = true, unix = true, macintosh = true}
+ local archvals = {x64 = true, x86 = true}
+ local os, arch = name:match("-(%w+)-?(%w*)")
+ if os and os:lower() ~= ide.osname:lower() and osvals[os:lower()]
+ or arch and #arch > 0 and arch:lower() ~= ide.osarch:lower() and archvals[arch:lower()]
+ then return end
+ if os and osvals[os:lower()] then name = name:gsub("-.*","") end
+
+ local success, result = pcall(function()return cfgfn(assert(_G or _ENV))end)
+ if not success then
+ ide:Print(("Error while processing file: '%s'."):format(result))
+ else
+ if (tab[name]) then
+ local out = tab[name]
+ for i,v in pairs(result) do
+ out[i] = v
+ end
+ else
+ tab[name] = proto and result and setmetatable(result, proto) or result
+ if tab[name] then tab[name].fpath = file end
+ end
+ end
+ end
+ return tab
+end
+
+function LoadLuaConfig(filename,isstring)
+ if not filename then return end
+ -- skip those files that don't exist
+ if not isstring and not wx.wxFileExists(filename) then return end
+ -- if it's marked as command, but exists as a file, load it as a file
+ if isstring and wx.wxFileExists(filename) then isstring = false end
+
+ local cfgfn, err, msg
+ if isstring
+ then msg, cfgfn, err = "string", loadstring(filename)
+ else msg, cfgfn, err = "file", loadfile(filename) end
+
+ if not cfgfn then
+ ide:Print(("Error while loading configuration %s: '%s'."):format(msg, err))
+ else
+ setfenv(cfgfn,ide.config)
+ table.insert(ide.configqueue, filename)
+ local _, err = pcall(function()cfgfn(assert(_G or _ENV))end)
+ table.remove(ide.configqueue)
+ if err then
+ ide:Print(("Error while processing configuration %s: '%s'."):format(msg, err))
+ end
+ end
+ return true
+end
+
+function LoadSafe(data)
+ local f, res = loadstring(data)
+ if not f then return f, res end
+
+ local count = 0
+ debug.sethook(function ()
+ count = count + 1
+ if count >= 3 then error("cannot call functions") end
+ end, "c")
+ local ok, res = pcall(f)
+ count = 0
+ debug.sethook()
+ return ok, res
+end
+
+local function isCtrlFocused(e)
+ local ctrl = e and e:FindFocus()
+ return ctrl and
+ (ctrl:GetId() == e:GetId()
+ or ide.osname == 'Macintosh' and
+ ctrl:GetParent():GetId() == e:GetId()) and ctrl or nil
+end
+
+function GetEditorWithFocus(...)
+ -- need to distinguish GetEditorWithFocus() and GetEditorWithFocus(nil)
+ -- as the latter may happen when GetEditor() is passed and returns `nil`
+ if select('#', ...) > 0 then
+ local ed = ...
+ return isCtrlFocused(ed) and ed or nil
+ end
+
+ local editor = GetEditor()
+ if isCtrlFocused(editor) then return editor end
+
+ local nb = ide:GetOutputNotebook()
+ for p = 0, nb:GetPageCount()-1 do
+ local ctrl = nb:GetPage(p)
+ if ctrl:GetClassInfo():GetClassName() == "wxStyledTextCtrl"
+ and isCtrlFocused(ctrl) then
+ return ctrl:DynamicCast("wxStyledTextCtrl")
+ end
+ end
+ return nil
+end
+
+function GenerateProgramFilesPath(exec, sep)
+ local env = os.getenv('ProgramFiles')
+ return
+ (env and env..'\\'..exec..sep or '')..
+ [[C:\Program Files\]]..exec..sep..
+ [[D:\Program Files\]]..exec..sep..
+ [[C:\Program Files (x86)\]]..exec..sep..
+ [[D:\Program Files (x86)\]]..exec
+end
+
+--[[ format placeholders
+ - %f -- full project name (project path)
+ - %s -- short project name (directory name)
+ - %i -- interpreter name
+ - %S -- file name
+ - %F -- file path
+ - %n -- line number
+ - %c -- line content
+ - %T -- application title
+ - %v -- application version
+ - %t -- current tab name
+--]]
+function ExpandPlaceholders(msg, ph)
+ ph = ph or {}
+ if type(msg) == 'function' then return msg(ph) end
+ local editor = ide:GetEditor()
+ local proj = ide:GetProject() or ""
+ local dirs = wx.wxFileName(proj):GetDirs()
+ local doc = editor and ide:GetDocument(editor)
+ local nb = ide:GetEditorNotebook()
+ local def = {
+ f = proj,
+ s = dirs[#dirs] or "",
+ i = ide:GetInterpreter():GetName() or "",
+ S = doc and doc:GetFileName() or "",
+ F = doc and doc:GetFilePath() or "",
+ n = editor and editor:GetCurrentLine()+1 or 0,
+ c = editor and editor:GetLineDyn(editor:GetCurrentLine()) or "",
+ T = GetIDEString("editor") or "",
+ v = ide.VERSION,
+ t = editor and nb:GetPageText(nb:GetPageIndex(editor)) or "",
+ }
+ return(msg:gsub('%%(%w)', function(p) return ph[p] or def[p] or '?' end))
+end
+
+function MergeSettings(localSettings, savedSettings)
+ for name in pairs(localSettings) do
+ if savedSettings[name] ~= nil
+ and type(savedSettings[name]) == type(localSettings[name]) then
+ if type(localSettings[name]) == 'table'
+ and next(localSettings[name]) ~= nil then
+ -- check every value in the table to make sure that it's possible
+ -- to add new keys to the table and they get correct default values
+ -- (even though that are absent in savedSettings)
+ for setting in pairs(localSettings[name]) do
+ if savedSettings[name][setting] ~= nil then
+ localSettings[name][setting] = savedSettings[name][setting]
+ end
+ end
+ else
+ localSettings[name] = savedSettings[name]
+ end
+ end
+ end
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/src/version.lua b/love2dToAPK/tools/tools/zbstudio-old-win/src/version.lua
new file mode 100644
index 0000000..56bd1f9
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/src/version.lua
@@ -0,0 +1 @@
+ide.VERSION = [[1.30]] \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/tools/cg.lua b/love2dToAPK/tools/tools/zbstudio-old-win/tools/cg.lua
new file mode 100644
index 0000000..1dd4217
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/tools/cg.lua
@@ -0,0 +1,537 @@
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local binpath = ide.config.path.cgbin or os.getenv("CG_BIN_PATH")
+local cgprofile
+local cgglsles
+
+return binpath and {
+ fninit = function(frame,menuBar)
+ cgprofile = ide.config.cgprofile or "gp5"
+ cgglsles = ide.config.cgglsles
+
+ if (wx.wxFileName(binpath):IsRelative()) then
+ local editorDir = string.gsub(ide.editorFilename:gsub("[^/\\]+$",""),"\\","/")
+ binpath = editorDir..binpath
+ end
+
+ local myMenu = wx.wxMenu{
+ { ID "cg.profile.arb", "&ARB VP/FP", "ARB program profile", wx.wxITEM_CHECK },
+ { ID "cg.profile.glsl", "ARB &GLSL", "ARB GLSL program profile", wx.wxITEM_CHECK },
+ { ID "cg.profile.nv40", "NV VP/FP&40", "NV program sm3 profile", wx.wxITEM_CHECK },
+ { ID "cg.profile.gp4", "NV &GP4", "NV program sm4 profile", wx.wxITEM_CHECK },
+ { ID "cg.profile.gp5", "NV &GP5", "NV program sm5 profile", wx.wxITEM_CHECK },
+ { ID "cg.profile.dx_2x", "DX SM&2_x", "DirectX sm2_x profile", wx.wxITEM_CHECK },
+ { ID "cg.profile.dx_3", "DX SM&3_0", "DirectX sm3_0 profile", wx.wxITEM_CHECK },
+ { ID "cg.profile.dx_4", "DX SM&4_0", "DirectX sm4_0 profile", wx.wxITEM_CHECK },
+ { ID "cg.profile.dx_5", "DX SM&5_0", "DirectX sm5_0 profile", wx.wxITEM_CHECK },
+ { },
+ { ID "cg.compile.input", "&Custom Args", "when set a popup for custom compiler args will be envoked", wx.wxITEM_CHECK },
+ { ID "cg.compile.gles", "GLSL-ES", "When GLSL file is source use GLSL-ES path", wx.wxITEM_CHECK },
+ { },
+ { ID "cg.compile.vertex", "Compile &Vertex", "Compile Vertex program (select entry word)" },
+ { ID "cg.compile.fragment", "Compile &Fragment", "Compile Fragment program (select entry word)" },
+ { ID "cg.compile.geometry", "Compile &Geometry", "Compile Geometry program (select entry word)" },
+ { ID "cg.compile.tessctrl", "Compile T.Ctrl", "Compile T.Ctrl program (select entry word)" },
+ { ID "cg.compile.tesseval", "Compile T.Eval", "Compile T.Eval program (select entry word)" },
+ { ID "cg.compile.compute", "Compile Compute", "Compile Compute program (select entry word)" },
+ { },
+ { ID "cg.format.asm", "Annotate ASM", "indent and add comments to Cg ASM output" },
+ { ID "cg.format.master", "Build from master", "Creates a new cg file from a master containing special include instrctions." },
+ }
+ menuBar:Append(myMenu, "&Cg")
+
+ local data = {}
+ data.customarg = false
+ data.custom = ""
+ data.profid = ID ("cg.profile."..cgprofile)
+ data.gles = cgglsles and true or false
+ data.domains = {
+ [ID "cg.compile.vertex"] = 1,
+ [ID "cg.compile.fragment"] = 2,
+ [ID "cg.compile.geometry"] = 3,
+ [ID "cg.compile.tessctrl"] = 4,
+ [ID "cg.compile.tesseval"] = 5,
+ [ID "cg.compile.compute"] = 6,
+ }
+ data.profiles = {
+ [ID "cg.profile.arb"] = {"arbvp1","arbfp1",false,false,false,false,ext=".glp", asm=true,},
+ [ID "cg.profile.glsl"] = {"glslv","glslf","glslg",false,false,false,ext=".glsl"},
+ [ID "cg.profile.nv40"] = {"vp40","fp40",false,false,false,false,ext=".glp",nvperf=true, asm=true,},
+ [ID "cg.profile.gp4"] = {"gp4vp","gp4fp","gp4gp",false,false,false,ext=".glp",nvperf=true, asm=true,},
+ [ID "cg.profile.gp5"] = {"gp5vp","gp5fp","gp5gp","gp5tcp","gp5tep","gp5cp",ext=".glp", asm=true,},
+ [ID "cg.profile.dx_2x"] = {"vs_2_0","ps_2_x",false,false,false,false,ext=".txt"},
+ [ID "cg.profile.dx_3"] = {"vs_3_0","ps_3_0",false,false,false,false,ext=".txt"},
+ [ID "cg.profile.dx_4"] = {"vs_4_0","ps_4_0","gs_4_0",false,false,false,ext=".txt"},
+ [ID "cg.profile.dx_5"] = {"vs_5_0","ps_5_0","gs_5_0","ds_5_0","hs_5_0",false,ext=".txt"},
+ }
+ data.domaindefs = {
+ " -D_VERTEX_ ",
+ " -D_FRAGMENT_ ",
+ " -D_GEOMETRY_ ",
+ " -D_TESS_CONTROL_ ",
+ " -D_TESS_EVAL_ ",
+ " -D_COMPUTE_ ",
+ }
+ -- Profile related
+ menuBar:Check(data.profid, true)
+
+ local function selectProfile (id)
+ for id,profile in pairs(data.profiles) do
+ menuBar:Check(id, false)
+ end
+ menuBar:Check(id, true)
+ data.profid = id
+ end
+
+ menuBar:Check(ID "cg.compile.gles", data.gles)
+
+ local function evSelectProfile (event)
+ local chose = event:GetId()
+ selectProfile(chose)
+ end
+
+ for id,profile in pairs(data.profiles) do
+ frame:Connect(id,wx.wxEVT_COMMAND_MENU_SELECTED,evSelectProfile)
+ end
+
+ -- check for NvPerf
+ local perfexe = "/NVShaderPerf.exe"
+ local fn = wx.wxFileName(binpath..perfexe)
+ local hasperf = fn:FileExists()
+
+ -- master file generator
+
+ local function buildFromMaster(filenamein, filenameout)
+ local path = GetPathWithSep(filenamein)
+ if (not filenameout) then
+ local name = filenamein:GetName()
+ name = name:match("(.+).master$")
+ if (not name) then return end
+ filenameout = path..name.."."..filenamein:GetExt()
+ end
+
+ local masterfile = io.open(filenamein:GetFullPath(), "rb")
+ local outfile = io.open(filenameout, "wb")
+
+ local function out(str)
+ --str = string.match(str,"
+ return str
+ end
+
+ local function handleInclude(fname,defs)
+ local defcnt = 0
+ for i,v in pairs(defs) do
+ defcnt = defcnt + 1
+ end
+
+ local incfile = io.open(path..fname, "rb")
+ if (defcnt > 0) then
+ local write = nil
+ for line in FileLines(incfile) do
+ if (write) then
+ local cap = string.match(line,"#endif%s+//%s*([%w_]+)")
+ if (cap == write) then
+ outfile:write("//$"..write.." END$\n")
+ break
+ end
+ outfile:write(line)
+ else
+ local cap = string.match(line,"#ifdef%s+([%w_]+)")
+ if (cap and defs[cap]) then
+ write = cap
+ outfile:write("//$"..write.." BEGIN$\n")
+ end
+ end
+ end
+ else
+ for line in FileLines(incfile) do
+ outfile:write(line)
+ end
+ end
+
+ incfile:close()
+ end
+
+ DisplayOutput("Cg Master Generating...\n")
+ local master = nil
+ for line in FileLines(masterfile) do
+ local masterbegin = string.find(line,'//$MASTER-INCLUDE-BEGIN$',nil, true)
+ local masterend = string.find(line,'//$MASTER-INCLUDE-END$', nil, true)
+ if (masterbegin) then
+ master = {}
+ outfile:write(line)
+ elseif(masterend) then
+ master = nil
+ end
+
+ if (master) then
+ local linein = " "..line
+ local defadd = string.match(linein,'[^/]#define ([_%w]+)')
+ local defrem = string.match(linein,'[^/]#undef ([_%w]+)')
+ if (defadd) then master[defadd] = true end
+ if (defrem) then master[defrem] = nil end
+ DisplayOutput(defadd,defrem, "\n")
+
+ local incfile = string.match(linein,'[^/]#include "(.+)"')
+ if (incfile) then
+ handleInclude(incfile, master, "\n")
+ end
+ else
+ outfile:write(line)
+ end
+ end
+ DisplayOutput("Written:",filenameout,"\n")
+ outfile:close()
+ masterfile:close()
+ end
+
+ local function beautifyAsm(tx)
+ local newtx = ""
+ local indent = 0
+ local maxindent = 0
+ local startindent = {
+ ["IF"]=true,["REP"]=true,["ELSE"]=true,["LOOP"]=true,["BB"]=true,
+ }
+ local endindent = {
+ ["ENDIF"]=true,["ENDREP"]=true,["ELSE"]=true,["ENDLOOP"]=true,["END"]=true,["RET"]=true,
+ }
+
+ local function checknesting(str,tab)
+ local res
+ local chk = str:match("%s*(BB)%d+.*:")
+ chk = chk or str:match("%s*(%w+)")
+ res = chk and tab[chk] and chk
+
+ return res
+ end
+
+ local argregistry = {}
+ local argbuffersfixed = false
+
+ local registercc
+ local registermem
+
+ local function fixargbuffers()
+ if (argbuffersfixed) then return end
+
+ local argnew = {}
+ for i,v in pairs(argregistry) do
+ local buf,bufstart = string.match(i,"buf(%d+)%[(%d+)%]")
+ if (buf and bufstart) then
+ bufstart = tonumber(bufstart)/16
+ argnew["buf"..buf.."["..tostring(bufstart).."]"] = v
+ else
+ argnew[i] = v
+ end
+ end
+ argregistry = argnew
+ argbuffersfixed = true
+ end
+
+ local function checkregistry(w)
+ local regsuccess = true
+
+ local vtype,vname,sem,resource,pnum,pref = string.match(w,"#var ([_%w]+) ([%[%]%._%w]+) : ([^%:]*) : ([^%:]*) : ([^%:]*) : (%d*)")
+ local funcname,subroutine = string.match(w,"#function %d+ ([_%w]+)%((%d+)%)")
+ if (pref == "1") then
+ local descriptor = vtype.." "..vname
+
+ -- check if resource is array
+ local resstart,rescnt = string.match(resource,"c%[(%d+)%], (%d+)")
+ resstart = tonumber(resstart)
+ rescnt = tonumber(rescnt)
+
+ -- check if resource is buffer/buffer array
+ local buf,bufstart,bufcnt = string.match(resource,"buffer%[(%d+)%]%[(%d+)%],? ?(%d*)")
+ buf = tonumber(buf)
+ bufstart = tonumber(bufstart)
+ bufcnt = tonumber(bufcnt)
+
+ -- check if texture
+ local texnum = string.match(resource,"texunit (%d+)")
+
+ local argnames = {}
+ if (rescnt) then
+ for i=0,(rescnt-1) do
+ table.insert(argnames,"c["..tostring(resstart + i).."]")
+ end
+ elseif (texnum) then
+ table.insert(argnames,"texture["..tostring(texnum).."]")
+ table.insert(argnames,"texture"..tostring(texnum))
+ elseif (buf) then
+ table.insert(argnames,"buf"..tostring(buf).."["..tostring(bufstart).."]")
+ else
+ table.insert(argnames,resource)
+ end
+
+ for i,v in ipairs(argnames) do
+ argregistry[v] = descriptor
+ end
+ elseif (funcname and subroutine) then
+ argregistry["SUBROUTINENUM("..subroutine..")"] = "function "..funcname
+ elseif string.find(w,"BUFFER4") then
+ fixargbuffers()
+ elseif string.find(w,"TEMP") then
+ --TEMP R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11;
+ --TEMP RC, HC;
+ --TEMP lmem[9];
+ registercc = registercc or 0
+ for i in string.gmatch(w,"C") do
+ registercc = registercc + 1
+ end
+ registermem = tonumber(string.match(w,"lmem%[(%d+)%]"))
+ else
+ regsuccess = false
+ end
+
+ return regsuccess
+ end
+
+ local function checkargs(str)
+ local comment = "#"
+ local declared = {}
+ for i in string.gmatch(str,"([%[%]%(%)%w]+)") do
+ local descr = argregistry[i]
+ if (descr and not declared[i]) then
+ comment = comment.." "..i.." = "..descr
+ declared[i] = true
+ end
+ end
+
+ return comment ~= "#" and comment
+ end
+
+ local registerlevels = {{}}
+ local function checkregisters(str,indent)
+ if (indent < 0) then return end
+ local cur = registerlevels[indent+1]
+ for i in string.gmatch(str,"R(%d+)") do
+ cur[i] = true
+ end
+ end
+
+ local function clearregisters(indent)
+ registerlevels[math.max(0,indent)+1] = {}
+ end
+
+ local function outputregisters(indent)
+ if (indent < 0) then return "" end
+ local tab = registerlevels[indent+1]
+ local out = {}
+ for i,v in pairs(tab) do
+ table.insert(out,i)
+ end
+ table.sort(out)
+ local cnt = #out
+ if (cnt < 1) then return "" end
+
+ local str = string.rep(" ",indent).."# "..tostring(cnt).." R used: "
+ for i,v in ipairs(out) do
+ str = str..tostring(v)..((i==cnt) and "" or ", ")
+ end
+ return str.."\n"
+ end
+
+ -- check declarations
+ local lastline = ""
+ for w in string.gmatch(tx, "[^\n]*\n") do
+ if (not checkregistry(w)) then
+
+ if (checknesting(w,endindent)) then
+ newtx = newtx..outputregisters(indent)
+ if (indent == 0) then clearregisters(indent) end
+ indent = math.max(0,indent - 1)
+ end
+
+ local firstchar = string.sub(w,1,1)
+ local indentstr = (firstchar ~= " " and firstchar ~= "\t" and string.rep(" ",indent) or "")
+ local linestr = indentstr..w
+ local argcomment = (firstchar ~= "#") and checkargs(w)
+
+ checkregisters(w,indent)
+
+ newtx = newtx..(argcomment and (indentstr..argcomment.."\n") or "")
+ newtx = newtx..linestr
+
+ if (checknesting(w,startindent)) then
+ indent = indent + 1
+ maxindent = math.max(maxindent,indent)
+ clearregisters(indent)
+ end
+ else
+ newtx = newtx..w
+ end
+ lastline = w
+ end
+
+ local registers = tonumber(string.match(lastline, "(%d+) R%-regs")) or 0
+ registermem = registermem or 0
+ registercc = registercc or 0
+ local stats = "# "..tostring(registercc).." C-regs, "..tostring(registermem).." L-regs\n"
+ stats = stats.."# "..tostring(registercc + registermem + registers).." maximum registers\n"
+ stats = stats.."# "..maxindent.." maximum nesting level\n"
+ newtx = newtx..stats
+
+ return newtx,lastline..stats
+ end
+
+ local function beautifyAsmFile(filePath)
+ local file_text = ""
+ local statlines = ""
+ local handle = io.open(filePath, "rb")
+ if handle then
+ file_text = handle:read("*a")
+ file_text,statlines = beautifyAsm(file_text)
+ handle:close()
+ end
+
+ if (file_text == "") then return end
+
+ local handle = io.open(filePath, "wb")
+ if handle then
+ handle:write(file_text)
+ handle:close()
+ end
+ return statlines
+ end
+
+ -- Compile Arg
+ frame:Connect(ID "cg.compile.input",wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ data.customarg = event:IsChecked()
+ end)
+
+ frame:Connect(ID "cg.compile.gles",wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ data.gles = event:IsChecked()
+ end)
+ -- Compile
+ local function evCompile(event)
+ local filename,info = GetEditorFileAndCurInfo()
+ local editor = GetEditor()
+ local glsl = editor and editor.spec and editor.spec.apitype and editor.spec.apitype == "glsl"
+ local entryname = (glsl and "main" or info.selword)
+
+ if (not (filename and entryname and binpath)) then
+ DisplayOutput("Error: Cg Compile: Insufficient parameters (nofile / not selected entry function!\n")
+ return
+ end
+
+ local domain = data.domains[event:GetId()]
+ local profile = data.profiles[data.profid]
+ if (not profile[domain]) then return end
+
+ -- popup for custom input
+ data.custom = data.customarg and wx.wxGetTextFromUser("Compiler Args","Cg",data.custom) or data.custom
+ local args = data.customarg and data.custom or ""
+ args = args:len() > 0 and args or nil
+
+ local fullname = filename:GetFullPath()
+ local outname = fullname.."."..entryname.."^"
+ outname = args and outname..args:gsub("%s*[%-%/]",";-")..";^" or outname
+ outname = outname..profile[domain]..profile.ext
+ outname = '"'..outname..'"'
+
+ local cmdglsl = data.gles and "-ogles -glslWerror -DGL_ES" or "-oglsl -glslWerror -po PaBO2 "
+ local cmdline = ' "'..fullname..'" -profile '..profile[domain].." "
+ cmdline = glsl and cmdline..cmdglsl or cmdline
+ cmdline = glsl and (data.profid == (ID "cg.profile.gp5")) and cmdline.."-po NV_shader_atomic_float -po NV_bindless_texture " or cmdline
+ cmdline = args and cmdline..args.." " or cmdline
+ cmdline = cmdline..data.domaindefs[domain]
+ cmdline = cmdline.."-o "..outname.." "
+ cmdline = cmdline.."-entry "..entryname
+
+ cmdline = binpath.."/cgc.exe"..cmdline
+
+ local function nvperfcallback(str)
+ local pixels = string.match(str,"([,%d]+) pixels/s")
+ pixels = pixels and string.gsub(pixels,",","")
+ pixels = tonumber(pixels)
+ local function tostr(num)
+ return string.format("%.2f",num)
+ end
+
+ -- delete .cgbin file
+ local binname,ext = fullname:match("(.*)%.([a-zA-Z_0-9]+)$")
+ binname = binname..".cgbin"
+ wx.wxRemoveFile(binname)
+
+ if (pixels ~= nil) then
+ local str = string.match(str,("(.* pixels/s)"))
+ local info = "1920x1080: "..tostr(pixels/(1920*1080)).." Hz\n"
+ info = info.."1280x1024: "..tostr(pixels/(1280*1024)).." Hz\n"
+ str = (str.."\n"..info)
+ return str
+ else
+ return str.."\n"
+ end
+ end
+
+ local function compilecallback(str)
+ local postfunc
+ -- check for errors, if none, launch nvperf
+ -- and indentation
+ if (string.find(str," 0 errors.")) then
+ postfunc = function()
+ -- beautify asm
+ if (profile.asm) then
+ local statlines = beautifyAsmFile(outname:sub(2,-2))
+ DisplayOutput(statlines)
+ end
+
+ -- optionally run perf process
+ local cgperfgpu = ide.config.cgperfgpu or "G80"
+ local profiletypes = {
+ ["G70"] = {},
+ ["G80"] = {
+ ["vp40"] = " -profile vp40",
+ ["fp40"] = " -profile fp40"},
+ }
+ if (hasperf and (not glsl) and profile.nvperf and (domain == 1 or domain == 2)
+ and profiletypes[cgperfgpu])
+ then
+ local domaintypes = {"cg_vp","cg_fp",}
+ local cmdline = " -gpu "..cgperfgpu.." -type "..domaintypes[domain]
+ cmdline = cmdline.." -function "..info.selword
+ cmdline = cmdline..(profiletypes[cgperfgpu][profile[domain]] or "")
+ cmdline = cmdline..' "'..fullname..'"'
+
+ cmdline = binpath..perfexe..cmdline
+ CommandLineRun(cmdline,nil,true,nil,nvperfcallback)
+ end
+ end
+ end
+
+ return str,postfunc
+ end
+
+ -- run compiler process
+ CommandLineRun(cmdline,nil,true,nil,compilecallback)
+
+ end
+
+ frame:Connect(ID "cg.compile.vertex",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "cg.compile.fragment",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "cg.compile.geometry",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "cg.compile.tessctrl",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "cg.compile.tesseval",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "cg.compile.compute",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+
+ -- indent asm
+ frame:Connect(ID "cg.format.asm", wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ local curedit = GetEditor()
+ local newtx = beautifyAsm( curedit:GetText() )
+
+ curedit:SetText(newtx)
+ end)
+
+ -- master file
+ frame:Connect(ID "cg.format.master", wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(even)
+ local filename,info = GetEditorFileAndCurInfo()
+ buildFromMaster(filename)
+ end)
+ end,
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/tools/clcc.lua b/love2dToAPK/tools/tools/zbstudio-old-win/tools/clcc.lua
new file mode 100644
index 0000000..f4082f2
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/tools/clcc.lua
@@ -0,0 +1,67 @@
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local binpath = ide.config.path.clccbin or os.getenv("CLCC_BIN_PATH")
+
+return binpath and {
+ fninit = function(frame,menuBar)
+
+ if (wx.wxFileName(binpath):IsRelative()) then
+ local editorDir = string.gsub(ide.editorFilename:gsub("[^/\\]+$",""),"\\","/")
+ binpath = editorDir..binpath
+ end
+
+ local myMenu = wx.wxMenu{
+ { ID "cl.allplatforms", "&All", "Compiled with all available platforms (otherwise only first)", wx.wxITEM_CHECK },
+ { ID "cl.output", "&Output", "Generates output files", wx.wxITEM_CHECK },
+ { ID "cl.info", "&Info", "Prints Info", wx.wxITEM_CHECK },
+ { },
+ { ID "cl.compile", "&Compile", "Compile Kernels in File" },
+ }
+ menuBar:Append(myMenu, "&OpenCL")
+
+ local data = {
+ allplatforms = false,
+ output = false,
+ info = false,
+ }
+
+ -- Compile Arg
+ frame:Connect(ID "cl.allplatforms",wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ data.allplatforms = event:IsChecked()
+ end)
+ frame:Connect(ID "cl.output",wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ data.output = event:IsChecked()
+ end)
+ frame:Connect(ID "cl.info",wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ data.info = event:IsChecked()
+ end)
+ -- Compile
+ local function evCompile(event)
+ local filename,info = GetEditorFileAndCurInfo()
+ local editor = GetEditor()
+
+ if (not (filename)) then
+ DisplayOutput("Error: OpenCL Compile: Insufficient parameters (nofile)!\n")
+ return
+ end
+
+ local fullname = filename:GetFullPath()
+ local cmdline = " "
+ cmdline = cmdline..(data.allplatforms and "--platform -1 " or "")
+ cmdline = cmdline..(data.info and "--info " or "")
+ cmdline = cmdline..(data.output and "--output " or "")
+ cmdline = cmdline..'"'..fullname..'"'
+
+ cmdline = binpath.."/clcc.exe"..cmdline
+
+ -- run compiler process
+ CommandLineRun(cmdline,nil,true,nil,nil)
+ end
+
+ frame:Connect(ID "cl.compile",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ end,
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/tools/cstringify.lua b/love2dToAPK/tools/tools/zbstudio-old-win/tools/cstringify.lua
new file mode 100644
index 0000000..a650a77
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/tools/cstringify.lua
@@ -0,0 +1,21 @@
+local function cstringify()
+ local editor = GetEditor()
+ if (not editor) then end
+ local tx = editor:GetText()
+ local new = ""
+ for l in tx:gmatch("([^\r\n]*)([\r]?[\n]?)") do
+ l = l:gsub('\\','\\\\')
+ l = l:gsub('"','\\"')
+ new = new..'"'..l..'\\n"'.."\n"
+ end
+ -- replace text
+ editor:SetText(new)
+end
+
+return {
+ exec = {
+ name = "stringify to C",
+ description = "stringifys the content for use in C",
+ fn = cstringify,
+ },
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/tools/dx.lua b/love2dToAPK/tools/tools/zbstudio-old-win/tools/dx.lua
new file mode 100644
index 0000000..1753e0e
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/tools/dx.lua
@@ -0,0 +1,157 @@
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local binpath = ide.config.path.fxcbin or (os.getenv("DXSDK_DIR") and os.getenv("DXSDK_DIR").."/Utilities/bin/x86/")
+local dxprofile
+
+return binpath and {
+ fninit = function(frame,menuBar)
+ dxprofile = ide.config.dxprofile or "dx_5"
+
+ if (wx.wxFileName(binpath):IsRelative()) then
+ local editorDir = string.gsub(ide.editorFilename:gsub("[^/\\]+$",""),"\\","/")
+ binpath = editorDir..binpath
+ end
+
+ local myMenu = wx.wxMenu{
+ { ID "dx.profile.dx_2x", "DX SM&2_x", "DirectX sm2_x profile", wx.wxITEM_CHECK },
+ { ID "dx.profile.dx_3", "DX SM&3_0", "DirectX sm3_0 profile", wx.wxITEM_CHECK },
+ { ID "dx.profile.dx_4", "DX SM&4_0", "DirectX sm4_0 profile", wx.wxITEM_CHECK },
+ { ID "dx.profile.dx_5", "DX SM&5_0", "DirectX sm5_0 profile", wx.wxITEM_CHECK },
+ { },
+ { ID "dx.compile.input", "Custom &Args", "when set a popup for custom compiler args will be envoked", wx.wxITEM_CHECK },
+ { ID "dx.compile.binary", "&Binary", "when set compiles binary output", wx.wxITEM_CHECK },
+ { ID "dx.compile.legacy", "&Legacy", "when set compiles in legacy mode", wx.wxITEM_CHECK },
+ { ID "dx.compile.backwards", "Backwards Compatibility", "when set compiles in backwards compatibility mode", wx.wxITEM_CHECK },
+ { },
+ { ID "dx.compile.vertex", "Compile &Vertex", "Compile Vertex shader (select entry word)" },
+ { ID "dx.compile.fragment", "Compile &Fragment", "Compile pixel shader (select entry word)" },
+ { ID "dx.compile.geometry", "Compile &Geometry", "Compile Geometry shader (select entry word)" },
+ { ID "dx.compile.domain", "Compile &Domain", "Compile Domain shader (select entry word)" },
+ { ID "dx.compile.hull", "Compile &Hull", "Compile Hull shader (select entry word)" },
+ { ID "dx.compile.compute", "Compile &Compute", "Compile Compute shader (select entry word)" },
+ { ID "dx.compile.effects", "Compile &Effects", "Compile all effects in shader" },
+ }
+ menuBar:Append(myMenu, "&Dx")
+
+ local data = {}
+ data.customarg = false
+ data.custom = ""
+ data.legacy = false
+ data.backwards = false
+ data.binary = false
+ data.profid = ID ("dx.profile."..dxprofile)
+ data.domains = {
+ [ID "dx.compile.vertex"] = 1,
+ [ID "dx.compile.fragment"] = 2,
+ [ID "dx.compile.geometry"] = 3,
+ [ID "dx.compile.domain"] = 4,
+ [ID "dx.compile.hull"] = 5,
+ [ID "dx.compile.compute"] = 6,
+ [ID "dx.compile.effects"] = 7,
+ }
+ data.profiles = {
+ [ID "dx.profile.dx_2x"] = {"vs_2_0","ps_2_x",false,false,false,false,"fx_2_x",ext=".fxc."},
+ [ID "dx.profile.dx_3"] = {"vs_3_0","ps_3_0",false,false,false,false,"fx_3_0",ext=".fxc."},
+ [ID "dx.profile.dx_4"] = {"vs_4_0","ps_4_0","gs_4_0",false,false,false,"fx_4_0",ext=".fxc."},
+ [ID "dx.profile.dx_5"] = {"vs_5_0","ps_5_0","gs_5_0","ds_5_0","hs_5_0","cs_5_0","fx_5_0",ext=".fxc."},
+ }
+ data.domaindefs = {
+ " /D _VERTEX_=1 /D _DX_=1 ",
+ " /D _FRAGMENT_=1 /D _DX_=1 ",
+ " /D _GEOMETRY_=1 /D _DX_=1 ",
+ " /D _TESS_CONTROL_=1 /D _DX_=1 ",
+ " /D _TESS_EVAL_=1 /D _DX_=1 ",
+ " /D _COMPUTE_=1 /D _DX_=1 ",
+ " /D _EFFECTS_=1 /D _DX_=1 ",
+ }
+ -- Profile related
+ menuBar:Check(data.profid, true)
+
+ local function selectProfile (id)
+ for id,profile in pairs(data.profiles) do
+ menuBar:Check(id, false)
+ end
+ menuBar:Check(id, true)
+ data.profid = id
+ end
+
+ local function evSelectProfile (event)
+ local chose = event:GetId()
+ selectProfile(chose)
+ end
+
+ for id,profile in pairs(data.profiles) do
+ frame:Connect(id,wx.wxEVT_COMMAND_MENU_SELECTED,evSelectProfile)
+ end
+
+ -- Compile Arg
+ frame:Connect(ID "dx.compile.input",wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ data.customarg = event:IsChecked()
+ end)
+ frame:Connect(ID "dx.compile.legacy",wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ data.legacy = event:IsChecked()
+ end)
+ frame:Connect(ID "dx.compile.backwards",wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ data.backwards = event:IsChecked()
+ end)
+ frame:Connect(ID "dx.compile.binary",wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ data.binary = event:IsChecked()
+ end)
+ -- Compile
+ local function evCompile(event)
+ local filename,info = GetEditorFileAndCurInfo()
+ local editor = GetEditor()
+ local domain = data.domains[event:GetId()]
+
+ if (not (filename and binpath) or not (domain == 7 or info.selword )) then
+ DisplayOutput("Error: Dx Compile: Insufficient parameters (nofile / no selected entry function!\n")
+ return
+ end
+
+
+ local profile = data.profiles[data.profid]
+ if (not profile[domain]) then return end
+
+ -- popup for custom input
+ data.custom = data.customarg and wx.wxGetTextFromUser("Compiler Args","Dx",data.custom) or data.custom
+ local args = data.custom:len() > 0 and data.custom or nil
+
+ local fullname = filename:GetFullPath()
+
+ local outname = fullname.."."..(info.selword or "").."^"
+ outname = args and outname..args:gsub("%s*[%-%/]",";-")..";^" or outname
+ outname = outname..profile[domain]..profile.ext..(data.binary and "fxo" or "txt")
+ outname = '"'..outname..'"'
+
+ local cmdline = " /T "..profile[domain].." "
+ cmdline = cmdline..(args and args.." " or "")
+ cmdline = cmdline..(data.legacy and "/LD " or "")
+ cmdline = cmdline..(data.backwards and "/Gec " or "")
+ cmdline = cmdline..(data.domaindefs[domain])
+ cmdline = cmdline..(data.binary and "/Fo " or "/Fc ")..outname.." "
+ if (info.selword) then
+ cmdline = cmdline.."/E "..info.selword.." "
+ end
+ cmdline = cmdline.."/nologo "
+ cmdline = cmdline..' "'..fullname..'"'
+
+ cmdline = binpath.."/fxc.exe"..cmdline
+
+ -- run compiler process
+ CommandLineRun(cmdline,nil,true,nil,nil)
+ end
+
+ frame:Connect(ID "dx.compile.vertex",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "dx.compile.fragment",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "dx.compile.geometry",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "dx.compile.domain",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "dx.compile.hull",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "dx.compile.compute",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "dx.compile.effects",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ end,
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/tools/ffitoapi.lua b/love2dToAPK/tools/tools/zbstudio-old-win/tools/ffitoapi.lua
new file mode 100644
index 0000000..326a7d9
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/tools/ffitoapi.lua
@@ -0,0 +1,313 @@
+-- author: Christoph Kubisch
+---------------------------------------------------------
+local StripCommentsC = StripCommentsC
+if not StripCommentsC then
+ StripCommentsC = function(tx)
+ local out = ""
+ local lastc = ""
+ local skip
+ local skipline
+ local skipmulti
+ local tx = string.gsub(tx, "\r\n", "\n")
+ for c in tx:gmatch(".") do
+ local oc = c
+ local tu = lastc..c
+ skip = c == '/'
+
+ if ( not (skipmulti or skipline)) then
+ if (tu == "//") then
+ skipline = true
+ elseif (tu == "/*") then
+ skipmulti = true
+ c = ""
+ elseif (lastc == '/') then
+ oc = tu
+ end
+ elseif (skipmulti and tu == "*/") then
+ skipmulti = false
+ c = ""
+ elseif (skipline and lastc == "\n") then
+ out = out.."\n"
+ skipline = false
+ end
+
+ lastc = c
+ if (not (skip or skipline or skipmulti)) then
+ out = out..oc
+ end
+ end
+
+ return out..lastc
+ end
+
+end
+
+local function ffiToApi(ffidef)
+ local str = ffidef
+ str = ffidef:match("(%-%-%[%[.+%]%])")
+ local header = ffidef:match("[^\r\n]+")
+ ffidef = StripCommentsC(ffidef)
+
+ local description = header:match("|%s*(.*)")
+ local descrprefixes = header:match("(.-)%s*|")
+ if not descrprefixes then return end
+
+ local prefixes = {}
+ for prefix in descrprefixes:gmatch("([_%w]+)") do
+ table.insert(prefixes,prefix)
+ end
+ local ns = prefixes[1]
+ if not ns then return end
+
+ local lktypes = {
+ ["string"] = "string",
+ }
+
+ local function gencontent(tx)
+ local enums = {}
+ local funcs = {}
+ local values = {}
+ local classes = {}
+
+ -- extract function names
+ local curfunc
+ local function registerfunc()
+ local fn = curfunc
+ -- parse args
+ local args = fn.ARGS:match("%(%s*(.-)%s*%)%s*;") or ""
+ fn.ARGS = "("..args..")"
+
+ -- skip return void types
+ local what = fn.RET == "void" and "" or fn.RET
+ what = what:match("%s*(.-)%s*$")
+ fn.RET = "("..what..")"
+ fn.DESCR = ""
+ if (what ~= "") then
+ fn.TYPE = what
+ end
+
+ table.insert(funcs,curfunc)
+ curfunc = nil
+ end
+
+ local outer = tx:gsub("(%b{})","{}")
+
+ -- FIXME pattern doesnt recognize multiline defs
+ for l in outer:gmatch("[^\r\n]+") do
+ -- extern void func(blubb);
+ -- extern void ( * func )(blubb);
+ -- void func(blubb);
+ -- void ( * func )(blubb);
+ -- void * ( * func )(blubb);
+ local typedef = l:match("typedef")
+ local ret,name,args = string.match(typedef and "" or l,
+ "%s*([_%w%*%s]+)%s+%(?[%s%*]*([_%w]+)%s*%)?%s*(%([^%(]*;)")
+
+ if (not (curfunc or typedef) and (ret and name and args)) then
+ ret = ret:gsub("^%s*extern%s*","")
+ curfunc = {RET=ret,NAME=name,ARGS=args}
+ registerfunc()
+ elseif (not typedef) then
+ local typ,names,val = l:match("%s*([_%w%s%*]+)%s+([_%w%[%]]+)[\r\n%s]*=[\r\n%s]*([_%w]+)[\r\n%s]*;")
+ if (not (typ and names and val)) then
+ typ,names = l:match("%s*([_%w%s%*]+)%s+([_%w%[%]%:%s,]+)[\r\n%s]*;")
+ end
+ if (typ and names) then
+ for name,rest in names:gmatch("([_%w]+)([^,]*)") do
+ rest = rest and rest:gsub("%s","") or ""
+ local what = typ..(rest:gsub("%b[]","*"))
+ table.insert(values,{NAME=name, DESCR=(typ..rest..(val and (" = "..val) or "")), TYPE = what,})
+ end
+ end
+ elseif(typedef) then
+ -- typedef struct lxgTextureUpdate_s * lxgTextureUpdatePTR;
+ -- typedef float lxVector2[2];
+ local what,name = l:match("typedef%s+([_%w%s%*]-)%s+([_%w%[%]]+)%s*;")
+ if (what and name) then
+ what = what:gsub("const%s","")
+ what = what:gsub("static%s","")
+ what = what:gsub("%s+"," ")
+ what = what:gsub("%s+%*","*")
+ local name,rest = name:match("([_%w]+)(.*)")
+ rest = rest and rest:gsub("%s","") or ""
+ if (what and name) then
+ lktypes[name] = what..(rest:gsub("%b[]","*"))
+ end
+ end
+ end
+ end
+
+ -- search for enums
+ for def in tx:gmatch("enum[_%w%s\r\n]*(%b{})[_%w%s\r\n]*;") do
+ for enum in def:gmatch("([_%w]+).-[,}]") do
+ table.insert(enums,{NAME=enum})
+ end
+ end
+
+ -- search for classes
+ for class,def,final in tx:gmatch("struct%s+([_%w]*)[%s\r\n]*(%b{})([_%w%s\r\n]*);") do
+ final = final:match("[_%w]+")
+ if (final) then
+ lktypes["struct "..class] = ns.."."..final
+ lktypes[final] = ns.."."..final
+ lktypes[ns.."."..final] = ns.."."..final
+ else
+ lktypes["struct "..class] = ns.."."..class
+ lktypes[ns.."."..class] = ns.."."..class
+ end
+ table.insert(classes,{NAME= final or class,DESCR = "",content = gencontent(def:sub(2,-2))})
+ end
+
+ return (#classes > 0 or #funcs > 0 or #enums > 0 or #values > 0) and
+ {classes=classes,funcs=funcs, enums=enums, values=values}
+ end
+
+ local content = gencontent(ffidef)
+ local function fixtypes(tab)
+ for i,v in ipairs(tab) do
+ local vt = v.TYPE
+ if (vt) then
+ local nt = vt
+
+ repeat
+ nt = nt:match("%s*(.-)%s*$")
+ nt = nt:gsub("%s+"," ")
+ nt = nt:gsub("%s%*","*")
+ nt = nt == "const char*" and "string" or nt
+ nt = nt:gsub("%*","")
+ nt = nt:gsub("const%s","")
+ nt = nt:gsub("static%s","")
+ vt = nt
+ local typ,qual = nt:match("([_%w%.%s]+)(%**)")
+ nt = (lktypes[typ] or "")..(qual or "")
+ until nt==vt
+ v.TYPE = nt ~= "" and '"'..nt..'"' or "nil"
+ else
+ v.TYPE = "nil"
+ end
+ end
+ end
+ local function fixcontent(tab)
+ fixtypes(tab.values)
+ fixtypes(tab.funcs)
+ for i,v in ipairs(tab.classes) do
+ fixcontent(v.content)
+ end
+ end
+ fixcontent(content)
+
+ str = str..[[
+
+ --auto-generated api from ffi headers
+ local api =
+ ]]
+
+ -- serialize api string
+ local function serialize(str,id,tab,lvl)
+ lvl = string.rep(" ",lvl or 1)
+ for i,k in ipairs(tab) do
+ str = str..string.gsub(id,"%$([%w]+)%$",k):gsub("##",lvl)
+ end
+ return str
+ end
+
+ local function genapi(str,content,lvl)
+ lvl = lvl or 1
+ str = str..string.gsub([[
+ ##{
+ ]],"##",string.rep(" ",lvl))
+
+ local value =
+ [[##["$NAME$"] = { type ='value', description = "$DESCR$", valuetype = $TYPE$, },
+ ]]
+ local enum =
+ [[##["$NAME$"] = { type ='value', },
+ ]]
+ local funcdef =
+ [[##["$NAME$"] = { type ='function',
+ ## description = "$DESCR$",
+ ## returns = "$RET$",
+ ## valuetype = $TYPE$,
+ ## args = "$ARGS$", },
+ ]]
+ str = serialize(str,value,content.values or {},lvl)
+ str = serialize(str,enum,content.enums or {},lvl)
+ str = serialize(str,funcdef,content.funcs or {},lvl)
+
+ local classdef =
+ [[##["$NAME$"] = { type ='class',
+ ## description = "$DESCR$",
+ ## $CHILDS$
+ ##},
+ ]]
+ for i,v in pairs(content.classes or {}) do
+ v.CHILDS = v.content and genapi("childs = ",v.content,lvl+1) or ""
+ end
+
+ str = serialize(str,classdef,content.classes or {},lvl)
+
+ str = str..string.gsub([[
+ ##}]],"##",string.rep(" ",lvl))
+
+ return str
+ end
+
+ str = genapi(str,content)
+
+ str = str..[[
+
+ return {
+ ]]
+
+ local lib =
+ [[
+ $NAME$ = {
+ type = 'lib',
+ description = "$DESCR$",
+ childs = $API$,
+ },
+ ]]
+
+ local libs = {}
+ for i,prefix in ipairs(prefixes) do
+ local p = {NAME=prefix, DESCR = description, API="api"}
+ table.insert(libs,p)
+ end
+
+ str = serialize(str,lib,libs)
+ str = str..[[
+ }
+ ]]
+
+ return str
+end
+
+local function exec(wxfname,projectdir)
+ -- get cur editor text
+ local editor = GetEditor()
+ if (not editor) then return end
+ local tx = editor:GetText()
+ tx = ffiToApi(tx)
+ -- replace text
+ if tx then editor:SetText(tx) end
+end
+
+if (not ide) then
+ ffitoapi = function(fname)
+ local f = io.open(fname,"rb")
+ local tx = f:read("*a")
+ f:close()
+ tx = ffiToApi(tx)
+ local f = io.open(fname,"wb")
+ f:write(tx)
+ f:close()
+ end
+end
+
+return {
+ exec = {
+ name = "luajit ffi string to editor api",
+ description = "converts current file to api, for autocompletion inside this editor",
+ fn = exec,
+ },
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/tools/glslc.lua b/love2dToAPK/tools/tools/zbstudio-old-win/tools/glslc.lua
new file mode 100644
index 0000000..45ae1ad
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/tools/glslc.lua
@@ -0,0 +1,470 @@
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local binpath = ide.config.path.glslcbin or os.getenv("GLSLC_BIN_PATH")
+
+return binpath and {
+ fninit = function(frame,menuBar)
+
+ if (wx.wxFileName(binpath):IsRelative()) then
+ local editorDir = string.gsub(ide.editorFilename:gsub("[^/\\]+$",""),"\\","/")
+ binpath = editorDir..binpath
+ end
+
+ local myMenu = wx.wxMenu{
+ { ID "glslc.compile.input", "&Custom Args", "when set a popup for custom compiler args will be envoked", wx.wxITEM_CHECK },
+ { ID "glslc.compile.separable", "Separable", "when set separable programs are used", wx.wxITEM_CHECK },
+ { ID "glslc.compile.preproc", "Preprocess File", "Pre-process the files only, resolving #inlcudes", wx.wxITEM_CHECK },
+ { },
+ { ID "glslc.compile.ext", "Compile from .ext\tCtrl-1", "Compile based on file extension" },
+ { ID "glslc.compile.all", "Link multiple .ext\tCtrl-2", "Tries to link multiple shaders based on filename" },
+ { ID "glslc.compile.vertex", "Compile &Vertex", "Compile Vertex program" },
+ { ID "glslc.compile.fragment", "Compile &Fragment", "Compile Fragment program" },
+ { ID "glslc.compile.geometry", "Compile &Geometry", "Compile Geometry program" },
+ { ID "glslc.compile.tessctrl", "Compile T.Ctrl", "Compile T.Ctrl program" },
+ { ID "glslc.compile.tesseval", "Compile T.Eval", "Compile T.Eval program" },
+ { ID "glslc.compile.compute", "Compile Compute", "Compile Compute program" },
+ { },
+ { ID "glslc.format.asm", "Annotate ASM", "indent and add comments to ASM output" },
+ }
+ menuBar:Append(myMenu, "&GLSL")
+
+ local data = {}
+ data.customarg = false
+ data.separable = false
+ data.preproc = false
+ data.custom = ""
+ data.domains = {
+ [ID "glslc.compile.vertex"] = 1,
+ [ID "glslc.compile.fragment"] = 2,
+ [ID "glslc.compile.geometry"] = 3,
+ [ID "glslc.compile.tessctrl"] = 4,
+ [ID "glslc.compile.tesseval"] = 5,
+ [ID "glslc.compile.compute"] = 6,
+ }
+ data.domainprofiles = {
+ "vertex",
+ "fragment",
+ "geometry",
+ "tesscontrol",
+ "tessevaluation",
+ "compute",
+ }
+ data.domaindefs = {
+ " -D_VERTEX_ ",
+ " -D_FRAGMENT_ ",
+ " -D_GEOMETRY_ ",
+ " -D_TESS_CONTROL_ ",
+ " -D_TESS_EVAL_ ",
+ " -D_COMPUTE_ ",
+ }
+
+ local function beautifyAsmEach(tx)
+ local newtx = ""
+ local indent = 0
+ local maxindent = 0
+ local isbranch = {
+ ["IF"]=true,["REP"]=true,["ELSE"]=true,["LOOP"]=true,
+ }
+ local startindent = {
+ ["IF"]=true,["REP"]=true,["ELSE"]=true,["LOOP"]=true,["BB"]=true,
+ }
+ local endindent = {
+ ["ENDIF"]=true,["ENDREP"]=true,["ELSE"]=true,["ENDLOOP"]=true,["END"]=true,["RET"]=true,
+ }
+
+ local function check(str,tab)
+ local res
+ local chk = str:match("%s*(BB)%d+.*:")
+ chk = chk or str:match("%s*(%w+)")
+ res = chk and tab[chk] and chk
+
+ return res
+ end
+
+ local argregistry = {}
+ local argbuffersfixed = false
+
+ local registercc = 0
+ local registermem = 0
+ local registers = 0
+ local instructions = 0
+ local branches = 0
+
+ local function fixargbuffers()
+ if (argbuffersfixed) then return end
+
+ local argnew = {}
+ for i,v in pairs(argregistry) do
+ local buf,bufstart = string.match(i,"buf(%d+)%[(%d+)%]")
+ if (buf and bufstart) then
+ bufstart = tonumber(bufstart)/16
+ argnew["buf"..buf.."["..tostring(bufstart).."]"] = v
+ else
+ argnew[i] = v
+ end
+ end
+ argregistry = argnew
+ argbuffersfixed = true
+ end
+
+ local function checkregistry(w)
+ local regsuccess = true
+
+ local vtype,vname,sem,resource,pnum,pref = string.match(w,"#var ([_%w]+) ([%[%]%._%w]+) : ([^%:]*) : ([^%:]*) : ([^%:]*) : (%d*)")
+ local funcname,subroutine = string.match(w,"#function %d+ ([_%w]+)%((%d+)%)")
+ if (pref == "1") then
+ local descriptor = vtype.." "..vname
+
+ -- check if resource is array
+ local resstart,rescnt = string.match(resource,"c%[(%d+)%], (%d+)")
+ resstart = tonumber(resstart)
+ rescnt = tonumber(rescnt)
+
+ -- check if resource is buffer/buffer array
+ local buf,bufstart,bufcnt = string.match(resource,"buffer%[(%d+)%]%[(%d+)%],? ?(%d*)")
+ buf = tonumber(buf)
+ bufstart = tonumber(bufstart)
+ bufcnt = tonumber(bufcnt)
+
+ -- check if texture
+ local texnum = string.match(resource,"texunit (%d+)")
+
+ local argnames = {}
+ if (rescnt) then
+ for i=0,(rescnt-1) do
+ table.insert(argnames,"c["..tostring(resstart + i).."]")
+ end
+ elseif (texnum) then
+ table.insert(argnames,"texture["..tostring(texnum).."]")
+ table.insert(argnames,"texture"..tostring(texnum))
+ elseif (buf) then
+ table.insert(argnames,"buf"..tostring(buf).."["..tostring(bufstart).."]")
+ else
+ table.insert(argnames,resource)
+ end
+
+ for i,v in ipairs(argnames) do
+ argregistry[v] = descriptor
+ end
+ elseif (funcname and subroutine) then
+ argregistry["SUBROUTINENUM("..subroutine..")"] = "function "..funcname
+ elseif string.find(w,"BUFFER4 ") then
+ fixargbuffers()
+ elseif string.find(w,"TEMP ") then
+ --TEMP R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11;
+ --TEMP RC, HC;
+ --TEMP lmem[9];
+ for i in string.gmatch(w,"C") do
+ registercc = registercc + 1
+ end
+ for i in string.gmatch(w,"R%d+") do
+ registers = registers + 1
+ end
+ registermem = tonumber(string.match(w,"lmem%[(%d+)%]"))
+ elseif (string.find(w,"CBUFFER ") or string.find(w,"ATTRIB ") or string.find(w,"OPTION ") or
+ string.find(w,"OUTPUT ") or string.find(w,"PARAM ") or string.find(w,"!!NV") or
+ string.find(w,"STORAGE ")) then
+
+ else
+ regsuccess = false
+ end
+
+ return regsuccess
+ end
+
+ local function checkargs(str)
+ local comment = "#"
+ local declared = {}
+ for i in string.gmatch(str,"([%[%]%(%)%w]+)") do
+ local descr = argregistry[i]
+ if (descr and not declared[i]) then
+ comment = comment.." "..i.." = "..descr
+ declared[i] = true
+ end
+ end
+
+ return comment ~= "#" and comment
+ end
+
+ local registerlevels = {{}}
+ local function checkregisters(str,indent)
+ if (indent < 0) then return end
+ local cur = registerlevels[indent+1]
+ for i in string.gmatch(str,"R(%d+)") do
+ cur[i] = true
+ end
+ end
+
+ local function clearregisters(indent)
+ registerlevels[math.max(0,indent)+1] = {}
+ end
+
+ local function outputregisters(indent)
+ if (indent < 0) then return "" end
+ local tab = registerlevels[indent+1]
+ local out = {}
+ for i,v in pairs(tab) do
+ table.insert(out,i)
+ end
+ table.sort(out)
+ local cnt = #out
+ if (cnt < 1) then return "" end
+
+ local str = string.rep(" ",indent).."# "..tostring(cnt).." R used: "
+ for i,v in ipairs(out) do
+ str = str..tostring(v)..((i==cnt) and "" or ", ")
+ end
+ return str.."\n"
+ end
+
+ -- check declarations
+ local lastline = ""
+ local addinstr = false
+ for w in string.gmatch(tx, "[^\n]*\n") do
+ if (not checkregistry(w)) then
+
+ if (not w:match("%s*#")) then
+ instructions = instructions + 1
+ end
+
+ if (check(w,isbranch)) then
+ branches = branches + 1
+ end
+
+ if (check(w,endindent)) then
+ newtx = newtx..outputregisters(indent)
+ if (indent == 0) then clearregisters(indent) end
+ indent = math.max(0,indent - 1)
+ end
+
+ local firstchar = string.sub(w,1,1)
+ local indentstr = (firstchar ~= " " and firstchar ~= "\t" and string.rep(" ",indent) or "")
+ local linestr = indentstr..w
+ local argcomment = (firstchar ~= "#") and checkargs(w)
+
+ checkregisters(w,indent)
+
+ newtx = newtx..(argcomment and (indentstr..argcomment.."\n") or "")
+ newtx = newtx..linestr
+
+ if (check(w,startindent)) then
+ indent = indent + 1
+ maxindent = math.max(maxindent,indent)
+ clearregisters(indent)
+ end
+ else
+ newtx = newtx..w
+ end
+ lastline = w
+ end
+
+ local registers = tonumber(string.match(lastline, "(%d+) R%-regs")) or registers
+ registermem = registermem or 0
+ registercc = registercc or 0
+ local stats = "# "..instructions.." ~ instructions\n"
+ stats = stats.."# "..branches.." ~ branches\n"
+ stats = stats.."# "..registers.." R-regs\n"
+ stats = stats.."# "..tostring(registercc).." C-regs, "..tostring(registermem).." L-regs\n"
+ stats = stats.."# "..tostring(registercc + registermem + registers).." maximum registers\n"
+ stats = stats.."# "..maxindent.." maximum nesting level\n"
+ newtx = newtx..stats.."\n"
+
+ return newtx,stats
+ end
+ local function beautifyAsm(tx)
+ local newtx = ""
+ local stats
+ for t in tx:gmatch("!!.-END[^%w]%s*") do
+ local nt
+ nt,stats = beautifyAsmEach(t)
+ newtx = newtx..nt
+ end
+ return newtx,stats
+ end
+
+ local function beautifyAsmFile(filePath)
+ local file_text = ""
+ local statlines = ""
+ local handle = io.open(filePath, "rb")
+ if handle then
+ file_text = handle:read("*a")
+ file_text,statlines = beautifyAsm(file_text)
+ handle:close()
+ end
+
+ if (file_text == "") then return end
+
+ local handle = io.open(filePath, "wb")
+ if handle then
+ handle:write(file_text)
+ handle:close()
+ end
+ return statlines
+ end
+
+ -- Compile Arg
+ frame:Connect(ID "glslc.compile.input",wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ data.customarg = event:IsChecked()
+ end)
+
+ frame:Connect(ID "glslc.compile.separable",wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ data.separable = event:IsChecked()
+ end)
+
+ frame:Connect(ID "glslc.compile.preproc",wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ data.preproc = event:IsChecked()
+ end)
+
+ -- Compile
+ local function evCompile(event)
+ local filename,info = GetEditorFileAndCurInfo()
+ local editor = GetEditor()
+ local glsl = true
+
+ if (not (filename and binpath)) then
+ DisplayOutput("Error: GLSL Compile: Insufficient parameters (nofile)\n")
+ return
+ end
+
+ local function getDomain(filename)
+ local fname = filename:GetFullName()
+ if (fname:match("%.v")) then
+ domain = 1
+ elseif (fname:match("%.f")) then
+ domain = 2
+ elseif (fname:match("%.ge")) then
+ domain = 3
+ elseif (fname:match("%.t.*c")) then
+ domain = 4
+ elseif (fname:match("%.t.*e")) then
+ domain = 5
+ elseif (fname:match("%.c")) then
+ domain = 6
+ end
+ if (not domain) then
+ DisplayOutput("Error: GLSL Compile: could not derive domain\n")
+ end
+ return domain
+ end
+
+ local function getCompileArg(filename,domain)
+ local str = ""
+ if (data.preproc) then
+ str = '-P "'..filename:GetPath(wx.wxPATH_GET_VOLUME + wx.wxPATH_GET_SEPARATOR).."_"..filename:GetFullName()..'" '
+ end
+ return str.."-profile "..data.domainprofiles[domain]..' "'..filename:GetFullPath()..'" '
+ end
+
+
+ local outname
+ local outsuffix
+ local compileargs
+ local getinstructions
+
+ if (event:GetId() == ID "glslc.compile.all") then
+ -- look for multiple files to link
+ local basename = filename:GetFullName():match(".-%.")
+
+ outname = filename:GetPathWithSep()..basename
+
+ local cnt,files = wx.wxDir.GetAllFiles(filename:GetPathWithSep(), basename.."*" )
+ compileargs = ""
+ for i,v in ipairs(files) do
+ local filename = wx.wxFileName(v)
+ if (filename:GetExt() ~= "glp" and
+ filename:GetExt() ~= "bak")
+ then
+ local domain = getDomain(filename)
+ if (not domain) then
+ return
+ end
+ compileargs = compileargs..getCompileArg(filename,domain)
+ end
+ end
+
+ else
+ -- compile single file
+ getinstructions = true
+
+ local domain = data.domains[event:GetId()]
+ if (not domain) then
+ domain = getDomain(filename)
+ end
+ if (not domain) then
+ return
+ end
+
+ local profile = data.domainprofiles[domain]
+ local fullname = filename:GetFullPath()
+
+ outname = fullname.."."
+ outsuffix = profile
+ compileargs = data.domaindefs[domain].." "..getCompileArg(filename,domain)
+ end
+
+ -- popup for custom input
+ data.custom = data.customarg and wx.wxGetTextFromUser("Compiler Args","GLSLC",data.custom) or data.custom
+ local args = data.customarg and data.custom or ""
+ args = args:len() > 0 and args or nil
+
+ outname = outname..(args and "^"..args:gsub("%s*[%-%/]",";-")..";^" or "")
+ outname = outname..(outsuffix or "")
+ outname = outname..((outsuffix or args) and "." or "").."glp"
+ outname = '"'..outname..'"'
+
+ local cmdline = binpath.."/glslc.exe "
+ cmdline = cmdline..(args and args.." " or "")
+ cmdline = cmdline..(data.preproc and "-E " or "")
+ cmdline = cmdline..(data.separable and "-separable " or "")
+ cmdline = cmdline.."-o "..outname.." "
+ cmdline = cmdline..compileargs
+
+ local function compilecallback(str)
+ local postfunc
+ -- check for errors, if none, launch nvperf
+ -- and indentation
+ if (string.find(str,"successfully linked")) then
+ postfunc = function()
+ -- beautify asm
+ if (true) then
+ local statlines = beautifyAsmFile(outname:sub(2,-2))
+ if (getinstructions) then
+ DisplayOutput(statlines)
+ end
+ end
+ end
+ end
+
+ return str,postfunc
+ end
+
+ local wdir = filename:GetPath(wx.wxPATH_GET_VOLUME)
+
+ -- run compiler process
+ CommandLineRun(cmdline,wdir,true,nil,compilecallback)
+
+ end
+
+ frame:Connect(ID "glslc.compile.vertex",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "glslc.compile.fragment",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "glslc.compile.geometry",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "glslc.compile.tessctrl",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "glslc.compile.tesseval",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "glslc.compile.compute",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "glslc.compile.ext",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "glslc.compile.all",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+
+ -- indent asm
+ frame:Connect(ID "glslc.format.asm", wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ local curedit = GetEditor()
+ local newtx = beautifyAsm( curedit:GetText() )
+
+ curedit:SetText(newtx)
+ end)
+ end,
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/tools/perforce_edit.lua b/love2dToAPK/tools/tools/zbstudio-old-win/tools/perforce_edit.lua
new file mode 100644
index 0000000..ab1b6f5
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/tools/perforce_edit.lua
@@ -0,0 +1,14 @@
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+return {
+ exec = {
+ name = "Perforce edit",
+ description = "does p4 edit",
+ fn = function(fname,projectdir)
+ local cmd = 'p4 edit "'..fname..'"'
+
+ CommandLineRun(cmd,nil,true)
+ end,
+ },
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/tools/perforce_revert.lua b/love2dToAPK/tools/tools/zbstudio-old-win/tools/perforce_revert.lua
new file mode 100644
index 0000000..d1e133a
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/tools/perforce_revert.lua
@@ -0,0 +1,14 @@
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+return {
+ exec = {
+ name = "Perforce revert",
+ description = "does p4 revert",
+ fn = function(fname,projectdir)
+ local cmd = 'p4 revert "'..fname..'"'
+
+ CommandLineRun(cmd,nil,true)
+ end,
+ },
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio.exe b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio.exe
new file mode 100644
index 0000000..8eab623
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio.exe
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/app.lua b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/app.lua
new file mode 100644
index 0000000..e597fad
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/app.lua
@@ -0,0 +1,53 @@
+local skipspecs = {
+ cg = true, glsl = true, luxres = true, opencl = true, sql = true,
+ cbase = true, hlsl = true, oglgpuprog = true, ptx = true, text = true,
+}
+return {
+ loadfilters = {
+ tools = function(file) return false end,
+ specs = function(file) return not skipspecs[file:match('spec[/\\]([^/\\]+)%.lua$') or ''] end,
+ interpreters = function(file) return not file:find('estrela') end,
+ },
+
+ postinit = function ()
+ local ide = ide
+ local bundle = wx.wxIconBundle()
+ local files = FileSysGetRecursive(ide:GetAppName().."/res", false, "*.ico")
+ local icons = 0
+ for i,file in ipairs(files) do
+ icons = icons + 1
+ bundle:AddIcon(file, wx.wxBITMAP_TYPE_ICO)
+ end
+ if icons > 0 then ide.frame:SetIcons(bundle) end
+
+ local menuBar = ide.frame.menuBar
+ menuBar:Check(ID_CLEAROUTPUT, true)
+
+ -- load myprograms/welcome.lua if exists and no projectdir
+ local projectdir = ide.config.path.projectdir
+ if (not projectdir or string.len(projectdir) == 0
+ or not wx.wxFileName(projectdir):DirExists()) then
+ local home = wx.wxGetHomeDir():gsub("[\\/]$","")
+ for _,dir in pairs({home, home.."/Desktop", ""}) do
+ local fn = wx.wxFileName("myprograms/welcome.lua")
+ -- normalize to absolute path
+ if fn:Normalize(wx.wxPATH_NORM_ALL, dir) and fn:FileExists() then
+ LoadFile(fn:GetFullPath(),nil,true)
+ ProjectUpdateProjectDir(fn:GetPath(wx.wxPATH_GET_VOLUME))
+ break
+ end
+ end
+ end
+ end,
+
+ stringtable = {
+ editor = "ZeroBrane Studio",
+ about = "About ZeroBrane Studio",
+ editormessage = "ZeroBrane Studio Message",
+ statuswelcome = "Welcome to ZeroBrane Studio",
+ settingsapp = "ZeroBraneStudio",
+ settingsvendor = "ZeroBraneLLC",
+ logo = "res/zerobrane.png",
+ help = "zerobranestudio",
+ },
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/config.lua b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/config.lua
new file mode 100644
index 0000000..f58b09d
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/config.lua
@@ -0,0 +1,38 @@
+local G = ... -- this now points to the global environment
+local ide, wx = G.ide, G.wx
+local mac = ide.osname == 'Macintosh'
+local win = ide.osname == "Windows"
+if mac then
+ local defaultsize = 11
+ filetree.fontsize = defaultsize
+ if ide.wxver >= "2.9.5" then
+ editor.fontsize = defaultsize+1
+ outputshell.fontsize = defaultsize
+ end
+
+ editor.fontname = "Monaco"
+ outputshell.fontname = editor.fontname
+else
+ local defaultsize = 10
+ editor.fontsize = defaultsize+1
+ outputshell.fontsize = defaultsize
+
+ local sysid, major, minor = wx.wxGetOsVersion()
+ editor.fontname =
+ win and (major == 5 and "Courier New" or "Consolas") or "Monospace"
+ outputshell.fontname = editor.fontname
+end
+
+hidpi = mac -- support Retina displays by default (OSX)
+singleinstance = not mac
+
+unhidewindow = { -- allow unhiding of GUI windows
+ -- 1 - show if hidden, 0 - ignore, 2 -- hide if shown
+ ConsoleWindowClass = 2,
+ -- ignore the following windows when "showing all"
+ IME = 0,
+ wxDisplayHiddenWindow = 0,
+ ['MSCTFIME UI'] = 0,
+ -- GLUT/opengl/SDL applications (for example, moai or love2d)
+ GLUT = 1, FREEGLUT = 1, SDL_app = 1,
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/BOOKMARK-TOGGLE.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/BOOKMARK-TOGGLE.png
new file mode 100644
index 0000000..6f9860e
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/BOOKMARK-TOGGLE.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-BREAK.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-BREAK.png
new file mode 100644
index 0000000..53a98d5
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-BREAK.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-BREAKPOINT-TOGGLE.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-BREAKPOINT-TOGGLE.png
new file mode 100644
index 0000000..dca5604
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-BREAKPOINT-TOGGLE.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-CALLSTACK.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-CALLSTACK.png
new file mode 100644
index 0000000..2a063aa
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-CALLSTACK.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-DETACH.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-DETACH.png
new file mode 100644
index 0000000..a585b87
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-DETACH.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-RUN-TO.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-RUN-TO.png
new file mode 100644
index 0000000..3aa4244
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-RUN-TO.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-START.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-START.png
new file mode 100644
index 0000000..0da42b6
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-START.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-STEP-INTO.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-STEP-INTO.png
new file mode 100644
index 0000000..51a0e38
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-STEP-INTO.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-STEP-OUT.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-STEP-OUT.png
new file mode 100644
index 0000000..88aa038
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-STEP-OUT.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-STEP-OVER.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-STEP-OVER.png
new file mode 100644
index 0000000..91547aa
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-STEP-OVER.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-STOP.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-STOP.png
new file mode 100644
index 0000000..af5225c
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-STOP.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-WATCH.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-WATCH.png
new file mode 100644
index 0000000..f1cfcb4
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DEBUG-WATCH.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DIR-SETUP-FILE.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DIR-SETUP-FILE.png
new file mode 100644
index 0000000..77b8645
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DIR-SETUP-FILE.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DIR-SETUP.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DIR-SETUP.png
new file mode 100644
index 0000000..ff33594
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/DIR-SETUP.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-KNOWN.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-KNOWN.png
new file mode 100644
index 0000000..6bcaf21
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-KNOWN.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-NEW.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-NEW.png
new file mode 100644
index 0000000..256cdaa
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-NEW.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-NORMAL-START.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-NORMAL-START.png
new file mode 100644
index 0000000..16d65bf
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-NORMAL-START.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-NORMAL.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-NORMAL.png
new file mode 100644
index 0000000..c7c4d19
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-NORMAL.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-OPEN.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-OPEN.png
new file mode 100644
index 0000000..0a487c2
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-OPEN.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-SAVE-ALL.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-SAVE-ALL.png
new file mode 100644
index 0000000..790474b
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-SAVE-ALL.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-SAVE.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-SAVE.png
new file mode 100644
index 0000000..c0cfaae
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FILE-SAVE.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-AND-REPLACE.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-AND-REPLACE.png
new file mode 100644
index 0000000..881c274
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-AND-REPLACE.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-IN-FILES.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-IN-FILES.png
new file mode 100644
index 0000000..fe653f7
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-IN-FILES.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-CASE-SENSITIVE.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-CASE-SENSITIVE.png
new file mode 100644
index 0000000..9db97e7
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-CASE-SENSITIVE.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-CONTEXT.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-CONTEXT.png
new file mode 100644
index 0000000..addb686
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-CONTEXT.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-DOWN.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-DOWN.png
new file mode 100644
index 0000000..da250b3
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-DOWN.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-MULTI-RESULTS.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-MULTI-RESULTS.png
new file mode 100644
index 0000000..02a1175
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-MULTI-RESULTS.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-REGEX.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-REGEX.png
new file mode 100644
index 0000000..8620d1e
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-REGEX.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-SELECTION.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-SELECTION.png
new file mode 100644
index 0000000..962addb
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-SELECTION.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-SETDIR.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-SETDIR.png
new file mode 100644
index 0000000..69c52ec
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-SETDIR.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-SUBDIR.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-SUBDIR.png
new file mode 100644
index 0000000..382b6e7
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-SUBDIR.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-WORD.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-WORD.png
new file mode 100644
index 0000000..7519021
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-WORD.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-WRAP-AROUND.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-WRAP-AROUND.png
new file mode 100644
index 0000000..04928a2
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-OPT-WRAP-AROUND.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-REPLACE-NEXT.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-REPLACE-NEXT.png
new file mode 100644
index 0000000..e5feec3
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND-REPLACE-NEXT.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND.png
new file mode 100644
index 0000000..f3b1975
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FIND.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FOLDER-MAPPED.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FOLDER-MAPPED.png
new file mode 100644
index 0000000..3aedaf7
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FOLDER-MAPPED.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FOLDER.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FOLDER.png
new file mode 100644
index 0000000..4f0fa17
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/FOLDER.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/LICENSE b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/LICENSE
new file mode 100644
index 0000000..24e1714
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/LICENSE
@@ -0,0 +1,28 @@
+Icons are based on the icon set used in LuaEdit. Some of the icons
+have been modified to avoid using the last line that is not displayed
+correctly in wxLua.
+
+These icons are licenced under MIT license by permission from
+Jean-Francois Goulet (granted on 2012/01/02).
+
+LuaEdit
+
+Copyright © 2004-2009 Jean-Francois Goulet
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/RUN-NOW.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/RUN-NOW.png
new file mode 100644
index 0000000..c6483db
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/RUN-NOW.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/RUN.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/RUN.png
new file mode 100644
index 0000000..c39ab44
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/RUN.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-ACALL.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-ACALL.png
new file mode 100644
index 0000000..53ed38e
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-ACALL.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-CALL.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-CALL.png
new file mode 100644
index 0000000..7603329
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-CALL.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-GCALL.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-GCALL.png
new file mode 100644
index 0000000..3450300
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-GCALL.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-LCALL.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-LCALL.png
new file mode 100644
index 0000000..3d3c18e
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-LCALL.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-LOCAL.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-LOCAL.png
new file mode 100644
index 0000000..ff2971d
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-LOCAL.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-SCALL.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-SCALL.png
new file mode 100644
index 0000000..22632b9
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-SCALL.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-UP.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-UP.png
new file mode 100644
index 0000000..585a8df
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/16/VALUE-UP.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/BOOKMARK-TOGGLE.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/BOOKMARK-TOGGLE.png
new file mode 100644
index 0000000..906ac51
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/BOOKMARK-TOGGLE.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-BREAK.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-BREAK.png
new file mode 100644
index 0000000..650d1cf
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-BREAK.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-BREAKPOINT-TOGGLE.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-BREAKPOINT-TOGGLE.png
new file mode 100644
index 0000000..7ec0859
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-BREAKPOINT-TOGGLE.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-CALLSTACK.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-CALLSTACK.png
new file mode 100644
index 0000000..8915230
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-CALLSTACK.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-DETACH.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-DETACH.png
new file mode 100644
index 0000000..7fd947f
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-DETACH.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-RUN-TO.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-RUN-TO.png
new file mode 100644
index 0000000..262ccb4
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-RUN-TO.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-START.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-START.png
new file mode 100644
index 0000000..e89596a
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-START.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-STEP-INTO.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-STEP-INTO.png
new file mode 100644
index 0000000..1dbd011
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-STEP-INTO.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-STEP-OUT.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-STEP-OUT.png
new file mode 100644
index 0000000..5d17d66
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-STEP-OUT.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-STEP-OVER.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-STEP-OVER.png
new file mode 100644
index 0000000..8f977cd
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-STEP-OVER.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-STOP.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-STOP.png
new file mode 100644
index 0000000..7a2565c
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-STOP.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-WATCH.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-WATCH.png
new file mode 100644
index 0000000..e3e6cc5
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DEBUG-WATCH.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DIR-SETUP-FILE.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DIR-SETUP-FILE.png
new file mode 100644
index 0000000..ebc1231
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DIR-SETUP-FILE.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DIR-SETUP.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DIR-SETUP.png
new file mode 100644
index 0000000..8b6a93b
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/DIR-SETUP.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FILE-NEW.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FILE-NEW.png
new file mode 100644
index 0000000..c51d592
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FILE-NEW.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FILE-OPEN.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FILE-OPEN.png
new file mode 100644
index 0000000..a27e760
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FILE-OPEN.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FILE-SAVE-ALL.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FILE-SAVE-ALL.png
new file mode 100644
index 0000000..d9a2547
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FILE-SAVE-ALL.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FILE-SAVE.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FILE-SAVE.png
new file mode 100644
index 0000000..ca2b9cc
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FILE-SAVE.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FIND-AND-REPLACE.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FIND-AND-REPLACE.png
new file mode 100644
index 0000000..a4fe02f
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FIND-AND-REPLACE.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FIND-IN-FILES.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FIND-IN-FILES.png
new file mode 100644
index 0000000..c04be5e
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FIND-IN-FILES.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FIND.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FIND.png
new file mode 100644
index 0000000..d6bc068
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/FIND.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/LICENSE b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/LICENSE
new file mode 100644
index 0000000..12949b4
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/LICENSE
@@ -0,0 +1,27 @@
+Icons are based on the icon set used in LuaEdit.
+These icons have been manually converted and updated for 24 pixels.
+
+These icons are licenced under MIT license by permission from
+Jean-Francois Goulet (granted on 2012/01/02).
+
+LuaEdit
+
+Copyright 2004-2009 Jean-Francois Goulet
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/RUN-NOW.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/RUN-NOW.png
new file mode 100644
index 0000000..eecc3a0
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/RUN-NOW.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/RUN.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/RUN.png
new file mode 100644
index 0000000..5f8571b
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/24/RUN.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/estrela.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/estrela.png
new file mode 100644
index 0000000..6a954c3
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/estrela.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/zbstudio.ico b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/zbstudio.ico
new file mode 100644
index 0000000..323776d
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/zbstudio.ico
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/zerobrane.png b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/zerobrane.png
new file mode 100644
index 0000000..2f270fb
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-old-win/zbstudio/res/zerobrane.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/CHANGELOG.md b/love2dToAPK/tools/tools/zbstudio-win/CHANGELOG.md
new file mode 100644
index 0000000..549b37f
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/CHANGELOG.md
@@ -0,0 +1,2364 @@
+# ZeroBrane Studio Changelog
+
+## v1.30 (Jan 21 2016)
+
+### Highlights
+ - Added `markers` panel to show and navigate bookmarks and breakpoints.
+ - Added saving/restoring bookmarks and breakpoints.
+ - Added breakpoint prev/next navigation (`Project | Breakpoint` menu).
+ - Added find/replace in selection to search operations.
+ - Added printing of editor tabs and Console/Output windows (available on Windows and OSX).
+ - Added recursive processing of configuration files (using `include` command).
+ - Added `outline.showcompact` setting to keep outline more compact for large files.
+ - Added opening multiple files from the `Open` dialog.
+ - Updated Corona API for v2015.2731 and added handling of type inheritance.
+ - Updated love2d API for v0.10.0.
+
+### Special thanks
+ - To [tmiv](https://github.com/tmiv) for allowing shortcuts to be added to tools menu items.
+ - To [Yonaba](https://github.com/Yonaba/) for French translation update.
+ - To [Leo Bartoloni](https://github.com/bartoleo) for Italian translation update.
+ - To [Inigo Sola](https://github.com/inigosola) for Spanish translation update.
+
+### Improvements
+ - Added `CloneMenu` package method (#166).
+ - Added Torch and Redis debugging links.
+ - Added `IsNew` method for documents (#166).
+ - Added `Print` method and updated core components to use it during launch.
+ - Added skipping `UPDATE_CONTENT` events on cursor blinks in `UPDATEUI` (#419).
+ - Added preserving markers after sorting/reindentation operations.
+ - Added editor `MarkerGetAll` method (#166).
+ - Added example on how to set breakpoint shortcuts used in v1.20 or earlier (#419).
+ - Added processing of `include` command without extension in config (#555).
+ - Added reporting of missing packages when using `package` command in config (#555).
+ - Added processing of `package` command without extension in config (#555).
+ - Added hint on using updated breakpoint shortcut (#419).
+ - Added breakpoint prev/next navigation (#419).
+ - Added `AttachMenu` package method (#166).
+ - Added `MarkerToggle` editor method (#166).
+ - Added `MarkerGotoNext` and `MarkerGotoPrev` editor methods (#166).
+ - Added local menu to the `Markers` panel to toggle markers (#419).
+ - Added saving/restoring bookmarks and breakpoints (#419).
+ - Added `BookmarkToggle` method to the editor (#166).
+ - Added `BreakpointToggle` method to the editor (#166).
+ - Added `markers` panel to show bookmarks and breakpoints (#419).
+ - Added `onEditorMarkerUpdate` event (#166).
+ - Added unfolding fragments that include activated line during debugging (closes #575).
+ - Added skipping comment when none is provided in the Stack (instead of showing `nil`).
+ - Added skipping comments in the lexer to avoid splitting statements (fixes #568).
+ - Added `GetExePath` method for the interpreter (#166).
+ - Added package `GetFilePath` method (#166).
+ - Added `showhiddenfiles` option to show hidden files in the filetree (closes #561).
+ - Added package `RemovePanel` method (#166).
+ - Added loading of custom package from the config file (closes #555).
+ - Added `Alt-Enter` to "replace all" when replace field is selected in the search panel.
+ - Added setting project directory to the selected directory to the project tree menu.
+ - Added ignoring `Ctrl-CapsLock` in the editor that was shrinking the font.
+ - Added recursive processing of configuration files with relative names (#555).
+ - Added moving cursor to the end of the pasted fragment (#556).
+ - Added workaround for copying UTF-8 invalid data to/from clipboard (#260, #556).
+ - Added `CloseAll` and `CloseAllExcept` document methods (#166).
+ - Added warning in the interpreter when a short name not generated on Windows (closes #559).
+ - Added check for recover record to be fully present.
+ - Added using `*Raw` methods when available for handling of invalid UTF-8 chars (#260, #556).
+ - Added `FileRemove` method (#166).
+ - Added package `onAppDone` method (#166).
+ - Added sorting the list of known extensions.
+ - Added `outline.showcompact` setting to keep outline more compact for large files (closes #549).
+ - Added updating selection boundaries after replace-in-selection (#547).
+ - Added resizing toolbar background after resizing the application window.
+ - Added timing to the tests.
+ - Added context menu item to clear text in the Console window.
+ - Added context menu to select a (clicked on) command in the Console window.
+ - Added `onMenuConsole` event (#166).
+ - Added reporting printing progress (#540).
+ - Added package `IsValidProperty` method (#166).
+ - Added separator to the print-related menu items on OSX (#540).
+ - Added header/footer printing (#540).
+ - Added printing of the current editor tab (closes #540).
+ - Add package `GetIndicators` method (#166).
+ - Added `editor.wrapmode` to configure wrapping mode in the editor.
+ - Added reporting of another instance running under a different user (closes #542).
+ - Added opening multiple files from the `Open` dialog (closes #541).
+ - Allowed reading input in the Output window without printing something first (closes #538).
+ - Allow shortcuts to be added to tools menu items
+ - Extended PATH on OSX with `/usr/local/bin` to provide access to tools in that folder (#356).
+ - Improved compatibility when running the IDE using Lua 5.2.
+ - Improved handling of names with Unicode chars during debugging on Windows (#559).
+ - Limited requesting attention on debugging starts to happen when debugging is suspended.
+ - Moved wxlua version number to a better location in the About screen.
+ - Optimized path generation in directory traversal (#260).
+ - Removed a workaround for wxlua build issue as it's no longer needed.
+ - Replaced `ConsoleClear` with `Erase` methods for the Console object.
+ - Removed search panel from the list of floated panels as it shouldn't be there.
+ - Removed `allowinteractivescript` setting as it doesn't need to be configurable (#538).
+ - Replaced `EditorIsModified` with document method calls.
+ - Spanish translation updated
+ - Switched to using client size instead of system metric to get screen width (#260).
+ - Switched to using `KEY` event in search panel to make it work with wxwidgets 3.1+ (#260).
+ - Switched to per-editor tracking in `UPDATEUI` event.
+ - Updated `interpreter` menu to use a clone to avoid Linux assertion.
+ - Updated Italian Translation (closes #586).
+ - Updated french translation as of df381b5 (see #70)
+ - Updated Russian translation (#70).
+ - Updated translation files with new messages (#70).
+ - Updated LuaForWindows interpreter to accept command line parameters (#582).
+ - Updated LuaForWindows interpreter to properly pass `arg` to the script (closes #582).
+ - Updated `GetDocument` to not fail when no editor is passed.
+ - Updated live coding to group number updates together for `Undo`/`Redo` purposes.
+ - Updated `Toggle Breakpoint` and `Break` shortcuts for consistency (#419).
+ - Updated love2d API for v0.10.0 (#247).
+ - Updated script to process new love2d API format (with `variants`).
+ - Updated showing filename of the missing interpreter in the project list (#570).
+ - Updated build scripts to use own wxwidgets repository to better sync build versions (#260).
+ - Updated build scripts to remove an error from the check for missing methods in wxlua.
+ - Updated README to remove outdated .ini reference from Estrela section.
+ - Updated instructions in the `estrela` configuration file to reference `include` command.
+ - Updated luasec build script to use the latest openSSL version (1.0.2d).
+ - Updated UTF-8 validation to use wxwidgets libraries for better performance (#556).
+ - Updated clipboard copy to make non-UTF-8 data to work on OSX (#260, #556).
+ - Updated Console history to work with UTF-8 invalid strings (#260, #556).
+ - Updated `Ctrl/Shift-Ins` and `Shift-Del` to work in all editors (#260, #556).
+ - Updated `Output` and `Console` to display invalid characters as is (#260, #556).
+ - Updated config sample to remove no longer needed `G` references.
+ - Updated config processing to simplify access to global functions.
+ - Updated config processing to allow use of `package` field.
+ - Updated windows launcher code to use manifest for hidpi awareness.
+ - Updated `AddConfig` method to accept single filename in addition to a list (#166).
+ - Updated event handling to better handle events that are executed once (#260).
+ - Updated `sample` package events for more accurate output.
+ - Updated default size/position for the first launch without saved settings.
+ - Updated tests to use a separate .ini file to minimize conflicts.
+ - Updated Corona API for v2015.2731.
+ - Updated Corona API processing script to follow Lua guidelines.
+ - Updated Corona API processing script to handle type inheritance.
+ - Updated `Save As`/`Open` command to use editor specific extensions instead of all.
+ - Updated capturing editor information during search to work with selections (#547, #416).
+ - Updated `Replace` and `Replace All` to take selection into account (#547, #416).
+ - Updated toolbar icons to fix black color in some images.
+ - Updated `SetDllDirectory` handling to avoid breaking dlopen with wxwidgets 3.1+ (#260).
+ - Updated Corona interpreter to avoid caching specified path.
+ - Updated tests to handle platform-specific tests.
+ - Updated directory traversing tests to work with smaller directories.
+ - Updated default file mask to match files without extension (#260).
+ - Updated tests to use a package instead of the obsolete app method.
+ - Updated wxwidget path in the build script to use git repository after wxwidgets migration.
+ - Updated menu shortcuts to avoid conflicts in the `File` menu (#540).
+ - Updated README with features in 1.20.
+
+### Fixes
+ - Fixed showing cursor in search panel fields after file search.
+ - Fixed reapplying markers after reloading modified file (#419).
+ - Fixed setting interpreter after launching with non-existing project.
+ - Fixed showing package errors during project switches (#555).
+ - Fixed `include` command not checking needed `packages` folders to load from (#555).
+ - Fixed resetting the default interpreter after selecting a non-existent one.
+ - Fixed restoring project-specific interpreter when switching projects (#570).
+ - Fixed restoring project-specific interpreter after relaunch (fixes #570).
+ - Fixed expanding sub-trees in project directory when set to the disk root on Windows.
+ - Fixed search navigation after selecting one variable instance (fixes #565).
+ - Fixed editing fragments in folded text (follow-up to d2ddc96a; #564).
+ - Fixed editing multiple selections when selection is in folded fragments (fixes #564).
+ - Fixed copy/paste on Windows when UTF-8 invalid strings end in new line (#260, #556).
+ - Fixed debugging of Busted scripts (closes #552).
+ - Fixed skipping editor tabs when clicked in some cases on OSX (closes #546).
+ - Fixed toolbar size not being adjusted on the very first launch.
+
+### Incompatibilities
+ - Changed `Toggle Breakpoint` shortcut from `F9` to `Ctrl/Cmd-F9`.
+ - Removed `Project | Break` shortcut to avoid conflict with breakpoint navigation.
+ - Removed `allowinteractivescript` setting as no longer needs to be configurable (#538).
+
+## v1.20 (Oct 08 2015)
+
+### Highlights
+ - Added symbol indexing of project files for project-wide search.
+ - Added support for `file@symbol` fuzzy search (#385).
+ - Added processing of `ini` setting relative to the IDE location (#483).
+ - Improved memory handling for large files.
+ - Improved application performance and memory usage.
+ - Improved auto-complete order of results and suggestions for case-sensitive matches.
+ - Updated Windows launcher to add dpi awareness for high dpi monitors.
+ - Upgraded Lua 5.3 interpreter to 5.3.1.
+ - Fixed a memory leak after a search panel is opened.
+ - Fixed an occasional crash from the filetree on Linux (#425, #464).
+ - Fixed recursive file traversal to skip directories when mask is specified.
+
+### Special thanks
+ - To [riidom](https://github.com/riidom) for German translation update.
+ - To [Yonaba](https://github.com/Yonaba/) for French translation update.
+ - To [Leo Bartoloni](https://github.com/bartoleo) for Italian translation update.
+ - To [Christoph Kubisch](https://github.com/pixeljetstream) for glslc updates.
+ - To Brigham Toskin for auto-complete improvements.
+ - To Joergen von Bargen for optimized UTF8 validation.
+ - To Nick Smith for Marmalade interpreter updates.
+
+### Improvements
+ - Added handling of translation messages that require pluralization (#70).
+ - Added check for non-zero file size before reporting load progress (#530).
+ - Added switching interpreters by clicking on the interpreter label in the status bar.
+ - Added handling of editor commands (Copy/Paste/SelectAll/Undo/Redo) in search panel controls.
+ - Added position to the end-of-file lexer token (closes #529).
+ - Added reporting when a file can't be removed from a project tree.
+ - Added explicit initialization for `editor.autoactivate` default setting.
+ - Added allowing `editor.saveallonrun` with `infervalue` static analyzer (closes #524).
+ - Added support for `include` command in config files.
+ - Added document `Close` method (#166).
+ - Added descriptions for new Lua 5.3 `math.*` and `coroutine.*` functions.
+ - Added functions new to Lua 5.3 to the list of keywords.
+ - Added reporting of deserialization failures for saved package data.
+ - Added collapsing white spaces from names shown in the Outline.
+ - Added workaround for a memory leak in wxlua after a search panel is opened.
+ - Added jumping to the current function in the outline (#515).
+ - Added highlighting current functions for better visibility (#515).
+ - Added skipping unneded fields from the symbol index to reduce memory usage (#515).
+ - Added showing position of the current function in the Outline (closes #515).
+ - Added explicit editor destroy during find and replace to conserve memory.
+ - Added explicit editor destroy during symbol indexing to conserve memory.
+ - Added turning jitting on when running under LuaJIT.
+ - Added `Run to Cursor` to the popup menu in the editor (#413).
+ - Added showing memory usage stats in the status bar configured by `showmemoryusage`.
+ - Added skipping opening a file from symbol search when nothing is matched.
+ - Added skipping directories during directory traversal (#499).
+ - Added `SetStatusFor` package method to set temporary status (#166).
+ - Added forcing immediate refresh of symbol index when requested from the menu (#499).
+ - Added `onMenuOutput` event (#166).
+ - Added `onMenuWatch` event (#166).
+ - Added disabling symbol indexing for directories/projects (#499).
+ - Added refreshing of symbol index to the project menu (#499).
+ - Added reporting of the number of files queued for indexing (#499).
+ - Added reporting when indexing is completed (#499).
+ - Added `GetOutline` package method (#166, #499).
+ - Added exclusion to not report `arg` as global in static analysis (closes #503).
+ - Added `commandbar.width` to set the width of command bar.
+ - Added skipping symbol index queue when symbol inactivity is not set (#499).
+ - Added setting different types of indentation guides.
+ - Added optimization with prefiltering for short patterns (#31, #499).
+ - Added status message during index update (#499).
+ - Added purging of outdated cache for symbol indexing (#499).
+ - Added symbol processing of tabs that are not saved yet (#499).
+ - Added indexing of project files (#499).
+ - Added `commandbar.maxitems` configuration setting (#499).
+ - Added caching of symbols for open files (#499).
+ - Added support for `file.lua@symbol` fuzzy search (#385).
+ - Added symbol search in all open files (#385).
+ - Added check to avoid loops in type assignment during auto-complete (#498).
+ - Added primitive handling of `require` in type assignments for known APIs (fixes #498).
+ - Added support for aborting file reading callback (#491).
+ - Added progress display when loading large files (#491).
+ - Added status methods: `GetStatus`, `PushStatus`, and `PopStatus` (#166).
+ - Added `onMenuOutline` callback (#166, #337).
+ - Added ability to toggle outline sorting from the local menu (#337, #494).
+ - Added activating Output panel after compilation errors.
+ - Added package `SetStatus` method (#166).
+ - Added `Ctrl/Cmd-Enter`/`Ctrl/Cmd-Shift-Enter` to add line after/before the current one (#334).
+ - Added ignoring current selection in auto-complete with `Shift-Enter` (closes #494).
+ - Added hiding auto-complete after typing one of the offered options (#494).
+ - Added activating Output notebook to show search results if it's hidden (#416).
+ - Added reporting of errors when unable to open file for static analysis.
+ - Added collapsing whitespaces in function parameters in the outline (#337).
+ - Added emphasis for the preference type in the config file template.
+ - Added `FileSize` method as the default one returns non-zero result for non-existing files.
+ - Added reporting of `FileWrite` failing to write the entire content.
+ - Added package methods `AddIndicator`, `GetIndicator`, and `RemoveIndicator` (#166).
+ - Added missing `Detach Process` id to keymap (pkulchenko/MobDebug#19).
+ - Added a check for `ini` setting pointing to a path with a writeable directory (#483).
+ - Added a check for `ini` setting pointing to a directory (#483).
+ - Added processing of `ini` setting relative to the IDE location (closes #483).
+ - Added Watch view refresh after switching focus when needed.
+ - Added Stack view refresh after switching focus when needed.
+ - Added forced `Refresh`/`Update` to improve redrawing of commandbar on Windows 8.
+ - Added a check for a window to be shown to avoid callback recursion on OSX (fixes #473).
+ - Added package `IsWindowShown` method (#166).
+ - Added package `onEditorPreClose` event (#166, closes #461).
+ - Added deleting the rest of the word on auto-complete (`acandtip.droprest`).
+ - Added closing editor tab when renaming to an open file from the project tree.
+ - Added refresh of the target file after renaming from the project tree.
+ - Added a check for object with a focus (occasionally triggered on Linux).
+ - Added workaround to fix crash on Linux from the project tree (#425, #464).
+ - Added `DoWhenIdle` package method (#166).
+ - Disabled unhiding one of wxwidgets windows that is only used for message passing (Windows).
+ - Disabled initial highlight when showing current function disabled in the outline (#515).
+ - Disabled dragging out search results tab to avoid unexpected results (#416).
+ - Enabled compilation during running/debugging (closes #479).
+ - Enabled static analysis during running/debugging (#479).
+ - Integrate ZeroBrane with Marmalade's Hub GUI
+ - Improved auto-complete suggestions for case-sensitive matches.
+ - Improved compactness of saved package settings (#166, #499).
+ - Improved performance of saving symbol index data (#499).
+ - Improved memory usage when closing large files (#491).
+ - Improved handling of large files (#491).
+ - Improved the order of results in auto-complete (closes #469).
+ - glslc tool: add menu option for pre-process mode
+ - Optimized saving package settings (#166, #499).
+ - Optimized UTF8 validation (thanks to Joergen von Bargen).
+ - Optimized handling of multi-line changes in the editor (closes #477).
+ - Removed forced garbage collection as it led to crashes on Linux (#425, closes #464).
+ - Revised: auto-complete results (amends #469, w/@pkulchenko patch)
+ - Switched to the bottom location for the search results by default (#416).
+ - Updated italian translations (thanks to Leo Bartoloni)
+ - Updated Russian translation (#70).
+ - Update de.lua (thanks to riidom)
+ - Updated french translation as of commit (thanks to Yonaba)
+ - Updated translation files for new messages (#70).
+ - Updated translation logic to accept empty tables for pluralization values (#70).
+ - Updated build scripts to use the most recent releases of LuaJIT and Lua 5.2.
+ - Updated OSX launcher to keep `DYLD_LIBRARY_PATH` if already set.
+ - Updated build scripts to use the most recent releases of LuaJIT and Lua 5.2.
+ - Update marmalade API definition to 7.9
+ - Updated static analyzer (luainspect) to take globals in 'required' files into account (#520).
+ - Updated static analyzer to refresh cache of 'required' modules (#520).
+ - Updated C/cpp spec to skip `if(...)` from the list of functions.
+ - Updated C/cpp spec to properly handle functions at the beginning of a file.
+ - Updated package data serialization to use simpler dumper for faster processing.
+ - Updated saving symbol index to be called less frequently (#499).
+ - Updated list of fields to skip from saved symbol index (#499).
+ - Updated Run/Debug to not force saving new tabs when `Start` file is set.
+ - Updated interpreter handling to allow setting of default value in the config (closes #518).
+ - Updated highlighting of the current function in the Outline to select one item (#515).
+ - Updated auto-complete to close when one of the options matches the current input.
+ - Updated applying limit to the commandbar results to allow them to be resorted.
+ - Updated status messages for better visibility on OSX during index refresh (#499).
+ - Updated tracking of editor updates to skip unneeded notifications on OSX (#499).
+ - Updated symbol refresh to do processing as soon as the path is known (#499).
+ - Updated symbol index to skip unused elements in serialization (#499).
+ - Updated prefiltering to limit prefix to avoid penalty for long `s.*s.*s...` (#31).
+ - Updated package `SetSettings` method to allow passing of additional parameters (#166).
+ - Updated status of files indexing for symbol search (#499).
+ - Updated `DoWhenIdle` handling to gracefully handle a long queue.
+ - Updated `Go To Symbol` to refresh files loaded in the preview (#499, #385).
+ - Updated symbol search to only refresh outline when it's not populated (#385).
+ - Updated search logic to avoid showing search results in recent files (#416).
+ - Updated line number handling to adjust for large files (#491).
+ - Updated `busted` interpreter to check for proper extension on Windows (closes #495).
+ - Updated handling of binary and utf8 validness checks for large files (#491).
+ - Updated build scripts for Lua 5.3 to use 5.3.1.
+ - Updated toolbar to show large icons by default on large screens.
+ - Updated outline to only retrieve entry text when there are tokens to process (#337).
+ - Updated getting text length without requesting editor content.
+ - Updated showing function indicator handling to allow for easier enabling.
+ - Updated indicator processing to use new API.
+ - Updated ID references in toolbar to use the new access method.
+ - Updated ID references in keymap to use the new access method.
+ - Updated `Detach Process` to allow access to it while the process is running.
+ - Updated metalua/static analyzer to accept long integer and imaginary numbers (closes #482).
+ - Updated internal parser to accept long integer, imaginary, and floating point hex numbers (#482).
+ - Updated internal parser to accept numbers that start with a period (#482).
+ - Updated compilation and static analysis to keep output when running/debugging (#479).
+ - Updated indentation after strings with brackets and escaped quotes (#324).
+ - Updated `AnalyzeString` to add filename parameter (closes #463).
+ - Updated Windows launcher to add dpi awareness for high dpi monitors.
+ - Upgraded Lua 5.3 interpreter to 5.3.1 on Linux (x86 and x64).
+ - Upgraded Lua 5.3 interpreter to 5.3.1 on OSX.
+ - Upgraded Lua 5.3 interpreter to 5.3.1 on Windows (closes #453, closes #460).
+ - Upgraded Mobdebug (0.628) to include `keyignore` serializer option.
+ - Upgraded Mobdebug (0.627) to improve debugging of code with overloaded `string` methods.
+ - Upgraded Mobdebug (0.624) to make `DONE` async and to add `__tostring` protection (closes #446).
+
+### Fixes
+ - Fixed text search and fuzzy symbol search in symlinks (#458, #530).
+ - Fixed opening only one tab for external debugging of dynamic code on Linux (closes #526).
+ - Fix live picking up debug vs release binaries (Marmalade)
+ - Fixed highlighting for those specs that don't have information on where functions end (#515).
+ - Fixed highlighting the current function when anonymous functions are hidden (#515).
+ - Fixed styling of comments that include markup inside markup (fixes #514).
+ - Fixed updating symbols in new files that haven't been indexed yet (#499).
+ - Fixed opening empty files (fixes #510).
+ - Fixed autocomplete for words that may include underscores in suggestions.
+ - Fixed crash on OSX during symbol indexing when filetree menu is open (#499).
+ - Fixed crash on Linux during symbol indexing when filetree menu is open (fixes #507).
+ - Fixed duplicates between variables and dynamic words in auto-complete.
+ - Fixed uncommenting of the last line in the selection to keep un/comment reversible (fixes #509).
+ - Fixed assignment parsing when the type value is re-assigned (#498).
+ - Fixed mouse selection in auto-complete on OSX (fixes #496).
+ - Fixed fuzzy file search to not double open already opened files (#31).
+ - Fixed indentation of lines that end with partial long strings with opening brackets (#324).
+ - Fixed indentation of lines with long strings that include opening brackets (#324).
+ - Fixed indicators on table fields after variables that look like multiple assignments (#492).
+ - Fixed indicators on table fields after variables (fixes #492).
+ - Fixed variable usage based on static analysis.
+ - Fixed initial select-and-find search.
+ - Fixed returning focus to the editor after find-in-files followed by page search (#416).
+ - Fixed performance of initial fuzzy search for line numbers (closes #476).
+ - Fixed Output tab name when debugging aborted after run-time error.
+ - Fixed recursive file traversal to skip directories when mask is specified.
+ - Fixed crash in `collectgarbage` from the filetree on Linux (#425, #464).
+
+## v1.10 (May 13 2015)
+
+### Highlights
+ - Redesigned search functionality; added incremental search and replace-in-files preview.
+ - Updated love2d API for v0.9.2.
+ - Upgraded Mobdebug (0.62) to add vararg processing.
+ - Added `excludelist`/`binarylist` to exclude files and folders.
+ - Added skipping binary files during find-in-files and fuzzy search.
+
+### Special thanks
+ - To [David Feng](https://github.com/DavidFeng) for fixing a broken symbolic link.
+ - To [Robert Machmer](https://github.com/rm-code) for updated German translation and fixes for love2d engine name/description.
+ - To [Derek Bailey](https://github.com/dbaileychess) for adding context menu item to update the contents of the tree.
+
+### Improvements
+ - Added closing search results with `Close Page` for consistency (#416).
+ - Added option to show search results in multipe tabs (#416).
+ - Added package `IsValidCtrl` method (#166).
+ - Added skipping binary files in commandbar (#31, #455).
+ - Added handling of `**` in exclusion masks (#455).
+ - Added `excludelist`/`binarylist` to exclude files and folders (closes #455).
+ - Added `search.autohide` option to hide search panel after search (#416).
+ - Added `debugger.requestattention` to configure focus switch (closes #449).
+ - Added closing search panel on `Escape` in the editor (closes #450, #416).
+ - Added `search.zoom` setting to zoom search results (#416).
+ - Added warning when interpreter can't be loaded and the default one is used.
+ - Added support for `wxImage` used in `imagemap` (#436).
+ - Added icon tint processing (`imagetint` option).
+ - Added `search.contextlinesbefore`/`search.contextlinesafter` settings (#416).
+ - Added `search.autocomplete` setting do configure search autocomplete (#416).
+ - Added auto-complete for find and replace fields (#416).
+ - Added saving search settings between restarts (#416).
+ - Added deleting of protected text in Cut/Paste operations (closes #412).
+ - Added refresh context menu item to update the contents of the tree (thanks to Derek Bailey).
+ - Added ignoring assignment in comments for auto-complete.
+ - Added preview screen to check changes in replace-in-files (#416).
+ - Added search toolbar button to set/unset context in search results (#416).
+ - Allowed for larger default size of docked panels (#424).
+ - Allowed closing `Search Results` tab while search is in progress (#416).
+ - Disabled refresh when `outlineinactivity=nil` and `showonefile=true` (#337).
+ - Improved incremental processing to avoid marking table fields as variables.
+ - Improved logic to skip binary files during search (#416).
+ - Moved cancelling auto-complete popup to idle event (fixed #447).
+ - Moved winapi dll to `clibs` folder to avoid conflict with other winapi versions.
+ - Optimized `Go To File` file traversal in commandbar (#31).
+ - Redesigned the search panel (closes #416; closes #398).
+ - Removed option to request attention from breakpoint activation (#449, closes #454).
+ - Removed warnings from loose parser to stop polluting stderr on Linux (#425).
+ - Removed hardcoded references to menu positions to simplify adding new items.
+ - Removed saving .bak files as it's replaced by replace-in-files preview (#416).
+ - Reorganized folding to allow more editor-like components to be foldable.
+ - Switched to using `wxFileSize` instead of `Length` (fixes #458).
+ - Updated event documentation.
+ - Upgraded Mobdebug (0.62) to add vararg processing.
+ - Updated build files to use release version of Lua 5.3 (#453).
+ - Updated Corona interpreter to allow debugging on Linux using Wine.
+ - Updated folder traversing logic to limit number of open folders (fixes #441).
+ - Update Readme.md to use correct name for the LOVE framework (thanks to Robert Machmer).
+ - Updated Linux build scripts to add `debug` option.
+ - Updated love2d interpreter to use proper engine name/description (closes #433) (thanks to Robert Machmer).
+ - Updated german translation (#432, #70).
+ - Updated love2d APU for v0.9.2 (#247).
+ - Update german translation (thanks to Robert Machmer).
+ - Updated `Select and Find` to capture selection for subsequent use (#416).
+ - Updated `Find Next/Prev` to continue search using the current find text (#416).
+ - Updated unfolding of folded lines before delete or overwrite.
+ - Updated folding to collapse only when clicked on the header.
+ - Updated config samples to use `ID.code` instead of obsolete `G.ID_code`.
+
+### Fixes
+ - Fixed crash on Windows by disabling events in Outline refresh (fixes #442).
+ - Fixed file traversing not to match `foo.bar!` for `*.bar' mask (#416).
+ - Fixed showing of not translated messages that require pluralization.
+ - fix broken symbolic link (thanks to David Feng).
+ - Fixed an empty popup (that could lead to a crash) when dynamic words is on.
+ - Fixed commandbar positioning on Linux affected by 5b665477 (#31).
+ - Fixed loose parser to handle multiple assignments (fixes #430).
+ - Fixed editor activation after dragging of inactive tab (fixes #427).
+ - Fixed indentation after comment with markdown markup (closes #428, #324).
+ - Fixed auto-complete issue causing looping warning (#143).
+ - Fix commandbar position with split editor tabs (#31).
+ - Fixed re-indenting of selection with comments at the top of the file (#324).
+ - Fixed restoring pane size after hide/show operations (fixes #424).
+
+### Incompatibilities
+ - Removed saving .bak files as it's replaced by replace-in-files preview.
+
+## v1.00 (Mar 13 2015)
+
+### Highlights
+ - Added directory mapping to the project tree (closes #223).
+ - Added `Run to Cursor` (closes #413).
+ - Added support to set/unset start file for a project (closes #411).
+ - Added opening/creating file from the command bar (#31).
+ - Added `staticanalyzer.infervalue` to enable deeper/slower analysis (#414).
+ - Updated Corona API for v2015.2576.
+
+### Improvements
+ - Added `staticanalyzer.infervalue` to enable deeper/slower analysis (#414).
+ - Added project path in the error reporting for love2d/corona interpreters.
+ - Added an example with enabling Emacs bindings in the editor.
+ - Added Russian translations for new messages (#70).
+ - Added a warning on class resolution taking too much time in auto-complete.
+ - Added check for empty/comment lines when breakpoints are set.
+ - Added directory mapping to the project tree (closes #223).
+ - Added `Run to Cursor` (closes #413).
+ - Added document method `GetTabText` (#166).
+ - Added showing love2d console when requested.
+ - Added support to set/unset start file for a project (closes #411).
+ - Added requesting attention for debugger even when the file is not activated.
+ - Added reporting of location in more cases when debugging is suspended.
+ - Added starting debugging even when the file is not opened in the IDE.
+ - Added switching project directory from the command bar (#31).
+ - Added trimming of trailing spaces in the directory name when switching projects.
+ - Added closing preview if the file failed to load in commandbar (#31).
+ - Added handling of `Ctrl/Cmd-Enter` in commandbar to force open file (#31).
+ - Added skipping loading files with empty and directory names.
+ - Added trimming of trailing spaces in the file name when loading a file.
+ - Added file selection in the project tree after saving a new file.
+ - Added opening/creating file from the command bar (#31).
+ - Disabled menu item for renaming/editing for mapped directories (#223).
+ - Disabled field checks for local parameters in staic analyzer (closes #421).
+ - Improved static analyzer to handle more cases with `infervalue` set (#414).
+ - Refactored use of image constants in the project tree.
+ - Refactored document modification tracking to remove `SetDocumentModified`.
+ - Refactored path normalization for project directory.
+ - Updated Corona API for v2015.2576.
+ - Updated static analyzer output formatting.
+ - Updated analyzer to also check value of `pairs` parameter (#414).
+ - Updated `debugging suspended` message to not trigger with `runonstart`.
+ - Updated messages in interpreters to fix line endings.
+ - Updated lettercase in menu items for consistency.
+ - Updated UpdateUI handling to fix multi-view refresh, as in DocumentMap (#352).
+ - Updated Outline to use editor tab text (instead of a file name).
+ - Updated message on failure to start debugging to add the file name.
+ - Updated `debugging suspended` message to put location in quotes.
+ - Updated line check in command bar to not trigger on Windows file names.
+ - updated glewgl api (glew 1.12.0)
+
+### Fixes
+ - Fixed analyzer to check value of `ipairs` parameter (fixes #414).
+ - Fixed OS detection on Linux that sets `DYLD_LIBRARY_PATH` (fixes #417).
+ - Fixed saving auto-recovery record with no editor tabs opened (fixes #418).
+ - Fixed looping in auto-complete when processing recursive assignments.
+ - Fixed filename used in the recovery message.
+ - Fixed Output/Console window to stay shown after failure to start debugging.
+ - Fixed an issue with search initiated from Output/Console panels (fixes #406).
+ - Fixed auto-complete for non-default `acandtip.strategy` values (fixed #409).
+ - Fixed loading file with absolute name and line number (fixes #408).
+
+## v0.95 (Jan 30 2015)
+
+### Highlights
+ - Added fuzzy search with `Go To File`, `Go To Symbol`, `Go To Line`, and `Insert Library Function`.
+ - Added auto-complete support for LDoc '@tparam' and '@param[type=...]'.
+ - Added armhf architecture support (thanks to Ard van Breemen).
+ - Updated static analyzer to support `goto`/labels and bitops for Lua 5.2/5.3.
+ - Updated internal parser to support Lua 5.2/5.3 syntax.
+ - Updated Mobdebug to improve Lua 5.3 compatibility (thanks to Andrew Starks).
+ - Update API descriptions with functions new in Lua 5.3.
+
+### Special thanks
+ - To [Ard van Breemen](https://github.com/ardje) for armhf architecture support.
+ - To [Evandro Costa](https://github.com/evandro-costa) for Brazilian Portuguese (pt-br) translation.
+ - To [Andrew Starks](https://github.com/andrewstarks) for Lua 5.3 compatibility improvements.
+ - To [Alexis Jarreau](https://github.com/Fringale) for French translation update.
+ - To [Leo Bartoloni](https://github.com/bartoleo) for Italian translation update.
+ - To [riidom](https://github.com/riidom) for German translation update.
+
+### Improvements
+ - Added showing/hiding Output/Console panel during debugging.
+ - Added `bordersize` to configure sash size.
+ - Added package `LoadFile` method (#166).
+ - Added Russian translation for new messages (#70).
+ - Added syntax highlighting for functions new in Lua 5.3.
+ - Added `commandbar.prefilter` to commandbar to improve performance (#31).
+ - Added custom formatting for APIs.
+ - Added `Insert Library Function` to `Navigate` menu.
+ - Added hiding tooltip/auto-complete popup after undo/redo/delete operations.
+ - Added `api` handling to the config to support custom APIs.
+ - Added Lapis and Moonscript debugging links to README.
+ - Added `Contributing` section to README.
+ - Added LICENSE link to README.
+ - Added Lua 5.3 links to README; updated links to remove '.html'.
+ - Added `PgUp` and `PgDn` navigation for commandbar (#31).
+ - Added auto-complete support for LDoc '@tparam' and '@param[type=...]'.
+ - Added Brazilian Portuguese (pt-br) translation.
+ - Added showing the symbol under cursor in `Go To Symbol` (#385).
+ - Added `editor:ValueFromPosition` method (#166).
+ - Added `Go To Symbol` support to the commandbar (#31, closes #385).
+ - Allowed renaming of files with different case in the project tree.
+ - Added update of file name in the Outline when editor tab is updated (#337).
+ - Added check for `styles` being reset in the config file (closes #383).
+ - Added loading file from project directory with "proj file" on command line.
+ - Added skipping of binary files in commandbar preview (#31).
+ - Added CONTRIBUTING file.
+ - Added clearing Output window before showing Find-in-Files results.
+ - Added default values for Outline config settings (#337).
+ - Added package `GetProjectNotebook` method (#166).
+ - Added saving Outline tab configuration in the Project notebook (#337).
+ - Added `outline.sort` option to sort items in the outline (#337).
+ - Added `outline.showflat` option to show flat outline (#337).
+ - Added package `GetOutlineTree` method (#166).
+ - Add support for armhf architecture
+ - Added document `Save` method (#166).
+ - Added `init.lua` to the search path (fixes `require 'dist'`).
+ - Added forced garbage collection when switching from the app.
+ - Added penalty for missing characters in fuzzy search (#31).
+ - Added line navigation to `Navigate` menu (#31).
+ - Added handling of line numbers in command bar (#31).
+ - Added caching to improve commandbar performance on large folders (#31).
+ - Added setting explicit focus on preview tab in commandbar (#31).
+ - Added preview on first selection in commandbar (#31).
+ - Added file preview to commandbar (#31).
+ - Added fuzzy search for files in commandbar (closes #31).
+ - Added displaying the list of current tabs for commandbar (#31).
+ - Added commandbar prototype for file navigation (#31).
+ - Added reset of tokens when editor content is reloaded (#337).
+ - Enabled html and C/cpp specs by default (#395).
+ - Improved handling of complex types in LDoc expressions in auto-complete.
+ - Improved failed search 'shake' visualization by forcing window redraw.
+ - Improved command line file check for relative files on Windows.
+ - Split console output into shorter lines to improve memory usage and handling.
+ - Renamed `debugger.stackmax*` settings to `debugger.maxdata*`.
+ - Removed double check for invalid UTF-8 output in console.
+ - Refactored ID handling to allow using `ID.COMMENT` in config files.
+ - Removed `wxwidgets` from the list of default APIs for Lua interpreters.
+ - Refactored handling of special symbols in commandbar (#31).
+ - Removed border from tree controls (#305).
+ - Updated language files with new messages (#70).
+ - Update API descriptions with functions new in Lua 5.3.
+ - Updated loose parser to support Lua 5.2+ labels.
+ - Updated loose parser to support `goto` and Lua 5.3 bitops.
+ - Updated Metalua to support Lua 5.3 bitops.
+ - Updated Metalua to support `goto`/labels in static analysis for Lua 5.2/5.3.
+ - Upgraded Mobdebug (v0.611) to fix tooltips during Corona debugging (closes #387).
+ - Updated `CommandBarShow` to accept text fragment to select (#31).
+ - Updated `GetKnownExtensions` to accept an optional extension to match against.
+ - Updated `FileRead` to accept optional length.
+ - Updated layout settings to use constants and new package API.
+ - Updated parser to avoid splitting `foo.bar` in incremental processing.
+ - Upgraded MobDebug (0.61) to add `basedir` support.
+ - Updated status refresh to only happen for the active editor.
+ - Updated toolbar UI checks to happen when running/debugging (#352).
+ - Updated Corona integration to hide console on OSX (2014.2393+).
+ - Upgraded Mobdebug to 0.613 to improve Lua 5.3 compatibility (#401); thanks to @andrewstarks.
+ - Updated usage instructions in README.
+ - Update de.lua
+
+### Incompatibilities
+ - Renamed `debugger.stackmax*` settings to `debugger.maxdata*`.
+ - Removed `wxwidgets` from the list of default APIs for Lua interpreters; use `api` config setting to include it.
+
+### Fixes
+ - Fixed search navigation to shift horizontally when `usewrap` is off.
+ - Fixed indentation for lines with mixed string separators (#324, #388).
+ - Fixed indentation for lines with escaped slashes (#324, closes #388).
+ - Fixed find-and-replace to replace in already selected fragment if matched.
+ - Fixed refresh of files in command bar preview when selected (#31).
+ - Fixed recovery of empty (`untitled`) tabs.
+ - Fixed an auto-complete issue after `repeat until <var>`.
+ - Fixed setting focus to the editor in commandbar with one tab (#31).
+ - Fixed auto-complete after text not separated by a whitespace or bracket.
+ - Fixed an error when disabling outline by setting `outlineinactivity=nil`.
+
+## v0.90 (Nov 08 2014)
+
+### Highlights
+ - Added function outline.
+ - Added Lua 5.3 (beta) binaries and debugging support.
+ - Added scope-aware auto-complete for local/global variables.
+ - Added hiding/showing files by type in the project/filetree.
+ - Added Esperanto (eo) translation.
+ - Improved compatibility with Lua 5.2 interpreter.
+ - Improved compatibility with system/custom Lua interpreter.
+
+### Special thanks
+ - To [cosmotect](https://github.com/cosmotect) for added Esperanto translation.
+ - To [riidom](https://github.com/riidom) for updated German translation.
+ - To [Christoph Kubisch](https://github.com/pixeljetstream) for glsl improvements.
+ - To [Wojciech Milkowski](https://github.com/milkowski) for making indentation guide configurable.
+ - To [sclark39](https://github.com/sclark39) for adding project dir to find dialog paths.
+
+### Improvements
+ - Added Lua 5.3 (beta) support and binaries.
+ - Added Russian translation for new messages (#70).
+ - Added `AddPackage` and `RemovePackage` methods (#166).
+ - Added `CreateBareEditor` package method (#166).
+ - Added `GetAPI` method for interpreter (#166).
+ - Added `GetOutputNotebook` package method (#166).
+ - Added `IsPanelDocked` package method (#166).
+ - Added `Run` and `Run as Scratchpad` buttons to the toolbar.
+ - Added `acandtip.maxlength` option for setting the length of a tooltip.
+ - Added `function` handling to the token processing.
+ - Added `imagemap` setting to support custom images.
+ - Added `onEditorCallTip` method (#166).
+ - Added `showonefile` option for the outline to always show one file (#337).
+ - Added an Esperanto (eo) translation.
+ - Added build support for Lua 5.3-alpha and luasocket for Lua 5.3.
+ - Added check for existing process id before stopping the process.
+ - Added check for pending data to improve re-starting debugging session.
+ - Added collapsing outlines for files in inactive tabs (#337).
+ - Added creating italic font if only the main one is provided.
+ - Added document `SetActive` method (#166).
+ - Added drag-and-drop support for the Outline tab (#337).
+ - Added example of enabling `Opt+Shift+Left/Right` shortcut on OSX.
+ - Added function outline (closes #337, closes #222).
+ - Added handling of `~` in launch command path.
+ - Added hiding/showing files by type in the project/filetree (closes #375).
+ - Added local/global indicators to function outline (#337).
+ - Added marking file after showing files in the tree (#375).
+ - Added navigation based on 'filename:line:pos' in the Output window.
+ - Added option for not/showing anonymous functions in the outline (#337).
+ - Added package `AddTool` and `RemoveTool` methods (#166).
+ - Added package `CreateImageList` method (#166).
+ - Added package `ExecuteCommand` method (#166).
+ - Added package `FindTopMenu` method (#166).
+ - Added package `GetAppName` method and removed hardcoded name references (#166).
+ - Added package `GetConsole` method (#166).
+ - Added package `GetKnownExtensions` method (#166).
+ - Added project dir to find dialog paths; thanks to @sclark39 (closes #358).
+ - Added rule to enable `Set From Current File` only when available.
+ - Added scope-aware auto-complete for local/global variables (closes #291).
+ - Added scrolling to the top of the outline when `showonefile` is set (#337).
+ - Added sending Corona SDK simulator output to the Output window on Windows.
+ - Added translation label for `Toggle Bookmark` toolbar icon (#70, #373).
+ - Added unindent on backspace (controlled by `editor.backspaceunindent`).
+ - Added view menu for the Outline window (#337).
+ - bugfix in output callback for commandline tools
+ - bugfix on extension change save-as, related to new indication handling
+ - cg/hlsl/glsl refine isfndef capture, mostly to react on GLSL's layout mechanism
+ - Disabled moving of Output/Console/Project tabs between panels.
+ - Disabled closing tabs in floating panels.
+ - Improved `ffitoapi` tool logic when no replacement is made.
+ - Improved compatibility with Lua 5.2 interpreter (closes #357).
+ - Improved scroll positioning in the outline after tab changes (#337).
+ - Improved support for non-lua specs in the outline (#337).
+ - Minor update to indentation guides handling (#371).
+ - Moved 'default' search path to be searched first (#357).
+ - Reduced rate of toolbar UI checks to improve performance (fixes #352).
+ - Reduced the number of focus changes in the outline (#337).
+ - Reduced unnecessary editor processing to improve performance (#352).
+ - Refactored `GetBitmap` package method (#166).
+ - Refactored `tools` interface to make it easy to add/remove tools.
+ - Refactored adding editor tab to ensure callbacks have document data.
+ - Refactored default `fprojdir` and `fworkdir` from the interpreter code.
+ - Refactored drag-and-drop processing for Project/Output window tabs (#377).
+ - Refactored panel docking; added `AddPanelDocked` package method (#166).
+ - Refactored timer usage for consistency.
+ - Remove function dropdown from the toolbar (#337).
+ - Removed menu separator from the Tools menu.
+ - Removed prepending libraries for debugging to LUA_CPATH when custom interpreter is specified.
+ - Removed reference to `funclist`, which is no longer needed.
+ - Removed unused image files.
+ - Renamed `markvars` method used in spec files to `marksymbols`.
+ - Renamed image files to have names correspond to the content.
+ - Reorganized default config settings.
+ - Reorganized token list processing to keep it within the editor.
+ - Restored removed function in Lua spec (partial revert of 713d0935).
+ - Switched to using `Is{Input|Error}Available` instead of `stream:CanRead`.
+ - updated luxinia2 related files
+ - Update de.lua
+ - Updated C-based specs to handle function calls without parameters.
+ - Updated C-based specs to use `marksymbols` to provide outline for C functions.
+ - Updated Lua 5.3 build scripts.
+ - Updated `AddPackage` to assign package file name (#166).
+ - Updated `RemoveMenuItem` to disconnect handlers attached to the main frame (#166).
+ - Updated `package.config` description to remove reference to Lua 5.2.
+ - Updated `showanonymous` to a label for anon functions in the outline (#337).
+ - Updated code based on static analysis suggestions.
+ - Updated command launch handling to allow output suppression.
+ - Updated function call indicator to support `isfncall` and `marksymbols`.
+ - Updated function indicator processing to use ranges.
+ - Updated handling of extensions to allow more symbols in extensions.
+ - Updated images in the outline; added `showmethodindicator` option (#337).
+ - Updated indicator processing to improve performance on large files.
+ - Updated interpreter processing to run after packages are loaded.
+ - Updated label for anonymous functions in the outline (#337).
+ - Updated language files with new messages (#70).
+ - Updated markup processing to allow for 3+ markup sequences.
+ - Updated markup processing to support links in non-editor documents.
+ - Updated messages for to match translations (#70).
+ - Updated method of collapsing outline to fix crash on OSX (#337, fixes #368).
+ - Updated outline logic to show on the very first launch (#337).
+ - Updated outline to always expand functions in the current file (#337).
+ - Updated outline to show files without functions (#337).
+ - Updated outline to track filename changes after `Save As` (#337).
+ - Updated outline to use `AddPackage` method (#337).
+ - Updated output callback processing not to run when nothing to process.
+ - Updated package `GetRootPath` to accept file/directory name (#166).
+ - Updated parser to avoid 'breaking' statements during incremental processing.
+ - Updated parser to handle `...` in function parameters.
+ - Updated parser to report function token before parameters (#337).
+ - Updated parser to store position for not-quite-valid function names.
+ - Updated processing of function indicators when auto-analyzer is off.
+ - Updated search/replace to always use the current editor/output/console tab.
+ - Updated static analizer to accept typedlua parser in addition to metalua.
+ - Updated tooltip processing to make it more consistent and better use space.
+ - Updated translation building script to handle non-string parameters (#70).
+ - Updated un/comment to keep the current selection and caret position (#360).
+ - Upgraded MobDebug (0.606) for `Detach Process` to correctly close debugging.
+ - Upgraded Mobdebug (0.607) to fix debugging after `Detach Process` command.
+
+### Incompatibilities
+ - Renamed `markvars` method used in spec files to `marksymbols`.
+
+### Fixes
+ - Fixed 'slow' mode of static analysis to work with Metalua 0.7.2.
+ - Fixed `Output` tab name after stopping/completing remote debugging.
+ - Fixed `Project` label shown untranslated in other languages (#70, #373).
+ - Fixed `Run` toolbar label not being translated (#70, #373).
+ - Fixed activation in `tree:FindItem` when new editor tab is opened (#166).
+ - Fixed an error when dragging Stack/Watch/other tabs between notebooks.
+ - Fixed an issue with removing first menu item in RemoveMenuItem (#166).
+ - Fixed an issue with searching in Output and Console windows.
+ - Fixed column indicator on lines with tabs (fixes #379).
+ - Fixed disabling Stack/Watch icons in the toolbar.
+ - Fixed error after using Enter multiple times in `Find in Files` on OSX.
+ - Fixed file renaming in the filetree after using `SaveAs`.
+ - Fixed flicker in the outline when auto-complete is shown (#337).
+ - Fixed focus switch after selecting a function in the outline and editing (#337).
+ - Fixed handling of remapped image files; improved error reporting.
+ - Fixed incorrect `binary not` calculation with wxlua and LuaJIT 2.1.
+ - Fixed index check during tab name update.
+ - Fixed keeping toolbar status after hiding it.
+ - Fixed localization in function outline (#337).
+ - Fixed localization to avoid error in `SaveAs` processing.
+ - Fixed navigation in function outline when `showonefile` is set (#337).
+ - Fixed not hiding directories when files without extension are hidden (#375).
+ - Fixed off-by-one error in function outline position tracking (#337).
+ - Fixed outline refresh after quick tab switches (#337).
+ - Fixed refresh of 'background' markers during debugging.
+ - Fixed replacement when selection doesn't match the text being searched for.
+ - Fixed search in files/directories with `%` in the name (fixes #369).
+ - Fixed storing position in `function` handling.
+ - Fixed stream reading for the Output to only include actually read chars.
+ - Fixed unused variables and constants based on static analysis.
+
+## v0.80 (Aug 31 2014)
+
+### Highlights
+ - Added support for expanding table elements in Watch window.
+ - Added editing of values in Watch window.
+ - Added highlighting all instances of selected text.
+ - Added replacing all selected instances using a dialog.
+ - Added saving (one-line) layout for editor tabs.
+ - Added support for `filename:<line>` and `filename:p<pos>` on the command line.
+ - Added search in Console and Output windows.
+ - Improved compatibility with Lua 5.2 to run the IDE.
+
+### Special thanks
+ - To [Li Jia](https://github.com/tiwb) for fixing remote path map when 'runonstart' option is set.
+
+### Improvements
+ - Added default values for `hotexit` and `saveallonrun` settings.
+ - Added debugger `GetHostName` and `GetPortNumber` methods (#166).
+ - Added a check for a local shortcut (F2/Del) being enabled before triggering.
+ - Added refresh of expanded Watch values.
+ - Added support for expanding table elements in Watch window.
+ - Added package `AddWatch` method (#166).
+ - Added `toolbar.iconsize` to configure toolbar icon size.
+ - Added `run-as-scratchpad` toolbar icon (hidden by default).
+ - Added `run` toolbar icon (hidden by default).
+ - Added `find-in-files` toolbar icon (hidden by default).
+ - Added support for disabling individual icons in the toolbar.
+ - Added replacing all selected instances using a dialog (closes #342).
+ - Added highlighting all instances of selected text (closes #344).
+ - Added `filetree.mousemove` option to disable drag-n-drop (closes #351).
+ - Added `suspended` to Output panel title when debugger is stopped (closes #350).
+ - Added a warning when remote console can't evaluate an expression (#350).
+ - Added handling of `osname` to package dependencies (#166).
+ - Added `onIdle` event (#166).
+ - Added `tree:FindItem` method (#166).
+ - Added package `Yield` method (#166).
+ - Added ability to set location of `ini` file from config.
+ - Added ability to load bitmap as toolbar icon.
+ - Added package `RemoveMenuItem` method (#166).
+ - Added ability to customize toolbar.
+ - Added saving (one-line) layout for editor tabs.
+ - Added centering of the screen after re-indenting and sorting (#337).
+ - Added local to variable 'activated' in function mapRemotePath
+ - Added centering of the screen after 'go to definition' and back (#337).
+ - Added centering of the screen after selection from the function list (#337).
+ - Added package `onEditorUpdateUI` event (#166).
+ - Added package `AddPanel` method (#166).
+ - Added package `GetUIManager` method (#166).
+ - Added editor `SetupKeywords` method (#166).
+ - Added document `GetFileExit` method (#166).
+ - Added `onEditorPainted` event (#166).
+ - Added support for `name:<line>` and `name:p<pos>` on the command line.
+ - Added error reporting on failure to load file from the command line.
+ - Added metalua components to MANIFEST (missing in packaging on OSX).
+ - Added saving auto-recovery record on switching from the application.
+ - Added `hotexit` option to exit without forcing to save files.
+ - Added setting of margin properties to support their reordering.
+ - Added error reporting on failure to delete directory from project tree.
+ - Added check for shortcut in conflict being enabled before activating (#233).
+ - Added workaround for missing `GetChildren` call in some wxlua configurations.
+ - Added unfolding modified lines to avoid leaving hidden lines in the editor.
+ - Added search in Console and Output windows (closes #313).
+ - Allowed double-click selection in the Output window (#313).
+ - Avoided system lib conflict when debugging by using bundled libs (fixes #355).
+ - Disabled editing on non-root watch elements.
+ - Disabled smart indentation for multi-line comments and strings (#324).
+ - Disabled re-indentation of multi-line comments/strings (#324).
+ - Disabled `Opt+Shift+Left/Right` shortcut as it conflicts with block selection.
+ - Enabled editing of values in Watch window.
+ - Enabled `editor.autoreload` by default.
+ - Improved config handling when `editor` configuration is removed/empty.
+ - Improved `autotabs` logic when the file starts with indentation.
+ - Improved auto-complete logic that tracks variable assignments (fixes #343).
+ - Improved cursor positioning after re-indenting or sorting.
+ - Improved compatibility with Lua5.2 to run the IDE.
+ - Increased default project history length to 20.
+ - Removed check for multiple references in stack values.
+ - Refactored stack processing to use methods to handle expandable table values.
+ - Refactored file name generation for compilation and static analysis.
+ - Removed erroneous message about failure to open '-psn...' file on OSX.
+ - Renamed all image files to remove cruft from their names.
+ - Simplified logic for watch processing.
+ - Switched from using TreeItemData to Lua tables for watch expressions.
+ - Switched to using tree control for watches.
+ - Updated copas library to support non-blocking requests using socket.http.
+ - Updated Stack and Watch views to better stringify keys.
+ - Updated watch menu to handle item under mouse cursor.
+ - Updated constants for image lists.
+ - Updated `FindMenuItem` method to search in the main and specified menus (#166).
+ - Updated `ide.config` to access wx, wxstc, and os through metatable.
+ - Updated recent projects/files handling to allow menus to be removed.
+ - Updated package `FindMenuItem` method (#166).
+ - Updated `autotabs` to respect `usetabs` when no indentation is present.
+ - Updated copy/cut to capture one instance when all are the same (closes #345).
+ - Updated default marker colors for lighter border (#305).
+ - Updated auto-recovery logic to skip missing files (fixes #323).
+
+### Fixes
+ - Fixed disabling auto-recovery on app switching.
+ - Fixed find-in-files error when used with editor not in focus (fixes #354).
+ - Fixed package `GetStack` method to return proper control (#166).
+ - Fixed Watch window background color on some Mint Linux systems.
+ - Fixed debugging error when `debugger.runonstart` is specified (fixes #348, #341).
+ - Fixed keybinding for `Ctrl-<punctuation>` working on Linux (fixes #346).
+ - Fixed localization based on static analysis.
+ - Fixed remote path map when 'runonstart' option is set.
+ - Fixed error reporting during Analyze (fixes #340).
+ - Fixed using image lists for stack/filetree to keep them in memory.
+ - Fixed indentation when Enter is hit at the middle of a line.
+ - Fixed formatting of `until` statements (fixes #335).
+ - Fixed formatting of strings including comments '--' (#335).
+ - Fixed restoring proper file names for unsaved tabs during auto-recovery.
+ - Fixed deleting 'dynamic words' when multiple lines are removed.
+ - Fixed `love.update` description (#247).
+ - Fixed indentation of strings starting from `endSomething` (#324).
+ - Fixed use of '%' in replacement for Lua5.2 compatibility (#153, #156, #143).
+ - Fixed warnings from static analysis.
+
+## v0.70 (Jun 18 2014)
+
+### Highlights
+ - Added support for OpenResty/Nginx, moonscript, and Lapis debugging.
+ - Added re-indentation of selected fragment or entire file.
+ - Added line mapping support for debugging Lua-based languages (e.g. moonscript).
+ - Added `editor.wrapindentmode` and `editor.wrapstartindent` settings.
+ - Fixed debugger compatibility with Lua 5.2.
+ - Fixed `F2` shortcut not working in file tree and watch panel.
+ - Fixed replace-in-files when saving backup copy is turned off.
+
+### Special thanks
+ - To [sclark39](https://github.com/sclark39) for `format.apptitle` option to format IDE title.
+ - To [Christoph Kubisch](https://github.com/pixeljetstream) for glslc improvements.
+ - To [Yonaba](https://github.com/Yonaba/) for updated French translation.
+
+### Improvements
+ - Added support for nginx debugging (Mobdebug 0.564).
+ - Added support for custom debugger initializer (global or interpreter-based).
+ - Added line mapping support for debugging Lua-based languages (e.g. moonscript).
+ - Added support to force local execution in console by prepending `!` (#326).
+ - Added setting proper `arg[0]` value during debugging (fixes #329).
+ - Added double click navigation in the Output window for unnamed files.
+ - Added centering of line after double click in the Output window.
+ - Added `editor.wrapindentmode` and `editor.wrapstartindent` settings.
+ - Added a workaround for focus switching between controls on OSX (#89, #327).
+ - Added assertion to ensure inserted editor is not in the notebook already.
+ - Added `format.apptitle` option to format IDE title (thanks to @sclark39).
+ - Added restoring cursor position after sorting/re-indenting.
+ - Added `onEditorUserlistSelection` event for userlist selection (#166).
+ - Added `onEditorAction` event for cut/copy/paste actions (#166).
+ - Added package `GetEditorWithFocus` method (#166).
+ - Added `editor.extradescent` option for line spacing (#305).
+ - Added centering of line on page after re-loading file with a known position.
+ - Added re-indentation of selected fragment or entire file (closes #324).
+ - Added sorting of the entire file if nothing is selected.
+ - Added `Edit | Source` sub-menu.
+ - Added centering line on page after bookmark navigation.
+ - Added `GetProjectTree`, `GetWatch`, and `GetStack` package calls (#166).
+ - Added bookmark-toggle toolbar icon (#233).
+ - Disabled message on failure to read symlinked folder content on Windows.
+ - Disabled breakpoint toggling when editor is not in focus.
+ - Disabled changing toolbar color with `auxwindow` as it only works for the dropdown.
+ - Increase font size for code fragments in markup (#305).
+ - glslc: change domain detection to be compatible with file.comp.glsl and file.tese
+ - Removed checks for specific errors in Local/Remote console.
+ - Removed focus handling workaround for editor tab changes (#89, #327).
+ - Renamed `menuformatrecentprojects` to `format.menurecentprojects` (#305).
+ - Removed handling of project dropdown in menu as it's no longer needed (#305).
+ - Reorganized menu shortcut conflict handling (#233).
+ - simplified glslc usage (compile and link based on file extensions)
+ - treat unreal shaders as hlsl
+ - Updated auto-complete logic to use configured spec separators.
+ - Updated logic for populating placeholders in dropdown menus.
+ - Updated french translation (thanks to @Yonaba)
+ - Updated menu items to stay enabled only when appropriate object has focus.
+ - Updated indentation logic for if/elseif/while/for split into 2+ lines (#324).
+ - Updated indentation logic to ignore comments (#324).
+ - Updated README with supported engines and installation instructions.
+ - Updated breakpoint-toggle toolbar icon to better match other icons (#305).
+ - Updated bookmark navigation to wrap around (#233).
+ - Updating sorting to keep original line endings.
+ - Upgraded metalua to v0.7.2.
+
+### Fixes
+ - Fixed setting control focus when the main frame is hidden.
+ - Fixed loading packages with dashes in filenames (fixes #330).
+ - Fixed toolbar to stay shown after failure to start debugging.
+ - Fixed focus on the editor after closing a dialog on OSX (fixes #328).
+ - Fixed crash on OSX when changing focus while the app is being closed (#327).
+ - Fixed some toolbar buttons being enabled with no editor tab open.
+ - Fixed toolbar stealing focus after closing floating panels and dropdowns (#327).
+ - Fixed restoring control focus when the app gets focus on OSX (fixes #327).
+ - Fixed activating editor when starting the app on OSX (#327).
+ - Fixed auto-complete to not offer the word the cursor is on.
+ - Fixed hiding auto-complete when the only option matches what's typed.
+ - Fixed an error when all editor tabs are closed.
+ - Fixed replace-in-files when saving backup copy is turned off.
+ - Fixed re-indenting of anonymous functions in tables (#324).
+ - Fixed `F2` shortcut not working in file tree and watch panel (#233).
+ - Fixed debugger compatibility with Lua 5.2 (Mobdebug 0.561).
+
+## v0.60 (May 11 2014)
+
+### Highlights
+ - Added support for switching breakpoints at run-time.
+ - Added bookmark handling.
+ - Added `Detach process` command to stop debugging and continue process.
+ - Added detaching debugger server.
+ - Added showing/hiding toolbar and status bar.
+ - Simplified user interface and updated application icons.
+ - Updated love2d API for v0.9.1.
+ - Updated Moai API for v1.5.
+ - Added `outputshell.usewrap` to set Output wrapping; on by default.
+ - Added `editor.wrapflags` to configure line wrapping indicators.
+ - Added `editor.foldflags`; set default to draw one line when folded.
+ - Added `editor.foldtype` with box, cirle, arrow, and plus types.
+ - Added `editor.extraascent` option to add line spacing.
+
+### Special thanks
+ - To [bartoleo](https://github.com/bartoleo) for italian translation update.
+ - To [riidom](https://github.com/riidom) for german translation update.
+ - To [sclark39](https://github.com/sclark39) for Copy Full Path implementation.
+ - To [DanielSWolf](https://github.com/DanielSWolf) for Moai API update for v1.5.
+ - To [madmaxoft](https://github.com/madmaxoft) for AnalyzeString patch.
+ - To [crumblingstatue](https://github.com/crumblingstatue) for Zoom update.
+ - To [SiENcE](https://github.com/SiENcE) for notepad++ colorscheme update.
+
+### Improvements
+ - Added new italian translations (thanks to @bartoleo)
+ - Added Russian translation for new messages (#70).
+ - Adding Copy Full Path to editor tabs, and a Clear Output Window option to the Output tab (thanks to @sclark39)
+ - Added support for packages in config files (#166).
+ - Added formatting for Recent Projects menu (#305).
+ - Added `Detach process` command to stop debugging and continue process.
+ - Added re/docking of Watch/Stack notebooks on tab background doubleclick (#305).
+ - Added bookmark handling (closes #233).
+ - Added `Clear items` to the Recent Files menu (ref #305).
+ - Added recent files dropdown to the toolbar (ref #305).
+ - Added applying new UI settings after upgrade (ref #305).
+ - Added toolbar button dropdown with recent projects (ref #305).
+ - Added `Choose Project Directory` to the toolbar (ref #305).
+ - Added floating/docking of notebooks on tab background doubleclick (ref #305).
+ - Added Recent Project menu refresh after switching projects (ref #305).
+ - Added setting project directory by renaming the filetree root element (#305).
+ - Added filetree popup menu with the list of projects (ref #305).
+ - Added 'Recent Projects' menu (ref #305).
+ - Added package `GetLaunchedProcess` call (ref #166).
+ - Added `IsRunning` and `IsConnected` API calls for the debugger (ref #166).
+ - Added `editor.wrapflags` to configure line wrapping indicators (ref #305).
+ - Added explicit sorting of files in the filetree.
+ - Added showing/hiding of the status bar (ref #305).
+ - Added auto-showing toolbar when debugging starts (ref #305).
+ - Added showing/hiding of the toolbar (ref #305).
+ - Added `outputshell.usewrap` to set Output wrapping; on by default (ref #305).
+ - Added `editor.foldflags`; set default to draw one line when folded (ref #305).
+ - Added `editor.extraascent` option to add line spacing (ref #305).
+ - Added explicit conversion to number for numeric settings.
+ - Added `editor.foldtype` with box, cirle, arrow, and plus types (ref #305).
+ - Added opening a new tab on double click on tab background (ref #305).
+ - Added ActivateItem method to the filetree API (ref #166).
+ - Added onFiletree* package events (ref #166).
+ - Added setting margin mask to allow for different margin order.
+ - Added support for switching breakpoints at run-time (closes #288).
+ - Added stopping debugging when debugger server is detached/stopped.
+ - Added opening file on one-click in icon/padding area in the filetree.
+ - Added AnalyzeString function (thanks to @madmaxoft).
+ - Added zooming for Output/Console windows (ref #290).
+ - Added IDs for Zoom menu items (ref #290).
+ - Add zoom actions with appropriate keyboard shortcuts to View menu (thanks to @crumblingstatue)
+ - Added detaching debugger server.
+ - Added skipping reporting for known globals in static analysis (closes #286).
+ - Added support for running zbstudio script from any folder on OSX.
+ - Adjusted `code` color in the comment markup for better visibility (#305).
+ - Changed order of stopping debugger and saving settings (ref #305).
+ - Cleaned unused variables and functions based on static analysis.
+ - Disallowed closing Output/Console/Project tabs (fixes #310).
+ - Disabled current project on the recent projects list (ref #305).
+ - Disable function call indicator by default to reduce clutter (ref #305).
+ - Disabled startng multiple find-in-files searches.
+ - Disabled editing/dragging of the project directory in the filetree.
+ - Enabled editor width auto-adjustment when wrapping is off.
+ - Enable retina support (`hidpi=true`) by default on OSX (#305).
+ - Increased default font size in the editor (ref #305).
+ - Increased wait time for Gideros player to start for more reliable launching.
+ - Made fold and marker margins wider (ref #305).
+ - Made jump-to-line in the Output window to work faster and more reliably.
+ - Moved `Project Directory` menu item lower to not activate on OSX (ref #305).
+ - Moved code to populate `wx` and `wxstc` descriptions to API files.
+ - Rearranged global functions in lua spec for simpler grouping (ref #79).
+ - Reduced sash (border between subsections) in all notebooks (ref #305).
+ - Reduced the line number margin width and default font size (ref #305).
+ - Refactored editor config references.
+ - Removed `Clear Dynamic Words` menu as it's rarely used.
+ - Removed the gripper on the toolbar (ref #305).
+ - Removed project selection dropdown from the filetree (ref #305).
+ - Removed paragraph conversion from love2d API conversion script (ref #247).
+ - Removed border around Output/Console panels (ref #305).
+ - Removed deprecated `startfile` interpreter option.
+ - Removed explicit margin numbers to make configuraton simpler.
+ - Removed border around editor components.
+ - Reordered markers to keep the curent line marker on top (#305).
+ - Reorganized and updated configuration examples.
+ - Set def linenumber font size as one smaller than editor font size (ref #305).
+ - Switched to plain background for the toolbar (ref #305).
+ - Switched to AuiToolBar as it provides buttons with dropdowns (ref #305).
+ - Upgraded Mobdebug (0.56).
+ - Upgraded debugger (mobdebug 0.553) to fix an issue with STEP command.
+ - Upgraded copas to the current version (v1.2.1).
+ - Updated default fonts for Windows and Linux for better looking ones (#305).
+ - Update de.lua (thanks to @riidom)
+ - Updated language files with new messages (#70).
+ - Updated copyright messages.
+ - Updated `Go To Line` menu item and its translations.
+ - Updated build scripts with a fix for a wxlua compilation issue (#260).
+ - Updated build prerequisites Linux install script.
+ - Updated default indicator color to more neutral one (#305).
+ - Updated OSX build script to use 10.7 SDK with 10.6 min-version (#260).
+ - Updated Mobdebug (0.555) to add support for `pause` debugger call.
+ - Updated lua interpreter to remove caching of executable path.
+ - Updated resetting pid only after completing non-debbugged process.
+ - Updated shortcut for Recent File navigation (ref #305).
+ - Updated application icons (ref #305).
+ - Updated stack/watch panel captions to be invisible (ref #305).
+ - Updated interpreters to check `ProgramFiles` env variable on Windows.
+ - Updated panel captions to be invisible (rev #305).
+ - Updated 'window unhide' logic (Windows only) to be called less frequently.
+ - Updated love2d interpreter to not hide the application window.
+ - Updated file sorting to be case-insensitive on all platforms.
+ - Updated filetree menu to use 'Edit Project Directory' on root element (#305).
+ - Updated love2d API to fix typos in descriptions (ref #247).
+ - Updated love2d API for v0.9.1 (ref #247).
+ - Updated love2d API conversion script to handle top-level functions (ref #247).
+ - Updated `PackageUnRegister` call to return the package on success (ref #166).
+ - Updated fold/wrap flag handling to work with wxwidgets 2.8 (ref #305).
+ - Updated breakpoint/currentline markers for less contrast colors (ref #305).
+ - Updated default folding to use lighter colors (ref #305).
+ - Updated default colors to have less contrast (ref #305).
+ - Updated Open file dialog to use current file or project location (closes #303).
+ - Updated Moai API for v1.5 (thanks to @DanielSWolf).
+ - Updated `autoanalyzer` option to more common spelling (analizer -> analyzer).
+ - Updated auto-complete to show in IDLE event for smoother processing.
+ - -minor color changes to notepad++ colorscheme (thanks to @SiENcE).
+
+### Incompatibilities
+ - Added opening a new tab on double click on tab background.
+ - Added re/docking of Watch/Stack notebooks on tab background doubleclick.
+ - Enabled retina support (`hidpi=true`) by default on OSX.
+ - Removed deprecated `startfile` interpreter option; use `startwith` option instead.
+ - Updated file sorting to be case-insensitive on all platforms.
+ - Updated `autoanalyzer` option to more common spelling (analizer -> analyzer).
+ - wxwidgets 2.8 is no longer supported (wxwidgets 2.9.5+ required).
+
+### Fixes
+ - Fixed Corona interpreter to clean debugger in `plugin` folder (Win).
+ - Fixed file tree activation of a deleted file.
+ - Fixed switching to full screen and restoring status bar on OSX (ref #305).
+ - Fixed right-click handling in filetree on OSX broken by 3709f61f (ref #166).
+ - Fixed usage of `self` in one of package API calls (ref #166).
+ - Fixed find dialog to stay on top after search directory selection on OSX.
+ - Fixed search result navigation after clicking beyond the end of line.
+ - Fixed an issue with running processes not terminated when closing IDE.
+ - Fixed an error after manual canceling Find-in-files dialog.
+ - Fixed an issue with deleting column-based selection (fixes #300).
+ - Fixed an error in variable indicator processing.
+ - Fixed looping when `valuetype` creates self-reference in APIs (ref #297).
+ - Fixed `elseif` auto-indentation (fixes #294).
+ - Fixed focus for Find field in the find dialog on some instances of OSX.
+
+## v0.50 (Mar 10 2014)
+
+### Highlights
+ - Fixed opening files and launching on OSX 10.6.x and 10.9.1+.
+ - Improved CPU utilization when idle on OSX.
+ - Added handling of command-line parameters.
+ - Implemented various auto-complete and tooltip improvements.
+ - Updated Love2d API for 0.9.0.
+ - Updated Corona API auto-complete/description to match v2014.2189 (G2.0).
+ - Updated Marmalade Quick API for v7.2.
+ - Updated French, German, Italian, and Russian translations.
+
+### Special thanks
+ - To [Asmageddon](https://github.com/Asmageddon) for fixed launching zbstudio from folders with spaces.
+ - To [Christoph Kubisch](https://github.com/pixeljetstream) for various luxinia2 fixes.
+ - To [Yonaba](https://github.com/Yonaba/) for updated French translation.
+ - To [riidom](https://github.com/riidom/) for updated German translation.
+ - To [bartoleo](https://github.com/bartoleo/) for updated Italian translations.
+
+### Improvements
+ - Added explicit focus for Find field in the find dialog on OSX.
+ - Added version dependency check for loaded plugins.
+ - Added `auxwindow` attribute to style auxiliary windows.
+ - Added sha2 library to provide sha256 hashing.
+ - Added package GetRootPath/GetPackagePath calls (ref #166).
+ - Added package FindMenuItem API call (ref #166).
+ - Added API call to analyze one file.
+ - Added restoring markers after external modification and file reload.
+ - Added displaying number of selected characters and instances (closes #274).
+ - Added using safe load for external data instead of loadstring.
+ - Added check for editor state during Edit menu display (ref #70).
+ - added italian translations; thanks to [bartoleo](https://github.com/bartoleo/).
+ - Added Russian translation for new items in the main menu (ref #70).
+ - Added package GetApp method (ref #166).
+ - Added package GetDebugger API call (ref #166).
+ - Added setting project directory passed as a parameter (second instance).
+ - Added Shift+Zoom to zoom all editors (closes #269).
+ - Added `alpha` setting for sel/seladd/caretlinebg styles.
+ - Added package GetToolBar API call (ref #166).
+ - Added `seladd` setting for styling additional selections.
+ - Added `Select and Find Next/Prev` (closes #268).
+ - Added showing search dialog for Quick Find on first search (closes #265).
+ - Added `nomousezoom` option for Console/Output windows (closes #266).
+ - Added error reporting when debugger server fails to start (closes #263).
+ - Added support for command line parameters for GSL-shell (ref #251).
+ - Added support for editor shortcuts and included standard OSX ones (closes #252).
+ - Added auto-complete for metamethods (closes #256).
+ - Added Minimize shortcut on OSX (closes #254).
+ - Added handling of command line parameters for love2d (ref #251).
+ - Added handling of command line parameters (closes #251).
+ - Added calling of end callback for detached processes.
+ - Added skipping compile check for non-lua files in scratchpad.
+ - Added handling of (optional) BOM in UTF-8 encoded files (closes #246).
+ - Added hint about removing backslash for invalid escape sequences.
+ - Adjusted tooltip position and content to always fit on the screen.
+ - allow tool exe paths to be set in config prior load
+ - Changed the order of applying styles to apply the main style last.
+ - Disabled singleinstance check by default on OSX (ref #204).
+ - Disable debugging termination when stack trace received from remote process.
+ - glsl: added imageSize to spec and api
+ - luxinia2 define some global vars if debugger is present
+ - luxinia2 support 32 and 64 bit runtime
+ - luxinia2: new setup, added support for debugging with main.lua and rudimentary scratchpad functionality
+ - Reduced the number of inactivity checks and timer calls (ref #204).
+ - Removed `calltipbg` attribute as it's replaced by `calltip.bg`.
+ - Removed unused files from metalua.
+ - Removed paragraph-to-newline conversion for API tooltips.
+ - Resolved conflict for Opt+Left (ref #252 and #203).
+ - Removed jumping to the current line after compilation errors.
+ - Switched to using temp files instead of -e option for debugging (ref #251).
+ - shader tools: allow relative directories for binaries
+ - shader specs: add isfncall definition to allow indication style
+ - Updated AddConfig/RemoveConfig to refresh styles after changes (ref #166).
+ - Updated Marmalade Quick API for v7.2.
+ - Updated Corona API for v2014.2189.
+ - Updated scheme picker to apply styles to all windows.
+ - Updated LfW interpreter to use project directory as current one (fixes #276).
+ - Updated README.
+ - Updated comment markup separators to apply markup in fewer cases.
+ - Updated French translation; thanks to [Yonaba](https://github.com/Yonaba/).
+ - Update de.lua; thanks to [riidom](https://github.com/riidom/).
+ - Updated Linux scripts to remove custom libpng/zlib as it's fixed in wxwidgets.
+ - Updated check for editor state during Edit menu display (ref #70).
+ - Updated Corona API auto-complete/description to match v2013.2100 (ref #73).
+ - Updated all language files with new messages (ref #70).
+ - Updated messages for better translation (ref #70).
+ - Updated love2d api with LineJoin and few other calls (ref #247).
+ - Updated OSX build script for wxwidgets 3.x (ref #260).
+ - Updated build script to compile wxwidgets 3.x on Windows (ref #260).
+ - Updated love2d api with some missing calls (ref #247).
+ - updated luxinia2 interpreter to reflect new luxinia2 structure
+ - Updated Love2d API for 0.9.0. (closes #247).
+ - Upgraded Mobdebug (0.551) to fix serialization of table/array indexes.
+ - updates to shader apis (bugfix in GLSL atomic description)
+
+### Incompatibilities
+ - Updated LfW interpreter to use project directory as current one (fixes #276).
+ - Removed `styles.calltipbg` as it is replaced by `styles.calltip.bg`.
+
+### Fixes
+ - Fixed shortcut menu generator to display default shortcuts.
+ - Fixed removing focus from editor when IDE loses focus on OSX (ref #204).
+ - Fixed hiding calltip and auto-complete when switching between tabs on OSX.
+ - Fixed handling of getenv returning general message (Mobdebug v0.5511).
+ - Fixed launching zbstudio from folders with spaces; thanks to @Asmageddon.
+ - Fixed `calltip` attribute to use/enable proper style.
+ - Fixed visibility of wrapped lines in console when going through history.
+ - Fixed syntax issues in definitions of IDE tables.
+ - Fixed an issue in metalua files when syntax error is reported.
+ - Fixed arrow key handling in Local console (fixes #279).
+ - Fixed removing temporary files in GSL-shell interpreter.
+ - Fixed tooltip positioning for long messages.
+ - Fixed current line in debugging after activation of files with wrapped lines.
+ - Fixed spurious ESC after activation on Windows when modifiers are pressed.
+ - Fixed skipping empty lines in tooltip formatting.
+ - Fixed comment markup at the end of a file.
+ - Fixed formatting calculations for tooltip to better fill the window.
+ - Fixed stopping debugging when switching projects with the same interpreter.
+ - Fixed auto-complete for classes with more than two levels.
+ - Fixed removal of paragraph breaks in tooltips after interpreter switch.
+ - Fixed API reloading that caused removal of paragraph breaks in tooltips.
+ - Fixed translations for stock menu items on Ubuntu 13.10 (ref #70).
+ - Fixed an issue with spec/tools/interpreters filters not working from config.
+ - Fixed messages script to work with LuaJIT.
+ - Fixed console output with multiple new lines at the end.
+ - Fixed issues on OSX 10.6.x and 10.9.1+ caused by flat namespace (fix #270, fix #264).
+ - Fixed an issue with `isfncall` spec property not being checked.
+ - Fixed function localization in menu handlers.
+ - Fixed default selection for search in case of multiple selections.
+ - Fixed dependency of lfs/git dlls on lualib.dll.
+ - Fixed an issue with activating proper tab after dragging.
+ - Fixed displaying local console output with invalid unicode characters.
+ - Fixed displaying script output with invalid unicode characters.
+ - Fixed drawing artifacts on Windows when line wrapping disabled (fixes #250).
+ - Fixed setting bom value for a new editor (fixes #258).
+ - Fixed auto-complete for values returned by 'core' functions (ref #256).
+
+## v0.40 (Dec 14 2013)
+
+### Highlights
+ - Added LuaDist integration.
+ - Added live coding support for GSL-shell.
+ - Added support for project settings.
+ - Added filetree operations.
+ - Added Busted interpreter.
+
+### Special thanks
+ - To Jayanth Acharya for SciTeLuaIDE color scheme.
+ - To Mike Richards for adding edge handling and styles.
+ - To [adamdmoss](https://github.com/adamdmoss) for Mobdebug API update.
+
+### Improvements
+ - Added live coding support for GSL-shell (closes #239).
+ - Added support for product-specific links in the Help menu.
+ - Added 'edge' style to the color schemes (ref #237).
+ - Added ability to set 'edge' style properties individually (ref #237).
+ - Add edge to styles
+ - Add fold margin checker color to styles
+ - Add edge line and fold margin checker color
+ - Added changing directory when launching on Linux (closes #157).
+ - Added setting PATH for LfW to allow loading of DLL dependencies.
+ - Added logic to set architecture dynamically for luadist (ref #225).
+ - Added luadist bootstrap dependencies for Linux (ref #225).
+ - Added option to load luadist as a module (ref #225).
+ - Added luadist bootstrap dependencies for OSX (ref #225).
+ - Added proxy dll for Lua 5.2 (ref #225).
+ - Added luadist bootstrap dependencies for Windows (ref #225).
+ - Added package GetInterpreters method (ref #166, #225).
+ - Added package AddConsoleAlias/RemoveConsoleAlias methods (ref #166, #225).
+ - Added version property to the Lua interpreters.
+ - Added new location for Marmalade Quick v7+ and s3e path logic (fixes #226).
+ - Added directory creation (if needed) to file saving.
+ - Added support for symlinks in the filetree (with recursion protection).
+ - Added package AddConfig/RemoveConfig methods (ref #166).
+ - Added package GetProject method (ref #166).
+ - Added package onProjectPreLoad method (ref #166).
+ - Added workaround for conflict with Scintilla shortcuts on Linux.
+ - Added 'Open with Default Program' to file tree operations (ref #123).
+ - Added toggling directory on Enter (ref #123).
+ - Added 'Copy Full Path' to file tree operations (ref #123).
+ - Added deleting file/directory to file tree operations (ref #123).
+ - Added processing of packages from `$HOME/.zbstudio/packages` folder (#166).
+ - Added 'New File' and 'New Directory' to file operations (ref #123).
+ - Added error reporting for failed rename operations (ref #123).
+ - Added re-opening editor tabs affected by directory move/rename (ref #123).
+ - Added package FindDocumentsByPartialPath method (ref #166).
+ - Added existing file overwrite confirmation when renaming (ref #123).
+ - Added existing file overwrite confirmation when saving.
+ - Added creating intermediate directories during file rename (ref #123).
+ - Added in-place editing of file and folder names (ref #123).
+ - Added refreshing editor tab after drag-n-drop operation (ref #123).
+ - Added drag-n-drop operation to move files in the project tree (ref #123).
+ - Added package AddMarker/RemoveMarker methods (ref #166).
+ - Added package GetStatusBar method (ref #166).
+ - Added package GetDocuments and document methods (ref #166).
+ - Added `EscapeMagic` function to escape magic characters.
+ - Added SciTeLuaIDE color scheme (thanks to Jayanth Acharya).
+ - Changed glslc option to reflect new version
+ - Disabled compilation check for scratchpad when `skipcompile` is set (ref #239).
+ - Disabled output activation for messages redirected to Console (ref #225).
+ - Disabled commenting for file types that don't specify line comments.
+ - Moved restoring project before loading files (ref #107).
+ - Reorganized loading configuration files (ref #107).
+ - Removed 'file no longer exists' message after moving opened files (ref #123).
+ - Removed some of the snippets as they are available as plugins.
+ - Store os specific clibs path to make it available to plugins.
+ - Tidy up estrela tools a bit (remove key strokes from cgc, remove luxinia res viewer, rename perforce files to get loaded again)
+ - Updated README.
+ - Updated samples with missing indicator constants (closes #243).
+ - Updated OSX executables and added 'fake' proxy for lua-dist support (ref #225).
+ - Updated handling of case-insensitive names during debugging on OSX (Mobdebug v0.545).
+ - Updated package onEditorPreSave to be called on SaveAs events (ref #166).
+ - Updated icon bundle to eliminate large icons.
+ - Updated application icon to a bit brighter one on OSX (closes #196).
+ - Updated build script on OSX to not require 10.6 SDK (closes #231).
+ - Updated menu definitions for consistency.
+ - Updated use of `unpack` for consistency and Lua 5.2 compatibility.
+ - Updated 'Open with Default Program' on Windows to work with spaces in names (#123).
+ - Updated cmake installation script to install to '/Applications' on OSX.
+ - Updated OSX build script to revert wxwidgets commit to fix auto-complete crash.
+ - Updated `Start debugging` hint to clarify.
+ - Updated single-click toggle to allow rename/move directories (ref #123).
+ - Updated normalization flags as some path parts were changed to dots.
+ - Updated editor tab processing using FindDocument method.
+ - Updated shortcut for Replace All to avoid conflict on OSX (fixes #220).
+ - Updated `SetDocumentModified` to use current tab text.
+
+### Fixes
+ - Fixed values 'captured' by redirected 'print' and not collected (fixes #240).
+ - Fixed typo in fold style definition (ref #237).
+ - Fixed console output being limited in addition to stack result limit.
+ - Fixed hang in auto-complete on expressions involving '...' (fixes #235).
+ - Fixed auto-complete for string values (broken by 933aacc2).
+ - Fixed crash when LUA_DEV environmental variable is not set (fixes #228).
+ - Fixed cmake cache filename (ref #225).
+ - Fixed incorrect UTF-8 sequence in UTF-8 validity check.
+ - Fixed Un/Comment menu for Output/Console windows.
+ - Fixed format of the file name reported after compilation errors.
+ - Fixed jumping to compilation error (if any) after Run/Debug.
+ - Fixed disabling 'Open with Default Program' on OSX (ref #123).
+ - Fixed file tree update after changes on OSX (ref #123).
+ - Fixed copying full path on OSX (ref #123).
+ - Fixed 'Open with Default Program' for paths with spaces on Windows (ref #123).
+ - Fixed folding issue (caused by `math.mod` not available in LuaJIT).
+ - Fixed debugger marker calculations to avoid marker conflicts.
+ - Fixed color references in marker config examples.
+ - Fixed Step Over/Out to stay in the same coroutine; Mobdebug 0.543 (closes #217).
+ - Fixed case sensitivity in matching of file name in error messages (fixes #216).
+ - Fixed tab text after SaveAs and loading files into the same tab.
+
+## v0.39 (Oct 06 2013)
+
+### Highlights
+ - Added Lua 5.2 support out of the box.
+ - Added suggesting dynamic words as fields in auto-complete.
+ - Added 'go to definition' (Ctrl/Cmd+Alt+Click) and 'jump to previous location' (Alt+Left).
+ - Added abbreviation of project directories to keep unique parts visible.
+ - Fixed breakpoints with Marmalade Quick.
+ - Switched to using LuaJIT interpreter by default.
+ - Upgraded Luasocket (3.0-rc1), copas, and coxpcall libraries.
+
+### Special thanks
+ - To Chow CheeWen for Chinese translation.
+ - To [Enrique García](https://github.com/kikito) for fixing `fixutf8` function.
+ - To [Riidom](https://github.com/Riidom) for German translation.
+ - To [ardente](https://github.com/ardente) for user home patch for Windows and separating Lua 5.1 and 5.2 paths in user config.
+ - To [Mika Attila](https://github.com/crumblingstatue) for code folding patch.
+ - To [Tim Mensch](https://github.com/TimMensch) for auto-save, auto-reload, and debugger improvements.
+ - To [Florian](https://github.com/SiENcE) for Notepad++ color scheme.
+ - To [Michal Kottman](https://github.com/mkottman) for 'go to definition' and Alt+Left navigation patch.
+ - To [Christoph Kubisch](https://github.com/CrazyButcher) for dx11 and glslc updates.
+ - To [jpoag](https://github.com/jpoag) for improved activation during debugging on Windows.
+
+### Improvements
+ - Added setting project directory when passed as a parameter.
+ - Added activation of windows with SDL_app class name (Moai support).
+ - Added support for joining/splitting Watch/Stack with Output/Console tabs.
+ - Added package GetSetting method (ref #166).
+ - Added selected index to package onMenuEditorTab event (ref #166).
+ - Added activation of windows with FREEGLUT class name (Moai support).
+ - Added hiding console window for Corona (2013.8.28+) applications (Windows).
+ - Added suggesting dynamic words as fields in auto-complete.
+ - Added socket.connect for compatibility with socket.core <3.0 (fixes #208).
+ - Added recalculating line number margin width after zooming (fixes #207).
+ - Added margin constants and removed unused variables.
+ - Added reporting of socket error for initial debugger calls (Mobdebug 0.5403).
+ - Added error handling/reporting for `debugger.outputfilter`.
+ - Added 'debug' option to OSX build script.
+ - Added ability to modify exe path in base interpreter (ref #197).
+ - Added package GetEditorNotebook method (ref #166).
+ - Added 'molokai' color scheme (ref #200).
+ - added hlsl spec and basic api (note: currently autocomplete doesn't work on object functions, need fix). also fixed cg syntax lexer settings
+ - Added file activation for abbreviated file names in error messages.
+ - Added abbreviation of project directories to keep unique parts visible.
+ - Added `debugger.redirect` configuration option.
+ - Added `editor.saveallonrun` configuration option.
+ - Added package GetOutput method (ref #166).
+ - Added package onAppLoad/onAppClose events (ref #166).
+ - Added package onIdleOnce event (ref #166).
+ - Added manifest to the Windows executable and re-signed.
+ - Added Notepad++ color scheme (thanks to Florian/SiENcE; closes #193).
+ - Added clearing document styles after saving file with a different extension.
+ - Added workaround to avoid crash on OSX after `Close All Pages` (closes #190).
+ - Added return type for string.* functions to assist in auto-complete (ref #189).
+ - Added handling of string literals in type assignments (closes #189).
+ - Added support for captures in regexp replacement (\1-\9).
+ - Added ability to cancel FindInFiles search by closing search dialog (ref #162).
+ - Added activating Output window before showing search results (ref #162).
+ - Added support for packages from different platforms to co-exist (ref #166).
+ - Added ability to save complex data in package settings (ref #166).
+ - Added support for multiple inheritance in auto-complete (ref #101).
+ - Added ability to add/remove API descriptions from plugins (ref #166).
+ - Added package GetSettings/SetSettings methods (ref #166).
+ - Added methods to save/restore package settings (ref #166).
+ - Added ability to add/remove specs from plugins (ref #166).
+ - Added ability to add/remove interpreters from plugins (ref #166).
+ - Added wxlua patch for twoface compatibility.
+ - Added `setfenv` for Lua 5.2 compatibility.
+ - Added links to project page and documentation (closes #180).
+ - Added German translation (thanks to Riidom; ref #70).
+ - Added default value to package config (ref #176).
+ - Added handling of ?51.dll and required DLLs for LuaForWindows interpreter.
+ - Added plugin::GetConfig method (ref #166).
+ - Added erasing current line in Console (ref #173).
+ - Added search/completion in the local and remote console (closes #173).
+ - Added package onAppFocus* events (ref #166; ref #172).
+ - Added Chinese translation (thanks to Chow CheeWen; ref #70).
+ - Added `editor.autoreload` to enable reload of updated files (ref #172).
+ - Added creating (missing) folders when saving a file (fixes #171).
+ - Added an example of styling individual keywords.
+ - Added fold indication of a current block (ref #168).
+ - Added reporting of process id for a conflicting process.
+ - allow to define separate lua 5.1 and 5.2 paths in user config
+ - Changed 'go to definition' to Ctrl/Cmd+Alt+Click (ref #203).
+ - Changed `un/comment` to act from the beginning of the line for multi-line selection.
+ - Disabled refreshing Watch/Stack windows when they get focus.
+ - Disabled markup styling for specs without comment styles.
+ - Disabled showing tooltip when auto-complete suggestions are shown.
+ - Disabled error reporting after debugging has been terminated.
+ - Disabled 'Fold' menu instead of removing when no folding is allowed (ref #169).
+ - dx11 and glslc updates
+ - Enabled editing watches with doubleclick or Enter.
+ - Enable Ctrl+Click and Alt+Left navigation on local variables
+ - Enabled support for xml/html folding.
+ - Enabled path remapping for local debugging.
+ - Enabled slower and more thorough static analysis (ref #149; ref #168).
+ - Improved file/debugger activation on Windows (ref #199).
+ - Improved IDE activation during debugging on Windows (closes #199); thanks to jpoag.
+ - Improved logic to jump to file/line indicated in error messages.
+ - Limited activation of code fragments to the beginning of debugging session.
+ - Make code folding optional (thanks to [Mika Attila](https://github.com/crumblingstatue))
+ - Moved 'Sort' menu to 'Edit'.
+ - OpenGL 4.4 and ARB extensions added as well as NV_gpu_shader5 functions
+ - Optimized handling of large tables in stack results.
+ - Optimized line count calculation for dynamic words when text is deleted.
+ - Optimized dynamic word processing for large files.
+ - Reduced CPU usage while idle (ref #204, #206).
+ - Renamed package onEditorPostSave event to onEditorSave for consistency (ref #166).
+ - Removed comment from default spec as it forces undesired markup styling.
+ - Removed auto-complete suggestion when it is already typed (ref #101).
+ - Reorganized auto-complete handling; should fix #164.
+ - Reorganized path separator handling to minimize use of global variables.
+ - Reorganized API processing to allow loading API description from a plugin.
+ - Replaced package onEditorActivated event with onEditorFocus* events (ref #166).
+ - Set search in subdirectories as default in Find in Files dialog (ref #162).
+ - Switched to using POSIX compatible regexp with '()' used for captures.
+ - Updated LICENSE information.
+ - Updated Windows build file for wxwidgets 3.0.
+ - Updated support for MOAI coroutine debugging (Mobdebug 0.541).
+ - Updated type assignment logic to remove spurious types.
+ - Updated Windows build script to enable gdb debugging.
+ - Updated OSX build script to not strip debug builds.
+ - Updated Corona interpreter to handle failure to copy debugger to Resources/ folder.
+ - Updated build scripts with proper INSTALL_PREFIX option.
+ - Updated CFBundleIdentifier in plist files to allow references from OSX programs.
+ - Updated un/comment to toggle selection as a group rather than line by line.
+ - Updated `NewFile` to accept a file name.
+ - Updated 'get hostname' logic to avoid using non-resolvable names (mostly on OSX).
+ - Updated tooltip to use the same type inference as auto-complete (ref #101).
+ - Updated Estrela reference in README.
+ - Updated build script on Windows to enable debugging (ref #164).
+ - Updated build script with a (temporary) fix for wxlua issue (mingw32).
+ - updated glewgl api for OpenGL4.4 and removed non-core duplicate functions/enums
+ - Updated static analyzer to report only first instance of 'unknown field'.
+ - Updated filename/source code heuristic in the debugger (Mobdebug 0.5362).
+ - Updated `SaveAll` to allow saving (only) files with filenames (ref #172).
+ - Upgraded copas and coxpcall libraries (closes #144).
+ - windows: adopt native user home (thanks to [ardente](https://github.com/ardente))
+
+### Fixes
+ - Fixed Lua 5.2 crash on OSX (added -O1).
+ - Fixed onInterpreterLoad to only be called when interpreter changes.
+ - fix the fixutf8 function (thanks to Enrique García).
+ - Fixed handling of source code fragments in the Stack view.
+ - Fixed Watch/Stack windows to refresh when shown.
+ - Fixed incorrect editor tab acted upon in split notebook situations.
+ - Fixed auto-complete suggestions for indentifiers matching partial function names.
+ - Fixed hiding launched windows when running/debugging (Windows).
+ - Fixed showing known functions in auto-complete.
+ - Fixed showing output with invalid UTF8 characters in Stack and Console windows.
+ - Fixed debugging on/off handling in 'main' thread for LuaJIT (MobDebug 0.5402).
+ - Fixed having duplicate tabs after SaveAs with existing file name.
+ - Fixed showing redirected 'print' messages after debugging is terminated.
+ - Fixed using default interpreter when no interpreter is selected.
+ - Fixed stepping through blocks with undefined variables when 'strict' is in effect (upgraded Mobdebug to 0.5401).
+ - Fixed loading of files with incorrect UTF-8 encoding and control characters (fixes #198).
+ - Fixed package sample to take into account new documents.
+ - Fixed crash on OSX after opening 'application' in 'Open File' dialog.
+ - Fixed windows resource file to properly reference the manifest.
+ - Fixed missing default api for files with unknown extensions.
+ - Fix spurious replacement after 'search, clear selection, replace' actions.
+ - Fixed using auto-complete with multiple selections (fixes #188).
+ - Fixed looping in auto-complete with array references (ref #143).
+ - Fixed showing auto-complete after comma.
+ - Fixed 'cannot get official hostname' message on low privilege accounts (fixes #183).
+ - Fixed displaying variable instances when code has invalid blocks (fixes #182).
+ - Fixed tooltip to ignore string parameters (ref #101).
+ - Fixed tooltip display between empty brackets (ref #101).
+ - Fixed indentation after lines with brackets in strings.
+ - Fixed indentation after lines with anonymous functions.
+ - Fixed indicator showing at the end of not terminated long comment.
+ - Fixed an issue with LUA_DEV including files instead of directories.
+ - Fixed project switching to close all files when switching to a subdirectory.
+ - Fixed saving projects that do not have any open files.
+ - Fixed debugger to accept filenames without '@'; thanks to Tim Mensch (closes #174).
+ - Fixed sorting when the sorted fragment ends with a newline.
+
+## v0.38 (Jun 21 2013)
+
+### Highlights
+ - Added source code debugging (to support LuaJava and other engines).
+ - Added scope-aware global/local/masked/masking variable highlighting.
+ - Added 'Go To Definition' and 'Rename All Instances'.
+ - Added package/plugin API.
+ - Added Retina display support (can be enabled with `hidpi` option).
+ - Improved auto-complete API with inheritance and table index support.
+
+### Special thanks
+ - To George Pimm for line of code navigation in the Stack Window.
+ - To Fringale for updated French translation.
+ - To Tom Burgel for LuaForWindows interpreter.
+
+### Improvements
+ - Added sorting of file lists on Linux (used in the filetree and file search).
+ - Added LuaForWindows interpreter (thanks to Tom Burgel).
+ - Added package onEditorCharAdded/onEditorKeyDown events (ref #166).
+ - Added support for changing the Corona simulator skin (closes #151).
+ - Added inheritance support for auto-complete API.
+ - Added package onEditor* events (closes #166).
+ - Added package onInterpreterLoad/onInterpreterClose events (ref #166).
+ - Added package onProjectLoad/onProjectClose events (ref #166).
+ - Added package onMenu* events (ref #166).
+ - Added package onRegister/onUnRegister events (ref #166).
+ - Added 'Show Location' to the Project/Filetree menu.
+ - Added `hidpi` option to enable HiDPI/Retina display support (closes #160).
+ - Added breakpoint support for unnamed code fragments.
+ - Added support for debugging (stepping through) unnamed code fragments.
+ - Added LuaSec to win32 build script.
+ - Added package/plugin processing.
+ - Added support for 'silent' execution of shell commands in markup.
+ - Added `Find Next/Previous` over selected variable instances (ref #163).
+ - Added `debugger.allowediting` option to allow editing while debugging.
+ - Added skiping binary files during file search (ref #162).
+ - Added yield to update search results during file search (ref #162).
+ - Added showing default extensions in the file search (ref #162).
+ - Added support for multiple file extensions in the file search (ref #162).
+ - Added saving folder to search files in (ref #162).
+ - Added selecting all instances with a double-click on a variable.
+ - Added `autoanalizer` option for dynamic static analysis.
+ - Added 'Go To Definition' and 'Rename All Instances'.
+ - Added initial support for indicating local/global variables.
+ - Added showing tooltip in any position over a term and showing 'values' (ref #101).
+ - Added disabling tooltip when context menu is shown.
+ - Added 'fixing' path returned by wxDirDialog; may be incorrect in 2.9.x.
+ - Added constant initialization missing on ArchLinux with wxlua 2.8.12.2 (fixes #155; ref #128).
+ - Added support for table valuetypes in auto-complete for `foo[index]:` (ref #101).
+ - Added navigation to the line of code in the Stack Window (thanks to George Pimm; closes #134).
+ - Added `Show Location` to the editor tab menu.
+ - Added support for absolute filenames in Markdown links.
+ - Allowed tab width and indentation to be set independently.
+ - Allowed closing editor tabs while debugger is running.
+ - Disabled following symlinks during directory scanning to avoid infinite loops.
+ - Disabled showing tooltip when the app is in the background (fixes #158).
+ - Disabled 'value' tooltip over variables that match known function names (ref #101).
+ - Improved error reporting in interpreters on failures to copy the debugger.
+ - Improved focus on the debugger when a breakpoint hits on OSX (fixes #141).
+ - Removed sorting in the Stack view to keep the order of table elements.
+ - Set default directory for Find in Files opened from a new file (#ref 162).
+ - Updated configuration example for variable indicators.
+ - Updated Stack view navigation to use clicked on instead of active item.
+ - Updated Gideros API/auto-complete reference.
+ - Updated markup to allow opening files from new buffers ('untitled').
+ - Updated build scripts to use luasocket 2.0.3.
+ - Updated linux build files to use latest zlib/libpng to fix png load on Gentoo.
+ - Updated 'Find in Files' to start in the project folder by default.
+ - Updated French translation with latest string changes (mostly for find/replace dialogs).
+ - Updated Marmalade Quick auto-complete API to use class inheritance.
+ - Updated Gideros auto-complete API to use class inheritance.
+ - Upgraded Mobdebug to 0.534 for debugging of source code fragments.
+
+### Fixes
+ - Fixed looping in auto-complete when indexes are used (fixes #143).
+ - Fixed possible duplicate paths in the filetree.
+ - Fixed missing numerical keys in serialized tables (upgraded Mobdebug to 0.535).
+ - Fixed styling of markup that can be affected by folded lines.
+ - Fixed value selection with multiple active selections.
+ - Fixed style compatibility with wxwidgets 2.8 (ref #128).
+ - Fixed error reporting by (internal) file operations.
+ - Fixed styling comments that start with markup symbols.
+ - Fixed restoring a session with one of the files deleted on disk (fixes #161).
+ - Fixed reporting variable instances for comment/string fragments.
+ - Fixed 'Rename Instances' to always reset previous selection.
+ - Fixed auto-complete error for '%dddd' strings (fixes #156).
+ - Fixed an issue with showing filenames that include '"?*:<>' on OSX/Linux.
+ - Fixed current line marker being shown using 'Run as Scratchpad' with 'runonstart' option.
+ - Fixed looping in auto-complete (fixes #151).
+ - Fixed incorrect localization that led to an error in 'Save' from tab menu.
+
+## v0.37 (May 09 2013)
+
+### Highlights
+ - Added Marmalade Quick auto-complete support and API documentation.
+ - Added full Marmalade Quick debugging support (requires Quick 1.1+).
+ - Improved Find/Replace behavior and functionality.
+ - Added Recent File history navigation.
+ - Added Preferences menu to simplify access to system/user settings.
+
+### Special thanks
+ - To Samuel Dionne-Riel for wxwidgets 2.8 compatibility updates.
+ - To Mat Hopwood for assistance with Marmalade Quick integration.
+
+### Improvements
+ - Added Preferences menu to simplify access to system/user settings.
+ - Added Russian translation for Find/Replace dialog and (ref #70).
+ - Added Russian translation for the Preferences menu (ref #70).
+ - Added 'shaking' Find/Replace window when text is not found (closes #146).
+ - Added 'wlua' to the list of recognized Lua extensions.
+ - Added disabling Recent Files menu if the list is empty.
+ - Added TomorrowContrast color scheme (thanks to Sergey Lerg).
+ - Added detaching a child process to avoid crash when exiting during debugging.
+ - Added Recent File history navigation (closes #66).
+ - Added Marmalade auto-complete support and API documentation.
+ - Added processing of `runonstart` when using remote debugging (closes #138).
+ - Added suggesting proper extension after 'Save/Save As' based on current spec.
+ - Added translation setup for Find/Replace dialog (closes #133).
+ - Added `nomousezoom` option to disable zoom with mouse wheel in the editor.
+ - Added selecting text and Cmd-F shortcut in Find dialog on OSX (ref #127).
+ - Improved file activation when debugging is started (closes #137).
+ - Reduced the minimum size of the Output/Console panel.
+ - Refactored Recent Files history to make it faster and simpler.
+ - Refactored and optimized directory scanning when loading IDE files.
+ - Separated settings for function dropdown and project tree fonts (fixes #148).
+ - Updated documentation about default EOL on OSX (ref #102).
+ - Updated highlighting in Watch windows to not use editor styles.
+ - Updated documentation for user settings (ref #113, #55).
+ - Updated Monokai color scheme to fix current line color.
+
+### Incompatibilities
+ - (dev) `FileSysGet` has been replaced with `FileSysGetRecursive` with a different signature.
+
+### Fixes
+ - Fixed hiding all panels when switching to Full Screen mode.
+ - Fixed loading a non-existing file.
+ - Fixed activation of non-existing files/folders in the Project tree.
+ - Fixed search results for lines without newline.
+ - Fixed Find/Replace in folders with Unicode names (fixes #147); improved performance.
+ - Fixed Un/Comment commands executed for empty lines.
+ - Fixed fold/unfold for files starting with block/comment.
+ - Fixed history after activating non-existing file in Recent Files.
+ - Fixed scrolling to restored cursor position on OSX (when `usewrap` = false).
+ - Fixed Find/Replace dialog to take Enter on OSX (fixes #140).
+ - Fixed 'breaking' after executing OUT command that never reaches the target level.
+ - Fixed stopping at a breakpoint at the initial line when `startwith` option is specified.
+ - Fixed activation of a file loaded into active tab.
+ - Fixed incorrect tab activation on OSX after using 'Open File'.
+ - Fixed editor activation when file is loaded into an existing tab.
+ - Fixed an error after opening non-existing file from 'Recent Files'.
+ - Fixed blocking on reading app output without processing other events.
+ - Fixed an issue with duplicate lines shown in the editor.
+ - Fixed 'Replace All' to take 'Wrap Around' into account (fixes #132).
+ - Fixed off-by-one error in searching consecutive matches.
+ - Fixed 'Quick Find' not working without current selection (fixes #131).
+ - Fixed looping in auto-complete on mistyped class (fixes #130).
+ - Fixed compatibility with wx2.8 (thanks to Samuel Dionne-Riel; closes #128).
+ - Fixed replacement logic in Find/Replace that could replace selected fragment (ref #127).
+ - Fixed an error caused by allowing multiple Search/Replace windows (fixes #127).
+
+## v0.361 (Apr 12 2013)
+
+### Improvements
+ - Added handling of Ctrl-Home and Ctrl-End on OSX (ref #89).
+ - Added line copy/cut for Ctrl-C/Ctrl-X with no selection.
+ - Updated About screen to be more configurable and flexible.
+ - Updated Russian translation (thanks to toiffel).
+
+### Fixes
+ - Fixed launch command for Corona debugging on Windows.
+ - Fixed 'control' check on OSX that changed with wx2.9.2+ (ref #89).
+ - Fixed wrong tab activated on OSX after using New file in some cases.
+ - Fixed cursor not being visible in some cases after file is loaded (ref #116).
+
+## v0.36 (Apr 08 2013)
+
+### Highlights
+ - Added 32bit and 64bit **Linux binaries**.
+ - Enabled **full debugging for Corona on OSX**.
+ - Improved **debugger performance**.
+ - Improved **performance of tab and project switching**.
+ - Added **multiple selection and multi-cursor editing**.
+ - Made Stack and Watch windows dockable and toggleable.
+
+### Special thanks
+ - To toiffel for build improvements and continuous work on wxwidgets 2.9 and Linux support.
+ - To Marcel van Herk for testing and feedback on Stack and Watch windows behavior.
+ - To Leo Bartoloni for Italian translation update.
+ - To Fringale for updated French translation.
+ - To neomantra for adding cdata processing in the serializer.
+
+### Improvements
+ - Added handling of case-insensitive filenames on OSX.
+ - Added cdata processing (thanks to neomantra).
+ - Added universal binaries for luasocket on OSX to allow debugging of 64bit applications (for example, LuaJIT) on OSX.
+ - Added update of Stack and Watch windows after 'Debugging suspended' message.
+ - Added toggling for View menu items.
+ - Added auto-show/hide Stack and Watch windows during debugging (closes #110).
+ - Added ignoring `-psn...` parameter on OSX when reading file names from command line.
+ - Added migration of configuration file on Windows (helps #89).
+ - Added check for different spellings of the same folder in the project tree.
+ - Added scripts to install build prerequisites on Linux (helps #89).
+ - Added linux binaries with support for x86 and x64 (helps #89).
+ - Added window list button to the notepad with editor tabs.
+ - Added centering of current line during debugging.
+ - Added multiple selection and multi-cursor editing (wx2.9.5+).
+ - Added dll proxy to make LfW libraries to work with the IDE.
+ - Disabled showing 'value' in auto-complete after 'a:' (helps #101).
+ - Enabled full debugging for Corona on OSX.
+ - Improved debugging performance.
+ - Improved performance of tab switching and project tree population.
+ - Improved handling of upvalues with __tostring method in the Stack window.
+ - Increased default font size for OSX; set 'Monaco' as default font (helps #89).
+ - Made stack and watch windows dockable (closes #103).
+ - Optimized project switching and added notebook freezing where possible (ref #89).
+ - Reduced flicker in the project tree when a file is opened (ref #89).
+ - Removed binary libraries not currently used.
+ - Set 'Courier New' as the default font on Linux (ref #89).
+ - Switched to 'native' menu on OSX and added 24x24 icons required (helps #89).
+ - Updated Italian translation (thanks to Leo Bartoloni)
+ - Updated 'method' type in auto-complete to only allow a:b syntax (closes #101).
+ - Updated language files (es, it, ru) with new messages (ref #70).
+ - Updated French translation with latest string changes, fixed a few typos (thanks to Fringale).
+ - Updated Stack and Watch window to not refresh when not visible.
+ - Upgraded Mobdebug (0.5222) to add serialization with metamethods and notification on incomplete output (closes #109).
+ - Updated error messages from loading configuration files.
+ - Updated Linux binaries to use libpng 1.6 with wxwidgets (helps #89).
+ - Updated Windows/OSX build files to only build components needed (helps #89).
+ - Updated windows executable to show properly scaled icons in the Explorer.
+ - Updated status bar to use no border around fields.
+ - Updated large icons for "native" toolbar on OSX (helps #89).
+ - Updated function call indicator to use round box with wxwidgets upgrade (helps #89).
+ - Updated handling of markdown styles to make it more robust (fixes #59).
+ - Updated README with Marmalade Quick support and Corona tutorial.
+
+### Incompatibilities
+ - Configuration file (.ini) location has changed on Windows. The current file will be copied to the new location.
+ - The debugger now stops on the next executable line after `.start()` call.
+
+### Fixes
+ - Fixed activating files in the project tree on a case insensitive system.
+ - Fixed the Stack view being partially hidden when the root item is too wide (ref #110).
+ - Fixed left side of the project panel being hidden when a file is activated (fixes #122).
+ - Fixed breakpoint not firing on the first executable line in debugging (helps #121).
+ - Fixed terminating debugging of an empty script.
+ - Fixed reporting of initial line during debugging.
+ - Fixed editor tab activation after closing another tab on Linux (ref #89).
+ - Fixed 'Show tooltip' shortcut not working on Linux (fixes #118; ref #89).
+ - Fixed cursor position being incorrectly restored (fixes #116; ref #89).
+ - Fixed a warning about empty project directory in local console.
+ - Fixed an issue with Enter used to select an item in project dropdown (ref #89).
+ - Fixed an issue with the Project tree when project and app directories are the same.
+ - Fixed debugger output not being suppressed on Linux and using wlua.
+ - Fixed a static analyzer issue with anonymous functions defined in expressions (fixes #3).
+
+## v0.35 (Feb 10 2013)
+
+### Highlights
+ - Added support for **debugging Lua 5.2 scripts**.
+ - Added support for **cross-platform remote debugging**.
+ - Added support for starting Gideros **on-device debugging**.
+ - Added support for live coding, script reloading, and coroutine debugging under LuaJIT.
+ - Added **Marmalade Quick** support.
+ - Added **live-coding for Corona** interpreter.
+ - Added editor tab popup menu with 'Close All', 'Close Other', and other items.
+
+### Special thanks
+ - To Roland Yonaba and Fringale for updates to French translation.
+ - To Fringale for enhanced line-endings handling.
+ - To toiffel for build improvements, continuous work on wxwidgets 2.9 support, and several patches.
+ - To Andy Bower for the stream of feedback on live coding and on-device debugging.
+
+### Improvements
+ - Added `debugger.runonstart` option to configure if debugging should run immediately after starting.
+ - Added `editor.checkeol` option to configure checking for eol encoding in loaded files.
+ - Added Marmalade Quick support.
+ - Added support for starting Gideros on-device debugging.
+ - Added requesting user attention when stopped during debugging.
+ - Added example for `defaulteol` configuration option.
+ - Added configuration option for compact folding (`editor.`).
+ - Added support for cross-platform remote debugging.
+ - Added support for script reloading and coroutine debugging under LuaJIT (MobDebug 0.514).
+ - Added Russian translation for new messages.
+ - Added handling of malformed UTF8 characters in files (fixes #97).
+ - Added support for debugging Lua 5.2 scripts.
+ - Added workaround for Moai require path issue (fixes #96; fixes #87).
+ - Added editor tab popup menu with 'Close All', 'Close Other', and other items.
+ - Added C/CPP specification file and a configuration example.
+ - Added XCode-like key mapping.
+ - Added removing of file: prefix and url decoding of filepaths (helps #89).
+ - Added a workaround for returning incorrect project folder (helps #89).
+ - Adjusted handling of filepath to work with relative and absolute paths (helps #89).
+ - Enabled live-coding for Corona interpreter.
+ - Improved line-endings handling (Fringale).
+ - Improved reporting of stack and serialization run-time errors.
+ - Updated Gideros interpreter to run debugging immediately after starting; Use `debugger.runonstart = false` to disable.
+ - Updated Linux startup script to use online versions of wxlua packages (deb files).
+ - Updated handling of file: prefix as it's different on Windows and OSX (helps #89).
+ - Updated messages in the starter script.
+ - Updated function call parsing to recognize "func{}" and "func''" syntax.
+ - Updated os.exit() call in local console to exit gracefully.
+ - Updated French translation with various fixes and tweaks (Fringale).
+ - Updated French translation with newly added strings (Fringale).
+ - Updated 'Close page' and its translations.
+ - Updated configuration examples and documentation (helps #55).
+ - Updated the size of the function list dropdown on Windows (helps #89).
+ - Typos fixes, small changes in French translation (Roland Yonaba).
+
+### Incompatibilities
+ - Gideros debugging is changed to start immediately; use `debugger.runonstart = false` to disable.
+ - Removed mosync support from the debugger into a separate module.
+ - Added mixed end-of-line reporting; use `editor.checkeol = false` to disable.
+ - Added reporting of malformed UTF-8.
+
+### Fixes
+ - Fixed a rare crash on OSX when closing IDE with an application running under debugger.
+ - Fixed path handling for metalua to avoid conflicts with other modules that may include lexer.lua file.
+ - Fixed executing commands in the Remote console immediately after `mobdebug.start()` (closes #100).
+ - Fixed invalid escape sequence that fails under LuaJIT.
+ - Fixed an issue with spec files when a separator (sep) is not specified.
+
+## v0.34 (Dec 12 2012)
+
+### Highlights
+ - Added **internationalization** support (with Russian, Italian, Spanish, and French translations).
+ - Added **key binding** configuration for menu and toolbar items.
+ - Added **Corona SDK integration** with debugging and auto-complete.
+ - Added **Moai scratchpad support**.
+ - Added **color scheme support** with several schemes included.
+ - Added **GSL-shell support**.
+ - Added ability to pause and resume scratchpad.
+
+### Special thanks
+ - To Srdjan Markovic for Corona auto-complete support and Zenburn color scheme.
+ - To Roland Yonaba for French translation.
+ - To Leo Bartoloni for Italian translation.
+ - To Inigo Sola for Spanish translation.
+ - To toiffel for Russian translation and several patches.
+ - To Fringale for spec and API files cleanup and update for Lua 5.2.
+ - To Marcel van Herk for assistance with scratchpad break/resume functionality.
+
+### Improvements
+ - Added an option to specify the width of the calltip.
+ - Added showing short descriptions in tooltip for functions without lib/package.
+ - Added 'Project Directory' menu.
+ - Added ability to pause scratchpad when the script is completed (closes #83).
+ - Added ability to pause and resume scratchpad.
+ - Added GSL-shell support (closes #72).
+ - Added more color schemes (Solarized and Monokai).
+ - Added customized yield function for debugging (MobDebug v0.508; closes #81).
+ - Added proper hiding of current line marker during debugging (except when tracing).
+ - Added Corona auto-complete support (thanks to Srdjan Markovic).
+ - Added logic to show application windows without explicitly listing their class (closes #80); Windows only.
+ - Added Moai scratchpad support.
+ - Added missing constants to Moai API.
+ - Added setting focus on the window when a file is loaded in the existing instance.
+ - Added two more wxwindow window classes to the list of windows to show (Windows).
+ - Added scheme picker script to test color schemes from the IDE.
+ - Added Zenburn as a color scheme.
+ - Added styling for markers and Output/Console windows.
+ - Added Italian translation (thanks to Leo Bartoloni).
+ - Added Spanish translation (thanks to Inigo Sola).
+ - Added reporting of run-time errors from remote processes (helps #73).
+ - Added 'tomorrow' color theme.
+ - Added redirect of remote 'print' commands for Gideros applications.
+ - Added check for 'main.lua' in Corona projects.
+ - Added ability to suspend a running application even when there is no editor tab or file to activate.
+ - Added serialization of remote 'print' results and an output filter for debugging (helps #73).
+ - Added redirect of remote 'print' commands to the Output window in the IDE (helps #73).
+ - Added Corona SDK support (closes #73).
+ - Added French translation (thanks to Roland Yonaba).
+ - Added (more) verbose output to debugger to assist in troubleshooting.
+ - Added handling of LUA_DEV to make loading Lua for Windows libraries working out of the box (fixes #71).
+ - Added internationalization support (closes #70).
+ - Added notes about estrela being gone and compatibility.
+ - Added multi-tab support for scratchpad.
+ - Added documentation on accelerator/shortcut syntax.
+ - Added key map to change key binding for menu and toolbar items from a config file (closes #64).
+ - Added hiding IDE while closing and saving configuration.
+ - Completed reorganization of front-end processing (closes #67 and #5).
+ - Disabled editor autoactivation during debugging when tracing is on.
+ - Disabled functions that are not available under Corona on OSX (helps #73).
+ - Disabled showing auto-complete when the only option is already typed.
+ - Disabled showing a calltip on mouse over when it's already active.
+ - Extended list of default folders for interpreters where executables are searched for.
+ - Finished Russian translation.
+ - Limited auto-showing windows to Lua interpreter only (related to #80).
+ - Removed window types from config as they are no longer needed to be listed.
+ - Switched to showing short tooltips by default as some of the updated Lua API descriptions are very long.
+ - Updated descriptions for io.* functions; moved file:* functions to a pseudo library (f); helps #84.
+ - Updated LICENSE to add remdebug license information.
+ - Updated tooltip to show shortened descriptions on mouse-over.
+ - Updated spec and API files for Lua 5.2 (thanks to Fringale).
+ - Updated MobDebug to v0.507 to fix serialization issues (closes #77).
+ - Updated style processing to support styling of markup and allow dynamic switching of color schemes.
+ - Updated Lua keyword definitions to improve grouping for styling (closes #79).
+ - Updated love2d api to an updated version as of 11/1/2012 (fixes #78).
+
+### Incompatibilities
+ - The default port in the debugger has been changed from 8171 to 8172 to avoid conflicts with existing RemDebug implementations.
+
+### Fixes
+ - Fixed an issue with overlapping auto-complete suggestions.
+ - Fixed auto-complete not working after closed brackets.
+ - Fixed tooltip being shown when mouse moving outside of the editor area.
+ - Fixed a font zooming bug with Ctrl+MouseWheel.
+ - Fixed file marking in the project tree after opening a new file.
+ - Fixed an issue with breakpoints not available after aborting tracing on Linux/OSX.
+ - Fixed an issue with running scratchpad when entry points are configured.
+ - Fixed Linux launcher to pass filename parameter to the IDE.
+ - Fixed fold style to properly set background color.
+ - Fixed an issue with a config file being loaded into the editor when specified in the command line.
+ - Fixed an issue with markdown formatting not working after setting styles from a config file (fixes #74).
+
+## v0.33 (Oct 22 2012)
+
+### Highlights
+ - Added **Linux support**.
+ - Added **Moai auto-complete**.
+ - Added **Gideros debugging, auto-complete, and live coding**.
+ - Added **syntax aware indentation**.
+ - Added **re/storing open files and interpreter** when switching project folders.
+
+### Special thanks
+ - To Andy Bower and Atilim Cetin for their assistance with Gideros integration and live coding.
+ - To toiffel for Linux/OSX/Windows CMake-based launcher build.
+ - To [Christoph Kubisch](https://github.com/CrazyButcher) for help with Estrela merge.
+
+### Improvements
+ - Added configuration option to specify hostname when the default one is not reachable (fixes #68).
+ - Added search for Moai and Love2d executables in default locations on OSX and Windows.
+ - Added handling of command line parameters on OSX and Linux; updated documentation.
+ - Added auto-recovery to save/restore editor content (fixes #23).
+ - Added syntax aware indentation.
+ - Added re/storing open files and interpreter when switching project folders.
+ - Added auto-activation of files requested during debugging.
+ - Added editor.autoactivate parameter (false by default) to enable activation.
+ - Added zbstudio.sh script to run on OSX/Linux; updated permissions (closes #15).
+ - Added variable ratio for sliders in scratchpad.
+ - Added Linux/OSX/Windows CMake-based launcher build (thanks to toiffel).
+ - Added configuration parameter for the number of characters typed before displaying auto-complete suggestions for dynamic words.
+ - Added proper closing of the application after Shutdown/Logoff events (fixes #57).
+ - Added Moai auto-complete (closes #52).
+ - Added hiding auto-complete suggestions on losing focus in the editor.
+ - Added proper reporting of errors in the stack window.
+ - Added wxlua.deb file and install script that pull and build all required dependencies on Linux (covers most of #15).
+ - Added osx executables and build files.
+ - Added disabling full screen mode when the last editor tab is closed.
+ - Added proper reporting of errors in config files.
+ - Added toggling folders in project pane by single click (fixes #41).
+ - Added examples for configuring tabs and moai entry points.
+ - Added reporting compilation success rate (fixes #39)
+ - Added shortcuts for adding and removing watches.
+ - Added highlighting rows with updated values in the Watch window.
+ - Added 'Add Watch Expression' and 'Evaluate in Console' context menu items in the editor.
+ - Added handling of canceling editing in adding a watch.
+ - Added Gideros auto-complete and live coding support (closes #62).
+ - Added Gideros integration on OSX; added search for gideros in default locations on Windows and OSX.
+ - Added Gideros integration and debugging support.
+ - Added debugging-related buttons to the toolbar.
+ - Improved reporting of compilation and run-time errors when running as scratchpad.
+ - Made debugger strict.lua and LuaJIT friendly (upgraded to MobDebug v0.502).
+ - Updated configuration example to avoid using ide.spec that is not available (fixes #67).
+ - Updated CMake build script to handle wildcards in the MANIFEST.
+ - Updated configuring toolbar size to improve Linux compatibility.
+ - Updated MobDebug to v0.497 to fix issues and improve performance.
+ - Updated a warning message about single instance communication.
+ - Updated cpath processing to allow Linux version to run side-by-side with Windows and Mac.
+ - Updated licensing information.
+ - Enabled scratchpad support in the debugger when interpreter is capable of providing it.
+ - Disabled auto-complete in comments and strings.
+ - Disabled toggling breakpoints while debugger is running (as they wouldn't be changed anyway).
+ - Disabled 'not activated file for debugging' message when auto-activation is disabled.
+ - Disabled tooltip when scratchpad is on (fixes #51).
+ - Disabled showing calltip when the editor is not in focus.
+ - Disabled showing calltip over markup in comments.
+ - Disabled 'Run as Scratchpad' in the menu for those intepreters that don't support scratchpad.
+ - Updated configuration examples to add editor settings and fix user.lua path.
+ - Moved all Estrela features into a separate bundle that can be loaded using cfg/estrela.lua config.
+ - Removed multiple file types offered in Save As dialog.
+
+### Incompatibilities
+ - Changed searching for user config in '$HOME/.zbstudio' from '$HOME/.zbs'.
+ - Temporarily removed the ability to modify spec-related configuration parameters from configuration files.
+
+### Fixes
+ - Fixed opening a non-existing file from the Recent Files list.
+ - Fixed Find/Replace dialog checkboxes that didn't react to clicks on OSX (fixes #63).
+ - Fixed an auto-complete issue with mixed case dynamic words (fixes #60).
+ - Fixed 'Trying to solve a NULL hostname' warning message.
+ - Fixed a typo that prevented a corner case in autocomplete from working.
+ - Fixed inconsistent error messages about various config files.
+ - Fixed an issue with auto-complete when dot or colon is used (fixes #56).
+ - Fixed an issue with debugging scripts started using absolute file path.
+ - Fixed setting working directory for interpreters to the file path when the project directory is not set.
+ - Fixed an issue with Backspace not closing auto-complete suggestions.
+ - Fixed enabling items in the Edit menu (fixes #56).
+ - Fixed function list in the toolbar on Mac (helps #14).
+ - Fixed deleting of comment blocks with hidden markup (fixes #40).
+ - Fixed an issue with function list when all editor tabs are closed.
+ - Fixed multiple calltips shown on Linux (helps #15).
+ - Fixed an issue with mouse cursor in scratchpad not properly updated on Linux (fixes #49; helps #15).
+ - Fixed an issue with static analyzer that failes on function names like a.b.c (fixes #50).
+ - Fixed disabling Paste menu on Linux when needed (fixes #46; helps #15).
+ - Fixed an issue with context menu on Linux (fixes #47; helps #15).
+ - Fixed debugger failure when debugging is initiated externally and there is an unsaved file in one of editor tabs.
+ - Fixed stopping the debugger when an editor tab where debugging happens is closed.
+ - Fixed enabling of several menu items with no editor tab (fixes #42).
+ - Fixed an issue with loading stock icons on Linux.
+ - Fixed Cut/Copy menu items to reflect proper status in the editor.
+ - Fixed typo in the static analyzer output.
+ - Resolved conflict between lua executable names on Windows and Mac.
+
+## v0.32 (Sep 03 2012)
+
+### Highlights
+ - Added **Unicode support** for file encoding and file paths on Windows (fixes #30).
+ - Added **Moai integration and debugging** (including debugging of Moai threads and callbacks).
+ - Added refresh of Stack and Watch windows after executing a statement in remote shell.
+ - Added **display of complex values** on multiple lines in shell with '='.
+ - Added calltip on mouseover for functions during editing and for variables/expressions during debugging.
+ - Added configuration options to set paths to lua and love2d executables.
+ - Added support for **coroutine debugging** with stepping through coroutine.resume/.yield calls.
+ - Updated wx.dll to wxlua 2.8.12.2 and wxwidgets 2.8.12.
+ - Signed zbstudio app and executable to avoid issues with files not being saved without admin privileges and to remove warning about 'unknown publisher' on windows (fixes #25).
+
+### Improvements
+ - Added calltip on mouseover for functions during editing and for variables/expressions during debugging.
+ - Added an IO filter to fix an issue with 0d0d0a line endings on Windows.
+ - Added support for debugging moai callbacks (upgraded to mobdebug v0.489).
+ - Added refresh of Stack and Watch windows to show updated values after executing a statement in remote shell.
+ - Added display of complex values on multiple lines in shell with '='.
+ - Added rockspec to the list of extensions for lua (fixes #37).
+ - Added a check to avoid evaluating keywords in tooltip.
+ - Added current interpreter to the status bar; adding closing debugger when the interpreter is changed.
+ - Added aborting scratchpad processing when an interpreter can't start or report a fatal error.
+ - Added support for unicode path files on Windows (fixes #30).
+ - Added an option to set path to lua executable.
+ - Added error handler to trap and display debugger errors.
+ - Added search in PATH for love2d executable.
+ - Added a workaround for GetExecutablePath() reporting 'wx.dll' instead of a proper exe name with wxlua 2.8.12.2 on Windows.
+ - Added reporting of function name of the form a.b and a:b in static analysis (fixes #27).
+ - Added ability for user to keep their settings file in their home directory.
+ - Added per user settings file. Users can now move their settings file to ~/.zbs/user.lua.
+ - Added ignoring Cmd-key combinations on Mac as this should be handled by wxwidgets, but is not (fixes #19).
+ - Added support for coroutine debugging with stepping through coroutine.resume/.yield calls.
+ - Changed reporting of program execution time from CPU time to user time.
+ - Changed the call to unhide windows to the async version (ShowWindowAsync) to avoid blocking the IDE when the application doesn't respond.
+ - Upgraded to wxlua 2.8.12.2 (wxwidgets 2.8.12; unicode version); added lua51.dll proxy (fixes #10 and #7).
+ - Updated love2d interpreter to use the project folder to check for main.lua.
+ - Updated test module to use stringified values for comparison.
+ - Updated status bar style to make it consistent across platforms.
+ - Removed .bak files from being replaced in when backup copies are saved.
+ - Removed explicit path conversions and comparisons.
+ - Refactored LUA_PATH/CPATH processing to set it for all interpreters.
+ - Signed zbstudio app and executable to avoid issues with files not being saved without admin privileges and to remove warning about 'unknown publisher' on windows (fixes #25).
+
+### Incompatibilities
+ - Reassigned hotkeys in the Project menu to minimize conflicts on Mac (reassigned Shift-F12 and F11).
+
+### Fixes
+ - Fixed an issue with double click on analylsis results being out-of-sync when the editor switched to another file (fixes #38)
+ - Fixed an issue with debugger not activating files with relative path information.
+ - Fixed 'break' command to work after coming from debugger calls (like on()).
+ - Fixed an issue with highlighting selected item in the project tree.
+ - Fixed evaluation of foo:bar in tooltip (now evaluates as foo.bar).
+ - Fixed debugger termination after internal errors.
+ - Fixed activating current file in the project tree on Mac (closes #29).
+ - Fixed running scripts with single quotes in path names.
+ - Fixed an issue with Run/Debug commands when IDE path includes exclamation mark ('!').
+ - Fixed an issue with the app not starting on those systems that don't have HOME environment variable; fixes #28.
+ - Fixed an issue with showing/hiding GUI windows that was occasionally causing a runtime error when the window disappears before it is manipulated.
+ - Fixed returning proper name for unsaved files in reporting compilation and static analysis results; moved default names to ide.config (fixes #26).
+ - Fixed pasting text into the Find dialog and project path box on Mac (fixes #22).
+ - Fixed handling of dashes in paths (upgraded to mobdebug 0.479).
+ - Reorganized handling of automcomplete event (to use AddPendingEvent instead of PostEvent) to avoid runtime application error.
+
+## v0.31 (Jul 14 2012)
+
+### Highlights
+ - Added **scratchpad support for love2d**.
+ - Added tooltip to display variable/expression values during debugging.
+ - Added **MacOS support**.
+
+### Improvements
+ - Added handling of balanced brackets in markup links.
+ - Added unit test module.
+ - Added reporting the number of traced lines during debugging.
+ - Added setting of PATH and CPATH to find proper libs on windows and mac os platforms.
+ - Added scratchpad support for love2d.
+ - Added reset of 'modified' status to keep tab names and their config settings correct upon exit.
+ - Added window title update and filetree refresh after SaveAs command.
+ - Added tooltip to display variable/expression values during debugging.
+ - Made 'View Stack Window' and 'View Watch Window' refresh window content if it's already shown.
+ - Removed setting the editor font in the config as the default font is different on different platforms.
+ - Removed extension from the template to match folders to make it more portable.
+ - Reorganized handling of font configuration and added font config for filetree (with a different size default on MacOS).
+ - Updated matching logic for function definitions to allow for a.b.c() definitions (fixes #17).
+
+### Fixes
+ - Fixed markup styling and file tree drawing on MacOS.
+ - Fixed detecting executable name in commands with spaces.
+ - Fixed incorrect folders reported in the file tree when no project directory is set and a file is open.
+ - Fixed incorrect filename reported in compile errors when the file is not saved.
+ - Fixed refresh of filetree on MacOS to get it displayed correctly when the app is started.
+ - Fixed an error thrown when a window with debugging is closed before the application being debugged is terminated.
+ - Fixed incorrect storing of settings for editor tabs with the same text (filename). This was causing only one tab displayed for multiple StyledText controls with interesting effects.
+ - Fixed an issue with launching a process when its output is not redirected to the IDE (fixes #16).
+ - Fixed console to evaluate 'function a() ... end' without errors.
+ - Fixed a compilation error caused by shebang in scripts.
+ - Fixed an issue with love2d path with spaces.
+ - Corrected resetting of project directory when it's already set and doesn't need to be changed.
+ - Added checks around ShowFullScreen() calls to avoid failures on those systems that don't provide it (linux/GTK).
+ - Added check for debugger calls to avoid errors when debugger is not loaded.
+ - Updated matching of links to make them less greedy (to avoid capturing link terminators).
+ - Upgraded deprecated constants and logic for compatibility with wxwidgets 2.9.x.
+ - Reset project directory if the current one doesn't exist.
+ - Removed styling of function calls and capturing definitions in strings and comments (fixed #18).
+ - Removed setting focus to the Output window when output is processed as it interfered with Run as Scratchpad.
+
+## v0.30 (Jun 27 2012)
+
+### Highlights
+ - Added **love2d support**.
+ - Added auto complete for love2d API.
+ - Added support for debugging processes running under LuaJIT.
+ - Added display of **hierarchical data in Stack window**.
+ - Added **pretty printing in Watch and Console** (local and remote) windows and handling of multiple results in Console.
+ - Added **Stack window to display stack information** and local/upvalue values for each stack frame.
+ - Added ability to **interact with scripts** by allowing text to be entered in the 'Output' window.
+
+### Improvements
+ - Added love2d support.
+ - Added auto complete for love2d API.
+ - Added support for debugging processes running under LuaJIT.
+ - Added display of hierarchical data in Stack window.
+ - Added execution time and updated messages in the Output window to be more consistent.
+ - Added displaying 'nil' values in local console when no result is returned by an expression.
+ - Added a check to refuse starting a new debugging session if there is one in progress already.
+ - Added handling of tail calls in the Stack window.
+ - Added pretty printing in Watch and Console (local and remote) windows and handling of multiple results in Console.
+ - Added Stack window to display stack information and local/upvalue values for each stack frame.
+ - Added ability to set font encoding in the config.
+ - Added restoring cursor position when a modified file is reloaded in the editor.
+ - Added ability to interact with scripts by allowing text to be entered in the 'Output' window.
+ - Improved logic in love2d integration to distinguish Debug and Run commands (closes #13).
+ - Improved reporting in static analysis for functions and global variables.
+ - Updated menus to avoid conflicts with MacOS shortcuts.
+ - Updated logic creating menubar to make it work correctly on MacOS with special Help/About items.
+ - Updated path handling to better detect how the app is started and to avoid loading dlls on non-windows platforms.
+ - Updated logic for detecting hostname (used in the debugger) to make sure it is resolvable.
+ - Changed order of lualibs/ and bin/ directories in package.path and package.cpath to load included modules first.
+ - Removed extensions from launch commands and updated display logic in the Output window.
+
+### Fixes
+ - Fixed aborting running/debugged programs on MacOS by adding MAKE_GROUP_LEADER option to wxExecute.
+ - Fixed an issue in the logic for setting breakpoints, which ignored breakpoints in luxinia2 debug sessions.
+ - Fixed logic in the local/remote console that returned incorrect error message on executing code like '%s':format(1).
+ - Fixed IDs for Project menu items to allow them to be removed from the menu if needed.
+ - Fixed an issue with remote application not terminating when IDE is closed while debugging is in progress.
+ - Fixed refreshing a modified file when the editor is set to read-only mode.
+ - Fixed saving/restoring configuration of 'Output'/'Console' tabs when IDE is closed while debugging is in progress.
+ - Fixed removing variable name in Watch window after escaping editing.
+ - Fixed #9 as it had incorrect logic in one of UTF filters.
+ - Fixed edit menu shortcuts to work in the 'Output' window (when allowed).
+ - Fixed reporting of processes that failed to start after 'Run' or 'Debug' commands.
+ - Fixed executable path matching to work on systems that don't have file extensions.
+ - Fixed #3 'unused parameter...' check not to fail on anonymous functions that are part of an expression.
+ - Moved processing of `user.lua` to a later phase after tools and specs are already loaded to allow modification of IDE configuration from `user.lua`. Closes #5.
+ - Added checks to prevent text modification in 'Output' and 'Console' windows. Fixes #8.
+ - Disabled 'Run as Scratchpad' if there is no debugger registered capable of running it.
+ - Disabled Stack and Watch updates when scratchpad is active as they interfere with application execution.
+
+## v0.29 (May 31 2012)
+
+### Highlights
+ - Added **scratchpad** (running live) functionality.
+ - Added **code analyzer** based on lua-inspect.
+ - Updated **comment styling** to follow markdown syntax.
+
+### Improvements
+ - Added scratchpad (running live) functionality.
+ - Added code analyzer based on lua-inspect.
+ - Added Ctrl(-Shift)-TAB navigation between tabs in the editor.
+ - Added navigation between editor tabs using Ctrl-PgUp and Ctrl-PgDn.
+ - Added reporting of assignment to global variables in the code analyzer.
+ - Added ability to turn external processes that connect to debugger into a scratchpad.
+ - Added exit from full screen mode using ESC key.
+ - Added reporting of compilation errors during debugging sessions.
+ - Added handling of more errors in the shell to allow calculations like '(1+2)' to be executed correctly.
+ - Added moving focus back to the notebook after unhiding/activating a wx window.
+ - Added missing mime/code.dll and reorganized socket module files (socket.*) to load correctly with require.
+ - Added stopping the debugger when a debugged program exits.
+ - Added to static analysis reporting of unused parameters in functions.
+ - Disabled warning in static analysis about unused 'self' in methods.
+ - Removed 'error during pre-compilation' message from compile errors.
+ - Updated comment styling to follow markdown syntax.
+
+### Fixes
+ - Fixed handling of scripts with comments in the remote shell.
+ - Fixed an issue with Analyze process when the analyzed script has compilation errors.
+ - Fixed an issue with scratchpad being on after Save dialog is canceled.
+ - Fixed about screen.
+
+## v0.28 (Mar 21 2012)
+
+### Highlights
+ - Added full screen mode.
+
+### Improvements
+ - Added option to activate output/console when Run/Debug/Compile commands are executed.
+ - Added full screen mode.
+ - Added killing a running process on IDE exit.
+ - Added killing a running process with Shift-F12.
+ - Disabled buffering of the output for scripts run from IDE.
+
+### Fixes
+ - Fixed 'Trace' command to continue working when a debugged file is not activated.
+ - Fixed an issue with saving a file when no project directory is set.
+ - Fixed missing semicolon in lualibs path; added path for debugger to search under lualibs.
+ - Fixed an issue with a missing path separator, which prevented debugging from executing step commands in some cases.
+ - Fixed missing slash on SaveAs by enforcing trailing slash for the project path.
+
+## v0.27 (Feb 14 2012)
+
+### Highlights
+ - Added markup formatting in the comments.
+
+### Improvements
+ - Added markup formatting in the comments.
+ - Added Debug and Run methods to simulate menu commands.
+ - Added setting a project folder on initial start.
+ - Added style processing for font name, font size, visibility and hotspot attributes.
+ - Added setting the current project directory for the shell to allow 'require' commands to work with local modules.
+ - Updated markup processing with run and debug commands, http link processing, and opening local files in a new window.
+ - Enforced visibility for shell prompt.
+
+### Fixes
+ - Fixed activation of a correct tab when one of the editor tabs is closed.
+ - Fixed an issue with file activation from a debugger.
+ - Fixed the issue of ClosePage method being called with two different parameters.
+ - Fixed the issue of the project dir being returned with two trailing slashes.
+ - Fixed an issue with activating the currenly edited file in the file tree.
+ - Wrapped DragAcceptFiles into a protected call to make it not fail on MacOS (compiled with wxwidgets 2.8.12).
+
+## v0.26 (Jan 18 2012)
diff --git a/love2dToAPK/tools/tools/zbstudio-win/LICENSE b/love2dToAPK/tools/tools/zbstudio-win/LICENSE
new file mode 100644
index 0000000..d05f7d2
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/LICENSE
@@ -0,0 +1,237 @@
+--[[ ZeroBrane Studio License ]]-------------------------------------------
+
+ZeroBrane Studio sources are released under the MIT License
+
+Copyright (c) 2011-2015 Paul Kulchenko (paul@kulchenko.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+--[[ Estrela Editor License ]]---------------------------------------------
+
+Estrela Editor sources are released under the MIT License
+
+Copyright (c) 2008-2012
+ Luxinia DevTeam:
+ Christoph Kubisch & Eike Decker
+ info at luxinia.de
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+--[[ wxLua License ]]------------------------------------------------------
+
+http://wxlua.sourceforge.net/
+
+Pre-Built binaries for wxLua/WxWindows
+
+Original wxLua Lua sample IDE:
+ Lomtick Software
+ J. Winwood & John Labenski
+ luascript at thersgb.net
+
+wxLua is based on
+wxWindows Library License, Version 3
+
+Copyright (c) 1998 Julian Smart, Robert Roebling et al
+
+Everyone is permitted to copy and distribute verbatim copies
+of this licence document, but changing it is not allowed.
+
+WXWINDOWS LIBRARY LICENCE
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+This library is free software; you can redistribute it and/or modify it
+under the terms of the GNU Library General Public Licence as published by
+the Free Software Foundation; either version 2 of the Licence, or (at
+your option) any later version.
+
+This library is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library
+General Public Licence for more details.
+
+You should have received a copy of the GNU Library General Public Licence
+along with this software, usually in a file named COPYING.LIB. If not,
+write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+Boston, MA 02111-1307 USA.
+
+EXCEPTION NOTICE
+
+1. As a special exception, the copyright holders of this library give
+permission for additional uses of the text contained in this release of
+the library as licenced under the wxWindows Library Licence, applying
+either version 3 of the Licence, or (at your option) any later version of
+the Licence as published by the copyright holders of version 3 of the
+Licence document.
+
+2. The exception is that you may use, copy, link, modify and distribute
+under the user's own terms, binary object code versions of works based
+on the Library.
+
+3. If you copy code from files distributed under the terms of the GNU
+General Public Licence or the GNU Library General Public Licence into a
+copy of this library, as this licence permits, the exception does not
+apply to the code that you add in this way. To avoid misleading anyone as
+to the status of such modified files, you must delete this exception
+notice from such code and/or adjust the licensing conditions notice
+accordingly.
+
+4. If you write modifications of your own for this library, it is your
+choice whether to permit this exception to apply to your modifications.
+If you do not wish that, you must delete the exception notice from such
+code and/or adjust the licensing conditions notice accordingly.
+
+--[[ Lua License ]]--------------------------------------------------------
+
+Copyright: © 1994-2006 Lua.org, PUC-Rio.
+Homepage: http://www.lua.org
+License: http://www.lua.org/copyright.html
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+--[[ LuaSockets License ]]-------------------------------------------------
+
+Copyright: © 2004-2006 Diego Nehab. All rights reserved.
+Homepage: http://www.cs.princeton.edu/~diego/professional/luasocket/
+License: http://www.lua.org/copyright.html (same as LUA)
+
+--[[ Serpent License ]]----------------------------------------------------
+
+Copyright (c) 2011-2013 Paul Kulchenko (paul@kulchenko.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+--[[ LuaJIT License ]]-----------------------------------------------------
+
+Copyright © 2005-2013 Mike Pall, released under the MIT open source license.
+
+--[[ WinAPI License ]]-----------------------------------------------------
+
+Copyright (C) 2011 Steve Donovan.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+--[[ MobDebug License ]]---------------------------------------------------
+
+MobDebug sources are released under the MIT License
+
+Copyright (c) 2011-2012 Paul Kulchenko (paul@kulchenko.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+--[[ RemDebug License ]]---------------------------------------------------
+
+Copyright (c) 2006 The Kepler Project.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/love2dToAPK/tools/tools/zbstudio-win/README.md b/love2dToAPK/tools/tools/zbstudio-win/README.md
new file mode 100644
index 0000000..4b40527
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/README.md
@@ -0,0 +1,113 @@
+# Project Description
+
+[ZeroBrane Studio](http://studio.zerobrane.com/) is a lightweight cross-platform Lua IDE with code completion,
+syntax highlighting, remote debugger, code analyzer, live coding,
+and debugging support for several Lua engines
+([Lua 5.1](http://studio.zerobrane.com/doc-lua-debugging),
+[Lua 5.2](http://studio.zerobrane.com/doc-lua52-debugging),
+[Lua 5.3](http://studio.zerobrane.com/doc-lua53-debugging),
+[LuaJIT](http://studio.zerobrane.com/doc-luajit-debugging),
+[LÖVE](http://notebook.kulchenko.com/zerobrane/love2d-debugging),
+[Moai](http://notebook.kulchenko.com/zerobrane/moai-debugging-with-zerobrane-studio),
+[Gideros](http://notebook.kulchenko.com/zerobrane/gideros-debugging-with-zerobrane-studio-ide),
+[Corona](http://notebook.kulchenko.com/zerobrane/debugging-and-live-coding-with-corona-sdk-applications-and-zerobrane-studio),
+[Marmalade Quick](http://notebook.kulchenko.com/zerobrane/marmalade-quick-debugging-with-zerobrane-studio),
+[Cocos2d-x](http://notebook.kulchenko.com/zerobrane/cocos2d-x-simulator-and-on-device-debugging-with-zerobrane-studio),
+[OpenResty/Nginx](http://notebook.kulchenko.com/zerobrane/debugging-openresty-nginx-lua-scripts-with-zerobrane-studio),
+[Torch7](http://notebook.kulchenko.com/zerobrane/torch-debugging-with-zerobrane-studio),
+[Redis](http://notebook.kulchenko.com/zerobrane/redis-lua-debugging-with-zerobrane-studio),
+[GSL-shell](http://notebook.kulchenko.com/zerobrane/gsl-shell-debugging-with-zerobrane-studio),
+[Adobe Lightroom](http://notebook.kulchenko.com/zerobrane/debugging-lightroom-plugins-zerobrane-studio-ide),
+[Lapis](http://notebook.kulchenko.com/zerobrane/lapis-debugging-with-zerobrane-studio),
+[Moonscript](http://notebook.kulchenko.com/zerobrane/moonscript-debugging-with-zerobrane-studio),
+and others). It originated from the [Estrela Editor](http://www.luxinia.de/index.php/Estrela/).
+
+![ZeroBrane Studio debugger screenshot](http://studio.zerobrane.com/images/debugging.png)
+
+## Features
+
+* Written in Lua, so easily customizable.
+* Small, portable, and cross-platform (Windows, Mac OSX, and Linux).
+* Auto-completion for functions, keywords, and custom APIs.
+* Interactive console to directly test code snippets with local and remote execution.
+* Integrated debugger with local and [remote debugging](http://studio.zerobrane.com/doc-remote-debugging)
+for [Lua 5.1](http://studio.zerobrane.com/doc-lua-debugging),
+[Lua 5.2](http://studio.zerobrane.com/doc-lua52-debugging),
+[Lua 5.3](http://studio.zerobrane.com/doc-lua53-debugging),
+[LuaJIT](http://studio.zerobrane.com/doc-luajit-debugging),
+and [other Lua engines](http://studio.zerobrane.com/documentation#debugging).
+* [Live coding](http://studio.zerobrane.com/documentation#live_coding)
+with [Lua](http://notebook.kulchenko.com/zerobrane/live-coding-in-lua-bret-victor-style),
+[LÖVE](http://notebook.kulchenko.com/zerobrane/live-coding-with-love),
+[Gideros](http://notebook.kulchenko.com/zerobrane/gideros-live-coding-with-zerobrane-studio-ide),
+[Moai](http://notebook.kulchenko.com/zerobrane/live-coding-with-moai-and-zerobrane-studio),
+[Corona SDK](http://notebook.kulchenko.com/zerobrane/debugging-and-live-coding-with-corona-sdk-applications-and-zerobrane-studio),
+GSL-shell, and other engines.
+* Function outline.
+* Fuzzy search with `Go To File`, project-wide `Go To Symbol`, and `Insert Library Function`.
+* Several ways to extend the current functionality:
+ - specs (`spec/`): specifications for file syntax, lexer, and keywords;
+ - apis (`api/`): descriptions for [code completion and tooltips](http://studio.zerobrane.com/doc-api-auto-complete);
+ - interpreters (`interpreters/`): components for setting debugging and run-time project environment;
+ - packages (`packages/`): [plugins](http://studio.zerobrane.com/doc-plugin) that provide additional functionality;
+ - config (`cfg/`): settings for styles, color themes, and other preferences;
+ - translations (`cfg/i18n/`): [translations](http://studio.zerobrane.com/doc-translation) of the menus and messages to other languages;
+ - tools (`tools/`): additional tools.
+
+## Documentation
+
+* A [short and simple overview](http://studio.zerobrane.com/doc-getting-started) for those who are new to this development environment.
+* A list of [frequently asked questions](http://studio.zerobrane.com/doc-faq) about the IDE.
+* [Tutorials and demos](http://studio.zerobrane.com/tutorials) that cover debugging and live coding for different environments.
+* [Tips and tricks](http://studio.zerobrane.com/doc-tips-and-tricks).
+
+## Installation
+
+ZeroBrane Studio can be installed into and run from any folder.
+No compilation is needed, although the scripts to compile required libraries for Windows, OSX, and Linux platforms are available in the `build/` folder.
+
+## Usage
+
+```
+Open file(s):
+ zbstudio [option] [<project directory>] <filename> [<filename>...]
+ non-options are treated as a project directory to set or a file to open
+
+Set project directory:
+ zbstudio <project directory> [<filename>...]
+ (0.39+) a directory passed as a parameter will be set as the project directory
+
+Override default configuration:
+ zbstudio -cfg "<luacode overriding config>" [<filename>]
+ e.g.: zbstudio -cfg "editor.fontsize=12" somefile.lua
+
+Load custom configuration:
+ zbstudio -cfg path/file.lua [<filename>]
+ e.g.: zbstudio -cfg cfg/estrela.lua
+```
+
+If you are loading a file, you can also request the cursor to be set on a particular line or at a particular position by using `filename:<line>` and `filename:p<pos>` syntax (0.71+).
+
+## Contributing
+
+See [CONTRIBUTING](CONTRIBUTING.md).
+
+## Author
+
+### ZeroBrane Studio and MobDebug
+
+ **ZeroBrane LLC:** Paul Kulchenko (paul@kulchenko.com)
+
+### Estrela Editor
+
+ **Luxinia Dev:** Christoph Kubisch (crazybutcher@luxinia.de)
+
+## Where is Estrela?
+
+The Estrela project has been merged into ZeroBrane Studio. If you have used Estrela
+for graphics shader authoring or luxinia, create/modify the `cfg/user.lua` and
+add `include "estrela"` (1.21+) to load all tools and specifications by default again.
+
+## License
+
+See [LICENSE](LICENSE).
diff --git a/love2dToAPK/tools/tools/zbstudio-win/api/cg/stdlib.lua b/love2dToAPK/tools/tools/zbstudio-win/api/cg/stdlib.lua
new file mode 100644
index 0000000..ac20661
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/api/cg/stdlib.lua
@@ -0,0 +1,205 @@
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local function fn (description)
+ local description2,returns,args = description:match("(.+)%-%s*(%b())%s*(%b())")
+ if not description2 then
+ return {type="function",description=description,
+ returns="(?)"}
+ end
+ return {type="function",description=description2,
+ returns=returns:gsub("^%s+",""):gsub("%s+$",""), args = args}
+end
+
+local function val (description)
+ return {type="value",description = description}
+end
+-- docs
+local api = {
+abs = fn "returns absolute value of scalars and vectors. - (typeN)(typeN)",
+acos = fn "returns arccosine of scalars and vectors. - (typeN)(typeN)",
+all = fn "returns true if a boolean scalar or all components of a boolean vector are true. - (bool)(boolN)",
+any = fn "returns true if a boolean scalar or any component of a boolean vector is true. - (bool)(boolN)",
+asin = fn "returns arcsine of scalars and vectors. - (typeN)(typeN)",
+atan = fn "returns arctangent of scalars and vectors. - (typeN)(typeN)",
+atan2 = fn "returns the arctangent of y/x. atan2 is well defined for every point other than the origin, even if x equals 0 and y does not equal 0. - (typeN)(typeN y, typeN x)",
+ceil = fn "returns smallest integer not less than a scalar or each vector component. - (typeN)(typeN)",
+clamp = fn "returns x clamped to the range [a,b]. - (typeN)(typeN x, a, b)",
+clip = fn "conditionally (<0) kill a pixel before output. - ()(typeN)",
+cos = fn "returns cosine of scalars and vectors. - (typeN)(typeN)",
+cosh = fn "returns hyperbolic cosine of scalars and vectors. - (typeN)(typeN)",
+cross = fn "returns the cross product of two three-component vectors. - (type3)(type3 a, b)",
+ddx = fn "returns approximate partial derivative with respect to window-space X. - (typeN)(typeN)",
+ddy = fn "returns approximate partial derivative with respect to window-space Y. - (typeN)(typeN)",
+degrees = fn "converts values of scalars and vectors from radians to degrees. - (typeN)(typeN)",
+determinant = fn "returns the scalar determinant of a square matrix. - (float)(floatNxN)",
+distance = fn "return the Euclidean distance between two points. - (typeN)(typeN a, b)",
+dot = fn "returns the scalar dot product of two vectors. - (type)(typeN a, b)",
+exp = fn "returns the base-e exponential of scalars and vectors. - (typeN)(typeN)",
+exp2 = fn "returns the base-2 exponential of scalars and vectors. - (typeN)(typeN)",
+faceforward = fn "returns a normal as-is if a vertex's eye-space position vector points in the opposite direction of a geometric normal, otherwise return the negated version of the normal. - (typeN)(typeN Nperturbated, Incident, Ngeometric)",
+floatToIntBits = fn "returns the 32-bit integer representation of an IEEE 754 floating-point scalar or vector - (intN)(floatN)",
+floatToRawIntBits = fn "returns the raw 32-bit integer representation of an IEEE 754 floating-point scalar or vector. - (intN)(floatN)",
+floor = fn "returns largest integer not greater than a scalar or each vector component. - (typeN)(typeN)",
+fmod = fn "returns the remainder of x/y with the same sign as x. - (typeN)(typeN x, y)",
+frac = fn "returns the fractional portion of a scalar or each vector component. - (typeN)(typeN)",
+frexp = fn "splits scalars and vectors into normalized fraction and a power of 2. - (typeN)(typeN x, out typeN e)",
+fwidth = fn "returns sum of approximate window-space partial derivatives magnitudes. - (typeN)(typeN)",
+intBitsToFloat = fn "returns the float value corresponding to a given bit represention.of a scalar int value or vector of int values. - (floatN)(intN)",
+isfinite = fn "test whether or not a scalar or each vector component is a finite value. - (boolN)(typeN)",
+isinf = fn "test whether or not a scalar or each vector component is infinite. - (boolN)(typeN)",
+isnan = fn "test whether or not a scalar or each vector component is not-a-number. - (boolN)(typeN)",
+ldexp = fn "returns x times 2 rained to n. - (typeN)(typeN a, n)",
+length = fn "return scalar Euclidean length of a vector. - (type)(typeN)",
+lerp = fn "lerp - returns linear interpolation of two scalars or vectors based on a weight. - (typeN)(typeN a, b, weight)",
+lit = fn "computes lighting coefficients for ambient(x), diffuse(y), and specular(z) lighting contributions (w=1). - (type4)(type NdotL, NdotH, specshiny)",
+log = fn "returns the natural logarithm of scalars and vectors. - (typeN)(typeN)",
+log10 = fn "returns the base-10 logarithm of scalars and vectors. - (typeN)(typeN)",
+log2 = fn "returns the base-2 logarithm of scalars and vectors. - (typeN)(typeN)",
+max = fn "returns the maximum of two scalars or each respective component of two vectors. - (typeN)(typeN a, b)",
+min = fn "returns the minimum of two scalars or each respective component of two vectors. - (typeN)(typeN a, b)",
+mul = fn "Returns the vector result of multiplying a matrix M by a column vector v; a row vector v by a matrix M; or a matrix A by a second matrix B. - (typeN)(typeNxN/typeN a, typeN/typeNxN b)",
+normalize = fn "Returns the normalized version of a vector, meaning a vector in the same direction as the original vector but with a Euclidean length of one. - (typeN)(typeN)",
+pow = fn "returns x to the y-th power of scalars and vectors. - (typeN)(typeN x, y)",
+radians = fn "converts values of scalars and vectors from degrees to radians. - (typeN)(typeN)",
+reflect = fn "returns the reflectiton vector given an incidence vector and a normal vector. - (typeN)(typeN incidence, normal)",
+refract = fn "computes a refraction vector. - (typeN)(typeN incidence, normal, type eta)",
+round = fn "returns the rounded value of scalars or vectors. - (typeN)(typeN a)",
+rsqrt = fn "returns reciprocal square root of scalars and vectors. 1/sqrt. - (typeN)(typeN)",
+saturate = fn "returns x saturated to the range [0,1]. - (typeN)(typeN)",
+sign = fn "returns sign (1 or -1) of scalar or each vector component. - (typeN)(typeN)",
+sin = fn "returns sine of scalars and vectors. - (typeN)(typeN)",
+sincos = fn "returns sine of scalars and vectors. - ()(typeN x, out typeN sin, out typeN cos)",
+sinh = fn "returns hyperbolic sine of scalars and vectors. - (typeN)(typeN)",
+sqrt = fn "returns square root of scalars and vectors. - (typeN)(typeN)",
+step = fn "implement a step function returning either zero or one (a <= b). - (typeN)(typeN a, b)",
+tan = fn "returns tangent of scalars and vectors. - (typeN)(typeN)",
+tanh = fn "returns hyperbolic tangent of scalars and vectors. - (typeN)(typeN)",
+transpose = fn "returns transpose matrix of a matrix. - (typeRxC)(typeCxR)",
+trunc = fn "returns largest integer not greater than a scalar or each vector component. - (typeN)(typeN)",
+
+tex1D = fn "performs a texture lookup in a given 1D sampler and, in some cases, a shadow comparison (as .y coord). May also use pre computed derivatives if those are provided. Texeloffset only in gp4 or higher profiles. - (float4)(sampler1D, float/float2 s, |float dx, dy|,[int texeloffset])",
+tex1Dbias = fn "performs a texture lookup with bias in a given sampler (as .w). - (float4)(sampler1D, float4 s, [int texeloffset])",
+tex1Dcmpbias = fn "performs a texture lookup with bias and shadow compare in a given sampler (compare as .y, bias as .w). - (float4)(sampler1D, float4 s, [int texeloffset])",
+tex1Dcmplod = fn "performs a texture lookup with a specified level of detail and a shadow compare in a given sampler (compare as .y, lod as .w). - (float4)(sampler1D, float4 s, [int texeloffset])",
+tex1Dfetch = fn "performs an unfiltered texture lookup in a given sampler (lod as .w). - (float4)(sampler1D, int4 s, [int texeloffset])",
+tex1Dlod = fn "performs a texture lookup with a specified level of detail in a given sampler (lod as .w) - (float4)(sampler1D, float4 s, [int texeloffset])",
+tex1Dproj = fn "performs a texture lookup with projection in a given sampler. May perform a shadow comparison if argument for shadow comparison is provided. (shadow in .y for float3 coord, proj in .y or .z) - (float4)(sampler1D, float2/float3 s, [int texeloff])",
+tex1Dsize = fn "returns the size of a given texture image for a given level of detail. (only gp4 profiles) - (int3)(sampler1D, int lod)",
+
+tex2D = fn "performs a texture lookup in a given 2D sampler and, in some cases, a shadow comparison (as .z coord). May also use pre computed derivatives if those are provided. Texeloffset only in gp4 or higher profiles. - (float4)(sampler2D, float2/float3 s, |float2 dx, dy|,[int texeloffset])",
+tex2Dbias = fn "performs a texture lookup with bias in a given sampler (as .w). - (float4)(sampler2D, float4 s, [int texeloffset])",
+tex2Dcmpbias = fn "performs a texture lookup with bias and shadow compare in a given sampler (compare as .z, bias as .w). - (float4)(sampler2D, float4 s, [int texeloffset])",
+tex2Dcmplod = fn "performs a texture lookup with a specified level of detail and a shadow compare in a given sampler (compare as .y, lod as .w). - (float4)(sampler2D, float4 s, [int texeloffset])",
+tex2Dfetch = fn "performs an unfiltered texture lookup in a given sampler (lod as .w). - (float4)(sampler2D, int4 s, [int texeloffset])",
+tex2Dlod = fn "performs a texture lookup with a specified level of detail in a given sampler (lod as .w) - (float4)(sampler2D, float4 s, [int texeloffset])",
+tex2Dproj = fn "performs a texture lookup with projection in a given sampler. May perform a shadow comparison if argument for shadow comparison is provided. (shadow in .z for float3 coord, proj in .z or .w) - (float4)(sampler2D, float3/float4 s, [int texeloff])",
+tex2Dsize = fn "returns the size of a given texture image for a given level of detail. (only gp4 profiles) - (int3)(sampler2D, int lod)",
+tex2Dgather = fn "returns 4 texels of a given single channel texture image for a given level of detail. (only gp4 profiles) - (int3)(sampler2D, int lod)",
+
+tex3D = fn "performs a texture lookup in a given 3D sampler. May also use pre computed derivatives if those are provided. Texeloffset only in gp4 or higher profiles. - (float4)(sampler3D, float3 s, {float3 dx, dy},[int texeloffset])",
+tex3Dbias = fn "performs a texture lookup with bias in a given sampler (as .w). - (float4)(sampler3D, float4 s, [int texeloffset])",
+tex3Dfetch = fn "performs an unfiltered texture lookup in a given sampler (lod as .w). - (float4)(sampler3D, int4 s, [int texeloffset])",
+tex3Dlod = fn "performs a texture lookup with a specified level of detail in a given sampler (lod as .w) - (float4)(sampler3D, float4 s, [int texeloffset])",
+tex3Dproj = fn "performs a texture lookup with projection in a given sampler. (proj in .w) - (float4)(sampler3D, float4 s, [int texeloff])",
+tex3Dsize = fn "returns the size of a given texture image for a given level of detail. (only gp4 profiles) - (int3)(sampler3D, int lod)",
+
+texBUF = fn "performs an unfiltered texture lookup in a given texture buffer sampler. (only gp4 profiles) - (float4)(samplerBUF, int s)",
+texBUFsize = fn "returns the size of a given texture image for a given level of detail. (only gp4 profiles) - (int3)(samplerBUF, int lod)",
+
+texRBUF = fn "performs a multi-sampled texture lookup in a renderbuffer. (only gp4 profiles) - (float4)(samplerRBUF, int2 s, int sample)",
+texRBUFsize = fn "returns the size of a given renderbuffer. (only gp4 profiles) - (int2)(samplerBUF)",
+
+texCUBE = fn "performs a texture lookup in a given CUBE sampler and, in some cases, a shadow comparison (float4 coord). May also use pre computed derivatives if those are provided. Texeloffset only in gp4 or higher profiles. - (float4)(samplerCUBE, float3/float4 s, |float3 dx, dy|)",
+texCUBEbias = fn "performs a texture lookup with bias in a given sampler (as .w). - (float4)(sampler1D, float4 s, [int texeloffset])",
+texCUBElod = fn "performs a texture lookup with a specified level of detail in a given sampler (lod as .w) - (float4)(sampler1D, float4 s, [int texeloffset])",
+texCUBEproj = fn "performs a texture lookup with projection in a given sampler. (proj in .w) - (float4)(samplerCUBE, float4 s)",
+texCUBEsize = fn "returns the size of a given texture image for a given level of detail. (only gp4 profiles) - (int3)(sampler1D, int lod)",
+
+texRECT = fn "performs a texture lookup in a given RECT sampler and, in some cases, a shadow comparison (as .z). May also use pre computed derivatives if those are provided. Texeloffset only in gp4 or higher profiles. - (float4)(samplerRECT, float2/float3 s, |float2 dx, dy|, [int texeloff])",
+texRECTbias = fn "performs a texture lookup with bias in a given sampler (as .w). - (float4)(samplerRECT, float4 s, [int texeloffset])",
+texRECTfetch = fn "performs an unfiltered texture lookup in a given sampler (lod as .w). - (float4)(samplerRECT, int4 s, [int texeloffset])",
+texRECTlod = fn "performs a texture lookup with a specified level of detail in a given sampler (lod as .w) - (float4)(samplerRECT, float4 s, [int texeloffset])",
+texRECTproj = fn "performs a texture lookup with projection in a given sampler. May perform a shadow comparison if argument for shadow comparison is provided. (shadow in .z for float3 coord, proj in .z or .w) - (float4)(samplerRECT, float3/float4 s, [int texeloff])",
+texRECTsize = fn "returns the size of a given texture image for a given level of detail. (only gp4 profiles) - (int3)(samplerRECT, int lod)",
+
+tex1DARRAY = fn "performs a texture lookup in a given 1D sampler array and, in some cases, a shadow comparison (as .z). May also use pre computed derivatives if those are provided. Texeloffset only in gp4 or higher profiles. - (float4)(sampler1DARRAY, float2/float3 s, {float dx, dy},[int texeloffset])",
+tex1DARRAYbias = fn "performs a texture lookup with bias in a given sampler (as .w). - (float4)(sampler1DARRAY, float4 s, [int texeloffset])",
+tex1DARRAYcmpbias = fn "performs a texture lookup with bias and shadow compare in a given sampler (layer as .y, compare as .z, bias as .w). - (float4)(sampler1DARRAY, float4 s, [int texeloffset])",
+tex1DARRAYcmplod = fn "performs a texture lookup with a specified level of detail and a shadow compare in a given sampler (compare as .z, lod as .w). - (float4)(sampler1DARRAY, float4 s, [int texeloffset])",
+tex1DARRAYfetch = fn "performs an unfiltered texture lookup in a given sampler (lod as .z). - (float4)(sampler1DARRAY, int3 s, [int texeloffset])",
+tex1DARRAYlod = fn "performs a texture lookup with a specified level of detail in a given sampler (lod as .z) - (float4)(sampler1DARRAY, float3 s, [int texeloffset])",
+tex1DARRAYproj = fn "performs a texture lookup with projection in a given sampler. May perform a shadow comparison if argument for shadow comparison is provided. (shadow in .z for float3 coord, proj in .z or .w) - (float4)(sampler1DARRAY, float3/float4 s, [int texeloff])",
+tex1DARRAYsize = fn "returns the size of a given texture image for a given level of detail. (only gp4 profiles) - (int3)(sampler1DARRAY, int lod)",
+
+tex2DARRAY = fn "performs a texture lookup in a given 2D sampler array and, in some cases, a shadow comparison (as .w coord). May also use pre computed derivatives if those are provided. Texeloffset only in gp4 or higher profiles. - (float4)(sampler2DARRAY, float3/float4 s, {float2 dx, dy},[int texeloffset])",
+tex2DARRAYbias = fn "performs a texture lookup with bias in a given sampler (as .w). - (float4)(sampler2DARRAY, float4 s, [int texeloffset])",
+tex2DARRAYfetch = fn "performs an unfiltered texture lookup in a given sampler (lod as .w). - (float4)(sampler2DARRAY, int4 s, [int texeloffset])",
+tex2DARRAYlod = fn "performs a texture lookup with a specified level of detail in a given sampler (lod as .w) - (float4)(sampler2DARRAY, float4 s, [int texeloffset])",
+tex2DARRAYproj = fn "performs a texture lookup with projection in a given sampler. May perform a shadow comparison if argument for shadow comparison is provided. (proj in .w) - (float4)(sampler2DARRAY, float4 s, [int texeloff])",
+tex2DARRAYsize = fn "returns the size of a given texture image for a given level of detail. (only gp4 profiles) - (int3)(sampler2DARRAY, int lod)",
+
+texCUBEARRAY = fn "performs a texture lookup in a given CUBE sampler array. May also use pre computed derivatives if those are provided. Texeloffset only in gp4 or higher profiles. - (float4)(samplerCUBEARRAY, float4 s, {float3 dx, dy},[int texeloffset])",
+texCUBEARRAYsize = fn "returns the size of a given texture image for a given level of detail. (only gp4 profiles) - (int3)(samplerCUBEARRAY, int lod)",
+
+unpack_4ubyte = fn "interprets the single float as 4 normalized unsigned bytes and returns the vector. (only nv/gp4 profiles) - (float4)(float)",
+pack_4ubyte = fn "packs the floats into a single storing as normalized unsigned bytes.(only nv/gp4 profiles) - (float)(float4)",
+unpack_4byte = fn "interprets the single float as 4 normalized signed bytes and returns the vector. (only nv/gp4 profiles) - (float4)(float)",
+pack_4ubyte = fn "packs the floats into a single storing as normalized signed bytes.(only nv/gp4 profiles) - (float)(float4)",
+unpack_4ushort = fn "interprets the single float as 2 normalized unsigned shorts and returns the vector. (only nv/gp4 profiles) - (float2)(float)",
+pack_4ushort = fn "packs the floats into a single storing as normalized unsigned shorts.(only nv/gp4 profiles) - (float)(float2)",
+unpack_2half = fn "interprets the single float as 2 16-bit floats and returns the vector. (only nv/gp4 profiles) - (float2)(float)",
+pack_2half = fn "packs the floats into a single storing as 16-bit floats.(only nv/gp4 profiles) - (float)(float2)",
+}
+
+local keyw =
+[[int half float float3 float4 float2 float3x3 float3x4 float4x3 float4x4
+float1x2 float2x1 float2x2 float2x3 float3x2 float1x3 float3x1 float4x1 float1x4
+float2x4 float4x2 double1x4 double4x4 double4x2 double4x3 double3x4 double2x4 double1x4
+double half half2 half3 half4 int2 int3 uint uint2 uint3 uint4
+int4 bool bool2 bool3 bool4 string struct typedef
+usampler usampler1D usampler2D usampler3D usamplerRECT usamplerCUBE isampler1DARRAY usampler2DARRAY usamplerCUBEARRAY
+isampler isampler1D isampler2D isampler3D isamplerRECT isamplerCUBE isampler1DARRAY isampler2DARRAY isamplerCUBEARRAY
+usamplerBUF isamplerBUF samplerBUF
+sampler sampler1D sampler2D sampler3D samplerRECT samplerCUBE sampler1DARRAY sampler2DARRAY samplerCUBEARRAY
+texture texture1D texture2D texture3D textureRECT textureCUBE texture1DARRAY texture2DARRAY textureCUBEARRAY
+
+decl do else extern false for if in inline inout out pass
+pixelshader return shared static string technique true
+uniform vector vertexshader void volatile while
+
+asm compile const auto break case catch char class const_cast continue default delete
+dynamic_cast enum explicit friend goto long mutable namespace new operator private protected
+public register reinterpret_case short signed sizeof static_cast switch template this throw
+try typename union unsigned using virtual
+
+POSITION PSIZE DIFFUSE SPECULAR TEXCOORD FOG COLOR COLOR0 COLOR1 COLOR2 COLOR3 TEXCOORD0 TEXCOORD1 TEXCOORD2 TEXCOORD3
+TEXCOORD4 TEXCOORD5 TEXCOORD6 TEXCOORD7 TEXCOORD8 TEXCOORD9 TEXCOORD10 TEXCOORD11 TEXCOORD12 TEXCOORD13 TEXCOORD14
+TEXCOORD15
+NORMAL WPOS
+ATTR0 ATTR1 ATTR2 ATTR3 ATTR4 ATTR5 ATTR6 ATTR7 ATTR8 ATTR9 ATTR10 ATTR11 ATTR12 ATTR13 ATTR14 ATTR15
+TEXUNIT0 TEXUNIT1 TEXUNIT2 TEXUNIT3 TEXUNIT4 TEXUNIT5 TEXUNIT6 TEXUNIT7 TEXUNIT8 TEXUNIT9 TEXUNIT10 TEXUNIT11 TEXUNIT12
+TEXUNIT13 TEXUNIT14 TEXUNIT15
+
+PROJ PROJECTION PROJECTIONMATRIX PROJMATRIX
+PROJMATRIXINV PROJINV PROJECTIONINV PROJINVERSE PROJECTIONINVERSE PROJINVMATRIX PROJECTIONINVMATRIX PROJINVERSEMATRIX PROJECTIONINVERSEMATRIX
+VIEW VIEWMATRIX VIEWMATRIXINV VIEWINV VIEWINVERSE VIEWINVERSEMATRIX VIEWINVMATRIX
+VIEWPROJECTION VIEWPROJ VIEWPROJMATRIX VIEWPROJECTIONMATRIX
+WORLD WORLDMATRIX WORLDVIEW WORLDVIEWMATRIX
+WORLDVIEWPROJ WORLDVIEWPROJECTION WORLDVIEWPROJMATRIX WORLDVIEWPROJECTIONMATRIX
+VIEWPORTSIZE VIEWPORTDIMENSION
+VIEWPORTSIZEINV VIEWPORTSIZEINVERSE VIEWPORTDIMENSIONINV VIEWPORTDIMENSIONINVERSE INVERSEVIEWPORTDIMENSIONS
+FOGCOLOR FOGDISTANCE CAMERAWORLDPOS CAMERAWORLDDIR
+
+CENTROID FLAT NOPERSPECTIVE FACE PRIMITIVEID VERTEXID
+
+]]
+
+-- keywords - shouldn't be left out
+for w in keyw:gmatch("([_%w]+)") do
+ api[w] = {type="keyword"}
+end
+
+return api
+
+
diff --git a/love2dToAPK/tools/tools/zbstudio-win/api/glsl/std.lua b/love2dToAPK/tools/tools/zbstudio-win/api/glsl/std.lua
new file mode 100644
index 0000000..300af6d
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/api/glsl/std.lua
@@ -0,0 +1,277 @@
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+-- function helpers
+
+local function fn (description)
+ local description2,returns,args = description:match("(.+)%-%s*(%b())%s*(%b())")
+ if not description2 then
+ return {type="function",description=description,
+ returns="(?)"}
+ end
+ return {type="function",description=description2,
+ returns=returns:gsub("^%s+",""):gsub("%s+$",""), args = args}
+end
+
+local function val (description)
+ return {type="value",description = description}
+end
+-- docs
+local api = {
+radians = fn "converts degrees to radians - (vecN)(vecN)",
+degrees = fn "converts radians to degrees - (vecN)(vecN)",
+sin = fn "returns sine of scalars and vectors. - (vecN)(vecN)",
+sinh = fn "returns hyperbolic sine of scalars and vectors. - (vecN)(vecN)",
+cos = fn "returns cosine of scalars and vectors. - (vecN)(vecN)",
+cosh = fn "returns hyperbolic cosine of scalars and vectors. - (vecN)(vecN)",
+atan = fn "returns arc tangent of scalars and vectors. - (vecN)([vecN y_over_x ]/[vecN y, vecN x])",
+asin = fn "returns arc sine of scalars and vectors. - (vecN)(vecN)",
+acos = fn "returns arc cosine of scalars and vectors. - (vecN)(vecN)",
+atan = fn "returns arc tangent of scalars and vectors. - (vecN)(vecN)",
+tan = fn "returns tangent of scalars and vectors. - (vecN)(vecN)",
+tanh = fn "returns hyperbolic tangent of scalars and vectors. - (vecN)(vecN)",
+acosh = fn "returns hyperbolic arc cosine of scalars and vectors. - (vecN)(vecN)",
+asinh = fn "returns hyperbolic arc sine of scalars and vectors. - (vecN)(vecN)",
+atanh = fn "returns hyperbolic arc tangent of scalars and vectors. - (vecN)(vecN)",
+
+exp = fn "returns the base-e exponential of scalars and vectors. - (vecN)(vecN)",
+exp2 = fn "returns the base-2 exponential of scalars and vectors. - (vecN)(vecN)",
+log = fn "returns the natural logarithm of scalars and vectors. - (vecN)(vecN)",
+log2 = fn "returns the base-2 logarithm of scalars and vectors. - (vecN)(vecN)",
+pow = fn "returns x to the y-th power of scalars and vectors. - (vecN)(vecN x, y)",
+sqrt = fn "returns square root of scalars and vectors. - (vecN)(vecN)",
+inversesqrt = fn "returns inverse square root of scalars and vectors. - (vecN)(vecN)",
+
+abs = fn "returns absolute value of scalars and vectors. - (vecN)(vecN)",
+sign = fn "returns sign (1 or -1) of scalar or each vector component. - (vecN)(vecN)",
+floor = fn "returns largest integer not greater than a scalar or each vector component. - (vecN)(vecN)",
+ceil = fn "returns smallest integer not less than a scalar or each vector component. - (vecN)(vecN)",
+trunc = fn "returns largest integer not greater than a scalar or each vector component. - (vecN)(vecN)",
+round = fn "returns the rounded value of scalars or vectors. - (vecN)(vecN a)",
+roundEven = fn "returns the nearest even integer value of scalars or vectors. - (vecN)(vecN a)",
+fract = fn "returns the fractional portion of a scalar or each vector component. - (vecN)(vecN)",
+mod = fn "modulus - (vecN)(vecN x, y)",
+modf = fn "separate integer and fractional parts. - (vecN)(vecN x, out vecN i)",
+max = fn "returns the maximum of two scalars or each respective component of two vectors. - (vecN)(vecN a, b)",
+min = fn "returns the minimum of two scalars or each respective component of two vectors. - (vecN)(vecN a, b)",
+mix = fn "returns linear interpolation of two scalars or vectors based on a weight. - (vecN)(vecN a, b, weight)",
+step = fn "implement a step function returning either zero or one (x >= edge). - (vecN)(vecN edge, x)",
+
+isinf = fn "test whether or not a scalar or each vector component is infinite. - (boolN)(vecN)",
+isnan = fn "test whether or not a scalar or each vector component is not-a-number. - (boolN)(vecN)",
+clamp = fn "returns x clamped to the range [a,b]. - (vecN)(vecN x, a, b)",
+smoothstep = fn "clip and smooth blend [a,b]. - (vecN)(vecN a, b, x)",
+floatBitsToInt = fn "returns the 32-bit integer representation of an IEEE 754 floating-point scalar or vector - (uintN/intN)(floatN)",
+intBitsToFloat = fn "returns the float value corresponding to a given bit represention.of a scalar int value or vector of int values. - (floatN)(intN)",
+uintBitsToFloat = fn "returns the float value corresponding to a given bit represention.of a scalar int value or vector of int values. - (floatN)(uintN)",
+doubleBitsToInt64 = fn "returns the 64-bit integer representation of an IEEE 754 double precision floating-point scalar or vector - (int64N)(doubleN)",
+doubleBitsToUint64 = fn "returns the 64-bit integer representation of an IEEE 754 double precision floating-point scalar or vector - (uint64N)(doubleN)",
+int64BitsToDouble = fn "returns the double value corresponding to a given bit represention.of a scalar int value or vector of int values. - (doubleN)(uint64N)",
+uint64BitsToDouble = fn "returns the double value corresponding to a given bit represention.of a scalar int value or vector of int values. - (doubleN)(uint64N)",
+
+fma = fn "return a*b + c, treated as single operation when using precise - (vecN a, vecN b, vecN c)",
+frexp = fn "splits scalars and vectors into normalized fraction [0.5,1.0) and a power of 2. - (vecN)(vecN x, out vecN e)",
+ldexp = fn "build floating point number from x and the corresponding integral exponen of 2 in exp. - (vecN)(vecN x, exp)",
+
+packUnorm2x16 = fn "Converts each comp. of v into 16-bit ints, packs results into the returned 32-bit uint. - (uint)(vec2 v)",
+packUnorm4x8 = fn "Converts each comp. of v into 8-bit ints, packs results into the returned 32-bit uint. - (uint)(vec4 v)",
+packSnorm4x8 = fn "Converts each comp. of v into 8-bit ints, packs results into the returned 32-bit uint. - (uint)(vec4 v)",
+packDouble2x32 = fn "Packs components of v into a 64-bit value and returns a double-prec value. - (double)(uvec2 v)",
+packHalf2x16 = fn "Converts each comp. of v into 16-bit half float, packs results into the returned 32-bit uint. - (uint)(vec2 v)",
+packInt2x32 = fn "Packs two 32 bit into one 64-bit value. - (int64_t)(ivec2)",
+packUint2x32 = fn "Packs two 32 bit into one 64-bit value. - (uint64_t)(uvec2)",
+packFloat2x16 = fn "returns an unsigned integer obtained by interpreting the components of a two-component 16-bit floating-point as integers and packing them into 32 bit. - (uint)(f16vec2 v)",
+
+unpackUnorm2x16 = fn "Unpacks 32-bit p into two 16-bit uints and converts them to normalized float. - (vec2)(uint p)",
+unpackUnorm4x8 = fn "Unpacks 32-bit p into four 8-bit uints and converts them to normalized float. - (vec4)(uint p)",
+unpackSnorm4x8 = fn "Unpacks 32-bit p into four 8-bit uints and converts them to normalized float. - (vec4)(uint p)",
+unpackDouble2x32 = fn "Returns a 2 component vector representation of v. - (uvec2)(double v)",
+unpackHalf2x16 = fn "Interprets p as two 16-bit half floats and returns them as vector. - (vec2)(uint p)",
+unpackInt2x32 = fn "Unpacks 64-bit into two 32-bit values. - (ivec2)(int64_t)",
+unpackUint2x32 = fn "Unpacks 64-bit into two 32-bit values. - (uvec2)(uint64_t)",
+unpackFloat2x16 = fn "returns a two-component vector with 16-bit floating-point components obtained by unpacking a 32-bit unsigned integer into a pair of 16-bit values. - (f16vec2)(uint)",
+
+
+length = fn "return scalar Euclidean length of a vector. - (type)(vecN)",
+distance = fn "return the Euclidean distance between two points. - (vecN)(vecN a, b)",
+dot = fn "returns the scalar dot product of two vectors. - (type)(vecN a, b)",
+cross = fn "returns the cross product of two three-component vectors. - (type3)(type3 a, b)",
+normalize = fn "Returns the normalized version of a vector, meaning a vector in the same direction as the original vector but with a Euclidean length of one. - (vecN)(vecN)",
+reflect = fn "returns the reflectiton vector given an incidence vector and a normal vector. - (vecN)(vecN incidence, normal)",
+refract = fn "computes a refraction vector. - (vecN)(vecN incidence, normal, type eta)",
+faceforward = fn "returns a normal as-is if a vertex's eye-space position vector points in the opposite direction of a geometric normal, otherwise return the negated version of the normal. - (vecN)(vecN Nperturbated, Incident, Ngeometric)",
+
+determinant = fn "returns the scalar determinant of a square matrix. - (float)(matN)",
+transpose = fn "returns transpose matrix of a matrix. - (matNxM)(matMxN)",
+inverse = fn "returns inverse matrix of a matrix. - (matN)(mat)",
+matrixCompMult = fn "component-wise multiply. - (mat)(mat a, b)",
+outerProduct = fn "outer product. - (matNxM)(vecM c, vecN r)",
+
+all = fn "returns true if a boolean scalar or all components of a boolean vector are true. - (bool)(boolN)",
+any = fn "returns true if a boolean scalar or any component of a boolean vector is true. - (bool)(boolN)",
+["not"] = fn "returns logical complement. - (boolN)(boolN)",
+lessThan = fn "returns retusult of component-wise comparison. - (boolN)(vecN a,b)",
+lessThanEqual = fn "returns retusult of component-wise comparison. - (boolN)(vecN a,b)",
+greaterThan = fn "returns retusult of component-wise comparison. - (boolN)(vecN a,b)",
+greaterThanEqual = fn "returns retusult of component-wise comparison. - (boolN)(vecN a,b)",
+equal = fn "returns retusult of component-wise comparison. - (boolN)(vecN a,b)",
+notEqual = fn "returns retusult of component-wise comparison. - (boolN)(vecN a,b)",
+
+uaddCarry = fn "Adds 32-bit uintx and y, returning the sum modulo 2^32. - (uintN)(uintN x, y, out carry)",
+usubBorrow = fn "Subtracts y from x, returning the difference if non-negative otherwise 2^32 plus the difference. - (uint)(uint x, y, out borrow)",
+umulExtended = fn "Multiplies 32-bit integers x and y producing 64-bit result. (uintN)(uintN x, y, out msb, out lsb)",
+imulExtended = fn "Multiplies 32-bit integers x and y producing 64-bit result. (intN)(intN x, y, out msb, out lsb)",
+bitfieldExtract = fn "Extracts bits (offset, offset + bits -1) from value and returns them in lsb of result. - (intN)(intN value, int offset, int bits)",
+bitfieldInsert = fn "Returns the insertion the bits lsb of insert into base. - (intN)(intN base insert, int offset, int bits)",
+bitfieldReverse = fn "Returns the reversal of the bits. - (intN)(intN)",
+bitCount = fn "returns the number of bits set to 1. - (intN)(intN)",
+findLSB = fn "returns bit number of lsb. - (intN)(intN)",
+findMSB = fn "returns bit number of msb. - (intN)(intN)",
+
+discard = fn "conditionally (<0) kill a pixel before output. - ()(vecN)",
+dFdx = fn "returns approximate partial derivative with respect to window-space X. - (vecN)(vecN)",
+dFdxCoarse = fn "returns approximate partial derivative with respect to window-space X. - (vecN)(vecN)",
+dFdxFine = fn "returns approximate partial derivative with respect to window-space X. - (vecN)(vecN)",
+dFdy = fn "returns approximate partial derivative with respect to window-space Y. - (vecN)(vecN)",
+dFdyCoarse = fn "returns approximate partial derivative with respect to window-space Y. - (vecN)(vecN)",
+dFdyFine = fn "returns approximate partial derivative with respect to window-space Y. - (vecN)(vecN)",
+fwidth = fn "returns abs sum of approximate window-space partial derivatives magnitudes. - (vecN)(vecN)",
+fwidthFine = fn "returns abs sum of approximate window-space partial derivatives magnitudes. - (vecN)(vecN)",
+fwidthCoarse = fn "returns abs sum of approximate window-space partial derivatives magnitudes. - (vecN)(vecN)",
+interpolateAtCentroid = fn "Return value of interpolant sampled inside pixel and the primitive. - (floatN)(floatN)",
+interpolateAtSample = fn "Return value of interpolant at the location fo sample. - (floatN)(floatN, int sample)",
+interpolateAtOffset = fn "Return value of interpolant sampled at fixed offset offset from pixel center. - (floatN)(floatN, vec2 offset)",
+
+noise1 = fn "returns noise value. - (float)(float)",
+noise2 = fn "returns noise value. - (vec2)(float)",
+noise3 = fn "returns noise value. - (vec3)(float)",
+noise4 = fn "returns noise value. - (vec4)(float)",
+
+EmitStreamVertex = fn "Emits values of the output variables of the current output primitive stream. - ()(int stream)",
+EndStreamPrimitive = fn "Completes current output primitive stream and starts a new one. - ()(int stream)",
+EmitVertex= fn "Emits values of the output variable of the current output primitive. - ()()",
+EndPrimitive = fn "Completes current output primitive and starts a new one. - ()()",
+barrier = fn "Synchronizes across shader invocations. - ()()",
+
+memoryBarrier = fn "control ordering of memory transactions issued by shader thread. - ()()",
+memoryBarrierAtomicCounter = fn "control ordering of memory transactions issued by shader thread. - ()()",
+memoryBarrierShared = fn "control ordering of memory transactions issued by shader thread. - ()()",
+memoryBarrierBuffer = fn "control ordering of memory transactions issued by shader thread. - ()()",
+memoryBarrierImage = fn "control ordering of memory transactions issued by shader thread. - ()()",
+groupMemoryBarrier = fn "control ordering of memory transactions issued by shader thread. - ()()",
+imageAtomicAdd = fn "performs atomic operation on individual texels returns old value. - (uint)(imageN, intN coord, [int sample], uint data)",
+imageAtomicMin = fn "performs atomic operation on individual texels returns old value. - (uint)(imageN, intN coord, [int sample], uint data)",
+imageAtomicMax = fn "performs atomic operation on individual texels returns old value. - (uint)(imageN, intN coord, [int sample], uint data)",
+imageAtomicIncWrap = fn "performs atomic operation on individual texels returns old value. - (uint)(imageN, intN coord, [int sample], uint data)",
+imageAtomicDecWrap = fn "performs atomic operation on individual texels returns old value. - (uint)(imageN, intN coord, [int sample], uint data)",
+imageAtomicAnd = fn "performs atomic operation on individual texels returns old value. - (uint)(imageN, intN coord, [int sample], uint data)",
+imageAtomicOr = fn "performs atomic operation on individual texels returns old value. - (uint)(imageN, intN coord, [int sample], uint data)",
+imageAtomicXor = fn "performs atomic operation on individual texels returns old value. - (uint)(imageN, intN coord, [int sample], uint data)",
+imageAtomicExchange = fn "performs atomic operation on individual texels returns old value. - (uint)(imageN, intN coord, [int sample], uint data)",
+imageAtomicCompSwap = fn "performs atomic operation on individual texels returns old value. - (uint)(imageN, intN coord, [int sample], uint data)",
+imageStore = fn "stores the texel at the coordinate. - ()(imageN, intN coord, [int sample], vecN data)",
+imageLoad = fn "loads the texel at the coordinate. - (vecN)(imageN, intN coord, [int sample])",
+imageSize = fn "returns the size of the image. - (ivecN)(imageN)",
+imageSamples = fn "returns the samples of the multi-sampled image. - (int)(image2DMSN)",
+
+atomicCounterIncrement = fn "increments counter and returns old value. - (uint)(atomic_uint)",
+atomicCounterDecrement = fn "decrements counter and returns old value. - (uint)(atomic_uint)",
+atomicCounter = fn "returns current counter value. - (uint)(atomic_uint)",
+atomicMin = fn "performs atomic operation on memory location (ssbo/shared) returns old value. - (uint)(inout uint mem, uint data)",
+atomicMax = fn "performs atomic operation on memory location (ssbo/shared) returns old value. - (uint)(inout uint mem, uint data)",
+atomicAdd = fn "performs atomic operation on memory location (ssbo/shared) returns old value. - (uint)(inout uint mem, uint data)",
+atomicAnd = fn "performs atomic operation on memory location (ssbo/shared) returns old value. - (uint)(inout uint mem, uint data)",
+atomicOr = fn "performs atomic operation on memory location (ssbo/shared) returns old value. - (uint)(inout uint mem, uint data)",
+atomicXor = fn "performs atomic operation on memory location (ssbo/shared) returns old value. - (uint)(inout uint mem, uint data)",
+atomicExchange = fn "performs atomic operation on memory location (ssbo/shared) returns old value. - (uint)(inout uint mem, uint data)",
+atomicCompSwap = fn "performs atomic operation on memory location (ssbo/shared) returns old value. - (uint)(inout uint mem, uint data)",
+
+textureSize = fn "returns the size of the texture (no lod required: Rect, MS and Buffer). - (intN)(samplerN, [int lod])",
+textureSamples = fn "returns the samples of the multi-sampled texture. - (int)(texture2DMSN)",
+textureQueryLod = fn "returns the lod values for a given coordinate. - (vec2)(samplerN, vecN coord)",
+texture = fn "performs a texture lookup. Shadow samplers require base N+1 coordinate. Lod bias is optional (illegal for MS, Buffer, Rect). - (vec4)(samplerN, vecN coord, [float bias])",
+textureProj = fn "performas a projective texture lookup (only Nd samplers + Rect). Shadows require N+1 base coordinate, no Lod bias allowed for Rect. - (vec4)(samplerN, vecN+1 coord, [float bias])",
+textureLod = fn "performs a lookup with explicit LOD. Shadows require N+1 base coordinate. Illegal function for Rect, MS, Buffer. - (vec4)(samplerN, vecN coord, float lod)",
+textureOffset = fn "offset added before texture lookup. Illegal for MS, Buffer, Cube. - (vec4)(samplerN, vecN coord, intN offset, [float bias])",
+textureProjOffset = fn "projective texture lookup with offset. Illegal for MS, Buffer, Cube, Array. - (vec4)(samplerN, vecN+1 coord, intN offset, [float bias])",
+textureLodOffset = fn "offset added with explicit LOD. - (vec4)(samplerN, vecN coord, intN offset, int lod)",
+textureProjLodOffset = fn "projective lookup with offset and explicit LOD. - (vec4)(samplerN, vecN+1 coord, intN offset, int lod)",
+textureGrad = fn "lookup with explicit gradients. Illegal for MS, Buffer. - (vec4)(samplerN, vecN coord, gradX, gradY)",
+textureGradOffset = fn "lookup with explicit gradients and offset. Illegal for MS, Buffer, Cube. - (vec4)(samplerN, vecN coord, gradX, gradY, intN offset)",
+textureProjGradOffset = fn "projective lookup with expicit gradients and offset. Illegal for MS, Buffer, Cube. - (vec4)(samplerN, vecN+1 coord, vecN gradX, gradY, intN offset)",
+textureGather = fn "gather lookup (pixel quad of 4 single channel samples at once). Component 0: x, 1: y ... is ignored for shadow samplers instead reference value must be passed. Only 2D/Cube. Illegal for MS. - (vec4)(samplerN, vecN coord, [int comp] / float shadowRefZ)",
+textureGatherOffset = fn "gather lookup (pixel quad of 4 single channel samples at once) with offset. Component 0: x, 1: y ... is ignored for shadow samplers instead reference value must be passed. Only 2D/Cube. Illegal for MS. - (vec4)(samplerN, vecN coord, [float shadowRefZ], intN offset / intN offset[4] , [int comp])",
+texelFetch = fn "integer coordinate lookup for a single texel. No lod parameter for Buffer, MS, Rect. Illegal for Cube - (vec4)(samplerN, intN coord, [int lod/sample])",
+texelFetchOffset = fn "integer coordinate lookup for a single texel with offset. No lod parameter for Buffer, MS, Rect. Illegal for Cube, Buffer, MS. - (vec4)(samplerN, intN coord, [int lod/sample], intN offset)",
+
+anyInvocationARB = fn "returns true if and only if <value> is true for at least one active invocation in the group. - (bool)(bool value)",
+allInvocationsARB = fn "returns true if and only if <value> is true for all active invocations in the group - (bool)(bool value)",
+allInvocationsEqualARB = fn "returns true if <value> is the same for all active invocation in the group. - (bool)(bool value)",
+}
+
+local keyw =
+[[ int uint half float bool double atomic_uint binding offset
+ vec2 vec3 vec4 dvec2 dvec3 dvec4
+ ivec2 ivec3 ivec4 uvec2 uvec3 uvec4 bvec2 bvec3 bvec4
+ mat2 mat3 mat4 mat2x2 mat3x3 mat4x4 mat2x3 mat3x2 mat4x2 mat2x4 mat4x3 mat3x4
+ dmat2 dmat3 dmat4 dmat2x2 dmat3x3 dmat4x4 dmat2x3 dmat3x2 dmat4x2 dmat2x4 dmat4x3 dmat3x4
+ float16_t f16vec2 f16vec3 f16vec4
+ float32_t f32vec2 f32vec3 f32vec4
+ float64_t f64vec2 f64vec3 f64vec4
+ int8_t i8vec2 i8vec3 i8vec4
+ int8_t i8vec2 i8vec3 i8vec4
+ int16_t i16vec2 i16vec3 i16vec4
+ int32_t i32vec2 i32vec3 i32vec4
+ int64_t i64vec2 i64vec3 i64vec4
+ uint8_t u8vec2 u8vec3 u8vec4
+ uint16_t u16vec2 u16vec3 u16vec4
+ uint32_t u32vec2 u32vec3 u32vec4
+ uint64_t u64vec2 u64vec3 u64vec4
+ struct typedef void
+ usampler1D usampler2D usampler3D usampler2DRect usamplerCube isampler1DArray usampler2DARRAY usamplerCubeArray usampler2DMS usampler2DMSArray
+ isampler1D isampler2D isampler3D isampler2DRect isamplerCube isampler1DArray isampler2DARRAY isamplerCubeArray isampler2DMS isampler2DMSArray
+ sampler1D sampler2D sampler3D sampler2DRect samplerCube sampler1DArray sampler2DArray samplerCubeArray sampler2DMS sampler2DMSArray
+ sampler1DShadow sampler2DShadow sampler2DRectShadow sampler1DArrayShadow sampler2DArrayShadow samplerCubeArrayShadow
+ usamplerBuffer isamplerBuffer samplerBuffer samplerRenderbuffer isamplerRenderbuffer usamplerRenderbuffer
+ in out inout uniform const centroid sample attribute varying patch index true false
+ return switch case for do while if else break continue main inline
+ layout location vertices line_strip triangle_strip max_vertices stream
+ triangles quads equal_spacing isolines fractional_even_spacing lines points
+ fractional_odd_spacing cw ccw point_mode lines_adjacency triangles_adjacency
+ invocations offset align xfb_offset xfb_buffer
+ origin_upper_left pixel_center_integer depth_greater depth_greater depth_greater depth_unchanged
+ smooth flat noperspective highp mediump lowp shared packed std140 std430 row_major column_major buffer
+ gl_FrontColor gl_BackColor gl_FrontSecondaryColor gl_BackSecondaryColor gl_Color gl_SecondaryColor
+ subroutine gl_Position gl_FragCoord
+ gl_VertexID gl_InstanceID gl_Normal gl_Vertex gl_MultiTexCoord0 gl_MultiTexCoord1
+ gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6
+ gl_MultiTexCoord7 gl_FogCoord gl_PointSize gl_ClipDistance
+ gl_TexCoord gl_FogFragCoord gl_ClipVertex gl_in
+ gl_PatchVerticesIn
+ gl_PrimitiveID gl_InvocationID gl_TessLevelOuter gl_TessLevelInner gl_TessCoord
+ gl_InvocationID gl_PrimitiveIDIn gl_Layer gl_ViewportIndex gl_FrontFacing
+ gl_PointCoord gl_SampleID gl_SamplePosition gl_FragColor
+ gl_FragData gl_FragDepth gl_SampleMask
+ gl_NumWorkGroups gl_WorkGroupSize gl_WorkGroupID gl_LocalInvocationID gl_GlobalInvocationID gl_LocalInvocationIndex
+ local_size_x local_size_y local_size_z
+ gl_BaseVertexARB gl_BaseInstanceARB gl_DrawIDARB
+ bindless_sampler bound_sampler bindless_image bound_image early_fragment_tests
+ gl_HelperInvocation gl_CullDistance gl_MaxSamples
+
+ coherent volatile restrict readonly writeonly
+ image1D image2D image3D image2DRect imageCube imageBuffer image1DArray image2DArray imageCubeArray image2DMS image2DMSArray
+ uimage1D uimage2D uimage3D uimage2DRect uimageCube uimageBuffer uimage1DArray uimage2DArray uimageCubeArray uimage2DMS uimage2DMSArray
+ iimage1D iimage2D iimage3D iimage2DRect iimageCube iimageBuffer iimage1DArray iimage2DArray iimageCubeArray iimage2DMS iimage2DMSArray
+ size1x8 size1x16 size1x32 size2x32 size4x32 rgba32f rgba16f rg32f rg16f r32f r16f rgba8 rgba16 r11f_g11f_b10f rgb10_a2ui
+ rgb10_a2i rg16 rg8 r16 r8 rgba32i rgba16i rgba8i rg32i rg16i rg8i r32i r16i r8i rgba32ui rgba16ui rgba8ui rg32ui rg16ui rg8ui
+ r32ui r16ui r8ui rgba16_snorm rgba8_snorm rg16_snorm rg8_snorm r16_snorm r8_snorm
+]]
+
+-- keywords - shouldn't be left out
+for w in keyw:gmatch("([a-zA-Z_0-9]+)") do
+ api[w] = {type="keyword"}
+end
+
+return api
+
+
diff --git a/love2dToAPK/tools/tools/zbstudio-win/api/lua/baselib.lua b/love2dToAPK/tools/tools/zbstudio-win/api/lua/baselib.lua
new file mode 100644
index 0000000..45a2fba
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/api/lua/baselib.lua
@@ -0,0 +1,1238 @@
+return {
+ -- covers Lua 5.1, Lua 5.2, and Lua 5.3;
+ -- Lua 5.2 and Lua 5.3 specific items are marked with
+ -- FUNCTION/ARGUMENT/ARGS/VALUE ADDED/DEPRECATED IN Lua 5.2 or Lua 5.3.
+
+ -- Keywords
+ ["and"] = {type = "keyword"},
+ ["break"] = {type = "keyword"},
+ ["do"] = {type = "keyword"},
+ ["else"] = {type = "keyword"},
+ ["elseif"] = {type = "keyword"},
+ ["end"] = {type = "keyword"},
+ ["for"] = {type = "keyword"},
+ ["function"] = {type = "keyword"},
+ ["goto"] = {type = "keyword"},
+ ["if"] = {type = "keyword"},
+ ["in"] = {type = "keyword"},
+ ["local"] = {type = "keyword"},
+ ["not"] = {type = "keyword"},
+ ["or"] = {type = "keyword"},
+ ["repeat"] = {type = "keyword"},
+ ["return"] = {type = "keyword"},
+ ["then"] = {type = "keyword"},
+ ["until"] = {type = "keyword"},
+ ["while"] = {type = "keyword"},
+
+ -- Boolean values
+ ["false"] = {type = "value"},
+ ["nil"] = {type = "value"},
+ ["true"] = {type = "value"},
+
+ -- Basic library
+ _ENV = {
+ type = "value",
+ description = "VALUE ADDED IN Lua 5.2.",
+ },
+ _G = {
+ type = "value",
+ description = "A global variable (not a function) that holds the global environment.\nLua itself does not use this variable; changing its value does not affect any environment, nor vice-versa.",
+ },
+ _VERSION = {
+ type = "value",
+ description = "A global variable (not a function) that holds a string containing the current interpreter version.",
+ },
+ assert = {
+ type = "function",
+ description = "Issues an error when the value of its argument v is false (i.e., nil or false); otherwise, returns all its arguments.\nmessage is an error message; when absent, it defaults to \"assertion failed!\"",
+ args = "(v: any [, message: string])",
+ returns = "(...)",
+ },
+ collectgarbage = {
+ type = "function",
+ description = "This function is a generic interface to the garbage collector.\nIt performs different functions according to its first argument, opt:\n* \"collect\": performs a full garbage-collection cycle. This is the default option.\n* \"stop\": stops automatic execution of the garbage collector. The collector will run only when explicitly invoked, until a call to restart it.\n* \"restart\": restarts automatic execution of the garbage collector.\n* \"count\": returns the total memory in use by Lua (in Kbytes) and a second value with the total memory in bytes modulo 1024 (SECOND RETURN ADDED IN Lua 5.2). The first value has a fractional part, so the following equality is always true:\nk, b = collectgarbage(\"count\")\nassert(k*1024 == math.floor(k)*1024 + b)\n(The second result is useful when Lua is compiled with a non floating-point type for numbers.)\n* \"step\": performs a garbage-collection step. The step \"size\" is controlled by arg (larger values mean more steps) in a non-specified way. If you want to control the step size you must experimentally tune the value of arg. Returns true if the step finished a collection cycle.\n* \"setpause\": sets arg as the new value for the pause of the collector. Returns the previous value for pause.\n* \"setstepmul\": sets arg as the new value for the step multiplier of the collector. Returns the previous value for step.\n* \"isrunning\": returns a boolean that tells whether the collector is running (i.e., not stopped). VALUE ADDED IN Lua 5.2.\n* \"generational\": changes the collector to generational mode. This is an experimental feature. VALUE ADDED IN Lua 5.2.\n* \"incremental\": changes the collector to incremental mode. This is the default mode. VALUE ADDED IN Lua 5.2.",
+ args = "([opt: string [, arg: number]])",
+ returns = "(...)",
+ },
+ dofile = {
+ type = "function",
+ description = "Opens the named file and executes its contents as a Lua chunk.\nWhen called without arguments, dofile executes the contents of the standard input (stdin). Returns all values returned by the chunk. In case of errors, dofile propagates the error to its caller (that is, dofile does not run in protected mode).",
+ args = "([filename: string])",
+ returns = "(...)",
+ },
+ error = {
+ type = "function",
+ description = "Terminates the last protected function called and returns message as the error message.\nFunction error never returns.\nUsually, error adds some information about the error position at the beginning of the message, if the message is a string. The level argument specifies how to get the error position. With level 1 (the default), the error position is where the error function was called. Level 2 points the error to where the function that called error was called; and so on. Passing a level 0 avoids the addition of error position information to the message.",
+ args = "(message: string [, level: number])",
+ returns = "()",
+ },
+ getfenv = {
+ type = "function",
+ description = "Returns the current environment in use by the function.\n\nf can be a Lua function or a number that specifies the function at that stack level: Level 1 is the function calling getfenv. If the given function is not a Lua function, or if f is 0, getfenv returns the global environment. The default for f is 1.\n\nFUNCTION DEPRECATED IN Lua 5.2.",
+ args = "([f: function|number])",
+ returns = "(table)",
+ },
+ getmetatable = {
+ type = "function",
+ description = "If object does not have a metatable, returns nil. Otherwise, if the object's metatable has a \"__metatable\" field, returns the associated value. Otherwise, returns the metatable of the given object.",
+ args = "(object: any)",
+ returns = "(table|nil)",
+ valuetype = "m",
+ },
+ ipairs = {
+ type = "function",
+ description = "If t has a metamethod __ipairs, calls it with t as argument and returns the first three results from the call. METAMETHOD BEHAVIOR ADDED IN Lua 5.2.\nOtherwise, returns three values: an iterator function, the table t, and 0, so that the construction\nfor i,v in ipairs(t) do body end\nwill iterate over the pairs (1,t[1]), (2,t[2]), ..., up to the first integer key absent from the table.",
+ args = "(t: table)",
+ returns = "(function, table, number)",
+ },
+ load = {
+ type = "function",
+ description = "Loads a chunk.\nIf ld is a string, the chunk is this string. If ld is a function, load calls it repeatedly to get the chunk pieces. Each call to ld must return a string that concatenates with previous results. A return of an empty string, nil, or no value signals the end of the chunk.\nIf there are no syntactic errors, returns the compiled chunk as a function; otherwise, returns nil plus the error message.\nIf the resulting function has upvalues, the first upvalue is set to the value of the global environment or to env, if that parameter is given. When loading main chunks, the first upvalue will be the _ENV variable. ARGUMENT ADDED IN Lua 5.2.\nsource is used as the source of the chunk for error messages and debug information. When absent, it defaults to ld, if ld is a string, or to \"=(load)\" otherwise.\nThe string mode controls whether the chunk can be text or binary (that is, a precompiled chunk). It may be the string \"b\" (only binary chunks), \"t\" (only text chunks), or \"bt\" (both binary and text). The default is \"bt\". ARGUMENT ADDED IN Lua 5.2.",
+ args = "(ld: string|function [, source: string [, mode: string [, env: table]]])",
+ returns = "(function|nil [, string])",
+ },
+ loadfile = {
+ type = "function",
+ description = "Loads a chunk from file filename or from the standard input, if no file name is given.\nIf there are no syntactic errors, returns the compiled chunk as a function; otherwise, returns nil plus the error message.\nIf the resulting function has upvalues, the first upvalue is set to the value of the global environment or to env, if that parameter is given. ARGUMENT ADDED IN Lua 5.2. When loading main chunks, the first upvalue will be the _ENV variable.\nThe string mode controls whether the chunk can be text or binary (that is, a precompiled chunk). It may be the string \"b\" (only binary chunks), \"t\" (only text chunks), or \"bt\" (both binary and text). The default is \"bt\". ARGUMENT ADDED IN Lua 5.2.",
+ args = "([filename: string [, mode: string [, env: table]]])",
+ returns = "(function|nil [, string])",
+ },
+ loadstring = {
+ type = "function",
+ description = "Loads a chunk from the given string.\nIf there are no errors, returns the compiled chunk as a function; otherwise, returns nil plus the error message. The environment of the returned function is the global environment.\nTo load and run a given string, use the idiom\nassert(loadstring(s))()\nWhen absent, chunkname defaults to the given string.\nFUNCTION DEPRECATED IN Lua 5.2.",
+ args = "(string: string [, chunkname: string])",
+ returns = "(function|nil [, string])",
+ },
+ next = {
+ type = "function",
+ description = "Allows a program to traverse all fields of a table.\nIts first argument is a table and its second argument is an index in this table. next returns the next index of the table and its associated value. When called with nil as its second argument, next returns an initial index and its associated value. When called with the last index, or with nil in an empty table, next returns nil. If the second argument is absent, then it is interpreted as nil. In particular, you can use next(t) to check whether a table is empty.\nThe order in which the indices are enumerated is not specified, even for numeric indices. (To traverse a table in numeric order, use a numerical for.)\nThe behavior of next is undefined if, during the traversal, you assign any value to a non-existent field in the table. You may however modify existing fields. In particular, you may clear existing fields.",
+ args = "(table: table [, index: any])",
+ returns = "(any [, any])",
+ },
+ pairs = {
+ type = "function",
+ description = "If t has a metamethod __pairs, calls it with t as argument and returns the first three results from the call. METAMETHOD BEHAVIOR ADDED IN Lua 5.2.\nOtherwise, returns three values: the next function, the table t, and nil, so that the construction\nfor k,v in pairs(t) do body end\nwill iterate over all key–value pairs of table t.\nSee function next for the caveats of modifying the table during its traversal.",
+ args = "(t: table)",
+ returns = "(function, table, nil)",
+ },
+ pcall = {
+ type = "function",
+ description = "Calls function f with the given arguments in protected mode.\nThis means that any error inside f is not propagated; instead, pcall catches the error and returns a status code. Its first result is the status code (a boolean), which is true if the call succeeds without errors. In such case, pcall also returns all results from the call, after this first result. In case of any error, pcall returns false plus the error message.",
+ args = "(f: function [, arg1: any, ...])",
+ returns = "(boolean, ...)",
+ },
+ print = {
+ type = "function",
+ description = "Receives any number of arguments and prints their values to stdout, using the tostring function to convert each argument to a string.\nprint is not intended for formatted output, but only as a quick way to show a value, for instance for debugging. For complete control over the output, use string.format and io.write.",
+ args = "(...)",
+ returns = "()",
+ },
+ rawequal = {
+ type = "function",
+ description = "Checks whether v1 is equal to v2, without invoking any metamethod.\nReturns a boolean.",
+ args = "(v1: any, v2: any)",
+ returns = "(boolean)",
+ },
+ rawget = {
+ type = "function",
+ description = "Gets the real value of table[index], without invoking any metamethod.\ntable must be a table; index may be any value.",
+ args = "(table: table, index: any)",
+ returns = "(any)",
+ },
+ rawlen = {
+ type = "function",
+ description = "Returns the length of the object v, which must be a table or a string, without invoking any metamethod.\nReturns an integer number.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(v: table|string)",
+ returns = "(number)",
+ },
+ rawset = {
+ type = "function",
+ description = "Sets the real value of table[index] to value, without invoking any metamethod.\ntable must be a table, index any value different from nil and NaN, and value any Lua value.\nThis function returns table.",
+ args = "(table: table, index: any, value: any)",
+ returns = "(table)",
+ },
+ select = {
+ type = "function",
+ description = "If index is a number, returns all arguments after argument number index.\nA negative number indexes from the end (-1 is the last argument). NEGATIVE VALUE ADDED IN Lua 5.2.\nOtherwise, index must be the string \"#\", and select returns the total number of extra arguments it received.",
+ args = "(index: number|string, ...)",
+ returns = "(...)",
+ },
+ setfenv = {
+ type = "function",
+ description = "Sets the environment to be used by the given function.\nf can be a Lua function or a number that specifies the function at that stack level: Level 1 is the function calling setfenv. setfenv returns the given function.\nAs a special case, when f is 0 setfenv changes the environment of the running thread. In this case, setfenv returns no values.\nFUNCTION DEPRECATED IN Lua 5.2.",
+ args = "(f: function|number, table: table)",
+ returns = "([function])",
+ },
+ setmetatable = {
+ type = "function",
+ description = "Sets the metatable for the given table.\n(You cannot change the metatable of other types from Lua, only from C.)\nIf metatable is nil, removes the metatable of the given table. If the original metatable has a \"__metatable\" field, raises an error.\nThis function returns table.",
+ args = "(table: table, metatable: table|nil)",
+ returns = "(table)",
+ valuetype = "m",
+ },
+ tonumber = {
+ type = "function",
+ description = "When called with no base, tonumber tries to convert its argument to a number. If the argument is already a number or a string convertible to a number, then tonumber returns this number; otherwise, it returns nil.\nWhen called with base, then e should be a string to be interpreted as an integer numeral in that base. The base may be any integer between 2 and 36, inclusive. In bases above 10, the letter 'A' (in either upper or lower case) represents 10, 'B' represents 11, and so forth, with 'Z' representing 35. If the string e is not a valid numeral in the given base, the function returns nil.",
+ args = "(e: any [, base: number])",
+ returns = "(number|nil)",
+ },
+ tostring = {
+ type = "function",
+ description = "Receives a value of any type and converts it to a string in a reasonable format.\n(For complete control of how numbers are converted, use string.format.)\nIf the metatable of v has a \"__tostring\" field, then tostring calls the corresponding value with v as argument, and uses the result of the call as its result.",
+ args = "(v: any)",
+ returns = "(string)",
+ valuetype = "string",
+ },
+ type = {
+ type = "function",
+ description = "Returns the type of its only argument, coded as a string.\nThe possible results of this function are \"nil\" (a string, not the value nil), \"number\", \"string\", \"boolean\", \"table\", \"function\", \"thread\", and \"userdata\".",
+ args = "(v: any)",
+ returns = "(string)",
+ },
+ unpack = {
+ type = "function",
+ description = "Returns the elements from the given table.\nThis function is equivalent to\nreturn list[i], list[i+1], ···, list[j]\nexcept that the above code can be written only for a fixed number of elements. By default, i is 1 and j is the length of the list, as defined by the length operator.\nFUNCTION DEPRECATED IN Lua 5.2.",
+ args = "(list: table [, i: number [, j: number]])",
+ returns = "(...)",
+ },
+ xpcall = {
+ type = "function",
+ description = "Calls function f with the given arguments in protected mode, using msgh as a message handler.\nThis means that any error inside f is not propagated; instead, xpcall catches the error, calls the msgh function with the original error object, and returns a status code. Its first result is the status code (a boolean), which is true if the call succeeds without errors. In such case, xpcall also returns all results from the call, after this first result. In case of any error, xpcall returns false plus the result from msgh.\nADDITIONAL ARGS ADDED IN Lua 5.2.",
+ args = "(f: function, msgh: function [, arg1: any, ...])",
+ returns = "(boolean, ...)",
+ },
+
+ -- Coroutine library
+ coroutine = {
+ type = "lib",
+ description = "The operations related to coroutines comprise a sub-library of the basic library and come inside the table coroutine.\nLua supports coroutines, also called collaborative multithreading. A coroutine in Lua represents an independent thread of execution. Unlike threads in multithread systems, however, a coroutine only suspends its execution by explicitly calling a yield function.",
+ childs = {
+ create = {
+ type = "function",
+ description = "Creates a new coroutine, with body f.\nf must be a Lua function. Returns this new coroutine, an object with type \"thread\".",
+ args = "(f: function)",
+ returns = "(thread)",
+ },
+ resume = {
+ type = "function",
+ description = "Starts or continues the execution of coroutine co.\nThe first time you resume a coroutine, it starts running its body. The values val1, ... are passed as the arguments to the body function. If the coroutine has yielded, resume restarts it; the values val1, ... are passed as the results from the yield.\nIf the coroutine runs without any errors, resume returns true plus any values passed to yield (if the coroutine yields) or any values returned by the body function (if the coroutine terminates). If there is any error, resume returns false plus the error message.",
+ args = "(co: thread [, val1: any, ...])",
+ returns = "(boolean, ...)",
+ },
+ running = {
+ type = "function",
+ description = "Returns the running coroutine plus a boolean, true when the running coroutine is the main one.\nBOOLEAN RETURN ADDED IN Lua 5.2.",
+ args = "()",
+ returns = "(thread, boolean)",
+ },
+ status = {
+ type = "function",
+ description = "Returns the status of coroutine co, as a string.\nThe status can be one of the following: \"running\", if the coroutine is running (that is, it called status); \"suspended\", if the coroutine is suspended in a call to yield, or if it has not started running yet; \"normal\" if the coroutine is active but not running (that is, it has resumed another coroutine); and \"dead\" if the coroutine has finished its body function, or if it has stopped with an error.",
+ args = "(co: thread)",
+ returns = "(string)",
+ },
+ wrap = {
+ type = "function",
+ description = "Creates a new coroutine, with body f.\nf must be a Lua function. Returns a function that resumes the coroutine each time it is called. Any arguments passed to the function behave as the extra arguments to resume. Returns the same values returned by resume, except the first boolean. In case of error, propagates the error.",
+ args = "(f: function)",
+ returns = "(function)",
+ },
+ yield = {
+ type = "function",
+ description = "Suspends the execution of the calling coroutine.\nAny arguments to yield are passed as extra results to resume.",
+ args = "(...)",
+ returns = "()",
+ },
+ isyieldable = {
+ type = "function",
+ description = "Returns true when the running coroutine can yield. A running coroutine is yieldable if it is not the main thread and it is not inside a non-yieldable C function.\nFUNCTION ADDED IN Lua 5.3.",
+ args = "()",
+ returns = "(boolean)",
+ },
+ },
+ },
+
+ -- Module/Package library
+ module = {
+ type = "function",
+ description = "Creates a module.\nIf there is a table in package.loaded[name], this table is the module. Otherwise, if there is a global table t with the given name, this table is the module. Otherwise creates a new table t and sets it as the value of the global name and the value of package.loaded[name]. This function also initializes t._NAME with the given name, t._M with the module (t itself), and t._PACKAGE with the package name (the full module name minus last component; see below). Finally, module sets t as the new environment of the current function and the new value of package.loaded[name], so that require returns t.\nIf name is a compound name (that is, one with components separated by dots), module creates (or reuses, if they already exist) tables for each component.\nThis function can receive optional options after the module name, where each option is a function to be applied over the module.\nFUNCTION DEPRECATED IN Lua 5.2.",
+ args = "(name: string [, ...])",
+ returns = "()",
+ },
+ require = {
+ type = "function",
+ description = "Loads the given module.\nThe function starts by looking into the package.loaded table to determine whether modname is already loaded. If it is, then require returns the value stored at package.loaded[modname]. Otherwise, it tries to find a loader for the module.\nTo find a loader, require is guided by the package.searchers sequence. By changing this sequence, we can change how require looks for a module. The following explanation is based on the default configuration for package.searchers.\nFirst require queries package.preload[modname]. If it has a value, this value (which should be a function) is the loader. Otherwise require searches for a Lua loader using the path stored in package.path. If that also fails, it searches for a C loader using the path stored in package.cpath. If that also fails, it tries an all-in-one loader (see package.searchers).\nOnce a loader is found, require calls the loader with two arguments: modname and an extra value dependent on how it got the loader. (If the loader came from a file, this extra value is the file name.) If the loader returns any non-nil value, require assigns the returned value to package.loaded[modname]. If the loader does not return a non-nil value and has not assigned any value to package.loaded[modname], then require assigns true to this entry. In any case, require returns the final value of package.loaded[modname].\nIf there is any error loading or running the module, or if it cannot find any loader for the module, then require raises an error.",
+ args = "(modname: string)",
+ returns = "(any)",
+ },
+ package = {
+ type = "lib",
+ description = "The package library provides basic facilities for loading modules in Lua.\nIt exports one function directly in the global environment: require. Everything else is exported in a table package.",
+ childs = {
+ config = {
+ type = "value",
+ description = "A string describing some compile-time configurations for packages.\nThis string is a sequence of lines:\n* The first line is the directory separator string. Default is '\\' for Windows and '/' for all other systems.\n* The second line is the character that separates templates in a path. Default is ';'.\n* The third line is the string that marks the substitution points in a template. Default is '?'.\n* The fourth line is a string that, in a path in Windows, is replaced by the executable's directory. Default is '!'.\n* The fifth line is a mark to ignore all text before it when building the luaopen_ function name. Default is '-'.",
+ },
+ cpath = {
+ type = "value",
+ description = "The path used by require to search for a C loader.\nLua initializes the C path package.cpath in the same way it initializes the Lua path package.path, using the environment variable LUA_CPATH_5_2 or the environment variable LUA_CPATH or a default path defined in luaconf.h.",
+ },
+ loaded = {
+ type = "value",
+ description = "A table used by require to control which modules are already loaded.\nWhen you require a module modname and package.loaded[modname] is not false, require simply returns the value stored there.\nThis variable is only a reference to the real table; assignments to this variable do not change the table used by require.",
+ },
+ loaders = {
+ type = "value",
+ description = "A table used by require to control how to load modules.\nEach entry in this table is a searcher function. When looking for a module, require calls each of these searchers in ascending order, with the module name (the argument given to require) as its sole parameter. The function can return another function (the module loader) or a string explaining why it did not find that module (or nil if it has nothing to say). Lua initializes this table with four functions.\nThe first searcher simply looks for a loader in the package.preload table.\nThe second searcher looks for a loader as a Lua library, using the path stored at package.path. A path is a sequence of templates separated by semicolons. For each template, the searcher will change each interrogation mark in the template by filename, which is the module name with each dot replaced by a \"directory separator\" (such as \"/\" in Unix); then it will try to open the resulting file name.\nThe third searcher looks for a loader as a C library, using the path given by the variable package.cpath. Once it finds a C library, this searcher first uses a dynamic link facility to link the application with the library. Then it tries to find a C function inside the library to be used as the loader. The name of this C function is the string \"luaopen_\" concatenated with a copy of the module name where each dot is replaced by an underscore. Moreover, if the module name has a hyphen, its prefix up to (and including) the first hyphen is removed.\nThe fourth searcher tries an all-in-one loader. It searches the C path for a library for the root name of the given module. If found, it looks into it for an open function for the submodule. With this facility, a package can pack several C submodules into one single library, with each submodule keeping its original open function.\nVALUE DEPRECATED IN Lua 5.2.",
+ },
+ loadlib = {
+ type = "function",
+ description = "Dynamically links the host program with the C library libname.\nIf funcname is \"*\", then it only links with the library, making the symbols exported by the library available to other dynamically linked libraries. VALUE ADDED IN Lua 5.2.\nOtherwise, it looks for a function funcname inside the library and returns this function as a C function. (So, funcname must follow the prototype lua_CFunction).\nThis is a low-level function. It completely bypasses the package and module system. Unlike require, it does not perform any path searching and does not automatically adds extensions. libname must be the complete file name of the C library, including if necessary a path and an extension. funcname must be the exact name exported by the C library (which may depend on the C compiler and linker used).\nThis function is not supported by Standard C. As such, it is only available on some platforms (Windows, Linux, Mac OS X, Solaris, BSD, plus other Unix systems that support the dlfcn standard).",
+ args = "(libname: string, funcname: string)",
+ returns = "([function])",
+ },
+ path = {
+ type = "value",
+ description = "The path used by require to search for a Lua loader.\nAt start-up, Lua initializes this variable with the value of the environment variable LUA_PATH_5_2 or the environment variable LUA_PATH or with a default path defined in luaconf.h, if those environment variables are not defined. Any \";;\" in the value of the environment variable is replaced by the default path.",
+ },
+ preload = {
+ type = "value",
+ description = "A table to store loaders for specific modules (see require).\nThis variable is only a reference to the real table; assignments to this variable do not change the table used by require.",
+ },
+ searchers = {
+ type = "value",
+ description = "A table used by require to control how to load modules.\nEach entry in this table is a searcher function. When looking for a module, require calls each of these searchers in ascending order, with the module name (the argument given to require) as its sole parameter. The function can return another function (the module loader) plus an extra value that will be passed to that loader, or a string explaining why it did not find that module (or nil if it has nothing to say).\nLua initializes this table with four searcher functions.\nThe first searcher simply looks for a loader in the package.preload table.\nThe second searcher looks for a loader as a Lua library, using the path stored at package.path. The search is done as described in function package.searchpath.\nThe third searcher looks for a loader as a C library, using the path given by the variable package.cpath. Again, the search is done as described in function package.searchpath. Once it finds a C library, this searcher first uses a dynamic link facility to link the application with the library. Then it tries to find a C function inside the library to be used as the loader. The name of this C function is the string \"luaopen_\" concatenated with a copy of the module name where each dot is replaced by an underscore. Moreover, if the module name has a hyphen, its prefix up to (and including) the first hyphen is removed.\nThe fourth searcher tries an all-in-one loader. It searches the C path for a library for the root name of the given module. If found, it looks into it for an open function for the submodule. With this facility, a package can pack several C submodules into one single library, with each submodule keeping its original open function.\nAll searchers except the first one (preload) return as the extra value the file name where the module was found, as returned by package.searchpath. The first searcher returns no extra value.\nVALUE ADDED IN Lua 5.2.",
+ },
+ searchpath = {
+ type = "function",
+ description = "Searches for the given name in the given path.\nA path is a string containing a sequence of templates separated by semicolons. For each template, the function replaces each interrogation mark (if any) in the template with a copy of name wherein all occurrences of sep (a dot, by default) were replaced by rep (the system's directory separator, by default), and then tries to open the resulting file name.\nReturns the resulting name of the first file that it can open in read mode (after closing the file), or nil plus an error message if none succeeds. (This error message lists all file names it tried to open.)\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(name: string, path: string [, sep: string [, rep: string]])",
+ returns = "(string|nil [, string])",
+ },
+ seeall = {
+ type = "function",
+ description = "Sets a metatable for module with its __index field referring to the global environment, so that this module inherits values from the global environment.\nTo be used as an option to function module.\nFUNCTION DEPRECATED IN Lua 5.2.",
+ args = "(module: table)",
+ returns = "()",
+ },
+ },
+ },
+
+ -- String library
+ string = {
+ type = "lib",
+ description = "This library provides generic functions for string manipulation, such as finding and extracting substrings, and pattern matching.\nWhen indexing a string in Lua, the first character is at position 1 (not at 0, as in C). Indices are allowed to be negative and are interpreted as indexing backwards, from the end of the string. Thus, the last character is at position -1, and so on.\nThe string library provides all its functions inside the table string. It also sets a metatable for strings where the __index field points to the string table. Therefore, you can use the string functions in object-oriented style. For instance, string.byte(s,i) can be written as s:byte(i).\nThe string library assumes one-byte character encodings.",
+ childs = {
+ byte = {
+ type = "function",
+ description = "Returns the internal numerical codes of the characters s[i], s[i+1], ..., s[j].\nThe default value for i is 1; the default value for j is i. These indices are corrected following the same rules of function string.sub.\nNumerical codes are not necessarily portable across platforms.",
+ args = "(s: string [, i: number [, j: number]])",
+ returns = "(number [, ...])",
+ },
+ char = {
+ type = "function",
+ description = "Receives zero or more integers. Returns a string with length equal to the number of arguments, in which each character has the internal numerical code equal to its corresponding argument.\nNumerical codes are not necessarily portable across platforms.",
+ args = "(...)",
+ returns = "(string)",
+ valuetype = "string",
+ },
+ dump = {
+ type = "function",
+ description = "Returns a string containing a binary representation of the given function, so that a later load on this string returns a copy of the function (but with new upvalues).",
+ args = "(function: function)",
+ returns = "(string)",
+ valuetype = "string",
+ },
+ find = {
+ type = "function",
+ description = "Looks for the first match of pattern in the string s.\nIf it finds a match, then find returns the indices of s where this occurrence starts and ends; otherwise, it returns nil.\nA third, optional numerical argument init specifies where to start the search; its default value is 1 and can be negative. A value of true as a fourth, optional argument plain turns off the pattern matching facilities, so the function does a plain \"find substring\" operation, with no characters in pattern being considered magic. Note that if plain is given, then init must be given as well.\nIf the pattern has captures, then in a successful match the captured values are also returned, after the two indices.",
+ args = "(s: string, pattern: string [, init: number [, plain: boolean]])",
+ returns = "(number|nil [, number [, ...]])",
+ },
+ format = {
+ type = "function",
+ description = "Returns a formatted version of its variable number of arguments following the description given in its first argument (which must be a string).\nThe format string follows the same rules as the C function sprintf. The only differences are that the options/modifiers *, h, L, l, n, and p are not supported and that there is an extra option, q. The q option formats a string between double quotes, using escape sequences when necessary to ensure that it can safely be read back by the Lua interpreter.\nOptions A and a (when available) (VALUES ADDED IN Lua 5.2), E, e, f, G, and g all expect a number as argument. Options c, d, i, o, u, X, and x also expect a number, but the range of that number may be limited by the underlying C implementation. For options o, u, X, and x, the number cannot be negative. Option q expects a string; option s expects a string without embedded zeros. If the argument to option s is not a string, it is converted to one following the same rules of tostring (BEHAVIOR ADDED IN Lua 5.2).",
+ args = "(formatstring, ...)",
+ returns = "(string)",
+ valuetype = "string",
+ },
+ gmatch = {
+ type = "function",
+ description = "Returns an iterator function that, each time it is called, returns the next captures from pattern over the string s.\nIf pattern specifies no captures, then the whole match is produced in each call.\nFor this function, a caret '^' at the start of a pattern does not work as an anchor, as this would prevent the iteration.",
+ args = "(s: string, pattern: string)",
+ returns = "(function)",
+ },
+ pack = {
+ type = "function",
+ description = "Returns a binary string containing the values v1, v2, etc. packed (that is, serialized in binary form) according to the format string fmt.\nFUNCTION ADDED IN Lua 5.3.",
+ args = "(fmt: string, v1, v2, ...)",
+ returns = "(string)",
+ valuetype = "string",
+ },
+ unpack = {
+ type = "function",
+ description = "Returns the values packed in string s (see string.pack) according to the format string fmt. An optional pos marks where to start reading in s (default is 1). After the read values, this function also returns the index of the first unread byte in s.\nFUNCTION ADDED IN Lua 5.3.",
+ args = "(fmt: string, s: string [, pos: number])",
+ returns = "(values)",
+ },
+ packsize = {
+ type = "function",
+ description = "Returns the size of a string resulting from string.pack with the given format. The format string cannot have the variable-length options 's' or 'z'.\nFUNCTION ADDED IN Lua 5.3.",
+ args = "(fmt: string)",
+ returns = "(number)",
+ },
+ gsub = {
+ type = "function",
+ description = "Returns a copy of s in which all (or the first n, if given) occurrences of the pattern have been replaced by a replacement string specified by repl, which can be a string, a table, or a function.\ngsub also returns, as its second value, the total number of matches that occurred. The name gsub comes from Global SUBstitution.\nIf repl is a string, then its value is used for replacement. The character % works as an escape character: any sequence in repl of the form %d, with d between 1 and 9, stands for the value of the d-th captured substring. The sequence %0 stands for the whole match. The sequence %% stands for a single %.\nIf repl is a table, then the table is queried for every match, using the first capture as the key.\nIf repl is a function, then this function is called every time a match occurs, with all captured substrings passed as arguments, in order.\nIn any case, if the pattern specifies no captures, then it behaves as if the whole pattern was inside a capture.\nIf the value returned by the table query or by the function call is a string or a number, then it is used as the replacement string; otherwise, if it is false or nil, then there is no replacement (that is, the original match is kept in the string).",
+ args = "(s: string, pattern: string, repl: string|table|function [, n: number])",
+ returns = "(string, number)",
+ valuetype = "string",
+ },
+ len = {
+ type = "function",
+ description = "Receives a string and returns its length.\nThe empty string \"\" has length 0. Embedded zeros are counted, so \"a\\000bc\\000\" has length 5.",
+ args = "(s: string)",
+ returns = "(number)",
+ },
+ lower = {
+ type = "function",
+ description = "Receives a string and returns a copy of this string with all uppercase letters changed to lowercase.\nAll other characters are left unchanged. The definition of what an uppercase letter is depends on the current locale.",
+ args = "(s: string)",
+ returns = "(string)",
+ valuetype = "string",
+ },
+ match = {
+ type = "function",
+ description = "Looks for the first match of pattern in the string s.\nIf it finds one, then match returns the captures from the pattern; otherwise it returns nil.\nIf pattern specifies no captures, then the whole match is returned. A third, optional numerical argument init specifies where to start the search; its default value is 1 and can be negative.",
+ args = "(s: string, pattern: string [, init: number])",
+ returns = "(string|nil [,...])",
+ valuetype = "string",
+ },
+ rep = {
+ type = "function",
+ description = "Returns a string that is the concatenation of n copies of the string s separated by the string sep.\nThe default value for sep is the empty string (that is, no separator). ARGUMENT ADDED IN Lua 5.2.",
+ args = "(s: string, n: number [, sep: string])",
+ returns = "(string)",
+ valuetype = "string",
+ },
+ reverse = {
+ type = "function",
+ description = "Returns a string that is the string s reversed.",
+ args = "(s: string)",
+ returns = "(string)",
+ valuetype = "string",
+ },
+ sub = {
+ type = "function",
+ description = "Returns the substring of s that starts at i and continues until j; i and j can be negative.\nIf j is absent, then it is assumed to be equal to -1 (which is the same as the string length). In particular, the call string.sub(s,1,j) returns a prefix of s with length j, and string.sub(s, -i) returns a suffix of s with length i.\nIf, after the translation of negative indices, i is less than 1, it is corrected to 1. If j is greater than the string length, it is corrected to that length. If, after these corrections, i is greater than j, the function returns the empty string.",
+ args = "(s: string, i: number [, j: number])",
+ returns = "(string)",
+ valuetype = "string",
+ },
+ upper = {
+ type = "function",
+ description = "Receives a string and returns a copy of this string with all lowercase letters changed to uppercase.\nAll other characters are left unchanged. The definition of what a lowercase letter is depends on the current locale.",
+ args = "(s: string)",
+ returns = "(string)",
+ valuetype = "string",
+ },
+ },
+ },
+
+ -- Table library
+ table = {
+ type = "lib",
+ description = "This library provides generic functions for table manipulation. It provides all its functions inside the table table.\nRemember that, whenever an operation needs the length of a table, the table should be a proper sequence or have a __len metamethod. All functions ignore non-numeric keys in tables given as arguments.\nFor performance reasons, all table accesses (get/set) performed by these functions are raw.",
+ childs = {
+ concat = {
+ type = "function",
+ description = "Given a list where all elements are strings or numbers, returns list[i]..sep..list[i+1] ··· sep..list[j].\nThe default value for sep is the empty string, the default for i is 1, and the default for j is #list. If i is greater than j, returns the empty string.",
+ args = "(list: table [, sep: string [, i: number [, j: number]]])",
+ returns = "(string)",
+ valuetype = "string",
+ },
+ insert = {
+ type = "function",
+ description = "Inserts element value at position pos in list, shifting up the elements list[pos], list[pos+1], ···, list[#list].\nThe default value for pos is #list+1, so that a call table.insert(t,x) inserts x at the end of list t.",
+ args = "(list: table, [pos: number,] value: any)",
+ returns = "()",
+ },
+ maxn = {
+ type = "function",
+ description = "Returns the largest positive numerical index of the given table, or zero if the table has no positive numerical indices.\n(To do its job this function does a linear traversal of the whole table.)\nFUNCTION DEPRECATED IN Lua 5.2.",
+ args = "(table: table)",
+ returns = "(number)",
+ },
+ pack = {
+ type = "function",
+ description = "Returns a new table with all parameters stored into keys 1, 2, etc. and with a field \"n\" with the total number of parameters.\nNote that the resulting table may not be a sequence.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(...)",
+ returns = "(table)",
+ },
+ move = {
+ type = "function",
+ description = "Moves elements from table a1 to table a2. This function performs the equivalent to the following multiple assignment: a2[t],··· = a1[f],···,a1[e]. The default for a2 is a1. The destination range can overlap with the source range. Index f must be positive.\nFUNCTION ADDED IN Lua 5.3.",
+ args = "(a1: table, f, e, t [,a2: table])",
+ returns = "()",
+ },
+ remove = {
+ type = "function",
+ description = "Removes from list the element at position pos, shifting down the elements list[pos+1], list[pos+2], ···, list[#list] and erasing element list[#list].\nReturns the value of the removed element.\nThe default value for pos is #list, so that a call table.remove(t) removes the last element of list t.",
+ args = "(list: table [, pos: number])",
+ returns = "(any)",
+ },
+ sort = {
+ type = "function",
+ description = "Sorts list elements in a given order, in-place, from list[1] to list[#list].\nIf comp is given, then it must be a function that receives two list elements and returns true when the first element must come before the second in the final order (so that not comp(list[i+1],list[i]) will be true after the sort). If comp is not given, then the standard Lua operator < is used instead.\nThe sort algorithm is not stable; that is, elements considered equal by the given order may have their relative positions changed by the sort.",
+ args = "(list: table [, comp: function])",
+ returns = "()",
+ },
+ unpack = {
+ type = "function",
+ description = "Returns the elements from the given table.\nThis function is equivalent to\nreturn list[i], list[i+1], ···, list[j]\nBy default, i is 1 and j is #list.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(list: table [, i: number [, j: number]])",
+ returns = "(...)",
+ },
+ },
+ },
+
+ -- Math library
+ math = {
+ type = "lib",
+ description = "This library is an interface to the standard C math library. It provides all its functions inside the table math.",
+ childs = {
+ abs = {
+ type = "function",
+ description = "Returns the absolute value of x.",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ acos = {
+ type = "function",
+ description = "Returns the arc cosine of x (in radians).",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ asin = {
+ type = "function",
+ description = "Returns the arc sine of x (in radians).",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ atan = {
+ type = "function",
+ description = "Returns the arc tangent of x (in radians).",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ atan2 = {
+ type = "function",
+ description = "Returns the arc tangent of y/x (in radians), but uses the signs of both parameters to find the quadrant of the result.\n(It also handles correctly the case of x being zero.)",
+ args = "(y: number, x: number)",
+ returns = "(number)",
+ },
+ ceil = {
+ type = "function",
+ description = "Returns the smallest integer larger than or equal to x.",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ cos = {
+ type = "function",
+ description = "Returns the cosine of x (assumed to be in radians).",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ cosh = {
+ type = "function",
+ description = "Returns the hyperbolic cosine of x.",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ deg = {
+ type = "function",
+ description = "Returns the angle x (given in radians) in degrees.",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ exp = {
+ type = "function",
+ description = "Returns the value exp(x).",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ floor = {
+ type = "function",
+ description = "Returns the largest integer smaller than or equal to x.",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ fmod = {
+ type = "function",
+ description = "Returns the remainder of the division of x by y that rounds the quotient towards zero.",
+ args = "(x: number, y: number)",
+ returns = "(number)",
+ },
+ frexp = {
+ type = "function",
+ description = "Returns m and e such that x = m2^e, e is an integer and the absolute value of m is in the range [0.5, 1) (or zero when x is zero).",
+ args = "(x: number)",
+ returns = "(number, number)",
+ },
+ huge = {
+ type = "value",
+ description = "The value HUGE_VAL, a value larger than or equal to any other numerical value.",
+ },
+ ldexp = {
+ type = "function",
+ description = "Returns m2^e (e should be an integer).",
+ args = "(m: number, e: number)",
+ returns = "(number)",
+ },
+ log = {
+ type = "function",
+ description = "Returns the logarithm of x in the given base.\nThe default for base is e (so that the function returns the natural logarithm of x). ARGUMENT ADDED IN Lua 5.2.",
+ args = "(x: number [, base: number])",
+ returns = "(number)",
+ },
+ log10 = {
+ type = "function",
+ description = "Returns the base-10 logarithm of x.\nFUNCTION DEPRECATED IN Lua 5.2.",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ max = {
+ type = "function",
+ description = "Returns the maximum value among its arguments.",
+ args = "(x: number, ...)",
+ returns = "(number)",
+ },
+ min = {
+ type = "function",
+ description = "Returns the minimum value among its arguments.",
+ args = "(x: number, ...)",
+ returns = "(number)",
+ },
+ modf = {
+ type = "function",
+ description = "Returns two numbers, the integral part of x and the fractional part of x.",
+ args = "(x: number)",
+ returns = "(number, number)",
+ },
+ pi = {
+ type = "value",
+ description = "The value of pi.",
+ },
+ mininteger = {
+ type = "value",
+ description = "An integer with the minimum value for an integer.\nVALUE ADDED IN Lua 5.3.",
+ },
+ maxinteger = {
+ type = "value",
+ description = "An integer with the maximum value for an integer.\nVALUE ADDED IN Lua 5.3.",
+ },
+ pow = {
+ type = "function",
+ description = "Returns x^y.\n(You can also use the expression x^y to compute this value.)",
+ args = "(x: number, y: number)",
+ returns = "(number)",
+ },
+ rad = {
+ type = "function",
+ description = "Returns the angle x (given in degrees) in radians.",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ random = {
+ type = "function",
+ description = "This function is an interface to the simple pseudo-random generator function rand provided by Standard C.\n(No guarantees can be given for its statistical properties.)\nWhen called without arguments, returns a uniform pseudo-random real number in the range [0,1). When called with an integer number m, math.random returns a uniform pseudo-random integer in the range [1, m]. When called with two integer numbers m and n, math.random returns a uniform pseudo-random integer in the range [m, n].",
+ args = "([m: number [, n: number]])",
+ returns = "(number)",
+ },
+ randomseed = {
+ type = "function",
+ description = "Sets x as the \"seed\" for the pseudo-random generator: equal seeds produce equal sequences of numbers.",
+ args = "(x: number)",
+ returns = "()",
+ },
+ sin = {
+ type = "function",
+ description = "Returns the sine of x (assumed to be in radians).",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ sinh = {
+ type = "function",
+ description = "Returns the hyperbolic sine of x.",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ sqrt = {
+ type = "function",
+ description = "Returns the square root of x.\n(You can also use the expression x^0.5 to compute this value.)",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ tan = {
+ type = "function",
+ description = "Returns the tangent of x (assumed to be in radians).",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ tanh = {
+ type = "function",
+ description = "Returns the hyperbolic tangent of x.",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ type = {
+ type = "function",
+ description = [[Returns "integer" if x is an integer, "float" if it is a float, or nil if x is not a number.\nFUNCTION ADDED IN Lua 5.3.]],
+ args = "(x: number)",
+ returns = "(string)",
+ },
+ tointeger = {
+ type = "function",
+ description = "If the value x is convertible to an integer, returns that integer. Otherwise, returns nil.\nFUNCTION ADDED IN Lua 5.3.",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ ult = {
+ type = "function",
+ description = "Returns a boolean, true if integer m is below integer n when they are compared as unsigned integers.\nFUNCTION ADDED IN Lua 5.3.",
+ args = "(m: number, n: number)",
+ returns = "(boolean)",
+ },
+ },
+ },
+
+ -- Bitwise library
+ bit32 = {
+ type = "lib",
+ description = "This library provides bitwise operations. It provides all its functions inside the table bit32.\nUnless otherwise stated, all functions accept numeric arguments in the range (-2^51,+2^51); each argument is normalized to the remainder of its division by 2^32 and truncated to an integer (in some unspecified way), so that its final value falls in the range [0,2^32 - 1]. Similarly, all results are in the range [0,2^32 - 1]. Note that bit32.bnot(0) is 0xFFFFFFFF, which is different from -1.",
+ childs = {
+ arshift = {
+ type = "function",
+ description = "Returns the number x shifted disp bits to the right.\nThe number disp may be any representable integer. Negative displacements shift to the left.\nThis shift operation is what is called arithmetic shift. Vacant bits on the left are filled with copies of the higher bit of x; vacant bits on the right are filled with zeros. In particular, displacements with absolute values higher than 31 result in zero or 0xFFFFFFFF (all original bits are shifted out).\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(x: number, disp: number)",
+ returns = "(number)",
+ },
+ band = {
+ type = "function",
+ description = "Returns the bitwise and of its operands.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(...)",
+ returns = "(number)",
+ },
+ bnot = {
+ type = "function",
+ description = "Returns the bitwise negation of x.\nFor any integer x, the following identity holds:\nassert(bit32.bnot(x) == (-1 - x) % 2^32)\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(x: number)",
+ returns = "(number)",
+ },
+ bor = {
+ type = "function",
+ description = "Returns the bitwise or of its operands.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(...)",
+ returns = "(number)",
+ },
+ btest = {
+ type = "function",
+ description = "Returns a boolean signaling whether the bitwise and of its operands is different from zero.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(...)",
+ returns = "(boolean)",
+ },
+ bxor = {
+ type = "function",
+ description = "Returns the bitwise exclusive or of its operands.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(...)",
+ returns = "(number)",
+ },
+ extract = {
+ type = "function",
+ description = "Returns the unsigned number formed by the bits field to field + width - 1 from n.\nBits are numbered from 0 (least significant) to 31 (most significant). All accessed bits must be in the range [0, 31].\nThe default for width is 1.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(n: number, field: number [, width: number])",
+ returns = "(number)",
+ },
+ replace = {
+ type = "function",
+ description = "Returns a copy of n with the bits field to field + width - 1 replaced by the value v.\nBits are numbered from 0 (least significant) to 31 (most significant). All accessed bits must be in the range [0, 31].\nThe default for width is 1.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(n: number, v: number, field: number [, width: number])",
+ returns = "(number)",
+ },
+ lrotate = {
+ type = "function",
+ description = "Returns the number x rotated disp bits to the left.\nThe number disp may be any representable integer.\nFor any valid displacement, the following identity holds:\nassert(bit32.lrotate(x, disp) == bit32.lrotate(x, disp % 32))\nIn particular, negative displacements rotate to the right.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(x: number, disp: number)",
+ returns = "(number)",
+ },
+ lshift = {
+ type = "function",
+ description = "Returns the number x shifted disp bits to the left.\nThe number disp may be any representable integer. Negative displacements shift to the right. In any direction, vacant bits are filled with zeros. In particular, displacements with absolute values higher than 31 result in zero (all bits are shifted out).\nFor positive displacements, the following equality holds:\nassert(bit32.lshift(b, disp) == (b * 2^disp) % 2^32)\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(x: number, disp: number)",
+ returns = "(number)",
+ },
+ rrotate = {
+ type = "function",
+ description = "Returns the number x rotated disp bits to the right.\nThe number disp may be any representable integer.\nFor any valid displacement, the following identity holds:\nassert(bit32.rrotate(x, disp) == bit32.rrotate(x, disp % 32))\nIn particular, negative displacements rotate to the left.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(x: number, disp: number)",
+ returns = "(number)",
+ },
+ rshift = {
+ type = "function",
+ description = "Returns the number x shifted disp bits to the right.\nThe number disp may be any representable integer. Negative displacements shift to the left. In any direction, vacant bits are filled with zeros. In particular, displacements with absolute values higher than 31 result in zero (all bits are shifted out).\nFor positive displacements, the following equality holds:\nassert(bit32.rshift(b, disp) == math.floor(b % 2^32 / 2^disp))\nThis shift operation is what is called logical shift.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(x: number, disp: number)",
+ returns = "(number)",
+ },
+ },
+ },
+
+ -- I/O library
+ io = {
+ type = "lib",
+ description = "The I/O library provides two different styles for file manipulation. The first one uses implicit file descriptors; that is, there are operations to set a default input file and a default output file, and all input/output operations are over these default files. The second style uses explicit file descriptors.\nWhen using implicit file descriptors, all operations are supplied by table io. When using explicit file descriptors, the operation io.open returns a file descriptor and then all operations are supplied as methods of the file descriptor.\nThe table io also provides three predefined file descriptors with their usual meanings from C: io.stdin, io.stdout, and io.stderr. The I/O library never closes these files.\nUnless otherwise stated, all I/O functions return nil on failure (plus an error message as a second result and a system-dependent error code as a third result) and some value different from nil on success.",
+ childs = {
+ stdin = { type = "value" },
+ stdout = { type = "value" },
+ stderr = { type = "value" },
+ close = {
+ type = "function",
+ description = "Closes file. Equivalent to file:close().\nWithout a file, closes the default output file.",
+ args = "([file: file])",
+ returns = "(boolean|nil [, string, number])",
+ },
+ flush = {
+ type = "function",
+ description = "Saves any written data to the default output file. Equivalent to io.output():flush().",
+ args = "()",
+ returns = "()",
+ },
+ input = {
+ type = "function",
+ description = "When called with a file name, it opens the named file (in text mode), and sets its handle as the default input file. When called with a file handle, it simply sets this file handle as the default input file. When called without parameters, it returns the current default input file.\nIn case of errors this function raises the error, instead of returning an error code.",
+ args = "([file: string|file])",
+ returns = "([file])",
+ valuetype = "f",
+ },
+ lines = {
+ type = "function",
+ description = "Opens the given file name in read mode and returns an iterator function that, each time it is called, reads the file according to the given formats.\nWhen no format is given, uses \"*l\" as a default. ARGUMENT ADDED IN Lua 5.2.\nWhen the iterator function detects the end of file, it returns nil (to finish the loop) and automatically closes the file.\nThe call io.lines() (with no file name) is equivalent to io.input():lines(); that is, it iterates over the lines of the default input file. In this case it does not close the file when the loop ends.\nIn case of errors this function raises the error, instead of returning an error code.",
+ args = "([filename: string, ...])",
+ returns = "(function)",
+ },
+ open = {
+ type = "function",
+ description = "This function opens a file, in the mode specified in the string mode.\nIt returns a new file handle, or, in case of errors, nil plus an error message.\nThe mode string can be any of the following:\n* \"r\": read mode (the default);\n* \"w\": write mode;\n* \"a\": append mode;\n* \"r+\": update mode, all previous data is preserved;\n* \"w+\": update mode, all previous data is erased;\n* \"a+\": append update mode, previous data is preserved, writing is only allowed at the end of file.\nThe mode string can also have a 'b' at the end, which is needed in some systems to open the file in binary mode.",
+ args = "(filename: string [, mode: string])",
+ returns = "(file|nil [, string])",
+ valuetype = "f",
+ },
+ output = {
+ type = "function",
+ description = "When called with a file name, it opens the named file (in text mode), and sets its handle as the default output file. When called with a file handle, it simply sets this file handle as the default output file. When called without parameters, it returns the current default output file.\nIn case of errors this function raises the error, instead of returning an error code.",
+ args = "([file: string|file])",
+ returns = "([file])",
+ valuetype = "f",
+ },
+ popen = {
+ type = "function",
+ description = "Starts program prog in a separated process and returns a file handle that you can use to read data from this program (if mode is \"r\", the default) or to write data to this program (if mode is \"w\").\nThis function is system dependent and is not available on all platforms.",
+ args = "(prog: string [, mode: string])",
+ returns = "(file|nil [, string])",
+ valuetype = "f",
+ },
+ read = {
+ type = "function",
+ description = "Reads the default input file, according to the given formats. Equivalent to io.input():read(...).",
+ args = "(...)",
+ returns = "(...)",
+ },
+ tmpfile = {
+ type = "function",
+ description = "Returns a handle for a temporary file.\nThis file is opened in update mode and it is automatically removed when the program ends.",
+ args = "()",
+ returns = "(file)",
+ valuetype = "f",
+ },
+ type = {
+ type = "function",
+ description = "Checks whether obj is a valid file handle.\nReturns the string \"file\" if obj is an open file handle, \"closed file\" if obj is a closed file handle, or nil if obj is not a file handle.",
+ args = "(obj: file)",
+ returns = "(string|nil)",
+ },
+ write = {
+ type = "function",
+ description = "Writes the value of each of its arguments to the default output file. Equivalent to io.output():write(...).",
+ args = "(...)",
+ returns = "(file|nil [, string])",
+ },
+ },
+ },
+
+ f = {
+ type = "class",
+ description = "Pseudoclass for operations on file handles.",
+ childs = {
+ close = {
+ type = "method",
+ description = "Closes file.\nNote that files are automatically closed when their handles are garbage collected, but that takes an unpredictable amount of time to happen.\nWhen closing a file handle created with io.popen, file:close returns the same values returned by os.execute. RETURN SPECIAL CASE ADDED IN Lua 5.2.",
+ args = "(file: file)",
+ returns = "(boolean|nil [, string, number])",
+ },
+ flush = {
+ type = "method",
+ description = "Saves any written data to file.",
+ args = "(file: file)",
+ returns = "(boolean|nil [, string])",
+ },
+ lines = {
+ type = "method",
+ description = "Returns an iterator function that, each time it is called, reads the file according to the given formats.\nWhen no format is given, uses \"*l\" as a default. ARGUMENT ADDED IN Lua 5.2.\nUnlike io.lines, this function does not close the file when the loop ends.\nIn case of errors this function raises the error, instead of returning an error code.",
+ args = "(file: file, ...)",
+ returns = "(function)",
+ },
+ read = {
+ type = "method",
+ description = "Reads the file file, according to the given formats, which specify what to read.\nFor each format, the function returns a string (or a number) with the characters read, or nil if it cannot read data with the specified format. When called without formats, it uses a default format that reads the next line (see below).\nThe available formats are\n* \"*n\": reads a number; this is the only format that returns a number instead of a string.\n* \"*a\": reads the whole file, starting at the current position. On end of file, it returns the empty string.\n* \"*l\": reads the next line skipping the end of line, returning nil on end of file. This is the default format.\n* \"*L\": reads the next line keeping the end of line (if present), returning nil on end of file. VALUE ADDED IN Lua 5.2.\n* number: reads a string with up to this number of bytes, returning nil on end of file. If number is zero, it reads nothing and returns an empty string, or nil on end of file.",
+ args = "(file: file, ...)",
+ returns = "(...)",
+ },
+ seek = {
+ type = "method",
+ description = "Sets and gets the file position, measured from the beginning of the file, to the position given by offset plus a base specified by the string whence.\nThe string whence is specified as follows:\n* \"set\": base is position 0 (beginning of the file);\n* \"cur\": base is current position;\n* \"end\": base is end of file.\nIn case of success, seek returns the final file position, measured in bytes from the beginning of the file. If seek fails, it returns nil, plus a string describing the error.\nThe default value for whence is \"cur\", and for offset is 0. Therefore, the call file:seek() returns the current file position, without changing it; the call file:seek(\"set\") sets the position to the beginning of the file (and returns 0); and the call file:seek(\"end\") sets the position to the end of the file, and returns its size.",
+ args = "(file: file, [whence: string [, offset: number]])",
+ returns = "(number|nil [, string])",
+ },
+ setvbuf = {
+ type = "method",
+ description = "Sets the buffering mode for an output file.\nThere are three available modes:\n* \"no\": no buffering; the result of any output operation appears immediately.\n* \"full\": full buffering; output operation is performed only when the buffer is full or when you explicitly flush the file (see io.flush).\n* \"line\": line buffering; output is buffered until a newline is output or there is any input from some special files (such as a terminal device).\nFor the last two cases, size specifies the size of the buffer, in bytes. The default is an appropriate size.",
+ args = "(file: file, mode: string [, size: number])",
+ returns = "(boolean|nil [, string])",
+ },
+ write = {
+ type = "method",
+ description = "Writes the value of each of its arguments to file.\nThe arguments must be strings or numbers.\nIn case of success, this function returns file (RETURN CHANGED IN Lua 5.2, BOOLEAN IN LUA 5.1). Otherwise it returns nil plus a string describing the error.",
+ args = "(file: file, ...)",
+ returns = "(file|nil [, string])",
+ },
+ },
+ },
+
+ m = {
+ type = "class",
+ description = "Pseudoclass for metamethods.",
+ childs = {
+ __add = {
+ type = "function",
+ description = "The + operation.",
+ args = "(op1, op2)",
+ returns = "(value)",
+ },
+ __sub = {
+ type = "function",
+ description = "The - operation.",
+ args = "(op1, op2)",
+ returns = "(value)",
+ },
+ __mul = {
+ type = "function",
+ description = "The * operation.",
+ args = "(op1, op2)",
+ returns = "(value)",
+ },
+ __div = {
+ type = "function",
+ description = "The / operation.",
+ args = "(op1, op2)",
+ returns = "(value)",
+ },
+ __mod = {
+ type = "function",
+ description = "The % operation. Behavior similar to the 'add' operation, with the operation o1 - floor(o1/o2)*o2 as the primitive operation.",
+ args = "(op1, op2)",
+ returns = "(value)",
+ },
+ __pow = {
+ type = "function",
+ description = "The ^ (exponentiation) operation. Behavior similar to the 'add' operation, with the function pow (from the C math library) as the primitive operation.",
+ args = "(op1, op2)",
+ returns = "(value)",
+ },
+ __concat = {
+ type = "function",
+ description = "The .. (concatenation) operation.",
+ args = "(op1, op2)",
+ returns = "(value)",
+ },
+ __unm = {
+ type = "function",
+ description = "The unary - operation.",
+ args = "(op)",
+ returns = "(value)",
+ },
+ __len = {
+ type = "function",
+ description = "The # (length) operation.",
+ args = "(op)",
+ returns = "(value)",
+ },
+ __eq = {
+ type = "function",
+ description = "The == operation. A metamethod is selected only when both values being compared have the same type and the same metamethod for the selected operation, and the values are either tables or full userdata.",
+ args = "(op1, op2)",
+ returns = "(boolean)",
+ },
+ __lt = {
+ type = "function",
+ description = "The < operation.",
+ args = "(op1, op2)",
+ returns = "(boolean)",
+ },
+ __le = {
+ type = "function",
+ description = "The <= operation. Note that, in the absence of a 'le' metamethod, Lua tries the 'lt', assuming that a <= b is equivalent to not (b < a).",
+ args = "(op1, op2)",
+ returns = "(boolean)",
+ },
+ __index = {
+ type = "function",
+ description = "The indexing access table[key]. Note that the metamethod is tried only when key is not present in table. When table is not a table, no key is ever present, so the metamethod is always tried.",
+ args = "(table, key)",
+ returns = "(value)",
+ },
+ __newindex = {
+ type = "function",
+ description = "The indexing assignment table[key] = value. Note that the metamethod is tried only when key is not present in table.",
+ args = "(table, key, value)",
+ returns = "(value)",
+ },
+ __call = {
+ type = "function",
+ description = "This method is called when Lua calls a value.",
+ args = "(func, ...)",
+ returns = "(values)",
+ },
+ __tostring = {
+ type = "function",
+ description = "Control string representation. When the builtin 'tostring(table)' function is called, if the metatable for myTable has a __tostring property set to a function, that function is invoked (passing table to it) and the return value is used as the string representation.",
+ args = "(op)",
+ returns = "(value)",
+ },
+ __pairs = {
+ type = "function",
+ description = "This method is called when pairs() is called and returns the first three results from the call (Lua 5.2+).",
+ args = "(table)",
+ returns = "(iterator, table, key)",
+ },
+ __ipairs = {
+ type = "function",
+ description = "This method is called when ipairs() is called and returns the first three results from the call (Lua 5.2+).",
+ args = "(table)",
+ returns = "(iterator, table, index)",
+ },
+ __gc = {
+ type = "function",
+ description = "Finalizer method. When userdata/table is set to be garbage collected, if the metatable has a __gc field pointing to a function, that function is first invoked, passing the userdata to it. Starting from Lua 5.2 this method is also called for tables.",
+ args = "(func, ...)",
+ returns = "(values)",
+ },
+ __mode = {
+ type = "value",
+ description = "Value that controls 'weakness' of the table. If the __mode field is a string containing the character 'k', the keys in the table are weak. If __mode contains 'v', the values in the table are weak.",
+ },
+ __metatable = {
+ type = "value",
+ description = "Value to hide the metatable. This value is returned as the result of getmetatable() call.",
+ },
+ },
+ },
+
+ -- OS library
+ os = {
+ type = "lib",
+ description = "This library is implemented through table os.",
+ childs = {
+ clock = {
+ type = "function",
+ description = "Returns an approximation of the amount in seconds of CPU time used by the program.",
+ args = "()",
+ returns = "(number)",
+ },
+ date = {
+ type = "function",
+ description = "Returns a string or a table containing date and time, formatted according to the given string format.\nIf the time argument is present, this is the time to be formatted (see the os.time function for a description of this value). Otherwise, date formats the current time.\nIf format starts with '!', then the date is formatted in Coordinated Universal Time. After this optional character, if format is the string \"*t\", then date returns a table with the following fields: year (four digits), month (1–12), day (1–31), hour (0–23), min (0–59), sec (0–61), wday (weekday, Sunday is 1), yday (day of the year), and isdst (daylight saving flag, a boolean). This last field may be absent if the information is not available.\nIf format is not \"*t\", then date returns the date as a string, formatted according to the same rules as the C function strftime.\nWhen called without arguments, date returns a reasonable date and time representation that depends on the host system and on the current locale (that is, os.date() is equivalent to os.date(\"%c\")).\nOn some systems, this function may be not thread safe.",
+ args = "([format: string [, time: number]])",
+ returns = "(string|table)",
+ },
+ difftime = {
+ type = "function",
+ description = "Returns the number of seconds from time t1 to time t2.\nIn POSIX, Windows, and some other systems, this value is exactly t2-t1.",
+ args = "(t2: number, t1: number)",
+ returns = "(number)",
+ },
+ execute = {
+ type = "function",
+ description = "This function is equivalent to the C function system. It passes command to be executed by an operating system shell.\nRETURNS IN Lua 5.2:\nIts first result is true if the command terminated successfully, or nil otherwise. After this first result the function returns a string and a number, as follows:\n* \"exit\": the command terminated normally; the following number is the exit status of the command.\n* \"signal\": the command was terminated by a signal; the following number is the signal that terminated the command.\nWhen called without a command, os.execute returns a boolean that is true if a shell is available.\nRETURNS IN LUA 5.1:\nIt returns a status code, which is system-dependent. If command is absent, then it returns nonzero if a shell is available and zero otherwise.",
+ args = "([command: string])",
+ returns = "(boolean|nil [, string, number])",
+ },
+ exit = {
+ type = "function",
+ description = "Calls the C function exit to terminate the host program.\nIf code is true, the returned status is EXIT_SUCCESS; if code is false, the returned status is EXIT_FAILURE; if code is a number, the returned status is this number. The default value for code is true. BOOLEAN VALUE ADDED IN Lua 5.2.\nIf the optional second argument close is true, closes the Lua state before exiting. ARGUMENT ADDED IN Lua 5.2.",
+ args = "([code: boolean|number [, close: boolean]])",
+ returns = "()",
+ },
+ getenv = {
+ type = "function",
+ description = "Returns the value of the process environment variable varname, or nil if the variable is not defined.",
+ args = "(varname: string)",
+ returns = "(string|nil)",
+ },
+ remove = {
+ type = "function",
+ description = "Deletes the file (or empty directory, on POSIX systems) with the given name.\nIf this function fails, it returns nil, plus a string describing the error and the error code.",
+ args = "(filename: string)",
+ returns = "(boolean|nil [, string, number])",
+ },
+ rename = {
+ type = "function",
+ description = "Renames file or directory named oldname to newname.\nIf this function fails, it returns nil, plus a string describing the error and the error code.",
+ args = "(oldname: string, newname: string)",
+ returns = "(boolean|nil [, string, number])",
+ },
+ setlocale = {
+ type = "function",
+ description = "Sets the current locale of the program.\nlocale is a system-dependent string specifying a locale; category is an optional string describing which category to change: \"all\", \"collate\", \"ctype\", \"monetary\", \"numeric\", or \"time\"; the default category is \"all\". The function returns the name of the new locale, or nil if the request cannot be honored.\nIf locale is the empty string, the current locale is set to an implementation-defined native locale. If locale is the string \"C\", the current locale is set to the standard C locale.When called with nil as the first argument, this function only returns the name of the current locale for the given category.",
+ args = "(locale: string [, category: string])",
+ returns = "(string|nil)",
+ },
+ time = {
+ type = "function",
+ description = "Returns the current time when called without arguments, or a time representing the date and time specified by the given table.\nThis table must have fields year, month, and day, and may have fields hour (default is 12), min (default is 0), sec (default is 0), and isdst (default is nil). For a description of these fields, see the os.date function.\nThe returned value is a number, whose meaning depends on your system. In POSIX, Windows, and some other systems, this number counts the number of seconds since some given start time (the \"epoch\"). In other systems, the meaning is not specified, and the number returned by time can be used only as an argument to os.date and os.difftime.",
+ args = "([table: table])",
+ returns = "(number)",
+ },
+ tmpname = {
+ type = "function",
+ description = "Returns a string with a file name that can be used for a temporary file.\nThe file must be explicitly opened before its use and explicitly removed when no longer needed.\nOn POSIX systems, this function also creates a file with that name, to avoid security risks. (Someone else might create the file with wrong permissions in the time between getting the name and creating the file.) You still have to open the file to use it and to remove it (even if you do not use it).\nWhen possible, you may prefer to use io.tmpfile, which automatically removes the file when the program ends.",
+ args = "()",
+ returns = "(string)",
+ },
+ },
+ },
+
+ -- Debug library
+ debug = {
+ type = "lib",
+ description = "This library provides the functionality of the debug interface to Lua programs.\nYou should exert care when using this library. Several of its functions violate basic assumptions about Lua code (e.g., that variables local to a function cannot be accessed from outside; that userdata metatables cannot be changed by Lua code; that Lua programs do not crash) and therefore can compromise otherwise secure code. Moreover, some functions in this library may be slow.\nAll functions in this library are provided inside the debug table. All functions that operate over a thread have an optional first argument which is the thread to operate over. The default is always the current thread.",
+ childs = {
+ debug = {
+ type = "function",
+ description = "Enters an interactive mode with the user, running each string that the user enters.\nUsing simple commands and other debug facilities, the user can inspect global and local variables, change their values, evaluate expressions, and so on. A line containing only the word cont finishes this function, so that the caller continues its execution.\nNote that commands for debug.debug are not lexically nested within any function and so have no direct access to local variables.",
+ args = "()",
+ returns = "()",
+ },
+ getfenv = {
+ type = "function",
+ description = "Returns the environment of object o.\nFUNCTION DEPRECATED IN Lua 5.2.",
+ args = "(o: any)",
+ returns = "(table)",
+ },
+ gethook = {
+ type = "function",
+ description = "Returns the current hook settings of the thread, as three values: the current hook function, the current hook mask, and the current hook count (as set by the debug.sethook function).",
+ args = "([thread: thread])",
+ returns = "(function, string, number)",
+ },
+ getinfo = {
+ type = "function",
+ description = "Returns a table with information about a function.\nYou can give the function directly or you can give a number as the value of f, which means the function running at level f of the call stack of the given thread: level 0 is the current function (getinfo itself); level 1 is the function that called getinfo (except for tail calls, which do not count on the stack); and so on. If f is a number larger than the number of active functions, then getinfo returns nil.\nThe returned table can contain all the fields returned by lua_getinfo, with the string what describing which fields to fill in. The default for what is to get all information available, except the table of valid lines. If present, the option 'f' adds a field named func with the function itself. If present, the option 'L' adds a field named activelines with the table of valid lines.",
+ args = "([thread: thread,] f: function|number [, what: string])",
+ returns = "(table|nil)",
+ },
+ getlocal = {
+ type = "function",
+ description = "This function returns the name and the value of the local variable with index local of the function at level f of the stack.\nThis function accesses not only explicit local variables, but also parameters, temporaries, etc.\nThe first parameter or local variable has index 1, and so on, until the last active variable. Negative indices refer to vararg parameters; -1 is the first vararg parameter (NEGATIVE VALUE ADDED IN Lua 5.2). The function returns nil if there is no variable with the given index, and raises an error when called with a level out of range. (You can call debug.getinfo to check whether the level is valid.)\nVariable names starting with '(' (open parentheses) represent internal variables (loop control variables, temporaries, varargs, and C function locals).\nThe parameter f may also be a function. In that case, getlocal returns only the name of function parameters. VALUE ADDED IN Lua 5.2.",
+ args = "([thread: thread,] f: number|function, local: number)",
+ returns = "(string|nil, any)",
+ },
+ getmetatable = {
+ type = "function",
+ description = "Returns the metatable of the given value or nil if it does not have a metatable.",
+ args = "(value: any)",
+ returns = "(table|nil)",
+ },
+ getregistry = {
+ type = "function",
+ description = "Returns the registry table.",
+ args = "()",
+ returns = "()",
+ },
+ getupvalue = {
+ type = "function",
+ description = "This function returns the name and the value of the upvalue with index up of the function f.\nThe function returns nil if there is no upvalue with the given index.",
+ args = "(f: function, up: number)",
+ returns = "(string|nil, any)",
+ },
+ getuservalue = {
+ type = "function",
+ description = "Returns the Lua value associated to u.\nIf u is not a userdata, returns nil.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(u: userdata)",
+ returns = "(table|nil)",
+ },
+ setfenv = {
+ type = "function",
+ description = "Sets the environment of the given object to the given table. Returns object.\nFUNCTION DEPRECATED IN Lua 5.2.",
+ args = "(object: any, table: table)",
+ returns = "(any)",
+ },
+ sethook = {
+ type = "function",
+ description = "Sets the given function as a hook.\nThe string mask and the number count describe when the hook will be called. The string mask may have the following characters, with the given meaning:\n* 'c': the hook is called every time Lua calls a function;\n* 'r': the hook is called every time Lua returns from a function;\n* 'l': the hook is called every time Lua enters a new line of code.\nWith a count different from zero, the hook is called after every count instructions.\nWhen called without arguments, debug.sethook turns off the hook.\nWhen the hook is called, its first parameter is a string describing the event that has triggered its call: \"call\" (or \"tail call\"), \"return\", \"line\", and \"count\". For line events, the hook also gets the new line number as its second parameter. Inside a hook, you can call getinfo with level 2 to get more information about the running function (level 0 is the getinfo function, and level 1 is the hook function).",
+ args = "([thread: thread,] hook: function, mask: string [, count: number])",
+ returns = "()",
+ },
+ setlocal = {
+ type = "function",
+ description = "This function assigns the value value to the local variable with index local of the function at level level of the stack.\nThe function returns nil if there is no local variable with the given index, and raises an error when called with a level out of range. (You can call getinfo to check whether the level is valid.) Otherwise, it returns the name of the local variable.\nSee debug.getlocal for more information about variable indices and names.",
+ args = "([thread: thread,] level: number, local: number, value: any)",
+ returns = "(string|nil)",
+ },
+ setmetatable = {
+ type = "function",
+ description = "Sets the metatable for the given value to the given table (which can be nil).\nReturns value. RETURN ADDED IN Lua 5.2.",
+ args = "(value: any, table: table|nil)",
+ returns = "(any)",
+ },
+ setupvalue = {
+ type = "function",
+ description = "This function assigns the value value to the upvalue with index up of the function f.\nThe function returns nil if there is no upvalue with the given index. Otherwise, it returns the name of the upvalue.",
+ args = "(f: function, up: number, value: any)",
+ returns = "(string|nil)",
+ },
+ setuservalue = {
+ type = "function",
+ description = "Sets the given value as the Lua value associated to the given udata.\nvalue must be a table or nil; udata must be a full userdata.\nReturns udata.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(udata: userdata, value: table|nil)",
+ returns = "(userdata)",
+ },
+ traceback = {
+ type = "function",
+ description = "If message is present but is neither a string nor nil, this function returns message without further processing. Otherwise, it returns a string with a traceback of the call stack.\nAn optional message string is appended at the beginning of the traceback. An optional level number tells at which level to start the traceback (default is 1, the function calling traceback).",
+ args = "([thread: thread,] [message: any [, level: number]])",
+ returns = "(string)",
+ },
+ upvalueid = {
+ type = "function",
+ description = "Returns an unique identifier (as a light userdata) for the upvalue numbered n from the given function.\nThese unique identifiers allow a program to check whether different closures share upvalues. Lua closures that share an upvalue (that is, that access a same external local variable) will return identical ids for those upvalue indices.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(f: function, n: number)",
+ returns = "(userdata)",
+ },
+ upvaluejoin = {
+ type = "function",
+ description = "Make the n1-th upvalue of the Lua closure f1 refer to the n2-th upvalue of the Lua closure f2.\nFUNCTION ADDED IN Lua 5.2.",
+ args = "(f1: function, n1: number, f2: function, n2: number)",
+ returns = "()",
+ },
+ },
+ },
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/api/lua/love2d.lua b/love2dToAPK/tools/tools/zbstudio-win/api/lua/love2d.lua
new file mode 100644
index 0000000..4c8ee88
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/api/lua/love2d.lua
@@ -0,0 +1,6566 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+
+-- converted from love_api.lua in https://github.com/rm-code/love-api
+-- (API for LÖVE 0.10.0 as of Dec 23, 2015)
+-- Earlier versins used love_api.lua from http://love2d.org/forums/viewtopic.php?f=3&t=1796&start=50#p166908
+-- the conversion script is at the bottom of this file
+
+local love = {
+ childs = {
+ audio = {
+ childs = {
+ DistanceModel = {
+ childs = {
+ exponent = {
+ description = "Exponential attenuation.",
+ type = "value"
+ },
+ exponentclamped = {
+ description = "Exponential attenuation. Gain is clamped. In version 0.9.2 and older this is named exponent clamped.",
+ type = "value"
+ },
+ inverse = {
+ description = "Inverse distance attenuation.",
+ type = "value"
+ },
+ inverseclamped = {
+ description = "Inverse distance attenuation. Gain is clamped. In version 0.9.2 and older this is named inverse clamped.",
+ type = "value"
+ },
+ linear = {
+ description = "Linear attenuation.",
+ type = "value"
+ },
+ linearclamped = {
+ description = "Linear attenuation. Gain is clamped. In version 0.9.2 and older this is named linear clamped.",
+ type = "value"
+ },
+ none = {
+ description = "Sources do not get attenuated.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ Source = {
+ childs = {
+ getAttenuationDistances = {
+ args = "()",
+ description = "Returns the reference and maximum distance of the source.",
+ returns = "(ref: number, max: number)",
+ type = "function"
+ },
+ getChannels = {
+ args = "()",
+ description = "Gets the number of channels in the Source. Only 1-channel (mono) Sources can use directional and positional effects.",
+ returns = "(channels: number)",
+ type = "function"
+ },
+ getCone = {
+ args = "()",
+ description = "Gets the Source's directional volume cones. Together with Source:setDirection, the cone angles allow for the Source's volume to vary depending on its direction.",
+ returns = "(innerAngle: number, outerAngle: number, outerVolume: number)",
+ type = "function"
+ },
+ getDirection = {
+ args = "()",
+ description = "Gets the direction of the Source.",
+ returns = "(x: number, y: number, z: number)",
+ type = "function"
+ },
+ getDuration = {
+ args = "(unit: TimeUnit)",
+ description = "Gets the duration of the Source. For streaming Sources it may not always be sample-accurate, and may return -1 if the duration cannot be determined at all.",
+ returns = "(duration: number)",
+ type = "function"
+ },
+ getPitch = {
+ args = "()",
+ description = "Gets the current pitch of the Source.",
+ returns = "(pitch: number)",
+ type = "function"
+ },
+ getPosition = {
+ args = "()",
+ description = "Gets the position of the Source.",
+ returns = "(x: number, y: number, z: number)",
+ type = "function"
+ },
+ getRolloff = {
+ args = "()",
+ description = "Returns the rolloff factor of the source.",
+ returns = "(rolloff: number)",
+ type = "function"
+ },
+ getType = {
+ args = "()",
+ description = "Gets the type (static or stream) of the Source.",
+ returns = "(sourcetype: SourceType)",
+ type = "function"
+ },
+ getVelocity = {
+ args = "()",
+ description = "Gets the velocity of the Source.",
+ returns = "(x: number, y: number, z: number)",
+ type = "function"
+ },
+ getVolume = {
+ args = "()",
+ description = "Gets the current volume of the Source.",
+ returns = "(volume: number)",
+ type = "function"
+ },
+ getVolumeLimits = {
+ args = "()",
+ description = "Returns the volume limits of the source.",
+ returns = "(min: number, max: number)",
+ type = "function"
+ },
+ isLooping = {
+ args = "()",
+ description = "Returns whether the Source will loop.",
+ returns = "(loop: boolean)",
+ type = "function"
+ },
+ isPaused = {
+ args = "()",
+ description = "Returns whether the Source is paused.",
+ returns = "(paused: boolean)",
+ type = "function"
+ },
+ isPlaying = {
+ args = "()",
+ description = "Returns whether the Source is playing.",
+ returns = "(playing: boolean)",
+ type = "function"
+ },
+ isStopped = {
+ args = "()",
+ description = "Returns whether the Source is stopped.",
+ returns = "(stopped: boolean)",
+ type = "function"
+ },
+ pause = {
+ args = "()",
+ description = "Pauses the Source.",
+ returns = "()",
+ type = "function"
+ },
+ play = {
+ args = "()",
+ description = "Starts playing the Source.",
+ returns = "(success: boolean)",
+ type = "function"
+ },
+ resume = {
+ args = "()",
+ description = "Resumes a paused Source.",
+ returns = "()",
+ type = "function"
+ },
+ rewind = {
+ args = "()",
+ description = "Rewinds a Source.",
+ returns = "()",
+ type = "function"
+ },
+ seek = {
+ args = "(position: number, unit: TimeUnit)",
+ description = "Sets the playing position of the Source.",
+ returns = "()",
+ type = "function"
+ },
+ setAttenuationDistances = {
+ args = "(ref: number, max: number)",
+ description = "Sets the reference and maximum distance of the source.",
+ returns = "()",
+ type = "function"
+ },
+ setCone = {
+ args = "(innerAngle: number, outerAngle: number, outerVolume: number)",
+ description = "Sets the Source's directional volume cones. Together with Source:setDirection, the cone angles allow for the Source's volume to vary depending on its direction.",
+ returns = "()",
+ type = "function"
+ },
+ setDirection = {
+ args = "(x: number, y: number, z: number)",
+ description = "Sets the direction vector of the Source. A zero vector makes the source non-directional.",
+ returns = "()",
+ type = "function"
+ },
+ setLooping = {
+ args = "(loop: boolean)",
+ description = "Sets whether the Source should loop.",
+ returns = "()",
+ type = "function"
+ },
+ setPitch = {
+ args = "(pitch: number)",
+ description = "Sets the pitch of the Source.",
+ returns = "()",
+ type = "function"
+ },
+ setPosition = {
+ args = "(x: number, y: number, z: number)",
+ description = "Sets the position of the Source.",
+ returns = "()",
+ type = "function"
+ },
+ setRolloff = {
+ args = "(rolloff: number)",
+ description = "Sets the rolloff factor.",
+ returns = "()",
+ type = "function"
+ },
+ setVelocity = {
+ args = "(x: number, y: number, z: number)",
+ description = "Sets the velocity of the Source.\n\nThis does not change the position of the Source, but is used to calculate the doppler effect.",
+ returns = "()",
+ type = "function"
+ },
+ setVolume = {
+ args = "(volume: number)",
+ description = "Sets the volume of the Source.",
+ returns = "()",
+ type = "function"
+ },
+ setVolumeLimits = {
+ args = "(min: number, max: number)",
+ description = "Sets the volume limits of the source. The limits have to be numbers from 0 to 1.",
+ returns = "()",
+ type = "function"
+ },
+ stop = {
+ args = "()",
+ description = "Stops a Source.",
+ returns = "()",
+ type = "function"
+ },
+ tell = {
+ args = "(unit: TimeUnit)",
+ description = "Gets the currently playing position of the Source.",
+ returns = "(position: number)",
+ type = "function"
+ }
+ },
+ description = "A Source represents audio you can play back. You can do interesting things with Sources, like set the volume, pitch, and its position relative to the listener.",
+ type = "lib"
+ },
+ SourceType = {
+ childs = {
+ static = {
+ description = "Decode the entire sound at once.",
+ type = "value"
+ },
+ stream = {
+ description = "Stream the sound; decode it gradually.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ TimeUnit = {
+ childs = {
+ samples = {
+ description = "Audio samples.",
+ type = "value"
+ },
+ seconds = {
+ description = "Regular seconds.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ getDopplerScale = {
+ args = "()",
+ description = "Gets the current global scale factor for velocity-based doppler effects.",
+ returns = "(scale: number)",
+ type = "function"
+ },
+ getOrientation = {
+ args = "()",
+ description = "Returns the orientation of the listener.",
+ returns = "(fx: number, fy: number, fz: number, ux: number, uy: number, uz: number)",
+ type = "function"
+ },
+ getPosition = {
+ args = "()",
+ description = "Returns the position of the listener.",
+ returns = "(x: number, y: number, z: number)",
+ type = "function"
+ },
+ getSourceCount = {
+ args = "()",
+ description = "Returns the number of sources which are currently playing or paused.",
+ returns = "(numSources: number)",
+ type = "function"
+ },
+ getVelocity = {
+ args = "()",
+ description = "Returns the velocity of the listener.",
+ returns = "(x: number, y: number, z: number)",
+ type = "function"
+ },
+ getVolume = {
+ args = "()",
+ description = "Returns the master volume.",
+ returns = "(volume: number)",
+ type = "function"
+ },
+ newSource = {
+ args = "(filename: string, type: SourceType)",
+ description = "Creates a new Source from a file or SoundData. Sources created from SoundData are always static.",
+ returns = "(source: Source)",
+ type = "function"
+ },
+ pause = {
+ args = "(source: Source)",
+ description = "Pauses all audio",
+ returns = "()",
+ type = "function"
+ },
+ play = {
+ args = "(source: Source)",
+ description = "Plays the specified Source.",
+ returns = "()",
+ type = "function"
+ },
+ resume = {
+ args = "(source: Source)",
+ description = "Resumes all audio",
+ returns = "()",
+ type = "function"
+ },
+ rewind = {
+ args = "(source: Source)",
+ description = "Rewinds all playing audio.",
+ returns = "()",
+ type = "function"
+ },
+ setDistanceModel = {
+ args = "(model: DistanceModel)",
+ description = "Sets the distance attenuation model.",
+ returns = "()",
+ type = "function"
+ },
+ setDopplerScale = {
+ args = "(scale: number)",
+ description = "Sets a global scale factor for velocity-based doppler effects. The default scale value is 1.",
+ returns = "()",
+ type = "function"
+ },
+ setOrientation = {
+ args = "(fx: number, fy: number, fz: number, ux: number, uy: number, uz: number)",
+ description = "Sets the orientation of the listener.",
+ returns = "()",
+ type = "function"
+ },
+ setPosition = {
+ args = "(x: number, y: number, z: number)",
+ description = "Sets the position of the listener, which determines how sounds play.",
+ returns = "()",
+ type = "function"
+ },
+ setVelocity = {
+ args = "(x: number, y: number, z: number)",
+ description = "Sets the velocity of the listener.",
+ returns = "()",
+ type = "function"
+ },
+ setVolume = {
+ args = "(volume: number)",
+ description = "Sets the master volume.",
+ returns = "()",
+ type = "function"
+ },
+ stop = {
+ args = "(source: Source)",
+ description = "Stops all playing audio.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Provides an interface to create noise with the user's speakers.",
+ type = "class"
+ },
+ directorydropped = {
+ args = "(path: string)",
+ description = "Callback function triggered when a directory is dragged and dropped onto the window.",
+ returns = "()",
+ type = "function"
+ },
+ draw = {
+ args = "()",
+ description = "Callback function used to draw on the screen every frame.",
+ returns = "()",
+ type = "function"
+ },
+ errhand = {
+ args = "(msg: string)",
+ description = "The error handler, used to display error messages.",
+ returns = "()",
+ type = "function"
+ },
+ event = {
+ childs = {
+ Event = {
+ childs = {
+ focus = {
+ description = "Window focus gained or lost",
+ type = "value"
+ },
+ joystickaxis = {
+ description = "Joystick axis motion",
+ type = "value"
+ },
+ joystickhat = {
+ description = "Joystick hat pressed",
+ type = "value"
+ },
+ joystickpressed = {
+ description = "Joystick pressed",
+ type = "value"
+ },
+ joystickreleased = {
+ description = "Joystick released",
+ type = "value"
+ },
+ keypressed = {
+ description = "Key pressed",
+ type = "value"
+ },
+ keyreleased = {
+ description = "Key released",
+ type = "value"
+ },
+ mousefocus = {
+ description = "Window mouse focus gained or lost",
+ type = "value"
+ },
+ mousepressed = {
+ description = "Mouse pressed",
+ type = "value"
+ },
+ mousereleased = {
+ description = "Mouse released",
+ type = "value"
+ },
+ quit = {
+ description = "Quit",
+ type = "value"
+ },
+ resize = {
+ description = "Window size changed by the user",
+ type = "value"
+ },
+ threaderror = {
+ description = "A Lua error has occurred in a thread.",
+ type = "value"
+ },
+ visible = {
+ description = "Window is minimized or un-minimized by the user",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ poll = {
+ args = "()",
+ description = "Returns an iterator for messages in the event queue.",
+ returns = "(i: function)",
+ type = "function"
+ },
+ pump = {
+ args = "()",
+ description = "Pump events into the event queue. This is a low-level function, and is usually not called by the user, but by love.run. Note that this does need to be called for any OS to think you're still running, and if you want to handle OS-generated events at all (think callbacks). love.event.pump can only be called from the main thread, but afterwards, the rest of love.event can be used from any other thread.",
+ returns = "()",
+ type = "function"
+ },
+ push = {
+ args = "(e: Event, a: mixed, b: mixed, c: mixed, d: mixed)",
+ description = "Adds an event to the event queue.",
+ returns = "()",
+ type = "function"
+ },
+ quit = {
+ args = "()",
+ description = "Adds the quit event to the queue.\n\nThe quit event is a signal for the event handler to close LÖVE. It's possible to abort the exit process with the love.quit callback.",
+ returns = "()",
+ type = "function"
+ },
+ wait = {
+ args = "()",
+ description = "Like love.event.poll but blocks until there is an event in the queue.",
+ returns = "(e: Event, a: mixed, b: mixed, c: mixed, d: mixed)",
+ type = "function"
+ }
+ },
+ description = "Manages events, like keypresses.",
+ type = "lib"
+ },
+ filedropped = {
+ args = "(file: File)",
+ description = "Callback function triggered when a file is dragged and dropped onto the window.",
+ returns = "()",
+ type = "function"
+ },
+ filesystem = {
+ childs = {
+ BufferMode = {
+ childs = {
+ full = {
+ description = "Full buffering. Write and append operations are always buffered until the buffer size limit is reached.",
+ type = "value"
+ },
+ line = {
+ description = "Line buffering. Write and append operations are buffered until a newline is output or the buffer size limit is reached.",
+ type = "value"
+ },
+ none = {
+ description = "No buffering. The result of write and append operations appears immediately.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ File = {
+ childs = {
+ flush = {
+ args = "()",
+ description = "Flushes any buffered written data in the file to the disk.",
+ returns = "(success: boolean, err: string)",
+ type = "function"
+ },
+ getBuffer = {
+ args = "()",
+ description = "Gets the buffer mode of a file.",
+ returns = "(mode: BufferMode, size: number)",
+ type = "function"
+ },
+ getMode = {
+ args = "()",
+ description = "Gets the FileMode the file has been opened with.",
+ returns = "(mode: FileMode)",
+ type = "function"
+ },
+ getSize = {
+ args = "()",
+ description = "Returns the file size.",
+ returns = "(size: number)",
+ type = "function"
+ },
+ isEOF = {
+ args = "()",
+ description = "Gets whether end-of-file has been reached.",
+ returns = "(eof: boolean)",
+ type = "function"
+ },
+ isOpen = {
+ args = "()",
+ description = "Gets whether the file is open.",
+ returns = "(open: boolean)",
+ type = "function"
+ },
+ lines = {
+ args = "()",
+ description = "Iterate over all the lines in a file",
+ returns = "(iterator: function)",
+ type = "function"
+ },
+ open = {
+ args = "(mode: FileMode)",
+ description = "Open the file for write, read or append.\n\nIf you are getting the error message \"Could not set write directory\", try setting the save directory. This is done either with love.filesystem.setIdentity or by setting the identity field in love.conf.",
+ returns = "(ok: boolean)",
+ type = "function"
+ },
+ read = {
+ args = "(bytes: number)",
+ description = "Read a number of bytes from a file.",
+ returns = "(contents: string, size: number)",
+ type = "function"
+ },
+ seek = {
+ args = "(position: number)",
+ description = "Seek to a position in a file.",
+ returns = "(success: boolean)",
+ type = "function"
+ },
+ setBuffer = {
+ args = "(mode: BufferMode, size: number)",
+ description = "Sets the buffer mode for a file opened for writing or appending. Files with buffering enabled will not write data to the disk until the buffer size limit is reached, depending on the buffer mode.",
+ returns = "(success: boolean, errorstr: string)",
+ type = "function"
+ },
+ write = {
+ args = "(data: string, size: number)",
+ description = "Write data to a file.",
+ returns = "(success: boolean)",
+ type = "function"
+ }
+ },
+ description = "Represents a file on the filesystem.",
+ type = "lib"
+ },
+ FileData = {
+ childs = {
+ getFilename = {
+ args = "()",
+ description = "Gets the filename of the FileData.",
+ returns = "(name: string)",
+ type = "function"
+ }
+ },
+ description = "Data representing the contents of a file.",
+ type = "lib"
+ },
+ FileDecoder = {
+ childs = {
+ base64 = {
+ description = "The data is base64-encoded.",
+ type = "value"
+ },
+ file = {
+ description = "The data is unencoded.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ FileMode = {
+ childs = {
+ a = {
+ description = "Open a file for append.",
+ type = "value"
+ },
+ c = {
+ description = "Do not open a file (represents a closed file.)",
+ type = "value"
+ },
+ r = {
+ description = "Open a file for read.",
+ type = "value"
+ },
+ w = {
+ description = "Open a file for write.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ areSymlinksEnabled = {
+ args = "()",
+ description = "Gets whether love.filesystem follows symbolic links.",
+ returns = "(enable: boolean)",
+ type = "function"
+ },
+ createDirectory = {
+ args = "(name: string)",
+ description = "Creates a directory.",
+ returns = "(ok: boolean)",
+ type = "function"
+ },
+ exists = {
+ args = "(filename: string)",
+ description = "Check whether a file or directory exists.",
+ returns = "(e: boolean)",
+ type = "function"
+ },
+ getAppdataDirectory = {
+ args = "()",
+ description = "Returns the application data directory (could be the same as getUserDirectory)",
+ returns = "(path: string)",
+ type = "function"
+ },
+ getDirectoryItems = {
+ args = "(dir: string)",
+ description = "Returns a table with the names of files and subdirectories in the specified path. The table is not sorted in any way; the order is undefined.\n\nIf the path passed to the function exists in the game and the save directory, it will list the files and directories from both places.",
+ returns = "(items: table)",
+ type = "function"
+ },
+ getIdentity = {
+ args = "(name: string)",
+ description = "Gets the write directory name for your game. Note that this only returns the name of the folder to store your files in, not the full location.",
+ returns = "()",
+ type = "function"
+ },
+ getLastModified = {
+ args = "(filename: string)",
+ description = "Gets the last modification time of a file.",
+ returns = "(modtime: number, errormsg: string)",
+ type = "function"
+ },
+ getRealDirectory = {
+ args = "(filepath: string)",
+ description = "Gets the platform-specific absolute path of the directory containing a filepath.\n\nThis can be used to determine whether a file is inside the save directory or the game's source .love.",
+ returns = "(realdir: string)",
+ type = "function"
+ },
+ getRequirePath = {
+ args = "()",
+ description = "Gets the filesystem paths that will be searched when require is called.\n\nThe paths string returned by this function is a sequence of path templates separated by semicolons. The argument passed to require will be inserted in place of any question mark (\"?\") character in each template (after the dot characters in the argument passed to require are replaced by directory separators.)\n\nThe paths are relative to the game's source and save directories, as well as any paths mounted with love.filesystem.mount.",
+ returns = "(paths: string)",
+ type = "function"
+ },
+ getSaveDirectory = {
+ args = "()",
+ description = "Gets the full path to the designated save directory. This can be useful if you want to use the standard io library (or something else) to read or write in the save directory.",
+ returns = "(path: string)",
+ type = "function"
+ },
+ getSize = {
+ args = "(filename: string)",
+ description = "Gets the size in bytes of a file.",
+ returns = "(size: number, errormsg: string)",
+ type = "function"
+ },
+ getSourceBaseDirectory = {
+ args = "()",
+ description = "Returns the full path to the directory containing the .love file. If the game is fused to the LÖVE executable, then the directory containing the executable is returned.\n\nIf love.filesystem.isFused is true, the path returned by this function can be passed to love.filesystem.mount, which will make the directory containing the main game readable by love.filesystem.",
+ returns = "(path: string)",
+ type = "function"
+ },
+ getUserDirectory = {
+ args = "()",
+ description = "Returns the path of the user's directory.",
+ returns = "(path: string)",
+ type = "function"
+ },
+ getWorkingDirectory = {
+ args = "()",
+ description = "Gets the current working directory.",
+ returns = "(path: string)",
+ type = "function"
+ },
+ isDirectory = {
+ args = "(path: string)",
+ description = "Check whether something is a directory.",
+ returns = "(is_dir: boolean)",
+ type = "function"
+ },
+ isFile = {
+ args = "(path: string)",
+ description = "Check whether something is a file.",
+ returns = "(is_file: boolean)",
+ type = "function"
+ },
+ isFused = {
+ args = "()",
+ description = "Gets whether the game is in fused mode or not.\n\nIf a game is in fused mode, its save directory will be directly in the Appdata directory instead of Appdata/LOVE/. The game will also be able to load C Lua dynamic libraries which are located in the save directory.\n\nA game is in fused mode if the source .love has been fused to the executable (see Game Distribution), or if \"--fused\" has been given as a command-line argument when starting the game.",
+ returns = "(fused: boolean)",
+ type = "function"
+ },
+ isSymlink = {
+ args = "(path: string)",
+ description = "Gets whether a filepath is actually a symbolic link.\n\nIf symbolic links are not enabled (via love.filesystem.setSymlinksEnabled), this function will always return false.",
+ returns = "(symlink: boolean)",
+ type = "function"
+ },
+ lines = {
+ args = "(name: string)",
+ description = "Iterate over the lines in a file.",
+ returns = "(iterator: function)",
+ type = "function"
+ },
+ load = {
+ args = "(name: string)",
+ description = "Load a file (but not run it).",
+ returns = "(chunk: function)",
+ type = "function"
+ },
+ mount = {
+ args = "(archive: string, mountpoint: string)",
+ description = "Mounts a zip file or folder in the game's save directory for reading.",
+ returns = "(success: boolean)",
+ type = "function"
+ },
+ newFile = {
+ args = "(filename: string, mode: FileMode)",
+ description = "Creates a new File object. It needs to be opened before it can be accessed.",
+ returns = "(file: File, errorstr: string)",
+ type = "function"
+ },
+ newFileData = {
+ args = "(contents: string, name: string, decoder: FileDecoder)",
+ description = "Creates a new FileData object.",
+ returns = "(data: FileData)",
+ type = "function"
+ },
+ read = {
+ args = "(name: string, bytes: number)",
+ description = "Read the contents of a file.",
+ returns = "(contents: string, size: number)",
+ type = "function"
+ },
+ remove = {
+ args = "(name: string)",
+ description = "Removes a file or directory.",
+ returns = "(ok: boolean)",
+ type = "function"
+ },
+ setIdentity = {
+ args = "(name: string, searchorder: SearchOrder)",
+ description = "Sets the write directory for your game. Note that you can only set the name of the folder to store your files in, not the location.",
+ returns = "()",
+ type = "function"
+ },
+ setRequirePath = {
+ args = "(paths: string)",
+ description = "Sets the filesystem paths that will be searched when require is called.\n\nThe paths string given to this function is a sequence of path templates separated by semicolons. The argument passed to require will be inserted in place of any question mark (\"?\") character in each template (after the dot characters in the argument passed to require are replaced by directory separators.)\n\nThe paths are relative to the game's source and save directories, as well as any paths mounted with love.filesystem.mount.",
+ returns = "()",
+ type = "function"
+ },
+ setSource = {
+ args = "(path: string)",
+ description = "Sets the source of the game, where the code is present. This function can only be called once, and is normally automatically done by LÖVE.",
+ returns = "()",
+ type = "function"
+ },
+ setSymlinksEnabled = {
+ args = "(enable: boolean)",
+ description = "Sets whether love.filesystem follows symbolic links. Sets whether love.filesystem follows symbolic links. It is enabled by default in version 0.10.0 and newer, and disabled by default in 0.9.2.",
+ returns = "()",
+ type = "function"
+ },
+ unmount = {
+ args = "(archive: string)",
+ description = "Unmounts a zip file or folder previously mounted for reading with love.filesystem.mount.",
+ returns = "(success: boolean)",
+ type = "function"
+ },
+ write = {
+ args = "(name: string, data: string, size: number)",
+ description = "Write data to a file.\n\nIf you are getting the error message \"Could not set write directory\", try setting the save directory. This is done either with love.filesystem.setIdentity or by setting the identity field in love.conf.",
+ returns = "(success: boolean)",
+ type = "function"
+ }
+ },
+ description = "Provides an interface to the user's filesystem.",
+ type = "class"
+ },
+ focus = {
+ args = "(f: boolean)",
+ description = "Callback function triggered when window receives or loses focus.",
+ returns = "()",
+ type = "function"
+ },
+ gamepadaxis = {
+ args = "(joystick: Joystick, axis: GamepadAxis)",
+ description = "Called when a Joystick's virtual gamepad axis is moved.",
+ returns = "()",
+ type = "function"
+ },
+ gamepadpressed = {
+ args = "(joystick: Joystick, button: GamepadButton)",
+ description = "Called when a Joystick's virtual gamepad button is pressed.",
+ returns = "()",
+ type = "function"
+ },
+ gamepadreleased = {
+ args = "(joystick: Joystick, button: GamepadButton)",
+ description = "Called when a Joystick's virtual gamepad button is released.",
+ returns = "()",
+ type = "function"
+ },
+ getVersion = {
+ args = "()",
+ description = "Gets the current running version of LÖVE.",
+ returns = "(major: number, minor: number, revision: number, codename: string)",
+ type = "function"
+ },
+ graphics = {
+ childs = {
+ AlignMode = {
+ childs = {
+ center = {
+ description = "Align text center.",
+ type = "value"
+ },
+ left = {
+ description = "Align text left.",
+ type = "value"
+ },
+ right = {
+ description = "Align text right.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ AreaSpreadDistribution = {
+ childs = {
+ none = {
+ description = "No distribution - area spread is disabled.",
+ type = "value"
+ },
+ normal = {
+ description = "Normal (gaussian) distribution.",
+ type = "value"
+ },
+ uniform = {
+ description = "Uniform distribution.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ BlendMode = {
+ childs = {
+ add = {
+ description = "The pixel colors of what's drawn are added to the pixel colors already on the screen. The alpha of the screen is not modified.",
+ type = "value"
+ },
+ alpha = {
+ description = "Alpha blending (normal). The alpha of what's drawn determines its opacity.",
+ type = "value"
+ },
+ multiply = {
+ description = "The pixel colors of what's drawn are multiplied with the pixel colors already on the screen (darkening them). The alpha of drawn objects is multiplied with the alpha of the screen rather than determining how much the colors on the screen are affected, even when the \"alphamultiply\" BlendAlphaMode is used.",
+ type = "value"
+ },
+ replace = {
+ description = "The colors of what's drawn completely replace what was on the screen, with no additional blending.",
+ type = "value"
+ },
+ screen = {
+ description = "\"Screen\" blending.",
+ type = "value"
+ },
+ subtract = {
+ description = "The pixel colors of what's drawn are subtracted from the pixel colors already on the screen. The alpha of the screen is not modified.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ Canvas = {
+ childs = {
+ getFilter = {
+ args = "()",
+ description = "Gets the filter mode of the Canvas.",
+ returns = "(min: FilterMode, mag: FilterMode, anisotropy: number)",
+ type = "function"
+ },
+ getFormat = {
+ args = "()",
+ description = "Gets the texture format of the Canvas.",
+ returns = "(format: CanvasFormat)",
+ type = "function"
+ },
+ getHeight = {
+ args = "()",
+ description = "Gets the height of the Canvas.",
+ returns = "(height: number)",
+ type = "function"
+ },
+ getMSAA = {
+ args = "()",
+ description = "Gets the number of multisample antialiasing (MSAA) samples used when drawing to the Canvas.\n\nThis may be different than the number used as an argument to love.graphics.newCanvas if the system running LÖVE doesn't support that number.",
+ returns = "(samples: number)",
+ type = "function"
+ },
+ getWidth = {
+ args = "()",
+ description = "Gets the width of the Canvas.",
+ returns = "(width: number)",
+ type = "function"
+ },
+ getWrap = {
+ args = "()",
+ description = "Gets the wrapping properties of a Canvas.\n\nThis function returns the currently set horizontal and vertical wrapping modes for the Canvas.",
+ returns = "(horizontal: WrapMode, vertical: WrapMode)",
+ type = "function"
+ },
+ isActive = {
+ args = "()",
+ description = "Gets whether the graphics module is able to be used. If it is not active, love.graphics function and method calls will not work correctly and may cause the program to crash. The graphics module is inactive if a window is not open, or if the app is in the background on iOS. Typically the app's execution will be automatically paused by the system, in the latter case.",
+ returns = "()",
+ type = "function"
+ },
+ newImageData = {
+ args = "(x: number, y: number, width: number, height: number)",
+ description = "Generates ImageData from the contents of the Canvas.",
+ returns = "(data: ImageData)",
+ type = "function"
+ },
+ renderTo = {
+ args = "(func: function)",
+ description = "Render to the Canvas using a function.",
+ returns = "()",
+ type = "function"
+ },
+ setFilter = {
+ args = "(min: FilterMode, mag: FilterMode, anisotropy: number)",
+ description = "Sets the filter of the Canvas.",
+ returns = "()",
+ type = "function"
+ },
+ setWrap = {
+ args = "(horizontal: WrapMode, vertical: WrapMode)",
+ description = "Sets the wrapping properties of a Canvas.\n\nThis function sets the way the edges of a Canvas are treated if it is scaled or rotated. If the WrapMode is set to \"clamp\", the edge will not be interpolated. If set to \"repeat\", the edge will be interpolated with the pixels on the opposing side of the framebuffer.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "A Canvas is used for off-screen rendering. Think of it as an invisible screen that you can draw to, but that will not be visible until you draw it to the actual visible screen. It is also known as \"render to texture\".\n\nBy drawing things that do not change position often (such as background items) to the Canvas, and then drawing the entire Canvas instead of each item, you can reduce the number of draw operations performed each frame.",
+ type = "lib"
+ },
+ CanvasFormat = {
+ childs = {
+ hdr = {
+ description = "A format suitable for high dynamic range content - an alias for the rgba16f format, normally.",
+ type = "value"
+ },
+ normal = {
+ description = "The default Canvas format - usually an alias for the rgba8 format, or the srgb format if gamma-correct rendering is enabled in LÖVE 0.10.0 and newer.",
+ type = "value"
+ },
+ r8 = {
+ description = "Single-channel (red component) format (8 bpp.)",
+ type = "value"
+ },
+ r16f = {
+ description = "Floating point single-channel format (16 bpp.) Color values can range from [-65504, +65504].",
+ type = "value"
+ },
+ r32f = {
+ description = "Floating point single-channel format (32 bpp.) Color values can range from [-65504, +65504].",
+ type = "value"
+ },
+ rg8 = {
+ description = "Two channels (red and green components) with 8 bits per channel (16 bpp.)",
+ type = "value"
+ },
+ rg11b10f = {
+ description = "Floating point RGB with 11 bits in the red and green channels, and 10 bits in the blue channel (32 bpp.) There is no alpha channel. Color values can range from [0, +65024].",
+ type = "value"
+ },
+ rg16f = {
+ description = "Floating point two-channel format with 16 bits per channel (32 bpp.) Color values can range from [-65504, +65504].",
+ type = "value"
+ },
+ rg32f = {
+ description = "Floating point two-channel format with 32 bits per channel (64 bpp.) Color values can range from [-65504, +65504].",
+ type = "value"
+ },
+ rgb5a1 = {
+ description = "RGB with 5 bits each, and a 1-bit alpha channel (16 bpp.)",
+ type = "value"
+ },
+ rgb10a2 = {
+ description = "RGB with 10 bits per channel, and a 2-bit alpha channel (32 bpp.)",
+ type = "value"
+ },
+ rgb565 = {
+ description = "RGB with 5, 6, and 5 bits each, respectively (16 bpp). There is no alpha channel in this format.",
+ type = "value"
+ },
+ rgba4 = {
+ description = "4 bits per channel (16 bpp) RGBA.",
+ type = "value"
+ },
+ rgba8 = {
+ description = "8 bits per channel (32 bpp) RGBA. Color channel values range from 0-255 (0-1 in shaders.)",
+ type = "value"
+ },
+ rgba16f = {
+ description = "Floating point RGBA with 16 bits per channel (64 bpp.) Color values can range from [-65504, +65504].",
+ type = "value"
+ },
+ rgba32f = {
+ description = "Floating point RGBA with 32 bits per channel (128 bpp.) Color values can range from [-65504, +65504].",
+ type = "value"
+ },
+ srgb = {
+ description = "The same as rgba8, but the Canvas is interpreted as being in the sRGB color space. Everything drawn to the Canvas will be converted from linear RGB to sRGB. When the Canvas is drawn (or used in a shader), it will be decoded from sRGB to linear RGB. This reduces color banding when doing gamma-correct rendering, since sRGB encoding has more precision than linear RGB for darker colors.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ DrawMode = {
+ childs = {
+ fill = {
+ description = "Draw filled shape.",
+ type = "value"
+ },
+ line = {
+ description = "Draw outlined shape.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ FilterMode = {
+ childs = {
+ linear = {
+ description = "Scale image with linear interpolation.",
+ type = "value"
+ },
+ nearest = {
+ description = "Scale image with nearest neighbor interpolation.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ Font = {
+ childs = {
+ getBaseline = {
+ args = "()",
+ description = "Gets the baseline of the Font. Most scripts share the notion of a baseline: an imaginary horizontal line on which characters rest. In some scripts, parts of glyphs lie below the baseline.",
+ returns = "(baseline: number)",
+ type = "function"
+ },
+ getDescent = {
+ args = "()",
+ description = "Gets the descent of the Font. The descent spans the distance between the baseline and the lowest descending glyph in a typeface.",
+ returns = "(descent: number)",
+ type = "function"
+ },
+ getFilter = {
+ args = "()",
+ description = "Gets the filter mode for a font.",
+ returns = "(min: FilterMode, mag: FilterMode, anisotropy: number)",
+ type = "function"
+ },
+ getHeight = {
+ args = "()",
+ description = "Gets the height of the Font. The height of the font is the size including any spacing; the height which it will need.",
+ returns = "(height: number)",
+ type = "function"
+ },
+ getLineHeight = {
+ args = "()",
+ description = "Gets the line height. This will be the value previously set by Font:setLineHeight, or 1.0 by default.",
+ returns = "(height: number)",
+ type = "function"
+ },
+ getWidth = {
+ args = "(line: string)",
+ description = "Determines the horizontal size a line of text needs. Does not support line-breaks.",
+ returns = "(width: number)",
+ type = "function"
+ },
+ getWrap = {
+ args = "(text: string, wraplimit: number)",
+ description = "Gets formatting information for text, given a wrap limit.\n\nThis function accounts for newlines correctly (i.e. '\\n').",
+ returns = "(width: number, wrappedtext: table)",
+ type = "function"
+ },
+ hasGlyph = {
+ args = "(character: string)",
+ description = "Gets whether the font can render a particular character.",
+ returns = "(hasglyph: boolean)",
+ type = "function"
+ },
+ setFallbacks = {
+ args = "(fallbackfont1: Font, ...: Font)",
+ description = "Sets other Fonts to use if this Font doesn't have a specific character. When that happens, the glyph from the first fallback Font to have the character will be used, instead of a blank box or other 'no character' symbol being used.",
+ returns = "()",
+ type = "function"
+ },
+ setFilter = {
+ args = "(min: FilterMode, mag: FilterMode, anisotropy: number)",
+ description = "Sets the filter mode for a font.",
+ returns = "()",
+ type = "function"
+ },
+ setLineHeight = {
+ args = "(height: number)",
+ description = "Sets the line height. When rendering the font in lines the actual height will be determined by the line height multiplied by the height of the font. The default is 1.0.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Defines the shape of characters than can be drawn onto the screen.",
+ type = "lib"
+ },
+ GraphicsFeature = {
+ childs = {
+ clampzero = {
+ description = "Whether the \"clampzero\" WrapMode is supported.",
+ type = "value"
+ },
+ multicanvasformats = {
+ description = "Whether multiple Canvases with different formats can be used in the same love.graphics.setCanvas call.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ GraphicsLimit = {
+ childs = {
+ canvasmsaa = {
+ description = "The maximum number of antialiasing samples for a Canvas.",
+ type = "value"
+ },
+ multicanvas = {
+ description = "The maximum number of simultaneously active canvases (via love.graphics.setCanvas).",
+ type = "value"
+ },
+ pointsize = {
+ description = "The maximum size of points.",
+ type = "value"
+ },
+ texturesize = {
+ description = "The maximum width or height of Images and Canvases.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ Image = {
+ childs = {
+ getDimensions = {
+ args = "()",
+ description = "Gets the width and height of the Image.",
+ returns = "(width: number, height: number)",
+ type = "function"
+ },
+ getFilter = {
+ args = "()",
+ description = "Gets the filter mode for an image.",
+ returns = "(min: FilterMode, mag: FilterMode)",
+ type = "function"
+ },
+ getFlags = {
+ args = "()",
+ description = "Gets the flags used when the image was created.",
+ returns = "()",
+ type = "function"
+ },
+ getHeight = {
+ args = "()",
+ description = "Gets the height of the Image.",
+ returns = "(height: number)",
+ type = "function"
+ },
+ getMipmapFilter = {
+ args = "()",
+ description = "Gets the mipmap filter mode for an Image.",
+ returns = "(mode: FilterMode, sharpness: number)",
+ type = "function"
+ },
+ getWidth = {
+ args = "()",
+ description = "Gets the width of the Image.",
+ returns = "(width: number)",
+ type = "function"
+ },
+ getWrap = {
+ args = "()",
+ description = "Gets the wrapping properties of an Image.\n\nThis function returns the currently set horizontal and vertical wrapping modes for the image.",
+ returns = "(horizontal: WrapMode, vertical: WrapMode)",
+ type = "function"
+ },
+ refresh = {
+ args = "(x: number, y: number, width: number, height: number)",
+ description = "Reloads the Image's contents from the ImageData or CompressedData used to create the image.",
+ returns = "()",
+ type = "function"
+ },
+ setFilter = {
+ args = "(min: FilterMode, mag: FilterMode)",
+ description = "Sets the filter mode for an image.",
+ returns = "()",
+ type = "function"
+ },
+ setMipmapFilter = {
+ args = "(filtermode: FilterMode, sharpness: number)",
+ description = "Sets the mipmap filter mode for an Image.\n\nMipmapping is useful when drawing an image at a reduced scale. It can improve performance and reduce aliasing issues.\n\nIn 0.10.0 and newer, the Image must be created with the mipmaps flag enabled for the mipmap filter to have any effect.",
+ returns = "()",
+ type = "function"
+ },
+ setWrap = {
+ args = "(horizontal: WrapMode, vertical: WrapMode)",
+ description = "Sets the wrapping properties of an Image.\n\nThis function sets the way an Image is repeated when it is drawn with a Quad that is larger than the image's extent. An image may be clamped or set to repeat in both horizontal and vertical directions. Clamped images appear only once, but repeated ones repeat as many times as there is room in the Quad.\n\nIf you use a Quad that is larger than the image extent and do not use repeated tiling, there may be an unwanted visual effect of the image stretching all the way to fill the Quad. If this is the case, setting Image:getWrap(\"repeat\", \"repeat\") for all the images to be repeated, and using Quad of appropriate size will result in the best visual appearance.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Drawable image type.",
+ type = "lib"
+ },
+ LineJoin = {
+ childs = {
+ bevel = {
+ description = "Bevel style.",
+ type = "value"
+ },
+ miter = {
+ description = "Miter style.",
+ type = "value"
+ },
+ none = {
+ description = "None style.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ LineStyle = {
+ childs = {
+ rough = {
+ description = "Draw rough lines.",
+ type = "value"
+ },
+ smooth = {
+ description = "Draw smooth lines.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ Mesh = {
+ childs = {
+ getDrawMode = {
+ args = "()",
+ description = "Gets the mode used when drawing the Mesh.",
+ returns = "(mode: MeshDrawMode)",
+ type = "function"
+ },
+ getDrawRange = {
+ args = "()",
+ description = "Gets the range of vertices used when drawing the Mesh.\n\nIf the Mesh's draw range has not been set previously with Mesh:setDrawRange, this function will return nil.",
+ returns = "(min: number, max: number)",
+ type = "function"
+ },
+ getTexture = {
+ args = "()",
+ description = "Gets the texture (Image or Canvas) used when drawing the Mesh.",
+ returns = "(texture: Texture)",
+ type = "function"
+ },
+ getVertex = {
+ args = "(index: number)",
+ description = "Gets the properties of a vertex in the Mesh.",
+ returns = "(attributecomponent: number, ...: number)",
+ type = "function"
+ },
+ getVertexAttribute = {
+ args = "(vertexindex: number, attributeindex: number)",
+ description = "Gets the properties of a specific attribute within a vertex in the Mesh.\n\nMeshes without a custom vertex format specified in love.graphics.newMesh have position as their first attribute, texture coordinates as their second attribute, and color as their third attribute.",
+ returns = "(value1: number, value2: number, ...: number)",
+ type = "function"
+ },
+ getVertexCount = {
+ args = "()",
+ description = "Returns the total number of vertices in the Mesh.",
+ returns = "(num: number)",
+ type = "function"
+ },
+ getVertexFormat = {
+ args = "()",
+ description = "Gets the vertex format that the Mesh was created with.",
+ returns = "(format: table)",
+ type = "function"
+ },
+ getVertexMap = {
+ args = "()",
+ description = "Gets the vertex map for the Mesh. The vertex map describes the order in which the vertices are used when the Mesh is drawn. The vertices, vertex map, and mesh draw mode work together to determine what exactly is displayed on the screen.\n\nIf no vertex map has been set previously via Mesh:setVertexMap, then this function will return nil in LÖVE 0.10.0+, or an empty table in 0.9.2 and older.",
+ returns = "(vertex_map: table)",
+ type = "function"
+ },
+ isAttributeEnabled = {
+ args = "(name: string)",
+ description = "Gets whether a specific vertex attribute in the Mesh is enabled. Vertex data from disabled attributes is not used when drawing the Mesh.",
+ returns = "(enabled: boolean)",
+ type = "function"
+ },
+ setAttributeEnabled = {
+ args = "(name: string, enable: boolean)",
+ description = "Enables or disables a specific vertex attribute in the Mesh. Vertex data from disabled attributes is not used when drawing the Mesh.",
+ returns = "()",
+ type = "function"
+ },
+ setDrawMode = {
+ args = "(mode: MeshDrawMode)",
+ description = "Sets the mode used when drawing the Mesh.",
+ returns = "()",
+ type = "function"
+ },
+ setDrawRange = {
+ args = "(min: number, max: number)",
+ description = "Restricts the drawn vertices of the Mesh to a subset of the total.\n\nIf a vertex map is used with the Mesh, this method will set a subset of the values in the vertex map array to use, instead of a subset of the total vertices in the Mesh.\n\nFor example, if Mesh:setVertexMap(1, 2, 3, 1, 3, 4) and Mesh:setDrawRange(4, 6) are called, vertices 1, 3, and 4 will be drawn.",
+ returns = "()",
+ type = "function"
+ },
+ setTexture = {
+ args = "(texture: Texture)",
+ description = "Sets the texture (Image or Canvas) used when drawing the Mesh.\n\nWhen called without an argument disables the texture. Untextured meshes have a white color by default.",
+ returns = "()",
+ type = "function"
+ },
+ setVertex = {
+ args = "(index: number, attributecomponent: number, ...: number)",
+ description = "Sets the properties of a vertex in the Mesh.",
+ returns = "()",
+ type = "function"
+ },
+ setVertexAttribute = {
+ args = "(vertexindex: number, attributeindex: number, value1: number, value2: number, ...: number)",
+ description = "Sets the properties of a specific attribute within a vertex in the Mesh.\n\nMeshes without a custom vertex format specified in love.graphics.newMesh have position as their first attribute, texture coordinates as their second attribute, and color as their third attribute.",
+ returns = "()",
+ type = "function"
+ },
+ setVertexColors = {
+ args = "(on: boolean)",
+ description = "Sets if the per-vertex colors are used when rendering instead of the constant color (constant color being love.graphics.setColor or SpriteBatch:setColor)\n\nThe per-vertex colors are automatically enabled by default when making a new Mesh or when doing Mesh:setVertex, but only if at least one vertex color is not the default (255,255,255,255).",
+ returns = "()",
+ type = "function"
+ },
+ setVertexMap = {
+ args = "(vertex_map: table)",
+ description = "Sets the vertex map for a Mesh. The vertex map describes the order in which the vertices are used when the Mesh is drawn.\n\nThe vertex map allows you to re-order or reuse vertices when drawing without changing the actual vertex parameters or duplicating vertices. It is especially useful when combined with different Mesh draw modes.",
+ returns = "()",
+ type = "function"
+ },
+ setVertices = {
+ args = "(vertices: table, startvertex: number)",
+ description = "Replaces all vertices in the Mesh with new ones.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "A 2D polygon mesh used for drawing arbitrary textured shapes.",
+ type = "lib"
+ },
+ MeshDrawMode = {
+ childs = {
+ fan = {
+ description = "The vertices create a \"fan\" shape with the first vertex acting as the hub point. Can be easily used to draw simple convex polygons.",
+ type = "value"
+ },
+ points = {
+ description = "The vertices are drawn as unconnected points (see love.graphics.setPointSize.)",
+ type = "value"
+ },
+ strip = {
+ description = "The vertices create a series of connected triangles using vertices 1, 2, 3, then 3, 2, 4 (note the order), then 3, 4, 5 and so on.",
+ type = "value"
+ },
+ triangles = {
+ description = "The vertices create unconnected triangles.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ ParticleInsertMode = {
+ childs = {
+ bottom = {
+ description = "Particles are inserted at the bottom of the ParticleSystem's list of particles.",
+ type = "value"
+ },
+ random = {
+ description = "Particles are inserted at random positions in the ParticleSystem's list of particles.",
+ type = "value"
+ },
+ top = {
+ description = "Particles are inserted at the top of the ParticleSystem's list of particles.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ ParticleSystem = {
+ childs = {
+ emit = {
+ args = "(numparticles: number)",
+ description = "Emits a burst of particles from the particle emitter.",
+ returns = "()",
+ type = "function"
+ },
+ getAreaSpread = {
+ args = "()",
+ description = "Gets the area-based spawn parameters for the particles.",
+ returns = "(distribution: AreaSpreadDistribution, dx: number, dy: number)",
+ type = "function"
+ },
+ getBufferSize = {
+ args = "()",
+ description = "Gets the size of the buffer (the max allowed amount of particles in the system).",
+ returns = "(buffer: number)",
+ type = "function"
+ },
+ getColors = {
+ args = "()",
+ description = "Gets a series of colors to apply to the particle sprite. The particle system will interpolate between each color evenly over the particle's lifetime. Color modulation needs to be activated for this function to have any effect.\n\nArguments are passed in groups of four, representing the components of the desired RGBA value. At least one color must be specified. A maximum of eight may be used.",
+ returns = "(r1: number, g1: number, b1: number, a1: number, r2: number, g2: number, b2: number, a2: number, ...: number)",
+ type = "function"
+ },
+ getCount = {
+ args = "()",
+ description = "Gets the amount of particles that are currently in the system.",
+ returns = "(count: number)",
+ type = "function"
+ },
+ getDirection = {
+ args = "()",
+ description = "Gets the direction the particles will be emitted in.",
+ returns = "(direction: number)",
+ type = "function"
+ },
+ getEmissionRate = {
+ args = "()",
+ description = "Gets the amount of particles emitted per second.",
+ returns = "(rate: number)",
+ type = "function"
+ },
+ getEmitterLifetime = {
+ args = "()",
+ description = "Gets how long the particle system should emit particles (if -1 then it emits particles forever).",
+ returns = "(life: number)",
+ type = "function"
+ },
+ getInsertMode = {
+ args = "()",
+ description = "Gets the mode to use when the ParticleSystem adds new particles.",
+ returns = "(mode: ParticleInsertMode)",
+ type = "function"
+ },
+ getLinearAcceleration = {
+ args = "()",
+ description = "Gets the linear acceleration (acceleration along the x and y axes) for particles.\n\nEvery particle created will accelerate along the x and y axes between xmin,ymin and xmax,ymax.",
+ returns = "(xmin: number, ymin: number, xmax: number, ymax: number)",
+ type = "function"
+ },
+ getLinearDamping = {
+ args = "()",
+ description = "Gets the amount of linear damping (constant deceleration) for particles.",
+ returns = "(min: number, max: number)",
+ type = "function"
+ },
+ getOffset = {
+ args = "()",
+ description = "Get the offget position which the particle sprite is rotated around. If this function is not used, the particles rotate around their center.",
+ returns = "(x: number, y: number)",
+ type = "function"
+ },
+ getParticleLifetime = {
+ args = "()",
+ description = "Gets the life of the particles.",
+ returns = "(min: number, max: number)",
+ type = "function"
+ },
+ getPosition = {
+ args = "()",
+ description = "Gets the position of the emitter.",
+ returns = "(x: number, y: number)",
+ type = "function"
+ },
+ getRadialAcceleration = {
+ args = "()",
+ description = "Get the radial acceleration (away from the emitter).",
+ returns = "(min: number, max: number)",
+ type = "function"
+ },
+ getRotation = {
+ args = "()",
+ description = "Gets the rotation of the image upon particle creation (in radians).",
+ returns = "(min: number, max: number)",
+ type = "function"
+ },
+ getSizeVariation = {
+ args = "()",
+ description = "Gets the degree of variation (0 meaning no variation and 1 meaning full variation between start and end).",
+ returns = "(variation: number)",
+ type = "function"
+ },
+ getSizes = {
+ args = "()",
+ description = "Gets a series of sizes by which to scale a particle sprite. 1.0 is normal size. The particle system will interpolate between each size evenly over the particle's lifetime.\n\nAt least one size must be specified. A maximum of eight may be used.",
+ returns = "(size1: number, size2: number, ...: number)",
+ type = "function"
+ },
+ getSpeed = {
+ args = "()",
+ description = "Gets the speed of the particles.",
+ returns = "(min: number, max: number)",
+ type = "function"
+ },
+ getSpin = {
+ args = "()",
+ description = "Gets the spin of the sprite.",
+ returns = "(min: number, max: number)",
+ type = "function"
+ },
+ getSpinVariation = {
+ args = "()",
+ description = "Gets the degree of variation (0 meaning no variation and 1 meaning full variation between start and end).",
+ returns = "(variation: number)",
+ type = "function"
+ },
+ getSpread = {
+ args = "()",
+ description = "Gets the amount of spread for the system.",
+ returns = "(spread: number)",
+ type = "function"
+ },
+ getTangentialAcceleration = {
+ args = "()",
+ description = "Gets the tangential acceleration (acceleration perpendicular to the particle's direction).",
+ returns = "(min: number, max: number)",
+ type = "function"
+ },
+ getTexture = {
+ args = "()",
+ description = "Gets the Image or Canvas which is to be emitted.",
+ returns = "(texture: Texture)",
+ type = "function"
+ },
+ hasRelativeRotation = {
+ args = "()",
+ description = "Gets whether particle angles and rotations are relative to their velocities. If enabled, particles are aligned to the angle of their velocities and rotate relative to that angle.",
+ returns = "(enabled: boolean)",
+ type = "function"
+ },
+ isActive = {
+ args = "()",
+ description = "Checks whether the particle system is actively emitting particles.",
+ returns = "(active: boolean)",
+ type = "function"
+ },
+ isPaused = {
+ args = "()",
+ description = "Checks whether the particle system is paused.",
+ returns = "(paused: boolean)",
+ type = "function"
+ },
+ isStopped = {
+ args = "()",
+ description = "Checks whether the particle system is stopped.",
+ returns = "(stopped: boolean)",
+ type = "function"
+ },
+ moveTo = {
+ args = "(x: number, y: number)",
+ description = "Moves the position of the emitter. This results in smoother particle spawning behaviour than if ParticleSystem:setPosition is used every frame.",
+ returns = "()",
+ type = "function"
+ },
+ pause = {
+ args = "()",
+ description = "Pauses the particle emitter.",
+ returns = "()",
+ type = "function"
+ },
+ reset = {
+ args = "()",
+ description = "Resets the particle emitter, removing any existing particles and resetting the lifetime counter.",
+ returns = "()",
+ type = "function"
+ },
+ setAreaSpread = {
+ args = "(distribution: AreaSpreadDistribution, dx: number, dy: number)",
+ description = "Sets area-based spawn parameters for the particles. Newly created particles will spawn in an area around the emitter based on the parameters to this function.",
+ returns = "()",
+ type = "function"
+ },
+ setBufferSize = {
+ args = "(buffer: number)",
+ description = "Sets the size of the buffer (the max allowed amount of particles in the system).",
+ returns = "()",
+ type = "function"
+ },
+ setColors = {
+ args = "(r1: number, g1: number, b1: number, a1: number, r2: number, g2: number, b2: number, a2: number, ...: number)",
+ description = "Sets a series of colors to apply to the particle sprite. The particle system will interpolate between each color evenly over the particle's lifetime. Color modulation needs to be activated for this function to have any effect.\n\nArguments are passed in groups of four, representing the components of the desired RGBA value. At least one color must be specified. A maximum of eight may be used.",
+ returns = "()",
+ type = "function"
+ },
+ setDirection = {
+ args = "(direction: number)",
+ description = "Sets the direction the particles will be emitted in.",
+ returns = "()",
+ type = "function"
+ },
+ setEmissionRate = {
+ args = "(rate: number)",
+ description = "Sets the amount of particles emitted per second.",
+ returns = "()",
+ type = "function"
+ },
+ setEmitterLifetime = {
+ args = "(life: number)",
+ description = "Sets how long the particle system should emit particles (if -1 then it emits particles forever).",
+ returns = "()",
+ type = "function"
+ },
+ setInsertMode = {
+ args = "(mode: ParticleInsertMode)",
+ description = "Sets the mode to use when the ParticleSystem adds new particles.",
+ returns = "()",
+ type = "function"
+ },
+ setLinearAcceleration = {
+ args = "(xmin: number, ymin: number, xmax: number, ymax: number)",
+ description = "Sets the linear acceleration (acceleration along the x and y axes) for particles.\n\nEvery particle created will accelerate along the x and y axes between xmin,ymin and xmax,ymax.",
+ returns = "()",
+ type = "function"
+ },
+ setLinearDamping = {
+ args = "(min: number, max: number)",
+ description = "Sets the amount of linear damping (constant deceleration) for particles.",
+ returns = "()",
+ type = "function"
+ },
+ setOffset = {
+ args = "(x: number, y: number)",
+ description = "Set the offset position which the particle sprite is rotated around. If this function is not used, the particles rotate around their center.",
+ returns = "()",
+ type = "function"
+ },
+ setParticleLifetime = {
+ args = "(min: number, max: number)",
+ description = "Sets the life of the particles.",
+ returns = "()",
+ type = "function"
+ },
+ setPosition = {
+ args = "(x: number, y: number)",
+ description = "Sets the position of the emitter.",
+ returns = "()",
+ type = "function"
+ },
+ setQuads = {
+ args = "(quad1: Quad, quad2: Quad)",
+ description = "Sets a series of Quads to use for the particle sprites. Particles will choose a Quad from the list based on the particle's current lifetime, allowing for the use of animated sprite sheets with ParticleSystems.",
+ returns = "()",
+ type = "function"
+ },
+ setRadialAcceleration = {
+ args = "(min: number, max: number)",
+ description = "Set the radial acceleration (away from the emitter).",
+ returns = "()",
+ type = "function"
+ },
+ setRelativeRotation = {
+ args = "(enable: boolean)",
+ description = "Sets whether particle angles and rotations are relative to their velocities. If enabled, particles are aligned to the angle of their velocities and rotate relative to that angle.",
+ returns = "()",
+ type = "function"
+ },
+ setRotation = {
+ args = "(min: number, max: number)",
+ description = "Sets the rotation of the image upon particle creation (in radians).",
+ returns = "()",
+ type = "function"
+ },
+ setSizeVariation = {
+ args = "(variation: number)",
+ description = "Sets the degree of variation (0 meaning no variation and 1 meaning full variation between start and end).",
+ returns = "()",
+ type = "function"
+ },
+ setSizes = {
+ args = "(size1: number, size2: number, ...: number)",
+ description = "Sets a series of sizes by which to scale a particle sprite. 1.0 is normal size. The particle system will interpolate between each size evenly over the particle's lifetime.\n\nAt least one size must be specified. A maximum of eight may be used.",
+ returns = "()",
+ type = "function"
+ },
+ setSpeed = {
+ args = "(min: number, max: number)",
+ description = "Sets the speed of the particles.",
+ returns = "()",
+ type = "function"
+ },
+ setSpin = {
+ args = "(min: number, max: number)",
+ description = "Sets the spin of the sprite.",
+ returns = "()",
+ type = "function"
+ },
+ setSpinVariation = {
+ args = "(variation: number)",
+ description = "Sets the degree of variation (0 meaning no variation and 1 meaning full variation between start and end).",
+ returns = "()",
+ type = "function"
+ },
+ setSpread = {
+ args = "(spread: number)",
+ description = "Sets the amount of spread for the system.",
+ returns = "()",
+ type = "function"
+ },
+ setTangentialAcceleration = {
+ args = "(min: number, max: number)",
+ description = "Sets the tangential acceleration (acceleration perpendicular to the particle's direction).",
+ returns = "()",
+ type = "function"
+ },
+ setTexture = {
+ args = "(texture: Texture)",
+ description = "Sets the Image or Canvas which is to be emitted.",
+ returns = "()",
+ type = "function"
+ },
+ start = {
+ args = "()",
+ description = "Starts the particle emitter.",
+ returns = "()",
+ type = "function"
+ },
+ stop = {
+ args = "()",
+ description = "Stops the particle emitter, resetting the lifetime counter.",
+ returns = "()",
+ type = "function"
+ },
+ update = {
+ args = "(dt: number)",
+ description = "Updates the particle system; moving, creating and killing particles.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Used to create cool effects, like fire. The particle systems are created and drawn on the screen using functions in love.graphics. They also need to be updated in the update(dt) callback for you to see any changes in the particles emitted.",
+ type = "lib"
+ },
+ PointStyle = {
+ childs = {
+ rough = {
+ description = "Draw rough points.",
+ type = "value"
+ },
+ smooth = {
+ description = "Draw smooth points.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ Quad = {
+ childs = {
+ setViewport = {
+ args = "()",
+ description = "Sets the texture coordinates according to a viewport.",
+ returns = "(x: number, y: number, w: number, h: number)",
+ type = "function"
+ }
+ },
+ description = "A quadrilateral (a polygon with four sides and four corners) with texture coordinate information.\n\nQuads can be used to select part of a texture to draw. In this way, one large texture atlas can be loaded, and then split up into sub-images.",
+ type = "lib"
+ },
+ Shader = {
+ childs = {
+ getWarnings = {
+ args = "()",
+ description = "Returns any warning and error messages from compiling the shader code. This can be used for debugging your shaders if there's anything the graphics hardware doesn't like.",
+ returns = "(warnings: string)",
+ type = "function"
+ },
+ send = {
+ args = "(name: string, number: number, ...: number)",
+ description = "Sends one or more values to a special (extern) variable inside the shader.",
+ returns = "()",
+ type = "function"
+ },
+ sendColor = {
+ args = "(name: string, color: table, ...: table)",
+ description = "Sends one or more colors to a special (extern / uniform) vec3 or vec4 variable inside the shader. The color components must be in the range of [0, 255], unlike Shader:send. The colors are gamma-corrected if global gamma-correction is enabled.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "A Shader is used for advanced hardware-accelerated pixel or vertex manipulation. These effects are written in a language based on GLSL (OpenGL Shading Language) with a few things simplified for easier coding.\n\nPotential uses for pixel effects include HDR/bloom, motion blur, grayscale/invert/sepia/any kind of color effect, reflection/refraction, distortions, and much more!",
+ type = "lib"
+ },
+ SpriteBatch = {
+ childs = {
+ attachAttribute = {
+ args = "(name: string, mesh: Mesh)",
+ description = "Attaches a per-vertex attribute from a Mesh onto this SpriteBatch, for use when drawing. This can be combined with a Shader to augment a SpriteBatch with per-vertex or additional per-sprite information instead of just having per-sprite colors.\n\nEach sprite in a SpriteBatch has 4 vertices in the following order: top-left, bottom-left, top-right, bottom-right. The index returned by SpriteBatch:add (and used by SpriteBatch:set) can be multiplied by 4 to determine the first vertex in a specific sprite.",
+ returns = "()",
+ type = "function"
+ },
+ clear = {
+ args = "()",
+ description = "Removes all sprites from the buffer.",
+ returns = "()",
+ type = "function"
+ },
+ flush = {
+ args = "()",
+ description = "Immediately sends all new and modified sprite data in the batch to the graphics card.",
+ returns = "()",
+ type = "function"
+ },
+ getBufferSize = {
+ args = "()",
+ description = "Gets the maximum number of sprites the SpriteBatch can hold.",
+ returns = "(size: number)",
+ type = "function"
+ },
+ getColor = {
+ args = "(r: number, g: number, b: number, a: number)",
+ description = "Gets the color that will be used for the next add and set operations.\n\nIf no color has been set with SpriteBatch:setColor or the current SpriteBatch color has been cleared, this method will return nil.",
+ returns = "()",
+ type = "function"
+ },
+ getCount = {
+ args = "()",
+ description = "Gets the amount of sprites currently in the SpriteBatch.",
+ returns = "(count: number)",
+ type = "function"
+ },
+ getTexture = {
+ args = "()",
+ description = "Returns the Image or Canvas used by the SpriteBatch.",
+ returns = "(texture: Texture)",
+ type = "function"
+ },
+ set = {
+ args = "(id: number, x: number, y: number, r: number, sx: number, sy: number, ox: number, oy: number, kx: number, ky: number)",
+ description = "Changes a sprite in the batch. This requires the identifier returned by add and addq.",
+ returns = "()",
+ type = "function"
+ },
+ setBufferSize = {
+ args = "(size: number)",
+ description = "Sets the maximum number of sprites the SpriteBatch can hold. Existing sprites in the batch (up to the new maximum) will not be cleared when this function is called.",
+ returns = "()",
+ type = "function"
+ },
+ setColor = {
+ args = "(r: number, g: number, b: number, a: number)",
+ description = "Sets the color that will be used for the next add and set operations. Calling the function without arguments will clear the color.\n\nThe global color set with love.graphics.setColor will not work on the SpriteBatch if any of the sprites has its own color.",
+ returns = "()",
+ type = "function"
+ },
+ setTexture = {
+ args = "(texture: Texture)",
+ description = "Replaces the Image or Canvas used for the sprites.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Using a single image, draw any number of identical copies of the image using a single call to love.graphics.draw. This can be used, for example, to draw repeating copies of a single background image.\n\nA SpriteBatch can be even more useful when the underlying image is a Texture Atlas (a single image file containing many independent images); by adding Quad to the batch, different sub-images from within the atlas can be drawn.",
+ type = "lib"
+ },
+ SpriteBatchUsage = {
+ childs = {
+ dynamic = {
+ description = "The object's data will change repeatedly during its lifetime.",
+ type = "value"
+ },
+ static = {
+ description = "The object will not be modified after initial sprites or vertices are added.",
+ type = "value"
+ },
+ stream = {
+ description = "The object data will always change between draws.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ StackType = {
+ childs = {
+ all = {
+ description = "All love.graphics state, including transform state.",
+ type = "value"
+ },
+ transform = {
+ description = "The transformation stack (love.graphics.translate, love.graphics.rotate, etc.)",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ Text = {
+ childs = {
+ addf = {
+ args = "(textstring: string, wraplimit: number, align: AlignMode, x: number, y: number, angle: number, sx: number, sy: number, ox: number, oy: number, kx: number, ky: number)",
+ description = "Adds additional formatted / colored text to the Text object at the specified position.",
+ returns = "(index: number)",
+ type = "function"
+ },
+ clear = {
+ args = "()",
+ description = "Clears the contents of the Text object.",
+ returns = "()",
+ type = "function"
+ },
+ getFont = {
+ args = "()",
+ description = "Gets the Font used with the Text object.",
+ returns = "(font: Font)",
+ type = "function"
+ },
+ getHeight = {
+ args = "(index: number)",
+ description = "Gets the height of the text in pixels.",
+ returns = "(height: number)",
+ type = "function"
+ },
+ getWidth = {
+ args = "(index: number)",
+ description = "Gets the width of the text in pixels.",
+ returns = "(width: number)",
+ type = "function"
+ },
+ set = {
+ args = "(textstring: string)",
+ description = "Replaces the contents of the Text object with a new unformatted string.",
+ returns = "()",
+ type = "function"
+ },
+ setFont = {
+ args = "(font: Font)",
+ description = "Replaces the Font used with the text.",
+ returns = "()",
+ type = "function"
+ },
+ setf = {
+ args = "(textstring: string, wraplimit: number, align: AlignMode)",
+ description = "Replaces the contents of the Text object with a new formatted string.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Drawable text.",
+ type = "lib"
+ },
+ TextureFormat = {
+ childs = {
+ hdr = {
+ description = "Only usable in Canvases. The HDR texture format: floating point 16 bits per channel (64 bpp) RGBA.",
+ type = "value"
+ },
+ normal = {
+ description = "The default texture format: 8 bits per channel (32 bpp) RGBA.",
+ type = "value"
+ },
+ srgb = {
+ description = "The same as normal, but the texture is interpreted as being in the sRGB color space. It will be decoded from sRGB to linear RGB when drawn or sampled from in a shader. For Canvases, this will also convert everything drawn to the Canvas from linear RGB to sRGB.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ WrapMode = {
+ childs = {
+ clamp = {
+ description = "How the image wraps inside a Quad with a larger quad size than image size. This also affects how Meshes with texture coordinates which are outside the range of [0, 1] are drawn, and the color returned by the Texel Shader function when using it to sample from texture coordinates outside of the range of [0, 1].",
+ type = "value"
+ },
+ clampzero = {
+ description = "Clamp the texture. Fills the area outside the texture's normal range with transparent black (or opaque black for textures with no alpha channel.)",
+ type = "value"
+ },
+ mirroredrepeat = {
+ description = "Repeat the texture, flipping it each time it repeats. May produce better visual results than the repeat mode when the texture doesn't seamlessly tile.",
+ type = "value"
+ },
+ ["repeat"] = {
+ description = "Repeat the image. Fills the whole available extent.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ circle = {
+ args = "(mode: DrawMode, x: number, y: number, radius: number, segments: number)",
+ description = "Draws a circle.",
+ returns = "()",
+ type = "function"
+ },
+ clear = {
+ args = "(r: number, g: number, b: number, a: number)",
+ description = "Clears the screen to the background color in LÖVE 0.9.2 and earlier, or to the specified color in 0.10.0 and newer.\n\nThis function is called automatically before love.draw in the default love.run function. See the example in love.run for a typical use of this function.\n\nNote that the scissor area bounds the cleared region.",
+ returns = "()",
+ type = "function"
+ },
+ discard = {
+ args = "(discardcolor: boolean, discardstencil: boolean)",
+ description = "Discards (trashes) the contents of the screen or active Canvas. This is a performance optimization function with niche use cases.\n\nIf the active Canvas has just been changed and the \"replace\" BlendMode is about to be used to draw something which covers the entire screen, calling love.graphics.discard rather than calling love.graphics.clear or doing nothing may improve performance on mobile devices.\n\nOn some desktop systems this function may do nothing.",
+ returns = "()",
+ type = "function"
+ },
+ draw = {
+ args = "(drawable: Drawable, x: number, y: number, r: number, sx: number, sy: number, ox: number, oy: number, kx: number, ky: number)",
+ description = "Draws objects on screen. Drawable objects are loaded images, but may be other kinds of Drawable objects, such as a ParticleSystem.\n\nIn addition to simple drawing, this function can rotate and scale the object at the same time, as well as offset the image (for example, to center the image at the chosen coordinates).\n\nlove.graphics.draw anchors from the top left corner by default.\n\nYou can specify a negative value for sx or sy to flip the drawable horizontally or vertically.\n\nThe pivotal point is (x, y) on the screen and (ox, oy) in the internal coordinate system of the drawable object, before rotation and scaling. The object is scaled by (sx, sy), then rotated by r around the pivotal point.\n\nThe origin offset values are most often used to shift the images up and left by half of its height and width, so that (effectively) the specified x and y coordinates are where the center of the image will end up.",
+ returns = "()",
+ type = "function"
+ },
+ ellipse = {
+ args = "(mode: DrawMode, x: number, y: number, radiusx: number, radiusy: number)",
+ description = "Draws an ellipse.",
+ returns = "()",
+ type = "function"
+ },
+ getBackgroundColor = {
+ args = "()",
+ description = "Gets the current background color.",
+ returns = "(r: number, g: number, b: number, a: number)",
+ type = "function"
+ },
+ getBlendMode = {
+ args = "()",
+ description = "Gets the blending mode.",
+ returns = "(mode: BlendMode)",
+ type = "function"
+ },
+ getCanvas = {
+ args = "()",
+ description = "Gets the current target Canvas.",
+ returns = "(canvas: Canvas)",
+ type = "function"
+ },
+ getCanvasFormats = {
+ args = "()",
+ description = "Gets the available Canvas formats, and whether each is supported.",
+ returns = "(formats: table)",
+ type = "function"
+ },
+ getColor = {
+ args = "()",
+ description = "Gets the current color.",
+ returns = "(r: number, g: number, b: number, a: number)",
+ type = "function"
+ },
+ getColorMask = {
+ args = "()",
+ description = "Gets the active color components used when drawing. Normally all 4 components are active unless love.graphics.setColorMask has been used.\n\nThe color mask determines whether individual components of the colors of drawn objects will affect the color of the screen. They affect love.graphics.clear and Canvas:clear as well.",
+ returns = "(r: boolean, g: boolean, b: boolean, a: boolean)",
+ type = "function"
+ },
+ getCompressedImageFormats = {
+ args = "()",
+ description = "Gets the available compressed image formats, and whether each is supported.",
+ returns = "(formats: table)",
+ type = "function"
+ },
+ getDefaultFilter = {
+ args = "()",
+ description = "Returns the default scaling filters used with Images, Canvases, and Fonts.",
+ returns = "(min: FilterMode, mag: FilterMode, anisotropy: number)",
+ type = "function"
+ },
+ getDimensions = {
+ args = "()",
+ description = "Gets the width and height of the window.",
+ returns = "(width: number, height: number)",
+ type = "function"
+ },
+ getFSAA = {
+ args = "()",
+ description = "Gets the number of antialiasing samples used when drawing to the Canvas.\n\nThis may be different than the number used as an argument to love.graphics.newCanvas if the system running LÖVE doesn't support that number.",
+ returns = "(samples: number)",
+ type = "function"
+ },
+ getFont = {
+ args = "()",
+ description = "Gets the current Font object.",
+ returns = "(font: Font)",
+ type = "function"
+ },
+ getFullscreenModes = {
+ args = "()",
+ description = "Gets a list of supported fullscreen modes.",
+ returns = "(modes: table)",
+ type = "function"
+ },
+ getHeight = {
+ args = "()",
+ description = "Gets the height of the window.",
+ returns = "(height: number)",
+ type = "function"
+ },
+ getLineJoin = {
+ args = "()",
+ description = "Gets the line join style.",
+ returns = "(join: LineJoin)",
+ type = "function"
+ },
+ getLineStyle = {
+ args = "()",
+ description = "Gets the line style.",
+ returns = "(style: LineStyle)",
+ type = "function"
+ },
+ getLineWidth = {
+ args = "()",
+ description = "Gets the current line width.",
+ returns = "(width: number)",
+ type = "function"
+ },
+ getPointSize = {
+ args = "()",
+ description = "Gets the point size.",
+ returns = "(size: number)",
+ type = "function"
+ },
+ getRendererInfo = {
+ args = "()",
+ description = "Gets information about the system's video card and drivers.",
+ returns = "(name: string, version: string, vendor: string, device: string)",
+ type = "function"
+ },
+ getScissor = {
+ args = "()",
+ description = "Gets the current scissor box.",
+ returns = "(x: number, y: number, width: number, height: number)",
+ type = "function"
+ },
+ getShader = {
+ args = "()",
+ description = "Returns the current Shader. Returns nil if none is set.",
+ returns = "(shader: Shader)",
+ type = "function"
+ },
+ getStats = {
+ args = "()",
+ description = "Gets performance-related rendering statistics.",
+ returns = "(drawcalls: number, canvasswitches: number, texturememory: number, images: number, canvases: number, fonts: number)",
+ type = "function"
+ },
+ getStencilTest = {
+ args = "()",
+ description = "Gets whether stencil testing is enabled.\n\nWhen stencil testing is enabled, the geometry of everything that is drawn will be clipped / stencilled out based on whether it intersects with what has been previously drawn to the stencil buffer.\n\nEach Canvas has its own stencil buffer.",
+ returns = "(enabled: boolean, inverted: boolean)",
+ type = "function"
+ },
+ getSupported = {
+ args = "()",
+ description = "Gets the optional graphics features and whether they're supported on the system.\n\nSome older or low-end systems don't always support all graphics features.",
+ returns = "(features: table)",
+ type = "function"
+ },
+ getSystemLimits = {
+ args = "()",
+ description = "Gets the system-dependent maximum values for love.graphics features.",
+ returns = "(limits: table)",
+ type = "function"
+ },
+ getWidth = {
+ args = "()",
+ description = "Gets the width of the window.",
+ returns = "(width: number)",
+ type = "function"
+ },
+ intersectScissor = {
+ args = "(x: number, y: number, width: number, height: number)",
+ description = "Sets the scissor to the rectangle created by the intersection of the specified rectangle with the existing scissor. If no scissor is active yet, it behaves like love.graphics.setScissor.\n\nThe scissor limits the drawing area to a specified rectangle. This affects all graphics calls, including love.graphics.clear.\n\nThe dimensions of the scissor is unaffected by graphical transformations (translate, scale, ...).",
+ returns = "()",
+ type = "function"
+ },
+ isGammaCorrect = {
+ args = "()",
+ description = "Gets whether gamma-correct rendering is supported and enabled. It can be enabled by setting t.gammacorrect = true in love.conf.\n\nNot all devices support gamma-correct rendering, in which case it will be automatically disabled and this function will return false. It is supported on desktop systems which have graphics cards that are capable of using OpenGL 3 / DIrectX 10, and iOS devices that can use OpenGL ES 3.",
+ returns = "(gammacorrect: boolean)",
+ type = "function"
+ },
+ isWireframe = {
+ args = "()",
+ description = "Gets whether wireframe mode is used when drawing.",
+ returns = "(wireframe: boolean)",
+ type = "function"
+ },
+ line = {
+ args = "(x1: number, y1: number, x2: number, y2: number, ...: number)",
+ description = "Draws lines between points.",
+ returns = "()",
+ type = "function"
+ },
+ newCanvas = {
+ args = "(width: number, height: number, texture_type: TextureFormat, fsaa: number)",
+ description = "Creates a new Canvas object for offscreen rendering.\n\nAntialiased Canvases have slightly higher system requirements than normal Canvases. Additionally, the supported maximum number of FSAA samples varies depending on the system. Use love.graphics.getSystemLimit to check.\n\nIf the number of FSAA samples specified is greater than the maximum supported by the system, the Canvas will still be created but only using the maximum supported amount (this includes 0.)",
+ returns = "(canvas: Canvas)",
+ type = "function"
+ },
+ newFont = {
+ args = "(filename: string, size: number)",
+ description = "Creates a new Font.",
+ returns = "(font: Font)",
+ type = "function"
+ },
+ newImage = {
+ args = "(filename: string)",
+ description = "Creates a new Image from a filepath, FileData, an ImageData, or a CompressedImageData, and optionally generates or specifies mipmaps for the image.",
+ returns = "(image: Image)",
+ type = "function"
+ },
+ newImageFont = {
+ args = "(filename: string, glyphs: string)",
+ description = "Creates a new Font by loading a specifically formatted image. There can be up to 256 glyphs.\n\nIn versions prior to 0.9.0, LÖVE expects ISO 8859-1 encoding for the glyphs string.",
+ returns = "(font: Font)",
+ type = "function"
+ },
+ newMesh = {
+ args = "(vertices: table, mode: MeshDrawMode, usage: SpriteBatchUsage)",
+ description = "Creates a new Mesh.\n\nUse Mesh:setTexture if the Mesh should be textured with an Image or Canvas when it's drawn.",
+ returns = "(mesh: Mesh)",
+ type = "function"
+ },
+ newParticleSystem = {
+ args = "(texture: Texture, buffer: number)",
+ description = "Creates a new ParticleSystem.",
+ returns = "(system: ParticleSystem)",
+ type = "function"
+ },
+ newQuad = {
+ args = "(x: number, y: number, width: number, height: number, sw: number, sh: number)",
+ description = "Creates a new Quad.\n\nThe purpose of a Quad is to describe the result of the following transformation on any drawable object. The object is first scaled to dimensions sw * sh. The Quad then describes the rectangular area of dimensions width * height whose upper left corner is at position (x, y) inside the scaled object.",
+ returns = "(quad: Quad)",
+ type = "function"
+ },
+ newScreenshot = {
+ args = "()",
+ description = "Creates a screenshot and returns the image data.",
+ returns = "(screenshot: ImageData)",
+ type = "function"
+ },
+ newShader = {
+ args = "(code: string)",
+ description = "Creates a new Shader object for hardware-accelerated vertex and pixel effects. A Shader contains either vertex shader code, pixel shader code, or both.\n\nVertex shader code must contain at least one function, named position, which is the function that will produce transformed vertex positions of drawn objects in screen-space.\n\nPixel shader code must contain at least one function, named effect, which is the function that will produce the color which is blended onto the screen for each pixel a drawn object touches.",
+ returns = "(shader: Shader)",
+ type = "function"
+ },
+ newSpriteBatch = {
+ args = "(texture: Texture, size: number, usage: SpriteBatchUsage)",
+ description = "Creates a new SpriteBatch object.",
+ returns = "(spriteBatch: SpriteBatch)",
+ type = "function"
+ },
+ newText = {
+ args = "(font: Font, textstring: string)",
+ description = "Creates a new Font.",
+ returns = "(text: Text)",
+ type = "function"
+ },
+ newVideo = {
+ args = "(filename: string, loadaudio: boolean)",
+ description = "Creates a new drawable Video. Currently only Ogg Theora video files are supported.",
+ returns = "(video: Video)",
+ type = "function"
+ },
+ origin = {
+ args = "()",
+ description = "Resets the current coordinate transformation.\n\nThis function is always used to reverse any previous calls to love.graphics.rotate, love.graphics.scale, love.graphics.shear or love.graphics.translate. It returns the current transformation state to its defaults.",
+ returns = "()",
+ type = "function"
+ },
+ points = {
+ args = "(x: number, y: number, ...: number)",
+ description = "Draws one or more points.",
+ returns = "()",
+ type = "function"
+ },
+ polygon = {
+ args = "(mode: DrawMode, ...: number)",
+ description = "Draw a polygon.\n\nFollowing the mode argument, this function can accept multiple numeric arguments or a single table of numeric arguments. In either case the arguments are interpreted as alternating x and y coordinates of the polygon's vertices.\n\nWhen in fill mode, the polygon must be convex and simple or rendering artifacts may occur.",
+ returns = "()",
+ type = "function"
+ },
+ pop = {
+ args = "()",
+ description = "Pops the current coordinate transformation from the transformation stack.\n\nThis function is always used to reverse a previous push operation. It returns the current transformation state to what it was before the last preceding push. For an example, see the description of love.graphics.push.",
+ returns = "()",
+ type = "function"
+ },
+ present = {
+ args = "()",
+ description = "Displays the results of drawing operations on the screen.\n\nThis function is used when writing your own love.run function. It presents all the results of your drawing operations on the screen. See the example in love.run for a typical use of this function.",
+ returns = "()",
+ type = "function"
+ },
+ print = {
+ args = "(text: string, x: number, y: number, r: number, sx: number, sy: number, ox: number, oy: number, kx: number, ky: number)",
+ description = "Draws text on screen. If no Font is set, one will be created and set (once) if needed.\n\nWhen using translation and scaling functions while drawing text, this function assumes the scale occurs first. If you don't script with this in mind, the text won't be in the right position, or possibly even on screen.\n\nlove.graphics.print stops at the first '\0' (null) character. This can bite you if you are appending keystrokes to form your string, as some of those are multi-byte unicode characters which will likely contain null bytes.",
+ returns = "()",
+ type = "function"
+ },
+ printf = {
+ args = "(text: string, x: number, y: number, limit: number, align: AlignMode, r: number, sx: number, sy: number, ox: number, oy: number, kx: number, ky: number)",
+ description = "Draws formatted text, with word wrap and alignment.\n\nSee additional notes in love.graphics.print.",
+ returns = "()",
+ type = "function"
+ },
+ push = {
+ args = "(stack: StackType)",
+ description = "Copies and pushes the current coordinate transformation to the transformation stack.\n\nThis function is always used to prepare for a corresponding pop operation later. It stores the current coordinate transformation state into the transformation stack and keeps it active. Later changes to the transformation can be undone by using the pop operation, which returns the coordinate transform to the state it was in before calling push.",
+ returns = "()",
+ type = "function"
+ },
+ rectangle = {
+ args = "(mode: DrawMode, x: number, y: number, width: number, height: number)",
+ description = "Draws a rectangle.",
+ returns = "()",
+ type = "function"
+ },
+ reset = {
+ args = "()",
+ description = "Resets the current graphics settings.\n\nCalling reset makes the current drawing color white, the current background color black, resets any active Canvas or Shader, and removes any scissor settings. It sets the BlendMode to alpha. It also sets both the point and line drawing modes to smooth and their sizes to 1.0.",
+ returns = "()",
+ type = "function"
+ },
+ rotate = {
+ args = "(angle: number)",
+ description = "Rotates the coordinate system in two dimensions.\n\nCalling this function affects all future drawing operations by rotating the coordinate system around the origin by the given amount of radians. This change lasts until love.draw exits.",
+ returns = "()",
+ type = "function"
+ },
+ scale = {
+ args = "(sx: number, sy: number)",
+ description = "Scales the coordinate system in two dimensions.\n\nBy default the coordinate system in LÖVE corresponds to the display pixels in horizontal and vertical directions one-to-one, and the x-axis increases towards the right while the y-axis increases downwards. Scaling the coordinate system changes this relation.\n\nAfter scaling by sx and sy, all coordinates are treated as if they were multiplied by sx and sy. Every result of a drawing operation is also correspondingly scaled, so scaling by (2, 2) for example would mean making everything twice as large in both x- and y-directions. Scaling by a negative value flips the coordinate system in the corresponding direction, which also means everything will be drawn flipped or upside down, or both. Scaling by zero is not a useful operation.\n\nScale and translate are not commutative operations, therefore, calling them in different orders will change the outcome.\n\nScaling lasts until love.draw exits.",
+ returns = "()",
+ type = "function"
+ },
+ setBackgroundColor = {
+ args = "(r: number, g: number, b: number, a: number)",
+ description = "Sets the background color.",
+ returns = "()",
+ type = "function"
+ },
+ setBlendMode = {
+ args = "(mode: BlendMode)",
+ description = "Sets the blending mode.",
+ returns = "()",
+ type = "function"
+ },
+ setCanvas = {
+ args = "(canvas: Canvas, ...: Canvas)",
+ description = "Sets the render target to one or more Canvases. All drawing operations until the next love.graphics.setCanvas call will be redirected to the specified canvases and not shown on the screen.\n\nAll canvas arguments must have the same widths and heights and the same texture type. Normally the same thing will be drawn on each canvas, but that can be changed if a pixel shader is used with the \"effects\" function instead of the regular effect.\n\nNot all computers support Canvases, and not all computers which support Canvases will support multiple render targets. Use love.graphics.isSupported to check.\n\nnWhen called without arguments, the render target is reset to the screen.",
+ returns = "()",
+ type = "function"
+ },
+ setColor = {
+ args = "(red: number, green: number, blue: number, alpha: number)",
+ description = "Sets the color used for drawing.",
+ returns = "()",
+ type = "function"
+ },
+ setColorMask = {
+ args = "(red: boolean, green: boolean, blue: boolean, alpha: boolean)",
+ description = "Sets the color mask. Enables or disables specific color components when rendering and clearing the screen. For example, if red is set to false, no further changes will be made to the red component of any pixels.\n\nEnables all color components when called without arguments.",
+ returns = "()",
+ type = "function"
+ },
+ setDefaultFilter = {
+ args = "(min: FilterMode, mag: FilterMode, anisotropy: number)",
+ description = "Sets the default scaling filters used with Images, Canvases, and Fonts.\n\nThis function does not apply retroactively to loaded images.",
+ returns = "()",
+ type = "function"
+ },
+ setFont = {
+ args = "(font: Font)",
+ description = "Set an already-loaded Font as the current font or create and load a new one from the file and size.\n\nIt's recommended that Font objects are created with love.graphics.newFont in the loading stage and then passed to this function in the drawing stage.",
+ returns = "()",
+ type = "function"
+ },
+ setInvertedStencil = {
+ args = "(stencilFunction: function)",
+ description = "Defines an inverted stencil for the drawing operations or releases the active one.\n\nIt's the same as love.graphics.setStencil with the mask inverted.\n\nCalling the function without arguments releases the active stencil.",
+ returns = "()",
+ type = "function"
+ },
+ setLineJoin = {
+ args = "(join: LineJoin)",
+ description = "Sets the line join style.",
+ returns = "()",
+ type = "function"
+ },
+ setLineStyle = {
+ args = "(style: LineStyle)",
+ description = "Sets the line style.",
+ returns = "()",
+ type = "function"
+ },
+ setLineWidth = {
+ args = "(width: number)",
+ description = "Sets the line width.",
+ returns = "()",
+ type = "function"
+ },
+ setNewFont = {
+ args = "(size: number)",
+ description = "Creates and sets a new font.",
+ returns = "(font: Font)",
+ type = "function"
+ },
+ setPointSize = {
+ args = "(size: number)",
+ description = "Sets the point size.",
+ returns = "()",
+ type = "function"
+ },
+ setScissor = {
+ args = "(x: number, y: number, width: number, height: number)",
+ description = "Sets or disables scissor.\n\nThe scissor limits the drawing area to a specified rectangle. This affects all graphics calls, including love.graphics.clear.",
+ returns = "()",
+ type = "function"
+ },
+ setShader = {
+ args = "(shader: Shader)",
+ description = "Sets or resets a Shader as the current pixel effect or vertex shaders. All drawing operations until the next love.graphics.setShader will be drawn using the Shader object specified.\n\nDisables the shaders when called without arguments.",
+ returns = "()",
+ type = "function"
+ },
+ setStencilTest = {
+ args = "(comparemode: CompareMode, comparevalue: number)",
+ description = "Configures or disables stencil testing.\n\nWhen stencil testing is enabled, the geometry of everything that is drawn afterward will be clipped / stencilled out based on a comparison between the arguments of this function and the stencil value of each pixel that the geometry touches. The stencil values of pixels are affected via love.graphics.stencil.\n\nEach Canvas has its own per-pixel stencil values.",
+ returns = "()",
+ type = "function"
+ },
+ setWireframe = {
+ args = "(enable: boolean)",
+ description = "Sets whether wireframe lines will be used when drawing.\n\nWireframe mode should only be used for debugging. The lines drawn with it enabled do not behave like regular love.graphics lines: their widths don't scale with the coordinate transformations or with love.graphics.setLineWidth, and they don't use the smooth LineStyle.",
+ returns = "()",
+ type = "function"
+ },
+ shear = {
+ args = "(kx: number, ky: number)",
+ description = "Shears the coordinate system.",
+ returns = "()",
+ type = "function"
+ },
+ stencil = {
+ args = "(stencilfunction: function, action: StencilAction, value: number, keepvalues: boolean)",
+ description = "Draws geometry as a stencil.\n\nThe geometry drawn by the supplied function sets invisible stencil values of pixels, instead of setting pixel colors. The stencil values of pixels can act like a mask / stencil - love.graphics.setStencilTest can be used afterward to determine how further rendering is affected by the stencil values in each pixel.\n\nEach Canvas has its own per-pixel stencil values. Stencil values are within the range of [0, 255].",
+ returns = "()",
+ type = "function"
+ },
+ translate = {
+ args = "(dx: number, dy: number)",
+ description = "Translates the coordinate system in two dimensions.\n\nWhen this function is called with two numbers, dx, and dy, all the following drawing operations take effect as if their x and y coordinates were x+dx and y+dy.\n\nScale and translate are not commutative operations, therefore, calling them in different orders will change the outcome.\n\nThis change lasts until love.graphics.clear is called (which is called automatically before love.draw in the default love.run function), or a love.graphics.pop reverts to a previous coordinate system state.\n\nTranslating using whole numbers will prevent tearing/blurring of images and fonts draw after translating.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "The primary responsibility for the love.graphics module is the drawing of lines, shapes, text, Images and other Drawable objects onto the screen. Its secondary responsibilities include loading external files (including Images and Fonts) into memory, creating specialized objects (such as ParticleSystems or Framebuffers) and managing screen geometry.\n\nLÖVE's coordinate system is rooted in the upper-left corner of the screen, which is at location (0, 0). The x-axis is horizontal: larger values are further to the right. The y-axis is vertical: larger values are further towards the bottom.\n\nIn many cases, you draw images or shapes in terms of their upper-left corner (See the picture above).\n\nMany of the functions are used to manipulate the graphics coordinate system, which is essentially the way coordinates are mapped to the display. You can change the position, scale, and even rotation in this way.",
+ type = "class"
+ },
+ image = {
+ childs = {
+ CompressedImageData = {
+ childs = {
+ getFormat = {
+ args = "()",
+ description = "Gets the format of the CompressedImageData.",
+ returns = "(format: CompressedImageFormat)",
+ type = "function"
+ },
+ getHeight = {
+ args = "(level: number)",
+ description = "Gets the height of the CompressedImageData.",
+ returns = "(height: number)",
+ type = "function"
+ },
+ getMipmapCount = {
+ args = "(mipmaps: number)",
+ description = "Gets the number of mipmap levels in the CompressedImageData. The base mipmap level (original image) is included in the count.",
+ returns = "()",
+ type = "function"
+ },
+ getWidth = {
+ args = "(level: number)",
+ description = "Gets the width of the CompressedImageData.",
+ returns = "(width: number)",
+ type = "function"
+ }
+ },
+ description = "Represents compressed image data designed to stay compressed in RAM.\n\nCompressedImageData encompasses standard compressed texture formats such as DXT1, DXT5, and BC5 / 3Dc.\n\nYou can't draw CompressedImageData directly to the screen. See Image for that.",
+ type = "lib"
+ },
+ CompressedImageFormat = {
+ childs = {
+ ASTC4x4 = {
+ description = "The 4x4 pixels per block variant of the ASTC format. RGBA data at 8 bits per pixel.",
+ type = "value"
+ },
+ ASTC5x4 = {
+ description = "The 5x4 pixels per block variant of the ASTC format. RGBA data at 6.4 bits per pixel.",
+ type = "value"
+ },
+ ASTC5x5 = {
+ description = "The 5x5 pixels per block variant of the ASTC format. RGBA data at 5.12 bits per pixel.",
+ type = "value"
+ },
+ ASTC6x5 = {
+ description = "The 6x5 pixels per block variant of the ASTC format. RGBA data at 4.27 bits per pixel.",
+ type = "value"
+ },
+ ASTC6x6 = {
+ description = "The 6x6 pixels per block variant of the ASTC format. RGBA data at 3.56 bits per pixel.",
+ type = "value"
+ },
+ ASTC8x5 = {
+ description = "The 8x5 pixels per block variant of the ASTC format. RGBA data at 3.2 bits per pixel.",
+ type = "value"
+ },
+ ASTC8x6 = {
+ description = "The 8x6 pixels per block variant of the ASTC format. RGBA data at 2.67 bits per pixel.",
+ type = "value"
+ },
+ ASTC8x8 = {
+ description = "The 8x8 pixels per block variant of the ASTC format. RGBA data at 2 bits per pixel.",
+ type = "value"
+ },
+ ASTC10x5 = {
+ description = "The 10x5 pixels per block variant of the ASTC format. RGBA data at 2.56 bits per pixel.",
+ type = "value"
+ },
+ ASTC10x6 = {
+ description = "The 10x6 pixels per block variant of the ASTC format. RGBA data at 2.13 bits per pixel.",
+ type = "value"
+ },
+ ASTC10x8 = {
+ description = "The 10x8 pixels per block variant of the ASTC format. RGBA data at 1.6 bits per pixel.",
+ type = "value"
+ },
+ ASTC10x10 = {
+ description = "The 10x10 pixels per block variant of the ASTC format. RGBA data at 1.28 bits per pixel.",
+ type = "value"
+ },
+ ASTC12x10 = {
+ description = "The 12x10 pixels per block variant of the ASTC format. RGBA data at 1.07 bits per pixel.",
+ type = "value"
+ },
+ ASTC12x12 = {
+ description = "The 12x12 pixels per block variant of the ASTC format. RGBA data at 0.89 bits per pixel.",
+ type = "value"
+ },
+ BC4 = {
+ description = "The BC4 format (also known as 3Dc+ or ATI1.) Stores just the red channel, at 4 bits per pixel.",
+ type = "value"
+ },
+ BC4s = {
+ description = "The signed variant of the BC4 format. Same as above but the pixel values in the texture are in the range of [-1, 1] instead of [0, 1] in shaders.",
+ type = "value"
+ },
+ BC5 = {
+ description = "The BC5 format (also known as 3Dc or ATI2.) Stores red and green channels at 8 bits per pixel.",
+ type = "value"
+ },
+ BC5s = {
+ description = "The signed variant of the BC5 format.",
+ type = "value"
+ },
+ BC6h = {
+ description = "The BC6H format. Stores half-precision floating-point RGB data in the range of [0, 65504] at 8 bits per pixel. Suitable for HDR images on desktop systems.",
+ type = "value"
+ },
+ BC6hs = {
+ description = "The signed variant of the BC6H format. Stores RGB data in the range of [-65504, +65504].",
+ type = "value"
+ },
+ BC7 = {
+ description = "The BC7 format (also known as BPTC.) Stores RGB or RGBA data at 8 bits per pixel.",
+ type = "value"
+ },
+ DXT1 = {
+ description = "The DXT1 format. RGB data at 4 bits per pixel (compared to 32 bits for ImageData and regular Images.) Suitable for fully opaque images. Suitable for fully opaque images on desktop systems.",
+ type = "value"
+ },
+ DXT3 = {
+ description = "The DXT3 format. RGBA data at 8 bits per pixel. Smooth variations in opacity do not mix well with this format.",
+ type = "value"
+ },
+ DXT5 = {
+ description = "The DXT5 format. RGBA data at 8 bits per pixel. Recommended for images with varying opacity on desktop systems.",
+ type = "value"
+ },
+ EACr = {
+ description = "The single-channel variant of the EAC format. Stores just the red channel, at 4 bits per pixel.",
+ type = "value"
+ },
+ EACrg = {
+ description = "The two-channel variant of the EAC format. Stores red and green channels at 8 bits per pixel.",
+ type = "value"
+ },
+ EACrgs = {
+ description = "The signed two-channel variant of the EAC format.",
+ type = "value"
+ },
+ EACrs = {
+ description = "The signed single-channel variant of the EAC format. Same as above but pixel values in the texture are in the range of [-1, 1] instead of [0, 1] in shaders.",
+ type = "value"
+ },
+ ETC1 = {
+ description = "The ETC1 format. RGB data at 4 bits per pixel. Suitable for fully opaque images on older Android devices.",
+ type = "value"
+ },
+ ETC2rgb = {
+ description = "The RGB variant of the ETC2 format. RGB data at 4 bits per pixel. Suitable for fully opaque images on newer mobile devices.",
+ type = "value"
+ },
+ ETC2rgba = {
+ description = "The RGBA variant of the ETC2 format. RGBA data at 8 bits per pixel. Recommended for images with varying opacity on newer mobile devices.",
+ type = "value"
+ },
+ ETC2rgba1 = {
+ description = "The RGBA variant of the ETC2 format where pixels are either fully transparent or fully opaque. RGBA data at 4 bits per pixel.",
+ type = "value"
+ },
+ PVR1rgb2 = {
+ description = "The 2 bit per pixel RGB variant of the PVRTC1 format. Stores RGB data at 2 bits per pixel. Textures compressed with PVRTC1 formats must be square and power-of-two sized.",
+ type = "value"
+ },
+ PVR1rgb4 = {
+ description = "The 4 bit per pixel RGB variant of the PVRTC1 format. Stores RGB data at 4 bits per pixel.",
+ type = "value"
+ },
+ PVR1rgba2 = {
+ description = "The 2 bit per pixel RGBA variant of the PVRTC1 format.",
+ type = "value"
+ },
+ PVR1rgba4 = {
+ description = "The 4 bit per pixel RGBA variant of the PVRTC1 format.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ ImageData = {
+ childs = {
+ getDimensions = {
+ args = "()",
+ description = "Gets the width and height of the ImageData.",
+ returns = "(width: number, height: number)",
+ type = "function"
+ },
+ getHeight = {
+ args = "()",
+ description = "Gets the height of the ImageData.",
+ returns = "(height: number)",
+ type = "function"
+ },
+ getPixel = {
+ args = "(x: number, y: number)",
+ description = "Gets the pixel at the specified position.\n\nValid x and y values start at 0 and go up to image width and height minus 1.",
+ returns = "(r: number, g: number, b: number, a: number)",
+ type = "function"
+ },
+ getWidth = {
+ args = "()",
+ description = "Gets the width of the ImageData.",
+ returns = "(width: number)",
+ type = "function"
+ },
+ mapPixel = {
+ args = "(pixelFunction: function)",
+ description = "Transform an image by applying a function to every pixel.\n\nThis function is a higher order function. It takes another function as a parameter, and calls it once for each pixel in the ImageData.\n\nThe function parameter is called with six parameters for each pixel in turn. The parameters are numbers that represent the x and y coordinates of the pixel and its red, green, blue and alpha values. The function parameter can return up to four number values, which become the new r, g, b and a values of the pixel. If the function returns fewer values, the remaining components are set to 0.",
+ returns = "()",
+ type = "function"
+ },
+ paste = {
+ args = "(source: ImageData, dx: number, dy: number, sx: number, sy: number, sw: number, sh: number)",
+ description = "Paste into ImageData from another source ImageData.",
+ returns = "()",
+ type = "function"
+ },
+ setPixel = {
+ args = "(x: number, y: number, r: number, g: number, b: number, a: number)",
+ description = "Sets the color of a pixel.\n\nValid x and y values start at 0 and go up to image width and height minus 1.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Raw (decoded) image data.\n\nYou can't draw ImageData directly to screen. See Image for that.",
+ type = "lib"
+ },
+ ImageFormat = {
+ childs = {
+ png = {
+ description = "PNG image format.",
+ type = "value"
+ },
+ tga = {
+ description = "Targa image format.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ newCompressedData = {
+ args = "(filename: string)",
+ description = "Create a new CompressedImageData object from a compressed image file. LÖVE supports several compressed texture formats, enumerated in the CompressedImageFormat page.",
+ returns = "(compressedImageData: CompressedImageData)",
+ type = "function"
+ },
+ newImageData = {
+ args = "(width: number, height: number)",
+ description = "Create a new ImageData object.",
+ returns = "(imageData: ImageData)",
+ type = "function"
+ }
+ },
+ description = "Provides an interface to decode encoded image data.",
+ type = "class"
+ },
+ joystick = {
+ childs = {
+ GamepadAxis = {
+ childs = {
+ leftx = {
+ description = "The x-axis of the left thumbstick.",
+ type = "value"
+ },
+ lefty = {
+ description = "The y-axis of the left thumbstick.",
+ type = "value"
+ },
+ rightx = {
+ description = "The x-axis of the right thumbstick.",
+ type = "value"
+ },
+ righty = {
+ description = "The y-axis of the right thumbstick.",
+ type = "value"
+ },
+ triggerleft = {
+ description = "Left analog trigger.",
+ type = "value"
+ },
+ triggerright = {
+ description = "Right analog trigger.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ GamepadButton = {
+ childs = {
+ a = {
+ description = "Bottom face button (A).",
+ type = "value"
+ },
+ b = {
+ description = "Right face button (B).",
+ type = "value"
+ },
+ back = {
+ description = "Back button.",
+ type = "value"
+ },
+ dpdown = {
+ description = "D-pad down.",
+ type = "value"
+ },
+ dpleft = {
+ description = "D-pad left.",
+ type = "value"
+ },
+ dpright = {
+ description = "D-pad right.",
+ type = "value"
+ },
+ dpup = {
+ description = "D-pad up.",
+ type = "value"
+ },
+ guide = {
+ description = "Guide button.",
+ type = "value"
+ },
+ leftshoulder = {
+ description = "Left bumper.",
+ type = "value"
+ },
+ leftstick = {
+ description = "Left stick click button.",
+ type = "value"
+ },
+ rightshoulder = {
+ description = "Right bumper.",
+ type = "value"
+ },
+ rightstick = {
+ description = "Right stick click button.",
+ type = "value"
+ },
+ start = {
+ description = "Start button.",
+ type = "value"
+ },
+ x = {
+ description = "Left face button (X).",
+ type = "value"
+ },
+ y = {
+ description = "Top face button (Y).",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ Joystick = {
+ childs = {
+ getAxis = {
+ args = "(axis: number)",
+ description = "Gets the direction of an axis.",
+ returns = "(direction: number)",
+ type = "function"
+ },
+ getAxisCount = {
+ args = "()",
+ description = "Gets the number of axes on the joystick.",
+ returns = "(axes: number)",
+ type = "function"
+ },
+ getButtonCount = {
+ args = "()",
+ description = "Gets the number of buttons on the joystick.",
+ returns = "(buttons: number)",
+ type = "function"
+ },
+ getGUID = {
+ args = "()",
+ description = "Gets a stable GUID unique to the type of the physical joystick which does not change over time. For example, all Sony Dualshock 3 controllers in OS X have the same GUID. The value is platform-dependent.",
+ returns = "(guid: string)",
+ type = "function"
+ },
+ getGamepadAxis = {
+ args = "(axis: GamepadAxis)",
+ description = "Gets the direction of a virtual gamepad axis. If the Joystick isn't recognized as a gamepad or isn't connected, this function will always return 0.",
+ returns = "(direction: number)",
+ type = "function"
+ },
+ getGamepadMapping = {
+ args = "(axis: GamepadAxis)",
+ description = "Gets the button, axis or hat that a virtual gamepad input is bound to.",
+ returns = "(inputtype: JoystickInputType, inputindex: number, hatdirection: JoystickHat)",
+ type = "function"
+ },
+ getHat = {
+ args = "(hat: number)",
+ description = "Gets the direction of a hat.",
+ returns = "(direction: JoystickHat)",
+ type = "function"
+ },
+ getHatCount = {
+ args = "()",
+ description = "Gets the number of hats on the joystick.",
+ returns = "(hats: number)",
+ type = "function"
+ },
+ getID = {
+ args = "()",
+ description = "Gets the joystick's unique identifier. The identifier will remain the same for the life of the game, even when the Joystick is disconnected and reconnected, but it will change when the game is re-launched.",
+ returns = "(id: number, instanceid: number)",
+ type = "function"
+ },
+ getName = {
+ args = "()",
+ description = "Gets the name of the joystick.",
+ returns = "(name: string)",
+ type = "function"
+ },
+ getVibration = {
+ args = "()",
+ description = "Gets the current vibration motor strengths on a Joystick with rumble support.",
+ returns = "(left: number, right: number)",
+ type = "function"
+ },
+ isConnected = {
+ args = "()",
+ description = "Gets whether the Joystick is connected.",
+ returns = "(connected: boolean)",
+ type = "function"
+ },
+ isDown = {
+ args = "(...: number)",
+ description = "Checks if a button on the Joystick is pressed.",
+ returns = "(anyDown: boolean)",
+ type = "function"
+ },
+ isGamepad = {
+ args = "()",
+ description = "Gets whether the Joystick is recognized as a gamepad. If this is the case, the Joystick's buttons and axes can be used in a standardized manner across different operating systems and joystick models via Joystick:getGamepadAxis and related functions.\n\nLÖVE automatically recognizes most popular controllers with a similar layout to the Xbox 360 controller as gamepads, but you can add more with love.joystick.setGamepadMapping.",
+ returns = "(isgamepad: boolean)",
+ type = "function"
+ },
+ isGamepadDown = {
+ args = "(...: GamepadButton)",
+ description = "Checks if a virtual gamepad button on the Joystick is pressed. If the Joystick is not recognized as a Gamepad or isn't connected, then this function will always return false.",
+ returns = "(anyDown: boolean)",
+ type = "function"
+ },
+ isVibrationSupported = {
+ args = "()",
+ description = "Gets whether the Joystick supports vibration.",
+ returns = "(supported: boolean)",
+ type = "function"
+ },
+ setVibration = {
+ args = "(left: number, right: number)",
+ description = "Sets the vibration motor speeds on a Joystick with rumble support.",
+ returns = "(success: boolean)",
+ type = "function"
+ }
+ },
+ description = "Represents a physical joystick.",
+ type = "lib"
+ },
+ JoystickHat = {
+ childs = {
+ c = {
+ description = "Centered",
+ type = "value"
+ },
+ d = {
+ description = "Down",
+ type = "value"
+ },
+ l = {
+ description = "Left",
+ type = "value"
+ },
+ ld = {
+ description = "Left+Down",
+ type = "value"
+ },
+ lu = {
+ description = "Left+Up",
+ type = "value"
+ },
+ r = {
+ description = "Right",
+ type = "value"
+ },
+ rd = {
+ description = "Right+Down",
+ type = "value"
+ },
+ ru = {
+ description = "Right+Up",
+ type = "value"
+ },
+ u = {
+ description = "Up",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ JoystickInputType = {
+ childs = {
+ axis = {
+ description = "Analog axis.",
+ type = "value"
+ },
+ button = {
+ description = "Button.",
+ type = "value"
+ },
+ hat = {
+ description = "8-direction hat value.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ getJoysticks = {
+ args = "()",
+ description = "Gets a list of connected Joysticks.",
+ returns = "(joysticks: table)",
+ type = "function"
+ },
+ loadGamepadMappings = {
+ args = "(filename: string)",
+ description = "Loads a gamepad mappings string or file created with love.joystick.saveGamepadMappings.",
+ returns = "()",
+ type = "function"
+ },
+ saveGamepadMappings = {
+ args = "(filename: string)",
+ description = "Saves the virtual gamepad mappings of all Joysticks that are recognized as gamepads and have either been recently used or their gamepad bindings have been modified.",
+ returns = "(mappings: string)",
+ type = "function"
+ },
+ setGamepadMapping = {
+ args = "(guid: string, button: GamepadButton, inputtype: JoystickInputType, inputindex: number, hatdirection: JoystickHat)",
+ description = "Binds a virtual gamepad input to a button, axis or hat for all Joysticks of a certain type. For example, if this function is used with a GUID returned by a Dualshock 3 controller in OS X, the binding will affect Joystick:getGamepadAxis and Joystick:isGamepadDown for all Dualshock 3 controllers used with the game when run in OS X.\n\nLÖVE includes built-in gamepad bindings for many common controllers. This function lets you change the bindings or add new ones for types of Joysticks which aren't recognized as gamepads by default.\n\nThe virtual gamepad buttons and axes are designed around the Xbox 360 controller layout.",
+ returns = "(success: boolean)",
+ type = "function"
+ }
+ },
+ description = "Provides an interface to the user's joystick.",
+ type = "class"
+ },
+ joystickadded = {
+ args = "(joystick: Joystick)",
+ description = "Called when a Joystick is connected.\n\nThis callback is also triggered after love.load for every Joystick which was already connected when the game started up.",
+ returns = "()",
+ type = "function"
+ },
+ joystickaxis = {
+ args = "(joystick: Joystick, axis: number, value: number)",
+ description = "Called when a joystick axis moves.",
+ returns = "()",
+ type = "function"
+ },
+ joystickhat = {
+ args = "(joystick: Joystick, hat: number, direction: JoystickHat)",
+ description = "Called when a joystick hat direction changes.",
+ returns = "()",
+ type = "function"
+ },
+ joystickpressed = {
+ args = "(joystick: number, button: number)",
+ description = "Called when a joystick button is pressed.",
+ returns = "()",
+ type = "function"
+ },
+ joystickreleased = {
+ args = "(joystick: number, button: number)",
+ description = "Called when a joystick button is released.",
+ returns = "()",
+ type = "function"
+ },
+ joystickremoved = {
+ args = "(joystick: Joystick)",
+ description = "Called when a Joystick is disconnected.",
+ returns = "()",
+ type = "function"
+ },
+ keyboard = {
+ childs = {
+ KeyConstant = {
+ childs = {
+ ["!"] = {
+ description = "Exclamation mark key",
+ type = "value"
+ },
+ ["\""] = {
+ description = "Double quote key",
+ type = "value"
+ },
+ ["#"] = {
+ description = "Hash key",
+ type = "value"
+ },
+ ["$"] = {
+ description = "Dollar key",
+ type = "value"
+ },
+ ["&"] = {
+ description = "Ampersand key",
+ type = "value"
+ },
+ ["'"] = {
+ description = "Single quote key",
+ type = "value"
+ },
+ ["("] = {
+ description = "Left parenthesis key",
+ type = "value"
+ },
+ [")"] = {
+ description = "Right parenthesis key",
+ type = "value"
+ },
+ ["*"] = {
+ description = "Asterisk key",
+ type = "value"
+ },
+ ["+"] = {
+ description = "Plus key",
+ type = "value"
+ },
+ [","] = {
+ description = "Comma key",
+ type = "value"
+ },
+ ["-"] = {
+ description = "Hyphen-minus key",
+ type = "value"
+ },
+ ["."] = {
+ description = "Full stop key",
+ type = "value"
+ },
+ ["/"] = {
+ description = "Slash key",
+ type = "value"
+ },
+ ["0"] = {
+ description = "The zero key",
+ type = "value"
+ },
+ ["1"] = {
+ description = "The one key",
+ type = "value"
+ },
+ ["2"] = {
+ description = "The two key",
+ type = "value"
+ },
+ ["3"] = {
+ description = "The three key",
+ type = "value"
+ },
+ ["4"] = {
+ description = "The four key",
+ type = "value"
+ },
+ ["5"] = {
+ description = "The five key",
+ type = "value"
+ },
+ ["6"] = {
+ description = "The six key",
+ type = "value"
+ },
+ ["7"] = {
+ description = "The seven key",
+ type = "value"
+ },
+ ["8"] = {
+ description = "The eight key",
+ type = "value"
+ },
+ ["9"] = {
+ description = "The nine key",
+ type = "value"
+ },
+ [":"] = {
+ description = "Colon key",
+ type = "value"
+ },
+ [";"] = {
+ description = "Semicolon key",
+ type = "value"
+ },
+ ["<"] = {
+ description = "Less-than key",
+ type = "value"
+ },
+ ["="] = {
+ description = "Equal key",
+ type = "value"
+ },
+ [">"] = {
+ description = "Greater-than key",
+ type = "value"
+ },
+ ["?"] = {
+ description = "Question mark key",
+ type = "value"
+ },
+ ["@"] = {
+ description = "At sign key",
+ type = "value"
+ },
+ ["["] = {
+ description = "Left square bracket key",
+ type = "value"
+ },
+ ["\\"] = {
+ description = "Backslash key",
+ type = "value"
+ },
+ ["]"] = {
+ description = "Right square bracket key",
+ type = "value"
+ },
+ ["^"] = {
+ description = "Caret key",
+ type = "value"
+ },
+ _ = {
+ description = "Underscore key",
+ type = "value"
+ },
+ ["`"] = {
+ description = "Grave accent key",
+ notes = "Also known as the \"Back tick\" key",
+ type = "value"
+ },
+ a = {
+ description = "The A key",
+ type = "value"
+ },
+ appback = {
+ description = "Application back key",
+ type = "value"
+ },
+ appbookmarks = {
+ description = "Application bookmarks key",
+ type = "value"
+ },
+ appforward = {
+ description = "Application forward key",
+ type = "value"
+ },
+ apphome = {
+ description = "Application home key",
+ type = "value"
+ },
+ apprefresh = {
+ description = "Application refresh key",
+ type = "value"
+ },
+ appsearch = {
+ description = "Application search key",
+ type = "value"
+ },
+ b = {
+ description = "The B key",
+ type = "value"
+ },
+ backspace = {
+ description = "Backspace key",
+ type = "value"
+ },
+ ["break"] = {
+ description = "Break key",
+ type = "value"
+ },
+ c = {
+ description = "The C key",
+ type = "value"
+ },
+ calculator = {
+ description = "Calculator key",
+ type = "value"
+ },
+ capslock = {
+ description = "Caps-lock key",
+ notes = "Caps-on is a key press. Caps-off is a key release.",
+ type = "value"
+ },
+ clear = {
+ description = "Clear key",
+ type = "value"
+ },
+ compose = {
+ description = "Compose key",
+ type = "value"
+ },
+ d = {
+ description = "The D key",
+ type = "value"
+ },
+ delete = {
+ description = "Delete key",
+ type = "value"
+ },
+ down = {
+ description = "Down cursor key",
+ type = "value"
+ },
+ e = {
+ description = "The E key",
+ type = "value"
+ },
+ ["end"] = {
+ description = "End key",
+ type = "value"
+ },
+ escape = {
+ description = "Escape key",
+ type = "value"
+ },
+ euro = {
+ description = "Euro (&euro;) key",
+ type = "value"
+ },
+ f = {
+ description = "The F key",
+ type = "value"
+ },
+ f1 = {
+ description = "The 1st function key",
+ type = "value"
+ },
+ f2 = {
+ description = "The 2nd function key",
+ type = "value"
+ },
+ f3 = {
+ description = "The 3rd function key",
+ type = "value"
+ },
+ f4 = {
+ description = "The 4th function key",
+ type = "value"
+ },
+ f5 = {
+ description = "The 5th function key",
+ type = "value"
+ },
+ f6 = {
+ description = "The 6th function key",
+ type = "value"
+ },
+ f7 = {
+ description = "The 7th function key",
+ type = "value"
+ },
+ f8 = {
+ description = "The 8th function key",
+ type = "value"
+ },
+ f9 = {
+ description = "The 9th function key",
+ type = "value"
+ },
+ f10 = {
+ description = "The 10th function key",
+ type = "value"
+ },
+ f11 = {
+ description = "The 11th function key",
+ type = "value"
+ },
+ f12 = {
+ description = "The 12th function key",
+ type = "value"
+ },
+ f13 = {
+ description = "The 13th function key",
+ type = "value"
+ },
+ f14 = {
+ description = "The 14th function key",
+ type = "value"
+ },
+ f15 = {
+ description = "The 15th function key",
+ type = "value"
+ },
+ g = {
+ description = "The G key",
+ type = "value"
+ },
+ h = {
+ description = "The H key",
+ type = "value"
+ },
+ help = {
+ description = "Help key",
+ type = "value"
+ },
+ home = {
+ description = "Home key",
+ type = "value"
+ },
+ i = {
+ description = "The I key",
+ type = "value"
+ },
+ insert = {
+ description = "Insert key",
+ type = "value"
+ },
+ j = {
+ description = "The J key",
+ type = "value"
+ },
+ k = {
+ description = "The K key",
+ type = "value"
+ },
+ ["kp*"] = {
+ description = "The numpad multiplication key",
+ type = "value"
+ },
+ ["kp+"] = {
+ description = "The numpad addition key",
+ type = "value"
+ },
+ ["kp-"] = {
+ description = "The numpad substraction key",
+ type = "value"
+ },
+ ["kp."] = {
+ description = "The numpad decimal point key",
+ type = "value"
+ },
+ ["kp/"] = {
+ description = "The numpad division key",
+ type = "value"
+ },
+ kp0 = {
+ description = "The numpad zero key",
+ type = "value"
+ },
+ kp1 = {
+ description = "The numpad one key",
+ type = "value"
+ },
+ kp2 = {
+ description = "The numpad two key",
+ type = "value"
+ },
+ kp3 = {
+ description = "The numpad three key",
+ type = "value"
+ },
+ kp4 = {
+ description = "The numpad four key",
+ type = "value"
+ },
+ kp5 = {
+ description = "The numpad five key",
+ type = "value"
+ },
+ kp6 = {
+ description = "The numpad six key",
+ type = "value"
+ },
+ kp7 = {
+ description = "The numpad seven key",
+ type = "value"
+ },
+ kp8 = {
+ description = "The numpad eight key",
+ type = "value"
+ },
+ kp9 = {
+ description = "The numpad nine key",
+ type = "value"
+ },
+ ["kp="] = {
+ description = "The numpad equals key",
+ type = "value"
+ },
+ kpenter = {
+ description = "The numpad enter key",
+ type = "value"
+ },
+ l = {
+ description = "The L key",
+ type = "value"
+ },
+ lalt = {
+ description = "Left alt key",
+ type = "value"
+ },
+ lctrl = {
+ description = "Left control key",
+ type = "value"
+ },
+ left = {
+ description = "Left cursor key",
+ type = "value"
+ },
+ lmeta = {
+ description = "Left meta key",
+ type = "value"
+ },
+ lshift = {
+ description = "Left shift key",
+ type = "value"
+ },
+ lsuper = {
+ description = "Left super key",
+ type = "value"
+ },
+ m = {
+ description = "The M key",
+ type = "value"
+ },
+ mail = {
+ description = "Mail key",
+ type = "value"
+ },
+ menu = {
+ description = "Menu key",
+ type = "value"
+ },
+ mode = {
+ description = "Mode key",
+ type = "value"
+ },
+ n = {
+ description = "The N key",
+ type = "value"
+ },
+ numlock = {
+ description = "Num-lock key",
+ type = "value"
+ },
+ o = {
+ description = "The O key",
+ type = "value"
+ },
+ p = {
+ description = "The P key",
+ type = "value"
+ },
+ pagedown = {
+ description = "Page down key",
+ type = "value"
+ },
+ pageup = {
+ description = "Page up key",
+ type = "value"
+ },
+ pause = {
+ description = "Pause key",
+ type = "value"
+ },
+ power = {
+ description = "Power key",
+ type = "value"
+ },
+ print = {
+ description = "Print key",
+ type = "value"
+ },
+ q = {
+ description = "The Q key",
+ type = "value"
+ },
+ r = {
+ description = "The R key",
+ type = "value"
+ },
+ ralt = {
+ description = "Right alt key",
+ type = "value"
+ },
+ rctrl = {
+ description = "Right control key",
+ type = "value"
+ },
+ ["return"] = {
+ description = "Return key",
+ notes = "Also known as the Enter key",
+ type = "value"
+ },
+ right = {
+ description = "Right cursor key",
+ type = "value"
+ },
+ rmeta = {
+ description = "Right meta key",
+ type = "value"
+ },
+ rshift = {
+ description = "Right shift key",
+ type = "value"
+ },
+ rsuper = {
+ description = "Right super key",
+ type = "value"
+ },
+ s = {
+ description = "The S key",
+ type = "value"
+ },
+ scrollock = {
+ description = "Scroll-lock key",
+ type = "value"
+ },
+ space = {
+ description = "Space key",
+ notes = "In version 0.9.2 and earlier this is represented by the actual space character",
+ type = "value"
+ },
+ sysreq = {
+ description = "System request key",
+ type = "value"
+ },
+ t = {
+ description = "The T key",
+ type = "value"
+ },
+ tab = {
+ description = "Tab key",
+ type = "value"
+ },
+ u = {
+ description = "The U key",
+ type = "value"
+ },
+ undo = {
+ description = "Undo key",
+ type = "value"
+ },
+ up = {
+ description = "Up cursor key",
+ type = "value"
+ },
+ v = {
+ description = "The V key",
+ type = "value"
+ },
+ w = {
+ description = "The W key",
+ type = "value"
+ },
+ www = {
+ description = "WWW key",
+ type = "value"
+ },
+ x = {
+ description = "The X key",
+ type = "value"
+ },
+ y = {
+ description = "The Y key",
+ type = "value"
+ },
+ z = {
+ description = "The Z key",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ getScancodeFromKey = {
+ args = "(key: KeyConstant)",
+ description = "Gets the hardware scancode corresponding to the given key.\n\nUnlike key constants, Scancodes are keyboard layout-independent. For example the scancode \"w\" will be generated if the key in the same place as the \"w\" key on an American keyboard is pressed, no matter what the key is labelled or what the user's operating system settings are.\n\nScancodes are useful for creating default controls that have the same physical locations on on all systems.",
+ returns = "(scancode: Scancode)",
+ type = "function"
+ },
+ hasKeyRepeat = {
+ args = "()",
+ description = "Gets whether key repeat is enabled.",
+ returns = "(enabled: boolean)",
+ type = "function"
+ },
+ hasTextInput = {
+ args = "()",
+ description = "Gets whether text input events are enabled.",
+ returns = "(enabled: boolean)",
+ type = "function"
+ },
+ isDown = {
+ args = "(key: KeyConstant)",
+ description = "Checks whether a certain key is down. Not to be confused with love.keypressed or love.keyreleased.",
+ returns = "(down: boolean)",
+ type = "function"
+ },
+ isScancodeDown = {
+ args = "(scancode: Scancode, ...: Scancode)",
+ description = "Checks whether the specified Scancodes are pressed. Not to be confused with love.keypressed or love.keyreleased.\n\nUnlike regular KeyConstants, Scancodes are keyboard layout-independent. The scancode \"w\" is used if the key in the same place as the \"w\" key on an American keyboard is pressed, no matter what the key is labelled or what the user's operating system settings are.",
+ returns = "(down: boolean)",
+ type = "function"
+ },
+ setKeyRepeat = {
+ args = "(enable: boolean)",
+ description = "Enables or disables key repeat. It is disabled by default.\n\nThe interval between repeats depends on the user's system settings.",
+ returns = "()",
+ type = "function"
+ },
+ setTextInput = {
+ args = "(enable: boolean)",
+ description = "Enables or disables text input events. It is enabled by default on Windows, Mac, and Linux, and disabled by default on iOS and Android.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Provides an interface to the user's keyboard.",
+ type = "lib"
+ },
+ keypressed = {
+ args = "(key: KeyConstant, scancode: Scancode, isrepeat: boolean)",
+ description = "Callback function triggered when a key is pressed.",
+ returns = "()",
+ type = "function"
+ },
+ keyreleased = {
+ args = "(key: KeyConstant)",
+ description = "Callback function triggered when a keyboard key is released.",
+ returns = "()",
+ type = "function"
+ },
+ load = {
+ args = "(arg: table)",
+ description = "This function is called exactly once at the beginning of the game.",
+ returns = "()",
+ type = "function"
+ },
+ lowmemory = {
+ args = "()",
+ description = "Callback function triggered when the system is running out of memory on mobile devices.\n\n Mobile operating systems may forcefully kill the game if it uses too much memory, so any non-critical resource should be removed if possible (by setting all variables referencing the resources to nil, and calling collectgarbage()), when this event is triggered. Sounds and images in particular tend to use the most memory.",
+ returns = "()",
+ type = "function"
+ },
+ math = {
+ childs = {
+ BezierCurve = {
+ childs = {
+ getControlPoint = {
+ args = "(i: number)",
+ description = "Get coordinates of the i-th control point. Indices start with 1.",
+ returns = "(x: number, y: number)",
+ type = "function"
+ },
+ getControlPointCount = {
+ args = "()",
+ description = "Get the number of control points in the Bézier curve.",
+ returns = "(count: number)",
+ type = "function"
+ },
+ getDegree = {
+ args = "()",
+ description = "Get degree of the Bézier curve. The degree is equal to number-of-control-points - 1.",
+ returns = "(degree: number)",
+ type = "function"
+ },
+ getDerivative = {
+ args = "()",
+ description = "Get the derivative of the Bézier curve.\n\nThis function can be used to rotate sprites moving along a curve in the direction of the movement and compute the direction perpendicular to the curve at some parameter t.",
+ returns = "(derivative: BezierCurve)",
+ type = "function"
+ },
+ getSegment = {
+ args = "(startpoint: number, endpoint: number)",
+ description = "Gets a BezierCurve that corresponds to the specified segment of this BezierCurve.",
+ returns = "(curve: BezierCurve)",
+ type = "function"
+ },
+ insertControlPoint = {
+ args = "(x: number, y: number, i: number)",
+ description = "Insert control point after the i-th control point. Indices start with 1. Negative indices wrap around: -1 is the last control point, -2 the one before the last, etc.",
+ returns = "()",
+ type = "function"
+ },
+ removeControlPoint = {
+ args = "(index: number)",
+ description = "Removes the specified control point.",
+ returns = "()",
+ type = "function"
+ },
+ render = {
+ args = "(depth: number)",
+ description = "Get a list of coordinates to be used with love.graphics.line.\n\nThis function samples the Bézier curve using recursive subdivision. You can control the recursion depth using the depth parameter.\n\nIf you are just interested to know the position on the curve given a parameter, use BezierCurve:evalulate.",
+ returns = "(coordinates: table)",
+ type = "function"
+ },
+ renderSegment = {
+ args = "(startpoint: number, endpoint: number, depth: number)",
+ description = "Get a list of coordinates on a specific part of the curve, to be used with love.graphics.line.\n\nThis function samples the Bézier curve using recursive subdivision. You can control the recursion depth using the depth parameter.\n\nIf you are just need to know the position on the curve given a parameter, use BezierCurve:evaluate.",
+ returns = "(coordinates: table)",
+ type = "function"
+ },
+ rotate = {
+ args = "(angle: number, ox: number, oy: number)",
+ description = "Rotate the Bézier curve by an angle.",
+ returns = "()",
+ type = "function"
+ },
+ scale = {
+ args = "(s: number, ox: number, oy: number)",
+ description = "Scale the Bézier curve by a factor.",
+ returns = "()",
+ type = "function"
+ },
+ setControlPoint = {
+ args = "(i: number, ox: number, oy: number)",
+ description = "Set coordinates of the i-th control point. Indices start with 1.",
+ returns = "()",
+ type = "function"
+ },
+ translate = {
+ args = "(dx: number, dy: number)",
+ description = "Move the Bézier curve by an offset.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "A Bézier curve object that can evaluate and render Bézier curves of arbitrary degree.",
+ type = "lib"
+ },
+ CompressedData = {
+ childs = {
+ getFormat = {
+ args = "()",
+ description = "Gets the compression format of the CompressedData.",
+ returns = "(format: CompressedDataFormat)",
+ type = "function"
+ }
+ },
+ description = "Represents byte data compressed using a specific algorithm.\n\nlove.math.decompress can be used to de-compress the data.",
+ type = "lib"
+ },
+ CompressedDataFormat = {
+ childs = {
+ gzip = {
+ description = "The gzip format is DEFLATE-compressed data with a slightly larger header than zlib. Since it uses DEFLATE it has the same compression characteristics as the zlib format.",
+ type = "value"
+ },
+ lz4 = {
+ description = "The LZ4 compression format. Compresses and decompresses very quickly, but the compression ratio is not the best. LZ4-HC is used when compression level 9 is specified.",
+ type = "value"
+ },
+ zlib = {
+ description = "The zlib format is DEFLATE-compressed data with a small bit of header data. Compresses relatively slowly and decompresses moderately quickly, and has a decent compression ratio.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ RandomGenerator = {
+ childs = {
+ getState = {
+ args = "()",
+ description = "Gets the current state of the random number generator. This returns an opaque implementation-dependent string which is only useful for later use with RandomGenerator:setState.\n\nThis is different from RandomGenerator:getSeed in that getState gets the RandomGenerator's current state, whereas getSeed gets the previously set seed number.\n\nThe value of the state string does not depend on the current operating system.",
+ returns = "(state: string)",
+ type = "function"
+ },
+ random = {
+ args = "(max: number)",
+ description = "Generates a pseudo-random number in a platform independent manner.",
+ returns = "(number: number)",
+ type = "function"
+ },
+ randomNormal = {
+ args = "(stddev: number, mean: number)",
+ description = "Get a normally distributed pseudo random number.",
+ returns = "(number: number)",
+ type = "function"
+ },
+ setSeed = {
+ args = "(seed: number)",
+ description = "Sets the seed of the random number generator using the specified integer number.",
+ returns = "()",
+ type = "function"
+ },
+ setState = {
+ args = "(state: string)",
+ description = "Sets the current state of the random number generator. The value used as an argument for this function is an opaque implementation-dependent string and should only originate from a previous call to RandomGenerator:getState.\n\nThis is different from RandomGenerator:setSeed in that setState directly sets the RandomGenerator's current implementation-dependent state, whereas setSeed gives it a new seed value.\n\nThe effect of the state string does not depend on the current operating system.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "A random number generation object which has its own random state.",
+ type = "lib"
+ },
+ decompress = {
+ args = "(compressedData: CompressedData)",
+ description = "Decompresses a CompressedData or previously compressed string or Data object.",
+ returns = "(rawstring: string)",
+ type = "function"
+ },
+ gammaToLinear = {
+ args = "(r: number, g: number, b: number)",
+ description = "Converts a color from gamma-space (sRGB) to linear-space (RGB). This is useful when doing gamma-correct rendering using colors created based on what they look like on-screen.\n\nGamma-space sRGB has more precision in the lower end than linear RGB. Using this function to convert from sRGB to RGB can result in non-integer color values, which get truncated to integers and lose precision when used with other functions such as love.graphics.setColor.",
+ returns = "(lr: number, lg: number, lb: number)",
+ type = "function"
+ },
+ getRandomSeed = {
+ args = "()",
+ description = "Gets the seed of the random number generator.\n\nThe state is split into two numbers due to Lua's use of doubles for all number values - doubles can't accurately represent integer values above 2^53.",
+ returns = "(low: number, high: number)",
+ type = "function"
+ },
+ getRandomState = {
+ args = "()",
+ description = "Gets the current state of the random number generator. This returns an opaque implementation-dependent string which is only useful for later use with RandomGenerator:setState.\n\nThis is different from RandomGenerator:getSeed in that getState gets the RandomGenerator's current state, whereas getSeed gets the previously set seed number.\n\nThe value of the state string does not depend on the current operating system.",
+ returns = "(state: string)",
+ type = "function"
+ },
+ isConvex = {
+ args = "(vertices: table)",
+ description = "Checks whether a polygon is convex.\n\nPolygonShapes in love.physics, some forms of Mesh, and polygons drawn with love.graphics.polygon must be simple convex polygons.",
+ returns = "(convex: boolean)",
+ type = "function"
+ },
+ linearToGamma = {
+ args = "(lr: number, lg: number, lb: number)",
+ description = "Converts a color from linear-space (RGB) to gamma-space (sRGB). This is useful when storing linear RGB color values in an image, because the linear RGB color space has less precision than sRGB for dark colors, which can result in noticeable color banding when drawing.\n\nIn general, colors chosen based on what they look like on-screen are already in gamma-space and should not be double-converted. Colors calculated using math are often in the linear RGB space.",
+ returns = "(cr: number, cg: number, cb: number)",
+ type = "function"
+ },
+ newBezierCurve = {
+ args = "(vertices: table)",
+ description = "Creates a new BezierCurve object.\n\nThe number of vertices in the control polygon determines the degree of the curve, e.g. three vertices define a quadratic (degree 2) Bézier curve, four vertices define a cubic (degree 3) Bézier curve, etc.",
+ returns = "(curve: BezierCurve)",
+ type = "function"
+ },
+ newRandomGenerator = {
+ args = "(low: number, high: number)",
+ description = "Creates a new RandomGenerator object which is completely independent of other RandomGenerator objects and random functions.",
+ returns = "(rng: RandomGenerator)",
+ type = "function"
+ },
+ noise = {
+ args = "(x: number)",
+ description = "Generates a Simplex or Perlin noise value in 1-4 dimensions.\n\nSimplex noise is closely related to Perlin noise. It is widely used for procedural content generation.\n\nThere are many webpages which discuss Perlin and Simplex noise in detail.",
+ returns = "(value: number)",
+ type = "function"
+ },
+ random = {
+ args = "(max: number)",
+ description = "Generates a pseudo-random number in a platform independent manner.",
+ returns = "(number: number)",
+ type = "function"
+ },
+ randomNormal = {
+ args = "(stddev: number, mean: number)",
+ description = "Get a normally distributed pseudo random number.",
+ returns = "(number: number)",
+ type = "function"
+ },
+ setRandomSeed = {
+ args = "(seed: number)",
+ description = "Sets the seed of the random number generator using the specified integer number.",
+ returns = "()",
+ type = "function"
+ },
+ setRandomState = {
+ args = "(state: string)",
+ description = "Gets the current state of the random number generator. This returns an opaque implementation-dependent string which is only useful for later use with RandomGenerator:setState.\n\nThis is different from RandomGenerator:getSeed in that getState gets the RandomGenerator's current state, whereas getSeed gets the previously set seed number.\n\nThe value of the state string does not depend on the current operating system.",
+ returns = "()",
+ type = "function"
+ },
+ triangulate = {
+ args = "(polygon: table)",
+ description = "Triangulate a simple polygon.",
+ returns = "(triangles: table)",
+ type = "function"
+ }
+ },
+ description = "Provides system-independent mathematical functions.",
+ type = "class"
+ },
+ mouse = {
+ childs = {
+ Cursor = {
+ childs = {
+ getType = {
+ args = "()",
+ description = "Gets the type of the Cursor.",
+ returns = "(cursortype: CursorType)",
+ type = "function"
+ }
+ },
+ description = "Represents a hardware cursor.",
+ type = "lib"
+ },
+ CursorType = {
+ childs = {
+ arrow = {
+ description = "An arrow pointer.",
+ type = "value"
+ },
+ crosshair = {
+ description = "Crosshair symbol.",
+ type = "value"
+ },
+ hand = {
+ description = "Hand symbol.",
+ type = "value"
+ },
+ ibeam = {
+ description = "An I-beam, normally used when mousing over editable or selectable text.",
+ type = "value"
+ },
+ image = {
+ description = "The cursor is using a custom image.",
+ type = "value"
+ },
+ no = {
+ description = "Slashed circle or crossbones.",
+ type = "value"
+ },
+ sizeall = {
+ description = "Four-pointed arrow pointing up, down, left, and right.",
+ type = "value"
+ },
+ sizenesw = {
+ description = "Double arrow pointing to the top-right and bottom-left.",
+ type = "value"
+ },
+ sizens = {
+ description = "Double arrow pointing up and down.",
+ type = "value"
+ },
+ sizenwse = {
+ description = "Double arrow pointing to the top-left and bottom-right.",
+ type = "value"
+ },
+ sizewe = {
+ description = "Double arrow pointing left and right.",
+ type = "value"
+ },
+ wait = {
+ description = "Wait graphic.",
+ type = "value"
+ },
+ waitarrow = {
+ description = "Small wait cursor with an arrow pointer.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ getPosition = {
+ args = "()",
+ description = "Returns the current position of the mouse.",
+ returns = "(x: number, y: number)",
+ type = "function"
+ },
+ getRelativeMode = {
+ args = "()",
+ description = "Gets whether relative mode is enabled for the mouse.\n\nIf relative mode is enabled, the cursor is hidden and doesn't move when the mouse does, but relative mouse motion events are still generated via love.mousemoved. This lets the mouse move in any direction indefinitely without the cursor getting stuck at the edges of the screen.\n\nThe reported position of the mouse is not updated while relative mode is enabled, even when relative mouse motion events are generated.",
+ returns = "(enabled: boolean)",
+ type = "function"
+ },
+ getSystemCursor = {
+ args = "(ctype: CursorType)",
+ description = "Gets a Cursor object representing a system-native hardware cursor.\n\n Hardware cursors are framerate-independent and work the same way as normal operating system cursors. Unlike drawing an image at the mouse's current coordinates, hardware cursors never have visible lag between when the mouse is moved and when the cursor position updates, even at low framerates.",
+ returns = "(cursor: Cursor)",
+ type = "function"
+ },
+ getX = {
+ args = "()",
+ description = "Returns the current x position of the mouse.",
+ returns = "(x: number)",
+ type = "function"
+ },
+ getY = {
+ args = "()",
+ description = "Returns the current y position of the mouse.",
+ returns = "(y: number)",
+ type = "function"
+ },
+ hasCursor = {
+ args = "()",
+ description = "Gets whether cursor functionality is supported.\n\nIf it isn't supported, calling love.mouse.newCursor and love.mouse.getSystemCursor will cause an error. Mobile devices do not support cursors.",
+ returns = "(hascursor: boolean)",
+ type = "function"
+ },
+ isDown = {
+ args = "(button: number, ...: number)",
+ description = "Checks whether a certain mouse button is down. This function does not detect mousewheel scrolling; you must use the love.wheelmoved (or love.mousepressed in version 0.9.2 and older) callback for that.",
+ returns = "(down: boolean)",
+ type = "function"
+ },
+ isGrabbed = {
+ args = "()",
+ description = "Checks if the mouse is grabbed.",
+ returns = "(grabbed: boolean)",
+ type = "function"
+ },
+ isVisible = {
+ args = "()",
+ description = "Checks if the cursor is visible.",
+ returns = "(visible: boolean)",
+ type = "function"
+ },
+ newCursor = {
+ args = "(imageData: ImageData, hotx: number, hoty: number)",
+ description = "Creates a new hardware Cursor object from an image file or ImageData.\n\nHardware cursors are framerate-independent and work the same way as normal operating system cursors. Unlike drawing an image at the mouse's current coordinates, hardware cursors never have visible lag between when the mouse is moved and when the cursor position updates, even at low frameratesn\n\nThe hot spot is the point the operating system uses to determine what was clicked and at what position the mouse cursor is. For example, the normal arrow pointer normally has its hot spot at the top left of the image, but a crosshair cursor might have it in the middle.",
+ returns = "(cursor: Cursor)",
+ type = "function"
+ },
+ setCursor = {
+ args = "(cursor: Cursor)",
+ description = "Sets the current mouse cursor.\n\nResets the current mouse cursor to the default when called without arguments.",
+ returns = "()",
+ type = "function"
+ },
+ setGrabbed = {
+ args = "(grab: boolean)",
+ description = "Grabs the mouse and confines it to the window.",
+ returns = "()",
+ type = "function"
+ },
+ setPosition = {
+ args = "(x: number, y: number)",
+ description = "Sets the position of the mouse.",
+ returns = "()",
+ type = "function"
+ },
+ setRelativeMode = {
+ args = "(enable: boolean)",
+ description = "Sets whether relative mode is enabled for the mouse.\n\nWhen relative mode is enabled, the cursor is hidden and doesn't move when the mouse does, but relative mouse motion events are still generated via love.mousemoved. This lets the mouse move in any direction indefinitely without the cursor getting stuck at the edges of the screen.\n\nThe reported position of the mouse is not updated while relative mode is enabled, even when relative mouse motion events are generated.",
+ returns = "()",
+ type = "function"
+ },
+ setVisible = {
+ args = "(visible: boolean)",
+ description = "Sets the visibility of the cursor.",
+ returns = "()",
+ type = "function"
+ },
+ setX = {
+ args = "(x: number)",
+ description = "Sets the current X position of the mouse.",
+ returns = "()",
+ type = "function"
+ },
+ setY = {
+ args = "(y: number)",
+ description = "Sets the current Y position of the mouse.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Provides an interface to the user's mouse.",
+ type = "class"
+ },
+ mousefocus = {
+ args = "(f: boolean)",
+ description = "Callback function triggered when window receives or loses mouse focus.",
+ returns = "()",
+ type = "function"
+ },
+ mousemoved = {
+ args = "(x: number, y: number, dx: number, dy: number)",
+ description = "Callback function triggered when the mouse is moved.",
+ returns = "()",
+ type = "function"
+ },
+ mousepressed = {
+ args = "(x: number, y: number, button: number, isTouch: boolean)",
+ description = "Callback function triggered when a mouse button is pressed.",
+ returns = "()",
+ type = "function"
+ },
+ mousereleased = {
+ args = "(x: number, y: number, button: number, isTouch: boolean)",
+ description = "Callback function triggered when a mouse button is released.",
+ returns = "()",
+ type = "function"
+ },
+ physics = {
+ childs = {
+ Body = {
+ childs = {
+ applyForce = {
+ args = "(fx: number, fy: number)",
+ description = "Apply force to a Body.\n\nA force pushes a body in a direction. A body with with a larger mass will react less. The reaction also depends on how long a force is applied: since the force acts continuously over the entire timestep, a short timestep will only push the body for a short time. Thus forces are best used for many timesteps to give a continuous push to a body (like gravity). For a single push that is independent of timestep, it is better to use Body:applyLinearImpulse.\n\nIf the position to apply the force is not given, it will act on the center of mass of the body. The part of the force not directed towards the center of mass will cause the body to spin (and depends on the rotational inertia).\n\nNote that the force components and position must be given in world coordinates.",
+ returns = "()",
+ type = "function"
+ },
+ applyLinearImpulse = {
+ args = "(ix: number, iy: number)",
+ description = "Applies an impulse to a body. This makes a single, instantaneous addition to the body momentum.\n\nAn impulse pushes a body in a direction. A body with with a larger mass will react less. The reaction does not depend on the timestep, and is equivalent to applying a force continuously for 1 second. Impulses are best used to give a single push to a body. For a continuous push to a body it is better to use Body:applyForce.\n\nIf the position to apply the impulse is not given, it will act on the center of mass of the body. The part of the impulse not directed towards the center of mass will cause the body to spin (and depends on the rotational inertia).\n\nNote that the impulse components and position must be given in world coordinates.",
+ returns = "()",
+ type = "function"
+ },
+ applyTorque = {
+ args = "(torque: number)",
+ description = "Apply torque to a body.\n\nTorque is like a force that will change the angular velocity (spin) of a body. The effect will depend on the rotational inertia a body has.",
+ returns = "()",
+ type = "function"
+ },
+ destroy = {
+ args = "()",
+ description = "Explicitly destroys the Body. When you don't have time to wait for garbage collection, this function may be used to free the object immediately, but note that an error will occur if you attempt to use the object after calling this function.",
+ returns = "()",
+ type = "function"
+ },
+ getAngle = {
+ args = "()",
+ description = "Get the angle of the body.\n\nThe angle is measured in radians. If you need to transform it to degrees, use math.deg.\n\nA value of 0 radians will mean \"looking to the right\". Although radians increase counter-clockwise, the y-axis points down so it becomes clockwise from our point of view.",
+ returns = "(angle: number)",
+ type = "function"
+ },
+ getAngularDamping = {
+ args = "()",
+ description = "Gets the Angular damping of the Body\n\nThe angular damping is the rate of decrease of the angular velocity over time: A spinning body with no damping and no external forces will continue spinning indefinitely. A spinning body with damping will gradually stop spinning.\n\nDamping is not the same as friction - they can be modelled together. However, only damping is provided by Box2D (and LÖVE).\n\nDamping parameters should be between 0 and infinity, with 0 meaning no damping, and infinity meaning full damping. Normally you will use a damping value between 0 and 0.1.",
+ returns = "(damping: number)",
+ type = "function"
+ },
+ getAngularVelocity = {
+ args = "()",
+ description = "Get the angular velocity of the Body.\n\nThe angular velocity is the rate of change of angle over time.\n\nIt is changed in World:update by applying torques, off centre forces/impulses, and angular damping. It can be set directly with Body:setAngularVelocity.\n\nIf you need the rate of change of position over time, use Body:getLinearVelocity.",
+ returns = "(w: number)",
+ type = "function"
+ },
+ getContactList = {
+ args = "()",
+ description = "Gets a list of all Contacts attached to the Body.",
+ returns = "(contacts: table)",
+ type = "function"
+ },
+ getFixtureList = {
+ args = "()",
+ description = "Returns a table with all fixtures.",
+ returns = "(fixtures: table)",
+ type = "function"
+ },
+ getGravityScale = {
+ args = "()",
+ description = "Returns the gravity scale factor.",
+ returns = "(scale: number)",
+ type = "function"
+ },
+ getInertia = {
+ args = "()",
+ description = "Gets the rotational inertia of the body.\n\nThe rotational inertia is how hard is it to make the body spin. It is set with the 4th argument to Body:setMass, or automatically with Body:setMassFromShapes.",
+ returns = "(inertia: number)",
+ type = "function"
+ },
+ getJointList = {
+ args = "()",
+ description = "Returns a table containing the Joints attached to this Body.",
+ returns = "(joints: table)",
+ type = "function"
+ },
+ getLinearDamping = {
+ args = "()",
+ description = "Gets the linear damping of the Body.\n\nThe linear damping is the rate of decrease of the linear velocity over time. A moving body with no damping and no external forces will continue moving indefinitely, as is the case in space. A moving body with damping will gradually stop moving.\n\nDamping is not the same as friction - they can be modelled together. However, only damping is provided by Box2D (and LÖVE).",
+ returns = "(damping: number)",
+ type = "function"
+ },
+ getLinearVelocity = {
+ args = "()",
+ description = "Gets the linear velocity of the Body from its center of mass.\n\nThe linear velocity is the rate of change of position over time.\n\nIf you need the rate of change of angle over time, use Body:getAngularVelocity. If you need to get the linear velocity of a point different from the center of mass:\n\nBody:getLinearVelocityFromLocalPoint allows you to specify the point in local coordinates.\n\nBody:getLinearVelocityFromWorldPoint allows you to specify the point in world coordinates.",
+ returns = "(x: number, y: number)",
+ type = "function"
+ },
+ getLinearVelocityFromLocalPoint = {
+ args = "(x: number, y: number)",
+ description = "Get the linear velocity of a point on the body.\n\nThe linear velocity for a point on the body is the velocity of the body center of mass plus the velocity at that point from the body spinning.\n\nThe point on the body must given in local coordinates. Use Body:getLinearVelocityFromWorldPoint to specify this with world coordinates.",
+ returns = "(vx: number, vy: number)",
+ type = "function"
+ },
+ getLinearVelocityFromWorldPoint = {
+ args = "(x: number, y: number)",
+ description = "Get the linear velocity of a point on the body.\n\nThe linear velocity for a point on the body is the velocity of the body center of mass plus the velocity at that point from the body spinning.\n\nThe point on the body must given in world coordinates. Use Body:getLinearVelocityFromLocalPoint to specify this with local coordinates.",
+ returns = "(vx: number, vy: number)",
+ type = "function"
+ },
+ getLocalCenter = {
+ args = "()",
+ description = "Get the center of mass position in local coordinates.\n\nUse Body:getWorldCenter to get the center of mass in world coordinates.",
+ returns = "(x: number, y: number)",
+ type = "function"
+ },
+ getLocalPoint = {
+ args = "(world_x: number, world_y: number)",
+ description = "Transform a point from world coordinates to local coordinates.",
+ returns = "(local_x: number, local_y: number)",
+ type = "function"
+ },
+ getLocalVector = {
+ args = "(world_x: number, world_y: number)",
+ description = "Transform a vector from world coordinates to local coordinates.",
+ returns = "(local_x: number, local_y: number)",
+ type = "function"
+ },
+ getMass = {
+ args = "()",
+ description = "Get the mass of the body.",
+ returns = "(mass: number)",
+ type = "function"
+ },
+ getMassData = {
+ args = "()",
+ description = "Returns the mass, its center, and the rotational inertia.",
+ returns = "(x: number, y: number, mass: number, inertia: number)",
+ type = "function"
+ },
+ getPosition = {
+ args = "()",
+ description = "Get the position of the body.\n\nNote that this may not be the center of mass of the body.",
+ returns = "(x: number, y: number)",
+ type = "function"
+ },
+ getType = {
+ args = "()",
+ description = "Returns the type of the body.",
+ returns = "(type: BodyType)",
+ type = "function"
+ },
+ getUserData = {
+ args = "()",
+ description = "Returns the Lua value associated with this Body.\n\nUse this function in one thread only.",
+ returns = "(value: value)",
+ type = "function"
+ },
+ getWorld = {
+ args = "()",
+ description = "Gets the World the body lives in.",
+ returns = "(world: World)",
+ type = "function"
+ },
+ getWorldCenter = {
+ args = "()",
+ description = "Get the center of mass position in world coordinates.\n\nUse Body:getLocalCenter to get the center of mass in local coordinates.",
+ returns = "(x: number, y: number)",
+ type = "function"
+ },
+ getWorldPoint = {
+ args = "(local_x: number, local_y: number)",
+ description = "Transform a point from local coordinates to world coordinates.",
+ returns = "(world_x: number, world_y: number)",
+ type = "function"
+ },
+ getWorldPoints = {
+ args = "(x1: number, y1: number, x2: number, y2: number, ...: number)",
+ description = "Transforms multiple points from local coordinates to world coordinates.",
+ returns = "(x1: number, y1: number, x2: number, y2: number, ...: number)",
+ type = "function"
+ },
+ getWorldVector = {
+ args = "(local_x: number, local_y: number)",
+ description = "Transform a vector from local coordinates to world coordinates.",
+ returns = "(world_x: number, world_y: number)",
+ type = "function"
+ },
+ getX = {
+ args = "()",
+ description = "Get the x position of the body in world coordinates.",
+ returns = "(x: number)",
+ type = "function"
+ },
+ getY = {
+ args = "()",
+ description = "Get the y position of the body in world coordinates.",
+ returns = "(y: number)",
+ type = "function"
+ },
+ isActive = {
+ args = "()",
+ description = "Returns whether the body is actively used in the simulation.",
+ returns = "(status: boolean)",
+ type = "function"
+ },
+ isAwake = {
+ args = "()",
+ description = "Returns the sleep status of the body.",
+ returns = "(status: boolean)",
+ type = "function"
+ },
+ isBullet = {
+ args = "()",
+ description = "Get the bullet status of a body.\n\nThere are two methods to check for body collisions:\n\nat their location when the world is updated (default)\n\nusing continuous collision detection (CCD)\n\nThe default method is efficient, but a body moving very quickly may sometimes jump over another body without producing a collision. A body that is set as a bullet will use CCD. This is less efficient, but is guaranteed not to jump when moving quickly.\n\nNote that static bodies (with zero mass) always use CCD, so your walls will not let a fast moving body pass through even if it is not a bullet.",
+ returns = "(status: boolean)",
+ type = "function"
+ },
+ isDestroyed = {
+ args = "()",
+ description = "Gets whether the Body is destroyed. Destroyed bodies cannot be used.",
+ returns = "(destroyed: boolean)",
+ type = "function"
+ },
+ isFixedRotation = {
+ args = "()",
+ description = "Returns whether the body rotation is locked.",
+ returns = "(fixed: boolean)",
+ type = "function"
+ },
+ isSleepingAllowed = {
+ args = "()",
+ description = "Returns the sleeping behaviour of the body.",
+ returns = "(status: boolean)",
+ type = "function"
+ },
+ resetMassData = {
+ args = "()",
+ description = "Resets the mass of the body by recalculating it from the mass properties of the fixtures.",
+ returns = "()",
+ type = "function"
+ },
+ setActive = {
+ args = "(active: boolean)",
+ description = "Sets whether the body is active in the world.\n\nAn inactive body does not take part in the simulation. It will not move or cause any collisions.",
+ returns = "()",
+ type = "function"
+ },
+ setAngle = {
+ args = "(angle: number)",
+ description = "Set the angle of the body.\n\nThe angle is measured in radians. If you need to transform it from degrees, use math.rad.\n\nA value of 0 radians will mean \"looking to the right\". .Although radians increase counter-clockwise, the y-axis points down so it becomes clockwise from our point of view.\n\nIt is possible to cause a collision with another body by changing its angle.",
+ returns = "()",
+ type = "function"
+ },
+ setAngularDamping = {
+ args = "(damping: number)",
+ description = "Sets the angular damping of a Body.\n\nSee Body:getAngularDamping for a definition of angular damping.\n\nAngular damping can take any value from 0 to infinity. It is recommended to stay between 0 and 0.1, though. Other values will look unrealistic.",
+ returns = "()",
+ type = "function"
+ },
+ setAngularVelocity = {
+ args = "(w: number)",
+ description = "Sets the angular velocity of a Body.\n\nThe angular velocity is the rate of change of angle over time.\n\nThis function will not accumulate anything; any impulses previously applied since the last call to World:update will be lost.",
+ returns = "()",
+ type = "function"
+ },
+ setAwake = {
+ args = "(awake: boolean)",
+ description = "Wakes the body up or puts it to sleep.",
+ returns = "()",
+ type = "function"
+ },
+ setBullet = {
+ args = "(status: boolean)",
+ description = "Set the bullet status of a body.\n\nThere are two methods to check for body collisions:\n\nat their location when the world is updated (default)\n\nusing continuous collision detection (CCD)\n\nThe default method is efficient, but a body moving very quickly may sometimes jump over another body without producing a collision. A body that is set as a bullet will use CCD. This is less efficient, but is guaranteed not to jump when moving quickly.\n\nNote that static bodies (with zero mass) always use CCD, so your walls will not let a fast moving body pass through even if it is not a bullet.",
+ returns = "()",
+ type = "function"
+ },
+ setFixedRotation = {
+ args = "(fixed: boolean)",
+ description = "Set whether a body has fixed rotation.\n\nBodies with fixed rotation don't vary the speed at which they rotate.",
+ returns = "()",
+ type = "function"
+ },
+ setGravityScale = {
+ args = "(scale: number)",
+ description = "Sets a new gravity scale factor for the body.",
+ returns = "()",
+ type = "function"
+ },
+ setInertia = {
+ args = "(inertia: number)",
+ description = "Set the inertia of a body.\n\nThis value can also be set by the fourth argument of Body:setMass.",
+ returns = "()",
+ type = "function"
+ },
+ setLinearDamping = {
+ args = "(ld: number)",
+ description = "Sets the linear damping of a Body\n\nSee Body:getLinearDamping for a definition of linear damping.\n\nLinear damping can take any value from 0 to infinity. It is recommended to stay between 0 and 0.1, though. Other values will make the objects look \"floaty\".",
+ returns = "()",
+ type = "function"
+ },
+ setLinearVelocity = {
+ args = "(x: number, y: number)",
+ description = "Sets a new linear velocity for the Body.\n\nThis function will not accumulate anything; any impulses previously applied since the last call to World:update will be lost.",
+ returns = "()",
+ type = "function"
+ },
+ setMass = {
+ args = "(mass: number)",
+ description = "Sets the mass in kilograms.",
+ returns = "()",
+ type = "function"
+ },
+ setMassData = {
+ args = "(x: number, y: number, mass: number, inertia: number)",
+ description = "Overrides the calculated mass data.",
+ returns = "()",
+ type = "function"
+ },
+ setPosition = {
+ args = "(x: number, y: number)",
+ description = "Set the position of the body.\n\nNote that this may not be the center of mass of the body.",
+ returns = "()",
+ type = "function"
+ },
+ setSleepingAllowed = {
+ args = "(allowed: boolean)",
+ description = "Sets the sleeping behaviour of the body.",
+ returns = "()",
+ type = "function"
+ },
+ setType = {
+ args = "(type: BodyType)",
+ description = "Sets a new body type.",
+ returns = "()",
+ type = "function"
+ },
+ setUserData = {
+ args = "(value: value)",
+ description = "Associates a Lua value with the Body.\n\nTo delete the reference, explicitly pass nil.\n\nUse this function in one thread only.",
+ returns = "()",
+ type = "function"
+ },
+ setX = {
+ args = "(x: number)",
+ description = "Set the x position of the body.",
+ returns = "()",
+ type = "function"
+ },
+ setY = {
+ args = "(y: number)",
+ description = "Set the y position of the body.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Bodies are objects with velocity and position.",
+ type = "lib"
+ },
+ BodyType = {
+ childs = {
+ dynamic = {
+ description = "Dynamic bodies collide with all bodies.",
+ type = "value"
+ },
+ kinematic = {
+ description = "Kinematic bodies only collide with dynamic bodies.",
+ type = "value"
+ },
+ static = {
+ description = "Static bodies do not move.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ ChainShape = {
+ childs = {
+ getPoint = {
+ args = "(index: number)",
+ description = "Returns a point of the shape.",
+ returns = "(x: number, y: number)",
+ type = "function"
+ },
+ getPoints = {
+ args = "()",
+ description = "Returns all points of the shape.",
+ returns = "(x1: number, y1: number, x2: number, y2: number, ...: number)",
+ type = "function"
+ },
+ getVertexCount = {
+ args = "()",
+ description = "Returns the number of vertices the shape has.",
+ returns = "(count: number)",
+ type = "function"
+ },
+ setNextVertex = {
+ args = "(x: number, y: number)",
+ description = "Sets a vertex that establishes a connection to the next shape.\n\nThis can help prevent unwanted collisions when a flat shape slides along the edge and moves over to the new shape.",
+ returns = "()",
+ type = "function"
+ },
+ setPreviousVertex = {
+ args = "(x: number, y: number)",
+ description = "Sets a vertex that establishes a connection to the previous shape.\n\nThis can help prevent unwanted collisions when a flat shape slides along the edge and moves over to the new shape.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "A ChainShape consists of multiple line segments. It can be used to create the boundaries of your terrain. The shape does not have volume and can only collide with PolygonShape and CircleShape.\n\nUnlike the PolygonShape, the ChainShape does not have a vertices limit or has to form a convex shape, but self intersections are not supported.",
+ type = "lib"
+ },
+ CircleShape = {
+ childs = {
+ getRadius = {
+ args = "()",
+ description = "Gets the radius of the circle shape.",
+ returns = "(radius: number)",
+ type = "function"
+ },
+ setPoint = {
+ args = "(x: number, y: number)",
+ description = "Sets the location of the center of the circle shape.",
+ returns = "()",
+ type = "function"
+ },
+ setRadius = {
+ args = "(radius: number)",
+ description = "Sets the radius of the circle.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Circle extends Shape and adds a radius and a local position.",
+ type = "lib"
+ },
+ Contact = {
+ childs = {
+ getFriction = {
+ args = "()",
+ description = "Get the friction between two shapes that are in contact.",
+ returns = "(friction: number)",
+ type = "function"
+ },
+ getNormal = {
+ args = "()",
+ description = "Get the normal vector between two shapes that are in contact.\n\nThis function returns the coordinates of a unit vector that points from the first shape to the second.",
+ returns = "(nx: number, ny: number)",
+ type = "function"
+ },
+ getPositions = {
+ args = "()",
+ description = "Returns the contact points of the two colliding fixtures. There can be one or two points.",
+ returns = "(x1: number, y1: number, x2: number, y2: number)",
+ type = "function"
+ },
+ getRestitution = {
+ args = "()",
+ description = "Get the restitution between two shapes that are in contact.",
+ returns = "(restitution: number)",
+ type = "function"
+ },
+ isEnabled = {
+ args = "()",
+ description = "Returns whether the contact is enabled. The collision will be ignored if a contact gets disabled in the post solve callback.",
+ returns = "(enabled: boolean)",
+ type = "function"
+ },
+ isTouching = {
+ args = "()",
+ description = "Returns whether the two colliding fixtures are touching each other.",
+ returns = "(touching: boolean)",
+ type = "function"
+ },
+ resetFriction = {
+ args = "()",
+ description = "Resets the contact friction to the mixture value of both fixtures.",
+ returns = "()",
+ type = "function"
+ },
+ resetRestitution = {
+ args = "()",
+ description = "Resets the contact restitution to the mixture value of both fixtures.",
+ returns = "()",
+ type = "function"
+ },
+ setEnabled = {
+ args = "(enabled: boolean)",
+ description = "Enables or disables the contact.",
+ returns = "()",
+ type = "function"
+ },
+ setFriction = {
+ args = "(friction: number)",
+ description = "Sets the contact friction.",
+ returns = "()",
+ type = "function"
+ },
+ setRestitution = {
+ args = "(restitution: number)",
+ description = "Sets the contact restitution.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Contacts are objects created to manage collisions in worlds.",
+ type = "lib"
+ },
+ DistanceJoint = {
+ childs = {
+ getFrequency = {
+ args = "()",
+ description = "Gets the response speed.",
+ returns = "(Hz: number)",
+ type = "function"
+ },
+ getLength = {
+ args = "()",
+ description = "Gets the equilibrium distance between the two Bodies.",
+ returns = "(l: number)",
+ type = "function"
+ },
+ setDampingRatio = {
+ args = "(ratio: number)",
+ description = "Sets the damping ratio.",
+ returns = "()",
+ type = "function"
+ },
+ setFrequency = {
+ args = "(Hz: number)",
+ description = "Sets the response speed.",
+ returns = "()",
+ type = "function"
+ },
+ setLength = {
+ args = "(l: number)",
+ description = "Sets the equilibrium distance between the two Bodies.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Keeps two bodies at the same distance.",
+ type = "lib"
+ },
+ EdgeShape = {
+ childs = {
+ getPoints = {
+ args = "()",
+ description = "Returns the local coordinates of the edge points.",
+ returns = "(x1: number, y1: number, x2: number, y2: number)",
+ type = "function"
+ }
+ },
+ description = "A EdgeShape is a line segment. They can be used to create the boundaries of your terrain. The shape does not have volume and can only collide with PolygonShape and CircleShape.",
+ type = "lib"
+ },
+ Fixture = {
+ childs = {
+ getBody = {
+ args = "()",
+ description = "Returns the body to which the fixture is attached.",
+ returns = "(body: Body)",
+ type = "function"
+ },
+ getBoundingBox = {
+ args = "(index: number)",
+ description = "Returns the points of the fixture bounding box. In case the fixture has multiple children a 1-based index can be specified. For example, a fixture will have multiple children with a chain shape.",
+ returns = "(topLeftX: number, topLeftY: number, bottomRightX: number, bottomRightY: number)",
+ type = "function"
+ },
+ getCategory = {
+ args = "()",
+ description = "Returns the categories the fixture belongs to.",
+ returns = "(category1: number, category2: number, ...: number)",
+ type = "function"
+ },
+ getDensity = {
+ args = "()",
+ description = "Returns the density of the fixture.",
+ returns = "(density: number)",
+ type = "function"
+ },
+ getFilterData = {
+ args = "()",
+ description = "Returns the filter data of the fixture. Categories and masks are encoded as the bits of a 16-bit integer.",
+ returns = "(categories: number, mask: number, group: number)",
+ type = "function"
+ },
+ getFriction = {
+ args = "()",
+ description = "Returns the friction of the fixture.",
+ returns = "(friction: number)",
+ type = "function"
+ },
+ getGroupIndex = {
+ args = "()",
+ description = "Returns the group the fixture belongs to. Fixtures with the same group will always collide if the group is positive or never collide if it's negative. The group zero means no group.\n\nThe groups range from -32768 to 32767.",
+ returns = "(group: number)",
+ type = "function"
+ },
+ getMask = {
+ args = "()",
+ description = "Returns the category mask of the fixture.",
+ returns = "(mask1: number, mask2: number, ...: number)",
+ type = "function"
+ },
+ getMassData = {
+ args = "()",
+ description = "Returns the mass, its center and the rotational inertia.",
+ returns = "(x: number, y: number, mass: number, inertia: number)",
+ type = "function"
+ },
+ getRestitution = {
+ args = "()",
+ description = "Returns the restitution of the fixture.",
+ returns = "(restitution: number)",
+ type = "function"
+ },
+ getShape = {
+ args = "()",
+ description = "Returns the shape of the fixture. This shape is a reference to the actual data used in the simulation. It's possible to change its values between timesteps.\n\nDo not call any functions on this shape after the parent fixture has been destroyed. This shape will point to an invalid memory address and likely cause crashes if you interact further with it.",
+ returns = "(shape: Shape)",
+ type = "function"
+ },
+ getUserData = {
+ args = "()",
+ description = "Returns the Lua value associated with this fixture.\n\nUse this function in one thread only.",
+ returns = "(value: mixed)",
+ type = "function"
+ },
+ isDestroyed = {
+ args = "()",
+ description = "Gets whether the Fixture is destroyed. Destroyed fixtures cannot be used.",
+ returns = "(destroyed: boolean)",
+ type = "function"
+ },
+ isSensor = {
+ args = "()",
+ description = "Returns whether the fixture is a sensor.",
+ returns = "(sensor: boolean)",
+ type = "function"
+ },
+ rayCast = {
+ args = "(x1: number, y1: number, x2: number, y1: number, maxFraction: number, childIndex: number)",
+ description = "Casts a ray against the shape of the fixture and returns the surface normal vector and the line position where the ray hit. If the ray missed the shape, nil will be returned.\n\nThe ray starts on the first point of the input line and goes towards the second point of the line. The fourth argument is the maximum distance the ray is going to travel as a scale factor of the input line length.\n\nThe childIndex parameter is used to specify which child of a parent shape, such as a ChainShape, will be ray casted. For ChainShapes, the index of 1 is the first edge on the chain. Ray casting a parent shape will only test the child specified so if you want to test every shape of the parent, you must loop through all of its children.\n\nThe world position of the impact can be calculated by multiplying the line vector with the third return value and adding it to the line starting point.\n\nhitx, hity = x1 + (x2 - x1) * fraction, y1 + (y2 - y1) * fraction",
+ returns = "(x: number, y: number, fraction: number)",
+ type = "function"
+ },
+ setCategory = {
+ args = "(category1: number, category2: number, ...: number)",
+ description = "Sets the categories the fixture belongs to. There can be up to 16 categories represented as a number from 1 to 16.",
+ returns = "()",
+ type = "function"
+ },
+ setDensity = {
+ args = "(density: number)",
+ description = "Sets the density of the fixture. Call Body:resetMassData if this needs to take effect immediately.",
+ returns = "()",
+ type = "function"
+ },
+ setFilterData = {
+ args = "(categories: number, mask: number, group: number)",
+ description = "Sets the filter data of the fixture.\n\nGroups, categories, and mask can be used to define the collision behaviour of the fixture.\n\nIf two fixtures are in the same group they either always collide if the group is positive, or never collide if it's negative. Is the group zero or they do not match, then the contact filter checks if the fixtures select a category of the other fixture with their masks. The fixtures do not collide if that's not the case. If they do have each others categories selected, the return value of the custom contact filter will be used. They always collide if none was set.\n\nThere can be up to 16 categories. Categories and masks are encoded as the bits of a 16-bit integer.",
+ returns = "()",
+ type = "function"
+ },
+ setFriction = {
+ args = "(friction: number)",
+ description = "Sets the friction of the fixture.",
+ returns = "()",
+ type = "function"
+ },
+ setGroupIndex = {
+ args = "(group: number)",
+ description = "Sets the group the fixture belongs to. Fixtures with the same group will always collide if the group is positive or never collide if it's negative. The group zero means no group.\n\nThe groups range from -32768 to 32767.",
+ returns = "()",
+ type = "function"
+ },
+ setMask = {
+ args = "(mask1: number, mask2: number, ...: number)",
+ description = "Sets the category mask of the fixture. There can be up to 16 categories represented as a number from 1 to 16.\n\nThis fixture will collide with the fixtures that are in the selected categories if the other fixture also has a category of this fixture selected.",
+ returns = "()",
+ type = "function"
+ },
+ setRestitution = {
+ args = "(restitution: number)",
+ description = "Sets the restitution of the fixture.",
+ returns = "()",
+ type = "function"
+ },
+ setSensor = {
+ args = "(sensor: boolean)",
+ description = "Sets whether the fixture should act as a sensor.\n\nSensor do not produce collisions responses, but the begin and end callbacks will still be called for this fixture.",
+ returns = "()",
+ type = "function"
+ },
+ setUserData = {
+ args = "(value: mixed)",
+ description = "Associates a Lua value with the fixture.\n\nUse this function in one thread only.",
+ returns = "()",
+ type = "function"
+ },
+ testPoint = {
+ args = "(x: number, y: number)",
+ description = "Checks if a point is inside the shape of the fixture.",
+ returns = "(isInside: boolean)",
+ type = "function"
+ }
+ },
+ description = "Fixtures attach shapes to bodies.",
+ type = "lib"
+ },
+ FrictionJoint = {
+ childs = {
+ getMaxTorque = {
+ args = "()",
+ description = "Gets the maximum friction torque in Newton-meters.",
+ returns = "(torque: number)",
+ type = "function"
+ },
+ setMaxForce = {
+ args = "(maxForce: number)",
+ description = "Sets the maximum friction force in Newtons.",
+ returns = "()",
+ type = "function"
+ },
+ setMaxTorque = {
+ args = "(torque: number)",
+ description = "Sets the maximum friction torque in Newton-meters.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "A FrictionJoint applies friction to a body.",
+ type = "lib"
+ },
+ GearJoint = {
+ childs = {
+ getRatio = {
+ args = "()",
+ description = "Get the ratio of a gear joint.",
+ returns = "(ratio: number)",
+ type = "function"
+ },
+ setRatio = {
+ args = "(ratio: number)",
+ description = "Set the ratio of a gear joint.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Keeps bodies together in such a way that they act like gears.",
+ type = "lib"
+ },
+ Joint = {
+ childs = {
+ getAnchors = {
+ args = "()",
+ description = "Get the anchor points of the joint.",
+ returns = "(x1: number, y1: number, x2: number, y2: number)",
+ type = "function"
+ },
+ getBodies = {
+ args = "()",
+ description = "Gets the bodies that the Joint is attached to.",
+ returns = "(bodyA: Body, bodyB: Body)",
+ type = "function"
+ },
+ getCollideConnected = {
+ args = "()",
+ description = "Gets whether the connected Bodies collide.",
+ returns = "(c: boolean)",
+ type = "function"
+ },
+ getReactionForce = {
+ args = "()",
+ description = "Gets the reaction force on Body 2 at the joint anchor.",
+ returns = "(x: number, y: number)",
+ type = "function"
+ },
+ getReactionTorque = {
+ args = "(invdt: number)",
+ description = "Returns the reaction torque on the second body.",
+ returns = "(torque: number)",
+ type = "function"
+ },
+ getType = {
+ args = "()",
+ description = "Gets an string representing the type.",
+ returns = "(type: JointType)",
+ type = "function"
+ },
+ getUserData = {
+ args = "()",
+ description = "Returns the Lua value associated with this Joint.",
+ returns = "(value: mixed)",
+ type = "function"
+ },
+ isDestroyed = {
+ args = "()",
+ description = "Gets whether the Joint is destroyed. Destroyed joints cannot be used.",
+ returns = "(destroyed: boolean)",
+ type = "function"
+ },
+ setCollideConnected = {
+ args = "(collide: boolean)",
+ description = "Sets whether the connected Bodies should collide with eachother.",
+ returns = "()",
+ type = "function"
+ },
+ setUserData = {
+ args = "(value: mixed)",
+ description = "Associates a Lua value with the Joint.\n\nTo delete the reference, explicitly pass nil.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Attach multiple bodies together to interact in unique ways.",
+ type = "lib"
+ },
+ JointType = {
+ childs = {
+ distance = {
+ description = "A DistanceJoint.",
+ type = "value"
+ },
+ friction = {
+ description = "A FrictionJoint.",
+ type = "value"
+ },
+ gear = {
+ description = "A GearJoint.",
+ type = "value"
+ },
+ mouse = {
+ description = "A MouseJoint.",
+ type = "value"
+ },
+ prismatic = {
+ description = "A PrismaticJoint.",
+ type = "value"
+ },
+ pulley = {
+ description = "A PulleyJoint.",
+ type = "value"
+ },
+ revolute = {
+ description = "A RevoluteJoint.",
+ type = "value"
+ },
+ rope = {
+ description = "A RopeJoint.",
+ type = "value"
+ },
+ weld = {
+ description = "A WeldJoint.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ MouseJoint = {
+ childs = {
+ getFrequency = {
+ args = "()",
+ description = "Returns the frequency.",
+ returns = "(freq: number)",
+ type = "function"
+ },
+ getMaxForce = {
+ args = "()",
+ description = "Gets the highest allowed force.",
+ returns = "(f: number)",
+ type = "function"
+ },
+ getTarget = {
+ args = "()",
+ description = "Gets the target point.",
+ returns = "(x: number, y: number)",
+ type = "function"
+ },
+ setDampingRatio = {
+ args = "(ratio: number)",
+ description = "Sets a new damping ratio.",
+ returns = "()",
+ type = "function"
+ },
+ setFrequency = {
+ args = "(freq: number)",
+ description = "Sets a new frequency.",
+ returns = "()",
+ type = "function"
+ },
+ setMaxForce = {
+ args = "(f: number)",
+ description = "Sets the highest allowed force.",
+ returns = "()",
+ type = "function"
+ },
+ setTarget = {
+ args = "(x: number, y: number)",
+ description = "Sets the target point.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "For controlling objects with the mouse.",
+ type = "lib"
+ },
+ PolygonShape = {
+ childs = {
+ getPoints = {
+ args = "()",
+ description = "Get the local coordinates of the polygon's vertices.\n\nThis function has a variable number of return values. It can be used in a nested fashion with love.graphics.polygon.\n\nThis function may have up to 16 return values, since it returns two values for each vertex in the polygon. In other words, it can return the coordinates of up to 8 points.",
+ returns = "(x1: number, y1: number, x2: number, y2: number, ...: number)",
+ type = "function"
+ }
+ },
+ description = "Polygon is a convex polygon with up to 8 sides.",
+ type = "lib"
+ },
+ PrismaticJoint = {
+ childs = {
+ getJointSpeed = {
+ args = "()",
+ description = "Get the current joint angle speed.",
+ returns = "(s: number)",
+ type = "function"
+ },
+ getJointTranslation = {
+ args = "()",
+ description = "Get the current joint translation.",
+ returns = "(t: number)",
+ type = "function"
+ },
+ getLimits = {
+ args = "()",
+ description = "Gets the joint limits.",
+ returns = "(lower: number, upper: number)",
+ type = "function"
+ },
+ getLowerLimit = {
+ args = "()",
+ description = "Gets the lower limit.",
+ returns = "(lower: number)",
+ type = "function"
+ },
+ getMaxMotorForce = {
+ args = "()",
+ description = "Gets the maximum motor force.",
+ returns = "(f: number)",
+ type = "function"
+ },
+ getMotorForce = {
+ args = "()",
+ description = "Get the current motor force.",
+ returns = "(f: number)",
+ type = "function"
+ },
+ getMotorSpeed = {
+ args = "()",
+ description = "Gets the motor speed.",
+ returns = "(s: number)",
+ type = "function"
+ },
+ getUpperLimit = {
+ args = "()",
+ description = "Gets the upper limit.",
+ returns = "(upper: number)",
+ type = "function"
+ },
+ hasLimitsEnabled = {
+ args = "()",
+ description = "Checks whether the limits are enabled.",
+ returns = "(enabled: boolean)",
+ type = "function"
+ },
+ isMotorEnabled = {
+ args = "()",
+ description = "Checks whether the motor is enabled.",
+ returns = "(enabled: boolean)",
+ type = "function"
+ },
+ setLimits = {
+ args = "(lower: number, upper: number)",
+ description = "Sets the limits.",
+ returns = "()",
+ type = "function"
+ },
+ setLowerLimit = {
+ args = "(lower: number)",
+ description = "Sets the lower limit.",
+ returns = "()",
+ type = "function"
+ },
+ setMaxMotorForce = {
+ args = "(f: number)",
+ description = "Set the maximum motor force.",
+ returns = "()",
+ type = "function"
+ },
+ setMotorEnabled = {
+ args = "(enable: boolean)",
+ description = "Starts or stops the joint motor.",
+ returns = "()",
+ type = "function"
+ },
+ setMotorSpeed = {
+ args = "(s: number)",
+ description = "Sets the motor speed.",
+ returns = "()",
+ type = "function"
+ },
+ setUpperLimit = {
+ args = "(upper: number)",
+ description = "Sets the upper limit.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Restricts relative motion between Bodies to one shared axis.",
+ type = "lib"
+ },
+ PulleyJoint = {
+ childs = {
+ getGroundAnchors = {
+ args = "()",
+ description = "Get the ground anchor positions in world coordinates.",
+ returns = "(a1x: number, a1y: number, a2x: number, a2y: number)",
+ type = "function"
+ },
+ getLengthA = {
+ args = "()",
+ description = "Get the current length of the rope segment attached to the first body.",
+ returns = "(length: number)",
+ type = "function"
+ },
+ getLengthB = {
+ args = "()",
+ description = "Get the current length of the rope segment attached to the second body.",
+ returns = "(length: number)",
+ type = "function"
+ },
+ getMaxLengths = {
+ args = "()",
+ description = "Get the maximum lengths of the rope segments.",
+ returns = "(len1: number, len2: number)",
+ type = "function"
+ },
+ getRatio = {
+ args = "()",
+ description = "Get the pulley ratio.",
+ returns = "(ratio: number)",
+ type = "function"
+ },
+ setConstant = {
+ args = "(length: number)",
+ description = "Set the total length of the rope.\n\nSetting a new length for the rope updates the maximum length values of the joint.",
+ returns = "()",
+ type = "function"
+ },
+ setMaxLengths = {
+ args = "(max1: number, max2: number)",
+ description = "Set the maximum lengths of the rope segments.\n\nThe physics module also imposes maximum values for the rope segments. If the parameters exceed these values, the maximum values are set instead of the requested values.",
+ returns = "()",
+ type = "function"
+ },
+ setRatio = {
+ args = "(ratio: number)",
+ description = "Set the pulley ratio.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Allows you to simulate bodies connected through pulleys.",
+ type = "lib"
+ },
+ RevoluteJoint = {
+ childs = {
+ getJointAngle = {
+ args = "()",
+ description = "Get the current joint angle.",
+ returns = "(angle: number)",
+ type = "function"
+ },
+ getJointSpeed = {
+ args = "()",
+ description = "Get the current joint angle speed.",
+ returns = "(s: number)",
+ type = "function"
+ },
+ getLimits = {
+ args = "()",
+ description = "Gets the joint limits.",
+ returns = "(lower: number, upper: number)",
+ type = "function"
+ },
+ getLowerLimit = {
+ args = "()",
+ description = "Gets the lower limit.",
+ returns = "(lower: number)",
+ type = "function"
+ },
+ getMaxMotorTorque = {
+ args = "()",
+ description = "Gets the maximum motor force.",
+ returns = "(f: number)",
+ type = "function"
+ },
+ getMotorSpeed = {
+ args = "()",
+ description = "Gets the motor speed.",
+ returns = "(s: number)",
+ type = "function"
+ },
+ getMotorTorque = {
+ args = "()",
+ description = "Get the current motor force.",
+ returns = "(f: number)",
+ type = "function"
+ },
+ getUpperLimit = {
+ args = "()",
+ description = "Gets the upper limit.",
+ returns = "(upper: number)",
+ type = "function"
+ },
+ hasLimitsEnabled = {
+ args = "()",
+ description = "Checks whether limits are enabled.",
+ returns = "(enabled: boolean)",
+ type = "function"
+ },
+ isMotorEnabled = {
+ args = "()",
+ description = "Checks whether the motor is enabled.",
+ returns = "(enabled: boolean)",
+ type = "function"
+ },
+ setLimits = {
+ args = "(lower: number, upper: number)",
+ description = "Sets the limits.",
+ returns = "()",
+ type = "function"
+ },
+ setLowerLimit = {
+ args = "(lower: number)",
+ description = "Sets the lower limit.",
+ returns = "()",
+ type = "function"
+ },
+ setMaxMotorTorque = {
+ args = "(f: number)",
+ description = "Set the maximum motor force.",
+ returns = "()",
+ type = "function"
+ },
+ setMotorEnabled = {
+ args = "(enable: boolean)",
+ description = "Starts or stops the joint motor.",
+ returns = "()",
+ type = "function"
+ },
+ setMotorSpeed = {
+ args = "(s: number)",
+ description = "Sets the motor speed.",
+ returns = "()",
+ type = "function"
+ },
+ setUpperLimit = {
+ args = "(upper: number)",
+ description = "Sets the upper limit.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Allow two Bodies to revolve around a shared point.",
+ type = "lib"
+ },
+ RopeJoint = {
+ childs = {
+ getMaxLength = {
+ args = "()",
+ description = "Gets the maximum length of a RopeJoint.",
+ returns = "(maxLength: number)",
+ type = "function"
+ }
+ },
+ description = "The RopeJoint enforces a maximum distance between two points on two bodies. It has no other effect.",
+ type = "lib"
+ },
+ Shape = {
+ childs = {
+ computeMass = {
+ args = "(density: number)",
+ description = "Computes the mass properties for the shape with the specified density.",
+ returns = "(x: number, y: number, mass: number, inertia: number)",
+ type = "function"
+ },
+ getChildCount = {
+ args = "()",
+ description = "Returns the number of children the shape has.",
+ returns = "(count: number)",
+ type = "function"
+ },
+ getRadius = {
+ args = "()",
+ description = "Gets the radius of the shape.",
+ returns = "(radius: number)",
+ type = "function"
+ },
+ getType = {
+ args = "()",
+ description = "Gets a string representing the Shape. This function can be useful for conditional debug drawing.",
+ returns = "(type: ShapeType)",
+ type = "function"
+ },
+ rayCast = {
+ args = "(x1: number, y1: number, x2: number, y2: number, maxFraction: number, tx: number, ty: number, tr: number, childIndex: number)",
+ description = "Casts a ray against the shape and returns the surface normal vector and the line position where the ray hit. If the ray missed the shape, nil will be returned. The Shape can be transformed to get it into the desired position.\n\nThe ray starts on the first point of the input line and goes towards the second point of the line. The fourth argument is the maximum distance the ray is going to travel as a scale factor of the input line length.\n\nThe childIndex parameter is used to specify which child of a parent shape, such as a ChainShape, will be ray casted. For ChainShapes, the index of 1 is the first edge on the chain. Ray casting a parent shape will only test the child specified so if you want to test every shape of the parent, you must loop through all of its children.\n\nThe world position of the impact can be calculated by multiplying the line vector with the third return value and adding it to the line starting point.\n\nhitx, hity = x1 + (x2 - x1) * fraction, y1 + (y2 - y1) * fraction",
+ returns = "(xn: number, yn: number, fraction: number)",
+ type = "function"
+ },
+ testPoint = {
+ args = "(x: number, y: number)",
+ description = "Checks whether a point lies inside the shape. This is particularly useful for mouse interaction with the shapes. By looping through all shapes and testing the mouse position with this function, we can find which shapes the mouse touches.",
+ returns = "(hit: boolean)",
+ type = "function"
+ }
+ },
+ description = "Shapes are solid 2d geometrical objects used in love.physics.\n\nShapes are attached to a Body via a Fixture. The Shape object is copied when this happens. Shape position is relative to Body position.",
+ type = "lib"
+ },
+ ShapeType = {
+ childs = {
+ chain = {
+ description = "The Shape is a ChainShape.",
+ type = "value"
+ },
+ circle = {
+ description = "The Shape is a CircleShape.",
+ type = "value"
+ },
+ edge = {
+ description = "The Shape is a EdgeShape.",
+ type = "value"
+ },
+ polygon = {
+ description = "The Shape is a PolygonShape.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ WeldJoint = {
+ childs = {
+ getFrequency = {
+ args = "()",
+ description = "Returns the frequency.",
+ returns = "(freq: number)",
+ type = "function"
+ },
+ setDampingRatio = {
+ args = "(ratio: number)",
+ description = "The new damping ratio.",
+ returns = "()",
+ type = "function"
+ },
+ setFrequency = {
+ args = "(freq: number)",
+ description = "Sets a new frequency.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "A WeldJoint essentially glues two bodies together.",
+ type = "lib"
+ },
+ WheelJoint = {
+ childs = {
+ getJointTranslation = {
+ args = "()",
+ description = "Returns the current joint translation.",
+ returns = "(position: number)",
+ type = "function"
+ },
+ getLimits = {
+ args = "()",
+ description = "Gets the joint limits.",
+ returns = "(lower: number, upper: number)",
+ type = "function"
+ },
+ getMaxMotorTorque = {
+ args = "()",
+ description = "Returns the maximum motor torque.",
+ returns = "(maxTorque: number)",
+ type = "function"
+ },
+ getMotorSpeed = {
+ args = "()",
+ description = "Returns the speed of the motor.",
+ returns = "(speed: number)",
+ type = "function"
+ },
+ getMotorTorque = {
+ args = "(invdt: number)",
+ description = "Returns the current torque on the motor.",
+ returns = "(torque: number)",
+ type = "function"
+ },
+ getSpringDampingRatio = {
+ args = "()",
+ description = "Returns the damping ratio.",
+ returns = "(ratio: number)",
+ type = "function"
+ },
+ getSpringFrequency = {
+ args = "()",
+ description = "Returns the spring frequency.",
+ returns = "(freq: number)",
+ type = "function"
+ },
+ setMaxMotorTorque = {
+ args = "(maxTorque: number)",
+ description = "Sets a new maximum motor torque.",
+ returns = "()",
+ type = "function"
+ },
+ setMotorEnabled = {
+ args = "(enable: boolean)",
+ description = "Starts and stops the joint motor.",
+ returns = "()",
+ type = "function"
+ },
+ setMotorSpeed = {
+ args = "(speed: number)",
+ description = "Sets a new speed for the motor.",
+ returns = "()",
+ type = "function"
+ },
+ setSpringDampingRatio = {
+ args = "(ratio: number)",
+ description = "Sets a new damping ratio.",
+ returns = "()",
+ type = "function"
+ },
+ setSpringFrequency = {
+ args = "(freq: number)",
+ description = "Sets a new spring frequency.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Restricts a point on the second body to a line on the first body.",
+ type = "lib"
+ },
+ World = {
+ childs = {
+ getBodyCount = {
+ args = "()",
+ description = "Get the number of bodies in the world.",
+ returns = "(n: number)",
+ type = "function"
+ },
+ getBodyList = {
+ args = "()",
+ description = "Returns a table with all bodies.",
+ returns = "(bodies: table)",
+ type = "function"
+ },
+ getCallbacks = {
+ args = "()",
+ description = "Returns functions for the callbacks during the world update.",
+ returns = "(beginContact: function, endContact: function, preSolve: function, postSolve: function)",
+ type = "function"
+ },
+ getContactCount = {
+ args = "()",
+ description = "Returns the number of contacts in the world.",
+ returns = "(n: number)",
+ type = "function"
+ },
+ getContactFilter = {
+ args = "()",
+ description = "Returns the function for collision filtering.",
+ returns = "(contactFilter: function)",
+ type = "function"
+ },
+ getContactList = {
+ args = "()",
+ description = "Returns a table with all contacts.",
+ returns = "(contacts: table)",
+ type = "function"
+ },
+ getGravity = {
+ args = "()",
+ description = "Get the gravity of the world.",
+ returns = "(x: number, y: number)",
+ type = "function"
+ },
+ getJointCount = {
+ args = "()",
+ description = "Get the number of joints in the world.",
+ returns = "(n: number)",
+ type = "function"
+ },
+ getJointList = {
+ args = "()",
+ description = "Returns a table with all joints.",
+ returns = "(joints: table)",
+ type = "function"
+ },
+ isDestroyed = {
+ args = "()",
+ description = "Gets whether the World is destroyed. Destroyed worlds cannot be used.",
+ returns = "(destroyed: boolean)",
+ type = "function"
+ },
+ isLocked = {
+ args = "()",
+ description = "Returns if the world is updating its state.\n\nThis will return true inside the callbacks from World:setCallbacks.",
+ returns = "(locked: boolean)",
+ type = "function"
+ },
+ isSleepingAllowed = {
+ args = "()",
+ description = "Returns the sleep behaviour of the world.",
+ returns = "(allowSleep: boolean)",
+ type = "function"
+ },
+ queryBoundingBox = {
+ args = "(topLeftX: number, topLeftY: number, bottomRightX: number, bottomRightY: number, callback: function)",
+ description = "Calls a function for each fixture inside the specified area.",
+ returns = "()",
+ type = "function"
+ },
+ rayCast = {
+ args = "(x1: number, y1: number, x2: number, y2: number, callback: function)",
+ description = "Casts a ray and calls a function with the fixtures that intersect it. You cannot make any assumptions about the order of the callbacks.\n\nEach time the function gets called, 6 arguments get passed to it. The first is the fixture intersecting the ray. The second and third are the coordinates of the intersection point. The fourth and fifth is the surface normal vector of the shape edge. The sixth argument is the position of the intersection on the ray as a number from 0 to 1 (or even higher if the ray length was changed with the return value).\n\nThe ray can be controlled with the return value. A positive value sets a new ray length where 1 is the default value. A value of 0 terminates the ray. If the callback function returns -1, the intersection gets ignored as if it didn't happen.\n\nThere is a bug in 0.8.0 where the normal vector passed to the callback function gets scaled by love.physics.getMeter.",
+ returns = "()",
+ type = "function"
+ },
+ setCallbacks = {
+ args = "(beginContact: function, endContact: function, preSolve: function, postSolve: function)",
+ description = "Sets functions for the collision callbacks during the world update.\n\nFour Lua functions can be given as arguments. The value nil removes a function.\n\nWhen called, each function will be passed three arguments. The first two arguments are the colliding fixtures and the third argument is the Contact between them. The PostSolve callback additionally gets the normal and tangent impulse for each contact point.",
+ returns = "()",
+ type = "function"
+ },
+ setContactFilter = {
+ args = "(filter: function)",
+ description = "Sets a function for collision filtering.\n\nIf the group and category filtering doesn't generate a collision decision, this function gets called with the two fixtures as arguments. The function should return a boolean value where true means the fixtures will collide and false means they will pass through each other.",
+ returns = "()",
+ type = "function"
+ },
+ setGravity = {
+ args = "(x: number, y: number)",
+ description = "Set the gravity of the world.",
+ returns = "()",
+ type = "function"
+ },
+ setSleepingAllowed = {
+ args = "(allowSleep: boolean)",
+ description = "Set the sleep behaviour of the world.\n\nA sleeping body is much more efficient to simulate than when awake.\n\nIf sleeping is allowed, any body that has come to rest will sleep.",
+ returns = "()",
+ type = "function"
+ },
+ translateOrigin = {
+ args = "(x: number, y: number)",
+ description = "Translates the World's origin. Useful in large worlds where floating point precision issues become noticeable at far distances from the origin.",
+ returns = "()",
+ type = "function"
+ },
+ update = {
+ args = "(dt: number)",
+ description = "Update the state of the world.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "A world is an object that contains all bodies and joints.",
+ type = "lib"
+ },
+ getMeter = {
+ args = "()",
+ description = "Get the scale of the world.\n\nThe world scale is the number of pixels per meter. Try to keep your shape sizes less than 10 times this scale.\n\nThis is important because the physics in Box2D is tuned to work well for objects of size 0.1m up to 10m. All physics coordinates are divided by this number for the physics calculations.",
+ returns = "(scale: number)",
+ type = "function"
+ },
+ newBody = {
+ args = "(world: World, x: number, y: number, type: BodyType)",
+ description = "Creates a new body.\n\nThere are three types of bodies. Static bodies do not move, have a infinite mass, and can be used for level boundaries. Dynamic bodies are the main actors in the simulation, they collide with everything. Kinematic bodies do not react to forces and only collide with dynamic bodies.\n\nThe mass of the body gets calculated when a Fixture is attached or removed, but can be changed at any time with Body:setMass or Body:resetMassData.",
+ returns = "(body: Body)",
+ type = "function"
+ },
+ newChainShape = {
+ args = "(loop: boolean, x1: number, y1: number, x2: number, y2: number, ...: number)",
+ description = "Creates a new ChainShape.",
+ returns = "(shape: ChainShape)",
+ type = "function"
+ },
+ newCircleShape = {
+ args = "(radius: number)",
+ description = "Creates a new CircleShape.",
+ returns = "(shape: CircleShape)",
+ type = "function"
+ },
+ newDistanceJoint = {
+ args = "(body1: Body, body2: Body, x1: number, y1: number, x2: number, y2: number, collideConnected: boolean)",
+ description = "Create a distance joint between two bodies.\n\nThis joint constrains the distance between two points on two bodies to be constant. These two points are specified in world coordinates and the two bodies are assumed to be in place when this joint is created. The first anchor point is connected to the first body and the second to the second body, and the points define the length of the distance joint.",
+ returns = "(joint: DistanceJoint)",
+ type = "function"
+ },
+ newEdgeShape = {
+ args = "(x1: number, y1: number, x2: number, y2: number)",
+ description = "Creates a edge shape.",
+ returns = "(shape: EdgeShape)",
+ type = "function"
+ },
+ newFixture = {
+ args = "(body: Body, shape: Shape, density: number)",
+ description = "Creates and attaches a Fixture to a body.",
+ returns = "(fixture: Fixture)",
+ type = "function"
+ },
+ newFrictionJoint = {
+ args = "(body1: Body, body2: Body, x: number, y: number, collideConnected: boolean)",
+ description = "Create a friction joint between two bodies. A FrictionJoint applies friction to a body.",
+ returns = "(joint: FrictionJoint)",
+ type = "function"
+ },
+ newGearJoint = {
+ args = "(joint1: Joint, joint2: Joint, ratio: number, collideConnected: boolean)",
+ description = "Create a gear joint connecting two joints.\n\nThe gear joint connects two joints that must be either prismatic or revolute joints. Using this joint requires that the joints it uses connect their respective bodies to the ground and have the ground as the first body. When destroying the bodies and joints you must make sure you destroy the gear joint before the other joints.\n\nThe gear joint has a ratio the determines how the angular or distance values of the connected joints relate to each other. The formula coordinate1 + ratio * coordinate2 always has a constant value that is set when the gear joint is created.",
+ returns = "(joint: Joint)",
+ type = "function"
+ },
+ newMouseJoint = {
+ args = "(body: Body, x: number, y: number)",
+ description = "Create a joint between a body and the mouse.\n\nThis joint actually connects the body to a fixed point in the world. To make it follow the mouse, the fixed point must be updated every timestep (example below).\n\nThe advantage of using a MouseJoint instead of just changing a body position directly is that collisions and reactions to other joints are handled by the physics engine.",
+ returns = "(joint: Joint)",
+ type = "function"
+ },
+ newPolygonShape = {
+ args = "(x1: number, y1: number, x2: number, y2: number, ...: number)",
+ description = "Creates a new PolygonShape.\n\nThis shape can have 8 vertices at most, and must form a convex shape.",
+ returns = "(shape: PolygonShape)",
+ type = "function"
+ },
+ newPrismaticJoint = {
+ args = "(body1: Body, body2: Body, x: number, y: number, ax: number, ay: number, collideConnected: boolean)",
+ description = "Create a prismatic joints between two bodies.\n\nA prismatic joint constrains two bodies to move relatively to each other on a specified axis. It does not allow for relative rotation. Its definition and operation are similar to a revolute joint, but with translation and force substituted for angle and torque.",
+ returns = "(joint: PrismaticJoint)",
+ type = "function"
+ },
+ newPulleyJoint = {
+ args = "(body1: Body, body2: Body, gx1: number, gy1: number, gx2: number, gy2: number, x1: number, y1: number, x2: number, y2: number, ratio: number, collideConnected: boolean)",
+ description = "Create a pulley joint to join two bodies to each other and the ground.\n\nThe pulley joint simulates a pulley with an optional block and tackle. If the ratio parameter has a value different from one, then the simulated rope extends faster on one side than the other. In a pulley joint the total length of the simulated rope is the constant length1 + ratio * length2, which is set when the pulley joint is created.\n\nPulley joints can behave unpredictably if one side is fully extended. It is recommended that the method setMaxLengths be used to constrain the maximum lengths each side can attain.",
+ returns = "(joint: Joint)",
+ type = "function"
+ },
+ newRectangleShape = {
+ args = "(width: number, height: number)",
+ description = "Shorthand for creating rectangluar PolygonShapes.\n\nBy default, the local origin is located at the center of the rectangle as opposed to the top left for graphics.",
+ returns = "(shape: PolygonShape)",
+ type = "function"
+ },
+ newRevoluteJoint = {
+ args = "(body1: Body, body2: Body, x: number, y: number, collideConnected: number)",
+ description = "Creates a pivot joint between two bodies.\n\nThis joint connects two bodies to a point around which they can pivot.",
+ returns = "(joint: Joint)",
+ type = "function"
+ },
+ newRopeJoint = {
+ args = "(body1: Body, body2: Body, x1: number, y1: number, x2: number, y2: number, maxLength: number, collideConnected: boolean)",
+ description = "Create a joint between two bodies. Its only function is enforcing a max distance between these bodies.",
+ returns = "(joint: RopeJoint)",
+ type = "function"
+ },
+ newWeldJoint = {
+ args = "(body1: Body, body2: Body, x: number, y: number, collideConnected: boolean)",
+ description = "Create a friction joint between two bodies. A WeldJoint essentially glues two bodies together.",
+ returns = "(joint: WeldJoint)",
+ type = "function"
+ },
+ newWheelJoint = {
+ args = "(body1: Body, body2: Body, x: number, y: number, ax: number, ay: number, collideConnected: boolean)",
+ description = "Creates a wheel joint.",
+ returns = "(joint: WheelJoint)",
+ type = "function"
+ },
+ newWorld = {
+ args = "(xg: number, yg: number, sleep: boolean)",
+ description = "Creates a new World.",
+ returns = "(world: World)",
+ type = "function"
+ },
+ setMeter = {
+ args = "(scale: number)",
+ description = "Sets the pixels to meter scale factor.\n\nAll coordinates in the physics module are divided by this number and converted to meters, and it creates a convenient way to draw the objects directly to the screen without the need for graphics transformations.\n\nIt is recommended to create shapes no larger than 10 times the scale. This is important because Box2D is tuned to work well with shape sizes from 0.1 to 10 meters. The default meter scale is 30.\n\nlove.physics.setMeter does not apply retroactively to created objects. Created objects retain their meter coordinates but the scale factor will affect their pixel coordinates.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Can simulate 2D rigid body physics in a realistic manner. This module is based on Box2D, and this API corresponds to the Box2D API as closely as possible.",
+ type = "class"
+ },
+ quit = {
+ args = "()",
+ description = "Callback function triggered when the game is closed.",
+ returns = "(r: boolean)",
+ type = "function"
+ },
+ resize = {
+ args = "(w: number, h: number)",
+ description = "Called when the window is resized, for example if the user resizes the window, or if love.window.setMode is called with an unsupported width or height in fullscreen and the window chooses the closest appropriate size.\n\nCalls to love.window.setMode will only trigger this event if the width or height of the window after the call doesn't match the requested width and height. This can happen if a fullscreen mode is requested which doesn't match any supported mode, or if the fullscreen type is 'desktop' and the requested width or height don't match the desktop resolution.",
+ returns = "()",
+ type = "function"
+ },
+ run = {
+ args = "()",
+ description = "The main function, containing the main loop. A sensible default is used when left out.",
+ returns = "()",
+ type = "function"
+ },
+ sound = {
+ childs = {
+ Decoder = {
+ childs = {
+ getChannels = {
+ args = "()",
+ description = "Returns the number of channels in the stream.",
+ returns = "(channels: number)",
+ type = "function"
+ },
+ getDuration = {
+ args = "()",
+ description = "Gets the duration of the sound file. It may not always be sample-accurate, and it may return -1 if the duration cannot be determined at all.",
+ returns = "(duration: number)",
+ type = "function"
+ },
+ getSampleRate = {
+ args = "()",
+ description = "Returns the sample rate of the Decoder.",
+ returns = "(rate: number)",
+ type = "function"
+ }
+ },
+ description = "An object which can gradually decode a sound file.",
+ type = "lib"
+ },
+ SoundData = {
+ childs = {
+ getChannels = {
+ args = "()",
+ description = "Returns the number of channels in the stream.",
+ returns = "(channels: number)",
+ type = "function"
+ },
+ getDuration = {
+ args = "()",
+ description = "Returns the number of channels in the stream.",
+ returns = "(duration: number)",
+ type = "function"
+ },
+ getSample = {
+ args = "(i: number)",
+ description = "Gets the sample at the specified position.",
+ returns = "(sample: number)",
+ type = "function"
+ },
+ getSampleCount = {
+ args = "()",
+ description = "Returns the sample count of the SoundData.",
+ returns = "(count: number)",
+ type = "function"
+ },
+ getSampleRate = {
+ args = "()",
+ description = "Returns the sample rate of the SoundData.",
+ returns = "(rate: number)",
+ type = "function"
+ },
+ setSample = {
+ args = "(i: number, sample: number)",
+ description = "Sets the sample at the specified position.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Contains raw audio samples. You can not play SoundData back directly. You must wrap a Source object around it.",
+ type = "lib"
+ },
+ newSoundData = {
+ args = "(filename: string)",
+ description = "Creates new SoundData from a file. It's also possible to create SoundData with a custom sample rate, channel and bit depth.\n\nThe sound data will be decoded to the memory in a raw format. It is recommended to create only short sounds like effects, as a 3 minute song uses 30 MB of memory this way.",
+ returns = "(soundData: SoundData)",
+ type = "function"
+ }
+ },
+ description = "This module is responsible for decoding sound files. It can't play the sounds, see love.audio for that.",
+ type = "class"
+ },
+ system = {
+ childs = {
+ PowerState = {
+ childs = {
+ battery = {
+ description = "Not plugged in, running on a battery.",
+ type = "value"
+ },
+ charged = {
+ description = "Plugged in, battery is fully charged.",
+ type = "value"
+ },
+ charging = {
+ description = "Plugged in, charging battery.",
+ type = "value"
+ },
+ nobattery = {
+ description = "Plugged in, no battery available.",
+ type = "value"
+ },
+ unknown = {
+ description = "Cannot determine power status.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ getOS = {
+ args = "()",
+ description = "Gets the current operating system. In general, LÖVE abstracts away the need to know the current operating system, but there are a few cases where it can be useful (especially in combination with os.execute.)",
+ returns = "(os_string: string)",
+ type = "function"
+ },
+ getPowerInfo = {
+ args = "()",
+ description = "Gets information about the system's power supply.",
+ returns = "(state: PowerState, percent: number, seconds: number)",
+ type = "function"
+ },
+ getProcessorCount = {
+ args = "()",
+ description = "Gets the number of CPU cores in the system.\n\nThe number includes the threads reported if technologies such as Intel's Hyper-threading are enabled. For example, on a 4-core CPU with Hyper-threading, this function will return 8.",
+ returns = "(cores: number)",
+ type = "function"
+ },
+ openURL = {
+ args = "(url: string)",
+ description = "Opens a URL with the user's web or file browser.",
+ returns = "(success: boolean)",
+ type = "function"
+ },
+ setClipboardText = {
+ args = "(text: string)",
+ description = "Puts text in the clipboard.",
+ returns = "()",
+ type = "function"
+ },
+ vibrate = {
+ args = "(seconds: number)",
+ description = "Causes the device to vibrate, if possible. Currently this will only work on Android and iOS devices that have a built-in vibration motor.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Provides access to information about the user's system.",
+ type = "lib"
+ },
+ textedited = {
+ args = "(text: string, start: number, length: number)",
+ description = "Called when the candidate text for an IME (Input Method Editor) has changed.\n\nThe candidate text is not the final text that the user will eventually choose. Use love.textinput for that.",
+ returns = "()",
+ type = "function"
+ },
+ textinput = {
+ args = "(text: string)",
+ description = "Called when text has been entered by the user. For example if shift-2 is pressed on an American keyboard layout, the text \"@\" will be generated.",
+ returns = "()",
+ type = "function"
+ },
+ thread = {
+ childs = {
+ Channel = {
+ childs = {
+ demand = {
+ args = "()",
+ description = "Retrieves the value of a Channel message and removes it from the message queue.\n\nThe value of the message can be a boolean, string, number, LÖVE userdata, or a simple flat table. It waits until a message is in the queue then returns the message value.",
+ returns = "(value: value)",
+ type = "function"
+ },
+ getCount = {
+ args = "()",
+ description = "Retrieves the number of messages in the thread Channel queue.",
+ returns = "(count: number)",
+ type = "function"
+ },
+ peek = {
+ args = "()",
+ description = "Retrieves the value of a Channel message, but leaves it in the queue.\n\nThe value of the message can be a boolean, string, number or a LÖVE userdata. It returns nil if there's no message in the queue.",
+ returns = "(value: value)",
+ type = "function"
+ },
+ performAtomic = {
+ args = "(func: function, arg1: any, ...: any)",
+ description = "Executes the specified function atomically with respect to this Channel.\n\nCalling multiple methods in a row on the same Channel is often useful. However if multiple Threads are calling this Channel's methods at the same time, the different calls on each Thread might end up interleaved (e.g. one or more of the second thread's calls may happen in between the first thread's calls.)\n\nThis method avoids that issue by making sure the Thread calling the method has exclusive access to the Channel until the specified function has returned.",
+ returns = "(ret1: any, ...: any)",
+ type = "function"
+ },
+ pop = {
+ args = "()",
+ description = "Retrieves the value of a Channel message and removes it from the message queue.\n\nThe value of the message can be a boolean, string, number, LÖVE userdata, or a simple flat table. It returns nil if there are no messages in the queue.",
+ returns = "(value: value)",
+ type = "function"
+ },
+ push = {
+ args = "(value: value)",
+ description = "Send a message to the thread Channel.\n\nThe value of the message can be a boolean, string, number, LÖVE userdata, or a simple flat table. Foreign userdata (Lua's files, LuaSocket, ENet, ...), functions, and tables inside tables are not supported.",
+ returns = "()",
+ type = "function"
+ },
+ supply = {
+ args = "(value: value)",
+ description = "Send a message to the thread Channel and wait for a thread to accept it.\n\nThe value of the message can be a boolean, string, number, LÖVE userdata, or a simple flat table. Foreign userdata (Lua's files, LuaSocket, ENet, ...), functions, and tables inside tables are not supported.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "A channel is a way to send and receive data to and from different threads.",
+ type = "lib"
+ },
+ Thread = {
+ childs = {
+ isRunning = {
+ args = "()",
+ description = "Returns whether the thread is currently running.\n\nThreads which are not running can be (re)started with Thread:start.",
+ returns = "()",
+ type = "function"
+ },
+ start = {
+ args = "(arg1: value, arg2: value, ...: value)",
+ description = "Starts the thread.\n\nThreads can be restarted after they have completed their execution.",
+ returns = "()",
+ type = "function"
+ },
+ wait = {
+ args = "()",
+ description = "Wait for a thread to finish. This call will block until the thread finishes.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "A Thread is a chunk of code that can run in parallel with other threads.\n\nThreads will place all Lua errors in \"error\". To retrieve the error, call Thread:get('error') in the main thread.",
+ type = "lib"
+ },
+ newChannel = {
+ args = "()",
+ description = "Create a new unnamed thread channel.\n\nOne use for them is to pass new unnamed channels to other threads via Channel:push",
+ returns = "(channel: Channel)",
+ type = "function"
+ },
+ newThread = {
+ args = "(filename: string)",
+ description = "Creates a new Thread from a File or Data object.",
+ returns = "(thread: Thread)",
+ type = "function"
+ }
+ },
+ description = "Allows you to work with threads.\n\nThreads are separate Lua environments, running in parallel to the main code. As their code runs separately, they can be used to compute complex operations without adversely affecting the frame rate of the main thread. However, as they are separate environments, they cannot access the variables and functions of the main thread, and communication between threads is limited.\n\nAll LOVE objects (userdata) are shared among threads so you'll only have to send their references across threads. You may run into concurrency issues if you manipulate an object on multiple threads at the same time.\n\nWhen a Thread is started, it only loads the love.thread module. Every other module has to be loaded with require.",
+ type = "class"
+ },
+ threaderror = {
+ args = "(thread: Thread, errorstr: string)",
+ description = "Callback function triggered when a Thread encounters an error.",
+ returns = "()",
+ type = "function"
+ },
+ timer = {
+ childs = {
+ getDelta = {
+ args = "()",
+ description = "Returns the time between the last two frames.",
+ returns = "(dt: number)",
+ type = "function"
+ },
+ getFPS = {
+ args = "()",
+ description = "Returns the current frames per second.",
+ returns = "(fps: number)",
+ type = "function"
+ },
+ getTime = {
+ args = "()",
+ description = "Returns the value of a timer with an unspecified starting time. This function should only be used to calculate differences between points in time, as the starting time of the timer is unknown.",
+ returns = "(time: number)",
+ type = "function"
+ },
+ sleep = {
+ args = "(s: number)",
+ description = "Sleeps the program for the specified amount of time.",
+ returns = "()",
+ type = "function"
+ },
+ step = {
+ args = "()",
+ description = "Measures the time between two frames. Calling this changes the return value of love.timer.getDelta.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "Provides an interface to the user's clock.",
+ type = "lib"
+ },
+ touch = {
+ childs = {
+ getPressure = {
+ args = "(id: light userdata)",
+ description = "Gets the current pressure of the specified touch-press.",
+ returns = "(pressure: number)",
+ type = "function"
+ },
+ getTouches = {
+ args = "()",
+ description = "Gets a list of all active touch-presses.",
+ returns = "(touches: table)",
+ type = "function"
+ }
+ },
+ description = "Provides an interface to touch-screen presses.",
+ type = "lib"
+ },
+ touchmoved = {
+ args = "(id: light userdata, x: number, y: number, pressure: number)",
+ description = "Callback function triggered when a touch press moves inside the touch screen.",
+ returns = "()",
+ type = "function"
+ },
+ touchpressed = {
+ args = "(id: light userdata, x: number, y: number, pressure: number)",
+ description = "Callback function triggered when the touch screen is touched.",
+ returns = "()",
+ type = "function"
+ },
+ touchreleased = {
+ args = "(id: light userdata, x: number, y: number, pressure: number)",
+ description = "Callback function triggered when the touch screen stops being touched.",
+ returns = "()",
+ type = "function"
+ },
+ update = {
+ args = "(dt: number)",
+ description = "Callback function triggered when a key is pressed.",
+ returns = "()",
+ type = "function"
+ },
+ video = {
+ childs = {
+ Video = {
+ childs = {
+ getFilter = {
+ args = "()",
+ description = "Gets the scaling filters used when drawing the Video.",
+ returns = "(min: FilterMode, mag: FilterMode, anisotropy: number)",
+ type = "function"
+ },
+ getHeight = {
+ args = "()",
+ description = "Gets the height of the Video in pixels.",
+ returns = "(height: number)",
+ type = "function"
+ },
+ getSource = {
+ args = "()",
+ description = "Gets the audio Source used for playing back the video's audio. May return nil if the video has no audio, or if Video:setSource is called with a nil argument.",
+ returns = "(source: Source)",
+ type = "function"
+ },
+ getStream = {
+ args = "()",
+ description = "Gets the VideoStream object used for decoding and controlling the video.",
+ returns = "(stream: VideoStream)",
+ type = "function"
+ },
+ getWidth = {
+ args = "()",
+ description = "Gets the width of the Video in pixels.",
+ returns = "(width: number)",
+ type = "function"
+ },
+ isPlaying = {
+ args = "()",
+ description = "Gets whether the Video is currently playing.",
+ returns = "(playing: boolean)",
+ type = "function"
+ },
+ pause = {
+ args = "()",
+ description = "Pauses the Video.",
+ returns = "()",
+ type = "function"
+ },
+ play = {
+ args = "()",
+ description = "Starts playing the Video. In order for the video to appear onscreen it must be drawn with love.graphics.draw.",
+ returns = "()",
+ type = "function"
+ },
+ rewind = {
+ args = "()",
+ description = "Rewinds the Video to the beginning.",
+ returns = "()",
+ type = "function"
+ },
+ seek = {
+ args = "(offset: number)",
+ description = "Sets the current playback position of the Video.",
+ returns = "()",
+ type = "function"
+ },
+ setFilter = {
+ args = "(min: FilterMode, mag: FilterMode, anisotropy: number)",
+ description = "Sets the scaling filters used when drawing the Video.",
+ returns = "()",
+ type = "function"
+ },
+ setSource = {
+ args = "(source: Source)",
+ description = "Sets the audio Source used for playing back the video's audio. The audio Source also controls playback speed and synchronization.",
+ returns = "()",
+ type = "function"
+ },
+ tell = {
+ args = "(seconds: number)",
+ description = "Gets the current playback position of the Video.",
+ returns = "()",
+ type = "function"
+ }
+ },
+ description = "A drawable video.",
+ type = "lib"
+ },
+ newVideoStream = {
+ args = "(filename: string)",
+ description = "Creates a new VideoStream. Currently only Ogg Theora video files are supported. VideoStreams can't draw videos, see love.graphics.newVideo for that.",
+ returns = "(videostream: VideoStream)",
+ type = "function"
+ }
+ },
+ description = "This module is responsible for decoding, controlling, and streaming video files.\n\nIt can't draw the videos, see love.graphics.newVideo and Video objects for that.",
+ type = "class"
+ },
+ visible = {
+ args = "(v: boolean)",
+ description = "Callback function triggered when window is minimized/hidden or unminimized by the user.",
+ returns = "()",
+ type = "function"
+ },
+ wheelmoved = {
+ args = "(x: number, y: number)",
+ description = "Callback function triggered when the mouse wheel is moved.",
+ returns = "()",
+ type = "function"
+ },
+ window = {
+ childs = {
+ FullscreenType = {
+ childs = {
+ desktop = {
+ description = "Sometimes known as borderless fullscreen windowed mode. A borderless screen-sized window is created which sits on top of all desktop UI elements. The window is automatically resized to match the dimensions of the desktop, and its size cannot be changed.",
+ type = "value"
+ },
+ exclusive = {
+ description = "Standard exclusive-fullscreen mode. Changes the display mode (actual resolution) of the monitor.",
+ type = "value"
+ }
+ },
+ description = "class constants",
+ type = "class"
+ },
+ fromPixels = {
+ args = "(pixelvalue: number)",
+ description = "Converts a number from pixels to density-independent units.\n\nThe pixel density inside the window might be greater (or smaller) than the \"size\" of the window. For example on a retina screen in Mac OS X with the highdpi window flag enabled, the window may take up the same physical size as an 800x600 window, but the area inside the window uses 1600x1200 pixels. love.window.fromPixels(1600) would return 800 in that case.\n\nThis function converts coordinates from pixels to the size users are expecting them to display at onscreen. love.window.toPixels does the opposite. The highdpi window flag must be enabled to use the full pixel density of a Retina screen on Mac OS X and iOS. The flag currently does nothing on Windows and Linux, and on Android it is effectively always enabled.\n\nMost LÖVE functions return values and expect arguments in terms of pixels rather than density-independent units.",
+ returns = "(value: number)",
+ type = "function"
+ },
+ getDisplayName = {
+ args = "(displayindex: number)",
+ description = "Gets the name of a display.",
+ returns = "(name: string)",
+ type = "function"
+ },
+ getFullscreen = {
+ args = "()",
+ description = "Gets whether the window is fullscreen.",
+ returns = "(fullscreen: boolean, fstype: FullscreenType)",
+ type = "function"
+ },
+ getFullscreenModes = {
+ args = "(display: number)",
+ description = "Gets a list of supported fullscreen modes.",
+ returns = "(modes: table)",
+ type = "function"
+ },
+ getIcon = {
+ args = "()",
+ description = "Gets the window icon.",
+ returns = "(imagedata: ImageData)",
+ type = "function"
+ },
+ getMode = {
+ args = "()",
+ description = "Returns the current display mode.",
+ returns = "(width: number, height: number, flags: table)",
+ type = "function"
+ },
+ getPixelScale = {
+ args = "()",
+ description = "Gets the DPI scale factor associated with the window.\n\nThe pixel density inside the window might be greater (or smaller) than the \"size\" of the window. For example on a retina screen in Mac OS X with the highdpi window flag enabled, the window may take up the same physical size as an 800x600 window, but the area inside the window uses 1600x1200 pixels. love.window.getPixelScale() would return 2.0 in that case.\n\nThe love.window.fromPixels and love.window.toPixels functions can also be used to convert between units.\n\nThe highdpi window flag must be enabled to use the full pixel density of a Retina screen on Mac OS X and iOS. The flag currently does nothing on Windows and Linux, and on Android it is effectively always enabled.",
+ returns = "(scale: number)",
+ type = "function"
+ },
+ getPosition = {
+ args = "()",
+ description = "Gets the position of the window on the screen.\n\nThe window position is in the coordinate space of the display it is currently in.",
+ returns = "(x: number, y: number, display: number)",
+ type = "function"
+ },
+ getTitle = {
+ args = "()",
+ description = "Gets the window title.",
+ returns = "(title: string)",
+ type = "function"
+ },
+ hasFocus = {
+ args = "()",
+ description = "Checks if the game window has keyboard focus.",
+ returns = "(focus: boolean)",
+ type = "function"
+ },
+ hasMouseFocus = {
+ args = "()",
+ description = "Checks if the game window has mouse focus.",
+ returns = "(focus: boolean)",
+ type = "function"
+ },
+ isCreated = {
+ args = "()",
+ description = "Checks if the window has been created.",
+ returns = "(created: boolean)",
+ type = "function"
+ },
+ isDisplaySleepEnabled = {
+ args = "()",
+ description = "Gets whether the display is allowed to sleep while the program is running.\n\nDisplay sleep is disabled by default. Some types of input (e.g. joystick button presses) might not prevent the display from sleeping, if display sleep is allowed.",
+ returns = "(enabled: boolean)",
+ type = "function"
+ },
+ isVisible = {
+ args = "()",
+ description = "Checks if the game window is visible.\n\nThe window is considered visible if it's not minimized and the program isn't hidden.",
+ returns = "(visible: boolean)",
+ type = "function"
+ },
+ maximize = {
+ args = "()",
+ description = "Makes the window as large as possible.\n\nThis function has no effect if the window isn't resizable, since it essentially programmatically presses the window's \"maximize\" button.",
+ returns = "()",
+ type = "function"
+ },
+ minimize = {
+ args = "()",
+ description = "Minimizes the window to the system's task bar / dock.",
+ returns = "()",
+ type = "function"
+ },
+ requestAttention = {
+ args = "(continuous: boolean)",
+ description = "Causes the window to request the attention of the user if it is not in the foreground.\n\nIn Windows the taskbar icon will flash, and in OS X the dock icon will bounce.",
+ returns = "()",
+ type = "function"
+ },
+ setDisplaySleepEnabled = {
+ args = "(enable: boolean)",
+ description = "Sets whether the display is allowed to sleep while the program is running.\n\nDisplay sleep is disabled by default. Some types of input (e.g. joystick button presses) might not prevent the display from sleeping, if display sleep is allowed.",
+ returns = "()",
+ type = "function"
+ },
+ setFullscreen = {
+ args = "(fullscreen: boolean)",
+ description = "Enters or exits fullscreen. The display to use when entering fullscreen is chosen based on which display the window is currently in, if multiple monitors are connected.\n\nIf fullscreen mode is entered and the window size doesn't match one of the monitor's display modes (in normal fullscreen mode) or the window size doesn't match the desktop size (in 'desktop' fullscreen mode), the window will be resized appropriately. The window will revert back to its original size again when fullscreen mode is exited using this function.",
+ returns = "(success: boolean)",
+ type = "function"
+ },
+ setIcon = {
+ args = "(imagedata: ImageData)",
+ description = "Sets the window icon until the game is quit. Not all operating systems support very large icon images.",
+ returns = "(success: boolean)",
+ type = "function"
+ },
+ setMode = {
+ args = "(width: number, height: number, flags: table)",
+ description = "Sets the display mode and properties of the window.\n\nIf width or height is 0, setMode will use the width and height of the desktop.\n\nChanging the display mode may have side effects: for example, canvases will be cleared and values sent to shaders with Shader:send will be erased. Make sure to save the contents of canvases beforehand or re-draw to them afterward if you need to.",
+ returns = "(success: boolean)",
+ type = "function"
+ },
+ setPosition = {
+ args = "(x: number, y: number, display: number)",
+ description = "Sets the position of the window on the screen.\n\nThe window position is in the coordinate space of the specified display.",
+ returns = "()",
+ type = "function"
+ },
+ setTitle = {
+ args = "(title: string)",
+ description = "Sets the window title.",
+ returns = "()",
+ type = "function"
+ },
+ showMessageBox = {
+ args = "(title: string, message: string, type: MessageBoxType, attachtowindow: boolean)",
+ description = "Displays a message box dialog above the love window. The message box contains a title, optional text, and buttons.",
+ returns = "(success: boolean)",
+ type = "function"
+ },
+ toPixels = {
+ args = "(value: number)",
+ description = "Converts a number from density-independent units to pixels.\n\nThe pixel density inside the window might be greater (or smaller) than the \"size\" of the window. For example on a retina screen in Mac OS X with the highdpi window flag enabled, the window may take up the same physical size as an 800x600 window, but the area inside the window uses 1600x1200 pixels. love.window.toPixels(800) would return 1600 in that case.\n\nThis is used to convert coordinates from the size users are expecting them to display at onscreen to pixels. love.window.fromPixels does the opposite. The highdpi window flag must be enabled to use the full pixel density of a Retina screen on Mac OS X and iOS. The flag currently does nothing on Windows and Linux, and on Android it is effectively always enabled.\n\nMost LÖVE functions return values and expect arguments in terms of pixels rather than density-independent units.",
+ returns = "(pixelvalue: number)",
+ type = "function"
+ }
+ },
+ description = "Provides an interface for modifying and retrieving information about the program's window.",
+ type = "lib"
+ }
+ },
+ description = "Love2d modules, functions, and callbacks.",
+ type = "lib"
+}
+
+do return {love = love} end
+
+-- the following code is used to convert love_api.lua to a proper format
+love = dofile('love_api.lua')
+
+-- conversion script
+local function convert(l)
+ local function merge(...) -- merges tables into one table
+ local r = {}
+ for _,v in pairs({...}) do
+ for _,e in pairs(v) do table.insert(r, e) end
+ end
+ return r
+ end
+ local function params(t) -- merges parameters and return results
+ if not t then return end
+ local r = {}
+ for _,v in ipairs(t) do
+ table.insert(r, v.name .. ': ' .. v.type)
+ end
+ return '(' .. table.concat(r, ", ") .. ')'
+ end
+
+ if l.modules then
+ l.description = 'Love2d modules, functions, and callbacks.'
+ l.type = "lib"
+ l.childs = merge(l.modules, l.functions or {}, l.callbacks or {})
+ l.types = nil -- don't need types
+ l.callbacks = nil
+ l.functions = nil
+ l.modules = nil
+ end
+
+ if not l.childs then return end
+
+ for n,v in ipairs(l.childs) do
+ if v.functions and #v.functions > 1 and #v.functions[1] == 0 then
+ io.stderr:write("Alternative signature ignored for "..v.name..".\n")
+ table.remove(v.functions, 1)
+ end
+ v.childs = merge(v.types, v.functions, v.constants, v.enums)
+ if v.name then
+ l.childs[v.name] = v
+ v.name = nil
+ end
+ if #v.childs > 0 and v.childs[1] then
+ if v.childs[1].returns then v.returns = params(v.childs[1].returns) end
+ if v.childs[1].arguments then v.args = params(v.childs[1].arguments) end
+ end
+ -- some nodes have first chils as empty and the data is in the second one (Mouse.setCursor)
+ if v.variants and #v.variants > 0 then
+ v.returns = params(v.variants[1] and v.variants[1].returns or v.variants[2] and v.variants[2].returns)
+ end
+ if v.variants and #v.variants > 0 then
+ v.args = params(v.variants[1] and v.variants[1].arguments or v.variants[2] and v.variants[2].arguments)
+ end
+ local nochildren = #v.childs == 0 or v.returns or v.args
+ v.type = nochildren and ((v.returns or v.args or v.variants) and "function" or "value")
+ or v.types and "class"
+ or v.constants and "class"
+ or v.functions and "lib"
+ or "function"
+ if v.constants then v.description = "class constants" end
+ v.variants = nil
+ v.types = nil
+ v.functions = nil
+ v.constants = nil
+ v.enums = nil
+ v.supertypes = nil
+ v.constructors = nil
+ if nochildren then v.childs = nil end
+ if v.type == "function" then
+ v.args = v.args or '()'
+ v.returns = v.returns or '()'
+ end
+ l.childs[n] = nil
+ convert(v)
+ end
+ return l
+end
+
+package.path = package.path .. ';../../lualibs/?/?.lua;../../lualibs/?.lua'
+package.cpath = package.cpath .. ';../../bin/clibs/?.dll'
+print((require 'mobdebug').line(convert(love), {indent = ' ', comment = false}))
diff --git a/love2dToAPK/tools/tools/zbstudio-win/api/lua/luajit2.lua b/love2dToAPK/tools/tools/zbstudio-win/api/lua/luajit2.lua
new file mode 100644
index 0000000..07d9074
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/api/lua/luajit2.lua
@@ -0,0 +1,52 @@
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+-- function helpers
+
+local function fn (description)
+ local description2,returns,args = description:match("(.+)%-%s*(%b())%s*(%b())")
+ if not description2 then
+ return {type="function",description=description,
+ returns="(?)"}
+ end
+ returns = returns:gsub("^%s+",""):gsub("%s+$","")
+ local ret = returns:sub(2,-2)
+ local vt = ret:match("^%[?string") and "string"
+ vt = vt or ret:match("^%[?table") and "table"
+ vt = vt or ret:match("^%[?file") and "io"
+ return {type="function",description=description2,
+ returns=returns, args = args, valuetype = vt}
+end
+
+local function val (description)
+ return {type="value",description = description}
+end
+
+---------------------------
+
+local api = {
+ffi = {
+ description = "FFI",
+ type = "lib",
+ childs = {
+ cdef = fn "Adds multiple C declarations for types or external symbols - ()(string)",
+ load = fn "This loads the dynamic library given by name and returns a new C library namespace which binds to its symbols. On POSIX systems, if global is true, the library symbols are loaded into the global namespace, too. - (userdata)(string,[global])",
+ new = fn "The following API functions create cdata objects (type() returns 'cdata'). All created cdata objects are garbage collected. - (cdata)(string/ctype,nelement,init...)",
+ typeof = fn "Creates a ctype object for the given ct. - (ctype)(ct)",
+ cast = fn "Creates a scalar cdata object for the given ct. The cdata object is initialized with init according to C casting rules. - (cdata)(ctype,cdata init)",
+ metatype = fn "Creates a ctype object for the given ct and associates it with a metatable. Only struct/union types, complex numbers and vectors are allowed. Other types may be wrapped in a struct, if needed. - (cdata)(ct,table meta)",
+ gc = fn "Associates a finalizer with a pointer or aggregate cdata object. The cdata object is returned unchanged. - (cdata)(ct,function finalizer)",
+ sizeof = fn "Returns the size of ct in bytes. Returns nil if the size is not known. - (number)(ct,[nelem])",
+ alignof = fn "Returns the minimum required alignment for ct in bytes. - (number)(ct)",
+ offsetof = fn "Returns the offset (in bytes) of field relative to the start of ct, which must be a struct. Additionally returns the position and the field size (in bits) for bit fields. - (number)(ct, field)",
+ istype = fn "Returns true if obj has the C type given by ct. Returns false otherwise. - (boolean)(ct,obj)",
+ string = fn "Creates an interned Lua string from the data pointed to by ptr. If the optional argument len is missing, ptr is converted to a 'char *' and the data is assumed to be zero-terminated. The length of the string is computed with strlen(). - (string)(ptr, [number len])",
+ copy = fn "Copies the data pointed to by src to dst. dst is converted to a 'void *' and src is converted to a 'const void *'. - ()(dst,[src,len] / [string])",
+ fill = fn "Fills the data pointed to by dst with len constant bytes, given by c. If c is omitted, the data is zero-filled. - ()(dst, len, [c])",
+ abi = fn "Returns true if param (a Lua string) applies for the target ABI (Application Binary Interface). Returns false otherwise. 32bit 64bit lq be fpu softfp hardfp eabi win. - (boolean)(string)",
+ os = val "string value of OS",
+ }
+},
+}
+
+return api \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-win/api/lua/wxwidgets.lua b/love2dToAPK/tools/tools/zbstudio-win/api/lua/wxwidgets.lua
new file mode 100644
index 0000000..6882928
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/api/lua/wxwidgets.lua
@@ -0,0 +1,24 @@
+local function populateAPI(t)
+ local api = {}
+ for k,v in pairs(t) do
+ api[k] = {
+ type = (type(v) == "function" and "function" or "value"),
+ description = "",
+ returns = "",
+ }
+ end
+ return api
+end
+
+return {
+ wx = {
+ type = "lib",
+ description = "wx lib",
+ childs = populateAPI(wx),
+ },
+ wxstc = {
+ type = "lib",
+ description = "wxSTC lib",
+ childs = populateAPI(wxstc),
+ },
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/api/opencl/std.lua b/love2dToAPK/tools/tools/zbstudio-win/api/opencl/std.lua
new file mode 100644
index 0000000..675d945
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/api/opencl/std.lua
@@ -0,0 +1,278 @@
+local funcstring =
+[[
+get_work_dim() Returns the number of dimensions in use
+get_global_size(uint dimindx) Returns the number of global work-items specified for dimension identified by dimindx
+get_global_id(uint dimindx) Returns the unique global work-item ID value for dimension identified by dimindx
+get_local_size(uint dimindx) Returns the number of local work-items specified in dimension identified by dimindx
+get_local_id(uint dimindx) Returns the unique local work-item ID i.e. a work-item within a specific work-group for dimension identified by dimindx.
+get_num_groups(uint dimindx) Returns the number of work-groups that will execute a kernel for dimension identified by dimindx
+get_group_id(uint dimindx) Returns the work-group ID
+acos(gentype) Arc cosine function
+acosh(gentype) Inverse hyperbolic cosine
+acospi(gentype) Compute acos (x) / PI
+asin(gentype) Arc sine function
+asinh(gentype) Inverse hyperbolic sine
+asinpi(gentype x) Compute asin (x) / PI
+atan(gentype y_over_x) Arc tangent function
+atan2(gentype y, gentype x) Arc tangent of y / x
+atanh(gentype) Hyperbolic arc tangent.
+atanpi(gentype x) Compute atan (x) / PI
+atan2pi(gentype y, gentype x) Compute atan2 (y, x) / PI
+cbrt(gentype) Compute cube-root
+ceil(gentype) Round to integral value using the round to +ve infinity rounding mode
+copysign(gentype x, gentype y) Returns x with its sign changed to match the sign of y
+cos(gentype) Compute cosine
+cosh(gentype) Compute hyperbolic consine
+cospi(gentype x) Compute cos (PI*x)
+erfc(gentype) Complementary error function
+erf(gentype) Error function encountered in integrating the normal distribution
+exp(gentype x) Compute the base- e exponential of x
+exp2(gentype) Exponential base 2 function
+exp10(gentype) Exponential base 10 function
+expm1(gentype x) Compute e^x - 1.0
+fabs(gentype) Compute absolute value of a floating-point number
+fdim(gentype x, gentype y) x - y if x > y, +0 if x is less than or equal to y
+floor(gentype) Round to integral value using the round to –ve infinity rounding mode
+fma(gentype a, gentype b, gentype c) Returns the correctly rounded floating-point representation of the sum of c with the infinitely precise product of a and b
+fmax(gentype x, gentype y) Returns y if x < y, otherwise it returns x
+fmin(gentype x, gentype y) Returns y if y < x, otherwise it returns x
+fmod(gentype x, gentype y) Modulus. Returns x – y * trunc (x/y)
+fract(gentype x, gentype *iptr) Returns fmin( x – floor (x), 0x1.fffffep-1f ).
+frexp(gentype x, intn *exp) Extract mantissa and exponent from x
+hypot(gentype x, gentype y) Compute the value of the square root of x2+y2
+ilogb(gentype x) Return the exponent as an integer value
+ldexp(gentype x, intn n) Multiply x by 2 to the power n
+lgamma(gentype x) Returns the natural logarithm of the absolute value of the gamma function
+lgamma_r(gentype x, intn *signp) Returns the natural logarithm of the absolute value of the gamma function
+log(gentype) Compute natural logarithm
+log2(gentype) Compute a base 2 logarithm
+log10(gentype) Compute a base 10 logarithm
+log1p(gentype x) Compute loge(1.0 + x)
+logb(gentype x) Compute the exponent of x, which is the integral part of logr|x|
+mad(gentype a, gentype b, gentype c) Approximates a * b + c.
+modf(gentype x, gentype *iptr) Decompose a floating-point number
+nan(uintn nancode) Returns a quiet NaN
+nextafter(gentype x, gentype y) Computes the next representable single-precision floating-point value following x in the direction of y.
+pow(gentype x, gentype y) Compute x to the power y
+pown(gentype x, intn y) Compute x to the power y, where y is an integer
+powr(gentype x, gentype y) Compute x to the power y, where x is >= 0
+remainder(gentype x, gentype y) r = x - n*y, where n is the integer nearest the exact value of x/y
+remquo(gentype x, gentype y, intn *quo) r = x - n*y, where n is the integer nearest the exact value of x/y
+rint(gentype) Round to integral value (using round to nearest even rounding mode)
+rootn(gentype x, intn y) Compute x to the power 1/y
+round(gentype x) Return the integral value nearest to x rounding halfway cases away from zero
+rsqrt(gentype) Compute inverse square root
+sin(gentype) Compute sine
+sincos(gentype x, gentype *cosval) Compute sine and cosine of x
+sinh(gentype) Compute hyperbolic sine.
+sinpi(gentype x) Compute sin (PI*x)
+sqrt(gentype) Compute square root
+tan(gentype) Compute tangent
+tanh(gentype) Compute hyperbolic tangent
+tanpi(gentype x) Compute tan (PI*x)
+tgamma(gentype) Compute the gamma function
+trunc(gentype) Round to integral value using the round to zero
+abs(gentype x) Returns |x|
+abs_diff(gentype x, gentype y) Returns |x – y| without modulo overflow
+add_sat(gentype x, gentype y) Returns x + y and saturates the result
+hadd(gentype x, gentype y) Returns (x + y) >> 1
+rhadd(gentype x, gentype y) Returns (x + y + 1) >> 1
+clz(gentype x) Returns the number of leading 0-bits in x, starting at the most significant bit position.
+mad_hi(gentype a, gentype b, gentype c) Returns mul_hi(a, b) + c
+mad_sat(gentype a, gentype b, gentype c) Returns a * b + c and saturates the result
+max(gentype x, gentype y) Returns y if x < y, otherwise it returns x
+min(gentype x, gentype y) Returns y if y < x, otherwise it returns x
+mul_hi(gentype x, gentype y) Computes x * y and returns the high half of the product of x and y
+rotate(gentype v, gentype i)
+sub_sat(gentype x, gentype y) Returns x - y and saturates the result
+upsample(charn hi, ucharn lo) result[i] = ((short)hi[i] << 8) | lo[i]
+mad24(gentype x, gentype y, gentype z)
+mul24(gentype x, gentype y)
+clamp(gentype x, gentype minval, gentype maxval) Returns fmin(fmax(x, minval), maxval)
+degrees(gentype radians) Converts radians to degrees
+max(gentype x, gentype y)
+min(gentype x, gentype y)
+mix(gentype x, gentype y, gentype a) Returns the linear blend of x&y: x + (y – x) * a
+radians(gentype degrees) Converts degrees to radians
+step(gentype edge, gentype x) Returns 0.0 if x < edge, otherwise it returns 1.0
+smoothstep(genType edge0, genType edge1, genType x)
+sign(gentype x)
+cross(float4 p0, float4 p1) Returns the cross product of p0.xyz and p1.xyz.
+dot(gentype p0, gentype p1) Compute dot product
+distance(gentype p0, gentype p1) Returns the distance between p0 and p1
+length(gentype p) Return the length of vecto
+normalize(gentype p) Returns a vector in the same direction as p but with length of 1.
+fast_distance(gentype p0, gentype p1) Returns fast_length(p0 – p1).
+fast_length(gentype p) Returns the length of vector
+fast_normalize(gentype p) Returns a vector in the same direction as p but with length of 1.
+read_imagef(image2d_t image, sampler_t sampler, int2 coord)
+read_imagei(image2d_t image, sampler_t sampler, int2 coord)
+read_imageui(image2d_t image, sampler_t sampler, int2 coord)
+write_imagef(image2d_t image, int2 coord, float4 color)
+write_imagei(image2d_t image, int2 coord, int4 color)
+write_imageui(image2d_t image, int2 coord, unsigned int4 color)
+get_image_width(image2d_t image)
+get_image_width(image3d_t image)
+get_image_height(image2d_t image)
+get_image_height(image3d_t image)
+get_image_channel_data_type(image2d_t image)
+get_image_channel_data_type(image3d_t image)
+get_image_channel_order(image2d_t image)
+get_image_channel_order(image3d_t image)
+get_image_dim(image2d_t image)
+get_image_dim(image3d_t image)
+barrier(cl_mem_fence_flags flags) All work-items in a work-group executing the kernel must execute this function before any are allowed to continue execution beyond the barrier.
+mem_fence(cl_mem_fence_flags flags) Orders loads and stores of a work-item executing a kernel.
+read_mem_fence(cl_mem_fence_flags flags) Read memory barrier that orders only loads.
+write_mem_fence(cl_mem_fence_flags flags) Write memory barrier that orders only stores.
+async_work_group_copy(gentype *dst, const gentype *src, size_t num_elements, event_t event) Perform an async copy of num_elements gentype elements from src to dst.
+wait_group_events(int num_events, event_t *event_list) Wait for events that identify the async_work_group_copy operations to complete.
+prefetch(const __global gentype *p, size_t num_elements) Prefetch num_elements * sizeof(gentype) bytes into the global cache.
+vload2(size_t offset, const type *p) Read vector data from memory
+vload4(size_t offset, const type *p) Read vector data from memory
+vload8(size_t offset, const type *p) Read vector data from memory
+vload16(size_t offset, const type *p) Read vector data from memory
+vstore2(type2 data, size_t offset, type *p) Write vector data to memory
+vstore4(type4 data, size_t offset, type *p) Write vector data to memory
+vstore8(type8 data, size_t offset, type *p) Write vector data to memory
+vstore16(type16 data, size_t offset, type *p) Write vector data to memory
+]]
+
+local function fn (description)
+ local description2,returns,args = description:match("(.+)%-%s*(%b())%s*(%b())")
+ if not description2 then
+ return {type="function",description=description,
+ returns="(?)"}
+ end
+ return {type="function",description=description2,
+ returns=returns:gsub("^%s+",""):gsub("%s+$",""), args = args}
+end
+
+local function val (description)
+ return {type="value",description = description}
+end
+-- docs
+local api = {
+}
+
+
+local convtypes = [[bool char uchar short ushort int uint long ulong float double]]
+local convout = {}
+for i in convtypes:gmatch("([%w_]+)") do
+ local suffix = {"","_rte","_rtz","_rtp","_rtn"}
+ for k,t in ipairs(suffix) do
+ table.insert(convout,"convert_"..i..t)
+ table.insert(convout,"convert_"..i.."_sat"..t)
+ local vectors = {2,4,8,16}
+ for n,v in ipairs(vectors) do
+ table.insert(convout,"convert_"..i..v..t)
+ table.insert(convout,"convert_"..i..v.."_sat"..t)
+ end
+ end
+end
+convout = table.concat(convout, " ")
+
+local astypes = [[int uint uchar ushort float double size_t ptrdiff_t intptr_t uintptr_t
+ long ulong char short unsigned
+ float2 float4 float8 float16
+ double2 double4 double8 double16
+ char2 char4 char8 char16
+ uchar2 uchar4 uchar8 uchar16
+ short2 short4 short8 short16
+ ushort2 ushort4 ushort8 ushort16
+ int2 int4 int8 int16
+ uint2 uint4 uint8 uint16
+ long2 long4 long8 long16
+ ulong2 ulong4 ulong8 ulong16]]
+
+local astypeout = {}
+for i in astypes:gmatch("([%w_]+)") do
+ table.insert(astypeout, "as_"..i)
+end
+astypeout = table.concat(astypeout, " ")
+
+local keyw = astypeout.." "..convout.." "..[[
+ int uint uchar ushort half float bool double size_t ptrdiff_t intptr_t uintptr_t void
+ long ulong char short unsigned
+ half2 half4 half8 half16
+ float2 float4 float8 float16
+ double2 double4 double8 double16
+ char2 char4 char8 char16
+ uchar2 uchar4 uchar8 uchar16
+ short2 short4 short8 short16
+ ushort2 ushort4 ushort8 ushort16
+ int2 int4 int8 int16
+ uint2 uint4 uint8 uint16
+ long2 long4 long8 long16
+ ulong2 ulong4 ulong8 ulong16
+ image2d_t image3d_t sampler_t event_t cl_image_format
+
+ struct typedef void const
+ return switch case for do while if else break continue volatile
+ CLK_A CLK_R CLK_RG CLK_RGB CLK_RGBA CLK_ARGB CLK_BGRA CLK_INTENSITY CLK_LUMINANCE
+
+ MAXFLOAT HUGE_VALF INFINITY NAN
+ CLK_LOCAL_MEM_FENCE CLK_GLOBAL_MEM_FENCE
+ CLK_SNORM_INT8
+ CLK_SNORM_INT16
+ CLK_UNORM_INT8
+ CLK_UNORM_INT16
+ CLK_UNORM_SHORT_565
+ CLK_UNORM_SHORT_555
+ CLK_UNORM_SHORT_101010
+ CLK_SIGNED_INT8
+ CLK_SIGNED_INT16
+ CLK_SIGNED_INT32
+ CLK_UNSIGNED_INT8
+ CLK_UNSIGNED_INT16
+ CLK_UNSIGNED_INT32
+ CLK_HALF_FLOAT
+ CLK_FLOAT
+ __FILE__ __LINE__ __OPENCL_VERSION__ __ENDIAN_LITTLE__
+ __ROUNDING_MODE__ __IMAGE_SUPPORT__ __FAST_RELAXED_MATH__
+
+ __kernel kernel __attribute__ __read_only __write_only read_only write_only
+ __constant constant __local local __global global __private private
+ vec_type_hint work_group_size_hint reqd_work_group_size
+ aligned packed endian host device
+
+ async_work_group_copy wait_group_events prefetch
+ clamp min max degrees radians sign smoothstep step mix
+ mem_fence read_mem_fence write_mem_fence
+ cross prod distance dot length normalize fast_distance fast_length fast_normalize
+ read_image write_image get_image_width get_image_height get_image_depth
+ get_image_channel_data_type get_image_channel_order
+ get_image_dim
+ abs abs_diff add_sat clz hadd mad24 mad_hi mad_sat
+ mul24 mul_hi rhadd rotate sub_sat upsample
+ read_imagei write_imagei read_imageui write_imageui
+ read_imagef write_imagef
+
+ isequal isnotequal isgreater isgreaterequal isless islessequal islessgreater
+ isfinite isinf isnan isnormal isordered isunordered signbit any all bitselect select
+
+ acos acosh acospi asin asinh asinpi atan atan2 atanh atanpi atan2pi
+ cbrt ceil copysign cos half_cos native_cos cosh cospi half_divide native_divide
+ erf erfc exp half_exp native_exp exp2 half_exp2 native_exp2 exp10 half_exp10 native_exp10
+ expm1 fabs fdim floor fma fmax fmin fmod fract frexp hypot ilogb
+ ldexp lgamma lgamma_r log half_log native_log log2 half_log2 native_log2
+ log10 half_log10 native_log10 log1p logb mad modf nan nextafter
+ pow pown powr half_powr native_powr half_recip native_recip
+ remainder remquo rint round rootn rsqrt half_rsqrt native_rsqrt
+ sin half_sin native_sin sincos sinh sinpi sqrt half_sqrt native_sqrt
+ tan half_tan native_tan tanh tanpi tgamma trunc
+
+ barrier
+ vload2 vload4 vload8 vload16
+ vload_half vload_half2 vload_half4 vload_half8 vload_half16 vloada_half4 vloada_half8 vloada_half16
+ vstore2 vstore4 vstore8 vstore16
+ vstore_half vstore_half2 vstore_half4 vstore_half8 vstore_half16 vstorea_half4 vstorea_half8 vstorea_half16
+ get_global_id get_global_size get_group_id get_local_id get_local_size get_num_groups get_work_dim
+]]
+
+-- keywords - shouldn't be left out
+for w in keyw:gmatch("([a-zA-Z_0-9]+)") do
+ api[w] = {type="keyword"}
+end
+
+return api \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-win/cfg/estrela.lua b/love2dToAPK/tools/tools/zbstudio-win/cfg/estrela.lua
new file mode 100644
index 0000000..102e1a8
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/cfg/estrela.lua
@@ -0,0 +1,19 @@
+-- If you have used Estrela for graphics shader authoring or luxinia,
+-- create/modify the `user.lua` file in the current folder
+-- and add `include "estrela"` (1.21+) to load all tools and specifications by default again.
+
+-- load all tools, specs, and interpreters
+local all = function() return true end
+load.tools(all)
+load.specs(all)
+load.interpreters(all)
+
+-- this flag means that toggling between projects, will not affect the
+-- list of opened files (old estrela default).
+projectautoopen = false
+
+-- default search paths for luxinia
+local luxpath = os.getenv("LUXINIA")
+path.luxinia = luxpath and luxpath.."/" or "../luxinia/engine/"
+local luxpath2 = os.getenv("LUXINIA2")
+path.luxinia2 = luxpath2 and luxpath2.."/" or "../luxinia2/runtime/bin_Windows_x86/"
diff --git a/love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/cn.lua b/love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/cn.lua
new file mode 100644
index 0000000..0e78d46
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/cn.lua
@@ -0,0 +1,344 @@
+return {
+ ["%s event failed: %s"] = nil, -- src\editor\package.lua
+ ["%s%% formatted..."] = nil, -- src\editor\print.lua
+ ["%s%% loaded..."] = nil, -- src\editor\commands.lua
+ ["&About"] = "关于(&A)", -- src\editor\menu_help.lua
+ ["&Add Watch"] = "添加监视(&A)", -- src\editor\debugger.lua
+ ["&Break"] = "中断", -- src\editor\menu_project.lua
+ ["&Close Page"] = "关闭页面", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Community"] = nil, -- src\editor\menu_help.lua
+ ["&Compile"] = "编译", -- src\editor\menu_project.lua
+ ["&Copy Value"] = nil, -- src\editor\debugger.lua
+ ["&Copy"] = "复制", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Default Layout"] = "布局", -- src\editor\menu_view.lua
+ ["&Delete Watch"] = "删除监视", -- src\editor\debugger.lua
+ ["&Delete"] = nil, -- src\editor\filetree.lua
+ ["&Documentation"] = nil, -- src\editor\menu_help.lua
+ ["&Edit Project Directory"] = nil, -- src\editor\filetree.lua
+ ["&Edit Value"] = nil, -- src\editor\debugger.lua
+ ["&Edit Watch"] = "编辑监视", -- src\editor\debugger.lua
+ ["&Edit"] = "编辑", -- src\editor\menu_edit.lua
+ ["&File"] = "文件", -- src\editor\menu_file.lua
+ ["&Find"] = "查找", -- src\editor\menu_search.lua
+ ["&Fold/Unfold All"] = "全 折叠/展开", -- src\editor\menu_edit.lua
+ ["&Frequently Asked Questions"] = nil, -- src\editor\menu_help.lua
+ ["&Getting Started Guide"] = nil, -- src\editor\menu_help.lua
+ ["&Help"] = "帮助", -- src\editor\menu_help.lua
+ ["&New Directory"] = nil, -- src\editor\filetree.lua
+ ["&New"] = "新建", -- src\editor\menu_file.lua
+ ["&Open..."] = "打开...", -- src\editor\menu_file.lua
+ ["&Output/Console Window"] = "输出/主控台视窗", -- src\editor\menu_view.lua
+ ["&Paste"] = "粘贴", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Print..."] = nil, -- src\editor\print.lua
+ ["&Project Page"] = nil, -- src\editor\menu_help.lua
+ ["&Project"] = "项目", -- src\editor\menu_project.lua
+ ["&Redo"] = "重做", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Rename"] = nil, -- src\editor\filetree.lua
+ ["&Replace"] = "替换", -- src\editor\menu_search.lua
+ ["&Run"] = "执行", -- src\editor\menu_project.lua
+ ["&Save"] = "保存", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Search"] = "搜索", -- src\editor\menu_search.lua
+ ["&Select Command"] = nil, -- src\editor\gui.lua
+ ["&Sort"] = "分类", -- src\editor\menu_edit.lua
+ ["&Stack Window"] = "叠视窗/堆栈视窗", -- src\editor\menu_view.lua
+ ["&Start Debugger Server"] = "开启除错器伺服机", -- src\editor\menu_project.lua
+ ["&Status Bar"] = nil, -- src\editor\menu_view.lua
+ ["&Tool Bar"] = nil, -- src\editor\menu_view.lua
+ ["&Tutorials"] = nil, -- src\editor\menu_help.lua
+ ["&Undo"] = "撤消", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&View"] = "视图", -- src\editor\menu_view.lua
+ ["&Watch Window"] = "监视视窗", -- src\editor\menu_view.lua
+ ["About %s"] = "关于 %s", -- src\editor\menu_help.lua
+ ["Add To Scratchpad"] = nil, -- src\editor\editor.lua
+ ["Add Watch Expression"] = "添加监视表达式", -- src\editor\editor.lua
+ ["All files"] = "全部文件", -- src\editor\commands.lua
+ ["Allow external process to start debugging"] = "允许外部进程开启除错", -- src\editor\menu_project.lua
+ ["Analyze the source code"] = "分析源代码", -- src\editor\inspect.lua
+ ["Analyze"] = "分析", -- src\editor\inspect.lua
+ ["Auto Complete Identifiers"] = "自动补全标识符", -- src\editor\menu_edit.lua
+ ["Auto complete while typing"] = "当输入时自动补全", -- src\editor\menu_edit.lua
+ ["Binary file is shown as read-only as it is only partially loaded."] = nil, -- src\editor\commands.lua
+ ["Bookmark"] = nil, -- src\editor\menu_edit.lua
+ ["Break execution at the next executed line of code"] = "执行下一语句之后中断执行", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Breakpoint"] = nil, -- src\editor\menu_project.lua
+ ["C&lear Console Window"] = nil, -- src\editor\gui.lua
+ ["C&lear Output Window"] = "清除输出视窗", -- src\editor\gui.lua, src\editor\menu_project.lua
+ ["C&omment/Uncomment"] = "注释/消除注释", -- src\editor\menu_edit.lua
+ ["Can't evaluate the expression while the application is running."] = nil, -- src\editor\debugger.lua
+ ["Can't open file '%s': %s"] = nil, -- src\editor\findreplace.lua, src\editor\singleinstance.lua, src\editor\inspect.lua, src\editor\outline.lua
+ ["Can't process auto-recovery record; invalid format: %s."] = "不能处理自动恢复存档: %s", -- src\editor\commands.lua
+ ["Can't replace in read-only text."] = nil, -- src\editor\findreplace.lua
+ ["Can't run the entry point script ('%s')."] = "不能执行entry point脚本 ('%s')", -- src\editor\debugger.lua
+ ["Can't start debugger server at %s:%d: %s."] = nil, -- src\editor\debugger.lua
+ ["Can't start debugging for '%s'."] = nil, -- src\editor\debugger.lua
+ ["Can't start debugging session due to internal error '%s'."] = "除错动作失败 '%s'.", -- src\editor\debugger.lua
+ ["Can't start debugging without an opened file or with the current file not being saved ('%s')."] = "不能启动除错,没有文档被开启或当前更改过的文档还没保存('%s')", -- src\editor\debugger.lua
+ ["Can't stop debugger server as it is not started."] = nil, -- src\editor\debugger.lua
+ ["Cancelled by the user."] = nil, -- src\editor\findreplace.lua
+ ["Choose a directory to map"] = nil, -- src\editor\filetree.lua
+ ["Choose a project directory"] = "选择项目文件夹", -- src\editor\toolbar.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Choose a search directory"] = nil, -- src\editor\findreplace.lua
+ ["Choose..."] = "请选...", -- src\editor\findreplace.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Clear Items"] = nil, -- src\editor\findreplace.lua, src\editor\menu_file.lua
+ ["Clear items from this list"] = nil, -- src\editor\menu_file.lua
+ ["Clear the output window before compiling or debugging"] = "编译或除错前清除输出视窗", -- src\editor\menu_project.lua
+ ["Close &Other Pages"] = "关闭其他页面", -- src\editor\gui.lua
+ ["Close A&ll Pages"] = "关闭全部页面", -- src\editor\gui.lua
+ ["Close the current editor window"] = "关闭当前编译视窗", -- src\editor\menu_file.lua
+ ["Co&ntinue"] = "继续", -- src\editor\menu_project.lua
+ ["Col: %d"] = "列: %d", -- src\editor\editor.lua
+ ["Command Line Parameters..."] = nil, -- src\editor\menu_project.lua
+ ["Command line parameters"] = nil, -- src\editor\menu_project.lua
+ ["Comment or uncomment current or selected lines"] = "注释/消除注释 当前或被选的语句", -- src\editor\menu_edit.lua
+ ["Compilation error"] = "编译错误", -- src\editor\commands.lua, src\editor\debugger.lua
+ ["Compilation successful; %.0f%% success rate (%d/%d)."] = "编译成功; 成功率: %.0f%% (%d/%d).", -- src\editor\commands.lua
+ ["Compile the current file"] = "编译当前的文档", -- src\editor\menu_project.lua
+ ["Complete &Identifier"] = "补全标识符", -- src\editor\menu_edit.lua
+ ["Complete the current identifier"] = "补全当前标识符", -- src\editor\menu_edit.lua
+ ["Consider removing backslash from escape sequence '%s'."] = nil, -- src\editor\commands.lua
+ ["Copy Full Path"] = nil, -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Copy selected text to clipboard"] = "复制被选的text到clipboard", -- src\editor\menu_edit.lua
+ ["Correct &Indentation"] = nil, -- src\editor\menu_edit.lua
+ ["Couldn't activate file '%s' for debugging; continuing without it."] = "不能激活 '%s' 以除错; 省略后继续进行", -- src\editor\debugger.lua
+ ["Create an empty document"] = "新建空文档", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Cu&t"] = "剪切", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Cut selected text to clipboard"] = "剪切被选的text到clipboard", -- src\editor\menu_edit.lua
+ ["Debugger server started at %s:%d."] = "除错伺服器起始于 %s:%d.", -- src\editor\debugger.lua
+ ["Debugger server stopped at %s:%d."] = nil, -- src\editor\debugger.lua
+ ["Debugging session completed (%s)."] = "除错会话完成 (%s)", -- src\editor\debugger.lua
+ ["Debugging session started in '%s'."] = "除错会话于 '%s' 起始", -- src\editor\debugger.lua
+ ["Debugging suspended at '%s:%s' (couldn't activate the file)."] = "除错挂起于 '%s:%s' (不能激活文档).", -- src\editor\debugger.lua
+ ["Detach &Process"] = nil, -- src\editor\menu_project.lua
+ ["Disable Indexing For '%s'"] = nil, -- src\editor\outline.lua
+ ["Do you want to delete '%s'?"] = nil, -- src\editor\filetree.lua
+ ["Do you want to overwrite it?"] = nil, -- src\editor\commands.lua
+ ["Do you want to reload it?"] = "需要重新导入吗?", -- src\editor\editor.lua
+ ["Do you want to save the changes to '%s'?"] = "需要把更改保存于 '%s'?", -- src\editor\commands.lua
+ ["E&xit"] = "离开", -- src\editor\menu_file.lua
+ ["Enable Indexing"] = nil, -- src\editor\outline.lua
+ ["Enter Lua code and press Enter to run it."] = "输入Lua代码然后按 <Enter> 以执行", -- src\editor\shellbox.lua
+ ["Enter command line parameters (use Cancel to clear)"] = nil, -- src\editor\menu_project.lua
+ ["Enter replacement text"] = nil, -- src\editor\editor.lua
+ ["Error while loading API file: %s"] = "导入API档时出错误: %s", -- src\editor\autocomplete.lua
+ ["Error while loading configuration file: %s"] = "导入configuration档时出错误: %s", -- src\editor\style.lua
+ ["Error while processing API file: %s"] = "处理API档时出错误: %s", -- src\editor\autocomplete.lua
+ ["Error while processing configuration file: %s"] = "处理configuration档时出错误: %s", -- src\editor\style.lua
+ ["Error"] = "错误", -- src\editor\commands.lua
+ ["Evaluate In Console"] = nil, -- src\editor\editor.lua
+ ["Execute the current project/file and keep updating the code to see immediate results"] = "执行当前项目/文档和更新代码以便得到执行结果", -- src\editor\menu_project.lua
+ ["Execute the current project/file"] = "执行当前项目/文档", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Execution error"] = "执行出错误", -- src\editor\debugger.lua
+ ["Exit program"] = "离开程式", -- src\editor\menu_file.lua
+ ["File '%s' has been modified on disk."] = "磁碟上的文档 '%s' 已被更改", -- src\editor\editor.lua
+ ["File '%s' has more recent timestamp than restored '%s'; please review before saving."] = "文档 '%s' 的时间戳比 '%s' 更新近; 请检验后再保存", -- src\editor\commands.lua
+ ["File '%s' is missing and can't be recovered."] = nil, -- src\editor\commands.lua
+ ["File '%s' no longer exists."] = "文档 '%s' 已不存在", -- src\editor\menu_file.lua, src\editor\editor.lua
+ ["File already exists."] = nil, -- src\editor\commands.lua
+ ["File history"] = "文档历史", -- src\editor\menu_file.lua
+ ["Find &In Files"] = "在文档中查找", -- src\editor\menu_search.lua
+ ["Find &Next"] = "查找下一个", -- src\editor\menu_search.lua
+ ["Find &Previous"] = "查找上一个", -- src\editor\menu_search.lua
+ ["Find and insert library function"] = nil, -- src\editor\menu_search.lua
+ ["Find and replace text in files"] = "在文档中查找text然后更换", -- src\editor\menu_search.lua
+ ["Find and replace text"] = "查找text然后更换", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find in files"] = "在文档中查找", -- src\editor\toolbar.lua
+ ["Find text in files"] = "在文档中查找text", -- src\editor\menu_search.lua
+ ["Find text"] = "查找text", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find the earlier text occurence"] = "查找之前出现的text", -- src\editor\menu_search.lua
+ ["Find the next text occurrence"] = "查找之後将出现的text", -- src\editor\menu_search.lua
+ ["Find"] = "查找", -- src\editor\toolbar.lua
+ ["Fold or unfold all code folds"] = "折叠/展开所有代码折叠", -- src\editor\menu_edit.lua
+ ["Formatting page %d..."] = nil, -- src\editor\print.lua
+ ["Found %d instance."] = {}, -- src\editor\findreplace.lua
+ ["Found auto-recovery record and restored saved session."] = "找到自动恢复存档和恢复已存对话", -- src\editor\commands.lua
+ ["Full &Screen"] = "全屏", -- src\editor\menu_view.lua
+ ["Go To Definition"] = nil, -- src\editor\editor.lua
+ ["Go To File..."] = nil, -- src\editor\menu_search.lua
+ ["Go To Line..."] = "到...行", -- src\editor\menu_search.lua
+ ["Go To Next Bookmark"] = nil, -- src\editor\menu_edit.lua
+ ["Go To Next Breakpoint"] = nil, -- src\editor\menu_project.lua
+ ["Go To Previous Bookmark"] = nil, -- src\editor\menu_edit.lua
+ ["Go To Previous Breakpoint"] = nil, -- src\editor\menu_project.lua
+ ["Go To Symbol..."] = nil, -- src\editor\menu_search.lua
+ ["Go to file"] = nil, -- src\editor\menu_search.lua
+ ["Go to line"] = "到...行", -- src\editor\menu_search.lua
+ ["Go to symbol"] = nil, -- src\editor\menu_search.lua
+ ["Hide '.%s' Files"] = nil, -- src\editor\filetree.lua
+ ["INS"] = "INS", -- src\editor\editor.lua
+ ["Ignore and don't index symbols from files in the selected directory"] = nil, -- src\editor\outline.lua
+ ["Ignored error in debugger initialization code: %s."] = nil, -- src\editor\debugger.lua
+ ["Indexing %d files: '%s'..."] = nil, -- src\editor\outline.lua
+ ["Indexing completed."] = nil, -- src\editor\outline.lua
+ ["Insert Library Function..."] = nil, -- src\editor\menu_search.lua
+ ["Known Files"] = "所知的文档", -- src\editor\commands.lua
+ ["Ln: %d"] = "行: %d", -- src\editor\editor.lua
+ ["Local console"] = "本地主控台", -- src\editor\gui.lua, src\editor\shellbox.lua
+ ["Lua &Interpreter"] = "Lua 解释器", -- src\editor\menu_project.lua
+ ["Map Directory..."] = nil, -- src\editor\filetree.lua
+ ["Mapped remote request for '%s' to '%s'."] = "映射远程请求 '%s' 至 '%s'", -- src\editor\debugger.lua
+ ["Markers Window"] = nil, -- src\editor\menu_view.lua
+ ["Markers"] = nil, -- src\editor\markers.lua
+ ["Match case"] = "case匹配", -- src\editor\toolbar.lua
+ ["Match whole word"] = "全句匹配", -- src\editor\toolbar.lua
+ ["Mixed end-of-line encodings detected."] = "发现混杂的EOL编码", -- src\editor\commands.lua
+ ["Navigate"] = nil, -- src\editor\menu_search.lua
+ ["New &File"] = nil, -- src\editor\filetree.lua
+ ["OVR"] = "OVR", -- src\editor\editor.lua
+ ["Open With Default Program"] = nil, -- src\editor\filetree.lua
+ ["Open an existing document"] = "打开现存文档", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Open file"] = "打开文档", -- src\editor\commands.lua
+ ["Outline Window"] = nil, -- src\editor\menu_view.lua
+ ["Outline"] = nil, -- src\editor\outline.lua
+ ["Output (running)"] = "输出 (进行中)", -- src\editor\debugger.lua, src\editor\output.lua
+ ["Output (suspended)"] = nil, -- src\editor\debugger.lua
+ ["Output"] = "输出", -- src\editor\debugger.lua, src\editor\output.lua, src\editor\gui.lua, src\editor\settings.lua
+ ["Page Setup..."] = nil, -- src\editor\print.lua
+ ["Paste text from the clipboard"] = "从clipboard粘贴text", -- src\editor\menu_edit.lua
+ ["Preferences"] = "首选项", -- src\editor\menu_edit.lua
+ ["Prepend '!' to force local execution."] = nil, -- src\editor\shellbox.lua
+ ["Prepend '=' to show complex values on multiple lines."] = "在多行展现复杂值请前置 '='", -- src\editor\shellbox.lua
+ ["Press cancel to abort."] = "按 <cancel> 以退出", -- src\editor\commands.lua
+ ["Print the current document"] = nil, -- src\editor\print.lua
+ ["Program '%s' started in '%s' (pid: %d)."] = "程式 '%s' 执行于 '%s' (pid: %d).", -- src\editor\output.lua
+ ["Program can't start because conflicting process is running as '%s'."] = "程序不能启动因为有名为 '%s' 的冲突进程", -- src\editor\output.lua
+ ["Program completed in %.2f seconds (pid: %d)."] = "程序于 %.2f 秒完成 (pid: %d).", -- src\editor\output.lua
+ ["Program starting as '%s'."] = "程式以 '%s' 执行", -- src\editor\output.lua
+ ["Program stopped (pid: %d)."] = "程式停止 (pid: %d).", -- src\editor\debugger.lua
+ ["Program unable to run as '%s'."] = "程式不能以 '%s' 执行", -- src\editor\output.lua
+ ["Project Directory"] = "项目文件夹", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Project history"] = nil, -- src\editor\menu_file.lua
+ ["Project"] = "项目", -- src\editor\filetree.lua
+ ["Project/&FileTree Window"] = "项目/文档树 视窗", -- src\editor\menu_view.lua
+ ["Provide command line parameters"] = nil, -- src\editor\menu_project.lua
+ ["Queued %d files to index."] = nil, -- src\editor\menu_search.lua
+ ["R/O"] = "唯读", -- src\editor\editor.lua
+ ["R/W"] = "读写", -- src\editor\editor.lua
+ ["Re&place In Files"] = "在文档中替换", -- src\editor\menu_search.lua
+ ["Re-indent selected lines"] = nil, -- src\editor\menu_edit.lua
+ ["Reached end of selection and wrapped around."] = nil, -- src\editor\findreplace.lua
+ ["Reached end of text and wrapped around."] = nil, -- src\editor\findreplace.lua
+ ["Recent Files"] = "最近的文档", -- src\editor\menu_file.lua
+ ["Recent Projects"] = nil, -- src\editor\menu_file.lua
+ ["Redo last edit undone"] = "重做最后被取消的编辑", -- src\editor\menu_edit.lua
+ ["Refresh Index"] = nil, -- src\editor\outline.lua
+ ["Refresh indexed symbols from files in the selected directory"] = nil, -- src\editor\outline.lua
+ ["Refresh"] = "刷新", -- src\editor\filetree.lua
+ ["Refused a request to start a new debugging session as there is one in progress already."] = "因为有另一个除错在进行,拒绝开启新的除错对话", -- src\editor\debugger.lua
+ ["Regular expression"] = "正则表达式", -- src\editor\toolbar.lua
+ ["Remote console"] = "远程主控台", -- src\editor\shellbox.lua
+ ["Rename All Instances"] = nil, -- src\editor\editor.lua
+ ["Replace All Selections"] = nil, -- src\editor\editor.lua
+ ["Replace all"] = "更换全部", -- src\editor\toolbar.lua
+ ["Replace next instance"] = nil, -- src\editor\toolbar.lua
+ ["Replaced %d instance."] = {}, -- src\editor\findreplace.lua
+ ["Replaced an invalid UTF8 character with %s."] = "以%s更换无效的UTF8字元", -- src\editor\commands.lua
+ ["Reset to default layout"] = "重置缺省布局", -- src\editor\menu_view.lua
+ ["Run As Scratchpad"] = "以Scratchpad执行", -- src\editor\menu_project.lua
+ ["Run To Cursor"] = nil, -- src\editor\menu_project.lua, src\editor\editor.lua
+ ["Run as Scratchpad"] = "以Scratchpad执行", -- src\editor\toolbar.lua
+ ["Run to cursor"] = nil, -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["S&top Debugging"] = "停止除错", -- src\editor\menu_project.lua
+ ["S&top Process"] = "停止进程", -- src\editor\menu_project.lua
+ ["Save &As..."] = "另存为...", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["Save A&ll"] = "全部存档", -- src\editor\menu_file.lua
+ ["Save Changes?"] = "存档更新?", -- src\editor\commands.lua
+ ["Save all open documents"] = "保存所有开启的文档", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Save file as"] = "文档另存为", -- src\editor\commands.lua
+ ["Save file?"] = "保存文档?", -- src\editor\commands.lua
+ ["Save the current document to a file with a new name"] = "用新档案名称保存当前文档", -- src\editor\menu_file.lua
+ ["Save the current document"] = "保存当前文档", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Saved auto-recover at %s."] = "在 %s 存档自动恢复", -- src\editor\commands.lua
+ ["Scratchpad error"] = "暂存器错误", -- src\editor\debugger.lua
+ ["Search direction"] = nil, -- src\editor\toolbar.lua
+ ["Search in selection"] = nil, -- src\editor\toolbar.lua
+ ["Search in subdirectories"] = nil, -- src\editor\toolbar.lua
+ ["Searching for '%s'."] = nil, -- src\editor\findreplace.lua
+ ["Sel: %d/%d"] = nil, -- src\editor\editor.lua
+ ["Select &All"] = "选全部", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Select And Find Next"] = nil, -- src\editor\menu_search.lua
+ ["Select And Find Previous"] = nil, -- src\editor\menu_search.lua
+ ["Select all text in the editor"] = "选编辑器内的所有text", -- src\editor\menu_edit.lua
+ ["Select the word under cursor and find its next occurrence"] = nil, -- src\editor\menu_search.lua
+ ["Select the word under cursor and find its previous occurrence"] = nil, -- src\editor\menu_search.lua
+ ["Set As Start File"] = nil, -- src\editor\filetree.lua
+ ["Set From Current File"] = "从当前文档设置", -- src\editor\menu_project.lua
+ ["Set To Project Directory"] = nil, -- src\editor\findreplace.lua
+ ["Set To Selected Directory"] = nil, -- src\editor\filetree.lua
+ ["Set project directory from current file"] = "从当前文档设置项目文件夹", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Set project directory to the selected one"] = nil, -- src\editor\filetree.lua
+ ["Set search directory"] = nil, -- src\editor\toolbar.lua
+ ["Set the interpreter to be used"] = "设置解释器", -- src\editor\menu_project.lua
+ ["Set the project directory to be used"] = "设置项目文件夹", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Settings: System"] = "设置: 系统", -- src\editor\menu_edit.lua
+ ["Settings: User"] = "设置: 用户", -- src\editor\menu_edit.lua
+ ["Show &Tooltip"] = "展现tooltip", -- src\editor\menu_edit.lua
+ ["Show All Files"] = nil, -- src\editor\filetree.lua
+ ["Show Hidden Files"] = nil, -- src\editor\filetree.lua
+ ["Show Location"] = nil, -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Show all files"] = nil, -- src\editor\filetree.lua
+ ["Show context"] = nil, -- src\editor\toolbar.lua
+ ["Show files previously hidden"] = nil, -- src\editor\filetree.lua
+ ["Show multiple result windows"] = nil, -- src\editor\toolbar.lua
+ ["Show tooltip for current position; place cursor after opening bracket of function"] = "在当前的位置展现tooltip; 把游标放置于函数的开括号之后", -- src\editor\menu_edit.lua
+ ["Show/Hide the status bar"] = nil, -- src\editor\menu_view.lua
+ ["Show/Hide the toolbar"] = nil, -- src\editor\menu_view.lua
+ ["Sort By Name"] = nil, -- src\editor\outline.lua
+ ["Sort selected lines"] = "对被选的行进行排列", -- src\editor\menu_edit.lua
+ ["Source"] = nil, -- src\editor\menu_edit.lua
+ ["Stack"] = "堆栈", -- src\editor\debugger.lua
+ ["Start &Debugging"] = "开始除错", -- src\editor\menu_project.lua
+ ["Start or continue debugging"] = nil, -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step &Into"] = "除错运行 进入子程序/函数", -- src\editor\menu_project.lua
+ ["Step &Over"] = "除错运行 掠过子程序/函数", -- src\editor\menu_project.lua
+ ["Step O&ut"] = "除错运行 离开子程序/函数", -- src\editor\menu_project.lua
+ ["Step into"] = "除错运行 进入子程序/函数", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step out of the current function"] = "除错运行 离开当前的函数", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step over"] = "除错运行 掠过子程序/函数", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop debugging and continue running the process"] = nil, -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop the currently running process"] = "终止目前进行着的进程", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Switch to or from full screen mode"] = "切换全屏模式", -- src\editor\menu_view.lua
+ ["Symbol Index"] = nil, -- src\editor\outline.lua
+ ["Text not found."] = "寻找不到text", -- src\editor\findreplace.lua
+ ["The API file must be located in a subdirectory of the API directory."] = "API file必须存放在API文件夹中的子文件夹", -- src\editor\autocomplete.lua
+ ["Toggle Bookmark"] = nil, -- src\editor\markers.lua, src\editor\menu_edit.lua
+ ["Toggle Breakpoint"] = "切换中断点", -- src\editor\markers.lua, src\editor\menu_project.lua
+ ["Toggle bookmark"] = nil, -- src\editor\toolbar.lua, src\editor\menu_edit.lua, src\editor\markers.lua
+ ["Toggle breakpoint"] = "切换中断点", -- src\editor\markers.lua, src\editor\toolbar.lua
+ ["Tr&ace"] = "追踪", -- src\editor\menu_project.lua
+ ["Trace execution showing each executed line"] = "执行追踪展示每一执行过的语句", -- src\editor\menu_project.lua
+ ["Unable to create directory '%s'."] = nil, -- src\editor\filetree.lua
+ ["Unable to create file '%s'."] = nil, -- src\editor\filetree.lua
+ ["Unable to delete directory '%s': %s"] = nil, -- src\editor\filetree.lua
+ ["Unable to delete file '%s': %s"] = nil, -- src\editor\filetree.lua
+ ["Unable to load file '%s'."] = "导出文件失败 '%s'.", -- src\editor\commands.lua
+ ["Unable to rename file '%s'."] = nil, -- src\editor\filetree.lua
+ ["Unable to save file '%s': %s"] = "保存文件失败 '%s': %s", -- src\editor\commands.lua
+ ["Unable to stop program (pid: %d), code %d."] = "停止程序失败 (pid: %d), 代码 %d.", -- src\editor\debugger.lua
+ ["Undo last edit"] = "清除前编辑动作", -- src\editor\menu_edit.lua
+ ["Unmap Directory"] = nil, -- src\editor\filetree.lua
+ ["Unset '%s' As Start File"] = nil, -- src\editor\filetree.lua
+ ["Updated %d file."] = {}, -- src\editor\findreplace.lua
+ ["Updating symbol index and settings..."] = nil, -- src\editor\outline.lua
+ ["Use %s to close."] = nil, -- src\editor\findreplace.lua
+ ["Use '%s' to see full description."] = "用 '%s' 来看全解析", -- src\editor\editor.lua
+ ["Use '%s' to show line endings and '%s' to convert them."] = "用 '%s' 来显示语句的终结和 '%s' 来进行转换", -- src\editor\commands.lua
+ ["Use 'clear' to clear the shell output and the history."] = "用 'clear' 来清除shell的输出和历史", -- src\editor\shellbox.lua
+ ["Use Shift-Enter for multiline code."] = "用 <Shift-Enter> 来处理多行代码", -- src\editor\shellbox.lua
+ ["View the markers window"] = nil, -- src\editor\menu_view.lua
+ ["View the outline window"] = nil, -- src\editor\menu_view.lua
+ ["View the output/console window"] = "查看输出/主控台视窗", -- src\editor\menu_view.lua
+ ["View the project/filetree window"] = "查看项目/文件树视窗", -- src\editor\menu_view.lua
+ ["View the stack window"] = "查看堆栈视窗", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["View the watch window"] = "查看监视视窗", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["Watch"] = "监视", -- src\editor\debugger.lua
+ ["Welcome to the interactive Lua interpreter."] = "欢迎来到互动 Lua interpreter.", -- src\editor\shellbox.lua
+ ["Wrap around"] = "卷绕", -- src\editor\toolbar.lua
+ ["You must save the program first."] = "必须先保存程序", -- src\editor\commands.lua
+ ["Zoom In"] = nil, -- src\editor\menu_view.lua
+ ["Zoom Out"] = nil, -- src\editor\menu_view.lua
+ ["Zoom to 100%"] = nil, -- src\editor\menu_view.lua
+ ["Zoom"] = nil, -- src\editor\menu_view.lua
+ ["on line %d"] = "在 %d 行", -- src\editor\debugger.lua, src\editor\editor.lua, src\editor\commands.lua
+ ["traced %d instruction"] = "追踪 %d 指令", -- src\editor\debugger.lua
+ ["unknown error"] = nil, -- src\editor\debugger.lua
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/de.lua b/love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/de.lua
new file mode 100644
index 0000000..0705078
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/de.lua
@@ -0,0 +1,345 @@
+return {
+ [0] = function(c) return c == 1 and 1 or 2 end, -- plural
+ ["%s event failed: %s"] = "Ereignis fehlgeschlagen : %s", -- src\editor\package.lua
+ ["%s%% formatted..."] = nil, -- src\editor\print.lua
+ ["%s%% loaded..."] = "%s%% geladen...", -- src\editor\commands.lua
+ ["&About"] = "&Über", -- src\editor\menu_help.lua
+ ["&Add Watch"] = "&Beobachtungspunkt hinzufügen", -- src\editor\debugger.lua
+ ["&Break"] = "&Unterbrechung", -- src\editor\menu_project.lua
+ ["&Close Page"] = "S&eite schließen", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Community"] = "&Community", -- src\editor\menu_help.lua
+ ["&Compile"] = "&Compiler", -- src\editor\menu_project.lua
+ ["&Copy Value"] = "Wert kopieren", -- src\editor\debugger.lua
+ ["&Copy"] = "&Kopieren", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Default Layout"] = "Standard-&Layout", -- src\editor\menu_view.lua
+ ["&Delete Watch"] = "&Beobachtungspunkt entfernen", -- src\editor\debugger.lua
+ ["&Delete"] = "&Entfernen", -- src\editor\filetree.lua
+ ["&Documentation"] = "&Dokumentation", -- src\editor\menu_help.lua
+ ["&Edit Project Directory"] = "Projektverzeichnis ändern", -- src\editor\filetree.lua
+ ["&Edit Value"] = "Wert editieren", -- src\editor\debugger.lua
+ ["&Edit Watch"] = "&Beobachtungspunkt bearbeiten", -- src\editor\debugger.lua
+ ["&Edit"] = "&Bearbeiten", -- src\editor\menu_edit.lua
+ ["&File"] = "&Datei", -- src\editor\menu_file.lua
+ ["&Find"] = "&Finden", -- src\editor\menu_search.lua
+ ["&Fold/Unfold All"] = "A&lles ein-/ausklappen", -- src\editor\menu_edit.lua
+ ["&Frequently Asked Questions"] = "&FAQ", -- src\editor\menu_help.lua
+ ["&Getting Started Guide"] = "&Anfängerleitfaden", -- src\editor\menu_help.lua
+ ["&Help"] = "&Hilfe", -- src\editor\menu_help.lua
+ ["&New Directory"] = "&Neuer Ordner", -- src\editor\filetree.lua
+ ["&New"] = "&Neu", -- src\editor\menu_file.lua
+ ["&Open..."] = "&Öffnen...", -- src\editor\menu_file.lua
+ ["&Output/Console Window"] = "&Ausgabefenster/Konsole", -- src\editor\menu_view.lua
+ ["&Paste"] = "&Einfügen", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Print..."] = nil, -- src\editor\print.lua
+ ["&Project Page"] = "&Projektseite", -- src\editor\menu_help.lua
+ ["&Project"] = "&Projekt", -- src\editor\menu_project.lua
+ ["&Redo"] = "&Wiederholen", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Rename"] = "&Umbenennen", -- src\editor\filetree.lua
+ ["&Replace"] = "&Ersetzen", -- src\editor\menu_search.lua
+ ["&Run"] = "&Starten", -- src\editor\menu_project.lua
+ ["&Save"] = "&Speichern", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Search"] = "&Suchen", -- src\editor\menu_search.lua
+ ["&Select Command"] = nil, -- src\editor\gui.lua
+ ["&Sort"] = "&Sortieren", -- src\editor\menu_edit.lua
+ ["&Stack Window"] = "&Stapel/Stack", -- src\editor\menu_view.lua
+ ["&Start Debugger Server"] = "De&bugserver starten", -- src\editor\menu_project.lua
+ ["&Status Bar"] = "S&tatuszeile", -- src\editor\menu_view.lua
+ ["&Tool Bar"] = "&Werkzeugleiste", -- src\editor\menu_view.lua
+ ["&Tutorials"] = "&Tutorien", -- src\editor\menu_help.lua
+ ["&Undo"] = "&Rückgängig", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&View"] = "&Ansicht", -- src\editor\menu_view.lua
+ ["&Watch Window"] = "&Beobachtungspunkte", -- src\editor\menu_view.lua
+ ["About %s"] = "Über %s", -- src\editor\menu_help.lua
+ ["Add To Scratchpad"] = "Zu Entwurf hinzufügen", -- src\editor\editor.lua
+ ["Add Watch Expression"] = "Beobachtungspunkt hinzufügen", -- src\editor\editor.lua
+ ["All files"] = "Alle Dateien", -- src\editor\commands.lua
+ ["Allow external process to start debugging"] = "Externem Prozeß erlauben, den Debugger zu starten", -- src\editor\menu_project.lua
+ ["Analyze the source code"] = "Quellcode analysieren", -- src\editor\inspect.lua
+ ["Analyze"] = "&Analyseroutine", -- src\editor\inspect.lua
+ ["Auto Complete Identifiers"] = "Auto-Vervollständigen von Bezeichnern", -- src\editor\menu_edit.lua
+ ["Auto complete while typing"] = "Auto-Vervollständigen beim Tippen", -- src\editor\menu_edit.lua
+ ["Binary file is shown as read-only as it is only partially loaded."] = "Binärdatei ist als schreibgeschützt angezeigt, da sie nur teilweise geladen wurde.", -- src\editor\commands.lua
+ ["Bookmark"] = "Lese&zeichen", -- src\editor\menu_edit.lua
+ ["Break execution at the next executed line of code"] = "Programmausführung bei der nächsten ausgeführten Zeile stoppen", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Breakpoint"] = nil, -- src\editor\menu_project.lua
+ ["C&lear Console Window"] = nil, -- src\editor\gui.lua
+ ["C&lear Output Window"] = "Ausgabefenster l&öschen", -- src\editor\gui.lua, src\editor\menu_project.lua
+ ["C&omment/Uncomment"] = "(Aus-)/K&ommentieren", -- src\editor\menu_edit.lua
+ ["Can't evaluate the expression while the application is running."] = "Kann den Ausdruck nicht auswerten solange die Anwendung läuft.", -- src\editor\debugger.lua
+ ["Can't open file '%s': %s"] = "Kann Datei '%s' nicht öffnen: %s", -- src\editor\findreplace.lua, src\editor\singleinstance.lua, src\editor\inspect.lua, src\editor\outline.lua
+ ["Can't process auto-recovery record; invalid format: %s."] = "Auto-Wiederherstellen nicht möglich; ungültiges Format: %s.", -- src\editor\commands.lua
+ ["Can't replace in read-only text."] = "Ersetzen in schreibgeschütztem Text nicht möglich.", -- src\editor\findreplace.lua
+ ["Can't run the entry point script ('%s')."] = "Kann Script für Einsprungspunkt ('%s') nicht ausführen.", -- src\editor\debugger.lua
+ ["Can't start debugger server at %s:%d: %s."] = "Kann Debugserver nicht starten (%s:%d): %s.", -- src\editor\debugger.lua
+ ["Can't start debugging for '%s'."] = "Kann Debuggen nicht starten für '%s'.", -- src\editor\debugger.lua
+ ["Can't start debugging session due to internal error '%s'."] = "Debugging kann nicht gestartet werden wegen internem Fehler '%s'.", -- src\editor\debugger.lua
+ ["Can't start debugging without an opened file or with the current file not being saved ('%s')."] = "Debugging kann ohne geöffnete Datei nicht gestartet werden oder wenn die aktuelle Datei nicht gespeichert ist ('%s').", -- src\editor\debugger.lua
+ ["Can't stop debugger server as it is not started."] = "Kann Debugserver nicht stoppen wenn er vorher nicht gestartet wurde.", -- src\editor\debugger.lua
+ ["Cancelled by the user."] = "Durch Benutzer abgebrochen.", -- src\editor\findreplace.lua
+ ["Choose a directory to map"] = "Bitte Verzeichnis wählen zum virtuellen Einbinden", -- src\editor\filetree.lua
+ ["Choose a project directory"] = "Projektverzeichnis auswählen", -- src\editor\toolbar.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Choose a search directory"] = "Bitte Verzeichnis zum Durchsuchen auswählen.", -- src\editor\findreplace.lua
+ ["Choose..."] = "Wählen...", -- src\editor\findreplace.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Clear Items"] = "Liste &löschen", -- src\editor\findreplace.lua, src\editor\menu_file.lua
+ ["Clear items from this list"] = "Diese Liste löschen", -- src\editor\menu_file.lua
+ ["Clear the output window before compiling or debugging"] = "Vor Kompilieren oder Debuggen das Ausgabefenster löschen", -- src\editor\menu_project.lua
+ ["Close &Other Pages"] = "A&ndere Seiten schließen", -- src\editor\gui.lua
+ ["Close A&ll Pages"] = "&Alle Seiten schließen", -- src\editor\gui.lua
+ ["Close the current editor window"] = "Aktuelles Editorfenster schließen", -- src\editor\menu_file.lua
+ ["Co&ntinue"] = "&Fortsetzen", -- src\editor\menu_project.lua
+ ["Col: %d"] = "Spalte: %d", -- src\editor\editor.lua
+ ["Command Line Parameters..."] = "Kommandozeilenparameter...", -- src\editor\menu_project.lua
+ ["Command line parameters"] = "Kommandozeilenparameter", -- src\editor\menu_project.lua
+ ["Comment or uncomment current or selected lines"] = "Ausgewählte bzw. aktive Zeile (un-)kommentieren", -- src\editor\menu_edit.lua
+ ["Compilation error"] = "Fehler beim Kompilieren", -- src\editor\commands.lua, src\editor\debugger.lua
+ ["Compilation successful; %.0f%% success rate (%d/%d)."] = "Kompilieren erfolgreich; Erfolgsquote von %.0f%% (%d/%d).", -- src\editor\commands.lua
+ ["Compile the current file"] = "Aktuelle Datei kompilieren", -- src\editor\menu_project.lua
+ ["Complete &Identifier"] = "&Bezeichner vervollständigen", -- src\editor\menu_edit.lua
+ ["Complete the current identifier"] = " Aktuellen Bezeichner vervollständigen", -- src\editor\menu_edit.lua
+ ["Consider removing backslash from escape sequence '%s'."] = "Möglicherweise muß `\' aus '%s' entfernt werden.", -- src\editor\commands.lua
+ ["Copy Full Path"] = "Kopiere Pfadangabe", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Copy selected text to clipboard"] = "Text in Zwischenablage kopieren", -- src\editor\menu_edit.lua
+ ["Correct &Indentation"] = "E&inzug korrigieren", -- src\editor\menu_edit.lua
+ ["Couldn't activate file '%s' for debugging; continuing without it."] = "Konnte Datei '%s' zwecks nicht Debugging aktivieren; fahre ohne die Datei fort.", -- src\editor\debugger.lua
+ ["Create an empty document"] = "Leeres Dokument anlegen", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Cu&t"] = "A&usschneiden", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Cut selected text to clipboard"] = "Schneide ausgewählten Text in die Zwischenablage hinein", -- src\editor\menu_edit.lua
+ ["Debugger server started at %s:%d."] = "Debugserver gestartet als %s:%d.", -- src\editor\debugger.lua
+ ["Debugger server stopped at %s:%d."] = "Debugserver gestoppt als %s:%d.", -- src\editor\debugger.lua
+ ["Debugging session completed (%s)."] = "Debugging Session beendet (%s).", -- src\editor\debugger.lua
+ ["Debugging session started in '%s'."] = "Debugging Session gestartet '%s'.", -- src\editor\debugger.lua
+ ["Debugging suspended at '%s:%s' (couldn't activate the file)."] = "Debugging angehalten bei '%s:%s' (konnte Datei nicht aktivieren).", -- src\editor\debugger.lua
+ ["Detach &Process"] = "Prozeß abkoppeln", -- src\editor\menu_project.lua
+ ["Disable Indexing For '%s'"] = "Indizieren ausschalten für '%s'", -- src\editor\outline.lua
+ ["Do you want to delete '%s'?"] = "Soll '%s' gelöscht werden?", -- src\editor\filetree.lua
+ ["Do you want to overwrite it?"] = "Überschreiben?", -- src\editor\commands.lua
+ ["Do you want to reload it?"] = "Neu laden?", -- src\editor\editor.lua
+ ["Do you want to save the changes to '%s'?"] = "Änderungen an '%s' speichern?", -- src\editor\commands.lua
+ ["E&xit"] = "&Beenden", -- src\editor\menu_file.lua
+ ["Enable Indexing"] = "Indizieren aktivieren", -- src\editor\outline.lua
+ ["Enter Lua code and press Enter to run it."] = "Lua-Code eingeben und Enter drücken zum Ausführen.", -- src\editor\shellbox.lua
+ ["Enter command line parameters (use Cancel to clear)"] = "Kommandozeilenparameter eingeben (Cancel zum löschen)", -- src\editor\menu_project.lua
+ ["Enter replacement text"] = "Neuen Text eingeben", -- src\editor\editor.lua
+ ["Error while loading API file: %s"] = "Fehler beim Laden von API-Datei: %s", -- src\editor\autocomplete.lua
+ ["Error while loading configuration file: %s"] = "Fehler beim Laden von Konfigurationsdatei: %s", -- src\editor\style.lua
+ ["Error while processing API file: %s"] = "Fehler beim Lesen von API-Datei: %s", -- src\editor\autocomplete.lua
+ ["Error while processing configuration file: %s"] = "Fehler beim Lesen von Konfiguratonsdatei: %s", -- src\editor\style.lua
+ ["Error"] = "Fehler", -- src\editor\commands.lua
+ ["Evaluate In Console"] = "In Konsole auswerten", -- src\editor\editor.lua
+ ["Execute the current project/file and keep updating the code to see immediate results"] = "Aktuelles Projekt/ aktuelle Datei ausführen und Quellcode ändern, um Ergebnisse in Echtzeit zu sehen", -- src\editor\menu_project.lua
+ ["Execute the current project/file"] = "Aktuelles Projekt/ aktuelle Datei ausführen", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Execution error"] = "Fehler bei Ausführung", -- src\editor\debugger.lua
+ ["Exit program"] = "Programm beenden", -- src\editor\menu_file.lua
+ ["File '%s' has been modified on disk."] = "Datei '%s' wurde auf der Festplatte geändert.", -- src\editor\editor.lua
+ ["File '%s' has more recent timestamp than restored '%s'; please review before saving."] = "Datei '%s' hat neueren Zeitstempel als wiederhergestellte Datei '%s'; bitte vor dem Speichern kontrollieren.", -- src\editor\commands.lua
+ ["File '%s' is missing and can't be recovered."] = "Datei '%s' fehlt und kann nicht wiederhergestellt werden.", -- src\editor\commands.lua
+ ["File '%s' no longer exists."] = "Datei '%s' existiert nicht mehr.", -- src\editor\menu_file.lua, src\editor\editor.lua
+ ["File already exists."] = "Datei existiert bereits.", -- src\editor\commands.lua
+ ["File history"] = "Dateiverlauf", -- src\editor\menu_file.lua
+ ["Find &In Files"] = "Finde &in Dateien", -- src\editor\menu_search.lua
+ ["Find &Next"] = "Finde &Nächste", -- src\editor\menu_search.lua
+ ["Find &Previous"] = "Finde &Vorherige", -- src\editor\menu_search.lua
+ ["Find and insert library function"] = "Suchen und Einfügen von Funktion aus Bibliothek", -- src\editor\menu_search.lua
+ ["Find and replace text in files"] = "Finde und ersetze Text in Dateien", -- src\editor\menu_search.lua
+ ["Find and replace text"] = "Finde und ersetze Text", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find in files"] = "Finde in dateien", -- src\editor\toolbar.lua
+ ["Find text in files"] = "Finde Text in Dateien", -- src\editor\menu_search.lua
+ ["Find text"] = "Finde Text", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find the earlier text occurence"] = "Finde vorheriges Auftreten des Textes", -- src\editor\menu_search.lua
+ ["Find the next text occurrence"] = "Finde nächstes Auftreten des Textes", -- src\editor\menu_search.lua
+ ["Find"] = "Finden", -- src\editor\toolbar.lua
+ ["Fold or unfold all code folds"] = "Alle Stellen im Code ein-/ausklappen ", -- src\editor\menu_edit.lua
+ ["Formatting page %d..."] = nil, -- src\editor\print.lua
+ ["Found %d instance."] = {"Eine Instanz gefunden", "%d Instanzen gefunden."}, -- src\editor\findreplace.lua
+ ["Found auto-recovery record and restored saved session."] = "Autowiederherstellen-Aufzeichnung gefunden und vorherige Sitzung wiederhergestellt.", -- src\editor\commands.lua
+ ["Full &Screen"] = "&Vollbild", -- src\editor\menu_view.lua
+ ["Go To Definition"] = "Gehe zu Definition", -- src\editor\editor.lua
+ ["Go To File..."] = "Gehe zu Datei...", -- src\editor\menu_search.lua
+ ["Go To Line..."] = "Gehe zu Zeile...", -- src\editor\menu_search.lua
+ ["Go To Next Bookmark"] = "Zu nächstem Lesezeichen", -- src\editor\menu_edit.lua
+ ["Go To Next Breakpoint"] = nil, -- src\editor\menu_project.lua
+ ["Go To Previous Bookmark"] = "Zu vorherigem Lesezeichen", -- src\editor\menu_edit.lua
+ ["Go To Previous Breakpoint"] = nil, -- src\editor\menu_project.lua
+ ["Go To Symbol..."] = "Gehe zu Symbol...", -- src\editor\menu_search.lua
+ ["Go to file"] = "Gehe zu Datei", -- src\editor\menu_search.lua
+ ["Go to line"] = "Gehe zu Zeile", -- src\editor\menu_search.lua
+ ["Go to symbol"] = "Gehe zu Symbol", -- src\editor\menu_search.lua
+ ["Hide '.%s' Files"] = "Verstecke '.%s' Dateien", -- src\editor\filetree.lua
+ ["INS"] = "INS", -- src\editor\editor.lua
+ ["Ignore and don't index symbols from files in the selected directory"] = "Dateien im ausgewählten Verzeichnis ignorieren und keine Symbole indizieren.", -- src\editor\outline.lua
+ ["Ignored error in debugger initialization code: %s."] = "Ignorierter Fehler im Debugger-Init-Code: %s.", -- src\editor\debugger.lua
+ ["Indexing %d files: '%s'..."] = "%d Dateien indizieren: '%s'...", -- src\editor\outline.lua
+ ["Indexing completed."] = "Indizierung abgeschlossen.", -- src\editor\outline.lua
+ ["Insert Library Function..."] = "Füge Funktion aus Bibliothek ein", -- src\editor\menu_search.lua
+ ["Known Files"] = "Bekannte Dateien", -- src\editor\commands.lua
+ ["Ln: %d"] = "Zeile: %d", -- src\editor\editor.lua
+ ["Local console"] = "Lokale Konsole", -- src\editor\gui.lua, src\editor\shellbox.lua
+ ["Lua &Interpreter"] = "&Lua Interpreter", -- src\editor\menu_project.lua
+ ["Map Directory..."] = "Verzeichnis virtuell einbinden...", -- src\editor\filetree.lua
+ ["Mapped remote request for '%s' to '%s'."] = "Fern-Aufforderung für '%s' auf '%s' abgebildet.", -- src\editor\debugger.lua
+ ["Markers Window"] = nil, -- src\editor\menu_view.lua
+ ["Markers"] = nil, -- src\editor\markers.lua
+ ["Match case"] = "Groß-/Kleinschreibung", -- src\editor\toolbar.lua
+ ["Match whole word"] = "Ganzes Wort", -- src\editor\toolbar.lua
+ ["Mixed end-of-line encodings detected."] = "Gemischte End-of-Line Kodierung entdeckt.", -- src\editor\commands.lua
+ ["Navigate"] = "Navigieren", -- src\editor\menu_search.lua
+ ["New &File"] = "Neue &Datei", -- src\editor\filetree.lua
+ ["OVR"] = "OVR", -- src\editor\editor.lua
+ ["Open With Default Program"] = "Mit Standardanwendung öffnen", -- src\editor\filetree.lua
+ ["Open an existing document"] = "Öffne existierendes Dokument", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Open file"] = "Öffne Datei", -- src\editor\commands.lua
+ ["Outline Window"] = "Übersichtsfenster", -- src\editor\menu_view.lua
+ ["Outline"] = "Übersicht", -- src\editor\outline.lua
+ ["Output (running)"] = "Ausgabe (ausgeführt)", -- src\editor\debugger.lua, src\editor\output.lua
+ ["Output (suspended)"] = "Ausgabe (angehalten)", -- src\editor\debugger.lua
+ ["Output"] = "Ausgabe", -- src\editor\debugger.lua, src\editor\output.lua, src\editor\gui.lua, src\editor\settings.lua
+ ["Page Setup..."] = nil, -- src\editor\print.lua
+ ["Paste text from the clipboard"] = "Text aus Zwischenablage einfügen", -- src\editor\menu_edit.lua
+ ["Preferences"] = "Einstellungen", -- src\editor\menu_edit.lua
+ ["Prepend '!' to force local execution."] = "'!' voranstellen um lokale Ausführung zu erzwingen.", -- src\editor\shellbox.lua
+ ["Prepend '=' to show complex values on multiple lines."] = "'=' voranstellen, um komplexe Ausdrücke auf mehrere Zeilen zu verteilen.", -- src\editor\shellbox.lua
+ ["Press cancel to abort."] = "Abbrechen Drücken zum Beenden.", -- src\editor\commands.lua
+ ["Print the current document"] = nil, -- src\editor\print.lua
+ ["Program '%s' started in '%s' (pid: %d)."] = "Programm '%s' gestartet in '%s' (pid : %d).", -- src\editor\output.lua
+ ["Program can't start because conflicting process is running as '%s'."] = "Programm kann nicht starten, da blockierender Prozeß als '%s' läuft.", -- src\editor\output.lua
+ ["Program completed in %.2f seconds (pid: %d)."] = "Programm beendet nach %.2f Sekunden (pid : %d).", -- src\editor\output.lua
+ ["Program starting as '%s'."] = "Programm gestartet als '%s'.", -- src\editor\output.lua
+ ["Program stopped (pid: %d)."] = "Programm gestoppt (pid: %d).", -- src\editor\debugger.lua
+ ["Program unable to run as '%s'."] = "Programm kann nicht als '%s' laufen.", -- src\editor\output.lua
+ ["Project Directory"] = "&Projektverzeichnis", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Project history"] = "Liste bisheriger Projekte", -- src\editor\menu_file.lua
+ ["Project"] = "Projekt", -- src\editor\filetree.lua
+ ["Project/&FileTree Window"] = "&Projekt/Datei Fenster", -- src\editor\menu_view.lua
+ ["Provide command line parameters"] = "Kommandozeilenparameter angeben", -- src\editor\menu_project.lua
+ ["Queued %d files to index."] = "%d Dateien zum Indizieren vorgemerkt.", -- src\editor\menu_search.lua
+ ["R/O"] = "R/O", -- src\editor\editor.lua
+ ["R/W"] = "R/W", -- src\editor\editor.lua
+ ["Re&place In Files"] = "Ersetze in &Dateien", -- src\editor\menu_search.lua
+ ["Re-indent selected lines"] = "Ausgewählte Zeilen neu einrücken", -- src\editor\menu_edit.lua
+ ["Reached end of selection and wrapped around."] = nil, -- src\editor\findreplace.lua
+ ["Reached end of text and wrapped around."] = "Ende des Textes erreicht, setze am Beginn fort.", -- src\editor\findreplace.lua
+ ["Recent Files"] = "Letzte Dateien", -- src\editor\menu_file.lua
+ ["Recent Projects"] = "Letzte Projekte", -- src\editor\menu_file.lua
+ ["Redo last edit undone"] = "Stelle letzte rückgängig gemachte Bearbeitung wieder her", -- src\editor\menu_edit.lua
+ ["Refresh Index"] = "Index erneuern", -- src\editor\outline.lua
+ ["Refresh indexed symbols from files in the selected directory"] = "Erneuere indizierte Symbole in Dateien des ausgewählten Verzeichnisses", -- src\editor\outline.lua
+ ["Refresh"] = "Aktualisieren", -- src\editor\filetree.lua
+ ["Refused a request to start a new debugging session as there is one in progress already."] = "Starten einer neuen Debuggingsession abgelehnt, da bereits eine läuft.", -- src\editor\debugger.lua
+ ["Regular expression"] = "Regulärer Ausdruck", -- src\editor\toolbar.lua
+ ["Remote console"] = "Fernsteuerungs-Konsole", -- src\editor\shellbox.lua
+ ["Rename All Instances"] = "Umbenennen aller Instanzen", -- src\editor\editor.lua
+ ["Replace All Selections"] = "Alle Auswahlen ersetzen", -- src\editor\editor.lua
+ ["Replace all"] = "Alles ersetzen", -- src\editor\toolbar.lua
+ ["Replace next instance"] = "Nächste Instanz ersetzen", -- src\editor\toolbar.lua
+ ["Replaced %d instance."] = {"Eine Instanz ersetzt.", "%d Instanzen ersetzt."}, -- src\editor\findreplace.lua
+ ["Replaced an invalid UTF8 character with %s."] = "Unbekanntes UTF8-Symbol ersetzt mit %s.", -- src\editor\commands.lua
+ ["Reset to default layout"] = "Standard-Layout wiederherstellen", -- src\editor\menu_view.lua
+ ["Run As Scratchpad"] = "Als &Entwurf starten", -- src\editor\menu_project.lua
+ ["Run To Cursor"] = "Stoppe Ausführung an Cursorposition", -- src\editor\menu_project.lua, src\editor\editor.lua
+ ["Run as Scratchpad"] = "Als &Entwurf starten", -- src\editor\toolbar.lua
+ ["Run to cursor"] = "Stoppe Ausführung an Cursorposition", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["S&top Debugging"] = "Debugging a&nhalten", -- src\editor\menu_project.lua
+ ["S&top Process"] = "Prozeß &anhalten", -- src\editor\menu_project.lua
+ ["Save &As..."] = "S&peichern als...", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["Save A&ll"] = "&Alle Speichern", -- src\editor\menu_file.lua
+ ["Save Changes?"] = "Änderungen speichern?", -- src\editor\commands.lua
+ ["Save all open documents"] = "Alle offenen Dokumente speichern", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Save file as"] = "Datei speichern als", -- src\editor\commands.lua
+ ["Save file?"] = "Datei speichern?", -- src\editor\commands.lua
+ ["Save the current document to a file with a new name"] = "Aktuelles Dokument unter neuem Namen speichern", -- src\editor\menu_file.lua
+ ["Save the current document"] = "Aktuelles Dokument speichern", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Saved auto-recover at %s."] = "%s Autowiederherstellen gespeichert.", -- src\editor\commands.lua
+ ["Scratchpad error"] = "Fehler im Entwurf", -- src\editor\debugger.lua
+ ["Search direction"] = "Suchrichtung", -- src\editor\toolbar.lua
+ ["Search in selection"] = nil, -- src\editor\toolbar.lua
+ ["Search in subdirectories"] = "Suche in Unterverzeichnissen", -- src\editor\toolbar.lua
+ ["Searching for '%s'."] = "Suche nach '%s'.", -- src\editor\findreplace.lua
+ ["Sel: %d/%d"] = "Ausgew.: %d/%d", -- src\editor\editor.lua
+ ["Select &All"] = "&Alles Auswählen", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Select And Find Next"] = "Auswählen und nächstes finden", -- src\editor\menu_search.lua
+ ["Select And Find Previous"] = "Auswählen und vorheriges finden", -- src\editor\menu_search.lua
+ ["Select all text in the editor"] = "Kompletten Text im Editor auswählen", -- src\editor\menu_edit.lua
+ ["Select the word under cursor and find its next occurrence"] = "Wort unter dem Cursor auswählen und nächstes Auftauchen finden", -- src\editor\menu_search.lua
+ ["Select the word under cursor and find its previous occurrence"] = "Wort unter dem Cursor auswählen und vorheriges Auftauchen finden", -- src\editor\menu_search.lua
+ ["Set As Start File"] = "Als Startdatei definieren.", -- src\editor\filetree.lua
+ ["Set From Current File"] = "Anhand der aktuellen Datei festlegen", -- src\editor\menu_project.lua
+ ["Set To Project Directory"] = "Setze als Projektverzeichnis", -- src\editor\findreplace.lua
+ ["Set To Selected Directory"] = nil, -- src\editor\filetree.lua
+ ["Set project directory from current file"] = "Lege Projektverzeichnis anhand der aktuellen Datei fest", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Set project directory to the selected one"] = nil, -- src\editor\filetree.lua
+ ["Set search directory"] = "Setze Suchverzeichnis", -- src\editor\toolbar.lua
+ ["Set the interpreter to be used"] = "Wähle zu benutzenden Interpreter aus", -- src\editor\menu_project.lua
+ ["Set the project directory to be used"] = "Lege zu benutzendes Projektverzeichnis fest", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Settings: System"] = "Einstellungen: System", -- src\editor\menu_edit.lua
+ ["Settings: User"] = "Einstellungen: Nutzer", -- src\editor\menu_edit.lua
+ ["Show &Tooltip"] = "&Tooltip zeigen", -- src\editor\menu_edit.lua
+ ["Show All Files"] = "Zeige alle Dateien", -- src\editor\filetree.lua
+ ["Show Hidden Files"] = "Zeige versteckte Dateien", -- src\editor\filetree.lua
+ ["Show Location"] = "Ordner öffnen", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Show all files"] = "Zeige alle Dateien", -- src\editor\filetree.lua
+ ["Show context"] = "Zeige Kontext", -- src\editor\toolbar.lua
+ ["Show files previously hidden"] = "Zeige Dateien die zuvor versteckt wurden", -- src\editor\filetree.lua
+ ["Show multiple result windows"] = "Zeige mehrere Ergebnisfenster", -- src\editor\toolbar.lua
+ ["Show tooltip for current position; place cursor after opening bracket of function"] = "Zeige Tooltip für aktuelle Position; setze Cursor hinter die öffnende Klammer der Funktion", -- src\editor\menu_edit.lua
+ ["Show/Hide the status bar"] = "Statuszeile zeigen/verstecken", -- src\editor\menu_view.lua
+ ["Show/Hide the toolbar"] = "Werkzeugleiste zeigen/verstecken", -- src\editor\menu_view.lua
+ ["Sort By Name"] = "Sortiere nach Namen", -- src\editor\outline.lua
+ ["Sort selected lines"] = "Ausgewählte Zeilen sortieren", -- src\editor\menu_edit.lua
+ ["Source"] = "Source", -- src\editor\menu_edit.lua
+ ["Stack"] = "Stack", -- src\editor\debugger.lua
+ ["Start &Debugging"] = "&Debugging starten", -- src\editor\menu_project.lua
+ ["Start or continue debugging"] = "Debuggen starten/fortsetzen", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step &Into"] = "Schritt h&inein", -- src\editor\menu_project.lua
+ ["Step &Over"] = "&Überspringen", -- src\editor\menu_project.lua
+ ["Step O&ut"] = "Schritt &raus", -- src\editor\menu_project.lua
+ ["Step into"] = "Schritt hinein", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step out of the current function"] = "Schritt aus der aktuellen Funktion heraus", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step over"] = "Überspringen", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop debugging and continue running the process"] = "Beende debuggen und setze den Prozeß fort", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop the currently running process"] = "Aktuell laufenden Prozeß stoppen", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Switch to or from full screen mode"] = "Vollbild an/aus", -- src\editor\menu_view.lua
+ ["Symbol Index"] = "Symbolindex", -- src\editor\outline.lua
+ ["Text not found."] = "Text nicht gefunden.", -- src\editor\findreplace.lua
+ ["The API file must be located in a subdirectory of the API directory."] = "Die API-Datei muß sich in einem Unterverzeichnis des API-Verzeichnisses befinden.", -- src\editor\autocomplete.lua
+ ["Toggle Bookmark"] = "Lesezeichen setzen/löschen", -- src\editor\markers.lua, src\editor\menu_edit.lua
+ ["Toggle Breakpoint"] = "Haltepunkt an/aus", -- src\editor\markers.lua, src\editor\menu_project.lua
+ ["Toggle bookmark"] = "Lesezeichen setzen/löschen", -- src\editor\toolbar.lua, src\editor\menu_edit.lua, src\editor\markers.lua
+ ["Toggle breakpoint"] = "Haltepunkt an/aus", -- src\editor\markers.lua, src\editor\toolbar.lua
+ ["Tr&ace"] = "Ablauf &verfolgen", -- src\editor\menu_project.lua
+ ["Trace execution showing each executed line"] = "Ablaufverfolgung zeigt jede ausgeführte Zeile an", -- src\editor\menu_project.lua
+ ["Unable to create directory '%s'."] = "Kann kein Verzeichnis '%s' erstellen.", -- src\editor\filetree.lua
+ ["Unable to create file '%s'."] = "Kann Datei '%s' nicht erstellen.", -- src\editor\filetree.lua
+ ["Unable to delete directory '%s': %s"] = "Scheitern beim Löschen von Verzeichnis '%s': %s", -- src\editor\filetree.lua
+ ["Unable to delete file '%s': %s"] = "Kann Datei '%s' nicht löschen: %s", -- src\editor\filetree.lua
+ ["Unable to load file '%s'."] = "Scheitern beim Laden von Datei '%s'.", -- src\editor\commands.lua
+ ["Unable to rename file '%s'."] = "Scheitern beim umbenennen von Datei '%s'.", -- src\editor\filetree.lua
+ ["Unable to save file '%s': %s"] = "Scheitern beim Speichern von Datei '%s' : %s", -- src\editor\commands.lua
+ ["Unable to stop program (pid: %d), code %d."] = "Scheitern beim Stoppen des Prozesses (pid : %d), code %d.", -- src\editor\debugger.lua
+ ["Undo last edit"] = "Letzte Änderung rückgängig machen", -- src\editor\menu_edit.lua
+ ["Unmap Directory"] = "virtuelle Einbindung beenden", -- src\editor\filetree.lua
+ ["Unset '%s' As Start File"] = "'%s' ist nicht mehr Startdatei", -- src\editor\filetree.lua
+ ["Updated %d file."] = {"Eine Datei aktualisiert", "%d Dateien aktualisiert."}, -- src\editor\findreplace.lua
+ ["Updating symbol index and settings..."] = "Aktualisiere Symbolindex und Einstellungen...", -- src\editor\outline.lua
+ ["Use %s to close."] = "%s zum Schließen.", -- src\editor\findreplace.lua
+ ["Use '%s' to see full description."] = "'%s' für eine komplette Beschreibung.", -- src\editor\editor.lua
+ ["Use '%s' to show line endings and '%s' to convert them."] = "'%s' um Zeilenende-Codes zu sehen, und '%s' um sie zu konvertieren.", -- src\editor\commands.lua
+ ["Use 'clear' to clear the shell output and the history."] = "'clear' um Ausgabefenster und Verlauf zu löschen.", -- src\editor\shellbox.lua
+ ["Use Shift-Enter for multiline code."] = "<Umsch-Eingabetaste> für Code in mehreren Zeilen.", -- src\editor\shellbox.lua
+ ["View the markers window"] = nil, -- src\editor\menu_view.lua
+ ["View the outline window"] = "Übersichtsfenster ansehen", -- src\editor\menu_view.lua
+ ["View the output/console window"] = "Ausgabe-/Konsolenfenster ansehen", -- src\editor\menu_view.lua
+ ["View the project/filetree window"] = "Projekt-/Dateifenster ansehen", -- src\editor\menu_view.lua
+ ["View the stack window"] = "Stapel/Stack-Fenster ansehen", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["View the watch window"] = "Fenster für Beobachtungspunkte ansehen", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["Watch"] = "Beobachtungspunkte", -- src\editor\debugger.lua
+ ["Welcome to the interactive Lua interpreter."] = "Willkommen zum interaktiven Lua-Interpretr!", -- src\editor\shellbox.lua
+ ["Wrap around"] = "Am Anfang fortsetzen", -- src\editor\toolbar.lua
+ ["You must save the program first."] = "Erst das Programm speichern.", -- src\editor\commands.lua
+ ["Zoom In"] = "Hineinzoomen", -- src\editor\menu_view.lua
+ ["Zoom Out"] = "Herauszoomen", -- src\editor\menu_view.lua
+ ["Zoom to 100%"] = "Zoom zurücksetzen (100%)", -- src\editor\menu_view.lua
+ ["Zoom"] = "Zoom", -- src\editor\menu_view.lua
+ ["on line %d"] = "in Zeile %d", -- src\editor\debugger.lua, src\editor\editor.lua, src\editor\commands.lua
+ ["traced %d instruction"] = {"%d Anweisung verfolgt", "%d Anweisungen verfolgt"}, -- src\editor\debugger.lua
+ ["unknown error"] = "Unbekannter Fehler", -- src\editor\debugger.lua
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/en.lua b/love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/en.lua
new file mode 100644
index 0000000..16e9b98
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/en.lua
@@ -0,0 +1,7 @@
+return {
+ [0] = function(c) return c == 1 and 1 or 2 end, -- plural
+ ["traced %d instruction"] = {"traced %d instruction", "traced %d instructions"}, -- src\editor\debugger.lua
+ ["Found %d instance."] = {"Found %d instance.", "Found %d instances."}, -- src\editor\findreplace.lua
+ ["Replaced %d instance."] = {"Replaced %d instance.", "Replaced %d instances."}, -- src\editor\findreplace.lua
+ ["Updated %d file."] = {"Updated %d file.", "Updated %d files."}, -- src\editor\findreplace.lua
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/eo.lua b/love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/eo.lua
new file mode 100644
index 0000000..4d3d2fd
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/eo.lua
@@ -0,0 +1,346 @@
+--- Traduko fare de cosmotect
+return {
+ [0] = function(c) return c == 1 and 1 or 2 end, -- plural
+ ["%s event failed: %s"] = "%s evento malplenumiĝas: %s", -- src\editor\package.lua
+ ["%s%% formatted..."] = nil, -- src\editor\print.lua
+ ["%s%% loaded..."] = nil, -- src\editor\commands.lua
+ ["&About"] = "&Pri", -- src\editor\menu_help.lua
+ ["&Add Watch"] = "&Aldoni observadaĵon", -- src\editor\debugger.lua
+ ["&Break"] = "&Haltigi", -- src\editor\menu_project.lua
+ ["&Close Page"] = "&Fermi paĝon", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Community"] = "&Komunumo", -- src\editor\menu_help.lua
+ ["&Compile"] = "&Kompili", -- src\editor\menu_project.lua
+ ["&Copy Value"] = nil, -- src\editor\debugger.lua
+ ["&Copy"] = "&Kopii", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Default Layout"] = "&Defaŭlta aranĝo", -- src\editor\menu_view.lua
+ ["&Delete Watch"] = "&Forigi observadaĵon", -- src\editor\debugger.lua
+ ["&Delete"] = "&Forigi", -- src\editor\filetree.lua
+ ["&Documentation"] = "&Dokumentado", -- src\editor\menu_help.lua
+ ["&Edit Project Directory"] = "&Redakti projektan dosierujon", -- src\editor\filetree.lua
+ ["&Edit Value"] = "&Redakti valoron", -- src\editor\debugger.lua
+ ["&Edit Watch"] = "&Redakti observadaĵon", -- src\editor\debugger.lua
+ ["&Edit"] = "&Redakti", -- src\editor\menu_edit.lua
+ ["&File"] = "&Dosiero", -- src\editor\menu_file.lua
+ ["&Find"] = "Tra&serĉi", -- src\editor\menu_search.lua
+ ["&Fold/Unfold All"] = "&Kaŝi/Malkaŝi ĉion", -- src\editor\menu_edit.lua
+ ["&Frequently Asked Questions"] = "&Oftaj demandoj", -- src\editor\menu_help.lua
+ ["&Getting Started Guide"] = "&Ekgvidilo", -- src\editor\menu_help.lua
+ ["&Help"] = "&Helpo", -- src\editor\menu_help.lua
+ ["&New Directory"] = "&Nova dosierujo", -- src\editor\filetree.lua
+ ["&New"] = "&Nova paĝo", -- src\editor\menu_file.lua
+ ["&Open..."] = "&Malfermi...", -- src\editor\menu_file.lua
+ ["&Output/Console Window"] = "&Eliga/Konzola fenestro", -- src\editor\menu_view.lua
+ ["&Paste"] = "&Alglui", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Print..."] = nil, -- src\editor\print.lua
+ ["&Project Page"] = "&Projektpaĝo", -- src\editor\menu_help.lua
+ ["&Project"] = "&Projekto", -- src\editor\menu_project.lua
+ ["&Redo"] = "&Refari", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Rename"] = "&Renomigi", -- src\editor\filetree.lua
+ ["&Replace"] = "&Anstataŭi", -- src\editor\menu_search.lua
+ ["&Run"] = "&Plenumi", -- src\editor\menu_project.lua
+ ["&Save"] = "&Konservi", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Search"] = "&Serĉi", -- src\editor\menu_search.lua
+ ["&Select Command"] = nil, -- src\editor\gui.lua
+ ["&Sort"] = "&Ordi", -- src\editor\menu_edit.lua
+ ["&Stack Window"] = "&Staka fenestro", -- src\editor\menu_view.lua
+ ["&Start Debugger Server"] = "&Ekfunkciigi sencimigilo-servilon", -- src\editor\menu_project.lua
+ ["&Status Bar"] = "&Stata breto", -- src\editor\menu_view.lua
+ ["&Tool Bar"] = "&Ilobreto", -- src\editor\menu_view.lua
+ ["&Tutorials"] = "&Lerniloj", -- src\editor\menu_help.lua
+ ["&Undo"] = "&Malfari", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&View"] = "&Vidi", -- src\editor\menu_view.lua
+ ["&Watch Window"] = "&Observada fenestro", -- src\editor\menu_view.lua
+ ["About %s"] = "Pri %s", -- src\editor\menu_help.lua
+ ["Add To Scratchpad"] = "Aldoni al malnetdosiero", -- src\editor\editor.lua
+ ["Add Watch Expression"] = "Aldoni observadaĵan esprimon", -- src\editor\editor.lua
+ ["All files"] = "Ĉiuj dosieroj", -- src\editor\commands.lua
+ ["Allow external process to start debugging"] = "Lasi eksteran procezon ek-sencimigi", -- src\editor\menu_project.lua
+ ["Analyze the source code"] = "Analizi fontkodon", -- src\editor\inspect.lua
+ ["Analyze"] = "Analizi", -- src\editor\inspect.lua
+ ["Auto Complete Identifiers"] = "Aŭtomate kompletigi fontkodnomojn", -- src\editor\menu_edit.lua
+ ["Auto complete while typing"] = "Aŭtomate kompletigi dumtajpe", -- src\editor\menu_edit.lua
+ ["Binary file is shown as read-only as it is only partially loaded."] = nil, -- src\editor\commands.lua
+ ["Bookmark"] = "Legosigno", -- src\editor\menu_edit.lua
+ ["Break execution at the next executed line of code"] = "Haltigi plenumon ĉe la sekva plenumata linio da fontkodo", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Breakpoint"] = nil, -- src\editor\menu_project.lua
+ ["C&lear Console Window"] = nil, -- src\editor\gui.lua
+ ["C&lear Output Window"] = "Viŝi eligan fenestron", -- src\editor\gui.lua, src\editor\menu_project.lua
+ ["C&omment/Uncomment"] = "F&orkomenti/Eksforkomenti", -- src\editor\menu_edit.lua
+ ["Can't evaluate the expression while the application is running."] = "Ne povas malkodi la esprimon dum funkciatas la aplikaĵo.", -- src\editor\debugger.lua
+ ["Can't open file '%s': %s"] = "Ne povas malfermi la dosieron '%s': %s", -- src\editor\findreplace.lua, src\editor\singleinstance.lua, src\editor\inspect.lua, src\editor\outline.lua
+ ["Can't process auto-recovery record; invalid format: %s."] = "Ne povas analizi aŭtomatrestaŭran dosieron; neprava dosierformo: %s.", -- src\editor\commands.lua
+ ["Can't replace in read-only text."] = nil, -- src\editor\findreplace.lua
+ ["Can't run the entry point script ('%s')."] = "Ne povas plenumi la enirejan skripton", -- src\editor\debugger.lua
+ ["Can't start debugger server at %s:%d: %s."] = "Ne povas ekfunkciigi sencimigilo-servilon ĉe %s:%d: %s.", -- src\editor\debugger.lua
+ ["Can't start debugging for '%s'."] = nil, -- src\editor\debugger.lua
+ ["Can't start debugging session due to internal error '%s'."] = "Ne povas komenci sencimigan seancon pro interna eraro", -- src\editor\debugger.lua
+ ["Can't start debugging without an opened file or with the current file not being saved ('%s')."] = "Ne povas ek-sencimigon sen malfermita dosiero aŭ kun la kuranta dosiero nekonserviĝas ('%s').", -- src\editor\debugger.lua
+ ["Can't stop debugger server as it is not started."] = "Ne povas malfunkciigi sencimigilo-servilon, ĉar ĝi ne funkciantas", -- src\editor\debugger.lua
+ ["Cancelled by the user."] = "Nuligita per la uzanto", -- src\editor\findreplace.lua
+ ["Choose a directory to map"] = nil, -- src\editor\filetree.lua
+ ["Choose a project directory"] = "Elekti projektan dosierujon", -- src\editor\toolbar.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Choose a search directory"] = nil, -- src\editor\findreplace.lua
+ ["Choose..."] = "Elekti...", -- src\editor\findreplace.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Clear Items"] = "Viŝi anojn", -- src\editor\findreplace.lua, src\editor\menu_file.lua
+ ["Clear items from this list"] = "Senlistigi tiujn ĉi anojn", -- src\editor\menu_file.lua
+ ["Clear the output window before compiling or debugging"] = "Viŝi la eligan fenestron antaŭ kompilado aŭ sencimigado", -- src\editor\menu_project.lua
+ ["Close &Other Pages"] = "Fermi &aliajn paĝojn", -- src\editor\gui.lua
+ ["Close A&ll Pages"] = "Fermi ĉiujn paĝojn", -- src\editor\gui.lua
+ ["Close the current editor window"] = "Fermi la kurantan redaktilan fenestron", -- src\editor\menu_file.lua
+ ["Co&ntinue"] = "Daŭrigi", -- src\editor\menu_project.lua
+ ["Col: %d"] = "Kol: %d", -- src\editor\editor.lua
+ ["Command Line Parameters..."] = "Komandliniaj parametroj", -- src\editor\menu_project.lua
+ ["Command line parameters"] = "Komandliniaj parametroj", -- src\editor\menu_project.lua
+ ["Comment or uncomment current or selected lines"] = "Forkomenti aŭ eksforkomenti la kurantan aŭ la elektitajn liniojn", -- src\editor\menu_edit.lua
+ ["Compilation error"] = "Eraro de kompilo", -- src\editor\commands.lua, src\editor\debugger.lua
+ ["Compilation successful; %.0f%% success rate (%d/%d)."] = "Kompilo sukcesa; %.0f%% elcentaĵo da sukceso (%d/%d).", -- src\editor\commands.lua
+ ["Compile the current file"] = "Kompili la kurantan dosieron", -- src\editor\menu_project.lua
+ ["Complete &Identifier"] = "Finfari &fontkodnomon", -- src\editor\menu_edit.lua
+ ["Complete the current identifier"] = "Finfari la kurantan fontkodnomon", -- src\editor\menu_edit.lua
+ ["Consider removing backslash from escape sequence '%s'."] = "Kontemplu forigi maloblikvon el eskapsekvenco '%s'.", -- src\editor\commands.lua
+ ["Copy Full Path"] = "Kopii plenan vojon", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Copy selected text to clipboard"] = "Kopii elektitan tekston al la tondejo", -- src\editor\menu_edit.lua
+ ["Correct &Indentation"] = "Korekti &alineon", -- src\editor\menu_edit.lua
+ ["Couldn't activate file '%s' for debugging; continuing without it."] = "Ne povis aktivi la dosieron '%s' por sencimigi; daŭrantas sen ĝi.", -- src\editor\debugger.lua
+ ["Create an empty document"] = "Krei malplenan dokumenton", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Cu&t"] = "El&tondi", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Cut selected text to clipboard"] = "Eltondi la elektitan tekston al la tondejo", -- src\editor\menu_edit.lua
+ ["Debugger server started at %s:%d."] = "Sencimigilo-servilon ekfunkciiĝis ĉe %s:%d.", -- src\editor\debugger.lua
+ ["Debugger server stopped at %s:%d."] = "Sencimigilo-servilon malfunkciiĝis ĉe %s:%d.", -- src\editor\debugger.lua
+ ["Debugging session completed (%s)."] = "Sencimiga seanco estas finita (%s).", -- src\editor\debugger.lua
+ ["Debugging session started in '%s'."] = "Sencimiga seanco komencitas en '%s'.", -- src\editor\debugger.lua
+ ["Debugging suspended at '%s:%s' (couldn't activate the file)."] = "La sencimigo estis finetita ĉe '%s:%s' (ne povis aktivi la dosieron).", -- src\editor\debugger.lua
+ ["Detach &Process"] = "Deigi &procezon", -- src\editor\menu_project.lua
+ ["Disable Indexing For '%s'"] = nil, -- src\editor\outline.lua
+ ["Do you want to delete '%s'?"] = "Ĉu vi volas forigi je '%s'?", -- src\editor\filetree.lua
+ ["Do you want to overwrite it?"] = "Ĉu vi volas superskribi ĉi tiun?", -- src\editor\commands.lua
+ ["Do you want to reload it?"] = "Ĉu vi volas reŝarĝi tiun ĉi?", -- src\editor\editor.lua
+ ["Do you want to save the changes to '%s'?"] = "Ĉu vi volas konservi ĉiujn ŝanĝojn, kiuj enfaris je '%s'?", -- src\editor\commands.lua
+ ["E&xit"] = "&Eliri", -- src\editor\menu_file.lua
+ ["Enable Indexing"] = nil, -- src\editor\outline.lua
+ ["Enter Lua code and press Enter to run it."] = "Enigu fontkodon de Lua kaj premu enenklavon por plenumi ĝin.", -- src\editor\shellbox.lua
+ ["Enter command line parameters (use Cancel to clear)"] = "Enigu komandliniajn parametrojn (uzu nulig-butonon por viŝi)", -- src\editor\menu_project.lua
+ ["Enter replacement text"] = "Enigu anstataŭigan tekston", -- src\editor\editor.lua
+ ["Error while loading API file: %s"] = "Eraro okazis dum ŝargado de API-a dosiero: %s", -- src\editor\autocomplete.lua
+ ["Error while loading configuration file: %s"] = "Eraro okazis dum ŝargado de agorda dosiero: %s", -- src\editor\style.lua
+ ["Error while processing API file: %s"] = "Eraro okazis dum analizado de API-a dosiero: %s", -- src\editor\autocomplete.lua
+ ["Error while processing configuration file: %s"] = "Eraro okazis dum analizado de agorda dosiero: %s", -- src\editor\style.lua
+ ["Error"] = "Eraro", -- src\editor\commands.lua
+ ["Evaluate In Console"] = "Malkodi en la konzolo", -- src\editor\editor.lua
+ ["Execute the current project/file and keep updating the code to see immediate results"] = "Plenumi la kurantan projekton/dosieron, kaj ĝisdatigadi la fontkodon por vidi tujajn rezultojn", -- src\editor\menu_project.lua
+ ["Execute the current project/file"] = "Plenumi la kurantan projekton/dosieron", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Execution error"] = "Eraro de plenumo", -- src\editor\debugger.lua
+ ["Exit program"] = "Eliri programon", -- src\editor\menu_file.lua
+ ["File '%s' has been modified on disk."] = "La dosiero nome de '%s' ŝanĝitis en disko.", -- src\editor\editor.lua
+ ["File '%s' has more recent timestamp than restored '%s'; please review before saving."] = "La dosiero nome de '%s' havas pli freŝan tempindikon, ol la ripardosiero '%s'; bonvolu ekzameni ĝin antaû konservi.", -- src\editor\commands.lua
+ ["File '%s' is missing and can't be recovered."] = "La dosiero nome de '%s' forestas kaj ne povas esti reakirita.", -- src\editor\commands.lua
+ ["File '%s' no longer exists."] = "La dosiero nome de '%s' ne plu ekzistas.", -- src\editor\menu_file.lua, src\editor\editor.lua
+ ["File already exists."] = "Jam ekzistas tiu ĉi dosiero.", -- src\editor\commands.lua
+ ["File history"] = "Dosiera historio", -- src\editor\menu_file.lua
+ ["Find &In Files"] = "Traserĉi &en dosieroj", -- src\editor\menu_search.lua
+ ["Find &Next"] = "&Pluserĉi", -- src\editor\menu_search.lua
+ ["Find &Previous"] = "Traserĉi &antaŭanta", -- src\editor\menu_search.lua
+ ["Find and insert library function"] = nil, -- src\editor\menu_search.lua
+ ["Find and replace text in files"] = "Traserĉi kaj anstataŭi tekston en dosieroj", -- src\editor\menu_search.lua
+ ["Find and replace text"] = "Traserĉi kaj anstataŭi tekston", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find in files"] = "Traserĉi en dosieroj", -- src\editor\toolbar.lua
+ ["Find text in files"] = "Traserĉi tekston en dosieroj", -- src\editor\menu_search.lua
+ ["Find text"] = "Traserĉi tekston", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find the earlier text occurence"] = "Traserĉi la antaŭantan aperaĵon da teksto", -- src\editor\menu_search.lua
+ ["Find the next text occurrence"] = "Pluserĉi la aperaĵon da teksto", -- src\editor\menu_search.lua
+ ["Find"] = "Traserĉi", -- src\editor\toolbar.lua
+ ["Fold or unfold all code folds"] = "Kaŝi aŭ malkaŝi ĉiujn faldaĵojn da fontkodoj", -- src\editor\menu_edit.lua
+ ["Formatting page %d..."] = nil, -- src\editor\print.lua
+ ["Found %d instance."] = {}, -- src\editor\findreplace.lua
+ ["Found auto-recovery record and restored saved session."] = "Trovis aŭtomatrestaŭran dosieron kaj riparis konservitan seancon.", -- src\editor\commands.lua
+ ["Full &Screen"] = "Plenekrana &reĝimo", -- src\editor\menu_view.lua
+ ["Go To Definition"] = "Iri al deklaro", -- src\editor\editor.lua
+ ["Go To File..."] = nil, -- src\editor\menu_search.lua
+ ["Go To Line..."] = "Iri al linio...", -- src\editor\menu_search.lua
+ ["Go To Next Bookmark"] = "Iri al sekvanta legosigno", -- src\editor\menu_edit.lua
+ ["Go To Next Breakpoint"] = nil, -- src\editor\menu_project.lua
+ ["Go To Previous Bookmark"] = "Iri al antaŭanta legosigno", -- src\editor\menu_edit.lua
+ ["Go To Previous Breakpoint"] = nil, -- src\editor\menu_project.lua
+ ["Go To Symbol..."] = nil, -- src\editor\menu_search.lua
+ ["Go to file"] = nil, -- src\editor\menu_search.lua
+ ["Go to line"] = "Iri al linio", -- src\editor\menu_search.lua
+ ["Go to symbol"] = nil, -- src\editor\menu_search.lua
+ ["Hide '.%s' Files"] = nil, -- src\editor\filetree.lua
+ ["INS"] = "INS", -- src\editor\editor.lua
+ ["Ignore and don't index symbols from files in the selected directory"] = nil, -- src\editor\outline.lua
+ ["Ignored error in debugger initialization code: %s."] = "Ignoris eraron en pravaloriza kodo de la sencimigilo: %s.", -- src\editor\debugger.lua
+ ["Indexing %d files: '%s'..."] = nil, -- src\editor\outline.lua
+ ["Indexing completed."] = nil, -- src\editor\outline.lua
+ ["Insert Library Function..."] = nil, -- src\editor\menu_search.lua
+ ["Known Files"] = "Konataj dosieroj", -- src\editor\commands.lua
+ ["Ln: %d"] = "Ln: %d", -- src\editor\editor.lua
+ ["Local console"] = "Loka konzolo", -- src\editor\gui.lua, src\editor\shellbox.lua
+ ["Lua &Interpreter"] = "Interpretilo de Lua", -- src\editor\menu_project.lua
+ ["Map Directory..."] = nil, -- src\editor\filetree.lua
+ ["Mapped remote request for '%s' to '%s'."] = "Mapi faran peton pri '%s' al '%s'.", -- src\editor\debugger.lua
+ ["Markers Window"] = nil, -- src\editor\menu_view.lua
+ ["Markers"] = nil, -- src\editor\markers.lua
+ ["Match case"] = "Atenti usklecon", -- src\editor\toolbar.lua
+ ["Match whole word"] = "Atenti plenan vorton", -- src\editor\toolbar.lua
+ ["Mixed end-of-line encodings detected."] = "Detektis kodoprezentojn miksitajn linifinajn", -- src\editor\commands.lua
+ ["Navigate"] = nil, -- src\editor\menu_search.lua
+ ["New &File"] = "Nova &dosiero", -- src\editor\filetree.lua
+ ["OVR"] = "SUS", -- src\editor\editor.lua
+ ["Open With Default Program"] = "Malfermi per la defaŭlta programo", -- src\editor\filetree.lua
+ ["Open an existing document"] = "Malfermi jaman dokumenton", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Open file"] = "Malfermi dosieron", -- src\editor\commands.lua
+ ["Outline Window"] = "Skemo-fenestro", -- src\editor\menu_view.lua
+ ["Outline"] = "Skemo", -- src\editor\outline.lua
+ ["Output (running)"] = "Eligo (funkciata)", -- src\editor\debugger.lua, src\editor\output.lua
+ ["Output (suspended)"] = "Eligo (finetita)", -- src\editor\debugger.lua
+ ["Output"] = "Eligo", -- src\editor\debugger.lua, src\editor\output.lua, src\editor\gui.lua, src\editor\settings.lua
+ ["Page Setup..."] = nil, -- src\editor\print.lua
+ ["Paste text from the clipboard"] = "Alglui tekston el la tondejo", -- src\editor\menu_edit.lua
+ ["Preferences"] = "Preferoj", -- src\editor\menu_edit.lua
+ ["Prepend '!' to force local execution."] = "Antaŭdoni je '!' por altrudi lokan plenumon.", -- src\editor\shellbox.lua
+ ["Prepend '=' to show complex values on multiple lines."] = "Antaŭdoni je '=' por montri komplikajn valorojn sur multaj linioj.", -- src\editor\shellbox.lua
+ ["Press cancel to abort."] = "Premu nulig-butonon por fini.", -- src\editor\commands.lua
+ ["Print the current document"] = nil, -- src\editor\print.lua
+ ["Program '%s' started in '%s' (pid: %d)."] = "La programo nome de '%s' komencitas en '%s' (pid: %d).", -- src\editor\output.lua
+ ["Program can't start because conflicting process is running as '%s'."] = "La programo ne povas komenci, ĉar konflikta procezo funkcias kiel je la '%s'.", -- src\editor\output.lua
+ ["Program completed in %.2f seconds (pid: %d)."] = "La programo finfaris post %.2f sekundoj", -- src\editor\output.lua
+ ["Program starting as '%s'."] = "La programo komencas kiel je '%s'.", -- src\editor\output.lua
+ ["Program stopped (pid: %d)."] = "La programo finis (pid: %d).", -- src\editor\debugger.lua
+ ["Program unable to run as '%s'."] = "La programo ne kapablas plenumi kiel je '%s'.", -- src\editor\output.lua
+ ["Project Directory"] = "Projekta dosierujo", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Project history"] = "Projekta historio", -- src\editor\menu_file.lua
+ ["Project"] = "Projekto", -- src\editor\filetree.lua
+ ["Project/&FileTree Window"] = "Projekta/&Dosierarba Fenestro", -- src\editor\menu_view.lua
+ ["Provide command line parameters"] = "Doni komandliniajn parametrojn", -- src\editor\menu_project.lua
+ ["Queued %d files to index."] = nil, -- src\editor\menu_search.lua
+ ["R/O"] = "L/A", -- src\editor\editor.lua
+ ["R/W"] = "L/S", -- src\editor\editor.lua
+ ["Re&place In Files"] = "Anstataŭi en dosieroj", -- src\editor\menu_search.lua
+ ["Re-indent selected lines"] = "Realinei elektitajn liniojn", -- src\editor\menu_edit.lua
+ ["Reached end of selection and wrapped around."] = nil, -- src\editor\findreplace.lua
+ ["Reached end of text and wrapped around."] = nil, -- src\editor\findreplace.lua
+ ["Recent Files"] = "Antaŭnelongaj dosieroj", -- src\editor\menu_file.lua
+ ["Recent Projects"] = "Antaŭnelongaj projektoj", -- src\editor\menu_file.lua
+ ["Redo last edit undone"] = "Refari lastan redakton", -- src\editor\menu_edit.lua
+ ["Refresh Index"] = nil, -- src\editor\outline.lua
+ ["Refresh indexed symbols from files in the selected directory"] = nil, -- src\editor\outline.lua
+ ["Refresh"] = "Refreŝigu", -- src\editor\filetree.lua
+ ["Refused a request to start a new debugging session as there is one in progress already."] = "Peto por komenci novan sencimigan seancon malakceptis, ĉar seanco jam faratas.", -- src\editor\debugger.lua
+ ["Regular expression"] = "Regul&esprimo", -- src\editor\toolbar.lua
+ ["Remote console"] = "Fora konzolo", -- src\editor\shellbox.lua
+ ["Rename All Instances"] = "Renomigi ĉiujn aperaĵojn", -- src\editor\editor.lua
+ ["Replace All Selections"] = "Anstataŭi ĉiujn elektojn", -- src\editor\editor.lua
+ ["Replace all"] = "Anstataŭi ĉion", -- src\editor\toolbar.lua
+ ["Replace next instance"] = nil, -- src\editor\toolbar.lua
+ ["Replaced %d instance."] = {}, -- src\editor\findreplace.lua
+ ["Replaced an invalid UTF8 character with %s."] = "Anstataŭis UTF8-an signon per %s.", -- src\editor\commands.lua
+ ["Reset to default layout"] = "Rekomenciĝi al defaŭltan aranĝon", -- src\editor\menu_view.lua
+ ["Run As Scratchpad"] = "Plenumi kiel malnetdosieron", -- src\editor\menu_project.lua
+ ["Run To Cursor"] = nil, -- src\editor\menu_project.lua, src\editor\editor.lua
+ ["Run as Scratchpad"] = "Plenumi kiel malnetdosieron", -- src\editor\toolbar.lua
+ ["Run to cursor"] = nil, -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["S&top Debugging"] = "&Fini sencimigo", -- src\editor\menu_project.lua
+ ["S&top Process"] = "&Fini procezon", -- src\editor\menu_project.lua
+ ["Save &As..."] = "Konservi &kiel...", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["Save A&ll"] = "Konservi ĉ&ion", -- src\editor\menu_file.lua
+ ["Save Changes?"] = "Ĉu konservi ĉiujn ŝanĝojn?", -- src\editor\commands.lua
+ ["Save all open documents"] = "Konservi ĉiujn malfermajn dokumentojn", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Save file as"] = "Konservi dosieron kiel", -- src\editor\commands.lua
+ ["Save file?"] = "Ĉu konservi dosieron?", -- src\editor\commands.lua
+ ["Save the current document to a file with a new name"] = "Konservi la kurantan dokumenton kun dosiero novanome", -- src\editor\menu_file.lua
+ ["Save the current document"] = "Konservi la kurantan dokumenton", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Saved auto-recover at %s."] = "Konservis aŭtomatrestaŭron je %s.", -- src\editor\commands.lua
+ ["Scratchpad error"] = "Eraro de malnetdosiero", -- src\editor\debugger.lua
+ ["Search direction"] = nil, -- src\editor\toolbar.lua
+ ["Search in selection"] = nil, -- src\editor\toolbar.lua
+ ["Search in subdirectories"] = nil, -- src\editor\toolbar.lua
+ ["Searching for '%s'."] = nil, -- src\editor\findreplace.lua
+ ["Sel: %d/%d"] = "Ele: %d/%d", -- src\editor\editor.lua
+ ["Select &All"] = "Elekti &ĉion", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Select And Find Next"] = "Elekti kaj pluserĉi", -- src\editor\menu_search.lua
+ ["Select And Find Previous"] = "Elekti kaj traserĉi antaŭantan", -- src\editor\menu_search.lua
+ ["Select all text in the editor"] = "Elekti la tekston en la redaktilo", -- src\editor\menu_edit.lua
+ ["Select the word under cursor and find its next occurrence"] = "Elekti la vorton sub la tajpmontrilo, kaj pluserĉi", -- src\editor\menu_search.lua
+ ["Select the word under cursor and find its previous occurrence"] = "Elekti la vorton sub la tajpmontrilo, kaj traserĉi antaŭantan", -- src\editor\menu_search.lua
+ ["Set As Start File"] = nil, -- src\editor\filetree.lua
+ ["Set From Current File"] = "Precizigi per la kuranta dosiero", -- src\editor\menu_project.lua
+ ["Set To Project Directory"] = nil, -- src\editor\findreplace.lua
+ ["Set To Selected Directory"] = nil, -- src\editor\filetree.lua
+ ["Set project directory from current file"] = "Precizigi la projektan dosierujon per la kurantan dosieron", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Set project directory to the selected one"] = nil, -- src\editor\filetree.lua
+ ["Set search directory"] = nil, -- src\editor\toolbar.lua
+ ["Set the interpreter to be used"] = "Precizigi la interpretiloton", -- src\editor\menu_project.lua
+ ["Set the project directory to be used"] = "Precizigi la projekt-dosierujoton", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Settings: System"] = "Agordoj de la sistemo", -- src\editor\menu_edit.lua
+ ["Settings: User"] = "Agordoj de la uzanto", -- src\editor\menu_edit.lua
+ ["Show &Tooltip"] = "Montri &ŝpruchelpilon", -- src\editor\menu_edit.lua
+ ["Show All Files"] = nil, -- src\editor\filetree.lua
+ ["Show Hidden Files"] = nil, -- src\editor\filetree.lua
+ ["Show Location"] = "Montri lokon", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Show all files"] = nil, -- src\editor\filetree.lua
+ ["Show context"] = nil, -- src\editor\toolbar.lua
+ ["Show files previously hidden"] = nil, -- src\editor\filetree.lua
+ ["Show multiple result windows"] = nil, -- src\editor\toolbar.lua
+ ["Show tooltip for current position; place cursor after opening bracket of function"] = "Montri ŝpruchelpilon pri la kuranta pozicio; meti la tajpmontrilon preter la ronda ekkrampo de la funkcio", -- src\editor\menu_edit.lua
+ ["Show/Hide the status bar"] = "Montri/Kaŝi la statan breton", -- src\editor\menu_view.lua
+ ["Show/Hide the toolbar"] = "Montri/Kaŝi la ilobreton", -- src\editor\menu_view.lua
+ ["Sort By Name"] = nil, -- src\editor\outline.lua
+ ["Sort selected lines"] = "Ordi la elektitajn liniojn", -- src\editor\menu_edit.lua
+ ["Source"] = "Fontkodo", -- src\editor\menu_edit.lua
+ ["Stack"] = "Stako", -- src\editor\debugger.lua
+ ["Start &Debugging"] = "Ek-&sencimigi", -- src\editor\menu_project.lua
+ ["Start or continue debugging"] = "Komenci aŭ pluigi sencimigon", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step &Into"] = "Eniri &enen", -- src\editor\menu_project.lua
+ ["Step &Over"] = "Trans&salti", -- src\editor\menu_project.lua
+ ["Step O&ut"] = "Eliri el", -- src\editor\menu_project.lua
+ ["Step into"] = "Eniri enen", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step out of the current function"] = "Eliri el la kuranta funkcio", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step over"] = "Transsalti", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop debugging and continue running the process"] = "Fini sencimigon kaj plenumadi la procezon", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop the currently running process"] = "Fini la nunfunkciatan procezon", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Switch to or from full screen mode"] = "Interŝanĝi al aŭ el plenekrana reĝimo", -- src\editor\menu_view.lua
+ ["Symbol Index"] = nil, -- src\editor\outline.lua
+ ["Text not found."] = "Teksto ne trovitis", -- src\editor\findreplace.lua
+ ["The API file must be located in a subdirectory of the API directory."] = "La dosiero de API devas troviĝi en subdosierujo de la API-a dosierujo.", -- src\editor\autocomplete.lua
+ ["Toggle Bookmark"] = "Baskuli legosignon", -- src\editor\markers.lua, src\editor\menu_edit.lua
+ ["Toggle Breakpoint"] = "Baskuli haltopunkto", -- src\editor\markers.lua, src\editor\menu_project.lua
+ ["Toggle bookmark"] = "Baskuli legosignon", -- src\editor\toolbar.lua, src\editor\menu_edit.lua, src\editor\markers.lua
+ ["Toggle breakpoint"] = "Baskuli haltopunkto", -- src\editor\markers.lua, src\editor\toolbar.lua
+ ["Tr&ace"] = "Spuri", -- src\editor\menu_project.lua
+ ["Trace execution showing each executed line"] = "Spurili plenumon per montri ĉiun plenumitan linion", -- src\editor\menu_project.lua
+ ["Unable to create directory '%s'."] = "Ne kapablas krei je la dosierujo '%s'.", -- src\editor\filetree.lua
+ ["Unable to create file '%s'."] = "Ne kapablas krei je la dosiero '%s'.", -- src\editor\filetree.lua
+ ["Unable to delete directory '%s': %s"] = "Ne kapablas forigi je la dosierujo '%s': %s", -- src\editor\filetree.lua
+ ["Unable to delete file '%s': %s"] = nil, -- src\editor\filetree.lua
+ ["Unable to load file '%s'."] = "Ne kapablas ŝarĝi je la dosiero '%s'.", -- src\editor\commands.lua
+ ["Unable to rename file '%s'."] = "Ne kapablas renomigi je la dosiero '%s'.", -- src\editor\filetree.lua
+ ["Unable to save file '%s': %s"] = "Ne kapablas konservi je la dosiero '%s': %s", -- src\editor\commands.lua
+ ["Unable to stop program (pid: %d), code %d."] = "Ne kapablas fini la programon (pid: %d), kodo %d.", -- src\editor\debugger.lua
+ ["Undo last edit"] = "Malfari la antaŭan redakton", -- src\editor\menu_edit.lua
+ ["Unmap Directory"] = nil, -- src\editor\filetree.lua
+ ["Unset '%s' As Start File"] = nil, -- src\editor\filetree.lua
+ ["Updated %d file."] = {}, -- src\editor\findreplace.lua
+ ["Updating symbol index and settings..."] = nil, -- src\editor\outline.lua
+ ["Use %s to close."] = nil, -- src\editor\findreplace.lua
+ ["Use '%s' to see full description."] = "Uzu je '%s' por vidi plenan priskribon", -- src\editor\editor.lua
+ ["Use '%s' to show line endings and '%s' to convert them."] = "Uzu je '%s' por montri linifinojn kaj je '%s' por konverti ilin", -- src\editor\commands.lua
+ ["Use 'clear' to clear the shell output and the history."] = "Tajpu 'clear' por viŝi la eligon kaj historion de la ŝelo.", -- src\editor\shellbox.lua
+ ["Use Shift-Enter for multiline code."] = "Uzu <Majuskligklavon-Enenklavon> por plurlinia fontkodo.", -- src\editor\shellbox.lua
+ ["View the markers window"] = nil, -- src\editor\menu_view.lua
+ ["View the outline window"] = "Vidi la skemo-fenestron", -- src\editor\menu_view.lua
+ ["View the output/console window"] = "Vidi la eligo/konzolo-fenestron", -- src\editor\menu_view.lua
+ ["View the project/filetree window"] = "Vidi la projekto/dosierarbo-fenestron", -- src\editor\menu_view.lua
+ ["View the stack window"] = "Vidi la stako-fenestron", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["View the watch window"] = "Vidi la observado-fenestron", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["Watch"] = "Observado", -- src\editor\debugger.lua
+ ["Welcome to the interactive Lua interpreter."] = "Bonvenon al la interaga interpretilo de Lua.", -- src\editor\shellbox.lua
+ ["Wrap around"] = "Ĉirkaŭflui", -- src\editor\toolbar.lua
+ ["You must save the program first."] = "Vi unue devas konservi la programon.", -- src\editor\commands.lua
+ ["Zoom In"] = "Zomi", -- src\editor\menu_view.lua
+ ["Zoom Out"] = "Malzomi", -- src\editor\menu_view.lua
+ ["Zoom to 100%"] = "Zomi al 100%", -- src\editor\menu_view.lua
+ ["Zoom"] = "Zomo", -- src\editor\menu_view.lua
+ ["on line %d"] = "sur la linio %d", -- src\editor\debugger.lua, src\editor\editor.lua, src\editor\commands.lua
+ ["traced %d instruction"] = {"spuris je %d instrukcio", "spuris je %d instrukcioj"}, -- src\editor\debugger.lua
+ ["unknown error"] = "obskura eraro", -- src\editor\debugger.lua
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/es.lua b/love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/es.lua
new file mode 100644
index 0000000..a098a31
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/es.lua
@@ -0,0 +1,346 @@
+--- Traducción realiazada por Iñigo Sola
+return {
+ [0] = function(c) return c == 1 and 1 or 2 end, -- plural
+ ["%s event failed: %s"] = "El evento %s ha fallado: %s", -- src\editor\package.lua
+ ["%s%% formatted..."] = "%s%% formateado...", -- src\editor\print.lua
+ ["%s%% loaded..."] = "%s%% cargado...", -- src\editor\commands.lua
+ ["&About"] = "&Acerca de...", -- src\editor\menu_help.lua
+ ["&Add Watch"] = "&Añadir inspección", -- src\editor\debugger.lua
+ ["&Break"] = "Ruptura", -- src\editor\menu_project.lua
+ ["&Close Page"] = "&Cerrar página", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Community"] = "&Comunidad", -- src\editor\menu_help.lua
+ ["&Compile"] = "&Compilar", -- src\editor\menu_project.lua
+ ["&Copy Value"] = "&Copiar valor", -- src\editor\debugger.lua
+ ["&Copy"] = "&Copiar", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Default Layout"] = "&Diseño por defecto", -- src\editor\menu_view.lua
+ ["&Delete Watch"] = "Eliminar inspección", -- src\editor\debugger.lua
+ ["&Delete"] = "Eliminar", -- src\editor\filetree.lua
+ ["&Documentation"] = "&Documentación", -- src\editor\menu_help.lua
+ ["&Edit Project Directory"] = "&Editar directorio del proyecto", -- src\editor\filetree.lua
+ ["&Edit Value"] = "&Editar valor", -- src\editor\debugger.lua
+ ["&Edit Watch"] = "&Editar inspección", -- src\editor\debugger.lua
+ ["&Edit"] = "&Editar", -- src\editor\menu_edit.lua
+ ["&File"] = "Archivo", -- src\editor\menu_file.lua
+ ["&Find"] = "Buscar", -- src\editor\menu_search.lua
+ ["&Fold/Unfold All"] = "Plegar/desplegar todo", -- src\editor\menu_edit.lua
+ ["&Frequently Asked Questions"] = "Preguntas &Frecuentes", -- src\editor\menu_help.lua
+ ["&Getting Started Guide"] = "&Guía de iniciación", -- src\editor\menu_help.lua
+ ["&Help"] = "Ayuda", -- src\editor\menu_help.lua
+ ["&New Directory"] = "&Nuevo directorio", -- src\editor\filetree.lua
+ ["&New"] = "&Nuevo", -- src\editor\menu_file.lua
+ ["&Open..."] = "&Abrir...", -- src\editor\menu_file.lua
+ ["&Output/Console Window"] = "Salida/Consola", -- src\editor\menu_view.lua
+ ["&Paste"] = "Pegar", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Print..."] = "Im&primir", -- src\editor\print.lua
+ ["&Project Page"] = "&Página de proyecto", -- src\editor\menu_help.lua
+ ["&Project"] = "Proyecto", -- src\editor\menu_project.lua
+ ["&Redo"] = "Rehacer", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Rename"] = "&Renombrar", -- src\editor\filetree.lua
+ ["&Replace"] = "Remplazar", -- src\editor\menu_search.lua
+ ["&Run"] = "Ejecutar", -- src\editor\menu_project.lua
+ ["&Save"] = "Guardar", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Search"] = "Buscar", -- src\editor\menu_search.lua
+ ["&Select Command"] = "&Seleccionar comando", -- src\editor\gui.lua
+ ["&Sort"] = "Clasificar", -- src\editor\menu_edit.lua
+ ["&Stack Window"] = "Ventana de la pila de ejecución", -- src\editor\menu_view.lua
+ ["&Start Debugger Server"] = "Lanzar servidor de depuración", -- src\editor\menu_project.lua
+ ["&Status Bar"] = "Barra de e&stado", -- src\editor\menu_view.lua
+ ["&Tool Bar"] = "Barra de herramientas", -- src\editor\menu_view.lua
+ ["&Tutorials"] = "&Tutoriales", -- src\editor\menu_help.lua
+ ["&Undo"] = "Deshacer", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&View"] = "Ver", -- src\editor\menu_view.lua
+ ["&Watch Window"] = "Ventana de inspección", -- src\editor\menu_view.lua
+ ["About %s"] = "Acerca de %s", -- src\editor\menu_help.lua
+ ["Add To Scratchpad"] = "Añadir al borrador", -- src\editor\editor.lua
+ ["Add Watch Expression"] = "Añadir expresión de inspección", -- src\editor\editor.lua
+ ["All files"] = "Todos los archivos", -- src\editor\commands.lua
+ ["Allow external process to start debugging"] = "Permitir proceso externo para iniciar depuración", -- src\editor\menu_project.lua
+ ["Analyze the source code"] = "Analizar el código fuente", -- src\editor\inspect.lua
+ ["Analyze"] = "Analizar", -- src\editor\inspect.lua
+ ["Auto Complete Identifiers"] = "Autocompletar identificadores", -- src\editor\menu_edit.lua
+ ["Auto complete while typing"] = "Autocompletar mientras se escribe", -- src\editor\menu_edit.lua
+ ["Binary file is shown as read-only as it is only partially loaded."] = "El archivo binario es mostrado como solo lectura ya que solo ha sido cargado parcialmente.", -- src\editor\commands.lua
+ ["Bookmark"] = "Marcador", -- src\editor\menu_edit.lua
+ ["Break execution at the next executed line of code"] = "Parar ejecución en la siguiente línea de código", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Breakpoint"] = "Punto de ruptura", -- src\editor\menu_project.lua
+ ["C&lear Console Window"] = "Limpiar ventana de Consola", -- src\editor\gui.lua
+ ["C&lear Output Window"] = "Limpiar ventana de Salida", -- src\editor\gui.lua, src\editor\menu_project.lua
+ ["C&omment/Uncomment"] = "Comentar/descomentar", -- src\editor\menu_edit.lua
+ ["Can't evaluate the expression while the application is running."] = "No se puede evaluar la expresión mientras la aplicación se está ejecutando.", -- src\editor\debugger.lua
+ ["Can't open file '%s': %s"] = "No se puede abrir el archivo '%s': %s", -- src\editor\findreplace.lua, src\editor\singleinstance.lua, src\editor\inspect.lua, src\editor\outline.lua
+ ["Can't process auto-recovery record; invalid format: %s."] = "No se puede procesar la autorrecuperación; formato inválido: %s.", -- src\editor\commands.lua
+ ["Can't replace in read-only text."] = "No se puede remplazar en modo solo lectura.", -- src\editor\findreplace.lua
+ ["Can't run the entry point script ('%s')."] = "No se pude ejecutar el punto de entrada del script (%s).", -- src\editor\debugger.lua
+ ["Can't start debugger server at %s:%d: %s."] = "No se puede iniciar el servidor de depuración %s:%d: %s.", -- src\editor\debugger.lua
+ ["Can't start debugging for '%s'."] = "No se puede iniciar la depuración para '%s'.", -- src\editor\debugger.lua
+ ["Can't start debugging session due to internal error '%s'."] = "No se puede iniciar la sesión de depuración debido a un error interno '%s'.'", -- src\editor\debugger.lua
+ ["Can't start debugging without an opened file or with the current file not being saved ('%s')."] = "No se puede iniciar la depuración sin abrir un archivo o si no ha sido guardado ('%s').", -- src\editor\debugger.lua
+ ["Can't stop debugger server as it is not started."] = "No se puede parar el servidor de puración ya que no se ha iniciado.", -- src\editor\debugger.lua
+ ["Cancelled by the user."] = "Cancelado por el usuario.", -- src\editor\findreplace.lua
+ ["Choose a directory to map"] = "Elegir un directorio para mapear", -- src\editor\filetree.lua
+ ["Choose a project directory"] = "Elegir un directorio de proyecto", -- src\editor\toolbar.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Choose a search directory"] = "Elegir un directorio de búsqueda", -- src\editor\findreplace.lua
+ ["Choose..."] = "Elegir...", -- src\editor\findreplace.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Clear Items"] = "Limpiar objetos", -- src\editor\findreplace.lua, src\editor\menu_file.lua
+ ["Clear items from this list"] = "Limpiar objectos de esta lista", -- src\editor\menu_file.lua
+ ["Clear the output window before compiling or debugging"] = "Limpiar la ventana de salida antes de compilar o depurar", -- src\editor\menu_project.lua
+ ["Close &Other Pages"] = "Cerrar &Otras Páginas", -- src\editor\gui.lua
+ ["Close A&ll Pages"] = "Cerrar todas las páginas", -- src\editor\gui.lua
+ ["Close the current editor window"] = "Cerrar la ventana actual del editor", -- src\editor\menu_file.lua
+ ["Co&ntinue"] = "Continuar", -- src\editor\menu_project.lua
+ ["Col: %d"] = "Col: %d", -- src\editor\editor.lua
+ ["Command Line Parameters..."] = "Parámetros de línea de comandos...", -- src\editor\menu_project.lua
+ ["Command line parameters"] = "Parámetros de línea de comandos", -- src\editor\menu_project.lua
+ ["Comment or uncomment current or selected lines"] = {"Comentar o descomentar la línea activa (seleccionada)","Comentar o descomentar las líneas activas (seleccionadas)"}, -- src\editor\menu_edit.lua
+ ["Compilation error"] = "Error de compilación", -- src\editor\commands.lua, src\editor\debugger.lua
+ ["Compilation successful; %.0f%% success rate (%d/%d)."] = "Compilación exitosa; factor de éxito: %.0f%% (%d/%d).", -- src\editor\commands.lua
+ ["Compile the current file"] = "Compilar el archivo actual", -- src\editor\menu_project.lua
+ ["Complete &Identifier"] = "Completar identificador", -- src\editor\menu_edit.lua
+ ["Complete the current identifier"] = "Completar el actual identificador", -- src\editor\menu_edit.lua
+ ["Consider removing backslash from escape sequence '%s'."] = "Considerar la eliminación de las barras invertidas de la secuencia de escape '%s'.", -- src\editor\commands.lua
+ ["Copy Full Path"] = "Copiar ruta completa", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Copy selected text to clipboard"] = "Copiar el texto seleccionado al portapapeles", -- src\editor\menu_edit.lua
+ ["Correct &Indentation"] = "Corregir &Identación", -- src\editor\menu_edit.lua
+ ["Couldn't activate file '%s' for debugging; continuing without it."] = "No se pudo activar el archivo '%s' para la depuración; continuar sin él.", -- src\editor\debugger.lua
+ ["Create an empty document"] = "Crear un documento en blanco", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Cu&t"] = "Cortar", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Cut selected text to clipboard"] = "Cortar el texto selecionado al portapapeles", -- src\editor\menu_edit.lua
+ ["Debugger server started at %s:%d."] = "Servidor de depuración inciado en %s:%d.", -- src\editor\debugger.lua
+ ["Debugger server stopped at %s:%d."] = "Seridor de depuración parado en %s:%d.", -- src\editor\debugger.lua
+ ["Debugging session completed (%s)."] = "Sesión de depuración completada (%s).", -- src\editor\debugger.lua
+ ["Debugging session started in '%s'."] = "Sesión de depuración iniciada en '%s'.", -- src\editor\debugger.lua
+ ["Debugging suspended at '%s:%s' (couldn't activate the file)."] = "Depuración suspendida en '%s:%s' (no se pudo activar el archivo)", -- src\editor\debugger.lua
+ ["Detach &Process"] = "Separar &Proceso", -- src\editor\menu_project.lua
+ ["Disable Indexing For '%s'"] = "Deshabilitar indexación para '%s'", -- src\editor\outline.lua
+ ["Do you want to delete '%s'?"] = "¿Quieres borrar '%s'?", -- src\editor\filetree.lua
+ ["Do you want to overwrite it?"] = "¿Quieres sobrescribirlo?", -- src\editor\commands.lua
+ ["Do you want to reload it?"] = "¿Quieres recargarlo?", -- src\editor\editor.lua
+ ["Do you want to save the changes to '%s'?"] = "¿Quieres guardar los cambios en '%s'?", -- src\editor\commands.lua
+ ["E&xit"] = "Salir", -- src\editor\menu_file.lua
+ ["Enable Indexing"] = "Habilitar indexación", -- src\editor\outline.lua
+ ["Enter Lua code and press Enter to run it."] = "Introduce código Lua y pulsa <Entrer> para ejecutarlo.", -- src\editor\shellbox.lua
+ ["Enter command line parameters (use Cancel to clear)"] = "Introduce parámetros de línea de comandos (usa Cancel para limpiar)", -- src\editor\menu_project.lua
+ ["Enter replacement text"] = "Introduce el texto de remplazo", -- src\editor\editor.lua
+ ["Error while loading API file: %s"] = "Error mientras se cargaba el archivo de API: %s", -- src\editor\autocomplete.lua
+ ["Error while loading configuration file: %s"] = "Error mientras se cargaba el fichero de configuración: %s", -- src\editor\style.lua
+ ["Error while processing API file: %s"] = "Error mientras se procesaba el archivo de API: %s", -- src\editor\autocomplete.lua
+ ["Error while processing configuration file: %s"] = "Error mientras se procesaba el fichero de configuración: %s", -- src\editor\style.lua
+ ["Error"] = "Error", -- src\editor\commands.lua
+ ["Evaluate In Console"] = "Evaluar en consola", -- src\editor\editor.lua
+ ["Execute the current project/file and keep updating the code to see immediate results"] = "Ejecutar el proyecto/archivo actual y manteniendo actualizado el código para ver resultados en tiempo real", -- src\editor\menu_project.lua
+ ["Execute the current project/file"] = "Ejecutar el proyecto/archivo actual", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Execution error"] = "Error de ejecución", -- src\editor\debugger.lua
+ ["Exit program"] = "Salir del programa", -- src\editor\menu_file.lua
+ ["File '%s' has been modified on disk."] = "El archivo '%s' ha sido modificado en el disco.", -- src\editor\editor.lua
+ ["File '%s' has more recent timestamp than restored '%s'; please review before saving."] = "El archivo '%s' tiene una fecha más reciente que el restaurado '%s'; por favor, revísalo antes de guardar.", -- src\editor\commands.lua
+ ["File '%s' is missing and can't be recovered."] = "El archivo '%s' no se encuenta y no puede ser recuperado.", -- src\editor\commands.lua
+ ["File '%s' no longer exists."] = "El archivo '%s' no existe.", -- src\editor\menu_file.lua, src\editor\editor.lua
+ ["File already exists."] = "El fichero ya existe", -- src\editor\commands.lua
+ ["File history"] = "Historial de archivos", -- src\editor\menu_file.lua
+ ["Find &In Files"] = "Buscar en archivos", -- src\editor\menu_search.lua
+ ["Find &Next"] = "Buscar siguiente", -- src\editor\menu_search.lua
+ ["Find &Previous"] = "Buscar anterior", -- src\editor\menu_search.lua
+ ["Find and insert library function"] = "Buscar e insertar función de librería", -- src\editor\menu_search.lua
+ ["Find and replace text in files"] = "Buscar y remplazar texto en archivos", -- src\editor\menu_search.lua
+ ["Find and replace text"] = "Buscar y rempleazar texto", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find in files"] = "Buscar en ficheros", -- src\editor\toolbar.lua
+ ["Find text in files"] = "Buscar texto en archivos", -- src\editor\menu_search.lua
+ ["Find text"] = "Buscar texto", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find the earlier text occurence"] = "Buscar la anterior aparición del texto", -- src\editor\menu_search.lua
+ ["Find the next text occurrence"] = "Buscar la siguiente aparecición del texto", -- src\editor\menu_search.lua
+ ["Find"] = "Buscar", -- src\editor\toolbar.lua
+ ["Fold or unfold all code folds"] = "Plegar o desplegar todo el código plegado", -- src\editor\menu_edit.lua
+ ["Formatting page %d..."] = "Formateando página %d...", -- src\editor\print.lua
+ ["Found %d instance."] = {"Encontrada una instancia", "Encontradas %d instancias"}, -- src\editor\findreplace.lua
+ ["Found auto-recovery record and restored saved session."] = "Encontrada autorrecuperación y sesión restaurada.", -- src\editor\commands.lua
+ ["Full &Screen"] = "Pantalla completa", -- src\editor\menu_view.lua
+ ["Go To Definition"] = "Ir a definición", -- src\editor\editor.lua
+ ["Go To File..."] = "Ir a fichero...", -- src\editor\menu_search.lua
+ ["Go To Line..."] = "Ir a línea...", -- src\editor\menu_search.lua
+ ["Go To Next Bookmark"] = "Ir al siguiente marcador", -- src\editor\menu_edit.lua
+ ["Go To Next Breakpoint"] = "Ir al siguiente punto de ruptura", -- src\editor\menu_project.lua
+ ["Go To Previous Bookmark"] = "Ir al marcador anterior", -- src\editor\menu_edit.lua
+ ["Go To Previous Breakpoint"] = "Ir al punto de ruptura anterior", -- src\editor\menu_project.lua
+ ["Go To Symbol..."] = "Ir a símbolo...", -- src\editor\menu_search.lua
+ ["Go to file"] = "Ir a archivo", -- src\editor\menu_search.lua
+ ["Go to line"] = "Ir a línea", -- src\editor\menu_search.lua
+ ["Go to symbol"] = "Ir a símbolo", -- src\editor\menu_search.lua
+ ["Hide '.%s' Files"] = "Ocultar archivos '.%s'", -- src\editor\filetree.lua
+ ["INS"] = "INS", -- src\editor\editor.lua
+ ["Ignore and don't index symbols from files in the selected directory"] = "Ignorar y no indexar símbolos de archivos en el directorio seleccionado", -- src\editor\outline.lua
+ ["Ignored error in debugger initialization code: %s."] = "Error ignorado en código de inicialización de depurador: %s.", -- src\editor\debugger.lua
+ ["Indexing %d files: '%s'..."] = "Indexando %d archivos: '%s'...", -- src\editor\outline.lua
+ ["Indexing completed."] = "Indexado completado.", -- src\editor\outline.lua
+ ["Insert Library Function..."] = "Insertar función de librería...", -- src\editor\menu_search.lua
+ ["Known Files"] = "Archivos conocidos", -- src\editor\commands.lua
+ ["Ln: %d"] = "Ln: %d", -- src\editor\editor.lua
+ ["Local console"] = "Consola local", -- src\editor\gui.lua, src\editor\shellbox.lua
+ ["Lua &Interpreter"] = "Intérprete Lua", -- src\editor\menu_project.lua
+ ["Map Directory..."] = "Mapeo de directorio...", -- src\editor\filetree.lua
+ ["Mapped remote request for '%s' to '%s'."] = "Mapeada petición remota de '%s' a '%s'.", -- src\editor\debugger.lua
+ ["Markers Window"] = "Ventana de marcas", -- src\editor\menu_view.lua
+ ["Markers"] = "Marcas", -- src\editor\markers.lua
+ ["Match case"] = "Emparejar mayúsculas/minúsuclas", -- src\editor\toolbar.lua
+ ["Match whole word"] = "Emparejar palabras completas", -- src\editor\toolbar.lua
+ ["Mixed end-of-line encodings detected."] = "Detectadas condificaciones de final de línea distintas", -- src\editor\commands.lua
+ ["Navigate"] = "Navegar", -- src\editor\menu_search.lua
+ ["New &File"] = "Nuevo %Fichero", -- src\editor\filetree.lua
+ ["OVR"] = "OVR", -- src\editor\editor.lua
+ ["Open With Default Program"] = "Abrir con programa por defecto", -- src\editor\filetree.lua
+ ["Open an existing document"] = "Abrir un documento existente", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Open file"] = "Abrir archivo", -- src\editor\commands.lua
+ ["Outline Window"] = "Ventana de esquema", -- src\editor\menu_view.lua
+ ["Outline"] = "Esquema", -- src\editor\outline.lua
+ ["Output (running)"] = "Salida (en ejecución)", -- src\editor\debugger.lua, src\editor\output.lua
+ ["Output (suspended)"] = "Salida (suspendida)", -- src\editor\debugger.lua
+ ["Output"] = "Salida", -- src\editor\debugger.lua, src\editor\output.lua, src\editor\gui.lua, src\editor\settings.lua
+ ["Page Setup..."] = "Configuración de página", -- src\editor\print.lua
+ ["Paste text from the clipboard"] = "Pegar texto desde el portapapeles", -- src\editor\menu_edit.lua
+ ["Preferences"] = "Preferencias", -- src\editor\menu_edit.lua
+ ["Prepend '!' to force local execution."] = "Antepón '!' para forzar una ejecución local.", -- src\editor\shellbox.lua
+ ["Prepend '=' to show complex values on multiple lines."] = "Antepón '=' para ver valores complejos en líneas múltiples", -- src\editor\shellbox.lua
+ ["Press cancel to abort."] = "Presiona cancelar para abortar.", -- src\editor\commands.lua
+ ["Print the current document"] = "Imprimir el documento actual", -- src\editor\print.lua
+ ["Program '%s' started in '%s' (pid: %d)."] = "Programa '%s' iniciado en '%s' (pid: %d).", -- src\editor\output.lua
+ ["Program can't start because conflicting process is running as '%s'."] = "El programa no puede iniciarse porque hay un proceso conflictivo en ejecución como '%s'.", -- src\editor\output.lua
+ ["Program completed in %.2f seconds (pid: %d)."] = "Programa completado en %.2f segundos (pid: %d).", -- src\editor\output.lua
+ ["Program starting as '%s'."] = "Programa iniciado como '%s'.", -- src\editor\output.lua
+ ["Program stopped (pid: %d)."] = "Programa parado (pid: %d).", -- src\editor\debugger.lua
+ ["Program unable to run as '%s'."] = "No se puede ejecutar el programa como '%s'.", -- src\editor\output.lua
+ ["Project Directory"] = "Directorio de proyecto", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Project history"] = "Historial de proyecto", -- src\editor\menu_file.lua
+ ["Project"] = "Proyecto", -- src\editor\filetree.lua
+ ["Project/&FileTree Window"] = "Ventana de proyecto/árbol de archivos", -- src\editor\menu_view.lua
+ ["Provide command line parameters"] = "Proveer parámetros de línea de comandos", -- src\editor\menu_project.lua
+ ["Queued %d files to index."] = "Encolar %d ficheros al índice", -- src\editor\menu_search.lua
+ ["R/O"] = "R/O", -- src\editor\editor.lua
+ ["R/W"] = "R/W", -- src\editor\editor.lua
+ ["Re&place In Files"] = "Remplazar en archivos", -- src\editor\menu_search.lua
+ ["Re-indent selected lines"] = "Volver a indentar las líneas seleccionadas", -- src\editor\menu_edit.lua
+ ["Reached end of selection and wrapped around."] = "Alcanzado el final de la selección y vuelta a empezar.", -- src\editor\findreplace.lua
+ ["Reached end of text and wrapped around."] = "Alcanzado el final del texto y vuelta a empezar", -- src\editor\findreplace.lua
+ ["Recent Files"] = "Archivos recientes", -- src\editor\menu_file.lua
+ ["Recent Projects"] = "Projectos recientes", -- src\editor\menu_file.lua
+ ["Redo last edit undone"] = "Rehacer la última edición deshecha", -- src\editor\menu_edit.lua
+ ["Refresh Index"] = "Refrescar índice", -- src\editor\outline.lua
+ ["Refresh indexed symbols from files in the selected directory"] = "Refrescar símbolos indexados en los ficheros del directorio seleccionado", -- src\editor\outline.lua
+ ["Refresh"] = "Refrescar", -- src\editor\filetree.lua
+ ["Refused a request to start a new debugging session as there is one in progress already."] = "No se pudo lanzar una nueva sesión de depuración porque ya hay una en curso.", -- src\editor\debugger.lua
+ ["Regular expression"] = "Expresión regular", -- src\editor\toolbar.lua
+ ["Remote console"] = "Consola remota", -- src\editor\shellbox.lua
+ ["Rename All Instances"] = "Renombrar rodas las instancias", -- src\editor\editor.lua
+ ["Replace All Selections"] = "Remplazar todas las selecciones", -- src\editor\editor.lua
+ ["Replace all"] = "Remplazar todo", -- src\editor\toolbar.lua
+ ["Replace next instance"] = "Reemplazar siguiente instancia", -- src\editor\toolbar.lua
+ ["Replaced %d instance."] = {"Remplazada una instancia", "Remplazada %d instancias."}, -- src\editor\findreplace.lua
+ ["Replaced an invalid UTF8 character with %s."] = "Remplazado un caracter UTF8 inválido con %s.", -- src\editor\commands.lua
+ ["Reset to default layout"] = "Restablecer el diseño por defecto", -- src\editor\menu_view.lua
+ ["Run As Scratchpad"] = "Ejecutar como borrador", -- src\editor\menu_project.lua
+ ["Run To Cursor"] = "Ejecutar hasta cursor", -- src\editor\menu_project.lua, src\editor\editor.lua
+ ["Run as Scratchpad"] = "Ejecutar como borrador", -- src\editor\toolbar.lua
+ ["Run to cursor"] = "Ejecutar hasta cursor", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["S&top Debugging"] = "Parar depuración", -- src\editor\menu_project.lua
+ ["S&top Process"] = "Parar proceso", -- src\editor\menu_project.lua
+ ["Save &As..."] = "Guardar como...", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["Save A&ll"] = "Guardar todo", -- src\editor\menu_file.lua
+ ["Save Changes?"] = "¿Guardar cambios?", -- src\editor\commands.lua
+ ["Save all open documents"] = "Guardar todos los documentos abiertos", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Save file as"] = "Guardar archivo como", -- src\editor\commands.lua
+ ["Save file?"] = "¿Guardar archivo?", -- src\editor\commands.lua
+ ["Save the current document to a file with a new name"] = "Guardar el documento actual en un archivo con un nombre nuevo", -- src\editor\menu_file.lua
+ ["Save the current document"] = "Guardar el documento actual", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Saved auto-recover at %s."] = "Guardar autorrecuperación en %s.", -- src\editor\commands.lua
+ ["Scratchpad error"] = "Error en el borrador", -- src\editor\debugger.lua
+ ["Search direction"] = "Dirección de búsqueda", -- src\editor\toolbar.lua
+ ["Search in selection"] = "Buscar en selección", -- src\editor\toolbar.lua
+ ["Search in subdirectories"] = "Buscar en subdirectorios", -- src\editor\toolbar.lua
+ ["Searching for '%s'."] = "Buscando para '%s'.", -- src\editor\findreplace.lua
+ ["Sel: %d/%d"] = "Sel: %d/%d", -- src\editor\editor.lua
+ ["Select &All"] = "Seleccionar todo", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Select And Find Next"] = "Seleccionar y buscar siguiente", -- src\editor\menu_search.lua
+ ["Select And Find Previous"] = "Seleccionar y buscar anterior", -- src\editor\menu_search.lua
+ ["Select all text in the editor"] = "Seleccionar todo el texto en el editor", -- src\editor\menu_edit.lua
+ ["Select the word under cursor and find its next occurrence"] = "Seleccionar palabra bajo cursor y encontrar la siguiente aparición", -- src\editor\menu_search.lua
+ ["Select the word under cursor and find its previous occurrence"] = "Seleccionar palabra bajo cursor y encontar la anterior aparición", -- src\editor\menu_search.lua
+ ["Set As Start File"] = "Establecer como fchero de inicio", -- src\editor\filetree.lua
+ ["Set From Current File"] = "Establecer fichero actual", -- src\editor\menu_project.lua
+ ["Set To Project Directory"] = "Establecer a directorio de proyecto", -- src\editor\findreplace.lua
+ ["Set To Selected Directory"] = "Establcer a directorio seleccionado", -- src\editor\filetree.lua
+ ["Set project directory from current file"] = "Establecer el directorio del proyecto del archivo actual", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Set project directory to the selected one"] = "Configurar el directorio de proyecto al seleccionado", -- src\editor\filetree.lua
+ ["Set search directory"] = "Establecer directorio de búsqueda", -- src\editor\toolbar.lua
+ ["Set the interpreter to be used"] = "Establecer el intérprete a ser usado", -- src\editor\menu_project.lua
+ ["Set the project directory to be used"] = "Establecer el directorio de proyecto para ser utilizado", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Settings: System"] = "Configuración: Sistema", -- src\editor\menu_edit.lua
+ ["Settings: User"] = "Configuración: Usuario", -- src\editor\menu_edit.lua
+ ["Show &Tooltip"] = "Ver tooltip", -- src\editor\menu_edit.lua
+ ["Show All Files"] = "Ver todos los ficheros", -- src\editor\filetree.lua
+ ["Show Hidden Files"] = "Ver ficheros ocultos", -- src\editor\filetree.lua
+ ["Show Location"] = "Ver ubicación", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Show all files"] = "Ver todos los ficheros", -- src\editor\filetree.lua
+ ["Show context"] = "Ver contexto", -- src\editor\toolbar.lua
+ ["Show files previously hidden"] = "Ver fichero previamente ocultados", -- src\editor\filetree.lua
+ ["Show multiple result windows"] = "Ver múltiples ventanas de resultados", -- src\editor\toolbar.lua
+ ["Show tooltip for current position; place cursor after opening bracket of function"] = "Ver tooltip para la posición actual; posicionar el cursor después de abrir el paréntisis de los argumentos de la función", -- src\editor\menu_edit.lua
+ ["Show/Hide the status bar"] = "Ver/Ocultar la barra de estado", -- src\editor\menu_view.lua
+ ["Show/Hide the toolbar"] = "Ver/Ocultar la barra de herramientas", -- src\editor\menu_view.lua
+ ["Sort By Name"] = "Ordenar por nombre", -- src\editor\outline.lua
+ ["Sort selected lines"] = "Clasificar las líneas seleccionadas", -- src\editor\menu_edit.lua
+ ["Source"] = "Fuente", -- src\editor\menu_edit.lua
+ ["Stack"] = "Pila", -- src\editor\debugger.lua
+ ["Start &Debugging"] = "Comenzar depuración", -- src\editor\menu_project.lua
+ ["Start or continue debugging"] = "Inciar o continuar depuración", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step &Into"] = "Paso dentro", -- src\editor\menu_project.lua
+ ["Step &Over"] = "Paso sin entrar", -- src\editor\menu_project.lua
+ ["Step O&ut"] = "Paso fuera", -- src\editor\menu_project.lua
+ ["Step into"] = "Paso dentro", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step out of the current function"] = "Hasta salir de la función actual", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step over"] = "Paso sin entrar", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop debugging and continue running the process"] = "Parar depuración y continuar ejecutando el proceso", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop the currently running process"] = "Parar el proceso en ejecución", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Switch to or from full screen mode"] = "Conmutar el modo de pantalla completa", -- src\editor\menu_view.lua
+ ["Symbol Index"] = "Índice de símbolo", -- src\editor\outline.lua
+ ["Text not found."] = "Texto no encontrado.", -- src\editor\findreplace.lua
+ ["The API file must be located in a subdirectory of the API directory."] = "El archivo de API debe ser almacenado en un subdirectorio del directorio de API.", -- src\editor\autocomplete.lua
+ ["Toggle Bookmark"] = "Conmutar marcador", -- src\editor\markers.lua, src\editor\menu_edit.lua
+ ["Toggle Breakpoint"] = "Conmutar punto de ruptura", -- src\editor\markers.lua, src\editor\menu_project.lua
+ ["Toggle bookmark"] = "Conmutar marcador", -- src\editor\toolbar.lua, src\editor\menu_edit.lua, src\editor\markers.lua
+ ["Toggle breakpoint"] = "Conmutar punto de ruptura", -- src\editor\markers.lua, src\editor\toolbar.lua
+ ["Tr&ace"] = "Traza", -- src\editor\menu_project.lua
+ ["Trace execution showing each executed line"] = "Traza de ejecución mostrando cada línea ejecutada", -- src\editor\menu_project.lua
+ ["Unable to create directory '%s'."] = "No se pudo crear el directorio '%s'.", -- src\editor\filetree.lua
+ ["Unable to create file '%s'."] = "No se pudo crear el fichero '%s'.", -- src\editor\filetree.lua
+ ["Unable to delete directory '%s': %s"] = "No se pudo borrar el directorio '%s': %s", -- src\editor\filetree.lua
+ ["Unable to delete file '%s': %s"] = "No se pudo borrar el ficheor '%s': %s", -- src\editor\filetree.lua
+ ["Unable to load file '%s'."] = "No se pudo cargar el archivo '%s'.", -- src\editor\commands.lua
+ ["Unable to rename file '%s'."] = "No se pudo renombrar el fichero '%s'", -- src\editor\filetree.lua
+ ["Unable to save file '%s': %s"] = "No se pudo guardar el archivo '%s': %s", -- src\editor\commands.lua
+ ["Unable to stop program (pid: %d), code %d."] = "No se puedo parar el programa (pid: %d), código %d.", -- src\editor\debugger.lua
+ ["Undo last edit"] = "Deshacer la última edición", -- src\editor\menu_edit.lua
+ ["Unmap Directory"] = "Desmapear directorio", -- src\editor\filetree.lua
+ ["Unset '%s' As Start File"] = "Quitar '%s' como fichero de inicio", -- src\editor\filetree.lua
+ ["Updated %d file."] = {"Un fichero actualizado", "%d ficheros actualizados"}, -- src\editor\findreplace.lua
+ ["Updating symbol index and settings..."] = "Actualizando índice de símbolos y configurando...", -- src\editor\outline.lua
+ ["Use %s to close."] = "Usa %s para cerrar.", -- src\editor\findreplace.lua
+ ["Use '%s' to see full description."] = "Usa '%s' para ver la descripción completa.", -- src\editor\editor.lua
+ ["Use '%s' to show line endings and '%s' to convert them."] = "Usa '%s' para ver los finales de línea y '%s' para convertirlos", -- src\editor\commands.lua
+ ["Use 'clear' to clear the shell output and the history."] = "Usa 'clear' para limpiar la consola de salida y el historial.", -- src\editor\shellbox.lua
+ ["Use Shift-Enter for multiline code."] = "Usa <Shift-Enter> para código multilínea.", -- src\editor\shellbox.lua
+ ["View the markers window"] = "Ver la ventana de marcas", -- src\editor\menu_view.lua
+ ["View the outline window"] = "Ver la ventana de esquema", -- src\editor\menu_view.lua
+ ["View the output/console window"] = "Ver ventana de salida/consola", -- src\editor\menu_view.lua
+ ["View the project/filetree window"] = "Ver la ventana de proyecto/árbol de archivos", -- src\editor\menu_view.lua
+ ["View the stack window"] = "Ver la ventana de la pila de ejecución", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["View the watch window"] = "Ver la ventana de observación", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["Watch"] = "Inspeccionar", -- src\editor\debugger.lua
+ ["Welcome to the interactive Lua interpreter."] = "Bienvenido al intérprete interactico de Lua.", -- src\editor\shellbox.lua
+ ["Wrap around"] = "Vuelta a empezar", -- src\editor\toolbar.lua
+ ["You must save the program first."] = "Debes guardar el programa primero", -- src\editor\commands.lua
+ ["Zoom In"] = "Acercar zoom", -- src\editor\menu_view.lua
+ ["Zoom Out"] = "Alejar zoom", -- src\editor\menu_view.lua
+ ["Zoom to 100%"] = "Zoom al 100%", -- src\editor\menu_view.lua
+ ["Zoom"] = "Zoom", -- src\editor\menu_view.lua
+ ["on line %d"] = "en la línea %d", -- src\editor\debugger.lua, src\editor\editor.lua, src\editor\commands.lua
+ ["traced %d instruction"] = {"%d instrucción trazada", "%d instrucciones trazadas"}, -- src\editor\debugger.lua
+ ["unknown error"] = "Error desconocido", -- src\editor\debugger.lua
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/fr.lua b/love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/fr.lua
new file mode 100644
index 0000000..b1550e2
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/fr.lua
@@ -0,0 +1,345 @@
+return {
+ [0] = function(c) return c == 1 and 1 or 2 end, -- plural
+ ["%s event failed: %s"] = "L'événement %s a échoué : %s", -- src\editor\package.lua
+ ["%s%% formatted..."] = "%s%% formattés...", -- src\editor\print.lua
+ ["%s%% loaded..."] = "%s%% chargé", -- src\editor\commands.lua
+ ["&About"] = "&À propos", -- src\editor\menu_help.lua
+ ["&Add Watch"] = "&Ajouter une expression", -- src\editor\debugger.lua
+ ["&Break"] = "&Interrompre", -- src\editor\menu_project.lua
+ ["&Close Page"] = "&Fermer la page", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Community"] = "&Communauté", -- src\editor\menu_help.lua
+ ["&Compile"] = "&Compiler", -- src\editor\menu_project.lua
+ ["&Copy Value"] = "Copier la &valeur", -- src\editor\debugger.lua
+ ["&Copy"] = "Co&pier", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Default Layout"] = "Affichage par &défaut", -- src\editor\menu_view.lua
+ ["&Delete Watch"] = "&Supprimer une expression", -- src\editor\debugger.lua
+ ["&Delete"] = "&Supprimer", -- src\editor\filetree.lua
+ ["&Documentation"] = "&Documentation", -- src\editor\menu_help.lua
+ ["&Edit Project Directory"] = "&Modifier le répertoire de projet", -- src\editor\filetree.lua
+ ["&Edit Value"] = "&Modifier une valeur", -- src\editor\debugger.lua
+ ["&Edit Watch"] = "&Modifier une expression", -- src\editor\debugger.lua
+ ["&Edit"] = "É&dition", -- src\editor\menu_edit.lua
+ ["&File"] = "&Fichier", -- src\editor\menu_file.lua
+ ["&Find"] = "&Rechercher", -- src\editor\menu_search.lua
+ ["&Fold/Unfold All"] = "Re&plier/Déplier tout", -- src\editor\menu_edit.lua
+ ["&Frequently Asked Questions"] = "&Foire aux questions" , -- src\editor\menu_help.lua
+ ["&Getting Started Guide"] = "&Guide de prise en main", -- src\editor\menu_help.lua
+ ["&Help"] = "Aid&e", -- src\editor\menu_help.lua
+ ["&New Directory"] = "&Nouveau répertoire", -- src\editor\filetree.lua
+ ["&New"] = "&Nouveau", -- src\editor\menu_file.lua
+ ["&Open..."] = "&Ouvrir...", -- src\editor\menu_file.lua
+ ["&Output/Console Window"] = "&Sortie/Console", -- src\editor\menu_view.lua
+ ["&Paste"] = "Co&ller", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Print..."] = "&Imprimer", -- src\editor\print.lua
+ ["&Project Page"] = "&Site web de ZeroBrane", -- src\editor\menu_help.lua
+ ["&Project"] = "&Projet", -- src\editor\menu_project.lua
+ ["&Redo"] = "&Rétablir", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Rename"] = "&Renommer", -- src\editor\filetree.lua
+ ["&Replace"] = "Re&mplacer", -- src\editor\menu_search.lua
+ ["&Run"] = "&Exécuter", -- src\editor\menu_project.lua
+ ["&Save"] = "&Enregistrer", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Search"] = "&Recherche", -- src\editor\menu_search.lua
+ ["&Select Command"] = "Selectionner la &Commande", -- src\editor\gui.lua
+ ["&Sort"] = "&Trier", -- src\editor\menu_edit.lua
+ ["&Stack Window"] = "&Pile d'exécution", -- src\editor\menu_view.lua
+ ["&Start Debugger Server"] = "Lancer le &serveur de débogage", -- src\editor\menu_project.lua
+ ["&Status Bar"] = "Barre d'&état", -- src\editor\menu_view.lua
+ ["&Tool Bar"] = "Barre d'&outils", -- src\editor\menu_view.lua
+ ["&Tutorials"] = "&Tutoriels", -- src\editor\menu_help.lua
+ ["&Undo"] = "&Annuler", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&View"] = "&Affichage", -- src\editor\menu_view.lua
+ ["&Watch Window"] = "E&xpressions espionnes", -- src\editor\menu_view.lua
+ ["About %s"] = "À propos de %s", -- src\editor\menu_help.lua
+ ["Add To Scratchpad"] = "Ajouter au brouillon", -- src\editor\editor.lua
+ ["Add Watch Expression"] = "Ajouter une expression espionne", -- src\editor\editor.lua
+ ["All files"] = "Tous les fichiers", -- src\editor\commands.lua
+ ["Allow external process to start debugging"] = "Autorise les processus externes à lancer le débogage", -- src\editor\menu_project.lua
+ ["Analyze the source code"] = "Analyse le code source", -- src\editor\inspect.lua
+ ["Analyze"] = "Analyser", -- src\editor\inspect.lua
+ ["Auto Complete Identifiers"] = "Auto-compléter les identifiants", -- src\editor\menu_edit.lua
+ ["Auto complete while typing"] = "Auto-complète lors de la saisie", -- src\editor\menu_edit.lua
+ ["Binary file is shown as read-only as it is only partially loaded."] = "Le fichier binaire est affiché en lecture seule parce qu'il a été chargé partiellement.", -- src\editor\commands.lua
+ ["Bookmark"] = "Marque-pages", -- src\editor\menu_edit.lua
+ ["Break execution at the next executed line of code"] = "Interrompt l'exécution à la ligne suivante", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Breakpoint"] = "Point d'arrêt", -- src\editor\menu_project.lua
+ ["C&lear Console Window"] = "E&ffacer la fenêtre console", -- src\editor\gui.lua
+ ["C&lear Output Window"] = "E&ffacer la fenêtre de sortie", -- src\editor\gui.lua, src\editor\menu_project.lua
+ ["C&omment/Uncomment"] = "Co&mmenter/Décommenter", -- src\editor\menu_edit.lua
+ ["Can't evaluate the expression while the application is running."] = "Impossible d'évaluer l'expression pendant que l'application est en cours d'exécution.", -- src\editor\debugger.lua
+ ["Can't open file '%s': %s"] = "Impossible d'ouvrir le fichier '%s': %s", -- src\editor\findreplace.lua, src\editor\singleinstance.lua, src\editor\inspect.lua, src\editor\outline.lua
+ ["Can't process auto-recovery record; invalid format: %s."] = "Impossible de lire la récupération automatique ; format invalide : %s.", -- src\editor\commands.lua
+ ["Can't replace in read-only text."] = "Impossible de remplacer dans un texte en lecture seule.", -- src\editor\findreplace.lua
+ ["Can't run the entry point script ('%s')."] = "Impossible d'exécuter le point d'entrée du script ('%s').", -- src\editor\debugger.lua
+ ["Can't start debugger server at %s:%d: %s."] = "Impossible de lancer le serveur de débogage à %s:%d: %s." , -- src\editor\debugger.lua
+ ["Can't start debugging for '%s'."] = "Impossible de lancer le débogage pour '%s'.", -- src\editor\debugger.lua
+ ["Can't start debugging session due to internal error '%s'."] = "Impossible de lancer la session de débogage : erreur interne '%s'.", -- src\editor\debugger.lua
+ ["Can't start debugging without an opened file or with the current file not being saved ('%s')."] = "Impossible de lancer le débogage si aucun fichier n'est ouvert ou si le fichier courant n'a pas été enregistré ('%s').", -- src\editor\debugger.lua
+ ["Can't stop debugger server as it is not started."] = "Impossible d'arrêter le serveur de débogage car il n'a pas été démarré.", -- src\editor\debugger.lua
+ ["Cancelled by the user."] = "Annulé par l'utilisateur.", -- src\editor\findreplace.lua
+ ["Choose a directory to map"] = "Choisir un répertoire à mapper", -- src\editor\filetree.lua
+ ["Choose a project directory"] = "Choisir un répertoire de projet", -- src\editor\toolbar.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Choose a search directory"] = "Choisir un répertoire dans lequel rechercher", -- src\editor\findreplace.lua
+ ["Choose..."] = "Choisir...", -- src\editor\findreplace.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Clear Items"] = "Effacer les éléments", -- src\editor\findreplace.lua, src\editor\menu_file.lua
+ ["Clear items from this list"] = "Efface les éléments de cette liste", -- src\editor\menu_file.lua
+ ["Clear the output window before compiling or debugging"] = "Efface la fenêtre de sortie avant compilation ou débogage", -- src\editor\menu_project.lua
+ ["Close &Other Pages"] = "Fermer les &autres pages", -- src\editor\gui.lua
+ ["Close A&ll Pages"] = "Fermer &toutes les pages", -- src\editor\gui.lua
+ ["Close the current editor window"] = "Ferme la fenêtre d'édition courante", -- src\editor\menu_file.lua
+ ["Co&ntinue"] = "Co&ntinuer", -- src\editor\menu_project.lua
+ ["Col: %d"] = "Col : %d", -- src\editor\editor.lua
+ ["Command Line Parameters..."] = "Paramètres de ligne de commande...", -- src\editor\menu_project.lua
+ ["Command line parameters"] = "Paramètres de ligne de commande", -- src\editor\menu_project.lua
+ ["Comment or uncomment current or selected lines"] = "Commente ou décommente les lignes courantes ou sélectionnées", -- src\editor\menu_edit.lua
+ ["Compilation error"] = "Erreur de compilation", -- src\editor\commands.lua, src\editor\debugger.lua
+ ["Compilation successful; %.0f%% success rate (%d/%d)."] = "Compilation réussie ; taux de succès : %.0f%% (%d/%d).", -- src\editor\commands.lua
+ ["Compile the current file"] = "Сompile le fichier courant", -- src\editor\menu_project.lua
+ ["Complete &Identifier"] = "Compléter l'&identifiant", -- src\editor\menu_edit.lua
+ ["Complete the current identifier"] = "Complète l'identifiant courant", -- src\editor\menu_edit.lua
+ ["Consider removing backslash from escape sequence '%s'."] = "Essayez de supprimer les antislashs dans '%s'.", -- src\editor\commands.lua
+ ["Copy Full Path"] = "Copier le chemin absolu", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Copy selected text to clipboard"] = "Copie le texte sélectionné dans le presse-papiers", -- src\editor\menu_edit.lua
+ ["Correct &Indentation"] = "Corriger l'&indentation", -- src\editor\menu_edit.lua
+ ["Couldn't activate file '%s' for debugging; continuing without it."] = "Impossible d'activer le fichier '%s' pour débogage ; poursuite du processus en ignorant le fichier.", -- src\editor\debugger.lua
+ ["Create an empty document"] = "Crée un document vierge", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Cu&t"] = "&Couper", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Cut selected text to clipboard"] = "Coupe le texte sélectionné et le copie dans le presse-papiers", -- src\editor\menu_edit.lua
+ ["Debugger server started at %s:%d."] = "Serveur de débogage démarré à %s:%d.", -- src\editor\debugger.lua
+ ["Debugger server stopped at %s:%d."] = "Serveur de débogage stoppé à %s:%d.", -- src\editor\debugger.lua
+ ["Debugging session completed (%s)."] = "Session de débogage terminée (%s).", -- src\editor\debugger.lua
+ ["Debugging session started in '%s'."] = "Session de débogage démarrée dans '%s'.", -- src\editor\debugger.lua
+ ["Debugging suspended at '%s:%s' (couldn't activate the file)."] = "Débogage interrompu à '%s:%s' (impossible d'activer le fichier).", -- src\editor\debugger.lua
+ ["Detach &Process"] = "Détacher le p&rocessus", -- src\editor\menu_project.lua
+ ["Disable Indexing For '%s'"] = "Désactiver l'indexation pour '%s'", -- src\editor\outline.lua
+ ["Do you want to delete '%s'?"] = "Voulez-vous effacer '%s' ?", -- src\editor\filetree.lua
+ ["Do you want to overwrite it?"] = "Voulez-vous l'écraser ?", -- src\editor\commands.lua
+ ["Do you want to reload it?"] = "Voulez-vous le recharger ?", -- src\editor\editor.lua
+ ["Do you want to save the changes to '%s'?"] = "Voulez-vous enregistrer les modifications dans '%s' ?", -- src\editor\commands.lua
+ ["E&xit"] = "&Quitter", -- src\editor\menu_file.lua
+ ["Enable Indexing"] = "Activer l'indexation", -- src\editor\outline.lua
+ ["Enter Lua code and press Enter to run it."] = "Saisissez du code Lua et appuyez sur <Entrée> pour l´exécuter.", -- src\editor\shellbox.lua
+ ["Enter command line parameters (use Cancel to clear)"] = "Saisissez les paramètres de ligne de commande (cliquez sur Annuler pour effacer)", -- src\editor\menu_project.lua
+ ["Enter replacement text"] = "Saisissez le texte de remplacement", -- src\editor\editor.lua
+ ["Error while loading API file: %s"] = "Erreur lors du chargement du fichier d'API : %s", -- src\editor\autocomplete.lua
+ ["Error while loading configuration file: %s"] = "Erreur lors du chargement du fichier de configuration : %s", -- src\editor\style.lua
+ ["Error while processing API file: %s"] = "Erreur lors de la lecture du fichier d'API : %s", -- src\editor\autocomplete.lua
+ ["Error while processing configuration file: %s"] = "Erreur lors de la lecture du fichier de configuration : %s", -- src\editor\style.lua
+ ["Error"] = "Erreur", -- src\editor\commands.lua
+ ["Evaluate In Console"] = "Évaluer dans la console", -- src\editor\editor.lua
+ ["Execute the current project/file and keep updating the code to see immediate results"] = "Exécute le projet/fichier courant en prenant en compte à la volée les modifications de code", -- src\editor\menu_project.lua
+ ["Execute the current project/file"] = "Exécute le projet/fichier courant", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Execution error"] = "Erreur d'exécution", -- src\editor\debugger.lua
+ ["Exit program"] = "Quitte le programme", -- src\editor\menu_file.lua
+ ["File '%s' has been modified on disk."] = "Le fichier '%s' a été modifié sur le disque.", -- src\editor\editor.lua
+ ["File '%s' has more recent timestamp than restored '%s'; please review before saving."] = "Le fichier '%s' a un horodatage plus récent que celui restauré '%s' ; veuillez vérifier avant d'enregistrer.", -- src\editor\commands.lua
+ ["File '%s' is missing and can't be recovered."] = "Le fichier '%s' est manquant et ne peut pas être récupéré.", -- src\editor\commands.lua
+ ["File '%s' no longer exists."] = "Le fichier '%s' n'existe plus.", -- src\editor\menu_file.lua, src\editor\editor.lua
+ ["File already exists."] = "Le fichier existe déjà.", -- src\editor\commands.lua
+ ["File history"] = "Historique de fichier", -- src\editor\menu_file.lua
+ ["Find &In Files"] = "Rec&hercher dans les fichiers", -- src\editor\menu_search.lua
+ ["Find &Next"] = "Rechercher le &suivant", -- src\editor\menu_search.lua
+ ["Find &Previous"] = "Rechercher le &précédent", -- src\editor\menu_search.lua
+ ["Find and insert library function"] = "Recherche et insère une fonction d'une bibliothèque", -- src\editor\menu_search.lua
+ ["Find and replace text in files"] = "Recherche et remplace le texte dans les fichiers", -- src\editor\menu_search.lua
+ ["Find and replace text"] = "Recherche et remplace le texte", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find in files"] = "Rechercher dans les fichiers", -- src\editor\toolbar.lua
+ ["Find text in files"] = "Recherche le texte dans les fichiers", -- src\editor\menu_search.lua
+ ["Find text"] = "Recherche le texte", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find the earlier text occurence"] = "Recherche l'occurrence précédente du texte", -- src\editor\menu_search.lua
+ ["Find the next text occurrence"] = "Recherche l'occurrence suivante du texte", -- src\editor\menu_search.lua
+ ["Find"] = "Rechercher ", -- src\editor\toolbar.lua
+ ["Fold or unfold all code folds"] = "Replie ou déplie tous les blocs de code", -- src\editor\menu_edit.lua
+ ["Formatting page %d..."] = "Formattage de la page %d en cours...", -- src\editor\print.lua
+ ["Found %d instance."] = {"%d occurence trouvée.", "%d occurences trouvées."}, -- src\editor\findreplace.lua
+ ["Found auto-recovery record and restored saved session."] = "Une récupération automatique a été trouvée et la session a été restaurée.", -- src\editor\commands.lua
+ ["Full &Screen"] = "Plein é&cran", -- src\editor\menu_view.lua
+ ["Go To Definition"] = "Aller à la définition", -- src\editor\editor.lua
+ ["Go To File..."] = "Aller au fichier...", -- src\editor\menu_search.lua
+ ["Go To Line..."] = "Aller à la ligne...", -- src\editor\menu_search.lua
+ ["Go To Next Bookmark"] = "Aller au marque-page suivant", -- src\editor\menu_edit.lua
+ ["Go To Next Breakpoint"] = "Aller au prochain point d'arrêt", -- src\editor\menu_project.lua
+ ["Go To Previous Bookmark"] = "Aller au marque-page précédent", -- src\editor\menu_edit.lua
+ ["Go To Previous Breakpoint"] = "Aller au point d'arrêt précédent", -- src\editor\menu_project.lua
+ ["Go To Symbol..."] = "Aller au symbole...", -- src\editor\menu_search.lua
+ ["Go to file"] = "Permet d'accéder directement à un fichier", -- src\editor\menu_search.lua
+ ["Go to line"] = "Permet d'accéder directement à une ligne", -- src\editor\menu_search.lua
+ ["Go to symbol"] = "Permet d'accéder directement à un symbole", -- src\editor\menu_search.lua
+ ["Hide '.%s' Files"] = "Masquer les fichiers '.%s'", -- src\editor\filetree.lua
+ ["INS"] = "INS", -- src\editor\editor.lua
+ ["Ignore and don't index symbols from files in the selected directory"] = "Ignorer et ne pas indexer les symboles dans les fichiers provenant du répertoire sélectionné", -- src\editor\outline.lua
+ ["Ignored error in debugger initialization code: %s."] = "Une erreur dans le code d'initialisation du debogage a été ignorée: %s.", -- src\editor\debugger.lua
+ ["Indexing %d files: '%s'..."] = "%d fichiers indexés: '%s'...", -- src\editor\outline.lua
+ ["Indexing completed."] = "Indexation terminée.", -- src\editor\outline.lua
+ ["Insert Library Function..."] = "Insérer une fonction d'une bibliothèque...", -- src\editor\menu_search.lua
+ ["Known Files"] = "Fichiers connus", -- src\editor\commands.lua
+ ["Ln: %d"] = "Lig : %d", -- src\editor\editor.lua
+ ["Local console"] = "Console locale", -- src\editor\gui.lua, src\editor\shellbox.lua
+ ["Lua &Interpreter"] = "Interpréteur L&ua", -- src\editor\menu_project.lua
+ ["Map Directory..."] = "Mapper un répertoire...", -- src\editor\filetree.lua
+ ["Mapped remote request for '%s' to '%s'."] = "La requête distante pour '%s' a été associée à '%s'.", -- src\editor\debugger.lua
+ ["Markers Window"] = "Fenêtre des marqueurs", -- src\editor\menu_view.lua
+ ["Markers"] = "Marqueurs", -- src\editor\markers.lua
+ ["Match case"] = "Respecter la casse", -- src\editor\toolbar.lua
+ ["Match whole word"] = "Mot entier uniquement", -- src\editor\toolbar.lua
+ ["Mixed end-of-line encodings detected."] = "Plusieurs codages de fin de ligne ont été détectés.", -- src\editor\commands.lua
+ ["Navigate"] = "Naviguer", -- src\editor\menu_search.lua
+ ["New &File"] = "Nouveau &fichier", -- src\editor\filetree.lua
+ ["OVR"] = "OVR", -- src\editor\editor.lua
+ ["Open With Default Program"] = "Ouvrir avec le programme par défaut", -- src\editor\filetree.lua
+ ["Open an existing document"] = "Ouvre un document existant", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Open file"] = "Ouvrir un fichier", -- src\editor\commands.lua
+ ["Outline Window"] = "Structure", -- src\editor\menu_view.lua
+ ["Outline"] = "Structure", -- src\editor\outline.lua
+ ["Output (running)"] = "Sortie (en cours d'exécution)", -- src\editor\debugger.lua, src\editor\output.lua
+ ["Output (suspended)"] = "Sortie (interrompu)", -- src\editor\debugger.lua
+ ["Output"] = "Sortie", -- src\editor\debugger.lua, src\editor\output.lua, src\editor\gui.lua, src\editor\settings.lua
+ ["Page Setup..."] = "Configuration de la page...", -- src\editor\print.lua
+ ["Paste text from the clipboard"] = "Colle le texte depuis le presse-papiers", -- src\editor\menu_edit.lua
+ ["Preferences"] = "Préférences", -- src\editor\menu_edit.lua
+ ["Prepend '!' to force local execution."] = "Préfixez par '!' pour forcer une execution locale.", -- src\editor\shellbox.lua
+ ["Prepend '=' to show complex values on multiple lines."] = "Préfixez par '=' pour afficher les valeurs complexes sur plusieurs lignes.", -- src\editor\shellbox.lua
+ ["Press cancel to abort."] = "Cliquez sur Annuler pour annuler.", -- src\editor\commands.lua
+ ["Print the current document"] = "Imprimer le document courant", -- src\editor\print.lua
+ ["Program '%s' started in '%s' (pid: %d)."] = "Programme '%s' démarré dans '%s' (pid : %d).", -- src\editor\output.lua
+ ["Program can't start because conflicting process is running as '%s'."] = "Le programme ne peut démarrer à cause d'un conflit de processus avec '%s' (en cours d'exécution).", -- src\editor\output.lua
+ ["Program completed in %.2f seconds (pid: %d)."] = "Programme terminé en %.2f secondes (pid : %d).", -- src\editor\output.lua
+ ["Program starting as '%s'."] = "Programme démarré en tant que '%s'.", -- src\editor\output.lua
+ ["Program stopped (pid: %d)."] = "Programme stoppé (pid : %d).", -- src\editor\debugger.lua
+ ["Program unable to run as '%s'."] = "Impossible d'exécuter le programme en tant que '%s'.", -- src\editor\output.lua
+ ["Project Directory"] = "Répertoire de projet", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Project history"] = "Historique de projet", -- src\editor\menu_file.lua
+ ["Project"] = "Projet", -- src\editor\filetree.lua
+ ["Project/&FileTree Window"] = "&Explorateur de projet", -- src\editor\menu_view.lua
+ ["Provide command line parameters"] = "Définit les paramètres de ligne de commande", -- src\editor\menu_project.lua
+ ["Queued %d files to index."] = "%d fichiers mis en attente pour l'indexation.", -- src\editor\menu_search.lua
+ ["R/O"] = "R/O", -- src\editor\editor.lua
+ ["R/W"] = "R/W", -- src\editor\editor.lua
+ ["Re&place In Files"] = "Remp&lacer dans les fichiers", -- src\editor\menu_search.lua
+ ["Re-indent selected lines"] = "Ré-indente les lignes sélectionnées", -- src\editor\menu_edit.lua
+ ["Reached end of selection and wrapped around."] = "Fin de sélection atteinte et repositionnement en début de sélection.", -- src\editor\findreplace.lua
+ ["Reached end of text and wrapped around."] = "Fin de texte atteinte et repositionnement en début de texte.", -- src\editor\findreplace.lua
+ ["Recent Files"] = "Fichiers récents", -- src\editor\menu_file.lua
+ ["Recent Projects"] = "Projets récents", -- src\editor\menu_file.lua
+ ["Redo last edit undone"] = "Rétablit la dernière modification", -- src\editor\menu_edit.lua
+ ["Refresh Index"] = "Actualiser l'index", -- src\editor\outline.lua
+ ["Refresh indexed symbols from files in the selected directory"] = "Actualiser les symboles indexés à partir des fichiers du répertoire sélectionné", -- src\editor\outline.lua
+ ["Refresh"] = "Rafraîchir", -- src\editor\filetree.lua
+ ["Refused a request to start a new debugging session as there is one in progress already."] = "Une requête de lancement de débogage a été refusée car une session de débogage est déjà en cours.", -- src\editor\debugger.lua
+ ["Regular expression"] = "Expression régulière", -- src\editor\toolbar.lua
+ ["Remote console"] = "Console à distance", -- src\editor\shellbox.lua
+ ["Rename All Instances"] = "Renommer toutes les occurrences", -- src\editor\editor.lua
+ ["Replace All Selections"] = "Remplacer toutes les sélections", -- src\editor\editor.lua
+ ["Replace all"] = "Remplacer tout", -- src\editor\toolbar.lua
+ ["Replace next instance"] = "Remplacer l'occurence suivante", -- src\editor\toolbar.lua
+ ["Replaced %d instance."] = {"%d occurence remplacée.","%d occurences remplacées."}, -- src\editor\findreplace.lua
+ ["Replaced an invalid UTF8 character with %s."] = "Un caractère UTF8 invalide a été remplacé par %s.", -- src\editor\commands.lua
+ ["Reset to default layout"] = "Restaure l'affichage par défaut", -- src\editor\menu_view.lua
+ ["Run As Scratchpad"] = "Exécuter comme brouillon", -- src\editor\menu_project.lua
+ ["Run To Cursor"] = "Exécuter jusqu'au curseur", -- src\editor\menu_project.lua, src\editor\editor.lua
+ ["Run as Scratchpad"] = "Exécuter comme brouillon", -- src\editor\toolbar.lua
+ ["Run to cursor"] = "Exécuter jusqu'au curseur", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["S&top Debugging"] = "&Arrêter le débogage", -- src\editor\menu_project.lua
+ ["S&top Process"] = "&Arrêter le processus", -- src\editor\menu_project.lua
+ ["Save &As..."] = "Enregistrer &sous...", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["Save A&ll"] = "Enregistrer &tout", -- src\editor\menu_file.lua
+ ["Save Changes?"] = "Enregistrer les modifications ?", -- src\editor\commands.lua
+ ["Save all open documents"] = "Enregistre tous les documents ouverts", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Save file as"] = "Enregistrer le fichier sous", -- src\editor\commands.lua
+ ["Save file?"] = "Enregistrer le fichier ?", -- src\editor\commands.lua
+ ["Save the current document to a file with a new name"] = "Enregistre le document courant sous un nouveau nom", -- src\editor\menu_file.lua
+ ["Save the current document"] = "Enregistre le document courant", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Saved auto-recover at %s."] = "Récup. auto enregistrée à %s.", -- src\editor\commands.lua
+ ["Scratchpad error"] = "Erreur dans le brouillon", -- src\editor\debugger.lua
+ ["Search direction"] = "Direction de recherche", -- src\editor\toolbar.lua
+ ["Search in selection"] = "Rechercher dans la sélection", -- src\editor\toolbar.lua
+ ["Search in subdirectories"] = "Rechercher dans les sous-répertoires", -- src\editor\toolbar.lua
+ ["Searching for '%s'."] = "Recherche de '%s'.", -- src\editor\findreplace.lua
+ ["Sel: %d/%d"] = "Sel: %d/%d", -- src\editor\editor.lua
+ ["Select &All"] = "Sélectionner &tout", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Select And Find Next"] = "Sélectionner et rechercher le suivant", -- src\editor\menu_search.lua
+ ["Select And Find Previous"] = "Sélectionner et rerchercher le précédent", -- src\editor\menu_search.lua
+ ["Select all text in the editor"] = "Sélectionne tout le texte dans l'éditeur", -- src\editor\menu_edit.lua
+ ["Select the word under cursor and find its next occurrence"] = "Sélectionne le mot sous le curseur et recherche son occurence suivante", -- src\editor\menu_search.lua
+ ["Select the word under cursor and find its previous occurrence"] = "Sélectionne le mot sous le curseur et recherche son occurence précédente", -- src\editor\menu_search.lua
+ ["Set As Start File"] = "Définir le fichier en tant que point d'entrée", -- src\editor\filetree.lua
+ ["Set From Current File"] = "Définir à partir du fichier courant", -- src\editor\menu_project.lua
+ ["Set To Project Directory"] = "Utiliser le répertoire de projet", -- src\editor\findreplace.lua
+ ["Set To Selected Directory"] = "Utiliser le répertoire sélectionné", -- src\editor\filetree.lua
+ ["Set project directory from current file"] = "Définit le répertoire de projet à partir du chemin du fichier courant", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Set project directory to the selected one"] = "Faire du répertoire sélectionné le répertoire de projet", -- src\editor\filetree.lua
+ ["Set search directory"] = "Définir le répertoire de recherche", -- src\editor\toolbar.lua
+ ["Set the interpreter to be used"] = "Définit l'interpréteur à utiliser", -- src\editor\menu_project.lua
+ ["Set the project directory to be used"] = "Définit le répertoire de projet à utiliser", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Settings: System"] = "Paramètres : Système", -- src\editor\menu_edit.lua
+ ["Settings: User"] = "Paramètres : Utilisateur", -- src\editor\menu_edit.lua
+ ["Show &Tooltip"] = "Afficher l'info-&bulle", -- src\editor\menu_edit.lua
+ ["Show All Files"] = "Afficher tous les fichiers", -- src\editor\filetree.lua
+ ["Show Hidden Files"] = "Afficher les fichiers masqués", -- src\editor\filetree.lua
+ ["Show Location"] = "Afficher l'emplacement", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Show all files"] = "Affiche tous les fichiers", -- src\editor\filetree.lua
+ ["Show context"] = "Affiche le contexte", -- src\editor\toolbar.lua
+ ["Show files previously hidden"] = "Affiche les fichiers précédemment masqués", -- src\editor\filetree.lua
+ ["Show multiple result windows"] = "Affiche les multiples fenêtres de résultat", -- src\editor\toolbar.lua
+ ["Show tooltip for current position; place cursor after opening bracket of function"] = "Affiche l'info-bulle pour la position courante ; placez le curseur après la parenthèse ouvrante de la fonction", -- src\editor\menu_edit.lua
+ ["Show/Hide the status bar"] = "Affiche/Masque la barre d'état", -- src\editor\menu_view.lua
+ ["Show/Hide the toolbar"] = "Affiche/Masque la barre d'outils", -- src\editor\menu_view.lua
+ ["Sort By Name"] = "Trie par nom", -- src\editor\outline.lua
+ ["Sort selected lines"] = "Trie les lignes sélectionnées", -- src\editor\menu_edit.lua
+ ["Source"] = "Code", -- src\editor\menu_edit.lua
+ ["Stack"] = "Pile d'exécution", -- src\editor\debugger.lua
+ ["Start &Debugging"] = "Lancer le &débogage", -- src\editor\menu_project.lua
+ ["Start or continue debugging"] = "Démarre ou continue le debogage", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step &Into"] = "Pas à pas détai&llé", -- src\editor\menu_project.lua
+ ["Step &Over"] = "Pas à pas so&mmaire", -- src\editor\menu_project.lua
+ ["Step O&ut"] = "Pas à pas so&rtant", -- src\editor\menu_project.lua
+ ["Step into"] = "Rentre dans l'instruction suivante", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step out of the current function"] = "Sort de la fonction courante", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step over"] = "Enjambe l'instruction suivante", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop debugging and continue running the process"] = "Arrête le débogage et continue l'exécution du processus", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop the currently running process"] = "Arrête le processus en cours d'exécution", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Switch to or from full screen mode"] = "Active ou désactive le mode plein écran", -- src\editor\menu_view.lua
+ ["Symbol Index"] = "Index des symboles", -- src\editor\outline.lua
+ ["Text not found."] = "Texte non trouvé.", -- src\editor\findreplace.lua
+ ["The API file must be located in a subdirectory of the API directory."] = "Le fichier d'API doit être placé dans un sous-répertoire du répertoire d'API.", -- src\editor\autocomplete.lua
+ ["Toggle Bookmark"] = "Créer/Supprimer un marque-page", -- src\editor\markers.lua, src\editor\menu_edit.lua
+ ["Toggle Breakpoint"] = "Créer/Supprimer un point d'arrêt", -- src\editor\markers.lua, src\editor\menu_project.lua
+ ["Toggle bookmark"] = "Crée ou supprime un marque-page", -- src\editor\toolbar.lua, src\editor\menu_edit.lua, src\editor\markers.lua
+ ["Toggle breakpoint"] = "Crée ou supprime un point d'arrêt", -- src\editor\markers.lua, src\editor\toolbar.lua
+ ["Tr&ace"] = "&Tracer", -- src\editor\menu_project.lua
+ ["Trace execution showing each executed line"] = "Trace l'exécution en affichant chaque ligne de code exécutée", -- src\editor\menu_project.lua
+ ["Unable to create directory '%s'."] = "Impossible de créer le répertoire '%s'.", -- src\editor\filetree.lua
+ ["Unable to create file '%s'."] = "Impossible de créer le fichier '%s'.", -- src\editor\filetree.lua
+ ["Unable to delete directory '%s': %s"] = "Impossible de supprimer le répertoire '%s': %s", -- src\editor\filetree.lua
+ ["Unable to delete file '%s': %s"] = "Impossible de supprimer le fichier '%s': %s", -- src\editor\filetree.lua
+ ["Unable to load file '%s'."] = "Impossible de charger le le fichier '%s'.", -- src\editor\commands.lua
+ ["Unable to rename file '%s'."] = "Impossible de renommer le fichier '%s'.", -- src\editor\filetree.lua
+ ["Unable to save file '%s': %s"] = "Impossible d'enregistrer le fichier '%s' : %s", -- src\editor\commands.lua
+ ["Unable to stop program (pid: %d), code %d."] = "Impossible d'arrêter le programme (pid : %d), code %d.", -- src\editor\debugger.lua
+ ["Undo last edit"] = "Annule la dernière modification", -- src\editor\menu_edit.lua
+ ["Unmap Directory"] = "Démapper le répertoire", -- src\editor\filetree.lua
+ ["Unset '%s' As Start File"] = "Ne plus utiliser le fichier '%s' en tant que point d'entrée", -- src\editor\filetree.lua
+ ["Updated %d file."] = {"%d fichier mis à jour.","%d fichiers mis à jour."}, -- src\editor\findreplace.lua
+ ["Updating symbol index and settings..."] = "Mise à jour en cours de l'index des symboles et des paramètres...", -- src\editor\outline.lua
+ ["Use %s to close."] = "Utiliser %s pour fermer.", -- src\editor\findreplace.lua
+ ["Use '%s' to see full description."] = "Utilisez '%s' pour voir la description complète.", -- src\editor\editor.lua
+ ["Use '%s' to show line endings and '%s' to convert them."] = "Utilisez '%s' pour afficher les fins de ligne et '%s' pour les convertir.", -- src\editor\commands.lua
+ ["Use 'clear' to clear the shell output and the history."] = "Utilisez 'clear' pour effacer la sortie console et l´historique.", -- src\editor\shellbox.lua
+ ["Use Shift-Enter for multiline code."] = "Appuyez sur <Shift-Entrée> pour du code multiligne.", -- src\editor\shellbox.lua
+ ["View the markers window"] = "Afficher la fenêtre des marqueurs", -- src\editor\menu_view.lua
+ ["View the outline window"] = "Affiche la fenêtre de structure", -- src\editor\menu_view.lua
+ ["View the output/console window"] = "Affiche la fenêtre de sortie/console", -- src\editor\menu_view.lua
+ ["View the project/filetree window"] = "Affiche la fenêtre d'explorateur de projet", -- src\editor\menu_view.lua
+ ["View the stack window"] = "Affiche la fenêtre de pile d'exécution", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["View the watch window"] = "Affiche la fenêtre d'expressions espionnes", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["Watch"] = "Expressions espionnes", -- src\editor\debugger.lua
+ ["Welcome to the interactive Lua interpreter."] = "Bienvenue dans l´interpréteur interactif Lua.", -- src\editor\shellbox.lua
+ ["Wrap around"] = "Boucler", -- src\editor\toolbar.lua
+ ["You must save the program first."] = "Vous devez d'abord enregistrer le programme.", -- src\editor\commands.lua
+ ["Zoom In"] = "Zoomer", -- src\editor\menu_view.lua
+ ["Zoom Out"] = "Dézoomer", -- src\editor\menu_view.lua
+ ["Zoom to 100%"] = "Zoomer à 100%", -- src\editor\menu_view.lua
+ ["Zoom"] = "Zoom", -- src\editor\menu_view.lua
+ ["on line %d"] = "à la ligne %d", -- src\editor\debugger.lua, src\editor\editor.lua, src\editor\commands.lua
+ ["traced %d instruction"] = {"%d instruction tracée", "%d instructions tracées"}, -- src\editor\debugger.lua
+ ["unknown error"] = "erreur inconnue", -- src\editor\debugger.lua
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/it.lua b/love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/it.lua
new file mode 100644
index 0000000..5911a3c
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/it.lua
@@ -0,0 +1,345 @@
+return {
+ [0] = function(c) return c == 1 and 1 or 2 end, -- plural
+ ["%s event failed: %s"] = "L'evento %s è fallito : %s", -- src\editor\package.lua
+ ["%s%% formatted..."] = "%s%% formattato...", -- src\editor\print.lua
+ ["%s%% loaded..."] = "%s%% caricato...", -- src\editor\commands.lua
+ ["&About"] = "Informazioni", -- src\editor\menu_help.lua
+ ["&Add Watch"] = "&Aggiungi Espressione di Controllo", -- src\editor\debugger.lua
+ ["&Break"] = "Interrompi", -- src\editor\menu_project.lua
+ ["&Close Page"] = "&Chiudi pagina", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Community"] = "&Comunità", -- src\editor\menu_help.lua
+ ["&Compile"] = "&Compila", -- src\editor\menu_project.lua
+ ["&Copy Value"] = "&Copia Valore", -- src\editor\debugger.lua
+ ["&Copy"] = "&Copia", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Default Layout"] = "Visualizzazione di &Default", -- src\editor\menu_view.lua
+ ["&Delete Watch"] = "Elimina Espressione di Controllo", -- src\editor\debugger.lua
+ ["&Delete"] = "Elimina", -- src\editor\filetree.lua
+ ["&Documentation"] = "Documentazione", -- src\editor\menu_help.lua
+ ["&Edit Project Directory"] = "Modifica directory di progetto", -- src\editor\filetree.lua
+ ["&Edit Value"] = "Modifica Valore", -- src\editor\debugger.lua
+ ["&Edit Watch"] = "Modifica Espressione di Controllo", -- src\editor\debugger.lua
+ ["&Edit"] = "Modifica", -- src\editor\menu_edit.lua
+ ["&File"] = "File", -- src\editor\menu_file.lua
+ ["&Find"] = "Ricerca", -- src\editor\menu_search.lua
+ ["&Fold/Unfold All"] = "Apri/Chiudi tutto", -- src\editor\menu_edit.lua
+ ["&Frequently Asked Questions"] = "Domande &Frequenti", -- src\editor\menu_help.lua
+ ["&Getting Started Guide"] = "&Guida Introduttiva", -- src\editor\menu_help.lua
+ ["&Help"] = "Aiuto", -- src\editor\menu_help.lua
+ ["&New Directory"] = "&Nuova Directory", -- src\editor\filetree.lua
+ ["&New"] = "&Nuovo", -- src\editor\menu_file.lua
+ ["&Open..."] = "&Apri...", -- src\editor\menu_file.lua
+ ["&Output/Console Window"] = "Finestra di Output/Console", -- src\editor\menu_view.lua
+ ["&Paste"] = "Incolla", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Print..."] = "Stampa...", -- src\editor\print.lua
+ ["&Project Page"] = "&Pagina di Progetto", -- src\editor\menu_help.lua
+ ["&Project"] = "&Progetto", -- src\editor\menu_project.lua
+ ["&Redo"] = "&Ripeti", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Rename"] = "&Rinomina", -- src\editor\filetree.lua
+ ["&Replace"] = "Sostituisci", -- src\editor\menu_search.lua
+ ["&Run"] = "Lancia", -- src\editor\menu_project.lua
+ ["&Save"] = "&Salva", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Search"] = "Ricerca", -- src\editor\menu_search.lua
+ ["&Select Command"] = "Seleziona Comando", -- src\editor\gui.lua
+ ["&Sort"] = "Ordina", -- src\editor\menu_edit.lua
+ ["&Stack Window"] = "Stack di chiamate", -- src\editor\menu_view.lua
+ ["&Start Debugger Server"] = "Avvia Debugger Server", -- src\editor\menu_project.lua
+ ["&Status Bar"] = "Barra di stato", -- src\editor\menu_view.lua
+ ["&Tool Bar"] = "Barra degli strumenti", -- src\editor\menu_view.lua
+ ["&Tutorials"] = "Guide", -- src\editor\menu_help.lua
+ ["&Undo"] = "Annulla", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&View"] = "Visualizza", -- src\editor\menu_view.lua
+ ["&Watch Window"] = "Finestra Espressioni di Controllo", -- src\editor\menu_view.lua
+ ["About %s"] = "Informazioni su %s", -- src\editor\menu_help.lua
+ ["Add To Scratchpad"] = "Aggiungi a Scratchpad ", -- src\editor\editor.lua
+ ["Add Watch Expression"] = "Aggiungi Espressione di Controllo", -- src\editor\editor.lua
+ ["All files"] = "Tutti i files", -- src\editor\commands.lua
+ ["Allow external process to start debugging"] = "Permetti a processi esterni di avviare il debug", -- src\editor\menu_project.lua
+ ["Analyze the source code"] = "Analizza il codice", -- src\editor\inspect.lua
+ ["Analyze"] = "Analizza", -- src\editor\inspect.lua
+ ["Auto Complete Identifiers"] = "Autocompletamento identificatori", -- src\editor\menu_edit.lua
+ ["Auto complete while typing"] = "Autocompletamento in linea", -- src\editor\menu_edit.lua
+ ["Binary file is shown as read-only as it is only partially loaded."] = "Il file binario è aperto in sola lettura, poichè caricato solo parzialmente.", -- src\editor\commands.lua
+ ["Bookmark"] = "Segnalibro", -- src\editor\menu_edit.lua
+ ["Break execution at the next executed line of code"] = "Interrompi l'esecuzione alla successiva riga di codice ", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Breakpoint"] = "Punto di Interruzione", -- src\editor\menu_project.lua
+ ["C&lear Console Window"] = "Pulisci finestra console", -- src\editor\gui.lua
+ ["C&lear Output Window"] = "Pulisci finestra di output", -- src\editor\gui.lua, src\editor\menu_project.lua
+ ["C&omment/Uncomment"] = "Commenta/Scommenta", -- src\editor\menu_edit.lua
+ ["Can't evaluate the expression while the application is running."] = "Impossibile interpretare l'espressione se l'applicazione è in esecuzione.", -- src\editor\debugger.lua
+ ["Can't open file '%s': %s"] = "Impossibile aprire il file '%s': %s", -- src\editor\findreplace.lua, src\editor\singleinstance.lua, src\editor\inspect.lua, src\editor\outline.lua
+ ["Can't process auto-recovery record; invalid format: %s."] = "Impossibile procedere all'auto-recovery; Formato non valido: %s.", -- src\editor\commands.lua
+ ["Can't replace in read-only text."] = "Impossibile sostituire in un testo in sola lettura", -- src\editor\findreplace.lua
+ ["Can't run the entry point script ('%s')."] = "Impossibile eseguire il punto di ingresos dello script (%s).", -- src\editor\debugger.lua
+ ["Can't start debugger server at %s:%d: %s."] = "Impossibile lanciare il server debugger a %s:%d: %s.", -- src\editor\debugger.lua
+ ["Can't start debugging for '%s'."] = "Impossibile iniziare il debug perchè '%s'.", -- src\editor\debugger.lua
+ ["Can't start debugging session due to internal error '%s'."] = "Impossibile lanciare la sessione di debug: errore interno '%s'.'", -- src\editor\debugger.lua
+ ["Can't start debugging without an opened file or with the current file not being saved ('%s')."] = "Impossibile lanciare il debug senza aver aperto un file o se il file corrente non è stato salvato ('%s').", -- src\editor\debugger.lua
+ ["Can't stop debugger server as it is not started."] = "Impossibile fermare il server debugger perchè non è stato avviato", -- src\editor\debugger.lua
+ ["Cancelled by the user."] = "Annullato dall'utente", -- src\editor\findreplace.lua
+ ["Choose a directory to map"] = "Scegli una directory da mappare", -- src\editor\filetree.lua
+ ["Choose a project directory"] = "Scegli la directory di un progetto", -- src\editor\toolbar.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Choose a search directory"] = "Scegli una directory di ricerca", -- src\editor\findreplace.lua
+ ["Choose..."] = "Scegli...", -- src\editor\findreplace.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Clear Items"] = "Pulisci elementi", -- src\editor\findreplace.lua, src\editor\menu_file.lua
+ ["Clear items from this list"] = "Pulisci elementi della lista", -- src\editor\menu_file.lua
+ ["Clear the output window before compiling or debugging"] = "Pulisci la finestra di output prima di compilare o lanciare debug", -- src\editor\menu_project.lua
+ ["Close &Other Pages"] = "Chidi le Altre Pagine", -- src\editor\gui.lua
+ ["Close A&ll Pages"] = "Chiudi Tutte le Pagine", -- src\editor\gui.lua
+ ["Close the current editor window"] = "Chiude la finestra dell'edit corrente", -- src\editor\menu_file.lua
+ ["Co&ntinue"] = "Co&ntinua", -- src\editor\menu_project.lua
+ ["Col: %d"] = "Col: %d", -- src\editor\editor.lua
+ ["Command Line Parameters..."] = "Parametri Riga di Comando...", -- src\editor\menu_project.lua
+ ["Command line parameters"] = "Parametri Riga di Comando", -- src\editor\menu_project.lua
+ ["Comment or uncomment current or selected lines"] = "Commenta o scommenta la linea corrente o selezionat", -- src\editor\menu_edit.lua
+ ["Compilation error"] = "Errore di compilazione", -- src\editor\commands.lua, src\editor\debugger.lua
+ ["Compilation successful; %.0f%% success rate (%d/%d)."] = "Compilazione riuscita; tasso di successo : %.0f%% (%d/%d).", -- src\editor\commands.lua
+ ["Compile the current file"] = "Compila il file corrente", -- src\editor\menu_project.lua
+ ["Complete &Identifier"] = "Completa l'&Identificatore", -- src\editor\menu_edit.lua
+ ["Complete the current identifier"] = "Completa l'identificatore corrente", -- src\editor\menu_edit.lua
+ ["Consider removing backslash from escape sequence '%s'."] = "Prova a rimuovere i backslash dalla sequenza di escape '%s'.", -- src\editor\commands.lua
+ ["Copy Full Path"] = "Copia Path Completo", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Copy selected text to clipboard"] = "Copia il testo selezionato negli appunti", -- src\editor\menu_edit.lua
+ ["Correct &Indentation"] = "Correggi &Indentazione", -- src\editor\menu_edit.lua
+ ["Couldn't activate file '%s' for debugging; continuing without it."] = "Impossibile attivare il file '%s' per debug; si prosegue senza.", -- src\editor\debugger.lua
+ ["Create an empty document"] = "Crea un documento vuoto", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Cu&t"] = "&Taglia", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Cut selected text to clipboard"] = "Taglia il testo selezionato e mette negli appunti", -- src\editor\menu_edit.lua
+ ["Debugger server started at %s:%d."] = "Server Debugger iniziato %s:%d.", -- src\editor\debugger.lua
+ ["Debugger server stopped at %s:%d."] = "Server Debugger fermato %s:%d.", -- src\editor\debugger.lua
+ ["Debugging session completed (%s)."] = "Sessione di debug completata (%s).", -- src\editor\debugger.lua
+ ["Debugging session started in '%s'."] = "Sessione di debug iniziata da '%s'.", -- src\editor\debugger.lua
+ ["Debugging suspended at '%s:%s' (couldn't activate the file)."] = "Debug sospeso a '%s:%s' (impossibile attivare il file).", -- src\editor\debugger.lua
+ ["Detach &Process"] = "Scollega Processo", -- src\editor\menu_project.lua
+ ["Disable Indexing For '%s'"] = "Disabilita Indicizzazione per '%s'", -- src\editor\outline.lua
+ ["Do you want to delete '%s'?"] = "Vuoi eliminare '%s'?", -- src\editor\filetree.lua
+ ["Do you want to overwrite it?"] = "Vuoi sovrascrivere '%s'?", -- src\editor\commands.lua
+ ["Do you want to reload it?"] = "Vuoi ricaricarlo?", -- src\editor\editor.lua
+ ["Do you want to save the changes to '%s'?"] = "Vuoi salvare le modifiche a '%s'?", -- src\editor\commands.lua
+ ["E&xit"] = "Uscita", -- src\editor\menu_file.lua
+ ["Enable Indexing"] = "Abilita Indicizzazione", -- src\editor\outline.lua
+ ["Enter Lua code and press Enter to run it."] = "Inserisci codice Lua e premi <Enter> per eseguirlo.", -- src\editor\shellbox.lua
+ ["Enter command line parameters (use Cancel to clear)"] = "Inserisci i parametri riga di comando (Annulla per pulire)", -- src\editor\menu_project.lua
+ ["Enter replacement text"] = "Inserisci il testo da sostituire", -- src\editor\editor.lua
+ ["Error while loading API file: %s"] = "Errore durante il caricamento del file API: %s", -- src\editor\autocomplete.lua
+ ["Error while loading configuration file: %s"] = "Errore nel caricamento del file di configurazione: %s", -- src\editor\style.lua
+ ["Error while processing API file: %s"] = "Errore durante l'elaborazione del file API: %s", -- src\editor\autocomplete.lua
+ ["Error while processing configuration file: %s"] = "Errore durante l'elaborazione del file di configurazione: %s", -- src\editor\style.lua
+ ["Error"] = "Errore", -- src\editor\commands.lua
+ ["Evaluate In Console"] = "Elabora in console", -- src\editor\editor.lua
+ ["Execute the current project/file and keep updating the code to see immediate results"] = "Esegue il progetto/file corrente e permette di modificare il codice per vedere i risultati in tempo reale", -- src\editor\menu_project.lua
+ ["Execute the current project/file"] = "Esegue il progetto/file corrente", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Execution error"] = "Errore di esecuzione", -- src\editor\debugger.lua
+ ["Exit program"] = "Uscita dal programma", -- src\editor\menu_file.lua
+ ["File '%s' has been modified on disk."] = "Il file '%s' e' stato modificato sul disco.", -- src\editor\editor.lua
+ ["File '%s' has more recent timestamp than restored '%s'; please review before saving."] = "Il file '%s' ha un timestamp più recente di quello ripristinato '%s'; verificare prima di salvare.", -- src\editor\commands.lua
+ ["File '%s' is missing and can't be recovered."] = "Il file '%s' non è stato trovato e non può essere recuperato.", -- src\editor\commands.lua
+ ["File '%s' no longer exists."] = "Il file '%s' non esiste piu'.", -- src\editor\menu_file.lua, src\editor\editor.lua
+ ["File already exists."] = "Il file esiste già.", -- src\editor\commands.lua
+ ["File history"] = "Storia del file", -- src\editor\menu_file.lua
+ ["Find &In Files"] = "Ricerca nei files", -- src\editor\menu_search.lua
+ ["Find &Next"] = "Cerca il successivo", -- src\editor\menu_search.lua
+ ["Find &Previous"] = "Cerca il precedente", -- src\editor\menu_search.lua
+ ["Find and insert library function"] = "Trova e inserisci funzione di libreria", -- src\editor\menu_search.lua
+ ["Find and replace text in files"] = "Cerca e sostituisci testo nei files", -- src\editor\menu_search.lua
+ ["Find and replace text"] = "Cerca e sostituisci testo", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find in files"] = "Ricerca nei files", -- src\editor\toolbar.lua
+ ["Find text in files"] = "Cerca testo nei files", -- src\editor\menu_search.lua
+ ["Find text"] = "Cerca testo", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find the earlier text occurence"] = "Cerca la precedente occorrenza nel testo", -- src\editor\menu_search.lua
+ ["Find the next text occurrence"] = "Cerca la successiva occorrenza nel testo", -- src\editor\menu_search.lua
+ ["Find"] = "Ricerca", -- src\editor\toolbar.lua
+ ["Fold or unfold all code folds"] = "Apri o chiudi tutti i blocchi di codice", -- src\editor\menu_edit.lua
+ ["Formatting page %d..."] = "Formattazione pagina %d...", -- src\editor\print.lua
+ ["Found %d instance."] = {"Trovata %d istanza.", "Trovate %d istanze."}, -- src\editor\findreplace.lua
+ ["Found auto-recovery record and restored saved session."] = "Trovato punto di auto-revcovery e ripristinata la sessione salvata", -- src\editor\commands.lua
+ ["Full &Screen"] = "Schermo intero", -- src\editor\menu_view.lua
+ ["Go To Definition"] = "Vai a Definizione", -- src\editor\editor.lua
+ ["Go To File..."] = "Vai al File...", -- src\editor\menu_search.lua
+ ["Go To Line..."] = "Vai a riga...", -- src\editor\menu_search.lua
+ ["Go To Next Bookmark"] = "Vai al Prossimo Segnalibro", -- src\editor\menu_edit.lua
+ ["Go To Next Breakpoint"] = "Vai al Prossimo Punto di Interruzione", -- src\editor\menu_project.lua
+ ["Go To Previous Bookmark"] = "Vai al Precedente Segnalibro", -- src\editor\menu_edit.lua
+ ["Go To Previous Breakpoint"] = "Vail al Precedente Punto di Interruzione", -- src\editor\menu_project.lua
+ ["Go To Symbol..."] = "Vai al Simbolo...", -- src\editor\menu_search.lua
+ ["Go to file"] = "Vai al file", -- src\editor\menu_search.lua
+ ["Go to line"] = "Vai alla riga", -- src\editor\menu_search.lua
+ ["Go to symbol"] = "Vai al simbolo", -- src\editor\menu_search.lua
+ ["Hide '.%s' Files"] = "Nascondi Files '.%s'", -- src\editor\filetree.lua
+ ["INS"] = "INS", -- src\editor\editor.lua
+ ["Ignore and don't index symbols from files in the selected directory"] = "Ignora e non indicizzare simboli nella directory selezionata", -- src\editor\outline.lua
+ ["Ignored error in debugger initialization code: %s."] = "Errore ignorato durante l'inizializzaione del debugger codice: %s.", -- src\editor\debugger.lua
+ ["Indexing %d files: '%s'..."] = "Indicizzazione %d file: '%s'...", -- src\editor\outline.lua
+ ["Indexing completed."] = "Indicizzazione completata", -- src\editor\outline.lua
+ ["Insert Library Function..."] = "Inserisci Funzione di Libreria...", -- src\editor\menu_search.lua
+ ["Known Files"] = "Files conosciuti", -- src\editor\commands.lua
+ ["Ln: %d"] = "Ln: %d", -- src\editor\editor.lua
+ ["Local console"] = "Console locale", -- src\editor\gui.lua, src\editor\shellbox.lua
+ ["Lua &Interpreter"] = "&Interprete Lua", -- src\editor\menu_project.lua
+ ["Map Directory..."] = "Mappa directory...", -- src\editor\filetree.lua
+ ["Mapped remote request for '%s' to '%s'."] = "Richiesta remota '%s' mappata su '%s'.", -- src\editor\debugger.lua
+ ["Markers Window"] = "Finestra Marcatori", -- src\editor\menu_view.lua
+ ["Markers"] = "Marcatori", -- src\editor\markers.lua
+ ["Match case"] = "Maiuscole/Minuscole", -- src\editor\toolbar.lua
+ ["Match whole word"] = "Intera parola", -- src\editor\toolbar.lua
+ ["Mixed end-of-line encodings detected."] = "Trovata codifica Fine-Riga mista.", -- src\editor\commands.lua
+ ["Navigate"] = "Naviga", -- src\editor\menu_search.lua
+ ["New &File"] = "Nuovo &File", -- src\editor\filetree.lua
+ ["OVR"] = "OVR", -- src\editor\editor.lua
+ ["Open With Default Program"] = "Apri con programma predefinito", -- src\editor\filetree.lua
+ ["Open an existing document"] = "Apri un documento esistente", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Open file"] = "Apri un file", -- src\editor\commands.lua
+ ["Outline Window"] = "Finestra Outline", -- src\editor\menu_view.lua
+ ["Outline"] = "Outline", -- src\editor\outline.lua
+ ["Output (running)"] = "Output (in corso d'esecuzione)", -- src\editor\debugger.lua, src\editor\output.lua
+ ["Output (suspended)"] = "Output (sospeso)", -- src\editor\debugger.lua
+ ["Output"] = "Output", -- src\editor\debugger.lua, src\editor\output.lua, src\editor\gui.lua, src\editor\settings.lua
+ ["Page Setup..."] = "Impostazione Pagina...", -- src\editor\print.lua
+ ["Paste text from the clipboard"] = "Incolla testo dagli appunti", -- src\editor\menu_edit.lua
+ ["Preferences"] = "Preferenze", -- src\editor\menu_edit.lua
+ ["Prepend '!' to force local execution."] = "Prefissa con '!' per forzare l'esecuzione locale", -- src\editor\shellbox.lua
+ ["Prepend '=' to show complex values on multiple lines."] = "Prefissa con '=' per visualizzare valori complessi su piu` righe", -- src\editor\shellbox.lua
+ ["Press cancel to abort."] = "Premi cancel per bloccare.", -- src\editor\commands.lua
+ ["Print the current document"] = "Stampa il documento corrente", -- src\editor\print.lua
+ ["Program '%s' started in '%s' (pid: %d)."] = "Programma '%s' partito da '%s' (pid: %d).", -- src\editor\output.lua
+ ["Program can't start because conflicting process is running as '%s'."] = "Il programma non puo' partire perchè in conflitto con il processo in esecuzione '%s'.", -- src\editor\output.lua
+ ["Program completed in %.2f seconds (pid: %d)."] = "Programma completato in %.2f secondi (pid: %d).", -- src\editor\output.lua
+ ["Program starting as '%s'."] = "Programma partito da '%s'.", -- src\editor\output.lua
+ ["Program stopped (pid: %d)."] = "Programma fermato (pid: %d).", -- src\editor\debugger.lua
+ ["Program unable to run as '%s'."] = "Il programma non puo' partire '%s'.", -- src\editor\output.lua
+ ["Project Directory"] = "Directory del Progetto", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Project history"] = "Storia del Progetto", -- src\editor\menu_file.lua
+ ["Project"] = "Progetto", -- src\editor\filetree.lua
+ ["Project/&FileTree Window"] = "Progetto/Explorer", -- src\editor\menu_view.lua
+ ["Provide command line parameters"] = "Fornire parametri riga di comando", -- src\editor\menu_project.lua
+ ["Queued %d files to index."] = "Accodati %d file per indicizzazione.", -- src\editor\menu_search.lua
+ ["R/O"] = "R/O", -- src\editor\editor.lua
+ ["R/W"] = "R/W", -- src\editor\editor.lua
+ ["Re&place In Files"] = "Sostituisci nei files", -- src\editor\menu_search.lua
+ ["Re-indent selected lines"] = "Re-indenta le linee selezionate", -- src\editor\menu_edit.lua
+ ["Reached end of selection and wrapped around."] = "Raggiunta la fine della selezione e ricominciato da inizio ", -- src\editor\findreplace.lua
+ ["Reached end of text and wrapped around."] = "Raggiunta la fine del testo e ricominciato da inizio", -- src\editor\findreplace.lua
+ ["Recent Files"] = "Files recenti", -- src\editor\menu_file.lua
+ ["Recent Projects"] = "Progetti Recenti", -- src\editor\menu_file.lua
+ ["Redo last edit undone"] = "Ripeti l'ultima azione annullata", -- src\editor\menu_edit.lua
+ ["Refresh Index"] = "Aggiorna Indici", -- src\editor\outline.lua
+ ["Refresh indexed symbols from files in the selected directory"] = "Aggiorna simboli indicizzati dai files nella directory selezionata", -- src\editor\outline.lua
+ ["Refresh"] = "Rinfrescare", -- src\editor\filetree.lua
+ ["Refused a request to start a new debugging session as there is one in progress already."] = "Impossibile aprire una nuova sessione di debug in quanto ne esiste una in corso", -- src\editor\debugger.lua
+ ["Regular expression"] = "Regular expression", -- src\editor\toolbar.lua
+ ["Remote console"] = "Console remota", -- src\editor\shellbox.lua
+ ["Rename All Instances"] = "Rinomina tutte le occorrenze", -- src\editor\editor.lua
+ ["Replace All Selections"] = "Sostituisci Tutte le Selezioni", -- src\editor\editor.lua
+ ["Replace all"] = "Sostituisci Tutto", -- src\editor\toolbar.lua
+ ["Replace next instance"] = "Sostituisci istanza successiva", -- src\editor\toolbar.lua
+ ["Replaced %d instance."] = {"Sostituita %d istanza.", "Sostituite %d istanze."}, -- src\editor\findreplace.lua
+ ["Replaced an invalid UTF8 character with %s."] = "Sostituito un carattere UTF8 invalido con %s.", -- src\editor\commands.lua
+ ["Reset to default layout"] = "Ritorna al default layout", -- src\editor\menu_view.lua
+ ["Run As Scratchpad"] = "Esegui in Scratchpad (Live coding)", -- src\editor\menu_project.lua
+ ["Run To Cursor"] = "Esegui fino al Cursore", -- src\editor\menu_project.lua, src\editor\editor.lua
+ ["Run as Scratchpad"] = "Esegui in Scratchpad (Live coding)", -- src\editor\toolbar.lua
+ ["Run to cursor"] = "Esegui fino al cursore", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["S&top Debugging"] = "Ferma il debugger", -- src\editor\menu_project.lua
+ ["S&top Process"] = "Ferma il processo", -- src\editor\menu_project.lua
+ ["Save &As..."] = "S&alva con nome...", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["Save A&ll"] = "Sa&lva tutto", -- src\editor\menu_file.lua
+ ["Save Changes?"] = "Vuoi salvare le modifiche?", -- src\editor\commands.lua
+ ["Save all open documents"] = "Salva tutti i documenti aperti", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Save file as"] = "Salva il file con nome", -- src\editor\commands.lua
+ ["Save file?"] = "Vuoi salvare il file?", -- src\editor\commands.lua
+ ["Save the current document to a file with a new name"] = "Salva il documento corrente in un file con un nuovo nome", -- src\editor\menu_file.lua
+ ["Save the current document"] = "Salva il documento corrente", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Saved auto-recover at %s."] = "Salvato auto-recover a %s.", -- src\editor\commands.lua
+ ["Scratchpad error"] = "Errore durente Scratchpad", -- src\editor\debugger.lua
+ ["Search direction"] = "Direzione ricerca", -- src\editor\toolbar.lua
+ ["Search in selection"] = "Ricerca nella selezione", -- src\editor\toolbar.lua
+ ["Search in subdirectories"] = "Ricerca nelle sotto-directory", -- src\editor\toolbar.lua
+ ["Searching for '%s'."] = "Ricerca di '%s'.", -- src\editor\findreplace.lua
+ ["Sel: %d/%d"] = "Sel: %d/%d", -- src\editor\editor.lua
+ ["Select &All"] = "Selezion&a Tutto", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Select And Find Next"] = "Seleziona e trova successivo", -- src\editor\menu_search.lua
+ ["Select And Find Previous"] = "Seleziona e trova precedente", -- src\editor\menu_search.lua
+ ["Select all text in the editor"] = "Seleziona tutto il testo nell'editor", -- src\editor\menu_edit.lua
+ ["Select the word under cursor and find its next occurrence"] = "Seleziona la parola e trova successivo", -- src\editor\menu_search.lua
+ ["Select the word under cursor and find its previous occurrence"] = "Seleziona la parola e trova precedente", -- src\editor\menu_search.lua
+ ["Set As Start File"] = "Imposta come File di Partenza", -- src\editor\filetree.lua
+ ["Set From Current File"] = "Impostato da file corrente", -- src\editor\menu_project.lua
+ ["Set To Project Directory"] = "Imposta a Directory di Progetto", -- src\editor\findreplace.lua
+ ["Set To Selected Directory"] = "Imposta a Directory Selezionata", -- src\editor\filetree.lua
+ ["Set project directory from current file"] = "Definisci la directory del progeetto dal file corrente", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Set project directory to the selected one"] = "Imposta la directory di progetto dalla directory selezionata", -- src\editor\filetree.lua
+ ["Set search directory"] = "Imposta directory ricerca", -- src\editor\toolbar.lua
+ ["Set the interpreter to be used"] = "Definisci l'interprete da utilizzare", -- src\editor\menu_project.lua
+ ["Set the project directory to be used"] = "Imposta la directory di progetto da usare", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Settings: System"] = "Impostazioni: Sistema", -- src\editor\menu_edit.lua
+ ["Settings: User"] = "Impostazioni: Utente", -- src\editor\menu_edit.lua
+ ["Show &Tooltip"] = "Mos&tra i consigli", -- src\editor\menu_edit.lua
+ ["Show All Files"] = "Mostra Tutti i File", -- src\editor\filetree.lua
+ ["Show Hidden Files"] = "Mostra File nascosti", -- src\editor\filetree.lua
+ ["Show Location"] = "Mostra posizione", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Show all files"] = "Mostra tutti i file", -- src\editor\filetree.lua
+ ["Show context"] = "Mostra contesto", -- src\editor\toolbar.lua
+ ["Show files previously hidden"] = "Mostra i file precedentemente nascosti", -- src\editor\filetree.lua
+ ["Show multiple result windows"] = "Mostra più finestre dei risultati", -- src\editor\toolbar.lua
+ ["Show tooltip for current position; place cursor after opening bracket of function"] = "Mostra i consigli per la posizione corrente; muovi il cursore dopo la parentesi o la funzione", -- src\editor\menu_edit.lua
+ ["Show/Hide the status bar"] = "Mostra/Nascondi la barra di stato", -- src\editor\menu_view.lua
+ ["Show/Hide the toolbar"] = "Mostra/Nascondi la barra degli strumenti", -- src\editor\menu_view.lua
+ ["Sort By Name"] = "Ordina per Nome", -- src\editor\outline.lua
+ ["Sort selected lines"] = "Ordina le righe selezionate", -- src\editor\menu_edit.lua
+ ["Source"] = "Sorgente", -- src\editor\menu_edit.lua
+ ["Stack"] = "Stack", -- src\editor\debugger.lua
+ ["Start &Debugging"] = "Inizia il &Debug", -- src\editor\menu_project.lua
+ ["Start or continue debugging"] = "Inizia o continua il debug", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step &Into"] = "Step &Into", -- src\editor\menu_project.lua
+ ["Step &Over"] = "Step &Over", -- src\editor\menu_project.lua
+ ["Step O&ut"] = "Step O&ut", -- src\editor\menu_project.lua
+ ["Step into"] = "Step into", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step out of the current function"] = "Contina fino all'uscita della funzione", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step over"] = "Continua senza entrare nella funzione", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop debugging and continue running the process"] = "Ferma il debug e continua l'esecuzione del processo", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop the currently running process"] = "Ferma il processo in esecuzione", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Switch to or from full screen mode"] = "Passa da tutto schermo a finestra", -- src\editor\menu_view.lua
+ ["Symbol Index"] = "Indice Simboli", -- src\editor\outline.lua
+ ["Text not found."] = "Testo non trovato.", -- src\editor\findreplace.lua
+ ["The API file must be located in a subdirectory of the API directory."] = "Il file API deve essere presente in una sottodirectory o nella direcotory API.", -- src\editor\autocomplete.lua
+ ["Toggle Bookmark"] = "Attiva/Disattiva Segnalibro", -- src\editor\markers.lua, src\editor\menu_edit.lua
+ ["Toggle Breakpoint"] = "Attiva/Disattiva Breakpoint", -- src\editor\markers.lua, src\editor\menu_project.lua
+ ["Toggle bookmark"] = "Attiva/Disattiva Segnalibro", -- src\editor\toolbar.lua, src\editor\menu_edit.lua, src\editor\markers.lua
+ ["Toggle breakpoint"] = "Attiva/Disattiva Breakpoint", -- src\editor\markers.lua, src\editor\toolbar.lua
+ ["Tr&ace"] = "Tr&ace", -- src\editor\menu_project.lua
+ ["Trace execution showing each executed line"] = "Traccia l'esecuzione mostrando le righe eseguite", -- src\editor\menu_project.lua
+ ["Unable to create directory '%s'."] = "Impossibile creare la directory '%s'.", -- src\editor\filetree.lua
+ ["Unable to create file '%s'."] = "Impossibile creare il file '%s'.", -- src\editor\filetree.lua
+ ["Unable to delete directory '%s': %s"] = "Impossibile cancellare la directory '%s': %s", -- src\editor\filetree.lua
+ ["Unable to delete file '%s': %s"] = "Impossibile cancellare file '%s': %s", -- src\editor\filetree.lua
+ ["Unable to load file '%s'."] = "Impossibile aprire il file '%s'.", -- src\editor\commands.lua
+ ["Unable to rename file '%s'."] = "Impossibile rinominare il file '%s'.", -- src\editor\filetree.lua
+ ["Unable to save file '%s': %s"] = "Impossibile salvare il file '%s': %s", -- src\editor\commands.lua
+ ["Unable to stop program (pid: %d), code %d."] = "Impossibile fermare il programma (pid: %d), code %d.", -- src\editor\debugger.lua
+ ["Undo last edit"] = "Annulla l'ultima azione di edit", -- src\editor\menu_edit.lua
+ ["Unmap Directory"] = "Togli mappatura Directory", -- src\editor\filetree.lua
+ ["Unset '%s' As Start File"] = "Togli '%s' come File di Partenza", -- src\editor\filetree.lua
+ ["Updated %d file."] = {"Aggiornato %d file.", "Aggiornati %d file."}, -- src\editor\findreplace.lua
+ ["Updating symbol index and settings..."] = "Aggiornamento indice simbili e impostazioni...", -- src\editor\outline.lua
+ ["Use %s to close."] = "Utilizza %s per chiudere.", -- src\editor\findreplace.lua
+ ["Use '%s' to see full description."] = "Utilizza '%s' per vedere la descrizione completa.", -- src\editor\editor.lua
+ ["Use '%s' to show line endings and '%s' to convert them."] = "Utilizza '%s' per vedere la fine della riga e '%s' per convertirli.", -- src\editor\commands.lua
+ ["Use 'clear' to clear the shell output and the history."] = "Utilizza 'clear' per pulire l`output e lo storico.", -- src\editor\shellbox.lua
+ ["Use Shift-Enter for multiline code."] = "Premi <Shift-Invio> per inserire piu` righe di codice.", -- src\editor\shellbox.lua
+ ["View the markers window"] = "Visualizza la finestra dei marcatori", -- src\editor\menu_view.lua
+ ["View the outline window"] = "Visualizza la finestra di outline", -- src\editor\menu_view.lua
+ ["View the output/console window"] = "Mostra la finestra di output/console", -- src\editor\menu_view.lua
+ ["View the project/filetree window"] = "Mostra la finestra di progetto/explorer", -- src\editor\menu_view.lua
+ ["View the stack window"] = "Mostra la finestra dello Stack", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["View the watch window"] = "Mostra la finestra delle Espressioni di Controllo", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["Watch"] = "Watch", -- src\editor\debugger.lua
+ ["Welcome to the interactive Lua interpreter."] = "Benvenuti nell`interprete interattivo Lua.", -- src\editor\shellbox.lua
+ ["Wrap around"] = "Wrap around", -- src\editor\toolbar.lua
+ ["You must save the program first."] = "Devi prima salvare il programma", -- src\editor\commands.lua
+ ["Zoom In"] = "Zoom In", -- src\editor\menu_view.lua
+ ["Zoom Out"] = "Zoom Out", -- src\editor\menu_view.lua
+ ["Zoom to 100%"] = "Zoom a 100%", -- src\editor\menu_view.lua
+ ["Zoom"] = "Zoom", -- src\editor\menu_view.lua
+ ["on line %d"] = "alla linea %d", -- src\editor\debugger.lua, src\editor\editor.lua, src\editor\commands.lua
+ ["traced %d instruction"] = {"tracciata %d istruzione", "%d istruzioni tracciate"}, -- src\editor\debugger.lua
+ ["unknown error"] = "errore sconosciuto", -- src\editor\debugger.lua
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/pt-br.lua b/love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/pt-br.lua
new file mode 100644
index 0000000..42f3220
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/pt-br.lua
@@ -0,0 +1,347 @@
+--- @author Evandro Costa <evandro.co>
+--- @date 26/12/2014
+return {
+ [0] = function(c) return c == 1 and 1 or 2 end, -- plural
+ ["%s event failed: %s"] = "Evento %s falhou: %s", -- src\editor\package.lua
+ ["%s%% formatted..."] = nil, -- src\editor\print.lua
+ ["%s%% loaded..."] = nil, -- src\editor\commands.lua
+ ["&About"] = "Sobre", -- src\editor\menu_help.lua
+ ["&Add Watch"] = "&Adicionar observador", -- src\editor\debugger.lua
+ ["&Break"] = "Interromper", -- src\editor\menu_project.lua
+ ["&Close Page"] = "Fe&char guia", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Community"] = "&Comunidade", -- src\editor\menu_help.lua
+ ["&Compile"] = "&Compilar", -- src\editor\menu_project.lua
+ ["&Copy Value"] = nil, -- src\editor\debugger.lua
+ ["&Copy"] = "&Copiar", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Default Layout"] = "Re&definir painéis", -- src\editor\menu_view.lua
+ ["&Delete Watch"] = "Remover observa&dor", -- src\editor\debugger.lua
+ ["&Delete"] = "Apagar", -- src\editor\filetree.lua
+ ["&Documentation"] = "&Documentação", -- src\editor\menu_help.lua
+ ["&Edit Project Directory"] = "&Editar pasta do projeto", -- src\editor\filetree.lua
+ ["&Edit Value"] = "&Editar valor", -- src\editor\debugger.lua
+ ["&Edit Watch"] = "&Editar observador", -- src\editor\debugger.lua
+ ["&Edit"] = "&Editar", -- src\editor\menu_edit.lua
+ ["&File"] = "Arquivo", -- src\editor\menu_file.lua
+ ["&Find"] = "Localizar", -- src\editor\menu_search.lua
+ ["&Fold/Unfold All"] = "Expandir/Recolher tudo", -- src\editor\menu_edit.lua
+ ["&Frequently Asked Questions"] = "Perguntas &frequentes", -- src\editor\menu_help.lua
+ ["&Getting Started Guide"] = "Primeiros passos", -- src\editor\menu_help.lua
+ ["&Help"] = "Ajuda", -- src\editor\menu_help.lua
+ ["&New Directory"] = "&Nova pasta", -- src\editor\filetree.lua
+ ["&New"] = "&Novo", -- src\editor\menu_file.lua
+ ["&Open..."] = "Abrir...", -- src\editor\menu_file.lua
+ ["&Output/Console Window"] = "Saída/Console", -- src\editor\menu_view.lua
+ ["&Paste"] = "Colar", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Print..."] = nil, -- src\editor\print.lua
+ ["&Project Page"] = "&Página do projeto", -- src\editor\menu_help.lua
+ ["&Project"] = "&Projeto", -- src\editor\menu_project.lua
+ ["&Redo"] = "&Refazer", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Rename"] = "&Renomear", -- src\editor\filetree.lua
+ ["&Replace"] = "Substitui&r", -- src\editor\menu_search.lua
+ ["&Run"] = "Executa&r", -- src\editor\menu_project.lua
+ ["&Save"] = "&Salvar", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Search"] = "Localizar", -- src\editor\menu_search.lua
+ ["&Select Command"] = nil, -- src\editor\gui.lua
+ ["&Sort"] = "Ordenar", -- src\editor\menu_edit.lua
+ ["&Stack Window"] = "Pilha de execução", -- src\editor\menu_view.lua
+ ["&Start Debugger Server"] = "Iniciar &servidor de depuração", -- src\editor\menu_project.lua
+ ["&Status Bar"] = "Barra de &status", -- src\editor\menu_view.lua
+ ["&Tool Bar"] = "Barra de ferramen&tas", -- src\editor\menu_view.lua
+ ["&Tutorials"] = "&Tutoriais", -- src\editor\menu_help.lua
+ ["&Undo"] = "Desfazer", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&View"] = "Exibir", -- src\editor\menu_view.lua
+ ["&Watch Window"] = "Observador", -- src\editor\menu_view.lua
+ ["About %s"] = "Sobre %s", -- src\editor\menu_help.lua
+ ["Add To Scratchpad"] = "Adicionar ao rascunho", -- src\editor\editor.lua
+ ["Add Watch Expression"] = "Adicionar observador", -- src\editor\editor.lua
+ ["All files"] = "Todos os arquivos", -- src\editor\commands.lua
+ ["Allow external process to start debugging"] = "Permitir processo externo para iniciar a depuração", -- src\editor\menu_project.lua
+ ["Analyze the source code"] = "Analisar o código-fonte", -- src\editor\inspect.lua
+ ["Analyze"] = "Analisar", -- src\editor\inspect.lua
+ ["Auto Complete Identifiers"] = "Autocompletar identificadores", -- src\editor\menu_edit.lua
+ ["Auto complete while typing"] = "Autocompletar ao digitar", -- src\editor\menu_edit.lua
+ ["Binary file is shown as read-only as it is only partially loaded."] = nil, -- src\editor\commands.lua
+ ["Bookmark"] = "Marcador", -- src\editor\menu_edit.lua
+ ["Break execution at the next executed line of code"] = "Interromper execução na próxima linha de código", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Breakpoint"] = nil, -- src\editor\menu_project.lua
+ ["C&lear Console Window"] = nil, -- src\editor\gui.lua
+ ["C&lear Output Window"] = "&Limpar janela de saída", -- src\editor\gui.lua, src\editor\menu_project.lua
+ ["C&omment/Uncomment"] = "C&omentar/Descomentar", -- src\editor\menu_edit.lua
+ ["Can't evaluate the expression while the application is running."] = "Impossível executar a expressão enquanto a aplicação estiver em execução.", -- src\editor\debugger.lua
+ ["Can't open file '%s': %s"] = "Impossível abrir o arquivo '%s': %s", -- src\editor\findreplace.lua, src\editor\singleinstance.lua, src\editor\inspect.lua, src\editor\outline.lua
+ ["Can't process auto-recovery record; invalid format: %s."] = "Impossível de processar registro de autorrecuperação; formato inválido: %s.", -- src\editor\commands.lua
+ ["Can't replace in read-only text."] = nil, -- src\editor\findreplace.lua
+ ["Can't run the entry point script ('%s')."] = "Impossível de executar o ponto de entrada do script ('%s').", -- src\editor\debugger.lua
+ ["Can't start debugger server at %s:%d: %s."] = "Impossível de iniciar o sevidor de depuração em %s:%d: %s.", -- src\editor\debugger.lua
+ ["Can't start debugging for '%s'."] = nil, -- src\editor\debugger.lua
+ ["Can't start debugging session due to internal error '%s'."] = "Impossível iniciar sessão de depuração devido ao erro interno '%s'.", -- src\editor\debugger.lua
+ ["Can't start debugging without an opened file or with the current file not being saved ('%s')."] = "Impossível iniciar depuração sem abrir um arquivo ou se o arquivo atual não foi salvo ainda ('%s').", -- src\editor\debugger.lua
+ ["Can't stop debugger server as it is not started."] = "Impossível interromper servidor de depuração se ele não foi iniciado.", -- src\editor\debugger.lua
+ ["Cancelled by the user."] = "Cancelado pelo usuário", -- src\editor\findreplace.lua
+ ["Choose a directory to map"] = nil, -- src\editor\filetree.lua
+ ["Choose a project directory"] = "Selecionar pasta do projeto", -- src\editor\toolbar.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Choose a search directory"] = nil, -- src\editor\findreplace.lua
+ ["Choose..."] = "Selecionar...", -- src\editor\findreplace.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Clear Items"] = "Limpar itens", -- src\editor\findreplace.lua, src\editor\menu_file.lua
+ ["Clear items from this list"] = "Limpar itens desta lista", -- src\editor\menu_file.lua
+ ["Clear the output window before compiling or debugging"] = "Limpar janela de saída antes de compilar ou depurar", -- src\editor\menu_project.lua
+ ["Close &Other Pages"] = "Fechar &outras guias", -- src\editor\gui.lua
+ ["Close A&ll Pages"] = "Fechar todas as guias", -- src\editor\gui.lua
+ ["Close the current editor window"] = "Fechar janela do editor atual", -- src\editor\menu_file.lua
+ ["Co&ntinue"] = "Co&ntinuar", -- src\editor\menu_project.lua
+ ["Col: %d"] = "Col: %d", -- src\editor\editor.lua
+ ["Command Line Parameters..."] = "Parâmetros da linha de comandos...", -- src\editor\menu_project.lua
+ ["Command line parameters"] = "Parâmetros da linha de comandos", -- src\editor\menu_project.lua
+ ["Comment or uncomment current or selected lines"] = {"Comentar ou descomentar a linha atual", "Comentar ou descomentar as linhas selecionadas"}, -- src\editor\menu_edit.lua
+ ["Compilation error"] = "Erro na compilação", -- src\editor\commands.lua, src\editor\debugger.lua
+ ["Compilation successful; %.0f%% success rate (%d/%d)."] = "Compilação com êxito; taxa de sucesso: %.0f%% (%d/%d).", -- src\editor\commands.lua
+ ["Compile the current file"] = "Compilar arquivo atual", -- src\editor\menu_project.lua
+ ["Complete &Identifier"] = "Completar &identificador", -- src\editor\menu_edit.lua
+ ["Complete the current identifier"] = "Completar o identificador atual", -- src\editor\menu_edit.lua
+ ["Consider removing backslash from escape sequence '%s'."] = "Considere a remoção da contrabarra da sequência de escape '%s'.", -- src\editor\commands.lua
+ ["Copy Full Path"] = "Copiar o caminho completo", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Copy selected text to clipboard"] = "Copiar texto selecionado para a área de transfêrencia", -- src\editor\menu_edit.lua
+ ["Correct &Indentation"] = "Corr&igir recuo", -- src\editor\menu_edit.lua
+ ["Couldn't activate file '%s' for debugging; continuing without it."] = "Impossível ativar o arquivo '%s' para a depuração; continuando sem ele.", -- src\editor\debugger.lua
+ ["Create an empty document"] = "Criar um documento em branco", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Cu&t"] = "Recor&tar", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Cut selected text to clipboard"] = "Recortar texto selecionado para a área de transfêrencia", -- src\editor\menu_edit.lua
+ ["Debugger server started at %s:%d."] = "Servidor de depuração iniciado em %s:%d.", -- src\editor\debugger.lua
+ ["Debugger server stopped at %s:%d."] = "Servidor de depuração interrompido em %s:%d.", -- src\editor\debugger.lua
+ ["Debugging session completed (%s)."] = "Sessão de depuração completada (%s).", -- src\editor\debugger.lua
+ ["Debugging session started in '%s'."] = "Sessão de depuração iniciada em '%s'.", -- src\editor\debugger.lua
+ ["Debugging suspended at '%s:%s' (couldn't activate the file)."] = "Depuração suspendida em '%s:%s' (impossível ativar o arquivo).", -- src\editor\debugger.lua
+ ["Detach &Process"] = "Separar &processo", -- src\editor\menu_project.lua
+ ["Disable Indexing For '%s'"] = nil, -- src\editor\outline.lua
+ ["Do you want to delete '%s'?"] = "Deseja mesmo apagar '%s'?", -- src\editor\filetree.lua
+ ["Do you want to overwrite it?"] = "Deseja mesmo sobrescrevê-lo?", -- src\editor\commands.lua
+ ["Do you want to reload it?"] = "Deseja mesmo atualizá-lo?", -- src\editor\editor.lua
+ ["Do you want to save the changes to '%s'?"] = "Deseja salvar as alterações em '%s'?", -- src\editor\commands.lua
+ ["E&xit"] = "Sair", -- src\editor\menu_file.lua
+ ["Enable Indexing"] = nil, -- src\editor\outline.lua
+ ["Enter Lua code and press Enter to run it."] = "Digite o código Lua e pressione Enter para executá-lo.", -- src\editor\shellbox.lua
+ ["Enter command line parameters (use Cancel to clear)"] = "Digite os parâmetros da linha de comandos (use Cancelar para limpar)", -- src\editor\menu_project.lua
+ ["Enter replacement text"] = "Digite o texto para substituir", -- src\editor\editor.lua
+ ["Error while loading API file: %s"] = "Erro ao carregar arquivo de API: %s", -- src\editor\autocomplete.lua
+ ["Error while loading configuration file: %s"] = "Erro ao carregar arquivo de configuração: %s", -- src\editor\style.lua
+ ["Error while processing API file: %s"] = "Erro ao processar arquivo de API: %s", -- src\editor\autocomplete.lua
+ ["Error while processing configuration file: %s"] = "Erro ao processar arquivo de configuração: %s", -- src\editor\style.lua
+ ["Error"] = "Erro", -- src\editor\commands.lua
+ ["Evaluate In Console"] = "Executar no console", -- src\editor\editor.lua
+ ["Execute the current project/file and keep updating the code to see immediate results"] = "Executar o projeto/arquivo atual, mantendo o código atualizado para ver os resultados em tempo real", -- src\editor\menu_project.lua
+ ["Execute the current project/file"] = "Executar o projeto/arquivo atual", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Execution error"] = "Erro na execução", -- src\editor\debugger.lua
+ ["Exit program"] = "Sair do programa", -- src\editor\menu_file.lua
+ ["File '%s' has been modified on disk."] = "Arquivo '%s' foi alterado no disco.", -- src\editor\editor.lua
+ ["File '%s' has more recent timestamp than restored '%s'; please review before saving."] = "Arquivo '%s' possui uma data mais recente do que o restaurado '%s'; verifique antes de salvar.", -- src\editor\commands.lua
+ ["File '%s' is missing and can't be recovered."] = "Arquivo '%s' está faltando e não pode ser restaurado.", -- src\editor\commands.lua
+ ["File '%s' no longer exists."] = "Arquivo '%s' não existe mais.", -- src\editor\menu_file.lua, src\editor\editor.lua
+ ["File already exists."] = "Arquivo já existe", -- src\editor\commands.lua
+ ["File history"] = "Histórico do arquivo", -- src\editor\menu_file.lua
+ ["Find &In Files"] = "Local&izar em arquivos", -- src\editor\menu_search.lua
+ ["Find &Next"] = "Localizar próximo", -- src\editor\menu_search.lua
+ ["Find &Previous"] = "Localizar anterior", -- src\editor\menu_search.lua
+ ["Find and insert library function"] = "Localizar e inserir função de biblioteca", -- src\editor\menu_search.lua
+ ["Find and replace text in files"] = "Localizar e substituir texto em arquivos", -- src\editor\menu_search.lua
+ ["Find and replace text"] = "Localizar e substituir texto", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find in files"] = "Localizar em arquivos", -- src\editor\toolbar.lua
+ ["Find text in files"] = "Localizar texto em arquivos", -- src\editor\menu_search.lua
+ ["Find text"] = "Localizar texto", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find the earlier text occurence"] = "Localizar a ocorrência anterior do texto", -- src\editor\menu_search.lua
+ ["Find the next text occurrence"] = "Localizar a ocorrência posterior do texto", -- src\editor\menu_search.lua
+ ["Find"] = "Localizar", -- src\editor\toolbar.lua
+ ["Fold or unfold all code folds"] = "Expandir ou recolher todos os blocos do código", -- src\editor\menu_edit.lua
+ ["Formatting page %d..."] = nil, -- src\editor\print.lua
+ ["Found %d instance."] = {}, -- src\editor\findreplace.lua
+ ["Found auto-recovery record and restored saved session."] = "Registro de autorrecuperação encontrado e sessão restaurada.", -- src\editor\commands.lua
+ ["Full &Screen"] = "Tela inteira", -- src\editor\menu_view.lua
+ ["Go To Definition"] = "Ir para a definição", -- src\editor\editor.lua
+ ["Go To File..."] = "Ir para o arquivo...", -- src\editor\menu_search.lua
+ ["Go To Line..."] = "Ir para a linha...", -- src\editor\menu_search.lua
+ ["Go To Next Bookmark"] = "Ir para o próximo marcador", -- src\editor\menu_edit.lua
+ ["Go To Next Breakpoint"] = nil, -- src\editor\menu_project.lua
+ ["Go To Previous Bookmark"] = "Ir para o marcador anterior", -- src\editor\menu_edit.lua
+ ["Go To Previous Breakpoint"] = nil, -- src\editor\menu_project.lua
+ ["Go To Symbol..."] = "Ir para o símbolo...", -- src\editor\menu_search.lua
+ ["Go to file"] = "Ir para o arquivo", -- src\editor\menu_search.lua
+ ["Go to line"] = "Ir para a linha", -- src\editor\menu_search.lua
+ ["Go to symbol"] = "Ir para o símbolo", -- src\editor\menu_search.lua
+ ["Hide '.%s' Files"] = "Ocultar arquivos '.%s'", -- src\editor\filetree.lua
+ ["INS"] = "INS", -- src\editor\editor.lua
+ ["Ignore and don't index symbols from files in the selected directory"] = nil, -- src\editor\outline.lua
+ ["Ignored error in debugger initialization code: %s."] = "Erro ignorado no código de inicialização do depurador: %s.", -- src\editor\debugger.lua
+ ["Indexing %d files: '%s'..."] = nil, -- src\editor\outline.lua
+ ["Indexing completed."] = nil, -- src\editor\outline.lua
+ ["Insert Library Function..."] = "Inserir função de biblioteca...", -- src\editor\menu_search.lua
+ ["Known Files"] = "Arquivos conhecidos", -- src\editor\commands.lua
+ ["Ln: %d"] = "Ln: %d", -- src\editor\editor.lua
+ ["Local console"] = "Console local", -- src\editor\gui.lua, src\editor\shellbox.lua
+ ["Lua &Interpreter"] = "&Interpretador Lua", -- src\editor\menu_project.lua
+ ["Map Directory..."] = nil, -- src\editor\filetree.lua
+ ["Mapped remote request for '%s' to '%s'."] = "Solicitação remota '%s' mapeada para '%s'.", -- src\editor\debugger.lua
+ ["Markers Window"] = nil, -- src\editor\menu_view.lua
+ ["Markers"] = nil, -- src\editor\markers.lua
+ ["Match case"] = "Diferenciar maiúsc/minúsc", -- src\editor\toolbar.lua
+ ["Match whole word"] = "Somente palavras inteiras", -- src\editor\toolbar.lua
+ ["Mixed end-of-line encodings detected."] = "Multíplas codificações de fim-de-linha encontradas.", -- src\editor\commands.lua
+ ["Navigate"] = "Navegar", -- src\editor\menu_search.lua
+ ["New &File"] = "Novo arquivo", -- src\editor\filetree.lua
+ ["OVR"] = "OVR", -- src\editor\editor.lua
+ ["Open With Default Program"] = "Abrir com o programa padrão", -- src\editor\filetree.lua
+ ["Open an existing document"] = "Abrir um documento existente", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Open file"] = "Abrir arquivo", -- src\editor\commands.lua
+ ["Outline Window"] = "Saída", -- src\editor\menu_view.lua
+ ["Outline"] = "Definições", -- src\editor\outline.lua
+ ["Output (running)"] = "Saída (executando)", -- src\editor\debugger.lua, src\editor\output.lua
+ ["Output (suspended)"] = "Saída (suspendido)", -- src\editor\debugger.lua
+ ["Output"] = "Saída", -- src\editor\debugger.lua, src\editor\output.lua, src\editor\gui.lua, src\editor\settings.lua
+ ["Page Setup..."] = nil, -- src\editor\print.lua
+ ["Paste text from the clipboard"] = "Colar texto da área de transfêrencia", -- src\editor\menu_edit.lua
+ ["Preferences"] = "Preferências", -- src\editor\menu_edit.lua
+ ["Prepend '!' to force local execution."] = "Prefixe com '!' para forçar a execução local.", -- src\editor\shellbox.lua
+ ["Prepend '=' to show complex values on multiple lines."] = "Prefixe com '=' para exibir valores complexos em multíplas linhas.", -- src\editor\shellbox.lua
+ ["Press cancel to abort."] = "Pressionar cancelar para abortar.", -- src\editor\commands.lua
+ ["Print the current document"] = nil, -- src\editor\print.lua
+ ["Program '%s' started in '%s' (pid: %d)."] = "Programa '%s' iniciado em '%s' (pid: %d).", -- src\editor\output.lua
+ ["Program can't start because conflicting process is running as '%s'."] = "Impossível iniciar programa porque um processo conflitante está em execução como '%s'.", -- src\editor\output.lua
+ ["Program completed in %.2f seconds (pid: %d)."] = "Programa completado em %.2f segundos (pid: %d).", -- src\editor\output.lua
+ ["Program starting as '%s'."] = "Iniciando programa como '%s'.", -- src\editor\output.lua
+ ["Program stopped (pid: %d)."] = "Programa interrompido (pid: %d).", -- src\editor\debugger.lua
+ ["Program unable to run as '%s'."] = "Impossível de executar programa como '%s'.", -- src\editor\output.lua
+ ["Project Directory"] = "Pasta do projeto", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Project history"] = "Histórico do projeto", -- src\editor\menu_file.lua
+ ["Project"] = "Projeto", -- src\editor\filetree.lua
+ ["Project/&FileTree Window"] = "Projeto/Hierarquia de arquivos", -- src\editor\menu_view.lua
+ ["Provide command line parameters"] = "Informar os parâmetros da linha de comandos", -- src\editor\menu_project.lua
+ ["Queued %d files to index."] = nil, -- src\editor\menu_search.lua
+ ["R/O"] = "R/O", -- src\editor\editor.lua
+ ["R/W"] = "R/W", -- src\editor\editor.lua
+ ["Re&place In Files"] = "Substituir em arquivos", -- src\editor\menu_search.lua
+ ["Re-indent selected lines"] = "Inserir recuos nas linhas selecionadas", -- src\editor\menu_edit.lua
+ ["Reached end of selection and wrapped around."] = nil, -- src\editor\findreplace.lua
+ ["Reached end of text and wrapped around."] = nil, -- src\editor\findreplace.lua
+ ["Recent Files"] = "Arquivos recentes", -- src\editor\menu_file.lua
+ ["Recent Projects"] = "Projetos recentes", -- src\editor\menu_file.lua
+ ["Redo last edit undone"] = "Refazer última edição desfeita", -- src\editor\menu_edit.lua
+ ["Refresh Index"] = nil, -- src\editor\outline.lua
+ ["Refresh indexed symbols from files in the selected directory"] = nil, -- src\editor\outline.lua
+ ["Refresh"] = "Refrescar", -- src\editor\filetree.lua
+ ["Refused a request to start a new debugging session as there is one in progress already."] = "Solicitação de início de uma nova sessão de depuração recusado porque já existe um em progresso.", -- src\editor\debugger.lua
+ ["Regular expression"] = "Expressão regular", -- src\editor\toolbar.lua
+ ["Remote console"] = "Console remoto", -- src\editor\shellbox.lua
+ ["Rename All Instances"] = "Renomear todas as instâncias", -- src\editor\editor.lua
+ ["Replace All Selections"] = "Substituir todas as seleções", -- src\editor\editor.lua
+ ["Replace all"] = "Substituir tudo", -- src\editor\toolbar.lua
+ ["Replace next instance"] = nil, -- src\editor\toolbar.lua
+ ["Replaced %d instance."] = {}, -- src\editor\findreplace.lua
+ ["Replaced an invalid UTF8 character with %s."] = "Caractere UTF8 inválido susbtituído por %s.", -- src\editor\commands.lua
+ ["Reset to default layout"] = "Redefinir painéis para o padrão", -- src\editor\menu_view.lua
+ ["Run As Scratchpad"] = "Executar como rascunho", -- src\editor\menu_project.lua
+ ["Run To Cursor"] = nil, -- src\editor\menu_project.lua, src\editor\editor.lua
+ ["Run as Scratchpad"] = "Executar como rascunho", -- src\editor\toolbar.lua
+ ["Run to cursor"] = nil, -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["S&top Debugging"] = "In&terromper depuração", -- src\editor\menu_project.lua
+ ["S&top Process"] = "In&terromper processo", -- src\editor\menu_project.lua
+ ["Save &As..."] = "S&alvar como...", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["Save A&ll"] = "Sa&lvar tudo", -- src\editor\menu_file.lua
+ ["Save Changes?"] = "Salvar alterações?", -- src\editor\commands.lua
+ ["Save all open documents"] = "Salvar todos os documentos abertos", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Save file as"] = "Salvar arquivo como", -- src\editor\commands.lua
+ ["Save file?"] = "Salvar arquivo?", -- src\editor\commands.lua
+ ["Save the current document to a file with a new name"] = "Salvar documento atual para um arquivo com outro nome", -- src\editor\menu_file.lua
+ ["Save the current document"] = "Salvar documento atual", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Saved auto-recover at %s."] = "Autorrecuperação salvo às %s.", -- src\editor\commands.lua
+ ["Scratchpad error"] = "Erro no rascunho", -- src\editor\debugger.lua
+ ["Search direction"] = nil, -- src\editor\toolbar.lua
+ ["Search in selection"] = nil, -- src\editor\toolbar.lua
+ ["Search in subdirectories"] = nil, -- src\editor\toolbar.lua
+ ["Searching for '%s'."] = nil, -- src\editor\findreplace.lua
+ ["Sel: %d/%d"] = "Sel: %d/%d", -- src\editor\editor.lua
+ ["Select &All"] = "Selecion&ar tudo", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Select And Find Next"] = "Selecionar e localizar próxima", -- src\editor\menu_search.lua
+ ["Select And Find Previous"] = "Selecionar e localizar anterior", -- src\editor\menu_search.lua
+ ["Select all text in the editor"] = "Selecionar todo o texto do editor", -- src\editor\menu_edit.lua
+ ["Select the word under cursor and find its next occurrence"] = "Selecionar palavra no cursor e localizar sua próxima ocorrência", -- src\editor\menu_search.lua
+ ["Select the word under cursor and find its previous occurrence"] = "Selecionar palavra no cursor e localizar sua ocorrência anterior", -- src\editor\menu_search.lua
+ ["Set As Start File"] = nil, -- src\editor\filetree.lua
+ ["Set From Current File"] = "Alterar para o arquivo atual", -- src\editor\menu_project.lua
+ ["Set To Project Directory"] = nil, -- src\editor\findreplace.lua
+ ["Set To Selected Directory"] = nil, -- src\editor\filetree.lua
+ ["Set project directory from current file"] = "Alterar pasta do projeto para a pasta do arquivo atual", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Set project directory to the selected one"] = nil, -- src\editor\filetree.lua
+ ["Set search directory"] = nil, -- src\editor\toolbar.lua
+ ["Set the interpreter to be used"] = "Alterar interpretador a ser utilizado", -- src\editor\menu_project.lua
+ ["Set the project directory to be used"] = "Alterar pasta do projeto a ser utilizado", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Settings: System"] = "Opções: Sistema", -- src\editor\menu_edit.lua
+ ["Settings: User"] = "Opções: Usuário", -- src\editor\menu_edit.lua
+ ["Show &Tooltip"] = "Exibir dica", -- src\editor\menu_edit.lua
+ ["Show All Files"] = "Exibir todos os arquivos", -- src\editor\filetree.lua
+ ["Show Hidden Files"] = "Exibir arquivos ocultos", -- src\editor\filetree.lua
+ ["Show Location"] = "Exibir pasta no sistema", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Show all files"] = "Exibir todos os arquivos", -- src\editor\filetree.lua
+ ["Show context"] = nil, -- src\editor\toolbar.lua
+ ["Show files previously hidden"] = "Exibir arquivos anteriormente ocultos", -- src\editor\filetree.lua
+ ["Show multiple result windows"] = nil, -- src\editor\toolbar.lua
+ ["Show tooltip for current position; place cursor after opening bracket of function"] = "Exibir dica para a posição atual; posicione o cursor após abrir o parênteses da função", -- src\editor\menu_edit.lua
+ ["Show/Hide the status bar"] = "Exibir/Ocultar a barra de status", -- src\editor\menu_view.lua
+ ["Show/Hide the toolbar"] = "Exibir/Ocultar a barra de ferramentas", -- src\editor\menu_view.lua
+ ["Sort By Name"] = nil, -- src\editor\outline.lua
+ ["Sort selected lines"] = "Ordenar linhas selecionadas", -- src\editor\menu_edit.lua
+ ["Source"] = "Código", -- src\editor\menu_edit.lua
+ ["Stack"] = "Pilha de execução", -- src\editor\debugger.lua
+ ["Start &Debugging"] = "Iniciar &depuração", -- src\editor\menu_project.lua
+ ["Start or continue debugging"] = "Iniciar ou continuar depuração", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step &Into"] = "Passar para dentro", -- src\editor\menu_project.lua
+ ["Step &Over"] = "Passar s&obre", -- src\editor\menu_project.lua
+ ["Step O&ut"] = "Passar para fora", -- src\editor\menu_project.lua
+ ["Step into"] = "Passar para dentro", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step out of the current function"] = "Passar para fora da função atual", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step over"] = "Passar para fora", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop debugging and continue running the process"] = "Interromper depuração e continuar executando o processo", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop the currently running process"] = "Interromper o processo atual em execução", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Switch to or from full screen mode"] = "Entrar/Sair do modo tela inteira", -- src\editor\menu_view.lua
+ ["Symbol Index"] = nil, -- src\editor\outline.lua
+ ["Text not found."] = "Texto não encontrado.", -- src\editor\findreplace.lua
+ ["The API file must be located in a subdirectory of the API directory."] = "O arquivo de API deve estar localizado em uma subpasta da pasta de API", -- src\editor\autocomplete.lua
+ ["Toggle Bookmark"] = "Alternar marcador", -- src\editor\markers.lua, src\editor\menu_edit.lua
+ ["Toggle Breakpoint"] = "Alternar ponto de interrupção", -- src\editor\markers.lua, src\editor\menu_project.lua
+ ["Toggle bookmark"] = "Alternar marcador", -- src\editor\toolbar.lua, src\editor\menu_edit.lua, src\editor\markers.lua
+ ["Toggle breakpoint"] = "Alternar ponto de interrupção", -- src\editor\markers.lua, src\editor\toolbar.lua
+ ["Tr&ace"] = "R&astrear", -- src\editor\menu_project.lua
+ ["Trace execution showing each executed line"] = "Rastrear execução exibindo cada linha de código executada", -- src\editor\menu_project.lua
+ ["Unable to create directory '%s'."] = "Impossível criar pasta '%s'.", -- src\editor\filetree.lua
+ ["Unable to create file '%s'."] = "Impossível criar arquivo '%s'.", -- src\editor\filetree.lua
+ ["Unable to delete directory '%s': %s"] = "Impossível apagar a pasta '%s': %s", -- src\editor\filetree.lua
+ ["Unable to delete file '%s': %s"] = nil, -- src\editor\filetree.lua
+ ["Unable to load file '%s'."] = "Impossível carregar o arquivo '%s'.", -- src\editor\commands.lua
+ ["Unable to rename file '%s'."] = "Impossível renomear o arquivo '%s'.", -- src\editor\filetree.lua
+ ["Unable to save file '%s': %s"] = "Impossível salvar o arquivo '%s': %s", -- src\editor\commands.lua
+ ["Unable to stop program (pid: %d), code %d."] = "Impossível de interromper programa (pid: %d), código %d.", -- src\editor\debugger.lua
+ ["Undo last edit"] = "Refazer última edição", -- src\editor\menu_edit.lua
+ ["Unmap Directory"] = nil, -- src\editor\filetree.lua
+ ["Unset '%s' As Start File"] = nil, -- src\editor\filetree.lua
+ ["Updated %d file."] = {}, -- src\editor\findreplace.lua
+ ["Updating symbol index and settings..."] = nil, -- src\editor\outline.lua
+ ["Use %s to close."] = nil, -- src\editor\findreplace.lua
+ ["Use '%s' to see full description."] = "Use '%s' para ver a descrição completa.", -- src\editor\editor.lua
+ ["Use '%s' to show line endings and '%s' to convert them."] = "Use '%s' para exibir os finais de linha e '%s' para convertê-los.", -- src\editor\commands.lua
+ ["Use 'clear' to clear the shell output and the history."] = "Use 'clear' para limpar a saída e o histórico.", -- src\editor\shellbox.lua
+ ["Use Shift-Enter for multiline code."] = "Usar Shift-Enter para adicionar uma nova linha ao código.", -- src\editor\shellbox.lua
+ ["View the markers window"] = nil, -- src\editor\menu_view.lua
+ ["View the outline window"] = "Exibir a janela de definições", -- src\editor\menu_view.lua
+ ["View the output/console window"] = "Exibir a janela de saída/console", -- src\editor\menu_view.lua
+ ["View the project/filetree window"] = "Exibir janela do projeto/hierarquia de arquivos", -- src\editor\menu_view.lua
+ ["View the stack window"] = "Exibir janela da pilha de execução", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["View the watch window"] = "Exibir janela do observador", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["Watch"] = "Observador", -- src\editor\debugger.lua
+ ["Welcome to the interactive Lua interpreter."] = "Bem-vindo ao interpretador do Lua.", -- src\editor\shellbox.lua
+ ["Wrap around"] = "Repetir direção", -- src\editor\toolbar.lua
+ ["You must save the program first."] = "Você deve salvar o programa primeiro.", -- src\editor\commands.lua
+ ["Zoom In"] = "Ampliar", -- src\editor\menu_view.lua
+ ["Zoom Out"] = "Afastar", -- src\editor\menu_view.lua
+ ["Zoom to 100%"] = "Ir para 100%", -- src\editor\menu_view.lua
+ ["Zoom"] = "Zoom", -- src\editor\menu_view.lua
+ ["on line %d"] = "na linha %d", -- src\editor\debugger.lua, src\editor\editor.lua, src\editor\commands.lua
+ ["traced %d instruction"] = {"%d instrução rastreada", "%d instruções rastreadas"}, -- src\editor\debugger.lua
+ ["unknown error"] = "erro desconhecido", -- src\editor\debugger.lua
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/ru.lua b/love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/ru.lua
new file mode 100644
index 0000000..3c9939f
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/cfg/i18n/ru.lua
@@ -0,0 +1,345 @@
+return {
+ [0] = function(c) c = (c-9)%100 < 9 and 9 or (c-1)%10 return c == 0 and 1 or c < 4 and 2 or 3 end, -- plural
+ ["%s event failed: %s"] = "%s обработчик события вернул ошибку: %s", -- src\editor\package.lua
+ ["%s%% formatted..."] = "%s%% отформатировано...", -- src\editor\print.lua
+ ["%s%% loaded..."] = "%s%% загружено...", -- src\editor\commands.lua
+ ["&About"] = "&О программе", -- src\editor\menu_help.lua
+ ["&Add Watch"] = "&Добавить выражение", -- src\editor\debugger.lua
+ ["&Break"] = "Пр&ервать", -- src\editor\menu_project.lua
+ ["&Close Page"] = "&Закрыть", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Community"] = nil, -- src\editor\menu_help.lua
+ ["&Compile"] = "&Компилировать", -- src\editor\menu_project.lua
+ ["&Copy Value"] = "Копировать значение", -- src\editor\debugger.lua
+ ["&Copy"] = "&Копировать", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Default Layout"] = "Вид по &умолчанию", -- src\editor\menu_view.lua
+ ["&Delete Watch"] = "&Удалить выражение", -- src\editor\debugger.lua
+ ["&Delete"] = "&Удалить", -- src\editor\filetree.lua
+ ["&Documentation"] = "Документация", -- src\editor\menu_help.lua
+ ["&Edit Project Directory"] = "&Редактировать папку проекта", -- src\editor\filetree.lua
+ ["&Edit Value"] = "&Редактировать значение", -- src\editor\debugger.lua
+ ["&Edit Watch"] = "&Редактировать выражение", -- src\editor\debugger.lua
+ ["&Edit"] = "&Правка", -- src\editor\menu_edit.lua
+ ["&File"] = "&Файл", -- src\editor\menu_file.lua
+ ["&Find"] = "&Найти", -- src\editor\menu_search.lua
+ ["&Fold/Unfold All"] = "Св&ернуть/развернуть все", -- src\editor\menu_edit.lua
+ ["&Frequently Asked Questions"] = "&Часто задаваемые вопросы", -- src\editor\menu_help.lua
+ ["&Getting Started Guide"] = nil, -- src\editor\menu_help.lua
+ ["&Help"] = "&Справка", -- src\editor\menu_help.lua
+ ["&New Directory"] = "&Новая папка", -- src\editor\filetree.lua
+ ["&New"] = "Соз&дать", -- src\editor\menu_file.lua
+ ["&Open..."] = "&Открыть...", -- src\editor\menu_file.lua
+ ["&Output/Console Window"] = "Окно &вывода/консоли", -- src\editor\menu_view.lua
+ ["&Paste"] = "В&ставить", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Print..."] = "Печать...", -- src\editor\print.lua
+ ["&Project Page"] = "Страница проекта", -- src\editor\menu_help.lua
+ ["&Project"] = "Пр&оект", -- src\editor\menu_project.lua
+ ["&Redo"] = "Верну&ть", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&Rename"] = "Переименовать", -- src\editor\filetree.lua
+ ["&Replace"] = "За&менить", -- src\editor\menu_search.lua
+ ["&Run"] = "За&пустить", -- src\editor\menu_project.lua
+ ["&Save"] = "&Сохранить", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["&Search"] = "По&иск", -- src\editor\menu_search.lua
+ ["&Select Command"] = "Выбрать команду", -- src\editor\gui.lua
+ ["&Sort"] = "&Cортировать", -- src\editor\menu_edit.lua
+ ["&Stack Window"] = "Окно &стека", -- src\editor\menu_view.lua
+ ["&Start Debugger Server"] = "Запустить сервер отла&дки", -- src\editor\menu_project.lua
+ ["&Status Bar"] = "Панель состояния", -- src\editor\menu_view.lua
+ ["&Tool Bar"] = "Панель инструментов", -- src\editor\menu_view.lua
+ ["&Tutorials"] = "&Обучающие материалы", -- src\editor\menu_help.lua
+ ["&Undo"] = "&Отменить", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["&View"] = "&Вид", -- src\editor\menu_view.lua
+ ["&Watch Window"] = "Окно &выражений", -- src\editor\menu_view.lua
+ ["About %s"] = "О %s", -- src\editor\menu_help.lua
+ ["Add To Scratchpad"] = "Добавить в черновик", -- src\editor\editor.lua
+ ["Add Watch Expression"] = "Добавить выражение", -- src\editor\editor.lua
+ ["All files"] = "Все файлы", -- src\editor\commands.lua
+ ["Allow external process to start debugging"] = "Разрешить внешнему процессу начать отладку", -- src\editor\menu_project.lua
+ ["Analyze the source code"] = "Проанализировать исходный код", -- src\editor\inspect.lua
+ ["Analyze"] = "Анализировать", -- src\editor\inspect.lua
+ ["Auto Complete Identifiers"] = "Автодополнение идентификаторов", -- src\editor\menu_edit.lua
+ ["Auto complete while typing"] = "Автоматически дополнять идентификаторы при наборе", -- src\editor\menu_edit.lua
+ ["Binary file is shown as read-only as it is only partially loaded."] = "Двоичный файл открыт только для чтения, так как загружен частично.", -- src\editor\commands.lua
+ ["Bookmark"] = "Закладка", -- src\editor\menu_edit.lua
+ ["Break execution at the next executed line of code"] = "Прервать выполнение на следующей строке", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Breakpoint"] = "Точка останова", -- src\editor\menu_project.lua
+ ["C&lear Console Window"] = "Очистить ок&но консоли", -- src\editor\gui.lua
+ ["C&lear Output Window"] = "Очистить ок&но вывода", -- src\editor\gui.lua, src\editor\menu_project.lua
+ ["C&omment/Uncomment"] = "Зако&мментировать/раскомментировать", -- src\editor\menu_edit.lua
+ ["Can't evaluate the expression while the application is running."] = "Невозможно вычеслить значение выражения пока приложение выполняется.", -- src\editor\debugger.lua
+ ["Can't open file '%s': %s"] = "Ошибка открытия файла '%s': %s", -- src\editor\findreplace.lua, src\editor\singleinstance.lua, src\editor\inspect.lua, src\editor\outline.lua
+ ["Can't process auto-recovery record; invalid format: %s."] = "Ошибка обработки записи автоматического восстановления; неверный формат: %s.", -- src\editor\commands.lua
+ ["Can't replace in read-only text."] = "Ошибка замены в тексте не доступном для записи.", -- src\editor\findreplace.lua
+ ["Can't run the entry point script ('%s')."] = "Ошибка выполнения стартового скрипта ('%s').", -- src\editor\debugger.lua
+ ["Can't start debugger server at %s:%d: %s."] = "Невозможно запустить сервер отладки %s:%d: %s", -- src\editor\debugger.lua
+ ["Can't start debugging for '%s'."] = "Невозможно начать отладку для '%s'.", -- src\editor\debugger.lua
+ ["Can't start debugging session due to internal error '%s'."] = "Невозможно начать отладочную сессию из-за внутренней ошибки '%s'.", -- src\editor\debugger.lua
+ ["Can't start debugging without an opened file or with the current file not being saved ('%s')."] = "Невозможно начать отладку без открытого файла или с несохраненным текущим файлом ('%s').", -- src\editor\debugger.lua
+ ["Can't stop debugger server as it is not started."] = "Невозможно остановить сервер отладки пока он не запущен", -- src\editor\debugger.lua
+ ["Cancelled by the user."] = "Отменено пользователем.", -- src\editor\findreplace.lua
+ ["Choose a directory to map"] = "Выберите папку для добавления в список", -- src\editor\filetree.lua
+ ["Choose a project directory"] = "Выберите папку проекта", -- src\editor\toolbar.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Choose a search directory"] = "Выберите папку поиска", -- src\editor\findreplace.lua
+ ["Choose..."] = "Выбрать...", -- src\editor\findreplace.lua, src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Clear Items"] = "Очистить список", -- src\editor\findreplace.lua, src\editor\menu_file.lua
+ ["Clear items from this list"] = "Удалить элементы из списка", -- src\editor\menu_file.lua
+ ["Clear the output window before compiling or debugging"] = "Очистить окно вывода перед компиляцией или отладкой", -- src\editor\menu_project.lua
+ ["Close &Other Pages"] = "Закрыть &остальные вкладки", -- src\editor\gui.lua
+ ["Close A&ll Pages"] = "Закрыть &все вкладки", -- src\editor\gui.lua
+ ["Close the current editor window"] = "Закрыть текущее окно редактирования", -- src\editor\menu_file.lua
+ ["Co&ntinue"] = "Пр&одолжить", -- src\editor\menu_project.lua
+ ["Col: %d"] = "Стб: %d", -- src\editor\editor.lua
+ ["Command Line Parameters..."] = "Параметры командной строки...", -- src\editor\menu_project.lua
+ ["Command line parameters"] = "Параметры командной строки", -- src\editor\menu_project.lua
+ ["Comment or uncomment current or selected lines"] = "Закомментировать или раскомментировать текущую или выделенные строки", -- src\editor\menu_edit.lua
+ ["Compilation error"] = "Ошибка компиляции", -- src\editor\commands.lua, src\editor\debugger.lua
+ ["Compilation successful; %.0f%% success rate (%d/%d)."] = "Компиляция завершена успешно; процент успеха: %.0f%% (%d/%d).", -- src\editor\commands.lua
+ ["Compile the current file"] = "Скомпилировать текущий файл", -- src\editor\menu_project.lua
+ ["Complete &Identifier"] = "Дополнить &идентификатор", -- src\editor\menu_edit.lua
+ ["Complete the current identifier"] = "Дополнить текущий идентификатор", -- src\editor\menu_edit.lua
+ ["Consider removing backslash from escape sequence '%s'."] = "Рассмотрите вариант удаления backslash из строки '%s'.", -- src\editor\commands.lua
+ ["Copy Full Path"] = "Скопировать полный путь", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Copy selected text to clipboard"] = "Скопировать выделенный текст в буфер обмена", -- src\editor\menu_edit.lua
+ ["Correct &Indentation"] = "Откорректировать отступ", -- src\editor\menu_edit.lua
+ ["Couldn't activate file '%s' for debugging; continuing without it."] = "Невозможно открыть файл '%s' для отладки; выполнение будет продолжено без него.", -- src\editor\debugger.lua
+ ["Create an empty document"] = "Создать новый документ", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Cu&t"] = "Вы&резать", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Cut selected text to clipboard"] = "Вырезать выделенный текст в буфер обмена", -- src\editor\menu_edit.lua
+ ["Debugger server started at %s:%d."] = "Сервер отладки запущен на %s:%d.", -- src\editor\debugger.lua
+ ["Debugger server stopped at %s:%d."] = "Сервер отладки остановлен %s:%d.", -- src\editor\debugger.lua
+ ["Debugging session completed (%s)."] = "Отладочная сессия завершена (%s).", -- src\editor\debugger.lua
+ ["Debugging session started in '%s'."] = "Отладочная сессия запущена в '%s'.", -- src\editor\debugger.lua
+ ["Debugging suspended at '%s:%s' (couldn't activate the file)."] = "Отладка остановлена в '%s:%s' (невозможно активировать файл).", -- src\editor\debugger.lua
+ ["Detach &Process"] = "Отсоединить процесс", -- src\editor\menu_project.lua
+ ["Disable Indexing For '%s'"] = "Запретить индексирование для '%s'", -- src\editor\outline.lua
+ ["Do you want to delete '%s'?"] = "Удалить '%s'?", -- src\editor\filetree.lua
+ ["Do you want to overwrite it?"] = "Переписать его?", -- src\editor\commands.lua
+ ["Do you want to reload it?"] = "Перезагрузить его?", -- src\editor\editor.lua
+ ["Do you want to save the changes to '%s'?"] = "Сохранить изменения в '%s'?", -- src\editor\commands.lua
+ ["E&xit"] = "Вы&ход", -- src\editor\menu_file.lua
+ ["Enable Indexing"] = "Разрешить индекcирование", -- src\editor\outline.lua
+ ["Enter Lua code and press Enter to run it."] = "Введите код на Lua и нажмите Enter для выполнения.", -- src\editor\shellbox.lua
+ ["Enter command line parameters (use Cancel to clear)"] = "Введите параметры командной строки (Cancel чтобы очистить)", -- src\editor\menu_project.lua
+ ["Enter replacement text"] = "Введите текст замены", -- src\editor\editor.lua
+ ["Error while loading API file: %s"] = "Ошибка загрузки файла определений API: %s", -- src\editor\autocomplete.lua
+ ["Error while loading configuration file: %s"] = "Ошибка загрузки файла конфигурации: %s", -- src\editor\style.lua
+ ["Error while processing API file: %s"] = "Ошибка обработки файла определений API: %s", -- src\editor\autocomplete.lua
+ ["Error while processing configuration file: %s"] = "Ошибка обработки файла конфигурации: %s", -- src\editor\style.lua
+ ["Error"] = "Ошибка", -- src\editor\commands.lua
+ ["Evaluate In Console"] = "Выполнить в консоли", -- src\editor\editor.lua
+ ["Execute the current project/file and keep updating the code to see immediate results"] = "Запустить текущий проект/файл и продолжать вносить изменения в код с немедленным выводом результатов", -- src\editor\menu_project.lua
+ ["Execute the current project/file"] = "Запустить текущий проект/файл", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Execution error"] = "Ошибка выполнения", -- src\editor\debugger.lua
+ ["Exit program"] = "Выйти из программы", -- src\editor\menu_file.lua
+ ["File '%s' has been modified on disk."] = "Файл '%s' был изменен на диске.", -- src\editor\editor.lua
+ ["File '%s' has more recent timestamp than restored '%s'; please review before saving."] = "Файл '%s' имеет более позднее время модификации, чем восстановленный '%s'; пожалуйста просмотрите его перед сохранением.", -- src\editor\commands.lua
+ ["File '%s' is missing and can't be recovered."] = "Файл '%s' отсутствует и не может быть восстановлен.", -- src\editor\commands.lua
+ ["File '%s' no longer exists."] = "Файл '%s' больше не существует.", -- src\editor\menu_file.lua, src\editor\editor.lua
+ ["File already exists."] = "Файл уже существует.", -- src\editor\commands.lua
+ ["File history"] = "История файлов", -- src\editor\menu_file.lua
+ ["Find &In Files"] = "Н&айти в файлах", -- src\editor\menu_search.lua
+ ["Find &Next"] = "Найти &далее", -- src\editor\menu_search.lua
+ ["Find &Previous"] = "Найти &ранее", -- src\editor\menu_search.lua
+ ["Find and insert library function"] = "Найти и вставить библиотечную функцию", -- src\editor\menu_search.lua
+ ["Find and replace text in files"] = "Найти и заменить текст в файлах", -- src\editor\menu_search.lua
+ ["Find and replace text"] = "Найти и заменить текст", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find in files"] = "Найти в файлах", -- src\editor\toolbar.lua
+ ["Find text in files"] = "Найти текст в файлах", -- src\editor\menu_search.lua
+ ["Find text"] = "Найти текст", -- src\editor\toolbar.lua, src\editor\menu_search.lua
+ ["Find the earlier text occurence"] = "Найти предыдущее вхождение текста", -- src\editor\menu_search.lua
+ ["Find the next text occurrence"] = "Найти следующее вхождение текста", -- src\editor\menu_search.lua
+ ["Find"] = "Найти", -- src\editor\toolbar.lua
+ ["Fold or unfold all code folds"] = "Свернуть или развернуть все блоки кода", -- src\editor\menu_edit.lua
+ ["Formatting page %d..."] = "Отформатировано страницы %d...", -- src\editor\print.lua
+ ["Found %d instance."] = {"Найдено %d совпадение.", "Найдено %d совпадения.", "Найдено %d совпадений."}, -- src\editor\findreplace.lua
+ ["Found auto-recovery record and restored saved session."] = "Найдена запись авто-восстановления и восстановлена сохраненная сессия.", -- src\editor\commands.lua
+ ["Full &Screen"] = "Во весь экр&ан", -- src\editor\menu_view.lua
+ ["Go To Definition"] = "Перейти к определению", -- src\editor\editor.lua
+ ["Go To File..."] = "Перейти к файлу...", -- src\editor\menu_search.lua
+ ["Go To Line..."] = "Перейти к строке...", -- src\editor\menu_search.lua
+ ["Go To Next Bookmark"] = "Перейти к следующей закладке", -- src\editor\menu_edit.lua
+ ["Go To Next Breakpoint"] = "Перейти к следующей точке останова", -- src\editor\menu_project.lua
+ ["Go To Previous Bookmark"] = "Перейти к предыдущей закладке", -- src\editor\menu_edit.lua
+ ["Go To Previous Breakpoint"] = "Перейти к предыдущей точке останова", -- src\editor\menu_project.lua
+ ["Go To Symbol..."] = "Перейти к символу...", -- src\editor\menu_search.lua
+ ["Go to file"] = "Перейти к файлу", -- src\editor\menu_search.lua
+ ["Go to line"] = "Перейти к строке", -- src\editor\menu_search.lua
+ ["Go to symbol"] = "Перейти к символу", -- src\editor\menu_search.lua
+ ["Hide '.%s' Files"] = "Спрятать '.%s' файлы", -- src\editor\filetree.lua
+ ["INS"] = "ВСТ", -- src\editor\editor.lua
+ ["Ignore and don't index symbols from files in the selected directory"] = "Игнорировать и не индексировать файлы в выбранной папке", -- src\editor\outline.lua
+ ["Ignored error in debugger initialization code: %s."] = "Проигнорирована ошибка в коде инициализации отладчика: %s.", -- src\editor\debugger.lua
+ ["Indexing %d files: '%s'..."] = "Индексировано %d: '%s'...", -- src\editor\outline.lua
+ ["Indexing completed."] = "Индексирование закончено.", -- src\editor\outline.lua
+ ["Insert Library Function..."] = "Вставить библиотечную функцию...", -- src\editor\menu_search.lua
+ ["Known Files"] = "Файлы Lua", -- src\editor\commands.lua
+ ["Ln: %d"] = "Стр: %d", -- src\editor\editor.lua
+ ["Local console"] = "Локальная консоль", -- src\editor\gui.lua, src\editor\shellbox.lua
+ ["Lua &Interpreter"] = "&Интерпретатор Lua", -- src\editor\menu_project.lua
+ ["Map Directory..."] = "Добавить папку в список", -- src\editor\filetree.lua
+ ["Mapped remote request for '%s' to '%s'."] = "Удаленный запрос для '%s' отображен на '%s'.", -- src\editor\debugger.lua
+ ["Markers Window"] = "Окно маркеров", -- src\editor\menu_view.lua
+ ["Markers"] = "Маркеры", -- src\editor\markers.lua
+ ["Match case"] = "Совпадение регистра", -- src\editor\toolbar.lua
+ ["Match whole word"] = "Совпадение целого слова", -- src\editor\toolbar.lua
+ ["Mixed end-of-line encodings detected."] = "Обнаружены смешанные символы конца строки.", -- src\editor\commands.lua
+ ["Navigate"] = "Перейти", -- src\editor\menu_search.lua
+ ["New &File"] = "Новый файл", -- src\editor\filetree.lua
+ ["OVR"] = "ЗАМ", -- src\editor\editor.lua
+ ["Open With Default Program"] = "Открыть используя программу по умолчанию", -- src\editor\filetree.lua
+ ["Open an existing document"] = "Открыть существующий документ", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Open file"] = "Открыть файл", -- src\editor\commands.lua
+ ["Outline Window"] = "Окно структуры", -- src\editor\menu_view.lua
+ ["Outline"] = "Структура", -- src\editor\outline.lua
+ ["Output (running)"] = "Вывод (запущен)", -- src\editor\debugger.lua, src\editor\output.lua
+ ["Output (suspended)"] = "Вывод (приостановлен)", -- src\editor\debugger.lua
+ ["Output"] = "Вывод", -- src\editor\debugger.lua, src\editor\output.lua, src\editor\gui.lua, src\editor\settings.lua
+ ["Page Setup..."] = "Параметры страницы...", -- src\editor\print.lua
+ ["Paste text from the clipboard"] = "Вставить текст из буфера обмена", -- src\editor\menu_edit.lua
+ ["Preferences"] = "Настройки", -- src\editor\menu_edit.lua
+ ["Prepend '!' to force local execution."] = "Укажите '=' в начале выражения для выполнения в локальной консоли", -- src\editor\shellbox.lua
+ ["Prepend '=' to show complex values on multiple lines."] = "Укажите '=' в начале выражения для отображения сложных значений на нескольких строках.", -- src\editor\shellbox.lua
+ ["Press cancel to abort."] = "Нажмите Отмена для завершения.", -- src\editor\commands.lua
+ ["Print the current document"] = "Печать текущего документа", -- src\editor\print.lua
+ ["Program '%s' started in '%s' (pid: %d)."] = "Программа '%s' запущена в '%s' (pid: %d).", -- src\editor\output.lua
+ ["Program can't start because conflicting process is running as '%s'."] = "Программа не может быть запущена из-за конфликтующего процесса, выполняющегося как '%s'.", -- src\editor\output.lua
+ ["Program completed in %.2f seconds (pid: %d)."] = "Программа завершена за %.2f секунд (pid: %d).", -- src\editor\output.lua
+ ["Program starting as '%s'."] = "Программа запускается как '%s'.", -- src\editor\output.lua
+ ["Program stopped (pid: %d)."] = "Программа завершена (pid: %d).", -- src\editor\debugger.lua
+ ["Program unable to run as '%s'."] = "Программа не может быть запущена как '%s'.", -- src\editor\output.lua
+ ["Project Directory"] = "Папка проекта", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Project history"] = "История проектов", -- src\editor\menu_file.lua
+ ["Project"] = "Проект", -- src\editor\filetree.lua
+ ["Project/&FileTree Window"] = "Окно &проекта/списка файлов", -- src\editor\menu_view.lua
+ ["Provide command line parameters"] = "Установить параметры командной строки", -- src\editor\menu_project.lua
+ ["Queued %d files to index."] = "Помещено %d файлов в очередь на индексирование.", -- src\editor\menu_search.lua
+ ["R/O"] = "R/O", -- src\editor\editor.lua
+ ["R/W"] = "R/W", -- src\editor\editor.lua
+ ["Re&place In Files"] = "Замени&ть в файлах", -- src\editor\menu_search.lua
+ ["Re-indent selected lines"] = "Исправить отступ в выделенных строчках", -- src\editor\menu_edit.lua
+ ["Reached end of selection and wrapped around."] = "Достигнут конец выделенного текста и произведен возврат к началу.", -- src\editor\findreplace.lua
+ ["Reached end of text and wrapped around."] = "Достигнут конец текста и произведен возврат к началу.", -- src\editor\findreplace.lua
+ ["Recent Files"] = "Недавние файлы", -- src\editor\menu_file.lua
+ ["Recent Projects"] = "Недавние проекты", -- src\editor\menu_file.lua
+ ["Redo last edit undone"] = "Вернуть последнее отмененное изменение", -- src\editor\menu_edit.lua
+ ["Refresh Index"] = "Обновить индекс", -- src\editor\outline.lua
+ ["Refresh indexed symbols from files in the selected directory"] = "Обновить индекс символов из файлов в выбранной папке", -- src\editor\outline.lua
+ ["Refresh"] = "Oбновление", -- src\editor\filetree.lua
+ ["Refused a request to start a new debugging session as there is one in progress already."] = "Отказано в запросе на запуск новой отладочной сессии, поскольку одна сессия уже выполняется.", -- src\editor\debugger.lua
+ ["Regular expression"] = "Регулярное выражение", -- src\editor\toolbar.lua
+ ["Remote console"] = "Удаленная консоль", -- src\editor\shellbox.lua
+ ["Rename All Instances"] = "Переименовать все совпадения", -- src\editor\editor.lua
+ ["Replace All Selections"] = "Заменить все выделенные фрагменты", -- src\editor\editor.lua
+ ["Replace all"] = "Заменить все", -- src\editor\toolbar.lua
+ ["Replace next instance"] = "Заменить следующее совпадение", -- src\editor\toolbar.lua
+ ["Replaced %d instance."] = {"Заменено %d совпадение.", "Заменено %d совпадения.", "Заменено %d совпадений."}, -- src\editor\findreplace.lua
+ ["Replaced an invalid UTF8 character with %s."] = "Некорректный символ UTF8 заменен на %s.", -- src\editor\commands.lua
+ ["Reset to default layout"] = "Установить расположение окон по умолчанию", -- src\editor\menu_view.lua
+ ["Run As Scratchpad"] = "Запустить как черновик", -- src\editor\menu_project.lua
+ ["Run To Cursor"] = "Выполнить до курсора", -- src\editor\menu_project.lua, src\editor\editor.lua
+ ["Run as Scratchpad"] = "Запустить как черновик", -- src\editor\toolbar.lua
+ ["Run to cursor"] = "Выполнить до курсора", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["S&top Debugging"] = "&Завершить отладку", -- src\editor\menu_project.lua
+ ["S&top Process"] = "&Завершить процесс", -- src\editor\menu_project.lua
+ ["Save &As..."] = "Сохранить &как...", -- src\editor\gui.lua, src\editor\menu_file.lua
+ ["Save A&ll"] = "Сохранить &все", -- src\editor\menu_file.lua
+ ["Save Changes?"] = "Сохранить изменения?", -- src\editor\commands.lua
+ ["Save all open documents"] = "Сохранить все открытые документы", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Save file as"] = "Сохранить файл как", -- src\editor\commands.lua
+ ["Save file?"] = "Сохранить файл?", -- src\editor\commands.lua
+ ["Save the current document to a file with a new name"] = "Сохранить текущий документ в файл под новым именем", -- src\editor\menu_file.lua
+ ["Save the current document"] = "Сохранить текущий документ", -- src\editor\toolbar.lua, src\editor\menu_file.lua
+ ["Saved auto-recover at %s."] = "Сохранено авто-восст в %s.", -- src\editor\commands.lua
+ ["Scratchpad error"] = "Ошибка в черновике", -- src\editor\debugger.lua
+ ["Search direction"] = "Направление поиска", -- src\editor\toolbar.lua
+ ["Search in selection"] = "Поиск в выделенном тексте", -- src\editor\toolbar.lua
+ ["Search in subdirectories"] = "Поиск во вложенных папках", -- src\editor\toolbar.lua
+ ["Searching for '%s'."] = "Искать '%s'.", -- src\editor\findreplace.lua
+ ["Sel: %d/%d"] = "Выд: %d/%d", -- src\editor\editor.lua
+ ["Select &All"] = "Выделить &все", -- src\editor\gui.lua, src\editor\editor.lua, src\editor\menu_edit.lua
+ ["Select And Find Next"] = "Выделить и найти далее", -- src\editor\menu_search.lua
+ ["Select And Find Previous"] = "Выделить и найти ранее", -- src\editor\menu_search.lua
+ ["Select all text in the editor"] = "Выделить весь текст в редакторе", -- src\editor\menu_edit.lua
+ ["Select the word under cursor and find its next occurrence"] = "Выделить слово под курсором и найти далее", -- src\editor\menu_search.lua
+ ["Select the word under cursor and find its previous occurrence"] = "Выделить слово под курсором и найти ранее", -- src\editor\menu_search.lua
+ ["Set As Start File"] = "Установить как файл запуска", -- src\editor\filetree.lua
+ ["Set From Current File"] = "Установить по текущему файлу", -- src\editor\menu_project.lua
+ ["Set To Project Directory"] = "Установить папку проекта", -- src\editor\findreplace.lua
+ ["Set To Selected Directory"] = "Установить выбранную папку как проект", -- src\editor\filetree.lua
+ ["Set project directory from current file"] = "Установить папку проекта по текущему файлу", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Set project directory to the selected one"] = "Установить выбранную папку как папку проекта", -- src\editor\filetree.lua
+ ["Set search directory"] = "Установить папку поиска", -- src\editor\toolbar.lua
+ ["Set the interpreter to be used"] = "Установить используемый интерпретатор", -- src\editor\menu_project.lua
+ ["Set the project directory to be used"] = "Установить используемую папку проекта", -- src\editor\menu_project.lua, src\editor\filetree.lua
+ ["Settings: System"] = "Установки: Системы", -- src\editor\menu_edit.lua
+ ["Settings: User"] = "Установки: Пользователя", -- src\editor\menu_edit.lua
+ ["Show &Tooltip"] = "Показать &подсказку", -- src\editor\menu_edit.lua
+ ["Show All Files"] = "Показать все файлы", -- src\editor\filetree.lua
+ ["Show Hidden Files"] = "Показать спрятанные файлы", -- src\editor\filetree.lua
+ ["Show Location"] = "Показать файл в папке", -- src\editor\gui.lua, src\editor\filetree.lua
+ ["Show all files"] = "Показать все файлы", -- src\editor\filetree.lua
+ ["Show context"] = "Показать контекст", -- src\editor\toolbar.lua
+ ["Show files previously hidden"] = "Показать ранее спрятанные файлы", -- src\editor\filetree.lua
+ ["Show multiple result windows"] = "Показать результаты поиска в разных окнах", -- src\editor\toolbar.lua
+ ["Show tooltip for current position; place cursor after opening bracket of function"] = "Показать подсказку в текущей позиции; переместите курсор в позицию после открывающей скобки функции", -- src\editor\menu_edit.lua
+ ["Show/Hide the status bar"] = "Показать/спрятать панель состояния", -- src\editor\menu_view.lua
+ ["Show/Hide the toolbar"] = "Показать/спрятать панель инструментов", -- src\editor\menu_view.lua
+ ["Sort By Name"] = "Сортировать по имени", -- src\editor\outline.lua
+ ["Sort selected lines"] = "Отсортировать выделенные строки", -- src\editor\menu_edit.lua
+ ["Source"] = "Исходный код", -- src\editor\menu_edit.lua
+ ["Stack"] = "Стек", -- src\editor\debugger.lua
+ ["Start &Debugging"] = "Начать &отладку", -- src\editor\menu_project.lua
+ ["Start or continue debugging"] = "Начать или продолжить отладку", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step &Into"] = "&Войти", -- src\editor\menu_project.lua
+ ["Step &Over"] = "&Следующая строка", -- src\editor\menu_project.lua
+ ["Step O&ut"] = "В&ыйти", -- src\editor\menu_project.lua
+ ["Step into"] = "Войти в функцию", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step out of the current function"] = "Выйти из текущей функции", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Step over"] = "Перейти на следующую строку", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop debugging and continue running the process"] = "Завершить отладку и продолжить текущий процесс", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Stop the currently running process"] = "Завершить текущий процесс", -- src\editor\toolbar.lua, src\editor\menu_project.lua
+ ["Switch to or from full screen mode"] = "Переключить полноэкранный режим", -- src\editor\menu_view.lua
+ ["Symbol Index"] = "Индекс символов", -- src\editor\outline.lua
+ ["Text not found."] = "Текст не найден.", -- src\editor\findreplace.lua
+ ["The API file must be located in a subdirectory of the API directory."] = "Файл определений API должен быть расположен внутри папки API.", -- src\editor\autocomplete.lua
+ ["Toggle Bookmark"] = "Установить/Снять закладку", -- src\editor\markers.lua, src\editor\menu_edit.lua
+ ["Toggle Breakpoint"] = "Установить/Снять точку останова", -- src\editor\markers.lua, src\editor\menu_project.lua
+ ["Toggle bookmark"] = "Установить/Снять закладку", -- src\editor\toolbar.lua, src\editor\menu_edit.lua, src\editor\markers.lua
+ ["Toggle breakpoint"] = "Установить/Снять точку останова", -- src\editor\markers.lua, src\editor\toolbar.lua
+ ["Tr&ace"] = "Т&рассировка", -- src\editor\menu_project.lua
+ ["Trace execution showing each executed line"] = "Отслеживать выполнение, показывая каждую выполненную строку", -- src\editor\menu_project.lua
+ ["Unable to create directory '%s'."] = "Ошибка создания папки '%s'.", -- src\editor\filetree.lua
+ ["Unable to create file '%s'."] = "Ошибка создания файла '%s'.", -- src\editor\filetree.lua
+ ["Unable to delete directory '%s': %s"] = "Ошибка удаления папки '%s': %s", -- src\editor\filetree.lua
+ ["Unable to delete file '%s': %s"] = "Ошибка удаления файла '%s': %s", -- src\editor\filetree.lua
+ ["Unable to load file '%s'."] = "Ошибка загрузки файла '%s'.", -- src\editor\commands.lua
+ ["Unable to rename file '%s'."] = "Ошибка переименования файла '%s'.", -- src\editor\filetree.lua
+ ["Unable to save file '%s': %s"] = "Ошибка сохранения файла '%s': %s", -- src\editor\commands.lua
+ ["Unable to stop program (pid: %d), code %d."] = "Невозможно завершить программу (pid: %d), код %d.", -- src\editor\debugger.lua
+ ["Undo last edit"] = "Отменить последнее действие", -- src\editor\menu_edit.lua
+ ["Unmap Directory"] = "Убрать папку из списка", -- src\editor\filetree.lua
+ ["Unset '%s' As Start File"] = "Отменить '%s' как файл запуска", -- src\editor\filetree.lua
+ ["Updated %d file."] = {"Обновлен %d файл.", "Обновлено %d файла.", "Обновлено %d файлов."}, -- src\editor\findreplace.lua
+ ["Updating symbol index and settings..."] = "Обновляется индекс символов и установки...", -- src\editor\outline.lua
+ ["Use %s to close."] = "Используйте %s для закрытия.", -- src\editor\findreplace.lua
+ ["Use '%s' to see full description."] = "Используйте '%s' для полного описания.", -- src\editor\editor.lua
+ ["Use '%s' to show line endings and '%s' to convert them."] = "Используйте '%s' для отображения символов конца строки и '%s' для их преобразования.", -- src\editor\commands.lua
+ ["Use 'clear' to clear the shell output and the history."] = "Используйте команду 'clear' для очистки содержимого окна и истории.", -- src\editor\shellbox.lua
+ ["Use Shift-Enter for multiline code."] = "Используйте Shift-Enter для многострочного кода.", -- src\editor\shellbox.lua
+ ["View the markers window"] = "Показать окно маркеров", -- src\editor\menu_view.lua
+ ["View the outline window"] = "Показать окно структуры", -- src\editor\menu_view.lua
+ ["View the output/console window"] = "Показать окно вывода/консоли", -- src\editor\menu_view.lua
+ ["View the project/filetree window"] = "Показать окно проекта/списка файлов", -- src\editor\menu_view.lua
+ ["View the stack window"] = "Показать окно стека", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["View the watch window"] = "Показать окно выражений", -- src\editor\toolbar.lua, src\editor\menu_view.lua
+ ["Watch"] = "Выражение", -- src\editor\debugger.lua
+ ["Welcome to the interactive Lua interpreter."] = "Добро пожаловать в интерактивный интерпретатор Lua.", -- src\editor\shellbox.lua
+ ["Wrap around"] = "Продолжить сначала", -- src\editor\toolbar.lua
+ ["You must save the program first."] = "Вы должны сначала сохранить программу.", -- src\editor\commands.lua
+ ["Zoom In"] = "Приблизить", -- src\editor\menu_view.lua
+ ["Zoom Out"] = "Удалить", -- src\editor\menu_view.lua
+ ["Zoom to 100%"] = "Установить 100%", -- src\editor\menu_view.lua
+ ["Zoom"] = "Установить масштаб", -- src\editor\menu_view.lua
+ ["on line %d"] = "в строке %d", -- src\editor\debugger.lua, src\editor\editor.lua, src\editor\commands.lua
+ ["traced %d instruction"] = {"выполнена %d инструкция", "выполнено %d инструкции", "выполнено %d инструкций"}, -- src\editor\debugger.lua
+ ["unknown error"] = "неизвестная ошибка", -- src\editor\debugger.lua
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/cfg/scheme-picker.lua b/love2dToAPK/tools/tools/zbstudio-win/cfg/scheme-picker.lua
new file mode 100644
index 0000000..0a3ffde
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/cfg/scheme-picker.lua
@@ -0,0 +1,28 @@
+--[[
+1. Pick a color scheme by clicking on its name:
+ - [Tomorrow](macro:inline(ApplyStyleConfig('cfg/tomorrow.lua','Tomorrow'); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = c.styles.text; ReApplySpecAndStyles()))
+ - [TomorrowContrast](macro:inline(ApplyStyleConfig('cfg/tomorrow.lua','TomorrowContrast'); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = c.styles.text; ReApplySpecAndStyles()))
+ - [TomorrowNight](macro:inline(ApplyStyleConfig('cfg/tomorrow.lua','TomorrowNight'); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = c.styles.text; ReApplySpecAndStyles()))
+ - [TomorrowNightBlue](macro:inline(ApplyStyleConfig('cfg/tomorrow.lua','TomorrowNightBlue'); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = c.styles.text; ReApplySpecAndStyles()))
+ - [TomorrowNightBright](macro:inline(ApplyStyleConfig('cfg/tomorrow.lua','TomorrowNightBright'); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = c.styles.text; ReApplySpecAndStyles()))
+ - [TomorrowNightEighties](macro:inline(ApplyStyleConfig('cfg/tomorrow.lua','TomorrowNightEighties'); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = c.styles.text; ReApplySpecAndStyles()))
+ - [Zenburn](macro:inline(ApplyStyleConfig('cfg/tomorrow.lua','Zenburn'); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = c.styles.text; ReApplySpecAndStyles()))
+ - [Monokai](macro:inline(ApplyStyleConfig('cfg/tomorrow.lua','Monokai'); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = c.styles.text; ReApplySpecAndStyles()))
+ - [Molokai](macro:inline(ApplyStyleConfig('cfg/tomorrow.lua','Molokai'); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = c.styles.text; ReApplySpecAndStyles()))
+ - [SolarizedDark](macro:inline(ApplyStyleConfig('cfg/tomorrow.lua','SolarizedDark'); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = c.styles.text; ReApplySpecAndStyles()))
+ - [SolarizedLight](macro:inline(ApplyStyleConfig('cfg/tomorrow.lua','SolarizedLight'); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = c.styles.text; ReApplySpecAndStyles()))
+ - [Notepad++](macro:inline(ApplyStyleConfig('cfg/tomorrow.lua','NotepadPlusPlus'); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = c.styles.text; ReApplySpecAndStyles()))
+ - [SciTeLuaIDE](macro:inline(ApplyStyleConfig('cfg/tomorrow.lua','SciTeLuaIDE'); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = c.styles.text; ReApplySpecAndStyles()))
+
+ - [ZeroBrane Studio](macro:inline(ide.config.styles = StylesGetDefault(); local c = ide.config; c.stylesoutshell = c.styles; c.styles.auxwindow = {}; ReApplySpecAndStyles()))
+
+2. Add the following code with the scheme you selected to `cfg/user.lua`.
+--]]
+
+styles = loadfile('cfg/tomorrow.lua')('TomorrowNightBlue')
+stylesoutshell = styles -- apply the same scheme to Output/Console windows
+styles.auxwindow = styles.text -- apply text colors to auxiliary windows
+styles.calltip = styles.text -- apply text colors to tooltips
+
+-- code example
+if false and true then func(1, 2, 3) end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/cfg/tomorrow.lua b/love2dToAPK/tools/tools/zbstudio-win/cfg/tomorrow.lua
new file mode 100644
index 0000000..6d88f7f
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/cfg/tomorrow.lua
@@ -0,0 +1,311 @@
+-- This is a file that sets color scheme based on Tomorrow format.
+-- Copyright 2011-14 Paul Kulchenko, ZeroBrane LLC
+
+-- Tomorrow colors from https://github.com/chriskempson/tomorrow-theme
+-- Zenburn colors from https://github.com/jnurmine/Zenburn/blob/master/colors/zenburn.vim (contributed by Srdjan Marković)
+-- Monokai colors from http://www.monokai.nl/blog/2006/07/15/textmate-color-theme/
+-- Molokai colors based on https://github.com/tomasr/molokai/blob/master/colors/molokai.vim
+-- Solarized colors from https://github.com/altercation/vim-colors-solarized
+
+local theme = ...
+
+local function h2d(n) return 0+('0x'..n) end
+local function H(c, bg) c = c:gsub('#','')
+ -- since alpha is not implemented, convert RGBA to RGB
+ -- assuming 0 is transparent and 255 is opaque
+ -- based on http://stackoverflow.com/a/2645218/1442917
+ local bg = bg and H(bg) or {255, 255, 255}
+ local a = #c > 6 and h2d(c:sub(7,8))/255 or 1
+ local r, g, b = h2d(c:sub(1,2)), h2d(c:sub(3,4)), h2d(c:sub(5,6))
+ return {
+ math.min(255, math.floor((1-a)*bg[1]+a*r)),
+ math.min(255, math.floor((1-a)*bg[2]+a*g)),
+ math.min(255, math.floor((1-a)*bg[3]+a*b))}
+end
+
+local colors = {
+ Tomorrow = {
+ Background = H'ffffff',
+ CurrentLine = H'efefef',
+ Selection = H'd6d6d6',
+ Foreground = H'4d4d4c',
+ Comment = H'8e908c',
+ Red = H'c82829',
+ Orange = H'f5871f',
+ Yellow = H'eab700',
+ Green = H'718c00',
+ Aqua = H'3e999f',
+ Blue = H'4271ae',
+ Purple = H'8959a8',
+ },
+ TomorrowContrast = { -- contributed by Sergey Lerg
+ Background = H'f7f7f7',
+ CurrentLine = H'efefef',
+ Selection = H'd6d6d6',
+ Foreground = H'202020',
+ Comment = H'8e908c',
+ Red = H'4669ff', --numbers
+ Orange = H'f5871f',
+ Yellow = H'eab700',
+ Green = H'108010', --strings
+ Aqua = H'4060b0', --built in functions
+ Blue = H'101080', --keywords
+ Purple = H'a01090',
+ },
+ TomorrowNight = {
+ Background = H'1d1f21',
+ CurrentLine = H'282a2e',
+ Selection = H'373b41',
+ Foreground = H'c5c8c6',
+ Comment = H'969896',
+ Red = H'cc6666',
+ Orange = H'de935f',
+ Yellow = H'f0c674',
+ Green = H'b5bd68',
+ Aqua = H'8abeb7',
+ Blue = H'81a2be',
+ Purple = H'b294bb',
+ },
+ TomorrowNightEighties = {
+ Background = H'2d2d2d',
+ CurrentLine = H'393939',
+ Selection = H'515151',
+ Foreground = H'cccccc',
+ Comment = H'999999',
+ Red = H'f2777a',
+ Orange = H'f99157',
+ Yellow = H'ffcc66',
+ Green = H'99cc99',
+ Aqua = H'66cccc',
+ Blue = H'6699cc',
+ Purple = H'cc99cc',
+ },
+ TomorrowNightBlue = {
+ Background = H'002451',
+ CurrentLine = H'00346e',
+ Selection = H'003f8e',
+ Foreground = H'ffffff',
+ Comment = H'7285b7',
+ Red = H'ff9da4',
+ Orange = H'ffc58f',
+ Yellow = H'ffeead',
+ Green = H'd1f1a9',
+ Aqua = H'99ffff',
+ Blue = H'bbdaff',
+ Purple = H'ebbbff',
+ },
+ TomorrowNightBright = {
+ Background = H'000000',
+ CurrentLine = H'2a2a2a',
+ Selection = H'424242',
+ Foreground = H'eaeaea',
+ Comment = H'969896',
+ Red = H'd54e53',
+ Orange = H'e78c45',
+ Yellow = H'e7c547',
+ Green = H'b9ca4a',
+ Aqua = H'70c0b1',
+ Blue = H'7aa6da',
+ Purple = H'c397d8',
+ },
+ Zenburn = {
+ Background = H'3f3f3f',
+ CurrentLine = H'363636',
+ Selection = H'1f1f1f',
+ Foreground = H'dcdccc',
+ Comment = H'7f9f7f',
+ Red = H'8cd0d3',
+ Orange = H'dfaf8f',
+ Yellow = H'e3ceab',
+ Green = H'cc9393',
+ Aqua = H'dca3a3',
+ Blue = H'f0dfaf',
+ Purple = H'efef8f',
+ },
+ Monokai = {
+ Background = H'272822',
+ CurrentLine = H'2D2F29',
+ Selection = H'49483E',
+ Foreground = H'F8F8F2',
+ Comment = H'75715E',
+ Red = H'AE81FF',
+ Orange = H'AE81FF',
+ Yellow = H'F8F8F2',
+ Green = H'E6DB74',
+ Aqua = H'66D9EF',
+ Blue = H'F92672',
+ Purple = H'A6E22E',
+ },
+ Molokai = {
+ Background = H'1B1D1E',
+ CurrentLine = H'293739',
+ Selection = H'49483E',
+ Foreground = H'F8F8F2',
+ Comment = H'7E8E91',
+ Red = H'AE81FF',
+ Orange = H'AE81FF',
+ Yellow = H'F8F8F2',
+ Green = H'E6DB74',
+ Aqua = H'66D9EF',
+ Blue = H'F92672',
+ Purple = H'A6E22E',
+ },
+ SolarizedDark = {
+ Background = H'042029',
+ CurrentLine = H'0A2933',
+ Selection = H'073642',
+ Foreground = H'839496',
+ Comment = H'586E75',
+ Red = H'D33682',
+ Orange = H'B58900',
+ Yellow = H'839496',
+ Green = H'2AA198',
+ Aqua = H'839496',
+ Blue = H'859900',
+ Purple = H'268BD2',
+ },
+ SolarizedLight = {
+ Background = H'FDF6E3',
+ CurrentLine = H'EEE8D5',
+ Selection = H'E0E0D0',
+ Foreground = H'586E75',
+ Comment = H'93A1A1',
+ Red = H'D33682',
+ Orange = H'B58900',
+ Yellow = H'586E75',
+ Green = H'2AA198',
+ Aqua = H'586E75',
+ Blue = H'859900',
+ Purple = H'268BD2',
+ },
+ NotepadPlusPlus = { -- contributed by Florian (https://github.com/SiENcE)
+ Background = H'FFFFFF',
+ CurrentLine = H'E9E2FF',
+ Selection = H'C0C0C0',
+ Foreground = H'000000',
+ Comment = H'008000',
+ Red = H'FF6900',
+ Orange = H'FF0000',
+ Yellow = H'FF4E00',
+ Green = H'808080',
+ Aqua = H'000080',
+ Blue = H'2123FF',
+ Purple = H'8000FF',
+ },
+ SciTeLuaIDE = { -- contributed by Jayanth Acharya
+ Background = H'1B1D1E',
+ CurrentLine = H'293739',
+ Selection = H'49483E',
+ Foreground = H'F8F8F2', -- super-light-gray (everything else)
+ Comment = H'00FF00', -- bright green (comments)
+ Red = H'F92672', -- purple (numbers)
+ Orange = H'AE81FF', -- lavendar?? (numbers)
+ Yellow = H'F8F8F2', -- light-gray
+ Green = H'FF8000', -- amber (string literal)
+ Aqua = H'808080', -- gray (operators, separators etc.)
+ Blue = H'0066FF', -- semi-blue (keywords)
+ Purple = H'A6E22E', -- light-grass-green
+ },
+}
+
+-- add more of the specified color (keeping all in 0-255 range)
+local mixer = function(c, n, more)
+ if not c or #c == 0 then return c end
+ local c = {c[1], c[2], c[3]} -- create a copy, so it can be modified
+ c[n] = c[n] + more
+ local excess = c[n] - 255
+ if excess > 0 then
+ for clr = 1, 3 do
+ c[clr] = n == clr and 255 or c[clr] > excess and c[clr] - excess or 0
+ end
+ end
+ return c
+end
+
+local C = colors[theme] or colors.Tomorrow
+return {
+ -- wxstc.wxSTC_LUA_DEFAULT
+ lexerdef = {fg = C.Foreground},
+ -- wxstc.wxSTC_LUA_COMMENT, wxstc.wxSTC_LUA_COMMENTLINE, wxstc.wxSTC_LUA_COMMENTDOC
+ comment = {fg = C.Comment, fill = true},
+ -- wxstc.wxSTC_LUA_STRING, wxstc.wxSTC_LUA_CHARACTER, wxstc.wxSTC_LUA_LITERALSTRING
+ stringtxt = {fg = C.Green},
+ -- wxstc.wxSTC_LUA_STRINGEOL
+ stringeol = {fg = C.Green, fill = true},
+ -- wxstc.wxSTC_LUA_PREPROCESSOR
+ preprocessor = {fg = C.Orange},
+ -- wxstc.wxSTC_LUA_OPERATOR
+ operator = {fg = C.Aqua},
+ -- wxstc.wxSTC_LUA_NUMBER
+ number = {fg = C.Red},
+
+ -- wxstc.wxSTC_LUA_WORD, wxstc.wxSTC_LUA_WORD2-8
+ keywords0 = {fg = C.Blue, b = true},
+ keywords1 = {fg = C.Aqua, b = false},
+ keywords2 = {fg = C.Aqua, b = true},
+ keywords3 = {fg = C.Purple, b = false},
+ keywords4 = {fg = C.Purple, b = false},
+ keywords5 = {fg = C.Purple, b = false},
+ keywords6 = {fg = C.Purple, b = false},
+ keywords7 = {fg = C.Purple, b = false},
+
+ -- common (inherit fg/bg from text)
+ -- wxstc.wxSTC_LUA_IDENTIFIER
+ text = {fg = C.Foreground, bg = C.Background},
+ linenumber = {fg = C.Comment},
+ bracematch = {fg = C.Orange, b = true},
+ bracemiss = {fg = C.Red, b = true},
+ ctrlchar = {fg = C.Yellow},
+ indent = {fg = C.Comment},
+ calltip = nil,
+
+ -- common special (need custom fg & bg)
+ sel = {bg = C.Selection},
+ caret = {fg = C.Foreground},
+ caretlinebg = {bg = C.CurrentLine},
+ fold = {fg = C.Comment, bg = C.Background, sel = mixer(C.Comment, 1, 96)},
+ whitespace = {fg = C.Comment, bg = C.Background},
+ edge = {},
+
+ indicator = {
+ fncall = {fg = C.Purple, st = wxstc.wxSTC_INDIC_HIDDEN},
+ --[[ other possible values are:
+ wxSTC_INDIC_PLAIN Single-line underline
+ wxSTC_INDIC_SQUIGGLE Squiggly underline
+ wxSTC_INDIC_TT Line of small T-shapes
+ wxSTC_INDIC_DIAGONAL Diagonal hatching
+ wxSTC_INDIC_STRIKE Strike-out
+ wxSTC_INDIC_BOX Box
+ wxSTC_INDIC_ROUNDBOX Rounded Box
+ --]]
+ -- these indicators have all different default styles
+ varlocal = {fg = C.Foreground},
+ varglobal = {fg = C.Foreground},
+ varmasked = {fg = C.Foreground},
+ varmasking = {fg = C.Foreground},
+ },
+
+ -- markup
+ ['['] = {hs = mixer(C.Comment, 3, 64)},
+ ['|'] = {fg = mixer(mixer(C.Comment, 1, 64), 3, 64)},
+
+ -- markers
+ marker = {
+ message = {bg = C.Selection},
+ output = {bg = C.CurrentLine},
+ prompt = {fg = C.Foreground, bg = C.Background},
+ error = {bg = mixer(C.Background, 1, 32)},
+ },
+}
+
+--[[
+
+---- Solarized license ----
+
+Copyright (c) 2011 Ethan Schoonover
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+--]]
diff --git a/love2dToAPK/tools/tools/zbstudio-win/cfg/user-sample.lua b/love2dToAPK/tools/tools/zbstudio-win/cfg/user-sample.lua
new file mode 100644
index 0000000..302ccf2
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/cfg/user-sample.lua
@@ -0,0 +1,170 @@
+--[[-- This file shows examples of settings you can adjust.
+
+Configuration files with preferences are loaded in the following order:
+1. cfg/user.lua (system-wide configuration)
+2. HOME/.zbstudio/user.lua (per-user configuration)
+3. -cfg <lua code fragment|filename> (command line configuration)
+
+See [configuration](http://studio.zerobrane.com/doc-configuration.html) page for information about location of configuration files.
+
+--]]--
+
+-- to modify loaded configuration for recognized extensions for lua files
+-- (no longer needed in v1.21+) local G = ... -- this now points to the global environment
+local luaspec = ide.specs.lua
+luaspec.exts[#luaspec.exts+1] = "luaz"
+luaspec.keywords[1] = luaspec.keywords[1] .. ' foo'
+
+-- to modify a key mapping; see the full list of IDs in src/editor/keymap.lua
+-- starting from v0.95, ID.<menuid> can be used instead of G.ID_<menuid>
+keymap[ID.STARTDEBUG] = "Ctrl-Shift-D"
+
+-- to change font size to 12
+editor.fontsize = 12 -- this is mapped to ide.config.editor.fontsize
+editor.fontname = "Courier New"
+filehistorylength = 20 -- this is mapped to ide.config.filehistorylength
+
+-- to specify full path to love2d *executable*; this is only needed
+-- if the game folder and the executable are NOT in the same folder.
+path.love2d = 'd:/lua/love/love'
+
+-- to specify full path to moai *executable* if it's not in one of PATH folders
+path.moai = 'd:/lua/moai/moai'
+-- Moai config.lua file is searched in the following places: (1) MOAI_CONFIG,
+-- (2) project directory (if set) or folder with the current file,
+-- (3) folder with the moai executable.
+
+-- to specify full path to gideros *executable* if it's not in one of PATH folders
+path.gideros = 'd:/Program Files/Gideros/GiderosPlayer.exe'
+
+-- to specify full path to corona *executable* if it's not in one of PATH folders
+path.corona = 'd:/path/to/Corona SDK/Corona Simulator.exe'
+
+-- to specify full path to lua interpreter if you need to use your own version
+path.lua = 'd:/lua/lua'
+
+-- to specify full path to GSL-shell *executable* if it's not in one of PATH folders
+path.gslshell = [[D:\Lua\gsl-shell\gsl-shell.exe]]
+
+-- to provide output filter for those engines that support redirecting
+-- of "print" output to the IDE (like Corona SDK or Gideros)
+debugger.outputfilter = function(m) return #m < 124 and m or m:sub(1,120).."...\n" end
+
+-- to fix an issue with 0d0d0a line endings in MOAI examples,
+-- which may negatively affect breakpoints during debugging
+editor.iofilter = "0d0d0aFix"
+
+-- to have 4 spaces when TAB is used in the editor
+editor.tabwidth = 4
+
+-- to have TABs stored in the file (to allow mixing tabs and spaces)
+editor.usetabs = true
+
+-- to disable wrapping of long lines in the editor
+editor.usewrap = false
+
+-- to turn dynamic words on and to start suggestions after 4 characters
+acandtip.nodynwords = false
+acandtip.startat = 4
+
+-- to automatically open files requested during debugging
+editor.autoactivate = true
+
+-- to specify a list of MOAI entrypoints
+moai = { entrypoints = { "main.lua", "source/main.lua" } }
+
+-- to specify language to use in the IDE (requires a file in cfg/i18n folder)
+language = "ru"
+
+-- to change background color (or other colors in the IDE);
+-- see cfg/tomorrow.lua for example/details on what other colors to change
+styles.text = {bg = {240,240,220}}
+
+-- to change the default color scheme; check tomorrow.lua for the list
+-- of supported schemes or use cfg/scheme-picker.lua to pick a scheme.
+-- (no longer needed in v1.21+) local G = ... -- this now points to the global environment
+styles = loadfile('cfg/tomorrow.lua')('Tomorrow')
+-- also apply the same scheme to Output and Console windows
+stylesoutshell = styles
+
+-- to change markers used in console and output windows
+styles.marker = styles.marker or {}
+styles.marker.message = {ch = wxstc.wxSTC_MARK_ARROWS, fg = {0, 0, 0}, bg = {240, 240, 240}}
+styles.marker.output = {ch = wxstc.wxSTC_MARK_BACKGROUND, fg = {0, 0, 0}, bg = {240, 240, 240}}
+styles.marker.prompt = {ch = wxstc.wxSTC_MARK_CHARACTER+('>'):byte(), fg = {0, 0, 0}, bg = {240, 240, 240}}
+stylesoutshell = styles
+
+-- to disable indicators (underlining) on function calls
+-- styles.indicator.fncall = nil
+
+-- to change the color of the indicator used for function calls
+styles.indicator.fncall.fg = {240,0,0}
+
+-- to change the type of the indicator used for function calls
+styles.indicator.fncall.st = wxstc.wxSTC_INDIC_PLAIN
+ --[[ other possible values are:
+ wxSTC_INDIC_DOTS Dotted underline; wxSTC_INDIC_PLAIN Single-line underline
+ wxSTC_INDIC_TT Line of Tshapes; wxSTC_INDIC_SQUIGGLE Squiggly underline
+ wxSTC_INDIC_STRIKE Strike-out; wxSTC_INDIC_SQUIGGLELOW Squiggly underline (2 pixels)
+ wxSTC_INDIC_BOX Box; wxSTC_INDIC_ROUNDBOX Rounded Box
+ wxSTC_INDIC_DASH Dashed underline; wxSTC_INDIC_STRAIGHTBOX Box with trasparency
+ wxSTC_INDIC_DOTBOX Dotted rectangle; wxSTC_INDIC_DIAGONAL Diagonal hatching
+ wxSTC_INDIC_HIDDEN No visual effect;
+ --]]
+
+-- to enable additional spec files (like spec/glsl.lua)
+load.specs(function(file) return file:find('spec[/\\]glsl%.lua$') end)
+
+-- to specify a default EOL encoding to be used for new files:
+-- `wxstc.wxSTC_EOL_CRLF` or `wxstc.wxSTC_EOL_LF`;
+-- `nil` means OS default: CRLF on Windows and LF on Linux/Unix and OSX.
+-- (OSX had CRLF as a default until v0.36, which fixed it).
+editor.defaulteol = wxstc.wxSTC_EOL_LF
+
+-- to turn off checking for mixed end-of-line encodings in loaded files
+editor.checkeol = false
+
+-- to force execution to continue immediately after starting debugging;
+-- set to `false` to disable (the interpreter will stop on the first line or
+-- when debugging starts); some interpreters may use `true` or `false`
+-- by default, but can be still reconfigured with this setting.
+debugger.runonstart = true
+
+-- to set compact fold that doesn't include empty lines after a block
+editor.foldcompact = true
+
+-- to disable zoom with mouse wheel as it may be too sensitive on OSX
+editor.nomousezoom = true
+
+-- to specify a skin for Corona simulator (OSX only);
+-- you can also change it between runs from Local Console by executing
+-- `ide.config.corona = {skin = 'iPad'}`
+corona = { skin = "iPad" }
+
+-- to style individual keywords; `return` and `break` are shown in red
+-- (no longer needed in v1.21+) local G = ... -- this now points to the global environment
+local luaspec = ide.specs.lua
+
+local num = #luaspec.keywords
+-- take a new slot in the list of keywords (starting from 1)
+luaspec.keywords[num+1] = 'return break'
+-- remove 'return' from the list of "regular" keywords
+luaspec.keywords[1] = luaspec.keywords[1]:gsub(' return', ''):gsub(' break', '')
+
+-- assign new style to the added slot (starting from 0)
+styles["keywords"..num] = {fg = {240, 0, 0}, b = true}
+
+-- enable `Opt+Shift+Left/Right` shortcut on OSX
+editor.keymap[#editor.keymap+1] = {wxstc.wxSTC_KEY_LEFT, wxstc.wxSTC_SCMOD_ALT+wxstc.wxSTC_SCMOD_SHIFT, wxstc.wxSTC_CMD_WORDLEFTEXTEND, "Macintosh"}
+editor.keymap[#editor.keymap+1] = {wxstc.wxSTC_KEY_RIGHT, wxstc.wxSTC_SCMOD_ALT+wxstc.wxSTC_SCMOD_SHIFT, wxstc.wxSTC_CMD_WORDRIGHTENDEXTEND, "Macintosh"}
+
+-- enable Emacs bindings to use `Ctrl-A` and `Ctrl-E` to go to the line start/end
+editor.keymap[#editor.keymap+1] = {('A'):byte(), wxstc.wxSTC_SCMOD_CTRL, wxstc.wxSTC_CMD_HOME}
+editor.keymap[#editor.keymap+1] = {('E'):byte(), wxstc.wxSTC_SCMOD_CTRL, wxstc.wxSTC_CMD_LINEEND}
+keymap[ID.SELECTALL] = nil -- remove `Ctrl-A` shortcut from `SelectAll`
+
+-- updated shortcuts to use them as of v1.20
+keymap[ID.BREAK] = "Shift-F9"
+keymap[ID.BREAKPOINTTOGGLE] = "F9"
+keymap[ID.BREAKPOINTNEXT] = ""
+keymap[ID.BREAKPOINTPREV] = ""
diff --git a/love2dToAPK/tools/tools/zbstudio-win/cfg/user.lua b/love2dToAPK/tools/tools/zbstudio-win/cfg/user.lua
new file mode 100644
index 0000000..6a8090a
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/cfg/user.lua
@@ -0,0 +1,56 @@
+--[[-- This file shows examples of settings you can adjust.
+
+Configuration files with preferences are loaded in the following order:
+1. cfg/user.lua (system-wide configuration)
+2. HOME/.zbstudio/user.lua (per-user configuration)
+3. -cfg <lua code fragment|filename> (command line configuration)
+
+See [configuration](http://studio.zerobrane.com/doc-configuration.html) page for information about location of configuration files.
+
+--]]--
+
+-- to modify a key mapping; see the full list of IDs in src/editor/keymap.lua
+-- starting from v0.95, ID.<menuid> can be used instead of G.ID_<menuid>
+keymap[ID.RUN] = "Ctrl-R"
+keymap[ID.REPLACE] = nil
+
+-- to change font size to 12
+editor.fontsize = 14 -- this is mapped to ide.config.editor.fontsize
+--editor.fontname = "Courier New"
+filehistorylength = 20 -- this is mapped to ide.config.filehistorylength
+
+-- to specify full path to love2d *executable*; this is only needed
+-- if the game folder and the executable are NOT in the same folder.
+path.love2d = '../tools/love-win/love.exe'
+
+-- to disable wrapping of long lines in the editor
+editor.usewrap = true
+
+-- to specify language to use in the IDE (requires a file in cfg/i18n folder)
+language = "en"
+
+-- do not offer dynamic (user entered) words; set to false to collect all words from all open editor tabs and offer them as part of the auto-complete list.
+acandtip.nodynwords = true
+
+-- to change the default color scheme; check tomorrow.lua for the list
+-- of supported schemes or use cfg/scheme-picker.lua to pick a scheme.
+-- (no longer needed in v1.21+) local G = ... -- this now points to the global environment
+styles = loadfile('cfg/tomorrow.lua')('Tomorrow')
+
+--TURN OFF UNDERLINING
+styles.indicator = {}
+
+-- also apply the same scheme to Output and Console windows
+stylesoutshell = styles
+
+-- to set compact fold that doesn't include empty lines after a block
+--editor.foldcompact = true
+
+-- set the default interpreter used for new projects
+interpreter = "love2d"
+
+-- https://github.com/pkulchenko/ZeroBraneStudio/issues/645
+ide.interpreters.love2d.skipcompile=true
+
+-- don't open output on run
+activateoutput = false
diff --git a/love2dToAPK/tools/tools/zbstudio-win/cfg/xcode-keys.lua b/love2dToAPK/tools/tools/zbstudio-win/cfg/xcode-keys.lua
new file mode 100644
index 0000000..2fec8a2
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/cfg/xcode-keys.lua
@@ -0,0 +1,73 @@
+-- Copy the content of this file to user.lua;
+-- see the [configuration](http://studio.zerobrane.com/doc-configuration.html) page for details.
+
+-- Alt-Shift-Cmd-X (Alt maps to Option, Ctrl maps to Command)
+-- The mapping is largely based on [Xcode Keyboard Shortcuts](http://developer.apple.com/library/mac/#documentation/IDEs/Conceptual/xcode_help-command_shortcuts/MenuCommands/MenuCommands014.html).
+local xcode = {
+-- File menu
+ [ID.NEW] = "Ctrl-N",
+ [ID.OPEN] = "Ctrl-O",
+ [ID.CLOSE] = "Ctrl-W",
+ [ID.SAVE] = "Ctrl-S",
+ [ID.SAVEAS] = "Shift-Ctrl-S",
+ [ID.SAVEALL] = "Alt-Ctrl-S",
+ [ID.RECENTFILES] = "",
+ [ID.EXIT] = "Ctrl-Q",
+-- Edit menu
+ [ID.CUT] = "Ctrl-X",
+ [ID.COPY] = "Ctrl-C",
+ [ID.PASTE] = "Ctrl-V",
+ [ID.SELECTALL] = "Ctrl-A",
+ [ID.UNDO] = "Ctrl-Z",
+ [ID.REDO] = "Shift-Ctrl-Z",
+ [ID.SHOWTOOLTIP] = "Ctrl-T",
+ [ID.AUTOCOMPLETE] = "Ctrl-K",
+ [ID.AUTOCOMPLETEENABLE] = "",
+ [ID.COMMENT] = "Ctrl-U",
+ [ID.FOLD] = "F12",
+ [ID.CLEARDYNAMICWORDS] = "",
+-- Search menu
+ [ID.FIND] = "Ctrl-F",
+ [ID.FINDNEXT] = "Ctrl-G",
+ [ID.FINDPREV] = "Shift-Ctrl-G",
+ [ID.REPLACE] = "Alt-Ctrl-F",
+ [ID.FINDINFILES] = "Shift-Ctrl-F",
+ [ID.REPLACEINFILES] = "Alt-Shift-Ctrl-F",
+ [ID.SORT] = "",
+-- View menu
+ [ID.VIEWFILETREE] = "Shift-Ctrl-P",
+ [ID.VIEWOUTPUT] = "Shift-Ctrl-O",
+ [ID.VIEWWATCHWINDOW] = "Shift-Ctrl-W",
+ [ID.VIEWCALLSTACK] = "Shift-Ctrl-S",
+ [ID.VIEWDEFAULTLAYOUT] = "",
+ [ID.VIEWFULLSCREEN] = "Shift-Ctrl-A",
+-- Project menu
+ [ID.RUN] = "Ctrl-R",
+ [ID.RUNNOW] = "Shift-Ctrl-R",
+ [ID.COMPILE] = "Ctrl-B",
+ [ID.ANALYZE] = "Shift-Ctrl-B",
+ [ID.STARTDEBUG] = "F5",
+ [ID.ATTACHDEBUG] = "",
+ [ID.STOPDEBUG] = "Ctrl-.",
+ [ID.STEP] = "F7",
+ [ID.STEPOVER] = "F6",
+ [ID.STEPOUT] = "F8",
+ [ID.TRACE] = "",
+ [ID.BREAK] = "Ctrl-Y",
+ [ID.BREAKPOINTTOGGLE] = "Ctrl-\\",
+ [ID.CLEAROUTPUT] = "",
+ [ID.INTERPRETER] = "",
+ [ID.PROJECTDIR] = "",
+-- Help menu
+ [ID.ABOUT] = "F1",
+-- Watch window menu items
+ [ID.ADDWATCH] = "Ins",
+ [ID.EDITWATCH] = "F2",
+ [ID.DELETEWATCH] = "Del",
+-- Editor popup menu items
+ [ID.QUICKADDWATCH] = "",
+ [ID.QUICKEVAL] = "",
+}
+
+local G = ...
+for id, key in G.pairs(xcode) do keymap[id] = key end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/interpreters/love2d.lua b/love2dToAPK/tools/tools/zbstudio-win/interpreters/love2d.lua
new file mode 100644
index 0000000..9059584
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/interpreters/love2d.lua
@@ -0,0 +1,61 @@
+-- Copyright 2011-12 Paul Kulchenko, ZeroBrane LLC
+
+local love2d
+local win = ide.osname == "Windows"
+local mac = ide.osname == "Macintosh"
+
+return {
+ name = "LÖVE",
+ description = "LÖVE game engine",
+ api = {"baselib", "love2d"},
+ frun = function(self,wfilename,rundebug)
+ love2d = love2d or ide.config.path.love2d -- check if the path is configured
+ if not love2d then
+ local sep = win and ';' or ':'
+ local default =
+ win and (GenerateProgramFilesPath('love', sep)..sep)
+ or mac and ('/Applications/love.app/Contents/MacOS'..sep)
+ or ''
+ local path = default
+ ..(os.getenv('PATH') or '')..sep
+ ..(GetPathWithSep(self:fworkdir(wfilename)))..sep
+ ..(os.getenv('HOME') and GetPathWithSep(os.getenv('HOME'))..'bin' or '')
+ local paths = {}
+ for p in path:gmatch("[^"..sep.."]+") do
+ love2d = love2d or GetFullPathIfExists(p, win and 'love.exe' or 'love')
+ table.insert(paths, p)
+ end
+ if not love2d then
+ DisplayOutputLn("Can't find love2d executable in any of the following folders: "
+ ..table.concat(paths, ", "))
+ return
+ end
+ end
+
+ if not GetFullPathIfExists(self:fworkdir(wfilename), 'main.lua') then
+ DisplayOutputLn(("Can't find 'main.lua' file in the current project folder: '%s'.")
+ :format(self:fworkdir(wfilename)))
+ return
+ end
+
+ if rundebug then
+ DebuggerAttachDefault({runstart = ide.config.debugger.runonstart == true})
+ end
+
+ -- suppress hiding ConsoleWindowClass as this is used by Love console
+ local uhw = ide.config.unhidewindow
+ local cwc = uhw and uhw.ConsoleWindowClass
+ if uhw then uhw.ConsoleWindowClass = 0 end
+
+ local params = ide.config.arg.any or ide.config.arg.love2d
+ local cmd = ('"%s" "%s"%s%s'):format(love2d, self:fworkdir(wfilename),
+ params and " "..params or "", rundebug and ' -debug' or '')
+ -- CommandLineRun(cmd,wdir,tooutput,nohide,stringcallback,uid,endcallback)
+ return CommandLineRun(cmd,self:fworkdir(wfilename),true,true,nil,nil,
+ function() if uhw then uhw.ConsoleWindowClass = cwc end end)
+ end,
+ hasdebugger = true,
+ fattachdebug = function(self) DebuggerAttachDefault() end,
+ scratchextloop = true,
+ takeparameters = true,
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/interpreters/luabase.lua b/love2dToAPK/tools/tools/zbstudio-win/interpreters/luabase.lua
new file mode 100644
index 0000000..d33edc2
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/interpreters/luabase.lua
@@ -0,0 +1,101 @@
+function MakeLuaInterpreter(version, name)
+
+local function exePath(self, version)
+ local version = tostring(version):gsub('%.','')
+ local mainpath = ide.editorFilename:gsub("[^/\\]+$","")
+ local macExe = mainpath..([[bin/lua.app/Contents/MacOS/lua%s]]):format(version)
+ return ide.config.path['lua'..version]
+ or (ide.osname == "Windows" and mainpath..([[bin\lua%s.exe]]):format(version))
+ or (ide.osname == "Unix" and mainpath..([[bin/linux/%s/lua%s]]):format(ide.osarch, version))
+ or (wx.wxFileExists(macExe) and macExe or mainpath..([[bin/lua%s]]):format(version))
+end
+
+return {
+ name = ("Lua%s"):format(name or version or ""),
+ description = ("Lua%s interpreter with debugger"):format(name or version or ""),
+ api = {"baselib"},
+ luaversion = version or '5.1',
+ fexepath = exePath,
+ frun = function(self,wfilename,rundebug)
+ local exe = self:fexepath(version or "")
+ local filepath = wfilename:GetFullPath()
+
+ do
+ -- if running on Windows and can't open the file, this may mean that
+ -- the file path includes unicode characters that need special handling
+ local fh = io.open(filepath, "r")
+ if fh then fh:close() end
+ if ide.osname == 'Windows' and pcall(require, "winapi")
+ and wfilename:FileExists() and not fh then
+ winapi.set_encoding(winapi.CP_UTF8)
+ local shortpath = winapi.short_path(filepath)
+ if shortpath == filepath then
+ DisplayOutputLn(
+ ("Can't get short path for a Unicode file name '%s' to open the file.")
+ :format(filepath))
+ DisplayOutputLn(
+ ("You can enable short names by using `fsutil 8dot3name set %s: 0` and recreate the file or directory.")
+ :format(wfilename:GetVolume()))
+ end
+ filepath = shortpath
+ end
+ end
+
+ if rundebug then
+ DebuggerAttachDefault({runstart = ide.config.debugger.runonstart == true})
+
+ -- update arg to point to the proper file
+ rundebug = ('if arg then arg[0] = [[%s]] end '):format(filepath)..rundebug
+
+ local tmpfile = wx.wxFileName()
+ tmpfile:AssignTempFileName(".")
+ filepath = tmpfile:GetFullPath()
+ local f = io.open(filepath, "w")
+ if not f then
+ DisplayOutputLn("Can't open temporary file '"..filepath.."' for writing.")
+ return
+ end
+ f:write(rundebug)
+ f:close()
+ end
+ local params = ide.config.arg.any or ide.config.arg.lua
+ local code = ([[-e "io.stdout:setvbuf('no')" "%s"]]):format(filepath)
+ local cmd = '"'..exe..'" '..code..(params and " "..params or "")
+
+ -- modify CPATH to work with other Lua versions
+ local envname = "LUA_CPATH"
+ if version then
+ local env = "LUA_CPATH_"..string.gsub(version, '%.', '_')
+ if os.getenv(env) then envname = env end
+ end
+
+ local cpath = os.getenv(envname)
+ if rundebug and cpath and not ide.config.path['lua'..(version or "")] then
+ -- prepend osclibs as the libraries may be needed for debugging,
+ -- but only if no path.lua is set as it may conflict with system libs
+ wx.wxSetEnv(envname, ide.osclibs..';'..cpath)
+ end
+ if version and cpath then
+ local cpath = os.getenv(envname)
+ local clibs = string.format('/clibs%s/', version):gsub('%.','')
+ if not cpath:find(clibs, 1, true) then cpath = cpath:gsub('/clibs/', clibs) end
+ wx.wxSetEnv(envname, cpath)
+ end
+
+ -- CommandLineRun(cmd,wdir,tooutput,nohide,stringcallback,uid,endcallback)
+ local pid = CommandLineRun(cmd,self:fworkdir(wfilename),true,false,nil,nil,
+ function() if rundebug then wx.wxRemoveFile(filepath) end end)
+
+ if (rundebug or version) and cpath then wx.wxSetEnv(envname, cpath) end
+ return pid
+ end,
+ hasdebugger = true,
+ fattachdebug = function(self) DebuggerAttachDefault() end,
+ scratchextloop = false,
+ unhideanywindow = true,
+ takeparameters = true,
+}
+
+end
+
+return nil -- as this is not a real interpreter
diff --git a/love2dToAPK/tools/tools/zbstudio-win/interpreters/luadeb.lua b/love2dToAPK/tools/tools/zbstudio-win/interpreters/luadeb.lua
new file mode 100644
index 0000000..49af279
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/interpreters/luadeb.lua
@@ -0,0 +1,2 @@
+dofile 'interpreters/luabase.lua'
+return MakeLuaInterpreter()
diff --git a/love2dToAPK/tools/tools/zbstudio-win/interpreters/luadeb52.lua b/love2dToAPK/tools/tools/zbstudio-win/interpreters/luadeb52.lua
new file mode 100644
index 0000000..989afbc
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/interpreters/luadeb52.lua
@@ -0,0 +1,2 @@
+dofile 'interpreters/luabase.lua'
+return MakeLuaInterpreter(5.2, ' 5.2')
diff --git a/love2dToAPK/tools/tools/zbstudio-win/interpreters/luadeb53.lua b/love2dToAPK/tools/tools/zbstudio-win/interpreters/luadeb53.lua
new file mode 100644
index 0000000..4b08672
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/interpreters/luadeb53.lua
@@ -0,0 +1,4 @@
+dofile 'interpreters/luabase.lua'
+local interpreter = MakeLuaInterpreter(5.3, ' 5.3')
+interpreter.skipcompile = true
+return interpreter
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/copas/copas.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/copas/copas.lua
new file mode 100644
index 0000000..dd68591
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/copas/copas.lua
@@ -0,0 +1,636 @@
+-------------------------------------------------------------------------------
+-- Copas - Coroutine Oriented Portable Asynchronous Services
+--
+-- A dispatcher based on coroutines that can be used by TCP/IP servers.
+-- Uses LuaSocket as the interface with the TCP/IP stack.
+--
+-- Authors: Andre Carregal, Javier Guerra, and Fabio Mascarenhas
+-- Contributors: Diego Nehab, Mike Pall, David Burgess, Leonardo Godinho,
+-- Thomas Harning Jr., and Gary NG
+--
+-- Copyright 2005 - Kepler Project (www.keplerproject.org)
+--
+-- $Id: copas.lua,v 1.37 2009/04/07 22:09:52 carregal Exp $
+-------------------------------------------------------------------------------
+
+if package.loaded["socket.http"] then
+ error("you must require copas before require'ing socket.http")
+end
+
+local socket = require "socket"
+local gettime = socket.gettime
+local coxpcall = require "coxpcall"
+
+local WATCH_DOG_TIMEOUT = 120
+local UDP_DATAGRAM_MAX = 8192
+
+-- Redefines LuaSocket functions with coroutine safe versions
+-- (this allows the use of socket.http from within copas)
+local function statusHandler(status, ...)
+ if status then return ... end
+ local err = (...)
+ if type(err) == "table" then
+ return nil, err[1]
+ else
+ error(err)
+ end
+end
+
+function socket.protect(func)
+ return function (...)
+ return statusHandler(coxpcall.pcall(func, ...))
+ end
+end
+
+function socket.newtry(finalizer)
+ return function (...)
+ local status = (...)
+ if not status then
+ coxpcall.pcall(finalizer, select(2, ...))
+ error({ (select(2, ...)) }, 0)
+ end
+ return ...
+ end
+end
+
+-- end of LuaSocket redefinitions
+
+local copas = {}
+
+-- Meta information is public even if beginning with an "_"
+copas._COPYRIGHT = "Copyright (C) 2005-2010 Kepler Project"
+copas._DESCRIPTION = "Coroutine Oriented Portable Asynchronous Services"
+copas._VERSION = "Copas 1.2.1"
+
+-- Close the socket associated with the current connection after the handler finishes
+copas.autoclose = true
+
+-------------------------------------------------------------------------------
+-- Simple set implementation based on LuaSocket's tinyirc.lua example
+-- adds a FIFO queue for each value in the set
+-------------------------------------------------------------------------------
+local function newset()
+ local reverse = {}
+ local set = {}
+ local q = {}
+ setmetatable(set, { __index = {
+ insert = function(set, value)
+ if not reverse[value] then
+ set[#set + 1] = value
+ reverse[value] = #set
+ end
+ end,
+
+ remove = function(set, value)
+ local index = reverse[value]
+ if index then
+ reverse[value] = nil
+ local top = set[#set]
+ set[#set] = nil
+ if top ~= value then
+ reverse[top] = index
+ set[index] = top
+ end
+ end
+ end,
+
+ push = function (set, key, itm)
+ local qKey = q[key]
+ if qKey == nil then
+ q[key] = {itm}
+ else
+ qKey[#qKey + 1] = itm
+ end
+ end,
+
+ pop = function (set, key)
+ local t = q[key]
+ if t ~= nil then
+ local ret = table.remove (t, 1)
+ if t[1] == nil then
+ q[key] = nil
+ end
+ return ret
+ end
+ end
+ }})
+ return set
+end
+
+local fnil = function()end
+local _sleeping = {
+ times = {}, -- list with wake-up times
+ cos = {}, -- list with coroutines, index matches the 'times' list
+ lethargy = {}, -- list of coroutines sleeping without a wakeup time
+
+ insert = fnil,
+ remove = fnil,
+ push = function(self, sleeptime, co)
+ if not co then return end
+ if sleeptime<0 then
+ --sleep until explicit wakeup through copas.wakeup
+ self.lethargy[co] = true
+ return
+ else
+ sleeptime = gettime() + sleeptime
+ end
+ local t, c = self.times, self.cos
+ local i, cou = 1, #t
+ --TODO: do a binary search
+ while i<=cou and t[i]<=sleeptime do i=i+1 end
+ table.insert(t, i, sleeptime)
+ table.insert(c, i, co)
+ end,
+ getnext = function(self) -- returns delay until next sleep expires, or nil if there is none
+ local t = self.times
+ local delay = t[1] and t[1] - gettime() or nil
+
+ return delay and math.max(delay, 0) or nil
+ end,
+ -- find the thread that should wake up to the time
+ pop = function(self, time)
+ local t, c = self.times, self.cos
+ if #t==0 or time<t[1] then return end
+ local co = c[1]
+ table.remove(t, 1)
+ table.remove(c, 1)
+ return co
+ end,
+ wakeup = function(self, co)
+ local let = self.lethargy
+ if let[co] then
+ self:push(0, co)
+ let[co] = nil
+ else
+ let = self.cos
+ for i=1,#let do
+ if let[i]==co then
+ table.remove(let, i)
+ local tm = self.times[i]
+ table.remove(self.times, i)
+ self:push(0, co)
+ return
+ end
+ end
+ end
+ end
+} --_sleeping
+
+local _servers = newset() -- servers being handled
+local _reading_log = {}
+local _writing_log = {}
+
+local _reading = newset() -- sockets currently being read
+local _writing = newset() -- sockets currently being written
+
+-------------------------------------------------------------------------------
+-- Coroutine based socket I/O functions.
+-------------------------------------------------------------------------------
+-- reads a pattern from a client and yields to the reading set on timeouts
+-- UDP: a UDP socket expects a second argument to be a number, so it MUST
+-- be provided as the 'pattern' below defaults to a string. Will throw a
+-- 'bad argument' error if omitted.
+function copas.receive(client, pattern, part)
+ local s, err
+ pattern = pattern or "*l"
+ repeat
+ s, err, part = client:receive(pattern, part)
+ if s or err ~= "timeout" then
+ _reading_log[client] = nil
+ return s, err, part
+ end
+ _reading_log[client] = gettime()
+ coroutine.yield(client, _reading)
+ until false
+end
+
+-- receives data from a client over UDP. Not available for TCP.
+-- (this is a copy of receive() method, adapted for receivefrom() use)
+function copas.receivefrom(client, size)
+ local s, err, port
+ size = size or UDP_DATAGRAM_MAX
+ repeat
+ s, err, port = client:receivefrom(size) -- upon success err holds ip address
+ if s or err ~= "timeout" then
+ _reading_log[client] = nil
+ return s, err, port
+ end
+ _reading_log[client] = gettime()
+ coroutine.yield(client, _reading)
+ until false
+end
+
+-- same as above but with special treatment when reading chunks,
+-- unblocks on any data received.
+function copas.receivePartial(client, pattern, part)
+ local s, err
+ pattern = pattern or "*l"
+ repeat
+ s, err, part = client:receive(pattern, part)
+ if s or ( (type(pattern)=="number") and part~="" and part ~=nil ) or
+ err ~= "timeout" then
+ _reading_log[client] = nil
+ return s, err, part
+ end
+ _reading_log[client] = gettime()
+ coroutine.yield(client, _reading)
+ until false
+end
+
+-- sends data to a client. The operation is buffered and
+-- yields to the writing set on timeouts
+-- Note: from and to parameters will be ignored by/for UDP sockets
+function copas.send(client, data, from, to)
+ local s, err,sent
+ from = from or 1
+ local lastIndex = from - 1
+
+ repeat
+ s, err, lastIndex = client:send(data, lastIndex + 1, to)
+ -- adds extra corrotine swap
+ -- garantees that high throuput dont take other threads to starvation
+ if (math.random(100) > 90) then
+ _writing_log[client] = gettime()
+ coroutine.yield(client, _writing)
+ end
+ if s or err ~= "timeout" then
+ _writing_log[client] = nil
+ return s, err,lastIndex
+ end
+ _writing_log[client] = gettime()
+ coroutine.yield(client, _writing)
+ until false
+end
+
+-- sends data to a client over UDP. Not available for TCP.
+-- (this is a copy of send() method, adapted for sendto() use)
+function copas.sendto(client, data, ip, port)
+ local s, err,sent
+
+ repeat
+ s, err = client:sendto(data, ip, port)
+ -- adds extra corrotine swap
+ -- garantees that high throuput dont take other threads to starvation
+ if (math.random(100) > 90) then
+ _writing_log[client] = gettime()
+ coroutine.yield(client, _writing)
+ end
+ if s or err ~= "timeout" then
+ _writing_log[client] = nil
+ return s, err
+ end
+ _writing_log[client] = gettime()
+ coroutine.yield(client, _writing)
+ until false
+end
+
+-- waits until connection is completed
+function copas.connect(skt, host, port)
+ skt:settimeout(0)
+ local ret, err
+ repeat
+ ret, err = skt:connect (host, port)
+ if ret or err ~= "timeout" then
+ _writing_log[skt] = nil
+ return ret, err
+ end
+ _writing_log[skt] = gettime()
+ coroutine.yield(skt, _writing)
+ until false
+ return ret, err
+end
+
+-- flushes a client write buffer (deprecated)
+function copas.flush(client)
+end
+
+-- wraps a TCP socket to use Copas methods (send, receive, flush and settimeout)
+local _skt_mt = {__index = {
+ send = function (self, data, from, to)
+ return copas.send (self.socket, data, from, to)
+ end,
+
+ receive = function (self, pattern, prefix)
+ if (self.timeout==0) then
+ return copas.receivePartial(self.socket, pattern, prefix)
+ end
+ return copas.receive(self.socket, pattern, prefix)
+ end,
+
+ flush = function (self)
+ return copas.flush(self.socket)
+ end,
+
+ settimeout = function (self,time)
+ self.timeout=time
+ return true
+ end,
+
+ skip = function(self, ...) return self.socket:skip(...) end,
+
+ close = function(self, ...) return self.socket:close(...) end,
+ }}
+
+-- wraps a UDP socket, copy of TCP one adapted for UDP.
+-- Mainly adds sendto() and receivefrom()
+local _skt_mt_udp = {__index = {
+ send = function (self, data)
+ return copas.send (self.socket, data)
+ end,
+
+ sendto = function (self, data, ip, port)
+ return copas.sendto (self.socket, data, ip, port)
+ end,
+
+ receive = function (self, size)
+ return copas.receive (self.socket, (size or UDP_DATAGRAM_MAX))
+ end,
+
+ receivefrom = function (self, size)
+ return copas.receivefrom (self.socket, (size or UDP_DATAGRAM_MAX))
+ end,
+
+ flush = function (self)
+ return copas.flush (self.socket)
+ end,
+
+ settimeout = function (self,time)
+ self.timeout=time
+ return true
+ end,
+ }}
+
+function copas.wrap (skt)
+ if string.sub(tostring(skt),1,3) == "udp" then
+ return setmetatable ({socket = skt}, _skt_mt_udp)
+ else
+ return setmetatable ({socket = skt}, _skt_mt)
+ end
+end
+
+--------------------------------------------------
+-- Error handling
+--------------------------------------------------
+
+local _errhandlers = {} -- error handler per coroutine
+
+function copas.setErrorHandler (err)
+ local co = coroutine.running()
+ if co then
+ _errhandlers [co] = err
+ end
+end
+
+local function _deferror (msg, co, skt)
+ print (msg, co, skt)
+end
+
+-------------------------------------------------------------------------------
+-- Thread handling
+-------------------------------------------------------------------------------
+
+local function _doTick (co, skt, ...)
+ if not co then return end
+
+ local ok, res, new_q = coroutine.resume(co, skt, ...)
+
+ if ok and res and new_q then
+ new_q:insert (res)
+ new_q:push (res, co)
+ else
+ if not ok then coxpcall.pcall (_errhandlers [co] or _deferror, res, co, skt) end
+ if skt and copas.autoclose then skt:close() end
+ _errhandlers [co] = nil
+ end
+end
+
+-- accepts a connection on socket input
+local function _accept(input, handler)
+ local client = input:accept()
+ if client then
+ client:settimeout(0)
+ local co = coroutine.create(handler)
+ _doTick (co, client)
+ --_reading:insert(client)
+ end
+ return client
+end
+
+-- handle threads on a queue
+local function _tickRead (skt)
+ _doTick (_reading:pop (skt), skt)
+end
+
+local function _tickWrite (skt)
+ _doTick (_writing:pop (skt), skt)
+end
+
+-------------------------------------------------------------------------------
+-- Adds a server/handler pair to Copas dispatcher
+-------------------------------------------------------------------------------
+local function addTCPserver(server, handler, timeout)
+ server:settimeout(timeout or 0.1)
+ _servers[server] = handler
+ _reading:insert(server)
+end
+
+local function addUDPserver(server, handler, timeout)
+ server:settimeout(timeout or 0)
+ local co = coroutine.create(handler)
+ _reading:insert(server)
+ _doTick (co, server)
+end
+
+function copas.addserver(server, handler, timeout)
+ if string.sub(tostring(server),1,3) == "udp" then
+ addUDPserver(server, handler, timeout)
+ else
+ addTCPserver(server, handler, timeout)
+ end
+end
+
+function copas.removeserver(server)
+ _servers[server] = nil
+ _reading:remove(server)
+ return server:close()
+end
+
+-------------------------------------------------------------------------------
+-- Adds an new courotine thread to Copas dispatcher
+-------------------------------------------------------------------------------
+function copas.addthread(thread, ...)
+ if type(thread) ~= "thread" then
+ thread = coroutine.create(thread)
+ end
+ _doTick (thread, nil, ...)
+ return thread
+end
+
+-------------------------------------------------------------------------------
+-- tasks registering
+-------------------------------------------------------------------------------
+
+local _tasks = {}
+
+local function addtaskRead (tsk)
+ -- lets tasks call the default _tick()
+ tsk.def_tick = _tickRead
+
+ _tasks [tsk] = true
+end
+
+local function addtaskWrite (tsk)
+ -- lets tasks call the default _tick()
+ tsk.def_tick = _tickWrite
+
+ _tasks [tsk] = true
+end
+
+local function tasks ()
+ return next, _tasks
+end
+
+-------------------------------------------------------------------------------
+-- main tasks: manage readable and writable socket sets
+-------------------------------------------------------------------------------
+-- a task to check ready to read events
+local _readable_t = {
+ events = function(self)
+ local i = 0
+ return function ()
+ i = i + 1
+ return self._evs [i]
+ end
+ end,
+
+ tick = function (self, input)
+ local handler = _servers[input]
+ if handler then
+ input = _accept(input, handler)
+ else
+ _reading:remove (input)
+ self.def_tick (input)
+ end
+ end
+}
+
+addtaskRead (_readable_t)
+
+
+-- a task to check ready to write events
+local _writable_t = {
+ events = function (self)
+ local i = 0
+ return function ()
+ i = i + 1
+ return self._evs [i]
+ end
+ end,
+
+ tick = function (self, output)
+ _writing:remove (output)
+ self.def_tick (output)
+ end
+}
+
+addtaskWrite (_writable_t)
+--
+--sleeping threads task
+local _sleeping_t = {
+ tick = function (self, time, ...)
+ _doTick(_sleeping:pop(time), ...)
+ end
+}
+
+-- yields the current coroutine and wakes it after 'sleeptime' seconds.
+-- If sleeptime<0 then it sleeps until explicitly woken up using 'wakeup'
+function copas.sleep(sleeptime)
+ coroutine.yield((sleeptime or 0), _sleeping)
+end
+
+-- Wakes up a sleeping coroutine 'co'.
+function copas.wakeup(co)
+ _sleeping:wakeup(co)
+end
+
+local last_cleansing = 0
+
+-------------------------------------------------------------------------------
+-- Checks for reads and writes on sockets
+-------------------------------------------------------------------------------
+local function _select (timeout)
+ local err
+ local now = gettime()
+ local duration = function(t2, t1) return t2-t1 end
+
+ _readable_t._evs, _writable_t._evs, err = socket.select(_reading, _writing, timeout)
+ local r_evs, w_evs = _readable_t._evs, _writable_t._evs
+
+ if duration(now, last_cleansing) > WATCH_DOG_TIMEOUT then
+ last_cleansing = now
+ for k,v in pairs(_reading_log) do
+ if not r_evs[k] and duration(now, v) > WATCH_DOG_TIMEOUT then
+ _reading_log[k] = nil
+ r_evs[#r_evs + 1] = k
+ r_evs[k] = #r_evs
+ end
+ end
+
+ for k,v in pairs(_writing_log) do
+ if not w_evs[k] and duration(now, v) > WATCH_DOG_TIMEOUT then
+ _writing_log[k] = nil
+ w_evs[#w_evs + 1] = k
+ w_evs[k] = #w_evs
+ end
+ end
+ end
+
+ if err == "timeout" and #r_evs + #w_evs > 0 then
+ return nil
+ else
+ return err
+ end
+end
+
+
+-------------------------------------------------------------------------------
+-- Dispatcher loop step.
+-- Listen to client requests and handles them
+-- Returns false if no data was handled (timeout), or true if there was data
+-- handled (or nil + error message)
+-------------------------------------------------------------------------------
+function copas.step(timeout)
+ _sleeping_t:tick(gettime())
+
+ -- Need to wake up the select call it time for the next sleeping event
+ local nextwait = _sleeping:getnext()
+ if nextwait then
+ timeout = timeout and math.min(nextwait, timeout) or nextwait
+ end
+
+ local err = _select (timeout)
+ if err == "timeout" then return false end
+
+ if err then
+ error(err)
+ end
+
+ for tsk in tasks() do
+ for ev in tsk:events() do
+ tsk:tick (ev)
+ end
+ end
+ return true
+end
+
+-------------------------------------------------------------------------------
+-- Dispatcher endless loop.
+-- Listen to client requests and handles them forever
+-------------------------------------------------------------------------------
+function copas.loop(timeout)
+ while true do
+ copas.step(timeout)
+ end
+end
+
+return copas
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/coxpcall/coxpcall.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/coxpcall/coxpcall.lua
new file mode 100644
index 0000000..c34bb72
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/coxpcall/coxpcall.lua
@@ -0,0 +1,68 @@
+-------------------------------------------------------------------------------
+-- Coroutine safe xpcall and pcall versions
+--
+-- Encapsulates the protected calls with a coroutine based loop, so errors can
+-- be dealed without the usual Lua 5.x pcall/xpcall issues with coroutines
+-- yielding inside the call to pcall or xpcall.
+--
+-- Authors: Roberto Ierusalimschy and Andre Carregal
+-- Contributors: Thomas Harning Jr., Ignacio Burgueo, Fabio Mascarenhas
+--
+-- Copyright 2005 - Kepler Project (www.keplerproject.org)
+--
+-- $Id: coxpcall.lua,v 1.13 2008/05/19 19:20:02 mascarenhas Exp $
+-------------------------------------------------------------------------------
+
+-- Lua 5.2 makes this module a no-op
+if _VERSION == "Lua 5.2" then
+ copcall = pcall
+ coxpcall = xpcall
+ return { pcall = pcall, xpcall = xpcall }
+end
+
+-------------------------------------------------------------------------------
+-- Implements xpcall with coroutines
+-------------------------------------------------------------------------------
+local performResume, handleReturnValue
+local oldpcall, oldxpcall = pcall, xpcall
+local pack = table.pack or function(...) return {n = select("#", ...), ...} end
+local unpack = table.unpack or unpack
+
+function handleReturnValue(err, co, status, ...)
+ if not status then
+ return false, err(debug.traceback(co, (...)), ...)
+ end
+ if coroutine.status(co) == 'suspended' then
+ return performResume(err, co, coroutine.yield(...))
+ else
+ return true, ...
+ end
+end
+
+function performResume(err, co, ...)
+ return handleReturnValue(err, co, coroutine.resume(co, ...))
+end
+
+function coxpcall(f, err, ...)
+ local res, co = oldpcall(coroutine.create, f)
+ if not res then
+ local params = pack(...)
+ local newf = function() return f(unpack(params, 1, params.n)) end
+ co = coroutine.create(newf)
+ end
+ return performResume(err, co, ...)
+end
+
+-------------------------------------------------------------------------------
+-- Implements pcall with coroutines
+-------------------------------------------------------------------------------
+
+local function id(trace, ...)
+ return ...
+end
+
+function copcall(f, ...)
+ return coxpcall(f, id, ...)
+end
+
+return { pcall = copcall, xpcall = coxpcall } \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/config.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/config.lua
new file mode 100644
index 0000000..3139750
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/config.lua
@@ -0,0 +1,112 @@
+-- Luadist configuration
+
+module ("dist.config", package.seeall)
+
+local sys = require "dist.sys"
+local utils = require "dist.utils"
+local win = (os.getenv('WINDIR') or (os.getenv('OS') or ''):match('[Ww]indows'))
+ and not (os.getenv('OSTYPE') or ''):match('cygwin') -- exclude cygwin
+
+-- System information ------------------------------------------------
+version = "0.2.7" -- Current LuaDist version
+-- set initial architecture as it's important for path separators
+arch = win and "Windows" or "Linux" -- Host architecture
+type = "x86" -- Host type
+
+-- Directories -------------------------------------------------------
+root_dir = os.getenv("DIST_ROOT") or utils.get_luadist_location() or sys.path_separator()
+temp_dir = "tmp"
+cache_dir = sys.make_path(temp_dir, "cache")
+distinfos_dir = sys.make_path("share", "luadist-git", "dists")
+test_dir = sys.make_path("share", "luadist-git", "test")
+
+-- Files -------------------------------------------------------------
+manifest_file = sys.make_path(cache_dir, ".gitmodules")
+dep_cache_file = sys.make_path(cache_dir, ".depcache")
+log_file = sys.make_path(temp_dir, "luadist.log")
+cache_file = ""
+
+-- Repositories ------------------------------------------------------
+repos = {
+ "git://github.com/LuaDist/Repository.git",
+}
+
+upload_url = "git@github.com:LuaDist" -- must not contain trailing '/'
+
+-- Settings ----------------------------------------------------------
+debug = false -- Use debug mode.
+verbose = false -- Print verbose output.
+simulate = false -- Only simulate installation of packages.
+binary = true -- Use binary version of modules.
+source = true -- Use source version of modules.
+test = false -- Run CTest before install.
+
+cache = true -- Use cache.
+cache_timeout = 3 * 60 * 60 -- Cache timeout in seconds.
+
+dep_cache = true -- Use cache for dependency information (tree functionality).
+
+-- Components (of modules) that will be installed.
+components = {
+ "Runtime", "Library", "Header", "Data", "Documentation", "Example", "Test", "Other", "Unspecified"
+}
+
+-- Available log levels are: DEBUG, INFO, WARN, ERROR, FATAL (see dist.logger for more information).
+print_log_level = "WARN" -- Minimum level for log messages to be printed (nil to disable).
+write_log_level = "INFO" -- Minimum level for log messages to be logged (nil to disable).
+
+
+-- CMake variables ---------------------------------------------------
+variables = {
+ --- Install defaults
+ INSTALL_BIN = "bin",
+ INSTALL_LIB = "lib",
+ INSTALL_INC = "include",
+ INSTALL_ETC = "etc",
+ INSTALL_LMOD = "lib/lua",
+ INSTALL_CMOD = "lib/lua",
+
+ --- LuaDist specific variables
+ DIST_VERSION = version,
+ DIST_ARCH = arch,
+ DIST_TYPE = type,
+
+ -- CMake specific setup
+ CMAKE_GENERATOR = win and "MinGW Makefiles" or "Unix Makefiles",
+ CMAKE_BUILD_TYPE = "MinSizeRel",
+
+ -- RPath functionality
+ CMAKE_SKIP_BUILD_RPATH = "FALSE",
+ CMAKE_BUILD_WITH_INSTALL_RPATH = "FALSE",
+ CMAKE_INSTALL_RPATH = "$ORIGIN/../lib",
+ CMAKE_INSTALL_RPATH_USE_LINK_PATH = "TRUE",
+ CMAKE_INSTALL_NAME_DIR = "@executable_path/../lib",
+
+ -- OSX specific
+ CMAKE_OSX_ARCHITECTURES = "",
+}
+
+-- Building ----------------------------------------------------------
+cmake = "cmake"
+ctest = "ctest"
+
+cache_command = cmake .. " -C cache.cmake"
+build_command = cmake .. " --build . --clean-first"
+
+install_component_command = " -DCOMPONENT=#COMPONENT# -P cmake_install.cmake"
+
+test_command = ctest .. " -V ."
+
+strip_option = " -DCMAKE_INSTALL_DO_STRIP=true"
+cache_debug_options = "-DCMAKE_VERBOSE_MAKEFILE=true -DCMAKE_BUILD_TYPE=Debug"
+build_debug_options = ""
+
+-- Add -j option to make in case of unix makefiles to speed up builds
+if (variables.CMAKE_GENERATOR == "Unix Makefiles") then
+ build_command = build_command .. " -- -j6"
+end
+
+-- Add -j option to make in case of MinGW makefiles to speed up builds
+if (variables.CMAKE_GENERATOR == "MinGW Makefiles") then
+ build_command = "set SHELL=cmd.exe && " .. build_command .. " -- -j"
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/constraints.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/constraints.lua
new file mode 100644
index 0000000..1b5cfec
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/constraints.lua
@@ -0,0 +1,271 @@
+-- Note: the code of this module is borrowed from the original LuaDist project
+
+
+
+--- LuaDist version constraints functions
+-- Peter Drahoš, LuaDist Project, 2010
+-- Original Code borrowed from LuaRocks Project
+
+--- Version constraints handling functions.
+-- Dependencies are represented in LuaDist through strings with
+-- a dist name followed by a comma-separated list of constraints.
+-- Each constraint consists of an operator and a version number.
+-- In this string format, version numbers are represented as
+-- naturally as possible, like they are used by upstream projects
+-- (e.g. "2.0beta3"). Internally, LuaDist converts them to a purely
+-- numeric representation, allowing comparison following some
+-- "common sense" heuristics. The precise specification of the
+-- comparison criteria is the source code of this module, but the
+-- test/test_deps.lua file included with LuaDist provides some
+-- insights on what these criteria are.
+
+module ("dist.constraints", package.seeall)
+
+
+local operators = {
+ ["=="] = "==",
+ ["~="] = "~=",
+ [">"] = ">",
+ ["<"] = "<",
+ [">="] = ">=",
+ ["<="] = "<=",
+ ["~>"] = "~>",
+ -- plus some convenience translations
+ [""] = "==",
+ ["-"] = "==",
+ ["="] = "==",
+ ["!="] = "~="
+}
+
+local deltas = {
+ scm = -100,
+ rc = -1000,
+ pre = -10000,
+ beta = -100000,
+ alpha = -1000000,
+ work = -10000000,
+}
+
+local version_mt = {
+ --- Equality comparison for versions.
+ -- All version numbers must be equal.
+ -- If both versions have revision numbers, they must be equal;
+ -- otherwise the revision number is ignored.
+ -- @param v1 table: version table to compare.
+ -- @param v2 table: version table to compare.
+ -- @return boolean: true if they are considered equivalent.
+ __eq = function(v1, v2)
+ if #v1 ~= #v2 then
+ return false
+ end
+ for i = 1, #v1 do
+ if v1[i] ~= v2[i] then
+ return false
+ end
+ end
+ if v1.revision and v2.revision then
+ return (v1.revision == v2.revision)
+ end
+ return true
+ end,
+ --- Size comparison for versions.
+ -- All version numbers are compared.
+ -- If both versions have revision numbers, they are compared;
+ -- otherwise the revision number is ignored.
+ -- @param v1 table: version table to compare.
+ -- @param v2 table: version table to compare.
+ -- @return boolean: true if v1 is considered lower than v2.
+ __lt = function(v1, v2)
+ for i = 1, math.max(#v1, #v2) do
+ local v1i, v2i = v1[i] or 0, v2[i] or 0
+ if v1i ~= v2i then
+ return (v1i < v2i)
+ end
+ end
+ if v1.revision and v2.revision then
+ return (v1.revision < v2.revision)
+ end
+ return false
+ end
+}
+
+local version_cache = {}
+setmetatable(version_cache, {
+ __mode = "kv"
+})
+
+--- Parse a version string, converting to table format.
+-- A version table contains all components of the version string
+-- converted to numeric format, stored in the array part of the table.
+-- If the version contains a revision, it is stored numerically
+-- in the 'revision' field. The original string representation of
+-- the string is preserved in the 'string' field.
+-- Returned version tables use a metatable
+-- allowing later comparison through relational operators.
+-- @param vstring string: A version number in string format.
+-- @return table or nil: A version table or nil
+-- if the input string contains invalid characters.
+function parseVersion(vstring)
+ if not vstring then return nil end
+ assert(type(vstring) == "string")
+
+ local cached = version_cache[vstring]
+ if cached then
+ return cached
+ end
+
+ local version = {}
+ local i = 1
+
+ local function add_token(number)
+ version[i] = version[i] and version[i] + number/100000 or number
+ i = i + 1
+ end
+
+ -- trim leading and trailing spaces
+ vstring = vstring:match("^%s*(.*)%s*$")
+ version.string = vstring
+ -- store revision separately if any
+ local main, revision = vstring:match("(.*)%-(%d+)$")
+ if revision then
+ vstring = main
+ version.revision = tonumber(revision)
+ end
+ while #vstring > 0 do
+ -- extract a number
+ local token, rest = vstring:match("^(%d+)[%.%-%_]*(.*)")
+ if token then
+ add_token(tonumber(token))
+ else
+ -- extract a word
+ token, rest = vstring:match("^(%a+)[%.%-%_]*(.*)")
+ if not token then
+ return nil
+ end
+ local last = #version
+ version[i] = deltas[token] or (token:byte() / 1000)
+ end
+ vstring = rest
+ end
+ setmetatable(version, version_mt)
+ version_cache[vstring] = version
+ return version
+end
+
+--- Utility function to compare version numbers given as strings.
+-- @param a string: one version.
+-- @param b string: another version.
+-- @return boolean: True if a > b.
+function compareVersions(a, b)
+ return parseVersion(a) > parseVersion(b)
+end
+
+--- Consumes a constraint from a string, converting it to table format.
+-- For example, a string ">= 1.0, > 2.0" is converted to a table in the
+-- format {op = ">=", version={1,0}} and the rest, "> 2.0", is returned
+-- back to the caller.
+-- @param input string: A list of constraints in string format.
+-- @return (table, string) or nil: A table representing the same
+-- constraints and the string with the unused input, or nil if the
+-- input string is invalid.
+local function parseConstraint(input)
+ assert(type(input) == "string")
+
+ local op, version, rest = input:match("^([<>=~!]*)%s*([%w%.%_%-]+)[%s,]*(.*)")
+ op = operators[op]
+ version = parseVersion(version)
+ if not op or not version then return nil end
+ return { op = op, version = version }, rest
+end
+
+--- Convert a list of constraints from string to table format.
+-- For example, a string ">= 1.0, < 2.0" is converted to a table in the format
+-- {{op = ">=", version={1,0}}, {op = "<", version={2,0}}}.
+-- Version tables use a metatable allowing later comparison through
+-- relational operators.
+-- @param input string: A list of constraints in string format.
+-- @return table or nil: A table representing the same constraints,
+-- or nil if the input string is invalid.
+function parseConstraints(input)
+ assert(type(input) == "string")
+
+ local constraints, constraint = {}, nil
+ while #input > 0 do
+ constraint, input = parseConstraint(input)
+ if constraint then
+ table.insert(constraints, constraint)
+ else
+ return nil
+ end
+ end
+ return constraints
+end
+
+--- A more lenient check for equivalence between versions.
+-- This returns true if the requested components of a version
+-- match and ignore the ones that were not given. For example,
+-- when requesting "2", then "2", "2.1", "2.3.5-9"... all match.
+-- When requesting "2.1", then "2.1", "2.1.3" match, but "2.2"
+-- doesn't.
+-- @param version string or table: Version to be tested; may be
+-- in string format or already parsed into a table.
+-- @param requested string or table: Version requested; may be
+-- in string format or already parsed into a table.
+-- @return boolean: True if the tested version matches the requested
+-- version, false otherwise.
+local function partialMatch(version, requested)
+ assert(type(version) == "string" or type(version) == "table")
+ assert(type(requested) == "string" or type(version) == "table")
+
+ if type(version) ~= "table" then version = parseVersion(version) end
+ if type(requested) ~= "table" then requested = parseVersion(requested) end
+ if not version or not requested then return false end
+
+ for i = 1, #requested do
+ if requested[i] ~= version[i] then return false end
+ end
+ if requested.revision then
+ return requested.revision == version.revision
+ end
+ return true
+end
+
+--- Check if a version satisfies a set of constraints.
+-- @param version table: A version in table format
+-- @param constraints table: An array of constraints in table format.
+-- @return boolean: True if version satisfies all constraints,
+-- false otherwise.
+function matchConstraints(version, constraints)
+ assert(type(version) == "table")
+ assert(type(constraints) == "table")
+ local ok = true
+ setmetatable(version, version_mt)
+ for _, constr in pairs(constraints) do
+ local constr_version = constr.version
+ setmetatable(constr.version, version_mt)
+ if constr.op == "==" then ok = version == constr_version
+ elseif constr.op == "~=" then ok = version ~= constr_version
+ elseif constr.op == ">" then ok = version > constr_version
+ elseif constr.op == "<" then ok = version < constr_version
+ elseif constr.op == ">=" then ok = version >= constr_version
+ elseif constr.op == "<=" then ok = version <= constr_version
+ elseif constr.op == "~>" then ok = partialMatch(version, constr_version)
+ end
+ if not ok then break end
+ end
+ return ok
+end
+
+--- Check if a version string is satisfied by a constraint string.
+-- @param version string: A version in string format
+-- @param constraints string: Constraints in string format.
+-- @return boolean: True if version satisfies all constraints,
+-- false otherwise.
+function constraint_satisfied(version, constraints)
+ local const = parseConstraints(constraints)
+ local ver = parseVersion(version)
+ if const and ver then
+ return matchConstraints(ver, const)
+ end
+ return nil, "Error parsing versions."
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/depends.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/depends.lua
new file mode 100644
index 0000000..2a6b7f0
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/depends.lua
@@ -0,0 +1,770 @@
+-- Utility functions for dependencies
+
+module ("dist.depends", package.seeall)
+
+local cfg = require "dist.config"
+local mf = require "dist.manifest"
+local sys = require "dist.sys"
+local const = require "dist.constraints"
+local utils = require "dist.utils"
+local package = require "dist.package"
+
+-- Return all packages with specified names from manifest.
+-- Names can also contain version constraint (e.g. 'copas>=1.2.3', 'saci-1.0' etc.).
+function find_packages(package_names, manifest)
+ if type(package_names) == "string" then package_names = {package_names} end
+ manifest = manifest or mf.get_manifest()
+ assert(type(package_names) == "table", "depends.find_packages: Argument 'package_names' is not a table or string.")
+ assert(type(manifest) == "table", "depends.find_packages: Argument 'manifest' is not a table.")
+
+ local packages_found = {}
+ -- find matching packages in manifest
+ for _, pkg_to_find in pairs(package_names) do
+ local pkg_name, pkg_constraint = split_name_constraint(pkg_to_find)
+ pkg_name = utils.escape_magic(pkg_name):gsub("%%%*",".*")
+ for _, repo_pkg in pairs(manifest) do
+ if string.match(repo_pkg.name, "^" .. pkg_name .. "$") and (not pkg_constraint or satisfies_constraint(repo_pkg.version, pkg_constraint)) then
+ table.insert(packages_found, repo_pkg)
+ end
+ end
+ end
+ return packages_found
+end
+
+-- Return manifest consisting of packages installed in specified deploy_dir directory
+function get_installed(deploy_dir)
+ deploy_dir = deploy_dir or cfg.root_dir
+ assert(type(deploy_dir) == "string", "depends.get_installed: Argument 'deploy_dir' is not a string.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local distinfos_path = sys.make_path(deploy_dir, cfg.distinfos_dir)
+ local manifest = {}
+
+ if not sys.is_dir(distinfos_path) then return {} end
+
+ -- from all directories of packages installed in deploy_dir
+ for dir in sys.get_directory(distinfos_path) do
+
+ if dir ~= "." and dir ~= ".." and sys.is_dir(sys.make_path(distinfos_path, dir)) then
+ local pkg_dist_dir = sys.make_path(distinfos_path, dir)
+
+ -- load the dist.info file
+ for file in sys.get_directory(pkg_dist_dir) do
+ local pkg_dist_file = sys.make_path(pkg_dist_dir, file)
+
+ if sys.is_file(pkg_dist_file) then
+ table.insert(manifest, mf.load_distinfo(pkg_dist_file))
+ end
+ end
+
+ end
+
+ end
+ return manifest
+end
+
+-- If 'pkg.selected' == true then returns 'selected' else 'installed'.
+-- Used in error messages.
+local function selected_or_installed(pkg)
+ assert(type(pkg) == "table", "depends.selected_or_installed: Argument 'pkg' is not a table.")
+ if pkg.selected == true then
+ return "selected"
+ else
+ return "installed"
+ end
+end
+
+-- Return whether the 'package_name' is installed according to the the manifest 'installed_pkgs'
+-- If optional 'version_wanted' constraint is specified, then installed packages must
+-- also satisfy specified version constraint.
+-- If package is installed but doesn't satisfy version constraint, error message
+-- is returned as the second value.
+function is_installed(package_name, installed_pkgs, version_wanted)
+ assert(type(package_name) == "string", "depends.is_installed: Argument 'package_name' is not a string.")
+ assert(type(installed_pkgs) == "table", "depends.is_installed: Argument 'installed_pkgs' is not a table.")
+ assert(type(version_wanted) == "string" or type(version_wanted) == "nil", "depends.is_installed: Argument 'version_wanted' is not a string or nil.")
+
+ local pkg_is_installed, err = false, nil
+
+ for _, installed_pkg in pairs(installed_pkgs) do
+
+ -- check if package_name is in installed
+ if package_name == installed_pkg.name then
+
+ -- check if package is installed in satisfying version
+ if not version_wanted or satisfies_constraint(installed_pkg.version, version_wanted) then
+ pkg_is_installed = true
+ break
+ else
+ err = "Package '" .. package_name .. (version_wanted and " " .. version_wanted or "") .. "' needed, but " .. selected_or_installed(installed_pkg) .. " at version '" .. installed_pkg.version .. "'."
+ break
+ end
+ end
+
+ end
+ return pkg_is_installed, err
+end
+
+-- Check whether the package 'pkg' conflicts with 'installed_pkg' and return
+-- false or error message.
+local function packages_conflicts(pkg, installed_pkg)
+ assert(type(pkg) == "table", "depends.packages_conflicts: Argument 'pkg' is not a table.")
+ assert(type(installed_pkg) == "table", "depends.packages_conflicts: Argument 'installed_pkg' is not a table.")
+
+ -- check if pkg doesn't provide an already installed_pkg
+ if pkg.provides then
+ -- for all of pkg's provides
+ for _, provided_pkg in pairs(get_provides(pkg)) do
+ if provided_pkg.name == installed_pkg.name then
+ return "Package '" .. pkg_full_name(pkg.name, pkg.version, pkg.was_scm_version) .. "' provides '" .. pkg_full_name(provided_pkg.name, provided_pkg.version) .. "' but package '" .. pkg_full_name(installed_pkg.name, installed_pkg.version) .. "' is already " .. selected_or_installed(installed_pkg) .. "."
+ end
+ end
+ end
+
+ -- check for conflicts of package to install with installed package
+ if pkg.conflicts then
+ for _, conflict in pairs (pkg.conflicts) do
+ if conflict == installed_pkg.name then
+ return "Package '" .. pkg_full_name(pkg.name, pkg.version, pkg.was_scm_version) .. "' conflicts with already " .. selected_or_installed(installed_pkg) .. " package '" .. pkg_full_name(installed_pkg.name, installed_pkg.version) .. "'."
+ end
+ end
+ end
+
+ -- check for conflicts of installed package with package to install
+ if installed_pkg.conflicts then
+
+ -- direct conflicts with 'pkg'
+ for _, conflict in pairs (installed_pkg.conflicts) do
+ if conflict == pkg.name then
+ return "Already " .. selected_or_installed(installed_pkg) .. " package '" .. pkg_full_name(installed_pkg.name, installed_pkg.version) .. "' conflicts with package '" .. pkg_full_name(pkg.name, pkg.version, pkg.was_scm_version) .. "'."
+ end
+ end
+
+ -- conflicts with 'provides' of 'pkg' (packages provided by package to install)
+ if pkg.provides then
+ for _, conflict in pairs (installed_pkg.conflicts) do
+ -- for all of pkg's provides
+ for _, provided_pkg in pairs(get_provides(pkg)) do
+ if conflict == provided_pkg.name then
+ return "Already '" .. selected_or_installed(installed_pkg) .. " package '" .. pkg_full_name(installed_pkg.name, installed_pkg.version) .. "' conflicts with package '" .. pkg_full_name(provided_pkg.name, provided_pkg.version) .. "' provided by '" .. pkg_full_name(pkg.name, pkg.version, pkg.was_scm_version) .. "'."
+ end
+ end
+ end
+ end
+ end
+
+ -- no conflicts found
+ return false
+end
+
+-- Return table of package dependencies 'depends' with OS specific dependencies extracted.
+--
+-- OS specific dependencies are stored in a subtable with 'arch' as a key.
+-- E.g. this table containing OS specific dependencies:
+-- depends = {
+-- "lua~>5.1",
+-- "luadist-git>=0.1",
+-- Linux = {
+-- "iup>=3.6",
+-- "wxlua>=2.8.10.0",
+-- },
+-- Windows = {
+-- "luagd>=2.0.33r2",
+-- "luacom>=1.4.1",
+-- },
+-- }
+--
+-- ...will be on the 'Linux' architecture (determined by cfg.arch) converted into:
+-- depends = {
+-- "lua~>5.1",
+-- "luadist-git>=0.1",
+-- "iup>=3.6",
+-- "wxlua>=2.8.10.0",
+-- }
+function extract_os_specific_depends(depends)
+ assert(type(depends) == "table", "depends.extract_os_specific_depends: Argument 'depends' is not a table.")
+ local extracted = {}
+ for k, depend in pairs(depends) do
+ -- if 'depend' is a table, then it must be a table of OS specific
+ -- dependencies, so extract it if it's for this architecture
+ if type(depend) == "table" then
+ if k == cfg.arch then
+ for _, os_specific_depend in pairs(depend) do
+ table.insert(extracted, os_specific_depend)
+ end
+ end
+ else
+ table.insert(extracted, depend)
+ end
+ end
+ return extracted
+end
+
+-- Return all packages needed in order to install package 'pkg'
+-- and with specified 'installed' packages in the system using 'manifest'.
+-- 'pkg' can also contain version constraint (e.g. 'copas>=1.2.3', 'saci-1.0' etc.).
+--
+-- This function also downloads packages to get information about their dependencies.
+-- Directory where the package was downloaded is stored in 'download_dir' attribute
+-- of that package in the table of packages returned by this function.
+--
+-- Optional argument 'dependency_manifest' is a table of dependencies examined
+-- from previous installations etc. It can be used to speed-up the dependency
+-- resolving procedure for example.
+--
+-- When optional 'force_no_download' parameter is set to true, then information
+-- about packages won't be downloaded during dependency resolving, assuming that
+-- entries in the provided manifest are already complete.
+--
+-- When optional 'suppress_printing' parameter is set to true, then messages
+-- for the user won't be printed during dependency resolving.
+--
+-- Optional argument 'deploy_dir' is used just as a temporary place to place
+-- the downloaded packages into.
+--
+-- 'dependency_parents' is table of all packages encountered so far when resolving dependencies
+-- and is used to detect and deal with circular dependencies. Leave it 'nil'
+-- and it will do its job just fine :-).
+--
+-- 'tmp_installed' is internal table used in recursion and should be left 'nil' when
+-- calling this function from other context. It is used for passing the changes
+-- in installed packages between the recursive calls of this function.
+--
+-- TODO: refactor this spaghetti code!
+local function get_packages_to_install(pkg, installed, manifest, dependency_manifest, force_no_download, suppress_printing, deploy_dir, dependency_parents, tmp_installed)
+ manifest = manifest or mf.get_manifest()
+ dependency_manifest = dependency_manifest or {}
+ force_no_download = force_no_download or false
+ suppress_printing = suppress_printing or false
+ deploy_dir = deploy_dir or cfg.root_dir
+ dependency_parents = dependency_parents or {}
+
+ -- set helper table 'tmp_installed'
+ tmp_installed = tmp_installed or utils.deepcopy(installed)
+
+ assert(type(pkg) == "string", "depends.get_packages_to_install: Argument 'pkg' is not a string.")
+ assert(type(installed) == "table", "depends.get_packages_to_install: Argument 'installed' is not a table.")
+ assert(type(manifest) == "table", "depends.get_packages_to_install: Argument 'manifest' is not a table.")
+ assert(type(dependency_manifest) == "table", "depends.get_packages_to_install: Argument 'dependency_manifest' is not a table.")
+ assert(type(force_no_download) == "boolean", "depends.get_packages_to_install: Argument 'force_no_download' is not a boolean.")
+ assert(type(suppress_printing) == "boolean", "depends.get_packages_to_install: Argument 'suppress_printing' is not a boolean.")
+ assert(type(deploy_dir) == "string", "depends.get_packages_to_install: Argument 'deploy_dir' is not a string.")
+ assert(type(dependency_parents) == "table", "depends.get_packages_to_install: Argument 'dependency_parents' is not a table.")
+ assert(type(tmp_installed) == "table", "depends.get_packages_to_install: Argument 'tmp_installed' is not a table.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ --[[ for future debugging:
+ print('resolving: '.. pkg)
+ print(' installed: ', utils.table_tostring(installed))
+ print(' tmp_installed: ', utils.table_tostring(tmp_installed))
+ --]]
+
+ -- check if package is already installed
+ local pkg_name, pkg_constraint = split_name_constraint(pkg)
+ local pkg_is_installed, err = is_installed(pkg_name, tmp_installed, pkg_constraint)
+ if pkg_is_installed then return {} end
+ if err then return nil, err end
+
+ -- table of packages needed to be installed (will be returned)
+ local to_install = {}
+
+ -- find out available versions of 'pkg' and insert them into manifest
+ if not force_no_download then
+ local versions, err = package.retrieve_versions(pkg, manifest, suppress_printing)
+ if not versions then return nil, err end
+ for _, version in pairs(versions) do
+ table.insert(manifest, version)
+ end
+ end
+
+ -- find candidates & sort them
+ local candidates_to_install = find_packages(pkg, manifest)
+ if #candidates_to_install == 0 then
+ return nil, "No suitable candidate for '" .. pkg .. "' found."
+ end
+ candidates_to_install = sort_by_versions(candidates_to_install)
+
+ for _, pkg in pairs(candidates_to_install) do
+
+ --[[ for future debugging:
+ print(' candidate: '.. pkg.name..'-'..pkg.version)
+ print(' installed: ', utils.table_tostring(installed))
+ print(' tmp_installed: ', utils.table_tostring(tmp_installed))
+ print(' to_install: ', utils.table_tostring(to_install))
+ print(' -is installed: ', is_installed(pkg.name, tmp_installed, pkg_constraint))
+ --]]
+
+ -- if there's an error from the previous candidate, print the reason for trying another one
+ if not suppress_printing and err then print(" - trying another candidate due to: " .. err) end
+
+ -- clear the state from the previous candidate
+ pkg_is_installed, err = false, nil
+
+ -- check whether this package has already been added to 'tmp_installed' by another of its candidates
+ pkg_is_installed, err = is_installed(pkg.name, tmp_installed, pkg_constraint)
+ if pkg_is_installed then break end
+
+ -- preserve information about the 'scm' version, because pkg.version
+ -- will be rewritten by information taken from pkg's dist.info file
+ local was_scm_version = (pkg.version == "scm")
+
+ -- Try to obtain cached dependency information from the dependency manifest
+ if dependency_manifest[pkg.name .. "-" .. pkg.version] and cfg.dep_cache then
+ pkg = dependency_manifest[pkg.name .. "-" .. pkg.version]
+ else
+ -- download info about the package if not already downloaded and downloading not prohibited
+ if not (pkg.download_dir or force_no_download) then
+ local path_or_err
+ pkg, path_or_err = package.retrieve_pkg_info(pkg, deploy_dir, suppress_printing)
+ if not pkg then
+ err = "Error when resolving dependencies: " .. path_or_err
+ else
+ -- set path to downloaded package - used to indicate that the
+ -- package was already downloaded, to delete unused but downloaded
+ -- packages and also to install choosen packages
+ pkg.download_dir = path_or_err
+ end
+ end
+ end
+
+ if pkg and was_scm_version then pkg.was_scm_version = true end
+
+ -- check arch & type
+ if not err then
+ if not (pkg.arch == "Universal" or pkg.arch == cfg.arch) or
+ not (pkg.type == "all" or pkg.type == "source" or pkg.type == cfg.type) then
+ err = "Package '" .. pkg_full_name(pkg.name, pkg.version) .. "' doesn't have required arch and type."
+ end
+ end
+
+ -- checks for conflicts with other installed (or previously selected) packages
+ if not err then
+ for _, installed_pkg in pairs(tmp_installed) do
+ err = packages_conflicts(pkg, installed_pkg)
+ if err then break end
+ end
+ end
+
+ -- if pkg passed all of the above tests
+ if not err then
+
+ -- check if pkg's dependencies are satisfied
+ if pkg.depends then
+
+ -- insert pkg into the stack of circular dependencies detection
+ table.insert(dependency_parents, pkg.name)
+
+ -- extract all OS specific dependencies of pkg
+ pkg.depends = extract_os_specific_depends(pkg.depends)
+
+ -- for all dependencies of pkg
+ for _, depend in pairs(pkg.depends) do
+ local dep_name = split_name_constraint(depend)
+
+ -- detect circular dependencies using 'dependency_parents'
+ local is_circular_dependency = false
+ for _, parent in pairs(dependency_parents) do
+ if dep_name == parent then
+ is_circular_dependency = true
+ break
+ end
+ end
+
+ -- if circular dependencies not detected
+ if not is_circular_dependency then
+
+ -- recursively call this function on the candidates of this pkg's dependency
+ local depends_to_install, dep_err = get_packages_to_install(depend, installed, manifest, dependency_manifest, force_no_download, suppress_printing, deploy_dir, dependency_parents, tmp_installed)
+
+ -- if any suitable dependency packages were found, insert them to the 'to_install' table
+ if depends_to_install then
+ for _, depend_to_install in pairs(depends_to_install) do
+
+ -- add some meta information
+ if not depend_to_install.selected_by then
+ depend_to_install.selected_by = pkg.name .. "-" .. pkg.version
+ end
+
+ table.insert(to_install, depend_to_install)
+ table.insert(tmp_installed, depend_to_install)
+ table.insert(installed, depend_to_install)
+ end
+ else
+ err = "Error getting dependency of '" .. pkg_full_name(pkg.name, pkg.version) .. "': " .. dep_err
+ break
+ end
+
+ -- if circular dependencies detected
+ else
+ err = "Error getting dependency of '" .. pkg_full_name(pkg.name, pkg.version) .. "': '" .. dep_name .. "' is a circular dependency."
+ break
+ end
+ end
+
+ -- remove last package from the stack of circular dependencies detection
+ table.remove(dependency_parents)
+ end
+
+ -- if no error occured
+ if not err then
+ -- add pkg and it's provides to the fake table of installed packages, with
+ -- property 'selected' set, indicating that the package isn't
+ -- really installed in the system, just selected to be installed (this is used e.g. in error messages)
+ pkg.selected = true
+ table.insert(tmp_installed, pkg)
+ if pkg.provides then
+ for _, provided_pkg in pairs(get_provides(pkg)) do
+ provided_pkg.selected = true
+ table.insert(tmp_installed, provided_pkg)
+ end
+ end
+ -- add pkg to the table of packages to install
+ table.insert(to_install, pkg)
+
+ -- if some error occured
+ else
+ -- delete the downloaded package
+ if pkg.download_dir and not cfg.debug then sys.delete(pkg.download_dir) end
+
+ -- set tables of 'packages to install' and 'installed packages' to their original state
+
+ to_install = {}
+ tmp_installed = utils.deepcopy(installed)
+ -- add provided packages to installed ones
+ for _, installed_pkg in pairs(tmp_installed) do
+ for _, pkg in pairs(get_provides(installed_pkg)) do
+ table.insert(tmp_installed, pkg)
+ end
+ end
+ end
+
+ -- if error occured
+ else
+ -- delete the downloaded package
+ if pkg and pkg.download_dir and not cfg.debug then sys.delete(pkg.download_dir) end
+
+ -- if pkg is already installed, skip checking its other candidates
+ if pkg_is_installed then break end
+ end
+ end
+
+ -- if package is not installed and no suitable candidates were found, return the last error
+ if #to_install == 0 and not pkg_is_installed then
+ return nil, err
+ else
+ return to_install
+ end
+end
+
+-- Resolve dependencies and return all packages needed in order to install
+-- 'packages' into the system with already 'installed' packages, using 'manifest'.
+-- Also return the table of the dependencies determined during the process
+-- as the second return value.
+--
+-- Optional argument 'dependency_manifest' is a table of dependencies examined
+-- from previous installations etc. It can be used to speed-up the dependency
+-- resolving procedure for example.
+--
+-- Optional argument 'deploy_dir' is used as a temporary place to place the
+-- downloaded packages into.
+--
+-- When optional 'force_no_download' parameter is set to true, then information
+-- about packages won't be downloaded during dependency resolving, assuming that
+-- entries in manifest are complete.
+--
+-- When optional 'suppress_printing' parameter is set to true, then messages
+-- for the user won't be printed during dependency resolving.
+function get_depends(packages, installed, manifest, dependency_manifest, deploy_dir, force_no_download, suppress_printing)
+ if not packages then return {} end
+ manifest = manifest or mf.get_manifest()
+ dependency_manifest = dependency_manifest or {}
+ deploy_dir = deploy_dir or cfg.root_dir
+ force_no_download = force_no_download or false
+ suppress_printing = suppress_printing or false
+ if type(packages) == "string" then packages = {packages} end
+
+ assert(type(packages) == "table", "depends.get_depends: Argument 'packages' is not a table or string.")
+ assert(type(installed) == "table", "depends.get_depends: Argument 'installed' is not a table.")
+ assert(type(manifest) == "table", "depends.get_depends: Argument 'manifest' is not a table.")
+ assert(type(dependency_manifest) == "table", "depends.get_depends: Argument 'dependency_manifest' is not a table.")
+ assert(type(deploy_dir) == "string", "depends.get_depends: Argument 'deploy_dir' is not a string.")
+ assert(type(force_no_download) == "boolean", "depends.get_depends: Argument 'force_no_download' is not a boolean.")
+ assert(type(suppress_printing) == "boolean", "depends.get_depends: Argument 'suppress_printing' is not a boolean.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local tmp_installed = utils.deepcopy(installed)
+
+ -- add provided packages to installed ones
+ for _, installed_pkg in pairs(tmp_installed) do
+ for _, pkg in pairs(get_provides(installed_pkg)) do
+ table.insert(tmp_installed, pkg)
+ end
+ end
+
+ -- If 'pkg' contains valid (architecture specific) path separator,
+ -- it is treated like a path to already downloaded package and
+ -- we assume that user wants to use this specific version of the
+ -- module to be installed. Hence, we will add information about
+ -- this version into the manifest and also remove references to
+ -- any other versions of this module from the manifest. This will
+ -- enforce the version of the module required by the user.
+ for k, pkg in pairs(packages) do
+ if pkg:find(sys.path_separator()) then
+ local pkg_dir = sys.abs_path(pkg)
+ local pkg_info, err = mf.load_distinfo(sys.make_path(pkg_dir, "dist.info"))
+ if not pkg_info then return nil, err end
+
+ -- add information about location of the package, also to prevent downloading it again
+ pkg_info.download_dir = pkg_dir
+ -- mark package to skip deleting its directory after installation
+ pkg_info.preserve_pkg_dir = true
+
+ -- set default arch/type if not explicitly stated and package is of source type
+ if package.is_source_type(pkg_dir) then
+ pkg_info = package.ensure_source_arch_and_type(pkg_info)
+ elseif not (pkg_info.arch and pkg_info.type) then
+ return nil, pkg_dir .. ": binary package missing arch or type in 'dist.info'."
+ end
+
+ -- update manifest
+ manifest = utils.filter(manifest, function(p) return p.name ~= pkg_info.name and true end)
+ table.insert(manifest, pkg_info)
+
+ -- update packages to install
+ pkg = pkg_info.name .. "-" .. pkg_info.version
+ packages[k] = pkg
+ end
+ end
+
+ local to_install = {}
+
+ -- get packages needed to satisfy the dependencies
+ for _, pkg in pairs(packages) do
+
+ local needed_to_install, err = get_packages_to_install(pkg, tmp_installed, manifest, dependency_manifest, force_no_download, suppress_printing, deploy_dir)
+
+ -- if everything's fine
+ if needed_to_install then
+
+ for _, needed_pkg in pairs(needed_to_install) do
+
+ -- TODO: why not to use 'installed' instead of 'tmp_installed'?
+ -- It's because provides aren't searched for by find()
+ -- function inside the update_dependency_manifest().
+ dependency_manifest = update_dependency_manifest(needed_pkg, tmp_installed, needed_to_install, dependency_manifest)
+
+ table.insert(to_install, needed_pkg)
+ table.insert(tmp_installed, needed_pkg)
+ -- add provides of needed_pkg to installed ones
+ for _, provided_pkg in pairs(get_provides(needed_pkg)) do
+ -- copy 'selected' property
+ provided_pkg.selected = needed_pkg.selected
+ table.insert(tmp_installed, provided_pkg)
+ end
+ end
+ -- if error occured
+ else
+ -- delete already downloaded packages
+ for _, pkg in pairs(to_install) do
+ if pkg.download_dir and not cfg.debug then sys.delete(pkg.download_dir) end
+ end
+ return nil, "Cannot resolve dependencies for '" .. pkg .. "': ".. err
+ end
+ end
+
+ return to_install, dependency_manifest
+end
+
+-- Return table of packages provided by specified package (from it's 'provides' field)
+function get_provides(package)
+ assert(type(package) == "table", "depends.get_provides: Argument 'package' is not a table.")
+ if not package.provides then return {} end
+
+ local provided = {}
+ for _, provided_name in pairs(package.provides) do
+ local pkg = {}
+ pkg.name, pkg.version = split_name_constraint(provided_name)
+ pkg.type = package.type
+ pkg.arch = package.arch
+ pkg.provided = package.name .. "-" .. package.version
+ table.insert(provided, pkg)
+ end
+ return provided
+end
+
+-- Return package name and version constraint from full package version constraint specification
+-- E. g.:
+-- for 'luaexpat-1.2.3' return: 'luaexpat' , '1.2.3'
+-- for 'luajit >= 1.2' return: 'luajit' , '>=1.2'
+function split_name_constraint(version_constraint)
+ assert(type(version_constraint) == "string", "depends.split_name_constraint: Argument 'version_constraint' is not a string.")
+
+ local split = version_constraint:find("[%s=~<>-]+%d") or version_constraint:find("[%s=~<>-]+scm")
+
+ if split then
+ return version_constraint:sub(1, split - 1), version_constraint:sub(split):gsub("[%s-]", "")
+ else
+ return version_constraint, nil
+ end
+end
+
+-- Return only packages that can be installed on the specified architecture and type
+function filter_packages_by_arch_and_type(packages, req_arch, req_type)
+ assert(type(packages) == "table", "depends.filter_packages_by_arch_and_type: Argument 'packages' is not a table.")
+ assert(type(req_arch) == "string", "depends.filter_packages_by_arch_and_type: Argument 'req_arch' is not a string.")
+ assert(type(req_type) == "string", "depends.filter_packages_by_arch_and_type: Argument 'pkg_type' is not a string.")
+
+ return utils.filter(packages,
+ function (pkg)
+ return (pkg.arch == "Universal" or pkg.arch == req_arch) and
+ (pkg.type == "all" or pkg.type == "source" or pkg.type == req_type)
+ end)
+end
+
+-- Return only packages that contain one of the specified strings in their 'name-version'.
+-- Case is ignored. If no strings are specified, return all the packages.
+-- Argument 'search_in_desc' specifies if search also in description of packages.
+function filter_packages_by_strings(packages, strings, search_in_desc)
+ if type(strings) == "string" then strings = {strings} end
+ assert(type(packages) == "table", "depends.filter_packages_by_strings: Argument 'packages' is not a table.")
+ assert(type(strings) == "table", "depends.filter_packages_by_strings: Argument 'strings' is not a string or table.")
+
+ if #strings ~= 0 then
+ return utils.filter(packages,
+ function (pkg)
+ for _,str in pairs(strings) do
+ local name = pkg.name .. "-" .. pkg.version
+ if search_in_desc then
+ name = name .. " " .. (pkg.desc or "")
+ end
+ if string.find(string.lower(name), string.lower(str), 1 ,true) ~= nil then return true end
+ end
+ end)
+ else
+ return packages
+ end
+end
+
+
+-- Return full package name and version string (e.g. 'luajit-2.0'). When version
+-- is nil or '' then return only name (e.g. 'luajit') and when name is nil or ''
+-- then return '<unknown>'. Optional 'was_scm_version' argument is a boolean,
+-- stating whether the package was originally selected for installation as a 'scm' version.
+function pkg_full_name(name, version, was_scm_version)
+ name = name or ""
+ version = version or ""
+ was_scm_version = was_scm_version or false
+ if type(version) == "number" then version = tostring(version) end
+
+ assert(type(name) == "string", "depends.pkg_full_name: Argument 'name' is not a string.")
+ assert(type(version) == "string", "depends.pkg_full_name: Argument 'version' is not a string.")
+
+ if was_scm_version then version = version .. " [scm version]" end
+
+ if name == "" then
+ return "<unknown>"
+ else
+ return name .. ((version ~= "") and "-" .. version or "")
+ end
+end
+
+-- Return table of packages, sorted descendingly by versions (newer ones are moved to the top).
+function sort_by_versions(packages)
+ assert(type(packages) == "table", "depends.sort_by_versions: Argument 'packages' is not a table.")
+ return utils.sort(packages, function (a, b) return compare_versions(a.version, b.version) end)
+end
+
+-- Return table of packages, sorted alphabetically by name and then descendingly by version.
+function sort_by_names(packages)
+ assert(type(packages) == "table", "depends.sort_by_names: Argument 'packages' is not a table.")
+ return utils.sort(packages, function (a, b)
+ if a.name == b.name then
+ return compare_versions(a.version, b.version)
+ else
+ return a.name < b.name
+ end
+ end)
+end
+
+-- Return if version satisfies the specified constraint
+function satisfies_constraint(version, constraint)
+ assert(type(version) == "string", "depends.satisfies_constraint: Argument 'version' is not a string.")
+ assert(type(constraint) == "string", "depends.satisfies_constraint: Argument 'constraint' is not a string.")
+ return const.constraint_satisfied(version, constraint)
+end
+
+-- For package versions, return whether: 'version_a' > 'version_b'
+function compare_versions(version_a, version_b)
+ assert(type(version_a) == "string", "depends.compare_versions: Argument 'version_a' is not a string.")
+ assert(type(version_b) == "string", "depends.compare_versions: Argument 'version_b' is not a string.")
+ return const.compareVersions(version_a, version_b)
+end
+
+-- Returns 'dep_manifest' updated with information about the 'pkg'.
+-- 'installed' is table with installed packages
+-- 'to_install' is table with packages that are selected for installation
+-- Packages satisfying the dependencies will be searched for in these two tables.
+function update_dependency_manifest(pkg, installed, to_install, dep_manifest)
+ dep_manifest = dep_manifest or {}
+ assert(type(pkg) == "table", "depends.update_dependency_manifest: Argument 'pkg' is not a table.")
+ assert(type(installed) == "table", "depends.update_dependency_manifest: Argument 'installed' is not a table.")
+ assert(type(to_install) == "table", "depends.update_dependency_manifest: Argument 'to_install' is not a table.")
+ assert(type(dep_manifest) == "table", "depends.update_dependency_manifest: Argument 'dep_manifest' is not a table.")
+
+ local name_ver = pkg.name .. "-" .. (pkg.was_scm_version and "scm" or pkg.version)
+
+ -- add to manifest
+ if not dep_manifest[name_ver] then
+ dep_manifest[name_ver] = {}
+ dep_manifest[name_ver].name = pkg.name
+ dep_manifest[name_ver].version = pkg.version
+ dep_manifest[name_ver].was_scm_version = pkg.was_scm_version
+ dep_manifest[name_ver].arch = pkg.arch
+ dep_manifest[name_ver].type = pkg.type
+ dep_manifest[name_ver].path = pkg.path
+ dep_manifest[name_ver].depends = pkg.depends
+ dep_manifest[name_ver].conflicts = pkg.conflicts
+ dep_manifest[name_ver].provides = pkg.provides
+ dep_manifest[name_ver].license = pkg.license
+ dep_manifest[name_ver].desc = pkg.desc
+ dep_manifest[name_ver].url = pkg.url
+ dep_manifest[name_ver].author = pkg.author
+ dep_manifest[name_ver].maintainer = pkg.maintainer
+
+ -- add information which dependency is satisfied by which package
+ if pkg.depends then
+
+ -- TODO: Won't it be better to add OS-specific 'satisfied_by' metadata in a format like OS-specific 'depends' ?
+ local all_deps = extract_os_specific_depends(pkg.depends)
+
+ dep_manifest[name_ver].satisfied_by = {}
+ for _, depend in pairs(all_deps) do
+
+ -- find package satisfying the dependency
+ local satisfying = find_packages(depend, installed)[1] or find_packages(depend, to_install)[1]
+ satisfying = satisfying.name .. "-" .. satisfying.version
+ dep_manifest[name_ver].satisfied_by[depend] = satisfying
+
+ -- check whether the satisfying package isn't provided by other one
+ local provided_by = utils.filter(installed, function(pkg)
+ return pkg.provides and utils.contains(pkg.provides, satisfying)
+ end)
+ if #provided_by == 0 then
+ provided_by = utils.filter(to_install, function(pkg)
+ return pkg.provides and utils.contains(pkg.provides, satisfying)
+ end)
+ end
+
+ if #provided_by ~= 0 then
+ if not dep_manifest[name_ver].satisfying_provided_by then
+ dep_manifest[name_ver].satisfying_provided_by = {}
+ end
+ dep_manifest[name_ver].satisfying_provided_by[satisfying] = provided_by[1].name .. "-" .. provided_by[1].version
+ end
+ end
+
+ end
+ end
+
+ return dep_manifest
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/git.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/git.lua
new file mode 100644
index 0000000..808f74d
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/git.lua
@@ -0,0 +1,306 @@
+-- Encapsulated Git functionality
+
+module ("dist.git", package.seeall)
+
+require "git"
+local sys = require "dist.sys"
+local cfg = require "dist.config"
+
+
+-- Clone the repository from url to dest_dir
+function clone(repository_url, dest_dir, depth, branch)
+ assert(type(repository_url) == "string", "git.clone: Argument 'repository_url' is not a string.")
+ assert(type(dest_dir) == "string", "git.clone: Argument 'dest_dir' is not a string.")
+ dest_dir = sys.abs_path(dest_dir)
+
+ local command = "git clone " .. repository_url
+
+ if depth then
+ assert(type(depth) == "number", "git.clone: Argument 'depth' is not a number.")
+ command = command .. " --depth " .. depth
+ end
+
+ if branch then
+ assert(type(branch) == "string", "git.clone: Argument 'branch' is not a string.")
+ command = command .. " -b " .. branch
+ end
+
+ command = command .. " " .. sys.quote(dest_dir)
+ if sys.exists(dest_dir) then sys.delete(dest_dir) end
+ sys.make_dir(dest_dir)
+
+ -- change the current working directory to dest_dir
+ local prev_current_dir = sys.current_dir()
+ sys.change_dir(dest_dir)
+
+ -- execute git clone
+ if not cfg.debug then command = command .. " -q " end
+ local ok, err = sys.exec(command)
+
+ -- change the current working directory back
+ sys.change_dir(prev_current_dir)
+
+ return ok, err
+end
+
+-- Return table of all refs of the remote repository at the 'git_url'. Ref_type can be "tags" or "heads".
+local function get_remote_refs(git_url, ref_type)
+ assert(type(git_url) == "string", "git.get_remote_refs: Argument 'git_url' is not a string.")
+ assert(type(ref_type) == "string", "git.get_remote_refs: Argument 'ref_type' is not a string.")
+ assert(ref_type == "tags" or ref_type == "heads", "git.get_remote_refs: Argument 'ref_type' is not \"tags\" or \"heads\".")
+
+ local refs = {}
+
+ local ok, refs_or_err = pcall(git.protocol.remotes, git_url)
+ if not ok then return nil, "Error getting refs of the remote repository '" .. git_url .. "': " .. refs_or_err end
+
+ for ref, sha in pairs(refs_or_err) do
+ if ref:match("%S+/" .. ref_type .. "/%S+") and not ref:match("%^{}") then
+ table.insert(refs, ref:match("%S+/" .. ref_type .. "/(%S+)"))
+ end
+ end
+
+ return refs
+end
+
+-- Return table of all tags of the repository at the 'git_url'
+function get_remote_tags(git_url)
+ return get_remote_refs(git_url, "tags")
+end
+
+-- Return table of all branches of the repository at the 'git_url'
+function get_remote_branches(git_url)
+ return get_remote_refs(git_url, "heads")
+end
+
+-- Checkout specified ref in specified git_repo_dir
+function checkout_ref(ref, git_repo_dir, orphaned)
+ git_repo_dir = git_repo_dir or sys.current_dir()
+ orphaned = orphaned or false
+ assert(type(ref) == "string", "git.checkout_ref: Argument 'ref' is not a string.")
+ assert(type(git_repo_dir) == "string", "git.checkout_ref: Argument 'git_repo_dir' is not a string.")
+ assert(type(orphaned) == "boolean", "git.checkout_ref: Argument 'orphaned' is not a boolean.")
+ git_repo_dir = sys.abs_path(git_repo_dir)
+
+ local command = "git checkout "
+ if orphaned then command = command .. " --orphan " end
+ command = command .. " " .. ref .. " -f"
+ if not cfg.debug then command = command .. " -q " end
+
+ local ok, err
+ if git_repo_dir ~= sys.current_dir() then
+ local prev_current_dir = sys.current_dir()
+ sys.change_dir(git_repo_dir)
+ ok, err = sys.exec(command)
+ sys.change_dir(prev_current_dir)
+ else
+ ok, err = sys.exec(command)
+ end
+
+ return ok, err
+end
+
+-- Checkout specified sha in specified git_repo_dir
+function checkout_sha(sha, git_repo_dir)
+ git_repo_dir = git_repo_dir or sys.current_dir()
+ assert(type(sha) == "string", "git.checkout_sha: Argument 'sha' is not a string.")
+ assert(type(git_repo_dir) == "string", "git.checkout_sha: Argument 'git_repo_dir' is not a string.")
+ git_repo_dir = sys.abs_path(git_repo_dir)
+
+ local dir_changed, prev_current_dir
+
+ if git_repo_dir ~= sys.current_dir() then
+ prev_current_dir = sys.current_dir()
+ sys.change_dir(git_repo_dir)
+ dir_changed = true
+ end
+
+ local ok, repo_or_err = pcall(git.repo.open, git_repo_dir)
+ if not ok then return nil, "Error when opening the git repository '" .. git_repo_dir .. "': " .. repo_or_err end
+
+ local err
+ ok, err = pcall(repo_or_err.checkout, repo_or_err, sha, git_repo_dir)
+ if not ok then return nil, "Error when checking out the sha '" .. sha .. "' in the git repository '" .. git_repo_dir .. "': " .. err end
+
+ repo_or_err:close()
+ if dir_changed then sys.change_dir(prev_current_dir) end
+
+ return true
+end
+
+-- Create an empty git repository in given directory.
+function init(dir)
+ dir = dir or sys.current_dir()
+ assert(type(dir) == "string", "git.init: Argument 'dir' is not a string.")
+ dir = sys.abs_path(dir)
+
+ -- create the 'dir' first, since it causes 'git init' to fail on Windows
+ -- when the parent directory of 'dir' doesn't exist
+ local ok, err = sys.make_dir(dir)
+ if not ok then return nil, err end
+
+ local command = "git init " .. sys.quote(dir)
+ if not cfg.debug then command = command .. " -q " end
+ return sys.exec(command)
+end
+
+-- Add all files in the 'repo_dir' to the git index. The 'repo_dir' must be
+-- in the initialized git repository.
+function add_all(repo_dir)
+ repo_dir = repo_dir or sys.current_dir()
+ assert(type(repo_dir) == "string", "git.add_all: Argument 'repo_dir' is not a string.")
+ repo_dir = sys.abs_path(repo_dir)
+
+ local ok, prev_dir, msg
+ ok, prev_dir = sys.change_dir(repo_dir);
+ if not ok then return nil, err end
+
+ ok, msg = sys.exec("git add -A -f " .. sys.quote(repo_dir))
+ sys.change_dir(prev_dir)
+
+ return ok, msg
+end
+
+-- Commit all indexed files in 'repo_dir' with the given commit 'message'.
+-- The 'repo_dir' must be in the initialized git repository.
+function commit(message, repo_dir)
+ repo_dir = repo_dir or sys.current_dir()
+ message = message or "commit by luadist-git"
+ assert(type(message) == "string", "git.commit: Argument 'message' is not a string.")
+ assert(type(repo_dir) == "string", "git.commit: Argument 'repo_dir' is not a string.")
+ repo_dir = sys.abs_path(repo_dir)
+
+ local ok, prev_dir, msg
+ ok, prev_dir = sys.change_dir(repo_dir);
+ if not ok then return nil, err end
+
+ local command = "git commit -m " .. sys.quote(message)
+ if not cfg.debug then command = command .. " -q " end
+ ok, msg = sys.exec(command)
+ sys.change_dir(prev_dir)
+
+ return ok, msg
+end
+
+
+-- Rename branch 'old_name' to 'new_name'. -- The 'repo_dir' must be
+-- in the initialized git repository and the branch 'new_name' must
+-- not already exist in that repository.
+function rename_branch(old_name, new_name, repo_dir)
+ repo_dir = repo_dir or sys.current_dir()
+ assert(type(old_name) == "string", "git.rename_branch: Argument 'old_name' is not a string.")
+ assert(type(new_name) == "string", "git.rename_branch: Argument 'new_name' is not a string.")
+ assert(type(repo_dir) == "string", "git.rename_branch: Argument 'repo_dir' is not a string.")
+ repo_dir = sys.abs_path(repo_dir)
+
+ local ok, prev_dir, msg
+ ok, prev_dir = sys.change_dir(repo_dir);
+ if not ok then return nil, err end
+
+ ok, msg = sys.exec("git branch -m " .. old_name .. " " .. new_name)
+ sys.change_dir(prev_dir)
+
+ return ok, msg
+end
+
+-- Push the ref 'ref_name' from the 'repo_dir' to the remote git
+-- repository 'git_repo_url'. If 'all_tags' is set to true, all tags
+-- will be pushed, in addition to the explicitly given ref.
+-- If 'delete' is set to 'true' then the explicitly given remote ref
+-- will be deleted, not pushed.
+function push_ref(repo_dir, ref_name, git_repo_url, all_tags, delete)
+ repo_dir = repo_dir or sys.current_dir()
+ all_tags = all_tags or false
+ delete = delete or false
+ assert(type(repo_dir) == "string", "git.push_ref: Argument 'repo_dir' is not a string.")
+ assert(type(git_repo_url) == "string", "git.push_ref: Argument 'git_repo_url' is not a string.")
+ assert(type(ref_name) == "string", "git.push_ref: Argument 'ref_name' is not a string.")
+ assert(type(all_tags) == "boolean", "git.push_ref: Argument 'all_tags' is not a boolean.")
+ assert(type(delete) == "boolean", "git.push_ref: Argument 'delete' is not a boolean.")
+ repo_dir = sys.abs_path(repo_dir)
+
+ local ok, prev_dir, msg
+ ok, prev_dir = sys.change_dir(repo_dir);
+ if not ok then return nil, err end
+
+ local command = "git push " .. git_repo_url
+ if all_tags then command = command .. " --tags " end
+ if delete then command = command .. " --delete " end
+ command = command .. " " .. ref_name .. " -f "
+ if not cfg.debug then command = command .. " -q " end
+
+ ok, msg = sys.exec(command)
+ sys.change_dir(prev_dir)
+
+ return ok, msg
+end
+
+-- Creates the tag 'tag_name' in given 'repo_dir', which must be
+-- in the initialized git repository
+function create_tag(repo_dir, tag_name)
+ repo_dir = repo_dir or sys.current_dir()
+ assert(type(repo_dir) == "string", "git.create_tag: Argument 'repo_dir' is not a string.")
+ assert(type(tag_name) == "string", "git.create_tag: Argument 'tag_name' is not a string.")
+ repo_dir = sys.abs_path(repo_dir)
+
+ local ok, prev_dir, msg
+ ok, prev_dir = sys.change_dir(repo_dir);
+ if not ok then return nil, err end
+
+ ok, msg = sys.exec("git tag " .. tag_name .. " -f ")
+ sys.change_dir(prev_dir)
+
+ return ok, msg
+end
+
+-- Fetch given 'ref_name' from the remote 'git_repo_url' to the local repository
+-- 'repo_dir' and return its sha. 'ref_type' can be "tag" or "head".
+local function fetch_ref(repo_dir, git_repo_url, ref_name, ref_type)
+ repo_dir = repo_dir or sys.current_dir()
+ assert(type(repo_dir) == "string", "git.fetch_ref: Argument 'repo_dir' is not a string.")
+ assert(type(git_repo_url) == "string", "git.fetch_ref: Argument 'git_repo_url' is not a string.")
+ assert(type(ref_name) == "string", "git.fetch_ref: Argument 'ref_name' is not a string.")
+ assert(type(ref_type) == "string", "git.fetch_ref: Argument 'ref_type' is not a string.")
+ assert(ref_type == "tag" or ref_type == "head", "git.get_remote_refs: Argument 'ref_type' is not \"tag\" or \"head\".")
+ repo_dir = sys.abs_path(repo_dir)
+
+ local refstring = "refs/" .. ref_type .. "s/" .. ref_name
+
+ local suppress_fetch_progress = not cfg.debug
+ local ok, repo_or_err = pcall(git.repo.open, repo_dir)
+ if not ok then return nil, "Error when opening the git repository '" .. repo_dir .. "': " .. repo_or_err end
+
+ local ok, pack_or_err, sha = pcall(git.protocol.fetch, git_repo_url, repo_or_err, refstring, suppress_fetch_progress)
+ if not ok then return nil, "Error when fetching ref '" .. refstring .. "' from git repository '" .. git_repo_url .. "': " .. pack_or_err end
+
+ repo_or_err:close()
+ pack_or_err:close()
+
+ return sha
+end
+
+-- Fetch given 'tag_name' from the remote 'git_repo_url' to the local repository
+-- 'repo_dir' and save it as a tag with the same 'tag_name'.
+function fetch_tag(repo_dir, git_repo_url, tag_name)
+ return fetch_ref(repo_dir, git_repo_url, tag_name, "tag")
+end
+
+-- Fetch given 'branch_name' from the remote 'git_repo_url' to the local repository
+-- 'repo_dir' and save it as a branch with the same 'branch_name'.
+function fetch_branch(repo_dir, git_repo_url, branch_name)
+ return fetch_ref(repo_dir, git_repo_url, branch_name, "head")
+end
+
+-- Create the git repository and return the repo object (which can be used in checkout_sha etc.)
+-- If the 'dir' exists, it's deleted prior to creating the git repository.
+function create_repo(dir)
+ assert(type(dir) == "string", "git.create_repo: Argument 'dir' is not a string.")
+
+ if sys.exists(dir) then sys.delete(dir) end
+
+ local ok, repo_or_err = pcall(git.repo.create, dir)
+ if not ok then return nil, "Error when creating the git repository '" .. dir .. "': " .. repo_or_err end
+
+ repo_or_err:close()
+ return true
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/init.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/init.lua
new file mode 100644
index 0000000..50c4b7e
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/init.lua
@@ -0,0 +1,349 @@
+-- main API of LuaDist
+
+module ("dist", package.seeall)
+
+local cfg = require "dist.config"
+local depends = require "dist.depends"
+local git = require "dist.git"
+local sys = require "dist.sys"
+local package = require "dist.package"
+local mf = require "dist.manifest"
+local utils = require "dist.utils"
+
+-- Return the deployment directory.
+function get_deploy_dir()
+ return sys.abs_path(cfg.root_dir)
+end
+
+-- Return packages deployed in 'deploy_dir' also with their provides.
+function get_deployed(deploy_dir)
+ deploy_dir = deploy_dir or cfg.root_dir
+ assert(type(deploy_dir) == "string", "dist.get_deployed: Argument 'deploy_dir' is not a string.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local deployed = depends.get_installed(deploy_dir)
+ local provided = {}
+
+ for _, pkg in pairs(deployed) do
+ for _, provided_pkg in pairs(depends.get_provides(pkg)) do
+ provided_pkg.provided_by = pkg.name .. "-" .. pkg.version
+ table.insert(provided, provided_pkg)
+ end
+ end
+
+ for _, provided_pkg in pairs(provided) do
+ table.insert(deployed, provided_pkg)
+ end
+
+ deployed = depends.sort_by_names(deployed)
+ return deployed
+end
+
+-- Download new 'manifest_file' from repository and returns it.
+-- Return nil and error message on error.
+function update_manifest(deploy_dir)
+ deploy_dir = deploy_dir or cfg.root_dir
+ assert(type(deploy_dir) == "string", "dist.update_manifest: Argument 'deploy_dir' is not a string.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ -- TODO: use 'deploy_dir' argument in manifest functions
+
+ -- retrieve the new manifest (forcing no cache use)
+ local manifest, err = mf.get_manifest(nil, true)
+
+ if manifest then
+ return manifest
+ else
+ return nil, err
+ end
+end
+
+-- Install 'package_names' to 'deploy_dir', using optional CMake 'variables'.
+function install(package_names, deploy_dir, variables)
+ if not package_names then return true end
+ deploy_dir = deploy_dir or cfg.root_dir
+ if type(package_names) == "string" then package_names = {package_names} end
+
+ assert(type(package_names) == "table", "dist.install: Argument 'package_names' is not a table or string.")
+ assert(type(deploy_dir) == "string", "dist.install: Argument 'deploy_dir' is not a string.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ -- find installed packages
+ local installed = depends.get_installed(deploy_dir)
+
+ -- get manifest
+ local manifest, err = mf.get_manifest()
+ if not manifest then return nil, "Error getting manifest: " .. err end
+
+ -- get dependency manifest
+ -- TODO: Is it good that dep_manifest is deploy_dir-specific?
+ -- Probably it'd be better not to be specific, but then there're
+ -- problems with 'provides'. E.g. What to do if there's a module
+ -- installed, that is provided by two different modules in two deploy_dirs?
+ local dep_manifest_file = sys.abs_path(sys.make_path(deploy_dir, cfg.dep_cache_file))
+ local dep_manifest, status = {}
+ if sys.exists(dep_manifest_file) and not utils.cache_timeout_expired(cfg.cache_timeout, dep_manifest_file) then
+ status, dep_manifest = mf.load_manifest(dep_manifest_file)
+ if not dep_manifest then return nil, status end
+ end
+
+ -- resolve dependencies
+ local dependencies, dep_manifest_or_err = depends.get_depends(package_names, installed, manifest, dep_manifest, deploy_dir, false, false)
+ if not dependencies then return nil, dep_manifest_or_err end
+ if #dependencies == 0 then return nil, "No packages to install." end
+
+ -- save updated dependency manifest
+ local ok, err = sys.make_dir(sys.parent_dir(dep_manifest_file))
+ if not ok then return nil, err end
+ ok, err = mf.save_manifest(dep_manifest_or_err, dep_manifest_file)
+ if not ok then return nil, err end
+
+ -- fetch the packages from repository
+ local fetched_pkgs = {}
+ for _, pkg in pairs(dependencies) do
+ local fetched_pkg, err = package.fetch_pkg(pkg, sys.make_path(deploy_dir, cfg.temp_dir))
+ if not fetched_pkg then return nil, err end
+ table.insert(fetched_pkgs, fetched_pkg)
+ end
+
+ -- install fetched packages
+ for _, pkg in pairs(fetched_pkgs) do
+ local ok, err = package.install_pkg(pkg.download_dir, deploy_dir, variables, pkg.preserve_pkg_dir)
+ if not ok then return nil, err end
+ end
+
+ return true
+end
+
+-- Manually deploy packages from 'package_dirs' to 'deploy_dir', using optional
+-- CMake 'variables'. The 'package_dirs' are preserved (will not be deleted).
+function make(deploy_dir, package_dirs, variables)
+ deploy_dir = deploy_dir or cfg.root_dir
+ package_dirs = package_dirs or {}
+
+ assert(type(deploy_dir) == "string", "dist.make: Argument 'deploy_dir' is not a string.")
+ assert(type(package_dirs) == "table", "dist.make: Argument 'package_dirs' is not a table.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ for _, dir in pairs(package_dirs) do
+ local ok, err = package.install_pkg(sys.abs_path(dir), deploy_dir, variables, true)
+ if not ok then return nil, err end
+ end
+ return true
+end
+
+-- Remove 'package_names' from 'deploy_dir' and return the number of removed
+-- packages.
+function remove(package_names, deploy_dir)
+ deploy_dir = deploy_dir or cfg.root_dir
+ if type(package_names) == "string" then package_names = {package_names} end
+
+ assert(type(package_names) == "table", "dist.remove: Argument 'package_names' is not a string or table.")
+ assert(type(deploy_dir) == "string", "dist.remove: Argument 'deploy_dir' is not a string.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local pkgs_to_remove = {}
+ local installed = depends.get_installed(deploy_dir)
+
+ -- find packages to remove
+ if #package_names == 0 then
+ pkgs_to_remove = installed
+ else
+ pkgs_to_remove = depends.find_packages(package_names, installed)
+ end
+
+ -- remove them
+ for _, pkg in pairs(pkgs_to_remove) do
+ local pkg_distinfo_dir = sys.make_path(cfg.distinfos_dir, pkg.name .. "-" .. pkg.version)
+ local ok, err = package.remove_pkg(pkg_distinfo_dir, deploy_dir)
+ if not ok then return nil, err end
+ end
+
+ return #pkgs_to_remove
+end
+
+-- Download 'pkg_names' to 'fetch_dir' and return the table of their directories.
+function fetch(pkg_names, fetch_dir)
+ fetch_dir = fetch_dir or sys.current_dir()
+ assert(type(pkg_names) == "table", "dist.fetch: Argument 'pkg_names' is not a string or table.")
+ assert(type(fetch_dir) == "string", "dist.fetch: Argument 'fetch_dir' is not a string.")
+ fetch_dir = sys.abs_path(fetch_dir)
+
+ local manifest = mf.get_manifest()
+
+ local pkgs_to_fetch = {}
+ for _, pkg_name in pairs(pkg_names) do
+
+ -- retrieve available versions
+ local versions, err = package.retrieve_versions(pkg_name, manifest)
+ if not versions then return nil, err end
+ for _, version in pairs(versions) do
+ table.insert(manifest, version)
+ end
+
+ local packages = depends.find_packages(pkg_name, manifest)
+ if #packages == 0 then return nil, "No packages found for '" .. pkg_name .. "'." end
+
+ packages = depends.sort_by_versions(packages)
+ table.insert(pkgs_to_fetch, packages[1])
+ end
+
+ local fetched_dirs = {}
+ for _, pkg in pairs(pkgs_to_fetch) do
+ local fetched_pkg, err = package.fetch_pkg(pkg, fetch_dir)
+ if not fetched_pkg then return nil, err end
+ table.insert(fetched_dirs, fetched_pkg.download_dir)
+ end
+
+ return fetched_dirs
+end
+
+-- Upload binary version of given modules installed in the specified
+-- 'deploy_dir' to the repository specified by provided base url.
+-- Return the number of uploaded packages.
+--
+-- Organization of uploaded modules and their repositories is subject
+-- to the following conventions:
+-- - destination repository is: 'DEST_GIT_BASE_URL/MODULE_NAME'
+-- - module will be uploaded to the branch: 'ARCH-TYPE' according
+-- to the arch and type of the user's machine
+-- - the module will be tagged as: 'VERSION-ARCH-TYPE' (if the tag already
+-- exists, it will be overwritten)
+--
+-- E.g. assume that the module 'lua-5.1.4' is installed on the 32bit Linux
+-- system (Linux-i686). When this function is called with the module name
+-- 'lua' and base url 'git@github.com:LuaDist', then the binary version
+-- of the module 'lua', that is installed on the machine, will be uploaded
+-- to the branch 'Linux-i686' of the repository 'git@github.com:LuaDist/lua.git'
+-- and tagged as '5.1.4-Linux-i686'.
+function upload_modules(deploy_dir, module_names, dest_git_base_url)
+ deploy_dir = deploy_dir or cfg.root_dir
+ if type(module_names) == "string" then module_names = {module_names} end
+ assert(type(deploy_dir) == "string", "dist.upload_module: Argument 'deploy_dir' is not a string.")
+ assert(type(module_names) == "table", "dist.upload_module: Argument 'module_name' is not a string or table.")
+ assert(type(dest_git_base_url) == "string", "dist.upload_module: Argument 'dest_git_base_url' is not a string.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local modules_to_upload = {}
+ local installed = depends.get_installed(deploy_dir)
+
+ -- find modules to upload
+ if #module_names == 0 then
+ modules_to_upload = installed
+ else
+ modules_to_upload = depends.find_packages(module_names, installed)
+ end
+
+ for _, installed_module in pairs(modules_to_upload) do
+
+ -- set names
+ local branch_name = cfg.arch .. "-" .. cfg.type
+ local tag_name = installed_module.version .. "-" .. branch_name
+ local full_name = installed_module.name .. "-" .. tag_name
+ local tmp_dir = sys.make_path(deploy_dir, cfg.temp_dir, full_name .. "-to-upload")
+ local dest_git_url = dest_git_base_url .. "/" .. installed_module.name .. ".git"
+ local distinfo_file = sys.make_path(deploy_dir, cfg.distinfos_dir, installed_module.name .. "-" .. installed_module.version, "dist.info")
+
+ -- create temporary directory (delete previous if already exists)
+ if sys.exists(tmp_dir) then sys.delete(tmp_dir) end
+ local ok, err = sys.make_dir(tmp_dir)
+ if not ok then return nil, err end
+
+ -- copy the module files for all enabled components
+ for _, component in ipairs(cfg.components) do
+ if installed_module.files[component] then
+ for _, file in ipairs(installed_module.files[component]) do
+ local file_path = sys.make_path(deploy_dir, file)
+ local dest_dir = sys.parent_dir(sys.make_path(tmp_dir, file))
+ if sys.is_file(file_path) then
+ sys.make_dir(dest_dir)
+ sys.copy(file_path, dest_dir)
+ end
+ end
+ end
+ end
+
+ -- add module's dist.info file
+ sys.copy(distinfo_file, tmp_dir)
+
+ -- create git repo
+ ok, err = git.init(tmp_dir)
+ if not ok then return nil, "Error initializing empty git repository in '" .. tmp_dir .. "': " .. err end
+
+ -- add all files
+ ok, err = git.add_all(tmp_dir)
+ if not ok then return nil, "Error adding all files to the git index in '" .. tmp_dir .. "': " .. err end
+
+ -- create commit
+ ok, err = git.commit("[luadist-git] add " .. full_name .. " [ci skip]", tmp_dir)
+ if not ok then return nil, "Error commiting changes in '" .. tmp_dir .. "': " .. err end
+
+ -- rename branch
+ ok, err = git.rename_branch("master", branch_name, tmp_dir)
+ if not ok then return nil, "Error renaming branch 'master' to '" .. branch_name .. "' in '" .. tmp_dir .. "': " .. err end
+
+ -- create tag
+ ok, err = git.create_tag(tmp_dir, tag_name)
+ if not ok then return nil, "Error creating tag '" .. tag_name .. "' in '" .. tmp_dir .. "': " .. err end
+
+ print("Uploading " .. full_name .. " to " .. dest_git_url .. "...")
+
+ -- push to the repository
+ ok, err = git.push_ref(tmp_dir, branch_name, dest_git_url, true)
+ if not ok then return nil, "Error when pushing branch '" .. branch_name .. "' and tag '" .. tag_name .. "' to '" .. dest_git_url .. "': " .. err end
+
+ -- delete temporary directory (if not in debug mode)
+ if not cfg.debug then sys.delete(tmp_dir) end
+ end
+
+ return #modules_to_upload
+end
+
+-- Returns table with information about module's dependencies, using the cache.
+function dependency_info(module, deploy_dir)
+ cache_file = cache_file or sys.abs_path(sys.make_path(cfg.root_dir, cfg.dep_cache_file))
+ assert(type(module) == "string", "dist.dependency_info: Argument 'module' is not a string.")
+ assert(type(deploy_dir) == "string", "dist.dependency_info: Argument 'deploy_dir' is not a string.")
+
+ -- get manifest
+ local manifest, err = mf.get_manifest()
+ if not manifest then return nil, "Error getting manifest: " .. err end
+
+ -- get dependency manifest
+ -- TODO: Is it good that dep_manifest is deploy_dir-specific?
+ -- Probably it'd be better not to be specific, but then there're
+ -- problems with 'provides'. E.g. What to do if there's a module
+ -- installed, that is provided by two different modules in two deploy_dirs?
+ local dep_manifest_file = sys.abs_path(sys.make_path(deploy_dir, cfg.dep_cache_file))
+ local dep_manifest, status = {}
+ if sys.exists(dep_manifest_file) and cfg.cache and not utils.cache_timeout_expired(cfg.cache_timeout, dep_manifest_file) then
+ status, dep_manifest = mf.load_manifest(dep_manifest_file)
+ if not dep_manifest then return nil, status end
+ end
+
+ -- force getting the dependency information
+ local installed = {}
+
+ -- resolve dependencies
+ local dependencies, dep_manifest_or_err = depends.get_depends(module, installed, manifest, dep_manifest, deploy_dir, false, true and not cfg.debug)
+ if not dependencies then return nil, dep_manifest_or_err end
+
+ -- save updated dependency manifest
+ local ok, err = sys.make_dir(sys.parent_dir(dep_manifest_file))
+ if not ok then return nil, err end
+ ok, err = mf.save_manifest(dep_manifest_or_err, dep_manifest_file)
+ if not ok then return nil, err end
+
+ -- collect just relevant dependencies from dependency manifest
+ local relevant_deps = {}
+ for _, dep in pairs(dependencies) do
+ local name_ver = dep.name .. "-" .. (dep.was_scm_version and "scm" or dep.version)
+ if dep_manifest_or_err[name_ver] then
+ table.insert(relevant_deps, dep_manifest_or_err[name_ver])
+ else
+ return nil, "Error: dependency information for '" .. name_ver .. "' not found in dependency manifest."
+ end
+ end
+
+ return relevant_deps
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/logger.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/logger.lua
new file mode 100644
index 0000000..7843223
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/logger.lua
@@ -0,0 +1,64 @@
+-- Simple logger for LuaDist.
+
+module ("dist.logger", package.seeall)
+
+local cfg = require "dist.config"
+local sys = require "dist.sys"
+
+-- Open 'log_file' and return a log, or nil and error msg on error.
+local function get_log(log_file)
+ log_file = log_file or cfg.log_file
+ assert(type(log_file) == "string", "log.get_log: Argument 'log_file' is not a string.")
+ log_file = sys.abs_path(log_file)
+
+ sys.make_dir(sys.parent_dir(log_file))
+ local log, err = io.open(log_file, "a")
+ if not log then
+ return nil, "Error: can't open a logfile '" .. log_file .. "': " .. err
+ else
+ return log
+ end
+end
+
+-- Set the default log.
+local log_file = get_log(cfg.log_file)
+
+-- Log levels used.
+local log_levels = {
+ DEBUG = 0, -- Fine-grained informational events that are most useful to debug an application.
+ INFO = 1, -- Informational messages that highlight the progress of the application at coarse-grained level.
+ WARN = 2, -- Potentially harmful situations.
+ ERROR = 3, -- Error events that might still allow the application to continue running.
+ FATAL = 4, -- Very severe error events that would presumably lead the application to abort.
+}
+
+-- Write 'message' with 'level' to 'log'.
+local function write(level, ...)
+ assert(type(level) == "string", "log.write: Argument 'level' is not a string.")
+ assert(#arg > 0, "log.write: No message arguments provided.")
+ assert(type(log_levels[level]) == "number", "log.write: Unknown log level used: '" .. level .. "'.")
+
+ level = level:upper()
+ local message = table.concat(arg, " ")
+
+ -- Check if writing for this log level is enabled.
+ if cfg.write_log_level and log_levels[level] >= log_levels[cfg.write_log_level] then
+ log_file:write(os.date("%Y-%m-%d %H:%M:%S") .. " [" .. level .. "]\t" .. message .. "\n")
+ log_file:flush()
+ end
+
+ -- Check if printing for this log level is enabled.
+ if cfg.print_log_level and log_levels[level] >= log_levels[cfg.print_log_level] then
+ print(message)
+ end
+end
+
+-- Functions with defined log levels for simple use.
+function debug(...) return write("DEBUG", ...) end
+function info(...) return write("INFO", ...) end
+function warn(...) return write("WARN", ...) end
+function error(...) return write("ERROR", ...) end
+function fatal(...) return write("FATAL", ...) end
+
+-- Function with explicitly specified log level.
+function log(level, ...) return write(level, ...) end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/manifest.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/manifest.lua
new file mode 100644
index 0000000..ccaad13
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/manifest.lua
@@ -0,0 +1,248 @@
+-- Working with manifest and dist.info files
+
+module ("dist.manifest", package.seeall)
+
+local cfg = require "dist.config"
+local git = require "dist.git"
+local sys = require "dist.sys"
+local utils = require "dist.utils"
+
+-- Return the manifest table from 'manifest_file'. If the manifest is in cache,
+-- then the cached version is used. You can set the cache timeout value in
+-- 'config.cache_timeout' variable.
+-- If optional 'force_no_cache' parameter is true, then the cache is not used.
+function get_manifest(manifest_file, force_no_cache)
+ manifest_file = manifest_file or sys.make_path(cfg.root_dir, cfg.manifest_file)
+ force_no_cache = force_no_cache or false
+
+ assert(type(manifest_file) == "string", "manifest.get_manifest: Argument 'manifest_file' is not a string.")
+ assert(type(force_no_cache) == "boolean", "manifest.get_manifest: Argument 'force_no_cache' is not a boolean.")
+ manifest_file = sys.abs_path(manifest_file)
+
+ -- download new manifest to the cache if not present or cache not used or cache expired
+ if not sys.exists(manifest_file) or force_no_cache or not cfg.cache or utils.cache_timeout_expired(cfg.cache_timeout, manifest_file) then
+ local manifest_dest = sys.parent_dir(manifest_file) or sys.current_dir()
+ local ok, err = download_manifest(manifest_dest, cfg.repos)
+ if not ok then return nil, "Error when downloading manifest: " .. err end
+ end
+
+ -- load manifest from cache
+ local status, ret = load_manifest(manifest_file)
+ if not status then return nil, "Error when loading manifest: " .. ret end
+
+ return ret
+end
+
+-- Download manifest from the table of git 'repository_urls' to 'dest_dir' and return true on success
+-- and nil and error message on error.
+function download_manifest(dest_dir, repository_urls)
+ dest_dir = dest_dir or sys.make_path(cfg.root_dir, cfg.cache_dir)
+ repository_urls = repository_urls or cfg.repos
+ if type(repository_urls) == "string" then repository_urls = {repository_urls} end
+
+ assert(type(dest_dir) == "string", "manifest.download_manifest: Argument 'dest_dir' is not a string.")
+ assert(type(repository_urls) == "table", "manifest.download_manifest: Argument 'repository_urls' is not a table or string.")
+ dest_dir = sys.abs_path(dest_dir)
+
+ -- define used files and directories
+ local manifest_filename = sys.extract_name(cfg.manifest_file)
+ local manifest_file = sys.make_path(dest_dir, manifest_filename)
+ local temp_dir = sys.make_path(cfg.root_dir, cfg.temp_dir)
+
+ -- ensure that destination directory exists
+ local ok, err = sys.make_dir(dest_dir)
+ if not ok then return nil, err end
+
+ -- retrieve manifests from repositories and collect them into one manifest table
+ local manifest = {}
+
+ if #repository_urls == 0 then return nil, "No repository url specified." end
+
+ print("Downloading repository information...")
+ for k, repo in pairs(repository_urls) do
+ local clone_dir = sys.make_path(temp_dir, "repository_" .. tostring(k))
+
+ -- clone the repo and add its '.gitmodules' file to the manifest table
+
+ ok, err = git.create_repo(clone_dir)
+
+ local sha
+ if ok then sha, err = git.fetch_branch(clone_dir, repo, "master") end
+ if sha then ok, err = git.checkout_sha(sha, clone_dir) end
+
+ if not (ok and sha) then
+ if not cfg.debug then sys.delete(clone_dir) end
+ return nil, "Error when downloading the manifest from repository with url: '" .. repo .. "': " .. err
+ else
+ for _, pkg in pairs(load_gitmodules(sys.make_path(clone_dir, ".gitmodules"))) do
+ table.insert(manifest, pkg)
+ end
+ end
+ if not cfg.debug then sys.delete(clone_dir) end
+ end
+
+ -- save the new manifest table to the file
+ ok, err = save_manifest(manifest, manifest_file)
+ if not ok then return nil, err end
+
+ return true
+end
+
+-- A secure loadfile function
+-- If file code chunk has upvalues, the first upvalue is set to the given
+-- environement, if that parameter is given, or to the value of the global environment.
+local function secure_loadfile(file, env)
+ assert(type(file) == "string", "secure_loadfile: Argument 'file' is not a string.")
+
+ -- use the given (or create a new) restricted environment
+ local env = env or {}
+
+ -- load the file and run in a protected call with the restricted env
+ -- setfenv is deprecated in lua 5.2 in favor of giving env in arguments
+ -- the additional loadfile arguments are simply ignored for previous lua versions
+ local f, err = loadfile(file, 'bt', env)
+ if f then
+ if setfenv ~= nil then
+ setfenv(f, env)
+ end
+ return pcall(f)
+ else
+ return nil, err
+ end
+end
+
+-- Load and return manifest table from the manifest file.
+-- If manifest file not present, return nil.
+function load_manifest(manifest_file)
+ manifest_file = manifest_file or sys.make_path(cfg.root_dir, cfg.manifest_file)
+
+ return secure_loadfile(sys.abs_path(manifest_file))
+end
+
+-- Load '.gitmodules' file and returns manifest table.
+-- If the file is not present, return nil.
+function load_gitmodules(gitmodules_file)
+ gitmodules_file = gitmodules_file or sys.make_path(cfg.root_dir, cfg.manifest_file)
+ assert(type(gitmodules_file) == "string", "manifest.load_gitmodules: Argument 'gitmodules_file' is not a string.")
+ gitmodules_file = sys.abs_path(gitmodules_file)
+
+ if sys.exists(gitmodules_file) then
+ -- load the .gitmodules file
+ local file, err = io.open(gitmodules_file, "r")
+ if not file then return nil, "Error when opening the .gitmodules file '" .. gitmodules_file .. "':" .. err end
+
+ local mf_text = file:read("*a")
+ file:close()
+ if not mf_text then return nil, "Error when reading the .gitmodules file '" .. gitmodules_file .. "':" .. err end
+
+ manifest = {}
+ for url in mf_text:gmatch("git://%S+/%S+") do
+ pkg = {name = url:match("git://%S+/(%S+)%.git") or url:match("git://%S+/(%S+)"), version = "scm", path = url}
+ table.insert(manifest, pkg)
+ end
+
+ return manifest
+ else
+ return nil, "Error when loading the .gitmodules: file '" .. gitmodules_file .. "' doesn't exist."
+ end
+end
+
+-- Save manifest table to the 'file'
+function save_manifest(manifest_table, file)
+ assert(type(manifest_table) == "table", "manifest.save_distinfo: Argument 'manifest_table' is not a table.")
+ assert(type(file) == "string", "manifest.save_distinfo: Argument 'file' is not a string.")
+ file = sys.abs_path(file)
+
+ -- Print table 'tbl' to io stream 'file'.
+ local function print_table(file, tbl, in_nested_table)
+ for k, v in pairs(tbl) do
+ -- print key
+ if in_nested_table then file:write("\t\t") end
+ if type(k) ~= "number" then
+ file:write("['" .. k .. "']" .. " = ")
+ end
+ -- print value
+ if type(v) == "table" then
+ file:write("{\n")
+ print_table(file, v, true)
+ if in_nested_table then file:write("\t") end
+ file:write("\t}")
+ else
+ if in_nested_table then file:write("\t") end
+ if type(v) == "string" then
+ file:write('[[' .. v .. ']]')
+ else
+ file:write(tostring(v))
+ end
+ end
+ file:write(",\n")
+ end
+ end
+
+ local manifest_file = io.open(file, "w")
+ if not manifest_file then return nil, "Error when saving manifest: cannot open the file '" .. file .. "'." end
+
+ manifest_file:write('return {\n')
+ print_table(manifest_file, manifest_table)
+ manifest_file:write('},\ntrue')
+ manifest_file:close()
+
+ return true
+end
+
+-- Load and return package info table from the distinfo_file file.
+-- If file not present, return nil.
+function load_distinfo(distinfo_file)
+ assert(type(distinfo_file) == "string", "manifest.load_distinfo: Argument 'distinfo_file' is not a string.")
+ distinfo_file = sys.abs_path(distinfo_file)
+
+ -- load the distinfo file
+ local distinfo_env = {}
+ local status, ret = secure_loadfile(distinfo_file, distinfo_env)
+ if not status then return nil, "Error when loading package info: " .. ret end
+
+ return distinfo_env
+end
+
+-- Save distinfo table to the 'file'
+function save_distinfo(distinfo_table, file)
+ assert(type(distinfo_table) == "table", "manifest.save_distinfo: Argument 'distinfo_table' is not a table.")
+ assert(type(file) == "string", "manifest.save_distinfo: Argument 'file' is not a string.")
+ file = sys.abs_path(file)
+
+ -- Print table 'tbl' to io stream 'file'.
+ local function print_table(file, tbl, in_nested_table)
+ for k, v in pairs(tbl) do
+ -- print key
+ if type(k) ~= "number" then
+ file:write(k .. " = ")
+ end
+ -- print value
+ if type(v) == "table" then
+ file:write("{\n")
+ print_table(file, v, true)
+ file:write("}\n")
+ elseif type(v) == "string" then
+ if in_nested_table then
+ file:write('[[' .. v .. ']]')
+ else
+ file:write('"' .. v .. '"')
+ end
+ else
+ file:write(v)
+ end
+ if in_nested_table then
+ file:write(",")
+ end
+ file:write("\n")
+ end
+ end
+
+ local distinfo_file = io.open(file, "w")
+ if not distinfo_file then return nil, "Error when saving dist-info table: cannot open the file '" .. file .. "'." end
+
+ print_table(distinfo_file, distinfo_table)
+ distinfo_file:close()
+
+ return true
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/package.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/package.lua
new file mode 100644
index 0000000..da399c1
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/package.lua
@@ -0,0 +1,596 @@
+-- Package functions
+
+module ("dist.package", package.seeall)
+
+local cfg = require "dist.config"
+local git = require "dist.git"
+local sys = require "dist.sys"
+local mf = require "dist.manifest"
+local utils = require "dist.utils"
+local depends = require "dist.depends"
+
+-- Return whether the package in given 'pkg_dir' is of a source type.
+function is_source_type(pkg_dir)
+ assert(type(pkg_dir) == "string", "package.is_source_type: Argument 'pkg_dir' is not a string.")
+ pkg_dir = sys.abs_path(pkg_dir)
+ return utils.to_boolean(sys.exists(sys.make_path(pkg_dir, "CMakeLists.txt")))
+end
+
+-- Ensure proper arch and type for the given source 'dist_info' table and return it.
+-- WARNING: this function should be used only for 'dist_info' tables of modules that are of a source type!
+function ensure_source_arch_and_type(dist_info)
+ assert(type(dist_info) == "table", "package.ensure_source_arch_and_type: Argument 'dist_info' is not a table.")
+ dist_info.arch = dist_info.arch or "Universal"
+ dist_info.type = dist_info.type or "source"
+ return dist_info
+end
+
+-- Remove package from 'pkg_distinfo_dir' of 'deploy_dir'.
+function remove_pkg(pkg_distinfo_dir, deploy_dir)
+ deploy_dir = deploy_dir or cfg.root_dir
+ assert(type(pkg_distinfo_dir) == "string", "package.remove_pkg: Argument 'pkg_distinfo_dir' is not a string.")
+ assert(type(deploy_dir) == "string", "package.remove_pkg: Argument 'deploy_dir' is not a string.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local abs_pkg_distinfo_dir = sys.make_path(deploy_dir, pkg_distinfo_dir)
+
+ -- check for 'dist.info'
+ local info, err = mf.load_distinfo(sys.make_path(abs_pkg_distinfo_dir, "dist.info"))
+ if not info then return nil, "Error removing package from '" .. pkg_distinfo_dir .. "' - it doesn't contain valid 'dist.info' file." end
+ if not info.files then return nil, "File '" .. sys.make_path(pkg_distinfo_dir, "dist.info") .."' doesn't contain list of installed files." end
+
+ -- remove files installed as components of this package
+ for _, component in ipairs(cfg.components) do
+ if info.files[component] then
+ for i = #info.files[component], 1, -1 do
+ local f = info.files[component][i]
+ f = sys.make_path(deploy_dir,f)
+ if sys.is_file(f) then
+ sys.delete(f)
+ elseif sys.is_dir(f) then
+ local dir_files, err = sys.get_file_list(f)
+ if not dir_files then return nil, "Error removing package in '" .. abs_pkg_distinfo_dir .. "': " .. err end
+ if #dir_files == 0 then sys.delete(f) end
+ end
+ -- delete also all parent directories if empty
+ local parents = sys.parents_up_to(f, deploy_dir)
+ for _, parent in ipairs(parents) do
+ if sys.is_dir(parent) then
+ local dir_files, err = sys.get_file_list(parent)
+ if not dir_files then return nil, "Error removing package in '" .. abs_pkg_distinfo_dir .. "': " .. err end
+ if #dir_files == 0 then
+ sys.delete(parent)
+ end
+ end
+ end
+ end
+ end
+ end
+
+ -- remove removed components also from 'dist.info'
+ for _, component in ipairs(cfg.components) do
+ info.files[component] = nil
+ end
+
+ -- delete the package information from deploy_dir
+ local ok = sys.delete(abs_pkg_distinfo_dir)
+ if not ok then return nil, "Error removing package in '" .. abs_pkg_distinfo_dir .. "'." end
+
+ -- if the package was not completely removed (e.g. some components remain),
+ -- save the new version of its 'dist.info'
+ local comp_num = 0
+ for _, _ in pairs(info.files) do comp_num = comp_num + 1 end
+ if comp_num ~= 0 then
+ sys.make_dir(abs_pkg_distinfo_dir)
+ local ok, err = mf.save_distinfo(info, sys.make_path(abs_pkg_distinfo_dir, "dist.info"))
+ if not ok then return nil, "Error resaving the 'dist.info': " .. err end
+ end
+
+ return ok
+end
+
+-- Install package from 'pkg_dir' to 'deploy_dir', using optional CMake 'variables'.
+-- Optional 'preserve_pkg_dir' argument specified whether to preserve the 'pkg_dir'.
+function install_pkg(pkg_dir, deploy_dir, variables, preserve_pkg_dir)
+ deploy_dir = deploy_dir or cfg.root_dir
+ variables = variables or {}
+ preserve_pkg_dir = preserve_pkg_dir or false
+
+ assert(type(pkg_dir) == "string", "package.install_pkg: Argument 'pkg_dir' is not a string.")
+ assert(type(deploy_dir) == "string", "package.install_pkg: Argument 'deploy_dir' is not a string.")
+ assert(type(variables) == "table", "package.install_pkg: Argument 'variables' is not a table.")
+ assert(type(preserve_pkg_dir) == "boolean", "package.install_pkg: Argument 'preserve_pkg_dir' is not a boolean.")
+
+ pkg_dir = sys.abs_path(pkg_dir)
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ -- check for dist.info
+ local info, err = mf.load_distinfo(sys.make_path(pkg_dir, "dist.info"))
+ if not info then return nil, "Error installing: the directory '" .. pkg_dir .. "' doesn't exist or doesn't contain valid 'dist.info' file." end
+
+ -- check if the package is source
+ if is_source_type(pkg_dir) then info = ensure_source_arch_and_type(info) end
+
+ -- check package's architecture
+ if not (info.arch == "Universal" or info.arch == cfg.arch) then
+ return nil, "Error installing '" .. info.name .. "-" .. info.version .. "': architecture '" .. info.arch .. "' is not suitable for this machine."
+ end
+
+ -- check package's type
+ if not (info.type == "all" or info.type == "source" or info.type == cfg.type) then
+ return nil, "Error installing '" .. info.name .. "-" .. info.version .. "': architecture type '" .. info.type .. "' is not suitable for this machine."
+ end
+
+ local ok, err
+
+ -- if package is of binary type, just deploy it
+ if info.type ~= "source" then
+ ok, err = deploy_binary_pkg(pkg_dir, deploy_dir)
+
+ -- else build and then deploy
+ else
+
+ -- check if we have cmake
+ ok = utils.system_dependency_available("cmake", "cmake --version")
+ if not ok then return nil, "Error when installing: Command 'cmake' not available on the system." end
+
+ -- set cmake variables
+ local cmake_variables = {}
+
+ -- set variables from config file
+ for k, v in pairs(cfg.variables) do
+ cmake_variables[k] = v
+ end
+
+ -- set variables specified as argument
+ for k, v in pairs(variables) do
+ cmake_variables[k] = v
+ end
+
+ cmake_variables.CMAKE_INCLUDE_PATH = table.concat({cmake_variables.CMAKE_INCLUDE_PATH or "", sys.make_path(deploy_dir, "include")}, ";")
+ cmake_variables.CMAKE_LIBRARY_PATH = table.concat({cmake_variables.CMAKE_LIBRARY_PATH or "", sys.make_path(deploy_dir, "lib"), sys.make_path(deploy_dir, "bin")}, ";")
+ cmake_variables.CMAKE_PROGRAM_PATH = table.concat({cmake_variables.CMAKE_PROGRAM_PATH or "", sys.make_path(deploy_dir, "bin")}, ";")
+
+ -- build the package and deploy it
+ ok, err = build_pkg(pkg_dir, deploy_dir, cmake_variables)
+ if not ok then return nil, err end
+
+ end
+
+ -- delete directory of fetched package
+ if not (cfg.debug or preserve_pkg_dir) then sys.delete(pkg_dir) end
+
+ return ok, err
+end
+
+-- Build and deploy package from 'src_dir' to 'deploy_dir' using 'variables'.
+-- Return directory to which the package was built or nil on error.
+-- 'variables' is table of optional CMake variables.
+function build_pkg(src_dir, deploy_dir, variables)
+ deploy_dir = deploy_dir or cfg.root_dir
+ variables = variables or {}
+
+ assert(type(src_dir) == "string", "package.build_pkg: Argument 'src_dir' is not a string.")
+ assert(type(deploy_dir) == "string", "package.build_pkg: Argument 'deploy_dir' is not a string.")
+ assert(type(variables) == "table", "package.build_pkg: Argument 'variables' is not a table.")
+
+ src_dir = sys.abs_path(src_dir)
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ -- check for dist.info
+ local info, err = mf.load_distinfo(sys.make_path(src_dir, "dist.info"))
+ if not info then return nil, "Error building package from '" .. src_dir .. "': it doesn't contain valid 'dist.info' file." end
+ local pkg_name = info.name .. "-" .. info.version
+
+ -- set machine information
+ info.arch = cfg.arch
+ info.type = cfg.type
+
+ -- create CMake build dir
+ local cmake_build_dir = sys.abs_path(sys.make_path(deploy_dir, cfg.temp_dir, pkg_name .. "-CMake-build"))
+ sys.make_dir(cmake_build_dir)
+
+ -- create cmake cache
+ variables["CMAKE_INSTALL_PREFIX"] = deploy_dir
+ local cache_file = io.open(sys.make_path(cmake_build_dir, "cache.cmake"), "w")
+ if not cache_file then return nil, "Error creating CMake cache file in '" .. cmake_build_dir .. "'" end
+
+ -- Fill in cache variables
+ for k,v in pairs(variables) do
+ cache_file:write("SET(" .. k .. " " .. sys.quote(v):gsub("\\+", "/") .. " CACHE STRING \"\" FORCE)\n")
+ end
+
+ -- If user cache file is provided then append it
+ if cfg.cache_file ~= "" then
+ local user_cache = io.open(sys.abs_path(cfg.cache_file), "r")
+ if user_cache then
+ cache_file:write(user_cache:read("*all").."\n")
+ user_cache:close()
+ end
+ end
+ cache_file:close()
+
+ src_dir = sys.abs_path(src_dir)
+ print("Building " .. sys.extract_name(src_dir) .. "...")
+
+ -- set cmake cache command
+ local cache_command = cfg.cache_command
+ if cfg.debug then cache_command = cache_command .. " " .. cfg.cache_debug_options end
+
+ -- set cmake build command
+ local build_command = cfg.build_command
+ if cfg.debug then build_command = build_command .. " " .. cfg.build_debug_options end
+
+ -- set the cmake cache
+ local ok = sys.exec("cd " .. sys.quote(cmake_build_dir) .. " && " .. cache_command .. " " .. sys.quote(src_dir))
+ if not ok then return nil, "Error preloading the CMake cache script '" .. sys.make_path(cmake_build_dir, "cache.cmake") .. "'" end
+
+ -- build with cmake
+ ok = sys.exec("cd " .. sys.quote(cmake_build_dir) .. " && " .. build_command)
+ if not ok then return nil, "Error building with CMake in directory '" .. cmake_build_dir .. "'" end
+
+ -- if this is only simulation, exit sucessfully, skipping the next actions
+ if cfg.simulate then
+ return true, "Simulated build and deployment of package '" .. pkg_name .. "' sucessfull."
+ end
+
+ -- table to collect files installed in the components
+ info.files = {}
+
+ -- install the components
+ for _, component in ipairs(cfg.components) do
+ local strip_option = ""
+ if not cfg.debug and component ~= "Library" then strip_option = cfg.strip_option end
+
+ local ok = sys.exec("cd " .. sys.quote(cmake_build_dir) .. " && " .. cfg.cmake .. " " .. strip_option .. " " ..cfg.install_component_command:gsub("#COMPONENT#", component))
+
+ if not ok then return nil, "Error when installing the component '" .. component .. "' with CMake in directory '" .. cmake_build_dir .. "'" end
+
+ local install_mf = sys.make_path(cmake_build_dir, "install_manifest_" .. component .. ".txt")
+ local mf, err
+ local component_files = {}
+
+ -- collect files installed in this component
+ if sys.exists(install_mf) then
+ mf, err = io.open(install_mf, "r")
+ if not mf then return nil, "Error when opening the CMake installation manifest '" .. install_mf .. "': " .. err end
+ for line in mf:lines() do
+ line = sys.check_separators(line)
+ local file = line:gsub(utils.escape_magic(deploy_dir .. sys.path_separator()), "")
+ table.insert(component_files, file)
+ end
+ mf:close()
+
+ -- add list of component files to the 'dist.info'
+ if #component_files > 0 then info.files[component] = component_files end
+ end
+ end
+-- if bookmark == 0 then return nil, "Package did not install any files!" end
+
+ -- test with ctest
+ if cfg.test then
+ print("Testing " .. sys.extract_name(src_dir) .. " ...")
+ ok = sys.exec("cd " .. sys.quote(deploy_dir) .. " && " .. cfg.test_command)
+ if not ok then return nil, "Error when testing the module '" .. pkg_name .. "' with CTest." end
+ end
+
+ -- save modified 'dist.info' file
+ local pkg_distinfo_dir = sys.make_path(deploy_dir, cfg.distinfos_dir, pkg_name)
+ sys.make_dir(pkg_distinfo_dir)
+ ok, err = mf.save_distinfo(info, sys.make_path(pkg_distinfo_dir, "dist.info"))
+ if not ok then return nil, err end
+
+ -- clean up
+ if not cfg.debug then sys.delete(cmake_build_dir) end
+
+ return true, "Package '" .. pkg_name .. "' successfully builded and deployed to '" .. deploy_dir .. "'."
+end
+
+-- Deploy binary package from 'pkg_dir' to 'deploy_dir' by copying.
+function deploy_binary_pkg(pkg_dir, deploy_dir)
+ deploy_dir = deploy_dir or cfg.root_dir
+
+ assert(type(pkg_dir) == "string", "package.deploy_binary_pkg: Argument 'pkg_dir' is not a string.")
+ assert(type(deploy_dir) == "string", "package.deploy_binary_pkg: Argument 'deploy_dir' is not a string.")
+
+ pkg_dir = sys.abs_path(pkg_dir)
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ -- check for dist.info
+ local info, err = mf.load_distinfo(sys.make_path(pkg_dir, "dist.info"))
+ if not info then return nil, "Error deploying package from '" .. pkg_dir .. "': it doesn't contain valid 'dist.info' file." end
+ local pkg_name = info.name .. "-" .. info.version
+
+ -- if this is only simulation, exit sucessfully, skipping the next actions
+ if cfg.simulate then
+ return true, "Simulated deployment of package '" .. pkg_name .. "' sucessfull."
+ end
+
+ -- copy all components of the module to the deploy_dir
+ for _, component in ipairs(cfg.components) do
+ if info.files[component] then
+ for _, file in ipairs(info.files[component]) do
+ local dest_dir = sys.make_path(deploy_dir, sys.parent_dir(file))
+
+ local ok, err = sys.make_dir(dest_dir)
+ if not ok then return nil, "Error when deploying package '" .. pkg_name .. "': cannot create directory '" .. dest_dir .. "': " .. err end
+
+ ok, err = sys.copy(sys.make_path(pkg_dir, file), dest_dir)
+ if not ok then return nil, "Error when deploying package '" .. pkg_name .. "': cannot copy file '" .. file .. "' to the directory '" .. dest_dir .. "': " .. err end
+ end
+ end
+ end
+
+ -- copy dist.info to register the module as installed
+ local pkg_distinfo_dir = sys.make_path(deploy_dir, cfg.distinfos_dir, pkg_name)
+ sys.make_dir(pkg_distinfo_dir)
+ ok, err = mf.save_distinfo(info, sys.make_path(pkg_distinfo_dir, "dist.info"))
+ if not ok then return nil, err end
+
+ return true, "Package '" .. pkg_name .. "' successfully deployed to '" .. deploy_dir .. "'."
+end
+
+-- Fetch package (table 'pkg') to download_dir. Return the original 'pkg' table
+-- with 'pkg.download_dir' containing path to the directory of the
+-- downloaded package.
+--
+-- When optional 'suppress_printing' parameter is set to true, then messages
+-- for the user won't be printed during run of this function.
+--
+-- If the 'pkg' already contains the information about download directory (pkg.download_dir),
+-- we assume the package was already downloaded there and won't download it again.
+function fetch_pkg(pkg, download_dir, suppress_printing)
+ download_dir = download_dir or sys.current_dir()
+ suppress_printing = suppress_printing or false
+ assert(type(pkg) == "table", "package.fetch_pkg: Argument 'pkg' is not a table.")
+ assert(type(download_dir) == "string", "package.fetch_pkg: Argument 'download_dir' is not a string.")
+ assert(type(suppress_printing) == "boolean", "package.fetch_pkg: Argument 'suppress_printing' is not a boolean.")
+ assert(type(pkg.name) == "string", "package.fetch_pkg: Argument 'pkg.name' is not a string.")
+ assert(type(pkg.version) == "string", "package.fetch_pkg: Argument 'pkg.version' is not a string.")
+
+ -- if the package is already downloaded don't download it again
+ if pkg.download_dir then return pkg end
+
+ assert(type(pkg.path) == "string", "package.fetch_pkg: Argument 'pkg.path' is not a string.")
+ download_dir = sys.abs_path(download_dir)
+
+ local pkg_full_name = pkg.name .. "-" .. pkg.version
+ local repo_url = pkg.path
+ local clone_dir = sys.abs_path(sys.make_path(download_dir, pkg_full_name))
+ pkg.download_dir = clone_dir
+
+ -- check if download_dir already exists, assuming the package was already downloaded
+ if sys.exists(sys.make_path(clone_dir, "dist.info")) then
+ if cfg.cache and not utils.cache_timeout_expired(cfg.cache_timeout, clone_dir) then
+ if not suppress_printing then print("'" .. pkg_full_name .. "' already in cache, skipping downloading (use '-cache=false' to force download).") end
+ return pkg
+ else
+ sys.delete(sys.make_path(clone_dir))
+ end
+ end
+
+ local bin_tag = pkg.version .. "-" .. cfg.arch .. "-" .. cfg.type
+ local use_binary = false
+
+ if cfg.binary then
+ -- check if binary version of the module for this arch & type available
+ local avail_tags, err = git.get_remote_tags(repo_url)
+ if not avail_tags then return nil, err end
+
+ if utils.contains(avail_tags, bin_tag) then
+ use_binary = true
+ end
+ end
+
+ -- init the git repository
+ local ok, err = git.create_repo(clone_dir)
+ if not ok then return nil, err end
+
+ -- Fetch the desired ref (from the pkg's remote repo) and checkout into it.
+
+ if use_binary then
+
+ if not suppress_printing then print("Getting " .. pkg_full_name .. " (binary)...") end
+
+ -- We fetch the binary tag.
+ local sha
+ if ok then sha, err = git.fetch_tag(clone_dir, repo_url, bin_tag) end
+ if sha then ok, err = git.checkout_sha(sha, clone_dir) end
+
+ elseif cfg.source then
+
+ if not suppress_printing then print("Getting " .. pkg_full_name .. " (source)...") end
+
+ -- If we want the 'scm' version, we fetch the 'master' branch, otherwise
+ -- we fetch the tag, matching the desired package version.
+ if ok and pkg.version ~= "scm" then
+ local sha
+ sha, err = git.fetch_tag(clone_dir, repo_url, pkg.version)
+ if sha then ok, err = git.checkout_sha(sha, clone_dir) end
+ elseif ok then
+ local sha
+ sha, err = git.fetch_branch(clone_dir, repo_url, "master")
+ if sha then ok, err = git.checkout_sha(sha, clone_dir) end
+ end
+
+ else
+ ok = false
+ if cfg.binary then
+ err = "Binary version of module not available and using source modules disabled."
+ else
+ err = "Using both binary and source modules disabled."
+ end
+ end
+
+ if not ok then
+ -- clean up
+ if not cfg.debug then sys.delete(clone_dir) end
+ return nil, "Error fetching package '" .. pkg_full_name .. "' from '" .. pkg.path .. "' to '" .. download_dir .. "': " .. err
+ end
+
+ -- delete '.git' directory
+ if not cfg.debug then sys.delete(sys.make_path(clone_dir, ".git")) end
+
+ return pkg
+end
+
+-- Return table with information about available versions of 'package'.
+--
+-- When optional 'suppress_printing' parameter is set to true, then messages
+-- for the user won't be printed during run of this function.
+function retrieve_versions(package, manifest, suppress_printing)
+ suppress_printing = suppress_printing or false
+ assert(type(package) == "string", "package.retrieve_versions: Argument 'string' is not a string.")
+ assert(type(manifest) == "table", "package.retrieve_versions: Argument 'manifest' is not a table.")
+ assert(type(suppress_printing) == "boolean", "package.retrieve_versions: Argument 'suppress_printing' is not a boolean.")
+
+ -- get package table
+ local pkg_name = depends.split_name_constraint(package)
+ local tmp_packages = depends.find_packages(pkg_name, manifest)
+
+ if #tmp_packages == 0 then
+ return nil, "No suitable candidate for package '" .. package .. "' found."
+ else
+ package = tmp_packages[1]
+ end
+
+ -- if the package's already downloaded, we assume it's desired to install the downloaded version
+ if package.download_dir then
+ local pkg_type = "binary"
+ if is_source_type(package.download_dir) then pkg_type = "source" end
+ if not suppress_printing then print("Using " .. package.name .. "-" .. package.version .. " (" .. pkg_type .. ") provided by " .. package.download_dir) end
+ return {package}
+ end
+
+ if not suppress_printing then print("Finding out available versions of " .. package.name .. "...") end
+
+ -- get available versions
+ local tags, err = git.get_remote_tags(package.path)
+ if not tags then return nil, "Error when retrieving versions of package '" .. package.name .. "': " .. err end
+
+ -- filter out tags of binary packages
+ local versions = utils.filter(tags, function (tag) return tag:match("^[^%-]+%-?[^%-]*$") and true end)
+
+ packages = {}
+
+ -- create package information
+ for _, version in pairs(versions) do
+ pkg = {}
+ pkg.name = package.name
+ pkg.version = version
+ pkg.path = package.path
+ table.insert(packages, pkg)
+ end
+
+ return packages
+end
+
+-- Return table with information from package's dist.info and path to downloaded
+-- package. Optional argument 'deploy_dir' is used just as a temporary
+-- place to place the downloaded packages into.
+--
+-- When optional 'suppress_printing' parameter is set to true, then messages
+-- for the user won't be printed during the execution of this function.
+function retrieve_pkg_info(package, deploy_dir, suppress_printing)
+ deploy_dir = deploy_dir or cfg.root_dir
+ assert(type(package) == "table", "package.retrieve_pkg_info: Argument 'package' is not a table.")
+ assert(type(deploy_dir) == "string", "package.retrieve_pkg_info: Argument 'deploy_dir' is not a string.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local tmp_dir = sys.abs_path(sys.make_path(deploy_dir, cfg.temp_dir))
+
+ -- download the package
+ local fetched_pkg, err = fetch_pkg(package, tmp_dir, suppress_printing)
+ if not fetched_pkg then return nil, "Error when retrieving the info about '" .. package.name .. "': " .. err end
+
+ -- load information from 'dist.info'
+ local info, err = mf.load_distinfo(sys.make_path(fetched_pkg.download_dir, "dist.info"))
+ if not info then return nil, err end
+
+ -- add other attributes
+ if package.path then info.path = package.path end
+ if package.was_scm_version then info.was_scm_version = package.was_scm_version end
+
+ -- set default arch/type if not explicitly stated and package is of source type
+ if is_source_type(fetched_pkg.download_dir) then
+ info = ensure_source_arch_and_type(info)
+ elseif not (info.arch and info.type) then
+ return nil, fetched_pkg.download_dir .. ": binary package missing arch or type in 'dist.info'."
+ end
+
+ return info, fetched_pkg.download_dir
+end
+
+-- Return manifest, augmented with info about all available versions
+-- of package 'pkg'. Optional argument 'deploy_dir' is used just as a temporary
+-- place to place the downloaded packages into.
+-- Optional argument 'installed' is manifest of all installed packages. When
+-- specified, info from installed packages won't be downloaded from repo,
+-- but the dist.info from installed package will be used.
+function get_versions_info(pkg, manifest, deploy_dir, installed)
+ deploy_dir = deploy_dir or cfg.root_dir
+ assert(type(pkg) == "string", "package.get_versions_info: Argument 'pkg' is not a string.")
+ assert(type(manifest) == "table", "package.get_versions_info: Argument 'manifest' is not a table.")
+ assert(type(deploy_dir) == "string", "package.get_versions_info: Argument 'deploy_dir' is not a string.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ -- find all available versions of package
+ local versions, err = retrieve_versions(pkg, manifest)
+ if not versions then return nil, err end
+
+ -- collect info about all retrieved versions
+ local infos = {}
+ for _, version in pairs(versions) do
+
+ local info, path_or_err
+ local installed_version = {}
+
+ -- find out whether this 'version' is installed so we can use it's dist.info
+ if type(installed) == "table" then installed_version = depends.find_packages(version.name .. "-" .. version.version, installed) end
+
+ -- get info
+ if #installed_version > 0 then
+ print("Using dist.info from installed " .. version.name .. "-" .. version.version)
+ info = installed_version[1]
+ info.path = version.path
+ info.from_installed = true -- flag that dist.info of installed package was used
+ else
+ info, path_or_err = retrieve_pkg_info(version, deploy_dir)
+ if not info then return nil, path_or_err end
+ sys.delete(path_or_err)
+ end
+ table.insert(infos, info)
+ end
+
+ -- found and add an implicit 'scm' version
+ local pkg_name = depends.split_name_constraint(pkg)
+ local found = depends.find_packages(pkg_name, manifest)
+ if #found == 0 then return nil, "No suitable candidate for package '" .. pkg .. "' found." end
+ local scm_info, path_or_err = retrieve_pkg_info({name = pkg_name, version = "scm", path = found[1].path})
+ if not scm_info then return nil, path_or_err end
+ sys.delete(path_or_err)
+ scm_info.version = "scm"
+ table.insert(infos, scm_info)
+
+ local tmp_manifest = utils.deepcopy(manifest)
+
+ -- add collected info to the temp. manifest, replacing existing tables
+ for _, info in pairs(infos) do
+ local already_in_manifest = false
+ -- find if this version is already in manifest
+ for idx, pkg in ipairs(tmp_manifest) do
+ -- if yes, replace it
+ if pkg.name == info.name and pkg.version == info.version then
+ tmp_manifest[idx] = info
+ already_in_manifest = true
+ break
+ end
+ end
+ -- if not, just normally add to the manifest
+ if not already_in_manifest then
+ table.insert(tmp_manifest, info)
+ end
+ end
+
+ return tmp_manifest
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/sys.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/sys.lua
new file mode 100644
index 0000000..803df12
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/sys.lua
@@ -0,0 +1,386 @@
+-- System functions
+
+module ("dist.sys", package.seeall)
+
+local cfg = require "dist.config"
+local utils = require "dist.utils"
+local lfs = require "lfs"
+
+-- Return the path separator according to the platform.
+function path_separator()
+ if cfg.arch == "Windows" then
+ return "\\"
+ else
+ return "/"
+ end
+end
+
+-- Return path with wrong separators replaced with the right ones.
+function check_separators(path)
+ assert(type(path) == "string", "sys.check_separators: Argument 'path' is not a string.")
+ if cfg.arch == "Windows" then
+ return path:gsub("/", "\\")
+ else
+ return path
+ end
+end
+
+-- Return the path with the unnecessary trailing separator removed.
+function remove_trailing(path)
+ assert(type(path) == "string", "sys.remove_trailing: Argument 'path' is not a string.")
+ if path:sub(-1) == path_separator() and not is_root(path) then path = path:sub(1,-2) end
+ return path
+end
+
+-- Return the path with the all occurences of '/.' or '\.' (representing
+-- the current directory) removed.
+function remove_curr_dir_dots(path)
+ assert(type(path) == "string", "sys.remove_curr_dir_dots: Argument 'path' is not a string.")
+ while path:match(path_separator() .. "%." .. path_separator()) do -- match("/%./")
+ path = path:gsub(path_separator() .. "%." .. path_separator(), path_separator()) -- gsub("/%./", "/")
+ end
+ return path:gsub(path_separator() .. "%.$", "") -- gsub("/%.$", "")
+end
+
+-- Return string argument quoted for a command line usage.
+function quote(argument)
+ assert(type(argument) == "string", "sys.quote: Argument 'argument' is not a string.")
+
+ -- TODO: This seems like a not very nice hack. Why is it needed?
+ -- Wouldn't it be better to fix the problem where it originates?
+ -- replace '/' path separators for '\' on Windows
+ if cfg.arch == "Windows" and argument:match("^[%u%U.]?:?[/\\].*") then
+ argument = argument:gsub("//","\\"):gsub("/","\\")
+ end
+
+ -- Windows doesn't recognize paths starting with two slashes or backslashes
+ -- so we double every backslash except for the first one
+ if cfg.arch == "Windows" and argument:match("^[/\\].*") then
+ local prefix = argument:sub(1,1)
+ argument = argument:sub(2):gsub("\\", "\\\\")
+ argument = prefix .. argument
+ else
+ argument = argument:gsub("\\", "\\\\")
+ end
+ argument = argument:gsub('"', '\\"')
+
+ return '"' .. argument .. '"'
+end
+
+-- Run the system command (in current directory).
+-- Return true on success, nil on fail and log string.
+-- When optional 'force_verbose' parameter is true, then the output will be shown
+-- even when not in debug or verbose mode.
+function exec(command, force_verbose)
+ force_verbose = force_verbose or false
+ assert(type(command) == "string", "sys.exec: Argument 'command' is not a string.")
+ assert(type(force_verbose) == "boolean", "sys.exec: Argument 'force_verbose' is not a boolean.")
+
+ if not (cfg.verbose or cfg.debug or force_verbose) then
+ if cfg.arch == "Windows" then
+ command = command .. " > NUL 2>&1"
+ else
+ command = command .. " > /dev/null 2>&1"
+ end
+ end
+
+ if cfg.debug then print("Executing the command: " .. command) end
+ local ok, str, status = os.execute(command)
+
+ -- os.execute returned values on failure are:
+ -- nil or true, "exit", n or true, "signal", n for lua >= 5.2
+ -- status ~= 0 for lua 5.x < 5.2
+ if ok == nil or (str == "exit" and status ~= 0) or str == "signal" or (ok ~= 0 and ok ~= true) then
+ return nil, "Error when running the command: " .. command
+ else
+ return true, "Sucessfully executed the command: " .. command
+ end
+end
+
+-- Execute the 'command' and returns its output as a string.
+function capture_output(command)
+ assert(type(command) == "string", "sys.exec: Argument 'command' is not a string.")
+
+ local executed, err = io.popen(command, "r")
+ if not executed then return nil, "Error running the command '" .. command .. "':" .. err end
+
+ local captured, err = executed:read("*a")
+ if not captured then return nil, "Error reading the output of command '" .. command .. "':" .. err end
+
+ executed:close()
+ return captured
+end
+
+-- Return whether the path is a root.
+function is_root(path)
+ assert(type(path) == "string", "sys.is_root: Argument 'path' is not a string.")
+ return utils.to_boolean(path:find("^[a-zA-Z]:[/\\]$") or path:find("^[/\\]$"))
+end
+
+-- Return whether the path is absolute.
+function is_abs(path)
+ assert(type(path) == "string", "sys.is_abs: Argument 'path' is not a string.")
+ return utils.to_boolean(path:find("^[a-zA-Z]:[/\\].*$") or path:find("^[/\\].*$"))
+end
+
+-- Return whether the specified file or directory exists.
+function exists(path)
+ assert(type(path) == "string", "sys.exists: Argument 'path' is not a string.")
+ local attr, err = lfs.attributes(path)
+ return utils.to_boolean(attr), err
+end
+
+-- Return whether the 'file' exists and is a file.
+function is_file(file)
+ assert(type(file) == "string", "sys.is_file: Argument 'file' is not a string.")
+ return lfs.attributes(file, "mode") == "file"
+end
+
+-- Return whether the 'dir' exists and is a directory.
+function is_dir(dir)
+ assert(type(dir) == "string", "sys.is_dir: Argument 'dir' is not a string.")
+ return lfs.attributes(dir, "mode") == "directory"
+end
+
+-- Return the current working directory
+function current_dir()
+ local dir, err = lfs.currentdir()
+ if not dir then return nil, err end
+ return dir
+end
+
+-- Return an iterator over the directory 'dir'.
+-- If 'dir' doesn't exist or is not a directory, return nil and error message.
+function get_directory(dir)
+ dir = dir or current_dir()
+ assert(type(dir) == "string", "sys.get_directory: Argument 'dir' is not a string.")
+ if is_dir(dir) then
+ return lfs.dir(dir)
+ else
+ return nil, "Error: '".. dir .. "' is not a directory."
+ end
+end
+
+-- Extract file or directory name from its path.
+function extract_name(path)
+ assert(type(path) == "string", "sys.extract_name: Argument 'path' is not a string.")
+ if is_root(path) then return path end
+
+ path = remove_trailing(path)
+ path = path:gsub("^.*" .. path_separator(), "")
+ return path
+end
+
+-- Return parent directory of the 'path' or nil if there's no parent directory.
+-- If 'path' is a path to file, return the directory the file is in.
+function parent_dir(path)
+ assert(type(path) == "string", "sys.parent_dir: Argument 'path' is not a string.")
+ path = remove_curr_dir_dots(path)
+ path = remove_trailing(path)
+
+ local dir = path:gsub(utils.escape_magic(extract_name(path)) .. "$", "")
+ if dir == "" then
+ return nil
+ else
+ return make_path(dir)
+ end
+end
+
+-- Returns the table of all parent directories of 'path' up to the directory
+-- specified by 'boundary_path' (exclusive).
+function parents_up_to(path, boundary_path)
+ assert(type(path) == "string", "sys.parents_up_to: Argument 'path' is not a string.")
+ assert(type(boundary_path) == "string", "sys.parents_up_to: Argument 'boundary_path' is not a string.")
+ boundary_path = remove_trailing(boundary_path)
+
+ -- helper function to recursively collect the parent directories
+ local function collect_parents(_path, _parents)
+ local _parent = parent_dir(_path)
+ if _parent and _parent ~= boundary_path then
+ table.insert(_parents, _parent)
+ return collect_parents(_parent, _parents)
+ else
+ return _parents
+ end
+ end
+
+ return collect_parents(path, {})
+end
+
+-- Compose path composed from specified parts or current
+-- working directory when no part specified.
+function make_path(...)
+ -- arg is deprecated in lua 5.2 in favor of table.pack we mimic here
+ local arg = {n=select('#',...),...}
+ local parts = arg
+ assert(type(parts) == "table", "sys.make_path: Argument 'parts' is not a table.")
+
+ local path, err
+ if parts.n == 0 then
+ path, err = current_dir()
+ else
+ path, err = table.concat(parts, path_separator())
+ end
+ if not path then return nil, err end
+
+ -- squeeze repeated occurences of a file separator
+ path = path:gsub(path_separator() .. "+", path_separator())
+
+ -- remove unnecessary trailing path separator
+ path = remove_trailing(path)
+
+ return path
+end
+
+-- Return absolute path from 'path'
+function abs_path(path)
+ assert(type(path) == "string", "sys.get_abs_path: Argument 'path' is not a string.")
+ if is_abs(path) then return path end
+
+ local cur_dir, err = current_dir()
+ if not cur_dir then return nil, err end
+
+ return make_path(cur_dir, path)
+end
+
+-- Returns path to the temporary directory of OS.
+function tmp_dir()
+ return os.getenv("TMPDIR") or os.getenv("TEMP") or os.getenv("TMP") or "/tmp"
+end
+
+-- Returns temporary file (or directory) path (with optional prefix).
+function tmp_name(prefix)
+ prefix = prefix or ""
+ assert(type(prefix) == "string", "sys.tmp_name: Argument 'prefix' is not a string.")
+ return make_path(tmp_dir(), prefix .. "luadist_" .. utils.rand(10000000000))
+end
+
+-- Return table of all paths in 'dir'
+function get_file_list(dir)
+ dir = dir or current_dir()
+ assert(type(dir) == "string", "sys.get_directory: Argument 'dir' is not a string.")
+ if not exists(dir) then return nil, "Error getting file list of '" .. dir .. "': directory doesn't exist." end
+
+ local function collect(path, all_paths)
+ for item in get_directory(path) do
+
+ local item_path = make_path(path, item)
+ local _, last = item_path:find(dir .. path_separator(), 1, true)
+ local path_to_insert = item_path:sub(last + 1)
+
+ if is_file(item_path) then
+ table.insert(all_paths, path_to_insert)
+ elseif is_dir(item_path) and item ~= "." and item ~= ".." then
+ table.insert(all_paths, path_to_insert)
+ collect(item_path, all_paths)
+ end
+ end
+ end
+
+ local all_paths = {}
+ collect(dir, all_paths)
+
+ return all_paths
+end
+
+-- Return time of the last modification of 'file'.
+function last_modification_time(file)
+ assert(type(file) == "string", "sys.last_modification_time: Argument 'file' is not a string.")
+ return lfs.attributes(file, "modification")
+end
+
+-- Return the current time (in seconds since epoch).
+function current_time()
+ return os.time()
+end
+
+-- Change the current working directory and return 'true' and previous working
+-- directory on success and 'nil' and error message on error.
+function change_dir(dir_name)
+ assert(type(dir_name) == "string", "sys.change_dir: Argument 'dir_name' is not a string.")
+ local prev_dir = current_dir()
+ local ok, err = lfs.chdir(dir_name)
+ if ok then
+ return ok, prev_dir
+ else
+ return nil, err
+ end
+end
+
+-- Make a new directory, making also all of its parent directories that doesn't exist.
+function make_dir(dir_name)
+ assert(type(dir_name) == "string", "sys.make_dir: Argument 'dir_name' is not a string.")
+ if exists(dir_name) then
+ return true
+ else
+ local par_dir = parent_dir(dir_name)
+ if par_dir then
+ local ok, err = make_dir(par_dir)
+ if not ok then return nil, err end
+ end
+ return lfs.mkdir(dir_name)
+ end
+end
+
+-- Move file (or directory) to the destination directory
+function move_to(file_or_dir, dest_dir)
+ assert(type(file_or_dir) == "string", "sys.move_to: Argument 'file_or_dir' is not a string.")
+ assert(type(dest_dir) == "string", "sys.move_to: Argument 'dest_dir' is not a string.")
+ assert(is_dir(dest_dir), "sys.move_to: Destination '" .. dest_dir .."' is not a directory.")
+
+ -- Extract file/dir name from its path
+ local file_or_dir_name = extract_name(file_or_dir)
+
+ return os.rename(file_or_dir, make_path(dest_dir, file_or_dir_name))
+end
+
+-- rename file (or directory) to the new name.
+function rename(file, new_name)
+ assert(type(file) == "string", "sys.rename: Argument 'file' is not a string.")
+ assert(type(new_name) == "string", "sys.rename: Argument 'new_name' is not a string.")
+ assert(not exists(new_name), "sys.rename: desired filename already exists.")
+
+ return os.rename(file, new_name)
+end
+
+-- Copy 'source' to the destination directory 'dest_dir'.
+-- If 'source' is a directory, then recursive copying is used.
+-- For non-recursive copying of directories use the make_dir() function.
+function copy(source, dest_dir)
+ assert(type(source) == "string", "sys.copy: Argument 'file_or_dir' is not a string.")
+ assert(type(dest_dir) == "string", "sys.copy: Argument 'dest_dir' is not a string.")
+ assert(is_dir(dest_dir), "sys.copy: destination '" .. dest_dir .."' is not a directory.")
+
+ if cfg.arch == "Windows" then
+ if is_dir(source) then
+ make_dir(make_path(dest_dir, extract_name(source)))
+ return exec("xcopy /E /I /Y /Q " .. quote(source) .. " " .. quote(dest_dir .. "\\" .. extract_name(source)))
+ else
+ return exec("copy /Y " .. quote(source) .. " " .. quote(dest_dir))
+ end
+ else
+ if is_dir(source) then
+ return exec("cp -fRH " .. quote(source) .. " " .. quote(dest_dir))
+ else
+ return exec("cp -fH " .. quote(source) .. " " .. quote(dest_dir))
+ end
+ end
+end
+
+-- Delete the specified file or directory
+function delete(path)
+ assert(type(path) == "string", "sys.delete: Argument 'path' is not a string.")
+ assert(is_abs(path), "sys.delete: Argument 'path' is not an absolute path.")
+
+ if cfg.arch == "Windows" then
+ if not exists(path) then
+ return true
+ elseif is_file(path) then
+ return os.remove(path)
+ else
+ return exec("rd /S /Q " .. quote(path))
+ end
+ else
+ return exec("rm -rf " .. quote(path))
+ end
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/utils.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/utils.lua
new file mode 100644
index 0000000..392654c
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/dist/utils.lua
@@ -0,0 +1,151 @@
+-- System functions
+
+module ("dist.utils", package.seeall)
+
+local sys = require "dist.sys"
+
+-- Returns a deep copy of 'table' with reference to the same metadata table.
+-- Source: http://lua-users.org/wiki/CopyTable
+function deepcopy(object)
+ local lookup_table = {}
+ local function _copy(object)
+ if type(object) ~= "table" then
+ return object
+ elseif lookup_table[object] then
+ return lookup_table[object]
+ end
+ local new_table = {}
+ lookup_table[object] = new_table
+ for index, value in pairs(object) do
+ new_table[_copy(index)] = _copy(value)
+ end
+ return setmetatable(new_table, getmetatable(object))
+ end
+ return _copy(object)
+end
+
+-- Return deep copy of table 'array', containing only items for which 'predicate_fn' returns true.
+function filter(array, predicate_fn)
+ assert(type(array) == "table", "utils.filter: Argument 'array' is not a table.")
+ assert(type(predicate_fn) == "function", "utils.filter: Argument 'predicate_fn' is not a function.")
+ local filtered = {}
+ for _,v in pairs(array) do
+ if predicate_fn(v) == true then table.insert(filtered, deepcopy(v)) end
+ end
+ return filtered
+end
+
+-- Return deep copy of table 'array', sorted according to the 'compare_fn' function.
+function sort(array, compare_fn)
+ assert(type(array) == "table", "utils.sort: Argument 'array' is not a table.")
+ assert(type(compare_fn) == "function", "utils.sort: Argument 'compare_fn' is not a function.")
+ local sorted = deepcopy(array)
+ table.sort(sorted, compare_fn)
+ return sorted
+end
+
+-- Return whether the 'value' is in the table 'tbl'.
+function contains(tbl, value)
+ assert(type(tbl) == "table", "utils.contains: Argument 'tbl' is not a table.")
+ for _,v in pairs(tbl) do
+ if v == value then return true end
+ end
+ return false
+end
+
+-- Return single line string consisting of values in 'tbl' separated by comma.
+-- Used for printing the dependencies/provides/conflicts.
+function table_tostring(tbl, label)
+ assert(type(tbl) == "table", "utils.table_tostring: Argument 'tbl' is not a table.")
+ local str = ""
+ for k,v in pairs(tbl) do
+ if type(v) == "table" then
+ str = str .. table_tostring(v, k)
+ else
+ if label ~= nil then
+ str = str .. tostring(v) .. " [" .. tostring(label) .. "]" .. ", "
+ else
+ str = str .. tostring(v) .. ", "
+ end
+ end
+ end
+ return str
+end
+
+-- Return table made up from values of the string, separated by separator.
+function make_table(str, separator)
+ assert(type(str) == "string", "utils.make_table: Argument 'str' is not a string.")
+ assert(type(separator) == "string", "utils.make_table: Argument 'separator' is not a string.")
+
+ local tbl = {}
+ for val in str:gmatch("(.-)" .. separator) do
+ table.insert(tbl, val)
+ end
+ local last_val = str:gsub(".-" .. separator, "")
+ if last_val and last_val ~= "" then
+ table.insert(tbl, last_val)
+ end
+ return tbl
+end
+
+-- Return whether the 'cache_timeout' for 'file' has expired.
+function cache_timeout_expired(cache_timeout, file)
+ assert(type(cache_timeout) == "number", "utils.cache_timeout_expired: Argument 'cache_timeout' is not a number.")
+ assert(type(file) == "string", "utils.cache_timeout_expired: Argument 'file' is not a string.")
+ return sys.last_modification_time(file) + cache_timeout < sys.current_time()
+end
+
+-- Return the string 'str', with all magic (pattern) characters escaped.
+function escape_magic(str)
+ assert(type(str) == "string", "utils.escape: Argument 'str' is not a string.")
+ local escaped = str:gsub('[%-%.%+%[%]%(%)%^%%%?%*%^%$]','%%%1')
+ return escaped
+end
+
+-- Return the boolean representation of an 'arg'.
+function to_boolean(arg)
+ return not not arg
+end
+
+
+math.randomseed(os.time())
+
+-- Return pseudo-random number in range [0, 1], [1, n] or [n, m].
+function rand(...)
+ return math.random(...)
+end
+
+-- Perform check of system dependency, which isn't provided in the LuaDist
+-- installation itself and if it is missing, print instructions how
+-- to install it. The 'command' is used for testing, 'name' when printing
+-- information to the user.
+function system_dependency_available(name, command)
+ assert(type(name) == "string", "utils.system_dependency_available: Argument 'name' is not a string.")
+ assert(type(command) == "string", "utils.system_dependency_available: Argument 'command' is not a string.")
+
+ if not sys.exec(command) then
+ print("Error: command '" .. name .. "' not found on system. See installation instructions at\nhttps://github.com/LuaDist/Repository/wiki/Installation-of-System-Dependencies")
+ return false
+ end
+
+ return true
+end
+
+-- Obtain LuaDist location by checking available package locations
+function get_luadist_location()
+ local paths = {}
+ local path = package.path:gsub("([^;]+)", function(c) table.insert(paths, c) end)
+
+ for _, path in pairs(paths) do
+ if (sys.is_abs(path) and path:find("[/\\]lib[/\\]lua[/\\]%?.lua$")) then
+ -- Remove path to lib/lua
+ path = path:gsub("[/\\]lib[/\\]lua[/\\]%?.lua$", "")
+ -- Clean the path up a bit
+ path = path:gsub("[/\\]bin[/\\]%.[/\\]%.%.", "")
+ path = path:gsub("[/\\]bin[/\\]%.%.", "")
+ return path
+ end
+ end
+ return nil
+end
+
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/git.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/git.lua
new file mode 100644
index 0000000..96b4058
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/git.lua
@@ -0,0 +1,5 @@
+require 'git.util'
+require 'git.objects'
+require 'git.pack'
+require 'git.repo'
+require 'git.protocol'
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/git/objects.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/git/objects.lua
new file mode 100644
index 0000000..85de9b0
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/git/objects.lua
@@ -0,0 +1,121 @@
+local util = require 'git.util'
+
+local assert, next, io, print, os, type, string, pairs, tostring =
+ assert, next, io, print, os, type, string, pairs, tostring
+local join_path = git.util.join_path
+
+local require = require
+
+local isPosix = package.config:sub(1,1) == '/' -- wild guess
+
+module(...)
+
+Commit = {}
+Commit.__index = Commit
+
+function Commit:tree()
+ return self.repo:tree(self.tree_sha)
+end
+
+function Commit:checkout(path)
+ assert(path, 'path argument missing')
+ self:tree():checkoutTo(path)
+end
+
+
+Tree = {}
+Tree.__index = function (t,k)
+ if Tree[k] then return Tree[k] end
+ return t:entry(k)
+end
+
+function Tree:entries()
+ return function(t, n)
+ local n, entry = next(t, n)
+ if entry then
+ local object
+ if entry.type == 'tree' then
+ object = self.repo:tree(entry.id)
+ elseif entry.type == 'blob' then
+ object = self.repo:blob(entry.id)
+ object.mode = entry.mode
+ elseif entry.type == 'commit' then
+ -- this is possibly a commit in a submodule,
+ -- do not retrieve it from current repo
+ object = entry
+ else
+ error('Unknown entry type: ' .. entry.type)
+ end
+ return n, entry.type, object
+ end
+ end, self._entries
+end
+
+function Tree:entry(n)
+ local e = self._entries[n]
+ if not e then return end
+ if e.type == 'tree' then
+ return self.repo:tree(e.id)
+ elseif e.type == 'commit' then
+ return self.repo:commit(e.id)
+ elseif e.type == 'blob' then
+ return self.repo:blob(e.id)
+ else
+ error('Unknown entry type: ' .. e.type)
+ end
+end
+
+function Tree:walk(func, path)
+ path = path or '.'
+ assert(type(func) == "function", "argument is not a function")
+ local function walk(tree, path)
+ for name, type, entry in tree:entries() do
+ local entry_path = join_path(path, name)
+ func(entry, entry_path, type)
+
+ if type == "tree" then
+ walk(entry, entry_path)
+ end
+ end
+ end
+ walk(self, path)
+end
+
+function Tree:checkoutTo(path)
+ util.make_dir(path)
+ self:walk(function (entry, entry_path, type)
+ if type == 'tree' then
+ util.make_dir(entry_path)
+ elseif type == 'blob' then
+ local out = assert(io.open(entry_path, 'wb'))
+ out:write(entry:content())
+ out:close()
+ if isPosix then
+ local mode = entry.mode:sub(-3,-1) -- fixme: is this ok?
+ local cmd = 'chmod '..mode..' "'..entry_path..'"'
+ os.execute(cmd)
+ end
+ elseif type == 'commit' then
+ -- this is a submodule referencing a commit,
+ -- make a directory for it
+ util.make_dir(entry_path)
+ else
+ error('Unknown entry type: ', type)
+ end
+ end, path)
+end
+
+Blob = {}
+Blob.__index = Blob
+
+function Blob:content()
+ if self.stored then
+ local f = self.repo:raw_object(self.id)
+ local ret = f:read('*a') or ""
+ f:close()
+ return ret
+ else
+ return self.data
+ end
+end
+
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/git/pack.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/git/pack.lua
new file mode 100644
index 0000000..f1597c3
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/git/pack.lua
@@ -0,0 +1,316 @@
+local io = io
+local core = require 'git.core'
+
+local assert, pcall, print, select, setmetatable, string, type, unpack =
+ assert, pcall, print, select, setmetatable, string, type, unpack
+
+local ord = string.byte
+local fmt = string.format
+local concat, insert = table.concat, table.insert
+
+local band = core.band
+local rshift, lshift = core.rshift, core.lshift
+
+local to_hex = git.util.to_hex
+local from_hex = git.util.from_hex
+local object_sha = git.util.object_sha
+local binary_sha = git.util.binary_sha
+local readable_sha = git.util.readable_sha
+local tmpfile = git.util.tmpfile
+local reader = git.util.reader
+
+module(...)
+
+-- read git/Documentation/technical/pack-format.txt for some inspiration
+
+-- 1 = commit, 2 = tree ...
+local types = {'commit', 'tree', 'blob', 'tag', '???', 'ofs_delta', 'ref_delta'}
+
+-- read a 4 byte unsigned integer stored in network order
+local function read_int(f)
+ local s = f:read(4)
+ local a,b,c,d = s:byte(1,4)
+ return a*256^3 + b*256^2 + c*256 + d
+end
+
+-- read in the type and file length
+local function read_object_header(f)
+ local b = ord(f:read(1))
+ local type = band(rshift(b, 4), 0x7)
+ local len = band(b, 0xF)
+ local ofs = 0
+ while band(b, 0x80) ~= 0 do
+ b = ord(f:read(1))
+ len = len + lshift(band(b, 0x7F), ofs * 7 + 4)
+ ofs = ofs + 1
+ end
+ return len, type
+end
+
+-- reads in the delta header and returns the offset where original data is stored
+local function read_delta_header(f)
+ local b = ord(f:read(1))
+ local offset = band(b, 0x7F)
+ while band(b, 0x80) ~= 0 do
+ offset = offset + 1
+ b = ord(f:read(1))
+ offset = lshift(offset, 7) + band(b, 0x7F)
+ end
+ return offset
+end
+
+-- read just enough of file `f` to uncompress `size` bytes
+local function uncompress_by_len(f, size)
+ local z = core.inflate()
+ local chunks = {}
+ local CHUNK_SIZE = 1024
+ local curr_pos = f:seek()
+ local inflated, eof, total
+ -- read until end of zlib-compresed stream
+ while not eof do
+ local data = f:read(CHUNK_SIZE)
+ inflated, eof, total = z(data)
+ insert(chunks, inflated)
+ end
+ -- repair the current position in stream
+ f:seek('set', curr_pos + total)
+ return concat(chunks)
+end
+
+-- uncompress the object from the current location in `f`
+local function unpack_object(f, len, type)
+ local data = uncompress_by_len(f, len)
+ return data, len, type
+end
+
+-- returns a size value encoded in delta data
+local function delta_size(f)
+ local size = 0
+ local i = 0
+ repeat
+ local b = ord(f:read(1))
+ size = size + lshift(band(b, 0x7F), i)
+ i = i + 7
+ until band(b, 0x80) == 0
+ return size
+end
+
+-- returns a patched object from string `base` according to `delta` data
+local function patch_object(base, delta, base_type)
+ -- insert delta codes into temporary file
+ local df = reader(delta)
+
+ -- retrieve original and result size (for checks)
+ local orig_size = delta_size(df)
+ assert(#base == orig_size, fmt('#base(%d) ~= orig_size(%d)', #base, orig_size))
+
+ local result_size = delta_size(df)
+ local size = result_size
+
+ local result = {}
+
+ -- process the delta codes
+ local cmd = df:read(1)
+ while cmd do
+ cmd = ord(cmd)
+ if cmd == 0 then
+ error('unexpected delta code 0')
+ elseif band(cmd, 0x80) ~= 0 then -- copy a selected part of base data
+ local cp_off, cp_size = 0, 0
+ -- retrieve offset
+ if band(cmd, 0x01) ~= 0 then cp_off = ord(df:read(1)) end
+ if band(cmd, 0x02) ~= 0 then cp_off = cp_off + ord(df:read(1))*256 end
+ if band(cmd, 0x04) ~= 0 then cp_off = cp_off + ord(df:read(1))*256^2 end
+ if band(cmd, 0x08) ~= 0 then cp_off = cp_off + ord(df:read(1))*256^3 end
+ -- retrieve size
+ if band(cmd, 0x10) ~= 0 then cp_size = ord(df:read(1)) end
+ if band(cmd, 0x20) ~= 0 then cp_size = cp_size + ord(df:read(1))*256 end
+ if band(cmd, 0x40) ~= 0 then cp_size = cp_size + ord(df:read(1))*256^2 end
+ if cp_size == 0 then cp_size = 0x10000 end
+ if cp_off + cp_size > #base or cp_size > size then break end
+ -- get the data and append it to result
+ local data = base:sub(cp_off + 1, cp_off + cp_size)
+ insert(result, data)
+ size = size - cp_size
+ else -- insert new data
+ if cmd > size then break end
+ local data = df:read(cmd)
+ insert(result, data)
+ size = size - cmd
+ end
+ cmd = df:read(1)
+ end
+
+ df:close()
+
+ result = concat(result)
+ assert(#result == result_size, fmt('#result(%d) ~= result_size(%d)', #result, result_size))
+ return result, result_size, base_type
+end
+
+Pack = {}
+Pack.__index = Pack
+
+-- read an object from the current location in pack, or from a specific `offset`
+-- if specified
+function Pack:read_object(offset, ignore_data)
+ local f = self.pack_file
+ if offset then
+ f:seek('set', offset)
+ end
+ local curr_pos = f:seek()
+
+ local len, type = read_object_header(f)
+ if type < 5 then -- commit, tree, blob, tag
+ return unpack_object(f, len, type)
+ elseif type == 6 then -- ofs_delta
+ local offset = read_delta_header(f)
+ local delta_data = uncompress_by_len(f, len)
+ if not ignore_data then
+ -- the offset is negative from the current location
+ local base, base_len, base_type = self:read_object(curr_pos - offset)
+ return patch_object(base, delta_data, base_type)
+ end
+ elseif type == 7 then -- ref_delta
+ local sha = f:read(20)
+ local delta_data = uncompress_by_len(f, len)
+ if not ignore_data then
+ -- lookup the object in the pack by sha
+ -- FIXME: maybe lookup in repo/other packs
+ local base_offset = self.index[binary_sha(sha)]
+ local base, base_len, base_type = self:read_object(base_offset)
+ return patch_object(base, delta_data, base_type)
+ end
+ else
+ error('unknown object type: '..type)
+ end
+end
+
+-- returns true if this pack contains the given object
+function Pack:has_object(sha)
+ return self.index[binary_sha(sha)] ~= nil
+end
+
+-- if the object name `sha` exists in the pack, returns a temporary file with the
+-- object content, length and type, otherwise returns nil
+function Pack:get_object(sha)
+ local offset = self.index[binary_sha(sha)]
+ if not offset then
+ print('!!! Failed to find object', readable_sha(sha))
+ end
+
+ local data, len, type = self:read_object(offset)
+ print(readable_sha(sha), len, type, data)
+ local f = tmpfile()
+ f:write(data)
+ f:seek('set', 0)
+
+ return f, len, types[type]
+end
+
+function Pack:unpack(repo)
+ for i=1, self.nobjects do
+ local offset = self.offsets[i]
+ local data, len, type = self:read_object(offset)
+ repo:store_object(data, len, types[type])
+ end
+end
+
+-- parses the index
+function Pack:parse_index(index_file)
+ local f = index_file
+
+ local head = f:read(4)
+ assert(head == '\255tOc', "Incorrect header: " .. head)
+ local version = read_int(f)
+ assert(version == 2, "Incorrect version: " .. version)
+
+ -- first the fanout table (how many objects are in the index, whose
+ -- first byte is below or equal to i)
+ local fanout = {}
+ for i=0, 255 do
+ local nobjs = read_int(f)
+ fanout[i] = nobjs
+ end
+
+ -- the last element in fanout is the number of all objects in index
+ local count = fanout[255]
+
+ -- then come the sorted object names (=sha hash)
+ local tmp = {}
+ for i=1,count do
+ local sha = f:read(20)
+ tmp[i] = { sha = sha }
+ end
+
+ -- then the CRCs (assume ok, skip them)
+ for i=1, count do
+ local crc = f:read(4)
+ end
+
+ -- then come the offsets - read just the 32bit ones, does not handle packs > 2G
+ for i=1, count do
+ local offset = read_int(f)
+ tmp[i].offset = offset
+ end
+
+ -- construct the lookup table
+ local lookup = {}
+ for i=1, count do
+ lookup[tmp[i].sha] = tmp[i].offset
+ end
+ self.index = lookup
+end
+
+-- constructs the index/offsets if the index file is missing
+function Pack:construct_index(path)
+ local index = {}
+ for i=1, self.nobjects do
+ local offset = self.offsets[i]
+ local data, len, type = self:read_object(offset)
+ local sha = object_sha(data, len, types[type])
+ index[binary_sha(sha)] = offset
+ end
+ self.index = index
+end
+
+function Pack:close()
+ self.pack_file:close()
+end
+
+function Pack.open(path)
+ local fp = assert(io.open(path, 'rb')) -- stays open
+
+ -- read the pack header
+ local head = fp:read(4)
+ assert(head == 'PACK', "Incorrect header: " .. head)
+ local version = read_int(fp)
+ assert(version == 2, "Incorrect version: " .. version)
+ local nobj = read_int(fp)
+
+ local pack = setmetatable({
+ offsets = {},
+ nobjects = nobj,
+ pack_file = fp,
+ }, Pack)
+
+ -- fill the offsets by traversing through the pack
+ for i=1,nobj do
+ pack.offsets[i] = fp:seek()
+ -- ignore the object data, we only need the offset in the pack
+ pack:read_object(nil, true)
+ end
+
+ -- read the index
+ local fi = io.open((path:gsub('%.pack$', '.idx')), 'rb')
+ if fi then
+ pack:parse_index(fi)
+ fi:close()
+ else
+ pack:construct_index(path)
+ end
+
+ return pack
+end
+
+return Pack \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/git/protocol.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/git/protocol.lua
new file mode 100644
index 0000000..7bad2e2
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/git/protocol.lua
@@ -0,0 +1,188 @@
+local socket = require 'socket'
+local urllib = require 'socket.url'
+local lfs = require 'lfs'
+
+local Repo = git.repo.Repo
+local Pack = git.pack.Pack
+local join_path = git.util.join_path
+local parent_dir = git.util.parent_dir
+local make_dir = git.util.make_dir
+local correct_separators = git.util.correct_separators
+
+local assert, error, getmetatable, io, os, pairs, print, require, string, tonumber =
+ assert, error, getmetatable, io, os, pairs, print, require, string, tonumber
+
+local _VERSION, newproxy = _VERSION, newproxy
+
+module(...)
+
+local GIT_PORT = 9418
+
+local function git_connect(host)
+ local sock = assert(socket.connect(host, GIT_PORT))
+ local gitsocket = {}
+
+ function gitsocket:send(data)
+ if not data then -- flush packet
+ sock:send('0000')
+ else
+ local len = #data + 4
+ len = string.format("%04x", len)
+ assert(sock:send(len .. data))
+ end
+ end
+
+ function gitsocket:receive()
+ local len = assert(sock:receive(4))
+ len = tonumber(len, 16)
+ if len == 0 then return end -- flush packet
+ local data = assert(sock:receive(len - 4))
+ return data
+ end
+
+ function gitsocket:close()
+ sock:close()
+ end
+
+ return gitsocket
+end
+
+local function addFinalizer(object, finalizer)
+ if _VERSION <= "Lua 5.1" then
+ local gc = newproxy(true)
+ getmetatable(gc).__gc = finalizer
+ object.__gc = gc
+ else
+ local mt = getmetatable(object)
+ if mt then mt.__gc = finalizer
+ else setmetatable(object, {__gc = finalizer})
+ end
+ end
+end
+
+local function git_fetch(host, path, repo, head, supress_progress)
+ local s = git_connect(host)
+ s:send('git-upload-pack '..path..'\0host='..host..'\0')
+
+ local refs, refsbyname = {}, {}
+ repeat
+ local ref = s:receive()
+ if ref then
+ local sha, name = ref:sub(1,40), ref:sub(42, -2)
+ refs[sha] = name
+ refsbyname[name] = sha
+ end
+ until not ref
+
+ local wantedSha
+ local headsha = head and refsbyname[head]
+
+ for sha, ref in pairs(refs) do
+ -- we implicitly want this ref
+ local wantObject = true
+ -- unless we ask for a specific head
+ if headsha then
+ if sha ~= headsha then
+ wantObject = false
+ else
+ wantedSha = sha
+ end
+ end
+ -- or we already have it
+ if repo and repo:has_object(sha) then
+ wantObject = false
+ end
+ if wantObject then
+ s:send('want '..sha..' multi_ack_detailed side-band-64k ofs-delta\n')
+ end
+ end
+
+ if head and not wantedSha then
+ error("Server does not have "..head)
+ end
+
+ s:send('deepen 1')
+ s:send()
+ while s:receive() do end
+ s:send('done\n')
+
+ assert(s:receive() == "NAK\n")
+
+ local packname = os.tmpname() .. '.pack'
+ local packfile = assert(io.open(packname, 'wb'))
+ repeat
+ local got = s:receive()
+ if got then
+ -- get sideband channel, 1=pack data, 2=progress, 3=error
+ local cmd = string.byte(got:sub(1,1))
+ local data = got:sub(2)
+ if cmd == 1 then
+ packfile:write(data)
+ elseif cmd == 2 then
+ if not supress_progress then io.write(data) end
+ else
+ error(data)
+ end
+ end
+ until not got
+
+ packfile:close()
+ s:close()
+
+ local pack = Pack.open(packname)
+ if repo then
+ pack:unpack(repo)
+ repo.isShallow = true
+ if wantedSha then
+ local headfile = correct_separators(join_path(repo.dir, head))
+ assert(make_dir(parent_dir(headfile)))
+ local f = assert(io.open(headfile, 'wb'))
+ f:write(wantedSha)
+ f:close()
+ end
+ end
+
+ addFinalizer(pack, function()
+ os.remove(packname)
+ end)
+
+ return pack, wantedSha
+end
+
+function fetch(url, repo, head, supress_progress)
+ if repo then assert(getmetatable(repo) == Repo, "arg #2 is not a repository") end
+ url = urllib.parse(url)
+ if url.scheme == 'git' then
+ local pack, sha = git_fetch(url.host, url.path, repo, head, supress_progress)
+ return pack, sha
+ else
+ error('unsupported scheme: '..url.scheme)
+ end
+end
+
+function remotes(url)
+ -- TODO: refactor common code
+ url = assert(urllib.parse(url))
+
+ if url.scheme ~= 'git' then
+ error('unsupported scheme: '..url.scheme)
+ end
+
+ local host, path = url.host, url.path
+
+ local s = git_connect(host)
+ s:send('git-upload-pack '..path..'\0host='..host..'\0')
+
+ local remote = {}
+ repeat
+ local ref = s:receive()
+ if ref then
+ local sha, name = ref:sub(1,40), ref:sub(42, -2)
+ remote[name] = sha
+ end
+ until not ref
+
+ s:close()
+
+ return remote
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/git/repo.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/git/repo.lua
new file mode 100644
index 0000000..07b7207
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/git/repo.lua
@@ -0,0 +1,283 @@
+local util = require 'git.util'
+local objects = require 'git.objects'
+local core = require 'git.core'
+local pack = require 'git.pack'
+
+local join_path = util.join_path
+local decompressed = util.decompressed
+local read_until_nul = util.read_until_nul
+local to_hex = util.to_hex
+local object_sha = util.object_sha
+local readable_sha = util.readable_sha
+
+local deflate = core.deflate
+
+local lfs = require 'lfs'
+local assert, error, io, ipairs, print, os, setmetatable, string, table =
+ assert, error, io, ipairs, print, os, setmetatable, string, table
+
+module(...)
+
+Repo = {}
+Repo.__index = Repo
+
+-- retrieves an object identified by `sha` from the repository or its packs
+-- returns a file-like object (supports 'read', 'seek' and 'close'), the size
+-- of the object and its type
+-- errors when the object does not exist
+function Repo:raw_object(sha)
+ -- first, look in 'objects' directory
+ -- first byte of sha is the directory, the rest is name of object file
+ sha = readable_sha(sha)
+ local dir = sha:sub(1,2)
+ local file = sha:sub(3)
+ local path = join_path(self.dir, 'objects', dir, file)
+
+ if not lfs.attributes(path, 'size') then
+ -- then, try to look in packs
+ for _, pack in ipairs(self.packs) do
+ local obj, len, typ = pack:get_object(sha)
+ if obj then
+ return obj, len, typ
+ end
+ end
+ error('Object not found in object neither in packs: '..sha)
+ else
+ -- the objects are zlib compressed
+ local f = decompressed(path)
+
+ -- retrieve the type and length - <type> SP <len> \0 <data...>
+ local content = read_until_nul(f)
+ local typ, len = content:match('(%w+) (%d+)')
+
+ return f, len, typ
+ end
+end
+
+--- Store a new object into the repository in `objects` directory.
+-- @param data A string containing the contents of the new file.
+-- @param len The length of the data.
+-- @param type One of 'commit', 'blob', 'tree', 'tag'
+function Repo:store_object(data, len, type)
+ local sha = readable_sha(object_sha(data, len, type))
+ local dir = sha:sub(1,2)
+ local file = sha:sub(3)
+ util.make_dir(join_path(self.dir, 'objects', dir))
+ local path = join_path(self.dir, 'objects', dir, file)
+ local fo = assert(io.open(path, 'wb'))
+ local header = type .. ' ' .. len .. '\0'
+ local compressed = deflate()(header .. data, "finish")
+ fo:write(compressed)
+ fo:close()
+end
+
+local function resolvetag(f)
+ local tag
+ local line = f:read()
+ while line do
+ tag = line:match('^object (%x+)$')
+ if tag then break end
+ line = f:read()
+ end
+ f:close()
+ return tag
+end
+
+function Repo:commit(sha)
+ local f, len, typ = self:raw_object(sha)
+ while typ == 'tag' do
+ sha = assert(resolvetag(f), 'could not parse tag for '..readable_sha(sha))
+ f, len, typ = self:raw_object(sha)
+ end
+ assert(typ == 'commit', string.format('%s (%s) is not a commit', sha, typ))
+
+ local commit = { id = sha, repo = self, stored = true, parents = {} }
+ repeat
+ local line = f:read()
+ if not line then break end
+
+ local space = line:find(' ') or 0
+ local word = line:sub(1, space - 1)
+ local afterSpace = line:sub(space + 1)
+
+ if word == 'tree' then
+ commit.tree_sha = afterSpace
+ elseif word == 'parent' then
+ table.insert(commit.parents, afterSpace)
+ elseif word == 'author' then
+ commit.author = afterSpace
+ elseif word == 'committer' then
+ commit.committer = afterSpace
+ elseif commit.message then
+ table.insert(commit.message, line)
+ elseif line == '' then
+ commit.message = {}
+ end
+ until false -- ends with break
+ f:close()
+
+ commit.message = table.concat(commit.message, '\n')
+
+ return setmetatable(commit, objects.Commit)
+end
+
+function Repo:tree(sha)
+ local f, len, typ = self:raw_object(sha)
+ assert(typ == 'tree', string.format('%s (%s) is not a tree', sha, typ))
+
+ local tree = { id = sha, repo = self, stored = true, _entries = {} }
+
+ while true do
+ local info = read_until_nul(f)
+ if not info then break end
+ local entry_sha = to_hex(f:read(20))
+ local mode, name = info:match('^(%d+)%s(.+)$')
+ local entry_type = 'blob'
+ if mode == '40000' then
+ entry_type = 'tree'
+ elseif mode == '160000' then
+ entry_type = 'commit'
+ end
+ tree._entries[name] = { mode = mode, id = entry_sha, type = entry_type }
+ end
+
+ f:close()
+
+ return setmetatable(tree, objects.Tree)
+end
+
+-- retrieves a Blob
+function Repo:blob(sha)
+ local f, len, typ = self:raw_object(sha)
+ f:close() -- can be reopened in Blob:content()
+
+ assert(typ == 'blob', string.format('%s (%s) is not a blob', sha, typ))
+ return setmetatable({
+ id = sha,
+ len = len,
+ repo = self,
+ stored = true }, objects.Blob)
+end
+
+function Repo:head()
+ return self:commit(self.refs.HEAD)
+end
+
+function Repo:has_object(sha)
+ local dir = sha:sub(1,2)
+ local file = sha:sub(3)
+ local path = join_path(self.dir, 'objects', dir, file)
+
+ if lfs.attributes(path, 'size') then return true end
+
+ for _, pack in ipairs(self.packs) do
+ local has = pack:has_object(sha)
+ if has then return true end
+ end
+
+ return false
+end
+
+function Repo:checkout(sha, target)
+ if not target then target = self.workDir end
+ assert(target, 'target directory not specified')
+
+ local commit = self:commit(sha)
+ commit:checkout(target)
+
+ -- if the repo was checked out using the deepen command (one level of history only)
+ -- mark the commit's parent as shalow, that is it has no history
+ if self.isShallow then
+ -- if it has a parent, mark it shallow
+ if commit.parents[1] then
+ local f = assert(io.open(self.dir .. '/shallow', "w"))
+ f:write(commit.parents[1], '\n')
+ f:close()
+ end
+ end
+end
+
+function Repo:close()
+ for _, pack in ipairs(self.packs) do
+ pack:close()
+ end
+end
+
+function create(dir)
+ if not dir:match('%.git.?$') then
+ dir = join_path(dir, '.git')
+ end
+
+ util.make_dir(dir)
+ util.make_dir(dir .. '/branches')
+ util.make_dir(dir .. '/hooks')
+ util.make_dir(dir .. '/info')
+ util.make_dir(dir .. '/objects/info')
+ util.make_dir(dir .. '/objects/pack')
+ util.make_dir(dir .. '/refs/heads')
+ util.make_dir(dir .. '/refs/tags')
+ util.make_dir(dir .. '/refs/remotes')
+
+ do
+ local f = assert(io.open(dir .. "/HEAD", "w"))
+ f:write("ref: refs/heads/master\n")
+ f:close()
+ end
+
+ local refs = {}
+ local packs = {}
+
+ return setmetatable({
+ dir = dir,
+ refs = refs,
+ packs = packs,
+ }, Repo)
+end
+
+-- opens a repository located in working directory `dir` or directly a .git repo
+function open(dir)
+ local workDir = dir
+ if not dir:match('%.git.?$') then
+ dir = join_path(dir, '.git')
+ else
+ workDir = nil -- no working directory, working directly with repo
+ end
+
+ local refs = {}
+ for _,d in ipairs{'refs/heads', 'refs/tags'} do
+ for fn in lfs.dir(join_path(dir, d)) do
+ if fn ~= '.' and fn ~= '..' then
+ local path = join_path(dir, d, fn)
+ local f = assert(io.open(path), 'rb')
+ local ref = f:read()
+ refs[join_path(d, fn)] = ref
+ f:close()
+ end
+ end
+ end
+
+ local packs = {}
+ for fn in lfs.dir(join_path(dir, 'objects/pack')) do
+ if fn:match('%.pack$') then
+ local path = join_path(dir, 'objects/pack', fn)
+ table.insert(packs, pack.open(path))
+ end
+ end
+
+ local head = io.open(join_path(dir, 'HEAD'), 'rb')
+ if head then
+ local src = head:read()
+ local HEAD = src:match('ref: (.-)$')
+ refs.HEAD = refs[HEAD]
+ head:close()
+ end
+
+ return setmetatable({
+ dir = dir,
+ workDir = workDir,
+ refs = refs,
+ packs = packs,
+ }, Repo)
+end
+
+return Repo
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/git/util.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/git/util.lua
new file mode 100644
index 0000000..4b51c80
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/git/util.lua
@@ -0,0 +1,233 @@
+local lfs = require 'lfs'
+local core = require 'git.core'
+local deflate = core.deflate
+local inflate = core.inflate
+local sha = core.sha
+
+module(..., package.seeall)
+
+local BUF_SIZE = 4096
+
+local dirsep = package.config:sub(1,1)
+
+-- replaces '/' path separators on Windows with the correct ones ('\\')
+function correct_separators(path)
+ return path:gsub('/', dirsep)
+end
+
+-- joins several path components into a single path, uses system-specific directory
+-- separator, cleans input, i.e. join_path('a/', 'b', 'c/') => 'a/b/c'
+function join_path(...)
+ local n = select('#', ...)
+ local args = {...}
+ for i=1,n do
+ args[i] = args[i]:gsub(dirsep..'?$', '')
+ end
+ return table.concat(args, dirsep, 1, n)
+end
+
+-- Return the path with the all occurences of '/.' or '\.' (representing
+-- the current directory) removed.
+local function remove_curr_dir_dots(path)
+ while path:match(dirsep .. "%." .. dirsep) do -- match("/%./")
+ path = path:gsub(dirsep .. "%." .. dirsep, dirsep) -- gsub("/%./", "/")
+ end
+ return path:gsub(dirsep .. "%.$", "") -- gsub("/%.$", "")
+end
+
+-- Return whether the path is a root.
+local function is_root(path)
+ return path:find("^[%u%U.]?:?[/\\]$")
+end
+
+-- Return the path with the unnecessary trailing separator removed.
+local function remove_trailing(path)
+ if path:sub(-1) == dirsep and not is_root(path) then path = path:sub(1,-2) end
+ return path
+end
+
+-- Extract file or directory name from its path.
+local function extract_name(path)
+ if is_root(path) then return path end
+
+ path = remove_trailing(path)
+ path = path:gsub("^.*" .. dirsep, "")
+ return path
+end
+
+-- Return the string 'str', with all magic (pattern) characters escaped.
+local function escape_magic(str)
+ local escaped = str:gsub('[%-%.%+%[%]%(%)%^%%%?%*%^%$]','%%%1')
+ return escaped
+end
+
+-- Return parent directory of the 'path' or nil if there's no parent directory.
+-- If 'path' is a path to file, return the directory the file is in.
+function parent_dir(path)
+ path = remove_curr_dir_dots(path)
+ path = remove_trailing(path)
+
+ local dir = path:gsub(escape_magic(extract_name(path)) .. "$", "")
+ if dir == "" then
+ return nil
+ else
+ return remove_trailing(dir)
+ end
+end
+
+-- Make a new directory, making also all of its parent directories that doesn't exist.
+function make_dir(path)
+ if lfs.attributes(path) then
+ return true
+ else
+ local par_dir = parent_dir(path)
+ if par_dir then
+ assert(make_dir(par_dir))
+ end
+ return lfs.mkdir(path)
+ end
+end
+
+
+-- Reader class
+-- adapted from Penlight: https://raw.github.com/stevedonovan/Penlight/master/lua/pl/stringio.lua
+
+local SR = {}
+SR.__index = SR
+
+function SR:_read(fmt)
+ local i,str = self.i,self.str
+ local sz = #str
+ if i > sz then return nil, "past end of file" end
+ local res
+ if fmt == '*l' or fmt == '*L' then
+ local idx = str:find('\n',i) or (sz+1)
+ res = str:sub(i,fmt == '*l' and idx-1 or idx)
+ self.i = idx+1
+ elseif fmt == '*a' then
+ res = str:sub(i)
+ self.i = sz+1
+ elseif fmt == '*n' then
+ local _,i2,i2,idx
+ _,idx = str:find ('%s*%d+',i)
+ _,i2 = str:find ('^%.%d+',idx+1)
+ if i2 then idx = i2 end
+ _,i2 = str:find ('^[eE][%+%-]*%d+',idx+1)
+ if i2 then idx = i2 end
+ local val = str:sub(i,idx)
+ res = tonumber(val)
+ self.i = idx+1
+ elseif type(fmt) == 'number' then
+ res = str:sub(i,i+fmt-1)
+ self.i = i + fmt
+ else
+ error("bad read format",2)
+ end
+ return res
+ end
+
+function SR:read(...)
+ if select('#',...) == 0 then
+ return self:_read('*l')
+ else
+ local res, fmts = {},{...}
+ for i = 1, #fmts do
+ res[i] = self:_read(fmts[i])
+ end
+ return unpack(res)
+ end
+ end
+
+function SR:seek(whence,offset)
+ local base
+ whence = whence or 'cur'
+ offset = offset or 0
+ if whence == 'set' then
+ base = 1
+ elseif whence == 'cur' then
+ base = self.i
+ elseif whence == 'end' then
+ base = #self.str
+ end
+ self.i = base + offset
+ return self.i
+end
+
+function SR:close() -- for compatibility only
+end
+
+--- create a file-like object for reading from a given string.
+-- @param s The input string.
+function reader(s)
+ return setmetatable({str=s,i=1},SR)
+end
+
+
+-- decompress the file and return a handle to temporary uncompressed file
+function decompressed(path)
+ local fi = assert(io.open(path, 'rb'))
+ local result = {}
+
+ local z = inflate()
+ repeat
+ local str = fi:read(BUF_SIZE)
+ local data = z(str)
+ if type(data) == 'string' then
+ result[#result+1] = data
+ else print('!!!', data) end
+ until not str
+ fi:close()
+
+ return reader(table.concat(result))
+end
+
+-- reads until the byte \0, consumes it and returns the string up to the \0
+function read_until_nul(f)
+ local t = {}
+ repeat
+ local c = f:read(1)
+ if c and c ~= '\0' then t[#t+1] = c end
+ until not c or c == '\0'
+ if #t > 0 then
+ return table.concat(t)
+ else
+ return nil
+ end
+end
+
+-- converts a string to lowercase hex
+function to_hex(s)
+ return (s:gsub('.', function(c)
+ return string.format('%02x', string.byte(c))
+ end))
+end
+
+-- converts a string from hex to binary
+function from_hex(s)
+ return (s:gsub('..', function(cc)
+ return string.char(tonumber(cc, 16))
+ end))
+end
+
+-- always returns readable (hex) hash
+function readable_sha(s)
+ if #s ~= 40 then return to_hex(s)
+ else return s end
+end
+
+-- always returns binary hash
+function binary_sha(s)
+ if #s ~= 20 then return from_hex(s)
+ else return s end
+end
+
+function object_sha(data, len, type)
+ local header = type .. ' ' .. len .. '\0'
+ local res = sha(header .. data)
+ return res
+end
+
+function deflate(data)
+ local c = deflate()
+ return c(data, "finish")
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/ltn12.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/ltn12.lua
new file mode 100644
index 0000000..5b10f56
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/ltn12.lua
@@ -0,0 +1,298 @@
+-----------------------------------------------------------------------------
+-- LTN12 - Filters, sources, sinks and pumps.
+-- LuaSocket toolkit.
+-- Author: Diego Nehab
+-----------------------------------------------------------------------------
+
+-----------------------------------------------------------------------------
+-- Declare module
+-----------------------------------------------------------------------------
+local string = require("string")
+local table = require("table")
+local base = _G
+local _M = {}
+if module then -- heuristic for exporting a global package table
+ ltn12 = _M
+end
+local filter,source,sink,pump = {},{},{},{}
+
+_M.filter = filter
+_M.source = source
+_M.sink = sink
+_M.pump = pump
+
+-- 2048 seems to be better in windows...
+_M.BLOCKSIZE = 2048
+_M._VERSION = "LTN12 1.0.3"
+
+-----------------------------------------------------------------------------
+-- Filter stuff
+-----------------------------------------------------------------------------
+-- returns a high level filter that cycles a low-level filter
+function filter.cycle(low, ctx, extra)
+ base.assert(low)
+ return function(chunk)
+ local ret
+ ret, ctx = low(ctx, chunk, extra)
+ return ret
+ end
+end
+
+-- chains a bunch of filters together
+-- (thanks to Wim Couwenberg)
+function filter.chain(...)
+ local arg = {...}
+ local n = select('#',...)
+ local top, index = 1, 1
+ local retry = ""
+ return function(chunk)
+ retry = chunk and retry
+ while true do
+ if index == top then
+ chunk = arg[index](chunk)
+ if chunk == "" or top == n then return chunk
+ elseif chunk then index = index + 1
+ else
+ top = top+1
+ index = top
+ end
+ else
+ chunk = arg[index](chunk or "")
+ if chunk == "" then
+ index = index - 1
+ chunk = retry
+ elseif chunk then
+ if index == n then return chunk
+ else index = index + 1 end
+ else base.error("filter returned inappropriate nil") end
+ end
+ end
+ end
+end
+
+-----------------------------------------------------------------------------
+-- Source stuff
+-----------------------------------------------------------------------------
+-- create an empty source
+local function empty()
+ return nil
+end
+
+function source.empty()
+ return empty
+end
+
+-- returns a source that just outputs an error
+function source.error(err)
+ return function()
+ return nil, err
+ end
+end
+
+-- creates a file source
+function source.file(handle, io_err)
+ if handle then
+ return function()
+ local chunk = handle:read(_M.BLOCKSIZE)
+ if not chunk then handle:close() end
+ return chunk
+ end
+ else return source.error(io_err or "unable to open file") end
+end
+
+-- turns a fancy source into a simple source
+function source.simplify(src)
+ base.assert(src)
+ return function()
+ local chunk, err_or_new = src()
+ src = err_or_new or src
+ if not chunk then return nil, err_or_new
+ else return chunk end
+ end
+end
+
+-- creates string source
+function source.string(s)
+ if s then
+ local i = 1
+ return function()
+ local chunk = string.sub(s, i, i+_M.BLOCKSIZE-1)
+ i = i + _M.BLOCKSIZE
+ if chunk ~= "" then return chunk
+ else return nil end
+ end
+ else return source.empty() end
+end
+
+-- creates rewindable source
+function source.rewind(src)
+ base.assert(src)
+ local t = {}
+ return function(chunk)
+ if not chunk then
+ chunk = table.remove(t)
+ if not chunk then return src()
+ else return chunk end
+ else
+ table.insert(t, chunk)
+ end
+ end
+end
+
+function source.chain(src, f)
+ base.assert(src and f)
+ local last_in, last_out = "", ""
+ local state = "feeding"
+ local err
+ return function()
+ if not last_out then
+ base.error('source is empty!', 2)
+ end
+ while true do
+ if state == "feeding" then
+ last_in, err = src()
+ if err then return nil, err end
+ last_out = f(last_in)
+ if not last_out then
+ if last_in then
+ base.error('filter returned inappropriate nil')
+ else
+ return nil
+ end
+ elseif last_out ~= "" then
+ state = "eating"
+ if last_in then last_in = "" end
+ return last_out
+ end
+ else
+ last_out = f(last_in)
+ if last_out == "" then
+ if last_in == "" then
+ state = "feeding"
+ else
+ base.error('filter returned ""')
+ end
+ elseif not last_out then
+ if last_in then
+ base.error('filter returned inappropriate nil')
+ else
+ return nil
+ end
+ else
+ return last_out
+ end
+ end
+ end
+ end
+end
+
+-- creates a source that produces contents of several sources, one after the
+-- other, as if they were concatenated
+-- (thanks to Wim Couwenberg)
+function source.cat(...)
+ local arg = {...}
+ local src = table.remove(arg, 1)
+ return function()
+ while src do
+ local chunk, err = src()
+ if chunk then return chunk end
+ if err then return nil, err end
+ src = table.remove(arg, 1)
+ end
+ end
+end
+
+-----------------------------------------------------------------------------
+-- Sink stuff
+-----------------------------------------------------------------------------
+-- creates a sink that stores into a table
+function sink.table(t)
+ t = t or {}
+ local f = function(chunk, err)
+ if chunk then table.insert(t, chunk) end
+ return 1
+ end
+ return f, t
+end
+
+-- turns a fancy sink into a simple sink
+function sink.simplify(snk)
+ base.assert(snk)
+ return function(chunk, err)
+ local ret, err_or_new = snk(chunk, err)
+ if not ret then return nil, err_or_new end
+ snk = err_or_new or snk
+ return 1
+ end
+end
+
+-- creates a file sink
+function sink.file(handle, io_err)
+ if handle then
+ return function(chunk, err)
+ if not chunk then
+ handle:close()
+ return 1
+ else return handle:write(chunk) end
+ end
+ else return sink.error(io_err or "unable to open file") end
+end
+
+-- creates a sink that discards data
+local function null()
+ return 1
+end
+
+function sink.null()
+ return null
+end
+
+-- creates a sink that just returns an error
+function sink.error(err)
+ return function()
+ return nil, err
+ end
+end
+
+-- chains a sink with a filter
+function sink.chain(f, snk)
+ base.assert(f and snk)
+ return function(chunk, err)
+ if chunk ~= "" then
+ local filtered = f(chunk)
+ local done = chunk and ""
+ while true do
+ local ret, snkerr = snk(filtered, err)
+ if not ret then return nil, snkerr end
+ if filtered == done then return 1 end
+ filtered = f(done)
+ end
+ else return 1 end
+ end
+end
+
+-----------------------------------------------------------------------------
+-- Pump stuff
+-----------------------------------------------------------------------------
+-- pumps one chunk from the source to the sink
+function pump.step(src, snk)
+ local chunk, src_err = src()
+ local ret, snk_err = snk(chunk, src_err)
+ if chunk and ret then return 1
+ else return nil, src_err or snk_err end
+end
+
+-- pumps all data from a source to a sink, using a step function
+function pump.all(src, snk, step)
+ base.assert(src and snk)
+ step = step or pump.step
+ while true do
+ local ret, err = step(src, snk)
+ if not ret then
+ if err then return nil, err
+ else return 1 end
+ end
+ end
+end
+
+return _M
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/lua_lexer_loose.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/lua_lexer_loose.lua
new file mode 100644
index 0000000..678a693
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/lua_lexer_loose.lua
@@ -0,0 +1,212 @@
+--[[
+ lua_lexer_loose.lua.
+ Loose lexing of Lua code. See README.
+
+ WARNING: This code is preliminary and may have errors
+ in its current form.
+
+ (c) 2013 David Manura. MIT License.
+--]]
+
+local M = {}
+
+-- based on LuaBalanced
+local function match_string(s, pos)
+ pos = pos or 1
+ local posa = pos
+ local c = s:sub(pos,pos)
+ if c == '"' or c == "'" then
+ pos = pos + 1
+ while 1 do
+ pos = s:find("[" .. c .. "\\]", pos)
+ if not pos then return s:sub(posa), #s + 1 end -- not terminated string
+ if s:sub(pos,pos) == c then
+ local part = s:sub(posa, pos)
+ return part, pos + 1
+ else
+ pos = pos + 2
+ end
+ end
+ else
+ local sc = s:match("^%[(=*)%[", pos)
+ if sc then
+ local _; _, pos = s:find("%]" .. sc .. "%]", pos)
+ if not pos then return s:sub(posa), #s + 1 end -- not terminated string
+ local part = s:sub(posa, pos)
+ return part, pos + 1
+ else
+ return nil, pos
+ end
+ end
+end
+
+-- based on LuaBalanced
+local function match_comment(s, pos)
+ pos = pos or 1
+ if s:sub(pos, pos+1) ~= '--' then
+ return nil, pos
+ end
+ pos = pos + 2
+ if s:sub(pos,pos) == '[' then
+ local partt, post = match_string(s, pos)
+ if partt then
+ return '--' .. partt, post
+ end
+ end
+ local part; part, pos = s:match('^([^\n]*\n?)()', pos)
+ return '--' .. part, pos
+end
+
+-- note: matches invalid numbers too (for example, 0x)
+local function match_numberlike(s, pos)
+ local hex = s:match('^0[xX]', pos)
+ if hex then pos = pos + #hex end
+
+ local longint = (hex and '^%x+' or '^%d+') .. '[uU]?[lL][lL]'
+ local mantissa1 = hex and '^%x+%.?%x*' or '^%d+%.?%d*'
+ local mantissa2 = hex and '^%.%x+' or '^%.%d+'
+ local exponent = hex and '^[pP][+%-]?%x*' or '^[eE][+%-]?%d*'
+ local imaginary = '^[iI]'
+ local tok = s:match(longint, pos)
+ if not tok then
+ tok = s:match(mantissa1, pos) or s:match(mantissa2, pos)
+ if tok then
+ local tok2 = s:match(exponent, pos + #tok)
+ if tok2 then tok = tok..tok2 end
+ tok2 = s:match(imaginary, pos + #tok)
+ if tok2 then tok = tok..tok2 end
+ end
+ end
+ return tok and (hex or '') .. tok or hex
+end
+
+local function newset(s)
+ local t = {}
+ for c in s:gmatch'.' do t[c] = true end
+ return t
+end
+local function qws(s)
+ local t = {}
+ for k in s:gmatch'%S+' do t[k] = true end
+ return t
+end
+
+local sym = newset("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_")
+local dig = newset('0123456789')
+local name = "([_A-Za-z][_A-Za-z0-9]*)"
+local op = newset('=~<>.+-*/%^#=<>;:,.{}[]()')
+
+op['=='] = true
+op['<='] = true
+op['>='] = true
+op['~='] = true
+op['..'] = true
+op['<<'] = true
+op['>>'] = true
+op['//'] = true
+
+local is_keyword = qws[[
+ and break do else elseif end false for function if
+ in local nil not or repeat return
+ then true until while goto]]
+
+function M.lex(code, f, pos)
+ local pos = pos or 1
+ local tok = code:match('^#![^\n]*\n', pos) -- shebang
+ if tok then f('Shebang', tok, 1) pos = pos + #tok end
+ while pos <= #code do
+ local p2, n2, n1, n3 = code:match('^%s*()((%S)(%S?))', pos)
+ if not p2 then assert(code:sub(pos):match('^%s*$')); break end
+ pos = p2
+
+ if sym[n1] then
+ local tok = code:match('^'..name, pos)
+ assert(tok)
+ if is_keyword[tok] then
+ f('Keyword', tok, pos)
+ else
+ f('Id', tok, pos)
+ end
+ pos = pos + #tok
+ elseif n2 == '--' then
+ local tok, pos2 = match_comment(code, pos)
+ assert(tok)
+ f('Comment', tok, pos)
+ pos = pos2
+ elseif n2 == '::' then
+ local tok = code:match('^(::%s*'..name..'%s*::)', pos)
+ if tok then
+ f('Label', tok, pos)
+ pos = pos + #tok
+ else
+ f('Unknown', code:sub(pos, pos+1), pos) -- unterminated label
+ pos = pos + 2
+ end
+ elseif n1 == '\'' or n1 == '\"' or n2 == '[[' or n2 == '[=' then
+ local tok = match_string(code, pos)
+ if tok then
+ f('String', tok, pos)
+ pos = pos + #tok
+ else
+ f('Unknown', code:sub(pos), pos) -- unterminated string
+ pos = #code + 1
+ end
+ elseif dig[n1] or (n1 == '.' and dig[n3]) then
+ local tok = match_numberlike(code, pos)
+ assert(tok)
+ f('Number', tok, pos)
+ pos = pos + #tok
+ elseif op[n2] then
+ if n2 == '..' and code:match('^%.', pos+2) then
+ tok = '...'
+ else
+ tok = n2
+ end
+ f('Keyword', tok, pos)
+ pos = pos + #tok
+ elseif op[n1] then
+ local tok = n1
+ f('Keyword', tok, pos)
+ pos = pos + #tok
+ else
+ f('Unknown', n1, pos)
+ pos = pos + 1
+ end
+ end
+end
+
+local Stream = {}
+Stream.__index = Stream
+function Stream:next(val)
+ if self._next then
+ local _next = self._next
+ self._next = nil
+ return _next
+ else
+ self._next = nil
+ return self.f()
+ end
+end
+function Stream:peek()
+ if self._next then
+ return self._next
+ else
+ local _next = self.f()
+ self._next = _next
+ return _next
+ end
+end
+
+function M.lexc(code, f, pos)
+ local yield = coroutine.yield
+ local func = coroutine.wrap(f or function()
+ M.lex(code, function(tag, name, pos)
+ -- skip Comment tags as they may arbitrarily split statements and affects their processing
+ if tag ~= 'Comment' then yield {tag=tag, name, lineinfo=pos} end
+ end, pos)
+ yield {tag='Eof', lineinfo = #code+1}
+ end)
+ return setmetatable({f=func}, Stream)
+end
+
+return M
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/lua_parser_loose.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/lua_parser_loose.lua
new file mode 100644
index 0000000..e64493f
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/lua_parser_loose.lua
@@ -0,0 +1,337 @@
+--[[
+ lua_parser_loose.lua.
+ Loose parsing of Lua code. See README.
+ (c) 2013 David Manura. MIT License.
+--]]
+
+local PARSE = {}
+
+local unpack = table.unpack or unpack
+local LEX = require 'lua_lexer_loose'
+
+--[[
+ Loose parser.
+
+ lx - lexer stream of Lua tokens.
+ f(event...) - callback function to send events to.
+
+ Events generated:
+ 'Var', name, lineinfo - variable declaration that immediately comes into scope.
+ 'VarSelf', name, lineinfo - same as 'Var' but for implicit 'self' parameter
+ in method definitions. lineinfo is zero-width space after '('
+ 'VarNext', name, lineinfo - variable definition that comes into scope
+ upon next statement.
+ 'VarInside', name, lineinfo - variable definition that comes into scope
+ inside following block. Used for control variables in 'for' statements.
+ 'Id', name, lineinfo - reference to variable.
+ 'String', name - string or table field.
+ 'Scope', opt - beginning of scope block.
+ 'EndScope', nil, lineinfo - end of scope block.
+ 'FunctionCall', name, lineinfo - function call (in addition to other events).
+ 'Function', name, lineinfo - function definition.
+--]]
+function PARSE.parse_scope(lx, f, level)
+ local cprev = {tag='Eof'}
+
+ -- stack of scopes.
+ local scopes = {{}}
+ for l = 2, (level or 1) do scopes[l] = {} end
+
+ local function scope_begin(opt, lineinfo, nobreak)
+ scopes[#scopes+1] = {}
+ f('Scope', opt, lineinfo, nobreak)
+ end
+ local function scope_end(opt, lineinfo)
+ local scope = #scopes
+ if scope > 1 then table.remove(scopes) end
+ local inside_local = false
+ for scope = scope-1, 1, -1 do
+ if scopes[scope].inside_local then inside_local = true; break end
+ end
+ f('EndScope', opt, lineinfo, inside_local)
+ end
+
+ local function parse_function_list(has_self, name, pos)
+ local c = lx:next(); assert(c[1] == '(')
+ f('Statement', c[1], c.lineinfo, true) -- generate Statement for function definition
+ scope_begin(c[1], c.lineinfo, true)
+
+ local vars = {} -- accumulate vars (if any) to send after 'Function'
+ if has_self then
+ local lineinfo = c.lineinfo+1 -- zero size
+ table.insert(vars, {'VarSelf', 'self', lineinfo, true})
+ end
+ while true do
+ local n = lx:peek()
+ if not (n.tag == 'Id' or n.tag == 'Keyword' and n[1] == '...') then break end
+ local c = lx:next()
+ if c.tag == 'Id' then table.insert(vars, {'Var', c[1], c.lineinfo, true}) end
+ -- ignore '...' in this case
+ if lx:peek()[1] == ',' then lx:next() end
+ end
+ if lx:peek()[1] == ')' then
+ lx:next()
+ f('Function', name, pos or c.lineinfo, true)
+ end
+ for _, var in ipairs(vars) do f(unpack(var)) end
+ end
+
+ while true do
+ local c = lx:next()
+
+ -- Detect end of previous statement
+ if c.tag == 'Eof' -- trigger 'Statement' at the end of file
+ or c.tag == 'Keyword' and (
+ c[1] == 'break' or c[1] == 'goto' or c[1] == 'do' or c[1] == 'while' or
+ c[1] == 'repeat' or c[1] == 'if' or c[1] == 'for' or c[1] == 'function' and lx:peek().tag == 'Id' or
+ c[1] == 'local' or c[1] == ';' or c[1] == 'until' or c[1] == 'return' or c[1] == 'end') or
+ c.tag == 'Id' and
+ (cprev.tag == 'Id' or
+ cprev.tag == 'Keyword' and
+ (cprev[1] == ']' or cprev[1] == ')' or cprev[1] == '}' or
+ cprev[1] == '...' or cprev[1] == 'end' or
+ cprev[1] == 'true' or cprev[1] == 'false' or
+ cprev[1] == 'nil') or
+ cprev.tag == 'Number' or cprev.tag == 'String')
+ then
+ if scopes[#scopes].inside_until then scope_end(nil, c.lineinfo) end
+ local scope = #scopes
+ if not scopes[scope].inside_table then scopes[scope].inside_local = nil end
+ f('Statement', c[1], c.lineinfo,
+ scopes[scope].inside_local or c[1] == 'local' or c[1] == 'function' or c[1] == 'end')
+ end
+
+ if c.tag == 'Eof' then break end
+
+ -- Process token(s)
+ if c.tag == 'Keyword' then
+
+ if c[1] == 'local' and lx:peek().tag == 'Keyword' and lx:peek()[1] == 'function' then
+ -- local function
+ local c = lx:next(); assert(c[1] == 'function')
+ if lx:peek().tag == 'Id' then
+ c = lx:next()
+ f('Var', c[1], c.lineinfo, true)
+ if lx:peek()[1] == '(' then parse_function_list(nil, c[1], c.lineinfo) end
+ end
+ elseif c[1] == 'function' then
+ if lx:peek()[1] == '(' then -- inline function
+ parse_function_list()
+ elseif lx:peek().tag == 'Id' then -- function definition statement
+ c = lx:next(); assert(c.tag == 'Id')
+ local name = c[1]
+ local pos = c.lineinfo
+ f('Id', name, pos, true)
+ local has_self
+ while lx:peek()[1] ~= '(' and lx:peek().tag ~= 'Eof' do
+ c = lx:next()
+ name = name .. c[1]
+ if c.tag == 'Id' then
+ f('String', c[1], c.lineinfo, true)
+ elseif c.tag == 'Keyword' and c[1] == ':' then
+ has_self = true
+ end
+ end
+ if lx:peek()[1] == '(' then parse_function_list(has_self, name, pos) end
+ end
+ elseif c[1] == 'local' and lx:peek().tag == 'Id' then
+ scopes[#scopes].inside_local = true
+ c = lx:next()
+ f('VarNext', c[1], c.lineinfo, true)
+ while lx:peek().tag == 'Keyword' and lx:peek()[1] == ',' do
+ c = lx:next(); if lx:peek().tag ~= 'Id' then break end
+ c = lx:next()
+ f('VarNext', c[1], c.lineinfo, true)
+ end
+ elseif c[1] == 'for' and lx:peek().tag == 'Id' then
+ c = lx:next()
+ f('VarInside', c[1], c.lineinfo, true)
+ while lx:peek().tag == 'Keyword' and lx:peek()[1] == ',' do
+ c = lx:next(); if lx:peek().tag ~= 'Id' then break end
+ c = lx:next()
+ f('VarInside', c[1], c.lineinfo, true)
+ end
+ elseif c[1] == 'goto' and lx:peek().tag == 'Id' then
+ lx:next()
+ elseif c[1] == 'do' then
+ scope_begin('do', c.lineinfo)
+ -- note: do/while/for statement scopes all begin at 'do'.
+ elseif c[1] == 'repeat' or c[1] == 'then' then
+ scope_begin(c[1], c.lineinfo)
+ elseif c[1] == 'end' or c[1] == 'elseif' then
+ scope_end(c[1], c.lineinfo)
+ elseif c[1] == 'else' then
+ scope_end(nil, c.lineinfo)
+ scope_begin(c[1], c.lineinfo)
+ elseif c[1] == 'until' then
+ scopes[#scopes].inside_until = true
+ elseif c[1] == '{' then
+ scopes[#scopes].inside_table = (scopes[#scopes].inside_table or 0) + 1
+ elseif c[1] == '}' then
+ local newval = (scopes[#scopes].inside_table or 0) - 1
+ newval = newval >= 1 and newval or nil
+ scopes[#scopes].inside_table = newval
+ end
+ elseif c.tag == 'Id' then
+ local scope = #scopes
+ local inside_local = scopes[scope].inside_local ~= nil
+ local inside_table = scopes[scope].inside_table
+ local cnext = lx:peek()
+ if cnext.tag == 'Keyword' and (cnext[1] == '(' or cnext[1] == '{')
+ or cnext.tag == 'String' then
+ f('FunctionCall', c[1], c.lineinfo, inside_local)
+ end
+ -- either this is inside a table or it continues from a comma,
+ -- which may be a field assignment, so assume it's in a table
+ if (inside_table or cprev[1] == ',') and cnext.tag == 'Keyword' and cnext[1] == '=' then
+ -- table field; table fields are tricky to handle during incremental
+ -- processing as "a = 1" may be either an assignment (in which case
+ -- 'a' is Id) or a field initialization (in which case it's a String).
+ -- Since it's not possible to decide between two cases in isolation,
+ -- this is not a good place to insert a break; instead, the break is
+ -- inserted at the location of the previous keyword, which allows
+ -- to properly handle those cases. The desired location of
+ -- the restart point is returned as the `nobreak` value.
+ f('String', c[1], c.lineinfo,
+ inside_local or cprev and cprev.tag == 'Keyword' and cprev.lineinfo)
+ elseif cprev.tag == 'Keyword' and (cprev[1] == ':' or cprev[1] == '.') then
+ f('String', c[1], c.lineinfo, true)
+ else
+ f('Id', c[1], c.lineinfo, true)
+ -- this looks like the left side of (multi-variable) assignment
+ -- unless it's a part of `= var, field = value`, so skip if inside a table
+ if not inside_table and not (cprev and cprev.tag == 'Keyword' and cprev[1] == '=') then
+ while lx:peek().tag == 'Keyword' and lx:peek()[1] == ',' do
+ local c = lx:next(); if lx:peek().tag ~= 'Id' then break end
+ c = lx:next()
+ f('Id', c[1], c.lineinfo, true)
+ end
+ end
+ end
+ end
+
+ if c.tag ~= 'Comment' then cprev = c end
+ end
+end
+
+--[[
+ This is similar to parse_scope but determines if variables are local or global.
+
+ lx - lexer stream of Lua tokens.
+ f(event...) - callback function to send events to.
+
+ Events generated:
+ 'Id', name, lineinfo, 'local'|'global'
+ (plus all events in parse_scope)
+--]]
+function PARSE.parse_scope_resolve(lx, f, vars)
+ local NEXT = {} -- unique key
+ local INSIDE = {} -- unique key
+ local function newscope(vars, opt, lineinfo)
+ local newvars = opt=='do' and vars[INSIDE] or {}
+ if newvars == vars[INSIDE] then vars[INSIDE] = false end
+ newvars[INSIDE]=false
+ newvars[NEXT]=false
+ local level = (vars[0] or 0) + 1
+ newvars[0] = level -- keep the current level
+ newvars[-1] = lineinfo -- keep the start of the scope
+ newvars[level] = newvars -- reference the current vars table
+ return setmetatable(newvars, {__index=vars})
+ end
+
+ vars = vars or newscope({[0] = 0}, nil, 1)
+ vars[NEXT] = false -- vars that come into scope upon next statement
+ vars[INSIDE] = false -- vars that come into scope upon entering block
+ PARSE.parse_scope(lx, function(op, name, lineinfo, nobreak)
+ -- in some (rare) cases VarNext can follow Statement event (which copies
+ -- vars[NEXT]). This may cause vars[0] to be `nil`, so default to 1.
+ local var = op:find("^Var") and
+ {fpos = lineinfo, at = (vars[0] or 1) + (op == 'VarInside' and 1 or 0),
+ masked = vars[name], self = (op == 'VarSelf') or nil } or nil
+ if op == 'Var' or op == 'VarSelf' then
+ vars[name] = var
+ elseif op == 'VarNext' then
+ vars[NEXT] = vars[NEXT] or {}
+ vars[NEXT][name] = var
+ elseif op == 'VarInside' then
+ vars[INSIDE] = vars[INSIDE] or {}
+ vars[INSIDE][name] = var
+ elseif op == 'Scope' then
+ vars = newscope(vars, name, lineinfo)
+ elseif op == 'EndScope' then
+ local mt = getmetatable(vars)
+ if mt ~= nil then vars = mt.__index end
+ elseif op == 'Id'
+ or op == 'String' or op == 'FunctionCall' or op == 'Function' then
+ -- Just make callback
+ elseif op == 'Statement' then -- beginning of statement
+ -- Apply vars that come into scope upon beginning of statement.
+ if vars[NEXT] then
+ for k,v in pairs(vars[NEXT]) do
+ vars[k] = v; vars[NEXT][k] = nil
+ end
+ end
+ else
+ assert(false)
+ end
+ f(op, name, lineinfo, vars, nobreak)
+ end, vars[0])
+end
+
+function PARSE.extract_vars(code, f)
+ local lx = LEX.lexc(code)
+
+ local char0 = 1 -- next char offset to write
+ local function gen(char1, nextchar0)
+ char0 = nextchar0
+ end
+
+ PARSE.parse_scope_resolve(lx, function(op, name, lineinfo, other)
+ if op == 'Id' then
+ f('Id', name, other, lineinfo)
+ elseif op == 'Var' or op == 'VarNext' or op == 'VarInside' then
+ gen(lineinfo, lineinfo+#name)
+ f('Var', name, "local", lineinfo)
+ end -- ignore 'VarSelf' and others
+ end)
+ gen(#code+1, nil)
+end
+
+--[[
+ Converts 5.2 code to 5.1 style code with explicit _ENV variables.
+ Example: "function f(_ENV, x) print(x, y)" -->
+ "function _ENV.f(_ENV, x) _ENV.print(x, _ENV.y) end"
+
+ code - string of Lua code. Assumed to be valid Lua (FIX: 5.1 or 5.2?)
+ f(s) - call back function to send chunks of Lua code output to. Example: io.stdout.
+--]]
+function PARSE.replace_env(code, f)
+ if not f then return PARSE.accumulate(PARSE.replace_env, code) end
+ PARSE.extract_vars(code, function(op, name, other)
+ if op == 'Id' then
+ f(other == 'global' and '_ENV.' .. name or name)
+ elseif op == 'Var' or op == 'Other' then
+ f(name)
+ end
+ end)
+end
+
+-- helper function. Can be passed as argument `f` to functions
+-- like `replace_env` above to accumulate fragments into a single string.
+function PARSE.accumulator()
+ local ts = {}
+ local mt = {}
+ mt.__index = mt
+ function mt:__call(s) ts[#ts+1] = s end
+ function mt:result() return table.concat(ts) end
+ return setmetatable({}, mt)
+end
+
+-- helper function
+function PARSE.accumulate(g, code)
+ local accum = PARSE.accumulator()
+ g(code, accum)
+ return accum:result()
+end
+
+return PARSE
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/luadist.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/luadist.lua
new file mode 100644
index 0000000..da875dc
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/luadist.lua
@@ -0,0 +1,746 @@
+#!/usr/bin/env lua
+
+-- Command line interface to LuaDist-git.
+
+local dist = require "dist"
+local utils = require "dist.utils"
+local depends = require "dist.depends"
+local package = require "dist.package"
+local mf = require "dist.manifest"
+local cfg = require "dist.config"
+local sys = require "dist.sys"
+
+-- CLI commands of Luadist.
+local commands
+commands = {
+
+ -- Print help for this command line interface.
+ ["help"] = {
+ help = [[
+Usage: luadist [DEPLOYMENT_DIRECTORY] <COMMAND> [ARGUMENTS...] [-VARIABLES...]
+
+ Commands:
+
+ help - print this help
+ install - install modules
+ remove - remove modules
+ refresh - update information about modules in repositories
+ list - list installed modules
+ info - show information about modules
+ search - search repositories for modules
+ fetch - download modules
+ make - manually deploy modules from local paths
+ upload - upload installed modules to their repositories
+ tree - print dependency tree of a module
+ selftest - run the selftest of LuaDist
+
+ To get help on specific command, run:
+
+ luadist help <COMMAND>
+ ]],
+ run = function (deploy_dir, help_item)
+ deploy_dir = deploy_dir or dist.get_deploy_dir()
+ help_item = help_item or {}
+ assert(type(deploy_dir) == "string", "luadist.help: Argument 'deploy_dir' is not a string.")
+ assert(type(help_item) == "table", "luadist.help: Argument 'help_item' is not a table.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ if not help_item or not commands[help_item[1]] then
+ help_item = "help"
+ else
+ help_item = help_item[1]
+ end
+
+ print_info()
+ print(commands[help_item].help)
+ return 0
+ end
+ },
+
+ -- Install modules.
+ ["install"] = {
+ help = [[
+Usage: luadist [DEPLOYMENT_DIRECTORY] install MODULES... [-VARIABLES...]
+
+ The 'install' command will install specified MODULES to
+ DEPLOYMENT_DIRECTORY. LuaDist will also automatically resolve, download
+ and install all dependencies.
+
+ If DEPLOYMENT_DIRECTORY is not specified, the deployment directory
+ of LuaDist is used.
+
+ You can use * (an asterisk sign) in the name of the module as a wildcard
+ with the meaning 'any symbols' (in most shells, the module name then must
+ be quoted to prevent the expansion of asterisk by the shell itself).
+
+ Optional CMake VARIABLES in -D format (e.g. -Dvariable=value) or LuaDist
+ configuration VARIABLES (e.g. -variable=value) can be specified.
+
+ The -simulate configuration option makes LuaDist only to simulate the
+ installation of modules (no modules will be really installed).
+ ]],
+
+ run = function (deploy_dir, modules, cmake_variables)
+ deploy_dir = deploy_dir or dist.get_deploy_dir()
+ if type(modules) == "string" then modules = {modules} end
+ cmake_variables = cmake_variables or {}
+ assert(type(deploy_dir) == "string", "luadist.install: Argument 'deploy_dir' is not a string.")
+ assert(type(modules) == "table", "luadist.install: Argument 'modules' is not a string or table.")
+ assert(type(cmake_variables) == "table", "luadist.install: Argument 'cmake_variables' is not a table.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ if cfg.simulate then
+ print("NOTE: this is just simulation.")
+ end
+
+ if #modules == 0 then
+ print("No modules to install specified.")
+ return 0
+ end
+
+ local ok, err = dist.install(modules, deploy_dir, cmake_variables)
+ if not ok then
+ print(err)
+ os.exit(1)
+ else
+ print((cfg.simulate and "Simulated installation" or "Installation") .. " successful.")
+ return 0
+ end
+ end
+ },
+
+ -- Remove modules.
+ ["remove"] = {
+ help = [[
+Usage: luadist [DEPLOYMENT_DIRECTORY] remove MODULES... [-VARIABLES...]
+
+ The 'remove' command will remove specified MODULES from
+ DEPLOYMENT_DIRECTORY. If no module is specified, all modules
+ will be removed.
+
+ If DEPLOYMENT_DIRECTORY is not specified, the deployment directory
+ of LuaDist is used. If no MODULES are specified, all installed modules
+ will be removed.
+
+ You can use * (an asterisk sign) in the name of the module as a wildcard
+ with the meaning 'any symbols' (in most shells, the module name then must
+ be quoted to prevent the expansion of asterisk by the shell itself).
+
+ Optional LuaDist configuration VARIABLES (e.g. -variable=value) can be
+ specified.
+
+ WARNING: dependencies between modules are NOT taken into account when
+ removing modules!
+ ]],
+
+ run = function (deploy_dir, modules)
+ deploy_dir = deploy_dir or dist.get_deploy_dir()
+ if type(modules) == "string" then modules = {modules} end
+ assert(type(deploy_dir) == "string", "luadist.remove: Argument 'deploy_dir' is not a string.")
+ assert(type(modules) == "table", "luadist.remove: Argument 'modules' is not a string or table.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local num, err = dist.remove(modules, deploy_dir)
+ if not num then
+ print(err)
+ os.exit(1)
+ else
+ print("Removed modules: " .. num)
+ return 0
+ end
+ end
+ },
+
+ -- Update repositories.
+ ["refresh"] = {
+ help = [[
+Usage: luadist [DEPLOYMENT_DIRECTORY] refresh [-VARIABLES...]
+
+ The 'refresh' command will update information about modules in all software
+ repositories of specified DEPLOYMENT_DIRECTORY. Also, the cached dependency
+ manifest, built from previous installations or invocations of 'tree'
+ functionality will be deleted.
+
+ If DEPLOYMENT_DIRECTORY is not specified, the deployment directory
+ of LuaDist is used.
+
+ Optional LuaDist configuration VARIABLES (e.g. -variable=value) can be
+ specified.
+ ]],
+
+ run = function (deploy_dir)
+ deploy_dir = deploy_dir or dist.get_deploy_dir()
+ assert(type(deploy_dir) == "string", "luadist.refresh: Argument 'deploy_dir' is not a string.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ -- TODO: should be deleting the dep_manifest decoupled from refreshing the repository info?
+ -- delete cached dependency manifest
+ local dep_manifest_file = sys.abs_path(sys.make_path(deploy_dir, cfg.dep_cache_file))
+ local dep_mf_deleted = false
+ if sys.exists(dep_manifest_file) then
+ sys.delete(dep_manifest_file)
+ dep_mf_deleted = true
+ end
+
+ -- refresh repository information
+ local ok, err = dist.update_manifest(deploy_dir)
+ if not ok then
+ print(err)
+ os.exit(1)
+ else
+ print("Repositories successfuly updated" .. (dep_mf_deleted and " and dependency cache deleted" or "") .. ".")
+ return 0
+ end
+ end
+ },
+
+ -- Manually deploy modules.
+ ["make"] = {
+ help = [[
+Usage: luadist [DEPLOYMENT_DIRECTORY] make MODULE_PATHS... [-VARIABLES...]
+
+ The 'make' command will manually deploy modules from specified local
+ MODULE_PATHS into the DEPLOYMENT_DIRECTORY.
+
+ The MODULE_PATHS will be preserved. If DEPLOYMENT_DIRECTORY is not
+ specified, the deployment directory of LuaDist is used.
+
+ Optional CMake VARIABLES in -D format (e.g. -Dvariable=value) or LuaDist
+ configuration VARIABLES (e.g. -variable=value) can be specified.
+
+ The -simulate configuration option makes LuaDist only to simulate the
+ deployment of modules (no modules will be really deployed).
+
+ WARNING: this command does NOT check whether the dependencies of deployed
+ modules are satisfied or not!
+ ]],
+
+ run = function (deploy_dir, module_paths, cmake_variables)
+ deploy_dir = deploy_dir or dist.get_deploy_dir()
+ module_paths = module_paths or {}
+ cmake_variables = cmake_variables or {}
+ assert(type(deploy_dir) == "string", "luadist.make: Argument 'deploy_dir' is not a string.")
+ assert(type(module_paths) == "table", "luadist.make: Argument 'module_paths' is not a table.")
+ assert(type(cmake_variables) == "table", "luadist.make: Argument 'cmake_variables' is not a table.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ if cfg.simulate then
+ print("NOTE: this is just simulation.")
+ end
+
+ if #module_paths == 0 then
+ print("No module paths to deploy specified.")
+ return 0
+ end
+
+ local ok, err = dist.make(deploy_dir, module_paths, cmake_variables)
+ if not ok then
+ print(err)
+ os.exit(1)
+ end
+ print((cfg.simulate and "Simulated deployment" or "Deployment") .. " successful.")
+ return 0
+ end
+ },
+
+ -- Download modules.
+ ["fetch"] = {
+ help = [[
+Usage: luadist [FETCH_DIRECTORY] fetch MODULES... [-VARIABLES...]
+
+ The 'fetch' command will download specified MODULES to the FETCH_DIRECTORY.
+
+ If no FETCH_DIRECTORY is specified, the temporary directory of LuaDist
+ deployment directory (i.e. ']] .. cfg.temp_dir .. [[') is used.
+ If the version is not specified in module name, the most recent version
+ available will be downloaded.
+
+ Optional LuaDist configuration VARIABLES (e.g. -variable=value) can be
+ specified.
+ ]],
+
+ run = function (fetch_dir, modules)
+ fetch_dir = fetch_dir or dist.get_deploy_dir()
+ modules = modules or {}
+ assert(type(fetch_dir) == "string", "luadist.fetch: Argument 'fetch_dir' is not a string.")
+ assert(type(modules) == "table", "luadist.fetch: Argument 'modules' is not a table.")
+ fetch_dir = sys.abs_path(fetch_dir)
+
+ -- if the default parameter (i.e. deploy_dir) is passed, use the default temp_dir
+ if fetch_dir == dist.get_deploy_dir() then
+ fetch_dir = sys.make_path(fetch_dir, cfg.temp_dir)
+ end
+
+ if #modules == 0 then
+ print("No modules to download specified.")
+ return 0
+ end
+
+ local ok, err = dist.fetch(modules, fetch_dir)
+ if not ok then
+ print(err)
+ os.exit(1)
+ else
+ print("Modules successfuly downloaded to '" .. fetch_dir .. "'.")
+ return 0
+ end
+ end
+ },
+
+ -- Upload modules.
+ ["upload"] = {
+ help = [[
+Usage: luadist [DEPLOYMENT_DIRECTORY] upload MODULES... [-VARIABLES...]
+
+ The 'upload' command will upload the binary versions of specified MODULES,
+ installed in the DEPLOYMENT_DIRECTORY, to their LuaDist repositories.
+
+ Base url of repositories is given by configuration variable 'upload_url'
+ (by default ']] .. cfg.upload_url .. [[') which you can change.
+ E.g.: Binary version of module 'lua', installed in DEPLOYMENT_DIRECTORY,
+ will now be uploaded to repository ']] .. cfg.upload_url .. [[lua.git'.
+
+ Organization of uploaded modules and their repositories is subject
+ to the conventions described in more detail in the source code
+ of the 'dist.upload_modules()' function (file 'dist/init.lua').
+
+ If DEPLOYMENT_DIRECTORY is not specified, the deployment directory
+ of LuaDist is used. If no MODULES are specified, all installed modules
+ will be uploaded.
+
+ You can use * (an asterisk sign) in the name of the module as a wildcard
+ with the meaning 'any symbols' (in most shells, the module name then must
+ be quoted to prevent the expansion of asterisk by the shell itself).
+
+ Optional LuaDist configuration VARIABLES (e.g. -variable=value) can be
+ specified.
+ ]],
+
+ run = function (deploy_dir, modules)
+ -- check if we have git
+ local ok = utils.system_dependency_available("git", "git --version")
+ if not ok then os.exit(1) end
+
+ deploy_dir = deploy_dir or dist.get_deploy_dir()
+ if type(modules) == "string" then modules = {modules} end
+ assert(type(deploy_dir) == "string", "luadist.upload: Argument 'deploy_dir' is not a string.")
+ assert(type(modules) == "table", "luadist.upload: Argument 'modules' is not a string or table.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local num, err = dist.upload_modules(deploy_dir, modules, cfg.upload_url)
+ if not num then
+ print(err)
+ os.exit(1)
+ else
+ print("Uploaded modules: " .. num)
+ return 0
+ end
+ end
+ },
+
+ -- List installed modules.
+ ["list"] = {
+ help = [[
+Usage: luadist [DEPLOYMENT_DIRECTORY] list [STRINGS...] [-VARIABLES...]
+
+ The 'list' command will list all modules installed in specified
+ DEPLOYMENT_DIRECTORY, which contain one or more optional STRINGS.
+
+ If DEPLOYMENT_DIRECTORY is not specified, the deployment directory
+ of LuaDist is used. If STRINGS are not specified, all installed modules
+ are listed.
+
+ Optional LuaDist configuration VARIABLES (e.g. -variable=value) can be
+ specified.
+ ]],
+
+ run = function (deploy_dir, strings)
+ deploy_dir = deploy_dir or dist.get_deploy_dir()
+ strings = strings or {}
+ assert(type(deploy_dir) == "string", "luadist.list: Argument 'deploy_dir' is not a string.")
+ assert(type(strings) == "table", "luadist.list: Argument 'strings' is not a table.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local deployed = dist.get_deployed(deploy_dir)
+ deployed = depends.filter_packages_by_strings(deployed, strings)
+
+ print("\nInstalled modules:")
+ print("==================\n")
+ for _, pkg in pairs(deployed) do
+ print(" " .. pkg.name .. "-" .. pkg.version .. "\t(" .. pkg.arch .. "-" .. pkg.type .. ")" .. (pkg.provided_by and "\t [provided by " .. pkg.provided_by .. "]" or ""))
+ end
+ print()
+ return 0
+ end
+ },
+
+ -- Search for modules in repositories.
+ ["search"] = {
+ help = [[
+Usage: luadist [DEPLOYMENT_DIRECTORY] search [STRINGS...] [-VARIABLES...]
+
+ The 'search' command will list all modules from repositories, which contain
+ one or more STRINGS.
+
+ If no STRINGS are specified, all available modules are listed.
+
+ Optional LuaDist configuration VARIABLES (e.g. -variable=value) can be
+ specified.
+ ]],
+
+ run = function (deploy_dir, strings)
+ deploy_dir = deploy_dir or dist.get_deploy_dir()
+ strings = strings or {}
+ assert(type(deploy_dir) == "string", "luadist.search: Argument 'deploy_dir' is not a string.")
+ assert(type(strings) == "table", "luadist.search: Argument 'strings' is not a table.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local available, err = mf.get_manifest()
+ if not available then
+ print(err)
+ os.exit(1)
+ end
+
+ available = depends.filter_packages_by_strings(available, strings)
+ available = depends.sort_by_names(available)
+
+ print("\nModules found:")
+ print("==============\n")
+ for _, pkg in pairs(available) do
+ print(" " .. pkg.name)
+ end
+ print()
+ return 0
+ end
+ },
+
+ -- Show information about modules.
+ ["info"] = {
+ help = [[
+Usage: luadist [DEPLOYMENT_DIRECTORY] info [MODULES...] [-VARIABLES...]
+
+ The 'info' command shows information about specified modules from
+ repositories. This command also shows whether modules are installed
+ in DEPLOYMENT_DIRECTORY.
+
+ If no MODULES are specified, all available modules are shown.
+ If DEPLOYMENT_DIRECTORY is not specified, the deployment directory
+ of LuaDist is used.
+
+ Optional LuaDist configuration VARIABLES (e.g. -variable=value) can be
+ specified.
+ ]],
+
+ run = function (deploy_dir, modules)
+ deploy_dir = deploy_dir or dist.get_deploy_dir()
+ modules = modules or {}
+ assert(type(deploy_dir) == "string", "luadist.info: Argument 'deploy_dir' is not a string.")
+ assert(type(modules) == "table", "luadist.info: Argument 'modules' is not a table.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local manifest, err = mf.get_manifest()
+ if not manifest then
+ print(err)
+ os.exit(1)
+ end
+
+ -- if no packages specified explicitly, show just info from .gitmodules for all packages available
+ if #modules == 0 then
+
+ modules = manifest
+ modules = depends.sort_by_names(modules)
+ local deployed = dist.get_deployed(deploy_dir)
+
+ print("")
+ for _, pkg in pairs(modules) do
+ print(" " .. pkg.name)
+ print(" Repository url: " .. (pkg.path or "N/A"))
+ print()
+ end
+ return 0
+
+ -- if some packages explicitly specified, retrieve and show detailed info about them
+ else
+
+ if #modules > 5 then
+ print("NOTE: More than 5 modules specified - operation may take a longer time.")
+ end
+
+ local deployed = dist.get_deployed(deploy_dir)
+
+ for _, module in pairs(modules) do
+ manifest, err = package.get_versions_info(module, manifest, deploy_dir, deployed)
+ if not manifest then
+ print(err)
+ os.exit(1)
+ end
+ end
+
+ modules = depends.find_packages(modules, manifest)
+ modules = depends.sort_by_names(modules)
+
+ print("")
+ for _, pkg in pairs(modules) do
+ print(" " .. pkg.name .. "-" .. pkg.version .. " (" .. pkg.arch .. "-" .. pkg.type ..")" .. (pkg.from_installed and " [info taken from installed version]" or ""))
+ print(" Description: " .. (pkg.desc or "N/A"))
+ print(" Author: " .. (pkg.author or "N/A"))
+ print(" Homepage: " .. (pkg.url or "N/A"))
+ print(" License: " .. (pkg.license or "N/A"))
+ print(" Repository url: " .. (pkg.path or "N/A"))
+ print(" Maintainer: " .. (pkg.maintainer or "N/A"))
+ if pkg.provides then print(" Provides: " .. utils.table_tostring(pkg.provides)) end
+ if pkg.depends then print(" Depends: " .. utils.table_tostring(pkg.depends)) end
+ if pkg.conflicts then print(" Conflicts: " .. utils.table_tostring(pkg.conflicts)) end
+ print(" State: " .. (depends.is_installed(pkg.name, deployed, pkg.version) and "installed" or "not installed"))
+ print()
+ end
+ return 0
+ end
+
+ end
+ },
+
+ -- Print dependency tree.
+ ["tree"] = {
+ help = [[
+Usage: luadist [DEPLOYMENT_DIRECTORY] tree [MODULES...] [-VARIABLES...]
+
+ The 'tree' command prints dependency tree for specified modules.
+
+ If no MODULES are specified, trees for all available modules are printed.
+ This information about modules is being cached in dependency manifest.
+
+ Optional LuaDist configuration VARIABLES (e.g. -variable=value) can be
+ specified.
+ ]],
+
+ run = function (deploy_dir, modules)
+ deploy_dir = deploy_dir or dist.get_deploy_dir()
+ modules = modules or {}
+ assert(type(deploy_dir) == "string", "luadist.info: Argument 'deploy_dir' is not a string.")
+ assert(type(modules) == "table", "luadist.info: Argument 'modules' is not a table.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local manifest, err = mf.get_manifest()
+ if not manifest then
+ print(err)
+ os.exit(1)
+ end
+
+ -- if no modules specified explicitly, assume all modules
+ if #modules == 0 then modules = depends.sort_by_names(manifest) end
+ print("Getting dependency information... (this may take a lot of time)")
+
+ for _, module in pairs(modules) do
+
+ -- if all modules are being queried, extract the name
+ if type(module) == "table" then module = module.name end
+
+ local dep_manifest, err = dist.dependency_info(module, deploy_dir)
+ if not dep_manifest then
+ print(err)
+ os.exit(1)
+ else
+
+ -- print the dependency tree
+ local heading = "Dependency tree for '" .. module .. "' (on " .. cfg.arch .. "-" .. cfg.type .. "):"
+ print("\n" .. heading .. "")
+ print(string.rep("=", #heading) .. "\n")
+
+ for _, pkg in pairs(dep_manifest) do
+
+ local pkg_version, pkg_tag = pkg.version, pkg.version
+ if pkg.was_scm_version then
+ pkg_version, pkg_tag = "scm", "HEAD"
+ end
+ print(" " .. pkg.name .. "-" .. pkg_version .. " (" .. pkg.path .. ", " .. pkg_tag .. ")")
+ if pkg.depends then
+ for _, dep in pairs(pkg.depends) do
+ if type(dep) ~= "table" then
+ local found = depends.sort_by_versions(depends.find_packages(dep, dep_manifest))[1]
+ if not found then
+ print("Could not find the dependency '" .. dep .. "' in the dependency manifest.")
+ os.exit(1)
+ end
+ print(" * " .. found.name .. "-" .. found.version .. " (" .. found.path .. ", " .. found.version .. ")")
+ end
+ end
+ end
+ print()
+ end
+
+ end
+ end
+ return 0
+
+ end
+ },
+
+ -- Selftest of LuaDist.
+ ["selftest"] = {
+ help = [[
+Usage: luadist [TEST_DIRECTORY] selftest [-VARIABLES...]
+
+ The 'selftest' command runs tests of LuaDist, located in TEST_DIRECTORY and
+ displays the results.
+
+ If no TEST_DIRECTORY is specified, the default test directory of LuaDist
+ deployment directory (i.e. ']] .. cfg.test_dir .. [[') is used.
+
+ Optional LuaDist configuration VARIABLES (e.g. -variable=value) can be
+ specified.
+ ]],
+
+ run = function (test_dir)
+ test_dir = test_dir or dist.get_deploy_dir()
+ assert(type(test_dir) == "string", "luadist.selftest: Argument 'deploy_dir' is not a string.")
+ test_dir = sys.abs_path(test_dir)
+
+ -- if the default parameter (i.e. deploy_dir) is passed, use the default test_dir
+ if test_dir == dist.get_deploy_dir() then
+ test_dir = sys.make_path(test_dir, cfg.test_dir)
+ end
+
+ -- try to get an iterator over test files and check it
+ local test_iterator, err = sys.get_directory(test_dir)
+ if not test_iterator then
+ print("Running tests from '" .. test_dir .. "' failed: " .. err)
+ os.exit(1)
+ end
+
+ -- run the tests
+ print("\nRunning tests:")
+ print("==============")
+ for test_file in sys.get_directory(test_dir) do
+ test_file = sys.make_path(test_dir, test_file)
+ if sys.is_file(test_file) then
+ print()
+ print(sys.extract_name(test_file) .. ":")
+ dofile(test_file)
+ end
+ end
+ print()
+ return 0
+ end
+ },
+}
+
+-- Run the functionality of LuaDist 'command' in the 'deploy_dir' with other items
+-- or settings/variables starting at 'other_idx' index of special variable 'arg'.
+local function run_command(deploy_dir, command, other_idx)
+ deploy_dir = deploy_dir or dist.get_deploy_dir()
+ assert(type(deploy_dir) == "string", "luadist.run_command: Argument 'deploy_dir' is not a string.")
+ assert(type(command) == "string", "luadist.run_command: Argument 'command' is not a string.")
+ assert(not other_idx or type(other_idx) == "number", "luadist.run_command: Argument 'other_idx' is not a number.")
+ deploy_dir = sys.abs_path(deploy_dir)
+
+ local items = {}
+ local cmake_variables = {}
+
+ -- parse items after the command (and LuaDist or CMake variables)
+ if other_idx then
+ for i = other_idx, #arg do
+
+ -- CMake variable
+ if arg[i]:match("^%-D(.-)=(.*)$") then
+ local variable, value = arg[i]:match("^%-D(.-)=(.*)$")
+ cmake_variables[variable] = value
+
+ -- LuaDist variable
+ elseif arg[i]:match("^%-(.-)=(.*)$") then
+ local variable, value = arg[i]:match("^%-(.-)=(.*)$")
+ apply_settings(variable, value)
+
+ -- LuaDist boolean variable with implicit 'true' value
+ elseif arg[i]:match("^%-(.-)$") then
+ local variable, value = arg[i]:match("^%-(.-)$")
+ apply_settings(variable, "true")
+
+ -- not a LuaDist or CMake variable
+ else
+ table.insert(items, arg[i])
+ end
+ end
+ end
+
+ -- run the required LuaDist functionality
+ return commands[command].run(sys.abs_path(deploy_dir), items, cmake_variables)
+end
+
+-- Print information about Luadist (version, license, etc.).
+function print_info()
+ print([[
+LuaDist-git ]].. cfg.version .. [[ - Lua package manager for the LuaDist deployment system.
+Released under the MIT License. See https://github.com/luadist/luadist-git
+ ]])
+ return 0
+end
+
+-- Convenience function for printing the main luadist help.
+function print_help()
+ return run_command(nil, "help")
+end
+
+-- Set the LuaDist 'variable' to the 'value'.
+-- See available settings in 'dist.config' module.
+function apply_settings(variable, value)
+ assert(type(variable) == "string", "luadist.apply_settings: Argument 'variable' is not a string.")
+ assert(type(value) == "string", "luadist.apply_settings: Argument 'value' is not a string.")
+
+ -- check whether the settings variable exists
+ if cfg[variable] == nil then
+ print("Unknown LuaDist configuration option: '" .. variable .. "'.")
+ os.exit(1)
+
+ -- ensure the right type
+
+ elseif type(cfg[variable]) == "boolean" then
+ value = value:lower()
+ if value == "true" or value == "yes" or value == "on" or value == "1" then
+ value = true
+ elseif value == "false" or value == "no" or value == "off" or value == "0" then
+ value = false
+ else
+ print("Value of LuaDist option '" .. variable .. "' must be a boolean.")
+ os.exit(1)
+ end
+
+ elseif type(cfg[variable]) == "number" then
+ value = tonumber(value)
+ if not value then
+ print("Value of LuaDist option '" .. variable .. "' must be a number.")
+ os.exit(1)
+ end
+
+ elseif type(cfg[variable]) == "table" then
+ local err
+ value, err = utils.make_table(value, ",")
+ if not value then
+ print("Error when parsing the LuaDist variable '" .. variable .. "': " .. err)
+ os.exit(1)
+ end
+ end
+
+ -- set the LuaDist variable
+ cfg[variable] = value
+
+end
+
+-- Parse command line input and run the required command.
+if pcall(debug.getlocal, 4, 1) then
+ return commands -- return commands when used as module
+elseif not commands[arg[1]] and commands[arg[2]] then
+ -- deploy_dir specified
+ return run_command(arg[1], arg[2], 3)
+elseif commands[arg[1]] then
+ -- deploy_dir not specified
+ return run_command(dist.get_deploy_dir(), arg[1], 2)
+else
+ -- unknown command
+ if arg[1] then
+ print("Unknown command '" .. arg[1] .. "'. Printing help...\n")
+ print_help()
+ os.exit(1)
+ end
+ return print_help()
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/ast.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/ast.lua
new file mode 100644
index 0000000..12244d9
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/ast.lua
@@ -0,0 +1,915 @@
+-- luainspect.ast - Lua Abstract Syntax Tree (AST) and token list operations.
+--
+-- Two main structures are maintained. A Metalua-style AST represents the
+-- nested syntactic structure obtained from the parse.
+-- A separate linear ordered list of tokens represents the syntactic structure
+-- from the lexing, including line information (character positions only not row/columns),
+-- comments, and keywords, which is originally built from the lineinfo attributes
+-- injected by Metalua into the AST (IMPROVE: it probably would be simpler
+-- to obtain this from the lexer directly rather then inferring it from the parsing).
+-- During AST manipulations, the lineinfo maintained in the AST is ignored
+-- because it was found more difficult to maintain and not in the optimal format.
+--
+-- The contained code deals with
+-- - Building the AST from source.
+-- - Building the tokenlist from the AST lineinfo.
+-- - Querying the AST+tokenlist.
+-- - Modifying the AST+tokenlist (including incremental parsing source -> AST)
+-- - Annotating the AST with navigational info (e.g. parent links) to assist queries.
+-- - Dumping the tokenlist for debugging.
+--
+-- (c) 2010 David Manura, MIT License.
+
+
+--! require 'luainspect.typecheck' (context)
+
+local mlc = require 'metalua.compiler'.new()
+
+local M = {}
+
+--[=TESTSUITE
+-- utilities
+local ops = {}
+ops['=='] = function(a,b) return a == b end
+local function check(opname, a, b)
+ local op = assert(ops[opname])
+ if not op(a,b) then
+ error("fail == " .. tostring(a) .. " " .. tostring(b))
+ end
+end
+--]=]
+
+-- CATEGORY: debug
+local function DEBUG(...)
+ if LUAINSPECT_DEBUG then
+ print('DEBUG:', ...)
+ end
+end
+
+
+-- Converts character position to row,column position in string src.
+-- Add values are 1-indexed.
+function M.pos_to_linecol(pos, src)
+ local linenum = 1
+ local lasteolpos = 0
+ for eolpos in src:gmatch"()\n" do
+ if eolpos > pos then break end
+ linenum = linenum + 1
+ lasteolpos = eolpos
+ end
+ local colnum = pos - lasteolpos
+ return linenum, colnum
+end
+
+-- Removes any sheband ("#!") line from Lua source string.
+-- CATEGORY: Lua parsing
+function M.remove_shebang(src)
+ local shebang = src:match("^#![^\r\n]*")
+ return shebang and (" "):rep(#shebang) .. src:sub(#shebang+1) or src
+end
+
+
+-- Custom version of loadstring that parses out line number info
+-- CATEGORY: Lua parsing
+function M.loadstring(src)
+ local f, err = loadstring(src, "")
+ if f then
+ return f
+ else
+ err = err:gsub('^%[string ""%]:', "")
+ local linenum = assert(err:match("(%d+):"))
+ local colnum = 0
+ local linenum2 = err:match("^%d+: '[^']+' expected %(to close '[^']+' at line (%d+)")
+ return nil, err, linenum, colnum, linenum2
+ end
+end
+
+
+-- helper for ast_from_string. Raises on error.
+-- FIX? filename currently ignored in Metalua
+-- CATEGORY: Lua parsing
+local function ast_from_string_helper(src, filename)
+ return mlc:src_to_ast(src, filename)
+end
+
+
+-- Counts number of lines in text.
+-- Warning: the decision of whether to count a trailing new-line in a file
+-- or an empty file as a line is a little subjective. This function currently
+-- defines the line count as 1 plus the number of new line characters.
+-- CATEGORY: utility/string
+local function linecount(text)
+ local n = 1
+ for _ in text:gmatch'\n' do
+ n = n + 1
+ end
+ return n
+end
+
+
+-- Converts Lua source string to Lua AST (via mlp/gg).
+-- CATEGORY: Lua parsing
+function M.ast_from_string(src, filename)
+ local ok, ast = pcall(ast_from_string_helper, src, filename)
+ if not ok then
+ local err = ast
+ err = err:match('[^\n]*')
+ err = err:gsub("^.-:%s*line", "line")
+ -- mlp.chunk prepending this is undesirable. error(msg,0) would be better in gg.lua. Reported.
+ -- TODO-Metalua: remove when fixed in Metalua.
+ local linenum, colnum = err:match("line (%d+), char (%d+)")
+ if not linenum then
+ -- Metalua libraries may return "...gg.lua:56: .../mlp_misc.lua:179: End-of-file expected"
+ -- without the normal line/char numbers given things like "if x then end end". Should be
+ -- fixed probably with gg.parse_error in _chunk in mlp_misc.lua.
+ -- TODO-Metalua: remove when fixed in Metalua.
+ linenum = linecount(src)
+ colnum = 1
+ end
+ local linenum2 = nil
+ return nil, err, linenum, colnum, linenum2
+ else
+ return ast
+ end
+end
+
+
+-- Simple comment parser. Returns Metalua-style comment.
+-- CATEGORY: Lua lexing
+local function quick_parse_comment(src)
+ local s = src:match"^%-%-([^\n]*)()\n$"
+ if s then return {s, 1, #src, 'short'} end
+ local _, s = src:match(lexer.lexer.patterns.long_comment .. '\r?\n?$')
+ if s then return {s, 1, #src, 'long'} end
+ return nil
+end
+--FIX:check new-line correctness
+--note: currently requiring \n at end of single line comment to avoid
+-- incremental compilation with `--x\nf()` and removing \n from still
+-- recognizing as comment `--x`.
+-- currently allowing \r\n at end of long comment since Metalua includes
+-- it in lineinfo of long comment (FIX:Metalua?)
+
+
+-- Gets length of longest prefix string in both provided strings.
+-- Returns max n such that text1:sub(1,n) == text2:sub(1,n) and n <= max(#text1,#text2)
+-- CATEGORY: string utility
+local function longest_prefix(text1, text2)
+ local nmin = 0
+ local nmax = math.min(#text1, #text2)
+ while nmax > nmin do
+ local nmid = math.ceil((nmin+nmax)/2)
+ if text1:sub(1,nmid) == text2:sub(1,nmid) then
+ nmin = nmid
+ else
+ nmax = nmid-1
+ end
+ end
+ return nmin
+end
+
+
+-- Gets length of longest postfix string in both provided strings.
+-- Returns max n such that text1:sub(-n) == text2:sub(-n) and n <= max(#text1,#text2)
+-- CATEGORY: string utility
+local function longest_postfix(text1, text2)
+ local nmin = 0
+ local nmax = math.min(#text1, #text2)
+ while nmax > nmin do
+ local nmid = math.ceil((nmin+nmax)/2)
+ if text1:sub(-nmid) == text2:sub(-nmid) then --[*]
+ nmin = nmid
+ else
+ nmax = nmid-1
+ end
+ end
+ return nmin
+end -- differs from longest_prefix only on line [*]
+
+
+
+-- Determines AST node that must be re-evaluated upon changing code string from
+-- `src` to `bsrc`, given previous top_ast/tokenlist/src.
+-- Note: decorates top_ast as side-effect.
+-- If preserve is true, then does not expand AST match even if replacement is invalid.
+-- CATEGORY: AST/tokenlist manipulation
+function M.invalidated_code(top_ast, tokenlist, src, bsrc, preserve)
+ -- Converts posiiton range in src to position range in bsrc.
+ local function range_transform(src_fpos, src_lpos)
+ local src_nlpos = #src - src_lpos
+ local bsrc_fpos = src_fpos
+ local bsrc_lpos = #bsrc - src_nlpos
+ return bsrc_fpos, bsrc_lpos
+ end
+
+ if src == bsrc then return end -- up-to-date
+
+ -- Find range of positions in src that differences correspond to.
+ -- Note: for zero byte range, src_pos2 = src_pos1 - 1.
+ local npre = longest_prefix(src, bsrc)
+ local npost = math.min(#src-npre, longest_postfix(src, bsrc))
+ -- note: min avoids overlap ambiguity
+ local src_fpos, src_lpos = 1 + npre, #src - npost
+
+ -- Find smallest AST node containing src range above. May also
+ -- be contained in (smaller) comment or whitespace.
+ local match_ast, match_comment, iswhitespace =
+ M.smallest_ast_containing_range(top_ast, tokenlist, src_fpos, src_lpos)
+ DEBUG('invalidate-smallest:', match_ast and (match_ast.tag or 'notag'), match_comment, iswhitespace)
+
+ -- Determine which (ast, comment, or whitespace) to match, and get its pos range in src and bsrc.
+ local srcm_fpos, srcm_lpos, bsrcm_fpos, bsrcm_lpos, mast, mtype
+ if iswhitespace then
+ mast, mtype = nil, 'whitespace'
+ srcm_fpos, srcm_lpos = src_fpos, src_lpos
+ elseif match_comment then
+ mast, mtype = match_comment, 'comment'
+ srcm_fpos, srcm_lpos = match_comment.fpos, match_comment.lpos
+ else
+ mast, mtype = match_ast, 'ast'
+ repeat
+ srcm_fpos, srcm_lpos = M.ast_pos_range(mast, tokenlist)
+ if not srcm_fpos then
+ if mast == top_ast then
+ srcm_fpos, srcm_lpos = 1, #src
+ break
+ else
+ M.ensure_parents_marked(top_ast)
+ mast = mast.parent
+ end
+ end
+ until srcm_fpos
+ end
+ bsrcm_fpos, bsrcm_lpos = range_transform(srcm_fpos, srcm_lpos)
+
+ -- Never expand match if preserve specified.
+ if preserve then
+ return srcm_fpos, srcm_lpos, bsrcm_fpos, bsrcm_lpos, mast, mtype
+ end
+
+ -- Determine if replacement could break parent nodes.
+ local isreplacesafe
+ if mtype == 'whitespace' then
+ if bsrc:sub(bsrcm_fpos, bsrcm_lpos):match'^%s*$' then -- replaced with whitespace
+ if bsrc:sub(bsrcm_fpos-1, bsrcm_lpos+1):match'%s' then -- not eliminating whitespace
+ isreplacesafe = true
+ end
+ end
+ elseif mtype == 'comment' then
+ local m2src = bsrc:sub(bsrcm_fpos, bsrcm_lpos)
+ DEBUG('invalidate-comment[' .. m2src .. ']')
+ if quick_parse_comment(m2src) then -- replaced with comment
+ isreplacesafe = true
+ end
+ end
+ if isreplacesafe then -- return on safe replacement
+ return srcm_fpos, srcm_lpos, bsrcm_fpos, bsrcm_lpos, mast, mtype
+ end
+
+ -- Find smallest containing statement block that will compile (or top_ast).
+ while 1 do
+ match_ast = M.get_containing_statementblock(match_ast, top_ast)
+ if match_ast == top_ast then
+ return 1,#src, 1, #bsrc, match_ast, 'statblock'
+ -- entire AST invalidated
+ end
+ local srcm_fpos, srcm_lpos = M.ast_pos_range(match_ast, tokenlist)
+ local bsrcm_fpos, bsrcm_lpos = range_transform(srcm_fpos, srcm_lpos)
+ local msrc = bsrc:sub(bsrcm_fpos, bsrcm_lpos)
+ DEBUG('invalidate-statblock:', match_ast and match_ast.tag, '[' .. msrc .. ']')
+ if loadstring(msrc) then -- compiled
+ return srcm_fpos, srcm_lpos, bsrcm_fpos, bsrcm_lpos, match_ast, 'statblock'
+ end
+ M.ensure_parents_marked(top_ast)
+ match_ast = match_ast.parent
+ end
+end
+
+
+-- Walks AST `ast` in arbitrary order, visiting each node `n`, executing `fdown(n)` (if specified)
+-- when doing down and `fup(n)` (if specified) when going if.
+-- CATEGORY: AST walk
+function M.walk(ast, fdown, fup)
+ assert(type(ast) == 'table')
+ if fdown then fdown(ast) end
+ for _,bast in ipairs(ast) do
+ if type(bast) == 'table' then
+ M.walk(bast, fdown, fup)
+ end
+ end
+ if fup then fup(ast) end
+end
+
+
+-- Replaces contents of table t1 with contents of table t2.
+-- Does not change metatable (if any).
+-- This function is useful for swapping one AST node with another
+-- while preserving any references to the node.
+-- CATEGORY: table utility
+function M.switchtable(t1, t2)
+ for k in pairs(t1) do t1[k] = nil end
+ for k in pairs(t2) do t1[k] = t2[k] end
+end
+
+
+-- Inserts all elements in list bt at index i in list t.
+-- CATEGORY: table utility
+local function tinsertlist(t, i, bt)
+ local oldtlen, delta = #t, i - 1
+ for ti = #t + 1, #t + #bt do t[ti] = false end -- preallocate (avoid holes)
+ for ti = oldtlen, i, -1 do t[ti + #bt] = t[ti] end -- shift
+ for bi = 1, #bt do t[bi + delta] = bt[bi] end -- fill
+end
+--[=[TESTSUITE:
+local function _tinsertlist(t, i, bt)
+ for bi=#bt,1,-1 do table.insert(t, i, bt[bi]) end
+end -- equivalent but MUCH less efficient for large tables
+local function _tinsertlist(t, i, bt)
+ for bi=1,#bt do table.insert(t, i+bi-1, bt[bi]) end
+end -- equivalent but MUCH less efficient for large tables
+local t = {}; tinsertlist(t, 1, {}); assert(table.concat(t)=='')
+local t = {}; tinsertlist(t, 1, {2,3}); assert(table.concat(t)=='23')
+local t = {4}; tinsertlist(t, 1, {2,3}); assert(table.concat(t)=='234')
+local t = {2}; tinsertlist(t, 2, {3,4}); assert(table.concat(t)=='234')
+local t = {4,5}; tinsertlist(t, 1, {2,3}); assert(table.concat(t)=='2345')
+local t = {2,5}; tinsertlist(t, 2, {3,4}); assert(table.concat(t)=='2345')
+local t = {2,3}; tinsertlist(t, 3, {4,5}); assert(table.concat(t)=='2345')
+print 'DONE'
+--]=]
+
+
+
+-- Gets list of keyword positions related to node ast in source src
+-- note: ast must be visible, i.e. have lineinfo (e.g. unlike `Id "self" definition).
+-- Note: includes operators.
+-- Note: Assumes ast Metalua-style lineinfo is valid.
+-- CATEGORY: tokenlist build
+function M.get_keywords(ast, src)
+ local list = {}
+ if not ast.lineinfo then return list end
+ -- examine space between each pair of children i and j.
+ -- special cases: 0 is before first child and #ast+1 is after last child
+
+ -- Put children in lexical order.
+ -- Some binary operations have arguments reversed from lexical order.
+ -- For example, `a > b` becomes `Op{'lt', `Id 'b', `Id 'a'}
+ local oast =
+ (ast.tag == 'Op' and #ast == 3 and tostring(ast[2].lineinfo.first):match('|L(%d+)') > tostring(ast[3].lineinfo.first):match('|L(%d+)'))
+ and {ast[1], ast[3], ast[2]} or ast
+
+ local i = 0
+ while i <= #ast do
+ -- j is node following i that has lineinfo
+ local j = i+1; while j < #ast+1 and not oast[j].lineinfo do j=j+1 end
+
+ -- Get position range [fpos,lpos] between subsequent children.
+ local fpos
+ if i == 0 then -- before first child
+ fpos = tonumber(tostring(ast.lineinfo.first):match('|L(%d+)'))
+ else
+ local last = oast[i].lineinfo.last; local c = last.comments
+ fpos = (c and #c > 0 and c[#c][3] or tostring(last):match('|L(%d+)')) + 1
+ end
+ local lpos
+ if j == #ast+1 then -- after last child
+ lpos = tonumber(tostring(ast.lineinfo.last):match('|L(%d+)'))
+ else
+ local first = oast[j].lineinfo.first; local c = first.comments
+ lpos = (c and #c > 0 and c[1][2] or tostring(first):match('|L(%d+)')) - 1
+ end
+
+ -- Find keyword in range.
+ local spos = fpos
+ repeat
+ local mfpos, tok, mlppos = src:match("^%s*()(%a+)()", spos)
+ if not mfpos then
+ mfpos, tok, mlppos = src:match("^%s*()(%p+)()", spos)
+ end
+ if mfpos then
+ local mlpos = mlppos-1
+ if mlpos > lpos then mlpos = lpos end
+ if mlpos >= mfpos then
+ list[#list+1] = mfpos
+ list[#list+1] = mlpos
+ end
+ end
+ spos = mlppos
+ until not spos or spos > lpos
+ -- note: finds single keyword. in `local function` returns only `local`
+ --DEBUG(i,j ,'test[' .. src:sub(fpos, lpos) .. ']')
+
+ i = j -- next
+
+ --DESIGN:Lua: comment: string.match accepts a start position but not a stop position
+ end
+ return list
+end
+-- Q:Metalua: does ast.lineinfo[loc].comments imply #ast.lineinfo[loc].comments > 0 ?
+
+
+
+-- Generates ordered list of tokens in top_ast/src.
+-- Note: currently ignores operators and parens.
+-- Note: Modifies ast.
+-- Note: Assumes ast Metalua-style lineinfo is valid.
+-- CATEGORY: AST/tokenlist query
+local isterminal = {Nil=true, Dots=true, True=true, False=true, Number=true, String=true,
+ Dots=true, Id=true}
+local function compare_tokens_(atoken, btoken) return atoken.fpos < btoken.fpos end
+function M.ast_to_tokenlist(top_ast, src)
+ local tokens = {} -- {nbytes=#src}
+ local isseen = {}
+ M.walk(top_ast, function(ast)
+ if isterminal[ast.tag] then -- Extract terminal
+ local token = ast
+ if ast.lineinfo then
+ token.fpos = tonumber(tostring(ast.lineinfo.first):match('|L(%d+)'))
+ token.lpos = tonumber(tostring(ast.lineinfo.last):match('|L(%d+)'))
+ token.ast = ast
+ table.insert(tokens, token)
+ end
+ else -- Extract non-terminal
+ local keywordposlist = M.get_keywords(ast, src)
+ for i=1,#keywordposlist,2 do
+ local fpos, lpos = keywordposlist[i], keywordposlist[i+1]
+ local toksrc = src:sub(fpos, lpos)
+ local token = {tag='Keyword', fpos=fpos, lpos=lpos, ast=ast, toksrc}
+ table.insert(tokens, token)
+ end
+ end
+ -- Extract comments
+ for i=1,2 do
+ local comments = ast.lineinfo and ast.lineinfo[i==1 and 'first' or 'last'].comments
+ if comments then for _, comment in ipairs(comments) do
+ if not isseen[comment] then
+ comment.tag = 'Comment'
+ local token = comment
+ token.fpos = tonumber(tostring(comment.lineinfo.first):match('|L(%d+)'))
+ token.lpos = tonumber(tostring(comment.lineinfo.last):match('|L(%d+)'))
+ token.ast = comment
+ table.insert(tokens, token)
+ isseen[comment] = true
+ end
+ end end
+ end
+ end, nil)
+ table.sort(tokens, compare_tokens_)
+ return tokens
+end
+
+
+-- Gets tokenlist range [fidx,lidx] covered by ast. Returns nil,nil if not found.
+--FIX:PERFORMANCE:this is slow on large files.
+-- CATEGORY: AST/tokenlist query
+function M.ast_idx_range_in_tokenlist(tokenlist, ast)
+ -- Get list of primary nodes under ast.
+ local isold = {}; M.walk(ast, function(ast) isold[ast] = true end)
+ -- Get range.
+ local fidx, lidx
+ for idx=1,#tokenlist do
+ local token = tokenlist[idx]
+ if isold[token.ast] then
+ lidx = idx
+ if not fidx then fidx = idx end
+ end
+ end
+ return fidx, lidx
+end
+
+
+-- Gets index range in tokenlist overlapped by character position range [fpos, lpos].
+-- For example, `do ff() end` with range ` ff() ` would match tokens `ff()`.
+-- Tokens partly inside range are counted, so range `f()` would match tokens `ff()`.
+-- If lidx = fidx - 1, then position range is whitespace between tokens lidx (on left)
+-- and fidx (on right), and this may include token pseudoindices 0 (start of file) and
+-- #tokenlist+1 (end of file).
+-- Note: lpos == fpos - 1 indicates zero-width range between chars lpos and fpos.
+-- CATEGORY: tokenlist query
+function M.tokenlist_idx_range_over_pos_range(tokenlist, fpos, lpos)
+ -- Find first/last indices of tokens overlapped (even partly) by position range.
+ local fidx, lidx
+ for idx=1,#tokenlist do
+ local token = tokenlist[idx]
+ --if (token.fpos >= fpos and token.fpos <= lpos) or (token.lpos >= fpos and token.lpos <= lpos) then -- token overlaps range
+ if fpos <= token.lpos and lpos >= token.fpos then -- range overlaps token (even partially)
+ if not fidx then fidx = idx end
+ lidx = idx
+ end
+ end
+ if not fidx then -- on fail, check between tokens
+ for idx=1,#tokenlist+1 do -- between idx-1 and idx
+ local tokfpos, toklpos = tokenlist[idx-1] and tokenlist[idx-1].lpos, tokenlist[idx] and tokenlist[idx].fpos
+ if (not tokfpos or fpos > tokfpos) and (not toklpos or lpos < toklpos) then -- range between tokens
+ return idx, idx-1
+ end
+ end
+ end
+ return fidx, lidx
+end
+--[=[TESTSUITE
+local function test(...)
+ return table.concat({M.tokenlist_idx_range_over_pos_range(...)}, ',')
+end
+check('==', test({}, 2, 2), "1,0") -- no tokens
+check('==', test({{tag='Id', fpos=1, lpos=1}}, 2, 2), "2,1") -- right of one token
+check('==', test({{tag='Id', fpos=3, lpos=3}}, 2, 2), "1,0") -- left of one token
+check('==', test({{tag='Id', fpos=3, lpos=4}}, 2, 3), "1,1") -- left partial overlap one token
+check('==', test({{tag='Id', fpos=3, lpos=4}}, 4, 5), "1,1") -- right partial overlap one token
+check('==', test({{tag='Id', fpos=3, lpos=6}}, 4, 5), "1,1") -- partial inner overlap one token
+check('==', test({{tag='Id', fpos=3, lpos=6}}, 3, 6), "1,1") -- exact overlap one token
+check('==', test({{tag='Id', fpos=4, lpos=5}}, 3, 6), "1,1") -- extra overlap one token
+check('==', test({{tag='Id', fpos=2, lpos=3}, {tag='Id', fpos=5, lpos=6}}, 4, 4), "2,1") -- between tokens, " " exact
+check('==', test({{tag='Id', fpos=2, lpos=3}, {tag='Id', fpos=5, lpos=6}}, 4, 3), "2,1") -- between tokens, "" on left
+check('==', test({{tag='Id', fpos=2, lpos=3}, {tag='Id', fpos=5, lpos=6}}, 5, 4), "2,1") -- between tokens, "" on right
+check('==', test({{tag='Id', fpos=2, lpos=3}, {tag='Id', fpos=4, lpos=5}}, 4, 3), "2,1") -- between tokens, "" exact
+--]=]
+
+-- Removes tokens in tokenlist covered by ast.
+-- CATEGORY: tokenlist manipulation
+local function remove_ast_in_tokenlist(tokenlist, ast)
+ local fidx, lidx = M.ast_idx_range_in_tokenlist(tokenlist, ast)
+ if fidx then -- note: fidx implies lidx
+ for idx=lidx,fidx,-1 do table.remove(tokenlist, idx) end
+ end
+end
+
+
+-- Inserts tokens from btokenlist into tokenlist. Preserves sort.
+-- CATEGORY: tokenlist manipulation
+local function insert_tokenlist(tokenlist, btokenlist)
+ local ftoken = btokenlist[1]
+ if ftoken then
+ -- Get index in tokenlist in which to insert tokens in btokenlist.
+ local fidx
+ for idx=1,#tokenlist do
+ if tokenlist[idx].fpos > ftoken.fpos then fidx = idx; break end
+ end
+ fidx = fidx or #tokenlist + 1 -- else append
+
+ -- Insert tokens.
+ tinsertlist(tokenlist, fidx, btokenlist)
+ end
+end
+
+
+-- Get character position range covered by ast in tokenlist. Returns nil,nil on not found.
+-- CATEGORY: AST/tokenlist query
+function M.ast_pos_range(ast, tokenlist) -- IMPROVE:style: ast_idx_range_in_tokenlist has params reversed
+ local fidx, lidx = M.ast_idx_range_in_tokenlist(tokenlist, ast)
+ if fidx then
+ return tokenlist[fidx].fpos, tokenlist[lidx].lpos
+ else
+ return nil, nil
+ end
+end
+
+
+-- Gets string representation of AST node. nil if none.
+-- IMPROVE: what if node is empty block?
+-- CATEGORY: AST/tokenlist query
+function M.ast_to_text(ast, tokenlist, src) -- IMPROVE:style: ast_idx_range_in_tokenlist has params reversed
+ local fpos, lpos = M.ast_pos_range(ast, tokenlist)
+ if fpos then
+ return src:sub(fpos, lpos)
+ else
+ return nil
+ end
+end
+
+
+
+-- Gets smallest AST node in top_ast/tokenlist/src
+-- completely containing position range [pos1, pos2].
+-- careful: "function" is not part of the `Function node.
+-- If range is inside comment, returns comment also.
+-- If range is inside whitespace, then returns true in third return value.
+-- CATEGORY: AST/tokenlist query
+function M.smallest_ast_containing_range(top_ast, tokenlist, pos1, pos2)
+ local f0idx, l0idx = M.tokenlist_idx_range_over_pos_range(tokenlist, pos1, pos2)
+
+ -- Find enclosing AST.
+ M.ensure_parents_marked(top_ast)
+ local fidx, lidx = f0idx, l0idx
+ while tokenlist[fidx] and not tokenlist[fidx].ast.parent do fidx = fidx - 1 end
+ while tokenlist[lidx] and not tokenlist[lidx].ast.parent do lidx = lidx + 1 end
+ -- DEBUG(fidx, lidx, f0idx, l0idx, #tokenlist, pos1, pos2, tokenlist[fidx], tokenlist[lidx])
+ local ast = not (tokenlist[fidx] and tokenlist[lidx]) and top_ast or
+ M.common_ast_parent(tokenlist[fidx].ast, tokenlist[lidx].ast, top_ast)
+ -- DEBUG('m2', tokenlist[fidx], tokenlist[lidx], top_ast, ast, ast and ast.tag)
+ if l0idx == f0idx - 1 then -- whitespace
+ return ast, nil, true
+ elseif l0idx == f0idx and tokenlist[l0idx].tag == 'Comment' then
+ return ast, tokenlist[l0idx], nil
+ else
+ return ast, nil, nil
+ end
+end
+--IMPROVE: handle string edits and maybe others
+
+
+-- Gets smallest statement block containing position pos or
+-- nearest statement block before pos, whichever is smaller, given ast/tokenlist.
+function M.current_statementblock(ast, tokenlist, pos)
+ local fidx,lidx = M.tokenlist_idx_range_over_pos_range(tokenlist, pos, pos)
+ if fidx > lidx then fidx = lidx end -- use nearest backward
+
+ -- Find closest AST node backward
+ while fidx >= 1 and tokenlist[fidx].tag == 'Comment' do fidx=fidx-1 end
+
+ if fidx < 1 then return ast, false end
+ local mast = tokenlist[fidx].ast
+ if not mast then return ast, false end
+ mast = M.get_containing_statementblock(mast, ast)
+ local isafter = false
+ if mast.tag2 ~= 'Block' then
+ local mfidx,mlidx = M.ast_idx_range_in_tokenlist(tokenlist, mast)
+ if pos > mlidx then
+ isafter = true
+ end
+ end
+
+ return mast, isafter
+end
+
+-- Gets index of bast in ast (nil if not found).
+-- CATEGORY: AST query
+function M.ast_idx(ast, bast)
+ for idx=1,#ast do
+ if ast[idx] == bast then return idx end
+ end
+ return nil
+end
+
+
+-- Gets parent of ast and index of ast in parent.
+-- Root node top_ast must also be provided. Returns nil, nil if ast is root.
+-- Note: may call mark_parents.
+-- CATEGORY: AST query
+function M.ast_parent_idx(top_ast, ast)
+ if ast == top_ast then return nil, nil end
+ M.ensure_parents_marked(top_ast); assert(ast.parent)
+ local idx = M.ast_idx(ast.parent, ast)
+ return ast.parent, idx
+end
+
+
+-- Gets common parent of aast and bast. Always returns value.
+-- Must provide root top_ast too.
+-- CATEGORY: AST query
+function M.common_ast_parent(aast, bast, top_ast)
+ M.ensure_parents_marked(top_ast)
+ local isparent = {}
+ local tast = bast; repeat isparent[tast] = true; tast = tast.parent until not tast
+ local uast = aast; repeat if isparent[uast] then return uast end; uast = uast.parent until not uast
+ assert(false)
+end
+
+
+-- Replaces old_ast with new_ast/new_tokenlist in top_ast/tokenlist.
+-- Note: assumes new_ast is a block. assumes old_ast is a statement or block.
+-- CATEGORY: AST/tokenlist
+function M.replace_statements(top_ast, tokenlist, old_ast, new_ast, new_tokenlist)
+ remove_ast_in_tokenlist(tokenlist, old_ast)
+ insert_tokenlist(tokenlist, new_tokenlist)
+ if old_ast == top_ast then -- special case: no parent
+ M.switchtable(old_ast, new_ast) -- note: safe since block is not in tokenlist.
+ else
+ local parent_ast, idx = M.ast_parent_idx(top_ast, old_ast)
+ table.remove(parent_ast, idx)
+ tinsertlist(parent_ast, idx, new_ast)
+ end
+
+ -- fixup annotations
+ for _,bast in ipairs(new_ast) do
+ if top_ast.tag2 then M.mark_tag2(bast, bast.tag == 'Do' and 'StatBlock' or 'Block') end
+ if old_ast.parent then M.mark_parents(bast, old_ast.parent) end
+ end
+end
+
+
+-- Adjusts lineinfo in tokenlist.
+-- All char positions starting at pos1 are shifted by delta number of chars.
+-- CATEGORY: tokenlist
+function M.adjust_lineinfo(tokenlist, pos1, delta)
+ for _,token in ipairs(tokenlist) do
+ if token.fpos >= pos1 then
+ token.fpos = token.fpos + delta
+ end
+ if token.lpos >= pos1 then
+ token.lpos = token.lpos + delta
+ end
+ end
+ --tokenlist.nbytes = tokenlist.nbytes + delta
+end
+
+
+-- For each node n in ast, sets n.parent to parent node of n.
+-- Assumes ast.parent will be parent_ast (may be nil)
+-- CATEGORY: AST query
+function M.mark_parents(ast, parent_ast)
+ ast.parent = parent_ast
+ for _,ast2 in ipairs(ast) do
+ if type(ast2) == 'table' then
+ M.mark_parents(ast2, ast)
+ end
+ end
+end
+
+
+-- Calls mark_parents(ast) if ast not marked.
+-- CATEGORY: AST query
+function M.ensure_parents_marked(ast)
+ if ast[1] and not ast[1].parent then M.mark_parents(ast) end
+end
+
+
+-- For each node n in ast, sets n.tag2 to context string:
+-- 'Block' - node is block
+-- 'Stat' - node is statement
+-- 'StatBlock' - node is statement and block (i.e. `Do)
+-- 'Exp' - node is expression
+-- 'Explist' - node is expression list (or identifier list)
+-- 'Pair' - node is key-value pair in table constructor
+-- note: ast.tag2 will be set to context.
+-- CATEGORY: AST query
+local iscertainstat = {Do=true, Set=true, While=true, Repeat=true, If=true,
+ Fornum=true, Forin=true, Local=true, Localrec=true, Return=true, Break=true}
+function M.mark_tag2(ast, context)
+ context = context or 'Block'
+ ast.tag2 = context
+ for i,bast in ipairs(ast) do
+ if type(bast) == 'table' then
+ local nextcontext
+ if bast.tag == 'Do' then
+ nextcontext = 'StatBlock'
+ elseif iscertainstat[bast.tag] then
+ nextcontext = 'Stat'
+ elseif bast.tag == 'Call' or bast.tag == 'Invoke' then
+ nextcontext = context == 'Block' and 'Stat' or 'Exp'
+ --DESIGN:Metalua: these calls actually contain expression lists,
+ -- but the expression list is not represented as a complete node
+ -- by Metalua (as blocks are in `Do statements)
+ elseif bast.tag == 'Pair' then
+ nextcontext = 'Pair'
+ elseif not bast.tag then
+ if ast.tag == 'Set' or ast.tag == 'Local' or ast.tag == 'Localrec'
+ or ast.tag == 'Forin' and i <= 2
+ or ast.tag == 'Function' and i == 1
+ then
+ nextcontext = 'Explist'
+ else
+ nextcontext = 'Block'
+ end
+ else
+ nextcontext = 'Exp'
+ end
+ M.mark_tag2(bast, nextcontext)
+ end
+ end
+end
+
+
+-- Gets smallest statement or block containing or being `ast`.
+-- The AST root node `top_ast` must also be provided.
+-- Note: may decorate AST as side-effect (mark_tag2/mark_parents).
+-- top_ast is assumed a block, so this is always successful.
+-- CATEGORY: AST query
+function M.get_containing_statementblock(ast, top_ast)
+ if not top_ast.tag2 then M.mark_tag2(top_ast) end
+ if ast.tag2 == 'Stat' or ast.tag2 == 'StatBlock' or ast.tag2 == 'Block' then
+ return ast
+ else
+ M.ensure_parents_marked(top_ast)
+ return M.get_containing_statementblock(ast.parent, top_ast)
+ end
+end
+
+
+-- Finds smallest statement, block, or comment AST in ast/tokenlist containing position
+-- range [fpos, lpos]. If allowexpand is true (default nil) and located AST
+-- coincides with position range, then next containing statement is used
+-- instead (this allows multiple calls to further expand the statement selection).
+-- CATEGORY: AST query
+function M.select_statementblockcomment(ast, tokenlist, fpos, lpos, allowexpand)
+--IMPROVE: rename ast to top_ast
+ local match_ast, comment_ast = M.smallest_ast_containing_range(ast, tokenlist, fpos, lpos)
+ local select_ast = comment_ast or M.get_containing_statementblock(match_ast, ast)
+ local nfpos, nlpos = M.ast_pos_range(select_ast, tokenlist)
+ --DEBUG('s', nfpos, nlpos, fpos, lpos, match_ast.tag, select_ast.tag)
+ if allowexpand and fpos == nfpos and lpos == nlpos then
+ if comment_ast then
+ -- Select enclosing statement.
+ select_ast = match_ast
+ nfpos, nlpos = M.ast_pos_range(select_ast, tokenlist)
+ else
+ -- note: multiple times may be needed to expand selection. For example, in
+ -- `for x=1,2 do f() end` both the statement `f()` and block `f()` have
+ -- the same position range.
+ M.ensure_parents_marked(ast)
+ while select_ast.parent and fpos == nfpos and lpos == nlpos do
+ select_ast = M.get_containing_statementblock(select_ast.parent, ast)
+ nfpos, nlpos = M.ast_pos_range(select_ast, tokenlist)
+ end
+ end
+ end
+ return nfpos, nlpos
+end
+
+
+-- Converts tokenlist to string representation for debugging.
+-- CATEGORY: tokenlist debug
+function M.dump_tokenlist(tokenlist)
+ local ts = {}
+ for i,token in ipairs(tokenlist) do
+ ts[#ts+1] = 'tok.' .. i .. ': [' .. token.fpos .. ',' .. token.lpos .. '] '
+ .. tostring(token[1]) .. ' ' .. tostring(token.ast.tag)
+ end
+ return table.concat(ts, '\n') -- .. 'nbytes=' .. tokenlist.nbytes .. '\n'
+end
+
+
+--FIX:Q: does this handle Unicode ok?
+
+--FIX?:Metalua: fails on string with escape sequence '\/'. The Reference Manual
+-- doesn't say this sequence is valid though.
+
+--FIX:Metalua: In `local --[[x]] function --[[y]] f() end`,
+-- 'x' comment omitted from AST.
+
+--FIX:Metalua: `do --[[x]] end` doesn't generate comments in AST.
+-- `if x then --[[x]] end` and `while 1 do --[[x]] end` generates
+-- comments in first/last of block
+
+--FIX:Metalua: `--[[x]] f() --[[y]]` returns lineinfo around `f()`.
+-- `--[[x]] --[[y]]` returns lineinfo around everything.
+
+--FIX:Metalua: `while 1 do --[[x]] --[[y]] end` returns first > last
+-- lineinfo for contained block
+
+--FIX:Metalua: search for "PATCHED:LuaInspect" in the metalualib folder.
+
+--FIX?:Metalua: loadstring parses "--x" but metalua omits the comment in the AST
+
+--FIX?:Metalua: `local x` is generating `Local{{`Id{x}}, {}}`, which
+-- has no lineinfo on {}. This is contrary to the Metalua
+-- spec: `Local{ {ident+} {expr+}? }.
+-- Other things like `self` also generate no lineinfo.
+-- The ast2.lineinfo above avoids this.
+
+--FIX:Metalua: Metalua shouldn't overwrite ipairs/pairs. Note: Metalua version
+-- doesn't set errorlevel correctly.
+
+--Q:Metalua: Why does `return --[[y]] z --[[x]]` have
+-- lineinfo.first.comments, lineinfo.last.comments,
+-- plus lineinfo.comments (which is the same as lineinfo.first.comments) ?
+
+--CAUTION:Metalua: `do f() end` returns lineinfo around `do f() end`, while
+-- `while 1 do f() end` returns lineinfo around `f()` for inner block.
+
+--CAUTION:Metalua: The lineinfo on Metalua comments is inconsistent with other
+-- nodes
+
+--CAUTION:Metalua: lineinfo of table in `f{}` is [3,2], of `f{ x,y }` it's [4,6].
+-- This is inconsistent with `x={}` which is [3,4] and `f""` which is [1,2]
+-- for the string.
+
+--CAUTION:Metalua: only the `function()` form of `Function includes `function`
+-- in lineinfo. 'function' is part of `Localrec and `Set in syntactic sugar form.
+
+
+--[=[TESTSUITE
+-- test longest_prefix/longest_postfix
+local function pr(text1, text2)
+ local lastv
+ local function same(v)
+ assert(not lastv or v == lastv); lastv = v; return v
+ end
+ local function test1(text1, text2) -- test prefix/postfix
+ same(longest_prefix(text1, text2))
+ same(longest_postfix(text1:reverse(), text2:reverse()))
+ end
+ local function test2(text1, text2) -- test swap
+ test1(text1, text2)
+ test1(text2, text1)
+ end
+ for _,extra in ipairs{"", "x", "xy", "xyz"} do -- test extra chars
+ test2(text1, text2..extra)
+ test2(text2, text1..extra)
+ end
+ return lastv
+end
+check('==', pr("",""), 0)
+check('==', pr("a",""), 0)
+check('==', pr("a","a"), 1)
+check('==', pr("ab",""), 0)
+check('==', pr("ab","a"), 1)
+check('==', pr("ab","ab"), 2)
+check('==', pr("abcdefg","abcdefgh"), 7)
+--]=]
+
+--[=[TESTSUITE
+print 'DONE'
+--]=]
+
+
+return M
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/compat_env.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/compat_env.lua
new file mode 100644
index 0000000..326b3b4
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/compat_env.lua
@@ -0,0 +1,390 @@
+--[[
+
+ compat_env v$(_VERSION) - Lua 5.1/5.2 environment compatibility functions
+
+SYNOPSIS
+
+ -- Get load/loadfile compatibility functions only if using 5.1.
+ local CL = pcall(load, '') and _G or require 'compat_env'
+ local load = CL.load
+ local loadfile = CL.loadfile
+
+ -- The following now works in both Lua 5.1 and 5.2:
+ assert(load('return 2*pi', nil, 't', {pi=math.pi}))()
+ assert(loadfile('ex.lua', 't', {print=print}))()
+
+ -- Get getfenv/setfenv compatibility functions only if using 5.2.
+ local getfenv = _G.getfenv or require 'compat_env'.getfenv
+ local setfenv = _G.setfenv or require 'compat_env'.setfenv
+ local function f() return x end
+ setfenv(f, {x=2})
+ print(x, getfenv(f).x) --> 2, 2
+
+DESCRIPTION
+
+ This module provides Lua 5.1/5.2 environment related compatibility functions.
+ This includes implementations of Lua 5.2 style `load` and `loadfile`
+ for use in Lua 5.1. It also includes Lua 5.1 style `getfenv` and `setfenv`
+ for use in Lua 5.2.
+
+API
+
+ local CL = require 'compat_env'
+
+ CL.load (ld [, source [, mode [, env] ] ]) --> f [, err]
+
+ This behaves the same as the Lua 5.2 `load` in both
+ Lua 5.1 and 5.2.
+ http://www.lua.org/manual/5.2/manual.html#pdf-load
+
+ CL.loadfile ([filename [, mode [, env] ] ]) --> f [, err]
+
+ This behaves the same as the Lua 5.2 `loadfile` in both
+ Lua 5.1 and 5.2.
+ http://www.lua.org/manual/5.2/manual.html#pdf-loadfile
+
+ CL.getfenv ([f]) --> t
+
+ This is identical to the Lua 5.1 `getfenv` in Lua 5.1.
+ This behaves similar to the Lua 5.1 `getfenv` in Lua 5.2.
+ When a global environment is to be returned, or when `f` is a
+ C function, this returns `_G` since Lua 5.2 doesn't have
+ (thread) global and C function environments. This will also
+ return `_G` if the Lua function `f` lacks an `_ENV`
+ upvalue, but it will raise an error if uncertain due to lack of
+ debug info. It is not normally considered good design to use
+ this function; when possible, use `load` or `loadfile` instead.
+ http://www.lua.org/manual/5.1/manual.html#pdf-getfenv
+
+ CL.setfenv (f, t)
+
+ This is identical to the Lua 5.1 `setfenv` in Lua 5.1.
+ This behaves similar to the Lua 5.1 `setfenv` in Lua 5.2.
+ This will do nothing if `f` is a Lua function that
+ lacks an `_ENV` upvalue, but it will raise an error if uncertain
+ due to lack of debug info. See also Design Notes below.
+ It is not normally considered good design to use
+ this function; when possible, use `load` or `loadfile` instead.
+ http://www.lua.org/manual/5.1/manual.html#pdf-setfenv
+
+DESIGN NOTES
+
+ This module intends to provide robust and fairly complete reimplementations
+ of the environment related Lua 5.1 and Lua 5.2 functions.
+ No effort is made, however, to simulate rare or difficult to simulate features,
+ such as thread environments, although this is liable to change in the future.
+ Such 5.1 capabilities are discouraged and ideally
+ removed from 5.1 code, thereby allowing your code to work in both 5.1 and 5.2.
+
+ In Lua 5.2, a `setfenv(f, {})`, where `f` lacks any upvalues, will be silently
+ ignored since there is no `_ENV` in this function to write to, and the
+ environment will have no effect inside the function anyway. However,
+ this does mean that `getfenv(setfenv(f, t))` does not necessarily equal `t`,
+ which is incompatible with 5.1 code (a possible workaround would be [1]).
+ If `setfenv(f, {})` has an upvalue but no debug info, then this will raise
+ an error to prevent inadvertently executing potentially untrusted code in the
+ global environment.
+
+ It is not normally considered good design to use `setfenv` and `getfenv`
+ (one reason they were removed in 5.2). When possible, consider replacing
+ these with `load` or `loadfile`, which are more restrictive and have native
+ implementations in 5.2.
+
+ This module might be merged into a more general Lua 5.1/5.2 compatibility
+ library (e.g. a full reimplementation of Lua 5.2 `_G`). However,
+ `load/loadfile/getfenv/setfenv` perhaps are among the more cumbersome
+ functions not to have.
+
+INSTALLATION
+
+ Download compat_env.lua:
+
+ wget https://raw.github.com/gist/1654007/compat_env.lua
+
+ Copy compat_env.lua into your LUA_PATH.
+
+ Alternately, unpack, test, and install into LuaRocks:
+
+ wget https://raw.github.com/gist/1422205/sourceunpack.lua
+ lua sourceunpack.lua compat_env.lua
+ (cd out && luarocks make)
+
+Related work
+
+ http://lua-users.org/wiki/LuaVersionCompatibility
+ https://github.com/stevedonovan/Penlight/blob/master/lua/pl/utils.lua
+ - penlight implementations of getfenv/setfenv
+ http://lua-users.org/lists/lua-l/2010-06/msg00313.html
+ - initial getfenv/setfenv implementation
+
+References
+
+ [1] http://lua-users.org/lists/lua-l/2010-06/msg00315.html
+
+Copyright
+
+(c) 2012 David Manura. Licensed under the same terms as Lua 5.1/5.2 (MIT license).
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+--]]---------------------------------------------------------------------
+
+local M = {_TYPE='module', _NAME='compat_env', _VERSION='0.2.20120124'}
+
+local function check_chunk_type(s, mode)
+ local nmode = mode or 'bt'
+ local is_binary = s and #s > 0 and s:byte(1) == 27
+ if is_binary and not nmode:match'b' then
+ return nil, ("attempt to load a binary chunk (mode is '%s')"):format(mode)
+ elseif not is_binary and not nmode:match't' then
+ return nil, ("attempt to load a text chunk (mode is '%s')"):format(mode)
+ end
+ return true
+end
+
+local IS_52_LOAD = pcall(load, '')
+if IS_52_LOAD then
+ M.load = _G.load
+ M.loadfile = _G.loadfile
+else
+ -- 5.2 style `load` implemented in 5.1
+ function M.load(ld, source, mode, env)
+ local f
+ if type(ld) == 'string' then
+ local s = ld
+ local ok, err = check_chunk_type(s, mode); if not ok then return ok, err end
+ local err; f, err = loadstring(s, source); if not f then return f, err end
+ elseif type(ld) == 'function' then
+ local ld2 = ld
+ if (mode or 'bt') ~= 'bt' then
+ local first = ld()
+ local ok, err = check_chunk_type(first, mode); if not ok then return ok, err end
+ ld2 = function()
+ if first then
+ local chunk=first; first=nil; return chunk
+ else return ld() end
+ end
+ end
+ local err; f, err = load(ld2, source); if not f then return f, err end
+ else
+ error(("bad argument #1 to 'load' (function expected, got %s)"):format(type(ld)), 2)
+ end
+ if env then setfenv(f, env) end
+ return f
+ end
+
+ -- 5.2 style `loadfile` implemented in 5.1
+ function M.loadfile(filename, mode, env)
+ if (mode or 'bt') ~= 'bt' then
+ local ioerr
+ local fh, err = io.open(filename, 'rb'); if not fh then return fh, err end
+ local function ld() local chunk; chunk,ioerr = fh:read(4096); return chunk end
+ local f, err = M.load(ld, filename and '@'..filename, mode, env)
+ fh:close()
+ if not f then return f, err end
+ if ioerr then return nil, ioerr end
+ return f
+ else
+ local f, err = loadfile(filename); if not f then return f, err end
+ if env then setfenv(f, env) end
+ return f
+ end
+ end
+end
+
+if _G.setfenv then -- Lua 5.1
+ M.setfenv = _G.setfenv
+ M.getfenv = _G.getfenv
+else -- >= Lua 5.2
+ -- helper function for `getfenv`/`setfenv`
+ local function envlookup(f)
+ local name, val
+ local up = 0
+ local unknown
+ repeat
+ up=up+1; name, val = debug.getupvalue(f, up)
+ if name == '' then unknown = true end
+ until name == '_ENV' or name == nil
+ if name ~= '_ENV' then
+ up = nil
+ if unknown then error("upvalues not readable in Lua 5.2 when debug info missing", 3) end
+ end
+ return (name == '_ENV') and up, val, unknown
+ end
+
+ -- helper function for `getfenv`/`setfenv`
+ local function envhelper(f, name)
+ if type(f) == 'number' then
+ if f < 0 then
+ error(("bad argument #1 to '%s' (level must be non-negative)"):format(name), 3)
+ elseif f < 1 then
+ error("thread environments unsupported in Lua 5.2", 3) --[*]
+ end
+ f = debug.getinfo(f+2, 'f').func
+ elseif type(f) ~= 'function' then
+ error(("bad argument #1 to '%s' (number expected, got %s)"):format(type(name, f)), 2)
+ end
+ return f
+ end
+ -- [*] might simulate with table keyed by coroutine.running()
+
+ -- 5.1 style `setfenv` implemented in 5.2
+ function M.setfenv(f, t)
+ local f = envhelper(f, 'setfenv')
+ local up, val, unknown = envlookup(f)
+ if up then
+ debug.upvaluejoin(f, up, function() return up end, 1) -- unique upvalue [*]
+ debug.setupvalue(f, up, t)
+ else
+ local what = debug.getinfo(f, 'S').what
+ if what ~= 'Lua' and what ~= 'main' then -- not Lua func
+ error("'setfenv' cannot change environment of given object", 2)
+ end -- else ignore no _ENV upvalue (warning: incompatible with 5.1)
+ end
+ end
+ -- [*] http://lua-users.org/lists/lua-l/2010-06/msg00313.html
+
+ -- 5.1 style `getfenv` implemented in 5.2
+ function M.getfenv(f)
+ if f == 0 or f == nil then return _G end -- simulated behavior
+ local f = envhelper(f, 'setfenv')
+ local up, val = envlookup(f)
+ if not up then return _G end -- simulated behavior [**]
+ return val
+ end
+ -- [**] possible reasons: no _ENV upvalue, C function
+end
+
+
+return M
+
+--[[ FILE rockspec.in
+
+package = 'compat_env'
+version = '$(_VERSION)-1'
+source = {
+ url = 'https://raw.github.com/gist/1654007/$(GITID)/compat_env.lua',
+ --url = 'https://raw.github.com/gist/1654007/compat_env.lua', -- latest raw
+ --url = 'https://gist.github.com/gists/1654007/download',
+ md5 = '$(MD5)'
+}
+description = {
+ summary = 'Lua 5.1/5.2 environment compatibility functions',
+ detailed = [=[
+ Provides Lua 5.1/5.2 environment related compatibility functions.
+ This includes implementations of Lua 5.2 style `load` and `loadfile`
+ for use in Lua 5.1. It also includes Lua 5.1 style `getfenv` and `setfenv`
+ for use in Lua 5.2.
+ ]=],
+ license = 'MIT/X11',
+ homepage = 'https://gist.github.com/1654007',
+ maintainer = 'David Manura'
+}
+dependencies = {} -- Lua 5.1 or 5.2
+build = {
+ type = 'builtin',
+ modules = {
+ ['compat_env'] = 'compat_env.lua'
+ }
+}
+
+--]]---------------------------------------------------------------------
+
+--[[ FILE test.lua
+
+-- test.lua - test suite for compat_env module.
+
+local CL = require 'compat_env'
+local load = CL.load
+local loadfile = CL.loadfile
+local setfenv = CL.setfenv
+local getfenv = CL.getfenv
+
+local function checkeq(a, b, e)
+ if a ~= b then error(
+ 'not equal ['..tostring(a)..'] ['..tostring(b)..'] ['..tostring(e)..']')
+ end
+end
+local function checkerr(pat, ok, err)
+ assert(not ok, 'checkerr')
+ assert(type(err) == 'string' and err:match(pat), err)
+end
+
+-- test `load`
+checkeq(load('return 2')(), 2)
+checkerr('expected near', load'return 2 2')
+checkerr('text chunk', load('return 2', nil, 'b'))
+checkerr('text chunk', load('', nil, 'b'))
+checkerr('binary chunk', load('\027', nil, 't'))
+checkeq(load('return 2*x',nil,'bt',{x=5})(), 10)
+checkeq(debug.getinfo(load('')).source, '')
+checkeq(debug.getinfo(load('', 'foo')).source, 'foo')
+
+-- test `loadfile`
+local fh = assert(io.open('tmp.lua', 'wb'))
+fh:write('return (...) or x')
+fh:close()
+checkeq(loadfile('tmp.lua')(2), 2)
+checkeq(loadfile('tmp.lua', 't')(2), 2)
+checkerr('text chunk', loadfile('tmp.lua', 'b'))
+checkeq(loadfile('tmp.lua', nil, {x=3})(), 3)
+checkeq(debug.getinfo(loadfile('tmp.lua')).source, '@tmp.lua')
+checkeq(debug.getinfo(loadfile('tmp.lua', 't', {})).source, '@tmp.lua')
+os.remove'tmp.lua'
+
+-- test `setfenv`/`getfenv`
+x = 5
+local a,b=true; local function f(c) if a then return x,b,c end end
+setfenv(f, {x=3})
+checkeq(f(), 3)
+checkeq(getfenv(f).x, 3)
+checkerr('cannot change', pcall(setfenv, string.len, {})) -- C function
+checkeq(getfenv(string.len), _G) -- C function
+local function g()
+ setfenv(1, {x=4})
+ checkeq(getfenv(1).x, 4)
+ return x
+end
+checkeq(g(), 4) -- numeric level
+if _G._VERSION ~= 'Lua 5.1' then
+ checkerr('unsupported', pcall(setfenv, 0, {}))
+end
+checkeq(getfenv(0), _G)
+checkeq(getfenv(), _G) -- no arg
+checkeq(x, 5) -- main unaltered
+setfenv(function()end, {}) -- no upvalues, ignore
+checkeq(getfenv(function()end), _G) -- no upvaluse
+if _G._VERSION ~= 'Lua 5.1' then
+ checkeq(getfenv(setfenv(function()end, {})), _G) -- warning: incompatible with 5.1
+end
+x = nil
+
+print 'OK'
+
+--]]---------------------------------------------------------------------
+
+--[[ FILE CHANGES.txt
+0.2.20120124
+ Renamed module to compat_env (from compat_load)
+ Add getfenv/setfenv functions
+
+0.1.20120121
+ Initial public release
+--]]
+
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/dump.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/dump.lua
new file mode 100644
index 0000000..6a6e980
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/dump.lua
@@ -0,0 +1,90 @@
+-- Recursive object dumper, for debugging.
+-- (c) 2010 David Manura, MIT License.
+
+local M = {}
+
+-- My own object dumper.
+-- Intended for debugging, not serialization, with compact formatting.
+-- Robust against recursion.
+-- Renders Metalua table tag fields specially {tag=X, ...} --> "`X{...}".
+-- On first call, only pass parameter o.
+-- CATEGORY: AST debug
+local ignore_keys_ = {lineinfo=true}
+local norecurse_keys_ = {parent=true, ast=true}
+local function dumpstring_key_(k, isseen, newindent)
+ local ks = type(k) == 'string' and k:match'^[%a_][%w_]*$' and k or
+ '[' .. M.dumpstring(k, isseen, newindent) .. ']'
+ return ks
+end
+local function sort_keys_(a, b)
+ if type(a) == 'number' and type(b) == 'number' then
+ return a < b
+ elseif type(a) == 'number' then
+ return false
+ elseif type(b) == 'number' then
+ return true
+ elseif type(a) == 'string' and type(b) == 'string' then
+ return a < b
+ else
+ return tostring(a) < tostring(b) -- arbitrary
+ end
+end
+function M.dumpstring(o, isseen, indent, key)
+ isseen = isseen or {}
+ indent = indent or ''
+
+ if type(o) == 'table' then
+ if isseen[o] or norecurse_keys_[key] then
+ return (type(o.tag) == 'string' and '`' .. o.tag .. ':' or '') .. tostring(o)
+ else isseen[o] = true end -- avoid recursion
+
+ local used = {}
+
+ local tag = o.tag
+ local s = '{'
+ if type(o.tag) == 'string' then
+ s = '`' .. tag .. s; used['tag'] = true
+ end
+ local newindent = indent .. ' '
+
+ local ks = {}; for k in pairs(o) do ks[#ks+1] = k end
+ table.sort(ks, sort_keys_)
+ --for i,k in ipairs(ks) do print ('keys', k) end
+
+ local forcenummultiline
+ for k in pairs(o) do
+ if type(k) == 'number' and type(o[k]) == 'table' then forcenummultiline = true end
+ end
+
+ -- inline elements
+ for _,k in ipairs(ks) do
+ if used[k] then -- skip
+ elseif ignore_keys_[k] then used[k] = true
+ elseif (type(k) ~= 'number' or not forcenummultiline) and
+ type(k) ~= 'table' and (type(o[k]) ~= 'table' or norecurse_keys_[k])
+ then
+ s = s .. dumpstring_key_(k, isseen, newindent) .. '=' .. M.dumpstring(o[k], isseen, newindent, k) .. ', '
+ used[k] = true
+ end
+ end
+
+ -- elements on separate lines
+ local done
+ for _,k in ipairs(ks) do
+ if not used[k] then
+ if not done then s = s .. '\n'; done = true end
+ s = s .. newindent .. dumpstring_key_(k, isseen) .. '=' .. M.dumpstring(o[k], isseen, newindent, k) .. ',\n'
+ end
+ end
+ s = s:gsub(',(%s*)$', '%1')
+ s = s .. (done and indent or '') .. '}'
+ return s
+ elseif type(o) == 'string' then
+ return string.format('%q', o)
+ else
+ return tostring(o)
+ end
+end
+
+return M
+
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/globals.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/globals.lua
new file mode 100644
index 0000000..0730909
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/globals.lua
@@ -0,0 +1,222 @@
+-- LuaInspect.globals - identifier scope analysis
+-- Locates locals, globals, and their definitions.
+--
+-- (c) D.Manura, 2008-2010, MIT license.
+
+-- based on http://lua-users.org/wiki/DetectingUndefinedVariables
+
+local M = {}
+
+--! require 'luainspect.typecheck' (context)
+
+local LA = require "luainspect.ast"
+
+local function definelocal(scope, name, ast)
+ if scope[name] then
+ scope[name].localmasked = true
+ ast.localmasking = scope[name]
+ end
+ scope[name] = ast
+ if name == '_' then ast.isignore = true end
+end
+
+-- Resolves scoping and usages of variable in AST.
+-- Data Notes:
+-- ast.localdefinition refers to lexically scoped definition of `Id node `ast`.
+-- If ast.localdefinition == ast then ast is a "lexical definition".
+-- If ast.localdefinition == nil, then variable is global.
+-- ast.functionlevel is the number of functions the AST is contained in.
+-- ast.functionlevel is defined iff ast is a lexical definition.
+-- ast.isparam is true iff ast is a lexical definition and a function parameter.
+-- ast.isset is true iff ast is a lexical definition and exists an assignment on it.
+-- ast.isused is true iff ast is a lexical definition and has been referred to.
+-- ast.isignore is true if local variable should be ignored (e.g. typically "_")
+-- ast.localmasking - for a lexical definition, this is set to the lexical definition
+-- this is masking (i.e. same name). nil if not masking.
+-- ast.localmasked - true iff lexical definition masked by another lexical definition.
+-- ast.isfield is true iff `String node ast is used for field access on object,
+-- e.g. x.y or x['y'].z
+-- ast.previous - For `Index{o,s} or `Invoke{o,s,...}, s.previous == o
+local function traverse(ast, scope, globals, level, functionlevel)
+ scope = scope or {}
+
+ local blockrecurse
+ ast.level = level
+
+ -- operations on walking down the AST
+ if ast.tag == 'Local' then
+ blockrecurse = 1
+ -- note: apply new scope after processing values
+ elseif ast.tag == 'Localrec' then
+ local namelist_ast, valuelist_ast = ast[1], ast[2]
+ for _,value_ast in ipairs(namelist_ast) do
+ assert(value_ast.tag == 'Id')
+ local name = value_ast[1]
+ local parentscope = getmetatable(scope).__index
+ definelocal(parentscope, name, value_ast)
+ value_ast.localdefinition = value_ast
+ value_ast.functionlevel = functionlevel
+ value_ast.level = level+1
+ end
+ blockrecurse = 1
+ elseif ast.tag == 'Id' then
+ local name = ast[1]
+ if scope[name] then
+ ast.localdefinition = scope[name]
+ ast.functionlevel = functionlevel
+ scope[name].isused = true
+ else -- global, do nothing
+ end
+ elseif ast.tag == 'Function' then
+ local paramlist_ast, body_ast = ast[1], ast[2]
+ functionlevel = functionlevel + 1
+ for _,param_ast in ipairs(paramlist_ast) do
+ local name = param_ast[1]
+ assert(param_ast.tag == 'Id' or param_ast.tag == 'Dots')
+ if param_ast.tag == 'Id' then
+ definelocal(scope, name, param_ast)
+ param_ast.localdefinition = param_ast
+ param_ast.functionlevel = functionlevel
+ param_ast.isparam = true
+ end
+ param_ast.level = level+1
+ end
+ blockrecurse = 1
+ elseif ast.tag == 'Set' then
+ local reflist_ast, valuelist_ast = ast[1], ast[2]
+ for _,ref_ast in ipairs(reflist_ast) do
+ if ref_ast.tag == 'Id' then
+ local name = ref_ast[1]
+ if scope[name] then
+ scope[name].isset = true
+ else
+ if not globals[name] then
+ globals[name] = {set=ref_ast}
+ end
+ end
+ end
+ ref_ast.level = level+1
+ end
+ --ENHANCE? We could differentiate assignments to x (which indicates that
+ -- x is not const) and assignments to a member of x (which indicates that
+ -- x is not a pointer to const) and assignments to any nested member of x
+ -- (which indicates that x it not a transitive const).
+ elseif ast.tag == 'Fornum' then
+ blockrecurse = 1
+ elseif ast.tag == 'Forin' then
+ blockrecurse = 1
+ end
+
+ -- recurse (depth-first search down the AST)
+ if ast.tag == 'Repeat' then
+ local block_ast, cond_ast = ast[1], ast[2]
+ local scope = scope
+ for _,stat_ast in ipairs(block_ast) do
+ scope = setmetatable({}, {__index = scope})
+ traverse(stat_ast, scope, globals, level+1, functionlevel)
+ end
+ scope = setmetatable({}, {__index = scope})
+ traverse(cond_ast, scope, globals, level+1, functionlevel)
+ elseif ast.tag == 'Fornum' then
+ local name_ast, block_ast = ast[1], ast[#ast]
+ -- eval value list in current scope
+ for i=2, #ast-1 do traverse(ast[i], scope, globals, level+1, functionlevel) end
+ -- eval body in next scope
+ local name = name_ast[1]
+ definelocal(scope, name, name_ast)
+ name_ast.localdefinition = name_ast
+ name_ast.functionlevel = functionlevel
+ traverse(block_ast, scope, globals, level+1, functionlevel)
+ elseif ast.tag == 'Forin' then
+ local namelist_ast, vallist_ast, block_ast = ast[1], ast[2], ast[3]
+ -- eval value list in current scope
+ traverse(vallist_ast, scope, globals, level+1, functionlevel)
+ -- eval body in next scope
+ for _,name_ast in ipairs(namelist_ast) do
+ local name = name_ast[1]
+ definelocal(scope, name, name_ast)
+ name_ast.localdefinition = name_ast
+ name_ast.functionlevel = functionlevel
+ name_ast.level = level+1
+ end
+ traverse(block_ast, scope, globals, level+1, functionlevel)
+ else -- normal
+ for i,v in ipairs(ast) do
+ if i ~= blockrecurse and type(v) == 'table' then
+ local scope = setmetatable({}, {__index = scope})
+ traverse(v, scope, globals, level+1, functionlevel)
+ end
+ end
+ end
+
+ -- operations on walking up the AST
+ if ast.tag == 'Local' then
+ -- Unlike Localrec, variables come into scope after evaluating values.
+ local namelist_ast, valuelist_ast = ast[1], ast[2]
+ for _,name_ast in ipairs(namelist_ast) do
+ assert(name_ast.tag == 'Id')
+ local name = name_ast[1]
+ local parentscope = getmetatable(scope).__index
+ definelocal(parentscope, name, name_ast)
+ name_ast.localdefinition = name_ast
+ name_ast.functionlevel = functionlevel
+ name_ast.level = level+1
+ end
+ elseif ast.tag == 'Index' then
+ if ast[2].tag == 'String' then
+ ast[2].isfield = true
+ ast[2].previous = ast[1]
+ end
+ elseif ast.tag == 'Invoke' then
+ assert(ast[2].tag == 'String')
+ ast[2].isfield = true
+ ast[2].previous = ast[1]
+ end
+end
+
+function M.globals(ast)
+ -- Default list of defined variables.
+ local scope = setmetatable({}, {})
+ local globals = {}
+ traverse(ast, scope, globals, 1, 1) -- Start check.
+
+ return globals
+end
+
+
+-- Gets locals in scope of statement of block ast. If isafter is true and ast is statement,
+-- uses scope just after statement ast.
+-- Assumes 'parent' attributes on ast are marked.
+-- Returns table mapping name -> AST local definition.
+function M.variables_in_scope(ast, isafter)
+ local scope = {}
+ local cast = ast
+ while cast.parent do
+ local midx = LA.ast_idx(cast.parent, cast)
+ for idx=1,midx do
+ local bast = cast.parent[idx]
+ if bast.tag == 'Localrec' or bast.tag == 'Local' and (idx < midx or isafter) then
+ local names_ast = bast[1]
+ for bidx=1,#names_ast do
+ local name_ast = names_ast[bidx]
+ local name = name_ast[1]
+ scope[name] = name_ast
+ end
+ elseif cast ~= ast and (bast.tag == 'For' or bast.tag == 'Forin' or bast.tag == 'Function') then
+ local names_ast = bast[1]
+ for bidx=1,#names_ast do
+ local name_ast = names_ast[bidx]
+ if name_ast.tag == 'Id' then --Q: or maybe `Dots should be included
+ local name = name_ast[1]
+ scope[name] = name_ast
+ end
+ end
+ end
+ end
+ cast = cast.parent
+ end
+ return scope
+end
+
+
+return M
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/init.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/init.lua
new file mode 100644
index 0000000..bab48fa
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/init.lua
@@ -0,0 +1,1454 @@
+-- luainspect.init - core LuaInspect source analysis.
+--
+-- This module is a bit more high level than luainspect.ast. It deals more with
+-- interpretation/inference of semantics of an AST. It also uses luainspect.globals,
+-- which does the basic semantic interpretation of globals/locals.
+--
+-- (c) 2010 David Manura, MIT License.
+
+local M = {}
+
+-- This is the API version. It is an ISO8601 date expressed as a fraction.
+M.APIVERSION = 0.20100805
+
+local LA = require "luainspect.ast"
+local LD = require "luainspect.dump"
+local LG = require "luainspect.globals"
+local LS = require "luainspect.signatures"
+local T = require "luainspect.types"
+local COMPAT = require "luainspect.compat_env"
+
+--! require 'luainspect.typecheck' (context)
+
+local ENABLE_RETURN_ANALYSIS = true
+local DETECT_DEADCODE = false -- may require more validation (false positives)
+
+
+-- Functional forms of Lua operators.
+-- Note: variable names like _1 are intentional. These affect debug info and
+-- will display in any error messages.
+local ops = {}
+ops['add'] = function(_1,_2) return _1+_2 end
+ops['sub'] = function(_1,_2) return _1-_2 end
+ops['mul'] = function(_1,_2) return _1*_2 end
+ops['div'] = function(_1,_2) return _1/_2 end
+ops['mod'] = function(_1,_2) return _1%_2 end
+ops['pow'] = function(_1,_2) return _1^_2 end
+ops['concat'] = function(_1,_2) return _1.._2 end
+ops['eq'] = function(_1,_2) return _1==_2 end
+ops['lt'] = function(_1,_2) return _1<_2 end
+ops['le'] = function(_1,_2) return _1<=_2 end
+ops['and'] = function(_1,_2) return _1 and _2 end
+ops['or'] = function(_1,_2) return _1 or _2 end
+ops['not'] = function(_1) return not _1 end
+ops['len'] = function(_1) return #_1 end
+ops['unm'] = function(_1) return -_1 end
+
+
+-- Performs binary operation. Supports types.
+local function dobinop(opid, a, b)
+ if (a == T.number or b == T.number) and
+ (a == T.number or type(a) == 'number' ) and
+ (b == T.number or type(b) == 'number' )
+ then
+ if opid == 'eq' or opid == 'lt' or opid == 'le' then
+ return T.boolean
+ elseif opid == 'concat' then
+ return T.string
+ else
+ return T.number
+ end
+ elseif (a == T.string or b == T.string) and
+ (a == T.string or type(a) == 'string' ) and
+ (b == T.string or type(b) == 'string' )
+ then
+ if opid == 'concat' or opid == 'and' or opid == 'or' then
+ return T.string
+ elseif opid == 'eq' or opid == 'lt' or opid == 'le' then
+ return T.boolean
+ else
+ return T.number
+ end
+ elseif (a == T.boolean or b == T.boolean) and
+ (a == T.boolean or type(a) == 'boolean' ) and
+ (b == T.boolean or type(b) == 'boolean' )
+ then
+ if opid == 'eq' or opid == 'and' or opid == 'or' then
+ return T.boolean
+ else
+ error('invalid operation on booleans: ' .. opid, 0)
+ end
+ elseif T.istype[a] or T.istype[b] then
+ return T.universal
+ else
+ return ops[opid](a, b)
+ end
+end
+
+
+-- Performs unary operation. Supports types.
+local function dounop(opid, a)
+ if opid == 'not' then
+ if T.istype[a] then
+ return T.boolean
+ else
+ return ops[opid](a)
+ end
+ elseif a == T.number then
+ if opid == 'unm' then
+ return T.number
+ else -- 'len'
+ error('invalid operation on number: ' .. opid, 0)
+ end
+ elseif a == T.string then
+ return T.number
+ elseif a == T.boolean then
+ error('invalid operation on boolean: ' .. opid, 0)
+ elseif T.istype[a] then
+ return nil, 'unknown'
+ else
+ return ops[opid](a)
+ end
+end
+
+-- Like info in debug.getinfo but inferred by static analysis.
+-- object -> {fpos=fpos, source="@" .. source, fast=ast, tokenlist=tokenlist}
+-- Careful: value may reference key (affects pre-5.2 which lacks emphemerons).
+-- See also ast.nocollect.
+M.debuginfo = setmetatable({}, {__mode='v'})
+
+-- Modules loaded via require_inspect.
+-- module name string -> {return value, AST node}
+-- note: AST node is maintained to prevent nocollect fields in ast being collected.
+-- note: not a weak table.
+M.package_loaded = {}
+
+-- Stringifies interpreted value for debugging.
+-- CATEGORY: debug
+local function debugvalue(ast)
+ local s
+ if ast then
+ s = ast.value ~= T.universal and 'known:' .. tostring(ast.value) or 'unknown'
+ else
+ s = '?'
+ end
+ return s
+end
+
+
+-- Reads contents of text file in path, in binary mode.
+-- On error, returns nil and error message.
+local function readfile(path)
+ local fh, err = io.open(path, 'rb')
+ if fh then
+ local data; data, err = fh:read'*a'
+ if data then return data end
+ end
+ return nil, err
+end
+
+-- Similar to string.gsub but with plain replacement (similar to option in string.match)
+-- http://lua-users.org/lists/lua-l/2002-04/msg00118.html
+-- CATEGORY: utility/string
+local function plain_gsub(s, pattern, repl)
+ repl = repl:gsub('(%%)', '%%%%')
+ return s:gsub(pattern, repl)
+end
+
+-- Infer name of variable or literal that AST node represents.
+-- This is for debugging messages.
+local function infer_name(ast)
+ if ast == nil then return nil
+ elseif ast.tag == 'Id' then return "'"..ast[1].."'"
+ elseif ast.tag == 'Number' then return 'number'
+ elseif ast.tag == 'String' then return 'string'
+ elseif ast.tag == 'True' then return 'true'
+ elseif ast.tag == 'False' then return 'false'
+ elseif ast.tag == 'Nil' then return 'nil'
+ else return nil end
+end
+
+--[[
+ This is like `pcall` but any error string returned does not contain the
+ "chunknamem:currentline: " prefix (based on luaL_where) if the error occurred
+ in the current file. This avoids error messages in user code (f)
+ being reported as being inside this module if this module calls user code.
+ Also, local variable names _1, _2, etc. in error message are replaced with names
+ inferred (if any) from corresponding AST nodes in list `asts` (note: nil's in asts skip replacement).
+--]]
+local _prefix
+local _clean
+local function pzcall(f, asts, ...)
+ _prefix = _prefix or select(2, pcall(function() error'' end)):gsub(':%d+: *$', '') -- note: specific to current file.
+ _clean = _clean or function(asts, ok, ...)
+ if ok then return true, ...
+ else
+ local err = ...
+ if type(err) == 'string' then
+ if err:sub(1,#_prefix) == _prefix then
+ local more = err:match('^:%d+: *(.*)', #_prefix+1)
+ if more then
+ err = more
+ err = err:gsub([[local '_(%d+)']], function(name) return infer_name(asts[tonumber(name)]) end)
+ end
+ end
+ end
+ return ok, err
+ end
+ end
+ return _clean(asts, pcall(f, ...))
+end
+
+-- Loads source code of given module name.
+-- Returns code followed by path.
+-- note: will also search in the directory `spath` and its parents.
+-- This should preferrably be an absolute path or it might not work correctly.
+-- It must be slash terminated.
+-- CATEGORY: utility/package
+local function load_module_source(name, spath)
+ -- Append parent directories to list of paths to search.
+ local package_path = package.path
+ local ppath = spath
+ repeat
+ package_path = package_path .. ';' .. ppath .. '?.lua;' .. ppath .. '?/init.lua'
+ local nsub
+ ppath, nsub = ppath:gsub('[^\\/]+[\\/]$', '')
+ until nsub == 0
+
+ for spec in package_path:gmatch'[^;]+' do
+ local testpath = plain_gsub(spec, '%?', (name:gsub('%.', '/')))
+ local src, err_ = readfile(testpath)
+ if src then return src, testpath end
+ end
+ return nil
+end
+
+
+-- Clears global state.
+-- This includes cached inspected modules.
+function M.clear_cache()
+ for k,v in pairs(M.package_loaded) do
+ M.package_loaded[k] = nil
+ end
+end
+
+
+-- Gets all keywords related to AST `ast`, where `top_ast` is the root of `ast`
+-- and `src` is source code of `top_ast`
+-- Related keywords are defined as all keywords directly associated with block containing node
+-- `ast`. Furthermore, break statements are related to containing loop statements,
+-- and return statements are related to containing function statement (if any).
+-- function declaration syntactic sugar is handled specially too to ensure the 'function' keyword
+-- is highlighted even though it may be outside of the `Function AST.
+--
+-- Returns token list or nil if not applicable. Returned `ast` is AST containing related keywords.
+-- CATEGORY: keyword comprehension
+local iskeystat = {Do=true, While=true, Repeat=true, If=true, Fornum=true, Forin=true,
+ Local=true, Localrec=true, Return=true, Break=true, Function=true,
+ Set=true -- note: Set for `function name`
+}
+local isloop = {While=true, Repeat=true, Fornum=true, Forin=true}
+local isblock = {Do=true, While=true, Repeat=true, If=true, Fornum=true, Forin=true, Function=true}
+function M.related_keywords(ast, top_ast, tokenlist, src)
+ -- Expand or contract AST for certain contained statements.
+ local more
+ if ast.tag == 'Return' then
+ -- if `return` selected, that consider containing function selected (if any)
+ if not ast.parent then LA.mark_parents(top_ast) end
+ local ancestor_ast = ast.parent
+ while ancestor_ast ~= nil and ancestor_ast.tag ~= 'Function' do
+ ancestor_ast = ancestor_ast.parent
+ end
+ if ancestor_ast then ast = ancestor_ast end -- but only change if exists
+ elseif ast.tag == 'Break' then
+ -- if `break` selected, that consider containing loop selected
+ if not ast.parent then LA.mark_parents(top_ast) end
+ local ancestor_ast = ast.parent
+ while ancestor_ast ~= nil and not isloop[ancestor_ast.tag] do
+ ancestor_ast = ancestor_ast.parent
+ end
+ ast = ancestor_ast
+ elseif ast.tag == 'Set' then
+ local val1_ast = ast[2][1]
+ if val1_ast.tag == 'Function' then
+ local token = tokenlist[LA.ast_idx_range_in_tokenlist(tokenlist, ast)]
+ if token.tag == 'Keyword' and token[1] == 'function' then -- function with syntactic sugar `function f`
+ ast = ast[2][1] -- select `Function node
+ else
+ more = true
+ end
+ else
+ more = true
+ end
+ elseif ast.tag == 'Localrec' and ast[2][1].tag == 'Function' then
+ -- if `local function f` selected, which becomes a `Localrec, consider `Function node.
+ ast = ast[2][1]
+ --IMPROVE: only contract ast if `function` part of `local function` is selected.
+ else
+ more = true
+ end
+ if more then -- not yet handled
+ -- Consider containing block.
+ if not ast.parent then LA.mark_parents(top_ast) end
+ local ancestor_ast = ast
+ while ancestor_ast ~= top_ast and not isblock[ancestor_ast.tag] do
+ ancestor_ast = ancestor_ast.parent
+ end
+ ast = ancestor_ast
+ end
+
+ -- keywords in statement/block.
+ if iskeystat[ast.tag] then
+ local keywords = {}
+ for i=1,#tokenlist do
+ local token = tokenlist[i]
+ if token.ast == ast and token.tag == 'Keyword' then
+ keywords[#keywords+1] = token
+ end
+ end
+
+ -- Expand keywords for certaining statements.
+ if ast.tag == 'Function' then
+ -- if `Function, also select 'function' and 'return' keywords
+ local function f(ast)
+ for _,cast in ipairs(ast) do
+ if type(cast) == 'table' then
+ if cast.tag == 'Return' then
+ local token = tokenlist[LA.ast_idx_range_in_tokenlist(tokenlist, cast)]
+ keywords[#keywords+1] = token
+ elseif cast.tag ~= 'Function' then f(cast) end
+ end
+ end
+ end
+ f(ast)
+ if not ast.parent then LA.mark_parents(top_ast) end
+ local grand_ast = ast.parent.parent
+ if grand_ast.tag == 'Set' then
+ local token = tokenlist[LA.ast_idx_range_in_tokenlist(tokenlist, grand_ast)]
+ if token.tag == 'Keyword' and token[1] == 'function' then
+ keywords[#keywords+1] = token
+ end
+ elseif grand_ast.tag == 'Localrec' then
+ local tidx = LA.ast_idx_range_in_tokenlist(tokenlist, grand_ast)
+ repeat tidx = tidx + 1 until not tokenlist[tidx] or (tokenlist[tidx].tag == 'Keyword' and tokenlist[tidx][1] == 'function')
+ local token = tokenlist[tidx]
+ keywords[#keywords+1] = token
+ end
+ elseif isloop[ast.tag] then
+ -- if loop, also select 'break' keywords
+ local function f(ast)
+ for _,cast in ipairs(ast) do
+ if type(cast) == 'table' then
+ if cast.tag == 'Break' then
+ local tidx = LA.ast_idx_range_in_tokenlist(tokenlist, cast)
+ keywords[#keywords+1] = tokenlist[tidx]
+ elseif not isloop[cast.tag] then f(cast) end
+ end
+ end
+ end
+ f(ast)
+ end
+
+ return keywords, ast
+ end
+ return nil, ast
+end
+
+
+-- Mark tokenlist (top_ast/tokenlist/src) with keywordid AST attributes.
+-- All keywords related to each other have the same keyword ID integer.
+-- NOTE: This is not done/undone by inspect/uninspect.
+-- CATEGORY: keyword comprehension
+function M.mark_related_keywords(top_ast, tokenlist, src)
+ local id = 0
+ local idof = {}
+ for _, token in ipairs(tokenlist) do
+ if token.tag == 'Keyword' and not idof[token] then
+ id = id + 1
+ local match_ast =
+ LA.smallest_ast_containing_range(top_ast, tokenlist, token.fpos, token.lpos)
+ local ktokenlist = M.related_keywords(match_ast, top_ast, tokenlist, src)
+ if ktokenlist then
+ for _, ktoken in ipairs(ktokenlist) do
+ ktoken.keywordid = id
+ idof[ktoken] = true
+ end
+ end
+ -- note: related_keywords may return a keyword set not containing given keyword.
+ end
+ end
+end
+
+
+-- function for t[k]
+local function tindex(_1, _2) return _1[_2] end
+
+local unescape = {['d'] = '.'}
+
+
+
+-- Sets known value on ast to v if ast not pegged.
+-- CATEGORY: utility function for infer_values.
+local function set_value(ast, v)
+ if not ast.isvaluepegged then
+ ast.value = v
+ end
+end
+
+
+local function known(o)
+ return not T.istype[o]
+end
+local function unknown(o)
+ return T.istype[o]
+end
+
+
+-- CATEGORY: utility function for infer_values.
+local function tastnewindex(t_ast, k_ast, v_ast)
+ if known(t_ast.value) and known(k_ast.value) and known(v_ast.value) then
+ local _1, _2, _3 = t_ast.value, k_ast.value, v_ast.value
+ if _1[_2] ~= nil and _3 ~= _1[_2] then -- multiple values
+ return T.universal
+ else
+ _1[_2] = _3
+ return _3
+ end
+ else
+ return T.universal
+ end
+end
+
+
+-- Gets expected number of parameters for function (min, max) values.
+-- In case of vararg, max is unknown and set to nil.
+local function function_param_range(ast)
+ local names_ast = ast[1]
+ if #names_ast >= 1 and names_ast[#names_ast].tag == 'Dots' then
+ return #names_ast-1, nil
+ else
+ return #names_ast, #names_ast
+ end
+end
+
+-- Gets number of arguments to function call: (min, max) range.
+-- In case of trailing vararg or function call, max is unknown and set to nil.
+local function call_arg_range(ast)
+ if ast.tag == 'Invoke' then
+ if #ast >= 3 and
+ (ast[#ast].tag == 'Dots' or ast[#ast].tag == 'Call' or ast[#ast].tag == 'Invoke')
+ then
+ return #ast-2, nil
+ else
+ return #ast-1, #ast-1
+ end
+ else
+ if #ast >= 2 and
+ (ast[#ast].tag == 'Dots' or ast[#ast].tag == 'Call' or ast[#ast].tag == 'Invoke')
+ then
+ return #ast-2, nil
+ else
+ return #ast-1, #ast-1
+ end
+ end
+end
+
+
+-- Reports warning. List of strings.
+local function warn(report, ...)
+ report('warning: ' .. table.concat({...}, ' '))
+end
+
+-- Reports status messages. List of strings.
+local function status(report, ...)
+ report('status: ' .. table.concat({...}, ' '))
+end
+
+-- unique value used to detect require loops (A require B require A)
+local REQUIRE_SENTINEL = function() end
+
+-- Gets single return value of chunk ast. Assumes ast is inspected.
+local function chunk_return_value(ast)
+ local vinfo
+ if ENABLE_RETURN_ANALYSIS then
+ local info = M.debuginfo[ast.value]
+ local retvals = info and info.retvals
+ if retvals then
+ vinfo = retvals[1]
+ else
+ vinfo = T.universal
+ end
+ else
+ if ast[#ast] and ast[#ast].tag == 'Return' and ast[#ast][1] then
+ vinfo = ast[#ast][1]
+ else
+ vinfo = T.universal
+ end
+ end
+ return vinfo
+end
+
+-- Version of require that does source analysis (inspect) on module.
+function M.require_inspect(name, report, spath)
+ local plinfo = M.package_loaded[name]
+ if plinfo == REQUIRE_SENTINEL then
+ warn(report, "loop in require when loading " .. name)
+ return nil
+ end
+ if plinfo then return plinfo[1] end
+ status(report, 'loading:' .. name)
+ M.package_loaded[name] = REQUIRE_SENTINEL -- avoid recursion on require loops
+ local msrc, mpath = load_module_source(name, spath)
+ local vinfo, mast
+ if msrc then
+ local err; mast, err = LA.ast_from_string(msrc, mpath)
+ if mast then
+ local mtokenlist = LA.ast_to_tokenlist(mast, msrc)
+ M.inspect(mast, mtokenlist, msrc, report)
+ vinfo = chunk_return_value(mast)
+ else
+ vinfo = T.error(err)
+ warn(report, err, " ", mpath) --Q:error printing good?
+ end
+ else
+ warn(report, 'module not found: ' .. name)
+ vinfo = T.error'module not found' --IMPROVE: include search paths?
+ end
+ M.package_loaded[name] = {vinfo, mast}
+ return vinfo, mast
+end
+
+
+-- Marks AST node and all children as dead (ast.isdead).
+local function mark_dead(ast)
+ LA.walk(ast, function(bast) bast.isdead = true end)
+end
+
+-- Gets list of `Return statement ASTs in `Function (or chunk) f_ast, not including
+-- return's in nested functions. Also returns boolean `has_implicit` indicating
+-- whether function may return by exiting the function without a return statement.
+-- Returns that are never exected are omitted (e.g. last return is omitted in
+-- `function f() if x then return 1 else return 2 end return 3 end`).
+-- Also marks AST nodes with ast.isdead (dead-code).
+local function get_func_returns(f_ast)
+ local isalwaysreturn = {}
+ local returns = {}
+ local function f(ast, isdead)
+ for _,cast in ipairs(ast) do if type(cast) == 'table' then
+ if isdead then mark_dead(cast) end -- even if DETECT_DEADCODE disabled
+ if cast.tag ~= 'Function' and not isdead then -- skip nested functions
+ f(cast, isdead) -- depth-first traverse
+ end
+ if ast.tag ~= 'If' and isalwaysreturn[cast] then isdead = true end
+ -- subsequent statements in block never executed
+ end end
+
+ -- Code on walking up AST: propagate children to parents
+ if ast.tag == 'Return' then
+ returns[#returns+1] = ast
+ isalwaysreturn[ast] = true
+ elseif ast.tag == 'If' then
+ if #ast%2 ~= 0 then -- has 'else' block
+ local isreturn = true
+ for i=2,#ast do
+ if (i%2==0 or i==#ast) and not isalwaysreturn[ast[i]] then isreturn = nil; break end
+ end
+ isalwaysreturn[ast] = isreturn
+ end
+ else -- note: iterates not just blocks, but should be ok
+ for i=1,#ast do
+ if isalwaysreturn[ast[i]] then
+ isalwaysreturn[ast] = true; break
+ end
+ end
+ end
+ end
+ f(f_ast, false)
+ local block_ast = f_ast.tag == 'Function' and f_ast[2] or f_ast
+ local has_implicit = not isalwaysreturn[block_ast]
+ return returns, has_implicit
+end
+
+-- temporary hack?
+local function valnode_normalize(valnode)
+ if valnode then
+ return valnode.value
+ else
+ return T.none
+ end
+end
+
+
+-- Gets return value at given return argument index, given list of `Return statements.
+-- Return value is a superset of corresponding types in list of statements.
+-- Example: {`Return{1,2,3}, `Return{1,3,'z'}} would return
+-- 1, T.number, and T.universal for retidx 1, 2 and 3 respectively.
+local function get_return_value(returns, retidx)
+ if #returns == 0 then return T.none
+ elseif #returns == 1 then
+ return valnode_normalize(returns[1][retidx])
+ else
+ local combined_value = valnode_normalize(returns[1][retidx])
+ for i=2,#returns do
+ local cur_value = valnode_normalize(returns[i][retidx])
+ combined_value = T.superset_types(combined_value, cur_value)
+ if combined_value == T.universal then -- can't expand set further
+ return combined_value
+ end
+ end
+ return combined_value
+ --TODO: handle values with possibly any number of return values, like f()
+ end
+end
+
+
+-- Gets return values (or types) on `Function (or chunk) represented by given AST.
+local function get_func_return_values(f_ast)
+ local returns, has_implicit = get_func_returns(f_ast)
+ if has_implicit then returns[#returns+1] = {tag='Return'} end
+ local returnvals = {n=0}
+ for retidx=1,math.huge do
+ local value = get_return_value(returns, retidx)
+ if value == T.none then break end
+ returnvals[#returnvals+1] = value
+ returnvals.n = returnvals.n + 1
+ end
+ return returnvals
+end
+-- Example: AST of `function(x) if x then return 1,2,3 else return 1,3,"z" end end`
+-- returns {1, T.number, T.universal}.
+
+
+-- Given list of values, return the first nvalues values plus the rest of the values
+-- as a tuple. Useful for things like
+-- local ok, values = valuesandtuple(1, pcall(f))
+-- CATEGORY: utility function (list)
+local function valuesandtuple(nvalues, ...)
+ if nvalues >= 1 then
+ return (...), valuesandtuple(nvalues-1, select(2, ...))
+ else
+ return {n=select('#', ...), ...}
+ end
+end
+
+
+-- Infers values of variables. Also marks dead code (ast.isdead).
+--FIX/WARNING - this probably needs more work
+-- Sets top_ast.valueglobals, ast.value, ast.valueself
+-- CATEGORY: code interpretation
+function M.infer_values(top_ast, tokenlist, src, report)
+ if not top_ast.valueglobals then top_ast.valueglobals = {} end
+
+
+ -- infer values
+ LA.walk(top_ast, function(ast) -- walk down
+ if ast.tag == 'Function' then
+ local paramlist_ast = ast[1]
+ for i=1,#paramlist_ast do local param_ast = paramlist_ast[i]
+ if param_ast.value == nil then param_ast.value = T.universal end
+ end
+ end
+ end, function(ast) -- walk up
+ -- process `require` statements.
+ if ast.tag == 'Local' or ast.tag == 'Localrec' then
+ local vars_ast, values_ast = ast[1], ast[2]
+ local valuelist = #values_ast > 0 and values_ast[#values_ast].valuelist
+ for i=1,#vars_ast do
+ local var_ast, value_ast = vars_ast[i], values_ast[i]
+ local value
+ if value_ast then
+ value = value_ast.value
+ elseif valuelist then
+ local vlidx = i - #values_ast + 1
+ value = valuelist.sizeunknown and vlidx > valuelist.n and T.universal or valuelist[vlidx]
+ end
+ set_value(var_ast, value)
+ end
+ elseif ast.tag == 'Set' then -- note: implementation similar to 'Local'
+ local vars_ast, values_ast = ast[1], ast[2]
+ local valuelist = #values_ast > 0 and values_ast[#values_ast].valuelist
+ for i=1,#vars_ast do
+ local var_ast, value_ast = vars_ast[i], values_ast[i]
+ local value
+ if value_ast then
+ value = value_ast.value
+ elseif valuelist then
+ local vlidx = i - #values_ast + 1
+ value = valuelist.sizeunknown and vlidx > valuelist.n and T.universal or valuelist[vlidx]
+ end
+ if var_ast.tag == 'Index' then
+ local t_ast, k_ast = var_ast[1], var_ast[2]
+ if not T.istype[t_ast.value] then -- note: don't mutate types
+ local v_ast = {value=value}
+ local ok; ok, var_ast.value = pzcall(tastnewindex, {t_ast, k_ast, v_ast}, t_ast, k_ast, v_ast)
+ if not ok then var_ast.value = T.error(var_ast.value) end
+ --FIX: propagate to localdefinition?
+ end
+ else
+ assert(var_ast.tag == 'Id', var_ast.tag)
+ if var_ast.localdefinition then
+ set_value(var_ast, value)
+ else -- global
+ local name = var_ast[1]
+ top_ast.valueglobals[name] = value
+ end
+ end
+ --FIX: propagate to definition or localdefinition?
+ end
+ elseif ast.tag == 'Fornum' then
+ local var_ast = ast[1]
+ set_value(var_ast, T.number)
+ elseif ast.tag == 'Forin' then
+ local varlist_ast, iter_ast = ast[1], ast[2]
+ if #iter_ast == 1 and iter_ast[1].tag == 'Call' and iter_ast[1][1].value == ipairs then
+ for i, var_ast in ipairs(varlist_ast) do
+ if i == 1 then set_value(var_ast, T.number)
+ -- handle the type of the value as the type of the first element
+ -- in the table that is a parameter for ipairs
+ elseif i == 2 then
+ local t_ast = iter_ast[1][2]
+ local value = T.universal
+ if (known(t_ast.value) or T.istabletype[t_ast.value]) then
+ local ok; ok, value = pzcall(tindex, {t_ast, {tag='Number', 1}}, t_ast.value, 1)
+ if not ok then value = T.error(t_ast.value) end
+ end
+ set_value(var_ast, value)
+ else set_value(var_ast, nil) end
+ end
+ elseif #iter_ast == 1 and iter_ast[1].tag == 'Call' and iter_ast[1][1].value == pairs then
+ local t_ast = iter_ast[1][2]
+ local value = T.universal
+ local key
+ if t_ast.value and (known(t_ast.value) or T.istabletype[t_ast.value]) then
+ key = next(t_ast.value)
+ local ok; ok, value = pzcall(tindex, {t_ast, {tag='String', key}}, t_ast.value, key)
+ if not ok then value = T.error(t_ast.value) end
+ end
+
+ for i, var_ast in ipairs(varlist_ast) do
+ if i == 1 then set_value(var_ast, type(key))
+ elseif i == 2 then set_value(var_ast, value)
+ else set_value(var_ast, nil) end
+ end
+ else -- general case, unknown iterator
+ for _, var_ast in ipairs(varlist_ast) do
+ set_value(var_ast, T.universal)
+ end
+ end
+ elseif ast.tag == 'Id' then
+ if ast.localdefinition then
+ local localdefinition = ast.localdefinition
+ if not localdefinition.isset then -- IMPROVE: support non-const (isset false) too
+ set_value(ast, localdefinition.value)
+ end
+ else -- global
+ local name = ast[1]
+ local v = top_ast.valueglobals[name]
+ if v ~= nil then
+ ast.value = v
+ else
+ local ok; ok, ast.value = pzcall(tindex, {{tag='Id', '_G'}, {tag='String', name}}, _G, name)
+ if not ok then ast.value = T.error(ast.value) end
+ end
+ end
+ elseif ast.tag == 'Index' then
+ local t_ast, k_ast = ast[1], ast[2]
+ if (known(t_ast.value) or T.istabletype[t_ast.value]) and known(k_ast.value) then
+ local ok; ok, ast.value = pzcall(tindex, {t_ast, k_ast}, t_ast.value, k_ast.value)
+ if not ok then ast.value = T.error(ast.value) end
+ end
+ elseif ast.tag == 'Call' or ast.tag == 'Invoke' then
+ -- Determine function to call (infer via index if method call).
+ local isinvoke = ast.tag == 'Invoke'
+ if isinvoke then
+ local t, k = ast[1].value, ast[2].value
+ if known(t) and known(k) then
+ local ok; ok, ast.valueself = pzcall(tindex, {ast[1], ast[2]}, t, k)
+ if not ok then ast.valueself = T.error(ast.valueself) end
+ end
+ end
+ local func; if isinvoke then func = ast.valueself else func = ast[1].value end
+
+ -- Handle function call.
+ local argvalues_concrete = true; do -- true iff all arguments known precisely.
+ if #ast >= 2 then
+ local firstargvalue; if isinvoke then firstargvalue = ast.valueself else firstargvalue = ast[2].value end
+ if unknown(firstargvalue) then
+ argvalues_concrete = false
+ else -- test remaining args
+ for i=3,#ast do if unknown(ast[i].value) then argvalues_concrete = false; break end end
+ end
+ end
+ end
+ local found
+ if known(func) and argvalues_concrete then -- attempt call with concrete args
+ -- Get list of values of arguments.
+ local argvalues; do
+ argvalues = {n=#ast-1}; for i=1,argvalues.n do argvalues[i] = ast[i+1].value end
+ if isinvoke then argvalues[1] = ast.valueself end -- `self`
+ end
+ -- Any call to require is handled specially (source analysis).
+ if func == require and type(argvalues[1]) == 'string' then
+ local spath = tostring(ast.lineinfo.first):gsub('<C|','<'):match('<([^|]+)') -- a HACK? relies on AST lineinfo
+ local val, mast = M.require_inspect(argvalues[1], report, spath:gsub('[^\\/]+$', ''))
+ if known(val) and val ~= nil then
+ ast.value = val
+ found = true
+ end -- note: on nil value, assumes analysis failed (not found). This is a heuristic only.
+ if mast and mast.valueglobals then ast.valueglobals = mast.valueglobals end
+ end
+ -- Attempt call if safe.
+ if not found and (LS.safe_function[func] or func == pcall and LS.safe_function[argvalues[1]]) then
+ local ok; ok, ast.valuelist = valuesandtuple(1, pcall(func, unpack(argvalues,1,argvalues.n)))
+ ast.value = ast.valuelist[1]; if not ok then ast.value = T.error(ast.value) end
+ found = true
+ end
+ end
+ if not found then
+ -- Attempt mock function. Note: supports nonconcrete args too.
+ local mf = LS.mock_functions[func]
+ if mf then
+ ast.valuelist = mf.outputs; ast.value = ast.valuelist[1]
+ else
+ -- Attempt infer from return statements in function source.
+ local info = M.debuginfo[func]
+ if not info then -- try match from dynamic debug info
+ local dinfo = type(func) == 'function' and debug.getinfo(func)
+ if dinfo then
+ local source, linedefined = dinfo.source, dinfo.linedefined
+ if source and linedefined then
+ local sourceline = source .. ':' .. linedefined
+ info = M.debuginfo[sourceline]
+ end
+ end
+ end
+ local retvals = info and info.retvals
+ if retvals then
+ ast.valuelist = retvals; ast.value = ast.valuelist[1]
+ else
+ -- Could not infer.
+ ast.valuelist = {n=0, sizeunknown=true}; ast.value = T.universal
+ end
+ end
+ end
+ elseif ast.tag == 'String' or ast.tag == 'Number' then
+ ast.value = ast[1]
+ elseif ast.tag == 'True' or ast.tag == 'False' then
+ ast.value = (ast.tag == 'True')
+ elseif ast.tag == 'Function' or ast == top_ast then -- includes chunk
+ if ast.value == nil then -- avoid redefinition
+ local x
+ local val = function() x=nil end
+ local fpos = LA.ast_pos_range(ast, tokenlist)
+ local source, linenum = tostring(ast.lineinfo.first):gsub('<C|','<'):match('<([^|]+)|L(%d+)') -- a HACK? relies on AST lineinfo
+ local retvals
+ if ENABLE_RETURN_ANALYSIS then
+ retvals = get_func_return_values(ast) --Q:move outside of containing conditional?
+ end
+ local info = {fpos=fpos, source="@" .. source, fast=ast, tokenlist=tokenlist, retvals=retvals, top_ast = top_ast}
+ M.debuginfo[val] = info
+ local sourceline = '@' .. source .. ':' .. linenum
+ local oldinfo = M.debuginfo[sourceline]
+ if oldinfo then
+ if oldinfo.fast ~= ast then
+ -- Two functions on the same source line cannot necessarily be disambiguated.
+ -- Unfortuntely, Lua debuginfo lacks exact character position.
+ -- http://lua-users.org/lists/lua-l/2010-08/msg00273.html
+ -- So, just disable info if ambiguous. Note: a slight improvement is to use the lastlinedefined.
+ M.debuginfo[sourceline] = false
+ end
+ else
+ if oldinfo == nil then
+ M.debuginfo[sourceline] = info -- store by sourceline too for quick lookup from dynamic debug info
+ end -- else false (do nothing)
+ end
+ ast.value = val
+ ast.nocollect = info -- prevents garbage collection while ast exists
+ end
+ elseif ast.tag == 'Table' then
+ if ast.value == nil then -- avoid redefinition
+ local value = {}
+ local n = 1
+ for _,east in ipairs(ast) do
+ if east.tag == 'Pair' then
+ local kast, vast = east[1], east[2]
+ if known(kast.value) and known(vast.value) then
+ if kast.value == nil then
+ -- IMPROVE? warn in some way?
+ else
+ value[kast.value] = vast.value
+ end
+ end
+ else
+ if known(east.value) then
+ value[n] = east.value
+ end
+ n = n + 1
+ end
+ end
+ --table.foreach(value, print)
+ ast.value = value
+ end
+ elseif ast.tag == 'Paren' then
+ ast.value = ast[1].value
+ elseif ast.tag == 'Op' then
+ local opid, aast, bast = ast[1], ast[2], ast[3]
+ local ok
+ if bast then
+ ok, ast.value = pzcall(dobinop, {aast, bast}, opid, aast.value, bast.value)
+ else
+ ok, ast.value = pzcall(dounop, {aast}, opid, aast.value)
+ end
+ if not ok then ast.value = T.error(ast.value) end
+ elseif ast.tag == 'If' then
+ -- detect dead-code
+ if DETECT_DEADCODE then
+ for i=2,#ast,2 do local valnode = ast[i-1]
+ local bval = T.boolean_cast(valnode.value)
+ if bval == false then -- certainly false
+ mark_dead(ast[i])
+ elseif bval == true then -- certainly true
+ for ii=i+1,#ast do if ii%2 == 0 or ii==#ast then -- following blocks are dead
+ mark_dead(ast[ii])
+ end end
+ break
+ end
+ end
+ end
+ -- IMPROVE? `if true return end; f()` - f could be marked as deadcode
+ elseif ast.tag == 'While' then
+ -- detect dead-code
+ if DETECT_DEADCODE then
+ local expr_ast, body_ast = ast[1], ast[2]
+ if T.boolean_cast(expr_ast.value) == false then
+ mark_dead(body_ast)
+ end
+ end
+ end
+ end)
+end
+
+
+-- Labels variables with unique identifiers.
+-- Sets ast.id, ast.resolvedname
+-- CATEGORY: code interpretation
+function M.mark_identifiers(ast)
+ local id = 0
+ local seen_globals = {}
+ LA.walk(ast, function(ast)
+ if ast.tag == 'Id' or ast.isfield then
+ if ast.localdefinition then
+ if ast.localdefinition == ast then -- lexical definition
+ id = id + 1
+ ast.id = id
+ else
+ ast.id = ast.localdefinition.id
+ end
+ elseif ast.isfield then
+ local previousid = ast.previous.id
+ if not previousid then -- note: ("abc"):upper() has no previous ID
+ id = id + 1
+ previousid = id
+ end
+ local name = previousid .. '.' .. ast[1]:gsub('%%', '%%'):gsub('%.', '%d')
+ if not seen_globals[name] then
+ id = id + 1
+ seen_globals[name] = id
+ end
+ ast.id = seen_globals[name]
+
+ -- also resolve name
+ local previousresolvedname = ast.previous.resolvedname
+ if previousresolvedname then
+ ast.resolvedname = previousresolvedname .. '.' .. ast[1]:gsub('%%', '%%'):gsub('%.', '%d')
+ end
+ else -- global
+ local name = ast[1]
+ if not seen_globals[name] then
+ id = id + 1
+ seen_globals[name] = id
+ end
+ ast.id = seen_globals[name]
+
+ -- also resolve name
+ ast.resolvedname = ast[1]
+ end
+ end
+ end)
+end
+
+
+-- Environment in which to execute special comments (see below).
+local env = setmetatable({}, {__index=_G})
+env.context = env
+
+env.number = T.number
+env.string = T.string
+env.boolean = T.boolean
+env.error = T.error
+
+
+-- Applies value to all identifiers with name matching pattern.
+-- This command is callable inside special comments.
+-- CATEGORY: code interpretation / special comment command
+function env.apply_value(pattern, val)
+ local function f(ast)
+ if ast.tag == 'Id' and ast[1]:match(pattern) then
+ ast.value = val; ast.isvaluepegged = true
+ end
+ for _,bast in ipairs(ast) do
+ if type(bast) == 'table' then
+ f(bast)
+ end
+ end
+ end
+ f(env.ast) -- ast from environment
+ --UNUSED:
+ -- for i=env.asti, #env.ast do
+ -- local bast = env.ast[i]
+ -- if type(bast) == 'table' then f(bast) end
+ --end
+end
+
+
+-- Evaluates all special comments (i.e. comments prefixed by '!') in code.
+-- This is similar to luaanalyze.
+-- CATEGORY: code interpretation / special comments
+function M.eval_comments(ast, tokenlist, report)
+ local function eval(command, ast)
+ --DEBUG('!', command:gsub('%s+$', ''), ast.tag)
+ local f, err = COMPAT.load(command, nil, 't', env)
+ if f then
+ env.ast = ast
+ local ok, err = pcall(f, ast)
+ if not ok then warn(report, err, ': ', command) end
+ env.ast = nil
+ else
+ warn(report, err, ': ', command)
+ end
+ end
+
+ for idx=1,#tokenlist do
+ local token = tokenlist[idx]
+ if token.tag == 'Comment' then
+ local command = token[1]:match'^!(.*)'
+ if command then
+ local mast = LA.smallest_ast_containing_range(ast, tokenlist, token.fpos, token.lpos)
+ eval(command, mast)
+ end
+ end
+ end
+end
+--IMPROVE: in `do f() --[[!g()]] h()` only apply g to h.
+
+
+
+
+-- Partially undoes effects of inspect().
+-- Note: does not undo mark_tag2 and mark_parents (see replace_statements).
+-- CATEGORY: code interpretation
+function M.uninspect(top_ast)
+ -- remove ast from M.debuginfo
+ for k, info in pairs(M.debuginfo) do
+ if info and info.top_ast == top_ast then
+ M.debuginfo[k] = nil
+ end
+ end
+
+ -- Clean ast.
+ LA.walk(top_ast, function(ast)
+ -- undo inspect_globals.globals
+ ast.localdefinition = nil
+ ast.functionlevel = nil
+ ast.isparam = nil
+ ast.isset = nil
+ ast.isused = nil
+ ast.isignore = nil
+ ast.isfield = nil
+ ast.previous = nil
+ ast.localmasked = nil
+ ast.localmasking = nil
+
+ -- undo mark_identifiers
+ ast.id = nil
+ ast.resolvedname = nil
+
+ -- undo infer_values
+ ast.value = nil
+ ast.valueself = nil
+ ast.valuelist = nil
+ ast.isdead = nil -- via get_func_returns
+ ast.isvaluepegged = nil
+
+ -- undo walk setting ast.seevalue
+ ast.seevalue = nil
+
+ -- undo walk setting ast.definedglobal
+ ast.definedglobal = nil
+
+ -- undo notes
+ ast.note = nil
+
+ ast.nocollect = nil
+
+ -- undo infer_values
+ ast.valueglobals = nil
+ end)
+end
+
+
+-- Main inspection routine. Inspects top_ast/tokenlist.
+-- Error/status messages are sent to function `report`.
+-- CATEGORY: code interpretation
+function M.inspect(top_ast, tokenlist, src, report)
+ --DEBUG: local t0 = os.clock()
+ if not report then -- compat for older version of lua-inspect
+ assert('inspect signature changed; please upgrade your code')
+ end
+
+ report = report or function() end
+
+ local globals = LG.globals(top_ast)
+
+ M.mark_identifiers(top_ast)
+
+ M.eval_comments(top_ast, tokenlist, report)
+
+ M.infer_values(top_ast, tokenlist, src, report)
+ M.infer_values(top_ast, tokenlist, src, report) -- two passes to handle forward declarations of globals (IMPROVE: more passes?)
+
+ -- Make some nodes as having values related to its parent.
+ -- This allows clicking on `bar` in `foo.bar` to display
+ -- the value of `foo.bar` rather than just "bar".
+ LA.walk(top_ast, function(ast)
+ if ast.tag == 'Index' then
+ ast[2].seevalue = ast
+ elseif ast.tag == 'Invoke' then
+ ast[2].seevalue = {value=ast.valueself, parent=ast}
+ end
+ end)
+
+ local function eval_name_helper(name)
+ local var = _G
+ for part in (name .. '.'):gmatch("([^.]*)%.") do
+ part = part:gsub('%%(.)', unescape)
+ if type(var) ~= 'table' and type(var) ~= 'userdata' then return nil end --TODO:improve?
+ var = var[part]
+ if var == nil then return nil end
+ end
+ return var
+ end
+ local function eval_name(name)
+ local ok, o = pzcall(eval_name_helper, {}, name)
+ if ok then return o else return nil end
+ end
+
+ LA.walk(top_ast, function(ast)
+ if top_ast ~= ast and ast.valueglobals then
+ for k in pairs(ast.valueglobals) do globals[k] = {set = ast} end
+ ast.valueglobals = nil
+ end
+ if ast.tag == 'Id' or ast.isfield then
+ local vname = ast[1]
+ --TODO: rename definedglobal to definedfield for clarity
+ local atype = ast.localdefinition and 'local' or ast.isfield and 'field' or 'global'
+ local definedglobal = ast.resolvedname and eval_name(ast.resolvedname) ~= nil or
+ atype == 'global' and (globals[vname] and globals[vname].set) or nil
+ ast.definedglobal = definedglobal
+ -- FIX: _G includes modules imported by inspect.lua, which is not desired
+ elseif ast.tag == 'Call' or ast.tag == 'Invoke' then
+ -- Argument count check.
+ local value = ast.valueself or ast[1].value
+ local info = M.debuginfo[value]
+ local fast = info and info.fast
+ if fast or LS.argument_counts[value] then
+ local nparammin, nparammax
+ if fast then
+ nparammin, nparammax = function_param_range(info.fast)
+ else
+ nparammin, nparammax = unpack(LS.argument_counts[value])
+ end
+ local nargmin, nargmax = call_arg_range(ast)
+ --print('DEBUG:', nparammin, nparammax, nargmin, nargmax)
+ local iswarn
+ local target_ast = ast.tag == 'Call' and ast[1] or ast[2]
+ if (nargmax or math.huge) < nparammin then
+ ast.note = "Too few arguments; "
+ iswarn = true
+ elseif nargmin > (nparammax or math.huge) then
+ ast.note = "Too many arguments; "
+ iswarn = true
+ end
+ if iswarn then
+ ast.note = ast.note .. "expected "
+ .. nparammin .. (nparammax == nparammin and "" or " to " .. (nparammax or "infinity"))
+ .. " but got "
+ .. nargmin .. (nargmax == nargmin and "" or " to " .. (nargmax or "infinity")) .. "."
+ end
+ end
+ end
+ end)
+end
+
+
+-- Resolves identifier to value [*]
+function M.resolve_id(id, scope, valueglobals, _G)
+ local val
+ if scope[id] then
+ val = scope[id].value
+ elseif valueglobals[id] ~= nil then
+ val = valueglobals[id]
+ else
+ val = _G[id] -- assumes not raise
+ end
+ return val
+end
+
+-- Resolves prefix chain expression to value. [*]
+-- On error returns nil and error object
+function M.resolve_prefixexp(ids, scope, valueglobals, _G)
+ local _1 = M.resolve_id(ids[1], scope, valueglobals, _G)
+ local ok, err = pzcall(function()
+ for i=2,#ids do
+ _1 = _1[ids[i]]
+ end
+ end, {})
+ if err then return nil, err or '?' end
+ return _1
+end
+
+-- Gets local scope at given 1-indexed char position
+function M.get_scope(pos1, ast, tokenlist)
+ local mast, isafter = LA.current_statementblock(ast, tokenlist, pos1)
+ local scope = LG.variables_in_scope(mast, isafter)
+ return scope
+end
+
+-- Gets names in prefix expression ids (as returned by resolve_prefixexp). [*]
+function M.names_in_prefixexp(ids, pos, ast, tokenlist)
+ local scope = M.get_scope(pos, ast, tokenlist)
+ --FIX: above does not handle `for x=1,2 do| print(x) end` where '|' is cursor position.
+ local names = {}
+ if #ids == 0 then -- global
+ for name in pairs(scope) do names[#names+1] = name end
+ for name in pairs(ast.valueglobals) do names[#names+1] = name end
+ for name in pairs(_G) do names[#names+1] = name end
+ else -- field
+ local t, err_ = M.resolve_prefixexp(ids, scope, ast.valueglobals, _G)
+ if type(t) == 'table' then -- note: err_ implies false here
+ for name in pairs(t) do names[#names+1] = name end
+ end
+ end
+ return names
+end
+
+-- Gets signature (function argument string or helpinfo string) on value.
+-- Returns nil on not found.
+function M.get_signature_of_value(value)
+ local info = M.debuginfo[value] -- first try this
+ if info and info.fast then
+ local fidx, lidx = LA.ast_idx_range_in_tokenlist(info.tokenlist, info.fast[1])
+ local ts = {}
+ if fidx then
+ for i=fidx,lidx do
+ local token = info.tokenlist[i]
+ ts[#ts+1] = token.tag == 'Dots' and '...' or token[1]
+ end
+ end
+ local sig = 'function(' .. table.concat(ts, ' ') .. ')'
+ if info.retvals then
+ local vals = info.retvals
+ local ts = {}
+ if vals.n == 0 then
+ sig = sig .. " no returns"
+ else
+ for i=1,vals.n do local val = vals[i]
+ ts[#ts+1] = T.istype[val] and tostring(val) or LD.dumpstring(val) --Q:dumpstring too verbose?
+ end
+ sig = sig .. " returns " .. table.concat(ts, ", ")
+ end
+ end
+ return sig
+ end
+ local sig = LS.value_signatures[value] -- else try this
+ return sig
+end
+
+
+-- Gets signature (function argument string or helpinfo string) on variable ast.
+-- Returns nil on not found.
+function M.get_signature(ast)
+ if known(ast.value) then
+ return M.get_signature_of_value(ast.value)
+ end
+end
+
+
+-- Gets 1-indexed character (or line) position and filename of
+-- definition associated with AST node (if any).
+function M.ast_to_definition_position(ast, tokenlist)
+ local local_ast = ast.localdefinition
+ local fpos, fline, path
+ if local_ast then
+ local tidx = LA.ast_idx_range_in_tokenlist(tokenlist, local_ast)
+ if tidx then
+ local spath = tostring(ast.lineinfo.first):gsub('<C|','<'):match('<([^|]+)') -- a HACK? using lineinfo
+ fpos = tokenlist[tidx].fpos; path = spath
+ end
+ end
+ if not fpos then
+ local valueast = ast.seevalue or ast
+ local val = valueast and valueast.value
+ local info = M.debuginfo[val] or type(val) == 'function' and debug.getinfo(val)
+ if info then
+ if info.source:match'^@' then
+ path = info.source:match'@(.*)'
+ if info.linedefined then
+ fline = info.linedefined
+ else
+ fpos = info.fpos
+ end
+ end
+ end
+ end
+ return fpos, fline, path
+end
+
+
+-- Returns true iff value in ast node is known in some way.
+function M.is_known_value(ast)
+ local vast = ast.seevalue or ast
+ return vast.definedglobal or known(vast.value) and vast.value ~= nil
+end
+
+
+-- Gets list of variable attributes for AST node.
+function M.get_var_attributes(ast)
+ local vast = ast.seevalue or ast
+ local attributes = {}
+ if ast.localdefinition then
+ attributes[#attributes+1] = "local"
+ if ast.localdefinition.functionlevel < ast.functionlevel then
+ attributes[#attributes+1] = 'upvalue'
+ end
+ if ast.localdefinition.isparam then
+ attributes[#attributes+1] = "param"
+ end
+ if not ast.localdefinition.isused then attributes[#attributes+1] = 'unused' end
+ if ast.isignore then attributes[#attributes+1] = 'ignore' end
+ if ast.localdefinition.isset then attributes[#attributes+1] = 'mutatebind'
+ else attributes[#attributes+1] = 'constbind' end
+ if ast.localmasking then
+ attributes[#attributes+1] = "masking"
+ end
+ if ast.localmasked then
+ attributes[#attributes+1] = "masked"
+ end
+ elseif ast.tag == 'Id' then -- global
+ attributes[#attributes+1] = (M.is_known_value(vast) and "known" or "unknown")
+ attributes[#attributes+1] = "global"
+ elseif ast.isfield then
+ attributes[#attributes+1] = (M.is_known_value(vast) and "known" or "unknown")
+ attributes[#attributes+1] = "field"
+ else
+ attributes[#attributes+1] = "FIX" -- shouldn't happen?
+ end
+ if vast.parent and (vast.parent.tag == 'Call' or vast.parent.tag == 'Invoke')
+ and vast.parent.note
+ then
+ attributes[#attributes+1] = 'warn'
+ end
+ return attributes
+end
+
+
+-- Gets detailed information about value in AST node, as string.
+function M.get_value_details(ast, tokenlist, src)
+ local lines = {}
+
+ if not ast then return '?' end
+
+ local vast = ast.seevalue or ast
+
+ lines[#lines+1] = "attributes: " .. table.concat(M.get_var_attributes(ast), " ")
+
+ lines[#lines+1] = "value: " .. tostring(vast.value)
+
+ local sig = M.get_signature(vast)
+ if sig then
+ local kind = sig:find '%w%s*%b()$' and 'signature' or 'description'
+ lines[#lines+1] = kind .. ": " .. sig
+ end
+
+ local fpos, fline, path = M.ast_to_definition_position(ast, tokenlist)
+ if fpos or fline then
+ local fcol
+ if fpos then
+ fline, fcol = LA.pos_to_linecol(fpos, src)
+ end
+ local location = path .. ":" .. (fline) .. (fcol and ":" .. fcol or "")
+ lines[#lines+1] = "location defined: " .. location
+ end
+
+ if ast.localdefinition and ast.localmasking then
+ local fpos = LA.ast_pos_range(ast.localmasking, tokenlist)
+ if fpos then
+ local linenum = LA.pos_to_linecol(fpos, src)
+ lines[#lines+1] = "masking definition at line: " .. linenum
+ end
+ end
+
+ -- Render warning notes attached to calls/invokes.
+ local note = vast.parent and (vast.parent.tag == 'Call' or vast.parent.tag == 'Invoke')
+ and vast.parent.note
+ if note then
+ lines[#lines+1] = "WARNING: " .. note
+ end
+
+ return table.concat(lines, "\n")
+end
+
+
+-- Gets list of all warnings, as strings.
+-- In HTML Tidy format (which supports column numbers in SciTE, although is
+-- slightly verbose and lacks filename).
+function M.list_warnings(tokenlist, src)
+ local warnings = {}
+ local ttoken
+ local function warn(msg)
+ local linenum, colnum = LA.pos_to_linecol(ttoken.fpos, src)
+ warnings[#warnings+1] = "line " .. linenum .. " column " .. colnum .. " - " .. msg
+ end
+ local isseen = {}
+ for i,token in ipairs(tokenlist) do ttoken = token
+ if token.ast then
+ local ast = token.ast
+ if ast.localmasking then
+ local pos = LA.ast_pos_range(ast.localmasking, tokenlist)
+ local linenum = pos and LA.pos_to_linecol(pos, src)
+ warn("local " .. ast[1] .. " masks another local" .. (pos and " on line " .. linenum or ""))
+ end
+ if ast.localdefinition == ast and not ast.isused and not ast.isignore then
+ warn("unused local " .. ast[1])
+ end
+ if ast.isfield and not(known(ast.seevalue.value) and ast.seevalue.value ~= nil) then
+ warn("unknown field " .. ast[1])
+ elseif ast.tag == 'Id' and not ast.localdefinition and not ast.definedglobal then
+ warn("unknown global " .. ast[1])
+ end
+ local vast = ast.seevalue or ast
+ local note = vast.parent and (vast.parent.tag == 'Call' or vast.parent.tag == 'Invoke')
+ and vast.parent.note
+ if note and not isseen[vast.parent] then
+ isseen[vast.parent] = true
+ local esrc = LA.ast_to_text(vast.parent, tokenlist, src)
+ -- IMPROVE: large items like `f(function() ... end)` may be shortened.
+ warn(note .. (esrc and "for " .. esrc or ""))
+ end
+ end
+ end
+ return warnings
+end
+
+
+return M
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/signatures.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/signatures.lua
new file mode 100644
index 0000000..145ed3f
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/signatures.lua
@@ -0,0 +1,433 @@
+local M = {}
+
+local T = require "luainspect.types"
+
+-- signatures of known globals
+M.global_signatures = {
+ assert = "assert (v [, message])",
+ collectgarbage = "collectgarbage (opt [, arg])",
+ dofile = "dofile (filename)",
+ error = "error (message [, level])",
+ _G = "(table)",
+ getfenv = "getfenv ([f])",
+ getmetatable = "getmetatable (object)",
+ ipairs = "ipairs (t)",
+ load = "load (func [, chunkname])",
+ loadfile = "loadfile ([filename])",
+ loadstring = "loadstring (string [, chunkname])",
+ next = "next (table [, index])",
+ pairs = "pairs (t)",
+ pcall = "pcall (f, arg1, ...)",
+ print = "print (...)",
+ rawequal = "rawequal (v1, v2)",
+ rawget = "rawget (table, index)",
+ rawset = "rawset (table, index, value)",
+ select = "select (index, ...)",
+ setfenv = "setfenv (f, table)",
+ setmetatable = "setmetatable (table, metatable)",
+ tonumber = "tonumber (e [, base])",
+ tostring = "tostring (e)",
+ type = "type (v)",
+ unpack = "unpack (list [, i [, j]])",
+ _VERSION = "(string)",
+ xpcall = "xpcall (f, err)",
+ module = "module (name [, ...])",
+ require = "require (modname)",
+ coroutine = "(table) coroutine manipulation library",
+ debug = "(table) debug facilities library",
+ io = "(table) I/O library",
+ math = "(table) math functions libary",
+ os = "(table) OS facilities library",
+ package = "(table) package library",
+ string = "(table) string manipulation library",
+ table = "(table) table manipulation library",
+ ["coroutine.create"] = "coroutine.create (f)",
+ ["coroutine.resume"] = "coroutine.resume (co [, val1, ...])",
+ ["coroutine.running"] = "coroutine.running ()",
+ ["coroutine.status"] = "coroutine.status (co)",
+ ["coroutine.wrap"] = "coroutine.wrap (f)",
+ ["coroutine.yield"] = "coroutine.yield (...)",
+ ["debug.debug"] = "debug.debug ()",
+ ["debug.getfenv"] = "debug.getfenv (o)",
+ ["debug.gethook"] = "debug.gethook ([thread])",
+ ["debug.getinfo"] = "debug.getinfo ([thread,] function [, what])",
+ ["debug.getlocal"] = "debug.getlocal ([thread,] level, local)",
+ ["debug.getmetatable"] = "debug.getmetatable (object)",
+ ["debug.getregistry"] = "debug.getregistry ()",
+ ["debug.getupvalue"] = "debug.getupvalue (func, up)",
+ ["debug.setfenv"] = "debug.setfenv (object, table)",
+ ["debug.sethook"] = "debug.sethook ([thread,] hook, mask [, count])",
+ ["debug.setlocal"] = "debug.setlocal ([thread,] level, local, value)",
+ ["debug.setmetatable"] = "debug.setmetatable (object, table)",
+ ["debug.setupvalue"] = "debug.setupvalue (func, up, value)",
+ ["debug.traceback"] = "debug.traceback ([thread,] [message] [, level])",
+ ["io.close"] = "io.close ([file])",
+ ["io.flush"] = "io.flush ()",
+ ["io.input"] = "io.input ([file])",
+ ["io.lines"] = "io.lines ([filename])",
+ ["io.open"] = "io.open (filename [, mode])",
+ ["io.output"] = "io.output ([file])",
+ ["io.popen"] = "io.popen (prog [, mode])",
+ ["io.read"] = "io.read (...)",
+ ["io.tmpfile"] = "io.tmpfile ()",
+ ["io.type"] = "io.type (obj)",
+ ["io.write"] = "io.write (...)",
+ ["math.abs"] = "math.abs (x)",
+ ["math.acos"] = "math.acos (x)",
+ ["math.asin"] = "math.asin (x)",
+ ["math.atan"] = "math.atan (x)",
+ ["math.atan2"] = "math.atan2 (y, x)",
+ ["math.ceil"] = "math.ceil (x)",
+ ["math.cos"] = "math.cos (x)",
+ ["math.cosh"] = "math.cosh (x)",
+ ["math.deg"] = "math.deg (x)",
+ ["math.exp"] = "math.exp (x)",
+ ["math.floor"] = "math.floor (x)",
+ ["math.fmod"] = "math.fmod (x, y)",
+ ["math.frexp"] = "math.frexp (x)",
+ ["math.huge"] = "math.huge",
+ ["math.ldexp"] = "math.ldexp (m, e)",
+ ["math.log"] = "math.log (x)",
+ ["math.log10"] = "math.log10 (x)",
+ ["math.max"] = "math.max (x, ...)",
+ ["math.min"] = "math.min (x, ...)",
+ ["math.modf"] = "math.modf (x)",
+ ["math.pi"] = "math.pi",
+ ["math.pow"] = "math.pow (x, y)",
+ ["math.rad"] = "math.rad (x)",
+ ["math.random"] = "math.random ([m [, n]])",
+ ["math.randomseed"] = "math.randomseed (x)",
+ ["math.sin"] = "math.sin (x)",
+ ["math.sinh"] = "math.sinh (x)",
+ ["math.sqrt"] = "math.sqrt (x)",
+ ["math.tan"] = "math.tan (x)",
+ ["math.tanh"] = "math.tanh (x)",
+ ["os.clock"] = "os.clock ()",
+ ["os.date"] = "os.date ([format [, time]])",
+ ["os.difftime"] = "os.difftime (t2, t1)",
+ ["os.execute"] = "os.execute ([command])",
+ ["os.exit"] = "os.exit ([code])",
+ ["os.getenv"] = "os.getenv (varname)",
+ ["os.remove"] = "os.remove (filename)",
+ ["os.rename"] = "os.rename (oldname, newname)",
+ ["os.setlocale"] = "os.setlocale (locale [, category])",
+ ["os.time"] = "os.time ([table])",
+ ["os.tmpname"] = "os.tmpname ()",
+ ["package.cpath"] = "package.cpath",
+ ["package.loaded"] = "package.loaded",
+ ["package.loaders"] = "package.loaders",
+ ["package.loadlib"] = "package.loadlib (libname, funcname)",
+ ["package.path"] = "package.path",
+ ["package.preload"] = "package.preload",
+ ["package.seeall"] = "package.seeall (module)",
+ ["string.byte"] = "string.byte (s [, i [, j]])",
+ ["string.char"] = "string.char (...)",
+ ["string.dump"] = "string.dump (function)",
+ ["string.find"] = "string.find (s, pattern [, init [, plain]])",
+ ["string.format"] = "string.format (formatstring, ...)",
+ ["string.gmatch"] = "string.gmatch (s, pattern)",
+ ["string.gsub"] = "string.gsub (s, pattern, repl [, n])",
+ ["string.len"] = "string.len (s)",
+ ["string.lower"] = "string.lower (s)",
+ ["string.match"] = "string.match (s, pattern [, init])",
+ ["string.rep"] = "string.rep (s, n)",
+ ["string.reverse"] = "string.reverse (s)",
+ ["string.sub"] = "string.sub (s, i [, j])",
+ ["string.upper"] = "string.upper (s)",
+ ["table.concat"] = "table.concat (table [, sep [, i [, j]]])",
+ ["table.insert"] = "table.insert (table, [pos,] value)",
+ ["table.maxn"] = "table.maxn (table)",
+ ["table.remove"] = "table.remove (table [, pos])",
+ ["table.sort"] = "table.sort (table [, comp])",
+}
+
+-- utility function. Converts e.g. name 'math.sqrt' to its value.
+local function resolve_global_helper_(name)
+ local o = _G
+ for fieldname in name:gmatch'[^%.]+' do o = o[fieldname] end
+ return o
+end
+local function resolve_global(name)
+ local a, b = pcall(resolve_global_helper_, name)
+ if a then return b else return nil, b end
+end
+
+-- Same as global_signatures but maps value (not name) to signature.
+M.value_signatures = {}
+local isobject = {['function']=true, ['table']=true, ['userdata']=true, ['coroutine']=true}
+for name,sig in pairs(M.global_signatures) do
+ local val, err = resolve_global(name)
+ if isobject[type(val)] then
+ M.value_signatures[val] = sig
+ end
+end
+
+-- min,max argument counts.
+M.argument_counts = {
+ [assert] = {1,2},
+ [collectgarbage] = {1,2},
+ [dofile] = {1},
+ [error] = {1,2},
+ [getfenv or false] = {0,1},
+ [getmetatable] = {1,1},
+ [ipairs] = {1,1},
+ [load] = {1,2},
+ [loadfile] = {0,1},
+ [loadstring] = {1,2},
+ [next] = {1,2},
+ [pairs] = {1,1},
+ [pcall] = {1,math.huge},
+ [print] = {0,math.huge},
+ [rawequal] = {2,2},
+ [rawget] = {2,2},
+ [rawset] = {3,3},
+ [select] = {1, math.huge},
+ [setfenv or false] = {2,2},
+ [setmetatable] = {2,2},
+ [tonumber] = {1,2},
+ [tostring] = {1},
+ [type] = {1},
+ [unpack] = {1,3},
+ [xpcall] = {2,2},
+ [module] = {1,math.huge},
+ [require] = {1,1},
+ [coroutine.create] = {1,1},
+ [coroutine.resume] = {1, math.huge},
+ [coroutine.running] = {0,0},
+ [coroutine.status] = {1,1},
+ [coroutine.wrap] = {1,1},
+ [coroutine.yield] = {0,math.huge},
+ [debug.debug] = {0,0},
+ [debug.getfenv or false] = {1,1},
+ [debug.gethook] = {0,1},
+ [debug.getinfo] = {1,3},
+ [debug.getlocal] = {2,3},
+ [debug.getmetatable] = {1,1},
+ [debug.getregistry] = {0,0},
+ [debug.getupvalue] = {2,2},
+ [debug.setfenv or false] = {2,2},
+ [debug.sethook] = {2,4},
+ [debug.setlocal] = {3,4},
+ [debug.setmetatable] = {2,2},
+ [debug.setupvalue] = {3,3},
+ [debug.traceback] = {0,3},
+ [io.close] = {0,1},
+ [io.flush] = {0,0},
+ [io.input] = {0,1},
+ [io.lines] = {0,1},
+ [io.open] = {1,2},
+ [io.output] = {0,1},
+ [io.popen] = {1,2},
+ [io.read] = {0,math.huge},
+ [io.tmpfile] = {0},
+ [io.type] = {1},
+ [io.write] = {0,math.huge},
+ [math.abs] = {1},
+ [math.acos] = {1},
+ [math.asin] = {1},
+ [math.atan] = {1},
+ [math.atan2] = {2,2},
+ [math.ceil] = {1,1},
+ [math.cos] = {1,1},
+ [math.cosh] = {1,1},
+ [math.deg] = {1,1},
+ [math.exp] = {1,1},
+ [math.floor] = {1,1},
+ [math.fmod] = {2,2},
+ [math.frexp] = {1,1},
+ [math.ldexp] = {2,2},
+ [math.log] = {1,1},
+ [math.log10] = {1,1},
+ [math.max] = {1,math.huge},
+ [math.min] = {1,math.huge},
+ [math.modf] = {1,1},
+ [math.pow] = {2,2},
+ [math.rad] = {1,1},
+ [math.random] = {0,2},
+ [math.randomseed] = {1,1},
+ [math.sin] = {1,1},
+ [math.sinh] = {1,1},
+ [math.sqrt] = {1,1},
+ [math.tan] = {1,1},
+ [math.tanh] = {1,1},
+ [os.clock] = {0,0},
+ [os.date] = {0,2},
+ [os.difftime] = {2,2},
+ [os.execute] = {0,1},
+ [os.exit] = {0,1},
+ [os.getenv] = {1,1},
+ [os.remove] = {1,1},
+ [os.rename] = {2,2},
+ [os.setlocale] = {1,2},
+ [os.time] = {0,1},
+ [os.tmpname] = {0,0},
+ [package.loadlib] = {2,2},
+ [package.seeall] = {1,1},
+ [string.byte] = {1,3},
+ [string.char] = {0,math.huge},
+ [string.dump] = {1,1},
+ [string.find] = {2,4},
+ [string.format] = {1,math.huge},
+ [string.gmatch] = {2,2},
+ [string.gsub] = {3,4},
+ [string.len] = {1,1},
+ [string.lower] = {1,1},
+ [string.match] = {2,3},
+ [string.rep] = {2,2},
+ [string.reverse] = {1,1},
+ [string.sub] = {2,3},
+ [string.upper] = {1,1},
+ [table.concat] = {1,4},
+ [table.insert] = {2,3},
+ [table.maxn] = {1,1},
+ [table.remove] = {1,2},
+ [table.sort] = {1,2},
+ [false] = nil -- trick (relies on potentially undefined behavior)
+}
+
+
+-- functions with zero or nearly zero side-effects, and with deterministic results, that may be evaluated by the analyzer.
+M.safe_function = {
+ [require] = true,
+ [rawequal] = true,
+ [rawget] = true,
+ [require] = true, -- sort of
+ [select] = true,
+ [tonumber] = true,
+ [tostring] = true,
+ [type] = true,
+ [unpack] = true,
+ [coroutine.create] = true,
+ -- [coroutine.resume]
+ [coroutine.running] = true,
+ [coroutine.status] = true,
+ [coroutine.wrap] = true,
+ --[coroutine.yield]
+ -- [debug.debug]
+ --[debug.getfenv] = true,
+ [debug.gethook] = true,
+ [debug.getinfo] = true,
+ [debug.getlocal] = true,
+ [debug.getmetatable] = true,
+ [debug.getregistry] = true,
+ [debug.getupvalue] = true,
+ -- [debug.setfenv]
+ -- [debug.sethook]
+ -- [debug.setlocal]
+ -- [debug.setmetatable]
+ -- [debug.setupvalue]
+ -- [debug.traceback] = true,
+ [io.type] = true,
+ -- skip all other io.*
+ [math.abs] = true,
+ [math.acos] = true,
+ [math.asin] = true,
+ [math.atan] = true,
+ [math.atan2] = true,
+ [math.ceil] = true,
+ [math.cos] = true,
+ [math.cosh] = true,
+ [math.deg] = true,
+ [math.exp] = true,
+ [math.floor] = true,
+ [math.fmod] = true,
+ [math.frexp] = true,
+ [math.ldexp] = true,
+ [math.log] = true,
+ [math.log10] = true,
+ [math.max] = true,
+ [math.min] = true,
+ [math.modf] = true,
+ [math.pow] = true,
+ [math.rad] = true,
+ --[math.random]
+ --[math.randomseed]
+ [math.sin] = true,
+ [math.sinh] = true,
+ [math.sqrt] = true,
+ [math.tan] = true,
+ [math.tanh] = true,
+ [os.clock] = true, -- safe but non-deterministic
+ [os.date] = true,-- safe but non-deterministic
+ [os.difftime] = true,
+ --[os.execute]
+ --[os.exit]
+ [os.getenv] = true, -- though depends on environment
+ --[os.remove]
+ --[os.rename]
+ --[os.setlocale]
+ [os.time] = true, -- safe but non-deterministic
+ --[os.tmpname]
+ [string.byte] = true,
+ [string.char] = true,
+ [string.dump] = true,
+ [string.find] = true,
+ [string.format] = true,
+ [string.gmatch] = true,
+ [string.gsub] = true,
+ [string.len] = true,
+ [string.lower] = true,
+ [string.match] = true,
+ [string.rep] = true,
+ [string.reverse] = true,
+ [string.sub] = true,
+ [string.upper] = true,
+ [table.maxn] = true,
+}
+
+M.mock_functions = {}
+
+-- TODO:IMPROVE
+local function mockfunction(func, ...)
+ local inputs = {n=0}
+ local outputs = {n=0}
+ local isoutputs
+ for i=1,select('#', ...) do
+ local v = select(i, ...)
+ if type(v) == 'table' then v = v[1] end
+ if v == 'N' or v == 'I' then v = T.number end
+ if v == '->' then
+ isoutputs = true
+ elseif isoutputs then
+ outputs[#outputs+1] = v; outputs.n = outputs.n + 1
+ else
+ inputs[#inputs+1] = v; inputs.n = inputs.n + 1
+ end
+ end
+ M.mock_functions[func] = {inputs=inputs, outputs=outputs}
+end
+
+
+mockfunction(math.abs, 'N', '->', {'N',0,math.huge})
+mockfunction(math.acos, {'N',-1,1}, '->', {'N',0,math.pi/2})
+mockfunction(math.asin, {'N',-1,1}, '->', {'N',-math.pi/2,math.pi/2})
+mockfunction(math.atan, {'N',-math.huge,math.huge}, '->',
+ {'N',-math.pi/2,math.pi/2})
+--FIX atan2
+mockfunction(math.ceil, 'N','->','I')
+mockfunction(math.cos, 'N','->',{'N',-1,1})
+mockfunction(math.cosh, 'N','->',{'N',1,math.huge})
+mockfunction(math.deg, 'N','->','N')
+mockfunction(math.exp, 'N','->',{'N',0,math.huge})
+mockfunction(math.floor, 'N','->','I')
+mockfunction(math.fmod, 'N','N','->','N')
+mockfunction(math.frexp, 'N','->',{'N',-1,1},'->','I')
+mockfunction(math.ldexp, {'N','I'},'->','N')
+mockfunction(math.log, {'N',0,math.huge},'->','N')
+mockfunction(math.log10, {'N',0,math.huge},'->','N')
+-- function max(...) print 'NOT IMPL'end
+-- function min(...) print 'NOT IMPL'end
+mockfunction(math.modf, 'N','->','I',{'N',-1,1})
+
+mockfunction(math.pow, 'N','N','->','N') -- improve?
+mockfunction(math.rad, 'N','->','N')
+-- random = function() print 'NOT IMPL' end
+mockfunction(math.randomseed, 'N')
+mockfunction(math.sin, 'N','->',{'N',-1,1})
+mockfunction(math.sinh, 'N','->','N')
+mockfunction(math.sqrt, {'N',0,math.huge},'->',{'N',0,math.huge})
+mockfunction(math.tan, 'N','->','N') -- improve?
+mockfunction(math.tanh, 'N','->',{'N',-1,1})
+
+
+return M
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/typecheck.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/typecheck.lua
new file mode 100644
index 0000000..549f8fe
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/typecheck.lua
@@ -0,0 +1,40 @@
+-- luainspect.typecheck - Type definitions used to check LuaInspect itself.
+--
+-- (c) 2010 David Manura, MIT License.
+
+local T = require "luainspect.types"
+
+local ast_mt = {__tostring = function(s) return 'AST' end}
+
+return function(context)
+ -- AST type.
+ local ast = T.table {
+ tag = T.string,
+ lineinfo=T.table{first=T.table{comments=T.table{T.table{T.string,T.number,T.number}},T.number,T.number,T.number,T.string},
+ ast=T.table{comments=T.table{T.table{T.string,T.number,T.number}},T.number,T.number,T.number,T.string}},
+ isfield=T.boolean, tag2=T.string,
+ value=T.universal, valueself=T.number, valuelist=T.table{n=T.number, isvaluepegged=T.boolean},
+ resolvedname=T.string, definedglobal=T.boolean, id=T.number, isparam=T.boolean, isset=T.boolean, isused=T.boolean,
+ isignore=T.boolean,
+ functionlevel=T.number, localmasked=T.boolean, note=T.string, nocollect=T.table{}, isdead=T.boolean}
+ -- FIX: some of these are "boolean or nil" actually
+ ast.localdefinition=ast; ast.localmasking = ast
+ ast.previous = ast; ast.parent = ast
+ ast.seevalue = ast; ast.seenote=ast
+ setmetatable(ast, ast_mt)
+
+ ast[1] = ast; ast[2] = ast
+ context.apply_value('ast$', ast)
+
+ -- Token type.
+ context.apply_value('token$', T.table{
+ tag=T.string, fpos=T.number, lpos=T.number, keywordid=T.number, ast=ast, [1]=T.string
+ })
+
+ -- Lua source code string type.
+ context.apply_value('src$', '')
+
+ -- SciTE syler object type.
+ local nf = function()end
+ context.apply_value('^styler$', T.table{SetState=nf, More=nf, Current=nf, Forward=nf, StartStyling=nf, EndStyling=nf, language=T.string})
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/types.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/types.lua
new file mode 100644
index 0000000..7994eb0
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/luainspect/types.lua
@@ -0,0 +1,130 @@
+local T = {} -- types
+
+-- istype[o] iff o represents a type (i.e. set of values)
+T.istype = {}
+
+-- iserror[o] iff o represents an error type (created via T.error).
+T.iserror = {}
+
+-- istabletype[o] iff o represents a table type (created by T.table).
+T.istabletype = {}
+
+-- Number type
+T.number = {}
+setmetatable(T.number, T.number)
+function T.number.__tostring(self)
+ return 'number'
+end
+T.istype[T.number] = true
+
+-- String type
+T.string = {}
+setmetatable(T.string, T.string)
+function T.string.__tostring(self)
+ return 'string'
+end
+T.istype[T.string] = true
+
+-- Boolean type
+T.boolean = {}
+setmetatable(T.boolean, T.boolean)
+function T.boolean.__tostring(self)
+ return 'boolean'
+end
+T.istype[T.boolean] = true
+
+-- Table type
+function T.table(t)
+ T.istype[t] = true
+ T.istabletype[t] = true
+ return t
+end
+
+-- Universal type. This is a superset of all other types.
+T.universal = {}
+setmetatable(T.universal, T.universal)
+function T.universal.__tostring(self)
+ return 'unknown'
+end
+T.istype[T.universal] = true
+
+-- nil type. Represents `nil` but can be stored in tables.
+T['nil'] = {}
+setmetatable(T['nil'], T['nil'])
+T['nil'].__tostring = function(self)
+ return 'nil'
+end
+T.istype[T['nil']] = true
+
+-- None type. Represents a non-existent value, in a similar way
+-- that `none` is used differently from `nil` in the Lua C API.
+T.none = {}
+setmetatable(T.none, T.none)
+function T.none.__tostring(self)
+ return 'none'
+end
+T.istype[T.none] = true
+
+-- Error type
+local CError = {}; CError.__index = CError
+function CError.__tostring(self) return "error:" .. tostring(self.value) end
+function T.error(val)
+ local self = setmetatable({value=val}, CError)
+ T.istype[self] = true
+ T.iserror[self] = true
+ return self
+end
+
+
+-- Gets a type that is a superset of the two given types.
+function T.superset_types(a, b)
+ if T.iserror[a] then return a end
+ if T.iserror[b] then return b end
+ if rawequal(a, b) then -- note: including nil == nil
+ return a
+ elseif type(a) == 'string' or a == T.string then
+ if type(b) == 'string' or b == T.string then
+ return T.string
+ else
+ return T.universal
+ end
+ elseif type(a) == 'number' or a == T.number then
+ if type(b) == 'number' or b == T.number then
+ return T.number
+ else
+ return T.universal
+ end
+ elseif type(a) == 'boolean' or a == T.boolean then
+ if type(b) == 'boolean' or b == T.boolean then
+ return T.boolean
+ else
+ return T.universal
+ end
+ else
+ return T.universal -- IMPROVE
+ end
+end
+--[[TESTS:
+assert(T.superset_types(2, 2) == 2)
+assert(T.superset_types(2, 3) == T.number)
+assert(T.superset_types(2, T.number) == T.number)
+assert(T.superset_types(T.number, T.string) == T.universal)
+print 'DONE'
+--]]
+
+-- Determines whether type `o` certainly evaluates to true (true),
+-- certainly evaluates to false (false) or could evaluate to either
+-- true of false ('?').
+function T.boolean_cast(o)
+ if T.iserror[o] then -- special case
+ return '?'
+ elseif o == nil or o == false or o == T['nil'] then -- all subsets of {nil, false}
+ return false
+ elseif o == T.universal or o == T.boolean then -- all supersets of boolean
+ return '?'
+ else -- all subsets of universal - {nil, false}
+ return true
+ end
+end
+
+return T
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler.lua
new file mode 100644
index 0000000..e534cf4
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler.lua
@@ -0,0 +1,162 @@
+---------------------------------------------------------------------------
+-- Copyright (c) 2006-2013 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+--------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+--
+-- Convert between various code representation formats. Atomic
+-- converters are written in extenso, others are composed automatically
+-- by chaining the atomic ones together in a closure.
+--
+-- Supported formats are:
+--
+-- * srcfile: the name of a file containing sources.
+-- * src: these sources as a single string.
+-- * lexstream: a stream of lexemes.
+-- * ast: an abstract syntax tree.
+-- * proto: a (Yueliang) struture containing a high level
+-- representation of bytecode. Largely based on the
+-- Proto structure in Lua's VM
+-- * bytecode: a string dump of the function, as taken by
+-- loadstring() and produced by string.dump().
+-- * function: an executable lua function in RAM.
+--
+--------------------------------------------------------------------------------
+
+require 'checks'
+
+local M = { }
+
+--------------------------------------------------------------------------------
+-- Order of the transformations. if 'a' is on the left of 'b', then a 'a' can
+-- be transformed into a 'b' (but not the other way around).
+-- M.sequence goes for numbers to format names, M.order goes from format
+-- names to numbers.
+--------------------------------------------------------------------------------
+M.sequence = {
+ 'srcfile', 'src', 'lexstream', 'ast', 'proto', 'bytecode', 'function' }
+
+local arg_types = {
+ srcfile = { 'string', '?string' },
+ src = { 'string', '?string' },
+ lexstream = { 'lexer.stream', '?string' },
+ ast = { 'table', '?string' },
+ proto = { 'table', '?string' },
+ bytecode = { 'string', '?string' },
+}
+
+M.order= { }; for a,b in pairs(M.sequence) do M.order[b]=a end
+
+local CONV = { } -- conversion metatable __index
+
+function CONV :srcfile_to_src(x, name)
+ checks('metalua.compiler', 'string', '?string')
+ name = name or '@'..x
+ local f, msg = io.open (x, 'rb')
+ if not f then error(msg) end
+ local r, msg = f :read '*a'
+ if not r then error("Cannot read file '"..x.."': "..msg) end
+ f :close()
+ return r, name
+end
+
+function CONV :src_to_lexstream(src, name)
+ checks('metalua.compiler', 'string', '?string')
+ local r = self.parser.lexer :newstream (src, name)
+ return r, name
+end
+
+function CONV :lexstream_to_ast(lx, name)
+ checks('metalua.compiler', 'lexer.stream', '?string')
+ local r = self.parser.chunk(lx)
+ r.source = name
+ return r, name
+end
+
+local bytecode_compiler = nil -- cache to avoid repeated `pcall(require(...))`
+local function get_bytecode_compiler()
+ if bytecode_compiler then return bytecode_compiler else
+ local status, result = pcall(require, 'metalua.compiler.bytecode')
+ if status then
+ bytecode_compiler = result
+ return result
+ elseif string.match(result, "not found") then
+ error "Compilation only available with full Metalua"
+ else error (result) end
+ end
+end
+
+function CONV :ast_to_proto(ast, name)
+ checks('metalua.compiler', 'table', '?string')
+ return get_bytecode_compiler().ast_to_proto(ast, name), name
+end
+
+function CONV :proto_to_bytecode(proto, name)
+ return get_bytecode_compiler().proto_to_bytecode(proto), name
+end
+
+function CONV :bytecode_to_function(bc, name)
+ checks('metalua.compiler', 'string', '?string')
+ return loadstring(bc, name)
+end
+
+-- Create all sensible combinations
+for i=1,#M.sequence do
+ local src = M.sequence[i]
+ for j=i+2, #M.sequence do
+ local dst = M.sequence[j]
+ local dst_name = src.."_to_"..dst
+ local my_arg_types = arg_types[src]
+ local functions = { }
+ for k=i, j-1 do
+ local name = M.sequence[k].."_to_"..M.sequence[k+1]
+ local f = assert(CONV[name], name)
+ table.insert (functions, f)
+ end
+ CONV[dst_name] = function(self, a, b)
+ checks('metalua.compiler', unpack(my_arg_types))
+ for _, f in ipairs(functions) do
+ a, b = f(self, a, b)
+ end
+ return a, b
+ end
+ --printf("Created M.%s out of %s", dst_name, table.concat(n, ', '))
+ end
+end
+
+
+--------------------------------------------------------------------------------
+-- This one goes in the "wrong" direction, cannot be composed.
+--------------------------------------------------------------------------------
+function CONV :function_to_bytecode(...) return string.dump(...) end
+
+function CONV :ast_to_src(...)
+ require 'metalua.loader' -- ast_to_string isn't written in plain lua
+ return require 'metalua.compiler.ast_to_src' (...)
+end
+
+local MT = { __index=CONV, __type='metalua.compiler' }
+
+function M.new()
+ local parser = require 'metalua.compiler.parser' .new()
+ local self = { parser = parser }
+ setmetatable(self, MT)
+ return self
+end
+
+return M \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser.lua
new file mode 100644
index 0000000..74997ae
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser.lua
@@ -0,0 +1,42 @@
+--------------------------------------------------------------------------------
+-- Copyright (c) 2006-2013 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+--------------------------------------------------------------------------------
+
+-- Export all public APIs from sub-modules, squashed into a flat spacename
+
+local MT = { __type='metalua.compiler.parser' }
+
+local MODULE_REL_NAMES = { "annot.grammar", "expr", "meta", "misc",
+ "stat", "table", "ext" }
+
+local function new()
+ local M = {
+ lexer = require "metalua.compiler.parser.lexer" ();
+ extensions = { } }
+ for _, rel_name in ipairs(MODULE_REL_NAMES) do
+ local abs_name = "metalua.compiler.parser."..rel_name
+ local extender = require (abs_name)
+ if not M.extensions[abs_name] then
+ if type (extender) == 'function' then extender(M) end
+ M.extensions[abs_name] = extender
+ end
+ end
+ return setmetatable(M, MT)
+end
+
+return { new = new }
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/annot/generator.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/annot/generator.lua
new file mode 100644
index 0000000..a8fcd62
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/annot/generator.lua
@@ -0,0 +1,48 @@
+--------------------------------------------------------------------------------
+-- Copyright (c) 2006-2013 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+--------------------------------------------------------------------------------
+
+require 'checks'
+local gg = require 'metalua.grammar.generator'
+local M = { }
+
+function M.opt(mlc, primary, a_type)
+ checks('table', 'table|function', 'string')
+ return gg.sequence{
+ primary,
+ gg.onkeyword{ "#", function() return assert(mlc.annot[a_type]) end },
+ builder = function(x)
+ local t, annot = unpack(x)
+ return annot and { tag='Annot', t, annot } or t
+ end }
+end
+
+-- split a list of "foo" and "`Annot{foo, annot}" into a list of "foo"
+-- and a list of "annot".
+-- No annot list is returned if none of the elements were annotated.
+function M.split(lst)
+ local x, a, some = { }, { }, false
+ for i, p in ipairs(lst) do
+ if p.tag=='Annot' then
+ some, x[i], a[i] = true, unpack(p)
+ else x[i] = p end
+ end
+ if some then return x, a else return lst end
+end
+
+return M
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/annot/grammar.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/annot/grammar.lua
new file mode 100644
index 0000000..7ce3ec4
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/annot/grammar.lua
@@ -0,0 +1,112 @@
+--------------------------------------------------------------------------------
+-- Copyright (c) 2006-2013 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+--------------------------------------------------------------------------------
+
+local gg = require 'metalua.grammar.generator'
+
+return function(M)
+ local _M = gg.future(M)
+ M.lexer :add '->'
+ local A = { }
+ local _A = gg.future(A)
+ M.annot = A
+
+ -- Type identifier: Lua keywords such as `"nil"` allowed.
+ function M.annot.tid(lx)
+ local w = lx :next()
+ local t = w.tag
+ if t=='Keyword' and w[1] :match '^[%a_][%w_]*$' or w.tag=='Id'
+ then return {tag='TId'; lineinfo=w.lineinfo; w[1]}
+ else return gg.parse_error (lx, 'tid expected') end
+ end
+
+ local field_types = { var='TVar'; const='TConst';
+ currently='TCurrently'; field='TField' }
+
+ -- TODO check lineinfo
+ function M.annot.tf(lx)
+ local tk = lx:next()
+ local w = tk[1]
+ local tag = field_types[w]
+ if not tag then error ('Invalid field type '..w)
+ elseif tag=='TField' then return {tag='TField'} else
+ local te = M.te(lx)
+ return {tag=tag; te}
+ end
+ end
+
+ M.annot.tebar_content = gg.list{
+ name = 'tebar content',
+ primary = _A.te,
+ separators = { ",", ";" },
+ terminators = ")" }
+
+ M.annot.tebar = gg.multisequence{
+ name = 'annot.tebar',
+ --{ '*', builder = 'TDynbar' }, -- maybe not user-available
+ { '(', _A.tebar_content, ')',
+ builder = function(x) return x[1] end },
+ { _A.te }
+ }
+
+ M.annot.te = gg.multisequence{
+ name = 'annot.te',
+ { _A.tid, builder=function(x) return x[1] end },
+ { '*', builder = 'TDyn' },
+ { "[",
+ gg.list{
+ primary = gg.sequence{
+ _M.expr, "=", _A.tf,
+ builder = 'TPair'
+ },
+ separators = { ",", ";" },
+ terminators = { "]", "|" } },
+ gg.onkeyword{ "|", _A.tf },
+ "]",
+ builder = function(x)
+ local fields, other = unpack(x)
+ return { tag='TTable', other or {tag='TField'}, fields }
+ end }, -- "[ ... ]"
+ { '(', _A.tebar_content, ')', '->', '(', _A.tebar_content, ')',
+ builder = function(x)
+ local p, r = unpack(x)
+ return {tag='TFunction', p, r }
+ end } }
+
+ M.annot.ts = gg.multisequence{
+ name = 'annot.ts',
+ { 'return', _A.tebar_content, builder='TReturn' },
+ { _A.tid, builder = function(x)
+ if x[1][1]=='pass' then return {tag='TPass'}
+ else error "Bad statement type" end
+ end } }
+
+-- TODO: add parsers for statements:
+-- #return tebar
+-- #alias = te
+-- #ell = tf
+--[[
+ M.annot.stat_annot = gg.sequence{
+ gg.list{ primary=_A.tid, separators='.' },
+ '=',
+ XXX??,
+ builder = 'Annot' }
+--]]
+
+ return M.annot
+end \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/common.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/common.lua
new file mode 100644
index 0000000..1d6290e
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/common.lua
@@ -0,0 +1,27 @@
+--------------------------------------------------------------------------------
+-- Copyright (c) 2006-2013 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+--------------------------------------------------------------------------------
+
+-- Shared common parser table. It will be filled by parser.init(),
+-- and every other module will be able to call its elements at runtime.
+--
+-- If the table was directly created in parser.init, a circular
+-- dependency would be created: parser.init depends on other modules to fill the table,
+-- so other modules can't simultaneously depend on it.
+
+return { } \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/expr.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/expr.lua
new file mode 100644
index 0000000..b162e8a
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/expr.lua
@@ -0,0 +1,213 @@
+-------------------------------------------------------------------------------
+-- Copyright (c) 2006-2013 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+-------------------------------------------------------------------------------
+
+-------------------------------------------------------------------------------
+--
+-- Exported API:
+-- * [mlp.expr()]
+-- * [mlp.expr_list()]
+-- * [mlp.func_val()]
+--
+-------------------------------------------------------------------------------
+
+local pp = require 'metalua.pprint'
+local gg = require 'metalua.grammar.generator'
+local annot = require 'metalua.compiler.parser.annot.generator'
+
+return function(M)
+ local _M = gg.future(M)
+ local _table = gg.future(M, 'table')
+ local _meta = gg.future(M, 'meta') -- TODO move to ext?
+ local _annot = gg.future(M, 'annot') -- TODO move to annot
+
+ --------------------------------------------------------------------------------
+ -- Non-empty expression list. Actually, this isn't used here, but that's
+ -- handy to give to users.
+ --------------------------------------------------------------------------------
+ M.expr_list = gg.list{ primary=_M.expr, separators="," }
+
+ --------------------------------------------------------------------------------
+ -- Helpers for function applications / method applications
+ --------------------------------------------------------------------------------
+ M.func_args_content = gg.list{
+ name = "function arguments",
+ primary = _M.expr,
+ separators = ",",
+ terminators = ")" }
+
+ -- Used to parse methods
+ M.method_args = gg.multisequence{
+ name = "function argument(s)",
+ { "{", _table.content, "}" },
+ { "(", _M.func_args_content, ")", builder = unpack },
+ { "+{", _meta.quote_content, "}" },
+ -- TODO lineinfo?
+ function(lx) local r = M.opt_string(lx); return r and {r} or { } end }
+
+ --------------------------------------------------------------------------------
+ -- [func_val] parses a function, from opening parameters parenthese to
+ -- "end" keyword included. Used for anonymous functions as well as
+ -- function declaration statements (both local and global).
+ --
+ -- It's wrapped in a [_func_val] eta expansion, so that when expr
+ -- parser uses the latter, they will notice updates of [func_val]
+ -- definitions.
+ --------------------------------------------------------------------------------
+ M.func_params_content = gg.list{
+ name="function parameters",
+ gg.multisequence{ { "...", builder = "Dots" }, annot.opt(M, _M.id, 'te') },
+ separators = ",", terminators = {")", "|"} }
+
+ -- TODO move to annot
+ M.func_val = gg.sequence{
+ name = "function body",
+ "(", _M.func_params_content, ")", _M.block, "end",
+ builder = function(x)
+ local params, body = unpack(x)
+ local annots, some = { }, false
+ for i, p in ipairs(params) do
+ if p.tag=='Annot' then
+ params[i], annots[i], some = p[1], p[2], true
+ else annots[i] = false end
+ end
+ if some then return { tag='Function', params, body, annots }
+ else return { tag='Function', params, body } end
+ end }
+
+ local func_val = function(lx) return M.func_val(lx) end
+
+ --------------------------------------------------------------------------------
+ -- Default parser for primary expressions
+ --------------------------------------------------------------------------------
+ function M.id_or_literal (lx)
+ local a = lx:next()
+ if a.tag~="Id" and a.tag~="String" and a.tag~="Number" then
+ local msg
+ if a.tag=='Eof' then
+ msg = "End of file reached when an expression was expected"
+ elseif a.tag=='Keyword' then
+ msg = "An expression was expected, and `"..a[1]..
+ "' can't start an expression"
+ else
+ msg = "Unexpected expr token " .. pp.tostring (a)
+ end
+ gg.parse_error (lx, msg)
+ end
+ return a
+ end
+
+
+ --------------------------------------------------------------------------------
+ -- Builder generator for operators. Wouldn't be worth it if "|x|" notation
+ -- were allowed, but then lua 5.1 wouldn't compile it
+ --------------------------------------------------------------------------------
+
+ -- opf1 = |op| |_,a| `Op{ op, a }
+ local function opf1 (op) return
+ function (_,a) return { tag="Op", op, a } end end
+
+ -- opf2 = |op| |a,_,b| `Op{ op, a, b }
+ local function opf2 (op) return
+ function (a,_,b) return { tag="Op", op, a, b } end end
+
+ -- opf2r = |op| |a,_,b| `Op{ op, b, a } -- (args reversed)
+ local function opf2r (op) return
+ function (a,_,b) return { tag="Op", op, b, a } end end
+
+ local function op_ne(a, _, b)
+ -- This version allows to remove the "ne" operator from the AST definition.
+ -- However, it doesn't always produce the exact same bytecode as Lua 5.1.
+ return { tag="Op", "not",
+ { tag="Op", "eq", a, b, lineinfo= {
+ first = a.lineinfo.first, last = b.lineinfo.last } } }
+ end
+
+
+ --------------------------------------------------------------------------------
+ --
+ -- complete expression
+ --
+ --------------------------------------------------------------------------------
+
+ -- FIXME: set line number. In [expr] transformers probably
+ M.expr = gg.expr {
+ name = "expression",
+ primary = gg.multisequence{
+ name = "expr primary",
+ { "(", _M.expr, ")", builder = "Paren" },
+ { "function", _M.func_val, builder = unpack },
+ { "-{", _meta.splice_content, "}", builder = unpack },
+ { "+{", _meta.quote_content, "}", builder = unpack },
+ { "nil", builder = "Nil" },
+ { "true", builder = "True" },
+ { "false", builder = "False" },
+ { "...", builder = "Dots" },
+ { "{", _table.content, "}", builder = unpack },
+ _M.id_or_literal },
+
+ infix = {
+ name = "expr infix op",
+ { "+", prec = 60, builder = opf2 "add" },
+ { "-", prec = 60, builder = opf2 "sub" },
+ { "*", prec = 70, builder = opf2 "mul" },
+ { "/", prec = 70, builder = opf2 "div" },
+ { "%", prec = 70, builder = opf2 "mod" },
+ { "^", prec = 90, builder = opf2 "pow", assoc = "right" },
+ { "//", prec = 70, builder = opf2 "idiv" },
+ { "&", prec = 36, builder = opf2 "band" },
+ { "|", prec = 32, builder = opf2 "bor" },
+ { "~", prec = 34, builder = opf2 "bxor" },
+ { "<<", prec = 38, builder = opf2 "shl" },
+ { ">>", prec = 38, builder = opf2 "shr" },
+ { "..", prec = 40, builder = opf2 "concat", assoc = "right" },
+ { "==", prec = 30, builder = opf2 "eq" },
+ { "~=", prec = 30, builder = op_ne },
+ { "<", prec = 30, builder = opf2 "lt" },
+ { "<=", prec = 30, builder = opf2 "le" },
+ { ">", prec = 30, builder = opf2r "lt" },
+ { ">=", prec = 30, builder = opf2r "le" },
+ { "and",prec = 20, builder = opf2 "and" },
+ { "or", prec = 10, builder = opf2 "or" } },
+
+ prefix = {
+ name = "expr prefix op",
+ { "not", prec = 80, builder = opf1 "not" },
+ { "#", prec = 80, builder = opf1 "len" },
+ { "~", prec = 80, builder = opf2 "bnot" },
+ { "-", prec = 80, builder = opf1 "unm" } },
+
+ suffix = {
+ name = "expr suffix op",
+ { "[", _M.expr, "]", builder = function (tab, idx)
+ return {tag="Index", tab, idx[1]} end},
+ { ".", _M.id, builder = function (tab, field)
+ return {tag="Index", tab, _M.id2string(field[1])} end },
+ { "(", _M.func_args_content, ")", builder = function(f, args)
+ return {tag="Call", f, unpack(args[1])} end },
+ { "{", _table.content, "}", builder = function (f, arg)
+ return {tag="Call", f, arg[1]} end},
+ { ":", _M.id, _M.method_args, builder = function (obj, post)
+ local m_name, args = unpack(post)
+ return {tag="Invoke", obj, _M.id2string(m_name), unpack(args)} end},
+ { "+{", _meta.quote_content, "}", builder = function (f, arg)
+ return {tag="Call", f, arg[1] } end },
+ default = { name="opt_string_arg", parse = _M.opt_string, builder = function(f, arg)
+ return {tag="Call", f, arg } end } } }
+ return M
+end \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/ext.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/ext.lua
new file mode 100644
index 0000000..4e9d395
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/ext.lua
@@ -0,0 +1,96 @@
+-------------------------------------------------------------------------------
+-- Copyright (c) 2006-2013 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+-------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+--
+-- Non-Lua syntax extensions
+--
+--------------------------------------------------------------------------------
+
+local gg = require 'metalua.grammar.generator'
+
+return function(M)
+
+ local _M = gg.future(M)
+
+ ---------------------------------------------------------------------------
+ -- Algebraic Datatypes
+ ----------------------------------------------------------------------------
+ local function adt (lx)
+ local node = _M.id (lx)
+ local tagval = node[1]
+ -- tagkey = `Pair{ `String "key", `String{ -{tagval} } }
+ local tagkey = { tag="Pair", {tag="String", "tag"}, {tag="String", tagval} }
+ if lx:peek().tag == "String" or lx:peek().tag == "Number" then
+ -- TODO support boolean litterals
+ return { tag="Table", tagkey, lx:next() }
+ elseif lx:is_keyword (lx:peek(), "{") then
+ local x = M.table.table (lx)
+ table.insert (x, 1, tagkey)
+ return x
+ else return { tag="Table", tagkey } end
+ end
+
+ M.adt = gg.sequence{ "`", adt, builder = unpack }
+
+ M.expr.primary :add(M.adt)
+
+ ----------------------------------------------------------------------------
+ -- Anonymous lambda
+ ----------------------------------------------------------------------------
+ M.lambda_expr = gg.sequence{
+ "|", _M.func_params_content, "|", _M.expr,
+ builder = function (x)
+ local li = x[2].lineinfo
+ return { tag="Function", x[1],
+ { {tag="Return", x[2], lineinfo=li }, lineinfo=li } }
+ end }
+
+ M.expr.primary :add (M.lambda_expr)
+
+ --------------------------------------------------------------------------------
+ -- Allows to write "a `f` b" instead of "f(a, b)". Taken from Haskell.
+ --------------------------------------------------------------------------------
+ function M.expr_in_backquotes (lx) return M.expr(lx, 35) end -- 35=limited precedence
+ M.expr.infix :add{ name = "infix function",
+ "`", _M.expr_in_backquotes, "`", prec = 35, assoc="left",
+ builder = function(a, op, b) return {tag="Call", op[1], a, b} end }
+
+ --------------------------------------------------------------------------------
+ -- C-style op+assignments
+ -- TODO: no protection against side-effects in LHS vars.
+ --------------------------------------------------------------------------------
+ local function op_assign(kw, op)
+ local function rhs(a, b) return { tag="Op", op, a, b } end
+ local function f(a,b)
+ if #a ~= #b then gg.parse_error "assymetric operator+assignment" end
+ local right = { }
+ local r = { tag="Set", a, right }
+ for i=1, #a do right[i] = { tag="Op", op, a[i], b[i] } end
+ return r
+ end
+ M.lexer :add (kw)
+ M.assignments[kw] = f
+ end
+
+ local ops = { add='+='; sub='-='; mul='*='; div='/=' }
+ for ast_op_name, keyword in pairs(ops) do op_assign(keyword, ast_op_name) end
+
+ return M
+end \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/lexer.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/lexer.lua
new file mode 100644
index 0000000..024c479
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/lexer.lua
@@ -0,0 +1,44 @@
+--------------------------------------------------------------------------------
+-- Copyright (c) 2006-2014 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+--------------------------------------------------------------------------------
+
+----------------------------------------------------------------------
+-- Generate a new lua-specific lexer, derived from the generic lexer.
+----------------------------------------------------------------------
+
+local generic_lexer = require 'metalua.grammar.lexer'
+
+return function()
+ local lexer = generic_lexer.lexer :clone()
+
+ local keywords = {
+ "and", "break", "do", "else", "elseif",
+ "end", "false", "for", "function",
+ "goto", -- Lua5.2
+ "if",
+ "in", "local", "nil", "not", "or", "repeat",
+ "return", "then", "true", "until", "while",
+ "...", "..", "==", ">=", "<=", "~=",
+ "<<", ">>", "//", -- Lua5.3
+ "::", -- Lua5.2
+ "+{", "-{" } -- Metalua
+
+ for _, w in ipairs(keywords) do lexer :add (w) end
+
+ return lexer
+end \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/meta.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/meta.lua
new file mode 100644
index 0000000..71eb3c3
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/meta.lua
@@ -0,0 +1,138 @@
+-------------------------------------------------------------------------------
+-- Copyright (c) 2006-2014 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+-------------------------------------------------------------------------------
+
+-- Compile-time metaprogramming features: splicing ASTs generated during compilation,
+-- AST quasi-quoting helpers.
+
+local gg = require 'metalua.grammar.generator'
+
+return function(M)
+ local _M = gg.future(M)
+ M.meta={ }
+ local _MM = gg.future(M.meta)
+
+ --------------------------------------------------------------------------------
+ -- External splicing: compile an AST into a chunk, load and evaluate
+ -- that chunk, and replace the chunk by its result (which must also be
+ -- an AST).
+ --------------------------------------------------------------------------------
+
+ -- TODO: that's not part of the parser
+ function M.meta.eval (ast)
+ -- TODO: should there be one mlc per splice, or per parser instance?
+ local mlc = require 'metalua.compiler'.new()
+ local f = mlc :ast_to_function (ast, '=splice')
+ local result=f(M) -- splices act on the current parser
+ return result
+ end
+
+ ----------------------------------------------------------------------------
+ -- Going from an AST to an AST representing that AST
+ -- the only hash-part key being lifted is `"tag"`.
+ -- Doesn't lift subtrees protected inside a `Splice{ ... }.
+ -- e.g. change `Foo{ 123 } into
+ -- `Table{ `Pair{ `String "tag", `String "foo" }, `Number 123 }
+ ----------------------------------------------------------------------------
+ local function lift (t)
+ --print("QUOTING:", table.tostring(t, 60,'nohash'))
+ local cases = { }
+ function cases.table (t)
+ local mt = { tag = "Table" }
+ --table.insert (mt, { tag = "Pair", quote "quote", { tag = "True" } })
+ if t.tag == "Splice" then
+ assert (#t==1, "Invalid splice")
+ local sp = t[1]
+ return sp
+ elseif t.tag then
+ table.insert (mt, { tag="Pair", lift "tag", lift(t.tag) })
+ end
+ for _, v in ipairs (t) do
+ table.insert (mt, lift(v))
+ end
+ return mt
+ end
+ function cases.number (t) return { tag = "Number", t, quote = true } end
+ function cases.string (t) return { tag = "String", t, quote = true } end
+ function cases.boolean (t) return { tag = t and "True" or "False", t, quote = true } end
+ local f = cases [type(t)]
+ if f then return f(t) else error ("Cannot quote an AST containing "..tostring(t)) end
+ end
+ M.meta.lift = lift
+
+ --------------------------------------------------------------------------------
+ -- when this variable is false, code inside [-{...}] is compiled and
+ -- avaluated immediately. When it's true (supposedly when we're
+ -- parsing data inside a quasiquote), [-{foo}] is replaced by
+ -- [`Splice{foo}], which will be unpacked by [quote()].
+ --------------------------------------------------------------------------------
+ local in_a_quote = false
+
+ --------------------------------------------------------------------------------
+ -- Parse the inside of a "-{ ... }"
+ --------------------------------------------------------------------------------
+ function M.meta.splice_content (lx)
+ local parser_name = "expr"
+ if lx:is_keyword (lx:peek(2), ":") then
+ local a = lx:next()
+ lx:next() -- skip ":"
+ assert (a.tag=="Id", "Invalid splice parser name")
+ parser_name = a[1]
+ end
+ -- TODO FIXME running a new parser with the old lexer?!
+ local parser = require 'metalua.compiler.parser'.new()
+ local ast = parser [parser_name](lx)
+ if in_a_quote then -- only prevent quotation in this subtree
+ --printf("SPLICE_IN_QUOTE:\n%s", _G.table.tostring(ast, "nohash", 60))
+ return { tag="Splice", ast }
+ else -- convert in a block, eval, replace with result
+ if parser_name == "expr" then ast = { { tag="Return", ast } }
+ elseif parser_name == "stat" then ast = { ast }
+ elseif parser_name ~= "block" then
+ error ("splice content must be an expr, stat or block") end
+ --printf("EXEC THIS SPLICE:\n%s", _G.table.tostring(ast, "nohash", 60))
+ return M.meta.eval (ast)
+ end
+ end
+
+ M.meta.splice = gg.sequence{ "-{", _MM.splice_content, "}", builder=unpack }
+
+ --------------------------------------------------------------------------------
+ -- Parse the inside of a "+{ ... }"
+ --------------------------------------------------------------------------------
+ function M.meta.quote_content (lx)
+ local parser
+ if lx:is_keyword (lx:peek(2), ":") then -- +{parser: content }
+ local parser_name = M.id(lx)[1]
+ parser = M[parser_name]
+ lx:next() -- skip ":"
+ else -- +{ content }
+ parser = M.expr
+ end
+
+ local prev_iq = in_a_quote
+ in_a_quote = true
+ --print("IN_A_QUOTE")
+ local content = parser (lx)
+ local q_content = M.meta.lift (content)
+ in_a_quote = prev_iq
+ return q_content
+ end
+
+ return M
+end \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/misc.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/misc.lua
new file mode 100644
index 0000000..22a63f4
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/misc.lua
@@ -0,0 +1,147 @@
+-------------------------------------------------------------------------------
+-- Copyright (c) 2006-2013 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+-------------------------------------------------------------------------------
+
+-------------------------------------------------------------------------------
+--
+-- Summary: metalua parser, miscellaneous utility functions.
+--
+-------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+--
+-- Exported API:
+-- * [mlp.fget()]
+-- * [mlp.id()]
+-- * [mlp.opt_id()]
+-- * [mlp.id_list()]
+-- * [mlp.string()]
+-- * [mlp.opt_string()]
+-- * [mlp.id2string()]
+--
+--------------------------------------------------------------------------------
+
+local gg = require 'metalua.grammar.generator'
+
+-- TODO: replace splice-aware versions with naive ones, move etensions in ./meta
+
+return function(M)
+ local _M = gg.future(M)
+
+
+ --------------------------------------------------------------------------------
+ -- Try to read an identifier (possibly as a splice), or return [false] if no
+ -- id is found.
+ --------------------------------------------------------------------------------
+ function M.opt_id (lx)
+ local a = lx:peek();
+ if lx:is_keyword (a, "-{") then
+ local v = M.meta.splice(lx)
+ if v.tag ~= "Id" and v.tag ~= "Splice" then
+ gg.parse_error(lx, "Bad id splice")
+ end
+ return v
+ elseif a.tag == "Id" then return lx:next()
+ else return false end
+ end
+
+ --------------------------------------------------------------------------------
+ -- Mandatory reading of an id: causes an error if it can't read one.
+ --------------------------------------------------------------------------------
+ function M.id (lx)
+ return M.opt_id (lx) or gg.parse_error(lx,"Identifier expected")
+ end
+
+ --------------------------------------------------------------------------------
+ -- Common helper function
+ --------------------------------------------------------------------------------
+ M.id_list = gg.list { primary = _M.id, separators = "," }
+
+ --------------------------------------------------------------------------------
+ -- Converts an identifier into a string. Hopefully one day it'll handle
+ -- splices gracefully, but that proves quite tricky.
+ --------------------------------------------------------------------------------
+ function M.id2string (id)
+ --print("id2string:", disp.ast(id))
+ if id.tag == "Id" then id.tag = "String"; return id
+ elseif id.tag == "Splice" then
+ error ("id2string on splice not implemented")
+ -- Evaluating id[1] will produce `Id{ xxx },
+ -- and we want it to produce `String{ xxx }.
+ -- The following is the plain notation of:
+ -- +{ `String{ `Index{ `Splice{ -{id[1]} }, `Number 1 } } }
+ return { tag="String", { tag="Index", { tag="Splice", id[1] },
+ { tag="Number", 1 } } }
+ else error ("Identifier expected: "..table.tostring(id, 'nohash')) end
+ end
+
+ --------------------------------------------------------------------------------
+ -- Read a string, possibly spliced, or return an error if it can't
+ --------------------------------------------------------------------------------
+ function M.string (lx)
+ local a = lx:peek()
+ if lx:is_keyword (a, "-{") then
+ local v = M.meta.splice(lx)
+ if v.tag ~= "String" and v.tag ~= "Splice" then
+ gg.parse_error(lx,"Bad string splice")
+ end
+ return v
+ elseif a.tag == "String" then return lx:next()
+ else error "String expected" end
+ end
+
+ --------------------------------------------------------------------------------
+ -- Try to read a string, or return false if it can't. No splice allowed.
+ --------------------------------------------------------------------------------
+ function M.opt_string (lx)
+ return lx:peek().tag == "String" and lx:next()
+ end
+
+ --------------------------------------------------------------------------------
+ -- Chunk reader: block + Eof
+ --------------------------------------------------------------------------------
+ function M.skip_initial_sharp_comment (lx)
+ -- Dirty hack: I'm happily fondling lexer's private parts
+ -- FIXME: redundant with lexer:newstream()
+ lx :sync()
+ local i = lx.src:match ("^#.-\n()", lx.i)
+ if i then
+ lx.i = i
+ lx.column_offset = i
+ lx.line = lx.line and lx.line + 1 or 1
+ end
+ end
+
+ local function chunk (lx)
+ if lx:peek().tag == 'Eof' then
+ return { } -- handle empty files
+ else
+ M.skip_initial_sharp_comment (lx)
+ local chunk = M.block (lx)
+ if lx:peek().tag ~= "Eof" then
+ gg.parse_error(lx, "End-of-file expected")
+ end
+ return chunk
+ end
+ end
+
+ -- chunk is wrapped in a sequence so that it has a "transformer" field.
+ M.chunk = gg.sequence { chunk, builder = unpack }
+
+ return M
+end \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/stat.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/stat.lua
new file mode 100644
index 0000000..f7abb7b
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/stat.lua
@@ -0,0 +1,283 @@
+------------------------------------------------------------------------------
+-- Copyright (c) 2006-2013 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+-------------------------------------------------------------------------------
+
+-------------------------------------------------------------------------------
+--
+-- Summary: metalua parser, statement/block parser. This is part of the
+-- definition of module [mlp].
+--
+-------------------------------------------------------------------------------
+
+-------------------------------------------------------------------------------
+--
+-- Exports API:
+-- * [mlp.stat()]
+-- * [mlp.block()]
+-- * [mlp.for_header()]
+--
+-------------------------------------------------------------------------------
+
+local lexer = require 'metalua.grammar.lexer'
+local gg = require 'metalua.grammar.generator'
+
+local annot = require 'metalua.compiler.parser.annot.generator'
+
+--------------------------------------------------------------------------------
+-- List of all keywords that indicate the end of a statement block. Users are
+-- likely to extend this list when designing extensions.
+--------------------------------------------------------------------------------
+
+
+return function(M)
+ local _M = gg.future(M)
+
+ M.block_terminators = { "else", "elseif", "end", "until", ")", "}", "]" }
+
+ -- FIXME: this must be handled from within GG!!!
+ -- FIXME: there's no :add method in the list anyway. Added by gg.list?!
+ function M.block_terminators :add(x)
+ if type (x) == "table" then for _, y in ipairs(x) do self :add (y) end
+ else table.insert (self, x) end
+ end
+
+ ----------------------------------------------------------------------------
+ -- list of statements, possibly followed by semicolons
+ ----------------------------------------------------------------------------
+ M.block = gg.list {
+ name = "statements block",
+ terminators = M.block_terminators,
+ primary = function (lx)
+ -- FIXME use gg.optkeyword()
+ local x = M.stat (lx)
+ if lx:is_keyword (lx:peek(), ";") then lx:next() end
+ return x
+ end }
+
+ ----------------------------------------------------------------------------
+ -- Helper function for "return <expr_list>" parsing.
+ -- Called when parsing return statements.
+ -- The specific test for initial ";" is because it's not a block terminator,
+ -- so without it gg.list would choke on "return ;" statements.
+ -- We don't make a modified copy of block_terminators because this list
+ -- is sometimes modified at runtime, and the return parser would get out of
+ -- sync if it was relying on a copy.
+ ----------------------------------------------------------------------------
+ local return_expr_list_parser = gg.multisequence{
+ { ";" , builder = function() return { } end },
+ default = gg.list {
+ _M.expr, separators = ",", terminators = M.block_terminators } }
+
+
+ local for_vars_list = gg.list{
+ name = "for variables list",
+ primary = _M.id,
+ separators = ",",
+ terminators = "in" }
+
+ ----------------------------------------------------------------------------
+ -- for header, between [for] and [do] (exclusive).
+ -- Return the `Forxxx{...} AST, without the body element (the last one).
+ ----------------------------------------------------------------------------
+ function M.for_header (lx)
+ local vars = M.id_list(lx)
+ if lx :is_keyword (lx:peek(), "=") then
+ if #vars ~= 1 then
+ gg.parse_error (lx, "numeric for only accepts one variable")
+ end
+ lx:next() -- skip "="
+ local exprs = M.expr_list (lx)
+ if #exprs < 2 or #exprs > 3 then
+ gg.parse_error (lx, "numeric for requires 2 or 3 boundaries")
+ end
+ return { tag="Fornum", vars[1], unpack (exprs) }
+ else
+ if not lx :is_keyword (lx :next(), "in") then
+ gg.parse_error (lx, '"=" or "in" expected in for loop')
+ end
+ local exprs = M.expr_list (lx)
+ return { tag="Forin", vars, exprs }
+ end
+ end
+
+ ----------------------------------------------------------------------------
+ -- Function def parser helper: id ( . id ) *
+ ----------------------------------------------------------------------------
+ local function fn_builder (list)
+ local acc = list[1]
+ local first = acc.lineinfo.first
+ for i = 2, #list do
+ local index = M.id2string(list[i])
+ local li = lexer.new_lineinfo(first, index.lineinfo.last)
+ acc = { tag="Index", acc, index, lineinfo=li }
+ end
+ return acc
+ end
+ local func_name = gg.list{ _M.id, separators = ".", builder = fn_builder }
+
+ ----------------------------------------------------------------------------
+ -- Function def parser helper: ( : id )?
+ ----------------------------------------------------------------------------
+ local method_name = gg.onkeyword{ name = "method invocation", ":", _M.id,
+ transformers = { function(x) return x and x.tag=='Id' and M.id2string(x) end } }
+
+ ----------------------------------------------------------------------------
+ -- Function def builder
+ ----------------------------------------------------------------------------
+ local function funcdef_builder(x)
+ local name, method, func = unpack(x)
+ if method then
+ name = { tag="Index", name, method,
+ lineinfo = {
+ first = name.lineinfo.first,
+ last = method.lineinfo.last } }
+ table.insert (func[1], 1, {tag="Id", "self"})
+ end
+ local r = { tag="Set", {name}, {func} }
+ r[1].lineinfo = name.lineinfo
+ r[2].lineinfo = func.lineinfo
+ return r
+ end
+
+
+ ----------------------------------------------------------------------------
+ -- if statement builder
+ ----------------------------------------------------------------------------
+ local function if_builder (x)
+ local cond_block_pairs, else_block, r = x[1], x[2], {tag="If"}
+ local n_pairs = #cond_block_pairs
+ for i = 1, n_pairs do
+ local cond, block = unpack(cond_block_pairs[i])
+ r[2*i-1], r[2*i] = cond, block
+ end
+ if else_block then table.insert(r, #r+1, else_block) end
+ return r
+ end
+
+ --------------------------------------------------------------------------------
+ -- produce a list of (expr,block) pairs
+ --------------------------------------------------------------------------------
+ local elseifs_parser = gg.list {
+ gg.sequence { _M.expr, "then", _M.block , name='elseif parser' },
+ separators = "elseif",
+ terminators = { "else", "end" }
+ }
+
+ local annot_expr = gg.sequence {
+ _M.expr,
+ gg.onkeyword{ "#", gg.future(M, 'annot').tf },
+ builder = function(x)
+ local e, a = unpack(x)
+ if a then return { tag='Annot', e, a }
+ else return e end
+ end }
+
+ local annot_expr_list = gg.list {
+ primary = annot.opt(M, _M.expr, 'tf'), separators = ',' }
+
+ ------------------------------------------------------------------------
+ -- assignments and calls: statements that don't start with a keyword
+ ------------------------------------------------------------------------
+ local function assign_or_call_stat_parser (lx)
+ local e = annot_expr_list (lx)
+ local a = lx:is_keyword(lx:peek())
+ local op = a and M.assignments[a]
+ -- TODO: refactor annotations
+ if op then
+ --FIXME: check that [e] is a LHS
+ lx :next()
+ local annots
+ e, annots = annot.split(e)
+ local v = M.expr_list (lx)
+ if type(op)=="string" then return { tag=op, e, v, annots }
+ else return op (e, v) end
+ else
+ assert (#e > 0)
+ if #e > 1 then
+ gg.parse_error (lx,
+ "comma is not a valid statement separator; statement can be "..
+ "separated by semicolons, or not separated at all")
+ elseif e[1].tag ~= "Call" and e[1].tag ~= "Invoke" then
+ local typename
+ if e[1].tag == 'Id' then
+ typename = '("'..e[1][1]..'") is an identifier'
+ elseif e[1].tag == 'Op' then
+ typename = "is an arithmetic operation"
+ else typename = "is of type '"..(e[1].tag or "<list>").."'" end
+ gg.parse_error (lx,
+ "This expression %s; "..
+ "a statement was expected, and only function and method call "..
+ "expressions can be used as statements", typename);
+ end
+ return e[1]
+ end
+ end
+
+ M.local_stat_parser = gg.multisequence{
+ -- local function <name> <func_val>
+ { "function", _M.id, _M.func_val, builder =
+ function(x)
+ local vars = { x[1], lineinfo = x[1].lineinfo }
+ local vals = { x[2], lineinfo = x[2].lineinfo }
+ return { tag="Localrec", vars, vals }
+ end },
+ -- local <id_list> ( = <expr_list> )?
+ default = gg.sequence{
+ gg.list{
+ primary = annot.opt(M, _M.id, 'tf'),
+ separators = ',' },
+ gg.onkeyword{ "=", _M.expr_list },
+ builder = function(x)
+ local annotated_left, right = unpack(x)
+ local left, annotations = annot.split(annotated_left)
+ return {tag="Local", left, right or { }, annotations }
+ end } }
+
+ ------------------------------------------------------------------------
+ -- statement
+ ------------------------------------------------------------------------
+ M.stat = gg.multisequence {
+ name = "statement",
+ { "do", _M.block, "end", builder =
+ function (x) return { tag="Do", unpack (x[1]) } end },
+ { "for", _M.for_header, "do", _M.block, "end", builder =
+ function (x) x[1][#x[1]+1] = x[2]; return x[1] end },
+ { "function", func_name, method_name, _M.func_val, builder=funcdef_builder },
+ { "while", _M.expr, "do", _M.block, "end", builder = "While" },
+ { "repeat", _M.block, "until", _M.expr, builder = "Repeat" },
+ { "local", _M.local_stat_parser, builder = unpack },
+ { "return", return_expr_list_parser, builder =
+ function(x) x[1].tag='Return'; return x[1] end },
+ { "goto", _M.id, builder =
+ function(x) x[1].tag='Goto'; return x[1] end },
+ { "::", _M.id, "::", builder =
+ function(x) x[1].tag='Label'; return x[1] end },
+ { "break", builder = function() return { tag="Break" } end },
+ { "-{", gg.future(M, 'meta').splice_content, "}", builder = unpack },
+ { "if", gg.nonempty(elseifs_parser), gg.onkeyword{ "else", M.block }, "end",
+ builder = if_builder },
+ default = assign_or_call_stat_parser }
+
+ M.assignments = {
+ ["="] = "Set"
+ }
+
+ function M.assignments:add(k, v) self[k] = v end
+
+ return M
+end \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/table.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/table.lua
new file mode 100644
index 0000000..11102d9
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/compiler/parser/table.lua
@@ -0,0 +1,77 @@
+--------------------------------------------------------------------------------
+-- Copyright (c) 2006-2013 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+--------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+--
+-- Exported API:
+-- * [M.table_bracket_field()]
+-- * [M.table_field()]
+-- * [M.table_content()]
+-- * [M.table()]
+--
+-- KNOWN BUG: doesn't handle final ";" or "," before final "}"
+--
+--------------------------------------------------------------------------------
+
+local gg = require 'metalua.grammar.generator'
+
+return function(M)
+
+ M.table = { }
+ local _table = gg.future(M.table)
+ local _expr = gg.future(M).expr
+
+ --------------------------------------------------------------------------------
+ -- `[key] = value` table field definition
+ --------------------------------------------------------------------------------
+ M.table.bracket_pair = gg.sequence{ "[", _expr, "]", "=", _expr, builder = "Pair" }
+
+ --------------------------------------------------------------------------------
+ -- table element parser: list value, `id = value` pair or `[value] = value` pair.
+ --------------------------------------------------------------------------------
+ function M.table.element (lx)
+ if lx :is_keyword (lx :peek(), "[") then return M.table.bracket_pair(lx) end
+ local e = M.expr (lx)
+ if not lx :is_keyword (lx :peek(), "=") then return e end
+ lx :next(); -- skip the "="
+ local key = M.id2string(e) -- will fail on non-identifiers
+ local val = M.expr(lx)
+ local r = { tag="Pair", key, val }
+ r.lineinfo = { first = key.lineinfo.first, last = val.lineinfo.last }
+ return r
+ end
+
+ -----------------------------------------------------------------------------
+ -- table constructor, without enclosing braces; returns a full table object
+ -----------------------------------------------------------------------------
+ M.table.content = gg.list {
+ -- eta expansion to allow patching the element definition
+ primary = _table.element,
+ separators = { ",", ";" },
+ terminators = "}",
+ builder = "Table" }
+
+ --------------------------------------------------------------------------------
+ -- complete table constructor including [{...}]
+ --------------------------------------------------------------------------------
+ -- TODO beware, stat and expr use only table.content, this can't be patched.
+ M.table.table = gg.sequence{ "{", _table.content, "}", builder = unpack }
+
+ return M
+end \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/grammar/generator.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/grammar/generator.lua
new file mode 100644
index 0000000..4633c6e
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/grammar/generator.lua
@@ -0,0 +1,832 @@
+--------------------------------------------------------------------------------
+-- Copyright (c) 2006-2013 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+--------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+--
+-- Summary: parser generator. Collection of higher order functors,
+-- which allow to build and combine parsers. Relies on a lexer
+-- that supports the same API as the one exposed in mll.lua.
+--
+--------------------------------------------------------------------------------
+
+--------------------------------------------------------------------------------
+--
+-- Exported API:
+--
+-- Parser generators:
+-- * [gg.sequence()]
+-- * [gg.multisequence()]
+-- * [gg.expr()]
+-- * [gg.list()]
+-- * [gg.onkeyword()]
+-- * [gg.optkeyword()]
+--
+-- Other functions:
+-- * [gg.parse_error()]
+-- * [gg.make_parser()]
+-- * [gg.is_parser()]
+--
+--------------------------------------------------------------------------------
+
+local M = { }
+
+local lexer = require 'metalua.grammar.lexer'
+
+--------------------------------------------------------------------------------
+-- Symbol generator: [gensym()] returns a guaranteed-to-be-unique identifier.
+-- The main purpose is to avoid variable capture in macros.
+--
+-- If a string is passed as an argument, theis string will be part of the
+-- id name (helpful for macro debugging)
+--------------------------------------------------------------------------------
+local gensymidx = 0
+
+function M.gensym (arg)
+ gensymidx = gensymidx + 1
+ return { tag="Id", string.format(".%i.%s", gensymidx, arg or "")}
+end
+
+
+-------------------------------------------------------------------------------
+-- parser metatable, which maps __call to method parse, and adds some
+-- error tracing boilerplate.
+-------------------------------------------------------------------------------
+local parser_metatable = { }
+
+function parser_metatable :__call (lx, ...)
+ return self :parse (lx, ...)
+end
+
+-------------------------------------------------------------------------------
+-- Turn a table into a parser, mainly by setting the metatable.
+-------------------------------------------------------------------------------
+function M.make_parser(kind, p)
+ p.kind = kind
+ if not p.transformers then p.transformers = { } end
+ function p.transformers:add (x)
+ table.insert (self, x)
+ end
+ setmetatable (p, parser_metatable)
+ return p
+end
+
+-------------------------------------------------------------------------------
+-- Return true iff [x] is a parser.
+-- If it's a gg-generated parser, return the name of its kind.
+-------------------------------------------------------------------------------
+function M.is_parser (x)
+ return type(x)=="function" or getmetatable(x)==parser_metatable and x.kind
+end
+
+-------------------------------------------------------------------------------
+-- Parse a sequence, without applying builder nor transformers.
+-------------------------------------------------------------------------------
+local function raw_parse_sequence (lx, p)
+ local r = { }
+ for i=1, #p do
+ local e=p[i]
+ if type(e) == "string" then
+ local kw = lx :next()
+ if not lx :is_keyword (kw, e) then
+ M.parse_error(
+ lx, "A keyword was expected, probably `%s'.", e)
+ end
+ elseif M.is_parser (e) then
+ table.insert (r, e(lx))
+ else -- Invalid parser definition, this is *not* a parsing error
+ error(string.format(
+ "Sequence `%s': element #%i is neither a string nor a parser: %s",
+ p.name, i, table.tostring(e)))
+ end
+ end
+ return r
+end
+
+-------------------------------------------------------------------------------
+-- Parse a multisequence, without applying multisequence transformers.
+-- The sequences are completely parsed.
+-------------------------------------------------------------------------------
+local function raw_parse_multisequence (lx, sequence_table, default)
+ local seq_parser = sequence_table[lx:is_keyword(lx:peek())]
+ if seq_parser then return seq_parser (lx)
+ elseif default then return default (lx)
+ else return false end
+end
+
+-------------------------------------------------------------------------------
+-- Applies all transformers listed in parser on ast.
+-------------------------------------------------------------------------------
+local function transform (ast, parser, fli, lli)
+ if parser.transformers then
+ for _, t in ipairs (parser.transformers) do ast = t(ast) or ast end
+ end
+ if type(ast) == 'table' then
+ local ali = ast.lineinfo
+ if not ali or ali.first~=fli or ali.last~=lli then
+ ast.lineinfo = lexer.new_lineinfo(fli, lli)
+ end
+ end
+ return ast
+end
+
+-------------------------------------------------------------------------------
+-- Generate a tracable parsing error (not implemented yet)
+-------------------------------------------------------------------------------
+function M.parse_error(lx, fmt, ...)
+ local li = lx:lineinfo_left()
+ local file, line, column, offset, positions
+ if li then
+ file, line, column, offset = li.source, li.line, li.column, li.offset
+ positions = { first = li, last = li }
+ else
+ line, column, offset = -1, -1, -1
+ end
+
+ local msg = string.format("line %i, char %i: "..fmt, line, column, ...)
+ if file and file~='?' then msg = "file "..file..", "..msg end
+
+ local src = lx.src
+ if offset>0 and src then
+ local i, j = offset, offset
+ while src:sub(i,i) ~= '\n' and i>=0 do i=i-1 end
+ while src:sub(j,j) ~= '\n' and j<=#src do j=j+1 end
+ local srcline = src:sub (i+1, j-1)
+ local idx = string.rep (" ", column).."^"
+ msg = string.format("%s\n>>> %s\n>>> %s", msg, srcline, idx)
+ end
+ --lx :kill()
+ error(msg)
+end
+
+-------------------------------------------------------------------------------
+--
+-- Sequence parser generator
+--
+-------------------------------------------------------------------------------
+-- Input fields:
+--
+-- * [builder]: how to build an AST out of sequence parts. let [x] be the list
+-- of subparser results (keywords are simply omitted). [builder] can be:
+-- - [nil], in which case the result of parsing is simply [x]
+-- - a string, which is then put as a tag on [x]
+-- - a function, which takes [x] as a parameter and returns an AST.
+--
+-- * [name]: the name of the parser. Used for debug messages
+--
+-- * [transformers]: a list of AST->AST functions, applied in order on ASTs
+-- returned by the parser.
+--
+-- * Table-part entries corresponds to keywords (strings) and subparsers
+-- (function and callable objects).
+--
+-- After creation, the following fields are added:
+-- * [parse] the parsing function lexer->AST
+-- * [kind] == "sequence"
+-- * [name] is set, if it wasn't in the input.
+--
+-------------------------------------------------------------------------------
+function M.sequence (p)
+ M.make_parser ("sequence", p)
+
+ -------------------------------------------------------------------
+ -- Parsing method
+ -------------------------------------------------------------------
+ function p:parse (lx)
+
+ -- Raw parsing:
+ local fli = lx:lineinfo_right()
+ local seq = raw_parse_sequence (lx, self)
+ local lli = lx:lineinfo_left()
+
+ -- Builder application:
+ local builder, tb = self.builder, type (self.builder)
+ if tb == "string" then seq.tag = builder
+ elseif tb == "function" or builder and builder.__call then seq = builder(seq)
+ elseif builder == nil then -- nothing
+ else error ("Invalid builder of type "..tb.." in sequence") end
+ seq = transform (seq, self, fli, lli)
+ assert (not seq or seq.lineinfo)
+ return seq
+ end
+
+ -------------------------------------------------------------------
+ -- Construction
+ -------------------------------------------------------------------
+ -- Try to build a proper name
+ if p.name then
+ -- don't touch existing name
+ elseif type(p[1])=="string" then -- find name based on 1st keyword
+ if #p==1 then p.name=p[1]
+ elseif type(p[#p])=="string" then
+ p.name = p[1] .. " ... " .. p[#p]
+ else p.name = p[1] .. " ..." end
+ else -- can't find a decent name
+ p.name = "unnamed_sequence"
+ end
+
+ return p
+end --</sequence>
+
+
+-------------------------------------------------------------------------------
+--
+-- Multiple, keyword-driven, sequence parser generator
+--
+-------------------------------------------------------------------------------
+-- in [p], useful fields are:
+--
+-- * [transformers]: as usual
+--
+-- * [name]: as usual
+--
+-- * Table-part entries must be sequence parsers, or tables which can
+-- be turned into a sequence parser by [gg.sequence]. These
+-- sequences must start with a keyword, and this initial keyword
+-- must be different for each sequence. The table-part entries will
+-- be removed after [gg.multisequence] returns.
+--
+-- * [default]: the parser to run if the next keyword in the lexer is
+-- none of the registered initial keywords. If there's no default
+-- parser and no suitable initial keyword, the multisequence parser
+-- simply returns [false].
+--
+-- After creation, the following fields are added:
+--
+-- * [parse] the parsing function lexer->AST
+--
+-- * [sequences] the table of sequences, indexed by initial keywords.
+--
+-- * [add] method takes a sequence parser or a config table for
+-- [gg.sequence], and adds/replaces the corresponding sequence
+-- parser. If the keyword was already used, the former sequence is
+-- removed and a warning is issued.
+--
+-- * [get] method returns a sequence by its initial keyword
+--
+-- * [kind] == "multisequence"
+--
+-------------------------------------------------------------------------------
+function M.multisequence (p)
+ M.make_parser ("multisequence", p)
+
+ -------------------------------------------------------------------
+ -- Add a sequence (might be just a config table for [gg.sequence])
+ -------------------------------------------------------------------
+ function p :add (s)
+ -- compile if necessary:
+ local keyword = type(s)=='table' and s[1]
+ if type(s)=='table' and not M.is_parser(s) then M.sequence(s) end
+ if M.is_parser(s)~='sequence' or type(keyword)~='string' then
+ if self.default then -- two defaults
+ error ("In a multisequence parser, all but one sequences "..
+ "must start with a keyword")
+ else self.default = s end -- first default
+ else
+ if self.sequences[keyword] then -- duplicate keyword
+ -- TODO: warn that initial keyword `keyword` is overloaded in multiseq
+ end
+ self.sequences[keyword] = s
+ end
+ end -- </multisequence.add>
+
+ -------------------------------------------------------------------
+ -- Get the sequence starting with this keyword. [kw :: string]
+ -------------------------------------------------------------------
+ function p :get (kw) return self.sequences [kw] end
+
+ -------------------------------------------------------------------
+ -- Remove the sequence starting with keyword [kw :: string]
+ -------------------------------------------------------------------
+ function p :del (kw)
+ if not self.sequences[kw] then
+ -- TODO: warn that we try to delete a non-existent entry
+ end
+ local removed = self.sequences[kw]
+ self.sequences[kw] = nil
+ return removed
+ end
+
+ -------------------------------------------------------------------
+ -- Parsing method
+ -------------------------------------------------------------------
+ function p :parse (lx)
+ local fli = lx:lineinfo_right()
+ local x = raw_parse_multisequence (lx, self.sequences, self.default)
+ local lli = lx:lineinfo_left()
+ return transform (x, self, fli, lli)
+ end
+
+ -------------------------------------------------------------------
+ -- Construction
+ -------------------------------------------------------------------
+ -- Register the sequences passed to the constructor. They're going
+ -- from the array part of the parser to the hash part of field
+ -- [sequences]
+ p.sequences = { }
+ for i=1, #p do p :add (p[i]); p[i] = nil end
+
+ -- FIXME: why is this commented out?
+ --if p.default and not is_parser(p.default) then sequence(p.default) end
+ return p
+end --</multisequence>
+
+
+-------------------------------------------------------------------------------
+--
+-- Expression parser generator
+--
+-------------------------------------------------------------------------------
+--
+-- Expression configuration relies on three tables: [prefix], [infix]
+-- and [suffix]. Moreover, the primary parser can be replaced by a
+-- table: in this case the [primary] table will be passed to
+-- [gg.multisequence] to create a parser.
+--
+-- Each of these tables is a modified multisequence parser: the
+-- differences with respect to regular multisequence config tables are:
+--
+-- * the builder takes specific parameters:
+-- - for [prefix], it takes the result of the prefix sequence parser,
+-- and the prefixed expression
+-- - for [infix], it takes the left-hand-side expression, the results
+-- of the infix sequence parser, and the right-hand-side expression.
+-- - for [suffix], it takes the suffixed expression, and the result
+-- of the suffix sequence parser.
+--
+-- * the default field is a list, with parameters:
+-- - [parser] the raw parsing function
+-- - [transformers], as usual
+-- - [prec], the operator's precedence
+-- - [assoc] for [infix] table, the operator's associativity, which
+-- can be "left", "right" or "flat" (default to left)
+--
+-- In [p], useful fields are:
+-- * [transformers]: as usual
+-- * [name]: as usual
+-- * [primary]: the atomic expression parser, or a multisequence config
+-- table (mandatory)
+-- * [prefix]: prefix operators config table, see above.
+-- * [infix]: infix operators config table, see above.
+-- * [suffix]: suffix operators config table, see above.
+--
+-- After creation, these fields are added:
+-- * [kind] == "expr"
+-- * [parse] as usual
+-- * each table is turned into a multisequence, and therefore has an
+-- [add] method
+--
+-------------------------------------------------------------------------------
+function M.expr (p)
+ M.make_parser ("expr", p)
+
+ -------------------------------------------------------------------
+ -- parser method.
+ -- In addition to the lexer, it takes an optional precedence:
+ -- it won't read expressions whose precedence is lower or equal
+ -- to [prec].
+ -------------------------------------------------------------------
+ function p :parse (lx, prec)
+ prec = prec or 0
+
+ ------------------------------------------------------
+ -- Extract the right parser and the corresponding
+ -- options table, for (pre|in|suff)fix operators.
+ -- Options include prec, assoc, transformers.
+ ------------------------------------------------------
+ local function get_parser_info (tab)
+ local p2 = tab :get (lx :is_keyword (lx :peek()))
+ if p2 then -- keyword-based sequence found
+ local function parser(lx) return raw_parse_sequence(lx, p2) end
+ return parser, p2
+ else -- Got to use the default parser
+ local d = tab.default
+ if d then return d.parse or d.parser, d
+ else return false, false end
+ end
+ end
+
+ ------------------------------------------------------
+ -- Look for a prefix sequence. Multiple prefixes are
+ -- handled through the recursive [p.parse] call.
+ -- Notice the double-transform: one for the primary
+ -- expr, and one for the one with the prefix op.
+ ------------------------------------------------------
+ local function handle_prefix ()
+ local fli = lx :lineinfo_right()
+ local p2_func, p2 = get_parser_info (self.prefix)
+ local op = p2_func and p2_func (lx)
+ if op then -- Keyword-based sequence found
+ local ili = lx :lineinfo_right() -- Intermediate LineInfo
+ local e = p2.builder (op, self :parse (lx, p2.prec))
+ local lli = lx :lineinfo_left()
+ return transform (transform (e, p2, ili, lli), self, fli, lli)
+ else -- No prefix found, get a primary expression
+ local e = self.primary(lx)
+ local lli = lx :lineinfo_left()
+ return transform (e, self, fli, lli)
+ end
+ end --</expr.parse.handle_prefix>
+
+ ------------------------------------------------------
+ -- Look for an infix sequence+right-hand-side operand.
+ -- Return the whole binary expression result,
+ -- or false if no operator was found.
+ ------------------------------------------------------
+ local function handle_infix (e)
+ local p2_func, p2 = get_parser_info (self.infix)
+ if not p2 then return false end
+
+ -----------------------------------------
+ -- Handle flattening operators: gather all operands
+ -- of the series in [list]; when a different operator
+ -- is found, stop, build from [list], [transform] and
+ -- return.
+ -----------------------------------------
+ if (not p2.prec or p2.prec>prec) and p2.assoc=="flat" then
+ local fli = lx:lineinfo_right()
+ local pflat, list = p2, { e }
+ repeat
+ local op = p2_func(lx)
+ if not op then break end
+ table.insert (list, self:parse (lx, p2.prec))
+ local _ -- We only care about checking that p2==pflat
+ _, p2 = get_parser_info (self.infix)
+ until p2 ~= pflat
+ local e2 = pflat.builder (list)
+ local lli = lx:lineinfo_left()
+ return transform (transform (e2, pflat, fli, lli), self, fli, lli)
+
+ -----------------------------------------
+ -- Handle regular infix operators: [e] the LHS is known,
+ -- just gather the operator and [e2] the RHS.
+ -- Result goes in [e3].
+ -----------------------------------------
+ elseif p2.prec and p2.prec>prec or
+ p2.prec==prec and p2.assoc=="right" then
+ local fli = e.lineinfo.first -- lx:lineinfo_right()
+ local op = p2_func(lx)
+ if not op then return false end
+ local e2 = self:parse (lx, p2.prec)
+ local e3 = p2.builder (e, op, e2)
+ local lli = lx:lineinfo_left()
+ return transform (transform (e3, p2, fli, lli), self, fli, lli)
+
+ -----------------------------------------
+ -- Check for non-associative operators, and complain if applicable.
+ -----------------------------------------
+ elseif p2.assoc=="none" and p2.prec==prec then
+ M.parse_error (lx, "non-associative operator!")
+
+ -----------------------------------------
+ -- No infix operator suitable at that precedence
+ -----------------------------------------
+ else return false end
+
+ end --</expr.parse.handle_infix>
+
+ ------------------------------------------------------
+ -- Look for a suffix sequence.
+ -- Return the result of suffix operator on [e],
+ -- or false if no operator was found.
+ ------------------------------------------------------
+ local function handle_suffix (e)
+ -- FIXME bad fli, must take e.lineinfo.first
+ local p2_func, p2 = get_parser_info (self.suffix)
+ if not p2 then return false end
+ if not p2.prec or p2.prec>=prec then
+ --local fli = lx:lineinfo_right()
+ local fli = e.lineinfo.first
+ local op = p2_func(lx)
+ if not op then return false end
+ local lli = lx:lineinfo_left()
+ e = p2.builder (e, op)
+ e = transform (transform (e, p2, fli, lli), self, fli, lli)
+ return e
+ end
+ return false
+ end --</expr.parse.handle_suffix>
+
+ ------------------------------------------------------
+ -- Parser body: read suffix and (infix+operand)
+ -- extensions as long as we're able to fetch more at
+ -- this precedence level.
+ ------------------------------------------------------
+ local e = handle_prefix()
+ repeat
+ local x = handle_suffix (e); e = x or e
+ local y = handle_infix (e); e = y or e
+ until not (x or y)
+
+ -- No transform: it already happened in operators handling
+ return e
+ end --</expr.parse>
+
+ -------------------------------------------------------------------
+ -- Construction
+ -------------------------------------------------------------------
+ if not p.primary then p.primary=p[1]; p[1]=nil end
+ for _, t in ipairs{ "primary", "prefix", "infix", "suffix" } do
+ if not p[t] then p[t] = { } end
+ if not M.is_parser(p[t]) then M.multisequence(p[t]) end
+ end
+ function p:add(...) return self.primary:add(...) end
+ return p
+end --</expr>
+
+
+-------------------------------------------------------------------------------
+--
+-- List parser generator
+--
+-------------------------------------------------------------------------------
+-- In [p], the following fields can be provided in input:
+--
+-- * [builder]: takes list of subparser results, returns AST
+-- * [transformers]: as usual
+-- * [name]: as usual
+--
+-- * [terminators]: list of strings representing the keywords which
+-- might mark the end of the list. When non-empty, the list is
+-- allowed to be empty. A string is treated as a single-element
+-- table, whose element is that string, e.g. ["do"] is the same as
+-- [{"do"}].
+--
+-- * [separators]: list of strings representing the keywords which can
+-- separate elements of the list. When non-empty, one of these
+-- keyword has to be found between each element. Lack of a separator
+-- indicates the end of the list. A string is treated as a
+-- single-element table, whose element is that string, e.g. ["do"]
+-- is the same as [{"do"}]. If [terminators] is empty/nil, then
+-- [separators] has to be non-empty.
+--
+-- After creation, the following fields are added:
+-- * [parse] the parsing function lexer->AST
+-- * [kind] == "list"
+--
+-------------------------------------------------------------------------------
+function M.list (p)
+ M.make_parser ("list", p)
+
+ -------------------------------------------------------------------
+ -- Parsing method
+ -------------------------------------------------------------------
+ function p :parse (lx)
+
+ ------------------------------------------------------
+ -- Used to quickly check whether there's a terminator
+ -- or a separator immediately ahead
+ ------------------------------------------------------
+ local function peek_is_in (keywords)
+ return keywords and lx:is_keyword(lx:peek(), unpack(keywords)) end
+
+ local x = { }
+ local fli = lx :lineinfo_right()
+
+ -- if there's a terminator to start with, don't bother trying
+ local is_empty_list = self.terminators and (peek_is_in (self.terminators) or lx:peek().tag=="Eof")
+ if not is_empty_list then
+ repeat
+ local item = self.primary(lx)
+ table.insert (x, item) -- read one element
+ until
+ -- There's a separator list specified, and next token isn't in it.
+ -- Otherwise, consume it with [lx:next()]
+ self.separators and not(peek_is_in (self.separators) and lx:next()) or
+ -- Terminator token ahead
+ peek_is_in (self.terminators) or
+ -- Last reason: end of file reached
+ lx:peek().tag=="Eof"
+ end
+
+ local lli = lx:lineinfo_left()
+
+ -- Apply the builder. It can be a string, or a callable value,
+ -- or simply nothing.
+ local b = self.builder
+ if b then
+ if type(b)=="string" then x.tag = b -- b is a string, use it as a tag
+ elseif type(b)=="function" then x=b(x)
+ else
+ local bmt = getmetatable(b)
+ if bmt and bmt.__call then x=b(x) end
+ end
+ end
+ return transform (x, self, fli, lli)
+ end --</list.parse>
+
+ -------------------------------------------------------------------
+ -- Construction
+ -------------------------------------------------------------------
+ if not p.primary then p.primary = p[1]; p[1] = nil end
+ if type(p.terminators) == "string" then p.terminators = { p.terminators }
+ elseif p.terminators and #p.terminators == 0 then p.terminators = nil end
+ if type(p.separators) == "string" then p.separators = { p.separators }
+ elseif p.separators and #p.separators == 0 then p.separators = nil end
+
+ return p
+end --</list>
+
+
+-------------------------------------------------------------------------------
+--
+-- Keyword-conditioned parser generator
+--
+-------------------------------------------------------------------------------
+--
+-- Only apply a parser if a given keyword is found. The result of
+-- [gg.onkeyword] parser is the result of the subparser (modulo
+-- [transformers] applications).
+--
+-- lineinfo: the keyword is *not* included in the boundaries of the
+-- resulting lineinfo. A review of all usages of gg.onkeyword() in the
+-- implementation of metalua has shown that it was the appropriate choice
+-- in every case.
+--
+-- Input fields:
+--
+-- * [name]: as usual
+--
+-- * [transformers]: as usual
+--
+-- * [peek]: if non-nil, the conditioning keyword is left in the lexeme
+-- stream instead of being consumed.
+--
+-- * [primary]: the subparser.
+--
+-- * [keywords]: list of strings representing triggering keywords.
+--
+-- * Table-part entries can contain strings, and/or exactly one parser.
+-- Strings are put in [keywords], and the parser is put in [primary].
+--
+-- After the call, the following fields will be set:
+--
+-- * [parse] the parsing method
+-- * [kind] == "onkeyword"
+-- * [primary]
+-- * [keywords]
+--
+-------------------------------------------------------------------------------
+function M.onkeyword (p)
+ M.make_parser ("onkeyword", p)
+
+ -------------------------------------------------------------------
+ -- Parsing method
+ -------------------------------------------------------------------
+ function p :parse (lx)
+ if lx :is_keyword (lx:peek(), unpack(self.keywords)) then
+ local fli = lx:lineinfo_right()
+ if not self.peek then lx:next() end
+ local content = self.primary (lx)
+ local lli = lx:lineinfo_left()
+ local li = content.lineinfo or { }
+ fli, lli = li.first or fli, li.last or lli
+ return transform (content, p, fli, lli)
+ else return false end
+ end
+
+ -------------------------------------------------------------------
+ -- Construction
+ -------------------------------------------------------------------
+ if not p.keywords then p.keywords = { } end
+ for _, x in ipairs(p) do
+ if type(x)=="string" then table.insert (p.keywords, x)
+ else assert (not p.primary and M.is_parser (x)); p.primary = x end
+ end
+ assert (next (p.keywords), "Missing trigger keyword in gg.onkeyword")
+ assert (p.primary, 'no primary parser in gg.onkeyword')
+ return p
+end --</onkeyword>
+
+
+-------------------------------------------------------------------------------
+--
+-- Optional keyword consummer pseudo-parser generator
+--
+-------------------------------------------------------------------------------
+--
+-- This doesn't return a real parser, just a function. That function parses
+-- one of the keywords passed as parameters, and returns it. It returns
+-- [false] if no matching keyword is found.
+--
+-- Notice that tokens returned by lexer already carry lineinfo, therefore
+-- there's no need to add them, as done usually through transform() calls.
+-------------------------------------------------------------------------------
+function M.optkeyword (...)
+ local args = {...}
+ if type (args[1]) == "table" then
+ assert (#args == 1)
+ args = args[1]
+ end
+ for _, v in ipairs(args) do assert (type(v)=="string") end
+ return function (lx)
+ local x = lx:is_keyword (lx:peek(), unpack (args))
+ if x then lx:next(); return x
+ else return false end
+ end
+end
+
+
+-------------------------------------------------------------------------------
+--
+-- Run a parser with a special lexer
+--
+-------------------------------------------------------------------------------
+--
+-- This doesn't return a real parser, just a function.
+-- First argument is the lexer class to be used with the parser,
+-- 2nd is the parser itself.
+-- The resulting parser returns whatever the argument parser does.
+--
+-------------------------------------------------------------------------------
+function M.with_lexer(new_lexer, parser)
+
+ -------------------------------------------------------------------
+ -- Most gg functions take their parameters in a table, so it's
+ -- better to silently accept when with_lexer{ } is called with
+ -- its arguments in a list:
+ -------------------------------------------------------------------
+ if not parser and #new_lexer==2 and type(new_lexer[1])=='table' then
+ return M.with_lexer(unpack(new_lexer))
+ end
+
+ -------------------------------------------------------------------
+ -- Save the current lexer, switch it for the new one, run the parser,
+ -- restore the previous lexer, even if the parser caused an error.
+ -------------------------------------------------------------------
+ return function (lx)
+ local old_lexer = getmetatable(lx)
+ lx:sync()
+ setmetatable(lx, new_lexer)
+ local status, result = pcall(parser, lx)
+ lx:sync()
+ setmetatable(lx, old_lexer)
+ if status then return result else error(result) end
+ end
+end
+
+--------------------------------------------------------------------------------
+--
+-- Make sure a parser is used and returns successfully.
+--
+--------------------------------------------------------------------------------
+function M.nonempty(primary)
+ local p = M.make_parser('non-empty list', { primary = primary, name=primary.name })
+ function p :parse (lx)
+ local fli = lx:lineinfo_right()
+ local content = self.primary (lx)
+ local lli = lx:lineinfo_left()
+ local li = content.lineinfo or { }
+ fli, lli = li.first or fli, li.last or lli
+ if #content == 0 then
+ M.parse_error (lx, "`%s' must not be empty.", self.name or "list")
+ else
+ return transform (content, self, fli, lli)
+ end
+ end
+ return p
+end
+
+local FUTURE_MT = { }
+function FUTURE_MT:__tostring() return "<Proxy parser module>" end
+function FUTURE_MT:__newindex(key, value) error "don't write in futures" end
+function FUTURE_MT :__index (parser_name)
+ return function(...)
+ local p, m = rawget(self, '__path'), self.__module
+ if p then for _, name in ipairs(p) do
+ m=rawget(m, name)
+ if not m then error ("Submodule '"..name.."' undefined") end
+ end end
+ local f = rawget(m, parser_name)
+ if not f then error ("Parser '"..parser_name.."' undefined") end
+ return f(...)
+ end
+end
+
+function M.future(module, ...)
+ checks('table')
+ local path = ... and {...}
+ if path then for _, x in ipairs(path) do
+ assert(type(x)=='string', "Bad future arg")
+ end end
+ local self = { __module = module,
+ __path = path }
+ return setmetatable(self, FUTURE_MT)
+end
+
+return M
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/grammar/lexer.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/grammar/lexer.lua
new file mode 100644
index 0000000..8840ea8
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/grammar/lexer.lua
@@ -0,0 +1,678 @@
+-------------------------------------------------------------------------------
+-- Copyright (c) 2006-2013 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+-------------------------------------------------------------------------------
+
+require 'checks'
+
+local M = { }
+
+local lexer = { alpha={ }, sym={ } }
+lexer.__index=lexer
+lexer.__type='lexer.stream'
+
+M.lexer = lexer
+
+
+local debugf = function() end
+-- local debugf=printf
+
+----------------------------------------------------------------------
+-- Some locale settings produce bad results, e.g. French locale
+-- expect float numbers to use commas instead of periods.
+-- TODO: change number parser into something loclae-independent,
+-- locales are nasty.
+----------------------------------------------------------------------
+os.setlocale('C')
+
+local MT = { }
+
+M.metatables=MT
+
+----------------------------------------------------------------------
+-- Create a new metatable, for a new class of objects.
+----------------------------------------------------------------------
+local function new_metatable(name)
+ local mt = { __type = 'lexer.'..name };
+ mt.__index = mt
+ MT[name] = mt
+end
+
+
+----------------------------------------------------------------------
+-- Position: represent a point in a source file.
+----------------------------------------------------------------------
+new_metatable 'position'
+
+local position_idx=1
+
+function M.new_position(line, column, offset, source)
+ checks('number', 'number', 'number', 'string')
+ local id = position_idx; position_idx = position_idx+1
+ return setmetatable({line=line, column=column, offset=offset,
+ source=source, id=id}, MT.position)
+end
+
+function MT.position :__tostring()
+ return string.format("<%s%s|L%d|C%d|K%d>",
+ self.comments and "C|" or "",
+ self.source, self.line, self.column, self.offset)
+end
+
+
+
+----------------------------------------------------------------------
+-- Position factory: convert offsets into line/column/offset positions.
+----------------------------------------------------------------------
+new_metatable 'position_factory'
+
+function M.new_position_factory(src, src_name)
+ -- assert(type(src)=='string')
+ -- assert(type(src_name)=='string')
+ local lines = { 1 }
+ for offset in src :gmatch '\n()' do table.insert(lines, offset) end
+ local max = #src+1
+ table.insert(lines, max+1) -- +1 includes Eof
+ return setmetatable({ src_name=src_name, line2offset=lines, max=max },
+ MT.position_factory)
+end
+
+function MT.position_factory :get_position (offset)
+ -- assert(type(offset)=='number')
+ assert(offset<=self.max)
+ local line2offset = self.line2offset
+ local left = self.last_left or 1
+ if offset<line2offset[left] then left=1 end
+ local right = left+1
+ if line2offset[right]<=offset then right = right+1 end
+ if line2offset[right]<=offset then right = #line2offset end
+ while true do
+ -- print (" trying lines "..left.."/"..right..", offsets "..line2offset[left]..
+ -- "/"..line2offset[right].." for offset "..offset)
+ -- assert(line2offset[left]<=offset)
+ -- assert(offset<line2offset[right])
+ -- assert(left<right)
+ if left+1==right then break end
+ local middle = math.floor((left+right)/2)
+ if line2offset[middle]<=offset then left=middle else right=middle end
+ end
+ -- assert(left+1==right)
+ -- printf("found that offset %d is between %d and %d, hence on line %d",
+ -- offset, line2offset[left], line2offset[right], left)
+ local line = left
+ local column = offset - line2offset[line] + 1
+ self.last_left = left
+ return M.new_position(line, column, offset, self.src_name)
+end
+
+
+
+----------------------------------------------------------------------
+-- Lineinfo: represent a node's range in a source file;
+-- embed information about prefix and suffix comments.
+----------------------------------------------------------------------
+new_metatable 'lineinfo'
+
+function M.new_lineinfo(first, last)
+ checks('lexer.position', 'lexer.position')
+ return setmetatable({first=first, last=last}, MT.lineinfo)
+end
+
+function MT.lineinfo :__tostring()
+ local fli, lli = self.first, self.last
+ local line = fli.line; if line~=lli.line then line =line ..'-'..lli.line end
+ local column = fli.column; if column~=lli.column then column=column..'-'..lli.column end
+ local offset = fli.offset; if offset~=lli.offset then offset=offset..'-'..lli.offset end
+ return string.format("<%s%s|L%s|C%s|K%s%s>",
+ fli.comments and "C|" or "",
+ fli.source, line, column, offset,
+ lli.comments and "|C" or "")
+end
+
+----------------------------------------------------------------------
+-- Token: atomic Lua language element, with a category, a content,
+-- and some lineinfo relating it to its original source.
+----------------------------------------------------------------------
+new_metatable 'token'
+
+function M.new_token(tag, content, lineinfo)
+ --printf("TOKEN `%s{ %q, lineinfo = %s} boundaries %d, %d",
+ -- tag, content, tostring(lineinfo), lineinfo.first.id, lineinfo.last.id)
+ return setmetatable({tag=tag, lineinfo=lineinfo, content}, MT.token)
+end
+
+function MT.token :__tostring()
+ --return string.format("`%s{ %q, %s }", self.tag, self[1], tostring(self.lineinfo))
+ return string.format("`%s %q", self.tag, self[1])
+end
+
+
+----------------------------------------------------------------------
+-- Comment: series of comment blocks with associated lineinfo.
+-- To be attached to the tokens just before and just after them.
+----------------------------------------------------------------------
+new_metatable 'comment'
+
+function M.new_comment(lines)
+ local first = lines[1].lineinfo.first
+ local last = lines[#lines].lineinfo.last
+ local lineinfo = M.new_lineinfo(first, last)
+ return setmetatable({lineinfo=lineinfo, unpack(lines)}, MT.comment)
+end
+
+function MT.comment :text()
+ local last_line = self[1].lineinfo.last.line
+ local acc = { }
+ for i, line in ipairs(self) do
+ local nreturns = line.lineinfo.first.line - last_line
+ table.insert(acc, ("\n"):rep(nreturns))
+ table.insert(acc, line[1])
+ end
+ return table.concat(acc)
+end
+
+function M.new_comment_line(text, lineinfo, nequals)
+ checks('string', 'lexer.lineinfo', '?number')
+ return { lineinfo = lineinfo, text, nequals }
+end
+
+
+
+----------------------------------------------------------------------
+-- Patterns used by [lexer :extract] to decompose the raw string into
+-- correctly tagged tokens.
+----------------------------------------------------------------------
+lexer.patterns = {
+ spaces = "^[ \r\n\t]*()",
+ short_comment = "^%-%-([^\n]*)\n?()",
+ --final_short_comment = "^%-%-([^\n]*)()$",
+ long_comment = "^%-%-%[(=*)%[\n?(.-)%]%1%]()",
+ long_string = "^%[(=*)%[\n?(.-)%]%1%]()",
+ number_longint = "^%d+[uU]?[lL][lL]()",
+ number_longint_hex = "^%x+[uU]?[lL][lL]()",
+ number_mantissa = { "^%d+%.?%d*()", "^%d*%.%d+()" },
+ number_mantissa_hex = { "^%x+%.?%x*()", "^%x*%.%x+()" }, --Lua5.1 and Lua5.2
+ number_exponent = "^[eE][%+%-]?%d+()",
+ number_exponent_hex = "^[pP][%+%-]?%d+()", --Lua5.2
+ number_hex = "^0[xX]()",
+ number_imaginary = "^[iI]()",
+ word = "^([%a_][%w_]*)()",
+}
+
+----------------------------------------------------------------------
+-- unescape a whole string, applying [unesc_digits] and
+-- [unesc_letter] as many times as required.
+----------------------------------------------------------------------
+local function unescape_string (s)
+
+ -- Turn the digits of an escape sequence into the corresponding
+ -- character, e.g. [unesc_digits("123") == string.char(123)].
+ local function unesc_digits (backslashes, digits)
+ if #backslashes%2==0 then
+ -- Even number of backslashes, they escape each other, not the digits.
+ -- Return them so that unesc_letter() can treat them
+ return backslashes..digits
+ else
+ -- Remove the odd backslash, which escapes the number sequence.
+ -- The rest will be returned and parsed by unesc_letter()
+ backslashes = backslashes :sub (1,-2)
+ end
+ local k, j, i = digits :reverse() :byte(1, 3)
+ local z = string.byte "0"
+ local code = (k or z) + 10*(j or z) + 100*(i or z) - 111*z
+ if code > 255 then
+ error ("Illegal escape sequence '\\"..digits..
+ "' in string: ASCII codes must be in [0..255]")
+ end
+ local c = string.char (code)
+ if c == '\\' then c = '\\\\' end -- parsed by unesc_letter (test: "\092b" --> "\\b")
+ return backslashes..c
+ end
+
+ -- Turn hex digits of escape sequence into char.
+ local function unesc_hex(backslashes, digits)
+ if #backslashes%2==0 then
+ return backslashes..'x'..digits
+ else
+ backslashes = backslashes :sub (1,-2)
+ end
+ local c = string.char(tonumber(digits,16))
+ if c == '\\' then c = '\\\\' end -- parsed by unesc_letter (test: "\x5cb" --> "\\b")
+ return backslashes..c
+ end
+
+ -- Handle Lua 5.2 \z sequences
+ local function unesc_z(backslashes, more)
+ if #backslashes%2==0 then
+ return backslashes..more
+ else
+ return backslashes :sub (1,-2)
+ end
+ end
+
+ -- Take a letter [x], and returns the character represented by the
+ -- sequence ['\\'..x], e.g. [unesc_letter "n" == "\n"].
+ local function unesc_letter(x)
+ local t = {
+ a = "\a", b = "\b", f = "\f",
+ n = "\n", r = "\r", t = "\t", v = "\v",
+ ["\\"] = "\\", ["'"] = "'", ['"'] = '"', ["\n"] = "\n" }
+ return t[x] or x
+ end
+
+ s = s: gsub ("(\\+)(z%s*)", unesc_z) -- Lua 5.2
+ s = s: gsub ("(\\+)([0-9][0-9]?[0-9]?)", unesc_digits)
+ s = s: gsub ("(\\+)x([0-9a-fA-F][0-9a-fA-F])", unesc_hex) -- Lua 5.2
+ s = s: gsub ("\\(%D)",unesc_letter)
+ return s
+end
+
+lexer.extractors = {
+ "extract_long_comment", "extract_short_comment",
+ "extract_short_string", "extract_word", "extract_number",
+ "extract_long_string", "extract_symbol" }
+
+
+
+----------------------------------------------------------------------
+-- Really extract next token from the raw string
+-- (and update the index).
+-- loc: offset of the position just after spaces and comments
+-- previous_i: offset in src before extraction began
+----------------------------------------------------------------------
+function lexer :extract ()
+ local attached_comments = { }
+ local function gen_token(...)
+ local token = M.new_token(...)
+ if #attached_comments>0 then -- attach previous comments to token
+ local comments = M.new_comment(attached_comments)
+ token.lineinfo.first.comments = comments
+ if self.lineinfo_last_extracted then
+ self.lineinfo_last_extracted.comments = comments
+ end
+ attached_comments = { }
+ end
+ token.lineinfo.first.facing = self.lineinfo_last_extracted
+ self.lineinfo_last_extracted.facing = assert(token.lineinfo.first)
+ self.lineinfo_last_extracted = assert(token.lineinfo.last)
+ return token
+ end
+ while true do -- loop until a non-comment token is found
+
+ -- skip whitespaces
+ self.i = self.src:match (self.patterns.spaces, self.i)
+ if self.i>#self.src then
+ local fli = self.posfact :get_position (#self.src+1)
+ local lli = self.posfact :get_position (#self.src+1) -- ok?
+ local tok = gen_token("Eof", "eof", M.new_lineinfo(fli, lli))
+ tok.lineinfo.last.facing = lli
+ return tok
+ end
+ local i_first = self.i -- loc = position after whitespaces
+
+ -- try every extractor until a token is found
+ for _, extractor in ipairs(self.extractors) do
+ local tag, content, xtra = self [extractor] (self)
+ if tag then
+ local fli = self.posfact :get_position (i_first)
+ local lli = self.posfact :get_position (self.i-1)
+ local lineinfo = M.new_lineinfo(fli, lli)
+ if tag=='Comment' then
+ local prev_comment = attached_comments[#attached_comments]
+ if not xtra -- new comment is short
+ and prev_comment and not prev_comment[2] -- prev comment is short
+ and prev_comment.lineinfo.last.line+1==fli.line then -- adjascent lines
+ -- concat with previous comment
+ prev_comment[1] = prev_comment[1].."\n"..content -- TODO quadratic, BAD!
+ prev_comment.lineinfo.last = lli
+ else -- accumulate comment
+ local comment = M.new_comment_line(content, lineinfo, xtra)
+ table.insert(attached_comments, comment)
+ end
+ break -- back to skipping spaces
+ else -- not a comment: real token, then
+ return gen_token(tag, content, lineinfo)
+ end -- if token is a comment
+ end -- if token found
+ end -- for each extractor
+ end -- while token is a comment
+end -- :extract()
+
+
+
+
+----------------------------------------------------------------------
+-- Extract a short comment.
+----------------------------------------------------------------------
+function lexer :extract_short_comment()
+ -- TODO: handle final_short_comment
+ local content, j = self.src :match (self.patterns.short_comment, self.i)
+ if content then self.i=j; return 'Comment', content, nil end
+end
+
+----------------------------------------------------------------------
+-- Extract a long comment.
+----------------------------------------------------------------------
+function lexer :extract_long_comment()
+ local equals, content, j = self.src:match (self.patterns.long_comment, self.i)
+ if j then self.i = j; return "Comment", content, #equals end
+end
+
+----------------------------------------------------------------------
+-- Extract a '...' or "..." short string.
+----------------------------------------------------------------------
+function lexer :extract_short_string()
+ local k = self.src :sub (self.i,self.i) -- first char
+ if k~=[[']] and k~=[["]] then return end -- no match'
+ local i = self.i + 1
+ local j = i
+ while true do
+ local x,y; x, j, y = self.src :match ("([\\\r\n"..k.."])()(.?)", j) -- next interesting char
+ if x == '\\' then
+ if y == 'z' then -- Lua 5.2 \z
+ j = self.src :match ("^%s*()", j+1)
+ else
+ j=j+1 -- escaped char
+ end
+ elseif x == k then break -- end of string
+ else
+ assert (not x or x=='\r' or x=='\n')
+ return nil, 'Unterminated string'
+ end
+ end
+ self.i = j
+
+ return 'String', unescape_string (self.src :sub (i,j-2))
+end
+
+----------------------------------------------------------------------
+-- Extract Id or Keyword.
+----------------------------------------------------------------------
+function lexer :extract_word()
+ local word, j = self.src:match (self.patterns.word, self.i)
+ if word then
+ self.i = j
+ return (self.alpha [word] and 'Keyword' or 'Id'), word
+ end
+end
+
+----------------------------------------------------------------------
+-- Extract Number.
+----------------------------------------------------------------------
+function lexer :extract_number()
+ local patt = self.patterns
+ local s = self.src
+ local j = s:match(patt.number_hex, self.i)
+ local hex = j ~= nil
+ local longint = hex and patt.number_longint_hex or patt.number_longint
+ local mantissa1 = hex and patt.number_mantissa_hex[1] or patt.number_mantissa[1]
+ local mantissa2 = hex and patt.number_mantissa_hex[2] or patt.number_mantissa[2]
+ local exponent = hex and patt.number_exponent_hex or patt.number_exponent
+ if not hex then j = self.i end
+
+ local t = s:match(longint, j)
+ if t then
+ j = t
+ else
+ j = s:match(mantissa1, j) or s:match(mantissa2, j)
+ if not j then return end
+ j = s:match(exponent, j) or j
+ j = s:match(patt.number_imaginary, j) or j
+ end
+
+ local str = self.src:sub (self.i, j-1)
+ self.i = j
+ -- Number found, interpret with tonumber() and return it
+ -- return str as the fallback when processing formats not supported by the current interpreter
+ return 'Number', (tonumber (str) or str)
+end
+
+----------------------------------------------------------------------
+-- Extract long string.
+----------------------------------------------------------------------
+function lexer :extract_long_string()
+ local _, content, j = self.src :match (self.patterns.long_string, self.i)
+ if j then self.i = j; return 'String', content end
+end
+
+----------------------------------------------------------------------
+-- Extract symbol.
+----------------------------------------------------------------------
+function lexer :extract_symbol()
+ local k = self.src:sub (self.i,self.i)
+ local symk = self.sym [k] -- symbols starting with `k`
+ if not symk then
+ self.i = self.i + 1
+ return 'Keyword', k
+ end
+ for _, sym in pairs (symk) do
+ if sym == self.src:sub (self.i, self.i + #sym - 1) then
+ self.i = self.i + #sym
+ return 'Keyword', sym
+ end
+ end
+ self.i = self.i+1
+ return 'Keyword', k
+end
+
+----------------------------------------------------------------------
+-- Add a keyword to the list of keywords recognized by the lexer.
+----------------------------------------------------------------------
+function lexer :add (w, ...)
+ assert(not ..., "lexer :add() takes only one arg, although possibly a table")
+ if type (w) == "table" then
+ for _, x in ipairs (w) do self :add (x) end
+ else
+ if w:match (self.patterns.word .. "$") then self.alpha [w] = true
+ elseif w:match "^%p%p+$" then
+ local k = w:sub(1,1)
+ local list = self.sym [k]
+ if not list then list = { }; self.sym [k] = list end
+ table.insert (list, w)
+ elseif w:match "^%p$" then return
+ else error "Invalid keyword" end
+ end
+end
+
+----------------------------------------------------------------------
+-- Return the [n]th next token, without consuming it.
+-- [n] defaults to 1. If it goes pass the end of the stream, an EOF
+-- token is returned.
+----------------------------------------------------------------------
+function lexer :peek (n)
+ if not n then n=1 end
+ if n > #self.peeked then
+ for i = #self.peeked+1, n do
+ self.peeked [i] = self :extract()
+ end
+ end
+ return self.peeked [n]
+end
+
+----------------------------------------------------------------------
+-- Return the [n]th next token, removing it as well as the 0..n-1
+-- previous tokens. [n] defaults to 1. If it goes pass the end of the
+-- stream, an EOF token is returned.
+----------------------------------------------------------------------
+function lexer :next (n)
+ n = n or 1
+ self :peek (n)
+ local a
+ for i=1,n do
+ a = table.remove (self.peeked, 1)
+ -- TODO: is this used anywhere? I think not. a.lineinfo.last may be nil.
+ --self.lastline = a.lineinfo.last.line
+ end
+ self.lineinfo_last_consumed = a.lineinfo.last
+ return a
+end
+
+----------------------------------------------------------------------
+-- Returns an object which saves the stream's current state.
+----------------------------------------------------------------------
+-- FIXME there are more fields than that to save
+function lexer :save () return { self.i; {unpack(self.peeked) } } end
+
+----------------------------------------------------------------------
+-- Restore the stream's state, as saved by method [save].
+----------------------------------------------------------------------
+-- FIXME there are more fields than that to restore
+function lexer :restore (s) self.i=s[1]; self.peeked=s[2] end
+
+----------------------------------------------------------------------
+-- Resynchronize: cancel any token in self.peeked, by emptying the
+-- list and resetting the indexes
+----------------------------------------------------------------------
+function lexer :sync()
+ local p1 = self.peeked[1]
+ if p1 then
+ local li_first = p1.lineinfo.first
+ if li_first.comments then li_first=li_first.comments.lineinfo.first end
+ self.i = li_first.offset
+ self.column_offset = self.i - li_first.column
+ self.peeked = { }
+ self.attached_comments = p1.lineinfo.first.comments or { }
+ end
+end
+
+----------------------------------------------------------------------
+-- Take the source and offset of an old lexer.
+----------------------------------------------------------------------
+function lexer :takeover(old)
+ self :sync(); old :sync()
+ for _, field in ipairs{ 'i', 'src', 'attached_comments', 'posfact' } do
+ self[field] = old[field]
+ end
+ return self
+end
+
+----------------------------------------------------------------------
+-- Return the current position in the sources. This position is between
+-- two tokens, and can be within a space / comment area, and therefore
+-- have a non-null width. :lineinfo_left() returns the beginning of the
+-- separation area, :lineinfo_right() returns the end of that area.
+--
+-- ____ last consummed token ____ first unconsummed token
+-- / /
+-- XXXXX <spaces and comments> YYYYY
+-- \____ \____
+-- :lineinfo_left() :lineinfo_right()
+----------------------------------------------------------------------
+function lexer :lineinfo_right()
+ return self :peek(1).lineinfo.first
+end
+
+function lexer :lineinfo_left()
+ return self.lineinfo_last_consumed
+end
+
+----------------------------------------------------------------------
+-- Create a new lexstream.
+----------------------------------------------------------------------
+function lexer :newstream (src_or_stream, name)
+ name = name or "?"
+ if type(src_or_stream)=='table' then -- it's a stream
+ return setmetatable ({ }, self) :takeover (src_or_stream)
+ elseif type(src_or_stream)=='string' then -- it's a source string
+ local src = src_or_stream
+ local pos1 = M.new_position(1, 1, 1, name)
+ local stream = {
+ src_name = name; -- Name of the file
+ src = src; -- The source, as a single string
+ peeked = { }; -- Already peeked, but not discarded yet, tokens
+ i = 1; -- Character offset in src
+ attached_comments = { },-- comments accumulator
+ lineinfo_last_extracted = pos1,
+ lineinfo_last_consumed = pos1,
+ posfact = M.new_position_factory (src_or_stream, name)
+ }
+ setmetatable (stream, self)
+
+ -- Skip initial sharp-bang for Unix scripts
+ -- FIXME: redundant with mlp.chunk()
+ if src and src :match "^#!" then
+ local endofline = src :find "\n"
+ stream.i = endofline and (endofline + 1) or #src
+ end
+ return stream
+ else
+ assert(false, ":newstream() takes a source string or a stream, not a "..
+ type(src_or_stream))
+ end
+end
+
+----------------------------------------------------------------------
+-- If there's no ... args, return the token a (whose truth value is
+-- true) if it's a `Keyword{ }, or nil. If there are ... args, they
+-- have to be strings. if the token a is a keyword, and it's content
+-- is one of the ... args, then returns it (it's truth value is
+-- true). If no a keyword or not in ..., return nil.
+----------------------------------------------------------------------
+function lexer :is_keyword (a, ...)
+ if not a or a.tag ~= "Keyword" then return false end
+ local words = {...}
+ if #words == 0 then return a[1] end
+ for _, w in ipairs (words) do
+ if w == a[1] then return w end
+ end
+ return false
+end
+
+----------------------------------------------------------------------
+-- Cause an error if the next token isn't a keyword whose content
+-- is listed among ... args (which have to be strings).
+----------------------------------------------------------------------
+function lexer :check (...)
+ local words = {...}
+ local a = self :next()
+ local function err ()
+ error ("Got " .. tostring (a) ..
+ ", expected one of these keywords : '" ..
+ table.concat (words,"', '") .. "'") end
+ if not a or a.tag ~= "Keyword" then err () end
+ if #words == 0 then return a[1] end
+ for _, w in ipairs (words) do
+ if w == a[1] then return w end
+ end
+ err ()
+end
+
+----------------------------------------------------------------------
+--
+----------------------------------------------------------------------
+function lexer :clone()
+ local alpha_clone, sym_clone = { }, { }
+ for word in pairs(self.alpha) do alpha_clone[word]=true end
+ for letter, list in pairs(self.sym) do sym_clone[letter] = { unpack(list) } end
+ local clone = { alpha=alpha_clone, sym=sym_clone }
+ setmetatable(clone, self)
+ clone.__index = clone
+ return clone
+end
+
+----------------------------------------------------------------------
+-- Cancel everything left in a lexer, all subsequent attempts at
+-- `:peek()` or `:next()` will return `Eof`.
+----------------------------------------------------------------------
+function lexer :kill()
+ self.i = #self.src+1
+ self.peeked = { }
+ self.attached_comments = { }
+ self.lineinfo_last = self.posfact :get_position (#self.src+1)
+end
+
+return M
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/pprint.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/pprint.lua
new file mode 100644
index 0000000..73a842b
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/metalua/pprint.lua
@@ -0,0 +1,295 @@
+-------------------------------------------------------------------------------
+-- Copyright (c) 2006-2013 Fabien Fleutot and others.
+--
+-- All rights reserved.
+--
+-- This program and the accompanying materials are made available
+-- under the terms of the Eclipse Public License v1.0 which
+-- accompanies this distribution, and is available at
+-- http://www.eclipse.org/legal/epl-v10.html
+--
+-- This program and the accompanying materials are also made available
+-- under the terms of the MIT public license which accompanies this
+-- distribution, and is available at http://www.lua.org/license.html
+--
+-- Contributors:
+-- Fabien Fleutot - API and implementation
+--
+----------------------------------------------------------------------
+
+----------------------------------------------------------------------
+----------------------------------------------------------------------
+--
+-- Lua objects pretty-printer
+--
+----------------------------------------------------------------------
+----------------------------------------------------------------------
+
+local M = { }
+
+M.DEFAULT_CFG = {
+ hide_hash = false; -- Print the non-array part of tables?
+ metalua_tag = true; -- Use Metalua's backtick syntax sugar?
+ fix_indent = nil; -- If a number, number of indentation spaces;
+ -- If false, indent to the previous brace.
+ line_max = nil; -- If a number, tries to avoid making lines with
+ -- more than this number of chars.
+ initial_indent = 0; -- If a number, starts at this level of indentation
+ keywords = { }; -- Set of keywords which must not use Lua's field
+ -- shortcuts {["foo"]=...} -> {foo=...}
+}
+
+local function valid_id(cfg, x)
+ if type(x) ~= "string" then return false end
+ if not x:match "^[a-zA-Z_][a-zA-Z0-9_]*$" then return false end
+ if cfg.keywords and cfg.keywords[x] then return false end
+ return true
+end
+
+local __tostring_cache = setmetatable({ }, {__mode='k'})
+
+-- Retrieve the string produced by `__tostring` metamethod if present,
+-- return `false` otherwise. Cached in `__tostring_cache`.
+local function __tostring(x)
+ local the_string = __tostring_cache[x]
+ if the_string~=nil then return the_string end
+ local mt = getmetatable(x)
+ if mt then
+ local __tostring = mt.__tostring
+ if __tostring then
+ the_string = __tostring(x)
+ __tostring_cache[x] = the_string
+ return the_string
+ end
+ end
+ if x~=nil then __tostring_cache[x] = false end -- nil is an illegal key
+ return false
+end
+
+local xlen -- mutually recursive with `xlen_type`
+
+local xlen_cache = setmetatable({ }, {__mode='k'})
+
+-- Helpers for the `xlen` function
+local xlen_type = {
+ ["nil"] = function ( ) return 3 end;
+ number = function (x) return #tostring(x) end;
+ boolean = function (x) return x and 4 or 5 end;
+ string = function (x) return #string.format("%q",x) end;
+}
+
+function xlen_type.table (adt, cfg, nested)
+ local custom_string = __tostring(adt)
+ if custom_string then return #custom_string end
+
+ -- Circular referenced objects are printed with the plain
+ -- `tostring` function in nested positions.
+ if nested [adt] then return #tostring(adt) end
+ nested [adt] = true
+
+ local has_tag = cfg.metalua_tag and valid_id(cfg, adt.tag)
+ local alen = #adt
+ local has_arr = alen>0
+ local has_hash = false
+ local x = 0
+
+ if not cfg.hide_hash then
+ -- first pass: count hash-part
+ for k, v in pairs(adt) do
+ if k=="tag" and has_tag then
+ -- this is the tag -> do nothing!
+ elseif type(k)=="number" and k<=alen and math.fmod(k,1)==0 and k>0 then
+ -- array-part pair -> do nothing!
+ else
+ has_hash = true
+ if valid_id(cfg, k) then x=x+#k
+ else x = x + xlen (k, cfg, nested) + 2 end -- count surrounding brackets
+ x = x + xlen (v, cfg, nested) + 5 -- count " = " and ", "
+ end
+ end
+ end
+
+ for i = 1, alen do x = x + xlen (adt[i], nested) + 2 end -- count ", "
+
+ nested[adt] = false -- No more nested calls
+
+ if not (has_tag or has_arr or has_hash) then return 3 end
+ if has_tag then x=x+#adt.tag+1 end
+ if not (has_arr or has_hash) then return x end
+ if not has_hash and alen==1 and type(adt[1])~="table" then
+ return x-2 -- substract extraneous ", "
+ end
+ return x+2 -- count "{ " and " }", substract extraneous ", "
+end
+
+
+-- Compute the number of chars it would require to display the table
+-- on a single line. Helps to decide whether some carriage returns are
+-- required. Since the size of each sub-table is required many times,
+-- it's cached in [xlen_cache].
+xlen = function (x, cfg, nested)
+ -- no need to compute length for 1-line prints
+ if not cfg.line_max then return 0 end
+ nested = nested or { }
+ if x==nil then return #"nil" end
+ local len = xlen_cache[x]
+ if len then return len end
+ local f = xlen_type[type(x)]
+ if not f then return #tostring(x) end
+ len = f (x, cfg, nested)
+ xlen_cache[x] = len
+ return len
+end
+
+local function consider_newline(p, len)
+ if not p.cfg.line_max then return end
+ if p.current_offset + len <= p.cfg.line_max then return end
+ if p.indent < p.current_offset then
+ p:acc "\n"; p:acc ((" "):rep(p.indent))
+ p.current_offset = p.indent
+ end
+end
+
+local acc_value
+
+local acc_type = {
+ ["nil"] = function(p) p:acc("nil") end;
+ number = function(p, adt) p:acc (tostring (adt)) end;
+ string = function(p, adt) p:acc ((string.format ("%q", adt):gsub("\\\n", "\\n"))) end;
+ boolean = function(p, adt) p:acc (adt and "true" or "false") end }
+
+-- Indentation:
+-- * if `cfg.fix_indent` is set to a number:
+-- * add this number of space for each level of depth
+-- * return to the line as soon as it flushes things further left
+-- * if not, tabulate to one space after the opening brace.
+-- * as a result, it never saves right-space to return before first element
+
+function acc_type.table(p, adt)
+ if p.nested[adt] then p:acc(tostring(adt)); return end
+ p.nested[adt] = true
+
+ local has_tag = p.cfg.metalua_tag and valid_id(p.cfg, adt.tag)
+ local alen = #adt
+ local has_arr = alen>0
+ local has_hash = false
+
+ local previous_indent = p.indent
+
+ if has_tag then p:acc("`"); p:acc(adt.tag) end
+
+ local function indent(p)
+ if not p.cfg.fix_indent then p.indent = p.current_offset
+ else p.indent = p.indent + p.cfg.fix_indent end
+ end
+
+ -- First pass: handle hash-part
+ if not p.cfg.hide_hash then
+ for k, v in pairs(adt) do
+
+ if has_tag and k=='tag' then -- pass the 'tag' field
+ elseif type(k)=="number" and k<=alen and k>0 and math.fmod(k,1)==0 then
+ -- pass array-part keys (consecutive ints less than `#adt`)
+ else -- hash-part keys
+ if has_hash then p:acc ", " else -- 1st hash-part pair ever found
+ p:acc "{ "; indent(p)
+ end
+
+ -- Determine whether a newline is required
+ local is_id, expected_len=valid_id(p.cfg, k)
+ if is_id then expected_len=#k+xlen(v, p.cfg, p.nested)+#" = , "
+ else expected_len = xlen(k, p.cfg, p.nested)+xlen(v, p.cfg, p.nested)+#"[] = , " end
+ consider_newline(p, expected_len)
+
+ -- Print the key
+ if is_id then p:acc(k); p:acc " = " else
+ p:acc "["; acc_value (p, k); p:acc "] = "
+ end
+
+ acc_value (p, v) -- Print the value
+ has_hash = true
+ end
+ end
+ end
+
+ -- Now we know whether there's a hash-part, an array-part, and a tag.
+ -- Tag and hash-part are already printed if they're present.
+ if not has_tag and not has_hash and not has_arr then p:acc "{ }";
+ elseif has_tag and not has_hash and not has_arr then -- nothing, tag already in acc
+ else
+ assert (has_hash or has_arr) -- special case { } already handled
+ local no_brace = false
+ if has_hash and has_arr then p:acc ", "
+ elseif has_tag and not has_hash and alen==1 and type(adt[1])~="table" then
+ -- No brace required; don't print "{", remember not to print "}"
+ p:acc (" "); acc_value (p, adt[1]) -- indent= indent+(cfg.fix_indent or 0))
+ no_brace = true
+ elseif not has_hash then
+ -- Braces required, but not opened by hash-part handler yet
+ p:acc "{ "; indent(p)
+ end
+
+ -- 2nd pass: array-part
+ if not no_brace and has_arr then
+ local expected_len = xlen(adt[1], p.cfg, p.nested)
+ consider_newline(p, expected_len)
+ acc_value(p, adt[1]) -- indent+(cfg.fix_indent or 0)
+ for i=2, alen do
+ p:acc ", ";
+ consider_newline(p, xlen(adt[i], p.cfg, p.nested))
+ acc_value (p, adt[i]) --indent+(cfg.fix_indent or 0)
+ end
+ end
+ if not no_brace then p:acc " }" end
+ end
+ p.nested[adt] = false -- No more nested calls
+ p.indent = previous_indent
+end
+
+
+function acc_value(p, v)
+ local custom_string = __tostring(v)
+ if custom_string then p:acc(custom_string) else
+ local f = acc_type[type(v)]
+ if f then f(p, v) else p:acc(tostring(v)) end
+ end
+end
+
+
+-- FIXME: new_indent seems to be always nil?!s detection
+-- FIXME: accumulator function should be configurable,
+-- so that print() doesn't need to bufferize the whole string
+-- before starting to print.
+function M.tostring(t, cfg)
+
+ cfg = cfg or M.DEFAULT_CFG or { }
+
+ local p = {
+ cfg = cfg;
+ indent = 0;
+ current_offset = cfg.initial_indent or 0;
+ buffer = { };
+ nested = { };
+ acc = function(self, str)
+ table.insert(self.buffer, str)
+ self.current_offset = self.current_offset + #str
+ end;
+ }
+ acc_value(p, t)
+ return table.concat(p.buffer)
+end
+
+function M.print(...) return print(M.tostring(...)) end
+function M.sprintf(fmt, ...)
+ local args={...}
+ for i, v in pairs(args) do
+ local t=type(v)
+ if t=='table' then args[i]=M.tostring(v)
+ elseif t=='nil' then args[i]='nil' end
+ end
+ return string.format(fmt, unpack(args))
+end
+
+function M.printf(...) print(M.sprintf(...)) end
+
+return M \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/mime.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/mime.lua
new file mode 100644
index 0000000..642cd9c
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/mime.lua
@@ -0,0 +1,90 @@
+-----------------------------------------------------------------------------
+-- MIME support for the Lua language.
+-- Author: Diego Nehab
+-- Conforming to RFCs 2045-2049
+-----------------------------------------------------------------------------
+
+-----------------------------------------------------------------------------
+-- Declare module and import dependencies
+-----------------------------------------------------------------------------
+local base = _G
+local ltn12 = require("ltn12")
+local mime = require("mime.core")
+local io = require("io")
+local string = require("string")
+local _M = mime
+
+-- encode, decode and wrap algorithm tables
+local encodet, decodet, wrapt = {},{},{}
+
+_M.encodet = encodet
+_M.decodet = decodet
+_M.wrapt = wrapt
+
+-- creates a function that chooses a filter by name from a given table
+local function choose(table)
+ return function(name, opt1, opt2)
+ if base.type(name) ~= "string" then
+ name, opt1, opt2 = "default", name, opt1
+ end
+ local f = table[name or "nil"]
+ if not f then
+ base.error("unknown key (" .. base.tostring(name) .. ")", 3)
+ else return f(opt1, opt2) end
+ end
+end
+
+-- define the encoding filters
+encodet['base64'] = function()
+ return ltn12.filter.cycle(_M.b64, "")
+end
+
+encodet['quoted-printable'] = function(mode)
+ return ltn12.filter.cycle(_M.qp, "",
+ (mode == "binary") and "=0D=0A" or "\r\n")
+end
+
+-- define the decoding filters
+decodet['base64'] = function()
+ return ltn12.filter.cycle(_M.unb64, "")
+end
+
+decodet['quoted-printable'] = function()
+ return ltn12.filter.cycle(_M.unqp, "")
+end
+
+local function format(chunk)
+ if chunk then
+ if chunk == "" then return "''"
+ else return string.len(chunk) end
+ else return "nil" end
+end
+
+-- define the line-wrap filters
+wrapt['text'] = function(length)
+ length = length or 76
+ return ltn12.filter.cycle(_M.wrp, length, length)
+end
+wrapt['base64'] = wrapt['text']
+wrapt['default'] = wrapt['text']
+
+wrapt['quoted-printable'] = function()
+ return ltn12.filter.cycle(_M.qpwrp, 76, 76)
+end
+
+-- function that choose the encoding, decoding or wrap algorithm
+_M.encode = choose(encodet)
+_M.decode = choose(decodet)
+_M.wrap = choose(wrapt)
+
+-- define the end-of-line normalization filter
+function _M.normalize(marker)
+ return ltn12.filter.cycle(_M.eol, 0, marker)
+end
+
+-- high level stuffing filter
+function _M.stuff()
+ return ltn12.filter.cycle(_M.dot, 2)
+end
+
+return _M \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/mobdebug/mobdebug.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/mobdebug/mobdebug.lua
new file mode 100644
index 0000000..3f5fdfc
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/mobdebug/mobdebug.lua
@@ -0,0 +1,1609 @@
+--
+-- MobDebug -- Lua remote debugger
+-- Copyright 2011-15 Paul Kulchenko
+-- Based on RemDebug 1.0 Copyright Kepler Project 2005
+--
+
+-- use loaded modules or load explicitly on those systems that require that
+local require = require
+local io = io or require "io"
+local table = table or require "table"
+local string = string or require "string"
+local coroutine = coroutine or require "coroutine"
+local debug = require "debug"
+-- protect require "os" as it may fail on embedded systems without os module
+local os = os or (function(module)
+ local ok, res = pcall(require, module)
+ return ok and res or nil
+end)("os")
+
+local mobdebug = {
+ _NAME = "mobdebug",
+ _VERSION = 0.628,
+ _COPYRIGHT = "Paul Kulchenko",
+ _DESCRIPTION = "Mobile Remote Debugger for the Lua programming language",
+ port = os and os.getenv and tonumber((os.getenv("MOBDEBUG_PORT"))) or 8172,
+ checkcount = 200,
+ yieldtimeout = 0.02, -- yield timeout (s)
+ connecttimeout = 2, -- connect timeout (s)
+}
+
+local error = error
+local getfenv = getfenv
+local setfenv = setfenv
+local loadstring = loadstring or load -- "load" replaced "loadstring" in Lua 5.2
+local pairs = pairs
+local setmetatable = setmetatable
+local tonumber = tonumber
+local unpack = table.unpack or unpack
+local rawget = rawget
+local gsub, sub, find = string.gsub, string.sub, string.find
+
+-- if strict.lua is used, then need to avoid referencing some global
+-- variables, as they can be undefined;
+-- use rawget to avoid complaints from strict.lua at run-time.
+-- it's safe to do the initialization here as all these variables
+-- should get defined values (if any) before the debugging starts.
+-- there is also global 'wx' variable, which is checked as part of
+-- the debug loop as 'wx' can be loaded at any time during debugging.
+local genv = _G or _ENV
+local jit = rawget(genv, "jit")
+local MOAICoroutine = rawget(genv, "MOAICoroutine")
+
+-- ngx_lua debugging requires a special handling as its coroutine.*
+-- methods use a different mechanism that doesn't allow resume calls
+-- from debug hook handlers.
+-- Instead, the "original" coroutine.* methods are used.
+-- `rawget` needs to be used to protect against `strict` checks, but
+-- ngx_lua hides those in a metatable, so need to use that.
+local metagindex = getmetatable(genv) and getmetatable(genv).__index
+local ngx = type(metagindex) == "table" and metagindex.rawget and metagindex:rawget("ngx") or nil
+local corocreate = ngx and coroutine._create or coroutine.create
+local cororesume = ngx and coroutine._resume or coroutine.resume
+local coroyield = ngx and coroutine._yield or coroutine.yield
+local corostatus = ngx and coroutine._status or coroutine.status
+local corowrap = coroutine.wrap
+
+if not setfenv then -- Lua 5.2+
+ -- based on http://lua-users.org/lists/lua-l/2010-06/msg00314.html
+ -- this assumes f is a function
+ local function findenv(f)
+ local level = 1
+ repeat
+ local name, value = debug.getupvalue(f, level)
+ if name == '_ENV' then return level, value end
+ level = level + 1
+ until name == nil
+ return nil end
+ getfenv = function (f) return(select(2, findenv(f)) or _G) end
+ setfenv = function (f, t)
+ local level = findenv(f)
+ if level then debug.setupvalue(f, level, t) end
+ return f end
+end
+
+-- check for OS and convert file names to lower case on windows
+-- (its file system is case insensitive, but case preserving), as setting a
+-- breakpoint on x:\Foo.lua will not work if the file was loaded as X:\foo.lua.
+-- OSX and Windows behave the same way (case insensitive, but case preserving).
+-- OSX can be configured to be case-sensitive, so check for that. This doesn't
+-- handle the case of different partitions having different case-sensitivity.
+local win = os and os.getenv and (os.getenv('WINDIR') or (os.getenv('OS') or ''):match('[Ww]indows')) and true or false
+local mac = not win and (os and os.getenv and os.getenv('DYLD_LIBRARY_PATH') or not io.open("/proc")) and true or false
+local iscasepreserving = win or (mac and io.open('/library') ~= nil)
+
+-- turn jit off based on Mike Pall's comment in this discussion:
+-- http://www.freelists.org/post/luajit/Debug-hooks-and-JIT,2
+-- "You need to turn it off at the start if you plan to receive
+-- reliable hook calls at any later point in time."
+if jit and jit.off then jit.off() end
+
+local socket = require "socket"
+local coro_debugger
+local coro_debugee
+local coroutines = {}; setmetatable(coroutines, {__mode = "k"}) -- "weak" keys
+local events = { BREAK = 1, WATCH = 2, RESTART = 3, STACK = 4 }
+local breakpoints = {}
+local watches = {}
+local lastsource
+local lastfile
+local watchescnt = 0
+local abort -- default value is nil; this is used in start/loop distinction
+local seen_hook = false
+local checkcount = 0
+local step_into = false
+local step_over = false
+local step_level = 0
+local stack_level = 0
+local server
+local buf
+local outputs = {}
+local iobase = {print = print}
+local basedir = ""
+local deferror = "execution aborted at default debugee"
+local debugee = function ()
+ local a = 1
+ for _ = 1, 10 do a = a + 1 end
+ error(deferror)
+end
+local function q(s) return string.gsub(s, '([%(%)%.%%%+%-%*%?%[%^%$%]])','%%%1') end
+
+local serpent = (function() ---- include Serpent module for serialization
+local n, v = "serpent", 0.285 -- (C) 2012-15 Paul Kulchenko; MIT License
+local c, d = "Paul Kulchenko", "Lua serializer and pretty printer"
+local snum = {[tostring(1/0)]='1/0 --[[math.huge]]',[tostring(-1/0)]='-1/0 --[[-math.huge]]',[tostring(0/0)]='0/0'}
+local badtype = {thread = true, userdata = true, cdata = true}
+local getmetatable = debug and debug.getmetatable or getmetatable
+local keyword, globals, G = {}, {}, (_G or _ENV)
+for _,k in ipairs({'and', 'break', 'do', 'else', 'elseif', 'end', 'false',
+ 'for', 'function', 'goto', 'if', 'in', 'local', 'nil', 'not', 'or', 'repeat',
+ 'return', 'then', 'true', 'until', 'while'}) do keyword[k] = true end
+for k,v in pairs(G) do globals[v] = k end -- build func to name mapping
+for _,g in ipairs({'coroutine', 'debug', 'io', 'math', 'string', 'table', 'os'}) do
+ for k,v in pairs(type(G[g]) == 'table' and G[g] or {}) do globals[v] = g..'.'..k end end
+
+local function s(t, opts)
+ local name, indent, fatal, maxnum = opts.name, opts.indent, opts.fatal, opts.maxnum
+ local sparse, custom, huge = opts.sparse, opts.custom, not opts.nohuge
+ local space, maxl = (opts.compact and '' or ' '), (opts.maxlevel or math.huge)
+ local iname, comm = '_'..(name or ''), opts.comment and (tonumber(opts.comment) or math.huge)
+ local numformat = opts.numformat or "%.17g"
+ local seen, sref, syms, symn = {}, {'local '..iname..'={}'}, {}, 0
+ local function gensym(val) return '_'..(tostring(tostring(val)):gsub("[^%w]",""):gsub("(%d%w+)",
+ -- tostring(val) is needed because __tostring may return a non-string value
+ function(s) if not syms[s] then symn = symn+1; syms[s] = symn end return tostring(syms[s]) end)) end
+ local function safestr(s) return type(s) == "number" and tostring(huge and snum[tostring(s)] or numformat:format(s))
+ or type(s) ~= "string" and tostring(s) -- escape NEWLINE/010 and EOF/026
+ or ("%q"):format(s):gsub("\010","n"):gsub("\026","\\026") end
+ local function comment(s,l) return comm and (l or 0) < comm and ' --[['..select(2, pcall(tostring, s))..']]' or '' end
+ local function globerr(s,l) return globals[s] and globals[s]..comment(s,l) or not fatal
+ and safestr(select(2, pcall(tostring, s))) or error("Can't serialize "..tostring(s)) end
+ local function safename(path, name) -- generates foo.bar, foo[3], or foo['b a r']
+ local n = name == nil and '' or name
+ local plain = type(n) == "string" and n:match("^[%l%u_][%w_]*$") and not keyword[n]
+ local safe = plain and n or '['..safestr(n)..']'
+ return (path or '')..(plain and path and '.' or '')..safe, safe end
+ local alphanumsort = type(opts.sortkeys) == 'function' and opts.sortkeys or function(k, o, n) -- k=keys, o=originaltable, n=padding
+ local maxn, to = tonumber(n) or 12, {number = 'a', string = 'b'}
+ local function padnum(d) return ("%0"..tostring(maxn).."d"):format(tonumber(d)) end
+ table.sort(k, function(a,b)
+ -- sort numeric keys first: k[key] is not nil for numerical keys
+ return (k[a] ~= nil and 0 or to[type(a)] or 'z')..(tostring(a):gsub("%d+",padnum))
+ < (k[b] ~= nil and 0 or to[type(b)] or 'z')..(tostring(b):gsub("%d+",padnum)) end) end
+ local function val2str(t, name, indent, insref, path, plainindex, level)
+ local ttype, level, mt = type(t), (level or 0), getmetatable(t)
+ local spath, sname = safename(path, name)
+ local tag = plainindex and
+ ((type(name) == "number") and '' or name..space..'='..space) or
+ (name ~= nil and sname..space..'='..space or '')
+ if seen[t] then -- already seen this element
+ sref[#sref+1] = spath..space..'='..space..seen[t]
+ return tag..'nil'..comment('ref', level) end
+ -- protect from those cases where __tostring may fail
+ if type(mt) == 'table' and pcall(function() return mt.__tostring and mt.__tostring(t) end)
+ and (mt.__serialize or mt.__tostring) then -- knows how to serialize itself
+ seen[t] = insref or spath
+ if mt.__serialize then t = mt.__serialize(t) else t = tostring(t) end
+ ttype = type(t) end -- new value falls through to be serialized
+ if ttype == "table" then
+ if level >= maxl then return tag..'{}'..comment('max', level) end
+ seen[t] = insref or spath
+ if next(t) == nil then return tag..'{}'..comment(t, level) end -- table empty
+ local maxn, o, out = math.min(#t, maxnum or #t), {}, {}
+ for key = 1, maxn do o[key] = key end
+ if not maxnum or #o < maxnum then
+ local n = #o -- n = n + 1; o[n] is much faster than o[#o+1] on large tables
+ for key in pairs(t) do if o[key] ~= key then n = n + 1; o[n] = key end end end
+ if maxnum and #o > maxnum then o[maxnum+1] = nil end
+ if opts.sortkeys and #o > maxn then alphanumsort(o, t, opts.sortkeys) end
+ local sparse = sparse and #o > maxn -- disable sparsness if only numeric keys (shorter output)
+ for n, key in ipairs(o) do
+ local value, ktype, plainindex = t[key], type(key), n <= maxn and not sparse
+ if opts.valignore and opts.valignore[value] -- skip ignored values; do nothing
+ or opts.keyallow and not opts.keyallow[key]
+ or opts.keyignore and opts.keyignore[key]
+ or opts.valtypeignore and opts.valtypeignore[type(value)] -- skipping ignored value types
+ or sparse and value == nil then -- skipping nils; do nothing
+ elseif ktype == 'table' or ktype == 'function' or badtype[ktype] then
+ if not seen[key] and not globals[key] then
+ sref[#sref+1] = 'placeholder'
+ local sname = safename(iname, gensym(key)) -- iname is table for local variables
+ sref[#sref] = val2str(key,sname,indent,sname,iname,true) end
+ sref[#sref+1] = 'placeholder'
+ local path = seen[t]..'['..tostring(seen[key] or globals[key] or gensym(key))..']'
+ sref[#sref] = path..space..'='..space..tostring(seen[value] or val2str(value,nil,indent,path))
+ else
+ out[#out+1] = val2str(value,key,indent,insref,seen[t],plainindex,level+1)
+ end
+ end
+ local prefix = string.rep(indent or '', level)
+ local head = indent and '{\n'..prefix..indent or '{'
+ local body = table.concat(out, ','..(indent and '\n'..prefix..indent or space))
+ local tail = indent and "\n"..prefix..'}' or '}'
+ return (custom and custom(tag,head,body,tail) or tag..head..body..tail)..comment(t, level)
+ elseif badtype[ttype] then
+ seen[t] = insref or spath
+ return tag..globerr(t, level)
+ elseif ttype == 'function' then
+ seen[t] = insref or spath
+ local ok, res = pcall(string.dump, t)
+ local func = ok and ((opts.nocode and "function() --[[..skipped..]] end" or
+ "((loadstring or load)("..safestr(res)..",'@serialized'))")..comment(t, level))
+ return tag..(func or globerr(t, level))
+ else return tag..safestr(t) end -- handle all other types
+ end
+ local sepr = indent and "\n" or ";"..space
+ local body = val2str(t, name, indent) -- this call also populates sref
+ local tail = #sref>1 and table.concat(sref, sepr)..sepr or ''
+ local warn = opts.comment and #sref>1 and space.."--[[incomplete output with shared/self-references skipped]]" or ''
+ return not name and body..warn or "do local "..body..sepr..tail.."return "..name..sepr.."end"
+end
+
+local function deserialize(data, opts)
+ local env = (opts and opts.safe == false) and G
+ or setmetatable({}, {
+ __index = function(t,k) return t end,
+ __call = function(t,...) error("cannot call functions") end
+ })
+ local f, res = (loadstring or load)('return '..data, nil, nil, env)
+ if not f then f, res = (loadstring or load)(data, nil, nil, env) end
+ if not f then return f, res end
+ if setfenv then setfenv(f, env) end
+ return pcall(f)
+end
+
+local function merge(a, b) if b then for k,v in pairs(b) do a[k] = v end end; return a; end
+return { _NAME = n, _COPYRIGHT = c, _DESCRIPTION = d, _VERSION = v, serialize = s,
+ load = deserialize,
+ dump = function(a, opts) return s(a, merge({name = '_', compact = true, sparse = true}, opts)) end,
+ line = function(a, opts) return s(a, merge({sortkeys = true, comment = true}, opts)) end,
+ block = function(a, opts) return s(a, merge({indent = ' ', sortkeys = true, comment = true}, opts)) end }
+end)() ---- end of Serpent module
+
+mobdebug.line = serpent.line
+mobdebug.dump = serpent.dump
+mobdebug.linemap = nil
+mobdebug.loadstring = loadstring
+
+local function removebasedir(path, basedir)
+ if iscasepreserving then
+ -- check if the lowercased path matches the basedir
+ -- if so, return substring of the original path (to not lowercase it)
+ return path:lower():find('^'..q(basedir:lower()))
+ and path:sub(#basedir+1) or path
+ else
+ return string.gsub(path, '^'..q(basedir), '')
+ end
+end
+
+local function stack(start)
+ local function vars(f)
+ local func = debug.getinfo(f, "f").func
+ local i = 1
+ local locals = {}
+ -- get locals
+ while true do
+ local name, value = debug.getlocal(f, i)
+ if not name then break end
+ if string.sub(name, 1, 1) ~= '(' then locals[name] = {value, tostring(value)} end
+ i = i + 1
+ end
+ -- get varargs (these use negative indices)
+ i = 1
+ while true do
+ local name, value = debug.getlocal(f, -i)
+ if not name then break end
+ locals[name:gsub("%)$"," "..i..")")] = {value, tostring(value)}
+ i = i + 1
+ end
+ -- get upvalues
+ i = 1
+ local ups = {}
+ while func and true do -- check for func as it may be nil for tail calls
+ local name, value = debug.getupvalue(func, i)
+ if not name then break end
+ ups[name] = {value, tostring(value)}
+ i = i + 1
+ end
+ return locals, ups
+ end
+
+ local stack = {}
+ local linemap = mobdebug.linemap
+ for i = (start or 0), 100 do
+ local source = debug.getinfo(i, "Snl")
+ if not source then break end
+
+ local src = source.source
+ if src:find("@") == 1 then
+ src = src:sub(2):gsub("\\", "/")
+ if src:find("%./") == 1 then src = src:sub(3) end
+ end
+
+ table.insert(stack, { -- remove basedir from source
+ {source.name, removebasedir(src, basedir),
+ linemap and linemap(source.linedefined, source.source) or source.linedefined,
+ linemap and linemap(source.currentline, source.source) or source.currentline,
+ source.what, source.namewhat, source.short_src},
+ vars(i+1)})
+ if source.what == 'main' then break end
+ end
+ return stack
+end
+
+local function set_breakpoint(file, line)
+ if file == '-' and lastfile then file = lastfile
+ elseif iscasepreserving then file = string.lower(file) end
+ if not breakpoints[line] then breakpoints[line] = {} end
+ breakpoints[line][file] = true
+end
+
+local function remove_breakpoint(file, line)
+ if file == '-' and lastfile then file = lastfile
+ elseif file == '*' and line == 0 then breakpoints = {}
+ elseif iscasepreserving then file = string.lower(file) end
+ if breakpoints[line] then breakpoints[line][file] = nil end
+end
+
+local function has_breakpoint(file, line)
+ return breakpoints[line]
+ and breakpoints[line][iscasepreserving and string.lower(file) or file]
+end
+
+local function restore_vars(vars)
+ if type(vars) ~= 'table' then return end
+
+ -- locals need to be processed in the reverse order, starting from
+ -- the inner block out, to make sure that the localized variables
+ -- are correctly updated with only the closest variable with
+ -- the same name being changed
+ -- first loop find how many local variables there is, while
+ -- the second loop processes them from i to 1
+ local i = 1
+ while true do
+ local name = debug.getlocal(3, i)
+ if not name then break end
+ i = i + 1
+ end
+ i = i - 1
+ local written_vars = {}
+ while i > 0 do
+ local name = debug.getlocal(3, i)
+ if not written_vars[name] then
+ if string.sub(name, 1, 1) ~= '(' then
+ debug.setlocal(3, i, rawget(vars, name))
+ end
+ written_vars[name] = true
+ end
+ i = i - 1
+ end
+
+ i = 1
+ local func = debug.getinfo(3, "f").func
+ while true do
+ local name = debug.getupvalue(func, i)
+ if not name then break end
+ if not written_vars[name] then
+ if string.sub(name, 1, 1) ~= '(' then
+ debug.setupvalue(func, i, rawget(vars, name))
+ end
+ written_vars[name] = true
+ end
+ i = i + 1
+ end
+end
+
+local function capture_vars(level)
+ local vars = {}
+ local func = debug.getinfo(level or 3, "f").func
+ local i = 1
+ while true do
+ local name, value = debug.getupvalue(func, i)
+ if not name then break end
+ if string.sub(name, 1, 1) ~= '(' then vars[name] = value end
+ i = i + 1
+ end
+ i = 1
+ while true do
+ local name, value = debug.getlocal(level or 3, i)
+ if not name then break end
+ if string.sub(name, 1, 1) ~= '(' then vars[name] = value end
+ i = i + 1
+ end
+ -- returned 'vars' table plays a dual role: (1) it captures local values
+ -- and upvalues to be restored later (in case they are modified in "eval"),
+ -- and (2) it provides an environment for evaluated chunks.
+ -- getfenv(func) is needed to provide proper environment for functions,
+ -- including access to globals, but this causes vars[name] to fail in
+ -- restore_vars on local variables or upvalues with `nil` values when
+ -- 'strict' is in effect. To avoid this `rawget` is used in restore_vars.
+ setmetatable(vars, { __index = getfenv(func), __newindex = getfenv(func) })
+ return vars
+end
+
+local function stack_depth(start_depth)
+ for i = start_depth, 0, -1 do
+ if debug.getinfo(i, "l") then return i+1 end
+ end
+ return start_depth
+end
+
+local function is_safe(stack_level)
+ -- the stack grows up: 0 is getinfo, 1 is is_safe, 2 is debug_hook, 3 is user function
+ if stack_level == 3 then return true end
+ for i = 3, stack_level do
+ -- return if it is not safe to abort
+ local info = debug.getinfo(i, "S")
+ if not info then return true end
+ if info.what == "C" then return false end
+ end
+ return true
+end
+
+local function in_debugger()
+ local this = debug.getinfo(1, "S").source
+ -- only need to check few frames as mobdebug frames should be close
+ for i = 3, 7 do
+ local info = debug.getinfo(i, "S")
+ if not info then return false end
+ if info.source == this then return true end
+ end
+ return false
+end
+
+local function is_pending(peer)
+ -- if there is something already in the buffer, skip check
+ if not buf and checkcount >= mobdebug.checkcount then
+ peer:settimeout(0) -- non-blocking
+ buf = peer:receive(1)
+ peer:settimeout() -- back to blocking
+ checkcount = 0
+ end
+ return buf
+end
+
+local function readnext(peer, num)
+ peer:settimeout(0) -- non-blocking
+ local res, err, partial = peer:receive(num)
+ peer:settimeout() -- back to blocking
+ return res or partial or '', err
+end
+
+local function handle_breakpoint(peer)
+ -- check if the buffer has the beginning of SETB/DELB command;
+ -- this is to avoid reading the entire line for commands that
+ -- don't need to be handled here.
+ if not buf or not (buf:sub(1,1) == 'S' or buf:sub(1,1) == 'D') then return end
+
+ -- check second character to avoid reading STEP or other S* and D* commands
+ if #buf == 1 then buf = buf .. readnext(peer, 1) end
+ if buf:sub(2,2) ~= 'E' then return end
+
+ -- need to read few more characters
+ buf = buf .. readnext(peer, 5-#buf)
+ if buf ~= 'SETB ' and buf ~= 'DELB ' then return end
+
+ local res, _, partial = peer:receive() -- get the rest of the line; blocking
+ if not res then
+ if partial then buf = buf .. partial end
+ return
+ end
+
+ local _, _, cmd, file, line = (buf..res):find("^([A-Z]+)%s+(.-)%s+(%d+)%s*$")
+ if cmd == 'SETB' then set_breakpoint(file, tonumber(line))
+ elseif cmd == 'DELB' then remove_breakpoint(file, tonumber(line))
+ else
+ -- this looks like a breakpoint command, but something went wrong;
+ -- return here to let the "normal" processing to handle,
+ -- although this is likely to not go well.
+ return
+ end
+
+ buf = nil
+end
+
+local function debug_hook(event, line)
+ -- (1) LuaJIT needs special treatment. Because debug_hook is set for
+ -- *all* coroutines, and not just the one being debugged as in regular Lua
+ -- (http://lua-users.org/lists/lua-l/2011-06/msg00513.html),
+ -- need to avoid debugging mobdebug's own code as LuaJIT doesn't
+ -- always correctly generate call/return hook events (there are more
+ -- calls than returns, which breaks stack depth calculation and
+ -- 'step' and 'step over' commands stop working; possibly because
+ -- 'tail return' events are not generated by LuaJIT).
+ -- the next line checks if the debugger is run under LuaJIT and if
+ -- one of debugger methods is present in the stack, it simply returns.
+ if jit then
+ -- when luajit is compiled with LUAJIT_ENABLE_LUA52COMPAT,
+ -- coroutine.running() returns non-nil for the main thread.
+ local coro, main = coroutine.running()
+ if not coro or main then coro = 'main' end
+ local disabled = coroutines[coro] == false
+ or coroutines[coro] == nil and coro ~= (coro_debugee or 'main')
+ if coro_debugee and disabled or not coro_debugee and (disabled or in_debugger())
+ then return end
+ end
+
+ -- (2) check if abort has been requested and it's safe to abort
+ if abort and is_safe(stack_level) then error(abort) end
+
+ -- (3) also check if this debug hook has not been visited for any reason.
+ -- this check is needed to avoid stepping in too early
+ -- (for example, when coroutine.resume() is executed inside start()).
+ if not seen_hook and in_debugger() then return end
+
+ if event == "call" then
+ stack_level = stack_level + 1
+ elseif event == "return" or event == "tail return" then
+ stack_level = stack_level - 1
+ elseif event == "line" then
+ if mobdebug.linemap then
+ local ok, mappedline = pcall(mobdebug.linemap, line, debug.getinfo(2, "S").source)
+ if ok then line = mappedline end
+ if not line then return end
+ end
+
+ -- may need to fall through because of the following:
+ -- (1) step_into
+ -- (2) step_over and stack_level <= step_level (need stack_level)
+ -- (3) breakpoint; check for line first as it's known; then for file
+ -- (4) socket call (only do every Xth check)
+ -- (5) at least one watch is registered
+ if not (
+ step_into or step_over or breakpoints[line] or watchescnt > 0
+ or is_pending(server)
+ ) then checkcount = checkcount + 1; return end
+
+ checkcount = mobdebug.checkcount -- force check on the next command
+
+ -- this is needed to check if the stack got shorter or longer.
+ -- unfortunately counting call/return calls is not reliable.
+ -- the discrepancy may happen when "pcall(load, '')" call is made
+ -- or when "error()" is called in a function.
+ -- in either case there are more "call" than "return" events reported.
+ -- this validation is done for every "line" event, but should be "cheap"
+ -- as it checks for the stack to get shorter (or longer by one call).
+ -- start from one level higher just in case we need to grow the stack.
+ -- this may happen after coroutine.resume call to a function that doesn't
+ -- have any other instructions to execute. it triggers three returns:
+ -- "return, tail return, return", which needs to be accounted for.
+ stack_level = stack_depth(stack_level+1)
+
+ local caller = debug.getinfo(2, "S")
+
+ -- grab the filename and fix it if needed
+ local file = lastfile
+ if (lastsource ~= caller.source) then
+ file, lastsource = caller.source, caller.source
+ -- technically, users can supply names that may not use '@',
+ -- for example when they call loadstring('...', 'filename.lua').
+ -- Unfortunately, there is no reliable/quick way to figure out
+ -- what is the filename and what is the source code.
+ -- The following will work if the supplied filename uses Unix path.
+ if find(file, "^@") then
+ file = gsub(gsub(file, "^@", ""), "\\", "/")
+ -- need this conversion to be applied to relative and absolute
+ -- file names as you may write "require 'Foo'" to
+ -- load "foo.lua" (on a case insensitive file system) and breakpoints
+ -- set on foo.lua will not work if not converted to the same case.
+ if iscasepreserving then file = string.lower(file) end
+ if find(file, "%./") == 1 then file = sub(file, 3)
+ else file = gsub(file, "^"..q(basedir), "") end
+ -- some file systems allow newlines in file names; remove these.
+ file = gsub(file, "\n", ' ')
+ else
+ -- this is either a file name coming from loadstring("chunk", "file"),
+ -- or the actual source code that needs to be serialized (as it may
+ -- include newlines); assume it's a file name if it's all on one line.
+ if find(file, "[\r\n]") then
+ file = mobdebug.line(file)
+ else
+ if iscasepreserving then file = string.lower(file) end
+ file = gsub(gsub(file, "\\", "/"), find(file, "^%./") and "^%./" or "^"..q(basedir), "")
+ end
+ end
+
+ -- set to true if we got here; this only needs to be done once per
+ -- session, so do it here to at least avoid setting it for every line.
+ seen_hook = true
+ lastfile = file
+ end
+
+ if is_pending(server) then handle_breakpoint(server) end
+
+ local vars, status, res
+ if (watchescnt > 0) then
+ vars = capture_vars()
+ for index, value in pairs(watches) do
+ setfenv(value, vars)
+ local ok, fired = pcall(value)
+ if ok and fired then
+ status, res = cororesume(coro_debugger, events.WATCH, vars, file, line, index)
+ break -- any one watch is enough; don't check multiple times
+ end
+ end
+ end
+
+ -- need to get into the "regular" debug handler, but only if there was
+ -- no watch that was fired. If there was a watch, handle its result.
+ local getin = (status == nil) and
+ (step_into
+ -- when coroutine.running() return `nil` (main thread in Lua 5.1),
+ -- step_over will equal 'main', so need to check for that explicitly.
+ or (step_over and step_over == (coroutine.running() or 'main') and stack_level <= step_level)
+ or has_breakpoint(file, line)
+ or is_pending(server))
+
+ if getin then
+ vars = vars or capture_vars()
+ step_into = false
+ step_over = false
+ status, res = cororesume(coro_debugger, events.BREAK, vars, file, line)
+ end
+
+ -- handle 'stack' command that provides stack() information to the debugger
+ if status and res == 'stack' then
+ while status and res == 'stack' do
+ -- resume with the stack trace and variables
+ if vars then restore_vars(vars) end -- restore vars so they are reflected in stack values
+ -- this may fail if __tostring method fails at run-time
+ local ok, snapshot = pcall(stack, ngx and 5 or 4)
+ status, res = cororesume(coro_debugger, ok and events.STACK or events.BREAK, snapshot, file, line)
+ end
+ end
+
+ -- need to recheck once more as resume after 'stack' command may
+ -- return something else (for example, 'exit'), which needs to be handled
+ if status and res and res ~= 'stack' then
+ if not abort and res == "exit" then mobdebug.onexit(1, true); return end
+ if not abort and res == "done" then mobdebug.done(); return end
+ abort = res
+ -- only abort if safe; if not, there is another (earlier) check inside
+ -- debug_hook, which will abort execution at the first safe opportunity
+ if is_safe(stack_level) then error(abort) end
+ elseif not status and res then
+ error(res, 2) -- report any other (internal) errors back to the application
+ end
+
+ if vars then restore_vars(vars) end
+
+ -- last command requested Step Over/Out; store the current thread
+ if step_over == true then step_over = coroutine.running() or 'main' end
+ end
+end
+
+local function stringify_results(status, ...)
+ if not status then return status, ... end -- on error report as it
+
+ local t = {...}
+ for i,v in pairs(t) do -- stringify each of the returned values
+ local ok, res = pcall(mobdebug.line, v, {nocode = true, comment = 1})
+ t[i] = ok and res or ("%q"):format(res):gsub("\010","n"):gsub("\026","\\026")
+ end
+ -- stringify table with all returned values
+ -- this is done to allow each returned value to be used (serialized or not)
+ -- intependently and to preserve "original" comments
+ return pcall(mobdebug.dump, t, {sparse = false})
+end
+
+local function isrunning()
+ return coro_debugger and (corostatus(coro_debugger) == 'suspended' or corostatus(coro_debugger) == 'running')
+end
+
+-- this is a function that removes all hooks and closes the socket to
+-- report back to the controller that the debugging is done.
+-- the script that called `done` can still continue.
+local function done()
+ if not (isrunning() and server) then return end
+
+ if not jit then
+ for co, debugged in pairs(coroutines) do
+ if debugged then debug.sethook(co) end
+ end
+ end
+
+ debug.sethook()
+ server:close()
+
+ coro_debugger = nil -- to make sure isrunning() returns `false`
+ seen_hook = nil -- to make sure that the next start() call works
+ abort = nil -- to make sure that callback calls use proper "abort" value
+end
+
+local function debugger_loop(sev, svars, sfile, sline)
+ local command
+ local app, osname
+ local eval_env = svars or {}
+ local function emptyWatch () return false end
+ local loaded = {}
+ for k in pairs(package.loaded) do loaded[k] = true end
+
+ while true do
+ local line, err
+ local wx = rawget(genv, "wx") -- use rawread to make strict.lua happy
+ if (wx or mobdebug.yield) and server.settimeout then server:settimeout(mobdebug.yieldtimeout) end
+ while true do
+ line, err = server:receive()
+ if not line and err == "timeout" then
+ -- yield for wx GUI applications if possible to avoid "busyness"
+ app = app or (wx and wx.wxGetApp and wx.wxGetApp())
+ if app then
+ local win = app:GetTopWindow()
+ local inloop = app:IsMainLoopRunning()
+ osname = osname or wx.wxPlatformInfo.Get():GetOperatingSystemFamilyName()
+ if win and not inloop then
+ -- process messages in a regular way
+ -- and exit as soon as the event loop is idle
+ if osname == 'Unix' then wx.wxTimer(app):Start(10, true) end
+ local exitLoop = function()
+ win:Disconnect(wx.wxID_ANY, wx.wxID_ANY, wx.wxEVT_IDLE)
+ win:Disconnect(wx.wxID_ANY, wx.wxID_ANY, wx.wxEVT_TIMER)
+ app:ExitMainLoop()
+ end
+ win:Connect(wx.wxEVT_IDLE, exitLoop)
+ win:Connect(wx.wxEVT_TIMER, exitLoop)
+ app:MainLoop()
+ end
+ elseif mobdebug.yield then mobdebug.yield()
+ end
+ elseif not line and err == "closed" then
+ error("Debugger connection closed", 0)
+ else
+ -- if there is something in the pending buffer, prepend it to the line
+ if buf then line = buf .. line; buf = nil end
+ break
+ end
+ end
+ if server.settimeout then server:settimeout() end -- back to blocking
+ command = string.sub(line, string.find(line, "^[A-Z]+"))
+ if command == "SETB" then
+ local _, _, _, file, line = string.find(line, "^([A-Z]+)%s+(.-)%s+(%d+)%s*$")
+ if file and line then
+ set_breakpoint(file, tonumber(line))
+ server:send("200 OK\n")
+ else
+ server:send("400 Bad Request\n")
+ end
+ elseif command == "DELB" then
+ local _, _, _, file, line = string.find(line, "^([A-Z]+)%s+(.-)%s+(%d+)%s*$")
+ if file and line then
+ remove_breakpoint(file, tonumber(line))
+ server:send("200 OK\n")
+ else
+ server:send("400 Bad Request\n")
+ end
+ elseif command == "EXEC" then
+ local _, _, chunk = string.find(line, "^[A-Z]+%s+(.+)$")
+ if chunk then
+ local func, res = mobdebug.loadstring(chunk)
+ local status
+ if func then
+ setfenv(func, eval_env)
+ status, res = stringify_results(pcall(func))
+ end
+ if status then
+ server:send("200 OK " .. tostring(#res) .. "\n")
+ server:send(res)
+ else
+ -- fix error if not set (for example, when loadstring is not present)
+ if not res then res = "Unknown error" end
+ server:send("401 Error in Expression " .. tostring(#res) .. "\n")
+ server:send(res)
+ end
+ else
+ server:send("400 Bad Request\n")
+ end
+ elseif command == "LOAD" then
+ local _, _, size, name = string.find(line, "^[A-Z]+%s+(%d+)%s+(%S.-)%s*$")
+ size = tonumber(size)
+
+ if abort == nil then -- no LOAD/RELOAD allowed inside start()
+ if size > 0 then server:receive(size) end
+ if sfile and sline then
+ server:send("201 Started " .. sfile .. " " .. tostring(sline) .. "\n")
+ else
+ server:send("200 OK 0\n")
+ end
+ else
+ -- reset environment to allow required modules to load again
+ -- remove those packages that weren't loaded when debugger started
+ for k in pairs(package.loaded) do
+ if not loaded[k] then package.loaded[k] = nil end
+ end
+
+ if size == 0 and name == '-' then -- RELOAD the current script being debugged
+ server:send("200 OK 0\n")
+ coroyield("load")
+ else
+ -- receiving 0 bytes blocks (at least in luasocket 2.0.2), so skip reading
+ local chunk = size == 0 and "" or server:receive(size)
+ if chunk then -- LOAD a new script for debugging
+ local func, res = mobdebug.loadstring(chunk, "@"..name)
+ if func then
+ server:send("200 OK 0\n")
+ debugee = func
+ coroyield("load")
+ else
+ server:send("401 Error in Expression " .. tostring(#res) .. "\n")
+ server:send(res)
+ end
+ else
+ server:send("400 Bad Request\n")
+ end
+ end
+ end
+ elseif command == "SETW" then
+ local _, _, exp = string.find(line, "^[A-Z]+%s+(.+)%s*$")
+ if exp then
+ local func, res = mobdebug.loadstring("return(" .. exp .. ")")
+ if func then
+ watchescnt = watchescnt + 1
+ local newidx = #watches + 1
+ watches[newidx] = func
+ server:send("200 OK " .. tostring(newidx) .. "\n")
+ else
+ server:send("401 Error in Expression " .. tostring(#res) .. "\n")
+ server:send(res)
+ end
+ else
+ server:send("400 Bad Request\n")
+ end
+ elseif command == "DELW" then
+ local _, _, index = string.find(line, "^[A-Z]+%s+(%d+)%s*$")
+ index = tonumber(index)
+ if index > 0 and index <= #watches then
+ watchescnt = watchescnt - (watches[index] ~= emptyWatch and 1 or 0)
+ watches[index] = emptyWatch
+ server:send("200 OK\n")
+ else
+ server:send("400 Bad Request\n")
+ end
+ elseif command == "RUN" then
+ server:send("200 OK\n")
+
+ local ev, vars, file, line, idx_watch = coroyield()
+ eval_env = vars
+ if ev == events.BREAK then
+ server:send("202 Paused " .. file .. " " .. tostring(line) .. "\n")
+ elseif ev == events.WATCH then
+ server:send("203 Paused " .. file .. " " .. tostring(line) .. " " .. tostring(idx_watch) .. "\n")
+ elseif ev == events.RESTART then
+ -- nothing to do
+ else
+ server:send("401 Error in Execution " .. tostring(#file) .. "\n")
+ server:send(file)
+ end
+ elseif command == "STEP" then
+ server:send("200 OK\n")
+ step_into = true
+
+ local ev, vars, file, line, idx_watch = coroyield()
+ eval_env = vars
+ if ev == events.BREAK then
+ server:send("202 Paused " .. file .. " " .. tostring(line) .. "\n")
+ elseif ev == events.WATCH then
+ server:send("203 Paused " .. file .. " " .. tostring(line) .. " " .. tostring(idx_watch) .. "\n")
+ elseif ev == events.RESTART then
+ -- nothing to do
+ else
+ server:send("401 Error in Execution " .. tostring(#file) .. "\n")
+ server:send(file)
+ end
+ elseif command == "OVER" or command == "OUT" then
+ server:send("200 OK\n")
+ step_over = true
+
+ -- OVER and OUT are very similar except for
+ -- the stack level value at which to stop
+ if command == "OUT" then step_level = stack_level - 1
+ else step_level = stack_level end
+
+ local ev, vars, file, line, idx_watch = coroyield()
+ eval_env = vars
+ if ev == events.BREAK then
+ server:send("202 Paused " .. file .. " " .. tostring(line) .. "\n")
+ elseif ev == events.WATCH then
+ server:send("203 Paused " .. file .. " " .. tostring(line) .. " " .. tostring(idx_watch) .. "\n")
+ elseif ev == events.RESTART then
+ -- nothing to do
+ else
+ server:send("401 Error in Execution " .. tostring(#file) .. "\n")
+ server:send(file)
+ end
+ elseif command == "BASEDIR" then
+ local _, _, dir = string.find(line, "^[A-Z]+%s+(.+)%s*$")
+ if dir then
+ basedir = iscasepreserving and string.lower(dir) or dir
+ -- reset cached source as it may change with basedir
+ lastsource = nil
+ server:send("200 OK\n")
+ else
+ server:send("400 Bad Request\n")
+ end
+ elseif command == "SUSPEND" then
+ -- do nothing; it already fulfilled its role
+ elseif command == "DONE" then
+ coroyield("done")
+ return -- done with all the debugging
+ elseif command == "STACK" then
+ -- first check if we can execute the stack command
+ -- as it requires yielding back to debug_hook it cannot be executed
+ -- if we have not seen the hook yet as happens after start().
+ -- in this case we simply return an empty result
+ local vars, ev = {}
+ if seen_hook then
+ ev, vars = coroyield("stack")
+ end
+ if ev and ev ~= events.STACK then
+ server:send("401 Error in Execution " .. tostring(#vars) .. "\n")
+ server:send(vars)
+ else
+ local ok, res = pcall(mobdebug.dump, vars, {nocode = true, sparse = false})
+ if ok then
+ server:send("200 OK " .. tostring(res) .. "\n")
+ else
+ server:send("401 Error in Execution " .. tostring(#res) .. "\n")
+ server:send(res)
+ end
+ end
+ elseif command == "OUTPUT" then
+ local _, _, stream, mode = string.find(line, "^[A-Z]+%s+(%w+)%s+([dcr])%s*$")
+ if stream and mode and stream == "stdout" then
+ -- assign "print" in the global environment
+ local default = mode == 'd'
+ genv.print = default and iobase.print or corowrap(function()
+ -- wrapping into coroutine.wrap protects this function from
+ -- being stepped through in the debugger.
+ -- don't use vararg (...) as it adds a reference for its values,
+ -- which may affect how they are garbage collected
+ while true do
+ local tbl = {coroutine.yield()}
+ if mode == 'c' then iobase.print(unpack(tbl)) end
+ for n = 1, #tbl do
+ tbl[n] = select(2, pcall(mobdebug.line, tbl[n], {nocode = true, comment = false})) end
+ local file = table.concat(tbl, "\t").."\n"
+ server:send("204 Output " .. stream .. " " .. tostring(#file) .. "\n" .. file)
+ end
+ end)
+ if not default then genv.print() end -- "fake" print to start printing loop
+ server:send("200 OK\n")
+ else
+ server:send("400 Bad Request\n")
+ end
+ elseif command == "EXIT" then
+ server:send("200 OK\n")
+ coroyield("exit")
+ else
+ server:send("400 Bad Request\n")
+ end
+ end
+end
+
+local function connect(controller_host, controller_port)
+ local sock, err = socket.tcp()
+ if not sock then return nil, err end
+
+ if sock.settimeout then sock:settimeout(mobdebug.connecttimeout) end
+ local res, err = sock:connect(controller_host, tostring(controller_port))
+ if sock.settimeout then sock:settimeout() end
+
+ if not res then return nil, err end
+ return sock
+end
+
+local lasthost, lastport
+
+-- Starts a debug session by connecting to a controller
+local function start(controller_host, controller_port)
+ -- only one debugging session can be run (as there is only one debug hook)
+ if isrunning() then return end
+
+ lasthost = controller_host or lasthost
+ lastport = controller_port or lastport
+
+ controller_host = lasthost or "localhost"
+ controller_port = lastport or mobdebug.port
+
+ local err
+ server, err = mobdebug.connect(controller_host, controller_port)
+ if server then
+ -- correct stack depth which already has some calls on it
+ -- so it doesn't go into negative when those calls return
+ -- as this breaks subsequence checks in stack_depth().
+ -- start from 16th frame, which is sufficiently large for this check.
+ stack_level = stack_depth(16)
+
+ -- provide our own traceback function to report the error remotely
+ do
+ local dtraceback = debug.traceback
+ debug.traceback = function (...)
+ if select('#', ...) >= 1 then
+ local err, lvl = ...
+ if err and type(err) ~= 'thread' then
+ local trace = dtraceback(err, (lvl or 2)+1)
+ if genv.print == iobase.print then -- no remote redirect
+ return trace
+ else
+ genv.print(trace) -- report the error remotely
+ return -- don't report locally to avoid double reporting
+ end
+ end
+ end
+ -- direct call to debug.traceback: return the original.
+ -- debug.traceback(nil, level) doesn't work in Lua 5.1
+ -- (http://lua-users.org/lists/lua-l/2011-06/msg00574.html), so
+ -- simply remove first frame from the stack trace
+ return (dtraceback(...):gsub("(stack traceback:\n)[^\n]*\n", "%1"))
+ end
+ end
+ coro_debugger = corocreate(debugger_loop)
+ debug.sethook(debug_hook, "lcr")
+ seen_hook = nil -- reset in case the last start() call was refused
+ step_into = true -- start with step command
+ return true
+ else
+ print(("Could not connect to %s:%s: %s")
+ :format(controller_host, controller_port, err or "unknown error"))
+ end
+end
+
+local function controller(controller_host, controller_port, scratchpad)
+ -- only one debugging session can be run (as there is only one debug hook)
+ if isrunning() then return end
+
+ lasthost = controller_host or lasthost
+ lastport = controller_port or lastport
+
+ controller_host = lasthost or "localhost"
+ controller_port = lastport or mobdebug.port
+
+ local exitonerror = not scratchpad
+ local err
+ server, err = mobdebug.connect(controller_host, controller_port)
+ if server then
+ local function report(trace, err)
+ local msg = err .. "\n" .. trace
+ server:send("401 Error in Execution " .. tostring(#msg) .. "\n")
+ server:send(msg)
+ return err
+ end
+
+ seen_hook = true -- allow to accept all commands
+ coro_debugger = corocreate(debugger_loop)
+
+ while true do
+ step_into = true -- start with step command
+ abort = false -- reset abort flag from the previous loop
+ if scratchpad then checkcount = mobdebug.checkcount end -- force suspend right away
+
+ coro_debugee = corocreate(debugee)
+ debug.sethook(coro_debugee, debug_hook, "lcr")
+ local status, err = cororesume(coro_debugee)
+
+ -- was there an error or is the script done?
+ -- 'abort' state is allowed here; ignore it
+ if abort then
+ if tostring(abort) == 'exit' then break end
+ else
+ if status then -- normal execution is done
+ break
+ elseif err and not string.find(tostring(err), deferror) then
+ -- report the error back
+ -- err is not necessarily a string, so convert to string to report
+ report(debug.traceback(coro_debugee), tostring(err))
+ if exitonerror then break end
+ -- check if the debugging is done (coro_debugger is nil)
+ if not coro_debugger then break end
+ -- resume once more to clear the response the debugger wants to send
+ -- need to use capture_vars(2) as three would be the level of
+ -- the caller for controller(), but because of the tail call,
+ -- the caller may not exist;
+ -- This is not entirely safe as the user may see the local
+ -- variable from console, but they will be reset anyway.
+ -- This functionality is used when scratchpad is paused to
+ -- gain access to remote console to modify global variables.
+ local status, err = cororesume(coro_debugger, events.RESTART, capture_vars(2))
+ if not status or status and err == "exit" then break end
+ end
+ end
+ end
+ else
+ print(("Could not connect to %s:%s: %s")
+ :format(controller_host, controller_port, err or "unknown error"))
+ return false
+ end
+ return true
+end
+
+local function scratchpad(controller_host, controller_port)
+ return controller(controller_host, controller_port, true)
+end
+
+local function loop(controller_host, controller_port)
+ return controller(controller_host, controller_port, false)
+end
+
+local function on()
+ if not (isrunning() and server) then return end
+
+ -- main is set to true under Lua5.2 for the "main" chunk.
+ -- Lua5.1 returns co as `nil` in that case.
+ local co, main = coroutine.running()
+ if main then co = nil end
+ if co then
+ coroutines[co] = true
+ debug.sethook(co, debug_hook, "lcr")
+ else
+ if jit then coroutines.main = true end
+ debug.sethook(debug_hook, "lcr")
+ end
+end
+
+local function off()
+ if not (isrunning() and server) then return end
+
+ -- main is set to true under Lua5.2 for the "main" chunk.
+ -- Lua5.1 returns co as `nil` in that case.
+ local co, main = coroutine.running()
+ if main then co = nil end
+
+ -- don't remove coroutine hook under LuaJIT as there is only one (global) hook
+ if co then
+ coroutines[co] = false
+ if not jit then debug.sethook(co) end
+ else
+ if jit then coroutines.main = false end
+ if not jit then debug.sethook() end
+ end
+
+ -- check if there is any thread that is still being debugged under LuaJIT;
+ -- if not, turn the debugging off
+ if jit then
+ local remove = true
+ for _, debugged in pairs(coroutines) do
+ if debugged then remove = false; break end
+ end
+ if remove then debug.sethook() end
+ end
+end
+
+-- Handles server debugging commands
+local function handle(params, client, options)
+ local _, _, command = string.find(params, "^([a-z]+)")
+ local file, line, watch_idx
+ if command == "run" or command == "step" or command == "out"
+ or command == "over" or command == "exit" then
+ client:send(string.upper(command) .. "\n")
+ client:receive() -- this should consume the first '200 OK' response
+ while true do
+ local done = true
+ local breakpoint = client:receive()
+ if not breakpoint then
+ print("Program finished")
+ return
+ end
+ local _, _, status = string.find(breakpoint, "^(%d+)")
+ if status == "200" then
+ -- don't need to do anything
+ elseif status == "202" then
+ _, _, file, line = string.find(breakpoint, "^202 Paused%s+(.-)%s+(%d+)%s*$")
+ if file and line then
+ print("Paused at file " .. file .. " line " .. line)
+ end
+ elseif status == "203" then
+ _, _, file, line, watch_idx = string.find(breakpoint, "^203 Paused%s+(.-)%s+(%d+)%s+(%d+)%s*$")
+ if file and line and watch_idx then
+ print("Paused at file " .. file .. " line " .. line .. " (watch expression " .. watch_idx .. ": [" .. watches[watch_idx] .. "])")
+ end
+ elseif status == "204" then
+ local _, _, stream, size = string.find(breakpoint, "^204 Output (%w+) (%d+)$")
+ if stream and size then
+ local msg = client:receive(tonumber(size))
+ print(msg)
+ if outputs[stream] then outputs[stream](msg) end
+ -- this was just the output, so go back reading the response
+ done = false
+ end
+ elseif status == "401" then
+ local _, _, size = string.find(breakpoint, "^401 Error in Execution (%d+)$")
+ if size then
+ local msg = client:receive(tonumber(size))
+ print("Error in remote application: " .. msg)
+ return nil, nil, msg
+ end
+ else
+ print("Unknown error")
+ return nil, nil, "Debugger error: unexpected response '" .. breakpoint .. "'"
+ end
+ if done then break end
+ end
+ elseif command == "done" then
+ client:send(string.upper(command) .. "\n")
+ -- no response is expected
+ elseif command == "setb" or command == "asetb" then
+ _, _, _, file, line = string.find(params, "^([a-z]+)%s+(.-)%s+(%d+)%s*$")
+ if file and line then
+ -- if this is a file name, and not a file source
+ if not file:find('^".*"$') then
+ file = string.gsub(file, "\\", "/") -- convert slash
+ file = removebasedir(file, basedir)
+ end
+ client:send("SETB " .. file .. " " .. line .. "\n")
+ if command == "asetb" or client:receive() == "200 OK" then
+ set_breakpoint(file, line)
+ else
+ print("Error: breakpoint not inserted")
+ end
+ else
+ print("Invalid command")
+ end
+ elseif command == "setw" then
+ local _, _, exp = string.find(params, "^[a-z]+%s+(.+)$")
+ if exp then
+ client:send("SETW " .. exp .. "\n")
+ local answer = client:receive()
+ local _, _, watch_idx = string.find(answer, "^200 OK (%d+)%s*$")
+ if watch_idx then
+ watches[watch_idx] = exp
+ print("Inserted watch exp no. " .. watch_idx)
+ else
+ local _, _, size = string.find(answer, "^401 Error in Expression (%d+)$")
+ if size then
+ local err = client:receive(tonumber(size)):gsub(".-:%d+:%s*","")
+ print("Error: watch expression not set: " .. err)
+ else
+ print("Error: watch expression not set")
+ end
+ end
+ else
+ print("Invalid command")
+ end
+ elseif command == "delb" or command == "adelb" then
+ _, _, _, file, line = string.find(params, "^([a-z]+)%s+(.-)%s+(%d+)%s*$")
+ if file and line then
+ -- if this is a file name, and not a file source
+ if not file:find('^".*"$') then
+ file = string.gsub(file, "\\", "/") -- convert slash
+ file = removebasedir(file, basedir)
+ end
+ client:send("DELB " .. file .. " " .. line .. "\n")
+ if command == "adelb" or client:receive() == "200 OK" then
+ remove_breakpoint(file, line)
+ else
+ print("Error: breakpoint not removed")
+ end
+ else
+ print("Invalid command")
+ end
+ elseif command == "delallb" then
+ local file, line = "*", 0
+ client:send("DELB " .. file .. " " .. tostring(line) .. "\n")
+ if client:receive() == "200 OK" then
+ remove_breakpoint(file, line)
+ else
+ print("Error: all breakpoints not removed")
+ end
+ elseif command == "delw" then
+ local _, _, index = string.find(params, "^[a-z]+%s+(%d+)%s*$")
+ if index then
+ client:send("DELW " .. index .. "\n")
+ if client:receive() == "200 OK" then
+ watches[index] = nil
+ else
+ print("Error: watch expression not removed")
+ end
+ else
+ print("Invalid command")
+ end
+ elseif command == "delallw" then
+ for index, exp in pairs(watches) do
+ client:send("DELW " .. index .. "\n")
+ if client:receive() == "200 OK" then
+ watches[index] = nil
+ else
+ print("Error: watch expression at index " .. index .. " [" .. exp .. "] not removed")
+ end
+ end
+ elseif command == "eval" or command == "exec"
+ or command == "load" or command == "loadstring"
+ or command == "reload" then
+ local _, _, exp = string.find(params, "^[a-z]+%s+(.+)$")
+ if exp or (command == "reload") then
+ if command == "eval" or command == "exec" then
+ exp = (exp:gsub("%-%-%[(=*)%[.-%]%1%]", "") -- remove comments
+ :gsub("%-%-.-\n", " ") -- remove line comments
+ :gsub("\n", " ")) -- convert new lines
+ if command == "eval" then exp = "return " .. exp end
+ client:send("EXEC " .. exp .. "\n")
+ elseif command == "reload" then
+ client:send("LOAD 0 -\n")
+ elseif command == "loadstring" then
+ local _, _, _, file, lines = string.find(exp, "^([\"'])(.-)%1%s+(.+)")
+ if not file then
+ _, _, file, lines = string.find(exp, "^(%S+)%s+(.+)")
+ end
+ client:send("LOAD " .. tostring(#lines) .. " " .. file .. "\n")
+ client:send(lines)
+ else
+ local file = io.open(exp, "r")
+ if not file and pcall(require, "winapi") then
+ -- if file is not open and winapi is there, try with a short path;
+ -- this may be needed for unicode paths on windows
+ winapi.set_encoding(winapi.CP_UTF8)
+ local shortp = winapi.short_path(exp)
+ file = shortp and io.open(shortp, "r")
+ end
+ if not file then return nil, nil, "Cannot open file " .. exp end
+ -- read the file and remove the shebang line as it causes a compilation error
+ local lines = file:read("*all"):gsub("^#!.-\n", "\n")
+ file:close()
+
+ local file = string.gsub(exp, "\\", "/") -- convert slash
+ file = removebasedir(file, basedir)
+ client:send("LOAD " .. tostring(#lines) .. " " .. file .. "\n")
+ if #lines > 0 then client:send(lines) end
+ end
+ while true do
+ local params, err = client:receive()
+ if not params then
+ return nil, nil, "Debugger connection " .. (err or "error")
+ end
+ local done = true
+ local _, _, status, len = string.find(params, "^(%d+).-%s+(%d+)%s*$")
+ if status == "200" then
+ len = tonumber(len)
+ if len > 0 then
+ local status, res
+ local str = client:receive(len)
+ -- handle serialized table with results
+ local func, err = loadstring(str)
+ if func then
+ status, res = pcall(func)
+ if not status then err = res
+ elseif type(res) ~= "table" then
+ err = "received "..type(res).." instead of expected 'table'"
+ end
+ end
+ if err then
+ print("Error in processing results: " .. err)
+ return nil, nil, "Error in processing results: " .. err
+ end
+ print(unpack(res))
+ return res[1], res
+ end
+ elseif status == "201" then
+ _, _, file, line = string.find(params, "^201 Started%s+(.-)%s+(%d+)%s*$")
+ elseif status == "202" or params == "200 OK" then
+ -- do nothing; this only happens when RE/LOAD command gets the response
+ -- that was for the original command that was aborted
+ elseif status == "204" then
+ local _, _, stream, size = string.find(params, "^204 Output (%w+) (%d+)$")
+ if stream and size then
+ local msg = client:receive(tonumber(size))
+ print(msg)
+ if outputs[stream] then outputs[stream](msg) end
+ -- this was just the output, so go back reading the response
+ done = false
+ end
+ elseif status == "401" then
+ len = tonumber(len)
+ local res = client:receive(len)
+ print("Error in expression: " .. res)
+ return nil, nil, res
+ else
+ print("Unknown error")
+ return nil, nil, "Debugger error: unexpected response after EXEC/LOAD '" .. params .. "'"
+ end
+ if done then break end
+ end
+ else
+ print("Invalid command")
+ end
+ elseif command == "listb" then
+ for l, v in pairs(breakpoints) do
+ for f in pairs(v) do
+ print(f .. ": " .. l)
+ end
+ end
+ elseif command == "listw" then
+ for i, v in pairs(watches) do
+ print("Watch exp. " .. i .. ": " .. v)
+ end
+ elseif command == "suspend" then
+ client:send("SUSPEND\n")
+ elseif command == "stack" then
+ client:send("STACK\n")
+ local resp = client:receive()
+ local _, _, status, res = string.find(resp, "^(%d+)%s+%w+%s+(.+)%s*$")
+ if status == "200" then
+ local func, err = loadstring(res)
+ if func == nil then
+ print("Error in stack information: " .. err)
+ return nil, nil, err
+ end
+ local ok, stack = pcall(func)
+ if not ok then
+ print("Error in stack information: " .. stack)
+ return nil, nil, stack
+ end
+ for _,frame in ipairs(stack) do
+ print(mobdebug.line(frame[1], {comment = false}))
+ end
+ return stack
+ elseif status == "401" then
+ local _, _, len = string.find(resp, "%s+(%d+)%s*$")
+ len = tonumber(len)
+ local res = len > 0 and client:receive(len) or "Invalid stack information."
+ print("Error in expression: " .. res)
+ return nil, nil, res
+ else
+ print("Unknown error")
+ return nil, nil, "Debugger error: unexpected response after STACK"
+ end
+ elseif command == "output" then
+ local _, _, stream, mode = string.find(params, "^[a-z]+%s+(%w+)%s+([dcr])%s*$")
+ if stream and mode then
+ client:send("OUTPUT "..stream.." "..mode.."\n")
+ local resp = client:receive()
+ local _, _, status = string.find(resp, "^(%d+)%s+%w+%s*$")
+ if status == "200" then
+ print("Stream "..stream.." redirected")
+ outputs[stream] = type(options) == 'table' and options.handler or nil
+ else
+ print("Unknown error")
+ return nil, nil, "Debugger error: can't redirect "..stream
+ end
+ else
+ print("Invalid command")
+ end
+ elseif command == "basedir" then
+ local _, _, dir = string.find(params, "^[a-z]+%s+(.+)$")
+ if dir then
+ dir = string.gsub(dir, "\\", "/") -- convert slash
+ if not string.find(dir, "/$") then dir = dir .. "/" end
+
+ local remdir = dir:match("\t(.+)")
+ if remdir then dir = dir:gsub("/?\t.+", "/") end
+ basedir = dir
+
+ client:send("BASEDIR "..(remdir or dir).."\n")
+ local resp, err = client:receive()
+ if not resp then
+ print("Unknown error: "..err)
+ return nil, nil, "Debugger connection closed"
+ end
+ local _, _, status = string.find(resp, "^(%d+)%s+%w+%s*$")
+ if status == "200" then
+ print("New base directory is " .. basedir)
+ else
+ print("Unknown error")
+ return nil, nil, "Debugger error: unexpected response after BASEDIR"
+ end
+ else
+ print(basedir)
+ end
+ elseif command == "help" then
+ print("setb <file> <line> -- sets a breakpoint")
+ print("delb <file> <line> -- removes a breakpoint")
+ print("delallb -- removes all breakpoints")
+ print("setw <exp> -- adds a new watch expression")
+ print("delw <index> -- removes the watch expression at index")
+ print("delallw -- removes all watch expressions")
+ print("run -- runs until next breakpoint")
+ print("step -- runs until next line, stepping into function calls")
+ print("over -- runs until next line, stepping over function calls")
+ print("out -- runs until line after returning from current function")
+ print("listb -- lists breakpoints")
+ print("listw -- lists watch expressions")
+ print("eval <exp> -- evaluates expression on the current context and returns its value")
+ print("exec <stmt> -- executes statement on the current context")
+ print("load <file> -- loads a local file for debugging")
+ print("reload -- restarts the current debugging session")
+ print("stack -- reports stack trace")
+ print("output stdout <d|c|r> -- capture and redirect io stream (default|copy|redirect)")
+ print("basedir [<path>] -- sets the base path of the remote application, or shows the current one")
+ print("done -- stops the debugger and continues application execution")
+ print("exit -- exits debugger and the application")
+ else
+ local _, _, spaces = string.find(params, "^(%s*)$")
+ if spaces then
+ return nil, nil, "Empty command"
+ else
+ print("Invalid command")
+ return nil, nil, "Invalid command"
+ end
+ end
+ return file, line
+end
+
+-- Starts debugging server
+local function listen(host, port)
+ host = host or "*"
+ port = port or mobdebug.port
+
+ local socket = require "socket"
+
+ print("Lua Remote Debugger")
+ print("Run the program you wish to debug")
+
+ local server = socket.bind(host, port)
+ local client = server:accept()
+
+ client:send("STEP\n")
+ client:receive()
+
+ local breakpoint = client:receive()
+ local _, _, file, line = string.find(breakpoint, "^202 Paused%s+(.-)%s+(%d+)%s*$")
+ if file and line then
+ print("Paused at file " .. file )
+ print("Type 'help' for commands")
+ else
+ local _, _, size = string.find(breakpoint, "^401 Error in Execution (%d+)%s*$")
+ if size then
+ print("Error in remote application: ")
+ print(client:receive(size))
+ end
+ end
+
+ while true do
+ io.write("> ")
+ local file, line, err = handle(io.read("*line"), client)
+ if not file and not err then break end -- completed debugging
+ end
+
+ client:close()
+end
+
+local cocreate
+local function coro()
+ if cocreate then return end -- only set once
+ cocreate = cocreate or coroutine.create
+ coroutine.create = function(f, ...)
+ return cocreate(function(...)
+ mobdebug.on()
+ return f(...)
+ end, ...)
+ end
+end
+
+local moconew
+local function moai()
+ if moconew then return end -- only set once
+ moconew = moconew or (MOAICoroutine and MOAICoroutine.new)
+ if not moconew then return end
+ MOAICoroutine.new = function(...)
+ local thread = moconew(...)
+ -- need to support both thread.run and getmetatable(thread).run, which
+ -- was used in earlier MOAI versions
+ local mt = thread.run and thread or getmetatable(thread)
+ local patched = mt.run
+ mt.run = function(self, f, ...)
+ return patched(self, function(...)
+ mobdebug.on()
+ return f(...)
+ end, ...)
+ end
+ return thread
+ end
+end
+
+-- make public functions available
+mobdebug.setbreakpoint = set_breakpoint
+mobdebug.removebreakpoint = remove_breakpoint
+mobdebug.listen = listen
+mobdebug.loop = loop
+mobdebug.scratchpad = scratchpad
+mobdebug.handle = handle
+mobdebug.connect = connect
+mobdebug.start = start
+mobdebug.on = on
+mobdebug.off = off
+mobdebug.moai = moai
+mobdebug.coro = coro
+mobdebug.done = done
+mobdebug.pause = function() step_into = true end
+mobdebug.yield = nil -- callback
+mobdebug.onexit = os and os.exit or done
+mobdebug.basedir = function(b) if b then basedir = b end return basedir end
+
+return mobdebug
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/sha2.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/sha2.lua
new file mode 100644
index 0000000..66795d6
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/sha2.lua
@@ -0,0 +1,239 @@
+-- SHA-256 code in Lua 5.2; based on the pseudo-code from
+-- Wikipedia (http://en.wikipedia.org/wiki/SHA-2)
+-- from http://lua-users.org/wiki/SecureHashAlgorithm
+
+local band, rrotate, bxor, rshift, bnot =
+ bit32.band, bit32.rrotate, bit32.bxor, bit32.rshift, bit32.bnot
+
+local string, setmetatable, assert = string, setmetatable, assert
+
+-- Initialize table of round constants
+-- (first 32 bits of the fractional parts of the cube roots of the first
+-- 64 primes 2..311):
+local k = {
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
+ 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
+ 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
+ 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
+ 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
+ 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
+ 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
+ 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
+ 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
+ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
+ 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
+ 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
+ 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
+ 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,
+}
+
+
+-- transform a string of bytes in a string of hexadecimal digits
+local function str2hexa (s)
+ local h = string.gsub(s, ".", function(c)
+ return string.format("%02x", string.byte(c))
+ end)
+ return h
+end
+
+
+-- transform number 'l' in a big-endian sequence of 'n' bytes
+-- (coded as a string)
+local function num2s (l, n)
+ local s = ""
+ for i = 1, n do
+ local rem = l % 256
+ s = string.char(rem) .. s
+ l = (l - rem) / 256
+ end
+ return s
+end
+
+-- transform the big-endian sequence of four bytes starting at
+-- index 'i' in 's' into a number
+local function s232num (s, i)
+ local n = 0
+ for i = i, i + 3 do
+ n = n*256 + string.byte(s, i)
+ end
+ return n
+end
+
+
+-- append the bit '1' to the message
+-- append k bits '0', where k is the minimum number >= 0 such that the
+-- resulting message length (in bits) is congruent to 448 (mod 512)
+-- append length of message (before pre-processing), in bits, as 64-bit
+-- big-endian integer
+local function preproc (msg, len)
+ local extra = 64 - ((len + 1 + 8) % 64)
+ len = num2s(8 * len, 8) -- original len in bits, coded
+ msg = msg .. "\128" .. string.rep("\0", extra) .. len
+ assert(#msg % 64 == 0)
+ return msg
+end
+
+
+local function initH224 (H)
+ -- (second 32 bits of the fractional parts of the square roots of the
+ -- 9th through 16th primes 23..53)
+ H[1] = 0xc1059ed8
+ H[2] = 0x367cd507
+ H[3] = 0x3070dd17
+ H[4] = 0xf70e5939
+ H[5] = 0xffc00b31
+ H[6] = 0x68581511
+ H[7] = 0x64f98fa7
+ H[8] = 0xbefa4fa4
+ return H
+end
+
+
+local function initH256 (H)
+ -- (first 32 bits of the fractional parts of the square roots of the
+ -- first 8 primes 2..19):
+ H[1] = 0x6a09e667
+ H[2] = 0xbb67ae85
+ H[3] = 0x3c6ef372
+ H[4] = 0xa54ff53a
+ H[5] = 0x510e527f
+ H[6] = 0x9b05688c
+ H[7] = 0x1f83d9ab
+ H[8] = 0x5be0cd19
+ return H
+end
+
+
+local function digestblock (msg, i, H)
+
+ -- break chunk into sixteen 32-bit big-endian words w[1..16]
+ local w = {}
+ for j = 1, 16 do
+ w[j] = s232num(msg, i + (j - 1)*4)
+ end
+
+ -- Extend the sixteen 32-bit words into sixty-four 32-bit words:
+ for j = 17, 64 do
+ local v = w[j - 15]
+ local s0 = bxor(rrotate(v, 7), rrotate(v, 18), rshift(v, 3))
+ v = w[j - 2]
+ local s1 = bxor(rrotate(v, 17), rrotate(v, 19), rshift(v, 10))
+ w[j] = w[j - 16] + s0 + w[j - 7] + s1
+ end
+
+ -- Initialize hash value for this chunk:
+ local a, b, c, d, e, f, g, h =
+ H[1], H[2], H[3], H[4], H[5], H[6], H[7], H[8]
+
+ -- Main loop:
+ for i = 1, 64 do
+ local s0 = bxor(rrotate(a, 2), rrotate(a, 13), rrotate(a, 22))
+ local maj = bxor(band(a, b), band(a, c), band(b, c))
+ local t2 = s0 + maj
+ local s1 = bxor(rrotate(e, 6), rrotate(e, 11), rrotate(e, 25))
+ local ch = bxor (band(e, f), band(bnot(e), g))
+ local t1 = h + s1 + ch + k[i] + w[i]
+
+ h = g
+ g = f
+ f = e
+ e = d + t1
+ d = c
+ c = b
+ b = a
+ a = t1 + t2
+ end
+
+ -- Add (mod 2^32) this chunk's hash to result so far:
+ H[1] = band(H[1] + a)
+ H[2] = band(H[2] + b)
+ H[3] = band(H[3] + c)
+ H[4] = band(H[4] + d)
+ H[5] = band(H[5] + e)
+ H[6] = band(H[6] + f)
+ H[7] = band(H[7] + g)
+ H[8] = band(H[8] + h)
+
+end
+
+
+local function finalresult224 (H)
+ -- Produce the final hash value (big-endian):
+ return
+ str2hexa(num2s(H[1], 4)..num2s(H[2], 4)..num2s(H[3], 4)..num2s(H[4], 4)..
+ num2s(H[5], 4)..num2s(H[6], 4)..num2s(H[7], 4))
+end
+
+
+local function finalresult256 (H)
+ -- Produce the final hash value (big-endian):
+ return
+ str2hexa(num2s(H[1], 4)..num2s(H[2], 4)..num2s(H[3], 4)..num2s(H[4], 4)..
+ num2s(H[5], 4)..num2s(H[6], 4)..num2s(H[7], 4)..num2s(H[8], 4))
+end
+
+
+----------------------------------------------------------------------
+local HH = {} -- to reuse
+
+local function hash224 (msg)
+ msg = preproc(msg, #msg)
+ local H = initH224(HH)
+
+ -- Process the message in successive 512-bit (64 bytes) chunks:
+ for i = 1, #msg, 64 do
+ digestblock(msg, i, H)
+ end
+
+ return finalresult224(H)
+end
+
+
+local function hash256 (msg)
+ msg = preproc(msg, #msg)
+ local H = initH256(HH)
+
+ -- Process the message in successive 512-bit (64 bytes) chunks:
+ for i = 1, #msg, 64 do
+ digestblock(msg, i, H)
+ end
+
+ return finalresult256(H)
+end
+----------------------------------------------------------------------
+local mt = {}
+
+local function new256 ()
+ local o = {H = initH256({}), msg = "", len = 0}
+ setmetatable(o, mt)
+ return o
+end
+
+mt.__index = mt
+
+function mt:add (m)
+ self.msg = self.msg .. m
+ self.len = self.len + #m
+ local t = 0
+ while #self.msg - t >= 64 do
+ digestblock(self.msg, t + 1, self.H)
+ t = t + 64
+ end
+ self.msg = self.msg:sub(t + 1, -1)
+end
+
+
+function mt:close ()
+ self.msg = preproc(self.msg, self.len)
+ self:add("")
+ return finalresult256(self.H)
+end
+----------------------------------------------------------------------
+
+return {
+ hash224 = hash224,
+ hash256 = hash256,
+ new256 = new256,
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/socket.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/socket.lua
new file mode 100644
index 0000000..c3b5f50
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/socket.lua
@@ -0,0 +1,165 @@
+-----------------------------------------------------------------------------
+-- LuaSocket helper module
+-- Author: Diego Nehab
+-----------------------------------------------------------------------------
+
+-----------------------------------------------------------------------------
+-- Declare module and import dependencies
+-----------------------------------------------------------------------------
+local base = _G
+local string = require("string")
+local math = require("math")
+local socket = require("socket.core")
+
+local _M = socket
+
+-- this is needed in case this library is used when "socket.core" is loaded,
+-- but has an older version of luasocket that does not include `connect`.
+if not socket.connect then
+ socket.connect = function (address, port, laddress, lport)
+ local sock, err = socket.tcp()
+ if not sock then return nil, err end
+ if laddress then
+ local res, err = sock:bind(laddress, lport, -1)
+ if not res then return nil, err end
+ end
+ local res, err = sock:connect(address, port)
+ if not res then return nil, err end
+ return sock
+ end
+end
+
+-----------------------------------------------------------------------------
+-- Exported auxiliar functions
+-----------------------------------------------------------------------------
+function _M.connect4(address, port, laddress, lport)
+ return socket.connect(address, port, laddress, lport, "inet")
+end
+
+function _M.connect6(address, port, laddress, lport)
+ return socket.connect(address, port, laddress, lport, "inet6")
+end
+
+function _M.bind(host, port, backlog)
+ if host == "*" then host = "0.0.0.0" end
+ local addrinfo, err = socket.dns.getaddrinfo(host);
+ if not addrinfo then return nil, err end
+ local sock, res
+ err = "no info on address"
+ for i, alt in base.ipairs(addrinfo) do
+ if alt.family == "inet" then
+ sock, err = socket.tcp()
+ else
+ sock, err = socket.tcp6()
+ end
+ if not sock then return nil, err end
+ sock:setoption("reuseaddr", true)
+ res, err = sock:bind(alt.addr, port)
+ if not res then
+ sock:close()
+ else
+ res, err = sock:listen(backlog)
+ if not res then
+ sock:close()
+ else
+ return sock
+ end
+ end
+ end
+ return nil, err
+end
+
+_M.try = _M.newtry()
+
+function _M.choose(table)
+ return function(name, opt1, opt2)
+ if base.type(name) ~= "string" then
+ name, opt1, opt2 = "default", name, opt1
+ end
+ local f = table[name or "nil"]
+ if not f then base.error("unknown key (".. base.tostring(name) ..")", 3)
+ else return f(opt1, opt2) end
+ end
+end
+
+-----------------------------------------------------------------------------
+-- Socket sources and sinks, conforming to LTN12
+-----------------------------------------------------------------------------
+-- create namespaces inside LuaSocket namespace
+local sourcet, sinkt = {}, {}
+_M.sourcet = sourcet
+_M.sinkt = sinkt
+
+_M.BLOCKSIZE = 2048
+
+sinkt["close-when-done"] = function(sock)
+ return base.setmetatable({
+ getfd = function() return sock:getfd() end,
+ dirty = function() return sock:dirty() end
+ }, {
+ __call = function(self, chunk, err)
+ if not chunk then
+ sock:close()
+ return 1
+ else return sock:send(chunk) end
+ end
+ })
+end
+
+sinkt["keep-open"] = function(sock)
+ return base.setmetatable({
+ getfd = function() return sock:getfd() end,
+ dirty = function() return sock:dirty() end
+ }, {
+ __call = function(self, chunk, err)
+ if chunk then return sock:send(chunk)
+ else return 1 end
+ end
+ })
+end
+
+sinkt["default"] = sinkt["keep-open"]
+
+_M.sink = _M.choose(sinkt)
+
+sourcet["by-length"] = function(sock, length)
+ return base.setmetatable({
+ getfd = function() return sock:getfd() end,
+ dirty = function() return sock:dirty() end
+ }, {
+ __call = function()
+ if length <= 0 then return nil end
+ local size = math.min(socket.BLOCKSIZE, length)
+ local chunk, err = sock:receive(size)
+ if err then return nil, err end
+ length = length - string.len(chunk)
+ return chunk
+ end
+ })
+end
+
+sourcet["until-closed"] = function(sock)
+ local done
+ return base.setmetatable({
+ getfd = function() return sock:getfd() end,
+ dirty = function() return sock:dirty() end
+ }, {
+ __call = function()
+ if done then return nil end
+ local chunk, err, partial = sock:receive(socket.BLOCKSIZE)
+ if not err then return chunk
+ elseif err == "closed" then
+ sock:close()
+ done = 1
+ return partial
+ else return nil, err end
+ end
+ })
+end
+
+
+sourcet["default"] = sourcet["until-closed"]
+
+_M.source = _M.choose(sourcet)
+
+return _M
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/socket/ftp.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/socket/ftp.lua
new file mode 100644
index 0000000..ea1145b
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/socket/ftp.lua
@@ -0,0 +1,285 @@
+-----------------------------------------------------------------------------
+-- FTP support for the Lua language
+-- LuaSocket toolkit.
+-- Author: Diego Nehab
+-----------------------------------------------------------------------------
+
+-----------------------------------------------------------------------------
+-- Declare module and import dependencies
+-----------------------------------------------------------------------------
+local base = _G
+local table = require("table")
+local string = require("string")
+local math = require("math")
+local socket = require("socket")
+local url = require("socket.url")
+local tp = require("socket.tp")
+local ltn12 = require("ltn12")
+socket.ftp = {}
+local _M = socket.ftp
+-----------------------------------------------------------------------------
+-- Program constants
+-----------------------------------------------------------------------------
+-- timeout in seconds before the program gives up on a connection
+_M.TIMEOUT = 60
+-- default port for ftp service
+_M.PORT = 21
+-- this is the default anonymous password. used when no password is
+-- provided in url. should be changed to your e-mail.
+_M.USER = "ftp"
+_M.PASSWORD = "anonymous@anonymous.org"
+
+-----------------------------------------------------------------------------
+-- Low level FTP API
+-----------------------------------------------------------------------------
+local metat = { __index = {} }
+
+function _M.open(server, port, create)
+ local tp = socket.try(tp.connect(server, port or _M.PORT, _M.TIMEOUT, create))
+ local f = base.setmetatable({ tp = tp }, metat)
+ -- make sure everything gets closed in an exception
+ f.try = socket.newtry(function() f:close() end)
+ return f
+end
+
+function metat.__index:portconnect()
+ self.try(self.server:settimeout(_M.TIMEOUT))
+ self.data = self.try(self.server:accept())
+ self.try(self.data:settimeout(_M.TIMEOUT))
+end
+
+function metat.__index:pasvconnect()
+ self.data = self.try(socket.tcp())
+ self.try(self.data:settimeout(_M.TIMEOUT))
+ self.try(self.data:connect(self.pasvt.ip, self.pasvt.port))
+end
+
+function metat.__index:login(user, password)
+ self.try(self.tp:command("user", user or _M.USER))
+ local code, reply = self.try(self.tp:check{"2..", 331})
+ if code == 331 then
+ self.try(self.tp:command("pass", password or _M.PASSWORD))
+ self.try(self.tp:check("2.."))
+ end
+ return 1
+end
+
+function metat.__index:pasv()
+ self.try(self.tp:command("pasv"))
+ local code, reply = self.try(self.tp:check("2.."))
+ local pattern = "(%d+)%D(%d+)%D(%d+)%D(%d+)%D(%d+)%D(%d+)"
+ local a, b, c, d, p1, p2 = socket.skip(2, string.find(reply, pattern))
+ self.try(a and b and c and d and p1 and p2, reply)
+ self.pasvt = {
+ ip = string.format("%d.%d.%d.%d", a, b, c, d),
+ port = p1*256 + p2
+ }
+ if self.server then
+ self.server:close()
+ self.server = nil
+ end
+ return self.pasvt.ip, self.pasvt.port
+end
+
+function metat.__index:port(ip, port)
+ self.pasvt = nil
+ if not ip then
+ ip, port = self.try(self.tp:getcontrol():getsockname())
+ self.server = self.try(socket.bind(ip, 0))
+ ip, port = self.try(self.server:getsockname())
+ self.try(self.server:settimeout(_M.TIMEOUT))
+ end
+ local pl = math.mod(port, 256)
+ local ph = (port - pl)/256
+ local arg = string.gsub(string.format("%s,%d,%d", ip, ph, pl), "%.", ",")
+ self.try(self.tp:command("port", arg))
+ self.try(self.tp:check("2.."))
+ return 1
+end
+
+function metat.__index:send(sendt)
+ self.try(self.pasvt or self.server, "need port or pasv first")
+ -- if there is a pasvt table, we already sent a PASV command
+ -- we just get the data connection into self.data
+ if self.pasvt then self:pasvconnect() end
+ -- get the transfer argument and command
+ local argument = sendt.argument or
+ url.unescape(string.gsub(sendt.path or "", "^[/\\]", ""))
+ if argument == "" then argument = nil end
+ local command = sendt.command or "stor"
+ -- send the transfer command and check the reply
+ self.try(self.tp:command(command, argument))
+ local code, reply = self.try(self.tp:check{"2..", "1.."})
+ -- if there is not a a pasvt table, then there is a server
+ -- and we already sent a PORT command
+ if not self.pasvt then self:portconnect() end
+ -- get the sink, source and step for the transfer
+ local step = sendt.step or ltn12.pump.step
+ local readt = {self.tp.c}
+ local checkstep = function(src, snk)
+ -- check status in control connection while downloading
+ local readyt = socket.select(readt, nil, 0)
+ if readyt[tp] then code = self.try(self.tp:check("2..")) end
+ return step(src, snk)
+ end
+ local sink = socket.sink("close-when-done", self.data)
+ -- transfer all data and check error
+ self.try(ltn12.pump.all(sendt.source, sink, checkstep))
+ if string.find(code, "1..") then self.try(self.tp:check("2..")) end
+ -- done with data connection
+ self.data:close()
+ -- find out how many bytes were sent
+ local sent = socket.skip(1, self.data:getstats())
+ self.data = nil
+ return sent
+end
+
+function metat.__index:receive(recvt)
+ self.try(self.pasvt or self.server, "need port or pasv first")
+ if self.pasvt then self:pasvconnect() end
+ local argument = recvt.argument or
+ url.unescape(string.gsub(recvt.path or "", "^[/\\]", ""))
+ if argument == "" then argument = nil end
+ local command = recvt.command or "retr"
+ self.try(self.tp:command(command, argument))
+ local code,reply = self.try(self.tp:check{"1..", "2.."})
+ if (code >= 200) and (code <= 299) then
+ recvt.sink(reply)
+ return 1
+ end
+ if not self.pasvt then self:portconnect() end
+ local source = socket.source("until-closed", self.data)
+ local step = recvt.step or ltn12.pump.step
+ self.try(ltn12.pump.all(source, recvt.sink, step))
+ if string.find(code, "1..") then self.try(self.tp:check("2..")) end
+ self.data:close()
+ self.data = nil
+ return 1
+end
+
+function metat.__index:cwd(dir)
+ self.try(self.tp:command("cwd", dir))
+ self.try(self.tp:check(250))
+ return 1
+end
+
+function metat.__index:type(type)
+ self.try(self.tp:command("type", type))
+ self.try(self.tp:check(200))
+ return 1
+end
+
+function metat.__index:greet()
+ local code = self.try(self.tp:check{"1..", "2.."})
+ if string.find(code, "1..") then self.try(self.tp:check("2..")) end
+ return 1
+end
+
+function metat.__index:quit()
+ self.try(self.tp:command("quit"))
+ self.try(self.tp:check("2.."))
+ return 1
+end
+
+function metat.__index:close()
+ if self.data then self.data:close() end
+ if self.server then self.server:close() end
+ return self.tp:close()
+end
+
+-----------------------------------------------------------------------------
+-- High level FTP API
+-----------------------------------------------------------------------------
+local function override(t)
+ if t.url then
+ local u = url.parse(t.url)
+ for i,v in base.pairs(t) do
+ u[i] = v
+ end
+ return u
+ else return t end
+end
+
+local function tput(putt)
+ putt = override(putt)
+ socket.try(putt.host, "missing hostname")
+ local f = _M.open(putt.host, putt.port, putt.create)
+ f:greet()
+ f:login(putt.user, putt.password)
+ if putt.type then f:type(putt.type) end
+ f:pasv()
+ local sent = f:send(putt)
+ f:quit()
+ f:close()
+ return sent
+end
+
+local default = {
+ path = "/",
+ scheme = "ftp"
+}
+
+local function parse(u)
+ local t = socket.try(url.parse(u, default))
+ socket.try(t.scheme == "ftp", "wrong scheme '" .. t.scheme .. "'")
+ socket.try(t.host, "missing hostname")
+ local pat = "^type=(.)$"
+ if t.params then
+ t.type = socket.skip(2, string.find(t.params, pat))
+ socket.try(t.type == "a" or t.type == "i",
+ "invalid type '" .. t.type .. "'")
+ end
+ return t
+end
+
+local function sput(u, body)
+ local putt = parse(u)
+ putt.source = ltn12.source.string(body)
+ return tput(putt)
+end
+
+_M.put = socket.protect(function(putt, body)
+ if base.type(putt) == "string" then return sput(putt, body)
+ else return tput(putt) end
+end)
+
+local function tget(gett)
+ gett = override(gett)
+ socket.try(gett.host, "missing hostname")
+ local f = _M.open(gett.host, gett.port, gett.create)
+ f:greet()
+ f:login(gett.user, gett.password)
+ if gett.type then f:type(gett.type) end
+ f:pasv()
+ f:receive(gett)
+ f:quit()
+ return f:close()
+end
+
+local function sget(u)
+ local gett = parse(u)
+ local t = {}
+ gett.sink = ltn12.sink.table(t)
+ tget(gett)
+ return table.concat(t)
+end
+
+_M.command = socket.protect(function(cmdt)
+ cmdt = override(cmdt)
+ socket.try(cmdt.host, "missing hostname")
+ socket.try(cmdt.command, "missing command")
+ local f = open(cmdt.host, cmdt.port, cmdt.create)
+ f:greet()
+ f:login(cmdt.user, cmdt.password)
+ f.try(f.tp:command(cmdt.command, cmdt.argument))
+ if cmdt.check then f.try(f.tp:check(cmdt.check)) end
+ f:quit()
+ return f:close()
+end)
+
+_M.get = socket.protect(function(gett)
+ if base.type(gett) == "string" then return sget(gett)
+ else return tget(gett) end
+end)
+
+return _M \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/socket/headers.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/socket/headers.lua
new file mode 100644
index 0000000..1eb8223
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/socket/headers.lua
@@ -0,0 +1,104 @@
+-----------------------------------------------------------------------------
+-- Canonic header field capitalization
+-- LuaSocket toolkit.
+-- Author: Diego Nehab
+-----------------------------------------------------------------------------
+local socket = require("socket")
+socket.headers = {}
+local _M = socket.headers
+
+_M.canonic = {
+ ["accept"] = "Accept",
+ ["accept-charset"] = "Accept-Charset",
+ ["accept-encoding"] = "Accept-Encoding",
+ ["accept-language"] = "Accept-Language",
+ ["accept-ranges"] = "Accept-Ranges",
+ ["action"] = "Action",
+ ["alternate-recipient"] = "Alternate-Recipient",
+ ["age"] = "Age",
+ ["allow"] = "Allow",
+ ["arrival-date"] = "Arrival-Date",
+ ["authorization"] = "Authorization",
+ ["bcc"] = "Bcc",
+ ["cache-control"] = "Cache-Control",
+ ["cc"] = "Cc",
+ ["comments"] = "Comments",
+ ["connection"] = "Connection",
+ ["content-description"] = "Content-Description",
+ ["content-disposition"] = "Content-Disposition",
+ ["content-encoding"] = "Content-Encoding",
+ ["content-id"] = "Content-ID",
+ ["content-language"] = "Content-Language",
+ ["content-length"] = "Content-Length",
+ ["content-location"] = "Content-Location",
+ ["content-md5"] = "Content-MD5",
+ ["content-range"] = "Content-Range",
+ ["content-transfer-encoding"] = "Content-Transfer-Encoding",
+ ["content-type"] = "Content-Type",
+ ["cookie"] = "Cookie",
+ ["date"] = "Date",
+ ["diagnostic-code"] = "Diagnostic-Code",
+ ["dsn-gateway"] = "DSN-Gateway",
+ ["etag"] = "ETag",
+ ["expect"] = "Expect",
+ ["expires"] = "Expires",
+ ["final-log-id"] = "Final-Log-ID",
+ ["final-recipient"] = "Final-Recipient",
+ ["from"] = "From",
+ ["host"] = "Host",
+ ["if-match"] = "If-Match",
+ ["if-modified-since"] = "If-Modified-Since",
+ ["if-none-match"] = "If-None-Match",
+ ["if-range"] = "If-Range",
+ ["if-unmodified-since"] = "If-Unmodified-Since",
+ ["in-reply-to"] = "In-Reply-To",
+ ["keywords"] = "Keywords",
+ ["last-attempt-date"] = "Last-Attempt-Date",
+ ["last-modified"] = "Last-Modified",
+ ["location"] = "Location",
+ ["max-forwards"] = "Max-Forwards",
+ ["message-id"] = "Message-ID",
+ ["mime-version"] = "MIME-Version",
+ ["original-envelope-id"] = "Original-Envelope-ID",
+ ["original-recipient"] = "Original-Recipient",
+ ["pragma"] = "Pragma",
+ ["proxy-authenticate"] = "Proxy-Authenticate",
+ ["proxy-authorization"] = "Proxy-Authorization",
+ ["range"] = "Range",
+ ["received"] = "Received",
+ ["received-from-mta"] = "Received-From-MTA",
+ ["references"] = "References",
+ ["referer"] = "Referer",
+ ["remote-mta"] = "Remote-MTA",
+ ["reply-to"] = "Reply-To",
+ ["reporting-mta"] = "Reporting-MTA",
+ ["resent-bcc"] = "Resent-Bcc",
+ ["resent-cc"] = "Resent-Cc",
+ ["resent-date"] = "Resent-Date",
+ ["resent-from"] = "Resent-From",
+ ["resent-message-id"] = "Resent-Message-ID",
+ ["resent-reply-to"] = "Resent-Reply-To",
+ ["resent-sender"] = "Resent-Sender",
+ ["resent-to"] = "Resent-To",
+ ["retry-after"] = "Retry-After",
+ ["return-path"] = "Return-Path",
+ ["sender"] = "Sender",
+ ["server"] = "Server",
+ ["smtp-remote-recipient"] = "SMTP-Remote-Recipient",
+ ["status"] = "Status",
+ ["subject"] = "Subject",
+ ["te"] = "TE",
+ ["to"] = "To",
+ ["trailer"] = "Trailer",
+ ["transfer-encoding"] = "Transfer-Encoding",
+ ["upgrade"] = "Upgrade",
+ ["user-agent"] = "User-Agent",
+ ["vary"] = "Vary",
+ ["via"] = "Via",
+ ["warning"] = "Warning",
+ ["will-retry-until"] = "Will-Retry-Until",
+ ["www-authenticate"] = "WWW-Authenticate",
+ ["x-mailer"] = "X-Mailer",
+}
+
+return _M \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/socket/http.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/socket/http.lua
new file mode 100644
index 0000000..ac4b2d6
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/socket/http.lua
@@ -0,0 +1,354 @@
+-----------------------------------------------------------------------------
+-- HTTP/1.1 client support for the Lua language.
+-- LuaSocket toolkit.
+-- Author: Diego Nehab
+-----------------------------------------------------------------------------
+
+-----------------------------------------------------------------------------
+-- Declare module and import dependencies
+-------------------------------------------------------------------------------
+local socket = require("socket")
+local url = require("socket.url")
+local ltn12 = require("ltn12")
+local mime = require("mime")
+local string = require("string")
+local headers = require("socket.headers")
+local base = _G
+local table = require("table")
+socket.http = {}
+local _M = socket.http
+
+-----------------------------------------------------------------------------
+-- Program constants
+-----------------------------------------------------------------------------
+-- connection timeout in seconds
+TIMEOUT = 60
+-- default port for document retrieval
+_M.PORT = 80
+-- user agent field sent in request
+_M.USERAGENT = socket._VERSION
+
+-----------------------------------------------------------------------------
+-- Reads MIME headers from a connection, unfolding where needed
+-----------------------------------------------------------------------------
+local function receiveheaders(sock, headers)
+ local line, name, value, err
+ headers = headers or {}
+ -- get first line
+ line, err = sock:receive()
+ if err then return nil, err end
+ -- headers go until a blank line is found
+ while line ~= "" do
+ -- get field-name and value
+ name, value = socket.skip(2, string.find(line, "^(.-):%s*(.*)"))
+ if not (name and value) then return nil, "malformed reponse headers" end
+ name = string.lower(name)
+ -- get next line (value might be folded)
+ line, err = sock:receive()
+ if err then return nil, err end
+ -- unfold any folded values
+ while string.find(line, "^%s") do
+ value = value .. line
+ line = sock:receive()
+ if err then return nil, err end
+ end
+ -- save pair in table
+ if headers[name] then headers[name] = headers[name] .. ", " .. value
+ else headers[name] = value end
+ end
+ return headers
+end
+
+-----------------------------------------------------------------------------
+-- Extra sources and sinks
+-----------------------------------------------------------------------------
+socket.sourcet["http-chunked"] = function(sock, headers)
+ return base.setmetatable({
+ getfd = function() return sock:getfd() end,
+ dirty = function() return sock:dirty() end
+ }, {
+ __call = function()
+ -- get chunk size, skip extention
+ local line, err = sock:receive()
+ if err then return nil, err end
+ local size = base.tonumber(string.gsub(line, ";.*", ""), 16)
+ if not size then return nil, "invalid chunk size" end
+ -- was it the last chunk?
+ if size > 0 then
+ -- if not, get chunk and skip terminating CRLF
+ local chunk, err, part = sock:receive(size)
+ if chunk then sock:receive() end
+ return chunk, err
+ else
+ -- if it was, read trailers into headers table
+ headers, err = receiveheaders(sock, headers)
+ if not headers then return nil, err end
+ end
+ end
+ })
+end
+
+socket.sinkt["http-chunked"] = function(sock)
+ return base.setmetatable({
+ getfd = function() return sock:getfd() end,
+ dirty = function() return sock:dirty() end
+ }, {
+ __call = function(self, chunk, err)
+ if not chunk then return sock:send("0\r\n\r\n") end
+ local size = string.format("%X\r\n", string.len(chunk))
+ return sock:send(size .. chunk .. "\r\n")
+ end
+ })
+end
+
+-----------------------------------------------------------------------------
+-- Low level HTTP API
+-----------------------------------------------------------------------------
+local metat = { __index = {} }
+
+function _M.open(host, port, create)
+ -- create socket with user connect function, or with default
+ local c = socket.try((create or socket.tcp)())
+ local h = base.setmetatable({ c = c }, metat)
+ -- create finalized try
+ h.try = socket.newtry(function() h:close() end)
+ -- set timeout before connecting
+ h.try(c:settimeout(_M.TIMEOUT))
+ h.try(c:connect(host, port or _M.PORT))
+ -- here everything worked
+ return h
+end
+
+function metat.__index:sendrequestline(method, uri)
+ local reqline = string.format("%s %s HTTP/1.1\r\n", method or "GET", uri)
+ return self.try(self.c:send(reqline))
+end
+
+function metat.__index:sendheaders(tosend)
+ local canonic = headers.canonic
+ local h = "\r\n"
+ for f, v in base.pairs(tosend) do
+ h = (canonic[f] or f) .. ": " .. v .. "\r\n" .. h
+ end
+ self.try(self.c:send(h))
+ return 1
+end
+
+function metat.__index:sendbody(headers, source, step)
+ source = source or ltn12.source.empty()
+ step = step or ltn12.pump.step
+ -- if we don't know the size in advance, send chunked and hope for the best
+ local mode = "http-chunked"
+ if headers["content-length"] then mode = "keep-open" end
+ return self.try(ltn12.pump.all(source, socket.sink(mode, self.c), step))
+end
+
+function metat.__index:receivestatusline()
+ local status = self.try(self.c:receive(5))
+ -- identify HTTP/0.9 responses, which do not contain a status line
+ -- this is just a heuristic, but is what the RFC recommends
+ if status ~= "HTTP/" then return nil, status end
+ -- otherwise proceed reading a status line
+ status = self.try(self.c:receive("*l", status))
+ local code = socket.skip(2, string.find(status, "HTTP/%d*%.%d* (%d%d%d)"))
+ return self.try(base.tonumber(code), status)
+end
+
+function metat.__index:receiveheaders()
+ return self.try(receiveheaders(self.c))
+end
+
+function metat.__index:receivebody(headers, sink, step)
+ sink = sink or ltn12.sink.null()
+ step = step or ltn12.pump.step
+ local length = base.tonumber(headers["content-length"])
+ local t = headers["transfer-encoding"] -- shortcut
+ local mode = "default" -- connection close
+ if t and t ~= "identity" then mode = "http-chunked"
+ elseif base.tonumber(headers["content-length"]) then mode = "by-length" end
+ return self.try(ltn12.pump.all(socket.source(mode, self.c, length),
+ sink, step))
+end
+
+function metat.__index:receive09body(status, sink, step)
+ local source = ltn12.source.rewind(socket.source("until-closed", self.c))
+ source(status)
+ return self.try(ltn12.pump.all(source, sink, step))
+end
+
+function metat.__index:close()
+ return self.c:close()
+end
+
+-----------------------------------------------------------------------------
+-- High level HTTP API
+-----------------------------------------------------------------------------
+local function adjusturi(reqt)
+ local u = reqt
+ -- if there is a proxy, we need the full url. otherwise, just a part.
+ if not reqt.proxy and not PROXY then
+ u = {
+ path = socket.try(reqt.path, "invalid path 'nil'"),
+ params = reqt.params,
+ query = reqt.query,
+ fragment = reqt.fragment
+ }
+ end
+ return url.build(u)
+end
+
+local function adjustproxy(reqt)
+ local proxy = reqt.proxy or PROXY
+ if proxy then
+ proxy = url.parse(proxy)
+ return proxy.host, proxy.port or 3128
+ else
+ return reqt.host, reqt.port
+ end
+end
+
+local function adjustheaders(reqt)
+ -- default headers
+ local lower = {
+ ["user-agent"] = _M.USERAGENT,
+ ["host"] = reqt.host,
+ ["connection"] = "close, TE",
+ ["te"] = "trailers"
+ }
+ -- if we have authentication information, pass it along
+ if reqt.user and reqt.password then
+ lower["authorization"] =
+ "Basic " .. (mime.b64(reqt.user .. ":" .. reqt.password))
+ end
+ -- override with user headers
+ for i,v in base.pairs(reqt.headers or lower) do
+ lower[string.lower(i)] = v
+ end
+ return lower
+end
+
+-- default url parts
+local default = {
+ host = "",
+ port = _M.PORT,
+ path ="/",
+ scheme = "http"
+}
+
+local function adjustrequest(reqt)
+ -- parse url if provided
+ local nreqt = reqt.url and url.parse(reqt.url, default) or {}
+ -- explicit components override url
+ for i,v in base.pairs(reqt) do nreqt[i] = v end
+ if nreqt.port == "" then nreqt.port = 80 end
+ socket.try(nreqt.host and nreqt.host ~= "",
+ "invalid host '" .. base.tostring(nreqt.host) .. "'")
+ -- compute uri if user hasn't overriden
+ nreqt.uri = reqt.uri or adjusturi(nreqt)
+ -- ajust host and port if there is a proxy
+ nreqt.host, nreqt.port = adjustproxy(nreqt)
+ -- adjust headers in request
+ nreqt.headers = adjustheaders(nreqt)
+ return nreqt
+end
+
+local function shouldredirect(reqt, code, headers)
+ return headers.location and
+ string.gsub(headers.location, "%s", "") ~= "" and
+ (reqt.redirect ~= false) and
+ (code == 301 or code == 302 or code == 303 or code == 307) and
+ (not reqt.method or reqt.method == "GET" or reqt.method == "HEAD")
+ and (not reqt.nredirects or reqt.nredirects < 5)
+end
+
+local function shouldreceivebody(reqt, code)
+ if reqt.method == "HEAD" then return nil end
+ if code == 204 or code == 304 then return nil end
+ if code >= 100 and code < 200 then return nil end
+ return 1
+end
+
+-- forward declarations
+local trequest, tredirect
+
+--[[local]] function tredirect(reqt, location)
+ local result, code, headers, status = trequest {
+ -- the RFC says the redirect URL has to be absolute, but some
+ -- servers do not respect that
+ url = url.absolute(reqt.url, location),
+ source = reqt.source,
+ sink = reqt.sink,
+ headers = reqt.headers,
+ proxy = reqt.proxy,
+ nredirects = (reqt.nredirects or 0) + 1,
+ create = reqt.create
+ }
+ -- pass location header back as a hint we redirected
+ headers = headers or {}
+ headers.location = headers.location or location
+ return result, code, headers, status
+end
+
+--[[local]] function trequest(reqt)
+ -- we loop until we get what we want, or
+ -- until we are sure there is no way to get it
+ local nreqt = adjustrequest(reqt)
+ local h = _M.open(nreqt.host, nreqt.port, nreqt.create)
+ -- send request line and headers
+ h:sendrequestline(nreqt.method, nreqt.uri)
+ h:sendheaders(nreqt.headers)
+ -- if there is a body, send it
+ if nreqt.source then
+ h:sendbody(nreqt.headers, nreqt.source, nreqt.step)
+ end
+ local code, status = h:receivestatusline()
+ -- if it is an HTTP/0.9 server, simply get the body and we are done
+ if not code then
+ h:receive09body(status, nreqt.sink, nreqt.step)
+ return 1, 200
+ end
+ local headers
+ -- ignore any 100-continue messages
+ while code == 100 do
+ headers = h:receiveheaders()
+ code, status = h:receivestatusline()
+ end
+ headers = h:receiveheaders()
+ -- at this point we should have a honest reply from the server
+ -- we can't redirect if we already used the source, so we report the error
+ if shouldredirect(nreqt, code, headers) and not nreqt.source then
+ h:close()
+ return tredirect(reqt, headers.location)
+ end
+ -- here we are finally done
+ if shouldreceivebody(nreqt, code) then
+ h:receivebody(headers, nreqt.sink, nreqt.step)
+ end
+ h:close()
+ return 1, code, headers, status
+end
+
+local function srequest(u, b)
+ local t = {}
+ local reqt = {
+ url = u,
+ sink = ltn12.sink.table(t)
+ }
+ if b then
+ reqt.source = ltn12.source.string(b)
+ reqt.headers = {
+ ["content-length"] = string.len(b),
+ ["content-type"] = "application/x-www-form-urlencoded"
+ }
+ reqt.method = "POST"
+ end
+ local code, headers, status = socket.skip(1, trequest(reqt))
+ return table.concat(t), code, headers, status
+end
+
+_M.request = socket.protect(function(reqt, body)
+ if base.type(reqt) == "string" then return srequest(reqt, body)
+ else return trequest(reqt) end
+end)
+
+return _M \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/socket/smtp.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/socket/smtp.lua
new file mode 100644
index 0000000..b113d00
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/socket/smtp.lua
@@ -0,0 +1,256 @@
+-----------------------------------------------------------------------------
+-- SMTP client support for the Lua language.
+-- LuaSocket toolkit.
+-- Author: Diego Nehab
+-----------------------------------------------------------------------------
+
+-----------------------------------------------------------------------------
+-- Declare module and import dependencies
+-----------------------------------------------------------------------------
+local base = _G
+local coroutine = require("coroutine")
+local string = require("string")
+local math = require("math")
+local os = require("os")
+local socket = require("socket")
+local tp = require("socket.tp")
+local ltn12 = require("ltn12")
+local headers = require("socket.headers")
+local mime = require("mime")
+
+socket.smtp = {}
+local _M = socket.smtp
+
+-----------------------------------------------------------------------------
+-- Program constants
+-----------------------------------------------------------------------------
+-- timeout for connection
+_M.TIMEOUT = 60
+-- default server used to send e-mails
+_M.SERVER = "localhost"
+-- default port
+_M.PORT = 25
+-- domain used in HELO command and default sendmail
+-- If we are under a CGI, try to get from environment
+_M.DOMAIN = os.getenv("SERVER_NAME") or "localhost"
+-- default time zone (means we don't know)
+_M.ZONE = "-0000"
+
+---------------------------------------------------------------------------
+-- Low level SMTP API
+-----------------------------------------------------------------------------
+local metat = { __index = {} }
+
+function metat.__index:greet(domain)
+ self.try(self.tp:check("2.."))
+ self.try(self.tp:command("EHLO", domain or _M.DOMAIN))
+ return socket.skip(1, self.try(self.tp:check("2..")))
+end
+
+function metat.__index:mail(from)
+ self.try(self.tp:command("MAIL", "FROM:" .. from))
+ return self.try(self.tp:check("2.."))
+end
+
+function metat.__index:rcpt(to)
+ self.try(self.tp:command("RCPT", "TO:" .. to))
+ return self.try(self.tp:check("2.."))
+end
+
+function metat.__index:data(src, step)
+ self.try(self.tp:command("DATA"))
+ self.try(self.tp:check("3.."))
+ self.try(self.tp:source(src, step))
+ self.try(self.tp:send("\r\n.\r\n"))
+ return self.try(self.tp:check("2.."))
+end
+
+function metat.__index:quit()
+ self.try(self.tp:command("QUIT"))
+ return self.try(self.tp:check("2.."))
+end
+
+function metat.__index:close()
+ return self.tp:close()
+end
+
+function metat.__index:login(user, password)
+ self.try(self.tp:command("AUTH", "LOGIN"))
+ self.try(self.tp:check("3.."))
+ self.try(self.tp:send(mime.b64(user) .. "\r\n"))
+ self.try(self.tp:check("3.."))
+ self.try(self.tp:send(mime.b64(password) .. "\r\n"))
+ return self.try(self.tp:check("2.."))
+end
+
+function metat.__index:plain(user, password)
+ local auth = "PLAIN " .. mime.b64("\0" .. user .. "\0" .. password)
+ self.try(self.tp:command("AUTH", auth))
+ return self.try(self.tp:check("2.."))
+end
+
+function metat.__index:auth(user, password, ext)
+ if not user or not password then return 1 end
+ if string.find(ext, "AUTH[^\n]+LOGIN") then
+ return self:login(user, password)
+ elseif string.find(ext, "AUTH[^\n]+PLAIN") then
+ return self:plain(user, password)
+ else
+ self.try(nil, "authentication not supported")
+ end
+end
+
+-- send message or throw an exception
+function metat.__index:send(mailt)
+ self:mail(mailt.from)
+ if base.type(mailt.rcpt) == "table" then
+ for i,v in base.ipairs(mailt.rcpt) do
+ self:rcpt(v)
+ end
+ else
+ self:rcpt(mailt.rcpt)
+ end
+ self:data(ltn12.source.chain(mailt.source, mime.stuff()), mailt.step)
+end
+
+function _M.open(server, port, create)
+ local tp = socket.try(tp.connect(server or _M.SERVER, port or _M.PORT,
+ _M.TIMEOUT, create))
+ local s = base.setmetatable({tp = tp}, metat)
+ -- make sure tp is closed if we get an exception
+ s.try = socket.newtry(function()
+ s:close()
+ end)
+ return s
+end
+
+-- convert headers to lowercase
+local function lower_headers(headers)
+ local lower = {}
+ for i,v in base.pairs(headers or lower) do
+ lower[string.lower(i)] = v
+ end
+ return lower
+end
+
+---------------------------------------------------------------------------
+-- Multipart message source
+-----------------------------------------------------------------------------
+-- returns a hopefully unique mime boundary
+local seqno = 0
+local function newboundary()
+ seqno = seqno + 1
+ return string.format('%s%05d==%05u', os.date('%d%m%Y%H%M%S'),
+ math.random(0, 99999), seqno)
+end
+
+-- send_message forward declaration
+local send_message
+
+-- yield the headers all at once, it's faster
+local function send_headers(tosend)
+ local canonic = headers.canonic
+ local h = "\r\n"
+ for f,v in base.pairs(tosend) do
+ h = (canonic[f] or f) .. ': ' .. v .. "\r\n" .. h
+ end
+ coroutine.yield(h)
+end
+
+-- yield multipart message body from a multipart message table
+local function send_multipart(mesgt)
+ -- make sure we have our boundary and send headers
+ local bd = newboundary()
+ local headers = lower_headers(mesgt.headers or {})
+ headers['content-type'] = headers['content-type'] or 'multipart/mixed'
+ headers['content-type'] = headers['content-type'] ..
+ '; boundary="' .. bd .. '"'
+ send_headers(headers)
+ -- send preamble
+ if mesgt.body.preamble then
+ coroutine.yield(mesgt.body.preamble)
+ coroutine.yield("\r\n")
+ end
+ -- send each part separated by a boundary
+ for i, m in base.ipairs(mesgt.body) do
+ coroutine.yield("\r\n--" .. bd .. "\r\n")
+ send_message(m)
+ end
+ -- send last boundary
+ coroutine.yield("\r\n--" .. bd .. "--\r\n\r\n")
+ -- send epilogue
+ if mesgt.body.epilogue then
+ coroutine.yield(mesgt.body.epilogue)
+ coroutine.yield("\r\n")
+ end
+end
+
+-- yield message body from a source
+local function send_source(mesgt)
+ -- make sure we have a content-type
+ local headers = lower_headers(mesgt.headers or {})
+ headers['content-type'] = headers['content-type'] or
+ 'text/plain; charset="iso-8859-1"'
+ send_headers(headers)
+ -- send body from source
+ while true do
+ local chunk, err = mesgt.body()
+ if err then coroutine.yield(nil, err)
+ elseif chunk then coroutine.yield(chunk)
+ else break end
+ end
+end
+
+-- yield message body from a string
+local function send_string(mesgt)
+ -- make sure we have a content-type
+ local headers = lower_headers(mesgt.headers or {})
+ headers['content-type'] = headers['content-type'] or
+ 'text/plain; charset="iso-8859-1"'
+ send_headers(headers)
+ -- send body from string
+ coroutine.yield(mesgt.body)
+end
+
+-- message source
+function send_message(mesgt)
+ if base.type(mesgt.body) == "table" then send_multipart(mesgt)
+ elseif base.type(mesgt.body) == "function" then send_source(mesgt)
+ else send_string(mesgt) end
+end
+
+-- set defaul headers
+local function adjust_headers(mesgt)
+ local lower = lower_headers(mesgt.headers)
+ lower["date"] = lower["date"] or
+ os.date("!%a, %d %b %Y %H:%M:%S ") .. (mesgt.zone or _M.ZONE)
+ lower["x-mailer"] = lower["x-mailer"] or socket._VERSION
+ -- this can't be overriden
+ lower["mime-version"] = "1.0"
+ return lower
+end
+
+function _M.message(mesgt)
+ mesgt.headers = adjust_headers(mesgt)
+ -- create and return message source
+ local co = coroutine.create(function() send_message(mesgt) end)
+ return function()
+ local ret, a, b = coroutine.resume(co)
+ if ret then return a, b
+ else return nil, a end
+ end
+end
+
+---------------------------------------------------------------------------
+-- High level SMTP API
+-----------------------------------------------------------------------------
+_M.send = socket.protect(function(mailt)
+ local s = _M.open(mailt.server, mailt.port, mailt.create)
+ local ext = s:greet(mailt.domain)
+ s:auth(mailt.user, mailt.password, ext)
+ s:send(mailt)
+ s:quit()
+ return s:close()
+end)
+
+return _M \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/socket/tp.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/socket/tp.lua
new file mode 100644
index 0000000..cbeff56
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/socket/tp.lua
@@ -0,0 +1,126 @@
+-----------------------------------------------------------------------------
+-- Unified SMTP/FTP subsystem
+-- LuaSocket toolkit.
+-- Author: Diego Nehab
+-----------------------------------------------------------------------------
+
+-----------------------------------------------------------------------------
+-- Declare module and import dependencies
+-----------------------------------------------------------------------------
+local base = _G
+local string = require("string")
+local socket = require("socket")
+local ltn12 = require("ltn12")
+
+socket.tp = {}
+local _M = socket.tp
+
+-----------------------------------------------------------------------------
+-- Program constants
+-----------------------------------------------------------------------------
+_M.TIMEOUT = 60
+
+-----------------------------------------------------------------------------
+-- Implementation
+-----------------------------------------------------------------------------
+-- gets server reply (works for SMTP and FTP)
+local function get_reply(c)
+ local code, current, sep
+ local line, err = c:receive()
+ local reply = line
+ if err then return nil, err end
+ code, sep = socket.skip(2, string.find(line, "^(%d%d%d)(.?)"))
+ if not code then return nil, "invalid server reply" end
+ if sep == "-" then -- reply is multiline
+ repeat
+ line, err = c:receive()
+ if err then return nil, err end
+ current, sep = socket.skip(2, string.find(line, "^(%d%d%d)(.?)"))
+ reply = reply .. "\n" .. line
+ -- reply ends with same code
+ until code == current and sep == " "
+ end
+ return code, reply
+end
+
+-- metatable for sock object
+local metat = { __index = {} }
+
+function metat.__index:check(ok)
+ local code, reply = get_reply(self.c)
+ if not code then return nil, reply end
+ if base.type(ok) ~= "function" then
+ if base.type(ok) == "table" then
+ for i, v in base.ipairs(ok) do
+ if string.find(code, v) then
+ return base.tonumber(code), reply
+ end
+ end
+ return nil, reply
+ else
+ if string.find(code, ok) then return base.tonumber(code), reply
+ else return nil, reply end
+ end
+ else return ok(base.tonumber(code), reply) end
+end
+
+function metat.__index:command(cmd, arg)
+ cmd = string.upper(cmd)
+ if arg then
+ return self.c:send(cmd .. " " .. arg.. "\r\n")
+ else
+ return self.c:send(cmd .. "\r\n")
+ end
+end
+
+function metat.__index:sink(snk, pat)
+ local chunk, err = c:receive(pat)
+ return snk(chunk, err)
+end
+
+function metat.__index:send(data)
+ return self.c:send(data)
+end
+
+function metat.__index:receive(pat)
+ return self.c:receive(pat)
+end
+
+function metat.__index:getfd()
+ return self.c:getfd()
+end
+
+function metat.__index:dirty()
+ return self.c:dirty()
+end
+
+function metat.__index:getcontrol()
+ return self.c
+end
+
+function metat.__index:source(source, step)
+ local sink = socket.sink("keep-open", self.c)
+ local ret, err = ltn12.pump.all(source, sink, step or ltn12.pump.step)
+ return ret, err
+end
+
+-- closes the underlying c
+function metat.__index:close()
+ self.c:close()
+ return 1
+end
+
+-- connect with server and return c object
+function _M.connect(host, port, timeout, create)
+ local c, e = (create or socket.tcp)()
+ if not c then return nil, e end
+ c:settimeout(timeout or _M.TIMEOUT)
+ local r, e = c:connect(host, port)
+ if not r then
+ c:close()
+ return nil, e
+ end
+ return base.setmetatable({c = c}, metat)
+end
+
+return _M \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/socket/url.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/socket/url.lua
new file mode 100644
index 0000000..7809535
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/socket/url.lua
@@ -0,0 +1,307 @@
+-----------------------------------------------------------------------------
+-- URI parsing, composition and relative URL resolution
+-- LuaSocket toolkit.
+-- Author: Diego Nehab
+-----------------------------------------------------------------------------
+
+-----------------------------------------------------------------------------
+-- Declare module
+-----------------------------------------------------------------------------
+local string = require("string")
+local base = _G
+local table = require("table")
+local socket = require("socket")
+
+socket.url = {}
+local _M = socket.url
+
+-----------------------------------------------------------------------------
+-- Module version
+-----------------------------------------------------------------------------
+_M._VERSION = "URL 1.0.3"
+
+-----------------------------------------------------------------------------
+-- Encodes a string into its escaped hexadecimal representation
+-- Input
+-- s: binary string to be encoded
+-- Returns
+-- escaped representation of string binary
+-----------------------------------------------------------------------------
+function _M.escape(s)
+ return (string.gsub(s, "([^A-Za-z0-9_])", function(c)
+ return string.format("%%%02x", string.byte(c))
+ end))
+end
+
+-----------------------------------------------------------------------------
+-- Protects a path segment, to prevent it from interfering with the
+-- url parsing.
+-- Input
+-- s: binary string to be encoded
+-- Returns
+-- escaped representation of string binary
+-----------------------------------------------------------------------------
+local function make_set(t)
+ local s = {}
+ for i,v in base.ipairs(t) do
+ s[t[i]] = 1
+ end
+ return s
+end
+
+-- these are allowed withing a path segment, along with alphanum
+-- other characters must be escaped
+local segment_set = make_set {
+ "-", "_", ".", "!", "~", "*", "'", "(",
+ ")", ":", "@", "&", "=", "+", "$", ",",
+}
+
+local function protect_segment(s)
+ return string.gsub(s, "([^A-Za-z0-9_])", function (c)
+ if segment_set[c] then return c
+ else return string.format("%%%02x", string.byte(c)) end
+ end)
+end
+
+-----------------------------------------------------------------------------
+-- Encodes a string into its escaped hexadecimal representation
+-- Input
+-- s: binary string to be encoded
+-- Returns
+-- escaped representation of string binary
+-----------------------------------------------------------------------------
+function _M.unescape(s)
+ return (string.gsub(s, "%%(%x%x)", function(hex)
+ return string.char(base.tonumber(hex, 16))
+ end))
+end
+
+-----------------------------------------------------------------------------
+-- Builds a path from a base path and a relative path
+-- Input
+-- base_path
+-- relative_path
+-- Returns
+-- corresponding absolute path
+-----------------------------------------------------------------------------
+local function absolute_path(base_path, relative_path)
+ if string.sub(relative_path, 1, 1) == "/" then return relative_path end
+ local path = string.gsub(base_path, "[^/]*$", "")
+ path = path .. relative_path
+ path = string.gsub(path, "([^/]*%./)", function (s)
+ if s ~= "./" then return s else return "" end
+ end)
+ path = string.gsub(path, "/%.$", "/")
+ local reduced
+ while reduced ~= path do
+ reduced = path
+ path = string.gsub(reduced, "([^/]*/%.%./)", function (s)
+ if s ~= "../../" then return "" else return s end
+ end)
+ end
+ path = string.gsub(reduced, "([^/]*/%.%.)$", function (s)
+ if s ~= "../.." then return "" else return s end
+ end)
+ return path
+end
+
+-----------------------------------------------------------------------------
+-- Parses a url and returns a table with all its parts according to RFC 2396
+-- The following grammar describes the names given to the URL parts
+-- <url> ::= <scheme>://<authority>/<path>;<params>?<query>#<fragment>
+-- <authority> ::= <userinfo>@<host>:<port>
+-- <userinfo> ::= <user>[:<password>]
+-- <path> :: = {<segment>/}<segment>
+-- Input
+-- url: uniform resource locator of request
+-- default: table with default values for each field
+-- Returns
+-- table with the following fields, where RFC naming conventions have
+-- been preserved:
+-- scheme, authority, userinfo, user, password, host, port,
+-- path, params, query, fragment
+-- Obs:
+-- the leading '/' in {/<path>} is considered part of <path>
+-----------------------------------------------------------------------------
+function _M.parse(url, default)
+ -- initialize default parameters
+ local parsed = {}
+ for i,v in base.pairs(default or parsed) do parsed[i] = v end
+ -- empty url is parsed to nil
+ if not url or url == "" then return nil, "invalid url" end
+ -- remove whitespace
+ -- url = string.gsub(url, "%s", "")
+ -- get fragment
+ url = string.gsub(url, "#(.*)$", function(f)
+ parsed.fragment = f
+ return ""
+ end)
+ -- get scheme
+ url = string.gsub(url, "^([%w][%w%+%-%.]*)%:",
+ function(s) parsed.scheme = s; return "" end)
+ -- get authority
+ url = string.gsub(url, "^//([^/]*)", function(n)
+ parsed.authority = n
+ return ""
+ end)
+ -- get query string
+ url = string.gsub(url, "%?(.*)", function(q)
+ parsed.query = q
+ return ""
+ end)
+ -- get params
+ url = string.gsub(url, "%;(.*)", function(p)
+ parsed.params = p
+ return ""
+ end)
+ -- path is whatever was left
+ if url ~= "" then parsed.path = url end
+ local authority = parsed.authority
+ if not authority then return parsed end
+ authority = string.gsub(authority,"^([^@]*)@",
+ function(u) parsed.userinfo = u; return "" end)
+ authority = string.gsub(authority, ":([^:%]]*)$",
+ function(p) parsed.port = p; return "" end)
+ if authority ~= "" then
+ -- IPv6?
+ parsed.host = string.match(authority, "^%[(.+)%]$") or authority
+ end
+ local userinfo = parsed.userinfo
+ if not userinfo then return parsed end
+ userinfo = string.gsub(userinfo, ":([^:]*)$",
+ function(p) parsed.password = p; return "" end)
+ parsed.user = userinfo
+ return parsed
+end
+
+-----------------------------------------------------------------------------
+-- Rebuilds a parsed URL from its components.
+-- Components are protected if any reserved or unallowed characters are found
+-- Input
+-- parsed: parsed URL, as returned by parse
+-- Returns
+-- a stringing with the corresponding URL
+-----------------------------------------------------------------------------
+function _M.build(parsed)
+ local ppath = _M.parse_path(parsed.path or "")
+ local url = _M.build_path(ppath)
+ if parsed.params then url = url .. ";" .. parsed.params end
+ if parsed.query then url = url .. "?" .. parsed.query end
+ local authority = parsed.authority
+ if parsed.host then
+ authority = parsed.host
+ if string.find(authority, ":") then -- IPv6?
+ authority = "[" .. authority .. "]"
+ end
+ if parsed.port then authority = authority .. ":" .. parsed.port end
+ local userinfo = parsed.userinfo
+ if parsed.user then
+ userinfo = parsed.user
+ if parsed.password then
+ userinfo = userinfo .. ":" .. parsed.password
+ end
+ end
+ if userinfo then authority = userinfo .. "@" .. authority end
+ end
+ if authority then url = "//" .. authority .. url end
+ if parsed.scheme then url = parsed.scheme .. ":" .. url end
+ if parsed.fragment then url = url .. "#" .. parsed.fragment end
+ -- url = string.gsub(url, "%s", "")
+ return url
+end
+
+-----------------------------------------------------------------------------
+-- Builds a absolute URL from a base and a relative URL according to RFC 2396
+-- Input
+-- base_url
+-- relative_url
+-- Returns
+-- corresponding absolute url
+-----------------------------------------------------------------------------
+function _M.absolute(base_url, relative_url)
+ if base.type(base_url) == "table" then
+ base_parsed = base_url
+ base_url = _M.build(base_parsed)
+ else
+ base_parsed = _M.parse(base_url)
+ end
+ local relative_parsed = _M.parse(relative_url)
+ if not base_parsed then return relative_url
+ elseif not relative_parsed then return base_url
+ elseif relative_parsed.scheme then return relative_url
+ else
+ relative_parsed.scheme = base_parsed.scheme
+ if not relative_parsed.authority then
+ relative_parsed.authority = base_parsed.authority
+ if not relative_parsed.path then
+ relative_parsed.path = base_parsed.path
+ if not relative_parsed.params then
+ relative_parsed.params = base_parsed.params
+ if not relative_parsed.query then
+ relative_parsed.query = base_parsed.query
+ end
+ end
+ else
+ relative_parsed.path = absolute_path(base_parsed.path or "",
+ relative_parsed.path)
+ end
+ end
+ return _M.build(relative_parsed)
+ end
+end
+
+-----------------------------------------------------------------------------
+-- Breaks a path into its segments, unescaping the segments
+-- Input
+-- path
+-- Returns
+-- segment: a table with one entry per segment
+-----------------------------------------------------------------------------
+function _M.parse_path(path)
+ local parsed = {}
+ path = path or ""
+ --path = string.gsub(path, "%s", "")
+ string.gsub(path, "([^/]+)", function (s) table.insert(parsed, s) end)
+ for i = 1, #parsed do
+ parsed[i] = _M.unescape(parsed[i])
+ end
+ if string.sub(path, 1, 1) == "/" then parsed.is_absolute = 1 end
+ if string.sub(path, -1, -1) == "/" then parsed.is_directory = 1 end
+ return parsed
+end
+
+-----------------------------------------------------------------------------
+-- Builds a path component from its segments, escaping protected characters.
+-- Input
+-- parsed: path segments
+-- unsafe: if true, segments are not protected before path is built
+-- Returns
+-- path: corresponding path stringing
+-----------------------------------------------------------------------------
+function _M.build_path(parsed, unsafe)
+ local path = ""
+ local n = #parsed
+ if unsafe then
+ for i = 1, n-1 do
+ path = path .. parsed[i]
+ path = path .. "/"
+ end
+ if n > 0 then
+ path = path .. parsed[n]
+ if parsed.is_directory then path = path .. "/" end
+ end
+ else
+ for i = 1, n-1 do
+ path = path .. protect_segment(parsed[i])
+ path = path .. "/"
+ end
+ if n > 0 then
+ path = path .. protect_segment(parsed[n])
+ if parsed.is_directory then path = path .. "/" end
+ end
+ end
+ if parsed.is_absolute then path = "/" .. path end
+ return path
+end
+
+return _M
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/ssl.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/ssl.lua
new file mode 100644
index 0000000..0170bc8
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/ssl.lua
@@ -0,0 +1,93 @@
+------------------------------------------------------------------------------
+-- LuaSec 0.4.1
+-- Copyright (C) 2006-2011 Bruno Silvestre
+--
+------------------------------------------------------------------------------
+
+module("ssl", package.seeall)
+
+require("ssl.core")
+require("ssl.context")
+
+
+_VERSION = "0.4.1"
+_COPYRIGHT = "LuaSec 0.4.1 - Copyright (C) 2006-2011 Bruno Silvestre\n" ..
+ "LuaSocket 2.0.2 - Copyright (C) 2004-2007 Diego Nehab"
+
+-- Export functions
+rawconnection = core.rawconnection
+rawcontext = context.rawcontext
+
+--
+--
+--
+local function optexec(func, param, ctx)
+ if param then
+ if type(param) == "table" then
+ return func(ctx, unpack(param))
+ else
+ return func(ctx, param)
+ end
+ end
+ return true
+end
+
+--
+--
+--
+function newcontext(cfg)
+ local succ, msg, ctx
+ -- Create the context
+ ctx, msg = context.create(cfg.protocol)
+ if not ctx then return nil, msg end
+ -- Mode
+ succ, msg = context.setmode(ctx, cfg.mode)
+ if not succ then return nil, msg end
+ -- Load the key
+ if cfg.key then
+ succ, msg = context.loadkey(ctx, cfg.key, cfg.password)
+ if not succ then return nil, msg end
+ end
+ -- Load the certificate
+ if cfg.certificate then
+ succ, msg = context.loadcert(ctx, cfg.certificate)
+ if not succ then return nil, msg end
+ end
+ -- Load the CA certificates
+ if cfg.cafile or cfg.capath then
+ succ, msg = context.locations(ctx, cfg.cafile, cfg.capath)
+ if not succ then return nil, msg end
+ end
+ -- Set the verification options
+ succ, msg = optexec(context.setverify, cfg.verify, ctx)
+ if not succ then return nil, msg end
+ -- Set SSL options
+ succ, msg = optexec(context.setoptions, cfg.options, ctx)
+ if not succ then return nil, msg end
+ -- Set the depth for certificate verification
+ if cfg.depth then
+ succ, msg = context.setdepth(ctx, cfg.depth)
+ if not succ then return nil, msg end
+ end
+ return ctx
+end
+
+--
+--
+--
+function wrap(sock, cfg)
+ local ctx, msg
+ if type(cfg) == "table" then
+ ctx, msg = newcontext(cfg)
+ if not ctx then return nil, msg end
+ else
+ ctx = cfg
+ end
+ local s, msg = core.create(ctx)
+ if s then
+ core.setfd(s, sock:getfd())
+ sock:setfd(core.invalidfd)
+ return s
+ end
+ return nil, msg
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/ssl/https.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/ssl/https.lua
new file mode 100644
index 0000000..00a7e5b
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/ssl/https.lua
@@ -0,0 +1,138 @@
+----------------------------------------------------------------------------
+-- LuaSec 0.4.1
+-- Copyright (C) 2009-2011 PUC-Rio
+--
+-- Author: Pablo Musa
+-- Author: Tomas Guisasola
+---------------------------------------------------------------------------
+
+local socket = require("socket")
+local ssl = require("ssl")
+local ltn12 = require("ltn12")
+local http = require("socket.http")
+local url = require("socket.url")
+
+local table = require("table")
+local string = require("string")
+
+local try = socket.try
+local type = type
+local pairs = pairs
+local getmetatable = getmetatable
+
+module("ssl.https")
+
+_VERSION = "0.4.1"
+_COPYRIGHT = "LuaSec 0.4.1 - Copyright (C) 2009-2011 PUC-Rio"
+
+-- Default settings
+PORT = 443
+
+local cfg = {
+ protocol = "tlsv1",
+ options = "all",
+ verify = "none",
+}
+
+--------------------------------------------------------------------
+-- Auxiliar Functions
+--------------------------------------------------------------------
+
+-- Insert default HTTPS port.
+local function default_https_port(u)
+ return url.build(url.parse(u, {port = PORT}))
+end
+
+-- Convert an URL to a table according to Luasocket needs.
+local function urlstring_totable(url, body, result_table)
+ url = {
+ url = default_https_port(url),
+ method = body and "POST" or "GET",
+ sink = ltn12.sink.table(result_table)
+ }
+ if body then
+ url.source = ltn12.source.string(body)
+ url.headers = {
+ ["content-length"] = #body,
+ ["content-type"] = "application/x-www-form-urlencoded",
+ }
+ end
+ return url
+end
+
+-- Forward calls to the real connection object.
+local function reg(conn)
+ local mt = getmetatable(conn.sock).__index
+ for name, method in pairs(mt) do
+ if type(method) == "function" then
+ conn[name] = function (self, ...)
+ return method(self.sock, ...)
+ end
+ end
+ end
+end
+
+-- Return a function which performs the SSL/TLS connection.
+local function tcp(params)
+ params = params or {}
+ -- Default settings
+ for k, v in pairs(cfg) do
+ params[k] = params[k] or v
+ end
+ -- Force client mode
+ params.mode = "client"
+ -- 'create' function for LuaSocket
+ return function ()
+ local conn = {}
+ conn.sock = try(socket.tcp())
+ local st = getmetatable(conn.sock).__index.settimeout
+ function conn:settimeout(...)
+ return st(self.sock, ...)
+ end
+ -- Replace TCP's connection function
+ function conn:connect(host, port)
+ try(self.sock:connect(host, port))
+ self.sock = try(ssl.wrap(self.sock, params))
+ try(self.sock:dohandshake())
+ reg(self, getmetatable(self.sock))
+ return 1
+ end
+ return conn
+ end
+end
+
+--------------------------------------------------------------------
+-- Main Function
+--------------------------------------------------------------------
+
+-- Make a HTTP request over secure connection. This function receives
+-- the same parameters of LuaSocket's HTTP module (except 'proxy' and
+-- 'redirect') plus LuaSec parameters.
+--
+-- @param url mandatory (string or table)
+-- @param body optional (string)
+-- @return (string if url == string or 1), code, headers, status
+--
+function request(url, body)
+ local result_table = {}
+ local stringrequest = type(url) == "string"
+ if stringrequest then
+ url = urlstring_totable(url, body, result_table)
+ else
+ url.url = default_https_port(url.url)
+ end
+ if http.PROXY or url.proxy then
+ return nil, "proxy not supported"
+ elseif url.redirect then
+ return nil, "redirect not supported"
+ elseif url.create then
+ return nil, "create function not permitted"
+ end
+ -- New 'create' function to establish a secure connection
+ url.create = tcp(url)
+ local res, code, headers, status = http.request(url)
+ if res and stringrequest then
+ return table.concat(result_table), code, headers, status
+ end
+ return res, code, headers, status
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/lualibs/testwell.lua b/love2dToAPK/tools/tools/zbstudio-win/lualibs/testwell.lua
new file mode 100644
index 0000000..8172e34
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/lualibs/testwell.lua
@@ -0,0 +1,315 @@
+--
+-- Copyright (C) 2012 Paul Kulchenko
+-- A simple testing library
+-- Based on lua-TestMore : <http://fperrad.github.com/lua-TestMore/>
+-- Copyright (c) 2009-2011 Francois Perrad
+-- This library is licensed under the terms of the MIT/X11 license,
+-- like Lua itself.
+--
+
+local pairs = pairs
+local tostring = tostring
+local type = type
+local _G = _G or _ENV
+
+-----------------------------------------------------------
+
+local tb = {
+ curr_test = 0,
+ good_test = 0,
+ skip_test = 0,
+}
+
+function tb:print(...)
+ print(...)
+end
+
+function tb:note(...)
+ self:print(...)
+end
+
+function tb:diag(...)
+ local arg = {...}
+ for k, v in pairs(arg) do
+ arg[k] = tostring(v)
+ end
+ local msg = table.concat(arg)
+ msg = msg:gsub("\n", "\n# ")
+ msg = msg:gsub("\n# \n", "\n#\n")
+ msg = msg:gsub("\n# $", '')
+ self:print("# " .. msg)
+end
+
+function tb:ok(test, name, more)
+ self.curr_test = self.curr_test + 1
+ self.good_test = self.good_test + (test and 1 or 0)
+ self.skip_test = self.skip_test + (test == nil and 1 or 0)
+ name = tostring(name or '')
+ local out = ''
+ if not test then
+ out = "not "
+ end
+ out = out .. "ok " .. self.curr_test
+ if name ~= '' then
+ out = out .. " - " .. name
+ end
+ self:print(out)
+ if test == false then
+ self:diag(" Failed test " .. (name and ("'" .. name .. "'") or ''))
+ if debug then
+ local info = debug.getinfo(3)
+ local file = info.short_src
+ local line = info.currentline
+ self:diag(" in " .. file .. " at line " .. line .. ".")
+ end
+ self:diag(more)
+ end
+end
+
+function tb:done_testing(reset)
+ local c, g, s = self.curr_test, self.good_test, self.skip_test
+ if reset then
+ self.curr_test = 0
+ self.good_test = 0
+ self.skip_test = 0
+ end
+ return c, g, s
+end
+
+-----------------------------------------------------------
+
+local serpent = (function() ---- include Serpent module for serialization
+local n, v = "serpent", 0.15 -- (C) 2012 Paul Kulchenko; MIT License
+local c, d = "Paul Kulchenko", "Serializer and pretty printer of Lua data types"
+local snum = {[tostring(1/0)]='1/0 --[[math.huge]]',[tostring(-1/0)]='-1/0 --[[-math.huge]]',[tostring(0/0)]='0/0'}
+local badtype = {thread = true, userdata = true}
+local keyword, globals, G = {}, {}, (_G or _ENV)
+for _,k in ipairs({'and', 'break', 'do', 'else', 'elseif', 'end', 'false',
+ 'for', 'function', 'goto', 'if', 'in', 'local', 'nil', 'not', 'or', 'repeat',
+ 'return', 'then', 'true', 'until', 'while'}) do keyword[k] = true end
+for k,v in pairs(G) do globals[v] = k end -- build func to name mapping
+for _,g in ipairs({'coroutine', 'debug', 'io', 'math', 'string', 'table', 'os'}) do
+ for k,v in pairs(G[g]) do globals[v] = g..'.'..k end end
+
+local function s(t, opts)
+ local name, indent, fatal = opts.name, opts.indent, opts.fatal
+ local sparse, custom, huge = opts.sparse, opts.custom, not opts.nohuge
+ local space, maxl = (opts.compact and '' or ' '), (opts.maxlevel or math.huge)
+ local comm = opts.comment and (tonumber(opts.comment) or math.huge)
+ local seen, sref, syms, symn = {}, {}, {}, 0
+ local function gensym(val) return tostring(val):gsub("[^%w]",""):gsub("(%d%w+)",
+ function(s) if not syms[s] then symn = symn+1; syms[s] = symn end return syms[s] end) end
+ local function safestr(s) return type(s) == "number" and (huge and snum[tostring(s)] or s)
+ or type(s) ~= "string" and tostring(s) -- escape NEWLINE/010 and EOF/026
+ or ("%q"):format(s):gsub("\010","n"):gsub("\026","\\026") end
+ local function comment(s,l) return comm and (l or 0) < comm and ' --[['..tostring(s)..']]' or '' end
+ local function globerr(s,l) return globals[s] and globals[s]..comment(s,l) or not fatal
+ and safestr(tostring(s))..comment('err',l) or error("Can't serialize "..tostring(s)) end
+ local function safename(path, name) -- generates foo.bar, foo[3], or foo['b a r']
+ local n = name == nil and '' or name
+ local plain = type(n) == "string" and n:match("^[%l%u_][%w_]*$") and not keyword[n]
+ local safe = plain and n or '['..safestr(n)..']'
+ return (path or '')..(plain and path and '.' or '')..safe, safe end
+ local alphanumsort = type(opts.sortkeys) == 'function' and opts.sortkeys or function(o, n)
+ local maxn, to = tonumber(n) or 12, {number = 'a', string = 'b'}
+ local function padnum(d) return ("%0"..maxn.."d"):format(d) end
+ table.sort(o, function(a,b)
+ return (o[a] and 0 or to[type(a)] or 'z')..(tostring(a):gsub("%d+",padnum))
+ < (o[b] and 0 or to[type(b)] or 'z')..(tostring(b):gsub("%d+",padnum)) end) end
+ local function val2str(t, name, indent, path, plainindex, level)
+ local ttype, level = type(t), (level or 0)
+ local spath, sname = safename(path, name)
+ local tag = plainindex and
+ ((type(name) == "number") and '' or name..space..'='..space) or
+ (name ~= nil and sname..space..'='..space or '')
+ if seen[t] then
+ table.insert(sref, spath..space..'='..space..seen[t])
+ return tag..'nil'..comment('ref', level)
+ elseif badtype[ttype] then return tag..globerr(t, level)
+ elseif ttype == 'function' then
+ seen[t] = spath
+ local ok, res = pcall(string.dump, t)
+ local func = ok and ((opts.nocode and "function() end" or
+ "loadstring("..safestr(res)..",'@serialized')")..comment(t, level))
+ return tag..(func or globerr(t, level))
+ elseif ttype == "table" then
+ if level >= maxl then return tag..'{}'..comment('max', level) end
+ seen[t] = spath
+ if next(t) == nil then return tag..'{}'..comment(t, level) end -- table empty
+ local maxn, o, out = #t, {}, {}
+ for key = 1, maxn do table.insert(o, key) end
+ for key in pairs(t) do if not o[key] then table.insert(o, key) end end
+ if opts.sortkeys then alphanumsort(o, opts.sortkeys) end
+ for n, key in ipairs(o) do
+ local value, ktype, plainindex = t[key], type(key), n <= maxn and not sparse
+ if opts.ignore and opts.ignore[value] -- skip ignored values; do nothing
+ or sparse and value == nil then -- skipping nils; do nothing
+ elseif ktype == 'table' or ktype == 'function' then
+ if not seen[key] and not globals[key] then
+ table.insert(sref, 'local '..val2str(key,gensym(key),indent)) end
+ table.insert(sref, seen[t]..'['..(seen[key] or globals[key] or gensym(key))
+ ..']'..space..'='..space..(seen[value] or val2str(value,nil,indent)))
+ else
+ if badtype[ktype] then plainindex, key = true, '['..globerr(key, level+1)..']' end
+ table.insert(out,val2str(value,key,indent,spath,plainindex,level+1))
+ end
+ end
+ local prefix = string.rep(indent or '', level)
+ local head = indent and '{\n'..prefix..indent or '{'
+ local body = table.concat(out, ','..(indent and '\n'..prefix..indent or space))
+ local tail = indent and "\n"..prefix..'}' or '}'
+ return (custom and custom(tag,head,body,tail) or tag..head..body..tail)..comment(t, level)
+ else return tag..safestr(t) end -- handle all other types
+ end
+ local sepr = indent and "\n" or ";"..space
+ local body = val2str(t, name, indent) -- this call also populates sref
+ local tail = #sref>0 and table.concat(sref, sepr)..sepr or ''
+ return not name and body or "do local "..body..sepr..tail.."return "..name..sepr.."end"
+end
+
+local function merge(a, b) if b then for k,v in pairs(b) do a[k] = v end end; return a; end
+return { _NAME = n, _COPYRIGHT = c, _DESCRIPTION = d, _VERSION = v, serialize = s,
+ dump = function(a, opts) return s(a, merge({name = '_', compact = true, sparse = true}, opts)) end,
+ line = function(a, opts) return s(a, merge({sortkeys = true, comment = true}, opts)) end,
+ block = function(a, opts) return s(a, merge({indent = ' ', sortkeys = true, comment = true}, opts)) end }
+end)() ---- end of Serpent module
+
+-----------------------------------------------------------
+
+local m = {}
+
+function m.ok(test, name)
+ tb:ok(test, name)
+end
+
+local parms = {comment = false}
+function m.is(got, expected, name)
+ local tgot, texp = type(got), type(expected)
+ local vgot, vexp = serpent.line(got, parms), serpent.line(expected, parms)
+ local pass = vgot == vexp
+ if got == nil then pass = nil end
+ tb:ok(pass, name, not pass and
+ " got: " .. vgot .. " (" .. tgot .. ")" ..
+ "\n expected: " .. vexp .. " (" .. texp .. ")")
+end
+
+function m.isnt(got, expected, name)
+ local tgot, texp = type(got), type(expected)
+ local vgot, vexp = serpent.line(got, parms), serpent.line(expected, parms)
+ local pass = vgot ~= vexp
+ if got == nil then pass = nil end
+ tb:ok(pass, name, not pass and
+ " got: " .. vgot .. " (" .. tgot .. ")" ..
+ "\n expected: anything else")
+end
+
+function m.like(got, pattern, name)
+ if type(pattern) ~= 'string' then
+ return tb:ok(false, name, "pattern isn't a string : " .. tostring(pattern))
+ end
+
+ local pass = tostring(got):match(pattern)
+ if got == nil then pass = nil end
+ tb:ok(pass, name, not pass and
+ " '" .. tostring(got) .. "'" ..
+ "\n doesn't match '" .. pattern .. "'")
+end
+
+function m.unlike(got, pattern, name)
+ if type(pattern) ~= 'string' then
+ return tb:ok(false, name, "pattern isn't a string : " .. tostring(pattern))
+ end
+
+ local pass = not tostring(got):match(pattern)
+ if got == nil then pass = nil end
+ tb:ok(pass, name, not pass and
+ " '" .. tostring(got) .. "'" ..
+ "\n matches '" .. pattern .. "'")
+end
+
+local cmp = {
+ ['<'] = function (a, b) return a < b end,
+ ['<='] = function (a, b) return a <= b end,
+ ['>'] = function (a, b) return a > b end,
+ ['>='] = function (a, b) return a >= b end,
+ ['=='] = function (a, b) return a == b end,
+ ['~='] = function (a, b) return a ~= b end,
+}
+
+function m.cmp_ok(this, op, that, name)
+ local f = cmp[op]
+ if not f then
+ return tb:ok(false, name, "unknown operator : " .. tostring(op))
+ end
+
+ local pass = f(this, that)
+ if this == nil then pass = nil end
+ tb:ok(pass, name, not pass and
+ " " .. tostring(this) ..
+ "\n " .. op ..
+ "\n " .. tostring(that))
+end
+
+function m.type_ok(val, t, name)
+ if type(t) ~= 'string' then
+ return tb:ok(false, name, "type isn't a string : " .. tostring(t))
+ end
+
+ if type(val) == t then
+ tb:ok(true, name)
+ else
+ tb:ok(false, name,
+ " " .. tostring(val) .. " isn't a '" .. t .."', it's a '" .. type(val) .. "'")
+ end
+end
+
+function m.diag(...)
+ tb:diag(...)
+end
+
+function m.report()
+ local total, good, skipped = tb:done_testing(true)
+ if total == 0 then return end
+ local failed = total - good - skipped
+ local sum = ("(%d/%d/%d)."):format(good, skipped, total)
+ local num, msg = 0, ""
+ if good > 0 then
+ num, msg = good, msg .. "passed " .. good
+ end
+ if failed > 0 then
+ num, msg = failed, msg .. (#msg > 0 and (skipped > 0 and ", " or " and ") or "")
+ .. "failed " .. failed
+ end
+ if skipped > 0 then
+ num, msg = skipped, msg .. (#msg > 0 and ((good > 0 and failed > 0 and ',' or '') .." and ") or "")
+ .. "skipped " .. skipped
+ end
+ msg = ("Looks like you %s test%s of %d %s"):format(msg, (num > 1 and 's' or ''), total, sum)
+ if skipped == total then msg = "Looks like you skipped all tests " .. sum end
+ if good == total then msg = "All tests passed " .. sum end
+ tb:note(("1..%d # %s"):format(total, msg))
+end
+
+function m.ismain()
+ for l = 3, 64 do -- only check up to 64 level; no more needed
+ local info = debug.getinfo(l)
+ if not info then return true end
+ if info.func == require then return false end
+ end
+ return true
+end
+
+-- this is needed to call report() when the test object is destroyed
+if _VERSION >= "Lua 5.2" then
+ setmetatable(m, {__gc = m.report})
+else
+ -- keep sentinel alive until 'm' is garbage collected
+ m.sentinel = newproxy(true)
+ getmetatable(m.sentinel).__gc = m.report
+end
+
+for k, v in pairs(m) do -- injection
+ _G[k] = v
+end
+
+return m
diff --git a/love2dToAPK/tools/tools/zbstudio-win/spec/lua.lua b/love2dToAPK/tools/tools/zbstudio-win/spec/lua.lua
new file mode 100644
index 0000000..294976f
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/spec/lua.lua
@@ -0,0 +1,284 @@
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local funcdef = "([A-Za-z_][A-Za-z0-9_%.%:]*)%s*"
+local decindent = {
+ ['else'] = true, ['elseif'] = true, ['until'] = true, ['end'] = true}
+local incindent = {
+ ['else'] = true, ['elseif'] = true, ['for'] = true, ['do'] = true,
+ ['if'] = true, ['repeat'] = true, ['while'] = true}
+local function isfndef(str)
+ local l
+ local s,e,cap,par = string.find(str, "function%s+" .. funcdef .. "(%(.-%))")
+ -- try to match without brackets now, but only at the beginning of the line
+ if (not s) then
+ s,e,cap = string.find(str, "^%s*function%s+" .. funcdef)
+ end
+ -- try to match "foo = function()"
+ if (not s) then
+ s,e,cap,par = string.find(str, funcdef .. "=%s*function%s*(%(.-%))")
+ end
+ if (s) then
+ l = string.find(string.sub(str,1,s-1),"local%s+$")
+ cap = cap .. " " .. (par or "(?)")
+ end
+ return s,e,cap,l
+end
+local q = EscapeMagic
+
+local function ldoc(tx, typepatt)
+ local varname = "([%w_]+)"
+ -- <type> == ?string, ?|T1|T2
+ -- anything that follows optional "|..." is ignored
+ local typename = "%??"..typepatt
+ -- @tparam[...] <type> <paramname>
+ -- @param[type=<type>] <paramname>
+ -- @string[...] <paramname>; not handled
+ local t, v = tx:match("--%s*@tparam%b[]%s+"..typename.."%s+"..varname)
+ if not t then -- try without optional [...] part
+ t, v = tx:match("--%s*@tparam%s+"..typename.."%s+"..varname)
+ end
+ if not t then
+ t, v = tx:match("--%s*@param%s*%[type="..typename.."%]%s+"..varname)
+ end
+ return t, v
+end
+
+return {
+ exts = {"lua", "rockspec", "wlua"},
+ lexer = wxstc.wxSTC_LEX_LUA,
+ apitype = "lua",
+ linecomment = "--",
+ sep = ".:",
+ isdecindent = function(str)
+ str = str:gsub('%-%-%[=*%[.*%]=*%]',''):gsub('%-%-.*','')
+ -- this handles three different cases:
+ local term = (str:match("^%s*(%w+)%s*$")
+ or str:match("^%s*(elseif)[%s%(]")
+ or str:match("^%s*(until)[%s%(]")
+ or str:match("^%s*(else)%f[%W]")
+ )
+ -- (1) 'end', 'elseif', 'else', 'until'
+ local match = term and decindent[term]
+ -- (2) 'end)', 'end}', 'end,', and 'end;'
+ if not term then term, match = str:match("^%s*(end)%s*([%)%}]*)%s*[,;]?") end
+ -- endFoo could be captured as well; filter it out
+ if term and str:match("^%s*(end)%w") then term = nil end
+ -- (3) '},', '};', '),' and ');'
+ if not term then match = str:match("^%s*[%)%}]+%s*[,;]?%s*$") end
+
+ return match and 1 or 0, match and term and 1 or 0
+ end,
+ isincindent = function(str)
+ -- remove "long" comments and escaped slashes (to process \' and \" below)
+ str = str:gsub('%-%-%[=*%[.-%]=*%]',''):gsub('\\[\\\'"]','')
+ while true do
+ local num, sep = nil, str:match("['\"]")
+ if not sep then break end
+ str, num = str:gsub(sep..".-\\"..sep,sep):gsub(sep..".-"..sep,"")
+ if num == 0 then break end
+ end
+ str = (str
+ :gsub('%[=*%[.-%]=*%]','') -- remove long strings
+ :gsub('%[=*%[.*','') -- remove partial long strings
+ :gsub('%-%-.*','') -- strip comments after strings are processed
+ :gsub("%b()","()") -- remove all function calls
+ )
+
+ local term = str:match("^%s*(%w+)%W*")
+ local terminc = term and incindent[term] and 1 or 0
+ -- fix 'if' not terminated with 'then'
+ -- or 'then' not started with 'if'
+ if (term == 'if' or term == 'elseif') and not str:match("%f[%w]then%f[%W]")
+ or (term == 'for') and not str:match("%S%s+do%f[%W]")
+ or (term == 'while') and not str:match("%f[%w]do%f[%W]") then
+ terminc = 0
+ elseif not (term == 'if' or term == 'elseif') and str:match("%f[%w]then%f[%W]")
+ or not (term == 'for') and str:match("%S%s+do%f[%W]")
+ or not (term == 'while') and str:match("%f[%w]do%f[%W]") then
+ terminc = 1
+ end
+ local _, opened = str:gsub("([%{%(])", "%1")
+ local _, closed = str:gsub("([%}%)])", "%1")
+ local func = (isfndef(str) or str:match("%W+function%s*%(")) and 1 or 0
+ -- ended should only be used to negate term and func effects
+ local anon = str:match("%W+function%s*%(.+%Wend%W")
+ local ended = (terminc + func > 0) and (str:match("%W+end%s*$") or anon) and 1 or 0
+
+ return opened - closed + func + terminc - ended
+ end,
+ marksymbols = function(code, pos, vars)
+ local PARSE = require 'lua_parser_loose'
+ local LEX = require 'lua_lexer_loose'
+ local lx = LEX.lexc(code, nil, pos)
+ return coroutine.wrap(function()
+ local varnext = {}
+ PARSE.parse_scope_resolve(lx, function(op, name, lineinfo, vars, nobreak)
+ if not(op == 'Id' or op == 'Statement' or op == 'Var'
+ or op == 'Function' or op == 'String'
+ or op == 'VarNext' or op == 'VarInside' or op == 'VarSelf'
+ or op == 'FunctionCall' or op == 'Scope' or op == 'EndScope') then
+ return end -- "normal" return; not interested in other events
+
+ -- level needs to be adjusted for VarInside as it comes into scope
+ -- only after next block statement
+ local at = vars[0] and (vars[0] + (op == 'VarInside' and 1 or 0))
+ if op == 'Statement' then
+ for _, token in pairs(varnext) do coroutine.yield(unpack(token)) end
+ varnext = {}
+ elseif op == 'VarNext' or op == 'VarInside' then
+ table.insert(varnext, {'Var', name, lineinfo, vars, at, nobreak})
+ end
+
+ coroutine.yield(op, name, lineinfo, vars, op == 'Function' and at-1 or at, nobreak)
+ end, vars)
+ end)
+ end,
+
+ typeassigns = function(editor)
+ local maxlines = 48 -- scan up to this many lines back
+ local iscomment = editor.spec.iscomment
+ local assigns = {}
+ local endline = editor:GetCurrentLine()-1
+ local line = math.max(endline-maxlines, 0)
+
+ while (line <= endline) do
+ local ls = editor:PositionFromLine(line)
+ local tx = editor:GetLine(line) --= string
+ local s = bit.band(editor:GetStyleAt(ls + #tx:match("^%s*") + 2),31)
+
+ -- check for assignments
+ local sep = editor.spec.sep
+ local varname = "([%w_][%w_"..q(sep:sub(1,1)).."]*)"
+ local identifier = "([%w_][%w_"..q(sep).."%s]*)"
+
+ -- special hint
+ local typ, var = tx:match("%s*%-%-=%s*"..varname.."%s+"..identifier)
+ local ldoctype, ldocvar = ldoc(tx, varname)
+ if var and typ then
+ assigns[var] = typ:gsub("%s","")
+ elseif ldoctype and ldocvar then
+ assigns[ldocvar] = ldoctype
+ elseif not iscomment[s] then
+ -- real assignments
+ local var,typ = tx:match("%s*"..identifier.."%s*=%s*([^;]+)")
+
+ var = var and var:gsub("local",""):gsub("%s","")
+ -- handle `require` as a special case that returns a type that matches its parameter
+ -- (this is without deeper analysis on loaded files and should work most of the time)
+ local req = typ and typ:match("^require%s*%(?%s*['\"](.+)['\"]%s*%)?")
+ typ = req or typ
+ typ = (typ and typ
+ :gsub("%b()","")
+ :gsub("%b{}","")
+ :gsub("%b[]",".0")
+ -- replace concatenation with addition to avoid misidentifying types
+ :gsub("%.%.+","+")
+ -- remove comments; they may be in strings, but that's okay here
+ :gsub("%-%-.*",""))
+ if (typ and (typ:match(",") or typ:match("%sor%s") or typ:match("%sand%s"))) then
+ typ = nil
+ end
+ typ = typ and typ:gsub("%s","")
+ typ = typ and typ:gsub(".+", function(s)
+ return (s:find("^'[^']*'$")
+ or s:find('^"[^"]*"$')
+ or s:find('^%[=*%[.*%]=*%]$')) and 'string' or s
+ end)
+
+ -- filter out everything that is not needed
+ if typ and typ ~= 'string' -- special value for all strings
+ and (not typ:match('^'..identifier..'$') -- not an identifier
+ or typ:match('^%d') -- or a number
+ or editor.api.tip.keys[typ] -- or a keyword
+ ) then
+ typ = nil
+ end
+
+ if (var and typ) then
+ local class,func = typ:match(varname.."["..q(sep).."]"..varname)
+ if (assigns[typ] and not req) then
+ assigns[var] = assigns[typ]
+ elseif (func) then
+ local added
+ local funcnames = {"new","load","create"}
+ for _,v in ipairs(funcnames) do
+ if (func == v) then
+ assigns[var] = class
+ added = true
+ break
+ end
+ end
+ if (not added) then
+ -- let's hope autocomplete info can resolve this
+ assigns[var] = typ
+ end
+ else
+ assigns[var] = typ
+ end
+ end
+ end
+ line = line+1
+ end
+
+ return assigns
+ end,
+
+ lexerstyleconvert = {
+ text = {wxstc.wxSTC_LUA_IDENTIFIER,},
+
+ lexerdef = {wxstc.wxSTC_LUA_DEFAULT,},
+ comment = {wxstc.wxSTC_LUA_COMMENT,
+ wxstc.wxSTC_LUA_COMMENTLINE,
+ wxstc.wxSTC_LUA_COMMENTDOC,},
+ stringtxt = {wxstc.wxSTC_LUA_STRING,
+ wxstc.wxSTC_LUA_CHARACTER,
+ wxstc.wxSTC_LUA_LITERALSTRING,},
+ stringeol = {wxstc.wxSTC_LUA_STRINGEOL,},
+ preprocessor= {wxstc.wxSTC_LUA_PREPROCESSOR,},
+ operator = {wxstc.wxSTC_LUA_OPERATOR,},
+ number = {wxstc.wxSTC_LUA_NUMBER,},
+
+ keywords0 = {wxstc.wxSTC_LUA_WORD,},
+ keywords1 = {wxstc.wxSTC_LUA_WORD2,},
+ keywords2 = {wxstc.wxSTC_LUA_WORD3,},
+ keywords3 = {wxstc.wxSTC_LUA_WORD4,},
+ keywords4 = {wxstc.wxSTC_LUA_WORD5,},
+ keywords5 = {wxstc.wxSTC_LUA_WORD6,},
+ keywords6 = {wxstc.wxSTC_LUA_WORD7,},
+ keywords7 = {wxstc.wxSTC_LUA_WORD8,},
+ },
+
+ keywords = {
+ [[and break do else elseif end for function goto if in local not or repeat return then until while]],
+
+ [[_G _VERSION _ENV false io.stderr io.stdin io.stdout nil math.huge math.pi self true]],
+
+ [[assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring
+ module next pairs pcall print rawequal rawget rawlen rawset require
+ select setfenv setmetatable tonumber tostring type unpack xpcall]],
+
+ [[bit32.arshift bit32.band bit32.bnot bit32.bor bit32.btest bit32.bxor bit32.extract
+ bit32.lrotate bit32.lshift bit32.replace bit32.rrotate bit32.rshift
+ coroutine.create coroutine.resume coroutine.running coroutine.status coroutine.wrap coroutine.yield
+ coroutine.isyieldable
+ debug.debug debug.getfenv debug.gethook debug.getinfo debug.getlocal
+ debug.getmetatable debug.getregistry debug.getupvalue debug.getuservalue debug.setfenv
+ debug.sethook debug.setlocal debug.setmetatable debug.setupvalue debug.setuservalue
+ debug.traceback debug.upvalueid debug.upvaluejoin
+ io.close io.flush io.input io.lines io.open io.output io.popen io.read io.tmpfile io.type io.write
+ close flush lines read seek setvbuf write
+ math.abs math.acos math.asin math.atan math.atan2 math.ceil math.cos math.cosh math.deg math.exp
+ math.floor math.fmod math.frexp math.ldexp math.log math.log10 math.max math.min math.modf
+ math.pow math.rad math.random math.randomseed math.sin math.sinh math.sqrt math.tan math.tanh
+ math.type math.tointeger math.maxinteger math.mininteger math.ult
+ os.clock os.date os.difftime os.execute os.exit os.getenv os.remove os.rename os.setlocale os.time os.tmpname
+ package.loadlib package.searchpath package.seeall package.config
+ package.cpath package.loaded package.loaders package.path package.preload package.searchers
+ string.byte string.char string.dump string.find string.format string.gmatch string.gsub string.len
+ string.lower string.match string.rep string.reverse string.sub string.upper
+ byte find format gmatch gsub len lower match rep reverse sub upper
+ table.move, string.pack, string.unpack, string.packsize
+ table.concat table.insert table.maxn table.pack table.remove table.sort table.unpack]]
+ },
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/spec/text.lua b/love2dToAPK/tools/tools/zbstudio-win/spec/text.lua
new file mode 100644
index 0000000..c376542
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/spec/text.lua
@@ -0,0 +1,9 @@
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+return {
+ exts = {"txt"},
+ --lexer = wxstc.wxSTC_LEX_POV,
+ --apitype = "luxres",
+ linecomment = ">",
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/defs.lua b/love2dToAPK/tools/tools/zbstudio-win/src/defs.lua
new file mode 100644
index 0000000..cce1ffe
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/defs.lua
@@ -0,0 +1,332 @@
+-- About
+-- ----------------------------------------------------
+-- This file contains lua table definitons used by
+-- automatic loaded files, not part of the
+-- editor source.
+--
+-- /<app>/config.lua
+-- /cfg/user.lua
+-- /interpreters/*.lua
+-- /specs/*.lua
+-- /tools/*.lua
+-- /api/<apitype>/*.lua
+
+-- style definition
+-- ----------------------------------------------------
+-- all entries are optional
+stattr = {
+ fg = {r,g,b}, -- foreground color 0-255
+ bg = {r,g,b}, -- background color
+ i = false, -- italic
+ b = false, -- bold
+ u = false, -- underline
+ fill = true, -- fill to lineend
+ -- fn = "Lucida Console", -- font Face Name
+ -- fx = 11, -- font size
+ -- hs = true or {r,g,b}, -- turn hotspot on
+ -- use the specified color as activeForeground
+ -- use "hs = true", to turn it on without changing the color
+ -- HotspotActiveUnderline and HotspotSingleLine are on automatically
+ -- v = true, -- visibility for symbols of the current style
+}
+
+style = {
+ -- lexer specific (inherit fg/bg from text)
+ lexerdef = stattr,
+ comment = stattr,
+ stringtxt = stattr,
+ stringeol = stattr,
+ preprocessor = stattr,
+ operator = stattr,
+ number = stattr,
+
+ keywords0 = stattr,
+ keywords1 = stattr,
+ keywords2 = stattr,
+ keywords3 = stattr,
+ keywords4 = stattr,
+ keywords5 = stattr,
+ keywords6 = stattr,
+ keywords7 = stattr,
+
+ -- common (inherit fg/bg from text)
+ text = stattr,
+ linenumber = stattr,
+ bracematch = stattr,
+ bracemiss = stattr,
+ ctrlchar = stattr,
+ indent = stattr,
+ calltip = stattr,
+
+ -- common special (need custom fg & bg )
+ sel = nil,
+ caret = nil,
+ caretlinebg = nil,
+ fold = nil,
+ whitespace = nil,
+}
+
+-- config definition
+-- ----------------------------------------------------
+-- tables must exist
+-- content is optional
+-- config is loaded into existing config table
+config = {
+ path = { -- path for tools/interpreters
+ lua = "C:/lua/lua.exe", -- path to lua exe
+ },
+ editor = {
+ fontname = "Courier New", -- default font
+ fontsize = 10, -- default size
+ caretline = true, -- show active line
+ iofilter = nil, -- input/output filtering of strings
+ showfncall = true, -- use indicator to show function calls if spec allows
+ tabwidth = 4,
+ usetabs = true, -- if false then spaces are used
+ usewrap = true, -- if true then the text is wrapped in the editor
+ whitespace = false,
+ autotabs = true, -- if true test for tabs after file load,
+ -- sets "usetabs" to true for this file
+ calltipdelay = nil, -- delay to show calltip (in ms)
+ autoactivate = false, -- auto-activate/open files during debugging
+ smartindent = false, -- use smart indentation if spec allows
+ fold = true, -- enable code folding
+ foldcompact = true, -- use compact fold that includes empty lines
+ checkeol = true, -- check for eol encoding on loaded files and use it
+ -- also report mixed eol encodings
+ defaulteol = nil, -- default line-endings for new files; valid values are
+ -- wxstc.wxSTC_EOL_CRLF, wxstc.wxSTC_EOL_LF and nil (OS default)
+ nomousezoom = nil, -- disable zooming using mouse wheel
+ autoreload = nil, -- trigger auto-reload when file is updated
+ saveallonrun = nil, -- save all modified files before Run/Debug
+ indentguide = true, -- show indentation guides
+ backspaceunindent = true, -- unindent when backspace is used
+ },
+
+ default = {
+ name = 'untitled',
+ fullname = 'untitled.lua',
+ interpreter = 'luadeb',
+ },
+
+ debugger = {
+ verbose = false,
+ hostname = nil, -- hostname to use when the detected one is incorrect
+ port = nil, -- port number to use
+ runonstart = nil, -- if debugger should run immediately after starting
+ -- default values are different for different interpreters
+ redirect = nil, -- "d", "c", or "r" values for default, copy, or redirect
+ },
+
+ outputshell = { -- output and shell settings
+ fontname = "Courier New", -- default font
+ fontsize = 10, -- defult size
+ },
+
+ filetree = { -- filetree settings
+ fontname = nil, -- no default font as it is system dependent
+ fontsize = nil, -- no default size as it is system dependent
+ },
+
+ format = { -- various formatting strings
+ menurecentprojects = nil,
+ },
+
+ keymap = {}, -- mapping of menu IDs to hot keys
+ messages = {}, -- list of messages in a particular language
+ language = "en", -- current UI language
+
+ styles = {}, -- styles table as above for editor
+ stylesoutshell = {}, -- styles for output/shell
+
+ interpreter = "luadeb", -- the default "project" lua interpreter
+
+ autocomplete = true, -- whether autocomplete is on by default
+ autoanalyzer = true, -- whether auto syntax analyzer is on by default
+
+ acandtip = {
+ shorttip = false, -- tooltips are compact during typing
+ nodynwords = false, -- no dynamic words (user entered words)
+ ignorecase = false, -- ignores case when performing comparison with autocomplete list
+ symbols = true, -- include local/global symbols
+ startat = 2, -- start suggesting dynamic words after 2 characters
+ strategy = 2,
+ -- 0: is string comparison
+ -- 1: substring leading characters (camel case or _ separated)
+ -- 2: leading + any correctly ordered fragments (default)
+ width = 60, -- width of the tooltip text (in characters)
+ maxlength = 450, -- max length of the tooltip on the screen
+ },
+
+ arg = {}, -- command line arguments
+
+ savebak = false, -- if bak files are created on save
+
+ filehistorylength = 20, -- historylength for files
+
+ projecthistorylength = 15, -- historylength for project directories
+
+ singleinstance = true, -- if true creates a UDP server to run IDE once and to load files
+ singleinstanceport = 0xe493, -- UDP port for single instance communication
+
+ activateoutput = false, -- activate output/console on Run/Debug/Compile
+ unhidewindow = false, -- to unhide a gui window
+ projectautoopen = false, -- allow auto open/close files on a project switch
+ autorecoverinactivity = nil, -- period of inactivity (s) for autorecover
+ hidpi = false, -- HiDPI/Retina display support
+}
+
+-- application engine
+-- ----------------------------------------------------
+
+app = {
+ preinit = function() end, -- post spec/tool loading, but prior subsystems/ui generation
+ postinit = function() end, -- post init, prior starting mainloop
+ loadfilters = {
+ tools = function(file) return true end,
+ specs = function(file) return true end,
+ interpreters = function(file) return true end,
+ },
+ stringtable = { -- optional entries uses defaults otherwise
+ editor = nil, statuswelcome = nil,
+ -- ...
+ }
+}
+
+-- api definition
+-- ----------------------------------------------------
+-- hierarchy encoded into children
+
+api = {
+ -- global space words, e.g "table"
+ ["blah"] = {
+ -- "function", "class", "keyword", "value", "lib", "method"
+ -- method is for class:func functions
+ type = "function",
+ description = "this does something",
+
+ -- value/function/method:
+ -- for autocomplete type guessing, insert the string
+ -- that the variable name is replace with
+ -- e.g. "test = somefunc()" somefunc has valuetype of "math"
+ -- then typing "test." will be treated as "math." in
+ -- autcomplete logic
+ valuetype = "api.ClassName",
+
+ -- function:
+ args = "(blah,blubb)",
+ returns = "(foo)",
+
+ -- autogenerated post load:
+ -- concated hierarchy name (e.g. "lib.class")
+ classname = "blah",
+
+ -- children in the class hierarchy
+ childs = {
+ --.. recursive
+ }
+ },
+ ["blubb"] = {
+ --...
+ },
+}
+
+-- spec definition
+-- ----------------------------------------------------
+-- all entries are optional
+spec = {
+ exts = {"ext","ext2",},
+ -- compatible extensions
+
+ lexer = wxstc.wxSTC_LEX_LUA,
+ -- scintilla lexer
+
+ lexerstyleconvert = {
+ -- table mapping each styles to
+ -- appropriate lexer id
+ stringeol = {wxstc.wxSTC_LUA_STRINGEOL,},
+ -- ...
+ },
+
+ linecomment = "//",
+ -- string for linecomments
+
+ sep = "%.:",
+ -- class.function separator match string,
+ -- e.g in lua both . and : are allowed
+ -- default is "\1" which should yield no matches
+ -- and therefore disable class.func type autocompletion
+
+ isfncall = function(str) return from,to end,
+ -- function that detects positions for a substring that
+ -- stands for a functioncall, ie " call(..)" -> 2,5
+
+ apitype = "api",
+ -- which sub directory of "api" is relevant
+ -- api files handle autocomplete and tooltips
+ -- api won't affect syntax coloring
+
+ keywords = {
+ -- up to 8 strings containing space separated keywords
+ -- used by the lexer for coloring (NOT for autocomplete).
+ -- however each lexer supports varying amount
+ -- of keyword types
+
+ "foo bar word",
+ "more words",
+ }
+}
+
+-- tool definition
+-- ----------------------------------------------------
+-- main entries are optional
+tool = {
+ fninit = function(frame,menubar) end,
+ -- guarantees that ide is initialized
+ -- can be used for init
+ -- and adding custom menu
+
+ exec = {
+ -- quick exec action, listed under "Tools" menu
+ name = "",
+ description = "",
+ fn = function(wxfilename,projectdir) end,
+ }
+}
+
+-- debuginterface definition
+-- ----------------------------------------------------
+debuginterface = {
+ update = function(self) end, -- run in idle when active
+ close = function(self) end, -- run when closed
+
+ -- following are "debugging" actions and must return
+ -- error, running, [filePath, fileLine]
+ run = function(self) end,
+ step = function(self) end,
+ over = function(self) end,
+ out = function(self) end,
+ terminate = function(self) end,
+ breaknow = function(self) end,
+ breakpoint = function(self,file,line,state) end, -- set breakpoint state
+
+ -- returns result table if successful
+ evaluate = function(self, expressions, fnSetValues) end, -- for watches tables
+ stack = function(self) end, -- get stack information
+}
+
+-- interpreter definition-- ----------------------------------------------------
+interpreter = {
+ name = "",
+ description = "",
+ api = {"apifile_without_extension"}, -- (opt) to limit loaded lua apis
+ frun = function(self,wfilename,withdebugger) end,
+ fprojdir = function(self,wfilename) return "projpath_from_filename" end, -- (opt)
+ fattachdebug = function(self) end, -- (opt)
+ hasdebugger = false, -- if debugging is available
+ scratchextloop = nil, -- (opt) indicates scratchpad support
+ -- nil, no support for scratchpad;
+ -- false, scratchpad supported;
+ -- true, scratchpad supported and requires handling for external loop.
+ skipcompile = nil, -- don't compile before running if true
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/autocomplete.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/autocomplete.lua
new file mode 100644
index 0000000..f5bd9b9
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/autocomplete.lua
@@ -0,0 +1,652 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+local q = EscapeMagic
+
+-- api loading depends on Lua interpreter
+-- and loaded specs
+
+------------
+-- API
+
+local function newAPI(api)
+ api = api or {}
+ for i in pairs(api) do
+ api[i] = nil
+ end
+ -- tool tip info and reserved names
+ api.tip = {
+ staticnames = {},
+ keys = {},
+ finfo = {},
+ finfoclass = {},
+ shortfinfo = {},
+ shortfinfoclass = {},
+ }
+ -- autocomplete hierarchy
+ api.ac = {
+ childs = {},
+ }
+
+ return api
+end
+
+local apis = {
+ none = newAPI(),
+ lua = newAPI(),
+}
+
+function GetApi(apitype) return apis[apitype] or apis.none end
+
+----------
+-- API loading
+
+local function gennames(tab, prefix)
+ for i,v in pairs(tab) do
+ v.classname = (prefix and (prefix..".") or "")..i
+ if (v.childs) then
+ gennames(v.childs,v.classname)
+ end
+ end
+end
+
+local function addAPI(ftype, fname) -- relative to API directory
+ local env = apis[ftype] or newAPI()
+
+ local res
+ local api = ide.apis[ftype][fname]
+
+ if type(api) == 'table' then
+ res = api
+ else
+ local fn, err = loadfile(api)
+ if err then
+ DisplayOutputLn(TR("Error while loading API file: %s"):format(err))
+ return
+ end
+ local suc
+ suc, res = pcall(function() return fn(env.ac.childs) end)
+ if (not suc) then
+ DisplayOutputLn(TR("Error while processing API file: %s"):format(res))
+ return
+ end
+ -- cache the result
+ ide.apis[ftype][fname] = res
+ end
+ apis[ftype] = env
+
+ gennames(res)
+ for i,v in pairs(res) do env.ac.childs[i] = v end
+end
+
+local function loadallAPIs(only, subapis, known)
+ for ftype, v in pairs(only and {[only] = ide.apis[only]} or ide.apis) do
+ if (not known or known[ftype]) then
+ for fname in pairs(v) do
+ if (not subapis or subapis[fname]) then addAPI(ftype, fname) end
+ end
+ end
+ end
+end
+
+local function scanAPIs()
+ for _, file in ipairs(FileSysGetRecursive("api", true, "*.lua")) do
+ if not IsDirectory(file) then
+ local ftype, fname = file:match("api[/\\]([^/\\]+)[/\\](.*)%.")
+ if not ftype or not fname then
+ DisplayOutputLn(TR("The API file must be located in a subdirectory of the API directory."))
+ return
+ end
+ ide.apis[ftype] = ide.apis[ftype] or {}
+ ide.apis[ftype][fname] = file
+ end
+ end
+end
+
+---------
+-- ToolTip and reserved words list
+-- also fixes function descriptions
+
+local function fillTips(api,apibasename)
+ local apiac = api.ac
+ local tclass = api.tip
+
+ tclass.staticnames = {}
+ tclass.keys = {}
+ tclass.finfo = {}
+ tclass.finfoclass = {}
+ tclass.shortfinfo = {}
+ tclass.shortfinfoclass = {}
+
+ local staticnames = tclass.staticnames
+ local keys = tclass.keys
+ local finfo = tclass.finfo
+ local finfoclass = tclass.finfoclass
+ local shortfinfo = tclass.shortfinfo
+ local shortfinfoclass = tclass.shortfinfoclass
+
+ local function traverse (tab, libname, format)
+ if not tab.childs then return end
+ format = tab.format or format
+ for key,info in pairs(tab.childs) do
+ local fullkey = (libname ~= "" and libname.."." or "")..key
+ traverse(info, fullkey, format)
+
+ if info.type == "function" or info.type == "method" or info.type == "value" then
+ local frontname = (info.returns or "(?)").." "..fullkey.." "..(info.args or "(?)")
+ frontname = frontname:gsub("\n"," "):gsub("\t","")
+ local description = info.description or ""
+
+ -- build info
+ local inf = ((info.type == "value" and "" or frontname.."\n")
+ ..description)
+ local sentence = description:match("^(.-)%. ?\n")
+ local infshort = ((info.type == "value" and "" or frontname.."\n")
+ ..(sentence and sentence.."..." or description))
+ if type(format) == 'function' then -- apply custom formatting if requested
+ inf = format(fullkey, info, inf)
+ infshort = format(fullkey, info, infshort)
+ end
+ local infshortbatch = (info.returns and info.args) and frontname or infshort
+
+ -- add to infoclass
+ if not finfoclass[libname] then finfoclass[libname] = {} end
+ if not shortfinfoclass[libname] then shortfinfoclass[libname] = {} end
+ finfoclass[libname][key] = inf
+ shortfinfoclass[libname][key] = infshort
+
+ -- add to info
+ if not finfo[key] or #finfo[key]<200 then
+ if finfo[key] then finfo[key] = finfo[key] .. "\n\n"
+ else finfo[key] = "" end
+ finfo[key] = finfo[key] .. inf
+ elseif not finfo[key]:match("\n %(%.%.%.%)$") then
+ finfo[key] = finfo[key].."\n (...)"
+ end
+
+ -- add to shortinfo
+ if not shortfinfo[key] or #shortfinfo[key]<200 then
+ if shortfinfo[key] then shortfinfo[key] = shortfinfo[key] .. "\n"
+ else shortfinfo[key] = "" end
+ shortfinfo[key] = shortfinfo[key] .. infshortbatch
+ elseif not shortfinfo[key]:match("\n %(%.%.%.%)$") then
+ shortfinfo[key] = shortfinfo[key].."\n (...)"
+ end
+ end
+ if info.type == "keyword" then
+ keys[key] = true
+ end
+ staticnames[key] = true
+ end
+ end
+ traverse(apiac,apibasename)
+end
+
+local function generateAPIInfo(only)
+ for i,api in pairs(apis) do
+ if ((not only) or i == only) then
+ fillTips(api,"")
+ end
+ end
+end
+
+local function updateAssignCache(editor)
+ if (editor.spec.typeassigns and not editor.assignscache) then
+ local assigns = editor.spec.typeassigns(editor)
+ editor.assignscache = {
+ assigns = assigns,
+ line = editor:GetCurrentLine(),
+ }
+ end
+end
+
+-- assumes a tidied up string (no spaces, braces..)
+local function resolveAssign(editor,tx)
+ local ac = editor.api.ac
+ local sep = editor.spec.sep
+ local anysep = "["..q(sep).."]"
+ local assigns = editor.assignscache and editor.assignscache.assigns
+ local function getclass(tab,a)
+ local key,rest = a:match("([%w_]+)"..anysep.."(.*)")
+ key = tonumber(key) or key -- make this work for childs[0]
+ if (key and rest and tab.childs and tab.childs[key]) then
+ return getclass(tab.childs[key],rest)
+ end
+ -- process valuetype, but only if it doesn't reference the current tab
+ if (tab.valuetype and tab ~= ac.childs[tab.valuetype]) then
+ return getclass(ac,tab.valuetype..sep:sub(1,1)..a)
+ end
+ return tab,a
+ end
+
+ local c
+ if (assigns) then
+ -- find assign
+ local change, n, refs, stopat = true, 0, {}, os.clock() + 0.2
+ while (change) do
+ -- abort the check if the auto-complete is taking too long
+ if n > 50 and os.clock() > stopat then
+ if ide.config.acandtip.warning then
+ DisplayOutputLn("Warning: Auto-complete was aborted after taking too long to complete."
+ .. " Please report this warning along with the text you were typing to support@zerobrane.com.")
+ end
+ break
+ else
+ n = n + 1
+ end
+
+ local classname = nil
+ c = ""
+ change = false
+ for w,s in tx:gmatch("([%w_]+)("..anysep.."?)") do
+ local old = classname
+ -- check if what we have so far can be matched with a class name
+ -- this can happen if it's a reference to a value with a known type
+ classname = classname or assigns[c..w]
+ if (s ~= "" and old ~= classname) then
+ -- continue checking unless this can lead to recursive substitution
+ change = not classname:find("^"..w) and not classname:find("^"..c..w)
+ c = classname..s
+ else
+ c = c..w..s
+ end
+ end
+ -- check for loops in type assignment
+ if refs[tx] then break end
+ refs[tx] = c
+ tx = c
+ -- if there is any class duplication, abort the loop
+ if classname and select(2, c:gsub(classname, classname)) > 1 then break end
+ end
+ else
+ c = tx
+ end
+
+ -- then work from api
+ return getclass(ac,c)
+end
+
+function GetTipInfo(editor, content, short, fullmatch)
+ if not content then return end
+
+ updateAssignCache(editor)
+
+ -- try to resolve the class
+ content = content:gsub("%b[]",".0")
+ local tab = resolveAssign(editor, content)
+ local sep = editor.spec.sep
+ local anysep = "["..q(sep).."]"
+
+ local caller = content:match("([%w_]+)%(?%s*$")
+ local class = (tab and tab.classname
+ or caller and content:match("([%w_]+)"..anysep..caller.."%(?%s*$") or "")
+ local tip = editor.api.tip
+
+ local classtab = short and tip.shortfinfoclass or tip.finfoclass
+ local funcstab = short and tip.shortfinfo or tip.finfo
+
+ if (editor.assignscache and not (class and classtab[class])) then
+ local assigns = editor.assignscache.assigns
+ class = assigns and assigns[class] or class
+ end
+
+ local res = (caller and (class and classtab[class]) and classtab[class][caller]
+ or (not fullmatch and funcstab[caller] or nil))
+ -- some values may not have descriptions (for example, true/false);
+ -- don't return empty strings as they are displayed as empty tooltips.
+ return res and #res > 0 and res or nil
+end
+
+local function reloadAPI(only,subapis)
+ newAPI(apis[only])
+ loadallAPIs(only,subapis)
+ generateAPIInfo(only)
+end
+
+function ReloadLuaAPI()
+ local interp = ide.interpreter
+ local cfgapi = ide.config.api
+ local fname = interp and interp.fname
+ local intapi = cfgapi and fname and cfgapi[fname]
+ local apinames = {}
+ -- general APIs as configured
+ for _, v in ipairs(type(cfgapi) == 'table' and cfgapi or {}) do apinames[v] = true end
+ -- interpreter-specific APIs as configured
+ for _, v in ipairs(type(intapi) == 'table' and intapi or {}) do apinames[v] = true end
+ -- interpreter APIs
+ for _, v in ipairs(interp and interp.api or {}) do apinames[v] = true end
+ reloadAPI("lua",apinames)
+end
+
+do
+ local known = {}
+ for _, spec in pairs(ide.specs) do
+ if (spec.apitype) then
+ known[spec.apitype] = true
+ end
+ end
+ -- by defaul load every known api except lua
+ known.lua = false
+
+ scanAPIs()
+ loadallAPIs(nil,nil,known)
+ generateAPIInfo()
+end
+
+-------------
+-- Dynamic Words
+
+local dywordentries = {}
+local dynamicwords = {}
+
+local function addDynamicWord (api,word)
+ if api.tip.keys[word] or api.tip.staticnames[word] then return end
+ local cnt = dywordentries[word]
+ if cnt then
+ dywordentries[word] = cnt + 1
+ return
+ end
+ dywordentries[word] = 1
+ local wlow = word:lower()
+ for i=0,#word do
+ local k = wlow:sub(1,i)
+ dynamicwords[k] = dynamicwords[k] or {}
+ table.insert(dynamicwords[k], word)
+ end
+end
+local function removeDynamicWord (api,word)
+ if api.tip.keys[word] or api.tip.staticnames[word] then return end
+ local cnt = dywordentries[word]
+ if not cnt then return end
+
+ if (cnt == 1) then
+ dywordentries[word] = nil
+ for i=0,#word do
+ local wlow = word:lower()
+ local k = wlow : sub (1,i)
+ local page = dynamicwords[k]
+ if page then
+ local cnt = #page
+ for n=1,cnt do
+ if page[n] == word then
+ if cnt == 1 then
+ dynamicwords[k] = nil
+ else
+ table.remove(page,n)
+ end
+ break
+ end
+ end
+ end
+ end
+ else
+ dywordentries[word] = cnt - 1
+ end
+end
+function DynamicWordsReset ()
+ dywordentries = {}
+ dynamicwords = {}
+end
+
+local function getEditorLines(editor,line,numlines)
+ return editor:GetTextRangeDyn(
+ editor:PositionFromLine(line),editor:PositionFromLine(line+numlines+1))
+end
+
+function DynamicWordsAdd(editor,content,line,numlines)
+ if ide.config.acandtip.nodynwords then return end
+ local api = editor.api
+ local anysep = "["..q(editor.spec.sep).."]"
+ content = content or getEditorLines(editor,line,numlines)
+ for word in content:gmatch(anysep.."?%s*([a-zA-Z_]+[a-zA-Z_0-9]+)") do
+ addDynamicWord(api,word)
+ end
+end
+
+function DynamicWordsRem(editor,content,line,numlines)
+ if ide.config.acandtip.nodynwords then return end
+ local api = editor.api
+ local anysep = "["..q(editor.spec.sep).."]"
+ content = content or getEditorLines(editor,line,numlines)
+ for word in content:gmatch(anysep.."?%s*([a-zA-Z_]+[a-zA-Z_0-9]+)") do
+ removeDynamicWord(api,word)
+ end
+end
+
+function DynamicWordsRemoveAll(editor)
+ if ide.config.acandtip.nodynwords then return end
+ DynamicWordsRem(editor,editor:GetTextDyn())
+end
+
+------------
+-- Final Autocomplete
+
+local cachemain = {}
+local cachemethod = {}
+local laststrategy
+local function getAutoCompApiList(childs,fragment,method)
+ fragment = fragment:lower()
+ local strategy = ide.config.acandtip.strategy
+ if (laststrategy ~= strategy) then
+ cachemain = {}
+ cachemethod = {}
+ laststrategy = strategy
+ end
+
+ local cache = method and cachemethod or cachemain
+
+ if (strategy == 2) then
+ local wlist = cache[childs]
+ if not wlist then
+ wlist = " "
+ for i,v in pairs(childs) do
+ -- in some cases (tip.finfo), v may be a string; check for that first.
+ -- if a:b typed, then value (type == "value") not allowed
+ -- if a.b typed, then method (type == "method") not allowed
+ if type(v) ~= 'table' or (v.type and
+ ((method and v.type ~= "value")
+ or (not method and v.type ~= "method"))) then
+ wlist = wlist..i.." "
+ end
+ end
+ cache[childs] = wlist
+ end
+ local ret = {}
+ local g = string.gmatch
+ local pat = fragment ~= "" and ("%s("..fragment:gsub(".",
+ function(c)
+ local l = c:lower()..c:upper()
+ return "["..l.."][%w_]*"
+ end)..")") or "([%w_]+)"
+ pat = pat:gsub("%s","")
+ for c in g(wlist,pat) do
+ table.insert(ret,c)
+ end
+
+ return ret
+ end
+
+ if cache[childs] and cache[childs][fragment] then
+ return cache[childs][fragment]
+ end
+
+ local t = {}
+ cache[childs] = t
+
+ local sub = strategy == 1
+ for key,v in pairs(childs) do
+ -- in some cases (tip.finfo), v may be a string; check for that first.
+ -- if a:b typed, then value (type == "value") not allowed
+ -- if a.b typed, then method (type == "method") not allowed
+ if type(v) ~= 'table' or (v.type and
+ ((method and v.type ~= "value")
+ or (not method and v.type ~= "method"))) then
+ local used = {}
+ local kl = key:lower()
+ for i=0,#key do
+ local k = kl:sub(1,i)
+ t[k] = t[k] or {}
+ used[k] = true
+ table.insert(t[k],key)
+ end
+ if (sub) then
+ -- find camel case / _ separated subwords
+ -- glfwGetGammaRamp -> g, gg, ggr
+ -- GL_POINT_SPRIT -> g, gp, gps
+ local last = ""
+ for ks in string.gmatch(key,"([A-Z%d]*[a-z%d]*_?)") do
+ local k = last..(ks:sub(1,1):lower())
+ last = k
+
+ t[k] = t[k] or {}
+ if (not used[k]) then
+ used[k] = true
+ table.insert(t[k],key)
+ end
+ end
+ end
+ end
+ end
+
+ return t
+end
+
+function CreateAutoCompList(editor,key,pos)
+ local api = editor.api
+ local tip = api.tip
+ local ac = api.ac
+ local sep = editor.spec.sep
+
+ local method = key:match(":[^"..q(sep).."]*$") ~= nil
+
+ -- ignore keywords
+ if tip.keys[key] then return end
+
+ updateAssignCache(editor)
+
+ local tab,rest = resolveAssign(editor,key)
+ local progress = tab and tab.childs
+ ide:SetStatusFor(progress and tab.classname and ("Auto-completing '%s'..."):format(tab.classname) or "")
+ if not progress then return end
+
+ if (tab == ac) then
+ local _, krest = rest:match("([%w_]+)["..q(sep).."]([%w_]*)%s*$")
+ if (krest) then
+ tab = #krest >= (ide.config.acandtip.startat or 2) and tip.finfo or {}
+ rest = krest:gsub("[^%w_]","")
+ else
+ rest = rest:gsub("[^%w_]","")
+ end
+ else
+ rest = rest:gsub("[^%w_]","")
+ end
+
+ -- list from api
+ local apilist = getAutoCompApiList(tab.childs or tab,rest,method)
+
+ local function addInheritance(tab, apilist, seen)
+ if not tab.inherits then return end
+ for base in tab.inherits:gmatch("[%w_"..q(sep).."]+") do
+ local tab = ac
+ -- map "a.b.c" to class hierarchy (a.b.c)
+ for class in base:gmatch("[%w_]+") do tab = tab.childs[class] end
+
+ if tab and not seen[tab] then
+ seen[tab] = true
+ for _,v in pairs(getAutoCompApiList(tab.childs,rest,method)) do
+ table.insert(apilist, v)
+ end
+ addInheritance(tab, apilist, seen)
+ end
+ end
+ end
+
+ -- handle (multiple) inheritance; add matches from the parent class/lib
+ addInheritance(tab, apilist, {[tab] = true})
+
+ -- include local/global variables
+ if ide.config.acandtip.symbols and not key:find(q(sep)) then
+ local vars, context = {}
+ local tokens = editor:GetTokenList()
+ for _, token in ipairs(tokens) do
+ if token.fpos and pos and token.fpos > pos then break end
+ if token[1] == 'Id' or token[1] == 'Var' then
+ local var = token.name
+ if var:find(key, 1, true) == 1
+ -- skip the variable formed by what's being typed
+ and (not token.fpos or not pos or token.fpos < pos-#key) then
+ -- if it's a global variable, store in the auto-complete list,
+ -- but if it's local, store separately as it needs to be checked
+ table.insert(token.context[var] and vars or apilist, var)
+ end
+ context = token.context
+ end
+ end
+ for _, var in pairs(context and vars or {}) do
+ if context[var] then table.insert(apilist, var) end
+ end
+ end
+
+ -- include dynamic words
+ local last = key:match("([%w_]+)%s*$")
+ if (last and #last >= (ide.config.acandtip.startat or 2)) then
+ last = last:lower()
+ for i,v in ipairs(dynamicwords[last] or {}) do
+ -- ignore if word == last and sole user
+ if (v:lower() == last and dywordentries[v] == 1) then break end
+ table.insert(apilist, v)
+ end
+ end
+
+ local li
+ if apilist then
+ if (#rest > 0) then
+ local strategy = ide.config.acandtip.strategy
+
+ if (strategy == 2 and #apilist < 128) then
+ -- when matching "ret": "ret." < "re.t" < "r.et"
+ local patany = rest:gsub(".", function(c) return "["..c:lower()..c:upper().."](.-)" end)
+ local patcase = rest:gsub(".", function(c) return c.."(.-)" end)
+ local weights = {}
+ local penalty = 0.1
+ local function weight(str)
+ if not weights[str] then
+ local w = 0
+ str:gsub(patany,function(...)
+ local l = {...}
+ -- penalize gaps between matches, more so at the beginning
+ for n, v in ipairs(l) do w = w + #v * (1 + (#l-n)*penalty) end
+ end)
+ weights[str] = w + (str:find(patcase) and 0 or penalty)
+ end
+ return weights[str]
+ end
+ table.sort(apilist,function(a,b)
+ local ma, mb = weight(a), weight(b)
+ if (ma == mb) then return a:lower()<b:lower() end
+ return ma<mb
+ end)
+ else
+ table.sort(apilist,function(a,b)
+ local ma,mb = a:sub(1,#rest)==rest, b:sub(1,#rest)==rest
+ if (ma and mb) or (not ma and not mb) then return a<b end
+ return ma
+ end)
+ end
+ else
+ table.sort(apilist)
+ end
+
+ local prev = apilist[#apilist]
+ for i = #apilist-1,1,-1 do
+ if prev == apilist[i] then
+ table.remove(apilist, i+1)
+ else prev = apilist[i] end
+ end
+
+ li = table.concat(apilist," ")
+ end
+ return li and #li > 1024 and li:sub(1,1024).."..." or li
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/commandbar.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/commandbar.lua
new file mode 100644
index 0000000..26de6fd
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/commandbar.lua
@@ -0,0 +1,359 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+---------------------------------------------------------
+
+local unpack = table.unpack or unpack
+local maxlines = 8
+local row_height = 46
+
+function CommandBarShow(params)
+ local onDone, onUpdate, onItem, onSelection, defaultText, selectedText =
+ params.onDone, params.onUpdate, params.onItem, params.onSelection,
+ params.defaultText, params.selectedText
+ local row_width = ide.config.commandbar.width or 0
+ if row_width < 1 then
+ row_width = math.max(450, math.floor(row_width * ide:GetMainFrame():GetClientSize():GetWidth()))
+ end
+
+ local lines = {}
+ local linesnow = #lines
+ local linenow = 0
+
+ local nb = ide:GetEditorNotebook()
+ local pos = nb:GetScreenPosition()
+ if pos then
+ local miny
+ for p = 0, nb:GetPageCount()-1 do
+ local y = nb:GetPage(p):GetScreenPosition():GetY()
+ -- just in case, compare with the position of the notebook itself;
+ -- this is needed because the tabs that haven't been refreshed yet
+ -- may report 0 as their screen position on Linux, which is incorrect.
+ if y > pos:GetY() and (not miny or y < miny) then miny = y end
+ end
+ pos:SetX(pos:GetX()+nb:GetClientSize():GetWidth()-row_width-16)
+ pos:SetY((miny or pos:GetY())+2)
+ else
+ pos = wx.wxDefaultPosition
+ end
+
+ local frame = wx.wxFrame(ide:GetMainFrame(), wx.wxID_ANY, "Command Bar",
+ pos, wx.wxDefaultSize,
+ wx.wxFRAME_NO_TASKBAR + wx.wxFRAME_FLOAT_ON_PARENT + wx.wxNO_BORDER)
+ local panel = wx.wxPanel(frame or ide:GetMainFrame(), wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxDefaultSize, wx.wxFULL_REPAINT_ON_RESIZE)
+ local search = wx.wxTextCtrl(panel, wx.wxID_ANY, "\1",
+ wx.wxDefaultPosition,
+ -- make the text control a bit smaller on OSX
+ wx.wxSize(row_width, ide.osname == 'Macintosh' and 20 or 24),
+ wx.wxTE_PROCESS_ENTER + wx.wxTE_PROCESS_TAB + wx.wxNO_BORDER)
+ local results = wx.wxScrolledWindow(panel, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxSize(0, 0))
+
+ local style, styledef = ide.config.styles, StylesGetDefault()
+ local textcolor = wx.wxColour(unpack(style.text.fg or styledef.text.fg))
+ local backcolor = wx.wxColour(unpack(style.text.bg or styledef.text.bg))
+ local selcolor = wx.wxColour(unpack(style.caretlinebg.bg or styledef.caretlinebg.bg))
+ local pancolor = ide:GetUIManager():GetArtProvider():GetColor(wxaui.wxAUI_DOCKART_SASH_COLOUR)
+ local borcolor = ide:GetUIManager():GetArtProvider():GetColor(wxaui.wxAUI_DOCKART_BORDER_COLOUR)
+
+ search:SetBackgroundColour(backcolor)
+ search:SetForegroundColour(textcolor)
+
+ local nbrush = wx.wxBrush(backcolor, wx.wxSOLID)
+ local sbrush = wx.wxBrush(selcolor, wx.wxSOLID)
+ local bbrush = wx.wxBrush(pancolor, wx.wxSOLID)
+ local lpen = wx.wxPen(borcolor, 1, wx.wxDOT)
+ local bpen = wx.wxPen(borcolor, 1, wx.wxSOLID)
+
+ local sash = ide:GetUIManager():GetArtProvider():GetMetric(wxaui.wxAUI_DOCKART_SASH_SIZE)
+ local border = sash + 2
+ local hoffset = 4
+ local voffset = 4
+
+ local topSizer = wx.wxFlexGridSizer(2, 1, -border*2, 0)
+ topSizer:SetFlexibleDirection(wx.wxVERTICAL)
+ topSizer:AddGrowableRow(1, 1)
+ topSizer:Add(search, wx.wxSizerFlags(0):Expand():Border(wx.wxALL, border))
+ topSizer:Add(results, wx.wxSizerFlags(1):Expand():Border(wx.wxALL, border))
+ panel:SetSizer(topSizer)
+ topSizer:Fit(frame) -- fit the frame/panel around the controls
+
+ local minheight = frame:GetClientSize():GetHeight()
+
+ local tfont = ide:GetProjectTree():GetFont()
+ local ffont = (ide:GetEditor() or ide:CreateBareEditor()):GetFont()
+ ffont:SetPointSize(ffont:GetPointSize()+2)
+ local sfont = wx.wxFont(tfont)
+ tfont:SetPointSize(tfont:GetPointSize()+2)
+ search:SetFont(tfont)
+
+ -- make a one-time callback;
+ -- needed because KILL_FOCUS handler can be called after closing window
+ local function onExit(index)
+ onExit = function() end
+ onDone(index and lines[index], index, search:GetValue())
+ frame:Close()
+ end
+
+ local function onPaint(event)
+ -- adjust the scrollbar before working with the canvas
+ local _, starty = results:GetViewStart()
+ if #lines ~= linesnow then
+ -- adjust the starting line when the current line is the last one
+ if linenow > starty+maxlines then starty = starty + 1 end
+ results:SetScrollbars(1, row_height, 1, #lines, 0, starty*row_height, false)
+ linesnow = #lines
+ end
+
+ local dc = wx.wxMemoryDC(results)
+ results:PrepareDC(dc)
+
+ local size = results:GetVirtualSize()
+ local w,h = size:GetWidth(),size:GetHeight()
+ local bitmap = wx.wxBitmap(w,h)
+ dc:SelectObject(bitmap)
+
+ -- clear the background
+ dc:SetBackground(nbrush)
+ dc:Clear()
+
+ dc:SetTextForeground(textcolor)
+ dc:SetBrush(sbrush)
+ for r = 1, #lines do
+ if r == linenow then
+ dc:SetPen(wx.wxTRANSPARENT_PEN)
+ dc:DrawRectangle(0, row_height*(r-1), row_width, row_height+1)
+ end
+ dc:SetPen(lpen)
+ dc:DrawLine(hoffset, row_height*(r-1), row_width-hoffset*2, row_height*(r-1))
+
+ local fline, sline = onItem(lines[r])
+ if fline then
+ dc:SetFont(ffont)
+ dc:DrawText(fline, hoffset, row_height*(r-1)+voffset)
+ end
+ if sline then
+ dc:SetFont(sfont)
+ dc:DrawText(sline, hoffset, row_height*(r-1)+row_height/2+voffset)
+ end
+ end
+
+ dc:SetPen(wx.wxNullPen)
+ dc:SetBrush(wx.wxNullBrush)
+ dc:SelectObject(wx.wxNullBitmap)
+ dc:delete()
+
+ dc = wx.wxPaintDC(results)
+ dc:DrawBitmap(bitmap, 0, 0, true)
+ dc:delete()
+ end
+
+ local function onPanelPaint(event)
+ local dc = wx.wxBufferedPaintDC(panel)
+ dc:SetBrush(bbrush)
+ dc:SetPen(bpen)
+
+ local psize = panel:GetClientSize()
+ dc:DrawRectangle(0, 0, psize:GetWidth(), psize:GetHeight())
+ dc:DrawRectangle(sash+1, sash+1, psize:GetWidth()-2*(sash+1), psize:GetHeight()-2*(sash+1))
+
+ dc:SetPen(wx.wxNullPen)
+ dc:SetBrush(wx.wxNullBrush)
+ dc:delete()
+ end
+
+ local linewas -- line that was reported when updated
+ local function onTextUpdated(event)
+ local text = search:GetValue()
+ lines = onUpdate(text)
+ linenow = #text > 0 and #lines > 0 and 1 or 0
+ linewas = nil
+
+ local size = frame:GetClientSize()
+ local height = minheight + row_height*math.min(maxlines,#lines)
+ if height ~= size:GetHeight() then
+ results:SetScrollbars(1, 1, 1, 1, 0, 0, false)
+ size:SetHeight(height)
+ frame:SetClientSize(size)
+ end
+
+ results:Refresh()
+ end
+
+ local function onKeyDown(event)
+ local keycode = event:GetKeyCode()
+ if keycode == wx.WXK_RETURN then
+ onExit(linenow)
+ return
+ elseif event:GetModifiers() ~= wx.wxMOD_NONE then
+ event:Skip()
+ return
+ elseif keycode == wx.WXK_UP then
+ if linesnow > 0 then
+ linenow = linenow - 1
+ if linenow <= 0 then linenow = linesnow end
+ end
+ elseif keycode == wx.WXK_DOWN then
+ if linesnow > 0 then
+ linenow = linenow % linesnow + 1
+ end
+ elseif keycode == wx.WXK_PAGEDOWN then
+ if linesnow > 0 then
+ linenow = linenow + maxlines
+ if linenow > linesnow then linenow = linesnow end
+ end
+ elseif keycode == wx.WXK_PAGEUP then
+ if linesnow > 0 then
+ linenow = linenow - maxlines
+ if linenow <= 0 then linenow = 1 end
+ end
+ elseif keycode == wx.WXK_ESCAPE then
+ onExit(false)
+ return
+ else
+ event:Skip()
+ return
+ end
+
+ local _, starty = results:GetViewStart()
+ if linenow < starty+1 then results:Scroll(-1, linenow-1)
+ elseif linenow > starty+maxlines then results:Scroll(-1, linenow-maxlines) end
+ results:Refresh()
+ end
+
+ local function onMouseLeftDown(event)
+ local pos = event:GetPosition()
+ local _, y = results:CalcUnscrolledPosition(pos.x, pos.y)
+ onExit(math.floor(y / row_height)+1)
+ end
+
+ local function onIdle(event)
+ if linewas == linenow then return end
+ linewas = linenow
+ if linenow == 0 then return end
+
+ -- save the selection/insertion point as it's reset on Linux (wxwidgets 2.9.5)
+ local ip = search:GetInsertionPoint()
+ local f, t = search:GetSelection()
+
+ -- this may set focus to a different object/tab,
+ -- so disable the focus event and then set the focus back
+ search:SetEvtHandlerEnabled(false)
+ onSelection(lines[linenow], search:GetValue())
+ search:SetFocus()
+ search:SetEvtHandlerEnabled(true)
+ if ide.osname == 'Unix' then
+ search:SetInsertionPoint(ip)
+ search:SetSelection(f, t)
+ end
+ end
+
+ frame:Connect(wx.wxEVT_CLOSE_WINDOW, function() frame:Destroy() end)
+
+ panel:Connect(wx.wxEVT_PAINT, onPanelPaint)
+ panel:Connect(wx.wxEVT_ERASE_BACKGROUND, function() end)
+ panel:Connect(wx.wxEVT_IDLE, onIdle)
+
+ results:Connect(wx.wxEVT_PAINT, onPaint)
+ results:Connect(wx.wxEVT_LEFT_DOWN, onMouseLeftDown)
+ results:Connect(wx.wxEVT_ERASE_BACKGROUND, function() end)
+
+ search:SetFocus()
+ search:Connect(wx.wxEVT_KEY_DOWN, onKeyDown)
+ search:Connect(wx.wxEVT_COMMAND_TEXT_UPDATED, onTextUpdated)
+ search:Connect(wx.wxEVT_COMMAND_TEXT_ENTER, function() onExit(linenow) end)
+ search:Connect(wx.wxEVT_KILL_FOCUS, function() onExit() end)
+
+ frame:Show(true)
+ frame:Update()
+ frame:Refresh()
+
+ search:SetValue((defaultText or "")..(selectedText or ""))
+ search:SetSelection(#(defaultText or ""), -1)
+end
+
+local sep = "[/\\%-_ ]+"
+local weights = {onegram = 0.1, digram = 0.4, trigram = 0.5}
+local cache = {}
+local missing = 3 -- penalty for missing symbols (1 missing == N matching)
+local casemismatch = 0.9 -- score for case mismatch (%% of full match)
+local function score(p, v)
+ local function ngrams(str, num, low, needcache)
+ local key = str..'\1'..num
+ if cache[key] then return unpack(cache[key]) end
+
+ local t, l, p = {}, {}, 0
+ for i = 1, #str-num+1 do
+ local pair = str:sub(i, i+num-1)
+ p = p + (t[pair] and 0 or 1)
+ if low and pair:find('%u') then l[pair:lower()] = casemismatch end
+ t[pair] = 1
+ end
+ if needcache then cache[key] = {t, p, l} end
+ return t, p, l
+ end
+
+ local function overlap(pattern, value, num)
+ local ph, ps = ngrams(pattern, num, false, true)
+ local vh, vs, vl = ngrams(value, num, true)
+ if ps + vs == 0 then return 0 end
+
+ local is = 0 -- intersection of two sets of ngrams
+ for k in pairs(ph) do is = is + (vh[k] or vl[k:lower()] or 0) end
+ return is / (ps + vs) - (num == 1 and missing * (ps - is) / (ps + vs) or 0)
+ end
+
+ local key = p..'\2'..v
+ if not cache[key] then
+ local score = weights.onegram * overlap(p, v, 1)
+ if score > 0 then -- don't bother with those that can't even score 1grams
+ p = ' '..(p:gsub(sep, ' '))
+ v = ' '..(v:gsub(sep, ' '))
+ score = score + weights.digram * overlap(p, v, 2)
+ score = score + weights.trigram * overlap(' '..p, ' '..v, 3)
+ end
+ cache[key] = 2 * 100 * score
+ end
+ return cache[key]
+end
+
+function CommandBarScoreItems(t, pattern, limit)
+ local r, plen = {}, #pattern
+ local maxp = 0
+ local num = 0
+ local prefilter = ide.config.commandbar and ide.config.commandbar.prefilter
+ -- anchor for 1-2 symbol patterns to speed up search
+ local needanchor = prefilter and prefilter * 4 <= #t and plen <= 2
+ local filter = prefilter and prefilter <= #t
+ -- expand `abc` into `a.*b.*c`, but limit the prefix to avoid penalty for `s.*s.*s.*....`
+ and pattern:gsub("[^%w_]+",""):sub(1,4):lower():gsub(".", "%1.*"):gsub("%.%*$","")
+ or nil
+ for _, v in ipairs(t) do
+ if #v >= plen then
+ local match = filter and v:lower():find(filter)
+ -- check if the current name needs to be prefiltered or anchored (for better performance);
+ -- if it needs to be anchored, then anchor it at the beginning of the string or the word
+ if not filter or (match and (not needanchor or match == 1 or v:find("^[%p%s]", match-1))) then
+ local p = score(pattern, v)
+ maxp = math.max(p, maxp)
+ if p > 1 and p > maxp / 4 then
+ num = num + 1
+ r[num] = {v, p}
+ end
+ end
+ end
+ end
+ table.sort(r, function(a, b) return a[2] > b[2] end)
+ -- limit the list to be displayed
+ -- `r[limit+1] = nil` is not desired as the resulting table may be sorted incorrectly
+ if tonumber(limit) and limit < #r then
+ local tmp = r
+ r = {}
+ for i = 1, limit do r[i] = tmp[i] end
+ end
+ return r
+end
+
+ide:AddPackage('core.commandbar', {
+ -- reset ngram cache when switching projects to conserve memory
+ onProjectLoad = function() cache = {} end
+ })
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/commands.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/commands.lua
new file mode 100644
index 0000000..8695659
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/commands.lua
@@ -0,0 +1,1054 @@
+-- Copyright 2011-14 Paul Kulchenko, ZeroBrane LLC
+-- authors: Lomtik Software (J. Winwood & John Labenski)
+-- Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+local frame = ide.frame
+local notebook = frame.notebook
+local openDocuments = ide.openDocuments
+local uimgr = frame.uimgr
+local unpack = table.unpack or unpack
+
+local CURRENT_LINE_MARKER = StylesGetMarker("currentline")
+local CURRENT_LINE_MARKER_VALUE = 2^CURRENT_LINE_MARKER
+
+function NewFile(filename)
+ filename = filename or ide.config.default.fullname
+ local editor = CreateEditor()
+ editor:SetupKeywords(GetFileExt(filename))
+ local doc = AddEditor(editor, filename)
+ if doc then
+ PackageEventHandle("onEditorNew", editor)
+ SetEditorSelection(doc.index)
+ end
+ return editor
+end
+
+-- Find an editor page that hasn't been used at all, eg. an untouched NewFile()
+local function findUnusedEditor()
+ local editor
+ for _, document in pairs(openDocuments) do
+ if (document.editor:GetLength() == 0) and
+ (not document.isModified) and (not document.filePath) and
+ not (document.editor:GetReadOnly() == true) then
+ editor = document.editor
+ break
+ end
+ end
+ return editor
+end
+
+function LoadFile(filePath, editor, file_must_exist, skipselection)
+ filePath = filePath:gsub("%s+$","")
+ filePath = wx.wxFileName(filePath)
+ filePath:Normalize() -- make it absolute and remove all .. and . if possible
+ filePath = filePath:GetFullPath()
+
+ -- if the file name is empty or is a directory, don't do anything
+ if filePath == '' or wx.wxDirExists(filePath) then return nil end
+
+ -- prevent files from being reopened again
+ if (not editor) then
+ local doc = ide:FindDocument(filePath)
+ if doc then
+ if not skipselection and doc.index ~= notebook:GetSelection() then
+ -- selecting the same tab doesn't trigger PAGE_CHANGE event,
+ -- but moves the focus to the tab bar, which needs to be avoided.
+ notebook:SetSelection(doc.index)
+ end
+ return doc.editor
+ end
+ end
+
+ local filesize = FileSize(filePath)
+ if not filesize and file_must_exist then return nil end
+
+ local current = editor and editor:GetCurrentPos()
+ editor = editor or findUnusedEditor() or CreateEditor()
+ editor:Freeze()
+ editor:SetupKeywords(GetFileExt(filePath))
+ editor:MarkerDeleteAll(-1)
+ if filesize then editor:Allocate(filesize) end
+ editor:SetTextDyn("")
+ editor.bom = string.char(0xEF,0xBB,0xBF)
+
+ local inputfilter = GetConfigIOFilter("input")
+ local file_text
+ ide:PushStatus("")
+ FileRead(filePath, 1024*1024, function(s)
+ if not file_text then
+ -- remove BOM from UTF-8 encoded files; store BOM to add back when saving
+ if s and editor:GetCodePage() == wxstc.wxSTC_CP_UTF8 and s:find("^"..editor.bom) then
+ s = s:gsub("^"..editor.bom, "")
+ else
+ -- set to 'false' as checks for nil on wxlua objects may fail at run-time
+ editor.bom = false
+ end
+ file_text = s
+ end
+ if inputfilter then s = inputfilter(filePath, s) end
+ local expected = editor:GetLength() + #s
+ editor:AppendTextDyn(s)
+ -- if the length is not as expected, then either it's a binary file or invalid UTF8
+ if editor:GetLength() ~= expected then
+ -- skip binary files with unknown extensions as they may have any sequences
+ -- when using Raw methods, this can only happen for binary files (that include \0 chars)
+ if editor.useraw or editor.spec == ide.specs.none and IsBinary(s) then
+ DisplayOutputLn(("%s: %s"):format(filePath,
+ TR("Binary file is shown as read-only as it is only partially loaded.")))
+ file_text = ''
+ editor:SetReadOnly(true)
+ return false
+ end
+
+ -- handle invalid UTF8 characters
+ -- fix: doesn't handle characters split by callback buffer
+ local replacement, invalid = "\022"
+ s, invalid = FixUTF8(s, replacement)
+ if #invalid > 0 then
+ editor:AppendTextDyn(s)
+ local lastline = nil
+ for _, n in ipairs(invalid) do
+ local line = editor:LineFromPosition(n)
+ if line ~= lastline then
+ DisplayOutputLn(("%s:%d: %s"):format(filePath, line+1,
+ TR("Replaced an invalid UTF8 character with %s."):format(replacement)))
+ lastline = line
+ end
+ end
+ end
+ end
+ if filesize and filesize > 0 then
+ ide:PopStatus()
+ ide:PushStatus(TR("%s%% loaded..."):format(math.floor(100*editor:GetLength()/filesize)))
+ end
+ end)
+ ide:PopStatus()
+
+ editor:Colourise(0, -1)
+ editor:ResetTokenList() -- reset list of tokens if this is a reused editor
+ editor:Thaw()
+
+ local edcfg = ide.config.editor
+ if current then editor:GotoPos(current) end
+ if (file_text and edcfg.autotabs) then
+ -- use tabs if they are already used
+ -- or if "usetabs" is set and no space indentation is used in a file
+ editor:SetUseTabs(string.find(file_text, "\t") ~= nil
+ or edcfg.usetabs and (file_text:find("%f[^\r\n] ") or file_text:find("^ ")) == nil)
+ end
+
+ if (file_text and edcfg.checkeol) then
+ -- Auto-detect CRLF/LF line-endings
+ local foundcrlf = string.find(file_text,"\r\n") ~= nil
+ local foundlf = (string.find(file_text,"[^\r]\n") ~= nil)
+ or (string.find(file_text,"^\n") ~= nil) -- edge case: file beginning with LF and having no other LF
+ if foundcrlf and foundlf then -- file with mixed line-endings
+ DisplayOutputLn(("%s: %s")
+ :format(filePath, TR("Mixed end-of-line encodings detected.")..' '..
+ TR("Use '%s' to show line endings and '%s' to convert them.")
+ :format("ide:GetEditor():SetViewEOL(1)", "ide:GetEditor():ConvertEOLs(ide:GetEditor():GetEOLMode())")))
+ elseif foundcrlf then
+ editor:SetEOLMode(wxstc.wxSTC_EOL_CRLF)
+ elseif foundlf then
+ editor:SetEOLMode(wxstc.wxSTC_EOL_LF)
+ -- else (e.g. file is 1 line long or uses another line-ending): use default EOL mode
+ end
+ end
+
+ editor:EmptyUndoBuffer()
+ local doc = ide:GetDocument(editor)
+ if doc then -- existing editor; switch to the tab
+ notebook:SetSelection(doc:GetTabIndex())
+ else -- the editor has not been added to notebook
+ doc = AddEditor(editor, wx.wxFileName(filePath):GetFullName()
+ or ide.config.default.fullname)
+ end
+ doc.filePath = filePath
+ doc.fileName = wx.wxFileName(filePath):GetFullName()
+ doc.modTime = GetFileModTime(filePath)
+
+ doc:SetModified(false)
+ doc:SetTabText(doc:GetFileName())
+
+ -- activate the editor; this is needed for those cases when the editor is
+ -- created from some other element, for example, from a project tree.
+ if not skipselection then SetEditorSelection() end
+
+ PackageEventHandle("onEditorLoad", editor)
+
+ return editor
+end
+
+function ReLoadFile(filePath, editor, ...)
+ if not editor then return LoadFile(filePath, editor, ...) end
+
+ -- save all markers
+ local markers = editor:MarkerGetAll()
+ -- add the current line content to retrieved markers to compare later if needed
+ for _, marker in ipairs(markers) do marker[3] = editor:GetLineDyn(marker[1]) end
+ local lines = editor:GetLineCount()
+
+ -- load file into the same editor
+ editor = LoadFile(filePath, editor, ...)
+ if not editor then return end
+
+ if #markers > 0 then -- restore all markers
+ -- delete all markers as they may be restored by a different mechanism,
+ -- which may be limited to only restoring some markers
+ editor:MarkerDeleteAll(-1)
+ local samelinecount = lines == editor:GetLineCount()
+ for _, marker in ipairs(markers) do
+ local line, mask, text = unpack(marker)
+ if samelinecount then
+ -- restore marker at the same line number
+ editor:MarkerAddSet(line, mask)
+ else
+ -- find matching line in the surrounding area and restore marker there
+ for _, l in ipairs({line, line-1, line-2, line+1, line+2}) do
+ if text == editor:GetLineDyn(l) then
+ editor:MarkerAddSet(l, mask)
+ break
+ end
+ end
+ end
+ end
+ PackageEventHandle("onEditorMarkerUpdate", editor)
+ end
+
+ return editor
+end
+
+function ActivateFile(filename)
+ local name, suffix, value = filename:match('(.+):([lLpP]?)(%d+)$')
+ if name and not wx.wxFileExists(filename) then filename = name end
+
+ -- check if non-existing file can be loaded from the project folder;
+ -- this is to handle: "project file" used on the command line
+ if not wx.wxFileExists(filename) and not wx.wxIsAbsolutePath(filename) then
+ filename = GetFullPathIfExists(ide:GetProject(), filename) or filename
+ end
+
+ local opened = LoadFile(filename, nil, true)
+ if opened and value then
+ if suffix:upper() == 'P' then opened:GotoPosDelayed(tonumber(value))
+ else opened:GotoPosDelayed(opened:PositionFromLine(value-1))
+ end
+ end
+ return opened
+end
+
+local function getExtsString(ed)
+ local exts = ed and ed.spec and ed.spec.exts or {}
+ local knownexts = #exts > 0 and "*."..table.concat(exts, ";*.") or nil
+ return (knownexts and TR("Known Files").." ("..knownexts..")|"..knownexts.."|" or "")
+ .. TR("All files").." (*)|*"
+end
+
+function ReportError(msg)
+ return wx.wxMessageBox(msg, TR("Error"), wx.wxICON_ERROR + wx.wxOK + wx.wxCENTRE, ide.frame)
+end
+
+function OpenFile(event)
+ local editor = GetEditor()
+ local path = editor and ide:GetDocument(editor):GetFilePath() or nil
+ local fileDialog = wx.wxFileDialog(ide.frame, TR("Open file"),
+ (path and GetPathWithSep(path) or FileTreeGetDir() or ""),
+ "",
+ getExtsString(editor),
+ wx.wxFD_OPEN + wx.wxFD_FILE_MUST_EXIST + wx.wxFD_MULTIPLE)
+ if fileDialog:ShowModal() == wx.wxID_OK then
+ for _, path in ipairs(fileDialog:GetPaths()) do
+ if not LoadFile(path, nil, true) then
+ ReportError(TR("Unable to load file '%s'."):format(path))
+ end
+ end
+ end
+ fileDialog:Destroy()
+end
+
+-- save the file to filePath or if filePath is nil then call SaveFileAs
+function SaveFile(editor, filePath)
+ -- this event can be aborted
+ -- as SaveFileAs calls SaveFile, this event may be called two times:
+ -- first without filePath and then with filePath
+ if PackageEventHandle("onEditorPreSave", editor, filePath) == false then
+ return false
+ end
+
+ if not filePath then
+ return SaveFileAs(editor)
+ else
+ if ide.config.savebak then
+ local ok, err = FileRename(filePath, filePath..".bak")
+ if not ok then
+ ReportError(TR("Unable to save file '%s': %s"):format(filePath..".bak", err))
+ return
+ end
+ end
+
+ local st = ((editor:GetCodePage() == wxstc.wxSTC_CP_UTF8 and editor.bom or "")
+ .. editor:GetTextDyn())
+ if GetConfigIOFilter("output") then
+ st = GetConfigIOFilter("output")(filePath,st)
+ end
+
+ local ok, err = FileWrite(filePath, st)
+ if ok then
+ editor:SetSavePoint()
+ local doc = ide:GetDocument(editor)
+ doc.filePath = filePath
+ doc.fileName = wx.wxFileName(filePath):GetFullName()
+ doc.modTime = GetFileModTime(filePath)
+ doc:SetModified(false)
+ doc:SetTabText(doc:GetFileName())
+ SetAutoRecoveryMark()
+ FileTreeMarkSelected(filePath)
+
+ PackageEventHandle("onEditorSave", editor)
+
+ return true
+ else
+ ReportError(TR("Unable to save file '%s': %s"):format(filePath, err))
+ end
+ end
+
+ return false
+end
+
+function ApproveFileOverwrite()
+ return wx.wxMessageBox(
+ TR("File already exists.").."\n"..TR("Do you want to overwrite it?"),
+ GetIDEString("editormessage"),
+ wx.wxYES_NO + wx.wxCENTRE, ide.frame) == wx.wxYES
+end
+
+function SaveFileAs(editor)
+ local id = editor:GetId()
+ local saved = false
+ local filePath = (openDocuments[id].filePath
+ or ((FileTreeGetDir() or "")
+ ..(openDocuments[id].fileName or ide.config.default.name)))
+
+ local fn = wx.wxFileName(filePath)
+ fn:Normalize() -- want absolute path for dialog
+
+ local ext = fn:GetExt()
+ if (not ext or #ext == 0) and editor.spec and editor.spec.exts then
+ ext = editor.spec.exts[1]
+ -- set the extension on the file if assigned as this is used by OSX/Linux
+ -- to present the correct default "save as type" choice.
+ if ext then fn:SetExt(ext) end
+ end
+ local fileDialog = wx.wxFileDialog(ide.frame, TR("Save file as"),
+ fn:GetPath(wx.wxPATH_GET_VOLUME),
+ fn:GetFullName(),
+ -- specify the current extension plus all other extensions based on specs
+ (ext and #ext > 0 and "*."..ext.."|*."..ext.."|" or "")..getExtsString(editor),
+ wx.wxFD_SAVE)
+
+ if fileDialog:ShowModal() == wx.wxID_OK then
+ local filePath = fileDialog:GetPath()
+
+ -- check if there is another tab with the same name and prepare to close it
+ local existing = (ide:FindDocument(filePath) or {}).index
+ local cansave = fn:GetFullName() == filePath -- saving into the same file
+ or not wx.wxFileName(filePath):FileExists() -- or a new file
+ or ApproveFileOverwrite()
+
+ if cansave and SaveFile(editor, filePath) then
+ SetEditorSelection() -- update title of the editor
+ if ext ~= GetFileExt(filePath) then
+ -- new extension, so setup new keywords and re-apply indicators
+ editor:ClearDocumentStyle() -- remove styles from the document
+ editor:SetupKeywords(GetFileExt(filePath))
+ IndicateAll(editor)
+ IndicateFunctionsOnly(editor)
+ MarkupStyle(editor)
+ end
+ saved = true
+
+ if existing then
+ -- save the current selection as it may change after closing
+ local current = notebook:GetSelection()
+ ClosePage(existing)
+ -- restore the selection if it changed
+ if current ~= notebook:GetSelection() then
+ notebook:SetSelection(current)
+ end
+ end
+ end
+ end
+
+ fileDialog:Destroy()
+ return saved
+end
+
+function SaveAll(quiet)
+ for _, document in pairs(openDocuments) do
+ local editor = document.editor
+ local filePath = document.filePath
+
+ if (document.isModified or not document.filePath) -- need to save
+ and (document.filePath or not quiet) then -- have path or can ask user
+ SaveFile(editor, filePath) -- will call SaveFileAs if necessary
+ end
+ end
+end
+
+local function removePage(index)
+ local prevIndex = nil
+ local nextIndex = nil
+
+ -- try to preserve old selection
+ local selectIndex = notebook:GetSelection()
+ selectIndex = selectIndex ~= index and selectIndex
+
+ local delid = nil
+ for id, document in pairsSorted(openDocuments,
+ function(a, b) -- sort by document index
+ return openDocuments[a].index < openDocuments[b].index
+ end) do
+ local wasselected = document.index == selectIndex
+ if document.index < index then
+ prevIndex = document.index
+ elseif document.index == index then
+ delid = id
+ document.editor:Destroy()
+ elseif document.index > index then
+ document.index = document.index - 1
+ if nextIndex == nil then
+ nextIndex = document.index
+ end
+ end
+ if (wasselected) then
+ selectIndex = document.index
+ end
+ end
+
+ if (delid) then
+ openDocuments[delid] = nil
+ end
+
+ notebook:RemovePage(index)
+
+ if selectIndex then
+ notebook:SetSelection(selectIndex)
+ elseif nextIndex then
+ notebook:SetSelection(nextIndex)
+ elseif prevIndex then
+ notebook:SetSelection(prevIndex)
+ end
+
+ -- need to set editor selection as it's called *after* PAGE_CHANGED event
+ SetEditorSelection()
+end
+
+function ClosePage(selection)
+ local editor = GetEditor(selection)
+ local id = editor:GetId()
+
+ if PackageEventHandle("onEditorPreClose", editor) == false then
+ return false
+ end
+
+ if SaveModifiedDialog(editor, true) ~= wx.wxID_CANCEL then
+ DynamicWordsRemoveAll(editor)
+ local debugger = ide.debugger
+ -- check if the window with the scratchpad running is being closed
+ if debugger and debugger.scratchpad and debugger.scratchpad.editors
+ and debugger.scratchpad.editors[editor] then
+ DebuggerScratchpadOff()
+ end
+ -- check if the debugger is running and is using the current window;
+ -- abort the debugger if the current marker is in the window being closed
+ if debugger and debugger.server and
+ (editor:MarkerNext(0, CURRENT_LINE_MARKER_VALUE) >= 0) then
+ debugger.terminate()
+ end
+ PackageEventHandle("onEditorClose", editor)
+ removePage(ide.openDocuments[id].index)
+
+ -- disable full screen if the last tab is closed
+ if not (notebook:GetSelection() >= 0) then ShowFullScreen(false) end
+ return true
+ end
+ return false
+end
+
+function CloseAllPagesExcept(selection)
+ local toclose = {}
+ for _, document in pairs(ide.openDocuments) do
+ table.insert(toclose, document.index)
+ end
+
+ table.sort(toclose)
+
+ -- close pages for those files that match the project in the reverse order
+ -- (as ids shift when pages are closed)
+ for i = #toclose, 1, -1 do
+ if toclose[i] ~= selection then ClosePage(toclose[i]) end
+ end
+end
+
+-- Show a dialog to save a file before closing editor.
+-- returns wxID_YES, wxID_NO, or wxID_CANCEL if allow_cancel
+function SaveModifiedDialog(editor, allow_cancel)
+ local result = wx.wxID_NO
+ local id = editor:GetId()
+ local document = openDocuments[id]
+ local filePath = document.filePath
+ local fileName = document.fileName
+ if document.isModified then
+ local message = TR("Do you want to save the changes to '%s'?")
+ :format(fileName or ide.config.default.name)
+ local dlg_styles = wx.wxYES_NO + wx.wxCENTRE + wx.wxICON_QUESTION
+ if allow_cancel then dlg_styles = dlg_styles + wx.wxCANCEL end
+ local dialog = wx.wxMessageDialog(ide.frame, message,
+ TR("Save Changes?"),
+ dlg_styles)
+ result = dialog:ShowModal()
+ dialog:Destroy()
+ if result == wx.wxID_YES then
+ if not SaveFile(editor, filePath) then
+ return wx.wxID_CANCEL -- cancel if canceled save dialog
+ end
+ end
+ end
+
+ return result
+end
+
+function SaveOnExit(allow_cancel)
+ for _, document in pairs(openDocuments) do
+ if (SaveModifiedDialog(document.editor, allow_cancel) == wx.wxID_CANCEL) then
+ return false
+ end
+ end
+
+ -- if all documents have been saved or refused to save, then mark those that
+ -- are still modified as not modified (they don't need to be saved)
+ -- to keep their tab names correct
+ for _, document in pairs(openDocuments) do
+ if document.isModified then document:SetModified(false) end
+ end
+
+ return true
+end
+
+function SetAllEditorsReadOnly(enable)
+ for _, document in pairs(openDocuments) do
+ document.editor:SetReadOnly(enable)
+ end
+end
+
+-----------------
+-- Debug related
+
+function ClearAllCurrentLineMarkers()
+ for _, document in pairs(openDocuments) do
+ document.editor:MarkerDeleteAll(CURRENT_LINE_MARKER)
+ document.editor:Refresh() -- needed for background markers that don't get refreshed (wx2.9.5)
+ end
+end
+
+-- remove shebang line (#!) as it throws a compilation error as
+-- loadstring() doesn't allow it even though lua/loadfile accepts it.
+-- replace with a new line to keep the number of lines the same.
+function StripShebang(code) return (code:gsub("^#!.-\n", "\n")) end
+
+local compileOk, compileTotal = 0, 0
+function CompileProgram(editor, params)
+ local params = {
+ jumponerror = (params or {}).jumponerror ~= false,
+ reportstats = (params or {}).reportstats ~= false,
+ keepoutput = (params or {}).keepoutput,
+ }
+ local doc = ide:GetDocument(editor)
+ local filePath = doc:GetFilePath() or doc:GetFileName()
+ local func, err = loadstring(StripShebang(editor:GetTextDyn()), '@'..filePath)
+ local line = not func and tonumber(err:match(":(%d+)%s*:")) or nil
+
+ if not params.keepoutput then ClearOutput() end
+
+ compileTotal = compileTotal + 1
+ if func then
+ compileOk = compileOk + 1
+ if params.reportstats then
+ DisplayOutputLn(TR("Compilation successful; %.0f%% success rate (%d/%d).")
+ :format(compileOk/compileTotal*100, compileOk, compileTotal))
+ end
+ else
+ ActivateOutput()
+ DisplayOutputLn(TR("Compilation error").." "..TR("on line %d"):format(line)..":")
+ DisplayOutputLn((err:gsub("\n$", "")))
+ -- check for escapes invalid in LuaJIT/Lua 5.2 that are allowed in Lua 5.1
+ if err:find('invalid escape sequence') then
+ local s = editor:GetLineDyn(line-1)
+ local cleaned = s
+ :gsub('\\[abfnrtv\\"\']', ' ')
+ :gsub('(\\x[0-9a-fA-F][0-9a-fA-F])', function(s) return string.rep(' ', #s) end)
+ :gsub('(\\%d%d?%d?)', function(s) return string.rep(' ', #s) end)
+ :gsub('(\\z%s*)', function(s) return string.rep(' ', #s) end)
+ local invalid = cleaned:find("\\")
+ if invalid then
+ DisplayOutputLn(TR("Consider removing backslash from escape sequence '%s'.")
+ :format(s:sub(invalid,invalid+1)))
+ end
+ end
+ if line and params.jumponerror and line-1 ~= editor:GetCurrentLine() then
+ editor:GotoLine(line-1)
+ end
+ end
+
+ return func ~= nil -- return true if it compiled ok
+end
+
+------------------
+-- Save & Close
+
+function SaveIfModified(editor)
+ local id = editor:GetId()
+ if openDocuments[id].isModified then
+ local saved = false
+ if not openDocuments[id].filePath then
+ local ret = wx.wxMessageBox(
+ TR("You must save the program first.").."\n"..TR("Press cancel to abort."),
+ TR("Save file?"), wx.wxOK + wx.wxCANCEL + wx.wxCENTRE, ide.frame)
+ if ret == wx.wxOK then
+ saved = SaveFileAs(editor)
+ end
+ else
+ saved = SaveFile(editor, openDocuments[id].filePath)
+ end
+
+ if saved then
+ openDocuments[id].isModified = false
+ else
+ return false -- not saved
+ end
+ end
+
+ return true -- saved
+end
+
+function GetOpenFiles()
+ local opendocs = {}
+ for _, document in pairs(ide.openDocuments) do
+ if (document.filePath) then
+ local wxfname = wx.wxFileName(document.filePath)
+ wxfname:Normalize()
+
+ table.insert(opendocs, {filename=wxfname:GetFullPath(),
+ id=document.index, cursorpos = document.editor:GetCurrentPos()})
+ end
+ end
+
+ -- to keep tab order
+ table.sort(opendocs,function(a,b) return (a.id < b.id) end)
+
+ local id = GetEditor()
+ id = id and id:GetId()
+ return opendocs, {index = (id and openDocuments[id].index or 0)}
+end
+
+function SetOpenFiles(nametab,params)
+ for _, doc in ipairs(nametab) do
+ local editor = LoadFile(doc.filename,nil,true,true) -- skip selection
+ if editor then editor:GotoPosDelayed(doc.cursorpos or 0) end
+ end
+ notebook:SetSelection(params and params.index or 0)
+ SetEditorSelection()
+end
+
+local beforeFullScreenPerspective
+local statusbarShown
+
+function ShowFullScreen(setFullScreen)
+ if setFullScreen then
+ beforeFullScreenPerspective = uimgr:SavePerspective()
+
+ local panes = frame.uimgr:GetAllPanes()
+ for index = 0, panes:GetCount()-1 do
+ local name = panes:Item(index).name
+ if name ~= "notebook" then frame.uimgr:GetPane(name):Hide() end
+ end
+ uimgr:Update()
+ SetEditorSelection() -- make sure the focus is on the editor
+ elseif beforeFullScreenPerspective then
+ uimgr:LoadPerspective(beforeFullScreenPerspective, true)
+ beforeFullScreenPerspective = nil
+ end
+
+ -- On OSX, status bar is not hidden when switched to
+ -- full screen: http://trac.wxwidgets.org/ticket/14259; do manually.
+ -- need to turn off before showing full screen and turn on after,
+ -- otherwise the window is restored incorrectly and is reduced in size.
+ if ide.osname == 'Macintosh' and setFullScreen then
+ statusbarShown = frame:GetStatusBar():IsShown()
+ frame:GetStatusBar():Hide()
+ end
+
+ -- protect from systems that don't have ShowFullScreen (GTK on linux?)
+ pcall(function() frame:ShowFullScreen(setFullScreen) end)
+
+ if ide.osname == 'Macintosh' and not setFullScreen then
+ if statusbarShown then
+ frame:GetStatusBar():Show()
+ -- refresh AuiManager as the statusbar may be shown below the border
+ uimgr:Update()
+ end
+ end
+end
+
+function ProjectConfig(dir, config)
+ if config then ide.session.projects[dir] = config
+ else return unpack(ide.session.projects[dir] or {}) end
+end
+
+function SetOpenTabs(params)
+ local recovery, nametab = LoadSafe("return "..params.recovery)
+ if not recovery or not nametab then
+ DisplayOutputLn(TR("Can't process auto-recovery record; invalid format: %s."):format(nametab))
+ return
+ end
+ if not params.quiet then
+ DisplayOutputLn(TR("Found auto-recovery record and restored saved session."))
+ end
+ for _,doc in ipairs(nametab) do
+ -- check for missing file if no content is stored
+ if doc.filepath and not doc.content and not wx.wxFileExists(doc.filepath) then
+ DisplayOutputLn(TR("File '%s' is missing and can't be recovered.")
+ :format(doc.filepath))
+ else
+ local editor = (doc.filepath and LoadFile(doc.filepath,nil,true,true)
+ or findUnusedEditor() or NewFile(doc.filename))
+ local opendoc = ide:GetDocument(editor)
+ if doc.content then
+ editor:SetTextDyn(doc.content)
+ if doc.filepath and opendoc.modTime and doc.modified < opendoc.modTime:GetTicks() then
+ DisplayOutputLn(TR("File '%s' has more recent timestamp than restored '%s'; please review before saving.")
+ :format(doc.filepath, opendoc:GetTabText()))
+ end
+ opendoc:SetModified(true)
+ end
+ editor:GotoPosDelayed(doc.cursorpos or 0)
+ end
+ end
+ notebook:SetSelection(params and params.index or 0)
+ SetEditorSelection()
+end
+
+local function getOpenTabs()
+ local opendocs = {}
+ for _, document in pairs(ide.openDocuments) do
+ local editor = document:GetEditor()
+ table.insert(opendocs, {
+ filename = document:GetFileName(),
+ filepath = document:GetFilePath(),
+ tabname = document:GetTabText(),
+ modified = document:GetModTime() and document:GetModTime():GetTicks(), -- get number of seconds
+ content = document:IsModified() and editor:GetTextDyn() or nil,
+ id = document:GetTabIndex(),
+ cursorpos = editor:GetCurrentPos()})
+ end
+
+ -- to keep tab order
+ table.sort(opendocs, function(a,b) return (a.id < b.id) end)
+
+ local ed = GetEditor()
+ local doc = ed and ide:GetDocument(ed)
+ return opendocs, {index = (doc and doc:GetTabIndex() or 0)}
+end
+
+function SetAutoRecoveryMark()
+ ide.session.lastupdated = os.time()
+end
+
+local function generateRecoveryRecord(opentabs)
+ return require('mobdebug').line(opentabs, {comment = false})
+end
+
+local function saveHotExit()
+ local opentabs, params = getOpenTabs()
+ if #opentabs > 0 then
+ params.recovery = generateRecoveryRecord(opentabs)
+ params.quiet = true
+ SettingsSaveFileSession({}, params)
+ end
+end
+
+local function saveAutoRecovery(force)
+ if not ide.config.autorecoverinactivity then return end
+
+ local lastupdated = ide.session.lastupdated
+ if not force then
+ if not lastupdated or lastupdated < (ide.session.lastsaved or 0) then return end
+ end
+
+ local now = os.time()
+ if not force and lastupdated + ide.config.autorecoverinactivity > now then return end
+
+ -- find all open modified files and save them
+ local opentabs, params = getOpenTabs()
+ if #opentabs > 0 then
+ params.recovery = generateRecoveryRecord(opentabs)
+ SettingsSaveAll()
+ SettingsSaveFileSession({}, params)
+ ide.settings:Flush()
+ end
+ ide.session.lastsaved = now
+ ide:SetStatus(TR("Saved auto-recover at %s."):format(os.date("%H:%M:%S")))
+end
+
+local function fastWrap(func, ...)
+ -- ignore SetEditorSelection that is not needed as `func` may work on
+ -- multipe files, but editor needs to be selected once.
+ local SES = SetEditorSelection
+ SetEditorSelection = function() end
+ func(...)
+ SetEditorSelection = SES
+end
+
+function StoreRestoreProjectTabs(curdir, newdir, intfname)
+ local win = ide.osname == 'Windows'
+ local interpreter = intfname or ide.interpreter.fname
+ local current, closing, restore = notebook:GetSelection(), 0, false
+
+ if ide.osname ~= 'Macintosh' then notebook:Freeze() end
+
+ if curdir and #curdir > 0 then
+ local lowcurdir = win and string.lower(curdir) or curdir
+ local lownewdir = win and string.lower(newdir) or newdir
+ local projdocs, closdocs = {}, {}
+ for _, document in ipairs(GetOpenFiles()) do
+ local dpath = win and string.lower(document.filename) or document.filename
+ -- check if the filename is in the same folder
+ if dpath:find(lowcurdir, 1, true) == 1
+ and dpath:find("^[\\/]", #lowcurdir+1) then
+ table.insert(projdocs, document)
+ closing = closing + (document.id < current and 1 or 0)
+ -- only close if the file is not in new project as it would be reopened
+ if not dpath:find(lownewdir, 1, true)
+ or not dpath:find("^[\\/]", #lownewdir+1) then
+ table.insert(closdocs, document)
+ end
+ elseif document.id == current then restore = true end
+ end
+
+ -- adjust for the number of closing tabs on the left from the current one
+ current = current - closing
+
+ -- save opened files from this project
+ ProjectConfig(curdir, {projdocs,
+ {index = notebook:GetSelection() - current, interpreter = interpreter}})
+
+ -- close pages for those files that match the project in the reverse order
+ -- (as ids shift when pages are closed)
+ for i = #closdocs, 1, -1 do fastWrap(ClosePage, closdocs[i].id) end
+ end
+
+ local files, params = ProjectConfig(newdir)
+ if files then
+ -- provide fake index so that it doesn't activate it as the index may be not
+ -- quite correct if some of the existing files are already open in the IDE.
+ fastWrap(SetOpenFiles, files, {index = #files + notebook:GetPageCount()})
+ end
+
+ -- either interpreter is chosen for the project or the default value is set
+ if (params and params.interpreter) or (not params and ide.config.interpreter) then
+ ProjectSetInterpreter(params and params.interpreter or ide.config.interpreter)
+ end
+
+ if ide.osname ~= 'Macintosh' then notebook:Thaw() end
+
+ local index = params and params.index
+ if notebook:GetPageCount() == 0 then NewFile()
+ elseif restore and current >= 0 then notebook:SetSelection(current)
+ elseif index and index >= 0 and files[index+1] then
+ -- move the editor tab to the front with the file from the config
+ LoadFile(files[index+1].filename, nil, true)
+ SetEditorSelection() -- activate the editor in the active tab
+ end
+
+ -- remove current config as it may change; the current configuration is
+ -- stored with the general config.
+ -- The project configuration will be updated when the project is changed.
+ ProjectConfig(newdir, {})
+end
+
+local function closeWindow(event)
+ -- if the app is already exiting, then help it exit; wxwidgets on Windows
+ -- is supposed to report Shutdown/logoff events by setting CanVeto() to
+ -- false, but it doesn't happen. We simply leverage the fact that
+ -- CloseWindow is called several times in this case and exit. Similar
+ -- behavior has been also seen on Linux, so this logic applies everywhere.
+ if ide.exitingProgram then os.exit() end
+
+ ide.exitingProgram = true -- don't handle focus events
+
+ if not ide.config.hotexit and not SaveOnExit(event:CanVeto()) then
+ event:Veto()
+ ide.exitingProgram = false
+ return
+ end
+
+ ShowFullScreen(false)
+
+ PackageEventHandle("onAppClose")
+
+ -- first need to detach all processes IDE has launched as the current
+ -- process is likely to terminate before child processes are terminated,
+ -- which may lead to a crash when EVT_END_PROCESS event is called.
+ DetachChildProcess()
+ DebuggerShutdown()
+
+ SettingsSaveAll()
+ if ide.config.hotexit then saveHotExit() end
+ ide.settings:Flush()
+
+ do -- hide all floating panes first
+ local panes = frame.uimgr:GetAllPanes()
+ for index = 0, panes:GetCount()-1 do
+ local pane = frame.uimgr:GetPane(panes:Item(index).name)
+ if pane:IsFloating() then pane:Hide() end
+ end
+ end
+ frame.uimgr:Update() -- hide floating panes
+ frame.uimgr:UnInit()
+ frame:Hide() -- hide the main frame while the IDE exits
+
+ -- stop all the timers
+ for _, timer in pairs(ide.timers) do timer:Stop() end
+
+ event:Skip()
+
+ PackageEventHandle("onAppDone")
+end
+frame:Connect(wx.wxEVT_CLOSE_WINDOW, closeWindow)
+
+frame:Connect(wx.wxEVT_TIMER, function() saveAutoRecovery() end)
+
+-- in the presence of wxAuiToolbar, when (1) the app gets focus,
+-- (2) a floating panel is closed or (3) a toolbar dropdown is closed,
+-- the focus is always on the toolbar when the app gets focus,
+-- so to restore the focus correctly, need to track where the control is
+-- and to set the focus to the last element that had focus.
+-- it would be easier to track KILL_FOCUS events, but controls on OSX
+-- don't always generate KILL_FOCUS events (see relevant wxwidgets
+-- tickets: http://trac.wxwidgets.org/ticket/14142
+-- and http://trac.wxwidgets.org/ticket/14269)
+
+ide.editorApp:Connect(wx.wxEVT_SET_FOCUS, function(event)
+ if ide.exitingProgram then return end
+
+ local win = ide.frame:FindFocus()
+ if win then
+ local class = win:GetClassInfo():GetClassName()
+ -- don't set focus on the main frame or toolbar
+ if ide.infocus and (class == 'wxAuiToolBar' or class == 'wxFrame') then
+ -- check if the window is shown before returning focus to it,
+ -- as it may lead to a recursion in event handlers on OSX (wxwidgets 2.9.5).
+ pcall(function() if ide:IsWindowShown(ide.infocus) then ide.infocus:SetFocus() end end)
+ return
+ end
+
+ -- keep track of the current control in focus, but only on the main frame
+ -- don't try to "remember" any of the focus changes on various dialog
+ -- windows as those will disappear along with their controls
+ local grandparent = win:GetGrandParent()
+ local frameid = ide.frame:GetId()
+ local mainwin = grandparent and grandparent:GetId() == frameid
+ local parent = win:GetParent()
+ while parent do
+ local class = parent:GetClassInfo():GetClassName()
+ if (class == 'wxFrame' or class:find('^wx.*Dialog$'))
+ and parent:GetId() ~= frameid then
+ mainwin = false; break
+ end
+ parent = parent:GetParent()
+ end
+ if mainwin then
+ if ide.infocus and ide.infocus ~= win and ide.osname == 'Macintosh' then
+ -- kill focus on the control that had the focus as wxwidgets on OSX
+ -- doesn't do it: http://trac.wxwidgets.org/ticket/14142;
+ -- wrap into pcall in case the window is already deleted
+ local ev = wx.wxFocusEvent(wx.wxEVT_KILL_FOCUS)
+ pcall(function() ide.infocus:GetEventHandler():ProcessEvent(ev) end)
+ end
+ ide.infocus = win
+ end
+ end
+
+ event:Skip()
+end)
+
+local updateInterval = 250 -- time in ms
+wx.wxUpdateUIEvent.SetUpdateInterval(updateInterval)
+
+ide.editorApp:Connect(wx.wxEVT_ACTIVATE_APP,
+ function(event)
+ if not ide.exitingProgram then
+ if ide.osname == 'Macintosh' and ide.infocus and event:GetActive() then
+ -- restore focus to the last element that received it;
+ -- wrap into pcall in case the element has disappeared
+ -- while the application was out of focus
+ pcall(function() if ide:IsWindowShown(ide.infocus) then ide.infocus:SetFocus() end end)
+ end
+
+ local active = event:GetActive()
+ -- save auto-recovery record when making the app inactive
+ if not active then saveAutoRecovery(true) end
+
+ -- disable UI refresh when app is inactive, but only when not running
+ wx.wxUpdateUIEvent.SetUpdateInterval(
+ (active or ide:GetLaunchedProcess()) and updateInterval or -1)
+
+ PackageEventHandle(active and "onAppFocusSet" or "onAppFocusLost", ide.editorApp)
+ end
+ event:Skip()
+ end)
+
+if ide.config.autorecoverinactivity then
+ ide.timers.session = wx.wxTimer(frame)
+ -- check at least 5s to be never more than 5s off
+ ide.timers.session:Start(math.min(5, ide.config.autorecoverinactivity)*1000)
+end
+
+function PaneFloatToggle(window)
+ local pane = uimgr:GetPane(window)
+ if pane:IsFloating() then
+ pane:Dock()
+ else
+ pane:Float()
+ pane:FloatingPosition(pane.window:GetScreenPosition())
+ pane:FloatingSize(pane.window:GetSize())
+ end
+ uimgr:Update()
+end
+
+local cma, cman = 0, 1
+frame:Connect(wx.wxEVT_IDLE,
+ function(event)
+ local debugger = ide.debugger
+ if (debugger.update) then debugger.update() end
+ if (debugger.scratchpad) then DebuggerRefreshScratchpad() end
+ if IndicateIfNeeded() then event:RequestMore(true) end
+ PackageEventHandleOnce("onIdleOnce", event)
+ PackageEventHandle("onIdle", event)
+
+ -- process onidle events if any
+ if #ide.onidle > 0 then table.remove(ide.onidle)() end
+ if #ide.onidle > 0 then event:RequestMore(true) end -- request more if anything left
+
+ if ide.config.showmemoryusage then
+ local mem = collectgarbage("count")
+ local alpha = math.max(tonumber(ide.config.showmemoryusage) or 0, 1/cman)
+ cman = cman + 1
+ cma = alpha * mem + (1-alpha) * cma
+ ide:SetStatus(("cur: %sKb; avg: %sKb"):format(math.floor(mem), math.floor(cma)))
+ end
+
+ event:Skip() -- let other EVT_IDLE handlers to work on the event
+ end)
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/debugger.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/debugger.lua
new file mode 100644
index 0000000..26209c1
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/debugger.lua
@@ -0,0 +1,1696 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- Original authors: Lomtik Software (J. Winwood & John Labenski)
+-- Luxinia Dev (Eike Decker & Christoph Kubisch)
+-- Integration with MobDebug
+---------------------------------------------------------
+
+local copas = require "copas"
+local socket = require "socket"
+local mobdebug = require "mobdebug"
+local unpack = table.unpack or unpack
+
+local ide = ide
+local debugger = setmetatable(ide.debugger, ide.proto.Debugger)
+debugger.server = nil -- DebuggerServer object when debugging, else nil
+debugger.running = false -- true when the debuggee is running
+debugger.listening = false -- true when the debugger is listening for a client
+debugger.portnumber = ide.config.debugger.port or mobdebug.port -- the port # to use for debugging
+debugger.watchCtrl = nil -- the watch ctrl that shows watch information
+debugger.stackCtrl = nil -- the stack ctrl that shows stack information
+debugger.toggleview = {
+ bottomnotebook = true, -- output/console is "on" by default
+ stackpanel = false, watchpanel = false, toolbar = false }
+debugger.needrefresh = {} -- track components that may need a refresh
+debugger.hostname = ide.config.debugger.hostname or (function()
+ local hostname = socket.dns.gethostname()
+ return hostname and socket.dns.toip(hostname) and hostname or "localhost"
+end)()
+debugger.imglist = ide:CreateImageList("STACK", "VALUE-CALL", "VALUE-LOCAL", "VALUE-UP")
+
+local image = { STACK = 0, LOCAL = 1, UPVALUE = 2 }
+local notebook = ide.frame.notebook
+
+local CURRENT_LINE_MARKER = StylesGetMarker("currentline")
+local CURRENT_LINE_MARKER_VALUE = 2^CURRENT_LINE_MARKER
+local BREAKPOINT_MARKER = StylesGetMarker("breakpoint")
+local BREAKPOINT_MARKER_VALUE = 2^BREAKPOINT_MARKER
+
+local activate = {CHECKONLY = 1, NOREPORT = 2}
+
+local function serialize(value, options) return mobdebug.line(value, options) end
+
+local stackmaxlength = ide.config.debugger.maxdatalength
+local stackmaxnum = ide.config.debugger.maxdatanum
+local stackmaxlevel = ide.config.debugger.maxdatalevel
+local params = {comment = false, nocode = true, maxlevel = stackmaxlevel, maxnum = stackmaxnum}
+
+local function fixUTF8(...)
+ local t = {...}
+ -- convert to escaped decimal code as these can only appear in strings
+ local function fix(s) return '\\'..string.byte(s) end
+ for i = 1, #t do t[i] = FixUTF8(t[i], fix) end
+ return unpack(t)
+end
+
+local function trimToMaxLength(...)
+ local t = {...}
+ for i = 1, #t do
+ t[i] = t[i]:sub(1, stackmaxlength)..(#t[i] > stackmaxlength and '...' or '')
+ end
+ return unpack(t)
+end
+
+local q = EscapeMagic
+
+local function updateWatchesSync(onlyitem)
+ local watchCtrl = debugger.watchCtrl
+ local pane = ide.frame.uimgr:GetPane("watchpanel")
+ local shown = watchCtrl and (pane:IsOk() and pane:IsShown() or not pane:IsOk() and watchCtrl:IsShown())
+ local canupdate = (debugger.server and not debugger.running and not debugger.scratchpad
+ and not (debugger.options or {}).noeval)
+ if shown and canupdate then
+ local bgcl = watchCtrl:GetBackgroundColour()
+ local hicl = wx.wxColour(math.floor(bgcl:Red()*.9),
+ math.floor(bgcl:Green()*.9), math.floor(bgcl:Blue()*.9))
+
+ local root = watchCtrl:GetRootItem()
+ if not root or not root:IsOk() then return end
+
+ local item = onlyitem or watchCtrl:GetFirstChild(root)
+ while true do
+ if not item:IsOk() then break end
+
+ local expression = watchCtrl:GetItemExpression(item)
+ if expression then
+ local _, values, error = debugger.evaluate(expression)
+ local curchildren = watchCtrl:GetItemChildren(item)
+ if error then
+ error = error:gsub("%[.-%]:%d+:%s+","")
+ watchCtrl:SetItemValueIfExpandable(item, nil)
+ else
+ if #values == 0 then values = {'nil'} end
+ local _, res = LoadSafe("return "..values[1])
+ watchCtrl:SetItemValueIfExpandable(item, res)
+ end
+
+ local newval = (expression .. ' = '
+ .. (error and ('error: '..error) or table.concat(values, ", ")))
+ local val = watchCtrl:GetItemText(item)
+
+ watchCtrl:SetItemBackgroundColour(item, val ~= newval and hicl or bgcl)
+ watchCtrl:SetItemText(item, newval)
+
+ if onlyitem or val ~= newval then
+ local newchildren = watchCtrl:GetItemChildren(item)
+ if next(curchildren) ~= nil and next(newchildren) == nil then
+ watchCtrl:SetItemHasChildren(item, true)
+ watchCtrl:CollapseAndReset(item)
+ watchCtrl:SetItemHasChildren(item, false)
+ elseif next(curchildren) ~= nil and next(newchildren) ~= nil then
+ watchCtrl:CollapseAndReset(item)
+ watchCtrl:Expand(item)
+ end
+ end
+ end
+
+ if onlyitem then break end
+ item = watchCtrl:GetNextSibling(item)
+ end
+ elseif not shown and canupdate then
+ debugger.needrefresh.watches = true
+ end
+end
+
+local simpleType = {['nil'] = true, ['string'] = true, ['number'] = true, ['boolean'] = true}
+local callData = {}
+
+local function updateStackSync()
+ local stackCtrl = debugger.stackCtrl
+ local pane = ide.frame.uimgr:GetPane("stackpanel")
+ local shown = stackCtrl and (pane:IsOk() and pane:IsShown() or not pane:IsOk() and stackCtrl:IsShown())
+ local canupdate = debugger.server and not debugger.running and not debugger.scratchpad
+ if shown and canupdate then
+ local stack, _, err = debugger.stack()
+ if not stack or #stack == 0 then
+ stackCtrl:DeleteAll()
+ if err then -- report an error if any
+ stackCtrl:AppendItem(stackCtrl:AddRoot("Stack"), "Error: " .. err, image.STACK)
+ end
+ return
+ end
+ stackCtrl:Freeze()
+ stackCtrl:DeleteAll()
+
+ local root = stackCtrl:AddRoot("Stack")
+ callData = {} -- reset call cache
+ for _,frame in ipairs(stack) do
+ -- "main chunk at line 24"
+ -- "foo() at line 13 (defined at foobar.lua:11)"
+ -- call = { source.name, source.source, source.linedefined,
+ -- source.currentline, source.what, source.namewhat, source.short_src }
+ local call = frame[1]
+
+ -- format the function name to a readable user string
+ local func = call[5] == "main" and "main chunk"
+ or call[5] == "C" and (call[1] or "C function")
+ or call[5] == "tail" and "tail call"
+ or (call[1] or "anonymous function")
+
+ -- format the function treeitem text string, including the function name
+ local text = func ..
+ (call[4] == -1 and '' or " at line "..call[4]) ..
+ (call[5] ~= "main" and call[5] ~= "Lua" and ''
+ or (call[3] > 0 and " (defined at "..call[7]..":"..call[3]..")"
+ or " (defined in "..call[7]..")"))
+
+ -- create the new tree item for this level of the call stack
+ local callitem = stackCtrl:AppendItem(root, text, image.STACK)
+
+ -- register call data to provide stack navigation
+ callData[callitem:GetValue()] = { call[2], call[4] }
+
+ -- add the local variables to the call stack item
+ for name,val in pairs(frame[2]) do
+ -- format the variable name, value as a single line and,
+ -- if not a simple type, the string value.
+
+ -- comment can be not necessarily a string for tables with metatables
+ -- that provide its own __tostring method
+ local value, comment = val[1], fixUTF8(trimToMaxLength(tostring(val[2])))
+ local text = ("%s = %s%s"):
+ format(name, fixUTF8(trimToMaxLength(serialize(value, params))),
+ (simpleType[type(value)] or not val[2]) and "" or (" --[["..comment.."]]"))
+ local item = stackCtrl:AppendItem(callitem, text, image.LOCAL)
+ stackCtrl:SetItemValueIfExpandable(item, value)
+ end
+
+ -- add the upvalues for this call stack level to the tree item
+ for name,val in pairs(frame[3]) do
+ local value, comment = val[1], fixUTF8(trimToMaxLength(tostring(val[2])))
+ local text = ("%s = %s%s"):
+ format(name, fixUTF8(trimToMaxLength(serialize(value, params))),
+ (simpleType[type(value)] or not val[2]) and "" or (" --[["..comment.."]]"))
+ local item = stackCtrl:AppendItem(callitem, text, image.UPVALUE)
+ stackCtrl:SetItemValueIfExpandable(item, value)
+ end
+
+ stackCtrl:SortChildren(callitem)
+ stackCtrl:Expand(callitem)
+ end
+ stackCtrl:EnsureVisible(stackCtrl:GetFirstChild(root))
+ stackCtrl:SetScrollPos(wx.wxHORIZONTAL, 0, true)
+ stackCtrl:Thaw()
+ elseif not shown and canupdate then
+ debugger.needrefresh.stack = true
+ end
+end
+
+local function updateStackAndWatches()
+ -- check if the debugger is running and may be waiting for a response.
+ -- allow that request to finish, otherwise this function does nothing.
+ if debugger.running then debugger.update() end
+ if debugger.server and not debugger.running then
+ copas.addthread(function() updateStackSync() updateWatchesSync() end)
+ end
+end
+
+local function updateWatches(item)
+ -- check if the debugger is running and may be waiting for a response.
+ -- allow that request to finish, otherwise this function does nothing.
+ if debugger.running then debugger.update() end
+ if debugger.server and not debugger.running then
+ copas.addthread(function() updateWatchesSync(item) end)
+ end
+end
+
+local function updateStack()
+ -- check if the debugger is running and may be waiting for a response.
+ -- allow that request to finish, otherwise this function does nothing.
+ if debugger.running then debugger.update() end
+ if debugger.server and not debugger.running then
+ copas.addthread(function() updateStackSync() end)
+ end
+end
+
+local function debuggerToggleViews(show)
+ -- don't toggle if the current state is the same as the new one
+ local shown = debugger.toggleview.shown
+ if (show and shown) or (not show and not shown) then return end
+
+ debugger.toggleview.shown = nil
+
+ local mgr = ide.frame.uimgr
+ local refresh = false
+ for view, needed in pairs(debugger.toggleview) do
+ local bar = view == 'toolbar'
+ local pane = mgr:GetPane(view)
+ if show then -- starting debugging and pane is not shown
+ debugger.toggleview[view] = not pane:IsShown()
+ if debugger.toggleview[view] and (needed or bar)
+ and (not bar or not ide.frame:IsFullScreen()) then
+ pane:Show()
+ refresh = true
+ end
+ else -- completing debugging and pane is shown
+ debugger.toggleview[view] = pane:IsShown() and needed
+ if debugger.toggleview[view] then
+ pane:Hide()
+ refresh = true
+ end
+ end
+ end
+ if refresh then mgr:Update() end
+ if show then debugger.toggleview.shown = true end
+end
+
+local function killClient()
+ if (debugger.pid and wx.wxProcess.Exists(debugger.pid)) then
+ -- using SIGTERM for some reason kills not only the debugee process,
+ -- but also some system processes, which leads to a blue screen crash
+ -- (at least on Windows Vista SP2)
+ local ret = wx.wxProcess.Kill(debugger.pid, wx.wxSIGKILL, wx.wxKILL_CHILDREN)
+ if ret == wx.wxKILL_OK then
+ DisplayOutputLn(TR("Program stopped (pid: %d)."):format(debugger.pid))
+ elseif ret ~= wx.wxKILL_NO_PROCESS then
+ DisplayOutputLn(TR("Unable to stop program (pid: %d), code %d.")
+ :format(debugger.pid, ret))
+ end
+ end
+ debugger.pid = nil
+end
+
+local function activateDocument(file, line, activatehow)
+ if not file then return end
+
+ -- file can be a filename or serialized file content; deserialize first.
+ -- check if the filename starts with '"' and is deserializable
+ -- to avoid showing filenames that may look like valid lua code
+ -- (for example: 'mobdebug.lua').
+ local content
+ if not wx.wxFileName(file):FileExists() and file:find('^"') then
+ local ok, res = LoadSafe("return "..file)
+ if ok then content = res end
+ end
+
+ -- in some cases filename can be returned quoted if the chunk is loaded with
+ -- loadstring(chunk, "filename") instead of loadstring(chunk, "@filename")
+ if content then
+ -- if the returned content can be matched with a file, it's a file name
+ local fname = GetFullPathIfExists(debugger.basedir, content) or content
+ if wx.wxFileName(fname):FileExists() then file, content = fname, nil end
+ elseif not wx.wxIsAbsolutePath(file) and debugger.basedir then
+ file = debugger.basedir .. file
+ end
+
+ local activated
+ local indebugger = file:find('mobdebug%.lua$')
+ local fileName = wx.wxFileName(file)
+
+ for _, document in pairs(ide.openDocuments) do
+ local editor = document.editor
+ -- either the file name matches, or the content;
+ -- when checking for the content remove all newlines as they may be
+ -- reported differently from the original by the Lua engine.
+ if document.filePath and fileName:SameAs(wx.wxFileName(document.filePath))
+ or content and content:gsub("[\n\r]","") == editor:GetTextDyn():gsub("[\n\r]","") then
+ ClearAllCurrentLineMarkers()
+ if line then
+ if line == 0 then -- special case; find the first executable line
+ line = math.huge
+ local func = loadstring(editor:GetTextDyn())
+ if func then -- .activelines == {[3] = true, [4] = true, ...}
+ for l in pairs(debug.getinfo(func, "L").activelines) do
+ if l < line then line = l end
+ end
+ end
+ if line == math.huge then line = 1 end
+ end
+ local line = line - 1 -- editor line operations are zero-based
+ if debugger.runtocursor then
+ local ed, ln = unpack(debugger.runtocursor)
+ if ed:GetId() == editor:GetId() and ln == line then
+ DebuggerToggleBreakpoint(ed, ln)
+ debugger.runtocursor = nil
+ end
+ end
+ editor:MarkerAdd(line, CURRENT_LINE_MARKER)
+ editor:Refresh() -- needed for background markers that don't get refreshed (wx2.9.5)
+
+ -- expand fold if the activated line is in a folded fragment
+ if not editor:GetLineVisible(line) then editor:ToggleFold(editor:GetFoldParent(line)) end
+
+ -- found and marked what we are looking for;
+ -- don't need to activate with CHECKONLY (this assumes line is given)
+ if activatehow == activate.CHECKONLY then return editor end
+
+ local firstline = editor:DocLineFromVisible(editor:GetFirstVisibleLine())
+ local lastline = math.min(editor:GetLineCount(),
+ editor:DocLineFromVisible(editor:GetFirstVisibleLine() + editor:LinesOnScreen()))
+ -- if the line is already on the screen, then don't enforce policy
+ if line <= firstline or line >= lastline then
+ editor:EnsureVisibleEnforcePolicy(line)
+ end
+ end
+
+ local selection = document.index
+ RequestAttention()
+ notebook:SetSelection(selection)
+ SetEditorSelection(selection)
+
+ if content then
+ -- it's possible that the current editor tab already has
+ -- breakpoints that have been set based on its filepath;
+ -- if the content has been matched, then existing breakpoints
+ -- need to be removed and new ones set, based on the content.
+ if not debugger.editormap[editor] and document.filePath then
+ local filePath = document.filePath
+ local line = editor:MarkerNext(0, BREAKPOINT_MARKER_VALUE)
+ while filePath and line ~= -1 do
+ debugger.handle("delb " .. filePath .. " " .. (line+1))
+ debugger.handle("setb " .. file .. " " .. (line+1))
+ line = editor:MarkerNext(line + 1, BREAKPOINT_MARKER_VALUE)
+ end
+ end
+
+ -- keep track of those editors that have been activated based on
+ -- content rather than file names as their breakpoints have to be
+ -- specified in a different way
+ debugger.editormap[editor] = file
+ end
+
+ activated = editor
+ break
+ end
+ end
+
+ if not (activated or indebugger or debugger.loop or activatehow == activate.CHECKONLY)
+ and (ide.config.editor.autoactivate or content and activatehow == activate.NOREPORT) then
+ -- found file, but can't activate yet (because this part may be executed
+ -- in a different coroutine), so schedule pending activation.
+ if content or wx.wxFileName(file):FileExists() then
+ debugger.activate = {file, line, content}
+ return true -- report successful activation, even though it's pending
+ end
+
+ -- only report files once per session and if not asked to skip
+ if not debugger.missing[file] and activatehow ~= activate.NOREPORT then
+ debugger.missing[file] = true
+ DisplayOutputLn(TR("Couldn't activate file '%s' for debugging; continuing without it.")
+ :format(file))
+ end
+ end
+
+ return activated ~= nil
+end
+
+local function reSetBreakpoints()
+ -- remove all breakpoints that may still be present from the last session
+ -- this only matters for those remote clients that reload scripts
+ -- without resetting their breakpoints
+ debugger.handle("delallb")
+
+ -- go over all windows and find all breakpoints
+ if (not debugger.scratchpad) then
+ for _, document in pairs(ide.openDocuments) do
+ local editor = document.editor
+ local filePath = document.filePath
+ local line = editor:MarkerNext(0, BREAKPOINT_MARKER_VALUE)
+ while filePath and line ~= -1 do
+ debugger.handle("setb " .. filePath .. " " .. (line+1))
+ line = editor:MarkerNext(line + 1, BREAKPOINT_MARKER_VALUE)
+ end
+ end
+ end
+end
+
+debugger.shell = function(expression, isstatement)
+ -- check if the debugger is running and may be waiting for a response.
+ -- allow that request to finish, otherwise this function does nothing.
+ if debugger.running then debugger.update() end
+ if debugger.server and not debugger.running
+ and (not debugger.scratchpad or debugger.scratchpad.paused) then
+ copas.addthread(function ()
+ -- exec command is not expected to return anything.
+ -- eval command returns 0 or more results.
+ -- 'values' has a list of serialized results returned.
+ -- as it is not possible to distinguish between 0 results and one
+ -- 'nil' value returned, 'nil' is always returned in this case.
+ -- the first value returned by eval command is not used;
+ -- this may need to be taken into account by other debuggers.
+ local addedret, forceexpression = true, expression:match("^%s*=%s*")
+ expression = expression:gsub("^%s*=%s*","")
+ local _, values, err = debugger.evaluate(expression)
+ if not forceexpression and err then
+ _, values, err = debugger.execute(expression)
+ addedret = false
+ end
+
+ if err then
+ if addedret then err = err:gsub('^%[string "return ', '[string "') end
+ DisplayShellErr(err)
+ elseif addedret or #values > 0 then
+ if forceexpression then -- display elements as multi-line
+ for i,v in pairs(values) do -- stringify each of the returned values
+ local func = loadstring('return '..v) -- deserialize the value first
+ if func then -- if it's deserialized correctly
+ values[i] = (forceexpression and i > 1 and '\n' or '') ..
+ serialize(func(), {nocode = true, comment = 0,
+ -- if '=' is used, then use multi-line serialized output
+ indent = forceexpression and ' ' or nil})
+ end
+ end
+ end
+
+ -- if empty table is returned, then show nil if this was an expression
+ if #values == 0 and (forceexpression or not isstatement) then
+ values = {'nil'}
+ end
+ DisplayShell(unpack(values))
+ end
+
+ -- refresh Stack and Watch windows if executed a statement (and no err)
+ if isstatement and not err and not addedret and #values == 0 then
+ updateStackSync() updateWatchesSync()
+ end
+ end)
+ elseif debugger.server then
+ DisplayShellErr(TR("Can't evaluate the expression while the application is running."))
+ end
+end
+
+local function stoppedAtBreakpoint(file, line)
+ -- if this document can be activated and the current line has a breakpoint
+ local editor = activateDocument(file, line, activate.CHECKONLY)
+ if not editor then return false end
+
+ local current = editor:MarkerNext(0, CURRENT_LINE_MARKER_VALUE)
+ local breakpoint = editor:MarkerNext(current, BREAKPOINT_MARKER_VALUE)
+ return breakpoint > -1 and breakpoint == current
+end
+
+local function mapRemotePath(basedir, file, line, method)
+ if not file then return end
+
+ -- file is /foo/bar/my.lua; basedir is d:\local\path\
+ -- check for d:\local\path\my.lua, d:\local\path\bar\my.lua, ...
+ -- wxwidgets on Windows handles \\ and / as separators, but on OSX
+ -- and Linux it only handles 'native' separator;
+ -- need to translate for GetDirs to work.
+ local file = file:gsub("\\", "/")
+ local parts = wx.wxFileName(file):GetDirs()
+ local name = wx.wxFileName(file):GetFullName()
+
+ -- find the longest remote path that can be mapped locally
+ local longestpath, remotedir
+ while true do
+ local mapped = GetFullPathIfExists(basedir, name)
+ if mapped then
+ longestpath = mapped
+ remotedir = file:gsub(q(name):gsub("/", ".").."$", "")
+ end
+ if #parts == 0 then break end
+ name = table.remove(parts, #parts) .. "/" .. name
+ end
+
+ -- if found a local mapping under basedir
+ local activated = longestpath and activateDocument(longestpath, line, method or activate.NOREPORT)
+ if activated then
+ -- find remote basedir by removing the tail from remote file
+ debugger.handle("basedir " .. debugger.basedir .. "\t" .. remotedir)
+ -- reset breakpoints again as remote basedir has changed
+ reSetBreakpoints()
+ DisplayOutputLn(TR("Mapped remote request for '%s' to '%s'.")
+ :format(remotedir, debugger.basedir))
+
+ return longestpath
+ end
+
+ return nil
+end
+
+debugger.listen = function(start)
+ if start == false then
+ if debugger.listening then
+ debugger.terminate() -- terminate if running
+ copas.removeserver(debugger.listening)
+ DisplayOutputLn(TR("Debugger server stopped at %s:%d.")
+ :format(debugger.hostname, debugger.portnumber))
+ debugger.listening = false
+ else
+ DisplayOutputLn(TR("Can't stop debugger server as it is not started."))
+ end
+ return
+ end
+
+ local server, err = socket.bind("*", debugger.portnumber)
+ if not server then
+ DisplayOutputLn(TR("Can't start debugger server at %s:%d: %s.")
+ :format(debugger.hostname, debugger.portnumber, err or TR("unknown error")))
+ return
+ end
+ DisplayOutputLn(TR("Debugger server started at %s:%d.")
+ :format(debugger.hostname, debugger.portnumber))
+
+ copas.autoclose = false
+ copas.addserver(server, function (skt)
+ -- pull any pending data not processed yet
+ if debugger.running then debugger.update() end
+ if debugger.server then
+ DisplayOutputLn(TR("Refused a request to start a new debugging session as there is one in progress already."))
+ return
+ end
+
+ copas.setErrorHandler(function(error)
+ -- ignore errors that happen because debugging session is
+ -- terminated during handshake (server == nil in this case).
+ if debugger.server then
+ DisplayOutputLn(TR("Can't start debugging session due to internal error '%s'."):format(error))
+ end
+ debugger.terminate()
+ end)
+
+ local options = debugger.options or {}
+ -- this may be a remote call without using an interpreter and as such
+ -- debugger.options may not be set, but runonstart is still configured.
+ if not options.runstart then options.runstart = ide.config.debugger.runonstart end
+
+ -- support allowediting as set in the interpreter or config
+ if not options.allowediting then options.allowediting = ide.config.debugger.allowediting end
+
+ if not debugger.scratchpad and not options.allowediting then
+ SetAllEditorsReadOnly(true)
+ end
+
+ debugger.server = copas.wrap(skt)
+ debugger.socket = skt
+ debugger.loop = false
+ debugger.scratchable = false
+ debugger.stats = {line = 0}
+ debugger.missing = {}
+ debugger.editormap = {}
+ debugger.runtocursor = nil
+
+ local wxfilepath = GetEditorFileAndCurInfo()
+ local startfile = ide:GetProjectStartFile() or options.startwith
+ or (wxfilepath and wxfilepath:GetFullPath())
+
+ if not startfile then
+ DisplayOutputLn(TR("Can't start debugging without an opened file or with the current file not being saved ('%s').")
+ :format(ide.config.default.fullname))
+ return debugger.terminate()
+ end
+
+ local startpath = wx.wxFileName(startfile):GetPath(wx.wxPATH_GET_VOLUME + wx.wxPATH_GET_SEPARATOR)
+ local basedir = options.basedir or FileTreeGetDir() or startpath
+ -- guarantee that the path has a trailing separator
+ debugger.basedir = wx.wxFileName.DirName(basedir):GetFullPath()
+
+ -- load the remote file into the debugger
+ -- set basedir first, before loading to make sure that the path is correct
+ debugger.handle("basedir " .. debugger.basedir)
+
+ local init = options.init or ide.config.debugger.init
+ if init then
+ local _, _, err = debugger.execute(init)
+ if err then DisplayOutputLn(TR("Ignored error in debugger initialization code: %s."):format(err)) end
+ end
+
+ reSetBreakpoints()
+
+ local redirect = ide.config.debugger.redirect or options.redirect
+ if redirect then
+ debugger.handle("output stdout " .. redirect, nil,
+ { handler = function(m)
+ -- if it's an error returned, then handle the error
+ if m and m:find("stack traceback:", 1, true) then
+ -- this is an error message sent remotely
+ local ok, res = LoadSafe("return "..m)
+ if ok then
+ DisplayOutputLn(res)
+ return
+ end
+ end
+
+ if ide.config.debugger.outputfilter then
+ local ok, res = pcall(ide.config.debugger.outputfilter, m)
+ if ok then
+ m = res
+ else
+ DisplayOutputLn("Output filter failed: "..res)
+ return
+ end
+ elseif m then
+ local max = 240
+ m = #m < max+4 and m or m:sub(1,max) .. "...\n"
+ end
+ if m then DisplayOutputNoMarker(m) end
+ end})
+ end
+
+ if (options.startwith) then
+ local file, line, err = debugger.loadfile(options.startwith)
+ if err then
+ DisplayOutputLn(TR("Can't run the entry point script ('%s').")
+ :format(options.startwith)
+ .." "..TR("Compilation error")
+ ..":\n"..err)
+ return debugger.terminate()
+ elseif options.runstart and not debugger.scratchpad then
+ if stoppedAtBreakpoint(file, line) then
+ activateDocument(file, line)
+ options.runstart = false
+ end
+ elseif file and line then
+ DisplayOutputLn(TR("Debugging suspended at '%s:%s' (couldn't activate the file).")
+ :format(file, line))
+ end
+ elseif not (options.run or debugger.scratchpad) then
+ local file, line, err = debugger.loadfile(startfile)
+ -- "load" can work in two ways: (1) it can load the requested file
+ -- OR (2) it can "refuse" to load it if the client was started
+ -- with start() method, which can't load new files
+ -- if file and line are set, this indicates option #2
+ if err then
+ DisplayOutputLn(TR("Can't start debugging for '%s'."):format(startfile)
+ .." "..TR("Compilation error")
+ ..":\n"..err)
+ return debugger.terminate()
+ elseif options.runstart then
+ local file = (mapRemotePath(basedir, file, line or 0, activate.CHECKONLY)
+ or file or startfile)
+
+ if stoppedAtBreakpoint(file, line or 0) then
+ activateDocument(file, line or 0)
+ options.runstart = false
+ end
+ elseif file and line then
+ local activated = activateDocument(file, line, activate.NOREPORT)
+
+ -- if not found, check using full file path and reset basedir
+ if not activated and not wx.wxIsAbsolutePath(file) then
+ activated = activateDocument(startpath..file, line, activate.NOREPORT)
+ if activated then
+ debugger.basedir = startpath
+ debugger.handle("basedir " .. debugger.basedir)
+ -- reset breakpoints again as basedir has changed
+ reSetBreakpoints()
+ end
+ end
+
+ -- if not found and the files doesn't exist, it may be
+ -- a remote call; try to map it to the project folder.
+ -- also check for absolute path as it may need to be remapped
+ -- when autoactivation is disabled.
+ if not activated and (not wx.wxFileName(file):FileExists()
+ or wx.wxIsAbsolutePath(file)) then
+ if mapRemotePath(basedir, file, line, activate.NOREPORT) then
+ activated = true
+ end
+ end
+
+ if not activated then
+ DisplayOutputLn(TR("Debugging suspended at '%s:%s' (couldn't activate the file).")
+ :format(file, line))
+ end
+
+ -- debugger may still be available for scratchpad,
+ -- if the interpreter signals scratchpad support, so enable it.
+ debugger.scratchable = ide.interpreter.scratchextloop ~= nil
+ else
+ debugger.scratchable = true
+ local activated = activateDocument(startfile, 0) -- find the appropriate line
+ if not activated then
+ DisplayOutputLn(TR("Debugging suspended at '%s:%s' (couldn't activate the file).")
+ :format(startfile, '?'))
+ end
+ end
+ end
+
+ if (not options.noshell and not debugger.scratchpad) then
+ ShellSupportRemote(debugger.shell)
+ end
+
+ debuggerToggleViews(true)
+ updateStackSync()
+ updateWatchesSync()
+
+ DisplayOutputLn(TR("Debugging session started in '%s'."):format(debugger.basedir))
+
+ if (debugger.scratchpad) then
+ debugger.scratchpad.updated = true
+ else
+ if (options.runstart) then
+ ClearAllCurrentLineMarkers()
+ debugger.run()
+ end
+ if (options.run) then
+ local file, line = debugger.handle("run")
+ activateDocument(file, line)
+ end
+ end
+
+ -- request attention if the debugging is stopped
+ if not debugger.running then RequestAttention() end
+ -- refresh toolbar and menus in case the main app is not active
+ ide:GetMainFrame():UpdateWindowUI(wx.wxUPDATE_UI_FROMIDLE)
+ ide:GetToolBar():UpdateWindowUI(wx.wxUPDATE_UI_FROMIDLE)
+ end)
+ debugger.listening = server
+end
+
+local function nameOutputTab(name)
+ local nbk = ide.frame.bottomnotebook
+ local index = nbk:GetPageIndex(ide:GetOutput())
+ if index ~= -1 then nbk:SetPageText(index, name) end
+end
+
+debugger.handle = function(command, server, options)
+ local verbose = ide.config.debugger.verbose
+ local gprint = _G.print
+ _G.print = function (...) if verbose then DisplayOutputLn(...) end end
+
+ nameOutputTab(TR("Output (running)"))
+ debugger.running = true
+ if verbose then DisplayOutputLn("Debugger sent (command):", command) end
+ local file, line, err = mobdebug.handle(command, server or debugger.server, options)
+ if verbose then DisplayOutputLn("Debugger received (file, line, err):", file, line, err) end
+ debugger.running = false
+ -- only set suspended if the debugging hasn't been terminated
+ if debugger.server then nameOutputTab(TR("Output (suspended)")) end
+
+ _G.print = gprint
+ return file, line, err
+end
+
+debugger.exec = function(command, func)
+ if debugger.server and not debugger.running then
+ copas.addthread(function ()
+ -- execute a custom function (if any) in the context of this thread
+ if type(func) == 'function' then func() end
+ local out
+ local attempts = 0
+ while true do
+ -- clear markers before running the command
+ -- don't clear if running trace as the marker is then invisible,
+ -- and it needs to be visible during tracing
+ if not debugger.loop then ClearAllCurrentLineMarkers() end
+ debugger.breaking = false
+ local file, line, err = debugger.handle(out or command)
+ if out then out = nil end
+ if line == nil then
+ if err then DisplayOutputLn(err) end
+ DebuggerStop()
+ return
+ elseif not debugger.server then
+ -- it is possible that while debugger.handle call was executing
+ -- the debugging was terminated; simply return in this case.
+ return
+ else
+ if activateDocument(file, line) then
+ debugger.stats.line = debugger.stats.line + 1
+ if debugger.loop then
+ updateStackSync()
+ updateWatchesSync()
+ else
+ updateStackAndWatches()
+ return
+ end
+ else
+ -- clear the marker as it wasn't cleared earlier
+ if debugger.loop then ClearAllCurrentLineMarkers() end
+ -- we may be in some unknown location at this point;
+ -- If this happens, stop and report allowing users to set
+ -- breakpoints and step through.
+ if debugger.breaking then
+ DisplayOutputLn(TR("Debugging suspended at '%s:%s' (couldn't activate the file).")
+ :format(file, line))
+ updateStackAndWatches()
+ return
+ end
+ -- redo now; if the call is from the debugger, then repeat
+ -- the same command, except when it was "run" (switch to 'step');
+ -- this is needed to "break" execution that happens in on() call.
+ -- in all other cases get out of this file.
+ -- don't get out of "mobdebug", because it may happen with
+ -- start() or on() call, which will get us out of the current
+ -- file, which is not what we want.
+ -- Some engines (Corona SDK) report =?:0 as the current location.
+ -- repeat the same command, but check if this has been tried
+ -- too many times already; if so, get "out"
+ out = ((tonumber(line) == 0 and attempts < 10) and command
+ or (file:find('mobdebug%.lua$')
+ and (command == 'run' and 'step' or command) or "out"))
+ attempts = attempts + 1
+ end
+ end
+ end
+ end)
+ end
+end
+
+debugger.handleAsync = function(command)
+ if debugger.server and not debugger.running then
+ copas.addthread(function () debugger.handle(command) end)
+ end
+end
+debugger.handleDirect = function(command)
+ local sock = debugger.socket
+ if debugger.server and sock then
+ local running = debugger.running
+ -- this needs to be short as it will block the UI
+ sock:settimeout(0.25)
+ debugger.handle(command, sock)
+ sock:settimeout(0)
+ -- restore running status
+ debugger.running = running
+ end
+end
+
+debugger.loadfile = function(file)
+ local f, l, err = debugger.handle("load " .. file)
+ if not f and wx.wxFileExists(file) and err and err:find("Cannot open file") then
+ local content = FileRead(file)
+ if content then return debugger.loadstring(file, content) end
+ end
+ return f, l, err
+end
+debugger.loadstring = function(file, string)
+ return debugger.handle("loadstring '" .. file .. "' " .. string)
+end
+
+do
+ local nextupdatedelta = 0.250
+ local nextupdate = TimeGet() + nextupdatedelta
+ local function forceUpdateOnWrap(editor)
+ -- http://www.scintilla.org/ScintillaDoc.html#LineWrapping
+ -- Scintilla doesn't perform wrapping immediately after a content change
+ -- for performance reasons, so the activation calculations can be wrong
+ -- if there is wrapping that pushes the current line out of the screen.
+ -- force editor update that performs wrapping recalculation.
+ if ide.config.editor.usewrap then editor:Update(); editor:Refresh() end
+ end
+ debugger.update = function()
+ if debugger.server or debugger.listening and TimeGet() > nextupdate then
+ copas.step(0)
+ nextupdate = TimeGet() + nextupdatedelta
+ end
+
+ -- if there is any pending activation
+ if debugger.activate then
+ local file, line, content = unpack(debugger.activate)
+ debugger.activate = nil
+ if content then
+ local editor = NewFile()
+ editor:SetTextDyn(content)
+ if not ide.config.debugger.allowediting
+ and not (debugger.options or {}).allowediting then
+ editor:SetReadOnly(true)
+ end
+ forceUpdateOnWrap(editor)
+ activateDocument(file, line)
+ else
+ local editor = LoadFile(file)
+ if editor then
+ forceUpdateOnWrap(editor)
+ activateDocument(file, line)
+ end
+ end
+ end
+ end
+end
+
+local function isemptyline(editor, line)
+ local text = editor:GetLineDyn(line-1)
+ return not text:find("%S")
+ or (text:find("^%s*%-%-") ~= nil and text:find("^%s*%-%-%[=*%[") == nil)
+end
+
+debugger.terminate = function()
+ if debugger.server then
+ if debugger.pid then -- if there is PID, try local kill
+ killClient()
+ else -- otherwise, try graceful exit for the remote process
+ debugger.breaknow("exit")
+ end
+ DebuggerStop()
+ end
+end
+debugger.step = function() debugger.exec("step") end
+debugger.trace = function()
+ debugger.loop = true
+ debugger.exec("step")
+end
+debugger.runto = function(editor, line)
+ -- check if the location is valid for a breakpoint
+ if isemptyline(editor, line+1) then return end
+
+ local ed, ln = unpack(debugger.runtocursor or {})
+ local same = ed and ln and ed:GetId() == editor:GetId() and ln == line
+
+ -- check if there is already a breakpoint in the "run to" location;
+ -- if so, don't mark the location as "run to" as it will stop there anyway
+ if bit.band(editor:MarkerGet(line), BREAKPOINT_MARKER_VALUE) > 0
+ and not same then
+ debugger.runtocursor = nil
+ debugger.run()
+ return
+ end
+
+ -- save the location of the breakpoint
+ debugger.runtocursor = {editor, line}
+ -- set breakpoint and execute run
+ debugger.exec("run", function()
+ -- if run-to-cursor location is already set, then remove the breakpoint,
+ -- but only if this location is different
+ if ed and ln and not same then
+ DebuggerToggleBreakpoint(ed, ln)
+ debugger.wait()
+ end
+ if not same then
+ DebuggerToggleBreakpoint(editor, line)
+ debugger.wait()
+ end
+ end)
+end
+debugger.wait = function()
+ -- wait for all results to come back
+ while debugger.running do debugger.update() end
+end
+debugger.over = function() debugger.exec("over") end
+debugger.out = function() debugger.exec("out") end
+debugger.run = function() debugger.exec("run") end
+debugger.detach = function()
+ if debugger.running then
+ debugger.handleDirect("done")
+ debugger.server = nil
+ else
+ debugger.exec("done")
+ end
+end
+debugger.evaluate = function(expression) return debugger.handle('eval ' .. expression) end
+debugger.execute = function(expression) return debugger.handle('exec ' .. expression) end
+debugger.stack = function() return debugger.handle('stack') end
+debugger.breaknow = function(command)
+ -- stop if we're running a "trace" command
+ debugger.loop = false
+
+ -- force suspend command; don't use copas interface as it checks
+ -- for the other side "reading" and the other side is not reading anything.
+ -- use the "original" socket to send "suspend" command.
+ -- this will only break on the next Lua command.
+ if debugger.socket then
+ local running = debugger.running
+ -- this needs to be short as it will block the UI
+ debugger.socket:settimeout(0.25)
+ local file, line, err = debugger.handle(command or "suspend", debugger.socket)
+ debugger.socket:settimeout(0)
+ -- restore running status
+ debugger.running = running
+ debugger.breaking = true
+ -- don't need to do anything else as the earlier call (run, step, etc.)
+ -- will get the results (file, line) back and will update the UI
+ return file, line, err
+ end
+end
+debugger.breakpoint = function(file, line, state)
+ if debugger.running then
+ return debugger.handleDirect((state and "asetb " or "adelb ") .. file .. " " .. line)
+ end
+ return debugger.handleAsync((state and "setb " or "delb ") .. file .. " " .. line)
+end
+debugger.quickeval = function(var, callback)
+ if debugger.server and not debugger.running
+ and not debugger.scratchpad and not (debugger.options or {}).noeval then
+ copas.addthread(function ()
+ local _, values, err = debugger.evaluate(var)
+ local val = err
+ and err:gsub("%[.-%]:%d+:%s*","error: ")
+ or (var .. " = " .. (#values > 0 and values[1] or 'nil'))
+ if callback then callback(val) end
+ end)
+ end
+end
+
+local width, height = 360, 200
+
+local keyword = {}
+for _,k in ipairs({'and', 'break', 'do', 'else', 'elseif', 'end', 'false',
+ 'for', 'function', 'goto', 'if', 'in', 'local', 'nil', 'not', 'or', 'repeat',
+ 'return', 'then', 'true', 'until', 'while'}) do keyword[k] = true end
+
+local function stringifyKeyIntoPrefix(name, num)
+ return (type(name) == "number"
+ and (num and num == name and '' or ("[%s] = "):format(name))
+ or type(name) == "string" and (name:match("^[%l%u_][%w_]*$") and not keyword[name]
+ and ("%s = "):format(name)
+ or ("[%q] = "):format(name))
+ or ("[%s] = "):format(tostring(name)))
+end
+
+local function debuggerCreateStackWindow()
+ local stackCtrl = wx.wxTreeCtrl(ide.frame, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxSize(width, height),
+ wx.wxTR_LINES_AT_ROOT + wx.wxTR_HAS_BUTTONS + wx.wxTR_SINGLE
+ + wx.wxTR_HIDE_ROOT + wx.wxNO_BORDER)
+
+ debugger.stackCtrl = stackCtrl
+
+ stackCtrl:SetImageList(debugger.imglist)
+
+ local valuecache = {}
+ function stackCtrl:SetItemValueIfExpandable(item, value)
+ local expandable = type(value) == 'table' and next(value) ~= nil
+ if expandable then -- cache table value to expand when requested
+ valuecache[item:GetValue()] = value
+ end
+ self:SetItemHasChildren(item, expandable)
+ end
+
+ function stackCtrl:DeleteAll()
+ self:DeleteAllItems()
+ valuecache = {}
+ end
+
+ function stackCtrl:GetItemChildren(item)
+ return valuecache[item:GetValue()] or {}
+ end
+
+ stackCtrl:Connect(wx.wxEVT_COMMAND_TREE_ITEM_EXPANDING,
+ function (event)
+ local item_id = event:GetItem()
+ local count = stackCtrl:GetChildrenCount(item_id, false)
+ if count > 0 then return true end
+
+ local image = stackCtrl:GetItemImage(item_id)
+ local num = 1
+ for name,value in pairs(stackCtrl:GetItemChildren(item_id)) do
+ local strval = fixUTF8(trimToMaxLength(serialize(value, params)))
+ local text = stringifyKeyIntoPrefix(name, num)..strval
+ local item = stackCtrl:AppendItem(item_id, text, image)
+ stackCtrl:SetItemValueIfExpandable(item, value)
+
+ num = num + 1
+ if num > stackmaxnum then break end
+ end
+ return true
+ end)
+
+ stackCtrl:Connect(wx.wxEVT_SET_FOCUS, function(event)
+ if debugger.needrefresh.stack then
+ updateStack()
+ debugger.needrefresh.stack = false
+ end
+ end)
+
+ -- register navigation callback
+ stackCtrl:Connect(wx.wxEVT_LEFT_DCLICK, function (event)
+ local item_id = stackCtrl:HitTest(event:GetPosition())
+ if not item_id or not item_id:IsOk() then event:Skip() return end
+
+ local coords = callData[item_id:GetValue()]
+ if not coords then event:Skip() return end
+
+ local file, line = coords[1], coords[2]
+ if file:match("@") then file = string.sub(file, 2) end
+ file = GetFullPathIfExists(debugger.basedir, file)
+ if file then
+ local editor = LoadFile(file,nil,true)
+ editor:SetFocus()
+ if line then editor:GotoLine(line-1) end
+ end
+ end)
+
+ local layout = ide:GetSetting("/view", "uimgrlayout")
+ if layout and not layout:find("stackpanel") then
+ ide:AddPanelDocked(ide.frame.bottomnotebook, stackCtrl, "stackpanel", TR("Stack"))
+ else
+ ide:AddPanel(stackCtrl, "stackpanel", TR("Stack"))
+ end
+end
+
+local function debuggerCreateWatchWindow()
+ local watchCtrl = wx.wxTreeCtrl(ide.frame, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxSize(width, height),
+ wx.wxTR_LINES_AT_ROOT + wx.wxTR_HAS_BUTTONS + wx.wxTR_SINGLE
+ + wx.wxTR_HIDE_ROOT + wx.wxTR_EDIT_LABELS + wx.wxNO_BORDER)
+
+ debugger.watchCtrl = watchCtrl
+
+ local root = watchCtrl:AddRoot("Watch")
+ watchCtrl:SetImageList(debugger.imglist)
+
+ local defaultExpr = "watch expression"
+ local expressions = {} -- table to keep track of expressions
+
+ function watchCtrl:SetItemExpression(item, expr, value)
+ expressions[item:GetValue()] = expr
+ self:SetItemText(item, expr .. ' = ' .. (value or '?'))
+ self:SelectItem(item, true)
+ if not value then updateWatches(item) end
+ end
+
+ function watchCtrl:GetItemExpression(item)
+ return expressions[item:GetValue()]
+ end
+
+ local names = {}
+ function watchCtrl:SetItemName(item, name)
+ local nametype = type(name)
+ names[item:GetValue()] = (
+ (nametype == 'string' or nametype == 'number' or nametype == 'boolean')
+ and name or nil
+ )
+ end
+
+ function watchCtrl:GetItemName(item)
+ return names[item:GetValue()]
+ end
+
+ local valuecache = {}
+ function watchCtrl:SetItemValueIfExpandable(item, value)
+ local expandable = type(value) == 'table' and next(value) ~= nil
+ valuecache[item:GetValue()] = expandable and value or nil
+ self:SetItemHasChildren(item, expandable)
+ end
+
+ function watchCtrl:GetItemChildren(item)
+ return valuecache[item:GetValue()] or {}
+ end
+
+ function watchCtrl:IsWatch(item)
+ return item:IsOk() and watchCtrl:GetItemParent(item):GetValue() == root:GetValue()
+ end
+
+ function watchCtrl:IsEditable(item)
+ return (item and item:IsOk()
+ and (watchCtrl:IsWatch(item) or watchCtrl:GetItemName(item) ~= nil))
+ end
+
+ function watchCtrl:GetItemFullExpression(item)
+ local expr = ''
+ while true do
+ local name = watchCtrl:GetItemName(item)
+ expr = (watchCtrl:IsWatch(item)
+ and ('({%s})[1]'):format(watchCtrl:GetItemExpression(item))
+ or (type(name) == 'string' and '[%q]' or '[%s]'):format(tostring(name))
+ )..expr
+ if watchCtrl:IsWatch(item) then break end
+ item = watchCtrl:GetItemParent(item)
+ if not item:IsOk() then break end
+ end
+ return expr, item:IsOk() and item or nil
+ end
+
+ function watchCtrl:CopyItemValue(item)
+ local expr = self:GetItemFullExpression(item)
+
+ if debugger.running then debugger.update() end
+ if debugger.server and not debugger.running
+ and (not debugger.scratchpad or debugger.scratchpad.paused) then
+ copas.addthread(function ()
+ local _, values, error = debugger.evaluate(expr)
+ ide:CopyToClipboard(error and error:gsub("%[.-%]:%d+:%s+","")
+ or (#values == 0 and 'nil' or values[1]))
+ end)
+ end
+ end
+
+ function watchCtrl:UpdateItemValue(item, value)
+ local expr, itemupd = self:GetItemFullExpression(item)
+
+ if debugger.running then debugger.update() end
+ if debugger.server and not debugger.running
+ and (not debugger.scratchpad or debugger.scratchpad.paused) then
+ copas.addthread(function ()
+ local _, _, err = debugger.execute(expr..'='..value)
+ if err then
+ watchCtrl:SetItemText(item, 'error: '..err:gsub("%[.-%]:%d+:%s+",""))
+ elseif itemupd then
+ updateWatchesSync(itemupd)
+ end
+ updateStackSync()
+ end)
+ end
+ end
+
+ watchCtrl:Connect(wx.wxEVT_COMMAND_TREE_ITEM_EXPANDING,
+ function (event)
+ local item_id = event:GetItem()
+ local count = watchCtrl:GetChildrenCount(item_id, false)
+ if count > 0 then return true end
+
+ local image = watchCtrl:GetItemImage(item_id)
+ local num = 1
+ for name,value in pairs(watchCtrl:GetItemChildren(item_id)) do
+ local strval = fixUTF8(trimToMaxLength(serialize(value, params)))
+ local text = stringifyKeyIntoPrefix(name, num)..strval
+ local item = watchCtrl:AppendItem(item_id, text, image)
+ watchCtrl:SetItemValueIfExpandable(item, value)
+ watchCtrl:SetItemName(item, name)
+
+ num = num + 1
+ if num > stackmaxnum then break end
+ end
+ return true
+ end)
+
+ watchCtrl:Connect(wx.wxEVT_COMMAND_TREE_DELETE_ITEM,
+ function (event)
+ local value = event:GetItem():GetValue()
+ expressions[value] = nil
+ valuecache[value] = nil
+ names[value] = nil
+ end)
+
+ watchCtrl:Connect(wx.wxEVT_SET_FOCUS, function(event)
+ if debugger.needrefresh.watches then
+ updateWatches()
+ debugger.needrefresh.watches = false
+ end
+ end)
+
+
+ local item
+ -- wx.wxEVT_CONTEXT_MENU is only triggered over tree items on OSX,
+ -- but it needs to be also triggered below any item to add a watch,
+ -- so use RIGHT_DOWN instead
+ watchCtrl:Connect(wx.wxEVT_RIGHT_DOWN,
+ function (event)
+ -- store the item to be used in edit/delete actions
+ item = watchCtrl:HitTest(watchCtrl:ScreenToClient(wx.wxGetMousePosition()))
+ local editlabel = watchCtrl:IsWatch(item) and TR("&Edit Watch") or TR("&Edit Value")
+ local menu = wx.wxMenu {
+ { ID_ADDWATCH, TR("&Add Watch")..KSC(ID_ADDWATCH) },
+ { ID_EDITWATCH, editlabel..KSC(ID_EDITWATCH) },
+ { ID_DELETEWATCH, TR("&Delete Watch")..KSC(ID_DELETEWATCH) },
+ { ID_COPYWATCHVALUE, TR("&Copy Value")..KSC(ID_COPYWATCHVALUE) },
+ }
+ PackageEventHandle("onMenuWatch", menu, watchCtrl, event)
+ watchCtrl:PopupMenu(menu)
+ item = nil
+ end)
+
+ watchCtrl:Connect(ID_ADDWATCH, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event) watchCtrl:EditLabel(watchCtrl:AppendItem(root, defaultExpr, image.LOCAL)) end)
+
+ watchCtrl:Connect(ID_EDITWATCH, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event) watchCtrl:EditLabel(item or watchCtrl:GetSelection()) end)
+ watchCtrl:Connect(ID_EDITWATCH, wx.wxEVT_UPDATE_UI,
+ function (event) event:Enable(watchCtrl:IsEditable(item or watchCtrl:GetSelection())) end)
+
+ watchCtrl:Connect(ID_DELETEWATCH, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event) watchCtrl:Delete(item or watchCtrl:GetSelection()) end)
+ watchCtrl:Connect(ID_DELETEWATCH, wx.wxEVT_UPDATE_UI,
+ function (event) event:Enable(watchCtrl:IsWatch(item or watchCtrl:GetSelection())) end)
+
+ watchCtrl:Connect(ID_COPYWATCHVALUE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event) watchCtrl:CopyItemValue(item or watchCtrl:GetSelection()) end)
+ watchCtrl:Connect(ID_COPYWATCHVALUE, wx.wxEVT_UPDATE_UI, function (event)
+ -- allow copying only when the debugger is available
+ event:Enable(item:IsOk() and debugger.server and not debugger.running
+ and (not debugger.scratchpad or debugger.scratchpad.paused))
+ end)
+
+ local label
+ watchCtrl:Connect(wx.wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT,
+ function (event)
+ local item = event:GetItem()
+ if not (item:IsOk() and watchCtrl:IsEditable(item)) then
+ event:Veto()
+ return
+ end
+
+ label = watchCtrl:GetItemText(item)
+
+ if watchCtrl:IsWatch(item) then
+ local expr = watchCtrl:GetItemExpression(item)
+ if expr then watchCtrl:SetItemText(item, expr) end
+ else
+ local prefix = stringifyKeyIntoPrefix(watchCtrl:GetItemName(item))
+ local val = watchCtrl:GetItemText(item):gsub(q(prefix),'')
+ watchCtrl:SetItemText(item, val)
+ end
+ end)
+ watchCtrl:Connect(wx.wxEVT_COMMAND_TREE_END_LABEL_EDIT,
+ function (event)
+ event:Veto()
+
+ local item = event:GetItem()
+ if event:IsEditCancelled() then
+ if watchCtrl:GetItemText(item) == defaultExpr then
+ -- when Delete is called from END_EDIT, it causes infinite loop
+ -- on OSX (wxwidgets 2.9.5) as Delete calls END_EDIT again.
+ -- disable handlers during Delete and then enable back.
+ watchCtrl:SetEvtHandlerEnabled(false)
+ watchCtrl:Delete(item)
+ watchCtrl:SetEvtHandlerEnabled(true)
+ else
+ watchCtrl:SetItemText(item, label)
+ end
+ else
+ if watchCtrl:IsWatch(item) then
+ watchCtrl:SetItemExpression(item, event:GetLabel())
+ else
+ watchCtrl:UpdateItemValue(item, event:GetLabel())
+ end
+ end
+ event:Skip()
+ end)
+
+ local layout = ide:GetSetting("/view", "uimgrlayout")
+ if layout and not layout:find("watchpanel") then
+ ide:AddPanelDocked(ide.frame.bottomnotebook, watchCtrl, "watchpanel", TR("Watch"))
+ else
+ ide:AddPanel(watchCtrl, "watchpanel", TR("Watch"))
+ end
+end
+
+debuggerCreateStackWindow()
+debuggerCreateWatchWindow()
+
+----------------------------------------------
+-- public api
+
+DebuggerRefreshPanels = updateStackAndWatches
+
+function DebuggerAttachDefault(options)
+ debugger.options = options
+ if (debugger.listening) then return end
+ debugger.listen()
+end
+
+function DebuggerShutdown()
+ if debugger.server then debugger.terminate() end
+ if debugger.pid then killClient() end
+end
+
+function DebuggerStop(resetpid)
+ if (debugger.server) then
+ debugger.server = nil
+ SetAllEditorsReadOnly(false)
+ ShellSupportRemote(nil)
+ ClearAllCurrentLineMarkers()
+ DebuggerScratchpadOff()
+ debuggerToggleViews(false)
+ local lines = TR("traced %d instruction", debugger.stats.line):format(debugger.stats.line)
+ DisplayOutputLn(TR("Debugging session completed (%s)."):format(lines))
+ nameOutputTab(debugger.pid and TR("Output (running)") or TR("Output"))
+ if debugger.runtocursor then
+ local ed, ln = unpack(debugger.runtocursor)
+ DebuggerToggleBreakpoint(ed, ln)
+ end
+ else
+ -- it's possible that the application couldn't start, or that the
+ -- debugger in the application didn't start, which means there is
+ -- no debugger.server, but scratchpad may still be on. Turn it off.
+ DebuggerScratchpadOff()
+ end
+ -- reset pid for "running" (not debugged) processes
+ if resetpid then debugger.pid = nil end
+end
+
+local function debuggerMakeFileName(editor)
+ return ide:GetDocument(editor):GetFilePath()
+ or ide:GetDocument(editor):GetFileName()
+ or ide.config.default.fullname
+end
+
+function DebuggerToggleBreakpoint(editor, line, value)
+ local isset = bit.band(editor:MarkerGet(line), BREAKPOINT_MARKER_VALUE) > 0
+ if value ~= nil and isset == value then return end
+ local filePath = debugger.editormap and debugger.editormap[editor]
+ or debuggerMakeFileName(editor)
+ if isset then
+ -- if there is pending "run-to-cursor" call at this location, remove it
+ local ed, ln = unpack(debugger.runtocursor or {})
+ local same = ed and ln and ed:GetId() == editor:GetId() and ln == line
+ if same then debugger.runtocursor = nil end
+
+ editor:MarkerDelete(line, BREAKPOINT_MARKER)
+ if debugger.server then debugger.breakpoint(filePath, line+1, false) end
+ else
+ if isemptyline(editor, line+1) then return end
+
+ editor:MarkerAdd(line, BREAKPOINT_MARKER)
+ if debugger.server then debugger.breakpoint(filePath, line+1, true) end
+ end
+ PackageEventHandle("onEditorMarkerUpdate", editor, BREAKPOINT_MARKER, line+1, not isset)
+end
+
+-- scratchpad functions
+
+function DebuggerRefreshScratchpad()
+ if debugger.scratchpad and debugger.scratchpad.updated and not debugger.scratchpad.paused then
+
+ local scratchpadEditor = debugger.scratchpad.editor
+ if scratchpadEditor.spec.apitype
+ and scratchpadEditor.spec.apitype == "lua"
+ and not ide.interpreter.skipcompile
+ and not CompileProgram(scratchpadEditor, { jumponerror = false, reportstats = false })
+ then return end
+
+ local code = StripShebang(scratchpadEditor:GetTextDyn())
+ if debugger.scratchpad.running then
+ -- break the current execution first
+ -- don't try too frequently to avoid overwhelming the debugger
+ local now = TimeGet()
+ if now - debugger.scratchpad.running > 0.250 then
+ debugger.breaknow()
+ debugger.scratchpad.running = now
+ end
+ else
+ local clear = ide:GetMenuBar():IsChecked(ID_CLEAROUTPUT)
+ local filePath = debuggerMakeFileName(scratchpadEditor)
+
+ -- wrap into a function call to make "return" to work with scratchpad
+ code = "(function()"..code.."\nend)()"
+
+ -- this is a special error message that is generated at the very end
+ -- of each script to avoid exiting the (debugee) scratchpad process.
+ -- these errors are handled and not reported to the user
+ local errormsg = 'execution suspended at ' .. TimeGet()
+ local stopper = "error('" .. errormsg .. "')"
+ -- store if interpreter requires a special handling for external loop
+ local extloop = ide.interpreter.scratchextloop
+
+ local function reloadScratchpadCode()
+ debugger.scratchpad.running = TimeGet()
+ debugger.scratchpad.updated = false
+ debugger.scratchpad.runs = (debugger.scratchpad.runs or 0) + 1
+
+ if clear then ClearOutput(true) end
+
+ -- the code can be running in two ways under scratchpad:
+ -- 1. controlled by the application, requires stopper (most apps)
+ -- 2. controlled by some external loop (for example, love2d).
+ -- in the first case we need to reload the app after each change
+ -- in the second case, we need to load the app once and then
+ -- "execute" new code to reflect the changes (with some limitations).
+ local _, _, err
+ if extloop then -- if the execution is controlled by an external loop
+ if debugger.scratchpad.runs == 1
+ then _, _, err = debugger.loadstring(filePath, code)
+ else _, _, err = debugger.execute(code) end
+ else _, _, err = debugger.loadstring(filePath, code .. stopper) end
+
+ -- when execute() is used, it's not possible to distinguish between
+ -- compilation and run-time error, so just report as "Scratchpad error"
+ local prefix = extloop and TR("Scratchpad error") or TR("Compilation error")
+
+ if not err then
+ _, _, err = debugger.handle("run")
+ prefix = TR("Execution error")
+ end
+ if err and not err:find(errormsg) then
+ local fragment, line = err:match('.-%[string "([^\010\013]+)"%]:(%d+)%s*:')
+ -- make the code shorter to better see the error message
+ if prefix == TR("Scratchpad error") and fragment and #fragment > 30 then
+ err = err:gsub(q(fragment), function(s) return s:sub(1,30)..'...' end)
+ end
+ DisplayOutputLn(prefix
+ ..(line and (" "..TR("on line %d"):format(line)) or "")
+ ..":\n"..err:gsub('stack traceback:.+', ''):gsub('\n+$', ''))
+ end
+ debugger.scratchpad.running = false
+ end
+
+ copas.addthread(reloadScratchpadCode)
+ end
+ end
+end
+
+local numberStyle = wxstc.wxSTC_LUA_NUMBER
+
+function DebuggerScratchpadOn(editor)
+ -- first check if there is already scratchpad editor.
+ -- this may happen when more than one editor is being added...
+
+ if debugger.scratchpad and debugger.scratchpad.editors then
+ debugger.scratchpad.editors[editor] = true
+ else
+ debugger.scratchpad = {editor = editor, editors = {[editor] = true}}
+
+ -- check if the debugger is already running; this happens when
+ -- scratchpad is turned on after external script has connected
+ if debugger.server then
+ debugger.scratchpad.updated = true
+ ClearAllCurrentLineMarkers()
+ SetAllEditorsReadOnly(false)
+ ShellSupportRemote(nil) -- disable remote shell
+ DebuggerRefreshScratchpad()
+ elseif not ProjectDebug(true, "scratchpad") then
+ debugger.scratchpad = nil
+ return
+ end
+ end
+
+ local scratchpadEditor = editor
+ scratchpadEditor:StyleSetUnderline(numberStyle, true)
+ debugger.scratchpad.margin = scratchpadEditor:GetMarginWidth(0) +
+ scratchpadEditor:GetMarginWidth(1) + scratchpadEditor:GetMarginWidth(2)
+
+ scratchpadEditor:Connect(wxstc.wxEVT_STC_MODIFIED, function(event)
+ local evtype = event:GetModificationType()
+ if (bit.band(evtype,wxstc.wxSTC_MOD_INSERTTEXT) ~= 0 or
+ bit.band(evtype,wxstc.wxSTC_MOD_DELETETEXT) ~= 0 or
+ bit.band(evtype,wxstc.wxSTC_PERFORMED_UNDO) ~= 0 or
+ bit.band(evtype,wxstc.wxSTC_PERFORMED_REDO) ~= 0) then
+ debugger.scratchpad.updated = true
+ debugger.scratchpad.editor = scratchpadEditor
+ end
+ event:Skip()
+ end)
+
+ scratchpadEditor:Connect(wx.wxEVT_LEFT_DOWN, function(event)
+ local scratchpad = debugger.scratchpad
+
+ local point = event:GetPosition()
+ local pos = scratchpadEditor:PositionFromPoint(point)
+
+ -- are we over a number in the scratchpad? if not, it's not our event
+ if ((not scratchpad) or
+ (bit.band(scratchpadEditor:GetStyleAt(pos),31) ~= numberStyle)) then
+ event:Skip()
+ return
+ end
+
+ -- find start position and length of the number
+ local text = scratchpadEditor:GetTextDyn()
+
+ local nstart = pos
+ while nstart >= 0
+ and (bit.band(scratchpadEditor:GetStyleAt(nstart),31) == numberStyle)
+ do nstart = nstart - 1 end
+
+ local nend = pos
+ while nend < string.len(text)
+ and (bit.band(scratchpadEditor:GetStyleAt(nend),31) == numberStyle)
+ do nend = nend + 1 end
+
+ -- check if there is minus sign right before the number and include it
+ if nstart >= 0 and scratchpadEditor:GetTextRangeDyn(nstart,nstart+1) == '-' then
+ nstart = nstart - 1
+ end
+ scratchpad.start = nstart + 1
+ scratchpad.length = nend - nstart - 1
+ scratchpad.origin = scratchpadEditor:GetTextRangeDyn(nstart+1,nend)
+ if tonumber(scratchpad.origin) then
+ scratchpad.point = point
+ scratchpadEditor:BeginUndoAction()
+ scratchpadEditor:CaptureMouse()
+ end
+ end)
+
+ scratchpadEditor:Connect(wx.wxEVT_LEFT_UP, function(event)
+ if debugger.scratchpad and debugger.scratchpad.point then
+ debugger.scratchpad.point = nil
+ scratchpadEditor:EndUndoAction()
+ scratchpadEditor:ReleaseMouse()
+ wx.wxSetCursor(wx.wxNullCursor) -- restore cursor
+ else event:Skip() end
+ end)
+
+ scratchpadEditor:Connect(wx.wxEVT_MOTION, function(event)
+ local point = event:GetPosition()
+ local pos = scratchpadEditor:PositionFromPoint(point)
+ local scratchpad = debugger.scratchpad
+ local ipoint = scratchpad and scratchpad.point
+
+ -- record the fact that we are over a number or dragging slider
+ scratchpad.over = scratchpad and
+ (ipoint ~= nil or (bit.band(scratchpadEditor:GetStyleAt(pos),31) == numberStyle))
+
+ if ipoint then
+ local startpos = scratchpad.start
+ local endpos = scratchpad.start+scratchpad.length
+
+ -- calculate difference in point position
+ local dx = point.x - ipoint.x
+
+ -- calculate the number of decimal digits after the decimal point
+ local origin = scratchpad.origin
+ local decdigits = #(origin:match('%.(%d+)') or '')
+
+ -- calculate new value
+ local value = tonumber(origin) + dx * 10^-decdigits
+
+ -- convert new value back to string to check the number of decimal points
+ -- this is needed because the rate of change is determined by the
+ -- current value. For example, for number 1, the next value is 2,
+ -- but for number 1.1, the next is 1.2 and for 1.01 it is 1.02.
+ -- But if 1.01 becomes 1.00, the both zeros after the decimal point
+ -- need to be preserved to keep the increment ratio the same when
+ -- the user wants to release the slider and start again.
+ origin = tostring(value)
+ local newdigits = #(origin:match('%.(%d+)') or '')
+ if decdigits ~= newdigits then
+ origin = origin .. (origin:find('%.') and '' or '.') .. ("0"):rep(decdigits-newdigits)
+ end
+
+ -- update length
+ scratchpad.length = #origin
+
+ -- update the value in the document
+ scratchpadEditor:SetTargetStart(startpos)
+ scratchpadEditor:SetTargetEnd(endpos)
+ scratchpadEditor:ReplaceTarget(origin)
+ else event:Skip() end
+ end)
+
+ scratchpadEditor:Connect(wx.wxEVT_SET_CURSOR, function(event)
+ if (debugger.scratchpad and debugger.scratchpad.over) then
+ event:SetCursor(wx.wxCursor(wx.wxCURSOR_SIZEWE))
+ elseif debugger.scratchpad and ide.osname == 'Unix' then
+ -- restore the cursor manually on Linux since event:Skip() doesn't reset it
+ local ibeam = event:GetX() > debugger.scratchpad.margin
+ event:SetCursor(wx.wxCursor(ibeam and wx.wxCURSOR_IBEAM or wx.wxCURSOR_RIGHT_ARROW))
+ else event:Skip() end
+ end)
+
+ return true
+end
+
+function DebuggerScratchpadOff()
+ if not debugger.scratchpad then return end
+
+ for scratchpadEditor in pairs(debugger.scratchpad.editors) do
+ scratchpadEditor:StyleSetUnderline(numberStyle, false)
+ scratchpadEditor:Disconnect(wx.wxID_ANY, wx.wxID_ANY, wxstc.wxEVT_STC_MODIFIED)
+ scratchpadEditor:Disconnect(wx.wxID_ANY, wx.wxID_ANY, wx.wxEVT_MOTION)
+ scratchpadEditor:Disconnect(wx.wxID_ANY, wx.wxID_ANY, wx.wxEVT_LEFT_DOWN)
+ scratchpadEditor:Disconnect(wx.wxID_ANY, wx.wxID_ANY, wx.wxEVT_LEFT_UP)
+ scratchpadEditor:Disconnect(wx.wxID_ANY, wx.wxID_ANY, wx.wxEVT_SET_CURSOR)
+ end
+
+ wx.wxSetCursor(wx.wxNullCursor) -- restore cursor
+
+ debugger.scratchpad = nil
+ debugger.terminate()
+
+ -- disable menu if it is still enabled
+ -- (as this may be called when the debugger is being shut down)
+ local menuBar = ide.frame.menuBar
+ if menuBar:IsChecked(ID_RUNNOW) then menuBar:Check(ID_RUNNOW, false) end
+
+ return true
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/editor.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/editor.lua
new file mode 100644
index 0000000..3b42c23
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/editor.lua
@@ -0,0 +1,1619 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Lomtik Software (J. Winwood & John Labenski)
+-- Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local editorID = 100 -- window id to create editor pages with, incremented for new editors
+
+local openDocuments = ide.openDocuments
+local notebook = ide.frame.notebook
+local edcfg = ide.config.editor
+local styles = ide.config.styles
+local unpack = table.unpack or unpack
+local q = EscapeMagic
+
+local margin = { LINENUMBER = 0, MARKER = 1, FOLD = 2 }
+local linenumlen = 4 + 0.5
+local foldtypes = {
+ [0] = { wxstc.wxSTC_MARKNUM_FOLDEROPEN, wxstc.wxSTC_MARKNUM_FOLDER,
+ wxstc.wxSTC_MARKNUM_FOLDERSUB, wxstc.wxSTC_MARKNUM_FOLDERTAIL, wxstc.wxSTC_MARKNUM_FOLDEREND,
+ wxstc.wxSTC_MARKNUM_FOLDEROPENMID, wxstc.wxSTC_MARKNUM_FOLDERMIDTAIL,
+ },
+ box = { wxstc.wxSTC_MARK_BOXMINUS, wxstc.wxSTC_MARK_BOXPLUS,
+ wxstc.wxSTC_MARK_VLINE, wxstc.wxSTC_MARK_LCORNER, wxstc.wxSTC_MARK_BOXPLUSCONNECTED,
+ wxstc.wxSTC_MARK_BOXMINUSCONNECTED, wxstc.wxSTC_MARK_TCORNER,
+ },
+ circle = { wxstc.wxSTC_MARK_CIRCLEMINUS, wxstc.wxSTC_MARK_CIRCLEPLUS,
+ wxstc.wxSTC_MARK_VLINE, wxstc.wxSTC_MARK_LCORNERCURVE, wxstc.wxSTC_MARK_CIRCLEPLUSCONNECTED,
+ wxstc.wxSTC_MARK_CIRCLEMINUSCONNECTED, wxstc.wxSTC_MARK_TCORNERCURVE,
+ },
+ plus = { wxstc.wxSTC_MARK_MINUS, wxstc.wxSTC_MARK_PLUS },
+ arrow = { wxstc.wxSTC_MARK_ARROWDOWN, wxstc.wxSTC_MARK_ARROW },
+}
+
+-- ----------------------------------------------------------------------------
+-- Update the statusbar text of the frame using the given editor.
+-- Only update if the text has changed.
+local statusTextTable = { "OVR?", "R/O?", "Cursor Pos" }
+
+local function updateStatusText(editor)
+ local texts = { "", "", "" }
+ if ide.frame and editor then
+ local pos = editor:GetCurrentPos()
+ local selected = #editor:GetSelectedText()
+ local selections = ide.wxver >= "2.9.5" and editor:GetSelections() or 1
+
+ texts = {
+ iff(editor:GetOvertype(), TR("OVR"), TR("INS")),
+ iff(editor:GetReadOnly(), TR("R/O"), TR("R/W")),
+ table.concat({
+ TR("Ln: %d"):format(editor:LineFromPosition(pos) + 1),
+ TR("Col: %d"):format(editor:GetColumn(pos) + 1),
+ selected > 0 and TR("Sel: %d/%d"):format(selected, selections) or "",
+ }, ' ')}
+ end
+
+ if ide.frame then
+ for n in ipairs(texts) do
+ if (texts[n] ~= statusTextTable[n]) then
+ ide:SetStatus(texts[n], n)
+ statusTextTable[n] = texts[n]
+ end
+ end
+ end
+end
+
+local function updateBraceMatch(editor)
+ local pos = editor:GetCurrentPos()
+ local posp = pos > 0 and pos-1
+ local char = editor:GetCharAt(pos)
+ local charp = posp and editor:GetCharAt(posp)
+ local match = { [string.byte("<")] = true,
+ [string.byte(">")] = true,
+ [string.byte("(")] = true,
+ [string.byte(")")] = true,
+ [string.byte("{")] = true,
+ [string.byte("}")] = true,
+ [string.byte("[")] = true,
+ [string.byte("]")] = true,
+ }
+
+ pos = (match[char] and pos) or (charp and match[charp] and posp)
+
+ if (pos) then
+ -- don't match brackets in markup comments
+ local style = bit.band(editor:GetStyleAt(pos), 31)
+ if (MarkupIsSpecial and MarkupIsSpecial(style)
+ or editor.spec.iscomment[style]) then return end
+
+ local pos2 = editor:BraceMatch(pos)
+ if (pos2 == wxstc.wxSTC_INVALID_POSITION) then
+ editor:BraceBadLight(pos)
+ else
+ editor:BraceHighlight(pos,pos2)
+ end
+ editor.matchon = true
+ elseif(editor.matchon) then
+ editor:BraceBadLight(wxstc.wxSTC_INVALID_POSITION)
+ editor:BraceHighlight(wxstc.wxSTC_INVALID_POSITION,-1)
+ editor.matchon = false
+ end
+end
+
+-- Check if file is altered, show dialog to reload it
+local function isFileAlteredOnDisk(editor)
+ if not editor then return end
+
+ local id = editor:GetId()
+ if openDocuments[id] then
+ local filePath = openDocuments[id].filePath
+ local fileName = openDocuments[id].fileName
+ local oldModTime = openDocuments[id].modTime
+
+ if filePath and (string.len(filePath) > 0) and oldModTime and oldModTime:IsValid() then
+ local modTime = GetFileModTime(filePath)
+ if modTime == nil then
+ openDocuments[id].modTime = nil
+ wx.wxMessageBox(
+ TR("File '%s' no longer exists."):format(fileName),
+ GetIDEString("editormessage"),
+ wx.wxOK + wx.wxCENTRE, ide.frame)
+ elseif not editor:GetReadOnly() and modTime:IsValid() and oldModTime:IsEarlierThan(modTime) then
+ local ret = (edcfg.autoreload and (not ide:GetDocument(editor):IsModified()) and wx.wxYES)
+ or wx.wxMessageBox(
+ TR("File '%s' has been modified on disk."):format(fileName)
+ .."\n"..TR("Do you want to reload it?"),
+ GetIDEString("editormessage"),
+ wx.wxYES_NO + wx.wxCENTRE, ide.frame)
+
+ if ret ~= wx.wxYES or ReLoadFile(filePath, editor, true) then
+ openDocuments[id].modTime = GetFileModTime(filePath)
+ end
+ end
+ end
+ end
+end
+
+local function navigateToPosition(editor, fromPosition, toPosition, length)
+ table.insert(editor.jumpstack, fromPosition)
+ editor:GotoPosEnforcePolicy(toPosition)
+ if length then
+ editor:SetAnchor(toPosition + length)
+ end
+end
+
+local function navigateBack(editor)
+ if #editor.jumpstack == 0 then return end
+ local pos = table.remove(editor.jumpstack)
+ editor:GotoPosEnforcePolicy(pos)
+ return true
+end
+
+-- ----------------------------------------------------------------------------
+-- Get/Set notebook editor page, use nil for current page, returns nil if none
+function GetEditor(selection)
+ if selection == nil then
+ selection = notebook:GetSelection()
+ end
+ local editor
+ if (selection >= 0) and (selection < notebook:GetPageCount())
+ and (notebook:GetPage(selection):GetClassInfo():GetClassName()=="wxStyledTextCtrl") then
+ editor = notebook:GetPage(selection):DynamicCast("wxStyledTextCtrl")
+ end
+ return editor
+end
+
+-- init new notebook page selection, use nil for current page
+function SetEditorSelection(selection)
+ local editor = GetEditor(selection)
+ updateStatusText(editor) -- update even if nil
+ ide.frame:SetTitle(ExpandPlaceholders(ide.config.format.apptitle))
+
+ if editor then
+ editor:SetFocus()
+ editor:SetSTCFocus(true)
+
+ local id = editor:GetId()
+ FileTreeMarkSelected(openDocuments[id] and openDocuments[id].filePath or '')
+ AddToFileHistory(openDocuments[id] and openDocuments[id].filePath)
+ else
+ FileTreeMarkSelected('')
+ end
+
+ SetAutoRecoveryMark()
+end
+
+function GetEditorFileAndCurInfo(nochecksave)
+ local editor = GetEditor()
+ if (not (editor and (nochecksave or SaveIfModified(editor)))) then
+ return
+ end
+
+ local id = editor:GetId()
+ local filepath = openDocuments[id].filePath
+ if not filepath then return end
+
+ local fn = wx.wxFileName(filepath)
+ fn:Normalize()
+
+ local info = {}
+ info.pos = editor:GetCurrentPos()
+ info.line = editor:GetCurrentLine()
+ info.sel = editor:GetSelectedText()
+ info.sel = info.sel and info.sel:len() > 0 and info.sel or nil
+ info.selword = info.sel and info.sel:match("([^a-zA-Z_0-9]+)") or info.sel
+
+ return fn,info
+end
+
+function EditorAutoComplete(editor)
+ if not (editor and editor.spec) then return end
+
+ local pos = editor:GetCurrentPos()
+ -- don't do auto-complete in comments or strings.
+ -- the current position and the previous one have default style (0),
+ -- so we need to check two positions back.
+ local style = pos >= 2 and bit.band(editor:GetStyleAt(pos-2),31) or 0
+ if editor.spec.iscomment[style] or editor.spec.isstring[style] then return end
+
+ -- retrieve the current line and get a string to the current cursor position in the line
+ local line = editor:GetCurrentLine()
+ local linetx = editor:GetLineDyn(line)
+ local linestart = editor:PositionFromLine(line)
+ local localpos = pos-linestart
+
+ local lt = linetx:sub(1,localpos)
+ lt = lt:gsub("%s*(["..editor.spec.sep.."])%s*", "%1")
+ -- strip closed brace scopes
+ lt = lt:gsub("%b()","")
+ lt = lt:gsub("%b{}","")
+ lt = lt:gsub("%b[]",".0")
+ -- remove everything that can't be auto-completed
+ lt = lt:match("[%w_"..q(editor.spec.sep).."]*$")
+
+ -- know now which string is to be completed
+ local userList = CreateAutoCompList(editor, lt, pos)
+
+ -- don't show if what's typed so far matches one of the options
+ local right = linetx:sub(localpos+1,#linetx):match("^([%a_]+[%w_]*)")
+ local left = lt:match("[%w_]*$") -- extract one word on the left (without separators)
+ if userList and #userList > 0 and not userList:find("%f[%w_]"..left..(right or "").."%f[^%w_]") then
+ editor:UserListShow(1, userList)
+ elseif editor:AutoCompActive() then
+ editor:AutoCompCancel()
+ end
+end
+
+local ident = "([a-zA-Z_][a-zA-Z_0-9%.%:]*)"
+local function getValAtPosition(editor, pos)
+ local line = editor:LineFromPosition(pos)
+ local linetx = editor:GetLineDyn(line)
+ local linestart = editor:PositionFromLine(line)
+ local localpos = pos-linestart
+
+ local selected = editor:GetSelectionStart() ~= editor:GetSelectionEnd()
+ and pos >= editor:GetSelectionStart() and pos <= editor:GetSelectionEnd()
+
+ -- check if we have a selected text or an identifier.
+ -- for an identifier, check fragments on the left and on the right.
+ -- this is to match 'io' in 'i^o.print' and 'io.print' in 'io.pr^int'.
+ -- remove square brackets to make tbl[index].x show proper values.
+ local start = linetx:sub(1,localpos)
+ :gsub("%b[]", function(s) return ("."):rep(#s) end)
+ :find(ident.."$")
+
+ local right, funccall = linetx:sub(localpos+1,#linetx):match("^([a-zA-Z_0-9]*)%s*(['\"{%(]?)")
+ local var = selected
+ -- GetSelectedText() returns concatenated text when multiple instances
+ -- are selected, so get the selected text based on start/end
+ and editor:GetTextRangeDyn(editor:GetSelectionStart(), editor:GetSelectionEnd())
+ or (start and linetx:sub(start,localpos):gsub(":",".")..right or nil)
+
+ -- since this function can be called in different contexts, we need
+ -- to detect function call of different types:
+ -- 1. foo.b^ar(... -- the cursor (pos) is on the function name
+ -- 2. foo.bar(..^. -- the cursor (pos) is on the parameter list
+ -- "var" has value for #1 and the following fragment checks for #2
+
+ -- check if the style is the right one; this is to ignore
+ -- comments, strings, numbers (to avoid '1 = 1'), keywords, and such
+ local goodpos = true
+ if start and not selected then
+ local style = bit.band(editor:GetStyleAt(linestart+start),31)
+ if editor.spec.iscomment[style]
+ or (MarkupIsAny and MarkupIsAny(style)) -- markup in comments
+ or editor.spec.isstring[style]
+ or style == wxstc.wxSTC_LUA_NUMBER
+ or style == wxstc.wxSTC_LUA_WORD then
+ goodpos = false
+ end
+ end
+
+ local linetxtopos = linetx:sub(1,localpos)
+ funccall = (#funccall > 0) and goodpos and var
+ or (linetxtopos..")"):match(ident .. "%s*%b()$")
+ or (linetxtopos.."}"):match(ident .. "%s*%b{}$")
+ or (linetxtopos.."'"):match(ident .. "%s*'[^']*'$")
+ or (linetxtopos..'"'):match(ident .. '%s*"[^"]*"$')
+ or nil
+
+ -- don't do anything for strings or comments or numbers
+ if not goodpos then return nil, funccall end
+
+ return var, funccall
+end
+
+local function formatUpToX(s)
+ local x = math.max(20, ide.config.acandtip.width)
+ local splitstr = "([ \t]*)(%S*)([ \t]*)(\n?)"
+ local t = {""}
+ for prefix, word, suffix, newline in s:gmatch(splitstr) do
+ if #(t[#t]) + #prefix + #word > x and #t > 0 then
+ table.insert(t, word..suffix)
+ else
+ t[#t] = t[#t]..prefix..word..suffix
+ end
+ if #newline > 0 then table.insert(t, "") end
+ end
+ return table.concat(t, "\n")
+end
+
+local function callTipFitAndShow(editor, pos, tip)
+ local point = editor:PointFromPosition(pos)
+ local height = editor:TextHeight(pos)
+ local maxlines = math.max(1, math.floor(
+ math.max(editor:GetSize():GetHeight()-point:GetY()-height, point:GetY())/height-1
+ ))
+ -- cut the tip to not exceed the number of maxlines.
+ -- move the position to the left if needed to fit.
+ -- find the longest line in terms of width in pixels.
+ local maxwidth = 0
+ local lines = {}
+ for line in formatUpToX(tip):gmatch("[^\n]*\n?") do
+ local width = editor:TextWidth(wxstc.wxSTC_STYLE_DEFAULT, line)
+ if width > maxwidth then maxwidth = width end
+ table.insert(lines, line)
+ if #lines >= maxlines then
+ lines[#lines] = lines[#lines]:gsub("%s*\n$","")..'...'
+ break
+ end
+ end
+ tip = table.concat(lines, '')
+
+ local startpos = editor:PositionFromLine(editor:LineFromPosition(pos))
+ local afterwidth = editor:GetSize():GetWidth()-point:GetX()
+ if maxwidth > afterwidth then
+ local charwidth = editor:TextWidth(wxstc.wxSTC_STYLE_DEFAULT, 'A')
+ pos = math.max(startpos, pos - math.floor((maxwidth - afterwidth) / charwidth))
+ end
+
+ editor:CallTipShow(pos, tip)
+end
+
+function EditorCallTip(editor, pos, x, y)
+ -- don't show anything if the calltip/auto-complete is active;
+ -- this may happen after typing function name, while the mouse is over
+ -- a different function or when auto-complete is on for a parameter.
+ if editor:CallTipActive() or editor:AutoCompActive() then return end
+
+ -- don't activate if the window itself is not active (in the background)
+ if not ide.frame:IsActive() then return end
+
+ local var, funccall = editor:ValueFromPosition(pos)
+ -- if this is a value type rather than a function/method call, then use
+ -- full match to avoid calltip about coroutine.status for "status" vars
+ local tip = GetTipInfo(editor, funccall or var, false, not funccall)
+ local limit = ide.config.acandtip.maxlength
+ if ide.debugger and ide.debugger.server then
+ if var then
+ ide.debugger.quickeval(var, function(val)
+ if #val > limit then val = val:sub(1, limit-3).."..." end
+ -- check if the mouse position is specified and the mouse has moved,
+ -- then don't show the tooltip as it's already too late for it.
+ if x and y then
+ local mpos = wx.wxGetMousePosition()
+ if mpos.x ~= x or mpos.y ~= y then return end
+ end
+ if PackageEventHandle("onEditorCallTip", editor, val, funccall or var, true) ~= false then
+ callTipFitAndShow(editor, pos, val)
+ end
+ end)
+ end
+ elseif tip then
+ local oncalltip = PackageEventHandle("onEditorCallTip", editor, tip, funccall or var, false)
+ -- only shorten if shown on mouse-over. Use shortcut to get full info.
+ local showtooltip = ide.frame.menuBar:FindItem(ID_SHOWTOOLTIP)
+ local suffix = "...\n"
+ ..TR("Use '%s' to see full description."):format(showtooltip:GetLabel())
+ if x and y and #tip > limit then
+ tip = tip:sub(1, limit-#suffix):gsub("%W*%w*$","")..suffix
+ end
+ if oncalltip ~= false then callTipFitAndShow(editor, pos, tip) end
+ end
+end
+
+-- Indicator handling for functions and local/global variables
+local indicator = {
+ FNCALL = ide:GetIndicator("core.fncall"),
+ LOCAL = ide:GetIndicator("core.varlocal"),
+ GLOBAL = ide:GetIndicator("core.varglobal"),
+ MASKING = ide:GetIndicator("core.varmasking"),
+ MASKED = ide:GetIndicator("core.varmasked"),
+}
+
+function IndicateFunctionsOnly(editor, lines, linee)
+ local sindic = styles.indicator
+ if not (edcfg.showfncall and editor.spec and editor.spec.isfncall)
+ or not (sindic and sindic.fncall and sindic.fncall.st ~= wxstc.wxSTC_INDIC_HIDDEN) then return end
+
+ local lines = lines or 0
+ local linee = linee or editor:GetLineCount()-1
+
+ if (lines < 0) then return end
+
+ local isfncall = editor.spec.isfncall
+ local isinvalid = {}
+ for i,v in pairs(editor.spec.iscomment) do isinvalid[i] = v end
+ for i,v in pairs(editor.spec.iskeyword0) do isinvalid[i] = v end
+ for i,v in pairs(editor.spec.isstring) do isinvalid[i] = v end
+
+ editor:SetIndicatorCurrent(indicator.FNCALL)
+ for line=lines,linee do
+ local tx = editor:GetLineDyn(line)
+ local ls = editor:PositionFromLine(line)
+ editor:IndicatorClearRange(ls, #tx)
+
+ local from = 1
+ local off = -1
+ while from do
+ tx = from==1 and tx or string.sub(tx,from)
+
+ local f,t,w = isfncall(tx)
+
+ if (f) then
+ local p = ls+f+off
+ local s = bit.band(editor:GetStyleAt(p),31)
+ if not isinvalid[s] then editor:IndicatorFillRange(p, #w) end
+ off = off + t
+ end
+ from = t and (t+1)
+ end
+ end
+end
+
+local delayed = {}
+
+function IndicateIfNeeded()
+ local editor = GetEditor()
+ -- do the current one first
+ if delayed[editor] then return IndicateAll(editor) end
+ for ed in pairs(delayed) do return IndicateAll(ed) end
+end
+
+-- find all instances of a symbol at pos
+-- return table with [0] as the definition position (if local)
+local function indicateFindInstances(editor, name, pos)
+ local tokens = editor:GetTokenList()
+ local instances = {{[-1] = 1}}
+ local this
+ for _, token in ipairs(tokens) do
+ local op = token[1]
+
+ if op == 'EndScope' then -- EndScope has "new" level, so need +1
+ if this and token.fpos > pos and this == token.at+1 then break end
+
+ if #instances > 1 and instances[#instances][-1] == token.at+1 then
+ table.remove(instances)
+ end
+ elseif token.name == name then
+ if op == 'Id' then
+ table.insert(instances[#instances], token.fpos)
+ elseif op:find("^Var") then
+ if this and this == token.at then break end
+
+ -- if new Var is defined at the same level, replace the current frame;
+ -- if not, add a new one; skip implicit definition of "self" variable.
+ instances[#instances + (token.at > instances[#instances][-1] and 1 or 0)]
+ = {[0] = (not token.self and token.fpos or nil), [-1] = token.at}
+ end
+ if token.fpos <= pos and pos <= token.fpos+#name then this = instances[#instances][-1] end
+ end
+ end
+ instances[#instances][-1] = nil -- remove the current level
+ -- only return the list if "this" instance has been found;
+ -- this is to avoid reporting (improper) instances when checking for
+ -- comments, strings, table fields, etc.
+ return this and instances[#instances] or {}
+end
+
+function IndicateAll(editor, lines)
+ if not ide.config.autoanalyzer then return end
+
+ local d = delayed[editor]
+ delayed[editor] = nil -- assume this can be finished for now
+
+ -- this function can be called for an editor tab that is already closed
+ -- when there are still some pending events for it, so handle it.
+ if not ide:IsValidCtrl(editor) then return end
+
+ -- if markvars is not set in the spec, nothing else to do
+ if not (editor.spec and editor.spec.marksymbols) then return end
+
+ local indic = styles.indicator or {}
+
+ local pos, vars = d and d[1] or 1, d and d[2] or nil
+ local start = lines and editor:PositionFromLine(lines)+1 or nil
+ if d and start and pos >= start then
+ -- ignore delayed processing as the change is earlier in the text
+ pos, vars = 1, nil
+ end
+
+ local tokens = editor:GetTokenList()
+
+ if start then -- if the range is specified
+ local curindic = editor:GetIndicatorCurrent()
+ editor:SetIndicatorCurrent(indicator.MASKED)
+ for n = #tokens, 1, -1 do
+ local token = tokens[n]
+ -- find the last token before the range
+ if not token.nobreak and token.name and token.fpos+#token.name < start then
+ pos, vars = token.fpos+#token.name, token.context
+ break
+ end
+ -- unmask all variables from the rest of the list
+ if token[1] == 'Masked' then
+ editor:IndicatorClearRange(token.fpos-1, #token.name)
+ end
+ -- trim the list as it will be re-generated
+ table.remove(tokens, n)
+ end
+
+ -- Clear masked indicators from the current position to the end as these
+ -- will be re-calculated and re-applied based on masking variables.
+ -- This step is needed as some positions could have shifted after updates.
+ editor:IndicatorClearRange(pos-1, editor:GetLength()-pos+1)
+
+ editor:SetIndicatorCurrent(curindic)
+
+ -- need to cleanup vars as they may include variables from later
+ -- fragments (because the cut-point was arbitrary). Also need
+ -- to clean variables in other scopes, hence getmetatable use.
+ local vars = vars
+ while vars do
+ for name, var in pairs(vars) do
+ -- remove all variables that are created later than the current pos
+ -- skip all non-variable elements from the vars table
+ if type(name) == 'string' then
+ while type(var) == 'table' and var.fpos and (var.fpos > pos) do
+ var = var.masked -- restored a masked var
+ vars[name] = var
+ end
+ end
+ end
+ vars = getmetatable(vars) and getmetatable(vars).__index
+ end
+ else
+ if pos == 1 then -- if not continuing, then trim the list
+ tokens = editor:ResetTokenList()
+ end
+ end
+
+ local cleared = {}
+ for _, indic in ipairs {indicator.FNCALL, indicator.LOCAL, indicator.GLOBAL, indicator.MASKING} do
+ cleared[indic] = pos
+ end
+
+ local function IndicateOne(indic, pos, length)
+ editor:SetIndicatorCurrent(indic)
+ editor:IndicatorClearRange(cleared[indic]-1, pos-cleared[indic])
+ editor:IndicatorFillRange(pos-1, length)
+ cleared[indic] = pos+length
+ end
+
+ local s = TimeGet()
+ local canwork = start and 0.010 or 0.100 -- use shorter interval when typing
+ local f = editor.spec.marksymbols(editor:GetTextDyn(), pos, vars)
+ while true do
+ local op, name, lineinfo, vars, at, nobreak = f()
+ if not op then break end
+ local var = vars and vars[name]
+ local token = {op, name=name, fpos=lineinfo, at=at, context=vars,
+ self = (op == 'VarSelf') or nil, nobreak=nobreak}
+ if op == 'Function' then
+ vars['function'] = (vars['function'] or 0) + 1
+ end
+ if op == 'FunctionCall' then
+ if indic.fncall and edcfg.showfncall then
+ IndicateOne(indicator.FNCALL, lineinfo, #name)
+ end
+ elseif op ~= 'VarNext' and op ~= 'VarInside' and op ~= 'Statement' and op ~= 'String' then
+ table.insert(tokens, token)
+ end
+
+ -- indicate local/global variables
+ if op == 'Id'
+ and (var and indic.varlocal or not var and indic.varglobal) then
+ IndicateOne(var and indicator.LOCAL or indicator.GLOBAL, lineinfo, #name)
+ end
+
+ -- indicate masked values at the same level
+ if op == 'Var' and var and (var.masked and at == var.masked.at) then
+ local fpos = var.masked.fpos
+ -- indicate masked if it's not implicit self
+ if indic.varmasked and not var.masked.self then
+ editor:SetIndicatorCurrent(indicator.MASKED)
+ editor:IndicatorFillRange(fpos-1, #name)
+ table.insert(tokens, {"Masked", name=name, fpos=fpos, nobreak=nobreak})
+ end
+
+ if indic.varmasking then IndicateOne(indicator.MASKING, lineinfo, #name) end
+ end
+ -- in some rare cases `nobreak` may be a number indicating a desired
+ -- position from which to start in case of a break
+ if lineinfo and nobreak ~= true and (op == 'Statement' or op == 'String') and TimeGet()-s > canwork then
+ delayed[editor] = {tonumber(nobreak) or lineinfo, vars}
+ break
+ end
+ end
+
+ -- clear indicators till the end of processed fragment
+ pos = delayed[editor] and delayed[editor][1] or editor:GetLength()+1
+
+ -- don't clear "masked" indicators as those can be set out of order (so
+ -- last updated fragment is not always the last in terms of its position);
+ -- these indicators should be up-to-date to the end of the code fragment.
+ local funconly = ide.config.editor.showfncall and editor.spec.isfncall
+ for _, indic in ipairs {indicator.FNCALL, indicator.LOCAL, indicator.GLOBAL, indicator.MASKING} do
+ -- don't clear "funccall" indicators as those can be set based on
+ -- IndicateFunctionsOnly processing, which is dealt with separately
+ if indic ~= indicator.FNCALL or not funconly then IndicateOne(indic, pos, 0) end
+ end
+
+ local needmore = delayed[editor] ~= nil
+ if ide.config.outlineinactivity then
+ if needmore then ide.timers.outline:Stop()
+ else ide.timers.outline:Start(ide.config.outlineinactivity*1000, wx.wxTIMER_ONE_SHOT)
+ end
+ end
+ return needmore -- request more events if still need to work
+end
+
+-- ----------------------------------------------------------------------------
+-- Create an editor
+function CreateEditor(bare)
+ local editor = ide:CreateStyledTextCtrl(notebook, editorID,
+ wx.wxDefaultPosition, wx.wxSize(0, 0), wx.wxBORDER_NONE)
+
+ editorID = editorID + 1 -- increment so they're always unique
+
+ editor.matchon = false
+ editor.assignscache = false
+ editor.bom = false
+ editor.updated = 0
+ editor.jumpstack = {}
+ editor.ctrlcache = {}
+ editor.tokenlist = {}
+ editor.onidle = {}
+ -- populate cache with Ctrl-<letter> combinations for workaround on Linux
+ -- http://wxwidgets.10942.n7.nabble.com/Menu-shortcuts-inconsistentcy-issue-td85065.html
+ for id, shortcut in pairs(ide.config.keymap) do
+ local key = shortcut:match('^Ctrl[-+](.)$')
+ if key then editor.ctrlcache[key:byte()] = id end
+ end
+
+ -- populate editor keymap with configured combinations
+ for _, map in ipairs(edcfg.keymap or {}) do
+ local key, mod, cmd, os = unpack(map)
+ if not os or os == ide.osname then
+ if cmd then
+ editor:CmdKeyAssign(key, mod, cmd)
+ else
+ editor:CmdKeyClear(key, mod)
+ end
+ end
+ end
+
+ editor:SetBufferedDraw(not ide.config.hidpi and true or false)
+ editor:StyleClearAll()
+
+ editor:SetFont(ide.font.eNormal)
+ editor:StyleSetFont(wxstc.wxSTC_STYLE_DEFAULT, ide.font.eNormal)
+
+ editor:SetTabWidth(tonumber(edcfg.tabwidth) or 2)
+ editor:SetIndent(tonumber(edcfg.tabwidth) or 2)
+ editor:SetUseTabs(edcfg.usetabs and true or false)
+ editor:SetIndentationGuides(tonumber(edcfg.indentguide) or (edcfg.indentguide and true or false))
+ editor:SetViewWhiteSpace(edcfg.whitespace and true or false)
+
+ if (edcfg.usewrap) then
+ editor:SetWrapMode(edcfg.wrapmode)
+ editor:SetWrapStartIndent(0)
+ if ide.wxver >= "2.9.5" then
+ if edcfg.wrapflags then
+ editor:SetWrapVisualFlags(tonumber(edcfg.wrapflags) or wxstc.wxSTC_WRAPVISUALFLAG_NONE)
+ end
+ if edcfg.wrapstartindent then
+ editor:SetWrapStartIndent(tonumber(edcfg.wrapstartindent) or 0)
+ end
+ if edcfg.wrapindentmode then
+ editor:SetWrapIndentMode(edcfg.wrapindentmode)
+ end
+ end
+ else
+ editor:SetScrollWidth(100) -- set default width
+ editor:SetScrollWidthTracking(1) -- enable width auto-adjustment
+ end
+
+ if edcfg.defaulteol == wxstc.wxSTC_EOL_CRLF
+ or edcfg.defaulteol == wxstc.wxSTC_EOL_LF then
+ editor:SetEOLMode(edcfg.defaulteol)
+ -- else: keep wxStyledTextCtrl default behavior (CRLF on Windows, LF on Unix)
+ end
+
+ editor:SetCaretLineVisible(edcfg.caretline and true or false)
+
+ editor:SetVisiblePolicy(wxstc.wxSTC_VISIBLE_STRICT, 3)
+
+ editor:SetMarginType(margin.LINENUMBER, wxstc.wxSTC_MARGIN_NUMBER)
+ editor:SetMarginMask(margin.LINENUMBER, 0)
+ editor:SetMarginWidth(margin.LINENUMBER,
+ math.floor(linenumlen * editor:TextWidth(wxstc.wxSTC_STYLE_DEFAULT, "8")))
+
+ editor:SetMarginWidth(margin.MARKER, 18)
+ editor:SetMarginType(margin.MARKER, wxstc.wxSTC_MARGIN_SYMBOL)
+ editor:SetMarginMask(margin.MARKER, 0xffffffff - wxstc.wxSTC_MASK_FOLDERS)
+ editor:SetMarginSensitive(margin.MARKER, true)
+
+ editor:MarkerDefine(StylesGetMarker("currentline"))
+ editor:MarkerDefine(StylesGetMarker("breakpoint"))
+ editor:MarkerDefine(StylesGetMarker("bookmark"))
+
+ if edcfg.fold then
+ editor:SetMarginWidth(margin.FOLD, 18)
+ editor:SetMarginType(margin.FOLD, wxstc.wxSTC_MARGIN_SYMBOL)
+ editor:SetMarginMask(margin.FOLD, wxstc.wxSTC_MASK_FOLDERS)
+ editor:SetMarginSensitive(margin.FOLD, true)
+ end
+
+ editor:SetFoldFlags(tonumber(edcfg.foldflags) or wxstc.wxSTC_FOLDFLAG_LINEAFTER_CONTRACTED)
+
+ if ide.wxver >= "2.9.5" then
+ -- allow multiple selection and multi-cursor editing if supported
+ editor:SetMultipleSelection(1)
+ editor:SetAdditionalCaretsBlink(1)
+ editor:SetAdditionalSelectionTyping(1)
+ -- allow extra ascent/descent
+ editor:SetExtraAscent(tonumber(edcfg.extraascent) or 0)
+ editor:SetExtraDescent(tonumber(edcfg.extradescent) or 0)
+ end
+
+ do
+ local fg, bg = wx.wxWHITE, wx.wxColour(128, 128, 128)
+ local foldtype = foldtypes[edcfg.foldtype] or foldtypes.box
+ local foldmarkers = foldtypes[0]
+ for m = 1, #foldmarkers do
+ editor:MarkerDefine(foldmarkers[m], foldtype[m] or wxstc.wxSTC_MARK_EMPTY, fg, bg)
+ end
+ bg:delete()
+ end
+
+ if edcfg.calltipdelay and edcfg.calltipdelay > 0 then
+ editor:SetMouseDwellTime(edcfg.calltipdelay)
+ end
+
+ editor:AutoCompSetIgnoreCase(ide.config.acandtip.ignorecase)
+ if (ide.config.acandtip.strategy > 0) then
+ editor:AutoCompSetAutoHide(0)
+ editor:AutoCompStops([[ \n\t=-+():.,;*/!"'$%&~'#°^@?´`<>][|}{]])
+ end
+
+ function editor:GetTokenList() return self.tokenlist end
+ function editor:ResetTokenList() self.tokenlist = {}; return self.tokenlist end
+
+ function editor:SetupKeywords(...) return SetupKeywords(self, ...) end
+ function editor:ValueFromPosition(pos) return getValAtPosition(self, pos) end
+
+ function editor:MarkerGotoNext(marker)
+ local value = 2^marker
+ local line = editor:MarkerNext(editor:GetCurrentLine()+1, value)
+ if line == -1 then line = editor:MarkerNext(0, value) end
+ if line == -1 then return end
+ editor:GotoLine(line)
+ editor:EnsureVisibleEnforcePolicy(line)
+ return line
+ end
+ function editor:MarkerGotoPrev(marker)
+ local value = 2^marker
+ local line = editor:MarkerPrevious(editor:GetCurrentLine()-1, value)
+ if line == -1 then line = editor:MarkerPrevious(editor:GetLineCount(), value) end
+ if line == -1 then return end
+ editor:GotoLine(line)
+ editor:EnsureVisibleEnforcePolicy(line)
+ return line
+ end
+ function editor:MarkerToggle(marker, line, value)
+ line = line or editor:GetCurrentLine()
+ local isset = bit.band(editor:MarkerGet(line), 2^marker) > 0
+ if value ~= nil and isset == value then return end
+ if isset then
+ editor:MarkerDelete(line, marker)
+ else
+ editor:MarkerAdd(line, marker)
+ end
+ PackageEventHandle("onEditorMarkerUpdate", editor, marker, line, not isset)
+ end
+
+ function editor:BookmarkToggle(...) return self:MarkerToggle((StylesGetMarker("bookmark")), ...) end
+ function editor:BreakpointToggle(line, ...)
+ line = line or self:GetCurrentLine()
+ return DebuggerToggleBreakpoint(self, line, ...)
+ end
+
+ function editor:DoWhenIdle(func) table.insert(self.onidle, func) end
+
+ -- GotoPos should work by itself, but it doesn't (wx 2.9.5).
+ -- This is likely because the editor window hasn't been refreshed yet,
+ -- so its LinesOnScreen method returns 0/-1, which skews the calculations.
+ -- To avoid this, the caret line is made visible at the first opportunity.
+ do
+ local redolater
+ function editor:GotoPosDelayed(pos)
+ local badtime = self:LinesOnScreen() <= 0 -- -1 on OSX, 0 on Windows
+ if pos then
+ if badtime then
+ redolater = pos
+ -- without this GotoPos the content is not scrolled correctly on
+ -- Windows, but with this it's not scrolled correctly on OSX.
+ if ide.osname ~= 'Macintosh' then self:GotoPos(pos) end
+ else
+ redolater = nil
+ self:GotoPosEnforcePolicy(pos)
+ end
+ elseif not badtime and redolater then
+ -- reset the left margin first to make sure that the position
+ -- is set "from the left" to get the best content displayed.
+ self:SetXOffset(0)
+ self:GotoPosEnforcePolicy(redolater)
+ redolater = nil
+ end
+ end
+ end
+
+ if bare then return editor end -- bare editor doesn't have any event handlers
+
+ editor.ev = {}
+ editor:Connect(wxstc.wxEVT_STC_MARGINCLICK,
+ function (event)
+ local line = editor:LineFromPosition(event:GetPosition())
+ local marginno = event:GetMargin()
+ if marginno == margin.MARKER then
+ DebuggerToggleBreakpoint(editor, line)
+ elseif marginno == margin.FOLD then
+ local header = bit.band(editor:GetFoldLevel(line),
+ wxstc.wxSTC_FOLDLEVELHEADERFLAG) == wxstc.wxSTC_FOLDLEVELHEADERFLAG
+ if wx.wxGetKeyState(wx.WXK_SHIFT) and wx.wxGetKeyState(wx.WXK_CONTROL) then
+ editor:FoldSome()
+ elseif header then
+ editor:ToggleFold(line)
+ end
+ end
+ end)
+
+ editor:Connect(wxstc.wxEVT_STC_MODIFIED,
+ function (event)
+ if (editor.assignscache and editor:GetCurrentLine() ~= editor.assignscache.line) then
+ editor.assignscache = false
+ end
+ local evtype = event:GetModificationType()
+ if bit.band(evtype, wxstc.wxSTC_MOD_CHANGEMARKER) == 0 then
+ -- this event is being called on OSX too frequently, so skip these notifications
+ editor.updated = TimeGet()
+ end
+ local pos = event:GetPosition()
+ local firstLine = editor:LineFromPosition(pos)
+ local inserted = bit.band(evtype, wxstc.wxSTC_MOD_INSERTTEXT) ~= 0
+ local deleted = bit.band(evtype, wxstc.wxSTC_MOD_DELETETEXT) ~= 0
+ if (inserted or deleted) then
+ SetAutoRecoveryMark()
+
+ local linesChanged = inserted and event:GetLinesAdded() or 0
+ -- collate events if they are for the same line
+ local events = #editor.ev
+ if events == 0 or editor.ev[events][1] ~= firstLine then
+ editor.ev[events+1] = {firstLine, linesChanged}
+ elseif events > 0 and editor.ev[events][1] == firstLine then
+ editor.ev[events][2] = math.max(editor.ev[events][2], linesChanged)
+ end
+ DynamicWordsAdd(editor, nil, firstLine, linesChanged)
+ end
+
+ local beforeInserted = bit.band(evtype,wxstc.wxSTC_MOD_BEFOREINSERT) ~= 0
+ local beforeDeleted = bit.band(evtype,wxstc.wxSTC_MOD_BEFOREDELETE) ~= 0
+
+ if (beforeInserted or beforeDeleted) then
+ -- unfold the current line being changed if folded, but only if one selection
+ local lastLine = editor:LineFromPosition(pos+event:GetLength())
+ local selections = ide.wxver >= "2.9.5" and editor:GetSelections() or 1
+ if (not editor:GetFoldExpanded(firstLine)
+ or not editor:GetLineVisible(firstLine)
+ or not editor:GetLineVisible(lastLine))
+ and selections == 1 then
+ for line = firstLine, lastLine do
+ if not editor:GetLineVisible(line) then editor:ToggleFold(editor:GetFoldParent(line)) end
+ end
+ end
+ end
+
+ -- hide calltip/auto-complete after undo/redo/delete
+ local undodelete = (wxstc.wxSTC_MOD_DELETETEXT
+ + wxstc.wxSTC_PERFORMED_UNDO + wxstc.wxSTC_PERFORMED_REDO)
+ if bit.band(evtype, undodelete) ~= 0 then
+ editor:DoWhenIdle(function(editor)
+ if editor:CallTipActive() then editor:CallTipCancel() end
+ if editor:AutoCompActive() then editor:AutoCompCancel() end
+ end)
+ end
+
+ if ide.config.acandtip.nodynwords then return end
+ -- only required to track changes
+
+ if beforeDeleted then
+ local text = editor:GetTextRangeDyn(pos, pos+event:GetLength())
+ local _, numlines = text:gsub("\r?\n","%1")
+ DynamicWordsRem(editor,nil,firstLine, numlines)
+ end
+ if beforeInserted then
+ DynamicWordsRem(editor,nil,firstLine, 0)
+ end
+ end)
+
+ editor:Connect(wxstc.wxEVT_STC_CHARADDED,
+ function (event)
+ local LF = string.byte("\n")
+ local ch = event:GetKey()
+ local pos = editor:GetCurrentPos()
+ local line = editor:GetCurrentLine()
+ local linetx = editor:GetLineDyn(line)
+ local linestart = editor:PositionFromLine(line)
+ local localpos = pos-linestart
+ local linetxtopos = linetx:sub(1,localpos)
+
+ if PackageEventHandle("onEditorCharAdded", editor, event) == false then
+ -- this event has already been handled
+ elseif (ch == LF) then
+ -- auto-indent
+ if (line > 0) then
+ local indent = editor:GetLineIndentation(line - 1)
+ local linedone = editor:GetLineDyn(line - 1)
+
+ -- if the indentation is 0 and the current line is not empty,
+ -- but the previous line is empty, then take indentation from the
+ -- current line (instead of the previous one). This may happen when
+ -- CR is hit at the beginning of a line (rather than at the end).
+ if indent == 0 and not linetx:match("^[\010\013]*$")
+ and linedone:match("^[\010\013]*$") then
+ indent = editor:GetLineIndentation(line)
+ end
+
+ local ut = editor:GetUseTabs()
+ local tw = ut and editor:GetTabWidth() or editor:GetIndent()
+ local style = bit.band(editor:GetStyleAt(editor:PositionFromLine(line-1)), 31)
+
+ if edcfg.smartindent
+ -- don't apply smartindent to multi-line comments or strings
+ and not (editor.spec.iscomment[style]
+ or editor.spec.isstring[style]
+ or (MarkupIsAny and MarkupIsAny(style)))
+ and editor.spec.isdecindent and editor.spec.isincindent then
+ local closed, blockend = editor.spec.isdecindent(linedone)
+ local opened = editor.spec.isincindent(linedone)
+
+ -- if the current block is already indented, skip reverse indenting
+ if (line > 1) and (closed > 0 or blockend > 0)
+ and editor:GetLineIndentation(line-2) > indent then
+ -- adjust opened first; this is needed when use ENTER after })
+ if blockend == 0 then opened = opened + closed end
+ closed, blockend = 0, 0
+ end
+ editor:SetLineIndentation(line-1, indent - tw * closed)
+ indent = indent + tw * (opened - blockend)
+ if indent < 0 then indent = 0 end
+ end
+ editor:SetLineIndentation(line, indent)
+
+ indent = ut and (indent / tw) or indent
+ editor:GotoPos(editor:GetCurrentPos()+indent)
+ end
+
+ elseif ch == ("("):byte() then
+ local tip = GetTipInfo(editor,linetxtopos,ide.config.acandtip.shorttip)
+ if tip then
+ if editor:CallTipActive() then editor:CallTipCancel() end
+ if PackageEventHandle("onEditorCallTip", editor, tip) ~= false then
+ callTipFitAndShow(editor, pos, tip)
+ end
+ end
+
+ elseif ide.config.autocomplete then -- code completion prompt
+ local trigger = linetxtopos:match("["..editor.spec.sep.."%w_]+$")
+ if trigger and (#trigger > 1 or trigger:match("["..editor.spec.sep.."]")) then
+ editor:DoWhenIdle(function(editor) EditorAutoComplete(editor) end)
+ end
+ end
+ end)
+
+ editor:Connect(wxstc.wxEVT_STC_DWELLSTART,
+ function (event)
+ -- on Linux DWELLSTART event seems to be generated even for those
+ -- editor windows that are not active. What's worse, when generated
+ -- the event seems to report "old" position when retrieved using
+ -- event:GetX and event:GetY, so instead we use wxGetMousePosition.
+ local linux = ide.osname == 'Unix'
+ if linux and editor ~= GetEditor() then return end
+
+ -- check if this editor has focus; it may not when Stack/Watch window
+ -- is on top, but DWELL events are still triggered in this case.
+ -- Don't want to show calltip as it is still shown when the focus
+ -- is switched to a different application.
+ local focus = editor:FindFocus()
+ if focus and focus:GetId() ~= editor:GetId() then return end
+
+ -- event:GetX() and event:GetY() positions don't correspond to
+ -- the correct positions calculated using ScreenToClient (at least
+ -- on Windows and Linux), so use what's calculated.
+ local mpos = wx.wxGetMousePosition()
+ local cpos = editor:ScreenToClient(mpos)
+ local position = editor:PositionFromPointClose(cpos.x, cpos.y)
+ if position ~= wxstc.wxSTC_INVALID_POSITION then
+ EditorCallTip(editor, position, mpos.x, mpos.y)
+ end
+ event:Skip()
+ end)
+
+ editor:Connect(wxstc.wxEVT_STC_DWELLEND,
+ function (event)
+ if editor:CallTipActive() then editor:CallTipCancel() end
+ event:Skip()
+ end)
+
+ editor:Connect(wx.wxEVT_KILL_FOCUS,
+ function (event)
+ -- on OSX clicking on scrollbar in the popup is causing the editor to lose focus,
+ -- which causes canceling of auto-complete, which later cause crash because
+ -- the window is destroyed in wxwidgets after already being closed. Skip on OSX.
+ if ide.osname ~= 'Macintosh' and editor:AutoCompActive() then editor:AutoCompCancel() end
+ PackageEventHandle("onEditorFocusLost", editor)
+ event:Skip()
+ end)
+
+ local eol = {
+ [wxstc.wxSTC_EOL_CRLF] = "\r\n",
+ [wxstc.wxSTC_EOL_LF] = "\n",
+ [wxstc.wxSTC_EOL_CR] = "\r",
+ }
+ local function addOneLine(editor, adj)
+ local pos = editor:GetLineEndPosition(editor:LineFromPosition(editor:GetCurrentPos())+(adj or 0))
+ local added = eol[editor:GetEOLMode()] or "\n"
+ editor:InsertTextDyn(pos, added)
+ editor:SetCurrentPos(pos+#added)
+
+ local ev = wxstc.wxStyledTextEvent(wxstc.wxEVT_STC_CHARADDED)
+ ev:SetKey(string.byte("\n"))
+ editor:AddPendingEvent(ev)
+ end
+
+ editor:Connect(wxstc.wxEVT_STC_USERLISTSELECTION,
+ function (event)
+ if PackageEventHandle("onEditorUserlistSelection", editor, event) == false then
+ return
+ end
+
+ -- if used Shift-Enter, then skip auto complete and just do Enter
+ if wx.wxGetKeyState(wx.WXK_SHIFT) then return addOneLine(editor) end
+
+ if ide.wxver >= "2.9.5" and editor:GetSelections() > 1 then
+ local text = event:GetText()
+ -- capture all positions as the selection may change
+ local positions = {}
+ for s = 0, editor:GetSelections()-1 do
+ table.insert(positions, editor:GetSelectionNCaret(s))
+ end
+ -- process all selections from last to first
+ table.sort(positions)
+ local mainpos = editor:GetSelectionNCaret(editor:GetMainSelection())
+
+ editor:BeginUndoAction()
+ for s = #positions, 1, -1 do
+ local pos = positions[s]
+ local startpos = editor:WordStartPosition(pos, true)
+ editor:SetSelection(startpos, pos)
+ editor:ReplaceSelection(text)
+ -- if this is the main position, save new cursor position to restore
+ if pos == mainpos then mainpos = editor:GetCurrentPos()
+ elseif pos < mainpos then
+ -- adjust main position as earlier changes may affect it
+ mainpos = mainpos + #text - (pos - startpos)
+ end
+ end
+ editor:EndUndoAction()
+
+ editor:GotoPos(mainpos)
+ else
+ local pos = editor:GetCurrentPos()
+ local startpos = editor:WordStartPosition(pos, true)
+ local endpos = editor:WordEndPosition(pos, true)
+ editor:SetSelection(startpos, ide.config.acandtip.droprest and endpos or pos)
+ editor:ReplaceSelection(event:GetText())
+ end
+ end)
+
+ editor:Connect(wxstc.wxEVT_STC_SAVEPOINTREACHED,
+ function ()
+ local doc = ide:GetDocument(editor)
+ if doc then doc:SetModified(false) end
+ end)
+
+ editor:Connect(wxstc.wxEVT_STC_SAVEPOINTLEFT,
+ function ()
+ local doc = ide:GetDocument(editor)
+ if doc then doc:SetModified(true) end
+ end)
+
+ -- "updateStatusText" should be called in UPDATEUI event, but it creates
+ -- several performance problems on Windows (using wx2.9.5+) when
+ -- brackets or backspace is used (very slow screen repaint with 0.5s delay).
+ -- Moving it to PAINTED event creates problems on OSX (using wx2.9.5+),
+ -- where refresh of R/W and R/O status in the status bar is delayed.
+
+ editor:Connect(wxstc.wxEVT_STC_PAINTED,
+ function (event)
+ PackageEventHandle("onEditorPainted", editor, event)
+
+ if ide.osname == 'Windows' then
+ -- STC_PAINTED is called on multiple editors when they point to
+ -- the same document; only update status for the active one
+ if notebook:GetSelection() == notebook:GetPageIndex(editor) then
+ updateStatusText(editor)
+ end
+
+ if edcfg.usewrap ~= true and editor:AutoCompActive() then
+ -- showing auto-complete list leaves artifacts on the screen,
+ -- which can only be fixed by a forced refresh.
+ -- shows with wxSTC 3.21 and both wxwidgets 2.9.5 and 3.1
+ editor:Update()
+ editor:Refresh()
+ end
+ end
+
+ -- adjust line number margin, but only if it's already shown
+ local linecount = #tostring(editor:GetLineCount()) + 0.5
+ local mwidth = editor:GetMarginWidth(margin.LINENUMBER)
+ if mwidth > 0 then
+ local width = math.max(linecount, linenumlen) * editor:TextWidth(wxstc.wxSTC_STYLE_DEFAULT, "8")
+ if mwidth ~= width then editor:SetMarginWidth(margin.LINENUMBER, math.floor(width)) end
+ end
+ end)
+
+ editor.processedUpdateContent = 0
+ editor:Connect(wxstc.wxEVT_STC_UPDATEUI,
+ function (event)
+ -- some of UPDATEUI events may be triggered as the result of editor updates
+ -- from subsequent events (like PAINTED, which happens in documentmap plugin).
+ -- the reason for the `processed` check is that it is not possible
+ -- to completely skip all of these updates as this causes the issue
+ -- of markup styling becoming visible after text deletion by Backspace.
+ -- to avoid this, we allow the first update after any updates caused
+ -- by real changes; the rest of UPDATEUI events are skipped.
+ -- (use direct comparison, as need to skip events that just update content)
+ if event:GetUpdated() == wxstc.wxSTC_UPDATE_CONTENT
+ and not next(editor.ev) then
+ if editor.processedUpdateContent > 1 then return end
+ else
+ editor.processedUpdateContent = 0
+ end
+ editor.processedUpdateContent = editor.processedUpdateContent + 1
+
+ PackageEventHandle("onEditorUpdateUI", editor, event)
+
+ if ide.osname ~= 'Windows' then updateStatusText(editor) end
+
+ editor:GotoPosDelayed()
+ updateBraceMatch(editor)
+ local minupdated
+ for _,iv in ipairs(editor.ev) do
+ local line = iv[1]
+ if not minupdated or line < minupdated then minupdated = line end
+ IndicateFunctionsOnly(editor,line,line+iv[2])
+ end
+ if minupdated then
+ local ok, res = pcall(IndicateAll, editor, minupdated)
+ if not ok then DisplayOutputLn("Internal error: ",res,minupdated) end
+ end
+ local firstvisible = editor:DocLineFromVisible(editor:GetFirstVisibleLine())
+ local lastline = math.min(editor:GetLineCount(),
+ firstvisible + editor:LinesOnScreen())
+ -- lastline - editor:LinesOnScreen() can get negative; fix it
+ local firstline = math.min(math.max(0, lastline - editor:LinesOnScreen()),
+ firstvisible)
+ MarkupStyle(editor,minupdated or firstline,lastline)
+ editor.ev = {}
+ end)
+
+ editor:Connect(wx.wxEVT_IDLE,
+ function (event)
+ while #editor.onidle > 0 do table.remove(editor.onidle)(editor) end
+ end)
+
+ editor:Connect(wx.wxEVT_LEFT_DOWN,
+ function (event)
+ if MarkupHotspotClick then
+ local position = editor:PositionFromPointClose(event:GetX(),event:GetY())
+ if position ~= wxstc.wxSTC_INVALID_POSITION then
+ if MarkupHotspotClick(position, editor) then return end
+ end
+ end
+
+ if event:ControlDown() and event:AltDown()
+ -- ide.wxver >= "2.9.5"; fix after GetModifiers is added to wxMouseEvent in wxlua
+ and not event:ShiftDown() and not event:MetaDown() then
+ local point = event:GetPosition()
+ local pos = editor:PositionFromPointClose(point.x, point.y)
+ local value = pos ~= wxstc.wxSTC_INVALID_POSITION and editor:ValueFromPosition(pos) or nil
+ local instances = value and indicateFindInstances(editor, value, pos+1)
+ if instances and instances[0] then
+ navigateToPosition(editor, pos, instances[0]-1, #value)
+ return
+ end
+ end
+ event:Skip()
+ end)
+
+ if edcfg.nomousezoom then
+ -- disable zoom using mouse wheel as it triggers zooming when scrolling
+ -- on OSX with kinetic scroll and then pressing CMD.
+ editor:Connect(wx.wxEVT_MOUSEWHEEL,
+ function (event)
+ if wx.wxGetKeyState(wx.WXK_CONTROL) then return end
+ event:Skip()
+ end)
+ end
+
+ local inhandler = false
+ editor:Connect(wx.wxEVT_SET_FOCUS,
+ function (event)
+ event:Skip()
+ if inhandler or ide.exitingProgram then return end
+ inhandler = true
+ PackageEventHandle("onEditorFocusSet", editor)
+ isFileAlteredOnDisk(editor)
+ inhandler = false
+ end)
+
+ editor:Connect(wx.wxEVT_KEY_DOWN,
+ function (event)
+ local keycode = event:GetKeyCode()
+ local mod = event:GetModifiers()
+ local first, last = 0, notebook:GetPageCount()-1
+ if PackageEventHandle("onEditorKeyDown", editor, event) == false then
+ -- this event has already been handled
+ elseif keycode == wx.WXK_ESCAPE then
+ if editor:CallTipActive() or editor:AutoCompActive() then
+ event:Skip()
+ elseif ide.findReplace:IsShown() then
+ ide.findReplace:Hide()
+ elseif ide:GetMainFrame():IsFullScreen() then
+ ShowFullScreen(false)
+ end
+ -- Ctrl-Home and Ctrl-End don't work on OSX with 2.9.5+; fix it
+ elseif ide.osname == 'Macintosh' and ide.wxver >= "2.9.5"
+ and (mod == wx.wxMOD_RAW_CONTROL or mod == (wx.wxMOD_RAW_CONTROL + wx.wxMOD_SHIFT))
+ and (keycode == wx.WXK_HOME or keycode == wx.WXK_END) then
+ local pos = keycode == wx.WXK_HOME and 0 or editor:GetLength()
+ if event:ShiftDown() -- mark selection and scroll to caret
+ then editor:SetCurrentPos(pos) editor:EnsureCaretVisible()
+ else editor:GotoPos(pos) end
+ elseif mod == wx.wxMOD_RAW_CONTROL and keycode == wx.WXK_PAGEUP
+ or mod == (wx.wxMOD_RAW_CONTROL + wx.wxMOD_SHIFT) and keycode == wx.WXK_TAB then
+ if notebook:GetSelection() == first
+ then notebook:SetSelection(last)
+ else notebook:AdvanceSelection(false) end
+ elseif mod == wx.wxMOD_RAW_CONTROL
+ and (keycode == wx.WXK_PAGEDOWN or keycode == wx.WXK_TAB) then
+ if notebook:GetSelection() == last
+ then notebook:SetSelection(first)
+ else notebook:AdvanceSelection(true) end
+ elseif (keycode == wx.WXK_DELETE or keycode == wx.WXK_BACK)
+ and (mod == wx.wxMOD_NONE) then
+ -- Delete and Backspace behave the same way for selected text
+ if #(editor:GetSelectedText()) > 0 then
+ editor:ClearAny()
+ else
+ local pos = editor:GetCurrentPos()
+ if keycode == wx.WXK_BACK then
+ pos = pos - 1
+ if pos < 0 then return end
+ end
+
+ -- check if the modification is to one of "invisible" characters.
+ -- if not, proceed with "normal" processing as there are other
+ -- events that may depend on Backspace, for example, re-calculating
+ -- auto-complete suggestions.
+ local style = bit.band(editor:GetStyleAt(pos), 31)
+ if not MarkupIsSpecial or not MarkupIsSpecial(style) then
+ -- if BACKSPACE is used at tab stop, with spaces for indentation,
+ -- and only whilespaces on the left, reduce indent
+ if edcfg.backspaceunindent and keycode == wx.WXK_BACK and not editor:GetUseTabs() then
+ -- get the line number from the *current* position of the cursor
+ local line = editor:LineFromPosition(pos+1)
+ local text = editor:GetLineDyn(line):sub(1, pos-editor:PositionFromLine(line)+1)
+ local tw = editor:GetIndent()
+ -- if on the tab stop position and only white spaces on the left
+ if text:find('^%s+$') and #text % tw == 0 then
+ editor:SetLineIndentation(line, editor:GetLineIndentation(line) - tw)
+ editor:GotoPos(pos+1-tw)
+ return
+ end
+ end
+ event:Skip()
+ return
+ end
+
+ editor:SetTargetStart(pos)
+ editor:SetTargetEnd(pos+1)
+ editor:ReplaceTarget("")
+ end
+ elseif mod == wx.wxMOD_ALT and keycode == wx.WXK_LEFT then
+ -- if no "jump back" is needed, then do normal processing as this
+ -- combination can be mapped to some action
+ if not navigateBack(editor) then event:Skip() end
+ elseif (keycode == wx.WXK_RETURN or keycode == wx.WXK_NUMPAD_ENTER)
+ and (mod == wx.wxMOD_CONTROL or mod == (wx.wxMOD_CONTROL + wx.wxMOD_SHIFT)) then
+ addOneLine(editor, mod == (wx.wxMOD_CONTROL + wx.wxMOD_SHIFT) and -1 or 0)
+ elseif ide.osname == "Unix" and ide.wxver >= "2.9.5"
+ and mod == wx.wxMOD_CONTROL and editor.ctrlcache[keycode] then
+ ide.frame:AddPendingEvent(wx.wxCommandEvent(
+ wx.wxEVT_COMMAND_MENU_SELECTED, editor.ctrlcache[keycode]))
+ else
+ if ide.osname == 'Macintosh' and mod == wx.wxMOD_META then
+ return -- ignore a key press if Command key is also pressed
+ end
+ event:Skip()
+ end
+ end)
+
+ local function selectAllInstances(instances, name, curpos)
+ local this
+ local idx = 0
+ for _, pos in pairs(instances) do
+ pos = pos - 1 -- positions are 0-based in Scintilla
+ if idx == 0 then
+ -- clear selections first as there seems to be a bug (Scintilla 3.2.3)
+ -- that doesn't reset selection after right mouse click.
+ editor:ClearSelections()
+ editor:SetSelection(pos, pos+#name)
+ else
+ editor:AddSelection(pos+#name, pos)
+ end
+
+ -- check if this is the current selection
+ if curpos >= pos and curpos <= pos+#name then this = idx end
+ idx = idx + 1
+ end
+ if this then editor:SetMainSelection(this) end
+ -- set the current name as the search value to make subsequence searches look for it
+ ide.findReplace:SetFind(name)
+ end
+
+ editor:Connect(wxstc.wxEVT_STC_DOUBLECLICK,
+ function(event)
+ -- only activate selection of instances on Ctrl/Cmd-DoubleClick
+ if event:GetModifiers() == wx.wxMOD_CONTROL then
+ local pos = event:GetPosition()
+ local value = pos ~= wxstc.wxSTC_INVALID_POSITION and editor:ValueFromPosition(pos) or nil
+ local instances = value and indicateFindInstances(editor, value, pos+1)
+ if instances and (instances[0] or #instances > 0) then
+ selectAllInstances(instances, value, pos)
+ return
+ end
+ end
+
+ event:Skip()
+ end)
+
+ editor:Connect(wxstc.wxEVT_STC_ZOOM,
+ function(event)
+ -- if Shift+Zoom is used, then zoom all editors, not just the current one
+ if wx.wxGetKeyState(wx.WXK_SHIFT) then
+ local zoom = editor:GetZoom()
+ for _, doc in pairs(openDocuments) do
+ -- check the editor zoom level to avoid recursion
+ if doc.editor:GetZoom() ~= zoom then doc.editor:SetZoom(zoom) end
+ end
+ end
+ event:Skip()
+ end)
+
+ local pos, value, instances
+ editor:Connect(wx.wxEVT_CONTEXT_MENU,
+ function (event)
+ local point = editor:ScreenToClient(event:GetPosition())
+ pos = editor:PositionFromPointClose(point.x, point.y)
+ value = pos ~= wxstc.wxSTC_INVALID_POSITION and editor:ValueFromPosition(pos) or nil
+ instances = value and indicateFindInstances(editor, value, pos+1)
+
+ local occurrences = (not instances or #instances == 0) and ""
+ or (" (%d)"):format(#instances+(instances[0] and 1 or 0))
+ local line = instances and instances[0] and editor:LineFromPosition(instances[0]-1)+1
+ local def = line and " ("..TR("on line %d"):format(line)..")" or ""
+ local selections = ide.wxver >= "2.9.5" and editor:GetSelections() or 1
+
+ local menu = wx.wxMenu {
+ { ID_UNDO, TR("&Undo") },
+ { ID_REDO, TR("&Redo") },
+ { },
+ { ID_CUT, TR("Cu&t") },
+ { ID_COPY, TR("&Copy") },
+ { ID_PASTE, TR("&Paste") },
+ { ID_SELECTALL, TR("Select &All") },
+ { },
+ { ID_GOTODEFINITION, TR("Go To Definition")..def },
+ { ID_RENAMEALLINSTANCES, TR("Rename All Instances")..occurrences },
+ { ID_REPLACEALLSELECTIONS, TR("Replace All Selections") },
+ { },
+ { ID_QUICKADDWATCH, TR("Add Watch Expression") },
+ { ID_QUICKEVAL, TR("Evaluate In Console") },
+ { ID_ADDTOSCRATCHPAD, TR("Add To Scratchpad") },
+ { ID_RUNTO, TR("Run To Cursor") },
+ }
+
+ menu:Enable(ID_GOTODEFINITION, instances and instances[0])
+ menu:Enable(ID_RENAMEALLINSTANCES, instances and (instances[0] or #instances > 0)
+ or editor:GetSelectionStart() ~= editor:GetSelectionEnd())
+ menu:Enable(ID_REPLACEALLSELECTIONS, selections > 1)
+ menu:Enable(ID_QUICKADDWATCH, value ~= nil)
+ menu:Enable(ID_QUICKEVAL, value ~= nil)
+
+ local debugger = ide.debugger
+ menu:Enable(ID_ADDTOSCRATCHPAD, debugger.scratchpad
+ and debugger.scratchpad.editors and not debugger.scratchpad.editors[editor])
+
+ -- disable calltips that could open over the menu
+ local dwelltime = editor:GetMouseDwellTime()
+ editor:SetMouseDwellTime(0) -- disable dwelling
+
+ -- cancel calltip if it's already shown as it interferes with popup menu
+ if editor:CallTipActive() then editor:CallTipCancel() end
+
+ PackageEventHandle("onMenuEditor", menu, editor, event)
+
+ editor:PopupMenu(menu)
+ editor:SetMouseDwellTime(dwelltime) -- restore dwelling
+ end)
+
+ editor:Connect(ID_RUNTO, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ if pos ~= wxstc.wxSTC_INVALID_POSITION then
+ ide:GetDebugger().runto(editor, editor:LineFromPosition(pos))
+ end
+ end)
+
+ editor:Connect(ID_GOTODEFINITION, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ if value and instances[0] then
+ navigateToPosition(editor, editor:GetCurrentPos(), instances[0]-1, #value)
+ end
+ end)
+
+ editor:Connect(ID_RENAMEALLINSTANCES, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ if value and pos then
+ if not (instances and (instances[0] or #instances > 0)) then
+ -- if multiple instances (of a variable) are not detected,
+ -- then simply find all instances of (selected) `value`
+ instances = {}
+ local length, pos = editor:GetLength(), 0
+ while true do
+ editor:SetTargetStart(pos)
+ editor:SetTargetEnd(length)
+ pos = editor:SearchInTarget(value)
+ if pos == -1 then break end
+ table.insert(instances, pos+1)
+ pos = pos + #value
+ end
+ end
+ selectAllInstances(instances, value, pos)
+ end
+ end)
+
+ editor:Connect(ID_REPLACEALLSELECTIONS, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ local main = editor:GetMainSelection()
+ local text = wx.wxGetTextFromUser(
+ TR("Enter replacement text"),
+ TR("Replace All Selections"),
+ editor:GetTextRangeDyn(editor:GetSelectionNStart(main), editor:GetSelectionNEnd(main))
+ )
+ if not text or text == "" then return end
+
+ editor:BeginUndoAction()
+ for s = 0, editor:GetSelections()-1 do
+ local selst, selend = editor:GetSelectionNStart(s), editor:GetSelectionNEnd(s)
+ editor:SetTargetStart(selst)
+ editor:SetTargetEnd(selend)
+ editor:ReplaceTarget(text)
+ editor:SetSelectionNStart(s, selst)
+ editor:SetSelectionNEnd(s, selst+#text)
+ end
+ editor:EndUndoAction()
+ editor:SetMainSelection(main)
+ end)
+
+ editor:Connect(ID_QUICKADDWATCH, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event) ide:AddWatch(value) end)
+
+ editor:Connect(ID_QUICKEVAL, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event) ShellExecuteCode(value) end)
+
+ editor:Connect(ID_ADDTOSCRATCHPAD, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event) DebuggerScratchpadOn(editor) end)
+
+ return editor
+end
+
+-- ----------------------------------------------------------------------------
+-- Add an editor to the notebook
+function AddEditor(editor, name)
+ assert(notebook:GetPageIndex(editor) == -1, "Editor being added is not in the notebook: failed")
+
+ -- set the document properties
+ local id = editor:GetId()
+ local document = setmetatable({}, ide.proto.Document)
+ document.editor = editor
+ document.fileName = name
+ document.filePath = nil
+ document.modTime = nil
+ document.isModified = false
+ openDocuments[id] = document
+
+ -- add page only after document is created as there may be handlers
+ -- that expect the document (for example, onEditorFocusSet)
+ if not notebook:AddPage(editor, name, true) then
+ openDocuments[id] = nil
+ return
+ else
+ document.index = notebook:GetPageIndex(editor)
+ return document
+ end
+end
+
+function GetSpec(ext,forcespec)
+ local spec = forcespec
+
+ -- search proper spec
+ -- allow forcespec for "override"
+ if ext and not spec then
+ for _,curspec in pairs(ide.specs) do
+ local exts = curspec.exts
+ if (exts) then
+ for _,curext in ipairs(exts) do
+ if (curext == ext) then
+ spec = curspec
+ break
+ end
+ end
+ if (spec) then
+ break
+ end
+ end
+ end
+ end
+ return spec
+end
+
+function SetupKeywords(editor, ext, forcespec, styles, font, fontitalic)
+ local lexerstyleconvert = nil
+ local spec = forcespec or GetSpec(ext)
+ -- found a spec setup lexers and keywords
+ if spec then
+ editor:SetLexer(spec.lexer or wxstc.wxSTC_LEX_NULL)
+ lexerstyleconvert = spec.lexerstyleconvert
+
+ if (spec.keywords) then
+ for i,words in ipairs(spec.keywords) do
+ editor:SetKeyWords(i-1,words)
+ end
+ end
+
+ editor.api = GetApi(spec.apitype or "none")
+ editor.spec = spec
+ else
+ editor:SetLexer(wxstc.wxSTC_LEX_NULL)
+ editor:SetKeyWords(0, "")
+
+ editor.api = GetApi("none")
+ editor.spec = ide.specs.none
+ end
+
+ -- need to set folding property after lexer is set, otherwise
+ -- the folds are not shown (wxwidgets 2.9.5)
+ if edcfg.fold then
+ editor:SetProperty("fold", "1")
+ editor:SetProperty("fold.html", "1")
+ editor:SetProperty("fold.compact", edcfg.foldcompact and "1" or "0")
+ editor:SetProperty("fold.comment", "1")
+ end
+
+ -- quickfix to prevent weird looks, otherwise need to update styling mechanism for cpp
+ -- cpp "greyed out" styles are styleid + 64
+ editor:SetProperty("lexer.cpp.track.preprocessor", "0")
+ editor:SetProperty("lexer.cpp.update.preprocessor", "0")
+
+ -- create italic font if only main font is provided
+ if font and not fontitalic then
+ fontitalic = wx.wxFont(font)
+ fontitalic:SetStyle(wx.wxFONTSTYLE_ITALIC)
+ end
+
+ StylesApplyToEditor(styles or ide.config.styles, editor,
+ font or ide.font.eNormal,fontitalic or ide.font.eItalic,lexerstyleconvert)
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/filetree.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/filetree.lua
new file mode 100644
index 0000000..940fed1
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/filetree.lua
@@ -0,0 +1,903 @@
+-- Copyright 2011-16 Paul Kulchenko, ZeroBrane LLC
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+
+ide.filetree = {
+ projdir = "",
+ projdirlist = {},
+ projdirpartmap = {},
+ projtreeCtrl = nil,
+ imglist = ide:CreateImageList("PROJECT",
+ "FOLDER", "FILE-KNOWN", "FILE-NORMAL", "FILE-NORMAL-START",
+ "FOLDER-MAPPED"),
+ settings = {extensionignore = {}, startfile = {}, mapped = {}},
+}
+local filetree = ide.filetree
+local iscaseinsensitive = wx.wxFileName("A"):SameAs(wx.wxFileName("a"))
+local pathsep = GetPathSeparator()
+local q = EscapeMagic
+local image = {
+ DIRECTORY = 0, FILEKNOWN = 1, FILEOTHER = 2, FILEOTHERSTART = 3,
+ DIRECTORYMAPPED = 4,
+}
+
+MergeSettings(filetree.settings, ide:AddPackage('core.filetree', {}):GetSettings())
+
+-- generic tree
+-- ------------
+
+local function getIcon(name, isdir)
+ local startfile = GetFullPathIfExists(FileTreeGetDir(),
+ filetree.settings.startfile[FileTreeGetDir()])
+ local known = GetSpec(GetFileExt(name))
+ local icon = isdir and image.DIRECTORY or known and image.FILEKNOWN or image.FILEOTHER
+ if startfile and startfile == name then icon = image.FILEOTHERSTART end
+ return icon
+end
+
+local function treeAddDir(tree,parent_id,rootdir)
+ local items = {}
+ local item, cookie = tree:GetFirstChild(parent_id)
+ while item:IsOk() do
+ items[tree:GetItemText(item) .. tree:GetItemImage(item)] = item
+ item, cookie = tree:GetNextChild(parent_id, cookie)
+ end
+
+ local cache = {}
+ local curr
+ local files = FileSysGetRecursive(rootdir)
+ local dirmapped = {}
+ if tree:IsRoot(parent_id) then
+ local mapped = filetree.settings.mapped[FileTreeGetDir()] or {}
+ table.sort(mapped)
+ -- insert into files at the sorted order
+ for i, v in ipairs(mapped) do
+ table.insert(files, i, v)
+ dirmapped[v] = true
+ end
+ end
+
+ for _, file in ipairs(files) do
+ local name, dir = file:match("([^"..pathsep.."]+)("..pathsep.."?)$")
+ local isdir = #dir>0
+ if isdir or not filetree.settings.extensionignore[GetFileExt(name)] then
+ local icon = getIcon(file, isdir)
+
+ -- keep full name for the mapped directories
+ if dirmapped[file] then name, icon = file, image.DIRECTORYMAPPED end
+
+ local item = items[name .. icon]
+ if item then -- existing item
+ -- keep deleting items until we find item
+ while true do
+ local next = (curr
+ and tree:GetNextSibling(curr)
+ or tree:GetFirstChild(parent_id))
+ if not next:IsOk() or name == tree:GetItemText(next) then
+ curr = next
+ break
+ end
+ tree:Delete(next)
+ end
+ else -- new item
+ curr = (curr
+ and tree:InsertItem(parent_id, curr, name, icon)
+ or tree:PrependItem(parent_id, name, icon))
+ if isdir then tree:SetItemHasChildren(curr, FileDirHasContent(file)) end
+ end
+ if curr:IsOk() then cache[iscaseinsensitive and name:lower() or name] = curr end
+ end
+ end
+
+ -- delete any leftovers (something that exists in the tree, but not on disk)
+ while true do
+ local next = (curr
+ and tree:GetNextSibling(curr)
+ or tree:GetFirstChild(parent_id))
+ if not next:IsOk() then break end
+ tree:Delete(next)
+ end
+
+ -- cache the mapping from names to tree items
+ if ide.wxver >= "2.9.5" then
+ local data = wx.wxLuaTreeItemData()
+ data:SetData(cache)
+ tree:SetItemData(parent_id, data)
+ end
+
+ tree:SetItemHasChildren(parent_id,
+ tree:GetChildrenCount(parent_id, false) > 0)
+end
+
+local function treeSetRoot(tree,rootdir)
+ tree:DeleteAllItems()
+ if (not wx.wxDirExists(rootdir)) then return end
+
+ local root_id = tree:AddRoot(rootdir, image.DIRECTORY)
+ tree:SetItemHasChildren(root_id, true) -- make sure that the item can expand
+ tree:Expand(root_id) -- this will also populate the tree
+end
+
+local function findItem(tree, match)
+ local node = tree:GetRootItem()
+ local label = tree:GetItemText(node)
+
+ local s, e
+ if iscaseinsensitive then
+ s, e = string.find(match:lower(), label:lower(), 1, true)
+ else
+ s, e = string.find(match, label, 1, true)
+ end
+ if not s or s ~= 1 then return end
+
+ for token in string.gmatch(string.sub(match,e+1), "[^%"..pathsep.."]+") do
+ local data = tree:GetItemData(node)
+ local cache = data and data:GetData()
+ if cache and cache[iscaseinsensitive and token:lower() or token] then
+ node = cache[iscaseinsensitive and token:lower() or token]
+ else
+ -- token is missing; may need to re-scan the folder; maybe new file
+ local dir = tree:GetItemFullName(node)
+ treeAddDir(tree,node,dir)
+
+ local item, cookie = tree:GetFirstChild(node)
+ while true do
+ if not item:IsOk() then return end -- not found
+ if tree:GetItemText(item) == token then
+ node = item
+ break
+ end
+ item, cookie = tree:GetNextChild(node, cookie)
+ end
+ end
+ end
+
+ -- this loop exits only when a match is found
+ return node
+end
+
+local function treeSetConnectorsAndIcons(tree)
+ tree:AssignImageList(filetree.imglist)
+
+ local function isIt(item, imgtype) return tree:GetItemImage(item) == imgtype end
+
+ function tree:IsDirectory(item_id) return isIt(item_id, image.DIRECTORY) end
+ function tree:IsDirMapped(item_id) return isIt(item_id, image.DIRECTORYMAPPED) end
+ function tree:IsFileKnown(item_id) return isIt(item_id, image.FILEKNOWN) end
+ function tree:IsFileOther(item_id) return isIt(item_id, image.FILEOTHER) end
+ function tree:IsFileStart(item_id) return isIt(item_id, image.FILEOTHERSTART) end
+ function tree:IsRoot(item_id) return not tree:GetItemParent(item_id):IsOk() end
+
+ function tree:FindItem(match)
+ return findItem(self, (wx.wxIsAbsolutePath(match) or match == '') and match
+ or MergeFullPath(ide:GetProject(), match))
+ end
+
+ function tree:GetItemFullName(item_id)
+ local tree = self
+ local str = tree:GetItemText(item_id)
+ local cur = str
+
+ while (#cur > 0) do
+ item_id = tree:GetItemParent(item_id)
+ if not item_id:IsOk() then break end
+ cur = tree:GetItemText(item_id)
+ if cur and #cur > 0 then str = MergeFullPath(cur, str) end
+ end
+ -- as root may already include path separator, normalize the path
+ local fullPath = wx.wxFileName(str)
+ fullPath:Normalize()
+ return fullPath:GetFullPath()
+ end
+
+ function tree:RefreshChildren(node)
+ node = node or tree:GetRootItem()
+ treeAddDir(tree,node,tree:GetItemFullName(node))
+ local item, cookie = tree:GetFirstChild(node)
+ while true do
+ if not item:IsOk() then return end
+ if tree:IsExpanded(item) then tree:RefreshChildren(item) end
+ item, cookie = tree:GetNextChild(node, cookie)
+ end
+ end
+
+ local function refreshAncestors(node)
+ -- when this method is called from END_EDIT, it causes infinite loop
+ -- on OSX (wxwidgets 2.9.5) as Delete in treeAddDir calls END_EDIT again.
+ -- disable handlers while the tree is populated and then enable back.
+ tree:SetEvtHandlerEnabled(false)
+ while node:IsOk() do
+ local dir = tree:GetItemFullName(node)
+ treeAddDir(tree,node,dir)
+ node = tree:GetItemParent(node)
+ end
+ tree:SetEvtHandlerEnabled(true)
+ end
+
+ function tree:ActivateItem(item_id)
+ local name = tree:GetItemFullName(item_id)
+
+ local event = wx.wxTreeEvent(wx.wxEVT_COMMAND_TREE_ITEM_ACTIVATED, item_id:GetValue())
+ if PackageEventHandle("onFiletreeActivate", tree, event, item_id) == false then
+ return
+ end
+
+ -- refresh the folder
+ if (tree:IsDirectory(item_id) or tree:IsDirMapped(item_id)) then
+ if wx.wxDirExists(name) then treeAddDir(tree,item_id,name)
+ else refreshAncestors(tree:GetItemParent(item_id)) end -- stale content
+ else -- open file
+ if wx.wxFileExists(name) then LoadFile(name,nil,true)
+ else refreshAncestors(tree:GetItemParent(item_id)) end -- stale content
+ end
+ end
+
+ local function unMapDir(dir)
+ local project = FileTreeGetDir()
+ local mapped = filetree.settings.mapped[project] or {}
+ for k, m in ipairs(mapped) do
+ if m == dir then table.remove(mapped, k) end
+ end
+ filetree.settings.mapped[project] = mapped
+ refreshAncestors(tree:GetRootItem())
+ end
+ local function mapDir()
+ local project = FileTreeGetDir()
+ local dirPicker = wx.wxDirDialog(ide.frame, TR("Choose a directory to map"),
+ project ~= "" and project or wx.wxGetCwd(), wx.wxDIRP_DIR_MUST_EXIST)
+ if dirPicker:ShowModal(true) ~= wx.wxID_OK then return end
+ local dir = wx.wxFileName.DirName(FixDir(dirPicker:GetPath())):GetFullPath()
+ local mapped = filetree.settings.mapped[project] or {}
+ for _, m in ipairs(mapped) do
+ if m == dir then return end -- already on the list
+ end
+ table.insert(mapped, dir)
+ filetree.settings.mapped[project] = mapped
+ refreshAncestors(tree:GetRootItem())
+ end
+
+ local empty = ""
+ local function renameItem(itemsrc, target)
+ local cache = type(itemsrc) == 'table' and itemsrc or nil
+ local isdir = not cache and tree:IsDirectory(itemsrc) or cache and cache.isdir or false
+ local isnew = not cache and tree:GetItemText(itemsrc) == empty or cache and cache.isnew or false
+ local source = cache and cache.fullname or tree:GetItemFullName(itemsrc)
+ local fn = wx.wxFileName(target)
+
+ -- check if the target is the same as the source;
+ -- SameAs check is not used here as "Test" and "test" are the same
+ -- on case insensitive systems, but need to be allowed in renaming.
+ if source == target then return end
+
+ local docs = {}
+ if not isnew then -- find if source is already opened in the editor
+ docs = (isdir
+ and ide:FindDocumentsByPartialPath(source)
+ or {ide:FindDocument(source)})
+ for _, doc in ipairs(docs) do
+ if not isdir and PackageEventHandle("onEditorPreSave", doc.editor, source) == false then
+ return false
+ end
+ if SaveModifiedDialog(doc.editor, true) == wx.wxID_CANCEL then return end
+ end
+ end
+
+ -- check if existing file/dir is going to be overwritten
+ local overwrite = ((wx.wxFileExists(target) or wx.wxDirExists(target))
+ and not wx.wxFileName(source):SameAs(fn))
+ if overwrite and not ApproveFileOverwrite() then return false end
+
+ if not fn:Mkdir(tonumber(755,8), wx.wxPATH_MKDIR_FULL) then
+ ReportError(TR("Unable to create directory '%s'."):format(target))
+ return false
+ end
+
+ if isnew then -- new directory or file; create manually
+ if (isdir and not wx.wxFileName.DirName(target):Mkdir(tonumber(755,8), wx.wxPATH_MKDIR_FULL))
+ or (not isdir and not FileWrite(target, "")) then
+ ReportError(TR("Unable to create file '%s'."):format(target))
+ return false
+ end
+ else -- existing directory or file; rename/move it
+ local ok, err = FileRename(source, target)
+ if not ok then
+ ReportError(TR("Unable to rename file '%s'."):format(source)
+ .."\nError: "..err)
+ return false
+ end
+ end
+
+ refreshAncestors(cache and cache.parent or tree:GetItemParent(itemsrc))
+ -- load file(s) into the same editor (if any); will also refresh the tree
+ if #docs > 0 then
+ for _, doc in ipairs(docs) do
+ local fullpath = doc.filePath
+ doc.filePath = nil -- remove path to avoid "file no longer exists" message
+ -- when moving folders, /foo/bar/file.lua can be replaced with
+ -- /foo/baz/bar/file.lua, so change /foo/bar to /foo/baz/bar
+ local path = (not iscaseinsensitive and fullpath:gsub(q(source), target)
+ or fullpath:lower():gsub(q(source:lower()), target))
+ local editor = LoadFile(path)
+ -- check if the file was loaded into another editor;
+ -- this is possible if "foo" is renamed to "bar" and both are opened;
+ -- if this happens, then "bar" is refreshed and "foo" can be closed.
+ if doc.editor:GetId() ~= editor:GetId() then ClosePage(doc.index) end
+ if not isdir and editor then PackageEventHandle("onEditorSave", editor) end
+ end
+ else -- refresh the tree and select the new item
+ local itemdst = tree:FindItem(target)
+ if itemdst then
+ refreshAncestors(tree:GetItemParent(itemdst))
+ tree:SelectItem(itemdst)
+ tree:EnsureVisible(itemdst)
+ tree:SetScrollPos(wx.wxHORIZONTAL, 0, true)
+ end
+ end
+
+ -- refresh the target if it's open and has been overwritten
+ if overwrite and not isdir then
+ local doc = ide:FindDocument(target)
+ if doc then LoadFile(doc:GetFilePath(), doc:GetEditor()) end
+ end
+
+ return true
+ end
+ local function deleteItem(item_id)
+ -- if delete is for mapped directory, unmap it instead
+ if tree:IsDirMapped(item_id) then
+ unMapDir(tree:GetItemText(item_id))
+ return
+ end
+
+ local isdir = tree:IsDirectory(item_id)
+ local source = tree:GetItemFullName(item_id)
+
+ if isdir and FileDirHasContent(source..pathsep) then return false end
+ if wx.wxMessageBox(
+ TR("Do you want to delete '%s'?"):format(source),
+ GetIDEString("editormessage"),
+ wx.wxYES_NO + wx.wxCENTRE, ide.frame) ~= wx.wxYES then return false end
+
+ if isdir then
+ if not wx.wxRmdir(source) then
+ ReportError(TR("Unable to delete directory '%s': %s")
+ :format(source, wx.wxSysErrorMsg()))
+ end
+ else
+ local doc = ide:FindDocument(source)
+ if doc then ClosePage(doc.index) end
+ if not wx.wxRemoveFile(source) then
+ ReportError(TR("Unable to delete file '%s': %s")
+ :format(source, wx.wxSysErrorMsg()))
+ end
+ end
+ refreshAncestors(tree:GetItemParent(item_id))
+ return true
+ end
+
+ tree:Connect(wx.wxEVT_COMMAND_TREE_ITEM_EXPANDING,
+ function (event)
+ local item_id = event:GetItem()
+ local dir = tree:GetItemFullName(item_id)
+ if wx.wxDirExists(dir) then treeAddDir(tree,item_id,dir) -- refresh folder
+ else refreshAncestors(tree:GetItemParent(item_id)) end -- stale content
+ return true
+ end)
+ tree:Connect(wx.wxEVT_COMMAND_TREE_ITEM_ACTIVATED,
+ function (event)
+ tree:ActivateItem(event:GetItem())
+ end)
+
+ local function saveSettings()
+ ide:AddPackage('core.filetree', {}):SetSettings(filetree.settings)
+ end
+
+ -- refresh the tree
+ local function refreshChildren()
+ tree:RefreshChildren()
+ -- now mark the current file (if it was previously disabled)
+ local editor = ide:GetEditor()
+ if editor then FileTreeMarkSelected(ide:GetDocument(editor):GetFilePath()) end
+ end
+
+ -- handle context menu
+ local function addItem(item_id, name, img)
+ local isdir = tree:IsDirectory(item_id)
+ local parent = isdir and item_id or tree:GetItemParent(item_id)
+ if isdir then tree:Expand(item_id) end -- expand to populate if needed
+
+ local item = tree:PrependItem(parent, name, img)
+ tree:SetItemHasChildren(parent, true)
+ -- temporarily disable expand as we don't need this node populated
+ tree:SetEvtHandlerEnabled(false)
+ tree:EnsureVisible(item)
+ tree:SetEvtHandlerEnabled(true)
+ return item
+ end
+
+ local function unsetStartFile()
+ local project = FileTreeGetDir()
+ local startfile = filetree.settings.startfile[project]
+ filetree.settings.startfile[project] = nil
+ if startfile then
+ local item_id = tree:FindItem(startfile)
+ if item_id and item_id:IsOk() then
+ tree:SetItemImage(item_id, getIcon(tree:GetItemFullName(item_id)))
+ end
+ end
+ end
+
+ local function setStartFile(item_id)
+ local project = FileTreeGetDir()
+ local startfile = tree:GetItemFullName(item_id):gsub(project, "")
+ filetree.settings.startfile[project] = startfile
+ tree:SetItemImage(item_id, getIcon(tree:GetItemFullName(item_id)))
+ end
+
+ tree:Connect(ID_NEWFILE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ tree:EditLabel(addItem(tree:GetSelection(), empty, image.FILEOTHER))
+ end)
+ tree:Connect(ID_NEWDIRECTORY, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ tree:EditLabel(addItem(tree:GetSelection(), empty, image.DIRECTORY))
+ end)
+ tree:Connect(ID_RENAMEFILE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() tree:EditLabel(tree:GetSelection()) end)
+ tree:Connect(ID_DELETEFILE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() deleteItem(tree:GetSelection()) end)
+ tree:Connect(ID_COPYFULLPATH, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() ide:CopyToClipboard(tree:GetItemFullName(tree:GetSelection())) end)
+ tree:Connect(ID_OPENEXTENSION, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ local fname = tree:GetItemFullName(tree:GetSelection())
+ local ext = '.'..wx.wxFileName(fname):GetExt()
+ local ft = wx.wxTheMimeTypesManager:GetFileTypeFromExtension(ext)
+ if ft then
+ local cmd = ft:GetOpenCommand(fname:gsub('"','\\"'))
+ local pid = wx.wxExecute(cmd, wx.wxEXEC_ASYNC)
+ if ide.osname == 'Windows' and pid and pid > 0 then
+ -- some programs on Windows (for example, PhotoViewer) accept
+ -- files with spaces in names ONLY if they are not in quotes.
+ -- wait for the process that failed to open file to finish
+ -- and retry without quotes.
+ wx.wxMilliSleep(250) -- 250ms seems enough; picked empirically.
+ if not wx.wxProcess.Exists(pid) then
+ local cmd = ft:GetOpenCommand(""):gsub('""%s*$', '')..fname
+ wx.wxExecute(cmd, wx.wxEXEC_ASYNC)
+ end
+ end
+ end
+ end)
+ tree:Connect(ID_REFRESH, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() refreshChildren() end)
+ tree:Connect(ID_SHOWLOCATION, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() ShowLocation(tree:GetItemFullName(tree:GetSelection())) end)
+ tree:Connect(ID_HIDEEXTENSION, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ local ext = GetFileExt(tree:GetItemText(tree:GetSelection()))
+ filetree.settings.extensionignore[ext] = true
+ saveSettings()
+ refreshChildren()
+ end)
+ tree:Connect(ID_SHOWEXTENSIONALL, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ filetree.settings.extensionignore = {}
+ saveSettings()
+ refreshChildren()
+ end)
+ tree:Connect(ID_SETSTARTFILE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ unsetStartFile()
+ setStartFile(tree:GetSelection())
+ saveSettings()
+ end)
+ tree:Connect(ID_UNSETSTARTFILE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ unsetStartFile()
+ saveSettings()
+ end)
+ tree:Connect(ID_MAPDIRECTORY, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ mapDir()
+ saveSettings()
+ end)
+ tree:Connect(ID_UNMAPDIRECTORY, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ unMapDir(tree:GetItemText(tree:GetSelection()))
+ saveSettings()
+ end)
+ tree:Connect(ID_PROJECTDIRFROMDIR, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ ProjectUpdateProjectDir(tree:GetItemFullName(tree:GetSelection()))
+ end)
+
+ tree:Connect(wx.wxEVT_COMMAND_TREE_ITEM_MENU,
+ function (event)
+ local item_id = event:GetItem()
+ tree:SelectItem(item_id)
+
+ local renamelabel = (tree:IsRoot(item_id)
+ and TR("&Edit Project Directory")
+ or TR("&Rename"))
+ local fname = tree:GetItemText(item_id)
+ local ext = GetFileExt(fname)
+ local startfile = filetree.settings.startfile[FileTreeGetDir()]
+ local menu = wx.wxMenu {
+ { ID_NEWFILE, TR("New &File") },
+ { ID_NEWDIRECTORY, TR("&New Directory") },
+ { },
+ { ID_RENAMEFILE, renamelabel..KSC(ID_RENAMEFILE) },
+ { ID_DELETEFILE, TR("&Delete")..KSC(ID_DELETEFILE) },
+ { ID_REFRESH, TR("Refresh") },
+ { },
+ { ID_HIDEEXTENSION, TR("Hide '.%s' Files"):format(ext) },
+ { },
+ { ID_SETSTARTFILE, TR("Set As Start File") },
+ { ID_UNSETSTARTFILE, TR("Unset '%s' As Start File"):format(startfile or "<none>") },
+ { },
+ { ID_MAPDIRECTORY, TR("Map Directory...") },
+ { ID_UNMAPDIRECTORY, TR("Unmap Directory") },
+ { ID_OPENEXTENSION, TR("Open With Default Program") },
+ { ID_COPYFULLPATH, TR("Copy Full Path") },
+ { ID_SHOWLOCATION, TR("Show Location") },
+ }
+ local extlist = {
+ {},
+ { ID_SHOWEXTENSIONALL, TR("Show All Files"), TR("Show all files") },
+ }
+ for ext in pairs(filetree.settings.extensionignore) do
+ local id = ID("filetree.showextension."..ext)
+ table.insert(extlist, 1, {id, '.'..ext})
+ menu:Connect(id, wx.wxEVT_COMMAND_MENU_SELECTED, function()
+ filetree.settings.extensionignore[ext] = nil
+ saveSettings()
+ refreshChildren()
+ end)
+ end
+ local _, _, hideextpos = ide:FindMenuItem(ID_HIDEEXTENSION, menu)
+ assert(hideextpos, "Can't find HideExtension menu item")
+ menu:Insert(hideextpos+1, wx.wxMenuItem(menu, ID_SHOWEXTENSION,
+ TR("Show Hidden Files"), TR("Show files previously hidden"),
+ wx.wxITEM_NORMAL, wx.wxMenu(extlist)))
+
+ local projectdirectorymenu = wx.wxMenu {
+ { },
+ {ID_PROJECTDIRCHOOSE, TR("Choose...")..KSC(ID_PROJECTDIRCHOOSE), TR("Choose a project directory")},
+ {ID_PROJECTDIRFROMDIR, TR("Set To Selected Directory")..KSC(ID_PROJECTDIRFROMDIR), TR("Set project directory to the selected one")},
+ }
+ local projectdirectory = wx.wxMenuItem(menu, ID_PROJECTDIR,
+ TR("Project Directory"), TR("Set the project directory to be used"),
+ wx.wxITEM_NORMAL, projectdirectorymenu)
+ local _, _, unmapdirpos = ide:FindMenuItem(ID_UNMAPDIRECTORY, menu)
+ assert(unmapdirpos, "Can't find UnMapDirectory menu item")
+ menu:Insert(unmapdirpos+1, projectdirectory)
+ FileTreeProjectListUpdate(projectdirectorymenu, 0)
+
+ -- disable Delete on non-empty directories
+ local isdir = tree:IsDirectory(item_id)
+ local ismapped = tree:IsDirMapped(item_id)
+ menu:Destroy(ismapped and ID_MAPDIRECTORY or ID_UNMAPDIRECTORY)
+ if not startfile then menu:Destroy(ID_UNSETSTARTFILE) end
+ if ismapped then menu:Enable(ID_RENAMEFILE, false) end
+ if isdir then
+ local source = tree:GetItemFullName(item_id)
+ menu:Enable(ID_DELETEFILE, not FileDirHasContent(source..pathsep))
+ menu:Enable(ID_OPENEXTENSION, false)
+ menu:Enable(ID_HIDEEXTENSION, false)
+ else
+ local ft = wx.wxTheMimeTypesManager:GetFileTypeFromExtension('.'..ext)
+ menu:Enable(ID_OPENEXTENSION, ft and #ft:GetOpenCommand("") > 0)
+ menu:Enable(ID_HIDEEXTENSION, not filetree.settings.extensionignore[ext])
+ menu:Enable(ID_PROJECTDIRFROMDIR, false)
+ end
+ menu:Enable(ID_SETSTARTFILE, tree:IsFileOther(item_id) or tree:IsFileKnown(item_id))
+ menu:Enable(ID_SHOWEXTENSION, next(filetree.settings.extensionignore) ~= nil)
+
+ PackageEventHandle("onMenuFiletree", menu, tree, event)
+
+ -- stopping/restarting garbage collection is generally not needed,
+ -- but on Linux not stopping is causing crashes (wxwidgets 2.9.5 and 3.1.0)
+ -- when symbol indexing is done while popup menu is open (with gc methods in the trace).
+ -- this only happens when EVT_IDLE is called when popup menu is open.
+ collectgarbage("stop")
+
+ -- stopping UI updates is generally not needed as well,
+ -- but it's causing a crash on OSX (wxwidgets 2.9.5 and 3.1.0)
+ -- when symbol indexing is done while popup menu is open, so it's disabled
+ local interval = wx.wxUpdateUIEvent.GetUpdateInterval()
+ wx.wxUpdateUIEvent.SetUpdateInterval(-1) -- don't update
+
+ tree:PopupMenu(menu)
+ wx.wxUpdateUIEvent.SetUpdateInterval(interval)
+ collectgarbage("restart")
+ end)
+
+ tree:Connect(wx.wxEVT_RIGHT_DOWN,
+ function (event)
+ local item_id = tree:HitTest(event:GetPosition())
+ if PackageEventHandle("onFiletreeRDown", tree, event, item_id) == false then
+ return
+ end
+ event:Skip()
+ end)
+
+ -- toggle a folder on a single click
+ tree:Connect(wx.wxEVT_LEFT_DOWN,
+ function (event)
+ -- only toggle if this is a folder and the click is on the item line
+ -- (exclude the label as it's used for renaming and dragging)
+ local mask = (wx.wxTREE_HITTEST_ONITEMINDENT
+ + wx.wxTREE_HITTEST_ONITEMICON + wx.wxTREE_HITTEST_ONITEMRIGHT)
+ local item_id, flags = tree:HitTest(event:GetPosition())
+
+ if PackageEventHandle("onFiletreeLDown", tree, event, item_id) == false then
+ return
+ end
+
+ if item_id and bit.band(flags, mask) > 0 then
+ if tree:IsDirectory(item_id) then
+ tree:Toggle(item_id)
+ tree:SelectItem(item_id)
+ else
+ local name = tree:GetItemFullName(item_id)
+ if wx.wxFileExists(name) then LoadFile(name,nil,true) end
+ end
+ else
+ event:Skip()
+ end
+ return true
+ end)
+ local parent
+ tree:Connect(wx.wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT,
+ function (event)
+ local itemsrc = event:GetItem()
+ parent = tree:GetItemParent(itemsrc)
+ if not itemsrc:IsOk() or tree:IsDirMapped(itemsrc) then event:Veto() end
+ end)
+ tree:Connect(wx.wxEVT_COMMAND_TREE_END_LABEL_EDIT,
+ function (event)
+ -- veto the event to keep the original label intact as the tree
+ -- is going to be refreshed with the correct names.
+ event:Veto()
+
+ local itemsrc = event:GetItem()
+ if not itemsrc:IsOk() then return end
+
+ local label = event:GetLabel():gsub("^%s+$","") -- clean all spaces
+
+ -- edited the root element; set the new project directory if needed
+ local cancelled = event:IsEditCancelled()
+ if tree:IsRoot(itemsrc) then
+ if not cancelled and wx.wxDirExists(label) then
+ ProjectUpdateProjectDir(label)
+ end
+ return
+ end
+
+ if not parent or not parent:IsOk() then return end
+ local target = MergeFullPath(tree:GetItemFullName(parent), label)
+ if cancelled or label == empty then refreshAncestors(parent)
+ elseif target then
+ -- normally, none of this caching would be needed as `renameItem`
+ -- would be called to check if the item can be renamed;
+ -- however, as it may open a dialog box, on Linux it's causing a crash
+ -- (caused by the same END_LABEL_EDIT even triggered one more time),
+ -- so to protect from that, `renameItem` is called from IDLE event.
+ -- Unfortunately, by that time, the filetree item (`itemsrc`) may
+ -- already have incorrect state (as it's removed from the tree),
+ -- so its properties need to be cached to be used from IDLE event.
+ local cache = {
+ isdir = tree:IsDirectory(itemsrc),
+ isnew = tree:GetItemText(itemsrc) == empty,
+ fullname = tree:GetItemFullName(itemsrc),
+ parent = parent,
+ }
+ ide:DoWhenIdle(function()
+ if not renameItem(cache, target) then refreshAncestors(parent) end
+ end)
+ end
+ end)
+
+ local itemsrc
+ tree:Connect(wx.wxEVT_COMMAND_TREE_BEGIN_DRAG,
+ function (event)
+ if ide.config.filetree.mousemove and tree:GetItemParent(event:GetItem()):IsOk() then
+ itemsrc = event:GetItem()
+ event:Allow()
+ end
+ end)
+ tree:Connect(wx.wxEVT_COMMAND_TREE_END_DRAG,
+ function (event)
+ local itemdst = event:GetItem()
+ if not itemdst:IsOk() or not itemsrc:IsOk() then return end
+
+ -- check if itemdst is a folder
+ local target = tree:GetItemFullName(itemdst)
+ if wx.wxDirExists(target) then
+ local source = tree:GetItemFullName(itemsrc)
+ -- check if moving the directory and target is a subfolder of source
+ if (target..pathsep):find("^"..q(source)..pathsep) then return end
+ renameItem(itemsrc, MergeFullPath(target, tree:GetItemText(itemsrc)))
+ end
+ end)
+end
+
+-- project
+local projtree = wx.wxTreeCtrl(ide.frame, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxDefaultSize,
+ wx.wxTR_HAS_BUTTONS + wx.wxTR_SINGLE + wx.wxTR_LINES_AT_ROOT
+ + wx.wxTR_EDIT_LABELS + wx.wxNO_BORDER)
+projtree:SetFont(ide.font.fNormal)
+filetree.projtreeCtrl = projtree
+
+ide:GetProjectNotebook():AddPage(projtree, TR("Project"), true)
+
+-- proj connectors
+-- ---------------
+
+treeSetConnectorsAndIcons(projtree)
+
+-- proj functions
+-- ---------------
+
+function filetree:updateProjectDir(newdir)
+ if (not newdir) or not wx.wxDirExists(newdir) then return end
+ local dirname = wx.wxFileName.DirName(newdir)
+
+ if filetree.projdir and #filetree.projdir > 0
+ and dirname:SameAs(wx.wxFileName.DirName(filetree.projdir)) then return end
+
+ -- strip the last path separator if any
+ local newdir = dirname:GetPath(wx.wxPATH_GET_VOLUME)
+
+ -- save the current interpreter as it may be reset in onProjectClose
+ -- when the project event handlers manipulates interpreters
+ local intfname = ide.interpreter and ide.interpreter.fname
+
+ if filetree.projdir and #filetree.projdir > 0 then
+ PackageEventHandle("onProjectClose", filetree.projdir)
+ end
+
+ PackageEventHandle("onProjectPreLoad", newdir)
+
+ if ide.config.projectautoopen and filetree.projdir then
+ StoreRestoreProjectTabs(filetree.projdir, newdir, intfname)
+ end
+
+ filetree.projdir = newdir
+ filetree.projdirpartmap = {}
+
+ PrependStringToArray(
+ filetree.projdirlist,
+ newdir,
+ ide.config.projecthistorylength,
+ function(s1, s2) return dirname:SameAs(wx.wxFileName.DirName(s2)) end)
+
+ ProjectUpdateProjectDir(newdir,true)
+ treeSetRoot(projtree,newdir)
+
+ -- sync with the current editor window and activate selected file
+ local editor = GetEditor()
+ if editor then FileTreeMarkSelected(ide:GetDocument(editor):GetFilePath()) end
+
+ -- refresh Recent Projects menu item
+ ide.frame:AddPendingEvent(wx.wxUpdateUIEvent(ID_RECENTPROJECTS))
+
+ PackageEventHandle("onProjectLoad", newdir)
+end
+
+function FileTreeGetDir()
+ return (filetree.projdir and #filetree.projdir > 0
+ and wx.wxFileName.DirName(filetree.projdir):GetFullPath() or nil)
+end
+
+function FileTreeSetProjects(tab)
+ filetree.projdirlist = tab
+ if (tab and tab[1]) then
+ filetree:updateProjectDir(tab[1])
+ end
+end
+
+function FileTreeGetProjects()
+ return filetree.projdirlist
+end
+
+local function getProjectLabels()
+ local labels = {}
+ local fmt = ide.config.format.menurecentprojects or '%f'
+ for _, proj in ipairs(FileTreeGetProjects()) do
+ local config = ide.session.projects[proj]
+ local intfname = config and config[2] and config[2].interpreter or ide.interpreter:GetFileName()
+ local interpreter = intfname and ide.interpreters[intfname]
+ local parts = wx.wxFileName(proj..pathsep):GetDirs()
+ table.insert(labels, ExpandPlaceholders(fmt, {
+ f = proj,
+ i = interpreter and interpreter:GetName() or (intfname or '')..'?',
+ s = parts[#parts] or '',
+ }))
+ end
+ return labels
+end
+
+function FileTreeProjectListClear()
+ -- remove all items from the list except the current one
+ filetree.projdirlist = {FileTreeGetDir()}
+end
+
+function FileTreeProjectListUpdate(menu, items)
+ -- protect against recent project menu not being present
+ if not ide:FindMenuItem(ID_RECENTPROJECTS) then return end
+
+ local list = getProjectLabels()
+ for i=#list, 1, -1 do
+ local id = ID("file.recentprojects."..i)
+ local label = list[i]
+ if i <= items then -- this is an existing item; update the label
+ menu:FindItem(id):SetItemLabel(label)
+ else -- need to add an item
+ local item = wx.wxMenuItem(menu, id, label, "")
+ menu:Insert(items, item)
+ ide.frame:Connect(id, wx.wxEVT_COMMAND_MENU_SELECTED, function()
+ wx.wxSafeYield() -- let the menu on screen (if any) disappear
+ ProjectUpdateProjectDir(FileTreeGetProjects()[i])
+ end)
+ end
+ -- disable the currently selected project
+ if i == 1 then menu:Enable(id, false) end
+ end
+ for i=items, #list+1, -1 do -- delete the rest if the list got shorter
+ menu:Delete(menu:FindItemByPosition(i-1))
+ end
+ return #list
+end
+
+local curr_file
+function FileTreeMarkSelected(file)
+ if not file or not filetree.projdir or #filetree.projdir == 0 then return end
+
+ local item_id = wx.wxIsAbsolutePath(file) and projtree:FindItem(file)
+
+ -- if the select item is different from the current one
+ -- or the current one is the same, but not bold (which may happen when
+ -- the project is changed to one that includes the current item)
+ if curr_file ~= file
+ or item_id and not projtree:IsBold(item_id) then
+ if curr_file then
+ local curr_id = wx.wxIsAbsolutePath(curr_file) and projtree:FindItem(curr_file)
+ if curr_id and projtree:IsBold(curr_id) then
+ projtree:SetItemBold(curr_id, false)
+ end
+ end
+ if item_id then
+ projtree:EnsureVisible(item_id)
+ projtree:SetScrollPos(wx.wxHORIZONTAL, 0, true)
+ projtree:SetItemBold(item_id, true)
+ end
+ curr_file = file
+ if ide.wxver < "2.9.5" and ide.osname == 'Macintosh' then
+ projtree:Refresh()
+ end
+ end
+end
+
+function FileTreeFindByPartialName(name)
+ -- check if it's already cached
+ if filetree.projdirpartmap[name] then return filetree.projdirpartmap[name] end
+
+ -- this function may get a partial name that starts with ... and has
+ -- an abbreviated path (as generated by stack traces);
+ -- remove starting "..." if any and escape
+ local pattern = q(name:gsub("^%.%.%.","")):gsub("[\\/]", "[\\/]").."$"
+ local lpattern = pattern:lower()
+
+ for _, file in ipairs(FileSysGetRecursive(filetree.projdir, true)) do
+ if file:find(pattern) or iscaseinsensitive and file:lower():find(lpattern) then
+ filetree.projdirpartmap[name] = file
+ return file
+ end
+ end
+ return
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/findreplace.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/findreplace.lua
new file mode 100644
index 0000000..3159585
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/findreplace.lua
@@ -0,0 +1,1275 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Lomtik Software (J. Winwood & John Labenski)
+-- Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+local searchpanel = 'searchpanel'
+local q = EscapeMagic
+local unpack = table.unpack or unpack
+ide.findReplace = {
+ panel = nil, -- the control for find/replace
+ replace = false, -- is it a find or replace
+ infiles = false,
+ backfocus = nil, -- editor and position to return focus to
+ cureditor = nil, -- the editor being searched
+ reseditor = nil, -- the editor for search results
+ oveditor = nil, -- the editor is used for search during find-in-files
+ findCtrl = nil, -- the control that has the search text
+ replaceCtrl = nil, -- the control that has the replace text
+ scopeText = nil,
+ foundString = false, -- was the string found for the last search
+ curfilename = "", -- for search in files
+ inselection = false,
+ occurrences = 0,
+ files = 0,
+
+ settings = {
+ flags = {
+ WholeWord = false, -- match whole words
+ MatchCase = false, -- case sensitive
+ RegularExpr = false, -- use regex
+ Wrap = true, -- search wraps around
+ Down = true, -- search downwards in doc
+ Context = true, -- include context in search results
+ SubDirs = true, -- search in subdirectories
+ MultiResults = false, -- show multiple result tabs
+ },
+ flist = {},
+ rlist = {},
+ slist = {},
+ },
+
+ -- HasText() is there a string to search for
+ -- GetSelection() get currently selected string if it's on one line
+ -- Find(reverse) find the text
+ -- Show(replace) create the dialog
+ -- GetEditor() which editor to use
+}
+local findReplace = ide.findReplace
+local NOTFOUND = -1
+local replaceHintText = '<replace with>'
+local sep = ';'
+
+function findReplace:GetEditor(reset)
+ if reset or not ide:IsValidCtrl(self.cureditor) then self.cureditor = nil end
+ self.cureditor = ide:GetEditorWithLastFocus() or self.cureditor
+ return self.oveditor or self.cureditor or GetEditor()
+end
+
+-------------------- Find replace dialog
+
+local function setSearchFlags(editor)
+ local flags = wxstc.wxSTC_FIND_POSIX
+ local f = findReplace.settings.flags
+ if f.WholeWord then flags = flags + wxstc.wxSTC_FIND_WHOLEWORD end
+ if f.MatchCase then flags = flags + wxstc.wxSTC_FIND_MATCHCASE end
+ if f.RegularExpr then flags = flags + wxstc.wxSTC_FIND_REGEXP end
+ editor:SetSearchFlags(flags)
+end
+
+local function setTarget(editor, flags)
+ flags = flags or {}
+ local fDown, fAll, fWrap = flags.Down, flags.All, flags.Wrap
+ local len = editor:GetLength()
+ local selStart, selEnd = editor:GetSelectionStart(), editor:GetSelectionEnd()
+ local s, e
+ if fDown then
+ e = flags.EndPos or len
+ s = math.min(e, math.max(flags.StartPos or 0, iff(fAll, selStart, selEnd)))
+ else -- reverse the range for the backward search
+ e = flags.StartPos or 0
+ s = math.max(e, math.min(flags.EndPos or len, iff(fAll, selEnd, selStart)))
+ end
+ -- if wrap around and search all requested, then search the entire document
+ if fAll and fWrap then s, e = 0, len end
+ editor:SetTargetStart(s)
+ editor:SetTargetEnd(e)
+ return e
+end
+
+function findReplace:IsPreview(editor)
+ local ok, ispreview = pcall(function() return editor and editor.searchpreview end)
+ return ok and ispreview and true or false
+end
+
+function findReplace:CanSave(editor)
+ return editor and editor:GetModify() and self:IsPreview(editor) and editor or nil
+end
+
+function findReplace:HasText()
+ if not self.panel then self:createPanel() end
+ local findText = self.findCtrl:GetValue()
+ return findText ~= nil and #findText > 0 and findText or nil
+end
+
+function findReplace:SetStatus(msg)
+ if self.status then self.status:SetLabel(msg) end
+end
+
+function findReplace:SetFind(text)
+ if not self.panel then self:createPanel() end
+ local ctrl = self.findCtrl
+ if text and ctrl then
+ if ctrl:GetValue() ~= text then ctrl:ChangeValue(text) end
+ return text
+ end
+ return
+end
+
+function findReplace:GetFind(...) return self:HasText() end
+
+function findReplace:GetFlags() return self.settings.flags end
+
+function findReplace:SetReplace(text)
+ if not self.panel then self:createPanel() end
+ local ctrl = self.replaceCtrl
+ if text and ctrl then
+ if ctrl:GetValue() ~= text then ctrl:ChangeValue(text) end
+ return text
+ end
+ return
+end
+
+function findReplace:GetScope()
+ local scopeval = self.scope:GetValue()
+ local dir, mask = scopeval:match(('([^%s]*)%s%%s*(.+)'):format(sep,sep))
+ if not dir then dir = scopeval end
+ -- trip leading/trailing spaces from the directory
+ dir = dir:gsub("^%s+",""):gsub("%s+$","")
+ -- if the directory doesn't exist, treat it as the extension(s)
+ if not mask and not wx.wxDirExists(dir) and dir:find('%*') then
+ dir, mask = ide:GetProject() or wx.wxGetCwd(), (#dir > 0 and dir or nil)
+ end
+ return dir, mask
+end
+
+function findReplace:SetScope(dir, mask)
+ return dir .. (mask and (sep..' '..mask) or "")
+end
+
+function findReplace:GetScopeMRU(head)
+ local patt, match = "^"..q(head)
+ for _, v in ipairs(findReplace.settings.slist) do
+ if v:find(patt) then match = v; break end
+ end
+ return match
+end
+
+function findReplace:GetWordAtCaret()
+ local editor = self:GetEditor()
+ if editor then
+ local pos = editor:GetCurrentPos()
+ local text = editor:GetTextRangeDyn( -- try to select a word under caret
+ editor:WordStartPosition(pos, true), editor:WordEndPosition(pos, true))
+ if #text == 0 then
+ editor:GetTextRangeDyn( -- try to select a non-word under caret
+ editor:WordStartPosition(pos, false), editor:WordEndPosition(pos, false))
+ end
+ return #text > 0 and text or nil
+ end
+ return
+end
+
+function findReplace:GetSelection()
+ local editor = self:GetEditor()
+ if editor then
+ local startSel = editor:GetSelectionStart()
+ local endSel = editor:GetSelectionEnd()
+ if (startSel ~= endSel)
+ and (editor:LineFromPosition(startSel) == editor:LineFromPosition(endSel)) then
+ return editor:GetTextRangeDyn(startSel, endSel)
+ end
+ end
+ return
+end
+
+function findReplace:Find(reverse)
+ if not self.panel then self:createPanel() end
+ local findText = self.findCtrl:GetValue()
+
+ local msg = ""
+ local editor = self:GetEditor()
+ if editor and self:HasText() then
+ local fDown = iff(reverse, not self:GetFlags().Down, self:GetFlags().Down)
+ local bf = self.inselection and self.backfocus or {}
+ setSearchFlags(editor)
+ setTarget(editor, {Down = fDown, StartPos = bf.spos, EndPos = bf.epos})
+ local posFind = editor:SearchInTarget(findText)
+ if (posFind == NOTFOUND) and self:GetFlags().Wrap then
+ editor:SetTargetStart(iff(fDown, bf.spos or 0, bf.epos or editor:GetLength()))
+ editor:SetTargetEnd(iff(fDown, bf.epos or editor:GetLength(), bf.spos or 0))
+ posFind = editor:SearchInTarget(findText)
+ msg = (self.inselection
+ and TR("Reached end of selection and wrapped around.")
+ or TR("Reached end of text and wrapped around.")
+ )
+ end
+ if posFind == NOTFOUND then
+ self.foundString = false
+ msg = TR("Text not found.")
+ else
+ self.foundString = true
+ local start = editor:GetTargetStart()
+ local finish = editor:GetTargetEnd()
+ editor:ShowPosEnforcePolicy(finish)
+ editor:SetSelection(start, finish)
+ end
+ end
+ self:SetStatus(msg)
+ return self.foundString
+end
+
+-- returns true if something was found
+-- [inFileRegister(pos)] passing function will
+-- register every position item was found
+
+function findReplace:FindAll(inFileRegister)
+ if not self.panel then self:createPanel() end
+ local findText = self.findCtrl:GetValue()
+
+ local found = false
+ local editor = self:GetEditor()
+ if editor and self:HasText() then
+ local e = setTarget(editor, {All = true, Wrap = true})
+
+ setSearchFlags(editor)
+ while true do
+ local posFind = editor:SearchInTarget(findText)
+ if posFind == NOTFOUND then break end
+ inFileRegister(posFind, editor:GetTargetEnd()-posFind)
+ editor:SetTargetStart(editor:GetTargetEnd())
+ editor:SetTargetEnd(e)
+ found = true
+ end
+ if inFileRegister and found then inFileRegister() end
+ end
+
+ return found
+end
+
+local indicator = {
+ SEARCHMATCH = ide:GetIndicator("core.searchmatch"),
+}
+
+-- returns true if replacements were done
+function findReplace:Replace(fReplaceAll, resultsEditor)
+ if not self.panel then self:createPanel() end
+
+ local findText = self.findCtrl:GetValue()
+ local replaceText = self.replaceCtrl:GetValue()
+ if replaceText == replaceHintText then replaceText = "" end
+
+ local replaced = false
+ local editor = resultsEditor or self:GetEditor()
+ if editor and self:HasText() then
+ -- don't replace in read-only editors
+ if editor:GetReadOnly() then
+ self:SetStatus(TR("Can't replace in read-only text."))
+ return false
+ end
+
+ -- in the preview results always replace in the entire file
+ local bf = self.inselection and self.backfocus
+ local endTarget = (resultsEditor and setTarget(editor, {All = true, Wrap = true})
+ -- when selection is marked, only replace in the selection
+ or (bf and setTarget(editor, {Down = self:GetFlags().Down, All = fReplaceAll, StartPos = bf.spos, EndPos = bf.epos}))
+ -- in all other cases, replace as selected
+ or setTarget(editor, {Down = self:GetFlags().Down, All = fReplaceAll, Wrap = self:GetFlags().Wrap})
+ )
+
+ if fReplaceAll then
+ if resultsEditor then editor:SetIndicatorCurrent(indicator.SEARCHMATCH) end
+
+ setSearchFlags(editor)
+ local occurrences = 0
+ local posFind = editor:SearchInTarget(findText)
+ if posFind ~= NOTFOUND then
+ editor:BeginUndoAction()
+ while posFind ~= NOTFOUND do
+ local length = editor:GetLength()
+ -- if replace-in-files (resultsEditor) is being done,
+ -- then check that the match starts with %d+:
+ local match = true
+ if resultsEditor then
+ local line = editor:LineFromPosition(posFind)
+ local _, _, prefix = editor:GetLineDyn(line):find("^(%s*%d+: )")
+ match = prefix and posFind >= editor:PositionFromLine(line)+#prefix
+ end
+ if match then
+ local replaced = self:GetFlags().RegularExpr
+ and editor:ReplaceTargetRE(replaceText)
+ or editor:ReplaceTarget(replaceText)
+
+ -- mark replaced text
+ if resultsEditor then editor:IndicatorFillRange(posFind, replaced) end
+ occurrences = occurrences + 1
+ end
+
+ editor:SetTargetStart(editor:GetTargetEnd())
+ -- adjust the endTarget as the position could have changed;
+ -- can't simply subtract text length as it could be a regexp
+ local adjusted = editor:GetLength() - length
+ endTarget = endTarget + adjusted
+ -- also adjust the selection as the end marker can move after replacement
+ if bf and bf.epos then bf.epos = bf.epos + adjusted end
+ editor:SetTargetEnd(endTarget)
+ posFind = editor:SearchInTarget(findText)
+ end
+ editor:EndUndoAction()
+ replaced = true
+ end
+ self:SetStatus(
+ TR("Replaced %d instance.", occurrences):format(occurrences))
+ else
+ editor:TargetFromSelection()
+ -- check if there is anything selected as well as the user can
+ -- move the cursor after successful search
+ if editor:GetSelectionStart() ~= editor:GetSelectionEnd()
+ -- check that the current selection matches what's being searched for
+ and editor:SearchInTarget(findText) ~= NOTFOUND then
+ local length = editor:GetLength()
+ local start = editor:GetSelectionStart()
+ local replaced = self:GetFlags().RegularExpr
+ and editor:ReplaceTargetRE(replaceText)
+ or editor:ReplaceTarget(replaceText)
+ local adjusted = editor:GetLength() - length
+ if bf and bf.epos then bf.epos = bf.epos + adjusted end
+
+ editor:SetSelection(start, start + replaced)
+ self.foundString = false
+
+ replaced = true
+ end
+ self:Find()
+ end
+ end
+
+ return replaced
+end
+
+local oldline
+local FILE_MARKER = ide:GetMarker("searchmatchfile")
+local FILE_MARKER_VALUE = 2^FILE_MARKER
+local function getRawLine(ed, line) return (ed:GetLineDyn(line):gsub("[\n\r]+$","")) end
+local function onFileRegister(pos, length)
+ local editor = findReplace.oveditor
+ local reseditor = findReplace.reseditor
+ local posline = pos and editor:LineFromPosition(pos) + 1
+ local text = ""
+ local cfg = ide.config.search
+ local contextb = findReplace:GetFlags().Context and cfg.contextlinesbefore or 0
+ local contexta = findReplace:GetFlags().Context and cfg.contextlinesafter or 0
+ local lines = reseditor:GetLineCount() -- current number of lines
+
+ -- check if there is another match on the same line; do not add anything
+ if oldline ~= posline then
+ if posline and not oldline then
+ -- show file name and a bookmark marker
+ reseditor:AppendTextDyn(findReplace.curfilename.."\n")
+ reseditor:MarkerAdd(lines-1, FILE_MARKER)
+ reseditor:SetFoldLevel(lines-1, reseditor:GetFoldLevel(lines-1)
+ + wxstc.wxSTC_FOLDLEVELHEADERFLAG)
+ findReplace:SetStatus(GetFileName(findReplace.curfilename))
+
+ lines = lines + 1
+
+ -- show context lines before posline
+ for line = math.max(1, posline-contextb), posline-1 do
+ text = text .. ("%5d %s\n"):format(line, getRawLine(editor, line-1))
+ end
+ end
+ if posline and oldline then
+ -- show context lines between oldposline and posline
+ for line = oldline+1, math.min(posline-1, oldline+contexta) do
+ text = text .. ("%5d %s\n"):format(line, getRawLine(editor, line-1))
+ end
+ if contextb + contexta > 0 and posline-oldline > contextb + contexta + 1 then
+ text = text .. ("%5s\n"):format(("."):rep(#tostring(posline)))
+ end
+ for line = math.max(oldline+contexta+1, posline-contextb), posline-1 do
+ text = text .. ("%5d %s\n"):format(line, getRawLine(editor, line-1))
+ end
+ end
+ if posline then
+ text = text .. ("%5d: %s\n"):format(posline, getRawLine(editor, posline-1))
+ findReplace.lines = findReplace.lines + 1
+ elseif oldline then
+ -- show context lines after posline
+ for line = oldline+1, math.min(editor:GetLineCount(), oldline+contexta) do
+ text = text .. ("%5d %s\n"):format(line, getRawLine(editor, line-1))
+ end
+ text = text .. "\n"
+ end
+ oldline = posline
+
+ reseditor:AppendTextDyn(text)
+
+ for line = lines-1, reseditor:GetLineCount()-2 do
+ reseditor:SetFoldLevel(line, wxstc.wxSTC_FOLDLEVELBASE + 1)
+ end
+ end
+
+ if posline then
+ findReplace.occurrences = findReplace.occurrences + 1
+
+ -- get the added line
+ local markline = reseditor:GetLineCount()-2
+ -- get the match position in the file relative to the beginning of the line
+ local localpos = pos - editor:PositionFromLine(posline-1)
+ -- recalculate position in the search results relative to the line
+ local newpos = reseditor:PositionFromLine(markline)+localpos+7 -- add indent
+ reseditor:SetIndicatorCurrent(indicator.SEARCHMATCH)
+ reseditor:IndicatorFillRange(newpos, length)
+ end
+end
+
+local firstReadSize = 2048
+local knownBinary = {}
+local function checkBinary(ext, content)
+ if not content then return knownBinary[ext] end
+ if ext == "" then return IsBinary(content) end
+ if knownBinary[ext] == nil then knownBinary[ext] = IsBinary(content) end
+ return knownBinary[ext]
+end
+
+function findReplace:ProcInFiles(startdir,mask,subdirs)
+ if not self.panel then self:createPanel() end
+
+ local text = not self:GetFlags().RegularExpr and q(self.findCtrl:GetValue()) or nil
+ if text and not self:GetFlags().MatchCase then
+ text = text:gsub("%w",function(s) return "["..s:lower()..s:upper().."]" end)
+ end
+
+ local files = coroutine.wrap(function() FileSysGetRecursive(startdir, subdirs, mask, {yield = true, folder = false}) end)
+ while true do
+ local file = files()
+ if not file then break end
+
+ if checkBinary(GetFileExt(file)) ~= true then
+ self.curfilename = file
+ local filetext, err = FileRead(file, firstReadSize)
+ if not filetext then
+ DisplayOutputLn(TR("Can't open file '%s': %s"):format(file, err))
+ elseif not checkBinary(GetFileExt(file), filetext) then
+ -- read the rest if there is more to read in the file
+ if #filetext == firstReadSize then filetext = FileRead(file) end
+ if filetext and (not text or filetext:find(text)) then
+ self.oveditor:SetTextDyn(filetext)
+
+ if self:FindAll(onFileRegister) then self.files = self.files + 1 end
+
+ -- give time to the UI to refresh
+ ide:Yield()
+ -- the IDE may be quitting after Yield or the tab may be closed,
+ local ok, mgr = pcall(function() return ide:GetUIManager() end)
+ -- so check to make sure the manager is still active
+ if not (ok and mgr:GetPane(searchpanel):IsShown())
+ -- and check that the search results tab is still open
+ or not ide:IsValidCtrl(self.reseditor) then
+ return false
+ end
+ end
+ end
+ end
+ end
+ return true
+end
+
+local function makePlural(word, counter) return word..(counter == 1 and '' or 's') end
+
+function findReplace:RunInFiles(replace)
+ if not self.panel then self:createPanel() end
+ if not self:HasText() or self.oveditor then return end
+
+ self.oveditor = ide:CreateStyledTextCtrl(self.panel, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxSize(0,0), wx.wxBORDER_NONE)
+ self.occurrences = 0
+ self.lines = 0
+ self.files = 0
+ self.toolbar:UpdateWindowUI(wx.wxUPDATE_UI_FROMIDLE)
+ ide:Yield() -- let the update of the UI happen
+
+ -- save focus to restore after adding a page with search results
+ local ctrl = ide:GetMainFrame():FindFocus()
+ local findText = self.findCtrl:GetValue()
+ local flags = self:GetFlags()
+ local showaseditor = ide.config.search.showaseditor
+ local nb = ide:GetOutputNotebook()
+ local reseditor = self.reseditor
+ local resultsText = "Search Results"
+ local previewText = resultsText..": "
+ local valid = self:IsPreview(reseditor)
+ -- open new tab if the current one is not valid
+ -- or if multiple tabs are requested, but when searching for different text
+ if not valid or (flags.MultiResults and reseditor.searchpreview ~= findText) then
+ -- enable folds in the preview even if disabled in the editor
+ local fold = ide.config.editor.fold
+ ide.config.editor.fold = true
+ if showaseditor then
+ reseditor = NewFile(resultsText)
+ else
+ reseditor = ide:CreateBareEditor()
+ reseditor:SetupKeywords("")
+
+ local modpref = ide.MODPREF
+ local function setModified(modified)
+ local index = nb:GetPageIndex(reseditor)
+ local text = nb:GetPageText(index):gsub("^"..q(modpref), "")
+ nb:SetPageText(index, (modified and modpref or '')..text)
+ end
+ reseditor:Connect(wxstc.wxEVT_STC_SAVEPOINTREACHED,
+ function () setModified(false) end)
+ reseditor:Connect(wxstc.wxEVT_STC_SAVEPOINTLEFT,
+ function () setModified(true) end)
+ reseditor:Connect(wxstc.wxEVT_STC_MARGINCLICK,
+ function (event)
+ local editor = event:GetEventObject():DynamicCast('wxStyledTextCtrl')
+ local line = editor:LineFromPosition(event:GetPosition())
+ local header = bit.band(editor:GetFoldLevel(line),
+ wxstc.wxSTC_FOLDLEVELHEADERFLAG) == wxstc.wxSTC_FOLDLEVELHEADERFLAG
+ if wx.wxGetKeyState(wx.WXK_SHIFT) and wx.wxGetKeyState(wx.WXK_CONTROL) then
+ editor:FoldSome()
+ elseif header then
+ editor:ToggleFold(line)
+ end
+ end)
+
+ -- mark as searchpreview to allow AddPage to add "close" button
+ reseditor.searchpreview = findText
+ nb:AddPage(reseditor, previewText, true)
+ end
+ reseditor:SetWrapMode(wxstc.wxSTC_WRAP_NONE)
+ reseditor:SetIndentationGuides(false)
+ if tonumber(ide.config.search.zoom) then
+ reseditor:SetZoom(tonumber(ide.config.search.zoom))
+ end
+ for m = 0, ide.MAXMARGIN do -- hide all margins except folding
+ if reseditor:GetMarginWidth(m) > 0
+ and reseditor:GetMarginMask(m) ~= wxstc.wxSTC_MASK_FOLDERS then
+ reseditor:SetMarginWidth(m, 0)
+ end
+ end
+ reseditor:MarkerDefine(ide:GetMarker("searchmatchfile"))
+ reseditor:Connect(wx.wxEVT_LEFT_DCLICK, function(event)
+ if not wx.wxGetKeyState(wx.WXK_SHIFT)
+ and not wx.wxGetKeyState(wx.WXK_CONTROL)
+ and not wx.wxGetKeyState(wx.WXK_ALT) then
+ local point = event:GetPosition()
+ local margin = 0
+ for m = 0, ide.MAXMARGIN do margin = margin + reseditor:GetMarginWidth(m) end
+ if point:GetX() <= margin then return end
+
+ local pos = reseditor:PositionFromPoint(point)
+ local line = reseditor:LineFromPosition(pos)
+ local text = reseditor:GetLineDyn(line):gsub("[\n\r]+$","")
+ -- get line with the line number
+ local jumpline = text:match("^%s*(%d+)")
+ local file
+ if jumpline then
+ -- search back to find the file name
+ for curline = line-1, 0, -1 do
+ local text = reseditor:GetLineDyn(curline):gsub("[\n\r]+$","")
+ if not text:find("^%s") and wx.wxFileExists(text) then
+ file = text
+ break
+ end
+ end
+ else
+ file = text
+ jumpline = 1
+ end
+
+ -- activate the file and the line number
+ local editor = file and LoadFile(file,nil,true)
+ if editor then
+ editor:GotoLine(jumpline-1)
+ editor:EnsureVisibleEnforcePolicy(jumpline-1)
+ editor:SetFocus()
+ end
+ return
+ end
+
+ event:Skip()
+ end)
+
+ ide.config.editor.fold = fold
+ self.reseditor = reseditor
+ else
+ if showaseditor then
+ ide:GetDocument(reseditor):SetActive()
+ else
+ local index = nb:GetPageIndex(reseditor)
+ if nb:GetSelection() ~= index then nb:SetSelection(index) end
+ end
+ end
+ reseditor.replace = replace -- keep track of the current status
+ reseditor:ShowLines(0, reseditor:GetLineCount()-1)
+ reseditor:SetReadOnly(false)
+ reseditor:SetTextDyn('')
+ do -- update the preview name
+ local nb = showaseditor and ide:GetEditorNotebook() or nb
+ nb:SetPageText(nb:GetPageIndex(reseditor), previewText .. findText)
+ end
+ if not showaseditor and nb then -- show the bottom notebook if hidden
+ local uimgr = ide:GetUIManager()
+ if not uimgr:GetPane(nb):IsShown() then
+ uimgr:GetPane(nb):Show(true)
+ uimgr:Update()
+ end
+ end
+
+ self:SetStatus(TR("Searching for '%s'."):format(findText))
+ wx.wxSafeYield() -- allow the status to update
+
+ local startdir, mask = self:GetScope()
+ local completed = self:ProcInFiles(startdir, mask or "*", flags.SubDirs)
+
+ -- reseditor may already be closed, so check if it's valid first
+ if ide:IsValidCtrl(reseditor) then
+ reseditor:GotoPos(reseditor:GetLength())
+ reseditor:AppendTextDyn(("Searched for '%s'. "):format(findText))
+ if not completed then reseditor:AppendTextDyn("Cancelled by the user. ") end
+ reseditor:AppendTextDyn(("Found %d %s on %d %s in %d %s.")
+ :format(
+ self.occurrences, makePlural("instance", self.occurrences),
+ self.lines, makePlural("line", self.lines),
+ self.files, makePlural("file", self.files)))
+ reseditor:EmptyUndoBuffer() -- don't undo the changes in the results
+ reseditor:SetSavePoint() -- set unmodified status
+
+ if completed and replace and self.occurrences > 0 then
+ reseditor:AppendTextDyn("\n\n"
+ .."Review the changes and save this preview to apply them.\n"
+ .."You can also make other changes; only lines with : will be updated.\n"
+ .."Context lines (if any) are used as safety checks during the update.")
+ self:Replace(true, reseditor)
+ else
+ reseditor:SetReadOnly(true)
+ end
+ reseditor:EnsureVisibleEnforcePolicy(reseditor:GetLineCount()-1)
+ reseditor.searchpreview = findText
+ end
+
+ self:SetStatus(not completed and TR("Cancelled by the user.")
+ or TR("Found %d instance.", self.occurrences):format(self.occurrences))
+ self.oveditor:Destroy()
+ self.oveditor = nil
+ self.toolbar:UpdateWindowUI(wx.wxUPDATE_UI_FROMIDLE)
+
+ -- return focus to the control that had it if it's on the search panel
+ -- (as it could be changed by added results tab)
+ if ctrl and (ctrl:GetParent():GetId() == self.panel:GetId() or not showaseditor) then
+ -- set the focus temporarily on the search results tab as this provides a workaround
+ -- for the cursor disappearing in Search/Replace controls after results shown
+ -- in the same tab (somehow caused by `oveditor:Destroy()` call).
+ if ide:IsValidCtrl(reseditor) then reseditor:SetFocus() end
+ ctrl:SetFocus()
+ end
+
+ if completed and ide.config.search.autohide then self:Hide() end
+end
+
+local icons = {
+ find = {
+ internal = {
+ ID_FINDNEXT, ID_SEPARATOR,
+ ID_FINDOPTDIRECTION, ID_FINDOPTWRAPWROUND, ID_FINDOPTSELECTION,
+ ID_FINDOPTWORD, ID_FINDOPTCASE, ID_FINDOPTREGEX,
+ ID_SEPARATOR, ID_FINDOPTSTATUS,
+ },
+ infiles = {
+ ID_FINDNEXT, ID_SEPARATOR,
+ ID_FINDOPTCONTEXT, ID_FINDOPTMULTIRESULTS, ID_FINDOPTWORD,
+ ID_FINDOPTCASE, ID_FINDOPTREGEX, ID_FINDOPTSUBDIR,
+ ID_FINDOPTSCOPE, ID_FINDSETDIR,
+ ID_SEPARATOR, ID_FINDOPTSTATUS,
+ },
+ },
+ replace = {
+ internal = {
+ ID_FINDNEXT, ID_FINDREPLACENEXT, ID_FINDREPLACEALL, ID_SEPARATOR,
+ ID_FINDOPTDIRECTION, ID_FINDOPTWRAPWROUND, ID_FINDOPTSELECTION,
+ ID_FINDOPTWORD, ID_FINDOPTCASE, ID_FINDOPTREGEX,
+ ID_SEPARATOR, ID_FINDOPTSTATUS,
+ },
+ infiles = {
+ ID_FINDNEXT, ID_FINDREPLACEALL, ID_SEPARATOR,
+ ID_FINDOPTCONTEXT, ID_FINDOPTMULTIRESULTS, ID_FINDOPTWORD,
+ ID_FINDOPTCASE, ID_FINDOPTREGEX, ID_FINDOPTSUBDIR,
+ ID_FINDOPTSCOPE, ID_FINDSETDIR,
+ ID_SEPARATOR, ID_FINDOPTSTATUS,
+ },
+ },
+}
+
+function findReplace:createToolbar()
+ local ctrl, tb, scope, status =
+ self.panel, self.toolbar, self.scope, self.status
+ local icons = icons[self.replace and "replace" or "find"][self.infiles and "infiles" or "internal"]
+
+ local toolBmpSize = wx.wxSize(16, 16)
+ tb:Freeze()
+ tb:Clear()
+ for _, id in ipairs(icons) do
+ if id == ID_SEPARATOR then
+ tb:AddSeparator()
+ elseif id == ID_FINDOPTSCOPE then
+ tb:AddControl(scope)
+ elseif id == ID_FINDOPTSTATUS then
+ tb:AddControl(status)
+ else
+ local iconmap = ide.config.toolbar.iconmap[id]
+ if iconmap then
+ local icon, description = unpack(iconmap)
+ local isbitmap = type(icon) == "userdata" and icon:GetClassInfo():GetClassName() == "wxBitmap"
+ local bitmap = isbitmap and icon or ide:GetBitmap(icon, "TOOLBAR", toolBmpSize)
+ tb:AddTool(id, "", bitmap, (TR)(description))
+ end
+ end
+ end
+
+ local options = {
+ [ID_FINDOPTDIRECTION] = 'Down',
+ [ID_FINDOPTWRAPWROUND] = 'Wrap',
+ [ID_FINDOPTWORD] = 'WholeWord',
+ [ID_FINDOPTCASE] = 'MatchCase',
+ [ID_FINDOPTREGEX] = 'RegularExpr',
+ [ID_FINDOPTSUBDIR] = 'SubDirs',
+ [ID_FINDOPTCONTEXT] = 'Context',
+ [ID_FINDOPTMULTIRESULTS] = 'MultiResults',
+ }
+
+ for id, var in pairs(options) do
+ local tool = tb:FindTool(id)
+ if tool then
+ local flags = self:GetFlags()
+ tool:SetSticky(flags[var])
+ ctrl:Connect(id, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function ()
+ flags[var] = not flags[var]
+ self:SaveSettings()
+
+ tb:FindTool(id):SetSticky(flags[var])
+ tb:Refresh()
+ end)
+ end
+ end
+
+ local optseltool = tb:FindTool(ID_FINDOPTSELECTION)
+ if optseltool then
+ optseltool:SetSticky(self.inselection)
+ tb:EnableTool(ID_FINDOPTSELECTION, self.inselection)
+ ctrl:Connect(ID_FINDOPTSELECTION, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ self.inselection = not self.inselection
+ tb:FindTool(event:GetId()):SetSticky(self.inselection)
+ tb:Refresh()
+ end)
+ end
+
+ tb:SetToolDropDown(ID_FINDSETDIR, true)
+ tb:Connect(ID_FINDSETDIR, wxaui.wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN, function(event)
+ if event:IsDropDownClicked() then
+ local menu = wx.wxMenu()
+ local pos = tb:GetToolRect(event:GetId()):GetBottomLeft()
+ menu:Append(ID_FINDSETDIR, TR("Choose..."))
+ menu:Append(ID_FINDSETTOPROJDIR, TR("Set To Project Directory"))
+ menu:Enable(ID_FINDSETTOPROJDIR, ide:GetProject() ~= nil)
+ menu:Connect(ID_FINDSETTOPROJDIR, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ local _, mask = self:GetScope()
+ self:refreshToolbar(self:SetScope(ide:GetProject(), mask))
+ end)
+ if #self.settings.slist > 0 then menu:AppendSeparator() end
+ for i, text in ipairs(self.settings.slist) do
+ local id = ID("findreplace.scope."..i)
+ menu:Append(id, text)
+ menu:Connect(id, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() self:refreshToolbar(text) end)
+ end
+ menu:AppendSeparator()
+ menu:Append(ID_RECENTSCOPECLEAR, TR("Clear Items"))
+ menu:Enable(ID_RECENTSCOPECLEAR, #self.settings.slist > 0)
+ menu:Connect(ID_RECENTSCOPECLEAR, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ self.settings.slist = {}
+ self:SaveSettings()
+ end)
+ tb:PopupMenu(menu, pos)
+ else
+ event:Skip()
+ end
+ end)
+
+ tb:Realize()
+ tb:Thaw()
+
+ local sizer = ctrl:GetSizer()
+ if sizer then sizer:Layout() end
+end
+
+function findReplace:refreshToolbar(value)
+ local scope = self.scope
+ value = value or self.scope:GetValue()
+ self.scope:SetMinSize(wx.wxSize(scope:GetTextExtent(value..'AZ'), -1))
+ self:createToolbar()
+ self.scope:SetValue(value)
+end
+
+function findReplace:createPanel()
+ local ctrl = wx.wxPanel(ide:GetMainFrame(), wx.wxID_ANY, wx.wxDefaultPosition,
+ wx.wxDefaultSize, wx.wxFULL_REPAINT_ON_RESIZE)
+ local mgr = ide:GetUIManager()
+ mgr:AddPane(ctrl, wxaui.wxAuiPaneInfo()
+ :Name(searchpanel):CaptionVisible(false):PaneBorder(false):Hide())
+ mgr:Update()
+
+ local tb = wxaui.wxAuiToolBar(ctrl, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxDefaultSize, wxaui.wxAUI_TB_PLAIN_BACKGROUND)
+ local status = wx.wxStaticText(tb, wx.wxID_ANY, "")
+ local scope = wx.wxTextCtrl(tb, wx.wxID_ANY, "",
+ wx.wxDefaultPosition, wx.wxDefaultSize,
+ wx.wxTE_PROCESS_ENTER + wx.wxTE_PROCESS_TAB + wx.wxBORDER_STATIC)
+ -- limit the scope control height as it gets too large on Linux
+ scope:SetMaxSize(wx.wxSize(-1, 22))
+
+ self.panel = ctrl
+ self.status = status
+ self.toolbar = tb
+ self.scope = scope
+
+ self:createToolbar()
+
+ local style, styledef = ide.config.styles, StylesGetDefault()
+ local textcolor = wx.wxColour(unpack(style.text.fg or styledef.text.fg))
+ local backcolor = wx.wxColour(unpack(style.text.bg or styledef.text.bg))
+ local pancolor = tb:GetBackgroundColour()
+ local borcolor = ide:GetUIManager():GetArtProvider():GetColor(wxaui.wxAUI_DOCKART_BORDER_COLOUR)
+ local bpen = wx.wxPen(borcolor, 1, wx.wxSOLID)
+ local bbrush = wx.wxBrush(pancolor, wx.wxSOLID)
+ local tfont = ide:GetProjectTree():GetFont()
+ -- don't increase font size on Linux as it gets too large
+ tfont:SetPointSize(tfont:GetPointSize() + (ide.osname == 'Unix' and 0 or 1))
+
+ local findCtrl = wx.wxTextCtrl(ctrl, wx.wxID_ANY, "",
+ wx.wxDefaultPosition, wx.wxDefaultSize,
+ wx.wxTE_PROCESS_ENTER + wx.wxTE_PROCESS_TAB + wx.wxBORDER_STATIC)
+ local replaceCtrl = wx.wxTextCtrl(ctrl, wx.wxID_ANY, replaceHintText,
+ wx.wxDefaultPosition, wx.wxDefaultSize,
+ wx.wxTE_PROCESS_ENTER + wx.wxTE_PROCESS_TAB + wx.wxBORDER_STATIC)
+ self.ac = {[findCtrl:GetId()] = {}, [replaceCtrl:GetId()] = {}, [scope:GetId()] = {}}
+
+ local findSizer = wx.wxBoxSizer(wx.wxHORIZONTAL)
+ findSizer:Add(findCtrl, 1, wx.wxLEFT + wx.wxRIGHT + wx.wxALIGN_LEFT + wx.wxEXPAND + wx.wxFIXED_MINSIZE, 1)
+ findSizer:Add(replaceCtrl, 1, wx.wxLEFT + wx.wxRIGHT + wx.wxALIGN_LEFT + wx.wxEXPAND + wx.wxFIXED_MINSIZE, 1)
+ findSizer:Hide(1)
+
+ local mainSizer = wx.wxBoxSizer(wx.wxVERTICAL)
+ mainSizer:Add(tb, 0, wx.wxTOP + wx.wxLEFT + wx.wxRIGHT + wx.wxALIGN_LEFT + wx.wxEXPAND, 2)
+ mainSizer:Add(findSizer, 0, wx.wxALL + wx.wxALIGN_LEFT + wx.wxEXPAND, 2)
+
+ ctrl:SetSizer(mainSizer)
+ ctrl:GetSizer():Fit(ctrl)
+
+ for _, control in ipairs({findCtrl, replaceCtrl}) do
+ control:SetBackgroundColour(backcolor)
+ control:SetForegroundColour(textcolor)
+ control:SetFont(tfont)
+ end
+ scope:SetBackgroundColour(pancolor) -- set toolbar background
+ scope:SetFont(tfont)
+ status:SetFont(tfont)
+
+ local function updateLists()
+ PrependStringToArray(self.settings.flist, findCtrl:GetValue())
+ if self.replace then
+ local replaceText = replaceCtrl:GetValue()
+ if replaceText == replaceHintText then replaceText = "" end
+ PrependStringToArray(self.settings.rlist, replaceText)
+ end
+ if self.infiles then
+ PrependStringToArray(self.settings.slist, self.scope:GetValue())
+ end
+ self:SaveSettings()
+ return true
+ end
+
+ local function findNext()
+ updateLists()
+ if findReplace.infiles then
+ findReplace:RunInFiles(false)
+ else
+ findReplace:Find()
+ end
+ end
+
+ local function autoComplete(event)
+ if not ide.config.search.autocomplete then return end
+
+ local obj = event:GetEventObject():DynamicCast('wxTextCtrl')
+ local ac = self.ac[obj:GetId()]
+ if not ac then return end
+
+ local keycode, needac = ac.lastkeycode, ac.needautocomplete
+ if needac then ac.needautocomplete = false end
+ if not needac or not keycode then return end
+
+ -- if the last key was Delete or Backspace, don't autocomplete
+ if keycode == wx.WXK_DELETE or keycode == wx.WXK_BACK then return end
+
+ -- find match for the current text and add it to the control
+ local value = obj:GetValue()
+ if not value or #value == 0 then return end
+
+ local patt, match = "^"..q(value)
+ for _, v in ipairs(
+ obj:GetId() == self.findCtrl:GetId() and self.settings.flist or
+ obj:GetId() == self.replaceCtrl:GetId() and self.settings.rlist or
+ {}
+ ) do
+ if v:find(patt) then match = v; break end
+ end
+ if match then
+ obj:ChangeValue(match)
+ obj:SetSelection(#value, #match)
+ end
+ end
+
+ local function findIncremental(event)
+ -- don't do any incremental search when search in selection
+ if self.inselection then return end
+
+ if not self.infiles and self.backfocus and self.backfocus.position then
+ self:GetEditor():SetSelection(self.backfocus.position, self.backfocus.position)
+ end
+ -- don't search when used with "infiles", but still trigger autocomplete
+ if self.infiles or self:Find() then
+ self.ac[event:GetEventObject():DynamicCast('wxTextCtrl'):GetId()].needautocomplete = true
+ end
+ end
+
+ local function findReplaceNext()
+ updateLists()
+ if findReplace.replace then
+ if findReplace.infiles then
+ findReplace:RunInFiles(true)
+ else
+ local replaceAll = (wx.wxGetKeyState(wx.WXK_ALT)
+ and not wx.wxGetKeyState(wx.WXK_SHIFT) and not wx.wxGetKeyState(wx.WXK_CONTROL))
+ findReplace:Replace(replaceAll)
+ end
+ end
+ end
+
+ local function findReplaceAll()
+ updateLists()
+ if findReplace.replace then
+ if findReplace.infiles then
+ findReplace:RunInFiles(true)
+ else
+ findReplace:Replace(true)
+ end
+ end
+ end
+
+ local function onPanelPaint()
+ local dc = wx.wxBufferedPaintDC(ctrl)
+ local psize = ctrl:GetClientSize()
+ dc:SetBrush(bbrush)
+ dc:SetPen(bpen)
+ dc:DrawRectangle(0, 0, psize:GetWidth(), psize:GetHeight())
+ dc:SetPen(wx.wxNullPen)
+ dc:SetBrush(wx.wxNullBrush)
+ dc:delete()
+ end
+
+ ctrl:Connect(wx.wxEVT_PAINT, onPanelPaint)
+ ctrl:Connect(wx.wxEVT_ERASE_BACKGROUND, function() end)
+
+ local taborder = {findCtrl, replaceCtrl, scope}
+ local function keyHandle(event)
+ local keycode = event:GetKeyCode()
+ self.ac[event:GetEventObject():DynamicCast('wxTextCtrl'):GetId()].lastkeycode = keycode
+ if keycode == wx.WXK_ESCAPE then
+ self:Hide(event:ShiftDown())
+ elseif keycode == wx.WXK_TAB then
+ local id = event:GetId()
+ local order, pos = {}
+ for _, v in ipairs(taborder) do
+ if v:IsEnabled() and v:IsShown() then table.insert(order, v) end
+ if v:GetId() == id then pos = #order end
+ end
+ if not pos then return end
+ pos = pos + (event:ShiftDown() and -1 or 1)
+ if pos == 0 then pos = #order
+ elseif pos > #order then pos = 1
+ end
+ order[pos]:SetFocus()
+ if order[pos] ~= scope then order[pos]:SetSelection(-1, -1) end
+ else
+ event:Skip()
+ end
+ end
+
+ -- remember the current position in the editor when setting focus on find
+ local function refreshEditorInfo()
+ local ed = self:GetEditor()
+ if ed and ed ~= self.oveditor then
+ local spos, epos = ed:GetSelectionStart(), ed:GetSelectionEnd()
+ if not self.backfocus or self.backfocus.editor ~= ed then
+ self.backfocus = { editor = ed, spos = spos, epos = epos }
+ end
+ local bf = self.backfocus
+ bf.position = spos == epos and ed:GetCurrentPos() or spos
+ local inselection = ed:LineFromPosition(spos) ~= ed:LineFromPosition(epos)
+
+ -- when the focus is changed, don't remove current "inselection" status as the
+ -- selection may change to highlight the match; not doing this makes it difficult
+ -- to switch between searching and replacing without losing the current match
+ if inselection and (not self.inselection or bf.spos ~= spos or bf.epos ~= epos) then
+ bf.spos = spos
+ bf.epos = epos
+ self.inselection = inselection
+ self:refreshToolbar()
+ end
+ end
+ end
+ findCtrl:Connect(wx.wxEVT_SET_FOCUS,
+ function(event)
+ event:Skip()
+ refreshEditorInfo()
+ end)
+ findCtrl:Connect(wx.wxEVT_COMMAND_TEXT_ENTER, findNext)
+ findCtrl:Connect(wx.wxEVT_COMMAND_TEXT_UPDATED, findIncremental)
+ findCtrl:Connect(wx.wxEVT_KEY_DOWN, keyHandle)
+ replaceCtrl:Connect(wx.wxEVT_SET_FOCUS, function(event)
+ event:Skip()
+ refreshEditorInfo()
+ -- hide the replace hint; should be done with SetHint method,
+ -- but it's not yet available in wxlua 2.8.12
+ if replaceCtrl:GetValue() == replaceHintText then replaceCtrl:ChangeValue('') end
+ end)
+ replaceCtrl:Connect(wx.wxEVT_COMMAND_TEXT_ENTER, findReplaceNext)
+ replaceCtrl:Connect(wx.wxEVT_COMMAND_TEXT_UPDATED, function(event)
+ self.ac[event:GetEventObject():DynamicCast('wxTextCtrl'):GetId()].needautocomplete = true
+ end)
+ replaceCtrl:Connect(wx.wxEVT_KEY_DOWN, keyHandle)
+
+ -- autocomplete for find/replace can be done from TEXT_UPDATED event,
+ -- but SetSelection doesn't work from TEXT_UPDATED event on Linux,
+ -- which makes it impossible to select the suggested part.
+ -- IDLE event is used instead to provide autocomplete suggestions.
+ findCtrl:Connect(wx.wxEVT_IDLE, autoComplete)
+ replaceCtrl:Connect(wx.wxEVT_IDLE, autoComplete)
+
+ scope:Connect(wx.wxEVT_COMMAND_TEXT_ENTER, findNext)
+ scope:Connect(wx.wxEVT_KEY_DOWN, keyHandle)
+
+ local function notSearching(event) event:Enable(not self.oveditor) end
+ ctrl:Connect(ID_FINDNEXT, wx.wxEVT_UPDATE_UI, notSearching)
+ ctrl:Connect(ID_FINDREPLACENEXT, wx.wxEVT_UPDATE_UI, notSearching)
+ ctrl:Connect(ID_FINDREPLACEALL, wx.wxEVT_UPDATE_UI, notSearching)
+
+ ctrl:Connect(ID_FINDNEXT, wx.wxEVT_COMMAND_MENU_SELECTED, findNext)
+ ctrl:Connect(ID_FINDREPLACENEXT, wx.wxEVT_COMMAND_MENU_SELECTED, findReplaceNext)
+ ctrl:Connect(ID_FINDREPLACEALL, wx.wxEVT_COMMAND_MENU_SELECTED, findReplaceAll)
+
+ ctrl:Connect(ID_FINDSETDIR, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ local dir, mask = self:GetScope()
+ local filePicker = wx.wxDirDialog(ctrl, TR("Choose a search directory"),
+ dir or wx.wxGetCwd(), wx.wxFLP_USE_TEXTCTRL)
+ if filePicker:ShowModal(true) == wx.wxID_OK then
+ self:refreshToolbar(self:SetScope(FixDir(filePicker:GetPath()), mask))
+ end
+ end)
+
+ self.findCtrl = findCtrl
+ self.replaceCtrl = replaceCtrl
+ self.findSizer = findSizer
+end
+
+function findReplace:refreshPanel(replace, infiles)
+ if not self.panel then self:createPanel() end
+
+ self:GetEditor(true) -- remember the current editor
+
+ local ctrl = self.panel
+
+ -- check if a proper pane is already populated
+ if self.replace ~= replace or self.infiles ~= infiles then
+ self.replace = replace
+ self.infiles = infiles
+
+ if replace then
+ self.findSizer:Show(1)
+ if self.replaceCtrl:GetValue() == '' then
+ self.replaceCtrl:ChangeValue(replaceHintText)
+ end
+ else
+ self.findSizer:Hide(1)
+ end
+ self.findSizer:Layout()
+
+ self.scope:Show(infiles)
+ end
+
+ local value = self.scope:GetValue()
+ local ed = ide:GetEditor()
+ if ed and (not value or #value == 0) then
+ local doc = ide:GetDocument(ed)
+ local ext = doc:GetFileExt()
+ local proj = ide:GetProject()
+ value = (proj and self:GetScopeMRU(proj..sep) or
+ self:SetScope(proj or wx.wxGetCwd(), '*.'..(#ext > 0 and ext or '*')))
+ end
+ if ed then -- check if there is any selection
+ self.backfocus = nil
+ self.inselection = ed:LineFromPosition(ed:GetSelectionStart()) ~=
+ ed:LineFromPosition(ed:GetSelectionEnd())
+ end
+ self:refreshToolbar(value)
+
+ local mgr = ide:GetUIManager()
+ local pane = mgr:GetPane(searchpanel)
+ if not pane:IsShown() then
+ local size = ctrl:GetSize()
+ pane:Dock():Bottom():BestSize(size):MinSize(size):Layer(0):Row(1):Show()
+ mgr:Update()
+
+ self:SetStatus(TR("Use %s to close."):format("`Escape`"))
+ end
+
+ -- set value from the current selection (if any)
+ self.findCtrl:ChangeValue(self:GetSelection() or self.findCtrl:GetValue())
+
+ -- reset search when re-creating dialog to avoid modifying selected
+ -- fragment after successful search and updated replacement
+ self.foundString = false
+ self.findCtrl:SetFocus()
+ self.findCtrl:SetSelection(-1, -1) -- select the content
+end
+
+function findReplace:Show(replace,infiles)
+ self:refreshPanel(replace,infiles)
+end
+
+function findReplace:IsShown()
+ local pane = ide:GetUIManager():GetPane(searchpanel)
+ return pane:IsOk() and pane:IsShown()
+end
+
+function findReplace:Hide(restorepos)
+ local ctrl = self.panel:FindFocus()
+ if not ctrl or ctrl:GetParent():GetId() ~= self.panel:GetId() then
+ -- if focus outside of the search panel, do nothing
+ elseif self.backfocus and ide:IsValidCtrl(self.backfocus.editor) then
+ local editor = self.backfocus.editor
+ -- restore original position for Shift-Esc or failed search
+ if restorepos or self.foundString == false then
+ editor:SetSelection(self.backfocus.spos, self.backfocus.epos)
+ end
+ editor:SetFocus()
+ elseif self:IsPreview(self.reseditor) then -- there is a preview, go there
+ self.reseditor:SetFocus()
+ end
+
+ local mgr = ide:GetUIManager()
+ mgr:GetPane(searchpanel):Hide()
+ mgr:Update()
+end
+
+local package = ide:AddPackage('core.findreplace', {
+ onProjectLoad = function()
+ if not findReplace.panel then return end -- not set yet
+ local _, mask = findReplace:GetScope()
+ local proj = ide:GetProject()
+ -- find the last used scope for the same project on the scope history
+ findReplace:refreshToolbar(findReplace:GetScopeMRU(proj..sep)
+ or findReplace:SetScope(proj, mask))
+ end,
+
+ onEditorPreSave = function(self, editor, filePath)
+ if not findReplace:IsPreview(editor) then return end
+
+ local isModified = editor:GetModify()
+ if editor.replace and isModified then
+ findReplace:SetStatus("")
+
+ local line = NOTFOUND
+ local oveditor = ide:CreateStyledTextCtrl(findReplace.panel, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxSize(0,0), wx.wxBORDER_NONE)
+ local files, lines = 0, 0
+ local report
+ while true do
+ -- for each marker that marks a file (MarkerNext)
+ line = editor:MarkerNext(line + 1, FILE_MARKER_VALUE)
+ if line == NOTFOUND then break end
+
+ local fname = getRawLine(editor, line) -- get the file name
+ local filetext, err = FileRead(fname)
+ local mismatch = false
+ if filetext then
+ findReplace:SetStatus(GetFileName(fname))
+ wx.wxSafeYield()
+
+ oveditor:SetTextDyn(filetext)
+ while true do -- for each line following the file name
+ line = line + 1
+ local text = getRawLine(editor, line)
+ local lnum, lmark, ltext = text:match("^%s*(%d+)([ :]) (.*)")
+ if lnum then
+ lnum = tonumber(lnum)
+ if lmark == ':' then -- if the change line, then apply the change
+ local pos = oveditor:PositionFromLine(lnum-1)
+ if pos == NOTFOUND then
+ mismatch = lnum
+ break
+ end
+ oveditor:SetTargetStart(pos)
+ oveditor:SetTargetEnd(pos+#getRawLine(oveditor, lnum-1))
+ oveditor:ReplaceTarget(ltext)
+ lines = lines + 1
+ -- if the context line, then check the context
+ elseif getRawLine(oveditor, lnum-1) ~= ltext then
+ mismatch = lnum
+ break
+ end
+ -- if not placeholder line " ...", then abort
+ elseif not text:find("^%s*%.+$") then
+ break
+ end
+ end
+ if lines > 0 and not mismatch then -- save the file
+ local ok
+ ok, err = FileWrite(fname, oveditor:GetTextDyn())
+ if ok then files = files + 1 end
+ end
+ end
+ if err or mismatch then
+ report = (report or "") .. (("\n%s: %s")
+ :format(fname, mismatch and "mismatch on line "..mismatch or err))
+ end
+ end
+ oveditor:Destroy() -- destroy the editor to release its memory
+ if report then editor:AppendTextDyn("\n"..report) end
+ editor:AppendTextDyn(("\n\nUpdated %d %s in %d %s.")
+ :format(
+ lines, makePlural("line", lines),
+ files, makePlural("file", files)))
+ editor:EnsureVisibleEnforcePolicy(editor:GetLineCount()-1)
+ editor:SetSavePoint() -- set unmodified status when done
+ findReplace:SetStatus(TR("Updated %d file.", files):format(files))
+ return false
+
+ -- don't offer to save file if called from SaveFile;
+ -- can still be used with explicit SaveFileAs
+ elseif not filePath and not isModified then
+ return false
+ end
+ end
+ })
+
+function findReplace:SaveSettings() package:SetSettings(self.settings) end
+MergeSettings(findReplace.settings, package:GetSettings())
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/gui.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/gui.lua
new file mode 100644
index 0000000..f4ea34e
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/gui.lua
@@ -0,0 +1,567 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+-- Lomtik Software (J. Winwood & John Labenski)
+---------------------------------------------------------
+
+local ide = ide
+local unpack = table.unpack or unpack
+
+-- Pick some reasonable fixed width fonts to use for the editor
+local function setFont(style, config)
+ return wx.wxFont(config.fontsize or 10, wx.wxFONTFAMILY_MODERN, style,
+ wx.wxFONTWEIGHT_NORMAL, false, config.fontname or "",
+ config.fontencoding or wx.wxFONTENCODING_DEFAULT)
+end
+ide.font.eNormal = setFont(wx.wxFONTSTYLE_NORMAL, ide.config.editor)
+ide.font.eItalic = setFont(wx.wxFONTSTYLE_ITALIC, ide.config.editor)
+
+ide.font.oNormal = setFont(wx.wxFONTSTYLE_NORMAL, ide.config.outputshell)
+ide.font.oItalic = setFont(wx.wxFONTSTYLE_ITALIC, ide.config.outputshell)
+
+-- treeCtrl font requires slightly different handling
+do local gui, config = wx.wxTreeCtrl():GetFont(), ide.config.filetree
+ if config.fontsize then gui:SetPointSize(config.fontsize) end
+ if config.fontname then gui:SetFaceName(config.fontname) end
+ ide.font.fNormal = gui
+end
+
+-- ----------------------------------------------------------------------------
+-- Create the wxFrame
+-- ----------------------------------------------------------------------------
+local function createFrame()
+ local frame = wx.wxFrame(wx.NULL, wx.wxID_ANY, GetIDEString("editor"),
+ wx.wxDefaultPosition, wx.wxSize(1100, 700))
+ frame:Center()
+ -- wrap into protected call as DragAcceptFiles fails on MacOS with
+ -- wxwidgets 2.8.12 even though it should work according to change notes
+ -- for 2.8.10: "Implemented wxWindow::DragAcceptFiles() on all platforms."
+ pcall(function() frame:DragAcceptFiles(true) end)
+ frame:Connect(wx.wxEVT_DROP_FILES,function(evt)
+ local files = evt:GetFiles()
+ if not files or #files == 0 then return end
+ for _, f in ipairs(files) do
+ LoadFile(f,nil,true)
+ end
+ end)
+
+ -- update best size of the toolbar after resizing
+ frame:Connect(wx.wxEVT_SIZE, function(event)
+ local mgr = ide:GetUIManager()
+ local toolbar = mgr:GetPane("toolbar")
+ if toolbar and toolbar:IsOk() then
+ toolbar:BestSize(event:GetSize():GetWidth(), ide:GetToolBar():GetClientSize():GetHeight())
+ mgr:Update()
+ end
+ end)
+
+ local menuBar = wx.wxMenuBar()
+ local statusBar = frame:CreateStatusBar(5)
+ local section_width = statusBar:GetTextExtent("OVRW")
+ statusBar:SetStatusStyles({wx.wxSB_FLAT, wx.wxSB_FLAT, wx.wxSB_FLAT, wx.wxSB_FLAT, wx.wxSB_FLAT})
+ statusBar:SetStatusWidths({-1, section_width, section_width, section_width*5, section_width*4})
+ statusBar:SetStatusText(GetIDEString("statuswelcome"))
+ statusBar:Connect(wx.wxEVT_LEFT_DOWN, function (event)
+ local rect = wx.wxRect()
+ statusBar:GetFieldRect(4, rect)
+ if rect:Contains(event:GetPosition()) then -- click on the interpreter
+ local menuitem = ide:FindMenuItem(ID.INTERPRETER)
+ if menuitem then
+ local menu = ide:CloneMenu(menuitem:GetSubMenu())
+ if menu then statusBar:PopupMenu(menu) end
+ end
+ end
+ end)
+
+ local mgr = wxaui.wxAuiManager()
+ mgr:SetManagedWindow(frame)
+ -- allow the panes to be larger than the defalt 1/3 of the main window size
+ mgr:SetDockSizeConstraint(0.8,0.8)
+
+ frame.menuBar = menuBar
+ frame.statusBar = statusBar
+ frame.uimgr = mgr
+
+ return frame
+end
+
+local function SCinB(id) -- shortcut in brackets
+ local shortcut = KSC(id):gsub("\t","")
+ return shortcut and #shortcut > 0 and (" ("..shortcut..")") or ""
+end
+
+local function menuDropDownPosition(event)
+ local tb = event:GetEventObject():DynamicCast('wxAuiToolBar')
+ local rect = tb:GetToolRect(event:GetId())
+ return ide.frame:ScreenToClient(tb:ClientToScreen(rect:GetBottomLeft()))
+end
+
+local function tbIconSize()
+ -- use large icons by default on OSX and on large screens
+ local iconsize = (tonumber(ide.config.toolbar and ide.config.toolbar.iconsize)
+ or ((ide.osname == 'Macintosh' or wx.wxGetClientDisplayRect():GetWidth() >= 1500) and 24 or 16))
+ if iconsize ~= 24 then iconsize = 16 end
+ return iconsize
+end
+
+local function createToolBar(frame)
+ local toolBar = wxaui.wxAuiToolBar(frame, wx.wxID_ANY, wx.wxDefaultPosition, wx.wxDefaultSize,
+ wxaui.wxAUI_TB_PLAIN_BACKGROUND)
+
+ -- there are two sets of icons: use 24 on OSX and 16 on others.
+ local iconsize = tbIconSize()
+ local toolBmpSize = wx.wxSize(iconsize, iconsize)
+ local icons, prev = ide.config.toolbar.icons
+ for _, id in ipairs(icons) do
+ if icons[id] ~= false then -- skip explicitly disabled icons
+ if id == ID_SEPARATOR then
+ -- make sure that there are no two separators next to each other;
+ -- this may happen when some of the icons are disabled.
+ if prev ~= ID_SEPARATOR then toolBar:AddSeparator() end
+ else
+ local iconmap = ide.config.toolbar.iconmap[id]
+ if iconmap then
+ local icon, description = unpack(iconmap)
+ local isbitmap = type(icon) == "userdata" and icon:GetClassInfo():GetClassName() == "wxBitmap"
+ local bitmap = isbitmap and icon or ide:GetBitmap(icon, "TOOLBAR", toolBmpSize)
+ toolBar:AddTool(id, "", bitmap, (TR)(description)..SCinB(id))
+ end
+ end
+ prev = id
+ end
+ end
+
+ toolBar:SetToolDropDown(ID_OPEN, true)
+ toolBar:Connect(ID_OPEN, wxaui.wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN, function(event)
+ if event:IsDropDownClicked() then
+ local menu = wx.wxMenu()
+ FileRecentListUpdate(menu)
+ toolBar:PopupMenu(menu, menuDropDownPosition(event))
+ else
+ event:Skip()
+ end
+ end)
+
+ toolBar:SetToolDropDown(ID_PROJECTDIRCHOOSE, true)
+ toolBar:Connect(ID_PROJECTDIRCHOOSE, wxaui.wxEVT_COMMAND_AUITOOLBAR_TOOL_DROPDOWN, function(event)
+ if event:IsDropDownClicked() then
+ local menu = wx.wxMenu()
+ FileTreeProjectListUpdate(menu, 0)
+ toolBar:PopupMenu(menu, menuDropDownPosition(event))
+ else
+ event:Skip()
+ end
+ end)
+
+ toolBar:GetArtProvider():SetElementSize(wxaui.wxAUI_TBART_GRIPPER_SIZE, 0)
+ toolBar:Realize()
+
+ frame.toolBar = toolBar
+ return toolBar
+end
+
+local function createNotebook(frame)
+ -- notebook for editors
+ local notebook = wxaui.wxAuiNotebook(frame, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxDefaultSize,
+ wxaui.wxAUI_NB_DEFAULT_STYLE + wxaui.wxAUI_NB_TAB_EXTERNAL_MOVE
+ + wxaui.wxAUI_NB_WINDOWLIST_BUTTON + wx.wxNO_BORDER)
+
+ -- wxEVT_SET_FOCUS could be used, but it only works on Windows with wx2.9.5+
+ notebook:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED,
+ function (event)
+ local ed = GetEditor(notebook:GetSelection())
+ local doc = ed and ed:GetId() and ide.openDocuments[ed:GetId()]
+
+ -- skip activation when any of the following is true:
+ -- (1) there is no document yet, the editor tab was just added,
+ -- so no changes needed as there will be a proper later call;
+ -- (2) the page change event was triggered after a tab is closed;
+ -- (3) on OSX from AddPage event when changing from the last tab
+ -- (this is to work around a duplicate event generated in this case
+ -- that first activates the added tab and then some other tab (2.9.5)).
+
+ local double = (ide.osname == 'Macintosh'
+ and event:GetOldSelection() == notebook:GetPageCount()
+ and debug:traceback():find("'AddPage'"))
+
+ if doc and event:GetOldSelection() ~= -1 and not double then
+ SetEditorSelection(notebook:GetSelection())
+ end
+ end)
+
+ notebook:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE,
+ function (event)
+ ClosePage(event:GetSelection())
+ event:Veto() -- don't propagate the event as the page is already closed
+ end)
+
+ notebook:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK,
+ function (event)
+ -- as this event can be on different tab controls,
+ -- need to find the control to add the page to
+ local tabctrl = event:GetEventObject():DynamicCast("wxAuiTabCtrl")
+ -- check if the active page is in the current control
+ local active = tabctrl:GetActivePage()
+ if (active >= 0 and tabctrl:GetPage(active).window
+ ~= notebook:GetPage(notebook:GetSelection())) then
+ -- if not, need to activate the control that was clicked on;
+ -- find the last window and switch to it (assuming there is always one)
+ assert(tabctrl:GetPageCount() >= 1, "Expected at least one page in a notebook tab control.")
+ local lastwin = tabctrl:GetPage(tabctrl:GetPageCount()-1).window
+ notebook:SetSelection(notebook:GetPageIndex(lastwin))
+ end
+ NewFile()
+ end)
+
+ -- tabs can be dragged around which may change their indexes;
+ -- when this happens stored indexes need to be updated to reflect the change.
+ -- there is DRAG_DONE event that I'd prefer to use, but it
+ -- doesn't fire for some reason using wxwidgets 2.9.5 (tested on Windows).
+ if ide.wxver >= "2.9.5" then
+ notebook:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_END_DRAG,
+ function (event)
+ for page = 0, notebook:GetPageCount()-1 do
+ local editor = GetEditor(page)
+ if editor then ide.openDocuments[editor:GetId()].index = page end
+ end
+ -- first set the selection on the dragged tab to reset its state
+ notebook:SetSelection(event:GetSelection())
+ -- select the content of the tab after drag is done
+ SetEditorSelection(event:GetSelection())
+ event:Skip()
+ end)
+ end
+
+ local selection
+ notebook:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_TAB_RIGHT_UP,
+ function (event)
+ -- event:GetSelection() returns the index *inside the current tab*;
+ -- for split notebooks, this may not be the same as the index
+ -- in the notebook we are interested in here
+ local idx = event:GetSelection()
+ local tabctrl = event:GetEventObject():DynamicCast("wxAuiTabCtrl")
+
+ -- save tab index the event is for
+ selection = notebook:GetPageIndex(tabctrl:GetPage(idx).window)
+
+ local menu = wx.wxMenu {
+ { ID_CLOSE, TR("&Close Page") },
+ { ID_CLOSEALL, TR("Close A&ll Pages") },
+ { ID_CLOSEOTHER, TR("Close &Other Pages") },
+ { },
+ { ID_SAVE, TR("&Save") },
+ { ID_SAVEAS, TR("Save &As...") },
+ { },
+ { ID_COPYFULLPATH, TR("Copy Full Path") },
+ { ID_SHOWLOCATION, TR("Show Location") },
+ }
+
+ PackageEventHandle("onMenuEditorTab", menu, notebook, event, selection)
+
+ notebook:PopupMenu(menu)
+ end)
+
+ local function IfAtLeastOneTab(event)
+ event:Enable(notebook:GetPageCount() > 0)
+ if ide.osname == 'Macintosh' and (event:GetId() == ID_CLOSEALL
+ or event:GetId() == ID_CLOSE and notebook:GetPageCount() <= 1)
+ then event:Enable(false) end
+ end
+
+ notebook:Connect(ID_SAVE, wx.wxEVT_COMMAND_MENU_SELECTED, function ()
+ ide:GetDocument(GetEditor(selection)):Save()
+ end)
+ notebook:Connect(ID_SAVE, wx.wxEVT_UPDATE_UI, function(event)
+ local doc = ide:GetDocument(GetEditor(selection))
+ event:Enable(doc:IsModified() or doc:IsNew())
+ end)
+ notebook:Connect(ID_SAVEAS, wx.wxEVT_COMMAND_MENU_SELECTED, function()
+ SaveFileAs(GetEditor(selection))
+ end)
+ notebook:Connect(ID_SAVEAS, wx.wxEVT_UPDATE_UI, IfAtLeastOneTab)
+ notebook:Connect(ID_CLOSE, wx.wxEVT_COMMAND_MENU_SELECTED, function()
+ ClosePage(selection)
+ end)
+ notebook:Connect(ID_CLOSE, wx.wxEVT_UPDATE_UI, IfAtLeastOneTab)
+ notebook:Connect(ID_CLOSEALL, wx.wxEVT_COMMAND_MENU_SELECTED, function()
+ CloseAllPagesExcept(nil)
+ end)
+ notebook:Connect(ID_CLOSEALL, wx.wxEVT_UPDATE_UI, IfAtLeastOneTab)
+ notebook:Connect(ID_CLOSEOTHER, wx.wxEVT_COMMAND_MENU_SELECTED, function ()
+ CloseAllPagesExcept(selection)
+ end)
+ notebook:Connect(ID_CLOSEOTHER, wx.wxEVT_UPDATE_UI, function (event)
+ event:Enable(notebook:GetPageCount() > 1)
+ end)
+ notebook:Connect(ID_SHOWLOCATION, wx.wxEVT_COMMAND_MENU_SELECTED, function()
+ ShowLocation(ide:GetDocument(GetEditor(selection)):GetFilePath())
+ end)
+ notebook:Connect(ID_SHOWLOCATION, wx.wxEVT_UPDATE_UI, IfAtLeastOneTab)
+
+ notebook:Connect(ID_COPYFULLPATH, wx.wxEVT_COMMAND_MENU_SELECTED, function()
+ ide:CopyToClipboard(ide:GetDocument(GetEditor(selection)):GetFilePath())
+ end)
+
+ frame.notebook = notebook
+ return notebook
+end
+
+local function addDND(notebook)
+ -- this handler allows dragging tabs into this notebook
+ notebook:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_ALLOW_DND,
+ function (event)
+ local notebookfrom = event:GetDragSource()
+ if notebookfrom ~= ide.frame.notebook then
+ -- disable cross-notebook movement of specific tabs
+ local win = notebookfrom:GetPage(event:GetSelection())
+ if not win then return end
+ local winid = win:GetId()
+ if winid == ide:GetOutput():GetId()
+ or winid == ide:GetConsole():GetId()
+ or winid == ide:GetProjectTree():GetId()
+ or ide.findReplace:IsPreview(win) -- search results preview
+ then return end
+
+ local mgr = ide.frame.uimgr
+ local pane = mgr:GetPane(notebookfrom)
+ if not pane:IsOk() then return end -- not a managed window
+ if pane:IsFloating() then
+ notebookfrom:GetParent():Hide()
+ else
+ pane:Hide()
+ mgr:Update()
+ end
+ mgr:DetachPane(notebookfrom)
+
+ -- this is a workaround for wxwidgets bug (2.9.5+) that combines
+ -- content from two windows when tab is dragged over an active tab.
+ local mouse = wx.wxGetMouseState()
+ local mouseatpoint = wx.wxPoint(mouse:GetX(), mouse:GetY())
+ local ok, tabs = pcall(function() return wx.wxFindWindowAtPoint(mouseatpoint):DynamicCast("wxAuiTabCtrl") end)
+ if ok then tabs:SetNoneActive() end
+
+ event:Allow()
+ end
+ end)
+
+ -- these handlers allow dragging tabs out of this notebook.
+ -- I couldn't find a good way to stop dragging event as it's not known
+ -- where the event is going to end when it's started, so we manipulate
+ -- the flag that allows splits and disable it when needed.
+ -- It is then enabled in BEGIN_DRAG event.
+ notebook:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_BEGIN_DRAG,
+ function (event)
+ event:Skip()
+
+ -- allow dragging if it was disabled earlier
+ local flags = notebook:GetWindowStyleFlag()
+ if bit.band(flags, wxaui.wxAUI_NB_TAB_SPLIT) == 0 then
+ notebook:SetWindowStyleFlag(flags + wxaui.wxAUI_NB_TAB_SPLIT)
+ end
+ end)
+
+ -- there is currently no support in wxAuiNotebook for dragging tabs out.
+ -- This is implemented as removing a tab that was dragged out and
+ -- recreating it with the right control. This is complicated by the fact
+ -- that tabs can be split, so if the destination is withing the area where
+ -- splits happen, the tab is not removed.
+ notebook:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_END_DRAG,
+ function (event)
+ event:Skip()
+
+ local mgr = ide.frame.uimgr
+ local win = mgr:GetPane(notebook).window
+ local x = win:GetScreenPosition():GetX()
+ local y = win:GetScreenPosition():GetY()
+ local w, h = win:GetSize():GetWidth(), win:GetSize():GetHeight()
+
+ local mouse = wx.wxGetMouseState()
+ local mx, my = mouse:GetX(), mouse:GetY()
+
+ if mx >= x and mx <= x + w and my >= y and my <= y + h then return end
+
+ -- disallow split as the target is outside the notebook
+ local flags = notebook:GetWindowStyleFlag()
+ if bit.band(flags, wxaui.wxAUI_NB_TAB_SPLIT) ~= 0 then
+ notebook:SetWindowStyleFlag(flags - wxaui.wxAUI_NB_TAB_SPLIT)
+ end
+
+ -- don't allow dragging out single tabs from tab ctrl
+ -- as wxwidgets doesn't like removing pages from split notebooks.
+ local tabctrl = event:GetEventObject():DynamicCast("wxAuiTabCtrl")
+ if tabctrl:GetPageCount() == 1 then return end
+
+ local idx = event:GetSelection() -- index within the current tab ctrl
+ local selection = notebook:GetPageIndex(tabctrl:GetPage(idx).window)
+ local label = notebook:GetPageText(selection)
+ local pane = ide:RestorePanelByLabel(label)
+ if not pane then return end
+
+ pane:FloatingPosition(mx-10, my-10)
+ pane:Show()
+ notebook:RemovePage(selection)
+ mgr:Update()
+ end)
+end
+
+local function createBottomNotebook(frame)
+ -- bottomnotebook (errorlog,shellbox)
+ local bottomnotebook = wxaui.wxAuiNotebook(frame, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxDefaultSize,
+ wxaui.wxAUI_NB_DEFAULT_STYLE + wxaui.wxAUI_NB_TAB_EXTERNAL_MOVE
+ - wxaui.wxAUI_NB_CLOSE_ON_ACTIVE_TAB + wx.wxNO_BORDER)
+
+ addDND(bottomnotebook)
+
+ bottomnotebook:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED,
+ function (event)
+ if not ide.findReplace then return end
+ local nb = event:GetEventObject():DynamicCast("wxAuiNotebook")
+ local preview = ide.findReplace:IsPreview(nb:GetPage(nb:GetSelection()))
+ local flags = nb:GetWindowStyleFlag()
+ if preview and bit.band(flags, wxaui.wxAUI_NB_CLOSE_ON_ACTIVE_TAB) == 0 then
+ nb:SetWindowStyleFlag(flags + wxaui.wxAUI_NB_CLOSE_ON_ACTIVE_TAB)
+ elseif not preview and bit.band(flags, wxaui.wxAUI_NB_CLOSE_ON_ACTIVE_TAB) ~= 0 then
+ nb:SetWindowStyleFlag(flags - wxaui.wxAUI_NB_CLOSE_ON_ACTIVE_TAB)
+ end
+ end)
+
+ -- disallow tabs closing
+ bottomnotebook:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE,
+ function (event)
+ local nb = event:GetEventObject():DynamicCast("wxAuiNotebook")
+ if ide.findReplace
+ and ide.findReplace:IsPreview(nb:GetPage(nb:GetSelection())) then
+ event:Skip()
+ else
+ event:Veto()
+ end
+ end)
+
+ local errorlog = ide:CreateStyledTextCtrl(bottomnotebook, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxDefaultSize, wx.wxBORDER_NONE)
+
+ errorlog:Connect(wx.wxEVT_CONTEXT_MENU,
+ function (event)
+ local menu = wx.wxMenu {
+ { ID_UNDO, TR("&Undo") },
+ { ID_REDO, TR("&Redo") },
+ { },
+ { ID_CUT, TR("Cu&t") },
+ { ID_COPY, TR("&Copy") },
+ { ID_PASTE, TR("&Paste") },
+ { ID_SELECTALL, TR("Select &All") },
+ { },
+ { ID_CLEAROUTPUT, TR("C&lear Output Window") },
+ }
+ PackageEventHandle("onMenuOutput", menu, errorlog, event)
+ errorlog:PopupMenu(menu)
+ end)
+
+ errorlog:Connect(ID_CLEAROUTPUT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event) ClearOutput(true) end)
+
+ local shellbox = ide:CreateStyledTextCtrl(bottomnotebook, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxDefaultSize, wx.wxBORDER_NONE)
+
+ local menupos
+ shellbox:Connect(wx.wxEVT_CONTEXT_MENU,
+ function (event)
+ local menu = wx.wxMenu {
+ { ID_UNDO, TR("&Undo") },
+ { ID_REDO, TR("&Redo") },
+ { },
+ { ID_CUT, TR("Cu&t") },
+ { ID_COPY, TR("&Copy") },
+ { ID_PASTE, TR("&Paste") },
+ { ID_SELECTALL, TR("Select &All") },
+ { },
+ { ID_SELECTCONSOLECOMMAND, TR("&Select Command") },
+ { ID_CLEARCONSOLE, TR("C&lear Console Window") },
+ }
+ menupos = event:GetPosition()
+ PackageEventHandle("onMenuConsole", menu, shellbox, event)
+ shellbox:PopupMenu(menu)
+ end)
+
+ shellbox:Connect(ID_SELECTCONSOLECOMMAND, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event) ConsoleSelectCommand(menupos) end)
+ shellbox:Connect(ID_CLEARCONSOLE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event) ide:GetConsole():Erase() end)
+
+ bottomnotebook:AddPage(errorlog, TR("Output"), true)
+ bottomnotebook:AddPage(shellbox, TR("Local console"), false)
+
+ bottomnotebook.errorlog = errorlog
+ bottomnotebook.shellbox = shellbox
+
+ frame.bottomnotebook = bottomnotebook
+ return bottomnotebook
+end
+
+local function createProjNotebook(frame)
+ local projnotebook = wxaui.wxAuiNotebook(frame, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxDefaultSize,
+ wxaui.wxAUI_NB_DEFAULT_STYLE + wxaui.wxAUI_NB_TAB_EXTERNAL_MOVE
+ - wxaui.wxAUI_NB_CLOSE_ON_ACTIVE_TAB + wx.wxNO_BORDER)
+
+ addDND(projnotebook)
+
+ -- disallow tabs closing
+ projnotebook:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE,
+ function (event) event:Veto() end)
+
+ frame.projnotebook = projnotebook
+ return projnotebook
+end
+
+-- ----------------------------------------------------------------------------
+-- Add the child windows to the frame
+
+local frame = createFrame()
+ide.frame = frame
+createToolBar(frame)
+createNotebook(frame)
+createProjNotebook(frame)
+createBottomNotebook(frame)
+
+do
+ local frame = ide.frame
+ local mgr = frame.uimgr
+
+ --[[mgr:AddPane(frame.toolBar, wxaui.wxAuiPaneInfo():
+ Name("toolbar"):Caption("Toolbar"):
+ ToolbarPane():Top():CloseButton(false):PaneBorder(false):
+ LeftDockable(false):RightDockable(false))]]--
+ mgr:AddPane(frame.notebook, wxaui.wxAuiPaneInfo():
+ Name("notebook"):
+ CenterPane():PaneBorder(false))
+ mgr:AddPane(frame.projnotebook, wxaui.wxAuiPaneInfo():
+ Name("projpanel"):CaptionVisible(false):
+ MinSize(200,200):FloatingSize(200,400):
+ Left():Layer(1):Position(1):PaneBorder(false):
+ CloseButton(true):MaximizeButton(false):PinButton(true))
+ mgr:AddPane(frame.bottomnotebook, wxaui.wxAuiPaneInfo():
+ Name("bottomnotebook"):CaptionVisible(false):
+ MinSize(100,100):BestSize(200,200):FloatingSize(400,200):
+ Bottom():Layer(1):Position(1):PaneBorder(false):
+ CloseButton(true):MaximizeButton(false):PinButton(true))
+ --mgr:GetPane("toolbar"):Show(false)
+ mgr:GetPane("projpanel"):Show(false)
+ mgr:GetPane("bottomnotebook"):Show(false)
+
+ if type(ide.config.bordersize) == 'number' then
+ for _, uimgr in pairs {mgr, frame.notebook:GetAuiManager(),
+ frame.bottomnotebook:GetAuiManager(), frame.projnotebook:GetAuiManager()} do
+ uimgr:GetArtProvider():SetMetric(wxaui.wxAUI_DOCKART_SASH_SIZE,
+ ide.config.bordersize)
+ end
+ end
+
+ for _, nb in pairs {frame.bottomnotebook, frame.projnotebook} do
+ nb:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK,
+ function() PaneFloatToggle(nb) end)
+ end
+
+ mgr.defaultPerspective = mgr:SavePerspective()
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/ids.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/ids.lua
new file mode 100644
index 0000000..d53ae83
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/ids.lua
@@ -0,0 +1,190 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Lomtik Software (J. Winwood & John Labenski)
+-- Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+-- Generate a unique new wxWindowID
+local ID_IDCOUNTER = wx.wxID_HIGHEST + 1
+function NewID()
+ ID_IDCOUNTER = ID_IDCOUNTER + 1
+ return ID_IDCOUNTER
+end
+
+-- some Ubuntu versions (Ubuntu 13.10) ignore labels on stock menu IDs,
+-- so don't use stock IDs on Linux
+local linux = ide.osname == 'Unix'
+
+ID_SEPARATOR = NewID()
+-- File menu
+ID_NEW = linux and NewID() or wx.wxID_NEW
+ID_OPEN = linux and NewID() or wx.wxID_OPEN
+ID_CLOSE = NewID()
+ID_CLOSEALL = NewID()
+ID_CLOSEOTHER = NewID()
+ID_NEWFILE = NewID()
+ID_NEWDIRECTORY = NewID()
+ID_RENAMEFILE = NewID()
+ID_DELETEFILE = NewID()
+ID_SAVE = linux and NewID() or wx.wxID_SAVE
+ID_SAVEAS = linux and NewID() or wx.wxID_SAVEAS
+ID_SAVEALL = NewID()
+ID_RECENTFILES = NewID()
+ID_RECENTFILESCLEAR = NewID()
+ID_RECENTFILESPREV = NewID()
+ID_RECENTFILESNEXT = NewID()
+ID_RECENTPROJECTS = NewID()
+ID_RECENTPROJECTSCLEAR = NewID()
+ID_RECENTPROJECTSPREV = NewID()
+ID_PRINT = NewID()
+ID_PAGESETUP = NewID()
+ID_EXIT = linux and NewID() or wx.wxID_EXIT
+-- Edit menu
+ID_CUT = linux and NewID() or wx.wxID_CUT
+ID_COPY = linux and NewID() or wx.wxID_COPY
+ID_PASTE = linux and NewID() or wx.wxID_PASTE
+ID_SELECTALL = linux and NewID() or wx.wxID_SELECTALL
+ID_UNDO = linux and NewID() or wx.wxID_UNDO
+ID_REDO = linux and NewID() or wx.wxID_REDO
+ID_SHOWTOOLTIP = NewID()
+ID_AUTOCOMPLETE = NewID()
+ID_AUTOCOMPLETEENABLE = NewID()
+ID_COMMENT = NewID()
+ID_FOLD = NewID()
+ID_CLEARDYNAMICWORDS = NewID()
+ID_SOURCE = NewID()
+ID_REINDENT = NewID()
+ID_BOOKMARK = NewID()
+ID_BOOKMARKTOGGLE = NewID()
+ID_BOOKMARKNEXT = NewID()
+ID_BOOKMARKPREV = NewID()
+ID_NAVIGATE = NewID()
+ID_NAVIGATETOFILE = NewID()
+ID_NAVIGATETOLINE = NewID()
+ID_NAVIGATETOSYMBOL = NewID()
+ID_NAVIGATETOMETHOD = NewID()
+-- don't use wx.wxID_PREFERENCES to avoid merging with OSX app menu, because
+-- Apple guidelines describe Preferences as a "normal" item without submenus.
+ID_PREFERENCES = NewID()
+ID_PREFERENCESSYSTEM = NewID()
+ID_PREFERENCESUSER = NewID()
+-- Search menu
+ID_FIND = linux and NewID() or wx.wxID_FIND
+ID_FINDNEXT = NewID()
+ID_FINDPREV = NewID()
+ID_FINDSELECTNEXT = NewID()
+ID_FINDSELECTPREV = NewID()
+ID_REPLACE = NewID()
+ID_FINDINFILES = NewID()
+ID_REPLACEINFILES = NewID()
+ID_SORT = NewID()
+-- View menu
+ID_VIEWFILETREE = NewID()
+ID_VIEWOUTPUT = NewID()
+ID_VIEWCALLSTACK = NewID()
+ID_VIEWWATCHWINDOW = NewID()
+ID_VIEWOUTLINE = NewID()
+ID_VIEWMARKERS = NewID()
+ID_VIEWTOOLBAR = NewID()
+ID_VIEWSTATUSBAR = NewID()
+ID_VIEWDEFAULTLAYOUT = NewID()
+ID_VIEWFULLSCREEN = NewID()
+ID_VIEWMINIMIZE = NewID()
+ID_ZOOM = NewID()
+ID_ZOOMRESET = NewID()
+ID_ZOOMIN = NewID()
+ID_ZOOMOUT = NewID()
+-- Project menu
+ID_BREAKPOINT = NewID()
+ID_BREAKPOINTTOGGLE = NewID()
+ID_BREAKPOINTNEXT = NewID()
+ID_BREAKPOINTPREV = NewID()
+ID_TOGGLEBREAKPOINT = ID_BREAKPOINTTOGGLE -- for compatibility; to remove after v1.30
+ID_COMPILE = NewID()
+ID_ANALYZE = NewID()
+ID_RUN = NewID()
+ID_RUNNOW = NewID()
+ID_ATTACHDEBUG = NewID()
+ID_STARTDEBUG = NewID()
+ID_STOPDEBUG = NewID()
+ID_DETACHDEBUG = NewID()
+ID_STEP = NewID()
+ID_STEPOVER = NewID()
+ID_STEPOUT = NewID()
+ID_RUNTO = NewID()
+ID_BREAK = NewID()
+ID_TRACE = NewID()
+ID_CLEAROUTPUT = NewID()
+ID_CLEARCONSOLE = NewID()
+ID_COMMANDLINEPARAMETERS = NewID()
+ID_INTERPRETER = NewID()
+ID_PROJECTDIR = NewID()
+ID_PROJECTDIRFROMFILE = NewID()
+ID_PROJECTDIRFROMDIR = NewID()
+ID_PROJECTDIRCHOOSE = NewID()
+-- Help menu
+ID_ABOUT = linux and NewID() or wx.wxID_ABOUT
+ID_HELPPROJECT = NewID()
+ID_HELPDOCUMENTATION = NewID()
+ID_HELPGETTINGSTARTED = NewID()
+ID_HELPTUTORIALS = NewID()
+ID_HELPFAQ = NewID()
+ID_HELPCOMMUNITY = NewID()
+-- Watch window menu items
+ID_ADDWATCH = NewID()
+ID_EDITWATCH = NewID()
+ID_DELETEWATCH = NewID()
+ID_COPYWATCHVALUE = NewID()
+-- Editor popup menu items
+ID_GOTODEFINITION = NewID()
+ID_RENAMEALLINSTANCES = NewID()
+ID_REPLACEALLSELECTIONS = NewID()
+ID_QUICKADDWATCH = NewID()
+ID_QUICKEVAL = NewID()
+ID_ADDTOSCRATCHPAD = NewID()
+-- filetree menu
+ID_HIDEEXTENSION = NewID()
+ID_SETSTARTFILE = NewID()
+ID_UNSETSTARTFILE = NewID()
+ID_SHOWEXTENSION = NewID()
+ID_SHOWEXTENSIONALL = NewID()
+ID_MAPDIRECTORY = NewID()
+ID_UNMAPDIRECTORY = NewID()
+ID_OPENEXTENSION = NewID()
+ID_COPYFULLPATH = NewID()
+ID_SHOWLOCATION = NewID()
+ID_REFRESH = NewID()
+ID_SYMBOLDIRREFRESH = NewID()
+ID_SYMBOLDIRINDEX = NewID()
+ID_SYMBOLDIRDISABLE = NewID()
+ID_SYMBOLDIRENABLE = NewID()
+-- outline menu
+ID_OUTLINESORT = NewID()
+-- console menu
+ID_SELECTCONSOLECOMMAND = NewID()
+-- search toolbar
+ID_FINDALL = NewID()
+ID_FINDREPLACENEXT = NewID()
+ID_FINDREPLACEALL = NewID()
+ID_FINDSETDIR = NewID()
+ID_FINDSETTOPROJDIR = NewID()
+ID_FINDOPTSCOPE = NewID()
+ID_FINDOPTSTATUS = NewID()
+ID_FINDOPTDIRECTION = NewID()
+ID_FINDOPTWRAPWROUND = NewID()
+ID_FINDOPTSELECTION = NewID()
+ID_FINDOPTWORD = NewID()
+ID_FINDOPTCASE = NewID()
+ID_FINDOPTREGEX = NewID()
+ID_FINDOPTCONTEXT = NewID()
+ID_FINDOPTSUBDIR = NewID()
+ID_FINDOPTMULTIRESULTS = NewID()
+ID_RECENTSCOPECLEAR = NewID()
+
+local ids = {}
+function IDgen (name)
+ ids[name] = ids[name] or NewID()
+ return ids[name]
+end
+function IDget (name) return ids[name] end
+
+ID = setmetatable({}, ide.proto.ID)
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/inspect.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/inspect.lua
new file mode 100644
index 0000000..a9eef01
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/inspect.lua
@@ -0,0 +1,243 @@
+-- Copyright 2012-15 Paul Kulchenko, ZeroBrane LLC
+-- Integration with LuaInspect
+---------------------------------------------------------
+
+local M, LA, LI, T = {}
+
+local function init()
+ if LA then return end
+
+ -- metalua is using 'checks', which noticeably slows the execution
+ -- stab it with out own
+ package.loaded.checks = {}
+ checks = function() end
+
+ LA = require "luainspect.ast"
+ LI = require "luainspect.init"
+ T = require "luainspect.types"
+end
+
+function M.pos2line(pos)
+ return pos and 1 + select(2, M.src:sub(1,pos):gsub(".-\n[^\n]*", ""))
+end
+
+function M.warnings_from_string(src, file)
+ init()
+
+ local ast, err, linenum, colnum = LA.ast_from_string(src, file)
+ if not ast and err then return nil, err, linenum, colnum end
+
+ LI.uninspect(ast)
+ if ide.config.staticanalyzer.infervalue then
+ local tokenlist = LA.ast_to_tokenlist(ast, src)
+ LI.clear_cache()
+ LI.inspect(ast, tokenlist, src)
+ LI.mark_related_keywords(ast, tokenlist, src)
+ else
+ -- stub out LI functions that depend on tokenlist,
+ -- which is not built in the "fast" mode
+ local ec, iv = LI.eval_comments, LI.infer_values
+ LI.eval_comments, LI.infer_values = function() end, function() end
+
+ LI.inspect(ast, nil, src)
+ LA.ensure_parents_marked(ast)
+
+ LI.eval_comments, LI.infer_values = ec, iv
+ end
+
+ local globinit = {arg = true} -- skip `arg` global variable
+ local spec = GetSpec(wx.wxFileName(file):GetExt())
+ for k in pairs(spec and GetApi(spec.apitype or "none").ac.childs or {}) do
+ globinit[k] = true
+ end
+
+ M.src, M.file = src, file
+ return M.show_warnings(ast, globinit)
+end
+
+local function cleanError(err)
+ return err and err:gsub(".-:%d+: file%s+",""):gsub(", line (%d+), char %d+", ":%1")
+end
+
+function AnalyzeFile(file)
+ local src, err = FileRead(file)
+ if not src and err then return nil, TR("Can't open file '%s': %s"):format(file, err) end
+
+ local warn, err, line, pos = M.warnings_from_string(src, file)
+ return warn, cleanError(err), line, pos
+end
+
+function AnalyzeString(src, file)
+ local warn, err, line, pos = M.warnings_from_string(src, file or "<string>")
+ return warn, cleanError(err), line, pos
+end
+
+function M.show_warnings(top_ast, globinit)
+ local warnings = {}
+ local function warn(msg, linenum, path)
+ warnings[#warnings+1] = (path or M.file or "?") .. ":" .. (linenum or M.pos2line(M.ast.pos) or 0) .. ": " .. msg
+ end
+ local function known(o) return not T.istype[o] end
+ local function index(f) -- build abc.def.xyz name recursively
+ if not f or f.tag ~= 'Index' or not f[1] or not f[2] then return end
+ local main = f[1].tag == 'Id' and f[1][1] or index(f[1])
+ return main and type(f[2][1]) == "string" and (main .. '.' .. f[2][1]) or nil
+ end
+ local globseen, isseen, fieldseen = globinit or {}, {}, {}
+ LA.walk(top_ast, function(ast)
+ M.ast = ast
+ local path, line = tostring(ast.lineinfo):gsub('<C|','<'):match('<([^|]+)|L(%d+)')
+ local name = ast[1]
+ -- check if we're masking a variable in the same scope
+ if ast.localmasking and name ~= '_' and
+ ast.level == ast.localmasking.level then
+ local linenum = ast.localmasking.lineinfo
+ and tostring(ast.localmasking.lineinfo.first):match('|L(%d+)')
+ or M.pos2line(ast.localmasking.pos)
+ local parent = ast.parent and ast.parent.parent
+ local func = parent and parent.tag == 'Localrec'
+ warn("local " .. (func and 'function' or 'variable') .. " '" ..
+ name .. "' masks earlier declaration " ..
+ (linenum and "on line " .. linenum or "in the same scope"),
+ line, path)
+ end
+ if ast.localdefinition == ast and not ast.isused and
+ not ast.isignore then
+ local parent = ast.parent and ast.parent.parent
+ local isparam = parent and parent.tag == 'Function'
+ if isparam then
+ if name ~= 'self' then
+ local func = parent.parent and parent.parent.parent
+ local assignment = not func.tag or func.tag == 'Set' or func.tag == 'Localrec'
+ -- anonymous functions can also be defined in expressions,
+ -- for example, 'Op' or 'Return' tags
+ local expression = not assignment and func.tag
+ local func1 = func[1][1]
+ local fname = assignment and func1 and type(func1[1]) == 'string'
+ and func1[1] or (func1 and func1.tag == 'Index' and index(func1))
+ -- "function foo(bar)" => func.tag == 'Set'
+ -- `Set{{`Id{"foo"}},{`Function{{`Id{"bar"}},{}}}}
+ -- "local function foo(bar)" => func.tag == 'Localrec'
+ -- "local _, foo = 1, function(bar)" => func.tag == 'Local'
+ -- "print(function(bar) end)" => func.tag == nil
+ -- "a = a or function(bar) end" => func.tag == nil
+ -- "return(function(bar) end)" => func.tag == 'Return'
+ -- "function tbl:foo(bar)" => func.tag == 'Set'
+ -- `Set{{`Index{`Id{"tbl"},`String{"foo"}}},{`Function{{`Id{"self"},`Id{"bar"}},{}}}}
+ -- "function tbl.abc:foo(bar)" => func.tag == 'Set'
+ -- `Set{{`Index{`Index{`Id{"tbl"},`String{"abc"}},`String{"foo"}}},{`Function{{`Id{"self"},`Id{"bar"}},{}}}},
+ warn("unused parameter '" .. name .. "'" ..
+ (func and (assignment or expression)
+ and (fname and func.tag
+ and (" in function '" .. fname .. "'")
+ or " in anonymous function")
+ or ""),
+ line, path)
+ end
+ else
+ if parent and parent.tag == 'Localrec' then -- local function foo...
+ warn("unused local function '" .. name .. "'", line, path)
+ else
+ warn("unused local variable '" .. name .. "'; "..
+ "consider removing or replacing with '_'", line, path)
+ end
+ end
+ end
+ -- added check for "fast" mode as ast.seevalue relies on value evaluation,
+ -- which is very slow even on simple and short scripts
+ if ide.config.staticanalyzer.infervalue and ast.isfield
+ and not(known(ast.seevalue.value) and ast.seevalue.value ~= nil) then
+ if not fieldseen[name] then
+ fieldseen[name] = true
+ local var = index(ast.parent)
+ local parent = ast.parent and var
+ and (" in '"..var:gsub("%."..name.."$","").."'")
+ or ""
+
+ local tblref = ast.parent and ast.parent[1]
+ local localparam = (tblref and tblref.localdefinition
+ and tblref.localdefinition.isparam)
+ if not localparam then
+ warn("first use of unknown field '" .. name .."'"..parent,
+ ast.lineinfo and tostring(ast.lineinfo.first):match('|L(%d+)'), path)
+ end
+ end
+ elseif ast.tag == 'Id' and not ast.localdefinition and not ast.definedglobal then
+ if not globseen[name] then
+ globseen[name] = true
+ local parent = ast.parent
+ -- if being called and not one of the parameters
+ if parent and parent.tag == 'Call' and parent[1] == ast then
+ warn("first use of unknown global function '" .. name .. "'", line, path)
+ else
+ warn("first use of unknown global variable '" .. name .. "'", line, path)
+ end
+ end
+ elseif ast.tag == 'Id' and not ast.localdefinition and ast.definedglobal then
+ local parent = ast.parent and ast.parent.parent
+ if parent and parent.tag == 'Set' and not globseen[name] -- report assignments to global
+ -- only report if it is on the left side of the assignment
+ -- this is a bit tricky as it can be assigned as part of a, b = c, d
+ -- `Set{ {lhs+} {expr+} } -- lhs1, lhs2... = e1, e2...
+ and parent[1] == ast.parent
+ and parent[2][1].tag ~= "Function" then -- but ignore global functions
+ warn("first assignment to global variable '" .. name .. "'", line, path)
+ globseen[name] = true
+ end
+ elseif (ast.tag == 'Set' or ast.tag == 'Local') and #(ast[2]) > #(ast[1]) then
+ warn(("value discarded in multiple assignment: %d values assigned to %d variable%s")
+ :format(#(ast[2]), #(ast[1]), #(ast[1]) > 1 and 's' or ''), line, path)
+ end
+ local vast = ast.seevalue or ast
+ local note = vast.parent
+ and (vast.parent.tag == 'Call' or vast.parent.tag == 'Invoke')
+ and vast.parent.note
+ if note and not isseen[vast.parent] and type(name) == "string" then
+ isseen[vast.parent] = true
+ warn("function '" .. name .. "': " .. note, line, path)
+ end
+ end)
+ return warnings
+end
+
+local frame = ide.frame
+
+-- insert after "Compile" item
+local _, menu, compilepos = ide:FindMenuItem(ID_COMPILE)
+if compilepos then
+ menu:Insert(compilepos+1, ID_ANALYZE, TR("Analyze")..KSC(ID_ANALYZE), TR("Analyze the source code"))
+end
+
+local function analyzeProgram(editor)
+ -- save all files (if requested) for "infervalue" analysis to keep the changes on disk
+ if ide.config.editor.saveallonrun and ide.config.staticanalyzer.infervalue then SaveAll(true) end
+ if ide:GetLaunchedProcess() == nil and not ide:GetDebugger():IsConnected() then ClearOutput() end
+ DisplayOutput("Analyzing the source code")
+ frame:Update()
+
+ local editorText = editor:GetTextDyn()
+ local doc = ide:GetDocument(editor)
+ local filePath = doc:GetFilePath() or doc:GetFileName()
+ local warn, err = M.warnings_from_string(editorText, filePath)
+ if err then -- report compilation error
+ DisplayOutputLn((": not completed.\n%s"):format(cleanError(err)))
+ return false
+ end
+
+ DisplayOutputLn((": %s warning%s.")
+ :format(#warn > 0 and #warn or 'no', #warn == 1 and '' or 's'))
+ DisplayOutputNoMarker(table.concat(warn, "\n") .. (#warn > 0 and "\n" or ""))
+
+ return true -- analyzed ok
+end
+
+frame:Connect(ID_ANALYZE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function ()
+ ActivateOutput()
+ local editor = GetEditor()
+ if not analyzeProgram(editor) then
+ CompileProgram(editor, { reportstats = false, keepoutput = true })
+ end
+ end)
+frame:Connect(ID_ANALYZE, wx.wxEVT_UPDATE_UI,
+ function (event) event:Enable(GetEditor() ~= nil) end)
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/iofilters.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/iofilters.lua
new file mode 100644
index 0000000..76e6135
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/iofilters.lua
@@ -0,0 +1,71 @@
+-- Copyright 2011-14 Paul Kulchenko, ZeroBrane LLC
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+
+ide.iofilters["GermanUtf8Ascii"] = {
+
+ -- this function converts some utf8 character output. It's a hack.
+ -- Since luxinia is not utf8 prepared, this is still necessary.
+ -- if you wish to turn this off, edit user.lua and set this filefunction to nil
+ output = function (fpath, content)
+ local utf8escape = ("string").char(195)
+ -- only simple cases are handled (umlauts)
+ local chr = ("string").char
+ local charconv = {
+ [chr(164)] = chr(228), -- ä
+ [chr(182)] = chr(246), -- ö
+ [chr(188)] = chr(252), -- ü
+ [chr(132)] = chr(196), -- Ä
+ [chr(150)] = chr(214), -- Ö
+ [chr(156)] = chr(220), -- Ü
+ [chr(159)] = chr(223), -- ß
+ }
+ return content : gsub (utf8escape.."(.)",charconv)
+ end,
+
+ -- this function is another hack to read an ANSI encoded
+ -- file and converts the umlauts to utf8 chars
+ input = function (fpath, content)
+ local utf8escape = ("string").char(195)
+ local chr = ("string").char
+ local charconv = {
+ [chr(228)] = utf8escape..chr(164), -- ä
+ [chr(246)] = utf8escape..chr(182), -- ö
+ [chr(252)] = utf8escape..chr(188), -- ü
+ [chr(196)] = utf8escape..chr(132), -- Ä
+ [chr(214)] = utf8escape..chr(150), -- Ö
+ [chr(220)] = utf8escape..chr(156), -- Ü
+ [chr(223)] = utf8escape..chr(159), -- ß
+ }
+ local lst = "["
+ for k in pairs(charconv) do lst = lst .. k end
+ lst = lst.."]"
+
+ return content:gsub(lst,charconv)
+ end,
+
+}
+
+ide.iofilters["0d0d0aFix"] = {
+ -- this function converts 0d0d0a line ending to 0d0a
+ input = function(fpath, content)
+ return content:gsub("\013\013\010","\013\010")
+ end,
+}
+
+--üäß
+
+for i,filter in pairs(ide.iofilters) do
+ if filter.input and filter.output then
+ assert(filter.output("",filter.input("","äöüÄÖÜß")),
+ "„”äöüÄÖÜß","UTF8-ANSI conversion failed: "..(i))
+ end
+end
+
+-- which: "input" or "output"
+function GetConfigIOFilter(which)
+ local filtername = ide.config.editor.iofilter
+ return (filtername and ide.iofilters[filtername] and ide.iofilters[filtername][which])
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/keymap.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/keymap.lua
new file mode 100644
index 0000000..13be885
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/keymap.lua
@@ -0,0 +1,136 @@
+local ide = ide
+
+--[[
+Accelerator general syntax is any combination of "CTRL", "ALT" and "SHIFT"
+strings (case doesn't matter) separated by either '-' or '+' characters and
+followed by the accelerator itself. The accelerator may be any alphanumeric
+character, any function key (from F1 to F12) or one of the special characters
+listed below (again, case doesn't matter):
+
+ DEL/DELETE Delete key
+ INS/INSERT Insert key
+ ENTER/RETURN Enter key
+ PGUP PageUp key
+ PGDN PageDown key
+ LEFT Left cursor arrow key
+ RIGHT Right cursor arrow key
+ UP Up cursor arrow key
+ DOWN Down cursor arrow key
+ HOME Home key
+ END End key
+ SPACE Space
+ TAB Tab key
+ ESC/ESCAPE Escape key (Windows only)
+--]]
+
+ide.config.keymap = {
+-- File menu
+ [ID.NEW] = "Ctrl-N",
+ [ID.OPEN] = "Ctrl-O",
+ [ID.CLOSE] = "Ctrl-W",
+ [ID.SAVE] = "Ctrl-S",
+ [ID.SAVEAS] = "Alt-Shift-S",
+ [ID.SAVEALL] = "",
+ [ID.RECENTFILES] = "",
+ [ID.RECENTFILESPREV] = "Ctrl-,",
+ [ID.RECENTFILESNEXT] = "Ctrl-.",
+ [ID.EXIT] = "Ctrl-Q",
+ [ID.RECENTPROJECTSPREV] = "Ctrl-Shift-<",
+-- Edit menu
+ [ID.CUT] = "Ctrl-X",
+ [ID.COPY] = "Ctrl-C",
+ [ID.PASTE] = "Ctrl-V",
+ [ID.SELECTALL] = "Ctrl-A",
+ [ID.UNDO] = "Ctrl-Z",
+ [ID.REDO] = "Ctrl-Y",
+ [ID.SHOWTOOLTIP] = "Ctrl-T",
+ [ID.AUTOCOMPLETE] = "Ctrl-K",
+ [ID.AUTOCOMPLETEENABLE] = "",
+ [ID.COMMENT] = "Ctrl-U",
+ [ID.FOLD] = "F12",
+ [ID.CLEARDYNAMICWORDS] = "",
+ [ID.REINDENT] = "Ctrl-I",
+ [ID.BOOKMARKTOGGLE] = "Ctrl-F2",
+ [ID.BOOKMARKNEXT] = "F2",
+ [ID.BOOKMARKPREV] = "Shift-F2",
+ [ID.NAVIGATETOFILE] = "Ctrl-P",
+ [ID.NAVIGATETOLINE] = "Ctrl-G",
+ [ID.NAVIGATETOSYMBOL] = "Ctrl-B",
+ [ID.NAVIGATETOMETHOD] = "Ctrl-;",
+-- Search menu
+ [ID.FIND] = "Ctrl-F",
+ [ID.FINDNEXT] = "F3",
+ [ID.FINDPREV] = "Shift-F3",
+ [ID.FINDSELECTNEXT] = "Ctrl-F3",
+ [ID.FINDSELECTPREV] = "Ctrl-Shift-F3",
+-- [ID.REPLACE] = "Ctrl-R",
+ [ID.FINDINFILES] = "Ctrl-Shift-F",
+ [ID.REPLACEINFILES] = "Ctrl-Shift-R",
+ [ID.SORT] = "",
+-- View menu
+ [ID.VIEWFILETREE] = "Ctrl-Shift-P",
+ [ID.VIEWOUTPUT] = "Ctrl-Shift-O",
+ [ID.VIEWWATCHWINDOW] = "Ctrl-Shift-W",
+ [ID.VIEWCALLSTACK] = "Ctrl-Shift-S",
+ [ID.VIEWDEFAULTLAYOUT] = "",
+ [ID.VIEWFULLSCREEN] = "Ctrl-Shift-A",
+ [ID.ZOOMRESET] = "Ctrl-0",
+ [ID.ZOOMIN] = "Ctrl-+",
+ [ID.ZOOMOUT] = "Ctrl--",
+-- Project menu
+ [ID.RUN] = "F6",
+ [ID.RUNNOW] = "Ctrl-F6",
+ [ID.COMPILE] = "F7",
+ [ID.ANALYZE] = "Shift-F7",
+ [ID.STARTDEBUG] = "F5",
+ [ID.ATTACHDEBUG] = "",
+ [ID.DETACHDEBUG] = "",
+ [ID.STOPDEBUG] = "Shift-F5",
+ [ID.STEP] = "F10",
+ [ID.STEPOVER] = "Shift-F10",
+ [ID.STEPOUT] = "Ctrl-F10",
+ [ID.RUNTO] = "Ctrl-Shift-F10",
+ [ID.TRACE] = "",
+ [ID.BREAK] = "",
+ [ID.BREAKPOINTTOGGLE] = "Ctrl-F9",
+ [ID.BREAKPOINTNEXT] = "F9",
+ [ID.BREAKPOINTPREV] = "Shift-F9",
+ [ID.CLEAROUTPUT] = "",
+ [ID.INTERPRETER] = "",
+ [ID.PROJECTDIR] = "",
+-- Help menu
+ [ID.ABOUT] = "F1",
+-- Watch window menu items
+ [ID.ADDWATCH] = "Ins",
+ [ID.EDITWATCH] = "F2",
+ [ID.DELETEWATCH] = "Del",
+-- Editor popup menu items
+ [ID.QUICKADDWATCH] = "",
+ [ID.QUICKEVAL] = "",
+-- Filetree popup menu items
+ [ID.RENAMEFILE] = "F2",
+ [ID.DELETEFILE] = "Del",
+}
+
+function KSC(id, default)
+ -- this is only for the rare case of someone assigning a complete list
+ -- to ide.config.keymap.
+ local keymap = ide.config.keymap
+ return (keymap[id] and "\t"..keymap[id]) or (default and "\t"..default) or ""
+end
+
+ide.config.editor.keymap = {
+ -- key, modifier, command, os: http://www.scintilla.org/ScintillaDoc.html#KeyboardCommands
+ -- Cmd+Left/Right moves to start/end of line
+ {wxstc.wxSTC_KEY_LEFT, wxstc.wxSTC_SCMOD_CTRL, wxstc.wxSTC_CMD_HOME, "Macintosh"},
+ {wxstc.wxSTC_KEY_RIGHT, wxstc.wxSTC_SCMOD_CTRL, wxstc.wxSTC_CMD_LINEEND, "Macintosh"},
+ -- Cmd+Shift+Left/Right selects to the beginning/end of the line
+ {wxstc.wxSTC_KEY_LEFT, wxstc.wxSTC_SCMOD_CTRL+wxstc.wxSTC_SCMOD_SHIFT, wxstc.wxSTC_CMD_HOMEEXTEND, "Macintosh"},
+ {wxstc.wxSTC_KEY_RIGHT, wxstc.wxSTC_SCMOD_CTRL+wxstc.wxSTC_SCMOD_SHIFT, wxstc.wxSTC_CMD_LINEENDEXTEND, "Macintosh"},
+ -- Cmd+Shift+Up/Down selects to the beginning/end of the text
+ {wxstc.wxSTC_KEY_UP, wxstc.wxSTC_SCMOD_CTRL+wxstc.wxSTC_SCMOD_SHIFT, wxstc.wxSTC_CMD_LINEUPEXTEND, "Macintosh"},
+ {wxstc.wxSTC_KEY_DOWN, wxstc.wxSTC_SCMOD_CTRL+wxstc.wxSTC_SCMOD_SHIFT, wxstc.wxSTC_CMD_LINEDOWNEXTEND, "Macintosh"},
+ -- Opt+Left/Right moves one word left (to the beginning)/right (to the end)
+ {wxstc.wxSTC_KEY_LEFT, wxstc.wxSTC_SCMOD_ALT, wxstc.wxSTC_CMD_WORDLEFT, "Macintosh"},
+ {wxstc.wxSTC_KEY_RIGHT, wxstc.wxSTC_SCMOD_ALT, wxstc.wxSTC_CMD_WORDRIGHTEND, "Macintosh"},
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/markers.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/markers.lua
new file mode 100644
index 0000000..0708f4c
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/markers.lua
@@ -0,0 +1,247 @@
+-- Copyright 2015 Paul Kulchenko, ZeroBrane LLC
+
+local ide = ide
+ide.markers = {
+ markersCtrl = nil,
+ imglist = ide:CreateImageList("MARKERS", "FILE-NORMAL", "DEBUG-BREAKPOINT-TOGGLE", "BOOKMARK-TOGGLE"),
+ needrefresh = {},
+ settings = {markers = {}},
+}
+
+local unpack = table.unpack or unpack
+local markers = ide.markers
+local caches = {}
+local image = { FILE = 0, BREAKPOINT = 1, BOOKMARK = 2 }
+local markertypes = {breakpoint = 0, bookmark = 0}
+local maskall = 0
+for markertype in pairs(markertypes) do
+ markertypes[markertype] = 2^ide:GetMarker(markertype)
+ maskall = maskall + markertypes[markertype]
+end
+
+local function resetMarkersTimer()
+ if ide.config.markersinactivity then
+ ide.timers.markers:Start(ide.config.markersinactivity*1000, wx.wxTIMER_ONE_SHOT)
+ end
+end
+
+local function needRefresh(editor)
+ ide.markers.needrefresh[editor] = true
+ resetMarkersTimer()
+end
+
+local function getMarkers(editor)
+ local edmarkers = {}
+ local line = editor:MarkerNext(0, maskall)
+ while line > -1 do
+ local markerval = editor:MarkerGet(line)
+ for markertype, val in pairs(markertypes) do
+ if bit.band(markerval, val) > 0 then
+ table.insert(edmarkers, {line, markertype})
+ end
+ end
+ line = editor:MarkerNext(line + 1, maskall)
+ end
+ return edmarkers
+end
+
+local function markersRefresh()
+ local ctrl = ide.markers.markersCtrl
+ local win = ide:GetMainFrame():FindFocus()
+ ctrl:Freeze()
+
+ for editor in pairs(ide.markers.needrefresh) do
+ local cache = caches[editor]
+ if cache then
+ local fileitem = cache.fileitem
+ if not fileitem then
+ local filename = ide:GetDocument(editor):GetTabText()
+ local root = ctrl:GetRootItem()
+ if not root or not root:IsOk() then return end
+ fileitem = ctrl:AppendItem(root, filename, image.FILE)
+ ctrl:SortChildren(root)
+ cache.fileitem = fileitem
+ end
+
+ -- disabling event handlers is not strictly necessary, but it's expected
+ -- to fix a crash on Windows that had DeleteChildren in the trace (#442).
+ ctrl:SetEvtHandlerEnabled(false)
+ ctrl:DeleteChildren(fileitem)
+ ctrl:SetEvtHandlerEnabled(true)
+
+ for _, edmarker in ipairs(getMarkers(editor)) do
+ local line, markertype = unpack(edmarker)
+ local text = ("%d: %s"):format(line+1, FixUTF8(editor:GetLineDyn(line)))
+ ctrl:AppendItem(fileitem, text:gsub("[\r\n]+$",""), image[markertype:upper()])
+ end
+
+ -- if no markers added, then remove the file from the markers list
+ ctrl:Expand(fileitem)
+ if not ctrl:ItemHasChildren(fileitem) then
+ ctrl:Delete(fileitem)
+ cache.fileitem = nil
+ end
+ end
+ end
+
+ ctrl:Thaw()
+ if win and win ~= ide:GetMainFrame():FindFocus() then win:SetFocus() end
+end
+
+local function item2editor(item_id)
+ for editor, cache in pairs(caches) do
+ if cache.fileitem and cache.fileitem:GetValue() == item_id:GetValue() then return editor end
+ end
+end
+
+local function createMarkersWindow()
+ local width, height = 360, 200
+ local ctrl = wx.wxTreeCtrl(ide.frame, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxSize(width, height),
+ wx.wxTR_LINES_AT_ROOT + wx.wxTR_HAS_BUTTONS + wx.wxTR_HIDE_ROOT + wx.wxNO_BORDER)
+
+ markers.markersCtrl = ctrl
+ ide.timers.markers = wx.wxTimer(ctrl)
+
+ ctrl:AddRoot("Markers")
+ ctrl:SetImageList(markers.imglist)
+ ctrl:SetFont(ide.font.fNormal)
+
+ function ctrl:ActivateItem(item_id, toggle)
+ local itemimage = ctrl:GetItemImage(item_id)
+ if itemimage == image.FILE then
+ -- activate editor tab
+ local editor = item2editor(item_id)
+ if editor then ide:GetDocument(editor):SetActive() end
+ else -- clicked on the marker item
+ local parent = ctrl:GetItemParent(item_id)
+ if parent:IsOk() and ctrl:GetItemImage(parent) == image.FILE then
+ local editor = item2editor(parent)
+ if editor then
+ local line = tonumber(ctrl:GetItemText(item_id):match("^(%d+):"))
+ if line then
+ if toggle then
+ local _ = (itemimage == image.BOOKMARK and editor:BookmarkToggle(line-1, false)
+ or itemimage == image.BREAKPOINT and editor:BreakpointToggle(line-1, false))
+ ctrl:Delete(item_id)
+ return -- don't activate the editor when the breakpoint is toggled
+ end
+ editor:GotoLine(line-1)
+ end
+ ide:GetDocument(editor):SetActive()
+ end
+ end
+ end
+ end
+
+ local function activateByPosition(event)
+ local mask = (wx.wxTREE_HITTEST_ONITEMINDENT + wx.wxTREE_HITTEST_ONITEMLABEL
+ + wx.wxTREE_HITTEST_ONITEMICON + wx.wxTREE_HITTEST_ONITEMRIGHT)
+ local item_id, flags = ctrl:HitTest(event:GetPosition())
+
+ if item_id and item_id:IsOk() and bit.band(flags, mask) > 0 then
+ ctrl:ActivateItem(item_id, bit.band(flags, wx.wxTREE_HITTEST_ONITEMICON) > 0)
+ else
+ event:Skip()
+ end
+ return true
+ end
+
+ ctrl:Connect(wx.wxEVT_TIMER, function() markersRefresh() end)
+ ctrl:Connect(wx.wxEVT_LEFT_DOWN, activateByPosition)
+ ctrl:Connect(wx.wxEVT_LEFT_DCLICK, activateByPosition)
+ ctrl:Connect(wx.wxEVT_COMMAND_TREE_ITEM_ACTIVATED, function(event)
+ ctrl:ActivateItem(event:GetItem())
+ end)
+
+ ctrl:Connect(wx.wxEVT_COMMAND_TREE_ITEM_MENU,
+ function (event)
+ local item_id = event:GetItem()
+ local ID_BOOKMARKTOGGLE = ID("markers.bookmarktoggle")
+ local ID_BREAKPOINTTOGGLE = ID("markers.breakpointtoggle")
+ local menu = wx.wxMenu {
+ { ID_BOOKMARKTOGGLE, TR("Toggle Bookmark"), TR("Toggle bookmark") },
+ { ID_BREAKPOINTTOGGLE, TR("Toggle Breakpoint"), TR("Toggle breakpoint") },
+ }
+ local activate = function() ctrl:ActivateItem(item_id, true) end
+ menu:Enable(ID_BOOKMARKTOGGLE, ctrl:GetItemImage(item_id) == image.BOOKMARK)
+ menu:Connect(ID_BOOKMARKTOGGLE, wx.wxEVT_COMMAND_MENU_SELECTED, activate)
+
+ menu:Enable(ID_BREAKPOINTTOGGLE, ctrl:GetItemImage(item_id) == image.BREAKPOINT)
+ menu:Connect(ID_BREAKPOINTTOGGLE, wx.wxEVT_COMMAND_MENU_SELECTED, activate)
+
+ PackageEventHandle("onMenuMarkers", menu, ctrl, event)
+
+ ctrl:PopupMenu(menu)
+ end)
+
+ local function reconfigure(pane)
+ pane:TopDockable(false):BottomDockable(false)
+ :MinSize(150,-1):BestSize(300,-1):FloatingSize(200,300)
+ end
+
+ local layout = ide:GetSetting("/view", "uimgrlayout")
+ if not layout or not layout:find("markerspanel") then
+ ide:AddPanelDocked(ide:GetOutputNotebook(), ctrl, "markerspanel", TR("Markers"), reconfigure, false)
+ else
+ ide:AddPanel(ctrl, "markerspanel", TR("Markers"), reconfigure)
+ end
+end
+
+createMarkersWindow()
+
+local package = ide:AddPackage('core.markers', {
+ -- save markers; remove tab from the list
+ onEditorClose = function(self, editor)
+ local cache = caches[editor]
+ if not cache then return end
+ if cache.fileitem then markers.markersCtrl:Delete(cache.fileitem) end
+ caches[editor] = nil
+ end,
+
+ -- schedule marker update if the change is for one of the editors with markers
+ onEditorUpdateUI = function(self, editor, event)
+ if not caches[editor] then return end
+ if bit.band(event:GetUpdated(), wxstc.wxSTC_UPDATE_CONTENT) == 0 then return end
+ needRefresh(editor)
+ end,
+
+ onEditorMarkerUpdate = function(self, editor)
+ -- if no marker, then all markers in a file need to be refreshed
+ if not caches[editor] then caches[editor] = {} end
+ needRefresh(editor)
+ markers:SaveMarkers(editor)
+ end,
+
+ onEditorSave = function(self, editor) markers:SaveMarkers(editor) end,
+ onEditorLoad = function(self, editor) markers:LoadMarkers(editor) end,
+ })
+
+function markers:SaveSettings() package:SetSettings(self.settings) end
+
+function markers:SaveMarkers(editor, force)
+ -- if the file has the name and has not been modified, save the breakpoints
+ -- this also works when the file is saved as the modified flag is already set to `false`
+ local doc = ide:GetDocument(editor)
+ local filepath = doc:GetFilePath()
+ if filepath and (force or not doc:IsModified()) then
+ -- remove it from the list if it has no breakpoints
+ local edmarkers = getMarkers(editor)
+ self.settings.markers[filepath] = #edmarkers > 0 and edmarkers or nil
+ self:SaveSettings()
+ end
+end
+
+function markers:LoadMarkers(editor)
+ local doc = ide:GetDocument(editor)
+ local filepath = doc:GetFilePath()
+ if filepath then
+ for _, edmarker in ipairs(self.settings.markers[filepath] or {}) do
+ local line, markertype = unpack(edmarker)
+ local _ = (markertype == "bookmark" and editor:BookmarkToggle(line, true)
+ or markertype == "breakpoint" and editor:BreakpointToggle(line, true))
+ end
+ end
+end
+
+MergeSettings(markers.settings, package:GetSettings())
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/markup.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/markup.lua
new file mode 100644
index 0000000..420543d
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/markup.lua
@@ -0,0 +1,214 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- styles for comment markup
+---------------------------------------------------------
+
+local MD_MARK_ITAL = '_' -- italic
+local MD_MARK_BOLD = '**' -- bold
+local MD_MARK_LINK = '[' -- link description start
+local MD_MARK_LINZ = ']' -- link description end
+local MD_MARK_LINA = '(' -- link URL start
+local MD_MARK_LINT = ')' -- link URL end
+local MD_MARK_HEAD = '#' -- header
+local MD_MARK_CODE = '`' -- code
+local MD_MARK_BOXD = '|' -- highlight
+local MD_MARK_MARK = ' ' -- separator
+local MD_LINK_NEWWINDOW = '+' -- indicator to open a new window for links
+local markup = {
+ [MD_MARK_BOXD] = {st=ide:AddIndicator("markup.boxd", 25), fg={127,0,127}, b=true},
+ [MD_MARK_CODE] = {st=ide:AddIndicator("markup.code", 26), fg={127,127,127}, fs=10},
+ [MD_MARK_HEAD] = {st=ide:AddIndicator("markup.head", 27), fn="Lucida Console", b=true},
+ [MD_MARK_LINK] = {st=ide:AddIndicator("markup.link", 28), u=true, hs={32,32,127}},
+ [MD_MARK_BOLD] = {st=ide:AddIndicator("markup.bold", 29), b=true},
+ [MD_MARK_ITAL] = {st=ide:AddIndicator("markup.ital", 30), i=true},
+ [MD_MARK_MARK] = {st=ide:AddIndicator("markup.mark", 31), v=false},
+}
+
+-- allow other editor features to recognize this special markup
+function MarkupIsSpecial(style) return style == 31 end
+function MarkupIsAny(style) return style >= 25 and style <= 31 end
+function MarkupAddStyles(styles)
+ local comment = styles.comment or {}
+ for key,value in pairs(markup) do
+ local style = styles[key] or {}
+ -- copy all style features by value
+ for feature in pairs(value) do
+ style[feature] = style[feature] or value[feature]
+ end
+ style.fg = style.fg or comment.fg
+ style.bg = style.bg or comment.bg
+ styles[key] = style
+ end
+end
+
+local q = EscapeMagic
+
+local MD_MARK_PTRN = '' -- combination of all markup marks that can start styling
+for key in pairs(markup) do
+ if key ~= MD_MARK_MARK then MD_MARK_PTRN = MD_MARK_PTRN .. q(key) end
+end
+MarkupAddStyles(ide.config.styles)
+
+function MarkupHotspotClick(pos, editor)
+ -- check if this is "our" hotspot event
+ if bit.band(editor:GetStyleAt(pos),31) ~= markup[MD_MARK_LINK].st then
+ -- not "our" style, so nothing to do for us here
+ return
+ end
+ local line = editor:LineFromPosition(pos)
+ local tx = editor:GetLineDyn(line)
+ pos = pos + #MD_MARK_LINK - editor:PositionFromLine(line) -- turn into relative position
+
+ -- extract the URL/command on the right side of the separator
+ local _,_,text = string.find(tx, q(MD_MARK_LINZ).."(%b"..MD_MARK_LINA..MD_MARK_LINT..")", pos)
+ if text then
+ text = text:gsub("^"..q(MD_MARK_LINA), ""):gsub(q(MD_MARK_LINT).."$", "")
+ local doc = ide:GetDocument(editor)
+ local filepath = doc and doc.filePath or FileTreeGetDir()
+ local _,_,http = string.find(text, [[^(https?:%S+)$]])
+ local _,_,command,code = string.find(text, [[^macro:(%w+)%((.*%S)%)$]])
+ if not command then _,_,command = string.find(text, [[^macro:(%w+)$]]) end
+
+ if command == 'shell' then
+ ShellExecuteCode(code)
+ elseif command == 'inline' then
+ ShellExecuteInline(code)
+ elseif command == 'run' then -- run the current file
+ ProjectRun()
+ elseif command == 'debug' then -- debug the current file
+ ProjectDebug()
+ elseif http then -- open the URL in a new browser window
+ wx.wxLaunchDefaultBrowser(http, 0)
+ elseif filepath then -- only check for saved files
+ -- check if requested to open in a new window
+ local newwindow = not doc or string.find(text, MD_LINK_NEWWINDOW, 1, true)
+ if newwindow then text = string.gsub(text, "^%" .. MD_LINK_NEWWINDOW, "") end
+ local filename = GetFullPathIfExists(
+ wx.wxFileName(filepath):GetPath(wx.wxPATH_GET_VOLUME), text)
+ if filename and
+ (newwindow or SaveModifiedDialog(editor, true) ~= wx.wxID_CANCEL) then
+ if not newwindow and ide.osname == 'Macintosh' then editor:GotoPos(0) end
+ LoadFile(filename,not newwindow and editor or nil,true)
+ end
+ end
+ end
+ return true
+end
+
+local function ismarkup (tx)
+ local start = 1
+ local marksep = "[%s!%?%.,;:%(%)]"
+ while true do
+ -- find a separator first
+ local st,_,sep,more = string.find(tx, "(["..MD_MARK_PTRN.."])(.)", start)
+ if not st then return end
+
+ -- check if this is a first character of a multi-character separator
+ if not markup[sep] then sep = sep .. (more or '') end
+
+ local s,e,cap
+ local qsep = q(sep)
+ local nonsep = ("[^%s]"):format(qsep)
+ local nonspace = ("[^%s]"):format(qsep.."%s")
+ if sep == MD_MARK_HEAD then
+ -- always search from the start of the line
+ -- [%w%p] set is needed to avoid continuing this markup to the next line
+ s,e,cap = string.find(tx,"^("..q(MD_MARK_HEAD)..".+[%w%p])")
+ elseif sep == MD_MARK_LINK then
+ -- allow everything based on balanced link separators
+ s,e,cap = string.find(tx,
+ "^(%b"..MD_MARK_LINK..MD_MARK_LINZ
+ .."%b"..MD_MARK_LINA..MD_MARK_LINT..")", st)
+ elseif markup[sep] then
+ -- try 2+ characters between separators first
+ -- if not found, try a single character
+ s,e,cap = string.find(tx,"^("..qsep..nonspace..nonsep.."-"..nonspace..qsep..")", st)
+ if not s then s,e,cap = string.find(tx,"^("..qsep..nonspace..qsep..")", st) end
+ end
+ if s and -- selected markup is surrounded by spaces or punctuation marks
+ (s == 1 or tx:sub(s-1, s-1):match(marksep)) and
+ (e == #tx or tx:sub(e+1, e+1):match(marksep))
+ then return s,e,cap,sep end
+ start = st+1
+ end
+end
+
+function MarkupStyle(editor, lines, linee)
+ local lines = lines or 0
+ if (lines < 0) then return end
+
+ -- if the current spec doesn't have any comments, nothing to style
+ if not next(editor.spec.iscomment) then return end
+
+ -- always style to the end as there may be comments that need re-styling
+ -- technically, this should be GetLineCount()-1, but we want to style
+ -- beyond the last line to make sure it is styled correctly
+ local linec = editor:GetLineCount()
+ local linee = linee or linec
+
+ local linecomment = editor.spec.linecomment
+ local iscomment = {}
+ for i,v in pairs(editor.spec.iscomment) do
+ iscomment[i] = v
+ end
+
+ local es = editor:GetEndStyled()
+ local needfix = false
+
+ for line=lines,linee do
+ local tx = editor:GetLineDyn(line)
+ local ls = editor:PositionFromLine(line)
+
+ local from = 1
+ local off = -1
+
+ -- doing WrapCount(line) when line == linec (which may be beyond
+ -- the last line) occasionally crashes the application on OSX.
+ local wrapped = line < linec and editor:WrapCount(line) or 0
+
+ while from do
+ tx = string.sub(tx,from)
+ local f,t,w,mark = ismarkup(tx)
+
+ if (f) then
+ local p = ls+f+off
+ local s = bit.band(editor:GetStyleAt(p), 31)
+ -- only style comments and only those that are not at the beginning
+ -- of the file to avoid styling shebang (#!) lines
+ -- also ignore matches for line comments (as defined in the spec)
+ if iscomment[s] and p > 0 and mark ~= linecomment then
+ local smark = #mark
+ local emark = #mark -- assumes end mark is the same length as start mark
+ if mark == MD_MARK_HEAD then
+ -- grab multiple MD_MARK_HEAD if present
+ local _,_,full = string.find(w,"^("..q(MD_MARK_HEAD).."+)")
+ smark,emark = #full,0
+ elseif mark == MD_MARK_LINK then
+ local lsep = w:find(q(MD_MARK_LINZ)..q(MD_MARK_LINA))
+ if lsep then emark = #w-lsep+#MD_MARK_LINT end
+ end
+ editor:StartStyling(p, 31)
+ editor:SetStyling(smark, markup[MD_MARK_MARK].st)
+ editor:SetStyling(t-f+1-smark-emark, markup[mark].st or markup[MD_MARK_MARK].st)
+ editor:SetStyling(emark, markup[MD_MARK_MARK].st)
+ end
+
+ off = off + t
+ end
+ from = t and (t+1)
+ end
+
+ -- has this line changed its wrapping because of invisible styling?
+ if wrapped > 1 and editor:WrapCount(line) < wrapped then needfix = true end
+ end
+ editor:StartStyling(es, 31)
+
+ -- if any wrapped lines have changed, then reset WrapMode to fix the drawing
+ if needfix then
+ -- this fixes an issue with duplicate lines in Scintilla when
+ -- invisible styles hide some of the content that would be wrapped.
+ local wrapmode = editor:GetWrapMode()
+ if wrapmode ~= wxstc.wxSTC_WRAP_NONE then editor:SetWrapMode(wrapmode) end
+ -- if some of the lines have folded, this can make not styled lines visible
+ MarkupStyle(editor, linee+1) -- style to the end in this case
+ end
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_edit.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_edit.lua
new file mode 100644
index 0000000..d095f6e
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_edit.lua
@@ -0,0 +1,390 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Lomtik Software (J. Winwood & John Labenski)
+-- Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+
+-- ---------------------------------------------------------------------------
+-- Create the Edit menu and attach the callback functions
+
+local frame = ide.frame
+local menuBar = frame.menuBar
+
+local editMenu = wx.wxMenu {
+ { ID_CUT, TR("Cu&t")..KSC(ID_CUT), TR("Cut selected text to clipboard") },
+ { ID_COPY, TR("&Copy")..KSC(ID_COPY), TR("Copy selected text to clipboard") },
+ { ID_PASTE, TR("&Paste")..KSC(ID_PASTE), TR("Paste text from the clipboard") },
+ { ID_SELECTALL, TR("Select &All")..KSC(ID_SELECTALL), TR("Select all text in the editor") },
+ { },
+ { ID_UNDO, TR("&Undo")..KSC(ID_UNDO), TR("Undo last edit") },
+ { ID_REDO, TR("&Redo")..KSC(ID_REDO), TR("Redo last edit undone") },
+ { },
+ { ID_SHOWTOOLTIP, TR("Show &Tooltip")..KSC(ID_SHOWTOOLTIP), TR("Show tooltip for current position; place cursor after opening bracket of function") },
+ { ID_AUTOCOMPLETE, TR("Complete &Identifier")..KSC(ID_AUTOCOMPLETE), TR("Complete the current identifier") },
+ { ID_AUTOCOMPLETEENABLE, TR("Auto Complete Identifiers")..KSC(ID_AUTOCOMPLETEENABLE), TR("Auto complete while typing"), wx.wxITEM_CHECK },
+ { },
+}
+
+editMenu:Append(ID_SOURCE, TR("Source"), wx.wxMenu {
+ { ID_COMMENT, TR("C&omment/Uncomment")..KSC(ID_COMMENT), TR("Comment or uncomment current or selected lines") },
+ { ID_REINDENT, TR("Correct &Indentation")..KSC(ID_REINDENT), TR("Re-indent selected lines") },
+ { ID_FOLD, TR("&Fold/Unfold All")..KSC(ID_FOLD), TR("Fold or unfold all code folds") },
+ { ID_SORT, TR("&Sort")..KSC(ID_SORT), TR("Sort selected lines") },
+})
+editMenu:Append(ID_BOOKMARK, TR("Bookmark"), wx.wxMenu {
+ { ID_BOOKMARKTOGGLE, TR("Toggle Bookmark")..KSC(ID_BOOKMARKTOGGLE), TR("Toggle bookmark") },
+ { ID_BOOKMARKNEXT, TR("Go To Next Bookmark")..KSC(ID_BOOKMARKNEXT) },
+ { ID_BOOKMARKPREV, TR("Go To Previous Bookmark")..KSC(ID_BOOKMARKPREV) },
+})
+editMenu:AppendSeparator()
+editMenu:Append(ID_PREFERENCES, TR("Preferences"), wx.wxMenu {
+ { ID_PREFERENCESSYSTEM, TR("Settings: System")..KSC(ID_PREFERENCESSYSTEM) },
+ { ID_PREFERENCESUSER, TR("Settings: User")..KSC(ID_PREFERENCESUSER) },
+})
+menuBar:Append(editMenu, TR("&Edit"))
+
+editMenu:Check(ID_AUTOCOMPLETEENABLE, ide.config.autocomplete)
+
+local function getCtrlWithFocus(edType)
+ local ctrl = ide:GetMainFrame():FindFocus()
+ return ctrl and ctrl:GetClassInfo():GetClassName() == edType and ctrl:DynamicCast(edType) or nil
+end
+
+local function onUpdateUIEditorInFocus(event)
+ event:Enable(GetEditorWithFocus(GetEditor()) ~= nil)
+end
+
+local function onUpdateUIEditMenu(event)
+ local menu_id = event:GetId()
+ local editor = GetEditorWithFocus()
+ if editor == nil then
+ local editor = getCtrlWithFocus("wxTextCtrl")
+ event:Enable(editor and (
+ menu_id == ID_PASTE and editor:CanPaste() or
+ menu_id == ID_UNDO and editor:CanUndo() or
+ menu_id == ID_REDO and editor:CanRedo() or
+ menu_id == ID_CUT and editor:CanCut() or
+ menu_id == ID_COPY and editor:CanCopy() or
+ menu_id == ID_SELECTALL and true
+ ) or false)
+ return
+ end
+
+ local alwaysOn = {
+ [ID_SELECTALL] = true,
+ -- allow Cut and Copy commands as these work on a line if no selection
+ [ID_COPY] = true, [ID_CUT] = true,
+ }
+ local enable =
+ -- pasting is allowed when the document is not read-only and the selection
+ -- (if any) has no protected text; since pasting handles protected text,
+ -- use GetReadOnly() instead of CanPaste()
+ menu_id == ID_PASTE and (not editor:GetReadOnly()) or
+ menu_id == ID_UNDO and editor:CanUndo() or
+ menu_id == ID_REDO and editor:CanRedo() or
+ alwaysOn[menu_id]
+ event:Enable(enable)
+end
+
+local function onEditMenu(event)
+ local menu_id = event:GetId()
+ local editor = GetEditorWithFocus()
+ if editor == nil then
+ local editor = getCtrlWithFocus("wxTextCtrl")
+ if not editor or not (
+ menu_id == ID_PASTE and editor:Paste() or
+ menu_id == ID_UNDO and editor:Undo() or
+ menu_id == ID_REDO and editor:Redo() or
+ menu_id == ID_CUT and editor:Cut() or
+ menu_id == ID_COPY and editor:Copy() or
+ menu_id == ID_SELECTALL and editor:SetSelection(-1, -1) or
+ true
+ ) then event:Skip() end
+ return
+ end
+
+ if PackageEventHandle("onEditorAction", editor, event) == false then
+ return
+ end
+
+ local copytext
+ if (menu_id == ID_CUT or menu_id == ID_COPY)
+ and ide.wxver >= "2.9.5" and editor:GetSelections() > 1 then
+ local main = editor:GetMainSelection()
+ copytext = editor:GetTextRangeDyn(editor:GetSelectionNStart(main), editor:GetSelectionNEnd(main))
+ for s = 0, editor:GetSelections()-1 do
+ if copytext ~= editor:GetTextRangeDyn(editor:GetSelectionNStart(s), editor:GetSelectionNEnd(s)) then
+ copytext = nil
+ break
+ end
+ end
+ end
+
+ local spos, epos = editor:GetSelectionStart(), editor:GetSelectionEnd()
+ if menu_id == ID_CUT then
+ if spos == epos then editor:LineCopy() else editor:CopyDyn() end
+ if spos == epos then
+ local line = editor:LineFromPosition(spos)
+ spos, epos = editor:PositionFromLine(line), editor:PositionFromLine(line+1)
+ editor:SetSelectionStart(spos)
+ editor:SetSelectionEnd(epos)
+ end
+ if spos ~= epos then editor:ClearAny() end
+ elseif menu_id == ID_COPY then
+ if spos == epos then editor:LineCopy() else editor:CopyDyn() end
+ elseif menu_id == ID_PASTE then
+ -- first clear the text in case there is any hidden markup
+ if spos ~= epos then editor:ClearAny() end
+ editor:PasteDyn()
+ elseif menu_id == ID_SELECTALL then editor:SelectAll()
+ elseif menu_id == ID_UNDO then editor:Undo()
+ elseif menu_id == ID_REDO then editor:Redo()
+ end
+
+ if copytext then editor:CopyText(#copytext, copytext) end
+end
+
+for _, event in pairs({ID_CUT, ID_COPY, ID_PASTE, ID_SELECTALL, ID_UNDO, ID_REDO}) do
+ frame:Connect(event, wx.wxEVT_COMMAND_MENU_SELECTED, onEditMenu)
+ frame:Connect(event, wx.wxEVT_UPDATE_UI, onUpdateUIEditMenu)
+end
+
+for _, event in pairs({
+ ID_BOOKMARKTOGGLE, ID_BOOKMARKNEXT, ID_BOOKMARKPREV,
+ ID_AUTOCOMPLETE, ID_SORT, ID_REINDENT, ID_SHOWTOOLTIP,
+}) do
+ frame:Connect(event, wx.wxEVT_UPDATE_UI, onUpdateUIEditorInFocus)
+end
+
+frame:Connect(ID_COMMENT, wx.wxEVT_UPDATE_UI,
+ function(event)
+ local editor = GetEditorWithFocus(GetEditor())
+ event:Enable(editor ~= nil
+ and ide:IsValidProperty(editor, "spec") and editor.spec
+ and editor.spec.linecomment and true or false)
+ end)
+
+local function generateConfigMessage(type)
+ return ([==[--[[--
+ Use this file to specify **%s** preferences.
+ Review [examples](+%s) or check [online documentation](%s) for details.
+--]]--
+]==])
+ :format(type, MergeFullPath(ide.editorFilename, "../cfg/user-sample.lua"),
+ "http://studio.zerobrane.com/documentation.html")
+end
+
+frame:Connect(ID_PREFERENCESSYSTEM, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function ()
+ local editor = LoadFile(ide.configs.system)
+ if editor and editor:GetLength() == 0 then
+ editor:AddTextDyn(generateConfigMessage("System")) end
+ end)
+
+frame:Connect(ID_PREFERENCESUSER, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function ()
+ local editor = LoadFile(ide.configs.user)
+ if editor and editor:GetLength() == 0 then
+ editor:AddTextDyn(generateConfigMessage("User")) end
+ end)
+frame:Connect(ID_PREFERENCESUSER, wx.wxEVT_UPDATE_UI,
+ function (event) event:Enable(ide.configs.user ~= nil) end)
+
+frame:Connect(ID_CLEARDYNAMICWORDS, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function () DynamicWordsReset() end)
+
+frame:Connect(ID_SHOWTOOLTIP, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ local editor = GetEditor()
+
+ if (editor:CallTipActive()) then
+ editor:CallTipCancel()
+ return
+ end
+
+ EditorCallTip(editor, editor:GetCurrentPos())
+ end)
+
+frame:Connect(ID_AUTOCOMPLETE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event) EditorAutoComplete(GetEditor()) end)
+
+frame:Connect(ID_AUTOCOMPLETEENABLE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event) ide.config.autocomplete = event:IsChecked() end)
+
+frame:Connect(ID_COMMENT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ local editor = GetEditor()
+ local lc = editor.spec.linecomment
+ if not lc then return end
+
+ -- for multi-line selection, always start the first line at the beginning
+ local ssel, esel = editor:GetSelectionStart(), editor:GetSelectionEnd()
+ local sline = editor:LineFromPosition(ssel)
+ local eline = editor:LineFromPosition(esel)
+ local sel = ssel ~= esel
+ local rect = editor:SelectionIsRectangle()
+ local qlc = lc:gsub(".", "%%%1")
+
+ -- figure out how to toggle comments; if there is at least one non-empty
+ -- line that doesn't start with a comment, need to comment
+ local comment = false
+ for line = sline, eline do
+ local pos = sel and (sline == eline or rect)
+ and ssel-editor:PositionFromLine(sline)+1 or 1
+ local text = editor:GetLineDyn(line)
+ local _, cpos = text:find("^%s*"..qlc, pos)
+ if not cpos and text:find("%S")
+ -- ignore last line when the end of selection is at the first position
+ and (line == sline or line < eline or esel-editor:PositionFromLine(line) > 0) then
+ comment = true
+ break
+ end
+ end
+
+ editor:BeginUndoAction()
+ -- go last to first as selection positions we captured may be affected
+ -- by text changes
+ for line = eline, sline, -1 do
+ local pos = sel and (sline == eline or rect) and ssel-editor:PositionFromLine(sline)+1 or 1
+ local text = editor:GetLineDyn(line)
+ local validline = (line == sline or line < eline or esel-editor:PositionFromLine(line) > 0)
+ local _, cpos = text:find("^%s*"..qlc, pos)
+ if not comment and cpos and validline then
+ editor:DeleteRange(cpos-#lc+editor:PositionFromLine(line), #lc)
+ elseif comment and text:find("%S") and validline then
+ editor:SetTargetStart(pos+editor:PositionFromLine(line)-1)
+ editor:SetTargetEnd(editor:GetTargetStart())
+ editor:ReplaceTarget(lc)
+ end
+ end
+ editor:EndUndoAction()
+ end)
+
+local function processSelection(editor, func)
+ local text = editor:GetSelectedText()
+ local line = editor:GetCurrentLine()
+ local posinline = editor:GetCurrentPos() - editor:PositionFromLine(line)
+ if #text == 0 then
+ editor:SelectAll()
+ text = editor:GetSelectedText()
+ end
+ local wholeline = text:find("\n$")
+ local buf = {}
+ for line in string.gmatch(text..(wholeline and "" or "\n"), "(.-\r?\n)") do
+ table.insert(buf, line)
+ end
+ if #buf > 0 then
+ if func then func(buf) end
+ -- add new line at the end if it was there
+ local newtext = table.concat(buf, ""):gsub("(\r?\n)$", wholeline and "%1" or "")
+ -- straightforward editor:ReplaceSelection() doesn't work reliably as
+ -- it sometimes doubles the context when the entire file is selected.
+ -- this seems like Scintilla issue, so use ReplaceTarget instead.
+ -- Since this doesn't work with rectangular selection, which
+ -- ReplaceSelection should handle (after wxwidgets 3.x upgrade), this
+ -- will need to be revisited when ReplaceSelection is updated.
+ if newtext ~= text then
+ editor:BeginUndoAction()
+ -- if there is at least one marker, then use a different mechanism to preserve them
+ -- simply saving markers, replacing text, and reapplying markers doesn't work as
+ -- they get reset after `undo/redo` operations.
+ local ssel, esel = editor:GetSelectionStart(), editor:GetSelectionEnd()
+ local sline = editor:LineFromPosition(ssel)
+ local eline = editor:LineFromPosition(esel)
+ if #editor:MarkerGetAll(nil, sline, eline) > 0 then
+ for line = #buf, 1, -1 do
+ editor:SetTargetStart(line == 1 and ssel or editor:PositionFromLine(sline+line-1))
+ editor:SetTargetEnd(line == eline-sline+1 and esel or editor:GetLineEndPosition(sline+line-1))
+ editor:ReplaceTarget((buf[line]:gsub("\r?\n$", "")))
+ end
+ else
+ editor:TargetFromSelection()
+ editor:ReplaceTarget(newtext)
+ end
+ editor:EndUndoAction()
+ end
+ end
+ editor:GotoPosEnforcePolicy(math.min(
+ editor:PositionFromLine(line)+posinline, editor:GetLineEndPosition(line)))
+end
+
+frame:Connect(ID_SORT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event) processSelection(GetEditor(), table.sort) end)
+
+local function reIndent(editor, buf)
+ local decindent, incindent = editor.spec.isdecindent, editor.spec.isincindent
+ if not (decindent and incindent) then return end
+
+ local edline = editor:LineFromPosition(editor:GetSelectionStart())
+ local indent = 0
+ local text = ""
+ -- find the last non-empty line in the previous block (if any)
+ for n = edline-1, 1, -1 do
+ indent = editor:GetLineIndentation(n)
+ text = editor:GetLineDyn(n)
+ if text:match("[^\r\n]") then break end
+ end
+
+ local ut = editor:GetUseTabs()
+ local tw = ut and editor:GetTabWidth() or editor:GetIndent()
+
+ local indents = {}
+ local isstatic = {}
+ for line = 1, #buf+1 do
+ local ls = editor:PositionFromLine(edline+line-1)
+ local style = bit.band(editor:GetStyleAt(ls), 31)
+ -- don't reformat multi-line comments or strings
+ isstatic[line] = (editor.spec.iscomment[style]
+ or editor.spec.isstring[style]
+ or (MarkupIsAny and MarkupIsAny(style)))
+ if not isstatic[line] or line == 1 or not isstatic[line-1] then
+ local closed, blockend = decindent(text)
+ local opened = incindent(text)
+
+ -- ignore impact from initial block endings as they are already indented
+ if line == 1 then blockend = 0 end
+
+ -- this only needs to be done for 2, #buf+1; do it and get out when done
+ if line > 1 then indents[line-1] = indents[line-1] - tw * closed end
+ if line > #buf then break end
+
+ indent = indent + tw * (opened - blockend)
+ if indent < 0 then indent = 0 end
+ end
+
+ indents[line] = indent
+ text = buf[line]
+ end
+
+ for line = 1, #buf do
+ if not isstatic[line] then
+ buf[line] = buf[line]:gsub("^[ \t]*",
+ not buf[line]:match("%S") and ""
+ or ut and ("\t"):rep(indents[line] / tw) or (" "):rep(indents[line]))
+ end
+ end
+end
+
+frame:Connect(ID_REINDENT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ local editor = GetEditor()
+ processSelection(editor, function(buf) reIndent(editor, buf) end)
+ end)
+
+frame:Connect(ID_FOLD, wx.wxEVT_UPDATE_UI,
+ function(event)
+ local editor = GetEditorWithFocus()
+ event:Enable(editor and editor:CanFold() or false)
+ end)
+frame:Connect(ID_FOLD, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event) GetEditorWithFocus():FoldSome() end)
+
+local BOOKMARK_MARKER = StylesGetMarker("bookmark")
+
+frame:Connect(ID_BOOKMARKTOGGLE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() GetEditor():BookmarkToggle() end)
+frame:Connect(ID_BOOKMARKNEXT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() GetEditor():MarkerGotoNext(BOOKMARK_MARKER) end)
+frame:Connect(ID_BOOKMARKPREV, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() GetEditor():MarkerGotoPrev(BOOKMARK_MARKER) end)
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_file.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_file.lua
new file mode 100644
index 0000000..d9e7c68
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_file.lua
@@ -0,0 +1,262 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Lomtik Software (J. Winwood & John Labenski)
+-- Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+local frame = ide.frame
+local menuBar = frame.menuBar
+local openDocuments = ide.openDocuments
+
+local fileMenu = wx.wxMenu({
+ { ID_NEW, TR("&New")..KSC(ID_NEW), TR("Create an empty document") },
+ { ID_OPEN, TR("&Open...")..KSC(ID_OPEN), TR("Open an existing document") },
+ { ID_CLOSE, TR("&Close Page")..KSC(ID_CLOSE), TR("Close the current editor window") },
+ { },
+ { ID_SAVE, TR("&Save")..KSC(ID_SAVE), TR("Save the current document") },
+ { ID_SAVEAS, TR("Save &As...")..KSC(ID_SAVEAS), TR("Save the current document to a file with a new name") },
+ { ID_SAVEALL, TR("Save A&ll")..KSC(ID_SAVEALL), TR("Save all open documents") },
+ { },
+ { ID_RECENTFILES, TR("Recent Files")..KSC(ID_RECENTFILES), TR("File history") },
+ { ID_RECENTPROJECTS, TR("Recent Projects")..KSC(ID_RECENTPROJECTS), TR("Project history") },
+ { },
+ { ID_EXIT, TR("E&xit")..KSC(ID_EXIT), TR("Exit program") }})
+menuBar:Append(fileMenu, TR("&File"))
+
+local filehistorymenu = wx.wxMenu({
+ { },
+ { ID_RECENTFILESCLEAR, TR("Clear Items")..KSC(ID_RECENTFILESCLEAR), TR("Clear items from this list") },
+})
+local projecthistorymenu = wx.wxMenu({
+ { },
+ { ID_RECENTPROJECTSCLEAR, TR("Clear Items")..KSC(ID_RECENTPROJECTSCLEAR), TR("Clear items from this list") },
+})
+ide:AttachMenu(ID_RECENTFILES, filehistorymenu)
+ide:AttachMenu(ID_RECENTPROJECTS, projecthistorymenu)
+
+do -- recent file history
+ local iscaseinsensitive = wx.wxFileName("A"):SameAs(wx.wxFileName("a"))
+ local function isSameAs(f1, f2)
+ return f1 == f2 or iscaseinsensitive and f1:lower() == f2:lower()
+ end
+
+ local filehistory = {[0] = 1}
+
+ -- add file to the file history removing duplicates
+ local function addFileHistory(filename)
+ -- a new (empty) tab is opened; don't change the history
+ if not filename then return end
+
+ local fn = wx.wxFileName(filename)
+ if fn:Normalize() then filename = fn:GetFullPath() end
+
+ local index = filehistory[0]
+
+ -- special case: selecting the current file (or moving through the history)
+ if filehistory[index] and isSameAs(filename, filehistory[index].filename) then return end
+
+ -- something else is selected
+ -- (1) flip the history from 1 to the current index
+ for i = 1, math.floor(index/2) do
+ filehistory[i], filehistory[index-i+1] = filehistory[index-i+1], filehistory[i]
+ end
+
+ -- (2) if the file is in the history, remove it
+ for i = #filehistory, 1, -1 do
+ if isSameAs(filename, filehistory[i].filename) then
+ table.remove(filehistory, i)
+ end
+ end
+
+ -- (3) add the file to the top and update the index
+ table.insert(filehistory, 1, {filename=filename})
+ filehistory[0] = 1
+
+ -- (4) remove all entries that are no longer needed
+ while #filehistory>ide.config.filehistorylength do table.remove(filehistory) end
+ end
+
+ local function remFileHistory(filename)
+ if not filename then return end
+
+ local fn = wx.wxFileName(filename)
+ if fn:Normalize() then filename = fn:GetFullPath() end
+
+ local index = filehistory[0]
+
+ -- special case: removing the current file
+ if filehistory[index] and isSameAs(filename, filehistory[index].filename) then
+ -- (1) flip the history from 1 to the current index
+ for i = 1, math.floor(index/2) do
+ filehistory[i], filehistory[index-i+1] = filehistory[index-i+1], filehistory[i]
+ end
+ end
+
+ -- (2) if the file is in the history, remove it
+ for i = #filehistory, 1, -1 do
+ if isSameAs(filename, filehistory[i].filename) then
+ table.remove(filehistory, i)
+ end
+ end
+
+ -- (3) update index
+ filehistory[0] = 1
+ end
+
+ local updateRecentFiles -- need forward declaration because of recursive refs
+
+ local function loadRecent(event)
+ local id = event:GetId()
+ local item = filehistorymenu:FindItem(id)
+ local filename = item:GetLabel()
+ local index = filehistory[0]
+ filehistory[0] = (
+ (index > 1 and id == ID("file.recentfiles."..(index-1)) and index-1) or
+ (index < #filehistory) and id == ID("file.recentfiles."..(index+1)) and index+1 or
+ 1)
+ if not LoadFile(filename, nil, true) then
+ wx.wxMessageBox(
+ TR("File '%s' no longer exists."):format(filename),
+ GetIDEString("editormessage"),
+ wx.wxOK + wx.wxCENTRE, ide.frame)
+ remFileHistory(filename)
+ updateRecentFiles(filehistory)
+ end
+ end
+
+ local items = 0
+ updateRecentFiles = function (list)
+ -- protect against recent files menu not being present
+ if not ide:FindMenuItem(ID_RECENTFILES) then return end
+
+ for i=1, #list do
+ local file = list[i].filename
+ local id = ID("file.recentfiles."..i)
+ local label = file..(
+ i == list[0]-1 and KSC(ID_RECENTFILESNEXT) or
+ i == list[0]+1 and KSC(ID_RECENTFILESPREV) or
+ "")
+ if i <= items then -- this is an existing item; update the label
+ filehistorymenu:FindItem(id):SetItemLabel(label)
+ else -- need to add an item
+ local item = wx.wxMenuItem(filehistorymenu, id, label, "")
+ filehistorymenu:Insert(i-1, item)
+ frame:Connect(id, wx.wxEVT_COMMAND_MENU_SELECTED, loadRecent)
+ end
+ end
+ for i=items, #list+1, -1 do -- delete the rest if the list got shorter
+ filehistorymenu:Delete(filehistorymenu:FindItemByPosition(i-1))
+ end
+ items = #list -- update the number of items for the next refresh
+
+ -- enable if there are any recent files
+ fileMenu:Enable(ID_RECENTFILES, #list > 0)
+ end
+
+ -- public methods
+ function GetFileHistory() return filehistory end
+ function SetFileHistory(fh)
+ filehistory = fh
+ filehistory[0] = 1
+ updateRecentFiles(filehistory)
+ end
+ function AddToFileHistory(filename)
+ addFileHistory(filename)
+ updateRecentFiles(filehistory)
+ end
+
+ function FileRecentListUpdate(menu)
+ local list = filehistory
+ for i=#list, 1, -1 do
+ local id = ID("file.recentfiles."..i)
+ local label = list[i].filename
+ local item = wx.wxMenuItem(menu, id, label, "")
+ menu:Insert(0, item)
+ ide.frame:Connect(id, wx.wxEVT_COMMAND_MENU_SELECTED, loadRecent)
+ end
+ end
+end
+
+frame:Connect(ID_NEW, wx.wxEVT_COMMAND_MENU_SELECTED, function() return NewFile() end)
+frame:Connect(ID_OPEN, wx.wxEVT_COMMAND_MENU_SELECTED, OpenFile)
+frame:Connect(ID_SAVE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function ()
+ local editor = ide.findReplace:CanSave(GetEditorWithFocus()) or GetEditor()
+ local doc = ide:GetDocument(editor)
+ SaveFile(editor, doc and doc:GetFilePath() or nil)
+ end)
+frame:Connect(ID_SAVE, wx.wxEVT_UPDATE_UI,
+ function (event)
+ local doc = ide:GetDocument(GetEditor())
+ event:Enable(ide.findReplace:CanSave(GetEditorWithFocus()) and true
+ or doc and (doc:IsModified() or doc:IsNew()) or false)
+ end)
+
+frame:Connect(ID_SAVEAS, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function ()
+ SaveFileAs(GetEditor())
+ end)
+frame:Connect(ID_SAVEAS, wx.wxEVT_UPDATE_UI,
+ function (event)
+ event:Enable(GetEditor() ~= nil)
+ end)
+
+frame:Connect(ID_SAVEALL, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ SaveAll()
+ end)
+frame:Connect(ID_SAVEALL, wx.wxEVT_UPDATE_UI,
+ function (event)
+ local atLeastOneModifiedDocument = false
+ for _, document in pairs(openDocuments) do
+ if document.isModified or not document.filePath then
+ atLeastOneModifiedDocument = true
+ break
+ end
+ end
+ event:Enable(atLeastOneModifiedDocument)
+ end)
+
+frame:Connect(ID_CLOSE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ local editor = GetEditorWithFocus()
+ local nb = ide:GetOutputNotebook()
+ local index = editor and nb:GetPageIndex(editor)
+ if index and ide.findReplace:IsPreview(editor) and index >= 0 then
+ nb:DeletePage(index) -- close preview tab
+ else
+ ClosePage() -- this will find the current editor tab
+ end
+ end)
+frame:Connect(ID_CLOSE, wx.wxEVT_UPDATE_UI,
+ function (event)
+ event:Enable(ide.findReplace:IsPreview(GetEditorWithFocus()) or GetEditor() ~= nil)
+ end)
+
+frame:Connect(ID_EXIT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ frame:Close() -- this will trigger wxEVT_CLOSE_WINDOW
+ end)
+
+frame:Connect(ID_RECENTPROJECTSCLEAR, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event) FileTreeProjectListClear() end)
+
+frame:Connect(ID_RECENTFILESCLEAR, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ SetFileHistory({})
+ local ed = ide:GetEditor()
+ if ed then AddToFileHistory(ide:GetDocument(ed):GetFilePath()) end
+ end)
+
+local recentprojects = 0
+frame:Connect(ID_RECENTPROJECTS, wx.wxEVT_UPDATE_UI,
+ function (event)
+ recentprojects = FileTreeProjectListUpdate(projecthistorymenu, recentprojects)
+ if not recentprojects then return end
+ local pos = 1 -- add shortcut for the previous project (if any)
+ if recentprojects > pos then
+ local item = projecthistorymenu:FindItemByPosition(pos)
+ item:SetItemLabel(item:GetItemLabelText()..KSC(ID_RECENTPROJECTSPREV))
+ end
+ event:Enable(recentprojects > 0)
+ end)
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_help.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_help.lua
new file mode 100644
index 0000000..e2f3f2f
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_help.lua
@@ -0,0 +1,118 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+---------------------------------------------------------
+
+local ide = ide
+-- ---------------------------------------------------------------------------
+-- Create the Help menu and attach the callback functions
+
+local frame = ide.frame
+local menuBar = frame.menuBar
+local mobdebug = require "mobdebug"
+
+local product = GetIDEString("help", "zerobranestudio")
+local url = "http://zerobrane.com/r/"..product.."-"
+local urls = {
+ [ID_HELPPROJECT] = "main",
+ [ID_HELPDOCUMENTATION] = "documentation",
+ [ID_HELPGETTINGSTARTED] = "gettingstarted",
+ [ID_HELPTUTORIALS] = "tutorials",
+ [ID_HELPFAQ] = "faq",
+ [ID_HELPCOMMUNITY] = "community",
+}
+
+local helpMenu = wx.wxMenu{
+ { ID_ABOUT, TR("&About")..KSC(ID_ABOUT), TR("About %s"):format(GetIDEString("editor")) },
+ { ID_HELPPROJECT, TR("&Project Page")..KSC(ID_HELPPROJECT) },
+ { ID_HELPDOCUMENTATION, TR("&Documentation")..KSC(ID_HELPDOCUMENTATION) },
+ { ID_HELPGETTINGSTARTED, TR("&Getting Started Guide")..KSC(ID_HELPGETTINGSTARTED) },
+ { ID_HELPTUTORIALS, TR("&Tutorials")..KSC(ID_HELPTUTORIALS) },
+ { ID_HELPFAQ, TR("&Frequently Asked Questions")..KSC(ID_HELPFAQ) },
+ { ID_HELPCOMMUNITY, TR("&Community")..KSC(ID_HELPCOMMUNITY) },
+}
+-- do not translate Help menu on Mac as it won't merge with "standard" menus
+menuBar:Append(helpMenu, ide.osname == 'Macintosh' and "&Help" or TR("&Help"))
+
+local function displayAbout(event)
+ local logo = ide:GetAppName().."/"..GetIDEString("logo")
+ local logoimg = wx.wxFileName(logo):FileExists() and
+ ([[<tr><td><img src="%s"></td></tr>]]):format(logo) or ""
+ local page = ([[
+ <html>
+ <body text="#777777">
+ <table border="0" width="100%%">
+ %s
+ <tr><td>
+ <table cellspacing="3" cellpadding="3" width="100%%">
+ <tr>
+ <td>
+ <b>ZeroBrane Studio (%s; MobDebug %s)</b><br>
+ <b>Copyright &copy; 2011-2015 ZeroBrane LLC</b><br>
+ Paul Kulchenko<br>
+ Licensed under the MIT License.
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <b>Based on Estrela Editor</b><br>
+ <b>Copyright &copy; 2008-2011 Luxinia DevTeam</b><br>
+ Christoph Kubisch, Eike Decker<br>
+ Licensed under the MIT License.
+ </td>
+ <td><img align="right" src="%s/res/estrela.png"></td>
+ </tr>
+ <tr>
+ <td>
+ <b>Based on wxLua editor</b><br>
+ <b>Copyright &copy; 2002-2005 Lomtick Software</b><br>
+ J. Winwood, John Labenski<br>
+ Licensed under wxWindows Library License, v3.
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <b>Built with %s, %s</b>
+ </td>
+ </tr>
+ </table>
+ </td></tr></table>
+ </body>
+ </html>]])
+ :format(logoimg, ide.VERSION, mobdebug._VERSION, ide:GetAppName(),
+ wx.wxVERSION_STRING, wxlua.wxLUA_VERSION_STRING)
+
+ local dlg = wx.wxDialog(frame, wx.wxID_ANY, TR("About %s"):format(GetIDEString("editor")))
+
+ -- this is needed because wxLuaHtmlWindow only seems to take into account
+ -- the initial size, but not the one set with SetSize using
+ -- wxlua 2.8.12.2 and wxwidgets 2.9.5+.
+ local tmp = wx.wxLuaHtmlWindow(dlg, wx.wxID_ANY, wx.wxDefaultPosition, wx.wxSize(450, 260))
+ tmp:SetPage(page)
+ local w = tmp:GetInternalRepresentation():GetWidth()
+ local h = tmp:GetInternalRepresentation():GetHeight()
+ tmp:Destroy()
+
+ local html = wx.wxLuaHtmlWindow(dlg, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxSize(w, h), wx.wxHW_SCROLLBAR_NEVER)
+
+ html:SetBorders(0)
+ html:SetPage(page)
+
+ local line = wx.wxStaticLine(dlg, wx.wxID_ANY)
+ local button = wx.wxButton(dlg, wx.wxID_OK, "OK")
+ button:SetDefault()
+
+ local topsizer = wx.wxBoxSizer(wx.wxVERTICAL)
+ topsizer:Add(html, 1, wx.wxEXPAND + wx.wxALL, 10)
+ topsizer:Add(line, 0, wx.wxEXPAND + wx.wxLEFT + wx.wxRIGHT, 10)
+ topsizer:Add(button, 0, wx.wxALL + wx.wxALIGN_RIGHT, 10)
+
+ dlg:SetSizerAndFit(topsizer)
+ dlg:ShowModal()
+ dlg:Destroy()
+end
+
+frame:Connect(ID_ABOUT, wx.wxEVT_COMMAND_MENU_SELECTED, displayAbout)
+for item, page in pairs(urls) do
+ frame:Connect(item, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() wx.wxLaunchDefaultBrowser(url..page, 0) end)
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_project.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_project.lua
new file mode 100644
index 0000000..22bf8f5
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_project.lua
@@ -0,0 +1,474 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Lomtik Software (J. Winwood & John Labenski)
+-- Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+local frame = ide.frame
+local menuBar = frame.menuBar
+local openDocuments = ide.openDocuments
+local debugger = ide.debugger
+local bottomnotebook = frame.bottomnotebook
+local uimgr = frame.uimgr
+
+------------------------
+-- Interpreters and Menu
+
+local debugTab = {
+ { ID_RUN, TR("&Run")..KSC(ID_RUN), TR("Execute the current project/file") },
+ { ID_RUNNOW, TR("Run As Scratchpad")..KSC(ID_RUNNOW), TR("Execute the current project/file and keep updating the code to see immediate results"), wx.wxITEM_CHECK },
+ { ID_COMPILE, TR("&Compile")..KSC(ID_COMPILE), TR("Compile the current file") },
+ { ID_STARTDEBUG, TR("Start &Debugging")..KSC(ID_STARTDEBUG), TR("Start or continue debugging") },
+ { ID_ATTACHDEBUG, TR("&Start Debugger Server")..KSC(ID_ATTACHDEBUG), TR("Allow external process to start debugging"), wx.wxITEM_CHECK },
+ { },
+ { ID_STOPDEBUG, TR("S&top Debugging")..KSC(ID_STOPDEBUG), TR("Stop the currently running process") },
+ { ID_DETACHDEBUG, TR("Detach &Process")..KSC(ID_DETACHDEBUG), TR("Stop debugging and continue running the process") },
+ { ID_STEP, TR("Step &Into")..KSC(ID_STEP), TR("Step into") },
+ { ID_STEPOVER, TR("Step &Over")..KSC(ID_STEPOVER), TR("Step over") },
+ { ID_STEPOUT, TR("Step O&ut")..KSC(ID_STEPOUT), TR("Step out of the current function") },
+ { ID_RUNTO, TR("Run To Cursor")..KSC(ID_RUNTO), TR("Run to cursor") },
+ { ID_TRACE, TR("Tr&ace")..KSC(ID_TRACE), TR("Trace execution showing each executed line") },
+ { ID_BREAK, TR("&Break")..KSC(ID_BREAK), TR("Break execution at the next executed line of code") },
+ { },
+ { ID_BREAKPOINT, TR("Breakpoint")..KSC(ID_BREAKPOINT) },
+ { },
+ { ID_CLEAROUTPUT, TR("C&lear Output Window")..KSC(ID_CLEAROUTPUT), TR("Clear the output window before compiling or debugging"), wx.wxITEM_CHECK },
+ { ID_COMMANDLINEPARAMETERS, TR("Command Line Parameters...")..KSC(ID_COMMANDLINEPARAMETERS), TR("Provide command line parameters") },
+}
+
+local targetDirMenu = wx.wxMenu{
+ {ID_PROJECTDIRCHOOSE, TR("Choose...")..KSC(ID_PROJECTDIRCHOOSE), TR("Choose a project directory")},
+ {ID_PROJECTDIRFROMFILE, TR("Set From Current File")..KSC(ID_PROJECTDIRFROMFILE), TR("Set project directory from current file")},
+}
+local targetMenu = wx.wxMenu({})
+local debugMenu = wx.wxMenu(debugTab)
+local debugMenuRun = {
+ start=TR("Start &Debugging")..KSC(ID_STARTDEBUG), continue=TR("Co&ntinue")..KSC(ID_STARTDEBUG)}
+local debugMenuStop = {
+ debugging=TR("S&top Debugging")..KSC(ID_STOPDEBUG), process=TR("S&top Process")..KSC(ID_STOPDEBUG)}
+debugMenu:Append(ID_PROJECTDIR, TR("Project Directory"), targetDirMenu, TR("Set the project directory to be used"))
+debugMenu:Append(ID_INTERPRETER, TR("Lua &Interpreter"), targetMenu, TR("Set the interpreter to be used"))
+menuBar:Append(debugMenu, TR("&Project"))
+
+ide:AttachMenu(ID_BREAKPOINT, wx.wxMenu {
+ { ID_BREAKPOINTTOGGLE, TR("Toggle Breakpoint")..KSC(ID_BREAKPOINTTOGGLE) },
+ { ID_BREAKPOINTNEXT, TR("Go To Next Breakpoint")..KSC(ID_BREAKPOINTNEXT) },
+ { ID_BREAKPOINTPREV, TR("Go To Previous Breakpoint")..KSC(ID_BREAKPOINTPREV) },
+})
+
+local interpreters
+local function selectInterpreter(id)
+ for id in pairs(interpreters) do
+ menuBar:Check(id, false)
+ menuBar:Enable(id, true)
+ end
+ menuBar:Check(id, true)
+ menuBar:Enable(id, false)
+
+ local changed = ide.interpreter ~= interpreters[id]
+ if ide.interpreter and changed then
+ PackageEventHandle("onInterpreterClose", ide.interpreter)
+ end
+ if interpreters[id] and changed then
+ PackageEventHandle("onInterpreterLoad", interpreters[id])
+ end
+
+ ide.interpreter = interpreters[id]
+
+ DebuggerShutdown()
+
+ ide:SetStatus(ide.interpreter.name or "", 4)
+ if changed then ReloadLuaAPI() end
+end
+
+function ProjectSetInterpreter(name)
+ local id = IDget("debug.interpreter."..name)
+ if id and interpreters[id] then
+ selectInterpreter(id)
+ else
+ DisplayOutputLn(("Can't find interpreter '%s'; using the default interpreter instead.")
+ :format(name))
+ local id = (
+ -- interpreter is set and is (still) on the list of known interpreters
+ IDget("debug.interpreter."..(ide.config.interpreter or ide.config.default.interpreter)) or
+ -- otherwise use default interpreter
+ ID("debug.interpreter."..ide.config.default.interpreter)
+ )
+ selectInterpreter(id)
+ end
+end
+
+local function evSelectInterpreter(event)
+ selectInterpreter(event:GetId())
+end
+
+function ProjectUpdateInterpreters()
+ assert(ide.interpreters, "no interpreters defined")
+
+ -- delete all existing items (if any)
+ local items = targetMenu:GetMenuItemCount()
+ for i = items, 1, -1 do
+ targetMenu:Delete(targetMenu:FindItemByPosition(i-1))
+ end
+
+ local names = {}
+ for file in pairs(ide.interpreters) do table.insert(names, file) end
+ table.sort(names)
+
+ interpreters = {}
+ for _, file in ipairs(names) do
+ local inter = ide.interpreters[file]
+ local id = ID("debug.interpreter."..file)
+ inter.fname = file
+ interpreters[id] = inter
+ targetMenu:Append(
+ wx.wxMenuItem(targetMenu, id, inter.name, inter.description, wx.wxITEM_CHECK))
+ frame:Connect(id, wx.wxEVT_COMMAND_MENU_SELECTED, evSelectInterpreter)
+ end
+
+ local id = (
+ -- interpreter is set and is (still) on the list of known interpreters
+ IDget("debug.interpreter."
+ ..(ide.interpreter and ide.interpreters[ide.interpreter.fname] and ide.interpreter.fname
+ or ide.config.interpreter or ide.config.default.interpreter)) or
+ -- otherwise use default interpreter
+ ID("debug.interpreter."..ide.config.default.interpreter)
+ )
+ selectInterpreter(id)
+end
+
+-----------------------------
+-- Project directory handling
+
+function ProjectUpdateProjectDir(projdir,skiptree)
+ -- strip trailing spaces as this may create issues with "path/ " on Windows
+ projdir = projdir:gsub("%s+$","")
+ local dir = wx.wxFileName.DirName(FixDir(projdir))
+ dir:Normalize() -- turn into absolute path if needed
+ if not wx.wxDirExists(dir:GetFullPath()) then return end
+
+ projdir = dir:GetPath(wx.wxPATH_GET_VOLUME) -- no trailing slash
+
+ ide.config.path.projectdir = projdir ~= "" and projdir or nil
+ ide:SetStatus(projdir)
+ frame:SetTitle(ExpandPlaceholders(ide.config.format.apptitle))
+ if (not skiptree) then ide.filetree:updateProjectDir(projdir) end
+ return true
+end
+
+local function projChoose(event)
+ local editor = GetEditor()
+ local fn = wx.wxFileName(
+ editor and openDocuments[editor:GetId()].filePath or "")
+ fn:Normalize() -- want absolute path for dialog
+
+ local projectdir = ide:GetProject()
+ local filePicker = wx.wxDirDialog(frame, TR("Choose a project directory"),
+ projectdir ~= "" and projectdir or wx.wxGetCwd(), wx.wxDIRP_DIR_MUST_EXIST)
+ if filePicker:ShowModal(true) == wx.wxID_OK then
+ return ProjectUpdateProjectDir(filePicker:GetPath())
+ end
+ return false
+end
+
+frame:Connect(ID_PROJECTDIRCHOOSE, wx.wxEVT_COMMAND_MENU_SELECTED, projChoose)
+
+local function projFromFile(event)
+ local editor = GetEditor()
+ if not editor then return end
+ local id = editor:GetId()
+ local filepath = openDocuments[id].filePath
+ if not filepath then return end
+ local fn = wx.wxFileName(filepath)
+ fn:Normalize() -- want absolute path for dialog
+
+ if ide.interpreter then
+ ProjectUpdateProjectDir(ide.interpreter:fprojdir(fn)) end
+end
+frame:Connect(ID_PROJECTDIRFROMFILE, wx.wxEVT_COMMAND_MENU_SELECTED, projFromFile)
+frame:Connect(ID_PROJECTDIRFROMFILE, wx.wxEVT_UPDATE_UI,
+ function (event)
+ local editor = GetEditor()
+ event:Enable(editor ~= nil and ide:GetDocument(editor):GetFilePath() ~= nil)
+ end)
+
+----------------------
+-- Interpreter Running
+
+local function getNameToRun(skipcheck)
+ local editor = GetEditor()
+ if not editor then return end
+
+ -- test compile it before we run it, if successful then ask to save
+ -- only compile if lua api
+ if editor.spec.apitype and
+ editor.spec.apitype == "lua" and
+ (not skipcheck) and
+ (not ide.interpreter.skipcompile) and
+ (not CompileProgram(editor, { reportstats = false })) then
+ return
+ end
+
+ local doc = ide:GetDocument(editor)
+ local name = ide:GetProjectStartFile() or doc:GetFilePath()
+ if not name then doc:SetModified(true) end
+ if not SaveIfModified(editor) then return end
+ if ide.config.editor.saveallonrun then SaveAll(true) end
+
+ return wx.wxFileName(name or doc:GetFilePath())
+end
+
+function ActivateOutput()
+ if not ide.config.activateoutput then return end
+ -- show output/errorlog pane
+ if not uimgr:GetPane(bottomnotebook):IsShown() then
+ uimgr:GetPane(bottomnotebook):Show(true)
+ uimgr:Update()
+ end
+ -- activate output/errorlog window
+ local index = bottomnotebook:GetPageIndex(bottomnotebook.errorlog)
+ if bottomnotebook:GetSelection() ~= index then
+ bottomnotebook:SetSelection(index)
+ end
+end
+
+local function runInterpreter(wfilename, withdebugger)
+ ClearOutput()
+ ActivateOutput()
+
+ ClearAllCurrentLineMarkers()
+ if not wfilename then return end
+ debugger.pid = ide.interpreter:frun(wfilename, withdebugger)
+ if debugger.pid then OutputEnableInput() end
+ return debugger.pid
+end
+
+function ProjectRun(skipcheck)
+ local fname = getNameToRun(skipcheck)
+ if not fname then return end
+ return runInterpreter(fname)
+end
+
+local debuggers = {
+ debug = "require('mobdebug').loop('%s',%d)",
+ scratchpad = "require('mobdebug').scratchpad('%s',%d)"
+}
+
+function ProjectDebug(skipcheck, debtype)
+ if (debugger.server ~= nil) then
+ if (debugger.scratchpad and debugger.scratchpad.paused) then
+ debugger.scratchpad.paused = nil
+ debugger.scratchpad.updated = true
+ ShellSupportRemote(nil) -- disable remote while Scratchpad running
+ elseif (not debugger.running) then
+ debugger.run()
+ end
+ else
+ local debcall = (debuggers[debtype or "debug"]):
+ format(ide.debugger.hostname, ide.debugger.portnumber)
+ local fname = getNameToRun(skipcheck)
+ if not fname then return end
+ return runInterpreter(fname, debcall) -- this may be pid or nil
+ end
+ return true
+end
+
+-----------------------
+-- Actions
+
+local BREAKPOINT_MARKER = StylesGetMarker("breakpoint")
+
+frame:Connect(ID_BREAKPOINTTOGGLE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() GetEditor():BreakpointToggle() end)
+frame:Connect(ID_BREAKPOINTTOGGLE, wx.wxEVT_UPDATE_UI,
+ function (event)
+ local editor = GetEditorWithFocus(GetEditor())
+ event:Enable((ide.interpreter) and (ide.interpreter.hasdebugger) and (editor ~= nil)
+ and (not debugger.scratchpad))
+ end)
+
+frame:Connect(ID_BREAKPOINTNEXT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ local BPNSC = KSC(ID_BREAKPOINTNEXT):gsub("\t","")
+ if not GetEditor():MarkerGotoNext(BREAKPOINT_MARKER) and BPNSC == "F9" then
+ local osx = ide.osname == "Macintosh"
+ DisplayOutputLn(("You used '%s' shortcut that has been changed from toggling a breakpoint to navigating to the next breakpoint in the document.")
+ :format(BPNSC))
+ DisplayOutputLn(("To toggle a breakpoint, use '%s' or click in the editor margin.")
+ :format(KSC(ID_BREAKPOINTTOGGLE):gsub("\t",""):gsub("Ctrl", osx and "Cmd" or "Ctrl")))
+ end
+ end)
+frame:Connect(ID_BREAKPOINTPREV, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() GetEditor():MarkerGotoPrev(BREAKPOINT_MARKER) end)
+
+frame:Connect(ID_BREAKPOINTNEXT, wx.wxEVT_UPDATE_UI,
+ function (event) event:Enable(GetEditor() ~= nil) end)
+frame:Connect(ID_BREAKPOINTPREV, wx.wxEVT_UPDATE_UI,
+ function (event) event:Enable(GetEditor() ~= nil) end)
+
+frame:Connect(ID_COMPILE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function ()
+ ActivateOutput()
+ CompileProgram(GetEditor(), {
+ keepoutput = ide:GetLaunchedProcess() ~= nil or ide:GetDebugger():IsConnected()
+ })
+ end)
+frame:Connect(ID_COMPILE, wx.wxEVT_UPDATE_UI,
+ function (event) event:Enable(GetEditor() ~= nil) end)
+
+frame:Connect(ID_RUN, wx.wxEVT_COMMAND_MENU_SELECTED, function () ProjectRun() end)
+frame:Connect(ID_RUN, wx.wxEVT_UPDATE_UI,
+ function (event)
+ local editor = GetEditor()
+ event:Enable((debugger.server == nil and debugger.pid == nil) and (editor ~= nil))
+ end)
+
+frame:Connect(ID_RUNNOW, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ if debugger.scratchpad then
+ DebuggerScratchpadOff()
+ else
+ DebuggerScratchpadOn(GetEditor())
+ end
+ end)
+frame:Connect(ID_RUNNOW, wx.wxEVT_UPDATE_UI,
+ function (event)
+ local editor = GetEditor()
+ -- allow scratchpad if there is no server or (there is a server and it is
+ -- allowed to turn it into a scratchpad) and we are not debugging anything
+ event:Enable((ide.interpreter) and (ide.interpreter.hasdebugger) and
+ (ide.interpreter.scratchextloop ~= nil) and -- nil == no scratchpad support
+ (editor ~= nil) and ((debugger.server == nil or debugger.scratchable)
+ and debugger.pid == nil or debugger.scratchpad ~= nil))
+ local isscratchpad = debugger.scratchpad ~= nil
+ menuBar:Check(ID_RUNNOW, isscratchpad)
+ local tool = ide:GetToolBar():FindTool(ID_RUNNOW)
+ if tool and tool:IsSticky() ~= isscratchpad then
+ tool:SetSticky(isscratchpad)
+ ide:GetToolBar():Refresh()
+ end
+ end)
+
+frame:Connect(ID_ATTACHDEBUG, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ if event:IsChecked() then
+ if (ide.interpreter.fattachdebug) then ide.interpreter:fattachdebug() end
+ else
+ debugger.listen(false) -- stop listening
+ end
+ end)
+frame:Connect(ID_ATTACHDEBUG, wx.wxEVT_UPDATE_UI,
+ function (event)
+ event:Enable(ide.interpreter and ide.interpreter.fattachdebug and true or false)
+ ide.frame.menuBar:Check(event:GetId(), debugger.listening and true or false)
+ end)
+
+frame:Connect(ID_STARTDEBUG, wx.wxEVT_COMMAND_MENU_SELECTED, function () ProjectDebug() end)
+frame:Connect(ID_STARTDEBUG, wx.wxEVT_UPDATE_UI,
+ function (event)
+ local editor = GetEditor()
+ event:Enable((ide.interpreter) and (ide.interpreter.hasdebugger) and
+ ((debugger.server == nil and debugger.pid == nil and editor ~= nil) or
+ (debugger.server ~= nil and not debugger.running)) and
+ (not debugger.scratchpad or debugger.scratchpad.paused))
+ local label = (debugger.server ~= nil)
+ and debugMenuRun.continue or debugMenuRun.start
+ if debugMenu:GetLabel(ID_STARTDEBUG) ~= label then
+ debugMenu:SetLabel(ID_STARTDEBUG, label)
+ end
+ end)
+
+frame:Connect(ID_STOPDEBUG, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function () DebuggerShutdown() end)
+frame:Connect(ID_STOPDEBUG, wx.wxEVT_UPDATE_UI,
+ function (event)
+ event:Enable(debugger.server ~= nil or debugger.pid ~= nil)
+ local label = (debugger.server == nil and debugger.pid ~= nil)
+ and debugMenuStop.process or debugMenuStop.debugging
+ if debugMenu:GetLabel(ID_STOPDEBUG) ~= label then
+ debugMenu:SetLabel(ID_STOPDEBUG, label)
+ end
+ end)
+
+frame:Connect(ID_DETACHDEBUG, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function () debugger.detach() end)
+frame:Connect(ID_DETACHDEBUG, wx.wxEVT_UPDATE_UI,
+ function (event)
+ event:Enable((debugger.server ~= nil) and (not debugger.scratchpad))
+ end)
+
+frame:Connect(ID_RUNTO, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function ()
+ local editor = GetEditor()
+ debugger.runto(editor, editor:GetCurrentLine())
+ end)
+frame:Connect(ID_RUNTO, wx.wxEVT_UPDATE_UI,
+ function (event)
+ local editor = GetEditor()
+ event:Enable((debugger.server ~= nil) and (not debugger.running)
+ and (editor ~= nil) and (not debugger.scratchpad))
+ end)
+
+frame:Connect(ID_STEP, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function () debugger.step() end)
+frame:Connect(ID_STEP, wx.wxEVT_UPDATE_UI,
+ function (event)
+ local editor = GetEditor()
+ event:Enable((debugger.server ~= nil) and (not debugger.running)
+ and (editor ~= nil) and (not debugger.scratchpad))
+ end)
+
+frame:Connect(ID_STEPOVER, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function () debugger.over() end)
+frame:Connect(ID_STEPOVER, wx.wxEVT_UPDATE_UI,
+ function (event)
+ local editor = GetEditor()
+ event:Enable((debugger.server ~= nil) and (not debugger.running)
+ and (editor ~= nil) and (not debugger.scratchpad))
+ end)
+
+frame:Connect(ID_STEPOUT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function () debugger.out() end)
+frame:Connect(ID_STEPOUT, wx.wxEVT_UPDATE_UI,
+ function (event)
+ local editor = GetEditor()
+ event:Enable((debugger.server ~= nil) and (not debugger.running)
+ and (editor ~= nil) and (not debugger.scratchpad))
+ end)
+
+frame:Connect(ID_TRACE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function () debugger.trace() end)
+frame:Connect(ID_TRACE, wx.wxEVT_UPDATE_UI,
+ function (event)
+ local editor = GetEditor()
+ event:Enable((debugger.server ~= nil) and (not debugger.running)
+ and (editor ~= nil) and (not debugger.scratchpad))
+ end)
+
+frame:Connect(ID_BREAK, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function ()
+ if debugger.server then
+ debugger.breaknow()
+ if debugger.scratchpad then
+ debugger.scratchpad.paused = true
+ ShellSupportRemote(debugger.shell)
+ end
+ end
+ end)
+frame:Connect(ID_BREAK, wx.wxEVT_UPDATE_UI,
+ function (event)
+ event:Enable(debugger.server ~= nil
+ and (debugger.running
+ or (debugger.scratchpad and not debugger.scratchpad.paused)))
+ end)
+
+frame:Connect(ID_COMMANDLINEPARAMETERS, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function ()
+ local params = wx.wxGetTextFromUser(TR("Enter command line parameters (use Cancel to clear)"),
+ TR("Command line parameters"), ide.config.arg.any or "")
+ ide.config.arg.any = params and #params > 0 and params or nil
+ end)
+frame:Connect(ID_COMMANDLINEPARAMETERS, wx.wxEVT_UPDATE_UI,
+ function (event)
+ event:Enable(ide.interpreter and ide.interpreter.takeparameters and true or false)
+ end)
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_search.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_search.lua
new file mode 100644
index 0000000..8fcad40
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_search.lua
@@ -0,0 +1,420 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Lomtik Software (J. Winwood & John Labenski)
+-- Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+local q = EscapeMagic
+local unpack = table.unpack or unpack
+
+local frame = ide.frame
+local menuBar = frame.menuBar
+local findReplace = ide.findReplace
+
+local findMenu = wx.wxMenu{
+ { ID_FIND, TR("&Find")..KSC(ID_FIND), TR("Find text") },
+ { ID_FINDNEXT, TR("Find &Next")..KSC(ID_FINDNEXT), TR("Find the next text occurrence") },
+ { ID_FINDPREV, TR("Find &Previous")..KSC(ID_FINDPREV), TR("Find the earlier text occurence") },
+ { ID_FINDSELECTNEXT, TR("Select And Find Next")..KSC(ID_FINDSELECTNEXT), TR("Select the word under cursor and find its next occurrence") },
+ { ID_FINDSELECTPREV, TR("Select And Find Previous")..KSC(ID_FINDSELECTPREV), TR("Select the word under cursor and find its previous occurrence") },
+ { ID_REPLACE, TR("&Replace")..KSC(ID_REPLACE), TR("Find and replace text") },
+ { },
+ { ID_FINDINFILES, TR("Find &In Files")..KSC(ID_FINDINFILES), TR("Find text in files") },
+ { ID_REPLACEINFILES, TR("Re&place In Files")..KSC(ID_REPLACEINFILES), TR("Find and replace text in files") },
+ { },
+}
+findMenu:Append(ID_NAVIGATE, TR("Navigate"), wx.wxMenu {
+ { ID_NAVIGATETOFILE, TR("Go To File...")..KSC(ID_NAVIGATETOFILE), TR("Go to file") },
+ { ID_NAVIGATETOLINE, TR("Go To Line...")..KSC(ID_NAVIGATETOLINE), TR("Go to line") },
+ { ID_NAVIGATETOSYMBOL, TR("Go To Symbol...")..KSC(ID_NAVIGATETOSYMBOL), TR("Go to symbol") },
+ { ID_NAVIGATETOMETHOD, TR("Insert Library Function...")..KSC(ID_NAVIGATETOMETHOD), TR("Find and insert library function") },
+})
+
+menuBar:Append(findMenu, TR("&Search"))
+
+local function onUpdateUISearchMenu(event) event:Enable(GetEditor() ~= nil) end
+
+frame:Connect(ID_FIND, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ findReplace:Show(false)
+ end)
+frame:Connect(ID_FIND, wx.wxEVT_UPDATE_UI, onUpdateUISearchMenu)
+
+frame:Connect(ID_REPLACE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ findReplace:Show(true)
+ end)
+frame:Connect(ID_REPLACE, wx.wxEVT_UPDATE_UI, onUpdateUISearchMenu)
+
+frame:Connect(ID_FINDINFILES, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ findReplace:Show(false,true)
+ end)
+frame:Connect(ID_REPLACEINFILES, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ findReplace:Show(true,true)
+ end)
+
+frame:Connect(ID_FINDNEXT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ local editor = GetEditor()
+ if editor and ide.wxver >= "2.9.5" and editor:GetSelections() > 1 then
+ local selection = editor:GetMainSelection() + 1
+ if selection >= editor:GetSelections() then selection = 0 end
+ editor:SetMainSelection(selection)
+ editor:ShowPosEnforcePolicy(editor:GetCurrentPos())
+ else
+ if findReplace:SetFind(findReplace:GetFind() or findReplace:GetSelection()) then
+ findReplace:Find()
+ else
+ findReplace:Show(false)
+ end
+ end
+ end)
+frame:Connect(ID_FINDNEXT, wx.wxEVT_UPDATE_UI, onUpdateUISearchMenu)
+
+frame:Connect(ID_FINDPREV, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ local editor = GetEditor()
+ if editor and ide.wxver >= "2.9.5" and editor:GetSelections() > 1 then
+ local selection = editor:GetMainSelection() - 1
+ if selection < 0 then selection = editor:GetSelections() - 1 end
+ editor:SetMainSelection(selection)
+ editor:ShowPosEnforcePolicy(editor:GetCurrentPos())
+ else
+ if findReplace:SetFind(findReplace:GetFind() or findReplace:GetSelection()) then
+ findReplace:Find(true) -- search up
+ else
+ findReplace:Show(false)
+ end
+ end
+ end)
+frame:Connect(ID_FINDPREV, wx.wxEVT_UPDATE_UI, onUpdateUISearchMenu)
+
+-- Select and Find behaves like Find if there is a current selection;
+-- if not, it selects a word under cursor (if any) and does find.
+
+frame:Connect(ID_FINDSELECTNEXT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ if findReplace:SetFind(findReplace:GetSelection() or findReplace:GetWordAtCaret()) then
+ findReplace:Find()
+ end
+ end)
+frame:Connect(ID_FINDSELECTNEXT, wx.wxEVT_UPDATE_UI, onUpdateUISearchMenu)
+
+frame:Connect(ID_FINDSELECTPREV, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ if findReplace:SetFind(findReplace:GetSelection() or findReplace:GetWordAtCaret()) then
+ findReplace:Find(true)
+ end
+ end)
+frame:Connect(ID_FINDSELECTPREV, wx.wxEVT_UPDATE_UI, onUpdateUISearchMenu)
+
+local markername = "commandbar.background"
+local mac = ide.osname == 'Macintosh'
+local win = ide.osname == 'Windows'
+local special = {SYMBOL = '@', LINE = ':', METHOD = ';'}
+local tabsep = "\0"
+local function name2index(name)
+ local p = name:find(tabsep)
+ return p and tonumber(name:sub(p + #tabsep)) or nil
+end
+local function navigateTo(default, selected)
+ local styles = ide.config.styles
+ local marker = ide:AddMarker(markername,
+ wxstc.wxSTC_MARK_BACKGROUND, styles.text.fg, styles.caretlinebg.bg)
+
+ local nb = ide:GetEditorNotebook()
+ local selection = nb:GetSelection()
+ local maxitems = ide.config.commandbar.maxitems
+ local files, preview, origline, functions, methods
+
+ local function markLine(ed, toline)
+ ed:MarkerDefine(ide:GetMarker(markername))
+ ed:MarkerDeleteAll(marker)
+ ed:MarkerAdd(toline-1, marker)
+ -- store the original line if not stored yet
+ origline = origline or (ed:GetCurrentLine()+1)
+ ed:EnsureVisibleEnforcePolicy(toline-1)
+ end
+
+ CommandBarShow({
+ defaultText = default or "",
+ selectedText = selected or "",
+ onDone = function(t, enter, text)
+ if not mac then nb:Freeze() end
+
+ -- delete all current line markers if any; restore line position
+ local ed = ide:GetEditor()
+ if ed and origline then
+ ed:MarkerDeleteAll(marker)
+ -- only restore original line if Escape was used (enter == false)
+ if enter == false then ed:EnsureVisibleEnforcePolicy(origline-1) end
+ end
+
+ local pindex = preview and nb:GetPageIndex(preview)
+ if enter then
+ local fline, sline, tabindex = unpack(t or {})
+
+ -- jump to symbol; tabindex has the position of the symbol
+ if text and text:find(special.SYMBOL) then
+ if sline and tabindex then
+ local index = name2index(sline)
+ local editor = index and nb:GetPage(index):DynamicCast("wxStyledTextCtrl")
+ if not editor then
+ local doc = ide:FindDocument(sline)
+ -- reload the file (including the preview to refresh its symbols in the outline)
+ editor = LoadFile(sline, (not doc or doc:GetTabIndex() == pindex) and preview or nil)
+ end
+ if editor then
+ if pindex and pindex ~= ide:GetDocument(editor):GetTabIndex() then ClosePage(pindex) end
+ editor:SetFocus() -- in case the focus is on some other panel
+ editor:GotoPos(tabindex-1)
+ editor:EnsureVisibleEnforcePolicy(editor:LineFromPosition(tabindex-1))
+ end
+ end
+ -- insert selected method
+ elseif text and text:find('^%s*'..special.METHOD) then
+ if ed then -- clean up text and insert at the current location
+ local method = sline
+ local isfunc = methods.desc[method][1]:find(q(method).."%s*%(")
+ local text = method .. (isfunc and "()" or "")
+ local pos = ed:GetCurrentPos()
+ ed:InsertTextDyn(pos, text)
+ ed:EnsureVisibleEnforcePolicy(ed:LineFromPosition(pos))
+ ed:GotoPos(pos + #method + (isfunc and 1 or 0))
+ if isfunc then -- show the tooltip
+ ide.frame:AddPendingEvent(wx.wxCommandEvent(
+ wx.wxEVT_COMMAND_MENU_SELECTED, ID_SHOWTOOLTIP))
+ end
+ end
+ -- set line position in the (current) editor if requested
+ elseif text and text:find(special.LINE..'(%d+)%s*$') then
+ local toline = tonumber(text:match(special.LINE..'(%d+)'))
+ if toline and ed then
+ ed:GotoLine(toline-1)
+ ed:EnsureVisibleEnforcePolicy(toline-1)
+ ed:SetFocus() -- in case the focus is on some other panel
+ end
+ elseif tabindex then -- switch to existing tab
+ SetEditorSelection(tabindex)
+ if pindex and pindex ~= tabindex then ClosePage(pindex) end
+ -- load a new file (into preview if set)
+ elseif sline or text then
+ -- 1. use "text" if Ctrl/Cmd-Enter is used
+ -- 2. otherwise use currently selected file
+ -- 3. otherwise use "text"
+ local file = (wx.wxGetKeyState(wx.WXK_CONTROL) and text) or sline or text
+ local fullPath = MergeFullPath(ide:GetProject(), file)
+ local doc = ide:FindDocument(fullPath)
+ -- if the document is already opened (not in the preview)
+ -- or can't be opened as a file or folder, then close the preview
+ if doc and doc.index ~= pindex
+ or not LoadFile(fullPath, preview or nil) and not ProjectUpdateProjectDir(fullPath) then
+ if pindex then ClosePage(pindex) end
+ end
+ end
+ elseif enter == nil then -- changed focus
+ -- do nothing; keep everything as is
+ else
+ -- close preview
+ if pindex then ClosePage(pindex) end
+ -- restore original selection if canceled
+ if nb:GetSelection() ~= selection then nb:SetSelection(selection) end
+ end
+ preview = nil
+ if not mac then nb:Thaw() end
+ end,
+ onUpdate = function(text)
+ local lines = {}
+ local projdir = ide:GetProject()
+
+ -- delete all current line markers if any
+ -- restore the original position if search text is updated
+ local ed = ide:GetEditor()
+ if ed and origline then ed:MarkerDeleteAll(marker) end
+
+ -- reset cached functions if no symbol search
+ if text and not text:find(special.SYMBOL) then
+ functions = nil
+ if ed and origline then ed:EnsureVisibleEnforcePolicy(origline-1) end
+ end
+ -- reset cached methods if no method search
+ if text and not text:find(special.METHOD) then methods = nil end
+
+ if text and text:find(special.SYMBOL) then
+ local file, symbol = text:match('^(.*)'..special.SYMBOL..'(.*)')
+ if not functions then
+ local nums, paths = {}, {}
+ functions = {pos = {}, src = {}}
+
+ local function populateSymbols(path, symbols)
+ for _, func in ipairs(symbols) do
+ table.insert(functions, func.name)
+ nums[func.name] = (nums[func.name] or 0) + 1
+ local num = nums[func.name]
+ functions.src[func.name..num] = path
+ functions.pos[func.name..num] = func.pos
+ end
+ end
+
+ local currentonly = #file > 0 and ed
+ local outline = ide:GetOutline()
+ for _, doc in pairs(currentonly and {ide:GetDocument(ed)} or ide:GetDocuments()) do
+ local path, editor = doc:GetFilePath(), doc:GetEditor()
+ if path then paths[path] = true end
+ populateSymbols(path or doc:GetFileName()..tabsep..doc:GetTabIndex(), outline:GetEditorSymbols(editor))
+ end
+
+ -- now add all other files in the project
+ if not currentonly and ide.config.commandbar.showallsymbols then
+ local n = 0
+ outline:RefreshSymbols(projdir, function(path)
+ local symbols = outline:GetFileSymbols(path)
+ if not paths[path] and symbols then populateSymbols(path, symbols) end
+ if not symbols then n = n + 1 end
+ end)
+ if n > 0 then ide:SetStatusFor(TR("Queued %d files to index."):format(n)) end
+ end
+ end
+ local nums = {}
+ if #symbol > 0 then
+ local topscore
+ for _, item in ipairs(CommandBarScoreItems(functions, symbol, maxitems)) do
+ local func, score = unpack(item)
+ topscore = topscore or score
+ nums[func] = (nums[func] or 0) + 1
+ local num = nums[func]
+ if score > topscore / 4 and score > 1 then
+ table.insert(lines, {("%2d %s"):format(score, func),
+ functions.src[func..num], functions.pos[func..num]})
+ end
+ end
+ else
+ for n, name in ipairs(functions) do
+ if n > maxitems then break end
+ nums[name] = (nums[name] or 0) + 1
+ local num = nums[name]
+ lines[n] = {name, functions.src[name..num], functions.pos[name..num]}
+ end
+ end
+ elseif ed and text and text:find('^%s*'..special.METHOD) then
+ if not methods then
+ methods = {desc = {}}
+ local num = 1
+ if ed.api and ed.api.tip and ed.api.tip.shortfinfoclass then
+ for libname, lib in pairs(ed.api.tip.shortfinfoclass) do
+ for method, val in pairs(lib) do
+ local signature, desc = val:match('(.-)\n(.*)')
+ local m = libname..'.'..method
+ desc = desc and desc:gsub("\n", " ") or val
+ methods[num] = m
+ methods.desc[m] = {signature or (libname..'.'..method), desc}
+ num = num + 1
+ end
+ end
+ end
+ end
+ local method = text:match(special.METHOD..'(.*)')
+ if #method > 0 then
+ local topscore
+ for _, item in ipairs(CommandBarScoreItems(methods, method, maxitems)) do
+ local method, score = unpack(item)
+ topscore = topscore or score
+ if score > topscore / 4 and score > 1 then
+ table.insert(lines, { score, method })
+ end
+ end
+ end
+ elseif text and text:find(special.LINE..'(%d*)%s*$') then
+ local toline = tonumber(text:match(special.LINE..'(%d+)'))
+ if toline and ed then markLine(ed, toline) end
+ elseif text and #text > 0 and projdir and #projdir > 0 then
+ -- populate the list of files
+ files = files or FileSysGetRecursive(projdir, true, "*",
+ {sort = false, path = false, folder = false, skipbinary = true})
+ local topscore
+ for _, item in ipairs(CommandBarScoreItems(files, text, maxitems)) do
+ local file, score = unpack(item)
+ topscore = topscore or score
+ if score > topscore / 4 and score > 1 then
+ table.insert(lines, {
+ ("%2d %s"):format(score, wx.wxFileName(file):GetFullName()),
+ file,
+ })
+ end
+ end
+ else
+ for _, doc in pairs(ide:GetDocuments()) do
+ lines[doc:GetTabIndex()+1] = {doc:GetFileName(), doc:GetFilePath(), doc:GetTabIndex()}
+ end
+ end
+ return lines
+ end,
+ onItem = function(t)
+ if methods then
+ local score, method = unpack(t)
+ return ("%2d %s"):format(score, methods.desc[method][1]), methods.desc[method][2]
+ else
+ return unpack(t)
+ end
+ end,
+ onSelection = function(t, text)
+ local _, file, tabindex = unpack(t)
+ local pos
+ if text and text:find(special.SYMBOL) then
+ pos, tabindex = tabindex, name2index(file)
+ elseif text and text:find(special.METHOD) then
+ return
+ end
+
+ if file then file = MergeFullPath(ide:GetProject(), file) end
+ -- disabling event handlers for the notebook and the editor
+ -- to minimize changes in the UI when editors are switched
+ -- or files in the preview are updated.
+ nb:SetEvtHandlerEnabled(false)
+ local doc = file and ide:FindDocument(file)
+ if doc and not tabindex then tabindex = doc:GetTabIndex() end
+ if tabindex then
+ local ed = nb:GetPage(tabindex)
+ ed:SetEvtHandlerEnabled(false)
+ if nb:GetSelection() ~= tabindex then nb:SetSelection(tabindex) end
+ ed:SetEvtHandlerEnabled(true)
+ elseif file then
+ -- skip binary files with unknown extensions
+ if #ide:GetKnownExtensions(GetFileExt(file)) > 0
+ or not IsBinary(FileRead(file, 2048)) then
+ preview = preview or NewFile()
+ preview:SetEvtHandlerEnabled(false)
+ LoadFile(file, preview, true, true)
+ preview:SetFocus()
+ -- force refresh since the panel covers the editor on OSX/Linux
+ -- this fixes the preview window not always redrawn on Linux
+ if not win then preview:Update() preview:Refresh() end
+ preview:SetEvtHandlerEnabled(true)
+ elseif preview then
+ ClosePage(nb:GetPageIndex(preview))
+ preview = nil
+ end
+ end
+ nb:SetEvtHandlerEnabled(true)
+
+ if text and text:find(special.SYMBOL) then
+ local ed = ide:GetEditor()
+ if ed then markLine(ed, ed:LineFromPosition(pos-1)+1) end
+ end
+ end,
+ })
+end
+
+frame:Connect(ID_NAVIGATETOFILE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() navigateTo("") end)
+frame:Connect(ID_NAVIGATETOLINE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() navigateTo(special.LINE) end)
+frame:Connect(ID_NAVIGATETOMETHOD, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() navigateTo(special.METHOD) end)
+frame:Connect(ID_NAVIGATETOSYMBOL, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ local ed = GetEditor()
+ navigateTo(special.SYMBOL, ed and ed:ValueFromPosition(ed:GetCurrentPos()))
+ end)
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_tools.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_tools.lua
new file mode 100644
index 0000000..885556c
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_tools.lua
@@ -0,0 +1,111 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+local frame = ide.frame
+local menuBar = frame.menuBar
+local unpack = table.unpack or unpack
+
+--[=[
+-- tool definition
+-- main entries are optional
+tool = {
+ fnmenu = function(frame,menubar),
+ -- can be used for init
+ -- and custom menu
+ exec = {
+ -- quick exec action
+ name = "",
+ description = "",
+ fn = function(filename, projectdir),
+ }
+}
+
+]=]
+
+local toolArgs = {}
+local cnt = 1
+
+local function name2id(name) return ID("tools.exec."..name) end
+
+do
+ local maxcnt = 10
+
+ local tools = {}
+ for name,tool in pairs(ide.tools) do
+ if (tool.exec and tool.exec.name) then
+ tool.fname = name
+ table.insert(tools,tool)
+ end
+ end
+
+ table.sort(tools,function(a,b) return a.exec.name < b.exec.name end)
+
+ -- todo config specifc ignore/priority list
+ for _, tool in ipairs(tools) do
+ local exec = tool.exec
+ if (exec and cnt < maxcnt and exec.name and exec.fn and exec.description) then
+ local id = name2id(tool.fname)
+ table.insert(toolArgs,{id, TR(exec.name) .. KSC(id), exec.description})
+ -- flag it
+ tool._execid = id
+ cnt = cnt + 1
+ end
+ end
+end
+
+local function addHandler(menu, id, command, updateui)
+ menu:Connect(id, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ local editor = GetEditor()
+ if (not editor) then return end
+
+ command(ide:GetDocument(editor):GetFilePath(), ide:GetProject())
+
+ return true
+ end)
+ menu:Connect(id, wx.wxEVT_UPDATE_UI,
+ updateui or function(event) event:Enable(GetEditor() ~= nil) end)
+end
+
+if (cnt > 1) then
+
+ -- Build Menu
+ local toolMenu = wx.wxMenu{
+ unpack(toolArgs)
+ }
+ menuBar:Append(toolMenu, "&Tools")
+
+ -- connect auto execs
+ for _, tool in pairs(ide.tools) do
+ if tool._execid then addHandler(toolMenu, tool._execid, tool.exec.fn) end
+ end
+end
+
+-- Generate Custom Menus/Init
+for _, tool in pairs(ide.tools) do
+ if tool.fninit then tool.fninit(frame, menuBar) end
+end
+
+function ToolsAddTool(name, command, updateui)
+ local toolMenu = ide:FindTopMenu('&Tools')
+ if not toolMenu then
+ local helpMenu, helpindex = ide:FindTopMenu('&Help')
+ if not helpMenu then helpindex = ide:GetMenuBar():GetMenuCount() end
+
+ toolMenu = wx.wxMenu{}
+ menuBar:Insert(helpindex, toolMenu, "&Tools")
+ end
+ local id = name2id(name)
+ toolMenu:Append(id, name)
+ addHandler(toolMenu, id, command, updateui)
+end
+
+function ToolsRemoveTool(name)
+ ide:RemoveMenuItem(name2id(name))
+ local toolMenu, toolindex = ide:FindTopMenu('&Tools')
+ if toolMenu and toolMenu:GetMenuItemCount() == 0 then
+ ide:GetMenuBar():Remove(toolindex)
+ end
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_view.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_view.lua
new file mode 100644
index 0000000..71f6648
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/menu_view.lua
@@ -0,0 +1,113 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Lomtik Software (J. Winwood & John Labenski)
+-- Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+local frame = ide.frame
+local menuBar = frame.menuBar
+local uimgr = frame.uimgr
+
+local viewMenu = wx.wxMenu {
+ { ID_VIEWFILETREE, TR("Project/&FileTree Window")..KSC(ID_VIEWFILETREE), TR("View the project/filetree window"), wx.wxITEM_CHECK },
+ { ID_VIEWOUTPUT, TR("&Output/Console Window")..KSC(ID_VIEWOUTPUT), TR("View the output/console window"), wx.wxITEM_CHECK },
+ { ID_VIEWWATCHWINDOW, TR("&Watch Window")..KSC(ID_VIEWWATCHWINDOW), TR("View the watch window"), wx.wxITEM_CHECK },
+ { ID_VIEWCALLSTACK, TR("&Stack Window")..KSC(ID_VIEWCALLSTACK), TR("View the stack window"), wx.wxITEM_CHECK },
+ { ID_VIEWOUTLINE, TR("Outline Window")..KSC(ID_VIEWOUTLINE), TR("View the outline window"), wx.wxITEM_CHECK },
+ { ID_VIEWMARKERS, TR("Markers Window")..KSC(ID_VIEWMARKERS), TR("View the markers window"), wx.wxITEM_CHECK },
+ { },
+ { ID_VIEWTOOLBAR, TR("&Tool Bar")..KSC(ID_VIEWTOOLBAR), TR("Show/Hide the toolbar"), wx.wxITEM_CHECK },
+ { ID_VIEWSTATUSBAR, TR("&Status Bar")..KSC(ID_VIEWSTATUSBAR), TR("Show/Hide the status bar"), wx.wxITEM_CHECK },
+ { },
+ { ID_VIEWDEFAULTLAYOUT, TR("&Default Layout")..KSC(ID_VIEWDEFAULTLAYOUT), TR("Reset to default layout") },
+ { ID_VIEWFULLSCREEN, TR("Full &Screen")..KSC(ID_VIEWFULLSCREEN), TR("Switch to or from full screen mode") },
+}
+
+do -- Add zoom submenu
+ local zoomMenu = wx.wxMenu{
+ {ID_ZOOMRESET, TR("Zoom to 100%")..KSC(ID_ZOOMRESET)},
+ {ID_ZOOMIN, TR("Zoom In")..KSC(ID_ZOOMIN)},
+ {ID_ZOOMOUT, TR("Zoom Out")..KSC(ID_ZOOMOUT)},
+ }
+
+ frame:Connect(ID_ZOOMRESET, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() local editor = GetEditorWithFocus()
+ if editor then editor:SetZoom(0) end end)
+ frame:Connect(ID_ZOOMIN, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() local editor = GetEditorWithFocus()
+ if editor then editor:SetZoom(editor:GetZoom()+1) end end)
+ frame:Connect(ID_ZOOMOUT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function() local editor = GetEditorWithFocus()
+ if editor then editor:SetZoom(editor:GetZoom()-1) end end)
+
+ -- only enable if there is an editor
+ local iseditor = function (event) event:Enable(GetEditorWithFocus() ~= nil) end
+ for _, id in ipairs({ID_ZOOMRESET, ID_ZOOMIN, ID_ZOOMOUT}) do
+ frame:Connect(id, wx.wxEVT_UPDATE_UI, iseditor)
+ end
+
+ viewMenu:Append(ID_ZOOM, TR("Zoom"), zoomMenu)
+end
+
+menuBar:Append(viewMenu, TR("&View"))
+
+local panels = {
+ [ID_VIEWOUTPUT] = "bottomnotebook",
+ [ID_VIEWFILETREE] = "projpanel",
+ [ID_VIEWWATCHWINDOW] = "watchpanel",
+ [ID_VIEWCALLSTACK] = "stackpanel",
+ [ID_VIEWOUTLINE] = "outlinepanel",
+ [ID_VIEWMARKERS] = "markerspanel",
+ [ID_VIEWTOOLBAR] = "toolbar",
+}
+
+local function togglePanel(event)
+ local panel = panels[event:GetId()]
+ local pane = uimgr:GetPane(panel)
+ local shown = not pane:IsShown()
+ if not shown then pane:BestSize(pane.window:GetSize()) end
+ pane:Show(shown)
+ uimgr:Update()
+
+ return shown
+end
+
+local function checkPanel(event)
+ local pane = uimgr:GetPane(panels[event:GetId()])
+ event:Enable(pane:IsOk()) -- disable if doesn't exist
+ menuBar:Check(event:GetId(), pane:IsOk() and pane:IsShown())
+end
+
+frame:Connect(ID_VIEWDEFAULTLAYOUT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ uimgr:LoadPerspective(uimgr.defaultPerspective, true)
+ end)
+
+frame:Connect(ID_VIEWMINIMIZE, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event) ide.frame:Iconize(true) end)
+
+frame:Connect(ID_VIEWFULLSCREEN, wx.wxEVT_COMMAND_MENU_SELECTED, function ()
+ ShowFullScreen(not frame:IsFullScreen())
+ end)
+frame:Connect(ID_VIEWFULLSCREEN, wx.wxEVT_UPDATE_UI,
+ function (event) event:Enable(GetEditor() ~= nil) end)
+
+frame:Connect(ID_VIEWOUTPUT, wx.wxEVT_COMMAND_MENU_SELECTED, togglePanel)
+frame:Connect(ID_VIEWFILETREE, wx.wxEVT_COMMAND_MENU_SELECTED, togglePanel)
+frame:Connect(ID_VIEWTOOLBAR, wx.wxEVT_COMMAND_MENU_SELECTED, togglePanel)
+frame:Connect(ID_VIEWOUTLINE, wx.wxEVT_COMMAND_MENU_SELECTED, togglePanel)
+frame:Connect(ID_VIEWMARKERS, wx.wxEVT_COMMAND_MENU_SELECTED, togglePanel)
+frame:Connect(ID_VIEWWATCHWINDOW, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event) if togglePanel(event) then DebuggerRefreshPanels() end end)
+frame:Connect(ID_VIEWCALLSTACK, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event) if togglePanel(event) then DebuggerRefreshPanels() end end)
+
+frame:Connect(ID_VIEWSTATUSBAR, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ frame:GetStatusBar():Show(menuBar:IsChecked(event:GetId()))
+ uimgr:Update()
+ end)
+frame:Connect(ID_VIEWSTATUSBAR, wx.wxEVT_UPDATE_UI,
+ function (event) menuBar:Check(event:GetId(), frame:GetStatusBar():IsShown()) end)
+
+for id in pairs(panels) do frame:Connect(id, wx.wxEVT_UPDATE_UI, checkPanel) end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/outline.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/outline.lua
new file mode 100644
index 0000000..cc1fbac
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/outline.lua
@@ -0,0 +1,679 @@
+-- Copyright 2014-15 Paul Kulchenko, ZeroBrane LLC
+
+local ide = ide
+ide.outline = {
+ outlineCtrl = nil,
+ imglist = ide:CreateImageList("OUTLINE", "FILE-NORMAL", "VALUE-LCALL",
+ "VALUE-GCALL", "VALUE-ACALL", "VALUE-SCALL", "VALUE-MCALL"),
+ settings = {
+ symbols = {},
+ ignoredirs = {},
+ },
+ needsaving = false,
+ indexqueue = {[0] = {}},
+ indexpurged = false, -- flag that the index has been purged from old records; once per session
+}
+
+local outline = ide.outline
+local image = { FILE = 0, LFUNCTION = 1, GFUNCTION = 2, AFUNCTION = 3,
+ SMETHOD = 4, METHOD = 5,
+}
+local q = EscapeMagic
+local caches = {}
+
+local function setData(ctrl, item, value)
+ if ide.wxver >= "2.9.5" then
+ local data = wx.wxLuaTreeItemData()
+ data:SetData(value)
+ ctrl:SetItemData(item, data)
+ end
+end
+
+local function resetOutlineTimer()
+ if ide.config.outlineinactivity then
+ ide.timers.outline:Start(ide.config.outlineinactivity*1000, wx.wxTIMER_ONE_SHOT)
+ end
+end
+
+local function resetIndexTimer(interval)
+ if ide.config.symbolindexinactivity and not ide.timers.symbolindex:IsRunning() then
+ ide.timers.symbolindex:Start(interval or ide.config.symbolindexinactivity*1000, wx.wxTIMER_ONE_SHOT)
+ end
+end
+
+local function outlineRefresh(editor, force)
+ if not editor then return end
+ local tokens = editor:GetTokenList()
+ local sep = editor.spec.sep
+ local varname = "([%w_][%w_"..q(sep:sub(1,1)).."]*)"
+ local funcs = {updated = TimeGet()}
+ local var = {}
+ local outcfg = ide.config.outline or {}
+ local scopes = {}
+ local funcnum = 0
+ local SCOPENUM, FUNCNUM = 1, 2
+ local text
+ for _, token in ipairs(tokens) do
+ local op = token[1]
+ if op == 'Var' or op == 'Id' then
+ var = {name = token.name, fpos = token.fpos, global = token.context[token.name] == nil}
+ elseif outcfg.showcurrentfunction and op == 'Scope' then
+ local fundepth = #scopes
+ if token.name == '(' then -- a function starts a new scope
+ funcnum = funcnum + 1 -- increment function count
+ local nested = fundepth == 0 or scopes[fundepth][SCOPENUM] > 0
+ scopes[fundepth + (nested and 1 or 0)] = {1, funcnum}
+ elseif fundepth > 0 then
+ scopes[fundepth][SCOPENUM] = scopes[fundepth][SCOPENUM] + 1
+ end
+ elseif outcfg.showcurrentfunction and op == 'EndScope' then
+ local fundepth = #scopes
+ if fundepth > 0 and scopes[fundepth][SCOPENUM] > 0 then
+ scopes[fundepth][SCOPENUM] = scopes[fundepth][SCOPENUM] - 1
+ if scopes[fundepth][SCOPENUM] == 0 then
+ local funcnum = scopes[fundepth][FUNCNUM]
+ if funcs[funcnum] then
+ funcs[funcnum].poe = token.fpos + (token.name and #token.name or 0)
+ end
+ table.remove(scopes)
+ end
+ end
+ elseif op == 'Function' then
+ local depth = token.context['function'] or 1
+ local name, pos = token.name, token.fpos
+ text = text or editor:GetTextDyn()
+ local _, _, rname, params = text:find('([^%(]*)(%b())', pos)
+ if name and rname:find(token.name, 1, true) ~= 1 then
+ name = rname:gsub("%s+$","")
+ end
+ if not name then
+ local s = editor:PositionFromLine(editor:LineFromPosition(pos-1))
+ local rest
+ rest, pos, name = text:sub(s+1, pos-1):match('%s*(.-)()'..varname..'%s*=%s*function%s*$')
+ if rest then
+ pos = s + pos
+ -- guard against "foo, bar = function() end" as it would get "bar"
+ if #rest>0 and rest:find(',') then name = nil end
+ end
+ end
+ local ftype = image.LFUNCTION
+ if not name then
+ ftype = image.AFUNCTION
+ elseif outcfg.showmethodindicator and name:find('['..q(sep)..']') then
+ ftype = name:find(q(sep:sub(1,1))) and image.SMETHOD or image.METHOD
+ elseif var.name == name and var.fpos == pos
+ or var.name and name:find('^'..var.name..'['..q(sep)..']') then
+ ftype = var.global and image.GFUNCTION or image.LFUNCTION
+ end
+ name = name or outcfg.showanonymous
+ funcs[#funcs+1] = {
+ name = ((name or '~')..params):gsub("%s+", " "),
+ skip = (not name) and true or nil,
+ depth = depth,
+ image = ftype,
+ pos = name and pos or token.fpos,
+ }
+ end
+ end
+
+ if force == nil then return funcs end
+
+ local ctrl = outline.outlineCtrl
+ local cache = caches[editor] or {}
+ caches[editor] = cache
+
+ -- add file
+ local filename = ide:GetDocument(editor):GetTabText()
+ local fileitem = cache.fileitem
+ if not fileitem then
+ local root = ctrl:GetRootItem()
+ if not root or not root:IsOk() then return end
+
+ if outcfg.showonefile then
+ fileitem = root
+ else
+ fileitem = ctrl:AppendItem(root, filename, image.FILE)
+ setData(ctrl, fileitem, editor)
+ ctrl:SetItemBold(fileitem, true)
+ ctrl:SortChildren(root)
+ end
+ cache.fileitem = fileitem
+ end
+
+ do -- check if any changes in the cached function list
+ local prevfuncs = cache.funcs or {}
+ local nochange = #funcs == #prevfuncs
+ local resort = {} -- items that need to be re-sorted
+ if nochange then
+ for n, func in ipairs(funcs) do
+ func.item = prevfuncs[n].item -- carry over cached items
+ if func.depth ~= prevfuncs[n].depth then
+ nochange = false
+ elseif nochange and prevfuncs[n].item then
+ if func.name ~= prevfuncs[n].name then
+ ctrl:SetItemText(prevfuncs[n].item, func.name)
+ if outcfg.sort then resort[ctrl:GetItemParent(prevfuncs[n].item)] = true end
+ end
+ if func.image ~= prevfuncs[n].image then
+ ctrl:SetItemImage(prevfuncs[n].item, func.image)
+ end
+ end
+ end
+ end
+ cache.funcs = funcs -- set new cache as positions may change
+ if nochange and not force then -- return if no visible changes
+ if outcfg.sort then -- resort items for all parents that have been modified
+ for item in pairs(resort) do ctrl:SortChildren(item) end
+ end
+ return
+ end
+ end
+
+ -- refresh the tree
+ -- refreshing shouldn't change the focus of the current element,
+ -- but it appears that DeleteChildren (wxwidgets 2.9.5 on Windows)
+ -- moves the focus from the current element to wxTreeCtrl.
+ -- need to save the window having focus and restore after the refresh.
+ local win = ide:GetMainFrame():FindFocus()
+
+ ctrl:Freeze()
+
+ -- disabling event handlers is not strictly necessary, but it's expected
+ -- to fix a crash on Windows that had DeleteChildren in the trace (#442).
+ ctrl:SetEvtHandlerEnabled(false)
+ ctrl:DeleteChildren(fileitem)
+ ctrl:SetEvtHandlerEnabled(true)
+
+ local edpos = editor:GetCurrentPos()+1
+ local stack = {fileitem}
+ local resort = {} -- items that need to be re-sorted
+ for n, func in ipairs(funcs) do
+ local depth = outcfg.showflat and 1 or func.depth
+ local parent = stack[depth]
+ while not parent do depth = depth - 1; parent = stack[depth] end
+ if not func.skip then
+ local item = ctrl:AppendItem(parent, func.name, func.image)
+ if ide.config.outline.showcurrentfunction
+ and edpos >= func.pos and func.poe and edpos <= func.poe then
+ ctrl:SetItemBold(item, true)
+ end
+ if outcfg.sort then resort[parent] = true end
+ setData(ctrl, item, n)
+ func.item = item
+ stack[func.depth+1] = item
+ end
+ func.skip = nil
+ end
+ if outcfg.sort then -- resort items for all parents that have been modified
+ for item in pairs(resort) do ctrl:SortChildren(item) end
+ end
+ if outcfg.showcompact then ctrl:Expand(fileitem) else ctrl:ExpandAllChildren(fileitem) end
+
+ -- scroll to the fileitem, but only if it's not a root item (as it's hidden)
+ if fileitem:GetValue() ~= ctrl:GetRootItem():GetValue() then
+ ctrl:ScrollTo(fileitem)
+ ctrl:SetScrollPos(wx.wxHORIZONTAL, 0, true)
+ else -- otherwise, scroll to the top
+ ctrl:SetScrollPos(wx.wxVERTICAL, 0, true)
+ end
+ ctrl:Thaw()
+
+ if win and win ~= ide:GetMainFrame():FindFocus() then win:SetFocus() end
+end
+
+local function indexFromQueue()
+ if #outline.indexqueue == 0 then return end
+
+ local editor = ide:GetEditor()
+ local inactivity = ide.config.symbolindexinactivity
+ if editor and inactivity and editor.updated > TimeGet()-inactivity then
+ -- reschedule timer for later time
+ resetIndexTimer()
+ else
+ local fname = table.remove(outline.indexqueue, 1)
+ outline.indexqueue[0][fname] = nil
+ -- check if fname is already loaded
+ ide:SetStatusFor(TR("Indexing %d files: '%s'..."):format(#outline.indexqueue+1, fname))
+ local content, err = FileRead(fname)
+ if content then
+ local editor = ide:CreateBareEditor()
+ editor:SetupKeywords(GetFileExt(fname))
+ editor:SetTextDyn(content)
+ editor:Colourise(0, -1)
+ editor:ResetTokenList()
+ while IndicateAll(editor) do end
+
+ outline:UpdateSymbols(fname, outlineRefresh(editor))
+ editor:Destroy()
+ else
+ DisplayOutputLn(TR("Can't open file '%s': %s"):format(fname, err))
+ end
+ if #outline.indexqueue == 0 then
+ outline:SaveSettings()
+ ide:SetStatusFor(TR("Indexing completed."))
+ end
+ ide:DoWhenIdle(indexFromQueue)
+ end
+ return
+end
+
+local function createOutlineWindow()
+ local REFRESH, REINDEX = 1, 2
+ local width, height = 360, 200
+ local ctrl = wx.wxTreeCtrl(ide.frame, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxSize(width, height),
+ wx.wxTR_LINES_AT_ROOT + wx.wxTR_HAS_BUTTONS
+ + wx.wxTR_HIDE_ROOT + wx.wxNO_BORDER)
+
+ outline.outlineCtrl = ctrl
+ ide.timers.outline = wx.wxTimer(ctrl, REFRESH)
+ ide.timers.symbolindex = wx.wxTimer(ctrl, REINDEX)
+
+ ctrl:AddRoot("Outline")
+ ctrl:SetImageList(outline.imglist)
+ ctrl:SetFont(ide.font.fNormal)
+
+ function ctrl:ActivateItem(item_id)
+ local data = ctrl:GetItemData(item_id)
+ if ctrl:GetItemImage(item_id) == image.FILE then
+ -- activate editor tab
+ local editor = data:GetData()
+ if not ide:GetEditorWithFocus(editor) then ide:GetDocument(editor):SetActive() end
+ else
+ -- activate tab and move cursor based on stored pos
+ -- get file parent
+ local onefile = (ide.config.outline or {}).showonefile
+ local parent = ctrl:GetItemParent(item_id)
+ if not onefile then -- find the proper parent
+ while parent:IsOk() and ctrl:GetItemImage(parent) ~= image.FILE do
+ parent = ctrl:GetItemParent(parent)
+ end
+ if not parent:IsOk() then return end
+ end
+ -- activate editor tab
+ local editor = onefile and GetEditor() or ctrl:GetItemData(parent):GetData()
+ local cache = caches[editor]
+ if editor and cache then
+ -- move to position in the file
+ editor:GotoPosEnforcePolicy(cache.funcs[data:GetData()].pos-1)
+ -- only set editor active after positioning as this may change focus,
+ -- which may regenerate the outline, which may invalidate `data` value
+ if not ide:GetEditorWithFocus(editor) then ide:GetDocument(editor):SetActive() end
+ end
+ end
+ end
+
+ local function activateByPosition(event)
+ local mask = (wx.wxTREE_HITTEST_ONITEMINDENT + wx.wxTREE_HITTEST_ONITEMLABEL
+ + wx.wxTREE_HITTEST_ONITEMICON + wx.wxTREE_HITTEST_ONITEMRIGHT)
+ local item_id, flags = ctrl:HitTest(event:GetPosition())
+
+ if item_id and item_id:IsOk() and bit.band(flags, mask) > 0 then
+ ctrl:ActivateItem(item_id)
+ else
+ event:Skip()
+ end
+ return true
+ end
+
+ ctrl:Connect(wx.wxEVT_TIMER, function(event)
+ if event:GetId() == REFRESH then outlineRefresh(GetEditor(), false) end
+ if event:GetId() == REINDEX then ide:DoWhenIdle(indexFromQueue) end
+ end)
+ ctrl:Connect(wx.wxEVT_LEFT_DOWN, activateByPosition)
+ ctrl:Connect(wx.wxEVT_LEFT_DCLICK, activateByPosition)
+ ctrl:Connect(wx.wxEVT_COMMAND_TREE_ITEM_ACTIVATED, function(event)
+ ctrl:ActivateItem(event:GetItem())
+ end)
+
+ ctrl:Connect(ID_OUTLINESORT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function()
+ ide.config.outline.sort = not ide.config.outline.sort
+ for editor, cache in pairs(caches) do
+ ide:SetStatus(("Refreshing '%s'..."):format(ide:GetDocument(editor):GetFileName()))
+ local isexpanded = ctrl:IsExpanded(cache.fileitem)
+ outlineRefresh(editor, true)
+ if not isexpanded then ctrl:Collapse(cache.fileitem) end
+ end
+ ide:SetStatus('')
+ end)
+
+ ctrl:Connect(wx.wxEVT_COMMAND_TREE_ITEM_MENU,
+ function (event)
+ local menu = wx.wxMenu {
+ { ID_OUTLINESORT, TR("Sort By Name"), "", wx.wxITEM_CHECK },
+ }
+ menu:Check(ID_OUTLINESORT, ide.config.outline.sort)
+
+ PackageEventHandle("onMenuOutline", menu, ctrl, event)
+
+ ctrl:PopupMenu(menu)
+ end)
+
+
+ local function reconfigure(pane)
+ pane:TopDockable(false):BottomDockable(false)
+ :MinSize(150,-1):BestSize(300,-1):FloatingSize(200,300)
+ end
+
+ local layout = ide:GetSetting("/view", "uimgrlayout")
+ if not layout or not layout:find("outlinepanel") then
+ ide:AddPanelDocked(ide:GetProjectNotebook(), ctrl, "outlinepanel", TR("Outline"), reconfigure, false)
+ else
+ ide:AddPanel(ctrl, "outlinepanel", TR("Outline"), reconfigure)
+ end
+end
+
+local function eachNode(eachFunc, root, recursive)
+ local ctrl = outline.outlineCtrl
+ local item = ctrl:GetFirstChild(root or ctrl:GetRootItem())
+ while true do
+ if not item:IsOk() then break end
+ if eachFunc and eachFunc(ctrl, item) then break end
+ if recursive and ctrl:ItemHasChildren(item) then eachNode(eachFunc, item, recursive) end
+ item = ctrl:GetNextSibling(item)
+ end
+end
+
+createOutlineWindow()
+
+local pathsep = GetPathSeparator()
+local function isInSubDir(name, path)
+ return #name > #path and path..pathsep == name:sub(1, #path+#pathsep)
+end
+
+local function isIgnoredInIndex(name)
+ local ignoredirs = outline.settings.ignoredirs
+ if ignoredirs[name] then return true end
+
+ -- check through ignored dirs to see if any of them match the file
+ for path in pairs(ignoredirs) do
+ if isInSubDir(name, path) then return true end
+ end
+
+ return false
+end
+
+local function purgeIndex(path)
+ local symbols = outline.settings.symbols
+ for name in pairs(symbols) do
+ if isInSubDir(name, path) then outline:UpdateSymbols(name, nil) end
+ end
+end
+
+local function purgeQueue(path)
+ local curqueue = outline.indexqueue
+ local newqueue = {[0] = {}}
+ for _, name in ipairs(curqueue) do
+ if not isInSubDir(name, path) then
+ table.insert(newqueue, name)
+ newqueue[0][name] = true
+ end
+ end
+ outline.indexqueue = newqueue
+end
+
+local function disableIndex(path)
+ outline.settings.ignoredirs[path] = true
+ outline:SaveSettings(true)
+
+ -- purge the path from the index and the (current) queue
+ purgeIndex(path)
+ purgeQueue(path)
+end
+
+local function enableIndex(path)
+ outline.settings.ignoredirs[path] = nil
+ outline:SaveSettings(true)
+ outline:RefreshSymbols(path)
+end
+
+local package = ide:AddPackage('core.outline', {
+ -- remove the editor from the list
+ onEditorClose = function(self, editor)
+ local cache = caches[editor]
+ local fileitem = cache and cache.fileitem
+ caches[editor] = nil -- remove from cache
+ if (ide.config.outline or {}).showonefile then return end
+ if fileitem then outline.outlineCtrl:Delete(fileitem) end
+ end,
+
+ -- handle rename of the file in the current editor
+ onEditorSave = function(self, editor)
+ if (ide.config.outline or {}).showonefile then return end
+ local cache = caches[editor]
+ local fileitem = cache and cache.fileitem
+ local doc = ide:GetDocument(editor)
+ local ctrl = outline.outlineCtrl
+ if doc and fileitem and ctrl:GetItemText(fileitem) ~= doc:GetTabText() then
+ ctrl:SetItemText(fileitem, doc:GetTabText())
+ end
+ local path = doc and doc:GetFilePath()
+ if path and cache and cache.funcs then
+ outline:UpdateSymbols(path, cache.funcs.updated > editor.updated and cache.funcs or nil)
+ outline:SaveSettings()
+ end
+ end,
+
+ -- go over the file items to turn bold on/off or collapse/expand
+ onEditorFocusSet = function(self, editor)
+ if (ide.config.outline or {}).showonefile and ide.config.outlineinactivity then
+ outlineRefresh(editor, true)
+ return
+ end
+
+ local cache = caches[editor]
+ local fileitem = cache and cache.fileitem
+ local ctrl = outline.outlineCtrl
+ local itemname = ide:GetDocument(editor):GetTabText()
+
+ -- update file name if it changed in the editor
+ if fileitem and ctrl:GetItemText(fileitem) ~= itemname then
+ ctrl:SetItemText(fileitem, itemname)
+ end
+
+ -- if the editor is not in the cache, which may happen if the user
+ -- quickly switches between tabs that don't have outline generated,
+ -- regenerate it manually
+ if not cache then resetOutlineTimer() end
+ resetIndexTimer()
+
+ eachNode(function(ctrl, item)
+ local found = fileitem and item:GetValue() == fileitem:GetValue()
+ if not found and ctrl:IsBold(item) then
+ ctrl:SetItemBold(item, false)
+ ctrl:CollapseAllChildren(item)
+ end
+ end)
+
+ if fileitem and not ctrl:IsBold(fileitem) then
+ -- run the following changes on idle as doing them inline is causing a strange
+ -- issue on OSX when clicking on a tab may skip several tabs (#546);
+ -- this is somehow caused by `ExpandAllChildren` triggered from `SetFocus` inside
+ -- `PAGE_CHANGED` handler for the notebook.
+ ide:DoWhenIdle(function()
+ ctrl:SetItemBold(fileitem, true)
+ if (ide.config.outline or {}).showcompact then
+ ctrl:Expand(fileitem)
+ else
+ ctrl:ExpandAllChildren(fileitem)
+ end
+ ctrl:ScrollTo(fileitem)
+ ctrl:SetScrollPos(wx.wxHORIZONTAL, 0, true)
+ end)
+ end
+ end,
+
+ onMenuFiletree = function(self, menu, tree, event)
+ local item_id = event:GetItem()
+ local name = tree:GetItemFullName(item_id)
+ local symboldirmenu = wx.wxMenu {
+ {ID_SYMBOLDIRREFRESH, TR("Refresh Index"), TR("Refresh indexed symbols from files in the selected directory")},
+ {ID_SYMBOLDIRDISABLE, TR("Disable Indexing For '%s'"):format(name), TR("Ignore and don't index symbols from files in the selected directory")},
+ }
+ local _, _, projdirpos = ide:FindMenuItem(ID_PROJECTDIR, menu)
+ if projdirpos then
+ local ignored = isIgnoredInIndex(name)
+ local enabledirmenu = wx.wxMenu()
+ local paths = {}
+ for path in pairs(outline.settings.ignoredirs) do table.insert(paths, path) end
+ table.sort(paths)
+ for i, path in ipairs(paths) do
+ local id = ID("file.enablesymboldir."..i)
+ enabledirmenu:Append(id, path, "")
+ tree:Connect(id, wx.wxEVT_COMMAND_MENU_SELECTED, function() enableIndex(path) end)
+ end
+
+ symboldirmenu:Append(wx.wxMenuItem(symboldirmenu, ID_SYMBOLDIRENABLE,
+ TR("Enable Indexing"), "", wx.wxITEM_NORMAL, enabledirmenu))
+ menu:Insert(projdirpos+1, wx.wxMenuItem(menu, ID_SYMBOLDIRINDEX,
+ TR("Symbol Index"), "", wx.wxITEM_NORMAL, symboldirmenu))
+
+ -- disable "enable" if it's empty
+ menu:Enable(ID_SYMBOLDIRENABLE, #paths > 0)
+ -- disable "refresh" and "disable" if the directory is ignored
+ -- or if any of the directories above it are ignored
+ menu:Enable(ID_SYMBOLDIRREFRESH, tree:IsDirectory(item_id) and not ignored)
+ menu:Enable(ID_SYMBOLDIRDISABLE, tree:IsDirectory(item_id) and not ignored)
+
+ tree:Connect(ID_SYMBOLDIRREFRESH, wx.wxEVT_COMMAND_MENU_SELECTED, function()
+ -- purge files in this directory as some might have been removed;
+ -- files will be purged based on time, but this is a good time to clean.
+ purgeIndex(name)
+ outline:RefreshSymbols(name)
+ resetIndexTimer(1) -- start after 1ms
+ end)
+ tree:Connect(ID_SYMBOLDIRDISABLE, wx.wxEVT_COMMAND_MENU_SELECTED, function()
+ disableIndex(name)
+ end)
+ end
+ end,
+
+ onEditorPainted = function(self, editor)
+ local ctrl = ide.outline.outlineCtrl
+ if not ide:IsWindowShown(ctrl) then return end
+
+ local cache = caches[editor]
+ if not cache or not ide.config.outline.showcurrentfunction then return end
+
+ local edpos = editor:GetCurrentPos()+1
+ local edline = editor:LineFromPosition(edpos-1)+1
+ if cache.pos and cache.pos == edpos then return end
+ if cache.line and cache.line == edline then return end
+
+ cache.pos = edpos
+ cache.line = edline
+
+ local n = 0
+ local MIN, MAX = 1, 2
+ local visible = {[MIN] = math.huge, [MAX] = 0}
+ local needshown = {[MIN] = math.huge, [MAX] = 0}
+
+ ctrl:Unselect()
+ -- scan all items recursively starting from the current file
+ eachNode(function(ctrl, item)
+ local func = cache.funcs[ctrl:GetItemData(item):GetData()]
+ local val = edpos >= func.pos and func.poe and edpos <= func.poe
+ if edline == editor:LineFromPosition(func.pos)+1
+ or (func.poe and edline == editor:LineFromPosition(func.poe)+1) then
+ cache.line = nil
+ end
+ ctrl:SetItemBold(item, val)
+ if val then ctrl:SelectItem(item, val) end
+
+ if not ide.config.outline.jumptocurrentfunction then return end
+ n = n + 1
+ -- check that this and the items around it are all visible;
+ -- this is to avoid the situation when the current item is only partially visible
+ local isvisible = ctrl:IsVisible(item) and ctrl:GetNextVisible(item):IsOk() and ctrl:GetPrevVisible(item):IsOk()
+ if val and not isvisible then
+ needshown[MIN] = math.min(needshown[MIN], n)
+ needshown[MAX] = math.max(needshown[MAX], n)
+ elseif isvisible then
+ visible[MIN] = math.min(visible[MIN], n)
+ visible[MAX] = math.max(visible[MAX], n)
+ end
+ end, cache.fileitem, true)
+
+ if not ide.config.outline.jumptocurrentfunction then return end
+ if needshown[MAX] > visible[MAX] then
+ ctrl:ScrollLines(needshown[MAX]-visible[MAX]) -- scroll forward to the last hidden line
+ elseif needshown[MIN] < visible[MIN] then
+ ctrl:ScrollLines(needshown[MIN]-visible[MIN]) -- scroll backward to the first hidden line
+ end
+ end,
+ })
+
+local function queuePath(path)
+ -- only queue if symbols inactivity is set, so files will be indexed
+ if ide.config.symbolindexinactivity and not outline.indexqueue[0][path] then
+ outline.indexqueue[0][path] = true
+ table.insert(outline.indexqueue, 1, path)
+ end
+end
+
+function outline:GetFileSymbols(path)
+ local symbols = self.settings.symbols[path]
+ -- queue path to process when appropriate
+ if not symbols then queuePath(path) end
+ return symbols
+end
+
+function outline:GetEditorSymbols(editor)
+ -- force token refresh (as these may be not updated yet)
+ if #editor:GetTokenList() == 0 then
+ while IndicateAll(editor) do end
+ end
+
+ -- only refresh the functions when none is present
+ if not caches[editor] or #caches[editor].funcs == 0 then outlineRefresh(editor, true) end
+ return caches[editor].funcs
+end
+
+function outline:RefreshSymbols(path, callback)
+ if isIgnoredInIndex(path) then return end
+
+ local exts = {}
+ for _, ext in pairs(ide:GetKnownExtensions()) do
+ local spec = GetSpec(ext)
+ if spec and spec.marksymbols then table.insert(exts, ext) end
+ end
+
+ local opts = {sort = false, folder = false, skipbinary = true, yield = true,
+ -- skip those directories that are on the "ignore" list
+ ondirectory = function(name) return outline.settings.ignoredirs[name] == nil end
+ }
+ local nextfile = coroutine.wrap(function() FileSysGetRecursive(path, true, table.concat(exts, ";"), opts) end)
+ while true do
+ local file = nextfile()
+ if not file then break end
+ if not isIgnoredInIndex(file) then (callback or queuePath)(file) end
+ end
+end
+
+function outline:UpdateSymbols(fname, symb)
+ local symbols = self.settings.symbols
+ symbols[fname] = symb
+
+ -- purge outdated records
+ local threshold = TimeGet() - 60*60*24*7 -- cache for 7 days
+ if not self.indexpurged then
+ for k, v in pairs(symbols) do
+ if v.updated < threshold then symbols[k] = nil end
+ end
+ self.indexpurged = true
+ end
+
+ self.needsaving = true
+end
+
+function outline:SaveSettings(force)
+ if self.needsaving or force then
+ ide:PushStatus(TR("Updating symbol index and settings..."))
+ package:SetSettings(self.settings, {keyignore = {depth = true, image = true, poe = true, item = true, skip = true}})
+ ide:PopStatus()
+ self.needsaving = false
+ end
+end
+
+MergeSettings(outline.settings, package:GetSettings())
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/output.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/output.lua
new file mode 100644
index 0000000..523ac8c
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/output.lua
@@ -0,0 +1,498 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Lomtik Software (J. Winwood & John Labenski)
+-- Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+local frame = ide.frame
+local bottomnotebook = frame.bottomnotebook
+local errorlog = bottomnotebook.errorlog
+
+-------
+-- setup errorlog
+local MESSAGE_MARKER = StylesGetMarker("message")
+local PROMPT_MARKER = StylesGetMarker("prompt")
+local PROMPT_MARKER_VALUE = 2^PROMPT_MARKER
+
+errorlog:Show(true)
+errorlog:SetFont(ide.font.oNormal)
+errorlog:StyleSetFont(wxstc.wxSTC_STYLE_DEFAULT, ide.font.oNormal)
+errorlog:SetBufferedDraw(not ide.config.hidpi and true or false)
+errorlog:StyleClearAll()
+errorlog:SetMarginWidth(1, 16) -- marker margin
+errorlog:SetMarginType(1, wxstc.wxSTC_MARGIN_SYMBOL)
+errorlog:MarkerDefine(StylesGetMarker("message"))
+errorlog:MarkerDefine(StylesGetMarker("prompt"))
+errorlog:SetReadOnly(true)
+if (ide.config.outputshell.usewrap) then
+ errorlog:SetWrapMode(wxstc.wxSTC_WRAP_WORD)
+ errorlog:SetWrapStartIndent(0)
+ errorlog:SetWrapVisualFlags(wxstc.wxSTC_WRAPVISUALFLAG_END)
+ errorlog:SetWrapVisualFlagsLocation(wxstc.wxSTC_WRAPVISUALFLAGLOC_END_BY_TEXT)
+end
+
+StylesApplyToEditor(ide.config.stylesoutshell,errorlog,ide.font.oNormal,ide.font.oItalic)
+
+function ClearOutput(force)
+ if not (force or ide:GetMenuBar():IsChecked(ID_CLEAROUTPUT)) then return end
+ errorlog:SetReadOnly(false)
+ errorlog:ClearAll()
+ errorlog:SetReadOnly(true)
+end
+
+local inputBound = 0 -- to track where partial output ends for input editing purposes
+local function getInputLine()
+ return errorlog:MarkerPrevious(errorlog:GetLineCount()+1, PROMPT_MARKER_VALUE)
+end
+local function getInputText(bound)
+ return errorlog:GetTextRangeDyn(
+ errorlog:PositionFromLine(getInputLine())+(bound or 0), errorlog:GetLength())
+end
+local function updateInputMarker()
+ local lastline = errorlog:GetLineCount()-1
+ errorlog:MarkerDeleteAll(PROMPT_MARKER)
+ errorlog:MarkerAdd(lastline, PROMPT_MARKER)
+ inputBound = #getInputText()
+end
+function OutputEnableInput() updateInputMarker() end
+
+function DisplayOutputNoMarker(...)
+ local message = ""
+ local cnt = select('#',...)
+ for i=1,cnt do
+ local v = select(i,...)
+ message = message..tostring(v)..(i<cnt and "\t" or "")
+ end
+
+ local promptLine = getInputLine()
+ local insertedAt = promptLine == -1 and errorlog:GetLength() or errorlog:PositionFromLine(promptLine) + inputBound
+ local current = errorlog:GetReadOnly()
+ errorlog:SetReadOnly(false)
+ errorlog:InsertTextDyn(insertedAt, errorlog.useraw and message or FixUTF8(message, "\022"))
+ errorlog:EmptyUndoBuffer()
+ errorlog:SetReadOnly(current)
+ errorlog:GotoPos(errorlog:GetLength())
+ if promptLine ~= -1 then updateInputMarker() end
+end
+function DisplayOutput(...)
+ errorlog:MarkerAdd(errorlog:GetLineCount()-1, MESSAGE_MARKER)
+ DisplayOutputNoMarker(...)
+end
+function DisplayOutputLn(...)
+ DisplayOutput(...)
+ DisplayOutputNoMarker("\n")
+end
+
+local streamins = {}
+local streamerrs = {}
+local streamouts = {}
+local customprocs = {}
+local textout = '' -- this is a buffer for any text sent to external scripts
+
+function DetachChildProcess()
+ for _, custom in pairs(customprocs) do
+ -- since processes are detached, their END_PROCESS event is not going
+ -- to be called; call endcallback() manually if registered.
+ if custom.endcallback then custom.endcallback() end
+ if custom.proc then custom.proc:Detach() end
+ end
+end
+
+function CommandLineRunning(uid)
+ for pid, custom in pairs(customprocs) do
+ if (custom.uid == uid and custom.proc and custom.proc.Exists(tonumber(pid))) then
+ return pid, custom.proc
+ end
+ end
+
+ return
+end
+
+function CommandLineToShell(uid,state)
+ for pid,custom in pairs(customprocs) do
+ if (pid == uid or custom.uid == uid) and custom.proc and custom.proc.Exists(tonumber(pid)) then
+ if (streamins[pid]) then streamins[pid].toshell = state end
+ if (streamerrs[pid]) then streamerrs[pid].toshell = state end
+ return true
+ end
+ end
+end
+
+-- logic to "unhide" wxwidget window using winapi
+pcall(require, 'winapi')
+local checkstart, checknext, checkperiod
+local pid = nil
+local function unHideWindow(pidAssign)
+ -- skip if not configured to do anything
+ if not ide.config.unhidewindow then return end
+ if pidAssign then
+ pid = pidAssign > 0 and pidAssign or nil
+ end
+ if pid and winapi then
+ local now = TimeGet()
+ if pidAssign and pidAssign > 0 then
+ checkstart, checknext, checkperiod = now, now, 0.02
+ end
+ if now - checkstart > 1 and checkperiod < 0.5 then
+ checkperiod = checkperiod * 2
+ end
+ if now >= checknext then
+ checknext = now + checkperiod
+ else
+ return
+ end
+ local wins = winapi.find_all_windows(function(w)
+ return w:get_process():get_pid() == pid
+ end)
+ local any = ide.interpreter.unhideanywindow
+ local show, hide, ignore = 1, 2, 0
+ for _,win in pairs(wins) do
+ -- win:get_class_name() can return nil if the window is already gone
+ -- between getting the list and this check.
+ local action = ide.config.unhidewindow[win:get_class_name()]
+ or (any and show or ignore)
+ if action == show and not win:is_visible()
+ or action == hide and win:is_visible() then
+ -- use show_async call (ShowWindowAsync) to avoid blocking the IDE
+ -- if the app is busy or is being debugged
+ win:show_async(action == show and winapi.SW_SHOW or winapi.SW_HIDE)
+ pid = nil -- indicate that unhiding is done
+ end
+ end
+ end
+end
+
+local function nameTab(tab, name)
+ local index = bottomnotebook:GetPageIndex(tab)
+ if index ~= -1 then bottomnotebook:SetPageText(index, name) end
+end
+
+function OutputSetCallbacks(pid, proc, callback, endcallback)
+ local streamin = proc and proc:GetInputStream()
+ local streamerr = proc and proc:GetErrorStream()
+ if streamin then
+ streamins[pid] = {stream=streamin, callback=callback,
+ proc=proc, check=proc and proc.IsInputAvailable}
+ end
+ if streamerr then
+ streamerrs[pid] = {stream=streamerr, callback=callback,
+ proc=proc, check=proc and proc.IsErrorAvailable}
+ end
+ customprocs[pid] = {proc=proc, endcallback=endcallback}
+end
+
+function CommandLineRun(cmd,wdir,tooutput,nohide,stringcallback,uid,endcallback)
+ if (not cmd) then return end
+
+ -- expand ~ at the beginning of the command
+ if ide.oshome and cmd:find('~') then
+ cmd = cmd:gsub([[^(['"]?)~]], '%1'..ide.oshome:gsub('[\\/]$',''), 1)
+ end
+
+ -- try to extract the name of the executable from the command
+ -- the executable may not have the extension and may be in quotes
+ local exename = string.gsub(cmd, "\\", "/")
+ local _,_,fullname = string.find(exename,'^[\'"]([^\'"]+)[\'"]')
+ exename = fullname and string.match(fullname,'/?([^/]+)$')
+ or string.match(exename,'/?([^/]-)%s') or exename
+
+ uid = uid or exename
+
+ if (CommandLineRunning(uid)) then
+ DisplayOutputLn(TR("Program can't start because conflicting process is running as '%s'.")
+ :format(cmd))
+ return
+ end
+
+ DisplayOutputLn(TR("Program starting as '%s'."):format(cmd))
+
+ local proc = wx.wxProcess(errorlog)
+ if (tooutput) then proc:Redirect() end -- redirect the output if requested
+
+ -- set working directory if specified
+ local oldcwd
+ if (wdir and #wdir > 0) then -- directory can be empty; ignore in this case
+ oldcwd = wx.wxFileName.GetCwd()
+ oldcwd = wx.wxFileName.SetCwd(wdir) and oldcwd
+ end
+
+ -- launch process
+ local params = wx.wxEXEC_ASYNC + wx.wxEXEC_MAKE_GROUP_LEADER + (nohide and wx.wxEXEC_NOHIDE or 0)
+ local pid = wx.wxExecute(cmd, params, proc)
+
+ if oldcwd then wx.wxFileName.SetCwd(oldcwd) end
+
+ -- For asynchronous execution, the return value is the process id and
+ -- zero value indicates that the command could not be executed.
+ -- The return value of -1 in this case indicates that we didn't launch
+ -- a new process, but connected to the running one (e.g. DDE under Windows).
+ if not pid or pid == -1 or pid == 0 then
+ DisplayOutputLn(TR("Program unable to run as '%s'."):format(cmd))
+ return
+ end
+
+ DisplayOutputLn(TR("Program '%s' started in '%s' (pid: %d).")
+ :format(uid, (wdir and wdir or wx.wxFileName.GetCwd()), pid))
+
+ OutputSetCallbacks(pid, proc, stringcallback, endcallback)
+ customprocs[pid].uid=uid
+ customprocs[pid].started = TimeGet()
+
+ local streamout = proc and proc:GetOutputStream()
+ if streamout then streamouts[pid] = {stream=streamout, callback=stringcallback, out=true} end
+
+ unHideWindow(pid)
+ nameTab(errorlog, TR("Output (running)"))
+
+ return pid
+end
+
+local readonce = 4096
+local maxread = readonce * 10 -- maximum number of bytes to read before pausing
+local function getStreams()
+ local function readStream(tab)
+ for _,v in pairs(tab) do
+ -- periodically stop reading to get a chance to process other events
+ local processed = 0
+ while (v.check(v.proc) and processed <= maxread) do
+ local str = v.stream:Read(readonce)
+ -- the buffer has readonce bytes, so cut it to the actual size
+ str = str:sub(1, v.stream:LastRead())
+ processed = processed + #str
+
+ local pfn
+ if (v.callback) then
+ str,pfn = v.callback(str)
+ end
+ if not str then
+ -- skip if nothing to display
+ elseif (v.toshell) then
+ DisplayShell(str)
+ else
+ DisplayOutputNoMarker(str)
+ if str and (getInputLine() > -1 or errorlog:GetReadOnly()) then
+ ActivateOutput()
+ updateInputMarker()
+ end
+ end
+ pfn = pfn and pfn()
+ end
+ end
+ end
+ local function sendStream(tab)
+ local str = textout
+ if not str then return end
+ textout = nil
+ str = str .. "\n"
+ for _,v in pairs(tab) do
+ local pfn
+ if (v.callback) then
+ str,pfn = v.callback(str)
+ end
+ v.stream:Write(str, #str)
+ updateInputMarker()
+ pfn = pfn and pfn()
+ end
+ end
+
+ readStream(streamins)
+ readStream(streamerrs)
+ sendStream(streamouts)
+end
+
+errorlog:Connect(wx.wxEVT_END_PROCESS, function(event)
+ local pid = event:GetPid()
+ if (pid ~= -1) then
+ getStreams()
+ streamins[pid] = nil
+ streamerrs[pid] = nil
+ streamouts[pid] = nil
+
+ if not customprocs[pid] then return end
+ if customprocs[pid].endcallback then customprocs[pid].endcallback() end
+ -- if this wasn't started with CommandLineRun, skip the rest
+ if not customprocs[pid].uid then return end
+
+ -- delete markers and set focus to the editor if there is an input marker
+ if errorlog:MarkerPrevious(errorlog:GetLineCount(), PROMPT_MARKER_VALUE) > -1 then
+ errorlog:MarkerDeleteAll(PROMPT_MARKER)
+ local editor = GetEditor()
+ -- check if editor still exists; it may not if the window is closed
+ if editor then editor:SetFocus() end
+ end
+ unHideWindow(0)
+ DebuggerStop(true)
+ nameTab(errorlog, TR("Output"))
+ DisplayOutputLn(TR("Program completed in %.2f seconds (pid: %d).")
+ :format(TimeGet() - customprocs[pid].started, pid))
+ customprocs[pid] = nil
+ end
+ end)
+
+errorlog:Connect(wx.wxEVT_IDLE, function()
+ if (#streamins or #streamerrs) then getStreams() end
+ if ide.osname == 'Windows' then unHideWindow() end
+ end)
+
+local jumptopatterns = {
+ -- <filename>(line,linepos):
+ "^%s*(.-)%((%d+),(%d+)%)%s*:",
+ -- <filename>(line):
+ "^%s*(.-)%((%d+).*%)%s*:",
+ --[string "<filename>"]:line:
+ '^.-%[string "([^"]+)"%]:(%d+)%s*:',
+ -- <filename>:line:linepos
+ "^%s*(.-):(%d+):(%d+):",
+ -- <filename>:line:
+ "^%s*(.-):(%d+)%s*:",
+}
+
+errorlog:Connect(wxstc.wxEVT_STC_DOUBLECLICK,
+ function(event)
+ local line = errorlog:GetCurrentLine()
+ local linetx = errorlog:GetLineDyn(line)
+
+ -- try to detect a filename and line in linetx
+ local fname, jumpline, jumplinepos
+ for _,pattern in ipairs(jumptopatterns) do
+ fname,jumpline,jumplinepos = linetx:match(pattern)
+ if (fname and jumpline) then break end
+ end
+
+ if not (fname and jumpline) then return end
+
+ -- fname may include name of executable, as in "path/to/lua: file.lua";
+ -- strip it and try to find match again if needed.
+ -- try the stripped name first as if it doesn't match, the longer
+ -- name may have parts that may be interpreter as network path and
+ -- may take few seconds to check.
+ local name
+ local fixedname = fname:match(":%s+(.+)")
+ if fixedname then
+ name = GetFullPathIfExists(FileTreeGetDir(), fixedname)
+ or FileTreeFindByPartialName(fixedname)
+ end
+ name = name
+ or GetFullPathIfExists(FileTreeGetDir(), fname)
+ or FileTreeFindByPartialName(fname)
+
+ local editor = LoadFile(name or fname,nil,true)
+ if not editor then
+ local ed = GetEditor()
+ if ed and ide:GetDocument(ed):GetFileName() == (name or fname) then
+ editor = ed
+ end
+ end
+ if editor then
+ jumpline = tonumber(jumpline)
+ jumplinepos = tonumber(jumplinepos)
+
+ editor:GotoPos(editor:PositionFromLine(math.max(0,jumpline-1))
+ + (jumplinepos and (math.max(0,jumplinepos-1)) or 0))
+ editor:EnsureVisibleEnforcePolicy(jumpline)
+ editor:SetFocus()
+ end
+
+ -- doubleclick can set selection, so reset it
+ local pos = event:GetPosition()
+ if pos == -1 then pos = errorlog:GetLineEndPosition(event:GetLine()) end
+ errorlog:SetSelection(pos, pos)
+ end)
+
+local function positionInLine(line)
+ return errorlog:GetCurrentPos() - errorlog:PositionFromLine(line)
+end
+local function caretOnInputLine(disallowLeftmost)
+ local inputLine = getInputLine()
+ local boundary = inputBound + (disallowLeftmost and 0 or -1)
+ return (errorlog:GetCurrentLine() > inputLine
+ or errorlog:GetCurrentLine() == inputLine
+ and positionInLine(inputLine) > boundary)
+end
+
+errorlog:Connect(wx.wxEVT_KEY_DOWN,
+ function (event)
+ -- this loop is only needed to allow to get to the end of function easily
+ -- "return" aborts the processing and ignores the key
+ -- "break" aborts the processing and processes the key normally
+ while true do
+ -- no special processing if it's readonly
+ if errorlog:GetReadOnly() then break end
+
+ local key = event:GetKeyCode()
+ if key == wx.WXK_UP or key == wx.WXK_NUMPAD_UP then
+ if errorlog:GetCurrentLine() > getInputLine() then break
+ else return end
+ elseif key == wx.WXK_DOWN or key == wx.WXK_NUMPAD_DOWN then
+ break -- can go down
+ elseif key == wx.WXK_LEFT or key == wx.WXK_NUMPAD_LEFT then
+ if not caretOnInputLine(true) then return end
+ elseif key == wx.WXK_BACK then
+ if not caretOnInputLine(true) then return end
+ elseif key == wx.WXK_DELETE or key == wx.WXK_NUMPAD_DELETE then
+ if not caretOnInputLine()
+ or errorlog:LineFromPosition(errorlog:GetSelectionStart()) < getInputLine() then
+ return
+ end
+ elseif key == wx.WXK_PAGEUP or key == wx.WXK_NUMPAD_PAGEUP
+ or key == wx.WXK_PAGEDOWN or key == wx.WXK_NUMPAD_PAGEDOWN
+ or key == wx.WXK_END or key == wx.WXK_NUMPAD_END
+ or key == wx.WXK_HOME or key == wx.WXK_NUMPAD_HOME
+ or key == wx.WXK_RIGHT or key == wx.WXK_NUMPAD_RIGHT
+ or key == wx.WXK_SHIFT or key == wx.WXK_CONTROL
+ or key == wx.WXK_ALT then
+ break
+ elseif key == wx.WXK_RETURN or key == wx.WXK_NUMPAD_ENTER then
+ if not caretOnInputLine()
+ or errorlog:LineFromPosition(errorlog:GetSelectionStart()) < getInputLine() then
+ return
+ end
+ errorlog:GotoPos(errorlog:GetLength()) -- move to the end
+ textout = (textout or '') .. getInputText(inputBound)
+ -- remove selection if any, otherwise the text gets replaced
+ errorlog:SetSelection(errorlog:GetSelectionEnd()+1,errorlog:GetSelectionEnd())
+ break -- don't need to do anything else with return
+ else
+ -- move cursor to end if not already there
+ if not caretOnInputLine() then
+ errorlog:GotoPos(errorlog:GetLength())
+ -- check if the selection starts before the input line and reset it
+ elseif errorlog:LineFromPosition(errorlog:GetSelectionStart()) < getInputLine(-1) then
+ errorlog:GotoPos(errorlog:GetLength())
+ errorlog:SetSelection(errorlog:GetSelectionEnd()+1,errorlog:GetSelectionEnd())
+ end
+ end
+ break
+ end
+ event:Skip()
+ end)
+
+local function inputEditable(line)
+ local inputLine = getInputLine()
+ local currentLine = line or errorlog:GetCurrentLine()
+ return inputLine > -1 and
+ (currentLine > inputLine or
+ currentLine == inputLine and positionInLine(inputLine) >= inputBound) and
+ not (errorlog:LineFromPosition(errorlog:GetSelectionStart()) < getInputLine())
+end
+
+errorlog:Connect(wxstc.wxEVT_STC_UPDATEUI,
+ function () errorlog:SetReadOnly(not inputEditable()) end)
+
+-- only allow copy/move text by dropping to the input line
+errorlog:Connect(wxstc.wxEVT_STC_DO_DROP,
+ function (event)
+ if not inputEditable(errorlog:LineFromPosition(event:GetPosition())) then
+ event:SetDragResult(wx.wxDragNone)
+ end
+ end)
+
+if ide.config.outputshell.nomousezoom then
+ -- disable zoom using mouse wheel as it triggers zooming when scrolling
+ -- on OSX with kinetic scroll and then pressing CMD.
+ errorlog:Connect(wx.wxEVT_MOUSEWHEEL,
+ function (event)
+ if wx.wxGetKeyState(wx.WXK_CONTROL) then return end
+ event:Skip()
+ end)
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/package.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/package.lua
new file mode 100644
index 0000000..004bcd0
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/package.lua
@@ -0,0 +1,735 @@
+-- Copyright 2013-15 Paul Kulchenko, ZeroBrane LLC
+---------------------------------------------------------
+
+local ide = ide
+local iscaseinsensitive = wx.wxFileName("A"):SameAs(wx.wxFileName("a"))
+local unpack = table.unpack or unpack
+local q = EscapeMagic
+
+local function eventHandle(handlers, event, ...)
+ local success
+ for package, handler in pairs(handlers) do
+ local ok, res = pcall(handler, package, ...)
+ if ok then
+ if res == false then success = false end
+ else
+ DisplayOutputLn(TR("%s event failed: %s"):format(event, res))
+ end
+ end
+ return success
+end
+
+local function getEventHandlers(packages, event)
+ local handlers = {}
+ for _, package in pairs(packages) do
+ if package[event] then handlers[package] = package[event] end
+ end
+ return handlers
+end
+
+function PackageEventHandle(event, ...)
+ return eventHandle(getEventHandlers(ide.packages, event), event, ...)
+end
+
+function PackageEventHandleOnce(event, ...)
+ -- copy packages as the event that is handled only once needs to be removed
+ local handlers = getEventHandlers(ide.packages, event)
+ -- remove all handlers as they need to be called only once
+ -- this allows them to be re-installed if needed
+ for _, package in pairs(ide.packages) do package[event] = nil end
+ return eventHandle(handlers, event, ...)
+end
+
+local function PackageEventHandleOne(file, event, ...)
+ local package = ide.packages[file]
+ if package and type(package[event]) == 'function' then
+ local ok, res = pcall(package[event], package, ...)
+ if ok then
+ if res == false then return false end
+ else
+ DisplayOutputLn(TR("%s event failed: %s"):format(event, res))
+ end
+ end
+end
+
+function PackageUnRegister(file, ...)
+ PackageEventHandleOne(file, "onUnRegister", ...)
+ -- remove from the list of installed packages
+ local package = ide.packages[file]
+ ide.packages[file] = nil
+ return package
+end
+
+function PackageRegister(file, ...)
+ if not ide.packages[file] then
+ local packages = {}
+ local package = MergeFullPath(
+ GetPathWithSep(ide.editorFilename), "packages/"..file..".lua")
+ LoadLuaFileExt(packages, package, ide.proto.Plugin)
+ packages[file].fname = file
+ ide.packages[file] = packages[file]
+ end
+ return PackageEventHandleOne(file, "onRegister", ...)
+end
+
+function ide:GetRootPath(path)
+ return MergeFullPath(GetPathWithSep(self.editorFilename), path or '')
+end
+function ide:GetPackagePath(packname)
+ return MergeFullPath(
+ self.oshome and MergeFullPath(self.oshome, '.'..self:GetAppName()..'/') or self:GetRootPath(),
+ MergeFullPath('packages', packname or '')
+ )
+end
+function ide:GetApp() return self.editorApp end
+function ide:GetAppName() return self.appname end
+function ide:GetEditor(index) return GetEditor(index) end
+function ide:GetEditorWithFocus(...) return GetEditorWithFocus(...) end
+function ide:GetEditorWithLastFocus()
+ -- make sure ide.infocus is still a valid component and not "some" userdata
+ return (self:IsValidCtrl(self.infocus)
+ and self.infocus:GetClassInfo():GetClassName() == "wxStyledTextCtrl"
+ and self.infocus:DynamicCast("wxStyledTextCtrl") or nil)
+end
+function ide:GetMenuBar() return self.frame.menuBar end
+function ide:GetStatusBar() return self.frame.statusBar end
+function ide:GetToolBar() return self.frame.toolBar end
+function ide:GetDebugger() return self.debugger end
+function ide:GetMainFrame() return self.frame end
+function ide:GetUIManager() return self.frame.uimgr end
+function ide:GetDocument(ed) return ed and self.openDocuments[ed:GetId()] end
+function ide:GetDocuments() return self.openDocuments end
+function ide:GetKnownExtensions(ext)
+ local knownexts, extmatch = {}, ext and ext:lower()
+ for _, spec in pairs(self.specs) do
+ for _, ext in ipairs(spec.exts or {}) do
+ if not extmatch or extmatch == ext:lower() then
+ table.insert(knownexts, ext)
+ end
+ end
+ end
+ table.sort(knownexts)
+ return knownexts
+end
+
+function ide:DoWhenIdle(func) table.insert(self.onidle, func) end
+
+function ide:FindTopMenu(item)
+ local index = self:GetMenuBar():FindMenu((TR)(item))
+ return self:GetMenuBar():GetMenu(index), index
+end
+function ide:FindMenuItem(itemid, menu)
+ local item, imenu = self:GetMenuBar():FindItem(itemid, menu)
+ if menu and not item then item = menu:FindItem(itemid) end
+ if not item then return end
+ menu = menu or imenu
+
+ for pos = 0, menu:GetMenuItemCount()-1 do
+ if menu:FindItemByPosition(pos):GetId() == itemid then
+ return item, menu, pos
+ end
+ end
+ return
+end
+function ide:AttachMenu(...)
+ -- AttachMenu([targetmenu,] id, submenu)
+ -- `targetmenu` is only needed for menus not attached to the main menubar
+ local menu, id, submenu = ...
+ if select('#', ...) == 2 then menu, id, submenu = nil, ... end
+ local item, menu, pos = self:FindMenuItem(id, menu)
+ if not item then return end
+
+ local menuitem = wx.wxMenuItem(menu, id, item:GetItemLabel(), item:GetHelp(), wx.wxITEM_NORMAL, submenu)
+ menu:Destroy(item)
+ return menu:Insert(pos, menuitem), pos
+end
+function ide:CloneMenu(menu)
+ if not menu then return end
+ local newmenu = wx.wxMenu()
+ local node = menu:GetMenuItems():GetFirst()
+ while node do
+ local item = node:GetData():DynamicCast("wxMenuItem")
+ newmenu:Append(item:GetId(), item:GetItemLabel(), item:GetHelp(), item:GetKind())
+ node = node:GetNext()
+ end
+ return newmenu
+end
+
+function ide:FindDocument(path)
+ local fileName = wx.wxFileName(path)
+ for _, doc in pairs(self:GetDocuments()) do
+ if doc.filePath and fileName:SameAs(wx.wxFileName(doc.filePath)) then
+ return doc
+ end
+ end
+ return
+end
+function ide:FindDocumentsByPartialPath(path)
+ local seps = "[\\/]"
+ -- add trailing path separator to make sure full directory match
+ if not path:find(seps.."$") then path = path .. GetPathSeparator() end
+ local pattern = "^"..q(path):gsub(seps, seps)
+ local lpattern = pattern:lower()
+
+ local docs = {}
+ for _, doc in pairs(self:GetDocuments()) do
+ if doc.filePath
+ and (doc.filePath:find(pattern)
+ or iscaseinsensitive and doc.filePath:lower():find(lpattern)) then
+ table.insert(docs, doc)
+ end
+ end
+ return docs
+end
+function ide:GetInterpreter() return self.interpreter end
+function ide:GetInterpreters() return self.interpreters end
+function ide:GetConfig() return self.config end
+function ide:GetOutput() return self.frame.bottomnotebook.errorlog end
+function ide:GetConsole() return self.frame.bottomnotebook.shellbox end
+function ide:GetEditorNotebook() return self.frame.notebook end
+function ide:GetOutputNotebook() return self.frame.bottomnotebook end
+function ide:GetOutline() return self.outline end
+function ide:GetProjectNotebook() return self.frame.projnotebook end
+function ide:GetProject() return FileTreeGetDir() end
+function ide:GetProjectStartFile()
+ local projectdir = FileTreeGetDir()
+ local startfile = self.filetree.settings.startfile[projectdir]
+ return MergeFullPath(projectdir, startfile), startfile
+end
+function ide:GetLaunchedProcess() return self.debugger and self.debugger.pid end
+function ide:GetProjectTree() return self.filetree.projtreeCtrl end
+function ide:GetOutlineTree() return self.outline.outlineCtrl end
+function ide:GetWatch() return self.debugger and self.debugger.watchCtrl end
+function ide:GetStack() return self.debugger and self.debugger.stackCtrl end
+
+local statusreset
+function ide:SetStatusFor(text, interval, field)
+ field = field or 0
+ interval = interval or 2
+ local statusbar = self:GetStatusBar()
+ if not ide.timers.status then
+ ide.timers.status = wx.wxTimer(statusbar)
+ statusbar:Connect(wx.wxEVT_TIMER, function(event) if statusreset then statusreset() end end)
+ end
+ statusreset = function()
+ if statusbar:GetStatusText(field) == text then statusbar:SetStatusText("", field) end
+ end
+ ide.timers.status:Start(interval*1000, wx.wxTIMER_ONE_SHOT)
+ statusbar:SetStatusText(text, field)
+end
+function ide:SetStatus(text, field) self:GetStatusBar():SetStatusText(text, field or 0) end
+function ide:GetStatus(field) return self:GetStatusBar():GetStatusText(field or 0) end
+function ide:PushStatus(text, field) self:GetStatusBar():PushStatusText(text, field or 0) end
+function ide:PopStatus(field) self:GetStatusBar():PopStatusText(field or 0) end
+function ide:Yield() wx.wxYield() end
+function ide:CreateBareEditor() return CreateEditor(true) end
+
+local rawMethods = {"AddTextDyn", "InsertTextDyn", "AppendTextDyn", "SetTextDyn",
+ "GetTextDyn", "GetLineDyn", "GetSelectedTextDyn", "GetTextRangeDyn"}
+local useraw = nil
+
+function ide:CreateStyledTextCtrl(...)
+ local editor = wxstc.wxStyledTextCtrl(...)
+ if not editor then return end
+
+ if useraw == nil then
+ useraw = true
+ for _, m in ipairs(rawMethods) do
+ if not pcall(function() return editor[m:gsub("Dyn", "Raw")] end) then useraw = false; break end
+ end
+ end
+
+ -- map all `GetTextDyn` to `GetText` or `GetTextRaw` if `*Raw` methods are present
+ editor.useraw = useraw
+ for _, m in ipairs(rawMethods) do
+ -- some `*Raw` methods return `nil` instead of `""` as their "normal" calls do
+ -- (for example, `GetLineRaw` and `GetTextRangeRaw` for parameters outside of text)
+ local def = m:find("^Get") and "" or nil
+ editor[m] = function(...) return editor[m:gsub("Dyn", useraw and "Raw" or "")](...) or def end
+ end
+
+ local suffix = "\1\0"
+ function editor:CopyDyn()
+ if not self.useraw then return self:Copy() end
+ -- check if selected fragment is a valid UTF-8 sequence
+ local text = self:GetSelectedTextRaw()
+ if text == "" or wx.wxString.FromUTF8(text) ~= "" then return self:Copy() end
+ local tdo = wx.wxTextDataObject()
+ -- append suffix as wxwidgets (3.1+ on Windows) truncate last char for odd-length strings
+ local workaround = ide.osname == "Windows" and (#text % 2 > 0) and suffix or ""
+ tdo:SetData(wx.wxDataFormat(wx.wxDF_TEXT), text..workaround)
+ local clip = wx.wxClipboard.Get()
+ clip:Open()
+ clip:SetData(tdo)
+ clip:Close()
+ end
+
+ function editor:PasteDyn()
+ if not self.useraw then return self:Paste() end
+ local tdo = wx.wxTextDataObject()
+ local clip = wx.wxClipboard.Get()
+ clip:Open()
+ clip:GetData(tdo)
+ clip:Close()
+ local ok, text = tdo:GetDataHere(wx.wxDataFormat(wx.wxDF_TEXT))
+ -- check if the fragment being pasted is a valid UTF-8 sequence
+ if not ok or text == "" or wx.wxString.FromUTF8(text) ~= "" then return self:Paste() end
+ if ide.osname == "Windows" then text = text:gsub(suffix.."+$","") end
+ self:AddTextRaw(text)
+ self:GotoPos(self:GetCurrentPos())
+ end
+
+ function editor:GotoPosEnforcePolicy(pos)
+ self:GotoPos(pos)
+ self:EnsureVisibleEnforcePolicy(self:LineFromPosition(pos))
+ end
+
+ function editor:CanFold()
+ local foldable = false
+ for m = 0, ide.MAXMARGIN do
+ if editor:GetMarginWidth(m) > 0
+ and editor:GetMarginMask(m) == wxstc.wxSTC_MASK_FOLDERS then
+ foldable = true
+ end
+ end
+ return foldable
+ end
+
+ -- circle through "fold all" => "hide base lines" => "unfold all"
+ function editor:FoldSome()
+ editor:Colourise(0, -1) -- update doc's folding info
+ local foldall = false -- at least on header unfolded => fold all
+ local hidebase = false -- at least one base is visible => hide all
+ local lines = editor:GetLineCount()
+
+ for ln = 0, lines-1 do
+ local foldRaw = editor:GetFoldLevel(ln)
+ local foldLvl = foldRaw % 4096
+ local foldHdr = (math.floor(foldRaw / 8192) % 2) == 1
+
+ -- at least one header is expanded
+ foldall = foldall or (foldHdr and editor:GetFoldExpanded(ln))
+
+ -- at least one base can be hidden
+ hidebase = hidebase or (
+ not foldHdr
+ and ln > 1 -- first line can't be hidden, so ignore it
+ and foldLvl == wxstc.wxSTC_FOLDLEVELBASE
+ and bit.band(foldRaw, wxstc.wxSTC_FOLDLEVELWHITEFLAG) == 0
+ and editor:GetLineVisible(ln))
+ end
+
+ -- shows lines; this doesn't change fold status for folded lines
+ if not foldall and not hidebase then editor:ShowLines(0, lines-1) end
+
+ for ln = 0, lines-1 do
+ local foldRaw = editor:GetFoldLevel(ln)
+ local foldLvl = foldRaw % 4096
+ local foldHdr = (math.floor(foldRaw / 8192) % 2) == 1
+
+ if foldall then
+ if foldHdr and editor:GetFoldExpanded(ln) then
+ editor:ToggleFold(ln)
+ end
+ elseif hidebase then
+ if not foldHdr and (foldLvl == wxstc.wxSTC_FOLDLEVELBASE) then
+ editor:HideLines(ln, ln)
+ end
+ else -- unfold all
+ if foldHdr and not editor:GetFoldExpanded(ln) then
+ editor:ToggleFold(ln)
+ end
+ end
+ end
+ editor:EnsureCaretVisible()
+ end
+
+ local function getMarginWidth(editor)
+ local width = 0
+ for m = 0, ide.MAXMARGIN do width = width + editor:GetMarginWidth(m) end
+ return width
+ end
+
+ function editor:ShowPosEnforcePolicy(pos)
+ local line = self:LineFromPosition(pos)
+ self:EnsureVisibleEnforcePolicy(line)
+ -- skip the rest if line wrapping is on
+ if editor:GetWrapMode() ~= wxstc.wxSTC_WRAP_NONE then return end
+ local xwidth = self:GetClientSize():GetWidth() - getMarginWidth(self)
+ local xoffset = self:GetTextExtent(self:GetLineDyn(line):sub(1, pos-self:PositionFromLine(line)+1))
+ self:SetXOffset(xoffset > xwidth and xoffset-xwidth or 0)
+ end
+
+ function editor:ClearAny()
+ local length = self:GetLength()
+ local selections = ide.wxver >= "2.9.5" and self:GetSelections() or 1
+ self:Clear() -- remove selected fragments
+
+ -- check if the modification has failed, which may happen
+ -- if there is "invisible" text in the selected fragment.
+ -- if there is only one selection, then delete manually.
+ if length == self:GetLength() and selections == 1 then
+ self:SetTargetStart(self:GetSelectionStart())
+ self:SetTargetEnd(self:GetSelectionEnd())
+ self:ReplaceTarget("")
+ end
+ end
+
+ function editor:MarkerGetAll(mask, from, to)
+ mask = mask or 2^24-1
+ local markers = {}
+ local line = editor:MarkerNext(from or 0, mask)
+ while line > -1 do
+ table.insert(markers, {line, editor:MarkerGet(line)})
+ if to and line > to then break end
+ line = editor:MarkerNext(line + 1, mask)
+ end
+ return markers
+ end
+
+ editor:Connect(wx.wxEVT_KEY_DOWN,
+ function (event)
+ local keycode = event:GetKeyCode()
+ local mod = event:GetModifiers()
+ if (keycode == wx.WXK_DELETE and mod == wx.wxMOD_SHIFT)
+ or (keycode == wx.WXK_INSERT and mod == wx.wxMOD_CONTROL)
+ or (keycode == wx.WXK_INSERT and mod == wx.wxMOD_SHIFT) then
+ local id = keycode == wx.WXK_DELETE and ID.CUT or mod == wx.wxMOD_SHIFT and ID.PASTE or ID.COPY
+ ide.frame:AddPendingEvent(wx.wxCommandEvent(wx.wxEVT_COMMAND_MENU_SELECTED, id))
+ elseif keycode == wx.WXK_CAPITAL and mod == wx.wxMOD_CONTROL then
+ -- ignore Ctrl+CapsLock
+ else
+ event:Skip()
+ end
+ end)
+ return editor
+end
+
+function ide:LoadFile(...) return LoadFile(...) end
+
+function ide:CopyToClipboard(text)
+ if wx.wxClipboard:Get():Open() then
+ wx.wxClipboard:Get():SetData(wx.wxTextDataObject(text))
+ wx.wxClipboard:Get():Close()
+ return true
+ end
+ return false
+end
+
+function ide:GetSetting(path, setting)
+ local settings = self.settings
+ local curpath = settings:GetPath()
+ settings:SetPath(path)
+ local ok, value = settings:Read(setting)
+ settings:SetPath(curpath)
+ return ok and value or nil
+end
+
+function ide:RemoveMenuItem(id, menu)
+ local _, menu, pos = self:FindMenuItem(id, menu)
+ if menu then
+ self:GetMainFrame():Disconnect(id, wx.wxID_ANY, wx.wxEVT_COMMAND_MENU_SELECTED)
+ self:GetMainFrame():Disconnect(id, wx.wxID_ANY, wx.wxEVT_UPDATE_UI)
+ menu:Disconnect(id, wx.wxID_ANY, wx.wxEVT_COMMAND_MENU_SELECTED)
+ menu:Disconnect(id, wx.wxID_ANY, wx.wxEVT_UPDATE_UI)
+ menu:Remove(id)
+
+ local positem = menu:FindItemByPosition(pos)
+ if (not positem or positem:GetKind() == wx.wxITEM_SEPARATOR)
+ and pos > 0
+ and (menu:FindItemByPosition(pos-1):GetKind() == wx.wxITEM_SEPARATOR) then
+ menu:Destroy(menu:FindItemByPosition(pos-1))
+ end
+ return true
+ end
+ return false
+end
+
+function ide:ExecuteCommand(cmd, wdir, callback, endcallback)
+ local proc = wx.wxProcess(self:GetOutput())
+ proc:Redirect()
+
+ local cwd
+ if (wdir and #wdir > 0) then -- ignore empty directory
+ cwd = wx.wxFileName.GetCwd()
+ cwd = wx.wxFileName.SetCwd(wdir) and cwd
+ end
+
+ local pid = wx.wxExecute(cmd, wx.wxEXEC_ASYNC, proc)
+ pid = pid ~= -1 and pid ~= 0 and pid or nil
+ if cwd then wx.wxFileName.SetCwd(cwd) end -- restore workdir
+ if not pid then return pid, wx.wxSysErrorMsg() end
+
+ OutputSetCallbacks(pid, proc, callback or function() end, endcallback)
+ return pid
+end
+
+function ide:CreateImageList(group, ...)
+ local _ = wx.wxLogNull() -- disable error reporting in popup
+ local size = wx.wxSize(16,16)
+ local imglist = wx.wxImageList(16,16)
+ for i = 1, select('#', ...) do
+ local icon, file = self:GetBitmap(select(i, ...), group, size)
+ if imglist:Add(icon) == -1 then
+ DisplayOutputLn(("Failed to add image '%s' to the image list.")
+ :format(file or select(i, ...)))
+ end
+ end
+ return imglist
+end
+
+local tintdef = 100
+local function iconFilter(bitmap, tint)
+ if type(tint) == 'function' then return tint(bitmap) end
+ if type(tint) ~= 'table' or #tint ~= 3 then return bitmap end
+
+ local tr, tg, tb = tint[1]/255, tint[2]/255, tint[3]/255
+ local pi = 0.299*tr + 0.587*tg + 0.114*tb -- pixel intensity
+ local perc = (tint[0] or tintdef)/tintdef
+ tr, tg, tb = tr*perc, tg*perc, tb*perc
+
+ local img = bitmap:ConvertToImage()
+ for x = 0, img:GetWidth()-1 do
+ for y = 0, img:GetHeight()-1 do
+ if not img:IsTransparent(x, y) then
+ local r, g, b = img:GetRed(x, y)/255, img:GetGreen(x, y)/255, img:GetBlue(x, y)/255
+ local gs = (r + g + b) / 3
+ local weight = 1-4*(gs-0.5)*(gs-0.5)
+ r = math.max(0, math.min(255, math.floor(255 * (gs + (tr-pi) * weight))))
+ g = math.max(0, math.min(255, math.floor(255 * (gs + (tg-pi) * weight))))
+ b = math.max(0, math.min(255, math.floor(255 * (gs + (tb-pi) * weight))))
+ img:SetRGB(x, y, r, g, b)
+ end
+ end
+ end
+ return wx.wxBitmap(img)
+end
+
+local icons = {} -- icon cache to avoid reloading the same icons
+function ide:GetBitmap(id, client, size)
+ local im = self.config.imagemap
+ local width = size:GetWidth()
+ local key = width.."/"..id
+ local keyclient = key.."-"..client
+ local mapped = im[keyclient] or im[id.."-"..client] or im[key] or im[id]
+ -- mapped may be a file name/path or wxImage object; take that into account
+ if type(im[id.."-"..client]) == 'string' then keyclient = width.."/"..im[id.."-"..client]
+ elseif type(im[keyclient]) == 'string' then keyclient = im[keyclient]
+ elseif type(im[id]) == 'string' then
+ id = im[id]
+ key = width.."/"..id
+ keyclient = key.."-"..client
+ end
+
+ local fileClient = self:GetAppName() .. "/res/" .. keyclient .. ".png"
+ local fileKey = self:GetAppName() .. "/res/" .. key .. ".png"
+ local isImage = type(mapped) == 'userdata' and mapped:GetClassInfo():GetClassName() == 'wxImage'
+ local file
+ if mapped and (isImage or wx.wxFileName(mapped):FileExists()) then file = mapped
+ elseif wx.wxFileName(fileClient):FileExists() then file = fileClient
+ elseif wx.wxFileName(fileKey):FileExists() then file = fileKey
+ else return wx.wxArtProvider.GetBitmap(id, client, size) end
+ local icon = icons[file] or iconFilter(wx.wxBitmap(file), self.config.imagetint)
+ icons[file] = icon
+ return icon, file
+end
+
+function ide:AddPackage(name, package)
+ self.packages[name] = setmetatable(package, self.proto.Plugin)
+ self.packages[name].fname = name
+ return self.packages[name]
+end
+function ide:RemovePackage(name) self.packages[name] = nil end
+
+function ide:AddWatch(watch, value)
+ local mgr = self.frame.uimgr
+ local pane = mgr:GetPane("watchpanel")
+ if (pane:IsOk() and not pane:IsShown()) then
+ pane:Show()
+ mgr:Update()
+ end
+
+ local watchCtrl = self.debugger.watchCtrl
+ if not watchCtrl then return end
+
+ local root = watchCtrl:GetRootItem()
+ if not root or not root:IsOk() then return end
+
+ local item = watchCtrl:GetFirstChild(root)
+ while true do
+ if not item:IsOk() then break end
+ if watchCtrl:GetItemExpression(item) == watch then
+ if value then watchCtrl:SetItemText(item, watch .. ' = ' .. tostring(value)) end
+ return item
+ end
+ item = watchCtrl:GetNextSibling(item)
+ end
+
+ item = watchCtrl:AppendItem(root, watch, 1)
+ watchCtrl:SetItemExpression(item, watch, value)
+ return item
+end
+
+function ide:AddInterpreter(name, interpreter)
+ self.interpreters[name] = setmetatable(interpreter, self.proto.Interpreter)
+ ProjectUpdateInterpreters()
+end
+function ide:RemoveInterpreter(name)
+ self.interpreters[name] = nil
+ ProjectUpdateInterpreters()
+end
+
+function ide:AddSpec(name, spec)
+ self.specs[name] = spec
+ UpdateSpecs()
+end
+function ide:RemoveSpec(name) self.specs[name] = nil end
+
+function ide:AddAPI(type, name, api)
+ self.apis[type] = self.apis[type] or {}
+ self.apis[type][name] = api
+end
+function ide:RemoveAPI(type, name) self.apis[type][name] = nil end
+
+function ide:AddConsoleAlias(alias, table) return ShellSetAlias(alias, table) end
+function ide:RemoveConsoleAlias(alias) return ShellSetAlias(alias, nil) end
+
+function ide:AddMarker(...) return StylesAddMarker(...) end
+function ide:GetMarker(marker) return StylesGetMarker(marker) end
+function ide:RemoveMarker(marker) StylesRemoveMarker(marker) end
+
+local indicators = {}
+function ide:AddIndicator(indic, num)
+ num = num or indicators[indic]
+ if not num then -- new indicator; find the smallest available number
+ local nums = {}
+ for _, indicator in pairs(indicators) do
+ if indicator >= wxstc.wxSTC_INDIC_CONTAINER then
+ nums[indicator-wxstc.wxSTC_INDIC_CONTAINER+1] = true
+ end
+ end
+ num = #nums + wxstc.wxSTC_INDIC_CONTAINER
+ if num > wxstc.wxSTC_INDIC_MAX then return end
+ end
+ indicators[indic] = num
+ return num
+end
+function ide:GetIndicator(indic) return indicators[indic] end
+function ide:GetIndicators() return indicators end
+function ide:RemoveIndicator(indic) indicators[indic] = nil end
+
+-- this provides a simple stack for saving/restoring current configuration
+local configcache = {}
+function ide:AddConfig(name, files)
+ if not name or configcache[name] then return end -- don't overwrite existing slots
+ if type(files) ~= "table" then files = {files} end -- allow to pass one value
+ configcache[name] = {
+ config = require('mobdebug').dump(self.config, {nocode = true}),
+ configmeta = getmetatable(self.config),
+ packages = {},
+ }
+ -- build a list of existing packages
+ local packages = {}
+ for package in pairs(self.packages) do packages[package] = true end
+ -- load config file(s)
+ for _, file in pairs(files) do LoadLuaConfig(MergeFullPath(name, file)) end
+ -- register newly added packages (if any)
+ for package in pairs(self.packages) do
+ if not packages[package] then -- this is a newly added package
+ PackageEventHandleOne(package, "onRegister")
+ configcache[name].packages[package] = true
+ end
+ end
+ ReApplySpecAndStyles() -- apply current config to the UI
+end
+function ide:RemoveConfig(name)
+ if not name or not configcache[name] then return end
+ -- unregister cached packages
+ for package in pairs(configcache[name].packages) do PackageUnRegister(package) end
+ -- load original config
+ local ok, res = LoadSafe(configcache[name].config)
+ if ok then
+ self.config = res
+ if configcache[name].configmeta then setmetatable(self.config, configcache[name].configmeta) end
+ else
+ DisplayOutputLn(("Error while restoring configuration: '%s'."):format(res))
+ end
+ configcache[name] = nil -- clear the slot after use
+ ReApplySpecAndStyles() -- apply current config to the UI
+end
+
+local panels = {}
+function ide:AddPanel(ctrl, panel, name, conf)
+ local width, height = 360, 200
+ local notebook = wxaui.wxAuiNotebook(self.frame, wx.wxID_ANY,
+ wx.wxDefaultPosition, wx.wxDefaultSize,
+ wxaui.wxAUI_NB_DEFAULT_STYLE + wxaui.wxAUI_NB_TAB_EXTERNAL_MOVE
+ - wxaui.wxAUI_NB_CLOSE_ON_ACTIVE_TAB + wx.wxNO_BORDER)
+ notebook:AddPage(ctrl, name, true)
+ notebook:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_BG_DCLICK,
+ function() PaneFloatToggle(notebook) end)
+ notebook:Connect(wxaui.wxEVT_COMMAND_AUINOTEBOOK_PAGE_CLOSE,
+ function(event) event:Veto() end)
+
+ local mgr = self.frame.uimgr
+ mgr:AddPane(notebook, wxaui.wxAuiPaneInfo():
+ Name(panel):Float():CaptionVisible(false):PaneBorder(false):
+ MinSize(width/2,height/2):
+ BestSize(width,height):FloatingSize(width,height):
+ PinButton(true):Hide())
+ if type(conf) == "function" then conf(mgr:GetPane(panel)) end
+ mgr.defaultPerspective = mgr:SavePerspective() -- resave default perspective
+
+ panels[name] = {ctrl, panel, name, conf}
+ return mgr:GetPane(panel), notebook
+end
+
+function ide:RemovePanel(panel)
+ local mgr = self.frame.uimgr
+ local pane = mgr:GetPane(panel)
+ if pane:IsOk() then
+ local win = pane.window
+ mgr:DetachPane(win)
+ win:Destroy()
+ mgr:Update()
+ end
+end
+
+function ide:AddPanelDocked(notebook, ctrl, panel, name, conf, activate)
+ notebook:AddPage(ctrl, name, activate ~= false)
+ panels[name] = {ctrl, panel, name, conf}
+ return notebook
+end
+function ide:IsPanelDocked(panel)
+ local layout = self:GetSetting("/view", "uimgrlayout")
+ return layout and not layout:find(panel)
+end
+
+function ide:IsValidCtrl(ctrl)
+ return ctrl and pcall(function() ctrl:GetId() end)
+end
+
+function ide:IsValidProperty(ctrl, prop)
+ return ide:IsValidCtrl(ctrl) and pcall(function() return ctrl[prop] end)
+end
+
+function ide:IsWindowShown(win)
+ while win do
+ if not win:IsShown() then return false end
+ win = win:GetParent()
+ end
+ return true
+end
+
+function ide:RestorePanelByLabel(name)
+ if not panels[name] then return end
+ return self:AddPanel(unpack(panels[name]))
+end
+
+function ide:AddTool(name, command, updateui)
+ return ToolsAddTool(name, command, updateui)
+end
+
+function ide:RemoveTool(name)
+ return ToolsRemoveTool(name)
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/print.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/print.lua
new file mode 100644
index 0000000..9b93dcd
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/print.lua
@@ -0,0 +1,195 @@
+-- Copyright 2015 Paul Kulchenko, ZeroBrane LLC
+---------------------------------------------------------
+
+local frame = ide:GetMainFrame()
+local margin = {top = 10, left = 10, bottom = 10, right = 10}
+local function printScaling(dc, printOut)
+ local pageSizeMM_x, pageSizeMM_y = printOut:GetPageSizeMM()
+
+ local ppiScr_x, ppiScr_y = printOut:GetPPIScreen()
+ local ppiPrn_x, ppiPrn_y = printOut:GetPPIPrinter()
+
+ local ppi_scale_x = ppiPrn_x/ppiScr_x
+ local ppi_scale_y = ppiPrn_y/ppiScr_y
+
+ -- get the size of DC in pixels and the number of pixels in the page
+ local dcSize_x, dcSize_y = dc:GetSize()
+ local pagePixSize_x, pagePixSize_y = printOut:GetPageSizePixels()
+
+ local dc_pagepix_scale_x = dcSize_x/pagePixSize_x
+ local dc_pagepix_scale_y = dcSize_y/pagePixSize_y
+
+ local dc_scale_x = ppi_scale_x * dc_pagepix_scale_x
+ local dc_scale_y = ppi_scale_y * dc_pagepix_scale_y
+
+ -- calculate the pixels / mm (25.4 mm = 1 inch)
+ local ppmm_x = ppiScr_x / 25.4
+ local ppmm_y = ppiScr_y / 25.4
+
+ -- adjust the page size for the pixels / mm scaling factor
+ local page_x = math.floor(pageSizeMM_x * ppmm_x)
+ local page_y = math.floor(pageSizeMM_y * ppmm_y)
+ local pageRect = wx.wxRect(0, 0, page_x, page_y)
+
+ -- get margins informations and convert to printer pixels
+ local top = math.floor(margin.top * ppmm_y)
+ local bottom = math.floor(margin.bottom * ppmm_y)
+ local left = math.floor(margin.left * ppmm_x)
+ local right = math.floor(margin.right * ppmm_x)
+
+ dc:SetUserScale(dc_scale_x, dc_scale_y)
+
+ local printRect = wx.wxRect(left, top, page_x-(left+right), page_y-(top+bottom))
+ return printRect, pageRect
+end
+
+local function connectPrintEvents(printer, printOut)
+ local editor = ide:GetEditorWithFocus()
+ local cfg = ide.config.print
+ local pages
+
+ function printOut:OnPrintPage(pageNum)
+ local dc = self:GetDC()
+ local printRect, pageRect = printScaling(dc, printOut)
+
+ -- print to an area smaller by the height of the header/footer
+ dc:SetFont(editor:GetFont())
+ local _, headerHeight = dc:GetTextExtent("qH")
+ local textRect = wx.wxRect(printRect)
+ if cfg.header then
+ textRect:SetY(textRect:GetY() + headerHeight*1.5)
+ textRect:SetHeight(textRect:GetHeight() - headerHeight*1.5)
+ end
+ if cfg.footer then
+ textRect:SetHeight(textRect:GetHeight() - headerHeight*1.5)
+ end
+
+ local selection = printer:GetPrintDialogData():GetSelection()
+ local spos = selection and editor:GetSelectionStart() or 1
+ local epos = selection and editor:GetSelectionEnd() or editor:GetLength()
+ if pageNum == nil then
+ pages = {}
+ ide:PushStatus("")
+ printOut.startTime = wx.wxNow()
+ local pos = spos
+ while pos < epos do
+ table.insert(pages, pos)
+ pos = editor:FormatRange(false, pos, epos, dc, dc, textRect, pageRect)
+ ide:PopStatus()
+ ide:PushStatus(TR("%s%% formatted..."):format(math.floor((pos-spos)*100.0/(epos-spos))))
+ end
+ if #pages == 0 then pages = {0} end
+ ide:PopStatus()
+ else
+ ide:SetStatusFor(TR("Formatting page %d..."):format(pageNum))
+ editor:FormatRange(true, pages[pageNum], epos, dc, dc, textRect, pageRect)
+
+ local c = wx.wxColour(127, 127, 127)
+ dc:SetPen(wx.wxPen(c, 1, wx.wxSOLID))
+ dc:SetTextForeground(c)
+
+ local doc = ide:GetDocument(editor)
+ local format = "([^\t]*)\t?([^\t]*)\t?([^\t]*)"
+ local placeholders = {
+ D = printOut.startTime,
+ p = pageNum,
+ P = #pages,
+ S = doc and doc:GetFileName() or "",
+ }
+ dc:SetFont(editor:GetFont())
+ if cfg.header then
+ local left, center, right = ExpandPlaceholders(cfg.header, placeholders):match(format)
+ dc:DrawText(left, printRect.X, printRect.Y)
+ dc:DrawText(center, printRect.Left + (printRect.Left + printRect.Width - dc:GetTextExtentSize(center).Width)/2, printRect.Y)
+ dc:DrawText(right, printRect.Left + printRect.Width - dc:GetTextExtentSize(right).Width, printRect.Y)
+ dc:DrawLine(printRect.X, printRect.Y + headerHeight, printRect.Left + printRect.Width, printRect.Y + headerHeight)
+ end
+ if cfg.footer then
+ local footerY = printRect.Y + printRect.Height - headerHeight
+ local left, center, right = ExpandPlaceholders(cfg.footer, placeholders):match(format)
+ dc:DrawText(left, printRect.X, footerY)
+ dc:DrawText(center, printRect.Left + (printRect.Left + printRect.Width - dc:GetTextExtentSize(center).Width)/2, footerY)
+ dc:DrawText(right, printRect.Left + printRect.Width - dc:GetTextExtentSize(right).Width, footerY)
+ dc:DrawLine(printRect.X, footerY, printRect.Left + printRect.Width, footerY)
+ end
+ end
+ return true
+ end
+ function printOut:HasPage(pageNum) return pages[pageNum] ~= nil end
+ function printOut:GetPageInfo()
+ -- on Linux `GetPageInfo` is called before the canvas is initialized, which prevents
+ -- proper calculation of the number of pages (wx2.9.5).
+ -- Return defaults here as it's going to be called once more in the right place.
+ if ide.osname == "Unix" and not pages then return 1, 9999, 1, 9999 end
+ local printDD = printer:GetPrintDialogData()
+ -- due to wxwidgets bug (http://trac.wxwidgets.org/ticket/17200), if `to` page is not set explicitly,
+ -- only one page is being printed when `selection` option is selected in the print dialog.
+ if printDD:GetSelection() then printDD:SetToPage(#pages) end -- set the page as a workaround
+ local tofrom = not printDD:GetSelection() and not printDD:GetAllPages()
+ return 1, #pages, tofrom and printDD:GetFromPage() or 1, tofrom and printDD:GetToPage() or #pages
+ end
+ function printOut:OnPreparePrinting() self:OnPrintPage() end
+end
+
+frame:Connect(ID_PAGESETUP, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ local pageSetupDD = wx.wxPageSetupDialogData()
+ pageSetupDD.MarginTopLeft = wx.wxPoint(margin.left, margin.top)
+ pageSetupDD.MarginBottomRight = wx.wxPoint(margin.right, margin.bottom)
+ pageSetupDD:EnableOrientation(false)
+ pageSetupDD:EnablePaper(false)
+
+ local pageSetupDialog = wx.wxPageSetupDialog(frame, pageSetupDD)
+ pageSetupDialog:ShowModal()
+ pageSetupDD = pageSetupDialog:GetPageSetupDialogData()
+ margin.top, margin.left = pageSetupDD.MarginTopLeft.y, pageSetupDD.MarginTopLeft.x
+ margin.bottom, margin.right = pageSetupDD.MarginBottomRight.y, pageSetupDD.MarginBottomRight.x
+ end)
+
+frame:Connect(ID_PRINT, wx.wxEVT_COMMAND_MENU_SELECTED,
+ function (event)
+ local cfg = ide.config.print
+ local editor = ide:GetEditorWithFocus()
+ editor:SetPrintMagnification(cfg.magnification)
+ editor:SetPrintColourMode(cfg.colourmode)
+ editor:SetPrintWrapMode(cfg.wrapmode)
+
+ -- only enable selection if there is something selected in the editor (ignore multiple selections)
+ local printDD = wx.wxPrintDialogData()
+ printDD:EnableSelection(editor:GetSelectionStart() ~= editor:GetSelectionEnd())
+
+ local printer = wx.wxPrinter(printDD)
+ local luaPrintout = wx.wxLuaPrintout()
+ connectPrintEvents(printer, luaPrintout)
+
+ -- save and hide indicators
+ local indics = {}
+ for _, num in pairs(ide:GetIndicators()) do
+ indics[num] = editor:IndicatorGetStyle(num)
+ editor:IndicatorSetStyle(num, wxstc.wxSTC_INDIC_HIDDEN)
+ end
+ -- bold keywords
+ local keywords = {}
+ for _, num in ipairs(ide:IsValidProperty(editor, 'spec') and editor.spec.lexerstyleconvert and editor.spec.lexerstyleconvert.keywords0 or {}) do
+ keywords[num] = editor:StyleGetBold(num)
+ editor:StyleSetBold(num, true)
+ end
+ local ok = printer:Print(frame, luaPrintout, true)
+ -- restore indicators
+ for n, style in pairs(indics) do editor:IndicatorSetStyle(n, style) end
+ for n, style in pairs(keywords) do editor:StyleSetBold(n, style) end
+ if not ok and printer:GetLastError() == wx.wxPRINTER_ERROR then
+ ReportError("There was a problem while printing.\nCheck if your current printer is set correctly.")
+ end
+ end)
+
+frame:Connect(ID_PRINT, wx.wxEVT_UPDATE_UI, function(event) event:Enable(ide:GetEditorWithFocus() ~= nil) end)
+
+local _, menu, epos = ide:FindMenuItem(ID.EXIT)
+-- disable printing on Unix/Linux as it generates incorrect layout (wx2.9.5, wx3.1)
+if ide.osname ~= "Unix" and menu and epos then
+ -- insert Print-repated menu items (going in the opposite order)
+ menu:Insert(epos-1, ID_PAGESETUP, TR("Page Setup..."), "")
+ menu:Insert(epos-1, ID_PRINT, TR("&Print..."), TR("Print the current document"))
+ menu:InsertSeparator(epos-1)
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/proto.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/proto.lua
new file mode 100644
index 0000000..fd24f50
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/proto.lua
@@ -0,0 +1,68 @@
+-- Copyright 2013-15 Paul Kulchenko, ZeroBrane LLC
+---------------------------------------------------------
+
+local q = EscapeMagic
+local modpref = ide.MODPREF
+
+ide.proto.Document = {__index = {
+ GetFileName = function(self) return self.fileName end,
+ GetFilePath = function(self) return self.filePath end,
+ GetFileExt = function(self) return GetFileExt(self.fileName) end,
+ GetModTime = function(self) return self.modTime end,
+ GetEditor = function(self) return self.editor end,
+ GetTabIndex = function(self) return self.index end,
+ IsModified = function(self) return self.isModified end,
+ IsNew = function(self) return self.filePath == nil end,
+ SetModified = function(self, modified)
+ self.isModified = modified
+ self:SetTabText()
+ end,
+ SetTabText = function(self, text)
+ ide:GetEditorNotebook():SetPageText(self.index,
+ (self.isModified and modpref or '')..(text or self:GetTabText()))
+ end,
+ GetTabText = function(self)
+ if self.index == nil then return self.fileName end
+ return ide:GetEditorNotebook():GetPageText(self.index):gsub("^"..q(modpref), "")
+ end,
+ SetActive = function(self) SetEditorSelection(self.index) end,
+ Save = function(self) return SaveFile(self.editor, self.filePath) end,
+ Close = function(self) return ClosePage(self.index) end,
+ CloseAll = function(self) return CloseAllPagesExcept(-1) end,
+ CloseAllExcept = function(self) return CloseAllPagesExcept(self.index) end,
+}}
+
+ide.proto.Plugin = {__index = {
+ GetName = function(self) return self.name end,
+ GetFileName = function(self) return self.fname end,
+ GetFilePath = function(self) return MergeFullPath(GetPathWithSep(ide.editorFilename), self.fpath) end,
+ GetConfig = function(self) return ide.config[self.fname] or {} end,
+ GetSettings = function(self) return SettingsRestorePackage(self.fname) end,
+ SetSettings = function(self, settings, opts) SettingsSavePackage(self.fname, settings, opts) end,
+}}
+
+ide.proto.Interpreter = {__index = {
+ GetName = function(self) return self.name end,
+ GetFileName = function(self) return self.fname end,
+ GetExePath = function(self, ...) return self:fexepath(...) end,
+ GetAPI = function(self) return self.api end,
+ fprojdir = function(self,wfilename)
+ return wfilename:GetPath(wx.wxPATH_GET_VOLUME)
+ end,
+ fworkdir = function (self,wfilename)
+ local proj = ide:GetProject()
+ return proj and proj:gsub("[\\/]$","") or wfilename:GetPath(wx.wxPATH_GET_VOLUME)
+ end,
+}}
+
+ide.proto.Debugger = {__index = {
+ IsRunning = function(self) return self.running end,
+ IsConnected = function(self) return self.server end,
+ GetHostName = function(self) return self.hostname end,
+ GetPortNumber = function(self) return self.portnumber end,
+}}
+
+ide.proto.ID = {
+ __index = function(_, id) return _G['ID_'..id] end,
+ __call = function(_, id) return IDgen(id) end,
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/settings.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/settings.lua
new file mode 100644
index 0000000..5f776b6
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/settings.lua
@@ -0,0 +1,593 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Lomtik Software (J. Winwood & John Labenski)
+-- Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+local layoutlabel = {
+ UIMANAGER = "uimgrlayout",
+ NOTEBOOK = "nblayout",
+ NOTEBOOKOUTPUT = "nbbtmlayout",
+ NOTEBOOKPROJECT = "nbprojlayout",
+ DOCKNOTEBOOK = "nbdocklayout",
+ DOCKNOTEBOOKOUTPUT = "nbbtmdocklayout",
+ DOCKNOTEBOOKPROJECT = "nbprojdocklayout",
+ STATUSBAR = "statusbar",
+}
+
+-- ----------------------------------------------------------------------------
+-- Initialize the wxConfig for loading/saving the preferences
+
+local ini = ide.config.ini
+-- if ini path is relative and includes a directory name, make it relative to the IDE location
+ini = ini and (not wx.wxIsAbsolutePath(ini) and wx.wxFileName(ini):GetDirCount() > 0
+ and MergeFullPath(GetPathWithSep(ide.editorFilename), ini) or ini)
+-- check that the ini file doesn't point to a directory
+if ini and (wx.wxFileName(ini):IsDir() or wx.wxIsAbsolutePath(ini) and wx.wxDirExists(ini)) then
+ print(("Can't use 'ini' configuration setting '%s' that points to a directory instead of a file; ignored.")
+ :format(ini))
+ ini = nil
+end
+-- check that the directory is writable
+if ini and wx.wxIsAbsolutePath(ini) and not wx.wxFileName(ini):IsDirWritable() then
+ print(("Can't use 'ini' configuration setting '%s' that points to a non-writable directory; ignored.")
+ :format(ini))
+ ini = nil
+end
+
+local settings = wx.wxFileConfig(GetIDEString("settingsapp"), GetIDEString("settingsvendor"), ini or "")
+ide.settings = settings
+
+local function settingsReadSafe(settings,what,default)
+ local cr,out = settings:Read(what,default)
+ return cr and out or default
+end
+
+-- ----------------------------------------------------------------------------
+-- wxConfig load/save preferences functions
+
+function SettingsRestoreFramePosition(window, windowName)
+ local path = settings:GetPath()
+ settings:SetPath("/"..windowName)
+
+ local s = tonumber(select(2,settings:Read("s", -1)))
+ local x = tonumber(select(2,settings:Read("x", 0)))
+ local y = tonumber(select(2,settings:Read("y", 0)))
+ local w = tonumber(select(2,settings:Read("w", 1100)))
+ local h = tonumber(select(2,settings:Read("h", 700)))
+
+ if (s ~= -1) and (s ~= 1) and (s ~= 2) then
+ local clientX, clientY, clientWidth, clientHeight = wx.wxClientDisplayRect()
+
+ if x < clientX then x = clientX end
+ if y < clientY then y = clientY end
+
+ if w > clientWidth then w = clientWidth end
+ if h > clientHeight then h = clientHeight end
+
+ window:SetSize(x, y, w, h)
+ elseif s == 1 then
+ window:Maximize(true)
+ end
+
+ settings:SetPath(path)
+end
+
+function SettingsSaveFramePosition(window, windowName)
+ local path = settings:GetPath()
+ settings:SetPath("/"..windowName)
+
+ local s = 0
+ local w, h = window:GetSizeWH()
+ local x, y = window:GetPositionXY()
+
+ if window:IsMaximized() then
+ s = 1
+ elseif window:IsIconized() then
+ s = 2
+ end
+
+ settings:Write("s", s==2 and 0 or s) -- iconized maybe - but that shouldnt be saved
+
+ if s == 0 then
+ settings:Write("x", x)
+ settings:Write("y", y)
+ settings:Write("w", w)
+ settings:Write("h", h)
+ end
+
+ settings:SetPath(path)
+end
+
+---
+-- (table) SettingsRestoreFileHistory (function)
+-- restores a list of recently loaded documents from the settings table
+-- a table is returned which contains tables each with a filename key, pointing to
+-- the filename
+function SettingsRestoreFileHistory(fntab)
+ local path = settings:GetPath()
+ local listname = "/filehistory"
+ settings:SetPath(listname)
+
+ local outtab = {}
+ local inlist = {}
+ for id=1,ide.config.filehistorylength do
+ local couldread, name = settings:Read(tostring(id), "")
+ if not couldread or name == "" then break end
+ if not inlist[name] then
+ inlist[name] = true
+ table.insert(outtab,{filename = name})
+ end
+ end
+
+ if fntab then fntab(outtab) end
+
+ settings:SetPath(path)
+
+ return outtab
+end
+
+function SettingsSaveFileHistory (filehistory)
+ local listname = "/filehistory"
+ local path = settings:GetPath()
+ settings:DeleteGroup(listname)
+ settings:SetPath(listname)
+
+ for i,doc in ipairs(filehistory) do
+ settings:Write(tostring(i), doc.filename)
+ end
+
+ settings:SetPath(path)
+end
+
+---
+-- () SettingsRestoreFileSession (function [, string section])
+-- restores a list of opened files from the file settings
+-- calls the given function with the restored table, a list
+-- of tables containing tables like
+-- {filename = "filename", cursorpos = <cursor position>}
+function SettingsRestoreFileSession(fntab, section)
+ local listname = section or "/session"
+ local path = settings:GetPath()
+ settings:SetPath(listname)
+ local outtab = {}
+ local params = {}
+ local ismore, key, index = settings:GetFirstEntry("", 0)
+ while (ismore) do
+ local couldread, value = settings:Read(key, "")
+ if tonumber(key) then
+ local fname,cursorpos = value:match("^(.+);(.-)$")
+ if (couldread and value ~= "") then
+ outtab[tonumber(key)] =
+ {filename = fname or value, cursorpos = tonumber(cursorpos) or 0}
+ end
+ else
+ params[key] = tonumber(value) or value
+ end
+ ismore, key, index = settings:GetNextEntry(index)
+ end
+
+ if fntab then fntab(outtab, params) end
+
+ settings:SetPath(path)
+
+ return outtab
+end
+
+---
+-- () SettingsSaveFileSession (table opendocs, table params [, string section])
+-- saves the list of currently opened documents (passed in the opendocs table)
+-- in the settings.
+function SettingsSaveFileSession(opendocs, params, section)
+ local listname = section or "/session"
+ local path = settings:GetPath()
+ settings:DeleteGroup(listname)
+ settings:SetPath(listname)
+
+ for i,doc in ipairs(opendocs) do
+ settings:Write(tostring(i), doc.filename..";"..doc.cursorpos)
+ end
+
+ -- save all other parameters
+ for k,v in pairs(params) do settings:Write(k, v) end
+
+ settings:SetPath(path)
+end
+
+---
+-- () SettingsRestoreProjectSession (function)
+function SettingsRestoreProjectSession(fntab)
+ local listname = "/projectsession"
+ local path = settings:GetPath()
+ settings:SetPath(listname)
+ local outtab = {}
+ local couldread = true
+ local id = 1
+ local name
+ while (couldread) do
+ couldread, name = settings:Read(tostring(id), "")
+ couldread = couldread and name ~= ""
+ if (couldread) then
+ if (wx.wxDirExists(name)) then
+ table.insert(outtab,name)
+
+ local function projsession(...) ProjectConfig(name, {...}) end
+ SettingsRestoreFileSession(projsession, listname .. "/" .. tostring(id))
+ end
+ id = id + 1
+ end
+ end
+
+ if fntab then fntab(outtab) end
+
+ settings:SetPath(path)
+
+ return outtab
+end
+
+---
+-- () SettingsSaveProjectSession (table projdirs)
+-- saves the list of currently active projects
+-- in the settings.
+function SettingsSaveProjectSession(projdirs)
+ local listname = "/projectsession"
+ local path = settings:GetPath()
+ settings:DeleteGroup(listname)
+ settings:SetPath(listname)
+
+ for i,dir in ipairs(projdirs) do
+ settings:Write(tostring(i), dir)
+
+ local opendocs, params = ProjectConfig(dir)
+ if opendocs then
+ SettingsSaveFileSession(opendocs, params, listname .. "/" .. tostring(i))
+ end
+ end
+
+ settings:SetPath(path)
+end
+
+function SettingsRestorePackage(package)
+ local packagename = "/package/"..package
+ local path = settings:GetPath()
+ settings:SetPath(packagename)
+ local outtab = {}
+ local ismore, key, index = settings:GetFirstEntry("", 0)
+ while (ismore) do
+ local couldread, value = settings:Read(key, "")
+ if couldread then
+ local ok, res = LoadSafe("return "..value)
+ if ok then outtab[key] = res
+ else
+ outtab[key] = nil
+ ide:Print(("Couldn't load and ignored '%s' settings for package '%s': %s")
+ :format(key, package, res))
+ end
+ end
+ ismore, key, index = settings:GetNextEntry(index)
+ end
+ settings:SetPath(path)
+ return outtab
+end
+
+local function plaindump(val, opts, done)
+ local keyignore = opts and opts.keyignore or {}
+ local final = done == nil
+ opts, done = opts or {}, done or {}
+ local t = type(val)
+ if t == "table" then
+ done[#done+1] = '{'
+ done[#done+1] = ''
+ for key, value in pairs (val) do
+ if not keyignore[key] then
+ done[#done+1] = '['
+ plaindump(key, opts, done)
+ done[#done+1] = ']='
+ plaindump(value, opts, done)
+ done[#done+1] = ","
+ end
+ end
+ done[#done] = '}'
+ elseif t == "string" then
+ done[#done+1] = ("%q"):format(val):gsub("\010","n"):gsub("\026","\\026")
+ elseif t == "number" then
+ done[#done+1] = ("%.17g"):format(val)
+ else
+ done[#done+1] = tostring(val)
+ end
+ return final and table.concat(done, '')
+end
+
+function SettingsSavePackage(package, values, opts)
+ local packagename = "/package/"..package
+ local path = settings:GetPath()
+
+ settings:DeleteGroup(packagename)
+ settings:SetPath(packagename)
+ for k,v in pairs(values or {}) do settings:Write(k, plaindump(v, opts)) end
+ settings:SetPath(path)
+end
+
+-----------------------------------
+
+local function saveNotebook(nb)
+ local cnt = nb:GetPageCount()
+
+ local function addTo(tab,key,value)
+ local out = tab[key] or {}
+ table.insert(out,value)
+ tab[key] = out
+ end
+
+ local pagesX = {}
+ local pagesY = {}
+
+ local str = "nblayout|"
+
+ for i=1,cnt do
+ local id = nb:GetPageText(i-1)
+ local pg = nb:GetPage(i-1)
+ local x,y = pg:GetPosition():GetXY()
+ addTo(pagesX,x,id)
+ addTo(pagesY,y,id)
+ end
+
+ local function sortedPages(tab)
+ local t = {}
+ for i in pairs(tab) do
+ table.insert(t,i)
+ end
+ table.sort(t)
+ return t
+ end
+
+ local sortedX = sortedPages(pagesX)
+ local sortedY = sortedPages(pagesY)
+
+ -- for now only support "1D" splits and prefer
+ -- dimension which has more, anything else
+ -- requires a more complex algorithm, yet to do
+
+ local pagesUse
+ local sortedUse
+ local split
+
+ if ( #sortedX >= #sortedY) then
+ pagesUse = pagesX
+ sortedUse = sortedX
+ split = "<X>"
+ else
+ pagesUse = pagesY
+ sortedUse = sortedY
+ split = "<Y>"
+ end
+
+ for _, v in ipairs(sortedUse) do
+ local pages = pagesUse[v]
+ for _, id in ipairs(pages) do
+ str = str..id.."|"
+ end
+ str = str..split.."|"
+ end
+
+ return str
+end
+
+local function loadNotebook(nb,str,fnIdConvert)
+ str = str:match("nblayout|(.+)")
+ if (not str) then return end
+ local cnt = nb:GetPageCount()
+ local sel = nb:GetSelection()
+
+ -- store old pages
+ local currentpages, order = {}, {}
+ for i=1,cnt do
+ local id = nb:GetPageText(i-1)
+ local newid = fnIdConvert and fnIdConvert(id) or id
+ currentpages[newid] = currentpages[newid] or {}
+ table.insert(currentpages[newid], {page = nb:GetPage(i-1), text = id, index = i-1})
+ order[i] = newid
+ end
+
+ -- remove them
+ for i=cnt,1,-1 do nb:RemovePage(i-1) end
+
+ -- read them and perform splits
+ local t = 0
+ local newsel
+ local function finishPage(page)
+ if (page.index == sel) then
+ newsel = t
+ end
+ t = t + 1
+ end
+
+ local direction
+ local splits = { X = wx.wxRIGHT, Y = wx.wxBOTTOM }
+ for cmd in str:gmatch("([^|]+)") do
+ local instr = cmd:match("<(%w)>")
+ if (not instr) then
+ local id = fnIdConvert and fnIdConvert(cmd) or cmd
+ local pageind = next(currentpages[id] or {})
+ if (pageind) then
+ local page = currentpages[id][pageind]
+ currentpages[id][pageind] = nil
+
+ nb:AddPage(page.page, page.text)
+ if (direction) then nb:Split(t, direction) end
+ finishPage(page)
+ end
+ end
+ direction = instr and splits[instr]
+ end
+
+ -- add anything we forgot; make sure page groups are in the order specified
+ for i=1,cnt do
+ local pagelist = currentpages[order[i]]
+ for _,page in pairs(pagelist) do
+ nb:AddPage(page.page, page.text)
+ finishPage(page)
+ end
+ end
+
+ -- set the active page as it was before
+ if (newsel) then nb:SetSelection(newsel) end
+end
+
+function SettingsRestoreView()
+ local listname = "/view"
+ local path = settings:GetPath()
+ settings:SetPath(listname)
+
+ local frame = ide.frame
+ local uimgr = frame.uimgr
+
+ local layoutcur = uimgr:SavePerspective()
+ local layout = settingsReadSafe(settings,layoutlabel.UIMANAGER,"")
+ if (layout ~= layoutcur) then
+ -- save the current toolbar besth and re-apply after perspective is loaded
+ -- bestw and besth has two separate issues:
+ -- (1) layout includes bestw that is only as wide as the toolbar size,
+ -- this leaves default background on the right side of the toolbar;
+ -- fix it by explicitly replacing with the screen width.
+ -- (2) besth may be wrong after icon size changes.
+ local toolbar = frame.uimgr:GetPane("toolbar")
+ local besth = toolbar:IsOk() and tonumber(uimgr:SavePaneInfo(toolbar):match("besth=([^;]+)"))
+
+ -- reload the perspective if the saved one is not empty as it's different from the default
+ if #layout > 0 then uimgr:LoadPerspective(layout, false) end
+
+ local screenw = frame:GetClientSize():GetWidth()
+ if toolbar:IsOk() and screenw > 0 then toolbar:BestSize(screenw, besth or -1) end
+
+ -- check if debugging panes are not mentioned and float them
+ for _, name in pairs({"stackpanel", "watchpanel"}) do
+ local pane = frame.uimgr:GetPane(name)
+ if pane:IsOk() and not layout:find(name) then pane:Float() end
+ end
+
+ -- check if the toolbar is not mentioned in the layout and show it
+ for _, name in pairs({"toolbar"}) do
+ local pane = frame.uimgr:GetPane(name)
+ if pane:IsOk() and not layout:find(name) then pane:Show() end
+ end
+
+ -- remove captions from all panes
+ local panes = frame.uimgr:GetAllPanes()
+ for index = 0, panes:GetCount()-1 do
+ uimgr:GetPane(panes:Item(index).name):CaptionVisible(false)
+ end
+ end
+
+ frame:GetStatusBar():Show(settingsReadSafe(settings,layoutlabel.STATUSBAR,true))
+
+ uimgr:Update()
+
+ layoutcur = saveNotebook(ide:GetOutputNotebook())
+ layout = settingsReadSafe(settings,layoutlabel.NOTEBOOKOUTPUT,layoutcur)
+ if (layout ~= layoutcur) then
+ loadNotebook(ide:GetOutputNotebook(),layout,
+ -- treat "Output (running)" same as "Output"
+ function(name) return
+ name:match(TR("Output")) or name:match("Output") or name end)
+ end
+
+ layoutcur = saveNotebook(ide:GetProjectNotebook())
+ layout = settingsReadSafe(settings,layoutlabel.NOTEBOOKPROJECT,layoutcur)
+ if (layout ~= layoutcur) then
+ loadNotebook(ide:GetProjectNotebook(),layout)
+ end
+
+ -- always select Output tab
+ local bottomnotebook = ide:GetOutputNotebook()
+ local index = bottomnotebook:GetPageIndex(bottomnotebook.errorlog)
+ if index >= 0 then bottomnotebook:SetSelection(index) end
+
+ layoutcur = saveNotebook(frame.notebook)
+ layout = settingsReadSafe(settings,layoutlabel.NOTEBOOK,layoutcur)
+ if (layout ~= layoutcur) then
+ loadNotebook(ide.frame.notebook,layout)
+ local openDocuments = ide.openDocuments
+ local nb = frame.notebook
+ local cnt = nb:GetPageCount()
+ for i=0,cnt-1 do
+ openDocuments[nb:GetPage(i):GetId()].index = i
+ end
+ end
+
+ -- restore configuration for notebook pages that have been split;
+ -- load saved dock_size values and update current values with saved ones
+ -- where dock_size configuration matches
+ for l, m in pairs({
+ [layoutlabel.DOCKNOTEBOOK] = ide:GetEditorNotebook():GetAuiManager(),
+ [layoutlabel.DOCKNOTEBOOKOUTPUT] = ide:GetOutputNotebook():GetAuiManager(),
+ [layoutlabel.DOCKNOTEBOOKPROJECT] = ide:GetProjectNotebook():GetAuiManager(),
+ }) do
+ -- ...|dock_size(5,0,0)=20|dock_size(2,1,0)=200|...
+ local prevlayout = settingsReadSafe(settings, l, "")
+ local curlayout = m:SavePerspective()
+ local newlayout = curlayout:gsub('(dock_size[^=]+=)(%d+)', function(t,v)
+ local val = prevlayout:match(EscapeMagic(t)..'(%d+)')
+ return t..(val or v)
+ end)
+ if newlayout ~= curlayout then m:LoadPerspective(newlayout) end
+ end
+
+ local editor = GetEditor()
+ if editor then editor:SetFocus() end
+
+ settings:SetPath(path)
+end
+
+function SettingsSaveView()
+ local listname = "/view"
+ local path = settings:GetPath()
+ settings:DeleteGroup(listname)
+ settings:SetPath(listname)
+
+ local frame = ide.frame
+ local uimgr = frame.uimgr
+
+ settings:Write(layoutlabel.UIMANAGER, uimgr:SavePerspective())
+ settings:Write(layoutlabel.NOTEBOOK, saveNotebook(ide:GetEditorNotebook()))
+ settings:Write(layoutlabel.NOTEBOOKOUTPUT, saveNotebook(ide:GetOutputNotebook()))
+ settings:Write(layoutlabel.NOTEBOOKPROJECT, saveNotebook(ide:GetProjectNotebook()))
+ settings:Write(layoutlabel.DOCKNOTEBOOK, ide:GetEditorNotebook():GetAuiManager():SavePerspective())
+ settings:Write(layoutlabel.DOCKNOTEBOOKOUTPUT, ide:GetOutputNotebook():GetAuiManager():SavePerspective())
+ settings:Write(layoutlabel.DOCKNOTEBOOKPROJECT, ide:GetProjectNotebook():GetAuiManager():SavePerspective())
+ settings:Write(layoutlabel.STATUSBAR, frame:GetStatusBar():IsShown())
+
+ settings:SetPath(path)
+end
+
+function SettingsRestoreEditorSettings()
+ local listname = "/editor"
+ local path = settings:GetPath()
+ settings:SetPath(listname)
+
+ local interpreter = settingsReadSafe(settings, "interpreter",
+ ide.config.interpreter or ide.config.default.interpreter)
+ ProjectSetInterpreter(interpreter)
+
+ settings:SetPath(path)
+end
+
+function SettingsSaveEditorSettings()
+ local listname = "/editor"
+ local path = settings:GetPath()
+ settings:DeleteGroup(listname)
+ settings:SetPath(listname)
+
+ settings:Write("interpreter", ide.interpreter and ide.interpreter.fname or ide.config.default.interpreter)
+
+ settings:SetPath(path)
+end
+
+function SettingsSaveAll()
+ SettingsSaveFileSession(GetOpenFiles())
+ SettingsSaveEditorSettings()
+ SettingsSaveProjectSession(FileTreeGetProjects())
+ SettingsSaveFileHistory(GetFileHistory())
+ SettingsSaveView()
+ SettingsSaveFramePosition(ide.frame, "MainFrame")
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/shellbox.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/shellbox.lua
new file mode 100644
index 0000000..f3fd52b
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/shellbox.lua
@@ -0,0 +1,574 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+local unpack = table.unpack or unpack
+
+local bottomnotebook = ide.frame.bottomnotebook
+local out = bottomnotebook.shellbox
+local remotesend
+
+local PROMPT_MARKER = StylesGetMarker("prompt")
+local PROMPT_MARKER_VALUE = 2^PROMPT_MARKER
+local ERROR_MARKER = StylesGetMarker("error")
+local OUTPUT_MARKER = StylesGetMarker("output")
+local MESSAGE_MARKER = StylesGetMarker("message")
+local ANY_MARKER_VALUE = 2^25-1 -- marker numbers 0 to 24 have no pre-defined function
+
+out:SetFont(ide.font.oNormal)
+out:StyleSetFont(wxstc.wxSTC_STYLE_DEFAULT, ide.font.oNormal)
+out:SetBufferedDraw(not ide.config.hidpi and true or false)
+out:StyleClearAll()
+
+out:SetTabWidth(ide.config.editor.tabwidth or 2)
+out:SetIndent(ide.config.editor.tabwidth or 2)
+out:SetUseTabs(ide.config.editor.usetabs and true or false)
+out:SetViewWhiteSpace(ide.config.editor.whitespace and true or false)
+out:SetIndentationGuides(true)
+
+out:SetWrapMode(wxstc.wxSTC_WRAP_WORD)
+out:SetWrapStartIndent(0)
+out:SetWrapVisualFlagsLocation(wxstc.wxSTC_WRAPVISUALFLAGLOC_END_BY_TEXT)
+out:SetWrapVisualFlags(wxstc.wxSTC_WRAPVISUALFLAG_END)
+
+out:MarkerDefine(StylesGetMarker("prompt"))
+out:MarkerDefine(StylesGetMarker("error"))
+out:MarkerDefine(StylesGetMarker("output"))
+out:MarkerDefine(StylesGetMarker("message"))
+out:SetReadOnly(false)
+
+SetupKeywords(out,"lua",nil,ide.config.stylesoutshell,ide.font.oNormal,ide.font.oItalic)
+
+local function getPromptLine()
+ local totalLines = out:GetLineCount()
+ return out:MarkerPrevious(totalLines+1, PROMPT_MARKER_VALUE)
+end
+
+local function getPromptText()
+ local prompt = getPromptLine()
+ return out:GetTextRangeDyn(out:PositionFromLine(prompt), out:GetLength())
+end
+
+local function setPromptText(text)
+ local length = out:GetLength()
+ out:SetSelectionStart(length - string.len(getPromptText()))
+ out:SetSelectionEnd(length)
+ out:ClearAny()
+ out:AddTextDyn(text)
+ -- refresh the output window to force recalculation of wrapped lines;
+ -- otherwise a wrapped part of the last line may not be visible.
+ out:Update(); out:Refresh()
+ out:GotoPos(out:GetLength())
+end
+
+local function positionInLine(line)
+ return out:GetCurrentPos() - out:PositionFromLine(line)
+end
+
+local function caretOnPromptLine(disallowLeftmost, line)
+ local promptLine = getPromptLine()
+ local currentLine = line or out:GetCurrentLine()
+ local boundary = disallowLeftmost and 0 or -1
+ return (currentLine > promptLine
+ or currentLine == promptLine and positionInLine(promptLine) > boundary)
+end
+
+local function chomp(line) return (line:gsub("%s+$", "")) end
+
+local function getInput(line)
+ local nextMarker = line
+ local count = out:GetLineCount()
+
+ repeat -- check until we find at least some marker
+ nextMarker = nextMarker+1
+ until out:MarkerGet(nextMarker) > 0 or nextMarker > count-1
+ return chomp(out:GetTextRangeDyn(
+ out:PositionFromLine(line), out:PositionFromLine(nextMarker)))
+end
+
+function ConsoleSelectCommand(point)
+ local cpos = out:ScreenToClient(point or wx.wxGetMousePosition())
+ local position = out:PositionFromPoint(cpos)
+ if position == wxstc.wxSTC_INVALID_POSITION then return end
+
+ local promptline = out:MarkerPrevious(out:LineFromPosition(position), PROMPT_MARKER_VALUE)
+ if promptline == wxstc.wxSTC_INVALID_POSITION then return end
+ local nextline = out:MarkerNext(promptline+1, ANY_MARKER_VALUE)
+ local epos = nextline ~= wxstc.wxSTC_INVALID_POSITION and out:PositionFromLine(nextline) or out:GetLength()
+ out:SetSelection(out:PositionFromLine(promptline), epos)
+ return true
+end
+
+local currentHistory
+local function getNextHistoryLine(forward, promptText)
+ local count = out:GetLineCount()
+ if currentHistory == nil then currentHistory = count end
+
+ if forward then
+ currentHistory = out:MarkerNext(currentHistory+1, PROMPT_MARKER_VALUE)
+ if currentHistory == -1 then
+ currentHistory = count
+ return ""
+ end
+ else
+ currentHistory = out:MarkerPrevious(currentHistory-1, PROMPT_MARKER_VALUE)
+ if currentHistory == -1 then
+ return ""
+ end
+ end
+ -- need to skip the current prompt line
+ -- or skip repeated commands
+ if currentHistory == getPromptLine()
+ or getInput(currentHistory) == promptText then
+ return getNextHistoryLine(forward, promptText)
+ end
+ return getInput(currentHistory)
+end
+
+local function getNextHistoryMatch(promptText)
+ local count = out:GetLineCount()
+ if currentHistory == nil then currentHistory = count end
+
+ local current = currentHistory
+ while true do
+ currentHistory = out:MarkerPrevious(currentHistory-1, PROMPT_MARKER_VALUE)
+ if currentHistory == -1 then -- restart search from the last item
+ currentHistory = count
+ elseif currentHistory ~= getPromptLine() then -- skip current prompt
+ local input = getInput(currentHistory)
+ if input:find(promptText, 1, true) == 1 then return input end
+ end
+ -- couldn't find anything and made a loop; get out
+ if currentHistory == current then return end
+ end
+
+ assert(false, "getNextHistoryMatch coudn't find a proper match")
+end
+
+local function shellPrint(marker, ...)
+ local cnt = select('#',...)
+ if cnt == 0 then return end -- return if nothing to print
+
+ local isPrompt = marker and (getPromptLine() > -1)
+
+ local text = ''
+ for i=1,cnt do
+ local x = select(i,...)
+ text = text .. tostring(x)..(i < cnt and "\t" or "")
+ end
+
+ -- split the text into smaller chunks as one large line
+ -- is difficult to handle for the editor
+ local prev, maxlength = 0, ide.config.debugger.maxdatalength
+ if #text > maxlength and not text:find("\n.") then
+ text = text:gsub("()(%s+)", function(p, s)
+ if p-prev >= maxlength then
+ prev = p
+ return "\n"
+ else
+ return s
+ end
+ end)
+ end
+
+ -- add "\n" if it is missing
+ text = text:gsub("\n+$", "") .. "\n"
+
+ local lines = out:GetLineCount()
+ local promptLine = isPrompt and getPromptLine() or nil
+ local insertLineAt = isPrompt and getPromptLine() or out:GetLineCount()-1
+ local insertAt = isPrompt and out:PositionFromLine(getPromptLine()) or out:GetLength()
+ out:InsertTextDyn(insertAt, out.useraw and text or FixUTF8(text, function (s) return '\\'..string.byte(s) end))
+ local linesAdded = out:GetLineCount() - lines
+
+ if marker then
+ if promptLine then out:MarkerDelete(promptLine, PROMPT_MARKER) end
+ for line = insertLineAt, insertLineAt + linesAdded - 1 do
+ out:MarkerAdd(line, marker)
+ end
+ if promptLine then out:MarkerAdd(promptLine+linesAdded, PROMPT_MARKER) end
+ end
+
+ out:EmptyUndoBuffer() -- don't allow the user to undo shell text
+ out:GotoPos(out:GetLength())
+ out:EnsureVisibleEnforcePolicy(out:GetLineCount()-1)
+end
+
+DisplayShell = function (...)
+ shellPrint(OUTPUT_MARKER, ...)
+end
+DisplayShellErr = function (...)
+ shellPrint(ERROR_MARKER, ...)
+end
+DisplayShellMsg = function (...)
+ shellPrint(MESSAGE_MARKER, ...)
+end
+DisplayShellDirect = function (...)
+ shellPrint(nil, ...)
+end
+DisplayShellPrompt = function (...)
+ -- don't print anything; just mark the line with a prompt mark
+ out:MarkerAdd(out:GetLineCount()-1, PROMPT_MARKER)
+end
+
+local function filterTraceError(err, addedret)
+ local err = err:match("(.-:%d+:.-)\n[^\n]*\n[^\n]*\n[^\n]*src/editor/shellbox.lua:.*in function 'executeShellCode'")
+ or err
+ err = err:gsub("stack traceback:.-\n[^\n]+\n?","")
+ if addedret then err = err:gsub('^%[string "return ', '[string "') end
+ err = err:match("(.*)\n[^\n]*%(tail call%): %?$") or err
+ return err
+end
+
+local function createenv ()
+ local env = {}
+ setmetatable(env,{__index = _G})
+
+ local function luafilename(level)
+ level = level and level + 1 or 2
+ local src
+ while (true) do
+ src = debug.getinfo(level)
+ if (src == nil) then return nil,level end
+ if (string.byte(src.source) == string.byte("@")) then
+ return string.sub(src.source,2),level
+ end
+ level = level + 1
+ end
+ end
+
+ local function luafilepath(level)
+ local src,level = luafilename(level)
+ if (src == nil) then return src,level end
+ src = string.gsub(src,"[\\/][^\\//]*$","")
+ return src,level
+ end
+
+ local function relativeFilename(file)
+ assert(type(file)=='string',"String as filename expected")
+ local name = file
+ local level = 3
+ while (name) do
+ if (wx.wxFileName(name):FileExists()) then return name end
+ name,level = luafilepath(level)
+ if (name == nil) then break end
+ name = name .. "/" .. file
+ end
+
+ return file
+ end
+
+ local function relativeFilepath(file)
+ local name = luafilepath(3)
+ return (file and name) and name.."/"..file or file or name
+ end
+
+ local _loadfile = loadfile
+ local function loadfile(file)
+ assert(type(file)=='string',"String as filename expected")
+ local name = relativeFilename(file)
+
+ return _loadfile(name)
+ end
+
+ local function dofile(file, ...)
+ assert(type(file) == 'string',"String as filename expected")
+ local fn,err = loadfile(file)
+ local args = {...}
+ if not fn then
+ DisplayShellErr(err)
+ else
+ setfenv(fn,env)
+ return fn(unpack(args))
+ end
+ end
+
+ local os = { exit = function()
+ ide.frame:AddPendingEvent(wx.wxCommandEvent(
+ wx.wxEVT_COMMAND_MENU_SELECTED, ID_EXIT))
+ end }
+ env.os = setmetatable(os, {__index = _G.os})
+ env.print = DisplayShell
+ env.dofile = dofile
+ env.loadfile = loadfile
+ env.RELFILE = relativeFilename
+ env.RELPATH = relativeFilepath
+
+ return env
+end
+
+local env = createenv()
+
+function ShellSetAlias(alias, table)
+ local value = env[alias]
+ env[alias] = table
+ return value
+end
+
+local function packResults(status, ...) return status, {...} end
+
+local function executeShellCode(tx)
+ if tx == nil or tx == '' then return end
+
+ local forcelocalprefix = '^!'
+ local forcelocal = tx:find(forcelocalprefix)
+ tx = tx:gsub(forcelocalprefix, '')
+
+ DisplayShellPrompt('')
+
+ -- try to compile as statement
+ local _, err = loadstring(tx)
+ local isstatement = not err
+
+ if remotesend and not forcelocal then remotesend(tx, isstatement); return end
+
+ local addedret, forceexpression = true, tx:match("^%s*=%s*")
+ tx = tx:gsub("^%s*=%s*","")
+ local fn
+ fn, err = loadstring("return "..tx)
+ if not forceexpression and err then
+ fn, err = loadstring(tx)
+ addedret = false
+ end
+
+ if fn == nil and err then
+ DisplayShellErr(filterTraceError(err, addedret))
+ elseif fn then
+ setfenv(fn,env)
+
+ -- set the project dir as the current dir to allow "require" calls
+ -- to work from shell
+ local projectDir, cwd = FileTreeGetDir(), nil
+ if projectDir and #projectDir > 0 then
+ cwd = wx.wxFileName.GetCwd()
+ wx.wxFileName.SetCwd(projectDir)
+ end
+
+ local ok, res = packResults(xpcall(fn,
+ function(err)
+ DisplayShellErr(filterTraceError(debug.traceback(err), addedret))
+ end))
+
+ -- restore the current dir
+ if cwd then wx.wxFileName.SetCwd(cwd) end
+
+ if ok and (addedret or #res > 0) then
+ if addedret then
+ local mobdebug = require "mobdebug"
+ for i,v in pairs(res) do -- stringify each of the returned values
+ res[i] = (forceexpression and i > 1 and '\n' or '') ..
+ mobdebug.line(v, {nocode = true, comment = 1,
+ -- if '=' is used, then use multi-line serialized output
+ indent = forceexpression and ' ' or nil})
+ end
+ -- add nil only if we are forced (using =) or if this is not a statement
+ -- this is needed to print 'nil' when asked for 'foo',
+ -- and don't print it when asked for 'print(1)'
+ if #res == 0 and (forceexpression or not isstatement) then
+ res = {'nil'}
+ end
+ end
+ DisplayShell(unpack(res))
+ end
+ end
+end
+
+function ShellSupportRemote(client)
+ remotesend = client
+
+ local index = bottomnotebook:GetPageIndex(out)
+ if index then
+ bottomnotebook:SetPageText(index,
+ client and TR("Remote console") or TR("Local console"))
+ end
+end
+
+function ShellExecuteFile(wfilename)
+ if (not wfilename) then return end
+ local cmd = 'dofile([['..wfilename:GetFullPath()..']])'
+ ShellExecuteCode(cmd)
+end
+
+ShellExecuteInline = executeShellCode
+function ShellExecuteCode(code)
+ local index = bottomnotebook:GetPageIndex(bottomnotebook.shellbox)
+ if ide.config.activateoutput and bottomnotebook:GetSelection() ~= index then
+ bottomnotebook:SetSelection(index)
+ end
+
+ DisplayShellDirect(code)
+ executeShellCode(code)
+end
+
+local function displayShellIntro()
+ DisplayShellMsg(TR("Welcome to the interactive Lua interpreter.").." "
+ ..TR("Enter Lua code and press Enter to run it.").."\n"
+ ..TR("Use Shift-Enter for multiline code.").." "
+ ..TR("Use 'clear' to clear the shell output and the history.").."\n"
+ ..TR("Prepend '=' to show complex values on multiple lines.").." "
+ ..TR("Prepend '!' to force local execution."))
+ DisplayShellPrompt('')
+end
+
+out:Connect(wx.wxEVT_KEY_DOWN,
+ function (event)
+ -- this loop is only needed to allow to get to the end of function easily
+ -- "return" aborts the processing and ignores the key
+ -- "break" aborts the processing and processes the key normally
+ while true do
+ local key = event:GetKeyCode()
+ if key == wx.WXK_UP or key == wx.WXK_NUMPAD_UP then
+ -- if we are below the prompt line, then allow to go up
+ -- through multiline entry
+ if out:GetCurrentLine() > getPromptLine() then break end
+
+ -- if we are not on the caret line, move normally
+ if not caretOnPromptLine() then break end
+
+ local promptText = getPromptText()
+ setPromptText(getNextHistoryLine(false, promptText))
+ return
+ elseif key == wx.WXK_DOWN or key == wx.WXK_NUMPAD_DOWN then
+ -- if we are above the last line, then allow to go down
+ -- through multiline entry
+ local totalLines = out:GetLineCount()-1
+ if out:GetCurrentLine() < totalLines then break end
+
+ -- if we are not on the caret line, move normally
+ if not caretOnPromptLine() then break end
+
+ local promptText = getPromptText()
+ setPromptText(getNextHistoryLine(true, promptText))
+ return
+ elseif key == wx.WXK_TAB then
+ -- if we are above the prompt line, then don't move
+ local promptline = getPromptLine()
+ if out:GetCurrentLine() < promptline then return end
+
+ local promptText = getPromptText()
+ -- save the position in the prompt text to restore
+ local pos = out:GetCurrentPos()
+ local text = promptText:sub(1, positionInLine(promptline))
+ if #text == 0 then return end
+
+ -- find the next match and set the prompt text
+ local match = getNextHistoryMatch(text)
+ if match then
+ setPromptText(match)
+ -- restore the position to make it easier to find the next match
+ out:GotoPos(pos)
+ end
+ return
+ elseif key == wx.WXK_ESCAPE then
+ setPromptText("")
+ return
+ elseif key == wx.WXK_BACK then
+ if not caretOnPromptLine(true) then return end
+ elseif key == wx.WXK_DELETE or key == wx.WXK_NUMPAD_DELETE then
+ if not caretOnPromptLine()
+ or out:LineFromPosition(out:GetSelectionStart()) < getPromptLine() then
+ return
+ end
+ elseif key == wx.WXK_PAGEUP or key == wx.WXK_NUMPAD_PAGEUP
+ or key == wx.WXK_PAGEDOWN or key == wx.WXK_NUMPAD_PAGEDOWN
+ or key == wx.WXK_END or key == wx.WXK_NUMPAD_END
+ or key == wx.WXK_HOME or key == wx.WXK_NUMPAD_HOME
+ or key == wx.WXK_LEFT or key == wx.WXK_NUMPAD_LEFT
+ or key == wx.WXK_RIGHT or key == wx.WXK_NUMPAD_RIGHT
+ or key == wx.WXK_SHIFT or key == wx.WXK_CONTROL
+ or key == wx.WXK_ALT then
+ break
+ elseif key == wx.WXK_RETURN or key == wx.WXK_NUMPAD_ENTER then
+ if not caretOnPromptLine()
+ or out:LineFromPosition(out:GetSelectionStart()) < getPromptLine() then
+ return
+ end
+
+ -- allow multiline entry for shift+enter
+ if caretOnPromptLine(true) and event:ShiftDown() then break end
+
+ local promptText = getPromptText()
+ if #promptText == 0 then return end -- nothing to execute, exit
+ if promptText == 'clear' then
+ out:Erase()
+ else
+ DisplayShellDirect('\n')
+ executeShellCode(promptText)
+ end
+ currentHistory = getPromptLine() -- reset history
+ return -- don't need to do anything else with return
+ else
+ -- move cursor to end if not already there
+ if not caretOnPromptLine() then
+ out:GotoPos(out:GetLength())
+ -- check if the selection starts before the prompt line and reset it
+ elseif out:LineFromPosition(out:GetSelectionStart()) < getPromptLine() then
+ out:GotoPos(out:GetLength())
+ out:SetSelection(out:GetSelectionEnd()+1,out:GetSelectionEnd())
+ end
+ end
+ break
+ end
+ event:Skip()
+ end)
+
+local function inputEditable(line)
+ return caretOnPromptLine(false, line) and
+ not (out:LineFromPosition(out:GetSelectionStart()) < getPromptLine())
+end
+
+-- new Scintilla (3.2.1) changed the way markers move when the text is updated
+-- ticket: http://sourceforge.net/p/scintilla/bugs/939/
+-- discussion: https://groups.google.com/forum/?hl=en&fromgroups#!topic/scintilla-interest/4giFiKG4VXo
+if ide.wxver >= "2.9.5" then
+ -- this is a workaround that stores a position of the last prompt marker
+ -- before insert and restores the same position after (as the marker)
+ -- could have moved if the text is added at the beginning of the line.
+ local promptAt
+ out:Connect(wxstc.wxEVT_STC_MODIFIED,
+ function (event)
+ local evtype = event:GetModificationType()
+ if bit.band(evtype, wxstc.wxSTC_MOD_BEFOREINSERT) ~= 0 then
+ local promptLine = getPromptLine()
+ if promptLine and event:GetPosition() == out:PositionFromLine(promptLine)
+ then promptAt = promptLine end
+ end
+ if bit.band(evtype, wxstc.wxSTC_MOD_INSERTTEXT) ~= 0 then
+ local promptLine = getPromptLine()
+ if promptLine and promptAt then
+ out:MarkerDelete(promptLine, PROMPT_MARKER)
+ out:MarkerAdd(promptAt, PROMPT_MARKER)
+ promptAt = nil
+ end
+ end
+ end)
+end
+
+out:Connect(wxstc.wxEVT_STC_UPDATEUI,
+ function (event) out:SetReadOnly(not inputEditable()) end)
+
+-- only allow copy/move text by dropping to the input line
+out:Connect(wxstc.wxEVT_STC_DO_DROP,
+ function (event)
+ if not inputEditable(out:LineFromPosition(event:GetPosition())) then
+ event:SetDragResult(wx.wxDragNone)
+ end
+ end)
+
+if ide.config.outputshell.nomousezoom then
+ -- disable zoom using mouse wheel as it triggers zooming when scrolling
+ -- on OSX with kinetic scroll and then pressing CMD.
+ out:Connect(wx.wxEVT_MOUSEWHEEL,
+ function (event)
+ if wx.wxGetKeyState(wx.WXK_CONTROL) then return end
+ event:Skip()
+ end)
+end
+
+displayShellIntro()
+
+function out:Erase()
+ self:ClearAll()
+ displayShellIntro()
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/singleinstance.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/singleinstance.lua
new file mode 100644
index 0000000..450cb6f
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/singleinstance.lua
@@ -0,0 +1,98 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local ide = ide
+--[[ single instance
+open an UDP port - if it fails it is either because
+- IDE is running already
+- an application is already blocking that port
+if it fails it tries to contact the running application
+- if it confirms being the IDE we let that instance open it, finish our application
+- otherwise we throw an error message on the user and start like normal
+
+probably a pitfal: an instance is running but is not visible
+ (because it was finished though the UDP thing still runs)
+]]
+
+if not ide.config.singleinstance then return end
+
+local socket = require "socket"
+local port = ide.config.singleinstanceport
+local delay = tonumber(ide.config.singleinstance) or 1000 -- in ms
+local svr = socket.udp()
+local success = svr:setsockname("127.0.0.1",port) -- bind on local host
+local protocol = {client = {}, server = {}}
+
+protocol.client.greeting = "Is this you, my IDE? It's me, a new instance."
+protocol.server.greeting = "Yes it is me, running as: %s"
+protocol.client.requestloading = "Could you please load this file for me: %s"
+protocol.server.answerok = "Sure. You may now leave."
+
+if success then -- ok, server was started, we are solo
+ --TODO: if multiple files are to be opened, each file is handled one by one - we could create a single string instead...
+ ide.idletimer = wx.wxTimer(wx.wxGetApp())
+ ide.idletimer:Start(delay,false)
+ svr:settimeout(0) -- don't block
+ wx.wxGetApp():Connect(wx.wxEVT_TIMER, function()
+ if ide.exitingProgram then -- if exiting, terminate the timer loop
+ wx.wxGetApp():Disconnect(wx.wxEVT_TIMER)
+ return
+ end
+
+ local msg, ip, port = svr:receivefrom()
+ if msg then
+ if msg == protocol.client.greeting then
+ svr:sendto(protocol.server.greeting:format(wx.wxGetUserName()),ip,port)
+ elseif msg:match(protocol.client.requestloading:gsub("%%s",".+$")) then -- ok we need to open something
+ svr:sendto(protocol.server.answerok,ip,port)
+ local filename = msg:match(protocol.client.requestloading:gsub("%%s","(.+)$"))
+ if filename then
+ RequestAttention()
+ if wx.wxDirExists(filename) then
+ ProjectUpdateProjectDir(filename)
+ elseif not ActivateFile(filename) then
+ DisplayOutputLn(TR("Can't open file '%s': %s"):format(filename, wx.wxSysErrorMsg()))
+ end
+ end
+ end
+ end
+ end)
+else -- something different is running on our port
+ local cln = socket.udp()
+ cln:setpeername("127.0.0.1",port)
+ cln:settimeout(2)
+ cln:send(protocol.client.greeting)
+
+ local msg = cln:receive()
+ local arg = ide.arg
+ if msg and msg:match(protocol.server.greeting:gsub("%%s",".+$")) then
+ local username = msg:match(protocol.server.greeting:gsub("%%s","(.+)$"))
+ if username ~= wx.wxGetUserName() then
+ print(("Another instance is running under user '%s' and can't be activated. This instance will continue running, which may cause interference with the debugger."):format(username))
+ else
+ local failed = false
+ for index = 2, #arg do
+ local fileName = arg[index]
+ if fileName ~= "--"
+ -- on OSX, the command line includes -psn parameter, so ignore it
+ and (ide.osname ~= 'Macintosh' or not fileName:find("^-psn")) then
+ cln:send(protocol.client.requestloading:format(fileName))
+
+ local msg, err = cln:receive()
+ if msg ~= protocol.server.answerok then
+ failed = true
+ print(err,msg)
+ end
+ end
+ end
+ if failed then
+ print("The server instance failed to open the files, this instance will continue running.")
+ else -- done
+ os.exit(0)
+ end
+ end
+ else
+ print("The single instance communication has failed; there may be another instance running, which may cause interference with the debugger.")
+ end
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/style.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/style.lua
new file mode 100644
index 0000000..077fa41
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/style.lua
@@ -0,0 +1,441 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+----------
+-- Style
+--
+-- common style attributes
+-- ---------------------------
+-- fg foreground - {r,g,b} 0-255
+-- bg background - {r,g,b} 0-255
+-- alpha translucency - 0-255 (0 - transparent, 255 - opaque, 256 - opaque/faster)
+-- sel color of the selected block - {r,g,b} 0-255 (only applies to folds)
+-- u underline - boolean
+-- b bold - boolean
+-- i italic - boolean
+-- fill fill to end - boolean
+-- fn font Face Name - string ("Lucida Console")
+-- fs font size - number (11)
+-- hs turn hotspot on - true or {r,g,b} 0-255
+-- v visibility for symbols of the current style - boolean
+
+local unpack = table.unpack or unpack
+
+function StylesGetDefault()
+ return {
+ -- lexer specific (inherit fg/bg from text)
+ lexerdef = {fg = {160, 160, 160}},
+ comment = {fg = {128, 128, 128}},
+ stringtxt = {fg = {128, 32, 16}},
+ stringeol = {fg = {128, 32, 16}, bg = {224, 192, 224}, fill = true},
+ preprocessor = {fg = {128, 128, 0}},
+ operator = {fg = {64, 64, 64}},
+ number = {fg = {80, 112, 255}},
+
+ keywords0 = {fg = {32, 32, 192}},
+ keywords1 = {fg = {127, 32, 96}},
+ keywords2 = {fg = {32, 127, 96}},
+ keywords3 = {fg = {64, 32, 96}},
+ keywords4 = {fg = {127, 0, 95}},
+ keywords5 = {fg = {35, 95, 175}},
+ keywords6 = {fg = {0, 127, 127}},
+ keywords7 = {fg = {240, 255, 255}},
+
+ -- common (inherit fg/bg from text)
+ text = {fg = {64, 64, 64}, bg = {250, 250, 250}},
+ linenumber = {fg = {128, 128, 128}, bg = {250, 250, 250}},
+ bracematch = {fg = {32, 128, 255}, b = true},
+ bracemiss = {fg = {255, 128, 32}, b = true},
+ ctrlchar = nil,
+ indent = {fg = {192, 192, 230}, bg = {255, 255, 255}},
+ calltip = nil,
+
+ -- common special (need custom fg & bg)
+ sel = {bg = {208, 208, 208}},
+ caret = {fg = {0, 0, 0}},
+ caretlinebg = {bg = {240, 240, 230}},
+ fold = {fg = {192, 192, 192}, bg = {250, 250, 250}, sel = {160, 128, 224}},
+ whitespace = nil,
+ edge = {},
+
+ -- deprecated; allowed for backward compatibility in case someone does
+ -- fncall.fg = {...}
+ fncall = {},
+
+ -- markup
+ ['|'] = {fg = {127, 0, 127}},
+ ['`'] = {fg = {64, 128, 64}},
+ ['['] = {hs = {32, 32, 127}},
+
+ -- markers
+ marker = {
+ currentline = {},
+ breakpoint = {},
+ message = {},
+ output = {},
+ prompt = {},
+ error = {},
+ searchmatchfile = {},
+ },
+
+ -- indicators
+ indicator = {
+ fncall = {},
+ varlocal = {},
+ varglobal = {},
+ varmasking = {},
+ varmasked = {},
+ searchmatch = {},
+ },
+ }
+end
+
+local markers = {
+ breakpoint = {0, wxstc.wxSTC_MARK_CIRCLE, wx.wxColour(196, 64, 64), wx.wxColour(220, 64, 64)},
+ bookmark = {1, wxstc.wxSTC_MARK_SHORTARROW, wx.wxColour(16, 96, 128), wx.wxColour(96, 160, 220)},
+ currentline = {2, wxstc.wxSTC_MARK_ARROW, wx.wxColour(16, 128, 16), wx.wxColour(64, 220, 64)},
+ message = {3, wxstc.wxSTC_MARK_CHARACTER+(' '):byte(), wx.wxBLACK, wx.wxColour(220, 220, 220)},
+ output = {4, wxstc.wxSTC_MARK_BACKGROUND, wx.wxBLACK, wx.wxColour(240, 240, 240)},
+ prompt = {5, wxstc.wxSTC_MARK_ARROWS, wx.wxBLACK, wx.wxColour(220, 220, 220)},
+ error = {6, wxstc.wxSTC_MARK_BACKGROUND, wx.wxBLACK, wx.wxColour(255, 220, 220)},
+ searchmatchfile = {7, wxstc.wxSTC_MARK_EMPTY, wx.wxBLACK, wx.wxColour(196, 0, 0)},
+}
+function StylesGetMarker(marker) return unpack(markers[marker] or {}) end
+function StylesRemoveMarker(marker) markers[marker] = nil end
+function StylesAddMarker(marker, ch, fg, bg)
+ local num = (markers[marker] or {})[1]
+ if not num then -- new marker; find the smallest available marker number
+ local nums = {}
+ for _, mark in pairs(markers) do nums[mark[1]] = true end
+ num = #nums + 1
+ if num > 24 then return end -- 24 markers with no pre-defined functions
+ end
+ markers[marker] = {num, ch, wx.wxColour(unpack(fg)), wx.wxColour(unpack(bg))}
+ return num
+end
+
+local function applymarker(editor,marker,clrfg,clrbg,clrsel)
+ if (clrfg) then editor:MarkerSetForeground(marker,clrfg) end
+ if (clrbg) then editor:MarkerSetBackground(marker,clrbg) end
+ if (ide.wxver >= "2.9.5" and clrsel) then editor:MarkerSetBackgroundSelected(marker,clrsel) end
+end
+local specialmapping = {
+ sel = function(editor,style)
+ if (style.fg) then
+ editor:SetSelForeground(1,wx.wxColour(unpack(style.fg)))
+ else
+ editor:SetSelForeground(0,wx.wxWHITE)
+ end
+ if (style.bg) then
+ editor:SetSelBackground(1,wx.wxColour(unpack(style.bg)))
+ else
+ editor:SetSelBackground(0,wx.wxWHITE)
+ end
+ if (style.alpha and ide.wxver >= "2.9.5") then
+ editor:SetSelAlpha(style.alpha)
+ end
+
+ -- set alpha for additional selecton: 0 - transparent, 255 - opaque
+ if ide.wxver >= "2.9.5" then editor:SetAdditionalSelAlpha(127) end
+ end,
+
+ seladd = function(editor,style)
+ if ide.wxver >= "2.9.5" then
+ if (style.fg) then
+ editor:SetAdditionalSelForeground(wx.wxColour(unpack(style.fg)))
+ end
+ if (style.bg) then
+ editor:SetAdditionalSelBackground(wx.wxColour(unpack(style.bg)))
+ end
+ if (style.alpha) then
+ editor:SetAdditionalSelAlpha(style.alpha)
+ end
+ end
+ end,
+
+ caret = function(editor,style)
+ if (style.fg) then
+ editor:SetCaretForeground(wx.wxColour(unpack(style.fg)))
+ end
+ end,
+
+ caretlinebg = function(editor,style)
+ if (style.bg) then
+ editor:SetCaretLineBackground(wx.wxColour(unpack(style.bg)))
+ end
+ if (style.alpha and ide.wxver >= "2.9.5") then
+ editor:SetCaretLineBackAlpha(style.alpha)
+ end
+ end,
+
+ whitespace = function(editor,style)
+ if (style.fg) then
+ editor:SetWhitespaceForeground(1,wx.wxColour(unpack(style.fg)))
+ else
+ --editor:SetWhitespaceForeground(0)
+ end
+ if (style.bg) then
+ editor:SetWhitespaceBackground(1,wx.wxColour(unpack(style.bg)))
+ else
+ --editor:SetWhitespaceBackground(0)
+ end
+ end,
+
+ fold = function(editor,style)
+ local clrfg = style.fg and wx.wxColour(unpack(style.fg))
+ local clrbg = style.bg and wx.wxColour(unpack(style.bg))
+ local clrhi = style.hi and wx.wxColour(unpack(style.hi))
+ local clrsel = style.sel and wx.wxColour(unpack(style.sel))
+
+ -- if selected background is set then enable support for it
+ if ide.wxver >= "2.9.5" and clrsel then editor:MarkerEnableHighlight(true) end
+
+ if (clrfg or clrbg or clrsel) then
+ -- foreground and background are defined as opposite to what I'd expect
+ -- for fold markers in Scintilla's terminilogy:
+ -- background is the color of fold lines/boxes and foreground is the color
+ -- of everything around fold lines or inside fold boxes.
+ -- in the following code fg and bg are simply reversed
+ local clrfg, clrbg = clrbg, clrfg
+ applymarker(editor,wxstc.wxSTC_MARKNUM_FOLDEROPEN, clrfg, clrbg, clrsel)
+ applymarker(editor,wxstc.wxSTC_MARKNUM_FOLDER, clrfg, clrbg, clrsel)
+ applymarker(editor,wxstc.wxSTC_MARKNUM_FOLDERSUB, clrfg, clrbg, clrsel)
+ applymarker(editor,wxstc.wxSTC_MARKNUM_FOLDERTAIL, clrfg, clrbg, clrsel)
+ applymarker(editor,wxstc.wxSTC_MARKNUM_FOLDEREND, clrfg, clrbg, clrsel)
+ applymarker(editor,wxstc.wxSTC_MARKNUM_FOLDEROPENMID, clrfg, clrbg, clrsel)
+ applymarker(editor,wxstc.wxSTC_MARKNUM_FOLDERMIDTAIL, clrfg, clrbg, clrsel)
+ end
+ if clrbg then
+ -- the earlier calls only color the actual markers, but not the
+ -- overall fold background; SetFoldMargin calls below do this.
+ -- http://community.activestate.com/forum-topic/fold-margin-colors
+ -- http://www.scintilla.org/ScintillaDoc.html#SCI_SETFOLDMARGINCOLOUR
+ editor:SetFoldMarginColour(true, clrbg)
+ editor:SetFoldMarginHiColour(true, clrbg)
+ end
+ if clrhi then
+ editor:SetFoldMarginHiColour(true, clrhi)
+ end
+ end,
+
+ edge = function(editor,style)
+ if style.fg or style.col or style.mode then
+ editor:SetEdgeColour(wx.wxColour(unpack(style.fg or {220, 220, 220})))
+ editor:SetEdgeMode(style.mode or wxstc.wxSTC_EDGE_LINE)
+ editor:SetEdgeColumn(style.col or 80)
+ end
+ end,
+
+ marker = function(editor,markers)
+ for m, style in pairs(markers) do
+ local id, ch, fg, bg = StylesGetMarker(m)
+ if style.ch then ch = style.ch end
+ if style.fg then fg = wx.wxColour(unpack(style.fg)) end
+ if style.bg then bg = wx.wxColour(unpack(style.bg)) end
+ editor:MarkerDefine(id, ch, fg, bg)
+ end
+ end,
+
+ auxwindow = function(editor,style)
+ if not style then return end
+
+ -- don't color toolbars as they have their own color/style
+ local skipcolor = {wxAuiToolBar = true, wxToolBar = true}
+ local default = wxstc.wxSTC_STYLE_DEFAULT
+ local bg = style.bg and wx.wxColour(unpack(style.bg)) or editor:StyleGetBackground(default)
+ local fg = style.fg and wx.wxColour(unpack(style.fg)) or editor:StyleGetForeground(default)
+
+ local uimgr = ide.frame.uimgr
+ local panes = uimgr:GetAllPanes()
+ for index = 0, panes:GetCount()-1 do
+ local wind = uimgr:GetPane(panes:Item(index).name).window
+
+ -- wxlua compiled with STL doesn't provide GetChildren() method
+ -- as per http://sourceforge.net/p/wxlua/mailman/message/32500995/
+ local ok, children = pcall(function() return wind:GetChildren() end)
+ if not ok then break end
+
+ for child = 0, children:GetCount()-1 do
+ local data = children:Item(child):GetData()
+ local _, window = pcall(function() return data:DynamicCast("wxWindow") end)
+ if window and not skipcolor[window:GetClassInfo():GetClassName()] then
+ window:SetBackgroundColour(bg)
+ window:SetForegroundColour(fg)
+ window:Refresh()
+ end
+ end
+ end
+ end,
+}
+
+local defaultmapping = {
+ text = wxstc.wxSTC_STYLE_DEFAULT,
+ linenumber = wxstc.wxSTC_STYLE_LINENUMBER,
+ bracematch = wxstc.wxSTC_STYLE_BRACELIGHT,
+ bracemiss = wxstc.wxSTC_STYLE_BRACEBAD,
+ ctrlchar = wxstc.wxSTC_STYLE_CONTROLCHAR,
+ indent = wxstc.wxSTC_STYLE_INDENTGUIDE,
+ calltip = wxstc.wxSTC_STYLE_CALLTIP,
+}
+
+function StylesApplyToEditor(styles,editor,font,fontitalic,lexerconvert)
+ local defaultfg = styles.text and styles.text.fg and wx.wxColour(unpack(styles.text.fg)) or nil
+ local defaultbg = styles.text and styles.text.bg and wx.wxColour(unpack(styles.text.bg)) or nil
+
+ local function applystyle(style,id)
+ editor:StyleSetFont(id, style.i and fontitalic or font)
+ editor:StyleSetBold(id, style.b or false)
+ editor:StyleSetUnderline(id, style.u or false)
+ editor:StyleSetEOLFilled(id, style.fill or false)
+
+ if style.fn then editor:StyleSetFaceName(id, style.fn) end
+ if style.fs then editor:StyleSetSize(id, style.fs) end
+ if style.v ~= nil then editor:StyleSetVisible(id, style.v) end
+
+ if style.hs then
+ editor:StyleSetHotSpot(id, 1)
+ -- if passed a color (table) as value, set it as foreground
+ if type(style.hs) == 'table' then
+ local color = wx.wxColour(unpack(style.hs))
+ editor:SetHotspotActiveForeground(1, color)
+ end
+ editor:SetHotspotActiveUnderline(1)
+ editor:SetHotspotSingleLine(1)
+ end
+
+ if (style.fg or defaultfg) then
+ editor:StyleSetForeground(id, style.fg and wx.wxColour(unpack(style.fg)) or defaultfg)
+ end
+ if (style.bg or defaultbg) then
+ editor:StyleSetBackground(id, style.bg and wx.wxColour(unpack(style.bg)) or defaultbg)
+ end
+ end
+
+ editor:StyleResetDefault()
+ editor:SetFont(font)
+ if (styles.text) then
+ applystyle(styles.text,defaultmapping["text"])
+ else
+ applystyle({},defaultmapping["text"])
+ end
+ editor:StyleClearAll()
+
+ -- set the default linenumber font size based on the editor font size
+ if styles.linenumber and not styles.linenumber.fs then
+ styles.linenumber.fs = ide.config.editor.fontsize and (ide.config.editor.fontsize - 1) or nil
+ end
+
+ for name,style in pairs(styles) do
+ if (specialmapping[name]) then
+ specialmapping[name](editor,style)
+ elseif (defaultmapping[name]) then
+ applystyle(style,defaultmapping[name])
+ end
+
+ if (lexerconvert and lexerconvert[name]) then
+ local targets = lexerconvert[name]
+ for _, outid in pairs(targets) do
+ applystyle(style,outid)
+ end
+ -- allow to specify style numbers, but exclude those styles
+ -- that may conflict with indicator numbers
+ elseif (style.st and style.st > 8 and style.st < wxstc.wxSTC_STYLE_DEFAULT) then
+ applystyle(style,style.st)
+ end
+ end
+
+ -- additional selection (seladd) attributes can only be set after
+ -- normal selection (sel) attributes are set, so handle them again
+ if styles.seladd then specialmapping.seladd(editor, styles.seladd) end
+
+ -- calltip has a special style that needs to be enabled
+ if styles.calltip then editor:CallTipUseStyle(2) end
+
+ do
+ local defaultfg = {127,127,127}
+ local indic = styles.indicator or {}
+
+ -- use styles.fncall if not empty and if indic.fncall is empty
+ -- for backward compatibility
+ if type(styles.fncall) == 'table' and next(styles.fncall)
+ and not (type(indic.fncall) == 'table' and next(indic.fncall)) then indic.fncall = styles.fncall end
+
+ local fncall = ide:AddIndicator("core.fncall")
+ local varlocal = ide:AddIndicator("core.varlocal")
+ local varglobal = ide:AddIndicator("core.varglobal")
+ local varmasking = ide:AddIndicator("core.varmasking")
+ local varmasked = ide:AddIndicator("core.varmasked")
+ local searchmatch = ide:AddIndicator("core.searchmatch")
+
+ editor:IndicatorSetStyle(fncall, indic.fncall and indic.fncall.st or ide.wxver >= "2.9.5" and wxstc.wxSTC_INDIC_ROUNDBOX or wxstc.wxSTC_INDIC_TT)
+ editor:IndicatorSetForeground(fncall, wx.wxColour(unpack(indic.fncall and indic.fncall.fg or {128, 128, 255})))
+ editor:IndicatorSetStyle(varlocal, indic.varlocal and indic.varlocal.st or wxstc.wxSTC_INDIC_DOTS or wxstc.wxSTC_INDIC_TT)
+ editor:IndicatorSetForeground(varlocal, wx.wxColour(unpack(indic.varlocal and indic.varlocal.fg or defaultfg)))
+ editor:IndicatorSetStyle(varglobal, indic.varglobal and indic.varglobal.st or wxstc.wxSTC_INDIC_PLAIN)
+ editor:IndicatorSetForeground(varglobal, wx.wxColour(unpack(indic.varglobal and indic.varglobal.fg or defaultfg)))
+ editor:IndicatorSetStyle(varmasking, indic.varmasking and indic.varmasking.st or wxstc.wxSTC_INDIC_DASH or wxstc.wxSTC_INDIC_DIAGONAL)
+ editor:IndicatorSetForeground(varmasking, wx.wxColour(unpack(indic.varmasking and indic.varmasking.fg or defaultfg)))
+ editor:IndicatorSetStyle(varmasked, indic.varmasked and indic.varmasked.st or wxstc.wxSTC_INDIC_STRIKE)
+ editor:IndicatorSetForeground(varmasked, wx.wxColour(unpack(indic.varmasked and indic.varmasked.fg or defaultfg)))
+ editor:IndicatorSetStyle(searchmatch, indic.searchmatch and indic.searchmatch.st or wxstc.wxSTC_INDIC_BOX)
+ editor:IndicatorSetForeground(searchmatch, wx.wxColour(unpack(indic.searchmatch and indic.searchmatch.fg or {196, 0, 0})))
+ end
+end
+
+function ReApplySpecAndStyles()
+ -- re-register markup styles as they are special:
+ -- these styles need to be updated as they are based on comment styles
+ if MarkupAddStyles then MarkupAddStyles(ide.config.styles) end
+
+ local errorlog = ide.frame.bottomnotebook.errorlog
+ local shellbox = ide.frame.bottomnotebook.shellbox
+ SetupKeywords(shellbox,"lua",nil,ide.config.stylesoutshell,ide.font.oNormal,ide.font.oItalic)
+ StylesApplyToEditor(ide.config.stylesoutshell,errorlog,ide.font.oNormal,ide.font.oItalic)
+
+ for _, doc in pairs(ide:GetDocuments()) do
+ if doc.editor.spec then doc.editor:SetupKeywords(nil, doc.editor.spec) end
+ end
+end
+
+function ApplyStyleConfig(config, style)
+ if not wx.wxIsAbsolutePath(config)
+ then config = MergeFullPath(GetPathWithSep(ide.editorFilename), config) end
+
+ local cfg = {wxstc = wxstc, math = math, print = DisplayOutputLn,
+ path = {}, editor = {}, view ={}, acandtip = {}, outputshell = {}, debugger={}}
+ local cfgfn, err = loadfile(config)
+ if not cfgfn then
+ DisplayOutputLn(TR("Error while loading configuration file: %s"):format(err))
+ return
+ end
+
+ setfenv(cfgfn,cfg)
+ cfgfn, err = pcall(cfgfn,style)
+ if not cfgfn then
+ DisplayOutputLn(TR("Error while processing configuration file: %s"):format(err))
+ return
+ end
+
+ -- if no style assigned explicitly, but a table is returned, use it
+ if not (cfg.styles or cfg.stylesoutshell) and type(err) == 'table' then
+ cfg.styles = err
+ end
+
+ if cfg.styles or cfg.stylesoutshell then
+ if (cfg.styles) then
+ ide.config.styles = StylesGetDefault()
+ -- copy
+ for i,s in pairs(cfg.styles) do
+ ide.config.styles[i] = s
+ end
+ end
+ if (cfg.stylesoutshell) then
+ ide.config.stylesoutshell = StylesGetDefault()
+ -- copy
+ for i,s in pairs(cfg.stylesoutshell) do
+ ide.config.stylesoutshell[i] = s
+ end
+ end
+ ReApplySpecAndStyles()
+ end
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/editor/toolbar.lua b/love2dToAPK/tools/tools/zbstudio-win/src/editor/toolbar.lua
new file mode 100644
index 0000000..e7dd878
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/editor/toolbar.lua
@@ -0,0 +1,55 @@
+-- Copyright 2014-15 Paul Kulchenko, ZeroBrane LLC
+
+local TR = function(...) return ... end
+
+ide.config.toolbar.icons = {
+ ID.NEW, ID.OPEN, ID.SAVE, ID.SAVEALL, ID.PROJECTDIRFROMFILE, ID.PROJECTDIRCHOOSE,
+ ID.SEPARATOR,
+ ID.FIND, ID.REPLACE, ID.FINDINFILES,
+ ID.SEPARATOR,
+ ID.RUN, ID.STARTDEBUG, ID.RUNNOW, ID.STOPDEBUG, ID.DETACHDEBUG, ID.BREAK,
+ ID.STEP, ID.STEPOVER, ID.STEPOUT, ID.RUNTO,
+ ID.SEPARATOR,
+ ID.BREAKPOINTTOGGLE, ID.BOOKMARKTOGGLE, ID.VIEWCALLSTACK, ID.VIEWWATCHWINDOW,
+ [ID.FINDINFILES] = false,
+}
+
+ide.config.toolbar.iconmap = {
+ [ID.NEW] = {"FILE-NEW", TR("Create an empty document")},
+ [ID.OPEN] = {"FILE-OPEN", TR("Open an existing document")},
+ [ID.SAVE] = {"FILE-SAVE", TR("Save the current document")},
+ [ID.SAVEALL] = {"FILE-SAVE-ALL", TR("Save all open documents")},
+ [ID.PROJECTDIRFROMFILE]= {"DIR-SETUP-FILE", TR("Set project directory from current file")},
+ [ID.PROJECTDIRCHOOSE] = {"DIR-SETUP", TR("Choose a project directory")},
+ [ID.FIND] = {"FIND", TR("Find text")},
+ [ID.REPLACE] = {"FIND-AND-REPLACE", TR("Find and replace text")},
+ [ID.FINDINFILES] = {"FIND-IN-FILES", TR("Find in files")},
+ [ID.RUN] = {"RUN", TR("Execute the current project/file")},
+ [ID.RUNNOW] = {"RUN-NOW", TR("Run as Scratchpad")},
+ [ID.STARTDEBUG] = {"DEBUG-START", TR("Start or continue debugging")},
+ [ID.STOPDEBUG] = {"DEBUG-STOP", TR("Stop the currently running process")},
+ [ID.DETACHDEBUG]= {"DEBUG-DETACH", TR("Stop debugging and continue running the process")},
+ [ID.BREAK] = {"DEBUG-BREAK", TR("Break execution at the next executed line of code")},
+ [ID.RUNTO] = {"DEBUG-RUN-TO", TR("Run to cursor")},
+ [ID.STEP] = {"DEBUG-STEP-INTO", TR("Step into")},
+ [ID.STEPOVER] = {"DEBUG-STEP-OVER", TR("Step over")},
+ [ID.STEPOUT] = {"DEBUG-STEP-OUT", TR("Step out of the current function")},
+ [ID.BREAKPOINTTOGGLE] = {"DEBUG-BREAKPOINT-TOGGLE", TR("Toggle breakpoint")},
+ [ID.BOOKMARKTOGGLE] = {"BOOKMARK-TOGGLE", TR("Toggle bookmark")},
+ [ID.VIEWCALLSTACK] = {"DEBUG-CALLSTACK", TR("View the stack window")},
+ [ID.VIEWWATCHWINDOW] = {"DEBUG-WATCH", TR("View the watch window")},
+ -- search toolbar
+ [ID.FINDNEXT] = {"FIND", TR("Find")},
+ [ID.FINDREPLACENEXT] = {"FIND-REPLACE-NEXT", TR("Replace next instance")},
+ [ID.FINDREPLACEALL] = {"FIND-AND-REPLACE", TR("Replace all")},
+ [ID.FINDSETDIR] = {"FIND-OPT-SETDIR", TR("Set search directory")},
+ [ID.FINDOPTDIRECTION] = {"FIND-OPT-DOWN", TR("Search direction")},
+ [ID.FINDOPTWRAPWROUND] = {"FIND-OPT-WRAP-AROUND", TR("Wrap around")},
+ [ID.FINDOPTSELECTION] = {"FIND-OPT-SELECTION", TR("Search in selection")},
+ [ID.FINDOPTWORD] = {"FIND-OPT-WORD", TR("Match whole word")},
+ [ID.FINDOPTCASE] = {"FIND-OPT-CASE-SENSITIVE", TR("Match case")},
+ [ID.FINDOPTREGEX] = {"FIND-OPT-REGEX", TR("Regular expression")},
+ [ID.FINDOPTCONTEXT] = {"FIND-OPT-CONTEXT", TR("Show context")},
+ [ID.FINDOPTSUBDIR] = {"FIND-OPT-SUBDIR", TR("Search in subdirectories")},
+ [ID.FINDOPTMULTIRESULTS] = {"FIND-OPT-MULTI-RESULTS", TR("Show multiple result windows")},
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/main.lua b/love2dToAPK/tools/tools/zbstudio-win/src/main.lua
new file mode 100644
index 0000000..4d6b68c
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/main.lua
@@ -0,0 +1,774 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+-- put bin/ and lualibs/ first to avoid conflicts with included modules
+-- that may have other versions present somewhere else in path/cpath.
+local function isproc()
+ local file = io.open("/proc")
+ if file then file:close() end
+ return file ~= nil
+end
+local iswindows = os.getenv('WINDIR') or (os.getenv('OS') or ''):match('[Ww]indows')
+local islinux = not iswindows and isproc()
+local arch = "x86" -- use 32bit by default
+local unpack = table.unpack or unpack
+
+if islinux then
+ local file = io.popen("uname -m")
+ if file then
+ local machine=file:read("*l")
+ local archtype= { x86_64="x64", armv7l="armhf" }
+ arch = archtype[machine] or "x86"
+ file:close()
+ end
+end
+
+package.cpath = (
+ iswindows and 'bin/?.dll;bin/clibs/?.dll;' or
+ islinux and ('bin/linux/%s/lib?.so;bin/linux/%s/clibs/?.so;'):format(arch,arch) or
+ --[[isosx]] 'bin/lib?.dylib;bin/clibs/?.dylib;')
+ .. package.cpath
+package.path = 'lualibs/?.lua;lualibs/?/?.lua;lualibs/?/init.lua;lualibs/?/?/?.lua;lualibs/?/?/init.lua;'
+ .. package.path
+
+require("wx")
+require("bit")
+require("mobdebug")
+if jit and jit.on then jit.on() end -- turn jit "on" as "mobdebug" may turn it off for LuaJIT
+
+dofile "src/util.lua"
+
+-----------
+-- IDE
+--
+local pendingOutput = {}
+ide = {
+ MODPREF = "* ",
+ MAXMARGIN = 4,
+ config = {
+ path = {
+ projectdir = "",
+ app = nil,
+ },
+ editor = {
+ autoactivate = false,
+ foldcompact = true,
+ checkeol = true,
+ saveallonrun = false,
+ caretline = true,
+ showfncall = false,
+ autotabs = false,
+ usetabs = false,
+ tabwidth = 2,
+ usewrap = true,
+ wrapmode = wxstc.wxSTC_WRAP_WORD,
+ calltipdelay = 500,
+ smartindent = true,
+ fold = true,
+ autoreload = true,
+ indentguide = true,
+ backspaceunindent = true,
+ },
+ debugger = {
+ verbose = false,
+ hostname = nil,
+ port = nil,
+ runonstart = nil,
+ redirect = nil,
+ maxdatalength = 400,
+ maxdatanum = 400,
+ maxdatalevel = 3,
+ },
+ default = {
+ name = 'untitled',
+ fullname = 'untitled.lua',
+ interpreter = 'luadeb',
+ },
+ outputshell = {
+ usewrap = true,
+ },
+ filetree = {
+ mousemove = true,
+ },
+ outline = {
+ jumptocurrentfunction = true,
+ showanonymous = '~',
+ showcurrentfunction = true,
+ showcompact = false,
+ showflat = false,
+ showmethodindicator = false,
+ showonefile = false,
+ sort = false,
+ },
+ commandbar = {
+ prefilter = 250, -- number of records after which to apply filtering
+ maxitems = 30, -- max number of items to show
+ width = 0.35, -- <1 -- size in proportion to the app frame width; >1 -- size in pixels
+ showallsymbols = true,
+ },
+ staticanalyzer = {
+ infervalue = false, -- off by default as it's a slower mode
+ },
+ search = {
+ autocomplete = true,
+ contextlinesbefore = 2,
+ contextlinesafter = 2,
+ showaseditor = false,
+ zoom = 0,
+ autohide = false,
+ },
+ print = {
+ magnification = -3,
+ wrapmode = wxstc.wxSTC_WRAP_WORD,
+ colourmode = wxstc.wxSTC_PRINT_BLACKONWHITE,
+ header = "%S\t%D\t%p/%P",
+ footer = nil,
+ },
+ toolbar = {
+ icons = {},
+ iconmap = {},
+ },
+
+ keymap = {},
+ imagemap = {
+ ['VALUE-MCALL'] = 'VALUE-SCALL',
+ },
+ messages = {},
+ language = "en",
+
+ styles = nil,
+ stylesoutshell = nil,
+
+ autocomplete = true,
+ autoanalyzer = true,
+ acandtip = {
+ shorttip = true,
+ nodynwords = true,
+ ignorecase = false,
+ symbols = true,
+ droprest = true,
+ strategy = 2,
+ width = 60,
+ maxlength = 450,
+ warning = true,
+ },
+ arg = {}, -- command line arguments
+ api = {}, -- additional APIs to load
+
+ format = { -- various formatting strings
+ menurecentprojects = "%f | %i",
+ apptitle = "%T - %F",
+ },
+
+ activateoutput = true, -- activate output/console on Run/Debug/Compile
+ unhidewindow = false, -- to unhide a gui window
+ projectautoopen = true,
+ autorecoverinactivity = 10, -- seconds
+ outlineinactivity = 0.250, -- seconds
+ markersinactivity = 0.500, -- seconds
+ symbolindexinactivity = 2, -- seconds
+ filehistorylength = 20,
+ projecthistorylength = 20,
+ bordersize = 2,
+ savebak = false,
+ singleinstance = false,
+ singleinstanceport = 0xe493,
+ showmemoryusage = false,
+ showhiddenfiles = false,
+ hidpi = false, -- HiDPI/Retina display support
+ hotexit = false,
+ -- file exclusion lists
+ excludelist = {".svn/", ".git/", ".hg/", "CVS/", "*.pyc", "*.pyo", "*.exe", "*.dll", "*.obj","*.o", "*.a", "*.lib", "*.so", "*.dylib", "*.ncb", "*.sdf", "*.suo", "*.pdb", "*.idb", ".DS_Store", "*.class", "*.psd", "*.db"},
+ binarylist = {"*.jpg", "*.jpeg", "*.png", "*.gif", "*.ttf", "*.tga", "*.dds", "*.ico", "*.eot", "*.pdf", "*.swf", "*.jar", "*.zip", ".gz", ".rar"},
+ },
+ specs = {
+ none = {
+ sep = "\1",
+ }
+ },
+ tools = {},
+ iofilters = {},
+ interpreters = {},
+ packages = {},
+ apis = {},
+ timers = {},
+ onidle = {},
+
+ proto = {}, -- prototypes for various classes
+
+ app = nil, -- application engine
+ interpreter = nil, -- current Lua interpreter
+ frame = nil, -- gui related
+ debugger = {}, -- debugger related info
+ filetree = nil, -- filetree
+ findReplace = nil, -- find & replace handling
+ settings = nil, -- user settings (window pos, last files..)
+ session = {
+ projects = {}, -- project configuration for the current session
+ lastupdated = nil, -- timestamp of the last modification in any of the editors
+ lastsaved = nil, -- timestamp of the last recovery information saved
+ },
+
+ -- misc
+ exitingProgram = false, -- are we currently exiting, ID_EXIT
+ infocus = nil, -- last component with a focus
+ editorApp = wx.wxGetApp(),
+ editorFilename = nil,
+ openDocuments = {},-- open notebook editor documents[winId] = {
+ -- editor = wxStyledTextCtrl,
+ -- index = wxNotebook page index,
+ -- filePath = full filepath, nil if not saved,
+ -- fileName = just the filename,
+ -- modTime = wxDateTime of disk file or nil,
+ -- isModified = bool is the document modified? }
+ ignoredFilesList = {},
+ font = {
+ eNormal = nil,
+ eItalic = nil,
+ oNormal = nil,
+ oItalic = nil,
+ fNormal = nil,
+ },
+
+ osname = wx.wxPlatformInfo.Get():GetOperatingSystemFamilyName(),
+ osarch = arch,
+ oshome = os.getenv("HOME") or (iswindows and os.getenv('HOMEDRIVE') and os.getenv('HOMEPATH')
+ and (os.getenv('HOMEDRIVE')..os.getenv('HOMEPATH'))),
+ wxver = string.match(wx.wxVERSION_STRING, "[%d%.]+"),
+
+ test = {}, -- local functions used for testing
+
+ Print = function(self, ...)
+ if DisplayOutputLn then
+ -- flush any pending output
+ while #pendingOutput > 0 do DisplayOutputLn(unpack(table.remove(pendingOutput, 1))) end
+ -- print without parameters can be used for flushing, so skip the printing
+ if select('#', ...) > 0 then DisplayOutputLn(...) end
+ return
+ end
+ pendingOutput[#pendingOutput + 1] = {...}
+ end,
+}
+
+-- add wx.wxMOD_RAW_CONTROL as it's missing in wxlua 2.8.12.3;
+-- provide default for wx.wxMOD_CONTROL as it's missing in wxlua 2.8 that
+-- is available through Linux package managers
+if not wx.wxMOD_CONTROL then wx.wxMOD_CONTROL = 0x02 end
+if not wx.wxMOD_RAW_CONTROL then
+ wx.wxMOD_RAW_CONTROL = ide.osname == 'Macintosh' and 0x10 or wx.wxMOD_CONTROL
+end
+-- ArchLinux running 2.8.12.2 doesn't have wx.wxMOD_SHIFT defined
+if not wx.wxMOD_SHIFT then wx.wxMOD_SHIFT = 0x04 end
+-- wxDIR_NO_FOLLOW is missing in wxlua 2.8.12 as well
+if not wx.wxDIR_NO_FOLLOW then wx.wxDIR_NO_FOLLOW = 0x10 end
+if not wxaui.wxAUI_TB_PLAIN_BACKGROUND then wxaui.wxAUI_TB_PLAIN_BACKGROUND = 2^8 end
+
+if not setfenv then -- Lua 5.2
+ -- based on http://lua-users.org/lists/lua-l/2010-06/msg00314.html
+ -- this assumes f is a function
+ local function findenv(f)
+ local level = 1
+ repeat
+ local name, value = debug.getupvalue(f, level)
+ if name == '_ENV' then return level, value end
+ level = level + 1
+ until name == nil
+ return nil end
+ getfenv = function (f) return(select(2, findenv(f)) or _G) end
+ setfenv = function (f, t)
+ local level = findenv(f)
+ if level then debug.setupvalue(f, level, t) end
+ return f end
+end
+
+dofile "src/version.lua"
+
+for _, file in ipairs({"proto", "ids", "style", "keymap", "toolbar"}) do
+ dofile("src/editor/"..file..".lua")
+end
+
+ide.config.styles = StylesGetDefault()
+ide.config.stylesoutshell = StylesGetDefault()
+
+local function setLuaPaths(mainpath, osname)
+ -- use LUA_DEV to setup paths for Lua for Windows modules if installed
+ local luadev = osname == "Windows" and os.getenv('LUA_DEV')
+ if luadev and not wx.wxDirExists(luadev) then luadev = nil end
+ local luadev_path = (luadev
+ and ('LUA_DEV/?.lua;LUA_DEV/?/init.lua;LUA_DEV/lua/?.lua;LUA_DEV/lua/?/init.lua')
+ :gsub('LUA_DEV', (luadev:gsub('[\\/]$','')))
+ or nil)
+ local luadev_cpath = (luadev
+ and ('LUA_DEV/?.dll;LUA_DEV/?51.dll;LUA_DEV/clibs/?.dll;LUA_DEV/clibs/?51.dll')
+ :gsub('LUA_DEV', (luadev:gsub('[\\/]$','')))
+ or nil)
+
+ if luadev then
+ local path, clibs = os.getenv('PATH'), luadev:gsub('[\\/]$','')..'\\clibs'
+ if not path:find(clibs, 1, true) then wx.wxSetEnv('PATH', path..';'..clibs) end
+ end
+
+ -- (luaconf.h) in Windows, any exclamation mark ('!') in the path is replaced
+ -- by the path of the directory of the executable file of the current process.
+ -- this effectively prevents any path with an exclamation mark from working.
+ -- if the path has an excamation mark, allow Lua to expand it as this
+ -- expansion happens only once.
+ if osname == "Windows" and mainpath:find('%!') then mainpath = "!/../" end
+
+ -- if LUA_PATH or LUA_CPATH is not specified, then add ;;
+ -- ;; will be replaced with the default (c)path by the Lua interpreter
+ wx.wxSetEnv("LUA_PATH",
+ (os.getenv("LUA_PATH") or ';') .. ';'
+ .. "./?.lua;./?/init.lua;./lua/?.lua;./lua/?/init.lua" .. ';'
+ .. mainpath.."lualibs/?/?.lua;"..mainpath.."lualibs/?.lua;"
+ .. mainpath.."lualibs/?/?/init.lua;"..mainpath.."lualibs/?/init.lua"
+ .. (luadev_path and (';' .. luadev_path) or ''))
+
+ ide.osclibs = -- keep the list to use for other Lua versions
+ osname == "Windows" and mainpath.."bin/?.dll;"..mainpath.."bin/clibs/?.dll" or
+ osname == "Macintosh" and mainpath.."bin/lib?.dylib;"..mainpath.."bin/clibs/?.dylib" or
+ osname == "Unix" and mainpath..("bin/linux/%s/lib?.so;"):format(arch)
+ ..mainpath..("bin/linux/%s/clibs/?.so"):format(arch) or
+ assert(false, "Unexpected OS name")
+
+ wx.wxSetEnv("LUA_CPATH",
+ (os.getenv("LUA_CPATH") or ';') .. ';' .. ide.osclibs
+ .. (luadev_cpath and (';' .. luadev_cpath) or ''))
+
+ -- on some OSX versions, PATH is sanitized to not include even /usr/local/bin; add it
+ if osname == "Macintosh" then
+ local ok, path = wx.wxGetEnv("PATH")
+ if ok then wx.wxSetEnv("PATH", (#path > 0 and path..":" or "").."/usr/local/bin") end
+ end
+end
+
+ide.test.setLuaPaths = setLuaPaths
+
+---------------
+-- process args
+local filenames = {}
+local configs = {}
+do
+ local arg = {...}
+ -- application name is expected as the first argument
+ local fullPath = arg[1] or "zbstudio"
+
+ ide.arg = arg
+
+ -- on Windows use GetExecutablePath, which is Unicode friendly,
+ -- whereas wxGetCwd() is not (at least in wxlua 2.8.12.2).
+ -- some wxlua version on windows report wx.dll instead of *.exe.
+ local exepath = wx.wxStandardPaths.Get():GetExecutablePath()
+ if ide.osname == "Windows" and exepath:find("%.exe$") then
+ fullPath = exepath
+ elseif not wx.wxIsAbsolutePath(fullPath) then
+ fullPath = wx.wxGetCwd().."/"..fullPath
+ end
+
+ ide.editorFilename = fullPath
+ ide.appname = fullPath:match("([%w_-%.]+)$"):gsub("%.[^%.]*$","")
+ assert(ide.appname, "no application path defined")
+
+ for index = 2, #arg do
+ if (arg[index] == "-cfg" and index+1 <= #arg) then
+ table.insert(configs,arg[index+1])
+ elseif arg[index-1] ~= "-cfg"
+ -- on OSX command line includes -psn... parameter, don't include these
+ and (ide.osname ~= 'Macintosh' or not arg[index]:find("^-psn")) then
+ table.insert(filenames,arg[index])
+ end
+ end
+
+ setLuaPaths(GetPathWithSep(ide.editorFilename), ide.osname)
+end
+
+----------------------
+-- process application
+
+ide.app = dofile(ide.appname.."/app.lua")
+local app = assert(ide.app)
+
+local function loadToTab(filter, folder, tab, recursive, proto)
+ if filter and type(filter) ~= 'function' then
+ filter = app.loadfilters[filter] or nil
+ end
+ for _, file in ipairs(FileSysGetRecursive(folder, recursive, "*.lua")) do
+ if not filter or filter(file) then
+ LoadLuaFileExt(tab, file, proto)
+ end
+ end
+ return tab
+end
+
+local function loadInterpreters(filter)
+ loadToTab(filter or "interpreters", "interpreters", ide.interpreters, false,
+ ide.proto.Interpreter)
+end
+
+-- load tools
+local function loadTools(filter)
+ loadToTab(filter or "tools", "tools", ide.tools, false)
+end
+
+-- load packages
+local function processPackages(packages)
+ -- check dependencies and assign file names to each package
+ local skip = {}
+ for fname, package in pairs(packages) do
+ if type(package.dependencies) == 'table'
+ and package.dependencies.osname
+ and not package.dependencies.osname:find(ide.osname, 1, true) then
+ ide:Print(("Package '%s' not loaded: requires %s platform, but you are running %s.")
+ :format(fname, package.dependencies.osname, ide.osname))
+ skip[fname] = true
+ end
+
+ local needsversion = tonumber(package.dependencies)
+ or type(package.dependencies) == 'table' and tonumber(package.dependencies[1])
+ or -1
+ local isversion = tonumber(ide.VERSION)
+ if isversion and needsversion > isversion then
+ ide:Print(("Package '%s' not loaded: requires version %s, but you are running version %s.")
+ :format(fname, needsversion, ide.VERSION))
+ skip[fname] = true
+ end
+ package.fname = fname
+ end
+
+ for fname, package in pairs(packages) do
+ if not skip[fname] then ide.packages[fname] = package end
+ end
+end
+
+function UpdateSpecs()
+ for _, spec in pairs(ide.specs) do
+ spec.sep = spec.sep or "\1" -- default separator doesn't match anything
+ spec.iscomment = {}
+ spec.iskeyword0 = {}
+ spec.isstring = {}
+ if (spec.lexerstyleconvert) then
+ if (spec.lexerstyleconvert.comment) then
+ for _, s in pairs(spec.lexerstyleconvert.comment) do
+ spec.iscomment[s] = true
+ end
+ end
+ if (spec.lexerstyleconvert.keywords0) then
+ for _, s in pairs(spec.lexerstyleconvert.keywords0) do
+ spec.iskeyword0[s] = true
+ end
+ end
+ if (spec.lexerstyleconvert.stringtxt) then
+ for _, s in pairs(spec.lexerstyleconvert.stringtxt) do
+ spec.isstring[s] = true
+ end
+ end
+ end
+ end
+end
+
+-- load specs
+local function loadSpecs(filter)
+ loadToTab(filter or "specs", "spec", ide.specs, true)
+ UpdateSpecs()
+end
+
+function GetIDEString(keyword, default)
+ return app.stringtable[keyword] or default or keyword
+end
+
+----------------------
+-- process config
+
+-- set ide.config environment
+do
+ ide.configs = {
+ system = MergeFullPath("cfg", "user.lua"),
+ user = ide.oshome and MergeFullPath(ide.oshome, "."..ide.appname.."/user.lua"),
+ }
+ ide.configqueue = {}
+
+ local num = 0
+ local package = setmetatable({}, {
+ __index = function(_,k) return package[k] end,
+ __newindex = function(_,k,v) package[k] = v end,
+ __call = function(_,p)
+ -- package can be defined inline, like "package {...}"
+ if type(p) == 'table' then
+ num = num + 1
+ local name = 'config'..num..'package'
+ ide.packages[name] = setmetatable(p, ide.proto.Plugin)
+ -- package can be included as "package 'file.lua'" or "package 'folder/'"
+ elseif type(p) == 'string' then
+ local config = ide.configqueue[#ide.configqueue]
+ local pkg
+ for _, packagepath in ipairs({'.', 'packages/', '../packages/'}) do
+ local p = config and MergeFullPath(config.."/../"..packagepath, p)
+ pkg = wx.wxDirExists(p) and loadToTab(nil, p, {}, false, ide.proto.Plugin)
+ or wx.wxFileExists(p) and LoadLuaFileExt({}, p, ide.proto.Plugin)
+ or wx.wxFileExists(p..".lua") and LoadLuaFileExt({}, p..".lua", ide.proto.Plugin)
+ if pkg then
+ processPackages(pkg)
+ break
+ end
+ end
+ if not pkg then ide:Print(("Can't find '%s' to load package from."):format(p)) end
+ else
+ ide:Print(("Can't load package based on parameter of type '%s'."):format(type(p)))
+ end
+ end,
+ })
+
+ local includes = {}
+ local include = function(c)
+ if c then
+ for _, config in ipairs({ide.configqueue[#ide.configqueue], ide.configs.user, ide.configs.system}) do
+ local p = config and MergeFullPath(config.."/../", c)
+ includes[p] = (includes[p] or 0) + 1
+ if includes[p] > 1 or LoadLuaConfig(p) or LoadLuaConfig(p..".lua") then return end
+ includes[p] = includes[p] - 1
+ end
+ ide:Print(("Can't find configuration file '%s' to process."):format(c))
+ end
+ end
+
+ setmetatable(ide.config, {
+ __index = setmetatable({
+ load = {interpreters = loadInterpreters, specs = loadSpecs, tools = loadTools},
+ package = package,
+ include = include,
+ }, {__index = _G or _ENV})
+ })
+end
+
+LoadLuaConfig(ide.appname.."/config.lua")
+
+ide.editorApp:SetAppName(GetIDEString("settingsapp"))
+
+-- check if the .ini file needs to be migrated on Windows
+if ide.osname == 'Windows' and ide.wxver >= "2.9.5" then
+ -- Windows used to have local ini file kept in wx.wxGetHomeDir (before 2.9),
+ -- but since 2.9 it's in GetUserConfigDir(), so migrate it.
+ local ini = ide.editorApp:GetAppName() .. ".ini"
+ local old = wx.wxFileName(wx.wxGetHomeDir(), ini)
+ local new = wx.wxFileName(wx.wxStandardPaths.Get():GetUserConfigDir(), ini)
+ if old:FileExists() and not new:FileExists() then
+ FileCopy(old:GetFullPath(), new:GetFullPath())
+ ide:Print(("Migrated configuration file from '%s' to '%s'.")
+ :format(old:GetFullPath(), new:GetFullPath()))
+ end
+end
+
+----------------------
+-- process plugins
+
+if app.preinit then app.preinit() end
+
+loadInterpreters()
+loadSpecs()
+loadTools()
+
+do
+ -- process configs
+ LoadLuaConfig(ide.configs.system)
+ LoadLuaConfig(ide.configs.user)
+
+ -- process all other configs (if any)
+ for _, v in ipairs(configs) do LoadLuaConfig(v, true) end
+ configs = nil
+
+ -- check and apply default styles in case a user resets styles in the config
+ for _, styles in ipairs({"styles", "stylesoutshell"}) do
+ if not ide.config[styles] then
+ ide:Print(("Ignored incorrect value of '%s' setting in the configuration file")
+ :format(styles))
+ ide.config[styles] = StylesGetDefault()
+ end
+ end
+
+ local sep = GetPathSeparator()
+ if ide.config.language then
+ LoadLuaFileExt(ide.config.messages, "cfg"..sep.."i18n"..sep..ide.config.language..".lua")
+ end
+ -- always load 'en' as it's requires as a fallback for pluralization
+ if ide.config.language ~= 'en' then
+ LoadLuaFileExt(ide.config.messages, "cfg"..sep.."i18n"..sep.."en.lua")
+ end
+end
+
+processPackages(loadToTab(nil, "packages", {}, false, ide.proto.Plugin))
+if ide.oshome then
+ local userpackages = MergeFullPath(ide.oshome, "."..ide.appname.."/packages")
+ if wx.wxDirExists(userpackages) then
+ processPackages(loadToTab(nil, userpackages, {}, false, ide.proto.Plugin))
+ end
+end
+
+---------------
+-- Load App
+
+for _, file in ipairs({
+ "settings", "singleinstance", "iofilters", "package", "markup",
+ "gui", "filetree", "output", "debugger", "outline", "commandbar",
+ "editor", "findreplace", "commands", "autocomplete", "shellbox", "markers",
+ "menu_file", "menu_edit", "menu_search",
+ "menu_view", "menu_project", "menu_tools", "menu_help",
+ "print", "inspect" }) do
+ dofile("src/editor/"..file..".lua")
+end
+
+-- register all the plugins
+PackageEventHandle("onRegister")
+
+-- initialization that was delayed until configs processed and packages loaded
+ProjectUpdateInterpreters()
+
+-- load rest of settings
+SettingsRestoreFramePosition(ide.frame, "MainFrame")
+SettingsRestoreView()
+SettingsRestoreFileHistory(SetFileHistory)
+SettingsRestoreEditorSettings()
+SettingsRestoreProjectSession(FileTreeSetProjects)
+SettingsRestoreFileSession(function(tabs, params)
+ if params and params.recovery
+ then return SetOpenTabs(params)
+ else return SetOpenFiles(tabs, params) end
+end)
+
+-- ---------------------------------------------------------------------------
+-- Load the filenames
+
+do
+ for _, filename in ipairs(filenames) do
+ if filename ~= "--" then
+ if wx.wxDirExists(filename) then
+ ProjectUpdateProjectDir(filename)
+ elseif not ActivateFile(filename) then
+ DisplayOutputLn(("Can't open file '%s': %s"):format(filename, wx.wxSysErrorMsg()))
+ end
+ end
+ end
+ if ide:GetEditorNotebook():GetPageCount() == 0 then NewFile() end
+end
+
+if app.postinit then app.postinit() end
+
+-- this is a workaround for a conflict between global shortcuts and local
+-- shortcuts (like F2) used in the file tree or a watch panel.
+-- because of several issues on OSX (as described in details in this thread:
+-- https://groups.google.com/d/msg/wx-dev/juJj_nxn-_Y/JErF1h24UFsJ),
+-- the workaround installs a global event handler that manually re-routes
+-- conflicting events when the current focus is on a proper object.
+-- non-conflicting shortcuts are handled through key-down events.
+local remap = {
+ [ID_ADDWATCH] = ide:GetWatch(),
+ [ID_EDITWATCH] = ide:GetWatch(),
+ [ID_DELETEWATCH] = ide:GetWatch(),
+ [ID_RENAMEFILE] = ide:GetProjectTree(),
+ [ID_DELETEFILE] = ide:GetProjectTree(),
+}
+
+local function rerouteMenuCommand(obj, id)
+ -- check if the conflicting shortcut is enabled:
+ -- (1) SetEnabled wasn't called or (2) Enabled was set to `true`.
+ local uievent = wx.wxUpdateUIEvent(id)
+ obj:ProcessEvent(uievent)
+ if not uievent:GetSetEnabled() or uievent:GetEnabled() then
+ obj:AddPendingEvent(wx.wxCommandEvent(wx.wxEVT_COMMAND_MENU_SELECTED, id))
+ end
+end
+
+local function remapkey(event)
+ local keycode = event:GetKeyCode()
+ local mod = event:GetModifiers()
+ for id, obj in pairs(remap) do
+ local focus = obj:FindFocus()
+ if focus and focus:GetId() == obj:GetId() then
+ local ae = wx.wxAcceleratorEntry(); ae:FromString(KSC(id))
+ if ae:GetFlags() == mod and ae:GetKeyCode() == keycode then
+ rerouteMenuCommand(obj, id)
+ return
+ end
+ end
+ end
+ event:Skip()
+end
+ide:GetWatch():Connect(wx.wxEVT_KEY_DOWN, remapkey)
+ide:GetProjectTree():Connect(wx.wxEVT_KEY_DOWN, remapkey)
+
+local function resolveConflict(localid, globalid)
+ return function(event)
+ local shortcut = ide.config.keymap[localid]
+ for id, obj in pairs(remap) do
+ if ide.config.keymap[id]:lower() == shortcut:lower() then
+ local focus = obj:FindFocus()
+ if focus and focus:GetId() == obj:GetId() then
+ obj:AddPendingEvent(wx.wxCommandEvent(wx.wxEVT_COMMAND_MENU_SELECTED, id))
+ return
+ -- also need to check for children of objects
+ -- to avoid re-triggering events when labels are being edited
+ elseif focus and focus:GetParent():GetId() == obj:GetId() then
+ return
+ end
+ end
+ end
+ rerouteMenuCommand(ide.frame, globalid)
+ end
+end
+
+local at = {}
+for lid in pairs(remap) do
+ local shortcut = ide.config.keymap[lid]
+ -- find a (potential) conflict for this shortcut (if any)
+ for gid, ksc in pairs(ide.config.keymap) do
+ -- if the same shortcut is used elsewhere (not one of IDs being checked)
+ if shortcut:lower() == ksc:lower() and not remap[gid] then
+ local fakeid = NewID()
+ ide.frame:Connect(fakeid, wx.wxEVT_COMMAND_MENU_SELECTED,
+ resolveConflict(lid, gid))
+
+ local ae = wx.wxAcceleratorEntry(); ae:FromString(ksc)
+ table.insert(at, wx.wxAcceleratorEntry(ae:GetFlags(), ae:GetKeyCode(), fakeid))
+ end
+ end
+end
+
+if ide.osname == 'Macintosh' then
+ table.insert(at, wx.wxAcceleratorEntry(wx.wxACCEL_CTRL, ('M'):byte(), ID_VIEWMINIMIZE))
+end
+ide.frame:SetAcceleratorTable(wx.wxAcceleratorTable(at))
+
+-- only set menu bar *after* postinit handler as it may include adding
+-- app-specific menus (Help/About), which are not recognized by MacOS
+-- as special items unless SetMenuBar is done after menus are populated.
+ide.frame:SetMenuBar(ide.frame.menuBar)
+
+ide:Print() -- flush pending output (if any)
+
+PackageEventHandle("onAppLoad")
+
+-- The status bar content is drawn incorrectly if it is shown
+-- after being initially hidden.
+-- Show the statusbar and hide it after showing the frame, which fixes the issue.
+local statusbarfix = ide.osname == 'Windows' and not ide.frame:GetStatusBar():IsShown()
+if statusbarfix then ide.frame:GetStatusBar():Show(true) end
+
+ide.frame:Show(true)
+
+if statusbarfix then ide.frame:GetStatusBar():Show(false) end
+
+-- somehow having wxAuiToolbar "steals" the focus from the editor on OSX;
+-- have to set the focus implicitly on the current editor (if any)
+if ide.osname == 'Macintosh' then
+ local editor = GetEditor()
+ if editor then editor:SetFocus() end
+end
+
+wx.wxGetApp():MainLoop()
+
+-- There are several reasons for this call:
+-- (1) to fix a crash on OSX when closing with debugging in progress.
+-- (2) to fix a crash on Linux 32/64bit during GC cleanup in wxlua
+-- after an external process has been started from the IDE.
+-- (3) to fix exit on Windows when started as "bin\lua src\main.lua".
+os.exit()
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/util.lua b/love2dToAPK/tools/tools/zbstudio-win/src/util.lua
new file mode 100644
index 0000000..ad4cbe3
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/util.lua
@@ -0,0 +1,645 @@
+-- Copyright 2011-15 Paul Kulchenko, ZeroBrane LLC
+-- authors: Lomtik Software (J. Winwood & John Labenski)
+-- Luxinia Dev (Eike Decker & Christoph Kubisch)
+-- David Manura
+---------------------------------------------------------
+
+-- Equivalent to C's "cond ? a : b", all terms will be evaluated
+function iff(cond, a, b) if cond then return a else return b end end
+
+function EscapeMagic(s) return s:gsub('([%(%)%.%%%+%-%*%?%[%^%$%]])','%%%1') end
+
+function GetPathSeparator()
+ return string.char(wx.wxFileName.GetPathSeparator())
+end
+
+do
+ local sep = GetPathSeparator()
+ function IsDirectory(dir) return dir:find(sep.."$") end
+end
+
+function StripCommentsC(tx)
+ local out = ""
+ local lastc = ""
+ local skip
+ local skipline
+ local skipmulti
+ local tx = string.gsub(tx, "\r\n", "\n")
+ for c in tx:gmatch(".") do
+ local oc = c
+ local tu = lastc..c
+ skip = c == '/'
+
+ if ( not (skipmulti or skipline)) then
+ if (tu == "//") then
+ skipline = true
+ elseif (tu == "/*") then
+ skipmulti = true
+ c = ""
+ elseif (lastc == '/') then
+ oc = tu
+ end
+ elseif (skipmulti and tu == "*/") then
+ skipmulti = false
+ c = ""
+ elseif (skipline and lastc == "\n") then
+ out = out.."\n"
+ skipline = false
+ end
+
+ lastc = c
+ if (not (skip or skipline or skipmulti)) then
+ out = out..oc
+ end
+ end
+
+ return out..lastc
+end
+
+-- http://lua-users.org/wiki/EnhancedFileLines
+function FileLines(f)
+ local CHUNK_SIZE = 1024
+ local buffer = ""
+ local pos_beg = 1
+ return function()
+ local pos, chars
+ while 1 do
+ pos, chars = buffer:match('()([\r\n].)', pos_beg)
+ if pos or not f then
+ break
+ elseif f then
+ local chunk = f:read(CHUNK_SIZE)
+ if chunk then
+ buffer = buffer:sub(pos_beg) .. chunk
+ pos_beg = 1
+ else
+ f = nil
+ end
+ end
+ end
+ if not pos then
+ pos = #buffer
+ elseif chars == '\r\n' then
+ pos = pos + 1
+ end
+ local line = buffer:sub(pos_beg, pos)
+ pos_beg = pos + 1
+ if #line > 0 then
+ return line
+ end
+ end
+end
+
+function PrependStringToArray(t, s, maxstrings, issame)
+ if string.len(s) == 0 then return end
+ for i = #t, 1, -1 do
+ local v = t[i]
+ if v == s or issame and issame(s, v) then
+ table.remove(t, i) -- remove old copy
+ -- don't break here in case there are multiple copies to remove
+ end
+ end
+ table.insert(t, 1, s)
+ if #t > (maxstrings or 15) then table.remove(t, #t) end -- keep reasonable length
+end
+
+function GetFileModTime(filePath)
+ if filePath and #filePath > 0 then
+ local fn = wx.wxFileName(filePath)
+ if fn:FileExists() then
+ return fn:GetModificationTime()
+ end
+ end
+
+ return nil
+end
+
+function GetFileExt(filePath)
+ local match = filePath and filePath:gsub("%s+$",""):match("%.([^./\\]*)$")
+ return match and match:lower() or ''
+end
+
+function GetFileName(filePath)
+ return filePath and filePath:gsub("%s+$",""):match("([^/\\]*)$") or ''
+end
+
+function IsLuaFile(filePath)
+ return filePath and (string.len(filePath) > 4) and
+ (string.lower(string.sub(filePath, -4)) == ".lua")
+end
+
+function GetPathWithSep(wxfn)
+ if type(wxfn) == 'string' then wxfn = wx.wxFileName(wxfn) end
+ return wxfn:GetPath(bit.bor(wx.wxPATH_GET_VOLUME, wx.wxPATH_GET_SEPARATOR))
+end
+
+function FileDirHasContent(dir)
+ local f = wx.wxFindFirstFile(dir, wx.wxFILE + wx.wxDIR)
+ return #f>0
+end
+
+function FileSysGetRecursive(path, recursive, spec, opts)
+ local content = {}
+ local showhidden = ide.config and ide.config.showhiddenfiles
+ local sep = GetPathSeparator()
+ -- trip trailing separator and adjust the separator in the path
+ path = path:gsub("[\\/]$",""):gsub("[\\/]", sep)
+ local queue = {path}
+ local pathpatt = "^"..EscapeMagic(path)..sep.."?"
+ local optyield = (opts or {}).yield
+ local optfolder = (opts or {}).folder ~= false
+ local optsort = (opts or {}).sort ~= false
+ local optpath = (opts or {}).path ~= false
+ local optskipbinary = (opts or {}).skipbinary
+ local optondirectory = (opts or {}).ondirectory
+
+ local function spec2list(spec, list)
+ -- return empty list if no spec is provided
+ if spec == nil or spec == "*" or spec == "*.*" then return {}, 0 end
+ -- accept "*.lua" and "*.txt,*.wlua" combinations
+ if type(spec) == 'table' then spec = table.concat(spec, ",") end
+ local masknum, list = 0, list or {}
+ for m in spec:gmatch("[^%s;,]+") do
+ m = m:gsub("[\\/]", sep)
+ if m:find("^%*%.%w+"..sep.."?$") then
+ list[m:sub(2)] = true
+ else
+ -- escape all special characters
+ -- and replace (escaped) ** with .* and (escaped) * with [^\//]*
+ table.insert(list, EscapeMagic(m)
+ :gsub("%%%*%%%*", ".*"):gsub("%%%*", "[^/\\]*").."$")
+ end
+ masknum = masknum + 1
+ end
+ return list, masknum
+ end
+
+ local inmasks, masknum = spec2list(spec)
+ if masknum >= 2 then spec = nil end
+
+ local exmasks = spec2list(ide.config.excludelist or {})
+ if optskipbinary then -- add any binary files to the list to skip
+ exmasks = spec2list(type(optskipbinary) == 'table' and optskipbinary
+ or ide.config.binarylist or {}, exmasks)
+ end
+
+ local function ismatch(file, inmasks, exmasks)
+ -- convert extension 'foo' to '.foo', as need to distinguish file
+ -- from extension with the same name
+ local ext = '.'..GetFileExt(file)
+ -- check exclusions if needed
+ if exmasks[file] or exmasks[ext] then return false end
+ for _, mask in ipairs(exmasks) do
+ if file:find(mask) then return false end
+ end
+
+ -- return true if none of the exclusions match and no inclusion list
+ if not inmasks or not next(inmasks) then return true end
+
+ -- now check inclusions
+ if inmasks[file] or inmasks[ext] then return true end
+ for _, mask in ipairs(inmasks) do
+ if file:find(mask) then return true end
+ end
+ return false
+ end
+
+ local function report(fname)
+ if optyield then return coroutine.yield(fname) end
+ table.insert(content, fname)
+ end
+
+ local dir = wx.wxDir()
+ local function getDir(path)
+ dir:Open(path)
+ if not dir:IsOpened() then
+ if DisplayOutputLn and TR then
+ DisplayOutputLn(TR("Can't open '%s': %s"):format(path, wx.wxSysErrorMsg()))
+ end
+ return
+ end
+
+ -- recursion is done in all folders if requested,
+ -- but only those folders that match the spec are returned
+ local _ = wx.wxLogNull() -- disable error reporting; will report as needed
+ local found, file = dir:GetFirst("*",
+ wx.wxDIR_DIRS + ((showhidden == true or showhidden == wx.wxDIR_DIRS) and wx.wxDIR_HIDDEN or 0))
+ while found do
+ local fname = path..sep..file
+ if optfolder and ismatch(fname..sep, inmasks, exmasks) then
+ report((optpath and fname or fname:gsub(pathpatt, ""))..sep)
+ end
+
+ if recursive and ismatch(fname..sep, nil, exmasks)
+ and (not optondirectory or optondirectory(fname) ~= false)
+ -- check if this name already appears in the path earlier;
+ -- Skip the processing if it does as it could lead to infinite
+ -- recursion with circular references created by symlinks.
+ and select(2, fname:gsub(EscapeMagic(file..sep),'')) <= 2 then
+ table.insert(queue, fname)
+ end
+ found, file = dir:GetNext()
+ end
+ found, file = dir:GetFirst(spec or "*",
+ wx.wxDIR_FILES + ((showhidden == true or showhidden == wx.wxDIR_FILES) and wx.wxDIR_HIDDEN or 0))
+ while found do
+ local fname = path..sep..file
+ if ismatch(fname, inmasks, exmasks) then
+ report(optpath and fname or fname:gsub(pathpatt, ""))
+ end
+ found, file = dir:GetNext()
+ end
+ end
+ while #queue > 0 do getDir(table.remove(queue)) end
+
+ if optyield then return end
+
+ if optsort then
+ local prefix = '\001' -- prefix to sort directories first
+ local shadow = {}
+ for _, v in ipairs(content) do
+ shadow[v] = (v:sub(-1) == sep and prefix or '')..v:lower()
+ end
+ table.sort(content, function(a,b) return shadow[a] < shadow[b] end)
+ end
+
+ return content
+end
+
+local normalflags = wx.wxPATH_NORM_ABSOLUTE + wx.wxPATH_NORM_DOTS + wx.wxPATH_NORM_TILDE
+function GetFullPathIfExists(p, f)
+ if not p or not f then return end
+ local file = wx.wxFileName(f)
+ -- Normalize call is needed to make the case of p = '/abc/def' and
+ -- f = 'xyz/main.lua' work correctly. Normalize() returns true if done.
+ return (file:Normalize(normalflags, p)
+ and file:FileExists()
+ and file:GetFullPath()
+ or nil)
+end
+
+function MergeFullPath(p, f)
+ if not p or not f then return end
+ local file = wx.wxFileName(f)
+ -- Normalize call is needed to make the case of p = '/abc/def' and
+ -- f = 'xyz/main.lua' work correctly. Normalize() returns true if done.
+ return (file:Normalize(normalflags, p)
+ and file:GetFullPath()
+ or nil)
+end
+
+function FileWrite(file, content)
+ local _ = wx.wxLogNull() -- disable error reporting; will report as needed
+
+ if not wx.wxFileExists(file)
+ and not wx.wxFileName(file):Mkdir(tonumber(755,8), wx.wxPATH_MKDIR_FULL) then
+ return nil, wx.wxSysErrorMsg()
+ end
+
+ local file = wx.wxFile(file, wx.wxFile.write)
+ if not file:IsOpened() then return nil, wx.wxSysErrorMsg() end
+
+ local ok = file:Write(content, #content) == #content
+ file:Close()
+ return ok, not ok and wx.wxSysErrorMsg() or nil
+end
+
+function FileSize(fname)
+ if not wx.wxFileExists(fname) then return end
+ local size = wx.wxFileSize(fname)
+ -- size can be returned as 0 for symlinks, so check with wxFile:Length();
+ -- can't use wxFile:Length() as it's reported incorrectly for some non-seekable files
+ -- (see https://github.com/pkulchenko/ZeroBraneStudio/issues/458);
+ -- the combination of wxFileSize and wxFile:Length() should do the right thing.
+ if size == 0 then size = wx.wxFile(fname, wx.wxFile.read):Length() end
+ return size
+end
+
+function FileRead(fname, length, callback)
+ -- on OSX "Open" dialog allows to open applications, which are folders
+ if wx.wxDirExists(fname) then return nil, "Can't read directory as file." end
+
+ local _ = wx.wxLogNull() -- disable error reporting; will report as needed
+ local file = wx.wxFile(fname, wx.wxFile.read)
+ if not file:IsOpened() then return nil, wx.wxSysErrorMsg() end
+
+ if type(callback) == 'function' then
+ length = length or 8192
+ local pos = 0
+ while true do
+ local len, content = file:Read(length)
+ local res, msg = callback(content) -- may return `false` to signal to stop
+ if res == false then return false, msg or "Unknown error" end
+ if len < length then break end
+ pos = pos + len
+ file:Seek(pos)
+ end
+ return true, wx.wxSysErrorMsg()
+ end
+
+ local _, content = file:Read(length or FileSize(fname))
+ file:Close()
+ return content, wx.wxSysErrorMsg()
+end
+
+function FileRemove(file)
+ local _ = wx.wxLogNull() -- disable error reporting; will report as needed
+ return wx.wxRemoveFile(file), wx.wxSysErrorMsg()
+end
+
+function FileRename(file1, file2)
+ local _ = wx.wxLogNull() -- disable error reporting; will report as needed
+ return wx.wxRenameFile(file1, file2), wx.wxSysErrorMsg()
+end
+
+function FileCopy(file1, file2)
+ local _ = wx.wxLogNull() -- disable error reporting; will report as needed
+ return wx.wxCopyFile(file1, file2), wx.wxSysErrorMsg()
+end
+
+local ok, socket = pcall(require, "socket")
+TimeGet = ok and socket.gettime or os.clock
+
+function IsBinary(text) return text:find("[^\7\8\9\10\12\13\27\32-\255]") and true or false end
+
+function pairsSorted(t, f)
+ local a = {}
+ for n in pairs(t) do table.insert(a, n) end
+ table.sort(a, f)
+ local i = 0 -- iterator variable
+ local iter = function () -- iterator function
+ i = i + 1
+ if a[i] == nil then return nil
+ else return a[i], t[a[i]]
+ end
+ end
+ return iter
+end
+
+function FixUTF8(s, repl)
+ local p, len, invalid = 1, #s, {}
+ while p <= len do
+ if s:find("^[%z\1-\127]", p) then p = p + 1
+ elseif s:find("^[\194-\223][\128-\191]", p) then p = p + 2
+ elseif s:find( "^\224[\160-\191][\128-\191]", p)
+ or s:find("^[\225-\236][\128-\191][\128-\191]", p)
+ or s:find( "^\237[\128-\159][\128-\191]", p)
+ or s:find("^[\238-\239][\128-\191][\128-\191]", p) then p = p + 3
+ elseif s:find( "^\240[\144-\191][\128-\191][\128-\191]", p)
+ or s:find("^[\241-\243][\128-\191][\128-\191][\128-\191]", p)
+ or s:find( "^\244[\128-\143][\128-\191][\128-\191]", p) then p = p + 4
+ else
+ if not repl then return end -- just signal invalid UTF8 string
+ local repl = type(repl) == 'function' and repl(s:sub(p,p)) or repl
+ s = s:sub(1, p-1)..repl..s:sub(p+1)
+ table.insert(invalid, p)
+ -- adjust position/length as the replacement may be longer than one char
+ p = p + #repl
+ len = len + #repl - 1
+ end
+ end
+ return s, invalid
+end
+
+function RequestAttention()
+ local frame = ide.frame
+ if not frame:IsActive() then
+ frame:RequestUserAttention()
+ if ide.osname == "Macintosh" then
+ local cmd = [[osascript -e 'tell application "%s" to activate']]
+ wx.wxExecute(cmd:format(ide.editorApp:GetAppName()), wx.wxEXEC_ASYNC)
+ elseif ide.osname == "Windows" then
+ if frame:IsIconized() then frame:Iconize(false) end
+ frame:Raise() -- raise the window
+
+ local winapi = require 'winapi'
+ if winapi then
+ local pid = winapi.get_current_pid()
+ local wins = winapi.find_all_windows(function(w)
+ return w:get_process():get_pid() == pid
+ and w:get_class_name() == 'wxWindowNR'
+ end)
+ if wins and #wins > 0 then
+ -- found the window, now need to activate it:
+ -- send some input to the window and then
+ -- bring our window to foreground (doesn't work without some input)
+ -- send Attn key twice (down and up)
+ winapi.send_to_window(0xF6, false)
+ winapi.send_to_window(0xF6, true)
+ for _, w in ipairs(wins) do w:set_foreground() end
+ end
+ end
+ end
+ end
+end
+
+function TR(msg, count)
+ local messages = ide.config.messages
+ local lang = ide.config.language
+ local counter = messages[lang] and messages[lang][0]
+ local message = messages[lang] and messages[lang][msg]
+ -- if there is count and no corresponding message, then
+ -- get the message from the (default) english language,
+ -- otherwise the message is not going to be pluralized properly
+ if count and (not message or type(message) == 'table' and not next(message)) then
+ message, counter = messages.en[msg], messages.en[0]
+ end
+ return count and counter and message and type(message) == 'table'
+ and message[counter(count)] or (type(message) == 'string' and message or msg)
+end
+
+-- wxwidgets 2.9.x may report the last folder twice (depending on how the
+-- user selects the folder), which makes the selected folder incorrect.
+-- check if the last segment is repeated and drop it.
+function FixDir(path)
+ if wx.wxDirExists(path) then return path end
+
+ local dir = wx.wxFileName.DirName(path)
+ local dirs = dir:GetDirs()
+ if #dirs > 1 and dirs[#dirs] == dirs[#dirs-1] then dir:RemoveLastDir() end
+ return dir:GetFullPath()
+end
+
+function ShowLocation(fname)
+ local osxcmd = [[osascript -e 'tell application "Finder" to reveal POSIX file "%s"']]
+ .. [[ -e 'tell application "Finder" to activate']]
+ local wincmd = [[explorer /select,"%s"]]
+ local lnxcmd = [[xdg-open "%s"]] -- takes path, not a filename
+ local cmd =
+ ide.osname == "Windows" and wincmd:format(fname) or
+ ide.osname == "Macintosh" and osxcmd:format(fname) or
+ ide.osname == "Unix" and lnxcmd:format(wx.wxFileName(fname):GetPath())
+ if cmd then wx.wxExecute(cmd, wx.wxEXEC_ASYNC) end
+end
+
+function LoadLuaFileExt(tab, file, proto)
+ local cfgfn,err = loadfile(file)
+ if not cfgfn then
+ ide:Print(("Error while loading file: '%s'."):format(err))
+ else
+ local name = file:match("([a-zA-Z_0-9%-]+)%.lua$")
+ if not name then return end
+
+ -- check if os/arch matches to allow packages for different systems
+ local osvals = {windows = true, unix = true, macintosh = true}
+ local archvals = {x64 = true, x86 = true}
+ local os, arch = name:match("-(%w+)-?(%w*)")
+ if os and os:lower() ~= ide.osname:lower() and osvals[os:lower()]
+ or arch and #arch > 0 and arch:lower() ~= ide.osarch:lower() and archvals[arch:lower()]
+ then return end
+ if os and osvals[os:lower()] then name = name:gsub("-.*","") end
+
+ local success, result = pcall(function()return cfgfn(assert(_G or _ENV))end)
+ if not success then
+ ide:Print(("Error while processing file: '%s'."):format(result))
+ else
+ if (tab[name]) then
+ local out = tab[name]
+ for i,v in pairs(result) do
+ out[i] = v
+ end
+ else
+ tab[name] = proto and result and setmetatable(result, proto) or result
+ if tab[name] then tab[name].fpath = file end
+ end
+ end
+ end
+ return tab
+end
+
+function LoadLuaConfig(filename,isstring)
+ if not filename then return end
+ -- skip those files that don't exist
+ if not isstring and not wx.wxFileExists(filename) then return end
+ -- if it's marked as command, but exists as a file, load it as a file
+ if isstring and wx.wxFileExists(filename) then isstring = false end
+
+ local cfgfn, err, msg
+ if isstring
+ then msg, cfgfn, err = "string", loadstring(filename)
+ else msg, cfgfn, err = "file", loadfile(filename) end
+
+ if not cfgfn then
+ ide:Print(("Error while loading configuration %s: '%s'."):format(msg, err))
+ else
+ setfenv(cfgfn,ide.config)
+ table.insert(ide.configqueue, filename)
+ local _, err = pcall(function()cfgfn(assert(_G or _ENV))end)
+ table.remove(ide.configqueue)
+ if err then
+ ide:Print(("Error while processing configuration %s: '%s'."):format(msg, err))
+ end
+ end
+ return true
+end
+
+function LoadSafe(data)
+ local f, res = loadstring(data)
+ if not f then return f, res end
+
+ local count = 0
+ debug.sethook(function ()
+ count = count + 1
+ if count >= 3 then error("cannot call functions") end
+ end, "c")
+ local ok, res = pcall(f)
+ count = 0
+ debug.sethook()
+ return ok, res
+end
+
+local function isCtrlFocused(e)
+ local ctrl = e and e:FindFocus()
+ return ctrl and
+ (ctrl:GetId() == e:GetId()
+ or ide.osname == 'Macintosh' and
+ ctrl:GetParent():GetId() == e:GetId()) and ctrl or nil
+end
+
+function GetEditorWithFocus(...)
+ -- need to distinguish GetEditorWithFocus() and GetEditorWithFocus(nil)
+ -- as the latter may happen when GetEditor() is passed and returns `nil`
+ if select('#', ...) > 0 then
+ local ed = ...
+ return isCtrlFocused(ed) and ed or nil
+ end
+
+ local editor = GetEditor()
+ if isCtrlFocused(editor) then return editor end
+
+ local nb = ide:GetOutputNotebook()
+ for p = 0, nb:GetPageCount()-1 do
+ local ctrl = nb:GetPage(p)
+ if ctrl:GetClassInfo():GetClassName() == "wxStyledTextCtrl"
+ and isCtrlFocused(ctrl) then
+ return ctrl:DynamicCast("wxStyledTextCtrl")
+ end
+ end
+ return nil
+end
+
+function GenerateProgramFilesPath(exec, sep)
+ local env = os.getenv('ProgramFiles')
+ return
+ (env and env..'\\'..exec..sep or '')..
+ [[C:\Program Files\]]..exec..sep..
+ [[D:\Program Files\]]..exec..sep..
+ [[C:\Program Files (x86)\]]..exec..sep..
+ [[D:\Program Files (x86)\]]..exec
+end
+
+--[[ format placeholders
+ - %f -- full project name (project path)
+ - %s -- short project name (directory name)
+ - %i -- interpreter name
+ - %S -- file name
+ - %F -- file path
+ - %n -- line number
+ - %c -- line content
+ - %T -- application title
+ - %v -- application version
+ - %t -- current tab name
+--]]
+function ExpandPlaceholders(msg, ph)
+ ph = ph or {}
+ if type(msg) == 'function' then return msg(ph) end
+ local editor = ide:GetEditor()
+ local proj = ide:GetProject() or ""
+ local dirs = wx.wxFileName(proj):GetDirs()
+ local doc = editor and ide:GetDocument(editor)
+ local nb = ide:GetEditorNotebook()
+ local def = {
+ f = proj,
+ s = dirs[#dirs] or "",
+ i = ide:GetInterpreter():GetName() or "",
+ S = doc and doc:GetFileName() or "",
+ F = doc and doc:GetFilePath() or "",
+ n = editor and editor:GetCurrentLine()+1 or 0,
+ c = editor and editor:GetLineDyn(editor:GetCurrentLine()) or "",
+ T = GetIDEString("editor") or "",
+ v = ide.VERSION,
+ t = editor and nb:GetPageText(nb:GetPageIndex(editor)) or "",
+ }
+ return(msg:gsub('%%(%w)', function(p) return ph[p] or def[p] or '?' end))
+end
+
+function MergeSettings(localSettings, savedSettings)
+ for name in pairs(localSettings) do
+ if savedSettings[name] ~= nil
+ and type(savedSettings[name]) == type(localSettings[name]) then
+ if type(localSettings[name]) == 'table'
+ and next(localSettings[name]) ~= nil then
+ -- check every value in the table to make sure that it's possible
+ -- to add new keys to the table and they get correct default values
+ -- (even though that are absent in savedSettings)
+ for setting in pairs(localSettings[name]) do
+ if savedSettings[name][setting] ~= nil then
+ localSettings[name][setting] = savedSettings[name][setting]
+ end
+ end
+ else
+ localSettings[name] = savedSettings[name]
+ end
+ end
+ end
+end
diff --git a/love2dToAPK/tools/tools/zbstudio-win/src/version.lua b/love2dToAPK/tools/tools/zbstudio-win/src/version.lua
new file mode 100644
index 0000000..56bd1f9
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/src/version.lua
@@ -0,0 +1 @@
+ide.VERSION = [[1.30]] \ No newline at end of file
diff --git a/love2dToAPK/tools/tools/zbstudio-win/tools/cg.lua b/love2dToAPK/tools/tools/zbstudio-win/tools/cg.lua
new file mode 100644
index 0000000..1dd4217
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/tools/cg.lua
@@ -0,0 +1,537 @@
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local binpath = ide.config.path.cgbin or os.getenv("CG_BIN_PATH")
+local cgprofile
+local cgglsles
+
+return binpath and {
+ fninit = function(frame,menuBar)
+ cgprofile = ide.config.cgprofile or "gp5"
+ cgglsles = ide.config.cgglsles
+
+ if (wx.wxFileName(binpath):IsRelative()) then
+ local editorDir = string.gsub(ide.editorFilename:gsub("[^/\\]+$",""),"\\","/")
+ binpath = editorDir..binpath
+ end
+
+ local myMenu = wx.wxMenu{
+ { ID "cg.profile.arb", "&ARB VP/FP", "ARB program profile", wx.wxITEM_CHECK },
+ { ID "cg.profile.glsl", "ARB &GLSL", "ARB GLSL program profile", wx.wxITEM_CHECK },
+ { ID "cg.profile.nv40", "NV VP/FP&40", "NV program sm3 profile", wx.wxITEM_CHECK },
+ { ID "cg.profile.gp4", "NV &GP4", "NV program sm4 profile", wx.wxITEM_CHECK },
+ { ID "cg.profile.gp5", "NV &GP5", "NV program sm5 profile", wx.wxITEM_CHECK },
+ { ID "cg.profile.dx_2x", "DX SM&2_x", "DirectX sm2_x profile", wx.wxITEM_CHECK },
+ { ID "cg.profile.dx_3", "DX SM&3_0", "DirectX sm3_0 profile", wx.wxITEM_CHECK },
+ { ID "cg.profile.dx_4", "DX SM&4_0", "DirectX sm4_0 profile", wx.wxITEM_CHECK },
+ { ID "cg.profile.dx_5", "DX SM&5_0", "DirectX sm5_0 profile", wx.wxITEM_CHECK },
+ { },
+ { ID "cg.compile.input", "&Custom Args", "when set a popup for custom compiler args will be envoked", wx.wxITEM_CHECK },
+ { ID "cg.compile.gles", "GLSL-ES", "When GLSL file is source use GLSL-ES path", wx.wxITEM_CHECK },
+ { },
+ { ID "cg.compile.vertex", "Compile &Vertex", "Compile Vertex program (select entry word)" },
+ { ID "cg.compile.fragment", "Compile &Fragment", "Compile Fragment program (select entry word)" },
+ { ID "cg.compile.geometry", "Compile &Geometry", "Compile Geometry program (select entry word)" },
+ { ID "cg.compile.tessctrl", "Compile T.Ctrl", "Compile T.Ctrl program (select entry word)" },
+ { ID "cg.compile.tesseval", "Compile T.Eval", "Compile T.Eval program (select entry word)" },
+ { ID "cg.compile.compute", "Compile Compute", "Compile Compute program (select entry word)" },
+ { },
+ { ID "cg.format.asm", "Annotate ASM", "indent and add comments to Cg ASM output" },
+ { ID "cg.format.master", "Build from master", "Creates a new cg file from a master containing special include instrctions." },
+ }
+ menuBar:Append(myMenu, "&Cg")
+
+ local data = {}
+ data.customarg = false
+ data.custom = ""
+ data.profid = ID ("cg.profile."..cgprofile)
+ data.gles = cgglsles and true or false
+ data.domains = {
+ [ID "cg.compile.vertex"] = 1,
+ [ID "cg.compile.fragment"] = 2,
+ [ID "cg.compile.geometry"] = 3,
+ [ID "cg.compile.tessctrl"] = 4,
+ [ID "cg.compile.tesseval"] = 5,
+ [ID "cg.compile.compute"] = 6,
+ }
+ data.profiles = {
+ [ID "cg.profile.arb"] = {"arbvp1","arbfp1",false,false,false,false,ext=".glp", asm=true,},
+ [ID "cg.profile.glsl"] = {"glslv","glslf","glslg",false,false,false,ext=".glsl"},
+ [ID "cg.profile.nv40"] = {"vp40","fp40",false,false,false,false,ext=".glp",nvperf=true, asm=true,},
+ [ID "cg.profile.gp4"] = {"gp4vp","gp4fp","gp4gp",false,false,false,ext=".glp",nvperf=true, asm=true,},
+ [ID "cg.profile.gp5"] = {"gp5vp","gp5fp","gp5gp","gp5tcp","gp5tep","gp5cp",ext=".glp", asm=true,},
+ [ID "cg.profile.dx_2x"] = {"vs_2_0","ps_2_x",false,false,false,false,ext=".txt"},
+ [ID "cg.profile.dx_3"] = {"vs_3_0","ps_3_0",false,false,false,false,ext=".txt"},
+ [ID "cg.profile.dx_4"] = {"vs_4_0","ps_4_0","gs_4_0",false,false,false,ext=".txt"},
+ [ID "cg.profile.dx_5"] = {"vs_5_0","ps_5_0","gs_5_0","ds_5_0","hs_5_0",false,ext=".txt"},
+ }
+ data.domaindefs = {
+ " -D_VERTEX_ ",
+ " -D_FRAGMENT_ ",
+ " -D_GEOMETRY_ ",
+ " -D_TESS_CONTROL_ ",
+ " -D_TESS_EVAL_ ",
+ " -D_COMPUTE_ ",
+ }
+ -- Profile related
+ menuBar:Check(data.profid, true)
+
+ local function selectProfile (id)
+ for id,profile in pairs(data.profiles) do
+ menuBar:Check(id, false)
+ end
+ menuBar:Check(id, true)
+ data.profid = id
+ end
+
+ menuBar:Check(ID "cg.compile.gles", data.gles)
+
+ local function evSelectProfile (event)
+ local chose = event:GetId()
+ selectProfile(chose)
+ end
+
+ for id,profile in pairs(data.profiles) do
+ frame:Connect(id,wx.wxEVT_COMMAND_MENU_SELECTED,evSelectProfile)
+ end
+
+ -- check for NvPerf
+ local perfexe = "/NVShaderPerf.exe"
+ local fn = wx.wxFileName(binpath..perfexe)
+ local hasperf = fn:FileExists()
+
+ -- master file generator
+
+ local function buildFromMaster(filenamein, filenameout)
+ local path = GetPathWithSep(filenamein)
+ if (not filenameout) then
+ local name = filenamein:GetName()
+ name = name:match("(.+).master$")
+ if (not name) then return end
+ filenameout = path..name.."."..filenamein:GetExt()
+ end
+
+ local masterfile = io.open(filenamein:GetFullPath(), "rb")
+ local outfile = io.open(filenameout, "wb")
+
+ local function out(str)
+ --str = string.match(str,"
+ return str
+ end
+
+ local function handleInclude(fname,defs)
+ local defcnt = 0
+ for i,v in pairs(defs) do
+ defcnt = defcnt + 1
+ end
+
+ local incfile = io.open(path..fname, "rb")
+ if (defcnt > 0) then
+ local write = nil
+ for line in FileLines(incfile) do
+ if (write) then
+ local cap = string.match(line,"#endif%s+//%s*([%w_]+)")
+ if (cap == write) then
+ outfile:write("//$"..write.." END$\n")
+ break
+ end
+ outfile:write(line)
+ else
+ local cap = string.match(line,"#ifdef%s+([%w_]+)")
+ if (cap and defs[cap]) then
+ write = cap
+ outfile:write("//$"..write.." BEGIN$\n")
+ end
+ end
+ end
+ else
+ for line in FileLines(incfile) do
+ outfile:write(line)
+ end
+ end
+
+ incfile:close()
+ end
+
+ DisplayOutput("Cg Master Generating...\n")
+ local master = nil
+ for line in FileLines(masterfile) do
+ local masterbegin = string.find(line,'//$MASTER-INCLUDE-BEGIN$',nil, true)
+ local masterend = string.find(line,'//$MASTER-INCLUDE-END$', nil, true)
+ if (masterbegin) then
+ master = {}
+ outfile:write(line)
+ elseif(masterend) then
+ master = nil
+ end
+
+ if (master) then
+ local linein = " "..line
+ local defadd = string.match(linein,'[^/]#define ([_%w]+)')
+ local defrem = string.match(linein,'[^/]#undef ([_%w]+)')
+ if (defadd) then master[defadd] = true end
+ if (defrem) then master[defrem] = nil end
+ DisplayOutput(defadd,defrem, "\n")
+
+ local incfile = string.match(linein,'[^/]#include "(.+)"')
+ if (incfile) then
+ handleInclude(incfile, master, "\n")
+ end
+ else
+ outfile:write(line)
+ end
+ end
+ DisplayOutput("Written:",filenameout,"\n")
+ outfile:close()
+ masterfile:close()
+ end
+
+ local function beautifyAsm(tx)
+ local newtx = ""
+ local indent = 0
+ local maxindent = 0
+ local startindent = {
+ ["IF"]=true,["REP"]=true,["ELSE"]=true,["LOOP"]=true,["BB"]=true,
+ }
+ local endindent = {
+ ["ENDIF"]=true,["ENDREP"]=true,["ELSE"]=true,["ENDLOOP"]=true,["END"]=true,["RET"]=true,
+ }
+
+ local function checknesting(str,tab)
+ local res
+ local chk = str:match("%s*(BB)%d+.*:")
+ chk = chk or str:match("%s*(%w+)")
+ res = chk and tab[chk] and chk
+
+ return res
+ end
+
+ local argregistry = {}
+ local argbuffersfixed = false
+
+ local registercc
+ local registermem
+
+ local function fixargbuffers()
+ if (argbuffersfixed) then return end
+
+ local argnew = {}
+ for i,v in pairs(argregistry) do
+ local buf,bufstart = string.match(i,"buf(%d+)%[(%d+)%]")
+ if (buf and bufstart) then
+ bufstart = tonumber(bufstart)/16
+ argnew["buf"..buf.."["..tostring(bufstart).."]"] = v
+ else
+ argnew[i] = v
+ end
+ end
+ argregistry = argnew
+ argbuffersfixed = true
+ end
+
+ local function checkregistry(w)
+ local regsuccess = true
+
+ local vtype,vname,sem,resource,pnum,pref = string.match(w,"#var ([_%w]+) ([%[%]%._%w]+) : ([^%:]*) : ([^%:]*) : ([^%:]*) : (%d*)")
+ local funcname,subroutine = string.match(w,"#function %d+ ([_%w]+)%((%d+)%)")
+ if (pref == "1") then
+ local descriptor = vtype.." "..vname
+
+ -- check if resource is array
+ local resstart,rescnt = string.match(resource,"c%[(%d+)%], (%d+)")
+ resstart = tonumber(resstart)
+ rescnt = tonumber(rescnt)
+
+ -- check if resource is buffer/buffer array
+ local buf,bufstart,bufcnt = string.match(resource,"buffer%[(%d+)%]%[(%d+)%],? ?(%d*)")
+ buf = tonumber(buf)
+ bufstart = tonumber(bufstart)
+ bufcnt = tonumber(bufcnt)
+
+ -- check if texture
+ local texnum = string.match(resource,"texunit (%d+)")
+
+ local argnames = {}
+ if (rescnt) then
+ for i=0,(rescnt-1) do
+ table.insert(argnames,"c["..tostring(resstart + i).."]")
+ end
+ elseif (texnum) then
+ table.insert(argnames,"texture["..tostring(texnum).."]")
+ table.insert(argnames,"texture"..tostring(texnum))
+ elseif (buf) then
+ table.insert(argnames,"buf"..tostring(buf).."["..tostring(bufstart).."]")
+ else
+ table.insert(argnames,resource)
+ end
+
+ for i,v in ipairs(argnames) do
+ argregistry[v] = descriptor
+ end
+ elseif (funcname and subroutine) then
+ argregistry["SUBROUTINENUM("..subroutine..")"] = "function "..funcname
+ elseif string.find(w,"BUFFER4") then
+ fixargbuffers()
+ elseif string.find(w,"TEMP") then
+ --TEMP R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11;
+ --TEMP RC, HC;
+ --TEMP lmem[9];
+ registercc = registercc or 0
+ for i in string.gmatch(w,"C") do
+ registercc = registercc + 1
+ end
+ registermem = tonumber(string.match(w,"lmem%[(%d+)%]"))
+ else
+ regsuccess = false
+ end
+
+ return regsuccess
+ end
+
+ local function checkargs(str)
+ local comment = "#"
+ local declared = {}
+ for i in string.gmatch(str,"([%[%]%(%)%w]+)") do
+ local descr = argregistry[i]
+ if (descr and not declared[i]) then
+ comment = comment.." "..i.." = "..descr
+ declared[i] = true
+ end
+ end
+
+ return comment ~= "#" and comment
+ end
+
+ local registerlevels = {{}}
+ local function checkregisters(str,indent)
+ if (indent < 0) then return end
+ local cur = registerlevels[indent+1]
+ for i in string.gmatch(str,"R(%d+)") do
+ cur[i] = true
+ end
+ end
+
+ local function clearregisters(indent)
+ registerlevels[math.max(0,indent)+1] = {}
+ end
+
+ local function outputregisters(indent)
+ if (indent < 0) then return "" end
+ local tab = registerlevels[indent+1]
+ local out = {}
+ for i,v in pairs(tab) do
+ table.insert(out,i)
+ end
+ table.sort(out)
+ local cnt = #out
+ if (cnt < 1) then return "" end
+
+ local str = string.rep(" ",indent).."# "..tostring(cnt).." R used: "
+ for i,v in ipairs(out) do
+ str = str..tostring(v)..((i==cnt) and "" or ", ")
+ end
+ return str.."\n"
+ end
+
+ -- check declarations
+ local lastline = ""
+ for w in string.gmatch(tx, "[^\n]*\n") do
+ if (not checkregistry(w)) then
+
+ if (checknesting(w,endindent)) then
+ newtx = newtx..outputregisters(indent)
+ if (indent == 0) then clearregisters(indent) end
+ indent = math.max(0,indent - 1)
+ end
+
+ local firstchar = string.sub(w,1,1)
+ local indentstr = (firstchar ~= " " and firstchar ~= "\t" and string.rep(" ",indent) or "")
+ local linestr = indentstr..w
+ local argcomment = (firstchar ~= "#") and checkargs(w)
+
+ checkregisters(w,indent)
+
+ newtx = newtx..(argcomment and (indentstr..argcomment.."\n") or "")
+ newtx = newtx..linestr
+
+ if (checknesting(w,startindent)) then
+ indent = indent + 1
+ maxindent = math.max(maxindent,indent)
+ clearregisters(indent)
+ end
+ else
+ newtx = newtx..w
+ end
+ lastline = w
+ end
+
+ local registers = tonumber(string.match(lastline, "(%d+) R%-regs")) or 0
+ registermem = registermem or 0
+ registercc = registercc or 0
+ local stats = "# "..tostring(registercc).." C-regs, "..tostring(registermem).." L-regs\n"
+ stats = stats.."# "..tostring(registercc + registermem + registers).." maximum registers\n"
+ stats = stats.."# "..maxindent.." maximum nesting level\n"
+ newtx = newtx..stats
+
+ return newtx,lastline..stats
+ end
+
+ local function beautifyAsmFile(filePath)
+ local file_text = ""
+ local statlines = ""
+ local handle = io.open(filePath, "rb")
+ if handle then
+ file_text = handle:read("*a")
+ file_text,statlines = beautifyAsm(file_text)
+ handle:close()
+ end
+
+ if (file_text == "") then return end
+
+ local handle = io.open(filePath, "wb")
+ if handle then
+ handle:write(file_text)
+ handle:close()
+ end
+ return statlines
+ end
+
+ -- Compile Arg
+ frame:Connect(ID "cg.compile.input",wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ data.customarg = event:IsChecked()
+ end)
+
+ frame:Connect(ID "cg.compile.gles",wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ data.gles = event:IsChecked()
+ end)
+ -- Compile
+ local function evCompile(event)
+ local filename,info = GetEditorFileAndCurInfo()
+ local editor = GetEditor()
+ local glsl = editor and editor.spec and editor.spec.apitype and editor.spec.apitype == "glsl"
+ local entryname = (glsl and "main" or info.selword)
+
+ if (not (filename and entryname and binpath)) then
+ DisplayOutput("Error: Cg Compile: Insufficient parameters (nofile / not selected entry function!\n")
+ return
+ end
+
+ local domain = data.domains[event:GetId()]
+ local profile = data.profiles[data.profid]
+ if (not profile[domain]) then return end
+
+ -- popup for custom input
+ data.custom = data.customarg and wx.wxGetTextFromUser("Compiler Args","Cg",data.custom) or data.custom
+ local args = data.customarg and data.custom or ""
+ args = args:len() > 0 and args or nil
+
+ local fullname = filename:GetFullPath()
+ local outname = fullname.."."..entryname.."^"
+ outname = args and outname..args:gsub("%s*[%-%/]",";-")..";^" or outname
+ outname = outname..profile[domain]..profile.ext
+ outname = '"'..outname..'"'
+
+ local cmdglsl = data.gles and "-ogles -glslWerror -DGL_ES" or "-oglsl -glslWerror -po PaBO2 "
+ local cmdline = ' "'..fullname..'" -profile '..profile[domain].." "
+ cmdline = glsl and cmdline..cmdglsl or cmdline
+ cmdline = glsl and (data.profid == (ID "cg.profile.gp5")) and cmdline.."-po NV_shader_atomic_float -po NV_bindless_texture " or cmdline
+ cmdline = args and cmdline..args.." " or cmdline
+ cmdline = cmdline..data.domaindefs[domain]
+ cmdline = cmdline.."-o "..outname.." "
+ cmdline = cmdline.."-entry "..entryname
+
+ cmdline = binpath.."/cgc.exe"..cmdline
+
+ local function nvperfcallback(str)
+ local pixels = string.match(str,"([,%d]+) pixels/s")
+ pixels = pixels and string.gsub(pixels,",","")
+ pixels = tonumber(pixels)
+ local function tostr(num)
+ return string.format("%.2f",num)
+ end
+
+ -- delete .cgbin file
+ local binname,ext = fullname:match("(.*)%.([a-zA-Z_0-9]+)$")
+ binname = binname..".cgbin"
+ wx.wxRemoveFile(binname)
+
+ if (pixels ~= nil) then
+ local str = string.match(str,("(.* pixels/s)"))
+ local info = "1920x1080: "..tostr(pixels/(1920*1080)).." Hz\n"
+ info = info.."1280x1024: "..tostr(pixels/(1280*1024)).." Hz\n"
+ str = (str.."\n"..info)
+ return str
+ else
+ return str.."\n"
+ end
+ end
+
+ local function compilecallback(str)
+ local postfunc
+ -- check for errors, if none, launch nvperf
+ -- and indentation
+ if (string.find(str," 0 errors.")) then
+ postfunc = function()
+ -- beautify asm
+ if (profile.asm) then
+ local statlines = beautifyAsmFile(outname:sub(2,-2))
+ DisplayOutput(statlines)
+ end
+
+ -- optionally run perf process
+ local cgperfgpu = ide.config.cgperfgpu or "G80"
+ local profiletypes = {
+ ["G70"] = {},
+ ["G80"] = {
+ ["vp40"] = " -profile vp40",
+ ["fp40"] = " -profile fp40"},
+ }
+ if (hasperf and (not glsl) and profile.nvperf and (domain == 1 or domain == 2)
+ and profiletypes[cgperfgpu])
+ then
+ local domaintypes = {"cg_vp","cg_fp",}
+ local cmdline = " -gpu "..cgperfgpu.." -type "..domaintypes[domain]
+ cmdline = cmdline.." -function "..info.selword
+ cmdline = cmdline..(profiletypes[cgperfgpu][profile[domain]] or "")
+ cmdline = cmdline..' "'..fullname..'"'
+
+ cmdline = binpath..perfexe..cmdline
+ CommandLineRun(cmdline,nil,true,nil,nvperfcallback)
+ end
+ end
+ end
+
+ return str,postfunc
+ end
+
+ -- run compiler process
+ CommandLineRun(cmdline,nil,true,nil,compilecallback)
+
+ end
+
+ frame:Connect(ID "cg.compile.vertex",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "cg.compile.fragment",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "cg.compile.geometry",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "cg.compile.tessctrl",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "cg.compile.tesseval",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "cg.compile.compute",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+
+ -- indent asm
+ frame:Connect(ID "cg.format.asm", wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ local curedit = GetEditor()
+ local newtx = beautifyAsm( curedit:GetText() )
+
+ curedit:SetText(newtx)
+ end)
+
+ -- master file
+ frame:Connect(ID "cg.format.master", wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(even)
+ local filename,info = GetEditorFileAndCurInfo()
+ buildFromMaster(filename)
+ end)
+ end,
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/tools/clcc.lua b/love2dToAPK/tools/tools/zbstudio-win/tools/clcc.lua
new file mode 100644
index 0000000..f4082f2
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/tools/clcc.lua
@@ -0,0 +1,67 @@
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local binpath = ide.config.path.clccbin or os.getenv("CLCC_BIN_PATH")
+
+return binpath and {
+ fninit = function(frame,menuBar)
+
+ if (wx.wxFileName(binpath):IsRelative()) then
+ local editorDir = string.gsub(ide.editorFilename:gsub("[^/\\]+$",""),"\\","/")
+ binpath = editorDir..binpath
+ end
+
+ local myMenu = wx.wxMenu{
+ { ID "cl.allplatforms", "&All", "Compiled with all available platforms (otherwise only first)", wx.wxITEM_CHECK },
+ { ID "cl.output", "&Output", "Generates output files", wx.wxITEM_CHECK },
+ { ID "cl.info", "&Info", "Prints Info", wx.wxITEM_CHECK },
+ { },
+ { ID "cl.compile", "&Compile", "Compile Kernels in File" },
+ }
+ menuBar:Append(myMenu, "&OpenCL")
+
+ local data = {
+ allplatforms = false,
+ output = false,
+ info = false,
+ }
+
+ -- Compile Arg
+ frame:Connect(ID "cl.allplatforms",wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ data.allplatforms = event:IsChecked()
+ end)
+ frame:Connect(ID "cl.output",wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ data.output = event:IsChecked()
+ end)
+ frame:Connect(ID "cl.info",wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ data.info = event:IsChecked()
+ end)
+ -- Compile
+ local function evCompile(event)
+ local filename,info = GetEditorFileAndCurInfo()
+ local editor = GetEditor()
+
+ if (not (filename)) then
+ DisplayOutput("Error: OpenCL Compile: Insufficient parameters (nofile)!\n")
+ return
+ end
+
+ local fullname = filename:GetFullPath()
+ local cmdline = " "
+ cmdline = cmdline..(data.allplatforms and "--platform -1 " or "")
+ cmdline = cmdline..(data.info and "--info " or "")
+ cmdline = cmdline..(data.output and "--output " or "")
+ cmdline = cmdline..'"'..fullname..'"'
+
+ cmdline = binpath.."/clcc.exe"..cmdline
+
+ -- run compiler process
+ CommandLineRun(cmdline,nil,true,nil,nil)
+ end
+
+ frame:Connect(ID "cl.compile",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ end,
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/tools/cstringify.lua b/love2dToAPK/tools/tools/zbstudio-win/tools/cstringify.lua
new file mode 100644
index 0000000..a650a77
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/tools/cstringify.lua
@@ -0,0 +1,21 @@
+local function cstringify()
+ local editor = GetEditor()
+ if (not editor) then end
+ local tx = editor:GetText()
+ local new = ""
+ for l in tx:gmatch("([^\r\n]*)([\r]?[\n]?)") do
+ l = l:gsub('\\','\\\\')
+ l = l:gsub('"','\\"')
+ new = new..'"'..l..'\\n"'.."\n"
+ end
+ -- replace text
+ editor:SetText(new)
+end
+
+return {
+ exec = {
+ name = "stringify to C",
+ description = "stringifys the content for use in C",
+ fn = cstringify,
+ },
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/tools/dx.lua b/love2dToAPK/tools/tools/zbstudio-win/tools/dx.lua
new file mode 100644
index 0000000..1753e0e
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/tools/dx.lua
@@ -0,0 +1,157 @@
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local binpath = ide.config.path.fxcbin or (os.getenv("DXSDK_DIR") and os.getenv("DXSDK_DIR").."/Utilities/bin/x86/")
+local dxprofile
+
+return binpath and {
+ fninit = function(frame,menuBar)
+ dxprofile = ide.config.dxprofile or "dx_5"
+
+ if (wx.wxFileName(binpath):IsRelative()) then
+ local editorDir = string.gsub(ide.editorFilename:gsub("[^/\\]+$",""),"\\","/")
+ binpath = editorDir..binpath
+ end
+
+ local myMenu = wx.wxMenu{
+ { ID "dx.profile.dx_2x", "DX SM&2_x", "DirectX sm2_x profile", wx.wxITEM_CHECK },
+ { ID "dx.profile.dx_3", "DX SM&3_0", "DirectX sm3_0 profile", wx.wxITEM_CHECK },
+ { ID "dx.profile.dx_4", "DX SM&4_0", "DirectX sm4_0 profile", wx.wxITEM_CHECK },
+ { ID "dx.profile.dx_5", "DX SM&5_0", "DirectX sm5_0 profile", wx.wxITEM_CHECK },
+ { },
+ { ID "dx.compile.input", "Custom &Args", "when set a popup for custom compiler args will be envoked", wx.wxITEM_CHECK },
+ { ID "dx.compile.binary", "&Binary", "when set compiles binary output", wx.wxITEM_CHECK },
+ { ID "dx.compile.legacy", "&Legacy", "when set compiles in legacy mode", wx.wxITEM_CHECK },
+ { ID "dx.compile.backwards", "Backwards Compatibility", "when set compiles in backwards compatibility mode", wx.wxITEM_CHECK },
+ { },
+ { ID "dx.compile.vertex", "Compile &Vertex", "Compile Vertex shader (select entry word)" },
+ { ID "dx.compile.fragment", "Compile &Fragment", "Compile pixel shader (select entry word)" },
+ { ID "dx.compile.geometry", "Compile &Geometry", "Compile Geometry shader (select entry word)" },
+ { ID "dx.compile.domain", "Compile &Domain", "Compile Domain shader (select entry word)" },
+ { ID "dx.compile.hull", "Compile &Hull", "Compile Hull shader (select entry word)" },
+ { ID "dx.compile.compute", "Compile &Compute", "Compile Compute shader (select entry word)" },
+ { ID "dx.compile.effects", "Compile &Effects", "Compile all effects in shader" },
+ }
+ menuBar:Append(myMenu, "&Dx")
+
+ local data = {}
+ data.customarg = false
+ data.custom = ""
+ data.legacy = false
+ data.backwards = false
+ data.binary = false
+ data.profid = ID ("dx.profile."..dxprofile)
+ data.domains = {
+ [ID "dx.compile.vertex"] = 1,
+ [ID "dx.compile.fragment"] = 2,
+ [ID "dx.compile.geometry"] = 3,
+ [ID "dx.compile.domain"] = 4,
+ [ID "dx.compile.hull"] = 5,
+ [ID "dx.compile.compute"] = 6,
+ [ID "dx.compile.effects"] = 7,
+ }
+ data.profiles = {
+ [ID "dx.profile.dx_2x"] = {"vs_2_0","ps_2_x",false,false,false,false,"fx_2_x",ext=".fxc."},
+ [ID "dx.profile.dx_3"] = {"vs_3_0","ps_3_0",false,false,false,false,"fx_3_0",ext=".fxc."},
+ [ID "dx.profile.dx_4"] = {"vs_4_0","ps_4_0","gs_4_0",false,false,false,"fx_4_0",ext=".fxc."},
+ [ID "dx.profile.dx_5"] = {"vs_5_0","ps_5_0","gs_5_0","ds_5_0","hs_5_0","cs_5_0","fx_5_0",ext=".fxc."},
+ }
+ data.domaindefs = {
+ " /D _VERTEX_=1 /D _DX_=1 ",
+ " /D _FRAGMENT_=1 /D _DX_=1 ",
+ " /D _GEOMETRY_=1 /D _DX_=1 ",
+ " /D _TESS_CONTROL_=1 /D _DX_=1 ",
+ " /D _TESS_EVAL_=1 /D _DX_=1 ",
+ " /D _COMPUTE_=1 /D _DX_=1 ",
+ " /D _EFFECTS_=1 /D _DX_=1 ",
+ }
+ -- Profile related
+ menuBar:Check(data.profid, true)
+
+ local function selectProfile (id)
+ for id,profile in pairs(data.profiles) do
+ menuBar:Check(id, false)
+ end
+ menuBar:Check(id, true)
+ data.profid = id
+ end
+
+ local function evSelectProfile (event)
+ local chose = event:GetId()
+ selectProfile(chose)
+ end
+
+ for id,profile in pairs(data.profiles) do
+ frame:Connect(id,wx.wxEVT_COMMAND_MENU_SELECTED,evSelectProfile)
+ end
+
+ -- Compile Arg
+ frame:Connect(ID "dx.compile.input",wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ data.customarg = event:IsChecked()
+ end)
+ frame:Connect(ID "dx.compile.legacy",wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ data.legacy = event:IsChecked()
+ end)
+ frame:Connect(ID "dx.compile.backwards",wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ data.backwards = event:IsChecked()
+ end)
+ frame:Connect(ID "dx.compile.binary",wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ data.binary = event:IsChecked()
+ end)
+ -- Compile
+ local function evCompile(event)
+ local filename,info = GetEditorFileAndCurInfo()
+ local editor = GetEditor()
+ local domain = data.domains[event:GetId()]
+
+ if (not (filename and binpath) or not (domain == 7 or info.selword )) then
+ DisplayOutput("Error: Dx Compile: Insufficient parameters (nofile / no selected entry function!\n")
+ return
+ end
+
+
+ local profile = data.profiles[data.profid]
+ if (not profile[domain]) then return end
+
+ -- popup for custom input
+ data.custom = data.customarg and wx.wxGetTextFromUser("Compiler Args","Dx",data.custom) or data.custom
+ local args = data.custom:len() > 0 and data.custom or nil
+
+ local fullname = filename:GetFullPath()
+
+ local outname = fullname.."."..(info.selword or "").."^"
+ outname = args and outname..args:gsub("%s*[%-%/]",";-")..";^" or outname
+ outname = outname..profile[domain]..profile.ext..(data.binary and "fxo" or "txt")
+ outname = '"'..outname..'"'
+
+ local cmdline = " /T "..profile[domain].." "
+ cmdline = cmdline..(args and args.." " or "")
+ cmdline = cmdline..(data.legacy and "/LD " or "")
+ cmdline = cmdline..(data.backwards and "/Gec " or "")
+ cmdline = cmdline..(data.domaindefs[domain])
+ cmdline = cmdline..(data.binary and "/Fo " or "/Fc ")..outname.." "
+ if (info.selword) then
+ cmdline = cmdline.."/E "..info.selword.." "
+ end
+ cmdline = cmdline.."/nologo "
+ cmdline = cmdline..' "'..fullname..'"'
+
+ cmdline = binpath.."/fxc.exe"..cmdline
+
+ -- run compiler process
+ CommandLineRun(cmdline,nil,true,nil,nil)
+ end
+
+ frame:Connect(ID "dx.compile.vertex",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "dx.compile.fragment",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "dx.compile.geometry",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "dx.compile.domain",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "dx.compile.hull",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "dx.compile.compute",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "dx.compile.effects",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ end,
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/tools/ffitoapi.lua b/love2dToAPK/tools/tools/zbstudio-win/tools/ffitoapi.lua
new file mode 100644
index 0000000..326a7d9
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/tools/ffitoapi.lua
@@ -0,0 +1,313 @@
+-- author: Christoph Kubisch
+---------------------------------------------------------
+local StripCommentsC = StripCommentsC
+if not StripCommentsC then
+ StripCommentsC = function(tx)
+ local out = ""
+ local lastc = ""
+ local skip
+ local skipline
+ local skipmulti
+ local tx = string.gsub(tx, "\r\n", "\n")
+ for c in tx:gmatch(".") do
+ local oc = c
+ local tu = lastc..c
+ skip = c == '/'
+
+ if ( not (skipmulti or skipline)) then
+ if (tu == "//") then
+ skipline = true
+ elseif (tu == "/*") then
+ skipmulti = true
+ c = ""
+ elseif (lastc == '/') then
+ oc = tu
+ end
+ elseif (skipmulti and tu == "*/") then
+ skipmulti = false
+ c = ""
+ elseif (skipline and lastc == "\n") then
+ out = out.."\n"
+ skipline = false
+ end
+
+ lastc = c
+ if (not (skip or skipline or skipmulti)) then
+ out = out..oc
+ end
+ end
+
+ return out..lastc
+ end
+
+end
+
+local function ffiToApi(ffidef)
+ local str = ffidef
+ str = ffidef:match("(%-%-%[%[.+%]%])")
+ local header = ffidef:match("[^\r\n]+")
+ ffidef = StripCommentsC(ffidef)
+
+ local description = header:match("|%s*(.*)")
+ local descrprefixes = header:match("(.-)%s*|")
+ if not descrprefixes then return end
+
+ local prefixes = {}
+ for prefix in descrprefixes:gmatch("([_%w]+)") do
+ table.insert(prefixes,prefix)
+ end
+ local ns = prefixes[1]
+ if not ns then return end
+
+ local lktypes = {
+ ["string"] = "string",
+ }
+
+ local function gencontent(tx)
+ local enums = {}
+ local funcs = {}
+ local values = {}
+ local classes = {}
+
+ -- extract function names
+ local curfunc
+ local function registerfunc()
+ local fn = curfunc
+ -- parse args
+ local args = fn.ARGS:match("%(%s*(.-)%s*%)%s*;") or ""
+ fn.ARGS = "("..args..")"
+
+ -- skip return void types
+ local what = fn.RET == "void" and "" or fn.RET
+ what = what:match("%s*(.-)%s*$")
+ fn.RET = "("..what..")"
+ fn.DESCR = ""
+ if (what ~= "") then
+ fn.TYPE = what
+ end
+
+ table.insert(funcs,curfunc)
+ curfunc = nil
+ end
+
+ local outer = tx:gsub("(%b{})","{}")
+
+ -- FIXME pattern doesnt recognize multiline defs
+ for l in outer:gmatch("[^\r\n]+") do
+ -- extern void func(blubb);
+ -- extern void ( * func )(blubb);
+ -- void func(blubb);
+ -- void ( * func )(blubb);
+ -- void * ( * func )(blubb);
+ local typedef = l:match("typedef")
+ local ret,name,args = string.match(typedef and "" or l,
+ "%s*([_%w%*%s]+)%s+%(?[%s%*]*([_%w]+)%s*%)?%s*(%([^%(]*;)")
+
+ if (not (curfunc or typedef) and (ret and name and args)) then
+ ret = ret:gsub("^%s*extern%s*","")
+ curfunc = {RET=ret,NAME=name,ARGS=args}
+ registerfunc()
+ elseif (not typedef) then
+ local typ,names,val = l:match("%s*([_%w%s%*]+)%s+([_%w%[%]]+)[\r\n%s]*=[\r\n%s]*([_%w]+)[\r\n%s]*;")
+ if (not (typ and names and val)) then
+ typ,names = l:match("%s*([_%w%s%*]+)%s+([_%w%[%]%:%s,]+)[\r\n%s]*;")
+ end
+ if (typ and names) then
+ for name,rest in names:gmatch("([_%w]+)([^,]*)") do
+ rest = rest and rest:gsub("%s","") or ""
+ local what = typ..(rest:gsub("%b[]","*"))
+ table.insert(values,{NAME=name, DESCR=(typ..rest..(val and (" = "..val) or "")), TYPE = what,})
+ end
+ end
+ elseif(typedef) then
+ -- typedef struct lxgTextureUpdate_s * lxgTextureUpdatePTR;
+ -- typedef float lxVector2[2];
+ local what,name = l:match("typedef%s+([_%w%s%*]-)%s+([_%w%[%]]+)%s*;")
+ if (what and name) then
+ what = what:gsub("const%s","")
+ what = what:gsub("static%s","")
+ what = what:gsub("%s+"," ")
+ what = what:gsub("%s+%*","*")
+ local name,rest = name:match("([_%w]+)(.*)")
+ rest = rest and rest:gsub("%s","") or ""
+ if (what and name) then
+ lktypes[name] = what..(rest:gsub("%b[]","*"))
+ end
+ end
+ end
+ end
+
+ -- search for enums
+ for def in tx:gmatch("enum[_%w%s\r\n]*(%b{})[_%w%s\r\n]*;") do
+ for enum in def:gmatch("([_%w]+).-[,}]") do
+ table.insert(enums,{NAME=enum})
+ end
+ end
+
+ -- search for classes
+ for class,def,final in tx:gmatch("struct%s+([_%w]*)[%s\r\n]*(%b{})([_%w%s\r\n]*);") do
+ final = final:match("[_%w]+")
+ if (final) then
+ lktypes["struct "..class] = ns.."."..final
+ lktypes[final] = ns.."."..final
+ lktypes[ns.."."..final] = ns.."."..final
+ else
+ lktypes["struct "..class] = ns.."."..class
+ lktypes[ns.."."..class] = ns.."."..class
+ end
+ table.insert(classes,{NAME= final or class,DESCR = "",content = gencontent(def:sub(2,-2))})
+ end
+
+ return (#classes > 0 or #funcs > 0 or #enums > 0 or #values > 0) and
+ {classes=classes,funcs=funcs, enums=enums, values=values}
+ end
+
+ local content = gencontent(ffidef)
+ local function fixtypes(tab)
+ for i,v in ipairs(tab) do
+ local vt = v.TYPE
+ if (vt) then
+ local nt = vt
+
+ repeat
+ nt = nt:match("%s*(.-)%s*$")
+ nt = nt:gsub("%s+"," ")
+ nt = nt:gsub("%s%*","*")
+ nt = nt == "const char*" and "string" or nt
+ nt = nt:gsub("%*","")
+ nt = nt:gsub("const%s","")
+ nt = nt:gsub("static%s","")
+ vt = nt
+ local typ,qual = nt:match("([_%w%.%s]+)(%**)")
+ nt = (lktypes[typ] or "")..(qual or "")
+ until nt==vt
+ v.TYPE = nt ~= "" and '"'..nt..'"' or "nil"
+ else
+ v.TYPE = "nil"
+ end
+ end
+ end
+ local function fixcontent(tab)
+ fixtypes(tab.values)
+ fixtypes(tab.funcs)
+ for i,v in ipairs(tab.classes) do
+ fixcontent(v.content)
+ end
+ end
+ fixcontent(content)
+
+ str = str..[[
+
+ --auto-generated api from ffi headers
+ local api =
+ ]]
+
+ -- serialize api string
+ local function serialize(str,id,tab,lvl)
+ lvl = string.rep(" ",lvl or 1)
+ for i,k in ipairs(tab) do
+ str = str..string.gsub(id,"%$([%w]+)%$",k):gsub("##",lvl)
+ end
+ return str
+ end
+
+ local function genapi(str,content,lvl)
+ lvl = lvl or 1
+ str = str..string.gsub([[
+ ##{
+ ]],"##",string.rep(" ",lvl))
+
+ local value =
+ [[##["$NAME$"] = { type ='value', description = "$DESCR$", valuetype = $TYPE$, },
+ ]]
+ local enum =
+ [[##["$NAME$"] = { type ='value', },
+ ]]
+ local funcdef =
+ [[##["$NAME$"] = { type ='function',
+ ## description = "$DESCR$",
+ ## returns = "$RET$",
+ ## valuetype = $TYPE$,
+ ## args = "$ARGS$", },
+ ]]
+ str = serialize(str,value,content.values or {},lvl)
+ str = serialize(str,enum,content.enums or {},lvl)
+ str = serialize(str,funcdef,content.funcs or {},lvl)
+
+ local classdef =
+ [[##["$NAME$"] = { type ='class',
+ ## description = "$DESCR$",
+ ## $CHILDS$
+ ##},
+ ]]
+ for i,v in pairs(content.classes or {}) do
+ v.CHILDS = v.content and genapi("childs = ",v.content,lvl+1) or ""
+ end
+
+ str = serialize(str,classdef,content.classes or {},lvl)
+
+ str = str..string.gsub([[
+ ##}]],"##",string.rep(" ",lvl))
+
+ return str
+ end
+
+ str = genapi(str,content)
+
+ str = str..[[
+
+ return {
+ ]]
+
+ local lib =
+ [[
+ $NAME$ = {
+ type = 'lib',
+ description = "$DESCR$",
+ childs = $API$,
+ },
+ ]]
+
+ local libs = {}
+ for i,prefix in ipairs(prefixes) do
+ local p = {NAME=prefix, DESCR = description, API="api"}
+ table.insert(libs,p)
+ end
+
+ str = serialize(str,lib,libs)
+ str = str..[[
+ }
+ ]]
+
+ return str
+end
+
+local function exec(wxfname,projectdir)
+ -- get cur editor text
+ local editor = GetEditor()
+ if (not editor) then return end
+ local tx = editor:GetText()
+ tx = ffiToApi(tx)
+ -- replace text
+ if tx then editor:SetText(tx) end
+end
+
+if (not ide) then
+ ffitoapi = function(fname)
+ local f = io.open(fname,"rb")
+ local tx = f:read("*a")
+ f:close()
+ tx = ffiToApi(tx)
+ local f = io.open(fname,"wb")
+ f:write(tx)
+ f:close()
+ end
+end
+
+return {
+ exec = {
+ name = "luajit ffi string to editor api",
+ description = "converts current file to api, for autocompletion inside this editor",
+ fn = exec,
+ },
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/tools/glslc.lua b/love2dToAPK/tools/tools/zbstudio-win/tools/glslc.lua
new file mode 100644
index 0000000..45ae1ad
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/tools/glslc.lua
@@ -0,0 +1,470 @@
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+local binpath = ide.config.path.glslcbin or os.getenv("GLSLC_BIN_PATH")
+
+return binpath and {
+ fninit = function(frame,menuBar)
+
+ if (wx.wxFileName(binpath):IsRelative()) then
+ local editorDir = string.gsub(ide.editorFilename:gsub("[^/\\]+$",""),"\\","/")
+ binpath = editorDir..binpath
+ end
+
+ local myMenu = wx.wxMenu{
+ { ID "glslc.compile.input", "&Custom Args", "when set a popup for custom compiler args will be envoked", wx.wxITEM_CHECK },
+ { ID "glslc.compile.separable", "Separable", "when set separable programs are used", wx.wxITEM_CHECK },
+ { ID "glslc.compile.preproc", "Preprocess File", "Pre-process the files only, resolving #inlcudes", wx.wxITEM_CHECK },
+ { },
+ { ID "glslc.compile.ext", "Compile from .ext\tCtrl-1", "Compile based on file extension" },
+ { ID "glslc.compile.all", "Link multiple .ext\tCtrl-2", "Tries to link multiple shaders based on filename" },
+ { ID "glslc.compile.vertex", "Compile &Vertex", "Compile Vertex program" },
+ { ID "glslc.compile.fragment", "Compile &Fragment", "Compile Fragment program" },
+ { ID "glslc.compile.geometry", "Compile &Geometry", "Compile Geometry program" },
+ { ID "glslc.compile.tessctrl", "Compile T.Ctrl", "Compile T.Ctrl program" },
+ { ID "glslc.compile.tesseval", "Compile T.Eval", "Compile T.Eval program" },
+ { ID "glslc.compile.compute", "Compile Compute", "Compile Compute program" },
+ { },
+ { ID "glslc.format.asm", "Annotate ASM", "indent and add comments to ASM output" },
+ }
+ menuBar:Append(myMenu, "&GLSL")
+
+ local data = {}
+ data.customarg = false
+ data.separable = false
+ data.preproc = false
+ data.custom = ""
+ data.domains = {
+ [ID "glslc.compile.vertex"] = 1,
+ [ID "glslc.compile.fragment"] = 2,
+ [ID "glslc.compile.geometry"] = 3,
+ [ID "glslc.compile.tessctrl"] = 4,
+ [ID "glslc.compile.tesseval"] = 5,
+ [ID "glslc.compile.compute"] = 6,
+ }
+ data.domainprofiles = {
+ "vertex",
+ "fragment",
+ "geometry",
+ "tesscontrol",
+ "tessevaluation",
+ "compute",
+ }
+ data.domaindefs = {
+ " -D_VERTEX_ ",
+ " -D_FRAGMENT_ ",
+ " -D_GEOMETRY_ ",
+ " -D_TESS_CONTROL_ ",
+ " -D_TESS_EVAL_ ",
+ " -D_COMPUTE_ ",
+ }
+
+ local function beautifyAsmEach(tx)
+ local newtx = ""
+ local indent = 0
+ local maxindent = 0
+ local isbranch = {
+ ["IF"]=true,["REP"]=true,["ELSE"]=true,["LOOP"]=true,
+ }
+ local startindent = {
+ ["IF"]=true,["REP"]=true,["ELSE"]=true,["LOOP"]=true,["BB"]=true,
+ }
+ local endindent = {
+ ["ENDIF"]=true,["ENDREP"]=true,["ELSE"]=true,["ENDLOOP"]=true,["END"]=true,["RET"]=true,
+ }
+
+ local function check(str,tab)
+ local res
+ local chk = str:match("%s*(BB)%d+.*:")
+ chk = chk or str:match("%s*(%w+)")
+ res = chk and tab[chk] and chk
+
+ return res
+ end
+
+ local argregistry = {}
+ local argbuffersfixed = false
+
+ local registercc = 0
+ local registermem = 0
+ local registers = 0
+ local instructions = 0
+ local branches = 0
+
+ local function fixargbuffers()
+ if (argbuffersfixed) then return end
+
+ local argnew = {}
+ for i,v in pairs(argregistry) do
+ local buf,bufstart = string.match(i,"buf(%d+)%[(%d+)%]")
+ if (buf and bufstart) then
+ bufstart = tonumber(bufstart)/16
+ argnew["buf"..buf.."["..tostring(bufstart).."]"] = v
+ else
+ argnew[i] = v
+ end
+ end
+ argregistry = argnew
+ argbuffersfixed = true
+ end
+
+ local function checkregistry(w)
+ local regsuccess = true
+
+ local vtype,vname,sem,resource,pnum,pref = string.match(w,"#var ([_%w]+) ([%[%]%._%w]+) : ([^%:]*) : ([^%:]*) : ([^%:]*) : (%d*)")
+ local funcname,subroutine = string.match(w,"#function %d+ ([_%w]+)%((%d+)%)")
+ if (pref == "1") then
+ local descriptor = vtype.." "..vname
+
+ -- check if resource is array
+ local resstart,rescnt = string.match(resource,"c%[(%d+)%], (%d+)")
+ resstart = tonumber(resstart)
+ rescnt = tonumber(rescnt)
+
+ -- check if resource is buffer/buffer array
+ local buf,bufstart,bufcnt = string.match(resource,"buffer%[(%d+)%]%[(%d+)%],? ?(%d*)")
+ buf = tonumber(buf)
+ bufstart = tonumber(bufstart)
+ bufcnt = tonumber(bufcnt)
+
+ -- check if texture
+ local texnum = string.match(resource,"texunit (%d+)")
+
+ local argnames = {}
+ if (rescnt) then
+ for i=0,(rescnt-1) do
+ table.insert(argnames,"c["..tostring(resstart + i).."]")
+ end
+ elseif (texnum) then
+ table.insert(argnames,"texture["..tostring(texnum).."]")
+ table.insert(argnames,"texture"..tostring(texnum))
+ elseif (buf) then
+ table.insert(argnames,"buf"..tostring(buf).."["..tostring(bufstart).."]")
+ else
+ table.insert(argnames,resource)
+ end
+
+ for i,v in ipairs(argnames) do
+ argregistry[v] = descriptor
+ end
+ elseif (funcname and subroutine) then
+ argregistry["SUBROUTINENUM("..subroutine..")"] = "function "..funcname
+ elseif string.find(w,"BUFFER4 ") then
+ fixargbuffers()
+ elseif string.find(w,"TEMP ") then
+ --TEMP R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11;
+ --TEMP RC, HC;
+ --TEMP lmem[9];
+ for i in string.gmatch(w,"C") do
+ registercc = registercc + 1
+ end
+ for i in string.gmatch(w,"R%d+") do
+ registers = registers + 1
+ end
+ registermem = tonumber(string.match(w,"lmem%[(%d+)%]"))
+ elseif (string.find(w,"CBUFFER ") or string.find(w,"ATTRIB ") or string.find(w,"OPTION ") or
+ string.find(w,"OUTPUT ") or string.find(w,"PARAM ") or string.find(w,"!!NV") or
+ string.find(w,"STORAGE ")) then
+
+ else
+ regsuccess = false
+ end
+
+ return regsuccess
+ end
+
+ local function checkargs(str)
+ local comment = "#"
+ local declared = {}
+ for i in string.gmatch(str,"([%[%]%(%)%w]+)") do
+ local descr = argregistry[i]
+ if (descr and not declared[i]) then
+ comment = comment.." "..i.." = "..descr
+ declared[i] = true
+ end
+ end
+
+ return comment ~= "#" and comment
+ end
+
+ local registerlevels = {{}}
+ local function checkregisters(str,indent)
+ if (indent < 0) then return end
+ local cur = registerlevels[indent+1]
+ for i in string.gmatch(str,"R(%d+)") do
+ cur[i] = true
+ end
+ end
+
+ local function clearregisters(indent)
+ registerlevels[math.max(0,indent)+1] = {}
+ end
+
+ local function outputregisters(indent)
+ if (indent < 0) then return "" end
+ local tab = registerlevels[indent+1]
+ local out = {}
+ for i,v in pairs(tab) do
+ table.insert(out,i)
+ end
+ table.sort(out)
+ local cnt = #out
+ if (cnt < 1) then return "" end
+
+ local str = string.rep(" ",indent).."# "..tostring(cnt).." R used: "
+ for i,v in ipairs(out) do
+ str = str..tostring(v)..((i==cnt) and "" or ", ")
+ end
+ return str.."\n"
+ end
+
+ -- check declarations
+ local lastline = ""
+ local addinstr = false
+ for w in string.gmatch(tx, "[^\n]*\n") do
+ if (not checkregistry(w)) then
+
+ if (not w:match("%s*#")) then
+ instructions = instructions + 1
+ end
+
+ if (check(w,isbranch)) then
+ branches = branches + 1
+ end
+
+ if (check(w,endindent)) then
+ newtx = newtx..outputregisters(indent)
+ if (indent == 0) then clearregisters(indent) end
+ indent = math.max(0,indent - 1)
+ end
+
+ local firstchar = string.sub(w,1,1)
+ local indentstr = (firstchar ~= " " and firstchar ~= "\t" and string.rep(" ",indent) or "")
+ local linestr = indentstr..w
+ local argcomment = (firstchar ~= "#") and checkargs(w)
+
+ checkregisters(w,indent)
+
+ newtx = newtx..(argcomment and (indentstr..argcomment.."\n") or "")
+ newtx = newtx..linestr
+
+ if (check(w,startindent)) then
+ indent = indent + 1
+ maxindent = math.max(maxindent,indent)
+ clearregisters(indent)
+ end
+ else
+ newtx = newtx..w
+ end
+ lastline = w
+ end
+
+ local registers = tonumber(string.match(lastline, "(%d+) R%-regs")) or registers
+ registermem = registermem or 0
+ registercc = registercc or 0
+ local stats = "# "..instructions.." ~ instructions\n"
+ stats = stats.."# "..branches.." ~ branches\n"
+ stats = stats.."# "..registers.." R-regs\n"
+ stats = stats.."# "..tostring(registercc).." C-regs, "..tostring(registermem).." L-regs\n"
+ stats = stats.."# "..tostring(registercc + registermem + registers).." maximum registers\n"
+ stats = stats.."# "..maxindent.." maximum nesting level\n"
+ newtx = newtx..stats.."\n"
+
+ return newtx,stats
+ end
+ local function beautifyAsm(tx)
+ local newtx = ""
+ local stats
+ for t in tx:gmatch("!!.-END[^%w]%s*") do
+ local nt
+ nt,stats = beautifyAsmEach(t)
+ newtx = newtx..nt
+ end
+ return newtx,stats
+ end
+
+ local function beautifyAsmFile(filePath)
+ local file_text = ""
+ local statlines = ""
+ local handle = io.open(filePath, "rb")
+ if handle then
+ file_text = handle:read("*a")
+ file_text,statlines = beautifyAsm(file_text)
+ handle:close()
+ end
+
+ if (file_text == "") then return end
+
+ local handle = io.open(filePath, "wb")
+ if handle then
+ handle:write(file_text)
+ handle:close()
+ end
+ return statlines
+ end
+
+ -- Compile Arg
+ frame:Connect(ID "glslc.compile.input",wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ data.customarg = event:IsChecked()
+ end)
+
+ frame:Connect(ID "glslc.compile.separable",wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ data.separable = event:IsChecked()
+ end)
+
+ frame:Connect(ID "glslc.compile.preproc",wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ data.preproc = event:IsChecked()
+ end)
+
+ -- Compile
+ local function evCompile(event)
+ local filename,info = GetEditorFileAndCurInfo()
+ local editor = GetEditor()
+ local glsl = true
+
+ if (not (filename and binpath)) then
+ DisplayOutput("Error: GLSL Compile: Insufficient parameters (nofile)\n")
+ return
+ end
+
+ local function getDomain(filename)
+ local fname = filename:GetFullName()
+ if (fname:match("%.v")) then
+ domain = 1
+ elseif (fname:match("%.f")) then
+ domain = 2
+ elseif (fname:match("%.ge")) then
+ domain = 3
+ elseif (fname:match("%.t.*c")) then
+ domain = 4
+ elseif (fname:match("%.t.*e")) then
+ domain = 5
+ elseif (fname:match("%.c")) then
+ domain = 6
+ end
+ if (not domain) then
+ DisplayOutput("Error: GLSL Compile: could not derive domain\n")
+ end
+ return domain
+ end
+
+ local function getCompileArg(filename,domain)
+ local str = ""
+ if (data.preproc) then
+ str = '-P "'..filename:GetPath(wx.wxPATH_GET_VOLUME + wx.wxPATH_GET_SEPARATOR).."_"..filename:GetFullName()..'" '
+ end
+ return str.."-profile "..data.domainprofiles[domain]..' "'..filename:GetFullPath()..'" '
+ end
+
+
+ local outname
+ local outsuffix
+ local compileargs
+ local getinstructions
+
+ if (event:GetId() == ID "glslc.compile.all") then
+ -- look for multiple files to link
+ local basename = filename:GetFullName():match(".-%.")
+
+ outname = filename:GetPathWithSep()..basename
+
+ local cnt,files = wx.wxDir.GetAllFiles(filename:GetPathWithSep(), basename.."*" )
+ compileargs = ""
+ for i,v in ipairs(files) do
+ local filename = wx.wxFileName(v)
+ if (filename:GetExt() ~= "glp" and
+ filename:GetExt() ~= "bak")
+ then
+ local domain = getDomain(filename)
+ if (not domain) then
+ return
+ end
+ compileargs = compileargs..getCompileArg(filename,domain)
+ end
+ end
+
+ else
+ -- compile single file
+ getinstructions = true
+
+ local domain = data.domains[event:GetId()]
+ if (not domain) then
+ domain = getDomain(filename)
+ end
+ if (not domain) then
+ return
+ end
+
+ local profile = data.domainprofiles[domain]
+ local fullname = filename:GetFullPath()
+
+ outname = fullname.."."
+ outsuffix = profile
+ compileargs = data.domaindefs[domain].." "..getCompileArg(filename,domain)
+ end
+
+ -- popup for custom input
+ data.custom = data.customarg and wx.wxGetTextFromUser("Compiler Args","GLSLC",data.custom) or data.custom
+ local args = data.customarg and data.custom or ""
+ args = args:len() > 0 and args or nil
+
+ outname = outname..(args and "^"..args:gsub("%s*[%-%/]",";-")..";^" or "")
+ outname = outname..(outsuffix or "")
+ outname = outname..((outsuffix or args) and "." or "").."glp"
+ outname = '"'..outname..'"'
+
+ local cmdline = binpath.."/glslc.exe "
+ cmdline = cmdline..(args and args.." " or "")
+ cmdline = cmdline..(data.preproc and "-E " or "")
+ cmdline = cmdline..(data.separable and "-separable " or "")
+ cmdline = cmdline.."-o "..outname.." "
+ cmdline = cmdline..compileargs
+
+ local function compilecallback(str)
+ local postfunc
+ -- check for errors, if none, launch nvperf
+ -- and indentation
+ if (string.find(str,"successfully linked")) then
+ postfunc = function()
+ -- beautify asm
+ if (true) then
+ local statlines = beautifyAsmFile(outname:sub(2,-2))
+ if (getinstructions) then
+ DisplayOutput(statlines)
+ end
+ end
+ end
+ end
+
+ return str,postfunc
+ end
+
+ local wdir = filename:GetPath(wx.wxPATH_GET_VOLUME)
+
+ -- run compiler process
+ CommandLineRun(cmdline,wdir,true,nil,compilecallback)
+
+ end
+
+ frame:Connect(ID "glslc.compile.vertex",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "glslc.compile.fragment",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "glslc.compile.geometry",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "glslc.compile.tessctrl",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "glslc.compile.tesseval",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "glslc.compile.compute",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "glslc.compile.ext",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+ frame:Connect(ID "glslc.compile.all",wx.wxEVT_COMMAND_MENU_SELECTED,evCompile)
+
+ -- indent asm
+ frame:Connect(ID "glslc.format.asm", wx.wxEVT_COMMAND_MENU_SELECTED,
+ function(event)
+ local curedit = GetEditor()
+ local newtx = beautifyAsm( curedit:GetText() )
+
+ curedit:SetText(newtx)
+ end)
+ end,
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/tools/perforce_edit.lua b/love2dToAPK/tools/tools/zbstudio-win/tools/perforce_edit.lua
new file mode 100644
index 0000000..ab1b6f5
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/tools/perforce_edit.lua
@@ -0,0 +1,14 @@
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+return {
+ exec = {
+ name = "Perforce edit",
+ description = "does p4 edit",
+ fn = function(fname,projectdir)
+ local cmd = 'p4 edit "'..fname..'"'
+
+ CommandLineRun(cmd,nil,true)
+ end,
+ },
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/tools/perforce_revert.lua b/love2dToAPK/tools/tools/zbstudio-win/tools/perforce_revert.lua
new file mode 100644
index 0000000..d1e133a
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/tools/perforce_revert.lua
@@ -0,0 +1,14 @@
+-- authors: Luxinia Dev (Eike Decker & Christoph Kubisch)
+---------------------------------------------------------
+
+return {
+ exec = {
+ name = "Perforce revert",
+ description = "does p4 revert",
+ fn = function(fname,projectdir)
+ local cmd = 'p4 revert "'..fname..'"'
+
+ CommandLineRun(cmd,nil,true)
+ end,
+ },
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio.exe b/love2dToAPK/tools/tools/zbstudio-win/zbstudio.exe
new file mode 100644
index 0000000..8eab623
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio.exe
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/app.lua b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/app.lua
new file mode 100644
index 0000000..e597fad
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/app.lua
@@ -0,0 +1,53 @@
+local skipspecs = {
+ cg = true, glsl = true, luxres = true, opencl = true, sql = true,
+ cbase = true, hlsl = true, oglgpuprog = true, ptx = true, text = true,
+}
+return {
+ loadfilters = {
+ tools = function(file) return false end,
+ specs = function(file) return not skipspecs[file:match('spec[/\\]([^/\\]+)%.lua$') or ''] end,
+ interpreters = function(file) return not file:find('estrela') end,
+ },
+
+ postinit = function ()
+ local ide = ide
+ local bundle = wx.wxIconBundle()
+ local files = FileSysGetRecursive(ide:GetAppName().."/res", false, "*.ico")
+ local icons = 0
+ for i,file in ipairs(files) do
+ icons = icons + 1
+ bundle:AddIcon(file, wx.wxBITMAP_TYPE_ICO)
+ end
+ if icons > 0 then ide.frame:SetIcons(bundle) end
+
+ local menuBar = ide.frame.menuBar
+ menuBar:Check(ID_CLEAROUTPUT, true)
+
+ -- load myprograms/welcome.lua if exists and no projectdir
+ local projectdir = ide.config.path.projectdir
+ if (not projectdir or string.len(projectdir) == 0
+ or not wx.wxFileName(projectdir):DirExists()) then
+ local home = wx.wxGetHomeDir():gsub("[\\/]$","")
+ for _,dir in pairs({home, home.."/Desktop", ""}) do
+ local fn = wx.wxFileName("myprograms/welcome.lua")
+ -- normalize to absolute path
+ if fn:Normalize(wx.wxPATH_NORM_ALL, dir) and fn:FileExists() then
+ LoadFile(fn:GetFullPath(),nil,true)
+ ProjectUpdateProjectDir(fn:GetPath(wx.wxPATH_GET_VOLUME))
+ break
+ end
+ end
+ end
+ end,
+
+ stringtable = {
+ editor = "ZeroBrane Studio",
+ about = "About ZeroBrane Studio",
+ editormessage = "ZeroBrane Studio Message",
+ statuswelcome = "Welcome to ZeroBrane Studio",
+ settingsapp = "ZeroBraneStudio",
+ settingsvendor = "ZeroBraneLLC",
+ logo = "res/zerobrane.png",
+ help = "zerobranestudio",
+ },
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/config.lua b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/config.lua
new file mode 100644
index 0000000..f58b09d
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/config.lua
@@ -0,0 +1,38 @@
+local G = ... -- this now points to the global environment
+local ide, wx = G.ide, G.wx
+local mac = ide.osname == 'Macintosh'
+local win = ide.osname == "Windows"
+if mac then
+ local defaultsize = 11
+ filetree.fontsize = defaultsize
+ if ide.wxver >= "2.9.5" then
+ editor.fontsize = defaultsize+1
+ outputshell.fontsize = defaultsize
+ end
+
+ editor.fontname = "Monaco"
+ outputshell.fontname = editor.fontname
+else
+ local defaultsize = 10
+ editor.fontsize = defaultsize+1
+ outputshell.fontsize = defaultsize
+
+ local sysid, major, minor = wx.wxGetOsVersion()
+ editor.fontname =
+ win and (major == 5 and "Courier New" or "Consolas") or "Monospace"
+ outputshell.fontname = editor.fontname
+end
+
+hidpi = mac -- support Retina displays by default (OSX)
+singleinstance = not mac
+
+unhidewindow = { -- allow unhiding of GUI windows
+ -- 1 - show if hidden, 0 - ignore, 2 -- hide if shown
+ ConsoleWindowClass = 2,
+ -- ignore the following windows when "showing all"
+ IME = 0,
+ wxDisplayHiddenWindow = 0,
+ ['MSCTFIME UI'] = 0,
+ -- GLUT/opengl/SDL applications (for example, moai or love2d)
+ GLUT = 1, FREEGLUT = 1, SDL_app = 1,
+}
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/BOOKMARK-TOGGLE.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/BOOKMARK-TOGGLE.png
new file mode 100644
index 0000000..6f9860e
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/BOOKMARK-TOGGLE.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-BREAK.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-BREAK.png
new file mode 100644
index 0000000..53a98d5
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-BREAK.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-BREAKPOINT-TOGGLE.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-BREAKPOINT-TOGGLE.png
new file mode 100644
index 0000000..dca5604
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-BREAKPOINT-TOGGLE.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-CALLSTACK.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-CALLSTACK.png
new file mode 100644
index 0000000..2a063aa
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-CALLSTACK.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-DETACH.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-DETACH.png
new file mode 100644
index 0000000..a585b87
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-DETACH.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-RUN-TO.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-RUN-TO.png
new file mode 100644
index 0000000..3aa4244
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-RUN-TO.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-START.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-START.png
new file mode 100644
index 0000000..0da42b6
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-START.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-STEP-INTO.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-STEP-INTO.png
new file mode 100644
index 0000000..51a0e38
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-STEP-INTO.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-STEP-OUT.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-STEP-OUT.png
new file mode 100644
index 0000000..88aa038
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-STEP-OUT.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-STEP-OVER.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-STEP-OVER.png
new file mode 100644
index 0000000..91547aa
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-STEP-OVER.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-STOP.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-STOP.png
new file mode 100644
index 0000000..af5225c
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-STOP.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-WATCH.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-WATCH.png
new file mode 100644
index 0000000..f1cfcb4
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DEBUG-WATCH.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DIR-SETUP-FILE.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DIR-SETUP-FILE.png
new file mode 100644
index 0000000..77b8645
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DIR-SETUP-FILE.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DIR-SETUP.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DIR-SETUP.png
new file mode 100644
index 0000000..ff33594
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/DIR-SETUP.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-KNOWN.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-KNOWN.png
new file mode 100644
index 0000000..6bcaf21
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-KNOWN.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-NEW.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-NEW.png
new file mode 100644
index 0000000..256cdaa
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-NEW.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-NORMAL-START.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-NORMAL-START.png
new file mode 100644
index 0000000..16d65bf
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-NORMAL-START.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-NORMAL.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-NORMAL.png
new file mode 100644
index 0000000..c7c4d19
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-NORMAL.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-OPEN.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-OPEN.png
new file mode 100644
index 0000000..0a487c2
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-OPEN.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-SAVE-ALL.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-SAVE-ALL.png
new file mode 100644
index 0000000..790474b
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-SAVE-ALL.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-SAVE.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-SAVE.png
new file mode 100644
index 0000000..c0cfaae
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FILE-SAVE.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-AND-REPLACE.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-AND-REPLACE.png
new file mode 100644
index 0000000..881c274
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-AND-REPLACE.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-IN-FILES.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-IN-FILES.png
new file mode 100644
index 0000000..fe653f7
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-IN-FILES.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-CASE-SENSITIVE.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-CASE-SENSITIVE.png
new file mode 100644
index 0000000..9db97e7
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-CASE-SENSITIVE.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-CONTEXT.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-CONTEXT.png
new file mode 100644
index 0000000..addb686
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-CONTEXT.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-DOWN.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-DOWN.png
new file mode 100644
index 0000000..da250b3
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-DOWN.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-MULTI-RESULTS.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-MULTI-RESULTS.png
new file mode 100644
index 0000000..02a1175
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-MULTI-RESULTS.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-REGEX.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-REGEX.png
new file mode 100644
index 0000000..8620d1e
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-REGEX.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-SELECTION.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-SELECTION.png
new file mode 100644
index 0000000..962addb
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-SELECTION.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-SETDIR.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-SETDIR.png
new file mode 100644
index 0000000..69c52ec
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-SETDIR.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-SUBDIR.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-SUBDIR.png
new file mode 100644
index 0000000..382b6e7
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-SUBDIR.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-WORD.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-WORD.png
new file mode 100644
index 0000000..7519021
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-WORD.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-WRAP-AROUND.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-WRAP-AROUND.png
new file mode 100644
index 0000000..04928a2
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-OPT-WRAP-AROUND.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-REPLACE-NEXT.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-REPLACE-NEXT.png
new file mode 100644
index 0000000..e5feec3
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND-REPLACE-NEXT.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND.png
new file mode 100644
index 0000000..f3b1975
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FIND.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FOLDER-MAPPED.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FOLDER-MAPPED.png
new file mode 100644
index 0000000..3aedaf7
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FOLDER-MAPPED.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FOLDER.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FOLDER.png
new file mode 100644
index 0000000..4f0fa17
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/FOLDER.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/LICENSE b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/LICENSE
new file mode 100644
index 0000000..24e1714
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/LICENSE
@@ -0,0 +1,28 @@
+Icons are based on the icon set used in LuaEdit. Some of the icons
+have been modified to avoid using the last line that is not displayed
+correctly in wxLua.
+
+These icons are licenced under MIT license by permission from
+Jean-Francois Goulet (granted on 2012/01/02).
+
+LuaEdit
+
+Copyright © 2004-2009 Jean-Francois Goulet
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/RUN-NOW.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/RUN-NOW.png
new file mode 100644
index 0000000..c6483db
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/RUN-NOW.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/RUN.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/RUN.png
new file mode 100644
index 0000000..c39ab44
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/RUN.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-ACALL.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-ACALL.png
new file mode 100644
index 0000000..53ed38e
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-ACALL.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-CALL.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-CALL.png
new file mode 100644
index 0000000..7603329
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-CALL.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-GCALL.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-GCALL.png
new file mode 100644
index 0000000..3450300
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-GCALL.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-LCALL.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-LCALL.png
new file mode 100644
index 0000000..3d3c18e
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-LCALL.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-LOCAL.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-LOCAL.png
new file mode 100644
index 0000000..ff2971d
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-LOCAL.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-SCALL.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-SCALL.png
new file mode 100644
index 0000000..22632b9
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-SCALL.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-UP.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-UP.png
new file mode 100644
index 0000000..585a8df
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/16/VALUE-UP.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/BOOKMARK-TOGGLE.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/BOOKMARK-TOGGLE.png
new file mode 100644
index 0000000..906ac51
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/BOOKMARK-TOGGLE.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-BREAK.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-BREAK.png
new file mode 100644
index 0000000..650d1cf
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-BREAK.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-BREAKPOINT-TOGGLE.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-BREAKPOINT-TOGGLE.png
new file mode 100644
index 0000000..7ec0859
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-BREAKPOINT-TOGGLE.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-CALLSTACK.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-CALLSTACK.png
new file mode 100644
index 0000000..8915230
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-CALLSTACK.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-DETACH.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-DETACH.png
new file mode 100644
index 0000000..7fd947f
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-DETACH.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-RUN-TO.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-RUN-TO.png
new file mode 100644
index 0000000..262ccb4
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-RUN-TO.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-START.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-START.png
new file mode 100644
index 0000000..e89596a
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-START.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-STEP-INTO.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-STEP-INTO.png
new file mode 100644
index 0000000..1dbd011
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-STEP-INTO.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-STEP-OUT.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-STEP-OUT.png
new file mode 100644
index 0000000..5d17d66
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-STEP-OUT.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-STEP-OVER.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-STEP-OVER.png
new file mode 100644
index 0000000..8f977cd
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-STEP-OVER.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-STOP.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-STOP.png
new file mode 100644
index 0000000..7a2565c
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-STOP.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-WATCH.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-WATCH.png
new file mode 100644
index 0000000..e3e6cc5
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DEBUG-WATCH.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DIR-SETUP-FILE.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DIR-SETUP-FILE.png
new file mode 100644
index 0000000..ebc1231
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DIR-SETUP-FILE.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DIR-SETUP.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DIR-SETUP.png
new file mode 100644
index 0000000..8b6a93b
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/DIR-SETUP.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FILE-NEW.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FILE-NEW.png
new file mode 100644
index 0000000..c51d592
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FILE-NEW.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FILE-OPEN.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FILE-OPEN.png
new file mode 100644
index 0000000..a27e760
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FILE-OPEN.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FILE-SAVE-ALL.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FILE-SAVE-ALL.png
new file mode 100644
index 0000000..d9a2547
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FILE-SAVE-ALL.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FILE-SAVE.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FILE-SAVE.png
new file mode 100644
index 0000000..ca2b9cc
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FILE-SAVE.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FIND-AND-REPLACE.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FIND-AND-REPLACE.png
new file mode 100644
index 0000000..a4fe02f
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FIND-AND-REPLACE.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FIND-IN-FILES.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FIND-IN-FILES.png
new file mode 100644
index 0000000..c04be5e
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FIND-IN-FILES.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FIND.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FIND.png
new file mode 100644
index 0000000..d6bc068
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/FIND.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/LICENSE b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/LICENSE
new file mode 100644
index 0000000..12949b4
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/LICENSE
@@ -0,0 +1,27 @@
+Icons are based on the icon set used in LuaEdit.
+These icons have been manually converted and updated for 24 pixels.
+
+These icons are licenced under MIT license by permission from
+Jean-Francois Goulet (granted on 2012/01/02).
+
+LuaEdit
+
+Copyright 2004-2009 Jean-Francois Goulet
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/RUN-NOW.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/RUN-NOW.png
new file mode 100644
index 0000000..eecc3a0
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/RUN-NOW.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/RUN.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/RUN.png
new file mode 100644
index 0000000..5f8571b
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/24/RUN.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/estrela.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/estrela.png
new file mode 100644
index 0000000..6a954c3
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/estrela.png
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/zbstudio.ico b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/zbstudio.ico
new file mode 100644
index 0000000..323776d
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/zbstudio.ico
Binary files differ
diff --git a/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/zerobrane.png b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/zerobrane.png
new file mode 100644
index 0000000..2f270fb
--- /dev/null
+++ b/love2dToAPK/tools/tools/zbstudio-win/zbstudio/res/zerobrane.png
Binary files differ